[cut: only the first 33554432 bytes of this file were read]

INSERT INTO CONFIGURACION (CONF_MODULO, CONF_CATEGORIA, CONF_PROPIEDAD, CONF_VALOR, CONF_POSIBLES, CONF_AYUDA) VALUES ('INVENTARIO', 'DOCUMENTOS', 'PERMITIR CAMBIAR BODEGA POR ITEM', 'SI', 'SI,NO', 'SI: El usuario podrá especificar una bodega para los items diferente de la del documento. NO: La columna bodega por item estará inhabilitada');
INSERT INTO CONFIGURACION (CONF_MODULO, CONF_CATEGORIA, CONF_PROPIEDAD, CONF_VALOR, CONF_POSIBLES, CONF_AYUDA) VALUES ('FACTURACION', 'DOCUMENTOS', 'SUGERIR SOLAMENTE LAS LISTAS DE PRECIOS VIGENTES', 'SI', 'SI,NO', 'SI: Sólo pueden hacerse documentos con listas de precios vigentes en la fecha y hora del mismo. NO: El sistema no verifica la validez de las listas');
COMMIT WORK;

ALTER TABLE LISTA_PRECIOS
ADD LIPR_DIASEM SMALLINT;
ALTER TABLE LISTA_PRECIOS
ADD LIPR_HORAINI TIME;
ALTER TABLE LISTA_PRECIOS
ADD LIPR_HORAFIN TIME;

CREATE TABLE REPLICA_ARTICULO_ESTADO (
    RPAE_ID T_ID NOT NULL,
    RPAE_FECHA DATE,
    RPAE_HORA TIME,
    ARTI_COD T_COD_ARTICULO,
    RPAE_CIA VARCHAR(3));
alter table REPLICA_ARTICULO_ESTADO
add constraint PK_REPLICA_ARTICULO_ESTADO
primary key (RPAE_ID);

CREATE INDEX REPLICA_ARTICULO_ESTADO_IDX1
ON REPLICA_ARTICULO_ESTADO (RPAE_FECHA);

CREATE SEQUENCE ID_REPLARTICULO;

SET TERM ^ ;

create trigger REPLICA_ARTICULO_ESTADO_BI for REPLICA_ARTICULO_ESTADO
active BEFORE INSERT position 0
as
begin
NEW.rpae_id = gen_id(id_replarticulo, 1);
new.rpae_fecha = cast('now' as DATE);
new.rpae_hora = cast('now' as TIME);
end
^

SET TERM ; ^

ALTER TABLE REPLICA_ARTICULO_ESTADO
ADD RPAE_TIPO CHAR(1);
ALTER TABLE REPLICA_ARTICULO_ESTADO
ADD RPAE_SERVIDOR T_CONCEPTO;
ALTER TABLE REPLICA_ARTICULO_ESTADO
ADD RPAE_OK T_BOOLEANO;

SET TERM ^ ;

CREATE OR ALTER TRIGGER REPLICA_ARTICULO_ESTADO_BI FOR REPLICA_ARTICULO_ESTADO
ACTIVE BEFORE INSERT POSITION 0
as
begin
NEW.rpae_id = gen_id(id_replarticulo, 1);
new.rpae_fecha = cast('now' as DATE);
new.rpae_hora = cast('now' as TIME);
NEW.rpae_ok = 'N';
end
^

SET TERM ; ^

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

ALTER TABLE CLIENTES
ADD CLIE_DETALLE T_BOOLEANO;

ALTER TABLE FACTURAS
ADD FACT_DETCLI T_NIT;

ALTER TABLE FACTURAS
ADD FACT_DETCLINOM T_CONCEPTO;

INSERT INTO CONFIGURACION (CONF_MODULO, CONF_CATEGORIA, CONF_PROPIEDAD, CONF_VALOR, CONF_POSIBLES, CONF_AYUDA) VALUES ('FACTURACION', 'FACTURAS', 'BUSCAR FACTURAS POR DETALLE DEL CLIENTE EN LUGAR DE POR VENDEDOR', 'NO', 'SI,NO', 'SI: Reemplaza la búsqueda por vendedor por la búsqueda por detalle del cliente (pacientes) en las facturas');
commit work;

CREATE TABLE COMISIONES_PUNTOS (
    COPU_COD VARCHAR(2) NOT NULL,
    COPU_FACTOR T_PORCENTAJE);
alter table COMISIONES_PUNTOS
add constraint PK_COMISIONES_PUNTOS
primary key (COPU_COD);

ALTER TABLE RECIBOS_CAJA_DETALLE
ADD RCDE_COMIP VARCHAR(2);

CREATE GENERATOR ID_PUNTOSVEND;

SET TERM ^ ;

create trigger PUNTOS_VENDEDOR_BI for PUNTOS_VENDEDOR
active BEFORE INSERT position 0
as
begin
  /* Trigger text */
  NEW.ptvt_id = GEN_ID(id_puntosvend, 1);
end
^

SET TERM ; ^

UPDATE CONFIGURACION
SET CONF_PROPIEDAD = 'DIAS DE RECAUDO MAXIMO PARA ACUMULAR PUNTOS AL VENDEDOR',
    CONF_VALOR = '135',
    CONF_POSIBLES = '',
    CONF_AYUDA = 'Indique el máximo número de días de recaudo para acumular puntos al vendedor'
WHERE (CONF_MODULO = 'FACTURACION') AND (CONF_CATEGORIA = 'FACTURAS') AND (CONF_PROPIEDAD = 'FACTOR DE CONVERSION DE PUNTOS PARA VENDEDORES');

commit work;

SET TERM ^ ;

CREATE OR ALTER PROCEDURE CONSULTA_PUNTOS_VENDEDOR(
    VEND INTEGER,
    FECHA DATE)
RETURNS (
    PTACUM INTEGER)
AS
declare variable numrows integer;
declare variable id integer;
begin
ptacum = 0;
/* los puntos totales */
numrows = 0;
select max(ptvt_id) from puntos_vendedor where vend_cod = :vend and ptvt_fecha <= :fecha into :id;
if (id is not null) then
    select ptvt_saldo+ptvt_db - ptvt_cr from puntos_vendedor where ptvt_id = :id into :ptacum;
if (ptacum is null) then
    ptacum = 0;
suspend;
end
^

SET TERM ; ^

grant execute on procedure consulta_puntos_vendedor to public;


/* consulta ventas con fecini y fecfin */
SET TERM ^ ;

CREATE OR ALTER PROCEDURE VENTAS_ARTICULO_MES(
    FECINI DATE,
    FECFIN DATE,
    SUBEMPRESA INTEGER)
RETURNS (
    ARTICULO VARCHAR(15),
    DESCRIPCION VARCHAR(60),
    CODGRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    CODSUBG VARCHAR(3),
    NOMSUBG VARCHAR(30),
    CODMARC VARCHAR(3),
    NOMMARC VARCHAR(30),
    UNIDAD VARCHAR(8),
    CANTVTAS NUMERIC(18,4),
    BASEVTAS NUMERIC(18,2),
    IVAVTAS NUMERIC(18,2),
    CANTDEV NUMERIC(18,4),
    BASEDEV NUMERIC(18,2),
    IVADEV NUMERIC(18,2))
AS
BEGIN
FOR SELECT MAX(ARTI_COD), SUM(FADE_CANT * FADE_FACTOR), SUM((cast(FADE_TOTAL as double precision)-FADE_IVAMONTO-FADE_CONSUMO)*FACT_FACTOR),
    SUM(FADE_IVAMONTO*FACT_FACTOR)
    FROM FACTURAS_DETALLE D, FACTURAS F, PREFIJOS P
    WHERE F.FACT_ID = D.FACT_ID AND FACT_FECHA >= :FECINI AND FACT_FECHA < :FECFIN AND FACT_ANULADO = 'N'
       AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
    GROUP BY ARTI_COD
    INTO :ARTICULO, :CANTVTAS, :BASEVTAS, :IVAVTAS
    DO
    BEGIN
    SELECT ARTI_DES, ARTI_UNIDAD, A.GRUP_COD, A.SUBG_COD, A.MARC_COD, GRUP_NOM 
        FROM ARTICULO A, GRUPO G WHERE A.ARTI_COD = :articulo AND A.GRUP_COD = G.grup_cod
        INTO :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :NOMGRUPO;
    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
    SELECT SUM(DVDE_CANT * DVDE_FACTOR), SUM((cast(DVDE_TOTAL as double precision)-DVDE_IVAMONTO-DVDE_CONSUMO)*DEVT_FACTOR),
        SUM(DVDE_IVAMONTO*DEVT_FACTOR)
        FROM DEVOLUCIONES_VENTAS F, devoluciones_ventas_DETALLE D, PREFIJOS P
        WHERE F.DEVT_ID = D.DEVT_ID AND ARTI_COD = :ARTICULO AND DEVT_FECHA >= :FECINI AND DEVT_FECHA < :FECFIN AND DEVT_ANULADO = 'N'
        AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 33 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
        INTO :CANTDEV, :BASEDEV, :IVADEV;
    if (cantvtas IS NULL) then
        cantvtas = 0;
    if (cantdev IS NULL) then
        cantdev = 0;
    if (ivavtas IS NULL) then
        ivavtas = 0;
    if (IVADEV IS NULL) then
        IVADEV = 0;
    if (basevtas IS NULL) then
        basevtas = 0;
    if (basedev IS NULL) then
        basedev = 0;
    if ((CANTVTAS <> 0) or (CANTDEV <> 0)) then
        SUSPEND;
    END
END
^

SET TERM ; ^


SET TERM ^ ;

CREATE OR ALTER PROCEDURE VENTAS_CLIENTE_MES(
    FECINI DATE,
    FECFIN DATE,
    SUBEMPRESA INTEGER)
RETURNS (
    NIT VARCHAR(20),
    NOMBRE VARCHAR(60),
    FACTURAS INTEGER,
    MFACTURAS NUMERIC(18,2),
    DEVOLUCIONES INTEGER,
    MDEVOLUCIONES NUMERIC(18,2),
    IVAFACT NUMERIC(18,2),
    IVADEV NUMERIC(18,2),
    CONSUMOF NUMERIC(18,2),
    CONSUMOD NUMERIC(18,2))
AS
BEGIN
  for select TERC_NIT, TERC_NOM from TERCEROS WHERE TERC_CLIE = 'S' into :NIT, :NOMBRE
  DO
    BEGIN
    EXECUTE PROCEDURE VENTAS_CLIENTE (NIT, FECINI, FECFIN, SUBEMPRESA) returning_values (FACTURAS, MFACTURAS, DEVOLUCIONES, MDEVOLUCIONES, IVAFACT, IVADEV, CONSUMOF, CONSUMOD);
    SUSPEND;
    END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER PROCEDURE VENTAS_VENDEDOR_MES(
    FECINI DATE,
    FECFIN DATE,
    SUBEMPRESA INTEGER)
RETURNS (
    CODIGO INTEGER,
    NOMBRE VARCHAR(60),
    FACTURAS INTEGER,
    MFACTURAS NUMERIC(18,2),
    DEVOLUCIONES INTEGER,
    MDEVOLUCIONES NUMERIC(18,2),
    IVAFACT NUMERIC(18,2),
    IVADEV NUMERIC(18,2),
    CONSUMOF NUMERIC(18,2),
    CONSUMOD NUMERIC(18,2))
AS
BEGIN
  for select VEND_COD, VEND_NOMBRE from VENDEDORES into :CODIGO, :NOMBRE
  DO
    BEGIN
    EXECUTE PROCEDURE VENTAS_VENDEDOR (CODIGO, FECINI, FECFIN, SUBEMPRESA) returning_values (FACTURAS, MFACTURAS, DEVOLUCIONES, MDEVOLUCIONES, IVAFACT, IVADEV, CONSUMOF, CONSUMOD);
    SUSPEND;
    END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER PROCEDURE MOVIMIENTO_INVENTARIO_MES(
    ANO CHAR(4),
    MES INTEGER)
RETURNS (
    CODIGO VARCHAR(15),
    DESCRIPCION VARCHAR(60),
    INICIAL NUMERIC(18,4),
    ENTRADA NUMERIC(18,4),
    SALIDA NUMERIC(18,4),
    FINAL NUMERIC(18,4))
AS
BEGIN
/*   for select arti_cod, arti_des from articulo into :CODIGO, :DESCRIPCION
  DO
    BEGIN
    EXECUTE PROCEDURE MOVIMIENTO_TOTAL_ARTICULO_MES(CODIGO, ANO, MES) returning_values (:INICIAL, :ENTRADA, :SALIDA);
    FINAL = INICIAL + ENTRADA - SALIDA;
    SUSPEND;
    END */
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER PROCEDURE MOVIMIENTO_TOTAL_ARTICULO_MES(
    ARTICULO VARCHAR(15),
    ANO CHAR(4),
    MES INTEGER)
RETURNS (
    INICIAL NUMERIC(18,4),
    ENTRADA NUMERIC(18,4),
    SALIDA NUMERIC(18,4))
AS
declare variable BOD CHAR(2);
declare variable INI NUMERIC(15,4);
declare variable ENTC NUMERIC(15,4);
declare variable SALC NUMERIC(15,4);
BEGIN
/*  INICIAL = 0;
  ENTRADA = 0;
  SALIDA = 0;
  FOR SELECT BODE_COD FROM BODEGA INTO :BOD
  DO
    BEGIN
    EXECUTE PROCEDURE MOVIMIENTO_ARTICULO_MES(:ARTICULO, :ANO, :MES, :BOD) returning_values (INI, ENTC, SALC);
    INICIAL = INICIAL + INI;
    ENTRADA = ENTRADA + ENTC;
    SALIDA = SALIDA + SALC;
    END
  SUSPEND; */
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER PROCEDURE MOVIMIENTO_ARTICULO_MES(
    ARTICULO VARCHAR(15),
    FECINI DATE,
    FECFIN DATE,
    BODEGA CHAR(2))
RETURNS (
    INICIAL NUMERIC(18,4),
    ENTC NUMERIC(18,4),
    SALC NUMERIC(18,4))
AS
BEGIN
  EXECUTE PROCEDURE SALDO_INICIAL_INVENTARIO(ARTICULO, FECINI, BODEGA) returning_values (INICIAL);
  SELECT SUM(MVAR_CANT) FROM MOVIMIENTO_ARTICULO
    WHERE (MVAR_FECHA >= :FECINI) AND (MVAR_FECHA < :FECFIN) AND
          (ARTI_COD = :ARTICULO) AND (BODE_COD = :BODEGA) AND (MVAR_ENTRADA = 'S') INTO :ENTC;
  if (ENTC IS NULL) then
    ENTC = 0;
  SELECT SUM(MVAR_CANT) FROM MOVIMIENTO_ARTICULO
    WHERE (MVAR_FECHA >= :FECINI) AND (MVAR_FECHA < :FECFIN) AND
          (ARTI_COD = :ARTICULO) AND (BODE_COD = :BODEGA) AND (MVAR_ENTRADA = 'N') INTO :SALC;
  if (SALC IS NULL) then
    SALC = 0;
  SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER PROCEDURE MOVIMIENTO_TOTAL_ARTICULO_MES(
    ARTICULO VARCHAR(15),
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    INICIAL NUMERIC(18,4),
    ENTRADA NUMERIC(18,4),
    SALIDA NUMERIC(18,4))
AS
declare variable BOD CHAR(2);
declare variable INI NUMERIC(15,4);
declare variable ENTC NUMERIC(15,4);
declare variable SALC NUMERIC(15,4);
BEGIN
  INICIAL = 0;
  ENTRADA = 0;
  SALIDA = 0;
  FOR SELECT BODE_COD FROM BODEGA INTO :BOD
  DO
    BEGIN
    EXECUTE PROCEDURE MOVIMIENTO_ARTICULO_MES(:ARTICULO, :FECINI, :FECFIN, :BOD) returning_values (INI, ENTC, SALC);
    INICIAL = INICIAL + INI;
    ENTRADA = ENTRADA + ENTC;
    SALIDA = SALIDA + SALC;
    END
  SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER PROCEDURE MOVIMIENTO_INVENTARIO_MES(
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    CODIGO VARCHAR(15),
    DESCRIPCION VARCHAR(60),
    INICIAL NUMERIC(18,4),
    ENTRADA NUMERIC(18,4),
    SALIDA NUMERIC(18,4),
    FINAL NUMERIC(18,4))
AS
BEGIN
  for select arti_cod, arti_des from articulo into :CODIGO, :DESCRIPCION
  DO
    BEGIN
    EXECUTE PROCEDURE MOVIMIENTO_TOTAL_ARTICULO_MES(CODIGO, FECINI, FECFIN) returning_values (:INICIAL, :ENTRADA, :SALIDA);
    FINAL = INICIAL + ENTRADA - SALIDA;
    SUSPEND;
    END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER PROCEDURE MOVIMIENTO_CARTERA_MES(
    FECINI DATE,
    FECFIN DATE,
    SUBEMPRESA INTEGER,
    CONTADO CHAR(1))
RETURNS (
    NIT VARCHAR(20),
    NOMBRE VARCHAR(60),
    INICIAL NUMERIC(18,2),
    DEBITOS NUMERIC(18,2),
    CREDITOS NUMERIC(18,2),
    ABONOS NUMERIC(18,2),
    FINAL NUMERIC(18,2))
AS
declare variable RETES CHAR(2);
declare variable TIPODOC INTEGER;
declare variable IDDOC INTEGER;
declare variable SALDO NUMERIC(18,2);
declare variable NUMROWS INTEGER;
BEGIN
  for select TERC_NIT, TERC_NOM from TERCEROS WHERE TERC_CLIE = 'S' into :NIT, :NOMBRE
  DO
    BEGIN
    SELECT COUNT(*) FROM AUTORIZACIONES WHERE AUTO_NITCONTADO = :NIT INTO :numrows;
    IF ((CONTADO = 'S') or (numrows = 0)) THEN
        BEGIN
        FECINI = FECINI - 1;
        INICIAL = 0;
        FOR SELECT MVCL_TIPOREF, MVCL_IDREF FROM MOVIMIENTO_CLIENTES
            WHERE TERC_NIT = :NIT AND MVCL_FECHA <= :FECINI AND
            MVCL_ABONO = 'N' AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA))
            INTO :TIPODOC, :IDDOC
            DO
            BEGIN
            EXECUTE PROCEDURE saldo_doc_cartera(TIPODOC, IDDOC, FECINI) returning_values (SALDO);
            INICIAL = INICIAL + SALDO;
            END
        EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'DESCONTAR RETENCIONES POR CAUSACION') returning_values(:RETES);
        FECINI = FECINI + 1;
        if (RETES = 'SI') then
            BEGIN
            SELECT SUM(MVCL_MONTO-MVCL_RTEFTE-MVCL_RTEIVA-MVCL_RTEICA) FROM movimiento_clientes
                WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND MVCL_FECHA < :FECFIN
                AND MVCL_DEBITO = 'S' AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA))
                INTO :DEBITOS;
            SELECT SUM(MVCL_MONTO-MVCL_RTEFTE-MVCL_RTEIVA-MVCL_RTEICA) FROM movimiento_clientes
                WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND MVCL_FECHA < :FECFIN
                AND MVCL_DEBITO = 'N' AND MVCL_ABONO = 'N' and MVCL_TIPOREF <> 45 AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA))
                INTO :CREDITOS;
            SELECT SUM(MVCL_MONTO) FROM movimiento_clientes
                WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND MVCL_FECHA < :FECFIN
                AND MVCL_ABONO = 'S' AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA))
                INTO :ABONOS;
            END
        ELSE
            BEGIN
            SELECT SUM(MVCL_MONTO) FROM movimiento_clientes
                WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND MVCL_FECHA < :FECFIN
                AND MVCL_DEBITO = 'S' AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA))
                INTO :DEBITOS;
            SELECT SUM(MVCL_MONTO) FROM movimiento_clientes
                WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND MVCL_FECHA < :FECFIN
                AND MVCL_DEBITO = 'N' AND MVCL_ABONO = 'N' and MVCL_TIPOREF <> 45 AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA))
                INTO :CREDITOS;
            SELECT SUM(MVCL_MONTO+MVCL_RTEFTE+MVCL_RTEIVA+MVCL_RTEICA) FROM movimiento_clientes
                WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND MVCL_FECHA < :FECFIN
                AND MVCL_ABONO = 'S' AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA))
                INTO :ABONOS;
            END
        if (DEBITOS IS NULL) then
            DEBITOS = 0;
        if (CREDITOS IS NULL) then
            CREDITOS = 0;
        if (ABONOS IS NULL) then
            ABONOS = 0;
        FINAL = INICIAL + DEBITOS - CREDITOS - ABONOS;
        SUSPEND;
        END
    END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER PROCEDURE MOVIMIENTO_CXPAGAR_MES(
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    NIT VARCHAR(20),
    NOMBRE VARCHAR(60),
    INICIAL NUMERIC(18,4),
    DEBITOS NUMERIC(18,4),
    CREDITOS NUMERIC(18,4),
    ABONOS NUMERIC(18,4),
    FINAL NUMERIC(18,4))
AS
declare variable RETES CHAR(2);
BEGIN
  for select TERC_NIT, TERC_NOM from TERCEROS WHERE TERC_PROV = 'S' into :NIT, :NOMBRE
  DO
    BEGIN
    EXECUTE PROCEDURE saldo_proveedor (NIT, FECINI) returning_values (INICIAL);
    EXECUTE PROCEDURE LEE_CONFIGURACION('CXPAGAR', 'SALDOS', 'DESCONTAR RETENCIONES POR CAUSACION') returning_values(:RETES);
    if (RETES = 'SI') then
        BEGIN
        SELECT SUM(MVPR_MONTO-MVPR_RTFTE-MVPR_RTIVA-MVPR_RTICA)
            FROM movimiento_proveedor
            WHERE TERC_NIT = :NIT AND MVPR_FECHA >= :FECINI AND MVPR_FECHA < :FECFIN AND MVPR_DEBITO = 'S'
            INTO :DEBITOS;
        SELECT SUM(MVPR_MONTO-MVPR_RTFTE-MVPR_RTIVA-MVPR_RTICA)
            FROM movimiento_proveedor
            WHERE TERC_NIT = :NIT AND MVPR_FECHA >= :FECINI AND MVPR_FECHA < :FECFIN AND MVPR_DEBITO = 'N' AND MVPR_ABONO = 'N' and MVPR_TIPOREF <> 55
            INTO :CREDITOS;
        SELECT SUM(MVPR_MONTO) FROM movimiento_proveedor
            WHERE TERC_NIT = :NIT AND MVPR_FECHA >= :FECINI AND MVPR_FECHA < :FECFIN AND MVPR_ABONO = 'S'
            INTO :ABONOS;
        END
    ELSE
        BEGIN
        SELECT SUM(MVPR_MONTO)
            FROM movimiento_proveedor
            WHERE TERC_NIT = :NIT AND MVPR_FECHA >= :FECINI AND MVPR_FECHA < :FECFIN AND MVPR_DEBITO = 'S'
            INTO :DEBITOS;
        SELECT SUM(MVPR_MONTO)
            FROM movimiento_proveedor
            WHERE TERC_NIT = :NIT AND MVPR_FECHA >= :FECINI AND MVPR_FECHA < :FECFIN AND MVPR_DEBITO = 'N' AND MVPR_ABONO = 'N' AND MVPR_TIPOREF <> 55
            INTO :CREDITOS;
        SELECT SUM(MVPR_MONTO+MVPR_RTFTE+MVPR_RTIVA+MVPR_RTICA)
            FROM movimiento_proveedor
            WHERE TERC_NIT = :NIT AND MVPR_FECHA >= :FECINI AND MVPR_FECHA < :FECFIN AND MVPR_ABONO = 'S'
            INTO :ABONOS;
        END
    if (DEBITOS IS NULL) then
        DEBITOS = 0;
    if (CREDITOS IS NULL) then
        CREDITOS = 0;
    if (ABONOS IS NULL) then
        ABONOS = 0;
    FINAL = INICIAL + DEBITOS - CREDITOS - ABONOS;
    SUSPEND;
    END
END
^

SET TERM ; ^


/* contabilización por artículo */

ALTER TABLE CONTABIL_ARTICULO
ADD COAR_CTARTFTE T_CTA_CONTABLE;
ALTER TABLE CONTABIL_ARTICULO
ADD COAR_CTARTICA T_CTA_CONTABLE;
ALTER TABLE CONTABIL_ARTICULO
ADD COAR_CTARTFTEV T_CTA_CONTABLE;
ALTER TABLE CONTABIL_ARTICULO
ADD COAR_CTARTICAV T_CTA_CONTABLE;
ALTER TABLE CONTABIL_ARTICULO
ADD COAR_RTFTE T_PORCENTAJE;
ALTER TABLE CONTABIL_ARTICULO
ADD COAR_RTICA T_PORCENTAJE;

SET TERM ^ ;

CREATE OR ALTER PROCEDURE CUENTA_INTERFAZ(
    TIPO INTEGER,
    ID INTEGER,
    CUENTA VARCHAR(20),
    INV CHAR(1))
RETURNS (
    CTAOK VARCHAR(20),
    TIPOCUEN CHAR(1),
    ERROR INTEGER)
AS
begin
ERROR = 0;
CTAOK = NULL;
SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
    WHERE CUEN_COD = :CUENTA INTO :CTAOK, :TIPOCUEN;
if (CTAOK IS NULL) then
    begin
    EXECUTE PROCEDURE ERROR (:TIPO, :ID, :CUENTA, 2);
    CTAOK = CUENTA;
    TIPOCUEN = 'N';
    ERROR = 1;
    end
if ((INV <> 'S') and (TIPOCUEN = 'I')) then
    begin
    EXECUTE PROCEDURE ERROR (:TIPO, :ID, :CUENTA, 3);
    TIPOCUEN = 'N';
    ERROR = 1;
    end
suspend;
end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER PROCEDURE CONTABIL_FACTURA(
    IDDOC INTEGER,
    IDINTER INTEGER)
RETURNS (
    ERROR INTEGER,
    VER CHAR(1),
    IDC INTEGER)
AS
declare variable pref varchar(4);
declare variable num varchar(6);
declare variable numero varchar(10);
declare variable fecaux date;
declare variable fecha char(8);
declare variable conc varchar(60);
declare variable venceaux date;
declare variable vence char(8);
declare variable vrdto numeric(18,2);
declare variable vradic numeric(18,2);
declare variable vrsubt numeric(18,2);
declare variable vriva numeric(18,2);
declare variable prtfte numeric(9,2);
declare variable vrrtfte numeric(18,2);
declare variable vrrtiva numeric(18,2);
declare variable prtica numeric(9,2);
declare variable vrrtica numeric(18,2);
declare variable vrtotal numeric(18,2);
declare variable vrextra numeric(18,2);
declare variable tipocomp varchar(3);
declare variable prefcont varchar(4);
declare variable ventas char(1);
declare variable ctaventas varchar(20);
declare variable iva char(1);
declare variable ctaiva varchar(20);
declare variable consumo char(1);
declare variable ctaconsumo varchar(20);
declare variable cartera char(1);
declare variable ctacartera varchar(20);
declare variable rtfte char(1);
declare variable ctartfte varchar(20);
declare variable rtiva char(1);
declare variable ctartiva varchar(20);
declare variable rtica char(1);
declare variable ctartica varchar(20);
declare variable inven char(1);
declare variable ctainven varchar(20);
declare variable costos char(1);
declare variable ctacostos varchar(20);
declare variable ctadto varchar(20);
declare variable ctaadic varchar(20);
declare variable ctaextra varchar(20);
declare variable existe char(1);
declare variable cuenta varchar(20);
declare variable monto numeric(18,2);
declare variable tipocuen char(1);
declare variable nit varchar(20);
declare variable nombre varchar(60);
declare variable proy varchar(4);
declare variable centro varchar(4);
declare variable porc numeric(5,2);
declare variable debito numeric(18,2);
declare variable credito numeric(18,2);
declare variable nroi integer;
declare variable art varchar(15);
declare variable imptos numeric(18,2);
declare variable suma numeric(18,2);
declare variable porciva numeric(9,2);
declare variable tctaclien varchar(20);
declare variable tctaventa varchar(20);
declare variable tctartfte varchar(20);
declare variable tctartiva varchar(20);
declare variable tctartica varchar(20);
declare variable ctadic varchar(20);
declare variable baseadic varchar(20);
declare variable porcadic numeric(5,2);
declare variable valoradic numeric(18,2);
declare variable dbadic char(1);
declare variable ptovta integer;
declare variable anulado char(1);
declare variable dig integer;
declare variable mercancia numeric(18,2);
declare variable fomento varchar(2);
declare variable DTOXIT varchar(2);
declare variable vrconsumo numeric(18,2);
declare variable factor double precision;
declare variable cent char(1);
declare variable AUTORET VARCHAR(10);
declare variable FAUTORET DATE;
declare variable ERRORC INTEGER;
BEGIN
EXECUTE PROCEDURE LEE_CONFIGURACION('COMPRAS', 'FACTURAS', 'USAR IMPOCONSUMO COMO PORCENTAJE DE FOMENTO') returning_values (FOMENTO);
EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'FECHA AUTORETENEDOR NO DESCONTAR RETENCIONES DEL SALDO PERO SI CONTABILIZARLAS') returning_values (AUTORET);
if (AUTORET <> '') then
    FAUTORET = CAST(AUTORET AS DATE);
else
    FAUTORET = '9999/12/31';
/* BUSQUE LA INTERFACE */
EXISTE = 'N';
SELECT 'S', TICO_COD, PRCO_PRE, INVE_VENTAS, INVE_IVA, INVE_CONSUMO, INVE_CARTERA, INVE_RTFTE, INVE_RTIVA, INVE_RTICA, INVE_COSTO, INVE_INVEN, INVE_CTAVENTAS, INVE_CTAIVA, INVE_CTACONSUMO, INVE_CTADTO, INVE_CTAADIC, INVE_CTAEXTRA, INVE_CTACARTERA, INVE_CTARTFTE, INVE_CTARTIVA, INVE_CTARTICA, INVE_CTAINVEN, INVE_CTACOSTOS, INVE_CONFIRMAR, INVE_CENTRO
    FROM INTERFAZ_VENTAS
    WHERE INVE_ID = :IDINTER
    INTO :EXISTE, :TIPOCOMP, :PREFCONT, :VENTAS, :IVA, :CONSUMO, :CARTERA, :RTFTE, :RTIVA, :RTICA, :COSTOS, :INVEN, :CTAVENTAS, :CTAIVA, :CTACONSUMO, :CTADTO, :CTAADIC, :CTAEXTRA, :CTACARTERA, :CTARTFTE, :CTARTIVA, :CTARTICA, :CTAINVEN, :CTACOSTOS, :VER, :CENT;
if (EXISTE = 'S') then
  BEGIN
    /* BORRE CUALQUEIR CONTABILIZACION PREVIA */
    DELETE FROM CONTABILIZACION WHERE CNTB_TIPOREF = 31 AND CNTB_IDREF = :IDDOC;

  /* TRAIGA EL ENCABEZADO DE LA FACTURA */
  SELECT PREF_PRE, FACT_NUMERO, FACT_FECHA, F.TERC_NIT, PTVT_ID, FACT_VENCE, FACT_DTOMONTO, FACT_ADICIONAL, FACT_IVAMONTO, FACT_EXTRA, FACT_TOTAL, FACT_RTFTEPOR, FACT_RTFTEMONTO, FACT_RTIVAPOR, FACT_RTIVAMONTO, FACT_RTICAPOR, FACT_RTICAMONTO, FACT_NOMCLIENTE, TERC_CTARTFTE, TERC_CTARTIVA, TERC_CTARTICA, TERC_CTAVENTA, TERC_CTACLIENTE, FACT_ANULADO
        FROM FACTURAS F, TERCEROS T
        WHERE FACT_ID = :IDDOC AND F.TERC_NIT = T.TERC_NIT
        INTO :PREF, :NUM, :FECAUX, :NIT, :PTOVTA, :VENCEAUX, :VRDTO, :VRADIC, :VRIVA, :VREXTRA, :VRTOTAL, :PRTFTE, :VRRTFTE, :PORC, :VRRTIVA, :PRTICA, :VRRTICA, :NOMBRE, TCTARTFTE, TCTARTIVA, TCTARTICA, TCTAVENTA, TCTACLIEN, ANULADO;
  if (ANULADO = 'N') then
    BEGIN
    /* BUSQUE EL CENTRO DEL PUNTO, LA BODEGA, O EL PREFIJO  */
    IF (CENT = 'B') THEN
        SELECT B.BODE_CENTRO, B.BODE_PROY FROM BODEGA B, FACTURAS F
            WHERE B.BODE_COD = F.BODE_COD AND F.FACT_ID = :IDDOC INTO :CENTRO, :PROY;
    IF (CENT = 'V') THEN
        SELECT V.CENT_COD, V.PROY_COD FROM VENDEDORES V, FACTURAS F
            WHERE V.VEND_COD = F.VEND_COD AND F.FACT_ID = :IDDOC INTO :CENTRO, :PROY;
    IF (CENT = 'P') THEN
        SELECT P.PREF_CENTRO,P.PREF_PROY  FROM PREFIJOS P, FACTURAS F
            WHERE P.PREF_PRE = F.PREF_PRE AND F.FACT_ID = :IDDOC AND P.TIDO_COD = 31 INTO :CENTRO, :PROY;
    NUMERO = PREF || NUM;
    SELECT SUM (FADE_CONSUMO) FROM FACTURAS_DETALLE WHERE FACT_ID = :IDDOC INTO MERCANCIA;
    VRSUBT = VRTOTAL - VREXTRA - VRIVA - MERCANCIA; /* BASE DE RETEFTE Y RETEICA */

    EXECUTE PROCEDURE lee_configuracion ('FACTURACION', 'FACTURAS', 'DESCUENTO PIE FACTURA IGUAL A SUMA DE DESCUENTOS POR ITEM') returning_values (:DTOXIT);
    if (DTOXIT = 'SI') then
        VRDTO = 0;
    MERCANCIA = VRSUBT - VRADIC + VRDTO;
    EXECUTE PROCEDURE FECHA_A_CONTA(:FECAUX) returning_values (:FECHA);
    EXECUTE PROCEDURE FECHA_A_CONTA(:VENCEAUX) returning_values (:VENCE);
    /* REGISTRE EL ENCABEZADO CONTABLE */
    IDC = GEN_ID(ID_CONTABILIZA, 1);
    if (STRLEN(NOMBRE)> 43 ) then
      CONC = 'FV No.' || NUMERO || '-' || SUBSTR(NOMBRE,1,43);
    ELSE
      CONC = 'FV No.' || NUMERO || '-' || NOMBRE;
    INSERT INTO CONTABILIZACION (CNTB_ID, CNTB_TIPOCOMP, CNTB_PREFCNT, CNTB_NUMERO, CNTB_FECHA, CNTB_CONCEPTO, CNTB_REF, CNTB_TIPOREF, CNTB_IDREF, CNTB_PREFREF, CNTB_NUMREF, CNTB_PROCESADO)
        VALUES (:IDC, :TIPOCOMP, :PREFCONT, :NUM, :FECHA, :CONC, '', 31, :IDDOC, :PREF, :NUM, 'N');
    NROI = 0;
    SUMA = 0;
    ERROR = 0;
    /* SI NO HAY CUENTA DE DESCUENTO NI ADICIONAL CALCULE UN FACTOR PARA LAS VENTAS Y EL IVA */
    if (MERCANCIA <> 0) then
        FACTOR = CAST(VRSUBT AS DOUBLE PRECISION) / CAST(MERCANCIA AS DOUBLE PRECISION);
    ELSE
        FACTOR = 1;
    /* TRAIGA EL NUMERO DE DIGITOS PARA EL REDONDEO */
    SELECT CAST(CONF_VALOR AS INTEGER) FROM CONFIGURACION WHERE CONF_MODULO = 'FACTURACION' AND
        CONF_CATEGORIA = 'GENERAL' AND CONF_PROPIEDAD = 'REDONDEO AL MULTIPLO DE DIEZ EN TOTALES' INTO :DIG;
    /* CUENTAS DE VENTAS */
    if (VENTAS = 'A') then
        BEGIN
        FOR SELECT MAX(COAR_CTAVNT), SUM(FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), SUM(FADE_IVAMONTO), SUM(FADE_CONSUMO)
            FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_DETALLE F
            WHERE F.FACT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD
            GROUP BY COAR_CTAVNT
            INTO :CTAVENTAS, :MONTO, :IMPTOS, :VRCONSUMO
            DO
            BEGIN
            if (FOMENTO = 'SI') then
                MONTO = MONTO + VRCONSUMO;
            if ((CTADTO IS NULL) OR (CTADTO = '')) then
                MONTO = MONTO * FACTOR;
            execute procedure redondee(MONTO, DIG) returning_values (MONTO);
            if (MONTO <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTAVENTAS, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT F.ARTI_COD, (FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), FADE_CONSUMO
                        FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_DETALLE F
                        WHERE F.FACT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTAINV = :CUENTA
                        INTO :ART, :MONTO, :IMPTOS
                    DO
                        BEGIN
                        if (FOMENTO = 'SI') then
                            MONTO = MONTO + IMPTOS;
                        if ((CTADTO IS NULL) OR (CTADTO = '')) then
                            MONTO = MONTO * FACTOR;
                        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                        if (MONTO <> 0) then
                            BEGIN
                            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                            NROI = NROI + 1;
                            SUMA = SUMA - MONTO;
                            END
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    NROI = NROI + 1;
                    SUMA = SUMA - MONTO;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA - MONTO;
                    END
                END /* MONTO <> 0 */
            END /* FOR */
        END /* VENTAS X ARTICULO */
     IF ((VENTAS = 'C') OR (VENTAS = 'K')) THEN
        BEGIN
        IF (VENTAS = 'C') THEN
            CTAVENTAS = TCTAVENTA;
        SELECT SUM(FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), SUM(FADE_IVAMONTO), SUM (FADE_CONSUMO)
            FROM FACTURAS_DETALLE F
            WHERE F.FACT_ID = :IDDOC 
            INTO :MONTO, :IMPTOS, :VRCONSUMO;
        if (FOMENTO = 'SI') then
            MONTO = MONTO + VRCONSUMO;
        if ((CTADTO IS NULL) OR (CTADTO = '')) then
            MONTO = MONTO * FACTOR;
        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
        if (MONTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTAVENTAS, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT F.ARTI_COD, (FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), FADE_CONSUMO
                    FROM ARTICULO A, FACTURAS_DETALLE F
                    WHERE F.FACT_ID = :IDDOC 
                    INTO :ART, :MONTO, :IMPTOS
                    DO
                    BEGIN
                    if (FOMENTO = 'SI') then
                        MONTO = MONTO + VRCONSUMO;
                    if ((CTADTO IS NULL) OR (CTADTO = '')) then
                        MONTO = MONTO * FACTOR;
                    execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                    if (MONTO <> 0) then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        SUMA = SUMA - MONTO;
                        END
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - MONTO;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - MONTO;
                END
            END /* MONTO <> 0 */
        END /* VENTAS DE CLIENTE O CONSTANTE */
    /* EL IVA EN VENTAS */
    if (IVA = 'A') then
        BEGIN
        FOR SELECT MAX(COAR_CTAIVAV), SUM(FADE_IVAMONTO), SUM(FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), sum(FADE_CONSUMO)
            FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_DETALLE F
            WHERE F.FACT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD
            GROUP BY COAR_CTAIVAV
            INTO :CTAIVA, :IMPTOS, :MONTO, :VALORADIC
        DO
            BEGIN
            if (FOMENTO = 'SI') then
                MONTO = MONTO + VALORADIC;
            MONTO = MONTO * -1;
            MONTO = MONTO * FACTOR;
            IMPTOS = IMPTOS * FACTOR;
            execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
            execute procedure redondee(MONTO, DIG) returning_values (MONTO);
            if (IMPTOS <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTAIVA, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT F.ARTI_COD, FADE_IVAMONTO, (FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), TAIV_PORC, FADE_CONSUMO
                        FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_DETALLE F, TARIFA_IVA T
                        WHERE F.FACT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTAIVAV = :CUENTA AND A.TAIV_COD = T.TAIV_COD
                        INTO :ART, :IMPTOS, :MONTO, :PORCIVA, :VALORADIC
                    DO
                        BEGIN
                        if (FOMENTO = 'SI') then
                            MONTO = MONTO + VALORADIC;
                        MONTO = MONTO * -1;
                        MONTO = MONTO * FACTOR;
                        IMPTOS = IMPTOS * FACTOR;
                        execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                        if (IMPTOS <> 0) then
                            BEGIN
                            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, :MONTO, :PORCIVA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                            NROI = NROI + 1;
                            SUMA = SUMA + DEBITO - CREDITO;
                            END
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, :MONTO, ABS(:IMPTOS*100/:MONTO), :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    NROI = NROI + 1;
                    SUMA = SUMA - IMPTOS;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, :MONTO, ABS(:IMPTOS*100/:MONTO), :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA - IMPTOS;
                    END
                END   /* IMPTOS <> 0 */
            END /* FOR */
        END /* IVA X ARTICULO */
    if (IVA = 'K') then /* IVA EN CTA CONSTANTE */
        BEGIN
        SELECT SUM(FADE_IVAMONTO), SUM(FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), SUM(FADE_CONSUMO)
            FROM FACTURAS_DETALLE F
            WHERE F.FACT_ID = :IDDOC and FADE_IVAMONTO <> 0
            INTO :IMPTOS, :MONTO, :valoradic;
        if (FOMENTO = 'SI') then
            MONTO = MONTO + VALORADIC;
        MONTO = MONTO * -1;
        MONTO = MONTO * FACTOR;
        IMPTOS = IMPTOS * FACTOR;
        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
        execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
        if (IMPTOS <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTAIVA, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT F.ARTI_COD, (FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), FADE_IVAMONTO, TAIV_PORC, FADE_CONSUMO
                    FROM ARTICULO A, FACTURAS_DETALLE F, TARIFA_IVA T
                    WHERE F.FACT_ID = :IDDOC AND A.TAIV_COD = T.TAIV_COD
                    INTO :ART, :MONTO, :IMPTOS, :PORCIVA, :VALORADIC
                    DO
                    BEGIN
                    if (FOMENTO = 'SI') then
                        MONTO = MONTO + VALORADIC;
                    MONTO = MONTO * -1;
                    MONTO = MONTO * FACTOR;
                    IMPTOS = IMPTOS * FACTOR;
                    execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                    execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                    if (IMPTOS <> 0) then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', 0, :IMPTOS, :MONTO, :PORCIVA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        SUMA = SUMA - IMPTOS;
                        END
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', 0, :IMPTOS, :MONTO, ABS(:IMPTOS*100/:MONTO), :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - IMPTOS;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', 0, :IMPTOS, :MONTO, ABS(:IMPTOS*100/:MONTO), :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - IMPTOS;
                END
            END /* IMPTOS <> 0 */
        END /* IVA EN CTA CONSTANTE */
    /* EL IMPOCONSUMO */
    if ((CONSUMO = 'A') AND (FOMENTO <> 'SI')) then
        BEGIN
        FOR SELECT MAX(COAR_CTACONS), SUM(FADE_CONSUMO)
            FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_DETALLE F
            WHERE F.FACT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD
            GROUP BY COAR_CTACONS
            INTO :CTACONSUMO, :IMPTOS
        DO
            BEGIN
            execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
            if (IMPTOS <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTACONSUMO, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, REGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT F.ARTI_COD, FADE_CONSUMO
                        FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_DETALLE F
                        WHERE F.FACT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTACONS = :CUENTA
                        INTO :ART, :IMPTOS
                    DO
                        BEGIN
                        execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                        if (IMPTOS <> 0) then
                            BEGIN
                            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                            NROI = NROI + 1;
                            SUMA = SUMA - IMPTOS;
                            END
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    NROI = NROI + 1;
                    SUMA = SUMA - IMPTOS;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA - IMPTOS;
                    END
                END /* IMPTOS <> 0 */
            END /* FOR */
        END /* CONSUMO X ARTICULO */
    if ((CONSUMO = 'K') AND (FOMENTO <> 'SI')) then /* CONSUMO EN CTA CONSTANTE */
        BEGIN
        SELECT SUM(FADE_CONSUMO)
            FROM FACTURAS_DETALLE F
            WHERE F.FACT_ID = :IDDOC 
            INTO :IMPTOS;
        execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
        if (IMPTOS <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTACONSUMO, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT F.ARTI_COD, FADE_CONSUMO
                    FROM ARTICULO A, FACTURAS_DETALLE F
                    WHERE F.FACT_ID = :IDDOC 
                    INTO :ART, :IMPTOS
                    DO
                    BEGIN
                    execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                    if (IMPTOS <> 0) then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CTACONSUMO, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        SUMA = SUMA - IMPTOS;
                        END
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTACONSUMO, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - IMPTOS;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTACONSUMO, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - IMPTOS;
                END
            END /* IMPTOS <> 0 */
        END /* CONSUMO EN CTA CONSTANTE */
    /* DESCUENTO */
    if ((CTADTO IS NOT NULL) AND (CTADTO <> '')) then
        BEGIN
        execute procedure redondee(VRDTO, DIG) returning_values (VRDTO);
        if (VRDTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTADTO, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRDTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA + VRDTO;
                END
            if (TIPOCUEN = 'N') then
                    BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRDTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA + VRDTO;
                END
            END
        END /* DESCUENTO */
    /* VALOR ADIC */
    if ((CTAADIC IS NOT NULL) AND (CTAADIC <> '')) then
        BEGIN
        execute procedure redondee(VRADIC, DIG) returning_values (VRADIC);
        if (VRADIC <> 0) THEN
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTAADIC, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRADIC, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - VRADIC;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRADIC, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - VRADIC;
                END
            END
        END /* VR. ADIC */
    /* VALOR EXTRA */
    if ((CTAEXTRA IS NOT NULL) AND (CTAEXTRA <> '')) THEN
        BEGIN
        execute procedure redondee(VREXTRA, DIG) returning_values (VREXTRA);
        if (VREXTRA <> 0) THEN
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTAEXTRA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VREXTRA, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - VREXTRA;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VREXTRA, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - VREXTRA;
                END
            END
        END /* VR. EXTRA */
    /* DESCUENTE EL IMPOCONSUMO */
    SELECT SUM(FADE_CONSUMO)
        FROM FACTURAS_DETALLE F WHERE F.FACT_ID = :IDDOC INTO :IMPTOS;
    vrsubt = vrsubt - IMPTOS;
    /* RETENCION FUENTE */
    if ((RTFTE = 'C') or (RTFTE = 'K')) then
      BEGIN
      execute procedure redondee(VRRTFTE, DIG) returning_values (VRRTFTE);
      if (VRRTFTE <> 0) then
        BEGIN
        if (RTFTE = 'C') then
            CTARTFTE = TCTARTFTE;
        EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTARTFTE, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :VRSUBT, :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTFTE;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :VRSUBT, :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTFTE;
            END
        /* AUTORETENCION */
        if (FAUTORET <= fecaux) then
            BEGIN
            EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'CUENTA DE AUTORETENCION EN LA FUENTE') returning_values (CTARTFTE);
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTARTFTE INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERROR (31, :IDDOC, :CTARTFTE, 2);
                CUENTA = CTARTFTE;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                begin
                EXECUTE PROCEDURE ERROR (31, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, (:VRSUBT*-1), :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - VRRTFTE;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, (:VRSUBT*-1), :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - VRRTFTE;
                END
            END
        END /* RTFTE */
      END
    if (RTFTE = 'A') then
      BEGIN
      FOR SELECT MAX(COAR_CTARTFTEV), MAX(COAR_RTFTE), SUM(FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), SUM((FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO)*COAR_RTFTE)
        FROM CONTABIL_ARTICULO C, FACTURAS_DETALLE F
        WHERE F.FACT_ID = :IDDOC AND F.ARTI_COD = C.ARTI_COD
        GROUP BY COAR_CTARTFTEV
        INTO :CTARTFTE, :PRTFTE, :MONTO, :VRRTFTE
        DO
        BEGIN
        MONTO = MONTO * FACTOR;
        VRRTFTE = VRRTFTE * FACTOR / 100;
        execute procedure redondee(VRRTFTE, DIG) returning_values (VRRTFTE);
        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
        if (VRRTFTE <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTARTFTE, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :MONTO, :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA + VRRTFTE;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :MONTO, :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA + VRRTFTE;
                END
            /* AUTORETENCION */
            if (FAUTORET <= fecaux) then
                BEGIN
                EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'CUENTA DE AUTORETENCION EN LA FUENTE') returning_values (CTARTFTE);
                EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTARTFTE, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, (:MONTO*-1), :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    NROI = NROI + 1;
                    SUMA = SUMA - VRRTFTE;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, (:MONTO*-1), :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA - VRRTFTE;
                    END
                END
            END
        END /* RTFTE */
      END
    /* RETENCION IVA */
    if ((RTIVA = 'C') or (RTIVA = 'K')) then
      BEGIN
      execute procedure redondee(VRRTIVA, DIG) returning_values (VRRTIVA);
      if (VRRTIVA <> 0) then
        BEGIN
        if (RTIVA = 'C') then
            CTARTIVA = TCTARTIVA;
        EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTARTIVA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTIVA, 0, :VRIVA, :PORC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTIVA;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTIVA, 0, :VRIVA, :PORC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTIVA;
            END
        END /* RTIVA */
      END
    /* RETENCION DE ICA */
    if ((RTICA = 'C') or (RTICA = 'K')) then
      BEGIN
      execute procedure redondee(VRRTICA, DIG) returning_values (VRRTICA);
      if (VRRTICA <> 0) then
        BEGIN
        if (RTICA = 'C') then
            CTARTICA = TCTARTICA;
        EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTARTICA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTICA, 0, :VRSUBT, :PRTICA, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTICA;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTICA, 0, :VRSUBT, :PRTICA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTICA;
            END
        END /* RTICA */
      END
    if (RTICA = 'A') then
      BEGIN
      FOR SELECT MAX(COAR_CTARTICAV), MAX(COAR_RTICA), SUM(FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), SUM((FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO)*COAR_RTICA)
        FROM CONTABIL_ARTICULO C, FACTURAS_DETALLE F
        WHERE F.FACT_ID = :IDDOC AND F.ARTI_COD = C.ARTI_COD
        GROUP BY COAR_CTARTFTEV
        INTO :CTARTICA, :PRTICA, :MONTO, :VRRTICA
        DO
        BEGIN
        MONTO = MONTO * FACTOR;
        VRRTICA = VRRTICA * FACTOR / 100;
        execute procedure redondee(VRRTICA, DIG) returning_values (VRRTICA);
        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
        if (VRRTICA <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTARTICA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTICA, 0, :MONTO, :PRTICA, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTICA;
            END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTICA, 0, :MONTO, :PRTICA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA + VRRTICA;
                END
            END
          END
        END   /* RTICA */
    /* CIERRE EL COMPROBANTE CONTRA LA CUENTA DEL TERCERO O LA CONSTANTE */
    if ((SUMA <> 0) and ((CARTERA = 'C') or (CARTERA = 'K') or (CARTERA = 'J'))) then
        BEGIN
        if (SUMA < 0) then
            BEGIN
            DEBITO = SUMA * -1;
            CREDITO = 0;
            END
        ELSE
            BEGIN
            DEBITO = 0;
            CREDITO = SUMA;
            END
        if (CARTERA = 'C') then
            CTACARTERA = TCTACLIEN;
        if (CARTERA = 'J') then
            BEGIN
            /* BUSQUE LA CUENTA DE LA CAJA */
            SELECT CAJA_CUENTA FROM CAJAS C, PUNTO_VENTA P
                WHERE P.CAJA_ID = C.CAJA_ID AND PTVT_ID = :PTOVTA
                INTO :CTACARTERA;
            END
        EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTACARTERA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :DEBITO, :CREDITO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
        if (TIPOCUEN = 'N') then
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :DEBITO, :CREDITO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
        NROI = NROI + 1;
        END /* SUMA EN CARTERA */
    /* CALCULE COSTOS EN VENTAS */
    EXECUTE PROCEDURE COSTO_EN_VENTAS(31, :IDDOC);
    if (COSTOS = 'A') then
        BEGIN
        FOR SELECT MAX(CTACOS), SUM(CAST(CANT AS DOUBLE PRECISION) * COSTO)
            FROM COSTO_VENTAS
            GROUP BY CTACOS
            INTO :CTACOSTOS, :MONTO
        DO
            BEGIN
            if (MONTO <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTACOSTOS, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT ARTI_COD, CANT * COSTO
                        FROM COSTO_VENTAS
                        WHERE CTACOS = :CUENTA
                        INTO :ART, :MONTO
                    DO
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    NROI = NROI + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    END
                END /* MONTO <> 0 */
            END /* FOR */
        END /* COSTOS */
    if (COSTOS = 'K') then
        BEGIN
        SELECT SUM(CAST(CANT AS DOUBLE PRECISION) * COSTO)
            FROM COSTO_VENTAS
            INTO :MONTO;
        if (MONTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTACOSTOS, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, REGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT ARTI_COD, CANT * COSTO
                    FROM COSTO_VENTAS
                    INTO :ART, :MONTO
                DO
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTACOSTOS, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                    NROI = NROI + 1;
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTACOSTOS, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTACOSTOS, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                END
            END /* MONTO <> 0 */
        END /* COSTOS = K */
    if (INVEN = 'A') then
        BEGIN
        FOR SELECT MAX(CTAINV), SUM(CAST(CANT AS DOUBLE PRECISION) * COSTO)
            FROM COSTO_VENTAS
            GROUP BY CTAINV
            INTO :CTAINVEN, :MONTO
        DO
            BEGIN
            if (MONTO <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTAINVEN, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, REGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT ARTI_COD, CANT * COSTO
                        FROM COSTO_VENTAS
                        WHERE CTAINV = :CUENTA
                        INTO :ART, :MONTO
                    DO
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    NROI = NROI + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    END
                END /* MONTO <> 0 */
            END /* FOR */
        END /* INVEN = A */
    if (INVEN = 'K') then
        BEGIN
        SELECT SUM(CAST(CANT AS DOUBLE PRECISION) * COSTO)
            FROM COSTO_VENTAS
            INTO :MONTO;
        if (MONTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTAINVEN, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT ARTI_COD, CANT * COSTO
                    FROM COSTO_VENTAS
                    INTO :ART, :MONTO
                DO
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTAINVEN, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                    NROI = NROI + 1;
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAINVEN, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAINVEN, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                END
            END /* MONTO <> 0 */
        END /* INVEN = K */
    /* recorra las cuentas adicionales */
    FOR SELECT INVC_CUENTA, INVC_BASE, INVC_PORC, INVC_VALOR, INVC_DB
        FROM INTERFAZ_VENTAS_CTAS
        WHERE INVE_ID = :IDINTER
        INTO :CTADIC, :BASEADIC, :PORCADIC, :VALORADIC, :DBADIC
        DO
        BEGIN
        if (VALORADIC <> 0) then
            MONTO = VALORADIC;
        ELSE
            BEGIN
            if (:BASEADIC = 'SUBTOTAL') then
                VALORADIC = vrsubt;
            if (:BASEADIC = 'DESCUENTO') then
                VALORADIC = VRDTO;
            if (:BASEADIC = 'IVA') then
                VALORADIC = VRIVA;
            if (:BASEADIC = 'ADICIONAL') then
                VALORADIC = VRADIC;
            if (:BASEADIC = 'EXTRA') then
                VALORADIC = VREXTRA;
            if (:BASEADIC = 'TOTAL') then
                VALORADIC = VRTOTAL;
            MONTO = VALORADIC * PORCADIC / 100;
            END
        if (MONTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTADIC, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                if (DBADIC = 'S') then
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                ELSE
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                if (DBADIC = 'S') then
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                ELSE
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                END
            NROI = NROI + 1;
            END
        END
    if (ERROR > 0) then
        VER = 'S';
    SUSPEND;
    END /* NO ANULADO */
  END /* EXISTE LA INTERFAZ */
ELSE
    BEGIN
    EXECUTE PROCEDURE ERROR (31, :IDDOC, :PREF, 1);
    ERROR = ERROR + 1;
    VER = 'S';
    SUSPEND;
    END
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE FACTURAS_SIN_CONTABILIDAD(
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    ID INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    ESTADO VARCHAR(20),
    IDI INTEGER,
    IDC INTEGER)
AS
DECLARE VARIABLE VER CHAR(2);
declare variable FECICNT VARCHAR(10);
declare variable FECFCNT VARCHAR(10);
declare variable ERROR INTEGER;
declare variable idref INTEGER;
BEGIN /*$$IBE$$ 
EXECUTE PROCEDURE fecha_a_conta(FECINI) returning_values (FECICNT);
EXECUTE PROCEDURE fecha_a_conta(FECFIN) returning_values (FECFCNT);
FOR SELECT FACT_ID, PREF_PRE, FACT_NUMERO FROM FACTURAS WHERE FACT_ANULADO = 'N' AND
    FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN INTO :ID, :PREF, :NUMERO
DO
  BEGIN
  idref = null;
  SELECT ENCO_IDREF FROM COMPROBANTE_ENCABEZADO WHERE ENCO_TIPOREF = 31 AND ENCO_FECHA >= :FECICNT AND ENCO_FECHA <= :FECFCNT and ENCO_IDREF = :ID into :idref;
  if (idref IS NULL) then
  begin
   ESTADO = 'PROCESANDO';
   ERROR = NULL;
   SUSPEND;
   SELECT MAX(INVE_ID) FROM INTERFAZ_VENTAS WHERE PREF_PRE = :PREF AND TIDO_COD = 31 INTO :IDI;
   EXECUTE PROCEDURE CONTABIL_FACTURA (:ID, :IDI) RETURNING_VALUES (:ERROR, VER, :IDC);
   if ((ERROR = 0) or (error IS NULL)) then
    BEGIN
    EXECUTE PROCEDURE CONTABILIZA_PENDIENTE (:IDC);
    ESTADO = 'OK';
    END
   ELSE
    ESTADO = 'ERROR';
   suspend;
  end
  END
 $$IBE$$*/ SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE FACTURAS_SIN_CONTABILIDAD(
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    ID INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    ESTADO VARCHAR(20),
    IDI INTEGER,
    IDC INTEGER)
AS
DECLARE VARIABLE VER CHAR(2);
declare variable FECICNT VARCHAR(10);
declare variable FECFCNT VARCHAR(10);
declare variable ERROR INTEGER;
declare variable idref INTEGER;
BEGIN
EXECUTE PROCEDURE fecha_a_conta(FECINI) returning_values (FECICNT);
EXECUTE PROCEDURE fecha_a_conta(FECFIN) returning_values (FECFCNT);
FOR SELECT FACT_ID, PREF_PRE, FACT_NUMERO FROM FACTURAS WHERE FACT_ANULADO = 'N' AND
    FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN INTO :ID, :PREF, :NUMERO
DO
  BEGIN
  idref = null;
  SELECT ENCO_IDREF FROM COMPROBANTE_ENCABEZADO WHERE ENCO_TIPOREF = 31 AND ENCO_FECHA >= :FECICNT AND ENCO_FECHA <= :FECFCNT and ENCO_IDREF = :ID into :idref;
  if (idref IS NULL) then
  begin
   ESTADO = 'PROCESANDO';
   ERROR = NULL;
   SUSPEND;
   SELECT MAX(INVE_ID) FROM INTERFAZ_VENTAS WHERE PREF_PRE = :PREF AND TIDO_COD = 31 INTO :IDI;
   EXECUTE PROCEDURE CONTABIL_FACTURA (:ID, :IDI) RETURNING_VALUES (:ERROR, VER, :IDC);
   if ((ERROR = 0) or (error IS NULL)) then
    BEGIN
    EXECUTE PROCEDURE CONTABILIZA_PENDIENTE (:IDC);
    ESTADO = 'OK';
    END
   ELSE
    ESTADO = 'ERROR';
   suspend;
  end
  END
END

^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER PROCEDURE CONTABIL_DEVOLCLI(
    IDDOC INTEGER,
    IDINTER INTEGER)
RETURNS (
    ERROR INTEGER,
    VER CHAR(1),
    IDC INTEGER)
AS
declare variable PREF VARCHAR(4);
declare variable NUM VARCHAR(6);
declare variable NUMERO VARCHAR(10);
declare variable FECAUX DATE;
declare variable FECHA CHAR(8);
declare variable CONC CHAR(120);
declare variable NUMFAC VARCHAR(10);
declare variable VRDTO NUMERIC(18, 2);
declare variable VRADIC NUMERIC(18, 2);
declare variable VRSUBT NUMERIC(18, 2);
declare variable VRIVA NUMERIC(18, 2);
declare variable PRTFTE NUMERIC(9, 2);
declare variable VRRTFTE NUMERIC(18, 2);
declare variable VRRTIVA NUMERIC(18, 2);
declare variable PRTICA NUMERIC(9, 2);
declare variable VRRTICA NUMERIC(18, 2);
declare variable VRTOTAL NUMERIC(18, 2);
declare variable VREXTRA NUMERIC(18, 2);
declare variable TIPOCOMP VARCHAR(3);
declare variable PREFCONT VARCHAR(4);
declare variable VENTAS CHAR(1);
declare variable CTAVENTAS VARCHAR(20);
declare variable IVA CHAR(1);
declare variable CTAIVA VARCHAR(20);
declare variable CONSUMO CHAR(1);
declare variable CTACONSUMO VARCHAR(20);
declare variable CARTERA CHAR(1);
declare variable CTACARTERA VARCHAR(20);
declare variable RTFTE CHAR(1);
declare variable CTARTFTE VARCHAR(20);
declare variable RTIVA CHAR(1);
declare variable CTARTIVA VARCHAR(20);
declare variable RTICA CHAR(1);
declare variable CTARTICA VARCHAR(20);
declare variable INVEN CHAR(1);
declare variable CTAINVEN VARCHAR(20);
declare variable COSTOS CHAR(1);
declare variable CTACOSTOS VARCHAR(20);
declare variable CTADTO VARCHAR(20);
declare variable CTAADIC VARCHAR(20);
declare variable CTAEXTRA VARCHAR(20);
declare variable EXISTE CHAR(1);
declare variable CUENTA VARCHAR(20);
declare variable MONTO NUMERIC(18,2);
declare variable TIPOCUEN CHAR(1);
declare variable NIT VARCHAR(20);
declare variable PROY VARCHAR(4);
declare variable CENTRO VARCHAR(4);
declare variable PORC NUMERIC(5,2);
declare variable DEBITO NUMERIC(18,2);
declare variable CREDITO NUMERIC(18,2);
declare variable NROI INTEGER;
declare variable ART VARCHAR(15);
declare variable IMPINC CHAR(1);
declare variable IMPTOS NUMERIC(18, 2);
declare variable SUMA NUMERIC(18,2);
declare variable PORCIVA NUMERIC(9,2);
declare variable TCTACLIEN VARCHAR(20);
declare variable TCTAVENTA VARCHAR(20);
declare variable TCTARTFTE VARCHAR(20);
declare variable TCTARTIVA VARCHAR(20);
declare variable TCTARTICA VARCHAR(20);
declare variable CTADIC VARCHAR(20);
declare variable BASEADIC VARCHAR(20);
declare variable PORCADIC NUMERIC(5,2);
declare variable VALORADIC NUMERIC(18,2);
declare variable DBADIC CHAR(1);
declare variable PTOVTA INTEGER;
declare variable ANULADO CHAR(1);
declare variable CENT CHAR(1);
DECLARE VARIABLE MERCANCIA NUMERIC(18,2);
declare variable FACTOR DOUBLE PRECISION;
declare variable DIG INTEGER;
DECLARE VARIABLE FOMENTO VARCHAR(2);
DECLARE VARIABLE VRCONSUMO NUMERIC(18,2);
declare variable AUTORET VARCHAR(10);
declare variable FAUTORET DATE;
declare variable IDREM INTEGER;
declare variable DTOXIT CHAR(2);
declare variable ERRORC INTEGER;
BEGIN
EXECUTE PROCEDURE LEE_CONFIGURACION('COMPRAS', 'FACTURAS', 'USAR IMPOCONSUMO COMO PORCENTAJE DE FOMENTO') returning_values (FOMENTO);
EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'FECHA AUTORETENEDOR NO DESCONTAR RETENCIONES DEL SALDO PERO SI CONTABILIZARLAS') returning_values (AUTORET);
if (AUTORET <> '') then
    FAUTORET = CAST(AUTORET AS DATE);
else
    FAUTORET = '9999/12/31';
  /* BUSQUE LA INTERFACE */
  EXISTE = 'N';
  SELECT 'S', TICO_COD, PRCO_PRE, INVE_VENTAS, INVE_IVA, INVE_CONSUMO, INVE_CARTERA, INVE_RTFTE, INVE_RTIVA, INVE_RTICA, INVE_COSTO, INVE_INVEN, INVE_CTAVENTAS, INVE_CTAIVA, INVE_CTACONSUMO, INVE_CTADTO, INVE_CTAADIC, INVE_CTAEXTRA, INVE_CTACARTERA, INVE_CTARTFTE, INVE_CTARTIVA, INVE_CTARTICA, INVE_CTAINVEN, INVE_CTACOSTOS, INVE_CONFIRMAR, INVE_CENTRO
    FROM INTERFAZ_VENTAS
    WHERE INVE_ID = :IDINTER
    INTO :EXISTE, :TIPOCOMP, :PREFCONT, :VENTAS, :IVA, :CONSUMO, :CARTERA, :RTFTE, :RTIVA, :RTICA, :COSTOS, :INVEN, :CTAVENTAS, :CTAIVA, :CTACONSUMO, :CTADTO, :CTAADIC, :CTAEXTRA, :CTACARTERA, :CTARTFTE, :CTARTIVA, :CTARTICA, :CTAINVEN, :CTACOSTOS, :VER, :CENT;
  if (EXISTE = 'S') then
   BEGIN
    /* BORRE CUALQUEIR CONTABILIZACION PREVIA */
    DELETE FROM CONTABILIZACION WHERE CNTB_TIPOREF = 33 AND CNTB_IDREF = :IDDOC;
    /* TRAIGA EL ENCABEZADO DE LA DEVOLUCION */
   SELECT PREF_PRE, DEVT_NUMERO, DEVT_FECHA, F.TERC_NIT, DEVT_IVAINC, PTVT_ID, DEVT_FACTURA, DEVT_DTOMONTO, DEVT_ADICIONAL, DEVT_IVAMONTO, DEVT_EXTRA, DEVT_TOTAL, DEVT_RTFTEPORC, DEVT_RTFTEMONTO, DEVT_RTIVAPORC, DEVT_RTIVAMONTO, DEVT_RTICAPORC, DEVT_RTICAMONTO, TERC_CTARTFTE, TERC_CTARTIVA, TERC_CTARTICA, TERC_CTAVENTA, TERC_CTACLIENTE, DEVT_ANULADO, DEVT_REMID
        FROM DEVOLUCIONES_VENTAS F, TERCEROS T
        WHERE DEVT_ID = :IDDOC AND F.TERC_NIT = T.TERC_NIT
        INTO :PREF, :NUM, :FECAUX, :NIT, :IMPINC, :PTOVTA, :NUMFAC, :VRDTO, :VRADIC, :VRIVA, :VREXTRA, :VRTOTAL, :PRTFTE, :VRRTFTE, :PORC, :VRRTIVA, :PRTICA, :VRRTICA, :TCTARTFTE, TCTARTIVA, TCTARTICA, TCTAVENTA, TCTACLIEN, ANULADO, :IDREM;
   if (idrem is null) Then
    IDREM = 0;
   if ((ANULADO = 'N') AND (IDREM = 0)) then
    BEGIN
    NUMERO = PREF || NUM;
    SELECT SUM(DVDE_CONSUMO) FROM devoluciones_ventas_detalle WHERE DEVT_ID = :iddoc INTO :MERCANCIA;
    VRSUBT = VRTOTAL - VREXTRA - VRIVA - MERCANCIA; /* BASE DE RETEFTE Y RETEICA */
    EXECUTE PROCEDURE lee_configuracion ('FACTURACION', 'DEVOLUCIONES', 'DESCUENTO PIE DEVOLUCION IGUAL A SUMA DE DESCUENTOS POR ITEM') returning_values (:DTOXIT);
    if (DTOXIT = 'SI') then
        VRDTO = 0;
    MERCANCIA = VRSUBT - VRADIC + VRDTO;
    IF (CENT = 'B') THEN
        SELECT B.BODE_CENTRO, B.BODE_PROY FROM BODEGA B, DEVOLUCIONES_VENTAS F
            WHERE B.BODE_COD = F.BODE_COD AND F.DEVT_ID = :IDDOC INTO :CENTRO, :PROY;
    IF (CENT = 'V') THEN
        SELECT V.CENT_COD, V.PROY_COD FROM VENDEDORES V, DEVOLUCIONES_VENTAS F
            WHERE V.VEND_COD = F.VEND_COD AND F.DEVT_ID = :IDDOC INTO :CENTRO, :PROY;
    IF (CENT = 'P') THEN
        SELECT P.PREF_CENTRO,P.PREF_PROY  FROM PREFIJOS P, DEVOLUCIONES_VENTAS F
            WHERE P.PREF_PRE = F.PREF_PRE AND F.DEVT_ID = :IDDOC AND P.TIDO_COD = 33 INTO :CENTRO, :PROY;
    EXECUTE PROCEDURE FECHA_A_CONTA(:FECAUX) returning_values (:FECHA);
    /* REGISTRE EL ENCABEZADO CONTABLE */
    IDC = GEN_ID(ID_CONTABILIZA, 1);
    CONC = 'DEVOLUCION VENTAS No. ' || NUMERO || ' EN FACTURA ' || NUMFAC;
    CONC = SUBSTR(CONC, 1, 60);
    INSERT INTO CONTABILIZACION (CNTB_ID, CNTB_TIPOCOMP, CNTB_PREFCNT, CNTB_NUMERO, CNTB_FECHA, CNTB_CONCEPTO, CNTB_REF, CNTB_TIPOREF, CNTB_IDREF, CNTB_PREFREF, CNTB_NUMREF, CNTB_PROCESADO)
        VALUES (:IDC, :TIPOCOMP, :PREFCONT, :NUM, :FECHA, :CONC, '', 33, :IDDOC, :PREF, :NUM, 'N');
    NROI = 0;
    SUMA = 0;
    ERROR = 0;
    /* SI NO HAY CUENTA DE DESCUENTO NI ADICIONAL CALCULE UN FACTOR PARA LAS VENTAS Y EL IVA */
    if (MERCANCIA <> 0) then
        FACTOR = CAST(VRSUBT AS DOUBLE PRECISION) / CAST(MERCANCIA AS DOUBLE PRECISION);
    ELSE
        FACTOR = 1;
    /* TRAIGA EL NUMERO DE DIGITOS PARA EL REDONDEO */
    SELECT CAST(CONF_VALOR AS INTEGER) FROM CONFIGURACION WHERE CONF_MODULO = 'FACTURACION' AND
        CONF_CATEGORIA = 'GENERAL' AND CONF_PROPIEDAD = 'REDONDEO AL MULTIPLO DE DIEZ EN TOTALES' INTO :DIG;
    /* CUENTAS DE VENTAS */
    if (VENTAS = 'A') then
        BEGIN
        FOR SELECT MAX(COAR_CTADEV), SUM(cast(DVDE_CANT as double precision) * (DVDE_PRUNIT-DVDE_DTOMONTO)), SUM(DVDE_IVAMONTO), SUM(DVDE_CONSUMO)
            FROM ARTICULO A, CONTABIL_ARTICULO C, DEVOLUCIONES_VENTAS_DETALLE F
            WHERE F.DEVT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD
            GROUP BY COAR_CTADEV
            INTO :CTAVENTAS, :MONTO, :IMPTOS, :VRCONSUMO
            DO
            BEGIN
            if (IMPINC = 'S') then
                if (FOMENTO = 'SI') then
                    MONTO = MONTO - IMPTOS;
                ELSE
                    MONTO = MONTO - IMPTOS - VRCONSUMO;
            ELSE
            if (FOMENTO = 'SI') then
            MONTO = MONTO + VRCONSUMO;
            if ((CTADTO IS NULL) OR (CTADTO = '')) then
                MONTO = MONTO * FACTOR;
            execute procedure redondee(MONTO, DIG) returning_values (MONTO);
            if (MONTO <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTAVENTAS, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT F.ARTI_COD, (cast(DVDE_CANT as double precision) * (DVDE_PRUNIT-DVDE_DTOMONTO)), (DVDE_IVAMONTO+DVDE_CONSUMO)
                        FROM ARTICULO A, CONTABIL_ARTICULO C, DEVOLUCIONES_VENTAS_DETALLE F
                        WHERE F.DEVT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTAINV = :CUENTA
                        INTO :ART, :MONTO, :IMPTOS
                    DO
                        BEGIN
                        if (IMPINC = 'S') then
                            MONTO = MONTO - IMPTOS;
                        if ((CTADTO IS NULL) OR (CTADTO = '')) then
                            MONTO = MONTO * FACTOR;
                        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        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, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                    NROI = NROI + 1;
                    SUMA = SUMA + MONTO;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA + MONTO;
                    END
                END /* MONTO <> 0 */
            END /* FOR */
        END /* VENTAS X ARTICULO */
     IF ((VENTAS = 'C') OR (VENTAS = 'K')) THEN
        BEGIN
        IF (VENTAS = 'C') THEN
            CTAVENTAS = TCTAVENTA;
        SELECT SUM(cast(DVDE_CANT as double precision) * (DVDE_PRUNIT-DVDE_DTOMONTO)), SUM(DVDE_IVAMONTO), SUM(DVDE_CONSUMO)
            FROM DEVOLUCIONES_VENTAS_DETALLE F
            WHERE F.DEVT_ID = :IDDOC 
            INTO :MONTO, :IMPTOS, :VRCONSUMO;
        if (IMPINC = 'S') then
            if (FOMENTO = 'SI') then
               MONTO = MONTO - IMPTOS;
            ELSE
               MONTO = MONTO - IMPTOS - VRCONSUMO;
        ELSE
         if (FOMENTO = 'SI') then
          MONTO = MONTO + VRCONSUMO;
        if ((CTADTO IS NULL) OR (CTADTO = '')) then
            MONTO = MONTO * FACTOR;
        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
        if (MONTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTAVENTAS, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT F.ARTI_COD, (cast(DVDE_CANT as double precision) * (DVDE_PRUNIT-DVDE_DTOMONTO)), (DVDE_IVAMONTO+DVDE_CONSUMO)
                    FROM ARTICULO A, DEVOLUCIONES_VENTAS_DETALLE F
                    WHERE F.DEVT_ID = :IDDOC
                    INTO :ART, :MONTO, :IMPTOS
                    DO
                    BEGIN
                    if (IMPINC = 'S') then
                        MONTO = MONTO - IMPTOS;
                    if ((CTADTO IS NULL) OR (CTADTO = '')) then
                        MONTO = MONTO * FACTOR;
                    execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                    NROI = NROI + 1;
                    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, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                NROI = NROI + 1;
                SUMA = SUMA + MONTO;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA + MONTO;
                END
            END /* MONTO <> 0 */
        END /* VENTAS DE CLIENTE O CONSTANTE */
    /* EL IVA EN VENTAS */
    if (IVA = 'A') then
        BEGIN
        FOR SELECT MAX(COAR_CTAIVAV), SUM(DVDE_IVAMONTO), SUM(DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO), SUM(DVDE_CONSUMO)
            FROM ARTICULO A, CONTABIL_ARTICULO C, DEVOLUCIONES_VENTAS_DETALLE F
            WHERE F.DEVT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD
            GROUP BY COAR_CTAIVAV
            INTO :CTAIVA, :IMPTOS, :MONTO, :VALORADIC
        DO
            BEGIN
            if (FOMENTO = 'SI') then
                MONTO = MONTO + VALORADIC;
            MONTO = MONTO * -1;
            MONTO = MONTO * FACTOR;
            IMPTOS = IMPTOS * FACTOR;
            execute procedure redondee(MONTO, DIG) returning_values (MONTO);
            execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
            if (IMPTOS <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTAIVA, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT F.ARTI_COD, DVDE_IVAMONTO, (cast(DVDE_CANT as double precision) * (DVDE_PRUNIT-DVDE_DTOMONTO)), TAIV_PORC, DVDE_CONSUMO
                        FROM ARTICULO A, CONTABIL_ARTICULO C, DEVOLUCIONES_VENTAS_DETALLE F, TARIFA_IVA T
                        WHERE F.DEVT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND A.TAIV_COD = T.TAIV_COD AND COAR_CTAIVAV = :CUENTA
                        INTO :ART, :IMPTOS, :MONTO, :PORCIVA, :VALORADIC
                    DO
                        BEGIN
                        if (IMPINC = 'S') then
                            MONTO = MONTO - IMPTOS - VALORADIC;
                        MONTO = MONTO * -1;
                        MONTO = MONTO * FACTOR;
                        IMPTOS = IMPTOS * FACTOR;
                        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                        execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                        if (IMPTOS <> 0) then
                            BEGIN
                            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :IMPTOS, 0, :MONTO, :PORCIVA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                            NROI = NROI + 1;
                            SUMA = SUMA + IMPTOS;
                            END
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                    NROI = NROI + 1;
                    SUMA = SUMA + IMPTOS;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA + IMPTOS;
                    END
                END   /* IMPTOS <> 0 */
            END /* FOR */
        END /* IVA X ARTICULO */
    if (IVA = 'K') then /* IVA EN CTA CONSTANTE */
        BEGIN
        SELECT SUM(DVDE_IVAMONTO), SUM(DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO), SUM(DVDE_CONSUMO)
            FROM DEVOLUCIONES_VENTAS_DETALLE F
            WHERE F.DEVT_ID = :IDDOC 
            INTO :IMPTOS, :MONTO, :VALORADIC;
        if (FOMENTO = 'SI') then
            MONTO = MONTO + VALORADIC;
        MONTO = MONTO * -1;
        MONTO = MONTO * FACTOR;
        IMPTOS = IMPTOS * FACTOR;
        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
        execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
        if (IMPTOS <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTAIVA, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT F.ARTI_COD, (cast(DVDE_CANT as double precision) * (DVDE_PRUNIT-DVDE_DTOMONTO)), DVDE_IVAMONTO, TAIV_PORC, DVDE_CONSUMO
                    FROM ARTICULO A, DEVOLUCIONES_VENTAS_DETALLE F, TARIFA_IVA T
                    WHERE F.DEVT_ID = :IDDOC AND A.TAIV_COD = T.TAIV_COD
                    INTO :ART, :MONTO, :IMPTOS, :PORCIVA, :VALORADIC
                    DO
                    BEGIN
                    if (IMPINC = 'S') then
                        MONTO = MONTO - IMPTOS - VALORADIC;
                    MONTO = MONTO * -1;
                    MONTO = MONTO * FACTOR;
                    IMPTOS = IMPTOS * FACTOR;
                    execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                    execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                    if (IMPTOS <> 0) then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', :IMPTOS, 0, :MONTO, :PORCIVA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        SUMA = SUMA + IMPTOS;
                        END
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                NROI = NROI + 1;
                SUMA = SUMA + IMPTOS;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA + IMPTOS;
                END
            END /* IMPTOS <> 0 */
        END /* IVA EN CTA CONSTANTE */
    /* EL IMPOCONSUMO */
    if ((CONSUMO = 'A') AND (FOMENTO <> 'SI')) then
        BEGIN
        FOR SELECT MAX(COAR_CTACONS), SUM(DVDE_CONSUMO)
            FROM ARTICULO A, CONTABIL_ARTICULO C, DEVOLUCIONES_VENTAS_DETALLE F
            WHERE F.DEVT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD
            GROUP BY COAR_CTACONS
            INTO :CTACONSUMO, :IMPTOS
        DO
            BEGIN
            if (IMPTOS <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTACONSUMO, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, REGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT F.ARTI_COD, DVDE_CONSUMO
                        FROM ARTICULO A, CONTABIL_ARTICULO C, DEVOLUCIONES_VENTAS_DETALLE F
                        WHERE F.DEVT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTACONS = :CUENTA
                        INTO :ART, :IMPTOS
                    DO
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 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, :NROI, :CUENTA, :CONC, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                    NROI = NROI + 1;
                    SUMA = SUMA + IMPTOS;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA + IMPTOS;
                    END
                END /* IMPTOS <> 0 */
            END /* FOR */
        END /* CONSUMO X ARTICULO */
    if ((CONSUMO = 'K') AND (FOMENTO <> 'SI')) then
        BEGIN
        SELECT SUM(DVDE_CONSUMO)
            FROM DEVOLUCIONES_VENTAS_DETALLE F
            WHERE F.DEVT_ID = :IDDOC 
            INTO :IMPTOS;
        if (IMPTOS <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTACONSUMO, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT F.ARTI_COD, DVDE_CONSUMO
                    FROM ARTICULO A, DEVOLUCIONES_VENTAS_DETALLE F
                    WHERE F.DEVT_ID = :IDDOC 
                    INTO :ART, :IMPTOS
                    DO
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTACONSUMO, :CONC, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                    NROI = NROI + 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, :NROI, :CTACONSUMO, :CONC, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA + IMPTOS;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTACONSUMO, :CONC, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA + IMPTOS;
                END
            END /* IMPTOS <> 0 */
        END /* CONSUMO EN CTA CONSTANTE */
    /* DESCUENTO */
    if ((CTADTO IS NOT NULL) AND
        (CTADTO <> '') AND
        (VRDTO <> 0)) THEN
        BEGIN
        EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTADTO, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRDTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
            NROI = NROI + 1;
            SUMA = SUMA - VRDTO;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRDTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 33);
            NROI = NROI + 1;
            SUMA = SUMA - VRDTO;
            END
        END /* DESCUENTO */
    /* VALOR ADIC */
    if ((CTAADIC IS NOT NULL) AND
        (CTAADIC <> '') AND
        (VRADIC <> 0)) THEN
        BEGIN
        EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTAADIC, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRADIC, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
            NROI = NROI + 1;
            SUMA = SUMA + VRADIC;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRADIC, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 33);
            NROI = NROI + 1;
            SUMA = SUMA + VRADIC;
            END
        END /* VR. ADIC */
    /* VALOR EXTRA */
    if ((CTAEXTRA IS NOT NULL) AND
        (CTAEXTRA <> '') AND
        (VREXTRA <> 0)) THEN
        BEGIN
        EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTAEXTRA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VREXTRA, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
            NROI = NROI + 1;
            SUMA = SUMA + VREXTRA;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VREXTRA, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 33);
            NROI = NROI + 1;
            SUMA = SUMA + VREXTRA;
            END
        END /* VR. EXTRA */
    /* RETENCION FUENTE */
    if ((RTFTE = 'C') or (RTFTE = 'K')) then
      if (VRRTFTE <> 0) then
        BEGIN
        if (RTFTE = 'C') then
            CTARTFTE = TCTARTFTE;
        EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTARTFTE, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, (:VRSUBT*-1), :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
            NROI = NROI + 1;
            SUMA = SUMA - VRRTFTE;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, (:VRSUBT*-1), :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA - VRRTFTE;
            END
        /* AUTORETENCION */
        if (FAUTORET <= fecaux) then
            BEGIN
            EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'CUENTA DE AUTORETENCION EN LA FUENTE') returning_values (CTARTFTE);
            EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTARTFTE, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :VRSUBT, :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                NROI = NROI + 1;
                SUMA = SUMA + VRRTFTE;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :VRSUBT, :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA + VRRTFTE;
                END
            END
        END /* RTFTE */
    if (RTFTE = 'A') then
      BEGIN
      FOR SELECT MAX(COAR_CTARTFTEV), MAX(COAR_RTFTE), SUM(DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO), SUM((DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO)*COAR_RTFTE)
        FROM CONTABIL_ARTICULO C, devoluciones_ventas_detalle F
        WHERE F.devt_id = :IDDOC AND F.ARTI_COD = C.ARTI_COD
        GROUP BY COAR_CTARTFTEV
        INTO :CTARTFTE, :PRTFTE, :MONTO, :VRRTFTE
        DO
        BEGIN
        MONTO = MONTO * FACTOR;
        VRRTFTE = VRRTFTE * FACTOR / 100;
        execute procedure redondee(VRRTFTE, DIG) returning_values (VRRTFTE);
        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
        if (VRRTFTE <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTARTFTE, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, (:MONTO*-1), :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                NROI = NROI + 1;
                SUMA = SUMA - VRRTFTE;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, (:MONTO*-1), :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - VRRTFTE;
                END
            /* AUTORETENCION */
            if (FAUTORET <= fecaux) then
                BEGIN
                EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'CUENTA DE AUTORETENCION EN LA FUENTE') returning_values (CTARTFTE);
                EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTARTFTE, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :MONTO, :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                    NROI = NROI + 1;
                    SUMA = SUMA + VRRTFTE;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :MONTO, :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA + VRRTFTE;
                    END
                END
            END
        END /* RTFTE */
      END
    /* RETENCION IVA */
    if ((RTIVA = 'C') or (RTIVA = 'K')) then
      if (VRRTIVA <> 0) then
        BEGIN
        if (RTIVA = 'C') then
            CTARTIVA = TCTARTIVA;
        EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTARTIVA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTIVA, (:VRIVA*-1), :PORC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
            NROI = NROI + 1;
            SUMA = SUMA - VRRTIVA;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTIVA, (:VRIVA*-1), :PORC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA - VRRTIVA;
            END
        END /* RTIVA */
    /* RETENCION DE ICA */
    if ((RTICA = 'C') or (RTICA = 'K')) then
      if (VRRTICA <> 0) then
        BEGIN
        if (RTICA = 'C') then
            CTARTICA = TCTARTICA;
        EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTARTICA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTICA, (:VRSUBT*-1), :PRTICA, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
            NROI = NROI + 1;
            SUMA = SUMA - VRRTICA;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTICA, (:VRSUBT*-1), :PRTICA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA - VRRTICA;
            END
        END /* RTICA */
    if (RTICA = 'A') then
      BEGIN
      FOR SELECT MAX(COAR_CTARTICAV), MAX(COAR_RTICA), SUM(DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO), SUM((DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO)*COAR_RTICA)
        FROM CONTABIL_ARTICULO C, devoluciones_ventas_detalle F
        WHERE F.devt_id = :IDDOC AND F.ARTI_COD = C.ARTI_COD
        GROUP BY COAR_CTARTICAV
        INTO :CTARTICA, :PRTICA, :MONTO, :VRRTICA
        DO
        BEGIN
        MONTO = MONTO * FACTOR * -1;
        VRRTICA = VRRTICA * FACTOR / 100;
        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(33, :IDDOC, :CTARTICA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTICA, :MONTO, :PRTICA, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                NROI = NROI + 1;
                SUMA = SUMA - VRRTICA;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTICA, :MONTO, :PRTICA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - VRRTICA;
                END
            END
        END
      END
    /* CIERRE EL COMPROBANTE CONTRA LA CUENTA DEL TERCERO O LA CONSTANTE */
    if ((SUMA <> 0) and ((CARTERA = 'C') or (CARTERA = 'K') or (CARTERA = 'J'))) then
        BEGIN
        if (SUMA < 0) then
            BEGIN
            DEBITO = SUMA * -1;
            CREDITO = 0;
            END
        ELSE
            BEGIN
            DEBITO = 0;
            CREDITO = SUMA;
            END
        if (CARTERA = 'C') then
            CTACARTERA = TCTACLIEN;
        if (CARTERA = 'J') then
            BEGIN
            /* BUSQUE LA CUENTA DE LA CAJA */
            SELECT CAJA_CUENTA FROM CAJAS C, PUNTO_VENTA P
                WHERE P.CAJA_ID = C.CAJA_ID AND PTVT_ID = :PTOVTA
                INTO :CTACARTERA;
            END
        EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTACARTERA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :DEBITO, :CREDITO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
        if (TIPOCUEN = 'N') then
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :DEBITO, :CREDITO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
        NROI = NROI + 1;
        END /* SUMA EN CARTERA */
    /* CALCULE COSTOS EN VENTAS */
    EXECUTE PROCEDURE COSTO_EN_VENTAS(33, :IDDOC);
    if (COSTOS = 'A') then
        BEGIN
        FOR SELECT MAX(CTACOS), SUM(cast(CANT as double precision) * COSTO)
            FROM COSTO_VENTAS
            GROUP BY CTACOS
            INTO :CTACOSTOS, :MONTO
        DO
            BEGIN
            if (MONTO <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTACOSTOS, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT ARTI_COD, cast(CANT as double precision) * COSTO
                        FROM COSTO_VENTAS
                        WHERE CTACOS = :CUENTA
                        INTO :ART, :MONTO
                    DO
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                    NROI = NROI + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    END
                END /* MONTO <> 0 */
            END /* FOR */
        END /* COSTOS */
    if (COSTOS = 'K') then
        BEGIN
        SELECT SUM(cast(CANT as double precision) * COSTO)
            FROM COSTO_VENTAS
            INTO :MONTO;
        if (MONTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTACOSTOS, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, REGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT ARTI_COD, cast(CANT as double precision) * COSTO
                    FROM COSTO_VENTAS
                    INTO :ART, :MONTO
                DO
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTACOSTOS, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                    NROI = NROI + 1;
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTACOSTOS, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                NROI = NROI + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTACOSTOS, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                END
            END /* MONTO <> 0 */
        END /* COSTOS = K */
    if (INVEN = 'A') then
        BEGIN
        FOR SELECT MAX(CTAINV), SUM(cast(CANT as double precision) * COSTO)
            FROM COSTO_VENTAS
            GROUP BY CTAINV
            INTO :CTAINVEN, :MONTO
        DO
            BEGIN
            if (MONTO <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTAINVEN, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, REGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT ARTI_COD, cast(CANT as double precision) * COSTO
                        FROM COSTO_VENTAS
                        WHERE CTAINV = :CUENTA
                        INTO :ART, :MONTO
                    DO
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                    NROI = NROI + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    END
                END /* MONTO <> 0 */
            END /* FOR */
        END /* INVEN = A */
    if (INVEN = 'K') then
        BEGIN
        SELECT SUM(cast(CANT as double precision) * COSTO)
            FROM COSTO_VENTAS
            INTO :MONTO;
        if (MONTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTAINVEN, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT ARTI_COD, cast(CANT as double precision) * COSTO
                    FROM COSTO_VENTAS
                    INTO :ART, :MONTO
                DO
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTAINVEN, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                    NROI = NROI + 1;
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAINVEN, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                NROI = NROI + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAINVEN, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                END
            END /* MONTO <> 0 */
        END /* INVEN = K */
    /* recorra las cuentas adicionales */
    FOR SELECT INVC_CUENTA, INVC_BASE, INVC_PORC, INVC_VALOR, INVC_DB
        FROM INTERFAZ_VENTAS_CTAS WHERE INVE_ID = :IDINTER
        INTO :CTADIC, :BASEADIC, :PORCADIC, :VALORADIC, :DBADIC
        DO
        BEGIN
        if (valoradic <> 0) then
            monto = valoradic;
        else
            BEGIN
            if (:BASEADIC = 'SUBTOTAL') then
                VALORADIC = vrsubt;
            if (:BASEADIC = 'DESCUENTO') then
                VALORADIC = VRDTO;
            if (:BASEADIC = 'IVA') then
                VALORADIC = VRIVA;
            if (:BASEADIC = 'ADICIONAL') then
                VALORADIC = VRADIC;
            if (:BASEADIC = 'EXTRA') then
                VALORADIC = VREXTRA;
            if (:BASEADIC = 'TOTAL') then
                VALORADIC = VRTOTAL;
            MONTO = VALORADIC * PORCADIC;
            END
        if (MONTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTADIC, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                if (DBADIC = 'S') then
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                ELSE
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                NROI = NROI + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                if (DBADIC = 'S') then
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                ELSE
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                END
            NROI = NROI + 1;
            END
        END
    if (error > 0) then
        ver = 'S';
    SUSPEND;
    END
   END /* EXISTE LA INTERFAZ */
  ELSE
    BEGIN
    EXECUTE PROCEDURE ERROR (33, :IDDOC, :PREF, 1);
    ERROR = ERROR + 1;
    VER = 'S';
    SUSPEND;
    END
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE DEVOLUCIONES_SIN_CONTABILIDAD(
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    ID INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    ESTADO VARCHAR(20),
    IDI INTEGER,
    IDC INTEGER)
AS
DECLARE VARIABLE VER CHAR(2);
declare variable FECICNT VARCHAR(10);
declare variable FECFCNT VARCHAR(10);
declare variable ERROR INTEGER;
declare variable idref INTEGER;
BEGIN /*$$IBE$$ 
EXECUTE PROCEDURE fecha_a_conta(FECINI) returning_values (FECICNT);
EXECUTE PROCEDURE fecha_a_conta(FECFIN) returning_values (FECFCNT);
FOR SELECT DEVT_ID, PREF_PRE, DEVT_NUMERO FROM devoluciones_ventas WHERE DEVT_ANULADO = 'N' AND
    DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN
    INTO :ID, :PREF, :NUMERO
DO
  BEGIN
  idref = null;
  SELECT ENCO_IDREF FROM COMPROBANTE_ENCABEZADO WHERE ENCO_TIPOREF = 33 AND ENCO_FECHA >= :FECICNT AND ENCO_FECHA <= :FECFCNT and ENCO_IDREF = :id into :idref;
  if (idref IS NULL) then
  begin
   ESTADO = 'PROCESANDO';
   SUSPEND;
   SELECT MAX(INVE_ID) FROM INTERFAZ_VENTAS WHERE PREF_PRE = :PREF AND TIDO_COD = 33 INTO :IDI;
   EXECUTE PROCEDURE contabil_devolcli (:ID, :IDI) RETURNING_VALUES (:ERROR, :VER, :IDC);
   if (ERROR = 0) then
    BEGIN
    EXECUTE PROCEDURE CONTABILIZA_PENDIENTE (:IDC);
    ESTADO = 'OK';
    END
   ELSE
    ESTADO = 'ERROR';
   suspend;
  End
  END
 $$IBE$$*/ SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE DEVOLUCIONES_SIN_CONTABILIDAD(
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    ID INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    ESTADO VARCHAR(20),
    IDI INTEGER,
    IDC INTEGER)
AS
DECLARE VARIABLE VER CHAR(2);
declare variable FECICNT VARCHAR(10);
declare variable FECFCNT VARCHAR(10);
declare variable ERROR INTEGER;
declare variable idref INTEGER;
BEGIN
EXECUTE PROCEDURE fecha_a_conta(FECINI) returning_values (FECICNT);
EXECUTE PROCEDURE fecha_a_conta(FECFIN) returning_values (FECFCNT);
FOR SELECT DEVT_ID, PREF_PRE, DEVT_NUMERO FROM devoluciones_ventas WHERE DEVT_ANULADO = 'N' AND
    DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN
    INTO :ID, :PREF, :NUMERO
DO
  BEGIN
  idref = null;
  SELECT ENCO_IDREF FROM COMPROBANTE_ENCABEZADO WHERE ENCO_TIPOREF = 33 AND ENCO_FECHA >= :FECICNT AND ENCO_FECHA <= :FECFCNT and ENCO_IDREF = :id into :idref;
  if (idref IS NULL) then
  begin
   ESTADO = 'PROCESANDO';
   SUSPEND;
   SELECT MAX(INVE_ID) FROM INTERFAZ_VENTAS WHERE PREF_PRE = :PREF AND TIDO_COD = 33 INTO :IDI;
   EXECUTE PROCEDURE contabil_devolcli (:ID, :IDI) RETURNING_VALUES (:ERROR, :VER, :IDC);
   if (ERROR = 0) then
    BEGIN
    EXECUTE PROCEDURE CONTABILIZA_PENDIENTE (:IDC);
    ESTADO = 'OK';
    END
   ELSE
    ESTADO = 'ERROR';
   suspend;
  End
  END
END

^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER PROCEDURE CONTABIL_FACTCOMP(
    IDDOC INTEGER,
    IDINTER INTEGER)
RETURNS (
    ERROR INTEGER,
    VER CHAR(1),
    IDC INTEGER)
AS
DECLARE VARIABLE PREFIJO VARCHAR(4);
DECLARE VARIABLE NUM VARCHAR(6);
DECLARE VARIABLE NUMERO VARCHAR(10);
DECLARE VARIABLE FECAUX DATE;
DECLARE VARIABLE FECHA CHAR(8);
DECLARE VARIABLE CONCEPTO CHAR(60);
DECLARE VARIABLE VENCEAUX DATE;
DECLARE VARIABLE VENCE CHAR(8);
DECLARE VARIABLE VRDTO NUMERIC(18,2);
DECLARE VARIABLE VRADIC NUMERIC(18,2);
DECLARE VARIABLE VRSUBT NUMERIC(18,2);
DECLARE VARIABLE VRIVA NUMERIC(18,2);
DECLARE VARIABLE PRTFTE NUMERIC(9,2);
DECLARE VARIABLE VRRTFTE NUMERIC(18,2);
DECLARE VARIABLE VRRTIVA NUMERIC(18,2);
DECLARE VARIABLE PRTICA NUMERIC(9,2);
DECLARE VARIABLE VRRTICA NUMERIC(18,2);
DECLARE VARIABLE VRTOTAL NUMERIC(18,2);
DECLARE VARIABLE VREXTRA NUMERIC(18,2);
DECLARE VARIABLE TIPOCOMP VARCHAR(3);
DECLARE VARIABLE PREFCONT VARCHAR(4);
DECLARE VARIABLE INVEN CHAR(1);
DECLARE VARIABLE CTAINVEN VARCHAR(20);
DECLARE VARIABLE IVA CHAR(1);
DECLARE VARIABLE CTAIVA VARCHAR(20);
DECLARE VARIABLE CONSUMO CHAR(1);
DECLARE VARIABLE CTACONSUMO VARCHAR(20);
DECLARE VARIABLE CXP CHAR(1);
DECLARE VARIABLE CTACXP VARCHAR(20);
DECLARE VARIABLE RTFTE CHAR(1);
DECLARE VARIABLE CTARTFTE VARCHAR(20);
DECLARE VARIABLE RTIVA CHAR(1);
DECLARE VARIABLE CTARTIVA VARCHAR(20);
DECLARE VARIABLE RTICA CHAR(1);
DECLARE VARIABLE CTARTICA VARCHAR(20);
DECLARE VARIABLE CTADTO VARCHAR(20);
DECLARE VARIABLE CTAADIC VARCHAR(20);
DECLARE VARIABLE CTAEXTRA VARCHAR(20);
DECLARE VARIABLE EXISTE CHAR(1);
DECLARE VARIABLE CUENTA VARCHAR(20);
DECLARE VARIABLE MONTO NUMERIC(18,2);
DECLARE VARIABLE TIPOCUEN CHAR(1);
DECLARE VARIABLE NIT VARCHAR(20);
DECLARE VARIABLE NOMBRE VARCHAR(60);
DECLARE VARIABLE PROY VARCHAR(4);
DECLARE VARIABLE CENTRO VARCHAR(4);
DECLARE VARIABLE PROYDET VARCHAR(4);
DECLARE VARIABLE CENTRODET VARCHAR(4);
DECLARE VARIABLE PORC NUMERIC(5,2);
DECLARE VARIABLE NUMITEMS INTEGER;
DECLARE VARIABLE ARTICULO VARCHAR(15);
DECLARE VARIABLE IMPINC CHAR(1);
DECLARE VARIABLE IMPTOS NUMERIC(18,2);
DECLARE VARIABLE SUMA NUMERIC(18,2);
DECLARE VARIABLE PORCIVA NUMERIC(9,2);
DECLARE VARIABLE TCTAPROV VARCHAR(20);
DECLARE VARIABLE TCTARTFTE VARCHAR(20);
DECLARE VARIABLE TCTARTIVA VARCHAR(20);
DECLARE VARIABLE TCTARTICA VARCHAR(20);
DECLARE VARIABLE CUENTAADIC VARCHAR(20);
DECLARE VARIABLE BASEADIC VARCHAR(20);
DECLARE VARIABLE PORCADIC NUMERIC(5,2);
DECLARE VARIABLE VALORADIC NUMERIC(18,2);
DECLARE VARIABLE DBADIC CHAR(1);
DECLARE VARIABLE FOMENTO CHAR(2);
DECLARE VARIABLE BODE_DET CHAR(2);
DECLARE VARIABLE NUMPROV VARCHAR(10);
DECLARE VARIABLE MERCANCIA NUMERIC(18,2);
declare variable FACTOR DOUBLE PRECISION;
DECLARE VARIABLE MENORV CHAR(2);
declare variable DIG INTEGER;
declare variable NETO NUMERIC(18,2);
declare variable CENT CHAR(1);
declare variable ANULADO CHAR(1);
declare variable ERRORC INTEGER;
BEGIN
  /* INTERFACE */
  EXISTE = 'N';
  SELECT 'S', TICO_COD, PRCO_PRE, INCO_INVEN, INCO_IVA, INCO_CONSUMO, INCO_CXP, INCO_RTFTE, INCO_RTIVA, INCO_RTICA, INCO_CTAINVEN, INCO_CTAIVA, INCO_CTACONSUMO, INCO_CTADTO, INCO_CTAADIC, INCO_CTAEXTRA, INCO_CTACXP, INCO_CTARTFTE, INCO_CTARTIVA, INCO_CTARTICA, INCO_CONFIRMAR, INCO_CENTRO
    FROM INTERFAZ_COMPRAS WHERE INCO_ID = :IDINTER INTO :EXISTE, :TIPOCOMP, :PREFCONT, :INVEN, :IVA, :CONSUMO, :CXP, :RTFTE, :RTIVA, :RTICA, :CTAINVEN, :CTAIVA, :CTACONSUMO, :CTADTO, :CTAADIC, :CTAEXTRA, :CTACXP, :CTARTFTE, :CTARTIVA, :CTARTICA, :VER, :CENT;
  if (EXISTE = 'S') then
    BEGIN
    /* BORRE CONTABILIZACION PREVIA */
    DELETE FROM CONTABILIZACION WHERE CNTB_TIPOREF = 21 AND CNTB_IDREF = :IDDOC;
    /* ENCABEZADO DE LA FACTURA */
    SELECT PREF_PRE, FACO_NUMERO, FACO_FECHA, F.TERC_NIT, FACO_IMPTOS, FACO_VENCE, FACO_DTOMONTO, FACO_ADICIONAL, FACO_IVAMONTO, FACO_EXTRA, FACO_TOTAL, FACO_RTFTEPORC, FACO_RTFTEMONTO, FACO_RTIVAPOR, FACO_RTIVAMONTO, FACO_RTICAPOR, FACO_RTICAMONTO, TERC_NOM, PROV_CTARTFTE, PROV_CTARTIVA, PROV_CTARTICA, PROV_CTAPAGAR, FACO_NUMPROV, FACO_ANULADO
        FROM FACTURAS_COMPRA F, TERCEROS T, PROVEEDORES P WHERE FACO_ID = :IDDOC AND F.TERC_NIT = T.TERC_NIT AND T.TERC_NIT = P.TERC_NIT
        INTO :PREFIJO, :NUM, :FECAUX, :NIT, :IMPINC, :VENCEAUX, :VRDTO, :VRADIC, :VRIVA, :VREXTRA, :VRTOTAL, :PRTFTE, :VRRTFTE, :PORC, :VRRTIVA, :PRTICA, :VRRTICA, :NOMBRE, TCTARTFTE, TCTARTIVA, TCTARTICA, TCTAPROV, :NUMPROV, :ANULADO;
    /* CENTRO DE LA BODEGA */
    IF (CENT = 'B') THEN
        SELECT BODE_CENTRO, BODE_PROY FROM BODEGA B, FACTURAS_COMPRA F WHERE B.BODE_COD = F.BODE_COD AND F.FACO_ID = :IDDOC INTO :CENTRO, :PROY;
    ELSE
        SELECT PREF_CENTRO,PREF_PROY  FROM PREFIJOS P, FACTURAS_COMPRA F WHERE P.PREF_PRE = F.PREF_PRE AND F.FACO_ID = :IDDOC AND P.TIDO_COD = 21 INTO :CENTRO, :PROY;
    if (ANULADO = 'N') then
        BEGIN
        NUMERO = PREFIJO || NUM;
        VRSUBT = VRTOTAL - VREXTRA - VRIVA;
        MERCANCIA = VRSUBT - VRADIC + VRDTO;
        EXECUTE PROCEDURE FECHA_A_CONTA(:FECAUX) returning_values (:FECHA);
        EXECUTE PROCEDURE FECHA_A_CONTA(:VENCEAUX) returning_values (:VENCE);
        if (NUMPROV IS NULL) then
            NUMPROV = NUMERO;
        CONCEPTO = 'FC No.' || NUMERO || '-' || SUBSTR(NOMBRE,1,26) || '-NPROV.' || NUMPROV;
        IDC = GEN_ID(ID_CONTABILIZA, 1);
        INSERT INTO CONTABILIZACION (CNTB_ID, CNTB_TIPOCOMP, CNTB_PREFCNT, CNTB_NUMERO, CNTB_FECHA, CNTB_CONCEPTO, CNTB_REF, CNTB_TIPOREF, CNTB_IDREF, CNTB_PREFREF, CNTB_NUMREF, CNTB_PROCESADO)
            VALUES (:IDC, :TIPOCOMP, :PREFCONT, :NUM, :FECHA, :CONCEPTO, '', 21, :IDDOC, :PREFIJO, :NUM, 'N');
        NUMITEMS = 0;
        SUMA = 0;
        NETO = 0;
        ERROR = 0;
        EXECUTE PROCEDURE LEE_CONFIGURACION('COMPRAS', 'FACTURAS', 'USAR IMPOCONSUMO COMO PORCENTAJE DE FOMENTO') RETURNING_VALUES (FOMENTO);
        EXECUTE PROCEDURE lee_configuracion('COMPRAS','FACTURAS','DESCUENTO Y VALOR ADICIONAL DEL DOCUMENTO COMO MENOR VALOR DEL COSTO') returning_values (:MENORV);
        SELECT SUM(FCDE_consumo) from facturas_compras_detalle where faco_id = :IDDOC into :valoradic;
        if (MENORV = 'SI') then
            if (MERCANCIA <> 0) then
                FACTOR = (CAST(VRSUBT AS DOUBLE PRECISION) - VALORADIC) / (CAST(MERCANCIA AS DOUBLE PRECISION) - VALORADIC);
            ELSE
                FACTOR = 1;
        ELSE
           FACTOR = 1;
        SELECT CAST(CONF_VALOR AS INTEGER) FROM CONFIGURACION WHERE CONF_MODULO = 'COMPRAS' AND CONF_CATEGORIA = 'GENERAL' AND CONF_PROPIEDAD = 'REDONDEO AL MULTIPLO DE DIEZ EN TOTALES' INTO :DIG;
        if (INVEN = 'A') then
            BEGIN
            FOR SELECT MAX(COAR_CTAINV), SUM(CAST(FCDE_CANT AS DOUBLE PRECISION) * (FCDE_PRUNIT-FCDE_DTOMONTO)), SUM(FCDE_IVAMONTO), SUM(FCDE_CONSUMO), MAX(F.BODE_COD)
                FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_COMPRAS_DETALLE F WHERE F.FACO_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD
                GROUP BY COAR_CTAINV, F.BODE_COD INTO :CTAINVEN, :MONTO, :IMPTOS, :VALORADIC, :BODE_DET DO
                BEGIN
                IF (CENT = 'B') THEN
                  SELECT BODE_CENTRO, BODE_PROY FROM BODEGA WHERE BODE_COD = :BODE_DET INTO :CENTRODET, :PROYDET;
                if (IMPINC = 'S') then
                    BEGIN
                    MONTO = MONTO - IMPTOS;
                    if (FOMENTO <> 'SI' ) then
                        MONTO = MONTO - VALORADIC;
                    END
                MONTO = MONTO * FACTOR;
                execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                EXECUTE PROCEDURE CUENTA_INTERFAZ(21, :IDDOC, :CTAINVEN, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    FOR SELECT F.ARTI_COD, (FCDE_CANT * (FCDE_PRUNIT-FCDE_DTOMONTO)), FCDE_IVAMONTO, FCDE_CONSUMO
                        FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_COMPRAS_DETALLE F WHERE F.FACO_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTAINV = :CUENTA
                        INTO :ARTICULO, :MONTO, :IMPTOS, :VALORADIC DO
                        BEGIN
                        if (IMPINC = 'S') then
                            BEGIN
                            MONTO = MONTO - IMPTOS;
                            if (FOMENTO <> 'SI' ) then
                                MONTO = MONTO - VALORADIC;
                            END
                        MONTO = MONTO * FACTOR;
                        execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                        IF (CENT = 'B') THEN
                           INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                               VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROYDET, :CENTRODET, NULL, NULL, NULL, :ARTICULO, 0, 0);
                        ELSE
                           INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                               VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                        NUMITEMS = NUMITEMS + 1;
                        NETO = NETO + MONTO;
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    IF (CENT = 'B') THEN
                       INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                           VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROYDET, :CENTRODET, :NUMERO, NULL, :VENCE, NULL, 0, 21);
                    ELSE
                       INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                           VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 21);
                    NUMITEMS = NUMITEMS + 1;
                    NETO = NETO + MONTO;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    IF (CENT = 'B') THEN
                       INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                           VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROYDET, :CENTRODET, NULL, NULL, NULL, NULL, 0, 0);
                    ELSE
                       INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                           VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NUMITEMS = NUMITEMS + 1;
                    NETO = NETO + MONTO;
                    END
                END
            END
        if (INVEN = 'K') then
            BEGIN
            FOR SELECT SUM(CAST(FCDE_CANT AS DOUBLE PRECISION) * (FCDE_PRUNIT-FCDE_DTOMONTO)), SUM(FCDE_IVAMONTO), SUM(FCDE_CONSUMO), MAX(BODE_COD)
                FROM FACTURAS_COMPRAS_DETALLE WHERE FACO_ID = :IDDOC GROUP BY BODE_COD INTO :MONTO, :IMPTOS, :VALORADIC, :BODE_DET Do
                BEGIN
                  IF (CENT = 'B') THEN
                    SELECT BODE_CENTRO, BODE_PROY FROM BODEGA WHERE BODE_COD = :BODE_DET INTO :CENTRODET, :PROYDET;
                  if (IMPINC = 'S') then
                   BEGIN
                    MONTO = MONTO - IMPTOS;
                    if (FOMENTO <> 'SI' ) then
                      MONTO = MONTO - VALORADIC;
                   END
                  MONTO = MONTO * FACTOR;
                  execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                  execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                  EXECUTE PROCEDURE CUENTA_INTERFAZ(21, :IDDOC, :CTAINVEN, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                  if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                  if (TIPOCUEN = 'I') then
                   BEGIN
                    FOR SELECT ARTI_COD, (FCDE_CANT * (FCDE_PRUNIT-FCDE_DTOMONTO)), FCDE_IVAMONTO, FCDE_CONSUMO
                      FROM FACTURAS_COMPRAS_DETALLE WHERE FACO_ID = :IDDOC INTO :ARTICULO, :MONTO, :IMPTOS, :VALORADIC DO
                       BEGIN
                       if (IMPINC = 'S') then
                        BEGIN
                         MONTO = MONTO - IMPTOS;
                         if (FOMENTO <> 'SI' ) then
                            MONTO = MONTO - VALORADIC;
                        END
                       MONTO = MONTO * FACTOR;
                       execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                       execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                       IF (CENT = 'B') THEN
                          INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                             VALUES (:IDC, :NUMITEMS, :CTAINVEN, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROYDET, :CENTRODET, NULL, NULL, NULL, :ARTICULO, 0, 0);
                       ELSE
                          INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                             VALUES (:IDC, :NUMITEMS, :CTAINVEN, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                       NUMITEMS = NUMITEMS + 1;
                       NETO = NETO + MONTO;
                       END
                   END
                  if (TIPOCUEN = 'C') then
                   BEGIN
                    IF (CENT = 'B') THEN
                       INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                         VALUES (:IDC, :NUMITEMS, :CTAINVEN, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROYDET, :CENTRODET, :NUMERO, NULL, :VENCE, NULL, 0, 21);
                    ELSE
                       INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                         VALUES (:IDC, :NUMITEMS, :CTAINVEN, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 21);
                    NUMITEMS = NUMITEMS + 1;
                    NETO = NETO + MONTO;
                   END
                  if (TIPOCUEN = 'N') then
                   BEGIN
                    IF (CENT = 'B') THEN
                       INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                          VALUES (:IDC, :NUMITEMS, :CTAINVEN, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROYDET, :CENTRODET, NULL, NULL, NULL, NULL, 0, 0);
                    ELSE
                       INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                          VALUES (:IDC, :NUMITEMS, :CTAINVEN, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NUMITEMS = NUMITEMS + 1;
                    NETO = NETO + MONTO;
                   END
                END
            END
        /* EL IVA */
        if (IVA = 'A') then
            BEGIN
            FOR SELECT MAX(COAR_CTAIVAC), SUM(FCDE_IVAMONTO), SUM(CAST(FCDE_CANT AS DOUBLE PRECISION) * (FCDE_PRUNIT-FCDE_DTOMONTO)), SUM(FCDE_CONSUMO)
                FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_COMPRAS_DETALLE F WHERE F.FACO_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD GROUP BY COAR_CTAIVAC
                INTO :CTAIVA, :IMPTOS, :MONTO, :VALORADIC DO
              if (IMPTOS <> 0) then
                BEGIN
                IMPTOS = CAST(IMPTOS AS DOUBLE PRECISION) * VRSUBT / MERCANCIA;
                if (IMPINC = 'S') then
                    BEGIN
                    MONTO = MONTO - IMPTOS;
                    if (FOMENTO <> 'SI' ) then
                        MONTO = MONTO - VALORADIC;
                    END
                MONTO = CAST(MONTO AS DOUBLE PRECISION) * VRSUBT / MERCANCIA;
                execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                EXECUTE PROCEDURE CUENTA_INTERFAZ(21, :IDDOC, :CTAIVA, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    FOR SELECT F.ARTI_COD, FCDE_IVAMONTO, (FCDE_CANT * (FCDE_PRUNIT-FCDE_DTOMONTO)), TAIV_PORC, FCDE_CONSUMO
                        FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_COMPRAS_DETALLE F, TARIFA_IVA T WHERE F.FACO_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTAIVAV = :CUENTA AND A.TAIV_COD = T.TAIV_COD
                        INTO :ARTICULO, :IMPTOS, :MONTO, :PORCIVA, :VALORADIC
                    DO
                        BEGIN
                        IMPTOS = CAST(IMPTOS AS DOUBLE PRECISION) * VRSUBT / MERCANCIA;
                        if (IMPINC = 'S') then
                            BEGIN
                            MONTO = MONTO - IMPTOS;
                            if (FOMENTO <> 'SI' ) then
                                MONTO = MONTO - VALORADIC;
                            END
                        MONTO = CAST(MONTO AS DOUBLE PRECISION) * VRSUBT / MERCANCIA;
                        execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :IMPTOS, 0, :MONTO, :PORCIVA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                        NUMITEMS = NUMITEMS + 1;
                        NETO = NETO + IMPTOS;
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :IMPTOS, 0, :MONTO, :IMPTOS*100/:MONTO, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 21);
                    NUMITEMS = NUMITEMS + 1;
                    NETO = NETO + IMPTOS;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :IMPTOS, 0, :MONTO, CAST(:IMPTOS AS DOUBLE PRECISION)*100/CAST(:MONTO AS DOUBLE PRECISION), :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NUMITEMS = NUMITEMS + 1;
                    NETO = NETO + IMPTOS;
                    END
                END
            END
        if (IVA = 'K') then /* IVA EN CTA CONSTANTE */
            BEGIN
            SELECT SUM(FCDE_IVAMONTO), SUM(CAST(FCDE_CANT AS DOUBLE PRECISION) * (FCDE_PRUNIT-FCDE_DTOMONTO)), SUM(FCDE_CONSUMO)
                FROM FACTURAS_COMPRAS_DETALLE F WHERE F.FACO_ID = :IDDOC INTO :IMPTOS, :MONTO, :VALORADIC;
            if (IMPTOS <> 0) then
                BEGIN
                IMPTOS = CAST(IMPTOS AS DOUBLE PRECISION) * VRSUBT / MERCANCIA;
                if (IMPINC = 'S') then
                    BEGIN
                    MONTO = MONTO - IMPTOS;
                    if (FOMENTO <> 'SI' ) then
                        MONTO = MONTO - VALORADIC;
                    END
                MONTO = CAST(MONTO AS DOUBLE PRECISION) * VRSUBT / MERCANCIA;
                execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                EXECUTE PROCEDURE CUENTA_INTERFAZ(21, :IDDOC, :CTAIVA, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    FOR SELECT F.ARTI_COD, (FCDE_CANT * (FCDE_PRUNIT-FCDE_DTOMONTO)), FCDE_IVAMONTO, TAIV_PORC, FCDE_CONSUMO
                        FROM ARTICULO A, FACTURAS_COMPRAS_DETALLE F, TARIFA_IVA T WHERE F.FACO_ID = :IDDOC AND A.TAIV_COD = T.TAIV_COD
                        INTO :ARTICULO, :MONTO, :IMPTOS, :PORCIVA, :VALORADIC DO
                        BEGIN
                        IMPTOS = CAST(IMPTOS AS DOUBLE PRECISION) * VRSUBT / MERCANCIA;
                        if (IMPINC = 'S') then
                            BEGIN
                            MONTO = MONTO - IMPTOS;
                            if (FOMENTO <> 'SI' ) then
                                MONTO = MONTO - VALORADIC;
                            END
                        MONTO = CAST(MONTO AS DOUBLE PRECISION) * VRSUBT / MERCANCIA;
                        execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                        if (IMPTOS <> 0) then
                            BEGIN
                            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                VALUES (:IDC, :NUMITEMS, :CTAIVA, :CONCEPTO, '', :IMPTOS, 0, :MONTO, :PORCIVA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                            NUMITEMS = NUMITEMS + 1;
                            NETO = NETO + IMPTOS;
                            END
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NUMITEMS, :CTAIVA, :CONCEPTO, '', :IMPTOS, 0, :MONTO, :IMPTOS*100/:MONTO, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 21);
                    NUMITEMS = NUMITEMS + 1;
                    NETO = NETO + IMPTOS;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NUMITEMS, :CTAIVA, :CONCEPTO, '', :IMPTOS, 0, :MONTO, :IMPTOS*100/:MONTO, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NUMITEMS = NUMITEMS + 1;
                    NETO = NETO + IMPTOS;
                    END
                END
            END
        /* EL IMPOCONSUMO */
        if (CONSUMO = 'A') then
            BEGIN
            FOR SELECT MAX(COAR_CTACONS), SUM(FCDE_CONSUMO) FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_COMPRAS_DETALLE F
                WHERE F.FACO_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD GROUP BY COAR_CTACONS INTO :CTACONSUMO, :IMPTOS
            DO
              if (IMPTOS <> 0) then
                BEGIN
                execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                EXECUTE PROCEDURE CUENTA_INTERFAZ(21, :IDDOC, :CTACONSUMO, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (FOMENTO <> 'SI') then
                    BEGIN
                    if (TIPOCUEN = 'I') then
                        BEGIN
                        FOR SELECT F.ARTI_COD, FCDE_CONSUMO FROM ARTICULO A, FACTURAS_COMPRAS_DETALLE F WHERE F.FACO_ID = :IDDOC INTO :ARTICULO, :IMPTOS
                            DO
                            BEGIN
                            if (IMPTOS <> 0) then
                                BEGIN
                                execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                    VALUES (:IDC, :NUMITEMS, :CTACONSUMO, :CONCEPTO, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                                NUMITEMS = NUMITEMS + 1;
                                NETO = NETO + IMPTOS;
                                END
                            END
                        END
                    if (TIPOCUEN = 'C') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CTACONSUMO, :CONCEPTO, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                        NUMITEMS = NUMITEMS + 1;
                        NETO = NETO + IMPTOS;
                        END
                    if (TIPOCUEN = 'N') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CTACONSUMO, :CONCEPTO, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NUMITEMS = NUMITEMS + 1;
                        NETO = NETO + IMPTOS;
                        END
                    END
                ELSE
                    BEGIN
                    if (TIPOCUEN = 'I') then
                        BEGIN
                        FOR SELECT F.ARTI_COD, FCDE_CONSUMO FROM ARTICULO A, FACTURAS_COMPRAS_DETALLE F WHERE F.FACO_ID = :IDDOC INTO :ARTICULO, :IMPTOS
                            DO
                            BEGIN
                            if (IMPTOS <> 0) then
                                BEGIN
                                execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                    VALUES (:IDC, :NUMITEMS, :CTACONSUMO, :CONCEPTO, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                                NUMITEMS = NUMITEMS + 1;
                                NETO = NETO - IMPTOS;
                                END
                            END
                        END
                    if (TIPOCUEN = 'C') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CTACONSUMO, :CONCEPTO, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                        NUMITEMS = NUMITEMS + 1;
                        NETO = NETO - IMPTOS;
                        END
                    if (TIPOCUEN = 'N') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CTACONSUMO, :CONCEPTO, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NUMITEMS = NUMITEMS + 1;
                        NETO = NETO - IMPTOS;
                        END
                    END
                END
            END
        if (CONSUMO = 'K') then /* CONSUMO EN CTA CONSTANTE */
            BEGIN
            SELECT SUM(FCDE_CONSUMO) FROM FACTURAS_COMPRAS_DETALLE F WHERE F.FACO_ID = :IDDOC INTO :IMPTOS;
            if (IMPTOS <> 0) then
              BEGIN
              execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
              /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
              EXECUTE PROCEDURE CUENTA_INTERFAZ(21, :IDDOC, :CTACONSUMO, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
              if (ERRORC <> 0) then
                ERROR = ERROR + 1;
              if (FOMENTO <> 'SI') then
                BEGIN
                /* DEPENDE DEL TIPO DE CUENTA */
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT F.ARTI_COD, FCDE_CONSUMO FROM ARTICULO A, FACTURAS_COMPRAS_DETALLE F WHERE F.FACO_ID = :IDDOC INTO :ARTICULO, :IMPTOS
                        DO
                        BEGIN
                        if (IMPTOS <> 0) then
                            BEGIN
                            execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                VALUES (:IDC, :NUMITEMS, :CTACONSUMO, :CONCEPTO, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                            NUMITEMS = NUMITEMS + 1;
                            NETO = NETO + IMPTOS;
                            END
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    /* INSERTE EL REGISTRO DE LA BASE */
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NUMITEMS, :CTACONSUMO, :CONCEPTO, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    NUMITEMS = NUMITEMS + 1;
                    NETO = NETO + IMPTOS;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NUMITEMS, :CTACONSUMO, :CONCEPTO, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NUMITEMS = NUMITEMS + 1;
                    NETO = NETO + IMPTOS;
                    END
                END
              ELSE
                BEGIN
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT F.ARTI_COD, FCDE_CONSUMO FROM ARTICULO A, FACTURAS_COMPRAS_DETALLE F WHERE F.FACO_ID = :IDDOC INTO :ARTICULO, :IMPTOS
                        DO
                        BEGIN
                        if (IMPTOS <> 0) then
                            BEGIN
                           execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                           INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                VALUES (:IDC, :NUMITEMS, :CTACONSUMO, :CONCEPTO, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                            NUMITEMS = NUMITEMS + 1;
                            NETO = NETO - IMPTOS;
                            END
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    /* INSERTE EL REGISTRO DE LA BASE */
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NUMITEMS, :CTACONSUMO, :CONCEPTO, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    NUMITEMS = NUMITEMS + 1;
                    NETO = NETO - IMPTOS;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NUMITEMS, :CTACONSUMO, :CONCEPTO, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NUMITEMS = NUMITEMS + 1;
                    NETO = NETO - IMPTOS;
                    END
                END
              end
            END
        /* DESCUENTO */
        if ((CTADTO IS NOT NULL) AND
            (CTADTO <> '')) THEN
          BEGIN
          execute procedure redondee(VRDTO, DIG) returning_values (VRDTO);
          if (VRDTO <> 0) then
            begin
            /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
            EXECUTE PROCEDURE CUENTA_INTERFAZ(21, :IDDOC, :CTADTO, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :VRDTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 21);
                NUMITEMS = NUMITEMS + 1;
                NETO = NETO - VRDTO;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                /* INSERTE EL REGISTRO DE LA BASE */
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :VRDTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NUMITEMS = NUMITEMS + 1;
                NETO = NETO - VRDTO;
                END
            end
          END
        /* VALOR ADIC */
        if ((CTAADIC IS NOT NULL) AND
            (CTAADIC <> '')) THEN
          BEGIN
          execute procedure redondee(VRADIC, DIG) returning_values (VRADIC);
          if (VRADIC <> 0) then
            begin
            /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
            EXECUTE PROCEDURE CUENTA_INTERFAZ(21, :IDDOC, :CTAADIC, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :VRADIC, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 21);
                NUMITEMS = NUMITEMS + 1;
                NETO = NETO + VRADIC;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :VRADIC, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NUMITEMS = NUMITEMS + 1;
                NETO = NETO + VRADIC;
                END
            end
          END
        /* VALOR EXTRA */
        if ((CTAEXTRA IS NOT NULL) AND
            (CTAEXTRA <> '')) THEN
          BEGIN
          execute procedure redondee(VREXTRA, DIG) returning_values (VREXTRA);
          if (VREXTRA <> 0) then
            begin
            /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
            EXECUTE PROCEDURE CUENTA_INTERFAZ(21, :IDDOC, :CTAEXTRA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :VREXTRA, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 21);
                NUMITEMS = NUMITEMS + 1;
                NETO = NETO + VREXTRA;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :VREXTRA, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NUMITEMS = NUMITEMS + 1;
                NETO = NETO + VREXTRA;
                END
            end
          END

        /* DESCUENTE EL IMPOCONSUMO */
        SELECT SUM(FCDE_CONSUMO) FROM FACTURAS_COMPRAS_DETALLE F WHERE F.FACO_ID = :IDDOC INTO :IMPTOS;
        if (IMPTOS IS NULL) then
            IMPTOS = 0;
        vrsubt = vrsubt - IMPTOS;
        /* RETENCION FUENTE */
        if ((RTFTE = 'P') or (RTFTE = 'K')) then
          BEGIN
          execute procedure redondee(VRRTFTE, DIG) returning_values (VRRTFTE);
          if (VRRTFTE <> 0) then
            begin
            if (RTFTE = 'P') then
                CTARTFTE = TCTARTFTE;
            EXECUTE PROCEDURE CUENTA_INTERFAZ(21, :IDDOC, :CTARTFTE, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :VRRTFTE, (:VRSUBT*-1), :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NUMITEMS = NUMITEMS + 1;
                NETO = NETO - VRRTFTE;
                SUMA = VRRTFTE;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :VRRTFTE, (:VRSUBT*-1), :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NUMITEMS = NUMITEMS + 1;
                NETO = NETO - VRRTFTE;
                SUMA = VRRTFTE;
                END
            end
          END
        if (RTFTE = 'A') then
          BEGIN
          FOR SELECT MAX(COAR_CTARTFTE), MAX(COAR_RTFTE), SUM(FCDE_TOTAL-FCDE_IVAMONTO-FCDE_CONSUMO), SUM((FCDE_TOTAL-FCDE_IVAMONTO-FCDE_CONSUMO)*COAR_RTFTE)
            FROM CONTABIL_ARTICULO C, FACTURAS_COMPRAS_DETALLE F
            WHERE F.faco_id = :IDDOC AND F.ARTI_COD = C.ARTI_COD
            GROUP BY COAR_CTARTFTE
            INTO :CTARTFTE, :PRTFTE, :MONTO, :VRRTFTE
            DO
            BEGIN
            MONTO = MONTO * FACTOR * -1;
            VRRTFTE = VRRTFTE * FACTOR / 100;
            execute procedure redondee(VRRTFTE, DIG) returning_values (VRRTFTE);
            execute procedure redondee(MONTO, DIG) returning_values (MONTO);
            if (VRRTFTE <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(21, :IDDOC, :CTARTFTE, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :VRRTFTE, :VRSUBT, :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    NUMITEMS = NUMITEMS + 1;
                    NETO = NETO - VRRTFTE;
                    SUMA = VRRTFTE;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :VRRTFTE, :VRSUBT, :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NUMITEMS = NUMITEMS + 1;
                    NETO = NETO - VRRTFTE;
                    SUMA = VRRTFTE;
                    END
                end
            end
          END
        /* RETENCION IVA */
        if ((RTIVA = 'P') or (RTIVA = 'K')) then
          BEGIN
          execute procedure redondee(VRRTIVA, DIG) returning_values (VRRTIVA);
          if (VRRTIVA <> 0) then
            begin
            if (RTIVA = 'P') then
                CTARTIVA = TCTARTIVA;
            EXECUTE PROCEDURE CUENTA_INTERFAZ(21, :IDDOC, :CTARTIVA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :VRRTIVA, (:VRIVA*-1), :PORC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 21);
                NUMITEMS = NUMITEMS + 1;
                NETO = NETO - VRRTIVA;
                SUMA = SUMA + VRRTIVA;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :VRRTIVA, (:VRIVA*-1), :PORC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NUMITEMS = NUMITEMS + 1;
                NETO = NETO - VRRTIVA;
                SUMA = SUMA + VRRTIVA;
                END
            end
          END
        /* RETENCION DE ICA */
        if ((RTICA = 'P') or (RTICA = 'K')) then
          BEGIN
          execute procedure redondee(VRRTICA, DIG) returning_values (VRRTICA);
          if (VRRTICA <> 0) then
            begin
            if (RTICA = 'P') then
                CTARTICA = TCTARTICA;
            EXECUTE PROCEDURE CUENTA_INTERFAZ(21, :IDDOC, :CTARTICA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :VRRTICA, (:VRSUBT*-1), :PRTICA, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 21);
                NUMITEMS = NUMITEMS + 1;
                NETO = NETO - VRRTICA;
                SUMA = SUMA + VRRTICA;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :VRRTICA, (:VRSUBT*-1), :PRTICA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NUMITEMS = NUMITEMS + 1;
                NETO = NETO - VRRTICA;
                SUMA = SUMA + VRRTICA;
                END
            end
          END
        if (RTICA = 'A') then
          BEGIN
          FOR SELECT MAX(COAR_CTARTICA), MAX(COAR_RTICA), SUM(FCDE_TOTAL-FCDE_IVAMONTO-FCDE_CONSUMO), SUM((FCDE_TOTAL-FCDE_IVAMONTO-FCDE_CONSUMO)*COAR_RTICA)
            FROM CONTABIL_ARTICULO C, FACTURAS_COMPRAS_DETALLE F
            WHERE F.faco_id = :IDDOC AND F.ARTI_COD = C.ARTI_COD
            GROUP BY COAR_CTARTICA
            INTO :CTARTICA, :PRTICA, :MONTO, :VRRTICA
            DO
            BEGIN
            MONTO = MONTO * FACTOR * -1;
            VRRTICA = VRRTICA * FACTOR / 100;
            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(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, (:MONTO*-1), :PRTICA, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 21);
                    NUMITEMS = NUMITEMS + 1;
                    NETO = NETO - VRRTICA;
                    SUMA = SUMA + VRRTICA;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :VRRTICA, (:MONTO*-1), :PRTICA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NUMITEMS = NUMITEMS + 1;
                    NETO = NETO - VRRTICA;
                    SUMA = SUMA + VRRTICA;
                    END
                END
            end
          END
        /* CIERRE EL COMPROBANTE CONTRA LA CUENTA DEL TERCERO O LA CONSTANTE */
        if ((CXP = 'P') or (CXP = 'K')) then
            BEGIN
            SUMA = VRTOTAL - SUMA;
            execute procedure redondee(SUMA, DIG) returning_values (SUMA);
            if (CXP = 'P') then
                CTACXP = TCTAPROV;
            EXECUTE PROCEDURE CUENTA_INTERFAZ(21, :IDDOC, :CTACXP, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :SUMA, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 21);
            if (TIPOCUEN = 'N') then
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :SUMA, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NETO = NETO - SUMA;
            NUMITEMS = NUMITEMS + 1;
            END
        /* recorra las cuentas adicionales */
        FOR SELECT INCC_CUENTA, INCC_BASE, INCC_PORC, INCC_VALOR, INCC_DB FROM INTERFAZ_COMPRAS_CTAS
            WHERE INCO_ID = :IDINTER INTO :CUENTAADIC, :BASEADIC, :PORCADIC, :VALORADIC, :DBADIC
            DO
            BEGIN
            if (VALORADIC <> 0) then
                MONTO = VALORADIC;
            ELSE
                BEGIN
                if (:BASEADIC = 'SUBTOTAL') then
                    VALORADIC = VRTOTAL - VREXTRA - VRIVA - VRADIC + VRDTO;
                if (:BASEADIC = 'DESCUENTO') then
                    VALORADIC = VRDTO;
                if (:BASEADIC = 'IVA') then
                    VALORADIC = VRIVA;
                if (:BASEADIC = 'CONSUMO') then
                    SELECT SUM(FCDE_CONSUMO) FROM FACTURAS_COMPRAS_DETALLE F WHERE F.FACO_ID = :IDDOC INTO :VALORADIC;
                if (:BASEADIC = 'ADICIONAL') then
                    VALORADIC = VRADIC;
                if (:BASEADIC = 'EXTRA') then
                    VALORADIC = VREXTRA;
                if (:BASEADIC = 'TOTAL') then
                    VALORADIC = VRTOTAL;
                MONTO = CAST(VALORADIC AS DOUBLE PRECISION) * PORCADIC / 100;
                END
            if (MONTO <> 0) then
                BEGIN
                execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                EXECUTE PROCEDURE CUENTA_INTERFAZ(21, :IDDOC, :CUENTAADIC, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'C') then
                    BEGIN
                    if (DBADIC = 'S') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTAADIC, :CONCEPTO, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                        SUMA = SUMA + MONTO;
                        NETO = NETO + MONTO;
                        END
                    ELSE
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTAADIC, :CONCEPTO, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                        SUMA = SUMA - MONTO;
                        NETO = NETO - MONTO;
                        END
                    NUMITEMS = NUMITEMS + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    if (DBADIC = 'S') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTAADIC, :CONCEPTO, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        SUMA = SUMA + MONTO;
                        NETO = NETO + MONTO;
                        END
                    ELSE
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTAADIC, :CONCEPTO, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        SUMA = SUMA - MONTO;
                        NETO = NETO - MONTO;
                        END
                    NUMITEMS = NUMITEMS + 1;
                    END
                END
            END
        if (NETO <> 0) then
            BEGIN
            EXECUTE PROCEDURE lee_configuracion ('CONTABILIDAD','GENERAL','CUENTA PARA CUADRAR COMPROBANTES DESCUADRADOS DE INTERFAZ') returning_values (:ctaadic);
            if (ctaadic <> '') then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(21, :IDDOC, :CTAADIC, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'C') then
                    BEGIN
                    if (NETO < 0) then
                        BEGIN
                        NETO = NETO * -1;
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :NETO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                        END
                    ELSE
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :NETO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                        END
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    if (NETO < 0) then
                        BEGIN
                        NETO = NETO * -1;
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :NETO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        END
                    ELSE
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :NETO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        END
                    END
                END
            END
        END
    if (ERROR > 0) then
        VER = 'S';
    SUSPEND;
    END
ELSE
    BEGIN
    EXECUTE PROCEDURE ERROR (21, :IDDOC, :PREFIJO, 1);
    ERROR = ERROR + 1;
    VER = 'S';
    SUSPEND;
    END
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE CONTABILICE_COMP_SIMPLIFICADO(
    IDI INTEGER)
RETURNS (
    ID INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    ESTADO VARCHAR(20),
    IDC INTEGER)
AS
DECLARE VARIABLE VER CHAR(2);
declare variable ERROR INTEGER;
BEGIN /*$$IBE$$ 
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;
   $$IBE$$*/ /* 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; */ /*$$IBE$$ 
  EXECUTE PROCEDURE CONTABIL_FACTCOMP (:ID, :IDI) RETURNING_VALUES (:ERROR, VER, :IDC);
  if (ERROR = 0) then
    BEGIN
 $$IBE$$*/ /*    EXECUTE PROCEDURE CONTABILIZA_PENDIENTE (:IDC); */ /*$$IBE$$ 
    ESTADO = 'OK';
    END
  ELSE
    ESTADO = 'ERROR';
  suspend;
  END
 $$IBE$$*/ SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE FACTCOMP_SIN_CONTABILIDAD(
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    ID INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    ESTADO VARCHAR(20),
    IDI INTEGER,
    IDC INTEGER)
AS
DECLARE VARIABLE VER CHAR(2);
declare variable FECICNT VARCHAR(10);
declare variable FECFCNT VARCHAR(10);
declare variable ERROR INTEGER;
declare variable idref INTEGER;
BEGIN /*$$IBE$$ 
EXECUTE PROCEDURE fecha_a_conta(FECINI) returning_values (FECICNT);
EXECUTE PROCEDURE fecha_a_conta(FECFIN) returning_values (FECFCNT);
FOR SELECT FACO_ID, PREF_PRE, FACO_NUMERO FROM FACTURAS_COMPRA WHERE FACO_ANULADO = 'N' AND
    FACO_FECHA >= :FECINI AND FACO_FECHA <= :FECFIN ORDER BY FACO_ID
    INTO :ID, :PREF, :NUMERO
DO
  BEGIN
  idref = null;
  SELECT ENCO_IDREF FROM COMPROBANTE_ENCABEZADO WHERE ENCO_TIPOREF = 21 AND ENCO_FECHA >= :FECICNT AND ENCO_FECHA <= :FECFCNT and ENCO_IDREF = :id into :idref;
  if (idref IS NULL) then
  begin
   ESTADO = 'PROCESANDO';
   SUSPEND;
   SELECT MAX(INCO_ID) FROM INTERFAZ_COMPRAS WHERE PREF_PRE = :PREF AND TIDO_COD = 21 INTO :IDI;
   EXECUTE PROCEDURE CONTABIL_FACTCOMP (:ID, :IDI) RETURNING_VALUES (:ERROR, VER, :IDC);
   if (ERROR = 0) then
    BEGIN
    EXECUTE PROCEDURE CONTABILIZA_PENDIENTE (:IDC);
    ESTADO = 'OK';
    END
   ELSE
    ESTADO = 'ERROR';
   suspend;
  End
  END
 $$IBE$$*/ SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

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

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE FACTCOMP_SIN_CONTABILIDAD(
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    ID INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    ESTADO VARCHAR(20),
    IDI INTEGER,
    IDC INTEGER)
AS
DECLARE VARIABLE VER CHAR(2);
declare variable FECICNT VARCHAR(10);
declare variable FECFCNT VARCHAR(10);
declare variable ERROR INTEGER;
declare variable idref INTEGER;
BEGIN
EXECUTE PROCEDURE fecha_a_conta(FECINI) returning_values (FECICNT);
EXECUTE PROCEDURE fecha_a_conta(FECFIN) returning_values (FECFCNT);
FOR SELECT FACO_ID, PREF_PRE, FACO_NUMERO FROM FACTURAS_COMPRA WHERE FACO_ANULADO = 'N' AND
    FACO_FECHA >= :FECINI AND FACO_FECHA <= :FECFIN ORDER BY FACO_ID
    INTO :ID, :PREF, :NUMERO
DO
  BEGIN
  idref = null;
  SELECT ENCO_IDREF FROM COMPROBANTE_ENCABEZADO WHERE ENCO_TIPOREF = 21 AND ENCO_FECHA >= :FECICNT AND ENCO_FECHA <= :FECFCNT and ENCO_IDREF = :id into :idref;
  if (idref IS NULL) then
  begin
   ESTADO = 'PROCESANDO';
   SUSPEND;
   SELECT MAX(INCO_ID) FROM INTERFAZ_COMPRAS WHERE PREF_PRE = :PREF AND TIDO_COD = 21 INTO :IDI;
   EXECUTE PROCEDURE CONTABIL_FACTCOMP (:ID, :IDI) RETURNING_VALUES (:ERROR, VER, :IDC);
   if (ERROR = 0) then
    BEGIN
    EXECUTE PROCEDURE CONTABILIZA_PENDIENTE (:IDC);
    ESTADO = 'OK';
    END
   ELSE
    ESTADO = 'ERROR';
   suspend;
  End
  END
END

^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER PROCEDURE CONTABIL_DEVOLCOMP(
    IDDOC INTEGER,
    IDINTER INTEGER)
RETURNS (
    ERROR INTEGER,
    VER CHAR(1),
    IDC INTEGER)
AS
declare variable PREFIJO VARCHAR(4);
declare variable NUM VARCHAR(6);
declare variable NUMERO VARCHAR(10);
declare variable FECAUX DATE;
declare variable FECHA CHAR(8);
declare variable CONCEPTO CHAR(100);
declare variable NUMFAC VARCHAR(10);
declare variable VRDTO NUMERIC(18, 2);
declare variable VRADIC NUMERIC(18, 2);
declare variable VRSUBT NUMERIC(18, 2);
declare variable VRIVA NUMERIC(18, 2);
declare variable PRTFTE NUMERIC(9, 2);
declare variable VRRTFTE NUMERIC(18, 2);
declare variable VRRTIVA NUMERIC(18, 2);
declare variable PRTICA NUMERIC(9, 2);
declare variable VRRTICA NUMERIC(18, 2);
declare variable VRTOTAL NUMERIC(18, 2);
declare variable VREXTRA NUMERIC(18, 2);
declare variable TIPOCOMP VARCHAR(3);
declare variable PREFCONT VARCHAR(4);
declare variable INVEN CHAR(1);
declare variable CTAINVEN VARCHAR(20);
declare variable IVA CHAR(1);
declare variable CTAIVA VARCHAR(20);
declare variable CONSUMO CHAR(1);
declare variable CTACONSUMO VARCHAR(20);
declare variable CXP CHAR(1);
declare variable CTACXP VARCHAR(20);
declare variable RTFTE CHAR(1);
declare variable CTARTFTE VARCHAR(20);
declare variable RTIVA CHAR(1);
declare variable CTARTIVA VARCHAR(20);
declare variable RTICA CHAR(1);
declare variable CTARTICA VARCHAR(20);
declare variable CTADTO VARCHAR(20);
declare variable CTAADIC VARCHAR(20);
declare variable CTAEXTRA VARCHAR(20);
declare variable EXISTE CHAR(1);
declare variable CUENTA VARCHAR(20);
declare variable MONTO NUMERIC(18,2);
declare variable TIPOCUEN CHAR(1);
declare variable NIT VARCHAR(20);
declare variable PROY VARCHAR(4);
declare variable CENTRO VARCHAR(4);
declare variable PORC NUMERIC(5,2);
declare variable DEBITO NUMERIC(18,2);
declare variable CREDITO NUMERIC(18,2);
declare variable NUMITEMS INTEGER;
declare variable ARTICULO VARCHAR(15);
declare variable IMPINC CHAR(1);
declare variable IMPTOS NUMERIC(18, 2);
declare variable SUMA NUMERIC(18,2);
declare variable PORCIVA NUMERIC(9,2);
declare variable TCTAPROV VARCHAR(20);
declare variable TCTARTFTE VARCHAR(20);
declare variable TCTARTIVA VARCHAR(20);
declare variable TCTARTICA VARCHAR(20);
declare variable CUENTAADIC VARCHAR(20);
declare variable BASEADIC VARCHAR(20);
declare variable PORCADIC NUMERIC(5,2);
declare variable VALORADIC NUMERIC(18,2);
declare variable DBADIC CHAR(1);
declare variable FOMENTO CHAR(2);
declare variable ANULADO CHAR(1);
declare variable CENT CHAR(1);
declare variable ERRORC INTEGER;
DECLARE VARIABLE MENORV CHAR(2);
DECLARE VARIABLE MERCANCIA NUMERIC(18,2);
declare variable FACTOR DOUBLE PRECISION;
declare variable DIG INTEGER;
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_CTAINVEN, INCO_CTAIVA, INCO_CTACONSUMO, INCO_CTADTO, INCO_CTAADIC, INCO_CTAEXTRA, INCO_CTACXP, INCO_CTARTFTE, INCO_CTARTIVA, INCO_CTARTICA, INCO_CONFIRMAR, INCO_CENTRO
    FROM INTERFAZ_COMPRAS
    WHERE INCO_ID = :IDINTER
    INTO :EXISTE, :TIPOCOMP, :PREFCONT, :INVEN, :IVA, :CONSUMO, :CXP, :RTFTE, :RTIVA, :RTICA, :CTAINVEN, :CTAIVA, :CTACONSUMO, :CTADTO, :CTAADIC, :CTAEXTRA, :CTACXP, :CTARTFTE, :CTARTIVA, :CTARTICA, :VER, :CENT;
if (EXISTE = 'S') then
   BEGIN
    /* BORRE 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, PROV_CTARTFTE, PROV_CTARTIVA, PROV_CTARTICA, PROV_CTAPAGAR, DVCO_ANULADO
        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, :TCTARTFTE, TCTARTIVA, TCTARTICA, TCTAPROV, ANULADO;
   if (ANULADO = 'N') then
    BEGIN
    NUMERO = PREFIJO || NUM;
    VRSUBT = VRTOTAL - VREXTRA - VRIVA; /* BASE DE RETEFTE Y RETEICA */
    IF (CENT = 'B') THEN
        SELECT BODE_CENTRO, BODE_PROY FROM BODEGA B, DEVOLUCIONES_COMPRAS F
            WHERE B.BODE_COD = F.BODE_COD AND F.DVCO_ID = :IDDOC INTO :CENTRO, :PROY;
    ELSE
        SELECT PREF_CENTRO,PREF_PROY FROM PREFIJOS P, DEVOLUCIONES_COMPRAS F
            WHERE P.PREF_PRE = F.PREF_PRE AND F.DVCO_ID = :IDDOC AND P.TIDO_COD = 24 INTO :CENTRO, :PROY;
    /* CONVIERTA LA FECHA A CADENA */
    EXECUTE PROCEDURE FECHA_A_CONTA(:FECAUX) returning_values (:FECHA);
    EXECUTE PROCEDURE LEE_CONFIGURACION('COMPRAS', 'FACTURAS', 'USAR IMPOCONSUMO COMO PORCENTAJE DE FOMENTO') RETURNING_VALUES (FOMENTO);
    EXECUTE PROCEDURE lee_configuracion('COMPRAS','FACTURAS','DESCUENTO Y VALOR ADICIONAL DEL DOCUMENTO COMO MENOR VALOR DEL COSTO') returning_values (:MENORV);
    SELECT CAST(CONF_VALOR AS INTEGER) FROM CONFIGURACION WHERE CONF_MODULO = 'COMPRAS' AND CONF_CATEGORIA = 'GENERAL' AND CONF_PROPIEDAD = 'REDONDEO AL MULTIPLO DE DIEZ EN TOTALES' INTO :DIG;
    VRSUBT = VRTOTAL - VREXTRA - VRIVA;
    MERCANCIA = VRSUBT - VRADIC + VRDTO;
    SELECT SUM(DVCD_consumo) from devoluciones_compras_det where dvco_id = :IDDOC into :valoradic;
    if (MENORV = 'SI') then
        if (MERCANCIA <> 0) then
            FACTOR = (CAST(VRSUBT AS DOUBLE PRECISION) - VALORADIC) / (CAST(MERCANCIA AS DOUBLE PRECISION) - VALORADIC);
        ELSE
            FACTOR = 1;
    ELSE
        FACTOR = 1;

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

    NUMITEMS = 0;
    SUMA = 0;
    ERROR = 0;
    /* CUENTAS DE INVENTARIO */
    if (INVEN = 'A') then
        BEGIN
        /* SUME LAS BASES DE LOS ARTICULOS DEL DOCUMENTO */
        FOR SELECT MAX(COAR_CTACOMP), SUM(cast(DVCD_CANT as double precision) * (DVCD_PRUNIT-DVCD_DTOMONTO)), SUM(DVCD_IVAMONTO), SUM(DVCD_CONSUMO)
            FROM ARTICULO A, CONTABIL_ARTICULO C, DEVOLUCIONES_COMPRAS_DET F
            WHERE F.DVCO_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD
            GROUP BY COAR_CTAINV
            INTO :CTAINVEN, :MONTO, :IMPTOS, :VALORADIC
            DO
            BEGIN
            if (IMPINC = 'S') then
                BEGIN
                MONTO = MONTO - IMPTOS;
                if (FOMENTO <> 'SI') then
                    MONTO = MONTO - VALORADIC;
                END
            /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
            EXECUTE PROCEDURE CUENTA_INTERFAZ(24, :IDDOC, :CTAINVEN, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            /* DEPENDE DEL TIPO DE CUENTA */
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, REGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT F.ARTI_COD, (cast(DVCD_CANT as double precision) * (DVCD_PRUNIT-DVCD_DTOMONTO)), DVCD_IVAMONTO, DVCD_CONSUMO
                    FROM ARTICULO A, CONTABIL_ARTICULO C, DEVOLUCIONES_COMPRAS_DET F
                    WHERE F.DVCO_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTAINV = :CUENTA
                    INTO :ARTICULO, :MONTO, :IMPTOS, :VALORADIC
                DO
                    BEGIN
                    if (IMPINC = 'S') then
                        BEGIN
                        MONTO = MONTO - IMPTOS;
                        if (FOMENTO <> 'SI') then
                            MONTO = MONTO - VALORADIC;
                        END
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                    NUMITEMS = NUMITEMS + 1;
                    SUMA = SUMA - MONTO;
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                /* INSERTE EL REGISTRO DE LA BASE */
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 24);
                NUMITEMS = NUMITEMS + 1;
                SUMA = SUMA - MONTO;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                /* INSERTE EL REGISTRO DE LA BASE */
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NUMITEMS = NUMITEMS + 1;
                SUMA = SUMA - MONTO;
                END
            END /* FOR */
        END /* INVENTARIO X ARTICULO */

    if (INVEN = 'K') then
        BEGIN
        /* SUME LAS BASES DE LOS ARTICULOS DEL DOCUMENTO */
        SELECT SUM(cast(DVCD_CANT as double precision) * (DVCD_PRUNIT-DVCD_DTOMONTO)), SUM(DVCD_IVAMONTO), SUM(DVCD_CONSUMO)
            FROM DEVOLUCIONES_COMPRAS_DET WHERE DVCO_ID = :IDDOC
            INTO :MONTO, :IMPTOS, :VALORADIC;
        if (IMPINC = 'S') then
            BEGIN
            MONTO = MONTO - IMPTOS;
            if (FOMENTO <> 'SI') then
                MONTO = MONTO - VALORADIC;
            END
        /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
        EXECUTE PROCEDURE CUENTA_INTERFAZ(24, :IDDOC, :CTAINVEN, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        /* DEPENDE DEL TIPO DE CUENTA */
        if (TIPOCUEN = 'I') then
            BEGIN
            /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
            FOR SELECT ARTI_COD, (cast(DVCD_CANT as double precision) * (DVCD_PRUNIT-DVCD_DTOMONTO)), DVCD_IVAMONTO, DVCD_CONSUMO
                FROM DEVOLUCIONES_COMPRAS_DET
                WHERE DVCO_ID = :IDDOC
                INTO :ARTICULO, :MONTO, :IMPTOS, :VALORADIC
                DO
                BEGIN
                if (IMPINC = 'S') then
                    BEGIN
                    MONTO = MONTO - IMPTOS;
                    if (FOMENTO <> 'SI') then
                        MONTO = MONTO - VALORADIC;
                    END
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NUMITEMS, :CTAINVEN, :CONCEPTO, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                NUMITEMS = NUMITEMS + 1;
                SUMA = SUMA - MONTO;
                END
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NUMITEMS, :CTAINVEN, :CONCEPTO, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 24);
            NUMITEMS = NUMITEMS + 1;
            SUMA = SUMA - MONTO;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NUMITEMS, :CTAINVEN, :CONCEPTO, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NUMITEMS = NUMITEMS + 1;
            SUMA = SUMA - MONTO;
            END
        END /* INVEN = K */
        
    /* EL IVA */
    if (IVA = 'A') then
        BEGIN
        /* SUME LAS BASES DE LOS ARTICULOS DEL DOCUMENTO */
        FOR SELECT MAX(COAR_CTAIVAC), SUM(DVCD_IVAMONTO), SUM(cast(DVCD_CANT as double precision) * (DVCD_PRUNIT-DVCD_DTOMONTO)), SUM(DVCD_CONSUMO)
            FROM ARTICULO A, CONTABIL_ARTICULO C, DEVOLUCIONES_COMPRAS_DET F
            WHERE F.DVCO_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD
            GROUP BY COAR_CTAIVAC
            INTO :CTAIVA, :IMPTOS, :MONTO, :VALORADIC
        DO
          if (IMPTOS <> 0) then
            BEGIN
            if (IMPINC = 'S') then
                BEGIN
                MONTO = MONTO - IMPTOS;
                if (FOMENTO <> 'SI') then
                    MONTO = MONTO - VALORADIC;
                END

            /* TRAIGA LAS CARCATERISTICAS DE LA CUENTA */
            EXECUTE PROCEDURE CUENTA_INTERFAZ(24, :IDDOC, :CTAIVA, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            /* DEPENDE DEL TIPO DE CUENTA */
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT F.ARTI_COD, DVCD_IVAMONTO, (cast(DVCD_CANT as double precision) * (DVCD_PRUNIT-DVCD_DTOMONTO)), TAIV_PORC, DVCD_CONSUMO
                    FROM ARTICULO A, CONTABIL_ARTICULO C, DEVOLUCIONES_COMPRAS_DET F, TARIFA_IVA T
                    WHERE F.DVCO_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTAIVAV = :CUENTA AND A.TAIV_COD = T.TAIV_COD
                    INTO :ARTICULO, :IMPTOS, :MONTO, :PORCIVA, :VALORADIC
                DO
                    BEGIN
                    if (IMPINC = 'S') then
                        BEGIN
                        MONTO = MONTO - IMPTOS;
                        if (FOMENTO <> 'SI') then
                            MONTO = MONTO - VALORADIC;
                        END
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :IMPTOS, :MONTO, :PORCIVA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                    NUMITEMS = NUMITEMS + 1;
                    SUMA = SUMA - IMPTOS;
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :IMPTOS, 0, 0, :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, 0, 0, :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 
            INTO :IMPTOS, :MONTO, :VALORADIC;
            
        if (IMPTOS <> 0) then
            BEGIN
            if (IMPINC = 'S') then
                BEGIN
                MONTO = MONTO - IMPTOS;
                if (FOMENTO <> 'SI') then
                    MONTO = MONTO - VALORADIC;
                END
            /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
            EXECUTE PROCEDURE CUENTA_INTERFAZ(24, :IDDOC, :CTAIVA, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            /* DEPENDE DEL TIPO DE CUENTA */
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT F.ARTI_COD, (cast(DVCD_CANT as double precision) * (DVCD_PRUNIT-DVCD_DTOMONTO)), DVCD_IVAMONTO, TAIV_PORC, DVCD_CONSUMO
                    FROM ARTICULO A, DEVOLUCIONES_COMPRAS_DET F, TARIFA_IVA T
                    WHERE F.DVCO_ID = :IDDOC AND A.TAIV_COD = T.TAIV_COD
                    INTO :ARTICULO, :MONTO, :IMPTOS, :PORCIVA, :VALORADIC
                    DO
                    BEGIN
                    if (IMPTOS <> 0) then
                        BEGIN
                        if (IMPINC = 'S') then
                            BEGIN
                            MONTO = MONTO - IMPTOS;
                            if (FOMENTO <> 'SI') then
                                MONTO = MONTO - VALORADIC;
                            END
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CTAIVA, :CONCEPTO, '', 0, :IMPTOS, :MONTO, :PORCIVA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                        NUMITEMS = NUMITEMS + 1;
                        SUMA = SUMA - IMPTOS;
                        END
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                /* INSERTE EL REGISTRO DE LA BASE */
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NUMITEMS, :CTAIVA, :CONCEPTO, '', 0, :IMPTOS, 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, :CTAIVA, :CONCEPTO, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NUMITEMS = NUMITEMS + 1;
                SUMA = SUMA - IMPTOS;
                END
            END /* <> 0 */
        END /* IVA EN CTA CONSTANTE */
        
    /* EL IMPOCONSUMO */
    if (CONSUMO = 'A') then
        BEGIN
        /* SUME LAS BASES DE LOS ARTICULOS DEL DOCUMENTO */
        FOR SELECT MAX(COAR_CTACONS), SUM(DVCD_CONSUMO)
            FROM ARTICULO A, CONTABIL_ARTICULO C, DEVOLUCIONES_COMPRAS_DET F
            WHERE F.DVCO_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD
            GROUP BY COAR_CTACONS
            INTO :CTACONSUMO, :IMPTOS
        DO
            BEGIN
            if (IMPTOS <> 0) then
                BEGIN
                /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
                EXECUTE PROCEDURE CUENTA_INTERFAZ(24, :IDDOC, :CTACONSUMO, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (FOMENTO <> 'SI') then
                    BEGIN
                    /* DEPENDE DEL TIPO DE CUENTA */
                    if (TIPOCUEN = 'I') then
                        BEGIN
                        /* ES UNA CUENTA DE INVENTARIO, REGISTRE UNO A UNO LOS ARTICULOS */
                        FOR SELECT F.ARTI_COD, DVCD_CONSUMO
                            FROM ARTICULO A, CONTABIL_ARTICULO C, DEVOLUCIONES_COMPRAS_DET F
                            WHERE F.DVCO_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTACONS = :CUENTA
                            INTO :ARTICULO, :IMPTOS
                            DO
                            BEGIN
                            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                            NUMITEMS = NUMITEMS + 1;
                            SUMA = SUMA - IMPTOS;
                            END
                        END
                    if (TIPOCUEN = 'C') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 24);
                        NUMITEMS = NUMITEMS + 1;
                        SUMA = SUMA - IMPTOS;
                        END
                    if (TIPOCUEN = 'N') then
                        BEGIN
                        /* INSERTE EL REGISTRO DE LA BASE */
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NUMITEMS = NUMITEMS + 1;
                        SUMA = SUMA - IMPTOS;
                        END
                    END
                ELSE
                    BEGIN
                    if (TIPOCUEN = 'I') then
                        BEGIN
                        /* ES UNA CUENTA DE INVENTARIO, REGISTRE UNO A UNO LOS ARTICULOS */
                        FOR SELECT F.ARTI_COD, DVCD_CONSUMO
                            FROM ARTICULO A, CONTABIL_ARTICULO C, DEVOLUCIONES_COMPRAS_DET F
                            WHERE F.DVCO_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTACONS = :CUENTA
                            INTO :ARTICULO, :IMPTOS
                            DO
                            BEGIN
                            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                VALUES (:IDC, :NUMITEMS, :CTACONSUMO, :CONCEPTO, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                            NUMITEMS = NUMITEMS + 1;
                            SUMA = SUMA + IMPTOS;
                            END
                        END
                    if (TIPOCUEN = 'C') then
                        BEGIN
                        /* INSERTE EL REGISTRO DE LA BASE */
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CTACONSUMO, :CONCEPTO, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 24);
                        NUMITEMS = NUMITEMS + 1;
                        SUMA = SUMA + IMPTOS;
                        END
                    if (TIPOCUEN = 'N') then
                        BEGIN
                        /* INSERTE EL REGISTRO DE LA BASE */
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CTACONSUMO, :CONCEPTO, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NUMITEMS = NUMITEMS + 1;
                        SUMA = SUMA + IMPTOS;
                        END
                    END
                END
            END /* FOR */
        END /* CONSUMO X ARTICULO */
        
    if (CONSUMO = 'K') then /* CONSUMO EN CTA CONSTANTE */
        BEGIN
        SELECT SUM(DVCD_CONSUMO)
            FROM DEVOLUCIONES_COMPRAS_DET F
            WHERE F.DVCO_ID = :IDDOC 
            INTO :IMPTOS;
            
        if (IMPTOS <> 0) then
            BEGIN
            /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
            EXECUTE PROCEDURE CUENTA_INTERFAZ(24, :IDDOC, :CTACONSUMO, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (FOMENTO <> 'SI') then
                BEGIN
                /* DEPENDE DEL TIPO DE CUENTA */
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT F.ARTI_COD, DVCD_CONSUMO
                        FROM ARTICULO A, DEVOLUCIONES_COMPRAS_DET F
                        WHERE F.DVCO_ID = :IDDOC
                        INTO :ARTICULO, :IMPTOS
                        DO
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CTACONSUMO, :CONCEPTO, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                        NUMITEMS = NUMITEMS + 1;
                        SUMA = SUMA - IMPTOS;
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    /* INSERTE EL REGISTRO DE LA BASE */
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NUMITEMS, :CTACONSUMO, :CONCEPTO, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 24);
                    NUMITEMS = NUMITEMS + 1;
                    SUMA = SUMA - IMPTOS;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    /* INSERTE EL REGISTRO DE LA BASE */
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NUMITEMS, :CTACONSUMO, :CONCEPTO, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NUMITEMS = NUMITEMS + 1;
                    SUMA = SUMA - IMPTOS;
                    END
                END
            ELSE
                BEGIN
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT F.ARTI_COD, DVCD_CONSUMO
                        FROM ARTICULO A, DEVOLUCIONES_COMPRAS_DET F
                        WHERE F.DVCO_ID = :IDDOC
                        INTO :ARTICULO, :IMPTOS
                        DO
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CTACONSUMO, :CONCEPTO, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                        NUMITEMS = NUMITEMS + 1;
                        SUMA = SUMA + IMPTOS;
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    /* INSERTE EL REGISTRO DE LA BASE */
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NUMITEMS, :CTACONSUMO, :CONCEPTO, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 24);
                    NUMITEMS = NUMITEMS + 1;
                    SUMA = SUMA + IMPTOS;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    /* INSERTE EL REGISTRO DE LA BASE */
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NUMITEMS, :CTACONSUMO, :CONCEPTO, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NUMITEMS = NUMITEMS + 1;
                    SUMA = SUMA + IMPTOS;
                    END
                END
            END
        END /* CONSUMO EN CTA CONSTANTE */
        
    /* DESCUENTO */
    if ((CTADTO IS NOT NULL) AND
        (CTADTO <> '') AND
        (VRDTO <> 0)) THEN
        BEGIN
        /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
        EXECUTE PROCEDURE CUENTA_INTERFAZ(24, :IDDOC, :CTADTO, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :VRDTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 24);
            NUMITEMS = NUMITEMS + 1;
            SUMA = SUMA + VRDTO;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            /* INSERTE EL REGISTRO DE LA BASE */
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :VRDTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NUMITEMS = NUMITEMS + 1;
            SUMA = SUMA + VRDTO;
            END
        END /* DESCUENTO */
        
    /* VALOR ADIC */
    if ((CTAADIC IS NOT NULL) AND
        (CTAADIC <> '') AND
        (VRADIC <> 0)) THEN
        BEGIN
        /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
        EXECUTE PROCEDURE CUENTA_INTERFAZ(24, :IDDOC, :CTAADIC, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :VRADIC, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 24);
            NUMITEMS = NUMITEMS + 1;
            SUMA = SUMA - VRADIC;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            /* INSERTE EL REGISTRO DE LA BASE */
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :VRADIC, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NUMITEMS = NUMITEMS + 1;
            SUMA = SUMA - VRADIC;
            END
        END /* VR. ADIC */
        
    /* VALOR EXTRA */
    if ((CTAEXTRA IS NOT NULL) AND
        (CTAEXTRA <> '') AND
        (VREXTRA <> 0)) THEN
        BEGIN
        /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
        EXECUTE PROCEDURE CUENTA_INTERFAZ(24, :IDDOC, :CTAEXTRA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :VREXTRA, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 24);
            NUMITEMS = NUMITEMS + 1;
            SUMA = SUMA + VREXTRA;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            /* INSERTE EL REGISTRO DE LA BASE */
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :VREXTRA, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NUMITEMS = NUMITEMS + 1;
            SUMA = SUMA + VREXTRA;
            END
        END /* VR. EXTRA */
        
    if (fomento <> 'SI') then
        BEGIN
        /* DESCUENTE EL IMPOCONSUMO */
        SELECT SUM(DVCD_CONSUMO)
            FROM devoluciones_compras_det WHERE DVCO_ID = :IDDOC INTO :IMPTOS;
        if (IMPTOS IS NULL) then
            IMPTOS = 0;
        vrsubt = vrsubt - IMPTOS;
        END
    /* RETENCION FUENTE */
    if ((RTFTE = 'P') or (RTFTE = 'K')) then
      if (VRRTFTE <> 0) then
        BEGIN
        if (RTFTE = 'P') then
            CTARTFTE = TCTARTFTE;
            
        /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
        EXECUTE PROCEDURE CUENTA_INTERFAZ(24, :IDDOC, :CTARTFTE, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :VRRTFTE, 0, :VRSUBT, :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 24);
            NUMITEMS = NUMITEMS + 1;
            SUMA = SUMA + VRRTFTE;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            /* INSERTE EL REGISTRO DE LA BASE */
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :VRRTFTE, 0, :VRSUBT, :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NUMITEMS = NUMITEMS + 1;
            SUMA = SUMA + VRRTFTE;
            END
        END /* RTFTE */
    if (RTFTE = 'A') then
        BEGIN
        FOR SELECT MAX(COAR_CTARTFTE), MAX(COAR_RTFTE), 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, :MONTO, :VRRTFTE
            DO
            BEGIN
            MONTO = MONTO * FACTOR;
            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 /* RTFTE */
    /* RETENCION IVA */
    if ((RTIVA = 'P') or (RTIVA = 'K')) then
      if (VRRTIVA <> 0) then
        BEGIN
        if (RTIVA = 'P') then
            CTARTIVA = TCTARTIVA;
            
        /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
        EXECUTE PROCEDURE CUENTA_INTERFAZ(24, :IDDOC, :CTARTIVA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :VRRTIVA, 0, :VRIVA, :PORC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 24);
            NUMITEMS = NUMITEMS + 1;
            SUMA = SUMA + VRRTIVA;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            /* INSERTE EL REGISTRO DE LA BASE */
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :VRRTIVA, 0, :VRIVA, :PORC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NUMITEMS = NUMITEMS + 1;
            SUMA = SUMA + VRRTIVA;
            END
        END /* RTIVA */
        
    /* RETENCION DE ICA */
    if ((RTICA = 'P') or (RTICA = 'K')) then
      if (VRRTICA <> 0) then
        BEGIN
        if (RTICA = 'P') then
            CTARTICA = TCTARTICA;
            
        /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
        EXECUTE PROCEDURE CUENTA_INTERFAZ(24, :IDDOC, :CTARTICA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :VRRTICA, 0, :VRSUBT, :PRTICA, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 24);
            NUMITEMS = NUMITEMS + 1;
            SUMA = SUMA + VRRTICA;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            /* INSERTE EL REGISTRO DE LA BASE */
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :VRRTICA, 0, :VRSUBT, :PRTICA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NUMITEMS = NUMITEMS + 1;
            SUMA = SUMA + VRRTICA;
            END
        END /* RTICA */
    if (RTICA = 'A') then
        BEGIN
        FOR SELECT MAX(COAR_CTARTICA), MAX(COAR_RTICA), SUM(DVCD_TOTAL-DVCD_IVAMONTO-DVCD_CONSUMO), SUM((DVCD_TOTAL-DVCD_IVAMONTO-DVCD_CONSUMO)*COAR_RTICA)
            FROM CONTABIL_ARTICULO C, DEVOLUCIONES_COMPRAS_DET F
            WHERE F.dvco_id = :IDDOC AND F.ARTI_COD = C.ARTI_COD
            GROUP BY COAR_CTARTICA
            INTO :CTARTICA, :PRTICA, :MONTO, :VRRTICA
            DO
            BEGIN
            MONTO = MONTO * FACTOR;
            VRRTICA = VRRTICA * FACTOR / 100;
            execute procedure redondee(VRRTICA, DIG) returning_values (VRRTICA);
            execute procedure redondee(MONTO, DIG) returning_values (MONTO);
            if (VRRTICA <> 0) then
                BEGIN
                /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
                EXECUTE PROCEDURE CUENTA_INTERFAZ(24, :IDDOC, :CTARTICA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :VRRTICA, 0, :VRSUBT, :PRTICA, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 24);
                    NUMITEMS = NUMITEMS + 1;
                    SUMA = SUMA + VRRTICA;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    /* INSERTE EL REGISTRO DE LA BASE */
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :VRRTICA, 0, :VRSUBT, :PRTICA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NUMITEMS = NUMITEMS + 1;
                    SUMA = SUMA + VRRTICA;
                    END
                END
            END
        END /* RTICA A */
        
    /* recorra las cuentas adicionales */
    FOR SELECT INCC_CUENTA, INCC_BASE, INCC_PORC, INCC_VALOR, INCC_DB
        FROM INTERFAZ_COMPRAS_CTAS
        WHERE INCO_ID = :IDINTER
        INTO :CUENTAADIC, :BASEADIC, :PORCADIC, :VALORADIC, :DBADIC
        DO
        BEGIN
        if (VALORADIC <> 0) then
            MONTO = VALORADIC;
        ELSE
            BEGIN
            if (:BASEADIC = 'SUBTOTAL') then
                VALORADIC = VRTOTAL - VREXTRA - VRIVA - VRADIC + VRDTO;
            if (:BASEADIC = 'DESCUENTO') then
                VALORADIC = VRDTO;
            if (:BASEADIC = 'IVA') then
                VALORADIC = VRIVA;
            if (:BASEADIC = 'CONSUMO') then
                SELECT SUM(DVCD_CONSUMO)
                    FROM DEVOLUCIONES_COMPRAS_DET F
                    WHERE F.DVCO_ID = :IDDOC 
                    INTO :VALORADIC;
            if (:BASEADIC = 'ADICIONAL') then
                VALORADIC = VRADIC;
            if (:BASEADIC = 'EXTRA') then
                VALORADIC = VREXTRA;
            if (:BASEADIC = 'TOTAL') then
                VALORADIC = VRTOTAL;
            MONTO = VALORADIC * PORCADIC;
            END
        if (MONTO <> 0) then
            BEGIN
            /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
            EXECUTE PROCEDURE CUENTA_INTERFAZ(24, :IDDOC, :CUENTAADIC, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                if (DBADIC = 'S') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NUMITEMS, :CUENTAADIC, :CONCEPTO, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 24);
                    SUMA = SUMA + MONTO;
                    END
                ELSE
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NUMITEMS, :CUENTAADIC, :CONCEPTO, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 24);
                    SUMA = SUMA - MONTO;
                    END
                NUMITEMS = NUMITEMS + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                if (DBADIC = 'S') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NUMITEMS, :CUENTAADIC, :CONCEPTO, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    SUMA = SUMA + MONTO;
                    END
                ELSE
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NUMITEMS, :CUENTAADIC, :CONCEPTO, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    SUMA = SUMA - MONTO;
                    END
                NUMITEMS = NUMITEMS + 1;
                END
            NUMITEMS = NUMITEMS + 1;
            END
        END
    /* CIERRE EL COMPROBANTE CONTRA LA CUENTA DEL TERCERO O LA CONSTANTE */
    if ((SUMA <> 0) and ((CXP = 'P') or (CXP = 'K'))) then
        BEGIN
        if (SUMA < 0) then
            BEGIN
            DEBITO = SUMA * -1;
            CREDITO = 0;
            END
        ELSE
            BEGIN
            DEBITO = 0;
            CREDITO = SUMA;
            END
        if (CXP = 'P') then
            CTACXP = TCTAPROV;

        /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
        EXECUTE PROCEDURE CUENTA_INTERFAZ(24, :IDDOC, :CTACXP, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :DEBITO, :CREDITO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 24);
        if (TIPOCUEN = 'N') then
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :DEBITO, :CREDITO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
        END /* SUMA EN CXP */
     end
    if (ERROR > 0) then
        VER = 'S';
    SUSPEND;
    END /* EXISTE */
ELSE
    BEGIN
    EXECUTE PROCEDURE ERROR (24, :IDDOC, :PREFIJO, 1);
    ERROR = ERROR + 1;
    VER = 'S';
    SUSPEND;
    END
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE DEVCOMPRA_SIN_CONTABILIDAD(
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    ID INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    ESTADO VARCHAR(20),
    IDI INTEGER,
    IDC INTEGER)
AS
DECLARE VARIABLE VER CHAR(2);
declare variable FECICNT VARCHAR(10);
declare variable FECFCNT VARCHAR(10);
declare variable ERROR INTEGER;
declare variable idref INTEGER;
BEGIN /*$$IBE$$ 
EXECUTE PROCEDURE fecha_a_conta(FECINI) returning_values (FECICNT);
EXECUTE PROCEDURE fecha_a_conta(FECFIN) returning_values (FECFCNT);
FOR SELECT DVCO_ID, PREF_PRE, DVCO_NUMERO FROM DEVOLUCIONES_COMPRAS WHERE DVCO_ANULADO = 'N' AND
    DVCO_FECHA >= :FECINI AND DVCO_FECHA <= :FECFIN
    INTO :ID, :PREF, :NUMERO
DO
  BEGIN
  idref = null;
  SELECT ENCO_IDREF FROM COMPROBANTE_ENCABEZADO WHERE ENCO_TIPOREF = 24 AND ENCO_FECHA >= :FECICNT AND ENCO_FECHA <= :FECFCNT and ENCO_IDREF = :id into :idref;
  if (idref IS NULL) then
  begin
   ESTADO = 'PROCESANDO';
   SUSPEND;
   SELECT MAX(INCO_ID) FROM INTERFAZ_COMPRAS WHERE PREF_PRE = :PREF AND TIDO_COD = 24 INTO :IDI;
   EXECUTE PROCEDURE CONTABIL_DEVOLCOMP (:ID, :IDI) RETURNING_VALUES (:ERROR, :VER, :IDC);
   if (ERROR = 0) then
    BEGIN
      EXECUTE PROCEDURE CONTABILIZA_PENDIENTE (:IDC);
      ESTADO = 'OK';
    end
   ELSE
    ESTADO = 'ERROR';
   suspend;
  End
  END
 $$IBE$$*/ SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE DEVCOMPRA_SIN_CONTABILIDAD(
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    ID INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    ESTADO VARCHAR(20),
    IDI INTEGER,
    IDC INTEGER)
AS
DECLARE VARIABLE VER CHAR(2);
declare variable FECICNT VARCHAR(10);
declare variable FECFCNT VARCHAR(10);
declare variable ERROR INTEGER;
declare variable idref INTEGER;
BEGIN
EXECUTE PROCEDURE fecha_a_conta(FECINI) returning_values (FECICNT);
EXECUTE PROCEDURE fecha_a_conta(FECFIN) returning_values (FECFCNT);
FOR SELECT DVCO_ID, PREF_PRE, DVCO_NUMERO FROM DEVOLUCIONES_COMPRAS WHERE DVCO_ANULADO = 'N' AND
    DVCO_FECHA >= :FECINI AND DVCO_FECHA <= :FECFIN
    INTO :ID, :PREF, :NUMERO
DO
  BEGIN
  idref = null;
  SELECT ENCO_IDREF FROM COMPROBANTE_ENCABEZADO WHERE ENCO_TIPOREF = 24 AND ENCO_FECHA >= :FECICNT AND ENCO_FECHA <= :FECFCNT and ENCO_IDREF = :id into :idref;
  if (idref IS NULL) then
  begin
   ESTADO = 'PROCESANDO';
   SUSPEND;
   SELECT MAX(INCO_ID) FROM INTERFAZ_COMPRAS WHERE PREF_PRE = :PREF AND TIDO_COD = 24 INTO :IDI;
   EXECUTE PROCEDURE CONTABIL_DEVOLCOMP (:ID, :IDI) RETURNING_VALUES (:ERROR, :VER, :IDC);
   if (ERROR = 0) then
    BEGIN
      EXECUTE PROCEDURE CONTABILIZA_PENDIENTE (:IDC);
      ESTADO = 'OK';
    end
   ELSE
    ESTADO = 'ERROR';
   suspend;
  End
  END
END

^

SET TERM ; ^


/* busqueda remisiones y cruces de documentos */
SET TERM ^ ;

CREATE OR ALTER procedure BUSQUEDA_REMISIONES (
    SUBEMPRESA INTEGER)
returns (
    REVT_ID INTEGER,
    PREF_PRE VARCHAR(4),
    REVT_NUMERO VARCHAR(6),
    REVT_FECHA DATE,
    REVT_NOMTERC VARCHAR(60),
    REVT_TOTAL NUMERIC(18,2),
    REVT_IVAMONTO NUMERIC(18,2),
    VEND_COD INTEGER,
    REVT_ANULADO CHAR(1),
    USADO CHAR(1))
as
declare variable numrows integer;
begin
for select revt_id, p.pref_pre, revt_numero, revt_fecha, revt_nomterc, revt_total, revt_ivamonto, vend_cod, revt_anulado
    from remisiones_venta r,prefijos p where r.pref_pre= p.pref_pre and p.tido_cod = 32 and ((p.sucu_id= :SUBEMPRESA) or (:subempresa = 0))
    INTO revt_id, pref_pre, revt_numero, revt_fecha, revt_nomterc, revt_total, revt_ivamonto, vend_cod, revt_anulado
    DO
    BEGIN
    select count(cofa_id) from consolidado_faltantes where cofa_ok = 'S' and cofa_tipoori = 32 and cofa_idori = :revt_id into :numrows;
    if (numrows > 1) then
        usado = 'S';
    else
        begin
        select count(devt_id) from devoluciones_ventas where devt_remid = :revt_id and devt_anulado = 'N' into numrows;
        if (numrows > 1) then
            usado = 'S';
        else
            usado = 'N';
        end
    suspend;
    END
end
^

SET TERM ; ^


SET TERM ^ ;

CREATE OR ALTER PROCEDURE CRUCES_DOCUMENTOS(
    TIPOORI INTEGER,
    IDORI INTEGER)
RETURNS (
    TIPODES INTEGER,
    ID INTEGER,
    NOMTIPO VARCHAR(8),
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE)
AS
declare variable IDC INTEGER;
begin
FOR SELECT DISTINCT COFA_TIPODES, COFA_ID FROM CONSOLIDADO_FALTANTES
    WHERE COFA_TIPOORI = :TIPOORI AND COFA_IDORI = :IDORI AND COFA_OK = 'S' INTO :TIPODES, :IDC
    DO
    BEGIN
    SELECT TIDO_NOMCORTO FROM tipo_documento WHERE TIDO_COD = :tipodes INTO :nomtipo;
    if (TIPODES = 21) then
        SELECT FACO_ID, PREF_PRE, FACO_NUMERO, FACO_FECHA FROM FACTURAS_COMPRA WHERE FACO_CONSOLIDA = :IDC AND FACO_ANULADO = 'N' INTO :ID, :PREFIJO, :NUMERO, :FECHA;
    if (TIPODES = 22) then
        SELECT REPR_ID, PREF_PRE, REPR_NUMERO, REPR_FECHA FROM remision_proveedor WHERE REPR_CONSOLIDA = :IDC AND REPR_ANULADO = 'N' INTO :ID, :PREFIJO, :NUMERO, :FECHA;
    if (TIPODES = 23) then
        SELECT ORDC_ID, PREF_PRE, ORDC_NUMERO, ORDC_FECHA FROM ORDENES_COMPRA WHERE ORDC_CONSOLIDA = :IDC AND ORDC_ANULADO = 'N' INTO :ID, :PREFIJO, :NUMERO, :FECHA;
    if (TIPODES = 31) then
        SELECT FACT_ID, PREF_PRE, FACT_NUMERO, FACT_FECHA FROM FACTURAS WHERE FACT_CONSOLIDA = :IDC AND FACT_ANULADO = 'N' INTO :ID, :PREFIJO, :NUMERO, :FECHA;
    if (TIPODES = 32) then
        SELECT REVT_ID, PREF_PRE, REVT_NUMERO, REVT_FECHA FROM remisiones_venta WHERE REVT_CONSOLIDA = :IDC AND REVT_ANULADO = 'N' INTO :ID, :PREFIJO, :NUMERO, :FECHA;
    if (TIPODES = 34) then
        SELECT PEDI_ID, PREF_PRE, PEDI_NUMERO, PEDI_FECHA FROM PEDIDOS WHERE PEDI_CONSOLIDA = :IDC AND PEDI_ANULADO = 'N' INTO :ID, :PREFIJO, :NUMERO, :FECHA;
    suspend;
    END
tipodes = 33;
SELECT TIDO_NOMCORTO FROM tipo_documento WHERE TIDO_COD = :tipodes INTO :nomtipo;

if (tipoori = 31) then
    for select devt_id, pref_pre, devt_numero, devt_fecha from devoluciones_ventas where devt_factid = :idori and devt_anulado = 'N'
        into :ID, :PREFIJO, :NUMERO, :FECHA
        do
        suspend;
if (tipoori = 32) then
    for select devt_id, pref_pre, devt_numero, devt_fecha from devoluciones_ventas where devt_remid = :idori and devt_anulado = 'N'
        into :ID, :PREFIJO, :NUMERO, :FECHA
        do
        suspend;
end
^

SET TERM ; ^


/* devolucviones sobre remisiones */
SET TERM ^ ;

ALTER TRIGGER DEVOLUCIONES_VENTAS_DETALLE_AI
ACTIVE AFTER INSERT POSITION 0
AS
declare variable fec date;
declare variable CONC VARCHAR(60);
declare variable factor numeric(18,4);
declare variable Pref varchar(4);
declare variable Num varchar(6);
declare variable Nit varchar(20);
declare variable ID INTEGER;
declare variable ITEM INTEGER;
declare variable DEVUELTO NUMERIC(18,4);
declare variable CANT NUMERIC(18, 4);
declare variable CANTAUX NUMERIC(18, 4);
declare variable FACT VARCHAR(10);
declare variable COSTO NUMERIC(18,2);
declare variable devnof CHAR(2);
declare variable numrows INTEGER;
declare variable OK CHAR(1);
declare variable PEDAUTO CHAR(2);
declare variable IDPED INTEGER;
declare variable IDREM INTEGER;
declare variable devrem CHAR(2);
BEGIN
execute procedure lee_configuracion ('FACTURACION', 'DEVOLUCIONES', 'HACER DEVOLUCIONES SOBRE REMISIONES') returning_values (:devrem);
if ((NEW.devt_id <> 0) and (new.dvde_anulado = 'N')) then
    BEGIN
    ID = 0;
    select devt_fecha, pref_pre, devt_numero, terc_nit, devt_factura, devt_remid, DEVT_FACTID 
        from devoluciones_ventas where devt_id = new.devt_id into :fec, :Pref, :Num, :Nit, :Fact, :idrem, :ID;
    execute procedure factor_unidad_cant(new.arti_cod, new.dvde_unidad) returning_values(factor);
    CONC = 'DEVOLUCION VENTA No.' || PREF || NUM || ' - FACTURA ' || FACT;
    /* si la factura afecto el inventario, afectelo */
    execute procedure lee_configuracion ('FACTURACION', 'DEVOLUCIONES', 'PERMITIR DEVOLVER ITEMS NO FACTURADOS') returning_values (:devnof);
    if (devnof = 'SI') then
        OK = 'S';
    else
        BEGIN
        if (id <> 0) then
            begin
            /* verifique si afecto el inventario */
            select count(mvar_cons) from movimiento_articulo where mvar_tipodoc = 31 and mvar_idref = :id and arti_cod = new.arti_cod into :numrows;
            if (numrows > 0) then
                OK = 'S';
            else
                BEGIN
                /* busque remisiones que pudieron afectarlo */
                select sum(cofa_cant * cofa_factor) from consolidado_faltantes where cofa_tipoori = 32 and cofa_iddes = :id and cofa_tipodes = 31 and arti_cod = new.arti_cod and cofa_ok = 'S' into :cantaux;
                if (cantaux <> 0) then
                    OK = 'S';
                else
                    BEGIN
                    EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION','FACTURAS','GENERAR PEDIDO AUTOMATICAMENTE CON LA FACTURA') RETURNING_VALUES (PEDAUTO);
                    if (PEDAUTO = 'SI') then
                        BEGIN
                        SELECT PEDI_ID FROM PEDIDOS P, FACTURAS F WHERE P.PREF_PRE = F.pref_pre AND P.pedi_numero = F.fact_numero AND F.fact_id = :id INTO :IDped;
                        select sum(cofa_cant * cofa_factor) from consolidado_faltantes where cofa_tipoori = 34 and cofa_idori = :idped and cofa_tipodes = 32 and arti_cod = new.arti_cod and cofa_ok = 'S' into :cantaux;
                        if (cantaux <> 0) then
                            OK = 'S';
                        else
                            OK = 'N';
                        END
                    ELSE
                        OK = 'N';
                    END
                END
            end
        else
          if ((idrem <> 0) and (devrem = 'SI')) then
            begin
            /* verifique si afecto el inventario */
            select count(mvar_cons) from movimiento_articulo where mvar_tipodoc = 32 and mvar_idref = :idrem and arti_cod = new.arti_cod into :numrows;
            if (numrows > 0) then
                OK = 'S';
            else
                OK = 'N';
            end
        END
    if (OK = 'S') then
        begin
        /* calcule el costo al que salio o el promedio */
        execute procedure costo_promedio(new.arti_cod, :FEC) returning_values (:COSTO);
        INSERT INTO MOVIMIENTO_ARTICULO
            (ARTI_COD, MVAR_CONS, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF,
            MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM, TERC_NIT)
            VALUES(NEW.ARTI_COD, GEN_ID(ID_MOVARTI,1), NEW.BODE_COD, :FEC, 33, NEW.devt_id,
            :CONC, :factor * new.dvde_cant, :COSTO, 'S', new.dvde_lote, :Pref, :Num, new.dvde_item, :Nit);
        end
    /* ACTUALICE LO DEVUELTO EN LA FACTURA */
    if (ID <> 0) then
        BEGIN
        CANTAUX = NEW.dvde_cant * NEW.dvde_factor;
        FOR SELECT FADE_ITEM, FADE_CANT, FADE_FACTOR, FADE_DEVUELTO
            FROM FACTURAS_DETALLE
            WHERE FACT_ID = :ID AND ARTI_COD = NEW.ARTI_COD
            INTO :ITEM, :CANT, :FACTOR, :DEVUELTO
            DO
                BEGIN
                if (CANTAUX > 0) then
                    if ((CANT * FACTOR - DEVUELTO) < CANTAUX) then
                      BEGIN
                      UPDATE FACTURAS_DETALLE
                        SET FADE_DEVUELTO = (:CANT * :FACTOR)
                        WHERE FACT_ID = :ID AND FADE_ITEM = :ITEM AND ARTI_COD = NEW.ARTI_COD;
                      CANTAUX = CANTAUX - (CANT * FACTOR - DEVUELTO);
                      END
                    ELSE
                      BEGIN
                      UPDATE FACTURAS_DETALLE
                        SET FADE_DEVUELTO = FADE_DEVUELTO + :CANTAUX
                        WHERE FACT_ID = :ID AND FADE_ITEM = :ITEM AND ARTI_COD = NEW.ARTI_COD;
                      CANTAUX = 0;
                      END
                END
        if (CANTAUX > 0) then
            EXCEPTION DEVOLUCION_MAYOR 'Esta devolviendo una cantidad mayor a la facturada del articulo ' || new.arti_cod;
        END
    if ((idrem <> 0) and (devrem = 'SI')) then
        BEGIN
        CANTAUX = NEW.dvde_cant * NEW.dvde_factor;
        FOR SELECT RVDE_ITEM, RVDE_CANT, RVDE_FACTOR, RVDE_DEVUELTO
            FROM remisiones_venta_detalle
            WHERE REVT_ID = :idrem AND ARTI_COD = NEW.ARTI_COD
            INTO :ITEM, :CANT, :FACTOR, :DEVUELTO
            DO
                BEGIN
                if (CANTAUX > 0) then
                    if ((CANT * FACTOR - DEVUELTO) < CANTAUX) then
                      BEGIN
                      UPDATE remisiones_venta_detalle
                        SET RVDE_DEVUELTO = (:CANT * :FACTOR)
                        WHERE REVT_ID = :IDREM AND RVDE_ITEM = :ITEM AND ARTI_COD = NEW.ARTI_COD;
                      CANTAUX = CANTAUX - (CANT * FACTOR - DEVUELTO);
                      END
                    ELSE
                      BEGIN
                      UPDATE remisiones_venta_detalle
                        SET RVDE_DEVUELTO = RVDE_DEVUELTO + :CANTAUX
                        WHERE REVT_ID = :IDREM AND RVDE_ITEM = :ITEM AND ARTI_COD = NEW.ARTI_COD;
                      CANTAUX = 0;
                      END
                END
        if (CANTAUX > 0) then
            EXCEPTION DEVOLUCION_MAYOR 'Esta devolviendo una cantidad mayor a la remisionada del articulo ' || new.arti_cod;
        END
    END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE PROCEDURE RECALCULO_DEV_REMISION
as
declare variable ID INTEGER;
declare variable IDREM INTEGER;
declare variable ART VARCHAR(20);
declare variable ITEM INTEGER;
declare variable DEVUELTO NUMERIC(18,4);
declare variable CANT NUMERIC(18, 4);
declare variable CANTAUX NUMERIC(18, 4);
declare variable factor numeric(18,4);
begin
UPDATE REMISIONES_VENTA_DETALLE SET RVDE_DEVUELTO = 0 WHERE RVDE_DEVUELTO <> 0;
FOR SELECT V.DEVT_ID, DEVT_REMID, ARTI_COD, dvde_cant * dvde_factor
    FROM devoluciones_ventas V, devoluciones_ventas_detalle D
    WHERE V.devt_id = D.devt_id AND DEVT_REMID <> 0
    ORDER BY DEVT_FECHA, V.DEVT_ID
    INTO :ID, :IDREM, :ART, :CANTAUX
    DO
    BEGIN
    FOR SELECT RVDE_ITEM, RVDE_CANT, RVDE_FACTOR, RVDE_DEVUELTO
        FROM remisiones_venta_detalle
        WHERE REVT_ID = :idrem AND ARTI_COD = :ART
        INTO :ITEM, :CANT, :FACTOR, :DEVUELTO
        DO
        BEGIN
        if (CANTAUX > 0) then
            if ((CANT * FACTOR - DEVUELTO) < CANTAUX) then
                BEGIN
                UPDATE remisiones_venta_detalle
                    SET RVDE_DEVUELTO = (:CANT * :FACTOR)
                    WHERE REVT_ID = :IDREM AND RVDE_ITEM = :ITEM AND ARTI_COD = :ART;
                CANTAUX = CANTAUX - (CANT * FACTOR - DEVUELTO);
                END
            ELSE
                BEGIN
                UPDATE remisiones_venta_detalle
                    SET RVDE_DEVUELTO = RVDE_DEVUELTO + :CANTAUX
                    WHERE REVT_ID = :IDREM AND RVDE_ITEM = :ITEM AND ARTI_COD = :ART;
                CANTAUX = 0;
                END
        END
    END
end
^

SET TERM ; ^



/* previsualizacion por módulo*/

INSERT INTO CONFIGURACION (CONF_MODULO, CONF_CATEGORIA, CONF_PROPIEDAD, CONF_VALOR, CONF_POSIBLES, CONF_AYUDA) VALUES ('FACTURACION', 'GENERAL', 'PREVISUALIZAR IMPRESION DE DOCUMENTOS', 'SI', 'SI,NO', 'SI:Al imprimir cualquier documento aparece la opción preguntando el destino. NO:Imprime directamente a la impresora predeterminada.');
INSERT INTO CONFIGURACION (CONF_MODULO, CONF_CATEGORIA, CONF_PROPIEDAD, CONF_VALOR, CONF_POSIBLES, CONF_AYUDA) VALUES ('COMPRAS', 'GENERAL', 'PREVISUALIZAR IMPRESION DE DOCUMENTOS', 'SI', 'SI,NO', 'SI:Al imprimir cualquier documento aparece la opción preguntando el destino. NO:Imprime directamente a la impresora predeterminada.');
INSERT INTO CONFIGURACION (CONF_MODULO, CONF_CATEGORIA, CONF_PROPIEDAD, CONF_VALOR, CONF_POSIBLES, CONF_AYUDA) VALUES ('INVENTARIO', 'GENERAL', 'PREVISUALIZAR IMPRESION DE DOCUMENTOS', 'SI', 'SI,NO', 'SI:Al imprimir cualquier documento aparece la opción preguntando el destino. NO:Imprime directamente a la impresora predeterminada.');
INSERT INTO CONFIGURACION (CONF_MODULO, CONF_CATEGORIA, CONF_PROPIEDAD, CONF_VALOR, CONF_POSIBLES, CONF_AYUDA) VALUES ('CARTERA', 'GENERAL', 'PREVISUALIZAR IMPRESION DE DOCUMENTOS', 'SI', 'SI,NO', 'SI:Al imprimir cualquier documento aparece la opción preguntando el destino. NO:Imprime directamente a la impresora predeterminada.');
INSERT INTO CONFIGURACION (CONF_MODULO, CONF_CATEGORIA, CONF_PROPIEDAD, CONF_VALOR, CONF_POSIBLES, CONF_AYUDA) VALUES ('CXPAGAR', 'GENERAL', 'PREVISUALIZAR IMPRESION DE DOCUMENTOS', 'SI', 'SI,NO', 'SI:Al imprimir cualquier documento aparece la opción preguntando el destino. NO:Imprime directamente a la impresora predeterminada.');
INSERT INTO CONFIGURACION (CONF_MODULO, CONF_CATEGORIA, CONF_PROPIEDAD, CONF_VALOR, CONF_POSIBLES, CONF_AYUDA) VALUES ('BANCOS', 'GENERAL', 'PREVISUALIZAR IMPRESION DE DOCUMENTOS', 'SI', 'SI,NO', 'SI:Al imprimir cualquier documento aparece la opción preguntando el destino. NO:Imprime directamente a la impresora predeterminada.');
INSERT INTO CONFIGURACION (CONF_MODULO, CONF_CATEGORIA, CONF_PROPIEDAD, CONF_VALOR, CONF_POSIBLES, CONF_AYUDA) VALUES ('CAJA', 'GENERAL', 'PREVISUALIZAR IMPRESION DE DOCUMENTOS', 'SI', 'SI,NO', 'SI:Al imprimir cualquier documento aparece la opción preguntando el destino. NO:Imprime directamente a la impresora predeterminada.');

DELETE FROM CONFIGURACION WHERE (CONF_MODULO = 'GENERAL') AND (CONF_CATEGORIA = 'GENERAL') AND (CONF_PROPIEDAD = 'PREVISUALIZAR IMPRESION DE DOCUMENTOS');
COMMIT WORK;

/* mover formato */
SET TERM ^ ;

CREATE OR ALTER PROCEDURE MOVER_FORMATO(
    TIPO INTEGER,
    PREFI VARCHAR(4),
    POSICIONES INTEGER,
    DESDE INTEGER,
    HASTA INTEGER,
    ACCION CHAR(1))
AS
begin
    if (accion = 'R') THEN
    begin
    UPDATE FORMATO_DATOS SET DAFO_POSX = DAFO_POSX + :posiciones WHERE TIDO_COD = :tipo AND PREF_PRE = :prefi AND DAFO_POSX >= :DESDE AND DAFO_POSX <= :HASTA;
    UPDATE FORMATO_LINEAS SET FOLI_POSX = FOLI_POSX + :posiciones WHERE TIDO_COD = :tipo AND PREF_PRE = :prefi AND FOLI_POSX >= :DESDE AND FOLI_POSX <= :HASTA;
    end

    if (accion = 'L') THEN
    begin
    UPDATE FORMATO_DATOS SET DAFO_POSX = DAFO_POSX - :posiciones WHERE TIDO_COD = :tipo AND PREF_PRE = :prefi AND DAFO_POSX >= :DESDE AND DAFO_POSX <= :HASTA;
    UPDATE FORMATO_LINEAS SET FOLI_POSX = FOLI_POSX - :posiciones WHERE TIDO_COD = :tipo AND PREF_PRE = :prefi AND FOLI_POSX >= :DESDE AND FOLI_POSX <= :HASTA;
    end

    if (accion = 'U') THEN
    begin
    UPDATE FORMATO_DATOS SET DAFO_POSY = DAFO_POSY - :posiciones WHERE TIDO_COD = :tipo AND PREF_PRE = :prefi AND DAFO_POSY >= :DESDE AND DAFO_POSY <= :HASTA;
    UPDATE FORMATO_LINEAS SET FOLI_POSY = FOLI_POSY - :posiciones WHERE TIDO_COD = :tipo AND PREF_PRE = :prefi AND FOLI_POSY >= :DESDE AND FOLI_POSY <= :HASTA;
    end

    if (accion = 'D') THEN
    begin
    UPDATE FORMATO_DATOS SET DAFO_POSY = DAFO_POSY + :posiciones WHERE TIDO_COD = :tipo AND PREF_PRE = :prefi AND DAFO_POSY >= :DESDE AND DAFO_POSY <= :HASTA;
    UPDATE FORMATO_LINEAS SET FOLI_POSY = FOLI_POSY + :posiciones WHERE TIDO_COD = :tipo AND PREF_PRE = :prefi AND FOLI_POSY >= :DESDE AND FOLI_POSY <= :HASTA;
    end

    if (accion = 'C') THEN
    begin
    UPDATE FORMATO_DATOS SET DAFO_POSY = DAFO_POSY *2 WHERE TIDO_COD = :tipo AND PREF_PRE = :prefi AND DAFO_POSY >= :DESDE AND DAFO_POSY <= :HASTA;
    UPDATE FORMATO_LINEAS SET FOLI_POSY = FOLI_POSY *2 WHERE TIDO_COD = :tipo AND PREF_PRE = :prefi AND FOLI_POSY >= :DESDE AND FOLI_POSY <= :HASTA;
    end

    if (accion = 'X') THEN
    begin
    UPDATE FORMATO_DATOS SET DAFO_POSX = DAFO_POSX *2 WHERE TIDO_COD = :tipo AND PREF_PRE = :prefi AND DAFO_POSX >= :DESDE AND DAFO_POSX <= :HASTA;
    UPDATE FORMATO_LINEAS SET FOLI_POSX = FOLI_POSX *2 WHERE TIDO_COD = :tipo AND PREF_PRE = :prefi AND FOLI_POSX >= :DESDE AND FOLI_POSX <= :HASTA;
    end

    if (accion = 'M') THEN
    begin
    UPDATE FORMATO_DATOS SET DAFO_POSY = DAFO_POSY /2 WHERE TIDO_COD = :tipo AND PREF_PRE = :prefi AND DAFO_POSY >= :DESDE AND DAFO_POSY <= :HASTA;
    UPDATE FORMATO_LINEAS SET FOLI_POSY = FOLI_POSY /2 WHERE TIDO_COD = :tipo AND PREF_PRE = :prefi AND FOLI_POSY >= :DESDE AND FOLI_POSY <= :HASTA;
    end

    if (accion = 'Y') THEN
    begin
    UPDATE FORMATO_DATOS SET DAFO_POSX = DAFO_POSX /2 WHERE TIDO_COD = :tipo AND PREF_PRE = :prefi AND DAFO_POSX >= :DESDE AND DAFO_POSX <= :HASTA;
    UPDATE FORMATO_LINEAS SET FOLI_POSX = FOLI_POSX /2 WHERE TIDO_COD = :tipo AND PREF_PRE = :prefi AND FOLI_POSX >= :DESDE AND FOLI_POSX <= :HASTA;
    end
end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER PROCEDURE IMPR_EGRESO(
    ID INTEGER)
RETURNS (
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    NIT VARCHAR(20),
    NOMBRE VARCHAR(60),
    DIR VARCHAR(60),
    CIU VARCHAR(40),
    TEL VARCHAR(40),
    CONCEPTO VARCHAR(60),
    MONTO NUMERIC(18,2),
    RTFTE NUMERIC(18,2),
    RTIVA NUMERIC(18,2),
    RTICA NUMERIC(18,2),
    DSCTO NUMERIC(18,2),
    OBS BLOB SUB_TYPE 1 SEGMENT SIZE 80,
    ITEMDOC INTEGER,
    TIPODOC VARCHAR(8),
    PREFDOC VARCHAR(4),
    NUMDOC VARCHAR(6),
    NUMPRV VARCHAR(10),
    ABONODOC NUMERIC(18,2),
    RTFTEDOC NUMERIC(18,2),
    RTIVADOC NUMERIC(18,2),
    RTICADOC NUMERIC(18,2),
    DSCTODOC NUMERIC(18,2),
    SALDODOC NUMERIC(18,2),
    SALDOPROV NUMERIC(18,2),
    ANTERDOC NUMERIC(18,2))
AS
declare variable NUMROWS INTEGER;
declare variable TIPO integer;
declare variable IDDOC INTEGER;
BEGIN
  SELECT PREF_PRE, EGRE_NUMERO, EGRE_FECHA, EGRE_CONC,
        E.TERC_NIT, EGRE_NOMTERC, TERC_DIR, TERC_CIU, TERC_TEL,
        EGRE_MONTO, EGRE_RTFTEMONTO, EGRE_RTIVAMONTO, EGRE_RTICAMONTO, EGRE_DTOF,
        EGRE_OBS
    FROM EGRESOS E, TERCEROS T
    WHERE E.TERC_NIT = T.TERC_NIT AND E.EGRE_ID = :ID
    INTO :PREFIJO, :NUMERO, :FECHA, :CONCEPTO, 
        :NIT, :NOMBRE, :DIR, :CIU, :TEL,
        :MONTO, :RTFTE, :RTIVA, :RTICA, :DSCTO,
        :OBS;
  select SALDO from saldo_proveedor(:NIT, :FECHA+1) into :SALDOPROV;
  /*EXECUTE PROCEDURE saldo_proveedor(:NIT, (CAST('FECHA'+1 AS DATE))) returning_values (:SALDOPROV);*/
  SELECT COUNT(EGDE_ITEM) FROM EGRESOS_DETALLE
    WHERE EGRE_ID = :ID INTO :NUMROWS;
  if (NUMROWS > 0) then
    FOR SELECT EGDE_ITEM, EGDE_TIPODOC, TIDO_NOMCORTO, EGDE_IDDOC, EGDE_PREFIJO, EGDE_NUMERO, EGDE_ABONO, EGDE_RTFTE, EGDE_RTIVA, EGDE_RTICA, EGDE_DTOF
        FROM EGRESOS_DETALLE ED, TIPO_DOCUMENTO TD
        WHERE TD.TIDO_COD = ED.EGDE_TIPODOC AND ED.EGRE_ID = :ID
        order by egde_item
        INTO :ITEMDOC, :TIPO, :TIPODOC, :IDDOC, :PREFDOC, :NUMDOC, :ABONODOC, :RTFTEDOC, :RTIVADOC, :RTICADOC, :DSCTODOC
        DO
            BEGIN
            if (TIPO = 21) then
                SELECT FACO_NUMPROV FROM FACTURAS_COMPRA WHERE FACO_ID = :iddoc INTO :numprv;
            ELSE
                if (TIPO = 51) then
                    SELECT NDPR_NUMPROV FROM NOTAS_DEBITO_PROVEEDOR WHERE NDPR_ID = :iddoc INTO :numprv;
                ELSE
                    numprv = numdoc;
            EXECUTE PROCEDURE saldo_doc_cxpagar(:TIPO, :IDDOC, :FECHA) returning_values (:SALDODOC);
            ANTERDOC = SALDODOC + RTFTEDOC + RTIVADOC + RTICADOC + ABONODOC + DSCTODOC;
            SUSPEND;
            END
  else
    BEGIN
    SALDOPROV = 0;
    ANTERDOC = 0;
    SALDODOC = 0;
    RTFTEDOC = 0;
    RTIVADOC = 0;
    RTICADOC = 0;
    ABONODOC = 0;
    DSCTODOC = 0;
    numprv = '';
    SUSPEND;
    END
END
^

SET TERM ; ^


/* configuracion del tamaño del paquete de datos */

INSERT INTO CONFIGURACION (CONF_MODULO, CONF_CATEGORIA, CONF_PROPIEDAD, CONF_VALOR, CONF_POSIBLES, CONF_AYUDA) VALUES ('GENERAL', 'GENERAL', 'NUMERO DE REGISTROS A TRANSMITIR SIMULTANEAMENTE', '500', '100,250,500,1000,2000', 'Indique el tamaño del paquete de registros que se transmiten entre el servidor y las terminales');
commit work;

/* inactivar terceros */
ALTER TABLE TERCEROS
ADD TERC_ESTADO CHAR(1);

SET TERM ^ ;

CREATE OR ALTER TRIGGER TERCEROS_BI FOR TERCEROS
ACTIVE BEFORE INSERT POSITION 0
as
begin
if (NEW.terc_tipoid IS NULL) then
    NEW.terc_tipoid = 'J';
if (NEW.terc_clie IS NULL) then
    NEW.terc_clie = 'N';
if (NEW.terc_prov IS NULL) then
    NEW.terc_prov = 'N';
if (NEW.terc_empl IS NULL) then
    NEW.terc_empl = 'N';
if (NEW.terc_estado IS NULL) then
    NEW.terc_estado = 'S';
SELECT SUBSTR(CIUD_NOM,1,40) FROM CIUDADES WHERE CIUD_COD = NEW.ciud_cod INTO NEW.terc_ciu;
end
^

SET TERM ; ^


UPDATE TERCEROS SET TERC_ESTADO = 'S';
COMMIT WORK;

SET TERM ^ ;

CREATE OR ALTER TRIGGER TERCEROS_AU FOR TERCEROS
ACTIVE AFTER UPDATE POSITION 0
as
declare variable NUMROWS INTEGER;
begin
/* SI ES CLIENTE Y SE INACTIVA LO INACTIVA COMO CLIENTE */
if ((NEW.terc_estado = 'N') AND (OLD.terc_estado = 'S')) then
    UPDATE CLIENTES SET CLIE_ESTADO = 'I' WHERE TERC_NIT = NEW.terc_nit;

/* SI TIENE UNA SOLA SUCURSAL ACTUALICELA AL CAMBIAR EL PRINCIPAL */
SELECT COUNT(CLCU_COD) FROM CLIENTE_SUCURSALES WHERE TERC_NIT = NEW.terc_nit INTO :NUMROWS;
if (NUMROWS = 1) then
    BEGIN
    UPDATE cliente_sucursales
        SET CLSU_NOMBRE = new.terc_nom,
            CLSU_DIR = new.terc_dir,
            CLSU_CIUDAD = new.terc_ciu,
            CLSU_TEL = new.terc_tel
        WHERE TERC_NIT = NEW.TERC_NIT AND CLCU_COD = '01';
    END
  INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
    VALUES (USER, 102, 1, 'U', NEW.terc_nit);
end
^

SET TERM ; ^


/* inactivar ciudades */
ALTER TABLE CIUDADES
ADD CIUD_ACTIVA T_BOOLEANO;

UPDATE CIUDADES SET CIUD_ACTIVA = 'S';
COMMIT WORK;

/* 1 autorizacion varios prefijos */
SET TERM ^ ;

CREATE OR ALTER TRIGGER AUTORIZACIONES_BI FOR AUTORIZACIONES
ACTIVE BEFORE INSERT POSITION 0
AS
declare variable numrows integer;
BEGIN
  execute procedure COMPLETA_CEROS(NEW.auto_inicial) returning_values (NEW.auto_inicial);
  execute procedure COMPLETA_CEROS(NEW.auto_final) returning_values (NEW.auto_final);
  if (new.auto_contado is null) then
    new.auto_contado = 'N';
  select count(*) from autorizaciones where pref_pre = new.pref_pre and auto_numero = new.auto_numero into :numrows;
  if (numrows > 0) then
    exception autorizacion_ya_existe 'Ya existe una autorización con el No. ' || new.auto_numero || ' para el prefijo ' || new.pref_pre;
END
^

SET TERM ; ^


/* validar numero del documento relacionado */

INSERT INTO CONFIGURACION (CONF_MODULO, CONF_CATEGORIA, CONF_PROPIEDAD, CONF_VALOR, CONF_POSIBLES, CONF_AYUDA) VALUES ('FACTURACION', 'FACTURAS', 'VALIDAR NUMERO DEL PEDIDO', 'NO', 'SI,NO', 'SI: El número de pedido digitado debe estar previamente registrado obligatoriamente. NO: El dato pedido puede digitarse de manera informativa');
INSERT INTO CONFIGURACION (CONF_MODULO, CONF_CATEGORIA, CONF_PROPIEDAD, CONF_VALOR, CONF_POSIBLES, CONF_AYUDA) VALUES ('FACTURACION', 'FACTURAS', 'VALIDAR NUMERO DE LA REMISION', 'NO', 'SI,NO', 'SI: El número de remisión digitado debe estar previamente registrado obligatoriamente. NO: El dato pedido puede digitarse de manera informativa');
INSERT INTO CONFIGURACION (CONF_MODULO, CONF_CATEGORIA, CONF_PROPIEDAD, CONF_VALOR, CONF_POSIBLES, CONF_AYUDA) VALUES ('FACTURACION', 'REMISIONES', 'VALIDAR NUMERO DEL PEDIDO', 'NO', 'SI,NO', 'SI: El número de pedido digitado debe estar previamente registrado obligatoriamente. NO: El dato pedido puede digitarse de manera informativa');
INSERT INTO CONFIGURACION (CONF_MODULO, CONF_CATEGORIA, CONF_PROPIEDAD, CONF_VALOR, CONF_POSIBLES, CONF_AYUDA) VALUES ('FACTURACION', 'REMISIONES', 'VALIDAR NUMERO DE LA FACTURA', 'NO', 'SI,NO', 'SI: El número de factura digitado debe estar previamente registrado obligatoriamente. NO: El dato pedido puede digitarse de manera informativa');

/* aviso de cambio de precios */

INSERT INTO CONFIGURACION (CONF_MODULO, CONF_CATEGORIA, CONF_PROPIEDAD, CONF_VALOR, CONF_POSIBLES, CONF_AYUDA) VALUES ('FACTURACION', 'ARTICULOS', 'DIFERENCIA EN PESOS MAXIMA A PERMITIR PARA CAMBIAR PRECIOS', '1', '1,10,50,100', 'Indique el monto de la diferencia en pesos entre el precio calculado y el vigente que permitira el sistema antes de sugerir cambiar un precio');
COMMIT WORK;

/* contabilizacion de retencion por articulo */
ALTER TABLE CONTABIL_ARTICULO
ADD COAR_RTBASE T_MONTO;

INSERT INTO CONFIGURACION (CONF_MODULO, CONF_CATEGORIA, CONF_PROPIEDAD, CONF_VALOR, CONF_POSIBLES, CONF_AYUDA) VALUES ('FACTURACION', 'DOCUMENTOS', 'CALCULAR RETENCIONES POR ARTICULO', 'NO', 'SI,NO', 'SI: Calcula la retención en la fuente y de ICA con base en los artículos sin usar el porcentaje del pie del documento ni la tareifa y base del cliente. NO: Calcula las retenciones de acuerdo a las tarifas y bases del cliente');
commit work;

SET TERM ^ ;

CREATE OR ALTER PROCEDURE CONTABIL_FACTURA(
    IDDOC INTEGER,
    IDINTER INTEGER)
RETURNS (
    ERROR INTEGER,
    VER CHAR(1),
    IDC INTEGER)
AS
declare variable pref varchar(4);
declare variable num varchar(6);
declare variable numero varchar(10);
declare variable fecaux date;
declare variable fecha char(8);
declare variable conc varchar(60);
declare variable venceaux date;
declare variable vence char(8);
declare variable vrdto numeric(18,2);
declare variable vradic numeric(18,2);
declare variable vrsubt numeric(18,2);
declare variable vriva numeric(18,2);
declare variable prtfte numeric(9,2);
declare variable vrrtfte numeric(18,2);
declare variable vrrtiva numeric(18,2);
declare variable prtica numeric(9,2);
declare variable vrrtica numeric(18,2);
declare variable vrtotal numeric(18,2);
declare variable vrextra numeric(18,2);
declare variable tipocomp varchar(3);
declare variable prefcont varchar(4);
declare variable ventas char(1);
declare variable ctaventas varchar(20);
declare variable iva char(1);
declare variable ctaiva varchar(20);
declare variable consumo char(1);
declare variable ctaconsumo varchar(20);
declare variable cartera char(1);
declare variable ctacartera varchar(20);
declare variable rtfte char(1);
declare variable ctartfte varchar(20);
declare variable rtiva char(1);
declare variable ctartiva varchar(20);
declare variable rtica char(1);
declare variable ctartica varchar(20);
declare variable inven char(1);
declare variable ctainven varchar(20);
declare variable costos char(1);
declare variable ctacostos varchar(20);
declare variable ctadto varchar(20);
declare variable ctaadic varchar(20);
declare variable ctaextra varchar(20);
declare variable existe char(1);
declare variable cuenta varchar(20);
declare variable monto numeric(18,2);
declare variable tipocuen char(1);
declare variable nit varchar(20);
declare variable nombre varchar(60);
declare variable proy varchar(4);
declare variable centro varchar(4);
declare variable porc numeric(5,2);
declare variable debito numeric(18,2);
declare variable credito numeric(18,2);
declare variable nroi integer;
declare variable art varchar(15);
declare variable imptos numeric(18,2);
declare variable suma numeric(18,2);
declare variable porciva numeric(9,2);
declare variable tctaclien varchar(20);
declare variable tctaventa varchar(20);
declare variable tctartfte varchar(20);
declare variable tctartiva varchar(20);
declare variable tctartica varchar(20);
declare variable ctadic varchar(20);
declare variable baseadic varchar(20);
declare variable porcadic numeric(5,2);
declare variable valoradic numeric(18,2);
declare variable dbadic char(1);
declare variable ptovta integer;
declare variable anulado char(1);
declare variable dig integer;
declare variable mercancia numeric(18,2);
declare variable fomento varchar(2);
declare variable DTOXIT varchar(2);
declare variable vrconsumo numeric(18,2);
declare variable factor double precision;
declare variable cent char(1);
declare variable AUTORET VARCHAR(10);
declare variable FAUTORET DATE;
declare variable ERRORC INTEGER;
BEGIN
EXECUTE PROCEDURE LEE_CONFIGURACION('COMPRAS', 'FACTURAS', 'USAR IMPOCONSUMO COMO PORCENTAJE DE FOMENTO') returning_values (FOMENTO);
EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'FECHA AUTORETENEDOR NO DESCONTAR RETENCIONES DEL SALDO PERO SI CONTABILIZARLAS') returning_values (AUTORET);
if (AUTORET <> '') then
    FAUTORET = CAST(AUTORET AS DATE);
else
    FAUTORET = '9999/12/31';
/* BUSQUE LA INTERFACE */
EXISTE = 'N';
SELECT 'S', TICO_COD, PRCO_PRE, INVE_VENTAS, INVE_IVA, INVE_CONSUMO, INVE_CARTERA, INVE_RTFTE, INVE_RTIVA, INVE_RTICA, INVE_COSTO, INVE_INVEN, INVE_CTAVENTAS, INVE_CTAIVA, INVE_CTACONSUMO, INVE_CTADTO, INVE_CTAADIC, INVE_CTAEXTRA, INVE_CTACARTERA, INVE_CTARTFTE, INVE_CTARTIVA, INVE_CTARTICA, INVE_CTAINVEN, INVE_CTACOSTOS, INVE_CONFIRMAR, INVE_CENTRO
    FROM INTERFAZ_VENTAS
    WHERE INVE_ID = :IDINTER
    INTO :EXISTE, :TIPOCOMP, :PREFCONT, :VENTAS, :IVA, :CONSUMO, :CARTERA, :RTFTE, :RTIVA, :RTICA, :COSTOS, :INVEN, :CTAVENTAS, :CTAIVA, :CTACONSUMO, :CTADTO, :CTAADIC, :CTAEXTRA, :CTACARTERA, :CTARTFTE, :CTARTIVA, :CTARTICA, :CTAINVEN, :CTACOSTOS, :VER, :CENT;
if (EXISTE = 'S') then
  BEGIN
    /* BORRE CUALQUEIR CONTABILIZACION PREVIA */
    DELETE FROM CONTABILIZACION WHERE CNTB_TIPOREF = 31 AND CNTB_IDREF = :IDDOC;

  /* TRAIGA EL ENCABEZADO DE LA FACTURA */
  SELECT PREF_PRE, FACT_NUMERO, FACT_FECHA, F.TERC_NIT, PTVT_ID, FACT_VENCE, FACT_DTOMONTO, FACT_ADICIONAL, FACT_IVAMONTO, FACT_EXTRA, FACT_TOTAL, FACT_RTFTEPOR, FACT_RTFTEMONTO, FACT_RTIVAPOR, FACT_RTIVAMONTO, FACT_RTICAPOR, FACT_RTICAMONTO, FACT_NOMCLIENTE, TERC_CTARTFTE, TERC_CTARTIVA, TERC_CTARTICA, TERC_CTAVENTA, TERC_CTACLIENTE, FACT_ANULADO
        FROM FACTURAS F, TERCEROS T
        WHERE FACT_ID = :IDDOC AND F.TERC_NIT = T.TERC_NIT
        INTO :PREF, :NUM, :FECAUX, :NIT, :PTOVTA, :VENCEAUX, :VRDTO, :VRADIC, :VRIVA, :VREXTRA, :VRTOTAL, :PRTFTE, :VRRTFTE, :PORC, :VRRTIVA, :PRTICA, :VRRTICA, :NOMBRE, TCTARTFTE, TCTARTIVA, TCTARTICA, TCTAVENTA, TCTACLIEN, ANULADO;
  if (ANULADO = 'N') then
    BEGIN
    /* BUSQUE EL CENTRO DEL PUNTO, LA BODEGA, O EL PREFIJO  */
    IF (CENT = 'B') THEN
        SELECT B.BODE_CENTRO, B.BODE_PROY FROM BODEGA B, FACTURAS F
            WHERE B.BODE_COD = F.BODE_COD AND F.FACT_ID = :IDDOC INTO :CENTRO, :PROY;
    IF (CENT = 'V') THEN
        SELECT V.CENT_COD, V.PROY_COD FROM VENDEDORES V, FACTURAS F
            WHERE V.VEND_COD = F.VEND_COD AND F.FACT_ID = :IDDOC INTO :CENTRO, :PROY;
    IF (CENT = 'P') THEN
        SELECT P.PREF_CENTRO,P.PREF_PROY  FROM PREFIJOS P, FACTURAS F
            WHERE P.PREF_PRE = F.PREF_PRE AND F.FACT_ID = :IDDOC AND P.TIDO_COD = 31 INTO :CENTRO, :PROY;
    NUMERO = PREF || NUM;
    SELECT SUM (FADE_CONSUMO) FROM FACTURAS_DETALLE WHERE FACT_ID = :IDDOC INTO MERCANCIA;
    VRSUBT = VRTOTAL - VREXTRA - VRIVA - MERCANCIA; /* BASE DE RETEFTE Y RETEICA */

    EXECUTE PROCEDURE lee_configuracion ('FACTURACION', 'FACTURAS', 'DESCUENTO PIE FACTURA IGUAL A SUMA DE DESCUENTOS POR ITEM') returning_values (:DTOXIT);
    if (DTOXIT = 'SI') then
        VRDTO = 0;
    MERCANCIA = VRSUBT - VRADIC + VRDTO;
    EXECUTE PROCEDURE FECHA_A_CONTA(:FECAUX) returning_values (:FECHA);
    EXECUTE PROCEDURE FECHA_A_CONTA(:VENCEAUX) returning_values (:VENCE);
    /* REGISTRE EL ENCABEZADO CONTABLE */
    IDC = GEN_ID(ID_CONTABILIZA, 1);
    if (STRLEN(NOMBRE)> 43 ) then
      CONC = 'FV No.' || NUMERO || '-' || SUBSTR(NOMBRE,1,43);
    ELSE
      CONC = 'FV No.' || NUMERO || '-' || NOMBRE;
    INSERT INTO CONTABILIZACION (CNTB_ID, CNTB_TIPOCOMP, CNTB_PREFCNT, CNTB_NUMERO, CNTB_FECHA, CNTB_CONCEPTO, CNTB_REF, CNTB_TIPOREF, CNTB_IDREF, CNTB_PREFREF, CNTB_NUMREF, CNTB_PROCESADO)
        VALUES (:IDC, :TIPOCOMP, :PREFCONT, :NUM, :FECHA, :CONC, '', 31, :IDDOC, :PREF, :NUM, 'N');
    NROI = 0;
    SUMA = 0;
    ERROR = 0;
    /* SI NO HAY CUENTA DE DESCUENTO NI ADICIONAL CALCULE UN FACTOR PARA LAS VENTAS Y EL IVA */
    if (MERCANCIA <> 0) then
        FACTOR = CAST(VRSUBT AS DOUBLE PRECISION) / CAST(MERCANCIA AS DOUBLE PRECISION);
    ELSE
        FACTOR = 1;
    /* TRAIGA EL NUMERO DE DIGITOS PARA EL REDONDEO */
    SELECT CAST(CONF_VALOR AS INTEGER) FROM CONFIGURACION WHERE CONF_MODULO = 'FACTURACION' AND
        CONF_CATEGORIA = 'GENERAL' AND CONF_PROPIEDAD = 'REDONDEO AL MULTIPLO DE DIEZ EN TOTALES' INTO :DIG;
    /* CUENTAS DE VENTAS */
    if (VENTAS = 'A') then
        BEGIN
        FOR SELECT MAX(COAR_CTAVNT), SUM(FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), SUM(FADE_IVAMONTO), SUM(FADE_CONSUMO)
            FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_DETALLE F
            WHERE F.FACT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD
            GROUP BY COAR_CTAVNT
            INTO :CTAVENTAS, :MONTO, :IMPTOS, :VRCONSUMO
            DO
            BEGIN
            if (FOMENTO = 'SI') then
                MONTO = MONTO + VRCONSUMO;
            if ((CTADTO IS NULL) OR (CTADTO = '')) then
                MONTO = MONTO * FACTOR;
            execute procedure redondee(MONTO, DIG) returning_values (MONTO);
            if (MONTO <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTAVENTAS, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT F.ARTI_COD, (FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), FADE_CONSUMO
                        FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_DETALLE F
                        WHERE F.FACT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTAINV = :CUENTA
                        INTO :ART, :MONTO, :IMPTOS
                    DO
                        BEGIN
                        if (FOMENTO = 'SI') then
                            MONTO = MONTO + IMPTOS;
                        if ((CTADTO IS NULL) OR (CTADTO = '')) then
                            MONTO = MONTO * FACTOR;
                        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                        if (MONTO <> 0) then
                            BEGIN
                            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                            NROI = NROI + 1;
                            SUMA = SUMA - MONTO;
                            END
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    NROI = NROI + 1;
                    SUMA = SUMA - MONTO;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA - MONTO;
                    END
                END /* MONTO <> 0 */
            END /* FOR */
        END /* VENTAS X ARTICULO */
     IF ((VENTAS = 'C') OR (VENTAS = 'K')) THEN
        BEGIN
        IF (VENTAS = 'C') THEN
            CTAVENTAS = TCTAVENTA;
        SELECT SUM(FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), SUM(FADE_IVAMONTO), SUM (FADE_CONSUMO)
            FROM FACTURAS_DETALLE F
            WHERE F.FACT_ID = :IDDOC 
            INTO :MONTO, :IMPTOS, :VRCONSUMO;
        if (FOMENTO = 'SI') then
            MONTO = MONTO + VRCONSUMO;
        if ((CTADTO IS NULL) OR (CTADTO = '')) then
            MONTO = MONTO * FACTOR;
        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
        if (MONTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTAVENTAS, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT F.ARTI_COD, (FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), FADE_CONSUMO
                    FROM ARTICULO A, FACTURAS_DETALLE F
                    WHERE F.FACT_ID = :IDDOC 
                    INTO :ART, :MONTO, :IMPTOS
                    DO
                    BEGIN
                    if (FOMENTO = 'SI') then
                        MONTO = MONTO + VRCONSUMO;
                    if ((CTADTO IS NULL) OR (CTADTO = '')) then
                        MONTO = MONTO * FACTOR;
                    execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                    if (MONTO <> 0) then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        SUMA = SUMA - MONTO;
                        END
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - MONTO;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - MONTO;
                END
            END /* MONTO <> 0 */
        END /* VENTAS DE CLIENTE O CONSTANTE */
    /* EL IVA EN VENTAS */
    if (IVA = 'A') then
        BEGIN
        FOR SELECT MAX(COAR_CTAIVAV), SUM(FADE_IVAMONTO), SUM(FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), sum(FADE_CONSUMO)
            FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_DETALLE F
            WHERE F.FACT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD
            GROUP BY COAR_CTAIVAV
            INTO :CTAIVA, :IMPTOS, :MONTO, :VALORADIC
        DO
            BEGIN
            if (FOMENTO = 'SI') then
                MONTO = MONTO + VALORADIC;
            MONTO = MONTO * -1;
            MONTO = MONTO * FACTOR;
            IMPTOS = IMPTOS * FACTOR;
            execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
            execute procedure redondee(MONTO, DIG) returning_values (MONTO);
            if (IMPTOS <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTAIVA, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT F.ARTI_COD, FADE_IVAMONTO, (FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), TAIV_PORC, FADE_CONSUMO
                        FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_DETALLE F, TARIFA_IVA T
                        WHERE F.FACT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTAIVAV = :CUENTA AND A.TAIV_COD = T.TAIV_COD
                        INTO :ART, :IMPTOS, :MONTO, :PORCIVA, :VALORADIC
                    DO
                        BEGIN
                        if (FOMENTO = 'SI') then
                            MONTO = MONTO + VALORADIC;
                        MONTO = MONTO * -1;
                        MONTO = MONTO * FACTOR;
                        IMPTOS = IMPTOS * FACTOR;
                        execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                        if (IMPTOS <> 0) then
                            BEGIN
                            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, :MONTO, :PORCIVA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                            NROI = NROI + 1;
                            SUMA = SUMA + DEBITO - CREDITO;
                            END
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, :MONTO, ABS(:IMPTOS*100/:MONTO), :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    NROI = NROI + 1;
                    SUMA = SUMA - IMPTOS;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, :MONTO, ABS(:IMPTOS*100/:MONTO), :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA - IMPTOS;
                    END
                END   /* IMPTOS <> 0 */
            END /* FOR */
        END /* IVA X ARTICULO */
    if (IVA = 'K') then /* IVA EN CTA CONSTANTE */
        BEGIN
        SELECT SUM(FADE_IVAMONTO), SUM(FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), SUM(FADE_CONSUMO)
            FROM FACTURAS_DETALLE F
            WHERE F.FACT_ID = :IDDOC and FADE_IVAMONTO <> 0
            INTO :IMPTOS, :MONTO, :valoradic;
        if (FOMENTO = 'SI') then
            MONTO = MONTO + VALORADIC;
        MONTO = MONTO * -1;
        MONTO = MONTO * FACTOR;
        IMPTOS = IMPTOS * FACTOR;
        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
        execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
        if (IMPTOS <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTAIVA, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT F.ARTI_COD, (FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), FADE_IVAMONTO, TAIV_PORC, FADE_CONSUMO
                    FROM ARTICULO A, FACTURAS_DETALLE F, TARIFA_IVA T
                    WHERE F.FACT_ID = :IDDOC AND A.TAIV_COD = T.TAIV_COD
                    INTO :ART, :MONTO, :IMPTOS, :PORCIVA, :VALORADIC
                    DO
                    BEGIN
                    if (FOMENTO = 'SI') then
                        MONTO = MONTO + VALORADIC;
                    MONTO = MONTO * -1;
                    MONTO = MONTO * FACTOR;
                    IMPTOS = IMPTOS * FACTOR;
                    execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                    execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                    if (IMPTOS <> 0) then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', 0, :IMPTOS, :MONTO, :PORCIVA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        SUMA = SUMA - IMPTOS;
                        END
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', 0, :IMPTOS, :MONTO, ABS(:IMPTOS*100/:MONTO), :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - IMPTOS;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', 0, :IMPTOS, :MONTO, ABS(:IMPTOS*100/:MONTO), :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - IMPTOS;
                END
            END /* IMPTOS <> 0 */
        END /* IVA EN CTA CONSTANTE */
    /* EL IMPOCONSUMO */
    if ((CONSUMO = 'A') AND (FOMENTO <> 'SI')) then
        BEGIN
        FOR SELECT MAX(COAR_CTACONS), SUM(FADE_CONSUMO)
            FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_DETALLE F
            WHERE F.FACT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD
            GROUP BY COAR_CTACONS
            INTO :CTACONSUMO, :IMPTOS
        DO
            BEGIN
            execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
            if (IMPTOS <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTACONSUMO, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, REGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT F.ARTI_COD, FADE_CONSUMO
                        FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_DETALLE F
                        WHERE F.FACT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTACONS = :CUENTA
                        INTO :ART, :IMPTOS
                    DO
                        BEGIN
                        execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                        if (IMPTOS <> 0) then
                            BEGIN
                            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                            NROI = NROI + 1;
                            SUMA = SUMA - IMPTOS;
                            END
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    NROI = NROI + 1;
                    SUMA = SUMA - IMPTOS;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA - IMPTOS;
                    END
                END /* IMPTOS <> 0 */
            END /* FOR */
        END /* CONSUMO X ARTICULO */
    if ((CONSUMO = 'K') AND (FOMENTO <> 'SI')) then /* CONSUMO EN CTA CONSTANTE */
        BEGIN
        SELECT SUM(FADE_CONSUMO)
            FROM FACTURAS_DETALLE F
            WHERE F.FACT_ID = :IDDOC 
            INTO :IMPTOS;
        execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
        if (IMPTOS <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTACONSUMO, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT F.ARTI_COD, FADE_CONSUMO
                    FROM ARTICULO A, FACTURAS_DETALLE F
                    WHERE F.FACT_ID = :IDDOC 
                    INTO :ART, :IMPTOS
                    DO
                    BEGIN
                    execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                    if (IMPTOS <> 0) then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CTACONSUMO, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        SUMA = SUMA - IMPTOS;
                        END
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTACONSUMO, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - IMPTOS;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTACONSUMO, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - IMPTOS;
                END
            END /* IMPTOS <> 0 */
        END /* CONSUMO EN CTA CONSTANTE */
    /* DESCUENTO */
    if ((CTADTO IS NOT NULL) AND (CTADTO <> '')) then
        BEGIN
        execute procedure redondee(VRDTO, DIG) returning_values (VRDTO);
        if (VRDTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTADTO, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRDTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA + VRDTO;
                END
            if (TIPOCUEN = 'N') then
                    BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRDTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA + VRDTO;
                END
            END
        END /* DESCUENTO */
    /* VALOR ADIC */
    if ((CTAADIC IS NOT NULL) AND (CTAADIC <> '')) then
        BEGIN
        execute procedure redondee(VRADIC, DIG) returning_values (VRADIC);
        if (VRADIC <> 0) THEN
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTAADIC, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRADIC, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - VRADIC;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRADIC, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - VRADIC;
                END
            END
        END /* VR. ADIC */
    /* VALOR EXTRA */
    if ((CTAEXTRA IS NOT NULL) AND (CTAEXTRA <> '')) THEN
        BEGIN
        execute procedure redondee(VREXTRA, DIG) returning_values (VREXTRA);
        if (VREXTRA <> 0) THEN
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTAEXTRA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VREXTRA, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - VREXTRA;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VREXTRA, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - VREXTRA;
                END
            END
        END /* VR. EXTRA */
    /* DESCUENTE EL IMPOCONSUMO */
    SELECT SUM(FADE_CONSUMO)
        FROM FACTURAS_DETALLE F WHERE F.FACT_ID = :IDDOC INTO :IMPTOS;
    vrsubt = vrsubt - IMPTOS;
    /* RETENCION FUENTE */
    if ((RTFTE = 'C') or (RTFTE = 'K')) then
      BEGIN
      execute procedure redondee(VRRTFTE, DIG) returning_values (VRRTFTE);
      if (VRRTFTE <> 0) then
        BEGIN
        if (RTFTE = 'C') then
            CTARTFTE = TCTARTFTE;
        EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTARTFTE, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :VRSUBT, :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTFTE;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :VRSUBT, :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTFTE;
            END
        /* AUTORETENCION */
        if (FAUTORET <= fecaux) then
            BEGIN
            EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'CUENTA DE AUTORETENCION EN LA FUENTE') returning_values (CTARTFTE);
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTARTFTE INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERROR (31, :IDDOC, :CTARTFTE, 2);
                CUENTA = CTARTFTE;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                begin
                EXECUTE PROCEDURE ERROR (31, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, (:VRSUBT*-1), :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - VRRTFTE;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, (:VRSUBT*-1), :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - VRRTFTE;
                END
            END
        END /* RTFTE */
      END
    if (RTFTE = 'A') then
      BEGIN
      FOR SELECT MAX(COAR_CTARTFTEV), MAX(COAR_RTFTE), MIN(COAR_RTBASE), SUM(FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), SUM((FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO)*COAR_RTFTE)
        FROM CONTABIL_ARTICULO C, FACTURAS_DETALLE F
        WHERE F.FACT_ID = :IDDOC AND F.ARTI_COD = C.ARTI_COD
        GROUP BY COAR_CTARTFTEV
        INTO :CTARTFTE, :PRTFTE, :baseadic, :MONTO, :VRRTFTE
        DO
        BEGIN
        MONTO = MONTO * FACTOR;
        if (MONTO >= BASEADIC) then
            BEGIN
            VRRTFTE = VRRTFTE * FACTOR / 100;
            execute procedure redondee(VRRTFTE, DIG) returning_values (VRRTFTE);
            execute procedure redondee(MONTO, DIG) returning_values (MONTO);
            if (VRRTFTE <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTARTFTE, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :MONTO, :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    NROI = NROI + 1;
                    SUMA = SUMA + VRRTFTE;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :MONTO, :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA + VRRTFTE;
                    END
                /* AUTORETENCION */
                if (FAUTORET <= fecaux) then
                    BEGIN
                    EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'CUENTA DE AUTORETENCION EN LA FUENTE') returning_values (CTARTFTE);
                    EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTARTFTE, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
                    if (ERRORC <> 0) then
                        ERROR = ERROR + 1;
                    if (TIPOCUEN = 'C') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, (:MONTO*-1), :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                        NROI = NROI + 1;
                        SUMA = SUMA - VRRTFTE;
                        END
                    if (TIPOCUEN = 'N') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, (:MONTO*-1), :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NROI = NROI + 1;
                        SUMA = SUMA - VRRTFTE;
                        END
                    END
                END
            END
        END /* RTFTE */
      END
    /* RETENCION IVA */
    if ((RTIVA = 'C') or (RTIVA = 'K')) then
      BEGIN
      execute procedure redondee(VRRTIVA, DIG) returning_values (VRRTIVA);
      if (VRRTIVA <> 0) then
        BEGIN
        if (RTIVA = 'C') then
            CTARTIVA = TCTARTIVA;
        EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTARTIVA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTIVA, 0, :VRIVA, :PORC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTIVA;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTIVA, 0, :VRIVA, :PORC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTIVA;
            END
        END /* RTIVA */
      END
    /* RETENCION DE ICA */
    if ((RTICA = 'C') or (RTICA = 'K')) then
      BEGIN
      execute procedure redondee(VRRTICA, DIG) returning_values (VRRTICA);
      if (VRRTICA <> 0) then
        BEGIN
        if (RTICA = 'C') then
            CTARTICA = TCTARTICA;
        EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTARTICA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTICA, 0, :VRSUBT, :PRTICA, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTICA;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTICA, 0, :VRSUBT, :PRTICA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTICA;
            END
        END /* RTICA */
      END
    /* CIERRE EL COMPROBANTE CONTRA LA CUENTA DEL TERCERO O LA CONSTANTE */
    if ((SUMA <> 0) and ((CARTERA = 'C') or (CARTERA = 'K') or (CARTERA = 'J'))) then
        BEGIN
        if (SUMA < 0) then
            BEGIN
            DEBITO = SUMA * -1;
            CREDITO = 0;
            END
        ELSE
            BEGIN
            DEBITO = 0;
            CREDITO = SUMA;
            END
        if (CARTERA = 'C') then
            CTACARTERA = TCTACLIEN;
        if (CARTERA = 'J') then
            BEGIN
            /* BUSQUE LA CUENTA DE LA CAJA */
            SELECT CAJA_CUENTA FROM CAJAS C, PUNTO_VENTA P
                WHERE P.CAJA_ID = C.CAJA_ID AND PTVT_ID = :PTOVTA
                INTO :CTACARTERA;
            END
        EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTACARTERA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :DEBITO, :CREDITO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
        if (TIPOCUEN = 'N') then
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :DEBITO, :CREDITO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
        NROI = NROI + 1;
        END /* SUMA EN CARTERA */
    /* CALCULE COSTOS EN VENTAS */
    EXECUTE PROCEDURE COSTO_EN_VENTAS(31, :IDDOC);
    if (COSTOS = 'A') then
        BEGIN
        FOR SELECT MAX(CTACOS), SUM(CAST(CANT AS DOUBLE PRECISION) * COSTO)
            FROM COSTO_VENTAS
            GROUP BY CTACOS
            INTO :CTACOSTOS, :MONTO
        DO
            BEGIN
            if (MONTO <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTACOSTOS, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT ARTI_COD, CANT * COSTO
                        FROM COSTO_VENTAS
                        WHERE CTACOS = :CUENTA
                        INTO :ART, :MONTO
                    DO
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    NROI = NROI + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    END
                END /* MONTO <> 0 */
            END /* FOR */
        END /* COSTOS */
    if (COSTOS = 'K') then
        BEGIN
        SELECT SUM(CAST(CANT AS DOUBLE PRECISION) * COSTO)
            FROM COSTO_VENTAS
            INTO :MONTO;
        if (MONTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTACOSTOS, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, REGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT ARTI_COD, CANT * COSTO
                    FROM COSTO_VENTAS
                    INTO :ART, :MONTO
                DO
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTACOSTOS, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                    NROI = NROI + 1;
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTACOSTOS, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTACOSTOS, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                END
            END /* MONTO <> 0 */
        END /* COSTOS = K */
    if (INVEN = 'A') then
        BEGIN
        FOR SELECT MAX(CTAINV), SUM(CAST(CANT AS DOUBLE PRECISION) * COSTO)
            FROM COSTO_VENTAS
            GROUP BY CTAINV
            INTO :CTAINVEN, :MONTO
        DO
            BEGIN
            if (MONTO <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTAINVEN, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, REGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT ARTI_COD, CANT * COSTO
                        FROM COSTO_VENTAS
                        WHERE CTAINV = :CUENTA
                        INTO :ART, :MONTO
                    DO
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    NROI = NROI + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    END
                END /* MONTO <> 0 */
            END /* FOR */
        END /* INVEN = A */
    if (INVEN = 'K') then
        BEGIN
        SELECT SUM(CAST(CANT AS DOUBLE PRECISION) * COSTO)
            FROM COSTO_VENTAS
            INTO :MONTO;
        if (MONTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTAINVEN, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT ARTI_COD, CANT * COSTO
                    FROM COSTO_VENTAS
                    INTO :ART, :MONTO
                DO
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTAINVEN, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                    NROI = NROI + 1;
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAINVEN, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAINVEN, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                END
            END /* MONTO <> 0 */
        END /* INVEN = K */
    /* recorra las cuentas adicionales */
    FOR SELECT INVC_CUENTA, INVC_BASE, INVC_PORC, INVC_VALOR, INVC_DB
        FROM INTERFAZ_VENTAS_CTAS
        WHERE INVE_ID = :IDINTER
        INTO :CTADIC, :BASEADIC, :PORCADIC, :VALORADIC, :DBADIC
        DO
        BEGIN
        if (VALORADIC <> 0) then
            MONTO = VALORADIC;
        ELSE
            BEGIN
            if (:BASEADIC = 'SUBTOTAL') then
                VALORADIC = vrsubt;
            if (:BASEADIC = 'DESCUENTO') then
                VALORADIC = VRDTO;
            if (:BASEADIC = 'IVA') then
                VALORADIC = VRIVA;
            if (:BASEADIC = 'ADICIONAL') then
                VALORADIC = VRADIC;
            if (:BASEADIC = 'EXTRA') then
                VALORADIC = VREXTRA;
            if (:BASEADIC = 'TOTAL') then
                VALORADIC = VRTOTAL;
            MONTO = VALORADIC * PORCADIC / 100;
            END
        if (MONTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTADIC, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                if (DBADIC = 'S') then
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                ELSE
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                if (DBADIC = 'S') then
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                ELSE
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                END
            NROI = NROI + 1;
            END
        END
    if (ERROR > 0) then
        VER = 'S';
    SUSPEND;
    END /* NO ANULADO */
  END /* EXISTE LA INTERFAZ */
ELSE
    BEGIN
    EXECUTE PROCEDURE ERROR (31, :IDDOC, :PREF, 1);
    ERROR = ERROR + 1;
    VER = 'S';
    SUSPEND;
    END
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE FACTURAS_SIN_CONTABILIDAD(
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    ID INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    ESTADO VARCHAR(20),
    IDI INTEGER,
    IDC INTEGER)
AS
DECLARE VARIABLE VER CHAR(2);
declare variable FECICNT VARCHAR(10);
declare variable FECFCNT VARCHAR(10);
declare variable ERROR INTEGER;
declare variable idref INTEGER;
BEGIN /*$$IBE$$ 
EXECUTE PROCEDURE fecha_a_conta(FECINI) returning_values (FECICNT);
EXECUTE PROCEDURE fecha_a_conta(FECFIN) returning_values (FECFCNT);
FOR SELECT FACT_ID, PREF_PRE, FACT_NUMERO FROM FACTURAS WHERE FACT_ANULADO = 'N' AND
    FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN INTO :ID, :PREF, :NUMERO
DO
  BEGIN
  idref = null;
  SELECT ENCO_IDREF FROM COMPROBANTE_ENCABEZADO WHERE ENCO_TIPOREF = 31 AND ENCO_FECHA >= :FECICNT AND ENCO_FECHA <= :FECFCNT and ENCO_IDREF = :ID into :idref;
  if (idref IS NULL) then
  begin
   ESTADO = 'PROCESANDO';
   ERROR = NULL;
   SUSPEND;
   SELECT MAX(INVE_ID) FROM INTERFAZ_VENTAS WHERE PREF_PRE = :PREF AND TIDO_COD = 31 INTO :IDI;
   EXECUTE PROCEDURE CONTABIL_FACTURA (:ID, :IDI) RETURNING_VALUES (:ERROR, VER, :IDC);
   if ((ERROR = 0) or (error IS NULL)) then
    BEGIN
    EXECUTE PROCEDURE CONTABILIZA_PENDIENTE (:IDC);
    ESTADO = 'OK';
    END
   ELSE
    ESTADO = 'ERROR';
   suspend;
  end
  END
 $$IBE$$*/ SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE FACTURAS_SIN_CONTABILIDAD(
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    ID INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    ESTADO VARCHAR(20),
    IDI INTEGER,
    IDC INTEGER)
AS
DECLARE VARIABLE VER CHAR(2);
declare variable FECICNT VARCHAR(10);
declare variable FECFCNT VARCHAR(10);
declare variable ERROR INTEGER;
declare variable idref INTEGER;
BEGIN
EXECUTE PROCEDURE fecha_a_conta(FECINI) returning_values (FECICNT);
EXECUTE PROCEDURE fecha_a_conta(FECFIN) returning_values (FECFCNT);
FOR SELECT FACT_ID, PREF_PRE, FACT_NUMERO FROM FACTURAS WHERE FACT_ANULADO = 'N' AND
    FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN INTO :ID, :PREF, :NUMERO
DO
  BEGIN
  idref = null;
  SELECT ENCO_IDREF FROM COMPROBANTE_ENCABEZADO WHERE ENCO_TIPOREF = 31 AND ENCO_FECHA >= :FECICNT AND ENCO_FECHA <= :FECFCNT and ENCO_IDREF = :ID into :idref;
  if (idref IS NULL) then
  begin
   ESTADO = 'PROCESANDO';
   ERROR = NULL;
   SUSPEND;
   SELECT MAX(INVE_ID) FROM INTERFAZ_VENTAS WHERE PREF_PRE = :PREF AND TIDO_COD = 31 INTO :IDI;
   EXECUTE PROCEDURE CONTABIL_FACTURA (:ID, :IDI) RETURNING_VALUES (:ERROR, VER, :IDC);
   if ((ERROR = 0) or (error IS NULL)) then
    BEGIN
    EXECUTE PROCEDURE CONTABILIZA_PENDIENTE (:IDC);
    ESTADO = 'OK';
    END
   ELSE
    ESTADO = 'ERROR';
   suspend;
  end
  END
END

^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER PROCEDURE CONTABIL_DEVOLCLI(
    IDDOC INTEGER,
    IDINTER INTEGER)
RETURNS (
    ERROR INTEGER,
    VER CHAR(1),
    IDC INTEGER)
AS
declare variable PREF VARCHAR(4);
declare variable NUM VARCHAR(6);
declare variable NUMERO VARCHAR(10);
declare variable FECAUX DATE;
declare variable FECHA CHAR(8);
declare variable CONC CHAR(120);
declare variable NUMFAC VARCHAR(10);
declare variable VRDTO NUMERIC(18, 2);
declare variable VRADIC NUMERIC(18, 2);
declare variable VRSUBT NUMERIC(18, 2);
declare variable VRIVA NUMERIC(18, 2);
declare variable PRTFTE NUMERIC(9, 2);
declare variable VRRTFTE NUMERIC(18, 2);
declare variable VRRTIVA NUMERIC(18, 2);
declare variable PRTICA NUMERIC(9, 2);
declare variable VRRTICA NUMERIC(18, 2);
declare variable VRTOTAL NUMERIC(18, 2);
declare variable VREXTRA NUMERIC(18, 2);
declare variable TIPOCOMP VARCHAR(3);
declare variable PREFCONT VARCHAR(4);
declare variable VENTAS CHAR(1);
declare variable CTAVENTAS VARCHAR(20);
declare variable IVA CHAR(1);
declare variable CTAIVA VARCHAR(20);
declare variable CONSUMO CHAR(1);
declare variable CTACONSUMO VARCHAR(20);
declare variable CARTERA CHAR(1);
declare variable CTACARTERA VARCHAR(20);
declare variable RTFTE CHAR(1);
declare variable CTARTFTE VARCHAR(20);
declare variable RTIVA CHAR(1);
declare variable CTARTIVA VARCHAR(20);
declare variable RTICA CHAR(1);
declare variable CTARTICA VARCHAR(20);
declare variable INVEN CHAR(1);
declare variable CTAINVEN VARCHAR(20);
declare variable COSTOS CHAR(1);
declare variable CTACOSTOS VARCHAR(20);
declare variable CTADTO VARCHAR(20);
declare variable CTAADIC VARCHAR(20);
declare variable CTAEXTRA VARCHAR(20);
declare variable EXISTE CHAR(1);
declare variable CUENTA VARCHAR(20);
declare variable MONTO NUMERIC(18,2);
declare variable TIPOCUEN CHAR(1);
declare variable NIT VARCHAR(20);
declare variable PROY VARCHAR(4);
declare variable CENTRO VARCHAR(4);
declare variable PORC NUMERIC(5,2);
declare variable DEBITO NUMERIC(18,2);
declare variable CREDITO NUMERIC(18,2);
declare variable NROI INTEGER;
declare variable ART VARCHAR(15);
declare variable IMPINC CHAR(1);
declare variable IMPTOS NUMERIC(18, 2);
declare variable SUMA NUMERIC(18,2);
declare variable PORCIVA NUMERIC(9,2);
declare variable TCTACLIEN VARCHAR(20);
declare variable TCTAVENTA VARCHAR(20);
declare variable TCTARTFTE VARCHAR(20);
declare variable TCTARTIVA VARCHAR(20);
declare variable TCTARTICA VARCHAR(20);
declare variable CTADIC VARCHAR(20);
declare variable BASEADIC VARCHAR(20);
declare variable PORCADIC NUMERIC(5,2);
declare variable VALORADIC NUMERIC(18,2);
declare variable DBADIC CHAR(1);
declare variable PTOVTA INTEGER;
declare variable ANULADO CHAR(1);
declare variable CENT CHAR(1);
DECLARE VARIABLE MERCANCIA NUMERIC(18,2);
declare variable FACTOR DOUBLE PRECISION;
declare variable DIG INTEGER;
DECLARE VARIABLE FOMENTO VARCHAR(2);
DECLARE VARIABLE VRCONSUMO NUMERIC(18,2);
declare variable AUTORET VARCHAR(10);
declare variable FAUTORET DATE;
declare variable IDREM INTEGER;
declare variable DTOXIT CHAR(2);
declare variable ERRORC INTEGER;
BEGIN
EXECUTE PROCEDURE LEE_CONFIGURACION('COMPRAS', 'FACTURAS', 'USAR IMPOCONSUMO COMO PORCENTAJE DE FOMENTO') returning_values (FOMENTO);
EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'FECHA AUTORETENEDOR NO DESCONTAR RETENCIONES DEL SALDO PERO SI CONTABILIZARLAS') returning_values (AUTORET);
if (AUTORET <> '') then
    FAUTORET = CAST(AUTORET AS DATE);
else
    FAUTORET = '9999/12/31';
  /* BUSQUE LA INTERFACE */
  EXISTE = 'N';
  SELECT 'S', TICO_COD, PRCO_PRE, INVE_VENTAS, INVE_IVA, INVE_CONSUMO, INVE_CARTERA, INVE_RTFTE, INVE_RTIVA, INVE_RTICA, INVE_COSTO, INVE_INVEN, INVE_CTAVENTAS, INVE_CTAIVA, INVE_CTACONSUMO, INVE_CTADTO, INVE_CTAADIC, INVE_CTAEXTRA, INVE_CTACARTERA, INVE_CTARTFTE, INVE_CTARTIVA, INVE_CTARTICA, INVE_CTAINVEN, INVE_CTACOSTOS, INVE_CONFIRMAR, INVE_CENTRO
    FROM INTERFAZ_VENTAS
    WHERE INVE_ID = :IDINTER
    INTO :EXISTE, :TIPOCOMP, :PREFCONT, :VENTAS, :IVA, :CONSUMO, :CARTERA, :RTFTE, :RTIVA, :RTICA, :COSTOS, :INVEN, :CTAVENTAS, :CTAIVA, :CTACONSUMO, :CTADTO, :CTAADIC, :CTAEXTRA, :CTACARTERA, :CTARTFTE, :CTARTIVA, :CTARTICA, :CTAINVEN, :CTACOSTOS, :VER, :CENT;
  if (EXISTE = 'S') then
   BEGIN
    /* BORRE CUALQUEIR CONTABILIZACION PREVIA */
    DELETE FROM CONTABILIZACION WHERE CNTB_TIPOREF = 33 AND CNTB_IDREF = :IDDOC;
    /* TRAIGA EL ENCABEZADO DE LA DEVOLUCION */
   SELECT PREF_PRE, DEVT_NUMERO, DEVT_FECHA, F.TERC_NIT, DEVT_IVAINC, PTVT_ID, DEVT_FACTURA, DEVT_DTOMONTO, DEVT_ADICIONAL, DEVT_IVAMONTO, DEVT_EXTRA, DEVT_TOTAL, DEVT_RTFTEPORC, DEVT_RTFTEMONTO, DEVT_RTIVAPORC, DEVT_RTIVAMONTO, DEVT_RTICAPORC, DEVT_RTICAMONTO, TERC_CTARTFTE, TERC_CTARTIVA, TERC_CTARTICA, TERC_CTAVENTA, TERC_CTACLIENTE, DEVT_ANULADO, DEVT_REMID
        FROM DEVOLUCIONES_VENTAS F, TERCEROS T
        WHERE DEVT_ID = :IDDOC AND F.TERC_NIT = T.TERC_NIT
        INTO :PREF, :NUM, :FECAUX, :NIT, :IMPINC, :PTOVTA, :NUMFAC, :VRDTO, :VRADIC, :VRIVA, :VREXTRA, :VRTOTAL, :PRTFTE, :VRRTFTE, :PORC, :VRRTIVA, :PRTICA, :VRRTICA, :TCTARTFTE, TCTARTIVA, TCTARTICA, TCTAVENTA, TCTACLIEN, ANULADO, :IDREM;
   if (idrem is null) Then
    IDREM = 0;
   if ((ANULADO = 'N') AND (IDREM = 0)) then
    BEGIN
    NUMERO = PREF || NUM;
    SELECT SUM(DVDE_CONSUMO) FROM devoluciones_ventas_detalle WHERE DEVT_ID = :iddoc INTO :MERCANCIA;
    VRSUBT = VRTOTAL - VREXTRA - VRIVA - MERCANCIA; /* BASE DE RETEFTE Y RETEICA */
    EXECUTE PROCEDURE lee_configuracion ('FACTURACION', 'DEVOLUCIONES', 'DESCUENTO PIE DEVOLUCION IGUAL A SUMA DE DESCUENTOS POR ITEM') returning_values (:DTOXIT);
    if (DTOXIT = 'SI') then
        VRDTO = 0;
    MERCANCIA = VRSUBT - VRADIC + VRDTO;
    IF (CENT = 'B') THEN
        SELECT B.BODE_CENTRO, B.BODE_PROY FROM BODEGA B, DEVOLUCIONES_VENTAS F
            WHERE B.BODE_COD = F.BODE_COD AND F.DEVT_ID = :IDDOC INTO :CENTRO, :PROY;
    IF (CENT = 'V') THEN
        SELECT V.CENT_COD, V.PROY_COD FROM VENDEDORES V, DEVOLUCIONES_VENTAS F
            WHERE V.VEND_COD = F.VEND_COD AND F.DEVT_ID = :IDDOC INTO :CENTRO, :PROY;
    IF (CENT = 'P') THEN
        SELECT P.PREF_CENTRO,P.PREF_PROY  FROM PREFIJOS P, DEVOLUCIONES_VENTAS F
            WHERE P.PREF_PRE = F.PREF_PRE AND F.DEVT_ID = :IDDOC AND P.TIDO_COD = 33 INTO :CENTRO, :PROY;
    EXECUTE PROCEDURE FECHA_A_CONTA(:FECAUX) returning_values (:FECHA);
    /* REGISTRE EL ENCABEZADO CONTABLE */
    IDC = GEN_ID(ID_CONTABILIZA, 1);
    CONC = 'DEVOLUCION VENTAS No. ' || NUMERO || ' EN FACTURA ' || NUMFAC;
    CONC = SUBSTR(CONC, 1, 60);
    INSERT INTO CONTABILIZACION (CNTB_ID, CNTB_TIPOCOMP, CNTB_PREFCNT, CNTB_NUMERO, CNTB_FECHA, CNTB_CONCEPTO, CNTB_REF, CNTB_TIPOREF, CNTB_IDREF, CNTB_PREFREF, CNTB_NUMREF, CNTB_PROCESADO)
        VALUES (:IDC, :TIPOCOMP, :PREFCONT, :NUM, :FECHA, :CONC, '', 33, :IDDOC, :PREF, :NUM, 'N');
    NROI = 0;
    SUMA = 0;
    ERROR = 0;
    /* SI NO HAY CUENTA DE DESCUENTO NI ADICIONAL CALCULE UN FACTOR PARA LAS VENTAS Y EL IVA */
    if (MERCANCIA <> 0) then
        FACTOR = CAST(VRSUBT AS DOUBLE PRECISION) / CAST(MERCANCIA AS DOUBLE PRECISION);
    ELSE
        FACTOR = 1;
    /* TRAIGA EL NUMERO DE DIGITOS PARA EL REDONDEO */
    SELECT CAST(CONF_VALOR AS INTEGER) FROM CONFIGURACION WHERE CONF_MODULO = 'FACTURACION' AND
        CONF_CATEGORIA = 'GENERAL' AND CONF_PROPIEDAD = 'REDONDEO AL MULTIPLO DE DIEZ EN TOTALES' INTO :DIG;
    /* CUENTAS DE VENTAS */
    if (VENTAS = 'A') then
        BEGIN
        FOR SELECT MAX(COAR_CTADEV), SUM(cast(DVDE_CANT as double precision) * (DVDE_PRUNIT-DVDE_DTOMONTO)), SUM(DVDE_IVAMONTO), SUM(DVDE_CONSUMO)
            FROM ARTICULO A, CONTABIL_ARTICULO C, DEVOLUCIONES_VENTAS_DETALLE F
            WHERE F.DEVT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD
            GROUP BY COAR_CTADEV
            INTO :CTAVENTAS, :MONTO, :IMPTOS, :VRCONSUMO
            DO
            BEGIN
            if (IMPINC = 'S') then
                if (FOMENTO = 'SI') then
                    MONTO = MONTO - IMPTOS;
                ELSE
                    MONTO = MONTO - IMPTOS - VRCONSUMO;
            ELSE
            if (FOMENTO = 'SI') then
            MONTO = MONTO + VRCONSUMO;
            if ((CTADTO IS NULL) OR (CTADTO = '')) then
                MONTO = MONTO * FACTOR;
            execute procedure redondee(MONTO, DIG) returning_values (MONTO);
            if (MONTO <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTAVENTAS, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT F.ARTI_COD, (cast(DVDE_CANT as double precision) * (DVDE_PRUNIT-DVDE_DTOMONTO)), (DVDE_IVAMONTO+DVDE_CONSUMO)
                        FROM ARTICULO A, CONTABIL_ARTICULO C, DEVOLUCIONES_VENTAS_DETALLE F
                        WHERE F.DEVT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTAINV = :CUENTA
                        INTO :ART, :MONTO, :IMPTOS
                    DO
                        BEGIN
                        if (IMPINC = 'S') then
                            MONTO = MONTO - IMPTOS;
                        if ((CTADTO IS NULL) OR (CTADTO = '')) then
                            MONTO = MONTO * FACTOR;
                        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        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, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                    NROI = NROI + 1;
                    SUMA = SUMA + MONTO;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA + MONTO;
                    END
                END /* MONTO <> 0 */
            END /* FOR */
        END /* VENTAS X ARTICULO */
     IF ((VENTAS = 'C') OR (VENTAS = 'K')) THEN
        BEGIN
        IF (VENTAS = 'C') THEN
            CTAVENTAS = TCTAVENTA;
        SELECT SUM(cast(DVDE_CANT as double precision) * (DVDE_PRUNIT-DVDE_DTOMONTO)), SUM(DVDE_IVAMONTO), SUM(DVDE_CONSUMO)
            FROM DEVOLUCIONES_VENTAS_DETALLE F
            WHERE F.DEVT_ID = :IDDOC 
            INTO :MONTO, :IMPTOS, :VRCONSUMO;
        if (IMPINC = 'S') then
            if (FOMENTO = 'SI') then
               MONTO = MONTO - IMPTOS;
            ELSE
               MONTO = MONTO - IMPTOS - VRCONSUMO;
        ELSE
         if (FOMENTO = 'SI') then
          MONTO = MONTO + VRCONSUMO;
        if ((CTADTO IS NULL) OR (CTADTO = '')) then
            MONTO = MONTO * FACTOR;
        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
        if (MONTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTAVENTAS, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT F.ARTI_COD, (cast(DVDE_CANT as double precision) * (DVDE_PRUNIT-DVDE_DTOMONTO)), (DVDE_IVAMONTO+DVDE_CONSUMO)
                    FROM ARTICULO A, DEVOLUCIONES_VENTAS_DETALLE F
                    WHERE F.DEVT_ID = :IDDOC
                    INTO :ART, :MONTO, :IMPTOS
                    DO
                    BEGIN
                    if (IMPINC = 'S') then
                        MONTO = MONTO - IMPTOS;
                    if ((CTADTO IS NULL) OR (CTADTO = '')) then
                        MONTO = MONTO * FACTOR;
                    execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                    NROI = NROI + 1;
                    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, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                NROI = NROI + 1;
                SUMA = SUMA + MONTO;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA + MONTO;
                END
            END /* MONTO <> 0 */
        END /* VENTAS DE CLIENTE O CONSTANTE */
    /* EL IVA EN VENTAS */
    if (IVA = 'A') then
        BEGIN
        FOR SELECT MAX(COAR_CTAIVAV), SUM(DVDE_IVAMONTO), SUM(DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO), SUM(DVDE_CONSUMO)
            FROM ARTICULO A, CONTABIL_ARTICULO C, DEVOLUCIONES_VENTAS_DETALLE F
            WHERE F.DEVT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD
            GROUP BY COAR_CTAIVAV
            INTO :CTAIVA, :IMPTOS, :MONTO, :VALORADIC
        DO
            BEGIN
            if (FOMENTO = 'SI') then
                MONTO = MONTO + VALORADIC;
            MONTO = MONTO * -1;
            MONTO = MONTO * FACTOR;
            IMPTOS = IMPTOS * FACTOR;
            execute procedure redondee(MONTO, DIG) returning_values (MONTO);
            execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
            if (IMPTOS <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTAIVA, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT F.ARTI_COD, DVDE_IVAMONTO, (cast(DVDE_CANT as double precision) * (DVDE_PRUNIT-DVDE_DTOMONTO)), TAIV_PORC, DVDE_CONSUMO
                        FROM ARTICULO A, CONTABIL_ARTICULO C, DEVOLUCIONES_VENTAS_DETALLE F, TARIFA_IVA T
                        WHERE F.DEVT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND A.TAIV_COD = T.TAIV_COD AND COAR_CTAIVAV = :CUENTA
                        INTO :ART, :IMPTOS, :MONTO, :PORCIVA, :VALORADIC
                    DO
                        BEGIN
                        if (IMPINC = 'S') then
                            MONTO = MONTO - IMPTOS - VALORADIC;
                        MONTO = MONTO * -1;
                        MONTO = MONTO * FACTOR;
                        IMPTOS = IMPTOS * FACTOR;
                        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                        execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                        if (IMPTOS <> 0) then
                            BEGIN
                            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :IMPTOS, 0, :MONTO, :PORCIVA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                            NROI = NROI + 1;
                            SUMA = SUMA + IMPTOS;
                            END
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                    NROI = NROI + 1;
                    SUMA = SUMA + IMPTOS;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA + IMPTOS;
                    END
                END   /* IMPTOS <> 0 */
            END /* FOR */
        END /* IVA X ARTICULO */
    if (IVA = 'K') then /* IVA EN CTA CONSTANTE */
        BEGIN
        SELECT SUM(DVDE_IVAMONTO), SUM(DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO), SUM(DVDE_CONSUMO)
            FROM DEVOLUCIONES_VENTAS_DETALLE F
            WHERE F.DEVT_ID = :IDDOC 
            INTO :IMPTOS, :MONTO, :VALORADIC;
        if (FOMENTO = 'SI') then
            MONTO = MONTO + VALORADIC;
        MONTO = MONTO * -1;
        MONTO = MONTO * FACTOR;
        IMPTOS = IMPTOS * FACTOR;
        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
        execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
        if (IMPTOS <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTAIVA, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT F.ARTI_COD, (cast(DVDE_CANT as double precision) * (DVDE_PRUNIT-DVDE_DTOMONTO)), DVDE_IVAMONTO, TAIV_PORC, DVDE_CONSUMO
                    FROM ARTICULO A, DEVOLUCIONES_VENTAS_DETALLE F, TARIFA_IVA T
                    WHERE F.DEVT_ID = :IDDOC AND A.TAIV_COD = T.TAIV_COD
                    INTO :ART, :MONTO, :IMPTOS, :PORCIVA, :VALORADIC
                    DO
                    BEGIN
                    if (IMPINC = 'S') then
                        MONTO = MONTO - IMPTOS - VALORADIC;
                    MONTO = MONTO * -1;
                    MONTO = MONTO * FACTOR;
                    IMPTOS = IMPTOS * FACTOR;
                    execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                    execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                    if (IMPTOS <> 0) then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', :IMPTOS, 0, :MONTO, :PORCIVA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        SUMA = SUMA + IMPTOS;
                        END
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                NROI = NROI + 1;
                SUMA = SUMA + IMPTOS;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA + IMPTOS;
                END
            END /* IMPTOS <> 0 */
        END /* IVA EN CTA CONSTANTE */
    /* EL IMPOCONSUMO */
    if ((CONSUMO = 'A') AND (FOMENTO <> 'SI')) then
        BEGIN
        FOR SELECT MAX(COAR_CTACONS), SUM(DVDE_CONSUMO)
            FROM ARTICULO A, CONTABIL_ARTICULO C, DEVOLUCIONES_VENTAS_DETALLE F
            WHERE F.DEVT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD
            GROUP BY COAR_CTACONS
            INTO :CTACONSUMO, :IMPTOS
        DO
            BEGIN
            if (IMPTOS <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTACONSUMO, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, REGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT F.ARTI_COD, DVDE_CONSUMO
                        FROM ARTICULO A, CONTABIL_ARTICULO C, DEVOLUCIONES_VENTAS_DETALLE F
                        WHERE F.DEVT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTACONS = :CUENTA
                        INTO :ART, :IMPTOS
                    DO
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 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, :NROI, :CUENTA, :CONC, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                    NROI = NROI + 1;
                    SUMA = SUMA + IMPTOS;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA + IMPTOS;
                    END
                END /* IMPTOS <> 0 */
            END /* FOR */
        END /* CONSUMO X ARTICULO */
    if ((CONSUMO = 'K') AND (FOMENTO <> 'SI')) then
        BEGIN
        SELECT SUM(DVDE_CONSUMO)
            FROM DEVOLUCIONES_VENTAS_DETALLE F
            WHERE F.DEVT_ID = :IDDOC 
            INTO :IMPTOS;
        if (IMPTOS <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTACONSUMO, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT F.ARTI_COD, DVDE_CONSUMO
                    FROM ARTICULO A, DEVOLUCIONES_VENTAS_DETALLE F
                    WHERE F.DEVT_ID = :IDDOC 
                    INTO :ART, :IMPTOS
                    DO
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTACONSUMO, :CONC, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                    NROI = NROI + 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, :NROI, :CTACONSUMO, :CONC, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA + IMPTOS;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTACONSUMO, :CONC, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA + IMPTOS;
                END
            END /* IMPTOS <> 0 */
        END /* CONSUMO EN CTA CONSTANTE */
    /* DESCUENTO */
    if ((CTADTO IS NOT NULL) AND
        (CTADTO <> '') AND
        (VRDTO <> 0)) THEN
        BEGIN
        EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTADTO, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRDTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
            NROI = NROI + 1;
            SUMA = SUMA - VRDTO;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRDTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 33);
            NROI = NROI + 1;
            SUMA = SUMA - VRDTO;
            END
        END /* DESCUENTO */
    /* VALOR ADIC */
    if ((CTAADIC IS NOT NULL) AND
        (CTAADIC <> '') AND
        (VRADIC <> 0)) THEN
        BEGIN
        EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTAADIC, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRADIC, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
            NROI = NROI + 1;
            SUMA = SUMA + VRADIC;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRADIC, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 33);
            NROI = NROI + 1;
            SUMA = SUMA + VRADIC;
            END
        END /* VR. ADIC */
    /* VALOR EXTRA */
    if ((CTAEXTRA IS NOT NULL) AND
        (CTAEXTRA <> '') AND
        (VREXTRA <> 0)) THEN
        BEGIN
        EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTAEXTRA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VREXTRA, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
            NROI = NROI + 1;
            SUMA = SUMA + VREXTRA;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VREXTRA, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 33);
            NROI = NROI + 1;
            SUMA = SUMA + VREXTRA;
            END
        END /* VR. EXTRA */
    /* RETENCION FUENTE */
    if ((RTFTE = 'C') or (RTFTE = 'K')) then
      if (VRRTFTE <> 0) then
        BEGIN
        if (RTFTE = 'C') then
            CTARTFTE = TCTARTFTE;
        EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTARTFTE, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, (:VRSUBT*-1), :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
            NROI = NROI + 1;
            SUMA = SUMA - VRRTFTE;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, (:VRSUBT*-1), :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA - VRRTFTE;
            END
        /* AUTORETENCION */
        if (FAUTORET <= fecaux) then
            BEGIN
            EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'CUENTA DE AUTORETENCION EN LA FUENTE') returning_values (CTARTFTE);
            EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTARTFTE, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :VRSUBT, :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                NROI = NROI + 1;
                SUMA = SUMA + VRRTFTE;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :VRSUBT, :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA + VRRTFTE;
                END
            END
        END /* RTFTE */
    if (RTFTE = 'A') then
      BEGIN
      FOR SELECT MAX(COAR_CTARTFTEV), MAX(COAR_RTFTE), MIN(COAR_RTBASE), SUM(DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO), SUM((DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO)*COAR_RTFTE)
        FROM CONTABIL_ARTICULO C, devoluciones_ventas_detalle F
        WHERE F.devt_id = :IDDOC AND F.ARTI_COD = C.ARTI_COD
        GROUP BY COAR_CTARTFTEV
        INTO :CTARTFTE, :PRTFTE, :baseadic, :MONTO, :VRRTFTE
        DO
        BEGIN
        MONTO = MONTO * FACTOR;
        if (MONTO >= BASEADIC) then
            BEGIN
            VRRTFTE = VRRTFTE * FACTOR / 100;
            execute procedure redondee(VRRTFTE, DIG) returning_values (VRRTFTE);
            execute procedure redondee(MONTO, DIG) returning_values (MONTO);
            if (VRRTFTE <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTARTFTE, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, (:MONTO*-1), :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                    NROI = NROI + 1;
                    SUMA = SUMA - VRRTFTE;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, (:MONTO*-1), :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA - VRRTFTE;
                    END
                /* AUTORETENCION */
                if (FAUTORET <= fecaux) then
                    BEGIN
                    EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'CUENTA DE AUTORETENCION EN LA FUENTE') returning_values (CTARTFTE);
                    EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTARTFTE, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
                    if (ERRORC <> 0) then
                        ERROR = ERROR + 1;
                    if (TIPOCUEN = 'C') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :MONTO, :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                        NROI = NROI + 1;
                        SUMA = SUMA + VRRTFTE;
                        END
                    if (TIPOCUEN = 'N') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :MONTO, :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NROI = NROI + 1;
                        SUMA = SUMA + VRRTFTE;
                        END
                    END
                END
            END
        END /* RTFTE */
      END
    /* RETENCION IVA */
    if ((RTIVA = 'C') or (RTIVA = 'K')) then
      if (VRRTIVA <> 0) then
        BEGIN
        if (RTIVA = 'C') then
            CTARTIVA = TCTARTIVA;
        EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTARTIVA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTIVA, (:VRIVA*-1), :PORC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
            NROI = NROI + 1;
            SUMA = SUMA - VRRTIVA;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTIVA, (:VRIVA*-1), :PORC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA - VRRTIVA;
            END
        END /* RTIVA */
    /* RETENCION DE ICA */
    if ((RTICA = 'C') or (RTICA = 'K')) then
      if (VRRTICA <> 0) then
        BEGIN
        if (RTICA = 'C') then
            CTARTICA = TCTARTICA;
        EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTARTICA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTICA, (:VRSUBT*-1), :PRTICA, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
            NROI = NROI + 1;
            SUMA = SUMA - VRRTICA;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTICA, (:VRSUBT*-1), :PRTICA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA - VRRTICA;
            END
        END /* RTICA */
    /* CIERRE EL COMPROBANTE CONTRA LA CUENTA DEL TERCERO O LA CONSTANTE */
    if ((SUMA <> 0) and ((CARTERA = 'C') or (CARTERA = 'K') or (CARTERA = 'J'))) then
        BEGIN
        if (SUMA < 0) then
            BEGIN
            DEBITO = SUMA * -1;
            CREDITO = 0;
            END
        ELSE
            BEGIN
            DEBITO = 0;
            CREDITO = SUMA;
            END
        if (CARTERA = 'C') then
            CTACARTERA = TCTACLIEN;
        if (CARTERA = 'J') then
            BEGIN
            /* BUSQUE LA CUENTA DE LA CAJA */
            SELECT CAJA_CUENTA FROM CAJAS C, PUNTO_VENTA P
                WHERE P.CAJA_ID = C.CAJA_ID AND PTVT_ID = :PTOVTA
                INTO :CTACARTERA;
            END
        EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTACARTERA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :DEBITO, :CREDITO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
        if (TIPOCUEN = 'N') then
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :DEBITO, :CREDITO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
        NROI = NROI + 1;
        END /* SUMA EN CARTERA */
    /* CALCULE COSTOS EN VENTAS */
    EXECUTE PROCEDURE COSTO_EN_VENTAS(33, :IDDOC);
    if (COSTOS = 'A') then
        BEGIN
        FOR SELECT MAX(CTACOS), SUM(cast(CANT as double precision) * COSTO)
            FROM COSTO_VENTAS
            GROUP BY CTACOS
            INTO :CTACOSTOS, :MONTO
        DO
            BEGIN
            if (MONTO <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTACOSTOS, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT ARTI_COD, cast(CANT as double precision) * COSTO
                        FROM COSTO_VENTAS
                        WHERE CTACOS = :CUENTA
                        INTO :ART, :MONTO
                    DO
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                    NROI = NROI + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    END
                END /* MONTO <> 0 */
            END /* FOR */
        END /* COSTOS */
    if (COSTOS = 'K') then
        BEGIN
        SELECT SUM(cast(CANT as double precision) * COSTO)
            FROM COSTO_VENTAS
            INTO :MONTO;
        if (MONTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTACOSTOS, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, REGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT ARTI_COD, cast(CANT as double precision) * COSTO
                    FROM COSTO_VENTAS
                    INTO :ART, :MONTO
                DO
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTACOSTOS, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                    NROI = NROI + 1;
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTACOSTOS, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                NROI = NROI + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTACOSTOS, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                END
            END /* MONTO <> 0 */
        END /* COSTOS = K */
    if (INVEN = 'A') then
        BEGIN
        FOR SELECT MAX(CTAINV), SUM(cast(CANT as double precision) * COSTO)
            FROM COSTO_VENTAS
            GROUP BY CTAINV
            INTO :CTAINVEN, :MONTO
        DO
            BEGIN
            if (MONTO <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTAINVEN, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, REGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT ARTI_COD, cast(CANT as double precision) * COSTO
                        FROM COSTO_VENTAS
                        WHERE CTAINV = :CUENTA
                        INTO :ART, :MONTO
                    DO
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                    NROI = NROI + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    END
                END /* MONTO <> 0 */
            END /* FOR */
        END /* INVEN = A */
    if (INVEN = 'K') then
        BEGIN
        SELECT SUM(cast(CANT as double precision) * COSTO)
            FROM COSTO_VENTAS
            INTO :MONTO;
        if (MONTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTAINVEN, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT ARTI_COD, cast(CANT as double precision) * COSTO
                    FROM COSTO_VENTAS
                    INTO :ART, :MONTO
                DO
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTAINVEN, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                    NROI = NROI + 1;
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAINVEN, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                NROI = NROI + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAINVEN, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                END
            END /* MONTO <> 0 */
        END /* INVEN = K */
    /* recorra las cuentas adicionales */
    FOR SELECT INVC_CUENTA, INVC_BASE, INVC_PORC, INVC_VALOR, INVC_DB
        FROM INTERFAZ_VENTAS_CTAS WHERE INVE_ID = :IDINTER
        INTO :CTADIC, :BASEADIC, :PORCADIC, :VALORADIC, :DBADIC
        DO
        BEGIN
        if (valoradic <> 0) then
            monto = valoradic;
        else
            BEGIN
            if (:BASEADIC = 'SUBTOTAL') then
                VALORADIC = vrsubt;
            if (:BASEADIC = 'DESCUENTO') then
                VALORADIC = VRDTO;
            if (:BASEADIC = 'IVA') then
                VALORADIC = VRIVA;
            if (:BASEADIC = 'ADICIONAL') then
                VALORADIC = VRADIC;
            if (:BASEADIC = 'EXTRA') then
                VALORADIC = VREXTRA;
            if (:BASEADIC = 'TOTAL') then
                VALORADIC = VRTOTAL;
            MONTO = VALORADIC * PORCADIC;
            END
        if (MONTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTADIC, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                if (DBADIC = 'S') then
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                ELSE
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                NROI = NROI + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                if (DBADIC = 'S') then
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                ELSE
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                END
            NROI = NROI + 1;
            END
        END
    if (error > 0) then
        ver = 'S';
    SUSPEND;
    END
   END /* EXISTE LA INTERFAZ */
  ELSE
    BEGIN
    EXECUTE PROCEDURE ERROR (33, :IDDOC, :PREF, 1);
    ERROR = ERROR + 1;
    VER = 'S';
    SUSPEND;
    END
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE DEVOLUCIONES_SIN_CONTABILIDAD(
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    ID INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    ESTADO VARCHAR(20),
    IDI INTEGER,
    IDC INTEGER)
AS
DECLARE VARIABLE VER CHAR(2);
declare variable FECICNT VARCHAR(10);
declare variable FECFCNT VARCHAR(10);
declare variable ERROR INTEGER;
declare variable idref INTEGER;
BEGIN /*$$IBE$$ 
EXECUTE PROCEDURE fecha_a_conta(FECINI) returning_values (FECICNT);
EXECUTE PROCEDURE fecha_a_conta(FECFIN) returning_values (FECFCNT);
FOR SELECT DEVT_ID, PREF_PRE, DEVT_NUMERO FROM devoluciones_ventas WHERE DEVT_ANULADO = 'N' AND
    DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN
    INTO :ID, :PREF, :NUMERO
DO
  BEGIN
  idref = null;
  SELECT ENCO_IDREF FROM COMPROBANTE_ENCABEZADO WHERE ENCO_TIPOREF = 33 AND ENCO_FECHA >= :FECICNT AND ENCO_FECHA <= :FECFCNT and ENCO_IDREF = :id into :idref;
  if (idref IS NULL) then
  begin
   ESTADO = 'PROCESANDO';
   SUSPEND;
   SELECT MAX(INVE_ID) FROM INTERFAZ_VENTAS WHERE PREF_PRE = :PREF AND TIDO_COD = 33 INTO :IDI;
   EXECUTE PROCEDURE contabil_devolcli (:ID, :IDI) RETURNING_VALUES (:ERROR, :VER, :IDC);
   if (ERROR = 0) then
    BEGIN
    EXECUTE PROCEDURE CONTABILIZA_PENDIENTE (:IDC);
    ESTADO = 'OK';
    END
   ELSE
    ESTADO = 'ERROR';
   suspend;
  End
  END
 $$IBE$$*/ SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE DEVOLUCIONES_SIN_CONTABILIDAD(
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    ID INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    ESTADO VARCHAR(20),
    IDI INTEGER,
    IDC INTEGER)
AS
DECLARE VARIABLE VER CHAR(2);
declare variable FECICNT VARCHAR(10);
declare variable FECFCNT VARCHAR(10);
declare variable ERROR INTEGER;
declare variable idref INTEGER;
BEGIN
EXECUTE PROCEDURE fecha_a_conta(FECINI) returning_values (FECICNT);
EXECUTE PROCEDURE fecha_a_conta(FECFIN) returning_values (FECFCNT);
FOR SELECT DEVT_ID, PREF_PRE, DEVT_NUMERO FROM devoluciones_ventas WHERE DEVT_ANULADO = 'N' AND
    DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN
    INTO :ID, :PREF, :NUMERO
DO
  BEGIN
  idref = null;
  SELECT ENCO_IDREF FROM COMPROBANTE_ENCABEZADO WHERE ENCO_TIPOREF = 33 AND ENCO_FECHA >= :FECICNT AND ENCO_FECHA <= :FECFCNT and ENCO_IDREF = :id into :idref;
  if (idref IS NULL) then
  begin
   ESTADO = 'PROCESANDO';
   SUSPEND;
   SELECT MAX(INVE_ID) FROM INTERFAZ_VENTAS WHERE PREF_PRE = :PREF AND TIDO_COD = 33 INTO :IDI;
   EXECUTE PROCEDURE contabil_devolcli (:ID, :IDI) RETURNING_VALUES (:ERROR, :VER, :IDC);
   if (ERROR = 0) then
    BEGIN
    EXECUTE PROCEDURE CONTABILIZA_PENDIENTE (:IDC);
    ESTADO = 'OK';
    END
   ELSE
    ESTADO = 'ERROR';
   suspend;
  End
  END
END

^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER PROCEDURE CONTABIL_FACTCOMP(
    IDDOC INTEGER,
    IDINTER INTEGER)
RETURNS (
    ERROR INTEGER,
    VER CHAR(1),
    IDC INTEGER)
AS
DECLARE VARIABLE PREFIJO VARCHAR(4);
DECLARE VARIABLE NUM VARCHAR(6);
DECLARE VARIABLE NUMERO VARCHAR(10);
DECLARE VARIABLE FECAUX DATE;
DECLARE VARIABLE FECHA CHAR(8);
DECLARE VARIABLE CONCEPTO CHAR(60);
DECLARE VARIABLE VENCEAUX DATE;
DECLARE VARIABLE VENCE CHAR(8);
DECLARE VARIABLE VRDTO NUMERIC(18,2);
DECLARE VARIABLE VRADIC NUMERIC(18,2);
DECLARE VARIABLE VRSUBT NUMERIC(18,2);
DECLARE VARIABLE VRIVA NUMERIC(18,2);
DECLARE VARIABLE PRTFTE NUMERIC(9,2);
DECLARE VARIABLE VRRTFTE NUMERIC(18,2);
DECLARE VARIABLE VRRTIVA NUMERIC(18,2);
DECLARE VARIABLE PRTICA NUMERIC(9,2);
DECLARE VARIABLE VRRTICA NUMERIC(18,2);
DECLARE VARIABLE VRTOTAL NUMERIC(18,2);
DECLARE VARIABLE VREXTRA NUMERIC(18,2);
DECLARE VARIABLE TIPOCOMP VARCHAR(3);
DECLARE VARIABLE PREFCONT VARCHAR(4);
DECLARE VARIABLE INVEN CHAR(1);
DECLARE VARIABLE CTAINVEN VARCHAR(20);
DECLARE VARIABLE IVA CHAR(1);
DECLARE VARIABLE CTAIVA VARCHAR(20);
DECLARE VARIABLE CONSUMO CHAR(1);
DECLARE VARIABLE CTACONSUMO VARCHAR(20);
DECLARE VARIABLE CXP CHAR(1);
DECLARE VARIABLE CTACXP VARCHAR(20);
DECLARE VARIABLE RTFTE CHAR(1);
DECLARE VARIABLE CTARTFTE VARCHAR(20);
DECLARE VARIABLE RTIVA CHAR(1);
DECLARE VARIABLE CTARTIVA VARCHAR(20);
DECLARE VARIABLE RTICA CHAR(1);
DECLARE VARIABLE CTARTICA VARCHAR(20);
DECLARE VARIABLE CTADTO VARCHAR(20);
DECLARE VARIABLE CTAADIC VARCHAR(20);
DECLARE VARIABLE CTAEXTRA VARCHAR(20);
DECLARE VARIABLE EXISTE CHAR(1);
DECLARE VARIABLE CUENTA VARCHAR(20);
DECLARE VARIABLE MONTO NUMERIC(18,2);
DECLARE VARIABLE TIPOCUEN CHAR(1);
DECLARE VARIABLE NIT VARCHAR(20);
DECLARE VARIABLE NOMBRE VARCHAR(60);
DECLARE VARIABLE PROY VARCHAR(4);
DECLARE VARIABLE CENTRO VARCHAR(4);
DECLARE VARIABLE PROYDET VARCHAR(4);
DECLARE VARIABLE CENTRODET VARCHAR(4);
DECLARE VARIABLE PORC NUMERIC(5,2);
DECLARE VARIABLE NUMITEMS INTEGER;
DECLARE VARIABLE ARTICULO VARCHAR(15);
DECLARE VARIABLE IMPINC CHAR(1);
DECLARE VARIABLE IMPTOS NUMERIC(18,2);
DECLARE VARIABLE SUMA NUMERIC(18,2);
DECLARE VARIABLE PORCIVA NUMERIC(9,2);
DECLARE VARIABLE TCTAPROV VARCHAR(20);
DECLARE VARIABLE TCTARTFTE VARCHAR(20);
DECLARE VARIABLE TCTARTIVA VARCHAR(20);
DECLARE VARIABLE TCTARTICA VARCHAR(20);
DECLARE VARIABLE CUENTAADIC VARCHAR(20);
DECLARE VARIABLE BASEADIC VARCHAR(20);
DECLARE VARIABLE PORCADIC NUMERIC(5,2);
DECLARE VARIABLE VALORADIC NUMERIC(18,2);
DECLARE VARIABLE DBADIC CHAR(1);
DECLARE VARIABLE FOMENTO CHAR(2);
DECLARE VARIABLE BODE_DET CHAR(2);
DECLARE VARIABLE NUMPROV VARCHAR(10);
DECLARE VARIABLE MERCANCIA NUMERIC(18,2);
declare variable FACTOR DOUBLE PRECISION;
DECLARE VARIABLE MENORV CHAR(2);
declare variable DIG INTEGER;
declare variable NETO NUMERIC(18,2);
declare variable CENT CHAR(1);
declare variable ANULADO CHAR(1);
declare variable ERRORC INTEGER;
BEGIN
  /* INTERFACE */
  EXISTE = 'N';
  SELECT 'S', TICO_COD, PRCO_PRE, INCO_INVEN, INCO_IVA, INCO_CONSUMO, INCO_CXP, INCO_RTFTE, INCO_RTIVA, INCO_RTICA, INCO_CTAINVEN, INCO_CTAIVA, INCO_CTACONSUMO, INCO_CTADTO, INCO_CTAADIC, INCO_CTAEXTRA, INCO_CTACXP, INCO_CTARTFTE, INCO_CTARTIVA, INCO_CTARTICA, INCO_CONFIRMAR, INCO_CENTRO
    FROM INTERFAZ_COMPRAS WHERE INCO_ID = :IDINTER INTO :EXISTE, :TIPOCOMP, :PREFCONT, :INVEN, :IVA, :CONSUMO, :CXP, :RTFTE, :RTIVA, :RTICA, :CTAINVEN, :CTAIVA, :CTACONSUMO, :CTADTO, :CTAADIC, :CTAEXTRA, :CTACXP, :CTARTFTE, :CTARTIVA, :CTARTICA, :VER, :CENT;
  if (EXISTE = 'S') then
    BEGIN
    /* BORRE CONTABILIZACION PREVIA */
    DELETE FROM CONTABILIZACION WHERE CNTB_TIPOREF = 21 AND CNTB_IDREF = :IDDOC;
    /* ENCABEZADO DE LA FACTURA */
    SELECT PREF_PRE, FACO_NUMERO, FACO_FECHA, F.TERC_NIT, FACO_IMPTOS, FACO_VENCE, FACO_DTOMONTO, FACO_ADICIONAL, FACO_IVAMONTO, FACO_EXTRA, FACO_TOTAL, FACO_RTFTEPORC, FACO_RTFTEMONTO, FACO_RTIVAPOR, FACO_RTIVAMONTO, FACO_RTICAPOR, FACO_RTICAMONTO, TERC_NOM, PROV_CTARTFTE, PROV_CTARTIVA, PROV_CTARTICA, PROV_CTAPAGAR, FACO_NUMPROV, FACO_ANULADO
        FROM FACTURAS_COMPRA F, TERCEROS T, PROVEEDORES P WHERE FACO_ID = :IDDOC AND F.TERC_NIT = T.TERC_NIT AND T.TERC_NIT = P.TERC_NIT
        INTO :PREFIJO, :NUM, :FECAUX, :NIT, :IMPINC, :VENCEAUX, :VRDTO, :VRADIC, :VRIVA, :VREXTRA, :VRTOTAL, :PRTFTE, :VRRTFTE, :PORC, :VRRTIVA, :PRTICA, :VRRTICA, :NOMBRE, TCTARTFTE, TCTARTIVA, TCTARTICA, TCTAPROV, :NUMPROV, :ANULADO;
    /* CENTRO DE LA BODEGA */
    IF (CENT = 'B') THEN
        SELECT BODE_CENTRO, BODE_PROY FROM BODEGA B, FACTURAS_COMPRA F WHERE B.BODE_COD = F.BODE_COD AND F.FACO_ID = :IDDOC INTO :CENTRO, :PROY;
    ELSE
        SELECT PREF_CENTRO,PREF_PROY  FROM PREFIJOS P, FACTURAS_COMPRA F WHERE P.PREF_PRE = F.PREF_PRE AND F.FACO_ID = :IDDOC AND P.TIDO_COD = 21 INTO :CENTRO, :PROY;
    if (ANULADO = 'N') then
        BEGIN
        NUMERO = PREFIJO || NUM;
        VRSUBT = VRTOTAL - VREXTRA - VRIVA;
        MERCANCIA = VRSUBT - VRADIC + VRDTO;
        EXECUTE PROCEDURE FECHA_A_CONTA(:FECAUX) returning_values (:FECHA);
        EXECUTE PROCEDURE FECHA_A_CONTA(:VENCEAUX) returning_values (:VENCE);
        if (NUMPROV IS NULL) then
            NUMPROV = NUMERO;
        CONCEPTO = 'FC No.' || NUMERO || '-' || SUBSTR(NOMBRE,1,26) || '-NPROV.' || NUMPROV;
        IDC = GEN_ID(ID_CONTABILIZA, 1);
        INSERT INTO CONTABILIZACION (CNTB_ID, CNTB_TIPOCOMP, CNTB_PREFCNT, CNTB_NUMERO, CNTB_FECHA, CNTB_CONCEPTO, CNTB_REF, CNTB_TIPOREF, CNTB_IDREF, CNTB_PREFREF, CNTB_NUMREF, CNTB_PROCESADO)
            VALUES (:IDC, :TIPOCOMP, :PREFCONT, :NUM, :FECHA, :CONCEPTO, '', 21, :IDDOC, :PREFIJO, :NUM, 'N');
        NUMITEMS = 0;
        SUMA = 0;
        NETO = 0;
        ERROR = 0;
        EXECUTE PROCEDURE LEE_CONFIGURACION('COMPRAS', 'FACTURAS', 'USAR IMPOCONSUMO COMO PORCENTAJE DE FOMENTO') RETURNING_VALUES (FOMENTO);
        EXECUTE PROCEDURE lee_configuracion('COMPRAS','FACTURAS','DESCUENTO Y VALOR ADICIONAL DEL DOCUMENTO COMO MENOR VALOR DEL COSTO') returning_values (:MENORV);
        SELECT SUM(FCDE_consumo) from facturas_compras_detalle where faco_id = :IDDOC into :valoradic;
        if (MENORV = 'SI') then
            if (MERCANCIA <> 0) then
                FACTOR = (CAST(VRSUBT AS DOUBLE PRECISION) - VALORADIC) / (CAST(MERCANCIA AS DOUBLE PRECISION) - VALORADIC);
            ELSE
                FACTOR = 1;
        ELSE
           FACTOR = 1;
        SELECT CAST(CONF_VALOR AS INTEGER) FROM CONFIGURACION WHERE CONF_MODULO = 'COMPRAS' AND CONF_CATEGORIA = 'GENERAL' AND CONF_PROPIEDAD = 'REDONDEO AL MULTIPLO DE DIEZ EN TOTALES' INTO :DIG;
        if (INVEN = 'A') then
            BEGIN
            FOR SELECT MAX(COAR_CTAINV), SUM(CAST(FCDE_CANT AS DOUBLE PRECISION) * (FCDE_PRUNIT-FCDE_DTOMONTO)), SUM(FCDE_IVAMONTO), SUM(FCDE_CONSUMO), MAX(F.BODE_COD)
                FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_COMPRAS_DETALLE F WHERE F.FACO_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD
                GROUP BY COAR_CTAINV, F.BODE_COD INTO :CTAINVEN, :MONTO, :IMPTOS, :VALORADIC, :BODE_DET DO
                BEGIN
                IF (CENT = 'B') THEN
                  SELECT BODE_CENTRO, BODE_PROY FROM BODEGA WHERE BODE_COD = :BODE_DET INTO :CENTRODET, :PROYDET;
                if (IMPINC = 'S') then
                    BEGIN
                    MONTO = MONTO - IMPTOS;
                    if (FOMENTO <> 'SI' ) then
                        MONTO = MONTO - VALORADIC;
                    END
                MONTO = MONTO * FACTOR;
                execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                EXECUTE PROCEDURE CUENTA_INTERFAZ(21, :IDDOC, :CTAINVEN, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    FOR SELECT F.ARTI_COD, (FCDE_CANT * (FCDE_PRUNIT-FCDE_DTOMONTO)), FCDE_IVAMONTO, FCDE_CONSUMO
                        FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_COMPRAS_DETALLE F WHERE F.FACO_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTAINV = :CUENTA
                        INTO :ARTICULO, :MONTO, :IMPTOS, :VALORADIC DO
                        BEGIN
                        if (IMPINC = 'S') then
                            BEGIN
                            MONTO = MONTO - IMPTOS;
                            if (FOMENTO <> 'SI' ) then
                                MONTO = MONTO - VALORADIC;
                            END
                        MONTO = MONTO * FACTOR;
                        execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                        IF (CENT = 'B') THEN
                           INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                               VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROYDET, :CENTRODET, NULL, NULL, NULL, :ARTICULO, 0, 0);
                        ELSE
                           INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                               VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                        NUMITEMS = NUMITEMS + 1;
                        NETO = NETO + MONTO;
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    IF (CENT = 'B') THEN
                       INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                           VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROYDET, :CENTRODET, :NUMERO, NULL, :VENCE, NULL, 0, 21);
                    ELSE
                       INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                           VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 21);
                    NUMITEMS = NUMITEMS + 1;
                    NETO = NETO + MONTO;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    IF (CENT = 'B') THEN
                       INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                           VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROYDET, :CENTRODET, NULL, NULL, NULL, NULL, 0, 0);
                    ELSE
                       INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                           VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NUMITEMS = NUMITEMS + 1;
                    NETO = NETO + MONTO;
                    END
                END
            END
        if (INVEN = 'K') then
            BEGIN
            FOR SELECT SUM(CAST(FCDE_CANT AS DOUBLE PRECISION) * (FCDE_PRUNIT-FCDE_DTOMONTO)), SUM(FCDE_IVAMONTO), SUM(FCDE_CONSUMO), MAX(BODE_COD)
                FROM FACTURAS_COMPRAS_DETALLE WHERE FACO_ID = :IDDOC GROUP BY BODE_COD INTO :MONTO, :IMPTOS, :VALORADIC, :BODE_DET Do
                BEGIN
                  IF (CENT = 'B') THEN
                    SELECT BODE_CENTRO, BODE_PROY FROM BODEGA WHERE BODE_COD = :BODE_DET INTO :CENTRODET, :PROYDET;
                  if (IMPINC = 'S') then
                   BEGIN
                    MONTO = MONTO - IMPTOS;
                    if (FOMENTO <> 'SI' ) then
                      MONTO = MONTO - VALORADIC;
                   END
                  MONTO = MONTO * FACTOR;
                  execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                  execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                  EXECUTE PROCEDURE CUENTA_INTERFAZ(21, :IDDOC, :CTAINVEN, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                  if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                  if (TIPOCUEN = 'I') then
                   BEGIN
                    FOR SELECT ARTI_COD, (FCDE_CANT * (FCDE_PRUNIT-FCDE_DTOMONTO)), FCDE_IVAMONTO, FCDE_CONSUMO
                      FROM FACTURAS_COMPRAS_DETALLE WHERE FACO_ID = :IDDOC INTO :ARTICULO, :MONTO, :IMPTOS, :VALORADIC DO
                       BEGIN
                       if (IMPINC = 'S') then
                        BEGIN
                         MONTO = MONTO - IMPTOS;
                         if (FOMENTO <> 'SI' ) then
                            MONTO = MONTO - VALORADIC;
                        END
                       MONTO = MONTO * FACTOR;
                       execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                       execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                       IF (CENT = 'B') THEN
                          INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                             VALUES (:IDC, :NUMITEMS, :CTAINVEN, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROYDET, :CENTRODET, NULL, NULL, NULL, :ARTICULO, 0, 0);
                       ELSE
                          INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                             VALUES (:IDC, :NUMITEMS, :CTAINVEN, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                       NUMITEMS = NUMITEMS + 1;
                       NETO = NETO + MONTO;
                       END
                   END
                  if (TIPOCUEN = 'C') then
                   BEGIN
                    IF (CENT = 'B') THEN
                       INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                         VALUES (:IDC, :NUMITEMS, :CTAINVEN, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROYDET, :CENTRODET, :NUMERO, NULL, :VENCE, NULL, 0, 21);
                    ELSE
                       INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                         VALUES (:IDC, :NUMITEMS, :CTAINVEN, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 21);
                    NUMITEMS = NUMITEMS + 1;
                    NETO = NETO + MONTO;
                   END
                  if (TIPOCUEN = 'N') then
                   BEGIN
                    IF (CENT = 'B') THEN
                       INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                          VALUES (:IDC, :NUMITEMS, :CTAINVEN, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROYDET, :CENTRODET, NULL, NULL, NULL, NULL, 0, 0);
                    ELSE
                       INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                          VALUES (:IDC, :NUMITEMS, :CTAINVEN, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NUMITEMS = NUMITEMS + 1;
                    NETO = NETO + MONTO;
                   END
                END
            END
        /* EL IVA */
        if (IVA = 'A') then
            BEGIN
            FOR SELECT MAX(COAR_CTAIVAC), SUM(FCDE_IVAMONTO), SUM(CAST(FCDE_CANT AS DOUBLE PRECISION) * (FCDE_PRUNIT-FCDE_DTOMONTO)), SUM(FCDE_CONSUMO)
                FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_COMPRAS_DETALLE F WHERE F.FACO_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD GROUP BY COAR_CTAIVAC
                INTO :CTAIVA, :IMPTOS, :MONTO, :VALORADIC DO
              if (IMPTOS <> 0) then
                BEGIN
                IMPTOS = CAST(IMPTOS AS DOUBLE PRECISION) * VRSUBT / MERCANCIA;
                if (IMPINC = 'S') then
                    BEGIN
                    MONTO = MONTO - IMPTOS;
                    if (FOMENTO <> 'SI' ) then
                        MONTO = MONTO - VALORADIC;
                    END
                MONTO = CAST(MONTO AS DOUBLE PRECISION) * VRSUBT / MERCANCIA;
                execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                EXECUTE PROCEDURE CUENTA_INTERFAZ(21, :IDDOC, :CTAIVA, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    FOR SELECT F.ARTI_COD, FCDE_IVAMONTO, (FCDE_CANT * (FCDE_PRUNIT-FCDE_DTOMONTO)), TAIV_PORC, FCDE_CONSUMO
                        FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_COMPRAS_DETALLE F, TARIFA_IVA T WHERE F.FACO_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTAIVAV = :CUENTA AND A.TAIV_COD = T.TAIV_COD
                        INTO :ARTICULO, :IMPTOS, :MONTO, :PORCIVA, :VALORADIC
                    DO
                        BEGIN
                        IMPTOS = CAST(IMPTOS AS DOUBLE PRECISION) * VRSUBT / MERCANCIA;
                        if (IMPINC = 'S') then
                            BEGIN
                            MONTO = MONTO - IMPTOS;
                            if (FOMENTO <> 'SI' ) then
                                MONTO = MONTO - VALORADIC;
                            END
                        MONTO = CAST(MONTO AS DOUBLE PRECISION) * VRSUBT / MERCANCIA;
                        execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :IMPTOS, 0, :MONTO, :PORCIVA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                        NUMITEMS = NUMITEMS + 1;
                        NETO = NETO + IMPTOS;
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :IMPTOS, 0, :MONTO, :IMPTOS*100/:MONTO, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 21);
                    NUMITEMS = NUMITEMS + 1;
                    NETO = NETO + IMPTOS;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :IMPTOS, 0, :MONTO, CAST(:IMPTOS AS DOUBLE PRECISION)*100/CAST(:MONTO AS DOUBLE PRECISION), :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NUMITEMS = NUMITEMS + 1;
                    NETO = NETO + IMPTOS;
                    END
                END
            END
        if (IVA = 'K') then /* IVA EN CTA CONSTANTE */
            BEGIN
            SELECT SUM(FCDE_IVAMONTO), SUM(CAST(FCDE_CANT AS DOUBLE PRECISION) * (FCDE_PRUNIT-FCDE_DTOMONTO)), SUM(FCDE_CONSUMO)
                FROM FACTURAS_COMPRAS_DETALLE F WHERE F.FACO_ID = :IDDOC INTO :IMPTOS, :MONTO, :VALORADIC;
            if (IMPTOS <> 0) then
                BEGIN
                IMPTOS = CAST(IMPTOS AS DOUBLE PRECISION) * VRSUBT / MERCANCIA;
                if (IMPINC = 'S') then
                    BEGIN
                    MONTO = MONTO - IMPTOS;
                    if (FOMENTO <> 'SI' ) then
                        MONTO = MONTO - VALORADIC;
                    END
                MONTO = CAST(MONTO AS DOUBLE PRECISION) * VRSUBT / MERCANCIA;
                execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                EXECUTE PROCEDURE CUENTA_INTERFAZ(21, :IDDOC, :CTAIVA, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    FOR SELECT F.ARTI_COD, (FCDE_CANT * (FCDE_PRUNIT-FCDE_DTOMONTO)), FCDE_IVAMONTO, TAIV_PORC, FCDE_CONSUMO
                        FROM ARTICULO A, FACTURAS_COMPRAS_DETALLE F, TARIFA_IVA T WHERE F.FACO_ID = :IDDOC AND A.TAIV_COD = T.TAIV_COD
                        INTO :ARTICULO, :MONTO, :IMPTOS, :PORCIVA, :VALORADIC DO
                        BEGIN
                        IMPTOS = CAST(IMPTOS AS DOUBLE PRECISION) * VRSUBT / MERCANCIA;
                        if (IMPINC = 'S') then
                            BEGIN
                            MONTO = MONTO - IMPTOS;
                            if (FOMENTO <> 'SI' ) then
                                MONTO = MONTO - VALORADIC;
                            END
                        MONTO = CAST(MONTO AS DOUBLE PRECISION) * VRSUBT / MERCANCIA;
                        execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                        if (IMPTOS <> 0) then
                            BEGIN
                            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                VALUES (:IDC, :NUMITEMS, :CTAIVA, :CONCEPTO, '', :IMPTOS, 0, :MONTO, :PORCIVA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                            NUMITEMS = NUMITEMS + 1;
                            NETO = NETO + IMPTOS;
                            END
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NUMITEMS, :CTAIVA, :CONCEPTO, '', :IMPTOS, 0, :MONTO, :IMPTOS*100/:MONTO, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 21);
                    NUMITEMS = NUMITEMS + 1;
                    NETO = NETO + IMPTOS;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NUMITEMS, :CTAIVA, :CONCEPTO, '', :IMPTOS, 0, :MONTO, :IMPTOS*100/:MONTO, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NUMITEMS = NUMITEMS + 1;
                    NETO = NETO + IMPTOS;
                    END
                END
            END
        /* EL IMPOCONSUMO */
        if (CONSUMO = 'A') then
            BEGIN
            FOR SELECT MAX(COAR_CTACONS), SUM(FCDE_CONSUMO) FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_COMPRAS_DETALLE F
                WHERE F.FACO_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD GROUP BY COAR_CTACONS INTO :CTACONSUMO, :IMPTOS
            DO
              if (IMPTOS <> 0) then
                BEGIN
                execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                EXECUTE PROCEDURE CUENTA_INTERFAZ(21, :IDDOC, :CTACONSUMO, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (FOMENTO <> 'SI') then
                    BEGIN
                    if (TIPOCUEN = 'I') then
                        BEGIN
                        FOR SELECT F.ARTI_COD, FCDE_CONSUMO FROM ARTICULO A, FACTURAS_COMPRAS_DETALLE F WHERE F.FACO_ID = :IDDOC INTO :ARTICULO, :IMPTOS
                            DO
                            BEGIN
                            if (IMPTOS <> 0) then
                                BEGIN
                                execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                    VALUES (:IDC, :NUMITEMS, :CTACONSUMO, :CONCEPTO, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                                NUMITEMS = NUMITEMS + 1;
                                NETO = NETO + IMPTOS;
                                END
                            END
                        END
                    if (TIPOCUEN = 'C') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CTACONSUMO, :CONCEPTO, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                        NUMITEMS = NUMITEMS + 1;
                        NETO = NETO + IMPTOS;
                        END
                    if (TIPOCUEN = 'N') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CTACONSUMO, :CONCEPTO, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NUMITEMS = NUMITEMS + 1;
                        NETO = NETO + IMPTOS;
                        END
                    END
                ELSE
                    BEGIN
                    if (TIPOCUEN = 'I') then
                        BEGIN
                        FOR SELECT F.ARTI_COD, FCDE_CONSUMO FROM ARTICULO A, FACTURAS_COMPRAS_DETALLE F WHERE F.FACO_ID = :IDDOC INTO :ARTICULO, :IMPTOS
                            DO
                            BEGIN
                            if (IMPTOS <> 0) then
                                BEGIN
                                execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                    VALUES (:IDC, :NUMITEMS, :CTACONSUMO, :CONCEPTO, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                                NUMITEMS = NUMITEMS + 1;
                                NETO = NETO - IMPTOS;
                                END
                            END
                        END
                    if (TIPOCUEN = 'C') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CTACONSUMO, :CONCEPTO, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                        NUMITEMS = NUMITEMS + 1;
                        NETO = NETO - IMPTOS;
                        END
                    if (TIPOCUEN = 'N') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CTACONSUMO, :CONCEPTO, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NUMITEMS = NUMITEMS + 1;
                        NETO = NETO - IMPTOS;
                        END
                    END
                END
            END
        if (CONSUMO = 'K') then /* CONSUMO EN CTA CONSTANTE */
            BEGIN
            SELECT SUM(FCDE_CONSUMO) FROM FACTURAS_COMPRAS_DETALLE F WHERE F.FACO_ID = :IDDOC INTO :IMPTOS;
            if (IMPTOS <> 0) then
              BEGIN
              execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
              /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
              EXECUTE PROCEDURE CUENTA_INTERFAZ(21, :IDDOC, :CTACONSUMO, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
              if (ERRORC <> 0) then
                ERROR = ERROR + 1;
              if (FOMENTO <> 'SI') then
                BEGIN
                /* DEPENDE DEL TIPO DE CUENTA */
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT F.ARTI_COD, FCDE_CONSUMO FROM ARTICULO A, FACTURAS_COMPRAS_DETALLE F WHERE F.FACO_ID = :IDDOC INTO :ARTICULO, :IMPTOS
                        DO
                        BEGIN
                        if (IMPTOS <> 0) then
                            BEGIN
                            execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                VALUES (:IDC, :NUMITEMS, :CTACONSUMO, :CONCEPTO, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                            NUMITEMS = NUMITEMS + 1;
                            NETO = NETO + IMPTOS;
                            END
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    /* INSERTE EL REGISTRO DE LA BASE */
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NUMITEMS, :CTACONSUMO, :CONCEPTO, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    NUMITEMS = NUMITEMS + 1;
                    NETO = NETO + IMPTOS;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NUMITEMS, :CTACONSUMO, :CONCEPTO, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NUMITEMS = NUMITEMS + 1;
                    NETO = NETO + IMPTOS;
                    END
                END
              ELSE
                BEGIN
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT F.ARTI_COD, FCDE_CONSUMO FROM ARTICULO A, FACTURAS_COMPRAS_DETALLE F WHERE F.FACO_ID = :IDDOC INTO :ARTICULO, :IMPTOS
                        DO
                        BEGIN
                        if (IMPTOS <> 0) then
                            BEGIN
                           execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                           INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                VALUES (:IDC, :NUMITEMS, :CTACONSUMO, :CONCEPTO, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                            NUMITEMS = NUMITEMS + 1;
                            NETO = NETO - IMPTOS;
                            END
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    /* INSERTE EL REGISTRO DE LA BASE */
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NUMITEMS, :CTACONSUMO, :CONCEPTO, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    NUMITEMS = NUMITEMS + 1;
                    NETO = NETO - IMPTOS;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NUMITEMS, :CTACONSUMO, :CONCEPTO, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NUMITEMS = NUMITEMS + 1;
                    NETO = NETO - IMPTOS;
                    END
                END
              end
            END
        /* DESCUENTO */
        if ((CTADTO IS NOT NULL) AND
            (CTADTO <> '')) THEN
          BEGIN
          execute procedure redondee(VRDTO, DIG) returning_values (VRDTO);
          if (VRDTO <> 0) then
            begin
            /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
            EXECUTE PROCEDURE CUENTA_INTERFAZ(21, :IDDOC, :CTADTO, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :VRDTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 21);
                NUMITEMS = NUMITEMS + 1;
                NETO = NETO - VRDTO;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                /* INSERTE EL REGISTRO DE LA BASE */
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :VRDTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NUMITEMS = NUMITEMS + 1;
                NETO = NETO - VRDTO;
                END
            end
          END
        /* VALOR ADIC */
        if ((CTAADIC IS NOT NULL) AND
            (CTAADIC <> '')) THEN
          BEGIN
          execute procedure redondee(VRADIC, DIG) returning_values (VRADIC);
          if (VRADIC <> 0) then
            begin
            /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
            EXECUTE PROCEDURE CUENTA_INTERFAZ(21, :IDDOC, :CTAADIC, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :VRADIC, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 21);
                NUMITEMS = NUMITEMS + 1;
                NETO = NETO + VRADIC;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :VRADIC, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NUMITEMS = NUMITEMS + 1;
                NETO = NETO + VRADIC;
                END
            end
          END
        /* VALOR EXTRA */
        if ((CTAEXTRA IS NOT NULL) AND
            (CTAEXTRA <> '')) THEN
          BEGIN
          execute procedure redondee(VREXTRA, DIG) returning_values (VREXTRA);
          if (VREXTRA <> 0) then
            begin
            /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
            EXECUTE PROCEDURE CUENTA_INTERFAZ(21, :IDDOC, :CTAEXTRA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :VREXTRA, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 21);
                NUMITEMS = NUMITEMS + 1;
                NETO = NETO + VREXTRA;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :VREXTRA, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NUMITEMS = NUMITEMS + 1;
                NETO = NETO + VREXTRA;
                END
            end
          END

        /* DESCUENTE EL IMPOCONSUMO */
        SELECT SUM(FCDE_CONSUMO) FROM FACTURAS_COMPRAS_DETALLE F WHERE F.FACO_ID = :IDDOC INTO :IMPTOS;
        if (IMPTOS IS NULL) then
            IMPTOS = 0;
        vrsubt = vrsubt - IMPTOS;
        /* RETENCION FUENTE */
        if ((RTFTE = 'P') or (RTFTE = 'K')) then
          BEGIN
          execute procedure redondee(VRRTFTE, DIG) returning_values (VRRTFTE);
          if (VRRTFTE <> 0) then
            begin
            if (RTFTE = 'P') then
                CTARTFTE = TCTARTFTE;
            EXECUTE PROCEDURE CUENTA_INTERFAZ(21, :IDDOC, :CTARTFTE, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :VRRTFTE, (:VRSUBT*-1), :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NUMITEMS = NUMITEMS + 1;
                NETO = NETO - VRRTFTE;
                SUMA = VRRTFTE;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :VRRTFTE, (:VRSUBT*-1), :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NUMITEMS = NUMITEMS + 1;
                NETO = NETO - VRRTFTE;
                SUMA = VRRTFTE;
                END
            end
          END
        if (RTFTE = 'A') then
          BEGIN
          FOR SELECT MAX(COAR_CTARTFTE), MAX(COAR_RTFTE), MIN(COAR_RTBASE), SUM(FCDE_TOTAL-FCDE_IVAMONTO-FCDE_CONSUMO), SUM((FCDE_TOTAL-FCDE_IVAMONTO-FCDE_CONSUMO)*COAR_RTFTE)
            FROM CONTABIL_ARTICULO C, FACTURAS_COMPRAS_DETALLE F
            WHERE F.faco_id = :IDDOC AND F.ARTI_COD = C.ARTI_COD
            GROUP BY COAR_CTARTFTE
            INTO :CTARTFTE, :PRTFTE, :baseadic,  :MONTO, :VRRTFTE
            DO
            BEGIN
            MONTO = MONTO * FACTOR * -1;
            if (MONTO >= :baseadic) then
                BEGIN
                VRRTFTE = VRRTFTE * FACTOR / 100;
                execute procedure redondee(VRRTFTE, DIG) returning_values (VRRTFTE);
                execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                if (VRRTFTE <> 0) then
                    BEGIN
                    EXECUTE PROCEDURE CUENTA_INTERFAZ(21, :IDDOC, :CTARTFTE, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
                    if (ERRORC <> 0) then
                        ERROR = ERROR + 1;
                    if (TIPOCUEN = 'C') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :VRRTFTE, :VRSUBT, :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                        NUMITEMS = NUMITEMS + 1;
                        NETO = NETO - VRRTFTE;
                        SUMA = VRRTFTE;
                        END
                    if (TIPOCUEN = 'N') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :VRRTFTE, :VRSUBT, :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NUMITEMS = NUMITEMS + 1;
                        NETO = NETO - VRRTFTE;
                        SUMA = VRRTFTE;
                        END
                    end
                end
              END
          END
        /* RETENCION IVA */
        if ((RTIVA = 'P') or (RTIVA = 'K')) then
          BEGIN
          execute procedure redondee(VRRTIVA, DIG) returning_values (VRRTIVA);
          if (VRRTIVA <> 0) then
            begin
            if (RTIVA = 'P') then
                CTARTIVA = TCTARTIVA;
            EXECUTE PROCEDURE CUENTA_INTERFAZ(21, :IDDOC, :CTARTIVA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :VRRTIVA, (:VRIVA*-1), :PORC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 21);
                NUMITEMS = NUMITEMS + 1;
                NETO = NETO - VRRTIVA;
                SUMA = SUMA + VRRTIVA;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :VRRTIVA, (:VRIVA*-1), :PORC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NUMITEMS = NUMITEMS + 1;
                NETO = NETO - VRRTIVA;
                SUMA = SUMA + VRRTIVA;
                END
            end
          END
        /* RETENCION DE ICA */
        if ((RTICA = 'P') or (RTICA = 'K')) then
          BEGIN
          execute procedure redondee(VRRTICA, DIG) returning_values (VRRTICA);
          if (VRRTICA <> 0) then
            begin
            if (RTICA = 'P') then
                CTARTICA = TCTARTICA;
            EXECUTE PROCEDURE CUENTA_INTERFAZ(21, :IDDOC, :CTARTICA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :VRRTICA, (:VRSUBT*-1), :PRTICA, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 21);
                NUMITEMS = NUMITEMS + 1;
                NETO = NETO - VRRTICA;
                SUMA = SUMA + VRRTICA;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :VRRTICA, (:VRSUBT*-1), :PRTICA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NUMITEMS = NUMITEMS + 1;
                NETO = NETO - VRRTICA;
                SUMA = SUMA + VRRTICA;
                END
            end
          END
        /* CIERRE EL COMPROBANTE CONTRA LA CUENTA DEL TERCERO O LA CONSTANTE */
        if ((CXP = 'P') or (CXP = 'K')) then
            BEGIN
            SUMA = VRTOTAL - SUMA;
            execute procedure redondee(SUMA, DIG) returning_values (SUMA);
            if (CXP = 'P') then
                CTACXP = TCTAPROV;
            EXECUTE PROCEDURE CUENTA_INTERFAZ(21, :IDDOC, :CTACXP, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :SUMA, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 21);
            if (TIPOCUEN = 'N') then
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :SUMA, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NETO = NETO - SUMA;
            NUMITEMS = NUMITEMS + 1;
            END
        /* recorra las cuentas adicionales */
        FOR SELECT INCC_CUENTA, INCC_BASE, INCC_PORC, INCC_VALOR, INCC_DB FROM INTERFAZ_COMPRAS_CTAS
            WHERE INCO_ID = :IDINTER INTO :CUENTAADIC, :BASEADIC, :PORCADIC, :VALORADIC, :DBADIC
            DO
            BEGIN
            if (VALORADIC <> 0) then
                MONTO = VALORADIC;
            ELSE
                BEGIN
                if (:BASEADIC = 'SUBTOTAL') then
                    VALORADIC = VRTOTAL - VREXTRA - VRIVA - VRADIC + VRDTO;
                if (:BASEADIC = 'DESCUENTO') then
                    VALORADIC = VRDTO;
                if (:BASEADIC = 'IVA') then
                    VALORADIC = VRIVA;
                if (:BASEADIC = 'CONSUMO') then
                    SELECT SUM(FCDE_CONSUMO) FROM FACTURAS_COMPRAS_DETALLE F WHERE F.FACO_ID = :IDDOC INTO :VALORADIC;
                if (:BASEADIC = 'ADICIONAL') then
                    VALORADIC = VRADIC;
                if (:BASEADIC = 'EXTRA') then
                    VALORADIC = VREXTRA;
                if (:BASEADIC = 'TOTAL') then
                    VALORADIC = VRTOTAL;
                MONTO = CAST(VALORADIC AS DOUBLE PRECISION) * PORCADIC / 100;
                END
            if (MONTO <> 0) then
                BEGIN
                execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                EXECUTE PROCEDURE CUENTA_INTERFAZ(21, :IDDOC, :CUENTAADIC, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'C') then
                    BEGIN
                    if (DBADIC = 'S') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTAADIC, :CONCEPTO, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                        SUMA = SUMA + MONTO;
                        NETO = NETO + MONTO;
                        END
                    ELSE
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTAADIC, :CONCEPTO, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                        SUMA = SUMA - MONTO;
                        NETO = NETO - MONTO;
                        END
                    NUMITEMS = NUMITEMS + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    if (DBADIC = 'S') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTAADIC, :CONCEPTO, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        SUMA = SUMA + MONTO;
                        NETO = NETO + MONTO;
                        END
                    ELSE
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTAADIC, :CONCEPTO, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        SUMA = SUMA - MONTO;
                        NETO = NETO - MONTO;
                        END
                    NUMITEMS = NUMITEMS + 1;
                    END
                END
            END
        if (NETO <> 0) then
            BEGIN
            EXECUTE PROCEDURE lee_configuracion ('CONTABILIDAD','GENERAL','CUENTA PARA CUADRAR COMPROBANTES DESCUADRADOS DE INTERFAZ') returning_values (:ctaadic);
            if (ctaadic <> '') then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(21, :IDDOC, :CTAADIC, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'C') then
                    BEGIN
                    if (NETO < 0) then
                        BEGIN
                        NETO = NETO * -1;
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :NETO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                        END
                    ELSE
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :NETO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                        END
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    if (NETO < 0) then
                        BEGIN
                        NETO = NETO * -1;
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :NETO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        END
                    ELSE
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :NETO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        END
                    END
                END
            END
        END
    if (ERROR > 0) then
        VER = 'S';
    SUSPEND;
    END
ELSE
    BEGIN
    EXECUTE PROCEDURE ERROR (21, :IDDOC, :PREFIJO, 1);
    ERROR = ERROR + 1;
    VER = 'S';
    SUSPEND;
    END
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE CONTABILICE_COMP_SIMPLIFICADO(
    IDI INTEGER)
RETURNS (
    ID INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    ESTADO VARCHAR(20),
    IDC INTEGER)
AS
DECLARE VARIABLE VER CHAR(2);
declare variable ERROR INTEGER;
BEGIN /*$$IBE$$ 
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;
   $$IBE$$*/ /* 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; */ /*$$IBE$$ 
  EXECUTE PROCEDURE CONTABIL_FACTCOMP (:ID, :IDI) RETURNING_VALUES (:ERROR, VER, :IDC);
  if (ERROR = 0) then
    BEGIN
 $$IBE$$*/ /*    EXECUTE PROCEDURE CONTABILIZA_PENDIENTE (:IDC); */ /*$$IBE$$ 
    ESTADO = 'OK';
    END
  ELSE
    ESTADO = 'ERROR';
  suspend;
  END
 $$IBE$$*/ SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE FACTCOMP_SIN_CONTABILIDAD(
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    ID INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    ESTADO VARCHAR(20),
    IDI INTEGER,
    IDC INTEGER)
AS
DECLARE VARIABLE VER CHAR(2);
declare variable FECICNT VARCHAR(10);
declare variable FECFCNT VARCHAR(10);
declare variable ERROR INTEGER;
declare variable idref INTEGER;
BEGIN /*$$IBE$$ 
EXECUTE PROCEDURE fecha_a_conta(FECINI) returning_values (FECICNT);
EXECUTE PROCEDURE fecha_a_conta(FECFIN) returning_values (FECFCNT);
FOR SELECT FACO_ID, PREF_PRE, FACO_NUMERO FROM FACTURAS_COMPRA WHERE FACO_ANULADO = 'N' AND
    FACO_FECHA >= :FECINI AND FACO_FECHA <= :FECFIN ORDER BY FACO_ID
    INTO :ID, :PREF, :NUMERO
DO
  BEGIN
  idref = null;
  SELECT ENCO_IDREF FROM COMPROBANTE_ENCABEZADO WHERE ENCO_TIPOREF = 21 AND ENCO_FECHA >= :FECICNT AND ENCO_FECHA <= :FECFCNT and ENCO_IDREF = :id into :idref;
  if (idref IS NULL) then
  begin
   ESTADO = 'PROCESANDO';
   SUSPEND;
   SELECT MAX(INCO_ID) FROM INTERFAZ_COMPRAS WHERE PREF_PRE = :PREF AND TIDO_COD = 21 INTO :IDI;
   EXECUTE PROCEDURE CONTABIL_FACTCOMP (:ID, :IDI) RETURNING_VALUES (:ERROR, VER, :IDC);
   if (ERROR = 0) then
    BEGIN
    EXECUTE PROCEDURE CONTABILIZA_PENDIENTE (:IDC);
    ESTADO = 'OK';
    END
   ELSE
    ESTADO = 'ERROR';
   suspend;
  End
  END
 $$IBE$$*/ SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

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

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE FACTCOMP_SIN_CONTABILIDAD(
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    ID INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    ESTADO VARCHAR(20),
    IDI INTEGER,
    IDC INTEGER)
AS
DECLARE VARIABLE VER CHAR(2);
declare variable FECICNT VARCHAR(10);
declare variable FECFCNT VARCHAR(10);
declare variable ERROR INTEGER;
declare variable idref INTEGER;
BEGIN
EXECUTE PROCEDURE fecha_a_conta(FECINI) returning_values (FECICNT);
EXECUTE PROCEDURE fecha_a_conta(FECFIN) returning_values (FECFCNT);
FOR SELECT FACO_ID, PREF_PRE, FACO_NUMERO FROM FACTURAS_COMPRA WHERE FACO_ANULADO = 'N' AND
    FACO_FECHA >= :FECINI AND FACO_FECHA <= :FECFIN ORDER BY FACO_ID
    INTO :ID, :PREF, :NUMERO
DO
  BEGIN
  idref = null;
  SELECT ENCO_IDREF FROM COMPROBANTE_ENCABEZADO WHERE ENCO_TIPOREF = 21 AND ENCO_FECHA >= :FECICNT AND ENCO_FECHA <= :FECFCNT and ENCO_IDREF = :id into :idref;
  if (idref IS NULL) then
  begin
   ESTADO = 'PROCESANDO';
   SUSPEND;
   SELECT MAX(INCO_ID) FROM INTERFAZ_COMPRAS WHERE PREF_PRE = :PREF AND TIDO_COD = 21 INTO :IDI;
   EXECUTE PROCEDURE CONTABIL_FACTCOMP (:ID, :IDI) RETURNING_VALUES (:ERROR, VER, :IDC);
   if (ERROR = 0) then
    BEGIN
    EXECUTE PROCEDURE CONTABILIZA_PENDIENTE (:IDC);
    ESTADO = 'OK';
    END
   ELSE
    ESTADO = 'ERROR';
   suspend;
  End
  END
END

^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER PROCEDURE CONTABIL_DEVOLCOMP(
    IDDOC INTEGER,
    IDINTER INTEGER)
RETURNS (
    ERROR INTEGER,
    VER CHAR(1),
    IDC INTEGER)
AS
declare variable PREFIJO VARCHAR(4);
declare variable NUM VARCHAR(6);
declare variable NUMERO VARCHAR(10);
declare variable FECAUX DATE;
declare variable FECHA CHAR(8);
declare variable CONCEPTO CHAR(100);
declare variable NUMFAC VARCHAR(10);
declare variable VRDTO NUMERIC(18, 2);
declare variable VRADIC NUMERIC(18, 2);
declare variable VRSUBT NUMERIC(18, 2);
declare variable VRIVA NUMERIC(18, 2);
declare variable PRTFTE NUMERIC(9, 2);
declare variable VRRTFTE NUMERIC(18, 2);
declare variable VRRTIVA NUMERIC(18, 2);
declare variable PRTICA NUMERIC(9, 2);
declare variable VRRTICA NUMERIC(18, 2);
declare variable VRTOTAL NUMERIC(18, 2);
declare variable VREXTRA NUMERIC(18, 2);
declare variable TIPOCOMP VARCHAR(3);
declare variable PREFCONT VARCHAR(4);
declare variable INVEN CHAR(1);
declare variable CTAINVEN VARCHAR(20);
declare variable IVA CHAR(1);
declare variable CTAIVA VARCHAR(20);
declare variable CONSUMO CHAR(1);
declare variable CTACONSUMO VARCHAR(20);
declare variable CXP CHAR(1);
declare variable CTACXP VARCHAR(20);
declare variable RTFTE CHAR(1);
declare variable CTARTFTE VARCHAR(20);
declare variable RTIVA CHAR(1);
declare variable CTARTIVA VARCHAR(20);
declare variable RTICA CHAR(1);
declare variable CTARTICA VARCHAR(20);
declare variable CTADTO VARCHAR(20);
declare variable CTAADIC VARCHAR(20);
declare variable CTAEXTRA VARCHAR(20);
declare variable EXISTE CHAR(1);
declare variable CUENTA VARCHAR(20);
declare variable MONTO NUMERIC(18,2);
declare variable TIPOCUEN CHAR(1);
declare variable NIT VARCHAR(20);
declare variable PROY VARCHAR(4);
declare variable CENTRO VARCHAR(4);
declare variable PORC NUMERIC(5,2);
declare variable DEBITO NUMERIC(18,2);
declare variable CREDITO NUMERIC(18,2);
declare variable NUMITEMS INTEGER;
declare variable ARTICULO VARCHAR(15);
declare variable IMPINC CHAR(1);
declare variable IMPTOS NUMERIC(18, 2);
declare variable SUMA NUMERIC(18,2);
declare variable PORCIVA NUMERIC(9,2);
declare variable TCTAPROV VARCHAR(20);
declare variable TCTARTFTE VARCHAR(20);
declare variable TCTARTIVA VARCHAR(20);
declare variable TCTARTICA VARCHAR(20);
declare variable CUENTAADIC VARCHAR(20);
declare variable BASEADIC VARCHAR(20);
declare variable PORCADIC NUMERIC(5,2);
declare variable VALORADIC NUMERIC(18,2);
declare variable DBADIC CHAR(1);
declare variable FOMENTO CHAR(2);
declare variable ANULADO CHAR(1);
declare variable CENT CHAR(1);
declare variable ERRORC INTEGER;
DECLARE VARIABLE MENORV CHAR(2);
DECLARE VARIABLE MERCANCIA NUMERIC(18,2);
declare variable FACTOR DOUBLE PRECISION;
declare variable DIG INTEGER;
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_CTAINVEN, INCO_CTAIVA, INCO_CTACONSUMO, INCO_CTADTO, INCO_CTAADIC, INCO_CTAEXTRA, INCO_CTACXP, INCO_CTARTFTE, INCO_CTARTIVA, INCO_CTARTICA, INCO_CONFIRMAR, INCO_CENTRO
    FROM INTERFAZ_COMPRAS
    WHERE INCO_ID = :IDINTER
    INTO :EXISTE, :TIPOCOMP, :PREFCONT, :INVEN, :IVA, :CONSUMO, :CXP, :RTFTE, :RTIVA, :RTICA, :CTAINVEN, :CTAIVA, :CTACONSUMO, :CTADTO, :CTAADIC, :CTAEXTRA, :CTACXP, :CTARTFTE, :CTARTIVA, :CTARTICA, :VER, :CENT;
if (EXISTE = 'S') then
   BEGIN
    /* BORRE 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, PROV_CTARTFTE, PROV_CTARTIVA, PROV_CTARTICA, PROV_CTAPAGAR, DVCO_ANULADO
        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, :TCTARTFTE, TCTARTIVA, TCTARTICA, TCTAPROV, ANULADO;
   if (ANULADO = 'N') then
    BEGIN
    NUMERO = PREFIJO || NUM;
    VRSUBT = VRTOTAL - VREXTRA - VRIVA; /* BASE DE RETEFTE Y RETEICA */
    IF (CENT = 'B') THEN
        SELECT BODE_CENTRO, BODE_PROY FROM BODEGA B, DEVOLUCIONES_COMPRAS F
            WHERE B.BODE_COD = F.BODE_COD AND F.DVCO_ID = :IDDOC INTO :CENTRO, :PROY;
    ELSE
        SELECT PREF_CENTRO,PREF_PROY FROM PREFIJOS P, DEVOLUCIONES_COMPRAS F
            WHERE P.PREF_PRE = F.PREF_PRE AND F.DVCO_ID = :IDDOC AND P.TIDO_COD = 24 INTO :CENTRO, :PROY;
    /* CONVIERTA LA FECHA A CADENA */
    EXECUTE PROCEDURE FECHA_A_CONTA(:FECAUX) returning_values (:FECHA);
    EXECUTE PROCEDURE LEE_CONFIGURACION('COMPRAS', 'FACTURAS', 'USAR IMPOCONSUMO COMO PORCENTAJE DE FOMENTO') RETURNING_VALUES (FOMENTO);
    EXECUTE PROCEDURE lee_configuracion('COMPRAS','FACTURAS','DESCUENTO Y VALOR ADICIONAL DEL DOCUMENTO COMO MENOR VALOR DEL COSTO') returning_values (:MENORV);
    SELECT CAST(CONF_VALOR AS INTEGER) FROM CONFIGURACION WHERE CONF_MODULO = 'COMPRAS' AND CONF_CATEGORIA = 'GENERAL' AND CONF_PROPIEDAD = 'REDONDEO AL MULTIPLO DE DIEZ EN TOTALES' INTO :DIG;
    VRSUBT = VRTOTAL - VREXTRA - VRIVA;
    MERCANCIA = VRSUBT - VRADIC + VRDTO;
    SELECT SUM(DVCD_consumo) from devoluciones_compras_det where dvco_id = :IDDOC into :valoradic;
    if (MENORV = 'SI') then
        if (MERCANCIA <> 0) then
            FACTOR = (CAST(VRSUBT AS DOUBLE PRECISION) - VALORADIC) / (CAST(MERCANCIA AS DOUBLE PRECISION) - VALORADIC);
        ELSE
            FACTOR = 1;
    ELSE
        FACTOR = 1;

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

    NUMITEMS = 0;
    SUMA = 0;
    ERROR = 0;
    /* CUENTAS DE INVENTARIO */
    if (INVEN = 'A') then
        BEGIN
        /* SUME LAS BASES DE LOS ARTICULOS DEL DOCUMENTO */
        FOR SELECT MAX(COAR_CTACOMP), SUM(cast(DVCD_CANT as double precision) * (DVCD_PRUNIT-DVCD_DTOMONTO)), SUM(DVCD_IVAMONTO), SUM(DVCD_CONSUMO)
            FROM ARTICULO A, CONTABIL_ARTICULO C, DEVOLUCIONES_COMPRAS_DET F
            WHERE F.DVCO_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD
            GROUP BY COAR_CTAINV
            INTO :CTAINVEN, :MONTO, :IMPTOS, :VALORADIC
            DO
            BEGIN
            if (IMPINC = 'S') then
                BEGIN
                MONTO = MONTO - IMPTOS;
                if (FOMENTO <> 'SI') then
                    MONTO = MONTO - VALORADIC;
                END
            /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
            EXECUTE PROCEDURE CUENTA_INTERFAZ(24, :IDDOC, :CTAINVEN, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            /* DEPENDE DEL TIPO DE CUENTA */
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, REGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT F.ARTI_COD, (cast(DVCD_CANT as double precision) * (DVCD_PRUNIT-DVCD_DTOMONTO)), DVCD_IVAMONTO, DVCD_CONSUMO
                    FROM ARTICULO A, CONTABIL_ARTICULO C, DEVOLUCIONES_COMPRAS_DET F
                    WHERE F.DVCO_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTAINV = :CUENTA
                    INTO :ARTICULO, :MONTO, :IMPTOS, :VALORADIC
                DO
                    BEGIN
                    if (IMPINC = 'S') then
                        BEGIN
                        MONTO = MONTO - IMPTOS;
                        if (FOMENTO <> 'SI') then
                            MONTO = MONTO - VALORADIC;
                        END
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                    NUMITEMS = NUMITEMS + 1;
                    SUMA = SUMA - MONTO;
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                /* INSERTE EL REGISTRO DE LA BASE */
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 24);
                NUMITEMS = NUMITEMS + 1;
                SUMA = SUMA - MONTO;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                /* INSERTE EL REGISTRO DE LA BASE */
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NUMITEMS = NUMITEMS + 1;
                SUMA = SUMA - MONTO;
                END
            END /* FOR */
        END /* INVENTARIO X ARTICULO */

    if (INVEN = 'K') then
        BEGIN
        /* SUME LAS BASES DE LOS ARTICULOS DEL DOCUMENTO */
        SELECT SUM(cast(DVCD_CANT as double precision) * (DVCD_PRUNIT-DVCD_DTOMONTO)), SUM(DVCD_IVAMONTO), SUM(DVCD_CONSUMO)
            FROM DEVOLUCIONES_COMPRAS_DET WHERE DVCO_ID = :IDDOC
            INTO :MONTO, :IMPTOS, :VALORADIC;
        if (IMPINC = 'S') then
            BEGIN
            MONTO = MONTO - IMPTOS;
            if (FOMENTO <> 'SI') then
                MONTO = MONTO - VALORADIC;
            END
        /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
        EXECUTE PROCEDURE CUENTA_INTERFAZ(24, :IDDOC, :CTAINVEN, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        /* DEPENDE DEL TIPO DE CUENTA */
        if (TIPOCUEN = 'I') then
            BEGIN
            /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
            FOR SELECT ARTI_COD, (cast(DVCD_CANT as double precision) * (DVCD_PRUNIT-DVCD_DTOMONTO)), DVCD_IVAMONTO, DVCD_CONSUMO
                FROM DEVOLUCIONES_COMPRAS_DET
                WHERE DVCO_ID = :IDDOC
                INTO :ARTICULO, :MONTO, :IMPTOS, :VALORADIC
                DO
                BEGIN
                if (IMPINC = 'S') then
                    BEGIN
                    MONTO = MONTO - IMPTOS;
                    if (FOMENTO <> 'SI') then
                        MONTO = MONTO - VALORADIC;
                    END
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NUMITEMS, :CTAINVEN, :CONCEPTO, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                NUMITEMS = NUMITEMS + 1;
                SUMA = SUMA - MONTO;
                END
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NUMITEMS, :CTAINVEN, :CONCEPTO, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 24);
            NUMITEMS = NUMITEMS + 1;
            SUMA = SUMA - MONTO;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NUMITEMS, :CTAINVEN, :CONCEPTO, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NUMITEMS = NUMITEMS + 1;
            SUMA = SUMA - MONTO;
            END
        END /* INVEN = K */
        
    /* EL IVA */
    if (IVA = 'A') then
        BEGIN
        /* SUME LAS BASES DE LOS ARTICULOS DEL DOCUMENTO */
        FOR SELECT MAX(COAR_CTAIVAC), SUM(DVCD_IVAMONTO), SUM(cast(DVCD_CANT as double precision) * (DVCD_PRUNIT-DVCD_DTOMONTO)), SUM(DVCD_CONSUMO)
            FROM ARTICULO A, CONTABIL_ARTICULO C, DEVOLUCIONES_COMPRAS_DET F
            WHERE F.DVCO_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD
            GROUP BY COAR_CTAIVAC
            INTO :CTAIVA, :IMPTOS, :MONTO, :VALORADIC
        DO
          if (IMPTOS <> 0) then
            BEGIN
            if (IMPINC = 'S') then
                BEGIN
                MONTO = MONTO - IMPTOS;
                if (FOMENTO <> 'SI') then
                    MONTO = MONTO - VALORADIC;
                END

            /* TRAIGA LAS CARCATERISTICAS DE LA CUENTA */
            EXECUTE PROCEDURE CUENTA_INTERFAZ(24, :IDDOC, :CTAIVA, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            /* DEPENDE DEL TIPO DE CUENTA */
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT F.ARTI_COD, DVCD_IVAMONTO, (cast(DVCD_CANT as double precision) * (DVCD_PRUNIT-DVCD_DTOMONTO)), TAIV_PORC, DVCD_CONSUMO
                    FROM ARTICULO A, CONTABIL_ARTICULO C, DEVOLUCIONES_COMPRAS_DET F, TARIFA_IVA T
                    WHERE F.DVCO_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTAIVAV = :CUENTA AND A.TAIV_COD = T.TAIV_COD
                    INTO :ARTICULO, :IMPTOS, :MONTO, :PORCIVA, :VALORADIC
                DO
                    BEGIN
                    if (IMPINC = 'S') then
                        BEGIN
                        MONTO = MONTO - IMPTOS;
                        if (FOMENTO <> 'SI') then
                            MONTO = MONTO - VALORADIC;
                        END
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :IMPTOS, :MONTO, :PORCIVA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                    NUMITEMS = NUMITEMS + 1;
                    SUMA = SUMA - IMPTOS;
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :IMPTOS, 0, 0, :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, 0, 0, :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 
            INTO :IMPTOS, :MONTO, :VALORADIC;
            
        if (IMPTOS <> 0) then
            BEGIN
            if (IMPINC = 'S') then
                BEGIN
                MONTO = MONTO - IMPTOS;
                if (FOMENTO <> 'SI') then
                    MONTO = MONTO - VALORADIC;
                END
            /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
            EXECUTE PROCEDURE CUENTA_INTERFAZ(24, :IDDOC, :CTAIVA, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            /* DEPENDE DEL TIPO DE CUENTA */
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT F.ARTI_COD, (cast(DVCD_CANT as double precision) * (DVCD_PRUNIT-DVCD_DTOMONTO)), DVCD_IVAMONTO, TAIV_PORC, DVCD_CONSUMO
                    FROM ARTICULO A, DEVOLUCIONES_COMPRAS_DET F, TARIFA_IVA T
                    WHERE F.DVCO_ID = :IDDOC AND A.TAIV_COD = T.TAIV_COD
                    INTO :ARTICULO, :MONTO, :IMPTOS, :PORCIVA, :VALORADIC
                    DO
                    BEGIN
                    if (IMPTOS <> 0) then
                        BEGIN
                        if (IMPINC = 'S') then
                            BEGIN
                            MONTO = MONTO - IMPTOS;
                            if (FOMENTO <> 'SI') then
                                MONTO = MONTO - VALORADIC;
                            END
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CTAIVA, :CONCEPTO, '', 0, :IMPTOS, :MONTO, :PORCIVA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                        NUMITEMS = NUMITEMS + 1;
                        SUMA = SUMA - IMPTOS;
                        END
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                /* INSERTE EL REGISTRO DE LA BASE */
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NUMITEMS, :CTAIVA, :CONCEPTO, '', 0, :IMPTOS, 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, :CTAIVA, :CONCEPTO, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NUMITEMS = NUMITEMS + 1;
                SUMA = SUMA - IMPTOS;
                END
            END /* <> 0 */
        END /* IVA EN CTA CONSTANTE */
        
    /* EL IMPOCONSUMO */
    if (CONSUMO = 'A') then
        BEGIN
        /* SUME LAS BASES DE LOS ARTICULOS DEL DOCUMENTO */
        FOR SELECT MAX(COAR_CTACONS), SUM(DVCD_CONSUMO)
            FROM ARTICULO A, CONTABIL_ARTICULO C, DEVOLUCIONES_COMPRAS_DET F
            WHERE F.DVCO_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD
            GROUP BY COAR_CTACONS
            INTO :CTACONSUMO, :IMPTOS
        DO
            BEGIN
            if (IMPTOS <> 0) then
                BEGIN
                /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
                EXECUTE PROCEDURE CUENTA_INTERFAZ(24, :IDDOC, :CTACONSUMO, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (FOMENTO <> 'SI') then
                    BEGIN
                    /* DEPENDE DEL TIPO DE CUENTA */
                    if (TIPOCUEN = 'I') then
                        BEGIN
                        /* ES UNA CUENTA DE INVENTARIO, REGISTRE UNO A UNO LOS ARTICULOS */
                        FOR SELECT F.ARTI_COD, DVCD_CONSUMO
                            FROM ARTICULO A, CONTABIL_ARTICULO C, DEVOLUCIONES_COMPRAS_DET F
                            WHERE F.DVCO_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTACONS = :CUENTA
                            INTO :ARTICULO, :IMPTOS
                            DO
                            BEGIN
                            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                            NUMITEMS = NUMITEMS + 1;
                            SUMA = SUMA - IMPTOS;
                            END
                        END
                    if (TIPOCUEN = 'C') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 24);
                        NUMITEMS = NUMITEMS + 1;
                        SUMA = SUMA - IMPTOS;
                        END
                    if (TIPOCUEN = 'N') then
                        BEGIN
                        /* INSERTE EL REGISTRO DE LA BASE */
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NUMITEMS = NUMITEMS + 1;
                        SUMA = SUMA - IMPTOS;
                        END
                    END
                ELSE
                    BEGIN
                    if (TIPOCUEN = 'I') then
                        BEGIN
                        /* ES UNA CUENTA DE INVENTARIO, REGISTRE UNO A UNO LOS ARTICULOS */
                        FOR SELECT F.ARTI_COD, DVCD_CONSUMO
                            FROM ARTICULO A, CONTABIL_ARTICULO C, DEVOLUCIONES_COMPRAS_DET F
                            WHERE F.DVCO_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTACONS = :CUENTA
                            INTO :ARTICULO, :IMPTOS
                            DO
                            BEGIN
                            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                VALUES (:IDC, :NUMITEMS, :CTACONSUMO, :CONCEPTO, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                            NUMITEMS = NUMITEMS + 1;
                            SUMA = SUMA + IMPTOS;
                            END
                        END
                    if (TIPOCUEN = 'C') then
                        BEGIN
                        /* INSERTE EL REGISTRO DE LA BASE */
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CTACONSUMO, :CONCEPTO, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 24);
                        NUMITEMS = NUMITEMS + 1;
                        SUMA = SUMA + IMPTOS;
                        END
                    if (TIPOCUEN = 'N') then
                        BEGIN
                        /* INSERTE EL REGISTRO DE LA BASE */
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CTACONSUMO, :CONCEPTO, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NUMITEMS = NUMITEMS + 1;
                        SUMA = SUMA + IMPTOS;
                        END
                    END
                END
            END /* FOR */
        END /* CONSUMO X ARTICULO */
        
    if (CONSUMO = 'K') then /* CONSUMO EN CTA CONSTANTE */
        BEGIN
        SELECT SUM(DVCD_CONSUMO)
            FROM DEVOLUCIONES_COMPRAS_DET F
            WHERE F.DVCO_ID = :IDDOC 
            INTO :IMPTOS;
            
        if (IMPTOS <> 0) then
            BEGIN
            /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
            EXECUTE PROCEDURE CUENTA_INTERFAZ(24, :IDDOC, :CTACONSUMO, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (FOMENTO <> 'SI') then
                BEGIN
                /* DEPENDE DEL TIPO DE CUENTA */
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT F.ARTI_COD, DVCD_CONSUMO
                        FROM ARTICULO A, DEVOLUCIONES_COMPRAS_DET F
                        WHERE F.DVCO_ID = :IDDOC
                        INTO :ARTICULO, :IMPTOS
                        DO
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CTACONSUMO, :CONCEPTO, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                        NUMITEMS = NUMITEMS + 1;
                        SUMA = SUMA - IMPTOS;
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    /* INSERTE EL REGISTRO DE LA BASE */
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NUMITEMS, :CTACONSUMO, :CONCEPTO, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 24);
                    NUMITEMS = NUMITEMS + 1;
                    SUMA = SUMA - IMPTOS;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    /* INSERTE EL REGISTRO DE LA BASE */
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NUMITEMS, :CTACONSUMO, :CONCEPTO, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NUMITEMS = NUMITEMS + 1;
                    SUMA = SUMA - IMPTOS;
                    END
                END
            ELSE
                BEGIN
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT F.ARTI_COD, DVCD_CONSUMO
                        FROM ARTICULO A, DEVOLUCIONES_COMPRAS_DET F
                        WHERE F.DVCO_ID = :IDDOC
                        INTO :ARTICULO, :IMPTOS
                        DO
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CTACONSUMO, :CONCEPTO, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                        NUMITEMS = NUMITEMS + 1;
                        SUMA = SUMA + IMPTOS;
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    /* INSERTE EL REGISTRO DE LA BASE */
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NUMITEMS, :CTACONSUMO, :CONCEPTO, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 24);
                    NUMITEMS = NUMITEMS + 1;
                    SUMA = SUMA + IMPTOS;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    /* INSERTE EL REGISTRO DE LA BASE */
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NUMITEMS, :CTACONSUMO, :CONCEPTO, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NUMITEMS = NUMITEMS + 1;
                    SUMA = SUMA + IMPTOS;
                    END
                END
            END
        END /* CONSUMO EN CTA CONSTANTE */
        
    /* DESCUENTO */
    if ((CTADTO IS NOT NULL) AND
        (CTADTO <> '') AND
        (VRDTO <> 0)) THEN
        BEGIN
        /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
        EXECUTE PROCEDURE CUENTA_INTERFAZ(24, :IDDOC, :CTADTO, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :VRDTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 24);
            NUMITEMS = NUMITEMS + 1;
            SUMA = SUMA + VRDTO;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            /* INSERTE EL REGISTRO DE LA BASE */
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :VRDTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NUMITEMS = NUMITEMS + 1;
            SUMA = SUMA + VRDTO;
            END
        END /* DESCUENTO */
        
    /* VALOR ADIC */
    if ((CTAADIC IS NOT NULL) AND
        (CTAADIC <> '') AND
        (VRADIC <> 0)) THEN
        BEGIN
        /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
        EXECUTE PROCEDURE CUENTA_INTERFAZ(24, :IDDOC, :CTAADIC, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :VRADIC, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 24);
            NUMITEMS = NUMITEMS + 1;
            SUMA = SUMA - VRADIC;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            /* INSERTE EL REGISTRO DE LA BASE */
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :VRADIC, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NUMITEMS = NUMITEMS + 1;
            SUMA = SUMA - VRADIC;
            END
        END /* VR. ADIC */
        
    /* VALOR EXTRA */
    if ((CTAEXTRA IS NOT NULL) AND
        (CTAEXTRA <> '') AND
        (VREXTRA <> 0)) THEN
        BEGIN
        /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
        EXECUTE PROCEDURE CUENTA_INTERFAZ(24, :IDDOC, :CTAEXTRA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :VREXTRA, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 24);
            NUMITEMS = NUMITEMS + 1;
            SUMA = SUMA + VREXTRA;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            /* INSERTE EL REGISTRO DE LA BASE */
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :VREXTRA, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NUMITEMS = NUMITEMS + 1;
            SUMA = SUMA + VREXTRA;
            END
        END /* VR. EXTRA */
        
    if (fomento <> 'SI') then
        BEGIN
        /* DESCUENTE EL IMPOCONSUMO */
        SELECT SUM(DVCD_CONSUMO)
            FROM devoluciones_compras_det WHERE DVCO_ID = :IDDOC INTO :IMPTOS;
        if (IMPTOS IS NULL) then
            IMPTOS = 0;
        vrsubt = vrsubt - IMPTOS;
        END
    /* RETENCION FUENTE */
    if ((RTFTE = 'P') or (RTFTE = 'K')) then
      if (VRRTFTE <> 0) then
        BEGIN
        if (RTFTE = 'P') then
            CTARTFTE = TCTARTFTE;
            
        /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
        EXECUTE PROCEDURE CUENTA_INTERFAZ(24, :IDDOC, :CTARTFTE, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :VRRTFTE, 0, :VRSUBT, :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 24);
            NUMITEMS = NUMITEMS + 1;
            SUMA = SUMA + VRRTFTE;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            /* INSERTE EL REGISTRO DE LA BASE */
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :VRRTFTE, 0, :VRSUBT, :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NUMITEMS = NUMITEMS + 1;
            SUMA = SUMA + VRRTFTE;
            END
        END /* RTFTE */
    if (RTFTE = 'A') then
        BEGIN
        FOR SELECT MAX(COAR_CTARTFTE), MAX(COAR_RTFTE), MIN(COAR_RTBASE), SUM(DVCD_TOTAL-DVCD_IVAMONTO-DVCD_CONSUMO), SUM((DVCD_TOTAL-DVCD_IVAMONTO-DVCD_CONSUMO)*COAR_RTFTE)
            FROM CONTABIL_ARTICULO C, DEVOLUCIONES_COMPRAS_DET F
            WHERE F.dvco_id = :IDDOC AND F.ARTI_COD = C.ARTI_COD
            GROUP BY COAR_CTARTFTE
            INTO :CTARTFTE, :PRTFTE, :baseadic, :MONTO, :VRRTFTE
            DO
            BEGIN
            MONTO = MONTO * FACTOR;
            if (MONTO >= BASEADIC) then
                BEGIN
                VRRTFTE = VRRTFTE * FACTOR / 100;
                execute procedure redondee(VRRTFTE, DIG) returning_values (VRRTFTE);
                execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                if (VRRTFTE <> 0) then
                    BEGIN
                    /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
                    EXECUTE PROCEDURE CUENTA_INTERFAZ(24, :IDDOC, :CTARTFTE, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
                    if (ERRORC <> 0) then
                        ERROR = ERROR + 1;
                    if (TIPOCUEN = 'C') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :VRRTFTE, 0, :VRSUBT, :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 24);
                        NUMITEMS = NUMITEMS + 1;
                        SUMA = SUMA + VRRTFTE;
                        END
                    if (TIPOCUEN = 'N') then
                        BEGIN
                        /* INSERTE EL REGISTRO DE LA BASE */
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :VRRTFTE, 0, :VRSUBT, :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NUMITEMS = NUMITEMS + 1;
                        SUMA = SUMA + VRRTFTE;
                        END
                    END
                END
            END
        END /* RTFTE */
    /* RETENCION IVA */
    if ((RTIVA = 'P') or (RTIVA = 'K')) then
      if (VRRTIVA <> 0) then
        BEGIN
        if (RTIVA = 'P') then
            CTARTIVA = TCTARTIVA;
            
        /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
        EXECUTE PROCEDURE CUENTA_INTERFAZ(24, :IDDOC, :CTARTIVA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :VRRTIVA, 0, :VRIVA, :PORC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 24);
            NUMITEMS = NUMITEMS + 1;
            SUMA = SUMA + VRRTIVA;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            /* INSERTE EL REGISTRO DE LA BASE */
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :VRRTIVA, 0, :VRIVA, :PORC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NUMITEMS = NUMITEMS + 1;
            SUMA = SUMA + VRRTIVA;
            END
        END /* RTIVA */
        
    /* RETENCION DE ICA */
    if ((RTICA = 'P') or (RTICA = 'K')) then
      if (VRRTICA <> 0) then
        BEGIN
        if (RTICA = 'P') then
            CTARTICA = TCTARTICA;
            
        /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
        EXECUTE PROCEDURE CUENTA_INTERFAZ(24, :IDDOC, :CTARTICA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :VRRTICA, 0, :VRSUBT, :PRTICA, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 24);
            NUMITEMS = NUMITEMS + 1;
            SUMA = SUMA + VRRTICA;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            /* INSERTE EL REGISTRO DE LA BASE */
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :VRRTICA, 0, :VRSUBT, :PRTICA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NUMITEMS = NUMITEMS + 1;
            SUMA = SUMA + VRRTICA;
            END
        END /* RTICA */
    /* recorra las cuentas adicionales */
    FOR SELECT INCC_CUENTA, INCC_BASE, INCC_PORC, INCC_VALOR, INCC_DB
        FROM INTERFAZ_COMPRAS_CTAS
        WHERE INCO_ID = :IDINTER
        INTO :CUENTAADIC, :BASEADIC, :PORCADIC, :VALORADIC, :DBADIC
        DO
        BEGIN
        if (VALORADIC <> 0) then
            MONTO = VALORADIC;
        ELSE
            BEGIN
            if (:BASEADIC = 'SUBTOTAL') then
                VALORADIC = VRTOTAL - VREXTRA - VRIVA - VRADIC + VRDTO;
            if (:BASEADIC = 'DESCUENTO') then
                VALORADIC = VRDTO;
            if (:BASEADIC = 'IVA') then
                VALORADIC = VRIVA;
            if (:BASEADIC = 'CONSUMO') then
                SELECT SUM(DVCD_CONSUMO)
                    FROM DEVOLUCIONES_COMPRAS_DET F
                    WHERE F.DVCO_ID = :IDDOC 
                    INTO :VALORADIC;
            if (:BASEADIC = 'ADICIONAL') then
                VALORADIC = VRADIC;
            if (:BASEADIC = 'EXTRA') then
                VALORADIC = VREXTRA;
            if (:BASEADIC = 'TOTAL') then
                VALORADIC = VRTOTAL;
            MONTO = VALORADIC * PORCADIC;
            END
        if (MONTO <> 0) then
            BEGIN
            /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
            EXECUTE PROCEDURE CUENTA_INTERFAZ(24, :IDDOC, :CUENTAADIC, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                if (DBADIC = 'S') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NUMITEMS, :CUENTAADIC, :CONCEPTO, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 24);
                    SUMA = SUMA + MONTO;
                    END
                ELSE
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NUMITEMS, :CUENTAADIC, :CONCEPTO, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 24);
                    SUMA = SUMA - MONTO;
                    END
                NUMITEMS = NUMITEMS + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                if (DBADIC = 'S') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NUMITEMS, :CUENTAADIC, :CONCEPTO, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    SUMA = SUMA + MONTO;
                    END
                ELSE
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NUMITEMS, :CUENTAADIC, :CONCEPTO, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    SUMA = SUMA - MONTO;
                    END
                NUMITEMS = NUMITEMS + 1;
                END
            NUMITEMS = NUMITEMS + 1;
            END
        END
    /* CIERRE EL COMPROBANTE CONTRA LA CUENTA DEL TERCERO O LA CONSTANTE */
    if ((SUMA <> 0) and ((CXP = 'P') or (CXP = 'K'))) then
        BEGIN
        if (SUMA < 0) then
            BEGIN
            DEBITO = SUMA * -1;
            CREDITO = 0;
            END
        ELSE
            BEGIN
            DEBITO = 0;
            CREDITO = SUMA;
            END
        if (CXP = 'P') then
            CTACXP = TCTAPROV;

        /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
        EXECUTE PROCEDURE CUENTA_INTERFAZ(24, :IDDOC, :CTACXP, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :DEBITO, :CREDITO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 24);
        if (TIPOCUEN = 'N') then
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :DEBITO, :CREDITO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
        END /* SUMA EN CXP */
     end
    if (ERROR > 0) then
        VER = 'S';
    SUSPEND;
    END /* EXISTE */
ELSE
    BEGIN
    EXECUTE PROCEDURE ERROR (24, :IDDOC, :PREFIJO, 1);
    ERROR = ERROR + 1;
    VER = 'S';
    SUSPEND;
    END
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE DEVCOMPRA_SIN_CONTABILIDAD(
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    ID INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    ESTADO VARCHAR(20),
    IDI INTEGER,
    IDC INTEGER)
AS
DECLARE VARIABLE VER CHAR(2);
declare variable FECICNT VARCHAR(10);
declare variable FECFCNT VARCHAR(10);
declare variable ERROR INTEGER;
declare variable idref INTEGER;
BEGIN /*$$IBE$$ 
EXECUTE PROCEDURE fecha_a_conta(FECINI) returning_values (FECICNT);
EXECUTE PROCEDURE fecha_a_conta(FECFIN) returning_values (FECFCNT);
FOR SELECT DVCO_ID, PREF_PRE, DVCO_NUMERO FROM DEVOLUCIONES_COMPRAS WHERE DVCO_ANULADO = 'N' AND
    DVCO_FECHA >= :FECINI AND DVCO_FECHA <= :FECFIN
    INTO :ID, :PREF, :NUMERO
DO
  BEGIN
  idref = null;
  SELECT ENCO_IDREF FROM COMPROBANTE_ENCABEZADO WHERE ENCO_TIPOREF = 24 AND ENCO_FECHA >= :FECICNT AND ENCO_FECHA <= :FECFCNT and ENCO_IDREF = :id into :idref;
  if (idref IS NULL) then
  begin
   ESTADO = 'PROCESANDO';
   SUSPEND;
   SELECT MAX(INCO_ID) FROM INTERFAZ_COMPRAS WHERE PREF_PRE = :PREF AND TIDO_COD = 24 INTO :IDI;
   EXECUTE PROCEDURE CONTABIL_DEVOLCOMP (:ID, :IDI) RETURNING_VALUES (:ERROR, :VER, :IDC);
   if (ERROR = 0) then
    BEGIN
      EXECUTE PROCEDURE CONTABILIZA_PENDIENTE (:IDC);
      ESTADO = 'OK';
    end
   ELSE
    ESTADO = 'ERROR';
   suspend;
  End
  END
 $$IBE$$*/ SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE DEVCOMPRA_SIN_CONTABILIDAD(
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    ID INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    ESTADO VARCHAR(20),
    IDI INTEGER,
    IDC INTEGER)
AS
DECLARE VARIABLE VER CHAR(2);
declare variable FECICNT VARCHAR(10);
declare variable FECFCNT VARCHAR(10);
declare variable ERROR INTEGER;
declare variable idref INTEGER;
BEGIN
EXECUTE PROCEDURE fecha_a_conta(FECINI) returning_values (FECICNT);
EXECUTE PROCEDURE fecha_a_conta(FECFIN) returning_values (FECFCNT);
FOR SELECT DVCO_ID, PREF_PRE, DVCO_NUMERO FROM DEVOLUCIONES_COMPRAS WHERE DVCO_ANULADO = 'N' AND
    DVCO_FECHA >= :FECINI AND DVCO_FECHA <= :FECFIN
    INTO :ID, :PREF, :NUMERO
DO
  BEGIN
  idref = null;
  SELECT ENCO_IDREF FROM COMPROBANTE_ENCABEZADO WHERE ENCO_TIPOREF = 24 AND ENCO_FECHA >= :FECICNT AND ENCO_FECHA <= :FECFCNT and ENCO_IDREF = :id into :idref;
  if (idref IS NULL) then
  begin
   ESTADO = 'PROCESANDO';
   SUSPEND;
   SELECT MAX(INCO_ID) FROM INTERFAZ_COMPRAS WHERE PREF_PRE = :PREF AND TIDO_COD = 24 INTO :IDI;
   EXECUTE PROCEDURE CONTABIL_DEVOLCOMP (:ID, :IDI) RETURNING_VALUES (:ERROR, :VER, :IDC);
   if (ERROR = 0) then
    BEGIN
      EXECUTE PROCEDURE CONTABILIZA_PENDIENTE (:IDC);
      ESTADO = 'OK';
    end
   ELSE
    ESTADO = 'ERROR';
   suspend;
  End
  END
END

^

SET TERM ; ^

ALTER TABLE CONTABIL_ARTICULO DROP COAR_RTICA;


/* redencion de puntos error */
SET TERM ^ ;

CREATE OR ALTER TRIGGER FACTURAS_BI FOR FACTURAS
ACTIVE BEFORE INSERT POSITION 0
AS
declare variable NUMERO VARCHAR(6);
declare variable AUTOM CHAR(1);
declare variable EXISTE CHAR(1);
DECLARE VARIABLE VALCUPO CHAR(10);
declare variable DISPONIBLE NUMERIC(18,2);
declare variable OK CHAR(1);
declare variable SITOT CHAR(2);
declare variable CODCOBR INTEGER;
declare variable CODVEND INTEGER;
declare variable contado char(1);
BEGIN
OK = 'S';
EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'ACCION A TOMAR SI EL CUPO DE CREDITO ES INSUFICIENTE') RETURNING_VALUES (:VALCUPO);
select max(auto_contado) from autorizaciones where pref_pre = new.pref_pre and tido_cod = 31 and auto_inicial <= new.fact_numero and auto_final >= new.fact_numero into :contado;
if (contado='N') then
BEGIN
  IF (VALCUPO = 'PROHIBIR') THEN
  BEGIN
  OK = 'N';
  /* VERIFIQUE EL CUPO DE CREDITO */
  execute procedure cupo_disponible(new.TERC_NIT, NEW.fact_fecha, NEW.fact_sucursal) returning_values (:DISPONIBLE);
  if (DISPONIBLE >= NEW.FACT_TOTAL) then
    OK = 'S';
  END
END
IF (OK = 'S') THEN
  begin
  /* calcule la comision */
  EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION', 'VENDEDORES', 'COMISIONES EN VENTA INCLUYENDO IMPUESTOS') returning_values (:SITOT);
  if ((NEW.fact_comiporc IS NULL) or (NEW.fact_comiporc = 0)) THEN
    BEGIN
    if (SITOT = 'SI') then
      SELECT MAX(COMI_PORC) FROM comisiones WHERE VEND_COD = NEW.vend_cod AND
        COMI_INICIAL <= NEW.fact_total AND COMI_FINAL >= NEW.fact_total
        INTO NEW.fact_comiporc;
    else
      SELECT MAX(COMI_PORC) FROM comisiones WHERE VEND_COD = NEW.vend_cod AND
        COMI_INICIAL <= (NEW.fact_total -NEW.fact_ivamonto) AND COMI_FINAL >= (NEW.fact_total -NEW.fact_ivamonto)
        INTO NEW.fact_comiporc;
    if (NEW.fact_comiporc IS NULL) then
        NEW.fact_comiporc = 0;
    END
  if (SITOT = 'SI') then
      NEW.fact_comimonto = NEW.fact_total * NEW.fact_comiporc / 100;
  ELSE
      NEW.fact_comimonto = (NEW.fact_total -NEW.fact_ivamonto) * NEW.fact_comiporc / 100;

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

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

SET TERM ; ^


SET TERM ^ ;

CREATE OR ALTER PROCEDURE CONSULTA_PUNTOS_CLIENTE(
    IDDOC INTEGER,
    CLIENTE VARCHAR(20),
    FECHA DATE)
RETURNS (
    PTDOC INTEGER,
    PTACUM INTEGER,
    PTVENCER INTEGER)
AS
declare variable numrows integer;
declare variable anos integer;
declare variable fecaux date;
declare variable fecaux2 date;
declare variable nitcontado varchar(20);
declare variable ok integer;
declare variable ptaux integer;
begin
ptdoc = 0;
ptacum = 0;
ptvencer = 0;
ok = 1;
if (IDDOC <> 0) then
    begin
    /* verifique que no sea cliente de contado de la autorización */
    select max(auto_nitcontado) from facturas f, autorizaciones a
        where f.pref_pre = a.pref_pre and fact_id = :iddoc into :nitcontado;
    if (cliente = nitcontado) then
        ok = 0;

    if (ok <> 0) then
        begin
        select count(ptcl_id) from puntos_cliente where ptcl_nit = :cliente and ptcl_tipodoc = 31 and ptcl_iddoc = :iddoc into :numrows;
        if (numrows <> 0) then
            begin
            select ptcl_db-ptcl_cr from puntos_cliente where ptcl_nit = :cliente and ptcl_tipodoc = 31 and ptcl_iddoc = :iddoc into :ptdoc;
            end
        end
    end
/* los puntos totales */
numrows = 0;
select max(ptcl_fecha) from puntos_cliente where ptcl_nit = :cliente and ptcl_fecha <= :fecha into :fecaux;
if (fecaux is not null) then
    select max(ptcl_saldo), sum(ptcl_db - ptcl_cr) from puntos_cliente where ptcl_nit = :cliente and ptcl_fecha = :fecaux into :ptacum, :ptvencer;
if (ptacum is null) then
    ptacum = 0;
if (ptvencer is null) then
    ptvencer = 0;
ptacum = ptacum + ptvencer;
/* reste los vencidos */
execute procedure lee_configuracion('FACTURACION', 'FACTURAS', 'VENCIMIENTO DE PUNTOS POR CLIENTE EN AÑOS') returning_values (:anos);
fecaux = fecha - (anos * 365);
select max(ptcl_fecha) from puntos_cliente where ptcl_nit = :cliente and ptcl_fecha <= :fecaux into :fecaux;
if (fecaux is not null) then
    select max(ptcl_saldo), sum(ptcl_db - ptcl_cr) from puntos_cliente where ptcl_nit = :cliente and ptcl_fecha = :fecaux into :ptvencer, :ptaux;
else
    begin
    ptvencer = 0;
    ptaux = 0;
    end
if (ptvencer is null) then
    ptvencer = 0;
if (ptaux is null) then
    ptaux = 0;
ptacum = ptacum - ptvencer - ptaux;
/* los por vencer */
execute procedure lee_configuracion('FACTURACION', 'FACTURAS', 'VENCIMIENTO DE PUNTOS POR CLIENTE EN AÑOS') returning_values (:anos);
fecaux = fecha - (anos * 365);
fecaux2 = fecha - (anos * 365) + 30;
select sum(ptcl_db - ptcl_cr) from puntos_cliente where ptcl_nit = :cliente and ptcl_fecha >= :fecaux and ptcl_fecha <= :fecaux2 into :ptvencer;
if (ptvencer is null) then
    ptvencer = 0;
suspend;
end
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE IMPR_FACTURA(
    ID INTEGER)
RETURNS (
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    VENCE DATE,
    DIASVENCE INTEGER,
    CONTCRED CHAR(7),
    NIT VARCHAR(20),
    NOMTERCERO VARCHAR(60),
    VENDEDOR INTEGER,
    NOMVENDEDOR VARCHAR(60),
    PUNTOVTA INTEGER,
    NOMPUNTOVTA VARCHAR(30),
    CODBODEGA VARCHAR(2),
    NOMBODEGA VARCHAR(30),
    AUTORIZACION VARCHAR(20),
    DESPACHO VARCHAR(255),
    TRANSPORTADOR VARCHAR(60),
    COTIZACION VARCHAR(30),
    PEDIDO VARCHAR(30),
    REMISION VARCHAR(30),
    PACIENTE VARCHAR(20),
    NOMPACIENTE VARCHAR(60),
    COMIPORC NUMERIC(9,2),
    COMIMONTO NUMERIC(18,2),
    SUBTOTAL NUMERIC(18,2),
    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),
    EXTRA NUMERIC(18,2),
    DTOFPORC NUMERIC(9,2),
    DTOFMONTO NUMERIC(18,2),
    FECHADTO DATE,
    TOTALFAC NUMERIC(18,2),
    TOTALPAGAR NUMERIC(18,2),
    OBS BLOB SUB_TYPE 1 SEGMENT SIZE 80,
    ITEM INTEGER,
    ARTICULO VARCHAR(15),
    CODBAR VARCHAR(15),
    ARTIDES VARCHAR(60),
    CANT NUMERIC(18,4),
    LOTE VARCHAR(15),
    VLOTE DATE,
    UNIDAD VARCHAR(8),
    FACTOR INTEGER,
    LISTAPR INTEGER,
    REFITEM VARCHAR(60),
    BODITEM VARCHAR(2),
    PRUNIT NUMERIC(18,2),
    DTOITPORC NUMERIC(9,2),
    DTOITMONTO NUMERIC(18,2),
    PRNETO NUMERIC(18,2),
    IVAPORC NUMERIC(9,2),
    IVAITMONTO NUMERIC(18,2),
    CONSUMO NUMERIC(18,2),
    SUBTOTIT NUMERIC(18,2),
    SUBTOTITCON NUMERIC(18,2),
    TOTAL NUMERIC(18,2),
    CODIGOCL VARCHAR(20),
    ZONACOD VARCHAR(2),
    ZONANOM VARCHAR(60),
    DV CHAR(1),
    DIRECCION VARCHAR(60),
    CIUDAD VARCHAR(40),
    TELEFONO VARCHAR(40),
    CONTACTO VARCHAR(60),
    FAX VARCHAR(25),
    GRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    SUBGRUPO VARCHAR(3),
    NOMSUBG VARCHAR(30),
    MARCA VARCHAR(3),
    NOMMARCA VARCHAR(30),
    PESO NUMERIC(18,4),
    ANCHO NUMERIC(18,4),
    ALTO NUMERIC(18,4),
    LARGO NUMERIC(18,4),
    SUMA1 NUMERIC(18,2),
    SUMA2 NUMERIC(18,2),
    SUMA3 NUMERIC(18,2),
    IVA1 NUMERIC(18,2),
    IVA2 NUMERIC(18,2),
    IVA3 NUMERIC(18,2),
    SUMAEX NUMERIC(18,2),
    SUMAGR NUMERIC(18,2),
    TOTCONSUMO NUMERIC(18,2),
    VEHICULO VARCHAR(8),
    RECIBIDO NUMERIC(18,2),
    CAMBIO NUMERIC(18,2),
    HORA TIME,
    FORMAPAGO1 VARCHAR(30),
    MONTOPAGO1 NUMERIC(18,2),
    FORMAPAGO2 VARCHAR(30),
    MONTOPAGO2 NUMERIC(18,2),
    FORMAPAGO3 VARCHAR(30),
    MONTOPAGO3 NUMERIC(18,2),
    PUNTOS INTEGER,
    PUNTOSACUM INTEGER,
    PUNTOSVENC INTEGER)
AS
DECLARE VARIABLE IMPTOS CHAR(1);
DECLARE VARIABLE TARIFA INTEGER;
declare variable DEVUELTO NUMERIC(18,2);
/*DECLARE VARIABLE NROCOPIA INTEGER;*/
declare variable ORDENCOD CHAR(2);
declare variable IMPRDEV CHAR(2);
declare variable IMPR CHAR(1);
declare variable ITEMFP INTEGER;
declare variable FORMAP VARCHAR(30);
declare variable MONTOP NUMERIC(18,2);
declare variable SUCUR VARCHAR(10);
BEGIN /*$$IBE$$ 
  SELECT F.PREF_PRE, FACT_NUMERO, FACT_FECHA, FACT_VENCE, F.BODE_COD, BODE_NOM, F.TERC_NIT, FACT_NOMCLIENTE, F.VEND_COD, VEND_NOMBRE, F.PTVT_ID, PTVT_NOM,
    AUTO_NUMERO, FACT_DESPACHO, FACT_TRANSP, FACT_COTIZACI, FACT_PEDIDO, FACT_REMISION, FACT_COMIPORC, FACT_COMIMONTO, FACT_IVAINC, 
    FACT_DTOPOR, FACT_DTOMONTO, FACT_ADICIONAL, FACT_IVAMONTO, FACT_RTFTEPOR, FACT_RTFTEMONTO, FACT_RTIVAPOR, FACT_RTIVAMONTO, FACT_RTICAPOR, FACT_RTICAMONTO, FACT_EXTRA, FACT_DTOFPOR, FACT_DTOFMONTO, FACT_DTOFFECHA, FACT_TOTAL,
    TERC_DIR, TERC_CIU, TERC_TEL, TERC_CONTACTO, TERC_FAX, TERC_DV,
    FACT_OBS, VEHI_COD,  $$IBE$$*/ /*FACT_NROCOPIA,*/ /*$$IBE$$  FACT_RECIBIDO, FACT_SUCURSAL, FACT_DETCLI, FACT_DETCLINOM
    FROM FACTURAS F, BODEGA B, VENDEDORES V, PUNTO_VENTA P, TERCEROS T
    WHERE F.BODE_COD = B.BODE_COD AND F.VEND_COD = V.VEND_COD AND F.PTVT_ID = P.PTVT_ID AND F.TERC_NIT = T.TERC_NIT AND F.FACT_ID = :ID
    into :PREF, :NUMERO, :FECHA, :VENCE, :CODBODEGA, :NOMBODEGA, :NIT, :NOMTERCERO, :VENDEDOR, :NOMVENDEDOR, :PUNTOVTA, :NOMPUNTOVTA,
    :AUTORIZACION, :DESPACHO, :TRANSPORTADOR, :COTIZACION, :PEDIDO, :REMISION, :COMIPORC, :COMIMONTO, :IMPTOS,
    :DTOPORC, :DTOMONTO, :ADICIONAL, :IVAMONTO, :RTEFTEPORC, :RTEFTEMONTO, :RTEIVAPORC, :RTEIVAMONTO, :RTEICAPORC, :RTEICAMONTO, :EXTRA, :DTOFPORC, :DTOFMONTO, :FECHADTO, :TOTALFAC,
    :DIRECCION, :CIUDAD, :TELEFONO, :CONTACTO, :FAX, :DV, :OBS, :VEHICULO, $$IBE$$*/ /* :NROCOPIA,*/ /*$$IBE$$  :RECIBIDO, :SUCUR, :paciente, :nompaciente;

   $$IBE$$*/ /* ACUMULE LOS PUNTOS, SE HACE ACA POR SER POSTERIOR AL DETALLE */ /*$$IBE$$ 
  EXECUTE PROCEDURE acumula_puntos_cliente (31, :id, :nit, :fecha) returning_values (:PUNTOS);
  EXECUTE PROCEDURE consulta_puntos_cliente (:id, :nit, :fecha) returning_values (:puntos, :puntosacum, :puntosvenc);

  SELECT CLIE_COD, C.ZONA_COD, ZONA_NOM
    FROM CLIENTES C, ZONAS Z
    WHERE TERC_NIT = :NIT AND C.ZONA_COD = Z.ZONA_COD
    INTO :CODIGOCL, :ZONACOD, :ZONANOM;
   $$IBE$$*/ /*SELECT NOCO_NOMBRE FROM NOMBRES_COPIAS where NOCO_ID = :NROCOPIA INTO :NOMCOPIA;*/ /*$$IBE$$ 
  SELECT CLSU_DIR, CLSU_CIUDAD, CLSU_TEL FROM CLIENTE_SUCURSALES WHERE TERC_NIT = :NIT AND CLCU_COD = :SUCUR
    INTO :DIRECCION, :CIUDAD, :TELEFONO;
   $$IBE$$*/ /*if (NOMCOPIA IS NULL) then
    NOMCOPIA = 'COPIA No. ' || NROCOPIA;**/ /*$$IBE$$ 
  DIASVENCE = VENCE - FECHA;
  if (DIASVENCE > 0) then
    CONTCRED = 'CREDITO';
  ELSE
    CONTCRED = 'CONTADO';
  SUBTOTAL = TOTALFAC - EXTRA - IVAMONTO - ADICIONAL + DTOMONTO;
  TOTALPAGAR = TOTALFAC - RTEFTEMONTO - RTEIVAMONTO - RTEICAMONTO;
  if (RECIBIDO <> 0) then
      CAMBIO = RECIBIDO - totalpagar;
  ELSE
    CAMBIO = 0;
  SUMAEX = 0;
  SUMA1 = 0;
  SUMA2 = 0;
  SUMA3 = 0;
  IVA1 = 0;
  IVA2 = 0;
  IVA3 = 0;
  TOTCONSUMO = 0;
  MONTOPAGO1 = 0;
  SELECT MAX(AUDI_HORA) FROM AUDITORIA WHERE TIDO_COD = 31 AND AUDI_IDDOC = :ID AND AUDI_OPER = 'I' INTO :HORA;
   $$IBE$$*/ /* AHORA LAS FORMAS DE PAGO, BUSQUE EL ABONO DE HOY A LA FACTURA */ /*$$IBE$$ 
  ITEMFP = 1;
  MONTOPAGO1 = 0;
  MONTOPAGO2 = 0;
  MONTOPAGO3 = 0;
  FOR SELECT FOPA_NOM, RCPA_MONTO FROM RECIBOS_CAJA_PAGO P, FORMAS_PAGO F, RECIBOS_CAJA R, RECIBOS_CAJA_DETALLE D
    WHERE R.RECA_ID = P.RECA_ID AND R.RECA_ID = D.RECA_ID AND P.FOPA_ID = F.FOPA_ID AND RECA_FECHA = :FECHA AND RCDE_TIPODOC = 31 AND RCDE_IDDOC = :ID
    INTO :formap, :MONTOP
    DO
    BEGIN
    if (ITEMFP = 1) then
        BEGIN
        FORMAPAGO1 = FORMAP;
        MONTOPAGO1 = MONTOP;
        END
    if (ITEMFP = 2) then
        BEGIN
        FORMAPAGO2 = FORMAP;
        MONTOPAGO2 = MONTOP;
        END
    if (ITEMFP = 3) then
        BEGIN
        FORMAPAGO3 = FORMAP;
        MONTOPAGO3 = MONTOP;
        END
    ITEMFP = ITEMFP + 1;
    END
  EXECUTE PROCEDURE lee_configuracion ('FACTURACION','DOCUMENTOS','ORDENAR ITEMS POR CODIGO DE ARTICULO') returning_values (:ORDENCOD);
  EXECUTE PROCEDURE lee_configuracion ('FACTURACION','POS', 'IMPRIMIR DEVOLUCIONES DE ARTICULOS NEGATIVOS') returning_values (:imprdev);
  if (ORDENCOD = 'SI') then
    BEGIN
    FOR SELECT FADE_ITEM, D.ARTI_COD, FADE_CODBAR, SUBSTR(FADE_DESC,1,60), FADE_CANT, FADE_UNIDAD, FADE_FACTOR, BODE_COD, FADE_LOTE, LIPR_COD, FADE_PRUNIT, FADE_DTOPORC, FADE_DTOMONTO, FADE_IVAPORC, FADE_IVAMONTO, FADE_CONSUMO, FADE_TOTAL, FADE_REFERENCIA,
        GRUP_COD, SUBG_COD, MARC_COD, ARTI_PESO, ARTI_ANCHO, ARTI_ALTO, ARTI_LARGO, TAIV_COD, FADE_DEVUELTO
        FROM FACTURAS_DETALLE D, ARTICULO A
        WHERE D.ARTI_COD = A.ARTI_COD AND D.FACT_ID = :ID
        ORDER BY D.ARTI_COD
        INTO :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :FACTOR, :BODITEM, :LOTE, :LISTAPR, :PRUNIT, :DTOITPORC, :DTOITMONTO, :IVAPORC, :IVAITMONTO, :CONSUMO, :TOTAL, :refitem,
        :GRUPO, :SUBGRUPO, :MARCA, :PESO, :ANCHO, :ALTO, :LARGO, :TARIFA, :devuelto
        DO
          BEGIN
          if (IMPRDEV <> 'SI') then
            BEGIN
            if ((CANT >= 0) AND (DEVUELTO = 0)) then
                IMPR = 'S';
            ELSE
                IMPR = 'N';  $$IBE$$*/ /* ES DEVOLUCION */ /*$$IBE$$ 
            END
          ELSE
            IMPR = 'S';
          if (IMPR = 'S') then
            BEGIN
            if (IMPTOS = 'S') then
                if (cant <> 0) then
                    PRNETO = PRUNIT - DTOITMONTO - ((IVAITMONTO+CONSUMO) / CANT);
                else
                    PRNETO = PRUNIT - DTOITMONTO;
            ELSE
                PRNETO = PRUNIT - DTOITMONTO;
            SUBTOTIT = TOTAL - IVAITMONTO - CONSUMO;
            SUBTOTITCON = TOTAL;
            TOTCONSUMO = TOTCONSUMO + CONSUMO;
            SELECT LOTE_VENCE FROM LOTES WHERE LOTE_NRO = :lote AND ARTI_COD = :ARTICULO INTO :vlote;
            if (TARIFA = 0) then
                SUMAEX = SUMAEX + TOTAL;
            if (TARIFA = 1) then
                BEGIN
                SUMA1 = SUMA1 + TOTAL - IVAITMONTO;
                IVA1 = IVA1 + IVAITMONTO;
                END
            if (TARIFA = 2) then
                BEGIN
                SUMA2 = SUMA2 + TOTAL - IVAITMONTO;
                IVA2 = IVA2 + IVAITMONTO;
                END
            if (TARIFA = 3) then
                BEGIN
                SUMA3 = SUMA3 + TOTAL - IVAITMONTO;
                IVA3 = IVA3 + IVAITMONTO;
                END
            SUMAGR = SUMA1 + SUMA2 + SUMA3;
            if (IMPTOS = 'N') then
                TOTAL = TOTAL - IVAITMONTO - CONSUMO;
            if (ANCHO IS NULL) then
                ANCHO = 0;
            if (ALTO IS NULL) then
                ALTO = 0;
            if (LARGO IS NULL) then
                LARGO = 0;
            if (PESO IS NULL) then
                PESO = 0;
            PESO = PESO * CANT;
            SUSPEND;
            END
          END
    END
ELSE
    BEGIN
    FOR SELECT FADE_ITEM, D.ARTI_COD, FADE_CODBAR, SUBSTR(FADE_DESC,1,60), FADE_CANT, FADE_UNIDAD, FADE_FACTOR, BODE_COD, FADE_LOTE, LIPR_COD, FADE_PRUNIT, FADE_DTOPORC, FADE_DTOMONTO, FADE_IVAPORC, FADE_IVAMONTO, FADE_CONSUMO, FADE_TOTAL, FADE_REFERENCIA,
        GRUP_COD, SUBG_COD, MARC_COD, ARTI_PESO, ARTI_ANCHO, ARTI_ALTO, ARTI_LARGO, TAIV_COD, FADE_DEVUELTO
        FROM FACTURAS_DETALLE D, ARTICULO A
        WHERE D.ARTI_COD = A.ARTI_COD AND D.FACT_ID = :ID
        ORDER BY FADE_ITEM
        INTO :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :FACTOR, :BODITEM, :LOTE, :LISTAPR, :PRUNIT, :DTOITPORC, :DTOITMONTO, :IVAPORC, :IVAITMONTO, :CONSUMO, :TOTAL, :refitem, 
        :GRUPO, :SUBGRUPO, :MARCA, :PESO, :ANCHO, :ALTO, :LARGO, :TARIFA, :devuelto
        DO
          BEGIN
          if (IMPRDEV <> 'SI') then
            BEGIN
            if ((CANT >= 0) AND (DEVUELTO = 0)) then
                IMPR = 'S';
            ELSE
                IMPR = 'N';  $$IBE$$*/ /* ES DEVOLUCION */ /*$$IBE$$ 
            END
          ELSE
            IMPR = 'S';
          if (IMPR = 'S') then
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :GRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :MARCA INTO NOMMARCA;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :SUBGRUPO AND GRUP_COD = :GRUPO INTO :NOMSUBG;
            if (IMPTOS = 'S') then
              PRNETO = PRUNIT - DTOITMONTO - ((IVAITMONTO+CONSUMO) / CANT);
            ELSE
              PRNETO = PRUNIT - DTOITMONTO;
            SUBTOTIT = TOTAL - IVAITMONTO - CONSUMO;
            SUBTOTITCON = TOTAL;
            TOTCONSUMO = TOTCONSUMO + CONSUMO;
            SELECT LOTE_VENCE FROM LOTES WHERE LOTE_NRO = :lote AND ARTI_COD = :ARTICULO INTO :vlote;
            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;
            if (ANCHO IS NULL) then
                ANCHO = 0;
            if (ALTO IS NULL) then
                ALTO = 0;
            if (LARGO IS NULL) then
                LARGO = 0;
            if (PESO IS NULL) then
                PESO = 0;
            PESO = PESO * CANT;
            SUSPEND;
            END
          END
    END
 $$IBE$$*/ SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE IMPR_REDENCION(
    ID INTEGER)
RETURNS (
    NUMERO VARCHAR(6),
    FECHA DATE,
    NIT VARCHAR(20),
    NOMCLIENTE VARCHAR(60),
    DIR VARCHAR(60),
    TEL VARCHAR(60),
    PREMIO VARCHAR(15),
    NOMPREMIO VARCHAR(60),
    PUNTOS INTEGER,
    PUNTOSACUM INTEGER,
    PUNTOSVENC INTEGER)
AS
declare variable puntosaux INTEGER;
begin /*$$IBE$$ 
SELECT PTRE_NUMERO, PTRE_FECHA, PTRE_NIT, TERC_NOM, TERC_DIR, TERC_TEL, R.PTPR_COD, PTPR_NOMBRE, PTRE_PUNTOS
    FROM PUNTOS_REDENCION R, puntos_premios P, TERCEROS T
    WHERE R.ptre_nit = T.terc_nit AND R.ptpr_cod = P.ptpr_cod AND R.ptre_id = :ID
    INTO :NUMERO, :FECHA, :NIT, :NOMCLIENTE, :DIR, :TEL, :PREMIO, :NOMPREMIO, :PUNTOS;
EXECUTE PROCEDURE consulta_puntos_cliente (0, :nit, :fecha) returning_values (:puntosaux, :puntosacum, :puntosvenc);
suspend;
 $$IBE$$*/ SUSPEND;
end
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE IMPR_FACTURA(
    ID INTEGER)
RETURNS (
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    VENCE DATE,
    DIASVENCE INTEGER,
    CONTCRED CHAR(7),
    NIT VARCHAR(20),
    NOMTERCERO VARCHAR(60),
    VENDEDOR INTEGER,
    NOMVENDEDOR VARCHAR(60),
    PUNTOVTA INTEGER,
    NOMPUNTOVTA VARCHAR(30),
    CODBODEGA VARCHAR(2),
    NOMBODEGA VARCHAR(30),
    AUTORIZACION VARCHAR(20),
    DESPACHO VARCHAR(255),
    TRANSPORTADOR VARCHAR(60),
    COTIZACION VARCHAR(30),
    PEDIDO VARCHAR(30),
    REMISION VARCHAR(30),
    PACIENTE VARCHAR(20),
    NOMPACIENTE VARCHAR(60),
    COMIPORC NUMERIC(9,2),
    COMIMONTO NUMERIC(18,2),
    SUBTOTAL NUMERIC(18,2),
    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),
    EXTRA NUMERIC(18,2),
    DTOFPORC NUMERIC(9,2),
    DTOFMONTO NUMERIC(18,2),
    FECHADTO DATE,
    TOTALFAC NUMERIC(18,2),
    TOTALPAGAR NUMERIC(18,2),
    OBS BLOB SUB_TYPE 1 SEGMENT SIZE 80,
    ITEM INTEGER,
    ARTICULO VARCHAR(15),
    CODBAR VARCHAR(15),
    ARTIDES VARCHAR(60),
    CANT NUMERIC(18,4),
    LOTE VARCHAR(15),
    VLOTE DATE,
    UNIDAD VARCHAR(8),
    FACTOR INTEGER,
    LISTAPR INTEGER,
    REFITEM VARCHAR(60),
    BODITEM VARCHAR(2),
    PRUNIT NUMERIC(18,2),
    DTOITPORC NUMERIC(9,2),
    DTOITMONTO NUMERIC(18,2),
    PRNETO NUMERIC(18,2),
    IVAPORC NUMERIC(9,2),
    IVAITMONTO NUMERIC(18,2),
    CONSUMO NUMERIC(18,2),
    SUBTOTIT NUMERIC(18,2),
    SUBTOTITCON NUMERIC(18,2),
    TOTAL NUMERIC(18,2),
    CODIGOCL VARCHAR(20),
    ZONACOD VARCHAR(2),
    ZONANOM VARCHAR(60),
    DV CHAR(1),
    DIRECCION VARCHAR(60),
    CIUDAD VARCHAR(40),
    TELEFONO VARCHAR(40),
    CONTACTO VARCHAR(60),
    FAX VARCHAR(25),
    GRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    SUBGRUPO VARCHAR(3),
    NOMSUBG VARCHAR(30),
    MARCA VARCHAR(3),
    NOMMARCA VARCHAR(30),
    PESO NUMERIC(18,4),
    ANCHO NUMERIC(18,4),
    ALTO NUMERIC(18,4),
    LARGO NUMERIC(18,4),
    SUMA1 NUMERIC(18,2),
    SUMA2 NUMERIC(18,2),
    SUMA3 NUMERIC(18,2),
    IVA1 NUMERIC(18,2),
    IVA2 NUMERIC(18,2),
    IVA3 NUMERIC(18,2),
    SUMAEX NUMERIC(18,2),
    SUMAGR NUMERIC(18,2),
    TOTCONSUMO NUMERIC(18,2),
    VEHICULO VARCHAR(8),
    RECIBIDO NUMERIC(18,2),
    CAMBIO NUMERIC(18,2),
    HORA TIME,
    FORMAPAGO1 VARCHAR(30),
    MONTOPAGO1 NUMERIC(18,2),
    FORMAPAGO2 VARCHAR(30),
    MONTOPAGO2 NUMERIC(18,2),
    FORMAPAGO3 VARCHAR(30),
    MONTOPAGO3 NUMERIC(18,2),
    PUNTOS INTEGER,
    PUNTOSACUM INTEGER,
    PUNTOSVENC INTEGER)
AS
DECLARE VARIABLE IMPTOS CHAR(1);
DECLARE VARIABLE TARIFA INTEGER;
declare variable DEVUELTO NUMERIC(18,2);
/*DECLARE VARIABLE NROCOPIA INTEGER;*/
declare variable ORDENCOD CHAR(2);
declare variable IMPRDEV CHAR(2);
declare variable IMPR CHAR(1);
declare variable ITEMFP INTEGER;
declare variable FORMAP VARCHAR(30);
declare variable MONTOP NUMERIC(18,2);
declare variable SUCUR VARCHAR(10);
BEGIN
  SELECT F.PREF_PRE, FACT_NUMERO, FACT_FECHA, FACT_VENCE, F.BODE_COD, BODE_NOM, F.TERC_NIT, FACT_NOMCLIENTE, F.VEND_COD, VEND_NOMBRE, F.PTVT_ID, PTVT_NOM,
    AUTO_NUMERO, FACT_DESPACHO, FACT_TRANSP, FACT_COTIZACI, FACT_PEDIDO, FACT_REMISION, FACT_COMIPORC, FACT_COMIMONTO, FACT_IVAINC, 
    FACT_DTOPOR, FACT_DTOMONTO, FACT_ADICIONAL, FACT_IVAMONTO, FACT_RTFTEPOR, FACT_RTFTEMONTO, FACT_RTIVAPOR, FACT_RTIVAMONTO, FACT_RTICAPOR, FACT_RTICAMONTO, FACT_EXTRA, FACT_DTOFPOR, FACT_DTOFMONTO, FACT_DTOFFECHA, FACT_TOTAL,
    TERC_DIR, TERC_CIU, TERC_TEL, TERC_CONTACTO, TERC_FAX, TERC_DV,
    FACT_OBS, VEHI_COD, /*FACT_NROCOPIA,*/ FACT_RECIBIDO, FACT_SUCURSAL, FACT_DETCLI, FACT_DETCLINOM
    FROM FACTURAS F, BODEGA B, VENDEDORES V, PUNTO_VENTA P, TERCEROS T
    WHERE F.BODE_COD = B.BODE_COD AND F.VEND_COD = V.VEND_COD AND F.PTVT_ID = P.PTVT_ID AND F.TERC_NIT = T.TERC_NIT AND F.FACT_ID = :ID
    into :PREF, :NUMERO, :FECHA, :VENCE, :CODBODEGA, :NOMBODEGA, :NIT, :NOMTERCERO, :VENDEDOR, :NOMVENDEDOR, :PUNTOVTA, :NOMPUNTOVTA,
    :AUTORIZACION, :DESPACHO, :TRANSPORTADOR, :COTIZACION, :PEDIDO, :REMISION, :COMIPORC, :COMIMONTO, :IMPTOS,
    :DTOPORC, :DTOMONTO, :ADICIONAL, :IVAMONTO, :RTEFTEPORC, :RTEFTEMONTO, :RTEIVAPORC, :RTEIVAMONTO, :RTEICAPORC, :RTEICAMONTO, :EXTRA, :DTOFPORC, :DTOFMONTO, :FECHADTO, :TOTALFAC,
    :DIRECCION, :CIUDAD, :TELEFONO, :CONTACTO, :FAX, :DV, :OBS, :VEHICULO,/* :NROCOPIA,*/ :RECIBIDO, :SUCUR, :paciente, :nompaciente;

  /* ACUMULE LOS PUNTOS, SE HACE ACA POR SER POSTERIOR AL DETALLE */
  EXECUTE PROCEDURE acumula_puntos_cliente (31, :id, :nit, :fecha) returning_values (:PUNTOS);
  EXECUTE PROCEDURE consulta_puntos_cliente (:id, :nit, :fecha) returning_values (:puntos, :puntosacum, :puntosvenc);

  SELECT CLIE_COD, C.ZONA_COD, ZONA_NOM
    FROM CLIENTES C, ZONAS Z
    WHERE TERC_NIT = :NIT AND C.ZONA_COD = Z.ZONA_COD
    INTO :CODIGOCL, :ZONACOD, :ZONANOM;
  /*SELECT NOCO_NOMBRE FROM NOMBRES_COPIAS where NOCO_ID = :NROCOPIA INTO :NOMCOPIA;*/
  SELECT CLSU_DIR, CLSU_CIUDAD, CLSU_TEL FROM CLIENTE_SUCURSALES WHERE TERC_NIT = :NIT AND CLCU_COD = :SUCUR
    INTO :DIRECCION, :CIUDAD, :TELEFONO;
  /*if (NOMCOPIA IS NULL) then
    NOMCOPIA = 'COPIA No. ' || NROCOPIA;**/
  DIASVENCE = VENCE - FECHA;
  if (DIASVENCE > 0) then
    CONTCRED = 'CREDITO';
  ELSE
    CONTCRED = 'CONTADO';
  SUBTOTAL = TOTALFAC - EXTRA - IVAMONTO - ADICIONAL + DTOMONTO;
  TOTALPAGAR = TOTALFAC - RTEFTEMONTO - RTEIVAMONTO - RTEICAMONTO;
  if (RECIBIDO <> 0) then
      CAMBIO = RECIBIDO - totalpagar;
  ELSE
    CAMBIO = 0;
  SUMAEX = 0;
  SUMA1 = 0;
  SUMA2 = 0;
  SUMA3 = 0;
  IVA1 = 0;
  IVA2 = 0;
  IVA3 = 0;
  TOTCONSUMO = 0;
  MONTOPAGO1 = 0;
  SELECT MAX(AUDI_HORA) FROM AUDITORIA WHERE TIDO_COD = 31 AND AUDI_IDDOC = :ID AND AUDI_OPER = 'I' INTO :HORA;
  /* AHORA LAS FORMAS DE PAGO, BUSQUE EL ABONO DE HOY A LA FACTURA */
  ITEMFP = 1;
  MONTOPAGO1 = 0;
  MONTOPAGO2 = 0;
  MONTOPAGO3 = 0;
  FOR SELECT FOPA_NOM, RCPA_MONTO FROM RECIBOS_CAJA_PAGO P, FORMAS_PAGO F, RECIBOS_CAJA R, RECIBOS_CAJA_DETALLE D
    WHERE R.RECA_ID = P.RECA_ID AND R.RECA_ID = D.RECA_ID AND P.FOPA_ID = F.FOPA_ID AND RECA_FECHA = :FECHA AND RCDE_TIPODOC = 31 AND RCDE_IDDOC = :ID
    INTO :formap, :MONTOP
    DO
    BEGIN
    if (ITEMFP = 1) then
        BEGIN
        FORMAPAGO1 = FORMAP;
        MONTOPAGO1 = MONTOP;
        END
    if (ITEMFP = 2) then
        BEGIN
        FORMAPAGO2 = FORMAP;
        MONTOPAGO2 = MONTOP;
        END
    if (ITEMFP = 3) then
        BEGIN
        FORMAPAGO3 = FORMAP;
        MONTOPAGO3 = MONTOP;
        END
    ITEMFP = ITEMFP + 1;
    END
  EXECUTE PROCEDURE lee_configuracion ('FACTURACION','DOCUMENTOS','ORDENAR ITEMS POR CODIGO DE ARTICULO') returning_values (:ORDENCOD);
  EXECUTE PROCEDURE lee_configuracion ('FACTURACION','POS', 'IMPRIMIR DEVOLUCIONES DE ARTICULOS NEGATIVOS') returning_values (:imprdev);
  if (ORDENCOD = 'SI') then
    BEGIN
    FOR SELECT FADE_ITEM, D.ARTI_COD, FADE_CODBAR, SUBSTR(FADE_DESC,1,60), FADE_CANT, FADE_UNIDAD, FADE_FACTOR, BODE_COD, FADE_LOTE, LIPR_COD, FADE_PRUNIT, FADE_DTOPORC, FADE_DTOMONTO, FADE_IVAPORC, FADE_IVAMONTO, FADE_CONSUMO, FADE_TOTAL, FADE_REFERENCIA,
        GRUP_COD, SUBG_COD, MARC_COD, ARTI_PESO, ARTI_ANCHO, ARTI_ALTO, ARTI_LARGO, TAIV_COD, FADE_DEVUELTO
        FROM FACTURAS_DETALLE D, ARTICULO A
        WHERE D.ARTI_COD = A.ARTI_COD AND D.FACT_ID = :ID
        ORDER BY D.ARTI_COD
        INTO :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :FACTOR, :BODITEM, :LOTE, :LISTAPR, :PRUNIT, :DTOITPORC, :DTOITMONTO, :IVAPORC, :IVAITMONTO, :CONSUMO, :TOTAL, :refitem,
        :GRUPO, :SUBGRUPO, :MARCA, :PESO, :ANCHO, :ALTO, :LARGO, :TARIFA, :devuelto
        DO
          BEGIN
          if (IMPRDEV <> 'SI') then
            BEGIN
            if ((CANT >= 0) AND (DEVUELTO = 0)) then
                IMPR = 'S';
            ELSE
                IMPR = 'N'; /* ES DEVOLUCION */
            END
          ELSE
            IMPR = 'S';
          if (IMPR = 'S') then
            BEGIN
            if (IMPTOS = 'S') then
                if (cant <> 0) then
                    PRNETO = PRUNIT - DTOITMONTO - ((IVAITMONTO+CONSUMO) / CANT);
                else
                    PRNETO = PRUNIT - DTOITMONTO;
            ELSE
                PRNETO = PRUNIT - DTOITMONTO;
            SUBTOTIT = TOTAL - IVAITMONTO - CONSUMO;
            SUBTOTITCON = TOTAL;
            TOTCONSUMO = TOTCONSUMO + CONSUMO;
            SELECT LOTE_VENCE FROM LOTES WHERE LOTE_NRO = :lote AND ARTI_COD = :ARTICULO INTO :vlote;
            if (TARIFA = 0) then
                SUMAEX = SUMAEX + TOTAL;
            if (TARIFA = 1) then
                BEGIN
                SUMA1 = SUMA1 + TOTAL - IVAITMONTO;
                IVA1 = IVA1 + IVAITMONTO;
                END
            if (TARIFA = 2) then
                BEGIN
                SUMA2 = SUMA2 + TOTAL - IVAITMONTO;
                IVA2 = IVA2 + IVAITMONTO;
                END
            if (TARIFA = 3) then
                BEGIN
                SUMA3 = SUMA3 + TOTAL - IVAITMONTO;
                IVA3 = IVA3 + IVAITMONTO;
                END
            SUMAGR = SUMA1 + SUMA2 + SUMA3;
            if (IMPTOS = 'N') then
                TOTAL = TOTAL - IVAITMONTO - CONSUMO;
            if (ANCHO IS NULL) then
                ANCHO = 0;
            if (ALTO IS NULL) then
                ALTO = 0;
            if (LARGO IS NULL) then
                LARGO = 0;
            if (PESO IS NULL) then
                PESO = 0;
            PESO = PESO * CANT;
            SUSPEND;
            END
          END
    END
ELSE
    BEGIN
    FOR SELECT FADE_ITEM, D.ARTI_COD, FADE_CODBAR, SUBSTR(FADE_DESC,1,60), FADE_CANT, FADE_UNIDAD, FADE_FACTOR, BODE_COD, FADE_LOTE, LIPR_COD, FADE_PRUNIT, FADE_DTOPORC, FADE_DTOMONTO, FADE_IVAPORC, FADE_IVAMONTO, FADE_CONSUMO, FADE_TOTAL, FADE_REFERENCIA,
        GRUP_COD, SUBG_COD, MARC_COD, ARTI_PESO, ARTI_ANCHO, ARTI_ALTO, ARTI_LARGO, TAIV_COD, FADE_DEVUELTO
        FROM FACTURAS_DETALLE D, ARTICULO A
        WHERE D.ARTI_COD = A.ARTI_COD AND D.FACT_ID = :ID
        ORDER BY FADE_ITEM
        INTO :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :FACTOR, :BODITEM, :LOTE, :LISTAPR, :PRUNIT, :DTOITPORC, :DTOITMONTO, :IVAPORC, :IVAITMONTO, :CONSUMO, :TOTAL, :refitem, 
        :GRUPO, :SUBGRUPO, :MARCA, :PESO, :ANCHO, :ALTO, :LARGO, :TARIFA, :devuelto
        DO
          BEGIN
          if (IMPRDEV <> 'SI') then
            BEGIN
            if ((CANT >= 0) AND (DEVUELTO = 0)) then
                IMPR = 'S';
            ELSE
                IMPR = 'N'; /* ES DEVOLUCION */
            END
          ELSE
            IMPR = 'S';
          if (IMPR = 'S') then
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :GRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :MARCA INTO NOMMARCA;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :SUBGRUPO AND GRUP_COD = :GRUPO INTO :NOMSUBG;
            if (IMPTOS = 'S') then
              PRNETO = PRUNIT - DTOITMONTO - ((IVAITMONTO+CONSUMO) / CANT);
            ELSE
              PRNETO = PRUNIT - DTOITMONTO;
            SUBTOTIT = TOTAL - IVAITMONTO - CONSUMO;
            SUBTOTITCON = TOTAL;
            TOTCONSUMO = TOTCONSUMO + CONSUMO;
            SELECT LOTE_VENCE FROM LOTES WHERE LOTE_NRO = :lote AND ARTI_COD = :ARTICULO INTO :vlote;
            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;
            if (ANCHO IS NULL) then
                ANCHO = 0;
            if (ALTO IS NULL) then
                ALTO = 0;
            if (LARGO IS NULL) then
                LARGO = 0;
            if (PESO IS NULL) then
                PESO = 0;
            PESO = PESO * CANT;
            SUSPEND;
            END
          END
    END
END

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE IMPR_REDENCION(
    ID INTEGER)
RETURNS (
    NUMERO VARCHAR(6),
    FECHA DATE,
    NIT VARCHAR(20),
    NOMCLIENTE VARCHAR(60),
    DIR VARCHAR(60),
    TEL VARCHAR(60),
    PREMIO VARCHAR(15),
    NOMPREMIO VARCHAR(60),
    PUNTOS INTEGER,
    PUNTOSACUM INTEGER,
    PUNTOSVENC INTEGER)
AS
declare variable puntosaux INTEGER;
begin
SELECT PTRE_NUMERO, PTRE_FECHA, PTRE_NIT, TERC_NOM, TERC_DIR, TERC_TEL, R.PTPR_COD, PTPR_NOMBRE, PTRE_PUNTOS
    FROM PUNTOS_REDENCION R, puntos_premios P, TERCEROS T
    WHERE R.ptre_nit = T.terc_nit AND R.ptpr_cod = P.ptpr_cod AND R.ptre_id = :ID
    INTO :NUMERO, :FECHA, :NIT, :NOMCLIENTE, :DIR, :TEL, :PREMIO, :NOMPREMIO, :PUNTOS;
EXECUTE PROCEDURE consulta_puntos_cliente (0, :nit, :fecha) returning_values (:puntosaux, :puntosacum, :puntosvenc);
suspend;
end

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE IMPR_FACTURA(
    ID INTEGER)
RETURNS (
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    VENCE DATE,
    DIASVENCE INTEGER,
    CONTCRED CHAR(7),
    NIT VARCHAR(20),
    NOMTERCERO VARCHAR(60),
    VENDEDOR INTEGER,
    NOMVENDEDOR VARCHAR(60),
    PUNTOVTA INTEGER,
    NOMPUNTOVTA VARCHAR(30),
    CODBODEGA VARCHAR(2),
    NOMBODEGA VARCHAR(30),
    AUTORIZACION VARCHAR(20),
    DESPACHO VARCHAR(255),
    TRANSPORTADOR VARCHAR(60),
    COTIZACION VARCHAR(30),
    PEDIDO VARCHAR(30),
    REMISION VARCHAR(30),
    PACIENTE VARCHAR(20),
    NOMPACIENTE VARCHAR(60),
    COMIPORC NUMERIC(9,2),
    COMIMONTO NUMERIC(18,2),
    SUBTOTAL NUMERIC(18,2),
    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),
    EXTRA NUMERIC(18,2),
    DTOFPORC NUMERIC(9,2),
    DTOFMONTO NUMERIC(18,2),
    FECHADTO DATE,
    TOTALFAC NUMERIC(18,2),
    TOTALPAGAR NUMERIC(18,2),
    OBS BLOB SUB_TYPE 1 SEGMENT SIZE 80,
    ITEM INTEGER,
    ARTICULO VARCHAR(15),
    CODBAR VARCHAR(15),
    ARTIDES VARCHAR(60),
    CANT NUMERIC(18,4),
    LOTE VARCHAR(15),
    VLOTE DATE,
    UNIDAD VARCHAR(8),
    FACTOR INTEGER,
    LISTAPR INTEGER,
    REFITEM VARCHAR(60),
    BODITEM VARCHAR(2),
    PRUNIT NUMERIC(18,2),
    DTOITPORC NUMERIC(9,2),
    DTOITMONTO NUMERIC(18,2),
    PRNETO NUMERIC(18,2),
    IVAPORC NUMERIC(9,2),
    IVAITMONTO NUMERIC(18,2),
    CONSUMO NUMERIC(18,2),
    SUBTOTIT NUMERIC(18,2),
    SUBTOTITCON NUMERIC(18,2),
    TOTAL NUMERIC(18,2),
    CODIGOCL VARCHAR(20),
    ZONACOD VARCHAR(2),
    ZONANOM VARCHAR(60),
    DV CHAR(1),
    DIRECCION VARCHAR(60),
    CIUDAD VARCHAR(40),
    TELEFONO VARCHAR(40),
    CONTACTO VARCHAR(60),
    FAX VARCHAR(25),
    GRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    SUBGRUPO VARCHAR(3),
    NOMSUBG VARCHAR(30),
    MARCA VARCHAR(3),
    NOMMARCA VARCHAR(30),
    PESO NUMERIC(18,4),
    ANCHO NUMERIC(18,4),
    ALTO NUMERIC(18,4),
    LARGO NUMERIC(18,4),
    SUMA1 NUMERIC(18,2),
    SUMA2 NUMERIC(18,2),
    SUMA3 NUMERIC(18,2),
    IVA1 NUMERIC(18,2),
    IVA2 NUMERIC(18,2),
    IVA3 NUMERIC(18,2),
    SUMAEX NUMERIC(18,2),
    SUMAGR NUMERIC(18,2),
    TOTCONSUMO NUMERIC(18,2),
    VEHICULO VARCHAR(8),
    RECIBIDO NUMERIC(18,2),
    CAMBIO NUMERIC(18,2),
    HORA TIME,
    FORMAPAGO1 VARCHAR(30),
    MONTOPAGO1 NUMERIC(18,2),
    FORMAPAGO2 VARCHAR(30),
    MONTOPAGO2 NUMERIC(18,2),
    FORMAPAGO3 VARCHAR(30),
    MONTOPAGO3 NUMERIC(18,2),
    PUNTOS INTEGER,
    PUNTOSACUM INTEGER,
    PUNTOSVENC INTEGER)
AS
DECLARE VARIABLE IMPTOS CHAR(1);
DECLARE VARIABLE TARIFA INTEGER;
declare variable DEVUELTO NUMERIC(18,2);
/*DECLARE VARIABLE NROCOPIA INTEGER;*/
declare variable ORDENCOD CHAR(2);
declare variable IMPRDEV CHAR(2);
declare variable IMPR CHAR(1);
declare variable ITEMFP INTEGER;
declare variable FORMAP VARCHAR(30);
declare variable MONTOP NUMERIC(18,2);
declare variable SUCUR VARCHAR(10);
BEGIN /*$$IBE$$ 
  SELECT F.PREF_PRE, FACT_NUMERO, FACT_FECHA, FACT_VENCE, F.BODE_COD, BODE_NOM, F.TERC_NIT, FACT_NOMCLIENTE, F.VEND_COD, VEND_NOMBRE, F.PTVT_ID, PTVT_NOM,
    AUTO_NUMERO, FACT_DESPACHO, FACT_TRANSP, FACT_COTIZACI, FACT_PEDIDO, FACT_REMISION, FACT_COMIPORC, FACT_COMIMONTO, FACT_IVAINC, 
    FACT_DTOPOR, FACT_DTOMONTO, FACT_ADICIONAL, FACT_IVAMONTO, FACT_RTFTEPOR, FACT_RTFTEMONTO, FACT_RTIVAPOR, FACT_RTIVAMONTO, FACT_RTICAPOR, FACT_RTICAMONTO, FACT_EXTRA, FACT_DTOFPOR, FACT_DTOFMONTO, FACT_DTOFFECHA, FACT_TOTAL,
    TERC_DIR, TERC_CIU, TERC_TEL, TERC_CONTACTO, TERC_FAX, TERC_DV,
    FACT_OBS, VEHI_COD,  $$IBE$$*/ /*FACT_NROCOPIA,*/ /*$$IBE$$  FACT_RECIBIDO, FACT_SUCURSAL, FACT_DETCLI, FACT_DETCLINOM
    FROM FACTURAS F, BODEGA B, VENDEDORES V, PUNTO_VENTA P, TERCEROS T
    WHERE F.BODE_COD = B.BODE_COD AND F.VEND_COD = V.VEND_COD AND F.PTVT_ID = P.PTVT_ID AND F.TERC_NIT = T.TERC_NIT AND F.FACT_ID = :ID
    into :PREF, :NUMERO, :FECHA, :VENCE, :CODBODEGA, :NOMBODEGA, :NIT, :NOMTERCERO, :VENDEDOR, :NOMVENDEDOR, :PUNTOVTA, :NOMPUNTOVTA,
    :AUTORIZACION, :DESPACHO, :TRANSPORTADOR, :COTIZACION, :PEDIDO, :REMISION, :COMIPORC, :COMIMONTO, :IMPTOS,
    :DTOPORC, :DTOMONTO, :ADICIONAL, :IVAMONTO, :RTEFTEPORC, :RTEFTEMONTO, :RTEIVAPORC, :RTEIVAMONTO, :RTEICAPORC, :RTEICAMONTO, :EXTRA, :DTOFPORC, :DTOFMONTO, :FECHADTO, :TOTALFAC,
    :DIRECCION, :CIUDAD, :TELEFONO, :CONTACTO, :FAX, :DV, :OBS, :VEHICULO, $$IBE$$*/ /* :NROCOPIA,*/ /*$$IBE$$  :RECIBIDO, :SUCUR, :paciente, :nompaciente;

   $$IBE$$*/ /* ACUMULE LOS PUNTOS, SE HACE ACA POR SER POSTERIOR AL DETALLE */ /*$$IBE$$ 
  EXECUTE PROCEDURE acumula_puntos_cliente (31, :id, :nit, :fecha) returning_values (:PUNTOS);
  EXECUTE PROCEDURE consulta_puntos_cliente (:id, :nit, :fecha) returning_values (:puntos, :puntosacum, :puntosvenc);

  SELECT CLIE_COD, C.ZONA_COD, ZONA_NOM
    FROM CLIENTES C, ZONAS Z
    WHERE TERC_NIT = :NIT AND C.ZONA_COD = Z.ZONA_COD
    INTO :CODIGOCL, :ZONACOD, :ZONANOM;
   $$IBE$$*/ /*SELECT NOCO_NOMBRE FROM NOMBRES_COPIAS where NOCO_ID = :NROCOPIA INTO :NOMCOPIA;*/ /*$$IBE$$ 
  SELECT CLSU_DIR, CLSU_CIUDAD, CLSU_TEL FROM CLIENTE_SUCURSALES WHERE TERC_NIT = :NIT AND CLCU_COD = :SUCUR
    INTO :DIRECCION, :CIUDAD, :TELEFONO;
   $$IBE$$*/ /*if (NOMCOPIA IS NULL) then
    NOMCOPIA = 'COPIA No. ' || NROCOPIA;**/ /*$$IBE$$ 
  DIASVENCE = VENCE - FECHA;
  if (DIASVENCE > 0) then
    CONTCRED = 'CREDITO';
  ELSE
    CONTCRED = 'CONTADO';
  SUBTOTAL = TOTALFAC - EXTRA - IVAMONTO - ADICIONAL + DTOMONTO;
  TOTALPAGAR = TOTALFAC - RTEFTEMONTO - RTEIVAMONTO - RTEICAMONTO;
  if (RECIBIDO <> 0) then
      CAMBIO = RECIBIDO - totalpagar;
  ELSE
    CAMBIO = 0;
  SUMAEX = 0;
  SUMA1 = 0;
  SUMA2 = 0;
  SUMA3 = 0;
  IVA1 = 0;
  IVA2 = 0;
  IVA3 = 0;
  TOTCONSUMO = 0;
  MONTOPAGO1 = 0;
  SELECT MAX(AUDI_HORA) FROM AUDITORIA WHERE TIDO_COD = 31 AND AUDI_IDDOC = :ID AND AUDI_OPER = 'I' INTO :HORA;
   $$IBE$$*/ /* AHORA LAS FORMAS DE PAGO, BUSQUE EL ABONO DE HOY A LA FACTURA */ /*$$IBE$$ 
  ITEMFP = 1;
  MONTOPAGO1 = 0;
  MONTOPAGO2 = 0;
  MONTOPAGO3 = 0;
  FOR SELECT FOPA_NOM, RCPA_MONTO FROM RECIBOS_CAJA_PAGO P, FORMAS_PAGO F, RECIBOS_CAJA R, RECIBOS_CAJA_DETALLE D
    WHERE R.RECA_ID = P.RECA_ID AND R.RECA_ID = D.RECA_ID AND P.FOPA_ID = F.FOPA_ID AND RECA_FECHA = :FECHA AND RCDE_TIPODOC = 31 AND RCDE_IDDOC = :ID
    INTO :formap, :MONTOP
    DO
    BEGIN
    if (ITEMFP = 1) then
        BEGIN
        FORMAPAGO1 = FORMAP;
        MONTOPAGO1 = MONTOP;
        END
    if (ITEMFP = 2) then
        BEGIN
        FORMAPAGO2 = FORMAP;
        MONTOPAGO2 = MONTOP;
        END
    if (ITEMFP = 3) then
        BEGIN
        FORMAPAGO3 = FORMAP;
        MONTOPAGO3 = MONTOP;
        END
    ITEMFP = ITEMFP + 1;
    END
  EXECUTE PROCEDURE lee_configuracion ('FACTURACION','DOCUMENTOS','ORDENAR ITEMS POR CODIGO DE ARTICULO') returning_values (:ORDENCOD);
  EXECUTE PROCEDURE lee_configuracion ('FACTURACION','POS', 'IMPRIMIR DEVOLUCIONES DE ARTICULOS NEGATIVOS') returning_values (:imprdev);
  if (ORDENCOD = 'SI') then
    BEGIN
    FOR SELECT FADE_ITEM, D.ARTI_COD, FADE_CODBAR, SUBSTR(FADE_DESC,1,60), FADE_CANT, FADE_UNIDAD, FADE_FACTOR, BODE_COD, FADE_LOTE, LIPR_COD, FADE_PRUNIT, FADE_DTOPORC, FADE_DTOMONTO, FADE_IVAPORC, FADE_IVAMONTO, FADE_CONSUMO, FADE_TOTAL, FADE_REFERENCIA,
        GRUP_COD, SUBG_COD, MARC_COD, ARTI_PESO, ARTI_ANCHO, ARTI_ALTO, ARTI_LARGO, TAIV_COD, FADE_DEVUELTO
        FROM FACTURAS_DETALLE D, ARTICULO A
        WHERE D.ARTI_COD = A.ARTI_COD AND D.FACT_ID = :ID
        ORDER BY D.ARTI_COD
        INTO :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :FACTOR, :BODITEM, :LOTE, :LISTAPR, :PRUNIT, :DTOITPORC, :DTOITMONTO, :IVAPORC, :IVAITMONTO, :CONSUMO, :TOTAL, :refitem,
        :GRUPO, :SUBGRUPO, :MARCA, :PESO, :ANCHO, :ALTO, :LARGO, :TARIFA, :devuelto
        DO
          BEGIN
          if (IMPRDEV <> 'SI') then
            BEGIN
            if ((CANT >= 0) AND (DEVUELTO = 0)) then
                IMPR = 'S';
            ELSE
                IMPR = 'N';  $$IBE$$*/ /* ES DEVOLUCION */ /*$$IBE$$ 
            END
          ELSE
            IMPR = 'S';
          if (IMPR = 'S') then
            BEGIN
            if (IMPTOS = 'S') then
                if (cant <> 0) then
                    PRNETO = PRUNIT - DTOITMONTO - ((IVAITMONTO+CONSUMO) / CANT);
                else
                    PRNETO = PRUNIT - DTOITMONTO;
            ELSE
                PRNETO = PRUNIT - DTOITMONTO;
            SUBTOTIT = TOTAL - IVAITMONTO - CONSUMO;
            SUBTOTITCON = TOTAL;
            TOTCONSUMO = TOTCONSUMO + CONSUMO;
            SELECT LOTE_VENCE FROM LOTES WHERE LOTE_NRO = :lote AND ARTI_COD = :ARTICULO INTO :vlote;
            if (TARIFA = 0) then
                SUMAEX = SUMAEX + TOTAL;
            if (TARIFA = 1) then
                BEGIN
                SUMA1 = SUMA1 + TOTAL - IVAITMONTO;
                IVA1 = IVA1 + IVAITMONTO;
                END
            if (TARIFA = 2) then
                BEGIN
                SUMA2 = SUMA2 + TOTAL - IVAITMONTO;
                IVA2 = IVA2 + IVAITMONTO;
                END
            if (TARIFA = 3) then
                BEGIN
                SUMA3 = SUMA3 + TOTAL - IVAITMONTO;
                IVA3 = IVA3 + IVAITMONTO;
                END
            SUMAGR = SUMA1 + SUMA2 + SUMA3;
            if (IMPTOS = 'N') then
                TOTAL = TOTAL - IVAITMONTO - CONSUMO;
            if (ANCHO IS NULL) then
                ANCHO = 0;
            if (ALTO IS NULL) then
                ALTO = 0;
            if (LARGO IS NULL) then
                LARGO = 0;
            if (PESO IS NULL) then
                PESO = 0;
            PESO = PESO * CANT;
            SUSPEND;
            END
          END
    END
ELSE
    BEGIN
    FOR SELECT FADE_ITEM, D.ARTI_COD, FADE_CODBAR, SUBSTR(FADE_DESC,1,60), FADE_CANT, FADE_UNIDAD, FADE_FACTOR, BODE_COD, FADE_LOTE, LIPR_COD, FADE_PRUNIT, FADE_DTOPORC, FADE_DTOMONTO, FADE_IVAPORC, FADE_IVAMONTO, FADE_CONSUMO, FADE_TOTAL, FADE_REFERENCIA,
        GRUP_COD, SUBG_COD, MARC_COD, ARTI_PESO, ARTI_ANCHO, ARTI_ALTO, ARTI_LARGO, TAIV_COD, FADE_DEVUELTO
        FROM FACTURAS_DETALLE D, ARTICULO A
        WHERE D.ARTI_COD = A.ARTI_COD AND D.FACT_ID = :ID
        ORDER BY FADE_ITEM
        INTO :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :FACTOR, :BODITEM, :LOTE, :LISTAPR, :PRUNIT, :DTOITPORC, :DTOITMONTO, :IVAPORC, :IVAITMONTO, :CONSUMO, :TOTAL, :refitem, 
        :GRUPO, :SUBGRUPO, :MARCA, :PESO, :ANCHO, :ALTO, :LARGO, :TARIFA, :devuelto
        DO
          BEGIN
          if (IMPRDEV <> 'SI') then
            BEGIN
            if ((CANT >= 0) AND (DEVUELTO = 0)) then
                IMPR = 'S';
            ELSE
                IMPR = 'N';  $$IBE$$*/ /* ES DEVOLUCION */ /*$$IBE$$ 
            END
          ELSE
            IMPR = 'S';
          if (IMPR = 'S') then
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :GRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :MARCA INTO NOMMARCA;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :SUBGRUPO AND GRUP_COD = :GRUPO INTO :NOMSUBG;
            if (IMPTOS = 'S') then
              PRNETO = PRUNIT - DTOITMONTO - ((IVAITMONTO+CONSUMO) / CANT);
            ELSE
              PRNETO = PRUNIT - DTOITMONTO;
            SUBTOTIT = TOTAL - IVAITMONTO - CONSUMO;
            SUBTOTITCON = TOTAL;
            TOTCONSUMO = TOTCONSUMO + CONSUMO;
            SELECT LOTE_VENCE FROM LOTES WHERE LOTE_NRO = :lote AND ARTI_COD = :ARTICULO INTO :vlote;
            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;
            if (ANCHO IS NULL) then
                ANCHO = 0;
            if (ALTO IS NULL) then
                ALTO = 0;
            if (LARGO IS NULL) then
                LARGO = 0;
            if (PESO IS NULL) then
                PESO = 0;
            PESO = PESO * CANT;
            SUSPEND;
            END
          END
    END
 $$IBE$$*/ SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE IMPR_REDENCION(
    ID INTEGER)
RETURNS (
    NUMERO VARCHAR(6),
    FECHA DATE,
    NIT VARCHAR(20),
    NOMCLIENTE VARCHAR(60),
    DIR VARCHAR(60),
    TEL VARCHAR(60),
    PREMIO VARCHAR(15),
    NOMPREMIO VARCHAR(60),
    PUNTOS INTEGER,
    PUNTOSACUM INTEGER,
    PUNTOSVENC INTEGER)
AS
declare variable puntosaux INTEGER;
begin /*$$IBE$$ 
SELECT PTRE_NUMERO, PTRE_FECHA, PTRE_NIT, TERC_NOM, TERC_DIR, TERC_TEL, R.PTPR_COD, PTPR_NOMBRE, PTRE_PUNTOS
    FROM PUNTOS_REDENCION R, puntos_premios P, TERCEROS T
    WHERE R.ptre_nit = T.terc_nit AND R.ptpr_cod = P.ptpr_cod AND R.ptre_id = :ID
    INTO :NUMERO, :FECHA, :NIT, :NOMCLIENTE, :DIR, :TEL, :PREMIO, :NOMPREMIO, :PUNTOS;
EXECUTE PROCEDURE consulta_puntos_cliente (0, :nit, :fecha) returning_values (:puntosaux, :puntosacum, :puntosvenc);
suspend;
 $$IBE$$*/ SUSPEND;
end
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE IMPR_FACTURA(
    ID INTEGER)
RETURNS (
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    VENCE DATE,
    DIASVENCE INTEGER,
    CONTCRED CHAR(7),
    NIT VARCHAR(20),
    NOMTERCERO VARCHAR(60),
    VENDEDOR INTEGER,
    NOMVENDEDOR VARCHAR(60),
    PUNTOVTA INTEGER,
    NOMPUNTOVTA VARCHAR(30),
    CODBODEGA VARCHAR(2),
    NOMBODEGA VARCHAR(30),
    AUTORIZACION VARCHAR(20),
    DESPACHO VARCHAR(255),
    TRANSPORTADOR VARCHAR(60),
    COTIZACION VARCHAR(30),
    PEDIDO VARCHAR(30),
    REMISION VARCHAR(30),
    PACIENTE VARCHAR(20),
    NOMPACIENTE VARCHAR(60),
    COMIPORC NUMERIC(9,2),
    COMIMONTO NUMERIC(18,2),
    SUBTOTAL NUMERIC(18,2),
    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),
    EXTRA NUMERIC(18,2),
    DTOFPORC NUMERIC(9,2),
    DTOFMONTO NUMERIC(18,2),
    FECHADTO DATE,
    TOTALFAC NUMERIC(18,2),
    TOTALPAGAR NUMERIC(18,2),
    OBS BLOB SUB_TYPE 1 SEGMENT SIZE 80,
    ITEM INTEGER,
    ARTICULO VARCHAR(15),
    CODBAR VARCHAR(15),
    ARTIDES VARCHAR(60),
    CANT NUMERIC(18,4),
    LOTE VARCHAR(15),
    VLOTE DATE,
    UNIDAD VARCHAR(8),
    FACTOR INTEGER,
    LISTAPR INTEGER,
    REFITEM VARCHAR(60),
    BODITEM VARCHAR(2),
    PRUNIT NUMERIC(18,2),
    DTOITPORC NUMERIC(9,2),
    DTOITMONTO NUMERIC(18,2),
    PRNETO NUMERIC(18,2),
    IVAPORC NUMERIC(9,2),
    IVAITMONTO NUMERIC(18,2),
    CONSUMO NUMERIC(18,2),
    SUBTOTIT NUMERIC(18,2),
    SUBTOTITCON NUMERIC(18,2),
    TOTAL NUMERIC(18,2),
    CODIGOCL VARCHAR(20),
    ZONACOD VARCHAR(2),
    ZONANOM VARCHAR(60),
    DV CHAR(1),
    DIRECCION VARCHAR(60),
    CIUDAD VARCHAR(40),
    TELEFONO VARCHAR(40),
    CONTACTO VARCHAR(60),
    FAX VARCHAR(25),
    GRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    SUBGRUPO VARCHAR(3),
    NOMSUBG VARCHAR(30),
    MARCA VARCHAR(3),
    NOMMARCA VARCHAR(30),
    PESO NUMERIC(18,4),
    ANCHO NUMERIC(18,4),
    ALTO NUMERIC(18,4),
    LARGO NUMERIC(18,4),
    SUMA1 NUMERIC(18,2),
    SUMA2 NUMERIC(18,2),
    SUMA3 NUMERIC(18,2),
    IVA1 NUMERIC(18,2),
    IVA2 NUMERIC(18,2),
    IVA3 NUMERIC(18,2),
    SUMAEX NUMERIC(18,2),
    SUMAGR NUMERIC(18,2),
    TOTCONSUMO NUMERIC(18,2),
    VEHICULO VARCHAR(8),
    RECIBIDO NUMERIC(18,2),
    CAMBIO NUMERIC(18,2),
    HORA TIME,
    FORMAPAGO1 VARCHAR(30),
    MONTOPAGO1 NUMERIC(18,2),
    FORMAPAGO2 VARCHAR(30),
    MONTOPAGO2 NUMERIC(18,2),
    FORMAPAGO3 VARCHAR(30),
    MONTOPAGO3 NUMERIC(18,2),
    PUNTOS INTEGER,
    PUNTOSACUM INTEGER,
    PUNTOSVENC INTEGER)
AS
DECLARE VARIABLE IMPTOS CHAR(1);
DECLARE VARIABLE TARIFA INTEGER;
declare variable DEVUELTO NUMERIC(18,2);
/*DECLARE VARIABLE NROCOPIA INTEGER;*/
declare variable ORDENCOD CHAR(2);
declare variable IMPRDEV CHAR(2);
declare variable IMPR CHAR(1);
declare variable ITEMFP INTEGER;
declare variable FORMAP VARCHAR(30);
declare variable MONTOP NUMERIC(18,2);
declare variable SUCUR VARCHAR(10);
BEGIN
  SELECT F.PREF_PRE, FACT_NUMERO, FACT_FECHA, FACT_VENCE, F.BODE_COD, BODE_NOM, F.TERC_NIT, FACT_NOMCLIENTE, F.VEND_COD, VEND_NOMBRE, F.PTVT_ID, PTVT_NOM,
    AUTO_NUMERO, FACT_DESPACHO, FACT_TRANSP, FACT_COTIZACI, FACT_PEDIDO, FACT_REMISION, FACT_COMIPORC, FACT_COMIMONTO, FACT_IVAINC, 
    FACT_DTOPOR, FACT_DTOMONTO, FACT_ADICIONAL, FACT_IVAMONTO, FACT_RTFTEPOR, FACT_RTFTEMONTO, FACT_RTIVAPOR, FACT_RTIVAMONTO, FACT_RTICAPOR, FACT_RTICAMONTO, FACT_EXTRA, FACT_DTOFPOR, FACT_DTOFMONTO, FACT_DTOFFECHA, FACT_TOTAL,
    TERC_DIR, TERC_CIU, TERC_TEL, TERC_CONTACTO, TERC_FAX, TERC_DV,
    FACT_OBS, VEHI_COD, /*FACT_NROCOPIA,*/ FACT_RECIBIDO, FACT_SUCURSAL, FACT_DETCLI, FACT_DETCLINOM
    FROM FACTURAS F, BODEGA B, VENDEDORES V, PUNTO_VENTA P, TERCEROS T
    WHERE F.BODE_COD = B.BODE_COD AND F.VEND_COD = V.VEND_COD AND F.PTVT_ID = P.PTVT_ID AND F.TERC_NIT = T.TERC_NIT AND F.FACT_ID = :ID
    into :PREF, :NUMERO, :FECHA, :VENCE, :CODBODEGA, :NOMBODEGA, :NIT, :NOMTERCERO, :VENDEDOR, :NOMVENDEDOR, :PUNTOVTA, :NOMPUNTOVTA,
    :AUTORIZACION, :DESPACHO, :TRANSPORTADOR, :COTIZACION, :PEDIDO, :REMISION, :COMIPORC, :COMIMONTO, :IMPTOS,
    :DTOPORC, :DTOMONTO, :ADICIONAL, :IVAMONTO, :RTEFTEPORC, :RTEFTEMONTO, :RTEIVAPORC, :RTEIVAMONTO, :RTEICAPORC, :RTEICAMONTO, :EXTRA, :DTOFPORC, :DTOFMONTO, :FECHADTO, :TOTALFAC,
    :DIRECCION, :CIUDAD, :TELEFONO, :CONTACTO, :FAX, :DV, :OBS, :VEHICULO,/* :NROCOPIA,*/ :RECIBIDO, :SUCUR, :paciente, :nompaciente;

  /* ACUMULE LOS PUNTOS, SE HACE ACA POR SER POSTERIOR AL DETALLE */
  EXECUTE PROCEDURE acumula_puntos_cliente (31, :id, :nit, :fecha) returning_values (:PUNTOS);
  EXECUTE PROCEDURE consulta_puntos_cliente (:id, :nit, :fecha) returning_values (:puntos, :puntosacum, :puntosvenc);

  SELECT CLIE_COD, C.ZONA_COD, ZONA_NOM
    FROM CLIENTES C, ZONAS Z
    WHERE TERC_NIT = :NIT AND C.ZONA_COD = Z.ZONA_COD
    INTO :CODIGOCL, :ZONACOD, :ZONANOM;
  /*SELECT NOCO_NOMBRE FROM NOMBRES_COPIAS where NOCO_ID = :NROCOPIA INTO :NOMCOPIA;*/
  SELECT CLSU_DIR, CLSU_CIUDAD, CLSU_TEL FROM CLIENTE_SUCURSALES WHERE TERC_NIT = :NIT AND CLCU_COD = :SUCUR
    INTO :DIRECCION, :CIUDAD, :TELEFONO;
  /*if (NOMCOPIA IS NULL) then
    NOMCOPIA = 'COPIA No. ' || NROCOPIA;**/
  DIASVENCE = VENCE - FECHA;
  if (DIASVENCE > 0) then
    CONTCRED = 'CREDITO';
  ELSE
    CONTCRED = 'CONTADO';
  SUBTOTAL = TOTALFAC - EXTRA - IVAMONTO - ADICIONAL + DTOMONTO;
  TOTALPAGAR = TOTALFAC - RTEFTEMONTO - RTEIVAMONTO - RTEICAMONTO;
  if (RECIBIDO <> 0) then
      CAMBIO = RECIBIDO - totalpagar;
  ELSE
    CAMBIO = 0;
  SUMAEX = 0;
  SUMA1 = 0;
  SUMA2 = 0;
  SUMA3 = 0;
  IVA1 = 0;
  IVA2 = 0;
  IVA3 = 0;
  TOTCONSUMO = 0;
  MONTOPAGO1 = 0;
  SELECT MAX(AUDI_HORA) FROM AUDITORIA WHERE TIDO_COD = 31 AND AUDI_IDDOC = :ID AND AUDI_OPER = 'I' INTO :HORA;
  /* AHORA LAS FORMAS DE PAGO, BUSQUE EL ABONO DE HOY A LA FACTURA */
  ITEMFP = 1;
  MONTOPAGO1 = 0;
  MONTOPAGO2 = 0;
  MONTOPAGO3 = 0;
  FOR SELECT FOPA_NOM, RCPA_MONTO FROM RECIBOS_CAJA_PAGO P, FORMAS_PAGO F, RECIBOS_CAJA R, RECIBOS_CAJA_DETALLE D
    WHERE R.RECA_ID = P.RECA_ID AND R.RECA_ID = D.RECA_ID AND P.FOPA_ID = F.FOPA_ID AND RECA_FECHA = :FECHA AND RCDE_TIPODOC = 31 AND RCDE_IDDOC = :ID
    INTO :formap, :MONTOP
    DO
    BEGIN
    if (ITEMFP = 1) then
        BEGIN
        FORMAPAGO1 = FORMAP;
        MONTOPAGO1 = MONTOP;
        END
    if (ITEMFP = 2) then
        BEGIN
        FORMAPAGO2 = FORMAP;
        MONTOPAGO2 = MONTOP;
        END
    if (ITEMFP = 3) then
        BEGIN
        FORMAPAGO3 = FORMAP;
        MONTOPAGO3 = MONTOP;
        END
    ITEMFP = ITEMFP + 1;
    END
  EXECUTE PROCEDURE lee_configuracion ('FACTURACION','DOCUMENTOS','ORDENAR ITEMS POR CODIGO DE ARTICULO') returning_values (:ORDENCOD);
  EXECUTE PROCEDURE lee_configuracion ('FACTURACION','POS', 'IMPRIMIR DEVOLUCIONES DE ARTICULOS NEGATIVOS') returning_values (:imprdev);
  if (ORDENCOD = 'SI') then
    BEGIN
    FOR SELECT FADE_ITEM, D.ARTI_COD, FADE_CODBAR, SUBSTR(FADE_DESC,1,60), FADE_CANT, FADE_UNIDAD, FADE_FACTOR, BODE_COD, FADE_LOTE, LIPR_COD, FADE_PRUNIT, FADE_DTOPORC, FADE_DTOMONTO, FADE_IVAPORC, FADE_IVAMONTO, FADE_CONSUMO, FADE_TOTAL, FADE_REFERENCIA,
        GRUP_COD, SUBG_COD, MARC_COD, ARTI_PESO, ARTI_ANCHO, ARTI_ALTO, ARTI_LARGO, TAIV_COD, FADE_DEVUELTO
        FROM FACTURAS_DETALLE D, ARTICULO A
        WHERE D.ARTI_COD = A.ARTI_COD AND D.FACT_ID = :ID
        ORDER BY D.ARTI_COD
        INTO :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :FACTOR, :BODITEM, :LOTE, :LISTAPR, :PRUNIT, :DTOITPORC, :DTOITMONTO, :IVAPORC, :IVAITMONTO, :CONSUMO, :TOTAL, :refitem,
        :GRUPO, :SUBGRUPO, :MARCA, :PESO, :ANCHO, :ALTO, :LARGO, :TARIFA, :devuelto
        DO
          BEGIN
          if (IMPRDEV <> 'SI') then
            BEGIN
            if ((CANT >= 0) AND (DEVUELTO = 0)) then
                IMPR = 'S';
            ELSE
                IMPR = 'N'; /* ES DEVOLUCION */
            END
          ELSE
            IMPR = 'S';
          if (IMPR = 'S') then
            BEGIN
            if (IMPTOS = 'S') then
                if (cant <> 0) then
                    PRNETO = PRUNIT - DTOITMONTO - ((IVAITMONTO+CONSUMO) / CANT);
                else
                    PRNETO = PRUNIT - DTOITMONTO;
            ELSE
                PRNETO = PRUNIT - DTOITMONTO;
            SUBTOTIT = TOTAL - IVAITMONTO - CONSUMO;
            SUBTOTITCON = TOTAL;
            TOTCONSUMO = TOTCONSUMO + CONSUMO;
            SELECT LOTE_VENCE FROM LOTES WHERE LOTE_NRO = :lote AND ARTI_COD = :ARTICULO INTO :vlote;
            if (TARIFA = 0) then
                SUMAEX = SUMAEX + TOTAL;
            if (TARIFA = 1) then
                BEGIN
                SUMA1 = SUMA1 + TOTAL - IVAITMONTO;
                IVA1 = IVA1 + IVAITMONTO;
                END
            if (TARIFA = 2) then
                BEGIN
                SUMA2 = SUMA2 + TOTAL - IVAITMONTO;
                IVA2 = IVA2 + IVAITMONTO;
                END
            if (TARIFA = 3) then
                BEGIN
                SUMA3 = SUMA3 + TOTAL - IVAITMONTO;
                IVA3 = IVA3 + IVAITMONTO;
                END
            SUMAGR = SUMA1 + SUMA2 + SUMA3;
            if (IMPTOS = 'N') then
                TOTAL = TOTAL - IVAITMONTO - CONSUMO;
            if (ANCHO IS NULL) then
                ANCHO = 0;
            if (ALTO IS NULL) then
                ALTO = 0;
            if (LARGO IS NULL) then
                LARGO = 0;
            if (PESO IS NULL) then
                PESO = 0;
            PESO = PESO * CANT;
            SUSPEND;
            END
          END
    END
ELSE
    BEGIN
    FOR SELECT FADE_ITEM, D.ARTI_COD, FADE_CODBAR, SUBSTR(FADE_DESC,1,60), FADE_CANT, FADE_UNIDAD, FADE_FACTOR, BODE_COD, FADE_LOTE, LIPR_COD, FADE_PRUNIT, FADE_DTOPORC, FADE_DTOMONTO, FADE_IVAPORC, FADE_IVAMONTO, FADE_CONSUMO, FADE_TOTAL, FADE_REFERENCIA,
        GRUP_COD, SUBG_COD, MARC_COD, ARTI_PESO, ARTI_ANCHO, ARTI_ALTO, ARTI_LARGO, TAIV_COD, FADE_DEVUELTO
        FROM FACTURAS_DETALLE D, ARTICULO A
        WHERE D.ARTI_COD = A.ARTI_COD AND D.FACT_ID = :ID
        ORDER BY FADE_ITEM
        INTO :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :FACTOR, :BODITEM, :LOTE, :LISTAPR, :PRUNIT, :DTOITPORC, :DTOITMONTO, :IVAPORC, :IVAITMONTO, :CONSUMO, :TOTAL, :refitem, 
        :GRUPO, :SUBGRUPO, :MARCA, :PESO, :ANCHO, :ALTO, :LARGO, :TARIFA, :devuelto
        DO
          BEGIN
          if (IMPRDEV <> 'SI') then
            BEGIN
            if ((CANT >= 0) AND (DEVUELTO = 0)) then
                IMPR = 'S';
            ELSE
                IMPR = 'N'; /* ES DEVOLUCION */
            END
          ELSE
            IMPR = 'S';
          if (IMPR = 'S') then
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :GRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :MARCA INTO NOMMARCA;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :SUBGRUPO AND GRUP_COD = :GRUPO INTO :NOMSUBG;
            if (IMPTOS = 'S') then
              PRNETO = PRUNIT - DTOITMONTO - ((IVAITMONTO+CONSUMO) / CANT);
            ELSE
              PRNETO = PRUNIT - DTOITMONTO;
            SUBTOTIT = TOTAL - IVAITMONTO - CONSUMO;
            SUBTOTITCON = TOTAL;
            TOTCONSUMO = TOTCONSUMO + CONSUMO;
            SELECT LOTE_VENCE FROM LOTES WHERE LOTE_NRO = :lote AND ARTI_COD = :ARTICULO INTO :vlote;
            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;
            if (ANCHO IS NULL) then
                ANCHO = 0;
            if (ALTO IS NULL) then
                ALTO = 0;
            if (LARGO IS NULL) then
                LARGO = 0;
            if (PESO IS NULL) then
                PESO = 0;
            PESO = PESO * CANT;
            SUSPEND;
            END
          END
    END
END

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE IMPR_REDENCION(
    ID INTEGER)
RETURNS (
    NUMERO VARCHAR(6),
    FECHA DATE,
    NIT VARCHAR(20),
    NOMCLIENTE VARCHAR(60),
    DIR VARCHAR(60),
    TEL VARCHAR(60),
    PREMIO VARCHAR(15),
    NOMPREMIO VARCHAR(60),
    PUNTOS INTEGER,
    PUNTOSACUM INTEGER,
    PUNTOSVENC INTEGER)
AS
declare variable puntosaux INTEGER;
begin
SELECT PTRE_NUMERO, PTRE_FECHA, PTRE_NIT, TERC_NOM, TERC_DIR, TERC_TEL, R.PTPR_COD, PTPR_NOMBRE, PTRE_PUNTOS
    FROM PUNTOS_REDENCION R, puntos_premios P, TERCEROS T
    WHERE R.ptre_nit = T.terc_nit AND R.ptpr_cod = P.ptpr_cod AND R.ptre_id = :ID
    INTO :NUMERO, :FECHA, :NIT, :NOMCLIENTE, :DIR, :TEL, :PREMIO, :NOMPREMIO, :PUNTOS;
EXECUTE PROCEDURE consulta_puntos_cliente (0, :nit, :fecha) returning_values (:puntosaux, :puntosacum, :puntosvenc);
suspend;
end

^

SET TERM ; ^


/* 05-10 comisiones por lista de precios */
INSERT INTO CONFIGURACION (CONF_MODULO, CONF_CATEGORIA, CONF_PROPIEDAD, CONF_VALOR, CONF_POSIBLES, CONF_AYUDA) VALUES ('FACTURACION', 'ARTICULOS', 'COMISIONES POR ARTICULO POR GRUPO O POR LISTA DE PRECIOS', 'GRUPO', 'GRUPO,LISTA', 'GRUPO: La comisión del artículo se lee de la tabla de grupos al que pertenece. LISTA: La comisión se lee de la tabla de precios del artículo para la lista usada en la factura');
COMMIT WORK;


SET TERM ^ ;

CREATE OR ALTER PROCEDURE COMISIONES_ARTICULO(
    DETALLE CHAR(1),
    DESDE VARCHAR(2),
    HASTA VARCHAR(2),
    FECINI DATE,
    FECFIN DATE,
    ARTINI VARCHAR(15),
    ARTFIN VARCHAR(15),
    CEROS CHAR(1),
    AGENCIA INTEGER)
RETURNS (
    CODVEND VARCHAR(2),
    NOMVEND VARCHAR(60),
    NOMTIPO VARCHAR(10),
    ARTICULO VARCHAR(15),
    DESCRIPCION VARCHAR(60),
    CODGRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    CODSUBG VARCHAR(3),
    NOMSUBG VARCHAR(30),
    CODMARC VARCHAR(3),
    NOMMARC VARCHAR(30),
    UNIDAD VARCHAR(8),
    CANTVTAS NUMERIC(18,4),
    CANTDEV NUMERIC(18,4),
    BASEVTAS NUMERIC(18,2),
    BASEDEV NUMERIC(18,2),
    PORC NUMERIC(18,2),
    COMISION NUMERIC(18,2),
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE)
AS
declare variable COMIPOR NUMERIC(9,2);
declare variable COMIMONTO NUMERIC(18,2);
declare variable LISTA VARCHAR(6);
declare variable COMIPPOR NUMERIC(9,2);
declare variable COMIPMONTO NUMERIC(18,2);
declare variable IDFAC INTEGER;
BEGIN
EXECUTE PROCEDURE lee_configuracion ('FACTURACION', 'ARTICULOS', 'COMISIONES POR ARTICULO POR GRUPO O POR LISTA DE PRECIOS') returning_values (LISTA);
FOR select VEND_COD, VEND_NOMBRE
    from VENDEDORES
    where VEND_COD >= :DESDE AND VEND_COD <= :HASTA AND ((:AGENCIA = 0) or (SUCU_ID = :AGENCIA))
    INTO :CODVEND, :NOMVEND
    DO  
    BEGIN
    FOR SELECT ARTI_COD, ARTI_DES, ARTI_UNIDAD, A.GRUP_COD, GRUP_NOM, A.SUBG_COD, A.MARC_COD, GRUP_COMIPOR, GRUP_COMIMONTO
        FROM ARTICULO A, GRUPO G
        WHERE ARTI_COD >= :ARTINI AND ARTI_COD <= :ARTFIN AND A.GRUP_COD = G.GRUP_COD
      INTO :ARTICULO, :DESCRIPCION, :UNIDAD, :CODGRUPO, :NOMGRUPO, :CODSUBG, :CODMARC, :COMIPOR, :COMIMONTO
      DO
        BEGIN
        SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
        SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
        if (COMIMONTO IS null) then
            COMIMONTO = 0;
        if (DETALLE = 'N') then
            BEGIN
            if (LISTA = 'GRUPO') then
                BEGIN
                SELECT SUM(FADE_CANT * FADE_FACTOR), SUM(FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO)
                    FROM FACTURAS_DETALLE D, FACTURAS F
                    WHERE F.FACT_ID = D.FACT_ID AND ARTI_COD = :ARTICULO AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND VEND_COD = :CODVEND AND FACT_ANULADO = 'N'
                    INTO :CANTVTAS, :BASEVTAS;
                SELECT SUM(DVDE_CANT * DVDE_FACTOR), SUM(DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO)
                    FROM devoluciones_ventas_detalle D, DEVOLUCIONES_VENTAS V
                    WHERE V.DEVT_ID = D.DEVT_ID AND ARTI_COD = :ARTICULO AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND VEND_COD = :CODVEND AND DEVT_ANULADO = 'N'
                    INTO :CANTDEV, :BASEDEV;
                if (CANTVTAS IS NULL) then
                    CANTVTAS = 0;
                if (CANTDEV IS NULL) then
                    CANTDEV = 0;
                if (BASEVTAS IS NULL) then
                    BASEVTAS = 0;
                if (BASEDEV IS NULL) then
                    BASEDEV = 0;
                if (COMIMONTO > 0) then
                    BEGIN
                    COMISION = (CANTVTAS - CANTDEV) * COMIMONTO;
                    PORC = COMISION * 100 / (BASEVTAS - BASEDEV);
                    END
                ELSE
                    BEGIN
                    COMISION = (BASEVTAS - BASEDEV) * COMIPOR / 100;
                    PORC = COMIPOR;
                    END
                if (CEROS = 'S') then
                    SUSPEND;
                ELSE
                    if ((CANTVTAS <> 0) OR (CANTDEV <> 0)) then
                        SUSPEND;
                END
            ELSE
                BEGIN
                SELECT SUM(FADE_CANT * FADE_FACTOR), SUM(FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), SUM((FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO)*P.prar_comi/100)
                    FROM FACTURAS_DETALLE D, FACTURAS F, PRECIOS_ARTICULO P
                    WHERE F.FACT_ID = D.FACT_ID AND D.arti_cod = P.arti_cod AND D.lipr_cod = P.lipr_cod AND D.ARTI_COD = :ARTICULO AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND VEND_COD = :CODVEND AND FACT_ANULADO = 'N'
                    INTO :CANTVTAS, :BASEVTAS, :COMISION;
                SELECT SUM(DVDE_CANT * DVDE_FACTOR), SUM(DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO)
                    FROM devoluciones_ventas_detalle D, DEVOLUCIONES_VENTAS V
                    WHERE V.DEVT_ID = D.DEVT_ID AND D.ARTI_COD = :ARTICULO AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND VEND_COD = :CODVEND AND DEVT_ANULADO = 'N'
                    INTO :CANTDEV, :BASEDEV;
                if (CANTVTAS IS NULL) then
                    CANTVTAS = 0;
                if (CANTDEV IS NULL) then
                    CANTDEV = 0;
                if (BASEVTAS IS NULL) then
                    BASEVTAS = 0;
                if (BASEDEV IS NULL) then
                    BASEDEV = 0;
                if (COMISION IS NULL) then
                    COMISION = 0;
                if (COMIMONTO IS NULL) then
                    COMIMONTO = 0;
                if (BASEVTAS <> 0) then
                    PORC = COMISION / BASEVTAS;
                else
                    PORC = 0;
                if (basedev <> 0) then
                    COMISION = (BASEVTAS - BASEDEV) * PORC;
                PORC = PORC * 100;
                if (CEROS = 'S') then
                    SUSPEND;
                ELSE
                    if ((CANTVTAS <> 0) OR (CANTDEV <> 0)) then
                        SUSPEND;
                END
            END
        ELSE
            BEGIN
            SELECT TIDO_NOMCORTO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 31 INTO :NOMTIPO;
            FOR SELECT PREF_PRE, FACT_NUMERO, FACT_FECHA, FADE_CANT * FADE_FACTOR, FADE_TOTAL - FADE_IVAMONTO - FADE_CONSUMO, P.prar_comi, P.prar_comimonto
                FROM FACTURAS F, FACTURAS_DETALLE D, precios_articulo P
                WHERE F.FACT_ID = D.FACT_ID AND D.arti_cod = P.arti_cod AND D.lipr_cod = P.lipr_cod AND D.ARTI_COD = :ARTICULO AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND VEND_COD = :CODVEND AND FACT_ANULADO = 'N'
                INTO :PREFIJO, :NUMERO, :FECHA, :CANTVTAS, :BASEVTAS, :comippor, :comipmonto
                DO
                BEGIN
                if (CANTVTAS IS NULL) then
                    CANTVTAS = 0;
                if (BASEVTAS IS NULL) then
                    BASEVTAS = 0;
                if (LISTA = 'GRUPO') then
                    BEGIN
                    if (COMIMONTO > 0) then
                        BEGIN
                        COMISION = CANTVTAS * COMIMONTO;
                        PORC = COMISION * 100 / BASEVTAS;
                        END
                    ELSE
                        BEGIN
                        COMISION = BASEVTAS * COMIPOR / 100;
                        PORC = COMIPOR;
                        END
                    END
                ELSE
                    BEGIN
                    if (COMIPMONTO > 0) then
                        BEGIN
                        COMISION = CANTVTAS * COMIPMONTO;
                        PORC = COMISION * 100 / BASEVTAS;
                        END
                    ELSE
                        BEGIN
                        COMISION = BASEVTAS * COMIPPOR / 100;
                        PORC = COMIPPOR;
                        END
                    END
                SUSPEND;
                END
            SELECT TIDO_NOMCORTO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 33 INTO :NOMTIPO;
            FOR SELECT PREF_PRE, DEVT_NUMERO, DEVT_FECHA, DVDE_CANT * DVDE_FACTOR, DVDE_TOTAL - DVDE_IVAMONTO - DVDE_CONSUMO, V.devt_factid
                FROM DEVOLUCIONES_VENTAS V, DEVOLUCIONES_VENTAS_DETALLE D
                WHERE V.DEVT_ID = D.DEVT_ID AND D.ARTI_COD = :ARTICULO AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND VEND_COD = :CODVEND AND DEVT_ANULADO = 'N'
                INTO :PREFIJO, :NUMERO, :FECHA, :CANTDEV, :BASEDEV, :idfac
                DO
                BEGIN
                if (CANTDEV IS NULL) then
                    CANTDEV = 0;
                if (BASEDEV IS NULL) then
                    BASEDEV = 0;
                if (LISTA = 'GRUPO') then
                    BEGIN
                    if (COMIMONTO > 0) then
                        BEGIN
                        COMISION = CANTDEV * COMIMONTO * -1;
                        PORC = COMISION * 100 / BASEDEV;
                        END
                    ELSE
                        BEGIN
                        COMISION = BASEDEV * COMIPOR / 100 * -1;
                        PORC = COMIPOR;
                        END
                    END
                ELSE
                    BEGIN
                    /*  BUSQUE EL PRECIO DE LA FACTURA */
                    COMIPMONTO = 0;
                    COMIPPOR = 0;
                    SELECT P.prar_comi, P.prar_comimonto FROM FACTURAS_DETALLE D, PRECIOS_ARTICULO P
                        WHERE D.arti_cod = P.arti_cod AND D.lipr_cod = P.lipr_cod AND D.ARTI_COD = :articulo AND FACT_ID = :idfac INTO :comippor, :comipmonto;
                    if (COMIPMONTO > 0) then
                        BEGIN
                        COMISION = CANTDEV * COMIPMONTO * -1;
                        PORC = COMISION * 100 / BASEDEV;
                        END
                    ELSE
                        BEGIN
                        COMISION = BASEDEV * COMIPPOR / 100 * -1;
                        PORC = COMIPPOR;
                        END
                    END
                SUSPEND;
                END
            END
        END
    END
END
^

SET TERM ; ^



/* 05-11 */
SET TERM ^ ;

CREATE OR ALTER PROCEDURE IMPR_FACTURA(
    ID INTEGER)
RETURNS (
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    VENCE DATE,
    DIASVENCE INTEGER,
    CONTCRED CHAR(17),
    NIT VARCHAR(20),
    NOMTERCERO VARCHAR(60),
    VENDEDOR INTEGER,
    NOMVENDEDOR VARCHAR(60),
    PUNTOVTA INTEGER,
    NOMPUNTOVTA VARCHAR(30),
    CODBODEGA VARCHAR(2),
    NOMBODEGA VARCHAR(30),
    AUTORIZACION VARCHAR(20),
    DESPACHO VARCHAR(255),
    TRANSPORTADOR VARCHAR(60),
    COTIZACION VARCHAR(30),
    PEDIDO VARCHAR(30),
    REMISION VARCHAR(30),
    PACIENTE VARCHAR(20),
    NOMPACIENTE VARCHAR(60),
    COMIPORC NUMERIC(9,2),
    COMIMONTO NUMERIC(18,2),
    SUBTOTAL NUMERIC(18,2),
    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),
    EXTRA NUMERIC(18,2),
    DTOFPORC NUMERIC(9,2),
    DTOFMONTO NUMERIC(18,2),
    FECHADTO DATE,
    TOTALFAC NUMERIC(18,2),
    TOTALPAGAR NUMERIC(18,2),
    OBS BLOB SUB_TYPE 1 SEGMENT SIZE 80,
    ITEM INTEGER,
    ARTICULO VARCHAR(15),
    CODBAR VARCHAR(15),
    ARTIDES VARCHAR(60),
    CANT NUMERIC(18,4),
    LOTE VARCHAR(15),
    VLOTE DATE,
    UNIDAD VARCHAR(8),
    FACTOR INTEGER,
    LISTAPR INTEGER,
    REFITEM VARCHAR(60),
    BODITEM VARCHAR(2),
    PRUNIT NUMERIC(18,2),
    DTOITPORC NUMERIC(9,2),
    DTOITMONTO NUMERIC(18,2),
    PRNETO NUMERIC(18,2),
    IVAPORC NUMERIC(9,2),
    IVAITMONTO NUMERIC(18,2),
    CONSUMO NUMERIC(18,2),
    SUBTOTIT NUMERIC(18,2),
    SUBTOTITCON NUMERIC(18,2),
    TOTAL NUMERIC(18,2),
    CODIGOCL VARCHAR(20),
    ZONACOD VARCHAR(2),
    ZONANOM VARCHAR(60),
    DV CHAR(1),
    DIRECCION VARCHAR(60),
    CIUDAD VARCHAR(40),
    TELEFONO VARCHAR(40),
    CONTACTO VARCHAR(60),
    FAX VARCHAR(25),
    GRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    SUBGRUPO VARCHAR(3),
    NOMSUBG VARCHAR(30),
    MARCA VARCHAR(3),
    NOMMARCA VARCHAR(30),
    PESO NUMERIC(18,4),
    ANCHO NUMERIC(18,4),
    ALTO NUMERIC(18,4),
    LARGO NUMERIC(18,4),
    SUMA1 NUMERIC(18,2),
    SUMA2 NUMERIC(18,2),
    SUMA3 NUMERIC(18,2),
    IVA1 NUMERIC(18,2),
    IVA2 NUMERIC(18,2),
    IVA3 NUMERIC(18,2),
    SUMAEX NUMERIC(18,2),
    SUMAGR NUMERIC(18,2),
    TOTCONSUMO NUMERIC(18,2),
    VEHICULO VARCHAR(8),
    RECIBIDO NUMERIC(18,2),
    CAMBIO NUMERIC(18,2),
    HORA TIME,
    FORMAPAGO1 VARCHAR(30),
    MONTOPAGO1 NUMERIC(18,2),
    FORMAPAGO2 VARCHAR(30),
    MONTOPAGO2 NUMERIC(18,2),
    FORMAPAGO3 VARCHAR(30),
    MONTOPAGO3 NUMERIC(18,2),
    PUNTOS INTEGER,
    PUNTOSACUM INTEGER,
    PUNTOSVENC INTEGER)
AS
DECLARE VARIABLE IMPTOS CHAR(1);
DECLARE VARIABLE TARIFA INTEGER;
declare variable DEVUELTO NUMERIC(18,2);
/*DECLARE VARIABLE NROCOPIA INTEGER;*/
declare variable ORDENCOD CHAR(2);
declare variable IMPRDEV CHAR(2);
declare variable IMPR CHAR(1);
declare variable ITEMFP INTEGER;
declare variable FORMAP VARCHAR(30);
declare variable MONTOP NUMERIC(18,2);
declare variable SUCUR VARCHAR(10);
BEGIN
  SELECT F.PREF_PRE, FACT_NUMERO, FACT_FECHA, FACT_VENCE, F.BODE_COD, BODE_NOM, F.TERC_NIT, FACT_NOMCLIENTE, F.VEND_COD, VEND_NOMBRE, F.PTVT_ID, PTVT_NOM,
    AUTO_NUMERO, FACT_DESPACHO, FACT_TRANSP, FACT_COTIZACI, FACT_PEDIDO, FACT_REMISION, FACT_COMIPORC, FACT_COMIMONTO, FACT_IVAINC, 
    FACT_DTOPOR, FACT_DTOMONTO, FACT_ADICIONAL, FACT_IVAMONTO, FACT_RTFTEPOR, FACT_RTFTEMONTO, FACT_RTIVAPOR, FACT_RTIVAMONTO, FACT_RTICAPOR, FACT_RTICAMONTO, FACT_EXTRA, FACT_DTOFPOR, FACT_DTOFMONTO, FACT_DTOFFECHA, FACT_TOTAL,
    TERC_DIR, TERC_CIU, TERC_TEL, TERC_CONTACTO, TERC_FAX, TERC_DV,
    FACT_OBS, VEHI_COD, /*FACT_NROCOPIA,*/ FACT_RECIBIDO, FACT_SUCURSAL, FACT_DETCLI, FACT_DETCLINOM
    FROM FACTURAS F, BODEGA B, VENDEDORES V, PUNTO_VENTA P, TERCEROS T
    WHERE F.BODE_COD = B.BODE_COD AND F.VEND_COD = V.VEND_COD AND F.PTVT_ID = P.PTVT_ID AND F.TERC_NIT = T.TERC_NIT AND F.FACT_ID = :ID
    into :PREF, :NUMERO, :FECHA, :VENCE, :CODBODEGA, :NOMBODEGA, :NIT, :NOMTERCERO, :VENDEDOR, :NOMVENDEDOR, :PUNTOVTA, :NOMPUNTOVTA,
    :AUTORIZACION, :DESPACHO, :TRANSPORTADOR, :COTIZACION, :PEDIDO, :REMISION, :COMIPORC, :COMIMONTO, :IMPTOS,
    :DTOPORC, :DTOMONTO, :ADICIONAL, :IVAMONTO, :RTEFTEPORC, :RTEFTEMONTO, :RTEIVAPORC, :RTEIVAMONTO, :RTEICAPORC, :RTEICAMONTO, :EXTRA, :DTOFPORC, :DTOFMONTO, :FECHADTO, :TOTALFAC,
    :DIRECCION, :CIUDAD, :TELEFONO, :CONTACTO, :FAX, :DV, :OBS, :VEHICULO,/* :NROCOPIA,*/ :RECIBIDO, :SUCUR, :paciente, :nompaciente;

  /* ACUMULE LOS PUNTOS, SE HACE ACA POR SER POSTERIOR AL DETALLE */
  EXECUTE PROCEDURE acumula_puntos_cliente (31, :id, :nit, :fecha) returning_values (:PUNTOS);
  EXECUTE PROCEDURE consulta_puntos_cliente (:id, :nit, :fecha) returning_values (:puntos, :puntosacum, :puntosvenc);

  SELECT CLIE_COD, C.ZONA_COD, ZONA_NOM
    FROM CLIENTES C, ZONAS Z
    WHERE TERC_NIT = :NIT AND C.ZONA_COD = Z.ZONA_COD
    INTO :CODIGOCL, :ZONACOD, :ZONANOM;
  /*SELECT NOCO_NOMBRE FROM NOMBRES_COPIAS where NOCO_ID = :NROCOPIA INTO :NOMCOPIA;*/
  SELECT CLSU_DIR, CLSU_CIUDAD, CLSU_TEL FROM CLIENTE_SUCURSALES WHERE TERC_NIT = :NIT AND CLCU_COD = :SUCUR
    INTO :DIRECCION, :CIUDAD, :TELEFONO;
  /*if (NOMCOPIA IS NULL) then
    NOMCOPIA = 'COPIA No. ' || NROCOPIA;**/
  DIASVENCE = VENCE - FECHA;
  if (DIASVENCE > 0) then
    CONTCRED = 'CREDITO ' || CAST(DIASVENCE AS VARCHAR(3)) || ' DIAS';
  ELSE
    CONTCRED = 'CONTADO';
  SUBTOTAL = TOTALFAC - EXTRA - IVAMONTO - ADICIONAL + DTOMONTO;
  TOTALPAGAR = TOTALFAC - RTEFTEMONTO - RTEIVAMONTO - RTEICAMONTO;
  if (RECIBIDO <> 0) then
      CAMBIO = RECIBIDO - totalpagar;
  ELSE
    CAMBIO = 0;
  SUMAEX = 0;
  SUMA1 = 0;
  SUMA2 = 0;
  SUMA3 = 0;
  IVA1 = 0;
  IVA2 = 0;
  IVA3 = 0;
  TOTCONSUMO = 0;
  MONTOPAGO1 = 0;
  SELECT MAX(AUDI_HORA) FROM AUDITORIA WHERE TIDO_COD = 31 AND AUDI_IDDOC = :ID AND AUDI_OPER = 'I' INTO :HORA;
  /* AHORA LAS FORMAS DE PAGO, BUSQUE EL ABONO DE HOY A LA FACTURA */
  ITEMFP = 1;
  MONTOPAGO1 = 0;
  MONTOPAGO2 = 0;
  MONTOPAGO3 = 0;
  FOR SELECT FOPA_NOM, RCPA_MONTO FROM RECIBOS_CAJA_PAGO P, FORMAS_PAGO F, RECIBOS_CAJA R, RECIBOS_CAJA_DETALLE D
    WHERE R.RECA_ID = P.RECA_ID AND R.RECA_ID = D.RECA_ID AND P.FOPA_ID = F.FOPA_ID AND RECA_FECHA = :FECHA AND RCDE_TIPODOC = 31 AND RCDE_IDDOC = :ID
    INTO :formap, :MONTOP
    DO
    BEGIN
    if (ITEMFP = 1) then
        BEGIN
        FORMAPAGO1 = FORMAP;
        MONTOPAGO1 = MONTOP;
        END
    if (ITEMFP = 2) then
        BEGIN
        FORMAPAGO2 = FORMAP;
        MONTOPAGO2 = MONTOP;
        END
    if (ITEMFP = 3) then
        BEGIN
        FORMAPAGO3 = FORMAP;
        MONTOPAGO3 = MONTOP;
        END
    ITEMFP = ITEMFP + 1;
    END
  EXECUTE PROCEDURE lee_configuracion ('FACTURACION','DOCUMENTOS','ORDENAR ITEMS POR CODIGO DE ARTICULO') returning_values (:ORDENCOD);
  EXECUTE PROCEDURE lee_configuracion ('FACTURACION','POS', 'IMPRIMIR DEVOLUCIONES DE ARTICULOS NEGATIVOS') returning_values (:imprdev);
  if (ORDENCOD = 'SI') then
    BEGIN
    FOR SELECT FADE_ITEM, D.ARTI_COD, FADE_CODBAR, SUBSTR(FADE_DESC,1,60), FADE_CANT, FADE_UNIDAD, FADE_FACTOR, BODE_COD, FADE_LOTE, LIPR_COD, FADE_PRUNIT, FADE_DTOPORC, FADE_DTOMONTO, FADE_IVAPORC, FADE_IVAMONTO, FADE_CONSUMO, FADE_TOTAL, FADE_REFERENCIA,
        GRUP_COD, SUBG_COD, MARC_COD, ARTI_PESO, ARTI_ANCHO, ARTI_ALTO, ARTI_LARGO, TAIV_COD, FADE_DEVUELTO
        FROM FACTURAS_DETALLE D, ARTICULO A
        WHERE D.ARTI_COD = A.ARTI_COD AND D.FACT_ID = :ID
        ORDER BY D.ARTI_COD
        INTO :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :FACTOR, :BODITEM, :LOTE, :LISTAPR, :PRUNIT, :DTOITPORC, :DTOITMONTO, :IVAPORC, :IVAITMONTO, :CONSUMO, :TOTAL, :refitem,
        :GRUPO, :SUBGRUPO, :MARCA, :PESO, :ANCHO, :ALTO, :LARGO, :TARIFA, :devuelto
        DO
          BEGIN
          if (IMPRDEV <> 'SI') then
            BEGIN
            if ((CANT >= 0) AND (DEVUELTO = 0)) then
                IMPR = 'S';
            ELSE
                IMPR = 'N'; /* ES DEVOLUCION */
            END
          ELSE
            IMPR = 'S';
          if (IMPR = 'S') then
            BEGIN
            if (IMPTOS = 'S') then
                if (cant <> 0) then
                    PRNETO = PRUNIT - DTOITMONTO - ((IVAITMONTO+CONSUMO) / CANT);
                else
                    PRNETO = PRUNIT - DTOITMONTO;
            ELSE
                PRNETO = PRUNIT - DTOITMONTO;
            SUBTOTIT = TOTAL - IVAITMONTO - CONSUMO;
            SUBTOTITCON = TOTAL;
            TOTCONSUMO = TOTCONSUMO + CONSUMO;
            SELECT LOTE_VENCE FROM LOTES WHERE LOTE_NRO = :lote AND ARTI_COD = :ARTICULO INTO :vlote;
            if (TARIFA = 0) then
                SUMAEX = SUMAEX + TOTAL;
            if (TARIFA = 1) then
                BEGIN
                SUMA1 = SUMA1 + TOTAL - IVAITMONTO;
                IVA1 = IVA1 + IVAITMONTO;
                END
            if (TARIFA = 2) then
                BEGIN
                SUMA2 = SUMA2 + TOTAL - IVAITMONTO;
                IVA2 = IVA2 + IVAITMONTO;
                END
            if (TARIFA = 3) then
                BEGIN
                SUMA3 = SUMA3 + TOTAL - IVAITMONTO;
                IVA3 = IVA3 + IVAITMONTO;
                END
            SUMAGR = SUMA1 + SUMA2 + SUMA3;
            if (IMPTOS = 'N') then
                TOTAL = TOTAL - IVAITMONTO - CONSUMO;
            if (ANCHO IS NULL) then
                ANCHO = 0;
            if (ALTO IS NULL) then
                ALTO = 0;
            if (LARGO IS NULL) then
                LARGO = 0;
            if (PESO IS NULL) then
                PESO = 0;
            PESO = PESO * CANT;
            SUSPEND;
            END
          END
    END
ELSE
    BEGIN
    FOR SELECT FADE_ITEM, D.ARTI_COD, FADE_CODBAR, SUBSTR(FADE_DESC,1,60), FADE_CANT, FADE_UNIDAD, FADE_FACTOR, BODE_COD, FADE_LOTE, LIPR_COD, FADE_PRUNIT, FADE_DTOPORC, FADE_DTOMONTO, FADE_IVAPORC, FADE_IVAMONTO, FADE_CONSUMO, FADE_TOTAL, FADE_REFERENCIA,
        GRUP_COD, SUBG_COD, MARC_COD, ARTI_PESO, ARTI_ANCHO, ARTI_ALTO, ARTI_LARGO, TAIV_COD, FADE_DEVUELTO
        FROM FACTURAS_DETALLE D, ARTICULO A
        WHERE D.ARTI_COD = A.ARTI_COD AND D.FACT_ID = :ID
        ORDER BY FADE_ITEM
        INTO :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :FACTOR, :BODITEM, :LOTE, :LISTAPR, :PRUNIT, :DTOITPORC, :DTOITMONTO, :IVAPORC, :IVAITMONTO, :CONSUMO, :TOTAL, :refitem, 
        :GRUPO, :SUBGRUPO, :MARCA, :PESO, :ANCHO, :ALTO, :LARGO, :TARIFA, :devuelto
        DO
          BEGIN
          if (IMPRDEV <> 'SI') then
            BEGIN
            if ((CANT >= 0) AND (DEVUELTO = 0)) then
                IMPR = 'S';
            ELSE
                IMPR = 'N'; /* ES DEVOLUCION */
            END
          ELSE
            IMPR = 'S';
          if (IMPR = 'S') then
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :GRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :MARCA INTO NOMMARCA;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :SUBGRUPO AND GRUP_COD = :GRUPO INTO :NOMSUBG;
            if (IMPTOS = 'S') then
              PRNETO = PRUNIT - DTOITMONTO - ((IVAITMONTO+CONSUMO) / CANT);
            ELSE
              PRNETO = PRUNIT - DTOITMONTO;
            SUBTOTIT = TOTAL - IVAITMONTO - CONSUMO;
            SUBTOTITCON = TOTAL;
            TOTCONSUMO = TOTCONSUMO + CONSUMO;
            SELECT LOTE_VENCE FROM LOTES WHERE LOTE_NRO = :lote AND ARTI_COD = :ARTICULO INTO :vlote;
            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;
            if (ANCHO IS NULL) then
                ANCHO = 0;
            if (ALTO IS NULL) then
                ALTO = 0;
            if (LARGO IS NULL) then
                LARGO = 0;
            if (PESO IS NULL) then
                PESO = 0;
            PESO = PESO * CANT;
            SUSPEND;
            END
          END
    END
END
^

SET TERM ; ^


/* 05-13 activacion de puntos de venta */
ALTER TABLE PUNTO_VENTA
ADD PTVT_ACTIVO T_BOOLEANO;
update punto_venta set ptvt_activo = 'S';
commit work;

DROP INDEX MOVIMIENTO_CLIENTES_IDX2;

/* 05-14 cuentas retefte por grupo */
ALTER TABLE GRUPO
ADD GRUP_CTARTFTEV T_CTA_CONTABLE;
ALTER TABLE GRUPO
ADD GRUP_CTARTFTEC T_CTA_CONTABLE;
ALTER TABLE GRUPO
ADD GRUP_RTFTEB T_MONTO;
ALTER TABLE GRUPO
ADD GRUP_RTFTEP T_PORCENTAJE;

SET TERM ^ ;

CREATE OR ALTER TRIGGER ARTICULO_AI FOR ARTICULO
ACTIVE AFTER INSERT POSITION 0
AS
declare variable OK CHAR(2);
declare variable LISTA INTEGER;
declare variable UTIL NUMERIC(9,2);
declare variable MARGEN NUMERIC(9,2);
declare variable GRUP_TIVA CHAR(10);
declare variable AUTOM CHAR(1);
BEGIN
EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION', 'ARTICULOS', 'CREAR PRECIOS AL CREAR ARTICULOS') RETURNING_VALUES (:OK);
IF (OK = 'SI') THEN
  BEGIN
  /* INSERTE PRECIOS */
  FOR SELECT LIPR_COD, LIPR_UTIL, LIPR_MARGEN, LIPR_AUTO FROM LISTA_PRECIOS
    INTO :LISTA, :UTIL, :MARGEN, :AUTOM
    do
    BEGIN
    INSERT INTO PRECIOS_ARTICULO (ARTI_COD, LIPR_COD, PRAR_AUTO, PRAR_UTIL, PRAR_MARGEN, PRAR_FIJO, PRAR_CANTMIN)
        VALUES (NEW.ARTI_COD, :LISTA, :AUTOM, :UTIL, :MARGEN, 0, 0.1);
    END
  END
/* INSERTE LA CONTABILIZACION DEL GRUPO O TARIFA DE IVA SEGUN PARAMETRO*/
EXECUTE PROCEDURE LEE_CONFIGURACION('INVENTARIO', 'ARTICULOS', 'OPCION PARA CAMBIAR AUTOMATICAMENTE LAS CTAS CONTABLES DEL ARTICULO') RETURNING_VALUES (:GRUP_TIVA);
if (GRUP_TIVA = 'GRUPOS') then
  INSERT INTO CONTABIL_ARTICULO (ARTI_COD, COAR_CTAINV, COAR_CTAIVAC, COAR_CTAIVAV, COAR_CTAVNT, COAR_CTACOS, COAR_CTADEV, COAR_CTACOMP, COAR_CTARTFTE, COAR_CTARTFTEV, COAR_RTBASE, COAR_RTFTE)
    SELECT NEW.ARTI_COD, GRUP_CTAINVENT, GRUP_CTAIVACMP, GRUP_CTAIVAVNT, GRUP_CTAVENTAS, GRUP_CTACOSTOS, GRUP_CTADEV, GRUP_CTACOMP, GRUP_CTARTFTEC, GRUP_CTARTFTEV, GRUP_RTFTEB, GRUP_RTFTEP
    FROM GRUPO G
    WHERE GRUP_COD = NEW.GRUP_COD;
if (GRUP_TIVA = 'TARIFA IVA') then
  INSERT INTO CONTABIL_ARTICULO (ARTI_COD, COAR_CTAINV, COAR_CTAIVAC, COAR_CTAIVAV, COAR_CTAVNT, COAR_CTACOS, COAR_CTADEV, COAR_CTACOMP)
    SELECT NEW.ARTI_COD, TAIV_CTAINV, TAIV_CTAIVACMP, TAIV_CTAIVAVNT, TAIV_CTAVTA, TAIV_CTACOSTO, TAIV_CTADEV, TAIV_CTACOMP
    FROM TARIFA_IVA T
    WHERE TAIV_COD = NEW.taiv_cod;
INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
    VALUES (USER, 101, 1, 'I', NEW.arti_cod);
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER ARTICULO_AU FOR ARTICULO
ACTIVE AFTER UPDATE POSITION 0
as
declare variable GRUP_TIVA CHAR(10);
declare variable VTA CHAR(20);
declare variable IVAC CHAR(20);
declare variable IVAV CHAR(20);
declare variable INV CHAR(20);
declare variable COSTO CHAR(20);
declare variable DEV CHAR(20);
declare variable COMP CHAR(20);
declare variable RETC CHAR(20);
declare variable RETV CHAR(20);
declare variable RETB NUMERIC(18,2);
declare variable RETP NUMERIC(9,4);
begin
EXECUTE PROCEDURE LEE_CONFIGURACION('INVENTARIO', 'ARTICULOS', 'OPCION PARA CAMBIAR AUTOMATICAMENTE LAS CTAS CONTABLES DEL ARTICULO') RETURNING_VALUES (:GRUP_TIVA);
if (new.grup_cod <> old.grup_cod) then
 begin
  if (GRUP_TIVA = 'GRUPOS') then
   BEGIN
    SELECT GRUP_CTAINVENT, GRUP_CTAIVACMP, GRUP_CTAIVAVNT, GRUP_CTAVENTAS, GRUP_CTACOSTOS, GRUP_CTADEV, GRUP_CTACOMP, GRUP_CTARTFTEC, GRUP_CTARTFTEV, GRUP_RTFTEB, GRUP_RTFTEP
      FROM GRUPO G
      WHERE GRUP_COD = NEW.GRUP_COD
      into :INV, :IVAC, :IVAV, :VTA, :COSTO, :DEV, :COMP, :retc, :retv, :retb, :retp;
      update CONTABIL_ARTICULO
       SET COAR_CTAINV = :INV,
           COAR_CTAIVAC = :IVAC,
           COAR_CTAIVAV = :IVAV,
           COAR_CTAVNT = :VTA,
           COAR_CTACOS = :COSTO,
           COAR_CTADEV = :DEV,
           COAR_CTACOMP = :COMP,
           COAR_CTARTFTE = :retc,
           COAR_CTARTFTEV = :retv,
           COAR_RTFTE = :retp,
           COAR_RTBASE = :retb
        WHERE ARTI_COD = NEW.ARTI_COD;
   END
 end
if (new.taiv_cod <> old.taiv_cod) then
 begin
  if (GRUP_TIVA = 'TARIFA IVA') then
   BEGIN
    SELECT TAIV_CTAINV, TAIV_CTAIVACMP, TAIV_CTAIVAVNT, TAIV_CTAVTA, TAIV_CTACOSTO, TAIV_CTACOMP, TAIV_CTADEV
      FROM TARIFA_IVA T
      WHERE TAIV_COD = NEW.taiv_cod
      into :INV, :IVAC, :IVAV, :VTA, :COSTO, :COMP, :DEV;
      update CONTABIL_ARTICULO
       SET COAR_CTAINV = :INV,
           COAR_CTAIVAC = :IVAC,
           COAR_CTAIVAV = :IVAV,
           COAR_CTAVNT = :VTA,
           COAR_CTACOS = :COSTO,
           COAR_CTADEV = :DEV,
           COAR_CTACOMP = :COMP
        WHERE ARTI_COD = NEW.ARTI_COD;
   END
 end
INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
    VALUES (USER, 101, 1, 'U', NEW.arti_cod);
end
^

SET TERM ; ^


/* 05-14 guarde la autorizacion con que se hizo la factura */
SET TERM ^ ;

CREATE OR ALTER TRIGGER FACTURAS_BI FOR FACTURAS
ACTIVE BEFORE INSERT POSITION 0
AS
declare variable NUMERO VARCHAR(6);
declare variable AUTOM CHAR(1);
declare variable EXISTE CHAR(1);
DECLARE VARIABLE VALCUPO CHAR(10);
declare variable DISPONIBLE NUMERIC(18,2);
declare variable OK CHAR(1);
declare variable SITOT CHAR(2);
declare variable CODCOBR INTEGER;
declare variable CODVEND INTEGER;
declare variable contado char(1);
BEGIN
OK = 'S';
EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'ACCION A TOMAR SI EL CUPO DE CREDITO ES INSUFICIENTE') RETURNING_VALUES (:VALCUPO);
select max(auto_contado) from autorizaciones where pref_pre = new.pref_pre and tido_cod = 31 and auto_inicial <= new.fact_numero and auto_final >= new.fact_numero into :contado;
if (contado='N') then
  BEGIN
  IF (VALCUPO = 'PROHIBIR') THEN
  BEGIN
  OK = 'N';
  /* VERIFIQUE EL CUPO DE CREDITO */
  execute procedure cupo_disponible(new.TERC_NIT, NEW.fact_fecha, NEW.fact_sucursal) returning_values (:DISPONIBLE);
  if (DISPONIBLE >= NEW.FACT_TOTAL) then
    OK = 'S';
  END
  END
IF (OK = 'S') THEN
  begin
  /* calcule la comision */
  EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION', 'VENDEDORES', 'COMISIONES EN VENTA INCLUYENDO IMPUESTOS') returning_values (:SITOT);
  if ((NEW.fact_comiporc IS NULL) or (NEW.fact_comiporc = 0)) THEN
    BEGIN
    if (SITOT = 'SI') then
      SELECT MAX(COMI_PORC) FROM comisiones WHERE VEND_COD = NEW.vend_cod AND
        COMI_INICIAL <= NEW.fact_total AND COMI_FINAL >= NEW.fact_total
        INTO NEW.fact_comiporc;
    else
      SELECT MAX(COMI_PORC) FROM comisiones WHERE VEND_COD = NEW.vend_cod AND
        COMI_INICIAL <= (NEW.fact_total -NEW.fact_ivamonto) AND COMI_FINAL >= (NEW.fact_total -NEW.fact_ivamonto)
        INTO NEW.fact_comiporc;
    if (NEW.fact_comiporc IS NULL) then
        NEW.fact_comiporc = 0;
    END
  if (SITOT = 'SI') then
      NEW.fact_comimonto = NEW.fact_total * NEW.fact_comiporc / 100;
  ELSE
      NEW.fact_comimonto = (NEW.fact_total -NEW.fact_ivamonto) * NEW.fact_comiporc / 100;

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

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

select auto_numero from autorizaciones where auto_inicial <= new.fact_numero and auto_final >= new.fact_numero and auto_fecha <= new.fact_fecha and auto_vence >= new.fact_fecha and pref_pre = new.pref_pre into new.auto_numero;
END
^

SET TERM ; ^



/* 05-15 colores de los modulos en formato hue-sat */

UPDATE CONFIGURACION
SET CONF_VALOR = '12000',
    CONF_POSIBLES = '00000-35999',
    CONF_AYUDA = 'Indique el color en formato RGB que quiere de fondo en la ventana principal del módulo'
WHERE (CONF_MODULO = 'BANCOS') AND (CONF_CATEGORIA = 'GENERAL') AND (CONF_PROPIEDAD = 'COLOR VENTANA PRINCIPAL');


UPDATE CONFIGURACION
SET CONF_VALOR = '25000',
    CONF_POSIBLES = '00000-35999',
    CONF_AYUDA = 'Indique el color en formato RGB que quiere de fondo en la ventana principal del módulo'
WHERE (CONF_MODULO = 'CAJA') AND (CONF_CATEGORIA = 'GENERAL') AND (CONF_PROPIEDAD = 'COLOR VENTANA PRINCIPAL');


UPDATE CONFIGURACION
SET CONF_VALOR = '20040',
    CONF_POSIBLES = '00000-35999',
    CONF_AYUDA = 'Indique el color en formato RGB que quiere de fondo en la ventana principal del módulo'
WHERE (CONF_MODULO = 'CARTERA') AND (CONF_CATEGORIA = 'GENERAL') AND (CONF_PROPIEDAD = 'COLOR VENTANA PRINCIPAL');


UPDATE CONFIGURACION
SET CONF_VALOR = '08000',
    CONF_POSIBLES = '00000-35999',
    CONF_AYUDA = 'Indique el color en formato RGB que quiere de fondo en la ventana principal del módulo'
WHERE (CONF_MODULO = 'COMPRAS') AND (CONF_CATEGORIA = 'GENERAL') AND (CONF_PROPIEDAD = 'COLOR VENTANA PRINCIPAL');


UPDATE CONFIGURACION
SET CONF_VALOR = '04000',
    CONF_POSIBLES = '00000-35999',
    CONF_AYUDA = 'Indique el color en formato RGB que quiere de fondo en la ventana principal del módulo'
WHERE (CONF_MODULO = 'CONTABILIDAD') AND (CONF_CATEGORIA = 'GENERAL') AND (CONF_PROPIEDAD = 'COLOR VENTANA PRINCIPAL');


UPDATE CONFIGURACION
SET CONF_VALOR = '16000',
    CONF_POSIBLES = '00000-35999',
    CONF_AYUDA = 'Indique el color en formato RGB que quiere de fondo en la ventana principal del módulo'
WHERE (CONF_MODULO = 'CXPAGAR') AND (CONF_CATEGORIA = 'GENERAL') AND (CONF_PROPIEDAD = 'COLOR VENTANA PRINCIPAL');


UPDATE CONFIGURACION
SET CONF_VALOR = '00000',
    CONF_POSIBLES = '00000-35999',
    CONF_AYUDA = 'Indique el color en formato RGB que quiere de fondo en la ventana principal del módulo'
WHERE (CONF_MODULO = 'FACTURACION') AND (CONF_CATEGORIA = 'GENERAL') AND (CONF_PROPIEDAD = 'COLOR VENTANA PRINCIPAL');


UPDATE CONFIGURACION
SET CONF_VALOR = '22080',
    CONF_POSIBLES = '00000-35999',
    CONF_AYUDA = 'Indique el color en formato RGB que quiere de fondo en la ventana principal del módulo'
WHERE (CONF_MODULO = 'INVENTARIO') AND (CONF_CATEGORIA = 'GENERAL') AND (CONF_PROPIEDAD = 'COLOR VENTANA PRINCIPAL');

COMMIT WORK;

/* 05-16 descargar automaticamente pendientes */

INSERT INTO CONFIGURACION (CONF_MODULO, CONF_CATEGORIA, CONF_PROPIEDAD, CONF_VALOR, CONF_POSIBLES, CONF_AYUDA) VALUES ('FACTURACION', 'DOCUMENTOS', 'DEJAR PENDIENTES LOS ARTICULOS NO INCLUIDOS AL TRAER DOCUMENTOS RELACIONADOS', 'SI', 'SI,NO', 'SI: Permite entregas parciales y el programa controla qué articulos quedaron pendientes. NO: Se descarga el documento relacionado completo sin importar cuales artículos no se entregaron');
commit work;

SET TERM ^ ;

CREATE OR ALTER TRIGGER FACTURAS_DETALLE_AI FOR FACTURAS_DETALLE
ACTIVE AFTER INSERT POSITION 0
AS
declare variable fec date;
declare variable NOMCLI VARCHAR(60);
declare variable CONC VARCHAR(60);
declare variable Pref varchar(4);
declare variable Num varchar(6);
declare variable Nit varchar(20);
declare variable TIPO INTEGER;
declare variable INVFAC CHAR(2);
declare variable PEDAUTO CHAR(2);
declare variable CANTREL NUMERIC(18,4);
declare variable CONSO CHAR(2);
declare variable CONSOLIDA INTEGER;
BEGIN
select fact_fecha, pref_pre, fact_numero, terc_nit, fact_nomcliente, fact_consolida
    from facturas where fact_id = new.fact_id
    into :fec, :Pref, :Num, :Nit, :Nomcli, :Consolida;
if ((NEW.fact_id <> 0) and (new.fade_anulado = 'N')) then
    BEGIN
    EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION','FACTURAS','GENERAR PEDIDO AUTOMATICAMENTE CON LA FACTURA') RETURNING_VALUES (PEDAUTO);
    SELECT MAX(CEFA_TIPOORI) FROM consolide_faltantes WHERE CEFA_ID = :CONSOLIDA INTO :TIPO;
    if (Tipo IS NULL) then
        Tipo = 0;
    execute procedure lee_configuracion('FACTURACION', 'FACTURAS', 'AFECTAR INVENTARIO CON LA FACTURA') returning_values (:INVFAC);
    /* si se hizo con base en una remisi¢n no afecte inventario */
    if ((Tipo <> 32) and (INVFAC = 'SI')) then
        begin
        if (STRLEN(NOMCLI) > 42) then
            CONC = 'FV No.' || :pref || :num || '-' || SUBSTR(NOMCLI, 1, 42);
        ELSE
            CONC = 'FV No.' || :pref || :NUM || '-' || NOMCLI;
        INSERT INTO MOVIMIENTO_ARTICULO
            (ARTI_COD, MVAR_CONS, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM, TERC_NIT)
            VALUES(NEW.ARTI_COD, GEN_ID(ID_MOVARTI,1), NEW.BODE_COD, :FEC, 31, NEW.fact_id,
            :CONC, new.fade_factor * new.fade_cant, 0, 'N', new.fade_lote, :Pref, :Num, new.fade_item, :Nit);
        end
    if (PEDAUTO = 'SI') then
        BEGIN
        INSERT INTO PEDIDOS_DETALLE (PEDI_ID, PEDE_ITEM, ARTI_COD, PEDE_CANT, PEDE_UNIDAD, PEDE_DTOPORC, PEDE_DTOMONTO, PEDE_IVAPORC, PEDE_IVAMONTO, PEDE_CONSUMO, PEDE_FACTOR, PEDE_DESC, PEDE_OBS, PEDE_CODBAR, PEDE_TOTAL, PEDE_ANULADO, PEDE_TRANSMIT, LIPR_COD, PEDE_REFERENCIA, PEDE_PRUNIT, PEDE_FACTURAD, PEDE_REMISIONAD, PEDE_RESERVA, BODE_COD)
            VALUES (GEN_ID(id_pedido,0), NEW.FADE_ITEM, NEW.ARTI_COD, NEW.FADE_CANT, NEW.FADE_UNIDAD, NEW.FADE_DTOPORC, NEW.FADE_DTOMONTO, NEW.FADE_IVAPORC, NEW.FADE_IVAMONTO, NEW.FADE_CONSUMO, NEW.FADE_FACTOR, NEW.FADE_DESC, NEW.FADE_OBS, NEW.FADE_CODBAR, NEW.FADE_TOTAL, 'N', 'N', NEW.LIPR_COD, NEW.FADE_REFERENCIA, NEW.FADE_PRUNIT, NEW.FADE_CANT * NEW.FADE_FACTOR, 0, NEW.FADE_CANT * NEW.FADE_FACTOR, NEW.bode_cod);
        END
    ELSE
        BEGIN
        if (CONSOLIDA <> 0) then
            BEGIN
            EXECUTE procedure LEE_CONFIGURACION ('FACTURACION','DOCUMENTOS','DEJAR PENDIENTES LOS ARTICULOS NO INCLUIDOS AL TRAER DOCUMENTOS RELACIONADOS') returning_values (CONSO);
            if (CONSO = 'NO') then
                UPDATE consolidado_faltantes SET COFA_IDDES = NEW.fact_id, COFA_OK = 'S' WHERE COFA_ID = :consolida;
            ELSE
                BEGIN
                UPDATE consolidado_faltantes SET COFA_IDDES = NEW.fact_id, COFA_OK = 'S' WHERE COFA_ID = :consolida AND COFA_ITEM = NEW.FADE_ITEM AND ARTI_COD = NEW.arti_cod;
                /* BUSQUE EL CONSOLIDADO EN EL MISMO ITEM Y SI ES DIFERENTE ACTUALICELO */
                select COFA_CANT * COFA_FACTOR FROM consolidado_faltantes WHERE COFA_ID = :consolida AND COFA_ITEM = NEW.FADE_ITEM AND ARTI_COD = NEW.arti_cod INTO :CANTREL;
                if (NEW.FADE_CANT * NEW.FADE_FACTOR < CANTREL) then
                    UPDATE consolidado_faltantes SET COFA_IDDES = NEW.fact_id, COFA_CANT = NEW.FADE_CANT, COFA_FACTOR = NEW.FADE_FACTOR
                        WHERE COFA_ID = :consolida AND COFA_ITEM = NEW.FADE_ITEM AND ARTI_COD = NEW.arti_cod;
                END
            END
        END
    END
END
^

SET TERM ; ^


SET TERM ^ ;

CREATE OR ALTER TRIGGER FACTURAS_DETALLE_AD FOR FACTURAS_DETALLE
ACTIVE AFTER DELETE POSITION 0
AS
declare variable PEDAUTO CHAR(2);
declare variable Pref varchar(4);
declare variable Num varchar(6);
declare variable CONSO CHAR(2);
declare variable CONSOLIDA INTEGER;
declare variable consec INTEGER;
BEGIN
if ((OLD.fact_id <> 0) AND (OLD.fade_anulado = 'N')) then
    BEGIN
    DELETE FROM MOVIMIENTO_ARTICULO WHERE (mvar_tipodoc = 31) and (mvar_idref = OLD.fact_id) and (mvar_item = old.fade_item);

    EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION','FACTURAS','GENERAR PEDIDO AUTOMATICAMENTE CON LA FACTURA') RETURNING_VALUES (PEDAUTO);
    if (PEDAUTO = 'SI') then
        BEGIN
        SELECT pref_pre, fact_numero from facturas where fact_id = OLD.fact_id
            into :Pref, :Num;
        SELECT PEDI_ID FROM PEDIDOS WHERE PREF_PRE = :pref AND PEDI_NUMERO = :num into :consec;
        if (consec is not null) then
          DELETE FROM PEDIDOS_DETALLE WHERE PEDE_ITEM = OLD.FADE_ITEM AND PEDI_ID = :consec;
        END
    ELSE
        BEGIN
        /* DESHAGA LOS PENDIENTES */
        SELECT fact_consolida from facturas where fact_id = OLD.fact_id into :Consolida;
        if (CONSOLIDA <> 0) then
            BEGIN
            UPDATE consolidado_faltantes SET COFA_OK = 'N' WHERE COFA_ID = :consolida AND COFA_ITEM = OLD.FADE_ITEM AND ARTI_COD = OLD.arti_cod;
            EXECUTE procedure LEE_CONFIGURACION ('FACTURACION','DOCUMENTOS','DEJAR PENDIENTES LOS ARTICULOS NO INCLUIDOS AL TRAER DOCUMENTOS RELACIONADOS') returning_values (CONSO);
            if (CONSO = 'NO') then
                UPDATE consolidado_faltantes SET COFA_OK = 'N' WHERE COFA_ID = :consolida;
            END
        END
    END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER FACTURAS_DETALLE_AU FOR FACTURAS_DETALLE
ACTIVE AFTER UPDATE POSITION 0
as
declare variable fec date;
declare variable CONC VARCHAR(60);
declare variable NOMCLI varchar(60);
declare variable Pref varchar(4);
declare variable Num varchar(6);
declare variable Nit varchar(20);
declare variable factor numeric(18,4);
declare variable INVFAC CHAR(2);
declare variable TIPO INTEGER;
declare variable PEDAUTO CHAR(2);
declare variable CANTREL NUMERIC(18,4);
declare variable CONSO CHAR(2);
declare variable CONSOLIDA INTEGER;
declare variable consec INTEGER;
BEGIN
EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION','FACTURAS','GENERAR PEDIDO AUTOMATICAMENTE CON LA FACTURA') RETURNING_VALUES (PEDAUTO);
if ((OLD.fact_id <> 0) AND (OLD.fade_anulado = 'N')) then
    BEGIN
      if ((OLD.FADE_CANT * OLD.FADE_FACTOR <> NEW.fade_cant * NEW.fade_factor) or (OLD.fade_prunit <> NEW.fade_prunit)) then
        begin
        DELETE FROM MOVIMIENTO_ARTICULO WHERE (mvar_tipodoc = 31) and (mvar_idref = OLD.fact_id) and (mvar_item = old.fade_item);

        if (PEDAUTO = 'SI') then
            BEGIN
            SELECT pref_pre, fact_numero from facturas where fact_id = OLD.fact_id
                into :Pref, :Num;
            SELECT PEDI_ID FROM PEDIDOS WHERE PREF_PRE = :pref AND PEDI_NUMERO = :num into :consec;
            if (consec is not null) then
              DELETE FROM PEDIDOS_DETALLE WHERE PEDE_ITEM = OLD.FADE_ITEM AND PEDI_ID = :consec;
            END
        ELSE
            BEGIN
            /* DESHAGA LOS PENDIENTES */
            SELECT fact_consolida from facturas where fact_id = OLD.fact_id into :Consolida;
            if (CONSOLIDA <> 0) then
                BEGIN
                UPDATE consolidado_faltantes SET COFA_OK = 'N' WHERE COFA_ID = :consolida AND COFA_ITEM = OLD.FADE_ITEM AND ARTI_COD = OLD.arti_cod;
                EXECUTE procedure LEE_CONFIGURACION ('FACTURACION','DOCUMENTOS','DEJAR PENDIENTES LOS ARTICULOS NO INCLUIDOS AL TRAER DOCUMENTOS RELACIONADOS') returning_values (CONSO);
                if (CONSO = 'NO') then
                    UPDATE consolidado_faltantes SET COFA_OK = 'N' WHERE COFA_ID = :consolida;
                END
            END
        end
    END
if (OLD.fade_anulado = NEW.fade_anulado ) then
  begin
  if ((OLD.fact_id = 0) OR (OLD.FADE_CANT * OLD.FADE_FACTOR <> NEW.fade_cant * NEW.fade_factor) or (OLD.fade_prunit <> NEW.fade_prunit)) then
    BEGIN
    if ((NEW.fact_id <> 0) and (new.fade_anulado = 'N')) then
      BEGIN
      select fact_fecha, pref_pre, fact_numero, terc_nit, fact_nomcliente, fact_consolida
            from facturas where fact_id = new.fact_id
            into :fec, :Pref, :Num, :Nit, :Nomcli, :Consolida;
      SELECT MAX(CEFA_TIPOORI) FROM consolide_faltantes WHERE CEFA_ID = :CONSOLIDA INTO :TIPO;
      if (Tipo IS NULL) then
        Tipo = 0;
        execute procedure lee_configuracion('FACTURACION', 'FACTURAS', 'AFECTAR INVENTARIO CON LA FACTURA') returning_values (:INVFAC);
       /* si se hizo con base en una remisi¢n no afecte inventario */
      if ((Tipo <> 32) and (INVFAC = 'SI')) then
        begin
        if (STRLEN(NOMCLI) > 29) then
            CONC = 'FACTURA DE VENTA No.' || PREF || NUM || '-' || SUBSTR(NOMCLI,1,29);
        ELSE
            CONC = 'FACTURA DE VENTA No.' || PREF || NUM || '-' || NOMCLI;
        DELETE FROM MOVIMIENTO_ARTICULO WHERE (mvar_tipodoc = 31) and (mvar_idref = OLD.fact_id) and (mvar_item = old.fade_item);
        execute procedure factor_unidad_cant(new.arti_cod, new.fade_unidad) returning_values(factor);
        INSERT INTO MOVIMIENTO_ARTICULO
            (ARTI_COD, MVAR_CONS, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM, TERC_NIT)
            VALUES(NEW.ARTI_COD, GEN_ID(ID_MOVARTI,1), NEW.BODE_COD, :FEC, 31, NEW.fact_id,
            :CONC, :factor * new.fade_cant, 0, 'N', new.fade_lote, :Pref, :Num, new.fade_item, :Nit);
        end
        if (PEDAUTO = 'SI') then
          BEGIN
          INSERT INTO PEDIDOS_DETALLE (PEDI_ID, PEDE_ITEM, ARTI_COD, PEDE_CANT, PEDE_UNIDAD, PEDE_DTOPORC, PEDE_DTOMONTO, PEDE_IVAPORC, PEDE_IVAMONTO, PEDE_CONSUMO, PEDE_FACTOR, PEDE_DESC, PEDE_OBS, PEDE_CODBAR, PEDE_TOTAL, PEDE_ANULADO, PEDE_TRANSMIT, LIPR_COD, PEDE_REFERENCIA, PEDE_PRUNIT, PEDE_FACTURAD, PEDE_REMISIONAD, PEDE_RESERVA, BODE_COD)
            VALUES (0, NEW.FADE_ITEM, NEW.ARTI_COD, NEW.FADE_CANT, NEW.FADE_UNIDAD, NEW.FADE_DTOPORC, NEW.FADE_DTOMONTO, NEW.FADE_IVAPORC, NEW.FADE_IVAMONTO, NEW.FADE_CONSUMO, NEW.FADE_FACTOR, NEW.FADE_DESC, NEW.FADE_OBS, NEW.FADE_CODBAR, NEW.FADE_TOTAL, 'N', 'N', NEW.LIPR_COD, NEW.FADE_REFERENCIA, NEW.FADE_PRUNIT, NEW.FADE_CANT * NEW.FADE_FACTOR, 0, NEW.FADE_CANT * NEW.FADE_FACTOR, NEW.bode_cod);
          END
        ELSE
          BEGIN
          if (CONSOLIDA <> 0) then
            BEGIN
            UPDATE consolidado_faltantes SET COFA_OK = 'S' WHERE COFA_ID = :consolida AND COFA_ITEM = NEW.FADE_ITEM AND ARTI_COD = NEW.arti_cod;
            EXECUTE procedure LEE_CONFIGURACION ('FACTURACION','DOCUMENTOS','DEJAR PENDIENTES LOS ARTICULOS NO INCLUIDOS AL TRAER DOCUMENTOS RELACIONADOS') returning_values (CONSO);
            if (CONSO = 'NO') then
                UPDATE consolidado_faltantes SET COFA_OK = 'S' WHERE COFA_ID = :consolida;
            ELSE
                BEGIN
                /* BUSQUE EL CONSOLIDADO EN EL MISMO ITEM Y SI ES DIFERENTE ACTUALICELO */
                select COFA_CANT * COFA_FACTOR FROM consolidado_faltantes WHERE COFA_ID = :consolida AND COFA_ITEM = NEW.FADE_ITEM AND ARTI_COD = NEW.arti_cod INTO :CANTREL;
                if (NEW.FADE_CANT * NEW.FADE_FACTOR < CANTREL) then
                    UPDATE consolidado_faltantes SET COFA_CANT = NEW.FADE_CANT, COFA_FACTOR = NEW.FADE_FACTOR
                        WHERE COFA_ID = :consolida AND COFA_ITEM = NEW.FADE_ITEM AND ARTI_COD = NEW.arti_cod;
                END
            END
          END
        END
    end
  end
else
  if (NEW.fade_anulado = 'S') then
        BEGIN
        DELETE FROM MOVIMIENTO_ARTICULO WHERE (mvar_tipodoc = 31) and (mvar_idref = new.fact_id) and (mvar_item = old.fade_item);
        if (PEDAUTO = 'SI') then
            BEGIN
            SELECT pref_pre, fact_numero from facturas where fact_id = OLD.fact_id
                into :Pref, :Num;
            SELECT PEDI_ID FROM PEDIDOS WHERE PREF_PRE = :pref AND PEDI_NUMERO = :num into :consec;
            if (consec is not null) then
              UPDATE PEDIDOS_DETALLE SET PEDE_ANULADO = 'S' WHERE PEDE_ITEM = OLD.FADE_ITEM AND PEDI_ID = :consec;
            END
        ELSE
            BEGIN
            /* DESHAGA LOS PENDIENTES */
            SELECT fact_consolida from facturas where fact_id = OLD.fact_id into :Consolida;
            if (CONSOLIDA <> 0) then
                BEGIN
                UPDATE consolidado_faltantes SET COFA_OK = 'N' WHERE COFA_ID = :consolida AND COFA_ITEM = OLD.FADE_ITEM AND ARTI_COD = OLD.arti_cod;
                EXECUTE procedure LEE_CONFIGURACION ('FACTURACION','DOCUMENTOS','DEJAR PENDIENTES LOS ARTICULOS NO INCLUIDOS AL TRAER DOCUMENTOS RELACIONADOS') returning_values (CONSO);
                if (CONSO = 'NO') then
                    UPDATE consolidado_faltantes SET COFA_OK = 'N' WHERE COFA_ID = :consolida;
                END
            END
        END
    ELSE
        BEGIN
        if (NEW.fact_id <> 0) then
          BEGIN
          select fact_fecha, pref_pre, fact_numero, terc_nit, fact_nomcliente, fact_consolida
            from facturas where fact_id = new.fact_id
            into :fec, :Pref, :Num, :Nit, :Nomcli, :Consolida;
          SELECT MAX(CEFA_TIPOORI) FROM consolide_faltantes WHERE CEFA_ID = :CONSOLIDA INTO :TIPO;
          if (Tipo IS NULL) then
               Tipo = 0;
          execute procedure lee_configuracion('FACTURACION', 'FACTURAS', 'AFECTAR INVENTARIO CON LA FACTURA') returning_values (:INVFAC);
          /* si se hizo con base en una remisi¢n no afecte inventario */
          if ((Tipo <> 32) and (INVFAC = 'SI')) then
            begin
            if (STRLEN(NOMCLI) > 29) then
               CONC = 'FACTURA DE VENTA No.' || PREF || NUM || '-' || SUBSTR(NOMCLI,1,29);
            ELSE
               CONC = 'FACTURA DE VENTA No.' || PREF || NUM || '-' || NOMCLI;
            execute procedure factor_unidad_cant(new.arti_cod, new.fade_unidad) returning_values(factor);
            INSERT INTO MOVIMIENTO_ARTICULO
                   (ARTI_COD, MVAR_CONS, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM, TERC_NIT)
               VALUES(NEW.ARTI_COD, GEN_ID(ID_MOVARTI,1), NEW.BODE_COD, :FEC, 31, NEW.fact_id,
                 :CONC, :factor * new.fade_cant, 0, 'N', new.fade_lote, :Pref, :Num, new.fade_item, :Nit);
            end
          if ((PEDAUTO = 'SI') and (old.fact_id = 0)) then
             BEGIN
              INSERT INTO PEDIDOS_DETALLE (PEDI_ID, PEDE_ITEM, ARTI_COD, PEDE_CANT, PEDE_UNIDAD, PEDE_DTOPORC, PEDE_DTOMONTO, PEDE_IVAPORC, PEDE_IVAMONTO, PEDE_CONSUMO, PEDE_FACTOR, PEDE_DESC, PEDE_OBS, PEDE_CODBAR, PEDE_TOTAL, PEDE_ANULADO, PEDE_TRANSMIT, LIPR_COD, PEDE_REFERENCIA, PEDE_PRUNIT, PEDE_FACTURAD, PEDE_REMISIONAD, PEDE_RESERVA, BODE_COD)
                VALUES (0, NEW.FADE_ITEM, NEW.ARTI_COD, NEW.FADE_CANT, NEW.FADE_UNIDAD, NEW.FADE_DTOPORC, NEW.FADE_DTOMONTO, NEW.FADE_IVAPORC, NEW.FADE_IVAMONTO, NEW.FADE_CONSUMO, NEW.FADE_FACTOR, NEW.FADE_DESC, NEW.FADE_OBS, NEW.FADE_CODBAR, NEW.FADE_TOTAL, 'N', 'N', NEW.LIPR_COD, NEW.FADE_REFERENCIA, NEW.FADE_PRUNIT, NEW.FADE_CANT * NEW.FADE_FACTOR, 0, NEW.FADE_CANT * NEW.FADE_FACTOR, NEW.bode_cod);
             END
          ELSE
             BEGIN
             if (CONSOLIDA <> 0) then
              BEGIN
              UPDATE consolidado_faltantes SET COFA_OK = 'S' WHERE COFA_ID = :consolida AND COFA_ITEM = NEW.FADE_ITEM AND ARTI_COD = NEW.arti_cod;
              EXECUTE procedure LEE_CONFIGURACION ('FACTURACION','DOCUMENTOS','DEJAR PENDIENTES LOS ARTICULOS NO INCLUIDOS AL TRAER DOCUMENTOS RELACIONADOS') returning_values (CONSO);
              if (CONSO = 'NO') then
                 UPDATE consolidado_faltantes SET COFA_OK = 'S' WHERE COFA_ID = :consolida;
              ELSE
                BEGIN
                /* BUSQUE EL CONSOLIDADO EN EL MISMO ITEM Y SI ES DIFERENTE ACTUALICELO */
                select COFA_CANT * COFA_FACTOR FROM consolidado_faltantes WHERE COFA_ID = :consolida AND COFA_ITEM = NEW.FADE_ITEM AND ARTI_COD = NEW.arti_cod INTO :CANTREL;
                if (NEW.FADE_CANT * NEW.FADE_FACTOR < CANTREL) then
                    UPDATE consolidado_faltantes SET COFA_CANT = NEW.FADE_CANT, COFA_FACTOR = NEW.FADE_FACTOR
                        WHERE COFA_ID = :consolida AND COFA_ITEM = NEW.FADE_ITEM AND ARTI_COD = NEW.arti_cod;
                END
              END
             END
          END
        end
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER REMISIONES_VENTA_DETALLE_AI FOR REMISIONES_VENTA_DETALLE
ACTIVE AFTER INSERT POSITION 0
AS
declare variable fec date;
declare variable CONC VARCHAR(60);
declare variable NOMCLI VARCHAR(60);
declare variable factor numeric(18,4);
declare variable Pref varchar(4);
declare variable Num varchar(6);
declare variable Nit varchar(20);
declare variable Tipo integer;
declare variable idfact integer;
declare variable numrows integer;
declare variable CANTREL NUMERIC(18,4);
declare variable CONSO CHAR(2);
declare variable CONSOLIDA INTEGER;
declare variable PEDAUTO CHAR(2);
declare variable VALPEDIDO CHAR(2);
declare variable IDPED INTEGER;
BEGIN
  if ((NEW.revt_id <> 0) and (new.rvde_anulado = 'N')) then
    BEGIN
    select revt_fecha, pref_pre, revt_numero, terc_nit, revt_nomterc, REVT_CONSOLIDA, LIPR_COD
        from remisiones_venta where revt_id = new.revt_id
        into :fec, :Pref, :Num, :Nit, :Nomcli, :consolida, :idped;
    if (strlen(nomcli) > 27) then
        CONC = 'REMISION A CLIENTE No.' || PREF || NUM || '-' ||SUBSTR(NOMCLI, 1, 27);
    else
        CONC = 'REMISION A CLIENTE No.' || PREF || NUM || '-' ||NOMCLI;

    SELECT MAX(CEFA_TIPOORI), MAX(CEFA_IDORI) FROM consolide_faltantes WHERE CEFA_ID = :CONSOLIDA INTO :TIPO, :IDFACT;
    if (Tipo is null) then
        Tipo = 0;
    if (Idfact is null) then
        Idfact = 0;
    /* si se hizo con base en una factura que afecto el inventario no afecte inventario */
    numrows = 0;
    if (Tipo = 31) Then
        begin
        select count(*) from movimiento_articulo where mvar_tipodoc = 31 and mvar_idref = :idfact into :numrows;
        if (numrows is null) then
          numrows = 0;
        end
    if (numrows = 0) then
        begin
        /* Registre el nuevo */
        execute procedure factor_unidad_cant(new.arti_cod, new.rvde_unidad) returning_values(factor);
        INSERT INTO MOVIMIENTO_ARTICULO
            (ARTI_COD, MVAR_CONS, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM, TERC_NIT)
            VALUES(NEW.ARTI_COD, GEN_ID(ID_MOVARTI,1), NEW.BODE_COD, :FEC, 32, NEW.revt_id,
            :CONC, :factor * new.rvde_cant, 0, 'N', new.rvde_lote, :Pref, :Num, new.rvde_item, :Nit);
        end

    /* ACTUALICE EL PENDIENTE  */
    if ((NEW.REVT_ID <> 0) AND (CONSOLIDA <> 0)) then
        begin
        EXECUTE procedure LEE_CONFIGURACION ('FACTURACION','DOCUMENTOS','DEJAR PENDIENTES LOS ARTICULOS NO INCLUIDOS AL TRAER DOCUMENTOS RELACIONADOS') returning_values (CONSO);
        /* IGNORELA SI SE VALIDAN CODIGOS DEL PEDIDO */
        SELECT MIN(CEFA_TIPOORI) FROM consolide_faltantes WHERE CEFA_ID = :CONSOLIDA INTO :NUMROWS;
        if (NUMROWS = 34) then
            BEGIN
            EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION', 'REMISIONES', 'VERIFICAR CODIGOS DEL PEDIDO') returning_values (VALPEDIDO);
            if (VALPEDIDO = 'SI') then
                CONSO = 'SI';
            END
        SELECT COUNT(CEFA_ITEM) FROM consolide_faltantes WHERE CEFA_ID = :CONSOLIDA INTO :NUMROWS;
        if (CONSO = 'NO') then
            UPDATE consolidado_faltantes SET COFA_OK = 'S' WHERE COFA_ID = :consolida;
        ELSE
            BEGIN
            UPDATE consolidado_faltantes SET COFA_OK = 'S' WHERE COFA_ID = :consolida AND COFA_ITEM = NEW.RVDE_ITEM AND ARTI_COD = NEW.arti_cod;
            /* BUSQUE EL CONSOLIDADO EN EL MISMO ITEM Y SI ES DIFERENTE ACTUALICELO */
            select COFA_CANT * COFA_FACTOR FROM consolidado_faltantes WHERE COFA_ID = :consolida AND COFA_ITEM = NEW.RVDE_ITEM AND ARTI_COD = NEW.arti_cod INTO :CANTREL;
            if (NEW.RVDE_CANT * NEW.RVDE_FACTOR < CANTREL) then
                UPDATE consolidado_faltantes SET COFA_CANT = NEW.RVDE_CANT, COFA_FACTOR = NEW.RVDE_FACTOR
                    WHERE COFA_ID = :consolida AND COFA_ITEM = NEW.RVDE_ITEM AND ARTI_COD = NEW.arti_cod;
            END

        /* SI HAY PEDIDO AUTOMATICO ACTUALICE EL FALTANTE DEL PEDIDO */
        EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION', 'FACTURAS', 'GENERAR PEDIDO AUTOMATICAMENTE CON LA FACTURA') returning_values (pedauto);
        if (PEDAUTO = 'SI') then
            BEGIN
            if (CONSO = 'NO') then
                UPDATE consolidado_faltantes SET COFA_OK = 'S' WHERE COFA_ID = :idped;
            ELSE
                BEGIN
                UPDATE consolidado_faltantes SET COFA_OK = 'S' WHERE COFA_ID = :IDPED AND COFA_ITEM = NEW.RVDE_ITEM AND ARTI_COD = NEW.arti_cod;
                /* BUSQUE EL CONSOLIDADO EN EL MISMO ITEM Y SI ES DIFERENTE ACTUALICELO */
                select COFA_CANT * COFA_FACTOR FROM consolidado_faltantes WHERE COFA_ID = :idped AND COFA_ITEM = NEW.RVDE_ITEM AND ARTI_COD = NEW.arti_cod INTO :CANTREL;
                if (NEW.RVDE_CANT * NEW.RVDE_FACTOR < CANTREL) then
                    UPDATE consolidado_faltantes SET COFA_CANT = NEW.RVDE_CANT, COFA_FACTOR = NEW.RVDE_FACTOR
                        WHERE COFA_ID = :idped AND COFA_ITEM = NEW.RVDE_ITEM AND ARTI_COD = NEW.arti_cod;
                END
            END
        end
    END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER REMISIONES_VENTA_DETALLE_AD FOR REMISIONES_VENTA_DETALLE
ACTIVE AFTER DELETE POSITION 0
AS
declare variable CONSO CHAR(2);
declare variable CONSOLIDA INTEGER;
declare variable PEDAUTO CHAR(2);
declare variable IDPED INTEGER;
BEGIN
if ((OLD.revt_id <> 0) AND (OLD.rvde_anulado = 'N')) then
    begin
    delete from movimiento_articulo where (mvar_tipodoc = 32) and (mvar_idref = old.revt_id) and (mvar_item = old.rvde_item);
    select REVT_CONSOLIDA, lipr_cod from remisiones_venta where revt_id = old.revt_id into :CONSOLIDA, :idped;
    if (CONSOLIDA <> 0) then
        begin
        EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION', 'FACTURAS', 'GENERAR PEDIDO AUTOMATICAMENTE CON LA FACTURA') returning_values (pedauto);
        EXECUTE procedure LEE_CONFIGURACION ('FACTURACION','DOCUMENTOS','DEJAR PENDIENTES LOS ARTICULOS NO INCLUIDOS AL TRAER DOCUMENTOS RELACIONADOS') returning_values (CONSO);
        if (CONSO = 'SI') then
            begin
            UPDATE consolidado_faltantes SET COFA_OK = 'N' WHERE COFA_ID = :consolida AND COFA_ITEM = old.RVDE_ITEM AND ARTI_COD = old.arti_cod;
            if (PEDAUTO = 'SI') then
                UPDATE consolidado_faltantes SET COFA_OK = 'N' WHERE COFA_ID = :idped AND COFA_ITEM = old.RVDE_ITEM AND ARTI_COD = old.arti_cod;
            end
        else
            begin
            UPDATE consolidado_faltantes SET COFA_OK = 'N' WHERE COFA_ID = :consolida;
            if (PEDAUTO = 'SI') then
                UPDATE consolidado_faltantes SET COFA_OK = 'N' WHERE COFA_ID = :idped;
            end
        END
    end
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER REMISIONES_VENTA_DETALLE_AU FOR REMISIONES_VENTA_DETALLE
ACTIVE AFTER UPDATE POSITION 0
AS
declare variable fec date;
declare variable CONC VARCHAR(60);
declare variable NOMCLI varchar(60);
declare variable Pref varchar(4);
declare variable Num varchar(6);
declare variable Nit varchar(20);
declare variable factor numeric(18,4);
declare variable Tipo integer;
declare variable idfact integer;
declare variable numrows integer;
declare variable CANTREL NUMERIC(18,4);
declare variable CONSO CHAR(2);
declare variable CONSOLIDA INTEGER;
declare variable PEDAUTO CHAR(2);
declare variable IDPED INTEGER;
BEGIN
/* Anule el anterior */
if ((OLD.revt_id <> 0) AND (OLD.rvde_anulado = 'N')) then
    begin
    delete from movimiento_articulo where (mvar_tipodoc = 32) and (mvar_idref = old.revt_id) and (mvar_item = old.rvde_item);
    select REVT_CONSOLIDA, LIPR_COD from remisiones_venta where revt_id = old.revt_id into :CONSOLIDA, :IDPED;
    if (CONSOLIDA <> 0) then
        begin
        EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION', 'FACTURAS', 'GENERAR PEDIDO AUTOMATICAMENTE CON LA FACTURA') returning_values (pedauto);
        EXECUTE procedure LEE_CONFIGURACION ('FACTURACION','DOCUMENTOS','DEJAR PENDIENTES LOS ARTICULOS NO INCLUIDOS AL TRAER DOCUMENTOS RELACIONADOS') returning_values (CONSO);
        if (CONSO = 'SI') then
            begin
            UPDATE consolidado_faltantes SET COFA_OK = 'N' WHERE COFA_ID = :consolida AND COFA_ITEM = old.RVDE_ITEM AND ARTI_COD = old.arti_cod;
            if (PEDAUTO = 'SI') then
                UPDATE consolidado_faltantes SET COFA_OK = 'N' WHERE COFA_ID = :idped AND COFA_ITEM = old.RVDE_ITEM AND ARTI_COD = old.arti_cod;
            end
        else
            BEGIN
            UPDATE consolidado_faltantes SET COFA_OK = 'N' WHERE COFA_ID = :consolida;
            if (PEDAUTO = 'SI') then
                UPDATE consolidado_faltantes SET COFA_OK = 'N' WHERE COFA_ID = :idped;
            END
        END
    end
/* Registre el nuevo */
if ((new.revt_id <> 0) AND (new.rvde_anulado = 'N')) then
    begin
    select revt_fecha, pref_pre, revt_numero, terc_nit, revt_nomterc, REVT_CONSOLIDA, lipr_cod
        from remisiones_venta where revt_id = new.revt_id
        into :fec, :Pref, :Num, :Nit, :Nomcli, :CONSOLIDA, :idped;
    CONC = 'REMISION A CLIENTE No.' || PREF || NUM;
    NOMCLI = SUBSTR(NOMCLI, 1, 24);
    conc = conc || '-' || NOMCLI;

    SELECT MAX(CEFA_TIPOORI), MAX(CEFA_IDORI) FROM consolide_faltantes WHERE CEFA_ID = :CONSOLIDA INTO :TIPO, :IDFACT;
    if (Tipo is null) then
        Tipo = 0;
    if (Idfact is null) then
        Idfact = 0;
    /* si se hizo con base en una factura que afecto el inventario no afecte inventario */
    numrows = 0;
    if (Tipo = 31) Then
        begin
        select count(*) from movimiento_articulo where mvar_tipodoc = 31 and mvar_idref = :idfact into :numrows;
        if (numrows is null) then
            numrows = 0;
        end
    if (numrows = 0) then
        begin
        /* Registre el nuevo */
        execute procedure factor_unidad_cant(new.arti_cod, new.rvde_unidad) returning_values(factor);
        INSERT INTO MOVIMIENTO_ARTICULO
            (ARTI_COD, MVAR_CONS, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM, TERC_NIT)
            VALUES(NEW.ARTI_COD, GEN_ID(ID_MOVARTI,1), NEW.BODE_COD, :FEC, 32, NEW.revt_id,
            :CONC, :factor * new.rvde_cant, 0, 'N', new.rvde_lote, :Pref, :Num, new.rvde_item, :Nit);
        end
    /* ACTUALICE EL PENDIENTE  */
    if (CONSOLIDA <> 0) then
        begin
        EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION', 'FACTURAS', 'GENERAR PEDIDO AUTOMATICAMENTE CON LA FACTURA') returning_values (pedauto);
        EXECUTE procedure LEE_CONFIGURACION ('FACTURACION','DOCUMENTOS','DEJAR PENDIENTES LOS ARTICULOS NO INCLUIDOS AL TRAER DOCUMENTOS RELACIONADOS') returning_values (CONSO);
        if (CONSO = 'SI') then
            BEGIN
            /* BUSQUE EL CONSOLIDADO EN EL MISMO ITEM Y SI ES DIFERENTE ACTUALICELO */
            select COFA_CANT * COFA_FACTOR FROM consolidado_faltantes WHERE COFA_ID = :consolida AND COFA_ITEM = NEW.RVDE_ITEM AND ARTI_COD = NEW.arti_cod INTO :CANTREL;
            if (NEW.RVDE_CANT * NEW.RVDE_FACTOR < CANTREL) then
                begin
                UPDATE consolidado_faltantes SET COFA_IDDES = NEW.revt_id, COFA_CANT = NEW.RVDE_CANT, COFA_FACTOR = NEW.RVDE_FACTOR, COFA_OK = 'S' 
                    WHERE COFA_ID = :consolida AND COFA_ITEM = NEW.RVDE_ITEM AND ARTI_COD = NEW.arti_cod;
                if (PEDAUTO = 'SI') then
                    UPDATE consolidado_faltantes SET COFA_IDDES = NEW.revt_id, COFA_CANT = NEW.RVDE_CANT, COFA_FACTOR = NEW.RVDE_FACTOR, COFA_OK = 'S' 
                        WHERE COFA_ID = :idped AND COFA_ITEM = NEW.RVDE_ITEM AND ARTI_COD = NEW.arti_cod;
                end
            else
                begin
                UPDATE consolidado_faltantes SET COFA_IDDES = NEW.revt_id, COFA_OK = 'S' WHERE COFA_ID = :consolida AND COFA_ITEM = NEW.RVDE_ITEM AND ARTI_COD = NEW.arti_cod;
                if (PEDAUTO = 'SI') then
                    UPDATE consolidado_faltantes SET COFA_IDDES = NEW.revt_id, COFA_OK = 'S' WHERE COFA_ID = :idped AND COFA_ITEM = NEW.RVDE_ITEM AND ARTI_COD = NEW.arti_cod;
                end
            END
        else
            begin
            UPDATE consolidado_faltantes SET COFA_IDDES = NEW.revt_id, COFA_OK = 'S' WHERE COFA_ID = :consolida;
            if (PEDAUTO = 'SI') then
                UPDATE consolidado_faltantes SET COFA_IDDES = NEW.revt_id, COFA_OK = 'S' WHERE COFA_ID = :idped;
            end
        END
    end
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER PEDIDOS_DETALLE_AI FOR PEDIDOS_DETALLE
ACTIVE AFTER INSERT POSITION 0
as
declare variable CANTREL NUMERIC(18,2);
declare variable CONSO CHAR(2);
declare variable CONSOLIDA INTEGER;
begin
if ((NEW.pedi_id <> 0) AND (NEW.pede_anulado = 'N')) then
    BEGIN
    SELECT PEDI_CONSOLIDA FROM PEDIDOS WHERE PEDI_ID = NEW.PEDI_ID INTO :CONSOLIDA;
    if (CONSOLIDA <> 0) then    
        begin
        UPDATE consolidado_faltantes SET COFA_OK = 'S' WHERE COFA_ID = :consolida AND COFA_ITEM = NEW.PEDE_ITEM AND ARTI_COD = NEW.arti_cod;
        EXECUTE procedure LEE_CONFIGURACION ('FACTURACION','DOCUMENTOS','DEJAR PENDIENTES LOS ARTICULOS NO INCLUIDOS AL TRAER DOCUMENTOS RELACIONADOS') returning_values (CONSO);
        if (CONSO = 'NO') then
            UPDATE consolidado_faltantes SET COFA_IDDES = NEW.pedi_id, COFA_OK = 'S' WHERE COFA_ID = :consolida;
        else
            BEGIN
            /* BUSQUE EL CONSOLIDADO EN EL MISMO ITEM Y SI ES DIFERENTE ACTUALICELO */
            select COFA_CANT FROM consolidado_faltantes WHERE COFA_ID = :consolida AND COFA_ITEM = NEW.PEDE_ITEM AND ARTI_COD = NEW.arti_cod INTO :CANTREL;
            if (NEW.PEDE_CANT * NEW.PEDE_FACTOR < CANTREL) then
                UPDATE consolidado_faltantes SET COFA_IDDES = NEW.pedi_id, COFA_CANT = NEW.PEDE_CANT * NEW.PEDE_FACTOR
                    WHERE COFA_ID = :consolida AND COFA_ITEM = NEW.PEDE_ITEM AND ARTI_COD = NEW.arti_cod;
            END
        end
    END
end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER PEDIDOS_DETALLE_AU FOR PEDIDOS_DETALLE
ACTIVE AFTER UPDATE POSITION 0
as
declare variable CANTREL NUMERIC(18,2);
declare variable CONSO CHAR(2);
declare variable CONSOLIDA INTEGER;
begin
if ((OLD.pedi_id <> 0) AND (OLD.pede_anulado = 'N')) then
    BEGIN
    SELECT PEDI_CONSOLIDA FROM PEDIDOS WHERE PEDI_ID = OLD.PEDI_ID INTO :CONSOLIDA;
    if (CONSOLIDA <> 0) then
        BEGIN
        EXECUTE procedure LEE_CONFIGURACION ('FACTURACION','DOCUMENTOS','DEJAR PENDIENTES LOS ARTICULOS NO INCLUIDOS AL TRAER DOCUMENTOS RELACIONADOS') returning_values (CONSO);
        if (CONSO = 'SI') then
            UPDATE consolidado_faltantes SET COFA_IDDES = NEW.pedi_id, COFA_OK = 'N' WHERE COFA_ID = :consolida AND COFA_ITEM = OLD.PEDE_ITEM AND ARTI_COD = OLD.arti_cod;
        ELSE
            UPDATE consolidado_faltantes SET COFA_IDDES = NEW.pedi_id, COFA_OK = 'N' WHERE COFA_ID = :consolida;
        END
    END

if ((NEW.pedi_id <> 0) AND (NEW.pede_anulado = 'N')) then
    BEGIN
    SELECT PEDI_CONSOLIDA FROM PEDIDOS WHERE PEDI_ID = NEW.PEDI_ID INTO :CONSOLIDA;
    if (CONSOLIDA <> 0) then
        begin
        EXECUTE procedure LEE_CONFIGURACION ('FACTURACION','DOCUMENTOS','DEJAR PENDIENTES LOS ARTICULOS NO INCLUIDOS AL TRAER DOCUMENTOS RELACIONADOS') returning_values (CONSO);
        if (CONSO = 'NO') then
            UPDATE consolidado_faltantes SET COFA_IDDES = NEW.pedi_id, COFA_OK = 'S' WHERE COFA_ID = :consolida;
        else
            BEGIN
            UPDATE consolidado_faltantes SET COFA_OK = 'S' WHERE COFA_ID = :consolida AND COFA_ITEM = NEW.PEDE_ITEM AND ARTI_COD = NEW.arti_cod;
            /* BUSQUE EL CONSOLIDADO EN EL MISMO ITEM Y SI ES DIFERENTE ACTUALICELO */
            select COFA_CANT FROM consolidado_faltantes WHERE COFA_ID = :consolida AND COFA_ITEM = NEW.PEDE_ITEM AND ARTI_COD = NEW.arti_cod INTO :CANTREL;
            if (NEW.PEDE_CANT * NEW.PEDE_FACTOR < CANTREL) then
                UPDATE consolidado_faltantes SET COFA_IDDES = NEW.pedi_id, COFA_CANT = NEW.PEDE_CANT * NEW.PEDE_FACTOR
                    WHERE COFA_ID = :consolida AND COFA_ITEM = NEW.PEDE_ITEM AND ARTI_COD = NEW.arti_cod;
            END
        end
    END
end
^

SET TERM ; ^

SET TERM ^ ;

create trigger PEDIDOS_DETALLE_AD for PEDIDOS_DETALLE
active AFTER DELETE position 0
as
declare variable CONSO CHAR(2);
declare variable CONSOLIDA INTEGER;
BEGIN
if ((OLD.pedi_id <> 0) AND (OLD.pede_anulado = 'N')) then
    begin
    select PEDI_CONSOLIDA from PEDIDOS where PEDI_id = old.pedi_id into :CONSOLIDA;
    if (CONSOLIDA <> 0) then
        begin
        EXECUTE procedure LEE_CONFIGURACION ('FACTURACION','DOCUMENTOS','DEJAR PENDIENTES LOS ARTICULOS NO INCLUIDOS AL TRAER DOCUMENTOS RELACIONADOS') returning_values (CONSO);
        if (CONSO = 'SI') then
            UPDATE consolidado_faltantes SET COFA_OK = 'N' WHERE COFA_ID = :consolida AND COFA_ITEM = old.pede_item AND ARTI_COD = old.arti_cod;
        else
            UPDATE consolidado_faltantes SET COFA_OK = 'N' WHERE COFA_ID = :consolida;
        END
    end
end
^

SET TERM ; ^

INSERT INTO CONFIGURACION (CONF_MODULO, CONF_CATEGORIA, CONF_PROPIEDAD, CONF_VALOR, CONF_POSIBLES, CONF_AYUDA) VALUES ('COMPRAS', 'DOCUMENTOS', 'DEJAR PENDIENTES LOS ARTICULOS NO INCLUIDOS AL TRAER DOCUMENTOS RELACIONADOS', 'SI', 'SI,NO', 'SI: Permite entregas parciales y el programa controla qué articulos quedaron pendientes. NO: Se descarga el documento relacionado completo sin importar cuales artículos no se entregaron');
commit work;

SET TERM ^ ;

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

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

    /* ACTUALICE EL PENDIENTE  */
    if (CONSOLIDA <> 0) then
        BEGIN
        EXECUTE procedure LEE_CONFIGURACION ('COMPRAS','DOCUMENTOS','DEJAR PENDIENTES LOS ARTICULOS NO INCLUIDOS AL TRAER DOCUMENTOS RELACIONADOS') returning_values (CONSO);
        /* IGNORE LA CONSOLIDACION SI SE VALIDAN CODIGOS DE LA ORDEN */
        SELECT MIN(CEFA_TIPOORI) FROM consolide_faltantes WHERE CEFA_ID = :CONSOLIDA INTO :NUMROWS;
        if (NUMROWS = 23) then
            BEGIN
            EXECUTE PROCEDURE LEE_CONFIGURACION('COMPRAS', 'FACTURAS', 'VERIFICAR CODIGOS DE LA ORDEN') returning_values (MENORV);
            if (MENORV = 'SI') then
                CONSO = 'SI';
            END
        if (CONSO = 'NO') then
            UPDATE consolidado_faltantes SET COFA_IDDES = NEW.faco_id, COFA_OK = 'S' WHERE COFA_ID = :consolida;
        else
            BEGIN
            UPDATE consolidado_faltantes SET COFA_OK = 'S' WHERE COFA_ID = :consolida AND COFA_ITEM = NEW.FCDE_ITEM AND ARTI_COD = NEW.arti_cod;
            /* BUSQUE EL CONSOLIDADO EN EL MISMO ITEM Y SI ES DIFERENTE ACTUALICELO */
            select COFA_CANT * COFA_FACTOR FROM consolidado_faltantes WHERE COFA_ID = :consolida AND COFA_ITEM = NEW.FCDE_ITEM AND ARTI_COD = NEW.arti_cod INTO :CANTREL;
            if (NEW.FCDE_CANT * NEW.FCDE_FACTOR < CANTREL) then
                UPDATE consolidado_faltantes SET COFA_IDDES = NEW.faco_id, COFA_CANT = NEW.FCDE_CANT, COFA_FACTOR = NEW.FCDE_FACTOR
                    WHERE COFA_ID = :consolida AND COFA_ITEM = NEW.FCDE_ITEM AND ARTI_COD = NEW.arti_cod;
            END
        END
    END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER FACTCOMP_DETALLE_AD FOR FACTURAS_COMPRAS_DETALLE
ACTIVE AFTER DELETE POSITION 0
AS
declare variable fec date;
declare variable CONSO VARCHAR(2);
declare variable CONSOLIDA INTEGER;
declare variable NUMROWS INTEGER;
declare variable VERIF CHAR(2);
BEGIN
if ((old.fcde_anulado = 'N') and (OLD.faco_id <> 0)) then
    begin
    select faco_fecha, faco_consolida from facturas_compra where faco_id = old.faco_id into :fec, :consolida;
    DELETE FROM MOVIMIENTO_ARTICULO WHERE (mvar_tipodoc = 21) and (mvar_idref = old.faco_id) and (mvar_item = old.fcde_item);
    /* RECORRA LAS LISTAS DE PRECIOS Y CAMBIE EL PRECIO */
    EXECUTE PROCEDURE CALCULA_PRECIOS(old.ARTI_COD, :FEC);
    /* LOS PENDIENTES */
    if (CONSOLIDA <> 0) then
        BEGIN
        EXECUTE procedure LEE_CONFIGURACION ('COMPRAS','DOCUMENTOS','DEJAR PENDIENTES LOS ARTICULOS NO INCLUIDOS AL TRAER DOCUMENTOS RELACIONADOS') returning_values (CONSO);
        /* IGNORE LA CONSOLIDACION SI SE VALIDAN CODIGOS DE LA ORDEN */
        SELECT MIN(CEFA_TIPOORI) FROM consolide_faltantes WHERE CEFA_ID = :CONSOLIDA INTO :NUMROWS;
        if (NUMROWS = 23) then
            BEGIN
            EXECUTE PROCEDURE LEE_CONFIGURACION('COMPRAS', 'FACTURAS', 'VERIFICAR CODIGOS DE LA ORDEN') returning_values (VERIF);
            if (VERIF = 'SI') then
                CONSO = 'SI';
            END
        if (CONSO = 'NO') then
            UPDATE consolidado_faltantes SET COFA_OK = 'N' WHERE COFA_ID = :consolida;
        else
            UPDATE consolidado_faltantes SET COFA_OK = 'N' WHERE COFA_ID = :consolida AND COFA_ITEM = old.FCDE_ITEM AND ARTI_COD = old.arti_cod;
        END
    enD
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER FACTCOMP_DETALLE_AU FOR FACTURAS_COMPRAS_DETALLE
ACTIVE AFTER UPDATE POSITION 0
as
declare variable fec date;
declare variable fecaux date;
declare variable AUX varchar(90);
declare variable CONC VARCHAR(60);
declare variable Pref varchar(4);
declare variable Num varchar(6);
declare variable Nit varchar(20);
declare variable factor numeric(18,4);
declare variable TIPO INTEGER;
declare variable INVFAC CHAR(2);
declare variable IVAINC CHAR(2);
declare variable COSTO NUMERIC(18,2);
declare variable CANTREL NUMERIC(18,4);
declare variable NUMPROV VARCHAR(10);
declare variable NUMPED VARCHAR(30);
declare variable NUMREM VARCHAR(30);
declare variable CONSO VARCHAR(2);
declare variable CONSOLIDA INTEGER;
declare variable NUMROWS INTEGER;
declare variable DTOPIE NUMERIC(18,2);
declare variable ADICIONAL NUMERIC(18,2);
declare variable TOTAL NUMERIC(18,2);
declare variable IVAMONTO NUMERIC(18,2);
declare variable EXTRA NUMERIC(18,2);
declare variable FACT NUMERIC(18,4);
declare variable MENORV CHAR(2);
BEGIN
if (old.fcde_devuelto = new.fcde_devuelto) then
    begin
    /* deshaga lo viejo */
    if ((old.fcde_anulado = 'N') and (OLD.faco_id <> 0)) then
        begin
        select faco_fecha, faco_consolida from facturas_compra where faco_id = old.faco_id into :fec, :consolida;
        DELETE FROM MOVIMIENTO_ARTICULO WHERE (mvar_tipodoc = 21) and (mvar_idref = old.faco_id) and (mvar_item = old.fcde_item);
        /* RECORRA LAS LISTAS DE PRECIOS Y CAMBIE EL PRECIO */
        EXECUTE PROCEDURE CALCULA_PRECIOS(old.ARTI_COD, :FEC);
        /* LOS PENDIENTES */
        if (CONSOLIDA <> 0) then
            BEGIN
            EXECUTE procedure LEE_CONFIGURACION ('COMPRAS','DOCUMENTOS','DEJAR PENDIENTES LOS ARTICULOS NO INCLUIDOS AL TRAER DOCUMENTOS RELACIONADOS') returning_values (CONSO);
            /* IGNORE LA CONSOLIDACION SI SE VALIDAN CODIGOS DE LA ORDEN */
            SELECT MIN(CEFA_TIPOORI) FROM consolide_faltantes WHERE CEFA_ID = :CONSOLIDA INTO :NUMROWS;
            if (NUMROWS = 23) then
                BEGIN
                EXECUTE PROCEDURE LEE_CONFIGURACION('COMPRAS', 'FACTURAS', 'VERIFICAR CODIGOS DE LA ORDEN') returning_values (MENORV);
                if (MENORV = 'SI') then
                    CONSO = 'SI';
                END
            if (CONSO = 'NO') then
                UPDATE consolidado_faltantes SET COFA_OK = 'N' WHERE COFA_ID = :consolida;
            else
                UPDATE consolidado_faltantes SET COFA_OK = 'N' WHERE COFA_ID = :consolida AND COFA_ITEM = old.FCDE_ITEM AND ARTI_COD = old.arti_cod;
            END
        end
    /* Registre el nuevo */
    if ((new.fcde_anulado = 'N') and (new.faco_id <> 0)) then
        BEGIN
        select faco_fecha, pref_pre, faco_numero, terc_nit, faco_imptos, faco_numprov, faco_remision, faco_orden, faco_consolida, faco_dtomonto, faco_adicional, faco_total, faco_ivamonto, faco_extra
            from facturas_compra where faco_id = new.faco_id
            into :fec, :Pref, :Num, :Nit, :ivainc, :numprov, :numrem, :numped, :consolida, :dtopie, :adicional, :total, :ivamonto, :extra;
        conc = 'FACTURA DE COMPRA No.' || PREF || NUM || '-' || NUMPROV;
        if (NUMREM <> '') then
            BEGIN
            AUX = SUBSTR(NUMREM, 1, 15);
            conc = conc || '-REM:' || AUX;
            END
        else
            if (NUMPED <> '') then
                BEGIN
                AUX = SUBSTR(NUMPED, 1, 15);
                conc = conc || '-ORDEN ' || AUX;
                END
        SELECT MAX(CEFA_TIPOORI) FROM consolide_faltantes WHERE CEFA_ID = :CONSOLIDA INTO :TIPO;
        if (Tipo is null) then
            Tipo = 0;
        execute procedure lee_configuracion('COMPRAS', 'FACTURAS', 'AFECTAR INVENTARIO CON LA FACTURA') returning_values (:INVFAC);
        /* si se hizo con base en una remision no afecte inventario */
        if ((Tipo <> 22) and (INVFAC = 'SI')) then
            begin
            execute procedure factor_unidad_cant(new.arti_cod, new.fcde_unidad) returning_values(factor);
            COSTO = ((new.fcde_prunit - NEW.fcde_dtomonto) / :factor);
            if (IVAINC = 'S') then
                COSTO = COSTO / (1 + NEW.fcde_ivaporc/100);
            EXECUTE PROCEDURE lee_configuracion('COMPRAS','FACTURAS','DESCUENTO Y VALOR ADICIONAL DEL DOCUMENTO COMO MENOR VALOR DEL COSTO') returning_values (:MENORV);
            if (MENORV = 'SI') then
                BEGIN
                FACT = (TOTAL - EXTRA - IVAMONTO);
                if ((FACT - ADICIONAL + DTOPIE) <> 0) then
                    FACT = FACT / (FACT - ADICIONAL + DTOPIE);
                ELSE
                    FACT = 1;
                COSTO = COSTO * FACT;
                END
            INSERT INTO MOVIMIENTO_ARTICULO
                (ARTI_COD, MVAR_CONS, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM, TERC_NIT)
                VALUES(NEW.ARTI_COD, GEN_ID(ID_MOVARTI,1), NEW.BODE_COD, :FEC, 21, NEW.faco_id,
                :CONC, :factor * new.fcde_cant, :COSTO, 'S', new.fcde_lote, :Pref, :Num, NEW.fcde_item, :Nit);
            if (COSTO > 0 ) then
             BEGIN
              /* ACTUALICE EL COSTO POR PROVEEDOR */
              SELECT PVAR_FECHA FROM PROVEEDOR_ARTICULO
                WHERE TERC_NIT = :Nit AND ARTI_COD = NEW.ARTI_COD INTO :FECAUX;
              if (FECAUX IS NULL) then
                INSERT INTO PROVEEDOR_ARTICULO (TERC_NIT, ARTI_COD, PVAR_COSTO, PVAR_FECHA, PVAR_COD,PVAR_DES)
                    VALUES (:Nit, NEW.ARTI_COD, :COSTO, :fec, NEW.fcde_codprov,NEW.fcde_desc);
              else
                UPDATE PROVEEDOR_ARTICULO
                    SET PVAR_COSTO = :COSTO, PVAR_FECHA = :fec, PVAR_COD = NEW.fcde_codprov
                    WHERE ARTI_COD = NEW.ARTI_COD AND TERC_NIT = :Nit;
             END
            /* RECORRA LAS LISTAS DE PRECIOS Y CAMBIE EL PRECIO */
            EXECUTE PROCEDURE CALCULA_PRECIOS(NEW.ARTI_COD, :FEC);
            end
        if (CONSOLIDA <> 0) then
            begin
            EXECUTE procedure LEE_CONFIGURACION ('COMPRAS','DOCUMENTOS','DEJAR PENDIENTES LOS ARTICULOS NO INCLUIDOS AL TRAER DOCUMENTOS RELACIONADOS') returning_values (CONSO);
            /* IGNORE LA CONSOLIDACION SI SE VALIDAN CODIGOS DE LA ORDEN */
            SELECT MIN(CEFA_TIPOORI) FROM consolide_faltantes WHERE CEFA_ID = :CONSOLIDA INTO :NUMROWS;
            if (NUMROWS = 23) then
                BEGIN
                EXECUTE PROCEDURE LEE_CONFIGURACION('COMPRAS', 'FACTURAS', 'VERIFICAR CODIGOS DE LA ORDEN') returning_values (MENORV);
                if (MENORV = 'SI') then
                    CONSO = 'SI';
                END
            if (CONSO = 'NO') then
                UPDATE consolidado_faltantes SET COFA_IDDES = NEW.faco_id, COFA_OK = 'S' WHERE COFA_ID = :consolida;
            else
                BEGIN
                UPDATE consolidado_faltantes SET COFA_OK = 'S' WHERE COFA_ID = :consolida AND COFA_ITEM = NEW.FCDE_ITEM AND ARTI_COD = NEW.arti_cod;
                /* BUSQUE EL CONSOLIDADO EN EL MISMO ITEM Y SI ES DIFERENTE ACTUALICELO */
                select COFA_CANT * COFA_FACTOR FROM consolidado_faltantes WHERE COFA_ID = :consolida AND COFA_ITEM = NEW.FCDE_ITEM AND ARTI_COD = NEW.arti_cod INTO :CANTREL;
                if (NEW.FCDE_CANT * NEW.FCDE_FACTOR < CANTREL) then
                    UPDATE consolidado_faltantes SET COFA_IDDES = NEW.faco_id, COFA_CANT = NEW.FCDE_CANT, COFA_FACTOR = NEW.FCDE_FACTOR
                        WHERE COFA_ID = :consolida AND COFA_ITEM = NEW.FCDE_ITEM AND ARTI_COD = NEW.arti_cod;
                END
            end
        END
    end
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER REMISION_PROVEEDOR_DET_AI FOR REMISION_PROVEEDOR_DET
ACTIVE AFTER INSERT POSITION 0
AS
declare variable fec date;
declare variable CONC VARCHAR(60);
declare variable factor numeric(18,4);
declare variable Pref varchar(4);
declare variable Num varchar(6);
declare variable EXISTE CHAR(1);
declare variable NIT VARCHAR(20);
declare variable NUMPROV VARCHAR(20);
declare variable Tipo Integer;
declare variable idfact integer;
declare variable numrows integer;
declare variable IVAINC CHAR(2);
declare variable COSTO NUMERIC(18,2);
declare variable CANTREL NUMERIC(18,4);
declare variable NUMPED VARCHAR(30);
declare variable CONSO CHAR(2);
declare variable CONSOLIDA INTEGER;
declare variable DTOPIE NUMERIC(18,2);
declare variable ADICIONAL NUMERIC(18,2);
declare variable TOTAL NUMERIC(18,2);
declare variable IVAMONTO NUMERIC(18,2);
declare variable EXTRA NUMERIC(18,2);
declare variable FACT NUMERIC(18,4);
declare variable MENORV CHAR(2);
BEGIN
  if ((NEW.repr_id <> 0) and (new.rpvd_anulado = 'N')) then
    BEGIN
    select max(rprd_tiporel), max(rprd_idrel) from remision_proveedor_docrela
        where repr_id = new.repr_id into :Tipo, :idfact;
    if (Tipo is null) then
        Tipo = 0;
    /* si se hizo con base en una factura que afecto el inventario no afecte inventario */
    numrows = 0;
    if (Tipo = 21) Then
        select count(*) from movimiento_articulo where mvar_tipodoc = 21 and mvar_idref = :idfact into :numrows;
    if (numrows is null) then
        numrows = 0;
    if (numrows = 0) then
        begin
        select repr_fecha, pref_pre, repr_numero, REPR_IMPTOS, terc_nit, REPR_NUMPROV, REPR_ORDEN, REPR_CONSOLIDA, repr_dtomonto, repr_adicional, repr_total, repr_ivamonto, repr_extra
            from remision_proveedor where repr_id = new.repr_id
            into :fec, :Pref, :Num, :IVAINC, :NIT, :NUMPROV, :numped, :CONSOLIDA, :dtopie, :adicional, :total, :ivamonto, :extra;
        execute procedure factor_unidad_cant(new.arti_cod, new.rpvd_unidad) returning_values(factor);
        CONC = 'REMISION PROVEEDOR No.' || PREF || NUM || '-' || NUMPROV;
        if (numped <> '') then
            conc = conc || '-ORDEN ' || NUMPED;
        COSTO = ((new.rpvd_prunit - NEW.rpvd_dtomonto) / :factor);
        if (IVAINC = 'S') then
            COSTO = COSTO / (1 + NEW.rpvd_ivaporc/100);
        EXECUTE PROCEDURE lee_configuracion('COMPRAS','FACTURAS','DESCUENTO Y VALOR ADICIONAL DEL DOCUMENTO COMO MENOR VALOR DEL COSTO') returning_values (:MENORV);
        if (MENORV = 'SI') then
            BEGIN
            FACT = (TOTAL - EXTRA - IVAMONTO);
            if ((FACT - ADICIONAL + DTOPIE) <> 0) then
                FACT = FACT / (FACT - ADICIONAL + DTOPIE);
            ELSE
                FACT = 1;
            COSTO = COSTO * FACT;
            END
        INSERT INTO MOVIMIENTO_ARTICULO
          (ARTI_COD, MVAR_CONS, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM, TERC_NIT)
          VALUES(NEW.ARTI_COD, GEN_ID(ID_MOVARTI,1), NEW.BODE_COD, :FEC, 22, NEW.repr_id,
          :CONC, :factor * new.rpvd_cant, :COSTO, 'S', new.rpvd_lote, :Pref, :Num, new.rpvd_item, :Nit);

        /* RECORRA LAS LISTAS DE PRECIOS Y CAMBIE EL PRECIO */
        EXECUTE PROCEDURE CALCULA_PRECIOS(NEW.ARTI_COD, :FEC);

        if (COSTO > 0 ) then
         BEGIN
          /* GRABE PROV X ARTICULO */
          EXISTE = 'N';
          SELECT 'S' FROM PROVEEDOR_ARTICULO WHERE TERC_NIT = :NIT AND ARTI_COD = NEW.ARTI_COD INTO :EXISTE;
          if (EXISTE = 'S') then
            UPDATE PROVEEDOR_ARTICULO 
                SET PVAR_FECHA = :FEC, PVAR_COSTO = :COSTO, PVAR_COD = NEW.rpvd_codprov
                WHERE TERC_NIT = :NIT AND ARTI_COD = NEW.ARTI_COD;
          ELSE
            INSERT INTO PROVEEDOR_ARTICULO (TERC_NIT, ARTI_COD, PVAR_COSTO, PVAR_FECHA, PVAR_COD,PVAR_DES)
                VALUES (:NIT, NEW.ARTI_COD, :COSTO, :FEC, NEW.rpvd_codprov,NEW.rpvd_desc);
         END
        end

    /* ACTUALICE EL PENDIENTE  */
    if (CONSOLIDA <> 0) then
        BEGIN
        EXECUTE procedure LEE_CONFIGURACION ('COMPRAS','DOCUMENTOS','DEJAR PENDIENTES LOS ARTICULOS NO INCLUIDOS AL TRAER DOCUMENTOS RELACIONADOS') returning_values (CONSO);
        SELECT MIN(CEFA_TIPOORI) FROM consolide_faltantes WHERE CEFA_ID = :CONSOLIDA INTO :NUMROWS;
        if (NUMROWS = 23) then
            BEGIN
            EXECUTE PROCEDURE LEE_CONFIGURACION('COMPRAS', 'REMISIONES', 'VERIFICAR CODIGOS DE LA ORDEN') returning_values (MENORV);
            if (MENORV = 'SI') then
                CONSO = 'SI';
            END
        if (CONSO = 'NO') then
            UPDATE consolidado_faltantes SET COFA_OK = 'S' WHERE COFA_ID = :consolida;
        ELSE
            BEGIN
            /* BUSQUE EL CONSOLIDADO EN EL MISMO ITEM Y SI ES DIFERENTE ACTUALICELO */
            select COFA_CANT * COFA_FACTOR FROM consolidado_faltantes WHERE COFA_ID = :consolida AND COFA_ITEM = NEW.RPVD_ITEM AND ARTI_COD = NEW.arti_cod INTO :CANTREL;
            if (NEW.RPVD_CANT * NEW.RPVD_FACTOR < CANTREL) then
                UPDATE consolidado_faltantes SET COFA_IDDES = NEW.repr_id, COFA_CANT = NEW.RPVD_CANT, COFA_FACTOR = NEW.RPVD_FACTOR, COFA_OK = 'S' 
                    WHERE COFA_ID = :consolida AND COFA_ITEM = NEW.RPVD_ITEM AND ARTI_COD = NEW.arti_cod;
            ELSE
                UPDATE consolidado_faltantes SET COFA_IDDES = NEW.repr_id, COFA_OK = 'S' WHERE COFA_ID = :consolida AND COFA_ITEM = NEW.RPVD_ITEM AND ARTI_COD = NEW.arti_cod;
            END
        END
    END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER REMISION_PROVEEDOR_DET_AD FOR REMISION_PROVEEDOR_DET
ACTIVE AFTER DELETE POSITION 0
AS
declare variable CONSO CHAR(2);
declare variable CONSOLIDA INTEGER;
BEGIN
if ((OLD.repr_id <> 0) AND (OLD.rpvd_anulado = 'N')) then
    begin
    delete from movimiento_articulo
      where (mvar_tipodoc = 22) and (mvar_idref = old.repr_id) and (mvar_item = old.rpvd_item);
    select REPR_CONSOLIDA from remision_proveedor where repr_id = old.repr_id into :CONSOLIDA;
    if (CONSOLIDA <> 0) then
        begin
        EXECUTE procedure LEE_CONFIGURACION ('COMPRAS','DOCUMENTOS','DEJAR PENDIENTES LOS ARTICULOS NO INCLUIDOS AL TRAER DOCUMENTOS RELACIONADOS') returning_values (CONSO);
        if (CONSO = 'SI') then
            UPDATE consolidado_faltantes SET COFA_OK = 'N' WHERE COFA_ID = :consolida AND COFA_ITEM = old.RPVD_ITEM AND ARTI_COD = old.arti_cod;
        else
            UPDATE consolidado_faltantes SET COFA_OK = 'N' WHERE COFA_ID = :consolida;
        END
    end
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER REMISION_PROVEEDOR_DET_AU FOR REMISION_PROVEEDOR_DET
ACTIVE AFTER UPDATE POSITION 0
AS
declare variable fec date;
declare variable CONC VARCHAR(60);
declare variable Pref varchar(4);
declare variable Num varchar(6);
declare variable factor numeric(18,4);
declare variable EXISTE CHAR(1);
declare variable NIT VARCHAR(20);
declare variable NUMPROV VARCHAR(20);
declare variable Tipo integer;
declare variable idfact integer;
declare variable numrows integer;
declare variable IVAINC CHAR(2);
declare variable COSTO NUMERIC(18,2);
declare variable CANTREL NUMERIC(18,4);
declare variable NUMPED VARCHAR(30);
declare variable CONSO CHAR(2);
declare variable CONSOLIDA INTEGER;
declare variable DTOPIE NUMERIC(18,2);
declare variable ADICIONAL NUMERIC(18,2);
declare variable TOTAL NUMERIC(18,2);
declare variable IVAMONTO NUMERIC(18,2);
declare variable EXTRA NUMERIC(18,2);
declare variable FACT NUMERIC(18,4);
declare variable MENORV CHAR(2);
BEGIN
if ((OLD.repr_id <> 0) AND (OLD.rpvd_anulado = 'N')) then
    begin
    DELETE FROM MOVIMIENTO_ARTICULO WHERE (mvar_tipodoc = 22) and (mvar_idref = new.repr_id) and (mvar_item = old.rpvd_item);
    select REPR_CONSOLIDA from remision_proveedor where repr_id = old.repr_id into :CONSOLIDA;
    if (CONSOLIDA <> 0) then
        begin
        EXECUTE procedure LEE_CONFIGURACION ('COMPRAS','DOCUMENTOS','DEJAR PENDIENTES LOS ARTICULOS NO INCLUIDOS AL TRAER DOCUMENTOS RELACIONADOS') returning_values (CONSO);
        if (CONSO = 'SI') then
            UPDATE consolidado_faltantes SET COFA_OK = 'N' WHERE COFA_ID = :consolida AND COFA_ITEM = old.RPVD_ITEM AND ARTI_COD = old.arti_cod;
        else
            UPDATE consolidado_faltantes SET COFA_OK = 'N' WHERE COFA_ID = :consolida;
        END
    end
/* Registre el nuevo */
if ((new.repr_id <> 0) AND (new.rpvd_anulado = 'N')) then
    begin
    select repr_fecha, pref_pre, repr_numero, repr_imptos, terc_nit, REPR_NUMPROV, REPR_ORDEN, REPR_CONSOLIDA, repr_dtomonto, repr_adicional, repr_total, repr_ivamonto, repr_extra
        from remision_proveedor where repr_id = new.repr_id
        into :fec, :Pref, :Num, :IVAINC, :NIT, :NUMPROV, :numped, :CONSOLIDA, :dtopie, :adicional, :total, :ivamonto, :extra;
    CONC = 'REMISION PROVEEDOR No.' || PREF || NUM || '-' || NUMPROV;
    if (numped <> '') then
        conc = conc || '-ORDEN ' || NUMPED;
    SELECT MAX(CEFA_TIPOORI) FROM consolide_faltantes WHERE CEFA_ID = :CONSOLIDA INTO :TIPO;
    if (Tipo is null) then
        Tipo = 0;
    select FACO_ID from FACTURAS_COMPRA WHERE FACO_CONSOLIDA = :consolida INTO :IDFACT;
    if (Idfact is null) then
        Idfact = 0;
    /* si se hizo con base en una factura que afecto el inventario no afecte inventario */
    numrows = 0;
    if (Tipo = 21) Then
        select count(*) from movimiento_articulo where mvar_tipodoc = 21 and mvar_idref = :idfact into :numrows;
    if (numrows is null) then
        numrows = 0;
    if (numrows = 0) then
        begin
        execute procedure factor_unidad_cant(new.arti_cod, new.rpvd_unidad) returning_values(factor);
        COSTO = ((new.rpvd_prunit - NEW.rpvd_dtomonto) / :factor);
        if (IVAINC = 'S') then
            COSTO = COSTO / (1 + NEW.rpvd_ivaporc/100);
        EXECUTE PROCEDURE lee_configuracion('COMPRAS','FACTURAS','DESCUENTO Y VALOR ADICIONAL DEL DOCUMENTO COMO MENOR VALOR DEL COSTO') returning_values (:MENORV);
        if (MENORV = 'SI') then
            BEGIN
            FACT = (TOTAL - EXTRA - IVAMONTO);
            if ((FACT - ADICIONAL + DTOPIE) <> 0) then
                FACT = FACT / (FACT - ADICIONAL + DTOPIE);
            ELSE
                FACT = 1;
            COSTO = COSTO * FACT;
            END
        INSERT INTO MOVIMIENTO_ARTICULO
            (ARTI_COD, MVAR_CONS, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM, TERC_NIT)
            VALUES(NEW.ARTI_COD, GEN_ID(ID_MOVARTI,1), NEW.BODE_COD, :FEC, 22, NEW.repr_id,
            :CONC, :factor * new.rpvd_cant, :COSTO, 'S', new.rpvd_lote, :Pref, :Num, new.rpvd_item, :Nit);
            
        /* RECORRA LAS LISTAS DE PRECIOS Y CAMBIE EL PRECIO */
        EXECUTE PROCEDURE CALCULA_PRECIOS(NEW.ARTI_COD, :FEC);
          
        if (COSTO > 0 ) then
         BEGIN
          /* GRABE PROV X ARTICULO */
          EXISTE = 'N';
          SELECT 'S' FROM PROVEEDOR_ARTICULO WHERE TERC_NIT = :NIT AND ARTI_COD = NEW.ARTI_COD INTO :EXISTE;
          if (EXISTE = 'S') then
            UPDATE PROVEEDOR_ARTICULO
                SET PVAR_FECHA = :FEC, PVAR_COSTO = :COSTO, PVAR_COD = NEW.rpvd_codprov
                WHERE TERC_NIT = :NIT AND ARTI_COD = NEW.ARTI_COD;
          ELSE
            INSERT INTO PROVEEDOR_ARTICULO (TERC_NIT, ARTI_COD, PVAR_COSTO, PVAR_FECHA, PVAR_COD,PVAR_DES)
                VALUES (:NIT, NEW.ARTI_COD, :COSTO, :FEC, NEW.rpvd_codprov,NEW.rpvd_desc);
         END
        end
    if (CONSOLIDA <> 0) then
        BEGIN
        EXECUTE procedure LEE_CONFIGURACION ('COMPRAS','DOCUMENTOS','DEJAR PENDIENTES LOS ARTICULOS NO INCLUIDOS AL TRAER DOCUMENTOS RELACIONADOS') returning_values (CONSO);
        /* IGNORE LA CONSOLIDACION SI SE VALIDAN CODIGOS DE LA ORDEN */
        SELECT MIN(CEFA_TIPOORI) FROM consolide_faltantes WHERE CEFA_ID = :CONSOLIDA INTO :NUMROWS;
        if (NUMROWS = 23) then
            BEGIN
            EXECUTE PROCEDURE LEE_CONFIGURACION('COMPRAS', 'REMISIONES', 'VERIFICAR CODIGOS DE LA ORDEN') returning_values (MENORV);
            if (MENORV = 'SI') then
                CONSO = 'SI';
            END
        if (CONSO = 'NO') then
            UPDATE consolidado_faltantes SET COFA_IDDES = NEW.repr_id, COFA_OK = 'S' WHERE COFA_ID = :consolida;
        ELSE
            BEGIN
            /* BUSQUE EL CONSOLIDADO EN EL MISMO ITEM Y SI ES DIFERENTE ACTUALICELO */
            select COFA_CANT * COFA_FACTOR FROM consolidado_faltantes WHERE COFA_ID = :consolida AND COFA_ITEM = NEW.RPVD_ITEM AND ARTI_COD = NEW.arti_cod INTO :CANTREL;
            if (NEW.RPVD_CANT * NEW.RPVD_FACTOR < CANTREL) then
                UPDATE consolidado_faltantes SET COFA_IDDES = NEW.repr_id, COFA_CANT = NEW.RPVD_CANT, COFA_FACTOR = NEW.RPVD_FACTOR, COFA_OK = 'S' 
                    WHERE COFA_ID = :consolida AND COFA_ITEM = NEW.RPVD_ITEM AND ARTI_COD = NEW.arti_cod;
            else
                UPDATE consolidado_faltantes SET COFA_IDDES = NEW.repr_id, COFA_OK = 'S' WHERE COFA_ID = :consolida AND COFA_ITEM = NEW.RPVD_ITEM AND ARTI_COD = NEW.arti_cod;
            END
        END
    END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER ORDENES_COMPRA_DETALLE_AI FOR ORDENES_COMPRA_DETALLE
ACTIVE AFTER INSERT POSITION 0
as
declare variable CONSO CHAR(2);
declare variable CONSOLIDA INTEGER;
declare variable CANTREL NUMERIC(18,4);
declare variable COSTO NUMERIC(18,2);
declare variable FACTOR NUMERIC(18,4);
declare variable NIT VARCHAR(20);
declare variable FEC DATE;
declare variable IVAINC CHAR(1);
declare variable DTOPIE NUMERIC(18,2);
declare variable ADICIONAL NUMERIC(18,2);
declare variable TOTAL NUMERIC(18,2);
declare variable IVAMONTO NUMERIC(18,2);
declare variable EXTRA NUMERIC(18,2);
declare variable FACT NUMERIC(18,4);
declare variable MENORV CHAR(2);
declare variable EXISTE CHAR(1);
begin
if ((NEW.ORDC_ID <> 0) and (new.ocde_anulado = 'N')) then
    BEGIN
    SELECT ORDC_CONSOLIDA FROM ORDENES_COMPRA WHERE ORDC_ID = NEW.ordc_id INTO :CONSOLIDA;
    /* ACTUALICE EL PENDIENTE  */
    if (CONSOLIDA <> 0) then
        BEGIN
        EXECUTE procedure LEE_CONFIGURACION ('COMPRAS','DOCUMENTOS','DEJAR PENDIENTES LOS ARTICULOS NO INCLUIDOS AL TRAER DOCUMENTOS RELACIONADOS') returning_values (CONSO);
        if (CONSO = 'NO') then
            UPDATE consolidado_faltantes SET COFA_IDDES = NEW.ordc_id, COFA_OK = 'S' WHERE COFA_ID = :consolida;
        ELSE
            BEGIN
            UPDATE consolidado_faltantes SET COFA_IDDES = NEW.ordc_id, COFA_OK = 'S' WHERE COFA_ID = :consolida AND COFA_ITEM = NEW.OCDE_ITEM AND ARTI_COD = NEW.arti_cod;
            /* BUSQUE EL CONSOLIDADO EN EL MISMO ITEM Y SI ES DIFERENTE ACTUALICELO */
            select COFA_CANT FROM consolidado_faltantes WHERE COFA_ID = :consolida AND COFA_ITEM = NEW.OCDE_ITEM AND ARTI_COD = NEW.arti_cod INTO :CANTREL;
            if (NEW.OCDE_CANT * NEW.OCDE_FACTOR < CANTREL) then
                UPDATE consolidado_faltantes SET COFA_IDDES = NEW.ordc_id, COFA_CANT = NEW.OCDE_CANT * NEW.OCDE_FACTOR
                    WHERE COFA_ID = :consolida AND COFA_ITEM = NEW.OCDE_ITEM AND ARTI_COD = NEW.arti_cod;
            END
        END
    SELECT TERC_NIT, ORDC_FECHA, ORDC_IMPTOS, ORDC_DTOMONTO, ORDC_ADICIONAL, ORDC_EXTRA, ORDC_TOTAL, ORDC_IVAMONTO
        FROM ordenes_compra WHERE ORDC_ID = NEW.ordc_id
        INTO :NIT, :FEC, :IVAINC, :DTOPIE, :adicional,  :extra, :total, :ivamonto;
    execute procedure factor_unidad_cant(new.arti_cod, new.ocde_unidad) returning_values(factor);
    COSTO = ((new.ocde_prunit - NEW.ocde_dtomonto) / :factor);
    if (IVAINC = 'S') then
        COSTO = COSTO / (1 + NEW.ocde_ivaporc/100);
    EXECUTE PROCEDURE lee_configuracion('COMPRAS','FACTURAS','DESCUENTO Y VALOR ADICIONAL DEL DOCUMENTO COMO MENOR VALOR DEL COSTO') returning_values (:MENORV);
    if (MENORV = 'SI') then
        BEGIN
        FACT = (TOTAL - EXTRA - IVAMONTO);
        if ((FACT - ADICIONAL + DTOPIE) <> 0) then
            FACT = FACT / (FACT - ADICIONAL + DTOPIE);
        ELSE
            FACT = 1;
        COSTO = COSTO * FACT;
        END
    if (COSTO > 0 ) then
     BEGIN
      /* GRABE PROV X ARTICULO */
      EXISTE = 'N';
      SELECT 'S' FROM PROVEEDOR_ARTICULO WHERE TERC_NIT = :NIT AND ARTI_COD = NEW.ARTI_COD INTO :EXISTE;
      if (EXISTE = 'S') then
        UPDATE PROVEEDOR_ARTICULO
            SET PVAR_FECHA = :FEC, PVAR_COSTO = :COSTO, PVAR_COD = NEW.ocde_codprov
            WHERE TERC_NIT = :NIT AND ARTI_COD = NEW.ARTI_COD;
      ELSE
        INSERT INTO PROVEEDOR_ARTICULO (TERC_NIT, ARTI_COD, PVAR_COSTO, PVAR_FECHA, PVAR_COD,PVAR_DES)
            VALUES (:NIT, NEW.ARTI_COD, :COSTO, :FEC, NEW.ocde_codprov,NEW.ocde_desc);
     END
    END
end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER ORDENES_COMPRA_DETALLE_AD FOR ORDENES_COMPRA_DETALLE
ACTIVE AFTER DELETE POSITION 0
as
declare variable CONSOLIDA INTEGER;
declare variable CONSO CHAR(2);
begin
if ((old.ORDC_ID <> 0) AND (old.ocde_anulado = 'N')) THEN
    BEGIN
    SELECT ORDC_CONSOLIDA FROM ORDENES_COMPRA WHERE ORDC_ID = old.ordc_id INTO :CONSOLIDA;
    /* ACTUALICE EL PENDIENTE  */
    if (CONSOLIDA <> 0) then
        begin
        EXECUTE procedure LEE_CONFIGURACION ('COMPRAS','DOCUMENTOS','DEJAR PENDIENTES LOS ARTICULOS NO INCLUIDOS AL TRAER DOCUMENTOS RELACIONADOS') returning_values (CONSO);
        if (CONSO = 'SI') then
            UPDATE consolidado_faltantes SET COFA_OK = 'N' WHERE COFA_ID = :consolida AND COFA_ITEM = old.OCDE_ITEM AND ARTI_COD = old.arti_cod;
        else
            UPDATE consolidado_faltantes SET COFA_OK = 'N' WHERE COFA_ID = :consolida;
        end
    END
end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER ORDENES_COMPRA_DETALLE_AU FOR ORDENES_COMPRA_DETALLE
ACTIVE AFTER UPDATE POSITION 0
as
declare variable CONSO CHAR(2);
declare variable CONSOLIDA INTEGER;
declare variable CANTREL NUMERIC(18,4);
declare variable COSTO NUMERIC(18,2);
declare variable FACTOR NUMERIC(18,4);
declare variable NIT VARCHAR(20);
declare variable FEC DATE;
declare variable IVAINC CHAR(1);
declare variable DTOPIE NUMERIC(18,2);
declare variable ADICIONAL NUMERIC(18,2);
declare variable TOTAL NUMERIC(18,2);
declare variable IVAMONTO NUMERIC(18,2);
declare variable EXTRA NUMERIC(18,2);
declare variable FACT NUMERIC(18,4);
declare variable MENORV CHAR(2);
declare variable EXISTE CHAR(1);
begin
if ((old.ORDC_ID <> 0) AND (old.ocde_anulado = 'N')) THEN
    BEGIN
    SELECT ORDC_CONSOLIDA FROM ORDENES_COMPRA WHERE ORDC_ID = old.ordc_id INTO :CONSOLIDA;
    /* ACTUALICE EL PENDIENTE  */
    if (CONSOLIDA <> 0) then
        begin
        EXECUTE procedure LEE_CONFIGURACION ('COMPRAS','DOCUMENTOS','DEJAR PENDIENTES LOS ARTICULOS NO INCLUIDOS AL TRAER DOCUMENTOS RELACIONADOS') returning_values (CONSO);
        if (CONSO = 'SI') then
            UPDATE consolidado_faltantes SET COFA_OK = 'N' WHERE COFA_ID = :consolida AND COFA_ITEM = old.OCDE_ITEM AND ARTI_COD = old.arti_cod;
        else
            UPDATE consolidado_faltantes SET COFA_OK = 'N' WHERE COFA_ID = :consolida;
        end
    END
if ((NEW.ORDC_ID <> 0) AND (new.ocde_anulado = 'N')) THEN
    BEGIN
    SELECT ORDC_CONSOLIDA FROM ORDENES_COMPRA WHERE ORDC_ID = NEW.ordc_id INTO :CONSOLIDA;
    /* ACTUALICE EL PENDIENTE  */
    if (CONSOLIDA <> 0) then
        BEGIN
        EXECUTE procedure LEE_CONFIGURACION ('COMPRAS','DOCUMENTOS','DEJAR PENDIENTES LOS ARTICULOS NO INCLUIDOS AL TRAER DOCUMENTOS RELACIONADOS') returning_values (CONSO);
        if (CONSO = 'NO') then
            UPDATE consolidado_faltantes SET COFA_IDDES = NEW.ordc_id, COFA_OK = 'S' WHERE COFA_ID = :consolida;
        ELSE
            BEGIN
            UPDATE consolidado_faltantes SET COFA_OK = 'S' WHERE COFA_ID = :consolida AND COFA_ITEM = NEW.OCDE_ITEM AND ARTI_COD = NEW.arti_cod;
            /* BUSQUE EL CONSOLIDADO EN EL MISMO ITEM Y SI ES DIFERENTE ACTUALICELO */
            select COFA_CANT FROM consolidado_faltantes WHERE COFA_ID = :consolida AND COFA_ITEM = NEW.OCDE_ITEM AND ARTI_COD = NEW.arti_cod INTO :CANTREL;
            if (NEW.OCDE_CANT * NEW.OCDE_FACTOR < CANTREL) then
                UPDATE consolidado_faltantes SET COFA_IDDES = NEW.ordc_id, COFA_CANT = NEW.OCDE_CANT * NEW.OCDE_FACTOR
                    WHERE COFA_ID = :consolida AND COFA_ITEM = NEW.OCDE_ITEM AND ARTI_COD = NEW.arti_cod;
            END
        END

    SELECT TERC_NIT, ORDC_FECHA, ORDC_IMPTOS, ORDC_DTOMONTO, ORDC_ADICIONAL, ORDC_EXTRA, ORDC_TOTAL, ORDC_IVAMONTO
        FROM ordenes_compra WHERE ORDC_ID = NEW.ordc_id
        INTO :NIT, :FEC, :IVAINC, :DTOPIE, :adicional,  :extra, :total, :ivamonto;
    execute procedure factor_unidad_cant(new.arti_cod, new.ocde_unidad) returning_values(factor);
    COSTO = ((new.ocde_prunit - NEW.ocde_dtomonto) / :factor);
    if (IVAINC = 'S') then
        COSTO = COSTO / (1 + NEW.ocde_ivaporc/100);
    EXECUTE PROCEDURE lee_configuracion('COMPRAS','FACTURAS','DESCUENTO Y VALOR ADICIONAL DEL DOCUMENTO COMO MENOR VALOR DEL COSTO') returning_values (:MENORV);
    if (MENORV = 'SI') then
        BEGIN
        FACT = (TOTAL - EXTRA - IVAMONTO);
        if ((FACT - ADICIONAL + DTOPIE) <> 0) then
            FACT = FACT / (FACT - ADICIONAL + DTOPIE);
        ELSE
            FACT = 1;
        COSTO = COSTO * FACT;
        END

    if (COSTO > 0 ) then
     BEGIN
      /* GRABE PROV X ARTICULO */
      EXISTE = 'N';
      SELECT 'S' FROM PROVEEDOR_ARTICULO WHERE TERC_NIT = :NIT AND ARTI_COD = NEW.ARTI_COD INTO :EXISTE;
      if (EXISTE = 'S') then
        UPDATE PROVEEDOR_ARTICULO
            SET PVAR_FECHA = :FEC, PVAR_COSTO = :COSTO, PVAR_COD = NEW.ocde_codprov
            WHERE TERC_NIT = :NIT AND ARTI_COD = NEW.ARTI_COD;
      ELSE
        INSERT INTO PROVEEDOR_ARTICULO (TERC_NIT, ARTI_COD, PVAR_COSTO, PVAR_FECHA, PVAR_COD,PVAR_DES)
            VALUES (:NIT, NEW.ARTI_COD, :COSTO, :FEC, NEW.ocde_codprov,NEW.ocde_desc);
     END
    END
end
^

SET TERM ; ^


/* 05-17 cuentas de cliente por zona */
SET TERM ^ ;

create PROCEDURE CAMBIA_CTAS_CLIENTES (
    cli_ini varchar(15),
    cli_fin varchar(15))
as
declare variable cliente varchar(20);
declare variable zona varchar(2);
declare variable cta1 varchar(20);
declare variable cta2 varchar(20);
declare variable cta3 varchar(20);
declare variable cta4 varchar(20);
declare variable cta5 varchar(20);
begin
FOR SELECT T.terc_nit, C.zona_cod  FROM TERCEROS T, CLIENTES C WHERE T.terc_nit >= :CLI_INI AND T.terc_nit <= :CLI_fin
    INTO :CLIENTE, :ZONA
    DO
    BEGIN
       SELECT GP.zona_ctaventas, GP.zona_ctacliente, GP.zona_ctartfte, GP.zona_ctariva, GP.zona_ctarica
        FROM ZONAS GP
         WHERE GP.zona_cod = :ZONA
         into :CTA1,:CTA2,:CTA3,:CTA4,:CTA5;
         update TERCEROS TER
         SET TER.terc_ctaventa = :CTA1,
             TER.terc_ctacliente = :CTA2,
             TER.terc_ctartfte = :CTA3,
             TER.terc_ctartiva = :CTA4,
             TER.terc_ctartica = :CTA5
         where TER.TERC_NIT = :CLIENTE;
    END
end
^

SET TERM ; ^



/* 05-18 cuentas proveedor por grupo */
SET TERM ^ ;

CREATE PROCEDURE CAMBIA_CTAS_PROVEEDOR (
    pro_ini varchar(15),
    pro_fin varchar(15))
as
declare variable prove varchar(20);
declare variable grupo varchar(2);
declare variable cta1 varchar(20);
declare variable cta2 varchar(20);
declare variable cta3 varchar(20);
declare variable cta4 varchar(20);
begin
FOR SELECT P.terc_nit, P.grpr_cod FROM PROVEEDORES P WHERE P.terc_nit >= :PRO_INI AND P.terc_nit <= :PRO_FIN
    INTO :PROVE, :GRUPO
    DO
    BEGIN
       SELECT GP.grpr_ctaprov, GP.grpr_ctartfte, GP.grpr_ctartiva, GP.grpr_ctartica
        FROM grupos_proveedores GP
         WHERE GP.grpr_cod = :GRUPO
         into :CTA1,:CTA2,:CTA3,:CTA4;
         update proveedores P
         SET P.prov_ctapagar = :CTA1,
             P.prov_ctartfte = :CTA2,
             P.prov_ctartiva = :CTA3,
             P.prov_ctartica = :CTA4
         where p.terc_nit = :prove;
    END
end
^

SET TERM ; ^


/* 05-20 reporte de precios a modificar */
SET TERM ^ ;

CREATE OR ALTER PROCEDURE REVISA_PRECIOS(
    LISTA INTEGER,
    FECHA DATE)
RETURNS (
    ARTICULO VARCHAR(20),
    DESCR VARCHAR(60),
    FIJO NUMERIC(18,2),
    UNIDAD VARCHAR(8),
    PORC NUMERIC(9,4),
    SUGERIDO NUMERIC(18,2),
    DIFER NUMERIC(18,2))
AS
declare variable marg numeric(9,4);
declare variable UOM VARCHAR(10);
declare variable BASE VARCHAR(10);
declare variable CAMBIO VARCHAR(10);
declare variable COSTO numeric(18,2);
declare variable COSTOP numeric(18,2);
declare variable COSTOU numeric(18,2);
declare variable DIFMAX numeric(18,2);
declare variable DIG INTEGER;
declare variable TARIVA NUMERIC(9,4);
declare variable IVAINC CHAR(1);
declare variable LISTAREF INTEGER;
begin
execute procedure lee_configuracion ('FACTURACION', 'ARTICULOS', 'SUGERIR PRECIOS CON PORCENTAJE DE MARGEN O UTILIDAD') returning_values (:UOM);
EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION', 'ARTICULOS', 'REDONDEO AL MULTIPLO DE DIEZ EN PRECIOS') RETURNING_VALUES (:DIG);
EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION','ARTICULOS','CAMBIO DE PRECIOS AUTOMATICO AL CAMBIAR COSTO O PRECIO') returning_values (CAMBIO);
EXECUTE PROCEDURE lee_configuracion('FACTURACION','ARTICULOS','COSTO BASE PARA CALCULO DE PRECIOS DE VENTA AUTOMATICOS') returning_values (:BASE);
EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION','ARTICULOS','CODIGO DE LA LISTA DE PRECIOS BASE PARA CAMBIO DE PRECIOS AUTOMATICO') returning_values (LISTAREF);
EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION','ARTICULOS','DIFERENCIA EN PESOS MAXIMA A PERMITIR PARA CAMBIAR PRECIOS') returning_values (DIFMAX);
for select A.arti_cod, A.arti_des, A.arti_unidad, prar_fijo, prar_margen, prar_util, TAIV_PORC
    from precios_articulo p, articulo a, tarifa_iva T
    where a.arti_cod = p.arti_cod and lipr_cod = :lista and a.taiv_cod = t.taiv_cod order by A.arti_cod
    into :articulo, descr, :unidad, :fijo, :porc, :marg, :tariva
    do
    begin
    if (UOM <> 'UTILIDAD') then
        PORC = MARG;
    if (CAMBIO = 'COSTO') then
        BEGIN
        EXECUTE PROCEDURE COSTO_PROMEDIO (:ARTICULO, :FECHA) RETURNING_VALUES(:COSTOP);
        EXECUTE PROCEDURE ULTIMO_COSTO (:ARTICULO, :FECHA, :UNIDAD) RETURNING_VALUES(:COSTOU);
        if (base = 'ULTIMO') then
            COSTO = COSTOU;
        ELSE
            BEGIN
            COSTO = COSTOP;
            if (base = 'MAYOR') then
                if (COSTOP < COSTOU) then
                    COSTO = COSTOU;
            END
        SELECT LIPR_MODIF FROM LISTA_PRECIOS WHERE LIPR_COD = :lista INTO :IVAINC;
        if (IVAINC = 'S') then
            COSTO = COSTO * (1 + TARIVA/100);
        if (UOM = 'UTILIDAD') then
            SUGERIDO = COSTO * (1 + :PORC/100);
        ELSE
            SUGERIDO = COSTO / (1 - :PORC/100);
        END
    ELSE
        if (LISTA <> LISTAREF) then
            BEGIN
            SELECT PRAR_FIJO FROM PRECIOS_ARTICULO WHERE ARTI_COD = :articulo AND LIPR_COD = :LISTAREF INTO :SUGERIDO;
            if (IVAINC = 'S') then
                SUGERIDO = SUGERIDO / (1 + TARIVA/100);
            if (UOM = 'UTILIDAD') then
                SUGERIDO = SUGERIDO * (1 + :PORC/100);
            ELSE
                SUGERIDO = SUGERIDO / (1 - :PORC/100);
            END
    EXECUTE PROCEDURE REDONDEE (SUGERIDO, DIG) returning_values (SUGERIDO);
    DIFER = SUGERIDO - FIJO;
    if ((DIFER > DIFMAX) and (sugerido <> 0)) then
        suspend;
    end
end
^

SET TERM ; ^


/* 05-21 consultas inventario con fecha inicial y final */
SET TERM ^ ;

CREATE OR ALTER PROCEDURE MOVIMIENTO_INVENTARIO_MES(
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    CODIGO VARCHAR(15),
    DESCRIPCION VARCHAR(60),
    INICIAL NUMERIC(18,4),
    ENTRADA NUMERIC(18,4),
    SALIDA NUMERIC(18,4),
    FINAL NUMERIC(18,4))
AS
BEGIN
  for select arti_cod, arti_des from articulo order by arti_des into :CODIGO, :DESCRIPCION
  DO
    BEGIN
    EXECUTE PROCEDURE MOVIMIENTO_TOTAL_ARTICULO_MES(CODIGO, FECINI, FECFIN) returning_values (:INICIAL, :ENTRADA, :SALIDA);
    FINAL = INICIAL + ENTRADA - SALIDA;
    SUSPEND;
    END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER PROCEDURE KARDEX_INVENTARIO_MES(
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    CODIGO VARCHAR(15),
    DESCRIPCION VARCHAR(60),
    INICIAL NUMERIC(18,2),
    ENTRADA NUMERIC(18,2),
    SALIDA NUMERIC(18,2),
    FINAL NUMERIC(18,2))
AS
BEGIN
  for select arti_cod, arti_des from articulo into :CODIGO, :DESCRIPCION
  DO
    BEGIN
/*    EXECUTE PROCEDURE KARDEX_ARTICULO_MES(CODIGO, ANO, MES) returning_values (:INICIAL, :ENTRADA, :SALIDA); */
    FINAL = INICIAL + ENTRADA - SALIDA;
    SUSPEND;
    END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER PROCEDURE KARDEX_ARTICULO_MES(
    ARTICULO VARCHAR(15),
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    INICIAL NUMERIC(18,2),
    ENTRADA NUMERIC(18,2),
    SALIDA NUMERIC(18,2))
AS
BEGIN
  EXECUTE PROCEDURE VALOR_INICIAL_INVENTARIO(ARTICULO, FECINI) returning_values (INICIAL);
  SELECT SUM(COST_ENTP) FROM COSTOS
    WHERE (COST_FECHA >= :FECINI) AND (COST_FECHA < :FECFIN) AND
          (ARTI_COD = :ARTICULO) INTO :ENTRADA;
  if (ENTRADA IS NULL) then
    ENTRADA = 0;
  SELECT SUM(COST_SALP) FROM COSTOS
    WHERE (COST_FECHA >= :FECINI) AND (COST_FECHA < :FECFIN) AND
          (ARTI_COD = :ARTICULO) INTO :SALIDA;
  if (SALIDA IS NULL) then
    SALIDA = 0;
  SUSPEND;
END
^

SET TERM ; ^


SET TERM ^ ;

CREATE OR ALTER PROCEDURE KARDEX_INVENTARIO_MES(
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    CODIGO VARCHAR(15),
    DESCRIPCION VARCHAR(60),
    INICIAL NUMERIC(18,2),
    ENTRADA NUMERIC(18,2),
    SALIDA NUMERIC(18,2),
    FINAL NUMERIC(18,2))
AS
BEGIN
  for select arti_cod, arti_des from articulo into :CODIGO, :DESCRIPCION
  DO
    BEGIN
    EXECUTE PROCEDURE KARDEX_ARTICULO_MES(CODIGO, FECINI, FECFIN) returning_values (:INICIAL, :ENTRADA, :SALIDA);
    FINAL = INICIAL + ENTRADA - SALIDA;
    SUSPEND;
    END
END
^

SET TERM ; ^


/* 05-22 contabilizacion egresos redondeo GMF */
SET TERM ^ ;

CREATE OR ALTER PROCEDURE CONTABIL_EGRESO(
    IDDOC INTEGER,
    IDINTER INTEGER)
RETURNS (
    ERROR INTEGER,
    VER CHAR(1),
    IDC INTEGER)
AS
declare variable PREF VARCHAR(4);
declare variable NUM VARCHAR(6);
declare variable NUMERO VARCHAR(10);
declare variable FECAUX DATE;
declare variable FECHA CHAR(8);
declare variable CONC CHAR(120);
declare variable VRDTO NUMERIC(18, 2);
declare variable VRRTFTE NUMERIC(18, 2);
declare variable VRRTIVA NUMERIC(18, 2);
declare variable VRRTICA NUMERIC(18, 2);
declare variable VRTOTAL NUMERIC(18, 2);
declare variable TIPOCOMP VARCHAR(3);
declare variable PREFCONT VARCHAR(4);
declare variable BASE CHAR(1);
declare variable CTABASE VARCHAR(20);
declare variable CAJA CHAR(1);
declare variable CTACAJA VARCHAR(20);
declare variable RTFTE CHAR(1);
declare variable CTARTFTE VARCHAR(20);
declare variable RTIVA CHAR(1);
declare variable CTARTIVA VARCHAR(20);
declare variable RTICA CHAR(1);
declare variable CTARTICA VARCHAR(20);
declare variable DTO CHAR(1);
declare variable CTADTO VARCHAR(20);
declare variable EXISTE CHAR(1);
declare variable CUENTA VARCHAR(20);
declare variable MONTO NUMERIC(18,2);
declare variable ES_RETENCION CHAR(1);
declare variable TIPOCUEN CHAR(1);
declare variable NIT VARCHAR(20);
declare variable NOMBRE VARCHAR(60);
declare variable PROY VARCHAR(4);
declare variable CENTRO VARCHAR(4);
declare variable MONTOBASE NUMERIC(18,2);
declare variable PORC NUMERIC(9,2);
declare variable DEBITO NUMERIC(18,2);
declare variable CREDITO NUMERIC(18,2);
declare variable NROI INTEGER;
declare variable SUMA NUMERIC(18,2);
declare variable TCTACLIEN VARCHAR(20);
declare variable TCTARTFTE VARCHAR(20);
declare variable TCTARTIVA VARCHAR(20);
declare variable TCTARTICA VARCHAR(20);
declare variable TIPOIT INTEGER;
declare variable PREFIT VARCHAR(4);
declare variable NUMIT VARCHAR(6);
declare variable NUMEROIT VARCHAR(10);
declare variable ABONOIT NUMERIC(18,2);
declare variable CTADIC VARCHAR(20);
declare variable BASEADIC VARCHAR(20);
declare variable PORCADIC NUMERIC(5,2);
declare variable VALORADIC NUMERIC(18,2);
declare variable DBADIC CHAR(1);
declare variable VRBASE NUMERIC(18,2);
declare variable GMF CHAR(1);
declare variable CODBCO INTEGER;
declare variable NUMCHEQ VARCHAR(20);
BEGIN
/* BUSQUE LA INTERFACE */
EXISTE = 'N';
SELECT 'S', TICO_COD, PRCO_PRE, INCJ_BASE, INCJ_DTOPP, INCJ_RTFTE, INCJ_RTIVA, INCJ_RTICA, INCJ_CAJA, INCJ_CTABASE, INCJ_CTADTO, INCJ_CTARTFTE, INCJ_CTARTIVA, INCJ_CTARTICA, INCJ_CTACAJA, INCJ_CONFIRMAR
    FROM INTERFAZ_CAJA
    WHERE INCJ_ID = :IDINTER
    INTO :EXISTE, :TIPOCOMP, :PREFCONT, :BASE, :DTO, :RTFTE, :RTIVA, :RTICA, :CAJA, :CTABASE, :CTADTO, :CTARTFTE, :CTARTIVA, :CTARTICA, :CTACAJA, :VER;
if (EXISTE = 'S') then
    BEGIN
    DELETE FROM contabilizacion WHERE CNTB_TIPOREF = 62 AND CNTB_IDREF = :IDDOC;

    /* TRAIGA EL ENCABEZADO DEL EGRESO */
    SELECT PREF_PRE, EGRE_NUMERO, EGRE_FECHA, E.TERC_NIT, EGRE_CONC, EGRE_DTOF, EGRE_MONTO, EGRE_RTFTEMONTO, EGRE_RTIVAMONTO, EGRE_RTICAMONTO, TERC_NOM, TERC_CTARTFTE, TERC_CTARTIVA, TERC_CTARTICA, TERC_CTACLIENTE
        FROM EGRESOS E, TERCEROS T
        WHERE EGRE_ID = :IDDOC AND E.TERC_NIT = T.TERC_NIT
        INTO :PREF, :NUM, :FECAUX, :NIT, :CONC, :VRDTO, :VRTOTAL, :VRRTFTE, :VRRTIVA, :VRRTICA, :NOMBRE, TCTARTFTE, TCTARTIVA, TCTARTICA, TCTACLIEN;
    /* SI ES PROVEEDOR, SOBREESCIBE LAS CUENTAS  */
    SELECT PROV_CTAPAGAR, PROV_CTARTFTE, PROV_CTARTIVA, PROV_CTARTICA
        FROM PROVEEDORES WHERE TERC_NIT = :NIT
        INTO TCTACLIEN, TCTARTFTE, TCTARTIVA, TCTARTICA;
    NUMERO = PREF || NUM;
    SELECT PREF_CENTRO, PREF_PROY FROM PREFIJOS
        WHERE PREF_PRE = :PREF AND TIDO_COD = 62 INTO :CENTRO, :PROY;
    EXECUTE PROCEDURE FECHA_A_CONTA(:FECAUX) returning_values (:FECHA);
    /* REGISTRE EL ENCABEZADO CONTABLE */
    IDC = GEN_ID(ID_CONTABILIZA, 1);
    INSERT INTO CONTABILIZACION (CNTB_ID, CNTB_TIPOCOMP, CNTB_PREFCNT, CNTB_NUMERO, CNTB_FECHA, CNTB_CONCEPTO, CNTB_REF, CNTB_TIPOREF, CNTB_IDREF, CNTB_PREFREF, CNTB_NUMREF, CNTB_PROCESADO)
        VALUES (:IDC, :TIPOCOMP, :PREFCONT, :NUM, :FECHA, :CONC, '', 62, :IDDOC, :PREF, :NUM, 'N');
    NROI = 0;
    SUMA = 0;
    ERROR = 0;
    /* EL CREDITO EN LA CAJA O EL BANCO */
    IF ((CAJA = 'K')) THEN
        BEGIN
        if (VRTOTAL <> 0) then
            BEGIN
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTACAJA INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERROR (62, :IDDOC, :CTACAJA, 2);
                CUENTA = CTACAJA;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 4);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRTOTAL, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - VRTOTAL;
                END
            END /* VRTOTAL <> 0 */
        END /* CAJA CONSTANTE */
    IF ((CAJA = 'F')) THEN
        BEGIN
        /* mueva la cuenta de la caja o el banco o ambas */
        /* PRIMERO LA CAJA */
        FOR SELECT CAJA_CUENTA, EGCA_MONTO FROM EGRESOS_CAJA E, CAJAS C
            WHERE C.CAJA_ID = E.CAJA_ID AND EGRE_ID = :IDDOC
            INTO :CTACAJA, :MONTO
            DO
            BEGIN
            if (MONTO <> 0) then
                BEGIN
                CUENTA = NULL;
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :CTACAJA INTO :CUENTA, :TIPOCUEN;
                if (CUENTA IS NULL) then
                    begin
                    EXECUTE PROCEDURE ERROR (62, :IDDOC, :CTACAJA, 2);
                    CUENTA = CTACAJA;
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 4);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA - MONTO;
                    END
                END /* MONTO <> 0 */
            END /* DO CAJA */
        /* AHORA EL BANCO */
        MONTO = 0;
        SELECT CUBA_CTACONTA, EGBC_MONTO, EGBC_GMF, E.CUBA_COD, CUBA_GMFPOR, EGBC_NUMERO
            FROM EGRESOS_BANCO E, CUENTAS_BANCO C
            WHERE E.CUBA_COD = C.CUBA_COD AND EGRE_ID = :IDDOC
            INTO :CTACAJA, :MONTO, :GMF, :CODBCO, :PORC, :NUMCHEQ;
        if (MONTO <> 0) then
            BEGIN
            if (MONTO <> 0) then
                BEGIN
                CUENTA = NULL;
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :CTACAJA INTO :CUENTA, :TIPOCUEN;
                if (CUENTA IS NULL) then
                    begin
                    EXECUTE PROCEDURE ERROR (62, :IDDOC, :CTACAJA, 2);
                    CUENTA = CTACAJA;
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 4);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, :NUMCHEQ, 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA - MONTO;
                    END
                /* EL GMF */
                if ((GMF = 'S') AND (PORC <> 0)) then
                    BEGIN
                    EXECUTE procedure REDONDEE(:MONTO * :PORC / 1000, 0) returning_values (MONTO);
                    /* REGISTRE EL GMF EN LA MISMA CUENTA DEL BANCO COMO CREDITO */
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, :NUMCHEQ, 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA - MONTO;

                    /* AHORA LA CUENTA DEL GASTO */
                    SELECT CUBA_CTAGMF FROM CUENTAS_BANCO
                        where CUBA_COD = :CODBCO INTO :CTACAJA;
                    SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                        WHERE CUEN_COD = :CTACAJA INTO :CUENTA, :TIPOCUEN;
                    if (CUENTA IS NULL) then
                        begin
                        EXECUTE PROCEDURE ERROR (62, :IDDOC, :CTACAJA, 2);
                        CUENTA = CTACAJA;
                        TIPOCUEN = 'N';
                        ERROR = ERROR + 1;
                        end
                    if (TIPOCUEN = 'I') then
                        BEGIN
                        EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
                        TIPOCUEN = 'N';
                        ERROR = ERROR + 1;
                        END
                    if (TIPOCUEN = 'C') then
                        BEGIN
                        EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 4);
                        TIPOCUEN = 'N';
                        ERROR = ERROR + 1;
                        END
                    if (TIPOCUEN = 'N') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, :NUMCHEQ, :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NROI = NROI + 1;
                        SUMA = SUMA + MONTO;
                        END
                    END /* GMF */
                END /* MONTO <> 0 */
            END /* EGRESO_BANCO */
        END /* CAJA = F */
    if (DTO = 'K') then /* DTO EN CTA CONSTANTE */
        BEGIN
        if (VRDTO <> 0) then
            BEGIN
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTADTO INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERROR (62, :IDDOC, :CTADTO, 2);
                CUENTA = CTADTO;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 4);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRDTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - VRDTO;
                END
            END /* VRDTO <> 0 */
        END /* DTO EN CTA CONSTANTE */
    /* RETENCION FUENTE */
    if ((RTFTE = 'T') or (RTFTE = 'K')) then
      if (VRRTFTE <> 0) then
        BEGIN
        if (RTFTE = 'T') then
            CTARTFTE = TCTARTFTE;
        CUENTA = NULL;
        SELECT CUEN_COD, CUEN_RETENCION, CUEN_TIPO FROM CUENTAS
            WHERE CUEN_COD = :CTARTFTE INTO :CUENTA, :ES_RETENCION, :TIPOCUEN;
        if (CUENTA IS NULL) then
            begin
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :CTARTFTE, 2);
            CUENTA = CTARTFTE;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 4);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            if (ES_RETENCION = 'S') then
                BEGIN
                VRBASE = VRTOTAL;
                SELECT PROV_RETEFTE from proveedores where terc_nit = :NIT INTO :PORC;
                END
            ELSE
                BEGIN
                VRBASE = 0;
                PORC = 0;
                END
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, :VRBASE, :PORC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA - VRRTFTE;
            END
        END /* RTFTE */
    /* RETENCION IVA */
    if ((RTIVA = 'T') or (RTIVA = 'K')) then
      if (VRRTIVA <> 0) then
        BEGIN
        if (RTIVA = 'T') then
            CTARTIVA = TCTARTIVA;
        CUENTA = NULL;
        SELECT CUEN_COD, CUEN_RETENCION, CUEN_TIPO FROM CUENTAS
            WHERE CUEN_COD = :CTARTIVA INTO :CUENTA, :ES_RETENCION, :TIPOCUEN;
        if (CUENTA IS NULL) then
            begin
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :CTARTIVA, 2);
            CUENTA = CTARTIVA;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 4);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            if (ES_RETENCION = 'S') then
                BEGIN
                VRBASE = VRTOTAL;
                SELECT PROV_RTEIVA from proveedores where terc_nit = :NIT INTO :PORC;
                END
            ELSE
                BEGIN
                VRBASE = 0;
                PORC = 0;
                END
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTIVA, :VRBASE, :PORC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA - VRRTIVA;
            END
        END /* RTIVA */
    /* RETENCION DE ICA */
    if ((RTICA = 'T') or (RTICA = 'K')) then
      if (VRRTICA <> 0) then
        BEGIN
        if (RTICA = 'T') then
            CTARTICA = TCTARTICA;
        CUENTA = NULL;
        SELECT CUEN_COD, CUEN_RETENCION, CUEN_TIPO FROM CUENTAS
            WHERE CUEN_COD = :CTARTICA INTO :CUENTA, :ES_RETENCION, :TIPOCUEN;
        if (CUENTA IS NULL) then
            begin
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :CTARTICA, 2);
            CUENTA = CTARTICA;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 4);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            if (ES_RETENCION = 'S') then
                BEGIN
                VRBASE = VRTOTAL;
                SELECT PROV_RTEICA from proveedores where terc_nit = :NIT INTO :PORC;
                END
            ELSE
                BEGIN
                VRBASE = 0;
                PORC = 0;
                END
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTICA, :VRBASE, :PORC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA - VRRTICA;
            END
        END /* RTICA */
    /* RECORRA LAS CUENTAS DE EGRESOS_CONTABILIDAD */
    FOR SELECT CUEN_COD, EGCO_NIT, EGCO_PROY, EGCO_CENTRO, EGCO_CONC, EGCO_DEBITOS, EGCO_CREDITOS, EGCO_BASEM, EGCO_PORC
        FROM EGRESOS_CONTABILIDAD WHERE EGRE_ID = :IDDOC ORDER BY EGCO_ITEM
        INTO :CTABASE, :NIT, :PROY, :CENTRO, :CONC, :DEBITO, :CREDITO, :MONTOBASE, :PORC
        DO
        BEGIN
        CUENTA = NULL;
        SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
            WHERE CUEN_COD = :CTABASE INTO :CUENTA, :TIPOCUEN;
        if (CUENTA IS NULL) then
            begin
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :CTABASE, 2);
            CUENTA = CTABASE;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 4);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'N') then
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :DEBITO, :CREDITO, :MONTOBASE, :PORC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
        SUMA = SUMA + DEBITO - CREDITO;
        NROI = NROI + 1;
        END
    /* CIERRE EL COMPROBANTE CONTRA LA CUENTA DEL TERCERO O LA BASE CONSTANTE */
    if ((SUMA <> 0) and (BASE = 'F') or (BASE = 'T') or (BASE = 'K')) then
        BEGIN
        if (SUMA < 0) then
            BEGIN
            DEBITO = SUMA * -1;
            CREDITO = 0;
            END
        ELSE
            BEGIN
            DEBITO = 0;
            CREDITO = SUMA;
            END
        if (BASE = 'T') then
            CTABASE = TCTACLIEN;
        if (BASE = 'F') then
            BEGIN
            SELECT CAJA_CUENTA FROM EGRESOS E, CAJAS C
                WHERE C.CAJA_ID = E.CAJA_ID AND EGRE_ID = :IDDOC INTO :CTABASE;
            END
        CUENTA = NULL;
        SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
            WHERE CUEN_COD = :CTABASE INTO :CUENTA, :TIPOCUEN;
        IF (CUENTA IS NULL) then
            begin
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :CTABASE, 2);
            CUENTA = CTABASE;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            /* DEBERIA RECORRER DOCUMENTO POR DOCUMENTO */
            FOR SELECT RCDE_TIPODOC, RCDE_PREFIJO, RCDE_NUMERO, RCDE_ABONO+RCDE_RTFTE+RCDE_RTIVA+RCDE_RTICA+RCDE_DTOF
                FROM RECIBOS_CAJA_DETALLE WHERE RECA_ID = :IDDOC
                INTO :TIPOIT, PREFIT, NUMIT, ABONOIT
                DO
                BEGIN
                NUMEROIT = PREFIT || NUMIT;
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :ABONOIT, 0, 0, :NIT, :PROY, :CENTRO, NULL, :NUMEROIT, NULL, NULL, :TIPOIT, 0);
                NROI = NROI + 1;
                END
            END
        if (TIPOCUEN = 'N') then
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :DEBITO, :CREDITO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
        NROI = NROI + 1;
        END /* SUMA EN CARTERA */
    /* recorra las cuentas adicionales */
    FOR SELECT INJC_CUENTA, INJC_BASE, INJC_PORC, INJC_VALOR, INJC_DB
        FROM INTERFAZ_CAJA_CTAS
        WHERE INCJ_ID = :IDINTER
        INTO :CTADIC, :BASEADIC, :PORCADIC, :VALORADIC, :DBADIC
        DO
        BEGIN
        if (:BASEADIC = 'TOTAL') then
            VALORADIC = VRTOTAL;
        if (:BASEADIC = 'DESCUENTO') then
            VALORADIC = VRDTO;
        if (:BASEADIC = 'RTFTE') then
            VALORADIC = VRRTFTE;
        if (:BASEADIC = 'RTIVA') then
            VALORADIC = VRRTIVA;
        if (:BASEADIC = 'RTICA') then
            VALORADIC = VRRTICA;
        MONTO = VALORADIC * PORCADIC;
        CUENTA = NULL;
        SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
            WHERE CUEN_COD = :CTADIC INTO :CUENTA, :TIPOCUEN;
        IF (CUENTA IS NULL) THEN
            begin
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :CTADIC, 2);
            CUENTA = CTADIC;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 4);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            if (DBADIC = 'S') then
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTADIC, :CONC, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            ELSE
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTADIC, :CONC, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            END
        NROI = NROI + 1;
        END
    if (ERROR > 0) then
        VER = 'S';
    SUSPEND;
    END /* EXISTE LA INTERFAZ */
  ELSE
    BEGIN
    EXECUTE PROCEDURE ERROR (62, :IDDOC, :PREF, 1);
    ERROR = ERROR + 1;
    VER = 'S';
    SUSPEND;
    END
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE EGRESOS_SIN_CONTABILIDAD(
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    ID INTEGER,
    IDI INTEGER,
    IDC INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    ESTADO VARCHAR(20),
    ERROR INTEGER)
AS
DECLARE VARIABLE VER CHAR(2);
declare variable FECICNT VARCHAR(10);
declare variable FECFCNT VARCHAR(10);
declare variable idref INTEGER;
BEGIN /*$$IBE$$ 
EXECUTE PROCEDURE fecha_a_conta(FECINI) returning_values (FECICNT);
EXECUTE PROCEDURE fecha_a_conta(FECFIN) returning_values (FECFCNT);
FOR SELECT EGRE_ID, PREF_PRE, egre_numero FROM EGRESOS WHERE EGRE_ANULADO = 'N' AND PREF_PRE <> 'R004' AND
    EGRE_FECHA >= :FECINI AND EGRE_FECHA <= :FECFIN ORDER BY EGRE_ID INTO :ID, :PREF, :NUMERO
DO
  BEGIN
  idref = null;
  SELECT ENCO_IDREF FROM COMPROBANTE_ENCABEZADO WHERE ENCO_TIPOREF = 62 AND ENCO_FECHA >= :FECICNT AND ENCO_FECHA <= :FECFCNT and ENCO_IDREF = :ID into :idref;
  if (idref IS NULL) then
  begin
   ESTADO = 'PROCESANDO';
   SUSPEND;
   SELECT MAX(INCJ_ID) FROM INTERFAZ_CAJA WHERE PREF_PRE = :PREF AND TIDO_COD = 62 INTO :IDI;
   EXECUTE PROCEDURE CONTABIL_EGRESO (:ID, :IDI) RETURNING_VALUES (:ERROR, :VER, :IDC);
   IF (ERROR = 0) THEN
      BEGIN
      EXECUTE PROCEDURE CONTABILIZA_PENDIENTE (:IDC);
      ESTADO = 'OK';
      END
   ELSE
    ESTADO = 'ERROR';
   suspend;
  end
  END
 $$IBE$$*/ SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE EGRESOS_SIN_CONTABILIDAD(
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    ID INTEGER,
    IDI INTEGER,
    IDC INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    ESTADO VARCHAR(20),
    ERROR INTEGER)
AS
DECLARE VARIABLE VER CHAR(2);
declare variable FECICNT VARCHAR(10);
declare variable FECFCNT VARCHAR(10);
declare variable idref INTEGER;
BEGIN
EXECUTE PROCEDURE fecha_a_conta(FECINI) returning_values (FECICNT);
EXECUTE PROCEDURE fecha_a_conta(FECFIN) returning_values (FECFCNT);
FOR SELECT EGRE_ID, PREF_PRE, egre_numero FROM EGRESOS WHERE EGRE_ANULADO = 'N' AND PREF_PRE <> 'R004' AND
    EGRE_FECHA >= :FECINI AND EGRE_FECHA <= :FECFIN ORDER BY EGRE_ID INTO :ID, :PREF, :NUMERO
DO
  BEGIN
  idref = null;
  SELECT ENCO_IDREF FROM COMPROBANTE_ENCABEZADO WHERE ENCO_TIPOREF = 62 AND ENCO_FECHA >= :FECICNT AND ENCO_FECHA <= :FECFCNT and ENCO_IDREF = :ID into :idref;
  if (idref IS NULL) then
  begin
   ESTADO = 'PROCESANDO';
   SUSPEND;
   SELECT MAX(INCJ_ID) FROM INTERFAZ_CAJA WHERE PREF_PRE = :PREF AND TIDO_COD = 62 INTO :IDI;
   EXECUTE PROCEDURE CONTABIL_EGRESO (:ID, :IDI) RETURNING_VALUES (:ERROR, :VER, :IDC);
   IF (ERROR = 0) THEN
      BEGIN
      EXECUTE PROCEDURE CONTABILIZA_PENDIENTE (:IDC);
      ESTADO = 'OK';
      END
   ELSE
    ESTADO = 'ERROR';
   suspend;
  end
  END
END

^

SET TERM ; ^

/* 05-23 replicacion con usuario y clave fijos */

INSERT INTO CONFIGURACION (CONF_MODULO, CONF_CATEGORIA, CONF_PROPIEDAD, CONF_VALOR, CONF_POSIBLES, CONF_AYUDA) VALUES ('INVENTARIO', 'ARTICULOS', 'CLAVE DE USUARIO PARA REPLICACION DE ARTICULOS', 'REPLICA', '', 'Indique la clave asignda al usuario de replicación que se usará para enviar la información a los demás servidores');
INSERT INTO CONFIGURACION (CONF_MODULO, CONF_CATEGORIA, CONF_PROPIEDAD, CONF_VALOR, CONF_POSIBLES, CONF_AYUDA) VALUES ('INVENTARIO', 'ARTICULOS', 'NOMBRE DE USUARIO PARA REPLICACION DE ARTICULOS', 'REPLICA', '', 'Indique el nombre de usuario creado en todos los servidores a los que se conectará el sistema para replicar los artículos');
commit work;

SET TERM ^ ;

CREATE OR ALTER PROCEDURE IMPR_FACTURA(
    ID INTEGER)
RETURNS (
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    VENCE DATE,
    DIASVENCE INTEGER,
    CONTCRED CHAR(17),
    NIT VARCHAR(20),
    NOMTERCERO VARCHAR(60),
    VENDEDOR INTEGER,
    NOMVENDEDOR VARCHAR(60),
    PUNTOVTA INTEGER,
    NOMPUNTOVTA VARCHAR(30),
    CODBODEGA VARCHAR(2),
    NOMBODEGA VARCHAR(30),
    AUTORIZACION VARCHAR(20),
    DESPACHO VARCHAR(255),
    TRANSPORTADOR VARCHAR(60),
    COTIZACION VARCHAR(30),
    PEDIDO VARCHAR(30),
    REMISION VARCHAR(30),
    PACIENTE VARCHAR(20),
    NOMPACIENTE VARCHAR(60),
    COMIPORC NUMERIC(9,2),
    COMIMONTO NUMERIC(18,2),
    SUBTOTAL NUMERIC(18,2),
    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),
    EXTRA NUMERIC(18,2),
    DTOFPORC NUMERIC(9,2),
    DTOFMONTO NUMERIC(18,2),
    FECHADTO DATE,
    TOTALFAC NUMERIC(18,2),
    TOTALPAGAR NUMERIC(18,2),
    OBS BLOB SUB_TYPE 1 SEGMENT SIZE 80,
    ITEM INTEGER,
    ARTICULO VARCHAR(15),
    CODBAR VARCHAR(15),
    ARTIDES VARCHAR(60),
    CANT NUMERIC(18,4),
    LOTE VARCHAR(15),
    VLOTE DATE,
    UNIDAD VARCHAR(8),
    FACTOR INTEGER,
    LISTAPR INTEGER,
    REFITEM VARCHAR(60),
    BODITEM VARCHAR(2),
    PRUNIT NUMERIC(18,2),
    DTOITPORC NUMERIC(9,2),
    DTOITMONTO NUMERIC(18,2),
    PRNETO NUMERIC(18,2),
    IVAPORC NUMERIC(9,2),
    IVAITMONTO NUMERIC(18,2),
    CONSUMO NUMERIC(18,2),
    SUBTOTIT NUMERIC(18,2),
    SUBTOTITCON NUMERIC(18,2),
    TOTAL NUMERIC(18,2),
    CODIGOCL VARCHAR(20),
    ZONACOD VARCHAR(2),
    ZONANOM VARCHAR(60),
    DV CHAR(1),
    DIRECCION VARCHAR(60),
    CIUDAD VARCHAR(40),
    TELEFONO VARCHAR(40),
    CONTACTO VARCHAR(60),
    FAX VARCHAR(25),
    GRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    SUBGRUPO VARCHAR(3),
    NOMSUBG VARCHAR(30),
    MARCA VARCHAR(3),
    NOMMARCA VARCHAR(30),
    PESO NUMERIC(18,4),
    ANCHO NUMERIC(18,4),
    ALTO NUMERIC(18,4),
    LARGO NUMERIC(18,4),
    SUMA1 NUMERIC(18,2),
    SUMA2 NUMERIC(18,2),
    SUMA3 NUMERIC(18,2),
    IVA1 NUMERIC(18,2),
    IVA2 NUMERIC(18,2),
    IVA3 NUMERIC(18,2),
    SUMAEX NUMERIC(18,2),
    SUMAGR NUMERIC(18,2),
    TOTCONSUMO NUMERIC(18,2),
    VEHICULO VARCHAR(8),
    RECIBIDO NUMERIC(18,2),
    CAMBIO NUMERIC(18,2),
    HORA TIME,
    FORMAPAGO1 VARCHAR(30),
    MONTOPAGO1 NUMERIC(18,2),
    FORMAPAGO2 VARCHAR(30),
    MONTOPAGO2 NUMERIC(18,2),
    FORMAPAGO3 VARCHAR(30),
    MONTOPAGO3 NUMERIC(18,2),
    PUNTOS INTEGER,
    PUNTOSACUM INTEGER,
    PUNTOSVENC INTEGER)
AS
DECLARE VARIABLE IMPTOS CHAR(1);
DECLARE VARIABLE TARIFA INTEGER;
declare variable DEVUELTO NUMERIC(18,2);
/*DECLARE VARIABLE NROCOPIA INTEGER;*/
declare variable ORDENCOD CHAR(2);
declare variable IMPRDEV CHAR(2);
declare variable IMPR CHAR(1);
declare variable ITEMFP INTEGER;
declare variable FORMAP VARCHAR(30);
declare variable MONTOP NUMERIC(18,2);
declare variable SUCUR VARCHAR(10);
BEGIN
  SELECT F.PREF_PRE, FACT_NUMERO, FACT_FECHA, FACT_VENCE, F.BODE_COD, BODE_NOM, F.TERC_NIT, FACT_NOMCLIENTE, F.VEND_COD, VEND_NOMBRE, F.PTVT_ID, PTVT_NOM,
    AUTO_NUMERO, FACT_DESPACHO, FACT_TRANSP, FACT_COTIZACI, FACT_PEDIDO, FACT_REMISION, FACT_COMIPORC, FACT_COMIMONTO, FACT_IVAINC, 
    FACT_DTOPOR, FACT_DTOMONTO, FACT_ADICIONAL, FACT_IVAMONTO, FACT_RTFTEPOR, FACT_RTFTEMONTO, FACT_RTIVAPOR, FACT_RTIVAMONTO, FACT_RTICAPOR, FACT_RTICAMONTO, FACT_EXTRA, FACT_DTOFPOR, FACT_DTOFMONTO, FACT_DTOFFECHA, FACT_TOTAL,
    TERC_DIR, TERC_CIU, TERC_TEL, TERC_CONTACTO, TERC_FAX, TERC_DV,
    FACT_OBS, VEHI_COD, /*FACT_NROCOPIA,*/ FACT_RECIBIDO, FACT_SUCURSAL, FACT_DETCLI, FACT_DETCLINOM
    FROM FACTURAS F, BODEGA B, VENDEDORES V, PUNTO_VENTA P, TERCEROS T
    WHERE F.BODE_COD = B.BODE_COD AND F.VEND_COD = V.VEND_COD AND F.PTVT_ID = P.PTVT_ID AND F.TERC_NIT = T.TERC_NIT AND F.FACT_ID = :ID
    into :PREF, :NUMERO, :FECHA, :VENCE, :CODBODEGA, :NOMBODEGA, :NIT, :NOMTERCERO, :VENDEDOR, :NOMVENDEDOR, :PUNTOVTA, :NOMPUNTOVTA,
    :AUTORIZACION, :DESPACHO, :TRANSPORTADOR, :COTIZACION, :PEDIDO, :REMISION, :COMIPORC, :COMIMONTO, :IMPTOS,
    :DTOPORC, :DTOMONTO, :ADICIONAL, :IVAMONTO, :RTEFTEPORC, :RTEFTEMONTO, :RTEIVAPORC, :RTEIVAMONTO, :RTEICAPORC, :RTEICAMONTO, :EXTRA, :DTOFPORC, :DTOFMONTO, :FECHADTO, :TOTALFAC,
    :DIRECCION, :CIUDAD, :TELEFONO, :CONTACTO, :FAX, :DV, :OBS, :VEHICULO,/* :NROCOPIA,*/ :RECIBIDO, :SUCUR, :paciente, :nompaciente;

  /* ACUMULE LOS PUNTOS, SE HACE ACA POR SER POSTERIOR AL DETALLE */
  EXECUTE PROCEDURE acumula_puntos_cliente (31, :id, :nit, :fecha) returning_values (:PUNTOS);
  EXECUTE PROCEDURE consulta_puntos_cliente (:id, :nit, :fecha) returning_values (:puntos, :puntosacum, :puntosvenc);

  SELECT CLIE_COD, C.ZONA_COD, ZONA_NOM
    FROM CLIENTES C, ZONAS Z
    WHERE TERC_NIT = :NIT AND C.ZONA_COD = Z.ZONA_COD
    INTO :CODIGOCL, :ZONACOD, :ZONANOM;
  /*SELECT NOCO_NOMBRE FROM NOMBRES_COPIAS where NOCO_ID = :NROCOPIA INTO :NOMCOPIA;*/
  SELECT CLSU_DIR, CLSU_CIUDAD, CLSU_TEL FROM CLIENTE_SUCURSALES WHERE TERC_NIT = :NIT AND CLCU_COD = :SUCUR
    INTO :DIRECCION, :CIUDAD, :TELEFONO;
  /*if (NOMCOPIA IS NULL) then
    NOMCOPIA = 'COPIA No. ' || NROCOPIA;**/
  DIASVENCE = VENCE - FECHA;
  if (DIASVENCE > 0) then
    CONTCRED = 'CREDITO ' || CAST(DIASVENCE AS VARCHAR(3)) || ' DIAS';
  ELSE
    CONTCRED = 'CONTADO';
  SUBTOTAL = TOTALFAC - EXTRA - IVAMONTO - ADICIONAL + DTOMONTO;
  TOTALPAGAR = TOTALFAC - RTEFTEMONTO - RTEIVAMONTO - RTEICAMONTO;
  if (RECIBIDO <> 0) then
      CAMBIO = RECIBIDO - totalpagar;
  ELSE
    CAMBIO = 0;
  SUMAEX = 0;
  SUMA1 = 0;
  SUMA2 = 0;
  SUMA3 = 0;
  IVA1 = 0;
  IVA2 = 0;
  IVA3 = 0;
  TOTCONSUMO = 0;
  MONTOPAGO1 = 0;
  SELECT MAX(AUDI_HORA) FROM AUDITORIA WHERE TIDO_COD = 31 AND AUDI_IDDOC = :ID AND AUDI_OPER = 'I' INTO :HORA;
  /* AHORA LAS FORMAS DE PAGO, BUSQUE EL ABONO DE HOY A LA FACTURA */
  ITEMFP = 1;
  MONTOPAGO1 = 0;
  MONTOPAGO2 = 0;
  MONTOPAGO3 = 0;
  FOR SELECT FOPA_NOM, RCPA_MONTO FROM RECIBOS_CAJA_PAGO P, FORMAS_PAGO F, RECIBOS_CAJA R, RECIBOS_CAJA_DETALLE D
    WHERE R.RECA_ID = P.RECA_ID AND R.RECA_ID = D.RECA_ID AND P.FOPA_ID = F.FOPA_ID AND RECA_FECHA = :FECHA AND RCDE_TIPODOC = 31 AND RCDE_IDDOC = :ID
    INTO :formap, :MONTOP
    DO
    BEGIN
    if (ITEMFP = 1) then
        BEGIN
        FORMAPAGO1 = FORMAP;
        MONTOPAGO1 = MONTOP;
        END
    if (ITEMFP = 2) then
        BEGIN
        FORMAPAGO2 = FORMAP;
        MONTOPAGO2 = MONTOP;
        END
    if (ITEMFP = 3) then
        BEGIN
        FORMAPAGO3 = FORMAP;
        MONTOPAGO3 = MONTOP;
        END
    ITEMFP = ITEMFP + 1;
    END
  EXECUTE PROCEDURE lee_configuracion ('FACTURACION','DOCUMENTOS','ORDENAR ITEMS POR CODIGO DE ARTICULO') returning_values (:ORDENCOD);
  EXECUTE PROCEDURE lee_configuracion ('FACTURACION','POS', 'IMPRIMIR DEVOLUCIONES DE ARTICULOS NEGATIVOS') returning_values (:imprdev);
  if (ORDENCOD = 'SI') then
    BEGIN
    FOR SELECT FADE_ITEM, D.ARTI_COD, FADE_CODBAR, SUBSTR(FADE_DESC,1,60), FADE_CANT, FADE_UNIDAD, FADE_FACTOR, BODE_COD, FADE_LOTE, LIPR_COD, FADE_PRUNIT, FADE_DTOPORC, FADE_DTOMONTO, FADE_IVAPORC, FADE_IVAMONTO, FADE_CONSUMO, FADE_TOTAL, FADE_REFERENCIA,
        GRUP_COD, SUBG_COD, MARC_COD, ARTI_PESO, ARTI_ANCHO, ARTI_ALTO, ARTI_LARGO, TAIV_COD, FADE_DEVUELTO
        FROM FACTURAS_DETALLE D, ARTICULO A
        WHERE D.ARTI_COD = A.ARTI_COD AND D.FACT_ID = :ID
        ORDER BY D.ARTI_COD
        INTO :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :FACTOR, :BODITEM, :LOTE, :LISTAPR, :PRUNIT, :DTOITPORC, :DTOITMONTO, :IVAPORC, :IVAITMONTO, :CONSUMO, :TOTAL, :refitem,
        :GRUPO, :SUBGRUPO, :MARCA, :PESO, :ANCHO, :ALTO, :LARGO, :TARIFA, :devuelto
        DO
          BEGIN
          if (ARTICULO = CODBAR) then
            SELECT FIRST 1 COBA_COD FROM barras_articulo WHERE ARTI_COD = :articulo INTO :CODBAR;
          if (IMPRDEV <> 'SI') then
            BEGIN
            if ((CANT >= 0) AND (DEVUELTO = 0)) then
                IMPR = 'S';
            ELSE
                IMPR = 'N'; /* ES DEVOLUCION */
            END
          ELSE
            IMPR = 'S';
          if (IMPR = 'S') then
            BEGIN
            if (IMPTOS = 'S') then
                if (cant <> 0) then
                    PRNETO = PRUNIT - DTOITMONTO - ((IVAITMONTO+CONSUMO) / CANT);
                else
                    PRNETO = PRUNIT - DTOITMONTO;
            ELSE
                PRNETO = PRUNIT - DTOITMONTO;
            SUBTOTIT = TOTAL - IVAITMONTO - CONSUMO;
            SUBTOTITCON = TOTAL;
            TOTCONSUMO = TOTCONSUMO + CONSUMO;
            SELECT LOTE_VENCE FROM LOTES WHERE LOTE_NRO = :lote AND ARTI_COD = :ARTICULO INTO :vlote;
            if (TARIFA = 0) then
                SUMAEX = SUMAEX + TOTAL;
            if (TARIFA = 1) then
                BEGIN
                SUMA1 = SUMA1 + TOTAL - IVAITMONTO;
                IVA1 = IVA1 + IVAITMONTO;
                END
            if (TARIFA = 2) then
                BEGIN
                SUMA2 = SUMA2 + TOTAL - IVAITMONTO;
                IVA2 = IVA2 + IVAITMONTO;
                END
            if (TARIFA = 3) then
                BEGIN
                SUMA3 = SUMA3 + TOTAL - IVAITMONTO;
                IVA3 = IVA3 + IVAITMONTO;
                END
            SUMAGR = SUMA1 + SUMA2 + SUMA3;
            if (IMPTOS = 'N') then
                TOTAL = TOTAL - IVAITMONTO - CONSUMO;
            if (ANCHO IS NULL) then
                ANCHO = 0;
            if (ALTO IS NULL) then
                ALTO = 0;
            if (LARGO IS NULL) then
                LARGO = 0;
            if (PESO IS NULL) then
                PESO = 0;
            PESO = PESO * CANT;
            SUSPEND;
            END
          END
    END
ELSE
    BEGIN
    FOR SELECT FADE_ITEM, D.ARTI_COD, FADE_CODBAR, SUBSTR(FADE_DESC,1,60), FADE_CANT, FADE_UNIDAD, FADE_FACTOR, BODE_COD, FADE_LOTE, LIPR_COD, FADE_PRUNIT, FADE_DTOPORC, FADE_DTOMONTO, FADE_IVAPORC, FADE_IVAMONTO, FADE_CONSUMO, FADE_TOTAL, FADE_REFERENCIA,
        GRUP_COD, SUBG_COD, MARC_COD, ARTI_PESO, ARTI_ANCHO, ARTI_ALTO, ARTI_LARGO, TAIV_COD, FADE_DEVUELTO
        FROM FACTURAS_DETALLE D, ARTICULO A
        WHERE D.ARTI_COD = A.ARTI_COD AND D.FACT_ID = :ID
        ORDER BY FADE_ITEM
        INTO :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :FACTOR, :BODITEM, :LOTE, :LISTAPR, :PRUNIT, :DTOITPORC, :DTOITMONTO, :IVAPORC, :IVAITMONTO, :CONSUMO, :TOTAL, :refitem, 
        :GRUPO, :SUBGRUPO, :MARCA, :PESO, :ANCHO, :ALTO, :LARGO, :TARIFA, :devuelto
        DO
          BEGIN
          if (IMPRDEV <> 'SI') then
            BEGIN
            if ((CANT >= 0) AND (DEVUELTO = 0)) then
                IMPR = 'S';
            ELSE
                IMPR = 'N'; /* ES DEVOLUCION */
            END
          ELSE
            IMPR = 'S';
          if (IMPR = 'S') then
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :GRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :MARCA INTO NOMMARCA;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :SUBGRUPO AND GRUP_COD = :GRUPO INTO :NOMSUBG;
            if (IMPTOS = 'S') then
              PRNETO = PRUNIT - DTOITMONTO - ((IVAITMONTO+CONSUMO) / CANT);
            ELSE
              PRNETO = PRUNIT - DTOITMONTO;
            SUBTOTIT = TOTAL - IVAITMONTO - CONSUMO;
            SUBTOTITCON = TOTAL;
            TOTCONSUMO = TOTCONSUMO + CONSUMO;
            SELECT LOTE_VENCE FROM LOTES WHERE LOTE_NRO = :lote AND ARTI_COD = :ARTICULO INTO :vlote;
            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;
            if (ANCHO IS NULL) then
                ANCHO = 0;
            if (ALTO IS NULL) then
                ALTO = 0;
            if (LARGO IS NULL) then
                LARGO = 0;
            if (PESO IS NULL) then
                PESO = 0;
            PESO = PESO * CANT;
            SUSPEND;
            END
          END
    END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER PROCEDURE IMPR_REMISION(
    ID INTEGER)
RETURNS (
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    NIT VARCHAR(20),
    NOMTERCERO VARCHAR(60),
    VENDEDOR INTEGER,
    NOMVENDEDOR VARCHAR(60),
    PUNTOVTA INTEGER,
    NOMPUNTOVTA VARCHAR(30),
    CODBODEGA VARCHAR(2),
    NOMBODEGA VARCHAR(30),
    COTIZACION VARCHAR(30),
    PEDIDO VARCHAR(30),
    FACTURA VARCHAR(30),
    SUBTOTAL NUMERIC(18,2),
    IVAMONTO NUMERIC(18,2),
    TOTALFAC NUMERIC(18,2),
    DESPACHO VARCHAR(255),
    TRANSPORTADOR VARCHAR(60),
    OBS BLOB SUB_TYPE 1 SEGMENT SIZE 80,
    ITEM INTEGER,
    ARTICULO VARCHAR(15),
    CODBAR VARCHAR(15),
    ARTIDES VARCHAR(60),
    CANT NUMERIC(18,4),
    LOTE VARCHAR(15),
    VLOTE DATE,
    UNIDAD VARCHAR(8),
    DEVUELTO NUMERIC(18,4),
    LISTAPR INTEGER,
    REFITEM VARCHAR(60),
    BODITEM VARCHAR(2),
    PRUNIT NUMERIC(18,2),
    DTOITPORC NUMERIC(9,2),
    DTOITMONTO NUMERIC(18,2),
    SUBTOTALITEM NUMERIC(18,2),
    PRNETOSINIVA NUMERIC(18,2),
    PRNETO NUMERIC(18,2),
    IVAPORC NUMERIC(9,2),
    IVAITMONTO NUMERIC(18,2),
    CONSUMO NUMERIC(18,2),
    TOTAL NUMERIC(18,2),
    CODIGOCL VARCHAR(20),
    ZONACOD VARCHAR(2),
    ZONANOM VARCHAR(60),
    DV CHAR(1),
    DIRECCION VARCHAR(60),
    CIUDAD VARCHAR(40),
    TELEFONO VARCHAR(40),
    CONTACTO VARCHAR(60),
    FAX VARCHAR(25),
    GRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    SUBGRUPO VARCHAR(3),
    NOMSUBG VARCHAR(30),
    MARCA VARCHAR(3),
    NOMMARCA VARCHAR(30),
    PESO NUMERIC(9,4),
    ANCHO NUMERIC(18,4),
    ALTO NUMERIC(18,4),
    LARGO NUMERIC(18,4),
    SUMA1 NUMERIC(18,2),
    SUMA2 NUMERIC(18,2),
    SUMA3 NUMERIC(18,2),
    IVA1 NUMERIC(18,2),
    IVA2 NUMERIC(18,2),
    IVA3 NUMERIC(18,2),
    SUMAEX NUMERIC(18,2),
    SUMAGR NUMERIC(18,2))
AS
DECLARE VARIABLE IMPTOS CHAR(1);
DECLARE VARIABLE TARIFA INTEGER;
declare variable ORDENCOD CHAR(2);
declare variable SUCUR VARCHAR(10);
BEGIN
  /*  */
  SELECT F.PREF_PRE, REVT_NUMERO, REVT_FECHA, F.BODE_COD, BODE_NOM, F.TERC_NIT, REVT_NOMTERC, F.VEND_COD, VEND_NOMBRE, F.PTVT_ID, PTVT_NOM,
    REVT_COTIZACI, REVT_PEDIDO, REVT_FACTURA, REVT_IVAINC,
    REVT_IVAMONTO, REVT_TOTAL, REVT_DESPACHO, REVT_TRANSP,
    TERC_CONTACTO, TERC_FAX, TERC_DV, REVT_OBS, REVT_SUCURSAL
    FROM REMISIONES_VENTA F, BODEGA B, VENDEDORES V, PUNTO_VENTA P, TERCEROS T
    WHERE F.BODE_COD = B.BODE_COD AND F.VEND_COD = V.VEND_COD AND F.PTVT_ID = P.PTVT_ID AND F.TERC_NIT = T.TERC_NIT AND F.REVT_ID = :ID
    into :PREF, :NUMERO, :FECHA, :CODBODEGA, :NOMBODEGA, :NIT, :NOMTERCERO, :VENDEDOR, :NOMVENDEDOR, :PUNTOVTA, :NOMPUNTOVTA,
    :COTIZACION, :PEDIDO, :FACTURA, :IMPTOS,
    :IVAMONTO, :TOTALFAC, :DESPACHO, :transportador, 
    :CONTACTO, :FAX, :DV, :OBS, :SUCUR;
  SUBTOTAL = TOTALFAC - IVAMONTO;

  SELECT CLIE_COD, C.ZONA_COD, ZONA_NOM
    FROM CLIENTES C, ZONAS Z
    WHERE TERC_NIT = :NIT AND C.ZONA_COD = Z.ZONA_COD
    INTO :CODIGOCL, :ZONACOD, :ZONANOM;
  SELECT CLSU_DIR, CLSU_CIUDAD, CLSU_TEL FROM CLIENTE_SUCURSALES WHERE TERC_NIT = :NIT AND CLCU_COD = :SUCUR
    INTO :DIRECCION, :CIUDAD, :TELEFONO;
    
  SUMAEX = 0;
  SUMA1 = 0;
  SUMA2 = 0;
  SUMA3 = 0;
  IVA1 = 0;
  IVA2 = 0;
  IVA3 = 0;
  ITEM = 0;
  EXECUTE PROCEDURE lee_configuracion ('FACTURACION','DOCUMENTOS','ORDENAR ITEMS POR CODIGO DE ARTICULO') returning_values (:ORDENCOD);
  if (ORDENCOD = 'SI') then
    BEGIN
    FOR SELECT D.ARTI_COD, RVDE_CODBAR, SUBSTR(RVDE_DESC,1,60), RVDE_CANT, RVDE_UNIDAD, BODE_COD, RVDE_LOTE, LIPR_COD, RVDE_PRUNIT, RVDE_DTOPORC, RVDE_DTOMONTO, RVDE_IVAPORC, RVDE_IVAMONTO, RVDE_CONSUMO, RVDE_TOTAL, RVDE_REFERENCIA,
        GRUP_COD, SUBG_COD, MARC_COD, ARTI_PESO, ARTI_ANCHO, ARTI_ALTO, ARTI_LARGO, TAIV_COD, RVDE_DEVUELTO
        FROM REMISIONES_VENTA_DETALLE D, ARTICULO A
        WHERE D.ARTI_COD = A.ARTI_COD AND D.REVT_ID = :ID
        ORDER BY RVDE_CODBAR
        INTO :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :BODITEM, :LOTE, :LISTAPR, :PRUNIT, :DTOITPORC, :DTOITMONTO, :IVAPORC, :IVAITMONTO, :CONSUMO, :TOTAL, :refitem,
            :GRUPO, :SUBGRUPO, :MARCA, :PESO, :ANCHO, :ALTO, :LARGO, :TARIFA, :DEVUELTO
        DO
        BEGIN
        if (ARTICULO = CODBAR) then
            SELECT FIRST 1 COBA_COD FROM barras_articulo WHERE ARTI_COD = :articulo INTO :CODBAR;
        SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :GRUPO INTO NOMGRUPO;
        SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :MARCA INTO NOMMARCA;
        SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :SUBGRUPO AND GRUP_COD = :GRUPO INTO :NOMSUBG;
        SELECT LOTE_VENCE FROM LOTES WHERE LOTE_NRO = :lote AND ARTI_COD = :ARTICULO INTO :vlote;
        ITEM = ITEM + 1;
        PRNETO = PRUNIT - DTOITMONTO;
        if (IVAPORC = 0) then
            SUMAEX = SUMAEX + TOTAL;
        if (TARIFA = 1) then
            BEGIN
            SUMA1 = SUMA1 + TOTAL - IVAITMONTO;
            IVA1 = IVA1 + IVAITMONTO;
            END
        if (TARIFA = 2) then
            BEGIN
            SUMA2 = SUMA2 + TOTAL - IVAITMONTO;
            IVA2 = IVA2 + IVAITMONTO;
            END
        if (TARIFA = 3) then
            BEGIN
            SUMA3 = SUMA3 + TOTAL - IVAITMONTO;
            IVA3 = IVA3 + IVAITMONTO;
            END
        SUMAGR = SUMA1 + SUMA2 + SUMA3;

        if (IMPTOS = 'N') then
            TOTAL = TOTAL - IVAITMONTO;
        ELSE
           BEGIN
           PRNETOSINIVA = PRUNIT / (1 + ivaporc/100);
           SUBTOTALITEM = PRNETOSINIVA * :CANT;
           END
        SUSPEND;
        END
    END
ELSE
    BEGIN
    FOR SELECT RVDE_ITEM, D.ARTI_COD, RVDE_CODBAR, SUBSTR(RVDE_DESC,1,60), RVDE_CANT, RVDE_UNIDAD, BODE_COD, RVDE_LOTE, LIPR_COD, RVDE_PRUNIT, RVDE_DTOPORC, RVDE_DTOMONTO, RVDE_IVAPORC, RVDE_IVAMONTO, RVDE_CONSUMO, RVDE_TOTAL, RVDE_REFERENCIA,
        GRUP_COD, SUBG_COD, MARC_COD, ARTI_PESO, ARTI_ANCHO, ARTI_ALTO, ARTI_LARGO, TAIV_COD, RVDE_DEVUELTO
        FROM REMISIONES_VENTA_DETALLE D, ARTICULO A
        WHERE D.ARTI_COD = A.ARTI_COD AND D.REVT_ID = :ID
        ORDER BY RVDE_ITEM
        INTO :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :BODITEM, :LOTE, :LISTAPR, :PRUNIT, :DTOITPORC, :DTOITMONTO, :IVAPORC, :IVAITMONTO, :CONSUMO, :TOTAL, :refitem,
            :GRUPO, :SUBGRUPO, :MARCA, :PESO, :ANCHO, :ALTO, :LARGO, :TARIFA, :DEVUELTO
        DO
        BEGIN
        SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :GRUPO INTO NOMGRUPO;
        SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :MARCA INTO NOMMARCA;
        SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :SUBGRUPO AND GRUP_COD = :GRUPO INTO :NOMSUBG;
        ITEM = ITEM + 1;
        PRNETO = PRUNIT - DTOITMONTO;
        if (IVAPORC = 0) then
            SUMAEX = SUMAEX + TOTAL;
        if (TARIFA = 1) then
            BEGIN
            SUMA1 = SUMA1 + TOTAL - IVAITMONTO;
            IVA1 = IVA1 + IVAITMONTO;
            END
        if (TARIFA = 2) then
            BEGIN
            SUMA2 = SUMA2 + TOTAL - IVAITMONTO;
            IVA2 = IVA2 + IVAITMONTO;
            END
        if (TARIFA = 3) then
            BEGIN
            SUMA3 = SUMA3 + TOTAL - IVAITMONTO;
            IVA3 = IVA3 + IVAITMONTO;
            END
        SUMAGR = SUMA1 + SUMA2 + SUMA3;
        SUBTOTALITEM = TOTAL - IVAITMONTO;
        if (IMPTOS = 'N') then
            TOTAL = TOTAL - IVAITMONTO;
        ELSE
           BEGIN
             PRNETOSINIVA = PRUNIT / (1 + ivaporc/100);
             SUBTOTALITEM = PRNETOSINIVA * :CANT;
           END
        SUSPEND;
        END
    END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER PROCEDURE IMPR_PEDIDO(
    ID INTEGER)
RETURNS (
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    VALIDEZ INTEGER,
    NIT VARCHAR(20),
    NOMTERCERO VARCHAR(60),
    VENDEDOR INTEGER,
    NOMVENDEDOR VARCHAR(60),
    PUNTOVTA INTEGER,
    NOMPUNTOVTA VARCHAR(30),
    COTIZACION VARCHAR(30),
    SUBTOTAL NUMERIC(18,2),
    DTOPORC NUMERIC(9,2),
    DTOMONTO NUMERIC(18,2),
    ADICIONAL NUMERIC(18,2),
    IVAMONTO NUMERIC(18,2),
    EXTRA NUMERIC(18,2),
    TOTALFAC NUMERIC(18,2),
    OBS BLOB SUB_TYPE 1 SEGMENT SIZE 80,
    ITEM INTEGER,
    ARTICULO VARCHAR(15),
    CODBAR VARCHAR(15),
    ARTIDES VARCHAR(60),
    BODEGA VARCHAR(2),
    CANT NUMERIC(18,4),
    UNIDAD VARCHAR(8),
    LISTAPR INTEGER,
    REFITEM VARCHAR(60),
    PRUNIT NUMERIC(18,2),
    DTOITPORC NUMERIC(9,2),
    DTOITMONTO NUMERIC(18,2),
    PRNETO NUMERIC(18,2),
    IVAPORC NUMERIC(9,2),
    IVAITMONTO NUMERIC(18,2),
    CONSUMO NUMERIC(18,2),
    TOTAL NUMERIC(18,2),
    CODIGOCL VARCHAR(20),
    ZONACOD VARCHAR(2),
    ZONANOM VARCHAR(60),
    DV CHAR(1),
    DIRECCION VARCHAR(60),
    CIUDAD VARCHAR(40),
    TELEFONO VARCHAR(40),
    CONTACTO VARCHAR(60),
    FAX VARCHAR(25),
    GRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    SUBGRUPO VARCHAR(3),
    NOMSUBG VARCHAR(30),
    MARCA VARCHAR(3),
    NOMMARCA VARCHAR(30),
    PESO NUMERIC(9,4),
    ANCHO NUMERIC(18,4),
    ALTO NUMERIC(18,4),
    LARGO NUMERIC(18,4),
    SUMA1 NUMERIC(18,2),
    SUMA2 NUMERIC(18,2),
    SUMA3 NUMERIC(18,2),
    IVA1 NUMERIC(18,2),
    IVA2 NUMERIC(18,2),
    IVA3 NUMERIC(18,2),
    SUMAEX NUMERIC(18,2),
    SUMAGR NUMERIC(18,2))
AS
DECLARE VARIABLE IMPTOS CHAR(1);
DECLARE VARIABLE TARIFA INTEGER;
declare variable ORDENCOD CHAR(2);
declare variable SUCUR VARCHAR(10);
BEGIN
  /*  */
  SELECT F.PREF_PRE, PEDI_NUMERO, PEDI_FECHA, PEDI_VALIDEZ, F.TERC_NIT, PEDI_NOMTERC, F.VEND_COD, VEND_NOMBRE, F.PTVT_ID, PTVT_NOM, PEDI_COTIZACI,
    PEDI_IVAINC, PEDI_DTOPOR, PEDI_DTOMONTO, PEDI_ADICIONAL, PEDI_IVAMONTO, PEDI_EXTRA, PEDI_TOTAL,
    TERC_CONTACTO, TERC_FAX, TERC_DV, PEDI_OBS, PEDI_SUCURSAL
    FROM PEDIDOS F, VENDEDORES V, PUNTO_VENTA P, TERCEROS T
    WHERE F.VEND_COD = V.VEND_COD AND F.PTVT_ID = P.PTVT_ID AND F.TERC_NIT = T.TERC_NIT AND F.PEDI_ID = :ID
    into :PREF, :NUMERO, :FECHA, :VALIDEZ, :NIT, :NOMTERCERO, :VENDEDOR, :NOMVENDEDOR, :PUNTOVTA, :NOMPUNTOVTA, :COTIZACION,
    :IMPTOS, :DTOPORC, :DTOMONTO, :ADICIONAL, :IVAMONTO, :EXTRA, :TOTALFAC,
    :CONTACTO, :FAX, :DV, :OBS, :SUCUR;
  SUBTOTAL = TOTALFAC - EXTRA - IVAMONTO - ADICIONAL + DTOMONTO;

  SELECT CLIE_COD, C.ZONA_COD, ZONA_NOM
    FROM CLIENTES C, ZONAS Z
    WHERE TERC_NIT = :NIT AND C.ZONA_COD = Z.ZONA_COD
    INTO :CODIGOCL, :ZONACOD, :ZONANOM;
  SELECT CLSU_DIR, CLSU_CIUDAD, CLSU_TEL FROM CLIENTE_SUCURSALES WHERE TERC_NIT = :NIT AND CLCU_COD = :SUCUR
    INTO :DIRECCION, :CIUDAD, :TELEFONO;
    
  SUMAEX = 0;
  SUMA1 = 0;
  SUMA2 = 0;
  SUMA3 = 0;
  IVA1 = 0;
  IVA2 = 0;
  IVA3 = 0;
  ITEM = 0;
  EXECUTE PROCEDURE lee_configuracion ('FACTURACION','DOCUMENTOS','ORDENAR ITEMS POR CODIGO DE ARTICULO') returning_values (:ORDENCOD);
  if (ORDENCOD = 'SI') then
    BEGIN
    FOR SELECT D.ARTI_COD, PEDE_CODBAR, SUBSTR(PEDE_DESC,1,60), PEDE_CANT, PEDE_UNIDAD, LIPR_COD, PEDE_PRUNIT, PEDE_DTOPORC, PEDE_DTOMONTO, PEDE_IVAPORC, PEDE_IVAMONTO, PEDE_CONSUMO, PEDE_TOTAL, PEDE_REFERENCIA,
        GRUP_COD, SUBG_COD, MARC_COD, ARTI_PESO, ARTI_ANCHO, ARTI_ALTO, ARTI_LARGO, TAIV_COD, BODE_COD
        FROM PEDIDOS_DETALLE D, ARTICULO A
        WHERE D.ARTI_COD = A.ARTI_COD AND D.PEDI_ID = :ID
        ORDER BY PEDE_CODBAR
        INTO :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :LISTAPR, :PRUNIT, :DTOITPORC, :DTOITMONTO, :IVAPORC, :IVAITMONTO, :CONSUMO, :TOTAL, :REFITEM,
        :GRUPO, :SUBGRUPO, :MARCA, :PESO, :ANCHO, :ALTO, :LARGO, :TARIFA, :BODEGA
        DO
        BEGIN
        if (ARTICULO = CODBAR) then
            SELECT FIRST 1 COBA_COD FROM barras_articulo WHERE ARTI_COD = :articulo INTO :CODBAR;
        SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :GRUPO INTO NOMGRUPO;
        SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :MARCA INTO NOMMARCA;
        SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :SUBGRUPO AND GRUP_COD = :GRUPO INTO :NOMSUBG;
        ITEM = ITEM + 1;
        PRNETO = PRUNIT - DTOITMONTO;
        if (TARIFA = 0) then
            SUMAEX = SUMAEX + TOTAL;
        if (TARIFA = 1) then
            BEGIN
            SUMA1 = SUMA1 + TOTAL - IVAITMONTO;
            IVA1 = IVA1 + IVAITMONTO;
            END
        if (TARIFA = 2) then
            BEGIN
            SUMA2 = SUMA2 + TOTAL - IVAITMONTO;
            IVA2 = IVA2 + IVAITMONTO;
            END
        if (TARIFA = 3) then
            BEGIN
            SUMA3 = SUMA3 + TOTAL - IVAITMONTO;
            IVA3 = IVA3 + IVAITMONTO;
            END
        SUMAGR = SUMA1 + SUMA2 + SUMA3;
        if (IMPTOS = 'N') then
            TOTAL = TOTAL - IVAITMONTO;
        SUSPEND;
        END
    END
ELSE
    BEGIN
    FOR SELECT PEDE_ITEM, D.ARTI_COD, PEDE_CODBAR, SUBSTR(PEDE_DESC,1,60), PEDE_CANT, PEDE_UNIDAD, LIPR_COD, PEDE_PRUNIT, PEDE_DTOPORC, PEDE_DTOMONTO, PEDE_IVAPORC, PEDE_IVAMONTO, PEDE_CONSUMO, PEDE_TOTAL, PEDE_REFERENCIA,
        GRUP_COD, SUBG_COD, MARC_COD, ARTI_PESO, ARTI_ANCHO, ARTI_ALTO, ARTI_LARGO, TAIV_COD, BODE_COD
        FROM PEDIDOS_DETALLE D, ARTICULO A
        WHERE D.ARTI_COD = A.ARTI_COD AND D.PEDI_ID = :ID
        ORDER BY PEDE_ITEM
        INTO :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :LISTAPR, :PRUNIT, :DTOITPORC, :DTOITMONTO, :IVAPORC, :IVAITMONTO, :CONSUMO, :TOTAL, :REFITEM,
        :GRUPO, :SUBGRUPO, :MARCA, :PESO, :ANCHO, :ALTO, :LARGO, :TARIFA, :BODEGA
        DO
        BEGIN
        SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :GRUPO INTO NOMGRUPO;
        SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :MARCA INTO NOMMARCA;
        SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :SUBGRUPO AND GRUP_COD = :GRUPO INTO :NOMSUBG;
        ITEM = ITEM + 1;
        PRNETO = PRUNIT - DTOITMONTO;
        if (IVAPORC = 0) then
            SUMAEX = SUMAEX + TOTAL;
        if (TARIFA = 1) then
            BEGIN
            SUMA1 = SUMA1 + TOTAL - IVAITMONTO;
            IVA1 = IVA1 + IVAITMONTO;
            END
        if (TARIFA = 2) then
            BEGIN
            SUMA2 = SUMA2 + TOTAL - IVAITMONTO;
            IVA2 = IVA2 + IVAITMONTO;
            END
        if (TARIFA = 3) then
            BEGIN
            SUMA3 = SUMA3 + TOTAL - IVAITMONTO;
            IVA3 = IVA3 + IVAITMONTO;
            END
        SUMAGR = SUMA1 + SUMA2 + SUMA3;
        if (IMPTOS = 'N') then
            TOTAL = TOTAL - IVAITMONTO;
        SUSPEND;
        END
    END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER PROCEDURE IMPR_COTIZACION(
    ID INTEGER)
RETURNS (
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    VALIDEZ INTEGER,
    NIT VARCHAR(20),
    NOMTERCERO VARCHAR(60),
    VENDEDOR INTEGER,
    NOMVENDEDOR VARCHAR(60),
    PUNTOVTA INTEGER,
    NOMPUNTOVTA VARCHAR(30),
    SUBTOTAL NUMERIC(18,2),
    DTOPORC NUMERIC(9,2),
    DTOMONTO NUMERIC(18,2),
    ADICIONAL NUMERIC(18,2),
    IVAMONTO NUMERIC(18,2),
    EXTRA NUMERIC(18,2),
    TOTALFAC NUMERIC(18,2),
    OBS BLOB SUB_TYPE 1 SEGMENT SIZE 80,
    ITEM INTEGER,
    ARTICULO VARCHAR(15),
    CODBAR VARCHAR(15),
    ARTIDES VARCHAR(60),
    CANT NUMERIC(18,4),
    UNIDAD VARCHAR(8),
    LISTAPR INTEGER,
    REFITEM VARCHAR(60),
    PRUNIT NUMERIC(18,2),
    DTOITPORC NUMERIC(9,2),
    DTOITMONTO NUMERIC(18,2),
    PRNETO NUMERIC(18,2),
    IVAPORC NUMERIC(9,2),
    IVAITMONTO NUMERIC(18,2),
    CONSUMO NUMERIC(18,2),
    TOTAL NUMERIC(18,2),
    CODIGOCL VARCHAR(20),
    ZONACOD VARCHAR(2),
    ZONANOM VARCHAR(60),
    DV CHAR(1),
    DIRECCION VARCHAR(60),
    CIUDAD VARCHAR(40),
    TELEFONO VARCHAR(40),
    CONTACTO VARCHAR(60),
    FAX VARCHAR(25),
    GRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    SUBGRUPO VARCHAR(3),
    NOMSUBG VARCHAR(30),
    MARCA VARCHAR(3),
    NOMMARCA VARCHAR(30),
    PESO NUMERIC(9,4),
    ANCHO NUMERIC(18,4),
    ALTO NUMERIC(18,4),
    LARGO NUMERIC(18,4),
    SUMA1 NUMERIC(18,2),
    SUMA2 NUMERIC(18,2),
    SUMA3 NUMERIC(18,2),
    IVA1 NUMERIC(18,2),
    IVA2 NUMERIC(18,2),
    IVA3 NUMERIC(18,2),
    SUMAEX NUMERIC(18,2),
    SUMAGR NUMERIC(18,2))
AS
DECLARE VARIABLE IMPTOS CHAR(1);
DECLARE VARIABLE TARIFA INTEGER;
declare variable ORDENCOD CHAR(2);
declare variable SUCUR VARCHAR(10);
BEGIN
  /*  */
  SELECT F.PREF_PRE, COTI_NUMERO, COTI_FECHA, COTI_VALIDEZ, F.TERC_NIT, COTI_NOMTERC, F.VEND_COD, VEND_NOMBRE, F.PTVT_ID, PTVT_NOM,
    COTI_IMPTOS, COTI_DTOPORC, COTI_DTOMONTO, COTI_ADICIONAL, COTI_IVAMONTO, COTI_EXTRA, COTI_TOTAL,
    TERC_CONTACTO, TERC_FAX, TERC_DV, COTI_OBS, COTI_SUCURSAL
    FROM COTIZACIONES F, VENDEDORES V, PUNTO_VENTA P, TERCEROS T
    WHERE F.VEND_COD = V.VEND_COD AND F.PTVT_ID = P.PTVT_ID AND F.TERC_NIT = T.TERC_NIT AND F.COTI_ID = :ID
    into :PREF, :NUMERO, :FECHA, :VALIDEZ, :NIT, :NOMTERCERO, :VENDEDOR, :NOMVENDEDOR, :PUNTOVTA, :NOMPUNTOVTA,
    :IMPTOS, :DTOPORC, :DTOMONTO, :ADICIONAL, :IVAMONTO, :EXTRA, :TOTALFAC,
    :CONTACTO, :FAX, :DV, :OBS, :SUCUR;
  SUBTOTAL = TOTALFAC - EXTRA - IVAMONTO - ADICIONAL + DTOMONTO;

  SELECT CLIE_COD, C.ZONA_COD, ZONA_NOM
    FROM CLIENTES C, ZONAS Z
    WHERE TERC_NIT = :NIT AND C.ZONA_COD = Z.ZONA_COD
    INTO :CODIGOCL, :ZONACOD, :ZONANOM;
  SELECT CLSU_DIR, CLSU_CIUDAD, CLSU_TEL FROM CLIENTE_SUCURSALES WHERE TERC_NIT = :NIT AND CLCU_COD = :SUCUR
    INTO :DIRECCION, :CIUDAD, :TELEFONO;
    
  SUMAEX = 0;
  SUMA1 = 0;
  SUMA2 = 0;
  SUMA3 = 0;
  IVA1 = 0;
  IVA2 = 0;
  IVA3 = 0;
  ITEM = 0;
  EXECUTE PROCEDURE lee_configuracion ('FACTURACION','DOCUMENTOS','ORDENAR ITEMS POR CODIGO DE ARTICULO') returning_values (:ORDENCOD);
  if (ORDENCOD = 'SI') then
    BEGIN
    FOR SELECT D.ARTI_COD, CTDE_CODBAR, SUBSTR(CTDE_DESC,1,60), CTDE_CANT, CTDE_UNIDAD, LIPR_COD, CTDE_PRUNIT, CTDE_DTOPORC, CTDE_DTOMONTO, CTDE_IVAPORC, CTDE_IVAMONTO, CTDE_CONSUMO, CTDE_TOTAL, CTDE_REFERENCIA,
        GRUP_COD, SUBG_COD, MARC_COD, ARTI_PESO, ARTI_ANCHO, ARTI_ALTO, ARTI_LARGO, TAIV_COD
        FROM COTIZACIONES_DETALLE D, ARTICULO A
        WHERE D.ARTI_COD = A.ARTI_COD AND D.COTI_ID = :ID
        ORDER BY CTDE_CODBAR
        INTO :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :LISTAPR, :PRUNIT, :DTOITPORC, :DTOITMONTO, :IVAPORC, :IVAITMONTO, :CONSUMO, :TOTAL, :refitem,
        :GRUPO, :SUBGRUPO, :MARCA, :PESO, :ANCHO, :ALTO, :LARGO, :TARIFA
        DO
        BEGIN
        if (ARTICULO = CODBAR) then
            SELECT FIRST 1 COBA_COD FROM barras_articulo WHERE ARTI_COD = :articulo INTO :CODBAR;
        SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :GRUPO INTO NOMGRUPO;
        SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :MARCA INTO NOMMARCA;
        SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :SUBGRUPO AND GRUP_COD = :GRUPO INTO :NOMSUBG;
        ITEM = ITEM + 1;
        PRNETO = PRUNIT - DTOITMONTO;
        if (ivaporc = 0) then
            SUMAEX = SUMAEX + TOTAL;
        if (TARIFA = 1) then
            BEGIN
            SUMA1 = SUMA1 + TOTAL - IVAITMONTO;
            IVA1 = IVA1 + IVAITMONTO;
            END
        if (TARIFA = 2) then
            BEGIN
            SUMA2 = SUMA2 + TOTAL - IVAITMONTO;
            IVA2 = IVA2 + IVAITMONTO;
            END
        if (TARIFA = 3) then
            BEGIN
            SUMA3 = SUMA3 + TOTAL - IVAITMONTO;
            IVA3 = IVA3 + IVAITMONTO;
            END
        SUMAGR = SUMA1 + SUMA2 + SUMA3;
        if (IMPTOS = 'N') then
            TOTAL = TOTAL - IVAITMONTO;
        SUSPEND;
        END
    END
ELSE
    BEGIN
    FOR SELECT D.ARTI_COD, CTDE_CODBAR, SUBSTR(CTDE_DESC,1,60), CTDE_CANT, CTDE_UNIDAD, LIPR_COD, CTDE_PRUNIT, CTDE_DTOPORC, CTDE_DTOMONTO, CTDE_IVAPORC, CTDE_IVAMONTO, CTDE_CONSUMO, CTDE_TOTAL, CTDE_REFERENCIA,
        GRUP_COD, SUBG_COD, MARC_COD, ARTI_PESO, ARTI_ANCHO, ARTI_ALTO, ARTI_LARGO, TAIV_COD
        FROM COTIZACIONES_DETALLE D, ARTICULO A
        WHERE D.ARTI_COD = A.ARTI_COD AND D.COTI_ID = :ID
        ORDER BY CTDE_ITEM
        INTO :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :LISTAPR, :PRUNIT, :DTOITPORC, :DTOITMONTO, :IVAPORC, :IVAITMONTO, :CONSUMO, :TOTAL, :refitem,
        :GRUPO, :SUBGRUPO, :MARCA, :PESO, :ANCHO, :ALTO, :LARGO, :TARIFA
        DO
        BEGIN
        SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :GRUPO INTO NOMGRUPO;
        SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :MARCA INTO NOMMARCA;
        SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :SUBGRUPO AND GRUP_COD = :GRUPO INTO :NOMSUBG;
        ITEM = ITEM + 1;
        PRNETO = PRUNIT - DTOITMONTO;
        if (ivaporc = 0) then
            SUMAEX = SUMAEX + TOTAL;
        if (TARIFA = 1) then
            BEGIN
            SUMA1 = SUMA1 + TOTAL - IVAITMONTO;
            IVA1 = IVA1 + IVAITMONTO;
            END
        if (TARIFA = 2) then
            BEGIN
            SUMA2 = SUMA2 + TOTAL - IVAITMONTO;
            IVA2 = IVA2 + IVAITMONTO;
            END
        if (TARIFA = 3) then
            BEGIN
            SUMA3 = SUMA3 + TOTAL - IVAITMONTO;
            IVA3 = IVA3 + IVAITMONTO;
            END
        SUMAGR = SUMA1 + SUMA2 + SUMA3;
        if (IMPTOS = 'N') then
            TOTAL = TOTAL - IVAITMONTO;
        SUSPEND;
        END
    END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER PROCEDURE IMPR_DEVOLUCION(
    ID INTEGER)
RETURNS (
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    NIT VARCHAR(20),
    NOMTERCERO VARCHAR(60),
    VENDEDOR INTEGER,
    NOMVENDEDOR VARCHAR(60),
    PUNTOVTA INTEGER,
    NOMPUNTOVTA VARCHAR(30),
    CODBODEGA VARCHAR(2),
    NOMBODEGA VARCHAR(30),
    FACTURA VARCHAR(30),
    REMISION VARCHAR(10),
    COMIPORC NUMERIC(9,2),
    COMIMONTO NUMERIC(18,2),
    SUBTOTAL NUMERIC(18,2),
    DTOPORC NUMERIC(9,2),
    DTOMONTO NUMERIC(18,2),
    ADICIONAL NUMERIC(18,2),
    IVAMONTO NUMERIC(18,2),
    RTEFTEPORC NUMERIC(9,2),
    RTEFTEMONTO NUMERIC(18,2),
    RTEIVAPORC NUMERIC(9,2),
    RTEIVAMONTO NUMERIC(18,2),
    RTEICAPORC NUMERIC(9,2),
    RTEICAMONTO NUMERIC(18,2),
    EXTRA NUMERIC(18,2),
    TOTALFAC NUMERIC(18,2),
    TOTALPAGAR NUMERIC(18,2),
    OBS BLOB SUB_TYPE 1 SEGMENT SIZE 80,
    ITEM INTEGER,
    ARTICULO VARCHAR(15),
    CODBAR VARCHAR(15),
    ARTIDES VARCHAR(60),
    CANT NUMERIC(18,4),
    LOTE VARCHAR(15),
    UNIDAD VARCHAR(8),
    REFITEM VARCHAR(60),
    BODITEM VARCHAR(2),
    PRUNIT NUMERIC(18,2),
    DTOITPORC NUMERIC(9,2),
    DTOITMONTO NUMERIC(18,2),
    PRNETO NUMERIC(18,2),
    IVAPORC NUMERIC(9,2),
    IVAITMONTO NUMERIC(18,2),
    CONSUMO NUMERIC(18,2),
    TOTAL NUMERIC(18,2),
    CODIGOCL VARCHAR(20),
    ZONACOD VARCHAR(2),
    ZONANOM VARCHAR(60),
    DV CHAR(1),
    DIRECCION VARCHAR(60),
    CIUDAD VARCHAR(40),
    TELEFONO VARCHAR(40),
    CONTACTO VARCHAR(60),
    FAX VARCHAR(25),
    GRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    SUBGRUPO VARCHAR(3),
    NOMSUBG VARCHAR(30),
    MARCA VARCHAR(3),
    NOMMARCA VARCHAR(30),
    PESO NUMERIC(9,4),
    ANCHO NUMERIC(18,4),
    ALTO NUMERIC(18,4),
    LARGO NUMERIC(18,4),
    SUMA1 NUMERIC(18,2),
    SUMA2 NUMERIC(18,2),
    SUMA3 NUMERIC(18,2),
    IVA1 NUMERIC(18,2),
    IVA2 NUMERIC(18,2),
    IVA3 NUMERIC(18,2),
    TOTCONSUMO NUMERIC(18,2),
    SUMAEX NUMERIC(18,2),
    SUMAGR NUMERIC(18,2))
AS
DECLARE VARIABLE IMPTOS CHAR(1);
DECLARE VARIABLE TARIFA INTEGER;
declare variable ORDENCOD CHAR(2);
declare variable SUCUR VARCHAR(10);
declare variable PUNTOS NUMERIC(18,4);
BEGIN
  /*  */
  SELECT F.PREF_PRE, DEVT_NUMERO, DEVT_FECHA, F.BODE_COD, BODE_NOM, F.TERC_NIT, DEVT_NOMTERC, F.VEND_COD, VEND_NOMBRE, F.PTVT_ID, PTVT_NOM,
    DEVT_FACTURA, DEVT_COMIPORC, DEVT_COMIMONTO, DEVT_IVAINC,
    DEVT_DTOPOR, DEVT_DTOMONTO, DEVT_ADICIONAL, DEVT_IVAMONTO, DEVT_RTFTEPORC, DEVT_RTFTEMONTO, DEVT_RTIVAPORC, DEVT_RTIVAMONTO, DEVT_RTICAPORC, DEVT_RTICAMONTO, DEVT_EXTRA, DEVT_TOTAL,
    TERC_CONTACTO, TERC_FAX, TERC_DV, DEVT_OBS, DEVT_SUCURSAL, DEVT_REMISION
    FROM DEVOLUCIONES_VENTAS F, BODEGA B, VENDEDORES V, PUNTO_VENTA P, TERCEROS T
    WHERE F.BODE_COD = B.BODE_COD AND F.VEND_COD = V.VEND_COD AND F.PTVT_ID = P.PTVT_ID AND F.TERC_NIT = T.TERC_NIT AND F.DEVT_ID = :ID
    into :PREF, :NUMERO, :FECHA, :CODBODEGA, :NOMBODEGA, :NIT, :NOMTERCERO, :VENDEDOR, :NOMVENDEDOR, :PUNTOVTA, :NOMPUNTOVTA,
    :FACTURA, :COMIPORC, :COMIMONTO, :IMPTOS,
    :DTOPORC, :DTOMONTO, :ADICIONAL, :IVAMONTO, :RTEFTEPORC, :RTEFTEMONTO, :RTEIVAPORC, :RTEIVAMONTO, :RTEICAPORC, :RTEICAMONTO, :EXTRA, :TOTALFAC,
    :CONTACTO, :FAX, :DV, :OBS, :SUCUR, :REMISION;
  SUBTOTAL = TOTALFAC - EXTRA - IVAMONTO - ADICIONAL + DTOMONTO;
  TOTALPAGAR = TOTALFAC - RTEFTEMONTO - RTEIVAMONTO - RTEICAMONTO;

  EXECUTE PROCEDURE acumula_puntos_cliente (33, :id, :nit, :fecha) returning_values (:PUNTOS);
  SELECT CLIE_COD, C.ZONA_COD, ZONA_NOM
    FROM CLIENTES C, ZONAS Z
    WHERE TERC_NIT = :NIT AND C.ZONA_COD = Z.ZONA_COD
    INTO :CODIGOCL, :ZONACOD, :ZONANOM;
  SELECT CLSU_DIR, CLSU_CIUDAD, CLSU_TEL FROM CLIENTE_SUCURSALES WHERE TERC_NIT = :NIT AND CLCU_COD = :SUCUR
    INTO :DIRECCION, :CIUDAD, :TELEFONO;
    
  SUMAEX = 0;
  SUMA1 = 0;
  SUMA2 = 0;
  SUMA3 = 0;
  IVA1 = 0;
  IVA2 = 0;
  IVA3 = 0;
  TOTCONSUMO = 0;
  ITEM = 0;
  EXECUTE PROCEDURE lee_configuracion ('FACTURACION','DOCUMENTOS','ORDENAR ITEMS POR CODIGO DE ARTICULO') returning_values (:ORDENCOD);
  if (ORDENCOD = 'SI') then
    BEGIN
    FOR SELECT D.ARTI_COD, DVDE_CODBAR, SUBSTR(DVDE_DESC,1,60), DVDE_CANT, DVDE_UNIDAD, BODE_COD, DVDE_LOTE, DVDE_PRUNIT, DVDE_DTOPORC, DVDE_DTOMONTO, DVDE_IVAPORC, DVDE_IVAMONTO, DVDE_CONSUMO, DVDE_TOTAL, DVDE_REFERENCIA,
        GRUP_COD, SUBG_COD, MARC_COD, ARTI_PESO, ARTI_ANCHO, ARTI_ALTO, ARTI_LARGO, TAIV_COD
        FROM DEVOLUCIONES_VENTAS_DETALLE D, ARTICULO A
        WHERE D.ARTI_COD = A.ARTI_COD AND D.DEVT_ID = :ID
        ORDER BY DVDE_CODBAR
        INTO :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :BODITEM, :LOTE, :PRUNIT, :DTOITPORC, :DTOITMONTO, :IVAPORC, :IVAITMONTO, :CONSUMO, :TOTAL, :REFITEM,
        :GRUPO, :SUBGRUPO, :MARCA, :PESO, :ANCHO, :ALTO, :LARGO, :TARIFA
        DO
        BEGIN
        if (ARTICULO = CODBAR) then
            SELECT FIRST 1 COBA_COD FROM barras_articulo WHERE ARTI_COD = :articulo INTO :CODBAR;
        ITEM = ITEM + 1;
        PRNETO = PRUNIT - DTOITMONTO - ((IVAITMONTO+CONSUMO) / CANT);
        TOTCONSUMO = TOTCONSUMO + CONSUMO;
        PRNETO = PRUNIT - DTOITMONTO;
        if (TARIFA = 0) then
            SUMAEX = SUMAEX + TOTAL;
        if (TARIFA = 1) then
            BEGIN
            SUMA1 = SUMA1 + TOTAL - IVAITMONTO;
            IVA1 = IVA1 + IVAITMONTO;
            END
        if (TARIFA = 2) then
            BEGIN
            SUMA2 = SUMA2 + TOTAL - IVAITMONTO;
            IVA2 = IVA2 + IVAITMONTO;
            END
        if (TARIFA = 3) then
            BEGIN
            SUMA3 = SUMA3 + TOTAL - IVAITMONTO;
            IVA3 = IVA3 + IVAITMONTO;
            END
        SUMAGR = SUMA1 + SUMA2 + SUMA3;
        if (IMPTOS = 'N') then
            TOTAL = TOTAL - IVAITMONTO - CONSUMO;
        SUSPEND;
        END
    END
ELSE
    BEGIN
    FOR SELECT D.ARTI_COD, DVDE_CODBAR, SUBSTR(DVDE_DESC,1,60), DVDE_CANT, DVDE_UNIDAD, BODE_COD, DVDE_LOTE, DVDE_PRUNIT, DVDE_DTOPORC, DVDE_DTOMONTO, DVDE_IVAPORC, DVDE_IVAMONTO, DVDE_CONSUMO, DVDE_TOTAL, DVDE_REFERENCIA,
        GRUP_COD, SUBG_COD, MARC_COD, ARTI_PESO, ARTI_ANCHO, ARTI_ALTO, ARTI_LARGO, TAIV_COD
        FROM DEVOLUCIONES_VENTAS_DETALLE D, ARTICULO A
        WHERE D.ARTI_COD = A.ARTI_COD AND D.DEVT_ID = :ID
        ORDER BY DVDE_ITEM
        INTO :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :BODITEM, :LOTE, :PRUNIT, :DTOITPORC, :DTOITMONTO, :IVAPORC, :IVAITMONTO, :CONSUMO, :TOTAL, :REFITEM,
        :GRUPO, :SUBGRUPO, :MARCA, :PESO, :ANCHO, :ALTO, :LARGO, :TARIFA
        DO
        BEGIN
        if (ARTICULO = CODBAR) then
            SELECT FIRST 1 COBA_COD FROM barras_articulo WHERE ARTI_COD = :articulo INTO :CODBAR;
        SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :GRUPO INTO NOMGRUPO;
        SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :MARCA INTO NOMMARCA;
        SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :SUBGRUPO AND GRUP_COD = :GRUPO INTO :NOMSUBG;
        ITEM = ITEM + 1;
        PRNETO = PRUNIT - DTOITMONTO - ((IVAITMONTO+CONSUMO) / CANT);
        TOTCONSUMO = TOTCONSUMO + CONSUMO;
        PRNETO = PRUNIT - DTOITMONTO;
        if (TARIFA = 0) then
            SUMAEX = SUMAEX + TOTAL;
        if (TARIFA = 1) then
            BEGIN
            SUMA1 = SUMA1 + TOTAL - IVAITMONTO;
            IVA1 = IVA1 + IVAITMONTO;
            END
        if (TARIFA = 2) then
            BEGIN
            SUMA2 = SUMA2 + TOTAL - IVAITMONTO;
            IVA2 = IVA2 + IVAITMONTO;
            END
        if (TARIFA = 3) then
            BEGIN
            SUMA3 = SUMA3 + TOTAL - IVAITMONTO;
            IVA3 = IVA3 + IVAITMONTO;
            END
        SUMAGR = SUMA1 + SUMA2 + SUMA3;
        if (IMPTOS = 'N') then
            TOTAL = TOTAL - IVAITMONTO - CONSUMO;
        SUSPEND;
        END
    END
END
^

SET TERM ; ^


/* 05-26 codigos de barras con cantidad incluida */

INSERT INTO CONFIGURACION (CONF_MODULO, CONF_CATEGORIA, CONF_PROPIEDAD, CONF_VALOR, CONF_POSIBLES, CONF_AYUDA) VALUES ('FACTURACION', 'ARTICULOS', 'POSICIONES DE SEPARACION ENTRE EL CODIGO Y LA CANTIDAD INCLUIDOS EN EL CODIGO DE BARRAS', '3', '1,2,3,4,5', 'Indique el número de digitos que separan el codigo de la cantidad en el código de barras que entrega la balanza');
commit work;

/* 05-28 */
grant EXECUTE on PROCEDURE CUENTA_INTERFAZ to PUBLIC;

/* 06-02 conciliacion de cartera y cxpagar */
SET TERM ^ ;

CREATE OR ALTER PROCEDURE CONCILIA_CARTERA(
    FECINI DATE,
    FECFIN DATE,
    CTACART VARCHAR(20),
    SUBEMPRESA INTEGER,
    ANTERIOR CHAR(1))
RETURNS (
    NIT VARCHAR(20),
    NOMBRE VARCHAR(60),
    INICIAL NUMERIC(18,2),
    INICIALC NUMERIC(18,2),
    DEBITOS NUMERIC(18,2),
    DEBITOSC NUMERIC(18,2),
    CREDITOS NUMERIC(18,2),
    CREDITOSC NUMERIC(18,2),
    SALDO NUMERIC(18,2),
    SALDOC NUMERIC(18,2),
    DIFERENCIA NUMERIC(18,2))
AS
declare variable ANO CHAR(4);
declare variable MES INTEGER;
declare variable NUMROWS INTEGER;
declare variable ABONOS NUMERIC(18,2);
declare variable TIPODOC INTEGER;
declare variable IDDOC INTEGER;
declare variable RETES CHAR(2);
begin
ano = EXTRACT(YEAR FROM FECFIN);
mes = EXTRACT(MONTH FROM FECFIN);

for select TERC_NIT, TERC_NOM from TERCEROS WHERE TERC_CLIE = 'S' into :NIT, :NOMBRE
    DO
    BEGIN
    /* OMITE LOS CLIENTES DE CONTADO */
    SELECT COUNT(*) FROM AUTORIZACIONES WHERE AUTO_NITCONTADO = :NIT INTO :numrows;
    IF (numrows = 0) THEN
        BEGIN
        FECINI = FECINI - 1;
        INICIAL = 0;
        FOR SELECT MVCL_TIPOREF, MVCL_IDREF FROM MOVIMIENTO_CLIENTES
            WHERE TERC_NIT = :NIT AND MVCL_FECHA <= :FECINI AND
            MVCL_ABONO = 'N' AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA))
            INTO :TIPODOC, :IDDOC
            DO
            BEGIN
            EXECUTE PROCEDURE saldo_doc_cartera(TIPODOC, IDDOC, FECINI) returning_values (SALDO);
            INICIAL = INICIAL + SALDO;
            END
        EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'DESCONTAR RETENCIONES POR CAUSACION') returning_values(:RETES);
        FECINI = FECINI + 1;
        if (RETES = 'SI') then
            BEGIN
            SELECT SUM(MVCL_MONTO-MVCL_RTEFTE-MVCL_RTEIVA-MVCL_RTEICA) FROM movimiento_clientes
                WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND MVCL_FECHA < :FECFIN
                AND MVCL_DEBITO = 'S' AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA))
                INTO :DEBITOS;
            SELECT SUM(MVCL_MONTO-MVCL_RTEFTE-MVCL_RTEIVA-MVCL_RTEICA) FROM movimiento_clientes
                WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND MVCL_FECHA < :FECFIN
                AND MVCL_DEBITO = 'N' AND MVCL_ABONO = 'N' and MVCL_TIPOREF <> 45 AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA))
                INTO :CREDITOS;
            SELECT SUM(MVCL_MONTO) FROM movimiento_clientes
                WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND MVCL_FECHA < :FECFIN
                AND MVCL_ABONO = 'S' AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA))
                INTO :ABONOS;
            END
        ELSE
            BEGIN
            SELECT SUM(MVCL_MONTO) FROM movimiento_clientes
                WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND MVCL_FECHA < :FECFIN
                AND MVCL_DEBITO = 'S' AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA))
                INTO :DEBITOS;
            SELECT SUM(MVCL_MONTO) FROM movimiento_clientes
                WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND MVCL_FECHA < :FECFIN
                AND MVCL_DEBITO = 'N' AND MVCL_ABONO = 'N' and MVCL_TIPOREF <> 45 AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA))
                INTO :CREDITOS;
            SELECT SUM(MVCL_MONTO+MVCL_RTEFTE+MVCL_RTEIVA+MVCL_RTEICA) FROM movimiento_clientes
                WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND MVCL_FECHA < :FECFIN
                AND MVCL_ABONO = 'S' AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA))
                INTO :ABONOS;
            END
        if (DEBITOS IS NULL) then
            DEBITOS = 0;
        if (CREDITOS IS NULL) then
            CREDITOS = 0;
        if (ABONOS IS NULL) then
            ABONOS = 0;
        CREDITOS = CREDITOS + ABONOS;
        SALDO = INICIAL + DEBITOS - CREDITOS;

        /* LO CONTABLE */
        EXECUTE PROCEDURE SALDO_TERCERO_MES(ctacart, NIT, ANO, MES, 'S') RETURNING_VALUES (INICIALC);
        EXECUTE PROCEDURE MOVIMIENTO_TERCERO_MES(ctacart, NIT, ANO, MES, 'S') RETURNING_VALUES(DEBITOSC);
        EXECUTE PROCEDURE MOVIMIENTO_TERCERO_MES(ctacart, NIT, ANO, MES, 'N') RETURNING_VALUES(CREDITOSC);
        SALDOC = INICIALC + DEBITOSC - CREDITOSC;
        diferencia = SALDO - SALDOC;
        if (DIFERENCIA <> 0) then
            BEGIN
            if (ANTERIOR <> 'S') then
                SUSPEND;
            ELSE
                BEGIN
                if (DIFERENCIA <> (INICIAL - INICIALC)) then
                    SUSPEND;
                END
            END
        END
    END
end
^

SET TERM ; ^


INSERT INTO PROCEDIMIENTOS_USUARIO (PRUS_COD, PRUS_NOMBRE, PRUS_SP, PRUS_PARAM1, PRUS_PARAM2, PRUS_PARAM3) VALUES (5, 'Conciliación cartera-contable saldos por tercero', 'CONCILIA_CARTERA', 'Cuenta cartera', 'Agencia', 'Sólo descuadre mes');
commit work;

SET TERM ^ ;

CREATE PROCEDURE CONCILIA_CXPAGAR(
    FECINI DATE,
    FECFIN DATE,
    CTACART VARCHAR(20),
    SUBEMPRESA INTEGER,
    ANTERIOR CHAR(1))
RETURNS (
    NIT VARCHAR(20),
    NOMBRE VARCHAR(60),
    INICIAL NUMERIC(18,2),
    INICIALC NUMERIC(18,2),
    DEBITOS NUMERIC(18,2),
    DEBITOSC NUMERIC(18,2),
    CREDITOS NUMERIC(18,2),
    CREDITOSC NUMERIC(18,2),
    SALDO NUMERIC(18,2),
    SALDOC NUMERIC(18,2),
    DIFERENCIA NUMERIC(18,2))
AS
declare variable ANO CHAR(4);
declare variable MES INTEGER;
declare variable ABONOS NUMERIC(18,2);
declare variable RETES CHAR(2);
begin
ano = EXTRACT(YEAR FROM FECFIN);
mes = EXTRACT(MONTH FROM FECFIN);

for select TERC_NIT, TERC_NOM from TERCEROS WHERE TERC_PROV = 'S' into :NIT, :NOMBRE
    DO
    BEGIN
    EXECUTE PROCEDURE saldo_proveedor (NIT, FECINI) returning_values (INICIAL);
    EXECUTE PROCEDURE LEE_CONFIGURACION('CXPAGAR', 'SALDOS', 'DESCONTAR RETENCIONES POR CAUSACION') returning_values(:RETES);
    if (RETES = 'SI') then
        BEGIN
        SELECT SUM(MVPR_MONTO-MVPR_RTFTE-MVPR_RTIVA-MVPR_RTICA)
            FROM movimiento_proveedor
            WHERE TERC_NIT = :NIT AND MVPR_FECHA >= :FECINI AND MVPR_FECHA < :FECFIN AND MVPR_DEBITO = 'S'
            INTO :DEBITOS;
        SELECT SUM(MVPR_MONTO-MVPR_RTFTE-MVPR_RTIVA-MVPR_RTICA)
            FROM movimiento_proveedor
            WHERE TERC_NIT = :NIT AND MVPR_FECHA >= :FECINI AND MVPR_FECHA < :FECFIN AND MVPR_DEBITO = 'N' AND MVPR_ABONO = 'N' and MVPR_TIPOREF <> 55
            INTO :CREDITOS;
        SELECT SUM(MVPR_MONTO) FROM movimiento_proveedor
            WHERE TERC_NIT = :NIT AND MVPR_FECHA >= :FECINI AND MVPR_FECHA < :FECFIN AND MVPR_ABONO = 'S'
            INTO :ABONOS;
        END
    ELSE
        BEGIN
        SELECT SUM(MVPR_MONTO)
            FROM movimiento_proveedor
            WHERE TERC_NIT = :NIT AND MVPR_FECHA >= :FECINI AND MVPR_FECHA < :FECFIN AND MVPR_DEBITO = 'S'
            INTO :DEBITOS;
        SELECT SUM(MVPR_MONTO)
            FROM movimiento_proveedor
            WHERE TERC_NIT = :NIT AND MVPR_FECHA >= :FECINI AND MVPR_FECHA < :FECFIN AND MVPR_DEBITO = 'N' AND MVPR_ABONO = 'N' AND MVPR_TIPOREF <> 55
            INTO :CREDITOS;
        SELECT SUM(MVPR_MONTO+MVPR_RTFTE+MVPR_RTIVA+MVPR_RTICA)
            FROM movimiento_proveedor
            WHERE TERC_NIT = :NIT AND MVPR_FECHA >= :FECINI AND MVPR_FECHA < :FECFIN AND MVPR_ABONO = 'S'
            INTO :ABONOS;
        END
    if (DEBITOS IS NULL) then
        DEBITOS = 0;
    if (CREDITOS IS NULL) then
        CREDITOS = 0;
    if (ABONOS IS NULL) then
        ABONOS = 0;
    CREDITOS = CREDITOS + ABONOS;
    SALDO = INICIAL + DEBITOS - CREDITOS;

    /* LO CONTABLE */
    EXECUTE PROCEDURE SALDO_TERCERO_MES(ctacart, NIT, ANO, MES, 'S') RETURNING_VALUES (INICIALC);
    EXECUTE PROCEDURE MOVIMIENTO_TERCERO_MES(ctacart, NIT, ANO, MES, 'S') RETURNING_VALUES(DEBITOSC);
    EXECUTE PROCEDURE MOVIMIENTO_TERCERO_MES(ctacart, NIT, ANO, MES, 'N') RETURNING_VALUES(CREDITOSC);
    SALDOC = INICIALC + DEBITOSC - CREDITOSC;
    diferencia = SALDO + SALDOC;
    if (DIFERENCIA <> 0) then
        BEGIN
        if (ANTERIOR <> 'S') then
            SUSPEND;
        ELSE
            BEGIN
            if (DIFERENCIA <> (INICIAL + INICIALC)) then
                SUSPEND;
            END
        END
    END
end
^

SET TERM ; ^

INSERT INTO PROCEDIMIENTOS_USUARIO (PRUS_COD, PRUS_NOMBRE, PRUS_SP, PRUS_PARAM1, PRUS_PARAM2, PRUS_PARAM3) VALUES (6, 'Conciliación cxpagar-contable saldos por tercero', 'CONCILIA_CXPAGAR', 'Cuenta proveedores', 'Agencia', 'Sólo descuadre mes');
commit work;

grant EXECUTE on PROCEDURE CONCILIA_CARTERA to PUBLIC;
grant EXECUTE on PROCEDURE CONCILIA_CXPAGAR to PUBLIC;


/* 06-03 OBSERVACIONES POR ITEM */
SET TERM ^ ;

CREATE OR ALTER PROCEDURE IMPR_FACTURA(
    ID INTEGER)
RETURNS (
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    VENCE DATE,
    DIASVENCE INTEGER,
    CONTCRED CHAR(17),
    NIT VARCHAR(20),
    NOMTERCERO VARCHAR(60),
    VENDEDOR INTEGER,
    NOMVENDEDOR VARCHAR(60),
    PUNTOVTA INTEGER,
    NOMPUNTOVTA VARCHAR(30),
    CODBODEGA VARCHAR(2),
    NOMBODEGA VARCHAR(30),
    AUTORIZACION VARCHAR(20),
    DESPACHO VARCHAR(255),
    TRANSPORTADOR VARCHAR(60),
    COTIZACION VARCHAR(30),
    PEDIDO VARCHAR(30),
    REMISION VARCHAR(30),
    PACIENTE VARCHAR(20),
    NOMPACIENTE VARCHAR(60),
    COMIPORC NUMERIC(9,2),
    COMIMONTO NUMERIC(18,2),
    SUBTOTAL NUMERIC(18,2),
    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),
    EXTRA NUMERIC(18,2),
    DTOFPORC NUMERIC(9,2),
    DTOFMONTO NUMERIC(18,2),
    FECHADTO DATE,
    TOTALFAC NUMERIC(18,2),
    TOTALPAGAR NUMERIC(18,2),
    OBS BLOB SUB_TYPE 1 SEGMENT SIZE 80,
    ITEM INTEGER,
    ARTICULO VARCHAR(15),
    CODBAR VARCHAR(15),
    ARTIDES VARCHAR(60),
    CANT NUMERIC(18,4),
    LOTE VARCHAR(15),
    VLOTE DATE,
    UNIDAD VARCHAR(8),
    FACTOR INTEGER,
    LISTAPR INTEGER,
    REFITEM VARCHAR(60),
    BODITEM VARCHAR(2),
    PRUNIT NUMERIC(18,2),
    DTOITPORC NUMERIC(9,2),
    DTOITMONTO NUMERIC(18,2),
    PRNETO NUMERIC(18,2),
    IVAPORC NUMERIC(9,2),
    IVAITMONTO NUMERIC(18,2),
    CONSUMO NUMERIC(18,2),
    SUBTOTIT NUMERIC(18,2),
    SUBTOTITCON NUMERIC(18,2),
    TOTAL NUMERIC(18,2),
    CODIGOCL VARCHAR(20),
    ZONACOD VARCHAR(2),
    ZONANOM VARCHAR(60),
    DV CHAR(1),
    DIRECCION VARCHAR(60),
    CIUDAD VARCHAR(40),
    TELEFONO VARCHAR(40),
    CONTACTO VARCHAR(60),
    FAX VARCHAR(25),
    GRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    SUBGRUPO VARCHAR(3),
    NOMSUBG VARCHAR(30),
    MARCA VARCHAR(3),
    NOMMARCA VARCHAR(30),
    PESO NUMERIC(18,4),
    ANCHO NUMERIC(18,4),
    ALTO NUMERIC(18,4),
    LARGO NUMERIC(18,4),
    SUMA1 NUMERIC(18,2),
    SUMA2 NUMERIC(18,2),
    SUMA3 NUMERIC(18,2),
    IVA1 NUMERIC(18,2),
    IVA2 NUMERIC(18,2),
    IVA3 NUMERIC(18,2),
    SUMAEX NUMERIC(18,2),
    SUMAGR NUMERIC(18,2),
    TOTCONSUMO NUMERIC(18,2),
    VEHICULO VARCHAR(8),
    RECIBIDO NUMERIC(18,2),
    CAMBIO NUMERIC(18,2),
    HORA TIME,
    FORMAPAGO1 VARCHAR(30),
    MONTOPAGO1 NUMERIC(18,2),
    FORMAPAGO2 VARCHAR(30),
    MONTOPAGO2 NUMERIC(18,2),
    FORMAPAGO3 VARCHAR(30),
    MONTOPAGO3 NUMERIC(18,2),
    PUNTOS INTEGER,
    PUNTOSACUM INTEGER,
    PUNTOSVENC INTEGER,
    OBSITEM BLOB SUB_TYPE 1 SEGMENT SIZE 80)
AS
DECLARE VARIABLE IMPTOS CHAR(1);
DECLARE VARIABLE TARIFA INTEGER;
declare variable DEVUELTO NUMERIC(18,2);
/*DECLARE VARIABLE NROCOPIA INTEGER;*/
declare variable ORDENCOD CHAR(2);
declare variable IMPRDEV CHAR(2);
declare variable IMPR CHAR(1);
declare variable ITEMFP INTEGER;
declare variable FORMAP VARCHAR(30);
declare variable MONTOP NUMERIC(18,2);
declare variable SUCUR VARCHAR(10);
BEGIN
  SELECT F.PREF_PRE, FACT_NUMERO, FACT_FECHA, FACT_VENCE, F.BODE_COD, BODE_NOM, F.TERC_NIT, FACT_NOMCLIENTE, F.VEND_COD, VEND_NOMBRE, F.PTVT_ID, PTVT_NOM,
    AUTO_NUMERO, FACT_DESPACHO, FACT_TRANSP, FACT_COTIZACI, FACT_PEDIDO, FACT_REMISION, FACT_COMIPORC, FACT_COMIMONTO, FACT_IVAINC, 
    FACT_DTOPOR, FACT_DTOMONTO, FACT_ADICIONAL, FACT_IVAMONTO, FACT_RTFTEPOR, FACT_RTFTEMONTO, FACT_RTIVAPOR, FACT_RTIVAMONTO, FACT_RTICAPOR, FACT_RTICAMONTO, FACT_EXTRA, FACT_DTOFPOR, FACT_DTOFMONTO, FACT_DTOFFECHA, FACT_TOTAL,
    TERC_DIR, TERC_CIU, TERC_TEL, TERC_CONTACTO, TERC_FAX, TERC_DV,
    FACT_OBS, VEHI_COD, /*FACT_NROCOPIA,*/ FACT_RECIBIDO, FACT_SUCURSAL, FACT_DETCLI, FACT_DETCLINOM
    FROM FACTURAS F, BODEGA B, VENDEDORES V, PUNTO_VENTA P, TERCEROS T
    WHERE F.BODE_COD = B.BODE_COD AND F.VEND_COD = V.VEND_COD AND F.PTVT_ID = P.PTVT_ID AND F.TERC_NIT = T.TERC_NIT AND F.FACT_ID = :ID
    into :PREF, :NUMERO, :FECHA, :VENCE, :CODBODEGA, :NOMBODEGA, :NIT, :NOMTERCERO, :VENDEDOR, :NOMVENDEDOR, :PUNTOVTA, :NOMPUNTOVTA,
    :AUTORIZACION, :DESPACHO, :TRANSPORTADOR, :COTIZACION, :PEDIDO, :REMISION, :COMIPORC, :COMIMONTO, :IMPTOS,
    :DTOPORC, :DTOMONTO, :ADICIONAL, :IVAMONTO, :RTEFTEPORC, :RTEFTEMONTO, :RTEIVAPORC, :RTEIVAMONTO, :RTEICAPORC, :RTEICAMONTO, :EXTRA, :DTOFPORC, :DTOFMONTO, :FECHADTO, :TOTALFAC,
    :DIRECCION, :CIUDAD, :TELEFONO, :CONTACTO, :FAX, :DV, :OBS, :VEHICULO,/* :NROCOPIA,*/ :RECIBIDO, :SUCUR, :paciente, :nompaciente;

  /* ACUMULE LOS PUNTOS, SE HACE ACA POR SER POSTERIOR AL DETALLE */
  EXECUTE PROCEDURE acumula_puntos_cliente (31, :id, :nit, :fecha) returning_values (:PUNTOS);
  EXECUTE PROCEDURE consulta_puntos_cliente (:id, :nit, :fecha) returning_values (:puntos, :puntosacum, :puntosvenc);

  SELECT CLIE_COD, C.ZONA_COD, ZONA_NOM
    FROM CLIENTES C, ZONAS Z
    WHERE TERC_NIT = :NIT AND C.ZONA_COD = Z.ZONA_COD
    INTO :CODIGOCL, :ZONACOD, :ZONANOM;
  /*SELECT NOCO_NOMBRE FROM NOMBRES_COPIAS where NOCO_ID = :NROCOPIA INTO :NOMCOPIA;*/
  SELECT CLSU_DIR, CLSU_CIUDAD, CLSU_TEL FROM CLIENTE_SUCURSALES WHERE TERC_NIT = :NIT AND CLCU_COD = :SUCUR
    INTO :DIRECCION, :CIUDAD, :TELEFONO;
  /*if (NOMCOPIA IS NULL) then
    NOMCOPIA = 'COPIA No. ' || NROCOPIA;**/
  DIASVENCE = VENCE - FECHA;
  if (DIASVENCE > 0) then
    CONTCRED = 'CREDITO ' || CAST(DIASVENCE AS VARCHAR(3)) || ' DIAS';
  ELSE
    CONTCRED = 'CONTADO';
  SUBTOTAL = TOTALFAC - EXTRA - IVAMONTO - ADICIONAL + DTOMONTO;
  TOTALPAGAR = TOTALFAC - RTEFTEMONTO - RTEIVAMONTO - RTEICAMONTO;
  if (RECIBIDO <> 0) then
      CAMBIO = RECIBIDO - totalpagar;
  ELSE
    CAMBIO = 0;
  SUMAEX = 0;
  SUMA1 = 0;
  SUMA2 = 0;
  SUMA3 = 0;
  IVA1 = 0;
  IVA2 = 0;
  IVA3 = 0;
  TOTCONSUMO = 0;
  MONTOPAGO1 = 0;
  SELECT MAX(AUDI_HORA) FROM AUDITORIA WHERE TIDO_COD = 31 AND AUDI_IDDOC = :ID AND AUDI_OPER = 'I' INTO :HORA;
  /* AHORA LAS FORMAS DE PAGO, BUSQUE EL ABONO DE HOY A LA FACTURA */
  ITEMFP = 1;
  MONTOPAGO1 = 0;
  MONTOPAGO2 = 0;
  MONTOPAGO3 = 0;
  FOR SELECT FOPA_NOM, RCPA_MONTO FROM RECIBOS_CAJA_PAGO P, FORMAS_PAGO F, RECIBOS_CAJA R, RECIBOS_CAJA_DETALLE D
    WHERE R.RECA_ID = P.RECA_ID AND R.RECA_ID = D.RECA_ID AND P.FOPA_ID = F.FOPA_ID AND RECA_FECHA = :FECHA AND RCDE_TIPODOC = 31 AND RCDE_IDDOC = :ID
    INTO :formap, :MONTOP
    DO
    BEGIN
    if (ITEMFP = 1) then
        BEGIN
        FORMAPAGO1 = FORMAP;
        MONTOPAGO1 = MONTOP;
        END
    if (ITEMFP = 2) then
        BEGIN
        FORMAPAGO2 = FORMAP;
        MONTOPAGO2 = MONTOP;
        END
    if (ITEMFP = 3) then
        BEGIN
        FORMAPAGO3 = FORMAP;
        MONTOPAGO3 = MONTOP;
        END
    ITEMFP = ITEMFP + 1;
    END
  EXECUTE PROCEDURE lee_configuracion ('FACTURACION','DOCUMENTOS','ORDENAR ITEMS POR CODIGO DE ARTICULO') returning_values (:ORDENCOD);
  EXECUTE PROCEDURE lee_configuracion ('FACTURACION','POS', 'IMPRIMIR DEVOLUCIONES DE ARTICULOS NEGATIVOS') returning_values (:imprdev);
  if (ORDENCOD = 'SI') then
    BEGIN
    FOR SELECT FADE_ITEM, D.ARTI_COD, FADE_CODBAR, SUBSTR(FADE_DESC,1,60), FADE_CANT, FADE_UNIDAD, FADE_FACTOR, BODE_COD, FADE_LOTE, LIPR_COD, FADE_PRUNIT, FADE_DTOPORC, FADE_DTOMONTO, FADE_IVAPORC, FADE_IVAMONTO, FADE_CONSUMO, FADE_TOTAL, FADE_REFERENCIA,
        GRUP_COD, SUBG_COD, MARC_COD, ARTI_PESO, ARTI_ANCHO, ARTI_ALTO, ARTI_LARGO, TAIV_COD, FADE_DEVUELTO, FADE_OBS
        FROM FACTURAS_DETALLE D, ARTICULO A
        WHERE D.ARTI_COD = A.ARTI_COD AND D.FACT_ID = :ID
        ORDER BY D.ARTI_COD
        INTO :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :FACTOR, :BODITEM, :LOTE, :LISTAPR, :PRUNIT, :DTOITPORC, :DTOITMONTO, :IVAPORC, :IVAITMONTO, :CONSUMO, :TOTAL, :refitem,
        :GRUPO, :SUBGRUPO, :MARCA, :PESO, :ANCHO, :ALTO, :LARGO, :TARIFA, :devuelto, :obsitem
        DO
          BEGIN
          if (ARTICULO = CODBAR) then
            SELECT FIRST 1 COBA_COD FROM barras_articulo WHERE ARTI_COD = :articulo INTO :CODBAR;
          if (IMPRDEV <> 'SI') then
            BEGIN
            if ((CANT >= 0) AND (DEVUELTO = 0)) then
                IMPR = 'S';
            ELSE
                IMPR = 'N'; /* ES DEVOLUCION */
            END
          ELSE
            IMPR = 'S';
          if (IMPR = 'S') then
            BEGIN
            if (IMPTOS = 'S') then
                if (cant <> 0) then
                    PRNETO = PRUNIT - DTOITMONTO - ((IVAITMONTO+CONSUMO) / CANT);
                else
                    PRNETO = PRUNIT - DTOITMONTO;
            ELSE
                PRNETO = PRUNIT - DTOITMONTO;
            SUBTOTIT = TOTAL - IVAITMONTO - CONSUMO;
            SUBTOTITCON = TOTAL;
            TOTCONSUMO = TOTCONSUMO + CONSUMO;
            SELECT LOTE_VENCE FROM LOTES WHERE LOTE_NRO = :lote AND ARTI_COD = :ARTICULO INTO :vlote;
            if (TARIFA = 0) then
                SUMAEX = SUMAEX + TOTAL;
            if (TARIFA = 1) then
                BEGIN
                SUMA1 = SUMA1 + TOTAL - IVAITMONTO;
                IVA1 = IVA1 + IVAITMONTO;
                END
            if (TARIFA = 2) then
                BEGIN
                SUMA2 = SUMA2 + TOTAL - IVAITMONTO;
                IVA2 = IVA2 + IVAITMONTO;
                END
            if (TARIFA = 3) then
                BEGIN
                SUMA3 = SUMA3 + TOTAL - IVAITMONTO;
                IVA3 = IVA3 + IVAITMONTO;
                END
            SUMAGR = SUMA1 + SUMA2 + SUMA3;
            if (IMPTOS = 'N') then
                TOTAL = TOTAL - IVAITMONTO - CONSUMO;
            if (ANCHO IS NULL) then
                ANCHO = 0;
            if (ALTO IS NULL) then
                ALTO = 0;
            if (LARGO IS NULL) then
                LARGO = 0;
            if (PESO IS NULL) then
                PESO = 0;
            PESO = PESO * CANT;
            SUSPEND;
            END
          END
    END
ELSE
    BEGIN
    FOR SELECT FADE_ITEM, D.ARTI_COD, FADE_CODBAR, SUBSTR(FADE_DESC,1,60), FADE_CANT, FADE_UNIDAD, FADE_FACTOR, BODE_COD, FADE_LOTE, LIPR_COD, FADE_PRUNIT, FADE_DTOPORC, FADE_DTOMONTO, FADE_IVAPORC, FADE_IVAMONTO, FADE_CONSUMO, FADE_TOTAL, FADE_REFERENCIA,
        GRUP_COD, SUBG_COD, MARC_COD, ARTI_PESO, ARTI_ANCHO, ARTI_ALTO, ARTI_LARGO, TAIV_COD, FADE_DEVUELTO, FADE_OBS
        FROM FACTURAS_DETALLE D, ARTICULO A
        WHERE D.ARTI_COD = A.ARTI_COD AND D.FACT_ID = :ID
        ORDER BY FADE_ITEM
        INTO :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :FACTOR, :BODITEM, :LOTE, :LISTAPR, :PRUNIT, :DTOITPORC, :DTOITMONTO, :IVAPORC, :IVAITMONTO, :CONSUMO, :TOTAL, :refitem, 
        :GRUPO, :SUBGRUPO, :MARCA, :PESO, :ANCHO, :ALTO, :LARGO, :TARIFA, :devuelto, :obsitem
        DO
          BEGIN
          if (IMPRDEV <> 'SI') then
            BEGIN
            if ((CANT >= 0) AND (DEVUELTO = 0)) then
                IMPR = 'S';
            ELSE
                IMPR = 'N'; /* ES DEVOLUCION */
            END
          ELSE
            IMPR = 'S';
          if (IMPR = 'S') then
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :GRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :MARCA INTO NOMMARCA;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :SUBGRUPO AND GRUP_COD = :GRUPO INTO :NOMSUBG;
            if (IMPTOS = 'S') then
              PRNETO = PRUNIT - DTOITMONTO - ((IVAITMONTO+CONSUMO) / CANT);
            ELSE
              PRNETO = PRUNIT - DTOITMONTO;
            SUBTOTIT = TOTAL - IVAITMONTO - CONSUMO;
            SUBTOTITCON = TOTAL;
            TOTCONSUMO = TOTCONSUMO + CONSUMO;
            SELECT LOTE_VENCE FROM LOTES WHERE LOTE_NRO = :lote AND ARTI_COD = :ARTICULO INTO :vlote;
            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;
            if (ANCHO IS NULL) then
                ANCHO = 0;
            if (ALTO IS NULL) then
                ALTO = 0;
            if (LARGO IS NULL) then
                LARGO = 0;
            if (PESO IS NULL) then
                PESO = 0;
            PESO = PESO * CANT;
            SUSPEND;
            END
          END
    END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER PROCEDURE IMPR_COTIZACION(
    ID INTEGER)
RETURNS (
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    VALIDEZ INTEGER,
    NIT VARCHAR(20),
    NOMTERCERO VARCHAR(60),
    VENDEDOR INTEGER,
    NOMVENDEDOR VARCHAR(60),
    PUNTOVTA INTEGER,
    NOMPUNTOVTA VARCHAR(30),
    SUBTOTAL NUMERIC(18,2),
    DTOPORC NUMERIC(9,2),
    DTOMONTO NUMERIC(18,2),
    ADICIONAL NUMERIC(18,2),
    IVAMONTO NUMERIC(18,2),
    EXTRA NUMERIC(18,2),
    TOTALFAC NUMERIC(18,2),
    OBS BLOB SUB_TYPE 1 SEGMENT SIZE 80,
    ITEM INTEGER,
    ARTICULO VARCHAR(15),
    CODBAR VARCHAR(15),
    ARTIDES VARCHAR(60),
    CANT NUMERIC(18,4),
    UNIDAD VARCHAR(8),
    LISTAPR INTEGER,
    REFITEM VARCHAR(60),
    PRUNIT NUMERIC(18,2),
    DTOITPORC NUMERIC(9,2),
    DTOITMONTO NUMERIC(18,2),
    PRNETO NUMERIC(18,2),
    IVAPORC NUMERIC(9,2),
    IVAITMONTO NUMERIC(18,2),
    CONSUMO NUMERIC(18,2),
    TOTAL NUMERIC(18,2),
    CODIGOCL VARCHAR(20),
    ZONACOD VARCHAR(2),
    ZONANOM VARCHAR(60),
    DV CHAR(1),
    DIRECCION VARCHAR(60),
    CIUDAD VARCHAR(40),
    TELEFONO VARCHAR(40),
    CONTACTO VARCHAR(60),
    FAX VARCHAR(25),
    GRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    SUBGRUPO VARCHAR(3),
    NOMSUBG VARCHAR(30),
    MARCA VARCHAR(3),
    NOMMARCA VARCHAR(30),
    PESO NUMERIC(9,4),
    ANCHO NUMERIC(18,4),
    ALTO NUMERIC(18,4),
    LARGO NUMERIC(18,4),
    SUMA1 NUMERIC(18,2),
    SUMA2 NUMERIC(18,2),
    SUMA3 NUMERIC(18,2),
    IVA1 NUMERIC(18,2),
    IVA2 NUMERIC(18,2),
    IVA3 NUMERIC(18,2),
    SUMAEX NUMERIC(18,2),
    SUMAGR NUMERIC(18,2),
    OBSITEM BLOB SUB_TYPE 1 SEGMENT SIZE 80)
AS
DECLARE VARIABLE IMPTOS CHAR(1);
DECLARE VARIABLE TARIFA INTEGER;
declare variable ORDENCOD CHAR(2);
declare variable SUCUR VARCHAR(10);
BEGIN
  /*  */
  SELECT F.PREF_PRE, COTI_NUMERO, COTI_FECHA, COTI_VALIDEZ, F.TERC_NIT, COTI_NOMTERC, F.VEND_COD, VEND_NOMBRE, F.PTVT_ID, PTVT_NOM,
    COTI_IMPTOS, COTI_DTOPORC, COTI_DTOMONTO, COTI_ADICIONAL, COTI_IVAMONTO, COTI_EXTRA, COTI_TOTAL,
    TERC_CONTACTO, TERC_FAX, TERC_DV, COTI_OBS, COTI_SUCURSAL
    FROM COTIZACIONES F, VENDEDORES V, PUNTO_VENTA P, TERCEROS T
    WHERE F.VEND_COD = V.VEND_COD AND F.PTVT_ID = P.PTVT_ID AND F.TERC_NIT = T.TERC_NIT AND F.COTI_ID = :ID
    into :PREF, :NUMERO, :FECHA, :VALIDEZ, :NIT, :NOMTERCERO, :VENDEDOR, :NOMVENDEDOR, :PUNTOVTA, :NOMPUNTOVTA,
    :IMPTOS, :DTOPORC, :DTOMONTO, :ADICIONAL, :IVAMONTO, :EXTRA, :TOTALFAC,
    :CONTACTO, :FAX, :DV, :OBS, :SUCUR;
  SUBTOTAL = TOTALFAC - EXTRA - IVAMONTO - ADICIONAL + DTOMONTO;

  SELECT CLIE_COD, C.ZONA_COD, ZONA_NOM
    FROM CLIENTES C, ZONAS Z
    WHERE TERC_NIT = :NIT AND C.ZONA_COD = Z.ZONA_COD
    INTO :CODIGOCL, :ZONACOD, :ZONANOM;
  SELECT CLSU_DIR, CLSU_CIUDAD, CLSU_TEL FROM CLIENTE_SUCURSALES WHERE TERC_NIT = :NIT AND CLCU_COD = :SUCUR
    INTO :DIRECCION, :CIUDAD, :TELEFONO;
    
  SUMAEX = 0;
  SUMA1 = 0;
  SUMA2 = 0;
  SUMA3 = 0;
  IVA1 = 0;
  IVA2 = 0;
  IVA3 = 0;
  ITEM = 0;
  EXECUTE PROCEDURE lee_configuracion ('FACTURACION','DOCUMENTOS','ORDENAR ITEMS POR CODIGO DE ARTICULO') returning_values (:ORDENCOD);
  if (ORDENCOD = 'SI') then
    BEGIN
    FOR SELECT D.ARTI_COD, CTDE_CODBAR, SUBSTR(CTDE_DESC,1,60), CTDE_CANT, CTDE_UNIDAD, LIPR_COD, CTDE_PRUNIT, CTDE_DTOPORC, CTDE_DTOMONTO, CTDE_IVAPORC, CTDE_IVAMONTO, CTDE_CONSUMO, CTDE_TOTAL, CTDE_REFERENCIA,
        GRUP_COD, SUBG_COD, MARC_COD, ARTI_PESO, ARTI_ANCHO, ARTI_ALTO, ARTI_LARGO, TAIV_COD, CTDE_OBS
        FROM COTIZACIONES_DETALLE D, ARTICULO A
        WHERE D.ARTI_COD = A.ARTI_COD AND D.COTI_ID = :ID
        ORDER BY CTDE_CODBAR
        INTO :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :LISTAPR, :PRUNIT, :DTOITPORC, :DTOITMONTO, :IVAPORC, :IVAITMONTO, :CONSUMO, :TOTAL, :refitem,
        :GRUPO, :SUBGRUPO, :MARCA, :PESO, :ANCHO, :ALTO, :LARGO, :TARIFA, :obsitem
        DO
        BEGIN
        if (ARTICULO = CODBAR) then
            SELECT FIRST 1 COBA_COD FROM barras_articulo WHERE ARTI_COD = :articulo INTO :CODBAR;
        SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :GRUPO INTO NOMGRUPO;
        SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :MARCA INTO NOMMARCA;
        SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :SUBGRUPO AND GRUP_COD = :GRUPO INTO :NOMSUBG;
        ITEM = ITEM + 1;
        PRNETO = PRUNIT - DTOITMONTO;
        if (ivaporc = 0) then
            SUMAEX = SUMAEX + TOTAL;
        if (TARIFA = 1) then
            BEGIN
            SUMA1 = SUMA1 + TOTAL - IVAITMONTO;
            IVA1 = IVA1 + IVAITMONTO;
            END
        if (TARIFA = 2) then
            BEGIN
            SUMA2 = SUMA2 + TOTAL - IVAITMONTO;
            IVA2 = IVA2 + IVAITMONTO;
            END
        if (TARIFA = 3) then
            BEGIN
            SUMA3 = SUMA3 + TOTAL - IVAITMONTO;
            IVA3 = IVA3 + IVAITMONTO;
            END
        SUMAGR = SUMA1 + SUMA2 + SUMA3;
        if (IMPTOS = 'N') then
            TOTAL = TOTAL - IVAITMONTO;
        SUSPEND;
        END
    END
ELSE
    BEGIN
    FOR SELECT D.ARTI_COD, CTDE_CODBAR, SUBSTR(CTDE_DESC,1,60), CTDE_CANT, CTDE_UNIDAD, LIPR_COD, CTDE_PRUNIT, CTDE_DTOPORC, CTDE_DTOMONTO, CTDE_IVAPORC, CTDE_IVAMONTO, CTDE_CONSUMO, CTDE_TOTAL, CTDE_REFERENCIA,
        GRUP_COD, SUBG_COD, MARC_COD, ARTI_PESO, ARTI_ANCHO, ARTI_ALTO, ARTI_LARGO, TAIV_COD, CTDE_OBS
        FROM COTIZACIONES_DETALLE D, ARTICULO A
        WHERE D.ARTI_COD = A.ARTI_COD AND D.COTI_ID = :ID
        ORDER BY CTDE_ITEM
        INTO :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :LISTAPR, :PRUNIT, :DTOITPORC, :DTOITMONTO, :IVAPORC, :IVAITMONTO, :CONSUMO, :TOTAL, :refitem,
        :GRUPO, :SUBGRUPO, :MARCA, :PESO, :ANCHO, :ALTO, :LARGO, :TARIFA, :obsitem
        DO
        BEGIN
        SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :GRUPO INTO NOMGRUPO;
        SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :MARCA INTO NOMMARCA;
        SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :SUBGRUPO AND GRUP_COD = :GRUPO INTO :NOMSUBG;
        ITEM = ITEM + 1;
        PRNETO = PRUNIT - DTOITMONTO;
        if (ivaporc = 0) then
            SUMAEX = SUMAEX + TOTAL;
        if (TARIFA = 1) then
            BEGIN
            SUMA1 = SUMA1 + TOTAL - IVAITMONTO;
            IVA1 = IVA1 + IVAITMONTO;
            END
        if (TARIFA = 2) then
            BEGIN
            SUMA2 = SUMA2 + TOTAL - IVAITMONTO;
            IVA2 = IVA2 + IVAITMONTO;
            END
        if (TARIFA = 3) then
            BEGIN
            SUMA3 = SUMA3 + TOTAL - IVAITMONTO;
            IVA3 = IVA3 + IVAITMONTO;
            END
        SUMAGR = SUMA1 + SUMA2 + SUMA3;
        if (IMPTOS = 'N') then
            TOTAL = TOTAL - IVAITMONTO;
        SUSPEND;
        END
    END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER PROCEDURE IMPR_PEDIDO(
    ID INTEGER)
RETURNS (
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    VALIDEZ INTEGER,
    NIT VARCHAR(20),
    NOMTERCERO VARCHAR(60),
    VENDEDOR INTEGER,
    NOMVENDEDOR VARCHAR(60),
    PUNTOVTA INTEGER,
    NOMPUNTOVTA VARCHAR(30),
    COTIZACION VARCHAR(30),
    SUBTOTAL NUMERIC(18,2),
    DTOPORC NUMERIC(9,2),
    DTOMONTO NUMERIC(18,2),
    ADICIONAL NUMERIC(18,2),
    IVAMONTO NUMERIC(18,2),
    EXTRA NUMERIC(18,2),
    TOTALFAC NUMERIC(18,2),
    OBS BLOB SUB_TYPE 1 SEGMENT SIZE 80,
    ITEM INTEGER,
    ARTICULO VARCHAR(15),
    CODBAR VARCHAR(15),
    ARTIDES VARCHAR(60),
    BODEGA VARCHAR(2),
    CANT NUMERIC(18,4),
    UNIDAD VARCHAR(8),
    LISTAPR INTEGER,
    REFITEM VARCHAR(60),
    PRUNIT NUMERIC(18,2),
    DTOITPORC NUMERIC(9,2),
    DTOITMONTO NUMERIC(18,2),
    PRNETO NUMERIC(18,2),
    IVAPORC NUMERIC(9,2),
    IVAITMONTO NUMERIC(18,2),
    CONSUMO NUMERIC(18,2),
    TOTAL NUMERIC(18,2),
    CODIGOCL VARCHAR(20),
    ZONACOD VARCHAR(2),
    ZONANOM VARCHAR(60),
    DV CHAR(1),
    DIRECCION VARCHAR(60),
    CIUDAD VARCHAR(40),
    TELEFONO VARCHAR(40),
    CONTACTO VARCHAR(60),
    FAX VARCHAR(25),
    GRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    SUBGRUPO VARCHAR(3),
    NOMSUBG VARCHAR(30),
    MARCA VARCHAR(3),
    NOMMARCA VARCHAR(30),
    PESO NUMERIC(9,4),
    ANCHO NUMERIC(18,4),
    ALTO NUMERIC(18,4),
    LARGO NUMERIC(18,4),
    SUMA1 NUMERIC(18,2),
    SUMA2 NUMERIC(18,2),
    SUMA3 NUMERIC(18,2),
    IVA1 NUMERIC(18,2),
    IVA2 NUMERIC(18,2),
    IVA3 NUMERIC(18,2),
    SUMAEX NUMERIC(18,2),
    SUMAGR NUMERIC(18,2),
    OBSITEM BLOB SUB_TYPE 1 SEGMENT SIZE 80)
AS
DECLARE VARIABLE IMPTOS CHAR(1);
DECLARE VARIABLE TARIFA INTEGER;
declare variable ORDENCOD CHAR(2);
declare variable SUCUR VARCHAR(10);
BEGIN
  /*  */
  SELECT F.PREF_PRE, PEDI_NUMERO, PEDI_FECHA, PEDI_VALIDEZ, F.TERC_NIT, PEDI_NOMTERC, F.VEND_COD, VEND_NOMBRE, F.PTVT_ID, PTVT_NOM, PEDI_COTIZACI,
    PEDI_IVAINC, PEDI_DTOPOR, PEDI_DTOMONTO, PEDI_ADICIONAL, PEDI_IVAMONTO, PEDI_EXTRA, PEDI_TOTAL,
    TERC_CONTACTO, TERC_FAX, TERC_DV, PEDI_OBS, PEDI_SUCURSAL
    FROM PEDIDOS F, VENDEDORES V, PUNTO_VENTA P, TERCEROS T
    WHERE F.VEND_COD = V.VEND_COD AND F.PTVT_ID = P.PTVT_ID AND F.TERC_NIT = T.TERC_NIT AND F.PEDI_ID = :ID
    into :PREF, :NUMERO, :FECHA, :VALIDEZ, :NIT, :NOMTERCERO, :VENDEDOR, :NOMVENDEDOR, :PUNTOVTA, :NOMPUNTOVTA, :COTIZACION,
    :IMPTOS, :DTOPORC, :DTOMONTO, :ADICIONAL, :IVAMONTO, :EXTRA, :TOTALFAC,
    :CONTACTO, :FAX, :DV, :OBS, :SUCUR;
  SUBTOTAL = TOTALFAC - EXTRA - IVAMONTO - ADICIONAL + DTOMONTO;

  SELECT CLIE_COD, C.ZONA_COD, ZONA_NOM
    FROM CLIENTES C, ZONAS Z
    WHERE TERC_NIT = :NIT AND C.ZONA_COD = Z.ZONA_COD
    INTO :CODIGOCL, :ZONACOD, :ZONANOM;
  SELECT CLSU_DIR, CLSU_CIUDAD, CLSU_TEL FROM CLIENTE_SUCURSALES WHERE TERC_NIT = :NIT AND CLCU_COD = :SUCUR
    INTO :DIRECCION, :CIUDAD, :TELEFONO;
    
  SUMAEX = 0;
  SUMA1 = 0;
  SUMA2 = 0;
  SUMA3 = 0;
  IVA1 = 0;
  IVA2 = 0;
  IVA3 = 0;
  ITEM = 0;
  EXECUTE PROCEDURE lee_configuracion ('FACTURACION','DOCUMENTOS','ORDENAR ITEMS POR CODIGO DE ARTICULO') returning_values (:ORDENCOD);
  if (ORDENCOD = 'SI') then
    BEGIN
    FOR SELECT D.ARTI_COD, PEDE_CODBAR, SUBSTR(PEDE_DESC,1,60), PEDE_CANT, PEDE_UNIDAD, LIPR_COD, PEDE_PRUNIT, PEDE_DTOPORC, PEDE_DTOMONTO, PEDE_IVAPORC, PEDE_IVAMONTO, PEDE_CONSUMO, PEDE_TOTAL, PEDE_REFERENCIA,
        GRUP_COD, SUBG_COD, MARC_COD, ARTI_PESO, ARTI_ANCHO, ARTI_ALTO, ARTI_LARGO, TAIV_COD, BODE_COD, PEDE_OBS
        FROM PEDIDOS_DETALLE D, ARTICULO A
        WHERE D.ARTI_COD = A.ARTI_COD AND D.PEDI_ID = :ID
        ORDER BY PEDE_CODBAR
        INTO :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :LISTAPR, :PRUNIT, :DTOITPORC, :DTOITMONTO, :IVAPORC, :IVAITMONTO, :CONSUMO, :TOTAL, :REFITEM,
        :GRUPO, :SUBGRUPO, :MARCA, :PESO, :ANCHO, :ALTO, :LARGO, :TARIFA, :BODEGA, :OBSITEM
        DO
        BEGIN
        if (ARTICULO = CODBAR) then
            SELECT FIRST 1 COBA_COD FROM barras_articulo WHERE ARTI_COD = :articulo INTO :CODBAR;
        SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :GRUPO INTO NOMGRUPO;
        SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :MARCA INTO NOMMARCA;
        SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :SUBGRUPO AND GRUP_COD = :GRUPO INTO :NOMSUBG;
        ITEM = ITEM + 1;
        PRNETO = PRUNIT - DTOITMONTO;
        if (TARIFA = 0) then
            SUMAEX = SUMAEX + TOTAL;
        if (TARIFA = 1) then
            BEGIN
            SUMA1 = SUMA1 + TOTAL - IVAITMONTO;
            IVA1 = IVA1 + IVAITMONTO;
            END
        if (TARIFA = 2) then
            BEGIN
            SUMA2 = SUMA2 + TOTAL - IVAITMONTO;
            IVA2 = IVA2 + IVAITMONTO;
            END
        if (TARIFA = 3) then
            BEGIN
            SUMA3 = SUMA3 + TOTAL - IVAITMONTO;
            IVA3 = IVA3 + IVAITMONTO;
            END
        SUMAGR = SUMA1 + SUMA2 + SUMA3;
        if (IMPTOS = 'N') then
            TOTAL = TOTAL - IVAITMONTO;
        SUSPEND;
        END
    END
ELSE
    BEGIN
    FOR SELECT PEDE_ITEM, D.ARTI_COD, PEDE_CODBAR, SUBSTR(PEDE_DESC,1,60), PEDE_CANT, PEDE_UNIDAD, LIPR_COD, PEDE_PRUNIT, PEDE_DTOPORC, PEDE_DTOMONTO, PEDE_IVAPORC, PEDE_IVAMONTO, PEDE_CONSUMO, PEDE_TOTAL, PEDE_REFERENCIA,
        GRUP_COD, SUBG_COD, MARC_COD, ARTI_PESO, ARTI_ANCHO, ARTI_ALTO, ARTI_LARGO, TAIV_COD, BODE_COD, PEDE_OBS
        FROM PEDIDOS_DETALLE D, ARTICULO A
        WHERE D.ARTI_COD = A.ARTI_COD AND D.PEDI_ID = :ID
        ORDER BY PEDE_ITEM
        INTO :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :LISTAPR, :PRUNIT, :DTOITPORC, :DTOITMONTO, :IVAPORC, :IVAITMONTO, :CONSUMO, :TOTAL, :REFITEM,
        :GRUPO, :SUBGRUPO, :MARCA, :PESO, :ANCHO, :ALTO, :LARGO, :TARIFA, :BODEGA, :obsitem
        DO
        BEGIN
        SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :GRUPO INTO NOMGRUPO;
        SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :MARCA INTO NOMMARCA;
        SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :SUBGRUPO AND GRUP_COD = :GRUPO INTO :NOMSUBG;
        ITEM = ITEM + 1;
        PRNETO = PRUNIT - DTOITMONTO;
        if (IVAPORC = 0) then
            SUMAEX = SUMAEX + TOTAL;
        if (TARIFA = 1) then
            BEGIN
            SUMA1 = SUMA1 + TOTAL - IVAITMONTO;
            IVA1 = IVA1 + IVAITMONTO;
            END
        if (TARIFA = 2) then
            BEGIN
            SUMA2 = SUMA2 + TOTAL - IVAITMONTO;
            IVA2 = IVA2 + IVAITMONTO;
            END
        if (TARIFA = 3) then
            BEGIN
            SUMA3 = SUMA3 + TOTAL - IVAITMONTO;
            IVA3 = IVA3 + IVAITMONTO;
            END
        SUMAGR = SUMA1 + SUMA2 + SUMA3;
        if (IMPTOS = 'N') then
            TOTAL = TOTAL - IVAITMONTO;
        SUSPEND;
        END
    END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER PROCEDURE IMPR_REMISION(
    ID INTEGER)
RETURNS (
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    NIT VARCHAR(20),
    NOMTERCERO VARCHAR(60),
    VENDEDOR INTEGER,
    NOMVENDEDOR VARCHAR(60),
    PUNTOVTA INTEGER,
    NOMPUNTOVTA VARCHAR(30),
    CODBODEGA VARCHAR(2),
    NOMBODEGA VARCHAR(30),
    COTIZACION VARCHAR(30),
    PEDIDO VARCHAR(30),
    FACTURA VARCHAR(30),
    SUBTOTAL NUMERIC(18,2),
    IVAMONTO NUMERIC(18,2),
    TOTALFAC NUMERIC(18,2),
    DESPACHO VARCHAR(255),
    TRANSPORTADOR VARCHAR(60),
    OBS BLOB SUB_TYPE 1 SEGMENT SIZE 80,
    ITEM INTEGER,
    ARTICULO VARCHAR(15),
    CODBAR VARCHAR(15),
    ARTIDES VARCHAR(60),
    CANT NUMERIC(18,4),
    LOTE VARCHAR(15),
    VLOTE DATE,
    UNIDAD VARCHAR(8),
    DEVUELTO NUMERIC(18,4),
    LISTAPR INTEGER,
    REFITEM VARCHAR(60),
    BODITEM VARCHAR(2),
    PRUNIT NUMERIC(18,2),
    DTOITPORC NUMERIC(9,2),
    DTOITMONTO NUMERIC(18,2),
    SUBTOTALITEM NUMERIC(18,2),
    PRNETOSINIVA NUMERIC(18,2),
    PRNETO NUMERIC(18,2),
    IVAPORC NUMERIC(9,2),
    IVAITMONTO NUMERIC(18,2),
    CONSUMO NUMERIC(18,2),
    TOTAL NUMERIC(18,2),
    CODIGOCL VARCHAR(20),
    ZONACOD VARCHAR(2),
    ZONANOM VARCHAR(60),
    DV CHAR(1),
    DIRECCION VARCHAR(60),
    CIUDAD VARCHAR(40),
    TELEFONO VARCHAR(40),
    CONTACTO VARCHAR(60),
    FAX VARCHAR(25),
    GRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    SUBGRUPO VARCHAR(3),
    NOMSUBG VARCHAR(30),
    MARCA VARCHAR(3),
    NOMMARCA VARCHAR(30),
    PESO NUMERIC(9,4),
    ANCHO NUMERIC(18,4),
    ALTO NUMERIC(18,4),
    LARGO NUMERIC(18,4),
    SUMA1 NUMERIC(18,2),
    SUMA2 NUMERIC(18,2),
    SUMA3 NUMERIC(18,2),
    IVA1 NUMERIC(18,2),
    IVA2 NUMERIC(18,2),
    IVA3 NUMERIC(18,2),
    SUMAEX NUMERIC(18,2),
    SUMAGR NUMERIC(18,2),
    OBSITEM BLOB SUB_TYPE 1 SEGMENT SIZE 80)
AS
DECLARE VARIABLE IMPTOS CHAR(1);
DECLARE VARIABLE TARIFA INTEGER;
declare variable ORDENCOD CHAR(2);
declare variable SUCUR VARCHAR(10);
BEGIN
  /*  */
  SELECT F.PREF_PRE, REVT_NUMERO, REVT_FECHA, F.BODE_COD, BODE_NOM, F.TERC_NIT, REVT_NOMTERC, F.VEND_COD, VEND_NOMBRE, F.PTVT_ID, PTVT_NOM,
    REVT_COTIZACI, REVT_PEDIDO, REVT_FACTURA, REVT_IVAINC,
    REVT_IVAMONTO, REVT_TOTAL, REVT_DESPACHO, REVT_TRANSP,
    TERC_CONTACTO, TERC_FAX, TERC_DV, REVT_OBS, REVT_SUCURSAL
    FROM REMISIONES_VENTA F, BODEGA B, VENDEDORES V, PUNTO_VENTA P, TERCEROS T
    WHERE F.BODE_COD = B.BODE_COD AND F.VEND_COD = V.VEND_COD AND F.PTVT_ID = P.PTVT_ID AND F.TERC_NIT = T.TERC_NIT AND F.REVT_ID = :ID
    into :PREF, :NUMERO, :FECHA, :CODBODEGA, :NOMBODEGA, :NIT, :NOMTERCERO, :VENDEDOR, :NOMVENDEDOR, :PUNTOVTA, :NOMPUNTOVTA,
    :COTIZACION, :PEDIDO, :FACTURA, :IMPTOS,
    :IVAMONTO, :TOTALFAC, :DESPACHO, :transportador, 
    :CONTACTO, :FAX, :DV, :OBS, :SUCUR;
  SUBTOTAL = TOTALFAC - IVAMONTO;

  SELECT CLIE_COD, C.ZONA_COD, ZONA_NOM
    FROM CLIENTES C, ZONAS Z
    WHERE TERC_NIT = :NIT AND C.ZONA_COD = Z.ZONA_COD
    INTO :CODIGOCL, :ZONACOD, :ZONANOM;
  SELECT CLSU_DIR, CLSU_CIUDAD, CLSU_TEL FROM CLIENTE_SUCURSALES WHERE TERC_NIT = :NIT AND CLCU_COD = :SUCUR
    INTO :DIRECCION, :CIUDAD, :TELEFONO;
    
  SUMAEX = 0;
  SUMA1 = 0;
  SUMA2 = 0;
  SUMA3 = 0;
  IVA1 = 0;
  IVA2 = 0;
  IVA3 = 0;
  ITEM = 0;
  EXECUTE PROCEDURE lee_configuracion ('FACTURACION','DOCUMENTOS','ORDENAR ITEMS POR CODIGO DE ARTICULO') returning_values (:ORDENCOD);
  if (ORDENCOD = 'SI') then
    BEGIN
    FOR SELECT D.ARTI_COD, RVDE_CODBAR, SUBSTR(RVDE_DESC,1,60), RVDE_CANT, RVDE_UNIDAD, BODE_COD, RVDE_LOTE, LIPR_COD, RVDE_PRUNIT, RVDE_DTOPORC, RVDE_DTOMONTO, RVDE_IVAPORC, RVDE_IVAMONTO, RVDE_CONSUMO, RVDE_TOTAL, RVDE_REFERENCIA,
        GRUP_COD, SUBG_COD, MARC_COD, ARTI_PESO, ARTI_ANCHO, ARTI_ALTO, ARTI_LARGO, TAIV_COD, RVDE_DEVUELTO, RVDE_OBS
        FROM REMISIONES_VENTA_DETALLE D, ARTICULO A
        WHERE D.ARTI_COD = A.ARTI_COD AND D.REVT_ID = :ID
        ORDER BY RVDE_CODBAR
        INTO :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :BODITEM, :LOTE, :LISTAPR, :PRUNIT, :DTOITPORC, :DTOITMONTO, :IVAPORC, :IVAITMONTO, :CONSUMO, :TOTAL, :refitem,
            :GRUPO, :SUBGRUPO, :MARCA, :PESO, :ANCHO, :ALTO, :LARGO, :TARIFA, :DEVUELTO, :obsitem
        DO
        BEGIN
        if (ARTICULO = CODBAR) then
            SELECT FIRST 1 COBA_COD FROM barras_articulo WHERE ARTI_COD = :articulo INTO :CODBAR;
        SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :GRUPO INTO NOMGRUPO;
        SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :MARCA INTO NOMMARCA;
        SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :SUBGRUPO AND GRUP_COD = :GRUPO INTO :NOMSUBG;
        SELECT LOTE_VENCE FROM LOTES WHERE LOTE_NRO = :lote AND ARTI_COD = :ARTICULO INTO :vlote;
        ITEM = ITEM + 1;
        PRNETO = PRUNIT - DTOITMONTO;
        if (IVAPORC = 0) then
            SUMAEX = SUMAEX + TOTAL;
        if (TARIFA = 1) then
            BEGIN
            SUMA1 = SUMA1 + TOTAL - IVAITMONTO;
            IVA1 = IVA1 + IVAITMONTO;
            END
        if (TARIFA = 2) then
            BEGIN
            SUMA2 = SUMA2 + TOTAL - IVAITMONTO;
            IVA2 = IVA2 + IVAITMONTO;
            END
        if (TARIFA = 3) then
            BEGIN
            SUMA3 = SUMA3 + TOTAL - IVAITMONTO;
            IVA3 = IVA3 + IVAITMONTO;
            END
        SUMAGR = SUMA1 + SUMA2 + SUMA3;

        if (IMPTOS = 'N') then
            TOTAL = TOTAL - IVAITMONTO;
        ELSE
           BEGIN
           PRNETOSINIVA = PRUNIT / (1 + ivaporc/100);
           SUBTOTALITEM = PRNETOSINIVA * :CANT;
           END
        SUSPEND;
        END
    END
ELSE
    BEGIN
    FOR SELECT RVDE_ITEM, D.ARTI_COD, RVDE_CODBAR, SUBSTR(RVDE_DESC,1,60), RVDE_CANT, RVDE_UNIDAD, BODE_COD, RVDE_LOTE, LIPR_COD, RVDE_PRUNIT, RVDE_DTOPORC, RVDE_DTOMONTO, RVDE_IVAPORC, RVDE_IVAMONTO, RVDE_CONSUMO, RVDE_TOTAL, RVDE_REFERENCIA,
        GRUP_COD, SUBG_COD, MARC_COD, ARTI_PESO, ARTI_ANCHO, ARTI_ALTO, ARTI_LARGO, TAIV_COD, RVDE_DEVUELTO, RVDE_OBS
        FROM REMISIONES_VENTA_DETALLE D, ARTICULO A
        WHERE D.ARTI_COD = A.ARTI_COD AND D.REVT_ID = :ID
        ORDER BY RVDE_ITEM
        INTO :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :BODITEM, :LOTE, :LISTAPR, :PRUNIT, :DTOITPORC, :DTOITMONTO, :IVAPORC, :IVAITMONTO, :CONSUMO, :TOTAL, :refitem,
            :GRUPO, :SUBGRUPO, :MARCA, :PESO, :ANCHO, :ALTO, :LARGO, :TARIFA, :DEVUELTO, :obsitem
        DO
        BEGIN
        SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :GRUPO INTO NOMGRUPO;
        SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :MARCA INTO NOMMARCA;
        SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :SUBGRUPO AND GRUP_COD = :GRUPO INTO :NOMSUBG;
        ITEM = ITEM + 1;
        PRNETO = PRUNIT - DTOITMONTO;
        if (IVAPORC = 0) then
            SUMAEX = SUMAEX + TOTAL;
        if (TARIFA = 1) then
            BEGIN
            SUMA1 = SUMA1 + TOTAL - IVAITMONTO;
            IVA1 = IVA1 + IVAITMONTO;
            END
        if (TARIFA = 2) then
            BEGIN
            SUMA2 = SUMA2 + TOTAL - IVAITMONTO;
            IVA2 = IVA2 + IVAITMONTO;
            END
        if (TARIFA = 3) then
            BEGIN
            SUMA3 = SUMA3 + TOTAL - IVAITMONTO;
            IVA3 = IVA3 + IVAITMONTO;
            END
        SUMAGR = SUMA1 + SUMA2 + SUMA3;
        SUBTOTALITEM = TOTAL - IVAITMONTO;
        if (IMPTOS = 'N') then
            TOTAL = TOTAL - IVAITMONTO;
        ELSE
           BEGIN
             PRNETOSINIVA = PRUNIT / (1 + ivaporc/100);
             SUBTOTALITEM = PRNETOSINIVA * :CANT;
           END
        SUSPEND;
        END
    END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER PROCEDURE IMPR_DEVOLUCION(
    ID INTEGER)
RETURNS (
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    NIT VARCHAR(20),
    NOMTERCERO VARCHAR(60),
    VENDEDOR INTEGER,
    NOMVENDEDOR VARCHAR(60),
    PUNTOVTA INTEGER,
    NOMPUNTOVTA VARCHAR(30),
    CODBODEGA VARCHAR(2),
    NOMBODEGA VARCHAR(30),
    FACTURA VARCHAR(30),
    REMISION VARCHAR(10),
    COMIPORC NUMERIC(9,2),
    COMIMONTO NUMERIC(18,2),
    SUBTOTAL NUMERIC(18,2),
    DTOPORC NUMERIC(9,2),
    DTOMONTO NUMERIC(18,2),
    ADICIONAL NUMERIC(18,2),
    IVAMONTO NUMERIC(18,2),
    RTEFTEPORC NUMERIC(9,2),
    RTEFTEMONTO NUMERIC(18,2),
    RTEIVAPORC NUMERIC(9,2),
    RTEIVAMONTO NUMERIC(18,2),
    RTEICAPORC NUMERIC(9,2),
    RTEICAMONTO NUMERIC(18,2),
    EXTRA NUMERIC(18,2),
    TOTALFAC NUMERIC(18,2),
    TOTALPAGAR NUMERIC(18,2),
    OBS BLOB SUB_TYPE 1 SEGMENT SIZE 80,
    ITEM INTEGER,
    ARTICULO VARCHAR(15),
    CODBAR VARCHAR(15),
    ARTIDES VARCHAR(60),
    CANT NUMERIC(18,4),
    LOTE VARCHAR(15),
    UNIDAD VARCHAR(8),
    REFITEM VARCHAR(60),
    BODITEM VARCHAR(2),
    PRUNIT NUMERIC(18,2),
    DTOITPORC NUMERIC(9,2),
    DTOITMONTO NUMERIC(18,2),
    PRNETO NUMERIC(18,2),
    IVAPORC NUMERIC(9,2),
    IVAITMONTO NUMERIC(18,2),
    CONSUMO NUMERIC(18,2),
    TOTAL NUMERIC(18,2),
    CODIGOCL VARCHAR(20),
    ZONACOD VARCHAR(2),
    ZONANOM VARCHAR(60),
    DV CHAR(1),
    DIRECCION VARCHAR(60),
    CIUDAD VARCHAR(40),
    TELEFONO VARCHAR(40),
    CONTACTO VARCHAR(60),
    FAX VARCHAR(25),
    GRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    SUBGRUPO VARCHAR(3),
    NOMSUBG VARCHAR(30),
    MARCA VARCHAR(3),
    NOMMARCA VARCHAR(30),
    PESO NUMERIC(9,4),
    ANCHO NUMERIC(18,4),
    ALTO NUMERIC(18,4),
    LARGO NUMERIC(18,4),
    SUMA1 NUMERIC(18,2),
    SUMA2 NUMERIC(18,2),
    SUMA3 NUMERIC(18,2),
    IVA1 NUMERIC(18,2),
    IVA2 NUMERIC(18,2),
    IVA3 NUMERIC(18,2),
    TOTCONSUMO NUMERIC(18,2),
    SUMAEX NUMERIC(18,2),
    SUMAGR NUMERIC(18,2),
    OBSITEM BLOB SUB_TYPE 1 SEGMENT SIZE 80)
AS
DECLARE VARIABLE IMPTOS CHAR(1);
DECLARE VARIABLE TARIFA INTEGER;
declare variable ORDENCOD CHAR(2);
declare variable SUCUR VARCHAR(10);
declare variable PUNTOS NUMERIC(18,4);
BEGIN
  /*  */
  SELECT F.PREF_PRE, DEVT_NUMERO, DEVT_FECHA, F.BODE_COD, BODE_NOM, F.TERC_NIT, DEVT_NOMTERC, F.VEND_COD, VEND_NOMBRE, F.PTVT_ID, PTVT_NOM,
    DEVT_FACTURA, DEVT_COMIPORC, DEVT_COMIMONTO, DEVT_IVAINC,
    DEVT_DTOPOR, DEVT_DTOMONTO, DEVT_ADICIONAL, DEVT_IVAMONTO, DEVT_RTFTEPORC, DEVT_RTFTEMONTO, DEVT_RTIVAPORC, DEVT_RTIVAMONTO, DEVT_RTICAPORC, DEVT_RTICAMONTO, DEVT_EXTRA, DEVT_TOTAL,
    TERC_CONTACTO, TERC_FAX, TERC_DV, DEVT_OBS, DEVT_SUCURSAL, DEVT_REMISION
    FROM DEVOLUCIONES_VENTAS F, BODEGA B, VENDEDORES V, PUNTO_VENTA P, TERCEROS T
    WHERE F.BODE_COD = B.BODE_COD AND F.VEND_COD = V.VEND_COD AND F.PTVT_ID = P.PTVT_ID AND F.TERC_NIT = T.TERC_NIT AND F.DEVT_ID = :ID
    into :PREF, :NUMERO, :FECHA, :CODBODEGA, :NOMBODEGA, :NIT, :NOMTERCERO, :VENDEDOR, :NOMVENDEDOR, :PUNTOVTA, :NOMPUNTOVTA,
    :FACTURA, :COMIPORC, :COMIMONTO, :IMPTOS,
    :DTOPORC, :DTOMONTO, :ADICIONAL, :IVAMONTO, :RTEFTEPORC, :RTEFTEMONTO, :RTEIVAPORC, :RTEIVAMONTO, :RTEICAPORC, :RTEICAMONTO, :EXTRA, :TOTALFAC,
    :CONTACTO, :FAX, :DV, :OBS, :SUCUR, :REMISION;
  SUBTOTAL = TOTALFAC - EXTRA - IVAMONTO - ADICIONAL + DTOMONTO;
  TOTALPAGAR = TOTALFAC - RTEFTEMONTO - RTEIVAMONTO - RTEICAMONTO;

  EXECUTE PROCEDURE acumula_puntos_cliente (33, :id, :nit, :fecha) returning_values (:PUNTOS);
  SELECT CLIE_COD, C.ZONA_COD, ZONA_NOM
    FROM CLIENTES C, ZONAS Z
    WHERE TERC_NIT = :NIT AND C.ZONA_COD = Z.ZONA_COD
    INTO :CODIGOCL, :ZONACOD, :ZONANOM;
  SELECT CLSU_DIR, CLSU_CIUDAD, CLSU_TEL FROM CLIENTE_SUCURSALES WHERE TERC_NIT = :NIT AND CLCU_COD = :SUCUR
    INTO :DIRECCION, :CIUDAD, :TELEFONO;
    
  SUMAEX = 0;
  SUMA1 = 0;
  SUMA2 = 0;
  SUMA3 = 0;
  IVA1 = 0;
  IVA2 = 0;
  IVA3 = 0;
  TOTCONSUMO = 0;
  ITEM = 0;
  EXECUTE PROCEDURE lee_configuracion ('FACTURACION','DOCUMENTOS','ORDENAR ITEMS POR CODIGO DE ARTICULO') returning_values (:ORDENCOD);
  if (ORDENCOD = 'SI') then
    BEGIN
    FOR SELECT D.ARTI_COD, DVDE_CODBAR, SUBSTR(DVDE_DESC,1,60), DVDE_CANT, DVDE_UNIDAD, BODE_COD, DVDE_LOTE, DVDE_PRUNIT, DVDE_DTOPORC, DVDE_DTOMONTO, DVDE_IVAPORC, DVDE_IVAMONTO, DVDE_CONSUMO, DVDE_TOTAL, DVDE_REFERENCIA,
        GRUP_COD, SUBG_COD, MARC_COD, ARTI_PESO, ARTI_ANCHO, ARTI_ALTO, ARTI_LARGO, TAIV_COD, DVDE_OBS
        FROM DEVOLUCIONES_VENTAS_DETALLE D, ARTICULO A
        WHERE D.ARTI_COD = A.ARTI_COD AND D.DEVT_ID = :ID
        ORDER BY DVDE_CODBAR
        INTO :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :BODITEM, :LOTE, :PRUNIT, :DTOITPORC, :DTOITMONTO, :IVAPORC, :IVAITMONTO, :CONSUMO, :TOTAL, :REFITEM,
        :GRUPO, :SUBGRUPO, :MARCA, :PESO, :ANCHO, :ALTO, :LARGO, :TARIFA, :obsitem
        DO
        BEGIN
        if (ARTICULO = CODBAR) then
            SELECT FIRST 1 COBA_COD FROM barras_articulo WHERE ARTI_COD = :articulo INTO :CODBAR;
        ITEM = ITEM + 1;
        PRNETO = PRUNIT - DTOITMONTO - ((IVAITMONTO+CONSUMO) / CANT);
        TOTCONSUMO = TOTCONSUMO + CONSUMO;
        PRNETO = PRUNIT - DTOITMONTO;
        if (TARIFA = 0) then
            SUMAEX = SUMAEX + TOTAL;
        if (TARIFA = 1) then
            BEGIN
            SUMA1 = SUMA1 + TOTAL - IVAITMONTO;
            IVA1 = IVA1 + IVAITMONTO;
            END
        if (TARIFA = 2) then
            BEGIN
            SUMA2 = SUMA2 + TOTAL - IVAITMONTO;
            IVA2 = IVA2 + IVAITMONTO;
            END
        if (TARIFA = 3) then
            BEGIN
            SUMA3 = SUMA3 + TOTAL - IVAITMONTO;
            IVA3 = IVA3 + IVAITMONTO;
            END
        SUMAGR = SUMA1 + SUMA2 + SUMA3;
        if (IMPTOS = 'N') then
            TOTAL = TOTAL - IVAITMONTO - CONSUMO;
        SUSPEND;
        END
    END
ELSE
    BEGIN
    FOR SELECT D.ARTI_COD, DVDE_CODBAR, SUBSTR(DVDE_DESC,1,60), DVDE_CANT, DVDE_UNIDAD, BODE_COD, DVDE_LOTE, DVDE_PRUNIT, DVDE_DTOPORC, DVDE_DTOMONTO, DVDE_IVAPORC, DVDE_IVAMONTO, DVDE_CONSUMO, DVDE_TOTAL, DVDE_REFERENCIA,
        GRUP_COD, SUBG_COD, MARC_COD, ARTI_PESO, ARTI_ANCHO, ARTI_ALTO, ARTI_LARGO, TAIV_COD, DVDE_OBS
        FROM DEVOLUCIONES_VENTAS_DETALLE D, ARTICULO A
        WHERE D.ARTI_COD = A.ARTI_COD AND D.DEVT_ID = :ID
        ORDER BY DVDE_ITEM
        INTO :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :BODITEM, :LOTE, :PRUNIT, :DTOITPORC, :DTOITMONTO, :IVAPORC, :IVAITMONTO, :CONSUMO, :TOTAL, :REFITEM,
        :GRUPO, :SUBGRUPO, :MARCA, :PESO, :ANCHO, :ALTO, :LARGO, :TARIFA, :obsitem
        DO
        BEGIN
        if (ARTICULO = CODBAR) then
            SELECT FIRST 1 COBA_COD FROM barras_articulo WHERE ARTI_COD = :articulo INTO :CODBAR;
        SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :GRUPO INTO NOMGRUPO;
        SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :MARCA INTO NOMMARCA;
        SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :SUBGRUPO AND GRUP_COD = :GRUPO INTO :NOMSUBG;
        ITEM = ITEM + 1;
        PRNETO = PRUNIT - DTOITMONTO - ((IVAITMONTO+CONSUMO) / CANT);
        TOTCONSUMO = TOTCONSUMO + CONSUMO;
        PRNETO = PRUNIT - DTOITMONTO;
        if (TARIFA = 0) then
            SUMAEX = SUMAEX + TOTAL;
        if (TARIFA = 1) then
            BEGIN
            SUMA1 = SUMA1 + TOTAL - IVAITMONTO;
            IVA1 = IVA1 + IVAITMONTO;
            END
        if (TARIFA = 2) then
            BEGIN
            SUMA2 = SUMA2 + TOTAL - IVAITMONTO;
            IVA2 = IVA2 + IVAITMONTO;
            END
        if (TARIFA = 3) then
            BEGIN
            SUMA3 = SUMA3 + TOTAL - IVAITMONTO;
            IVA3 = IVA3 + IVAITMONTO;
            END
        SUMAGR = SUMA1 + SUMA2 + SUMA3;
        if (IMPTOS = 'N') then
            TOTAL = TOTAL - IVAITMONTO - CONSUMO;
        SUSPEND;
        END
    END
END
^

SET TERM ; ^


/* 06-04 ACTUALICE LOS COSTOS DE LA REMISION RELACIONADA */
INSERT INTO CONFIGURACION (CONF_MODULO, CONF_CATEGORIA, CONF_PROPIEDAD, CONF_VALOR, CONF_POSIBLES, CONF_AYUDA) VALUES ('COMPRAS', 'FACTURAS', 'ACTUALIZAR COSTOS DE LA REMISION RELACIONADA AL GRABAR LA FACTURA', 'NO', 'SI,NO', 'SI:Al grabar la factura se modifican los costos de la remisión previamente registrada asociada a la factura');
commit work;

SET TERM ^ ;

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

        if (COSTO > 0 ) then
         BEGIN
          /* ACTUALICE EL COSTO POR PROVEEDOR */
          SELECT PVAR_FECHA FROM PROVEEDOR_ARTICULO
            WHERE TERC_NIT = :Nit AND ARTI_COD = NEW.ARTI_COD
            INTO :FECAUX;
          if (FECAUX IS NULL) then
            INSERT INTO PROVEEDOR_ARTICULO (TERC_NIT, ARTI_COD, PVAR_COSTO, PVAR_FECHA, PVAR_COD,PVAR_DES)
                VALUES (:Nit, NEW.ARTI_COD, :COSTO, :fec, NEW.fcde_codprov,NEW.fcde_desc);
          else
            UPDATE PROVEEDOR_ARTICULO
                SET PVAR_COSTO = :COSTO, PVAR_FECHA = :fec, PVAR_COD = NEW.fcde_codprov
                WHERE ARTI_COD = NEW.ARTI_COD AND TERC_NIT = :Nit;
         END
        /* RECORRA LAS LISTAS DE PRECIOS Y CAMBIE EL PRECIO */
        EXECUTE PROCEDURE CALCULA_PRECIOS(NEW.ARTI_COD, :FEC);
        END /* AFECTAR INV */
      else
        BEGIN
        EXECUTE PROCEDURE lee_configuracion('COMPRAS', 'FACTURAS', 'ACTUALIZAR COSTOS DE LA REMISION RELACIONADA AL GRABAR LA FACTURA') returning_values (:ACTREM);
        if (ACTREM = 'SI') then
            BEGIN
            /* SI LOS COSTOS DE LA REMISION ERAN CERO ACTUALICE EL REGISTRO EN MOVIMIENTO_ARTICULO */
            numrows = 0;
            select mvar_cons, MVAR_ITEM, MVAR_FECHA, MVAR_IDREF, MVAR_CANT, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO
                from movimiento_articulo M, consolidado_faltantes C
                where C.cofa_id = :CONSOLIDA AND mvar_tipodoc = 22 and mvar_idref = C.cofa_idori AND C.cofa_tipoori = 22 and m.arti_cod = new.arti_cod
                into :numrows, :iterem, :fecrem, :idrem, :cantrem, :loterem, :prefrem, :numrem;
        
            if (numrows <> 0) then
                BEGIN
                DELETE FROM MOVIMIENTO_ARTICULO WHERE MVAR_CONS = :numrows;
                INSERT INTO MOVIMIENTO_ARTICULO
                  (ARTI_COD, MVAR_CONS, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM, TERC_NIT)
                  VALUES(NEW.ARTI_COD, GEN_ID(ID_MOVARTI,1), NEW.BODE_COD, :fecrem, 22, :idrem,
                  :CONC, :cantrem, :costo, 'S', :loterem, :prefrem, :numrem, :iterem, :Nit);
        
                if (COSTO > 0 ) then
                  BEGIN
                  /* ACTUALICE EL COSTO POR PROVEEDOR */
                  SELECT PVAR_FECHA FROM PROVEEDOR_ARTICULO
                    WHERE TERC_NIT = :Nit AND ARTI_COD = NEW.ARTI_COD
                    INTO :FECAUX;
                  if (FECAUX IS NULL) then
                    INSERT INTO PROVEEDOR_ARTICULO (TERC_NIT, ARTI_COD, PVAR_COSTO, PVAR_FECHA, PVAR_COD,PVAR_DES)
                        VALUES (:Nit, NEW.ARTI_COD, :COSTO, :fec, NEW.fcde_codprov,NEW.fcde_desc);
                  else
                    UPDATE PROVEEDOR_ARTICULO
                        SET PVAR_COSTO = :COSTO, PVAR_FECHA = :fec, PVAR_COD = NEW.fcde_codprov
                        WHERE ARTI_COD = NEW.ARTI_COD AND TERC_NIT = :Nit;
                  END
                /* RECORRA LAS LISTAS DE PRECIOS Y CAMBIE EL PRECIO */
                EXECUTE PROCEDURE CALCULA_PRECIOS(NEW.ARTI_COD, :FEC);
                END
            END
        END

    /* ACTUALICE EL PENDIENTE  */
    if (CONSOLIDA <> 0) then
        BEGIN
        UPDATE consolidado_faltantes SET COFA_OK = 'S' WHERE COFA_ID = :consolida AND COFA_ITEM = NEW.FCDE_ITEM AND ARTI_COD = NEW.arti_cod;
        EXECUTE procedure LEE_CONFIGURACION ('COMPRAS','DOCUMENTOS','SUMAR CANTIDADES PENDIENTES AL CONSOLIDAR DOCUMENTOS') returning_values (CONSO);
        /* IGNORE LA CONSOLIDACION SI SE VALIDAN CODIGOS DE LA ORDEN */
        SELECT MIN(CEFA_TIPOORI) FROM consolide_faltantes WHERE CEFA_ID = :CONSOLIDA INTO :NUMROWS;
        if (NUMROWS = 23) then
            BEGIN
            EXECUTE PROCEDURE LEE_CONFIGURACION('COMPRAS', 'FACTURAS', 'VERIFICAR CODIGOS DE LA ORDEN') returning_values (MENORV);
            if (MENORV = 'SI') then
                CONSO = 'NO';
            END
        SELECT COUNT(CEFA_ITEM) FROM consolide_faltantes WHERE CEFA_ID = :CONSOLIDA INTO :NUMROWS;
        if ((CONSO = 'SI') AND (NUMROWS > 1)) then
            UPDATE consolidado_faltantes SET COFA_IDDES = NEW.faco_id, COFA_OK = 'S' WHERE COFA_ID = :consolida;
        else
            BEGIN
            /* BUSQUE EL CONSOLIDADO EN EL MISMO ITEM Y SI ES DIFERENTE ACTUALICELO */
            select COFA_CANT * COFA_FACTOR FROM consolidado_faltantes WHERE COFA_ID = :consolida AND COFA_ITEM = NEW.FCDE_ITEM AND ARTI_COD = NEW.arti_cod INTO :CANTREL;
            if (NEW.FCDE_CANT * NEW.FCDE_FACTOR < CANTREL) then
                UPDATE consolidado_faltantes SET COFA_IDDES = NEW.faco_id, COFA_CANT = NEW.FCDE_CANT, COFA_FACTOR = NEW.FCDE_FACTOR
                    WHERE COFA_ID = :consolida AND COFA_ITEM = NEW.FCDE_ITEM AND ARTI_COD = NEW.arti_cod;
            END
        END
    END
END
^

SET TERM ; ^


/* 06-05 */
SET TERM ^ ;

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

SET TERM ; ^


/* 06-06 consolidacion de formas de pago */
SET TERM ^ ;

CREATE OR ALTER PROCEDURE CAMBIE_ID_CONSOLFP
RETURNS (
    ID INTEGER)
AS
begin
ID = GEN_ID(ID_CONSOLIDA, 1);
suspend;
end
^

SET TERM ; ^


grant EXECUTE on PROCEDURE CAMBIE_ID_CONSOLFP to PUBLIC;
grant select, delete, insert, update on consolide_formasp to public;

/* 06-07 */
GRANT INSERT ON PUNTOS_VENDEDOR TO TRIGGER RECIBOS_CAJA_DETALLE_AI;
GRANT INSERT, DELETE ON PUNTOS_VENDEDOR TO TRIGGER RECIBOS_CAJA_DETALLE_AU;
GRANT DELETE ON PUNTOS_VENDEDOR TO TRIGGER RECIBOS_CAJA_DETALLE_AD;

GRANT INSERT ON PUNTOS_VENDEDOR TO TRIGGER puntos_vend_redencion_ai;
GRANT INSERT, DELETE ON PUNTOS_VENDEDOR TO TRIGGER puntos_vend_redencion_au;
GRANT DELETE ON PUNTOS_VENDEDOR TO TRIGGER puntos_vend_redencion_ad;

grant select on puntos_vendedor TO PROCEDURE consulta_puntos_vendedor;
grant select on puntos_vendedor TO PROCEDURE chequeo_puntos_vendedor;

GRANT SELECT ON comisiones_puntos TO TRIGGER RECIBOS_CAJA_DETALLE_AI;
GRANT SELECT ON comisiones_puntos TO TRIGGER RECIBOS_CAJA_DETALLE_AU;

SET TERM ^ ;

CREATE OR ALTER TRIGGER TI_DEVOLUCION_CHEQUES FOR DEVOLUCION_CHEQUES
ACTIVE BEFORE INSERT POSITION 0
AS
DECLARE VARIABLE NUMROWS INTEGER;
declare variable POR_CTA CHAR(2);
BEGIN
    /*  PARENT 'PREFIJOS_BANCOS' MUST EXIST WHEN INSERTING A CHILD IN 'DEVOLUCION_CHEQUES'  */
    IF (NEW.CUBA_COD IS NOT NULL AND
        NEW.PRBA_PREF IS NOT NULL) THEN
    BEGIN
    EXECUTE PROCEDURE LEE_configuracion('BANCOS', 'DEVOLUCIONES', 'CONSECUTIVOS POR CUENTA') returning_values(:POR_CTA);
    if (por_cta = 'SI') then
        BEGIN
        SELECT COUNT(*)
        FROM   PREFIJOS_BANCOS
        WHERE  PREFIJOS_BANCOS.CUBA_COD = NEW.CUBA_COD
         AND   PREFIJOS_BANCOS.TIDO_COD = 77
         AND   PREFIJOS_BANCOS.PRBA_PREF = NEW.PRBA_PREF
        INTO   :NUMROWS;
        IF (NUMROWS = 0) THEN
           BEGIN
           EXCEPTION PREFIJOBANCO_NO_EXISTE;
           END
        END
    END
    /*  PARENT 'CLIENTES' MUST EXIST WHEN INSERTING A CHILD IN 'DEVOLUCION_CHEQUES'  */
    IF (NEW.TERC_NIT IS NOT NULL) THEN
    BEGIN
       SELECT COUNT(*)
       FROM   TERCEROS
       WHERE  TERCEROS.TERC_NIT = NEW.TERC_NIT
       INTO   :NUMROWS;
       IF (NUMROWS = 0) THEN
       BEGIN
          EXCEPTION TERCERO_NO_EXISTE;
       END
    END
END
^

SET TERM ; ^


/* 06-08 no permita repetir codigo de cuenta */
alter table CUENTAS_BANCO
add constraint UNQ1_CUENTAS_BANCO
unique (CUBA_CODCTA);

/* 06-09 SUCURSAL EN EL DETALLE DEL RECIBO Y NO EN EL ENCABEZADO */

ALTER TABLE RECIBOS_CAJA_DETALLE
ADD RCDE_SUCURSAL VARCHAR(10)
NOT NULL ;

SET TERM ^ ;

create trigger RECIBOS_CAJA_DETALLE_BU for RECIBOS_CAJA_DETALLE
active BEFORE UPDATE position 0
as
begin
if (NEW.rcde_sucursal IS NULL) then
    NEW.rcde_sucursal = '01';
end
^

SET TERM ; ^

GRANT UPDATE,REFERENCES ON RECIBOS_CAJA_DETALLE TO TRIGGER RECIBOS_CAJA_DETALLE_BU;

ALTER TRIGGER RECIBOS_CAJA_DETALLE_AU INACTIVE;
UPDATE RECIBOS_CAJA_DETALLE D SET RCDE_SUCURSAL = (SELECT RECA_SUCURSAL FROM RECIBOS_CAJA R WHERE RECA_ID = D.reca_id);
COMMIT WORK;
ALTER TRIGGER RECIBOS_CAJA_DETALLE_AU ACTIVE;

SET TERM ^ ;

CREATE OR ALTER TRIGGER RECIBOS_CAJA_DETALLE_AI FOR RECIBOS_CAJA_DETALLE
ACTIVE AFTER INSERT POSITION 0
AS
declare variable EXISTE CHAR(1);
declare variable FEC DATE;
declare variable NIT VARCHAR(20);
declare variable CONCEPTO VARCHAR(60);
declare variable PREFIJO VARCHAR(4);
declare variable NUMERO VARCHAR(6);
declare variable SALDO NUMERIC(18,2);
declare variable RETES CHAR(2);
declare variable OK CHAR(1);
declare variable RCANTI INTEGER;
declare variable COBR INTEGER;
declare variable ACUMULA CHAR(2);
declare variable DIASMAX INTEGER;
declare variable FACTOR NUMERIC(9,4);
declare variable FACTORD NUMERIC(9,4);
declare variable DIAS INTEGER;
declare variable FECDOC DATE;
BEGIN
if ((NEW.RECA_ID <> 0) and (new.rcde_anulado = 'N')) then
    BEGIN
    /* Abone el documento referenciado */
    select PREF_PRE, RECA_NUMERO, RECA_fecha, RECA_CONC, TERC_NIT, COBR_COD from RECIBOS_CAJA
        where RECA_id = new.RECA_id into :PREFIJO, :NUMERO, :FEC, :CONCEPTO, :NIT, :COBR;
    OK = 'N';
    if (new.RCDE_TIPODOC = 45) then
        BEGIN
        /* BUSQUE SI TIENE RECA_ID, SI NO LO ACTUALIZA */
        SELECT RECA_ID FROM ANTICIPOS_CLIENTE WHERE ANCL_ID = NEW.RCDE_IDDOC INTO :RCANTI;
        if (RCANTI = 0) then
            BEGIN
            OK = 'S';
            UPDATE ANTICIPOS_CLIENTE SET RECA_ID = NEW.RECA_ID WHERE ANCL_ID = NEW.RCDE_IDDOC;
            END
        END
    if (OK = 'N') then
        BEGIN
        /* valide que no se pase del saldo */
        execute procedure saldo_doc_cartera(new.rcde_tipodoc, new.rcde_iddoc, '9999/12/31') returning_values(saldo);
        execute procedure lee_configuracion('CARTERA', 'SALDOS', 'DESCONTAR RETENCIONES POR CAUSACION') returning_values (RETES);
        if (SALDO < 0) then
            BEGIN
            if (RETES = 'SI') then
                begin
                if (saldo > (NEW.rcde_abono + NEW.rcde_dtof)) then
                    EXCEPTION DOCUMENTO_ABONO_MAYOR;
                end
            ELSE
                begin
                if (saldo > (NEW.rcde_abono + NEW.rcde_rtfte + NEW.rcde_rtiva + NEW.rcde_rtica + NEW.rcde_dtof)) then
                    EXCEPTION DOCUMENTO_ABONO_MAYOR;
                end
            END
        else
            BEGIN
            if (RETES = 'SI') then
                begin
                if (saldo < (NEW.rcde_abono + NEW.rcde_dtof)) then
                    EXCEPTION DOCUMENTO_ABONO_MAYOR;
                end
            ELSE
                begin
                if (saldo < (NEW.rcde_abono + NEW.rcde_rtfte + NEW.rcde_rtiva + NEW.rcde_rtica + NEW.rcde_dtof)) then
                    EXCEPTION DOCUMENTO_ABONO_MAYOR;
                end
            END
        EXISTE = 'N';
        select 'S' from saldos_doc_cartera where sdca_tiporef = new.rcde_tipodoc and sdca_idref = new.rcde_iddoc and sdca_fecha = :FEC into :EXISTE;
        if (Existe = 'S') then
            begin
            /* actualice el saldo del dia */
            UPDATE saldos_doc_cartera
                SET SDCA_ABONO = SDCA_ABONO + NEW.rcde_abono + new.rcde_dtof,
                SDCA_ABRTFTE = SDCA_ABRTFTE + NEW.rcde_RTFTE,
                SDCA_ABRTIVA = SDCA_ABRTIVA + NEW.rcde_RTIVA,
                SDCA_ABRTICA = SDCA_ABRTICA + NEW.rcde_RTICA
                WHERE SDCA_TIPOREF = NEW.RCDE_TIPODOC AND SDCA_IDREF = NEW.rcde_IDDOC AND SDCA_FECHA = :FEC;
            END
        ELSE
            BEGIN
            /* Inserte un nuevo saldo diario */
            INSERT INTO SALDOS_DOC_CARTERA (SDCA_TIPOREF, SDCA_IDREF, SDCA_FECHA, TERC_NIT, SDCA_RTFTE, SDCA_RTIVA, SDCA_RTICA, SDCA_ABONO, SDCA_ABRTFTE, SDCA_ABRTIVA, SDCA_ABRTICA, SDCA_DEBITO, SDCA_MONTO)
                VALUES (NEW.RCDE_TIPODOC, NEW.RCDE_IDDOC, :FEC, :NIT, 0, 0, 0, (NEW.rcde_abono+NEW.rcde_dtof), NEW.rcde_rtfte, NEW.rcde_rtiva, NEW.rcde_rtica, 'N', 0);
            END
        END
    /* actualice el registro en mov_cliente (por si son varios items) */
    EXISTE = 'N';
    SELECT 'S' FROM MOVIMIENTO_CLIENTES WHERE MVCL_TIPOREF = 61 AND MVCL_IDREF = NEW.RECA_ID AND MVCL_SUCURSAL = NEW.rcde_sucursal INTO :EXISTE;
    if (EXISTE = 'S') then
        begin
        UPDATE movimiento_clientes
            SET MVCL_MONTO = MVCL_MONTO + NEW.rcde_abono + NEW.rcde_dtof,
                MVCL_RTEFTE = MVCL_RTEFTE + NEW.rcde_rtfte,
                MVCL_RTEIVA = MVCL_RTEIVA + NEW.rcde_rtiva,
                MVCL_RTEICA = MVCL_RTEICA + NEW.rcde_rtica
            WHERE MVCL_TIPOREF = 61 AND MVCL_IDREF = NEW.RECA_ID AND MVCL_SUCURSAL = NEW.rcde_sucursal;
        end
    ELSE
        INSERT INTO MOVIMIENTO_CLIENTES (MVCL_ID, TERC_NIT, MVCL_TIPOREF, MVCL_IDREF, MVCL_FECHA, MVCL_VENCE, MVCL_CONC, MVCL_MONTO, MVCL_RTEFTE, MVCL_RTEIVA, MVCL_RTEICA, MVCL_DEBITO, MVCL_ABONO, MVCL_PREFREF, MVCL_NUMREF, MVCL_SUCURSAL, COBR_COD)
            VALUES (GEN_ID(ID_MOVCLI, 1), :NIT, 61, NEW.RECA_ID, :FEC, :FEC, :CONCEPTO, (NEW.RCDE_ABONO+NEW.RCDE_DTOF), NEW.RCDE_RTFTE, NEW.RCDE_RTIVA, NEW.RCDE_RTICA, 'N', 'S', :PREFIJO, :NUMERO, NEW.rcde_sucursal, :COBR);

    /* acumule los puntos del vendedor */
    SELECT MVCL_FECHA FROM MOVIMIENTO_CLIENTES WHERE MVCL_TIPOREF = new.rcde_tipodoc AND MVCL_IDREF = new.rcde_iddoc
        INTO :FECDOC;
    if (FECDOC IS NOT NULL) then
        DIAS = FEC - FECDOC;
    else
        DIAS = 999;
    execute procedure lee_configuracion('FACTURACION', 'FACTURAS', 'ACUMULAR PUNTOS DE VENTAS POR VENDEDOR') returning_values (ACUMULA);
    execute procedure lee_configuracion('FACTURACION', 'FACTURAS', 'DIAS DE RECAUDO MAXIMO PARA ACUMULAR PUNTOS AL VENDEDOR') returning_values (DIASMAX);
    if ((acumula = 'SI') and (diasmax >= dias)) then
        begin
        SELECT COPU_FACTOR FROM comisiones_puntos WHERE COPU_COD = NEW.rcde_comip INTO :FACTOR;
        if ((NEW.rcde_tipodoc = 31) or (NEW.rcde_tipodoc = 41)) then
            begin
            /* recorra la factura acumulando los puntos */
            if (new.rcde_tipodoc = 31) then
                select (fact_total-fact_ivamonto)/fact_total from facturas where fact_id = new.rcde_iddoc into :factord;
            if (new.rcde_tipodoc = 41) then
                select ndcl_monto/(ndcl_monto+ndcl_ivamonto) from notas_debito_clientes where ndcl_id = new.rcde_iddoc into :factord;
            /* inserte el registro de puntos */
            insert into puntos_vendedor (vend_cod, ptvt_fecha, ptvt_tipodoc, ptvt_iddoc, ptvt_db, ptvt_cr)
                values (:cobr, :fec, new.rcde_tipodoc, new.rcde_iddoc, (new.rcde_abono*:factord*:factor), 0);
            end
        if ((new.rcde_tipodoc = 33) or (new.rcde_tipodoc = 42)) then
            begin
            if (new.rcde_tipodoc = 33) then
                select (devt_total-devt_ivamonto)/devt_total from devoluciones_ventas where devt_id = new.rcde_iddoc into :factord;
            if (new.rcde_tipodoc = 42) then
                select nccl_monto/(nccl_monto+nccl_ivamonto) from notas_credito_clientes where nccl_id = new.rcde_iddoc into :factord;
            /* inserte el registro de puntos */
            insert into puntos_vendedor (vend_cod, ptvt_fecha, ptvt_tipodoc, ptvt_iddoc, ptvt_db, ptvt_cr)
                values (:cobr, :fec, new.rcde_tipodoc, new.rcde_iddoc, 0, (new.rcde_abono*:factord*:factor));
            end
        end
    end
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER RECIBOS_CAJA_DETALLE_AU FOR RECIBOS_CAJA_DETALLE
ACTIVE AFTER UPDATE POSITION 0
AS
declare variable EXISTE CHAR(1);
declare variable FEC DATE;
declare variable NIT VARCHAR(20);
declare variable CONCEPTO VARCHAR(60);
declare variable PREFIJO VARCHAR(4);
declare variable NUMERO VARCHAR(6);
declare variable SALDO NUMERIC(18,2);
declare variable RETES char(2);
declare variable OK CHAR(1);
declare variable RCANTI INTEGER;
declare variable COBR INTEGER;
declare variable ACUMULA CHAR(2);
declare variable DIASMAX INTEGER;
declare variable FACTOR NUMERIC(9,4);
declare variable FACTORD NUMERIC(9,4);
declare variable DIAS INTEGER;
declare variable FECDOC DATE;
BEGIN
execute procedure lee_configuracion('FACTURACION', 'FACTURAS', 'ACUMULAR PUNTOS DE VENTAS POR VENDEDOR') returning_values (ACUMULA);
select PREF_PRE, RECA_NUMERO, reca_fecha, RECA_CONC, TERC_NIT, COBR_COD
    from recibos_caja
    where reca_id = new.reca_id
    into :PREFIJO, :NUMERO, :FEC, :CONCEPTO, :NIT, :COBR;
/* Borre el viejo */
if ((old.RECA_ID <> 0) AND (OLD.rcde_anulado = 'N')) then
    BEGIN
    OK = 'N';
    if (OLD.RCDE_TIPODOC = 45) then
        BEGIN
        SELECT RECA_ID FROM ANTICIPOS_CLIENTE WHERE ANCL_ID = OLD.RCDE_IDDOC INTO :RCANTI;
        if (RCANTI = OLD.RECA_ID) then
            begin
            OK = 'S';
            if (NEW.rcde_anulado = 'N') then
                delete from anticipos_cliente where ANCL_ID = OLD.RCDE_IDDOC;
            else
                UPDATE anticipos_cliente SET ANCL_ANULADO = 'S' where ANCL_ID = OLD.RCDE_IDDOC;
            end
        END
    if (OK = 'N') then
        BEGIN
        UPDATE saldos_doc_cartera
            SET SDCA_ABONO = SDCA_ABONO - old.rcde_abono - OLD.RCDE_DTOF,
            SDCA_ABRTFTE = SDCA_ABRTFTE - old.rcde_RTFTE,
            SDCA_ABRTIVA = SDCA_ABRTIVA - old.rcde_RTIVA,
            SDCA_ABRTICA = SDCA_ABRTICA - old.rcde_RTICA
            WHERE SDCA_TIPOREF = old.RCDE_TIPODOC AND SDCA_IDREF = old.rcde_IDDOC AND SDCA_FECHA = :FEC;
        END
    UPDATE movimiento_clientes
        SET MVCL_MONTO = MVCL_MONTO - OLD.rcde_abono - OLD.RCDE_DTOF,
        MVCL_RTEFTE = MVCL_RTEFTE - OLD.rcde_rtfte,
        MVCL_RTEIVA = MVCL_RTEIVA - OLD.rcde_rtiva,
        MVCL_RTEICA = MVCL_RTEICA - OLD.rcde_rtica
        WHERE MVCL_TIPOREF = 61 AND MVCL_IDREF = OLD.RECA_ID;

    /* DESHAGA LOS PUNTOS DEL VENDEDOR */
    if (acumula = 'SI') then
        delete from puntos_vendedor where vend_cod = :cobr and ptvt_tipodoc = old.rcde_tipodoc and ptvt_iddoc = old.rcde_iddoc and ptvt_fecha = :fec;
    END
if ((NEW.RECA_ID <> 0) and (NEW.rcde_anulado = 'N')) then
    BEGIN
    OK = 'N';
    if (new.RCDE_TIPODOC = 45) then
        BEGIN
        /* BUSQUE SI TIENE RECA_ID, SI NO LO ACTUALIZA */
        SELECT RECA_ID FROM ANTICIPOS_CLIENTE WHERE ANCL_ID = NEW.RCDE_IDDOC INTO :RCANTI;
        if (RCANTI = 0) then
            BEGIN
            OK = 'S';
            UPDATE ANTICIPOS_CLIENTE SET RECA_ID = NEW.RECA_ID WHERE ANCL_ID = NEW.RCDE_IDDOC;
            END
        END
    if (OK = 'N') then
        BEGIN
        /* valide que no se pase del saldo */
        execute procedure saldo_doc_cartera(new.rcde_tipodoc, new.rcde_iddoc, '9999/12/31') returning_values(saldo);
        execute procedure lee_configuracion('CARTERA', 'SALDOS', 'DESCONTAR RETENCIONES POR CAUSACION') returning_values (RETES);
        if (SALDO < 0) then
            BEGIN
            if (RETES = 'SI') then
                begin
                if (saldo > (NEW.rcde_abono + NEW.rcde_dtof)) then
                    EXCEPTION DOCUMENTO_ABONO_MAYOR;
                end
            ELSE
                begin
                if (saldo > (NEW.rcde_abono + NEW.rcde_rtfte + NEW.rcde_rtiva + NEW.rcde_rtica + NEW.rcde_dtof)) then
                    EXCEPTION DOCUMENTO_ABONO_MAYOR;
                end
            END
        else
            BEGIN
            if (RETES = 'SI') then
                begin
                if (saldo < (NEW.rcde_abono + NEW.rcde_dtof)) then
                    EXCEPTION DOCUMENTO_ABONO_MAYOR;
                end
            ELSE
                begin
                if (saldo < (NEW.rcde_abono + NEW.rcde_rtfte + NEW.rcde_rtiva + NEW.rcde_rtica + NEW.rcde_dtof)) then
                    EXCEPTION DOCUMENTO_ABONO_MAYOR;
                end
            END
        select 'S' from saldos_doc_cartera where sdca_tiporef = new.rcde_tipodoc and sdca_idref = new.rcde_iddoc and sdca_fecha = :FEC into :EXISTE;
        if (Existe = 'S') then
            /* actualice el saldo del dia */
            UPDATE saldos_doc_cartera
                SET SDCA_ABONO = SDCA_ABONO + NEW.rcde_abono + NEW.RCDE_DTOF,
                    SDCA_ABRTFTE = SDCA_ABRTFTE + NEW.rcde_RTFTE,
                    SDCA_ABRTIVA = SDCA_ABRTIVA + NEW.rcde_RTIVA,
                    SDCA_ABRTICA = SDCA_ABRTICA + NEW.rcde_RTICA
                WHERE SDCA_TIPOREF = NEW.RCDE_TIPODOC AND SDCA_IDREF = NEW.rcde_IDDOC AND SDCA_FECHA = :FEC;
        ELSE
            /* Inserte un nuevo saldo diario */
            INSERT INTO SALDOS_DOC_CARTERA (SDCA_TIPOREF, SDCA_IDREF, SDCA_FECHA, TERC_NIT, SDCA_RTFTE, SDCA_RTIVA, SDCA_RTICA, SDCA_ABONO, SDCA_ABRTFTE, SDCA_ABRTIVA, SDCA_ABRTICA, SDCA_DEBITO, SDCA_MONTO)
                VALUES (NEW.RCDE_TIPODOC, NEW.RCDE_IDDOC, :FEC, :NIT, 0, 0, 0, (NEW.rcde_abono+NEW.RCDE_DTOF), NEW.rcde_rtfte, NEW.rcde_rtiva, NEW.rcde_rtica, 'N', 0);
        END /* OK = N */
    /* Registre o actualice el registro en movimiento_cliente */
    EXISTE = 'N';
    SELECT 'S' FROM MOVIMIENTO_CLIENTES WHERE MVCL_TIPOREF = 61 AND MVCL_IDREF = NEW.RECA_ID and mvcl_sucursal = new.rcde_sucursal INTO :EXISTE;
    if (EXISTE = 'S') then
        begin
        /* Deshaga el viejo */
        if (old.RECA_ID <> 0) then
            UPDATE movimiento_clientes
                SET MVCL_MONTO = MVCL_MONTO - OLD.rcde_abono - OLD.rcde_dtof,
                    MVCL_RTEFTE = MVCL_RTEFTE - OLD.rcde_rtfte,
                    MVCL_RTEIVA = MVCL_RTEIVA - OLD.rcde_rtiva,
                    MVCL_RTEICA = MVCL_RTEICA - OLD.rcde_rtica
                WHERE MVCL_TIPOREF = 61 AND MVCL_IDREF = NEW.RECA_ID AND MVCL_SUCURSAL = NEW.rcde_sucursal;
        /* Actualice el nuevo */
        UPDATE movimiento_clientes
            SET MVCL_MONTO = MVCL_MONTO + NEW.rcde_abono + NEW.rcde_dtof,
                MVCL_RTEFTE = MVCL_RTEFTE + NEW.rcde_rtfte,
                MVCL_RTEIVA = MVCL_RTEIVA + NEW.rcde_rtiva,
                MVCL_RTEICA = MVCL_RTEICA + NEW.rcde_rtica
            WHERE MVCL_TIPOREF = 61 AND MVCL_IDREF = NEW.RECA_ID AND MVCL_SUCURSAL = NEW.rcde_sucursal;
        end
    ELSE
        INSERT INTO MOVIMIENTO_CLIENTES (MVCL_ID, TERC_NIT, MVCL_TIPOREF, MVCL_IDREF, MVCL_FECHA, MVCL_VENCE, MVCL_CONC, MVCL_MONTO, MVCL_RTEFTE, MVCL_RTEIVA, MVCL_RTEICA, MVCL_DEBITO, MVCL_ABONO, MVCL_PREFREF, MVCL_NUMREF, MVCL_SUCURSAL, COBR_COD)
            VALUES (GEN_ID(ID_MOVCLI, 1), :NIT, 61, NEW.RECA_ID, :FEC, :FEC, :CONCEPTO, (NEW.RCDE_ABONO+NEW.RCDE_DTOF), NEW.RCDE_RTFTE, NEW.RCDE_RTIVA, NEW.RCDE_RTICA, 'N', 'S', :PREFIJO, :NUMERO, NEW.rcde_sucursal, :COBR);

    /* acumule los puntos del vendedor */
    SELECT MVCL_FECHA FROM MOVIMIENTO_CLIENTES WHERE MVCL_TIPOREF = new.rcde_tipodoc AND MVCL_IDREF = new.rcde_iddoc
        INTO :FECDOC;
    if (FECDOC IS NOT NULL) then
        DIAS = FEC - FECDOC;
    else
        DIAS = 999;
    execute procedure lee_configuracion('FACTURACION', 'FACTURAS', 'DIAS DE RECAUDO MAXIMO PARA ACUMULAR PUNTOS AL VENDEDOR') returning_values (DIASMAX);
    if ((acumula = 'SI') and (diasmax >= dias)) then
        begin
        SELECT COPU_FACTOR FROM comisiones_puntos WHERE COPU_COD = NEW.rcde_comip INTO :FACTOR;
        if ((NEW.rcde_tipodoc = 31) or (NEW.rcde_tipodoc = 41)) then
            begin
            /* recorra la factura acumulando los puntos */
            if (new.rcde_tipodoc = 31) then
                select (fact_total-fact_ivamonto)/fact_total from facturas where fact_id = new.rcde_iddoc into :factord;
            if (new.rcde_tipodoc = 41) then
                select ndcl_monto/(ndcl_monto+ndcl_ivamonto) from notas_debito_clientes where ndcl_id = new.rcde_iddoc into :factord;
            /* inserte el registro de puntos */
            insert into puntos_vendedor (vend_cod, ptvt_fecha, ptvt_tipodoc, ptvt_iddoc, ptvt_db, ptvt_cr)
                values (:cobr, :fec, new.rcde_tipodoc, new.rcde_iddoc, (new.rcde_abono*:factord*:factor), 0);
            end
        if ((new.rcde_tipodoc = 33) or (new.rcde_tipodoc = 42)) then
            begin
            if (new.rcde_tipodoc = 33) then
                select (devt_total-devt_ivamonto)/devt_total from devoluciones_ventas where devt_id = new.rcde_iddoc into :factord;
            if (new.rcde_tipodoc = 42) then
                select nccl_monto/(nccl_monto+nccl_ivamonto) from notas_credito_clientes where nccl_id = new.rcde_iddoc into :factord;
            /* inserte el registro de puntos */
            insert into puntos_vendedor (vend_cod, ptvt_fecha, ptvt_tipodoc, ptvt_iddoc, ptvt_db, ptvt_cr)
                values (:cobr, :fec, new.rcde_tipodoc, new.rcde_iddoc, 0, (new.rcde_abono*:factord*:factor));
            end
        end
    END /* NUEVO */
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER RECIBOS_CAJA_DETALLE_AD FOR RECIBOS_CAJA_DETALLE
ACTIVE AFTER DELETE POSITION 0
AS
declare variable FEC DATE;
declare variable OK CHAR(1);
declare variable RCANTI INTEGER;
declare variable ACUMULA CHAR(2);
declare variable COBR INTEGER;
BEGIN
if (old.RECA_ID <> 0) then
    BEGIN
    execute procedure lee_configuracion('FACTURACION', 'FACTURAS', 'ACUMULAR PUNTOS DE VENTAS POR VENDEDOR') returning_values (ACUMULA);
    select reca_fecha, COBR_COD from recibos_caja where reca_id = OLD.reca_id into :FEC, :COBR;
    OK = 'N';
    if (OLD.RCDE_TIPODOC = 45) then
        BEGIN
        SELECT RECA_ID FROM ANTICIPOS_CLIENTE WHERE ANCL_ID = OLD.RCDE_IDDOC INTO :RCANTI;
        if (RCANTI = OLD.RECA_ID) then
            begin
            OK = 'S';
            delete from anticipos_cliente where ANCL_ID = OLD.RCDE_IDDOC;
            end
        END
    if (OLD.rcde_anulado = 'N') then
     begin
       if (OK = 'N') then
        BEGIN
        UPDATE saldos_doc_cartera
            SET SDCA_ABONO = SDCA_ABONO - old.rcde_abono - OLD.RCDE_DTOF,
            SDCA_ABRTFTE = SDCA_ABRTFTE - old.rcde_RTFTE,
            SDCA_ABRTIVA = SDCA_ABRTIVA - old.rcde_RTIVA,
            SDCA_ABRTICA = SDCA_ABRTICA - old.rcde_RTICA
            WHERE SDCA_TIPOREF = old.RCDE_TIPODOC AND SDCA_IDREF = old.rcde_IDDOC AND SDCA_FECHA = :FEC;
        END
       UPDATE movimiento_clientes
        SET MVCL_MONTO = MVCL_MONTO - OLD.rcde_abono - OLD.RCDE_DTOF,
        MVCL_RTEFTE = MVCL_RTEFTE - OLD.rcde_rtfte,
        MVCL_RTEIVA = MVCL_RTEIVA - OLD.rcde_rtiva,
        MVCL_RTEICA = MVCL_RTEICA - OLD.rcde_rtica
        WHERE MVCL_TIPOREF = 61 AND MVCL_IDREF = OLD.RECA_ID and MVCL_SUCURSAL = OLD.rcde_sucursal;
     end
    /* DESHAGA LOS PUNTOS DEL VENDEDOR */
    if (acumula = 'SI') then
        delete from puntos_vendedor where vend_cod = :cobr and ptvt_tipodoc = old.rcde_tipodoc and ptvt_iddoc = old.rcde_iddoc and ptvt_fecha = :fec;
    END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER PROCEDURE CAMBIA_CLIENTE(
    ANTES VARCHAR(20),
    NUEVO VARCHAR(20))
RETURNS (
    TIPODOC INTEGER,
    ID INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(6))
AS
declare variable CONC VARCHAR(90);
declare variable FECHA DATE;
declare variable VENCE DATE;
declare variable RTFTEMONTO NUMERIC(18,2);
declare variable RTIVAMONTO NUMERIC(18,2);
declare variable RTICAMONTO NUMERIC(18,2);
declare variable TOTAL NUMERIC(18,2);
declare variable TIPOAB integer;
declare variable IDAB integer;
declare variable MONTOAB integer;
declare variable EXISTE CHAR(1);
declare variable SUCURSAL VARCHAR(10);
begin
delete from saldos_doc_cartera where TERC_NIT = :ANTES;
delete from movimiento_clientes where TERC_NIT = :ANTES;
TIPODOC = 31;
FOR SELECT FACT_ID, PREF_PRE, FACT_NUMERO, FACT_FECHA, FACT_VENCE, FACT_RTFTEMONTO, FACT_RTIVAMONTO, FACT_RTICAMONTO, FACT_TOTAL, FACT_SUCURSAL
    FROM FACTURAS WHERE TERC_NIT = :antes AND FACT_ANULADO = 'N' AND FACT_ID <> 0 ORDER BY FACT_FECHA
    INTO :ID, :PREF, :NUMERO, :FECHA, :VENCE, :RTFTEMONTO, :RTIVAMONTO, :RTICAMONTO, :TOTAL, :SUCURSAL
    DO
    BEGIN
    /* Registre el nuevo saldo del documento */
    INSERT INTO SALDOS_DOC_CARTERA (SDCA_TIPOREF, SDCA_IDREF, SDCA_FECHA, TERC_NIT, SDCA_RTFTE, SDCA_RTIVA, SDCA_RTICA, SDCA_ABONO, SDCA_ABRTFTE, SDCA_ABRTIVA, SDCA_ABRTICA, SDCA_DEBITO, SDCA_MONTO)
        VALUES (31, :ID, :fecha, :NUEVO, :rtftemonto, :rtivamonto, :rticamonto, 0, 0, 0, 0, 'S', :TOTAL);
    CONC = 'FACTURA DE VENTA No.' || :PREF || :NUMERO;
    INSERT INTO MOVIMIENTO_CLIENTES (MVCL_ID, TERC_NIT, MVCL_TIPOREF, MVCL_IDREF, MVCL_FECHA, MVCL_VENCE, MVCL_CONC, MVCL_MONTO, MVCL_RTEFTE, MVCL_RTEIVA, MVCL_RTEICA, MVCL_DEBITO, MVCL_ABONO, MVCL_PREFREF, MVCL_NUMREF, MVCL_SUCURSAL)
        VALUES (GEN_ID(ID_MOVCLI, 1), :NUEVO, 31, :ID, :FECHA, :VENCE, :CONC, :TOTAL, :RTFTEMONTO, :RTIVAMONTO, :RTICAMONTO, 'S', 'N', :pref, :numero, :sucursal);
    suspend;
    END
TIPODOC = 33;
FOR SELECT DEVT_ID, PREF_PRE, DEVT_NUMERO, DEVT_FECHA, DEVT_RTFTEMONTO, DEVT_RTIVAMONTO, DEVT_RTICAMONTO, DEVT_TOTAL, devt_factura, DEVT_SUCURSAL
    FROM DEVOLUCIONES_VENTAS WHERE TERC_NIT = :antes AND DEVT_ANULADO = 'N' AND DEVT_ID <> 0 ORDER BY DEVT_FECHA
    INTO :ID, :PREF, :NUMERO, :FECHA, :RTFTEMONTO, :RTIVAMONTO, :RTICAMONTO, :TOTAL, :CONC, :SUCURSAL
    DO
    BEGIN
    /* Registre el nuevo saldo del documento */
    INSERT INTO SALDOS_DOC_CARTERA (SDCA_TIPOREF, SDCA_IDREF, SDCA_FECHA, TERC_NIT, SDCA_RTFTE, SDCA_RTIVA, SDCA_RTICA, SDCA_ABONO, SDCA_ABRTFTE, SDCA_ABRTIVA, SDCA_ABRTICA, SDCA_DEBITO, SDCA_MONTO)
        VALUES (33, :ID, :fecha, :NUEVO, (:rtftemonto*-1), (:rtivamonto*-1), (:rticamonto*-1), 0, 0, 0, 0, 'S', (:TOTAL*-1));
    CONC = 'DEVOLUCION VENTA No.' || :PREF || :NUMERO || ' EN FACTURA ' || :CONC;
    INSERT INTO MOVIMIENTO_CLIENTES (MVCL_ID, TERC_NIT, MVCL_TIPOREF, MVCL_IDREF, MVCL_FECHA, MVCL_VENCE, MVCL_CONC, MVCL_MONTO, MVCL_RTEFTE, MVCL_RTEIVA, MVCL_RTEICA, MVCL_DEBITO, MVCL_ABONO, MVCL_PREFREF, MVCL_NUMREF, MVCL_SUCURSAL)
        VALUES (GEN_ID(ID_MOVCLI, 1), :NUEVO, 33, :ID, :FECHA, :FECHA, :CONC, :TOTAL, :RTFTEMONTO, :RTIVAMONTO, :RTICAMONTO, 'S', 'N', :pref, :numero, :SUCURSAL);
    suspend;
    END
TIPODOC = 41;
FOR SELECT NDCL_ID, PREF_PRE, NDCL_NUMERO, NDCL_FECHA, NDCL_VENCE, NDCL_RTFTEMONTO, NDCL_RTIVAMONTO, NDCL_RTICAMONTO, (NDCL_MONTO+NDCL_IVAMONTO), NDCL_CONC, NDCL_SUCURSAL
    FROM notas_debito_clientes WHERE TERC_NIT = :antes AND NDCL_ANULADO = 'N' AND NDCL_ID <> 0 ORDER BY NDCL_FECHA
    INTO :ID, :PREF, :NUMERO, :FECHA, :VENCE, :RTFTEMONTO, :RTIVAMONTO, :RTICAMONTO, :TOTAL, :CONC, :SUCURSAL
    DO
    BEGIN
    /* Registre el nuevo saldo del documento */
    INSERT INTO SALDOS_DOC_CARTERA (SDCA_TIPOREF, SDCA_IDREF, SDCA_FECHA, TERC_NIT, SDCA_RTFTE, SDCA_RTIVA, SDCA_RTICA, SDCA_ABONO, SDCA_ABRTFTE, SDCA_ABRTIVA, SDCA_ABRTICA, SDCA_DEBITO, SDCA_MONTO)
        VALUES (41, :ID, :fecha, :NUEVO, :rtftemonto, :rtivamonto, :rticamonto, 0, 0, 0, 0, 'S', :TOTAL);
    INSERT INTO MOVIMIENTO_CLIENTES (MVCL_ID, TERC_NIT, MVCL_TIPOREF, MVCL_IDREF, MVCL_FECHA, MVCL_VENCE, MVCL_CONC, MVCL_MONTO, MVCL_RTEFTE, MVCL_RTEIVA, MVCL_RTEICA, MVCL_DEBITO, MVCL_ABONO, MVCL_PREFREF, MVCL_NUMREF, MVCL_SUCURSAL)
        VALUES (GEN_ID(ID_MOVCLI, 1), :NUEVO, 41, :ID, :FECHA, :VENCE, :CONC, :TOTAL, :RTFTEMONTO, :RTIVAMONTO, :RTICAMONTO, 'S', 'N', :pref, :numero, :SUCURSAL);
    suspend;
    END
TIPODOC = 42;
FOR SELECT NCCL_ID, PREF_PRE, NCCL_NUMERO, NCCL_FECHA, NCCL_RTFTEMONTO, NCCL_RTIVAMONTO, NCCL_RTICAMONTO, (NCCL_MONTO+NCCL_IVAMONTO), NCCL_CONC, NCCL_SUCURSAL
    FROM notas_credito_clientes WHERE TERC_NIT = :antes AND NCCL_ANULADO = 'N' AND NCCL_ID <> 0 ORDER BY NCCL_FECHA
    INTO :ID, :PREF, :NUMERO, :FECHA, :RTFTEMONTO, :RTIVAMONTO, :RTICAMONTO, :TOTAL, :CONC, :SUCURSAL
    DO
    BEGIN
    /* Registre el nuevo saldo del documento */
    INSERT INTO SALDOS_DOC_CARTERA (SDCA_TIPOREF, SDCA_IDREF, SDCA_FECHA, TERC_NIT, SDCA_RTFTE, SDCA_RTIVA, SDCA_RTICA, SDCA_ABONO, SDCA_ABRTFTE, SDCA_ABRTIVA, SDCA_ABRTICA, SDCA_DEBITO, SDCA_MONTO)
        VALUES (41, :ID, :fecha, :NUEVO, (:rtftemonto*-1), (:rtivamonto*-1), (:rticamonto*-1), 0, 0, 0, 0, 'S', (:TOTAL*-1));
    INSERT INTO MOVIMIENTO_CLIENTES (MVCL_ID, TERC_NIT, MVCL_TIPOREF, MVCL_IDREF, MVCL_FECHA, MVCL_VENCE, MVCL_CONC, MVCL_MONTO, MVCL_RTEFTE, MVCL_RTEIVA, MVCL_RTEICA, MVCL_DEBITO, MVCL_ABONO, MVCL_PREFREF, MVCL_NUMREF, MVCL_SUCURSAL)
        VALUES (GEN_ID(ID_MOVCLI, 1), :NUEVO, 41, :ID, :FECHA, :FECHA, :CONC, :TOTAL, :RTFTEMONTO, :RTIVAMONTO, :RTICAMONTO, 'S', 'N', :pref, :numero, :SUCURSAL);
    suspend;
    END
TIPODOC = 45;
FOR SELECT ANCL_ID, PREF_PRE, ANCL_NUMERO, ANCL_FECHA, ANCL_RTFTEMONTO, ANCL_RTIVAMONTO, ANCL_RTICAMONTO, (ANCL_BASE+ANCL_IVAMONTO), ANCL_CONC, ANCL_SUCURSAL
    FROM anticipos_cliente WHERE TERC_NIT = :antes AND ANCL_ANULADO = 'N' AND ANCL_ID <> 0 ORDER BY ANCL_FECHA
    INTO :ID, :PREF, :NUMERO, :FECHA, :RTFTEMONTO, :RTIVAMONTO, :RTICAMONTO, :TOTAL, :CONC, :SUCURSAL
    DO
    BEGIN
    /* Registre el nuevo saldo del documento */
    INSERT INTO SALDOS_DOC_CARTERA (SDCA_TIPOREF, SDCA_IDREF, SDCA_FECHA, TERC_NIT, SDCA_RTFTE, SDCA_RTIVA, SDCA_RTICA, SDCA_ABONO, SDCA_ABRTFTE, SDCA_ABRTIVA, SDCA_ABRTICA, SDCA_DEBITO, SDCA_MONTO)
        VALUES (45, :ID, :fecha, :NUEVO, (:rtftemonto*-1), (:rtivamonto*-1), (:rticamonto*-1), 0, 0, 0, 0, 'N', (:TOTAL*-1));
    /* Registre el movimiento del proveedor */
    INSERT INTO MOVIMIENTO_CLIENTES (MVCL_ID, TERC_NIT, MVCL_TIPOREF, MVCL_IDREF, MVCL_FECHA, MVCL_VENCE, MVCL_CONC, MVCL_MONTO, MVCL_RTEFTE, MVCL_RTEIVA, MVCL_RTEICA, MVCL_DEBITO, MVCL_ABONO, MVCL_PREFREF, MVCL_NUMREF, MVCL_SUCURSAL)
        VALUES (GEN_ID(ID_MOVCLI, 1), :NUEVO, 45, :ID, :FECHA, :FECHA, :CONC, :TOTAL, :RTFTEMONTO, :RTIVAMONTO, :RTICAMONTO, 'N', 'N', :pref, :numero, :SUCURSAL);
    END
TIPODOC = 77;
FOR SELECT DVCH_ID, PRBA_PREF, DVCH_NUMDOC, DVCH_FECHA, DVCH_MONTO, DVCH_CONC, DVCH_SUCURSAL
    FROM DEVOLUCION_CHEQUES WHERE TERC_NIT = :antes AND DVCH_ANULADO = 'N' AND DVCH_ID <> 0 ORDER BY DVCH_FECHA
    INTO :ID, :PREF, :NUMERO, :FECHA, :TOTAL, :CONC, :SUCURSAL
    DO
    BEGIN
    /* Registre el nuevo saldo del documento */
    INSERT INTO SALDOS_DOC_CARTERA (SDCA_TIPOREF, SDCA_IDREF, SDCA_FECHA, TERC_NIT, SDCA_RTFTE, SDCA_RTIVA, SDCA_RTICA, SDCA_ABONO, SDCA_ABRTFTE, SDCA_ABRTIVA, SDCA_ABRTICA, SDCA_DEBITO, SDCA_MONTO)
        VALUES (77, :ID, :fecha, :NUEVO, 0, 0, 0, 0, 0, 0, 0, 'N', :TOTAL);
    /* Registre el movimiento del proveedor */
    INSERT INTO  MOVIMIENTO_CLIENTES
        (MVCL_ID, TERC_NIT, MVCL_TIPOREF, MVCL_IDREF, MVCL_PREFREF, MVCL_NUMREF, MVCL_FECHA, MVCL_VENCE, MVCL_CONC, MVCL_MONTO, MVCL_RTEFTE, MVCL_RTEIVA, MVCL_RTEICA, MVCL_ABONO, MVCL_DEBITO, MVCL_SUCURSAL)
        VALUES (GEN_ID(ID_MOVCLI, 1), :NUEVO, 77, :ID, :PREF, :NUMERO, :FECHA, :FECHA, :CONC, :TOTAL, 0, 0, 0, 'N', 'S', :SUCURSAL);
    END
/* LOS ANTICIPOS */
TIPODOC = 43;
FOR SELECT A.APCL_ID, PREF_PRE, APCL_NUMERO, APCL_FECHA, APCL_CONCEPTO, ACDE_TIPODOC, ACDE_IDDOC, ACDE_APLICADO, ACDE_RTFTE, ACDE_RTIVA, ACDE_RTICA, APCL_SUCURSAL
    FROM APLICACION_CLIENTE A, APLICACION_CLIENTE_DETALLE D
    WHERE A.APCL_ID = D.APCL_ID AND TERC_NIT = :ANTES ORDER BY APCL_FECHA, A.APCL_ID, ACDE_ITEM
    INTO :ID, :PREF, :NUMERO, :FECHA, :CONC, :TIPOAB, :IDAB, :MONTOAB, :RTFTEMONTO, :RTIVAMONTO, :RTICAMONTO, :SUCURSAL
    DO
    BEGIN
    select 'S' from saldos_doc_cartera
        where sdca_tiporef = :TIPOAB and sdca_idref = :IDAB and sdca_fecha = :FECHA
        into :EXISTE;
    if (Existe = 'S') then
        begin
        /* actualice el saldo del dia */
        UPDATE saldos_doc_cartera
            SET SDCA_ABONO = SDCA_ABONO + :MONTOAB,
                SDCA_ABRTFTE = SDCA_ABRTFTE + :RTFTEMONTO,
                SDCA_ABRTIVA = SDCA_ABRTIVA + :RTIVAMONTO,
                SDCA_ABRTICA = SDCA_ABRTICA + :RTICAMONTO
            WHERE SDCA_TIPOREF = :TIPOAB AND SDCA_IDREF = :IDAB AND SDCA_FECHA = :FECHA;
        END
    ELSE
        BEGIN
        /* Inserte un nuevo saldo diario */
        INSERT INTO SALDOS_DOC_CARTERA (SDCA_TIPOREF, SDCA_IDREF, SDCA_FECHA, TERC_NIT, SDCA_RTFTE, SDCA_RTIVA, SDCA_RTICA, SDCA_ABONO, SDCA_ABRTFTE, SDCA_ABRTIVA, SDCA_ABRTICA, SDCA_DEBITO, SDCA_MONTO)
            VALUES (:TIPOAB, :IDAB, :FECHA, :NUEVO, 0, 0, 0, :MONTOAB, :rtftemonto, :rtivamonto, :rticamonto, 'N', 0);
        END
    /* actualice el registro en mov_cliente (por si son varios items) */
    EXISTE = 'N';
    SELECT 'S' FROM MOVIMIENTO_CLIENTES WHERE MVCL_TIPOREF = 43 AND MVCL_IDREF = :ID INTO :EXISTE;
    if (EXISTE = 'S') then
        begin
        UPDATE movimiento_clientes
            SET MVCL_MONTO = MVCL_MONTO + :MONTOAB,
                MVCL_RTEFTE = MVCL_RTEFTE + :rtftemonto,
                MVCL_RTEIVA = MVCL_RTEIVA + :rtivamonto,
                MVCL_RTEICA = MVCL_RTEICA + :rticamonto
            WHERE MVCL_TIPOREF = 43 AND MVCL_IDREF = :ID;
        end
    ELSE
        INSERT INTO MOVIMIENTO_CLIENTES (MVCL_ID, TERC_NIT, MVCL_TIPOREF, MVCL_IDREF, MVCL_FECHA, MVCL_VENCE, MVCL_CONC, MVCL_MONTO, MVCL_RTEFTE, MVCL_RTEIVA, MVCL_RTEICA, MVCL_DEBITO, MVCL_ABONO, MVCL_PREFREF, MVCL_NUMREF, MVCL_SUCURSAL)
            VALUES (GEN_ID(ID_MOVCLI, 1), :NUEVO, 43, :ID, :FECHA, :FECHA, :CONC, :MONTOAB, :rtftemonto, :rtivamonto, :rticamonto, 'N', 'S', :PREF, :NUMERO, :SUCURSAL);
    END
/* RECIBOS DE CAJA */
FOR SELECT R.RECA_ID, PREF_PRE, RECA_NUMERO, RECA_FECHA, RECA_CONC, RCDE_TIPODOC, RCDE_IDDOC, (RCDE_ABONO+RCDE_DTOF), RCDE_RTFTE, RCDE_RTIVA, RCDE_RTICA, RCDE_SUCURSAL
    FROM RECIBOS_CAJA R, RECIBOS_CAJA_DETALLE D
    WHERE R.RECA_ID = D.RECA_ID AND TERC_NIT = :ANTES ORDER BY RECA_FECHA, R.RECA_ID, RCDE_ITEM
    INTO :ID, :PREF, :NUMERO, :FECHA, :CONC, :TIPOAB, :IDAB, :MONTOAB, :RTFTEMONTO, :RTIVAMONTO, :RTICAMONTO, :SUCURSAL
    DO
    BEGIN
    select 'S' from saldos_doc_cartera where sdca_tiporef = :tipoab and sdca_idref = :idab and sdca_fecha = :FECHA into :EXISTE;
    if (Existe = 'S') then
        /* actualice el saldo del dia */
        UPDATE saldos_doc_cartera
            SET SDCA_ABONO = SDCA_ABONO + :MONTOAB,
                SDCA_ABRTFTE = SDCA_ABRTFTE + :rtftemonto,
                SDCA_ABRTIVA = SDCA_ABRTIVA + :rtivamonto,
                SDCA_ABRTICA = SDCA_ABRTICA + :rticamonto
            WHERE SDCA_TIPOREF = :TIPOAB AND SDCA_IDREF = :idab AND SDCA_FECHA = :FECHA;
    ELSE
        /* Inserte un nuevo saldo diario */
        INSERT INTO SALDOS_DOC_CARTERA (SDCA_TIPOREF, SDCA_IDREF, SDCA_FECHA, TERC_NIT, SDCA_RTFTE, SDCA_RTIVA, SDCA_RTICA, SDCA_ABONO, SDCA_ABRTFTE, SDCA_ABRTIVA, SDCA_ABRTICA, SDCA_DEBITO, SDCA_MONTO)
            VALUES (:tipoab, :idab, :FECHA, :NUEVO, 0, 0, 0, :MONTOAB, :rtftemonto, :rtivamonto, :rticamonto, 'N', 0);
    /* Registre o actualice el registro en movimiento_cliente */
    EXISTE = 'N';
    SELECT 'S' FROM MOVIMIENTO_CLIENTES WHERE MVCL_TIPOREF = 61 AND MVCL_IDREF = :ID and MVCL_SUCURSAL = :SUCURSAL INTO :EXISTE;
    if (EXISTE = 'S') then
        begin
        UPDATE movimiento_clientes
            SET MVCL_MONTO = MVCL_MONTO + :montoab,
                MVCL_RTEFTE = MVCL_RTEFTE + :rtftemonto,
                MVCL_RTEIVA = MVCL_RTEIVA + :rtivamonto,
                MVCL_RTEICA = MVCL_RTEICA + :rticamonto
            WHERE MVCL_TIPOREF = 61 AND MVCL_IDREF = :ID and MVCL_SUCURSAL = :SUCURSAL;
        end
    ELSE
        INSERT INTO MOVIMIENTO_CLIENTES (MVCL_ID, TERC_NIT, MVCL_TIPOREF, MVCL_IDREF, MVCL_FECHA, MVCL_VENCE, MVCL_CONC, MVCL_MONTO, MVCL_RTEFTE, MVCL_RTEIVA, MVCL_RTEICA, MVCL_DEBITO, MVCL_ABONO, MVCL_PREFREF, MVCL_NUMREF, MVCL_SUCURSAL)
            VALUES (GEN_ID(ID_MOVCLI, 1), :NUEVO, 61, :ID, :FECHA, :FECHA, :CONC, :MONTOAB, :rtftemonto, :rtivamonto, :rticamonto, 'N', 'S', :PREF, :NUMERO, :SUCURSAL);
    end
end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER PROCEDURE ARREGLA_MOV_CLIENTE_RC
RETURNS (
    ID INTEGER,
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(6),
    NIT VARCHAR(20),
    FECHA DATE)
AS
declare variable MONTO NUMERIC(18,2);
declare variable ABONO NUMERIC(18,2);
declare variable RTFTE NUMERIC(18,2);
declare variable RTIVA NUMERIC(18,2);
declare variable RTICA NUMERIC(18,2);
declare variable RTEFTE NUMERIC(18,2);
declare variable RTEIVA NUMERIC(18,2);
declare variable RTEICA NUMERIC(18,2);
declare variable CONCEPTO VARCHAR(60);
declare variable SUCURSAL VARCHAR(10);
declare variable COBR INTEGER;
declare variable EXISTE CHAR(1);
BEGIN
FOR SELECT MAX(D.RECA_ID), SUM(RCDE_ABONO+RCDE_DTOF), MAX(MVCL_MONTO), SUM(RCDE_RTFTE), MAX(MVCL_RTEFTE), SUM(RCDE_RTIVA), MAX(MVCL_RTEIVA), SUM(RCDE_RTICA), MAX(MVCL_RTEICA)
  FROM RECIBOS_CAJA_DETALLE D, MOVIMIENTO_CLIENTES M
  WHERE MVCL_TIPOREF = 61 AND MVCL_IDREF = RECA_ID GROUP BY D.RECA_ID
  INTO :ID, ABONO, MONTO, RTFTE, RTEFTE, RTIVA, RTEIVA, RTICA, RTEICA
  DO
  BEGIN
  IF ((ABONO <> MONTO) or (RTFTE <> RTEFTE) or (RTIVA <> RTEIVA) or (RTICA <> RTEICA)) THEN
    BEGIN
    DELETE FROM MOVIMIENTO_CLIENTES WHERE MVCL_TIPOREF = 61 AND MVCL_IDREF = :ID;
    FOR SELECT RCDE_ABONO, RCDE_DTOF, RCDE_RTFTE, RCDE_RTIVA, RCDE_RTICA, TERC_NIT, RECA_FECHA, RECA_CONC, PREF_PRE, RECA_NUMERO, RCDE_SUCURSAL, COBR_COD
        FROM RECIBOS_CAJA_DETALLE D, RECIBOS_CAJA R WHERE R.RECA_ID = D.RECA_ID AND R.RECA_ID = :ID
        INTO :ABONO, :monto, rtfte, :rteiva, :rtica, :nit,  :fecha, :concepto, :prefijo, :numero, :sucursal, :COBR
        DO
        BEGIN
        EXISTE = 'N';
        SELECT 'S' FROM MOVIMIENTO_CLIENTES WHERE MVCL_TIPOREF = 61 AND MVCL_IDREF = :ID AND MVCL_SUCURSAL = :SUCURSAL INTO :EXISTE;
        if (EXISTE = 'S') then
            begin
            UPDATE movimiento_clientes
                SET MVCL_MONTO = MVCL_MONTO + :abono + :monto,
                    MVCL_RTEFTE = MVCL_RTEFTE + :rtfte,
                    MVCL_RTEIVA = MVCL_RTEIVA + :rtiva,
                    MVCL_RTEICA = MVCL_RTEICA + :rtica
                WHERE MVCL_TIPOREF = 61 AND MVCL_IDREF = :ID AND MVCL_SUCURSAL = :SUCURSAL;
            end
        ELSE
            INSERT INTO MOVIMIENTO_CLIENTES (MVCL_ID, TERC_NIT, MVCL_TIPOREF, MVCL_IDREF, MVCL_FECHA, MVCL_VENCE, MVCL_CONC, MVCL_MONTO, MVCL_RTEFTE, MVCL_RTEIVA, MVCL_RTEICA, MVCL_DEBITO, MVCL_ABONO, MVCL_PREFREF, MVCL_NUMREF, MVCL_SUCURSAL, COBR_COD)
                VALUES (GEN_ID(ID_MOVCLI, 1), :NIT, 61, :ID, :FECHA, :FECHA, :CONCEPTO, (:ABONO+:monto), :RTFTE, :RTIVA, :RTICA, 'N', 'S', :PREFIJO, :NUMERO, :SUCURSAL, :COBR);
        END
    SUSPEND;
    END
  END
END
^

SET TERM ; ^

ALTER TABLE RECIBOS_CAJA DROP RECA_SUCURSAL;


/* PROVISIONALES */

ALTER TABLE RECIBO_PROVISIONAL_DETALLE
ADD RPDE_SUCURSAL VARCHAR(10)
NOT NULL ;

UPDATE recibo_provisional_detalle D SET RPDE_SUCURSAL = (SELECT RCPR_SUCURSAL FROM recibo_provisional R WHERE RCPR_ID = D.rcpr_id);
COMMIT WORK;

SET TERM ^ ;

CREATE OR ALTER PROCEDURE REP_CARTERA_CLIENTES(
    DESDE VARCHAR(20),
    HASTA VARCHAR(20),
    GRPINI VARCHAR(5),
    GRPFIN VARCHAR(5),
    FECHA DATE,
    ORDEN CHAR(1),
    AGRUPA CHAR(1),
    SUBEMPRESA INTEGER,
    GRUPCART INTEGER)
RETURNS (
    NIT VARCHAR(20),
    NOMBRE VARCHAR(60),
    DIR VARCHAR(60),
    TELEFONO VARCHAR(40),
    CIUDAD VARCHAR(40),
    CONTACTO VARCHAR(60),
    EMAIL VARCHAR(100),
    FAX VARCHAR(25),
    CEL VARCHAR(25),
    CODCLI VARCHAR(20),
    CODZONA VARCHAR(2),
    NOMZONA VARCHAR(60),
    CODCOBR INTEGER,
    NOMCOBR VARCHAR(60),
    SUCURSAL VARCHAR(10),
    NOMSUC VARCHAR(60),
    DV CHAR(1),
    CODCIUD CHAR(5),
    NOMCIUD VARCHAR(60),
    TIPO INTEGER,
    ID INTEGER,
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(6),
    CONCEPTO VARCHAR(60),
    SALDO NUMERIC(18,2),
    PROVISIONAL NUMERIC(18,2),
    RTFTE NUMERIC(18,2),
    RTIVA NUMERIC(18,2),
    RTICA NUMERIC(18,2),
    DTOF NUMERIC(18,2),
    TIPONOM VARCHAR(8),
    FECDOC DATE,
    VENCE DATE,
    DIAS INTEGER,
    CUPO NUMERIC(18,2),
    DISPONIBLE NUMERIC(18,2),
    NOTA VARCHAR(256),
    OBS BLOB SUB_TYPE 0 SEGMENT SIZE 80,
    GRUPCOD INTEGER,
    GRUPNOM VARCHAR(30))
AS
DECLARE VARIABLE NITINI VARCHAR(20);
DECLARE VARIABLE NITFIN VARCHAR(20);
DECLARE VARIABLE NOMINI VARCHAR(20);
DECLARE VARIABLE NOMFIN VARCHAR(20);
DECLARE VARIABLE OK CHAR(1);
DECLARE VARIABLE FOV CHAR(11);
DECLARE VARIABLE DTOAPL NUMERIC(18,2);
DECLARE VARIABLE FECDTO DATE;
DECLARE VARIABLE FECNOTA VARCHAR(10);
DECLARE VARIABLE AUXNOTA VARCHAR(256);
DECLARE VARIABLE IDNOTA INTEGER;
declare variable descnt_prov char(2);
declare variable AUTORET VARCHAR(10);
declare variable FAUTORET DATE;
declare variable INCLANTI CHAR(2);
BEGIN
if (ORDEN = 'C') then
    BEGIN
    NITINI = DESDE;
    NITFIN = HASTA;
    NOMINI = '';
    NOMFIN = 'zz';
    END
ELSE
    BEGIN
    NOMINI = DESDE;
    NOMFIN = HASTA;
    NITINI = '';
    NITFIN = 'zz';
    END
  EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'DESCONTAR RECIBOS PROVISIONALES EN INFORMES DE CARTERA') RETURNING_VALUES (:descnt_prov);
  EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'INCLUIR ANTICIPOS DE CLIENTES EN REPORTES Y CONSULTAS DE CARTERA') returning_values (INCLANTI);
  EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'FECHA AUTORETENEDOR NO DESCONTAR RETENCIONES DEL SALDO PERO SI CONTABILIZARLAS') returning_values (AUTORET);
  if (AUTORET <> '') then
    FAUTORET = CAST(AUTORET AS DATE);
  else
    FAUTORET = '9999/12/31';
  /* Ubique el NIT */
  FOR select C.TERC_NIT, TERC_NOM, TERC_DV, CLSU_DIR, CLSU_TEL, CLSU_CIUDAD, S.COBR_COD, S.ZONA_COD, T.CIUD_COD, CLIE_CUPO, CLCU_COD, CLSU_NOMBRE, t.terc_obs, C.GRCA_COD, TERC_CONTACTO, TERC_EMAIL, TERC_FAX, TERC_CEL, CLIE_COD
    from terceros T, CLIENTES C, CLIENTE_SUCURSALES S
    where C.TERC_NIT = T.TERC_NIT AND TERC_CLIE = 'S' AND S.TERC_NIT = C.TERC_NIT AND C.TERC_NIT >= :NITINI AND C.TERC_NIT <= :NITFIN AND
        TERC_NOM >= :NOMINI AND TERC_NOM <= :NOMFIN AND ((:GRUPCART = 0) or (C.GRCA_COD = :GRUPCART))
    INTO :NIT, :NOMBRE, :DV, :DIR, :TELEFONO, :CIUDAD, :CODCOBR, :CODZONA, :CODCIUD, :CUPO, :SUCURSAL, :NOMSUC, :obs, :GRUPCOD, :CONTACTO, :EMAIL, :FAX, :CEL, :CODCLI
    DO  
    BEGIN
    if (CODCOBR IS NOT NULL) then
        SELECT COBR_NOM FROM COBRADORES  WHERE COBR_COD = :CODCOBR INTO :NOMCOBR;
    if (CODZONA IS NOT NULL) then
        SELECT ZONA_NOM FROM ZONAS WHERE ZONA_COD = :CODZONA INTO :NOMZONA;
    if (CODCIUD IS NOT NULL) then
        SELECT CIUD_NOM FROM CIUDADES  WHERE CIUD_COD = :CODCIUD INTO :NOMCIUD;
    SELECT GRCA_NOMBRE FROM GRUPO_CARTERA WHERE GRCA_COD = :GRUPCOD INTO :GRUPNOM;
    DISPONIBLE = CUPO;
    OK = 'N';
    if (AGRUPA = 'Z') then
        BEGIN
        if (GRPINI = '') then
            BEGIN
            if ((CODZONA IS NULL) or (CODZONA >= :GRPINI AND CODZONA <= :GRPFIN)) then
                OK = 'S';
            END
        ELSE
            if (CODZONA >= :GRPINI AND CODZONA <= :GRPFIN) then
                OK = 'S';
        END
    if (AGRUPA = 'I') then
        BEGIN
        if (GRPINI = '') then
            BEGIN
            if ((CODCIUD IS NULL) or (CODCIUD >= :GRPINI AND CODCIUD <= :GRPFIN)) then
                OK = 'S';
            END
        ELSE
            if (CODCIUD >= :GRPINI AND CODCIUD <= :GRPFIN) then
                OK = 'S';
        END
    if (AGRUPA = 'N') then
        OK = 'S';
        
    if (OK = 'S') then
        BEGIN
        /* BUSQUE EN SALDOS_DOC_CARTERA LOS QUE TENGAN SALDO > 0 */
        FOR SELECT MVCL_TIPOREF, MVCL_IDREF, MVCL_PREFREF, MVCL_NUMREF, MVCL_FECHA, MVCL_VENCE, MVCL_CONC
            FROM MOVIMIENTO_CLIENTES WHERE TERC_NIT = :NIT AND MVCL_SUCURSAL = :SUCURSAL AND MVCL_FECHA <= :FECHA AND
            MVCL_ABONO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            INTO :TIPO, :ID, :PREFIJO, :NUMERO, :FECDOC, :VENCE, :CONCEPTO
            DO
            BEGIN
            if ((inclanti = 'SI') or (TIPO <> 45)) then
                BEGIN
                EXECUTE PROCEDURE saldo_doc_cartera(TIPO, ID, FECHA) returning_values (SALDO);
                if (SALDO <> 0) then
                    BEGIN
                    PROVISIONAL = 0;
                    EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'ANALISIS DE CARTERA CON FECHA FACTURA O VENCIMIENTO') RETURNING_VALUES (FOV);
                    if (FOV = 'FECHA') then
                       DIAS = FECHA - FECDOC;
                    ELSE
                      DIAS = FECHA - VENCE;
                    DISPONIBLE = DISPONIBLE - SALDO;
                    SELECT TIDO_NOMCORTO FROM TIPO_DOCUMENTO WHERE TIDO_COD = :TIPO INTO :TIPONOM;
                    if (TIPO = 41) then
                        SELECT NDCL_DTOFMONTO, NDCL_FECHADTO FROM NOTAS_DEBITO_CLIENTES WHERE NDCL_ID = :ID INTO :DTOF, :FECDTO;
                    if (TIPO = 42) then
                        SELECT 0, :FECDOC FROM NOTAS_CREDITO_CLIENTES WHERE NCCL_ID = :ID INTO :DTOF, :FECDTO;
                    if (TIPO = 45) then
                        SELECT ANCL_DTOFMONTO, ANCL_DTOFECHA FROM ANTICIPOS_CLIENTE WHERE ANCL_ID = :ID INTO :DTOF, :FECDTO;
                    if (TIPO = 31) then
                        SELECT FACT_DTOFMONTO, FACT_DTOFFECHA FROM FACTURAS WHERE FACT_ID = :ID INTO :DTOF, :FECDTO;
                    if (TIPO = 33) then
                        SELECT 0, :FECDOC FROM devoluciones_ventas WHERE DEVT_ID = :ID INTO :DTOF, :FECDTO;
                    if (DTOF IS NULL) then
                        DTOF = 0;
                    if (DTOF <> 0) then
                        BEGIN
                        SELECT SUM(RCDE_DTOF) FROM RECIBOS_CAJA_DETALLE WHERE RCDE_IDDOC = :ID AND RCDE_TIPODOC = :TIPO INTO :DTOAPL;
                        if (DTOAPL IS NULL) then
                            DTOAPL = 0;
                        DTOF = DTOF - DTOAPL;
                        /* SI YA SE VENCIO DEJELO EN CERO */
                        if (FECDTO < FECHA) then
                            DTOF = 0;
                        END
                    SELECT SUM(SDCA_RTFTE - SDCA_ABRTFTE), SUM(SDCA_RTIVA - SDCA_ABRTIVA), SUM(SDCA_RTICA - SDCA_ABRTICA)
                        FROM SALDOS_DOC_CARTERA WHERE SDCA_TIPOREF = :TIPO AND SDCA_IDREF = :ID INTO :RTFTE, :RTIVA, :RTICA;
                    if (RTFTE IS NULL) then
                        RTFTE = 0;
                    if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) THEN
                        BEGIN
                        if (RTFTE > 0) then
                            RTFTE = 0;
                        END
                    ELSE
                        BEGIN
                        if (RTFTE < 0) then
                            RTFTE = 0;
                        END
                    if (RTIVA IS NULL) then
                        RTIVA = 0;
                    if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) THEN
                        BEGIN
                        if (RTIVA > 0) then
                            RTIVA = 0;
                        END
                    ELSE
                        BEGIN
                        if (RTIVA < 0) then
                            RTIVA = 0;
                        END
                    if (RTICA IS NULL) then
                        RTICA = 0;
                    if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) THEN
                        BEGIN
                        if (RTICA > 0) then
                            RTICA = 0;
                        END
                    ELSE
                        BEGIN
                        if (RTICA < 0) then
                            RTICA = 0;
                        END
                    if (FAUTORET <= FECDOC) then
                        RTFTE = 0;
                    /* SI TIENE NOTA AGREGUELA */
                    SELECT MAX(NOCL_ID) FROM NOTAS_CLIENTES WHERE TERC_NIT = :NIT AND CLSU_COD = :SUCURSAL AND NOCL_TIPODOC = :TIPO AND NOCL_IDDOC = :ID INTO :IDNOTA;
                    if (IDNOTA IS NOT NULL) then
                        BEGIN
                        SELECT cast(NOCL_FECHA as char(10)), NOCL_TEXTO FROM NOTAS_CLIENTES
                            WHERE NOCL_ID = :IDNOTA INTO :FECNOTA, :AUXNOTA;
                        if (STRLEN(AUXNOTA) < 244) then
                            NOTA = FECNOTA || ':' || AUXNOTA;
                        ELSE
                            NOTA = AUXNOTA;
                        END
                    else
                        NOTA = '';
                    SUSPEND;
                    END /* SALDO <> 0 */
                END /* NO ANTICIPO */
            END /* FOR */
        /* AGREGUE LOS RECIBOS PROVISIONALES CON SIGNO NEGATIVO */
        FOR SELECT 65, MAX(P.RCPR_ID), MAX(PREF_PRE), MAX(RCPR_NUMERO), MAX(RCPR_FECHA), MAX(RCPR_CONC), SUM(RPDE_ABONO * -1), SUM(RPDE_RTFTE*-1), SUM(RPDE_RTIVA*-1), SUM(RPDE_RTICA*-1)
            FROM RECIBO_PROVISIONAL P, recibo_provisional_detalle D
            WHERE P.rcpr_id = D.rcpr_id AND P.TERC_NIT = :NIT AND RCPR_FECHA <= :FECHA AND RCPR_ANULADO = 'N' AND
            ((RCPR_FECCRUCE IS NULL) or (RCPR_FECCRUCE > :FECHA)) AND RPDE_SUCURSAL = :SUCURSAL AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY P.rcpr_id
            INTO :TIPO, :ID, :PREFIJO, :NUMERO, :FECDOC, :CONCEPTO, :PROVISIONAL, :rtfte,  :RTIVA, :RTICA
            DO
            BEGIN
            if (:descnt_prov = 'NO') then
              SALDO = 0;
            else
              SALDO = :PROVISIONAL;
            SELECT TIDO_NOMCORTO FROM TIPO_DOCUMENTO WHERE TIDO_COD = :TIPO INTO :TIPONOM;
            /* CALCULE EL VENCIMIENTO DEL ULTIMO DOCUMENTO POSFECHADO */
            SELECT MAX(RPPA_FECHA) FROM recibo_provisional_pago WHERE RCPR_ID = :ID INTO :VENCE;
            DIAS = VENCE - FECHA;
            SUSPEND;
            END
        END
    if (AGRUPA = 'C') then
        BEGIN
        FOR SELECT DISTINCT COBR_COD FROM MOVIMIENTO_CLIENTES
            WHERE TERC_NIT = :NIT AND MVCL_SUCURSAL = :SUCURSAL AND MVCL_FECHA <= :FECHA AND
            MVCL_ABONO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            INTO :codcobr
            DO
            BEGIN
            OK = 'N';
            if (GRPINI = '') then
                BEGIN
                if ((CODCOBR IS NULL) or (CODCOBR >= :GRPINI AND CODCOBR <= :GRPFIN)) then
                    OK = 'S';
                END
            ELSE
                if (CODCOBR >= :GRPINI AND CODCOBR <= :GRPFIN) then
                    OK = 'S';
            if (OK = 'S') then
                BEGIN
                SELECT COBR_NOM FROM COBRADORES  WHERE COBR_COD = :CODCOBR INTO :NOMCOBR;
                /* BUSQUE EN SALDOS_DOC_CARTERA LOS QUE TENGAN SALDO > 0 */
                FOR SELECT MVCL_TIPOREF, MVCL_IDREF, MVCL_PREFREF, MVCL_NUMREF, MVCL_FECHA, MVCL_VENCE, MVCL_CONC
                    FROM MOVIMIENTO_CLIENTES WHERE TERC_NIT = :NIT AND MVCL_SUCURSAL = :SUCURSAL AND MVCL_FECHA <= :FECHA AND
                    MVCL_ABONO = 'N' AND COBR_COD = :codcobr AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                    INTO :TIPO, :ID, :PREFIJO, :NUMERO, :FECDOC, :VENCE, :CONCEPTO
                    DO
                    BEGIN
                    if ((inclanti = 'SI') or (TIPO <> 45)) then
                        BEGIN
                        EXECUTE PROCEDURE saldo_doc_cartera(TIPO, ID, FECHA) returning_values (SALDO);
                        if (SALDO <> 0) then
                            BEGIN
                            PROVISIONAL = 0;
                            EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'ANALISIS DE CARTERA CON FECHA FACTURA O VENCIMIENTO') RETURNING_VALUES (FOV);
                            if (FOV = 'FECHA') then
                               DIAS = FECHA - FECDOC;
                            ELSE
                              DIAS = FECHA - VENCE;
                            DISPONIBLE = DISPONIBLE - SALDO;
                            SELECT TIDO_NOMCORTO FROM TIPO_DOCUMENTO WHERE TIDO_COD = :TIPO INTO :TIPONOM;
                            if (TIPO = 41) then
                                SELECT NDCL_DTOFMONTO, NDCL_FECHADTO FROM NOTAS_DEBITO_CLIENTES WHERE NDCL_ID = :ID INTO :DTOF, :FECDTO;
                            if (TIPO = 42) then
                                SELECT 0, :FECDOC FROM NOTAS_CREDITO_CLIENTES WHERE NCCL_ID = :ID INTO :DTOF, :FECDTO;
                            if (TIPO = 45) then
                                SELECT ANCL_DTOFMONTO, ANCL_DTOFECHA FROM ANTICIPOS_CLIENTE WHERE ANCL_ID = :ID INTO :DTOF, :FECDTO;
                            if (TIPO = 31) then
                                SELECT FACT_DTOFMONTO, FACT_DTOFFECHA FROM FACTURAS WHERE FACT_ID = :ID INTO :DTOF, :FECDTO;
                            if (TIPO = 33) then
                                SELECT 0, :FECDOC FROM devoluciones_ventas WHERE DEVT_ID = :ID INTO :DTOF, :FECDTO;
                            if (DTOF IS NULL) then
                                DTOF = 0;
                            if (DTOF <> 0) then
                                BEGIN
                                SELECT SUM(RCDE_DTOF) FROM RECIBOS_CAJA_DETALLE WHERE RCDE_IDDOC = :ID AND RCDE_TIPODOC = :TIPO INTO :DTOAPL;
                                if (DTOAPL IS NULL) then
                                    DTOAPL = 0;
                                DTOF = DTOF - DTOAPL;
                                /* SI YA SE VENCIO DEJELO EN CERO */
                                if (FECDTO < FECHA) then
                                    DTOF = 0;
                                END
                            SELECT SUM(SDCA_RTFTE - SDCA_ABRTFTE), SUM(SDCA_RTIVA - SDCA_ABRTIVA), SUM(SDCA_RTICA - SDCA_ABRTICA)
                                FROM SALDOS_DOC_CARTERA WHERE SDCA_TIPOREF = :TIPO AND SDCA_IDREF = :ID INTO :RTFTE, :RTIVA, :RTICA;
                            if (RTFTE IS NULL) then
                                RTFTE = 0;
                            if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) THEN
                                BEGIN
                                if (RTFTE > 0) then
                                    RTFTE = 0;
                                END
                            ELSE
                                BEGIN
                                if (RTFTE < 0) then
                                    RTFTE = 0;
                                END
                            if (FAUTORET <= FECDOC) then
                                RTFTE = 0;
                            if (RTIVA IS NULL) then
                                RTIVA = 0;
                            if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) THEN
                                BEGIN
                                if (RTIVA > 0) then
                                    RTIVA = 0;
                                END
                            ELSE
                                BEGIN
                                if (RTIVA < 0) then
                                    RTIVA = 0;
                                END
                            if (RTICA IS NULL) then
                                RTICA = 0;
                            if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) THEN
                                BEGIN
                                if (RTICA > 0) then
                                    RTICA = 0;
                                END
                            ELSE
                                BEGIN
                                if (RTICA < 0) then
                                    RTICA = 0;
                                END
                            /* SI TIENE NOTA AGREGUELA */
                            SELECT MAX(NOCL_FECHA) FROM NOTAS_CLIENTES WHERE TERC_NIT = :NIT AND CLSU_COD = :SUCURSAL AND NOCL_TIPODOC = :TIPO AND NOCL_IDDOC = :ID INTO :FECDTO;
                            if (FECDTO IS NOT NULL) then
                                BEGIN
                                SELECT cast(NOCL_FECHA as char(10)), NOCL_TEXTO FROM NOTAS_CLIENTES
                                    WHERE NOCL_ID = :IDNOTA INTO :FECNOTA, :AUXNOTA;
                                if (STRLEN(AUXNOTA) < 244) then
                                    NOTA = FECNOTA || ':' || AUXNOTA;
                                ELSE
                                    NOTA = AUXNOTA;
                                END
                            else
                                NOTA = '';
                            SUSPEND;
                            END /* SALDO <> 0 */
                        END /* NO ANTICIPO */
                    END /* FOR */
                /* AGREGUE LOS RECIBOS PROVISIONALES CON SIGNO NEGATIVO */
                FOR SELECT 65, MAX(P.RCPR_ID), MAX(PREF_PRE), MAX(RCPR_NUMERO), MAX(RCPR_FECHA), MAX(RCPR_CONC), SUM(RPDE_ABONO * -1), SUM(RPDE_RTFTE*-1), SUM(RPDE_RTIVA*-1), SUM(RPDE_RTICA*-1)
                    FROM RECIBO_PROVISIONAL P, recibo_provisional_detalle D
                    WHERE P.rcpr_id = D.rcpr_id AND P.TERC_NIT = :NIT AND P.VEND_COD = :codcobr AND RCPR_FECHA <= :FECHA AND RCPR_ANULADO = 'N' AND
                    ((RCPR_FECCRUCE IS NULL) or (RCPR_FECCRUCE > :FECHA)) AND RPDE_SUCURSAL = :SUCURSAL AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                    GROUP BY P.rcpr_id
                    INTO :TIPO, :ID, :PREFIJO, :NUMERO, :FECDOC, :CONCEPTO, :PROVISIONAL, :rtfte,  :RTIVA, :RTICA
                    DO
                    BEGIN
                    if (:descnt_prov = 'NO') then
                      SALDO = 0;
                    else
                      SALDO = :PROVISIONAL;
                    SELECT TIDO_NOMCORTO FROM TIPO_DOCUMENTO WHERE TIDO_COD = :TIPO INTO :TIPONOM;
                    /* CALCULE EL VENCIMIENTO DEL ULTIMO DOCUMENTO POSFECHADO */
                    SELECT MAX(RPPA_FECHA) FROM recibo_provisional_pago WHERE RCPR_ID = :ID INTO :VENCE;
                    DIAS = VENCE - FECHA;
                    SUSPEND;
                    END
                END /* ok */
            END /* FOR COBR */
        END /* AGRUPA = C */
    END /* FOR NIT */
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER PROCEDURE REP_ANALISIS_CARTERA(
    DESDE VARCHAR(20),
    HASTA VARCHAR(20),
    GRPINI VARCHAR(5),
    GRPFIN VARCHAR(5),
    FECHA DATE,
    DETALLE CHAR(1),
    ORDEN CHAR(1),
    AGRUPA CHAR(1),
    DIASR INTEGER,
    SUBEMPRESA INTEGER,
    GRUPCART INTEGER,
    EXTENDIDA CHAR(1))
RETURNS (
    NIT VARCHAR(20),
    NOMBRE VARCHAR(60),
    TELEFONO VARCHAR(40),
    CIUDAD VARCHAR(40),
    CONTACTO VARCHAR(60),
    EMAIL VARCHAR(100),
    FAX VARCHAR(25),
    CEL VARCHAR(25),
    CODCLI VARCHAR(20),
    CODZONA VARCHAR(2),
    NOMZONA VARCHAR(60),
    CODCOBR INTEGER,
    NOMCOBR VARCHAR(60),
    DV CHAR(1),
    CODCIUD CHAR(5),
    NOMCIUD VARCHAR(60),
    SUCURSAL VARCHAR(10),
    NOMSUC VARCHAR(60),
    TIPO INTEGER,
    ID INTEGER,
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(6),
    DIAS INTEGER,
    SALDO NUMERIC(18,2),
    CORRIENTE NUMERIC(18,2),
    CERO NUMERIC(18,2),
    TREINTA NUMERIC(18,2),
    SESENTA NUMERIC(18,2),
    NOVENTA NUMERIC(18,2),
    CIENTOCHENTA NUMERIC(18,2),
    DOSSETENTA NUMERIC(18,2),
    TRESSESENTA NUMERIC(18,2),
    PROVISIONAL NUMERIC(18,2),
    TIPONOM VARCHAR(8),
    FECDOC DATE,
    VENCE DATE,
    CUPO NUMERIC(18,2),
    DISPONIBLE NUMERIC(18,2),
    OBS BLOB SUB_TYPE 0 SEGMENT SIZE 80,
    GRUPCOD INTEGER,
    DIA_CAR INTEGER,
    GRUPNOM VARCHAR(30))
AS
DECLARE VARIABLE NITINI VARCHAR(20);
DECLARE VARIABLE NITFIN VARCHAR(20);
DECLARE VARIABLE NOMINI VARCHAR(20);
DECLARE VARIABLE NOMFIN VARCHAR(20);
DECLARE VARIABLE RTFTE NUMERIC(18,2);
DECLARE VARIABLE RTIVA NUMERIC(18,2);
DECLARE VARIABLE RTICA NUMERIC(18,2);
DECLARE VARIABLE VENCIMIENTO VARCHAR(12);
DECLARE VARIABLE OK CHAR(1);
declare variable AUTORET VARCHAR(10);
declare variable FAUTORET DATE;
declare variable INCLANTI CHAR(2);
declare variable descnt_prov char(2);
declare variable MAXDIAS INTEGER;
BEGIN
if (ORDEN = 'C') then
    BEGIN
    NITINI = DESDE;
    NITFIN = HASTA;
    NOMINI = '';
    NOMFIN = 'zz';
    END
ELSE
    BEGIN
    NOMINI = DESDE;
    NOMFIN = HASTA;
    NITINI = '';
    NITFIN = 'zz';
    END
  /* Ubique el NIT */
EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'FECHA AUTORETENEDOR NO DESCONTAR RETENCIONES DEL SALDO PERO SI CONTABILIZARLAS') returning_values (AUTORET);
if (AUTORET <> '') then
    FAUTORET = CAST(AUTORET AS DATE);
else
    FAUTORET = '9999/12/31';
EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'ANALISIS DE CARTERA CON FECHA FACTURA O VENCIMIENTO') returning_values (VENCIMIENTO);
EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'INCLUIR ANTICIPOS DE CLIENTES EN REPORTES Y CONSULTAS DE CARTERA') returning_values (INCLANTI);
EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'DESCONTAR RECIBOS PROVISIONALES EN INFORMES DE CARTERA') RETURNING_VALUES (:descnt_prov);

FOR select T.TERC_NIT, TERC_NOM, TERC_DV, CLSU_TEL, CLSU_CIUDAD, S.COBR_COD, S.ZONA_COD, T.CIUD_COD, CLIE_CUPO, CLIE_DIAS, CLCU_COD, CLSU_NOMBRE, t.terc_obs, C.GRCA_COD, TERC_CONTACTO, TERC_EMAIL, TERC_FAX, TERC_CEL, CLIE_COD
    from terceros T, CLIENTES C, CLIENTE_SUCURSALES S
    where C.TERC_NIT = T.TERC_NIT AND TERC_CLIE = 'S' AND S.TERC_NIT = C.TERC_NIT and T.TERC_NIT >= :NITINI AND T.TERC_NIT <= :NITFIN AND
        T.TERC_NOM >= :NOMINI AND T.TERC_NOM <= :NOMFIN AND ((:GRUPCART = 0) or (C.GRCA_COD = :GRUPCART))
    INTO :NIT, :NOMBRE, :DV, :TELEFONO, :CIUDAD, :CODCOBR, :CODZONA, :CODCIUD, :CUPO, :DIA_CAR,  :SUCURSAL, :NOMSUC, :obs, :GRUPCOD, :CONTACTO, :EMAIL, :FAX, :CEL, :CODCLI
    DO  
    BEGIN
    SELECT COBR_NOM FROM COBRADORES CB WHERE COBR_COD = :CODCOBR INTO :NOMCOBR;
    SELECT ZONA_NOM FROM ZONAS Z WHERE ZONA_COD = :CODZONA INTO :NOMZONA;
    SELECT CIUD_NOM FROM CIUDADES WHERE CIUD_COD = :CODCIUD INTO :NOMCIUD;
    SELECT GRCA_NOMBRE FROM GRUPO_CARTERA WHERE GRCA_COD = :GRUPCOD INTO :GRUPNOM;
    provisional = 0;
    MAXDIAS = 0;
    OK = 'N';
    if (AGRUPA = 'Z') then
        BEGIN
        if (GRPINI = '') then
            BEGIN
            if ((CODZONA IS NULL) or (CODZONA >= :GRPINI AND CODZONA <= :GRPFIN)) then
                OK = 'S';
            END
        ELSE
            if (CODZONA >= :GRPINI AND CODZONA <= :GRPFIN) then
                OK = 'S';
        END
    if (AGRUPA = 'I') then
        BEGIN
        if (GRPINI = '') then
            BEGIN
            if ((CODCIUD IS NULL) or (CODCIUD >= :GRPINI AND CODCIUD <= :GRPFIN)) then
                OK = 'S';
            END
        ELSE
            if (CODCIUD >= :GRPINI AND CODCIUD <= :GRPFIN) then
                OK = 'S';
        END
    if (AGRUPA = 'N') then
        OK = 'S';
    if (OK = 'S') then
        BEGIN
        DISPONIBLE = CUPO;
        CORRIENTE = 0;
        CERO = 0;
        TREINTA = 0;
        SESENTA = 0;
        NOVENTA = 0;
        CIENTOCHENTA = 0;
        DOSSETENTA = 0;
        TRESSESENTA = 0;
        /* BUSQUE EN SALDOS_DOC_CARTERA LOS QUE TENGAN SALDO > 0 */
        FOR SELECT MVCL_TIPOREF, MVCL_IDREF, MVCL_PREFREF, MVCL_NUMREF, MVCL_FECHA, MVCL_VENCE
            FROM MOVIMIENTO_CLIENTES
            WHERE TERC_NIT = :NIT AND MVCL_SUCURSAL = :SUCURSAL AND MVCL_FECHA <= :FECHA
                AND MVCL_ABONO = 'N' AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA))
            INTO :TIPO, :ID, :PREFIJO, :NUMERO, :FECDOC, :VENCE
            DO
            BEGIN
            if ((inclanti = 'SI') or (TIPO <> 45)) then
                BEGIN
                EXECUTE PROCEDURE saldo_doc_cartera(TIPO, ID, FECHA) returning_values (SALDO);
                if (SALDO <> 0) then
                    BEGIN
                    DISPONIBLE = DISPONIBLE - SALDO;
                    SELECT TIDO_NOMCORTO FROM TIPO_DOCUMENTO WHERE TIDO_COD = :TIPO INTO :TIPONOM;

                    SELECT SUM(SDCA_RTFTE - SDCA_ABRTFTE), SUM(SDCA_RTIVA - SDCA_ABRTIVA), SUM(SDCA_RTICA - SDCA_ABRTICA)
                        FROM SALDOS_DOC_CARTERA WHERE SDCA_TIPOREF = :TIPO AND SDCA_IDREF = :ID
                        INTO :RTFTE, :RTIVA, :RTICA;
                    if (RTFTE IS NULL) then
                        RTFTE = 0;
                    if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) THEN
                        BEGIN
                        if (RTFTE > 0) then
                            RTFTE = 0;
                        END
                    ELSE
                        BEGIN
                        if (RTFTE < 0) then
                            RTFTE = 0;
                        END
                    if (FAUTORET <= FECDOC) then
                        RTFTE = 0;
                    if (RTIVA IS NULL) then
                        RTIVA = 0;
                    if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) THEN
                        BEGIN
                        if (RTIVA > 0) then
                            RTIVA = 0;
                        END
                    ELSE
                        BEGIN
                        if (RTIVA < 0) then
                            RTIVA = 0;
                        END
                    if (RTICA IS NULL) then
                        RTICA = 0;
                    if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) THEN
                        BEGIN
                        if (RTICA > 0) then
                            RTICA = 0;
                        END
                    ELSE
                        BEGIN
                        if (RTICA < 0) then
                            RTICA = 0;
                        END
                    /* AHORA CLASIFIQUE LOS DIAS */
                    if (VENCIMIENTO = 'FECHA') then
                        DIAS = FECHA - FECDOC;
                    ELSE
                        DIAS = FECHA - VENCE;
                    if (MAXDIAS < DIAS) then
                        MAXDIAS = DIAS;
                    if (DETALLE = 'S') then
                        BEGIN
                        CORRIENTE = 0;
                        CERO = 0;
                        TREINTA = 0;
                        SESENTA = 0;
                        NOVENTA = 0;
                        CIENTOCHENTA = 0;
                        DOSSETENTA = 0;
                        tressesenta = 0;
                        END
                    if (DIAS < 0) then
                        CORRIENTE = CORRIENTE + SALDO;
                    ELSE
                        if (DIAS < DIASR) then
                            CERO = CERO + SALDO;
                        ELSE
                            if (DIAS < (DIASR * 2)) then
                                TREINTA = TREINTA + SALDO;
                            ELSE
                                if (DIAS < (DIASR * 3)) then
                                    SESENTA = SESENTA + SALDO;
                                ELSE
                                    BEGIN
                                    if (EXTENDIDA = 'N') then
                                        NOVENTA = NOVENTA + SALDO;
                                    else    
                                        BEGIN
                                        if (DIAS < (DIASR * 3) * 2) then
                                            NOVENTA = NOVENTA + SALDO;
                                        ELSE
                                            if (DIAS < (DIASR * 3) * 3) then
                                                CIENTOCHENTA = CIENTOCHENTA + SALDO;
                                            ELSE
                                                if (DIAS < (DIASR * 3) * 4) then
                                                    dossetenta = dossetenta + SALDO;
                                            ELSE
                                                tressesenta = tressesenta + SALDO;
                                        END
                                    END
                    if (DETALLE = 'S') then
                        SUSPEND;
                    END /* SALDO */
                END /* NO ANTICIPO */
            END /* FOR MOV_CLI */
        /* AGREGUE LOS RECIBOS PROVISIONALES CON SIGNO NEGATIVO */
        FOR SELECT 65, MAX(P.RCPR_ID), MAX(PREF_PRE), MAX(RCPR_NUMERO), MAX(RCPR_FECHA), SUM(RPDE_ABONO * -1), SUM(RPDE_RTFTE*-1), SUM(RPDE_RTIVA*-1), SUM(RPDE_RTICA*-1)
            FROM RECIBO_PROVISIONAL P, recibo_provisional_detalle D
            WHERE P.rcpr_id = D.rcpr_id AND P.TERC_NIT = :NIT AND D.RPDE_SUCURSAL = :SUCURSAL AND P.RCPR_FECHA <= :FECHA AND P.RCPR_ANULADO = 'N' AND
            ((RCPR_FECCRUCE IS NULL) or (RCPR_FECCRUCE > :FECHA)) AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA))
            GROUP BY P.rcpr_id
            INTO :TIPO, :ID, :PREFIJO, :NUMERO, :FECDOC, :PROVISIONAL, :rtfte,  :RTIVA, :RTICA
            DO
            BEGIN
            if (:descnt_prov = 'NO') then
              SALDO = 0;
            else
              SALDO = :PROVISIONAL;
            SELECT TIDO_NOMCORTO FROM TIPO_DOCUMENTO WHERE TIDO_COD = :TIPO INTO :TIPONOM;
            /* CALCULE EL VENCIMIENTO DEL ULTIMO DOCUMENTO POSFECHADO */
            SELECT MAX(RPPA_FECHA) FROM recibo_provisional_pago WHERE RCPR_ID = :ID INTO :VENCE;
            DIAS = VENCE - FECHA;
            if (DETALLE = 'S') then
                BEGIN
                CORRIENTE = 0;
                CERO = 0;
                TREINTA = 0;
                SESENTA = 0;
                NOVENTA = 0;
                CIENTOCHENTA = 0;
                DOSSETENTA = 0;
                tressesenta = 0;
                END
            if (DIAS < 0) then
                CORRIENTE = CORRIENTE + SALDO;
            ELSE
                if (DIAS < DIASR) then
                    CERO = CERO + SALDO;
                ELSE
                    if (DIAS < (DIASR * 2)) then
                        TREINTA = TREINTA + SALDO;
                    ELSE
                        if (DIAS < (DIASR * 3)) then
                            SESENTA = SESENTA + SALDO;
                        ELSE
                            BEGIN
                            if (EXTENDIDA = 'N') then
                                NOVENTA = NOVENTA + SALDO;
                            else
                                BEGIN
                                if (DIAS < (DIASR * 3) * 2) then
                                    CIENTOCHENTA = CIENTOCHENTA + SALDO;
                                ELSE
                                    if (DIAS < (DIASR * 3) * 3) then
                                        DOSSETENTA = DOSSETENTA + SALDO;
                                    ELSE
                                        TRESSESENTA = TRESSESENTA + SALDO;
                                END
                            END
            if (DETALLE = 'S') then
                SUSPEND;
            END
        if (DETALLE = 'N') then
            begin
            SALDO = CORRIENTE + CERO + TREINTA + SESENTA + NOVENTA;
            DIAS = MAXDIAS;
            SUSPEND;
            end
        END
    if (AGRUPA = 'C') then
        BEGIN
        FOR SELECT DISTINCT COBR_COD FROM MOVIMIENTO_CLIENTES
            WHERE TERC_NIT = :NIT AND MVCL_SUCURSAL = :SUCURSAL AND MVCL_FECHA <= :FECHA
                AND MVCL_ABONO = 'N' AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA))
            INTO :codcobr
            DO
            BEGIN
            OK = 'N';
            if (GRPINI = '') then
                BEGIN
                if ((CODCOBR IS NULL) or (CODCOBR >= :GRPINI AND CODCOBR <= :GRPFIN)) then
                    OK = 'S';
                END
            ELSE
                if (CODCOBR >= :GRPINI AND CODCOBR <= :GRPFIN) then
                    OK = 'S';
            if (OK = 'S') then
                BEGIN
                DISPONIBLE = CUPO;
                CORRIENTE = 0;
                CERO = 0;
                TREINTA = 0;
                SESENTA = 0;
                NOVENTA = 0;
                CIENTOCHENTA = 0;
                DOSSETENTA = 0;
                tressesenta = 0;
                SELECT COBR_NOM FROM COBRADORES WHERE COBR_COD = :codcobr INTO :nomcobr;
                /* BUSQUE EN SALDOS_DOC_CARTERA LOS QUE TENGAN SALDO > 0 */
                FOR SELECT MVCL_TIPOREF, MVCL_IDREF, MVCL_PREFREF, MVCL_NUMREF, MVCL_FECHA, MVCL_VENCE
                    FROM MOVIMIENTO_CLIENTES
                    WHERE TERC_NIT = :NIT AND COBR_COD = :CODCOBR AND MVCL_SUCURSAL = :SUCURSAL AND MVCL_FECHA <= :FECHA
                        AND MVCL_ABONO = 'N' AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA))
                    INTO :TIPO, :ID, :PREFIJO, :NUMERO, :FECDOC, :VENCE
                    DO
                    BEGIN
                    if ((inclanti = 'SI') or (TIPO <> 45)) then
                        BEGIN
                        EXECUTE PROCEDURE saldo_doc_cartera(TIPO, ID, FECHA) returning_values (SALDO);
                        if (SALDO <> 0) then
                            BEGIN
                            DISPONIBLE = DISPONIBLE - SALDO;
                            SELECT TIDO_NOMCORTO FROM TIPO_DOCUMENTO WHERE TIDO_COD = :TIPO INTO :TIPONOM;
                            SELECT SUM(SDCA_RTFTE - SDCA_ABRTFTE), SUM(SDCA_RTIVA - SDCA_ABRTIVA), SUM(SDCA_RTICA - SDCA_ABRTICA)
                                FROM SALDOS_DOC_CARTERA WHERE SDCA_TIPOREF = :TIPO AND SDCA_IDREF = :ID
                                INTO :RTFTE, :RTIVA, :RTICA;
                            if (RTFTE IS NULL) then
                                RTFTE = 0;
                            if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) THEN
                                BEGIN
                                if (RTFTE > 0) then
                                    RTFTE = 0;
                                END
                            ELSE
                                BEGIN
                                if (RTFTE < 0) then
                                    RTFTE = 0;
                                END
                            if (FAUTORET <= FECDOC) then
                                RTFTE = 0;
                            if (RTIVA IS NULL) then
                                RTIVA = 0;
                            if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) THEN
                                BEGIN
                                if (RTIVA > 0) then
                                    RTIVA = 0;
                                END
                            ELSE
                                BEGIN
                                if (RTIVA < 0) then
                                    RTIVA = 0;
                                END
                            if (RTICA IS NULL) then
                                RTICA = 0;
                            if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) THEN
                                BEGIN
                                if (RTICA > 0) then
                                    RTICA = 0;
                                END
                            ELSE
                                BEGIN
                                if (RTICA < 0) then
                                    RTICA = 0;
                                END
                            /* AHORA CLASIFIQUE LOS DIAS */
                            if (VENCIMIENTO = 'FECHA') then
                                DIAS = FECHA - FECDOC;
                            ELSE
                                DIAS = FECHA - VENCE;
                            if (MAXDIAS < DIAS) then
                                MAXDIAS = DIAS;
                            if (DETALLE = 'S') then
                                BEGIN
                                CORRIENTE = 0;
                                CERO = 0;
                                TREINTA = 0;
                                SESENTA = 0;
                                NOVENTA = 0;
                                CIENTOCHENTA = 0;
                                DOSSETENTA = 0;
                                tressesenta = 0;
                                END
                            if (DIAS < 0) then
                                CORRIENTE = CORRIENTE + SALDO;
                            ELSE
                                if (DIAS < DIASR) then
                                    CERO = CERO + SALDO;
                                ELSE
                                    if (DIAS < (DIASR * 2)) then
                                        TREINTA = TREINTA + SALDO;
                                    ELSE
                                        if (DIAS < (DIASR * 3)) then
                                            SESENTA = SESENTA + SALDO;
                                        ELSE
                                            BEGIN
                                            if (EXTENDIDA = 'N') then
                                                NOVENTA = NOVENTA + SALDO;
                                            else    
                                                BEGIN
                                                if (DIAS < (DIASR * 3) * 2) then
                                                    CIENTOCHENTA = CIENTOCHENTA + SALDO;
                                                ELSE
                                                    if (DIAS < (DIASR * 3) * 3) then
                                                        DOSSETENTA = DOSSETENTA + SALDO;
                                                    ELSE
                                                        TRESSESENTA = TRESSESENTA + SALDO;
                                                END
                                            END
                            if (DETALLE = 'S') then
                                SUSPEND;
                            END /* SALDO <>  0 */
                        END /* NO ANTICIPO */
                    END /* FOR MOV_CLI */
                /* AGREGUE LOS RECIBOS PROVISIONALES CON SIGNO NEGATIVO */
                FOR SELECT 65, MAX(P.RCPR_ID), MAX(PREF_PRE), MAX(RCPR_NUMERO), MAX(RCPR_FECHA), SUM(RPDE_ABONO * -1), SUM(RPDE_RTFTE*-1), SUM(RPDE_RTIVA*-1), SUM(RPDE_RTICA*-1)
                    FROM RECIBO_PROVISIONAL P, recibo_provisional_detalle D
                    WHERE P.rcpr_id = D.rcpr_id AND P.TERC_NIT = :NIT AND RPDE_SUCURSAL = :SUCURSAL AND P.VEND_COD = :CODCOBR AND P.RCPR_FECHA <= :FECHA AND P.RCPR_ANULADO = 'N' AND
                    ((RCPR_FECCRUCE IS NULL) or (RCPR_FECCRUCE > :FECHA)) AND ((SUCU_ID = :SUBEMPRESA) OR (:SUBEMPRESA = 0))
                    GROUP BY P.rcpr_id
                    INTO :TIPO, :ID, :PREFIJO, :NUMERO, :FECDOC, :PROVISIONAL, :rtfte,  :RTIVA, :RTICA
                    DO
                    BEGIN
                    if (:descnt_prov = 'NO') then
                      SALDO = 0;
                    else
                      SALDO = :PROVISIONAL;
                    SELECT TIDO_NOMCORTO FROM TIPO_DOCUMENTO WHERE TIDO_COD = :TIPO INTO :TIPONOM;
                    /* CALCULE EL VENCIMIENTO DEL ULTIMO DOCUMENTO POSFECHADO */
                    SELECT MAX(RPPA_FECHA) FROM recibo_provisional_pago WHERE RCPR_ID = :ID INTO :VENCE;
                    DIAS = VENCE - FECHA;
                    if (DETALLE = 'S') then
                        BEGIN
                        CORRIENTE = 0;
                        CERO = 0;
                        TREINTA = 0;
                        SESENTA = 0;
                        NOVENTA = 0;
                        CIENTOCHENTA = 0;
                        DOSSETENTA = 0;
                        tressesenta = 0;
                        END
                    if (DIAS < 0) then
                        CORRIENTE = CORRIENTE + SALDO;
                    ELSE
                        if (DIAS < DIASR) then
                            CERO = CERO + SALDO;
                        ELSE
                            if (DIAS < (DIASR * 2)) then
                                TREINTA = TREINTA + SALDO;
                            ELSE
                                if (DIAS < (DIASR * 3)) then
                                    SESENTA = SESENTA + SALDO;
                                ELSE
                                    BEGIN
                                    if (EXTENDIDA = 'N') then
                                        NOVENTA = NOVENTA + SALDO;
                                    else    
                                        BEGIN
                                        if (DIAS < (DIASR * 3) * 2) then
                                            CIENTOCHENTA = CIENTOCHENTA + SALDO;
                                        ELSE
                                            if (DIAS < (DIASR * 3) * 3) then
                                                DOSSETENTA = DOSSETENTA + SALDO;
                                            ELSE
                                                TRESSESENTA = TRESSESENTA + SALDO;
                                        END
                                    END
                    if (DETALLE = 'S') then
                        SUSPEND;
                    END
                if (DETALLE = 'N') then
                    begin
                    SALDO = CORRIENTE + CERO + TREINTA + SESENTA + NOVENTA;
                    DIAS = MAXDIAS;
                    SUSPEND;
                    end
                END
            END /* FOR COBRADOR */
        END
    END /* FOR NIT */
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER PROCEDURE REP_CARTERA_CONSOLIDADA(
    DESDE VARCHAR(20),
    HASTA VARCHAR(20),
    GRPINI VARCHAR(5),
    GRPFIN VARCHAR(5),
    FECHA DATE,
    ORDEN CHAR(1),
    AGRUPA CHAR(1),
    SUBEMPRESA INTEGER,
    GRUPCART INTEGER)
RETURNS (
    NIT VARCHAR(20),
    NOMBRE VARCHAR(60),
    TELEFONO VARCHAR(40),
    CIUDAD VARCHAR(40),
    EMAIL VARCHAR(100),
    FAX VARCHAR(25),
    CEL VARCHAR(25),
    CODCLI VARCHAR(20),
    CODZONA VARCHAR(2),
    NOMZONA VARCHAR(60),
    CODCOBR INTEGER,
    NOMCOBR VARCHAR(60),
    SUCURSAL VARCHAR(10),
    DV CHAR(1),
    CODCIUD CHAR(5),
    NOMCIUD VARCHAR(60),
    SALDO NUMERIC(18,2),
    RTFTE NUMERIC(18,2),
    RTIVA NUMERIC(18,2),
    RTICA NUMERIC(18,2),
    DTOF NUMERIC(18,2),
    CUPO NUMERIC(18,2),
    DISPONIBLE NUMERIC(18,2),
    PROVISIONAL NUMERIC(18,2),
    CONTACTO VARCHAR(60),
    ESTADO CHAR(1),
    GRUPCOD INTEGER,
    GRUPNOM VARCHAR(30))
AS
declare variable NITINI VARCHAR(20);
declare variable NITFIN VARCHAR(20);
declare variable NOMINI VARCHAR(20);
declare variable NOMFIN VARCHAR(20);
declare variable OK CHAR(1);
declare variable PSALDO NUMERIC(18,2);
declare variable PRTFTE NUMERIC(18,2);
declare variable PRTIVA NUMERIC(18,2);
declare variable PRTICA NUMERIC(18,2);
declare variable PDTOF NUMERIC(18,2);
declare variable TIPO INTEGER;
declare variable ID INTEGER;
declare variable DTOAPL NUMERIC(18,2);
declare variable FECDTO DATE;
declare variable descnt_prov char(2);
declare variable AUTORET VARCHAR(10);
declare variable FAUTORET DATE;
declare variable FECDOC DATE;
declare variable INCLANTI CHAR(2);
BEGIN
if (ORDEN = 'C') then
    BEGIN
    NITINI = DESDE;
    NITFIN = HASTA;
    NOMINI = '';
    NOMFIN = 'zz';
    END
ELSE
    BEGIN
    NOMINI = DESDE;
    NOMFIN = HASTA;
    NITINI = '';
    NITFIN = 'zz';
    END
  EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'DESCONTAR RECIBOS PROVISIONALES EN INFORMES DE CARTERA') RETURNING_VALUES (:descnt_prov);
  EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'INCLUIR ANTICIPOS DE CLIENTES EN REPORTES Y CONSULTAS DE CARTERA') returning_values (INCLANTI);
  EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'FECHA AUTORETENEDOR NO DESCONTAR RETENCIONES DEL SALDO PERO SI CONTABILIZARLAS') returning_values (AUTORET);
  if (AUTORET <> '') then
    FAUTORET = CAST(AUTORET AS DATE);
  else
    FAUTORET = '9999/12/31';
  /* Ubique el NIT */
  FOR select C.TERC_NIT, CLSU_NOMBRE, TERC_DV, CLSU_TEL, CLSU_CIUDAD, TERC_CONTACTO, S.COBR_COD, S.ZONA_COD, T.CIUD_COD, CLIE_CUPO, CLIE_ESTADO, CLCU_COD, C.GRCA_COD, TERC_EMAIL, TERC_FAX, TERC_CEL, CLIE_COD
    from terceros T, CLIENTES C, CLIENTE_SUCURSALES S
    where C.TERC_NIT = T.TERC_NIT AND TERC_CLIE = 'S' AND S.TERC_NIT = C.TERC_NIT AND C.TERC_NIT >= :NITINI AND C.TERC_NIT <= :NITFIN AND
        TERC_NOM >= :NOMINI AND TERC_NOM <= :NOMFIN AND ((:GRUPCART = 0) or (C.GRCA_COD = :GRUPCART))
    INTO :NIT, :NOMBRE, :DV, :TELEFONO, :CIUDAD, :CONTACTO, :CODCOBR, :CODZONA, :CODCIUD, :CUPO, :ESTADO, :SUCURSAL, :GRUPCOD, :EMAIL, :FAX, :CEL, :CODCLI
    DO  
    BEGIN
    SELECT GRCA_NOMBRE FROM GRUPO_CARTERA WHERE GRCA_COD = :GRUPCOD INTO :GRUPNOM;
    OK = 'N';
    if (AGRUPA = 'Z') then
        BEGIN
        if (GRPINI = '') then
            BEGIN
            if ((CODZONA IS NULL) or (CODZONA >= :GRPINI AND CODZONA <= :GRPFIN)) then
                OK = 'S';
            END
        ELSE
            if (CODZONA >= :GRPINI AND CODZONA <= :GRPFIN) then
                OK = 'S';
        END
    if (AGRUPA = 'I') then
        BEGIN
        if (GRPINI = '') then
            BEGIN
            if ((CODCIUD IS NULL) or (CODCIUD >= :GRPINI AND CODCIUD <= :GRPFIN)) then
                OK = 'S';
            END
        ELSE
            if (CODCIUD >= :GRPINI AND CODCIUD <= :GRPFIN) then
                OK = 'S';
        END
    if (AGRUPA = 'N') then
        OK = 'S';
        
    if (OK = 'S') then
        BEGIN
        if (CODCOBR IS NOT NULL) then
            SELECT COBR_NOM FROM COBRADORES  WHERE COBR_COD = :CODCOBR INTO :NOMCOBR;
        if (CODZONA IS NOT NULL) then
            SELECT ZONA_NOM FROM ZONAS WHERE ZONA_COD = :CODZONA INTO :NOMZONA;
        if (CODCIUD IS NOT NULL) then
            SELECT CIUD_NOM FROM CIUDADES  WHERE CIUD_COD = :CODCIUD INTO :NOMCIUD;
    
        SALDO = 0;
        RTFTE = 0;
        RTIVA = 0;
        RTICA = 0;
        DTOF = 0;
        /* BUSQUE EN SALDOS_DOC_CARTERA LOS QUE TENGAN SALDO > 0 */
        FOR SELECT MVCL_TIPOREF, MVCL_IDREF, MVCL_FECHA
          FROM MOVIMIENTO_CLIENTES WHERE TERC_NIT = :NIT AND MVCL_SUCURSAL = :SUCURSAL AND MVCL_FECHA <= :FECHA AND
          MVCL_ABONO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
          INTO :TIPO, :ID, :FECDOC
          DO
            BEGIN
            if ((inclanti = 'SI') or (TIPO <> 45)) then
                BEGIN
                EXECUTE PROCEDURE saldo_doc_cartera(TIPO, ID, FECHA) returning_values (PSALDO);
                if (PSALDO <> 0) then
                    BEGIN
                    if (TIPO = 41) then
                        SELECT NDCL_DTOFMONTO, NDCL_FECHADTO FROM NOTAS_DEBITO_CLIENTES WHERE NDCL_ID = :ID INTO :PDTOF, :FECDTO;
                    if (TIPO = 42) then
                        SELECT 0, NCCL_FECHA FROM NOTAS_CREDITO_CLIENTES WHERE NCCL_ID = :ID INTO :PDTOF, :FECDTO;
                    if (TIPO = 45) then
                        SELECT ANCL_DTOFMONTO, ANCL_DTOFECHA FROM ANTICIPOS_CLIENTE WHERE ANCL_ID = :ID INTO :PDTOF, :FECDTO;
                    if (TIPO = 31) then
                        SELECT FACT_DTOFMONTO, FACT_DTOFFECHA FROM FACTURAS WHERE FACT_ID = :ID INTO :PDTOF, :FECDTO;
                    if (TIPO = 33) then
                        SELECT 0, DEVT_FECHA FROM devoluciones_ventas WHERE DEVT_ID = :ID INTO :PDTOF, :FECDTO;
                    if (PDTOF IS NULL) then
                        PDTOF = 0;
                    if (PDTOF <> 0) then
                        BEGIN
                        SELECT SUM(RCDE_DTOF) FROM RECIBOS_CAJA_DETALLE WHERE RCDE_IDDOC = :ID AND RCDE_TIPODOC = :TIPO INTO :DTOAPL;
                        if (DTOAPL IS NULL) then
                            DTOAPL = 0;
                        PDTOF = PDTOF - DTOAPL;
                        /* SI YA SE VENCIO DEJELO EN CERO */
                        if (FECDTO < FECHA) then
                            PDTOF = 0;
                        END
                    SELECT SUM(SDCA_RTFTE - SDCA_ABRTFTE), SUM(SDCA_RTIVA - SDCA_ABRTIVA), SUM(SDCA_RTICA - SDCA_ABRTICA)
                        FROM SALDOS_DOC_CARTERA WHERE SDCA_TIPOREF = :TIPO AND SDCA_IDREF = :ID
                        INTO :PRTFTE, :PRTIVA, :PRTICA;
                    if (PRTFTE IS NULL) then
                        PRTFTE = 0;
                    if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) THEN
                        BEGIN
                        if (PRTFTE > 0) then
                            PRTFTE = 0;
                        END
                    ELSE    
                        BEGIN
                        if (PRTFTE < 0) then
                            PRTFTE = 0;
                        END
                    if (PRTIVA IS NULL) then
                        PRTIVA = 0;
                    if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) THEN
                        BEGIN
                        if (PRTIVA > 0) then
                            PRTIVA = 0;
                        END
                    ELSE
                        BEGIN
                        if (PRTIVA < 0) then
                            PRTIVA = 0;
                        END
                    if (PRTICA IS NULL) then
                        PRTICA = 0;
                    if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) THEN
                        BEGIN
                        if (PRTICA > 0) then
                            PRTICA = 0;
                        END
                    ELSE
                        BEGIN
                        if (PRTICA < 0) then
                            PRTICA = 0;
                        END

                    if (FAUTORET <= FECDOC) then
                        PRTFTE = 0;

                    SALDO = SALDO + PSALDO;
                    RTFTE = RTFTE + PRTFTE;
                    RTIVA = RTIVA + PRTIVA;
                    RTICA = RTICA + PRTICA;
                    DTOF = DTOF + PDTOF;
                    END /* SALDO <> 0 */
                END /* NO ANTICIPO */
            END
        DISPONIBLE = CUPO - SALDO;
        /* LOS RECIBOS PROVISIONALES */
        SELECT SUM(RPDE_ABONO) FROM recibo_provisional P, recibo_provisional_detalle D
            WHERE P.rcpr_id = D.rcpr_id AND TERC_NIT = :NIT AND RPDE_SUCURSAL = :SUCURSAL AND
            RCPR_FECHA <= :FECHA AND RCPR_ANULADO = 'N' AND ((RCPR_FECCRUCE IS NULL) or (RCPR_FECCRUCE > :FECHA)) AND
            ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            INTO :provisional;
           if (:descnt_prov = 'SI') then
             if (NOT :provisional is NULL) then
              SALDO = :saldo - :PROVISIONAL;
        SUSPEND;
        END
    if (AGRUPA = 'C') then
        BEGIN
        if (CODZONA IS NOT NULL) then
            SELECT ZONA_NOM FROM ZONAS WHERE ZONA_COD = :CODZONA INTO :NOMZONA;
        if (CODCIUD IS NOT NULL) then
            SELECT CIUD_NOM FROM CIUDADES  WHERE CIUD_COD = :CODCIUD INTO :NOMCIUD;
        FOR SELECT DISTINCT COBR_COD FROM MOVIMIENTO_CLIENTES WHERE TERC_NIT = :NIT AND
            MVCL_SUCURSAL = :SUCURSAL AND MVCL_FECHA <= :FECHA AND
            MVCL_ABONO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            INTO :codcobr
            DO
            begin
            OK = 'N';
            if (GRPINI = '') then
                BEGIN
                if ((CODCOBR IS NULL) or (CODCOBR >= :GRPINI AND CODCOBR <= :GRPFIN)) then
                    OK = 'S';
                END
            ELSE
                if (CODCOBR >= :GRPINI AND CODCOBR <= :GRPFIN) then
                    OK = 'S';
            if (OK = 'S') then
                BEGIN
                SELECT COBR_NOM FROM COBRADORES  WHERE COBR_COD = :CODCOBR INTO :NOMCOBR;

                SALDO = 0;
                RTFTE = 0;
                RTIVA = 0;
                RTICA = 0;
                DTOF = 0;
                /* BUSQUE EN SALDOS_DOC_CARTERA LOS QUE TENGAN SALDO > 0 */
                FOR SELECT MVCL_TIPOREF, MVCL_IDREF, MVCL_FECHA
                  FROM MOVIMIENTO_CLIENTES WHERE TERC_NIT = :NIT AND MVCL_SUCURSAL = :SUCURSAL AND
                  MVCL_FECHA <= :FECHA AND COBR_COD = :codcobr AND MVCL_ABONO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                  INTO :TIPO, :ID, :FECDOC
                  DO
                    BEGIN
                    if ((inclanti = 'SI') or (TIPO <> 45)) then
                        BEGIN
                        EXECUTE PROCEDURE saldo_doc_cartera(TIPO, ID, FECHA) returning_values (PSALDO);
                        if (PSALDO <> 0) then
                            BEGIN
                            if (TIPO = 41) then
                                SELECT NDCL_DTOFMONTO, NDCL_FECHADTO FROM NOTAS_DEBITO_CLIENTES WHERE NDCL_ID = :ID INTO :PDTOF, :FECDTO;
                            if (TIPO = 42) then
                                SELECT 0, NCCL_FECHA FROM NOTAS_CREDITO_CLIENTES WHERE NCCL_ID = :ID INTO :PDTOF, :FECDTO;
                            if (TIPO = 45) then
                                SELECT ANCL_DTOFMONTO, ANCL_DTOFECHA FROM ANTICIPOS_CLIENTE WHERE ANCL_ID = :ID INTO :PDTOF, :FECDTO;
                            if (TIPO = 31) then
                                SELECT FACT_DTOFMONTO, FACT_DTOFFECHA FROM FACTURAS WHERE FACT_ID = :ID INTO :PDTOF, :FECDTO;
                            if (TIPO = 33) then
                                SELECT 0, DEVT_FECHA FROM devoluciones_ventas WHERE DEVT_ID = :ID INTO :PDTOF, :FECDTO;
                            if (PDTOF IS NULL) then
                                PDTOF = 0;
                            if (PDTOF <> 0) then
                                BEGIN
                                SELECT SUM(RCDE_DTOF) FROM RECIBOS_CAJA_DETALLE WHERE RCDE_IDDOC = :ID AND RCDE_TIPODOC = :TIPO INTO :DTOAPL;
                                if (DTOAPL IS NULL) then
                                    DTOAPL = 0;
                                PDTOF = PDTOF - DTOAPL;
                                /* SI YA SE VENCIO DEJELO EN CERO */
                                if (FECDTO < FECHA) then
                                    PDTOF = 0;
                                END
                            SELECT SUM(SDCA_RTFTE - SDCA_ABRTFTE), SUM(SDCA_RTIVA - SDCA_ABRTIVA), SUM(SDCA_RTICA - SDCA_ABRTICA)
                                FROM SALDOS_DOC_CARTERA WHERE SDCA_TIPOREF = :TIPO AND SDCA_IDREF = :ID
                                INTO :PRTFTE, :PRTIVA, :PRTICA;
                            if (PRTFTE IS NULL) then
                                PRTFTE = 0;
                            if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) THEN
                                BEGIN
                                if (PRTFTE > 0) then
                                    PRTFTE = 0;
                                END
                            ELSE
                                BEGIN
                                if (PRTFTE < 0) then
                                    PRTFTE = 0;
                                END
                            if (PRTIVA IS NULL) then
                                PRTIVA = 0;
                            if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) THEN
                                BEGIN
                                if (PRTIVA > 0) then
                                    PRTIVA = 0;
                                END
                            ELSE
                                BEGIN
                                if (PRTIVA < 0) then
                                    PRTIVA = 0;
                                END
                            if (PRTICA IS NULL) then
                                PRTICA = 0;
                            if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) THEN
                                BEGIN
                                if (PRTICA > 0) then
                                    PRTICA = 0;
                                END
                            ELSE
                                BEGIN
                                if (PRTICA < 0) then
                                    PRTICA = 0;
                                END
                            if (FAUTORET <= FECDOC) then
                                PRTFTE = 0;
                            SALDO = SALDO + PSALDO;
                            RTFTE = RTFTE + PRTFTE;
                            RTIVA = RTIVA + PRTIVA;
                            RTICA = RTICA + PRTICA;
                            DTOF = DTOF + PDTOF;
                            END  /* SALDO <> 0 */
                        END /* NO ANTICIPO */
                    END
                DISPONIBLE = CUPO - SALDO;
                /* LOS RECIBOS PROVISIONALES */
                SELECT SUM(RPDE_ABONO) FROM RECIBO_PROVISIONAL P, recibo_provisional_detalle D
                    WHERE P.rcpr_id = D.rcpr_id AND TERC_NIT = :NIT AND RPDE_SUCURSAL = :SUCURSAL AND
                    VEND_COD = :CODCOBR AND RCPR_FECHA <= :FECHA AND RCPR_ANULADO = 'N' AND ((RCPR_FECCRUCE IS NULL) or (RCPR_FECCRUCE > :FECHA)) AND 
                    ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                    INTO :provisional;
                  if (:descnt_prov = 'SI') then
                   if (NOT :provisional IS NULL) then
                    SALDO = :saldo - :PROVISIONAL;
                if (AUTORET = 'SI') then
                    BEGIN
                    RTFTE = 0;
                    RTIVA = 0;
                    RTICA = 0;
                    END
                SUSPEND;
                END /* OK = S */
            END /* FOR COBRADOR */
        END /* AGRUPA = C */
    END /* FOR NIT */
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER PROCEDURE REP_CARTERA_NOTAS(
    DESDE VARCHAR(20),
    HASTA VARCHAR(20),
    GRPINI VARCHAR(5),
    GRPFIN VARCHAR(5),
    FECHA DATE,
    ORDEN CHAR(1),
    AGRUPA CHAR(1),
    SUBEMPRESA INTEGER,
    VENCEINI DATE,
    VENCEFIN DATE,
    GRUPCART INTEGER)
RETURNS (
    NIT VARCHAR(20),
    NOMBRE VARCHAR(60),
    TELEFONO VARCHAR(40),
    CIUDAD VARCHAR(40),
    CODZONA VARCHAR(2),
    NOMZONA VARCHAR(60),
    CODCOBR INTEGER,
    NOMCOBR VARCHAR(60),
    SUCURSAL VARCHAR(10),
    DV CHAR(1),
    CODCIUD CHAR(5),
    NOMCIUD VARCHAR(60),
    SALDO NUMERIC(18,2),
    NOTA1 VARCHAR(256),
    NOTA2 VARCHAR(256),
    CUPO NUMERIC(18,2),
    DISPONIBLE NUMERIC(18,2),
    PROVISIONAL NUMERIC(18,2),
    CONTACTO VARCHAR(60),
    ESTADO CHAR(1),
    GRUPCOD INTEGER,
    GRUPNOM VARCHAR(30))
AS
declare variable NITINI VARCHAR(20);
declare variable NITFIN VARCHAR(20);
declare variable NOMINI VARCHAR(20);
declare variable NOMFIN VARCHAR(20);
declare variable OK CHAR(1);
declare variable PSALDO NUMERIC(18,2);
declare variable TIPO INTEGER;
declare variable ID INTEGER;
declare variable NOTA VARCHAR(277);
declare variable TIPODOC VARCHAR(8);
declare variable NUMDOC VARCHAR(10);
declare variable FECNOTA VARCHAR(10);
declare variable I INTEGER;
declare variable INCLANTI CHAR(2);
BEGIN
if (ORDEN = 'C') then
    BEGIN
    NITINI = DESDE;
    NITFIN = HASTA;
    NOMINI = '';
    NOMFIN = 'zz';
    END
ELSE
    BEGIN
    NOMINI = DESDE;
    NOMFIN = HASTA;
    NITINI = '';
    NITFIN = 'zz';
    END
  EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'INCLUIR ANTICIPOS DE CLIENTES EN REPORTES Y CONSULTAS DE CARTERA') returning_values (INCLANTI);
  /* Ubique el NIT */
  FOR select T.TERC_NIT, CLSU_NOMBRE, TERC_DV, CLSU_TEL, CLSU_CIUDAD, TERC_CONTACTO, S.COBR_COD, S.ZONA_COD, CIUD_COD, CLIE_CUPO, CLIE_ESTADO, CLCU_COD, C.GRCA_COD
    from terceros T, CLIENTES C, CLIENTE_SUCURSALES S
    where C.TERC_NIT = T.TERC_NIT AND TERC_CLIE = 'S' AND S.TERC_NIT = C.TERC_NIT AND T.TERC_NIT >= :NITINI AND T.TERC_NIT <= :NITFIN AND
        TERC_NOM >= :NOMINI AND TERC_NOM <= :NOMFIN AND ((:GRUPCART = 0) or (C.GRCA_COD = :GRUPCART))
    INTO :NIT, :NOMBRE, :DV, :TELEFONO, :CIUDAD, :CONTACTO, :CODCOBR, :CODZONA, :CODCIUD, :CUPO, :ESTADO, :SUCURSAL, :GRUPCOD
    DO  
    BEGIN
    SELECT GRCA_NOMBRE FROM GRUPO_CARTERA WHERE GRCA_COD = :GRUPCOD INTO :GRUPNOM;
    OK = 'N';
    if (AGRUPA = 'Z') then
        BEGIN
        if (GRPINI = '') then
            BEGIN
            if ((CODZONA IS NULL) or (CODZONA >= :GRPINI AND CODZONA <= :GRPFIN)) then
                OK = 'S';
            END
        ELSE
            if (CODZONA >= :GRPINI AND CODZONA <= :GRPFIN) then
                OK = 'S';
        END
    if (AGRUPA = 'I') then
        BEGIN
        if (GRPINI = '') then
            BEGIN
            if ((CODCIUD IS NULL) or (CODCIUD >= :GRPINI AND CODCIUD <= :GRPFIN)) then
                OK = 'S';
            END
        ELSE
            if (CODCIUD >= :GRPINI AND CODCIUD <= :GRPFIN) then
                OK = 'S';
        END
    if (AGRUPA = 'N') then
        OK = 'S';
        
    if (OK = 'S') then
        BEGIN
        if (CODCOBR IS NOT NULL) then
            SELECT COBR_NOM FROM COBRADORES  WHERE COBR_COD = :CODCOBR INTO :NOMCOBR;
        if (CODZONA IS NOT NULL) then
            SELECT ZONA_NOM FROM ZONAS WHERE ZONA_COD = :CODZONA INTO :NOMZONA;
        if (CODCIUD IS NOT NULL) then
            SELECT CIUD_NOM FROM CIUDADES  WHERE CIUD_COD = :CODCIUD INTO :NOMCIUD;
    
        SALDO = 0;
        /* BUSQUE EN SALDOS_DOC_CARTERA LOS QUE TENGAN SALDO > 0 */
        FOR SELECT MVCL_TIPOREF, MVCL_IDREF
          FROM MOVIMIENTO_CLIENTES WHERE TERC_NIT = :NIT AND MVCL_SUCURSAL = :SUCURSAL AND MVCL_FECHA <= :FECHA AND
          MVCL_ABONO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) AND MVCL_VENCE >= :VENCEINI AND MVCL_VENCE <= :VENCEFIN
          INTO :TIPO, :ID
          DO
            if ((inclanti = 'SI') or (TIPO <> 45)) then
                BEGIN
                EXECUTE PROCEDURE saldo_doc_cartera(TIPO, ID, FECHA) returning_values (PSALDO);
                if (PSALDO <> 0) then
                    SALDO = SALDO + PSALDO;
                END
        DISPONIBLE = CUPO - SALDO;
        /* LOS RECIBOS PROVISIONALES */
        SELECT SUM(RPDE_ABONO) FROM RECIBO_PROVISIONAL P, recibo_provisional_detalle D
            WHERE P.rcpr_id = D.rcpr_id AND TERC_NIT = :NIT AND RPDE_SUCURSAL = :SUCURSAL AND
            RCPR_FECHA <= :FECHA AND RCPR_ANULADO = 'N' AND ((RCPR_FECCRUCE IS NULL) or (RCPR_FECCRUCE > :FECHA)) AND
            ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            INTO :provisional;
        /* LAS NOTAS DE CLIENTES */
        I = 0;
        NOTA1 = '';
        NOTA2 = '';
        FOR SELECT CAST(NOCL_FECHA AS VARCHAR(10)), tido_nomcorto, NOCL_NUMDOC, NOCL_TEXTO
            FROM NOTAS_CLIENTES N, TIPO_DOCUMENTO T WHERE N.NOCL_TIPODOC = T.TIDO_COD AND TERC_NIT = :NIT
            AND N.TINO_COD = 3 AND N.CLSU_COD = :SUCURSAL
            ORDER BY NOCL_ID DESC INTO :FECNOTA, :TIPODOC, :NUMDOC, :NOTA
            DO
            BEGIN
            if (I = 0) then
                NOTA1 = NOTA;
            if (I = 1) then
                NOTA2 = NOTA;
            I = I + 1;
            END
        SUSPEND;
        END
    if (AGRUPA = 'C') then
        BEGIN
        if (CODZONA IS NOT NULL) then
            SELECT ZONA_NOM FROM ZONAS WHERE ZONA_COD = :CODZONA INTO :NOMZONA;
        if (CODCIUD IS NOT NULL) then
            SELECT CIUD_NOM FROM CIUDADES  WHERE CIUD_COD = :CODCIUD INTO :NOMCIUD;
        FOR SELECT DISTINCT COBR_COD FROM MOVIMIENTO_CLIENTES WHERE TERC_NIT = :NIT AND
            MVCL_SUCURSAL = :SUCURSAL AND MVCL_FECHA <= :FECHA AND
            MVCL_ABONO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) AND MVCL_VENCE >= :VENCEINI AND MVCL_VENCE <= :VENCEFIN
            INTO :codcobr
            DO
            begin
            OK = 'N';
            if (GRPINI = '') then
                BEGIN
                if ((CODCOBR IS NULL) or (CODCOBR >= :GRPINI AND CODCOBR <= :GRPFIN)) then
                    OK = 'S';
                END
            ELSE
                if (CODCOBR >= :GRPINI AND CODCOBR <= :GRPFIN) then
                    OK = 'S';
            if (OK = 'S') then
                BEGIN
                SELECT COBR_NOM FROM COBRADORES  WHERE COBR_COD = :CODCOBR INTO :NOMCOBR;

                SALDO = 0;
                /* BUSQUE EN SALDOS_DOC_CARTERA LOS QUE TENGAN SALDO > 0 */
                FOR SELECT MVCL_TIPOREF, MVCL_IDREF
                  FROM MOVIMIENTO_CLIENTES WHERE TERC_NIT = :NIT AND MVCL_SUCURSAL = :SUCURSAL AND
                  MVCL_FECHA <= :FECHA AND COBR_COD = :codcobr AND MVCL_ABONO = 'N' AND
                  ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) AND MVCL_VENCE >= :VENCEINI AND MVCL_VENCE <= :VENCEFIN
                  INTO :TIPO, :ID
                  DO
                    if ((inclanti = 'SI') or (TIPO <> 45)) then
                        BEGIN
                        EXECUTE PROCEDURE saldo_doc_cartera(TIPO, ID, FECHA) returning_values (PSALDO);
                        if (PSALDO <> 0) then
                            BEGIN
                            SALDO = SALDO + PSALDO;
                            END
                        END
                DISPONIBLE = CUPO - SALDO;
                /* LOS RECIBOS PROVISIONALES */
                SELECT SUM(RPDE_ABONO) FROM RECIBO_PROVISIONAL P, recibo_provisional_detalle D
                    WHERE P.rcpr_id = D.rcpr_id AND TERC_NIT = :NIT AND RPDE_SUCURSAL = :SUCURSAL AND
                    VEND_COD = :CODCOBR AND RCPR_FECHA <= :FECHA AND RCPR_ANULADO = 'N' AND ((RCPR_FECCRUCE IS NULL) or (RCPR_FECCRUCE > :FECHA)) AND
                    ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                    INTO :provisional;
                /* LAS NOTAS DE CLIENTES */
                I = 0;
                NOTA1 = '';
                NOTA2 = '';
                FOR SELECT CAST(NOCL_FECHA AS VARCHAR(10)), tido_nomcorto, NOCL_NUMDOC, NOCL_TEXTO
                    FROM NOTAS_CLIENTES N, TIPO_DOCUMENTO T WHERE N.NOCL_TIPODOC = T.TIDO_COD AND TERC_NIT = :NIT
                    AND N.TINO_COD = 3 AND N.CLSU_COD = :SUCURSAL
                    ORDER BY NOCL_FECHA DESC INTO :FECNOTA, :TIPODOC, :NUMDOC, :NOTA
                    DO
                    BEGIN
                    if (I = 0) then
                        NOTA1 = NOTA;
                    if (I = 1) then
                        NOTA2 = NOTA;
                    I = I + 1;
                    END
                SUSPEND;
                END /* OK = S */
            END /* FOR COBRADOR */
        END /* AGRUPA = C */
    END /* FOR NIT */
END
^

SET TERM ; ^

ALTER TABLE RECIBO_PROVISIONAL DROP RCPR_SUCURSAL;

SET TERM ^ ;

CREATE OR ALTER PROCEDURE IMPR_RECICAJA(
    ID INTEGER)
RETURNS (
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    NOMCAJA VARCHAR(60),
    CODCOBR INTEGER,
    NOMCOBR VARCHAR(60),
    NIT VARCHAR(20),
    NOMBRE VARCHAR(60),
    DIR VARCHAR(60),
    CIU VARCHAR(40),
    TEL VARCHAR(40),
    CONCEPTO VARCHAR(60),
    MONTO NUMERIC(18,2),
    RTFTE NUMERIC(18,2),
    RTIVA NUMERIC(18,2),
    RTICA NUMERIC(18,2),
    DSCTO NUMERIC(18,2),
    OBS BLOB SUB_TYPE 1 SEGMENT SIZE 80,
    ITEMDOC INTEGER,
    TIPODOC VARCHAR(8),
    PREFDOC VARCHAR(4),
    NUMDOC VARCHAR(6),
    SUCURSAL VARCHAR(10),
    ABONODOC NUMERIC(18,2),
    RTFTEDOC NUMERIC(18,2),
    RTIVADOC NUMERIC(18,2),
    RTICADOC NUMERIC(18,2),
    DSCTODOC NUMERIC(18,2),
    SALDODOC NUMERIC(18,2),
    ANTERDOC NUMERIC(18,2))
AS
declare variable NUMROWS INTEGER;
declare variable TIPO integer;
declare variable IDDOC INTEGER;
BEGIN
  SELECT PREF_PRE, RECA_NUMERO, RECA_FECHA, CAJA_NOMBRE, RECA_CONC, R.COBR_COD,
        R.TERC_NIT, RECA_NOMTERC, TERC_DIR, TERC_CIU, TERC_TEL,
        RECA_MONTO, RECA_RTFTEMONTO, RECA_RTIVAMONTO, RECA_RTICAMONTO, RECA_DTOF,
        RECA_OBS
  FROM RECIBOS_CAJA R, TERCEROS T, CAJAS C
  WHERE R.TERC_NIT = T.TERC_NIT AND R.CAJA_ID = C.CAJA_ID AND
        R.RECA_ID = :ID
  INTO :PREFIJO, :NUMERO, :FECHA, :NOMCAJA, :CONCEPTO, :CODCOBR,
        :NIT, :NOMBRE, :DIR, :CIU, :TEL,
        :MONTO, :RTFTE, :RTIVA, :RTICA, :DSCTO,
        :OBS;
  SELECT COBR_NOM FROM COBRADORES WHERE COBR_COD = :CODCOBR INTO :NOMCOBR;
  SELECT COUNT(RCDE_ITEM) FROM RECIBOS_CAJA_DETALLE
    WHERE RECA_ID = :ID INTO :NUMROWS;
  if (NUMROWS > 0) then
    FOR SELECT RCDE_ITEM, RCDE_TIPODOC, RCDE_IDDOC, TIDO_NOMCORTO, RCDE_PREFIJO, RCDE_NUMERO,
        RCDE_ABONO, RCDE_RTFTE, RCDE_RTIVA, RCDE_RTICA, RCDE_DTOF, RCDE_SUCURSAL
        FROM RECIBOS_CAJA_DETALLE D, TIPO_DOCUMENTO TD
        WHERE D.RECA_ID = :ID AND TD.TIDO_COD = D.RCDE_TIPODOC
        ORDER BY RCDE_ITEM
        INTO :ITEMDOC, :TIPO, :IDDOC, :TIPODOC, :PREFDOC, :NUMDOC, :ABONODOC, :RTFTEDOC, :RTIVADOC, :RTICADOC, :DSCTODOC, :sucursal
        DO
            BEGIN
            EXECUTE PROCEDURE SALDO_DOC_CARTERA(:TIPO, :IDDOC, :FECHA) returning_values (:SALDODOC);
            ANTERDOC = SALDODOC + RTFTEDOC + RTIVADOC + RTICADOC + ABONODOC + DSCTODOC;
            SUSPEND;
            END
  ELSE
    SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER PROCEDURE IMPR_RECIPROV(
    ID INTEGER)
RETURNS (
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    NOMCAJA VARCHAR(60),
    CODCOBR INTEGER,
    NOMCOBR VARCHAR(60),
    NIT VARCHAR(20),
    NOMBRE VARCHAR(60),
    DIR VARCHAR(60),
    CIU VARCHAR(40),
    TEL VARCHAR(40),
    CONCEPTO VARCHAR(60),
    MONTO NUMERIC(18,2),
    RTFTE NUMERIC(18,2),
    RTIVA NUMERIC(18,2),
    RTICA NUMERIC(18,2),
    DSCTO NUMERIC(18,2),
    OBS BLOB SUB_TYPE 1 SEGMENT SIZE 80,
    ITEMDOC INTEGER,
    TIPODOC VARCHAR(8),
    PREFDOC VARCHAR(4),
    NUMDOC VARCHAR(6),
    SUCURSAL VARCHAR(10),
    ABONODOC NUMERIC(18,2),
    RTFTEDOC NUMERIC(18,2),
    RTIVADOC NUMERIC(18,2),
    RTICADOC NUMERIC(18,2),
    DSCTODOC NUMERIC(18,2),
    SALDODOC NUMERIC(18,2),
    ANTERDOC NUMERIC(18,2))
AS
declare variable NUMROWS INTEGER;
declare variable TIPO integer;
BEGIN
  SELECT PREF_PRE, RCPR_NUMERO, RCPR_FECHA, CAJA_NOMBRE, RCPR_CONC, R.VEND_COD,
        R.TERC_NIT, RCPR_NOMTERC, TERC_DIR, TERC_CIU, TERC_TEL,
        RCPR_MONTO, RCPR_RTFTE, RCPR_RTIVA, RCPR_RTICA, RCPR_DTOF,
        RCPR_OBS
  FROM RECIBO_PROVISIONAL R, TERCEROS T, CAJAS C
  WHERE R.TERC_NIT = T.TERC_NIT AND R.CAJA_ID = C.CAJA_ID AND
        R.RCPR_ID = :ID
  INTO :PREFIJO, :NUMERO, :FECHA, :NOMCAJA, :CONCEPTO, :CODCOBR,
        :NIT, :NOMBRE, :DIR, :CIU, :TEL,
        :MONTO, :RTFTE, :RTIVA, :RTICA, :DSCTO,
        :OBS;
  SELECT COBR_NOM FROM COBRADORES WHERE COBR_COD = :CODCOBR INTO :NOMCOBR;
  SELECT COUNT(RPDE_ITEM) FROM RECIBO_PROVISIONAL_DETALLE
    WHERE RCPR_ID = :ID INTO :NUMROWS;
  if (NUMROWS > 0) then
    FOR SELECT RPDE_ITEM, RPDE_TIPODOC, TIDO_NOMCORTO, RPDE_PREFDOC, RPDE_NUMDOC,
        RPDE_ABONO, RPDE_RTFTE, RPDE_RTIVA, RPDE_RTICA, RPDE_DTOF, RPDE_SUCURSAL
        FROM RECIBO_PROVISIONAL_DETALLE D, TIPO_DOCUMENTO TD
        WHERE D.RCPR_ID = :ID AND TD.TIDO_COD = D.RPDE_TIPODOC
        ORDER BY RPDE_ITEM
        INTO :ITEMDOC, :TIPO, :TIPODOC, :PREFDOC, :NUMDOC, :ABONODOC, :RTFTEDOC, :RTIVADOC, :RTICADOC, :DSCTODOC, :SUCURSAL
        DO
            BEGIN
            EXECUTE PROCEDURE SALDO_DOC_CARTERA(:TIPO, :ID, :FECHA) returning_values (:SALDODOC);
            ANTERDOC = SALDODOC + RTFTEDOC + RTIVADOC + RTICADOC + ABONODOC + DSCTODOC;
            SUSPEND;
            END
  ELSE
    SUSPEND;
END
^

SET TERM ; ^


/* 06-10 OBSERVACIONES EN CONSECUTIVOS Y CRONOLOGICO */

SET TERM ^ ;

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

SET TERM ; ^


SET TERM ^ ;

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

SET TERM ; ^

/* REPORTES DE VARIOS DOCUMENTOS A LA VEZ */

SET TERM ^ ;

CREATE OR ALTER PROCEDURE REP_ARTICULOS_CLIENTE(
    TIPO INTEGER,
    DETALLE CHAR(1),
    TERINI VARCHAR(20),
    TERFIN VARCHAR(20),
    FECINI DATE,
    FECFIN DATE,
    ARTINI VARCHAR(15),
    ARTFIN VARCHAR(15),
    ORDEN CHAR(1),
    CEROS CHAR(1),
    SUBEMPRESA INTEGER)
RETURNS (
    NIT VARCHAR(20),
    NOMBRE VARCHAR(60),
    TELEFONO VARCHAR(40),
    CIUDAD VARCHAR(40),
    CODZONA VARCHAR(2),
    NOMZONA VARCHAR(30),
    NOMTIPO VARCHAR(50),
    ARTICULO VARCHAR(15),
    DESCRIPCION VARCHAR(60),
    CODGRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    CODSUBG VARCHAR(3),
    NOMSUBG VARCHAR(30),
    CODMARC VARCHAR(3),
    NOMMARC VARCHAR(30),
    UNIDAD VARCHAR(8),
    CANTIDAD NUMERIC(18,4),
    BASE NUMERIC(18,2),
    IVA NUMERIC(18,2),
    CONSUMO NUMERIC(18,2),
    TOTAL NUMERIC(18,2),
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    DTO NUMERIC(9,2),
    TIPODOC INTEGER)
AS
declare variable CODINI VARCHAR(15);
declare variable CODFIN VARCHAR(15);
declare variable DESINI VARCHAR(15);
declare variable DESFIN VARCHAR(15);
BEGIN
if (ORDEN = 'C') then
    BEGIN
    CODINI = ARTINI;
    CODFIN = ARTFIN;
    DESINI = '';
    DESFIN = 'zz';
    END
ELSE
    BEGIN
    DESINI = ARTINI;
    DESFIN = ARTFIN;
    CODINI = '';
    CODFIN = 'zz';
    END

SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = :TIPO INTO :NOMTIPO;
if (DETALLE = 'N') then
    BEGIN
    if (BIN_AND(TIPO, 1) <> 0) then
        BEGIN
        TIPODOC = 31;
        FOR SELECT SUM(FADE_CANT * FADE_FACTOR), SUM((FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO)*FACT_FACTOR), SUM(FADE_IVAMONTO*FACT_FACTOR), SUM(FADE_CONSUMO), SUM(FADE_TOTAL*FACT_FACTOR),
            max(D.ARTI_COD), MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD), MAX(TERC_NIT)
            FROM FACTURAS_DETALLE D, FACTURAS F, PREFIJOS P, ARTICULO A
            WHERE F.FACT_ID = D.FACT_ID AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND D.ARTI_COD = A.ARTI_COD AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            TERC_NIT >= :TERINI AND TERC_NIT <= :TERFIN AND FACT_ANULADO = 'N' AND
            FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY TERC_NIT, D.ARTI_COD
            INTO :CANTIDAD, :BASE, :IVA, :CONSUMO, :TOTAL, :ARTICULO, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :NIT
            DO
            BEGIN
            select TERC_NOM, TERC_TEL, TERC_CIU, C.ZONA_COD from terceros T, CLIENTES C
                where C.TERC_NIT = T.TERC_NIT AND T.TERC_NIT = :NIT
                INTO :NOMBRE, :TELEFONO, :CIUDAD, :CODZONA;
            SELECT ZONA_NOM FROM ZONAS WHERE ZONA_COD = :CODZONA INTO :NOMZONA;
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            if (CEROS = 'S') then
                SUSPEND;
            ELSE
                if ((BASE <> 0) AND (CANTIDAD <> 0)) then
                    SUSPEND;
            END
        END
    if (BIN_AND(TIPO, 2) <> 0) then
        BEGIN
        TIPODOC = 32;
        FOR SELECT SUM(RVDE_CANT * RVDE_FACTOR), SUM(RVDE_TOTAL-RVDE_IVAMONTO-RVDE_CONSUMO), SUM(RVDE_IVAMONTO), SUM(RVDE_CONSUMO), SUM(RVDE_TOTAL),
            max(D.ARTI_COD), MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD), MAX(TERC_NIT)
            FROM REMISIONES_VENTA_DETALLE D, REMISIONES_VENTA R, PREFIJOS P, ARTICULO A
            WHERE R.REVT_ID = D.REVT_ID AND P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = 32 AND D.ARTI_COD = A.ARTI_COD AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            TERC_NIT >= :TERINI AND TERC_NIT <= :TERFIN AND REVT_FECHA >= :FECINI AND
            REVT_FECHA <= :FECFIN AND REVT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY TERC_NIT, D.ARTI_COD
            INTO :CANTIDAD, :BASE, :IVA, :CONSUMO, :TOTAL, :ARTICULO, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :NIT
            DO
            BEGIN
            select TERC_NOM, TERC_TEL, TERC_CIU, C.ZONA_COD from terceros T, CLIENTES C
                where C.TERC_NIT = T.TERC_NIT AND T.TERC_NIT = :NIT
                INTO :NOMBRE, :TELEFONO, :CIUDAD, :CODZONA;
            SELECT ZONA_NOM FROM ZONAS WHERE ZONA_COD = :CODZONA INTO :NOMZONA;
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            if (CEROS = 'S') then
                SUSPEND;
            ELSE
                if ((BASE <> 0) AND (CANTIDAD <> 0)) then
                    SUSPEND;
            END
        END
    if (BIN_AND(TIPO, 4) <> 0) then
        BEGIN
        TIPODOC = 33;
        FOR SELECT SUM(DVDE_CANT * DVDE_FACTOR), SUM((DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO)*DEVT_FACTOR), SUM(DVDE_IVAMONTO*DEVT_FACTOR), SUM(DVDE_CONSUMO), SUM(DVDE_TOTAL*DEVT_FACTOR),
            max(D.ARTI_COD), MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD), MAX(TERC_NIT)
            FROM devoluciones_ventas_detalle D, DEVOLUCIONES_VENTAS V, PREFIJOS P, ARTICULO A
            WHERE V.DEVT_ID = D.DEVT_ID AND P.PREF_PRE = V.PREF_PRE AND P.TIDO_COD = 33 AND D.ARTI_COD = A.ARTI_COD AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            TERC_NIT >= :TERINI AND TERC_NIT <= :TERFIN AND DEVT_FECHA >= :FECINI AND
            DEVT_FECHA <= :FECFIN AND DEVT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY TERC_NIT, D.ARTI_COD
            INTO :CANTIDAD, :BASE, :IVA, :CONSUMO, :TOTAL, :ARTICULO, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :NIT
            DO
            BEGIN
            select TERC_NOM, TERC_TEL, TERC_CIU, C.ZONA_COD from terceros T, CLIENTES C
                where C.TERC_NIT = T.TERC_NIT AND T.TERC_NIT = :NIT
                INTO :NOMBRE, :TELEFONO, :CIUDAD, :CODZONA;
            SELECT ZONA_NOM FROM ZONAS WHERE ZONA_COD = :CODZONA INTO :NOMZONA;
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            CANTIDAD = CANTIDAD * -1;
            BASE = BASE * -1;
            TOTAL = TOTAL * -1;
            IVA = IVA * -1;
            CONSUMO = CONSUMO * -1;
            if (CEROS = 'S') then
                SUSPEND;
            ELSE
                if ((BASE <> 0) AND (CANTIDAD <> 0)) then
                    SUSPEND;
            END
        END
    if (BIN_AND(TIPO, 8) <> 0) then
        BEGIN
        TIPODOC = 34;
        FOR SELECT SUM(PEDE_CANT * PEDE_FACTOR), SUM((PEDE_TOTAL-PEDE_IVAMONTO-PEDE_CONSUMO)*PEDI_FACTOR), SUM(PEDE_IVAMONTO*PEDI_FACTOR), SUM(PEDE_CONSUMO), SUM(PEDE_TOTAL*PEDI_FACTOR),
            max(D.ARTI_COD), MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD), MAX(TERC_NIT)
            FROM PEDIDOS_DETALLE D, PEDIDOS P, PREFIJOS R, ARTICULO A
            WHERE P.PEDI_ID = D.PEDI_ID AND R.PREF_PRE = P.PREF_PRE AND R.TIDO_COD = 34 AND D.ARTI_COD = A.ARTI_COD AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            TERC_NIT >= :TERINI AND TERC_NIT <= :TERFIN AND PEDI_FECHA >= :FECINI AND
            PEDI_FECHA <= :FECFIN AND PEDI_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY TERC_NIT, D.ARTI_COD
            INTO :CANTIDAD, :BASE, :IVA, :CONSUMO, :TOTAL, :ARTICULO, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :NIT
            DO
            BEGIN
            select TERC_NOM, TERC_TEL, TERC_CIU, C.ZONA_COD from terceros T, CLIENTES C
                where C.TERC_NIT = T.TERC_NIT AND T.TERC_NIT = :NIT
                INTO :NOMBRE, :TELEFONO, :CIUDAD, :CODZONA;
            SELECT ZONA_NOM FROM ZONAS WHERE ZONA_COD = :CODZONA INTO :NOMZONA;
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            if (CEROS = 'S') then
                SUSPEND;
            ELSE
                if ((BASE <> 0) AND (CANTIDAD <> 0)) then
                    SUSPEND;
            END
        END
    if (BIN_AND(TIPO, 16) <> 0) then
        BEGIN
        TIPODOC = 35;
        FOR SELECT SUM(CTDE_CANT * CTDE_FACTOR), SUM((CTDE_TOTAL-CTDE_IVAMONTO-CTDE_CONSUMO)*COTI_FACTOR), SUM(CTDE_IVAMONTO*COTI_FACTOR), SUM(CTDE_CONSUMO), SUM(CTDE_TOTAL*COTI_FACTOR),
            max(D.ARTI_COD), MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD), MAX(TERC_NIT)
            FROM COTIZACIONES_DETALLE D, COTIZACIONES C, PREFIJOS P, ARTICULO A
            WHERE C.COTI_ID = D.COTI_ID AND P.PREF_PRE = C.PREF_PRE AND P.TIDO_COD = 35 AND D.ARTI_COD = A.ARTI_COD AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            TERC_NIT >= :TERINI AND TERC_NIT <= :TERFIN AND COTI_FECHA >= :FECINI AND
            COTI_FECHA <= :FECFIN AND COTI_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY TERC_NIT, D.ARTI_COD
            INTO :CANTIDAD, :BASE, :IVA, :CONSUMO, :TOTAL, :ARTICULO, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :NIT
            DO
            BEGIN
            select TERC_NOM, TERC_TEL, TERC_CIU, C.ZONA_COD from terceros T, CLIENTES C
                where C.TERC_NIT = T.TERC_NIT AND T.TERC_NIT = :NIT
                INTO :NOMBRE, :TELEFONO, :CIUDAD, :CODZONA;
            SELECT ZONA_NOM FROM ZONAS WHERE ZONA_COD = :CODZONA INTO :NOMZONA;
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            if (CEROS = 'S') then
                SUSPEND;
            ELSE
                if ((BASE <> 0) AND (CANTIDAD <> 0)) then
                    SUSPEND;
            END
        END
    END
ELSE
    BEGIN
    if (BIN_AND(TIPO, 1) <> 0) then
        BEGIN
        TIPODOC = 31;
        FOR SELECT F.PREF_PRE, FACT_NUMERO, FACT_FECHA, FADE_CANT * FADE_FACTOR, FADE_PRUNIT/FADE_FACTOR*FACT_FACTOR, FADE_IVAMONTO*FACT_FACTOR, FADE_CONSUMO, FADE_DTOPORC, FADE_TOTAL*FACT_FACTOR,
            D.ARTI_COD, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD, TERC_NIT
            FROM FACTURAS F, FACTURAS_DETALLE D, PREFIJOS P, ARTICULO A
            WHERE F.FACT_ID = D.FACT_ID AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND D.ARTI_COD = A.ARTI_COD AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            TERC_NIT >= :TERINI AND TERC_NIT <= :TERFIN AND FACT_FECHA >= :FECINI AND
            FACT_FECHA <= :FECFIN AND FACT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            ORDER BY TERC_NIT, ARTI_COD, FACT_FECHA
            INTO :PREFIJO, :NUMERO, :FECHA, CANTIDAD, :BASE, :IVA, :CONSUMO, :dto, :TOTAL, :ARTICULO, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :NIT
            DO
            BEGIN
            select TERC_NOM, TERC_TEL, TERC_CIU, C.ZONA_COD from terceros T, CLIENTES C
                where C.TERC_NIT = T.TERC_NIT AND T.TERC_NIT = :NIT
                INTO :NOMBRE, :TELEFONO, :CIUDAD, :CODZONA;
            SELECT ZONA_NOM FROM ZONAS WHERE ZONA_COD = :CODZONA INTO :NOMZONA;
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            SUSPEND;
            END
        END
    if (BIN_AND(TIPO, 2) <> 0) then
        BEGIN
        TIPODOC = 32;
        FOR SELECT R.PREF_PRE, REVT_NUMERO, REVT_FECHA, RVDE_CANT * RVDE_FACTOR, RVDE_PRUNIT / RVDE_FACTOR, RVDE_IVAMONTO, RVDE_CONSUMO, RVDE_DTOPORC, RVDE_TOTAL,
            D.ARTI_COD, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD, TERC_NIT
            FROM REMISIONES_VENTA R, REMISIONES_VENTA_DETALLE D, PREFIJOS P, ARTICULO A
            WHERE R.REVT_ID = D.REVT_ID AND P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = 32 AND D.ARTI_COD = A.ARTI_COD AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            TERC_NIT >= :TERINI AND TERC_NIT <= :TERFIN AND REVT_FECHA >= :FECINI AND
            REVT_FECHA <= :FECFIN AND REVT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            ORDER BY TERC_NIT, ARTI_COD, REVT_FECHA
            INTO :PREFIJO, :NUMERO, :FECHA, CANTIDAD, :BASE, :IVA, :CONSUMO, :dto, :TOTAL, :ARTICULO, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :NIT
            DO
            BEGIN
            select TERC_NOM, TERC_TEL, TERC_CIU, C.ZONA_COD from terceros T, CLIENTES C
                where C.TERC_NIT = T.TERC_NIT AND T.TERC_NIT = :NIT
                INTO :NOMBRE, :TELEFONO, :CIUDAD, :CODZONA;
            SELECT ZONA_NOM FROM ZONAS WHERE ZONA_COD = :CODZONA INTO :NOMZONA;
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            SUSPEND;
            END
        END
    if (BIN_AND(TIPO, 4) <> 0) then
        BEGIN
        TIPODOC = 33;
        FOR SELECT V.PREF_PRE, DEVT_NUMERO, DEVT_FECHA, DVDE_CANT * DVDE_FACTOR, DVDE_PRUNIT/DVDE_FACTOR*DEVT_FACTOR, DVDE_IVAMONTO*DEVT_FACTOR, DVDE_CONSUMO, DVDE_DTOPORC, DVDE_TOTAL*DEVT_FACTOR,
            D.ARTI_COD, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD, TERC_NIT
            FROM DEVOLUCIONES_VENTAS V, DEVOLUCIONES_VENTAS_DETALLE D, PREFIJOS P, ARTICULO A
            WHERE V.DEVT_ID = D.DEVT_ID AND P.PREF_PRE = V.PREF_PRE AND P.TIDO_COD = 33 AND D.ARTI_COD = A.ARTI_COD AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            TERC_NIT >= :TERINI AND TERC_NIT <= :TERFIN AND DEVT_FECHA >= :FECINI AND
            DEVT_FECHA <= :FECFIN AND DEVT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            ORDER BY TERC_NIT, ARTI_COD, DEVT_FECHA
            INTO :PREFIJO, :NUMERO, :FECHA, CANTIDAD, :BASE, :IVA, :CONSUMO, :dto, :TOTAL, :ARTICULO, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :NIT
            DO
            BEGIN
            select TERC_NOM, TERC_TEL, TERC_CIU, C.ZONA_COD from terceros T, CLIENTES C
                where C.TERC_NIT = T.TERC_NIT AND T.TERC_NIT = :NIT
                INTO :NOMBRE, :TELEFONO, :CIUDAD, :CODZONA;
            SELECT ZONA_NOM FROM ZONAS WHERE ZONA_COD = :CODZONA INTO :NOMZONA;
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            CANTIDAD = CANTIDAD * -1;
            BASE = BASE * -1;
            TOTAL = TOTAL * -1;
            IVA = IVA * -1;
            CONSUMO = CONSUMO * -1;
            SUSPEND;
            END
        END
    if (BIN_AND(TIPO, 8) <> 0) then
        BEGIN
        TIPODOC = 34;
        FOR SELECT P.PREF_PRE, PEDI_NUMERO, PEDI_FECHA, PEDE_CANT * PEDE_FACTOR, PEDE_PRUNIT/PEDE_FACTOR*PEDI_FACTOR, PEDE_IVAMONTO*PEDI_FACTOR, PEDE_CONSUMO, PEDE_DTOPORC, PEDE_TOTAL*PEDI_FACTOR,
            D.ARTI_COD, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD, TERC_NIT
            FROM PEDIDOS P, PEDIDOS_DETALLE D, PREFIJOS R, ARTICULO A
            WHERE P.PEDI_ID = D.PEDI_ID AND R.PREF_PRE = P.PREF_PRE AND R.TIDO_COD = 34 AND D.ARTI_COD = A.ARTI_COD AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            TERC_NIT >= :TERINI AND TERC_NIT <= :TERFIN AND PEDI_FECHA >= :FECINI AND
            PEDI_FECHA <= :FECFIN AND PEDI_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            ORDER BY TERC_NIT, ARTI_COD, PEDI_FECHA
            INTO :PREFIJO, :NUMERO, :FECHA, CANTIDAD, :BASE, :IVA, :CONSUMO, :dto, :TOTAL, :ARTICULO, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :NIT
            DO
            BEGIN
            select TERC_NOM, TERC_TEL, TERC_CIU, C.ZONA_COD from terceros T, CLIENTES C
                where C.TERC_NIT = T.TERC_NIT AND T.TERC_NIT = :NIT
                INTO :NOMBRE, :TELEFONO, :CIUDAD, :CODZONA;
            SELECT ZONA_NOM FROM ZONAS WHERE ZONA_COD = :CODZONA INTO :NOMZONA;
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            SUSPEND;
            END
        END
    if (BIN_AND(TIPO, 16) <> 0) then
        BEGIN
        TIPODOC = 35;
        FOR SELECT C.PREF_PRE, COTI_NUMERO, COTI_FECHA, CTDE_CANT * CTDE_FACTOR, CTDE_PRUNIT/CTDE_FACTOR*COTI_FACTOR, CTDE_IVAMONTO*COTI_FACTOR, CTDE_CONSUMO, CTDE_DTOPORC, CTDE_TOTAL*COTI_FACTOR,
            D.ARTI_COD, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD, TERC_NIT
            FROM COTIZACIONES C, COTIZACIONES_DETALLE D, PREFIJOS P, ARTICULO A
            WHERE C.COTI_ID = D.COTI_ID AND P.PREF_PRE = C.PREF_PRE AND P.TIDO_COD = 34 AND D.ARTI_COD = A.ARTI_COD AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            TERC_NIT >= :TERINI AND TERC_NIT <= :TERFIN AND COTI_FECHA >= :FECINI AND
            COTI_FECHA <= :FECFIN AND COTI_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            ORDER BY TERC_NIT, ARTI_COD, COTI_FECHA
            INTO :PREFIJO, :NUMERO, :FECHA, CANTIDAD, :BASE, :IVA, :CONSUMO, :dto, :TOTAL, :ARTICULO, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :NIT
            DO
            BEGIN
            select TERC_NOM, TERC_TEL, TERC_CIU, C.ZONA_COD from terceros T, CLIENTES C
                where C.TERC_NIT = T.TERC_NIT AND T.TERC_NIT = :NIT
                INTO :NOMBRE, :TELEFONO, :CIUDAD, :CODZONA;
            SELECT ZONA_NOM FROM ZONAS WHERE ZONA_COD = :CODZONA INTO :NOMZONA;
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            SUSPEND;
            END
        END
    END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER PROCEDURE REP_ARTICULOS_VENDEDOR(
    TIPO INTEGER,
    DETALLE CHAR(1),
    DESDE VARCHAR(20),
    HASTA VARCHAR(20),
    FECINI DATE,
    FECFIN DATE,
    ARTINI VARCHAR(15),
    ARTFIN VARCHAR(15),
    GRPINI VARCHAR(3),
    GRPFIN VARCHAR(3),
    ORDEN CHAR(1),
    AGRUPA CHAR(1),
    CEROS CHAR(1),
    SUBEMPRESA INTEGER)
RETURNS (
    CODVEND VARCHAR(20),
    NOMVEND VARCHAR(60),
    NOMTIPO VARCHAR(50),
    ARTICULO VARCHAR(15),
    DESCRIPCION VARCHAR(60),
    CODGRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    CODSUBG VARCHAR(3),
    NOMSUBG VARCHAR(30),
    CODMARC VARCHAR(3),
    NOMMARC VARCHAR(30),
    UNIDAD VARCHAR(8),
    CANTIDAD NUMERIC(18,4),
    BASE NUMERIC(18,2),
    IVA NUMERIC(18,2),
    CONSUMO NUMERIC(18,2),
    TOTAL NUMERIC(18,2),
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    DTO NUMERIC(9,2),
    NIT VARCHAR(20),
    NOMCLIENTE VARCHAR(60),
    CODZONA VARCHAR(2),
    NOMZONA VARCHAR(60))
AS
declare variable CODINI VARCHAR(15);
declare variable CODFIN VARCHAR(15);
declare variable DESINI VARCHAR(15);
declare variable DESFIN VARCHAR(15);
declare variable MARINI VARCHAR(3);
declare variable MARFIN VARCHAR(3);
BEGIN
if (ORDEN = 'C') then
    BEGIN
    CODINI = ARTINI;
    CODFIN = ARTFIN;
    DESINI = '';
    DESFIN = 'zz';
    END
ELSE
    BEGIN
    DESINI = ARTINI;
    DESFIN = ARTFIN;
    CODINI = '';
    CODFIN = 'zz';
    END
if (AGRUPA = 'G') then
    BEGIN
    MARINI = '';
    MARFIN = 'zz';
    END
ELSE
    if (AGRUPA = 'M') then
        BEGIN
        MARINI = GRPINI;
        MARFIN = GRPFIN;
        GRPINI = '';
        GRPFIN = 'zz';
        END
    ELSE
        BEGIN
        MARINI = '';
        MARFIN = 'zz';
        END
if (DETALLE = 'N') then
    BEGIN
    if (BIN_AND(TIPO, 1) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 31 INTO :NOMTIPO;
        FOR SELECT MAX(D.ARTI_COD), MAX(VEND_COD), SUM(FADE_CANT * FADE_FACTOR), SUM((FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO)*FACT_FACTOR), SUM(FADE_IVAMONTO*FACT_FACTOR), SUM(FADE_CONSUMO), SUM(FADE_TOTAL*FACT_FACTOR),
            MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD)
            FROM FACTURAS_DETALLE D, FACTURAS F, PREFIJOS P, ARTICULO A
            WHERE F.FACT_ID = D.FACT_ID AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND D.ARTI_COD = A.arti_cod AND
            VEND_COD >= :DESDE AND VEND_COD <= :HASTA AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            FACT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY VEND_COD, D.ARTI_COD
            INTO :ARTICULO, :CODVEND, :CANTIDAD, :BASE, :IVA, :CONSUMO, :TOTAL,
            :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
            DO
            BEGIN
            select VEND_NOMBRE from VENDEDORES where VEND_COD = :CODVEND INTO :NOMVEND;
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            if (CEROS = 'S') then
                SUSPEND;
            ELSE
                if ((BASE <> 0) AND (CANTIDAD <> 0)) then
                    SUSPEND;
            END /* FOR */
        END
    if (BIN_AND(TIPO, 2) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 32 INTO :NOMTIPO;
        FOR SELECT MAX(D.ARTI_COD), MAX(VEND_COD), SUM(RVDE_CANT * RVDE_FACTOR), SUM(RVDE_TOTAL-RVDE_IVAMONTO-RVDE_CONSUMO), SUM(RVDE_IVAMONTO), SUM(RVDE_CONSUMO), SUM(RVDE_TOTAL),
            MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD)
            FROM REMISIONES_VENTA_DETALLE D, REMISIONES_VENTA R, PREFIJOS P, ARTICULO A
            WHERE R.REVT_ID = D.REVT_ID AND P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = 32 AND D.ARTI_COD = A.arti_cod AND
            VEND_COD >= :DESDE AND VEND_COD <= :HASTA AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            REVT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY R.vend_cod, D.ARTI_COD
            INTO :ARTICULO, :CODVEND, :CANTIDAD, :BASE, :IVA, :CONSUMO, :TOTAL,
            :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
            DO
            BEGIN
            select VEND_NOMBRE from VENDEDORES where VEND_COD = :CODVEND INTO :NOMVEND;
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            if (CEROS = 'S') then
                SUSPEND;
            ELSE
                if ((BASE <> 0) AND (CANTIDAD <> 0)) then
                    SUSPEND;
            END /* FOR */
        END
    if (BIN_AND(TIPO, 4) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 33 INTO :NOMTIPO;
        FOR SELECT MAX(D.ARTI_COD), MAX(VEND_COD), SUM(DVDE_CANT * DVDE_FACTOR), SUM((DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO)*DEVT_FACTOR), SUM(DVDE_IVAMONTO*DEVT_FACTOR), SUM(DVDE_CONSUMO), SUM(DVDE_TOTAL*DEVT_FACTOR),
            MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD)
            FROM devoluciones_ventas_detalle D, DEVOLUCIONES_VENTAS V, PREFIJOS P, ARTICULO A
            WHERE V.DEVT_ID = D.DEVT_ID AND P.PREF_PRE = V.PREF_PRE AND P.TIDO_COD = 33 AND D.ARTI_COD = A.arti_cod AND
            VEND_COD >= :DESDE AND VEND_COD <= :HASTA AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            DEVT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY V.vend_cod, D.ARTI_COD
            INTO :ARTICULO, :CODVEND, :CANTIDAD, :BASE, :IVA, :CONSUMO, :TOTAL,
            :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
            DO
            BEGIN
            select VEND_NOMBRE from VENDEDORES where VEND_COD = :CODVEND INTO :NOMVEND;
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            CANTIDAD = CANTIDAD * -1;
            BASE = BASE * -1;
            TOTAL = TOTAL * -1;
            IVA = IVA * -1;
            CONSUMO = CONSUMO * -1;
            if (CEROS = 'S') then
                SUSPEND;
            ELSE
                if ((BASE <> 0) AND (CANTIDAD <> 0)) then
                    SUSPEND;
            END /* FOR */
        END
    if (BIN_AND(TIPO, 8) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 34 INTO :NOMTIPO;
        FOR SELECT MAX(D.ARTI_COD), MAX(VEND_COD), SUM(PEDE_CANT * PEDE_FACTOR), SUM((PEDE_TOTAL-PEDE_IVAMONTO-PEDE_CONSUMO)*PEDI_FACTOR), SUM(PEDE_IVAMONTO*PEDI_FACTOR), SUM(PEDE_CONSUMO), SUM(PEDE_TOTAL*PEDI_FACTOR),
            MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD)
            FROM PEDIDOS_DETALLE D, PEDIDOS P, PREFIJOS R, ARTICULO A
            WHERE P.PEDI_ID = D.PEDI_ID AND P.PREF_PRE = R.PREF_PRE AND R.TIDO_COD = 34 AND D.ARTI_COD = A.arti_cod AND
            VEND_COD >= :DESDE AND VEND_COD <= :HASTA AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            PEDI_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY P.vend_cod, D.ARTI_COD
            INTO :ARTICULO, :CODVEND, :CANTIDAD, :BASE, :IVA, :CONSUMO, :TOTAL,
            :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
            DO
            BEGIN
            select VEND_NOMBRE from VENDEDORES where VEND_COD = :CODVEND INTO :NOMVEND;
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            if (CEROS = 'S') then
                SUSPEND;
            ELSE
                if ((BASE <> 0) AND (CANTIDAD <> 0)) then
                    SUSPEND;
            END /* FOR */
        END
    if (BIN_AND(TIPO, 16) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 35 INTO :NOMTIPO;
        FOR SELECT MAX(D.ARTI_COD), MAX(VEND_COD), SUM(CTDE_CANT * CTDE_FACTOR), SUM((CTDE_TOTAL-CTDE_IVAMONTO-CTDE_CONSUMO)*COTI_FACTOR), SUM(CTDE_IVAMONTO*COTI_FACTOR), SUM(CTDE_CONSUMO), SUM(CTDE_TOTAL*COTI_FACTOR),
            MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD)
            FROM COTIZACIONES_DETALLE D, COTIZACIONES C, PREFIJOS P, ARTICULO A
            WHERE C.COTI_ID = D.COTI_ID AND P.PREF_PRE = C.PREF_PRE AND P.TIDO_COD = 35 AND D.ARTI_COD = A.arti_cod AND
            VEND_COD >= :DESDE AND VEND_COD <= :HASTA AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND COTI_FECHA >= :FECINI AND COTI_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            COTI_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY C.vend_cod, D.ARTI_COD
            INTO :ARTICULO, :CODVEND, :CANTIDAD, :BASE, :IVA, :CONSUMO, :TOTAL,
            :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
            DO
            BEGIN
            select VEND_NOMBRE from VENDEDORES where VEND_COD = :CODVEND INTO :NOMVEND;
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            if (CEROS = 'S') then
                SUSPEND;
            ELSE
                if ((BASE <> 0) AND (CANTIDAD <> 0)) then
                    SUSPEND;
            END /* FOR */
        END
    END
ELSE
  if (DETALLE = 'S') then
    BEGIN
    if (BIN_AND(TIPO, 1) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 31 INTO :NOMTIPO;
        FOR SELECT F.PREF_PRE, FACT_NUMERO, FACT_FECHA, VEND_COD, D.ARTI_COD, FADE_CANT * FADE_FACTOR, (FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO)*FACT_FACTOR, FADE_IVAMONTO*FACT_FACTOR, FADE_CONSUMO, FADE_DTOPORC, FADE_TOTAL*FACT_FACTOR,
            ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD , F.TERC_NIT, F.fact_nomcliente
            FROM FACTURAS F, FACTURAS_DETALLE D, PREFIJOS P, ARTICULO A
            WHERE F.FACT_ID = D.FACT_ID AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND D.ARTI_COD = A.arti_cod AND
                VEND_COD >= :DESDE AND VEND_COD <= :HASTA AND
                A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
                A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND FACT_FECHA >= :FECINI AND
                (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
                FACT_FECHA <= :FECFIN AND FACT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            ORDER BY VEND_COD, D.ARTI_COD, FACT_FECHA, F.FACT_ID, FADE_ITEM
            INTO :PREFIJO, :NUMERO, :FECHA, :CODVEND, :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO, :DTO, :TOTAL,
                :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :NIT, :nomcliente
            DO
            BEGIN
            select VEND_NOMBRE from VENDEDORES where VEND_COD = :CODVEND INTO :NOMVEND;
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            SUSPEND;
            END
        END
    if (BIN_AND(TIPO, 2) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 32 INTO :NOMTIPO;
        FOR SELECT R.PREF_PRE, REVT_NUMERO, REVT_FECHA, VEND_COD, D.ARTI_COD, RVDE_CANT * RVDE_FACTOR, (RVDE_TOTAL-RVDE_IVAMONTO-RVDE_CONSUMO), RVDE_IVAMONTO, RVDE_CONSUMO, RVDE_DTOPORC, RVDE_TOTAL,
            ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD, R.terc_nit, R.revt_nomterc
            FROM REMISIONES_VENTA R, REMISIONES_VENTA_DETALLE D, PREFIJOS P, ARTICULO A
            WHERE R.REVT_ID = D.REVT_ID AND P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = 32 AND D.ARTI_COD = A.arti_cod AND
                VEND_COD >= :DESDE AND VEND_COD <= :HASTA AND
                A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
                A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN AND
                (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
                REVT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            ORDER BY VEND_COD, D.ARTI_COD, REVT_FECHA, R.REVT_ID, RVDE_ITEM
            INTO :PREFIJO, :NUMERO, :FECHA, :CODVEND, :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO, :DTO, :TOTAL,
                :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :NIT, :nomcliente
            DO
            BEGIN
            select VEND_NOMBRE from VENDEDORES where VEND_COD = :CODVEND INTO :NOMVEND;
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            SUSPEND;
            END
        END
    if (BIN_AND(TIPO, 4) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 33 INTO :NOMTIPO;
        FOR SELECT V.PREF_PRE, DEVT_NUMERO, DEVT_FECHA, VEND_COD, D.ARTI_COD, DVDE_CANT * DVDE_FACTOR, (DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO)*DEVT_FACTOR, DVDE_IVAMONTO*DEVT_FACTOR, DVDE_CONSUMO, DVDE_DTOPORC, DVDE_TOTAL*DEVT_FACTOR,
            ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD, V.terc_nit, V.devt_nomterc
            FROM DEVOLUCIONES_VENTAS V, DEVOLUCIONES_VENTAS_DETALLE D, PREFIJOS P, ARTICULO A
            WHERE V.DEVT_ID = D.DEVT_ID AND P.PREF_PRE = V.PREF_PRE AND P.TIDO_COD = 33 AND D.ARTI_COD = A.arti_cod AND
                VEND_COD >= :DESDE AND VEND_COD <= :HASTA AND
                A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
                A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND
                (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
                DEVT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            ORDER BY VEND_COD, D.ARTI_COD, DEVT_FECHA, V.DEVT_ID, DVDE_ITEM
            INTO :PREFIJO, :NUMERO, :FECHA, :CODVEND, :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO, :DTO, :TOTAL,
                :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :NIT, :nomcliente
            DO
            BEGIN
            select VEND_NOMBRE from VENDEDORES where VEND_COD = :CODVEND INTO :NOMVEND;
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            CANTIDAD = CANTIDAD * -1;
            BASE = BASE * -1;
            TOTAL = TOTAL * -1;
            IVA = IVA * -1;
            CONSUMO = CONSUMO * -1;
            SUSPEND;
            END
        END
    if (BIN_AND(TIPO, 8) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 34 INTO :NOMTIPO;
        FOR SELECT P.PREF_PRE, PEDI_NUMERO, PEDI_FECHA, VEND_COD, D.ARTI_COD, PEDE_CANT * PEDE_FACTOR, (PEDE_TOTAL-PEDE_IVAMONTO-PEDE_CONSUMO)*PEDI_FACTOR, PEDE_IVAMONTO*PEDI_FACTOR, PEDE_CONSUMO, PEDE_DTOPORC, PEDE_TOTAL*PEDI_FACTOR,
            ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD, P.terc_nit, P.pedi_nomterc
            FROM PEDIDOS P, PEDIDOS_DETALLE D, PREFIJOS R, ARTICULO A
            WHERE P.PEDI_ID = D.PEDI_ID AND P.PREF_PRE = R.PREF_PRE AND R.TIDO_COD = 34 AND D.ARTI_COD = A.arti_cod AND
                VEND_COD >= :DESDE AND VEND_COD <= :HASTA AND
                A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
                A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND
                (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
                PEDI_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            ORDER BY VEND_COD, D.ARTI_COD, PEDI_FECHA, P.PEDI_ID, PEDE_ITEM
            INTO :PREFIJO, :NUMERO, :FECHA, :CODVEND, :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO, :DTO, :TOTAL,
                :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :NIT, :nomcliente
            DO
            BEGIN
            select VEND_NOMBRE from VENDEDORES where VEND_COD = :CODVEND INTO :NOMVEND;
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            SUSPEND;
            END
        END
    if (BIN_AND(TIPO, 16) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 35 INTO :NOMTIPO;
        FOR SELECT C.PREF_PRE, COTI_NUMERO, COTI_FECHA, VEND_COD, D.ARTI_COD, CTDE_CANT * CTDE_FACTOR, (CTDE_TOTAL-CTDE_IVAMONTO-CTDE_CONSUMO)*COTI_FACTOR, CTDE_IVAMONTO*COTI_FACTOR, CTDE_CONSUMO, CTDE_DTOPORC, CTDE_TOTAL*COTI_FACTOR,
            ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD, C.terc_nit, C.coti_nomterc
            FROM COTIZACIONES C, COTIZACIONES_DETALLE D, PREFIJOS P, ARTICULO A
            WHERE C.COTI_ID = D.COTI_ID AND P.PREF_PRE = C.PREF_PRE AND P.TIDO_COD = 35 AND D.ARTI_COD = A.arti_cod AND
                VEND_COD >= :DESDE AND VEND_COD <= :HASTA AND
                A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
                A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND COTI_FECHA >= :FECINI AND COTI_FECHA <= :FECFIN AND
                (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
                COTI_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            ORDER BY VEND_COD, D.ARTI_COD, COTI_FECHA, C.COTI_ID, CTDE_ITEM
            INTO :PREFIJO, :NUMERO, :FECHA, :CODVEND, :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO, :DTO, :TOTAL,
                :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :NIT, :nomcliente
            DO
            BEGIN
            select VEND_NOMBRE from VENDEDORES where VEND_COD = :CODVEND INTO :NOMVEND;
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            SUSPEND;
            END
        END
    END
  ELSE
    BEGIN
    if (BIN_AND(TIPO, 1) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 31 INTO :NOMTIPO;
        FOR SELECT MAX(D.ARTI_COD), MAX(VEND_COD), SUM(FADE_CANT * FADE_FACTOR), SUM((FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO)*FACT_FACTOR), SUM(FADE_IVAMONTO*FACT_FACTOR), SUM(FADE_CONSUMO), SUM(FADE_TOTAL*FACT_FACTOR),
            MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD), MAX(F.terc_nit), MAX(F.fact_nomcliente)
            FROM FACTURAS_DETALLE D, FACTURAS F, PREFIJOS P, ARTICULO A
            WHERE F.FACT_ID = D.FACT_ID AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND D.ARTI_COD = A.arti_cod AND
            VEND_COD >= :DESDE AND VEND_COD <= :HASTA AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            FACT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY F.VEND_COD, F.TERC_NIT, D.ARTI_COD
            INTO :ARTICULO, :CODVEND, :CANTIDAD, :BASE, :IVA, :CONSUMO, :TOTAL,
            :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :nit, :nomcliente
            DO
            BEGIN
            select VEND_NOMBRE from VENDEDORES where VEND_COD = :CODVEND INTO :NOMVEND;
            SELECT C.ZONA_COD, ZONA_NOM FROM CLIENTES C, ZONAS Z WHERE C.zona_cod = Z.zona_cod AND C.terc_nit = :nit INTO :codzona, :nomzona;
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            if (CEROS = 'S') then
                SUSPEND;
            ELSE
                if ((BASE <> 0) AND (CANTIDAD <> 0)) then
                    SUSPEND;
            END /* FOR */
        END
    if (BIN_AND(TIPO, 2) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 32 INTO :NOMTIPO;
        FOR SELECT MAX(D.ARTI_COD), MAX(VEND_COD), SUM(RVDE_CANT * RVDE_FACTOR), SUM(RVDE_TOTAL-RVDE_IVAMONTO-RVDE_CONSUMO), SUM(RVDE_IVAMONTO), SUM(RVDE_CONSUMO), SUM(RVDE_TOTAL),
            MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD), MAX(R.terc_nit), MAX(R.revt_nomterc)
            FROM REMISIONES_VENTA_DETALLE D, REMISIONES_VENTA R, PREFIJOS P, ARTICULO A
            WHERE R.REVT_ID = D.REVT_ID AND P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = 32 AND D.ARTI_COD = A.arti_cod AND
            VEND_COD >= :DESDE AND VEND_COD <= :HASTA AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            REVT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY R.vend_cod, R.terc_nit, D.arti_cod
            INTO :ARTICULO, :CODVEND, :CANTIDAD, :BASE, :IVA, :CONSUMO, :TOTAL,
            :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :nit, :nomcliente
            DO
            BEGIN
            SELECT C.ZONA_COD, ZONA_NOM FROM CLIENTES C, ZONAS Z WHERE C.zona_cod = Z.zona_cod AND C.terc_nit = :nit INTO :codzona, :nomzona;
            select VEND_NOMBRE from VENDEDORES where VEND_COD = :CODVEND INTO :NOMVEND;
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            CANTIDAD = CANTIDAD * -1;
            BASE = BASE * -1;
            TOTAL = TOTAL * -1;
            IVA = IVA * -1;
            CONSUMO = CONSUMO * -1;
            if (CEROS = 'S') then
                SUSPEND;
            ELSE
                if ((BASE <> 0) AND (CANTIDAD <> 0)) then
                    SUSPEND;
            END /* FOR */
        END
    if (BIN_AND(TIPO, 4) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 33 INTO :NOMTIPO;
        FOR SELECT MAX(D.ARTI_COD), MAX(VEND_COD), SUM(DVDE_CANT * DVDE_FACTOR), SUM((DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO)*DEVT_FACTOR), SUM(DVDE_IVAMONTO*DEVT_FACTOR), SUM(DVDE_CONSUMO), SUM(DVDE_TOTAL*DEVT_FACTOR),
            MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD), MAX(V.terc_nit), MAX(V.devt_nomterc)
            FROM devoluciones_ventas_detalle D, DEVOLUCIONES_VENTAS V, PREFIJOS P, ARTICULO A
            WHERE V.DEVT_ID = D.DEVT_ID AND P.PREF_PRE = V.PREF_PRE AND P.TIDO_COD = 33 AND D.ARTI_COD = A.arti_cod AND
            VEND_COD >= :DESDE AND VEND_COD <= :HASTA AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            DEVT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY V.vend_cod, V.terc_nit, D.arti_cod
            INTO :ARTICULO, :CODVEND, :CANTIDAD, :BASE, :IVA, :CONSUMO, :TOTAL,
            :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :nit, :nomcliente
            DO
            BEGIN
            SELECT C.ZONA_COD, ZONA_NOM FROM CLIENTES C, ZONAS Z WHERE C.zona_cod = Z.zona_cod AND C.terc_nit = :nit INTO :codzona, :nomzona;
            select VEND_NOMBRE from VENDEDORES where VEND_COD = :CODVEND INTO :NOMVEND;
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            if (CEROS = 'S') then
                SUSPEND;
            ELSE
                if ((BASE <> 0) AND (CANTIDAD <> 0)) then
                    SUSPEND;
            END /* FOR */
        END
    if (BIN_AND(TIPO, 8) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 34 INTO :NOMTIPO;
        FOR SELECT MAX(D.ARTI_COD), MAX(VEND_COD), SUM(PEDE_CANT * PEDE_FACTOR), SUM((PEDE_TOTAL-PEDE_IVAMONTO-PEDE_CONSUMO)*PEDI_FACTOR), SUM(PEDE_IVAMONTO*PEDI_FACTOR), SUM(PEDE_CONSUMO), SUM(PEDE_TOTAL*PEDI_FACTOR),
            MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD), MAX(P.terc_nit), MAX(P.pedi_nomterc)
            FROM PEDIDOS_DETALLE D, PEDIDOS P, PREFIJOS R, ARTICULO A
            WHERE P.PEDI_ID = D.PEDI_ID AND P.PREF_PRE = R.PREF_PRE AND R.TIDO_COD = 34 AND D.ARTI_COD = A.arti_cod AND
            VEND_COD >= :DESDE AND VEND_COD <= :HASTA AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            PEDI_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY P.vend_cod, P.terc_nit, D.arti_cod
            INTO :ARTICULO, :CODVEND, :CANTIDAD, :BASE, :IVA, :CONSUMO, :TOTAL,
            :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :nit, :nomcliente
            DO
            BEGIN
            SELECT C.ZONA_COD, ZONA_NOM FROM CLIENTES C, ZONAS Z WHERE C.zona_cod = Z.zona_cod AND C.terc_nit = :nit INTO :codzona, :nomzona;
            select VEND_NOMBRE from VENDEDORES where VEND_COD = :CODVEND INTO :NOMVEND;
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            if (CEROS = 'S') then
                SUSPEND;
            ELSE
                if ((BASE <> 0) AND (CANTIDAD <> 0)) then
                    SUSPEND;
            END /* FOR */
        END
    if (BIN_AND(TIPO, 16) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 35 INTO :NOMTIPO;
        FOR SELECT MAX(D.ARTI_COD), MAX(VEND_COD), SUM(CTDE_CANT * CTDE_FACTOR), SUM((CTDE_TOTAL-CTDE_IVAMONTO-CTDE_CONSUMO)*COTI_FACTOR), SUM(CTDE_IVAMONTO*COTI_FACTOR), SUM(CTDE_CONSUMO), SUM(CTDE_TOTAL*COTI_FACTOR),
            MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD), MAX(C.terc_nit), MAX(C.coti_nomterc)
            FROM COTIZACIONES_DETALLE D, COTIZACIONES C, PREFIJOS P, ARTICULO A
            WHERE C.COTI_ID = D.COTI_ID AND P.PREF_PRE = C.PREF_PRE AND P.TIDO_COD = 35 AND D.ARTI_COD = A.arti_cod AND
            VEND_COD >= :DESDE AND VEND_COD <= :HASTA AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND COTI_FECHA >= :FECINI AND COTI_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            COTI_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY C.vend_cod, C.terc_nit, D.arti_cod
            INTO :ARTICULO, :CODVEND, :CANTIDAD, :BASE, :IVA, :CONSUMO, :TOTAL,
            :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :nit, :nomcliente
            DO
            BEGIN
            SELECT C.ZONA_COD, ZONA_NOM FROM CLIENTES C, ZONAS Z WHERE C.zona_cod = Z.zona_cod AND C.terc_nit = :nit INTO :codzona, :nomzona;
            select VEND_NOMBRE from VENDEDORES where VEND_COD = :CODVEND INTO :NOMVEND;
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            if (CEROS = 'S') then
                SUSPEND;
            ELSE
                if ((BASE <> 0) AND (CANTIDAD <> 0)) then
                    SUSPEND;
            END /* FOR */
        END
    END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER PROCEDURE REP_VENTAS_ARTICULO(
    TIPO INTEGER,
    ARTINI VARCHAR(20),
    ARTFIN VARCHAR(20),
    DETALLE CHAR(1),
    FECINI DATE,
    FECFIN DATE,
    GRPINI VARCHAR(3),
    GRPFIN VARCHAR(3),
    PTOINI INTEGER,
    PTOFIN INTEGER,
    ORDEN CHAR(1),
    AGRUPA CHAR(1),
    CEROS CHAR(1),
    SUBEMPRESA INTEGER)
RETURNS (
    ARTICULO VARCHAR(15),
    DESCRIPCION VARCHAR(60),
    CODGRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    CODSUBG VARCHAR(3),
    NOMSUBG VARCHAR(30),
    CODMARC VARCHAR(3),
    NOMMARC VARCHAR(30),
    UNIDAD VARCHAR(8),
    CANTIDAD NUMERIC(18,4),
    BASE NUMERIC(18,2),
    IVA NUMERIC(18,2),
    CONSUMO NUMERIC(18,2),
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    DTO NUMERIC(9,2),
    TRANSP VARCHAR(60),
    NOMTIPO VARCHAR(50))
AS
DECLARE VARIABLE CODINI VARCHAR(20);
DECLARE VARIABLE CODFIN VARCHAR(20);
DECLARE VARIABLE DESINI VARCHAR(20);
DECLARE VARIABLE DESFIN VARCHAR(20);
declare variable MARINI VARCHAR(3);
declare variable MARFIN VARCHAR(3);
declare variable NUMROWS INTEGER;
BEGIN
if (ORDEN = 'C') then
    BEGIN
    CODINI = ARTINI;
    CODFIN = ARTFIN;
    DESINI = '';
    DESFIN = 'zz';
    END
ELSE
    BEGIN
    DESINI = ARTINI;
    DESFIN = ARTFIN;
    CODINI = '0';
    CODFIN = 'zz';
    END
if (AGRUPA = 'G') then
    BEGIN
    MARINI = '';
    MARFIN = 'zz';
    END
ELSE
    if (AGRUPA = 'M') then
        BEGIN
        MARINI = GRPINI;
        MARFIN = GRPFIN;
        GRPINI = '';
        GRPFIN = 'zz';
        END
    ELSE
        BEGIN
        MARINI = '';
        MARFIN = 'zz';
        END
/* BORRA LA TABLA AUXILIAR */
DELETE FROM reportes_aux WHERE REPA_ID = 1 AND REPA_USER = USER;

if (DETALLE = 'N') then
    BEGIN
    if (BIN_AND(TIPO, 1) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 31 INTO :NOMTIPO;
        /* BORRA LA TABLA AUXILIAR */
        DELETE FROM reportes_aux WHERE REPA_ID = 1 AND REPA_USER = USER;

        FOR SELECT MAX(D.ARTI_COD), SUM(FADE_CANT * FADE_FACTOR), SUM(FACT_FACTOR*(FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO)),
            SUM(FACT_FACTOR*FADE_IVAMONTO), SUM(FADE_CONSUMO), MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD)
            FROM FACTURAS_DETALLE D, FACTURAS F, PREFIJOS P, ARTICULO A WHERE F.PTVT_ID >= :PTOINI AND F.PTVT_ID <= :PTOFIN AND
            F.FACT_ID = D.FACT_ID AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND D.ARTI_COD = A.arti_cod AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            FACT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY D.ARTI_COD
            INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,
            :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
            DO
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            if (CEROS = 'S') then
                INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (1, USER, :ARTICULO);
            SUSPEND;
            END
        if (CEROS = 'S') then
            BEGIN
            /* agregue los articulos sin factura */
            FOR SELECT ARTI_COD, 0, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND
                    A.ARTI_DES <= :DESFIN AND A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND
                    (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN)))
                INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,:DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                DO
                BEGIN
                SELECT COUNT(REPA_ARTICULO) FROM REPORTES_AUX WHERE REPA_ID = 1 AND REPA_USER = USER AND REPA_ARTICULO = :articulo INTO :numrows;
                if (numrows = 0) then
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        END

    if (BIN_AND(TIPO, 2) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 32 INTO :NOMTIPO;
        /* BORRA LA TABLA AUXILIAR */
        DELETE FROM reportes_aux WHERE REPA_ID = 1 AND REPA_USER = USER;

        FOR SELECT MAX(D.ARTI_COD), SUM(RVDE_CANT * RVDE_FACTOR), SUM((RVDE_TOTAL-RVDE_IVAMONTO-RVDE_CONSUMO)), SUM(RVDE_IVAMONTO),
            SUM(RVDE_CONSUMO), MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD)
            FROM REMISIONES_VENTA_DETALLE D, REMISIONES_VENTA R, PREFIJOS P, ARTICULO A WHERE R.PTVT_ID >= :PTOINI AND R.PTVT_ID <= :PTOFIN AND
            R.REVT_ID = D.REVT_ID AND P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = 32 AND D.ARTI_COD = A.arti_cod AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            REVT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY D.ARTI_COD
            INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,
            :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
            DO
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            if (CEROS = 'S') then
                INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (1, USER, :ARTICULO);
            SUSPEND;
            END
        if (CEROS = 'S') then
            BEGIN
            /* agregue los articulos sin factura */
            FOR SELECT ARTI_COD, 0, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND
                    A.ARTI_DES <= :DESFIN AND A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND
                    (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN)))
                INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,:DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                DO
                BEGIN
                SELECT COUNT(REPA_ARTICULO) FROM REPORTES_AUX WHERE REPA_ID = 1 AND REPA_USER = USER AND REPA_ARTICULO = :articulo INTO :numrows;
                if (numrows = 0) then
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        END

    if (BIN_AND(TIPO, 4) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 33 INTO :NOMTIPO;
        /* BORRA LA TABLA AUXILIAR */
        DELETE FROM reportes_aux WHERE REPA_ID = 1 AND REPA_USER = USER;

        FOR SELECT MAX(D.ARTI_COD), SUM(DVDE_CANT * DVDE_FACTOR), SUM(DEVT_FACTOR*(DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO)),
            SUM(DEVT_FACTOR*DVDE_IVAMONTO), SUM(DVDE_CONSUMO), MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD)
            FROM devoluciones_ventas_detalle D, DEVOLUCIONES_VENTAS V, PREFIJOS P, ARTICULO A WHERE V.PTVT_ID >= :PTOINI AND V.PTVT_ID <= :PTOFIN AND
            V.DEVT_ID = D.DEVT_ID AND P.PREF_PRE = V.PREF_PRE AND P.TIDO_COD = 33 AND D.ARTI_COD = A.arti_cod AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            DEVT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) AND ((DEVT_REMID = 0) or (DEVT_REMID IS NULL))
            GROUP BY D.ARTI_COD
            INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,
            :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
            DO
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            CANTIDAD = CANTIDAD * -1;
            BASE = BASE * -1;
            IVA = IVA * -1;
            CONSUMO = CONSUMO * -1;
            if (CEROS = 'S') then
                INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (1, USER, :ARTICULO);
            SUSPEND;
            END
        if (CEROS = 'S') then
            BEGIN
            /* agregue los articulos sin factura */
            FOR SELECT ARTI_COD, 0, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND
                    A.ARTI_DES <= :DESFIN AND A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND
                    (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN)))
                INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,:DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                DO
                BEGIN
                SELECT COUNT(REPA_ARTICULO) FROM REPORTES_AUX WHERE REPA_ID = 1 AND REPA_USER = USER AND REPA_ARTICULO = :articulo INTO :numrows;
                if (numrows = 0) then
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        END
    if (BIN_AND(TIPO, 8) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 34 INTO :NOMTIPO;
        /* BORRA LA TABLA AUXILIAR */
        DELETE FROM reportes_aux WHERE REPA_ID = 1 AND REPA_USER = USER;

        FOR SELECT MAX(D.ARTI_COD), SUM(PEDE_CANT * PEDE_FACTOR), SUM(PEDI_FACTOR*(PEDE_TOTAL-PEDE_IVAMONTO-PEDE_CONSUMO)),
            SUM(PEDI_FACTOR*PEDE_IVAMONTO), SUM(PEDE_CONSUMO),
            MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD)
            FROM PEDIDOS_DETALLE D, PEDIDOS P, PREFIJOS R, ARTICULO A WHERE P.PTVT_ID >= :PTOINI AND P.PTVT_ID <= :PTOFIN AND
            P.PEDI_ID = D.PEDI_ID AND P.PREF_PRE = R.PREF_PRE AND R.TIDO_COD = 34 AND D.ARTI_COD = A.arti_cod AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            PEDI_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY D.ARTI_COD
            INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,
            :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
            DO
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            if (CEROS = 'S') then
                INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (1, USER, :ARTICULO);
            SUSPEND;
            END
        if (CEROS = 'S') then
            BEGIN
            /* agregue los articulos sin factura */
            FOR SELECT ARTI_COD, 0, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND
                    A.ARTI_DES <= :DESFIN AND A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND
                    (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN)))
                INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,:DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                DO
                BEGIN
                SELECT COUNT(REPA_ARTICULO) FROM REPORTES_AUX WHERE REPA_ID = 1 AND REPA_USER = USER AND REPA_ARTICULO = :articulo INTO :numrows;
                if (numrows = 0) then
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        END
    if (BIN_AND(TIPO, 16) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 35 INTO :NOMTIPO;
        /* BORRA LA TABLA AUXILIAR */
        DELETE FROM reportes_aux WHERE REPA_ID = 1 AND REPA_USER = USER;

        FOR SELECT MAX(D.ARTI_COD), SUM(CTDE_CANT * CTDE_FACTOR), SUM(COTI_FACTOR*(CTDE_TOTAL-CTDE_IVAMONTO-CTDE_CONSUMO)),
            SUM(COTI_FACTOR*CTDE_IVAMONTO), SUM(CTDE_CONSUMO),
            MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD)
            FROM COTIZACIONES_DETALLE D, COTIZACIONES C, PREFIJOS P, ARTICULO A WHERE C.PTVT_ID >= :PTOINI AND C.PTVT_ID <= :PTOFIN AND
            C.COTI_ID = D.COTI_ID AND P.PREF_PRE = C.PREF_PRE AND P.TIDO_COD = 35 AND D.ARTI_COD = A.arti_cod AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND COTI_FECHA >= :FECINI AND COTI_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            COTI_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY D.ARTI_COD
            INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,
            :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
            DO
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            if (CEROS = 'S') then
                INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (1, USER, :ARTICULO);
            SUSPEND;
            END
        if (CEROS = 'S') then
            BEGIN
            /* agregue los articulos sin factura */
            FOR SELECT ARTI_COD, 0, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND
                    A.ARTI_DES <= :DESFIN AND A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND
                    (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN)))
                INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,:DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                DO
                BEGIN
                SELECT COUNT(REPA_ARTICULO) FROM REPORTES_AUX WHERE REPA_ID = 1 AND REPA_USER = USER AND REPA_ARTICULO = :articulo INTO :numrows;
                if (numrows = 0) then
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        END
    END
ELSE
  if (DETALLE = 'S') then
    BEGIN
    if (BIN_AND(TIPO, 1) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 31 INTO :NOMTIPO;
        FOR SELECT F.PREF_PRE, FACT_NUMERO, FACT_FECHA, D.ARTI_COD, FADE_CANT * FADE_FACTOR, (FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO)*FACT_FACTOR,
        FADE_IVAMONTO*FACT_FACTOR, FADE_CONSUMO, FADE_DTOPORC,
            ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD, FACT_TRANSP
            FROM FACTURAS F, FACTURAS_DETALLE D, PREFIJOS P, ARTICULO A WHERE F.PTVT_ID >= :PTOINI AND F.PTVT_ID <= :PTOFIN AND
                F.FACT_ID = D.FACT_ID AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND D.ARTI_COD = A.arti_cod AND
                A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
                A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND FACT_FECHA >= :FECINI AND
                (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
                FACT_FECHA <= :FECFIN AND FACT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            /*ORDER BY D.ARTI_COD, FACT_FECHA, FACT_ID, FADE_ITEM*/
            INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO, :DTO,
                :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :transp
            DO
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            SUSPEND;
            END
        END
    if (BIN_AND(TIPO, 2) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 32 INTO :NOMTIPO;
        FOR SELECT R.PREF_PRE, REVT_NUMERO, REVT_FECHA, D.ARTI_COD, RVDE_CANT * RVDE_FACTOR, (RVDE_TOTAL-RVDE_IVAMONTO-RVDE_CONSUMO), RVDE_IVAMONTO, RVDE_CONSUMO, RVDE_DTOPORC,
            ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD, REVT_TRANSP
            FROM REMISIONES_VENTA R, REMISIONES_VENTA_DETALLE D, PREFIJOS P, ARTICULO A
            WHERE R.REVT_ID = D.REVT_ID AND P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = 32 AND D.ARTI_COD = A.arti_cod AND
                A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
                A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN AND
                (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
                REVT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO, :DTO,
                :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :transp
            DO
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            SUSPEND;
            END
        END
    if (BIN_AND(TIPO, 4) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 33 INTO :NOMTIPO;
        FOR SELECT V.PREF_PRE, DEVT_NUMERO, DEVT_FECHA, D.ARTI_COD, DVDE_CANT * DVDE_FACTOR, (DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO)*DEVT_FACTOR,
            DVDE_IVAMONTO*DEVT_FACTOR, DVDE_CONSUMO, DVDE_DTOPORC,
            ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD 
            FROM DEVOLUCIONES_VENTAS V, DEVOLUCIONES_VENTAS_DETALLE D, PREFIJOS P, ARTICULO A WHERE V.PTVT_ID >= :PTOINI AND V.PTVT_ID <= :PTOFIN AND
                V.DEVT_ID = D.DEVT_ID AND P.PREF_PRE = V.PREF_PRE AND P.TIDO_COD = 33 AND D.ARTI_COD = A.arti_cod AND
                A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
                A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND
                (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
                DEVT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) AND ((DEVT_REMID = 0) or (DEVT_REMID IS NULL))
            /*ORDER BY D.ARTI_COD, DEVT_FECHA, DEVT_ID, DVDE_ITEM*/
            INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO, :DTO,
                :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
            DO
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            CANTIDAD = CANTIDAD * -1;
            BASE = BASE * -1;
            IVA = IVA * -1;
            CONSUMO = CONSUMO * -1;
            SUSPEND;
            END
        END
    if (BIN_AND(TIPO, 8) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 34 INTO :NOMTIPO;
        FOR SELECT P.PREF_PRE, PEDI_NUMERO, PEDI_FECHA, D.ARTI_COD, PEDE_CANT * PEDE_FACTOR, (PEDE_TOTAL-PEDE_IVAMONTO-PEDE_CONSUMO)*PEDI_FACTOR,
                PEDE_IVAMONTO*PEDI_FACTOR, PEDE_CONSUMO, PEDE_DTOPORC,
            ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD 
            FROM PEDIDOS P, PEDIDOS_DETALLE D, PREFIJOS R, ARTICULO A WHERE P.PTVT_ID >= :PTOINI AND P.PTVT_ID <= :PTOFIN AND
                P.PEDI_ID = D.PEDI_ID AND P.PREF_PRE = R.PREF_PRE AND R.TIDO_COD = 34 AND D.ARTI_COD = A.arti_cod AND
                A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
                A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND
                (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
                PEDI_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            /*ORDER BY D.ARTI_COD, PEDI_FECHA, PEDI_ID, PEDE_ITEM*/
            INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO, :DTO,
                :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
            DO
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            SUSPEND;
            END
        END
    if (BIN_AND(TIPO, 16) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 35 INTO :NOMTIPO;
        FOR SELECT C.PREF_PRE, COTI_NUMERO, COTI_FECHA, D.ARTI_COD, CTDE_CANT * CTDE_FACTOR, (CTDE_TOTAL-CTDE_IVAMONTO-CTDE_CONSUMO)*COTI_FACTOR,
                CTDE_IVAMONTO*COTI_FACTOR, CTDE_CONSUMO, CTDE_DTOPORC,
            ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD 
            FROM COTIZACIONES C, COTIZACIONES_DETALLE D, PREFIJOS P, ARTICULO A WHERE C.PTVT_ID >= :PTOINI AND C.PTVT_ID <= :PTOFIN AND
                C.COTI_ID = D.COTI_ID AND P.PREF_PRE = C.PREF_PRE AND P.TIDO_COD = 35 AND D.ARTI_COD = A.arti_cod AND
                A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
                A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND COTI_FECHA >= :FECINI AND COTI_FECHA <= :FECFIN AND
                (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
                COTI_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            /*ORDER BY D.ARTI_COD, COTI_FECHA, COTI_ID, CTDE_ITEM*/
            INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO, :DTO,
                :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
            DO
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            SUSPEND;
            END
        END
    END
  ELSE
    BEGIN
    if (BIN_AND(TIPO, 1) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 31 INTO :NOMTIPO;
        FOR SELECT MAX(D.ARTI_COD), SUM(FADE_CANT * FADE_FACTOR), SUM((FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO)*FACT_FACTOR),
            SUM(FACT_FACTOR*FADE_IVAMONTO), SUM(FADE_CONSUMO), MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD), MAX(FACT_TRANSP)
            FROM FACTURAS_DETALLE D, FACTURAS F, PREFIJOS P, ARTICULO A WHERE F.PTVT_ID >= :PTOINI AND F.PTVT_ID <= :PTOFIN AND
            F.FACT_ID = D.FACT_ID AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND D.ARTI_COD = A.arti_cod AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            FACT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY FACT_TRANSP, D.ARTI_COD
            INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,
            :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :transp
            DO
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            if (CEROS = 'S') then
                SUSPEND;
            ELSE
                if ((BASE <> 0) AND (CANTIDAD <> 0)) then
                    SUSPEND;
            END
        END

    if (BIN_AND(TIPO, 2) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 32 INTO :NOMTIPO;
        FOR SELECT MAX(D.ARTI_COD), SUM(RVDE_CANT * RVDE_FACTOR), SUM((RVDE_TOTAL-RVDE_IVAMONTO-RVDE_CONSUMO)), SUM(RVDE_IVAMONTO),
            SUM(RVDE_CONSUMO), MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD), MAX(REVT_TRANSP)
            FROM REMISIONES_VENTA_DETALLE D, REMISIONES_VENTA R, PREFIJOS P, ARTICULO A WHERE R.PTVT_ID >= :PTOINI AND R.PTVT_ID <= :PTOFIN AND
            R.REVT_ID = D.REVT_ID AND P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = 32 AND D.ARTI_COD = A.arti_cod AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            REVT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY REVT_TRANSP, D.ARTI_COD
            INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,
            :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :transp
            DO
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            if (CEROS = 'S') then
                SUSPEND;
            ELSE
                if ((BASE <> 0) AND (CANTIDAD <> 0)) then
                    SUSPEND;
            END
        END
    END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER PROCEDURE REP_VENTAS_CLIENTE(
    TIPO INTEGER,
    NITDESDE VARCHAR(20),
    NITHASTA VARCHAR(20),
    FECINI DATE,
    FECFIN DATE,
    DETALLE CHAR(1),
    ORDEN CHAR(1),
    CEROS CHAR(1),
    SUBEMPRESA INTEGER)
RETURNS (
    NIT VARCHAR(20),
    NOMBRE VARCHAR(60),
    TELEFONO VARCHAR(40),
    CIUDAD VARCHAR(40),
    CODZONA VARCHAR(2),
    NOMZONA VARCHAR(30),
    NOMTIPO VARCHAR(50),
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(6),
    ID INTEGER,
    FECDOC DATE,
    CANTIDAD INTEGER,
    SUBTOTAL NUMERIC(18,2),
    DTO NUMERIC(18,2),
    ADICIONAL NUMERIC(18,2),
    IVA NUMERIC(18,2),
    EXTRA NUMERIC(18,2),
    TOTAL NUMERIC(18,2),
    RTFTE NUMERIC(18,2),
    RTIVA NUMERIC(18,2),
    RTICA NUMERIC(18,2),
    NETO NUMERIC(18,2))
AS
DECLARE VARIABLE NITINI VARCHAR(15);
DECLARE VARIABLE NITFIN VARCHAR(15);
DECLARE VARIABLE NOMINI VARCHAR(15);
DECLARE VARIABLE NOMFIN VARCHAR(15);
BEGIN
if (ORDEN = 'C') then
    BEGIN
    NITINI = NITDESDE;
    NITFIN = NITHASTA;
    NOMINI = '';
    NOMFIN = 'zz';
    END
ELSE
    BEGIN
    NITINI = NITDESDE;
    NITFIN = NITHASTA;
    NOMINI = '';
    NOMFIN = 'zz';
    END

SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = :TIPO INTO :NOMTIPO;
if (DETALLE = 'N') then
    BEGIN
    if (BIN_AND(TIPO, 1) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 31 INTO :NOMTIPO;
        FOR SELECT MAX(T.TERC_NIT), MAX(TERC_NOM), MAX(TERC_TEL), MAX(TERC_CIU), MAX(ZONA_COD),
            COUNT(*), SUM(FACT_DTOMONTO), SUM(FACT_ADICIONAL), SUM(FACT_IVAMONTO), SUM(FACT_EXTRA), SUM(FACT_RTFTEMONTO), SUM(FACT_RTIVAMONTO), SUM(FACT_RTICAMONTO), SUM(FACT_TOTAL)
            FROM FACTURAS F, PREFIJOS P, terceros T, CLIENTES C
            where C.TERC_NIT = T.TERC_NIT AND T.TERC_CLIE = 'S' AND T.TERC_NIT >= :NITINI AND T.TERC_NIT <= :NITFIN AND TERC_NOM >= :NOMINI AND TERC_NOM <= :NOMFIN
             AND F.TERC_NIT = T.terc_nit AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND FACT_ANULADO = 'N'
             AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY F.terc_nit
            INTO :NIT, :NOMBRE, :TELEFONO, :CIUDAD, :CODZONA, :CANTIDAD, :DTO, :ADICIONAL, :IVA, :EXTRA, :RTFTE, :RTIVA, :RTICA, :TOTAL
            DO
            BEGIN
            SELECT ZONA_NOM FROM ZONAS WHERE ZONA_COD = :codzona INTO :NOMZONA;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (DTO IS NULL) then
                DTO = 0;
            if (ADICIONAL IS NULL) then
                ADICIONAL = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (EXTRA IS NULL) then
                EXTRA = 0;
            if (RTFTE IS NULL) then
                RTFTE = 0;
            if (RTIVA IS NULL) then
                RTIVA = 0;
            if (RTICA IS NULL) then
                RTICA = 0;
            SUBTOTAL = TOTAL - EXTRA - IVA - ADICIONAL + DTO;
            NETO = TOTAL - RTFTE - RTIVA - RTICA;
            if (CEROS = 'S') then
              SUSPEND;
            ELSE
              if (CANTIDAD > 0) then
                SUSPEND;
            END
        END
    if (BIN_AND(TIPO, 2) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 32 INTO :NOMTIPO;
        FOR SELECT MAX(T.TERC_NIT), MAX(TERC_NOM), MAX(TERC_TEL), MAX(TERC_CIU), MAX(ZONA_COD),
            COUNT(*), 0, 0, SUM(REVT_IVAMONTO), 0, 0, 0, 0, SUM(REVT_TOTAL)
            FROM REMISIONES_VENTA R, PREFIJOS P, terceros T, CLIENTES C
            where C.TERC_NIT = T.TERC_NIT AND T.TERC_CLIE = 'S' AND T.TERC_NIT >= :NITINI AND T.TERC_NIT <= :NITFIN AND TERC_NOM >= :NOMINI AND TERC_NOM <= :NOMFIN
             AND R.TERC_NIT = T.terc_nit AND REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN AND REVT_ANULADO = 'N'
             AND P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = 32 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY R.terc_nit
            INTO :NIT, :NOMBRE, :TELEFONO, :CIUDAD, :CODZONA, :CANTIDAD, :DTO, :ADICIONAL, :IVA, :EXTRA, :RTFTE, :RTIVA, :RTICA, :TOTAL
            DO
            BEGIN
            SELECT ZONA_NOM FROM ZONAS WHERE ZONA_COD = :codzona INTO :NOMZONA;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (DTO IS NULL) then
                DTO = 0;
            if (ADICIONAL IS NULL) then
                ADICIONAL = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (EXTRA IS NULL) then
                EXTRA = 0;
            if (RTFTE IS NULL) then
                RTFTE = 0;
            if (RTIVA IS NULL) then
                RTIVA = 0;
            if (RTICA IS NULL) then
                RTICA = 0;
            SUBTOTAL = TOTAL - EXTRA - IVA - ADICIONAL + DTO;
            NETO = TOTAL - RTFTE - RTIVA - RTICA;
            if (CEROS = 'S') then
              SUSPEND;
            ELSE
              if (CANTIDAD > 0) then
                SUSPEND;
            END
        END
    if (BIN_AND(TIPO, 4) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 33 INTO :NOMTIPO;
        FOR SELECT MAX(T.TERC_NIT), MAX(TERC_NOM), MAX(TERC_TEL), MAX(TERC_CIU), MAX(ZONA_COD),
            COUNT(*), SUM(DEVT_DTOMONTO), SUM(DEVT_ADICIONAL), SUM(DEVT_IVAMONTO), SUM(DEVT_EXTRA), SUM(DEVT_RTFTEMONTO), SUM(DEVT_RTIVAMONTO), SUM(DEVT_RTICAMONTO), SUM(DEVT_TOTAL)
            FROM DEVOLUCIONES_VENTAS V, PREFIJOS P, terceros T, CLIENTES C
            where C.TERC_NIT = T.TERC_NIT AND T.TERC_CLIE = 'S' AND T.TERC_NIT >= :NITINI AND T.TERC_NIT <= :NITFIN AND TERC_NOM >= :NOMINI AND TERC_NOM <= :NOMFIN
             AND V.TERC_NIT = T.terc_nit AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND DEVT_ANULADO = 'N'
             AND P.PREF_PRE = V.PREF_PRE AND P.TIDO_COD = 33 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) AND ((DEVT_REMID = 0) or (DEVT_REMID IS NULL))
            GROUP BY V.terc_nit
            INTO :NIT, :NOMBRE, :TELEFONO, :CIUDAD, :CODZONA, :CANTIDAD, :DTO, :ADICIONAL, :IVA, :EXTRA, :RTFTE, :RTIVA, :RTICA, :TOTAL
            DO
            BEGIN
            SELECT ZONA_NOM FROM ZONAS WHERE ZONA_COD = :codzona INTO :NOMZONA;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (DTO IS NULL) then
                DTO = 0;
            if (ADICIONAL IS NULL) then
                ADICIONAL = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (EXTRA IS NULL) then
                EXTRA = 0;
            if (RTFTE IS NULL) then
                RTFTE = 0;
            if (RTIVA IS NULL) then
                RTIVA = 0;
            if (RTICA IS NULL) then
                RTICA = 0;
            SUBTOTAL = TOTAL - EXTRA - IVA - ADICIONAL + DTO;
            NETO = TOTAL - RTFTE - RTIVA - RTICA;
            CANTIDAD = CANTIDAD * -1;
            SUBTOTAL = SUBTOTAL * -1;
            TOTAL = TOTAL * -1;
            IVA = IVA * -1;
            EXTRA = EXTRA * -1;
            DTO = DTO * -1;
            ADICIONAL = ADICIONAL * -1;
            RTFTE = RTFTE * -1;
            RTIVA = RTIVA * -1;
            RTICA = RTICA * -1;
            if (CEROS = 'S') then
              SUSPEND;
            ELSE
              if (CANTIDAD > 0) then
                SUSPEND;
            END
        END
    if (BIN_AND(TIPO, 8) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 34 INTO :NOMTIPO;
        FOR SELECT MAX(T.TERC_NIT), MAX(TERC_NOM), MAX(TERC_TEL), MAX(TERC_CIU), MAX(ZONA_COD),
            COUNT(*), SUM(PEDI_DTOMONTO), SUM(PEDI_ADICIONAL), SUM(PEDI_IVAMONTO), SUM(PEDI_EXTRA), 0, 0, 0, SUM(PEDI_TOTAL)
            FROM PEDIDOS P, PREFIJOS PR, terceros T, CLIENTES C
            where C.TERC_NIT = T.TERC_NIT AND T.TERC_CLIE = 'S' AND T.TERC_NIT >= :NITINI AND T.TERC_NIT <= :NITFIN AND TERC_NOM >= :NOMINI AND TERC_NOM <= :NOMFIN
             AND P.TERC_NIT = T.terc_nit AND PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND PEDI_ANULADO = 'N'
             AND PR.PREF_PRE = P.PREF_PRE AND P.TIDO_COD = 34 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY P.terc_nit
            INTO :NIT, :NOMBRE, :TELEFONO, :CIUDAD, :CODZONA, :CANTIDAD, :DTO, :ADICIONAL, :IVA, :EXTRA, :RTFTE, :RTIVA, :RTICA, :TOTAL
            DO
            BEGIN
            SELECT ZONA_NOM FROM ZONAS WHERE ZONA_COD = :codzona INTO :NOMZONA;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (DTO IS NULL) then
                DTO = 0;
            if (ADICIONAL IS NULL) then
                ADICIONAL = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (EXTRA IS NULL) then
                EXTRA = 0;
            if (RTFTE IS NULL) then
                RTFTE = 0;
            if (RTIVA IS NULL) then
                RTIVA = 0;
            if (RTICA IS NULL) then
                RTICA = 0;
            SUBTOTAL = TOTAL - EXTRA - IVA - ADICIONAL + DTO;
            NETO = TOTAL - RTFTE - RTIVA - RTICA;
            if (CEROS = 'S') then
              SUSPEND;
            ELSE
              if (CANTIDAD > 0) then
                SUSPEND;
            END
        END
    if (BIN_AND(TIPO, 16) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 35 INTO :NOMTIPO;
        FOR SELECT MAX(T.TERC_NIT), MAX(TERC_NOM), MAX(TERC_TEL), MAX(TERC_CIU), MAX(ZONA_COD),
            COUNT(*), SUM(COTI_DTOMONTO), SUM(COTI_ADICIONAL), SUM(COTI_IVAMONTO), SUM(COTI_EXTRA), 0, 0, 0, SUM(COTI_TOTAL)
            FROM COTIZACIONES CT, PREFIJOS P, terceros T, CLIENTES C
            where C.TERC_NIT = T.TERC_NIT AND T.TERC_CLIE = 'S' AND T.TERC_NIT >= :NITINI AND T.TERC_NIT <= :NITFIN AND TERC_NOM >= :NOMINI AND TERC_NOM <= :NOMFIN
             AND CT.TERC_NIT = T.terc_nit AND COTI_FECHA >= :FECINI AND COTI_FECHA <= :FECFIN AND COTI_ANULADO = 'N'
             AND P.PREF_PRE = CT.PREF_PRE AND P.TIDO_COD = 35 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY C.terc_nit
            INTO :NIT, :NOMBRE, :TELEFONO, :CIUDAD, :CODZONA, :CANTIDAD, :DTO, :ADICIONAL, :IVA, :EXTRA, :RTFTE, :RTIVA, :RTICA, :TOTAL
            DO
            BEGIN
            SELECT ZONA_NOM FROM ZONAS WHERE ZONA_COD = :codzona INTO :NOMZONA;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (DTO IS NULL) then
                DTO = 0;
            if (ADICIONAL IS NULL) then
                ADICIONAL = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (EXTRA IS NULL) then
                EXTRA = 0;
            if (RTFTE IS NULL) then
                RTFTE = 0;
            if (RTIVA IS NULL) then
                RTIVA = 0;
            if (RTICA IS NULL) then
                RTICA = 0;
            SUBTOTAL = TOTAL - EXTRA - IVA - ADICIONAL + DTO;
            NETO = TOTAL - RTFTE - RTIVA - RTICA;
            if (CEROS = 'S') then
              SUSPEND;
            ELSE
              if (CANTIDAD > 0) then
                SUSPEND;
            END
        END
    END
ELSE
    BEGIN
    if (BIN_AND(TIPO, 1) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 31 INTO :NOMTIPO;
        FOR SELECT FACT_ID, F.PREF_PRE, FACT_NUMERO, FACT_FECHA, FACT_DTOMONTO, FACT_ADICIONAL, FACT_IVAMONTO, FACT_EXTRA, FACT_TOTAL, FACT_RTFTEMONTO, FACT_RTIVAMONTO, FACT_RTICAMONTO, T.TERC_NIT, TERC_NOM, ZONA_COD, TERC_TEL, TERC_CIU
            FROM FACTURAS F, PREFIJOS P, terceros T, CLIENTES C
            where C.TERC_NIT = T.TERC_NIT AND T.TERC_CLIE = 'S' AND T.TERC_NIT >= :NITINI AND T.TERC_NIT <= :NITFIN AND TERC_NOM >= :NOMINI AND TERC_NOM <= :NOMFIN
             AND F.TERC_NIT = T.terc_nit AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND FACT_ANULADO = 'N'
             AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            ORDER BY FACT_FECHA, FACT_ID
            INTO :ID, :PREFIJO, :NUMERO, :FECDOC, :DTO, :ADICIONAL, :IVA, :EXTRA, :TOTAL, :RTFTE, :RTIVA, :RTICA, :nit, :nombre, :codzona, :telefono, :ciudad
            DO
            BEGIN
            SELECT ZONA_NOM FROM ZONAS WHERE ZONA_COD = :codzona INTO :NOMZONA;
            SUBTOTAL = TOTAL - EXTRA - IVA - ADICIONAL + DTO;
            NETO = TOTAL - RTFTE - RTIVA - RTICA;
            SUSPEND;
            END
        END
    if (BIN_AND(TIPO, 2) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 32 INTO :NOMTIPO;
        FOR SELECT REVT_ID, R.PREF_PRE, REVT_NUMERO, REVT_FECHA, 0, 0, REVT_IVAMONTO, 0, REVT_TOTAL, 0, 0, 0, T.TERC_NIT, TERC_NOM, ZONA_COD, TERC_TEL, TERC_CIU
            FROM REMISIONES_VENTA R, PREFIJOS P, terceros T, CLIENTES C
            where C.TERC_NIT = T.TERC_NIT AND T.TERC_CLIE = 'S' AND T.TERC_NIT >= :NITINI AND T.TERC_NIT <= :NITFIN AND TERC_NOM >= :NOMINI AND TERC_NOM <= :NOMFIN
             AND R.TERC_NIT = T.terc_nit AND REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN AND REVT_ANULADO = 'N'
             AND P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = 32 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            ORDER BY REVT_FECHA, REVT_ID
            INTO :ID, :PREFIJO, :NUMERO, :FECDOC, :DTO, :ADICIONAL, :IVA, :EXTRA, :TOTAL, :RTFTE, :RTIVA, :RTICA, :nit, :nombre, :codzona, :telefono, :ciudad
            DO
            BEGIN
            SELECT ZONA_NOM FROM ZONAS WHERE ZONA_COD = :codzona INTO :NOMZONA;
            SUBTOTAL = TOTAL - EXTRA - IVA - ADICIONAL + DTO;
            NETO = TOTAL - RTFTE - RTIVA - RTICA;
            SUSPEND;
            END
        END
    if (BIN_AND(TIPO, 4) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 33 INTO :NOMTIPO;
        FOR SELECT DEVT_ID, V.PREF_PRE, DEVT_NUMERO, DEVT_FECHA, DEVT_DTOMONTO, DEVT_ADICIONAL, DEVT_IVAMONTO, DEVT_EXTRA, DEVT_TOTAL, DEVT_RTFTEMONTO, DEVT_RTIVAMONTO, DEVT_RTICAMONTO, T.TERC_NIT, TERC_NOM, ZONA_COD, TERC_TEL, TERC_CIU
            FROM DEVOLUCIONES_VENTAS V, PREFIJOS P, terceros T, CLIENTES C
            where C.TERC_NIT = T.TERC_NIT AND T.TERC_CLIE = 'S' AND T.TERC_NIT >= :NITINI AND T.TERC_NIT <= :NITFIN AND TERC_NOM >= :NOMINI AND TERC_NOM <= :NOMFIN
             AND V.TERC_NIT = T.terc_nit AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND DEVT_ANULADO = 'N'
             AND P.PREF_PRE = V.PREF_PRE AND P.TIDO_COD = 33 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) AND ((DEVT_REMID = 0) or (DEVT_REMID IS NULL))
            ORDER BY DEVT_FECHA, DEVT_ID
            INTO :ID, :PREFIJO, :NUMERO, :FECDOC, :DTO, :ADICIONAL, :IVA, :EXTRA, :TOTAL, :RTFTE, :RTIVA, :RTICA, :nit, :nombre, :codzona, :telefono, :ciudad
            DO
            BEGIN
            SELECT ZONA_NOM FROM ZONAS WHERE ZONA_COD = :codzona INTO :NOMZONA;
            SUBTOTAL = TOTAL - EXTRA - IVA - ADICIONAL + DTO;
            NETO = TOTAL - RTFTE - RTIVA - RTICA;
            CANTIDAD = CANTIDAD * -1;
            SUBTOTAL = SUBTOTAL * -1;
            TOTAL = TOTAL * -1;
            IVA = IVA * -1;
            EXTRA = EXTRA * -1;
            DTO = DTO * -1;
            ADICIONAL = ADICIONAL * -1;
            RTFTE = RTFTE * -1;
            RTIVA = RTIVA * -1;
            RTICA = RTICA * -1;
            SUSPEND;
            END
        END
    if (BIN_AND(TIPO, 4) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 34 INTO :NOMTIPO;
        FOR SELECT PEDI_ID, P.PREF_PRE, PEDI_NUMERO, PEDI_FECHA, PEDI_DTOMONTO, PEDI_ADICIONAL, PEDI_IVAMONTO, PEDI_EXTRA, PEDI_TOTAL, 0, 0, 0, T.TERC_NIT, TERC_NOM, ZONA_COD, TERC_TEL, TERC_CIU
            FROM PEDIDOS P, PREFIJOS PR, terceros T, CLIENTES C
            where C.TERC_NIT = T.TERC_NIT AND T.TERC_CLIE = 'S' AND T.TERC_NIT >= :NITINI AND T.TERC_NIT <= :NITFIN AND TERC_NOM >= :NOMINI AND TERC_NOM <= :NOMFIN
             AND P.TERC_NIT = T.terc_nit AND PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND PEDI_ANULADO = 'N'
             AND P.PREF_PRE = PR.PREF_PRE AND P.TIDO_COD = 34 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            ORDER BY PEDI_FECHA, PEDI_ID
            INTO :ID, :PREFIJO, :NUMERO, :FECDOC, :DTO, :ADICIONAL, :IVA, :EXTRA, :TOTAL, :RTFTE, :RTIVA, :RTICA, :nit, :nombre, :codzona, :telefono, :ciudad
            DO
            BEGIN
            SELECT ZONA_NOM FROM ZONAS WHERE ZONA_COD = :codzona INTO :NOMZONA;
            SUBTOTAL = TOTAL - EXTRA - IVA - ADICIONAL + DTO;
            NETO = TOTAL - RTFTE - RTIVA - RTICA;
            SUSPEND;
            END
        END
    if (BIN_AND(TIPO, 4) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 35 INTO :NOMTIPO;
        FOR SELECT COTI_ID, CT.PREF_PRE, COTI_NUMERO, COTI_FECHA, COTI_DTOMONTO, COTI_ADICIONAL, COTI_IVAMONTO, COTI_EXTRA, COTI_TOTAL, 0, 0, 0, T.TERC_NIT, TERC_NOM, ZONA_COD, TERC_TEL, TERC_CIU
            FROM COTIZACIONES CT, PREFIJOS P, terceros T, CLIENTES C
            where C.TERC_NIT = T.TERC_NIT AND T.TERC_CLIE = 'S' AND T.TERC_NIT >= :NITINI AND T.TERC_NIT <= :NITFIN AND TERC_NOM >= :NOMINI AND TERC_NOM <= :NOMFIN
             AND CT.TERC_NIT = T.terc_nit AND COTI_FECHA >= :FECINI AND COTI_FECHA <= :FECFIN AND COTI_ANULADO = 'N'
             AND P.PREF_PRE = CT.PREF_PRE AND P.TIDO_COD = 35 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            ORDER BY COTI_FECHA, COTI_ID
            INTO :ID, :PREFIJO, :NUMERO, :FECDOC, :DTO, :ADICIONAL, :IVA, :EXTRA, :TOTAL, :RTFTE, :RTIVA, :RTICA, :nit, :nombre, :codzona, :telefono, :ciudad
            DO
            BEGIN
            SELECT ZONA_NOM FROM ZONAS WHERE ZONA_COD = :codzona INTO :NOMZONA;
            SUBTOTAL = TOTAL - EXTRA - IVA - ADICIONAL + DTO;
            NETO = TOTAL - RTFTE - RTIVA - RTICA;
            SUSPEND;
            END
        END
    END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER PROCEDURE REP_VENTAS_VENDEDOR(
    TIPO INTEGER,
    DESDE VARCHAR(20),
    HASTA VARCHAR(20),
    FECINI DATE,
    FECFIN DATE,
    DETALLE CHAR(1),
    CEROS CHAR(1),
    SUBEMPRESA INTEGER)
RETURNS (
    CODVEND INTEGER,
    NOMVEND VARCHAR(60),
    NOMTIPO VARCHAR(50),
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(6),
    NIT VARCHAR(20),
    NOMBRE VARCHAR(60),
    ID INTEGER,
    FECDOC DATE,
    CANTIDAD INTEGER,
    SUBTOTAL NUMERIC(18,2),
    DTO NUMERIC(18,2),
    ADICIONAL NUMERIC(18,2),
    CONSUMO NUMERIC(18,2),
    IVA NUMERIC(18,2),
    EXTRA NUMERIC(18,2),
    TOTAL NUMERIC(18,2),
    RTFTE NUMERIC(18,2),
    RTIVA NUMERIC(18,2),
    RTICA NUMERIC(18,2),
    NETO NUMERIC(18,2))
AS
BEGIN
if (DETALLE = 'N') then
    BEGIN
    NIT = '';
    NOMBRE = '';
    if (BIN_AND(TIPO, 1) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 31 INTO :NOMTIPO;
        FOR SELECT MAX(F.VEND_COD), MAX(VEND_NOMBRE), COUNT(*), SUM(FACT_DTOMONTO), SUM(FACT_ADICIONAL), SUM(FACT_IVAMONTO), SUM(FACT_EXTRA), SUM(FACT_RTFTEMONTO), SUM(FACT_RTIVAMONTO), SUM(FACT_RTICAMONTO), SUM(FACT_TOTAL)
            FROM FACTURAS F, PREFIJOS P, VENDEDORES V
            WHERE F.VEND_COD >= :DESDE AND F.VEND_COD <= :HASTA AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND FACT_ANULADO = 'N'
             AND F.vend_cod = V.vend_cod AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND ((P.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY F.VEND_COD
            INTO :CODVEND, :NOMVEND, :CANTIDAD, :DTO, :ADICIONAL, :IVA, :EXTRA, :RTFTE, :RTIVA, :RTICA, :TOTAL
            DO
            BEGIN
            SELECT SUM(FADE_CONSUMO) FROM FACTURAS_DETALLE D, FACTURAS F WHERE F.FACT_ID = D.FACT_ID AND
                VEND_COD = :CODVEND AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND FACT_ANULADO = 'N'
                INTO :CONSUMO;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (DTO IS NULL) then
                DTO = 0;
            if (ADICIONAL IS NULL) then
                ADICIONAL = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (EXTRA IS NULL) then
                EXTRA = 0;
            if (RTFTE IS NULL) then
                RTFTE = 0;
            if (RTIVA IS NULL) then
                RTIVA = 0;
            if (RTICA IS NULL) then
                RTICA = 0;
            SUBTOTAL = TOTAL - EXTRA - IVA - ADICIONAL + DTO - CONSUMO;
            NETO = TOTAL - RTFTE - RTIVA - RTICA;
            if (CEROS = 'S') then
              SUSPEND;
            ELSE
              if (CANTIDAD > 0) then
                SUSPEND;
            END
        END
    if (BIN_AND(TIPO, 2) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 32 INTO :NOMTIPO;
        FOR SELECT MAX(R.VEND_COD), MAX(VEND_NOMBRE), COUNT(*), 0, 0, SUM(REVT_IVAMONTO), 0, 0, 0, 0, SUM(REVT_TOTAL)
            FROM REMISIONES_VENTA R, PREFIJOS P, VENDEDORES V
            WHERE R.VEND_COD >= :DESDE AND R.VEND_COD <= :HASTA
             AND R.vend_cod = V.vend_cod AND REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN AND REVT_ANULADO = 'N'
             AND P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = 32 AND ((P.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY R.VEND_COD
            INTO :CODVEND, :NOMVEND, :CANTIDAD, :DTO, :ADICIONAL, :IVA, :EXTRA, :RTFTE, :RTIVA, :RTICA, :TOTAL
            DO
            BEGIN
            SELECT SUM(RVDE_CONSUMO) FROM REMISIONES_VENTA R, REMISIONES_VENTA_DETALLE D WHERE R.REVT_ID = D.REVT_ID AND
                VEND_COD = :CODVEND AND REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN AND REVT_ANULADO = 'N'
                INTO :CONSUMO;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (DTO IS NULL) then
                DTO = 0;
            if (ADICIONAL IS NULL) then
                ADICIONAL = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (EXTRA IS NULL) then
                EXTRA = 0;
            if (RTFTE IS NULL) then
                RTFTE = 0;
            if (RTIVA IS NULL) then
                RTIVA = 0;
            if (RTICA IS NULL) then
                RTICA = 0;
            SUBTOTAL = TOTAL - EXTRA - IVA - ADICIONAL + DTO - CONSUMO;
            NETO = TOTAL - RTFTE - RTIVA - RTICA;
            if (CEROS = 'S') then
              SUSPEND;
            ELSE
              if (CANTIDAD > 0) then
                SUSPEND;
            END
        END
    if (BIN_AND(TIPO, 4) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 33 INTO :NOMTIPO;
        FOR SELECT MAX(D.VEND_COD), MAX(VEND_NOMBRE), COUNT(*), SUM(DEVT_DTOMONTO), SUM(DEVT_ADICIONAL), SUM(DEVT_IVAMONTO), SUM(DEVT_EXTRA), SUM(DEVT_RTFTEMONTO), SUM(DEVT_RTIVAMONTO), SUM(DEVT_RTICAMONTO), SUM(DEVT_TOTAL)
            FROM DEVOLUCIONES_VENTAS D, PREFIJOS P, VENDEDORES V
            WHERE D.VEND_COD >= :DESDE AND D.VEND_COD <= :HASTA
             AND D.vend_cod = V.vend_cod AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND DEVT_ANULADO = 'N'
             AND P.PREF_PRE = D.PREF_PRE AND P.TIDO_COD = 33 AND ((P.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) AND ((DEVT_REMID = 0) or (DEVT_REMID IS NULL))
            GROUP BY D.VEND_COD
            INTO :CODVEND, :NOMVEND, :CANTIDAD, :DTO, :ADICIONAL, :IVA, :EXTRA, :RTFTE, :RTIVA, :RTICA, :TOTAL
            DO
            BEGIN
            SELECT SUM(DVDE_CONSUMO) FROM DEVOLUCIONES_VENTAS V, DEVOLUCIONES_VENTAS_DETALLE D WHERE V.DEVT_ID = D.DEVT_ID AND
                VEND_COD = :CODVEND AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND DEVT_ANULADO = 'N'
                INTO :CONSUMO;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (DTO IS NULL) then
                DTO = 0;
            if (ADICIONAL IS NULL) then
                ADICIONAL = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (EXTRA IS NULL) then
                EXTRA = 0;
            if (RTFTE IS NULL) then
                RTFTE = 0;
            if (RTIVA IS NULL) then
                RTIVA = 0;
            if (RTICA IS NULL) then
                RTICA = 0;
            SUBTOTAL = TOTAL - EXTRA - IVA - ADICIONAL + DTO - CONSUMO;
            NETO = TOTAL - RTFTE - RTIVA - RTICA;
            CANTIDAD = CANTIDAD * -1;
            SUBTOTAL = SUBTOTAL * -1;
            TOTAL = TOTAL * -1;
            IVA = IVA * -1;
            EXTRA = EXTRA * -1;
            DTO = DTO * -1;
            ADICIONAL = ADICIONAL * -1;
            RTFTE = RTFTE * -1;
            RTIVA = RTIVA * -1;
            RTICA = RTICA * -1;
            if (CEROS = 'S') then
              SUSPEND;
            ELSE
              if (CANTIDAD > 0) then
                SUSPEND;
            END
        END
    if (BIN_AND(TIPO, 8) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 34 INTO :NOMTIPO;
        FOR SELECT MAX(P.VEND_COD), MAX(VEND_NOMBRE), COUNT(*), SUM(PEDI_DTOMONTO), SUM(PEDI_ADICIONAL), SUM(PEDI_IVAMONTO), SUM(PEDI_EXTRA), 0, 0, 0, SUM(PEDI_TOTAL)
            FROM PEDIDOS P, PREFIJOS PR, VENDEDORES V
            WHERE V.VEND_COD >= :DESDE AND V.VEND_COD <= :HASTA
             AND P.vend_cod = V.vend_cod AND PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND PEDI_ANULADO = 'N'
             AND P.PREF_PRE = PR.PREF_PRE AND PR.TIDO_COD = 34 AND ((PR.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY P.VEND_COD
            INTO :CODVEND, :NOMVEND, :CANTIDAD, :DTO, :ADICIONAL, :IVA, :EXTRA, :RTFTE, :RTIVA, :RTICA, :TOTAL
            DO
            BEGIN
            SELECT SUM(PEDE_CONSUMO) FROM PEDIDOS P, PEDIDOS_DETALLE D WHERE P.PEDI_ID = D.PEDI_ID AND
                VEND_COD = :CODVEND AND PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND PEDI_ANULADO = 'N'
                INTO :CONSUMO;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (DTO IS NULL) then
                DTO = 0;
            if (ADICIONAL IS NULL) then
                ADICIONAL = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (EXTRA IS NULL) then
                EXTRA = 0;
            if (RTFTE IS NULL) then
                RTFTE = 0;
            if (RTIVA IS NULL) then
                RTIVA = 0;
            if (RTICA IS NULL) then
                RTICA = 0;
            SUBTOTAL = TOTAL - EXTRA - IVA - ADICIONAL + DTO - CONSUMO;
            NETO = TOTAL - RTFTE - RTIVA - RTICA;
            if (CEROS = 'S') then
              SUSPEND;
            ELSE
              if (CANTIDAD > 0) then
                SUSPEND;
            END
        END
    if (BIN_AND(TIPO, 16) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 35 INTO :NOMTIPO;
        FOR SELECT MAX(C.VEND_COD), MAX(VEND_NOMBRE), COUNT(*), SUM(COTI_DTOMONTO), SUM(COTI_ADICIONAL), SUM(COTI_IVAMONTO), SUM(COTI_EXTRA), 0, 0, 0, SUM(COTI_TOTAL)
            FROM COTIZACIONES C, PREFIJOS P, VENDEDORES V
            WHERE V.VEND_COD >= :DESDE AND V.VEND_COD <= :HASTA
             AND C.vend_cod = V.vend_cod AND COTI_FECHA >= :FECINI AND COTI_FECHA <= :FECFIN AND COTI_ANULADO = 'N'
             AND P.PREF_PRE = C.PREF_PRE AND P.TIDO_COD = 35 AND ((P.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY C.VEND_COD
            INTO :CODVEND, :NOMVEND, :CANTIDAD, :DTO, :ADICIONAL, :IVA, :EXTRA, :RTFTE, :RTIVA, :RTICA, :TOTAL
            DO
            BEGIN
            SELECT SUM(CTDE_CONSUMO) FROM COTIZACIONES C, COTIZACIONES_DETALLE D WHERE C.COTI_ID = D.COTI_ID AND
                VEND_COD = :CODVEND AND COTI_FECHA >= :FECINI AND COTI_FECHA <= :FECFIN AND COTI_ANULADO = 'N'
                INTO :CONSUMO;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (DTO IS NULL) then
                DTO = 0;
            if (ADICIONAL IS NULL) then
                ADICIONAL = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (EXTRA IS NULL) then
                EXTRA = 0;
            if (RTFTE IS NULL) then
                RTFTE = 0;
            if (RTIVA IS NULL) then
                RTIVA = 0;
            if (RTICA IS NULL) then
                RTICA = 0;
            SUBTOTAL = TOTAL - EXTRA - IVA - ADICIONAL + DTO - CONSUMO;
            NETO = TOTAL - RTFTE - RTIVA - RTICA;
            if (CEROS = 'S') then
              SUSPEND;
            ELSE
              if (CANTIDAD > 0) then
                SUSPEND;
            END
        END
    END
ELSE
    BEGIN
    if (BIN_AND(TIPO, 1) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 31 INTO :NOMTIPO;
        FOR SELECT F.VEND_COD, VEND_NOMBRE, F.FACT_ID, F.PREF_PRE, FACT_NUMERO, FACT_FECHA, FACT_DTOMONTO, FACT_ADICIONAL, FACT_IVAMONTO, FACT_EXTRA, FACT_TOTAL, FACT_RTFTEMONTO, FACT_RTIVAMONTO, FACT_RTICAMONTO, TERC_NIT, FACT_NOMCLIENTE
            FROM FACTURAS F, PREFIJOS P, VENDEDORES V WHERE F.vend_cod = V.vend_cod AND F.VEND_COD >= :DESDE AND F.VEND_COD <= :HASTA AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND FACT_ANULADO = 'N'
             AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND ((P.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            ORDER BY FACT_FECHA, FACT_ID
            INTO :CODVEND, :NOMVEND, :ID, :PREFIJO, :NUMERO, :FECDOC, :DTO, :ADICIONAL, :IVA, :EXTRA, :TOTAL, :RTFTE, :RTIVA, :RTICA, :NIT, :NOMBRE
            DO
            BEGIN
            SELECT SUM(FADE_CONSUMO) FROM FACTURAS_DETALLE WHERE FACT_ID = :ID
                INTO :CONSUMO;
            SUBTOTAL = TOTAL - EXTRA - IVA - ADICIONAL + DTO - CONSUMO;
            NETO = TOTAL - RTFTE - RTIVA - RTICA;
            SUSPEND;
            END
         END
    if (BIN_AND(TIPO, 2) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 32 INTO :NOMTIPO;
        FOR SELECT R.VEND_COD, VEND_NOMBRE, REVT_ID, R.PREF_PRE, REVT_NUMERO, REVT_FECHA, 0, 0, REVT_IVAMONTO, 0, REVT_TOTAL, 0, 0, 0, TERC_NIT, REVT_NOMTERC
            FROM REMISIONES_VENTA R, PREFIJOS P, VENDEDORES V WHERE R.vend_cod = V.vend_cod AND R.VEND_COD >= :DESDE AND R.VEND_COD <= :HASTA AND REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN AND REVT_ANULADO = 'N'
             AND P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = 32 AND ((P.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            ORDER BY REVT_FECHA, REVT_ID
            INTO :CODVEND, :NOMVEND, :ID, :PREFIJO, :NUMERO, :FECDOC, :DTO, :ADICIONAL, :IVA, :EXTRA, :TOTAL, :RTFTE, :RTIVA, :RTICA, :NIT, :NOMBRE
            DO
            BEGIN
            SELECT SUM(RVDE_CONSUMO) FROM REMISIONES_VENTA_DETALLE WHERE REVT_ID = :ID
                INTO :CONSUMO;
            SUBTOTAL = TOTAL - EXTRA - IVA - ADICIONAL + DTO - CONSUMO;
            NETO = TOTAL - RTFTE - RTIVA - RTICA;
            SUSPEND;
            END
         END
    if (BIN_AND(TIPO, 4) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 33 INTO :NOMTIPO;
        FOR SELECT V.VEND_COD, VEND_NOMBRE, DEVT_ID, D.PREF_PRE, DEVT_NUMERO, DEVT_FECHA, DEVT_DTOMONTO, DEVT_ADICIONAL, DEVT_IVAMONTO, DEVT_EXTRA, DEVT_TOTAL, DEVT_RTFTEMONTO, DEVT_RTIVAMONTO, DEVT_RTICAMONTO, TERC_NIT, DEVT_NOMTERC
            FROM DEVOLUCIONES_VENTAS D, PREFIJOS P, VENDEDORES V WHERE D.vend_cod = V.vend_cod AND V.VEND_COD >= :DESDE AND V.VEND_COD <= :HASTA AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND DEVT_ANULADO = 'N'
             AND P.PREF_PRE = D.PREF_PRE AND P.TIDO_COD = 33 AND ((P.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) AND ((DEVT_REMID = 0) or (DEVT_REMID IS NULL))
            ORDER BY DEVT_FECHA, DEVT_ID
            INTO :CODVEND, :NOMVEND, :ID, :PREFIJO, :NUMERO, :FECDOC, :DTO, :ADICIONAL, :IVA, :EXTRA, :TOTAL, :RTFTE, :RTIVA, :RTICA, :NIT, :NOMBRE
            DO
            BEGIN
            SELECT SUM(DVDE_CONSUMO) FROM DEVOLUCIONES_VENTAS_DETALLE WHERE DEVT_ID = :ID
                INTO :CONSUMO;
            SUBTOTAL = TOTAL - EXTRA - IVA - ADICIONAL + DTO - CONSUMO;
            NETO = TOTAL - RTFTE - RTIVA - RTICA;
            TOTAL = TOTAL * -1;
            IVA = IVA * -1;
            EXTRA = EXTRA * -1;
            DTO = DTO * -1;
            ADICIONAL = ADICIONAL * -1;
            RTFTE = RTFTE * -1;
            RTIVA = RTIVA * -1;
            RTICA = RTICA * -1;
            SUSPEND;
            END
         END
    if (BIN_AND(TIPO, 8) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 34 INTO :NOMTIPO;
        FOR SELECT P.VEND_COD, VEND_NOMBRE, PEDI_ID, P.PREF_PRE, PEDI_NUMERO, PEDI_FECHA, PEDI_DTOMONTO, PEDI_ADICIONAL, PEDI_IVAMONTO, PEDI_EXTRA, PEDI_TOTAL, 0, 0, 0, TERC_NIT, PEDI_NOMTERC
            FROM PEDIDOS P, PREFIJOS PR, VENDEDORES V WHERE P.vend_cod = V.vend_cod AND P.VEND_COD >= :DESDE AND P.VEND_COD <= :HASTA AND PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND PEDI_ANULADO = 'N'
             AND P.PREF_PRE = PR.PREF_PRE AND PR.TIDO_COD = 34 AND ((PR.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            ORDER BY PEDI_FECHA, PEDI_ID
            INTO :CODVEND, :NOMVEND, :ID, :PREFIJO, :NUMERO, :FECDOC, :DTO, :ADICIONAL, :IVA, :EXTRA, :TOTAL, :RTFTE, :RTIVA, :RTICA, :NIT, :NOMBRE
            DO
            BEGIN
            SELECT SUM(PEDE_CONSUMO) FROM PEDIDOS_DETALLE WHERE PEDI_ID = :ID
                INTO :CONSUMO;
            SUBTOTAL = TOTAL - EXTRA - IVA - ADICIONAL + DTO - CONSUMO;
            NETO = TOTAL - RTFTE - RTIVA - RTICA;
            SUSPEND;
            END
         END
    if (BIN_AND(TIPO, 16) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 35 INTO :NOMTIPO;
        FOR SELECT C.VEND_COD, VEND_NOMBRE, COTI_ID, C.PREF_PRE, COTI_NUMERO, COTI_FECHA, COTI_DTOMONTO, COTI_ADICIONAL, COTI_IVAMONTO, COTI_EXTRA, COTI_TOTAL, 0, 0, 0, TERC_NIT, COTI_NOMTERC
            FROM COTIZACIONES C, PREFIJOS P, VENDEDORES V WHERE C.vend_cod = V.vend_cod AND C.VEND_COD >= :DESDE AND C.VEND_COD <= :HASTA AND COTI_FECHA >= :FECINI AND COTI_FECHA <= :FECFIN AND COTI_ANULADO = 'N'
             AND P.PREF_PRE = C.PREF_PRE AND P.TIDO_COD = 35 AND ((P.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            ORDER BY COTI_FECHA, COTI_ID
            INTO :CODVEND, :NOMVEND, :ID, :PREFIJO, :NUMERO, :FECDOC, :DTO, :ADICIONAL, :IVA, :EXTRA, :TOTAL, :RTFTE, :RTIVA, :RTICA, :NIT, :NOMBRE
            DO
            BEGIN
            SELECT SUM(CTDE_CONSUMO) FROM COTIZACIONES_DETALLE WHERE COTI_ID = :ID
                INTO :CONSUMO;
            SUBTOTAL = TOTAL - EXTRA - IVA - ADICIONAL + DTO - CONSUMO;
            NETO = TOTAL - RTFTE - RTIVA - RTICA;
            SUSPEND;
            END
        END
    END
END
^

SET TERM ; ^

SET TERM ^ ;

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

        FOR SELECT MAX(T.TERC_NIT), MAX(TERC_NOM), MAX(TERC_TEL), MAX(TERC_CIU), MAX(ZONA_COD), MAX(ARTI_COD), SUM(FADE_CANT * FADE_FACTOR), SUM(FACT_FACTOR*(FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO)),
            SUM(FACT_FACTOR*FADE_IVAMONTO), SUM(FACT_FACTOR*FADE_TOTAL)
            FROM FACTURAS_DETALLE D, FACTURAS F, PREFIJOS P, terceros T, CLIENTES C
            WHERE C.TERC_NIT = T.TERC_NIT AND TERC_CLIE = 'S' AND F.terc_nit = T.terc_nit AND T.TERC_NIT >= :TERINI AND T.TERC_NIT <= :TERFIN AND
            F.FACT_ID = D.FACT_ID AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND FACT_ANULADO = 'N'
            AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY T.TERC_NIT, ARTI_COD
            INTO :NIT, :NOMBRE, :TELEFONO, :CIUDAD, :CODZONA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :TOTAL
            DO
            BEGIN
            SELECT ZONA_NOM FROM ZONAS WHERE ZONA_COD = :CODZONA INTO :NOMZONA;
            SELECT ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                FROM ARTICULO WHERE ARTI_COD = :ARTICULO
                INTO :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC;
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            EXECUTE PROCEDURE costo_promedio (:ARTICULO, :FECFIN) RETURNING_VALUES (:COSTOUNIT);
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            COSTO = CANTIDAD * COSTOUNIT;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            if (CEROS = 'S') then
                INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (3, USER, :ARTICULO);
            SUSPEND;
            END /* FOR */
        if (CEROS = 'S') then
            BEGIN
            COSTO = 0;
            UTILIDAD = 0;
            PORC = 0;
            /* agregue los articulos sin factura */
            FOR SELECT ARTI_COD, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN
                INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                DO
                BEGIN
                SELECT COUNT(REPA_ARTICULO) FROM REPORTES_AUX WHERE REPA_ID = 3 AND REPA_USER = USER AND REPA_ARTICULO = :articulo INTO :numrows;
                if (numrows = 0) then
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        END
    if (BIN_AND(TIPO, 2) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 32 INTO :NOMTIPO;
        /* BORRA LA TABLA AUXILIAR */
        DELETE FROM reportes_aux WHERE REPA_ID = 3 AND REPA_USER = USER;

        FOR SELECT MAX(T.TERC_NIT), MAX(TERC_NOM), MAX(TERC_TEL), MAX(TERC_CIU), MAX(ZONA_COD), MAX(ARTI_COD), SUM(RVDE_CANT * RVDE_FACTOR), SUM(RVDE_TOTAL-RVDE_IVAMONTO-RVDE_CONSUMO), SUM(RVDE_IVAMONTO), SUM(RVDE_TOTAL)
            FROM REMISIONES_VENTA_DETALLE D, REMISIONES_VENTA R, PREFIJOS P, terceros T, CLIENTES C
            WHERE C.TERC_NIT = T.TERC_NIT AND TERC_CLIE = 'S' AND R.terc_nit = T.terc_nit AND T.TERC_NIT >= :TERINI AND T.TERC_NIT <= :TERFIN AND
            R.REVT_ID = D.REVT_ID AND REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN AND REVT_ANULADO = 'N'
            AND P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = 32 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY T.TERC_NIT, ARTI_COD
            INTO :NIT, :NOMBRE, :TELEFONO, :CIUDAD, :CODZONA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :TOTAL
            DO
                BEGIN
                SELECT ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO WHERE ARTI_COD = :ARTICULO
                    INTO :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC;
                SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                EXECUTE PROCEDURE costo_promedio (:ARTICULO, :FECFIN) RETURNING_VALUES (:COSTOUNIT);
                if (CANTIDAD IS NULL) then
                    CANTIDAD = 0;
                if (BASE IS NULL) then
                    BASE = 0;
                if (IVA IS NULL) then
                    IVA = 0;
                COSTO = CANTIDAD * COSTOUNIT;
                UTILIDAD = BASE - COSTO;
                if (UOM = 'UTILIDAD') then
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                else
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            if (CEROS = 'S') then
                INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (3, USER, :ARTICULO);
            SUSPEND;
            END /* FOR */
        if (CEROS = 'S') then
            BEGIN
            COSTO = 0;
            UTILIDAD = 0;
            PORC = 0;
            /* agregue los articulos sin factura */
            FOR SELECT ARTI_COD, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN
                INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                DO
                BEGIN
                SELECT COUNT(REPA_ARTICULO) FROM REPORTES_AUX WHERE REPA_ID = 3 AND REPA_USER = USER AND REPA_ARTICULO = :articulo INTO :numrows;
                if (numrows = 0) then
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        END
    if (BIN_AND(TIPO, 4) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 33 INTO :NOMTIPO;
        /* BORRA LA TABLA AUXILIAR */
        DELETE FROM reportes_aux WHERE REPA_ID = 3 AND REPA_USER = USER;

        FOR SELECT MAX(T.TERC_NIT), MAX(TERC_NOM), MAX(TERC_TEL), MAX(TERC_CIU), MAX(ZONA_COD), MAX(ARTI_COD), SUM(DVDE_CANT * DVDE_FACTOR), SUM(DEVT_FACTOR*(DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO)),
            SUM(DEVT_FACTOR*DVDE_IVAMONTO), SUM(DEVT_FACTOR*DVDE_TOTAL)
            FROM devoluciones_ventas_detalle D, DEVOLUCIONES_VENTAS V, PREFIJOS P, terceros T, CLIENTES C
            WHERE C.TERC_NIT = T.TERC_NIT AND TERC_CLIE = 'S' AND V.terc_nit = T.terc_nit AND T.TERC_NIT >= :TERINI AND T.TERC_NIT <= :TERFIN AND
            V.DEVT_ID = D.DEVT_ID AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND DEVT_ANULADO = 'N'
            AND P.PREF_PRE = V.PREF_PRE AND P.TIDO_COD = 33 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY T.TERC_NIT, ARTI_COD
            INTO :NIT, :NOMBRE, :TELEFONO, :CIUDAD, :CODZONA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :TOTAL
            DO
            BEGIN
            SELECT ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                FROM ARTICULO WHERE ARTI_COD = :ARTICULO
                INTO :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC;
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            EXECUTE PROCEDURE costo_promedio (:ARTICULO, :FECFIN) RETURNING_VALUES (:COSTOUNIT);
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            COSTO = CANTIDAD * COSTOUNIT;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            TOTAL = TOTAL * -1;
            IVA = IVA * -1;
            BASE = BASE * -1;
            CANTIDAD = CANTIDAD * -1;
            COSTO = COSTO * -1;
            UTILIDAD = UTILIDAD * -1;
            if (CEROS = 'S') then
                INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (3, USER, :ARTICULO);
            SUSPEND;
            END /* FOR */
        if (CEROS = 'S') then
            BEGIN
            COSTO = 0;
            UTILIDAD = 0;
            PORC = 0;
            /* agregue los articulos sin factura */
            FOR SELECT ARTI_COD, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN
                INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                DO
                BEGIN
                SELECT COUNT(REPA_ARTICULO) FROM REPORTES_AUX WHERE REPA_ID = 3 AND REPA_USER = USER AND REPA_ARTICULO = :articulo INTO :numrows;
                if (numrows = 0) then
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        END
    if (BIN_AND(TIPO, 8) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 34 INTO :NOMTIPO;
        /* BORRA LA TABLA AUXILIAR */
        DELETE FROM reportes_aux WHERE REPA_ID = 3 AND REPA_USER = USER;

        FOR SELECT MAX(T.TERC_NIT), MAX(TERC_NOM), MAX(TERC_TEL), MAX(TERC_CIU), MAX(ZONA_COD), MAX(ARTI_COD), SUM(PEDE_CANT * PEDE_FACTOR), SUM(PEDI_FACTOR*(PEDE_TOTAL-PEDE_IVAMONTO-PEDE_CONSUMO)),
            SUM(PEDI_FACTOR*PEDE_IVAMONTO), SUM(PEDI_FACTOR*PEDE_TOTAL)
            FROM PEDIDOS_DETALLE D, PEDIDOS P, PREFIJOS PR, terceros T, CLIENTES C
            WHERE C.TERC_NIT = T.TERC_NIT AND TERC_CLIE = 'S' AND P.terc_nit = T.terc_nit AND T.TERC_NIT >= :TERINI AND T.TERC_NIT <= :TERFIN AND
            P.PEDI_ID = D.PEDI_ID AND PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND PEDI_ANULADO = 'N'
            AND PR.PREF_PRE = P.PREF_PRE AND P.TIDO_COD = 34 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY T.TERC_NIT, ARTI_COD
            INTO :NIT, :NOMBRE, :TELEFONO, :CIUDAD, :CODZONA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :TOTAL
            DO
            BEGIN
            SELECT ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                FROM ARTICULO WHERE ARTI_COD = :ARTICULO
                INTO :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC;
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            EXECUTE PROCEDURE costo_promedio (:ARTICULO, :FECFIN) RETURNING_VALUES (:COSTOUNIT);
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            COSTO = CANTIDAD * COSTOUNIT;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            if (CEROS = 'S') then
                INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (3, USER, :ARTICULO);
            SUSPEND;
            END /* FOR */
        if (CEROS = 'S') then
            BEGIN
            COSTO = 0;
            UTILIDAD = 0;
            PORC = 0;
            /* agregue los articulos sin factura */
            FOR SELECT ARTI_COD, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN
                INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                DO
                BEGIN
                SELECT COUNT(REPA_ARTICULO) FROM REPORTES_AUX WHERE REPA_ID = 3 AND REPA_USER = USER AND REPA_ARTICULO = :articulo INTO :numrows;
                if (numrows = 0) then
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        END
    if (BIN_AND(TIPO, 16) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 35 INTO :NOMTIPO;
        /* BORRA LA TABLA AUXILIAR */
        DELETE FROM reportes_aux WHERE REPA_ID = 3 AND REPA_USER = USER;

        FOR SELECT MAX(T.TERC_NIT), MAX(TERC_NOM), MAX(TERC_TEL), MAX(TERC_CIU), MAX(ZONA_COD), MAX(ARTI_COD), SUM(CTDE_CANT * CTDE_FACTOR), SUM(COTI_FACTOR*(CTDE_TOTAL-CTDE_IVAMONTO-CTDE_CONSUMO)),
            SUM(COTI_FACTOR*CTDE_IVAMONTO), SUM(COTI_FACTOR*CTDE_TOTAL)
            FROM COTIZACIONES_DETALLE D, COTIZACIONES CT, PREFIJOS P, terceros T, CLIENTES C
            WHERE C.TERC_NIT = T.TERC_NIT AND TERC_CLIE = 'S' AND C.terc_nit = T.terc_nit AND T.TERC_NIT >= :TERINI AND T.TERC_NIT <= :TERFIN AND
            CT.COTI_ID = D.COTI_ID AND COTI_FECHA >= :FECINI AND COTI_FECHA <= :FECFIN AND COTI_ANULADO = 'N'
            AND P.PREF_PRE = CT.PREF_PRE AND P.TIDO_COD = 35 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY T.TERC_NIT, ARTI_COD
            INTO :NIT, :NOMBRE, :TELEFONO, :CIUDAD, :CODZONA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :TOTAL
            DO
            BEGIN
            SELECT ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                FROM ARTICULO WHERE ARTI_COD = :ARTICULO
                INTO :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC;
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            EXECUTE PROCEDURE costo_promedio (:ARTICULO, :FECFIN) RETURNING_VALUES (:COSTOUNIT);
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            COSTO = CANTIDAD * COSTOUNIT;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            if (CEROS = 'S') then
                INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (3, USER, :ARTICULO);
            SUSPEND;
            END /* FOR */
        if (CEROS = 'S') then
            BEGIN
            COSTO = 0;
            UTILIDAD = 0;
            PORC = 0;
            /* agregue los articulos sin factura */
            FOR SELECT ARTI_COD, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN
                INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                DO
                BEGIN
                SELECT COUNT(REPA_ARTICULO) FROM REPORTES_AUX WHERE REPA_ID = 3 AND REPA_USER = USER AND REPA_ARTICULO = :articulo INTO :numrows;
                if (numrows = 0) then
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        END
    END
ELSE
    BEGIN
    if (BIN_AND(TIPO, 1) <> 0) then
            BEGIN
            SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 31 INTO :NOMTIPO;
            FOR SELECT F.PREF_PRE, FACT_NUMERO, FACT_FECHA, ARTI_COD, FADE_CANT * FADE_FACTOR, (FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO)*FACT_FACTOR,
                FADE_IVAMONTO*FACT_FACTOR, FADE_DTOPORC, FADE_TOTAL*FACT_FACTOR, F.terc_nit, F.fact_nomcliente
                FROM FACTURAS F, FACTURAS_DETALLE D, PREFIJOS P
                WHERE F.FACT_ID = D.FACT_ID AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND F.TERC_NIT >= :TERINI AND F.TERC_NIT <= :TERFIN AND FACT_ANULADO = 'N'
                 AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                ORDER BY f.terc_nit, ARTI_COD, FACT_FECHA, F.FACT_ID, FADE_ITEM
                INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :DTO, :TOTAL, :NIT, :nombre
                DO
                BEGIN
                SELECT ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO WHERE ARTI_COD = :ARTICULO
                    INTO :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC;
                SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                EXECUTE PROCEDURE costo_promedio (:ARTICULO, :FECHA) RETURNING_VALUES (:COSTOUNIT);
                COSTO = COSTOUNIT * CANTIDAD;
                UTILIDAD = BASE - COSTO;
                if (UOM = 'UTILIDAD') then
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                else
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
                SUSPEND;
                END
            END
    if (BIN_AND(TIPO, 2) <> 0) then
            BEGIN
            SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 32 INTO :NOMTIPO;
            FOR SELECT R.PREF_PRE, REVT_NUMERO, REVT_FECHA, ARTI_COD, RVDE_CANT * RVDE_FACTOR,
                (RVDE_TOTAL - RVDE_IVAMONTO), RVDE_IVAMONTO, RVDE_DTOPORC, RVDE_TOTAL, R.terc_nit, R.revt_nomterc
                FROM REMISIONES_VENTA R, REMISIONES_VENTA_DETALLE D, PREFIJOS P
                WHERE R.REVT_ID = D.REVT_ID AND REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN AND R.TERC_NIT >= :TERINI AND R.TERC_NIT <= :TERFIN AND REVT_ANULADO = 'N'
                 AND P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = 32 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                ORDER BY r.terc_nit, ARTI_COD, REVT_FECHA, R.REVT_ID, RVDE_ITEM
                INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :DTO, :TOTAL, :NIT, :nombre
                DO
                BEGIN
                SELECT ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO WHERE ARTI_COD = :ARTICULO
                    INTO :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC;
                SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                EXECUTE PROCEDURE costo_promedio (:ARTICULO, :FECHA) RETURNING_VALUES (:COSTOUNIT);
                COSTO = COSTOUNIT * CANTIDAD;
                UTILIDAD = BASE - COSTO;
                if (UOM = 'UTILIDAD') then
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                else
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
                SUSPEND;
                END
            END
    if (BIN_AND(TIPO, 4) <> 0) then
            BEGIN
            SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 33 INTO :NOMTIPO;
            FOR SELECT V.PREF_PRE, DEVT_NUMERO, DEVT_FECHA, ARTI_COD, DVDE_CANT * DVDE_FACTOR, (DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO)*DEVT_FACTOR,
                DVDE_IVAMONTO*DEVT_FACTOR, DVDE_DTOPORC, DVDE_TOTAL*DEVT_FACTOR, V.terc_nit, V.devt_nomterc
                FROM DEVOLUCIONES_VENTAS V, DEVOLUCIONES_VENTAS_DETALLE D, PREFIJOS P
                WHERE V.DEVT_ID = D.DEVT_ID AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND V.TERC_NIT >= :TERINI AND V.TERC_NIT <= :TERFIN AND DEVT_ANULADO = 'N'
                 AND P.PREF_PRE = V.PREF_PRE AND P.TIDO_COD = 33 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                ORDER BY v.terc_nit, ARTI_COD, DEVT_FECHA, D.DEVT_ID, DVDE_ITEM
                INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :DTO, :TOTAL, :NIT, :nombre
                DO
                BEGIN
                SELECT ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO WHERE ARTI_COD = :ARTICULO
                    INTO :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC;
                SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                EXECUTE PROCEDURE costo_promedio (:ARTICULO, :FECHA) RETURNING_VALUES (:COSTOUNIT);
                COSTO = COSTOUNIT * CANTIDAD;
                UTILIDAD = BASE - COSTO;
                if (UOM = 'UTILIDAD') then
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                else
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
                TOTAL = TOTAL * -1;
                IVA = IVA * -1;
                BASE = BASE * -1;
                CANTIDAD = CANTIDAD * -1;
                COSTO = COSTO * -1;
                UTILIDAD = UTILIDAD * -1;
                SUSPEND;
                END
            END
    if (BIN_AND(TIPO, 8) <> 0) then
            BEGIN
            SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 34 INTO :NOMTIPO;
            FOR SELECT P.PREF_PRE, PEDI_NUMERO, PEDI_FECHA, ARTI_COD, PEDE_CANT * PEDE_FACTOR, (PEDE_TOTAL-PEDE_IVAMONTO-PEDE_CONSUMO)*PEDI_FACTOR,
                PEDE_IVAMONTO*PEDI_FACTOR, PEDE_DTOPORC, PEDE_TOTAL*PEDI_FACTOR, P.terc_nit, P.pedi_nomterc
                FROM PEDIDOS P, PEDIDOS_DETALLE D, PREFIJOS PR
                WHERE P.PEDI_ID = D.PEDI_ID AND PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND P.TERC_NIT >= :TERINI AND P.TERC_NIT <= :TERFIN AND PEDI_ANULADO = 'N'
                 AND P.PREF_PRE = PR.PREF_PRE AND P.TIDO_COD = 34 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                ORDER BY p.terc_nit, ARTI_COD, PEDI_FECHA, P.PEDI_ID, PEDE_ITEM
                INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :DTO, :TOTAL, :NIT, :nombre
                DO
                BEGIN
                SELECT ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO WHERE ARTI_COD = :ARTICULO
                    INTO :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC;
                SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                EXECUTE PROCEDURE costo_promedio (:ARTICULO, :FECHA) RETURNING_VALUES (:COSTOUNIT);
                COSTO = COSTOUNIT * CANTIDAD;
                UTILIDAD = BASE - COSTO;
                if (UOM = 'UTILIDAD') then
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                else
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
                SUSPEND;
                END
            END
    if (BIN_AND(TIPO, 16) <> 0) then
            BEGIN
            SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 35 INTO :NOMTIPO;
            FOR SELECT C.PREF_PRE, COTI_NUMERO, COTI_FECHA, ARTI_COD, CTDE_CANT * CTDE_FACTOR, (CTDE_TOTAL-CTDE_IVAMONTO-CTDE_CONSUMO)*COTI_FACTOR,
                CTDE_IVAMONTO*COTI_FACTOR, CTDE_DTOPORC, CTDE_TOTAL*COTI_FACTOR, C.terc_nit, C.coti_nomterc
                FROM COTIZACIONES C, COTIZACIONES_DETALLE D, PREFIJOS P
                WHERE C.COTI_ID = D.COTI_ID AND ARTI_COD = :ARTICULO AND COTI_FECHA >= :FECINI AND COTI_FECHA <= :FECFIN AND C.TERC_NIT >= :TERINI AND C.TERC_NIT <= :TERFIN AND COTI_ANULADO = 'N'
                 AND P.PREF_PRE = C.PREF_PRE AND P.TIDO_COD = 35 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                ORDER BY c.terc_nit, COTI_FECHA, C.COTI_ID, CTDE_ITEM
                INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :DTO, :TOTAL, :NIT, :nombre
                DO
                BEGIN
                SELECT ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO WHERE ARTI_COD = :ARTICULO
                    INTO :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC;
                SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                EXECUTE PROCEDURE costo_promedio (:ARTICULO, :FECHA) RETURNING_VALUES (:COSTOUNIT);
                COSTO = COSTOUNIT * CANTIDAD;
                UTILIDAD = BASE - COSTO;
                if (UOM = 'UTILIDAD') then
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                else
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
                SUSPEND;
                END
            END
    END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER PROCEDURE REP_UTILIDAD_VENDEDOR(
    TIPO INTEGER,
    DETALLE CHAR(1),
    VENINI VARCHAR(20),
    VENFIN VARCHAR(20),
    FECINI DATE,
    FECFIN DATE,
    ARTINI VARCHAR(15),
    ARTFIN VARCHAR(15),
    ORDEN CHAR(1),
    CEROS CHAR(1),
    SUBEMPRESA INTEGER)
RETURNS (
    CODVEND VARCHAR(20),
    NOMVEND VARCHAR(60),
    NOMTIPO VARCHAR(50),
    ARTICULO VARCHAR(15),
    DESCRIPCION VARCHAR(60),
    CODGRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    CODSUBG VARCHAR(3),
    NOMSUBG VARCHAR(30),
    CODMARC VARCHAR(3),
    NOMMARC VARCHAR(30),
    UNIDAD VARCHAR(8),
    CANTIDAD NUMERIC(18,4),
    BASE NUMERIC(18,2),
    IVA NUMERIC(18,2),
    CONSUMO NUMERIC(18,2),
    COSTO NUMERIC(18,2),
    UTILIDAD NUMERIC(18,4),
    PORC NUMERIC(9,2),
    TOTAL NUMERIC(18,2),
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    DTO NUMERIC(9,2))
AS
DECLARE VARIABLE COSTOUNIT NUMERIC(18,4);
DECLARE VARIABLE CODINI VARCHAR(15);
DECLARE VARIABLE CODFIN VARCHAR(15);
DECLARE VARIABLE DESINI VARCHAR(15);
DECLARE VARIABLE DESFIN VARCHAR(15);
declare variable UOM VARCHAR(20);
BEGIN
if (ORDEN = 'C') then
    BEGIN
    CODINI = ARTINI;
    CODFIN = ARTFIN;
    DESINI = '';
    DESFIN = 'zz';
    END
ELSE
    BEGIN
    DESINI = ARTINI;
    DESFIN = ARTFIN;
    CODINI = '';
    CODFIN = 'zz';
    END
  EXECUTE PROCEDURE lee_configuracion ('FACTURACION', 'ARTICULOS', 'SUGERIR PRECIOS CON PORCENTAJE DE MARGEN O UTILIDAD') returning_values (:UOM);
  SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = :TIPO INTO :NOMTIPO;
  FOR select VEND_COD, VEND_NOMBRE
    from VENDEDORES
    where VEND_COD >= :VENINI AND VEND_COD <= :VENFIN
    INTO :CODVEND, :NOMVEND
    DO  
    BEGIN
    if (DETALLE = 'N') then
        BEGIN
        if (BIN_AND(TIPO, 1) <> 0) then
            BEGIN
            SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 31 INTO :NOMTIPO;
            /* BORRA LA TABLA AUXILIAR */
            DELETE FROM reportes_aux WHERE REPA_ID = 4 AND REPA_USER = USER;
            FOR SELECT MAX(ARTI_COD), SUM(FADE_CANT * FADE_FACTOR), SUM(FACT_FACTOR*(FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO)),
                SUM(FACT_FACTOR*FADE_IVAMONTO), SUM(FACT_FACTOR*FADE_TOTAL), SUM(FADE_CONSUMO)
                FROM FACTURAS_DETALLE D, FACTURAS F, PREFIJOS P
                WHERE F.FACT_ID = D.FACT_ID AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND VEND_COD = :CODVEND AND FACT_ANULADO = 'N'
                 AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                GROUP BY ARTI_COD
                INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :TOTAL, :CONSUMO
                DO
                BEGIN
                SELECT ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO WHERE ARTI_COD = :ARTICULO
                    INTO :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC;
                SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                EXECUTE PROCEDURE costo_promedio (:ARTICULO, :FECFIN) RETURNING_VALUES (:COSTOUNIT);
                if (CANTIDAD IS NULL) then
                    CANTIDAD = 0;
                if (BASE IS NULL) then
                    BASE = 0;
                if (IVA IS NULL) then
                    IVA = 0;
                COSTO = CANTIDAD * COSTOUNIT;
                UTILIDAD = BASE - COSTO;
                if (UOM = 'UTILIDAD') then
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                else
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
                if (CEROS = 'S') then
                    begin
                    INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (4, USER, :ARTICULO);
                    SUSPEND;
                    end
                ELSE
                    if ((BASE <> 0) AND (CANTIDAD <> 0)) then
                        SUSPEND;
                END
            if (CEROS = 'S') then
                BEGIN
                COSTO = 0;
                UTILIDAD = 0;
                PORC = 0;
                /* agregue los articulos sin factura */
                FOR SELECT ARTI_COD, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN and
                    not exists (select REPA_ARTICULO FROM REPORTES_AUX WHERE REPA_ID = 4 AND REPA_USER = USER AND REPA_ARTICULO = a.arti_cod)
                    INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                    DO
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        if (BIN_AND(TIPO, 2) <> 0) then
            BEGIN
            SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 32 INTO :NOMTIPO;
            FOR SELECT MAX(ARTI_COD), SUM(RVDE_CANT * RVDE_FACTOR), SUM(RVDE_TOTAL-RVDE_IVAMONTO-RVDE_CONSUMO), SUM(RVDE_IVAMONTO), SUM(RVDE_TOTAL), SUM(RVDE_CONSUMO)
                FROM REMISIONES_VENTA_DETALLE D, REMISIONES_VENTA R, PREFIJOS P
                WHERE R.REVT_ID = D.REVT_ID AND REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN AND VEND_COD = :CODVEND AND REVT_ANULADO = 'N'
                 AND P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = 32 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                GROUP BY ARTI_COD
                INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :TOTAL, :CONSUMO
                DO
                BEGIN
                SELECT ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO WHERE ARTI_COD = :ARTICULO
                    INTO :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC;
                SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                EXECUTE PROCEDURE costo_promedio (:ARTICULO, :FECFIN) RETURNING_VALUES (:COSTOUNIT);
                if (CANTIDAD IS NULL) then
                    CANTIDAD = 0;
                if (BASE IS NULL) then
                    BASE = 0;
                if (IVA IS NULL) then
                    IVA = 0;
                COSTO = CANTIDAD * COSTOUNIT;
                UTILIDAD = BASE - COSTO;
                if (UOM = 'UTILIDAD') then
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                else
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
                if (CEROS = 'S') then
                    begin
                    INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (4, USER, :ARTICULO);
                    SUSPEND;
                    end
                ELSE
                    if ((BASE <> 0) AND (CANTIDAD <> 0)) then
                        SUSPEND;
                END
            if (CEROS = 'S') then
                BEGIN
                COSTO = 0;
                UTILIDAD = 0;
                PORC = 0;
                /* agregue los articulos sin factura */
                FOR SELECT ARTI_COD, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN and
                    not exists (select REPA_ARTICULO FROM REPORTES_AUX WHERE REPA_ID = 4 AND REPA_USER = USER AND REPA_ARTICULO = a.arti_cod)
                    INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                    DO
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        if (BIN_AND(TIPO, 4) <> 0) then
            BEGIN
            SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 33 INTO :NOMTIPO;
            FOR SELECT MAX(ARTI_COD), SUM(DVDE_CANT * DVDE_FACTOR), SUM(DEVT_FACTOR*(DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO)),
                SUM(DEVT_FACTOR*DVDE_IVAMONTO), SUM(DEVT_FACTOR*DVDE_TOTAL), SUM(DVDE_CONSUMO)
                FROM devoluciones_ventas_detalle D, DEVOLUCIONES_VENTAS V, PREFIJOS P
                WHERE V.DEVT_ID = D.DEVT_ID AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND VEND_COD = :CODVEND AND DEVT_ANULADO = 'N'
                 AND P.PREF_PRE = V.PREF_PRE AND P.TIDO_COD = 33 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                GROUP BY ARTI_COD
                INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :TOTAL, :CONSUMO
                DO
                BEGIN
                SELECT ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO WHERE ARTI_COD = :ARTICULO
                    INTO :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC;
                SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                EXECUTE PROCEDURE costo_promedio (:ARTICULO, :FECFIN) RETURNING_VALUES (:COSTOUNIT);
                if (CANTIDAD IS NULL) then
                    CANTIDAD = 0;
                if (BASE IS NULL) then
                    BASE = 0;
                if (IVA IS NULL) then
                    IVA = 0;
                COSTO = CANTIDAD * COSTOUNIT;
                UTILIDAD = BASE - COSTO;
                if (UOM = 'UTILIDAD') then
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                else
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
                TOTAL = TOTAL * -1;
                IVA = IVA * -1;
                BASE = BASE * -1;
                CANTIDAD = CANTIDAD * -1;
                COSTO = COSTO * -1;
                UTILIDAD = UTILIDAD * -1;
                if (CEROS = 'S') then
                    begin
                    INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (4, USER, :ARTICULO);
                    SUSPEND;
                    end
                ELSE
                    if ((BASE <> 0) AND (CANTIDAD <> 0)) then
                        SUSPEND;
                END
            if (CEROS = 'S') then
                BEGIN
                COSTO = 0;
                UTILIDAD = 0;
                PORC = 0;
                /* agregue los articulos sin factura */
                FOR SELECT ARTI_COD, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN and
                    not exists (select REPA_ARTICULO FROM REPORTES_AUX WHERE REPA_ID = 4 AND REPA_USER = USER AND REPA_ARTICULO = a.arti_cod)
                    INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                    DO
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        if (BIN_AND(TIPO, 8) <> 0) then
            BEGIN
            SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 34 INTO :NOMTIPO;
            FOR SELECT MAX(ARTI_COD), SUM(PEDE_CANT * PEDE_FACTOR), SUM(PEDI_FACTOR*(PEDE_TOTAL-PEDE_IVAMONTO-PEDE_CONSUMO)),
                SUM(PEDI_FACTOR*PEDE_IVAMONTO), SUM(PEDI_FACTOR*PEDE_TOTAL), SUM(PEDE_CONSUMO)
                FROM PEDIDOS_DETALLE D, PEDIDOS P, PREFIJOS PR
                WHERE P.PEDI_ID = D.PEDI_ID AND PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND VEND_COD = :CODVEND AND PEDI_ANULADO = 'N'
                 AND PR.PREF_PRE = P.PREF_PRE AND P.TIDO_COD = 34 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                GROUP BY ARTI_COD
                INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :TOTAL, :CONSUMO
                DO
                BEGIN
                SELECT ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO WHERE ARTI_COD = :ARTICULO
                    INTO :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC;
                SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                EXECUTE PROCEDURE costo_promedio (:ARTICULO, :FECFIN) RETURNING_VALUES (:COSTOUNIT);
                if (CANTIDAD IS NULL) then
                    CANTIDAD = 0;
                if (BASE IS NULL) then
                    BASE = 0;
                if (IVA IS NULL) then
                    IVA = 0;
                COSTO = CANTIDAD * COSTOUNIT;
                UTILIDAD = BASE - COSTO;
                if (UOM = 'UTILIDAD') then
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                else
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
                if (CEROS = 'S') then
                    begin
                    INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (4, USER, :ARTICULO);
                    SUSPEND;
                    end
                ELSE
                    if ((BASE <> 0) AND (CANTIDAD <> 0)) then
                        SUSPEND;
                END
            if (CEROS = 'S') then
                BEGIN
                COSTO = 0;
                UTILIDAD = 0;
                PORC = 0;
                /* agregue los articulos sin factura */
                FOR SELECT ARTI_COD, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN and
                    not exists (select REPA_ARTICULO FROM REPORTES_AUX WHERE REPA_ID = 4 AND REPA_USER = USER AND REPA_ARTICULO = a.arti_cod)
                    INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                    DO
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        if (BIN_AND(TIPO, 16) <> 0) then
            BEGIN
            SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 35 INTO :NOMTIPO;
            FOR SELECT MAX(ARTI_COD), SUM(CTDE_CANT * CTDE_FACTOR), SUM(COTI_FACTOR*(CTDE_TOTAL-CTDE_IVAMONTO-CTDE_CONSUMO)),
                SUM(COTI_FACTOR*CTDE_IVAMONTO), SUM(COTI_FACTOR*CTDE_TOTAL), SUM(CTDE_CONSUMO)
                FROM COTIZACIONES_DETALLE D, COTIZACIONES C, PREFIJOS P
                WHERE C.COTI_ID = D.COTI_ID AND COTI_FECHA >= :FECINI AND COTI_FECHA <= :FECFIN AND VEND_COD = :CODVEND AND COTI_ANULADO = 'N'
                 AND P.PREF_PRE = C.PREF_PRE AND P.TIDO_COD = 35 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                GROUP BY ARTI_COD
                INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :TOTAL, :CONSUMO
                DO
                BEGIN
                SELECT ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO WHERE ARTI_COD = :ARTICULO
                    INTO :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC;
                SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                EXECUTE PROCEDURE costo_promedio (:ARTICULO, :FECFIN) RETURNING_VALUES (:COSTOUNIT);
                if (CANTIDAD IS NULL) then
                    CANTIDAD = 0;
                if (BASE IS NULL) then
                    BASE = 0;
                if (IVA IS NULL) then
                    IVA = 0;
                COSTO = CANTIDAD * COSTOUNIT;
                UTILIDAD = BASE - COSTO;
                if (UOM = 'UTILIDAD') then
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                else
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
                if (CEROS = 'S') then
                    begin
                    INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (4, USER, :ARTICULO);
                    SUSPEND;
                    end
                ELSE
                    if ((BASE <> 0) AND (CANTIDAD <> 0)) then
                        SUSPEND;
                END
            if (CEROS = 'S') then
                BEGIN
                COSTO = 0;
                UTILIDAD = 0;
                PORC = 0;
                /* agregue los articulos sin factura */
                FOR SELECT ARTI_COD, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN and
                    not exists (select REPA_ARTICULO FROM REPORTES_AUX WHERE REPA_ID = 4 AND REPA_USER = USER AND REPA_ARTICULO = a.arti_cod)
                    INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                    DO
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        END
    ELSE
        BEGIN
        if (BIN_AND(TIPO, 1) <> 0) then
            BEGIN
            SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 31 INTO :NOMTIPO;
            FOR SELECT F.PREF_PRE, FACT_NUMERO, FACT_FECHA, ARTI_COD, FADE_CANT * FADE_FACTOR, (FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO)*FACT_FACTOR,
                FADE_IVAMONTO*FACT_FACTOR, FADE_DTOPORC, FADE_TOTAL*FACT_FACTOR, FADE_CONSUMO
                FROM FACTURAS F, FACTURAS_DETALLE D, PREFIJOS P
                WHERE F.FACT_ID = D.FACT_ID AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND VEND_COD = :CODVEND AND FACT_ANULADO = 'N'
                 AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                ORDER BY ARTI_COD, FACT_FECHA, F.FACT_ID, FADE_ITEM
                INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :DTO, :TOTAL, :CONSUMO
                DO
                BEGIN
                SELECT ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO WHERE ARTI_COD = :ARTICULO
                    INTO :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC;
                SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                EXECUTE PROCEDURE costo_promedio (:ARTICULO, :FECHA) RETURNING_VALUES (:COSTOUNIT);
                COSTO = COSTOUNIT * CANTIDAD;
                UTILIDAD = BASE - COSTO;
                if (UOM = 'UTILIDAD') then
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                else
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
                if (CEROS = 'S') then
                    INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (4, USER, :ARTICULO);
                SUSPEND;
                END
            if (CEROS = 'S') then
                BEGIN
                COSTO = 0;
                UTILIDAD = 0;
                PORC = 0;
                /* agregue los articulos sin factura */
                FOR SELECT ARTI_COD, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN and
                    not exists (select REPA_ARTICULO FROM REPORTES_AUX WHERE REPA_ID = 4 AND REPA_USER = USER AND REPA_ARTICULO = a.arti_cod)
                    INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                    DO
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        if (BIN_AND(TIPO, 2) <> 0) then
            BEGIN
            SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 32 INTO :NOMTIPO;
            FOR SELECT R.PREF_PRE, REVT_NUMERO, REVT_FECHA, ARTI_COD, RVDE_CANT * RVDE_FACTOR, (RVDE_TOTAL - RVDE_IVAMONTO), RVDE_IVAMONTO, RVDE_DTOPORC, RVDE_TOTAL, RVDE_CONSUMO
                FROM REMISIONES_VENTA R, REMISIONES_VENTA_DETALLE D, PREFIJOS P
                WHERE R.REVT_ID = D.REVT_ID AND REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN AND VEND_COD = :CODVEND AND REVT_ANULADO = 'N'
                 AND P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = 32 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                ORDER BY ARTI_COD, REVT_FECHA, R.REVT_ID, RVDE_ITEM
                INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :DTO, :TOTAL, :CONSUMO
                DO
                BEGIN
                SELECT ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO WHERE ARTI_COD = :ARTICULO
                    INTO :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC;
                SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                EXECUTE PROCEDURE costo_promedio (:ARTICULO, :FECHA) RETURNING_VALUES (:COSTOUNIT);
                COSTO = COSTOUNIT * CANTIDAD;
                UTILIDAD = BASE - COSTO;
                if (UOM = 'UTILIDAD') then
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                else
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
                if (CEROS = 'S') then
                    INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (4, USER, :ARTICULO);
                SUSPEND;
                END
            if (CEROS = 'S') then
                BEGIN
                COSTO = 0;
                UTILIDAD = 0;
                PORC = 0;
                /* agregue los articulos sin factura */
                FOR SELECT ARTI_COD, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN and
                    not exists (select REPA_ARTICULO FROM REPORTES_AUX WHERE REPA_ID = 4 AND REPA_USER = USER AND REPA_ARTICULO = a.arti_cod)
                    INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                    DO
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        if (BIN_AND(TIPO, 4) <> 0) then
            BEGIN
            SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 33 INTO :NOMTIPO;
            FOR SELECT V.PREF_PRE, DEVT_NUMERO, DEVT_FECHA, ARTI_COD, DVDE_CANT * DVDE_FACTOR, (DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO)*DEVT_FACTOR,
                DVDE_IVAMONTO*DEVT_FACTOR, DVDE_DTOPORC, DVDE_TOTAL*DEVT_FACTOR, DVDE_CONSUMO
                FROM DEVOLUCIONES_VENTAS V, DEVOLUCIONES_VENTAS_DETALLE D, PREFIJOS P
                WHERE V.DEVT_ID = D.DEVT_ID AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND VEND_COD = :CODVEND AND DEVT_ANULADO = 'N'
                 AND P.PREF_PRE = V.PREF_PRE AND P.TIDO_COD = 33 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                ORDER BY ARTI_COD, DEVT_FECHA, D.DEVT_ID, DVDE_ITEM
                INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :DTO, :TOTAL, :CONSUMO
                DO
                BEGIN
                SELECT ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO WHERE ARTI_COD = :ARTICULO
                    INTO :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC;
                SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                EXECUTE PROCEDURE costo_promedio (:ARTICULO, :FECHA) RETURNING_VALUES (:COSTOUNIT);
                COSTO = COSTOUNIT * CANTIDAD;
                UTILIDAD = BASE - COSTO;
                if (UOM = 'UTILIDAD') then
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                else
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
                TOTAL = TOTAL * -1;
                IVA = IVA * -1;
                BASE = BASE * -1;
                CANTIDAD = CANTIDAD * -1;
                COSTO = COSTO * -1;
                UTILIDAD = UTILIDAD * -1;
                if (CEROS = 'S') then
                    INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (4, USER, :ARTICULO);
                SUSPEND;
                END
            if (CEROS = 'S') then
                BEGIN
                COSTO = 0;
                UTILIDAD = 0;
                PORC = 0;
                /* agregue los articulos sin factura */
                FOR SELECT ARTI_COD, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN and
                    not exists (select REPA_ARTICULO FROM REPORTES_AUX WHERE REPA_ID = 4 AND REPA_USER = USER AND REPA_ARTICULO = a.arti_cod)
                    INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                    DO
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        if (BIN_AND(TIPO, 8) <> 0) then
            BEGIN
            SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 34 INTO :NOMTIPO;
            FOR SELECT P.PREF_PRE, PEDI_NUMERO, PEDI_FECHA, ARTI_COD, PEDE_CANT * PEDE_FACTOR, (PEDE_TOTAL-PEDE_IVAMONTO-PEDE_CONSUMO)*PEDI_FACTOR,
                PEDE_IVAMONTO*PEDI_FACTOR, PEDE_DTOPORC, PEDE_TOTAL*PEDI_FACTOR, PEDE_CONSUMO
                FROM PEDIDOS P, PEDIDOS_DETALLE D, PREFIJOS PR
                WHERE P.PEDI_ID = D.PEDI_ID AND PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND VEND_COD = :CODVEND AND PEDI_ANULADO = 'N'
                 AND P.PREF_PRE = PR.PREF_PRE AND P.TIDO_COD = 34 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                ORDER BY ARTI_COD, PEDI_FECHA, P.PEDI_ID, PEDE_ITEM
                INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :DTO, :TOTAL, :CONSUMO
                DO
                BEGIN
                SELECT ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO WHERE ARTI_COD = :ARTICULO
                    INTO :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC;
                SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                EXECUTE PROCEDURE costo_promedio (:ARTICULO, :FECHA) RETURNING_VALUES (:COSTOUNIT);
                COSTO = COSTOUNIT * CANTIDAD;
                UTILIDAD = BASE - COSTO;
                if (UOM = 'UTILIDAD') then
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                else
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
                if (CEROS = 'S') then
                    INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (4, USER, :ARTICULO);
                SUSPEND;
                END
            if (CEROS = 'S') then
                BEGIN
                COSTO = 0;
                UTILIDAD = 0;
                PORC = 0;
                /* agregue los articulos sin factura */
                FOR SELECT ARTI_COD, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN and
                    not exists (select REPA_ARTICULO FROM REPORTES_AUX WHERE REPA_ID = 4 AND REPA_USER = USER AND REPA_ARTICULO = a.arti_cod)
                    INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                    DO
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        if (BIN_AND(TIPO, 16) <> 0) then
            BEGIN
            SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 35 INTO :NOMTIPO;
            FOR SELECT C.PREF_PRE, COTI_NUMERO, COTI_FECHA, ARTI_COD, CTDE_CANT * CTDE_FACTOR, (CTDE_TOTAL-CTDE_IVAMONTO-CTDE_CONSUMO)*COTI_FACTOR,
                CTDE_IVAMONTO*COTI_FACTOR, CTDE_DTOPORC, CTDE_TOTAL*COTI_FACTOR, CTDE_CONSUMO
                FROM COTIZACIONES C, COTIZACIONES_DETALLE D, PREFIJOS P
                WHERE C.COTI_ID = D.COTI_ID AND ARTI_COD = :ARTICULO AND COTI_FECHA >= :FECINI AND COTI_FECHA <= :FECFIN AND VEND_COD = :CODVEND AND COTI_ANULADO = 'N'
                 AND P.PREF_PRE = C.PREF_PRE AND P.TIDO_COD = 35 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                ORDER BY COTI_FECHA, C.COTI_ID, CTDE_ITEM
                INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :DTO, :TOTAL, :CONSUMO
                DO
                BEGIN
                SELECT ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO WHERE ARTI_COD = :ARTICULO
                    INTO :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC;
                SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                EXECUTE PROCEDURE costo_promedio (:ARTICULO, :FECHA) RETURNING_VALUES (:COSTOUNIT);
                COSTO = COSTOUNIT * CANTIDAD;
                UTILIDAD = BASE - COSTO;
                if (UOM = 'UTILIDAD') then
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                else
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
                if (CEROS = 'S') then
                    INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (4, USER, :ARTICULO);
                SUSPEND;
                END
            if (CEROS = 'S') then
                BEGIN
                COSTO = 0;
                UTILIDAD = 0;
                PORC = 0;
                /* agregue los articulos sin factura */
                FOR SELECT ARTI_COD, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN and
                    not exists (select REPA_ARTICULO FROM REPORTES_AUX WHERE REPA_ID = 4 AND REPA_USER = USER AND REPA_ARTICULO = a.arti_cod)
                    INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                    DO
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        END
    END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER PROCEDURE IMPUESTOS_VENTAS(
    FECINI DATE,
    FECFIN DATE,
    PREFIJO VARCHAR(4),
    PTOINI INTEGER,
    PTOFIN INTEGER,
    ANULADOS CHAR(1),
    SUBEMPRESA INTEGER)
RETURNS (
    TIPO INTEGER,
    NOMTIPO VARCHAR(30),
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    NIT VARCHAR(20),
    NOMTERCERO VARCHAR(60),
    SUBTOTAL NUMERIC(18,2),
    DTOMONTO NUMERIC(18,2),
    ADICIONAL NUMERIC(18,2),
    IVAMONTO NUMERIC(18,2),
    CONSUMO NUMERIC(18,2),
    EXENTOS NUMERIC(18,2),
    GRAVADOS1 NUMERIC(18,2),
    GRAVADOS2 NUMERIC(18,2),
    GRAVADOS3 NUMERIC(18,2),
    IVA1 NUMERIC(18,2),
    IVA2 NUMERIC(18,2),
    IVA3 NUMERIC(18,2),
    EXTRA NUMERIC(18,2),
    TOTAL NUMERIC(18,2),
    RTFTEMONTO NUMERIC(18,2),
    RTIVAMONTO NUMERIC(18,2),
    RTICAMONTO 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);
BEGIN
/* FACTURA */
TIPO = 31;
SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 31 INTO :NOMTIPO;

FOR SELECT FACT_ID, F.PREF_PRE, FACT_NUMERO, FACT_FECHA, TERC_NIT, FACT_NOMCLIENTE, FACT_ADICIONAL-FACT_DTOMONTO, FACT_IVAMONTO, FACT_RTFTEMONTO, FACT_RTIVAMONTO, FACT_RTICAMONTO, FACT_EXTRA, FACT_TOTAL, FACT_ANULADO
    FROM FACTURAS F, PREFIJOS PR WHERE PTVT_ID >= :PTOINI AND PTVT_ID <= :PTOFIN AND
    FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND ((:PREFIJO = '') or (:PREFIJO IS NULL) or (F.PREF_PRE = :PREFIJO))
    AND PR.PREF_PRE = F.PREF_PRE AND PR.TIDO_COD = 31 AND ((PR.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
    ORDER BY FACT_FECHA, F.PREF_PRE, FACT_NUMERO
    INTO :ID, :PREF, :NUMERO, :FECHA, :NIT, :NOMTERCERO, :DTOMONTO, :IVAMONTO, :RTFTEMONTO, :RTIVAMONTO, :RTICAMONTO, :EXTRA, :TOTAL, :ANULADO
    DO
    BEGIN
    SELECT TERC_EXENTO FROM TERCEROS WHERE TERC_NIT = :NIT INTO :TER_EXENTO;
    if ((ANULADOS = 'S') or (ANULADO = 'N')) then
        BEGIN
        if (ANULADO = 'S') then
            BEGIN
            EXENTOS = 0;
            GRAVADOS1 = 0;
            GRAVADOS2 = 0;
            GRAVADOS3 = 0;
            CONSUMO = 0;
            SUBTOTAL = 0;
            TOTAL = 0;
            EXTRA = 0;
            IVAMONTO = 0;
            DTOMONTO = 0;
            NETO = 0;
            RTFTEMONTO = 0;
            RTIVAMONTO = 0;
            RTICAMONTO = 0;
            END
        else
            BEGIN
            /* CALCULE LAS DIFERENTES TARIFAS */
            if (TER_EXENTO = 'S') then
                BEGIN
                SELECT SUM(FADE_TOTAL - FADE_IVAMONTO - FADE_CONSUMO) FROM FACTURAS_DETALLE D WHERE FACT_ID = :ID INTO :EXENTOS;
                GRAVADOS1 = 0;
                GRAVADOS2 = 0;
                GRAVADOS3 = 0;
                end
            else
                begin
                SELECT SUM(FADE_TOTAL - FADE_IVAMONTO - FADE_CONSUMO) FROM FACTURAS_DETALLE D WHERE FACT_ID = :ID AND FADE_IVAPORC = 0 INTO :EXENTOS;
                SELECT SUM(FADE_TOTAL - FADE_IVAMONTO - FADE_CONSUMO), SUM(FADE_IVAMONTO) FROM FACTURAS_DETALLE D, TARIFA_IVA T WHERE FACT_ID = :ID AND FADE_IVAPORC = TAIV_PORC AND TAIV_COD = 1 INTO :GRAVADOS1, :IVA1;
                SELECT SUM(FADE_TOTAL - FADE_IVAMONTO - FADE_CONSUMO), SUM(FADE_IVAMONTO) FROM FACTURAS_DETALLE D, TARIFA_IVA T WHERE FACT_ID = :ID AND FADE_IVAPORC = TAIV_PORC AND TAIV_COD = 2 INTO :GRAVADOS2, :IVA2;
                SELECT SUM(FADE_TOTAL - FADE_IVAMONTO - FADE_CONSUMO), SUM(FADE_IVAMONTO) FROM FACTURAS_DETALLE D, TARIFA_IVA T WHERE FACT_ID = :ID AND FADE_IVAPORC = TAIV_PORC AND TAIV_COD = 3 INTO :GRAVADOS3, :IVA3;
                end
            SELECT SUM(FADE_CONSUMO) FROM FACTURAS_DETALLE WHERE FACT_ID = :ID INTO :CONSUMO;
            SUBTOTAL = TOTAL - EXTRA - IVAMONTO - DTOMONTO;
            NETO = TOTAL - RTFTEMONTO - RTIVAMONTO - RTICAMONTO;
            END
        SUSPEND;
        END
    END
    
TIPO = 33;
SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 33 INTO :NOMTIPO;
/* DEVOLUCIONES */
FOR SELECT DEVT_ID, D.PREF_PRE, DEVT_NUMERO, DEVT_FECHA, TERC_NIT, DEVT_NOMTERC, DEVT_ADICIONAL-DEVT_DTOMONTO, DEVT_IVAMONTO, DEVT_RTFTEMONTO, DEVT_RTIVAMONTO, DEVT_RTICAMONTO, DEVT_EXTRA, DEVT_TOTAL, DEVT_ANULADO
    FROM DEVOLUCIONES_VENTAS D, PREFIJOS PR WHERE PTVT_ID >= :PTOINI AND PTVT_ID <= :PTOFIN AND
    DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND ((:PREFIJO = '') or (:PREFIJO IS NULL) or (D.PREF_PRE = :PREFIJO))
    AND PR.PREF_PRE = D.PREF_PRE AND PR.TIDO_COD = 33 AND ((PR.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) AND ((DEVT_REMID = 0) or (DEVT_REMID IS NULL))
    ORDER BY DEVT_FECHA, D.PREF_PRE, DEVT_NUMERO
    INTO :ID, :PREF, :NUMERO, :FECHA, :NIT, :NOMTERCERO, :DTOMONTO, :IVAMONTO, :RTFTEMONTO, :RTIVAMONTO, :RTICAMONTO, :EXTRA, :TOTAL, :ANULADO
    DO
    BEGIN
    SELECT TERC_EXENTO FROM TERCEROS WHERE TERC_NIT = :NIT INTO :TER_EXENTO;
    if ((ANULADOS = 'S') or (ANULADO = 'N')) then
        BEGIN
        if (ANULADO = 'S') then
            BEGIN
            EXENTOS = 0;
            GRAVADOS1 = 0;
            GRAVADOS2 = 0;
            GRAVADOS3 = 0;
            CONSUMO = 0;
            SUBTOTAL = 0;
            TOTAL = 0;
            EXTRA = 0;
            IVAMONTO = 0;
            DTOMONTO = 0;
            NETO = 0;
            RTFTEMONTO = 0;
            RTIVAMONTO = 0;
            RTICAMONTO = 0;
            END
        else
            BEGIN
            DTOMONTO = DTOMONTO * -1;
            ADICIONAL = ADICIONAL * -1;
            IVAMONTO = IVAMONTO * -1;
            EXTRA = EXTRA * -1;
            TOTAL = TOTAL * -1;
            RTFTEMONTO = RTFTEMONTO * -1;
            RTIVAMONTO = RTIVAMONTO * -1;
            RTICAMONTO = RTICAMONTO * -1;
            /* CALCULE LAS DIFERENTES TARIFAS */
            if (TER_EXENTO = 'S') then
             BEGIN
              SELECT SUM(DVDE_TOTAL - DVDE_IVAMONTO - DVDE_CONSUMO) FROM DEVOLUCIONES_VENTAS_DETALLE D WHERE DEVT_ID = :ID INTO :EXENTOS;
              GRAVADOS1 = 0;
              GRAVADOS2 = 0;
              GRAVADOS3 = 0;
             end
            else
             begin
              SELECT SUM(DVDE_TOTAL - DVDE_IVAMONTO - DVDE_CONSUMO) FROM DEVOLUCIONES_VENTAS_DETALLE D WHERE DEVT_ID = :ID AND DVDE_IVAPORC = 0 INTO :EXENTOS;
              SELECT SUM(DVDE_TOTAL - DVDE_IVAMONTO - DVDE_CONSUMO), SUM(DVDE_IVAMONTO) FROM DEVOLUCIONES_VENTAS_DETALLE D, TARIFA_IVA T WHERE DEVT_ID = :ID AND DVDE_IVAPORC = TAIV_PORC AND TAIV_COD = 1 INTO :GRAVADOS1, :IVA1;
              SELECT SUM(DVDE_TOTAL - DVDE_IVAMONTO - DVDE_CONSUMO), SUM(DVDE_IVAMONTO) FROM DEVOLUCIONES_VENTAS_DETALLE D, TARIFA_IVA T WHERE DEVT_ID = :ID AND DVDE_IVAPORC = TAIV_PORC AND TAIV_COD = 2 INTO :GRAVADOS2, :IVA2;
              SELECT SUM(DVDE_TOTAL - DVDE_IVAMONTO - DVDE_CONSUMO), SUM(DVDE_IVAMONTO) FROM DEVOLUCIONES_VENTAS_DETALLE D, TARIFA_IVA T WHERE DEVT_ID = :ID AND DVDE_IVAPORC = TAIV_PORC AND TAIV_COD = 3 INTO :GRAVADOS3, :IVA3;
             end
            SELECT SUM(DVDE_CONSUMO) FROM DEVOLUCIONES_VENTAS_DETALLE WHERE DEVT_ID = :ID INTO :CONSUMO;
            SUBTOTAL = TOTAL - EXTRA - IVAMONTO - DTOMONTO;
            NETO = TOTAL - RTFTEMONTO - RTIVAMONTO - RTICAMONTO;
            EXENTOS = EXENTOS * -1;
            GRAVADOS1 = GRAVADOS1 * -1;
            GRAVADOS2 = GRAVADOS2 * -1;
            GRAVADOS3 = GRAVADOS3 * -1;
            CONSUMO = CONSUMO * -1;
            END
        SUSPEND;
        END
    END
execute procedure lee_configuracion ('FACTURACION', 'DOCUMENTOS', 'INCLUIR NOTAS DE CARTERA EN REPORTE DE IMPUESTOS EN VENTAS') returning_values (:NOTAS);
if (NOTAS = 'SI') then
    BEGIN
    TIPO = 41;
    SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 41 INTO :NOMTIPO;
    FOR SELECT NDCL_ID, N.PREF_PRE, NDCL_NUMERO, NDCL_FECHA, N.TERC_NIT, TERC_NOM, 0, NDCL_IVAMONTO, NDCL_RTFTEMONTO, NDCL_RTIVAMONTO, NDCL_RTICAMONTO, 0, NDCL_MONTO+NDCL_IVAMONTO, NDCL_ANULADO
        FROM NOTAS_DEBITO_CLIENTES N, TERCEROS T, PREFIJOS PR WHERE N.TERC_NIT = T.TERC_NIT AND
        NDCL_FECHA >= :FECINI AND NDCL_FECHA <= :FECFIN AND ((:PREFIJO = '') or (:PREFIJO IS NULL) or (N.PREF_PRE = :PREFIJO))
        AND PR.PREF_PRE = N.PREF_PRE AND PR.TIDO_COD = 41 AND ((PR.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
        ORDER BY NDCL_FECHA, N.PREF_PRE, NDCL_NUMERO
        INTO :ID, :PREF, :NUMERO, :FECHA, :NIT, :NOMTERCERO, :DTOMONTO, :IVAMONTO, :RTFTEMONTO, :RTIVAMONTO, :RTICAMONTO, :EXTRA, :TOTAL, :ANULADO
        DO
        BEGIN
        GRAVADOS2 = 0;
        GRAVADOS3 = 0;
        IVA2 = 0;
        IVA3 = 0;
        CONSUMO = 0;
        if (ANULADO = 'S') then
            BEGIN
            EXENTOS = 0;
            GRAVADOS1 = 0;
            SUBTOTAL = 0;
            TOTAL = 0;
            EXTRA = 0;
            IVAMONTO = 0;
            DTOMONTO = 0;
            NETO = 0;
            RTFTEMONTO = 0;
            RTIVAMONTO = 0;
            RTICAMONTO = 0;
            END
        ELSE
            BEGIN
            if (IVAMONTO <> 0) then
                BEGIN
                GRAVADOS1 = TOTAL-IVAMONTO;
                IVA1 = IVAMONTO;
                exentos = 0;
                END
            ELSE
                BEGIN
                GRAVADOS1 = 0;
                IVA1 = 0;
                exentos = TOTAL;
                END
            SUBTOTAL = TOTAL - EXTRA - IVAMONTO - DTOMONTO;
            NETO = TOTAL - RTFTEMONTO - RTIVAMONTO - RTICAMONTO;
            END
        SUSPEND;
        END

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

SET TERM ; ^



/* 06-11 cruces cartera vs cxpagar */

CREATE TABLE EGRESOS_CRUCEC (
    EGRE_ID        T_ID NOT NULL,
    EGCC_ITEM      T_ID NOT NULL,
    EGCC_TIPODOC   T_ID,
    EGCC_PREFIJO   T_PROYECTO,
    EGCC_NUMERO    T_NUMDOC,
    EGCC_ABONO     T_MONTO,
    EGCC_RTFTE     T_MONTO,
    EGCC_RTIVA     T_MONTO,
    EGCC_RTICA     T_MONTO,
    EGCC_DTOF      T_MONTO,
    EGCC_SUCURSAL  VARCHAR(10),
    EGCC_ANULADO   T_BOOLEANO,
    EGCC_TRANSMIT  T_BOOLEANO,
    EGCC_IDDOC     T_ID
);

ALTER TABLE EGRESOS_CRUCEC ADD CONSTRAINT PK_EGRESOS_CRUCEC PRIMARY KEY (EGRE_ID, EGCC_ITEM);

SET TERM ^ ;

CREATE OR ALTER TRIGGER EGRESOS_CRUCEC_AI FOR EGRESOS_CRUCEC
ACTIVE AFTER INSERT POSITION 0
AS
declare variable EXISTE CHAR(1);
declare variable FEC DATE;
declare variable NIT VARCHAR(20);
declare variable CONCEPTO VARCHAR(60);
declare variable PREFIJO VARCHAR(4);
declare variable NUMERO VARCHAR(6);
declare variable SALDO NUMERIC(18,2);
declare variable RETES CHAR(2);
declare variable COBR INTEGER;
BEGIN
if ((NEW.egre_id <> 0) and (new.egcc_anulado = 'N')) then
    BEGIN
    /* Abone el documento referenciado */
    select PREF_PRE, EGRE_NUMERO, EGRE_fecha, EGRE_CONC, TERC_NIT from EGRESOS
        where EGRE_id = new.egre_id into :PREFIJO, :NUMERO, :FEC, :CONCEPTO, :NIT;
    SELECT COBR_COD FROM cliente_sucursales WHERE TERC_NIT = :NIT AND CLCU_COD = NEW.egcc_sucursal INTO :COBR;
    /* valide que no se pase del saldo */
    execute procedure saldo_doc_cartera(new.egcc_tipodoc, new.egcc_iddoc, '9999/12/31') returning_values(saldo);
    execute procedure lee_configuracion('CARTERA', 'SALDOS', 'DESCONTAR RETENCIONES POR CAUSACION') returning_values (RETES);
    if (SALDO < 0) then
        BEGIN
        if (RETES = 'SI') then
            begin
            if (saldo > (NEW.egcc_abono + NEW.egcc_dtof)) then
                EXCEPTION DOCUMENTO_ABONO_MAYOR;
            end
        ELSE
            begin
            if (saldo > (NEW.egcc_abono + NEW.egcc_rtfte + NEW.egcc_rtiva + NEW.egcc_rtica + NEW.egcc_dtof)) then
                EXCEPTION DOCUMENTO_ABONO_MAYOR;
            end
        END
    else
        BEGIN
        if (RETES = 'SI') then
            begin
            if (saldo < (NEW.egcc_abono + NEW.egcc_dtof)) then
                EXCEPTION DOCUMENTO_ABONO_MAYOR;
            end
        ELSE
            begin
            if (saldo < (NEW.egcc_abono + NEW.egcc_rtfte + NEW.egcc_rtiva + NEW.egcc_rtica + NEW.egcc_dtof)) then
                EXCEPTION DOCUMENTO_ABONO_MAYOR;
            end
        END
    EXISTE = 'N';
    select 'S' from saldos_doc_cartera where sdca_tiporef = new.egcc_tipodoc and sdca_idref = new.egcc_iddoc and sdca_fecha = :FEC into :EXISTE;
    if (Existe = 'S') then
        begin
        /* actualice el saldo del dia */
        UPDATE saldos_doc_cartera
            SET SDCA_ABONO = SDCA_ABONO + NEW.egcc_abono + new.egcc_dtof,
                SDCA_ABRTFTE = SDCA_ABRTFTE + NEW.egcc_rtfte,
                SDCA_ABRTIVA = SDCA_ABRTIVA + NEW.egcc_rtiva,
                SDCA_ABRTICA = SDCA_ABRTICA + NEW.egcc_rtica
                WHERE SDCA_TIPOREF = NEW.egcc_tipodoc AND SDCA_IDREF = NEW.egcc_iddoc AND SDCA_FECHA = :FEC;
        END
    ELSE
        BEGIN
        /* Inserte un nuevo saldo diario */
        INSERT INTO SALDOS_DOC_CARTERA (SDCA_TIPOREF, SDCA_IDREF, SDCA_FECHA, TERC_NIT, SDCA_RTFTE, SDCA_RTIVA, SDCA_RTICA, SDCA_ABONO, SDCA_ABRTFTE, SDCA_ABRTIVA, SDCA_ABRTICA, SDCA_DEBITO, SDCA_MONTO)
            VALUES (NEW.egcc_tipodoc, NEW.egcc_iddoc, :FEC, :NIT, 0, 0, 0, (NEW.egcc_abono+NEW.egcc_dtof), NEW.egcc_rtfte, NEW.egcc_rtiva, NEW.egcc_rtica, 'N', 0);
        END
    /* actualice el registro en mov_cliente (por si son varios items) */
    EXISTE = 'N';
    SELECT 'S' FROM MOVIMIENTO_CLIENTES WHERE MVCL_TIPOREF = 62 AND MVCL_IDREF = NEW.egre_id AND MVCL_SUCURSAL = NEW.egcc_sucursal INTO :EXISTE;
    if (EXISTE = 'S') then
        begin
        UPDATE movimiento_clientes
            SET MVCL_MONTO = MVCL_MONTO + NEW.egcc_abono + NEW.egcc_dtof,
                MVCL_RTEFTE = MVCL_RTEFTE + NEW.egcc_rtfte,
                MVCL_RTEIVA = MVCL_RTEIVA + NEW.egcc_rtiva,
                MVCL_RTEICA = MVCL_RTEICA + NEW.egcc_rtica
            WHERE MVCL_TIPOREF = 62 AND MVCL_IDREF = NEW.egre_id;
        end
    ELSE
        INSERT INTO MOVIMIENTO_CLIENTES (MVCL_ID, TERC_NIT, MVCL_TIPOREF, MVCL_IDREF, MVCL_FECHA, MVCL_VENCE, MVCL_CONC, MVCL_MONTO, MVCL_RTEFTE, MVCL_RTEIVA, MVCL_RTEICA, MVCL_DEBITO, MVCL_ABONO, MVCL_PREFREF, MVCL_NUMREF, MVCL_SUCURSAL, COBR_COD)
            VALUES (GEN_ID(ID_MOVCLI, 1), :NIT, 62, NEW.egre_id, :FEC, :FEC, :CONCEPTO, (NEW.egcc_abono+NEW.egcc_dtof), NEW.egcc_rtfte, NEW.egcc_rtiva, NEW.egcc_rtica, 'N', 'S', :PREFIJO, :NUMERO, NEW.egcc_sucursal, :COBR);
    end
END
^

SET TERM ; ^

SET TERM ^ ;

create trigger EGRESOS_CRUCEC_AU for EGRESOS_CRUCEC
active AFTER UPDATE position 0
AS
declare variable EXISTE CHAR(1);
declare variable FEC DATE;
declare variable NIT VARCHAR(20);
declare variable CONCEPTO VARCHAR(60);
declare variable PREFIJO VARCHAR(4);
declare variable NUMERO VARCHAR(6);
declare variable SALDO NUMERIC(18,2);
declare variable RETES char(2);
declare variable COBR INTEGER;
BEGIN
select PREF_PRE, EGRE_NUMERO, EGRE_fecha, EGRE_CONC, TERC_NIT
    from egresos where egre_id = new.egre_id
    into :PREFIJO, :NUMERO, :FEC, :CONCEPTO, :NIT;
/* Borre el viejo */
if ((old.egre_id <> 0) AND (OLD.egcc_anulado = 'N')) then
    BEGIN
    UPDATE saldos_doc_cartera
        SET SDCA_ABONO = SDCA_ABONO - old.egcc_abono - OLD.egcc_dtof,
        SDCA_ABRTFTE = SDCA_ABRTFTE - old.egcc_rtfte,
        SDCA_ABRTIVA = SDCA_ABRTIVA - old.egcc_rtiva,
        SDCA_ABRTICA = SDCA_ABRTICA - old.egcc_rtica
        WHERE SDCA_TIPOREF = old.egcc_tipodoc AND SDCA_IDREF = old.egcc_iddoc AND SDCA_FECHA = :FEC;
    UPDATE movimiento_clientes
        SET MVCL_MONTO = MVCL_MONTO - OLD.egcc_abono - OLD.egcc_dtof,
        MVCL_RTEFTE = MVCL_RTEFTE - OLD.egcc_rtfte,
        MVCL_RTEIVA = MVCL_RTEIVA - OLD.egcc_rtiva,
        MVCL_RTEICA = MVCL_RTEICA - OLD.egcc_rtica
        WHERE MVCL_TIPOREF = 62 AND MVCL_IDREF = OLD.egre_id AND MVCL_SUCURSAL = old.egcc_sucursal;
    END
if ((NEW.egre_id <> 0) and (NEW.egcc_anulado = 'N')) then
    BEGIN
    SELECT COBR_COD FROM cliente_sucursales WHERE TERC_NIT = :NIT AND CLCU_COD = NEW.egcc_sucursal INTO :COBR;
    /* valide que no se pase del saldo */
    execute procedure saldo_doc_cartera(new.egcc_tipodoc, new.egcc_iddoc, '9999/12/31') returning_values(saldo);
    execute procedure lee_configuracion('CARTERA', 'SALDOS', 'DESCONTAR RETENCIONES POR CAUSACION') returning_values (RETES);
    if (SALDO < 0) then
        BEGIN
        if (RETES = 'SI') then
            begin
            if (saldo > (NEW.egcc_abono + NEW.egcc_dtof)) then
                EXCEPTION DOCUMENTO_ABONO_MAYOR;
            end
        ELSE
            begin
            if (saldo > (NEW.egcc_abono + NEW.egcc_rtfte + NEW.egcc_rtiva + NEW.egcc_rtica + NEW.egcc_dtof)) then
                EXCEPTION DOCUMENTO_ABONO_MAYOR;
            end
        END
    else
        BEGIN
        if (RETES = 'SI') then
            begin
            if (saldo < (NEW.egcc_abono + NEW.egcc_dtof)) then
                EXCEPTION DOCUMENTO_ABONO_MAYOR;
            end
        ELSE
            begin
            if (saldo < (NEW.egcc_abono + NEW.egcc_rtfte + NEW.egcc_rtiva + NEW.egcc_rtica + NEW.egcc_dtof)) then
                EXCEPTION DOCUMENTO_ABONO_MAYOR;
            end
        END
    select 'S' from saldos_doc_cartera where sdca_tiporef = new.egcc_tipodoc and sdca_idref = new.egcc_iddoc and sdca_fecha = :FEC into :EXISTE;
    if (Existe = 'S') then
        /* actualice el saldo del dia */
        UPDATE saldos_doc_cartera
            SET SDCA_ABONO = SDCA_ABONO + NEW.egcc_abono + NEW.egcc_dtof,
            SDCA_ABRTFTE = SDCA_ABRTFTE + NEW.egcc_rtfte,
            SDCA_ABRTIVA = SDCA_ABRTIVA + NEW.egcc_rtiva,
            SDCA_ABRTICA = SDCA_ABRTICA + NEW.egcc_rtica
            WHERE SDCA_TIPOREF = NEW.egcc_tipodoc AND SDCA_IDREF = NEW.egcc_iddoc AND SDCA_FECHA = :FEC;
    ELSE
        /* Inserte un nuevo saldo diario */
        INSERT INTO SALDOS_DOC_CARTERA (SDCA_TIPOREF, SDCA_IDREF, SDCA_FECHA, TERC_NIT, SDCA_RTFTE, SDCA_RTIVA, SDCA_RTICA, SDCA_ABONO, SDCA_ABRTFTE, SDCA_ABRTIVA, SDCA_ABRTICA, SDCA_DEBITO, SDCA_MONTO)
            VALUES (NEW.egcc_tipodoc, NEW.egcc_iddoc, :FEC, :NIT, 0, 0, 0, (NEW.egcc_abono+NEW.egcc_dtof), NEW.egcc_rtfte, NEW.egcc_rtiva, NEW.egcc_rtica, 'N', 0);
    /* Registre o actualice el registro en movimiento_cliente */
    EXISTE = 'N';
    SELECT 'S' FROM MOVIMIENTO_CLIENTES WHERE MVCL_TIPOREF = 62 AND MVCL_IDREF = NEW.egre_id and mvcl_sucursal = new.egcc_sucursal INTO :EXISTE;
    if (EXISTE = 'S') then
        begin
        /* Deshaga el viejo */
        if (old.egre_id <> 0) then
            UPDATE movimiento_clientes
                SET MVCL_MONTO = MVCL_MONTO - OLD.egcc_abono - OLD.egcc_dtof,
                    MVCL_RTEFTE = MVCL_RTEFTE - OLD.egcc_rtfte,
                    MVCL_RTEIVA = MVCL_RTEIVA - OLD.egcc_rtiva,
                    MVCL_RTEICA = MVCL_RTEICA - OLD.egcc_rtica
                WHERE MVCL_TIPOREF = 62 AND MVCL_IDREF = NEW.egre_id AND MVCL_SUCURSAL = NEW.egcc_sucursal;
        /* Actualice el nuevo */
        UPDATE movimiento_clientes
            SET MVCL_MONTO = MVCL_MONTO + NEW.egcc_abono + NEW.egcc_dtof,
                MVCL_RTEFTE = MVCL_RTEFTE + NEW.egcc_rtfte,
                MVCL_RTEIVA = MVCL_RTEIVA + NEW.egcc_rtiva,
                MVCL_RTEICA = MVCL_RTEICA + NEW.egcc_rtica
            WHERE MVCL_TIPOREF = 62 AND MVCL_IDREF = NEW.egre_id AND MVCL_SUCURSAL = NEW.egcc_sucursal;
        end
    ELSE
        INSERT INTO MOVIMIENTO_CLIENTES (MVCL_ID, TERC_NIT, MVCL_TIPOREF, MVCL_IDREF, MVCL_FECHA, MVCL_VENCE, MVCL_CONC, MVCL_MONTO, MVCL_RTEFTE, MVCL_RTEIVA, MVCL_RTEICA, MVCL_DEBITO, MVCL_ABONO, MVCL_PREFREF, MVCL_NUMREF, MVCL_SUCURSAL, COBR_COD)
            VALUES (GEN_ID(ID_MOVCLI, 1), :NIT, 62, NEW.egre_id, :FEC, :FEC, :CONCEPTO, (NEW.egcc_abono+NEW.egcc_dtof), NEW.egcc_rtfte, NEW.egcc_rtiva, NEW.egcc_rtica, 'N', 'S', :PREFIJO, :NUMERO, NEW.egcc_sucursal, :COBR);
    END
END
^

SET TERM ; ^

GRANT UPDATE,REFERENCES ON EGRESOS_CRUCEC TO TRIGGER EGRESOS_CRUCEC_AU;
GRANT SELECT ON EGRESOS TO TRIGGER EGRESOS_CRUCEC_AU;
GRANT SELECT,INSERT,UPDATE ON SALDOS_DOC_CARTERA TO TRIGGER EGRESOS_CRUCEC_AU;
GRANT SELECT,INSERT,UPDATE ON MOVIMIENTO_CLIENTES TO TRIGGER EGRESOS_CRUCEC_AU;
GRANT SELECT ON CLIENTE_SUCURSALES TO TRIGGER EGRESOS_CRUCEC_AU;
GRANT EXECUTE ON PROCEDURE SALDO_DOC_CARTERA TO TRIGGER EGRESOS_CRUCEC_AU;
GRANT EXECUTE ON PROCEDURE LEE_CONFIGURACION TO TRIGGER EGRESOS_CRUCEC_AU;

SET TERM ^ ;

create trigger EGRESOS_CRUCEC_AD for EGRESOS_CRUCEC
active AFTER DELETE position 0
as
declare variable FEC DATE;
BEGIN
if (old.egre_id <> 0) then
    BEGIN
    select egre_fecha from egresos where egre_id = OLD.egre_id into :FEC;
    if (OLD.egcc_anulado = 'N') then
        begin
        UPDATE saldos_doc_cartera
            SET SDCA_ABONO = SDCA_ABONO - old.egcc_abono - OLD.egcc_dtof,
            SDCA_ABRTFTE = SDCA_ABRTFTE - old.egcc_rtfte,
            SDCA_ABRTIVA = SDCA_ABRTIVA - old.egcc_rtiva,
            SDCA_ABRTICA = SDCA_ABRTICA - old.egcc_rtica
            WHERE SDCA_TIPOREF = old.egcc_tipodoc AND SDCA_IDREF = old.egcc_iddoc AND SDCA_FECHA = :FEC;
        UPDATE movimiento_clientes
            SET MVCL_MONTO = MVCL_MONTO - OLD.egcc_abono - OLD.egcc_dtof,
            MVCL_RTEFTE = MVCL_RTEFTE - OLD.egcc_rtfte,
            MVCL_RTEIVA = MVCL_RTEIVA - OLD.egcc_rtiva,
            MVCL_RTEICA = MVCL_RTEICA - OLD.egcc_rtica
            WHERE MVCL_TIPOREF = 62 AND MVCL_IDREF = OLD.egre_id and MVCL_SUCURSAL = OLD.egcc_sucursal;
        end
    END
END
^

SET TERM ; ^

GRANT UPDATE,REFERENCES ON EGRESOS_CRUCEC TO TRIGGER EGRESOS_CRUCEC_AD;
GRANT SELECT ON EGRESOS TO TRIGGER EGRESOS_CRUCEC_AD;
GRANT SELECT,UPDATE ON SALDOS_DOC_CARTERA TO TRIGGER EGRESOS_CRUCEC_AD;
GRANT SELECT,UPDATE ON MOVIMIENTO_CLIENTES TO TRIGGER EGRESOS_CRUCEC_AD;

SET TERM ^ ;

CREATE OR ALTER PROCEDURE CHEQUEO_SALDOS_DOC_CARTERA(
    CLIINI VARCHAR(20),
    CLIFIN VARCHAR(20))
RETURNS (
    ERROR VARCHAR(60),
    TIPO INTEGER,
    ID INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(6))
AS
declare variable FECHA DATE;
declare variable NIT VARCHAR(20);
declare variable RTFTE NUMERIC(18, 2);
declare variable RTIVA NUMERIC(18, 2);
declare variable RTICA NUMERIC(18, 2);
declare variable MONTO NUMERIC(18, 2);
declare variable EXISTE CHAR(1);
declare variable IDR INTEGER;
declare variable RECAID INTEGER;
BEGIN
DELETE FROM SALDOS_DOC_CARTERA WHERE TERC_NIT >= :CLIINI AND TERC_NIT <= :CLIFIN;
DELETE FROM ANTICIPOS_CLIENTE WHERE RECA_ID = 0;

FOR SELECT FACT_ID, FACT_FECHA, TERC_NIT, FACT_RTFTEMONTO, FACT_rtivamonto, FACT_rticamonto, FACT_TOTAL
    FROM FACTURAS WHERE FACT_ID <> 0 and fact_anulado = 'N' AND TERC_NIT >= :CLIINI AND TERC_NIT <= :CLIFIN
    ORDER BY FACT_FECHA
    INTO :ID, :FECHA, :nit,  :RTFTE, :RTIVA, :RTICA, :MONTO
    DO
    INSERT INTO SALDOS_DOC_CARTERA (SDCA_TIPOREF, SDCA_IDREF, SDCA_FECHA, TERC_NIT, SDCA_RTFTE, SDCA_RTIVA, SDCA_RTICA, SDCA_ABONO, SDCA_ABRTFTE, SDCA_ABRTIVA, SDCA_ABRTICA, SDCA_DEBITO, SDCA_MONTO)
        VALUES (31, :ID, :fecha, :nit, :rtfte, :rtiva, :rtica, 0, 0, 0, 0, 'S', :MONTO);

FOR SELECT NDCL_ID, NDCL_FECHA, TERC_NIT, NDCL_RTFTEMONTO, NDCL_rtivamonto, NDCL_rticamonto, ndcl_monto+ndcl_ivamonto
    FROM NOTAS_DEBITO_CLIENTES WHERE NDCL_ID <> 0 and NDCL_anulado = 'N'  AND TERC_NIT >= :CLIINI AND TERC_NIT <= :CLIFIN
    ORDER BY NDCL_FECHA
    INTO :ID, :FECHA, :nit,  :RTFTE, :RTIVA, :RTICA, :MONTO
    DO
    INSERT INTO SALDOS_DOC_CARTERA (SDCA_TIPOREF, SDCA_IDREF, SDCA_FECHA, TERC_NIT, SDCA_RTFTE, SDCA_RTIVA, SDCA_RTICA, SDCA_ABONO, SDCA_ABRTFTE, SDCA_ABRTIVA, SDCA_ABRTICA, SDCA_DEBITO, SDCA_MONTO)
        VALUES (41, :ID, :fecha, :nit, :rtfte, :rtiva, :rtica, 0, 0, 0, 0, 'S', :MONTO);

FOR SELECT DVCH_ID, DVCH_FECHA, TERC_NIT, 0, 0, 0, DVCH_MONTO
    FROM devolucion_cheques WHERE DVCH_ID <> 0 and DVCH_anulado = 'N' AND DVCH_CARTERA = 'S'  AND TERC_NIT >= :CLIINI AND TERC_NIT <= :CLIFIN
    ORDER BY DVCH_FECHA
    INTO :ID, :FECHA, :nit,  :RTFTE, :RTIVA, :RTICA, :MONTO
    DO
    INSERT INTO SALDOS_DOC_CARTERA (SDCA_TIPOREF, SDCA_IDREF, SDCA_FECHA, TERC_NIT, SDCA_RTFTE, SDCA_RTIVA, SDCA_RTICA, SDCA_ABONO, SDCA_ABRTFTE, SDCA_ABRTIVA, SDCA_ABRTICA, SDCA_DEBITO, SDCA_MONTO)
        VALUES (77, :ID, :fecha, :nit, :rtfte, :rtiva, :rtica, 0, 0, 0, 0, 'S', :MONTO);

FOR SELECT DEVT_ID, DEVT_FECHA, TERC_NIT, DEVT_RTFTEMONTO, DEVT_rtivamonto, DEVT_rticamonto, devt_total
    FROM DEVOLUCIONES_VENTAS WHERE DEVT_ID <> 0 and DEVT_anulado = 'N' AND TERC_NIT >= :CLIINI AND TERC_NIT <= :CLIFIN
    ORDER BY DEVT_FECHA
    INTO :ID, :FECHA, :nit,  :RTFTE, :RTIVA, :RTICA, :MONTO
    DO
    INSERT INTO SALDOS_DOC_CARTERA (SDCA_TIPOREF, SDCA_IDREF, SDCA_FECHA, TERC_NIT, SDCA_RTFTE, SDCA_RTIVA, SDCA_RTICA, SDCA_ABONO, SDCA_ABRTFTE, SDCA_ABRTIVA, SDCA_ABRTICA, SDCA_DEBITO, SDCA_MONTO)
        VALUES (33, :ID, :fecha, :nit, :rtfte*-1, :rtiva*-1, :rtica*-1, 0, 0, 0, 0, 'N', :MONTO * -1);

FOR SELECT NCCL_ID, NCCL_FECHA, TERC_NIT, NCCL_RTFTEMONTO, NCCL_rtivamonto, NCCL_rticamonto, nccl_monto+nccl_ivamonto
    FROM NOTAS_CREDITO_CLIENTES WHERE NCCL_ID <> 0 and NCCL_anulado = 'N' AND TERC_NIT >= :CLIINI AND TERC_NIT <= :CLIFIN
    ORDER BY NCCL_FECHA
    INTO :ID, :FECHA, :nit,  :RTFTE, :RTIVA, :RTICA, :MONTO
    DO
    INSERT INTO SALDOS_DOC_CARTERA (SDCA_TIPOREF, SDCA_IDREF, SDCA_FECHA, TERC_NIT, SDCA_RTFTE, SDCA_RTIVA, SDCA_RTICA, SDCA_ABONO, SDCA_ABRTFTE, SDCA_ABRTIVA, SDCA_ABRTICA, SDCA_DEBITO, SDCA_MONTO)
        VALUES (42, :ID, :fecha, :nit, :rtfte*-1, :rtiva*-1, :rtica*-1, 0, 0, 0, 0, 'N', :MONTO * -1);

FOR SELECT ANCL_ID, ANCL_FECHA, TERC_NIT, ANCL_RTFTEMONTO, ANCL_rtivamonto, ANCL_rticamonto, ancl_base+ancl_ivamonto
    FROM ANTICIPOS_CLIENTE WHERE ANCL_ID <> 0 and ANCL_anulado = 'N' AND TERC_NIT >= :CLIINI AND TERC_NIT <= :CLIFIN
    ORDER BY ANCL_FECHA
    INTO :ID, :FECHA, :nit,  :RTFTE, :RTIVA, :RTICA, :MONTO
    DO
    INSERT INTO SALDOS_DOC_CARTERA (SDCA_TIPOREF, SDCA_IDREF, SDCA_FECHA, TERC_NIT, SDCA_RTFTE, SDCA_RTIVA, SDCA_RTICA, SDCA_ABONO, SDCA_ABRTFTE, SDCA_ABRTIVA, SDCA_ABRTICA, SDCA_DEBITO, SDCA_MONTO)
        VALUES (45, :ID, :fecha, :nit, :rtfte*-1, :rtiva*-1, :rtica*-1, 0, 0, 0, 0, 'N', :MONTO * -1);

FOR SELECT ACDE_TIPODOC, ACDE_IDDOC, APCL_FECHA, TERC_NIT, ACDE_APLICADO, ACDE_RTFTE, ACDE_RTIVA, ACDE_RTICA
    FROM APLICACION_CLIENTE_DETALLE D, APLICACION_CLIENTE A
    WHERE A.APCL_ID = D.apcl_id AND A.APCL_ID <> 0 AND APCL_ANULADO = 'N' AND TERC_NIT >= :CLIINI AND TERC_NIT <= :CLIFIN
    ORDER BY APCL_FECHA
    INTO :TIPO, :ID, :FECHA, :NIT, :MONTO, :RTFTE, :RTIVA, :RTICA
    DO
    BEGIN
    EXISTE = 'N';
    select 'S' from saldos_doc_cartera where sdca_tiporef = :TIPO and sdca_idref = :ID and sdca_fecha = :fecha into :EXISTE;
    if (Existe = 'S') then
        begin
        /* actualice el saldo del dia */
        UPDATE saldos_doc_cartera
            SET SDCA_ABONO = SDCA_ABONO + :MONTO,
                SDCA_ABRTFTE = SDCA_ABRTFTE + :RTFTE,
                SDCA_ABRTIVA = SDCA_ABRTIVA + :RTIVA,
                SDCA_ABRTICA = SDCA_ABRTICA + :RTICA
            WHERE SDCA_TIPOREF = :TIPO AND SDCA_IDREF = :ID AND SDCA_FECHA = :fecha;
        END
    ELSE
        BEGIN
        /* Inserte un nuevo saldo diario */
        INSERT INTO SALDOS_DOC_CARTERA (SDCA_TIPOREF, SDCA_IDREF, SDCA_FECHA, TERC_NIT, SDCA_RTFTE, SDCA_RTIVA, SDCA_RTICA, SDCA_ABONO, SDCA_ABRTFTE, SDCA_ABRTIVA, SDCA_ABRTICA, SDCA_DEBITO, SDCA_MONTO)
            VALUES (:TIPO, :ID, :fecha, :NIT, 0, 0, 0, :MONTO, :rtfte, :rtiva, :rtica, 'N', 0);
        END
    END

FOR SELECT R.RECA_ID, RCDE_TIPODOC, RCDE_IDDOC, RECA_FECHA, TERC_NIT, RCDE_ABONO+RCDE_DTOF, RCDE_RTFTE, RCDE_RTIVA, RCDE_RTICA
    FROM RECIBOS_CAJA_DETALLE D, RECIBOS_CAJA R
    WHERE R.RECA_ID = D.RECA_id AND R.RECA_ID <> 0 AND RECA_ANULADO = 'N' AND TERC_NIT >= :CLIINI AND TERC_NIT <= :CLIFIN
    ORDER BY RECA_FECHA
    INTO :IDR, :TIPO, :ID, :FECHA, :NIT, :MONTO, :RTFTE, :RTIVA, :RTICA
    DO
    BEGIN
    EXISTE = 'N';
    if (TIPO = 45) then
        BEGIN
        SELECT RECA_ID FROM ANTICIPOS_CLIENTE WHERE ANCL_ID = :ID INTO :RECAID;
        if (RECAID = IDR) then
            EXISTE = 'S';
        END
    if (EXISTE = 'N') then
        BEGIN
        select 'S' from saldos_doc_cartera where sdca_tiporef = :TIPO and sdca_idref = :ID and sdca_fecha = :fecha into :EXISTE;
        if (Existe = 'S') then
            begin
            /* actualice el saldo del dia */
            UPDATE saldos_doc_cartera
                SET SDCA_ABONO = SDCA_ABONO + :MONTO,
                    SDCA_ABRTFTE = SDCA_ABRTFTE + :RTFTE,
                    SDCA_ABRTIVA = SDCA_ABRTIVA + :RTIVA,
                    SDCA_ABRTICA = SDCA_ABRTICA + :RTICA
                WHERE SDCA_TIPOREF = :TIPO AND SDCA_IDREF = :ID AND SDCA_FECHA = :fecha;
            END
        ELSE
            BEGIN
            /* Inserte un nuevo saldo diario */
            INSERT INTO SALDOS_DOC_CARTERA (SDCA_TIPOREF, SDCA_IDREF, SDCA_FECHA, TERC_NIT, SDCA_RTFTE, SDCA_RTIVA, SDCA_RTICA, SDCA_ABONO, SDCA_ABRTFTE, SDCA_ABRTIVA, SDCA_ABRTICA, SDCA_DEBITO, SDCA_MONTO)
                VALUES (:TIPO, :ID, :fecha, :NIT, 0, 0, 0, :MONTO, :rtfte, :rtiva, :rtica, 'N', 0);
            END
        END
    END

FOR SELECT E.egre_id, EGCC_TIPODOC, EGCC_IDDOC, EGRE_FECHA, TERC_NIT, EGCC_ABONO+EGCC_DTOF, EGCC_RTFTE, EGCC_RTIVA, EGCC_RTICA
    FROM EGRESOS_CRUCEC C, EGRESOS E
    WHERE E.egre_id = C.egre_id AND EGRE_ANULADO = 'N' AND TERC_NIT >= :CLIINI AND TERC_NIT <= :CLIFIN
    ORDER BY EGRE_FECHA
    INTO :IDR, :TIPO, :ID, :FECHA, :NIT, :MONTO, :RTFTE, :RTIVA, :RTICA
    DO
    BEGIN
    select 'S' from saldos_doc_cartera where sdca_tiporef = :TIPO and sdca_idref = :ID and sdca_fecha = :fecha into :EXISTE;
    if (Existe = 'S') then
        begin
        /* actualice el saldo del dia */
        UPDATE saldos_doc_cartera
            SET SDCA_ABONO = SDCA_ABONO + :MONTO,
            SDCA_ABRTFTE = SDCA_ABRTFTE + :RTFTE,
            SDCA_ABRTIVA = SDCA_ABRTIVA + :RTIVA,
            SDCA_ABRTICA = SDCA_ABRTICA + :RTICA
            WHERE SDCA_TIPOREF = :TIPO AND SDCA_IDREF = :ID AND SDCA_FECHA = :fecha;
        END
    ELSE
        BEGIN
        /* Inserte un nuevo saldo diario */
        INSERT INTO SALDOS_DOC_CARTERA (SDCA_TIPOREF, SDCA_IDREF, SDCA_FECHA, TERC_NIT, SDCA_RTFTE, SDCA_RTIVA, SDCA_RTICA, SDCA_ABONO, SDCA_ABRTFTE, SDCA_ABRTIVA, SDCA_ABRTICA, SDCA_DEBITO, SDCA_MONTO)
            VALUES (:TIPO, :ID, :fecha, :NIT, 0, 0, 0, :MONTO, :rtfte, :rtiva, :rtica, 'N', 0);
        END
    END

for select ancl_id, ancl_base+ancl_ivamonto, PREF_PRE, ANCL_NUMERO from anticipos_cliente
    where ANCL_ANULADO = 'N' and reca_id not in (select reca_id from recibos_caja where reca_anulado = 'N')
    into :ID, :MONTO, :PREF, :NUMERO
    do
    begin
    FECHA = cast('now' as date);
    execute procedure saldo_doc_cartera(45, :id, :FECHA) returning_values (:RTFTE);
    if ((MONTO = RTFTE) or (RTFTE IS NULL)) then
        DELETE FROM ANTICIPOS_CLIENTE WHERE ANCL_ID = :ID;
    ELSE
        BEGIN
        TIPO = 45;
        ERROR = 'DOCUMENTO ANULADO CON ABONOS';
        SUSPEND;
        END
    end
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER PROCEDURE COMISIONES_COBRO(
    DESDE INTEGER,
    HASTA INTEGER,
    FECINI DATE,
    FECFIN DATE,
    DETALLE CHAR(1))
RETURNS (
    CODVEND INTEGER,
    NOMVEND VARCHAR(60),
    NIT VARCHAR(20),
    CLIENTE VARCHAR(60),
    NOMTIPO VARCHAR(8),
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(6),
    FECDOC DATE,
    PREFREC VARCHAR(4),
    NUMREC VARCHAR(6),
    FECREC DATE,
    DIAS INTEGER,
    ABONO NUMERIC(18,2),
    BASE NUMERIC(18,2),
    COMIMONTO NUMERIC(18,2),
    COMIPORC NUMERIC(9,2),
    ARTICULO VARCHAR(20),
    CODGRP VARCHAR(2),
    CANT NUMERIC(18,4))
AS
DECLARE VARIABLE TIPO INTEGER;
DECLARE VARIABLE ID INTEGER;
DECLARE VARIABLE IVAMONTO NUMERIC(18,2);
DECLARE VARIABLE TOTAL NUMERIC(18,2);
DECLARE VARIABLE SITOT CHAR(2);
DECLARE VARIABLE VENTA CHAR(2);
DECLARE VARIABLE COMIV NUMERIC(18,2);
DECLARE VARIABLE PORCV NUMERIC(18,2);
DECLARE VARIABLE CONSUMO NUMERIC(18,2);
declare variable ALFINAL CHAR(2);
declare variable SALDO NUMERIC(18,2);
declare variable COMISION VARCHAR(10);
declare variable porcaux NUMERIC(9,2);
declare variable BASEAUX DOUBLE PRECISION;
declare variable SUCURSAL VARCHAR(20);
BEGIN
EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION', 'VENDEDORES', 'COMISIONES EN VENTA INCLUYENDO IMPUESTOS') returning_values (:SITOT);
EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA','COMISIONES','COMISION POR COBRO PAGADERA SOLO EN EL COBRO TOTAL') returning_values (:ALFINAL);
execute procedure lee_configuracion('CARTERA','COMISIONES','COMISION POR COBRO COMO PORCENTAJE DE LA COMISION VENTA') returning_values (:venta);
EXECUTE PROCEDURE lee_configuracion('CARTERA', 'COMISIONES', 'LIQUIDAR COMISION COBRO CON COBRADOR DEL DOCUMENTO O DEL RECIBO') returning_values (:COMISION);
FOR SELECT RCDE_TIPODOC, RCDE_IDDOC, RCDE_PREFIJO, RCDE_NUMERO, R.TERC_NIT, TERC_NOM, RECA_FECHA, (RCDE_ABONO+RCDE_RTFTE+RCDE_RTIVA+RCDE_RTICA), PREF_PRE, RECA_NUMERO, COBR_COD
    FROM RECIBOS_CAJA R, RECIBOS_CAJA_DETALLE RD, TERCEROS T
    WHERE R.RECA_ID = RD.RECA_ID AND RECA_FECHA >= :FECINI AND RECA_FECHA <= :FECFIN AND R.TERC_NIT = T.TERC_NIT AND RECA_ANULADO = 'N'
    ORDER BY TERC_NIT, RECA_FECHA
    INTO :TIPO, :ID, :PREFIJO, :NUMERO, :NIT, :CLIENTE, :FECREC, :ABONO, :PREFREC, :NUMREC, :codvend
    DO
    BEGIN
    SELECT TIDO_NOMCORTO FROM TIPO_DOCUMENTO WHERE TIDO_COD = :TIPO INTO :NOMTIPO;
    if (COMISION = 'DOCUMENTO') then
        SELECT MVCL_FECHA, COBR_COD FROM MOVIMIENTO_CLIENTES WHERE MVCL_TIPOREF = :TIPO AND MVCL_IDREF = :ID
            INTO :FECDOC, :codvend;
    else
        SELECT MVCL_FECHA FROM MOVIMIENTO_CLIENTES WHERE MVCL_TIPOREF = :TIPO AND MVCL_IDREF = :ID
            INTO :FECDOC;
    if (FECDOC IS NOT NULL) then
        DIAS = FECREC - FECDOC;
    ELSE
        DIAS = 999;
    if ((codvend >= :DESDE) AND (codvend <= :hasta)) then
        BEGIN
        /* TRAIGA EL PORCENTAJE DE ACUERDO A LOS DIAS */
        COMIPORC = 0;
        SELECT CMCB_PORC FROM COMISION_COBRO WHERE CMCB_DIASINI <= :dias AND CMCB_DIASFIN >= :DIAS AND COBR_COD = :CODVEND INTO :COMIPORC;
        if (COMIPORC IS NULL) THEN
            COMIPORC = 0;
        if (VENTA = 'NO') then
            BEGIN
            if (TIPO = 31) then
                BEGIN
                if (DETALLE = 'N') then
                    SELECT MAX(FACT_TOTAL), MAX(FACT_IVAMONTO), SUM(FADE_CONSUMO) FROM FACTURAS F, FACTURAS_DETALLE D
                        WHERE F.FACT_ID = D.FACT_ID AND F.FACT_ID = :ID INTO :TOTAL, :IVAMONTO, :CONSUMO;
                ELSE
                    FOR SELECT D.ARTI_COD, FADE_CANT, FADE_TOTAL, FADE_IVAMONTO, FADE_CONSUMO, GRUP_COD
                        FROM FACTURAS F, FACTURAS_DETALLE D, ARTICULO A
                        WHERE F.FACT_ID = D.FACT_ID AND D.arti_cod = A.arti_cod AND F.FACT_ID = :ID
                        INTO :ARTICULO, :CANT, :TOTAL, :IVAMONTO, :CONSUMO, :CODGRP
                        DO
                        BEGIN
                        if (SITOT = 'SI') then
                            BASEAUX = TOTAL;
                        ELSE
                            BASEAUX = (TOTAL - IVAMONTO - CONSUMO);
                        BASE = BASEAUX;
                        COMIMONTO = BASE / 100 * COMIPORC;
                        SUSPEND;
                        END
                END
            if (TIPO = 33) then
                if (DETALLE = 'N') then
                    SELECT MAX(DEVT_TOTAL*-1), MAX(DEVT_IVAMONTO*-1), SUM(DVDE_CONSUMO) FROM DEVOLUCIONES_VENTAS V, DEVOLUCIONES_VENTAS_DETALLE D
                        WHERE V.DEVT_ID = D.DEVT_ID AND V.DEVT_ID = :ID INTO :TOTAL, :IVAMONTO, :CONSUMO;
                ELSE
                    FOR SELECT D.ARTI_COD, DVDE_CANT, DVDE_TOTAL*-1, DVDE_IVAMONTO*-1, DVDE_CONSUMO*-1, GRUP_COD
                        FROM DEVOLUCIONES_VENTAS V, DEVOLUCIONES_VENTAS_DETALLE D, ARTICULO A
                        WHERE V.DEVT_ID = D.DEVT_ID AND D.arti_cod = A.arti_cod AND V.DEVT_ID = :ID
                        INTO :ARTICULO, :CANT, :TOTAL, :IVAMONTO, :CONSUMO, :codgrp
                        DO
                        BEGIN
                        if (SITOT = 'SI') then
                            BASEAUX = TOTAL;
                        ELSE
                            BASEAUX = TOTAL - IVAMONTO - CONSUMO;
                        BASE = BASEAUX;
                        COMIMONTO = BASE / 100 * COMIPORC;
                        SUSPEND;
                        END
            if (TIPO = 41) then
                SELECT NDCL_MONTO, NDCL_IVAMONTO, 0 FROM NOTAS_DEBITO_CLIENTES WHERE NDCL_ID = :ID INTO :TOTAL, :IVAMONTO, :CONSUMO;
            if (TIPO = 42) then
                SELECT NCCL_MONTO*-1, NCCL_IVAMONTO*-1, 0 FROM NOTAS_CREDITO_CLIENTES WHERE NCCL_ID = :ID INTO :TOTAL, :IVAMONTO, :CONSUMO;
            if (TIPO = 77) then
                SELECT DVCH_MONTO, 0, 0 FROM DEVOLUCION_CHEQUES WHERE DVCH_ID = :ID INTO :TOTAL, :IVAMONTO, :CONSUMO;
            if (SITOT = 'SI') then
                BASEAUX = ABONO;
            ELSE
                if ((TOTAL - IVAMONTO - CONSUMO) <> 0) then
                    BASEAUX = (ABONO / TOTAL) * (TOTAL - IVAMONTO - CONSUMO);
                ELSE
                    BASEAUX = 0;
            BASE = BASEAUX;
            COMIMONTO = BASE / 100 * COMIPORC;
            END
        ELSE
            BEGIN
            if (TIPO = 31) then
                if (DETALLE = 'N') then
                    SELECT MAX(FACT_TOTAL), MAX(FACT_IVAMONTO), MAX(FACT_COMIPORC), SUM(FADE_CONSUMO)
                        FROM FACTURAS F, FACTURAS_DETALLE D WHERE F.FACT_ID = D.FACT_ID AND F.FACT_ID = :ID
                        INTO :TOTAL, :IVAMONTO, :PORCV, :CONSUMO;
                ELSE
                    FOR SELECT D.ARTI_COD, FADE_CANT, FADE_TOTAL, FADE_IVAMONTO, FADE_CONSUMO, FACT_COMIPORC, GRUP_COD
                        FROM FACTURAS F, FACTURAS_DETALLE D, ARTICULO A
                        WHERE F.FACT_ID = D.FACT_ID AND D.arti_cod = A.arti_cod AND F.FACT_ID = :ID
                        INTO :ARTICULO, :CANT, :TOTAL, :IVAMONTO, :CONSUMO, :porcv, :codgrp
                        DO
                        BEGIN
                        if (SITOT = 'SI') then
                            BASEAUX = TOTAL;
                        ELSE
                            BASEAUX = (TOTAL - IVAMONTO - CONSUMO);
                        COMIV = PORCV / 100 * BASEAUX;
                        COMIMONTO = COMIV / 100 * COMIPORC;
                        porcaux = comiporc;
                        comiporc = PORCV / 100 * COMIPORC;
                        BASE = BASEAUX;
                        SUSPEND;
                        END
            if (TIPO = 33) then
                if (DETALLE = 'N') then
                    SELECT MAX(DEVT_TOTAL), MAX(DEVT_IVAMONTO), MAX(DEVT_COMIPORC), SUM(DVDE_CONSUMO)
                        FROM DEVOLUCIONES_VENTAS V, DEVOLUCIONES_VENTAS_DETALLE D WHERE V.DEVT_ID = D.DEVT_ID AND D.DEVT_ID = :ID
                        INTO :TOTAL, :IVAMONTO, :PORCV, :CONSUMO;
                ELSE
                    FOR SELECT D.ARTI_COD, DVDE_CANT, DVDE_TOTAL*-1, DVDE_IVAMONTO*-1, DVDE_CONSUMO*-1, DEVT_COMIPORC, GRUP_COD
                        FROM DEVOLUCIONES_VENTAS V, DEVOLUCIONES_VENTAS_DETALLE D, ARTICULO A
                        WHERE V.DEVT_ID = D.DEVT_ID AND D.arti_cod = A.arti_cod AND V.DEVT_ID = :ID
                        INTO :ARTICULO, :CANT, :TOTAL, :IVAMONTO, :CONSUMO, :porcv, :codgrp
                        DO
                        BEGIN
                        if (SITOT = 'SI') then
                            BASEAUX = TOTAL;
                        ELSE
                            BASEAUX = (TOTAL - IVAMONTO - CONSUMO);
                        COMIV = PORCV / 100 * BASEAUX;
                        COMIMONTO = COMIV / 100 * COMIPORC;
                        porcaux = comiporc;
                        comiporc = PORCV / 100 * COMIPORC;
                        BASE = BASEAUX;
                        SUSPEND;
                        END
            if (TIPO = 41) then
                SELECT NDCL_MONTO, NDCL_IVAMONTO, NDCL_COMIPORC, 0 FROM NOTAS_DEBITO_CLIENTES
                    WHERE NDCL_ID = :ID INTO :TOTAL, :IVAMONTO, :PORCV, :CONSUMO;
            if (TIPO = 42) then
                SELECT NCCL_MONTO, NCCL_IVAMONTO, NCCL_COMIPORC, 0  FROM NOTAS_CREDITO_CLIENTES
                    WHERE NCCL_ID = :ID INTO :TOTAL, :IVAMONTO, :PORCV, :CONSUMO;
            if (TIPO = 77) then
                SELECT DVCH_MONTO, 0, 0, 0 FROM DEVOLUCION_CHEQUES WHERE DVCH_ID = :ID INTO :TOTAL, :IVAMONTO, :PORCV, :CONSUMO;
            if (SITOT = 'SI') then
                BASEAUX = ABONO;
            ELSE
                if ((total <> 0) AND (ABONO <> 0)) then
                    BASEAUX = (TOTAL - IVAMONTO - CONSUMO) / TOTAL * ABONO;
                ELSE
                    BASEAUX = 0;
            COMIV = PORCV / 100 * BASEAUX;
            COMIMONTO = COMIV / 100 * COMIPORC;
            porcaux = comiporc;
            comiporc = PORCV / 100 * COMIPORC;
            BASE = BASEAUX;
            END
        select COBR_NOM from COBRADORES where COBR_COD = :codvend INTO :nomvend;
        if (DETALLE = 'N') then
            if (ALFINAL = 'SI') then
                BEGIN
                /* VERIFIQUE EL SALDO DEL DOCUMENTO, SI ES CERO LIQUIDE COMISION SOBRE EL TOTAL */
                EXECUTE PROCEDURE saldo_doc_cartera(:tipo, :ID, :FECREC) returning_values (:SALDO);
                if (SALDO = 0) then
                    BEGIN
                    if (VENTA = 'NO') then
                        begin
                        if (SITOT = 'SI') then
                            BASEAUX = TOTAL;
                        ELSE
                            BASEAUX = TOTAL - IVAMONTO - CONSUMO;
                        COMIMONTO = BASEAUX * COMIPORC / 100;
                        end
                    ELSE
                        BEGIN
                        if (SITOT = 'SI') then
                            BASEAUX = TOTAL;
                        ELSE
                            BASEAUX = TOTAL - IVAMONTO - CONSUMO;
                        COMIV = PORCV * BASEAUX / 100;
                        COMIMONTO = COMIV / 100 * porcaux;
                        comiporc = PORCV / 100 * porcaux;
                        END
                    BASE = BASEAUX;
                    SUSPEND;
                    END
                END
            ELSE
                SUSPEND;
        ELSE
            if ((TIPO <> 31) AND (TIPO <> 33)) then
                SUSPEND;
        END
    END
FOR SELECT EGCC_TIPODOC, EGCC_IDDOC, EGCC_PREFIJO, EGCC_NUMERO, E.TERC_NIT, TERC_NOM, EGRE_FECHA, (EGCC_ABONO+EGCC_RTFTE+EGCC_RTIVA+EGCC_RTICA), PREF_PRE, EGRE_NUMERO, EGCC_SUCURSAL
    FROM EGRESOS E, EGRESOS_CRUCEC C, TERCEROS T
    WHERE E.EGRE_ID = C.EGRE_ID AND EGRE_FECHA >= :FECINI AND EGRE_FECHA <= :FECFIN AND E.TERC_NIT = T.TERC_NIT AND EGRE_ANULADO = 'N'
    ORDER BY TERC_NIT, EGRE_FECHA
    INTO :TIPO, :ID, :PREFIJO, :NUMERO, :NIT, :CLIENTE, :FECREC, :ABONO, :PREFREC, :NUMREC, :SUCURSAL
    DO
    BEGIN
    SELECT COBR_COD FROM cliente_sucursales WHERE TERC_NIT = :NIT AND CLCU_COD = :sucursal INTO :codvend;
    SELECT TIDO_NOMCORTO FROM TIPO_DOCUMENTO WHERE TIDO_COD = :TIPO INTO :NOMTIPO;
    if (COMISION = 'DOCUMENTO') then
        SELECT MVCL_FECHA, COBR_COD FROM MOVIMIENTO_CLIENTES WHERE MVCL_TIPOREF = :TIPO AND MVCL_IDREF = :ID
            INTO :FECDOC, :codvend;
    else
        SELECT MVCL_FECHA FROM MOVIMIENTO_CLIENTES WHERE MVCL_TIPOREF = :TIPO AND MVCL_IDREF = :ID
            INTO :FECDOC;
    if (FECDOC IS NOT NULL) then
        DIAS = FECREC - FECDOC;
    ELSE
        DIAS = 999;
    if ((codvend >= :DESDE) AND (codvend <= :hasta)) then
        BEGIN
        /* TRAIGA EL PORCENTAJE DE ACUERDO A LOS DIAS */
        COMIPORC = 0;
        SELECT CMCB_PORC FROM COMISION_COBRO WHERE CMCB_DIASINI <= :dias AND CMCB_DIASFIN >= :DIAS AND COBR_COD = :CODVEND INTO :COMIPORC;
        if (COMIPORC IS NULL) THEN
            COMIPORC = 0;
        if (VENTA = 'NO') then
            BEGIN
            if (TIPO = 31) then
                BEGIN
                if (DETALLE = 'N') then
                    SELECT MAX(FACT_TOTAL), MAX(FACT_IVAMONTO), SUM(FADE_CONSUMO) FROM FACTURAS F, FACTURAS_DETALLE D
                        WHERE F.FACT_ID = D.FACT_ID AND F.FACT_ID = :ID INTO :TOTAL, :IVAMONTO, :CONSUMO;
                ELSE
                    FOR SELECT D.ARTI_COD, FADE_CANT, FADE_TOTAL, FADE_IVAMONTO, FADE_CONSUMO, GRUP_COD
                        FROM FACTURAS F, FACTURAS_DETALLE D, ARTICULO A
                        WHERE F.FACT_ID = D.FACT_ID AND D.arti_cod = A.arti_cod AND F.FACT_ID = :ID
                        INTO :ARTICULO, :CANT, :TOTAL, :IVAMONTO, :CONSUMO, :CODGRP
                        DO
                        BEGIN
                        if (SITOT = 'SI') then
                            BASEAUX = TOTAL;
                        ELSE
                            BASEAUX = (TOTAL - IVAMONTO - CONSUMO);
                        BASE = BASEAUX;
                        COMIMONTO = BASE / 100 * COMIPORC;
                        SUSPEND;
                        END
                END
            if (TIPO = 33) then
                if (DETALLE = 'N') then
                    SELECT MAX(DEVT_TOTAL*-1), MAX(DEVT_IVAMONTO*-1), SUM(DVDE_CONSUMO) FROM DEVOLUCIONES_VENTAS V, DEVOLUCIONES_VENTAS_DETALLE D
                        WHERE V.DEVT_ID = D.DEVT_ID AND V.DEVT_ID = :ID INTO :TOTAL, :IVAMONTO, :CONSUMO;
                ELSE
                    FOR SELECT D.ARTI_COD, DVDE_CANT, DVDE_TOTAL*-1, DVDE_IVAMONTO*-1, DVDE_CONSUMO*-1, GRUP_COD
                        FROM DEVOLUCIONES_VENTAS V, DEVOLUCIONES_VENTAS_DETALLE D, ARTICULO A
                        WHERE V.DEVT_ID = D.DEVT_ID AND D.arti_cod = A.arti_cod AND V.DEVT_ID = :ID
                        INTO :ARTICULO, :CANT, :TOTAL, :IVAMONTO, :CONSUMO, :codgrp
                        DO
                        BEGIN
                        if (SITOT = 'SI') then
                            BASEAUX = TOTAL;
                        ELSE
                            BASEAUX = TOTAL - IVAMONTO - CONSUMO;
                        BASE = BASEAUX;
                        COMIMONTO = BASE / 100 * COMIPORC;
                        SUSPEND;
                        END
            if (TIPO = 41) then
                SELECT NDCL_MONTO, NDCL_IVAMONTO, 0 FROM NOTAS_DEBITO_CLIENTES WHERE NDCL_ID = :ID INTO :TOTAL, :IVAMONTO, :CONSUMO;
            if (TIPO = 42) then
                SELECT NCCL_MONTO*-1, NCCL_IVAMONTO*-1, 0 FROM NOTAS_CREDITO_CLIENTES WHERE NCCL_ID = :ID INTO :TOTAL, :IVAMONTO, :CONSUMO;
            if (TIPO = 77) then
                SELECT DVCH_MONTO, 0, 0 FROM DEVOLUCION_CHEQUES WHERE DVCH_ID = :ID INTO :TOTAL, :IVAMONTO, :CONSUMO;
            if (SITOT = 'SI') then
                BASEAUX = ABONO;
            ELSE
                if ((TOTAL - IVAMONTO - CONSUMO) <> 0) then
                    BASEAUX = (ABONO / TOTAL) * (TOTAL - IVAMONTO - CONSUMO);
                ELSE
                    BASEAUX = 0;
            BASE = BASEAUX;
            COMIMONTO = BASE / 100 * COMIPORC;
            END
        ELSE
            BEGIN
            if (TIPO = 31) then
                if (DETALLE = 'N') then
                    SELECT MAX(FACT_TOTAL), MAX(FACT_IVAMONTO), MAX(FACT_COMIPORC), SUM(FADE_CONSUMO)
                        FROM FACTURAS F, FACTURAS_DETALLE D WHERE F.FACT_ID = D.FACT_ID AND F.FACT_ID = :ID
                        INTO :TOTAL, :IVAMONTO, :PORCV, :CONSUMO;
                ELSE
                    FOR SELECT D.ARTI_COD, FADE_CANT, FADE_TOTAL, FADE_IVAMONTO, FADE_CONSUMO, FACT_COMIPORC, GRUP_COD
                        FROM FACTURAS F, FACTURAS_DETALLE D, ARTICULO A
                        WHERE F.FACT_ID = D.FACT_ID AND D.arti_cod = A.arti_cod AND F.FACT_ID = :ID
                        INTO :ARTICULO, :CANT, :TOTAL, :IVAMONTO, :CONSUMO, :porcv, :codgrp
                        DO
                        BEGIN
                        if (SITOT = 'SI') then
                            BASEAUX = TOTAL;
                        ELSE
                            BASEAUX = (TOTAL - IVAMONTO - CONSUMO);
                        COMIV = PORCV / 100 * BASEAUX;
                        COMIMONTO = COMIV / 100 * COMIPORC;
                        porcaux = comiporc;
                        comiporc = PORCV / 100 * COMIPORC;
                        BASE = BASEAUX;
                        SUSPEND;
                        END
            if (TIPO = 33) then
                if (DETALLE = 'N') then
                    SELECT MAX(DEVT_TOTAL), MAX(DEVT_IVAMONTO), MAX(DEVT_COMIPORC), SUM(DVDE_CONSUMO)
                        FROM DEVOLUCIONES_VENTAS V, DEVOLUCIONES_VENTAS_DETALLE D WHERE V.DEVT_ID = D.DEVT_ID AND D.DEVT_ID = :ID
                        INTO :TOTAL, :IVAMONTO, :PORCV, :CONSUMO;
                ELSE
                    FOR SELECT D.ARTI_COD, DVDE_CANT, DVDE_TOTAL*-1, DVDE_IVAMONTO*-1, DVDE_CONSUMO*-1, DEVT_COMIPORC, GRUP_COD
                        FROM DEVOLUCIONES_VENTAS V, DEVOLUCIONES_VENTAS_DETALLE D, ARTICULO A
                        WHERE V.DEVT_ID = D.DEVT_ID AND D.arti_cod = A.arti_cod AND V.DEVT_ID = :ID
                        INTO :ARTICULO, :CANT, :TOTAL, :IVAMONTO, :CONSUMO, :porcv, :codgrp
                        DO
                        BEGIN
                        if (SITOT = 'SI') then
                            BASEAUX = TOTAL;
                        ELSE
                            BASEAUX = (TOTAL - IVAMONTO - CONSUMO);
                        COMIV = PORCV / 100 * BASEAUX;
                        COMIMONTO = COMIV / 100 * COMIPORC;
                        porcaux = comiporc;
                        comiporc = PORCV / 100 * COMIPORC;
                        BASE = BASEAUX;
                        SUSPEND;
                        END
            if (TIPO = 41) then
                SELECT NDCL_MONTO, NDCL_IVAMONTO, NDCL_COMIPORC, 0 FROM NOTAS_DEBITO_CLIENTES
                    WHERE NDCL_ID = :ID INTO :TOTAL, :IVAMONTO, :PORCV, :CONSUMO;
            if (TIPO = 42) then
                SELECT NCCL_MONTO, NCCL_IVAMONTO, NCCL_COMIPORC, 0  FROM NOTAS_CREDITO_CLIENTES
                    WHERE NCCL_ID = :ID INTO :TOTAL, :IVAMONTO, :PORCV, :CONSUMO;
            if (TIPO = 77) then
                SELECT DVCH_MONTO, 0, 0, 0 FROM DEVOLUCION_CHEQUES WHERE DVCH_ID = :ID INTO :TOTAL, :IVAMONTO, :PORCV, :CONSUMO;
            if (SITOT = 'SI') then
                BASEAUX = ABONO;
            ELSE
                if ((total <> 0) AND (ABONO <> 0)) then
                    BASEAUX = (TOTAL - IVAMONTO - CONSUMO) / TOTAL * ABONO;
                ELSE
                    BASEAUX = 0;
            COMIV = PORCV / 100 * BASEAUX;
            COMIMONTO = COMIV / 100 * COMIPORC;
            porcaux = comiporc;
            comiporc = PORCV / 100 * COMIPORC;
            BASE = BASEAUX;
            END
        select COBR_NOM from COBRADORES where COBR_COD = :codvend INTO :nomvend;
        if (DETALLE = 'N') then
            if (ALFINAL = 'SI') then
                BEGIN
                /* VERIFIQUE EL SALDO DEL DOCUMENTO, SI ES CERO LIQUIDE COMISION SOBRE EL TOTAL */
                EXECUTE PROCEDURE saldo_doc_cartera(:tipo, :ID, :FECREC) returning_values (:SALDO);
                if (SALDO = 0) then
                    BEGIN
                    if (VENTA = 'NO') then
                        begin
                        if (SITOT = 'SI') then
                            BASEAUX = TOTAL;
                        ELSE
                            BASEAUX = TOTAL - IVAMONTO - CONSUMO;
                        COMIMONTO = BASEAUX * COMIPORC / 100;
                        end
                    ELSE
                        BEGIN
                        if (SITOT = 'SI') then
                            BASEAUX = TOTAL;
                        ELSE
                            BASEAUX = TOTAL - IVAMONTO - CONSUMO;
                        COMIV = PORCV * BASEAUX / 100;
                        COMIMONTO = COMIV / 100 * porcaux;
                        comiporc = PORCV / 100 * porcaux;
                        END
                    BASE = BASEAUX;
                    SUSPEND;
                    END
                END
            ELSE
                SUSPEND;
        ELSE
            if ((TIPO <> 31) AND (TIPO <> 33)) then
                SUSPEND;
        END
    END
FOR SELECT 'DEVOCHEQ', DVCH_MONTO*-1, DVCH_FECHA, PRBA_PREF, DVCH_NUMDOC, DVCH_FECHA, D.TERC_NIT, DVCH_NOMTERC, '', '', D.COBR_COD
    FROM DEVOLUCION_CHEQUES D, CLIENTES C
    WHERE DVCH_FECHA >= :FECINI AND DVCH_FECHA <= :FECFIN AND D.TERC_NIT = C.TERC_NIT AND D.COBR_COD = :CODVEND
    INTO :NOMTIPO, :BASE, :FECDOC, :PREFIJO, :NUMERO, :FECREC, :NIT, :CLIENTE, :PREFREC, :NUMREC, :codvend
    DO
    BEGIN
    COMIPORC = 0;
    COMIMONTO = 0;
    if ((codvend >= :DESDE) AND (codvend <= :hasta)) then
        BEGIN
        select COBR_NOM from COBRADORES where COBR_COD = :codvend INTO :nomvend;
        /* SELECT CMCB_PORC FROM COMISION_COBRO WHERE CMCB_DIASINI <= 1 AND CMCB_DIASFIN >= 1 AND COBR_COD = :CODVEND INTO :COMIPORC;
        if (COMIPORC IS NULL) THEN
            COMIPORC = 0;
        COMIMONTO = BASE * COMIPORC / 100; */
        SUSPEND;
        END
    END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER PROCEDURE ESTADISTICA_VENTAS_VENDEDOR_MES(
    AGENCIA INTEGER,
    VENDINI INTEGER,
    VENDFIN INTEGER,
    ANO CHAR(4),
    MES INTEGER)
RETURNS (
    CODVEND INTEGER,
    NOMVEND VARCHAR(60),
    CODAGENCIA INTEGER,
    NOMAGENCIA VARCHAR(60),
    FECHA DATE,
    VENTAS NUMERIC(18,2),
    MAXVENTA NUMERIC(18,2),
    RECAUDO NUMERIC(18,2),
    MAXRECAUDO NUMERIC(18,2))
AS
declare variable FECINI DATE;
declare variable FECFIN DATE;
declare variable ANOAUX INTEGER;
declare variable TIPO INTEGER;
declare variable ID INTEGER;
declare variable ABONO NUMERIC(18,2);
declare variable SUBTOTAL NUMERIC(18,2);
declare variable IVAMONTO NUMERIC(18,2);
declare variable TOTAL NUMERIC(18,2);
begin
EXECUTE PROCEDURE COMPONE_FECHA (ANO, MES, 1) RETURNING_VALUES (FECINI);
if (MES < 12) then
    MES = MES + 1;
ELSE
    BEGIN
    ANOAUX = CAST(ANO AS INTEGER);
    ANOAUX = ANOAUX + 1;
    ANO = CAST(ANOAUX AS CHAR(4));
    MES = 1;
    END
EXECUTE PROCEDURE COMPONE_FECHA (ANO, MES, 1) RETURNING_VALUES (FECFIN);
FOR SELECT VEND_COD, VEND_NOMBRE, SUCU_ID FROM VENDEDORES WHERE VEND_COD >= :VENDINI AND VEND_COD <= :VENDFIN AND
    ((SUCU_ID = :AGENCIA) or (:AGENCIA = 0))
    INTO :CODVEND, :NOMVEND, :CODAGENCIA
    DO
    BEGIN
    if (CODAGENCIA <> 0) then
        SELECT SUCU_NOMBRE FROM SUCURSALES WHERE SUCU_ID = :CODAGENCIA INTO :NOMAGENCIA;
    /* CALCULE LAS VENTAS */
    MAXVENTA = 0;
    MAXRECAUDO = 0;
    FOR SELECT SUM(FACT_TOTAL-FACT_IVAMONTO), MIN(FACT_FECHA) FROM FACTURAS F, PREFIJOS P
        WHERE VEND_COD = :CODVEND AND FACT_FECHA >= :FECINI AND FACT_FECHA < :FECFIN AND FACT_ANULADO = 'N'
        AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND ((SUCU_ID = :AGENCIA) or (:AGENCIA = 0))
        GROUP BY FACT_FECHA
        INTO :VENTAS, :FECHA
        DO
        BEGIN
        if (VENTAS > MAXVENTA) then
            MAXVENTA = VENTAS;
        SELECT SUM(DEVT_TOTAL-DEVT_IVAMONTO) FROM devoluciones_ventas F, PREFIJOS P
            WHERE VEND_COD = :CODVEND AND DEVT_FECHA = :FECHA AND DEVT_ANULADO = 'N'
            AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 33 AND ((SUCU_ID = :AGENCIA) or (:AGENCIA = 0))
            INTO :SUBTOTAL;
        if (SUBTOTAL IS NOT NULL) then
            VENTAS = VENTAS - SUBTOTAL;
        /* CALCULE EL RECAUDO DEL DIA EXCLUYENDO EL IVA */
        RECAUDO = 0;
        FOR SELECT RCDE_TIPODOC, RCDE_IDDOC, (RCDE_ABONO+RCDE_RTFTE+RCDE_RTIVA+RCDE_RTICA)
            FROM RECIBOS_CAJA R, RECIBOS_CAJA_DETALLE RD, MOVIMIENTO_CLIENTES M
            WHERE R.RECA_ID = RD.RECA_ID AND RECA_FECHA = :FECHA AND RECA_ANULADO = 'N' and
            MVCL_TIPOREF = RCDE_TIPODOC AND MVCL_IDREF = RCDE_IDDOC AND R.COBR_COD = :CODVEND
            INTO :TIPO, :ID, :ABONO
            DO
            BEGIN
            /* TRAIGA EL DOCUMENTO Y CALCULE LA BASE */
            if (TIPO = 31) then
                SELECT FACT_TOTAL,FACT_IVAMONTO FROM FACTURAS WHERE FACT_ID = :ID INTO :TOTAL, :IVAMONTO;
            if (TIPO = 33) then
                SELECT DEVT_TOTAL*-1,DEVT_IVAMONTO*-1 FROM DEVOLUCIONES_VENTAS WHERE DEVT_ID = :ID INTO :TOTAL, :IVAMONTO;
            if (TIPO = 41) then
                SELECT NDCL_MONTO,NDCL_IVAMONTO FROM NOTAS_DEBITO_CLIENTES WHERE NDCL_ID = :ID INTO :TOTAL, :IVAMONTO;
            if (TIPO = 42) then
                SELECT NCCL_MONTO*-1,NCCL_IVAMONTO*-1 FROM NOTAS_CREDITO_CLIENTES WHERE NCCL_ID = :ID INTO :TOTAL, :IVAMONTO;
            if (TIPO = 77) then
                SELECT DVCH_MONTO,0 FROM DEVOLUCION_CHEQUES WHERE DVCH_ID = :ID INTO :TOTAL, :IVAMONTO;
            if (TOTAL <> 0) then
                SUBTOTAL = (ABONO / TOTAL) * (TOTAL - IVAMONTO);
            RECAUDO = RECAUDO + SUBTOTAL;
            END
        FOR SELECT EGCC_TIPODOC, EGCC_IDDOC, (EGCC_ABONO+EGCC_RTFTE+EGCC_RTIVA+EGCC_RTICA)
            FROM EGRESOS E, EGRESOS_CRUCEC C, MOVIMIENTO_CLIENTES M
            WHERE E.EGRE_ID = C.EGRE_ID AND EGRE_FECHA = :FECHA AND EGRE_ANULADO = 'N' and
            MVCL_TIPOREF = EGCC_TIPODOC AND MVCL_IDREF = EGCC_IDDOC AND M.cobr_cod = :CODVEND
            INTO :TIPO, :ID, :ABONO
            DO
            BEGIN
            /* TRAIGA EL DOCUMENTO Y CALCULE LA BASE */
            if (TIPO = 31) then
                SELECT FACT_TOTAL,FACT_IVAMONTO FROM FACTURAS WHERE FACT_ID = :ID INTO :TOTAL, :IVAMONTO;
            if (TIPO = 33) then
                SELECT DEVT_TOTAL*-1,DEVT_IVAMONTO*-1 FROM DEVOLUCIONES_VENTAS WHERE DEVT_ID = :ID INTO :TOTAL, :IVAMONTO;
            if (TIPO = 41) then
                SELECT NDCL_MONTO,NDCL_IVAMONTO FROM NOTAS_DEBITO_CLIENTES WHERE NDCL_ID = :ID INTO :TOTAL, :IVAMONTO;
            if (TIPO = 42) then
                SELECT NCCL_MONTO*-1,NCCL_IVAMONTO*-1 FROM NOTAS_CREDITO_CLIENTES WHERE NCCL_ID = :ID INTO :TOTAL, :IVAMONTO;
            if (TIPO = 77) then
                SELECT DVCH_MONTO,0 FROM DEVOLUCION_CHEQUES WHERE DVCH_ID = :ID INTO :TOTAL, :IVAMONTO;
            if (TOTAL <> 0) then
                SUBTOTAL = (ABONO / TOTAL) * (TOTAL - IVAMONTO);
            RECAUDO = RECAUDO + SUBTOTAL;
            END
        if (RECAUDO > MAXRECAUDO) then
            MAXRECAUDO = RECAUDO;
        suspend;
        END
    END
end
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE ESTADISTICA_VENTAS_VENDEDOR_ANO(
    AGENCIA INTEGER,
    VENDINI INTEGER,
    VENDFIN INTEGER,
    ANO CHAR(4))
RETURNS (
    CODVEND INTEGER,
    NOMVEND VARCHAR(60),
    CODAGENCIA INTEGER,
    NOMAGENCIA VARCHAR(60),
    MES INTEGER,
    VENTA1 NUMERIC(18,2),
    VENTA2 NUMERIC(18,2),
    RECAUDO1 NUMERIC(18,2),
    RECAUDO2 NUMERIC(18,2))
AS
declare variable ANOAUX INTEGER;
declare variable ANO2 CHAR(4);
begin /*$$IBE$$ 
ANOAUX = CAST(ANO AS INTEGER);
ANOAUX = ANOAUX - 1;
ANO2 = CAST(ANOAUX AS CHAR(4));
MES = 1;
SELECT MAX(CODVEND), MAX(NOMVEND), MAX(codagencia), MAX(nomagencia), SUM(VENTAS), SUM(RECAUDO)
    FROM ESTADISTICA_VENTAS_VENDEDOR_MES(:AGENCIA, :VENDINI, :vendfin,  :ANO, :MES)
    GROUP BY CODVEND
    INTO :CODVEND, :NOMVEND, :CODAGENCIA, :NOMAGENCIA, :VENTA1, :RECAUDO1;
SELECT MAX(CODVEND), MAX(NOMVEND), MAX(codagencia), MAX(nomagencia), SUM(VENTAS), SUM(RECAUDO)
    FROM ESTADISTICA_VENTAS_VENDEDOR_MES(:AGENCIA, :VENDINI, :vendfin,  :ANO2, :MES)
    GROUP BY CODVEND
    INTO :CODVEND, :NOMVEND, :CODAGENCIA, :NOMAGENCIA, :VENTA2, :RECAUDO2;
suspend;
MES = 2;
SELECT MAX(CODVEND), MAX(NOMVEND), MAX(codagencia), MAX(nomagencia), SUM(VENTAS), SUM(RECAUDO)
    FROM ESTADISTICA_VENTAS_VENDEDOR_MES(:AGENCIA, :VENDINI, :vendfin,  :ANO, :MES)
    GROUP BY CODVEND
    INTO :CODVEND, :NOMVEND, :CODAGENCIA, :NOMAGENCIA, :VENTA1, :RECAUDO1;
SELECT MAX(CODVEND), MAX(NOMVEND), MAX(codagencia), MAX(nomagencia), SUM(VENTAS), SUM(RECAUDO)
    FROM ESTADISTICA_VENTAS_VENDEDOR_MES(:AGENCIA, :VENDINI, :vendfin,  :ANO2, :MES)
    GROUP BY CODVEND
    INTO :CODVEND, :NOMVEND, :CODAGENCIA, :NOMAGENCIA, :VENTA2, :RECAUDO2;
suspend;
MES = 3;
SELECT MAX(CODVEND), MAX(NOMVEND), MAX(codagencia), MAX(nomagencia), SUM(VENTAS), SUM(RECAUDO)
    FROM ESTADISTICA_VENTAS_VENDEDOR_MES(:AGENCIA, :VENDINI, :vendfin,  :ANO, :MES)
    GROUP BY CODVEND
    INTO :CODVEND, :NOMVEND, :CODAGENCIA, :NOMAGENCIA, :VENTA1, :RECAUDO1;
SELECT MAX(CODVEND), MAX(NOMVEND), MAX(codagencia), MAX(nomagencia), SUM(VENTAS), SUM(RECAUDO)
    FROM ESTADISTICA_VENTAS_VENDEDOR_MES(:AGENCIA, :VENDINI, :vendfin,  :ANO2, :MES)
    GROUP BY CODVEND
    INTO :CODVEND, :NOMVEND, :CODAGENCIA, :NOMAGENCIA, :VENTA2, :RECAUDO2;
suspend;
MES = 4;
SELECT MAX(CODVEND), MAX(NOMVEND), MAX(codagencia), MAX(nomagencia), SUM(VENTAS), SUM(RECAUDO)
    FROM ESTADISTICA_VENTAS_VENDEDOR_MES(:AGENCIA, :VENDINI, :vendfin,  :ANO, :MES)
    GROUP BY CODVEND
    INTO :CODVEND, :NOMVEND, :CODAGENCIA, :NOMAGENCIA, :VENTA1, :RECAUDO1;
SELECT MAX(CODVEND), MAX(NOMVEND), MAX(codagencia), MAX(nomagencia), SUM(VENTAS), SUM(RECAUDO)
    FROM ESTADISTICA_VENTAS_VENDEDOR_MES(:AGENCIA, :VENDINI, :vendfin,  :ANO2, :MES)
    GROUP BY CODVEND
    INTO :CODVEND, :NOMVEND, :CODAGENCIA, :NOMAGENCIA, :VENTA2, :RECAUDO2;
suspend;
MES = 5;
SELECT MAX(CODVEND), MAX(NOMVEND), MAX(codagencia), MAX(nomagencia), SUM(VENTAS), SUM(RECAUDO)
    FROM ESTADISTICA_VENTAS_VENDEDOR_MES(:AGENCIA, :VENDINI, :vendfin,  :ANO, :MES)
    GROUP BY CODVEND
    INTO :CODVEND, :NOMVEND, :CODAGENCIA, :NOMAGENCIA, :VENTA1, :RECAUDO1;
SELECT MAX(CODVEND), MAX(NOMVEND), MAX(codagencia), MAX(nomagencia), SUM(VENTAS), SUM(RECAUDO)
    FROM ESTADISTICA_VENTAS_VENDEDOR_MES(:AGENCIA, :VENDINI, :vendfin,  :ANO2, :MES)
    GROUP BY CODVEND
    INTO :CODVEND, :NOMVEND, :CODAGENCIA, :NOMAGENCIA, :VENTA2, :RECAUDO2;
suspend;
MES = 6;
SELECT MAX(CODVEND), MAX(NOMVEND), MAX(codagencia), MAX(nomagencia), SUM(VENTAS), SUM(RECAUDO)
    FROM ESTADISTICA_VENTAS_VENDEDOR_MES(:AGENCIA, :VENDINI, :vendfin,  :ANO, :MES)
    GROUP BY CODVEND
    INTO :CODVEND, :NOMVEND, :CODAGENCIA, :NOMAGENCIA, :VENTA1, :RECAUDO1;
SELECT MAX(CODVEND), MAX(NOMVEND), MAX(codagencia), MAX(nomagencia), SUM(VENTAS), SUM(RECAUDO)
    FROM ESTADISTICA_VENTAS_VENDEDOR_MES(:AGENCIA, :VENDINI, :vendfin,  :ANO2, :MES)
    GROUP BY CODVEND
    INTO :CODVEND, :NOMVEND, :CODAGENCIA, :NOMAGENCIA, :VENTA2, :RECAUDO2;
suspend;
MES = 7;
SELECT MAX(CODVEND), MAX(NOMVEND), MAX(codagencia), MAX(nomagencia), SUM(VENTAS), SUM(RECAUDO)
    FROM ESTADISTICA_VENTAS_VENDEDOR_MES(:AGENCIA, :VENDINI, :vendfin,  :ANO, :MES)
    GROUP BY CODVEND
    INTO :CODVEND, :NOMVEND, :CODAGENCIA, :NOMAGENCIA, :VENTA1, :RECAUDO1;
SELECT MAX(CODVEND), MAX(NOMVEND), MAX(codagencia), MAX(nomagencia), SUM(VENTAS), SUM(RECAUDO)
    FROM ESTADISTICA_VENTAS_VENDEDOR_MES(:AGENCIA, :VENDINI, :vendfin,  :ANO2, :MES)
    GROUP BY CODVEND
    INTO :CODVEND, :NOMVEND, :CODAGENCIA, :NOMAGENCIA, :VENTA2, :RECAUDO2;
suspend;
MES = 8;
SELECT MAX(CODVEND), MAX(NOMVEND), MAX(codagencia), MAX(nomagencia), SUM(VENTAS), SUM(RECAUDO)
    FROM ESTADISTICA_VENTAS_VENDEDOR_MES(:AGENCIA, :VENDINI, :vendfin,  :ANO, :MES)
    GROUP BY CODVEND
    INTO :CODVEND, :NOMVEND, :CODAGENCIA, :NOMAGENCIA, :VENTA1, :RECAUDO1;
SELECT MAX(CODVEND), MAX(NOMVEND), MAX(codagencia), MAX(nomagencia), SUM(VENTAS), SUM(RECAUDO)
    FROM ESTADISTICA_VENTAS_VENDEDOR_MES(:AGENCIA, :VENDINI, :vendfin,  :ANO2, :MES)
    GROUP BY CODVEND
    INTO :CODVEND, :NOMVEND, :CODAGENCIA, :NOMAGENCIA, :VENTA2, :RECAUDO2;
suspend;
MES = 9;
SELECT MAX(CODVEND), MAX(NOMVEND), MAX(codagencia), MAX(nomagencia), SUM(VENTAS), SUM(RECAUDO)
    FROM ESTADISTICA_VENTAS_VENDEDOR_MES(:AGENCIA, :VENDINI, :vendfin,  :ANO, :MES)
    GROUP BY CODVEND
    INTO :CODVEND, :NOMVEND, :CODAGENCIA, :NOMAGENCIA, :VENTA1, :RECAUDO1;
SELECT MAX(CODVEND), MAX(NOMVEND), MAX(codagencia), MAX(nomagencia), SUM(VENTAS), SUM(RECAUDO)
    FROM ESTADISTICA_VENTAS_VENDEDOR_MES(:AGENCIA, :VENDINI, :vendfin,  :ANO2, :MES)
    GROUP BY CODVEND
    INTO :CODVEND, :NOMVEND, :CODAGENCIA, :NOMAGENCIA, :VENTA2, :RECAUDO2;
suspend;
MES = 10;
SELECT MAX(CODVEND), MAX(NOMVEND), MAX(codagencia), MAX(nomagencia), SUM(VENTAS), SUM(RECAUDO)
    FROM ESTADISTICA_VENTAS_VENDEDOR_MES(:AGENCIA, :VENDINI, :vendfin,  :ANO, :MES)
    GROUP BY CODVEND
    INTO :CODVEND, :NOMVEND, :CODAGENCIA, :NOMAGENCIA, :VENTA1, :RECAUDO1;
SELECT MAX(CODVEND), MAX(NOMVEND), MAX(codagencia), MAX(nomagencia), SUM(VENTAS), SUM(RECAUDO)
    FROM ESTADISTICA_VENTAS_VENDEDOR_MES(:AGENCIA, :VENDINI, :vendfin,  :ANO2, :MES)
    GROUP BY CODVEND
    INTO :CODVEND, :NOMVEND, :CODAGENCIA, :NOMAGENCIA, :VENTA2, :RECAUDO2;
suspend;
MES = 11;
SELECT MAX(CODVEND), MAX(NOMVEND), MAX(codagencia), MAX(nomagencia), SUM(VENTAS), SUM(RECAUDO)
    FROM ESTADISTICA_VENTAS_VENDEDOR_MES(:AGENCIA, :VENDINI, :vendfin,  :ANO, :MES)
    GROUP BY CODVEND
    INTO :CODVEND, :NOMVEND, :CODAGENCIA, :NOMAGENCIA, :VENTA1, :RECAUDO1;
SELECT MAX(CODVEND), MAX(NOMVEND), MAX(codagencia), MAX(nomagencia), SUM(VENTAS), SUM(RECAUDO)
    FROM ESTADISTICA_VENTAS_VENDEDOR_MES(:AGENCIA, :VENDINI, :vendfin,  :ANO2, :MES)
    GROUP BY CODVEND
    INTO :CODVEND, :NOMVEND, :CODAGENCIA, :NOMAGENCIA, :VENTA2, :RECAUDO2;
suspend;
MES = 12;
SELECT MAX(CODVEND), MAX(NOMVEND), MAX(codagencia), MAX(nomagencia), SUM(VENTAS), SUM(RECAUDO)
    FROM ESTADISTICA_VENTAS_VENDEDOR_MES(:AGENCIA, :VENDINI, :vendfin,  :ANO, :MES)
    GROUP BY CODVEND
    INTO :CODVEND, :NOMVEND, :CODAGENCIA, :NOMAGENCIA, :VENTA1, :RECAUDO1;
SELECT MAX(CODVEND), MAX(NOMVEND), MAX(codagencia), MAX(nomagencia), SUM(VENTAS), SUM(RECAUDO)
    FROM ESTADISTICA_VENTAS_VENDEDOR_MES(:AGENCIA, :VENDINI, :vendfin,  :ANO2, :MES)
    GROUP BY CODVEND
    INTO :CODVEND, :NOMVEND, :CODAGENCIA, :NOMAGENCIA, :VENTA2, :RECAUDO2;
suspend;
 $$IBE$$*/ SUSPEND;
end
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE ESTADISTICA_VENTAS_VENDEDOR_ANO(
    AGENCIA INTEGER,
    VENDINI INTEGER,
    VENDFIN INTEGER,
    ANO CHAR(4))
RETURNS (
    CODVEND INTEGER,
    NOMVEND VARCHAR(60),
    CODAGENCIA INTEGER,
    NOMAGENCIA VARCHAR(60),
    MES INTEGER,
    VENTA1 NUMERIC(18,2),
    VENTA2 NUMERIC(18,2),
    RECAUDO1 NUMERIC(18,2),
    RECAUDO2 NUMERIC(18,2))
AS
declare variable ANOAUX INTEGER;
declare variable ANO2 CHAR(4);
begin
ANOAUX = CAST(ANO AS INTEGER);
ANOAUX = ANOAUX - 1;
ANO2 = CAST(ANOAUX AS CHAR(4));
MES = 1;
SELECT MAX(CODVEND), MAX(NOMVEND), MAX(codagencia), MAX(nomagencia), SUM(VENTAS), SUM(RECAUDO)
    FROM ESTADISTICA_VENTAS_VENDEDOR_MES(:AGENCIA, :VENDINI, :vendfin,  :ANO, :MES)
    GROUP BY CODVEND
    INTO :CODVEND, :NOMVEND, :CODAGENCIA, :NOMAGENCIA, :VENTA1, :RECAUDO1;
SELECT MAX(CODVEND), MAX(NOMVEND), MAX(codagencia), MAX(nomagencia), SUM(VENTAS), SUM(RECAUDO)
    FROM ESTADISTICA_VENTAS_VENDEDOR_MES(:AGENCIA, :VENDINI, :vendfin,  :ANO2, :MES)
    GROUP BY CODVEND
    INTO :CODVEND, :NOMVEND, :CODAGENCIA, :NOMAGENCIA, :VENTA2, :RECAUDO2;
suspend;
MES = 2;
SELECT MAX(CODVEND), MAX(NOMVEND), MAX(codagencia), MAX(nomagencia), SUM(VENTAS), SUM(RECAUDO)
    FROM ESTADISTICA_VENTAS_VENDEDOR_MES(:AGENCIA, :VENDINI, :vendfin,  :ANO, :MES)
    GROUP BY CODVEND
    INTO :CODVEND, :NOMVEND, :CODAGENCIA, :NOMAGENCIA, :VENTA1, :RECAUDO1;
SELECT MAX(CODVEND), MAX(NOMVEND), MAX(codagencia), MAX(nomagencia), SUM(VENTAS), SUM(RECAUDO)
    FROM ESTADISTICA_VENTAS_VENDEDOR_MES(:AGENCIA, :VENDINI, :vendfin,  :ANO2, :MES)
    GROUP BY CODVEND
    INTO :CODVEND, :NOMVEND, :CODAGENCIA, :NOMAGENCIA, :VENTA2, :RECAUDO2;
suspend;
MES = 3;
SELECT MAX(CODVEND), MAX(NOMVEND), MAX(codagencia), MAX(nomagencia), SUM(VENTAS), SUM(RECAUDO)
    FROM ESTADISTICA_VENTAS_VENDEDOR_MES(:AGENCIA, :VENDINI, :vendfin,  :ANO, :MES)
    GROUP BY CODVEND
    INTO :CODVEND, :NOMVEND, :CODAGENCIA, :NOMAGENCIA, :VENTA1, :RECAUDO1;
SELECT MAX(CODVEND), MAX(NOMVEND), MAX(codagencia), MAX(nomagencia), SUM(VENTAS), SUM(RECAUDO)
    FROM ESTADISTICA_VENTAS_VENDEDOR_MES(:AGENCIA, :VENDINI, :vendfin,  :ANO2, :MES)
    GROUP BY CODVEND
    INTO :CODVEND, :NOMVEND, :CODAGENCIA, :NOMAGENCIA, :VENTA2, :RECAUDO2;
suspend;
MES = 4;
SELECT MAX(CODVEND), MAX(NOMVEND), MAX(codagencia), MAX(nomagencia), SUM(VENTAS), SUM(RECAUDO)
    FROM ESTADISTICA_VENTAS_VENDEDOR_MES(:AGENCIA, :VENDINI, :vendfin,  :ANO, :MES)
    GROUP BY CODVEND
    INTO :CODVEND, :NOMVEND, :CODAGENCIA, :NOMAGENCIA, :VENTA1, :RECAUDO1;
SELECT MAX(CODVEND), MAX(NOMVEND), MAX(codagencia), MAX(nomagencia), SUM(VENTAS), SUM(RECAUDO)
    FROM ESTADISTICA_VENTAS_VENDEDOR_MES(:AGENCIA, :VENDINI, :vendfin,  :ANO2, :MES)
    GROUP BY CODVEND
    INTO :CODVEND, :NOMVEND, :CODAGENCIA, :NOMAGENCIA, :VENTA2, :RECAUDO2;
suspend;
MES = 5;
SELECT MAX(CODVEND), MAX(NOMVEND), MAX(codagencia), MAX(nomagencia), SUM(VENTAS), SUM(RECAUDO)
    FROM ESTADISTICA_VENTAS_VENDEDOR_MES(:AGENCIA, :VENDINI, :vendfin,  :ANO, :MES)
    GROUP BY CODVEND
    INTO :CODVEND, :NOMVEND, :CODAGENCIA, :NOMAGENCIA, :VENTA1, :RECAUDO1;
SELECT MAX(CODVEND), MAX(NOMVEND), MAX(codagencia), MAX(nomagencia), SUM(VENTAS), SUM(RECAUDO)
    FROM ESTADISTICA_VENTAS_VENDEDOR_MES(:AGENCIA, :VENDINI, :vendfin,  :ANO2, :MES)
    GROUP BY CODVEND
    INTO :CODVEND, :NOMVEND, :CODAGENCIA, :NOMAGENCIA, :VENTA2, :RECAUDO2;
suspend;
MES = 6;
SELECT MAX(CODVEND), MAX(NOMVEND), MAX(codagencia), MAX(nomagencia), SUM(VENTAS), SUM(RECAUDO)
    FROM ESTADISTICA_VENTAS_VENDEDOR_MES(:AGENCIA, :VENDINI, :vendfin,  :ANO, :MES)
    GROUP BY CODVEND
    INTO :CODVEND, :NOMVEND, :CODAGENCIA, :NOMAGENCIA, :VENTA1, :RECAUDO1;
SELECT MAX(CODVEND), MAX(NOMVEND), MAX(codagencia), MAX(nomagencia), SUM(VENTAS), SUM(RECAUDO)
    FROM ESTADISTICA_VENTAS_VENDEDOR_MES(:AGENCIA, :VENDINI, :vendfin,  :ANO2, :MES)
    GROUP BY CODVEND
    INTO :CODVEND, :NOMVEND, :CODAGENCIA, :NOMAGENCIA, :VENTA2, :RECAUDO2;
suspend;
MES = 7;
SELECT MAX(CODVEND), MAX(NOMVEND), MAX(codagencia), MAX(nomagencia), SUM(VENTAS), SUM(RECAUDO)
    FROM ESTADISTICA_VENTAS_VENDEDOR_MES(:AGENCIA, :VENDINI, :vendfin,  :ANO, :MES)
    GROUP BY CODVEND
    INTO :CODVEND, :NOMVEND, :CODAGENCIA, :NOMAGENCIA, :VENTA1, :RECAUDO1;
SELECT MAX(CODVEND), MAX(NOMVEND), MAX(codagencia), MAX(nomagencia), SUM(VENTAS), SUM(RECAUDO)
    FROM ESTADISTICA_VENTAS_VENDEDOR_MES(:AGENCIA, :VENDINI, :vendfin,  :ANO2, :MES)
    GROUP BY CODVEND
    INTO :CODVEND, :NOMVEND, :CODAGENCIA, :NOMAGENCIA, :VENTA2, :RECAUDO2;
suspend;
MES = 8;
SELECT MAX(CODVEND), MAX(NOMVEND), MAX(codagencia), MAX(nomagencia), SUM(VENTAS), SUM(RECAUDO)
    FROM ESTADISTICA_VENTAS_VENDEDOR_MES(:AGENCIA, :VENDINI, :vendfin,  :ANO, :MES)
    GROUP BY CODVEND
    INTO :CODVEND, :NOMVEND, :CODAGENCIA, :NOMAGENCIA, :VENTA1, :RECAUDO1;
SELECT MAX(CODVEND), MAX(NOMVEND), MAX(codagencia), MAX(nomagencia), SUM(VENTAS), SUM(RECAUDO)
    FROM ESTADISTICA_VENTAS_VENDEDOR_MES(:AGENCIA, :VENDINI, :vendfin,  :ANO2, :MES)
    GROUP BY CODVEND
    INTO :CODVEND, :NOMVEND, :CODAGENCIA, :NOMAGENCIA, :VENTA2, :RECAUDO2;
suspend;
MES = 9;
SELECT MAX(CODVEND), MAX(NOMVEND), MAX(codagencia), MAX(nomagencia), SUM(VENTAS), SUM(RECAUDO)
    FROM ESTADISTICA_VENTAS_VENDEDOR_MES(:AGENCIA, :VENDINI, :vendfin,  :ANO, :MES)
    GROUP BY CODVEND
    INTO :CODVEND, :NOMVEND, :CODAGENCIA, :NOMAGENCIA, :VENTA1, :RECAUDO1;
SELECT MAX(CODVEND), MAX(NOMVEND), MAX(codagencia), MAX(nomagencia), SUM(VENTAS), SUM(RECAUDO)
    FROM ESTADISTICA_VENTAS_VENDEDOR_MES(:AGENCIA, :VENDINI, :vendfin,  :ANO2, :MES)
    GROUP BY CODVEND
    INTO :CODVEND, :NOMVEND, :CODAGENCIA, :NOMAGENCIA, :VENTA2, :RECAUDO2;
suspend;
MES = 10;
SELECT MAX(CODVEND), MAX(NOMVEND), MAX(codagencia), MAX(nomagencia), SUM(VENTAS), SUM(RECAUDO)
    FROM ESTADISTICA_VENTAS_VENDEDOR_MES(:AGENCIA, :VENDINI, :vendfin,  :ANO, :MES)
    GROUP BY CODVEND
    INTO :CODVEND, :NOMVEND, :CODAGENCIA, :NOMAGENCIA, :VENTA1, :RECAUDO1;
SELECT MAX(CODVEND), MAX(NOMVEND), MAX(codagencia), MAX(nomagencia), SUM(VENTAS), SUM(RECAUDO)
    FROM ESTADISTICA_VENTAS_VENDEDOR_MES(:AGENCIA, :VENDINI, :vendfin,  :ANO2, :MES)
    GROUP BY CODVEND
    INTO :CODVEND, :NOMVEND, :CODAGENCIA, :NOMAGENCIA, :VENTA2, :RECAUDO2;
suspend;
MES = 11;
SELECT MAX(CODVEND), MAX(NOMVEND), MAX(codagencia), MAX(nomagencia), SUM(VENTAS), SUM(RECAUDO)
    FROM ESTADISTICA_VENTAS_VENDEDOR_MES(:AGENCIA, :VENDINI, :vendfin,  :ANO, :MES)
    GROUP BY CODVEND
    INTO :CODVEND, :NOMVEND, :CODAGENCIA, :NOMAGENCIA, :VENTA1, :RECAUDO1;
SELECT MAX(CODVEND), MAX(NOMVEND), MAX(codagencia), MAX(nomagencia), SUM(VENTAS), SUM(RECAUDO)
    FROM ESTADISTICA_VENTAS_VENDEDOR_MES(:AGENCIA, :VENDINI, :vendfin,  :ANO2, :MES)
    GROUP BY CODVEND
    INTO :CODVEND, :NOMVEND, :CODAGENCIA, :NOMAGENCIA, :VENTA2, :RECAUDO2;
suspend;
MES = 12;
SELECT MAX(CODVEND), MAX(NOMVEND), MAX(codagencia), MAX(nomagencia), SUM(VENTAS), SUM(RECAUDO)
    FROM ESTADISTICA_VENTAS_VENDEDOR_MES(:AGENCIA, :VENDINI, :vendfin,  :ANO, :MES)
    GROUP BY CODVEND
    INTO :CODVEND, :NOMVEND, :CODAGENCIA, :NOMAGENCIA, :VENTA1, :RECAUDO1;
SELECT MAX(CODVEND), MAX(NOMVEND), MAX(codagencia), MAX(nomagencia), SUM(VENTAS), SUM(RECAUDO)
    FROM ESTADISTICA_VENTAS_VENDEDOR_MES(:AGENCIA, :VENDINI, :vendfin,  :ANO2, :MES)
    GROUP BY CODVEND
    INTO :CODVEND, :NOMVEND, :CODAGENCIA, :NOMAGENCIA, :VENTA2, :RECAUDO2;
suspend;
end

^

SET TERM ; ^

CREATE TABLE RECIBOS_CAJA_CRUCEC (
    RECA_ID T_ID NOT NULL,
    RCCR_ITEM T_ID NOT NULL,
    RCCR_TIPODOC INTEGER,
    RCCR_IDDOC INTEGER,
    RCCR_PREFIJO VARCHAR(4),
    RCCR_NUMERO VARCHAR(6),
    RCCR_ABONO T_MONTO,
    RCCR_RTFTE T_MONTO,
    RCCR_RTIVA T_MONTO,
    RCCR_RTICA T_MONTO,
    RCCR_DTOF T_MONTO,
    RCCR_ANULADO T_BOOLEANO,
    RCCR_TRANSMIT T_BOOLEANO);
alter table RECIBOS_CAJA_CRUCEC
add constraint PK_RECIBOS_CAJA_CRUCEC
primary key (RECA_ID,RCCR_ITEM);

SET TERM ^ ;

create trigger RECIBOS_CAJA_CRUCEC_AI for RECIBOS_CAJA_CRUCEC
active AFTER INSERT position 0
AS
declare variable EXISTE CHAR(1);
declare variable FEC DATE;
declare variable NIT VARCHAR(20);
declare variable CONCEPTO VARCHAR(60);
declare variable PREFIJO VARCHAR(4);
declare variable NUMERO VARCHAR(6);
declare variable OK CHAR(1);
declare variable RETES CHAR(2);
declare variable SALDO NUMERIC(18,2);
BEGIN
  if ((NEW.RECA_ID <> 0) and (new.rccr_anulado = 'N')) then
    BEGIN
    OK = 'N';
    /* Abone el documento referenciado  */
    select PREF_PRE, RECA_NUMERO, RECA_FECHA, RECA_CONC, TERC_NIT
        from RECIBOS_CAJA where RECA_ID = new.reca_id into :PREFIJO, :NUMERO, :FEC, :CONCEPTO, :NIT;
    /* valide que no se pase del saldo */
    execute procedure saldo_doc_cxpagar(new.rccr_tipodoc, new.rccr_iddoc, '9999/12/31') returning_values(saldo);
    execute procedure lee_configuracion('CXPAGAR', 'SALDOS', 'DESCONTAR RETENCIONES POR CAUSACION') returning_values (RETES);
    if (SALDO < 0) then
        BEGIN
        if (RETES = 'SI') then
            begin
            if (saldo > NEW.rccr_abono) then
                EXCEPTION DOCUMENTO_ABONO_MAYOR;
            end
        ELSE
            begin
            if (saldo > (NEW.rccr_abono + NEW.rccr_rtfte + NEW.rccr_rtiva + NEW.rccr_rtica + new.rccr_dtof)) then
                EXCEPTION DOCUMENTO_ABONO_MAYOR;
            end
        END
    else
        BEGIN
        if (RETES = 'SI') then
            begin
            if (saldo < NEW.rccr_abono) then
                EXCEPTION DOCUMENTO_ABONO_MAYOR;
            end
        ELSE
            begin
            if (saldo < (NEW.rccr_abono + NEW.rccr_rtfte + NEW.rccr_rtiva + NEW.rccr_rtica + NEW.rccr_dtof)) then
                EXCEPTION DOCUMENTO_ABONO_MAYOR;
            end
        END
    if (OK = 'N') then
        BEGIN
        select 'S' from saldos_doc_cxpagar where sdcp_tiporef = new.rccr_tipodoc and
            sdcp_idref = new.rccr_iddoc and sdcp_fecha = :FEC into :EXISTE;
        if (Existe = 'S') then
            begin
            /* actualice el saldo del dia */
            UPDATE saldos_doc_cxpagar
                SET SDCP_ABONO = SDCP_ABONO + (NEW.rccr_abono + NEW.rccr_dtof),
                    SDCP_ABRTFTE = SDCP_ABRTFTE + NEW.rccr_rtfte,
                    SDCP_ABRTIVA = SDCP_ABRTIVA + NEW.rccr_rtiva,
                    SDCP_ABRTICA = SDCP_ABRTICA + NEW.rccr_rtica
                WHERE SDCP_TIPOREF = NEW.rccr_tipodoc AND SDCP_IDREF = NEW.rccr_iddoc AND SDCP_FECHA = :FEC;
            END
        ELSE
            BEGIN
            /* Inserte un nuevo saldo diario */
            INSERT INTO SALDOS_DOC_CXPAGAR (SDCP_TIPOREF, SDCP_IDREF, SDCP_FECHA, TERC_NIT, SDCP_RTEFTE, SDCP_RTIVA, SDCP_RTICA, SDCP_ABONO, SDCP_ABRTFTE, SDCP_ABRTIVA, SDCP_ABRTICA, SDCP_DEBITO, SDCP_MONTO)
                VALUES (NEW.rccr_tipodoc, NEW.rccr_iddoc, :FEC, :NIT, 0, 0, 0, (NEW.rccr_abono+NEW.rccr_dtof), NEW.rccr_rtfte, NEW.rccr_rtiva, NEW.rccr_rtica, 'N', 0);
            END
        END
    /* actualice el registro en mov_proveedor (por si son varios items) */
    EXISTE = 'N';
    SELECT 'S' FROM MOVIMIENTO_PROVEEDOR WHERE MVPR_TIPOREF = 61 AND MVPR_IDREF = NEW.reca_id INTO :EXISTE;
    if (EXISTE = 'S') then
        begin
        UPDATE movimiento_proveedor
            SET MVPR_MONTO = MVPR_MONTO + (NEW.rccr_abono + NEW.rccr_dtof),
                MVPR_RTFTE = MVPR_RTFTE + NEW.rccr_rtfte,
                MVPR_RTIVA = MVPR_RTIVA + NEW.rccr_rtiva,
                MVPR_RTICA = MVPR_RTICA + NEW.rccr_rtica
            WHERE MVPR_TIPOREF = 61 AND MVPR_IDREF = NEW.reca_id;
        end
    ELSE
        INSERT INTO MOVIMIENTO_PROVEEDOR (MVPR_ID, TERC_NIT, MVPR_TIPOREF, MVPR_IDREF, MVPR_FECHA, MVPR_VENCE, MVPR_CONC, MVPR_MONTO, MVPR_RTFTE, MVPR_RTIVA, MVPR_RTICA, MVPR_DEBITO, MVPR_ABONO, MVPR_PREFIJO, MVPR_NUMERO)
            VALUES (GEN_ID(ID_MOVPROV, 1), :NIT, 61, NEW.reca_id, :FEC, :FEC, :CONCEPTO, (NEW.rccr_abono+NEW.rccr_dtof), NEW.rccr_rtfte, NEW.rccr_rtiva, NEW.rccr_rtica, 'N', 'S', :PREFIJO, :NUMERO);
    END
END
^

SET TERM ; ^

GRANT UPDATE,REFERENCES ON RECIBOS_CAJA_CRUCEC TO TRIGGER RECIBOS_CAJA_CRUCEC_AI;
GRANT SELECT ON RECIBOS_CAJA TO TRIGGER RECIBOS_CAJA_CRUCEC_AI;
GRANT EXECUTE ON PROCEDURE SALDO_DOC_CXPAGAR TO TRIGGER RECIBOS_CAJA_CRUCEC_AI;
GRANT EXECUTE ON PROCEDURE LEE_CONFIGURACION TO TRIGGER RECIBOS_CAJA_CRUCEC_AI;
GRANT SELECT,INSERT,UPDATE ON SALDOS_DOC_CXPAGAR TO TRIGGER RECIBOS_CAJA_CRUCEC_AI;
GRANT SELECT,INSERT,UPDATE ON MOVIMIENTO_PROVEEDOR TO TRIGGER RECIBOS_CAJA_CRUCEC_AI;

SET TERM ^ ;

create trigger RECIBOS_CAJA_CRUCEC_AU for RECIBOS_CAJA_CRUCEC
active AFTER UPDATE position 0
as
declare variable EXISTE CHAR(1);
declare variable FEC DATE;
declare variable NIT VARCHAR(20);
declare variable CONCEPTO VARCHAR(60);
declare variable PREFIJO VARCHAR(4);
declare variable NUMERO VARCHAR(6);
declare variable RETES CHAR(2);
declare variable SALDO NUMERIC(18,2);
BEGIN
select PREF_PRE, RECA_NUMERO, RECA_FECHA, RECA_CONC, TERC_NIT from RECIBOS_CAJA
    where reca_id = new.reca_id into :PREFIJO, :NUMERO, :FEC, :CONCEPTO, :NIT;
if ((OLD.reca_id <> 0) and (old.rccr_anulado = 'N')) then
    BEGIN
    EXISTE = 'N';
    select 'S' from saldos_doc_cxpagar where sdcp_tiporef = old.rccr_tipodoc and
        sdcp_idref = old.rccr_iddoc and sdcp_fecha = :FEC into :EXISTE;
    if (Existe = 'S') then
        UPDATE saldos_doc_cxpagar
            SET SDCP_ABONO = SDCP_ABONO - (old.rccr_abono + OLD.rccr_dtof),
            SDCP_ABRTFTE = SDCP_ABRTFTE - old.rccr_rtfte,
            SDCP_ABRTIVA = SDCP_ABRTIVA - old.rccr_rtiva,
            SDCP_ABRTICA = SDCP_ABRTICA - old.rccr_rtica
            WHERE SDCP_TIPOREF = OLD.rccr_tipodoc AND SDCP_IDREF = OLD.rccr_iddoc AND SDCP_FECHA = :FEC;
    EXISTE = 'N';
    SELECT 'S' FROM MOVIMIENTO_PROVEEDOR WHERE MVPR_TIPOREF = 61 AND MVPR_IDREF = OLD.reca_id INTO :EXISTE;
    if (EXISTE = 'S') then
        UPDATE movimiento_proveedor
            SET MVPR_MONTO = MVPR_MONTO - (OLD.rccr_abono + OLD.rccr_dtof),
            MVPR_RTFTE = MVPR_RTFTE - OLD.rccr_rtfte,
            MVPR_RTIVA = MVPR_RTIVA - OLD.rccr_rtiva,
            MVPR_RTICA = MVPR_RTICA - OLD.rccr_rtica
            WHERE MVPR_TIPOREF = 61 AND MVPR_IDREF = OLD.reca_id;
    END
if ((NEW.reca_id <> 0) and (NEW.rccr_anulado = 'N')) then
    BEGIN
    /* valide que no se pase del saldo */
    execute procedure saldo_doc_cxpagar(new.rccr_tipodoc, new.rccr_iddoc, '9999/12/31') returning_values(saldo);
    execute procedure lee_configuracion('CXPAGAR', 'SALDOS', 'DESCONTAR RETENCIONES POR CAUSACION') returning_values (RETES);
    if (SALDO < 0) then
        BEGIN
        if (RETES = 'SI') then
            begin
            if (saldo > NEW.rccr_abono) then
                EXCEPTION DOCUMENTO_ABONO_MAYOR;
            end
        ELSE
            begin
            if (saldo > (NEW.rccr_abono + NEW.rccr_rtfte + NEW.rccr_rtiva + NEW.rccr_rtica + new.rccr_dtof)) then
                EXCEPTION DOCUMENTO_ABONO_MAYOR;
            end
        END
    else
        BEGIN
        if (RETES = 'SI') then
            begin
            if (saldo < NEW.rccr_abono) then
                EXCEPTION DOCUMENTO_ABONO_MAYOR;
            end
        ELSE
            begin
            if (saldo < (NEW.rccr_abono + NEW.rccr_rtfte + NEW.rccr_rtiva + NEW.rccr_rtica + NEW.rccr_dtof)) then
                EXCEPTION DOCUMENTO_ABONO_MAYOR;
            end
        END
    /* AHORA REGISTRE LO NUEVO */
    EXISTE = 'N';
    select 'S' from saldos_doc_cxpagar where sdcp_tiporef = new.rccr_tipodoc and
        sdcp_idref = new.rccr_iddoc and sdcp_fecha = :FEC into :EXISTE;
    if (Existe = 'S') then
        UPDATE saldos_doc_cxpagar
            SET SDCP_ABONO = SDCP_ABONO + (NEW.rccr_abono + NEW.rccr_dtof),
            SDCP_ABRTFTE = SDCP_ABRTFTE + NEW.rccr_rtfte,
            SDCP_ABRTIVA = SDCP_ABRTIVA + NEW.rccr_rtiva,
            SDCP_ABRTICA = SDCP_ABRTICA + NEW.rccr_rtica
            WHERE SDCP_TIPOREF = NEW.rccr_tipodoc AND SDCP_IDREF = NEW.rccr_iddoc AND SDCP_FECHA = :FEC;
    else
        INSERT INTO SALDOS_DOC_CXPAGAR (SDCP_TIPOREF, SDCP_IDREF, SDCP_FECHA, TERC_NIT, SDCP_RTEFTE, SDCP_RTIVA, SDCP_RTICA, SDCP_ABONO, SDCP_ABRTFTE, SDCP_ABRTIVA, SDCP_ABRTICA, SDCP_DEBITO, SDCP_MONTO)
            VALUES (NEW.rccr_tipodoc, NEW.rccr_iddoc, :FEC, :NIT, 0, 0, 0, (NEW.rccr_abono + NEW.rccr_dtof), NEW.rccr_rtfte, NEW.rccr_rtiva, NEW.rccr_rtica, 'N', 0);
    /* Registre o actualice el registro en movimiento_proveedor */
    EXISTE = 'N';
    SELECT 'S' FROM MOVIMIENTO_PROVEEDOR WHERE MVPR_TIPOREF = 61 AND MVPR_IDREF = NEW.reca_id INTO :EXISTE;
    if (EXISTE = 'S') then
        /* Actualice el nuevo */
        UPDATE movimiento_proveedor
            SET MVPR_MONTO = MVPR_MONTO + (NEW.rccr_abono + NEW.rccr_dtof),
                MVPR_RTFTE = MVPR_RTFTE + NEW.rccr_rtfte,
                MVPR_RTIVA = MVPR_RTIVA + NEW.rccr_rtiva,
                MVPR_RTICA = MVPR_RTICA + NEW.rccr_rtica
            WHERE MVPR_TIPOREF = 61 AND MVPR_IDREF = NEW.reca_id;
    ELSE
        INSERT INTO MOVIMIENTO_PROVEEDOR (MVPR_ID, TERC_NIT, MVPR_TIPOREF, MVPR_IDREF, MVPR_FECHA, MVPR_VENCE, MVPR_CONC, MVPR_MONTO, MVPR_RTFTE, MVPR_RTIVA, MVPR_RTICA, MVPR_DEBITO, MVPR_ABONO, MVPR_PREFIJO, MVPR_NUMERO)
            VALUES (GEN_ID(ID_MOVPROV, 1), :NIT, 61, NEW.reca_id, :FEC, :FEC, :CONCEPTO, (NEW.rccr_abono + NEW.rccr_dtof), NEW.rccr_rtfte, NEW.rccr_rtiva, NEW.rccr_rtica, 'N', 'S', :PREFIJO, :NUMERO);
    end
END
^

SET TERM ; ^

GRANT UPDATE,REFERENCES ON RECIBOS_CAJA_CRUCEC TO TRIGGER RECIBOS_CAJA_CRUCEC_AU;
GRANT SELECT ON RECIBOS_CAJA TO TRIGGER RECIBOS_CAJA_CRUCEC_AU;
GRANT SELECT,INSERT,UPDATE ON SALDOS_DOC_CXPAGAR TO TRIGGER RECIBOS_CAJA_CRUCEC_AU;
GRANT SELECT,INSERT,UPDATE ON MOVIMIENTO_PROVEEDOR TO TRIGGER RECIBOS_CAJA_CRUCEC_AU;
GRANT EXECUTE ON PROCEDURE SALDO_DOC_CXPAGAR TO TRIGGER RECIBOS_CAJA_CRUCEC_AU;
GRANT EXECUTE ON PROCEDURE LEE_CONFIGURACION TO TRIGGER RECIBOS_CAJA_CRUCEC_AU;

SET TERM ^ ;

create trigger RECIBOS_CAJA_CRUCEC_AD for RECIBOS_CAJA_CRUCEC
active AFTER DELETE position 0
as
declare variable FEC DATE;
BEGIN
if (OLD.reca_id <> 0) then
    BEGIN
    SELECT RECA_FECHA FROM RECIBOS_CAJA WHERE RECA_ID = OLD.reca_id INTO :FEC;
    if (old.rccr_anulado = 'N') then
      begin
      UPDATE saldos_doc_cxpagar
        SET SDCP_ABONO = SDCP_ABONO - (old.rccr_abono+old.rccr_dtof),
        SDCP_ABRTFTE = SDCP_ABRTFTE - old.rccr_rtfte,
        SDCP_ABRTIVA = SDCP_ABRTIVA - old.rccr_rtiva,
        SDCP_ABRTICA = SDCP_ABRTICA - old.rccr_rtica
        WHERE SDCP_TIPOREF = OLD.rccr_tipodoc AND SDCP_IDREF = OLD.rccr_iddoc AND SDCP_FECHA = :FEC;
      /* Deshaga el viejo */
      UPDATE movimiento_proveedor
        SET MVPR_MONTO = MVPR_MONTO - (OLD.rccr_abono+old.rccr_dtof),
        MVPR_RTFTE = MVPR_RTFTE - OLD.rccr_rtfte,
        MVPR_RTIVA = MVPR_RTIVA - OLD.rccr_rtiva,
        MVPR_RTICA = MVPR_RTICA - OLD.rccr_rtica
        WHERE MVPR_TIPOREF = 61 AND MVPR_IDREF = OLD.reca_id;
      end
    END
END
^

SET TERM ; ^

GRANT UPDATE,REFERENCES ON RECIBOS_CAJA_CRUCEC TO TRIGGER RECIBOS_CAJA_CRUCEC_AD;
GRANT SELECT ON RECIBOS_CAJA TO TRIGGER RECIBOS_CAJA_CRUCEC_AD;
GRANT SELECT,UPDATE ON SALDOS_DOC_CXPAGAR TO TRIGGER RECIBOS_CAJA_CRUCEC_AD;
GRANT SELECT,UPDATE ON MOVIMIENTO_PROVEEDOR TO TRIGGER RECIBOS_CAJA_CRUCEC_AD;

/* 06-12 error al modificar el pago se perdia el registro de mov_caja */
SET TERM ^ ;

CREATE OR ALTER TRIGGER RECIBOS_CAJA_PAGO_AU FOR RECIBOS_CAJA_PAGO
ACTIVE AFTER UPDATE POSITION 0
as
declare variable Fec date;
declare variable Caja integer;
declare variable Conc VARCHAR(60);
declare variable Pref varchar(4);
declare variable Num varchar(6);
declare variable Existe char(1);
declare variable TIPOCON INTEGER;
declare variable CONS CHAR(1);
declare variable CTABCO INTEGER;
declare variable PREFBCO VARCHAR(4);
declare variable TARJ VARCHAR(3);
declare variable IDCONS INTEGER;
declare variable COMIP NUMERIC(9,2);
declare variable RTFTEP NUMERIC(9,2);
declare variable RTIVAP NUMERIC(9,2);
declare variable RTICAP NUMERIC(9,2);
declare variable COMI NUMERIC(18,2);
declare variable RTFTE NUMERIC(18,2);
declare variable RTIVA NUMERIC(18,2);
declare variable RTICA NUMERIC(18,2);
BEGIN
select reca_fecha, caja_id, reca_conc, pref_pre, reca_numero
    from recibos_caja where reca_id = new.reca_id
    into :Fec, :Caja, :Conc, :Pref, :Num;
if ((OLD.reca_id <> 0) AND (OLD.rcpa_anulado = 'N')) then
    begin
    /* anule la consignación */
    existe = 'N';
    select 'S', cofa_tipodes, cofa_iddes from consolidado_faltantes
        where cofa_tipoori = 61 and cofa_idori = old.reca_id and cofa_itemori = old.rcpa_item
        into :existe, :tipocon, :idcons;
    if (existe = 'S') then
        begin
        if (:tipocon = 71) then
            BEGIN
            DELETE FROM CONSIGNA_DETALLE WHERE CONS_ID = :idcons;
            DELETE FROM CONSIGNA WHERE CONS_ID = :idcons;
            END
        if (:tipocon = 64) then
            BEGIN
            DELETE FROM consigna_tarjetas_det WHERE COTJ_ID = :idcons;
            DELETE FROM consigna_tarjetas WHERE COTJ_ID = :idcons;
            END
        end
    /* Actualice el total del movimiento caja */
    select 'S' from movimiento_caja where moca_tiporef = 61 and moca_idref = new.reca_id into :Existe;
    if (Existe = 'S') then
        update movimiento_caja
            set moca_debitos = moca_debitos - new.rcpa_monto
            where moca_tiporef = 61 and moca_idref = new.reca_id;
    /* BORRE EL DOCUMENTO EN CAJA */
    if (OLD.FOPA_ID <> 1) then
        DELETE FROM DOCUMENTOS_PAGO_CAJA WHERE DPCA_TIPOENT = 61 AND DPCA_IDENT = OLD.RECA_ID AND
            DPCA_BANCO = OLD.RCPA_BANCO AND DPCA_CUENTA = OLD.RCPA_CUENTA AND DPCA_NUMERO = OLD.RCPA_NUMERO;
    ELSE
        EXECUTE PROCEDURE SUME_SALDO_EFECTIVO (:CAJA, :FEC, OLD.RCPA_MONTO, 'S');
    end
if ((new.reca_id <> 0) AND (new.rcpa_anulado = 'N')) then
    begin
    existe = 'N';
    select 'S' from movimiento_caja where moca_tiporef = 61 and moca_idref = new.reca_id into :Existe;
    if (Existe = 'S') then
        update movimiento_caja
            set moca_debitos = moca_debitos + new.rcpa_monto
            where moca_tiporef = 61 and moca_idref = new.reca_id;
    else
        INSERT INTO MOVIMIENTO_CAJA
            (MOCA_ID, CAJA_ID, MOCA_TIPOREF, MOCA_PREFREF, MOCA_NUMREF, MOCA_FECHA, MOCA_CONC, MOCA_DEBITOS, MOCA_CREDITOS, MOCA_DB, MOCA_IDREF)
            VALUES(GEN_ID(id_movcaja,1), :Caja, 61, :Pref, :Num, :Fec, :Conc, NEW.rcpa_monto, 0, 'S', new.reca_id);
                
    /* GRABE EL DOCUMENTO DE PAGO EN CAJA */
    if (NEW.FOPA_ID <> 1) then
        INSERT INTO DOCUMENTOS_PAGO_CAJA (DPCA_ID, FOPA_ID, CAJA_ID, DPCA_BANCO, DPCA_CUENTA, DPCA_NUMERO, DPCA_FECHA, DPCA_MONTO, DPCA_TIPOENT, DPCA_IDENT, DPCA_TIPOSAL, DPCA_IDSAL)
            VALUES (GEN_ID(ID_DOCPAGOCAJA, 1), NEW.FOPA_ID, :CAJA, NEW.RCPA_BANCO, NEW.RCPA_CUENTA, NEW.RCPA_NUMERO, NEW.RCPA_FECHA, NEW.RCPA_MONTO, 61, NEW.RECA_ID, 0, 0);
    ELSE
        EXECUTE PROCEDURE SUME_SALDO_EFECTIVO (:CAJA, :FEC, NEW.RCPA_MONTO, 'N');

    /* SI ES DE CONSIGNACION LA FORMA GRABELA */
    SELECT FOPA_CONSIGNA, FOPA_CTABCO, FOPA_PREFBCO, FOPA_TARJETA FROM FORMAS_PAGO
        WHERE FOPA_ID = NEW.fopa_id INTO :CONS, :CTABCO, :PREFBCO, :TARJ;
    if (CONS = 'S') then
        begin
        if ((TARJ IS NULL) OR (TARJ = '')) then
            BEGIN
            if ((CTABCO <> 0) AND (PREFBCO <> '')) then
                BEGIN
                /* CONSIGNACION */
                IDCONS = GEN_ID(ID_CONSIGNA, 1);
                INSERT INTO CONSIGNA (CONS_ID, CUBA_COD, PRBA_PREF, CONS_NUMERO, CONS_FECHA, CONS_CONCEPTO, CONS_ANULADO, CONS_TRANSMIT, NUMOK)
                    VALUES (:idcons, :ctabco, :prefbco, SUBSTR(NEW.rcpa_numero, 1, 6), :fec, :conc, 'N', 'N', 'N');
                INSERT INTO CONSIGNA_DETALLE (CONS_ID, CODE_ITEM2, FOPA_ID, CODE_BANCO, CODE_CUENTA, CODE_NUMERO, CODE_FECHA, CODE_MONTO, CODE_ANULADO, CODE_TRANSMIT, CAJA_ID)
                    VALUES (:idcons, 1, new.fopa_id, NEW.rcpa_banco, NEW.rcpa_cuenta, NEW.rcpa_numero, NEW.rcpa_fecha, NEW.rcpa_monto, 'N', 'N', :caja);

                insert into consolidado_faltantes (cofa_id, cofa_item, cofa_tipoori, cofa_tipodes, cofa_iddes, cofa_idori, cofa_itemori, cofa_ok, cofa_lista, cofa_unidad)
                    values (gen_id(id_cons, 1), 1, 61, 71, :idcons, new.reca_id, new.rcpa_item, 'N', :ctabco, :prefbco);
                END
            END
        else
            BEGIN
            /* CONSIGNACION DE TARJETA */
            if ((ctabco <> 0) AND (PREFBCO <> '')) then
                BEGIN
            select TARJ_COMIPORC, TARJ_RTFTEPORC, TARJ_RTIVAPORC, TARJ_RTICAPORC FROM TARJETAS WHERE TARJ_COD = :tarj
                INTO :comip, :rtftep, :rtivap, :rticap;
                COMI = (NEW.rcpa_monto-NEW.rcpa_ivamonto) * :comip / 100;
                EXECUTE PROCEDURE REDONDEE (COMI,0) returning_values (COMI);
                RTFTE = (NEW.rcpa_monto-NEW.rcpa_ivamonto) * :rtftep / 100;
                EXECUTE PROCEDURE REDONDEE (RTFTE,0) returning_values (RTFTE);
                RTIVA = NEW.rcpa_ivamonto * :rtivap / 100;
                EXECUTE PROCEDURE REDONDEE (RTIVA,0) returning_values (RTIVA);
                RTICA = (NEW.rcpa_monto-NEW.rcpa_ivamonto) * :rticap / 1000;
                EXECUTE PROCEDURE REDONDEE (RTICA,0) returning_values (RTICA);
                IDCONS = GEN_ID(ID_CONSIGNATAR, 1);
                INSERT INTO CONSIGNA_TARJETAS (COTJ_ID, PREF_PRE, COTJ_NUMERO, COTJ_FECHA, COTJ_CONCEPTO, COTJ_CHEQUE, CUBA_COD,
                    COTJ_MONTO, COTJ_RTFTE, COTJ_COMISION, COTJ_RTIVA, COTJ_RTICA, COTJ_ANULADO, COTJ_TRANSMIT, NUMOK, CAJA_ID)
                    VALUES (:idcons, :prefbco, SUBSTR(NEW.rcpa_numero, 1, 6), :fec, :conc, 'N', :ctabco,
                    new.rcpa_monto-:COMI-:RTFTE-:RTIVA-:RTICA, :rtfte,  :COMI, :rtiva, :rtica, 'N', 'N', 'N', :caja);
                INSERT INTO CONSIGNA_TARJETAS_DET (COTJ_ID, CTJD_ITEM, TARJ_COD, CTJD_NROTJ, CTJD_COMPROB, CTJD_BASE, CTJD_IVA, CTJD_COMIPORC, CTJD_COMIIVA, CTJD_COMIMONTO,
                    CTJD_RTFTEPORC, CTJD_RTFTEMONTO, CTJD_RTIVAPOC, CTJD_RTIVAMONTO, CTJD_ANULADO, CTJD_TRANSMIT, FOPA_ID, CTJD_RTICAPORC, CTJD_RTCAMONTO)
                    VALUES (:idcons, 1, NEW.rcpa_banco, NEW.rcpa_cuenta, NEW.rcpa_numero, new.rcpa_monto, NEW.rcpa_ivamonto, :COMIP, 'N', :comi,
                    :rtftep, :rtfte, :rtivap, :rtiva, 'N', 'N', new.fopa_id, :rticap, :rtica);
                insert into consolidado_faltantes (cofa_id, cofa_item, cofa_tipoori, cofa_tipodes, cofa_iddes, cofa_idori, cofa_itemori, cofa_ok, cofa_lista, cofa_unidad)
                    values (gen_id(id_cons, 1), 1, 61, 64, :idcons, new.reca_id, new.rcpa_item, 'N', :ctabco, :prefbco);
                END
            END
        end /* consignacion */
    end
END
^

SET TERM ; ^



/* 06-13 compras de contado */

INSERT INTO CONFIGURACION (CONF_MODULO, CONF_CATEGORIA, CONF_PROPIEDAD, CONF_VALOR, CONF_POSIBLES, CONF_AYUDA) VALUES ('COMPRAS', 'FACTURAS', 'PREFIJO DEL EGRESO PARA COMPRAS DE CONTADO', '0000', '', 'Indique el prefijo del egrso de caja que se usará para cancelar las compras de contado');

INSERT INTO CONFIGURACION (CONF_MODULO, CONF_CATEGORIA, CONF_PROPIEDAD, CONF_VALOR, CONF_POSIBLES, CONF_AYUDA) VALUES ('COMPRAS', 'FACTURAS', 'NUMERO DE EGRESO IGUAL AL DE FACTURA PARA COMPRAS DE CONTADO', 'NO', 'SI,NO', 'SI: El número del egreso será idéntico al de la factura sin importar la numeración actual de egresos (el prefijo de egresos no puede ser automático). NO:El número de egreso se controla por el consecutivo');
commit work;

/* 06-14 activos fijos */
CREATE TABLE ACTIVOS_FIJOS (
    ACFJ_COD T_COD_ARTICULO NOT NULL,
    ACFJ_DESC T_CONCEPTO,
    ACFJ_FECING DATE,
    ACFJ_FECGAR DATE,
    ACFJ_MODELO T_CONCEPTO,
    ACFJ_MARCA T_CONCEPTO,
    ACFJ_MESDEP SMALLINT,
    ACFJ_DEP T_BOOLEANO,
    ACFJ_ACTIVO T_BOOLEANO);
alter table ACTIVOS_FIJOS
add constraint PK_ACTIVOS_FIJOS
primary key (ACFJ_COD);

ALTER TABLE ACTIVOS_FIJOS
ADD ACFJ_OBS BLOB SUB_TYPE 1 SEGMENT SIZE 80;

/* dev.ventas sobre factura con remision parcial no debe afectar inv. si la dev es para justificar que solo se entrego lo remisionado */ 
SET TERM ^ ;

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

SET TERM ; ^

SET TERM ^ ;

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

SET TERM ; ^


/* 06-16 compras anuales por proveedor */
SET TERM ^ ;

CREATE OR ALTER PROCEDURE COMPRAS_PROVEEDOR_ANO (
    NITDESDE VARCHAR(20),
    NITHASTA VARCHAR(20),
    FECHA DATE,
    ORDEN CHAR(1),
    MASIVA CHAR(1),
    SUBEMPRESA INTEGER)
RETURNS (
    NIT VARCHAR(20),
    MES INTEGER,
    TOTAL NUMERIC(18,2))
AS
DECLARE VARIABLE NITINI VARCHAR(15);
DECLARE VARIABLE NITFIN VARCHAR(15);
DECLARE VARIABLE NOMINI VARCHAR(15);
DECLARE VARIABLE NOMFIN VARCHAR(15);
declare variable FECINI DATE;
DECLARE VARIABLE DTO NUMERIC(18,2);
DECLARE VARIABLE ADICIONAL NUMERIC(18,2);
DECLARE VARIABLE IVA NUMERIC(18,2);
DECLARE VARIABLE EXTRA NUMERIC(18,2);
declare variable DEV NUMERIC(18, 2);
BEGIN
if (ORDEN = 'C') then
    BEGIN
    NITINI = NITDESDE;
    NITFIN = NITHASTA;
    NOMINI = '';
    NOMFIN = 'zz';
    END
ELSE
    BEGIN
    NITINI = NITDESDE;
    NITFIN = NITHASTA;
    NOMINI = '';
    NOMFIN = 'zz';
    END

FECINI = fecha - 365;
FOR SELECT MAX(T.TERC_NIT), MAX(EXTRACT(MONTH FROM FACO_FECHA)),
    SUM(FACO_IVAMONTO), SUM(FACO_TOTAL)
    FROM FACTURAS_COMPRA F, PREFIJOS P, terceros T
    where T.TERC_PROV = 'S' AND T.TERC_NIT >= :NITINI AND T.TERC_NIT <= :NITFIN AND TERC_NOM >= :NOMINI AND TERC_NOM <= :NOMFIN
    AND F.TERC_NIT = T.terc_nit AND FACO_FECHA >= :FECINI AND FACO_FECHA <= :FECHA AND FACO_ANULADO = 'N'
    AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 21 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
    GROUP BY F.terc_nit, EXTRACT(MONTH FROM FACO_FECHA)
    INTO :NIT, :MES, :IVA, :TOTAL
    DO
    BEGIN
    if (TOTAL IS NULL) then
        TOTAL = 0;
    if (IVA IS NULL) then
        IVA = 0;
    if (MASIVA <> 'S') then
        TOTAL = TOTAL - IVA;
    SELECT SUM(DVCO_IVAMONTO), SUM(DVCO_TOTAL)
        FROM DEVOLUCIONES_COMPRAS V, PREFIJOS P
        where V.TERC_NIT = :nit AND DVCO_FECHA >= :FECINI AND DVCO_FECHA <= :FECHA AND DVCO_ANULADO = 'N'
        AND P.PREF_PRE = V.PREF_PRE AND P.TIDO_COD = 24 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
        AND EXTRACT(MONTH FROM DVCO_FECHA) = :MES
        INTO :IVA, :DEV;
    if (DEV IS NULL) then
        DEV = 0;
    if (IVA IS NULL) then
        IVA = 0;
    if (MASIVA <> 'S') then
        DEV = DEV - IVA;
    TOTAL = TOTAL - DEV;
    if (TOTAL <> 0) then
        SUSPEND;
    END
/* AGREGUE LOS TERCEROS SIN COMPRAS */
FOR SELECT MAX(T.TERC_NIT), MAX(EXTRACT(MONTH FROM DVCO_FECHA)),
    SUM(DVCO_DTOMONTO), SUM(DVCO_ADICIONAL), SUM(DVCO_IVAMONTO), SUM(DVCO_EXTRA), SUM(DVCO_TOTAL)
    FROM terceros T, DEVOLUCIONES_COMPRAS V, PREFIJOS P
    where T.TERC_CLIE = 'S' AND T.TERC_NIT >= :NITINI AND T.TERC_NIT <= :NITFIN AND TERC_NOM >= :NOMINI AND TERC_NOM <= :NOMFIN
        AND V.TERC_NIT = T.terc_nit AND DVCO_FECHA >= :FECINI AND DVCO_FECHA <= :FECHA AND DVCO_ANULADO = 'N'
        AND P.PREF_PRE = V.PREF_PRE AND P.TIDO_COD = 24 AND ((P.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
        AND NOT EXISTS (select FACO_ID FROM FACTURAS_COMPRA F, PREFIJOS PR WHERE TERC_NIT = T.terc_nit AND EXTRACT(MONTH FROM FACO_FECHA) = EXTRACT(MONTH FROM DVCO_FECHA) AND FACO_ANULADO = 'N'
        AND PR.PREF_PRE = F.PREF_PRE AND PR.TIDO_COD = 21 AND ((PR.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)))
    GROUP BY V.terc_nit, EXTRACT(MONTH FROM DVCO_FECHA)
    INTO :NIT, :MES, :DTO, :ADICIONAL, :IVA, :EXTRA, :DEV
    DO
    BEGIN
    TOTAL = 0;
    if (DTO IS NULL) then
        DTO = 0;
    if (ADICIONAL IS NULL) then
        ADICIONAL = 0;
    if (IVA IS NULL) then
        IVA = 0;
    if (EXTRA IS NULL) then
        EXTRA = 0;
    if (MASIVA <> 'S') then
        DEV = DEV - EXTRA - IVA - ADICIONAL + DTO;
    TOTAL = TOTAL - DEV;
    if (TOTAL <> 0) then
        SUSPEND;
    END
END
^

CREATE OR ALTER PROCEDURE REP_COMPRAS_PROVEEDOR_ANO (
    NITDESDE VARCHAR(20),
    NITHASTA VARCHAR(20),
    FECHA DATE,
    ORDEN CHAR(1),
    MASIVA CHAR(1),
    SUBEMPRESA INTEGER)
RETURNS (
    NIT VARCHAR(20),
    NOMBRE VARCHAR(60),
    CODGRP VARCHAR(2),
    NOMGRP VARCHAR(60),
    TOTAL1 NUMERIC(18,2),
    TOTAL2 NUMERIC(18,2),
    TOTAL3 NUMERIC(18,2),
    TOTAL4 NUMERIC(18,2),
    TOTAL5 NUMERIC(18,2),
    TOTAL6 NUMERIC(18,2),
    TOTAL7 NUMERIC(18,2),
    TOTAL8 NUMERIC(18,2),
    TOTAL9 NUMERIC(18,2),
    TOTAL10 NUMERIC(18,2),
    TOTAL11 NUMERIC(18,2),
    TOTAL12 NUMERIC(18,2))
AS
declare variable NITN VARCHAR(20);
declare variable TOTAL NUMERIC(18,2);
declare variable MES INTEGER;
BEGIN
NIT = '';
FOR SELECT NIT, MES, TOTAL
    FROM COMPRAS_PROVEEDOR_ANO (:nitdesde, :nithasta, :fecha, :orden, :masiva, :subempresa)
    ORDER BY NIT, MES
    INTO :NITN, :MES, :TOTAL
    DO
    BEGIN
    if (NIT = '') then
        BEGIN
        NIT = NITN;
        TOTAL1 = 0;
        TOTAL2 = 0;
        TOTAL3 = 0;
        TOTAL4 = 0;
        TOTAL5 = 0;
        TOTAL6 = 0;
        TOTAL7 = 0;
        TOTAL8 = 0;
        TOTAL9 = 0;
        TOTAL10 = 0;
        TOTAL11 = 0;
        TOTAL12 = 0;
        END
    if (NIT <> NITN) then
        BEGIN
        SELECT TERC_NOM, P.GRPR_COD, GRPR_NOM FROM TERCEROS T, PROVEEDORES P, grupos_proveedores G
         WHERE T.TERC_NIT = :nit AND T.terc_nit = P.terc_nit AND G.grpr_cod = P.grpr_cod
         INTO :NOMBRE, :CODGRP, :NOMGRP;
        SUSPEND;
        NIT = NITN;
        TOTAL1 = 0;
        TOTAL2 = 0;
        TOTAL3 = 0;
        TOTAL4 = 0;
        TOTAL5 = 0;
        TOTAL6 = 0;
        TOTAL7 = 0;
        TOTAL8 = 0;
        TOTAL9 = 0;
        TOTAL10 = 0;
        TOTAL11 = 0;
        TOTAL12 = 0;
        END
    IF (MES = 1) THEN TOTAL1 = TOTAL;
    IF (MES = 2) THEN TOTAL2 = TOTAL;
    IF (MES = 3) THEN TOTAL3 = TOTAL;
    IF (MES = 4) THEN TOTAL4 = TOTAL;
    IF (MES = 5) THEN TOTAL5 = TOTAL;
    IF (MES = 6) THEN TOTAL6 = TOTAL;
    IF (MES = 7) THEN TOTAL7 = TOTAL;
    IF (MES = 8) THEN TOTAL8 = TOTAL;
    IF (MES = 9) THEN TOTAL9 = TOTAL;
    IF (MES = 10) THEN TOTAL10 = TOTAL;
    IF (MES = 11) THEN TOTAL11 = TOTAL;
    IF (MES = 12) THEN TOTAL12 = TOTAL;
    END
NIT = NITN;
SELECT TERC_NOM FROM TERCEROS WHERE TERC_NIT = :nitn INTO :NOMBRE;
SUSPEND;
END
^


SET TERM ; ^

GRANT EXECUTE ON PROCEDURE REP_COMPRAS_PROVEEDOR_ANO TO PUBLIC;

/* no muestre el articulo con '.' */
SET TERM ^ ;

CREATE OR ALTER PROCEDURE CONSULTA_ARTICULOS_VTAS(
    FECHA DATE,
    INACTIVOS CHAR(1),
    MODULO VARCHAR(20))
RETURNS (
    CODIGO VARCHAR(20),
    DES VARCHAR(60),
    GRUPO VARCHAR(30),
    MARCA VARCHAR(30),
    UNIDAD VARCHAR(8),
    ESTADO VARCHAR(30),
    IVA NUMERIC(9,2),
    EXISTEN NUMERIC(18,4),
    PRECIO NUMERIC(18,2),
    CLASE CHAR(1))
AS
DECLARE VARIABLE LISTA INTEGER;
DECLARE VARIABLE EXIST CHAR(2);
DECLARE VARIABLE SINEXIST CHAR(2);
declare variable DIG INTEGER;
BEGIN
EXISTEN = 0;
EXECUTE PROCEDURE lee_configuracion ('FACTURACION','ARTICULOS', 'VER EXISTENCIA EN CONSULTA ARTICULOS') returning_values (:EXIST);
EXECUTE PROCEDURE lee_configuracion ('FACTURACION','FACTURAS', 'CODIGO DE LA LISTA DE PRECIOS A MOSTRAR EN ARTICULOS') returning_values (:LISTA);
if (modulo = 'FACTURACION') then
  EXECUTE PROCEDURE lee_configuracion ('FACTURACION','ARTICULOS','VER ARTICULOS SIN EXISTENCIA EN CONSULTA DE ARTICULOS') returning_values (:sinexist);
else
  sinexist = 'SI';
EXECUTE PROCEDURE LEE_CONFIGURACION ('FACTURACION', 'ARTICULOS', 'REDONDEO AL MULTIPLO DE DIEZ EN PRECIOS') returning_values (DIG);
if (LISTA > 0) then
    BEGIN
    FOR select a.arti_cod, arti_des, grup_cod, arti_unidad, esar_cod, taiv_porc, marc_cod,arti_clase
        from articulo a, tarifa_iva t
        where a.taiv_cod = t.taiv_cod and a.arti_cod <> '.'
        INTO :CODIGO, :DES, :GRUPO, :UNIDAD, :ESTADO, :IVA, :MARCA, :CLASE
        do
          if ((INACTIVOS = 'S') or (ESTADO = 'A') or ((INACTIVOS = 'C') AND (ESTADO = 'N')) ) then
            begin
            PRECIO = 0;
            SELECT prar_fijo PRECIO FROM precios_articulo WHERE arti_cod = :CODIGO and lipr_cod = :LISTA INTO :PRECIO;
            EXECUTE PROCEDURE redondee(PRECIO, DIG) returning_values (PRECIO);
            if (EXIST = 'SI') then
                BEGIN
                EXECUTE PROCEDURE saldo_total_inventario (:CODIGO, :FECHA) returning_values (:EXISTEN);
                if ((SINEXIST = 'SI')  or (existen <> 0)) then
                    SUSPEND;
                END
            ELSE
                SUSPEND;
            end
    END
ELSE
    FOR select arti_cod, arti_des, grup_cod, arti_unidad, esar_cod, taiv_porc, arti_precio, marc_cod, arti_clase
        from articulo a, tarifa_iva t
        where a.taiv_cod = t.taiv_cod
        INTO :CODIGO, :DES, :GRUPO, :UNIDAD, :ESTADO, :IVA, :PRECIO, :MARCA, :CLASE
        do
          if ((INACTIVOS = 'S') or (ESTADO = 'A') or ((INACTIVOS = 'C') AND (ESTADO = 'N')) ) then
            begin
            if (EXIST = 'SI') then
                BEGIN
                EXECUTE PROCEDURE saldo_total_inventario (:CODIGO, :FECHA) returning_values (:EXISTEN);
                  if ((SINEXIST = 'SI') or (existen <> 0)) then
                    SUSPEND;
                END
            ELSE
                SUSPEND;
            end
END
^

SET TERM ; ^


/* rep. iva compras con tarifas separadas */
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(6),
    FECHA DATE,
    NIT VARCHAR(20),
    NUMPROV VARCHAR(10),
    NOMTERCERO VARCHAR(60),
    SUBTOTAL NUMERIC(18,2),
    DTOMONTO NUMERIC(18,2),
    ADICIONAL NUMERIC(18,2),
    IVAMONTO NUMERIC(18,2),
    CONSUMO NUMERIC(18,2),
    EXENTOS NUMERIC(18,2),
    IVA1 NUMERIC(18,2),
    IVA2 NUMERIC(18,2),
    IVA3 NUMERIC(18,2),
    GRAVADOS1 NUMERIC(18,2),
    GRAVADOS2 NUMERIC(18,2),
    GRAVADOS3 NUMERIC(18,2),
    EXTRA NUMERIC(18,2),
    TOTAL NUMERIC(18,2),
    RTFTEMONTO NUMERIC(18,2),
    RTIVAMONTO NUMERIC(18,2),
    RTICAMONTO 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);
BEGIN
/* FACTURA */
TIPO = 21;
SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 21 INTO :NOMTIPO;

FOR SELECT FACO_ID, PREF_PRE, FACO_NUMERO, FACO_FECHA, TERC_NIT, FACO_ADICIONAL-FACO_DTOMONTO, FACO_IVAMONTO, FACO_RTFTEMONTO, FACO_RTIVAMONTO, FACO_RTICAMONTO, FACO_EXTRA, FACO_TOTAL, FACO_ANULADO, FACO_NUMPROV
    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, :EXTRA, :TOTAL, :ANULADO, :numprov
    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
        if ((ANULADOS = 'S') or (ANULADO = 'N')) then
            BEGIN
            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;
              END
            ELSE
              BEGIN
              SELECT SUM(FCDE_TOTAL - FCDE_IVAMONTO - FCDE_CONSUMO) FROM FACTURAS_COMPRAS_DETALLE D WHERE FACO_ID = :ID AND FCDE_IVAPORC = 0 INTO :EXENTOS;
              SELECT SUM(FCDE_TOTAL - FCDE_IVAMONTO - FCDE_CONSUMO), SUM(FCDE_IVAMONTO) FROM FACTURAS_COMPRAS_DETALLE D, TARIFA_IVA T WHERE FACO_ID = :ID AND FCDE_IVAPORC = TAIV_PORC AND TAIV_COD = 1 INTO :GRAVADOS1, :IVA1;
              SELECT SUM(FCDE_TOTAL - FCDE_IVAMONTO - FCDE_CONSUMO), SUM(FCDE_IVAMONTO) FROM FACTURAS_COMPRAS_DETALLE D, TARIFA_IVA T WHERE FACO_ID = :ID AND FCDE_IVAPORC = TAIV_PORC AND TAIV_COD = 2 INTO :GRAVADOS2, :IVA2;
              SELECT SUM(FCDE_TOTAL - FCDE_IVAMONTO - FCDE_CONSUMO), SUM(FCDE_IVAMONTO) FROM FACTURAS_COMPRAS_DETALLE D, TARIFA_IVA T WHERE FACO_ID = :ID AND FCDE_IVAPORC = TAIV_PORC AND TAIV_COD = 3 INTO :GRAVADOS3, :IVA3;

              SELECT SUM(FCDE_CONSUMO) FROM FACTURAS_COMPRAS_DETALLE WHERE FACO_ID = :ID INTO :CONSUMO;
              SUBTOTAL = TOTAL - EXTRA - IVAMONTO - DTOMONTO;
              NETO = TOTAL - RTFTEMONTO - RTIVAMONTO - RTICAMONTO;
              END
            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, TERC_NIT, DVCO_ADICIONAL-DVCO_DTOMONTO, DVCO_IVAMONTO, DVCO_RTFTEMONTO, DVCO_RTIVAMONTO, DVCO_RTICAMONTO, DVCO_EXTRA, DVCO_TOTAL, DVCO_ANULADO, ''
    FROM DEVOLUCIONES_COMPRAS
    WHERE DVCO_FECHA >= :FECINI AND DVCO_FECHA <= :FECFIN ORDER BY DVCO_FECHA, PREF_PRE, DVCO_NUMERO
    INTO :ID, :PREF, :NUMERO, :FECHA, :NIT, :DTOMONTO, :IVAMONTO, :RTFTEMONTO, :RTIVAMONTO, :RTICAMONTO, :EXTRA, :TOTAL, :ANULADO, :numprov
    DO
    BEGIN
    if ((PREFIJO = '') or (PREFIJO IS NULL) or (PREF = PREFIJO)) then
        if ((ANULADOS = 'S') or (ANULADO = 'N')) then
            BEGIN
            SELECT TERC_NOM, TERC_EXENTO FROM TERCEROS WHERE TERC_NIT = :NIT INTO :NOMTERCERO, :TER_EXENTO;
            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;
             END
            ELSE
             BEGIN
              DTOMONTO = DTOMONTO * -1;
              ADICIONAL = ADICIONAL * -1;
              IVAMONTO = IVAMONTO * -1;
              EXTRA = EXTRA * -1;
              TOTAL = TOTAL * -1;
              RTFTEMONTO = RTFTEMONTO * -1;
              RTIVAMONTO = RTIVAMONTO * -1;
              RTICAMONTO = RTICAMONTO * -1;
              /* CALCULE LAS DIFERENTES TARIFAS */
               SELECT SUM(DVCD_TOTAL - DVCD_IVAMONTO - DVCD_CONSUMO) FROM DEVOLUCIONES_COMPRAS_DET D WHERE DVCO_ID = :ID AND DVCD_IVAPORC = 0 INTO :EXENTOS;
               SELECT SUM(DVCD_TOTAL - DVCD_IVAMONTO - DVCD_CONSUMO), SUM(DVCD_IVAMONTO) FROM DEVOLUCIONES_COMPRAS_DET D, TARIFA_IVA T WHERE DVCO_ID = :ID AND DVCD_IVAPORC = TAIV_PORC AND TAIV_COD = 1 INTO :GRAVADOS1, :IVA1;
               SELECT SUM(DVCD_TOTAL - DVCD_IVAMONTO - DVCD_CONSUMO), SUM(DVCD_IVAMONTO) FROM DEVOLUCIONES_COMPRAS_DET D, TARIFA_IVA T WHERE DVCO_ID = :ID AND DVCD_IVAPORC = TAIV_PORC AND TAIV_COD = 2 INTO :GRAVADOS2, :IVA2;
               SELECT SUM(DVCD_TOTAL - DVCD_IVAMONTO - DVCD_CONSUMO), SUM(DVCD_IVAMONTO) FROM DEVOLUCIONES_COMPRAS_DET D, TARIFA_IVA T WHERE DVCO_ID = :ID AND DVCD_IVAPORC = TAIV_PORC AND TAIV_COD = 3 INTO :GRAVADOS3, :IVA3;

              SELECT SUM(DVCD_CONSUMO) FROM DEVOLUCIONES_COMPRAS_DET WHERE DVCO_ID = :ID INTO :CONSUMO;
              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;
              SUBTOTAL = TOTAL - EXTRA - IVAMONTO - DTOMONTO;
              NETO = TOTAL - RTFTEMONTO - RTIVAMONTO - RTICAMONTO;
             END
            SUSPEND;
            END
    END

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, 0, NCPR_MONTO + NCPR_IVAMONTO, NCPR_ANULADO, ''
       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, :EXTRA, :TOTAL, :ANULADO, :numprov
       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
          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;
           END
          ELSE
           BEGIN
            GRAVADOS2 = 0;
            GRAVADOS3 = 0;
            CONSUMO = 0;
            if (IVAMONTO <> 0) then
                BEGIN
                GRAVADOS1 = TOTAL-IVAMONTO;
                IVA1 = IVAMONTO;
                exentos = 0;
                END
            ELSE
                BEGIN
                GRAVADOS1 = 0;
                exentos = TOTAL;
                END
            SUBTOTAL = TOTAL - EXTRA - IVAMONTO - DTOMONTO;
            NETO = TOTAL - RTFTEMONTO - RTIVAMONTO - RTICAMONTO;
           END
         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, 0, NDPR_MONTO + NDPR_IVAMONTO, NDPR_ANULADO, NDPR_NUMPROV 
       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, :EXTRA, :TOTAL, :ANULADO, :numprov
       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

          GRAVADOS2 = 0;
          GRAVADOS3 = 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;
           END
          ELSE
           BEGIN
            DTOMONTO = DTOMONTO * -1;
            ADICIONAL = ADICIONAL * -1;
            IVAMONTO = IVAMONTO * -1;
            EXTRA = EXTRA * -1;
            TOTAL = TOTAL * -1;
            RTFTEMONTO = RTFTEMONTO * -1;
            RTIVAMONTO = RTIVAMONTO * -1;
            RTICAMONTO = RTICAMONTO * -1;
            if (IVAMONTO <> 0) then
                BEGIN
                GRAVADOS1 = TOTAL-IVAMONTO;
                IVA1 = IVAMONTO;
                exentos = 0;
                END
            ELSE
                BEGIN
                GRAVADOS1 = 0;
                exentos = TOTAL;
                END
            SUBTOTAL = TOTAL - EXTRA - IVAMONTO - DTOMONTO;
            NETO = TOTAL - RTFTEMONTO - RTIVAMONTO - RTICAMONTO;
           END
         suspend;
         END
       END
    END
END
^

SET TERM ; ^



/* 06-16 egresos caja no repone el doc. al anula rpor error en tipo_docsal */
SET TERM ^ ;

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

SET TERM ; ^


/* busqueda de artculos del proveedor con sugerido para ordenes */
SET TERM ^ ;

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

SET TERM ; ^



/* rotulos con cantidad y rango */ 
SET TERM ^ ;

CREATE OR ALTER PROCEDURE IMPR_ARTICULO(
    CODINI VARCHAR(20),
    CODFIN VARCHAR(20),
    CANT integer)
RETURNS (
    ARTICULO VARCHAR(15),
    DESCRIPCION VARCHAR(60),
    PRECIO NUMERIC(18,2),
    CODGRP VARCHAR(2),
    NOMGRP VARCHAR(30),
    COSUBG VARCHAR(3),
    NOMSUBG VARCHAR(30),
    CODMARC VARCHAR(3),
    NOMMARC VARCHAR(30),
    PESO NUMERIC(18,4),
    PUM NUMERIC(18,2),
    LISTA INTEGER,
    NOMLISTA VARCHAR(30),
    FECHA DATE)
AS
declare variable I INTEGER;
begin
EXECUTE PROCEDURE lee_configuracion('FACTURACION', 'FACTURAS', 'CODIGO DE LA LISTA DE PRECIOS A MOSTRAR EN ARTICULOS') returning_values (LISTA);
for select a.arti_cod, arti_des, a.grup_cod, a.subg_cod, a.marc_cod, arti_peso, p.lipr_cod, p.prar_fijo, grup_nom, lipr_nom
    from articulo a, precios_articulo p, grupo g, lista_precios l
    where a.arti_cod = p.arti_cod and a.grup_cod = g.grup_cod and l.lipr_cod = p.lipr_cod AND a.arti_cod >= :codini AND a.arti_cod <= :codfin AND P.lipr_cod = :LISTA
    into :articulo, :descripcion, :codgrp, :cosubg, :codmarc, :peso, :lista, :precio, :nomgrp, :nomlista
    do
    begin
    if (cosubg <> '') then
        select subg_nom from subgrupo where grup_cod = :codgrp and subg_cod = :cosubg into :nomsubg;
    if (codmarc <> '') then
        select marc_nom from marcas where marc_cod = :codmarc into :nommarc;
    if ((PESO <> 0) AND (PESO IS NOT NULL)) then
        PUM = PRECIO / PESO;
    ELSE
        PUM = 0;
    SELECT MAX(AUDI_FECHA) FROM AUDITORIA WHERE TIDO_COD = 126 AND AUDI_COD = :articulo AND AUDI_OPER <> 'D' INTO :fecha;
    if (cant = 0) then
        execute procedure saldo_total_inventario(:articulo, cast('now' as DATE)) returning_values (CANT);
    I = 1;
    WHILE (I < CANT) DO
        BEGIN
        SUSPEND;
        I = I + 1;
        END
    end
end
^

SET TERM ; ^


/* CONCILIACION VENTAS CON IMPUESTOS INCLUIDOS NO RESTABA EL IVA */
SET TERM ^ ;

CREATE OR ALTER PROCEDURE CONCILIA_VENTAS(
    FECINI DATE,
    FECFIN DATE,
    CTAEXE VARCHAR(20),
    CTAGRA VARCHAR(20),
    CTAOTRO VARCHAR(20))
RETURNS (
    IDF INTEGER,
    IDC INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    TARIFA0 NUMERIC(18,2),
    TARIFA0C NUMERIC(18,2),
    TARIFA1 NUMERIC(18,2),
    TARIFA1C NUMERIC(18,2),
    TARIFA2 NUMERIC(18,2),
    TARIFA2C NUMERIC(18,2))
AS
declare variable iva1 numeric(18,2);
declare variable iva2 numeric(18,2);
declare variable IVAINC CHAR(1);
begin
for select fact_id, pref_pre, fact_numero, enco_consec, FACT_IVAINC from facturas f, comprobante_encabezado c
    where fact_fecha >= :fecini and fact_fecha <= :fecfin and fact_id = enco_idref and enco_tiporef = 31
    into :idf, :pref, :numero, :idc, :IVAINC
    do
    begin
    tarifa0 = 0;
    tarifa1 = 0;
    tarifa2 = 0;
    tarifa0c = 0;
    tarifa1c = 0;
    tarifa2c = 0;
    select SUM(CAST(FADE_CANT AS DOUBLE PRECISION) * (FADE_PRUNIT-FADE_DTOMONTO))
        FROM FACTURAS_DETALLE WHERE FACT_ID = :idf and fade_ivaporc = 0 into :tarifa0;
    select SUM(CAST(FADE_CANT AS DOUBLE PRECISION) * (FADE_PRUNIT-FADE_DTOMONTO)), sum(FADE_IVAMONTO)
        FROM FACTURAS_DETALLE WHERE FACT_ID = :idf and fade_ivaporc = 16 into :tarifa1, :IVA1;
    select SUM(CAST(FADE_CANT AS DOUBLE PRECISION) * (FADE_PRUNIT-FADE_DTOMONTO)), sum(FADE_IVAMONTO)
        FROM FACTURAS_DETALLE WHERE FACT_ID = :idf and fade_ivaporc <> 16 and fade_ivaporc <> 0 into :tarifa2, :IVA2;
    if (IVAINC = 'S') then
        BEGIN
        if (IVA1 IS NULL) then
            IVA1 = 0;
        if (IVA2 IS NULL) then
            IVA2 = 0;
        TARIFA1 = TARIFA1 - IVA1;
        TARIFA2 = TARIFA2 - IVA2;
        END
    select code_debito - code_credito from comprobante_detalle where enco_consec = :idc and cuen_cod = :ctaexe into tarifa0c;
    select code_debito - code_credito from comprobante_detalle where enco_consec = :idc and cuen_cod = :ctagra into tarifa1c;
    select code_debito - code_credito from comprobante_detalle where enco_consec = :idc and cuen_cod = :ctaotro into tarifa2c;
    suspend;
    end
end
^

SET TERM ; ^


SET TERM ^ ;

CREATE OR ALTER PROCEDURE CONCILIA_DEVVENTAS(
    FECINI DATE,
    FECFIN DATE,
    CTAEXE VARCHAR(20),
    CTAGRA VARCHAR(20),
    CTAOTRO VARCHAR(20))
RETURNS (
    IDF INTEGER,
    IDC INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    TARIFA0 NUMERIC(18,2),
    TARIFA0C NUMERIC(18,2),
    TARIFA1 NUMERIC(18,2),
    TARIFA1C NUMERIC(18,2),
    TARIFA2 NUMERIC(18,2),
    TARIFA2C NUMERIC(18,2))
AS
declare variable iva1 numeric(18,2);
declare variable iva2 numeric(18,2);
declare variable IVAINC CHAR(1);
begin
for select devt_id, pref_pre, devt_numero, enco_consec, devt_ivainc from devoluciones_ventas f, comprobante_encabezado c
    where devt_fecha >= :fecini and devt_fecha <= :fecfin and devt_id = enco_idref and enco_tiporef = 33
    into :idf, :pref, :numero, :idc, :ivainc
    do
    begin
    tarifa0 = 0;
    tarifa1 = 0;
    tarifa2 = 0;
    tarifa0c = 0;
    tarifa1c = 0;
    tarifa2c = 0;
    select SUM(CAST(DVDE_CANT AS DOUBLE PRECISION) * (DVDE_PRUNIT-DVDE_DTOMONTO))
        FROM DEVOLUCIONES_VENTAS_DETALLE WHERE DEVT_ID = :idf and dvde_ivaporc = 0 into :tarifa0;
    select SUM(CAST(DVDE_CANT AS DOUBLE PRECISION) * (DVDE_PRUNIT-DVDE_DTOMONTO)), sum(DVDE_IVAMONTO)
        FROM DEVOLUCIONES_VENTAS_DETALLE WHERE DEVT_ID = :idf and dvde_ivaporc = 16 into :tarifa1, :iva1;
    select SUM(CAST(DVDE_CANT AS DOUBLE PRECISION) * (DVDE_PRUNIT-DVDE_DTOMONTO)), SUM(DVDE_IVAMONTO)
        FROM DEVOLUCIONES_VENTAS_DETALLE WHERE DEVT_ID = :idf and dvde_ivaporc <> 16 and dvde_ivaporc <> 0 into :tarifa2, :iva2;
    if (IVAINC = 'S') then
        BEGIN
        if (IVA1 IS NULL) then
            IVA1 = 0;
        if (IVA2 IS NULL) then
            IVA2 = 0;
        TARIFA1 = TARIFA1 - IVA1;
        TARIFA2 = TARIFA2 - IVA2;
        END
    select sum(code_debito - code_credito) from comprobante_detalle where enco_consec = :idc and cuen_cod = :ctaexe into tarifa0c;
    select sum(code_debito - code_credito) from comprobante_detalle where enco_consec = :idc and cuen_cod = :ctagra into tarifa1c;
    select sum(code_debito - code_credito) from comprobante_detalle where enco_consec = :idc and cuen_cod = :ctaotro into tarifa2c;
    suspend;
    end
end
^

SET TERM ; ^


/* 20080618 dev faltante en ventas con factura-remision */
SET TERM ^ ;

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

SET TERM ; ^


SET TERM ^ ;

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

SET TERM ; ^


/* observaciones del cliente en pantalla al facturar */
INSERT INTO CONFIGURACION (CONF_MODULO, CONF_CATEGORIA, CONF_PROPIEDAD, CONF_VALOR, CONF_POSIBLES, CONF_AYUDA) VALUES ('FACTURACION', 'FACTURAS', 'MOSTRAR OBSERVACIONES DEL CLIENTE AL LLAMARLO EN LA FACTURA', 'NO', 'SI,NO', 'SI:Al digitar el cliente se MUESTRAN las observacions de la factura las observaciones del cliente');
commit work;

/* error en revision de precios */
SET TERM ^ ;

CREATE OR ALTER PROCEDURE REVISA_PRECIOS(
    LISTA INTEGER,
    FECHA DATE)
RETURNS (
    ARTICULO VARCHAR(20),
    DESCR VARCHAR(60),
    FIJO NUMERIC(18,2),
    UNIDAD VARCHAR(8),
    PORC NUMERIC(9,4),
    SUGERIDO NUMERIC(18,2),
    DIFER NUMERIC(18,2))
AS
declare variable marg numeric(9,4);
declare variable UOM VARCHAR(10);
declare variable BASE VARCHAR(10);
declare variable CAMBIO VARCHAR(10);
declare variable COSTO numeric(18,2);
declare variable COSTOP numeric(18,2);
declare variable COSTOU numeric(18,2);
declare variable DIFMAX numeric(18,2);
declare variable DIG INTEGER;
declare variable TARIVA NUMERIC(9,4);
declare variable IVAINC CHAR(1);
declare variable LISTAREF INTEGER;
begin
execute procedure lee_configuracion ('FACTURACION', 'ARTICULOS', 'SUGERIR PRECIOS CON PORCENTAJE DE MARGEN O UTILIDAD') returning_values (:UOM);
EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION', 'ARTICULOS', 'REDONDEO AL MULTIPLO DE DIEZ EN PRECIOS') RETURNING_VALUES (:DIG);
EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION','ARTICULOS','CAMBIO DE PRECIOS AUTOMATICO AL CAMBIAR COSTO O PRECIO') returning_values (CAMBIO);
EXECUTE PROCEDURE lee_configuracion('FACTURACION','ARTICULOS','COSTO BASE PARA CALCULO DE PRECIOS DE VENTA AUTOMATICOS') returning_values (:BASE);
EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION','ARTICULOS','CODIGO DE LA LISTA DE PRECIOS BASE PARA CAMBIO DE PRECIOS AUTOMATICO') returning_values (LISTAREF);
EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION','ARTICULOS','DIFERENCIA EN PESOS MAXIMA A PERMITIR PARA CAMBIAR PRECIOS') returning_values (DIFMAX);
for select A.arti_cod, A.arti_des, A.arti_unidad, prar_fijo, prar_margen, prar_util, TAIV_PORC
    from precios_articulo p, articulo a, tarifa_iva T
    where a.arti_cod = p.arti_cod and lipr_cod = :lista and a.taiv_cod = t.taiv_cod order by A.arti_cod
    into :articulo, descr, :unidad, :fijo, :marg, :porc, :tariva
    do
    begin
    if (UOM <> 'UTILIDAD') then
        PORC = MARG;
    if (CAMBIO = 'COSTO') then
        BEGIN
        EXECUTE PROCEDURE COSTO_PROMEDIO (:ARTICULO, :FECHA) RETURNING_VALUES(:COSTOP);
        EXECUTE PROCEDURE ULTIMO_COSTO (:ARTICULO, :FECHA, :UNIDAD) RETURNING_VALUES(:COSTOU);
        if (base = 'ULTIMO') then
            COSTO = COSTOU;
        ELSE
            BEGIN
            COSTO = COSTOP;
            if (base = 'MAYOR') then
                if (COSTOP < COSTOU) then
                    COSTO = COSTOU;
            END
        SELECT LIPR_MODIF FROM LISTA_PRECIOS WHERE LIPR_COD = :lista INTO :IVAINC;
        if (IVAINC = 'S') then
            COSTO = COSTO * (1 + TARIVA/100);
        if (UOM = 'UTILIDAD') then
            SUGERIDO = COSTO * (1 + :PORC/100);
        ELSE
            SUGERIDO = COSTO / (1 - :PORC/100);
        END
    ELSE
        if (LISTA <> LISTAREF) then
            BEGIN
            SELECT PRAR_FIJO FROM PRECIOS_ARTICULO WHERE ARTI_COD = :articulo AND LIPR_COD = :LISTAREF INTO :SUGERIDO;
            if (IVAINC = 'S') then
                SUGERIDO = SUGERIDO / (1 + TARIVA/100);
            if (UOM = 'UTILIDAD') then
                SUGERIDO = SUGERIDO * (1 + :PORC/100);
            ELSE
                SUGERIDO = SUGERIDO / (1 - :PORC/100);
            END
    EXECUTE PROCEDURE REDONDEE (SUGERIDO, DIG) returning_values (SUGERIDO);
    DIFER = SUGERIDO - FIJO;
    if ((DIFER > DIFMAX) and (sugerido <> 0)) then
        suspend;
    end
end
^

SET TERM ; ^


/* actualizar costos de la remision al facturar en compras */
SET TERM ^ ;

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

        if (COSTO > 0 ) then
         BEGIN
          /* ACTUALICE EL COSTO POR PROVEEDOR */
          SELECT PVAR_FECHA FROM PROVEEDOR_ARTICULO
            WHERE TERC_NIT = :Nit AND ARTI_COD = NEW.ARTI_COD
            INTO :FECAUX;
          if (FECAUX IS NULL) then
            INSERT INTO PROVEEDOR_ARTICULO (TERC_NIT, ARTI_COD, PVAR_COSTO, PVAR_FECHA, PVAR_COD,PVAR_DES)
                VALUES (:Nit, NEW.ARTI_COD, :COSTO, :fec, NEW.fcde_codprov,NEW.fcde_desc);
          else
            UPDATE PROVEEDOR_ARTICULO
                SET PVAR_COSTO = :COSTO, PVAR_FECHA = :fec, PVAR_COD = NEW.fcde_codprov
                WHERE ARTI_COD = NEW.ARTI_COD AND TERC_NIT = :Nit;
         END
        /* RECORRA LAS LISTAS DE PRECIOS Y CAMBIE EL PRECIO */
        EXECUTE PROCEDURE CALCULA_PRECIOS(NEW.ARTI_COD, :FEC);
        END /* AFECTAR INV */
    EXECUTE PROCEDURE lee_configuracion('COMPRAS', 'FACTURAS', 'ACTUALIZAR COSTOS DE LA REMISION RELACIONADA AL GRABAR LA FACTURA') returning_values (:ACTREM);
    if ((ACTREM = 'SI') and (Tipo = 22)) then
        BEGIN
        numrows = 0;
        select mvar_cons, MVAR_ITEM, MVAR_FECHA, MVAR_IDREF, MVAR_CANT, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO
            from movimiento_articulo M, consolidado_faltantes C
            where C.cofa_id = :CONSOLIDA AND mvar_tipodoc = 22 and mvar_idref = C.cofa_idori AND C.cofa_tipoori = 22 and m.arti_cod = new.arti_cod
            into :numrows, :iterem, :fecrem, :idrem, :cantrem, :loterem, :prefrem, :numrem;
        
        if (numrows <> 0) then
            BEGIN
            DELETE FROM MOVIMIENTO_ARTICULO WHERE MVAR_CONS = :numrows;
            INSERT INTO MOVIMIENTO_ARTICULO
                (ARTI_COD, MVAR_CONS, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM, TERC_NIT)
                VALUES(NEW.ARTI_COD, GEN_ID(ID_MOVARTI,1), NEW.BODE_COD, :fecrem, 22, :idrem,
                :CONC, :cantrem, :costo, 'S', :loterem, :prefrem, :numrem, :iterem, :Nit);
        
            if (COSTO > 0 ) then
                BEGIN
                /* ACTUALICE EL COSTO POR PROVEEDOR */
                SELECT PVAR_FECHA FROM PROVEEDOR_ARTICULO
                    WHERE TERC_NIT = :Nit AND ARTI_COD = NEW.ARTI_COD
                    INTO :FECAUX;
                if (FECAUX IS NULL) then
                    INSERT INTO PROVEEDOR_ARTICULO (TERC_NIT, ARTI_COD, PVAR_COSTO, PVAR_FECHA, PVAR_COD,PVAR_DES)
                        VALUES (:Nit, NEW.ARTI_COD, :COSTO, :fec, NEW.fcde_codprov,NEW.fcde_desc);
                else
                    UPDATE PROVEEDOR_ARTICULO
                        SET PVAR_COSTO = :COSTO, PVAR_FECHA = :fec, PVAR_COD = NEW.fcde_codprov
                        WHERE ARTI_COD = NEW.ARTI_COD AND TERC_NIT = :Nit;
                END
            /* RECORRA LAS LISTAS DE PRECIOS Y CAMBIE EL PRECIO */
            EXECUTE PROCEDURE CALCULA_PRECIOS(NEW.ARTI_COD, :FEC);
            END
        END

    /* ACTUALICE EL PENDIENTE  */
    if (CONSOLIDA <> 0) then
        BEGIN
        UPDATE consolidado_faltantes SET COFA_OK = 'S' WHERE COFA_ID = :consolida AND COFA_ITEM = NEW.FCDE_ITEM AND ARTI_COD = NEW.arti_cod;
        EXECUTE procedure LEE_CONFIGURACION ('COMPRAS','DOCUMENTOS','SUMAR CANTIDADES PENDIENTES AL CONSOLIDAR DOCUMENTOS') returning_values (CONSO);
        /* IGNORE LA CONSOLIDACION SI SE VALIDAN CODIGOS DE LA ORDEN */
        SELECT MIN(CEFA_TIPOORI) FROM consolide_faltantes WHERE CEFA_ID = :CONSOLIDA INTO :NUMROWS;
        if (NUMROWS = 23) then
            BEGIN
            EXECUTE PROCEDURE LEE_CONFIGURACION('COMPRAS', 'FACTURAS', 'VERIFICAR CODIGOS DE LA ORDEN') returning_values (MENORV);
            if (MENORV = 'SI') then
                CONSO = 'NO';
            END
        SELECT COUNT(CEFA_ITEM) FROM consolide_faltantes WHERE CEFA_ID = :CONSOLIDA INTO :NUMROWS;
        if ((CONSO = 'SI') AND (NUMROWS > 1)) then
            UPDATE consolidado_faltantes SET COFA_IDDES = NEW.faco_id, COFA_OK = 'S' WHERE COFA_ID = :consolida;
        else
            BEGIN
            /* BUSQUE EL CONSOLIDADO EN EL MISMO ITEM Y SI ES DIFERENTE ACTUALICELO */
            select COFA_CANT * COFA_FACTOR FROM consolidado_faltantes WHERE COFA_ID = :consolida AND COFA_ITEM = NEW.FCDE_ITEM AND ARTI_COD = NEW.arti_cod INTO :CANTREL;
            if (NEW.FCDE_CANT * NEW.FCDE_FACTOR < CANTREL) then
                UPDATE consolidado_faltantes SET COFA_IDDES = NEW.faco_id, COFA_CANT = NEW.FCDE_CANT, COFA_FACTOR = NEW.FCDE_FACTOR
                    WHERE COFA_ID = :consolida AND COFA_ITEM = NEW.FCDE_ITEM AND ARTI_COD = NEW.arti_cod;
            END
        END
    END
END
^

SET TERM ; ^


SET TERM ^ ;

CREATE OR ALTER TRIGGER FACTCOMP_DETALLE_AU FOR FACTURAS_COMPRAS_DETALLE
ACTIVE AFTER UPDATE POSITION 0
as
declare variable fec date;
declare variable fecaux date;
declare variable AUX varchar(90);
declare variable CONC VARCHAR(60);
declare variable Pref varchar(4);
declare variable Num varchar(6);
declare variable Nit varchar(20);
declare variable factor numeric(18,4);
declare variable TIPO INTEGER;
declare variable INVFAC CHAR(2);
declare variable IVAINC CHAR(2);
declare variable COSTO NUMERIC(18,2);
declare variable CANTREL NUMERIC(18,4);
declare variable NUMPROV VARCHAR(10);
declare variable NUMPED VARCHAR(30);
declare variable NUMREM VARCHAR(30);
declare variable CONSO VARCHAR(2);
declare variable CONSOLIDA INTEGER;
declare variable NUMROWS INTEGER;
declare variable DTOPIE NUMERIC(18,2);
declare variable ADICIONAL NUMERIC(18,2);
declare variable TOTAL NUMERIC(18,2);
declare variable IVAMONTO NUMERIC(18,2);
declare variable EXTRA NUMERIC(18,2);
declare variable FACT NUMERIC(18,4);
declare variable MENORV CHAR(2);
declare variable ACTREM CHAR(2);
declare variable FECREM date;
declare variable IDREM INTEGER;
declare variable ITEREM INTEGER;
declare variable CANTREM NUMERIC(18,4);
declare variable LOTEREM VARCHAR(15);
declare variable PREFREM CHAR(4);
BEGIN
if (old.fcde_devuelto = new.fcde_devuelto) then
    begin
    /* deshaga lo viejo */
    if ((old.fcde_anulado = 'N') and (OLD.faco_id <> 0)) then
        begin
        select faco_fecha, faco_consolida from facturas_compra where faco_id = old.faco_id into :fec, :consolida;
        DELETE FROM MOVIMIENTO_ARTICULO WHERE (mvar_tipodoc = 21) and (mvar_idref = old.faco_id) and (mvar_item = old.fcde_item);
        /* RECORRA LAS LISTAS DE PRECIOS Y CAMBIE EL PRECIO */
        EXECUTE PROCEDURE CALCULA_PRECIOS(old.ARTI_COD, :FEC);
        /* LOS PENDIENTES */
        if (CONSOLIDA <> 0) then
            BEGIN
            UPDATE consolidado_faltantes SET COFA_OK = 'N' WHERE COFA_ID = :consolida AND COFA_ITEM = old.FCDE_ITEM AND ARTI_COD = old.arti_cod;
            SELECT COUNT(CEFA_ITEM) FROM consolide_faltantes WHERE CEFA_ID = :CONSOLIDA INTO :NUMROWS;
            EXECUTE procedure LEE_CONFIGURACION ('COMPRAS','DOCUMENTOS','SUMAR CANTIDADES PENDIENTES AL CONSOLIDAR DOCUMENTOS') returning_values (CONSO);
            /* IGNORE LA CONSOLIDACION SI SE VALIDAN CODIGOS DE LA ORDEN */
            SELECT MIN(CEFA_TIPOORI) FROM consolide_faltantes WHERE CEFA_ID = :CONSOLIDA INTO :NUMROWS;
            if (NUMROWS = 23) then
                BEGIN
                EXECUTE PROCEDURE LEE_CONFIGURACION('COMPRAS', 'FACTURAS', 'VERIFICAR CODIGOS DE LA ORDEN') returning_values (MENORV);
                if (MENORV = 'SI') then
                    CONSO = 'NO';
                END
            if (CONSO = 'SI') then
                UPDATE consolidado_faltantes SET COFA_OK = 'N' WHERE COFA_ID = :consolida;
            END
        end
    /* Registre el nuevo */
    if ((new.fcde_anulado = 'N') and (new.faco_id <> 0)) then
        BEGIN
        select faco_fecha, pref_pre, faco_numero, terc_nit, faco_imptos, faco_numprov, faco_remision, faco_orden, faco_consolida, faco_dtomonto, faco_adicional, faco_total, faco_ivamonto, faco_extra
            from facturas_compra where faco_id = new.faco_id
            into :fec, :Pref, :Num, :Nit, :ivainc, :numprov, :numrem, :numped, :consolida, :dtopie, :adicional, :total, :ivamonto, :extra;
        conc = 'FACTURA DE COMPRA No.' || PREF || NUM || '-' || NUMPROV;
        if (NUMREM <> '') then
            BEGIN
            AUX = SUBSTR(NUMREM, 1, 15);
            conc = conc || '-REM:' || AUX;
            END
        else
            if (NUMPED <> '') then
                BEGIN
                AUX = SUBSTR(NUMPED, 1, 15);
                conc = conc || '-ORDEN ' || AUX;
                END
        SELECT MAX(CEFA_TIPOORI) FROM consolide_faltantes WHERE CEFA_ID = :CONSOLIDA INTO :TIPO;
        if (Tipo is null) then
            Tipo = 0;
        execute procedure lee_configuracion('COMPRAS', 'FACTURAS', 'AFECTAR INVENTARIO CON LA FACTURA') returning_values (:INVFAC);
        /* si se hizo con base en una remision no afecte inventario */
        if ((Tipo <> 22) and (INVFAC = 'SI')) then
            begin
            execute procedure factor_unidad_cant(new.arti_cod, new.fcde_unidad) returning_values(factor);
            COSTO = ((new.fcde_prunit - NEW.fcde_dtomonto) / :factor);
            if (IVAINC = 'S') then
                COSTO = COSTO / (1 + NEW.fcde_ivaporc/100);
            EXECUTE PROCEDURE lee_configuracion('COMPRAS','FACTURAS','DESCUENTO Y VALOR ADICIONAL DEL DOCUMENTO COMO MENOR VALOR DEL COSTO') returning_values (:MENORV);
            if (MENORV = 'SI') then
                BEGIN
                FACT = (TOTAL - EXTRA - IVAMONTO);
                if ((FACT - ADICIONAL + DTOPIE) <> 0) then
                    FACT = FACT / (FACT - ADICIONAL + DTOPIE);
                ELSE
                    FACT = 1;
                COSTO = COSTO * FACT;
                END
            INSERT INTO MOVIMIENTO_ARTICULO
                (ARTI_COD, MVAR_CONS, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM, TERC_NIT)
                VALUES(NEW.ARTI_COD, GEN_ID(ID_MOVARTI,1), NEW.BODE_COD, :FEC, 21, NEW.faco_id,
                :CONC, :factor * new.fcde_cant, :COSTO, 'S', new.fcde_lote, :Pref, :Num, NEW.fcde_item, :Nit);
            if (COSTO > 0 ) then
             BEGIN
              /* ACTUALICE EL COSTO POR PROVEEDOR */
              SELECT PVAR_FECHA FROM PROVEEDOR_ARTICULO
                WHERE TERC_NIT = :Nit AND ARTI_COD = NEW.ARTI_COD INTO :FECAUX;
              if (FECAUX IS NULL) then
                INSERT INTO PROVEEDOR_ARTICULO (TERC_NIT, ARTI_COD, PVAR_COSTO, PVAR_FECHA, PVAR_COD,PVAR_DES)
                    VALUES (:Nit, NEW.ARTI_COD, :COSTO, :fec, NEW.fcde_codprov,NEW.fcde_desc);
              else
                UPDATE PROVEEDOR_ARTICULO
                    SET PVAR_COSTO = :COSTO, PVAR_FECHA = :fec, PVAR_COD = NEW.fcde_codprov
                    WHERE ARTI_COD = NEW.ARTI_COD AND TERC_NIT = :Nit;
             END
            /* RECORRA LAS LISTAS DE PRECIOS Y CAMBIE EL PRECIO */
            EXECUTE PROCEDURE CALCULA_PRECIOS(NEW.ARTI_COD, :FEC);
            end
        EXECUTE PROCEDURE lee_configuracion('COMPRAS', 'FACTURAS', 'ACTUALIZAR COSTOS DE LA REMISION RELACIONADA AL GRABAR LA FACTURA') returning_values (:ACTREM);
        if ((ACTREM = 'SI') and (Tipo = 22)) then
            BEGIN
            numrows = 0;
            select mvar_cons, MVAR_ITEM, MVAR_FECHA, MVAR_IDREF, MVAR_CANT, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO
                from movimiento_articulo M, consolidado_faltantes C
                where C.cofa_id = :CONSOLIDA AND mvar_tipodoc = 22 and mvar_idref = C.cofa_idori AND C.cofa_tipoori = 22 and m.arti_cod = new.arti_cod
                into :numrows, :iterem, :fecrem, :idrem, :cantrem, :loterem, :prefrem, :numrem;
            
            if (numrows <> 0) then
                BEGIN
                DELETE FROM MOVIMIENTO_ARTICULO WHERE MVAR_CONS = :numrows;
                INSERT INTO MOVIMIENTO_ARTICULO
                    (ARTI_COD, MVAR_CONS, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM, TERC_NIT)
                    VALUES(NEW.ARTI_COD, GEN_ID(ID_MOVARTI,1), NEW.BODE_COD, :fecrem, 22, :idrem,
                    :CONC, :cantrem, :costo, 'S', :loterem, :prefrem, :numrem, :iterem, :Nit);
        
                if (COSTO > 0 ) then
                    BEGIN
                    /* ACTUALICE EL COSTO POR PROVEEDOR */
                    SELECT PVAR_FECHA FROM PROVEEDOR_ARTICULO
                        WHERE TERC_NIT = :Nit AND ARTI_COD = NEW.ARTI_COD
                        INTO :FECAUX;
                    if (FECAUX IS NULL) then
                        INSERT INTO PROVEEDOR_ARTICULO (TERC_NIT, ARTI_COD, PVAR_COSTO, PVAR_FECHA, PVAR_COD,PVAR_DES)
                            VALUES (:Nit, NEW.ARTI_COD, :COSTO, :fec, NEW.fcde_codprov,NEW.fcde_desc);
                    else
                        UPDATE PROVEEDOR_ARTICULO
                            SET PVAR_COSTO = :COSTO, PVAR_FECHA = :fec, PVAR_COD = NEW.fcde_codprov
                            WHERE ARTI_COD = NEW.ARTI_COD AND TERC_NIT = :Nit;
                    END
                /* RECORRA LAS LISTAS DE PRECIOS Y CAMBIE EL PRECIO */
                EXECUTE PROCEDURE CALCULA_PRECIOS(NEW.ARTI_COD, :FEC);
                END
            END

        if (CONSOLIDA <> 0) then
            begin
            UPDATE consolidado_faltantes SET COFA_OK = 'S' WHERE COFA_ID = :consolida AND COFA_ITEM = NEW.FCDE_ITEM AND ARTI_COD = NEW.arti_cod;
            EXECUTE procedure LEE_CONFIGURACION ('COMPRAS','DOCUMENTOS','SUMAR CANTIDADES PENDIENTES AL CONSOLIDAR DOCUMENTOS') returning_values (CONSO);
            /* IGNORE LA CONSOLIDACION SI SE VALIDAN CODIGOS DE LA ORDEN */
            SELECT MIN(CEFA_TIPOORI) FROM consolide_faltantes WHERE CEFA_ID = :CONSOLIDA INTO :NUMROWS;
            if (NUMROWS = 23) then
                BEGIN
                EXECUTE PROCEDURE LEE_CONFIGURACION('COMPRAS', 'FACTURAS', 'VERIFICAR CODIGOS DE LA ORDEN') returning_values (MENORV);
                if (MENORV = 'SI') then
                    CONSO = 'NO';
                END
            SELECT COUNT(CEFA_ITEM) FROM consolide_faltantes WHERE CEFA_ID = :CONSOLIDA INTO :NUMROWS;
            if ((CONSO = 'SI') AND (NUMROWS > 1)) then
                UPDATE consolidado_faltantes SET COFA_IDDES = NEW.faco_id, COFA_OK = 'S' WHERE COFA_ID = :consolida;
            else
                BEGIN
                /* BUSQUE EL CONSOLIDADO EN EL MISMO ITEM Y SI ES DIFERENTE ACTUALICELO */
                select COFA_CANT * COFA_FACTOR FROM consolidado_faltantes WHERE COFA_ID = :consolida AND COFA_ITEM = NEW.FCDE_ITEM AND ARTI_COD = NEW.arti_cod INTO :CANTREL;
                if (NEW.FCDE_CANT * NEW.FCDE_FACTOR < CANTREL) then
                    UPDATE consolidado_faltantes SET COFA_IDDES = NEW.faco_id, COFA_CANT = NEW.FCDE_CANT, COFA_FACTOR = NEW.FCDE_FACTOR
                        WHERE COFA_ID = :consolida AND COFA_ITEM = NEW.FCDE_ITEM AND ARTI_COD = NEW.arti_cod;
                END
            end
        END
    end
END
^

SET TERM ; ^


/* incluir cruces en abonos de documentos */
SET TERM ^ ;

CREATE OR ALTER PROCEDURE ABONOS_DOCUMENTO_CARTERA(
    TIPO INTEGER,
    ID INTEGER)
RETURNS (
    TIPOAB INTEGER,
    IDAB INTEGER,
    TIPODOC VARCHAR(8),
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    ABONO NUMERIC(18,2),
    RETES NUMERIC(18,2))
AS
begin
TIPOAB = 61;
TIPODOC = 'RECICAJA';
FOR SELECT D.RECA_ID, PREF_PRE, RECA_NUMERO, RECA_FECHA, RCDE_ABONO + RCDE_DTOF, RCDE_RTFTE+RCDE_RTIVA+RCDE_RTICA
    FROM RECIBOS_CAJA_DETALLE D, RECIBOS_CAJA R WHERE R.reca_id = D.RECA_ID AND RCDE_TIPODOC = :TIPO AND RCDE_IDDOC = :id AND RECA_ANULADO = 'N'
    INTO :idab, :PREFIJO, :NUMERO, :FECHA, :abono, :retes
    DO
    suspend;
TIPOAB = 43;
TIPODOC = 'APLICACL';
FOR SELECT D.APCL_ID, PREF_PRE, APCL_NUMERO, APCL_FECHA, ACDE_APLICADO, ACDE_RTFTE+ACDE_RTIVA+ACDE_RTICA
    FROM APLICACION_CLIENTE_DETALLE D, APLICACION_CLIENTE A WHERE A.apcl_id = D.APCL_ID AND ACDE_TIPODOC = :TIPO AND ACDE_IDDOC = :id AND APCL_ANULADO = 'N'
    INTO :idab, :PREFIJO, :NUMERO, :FECHA, :abono, :retes
    DO
    suspend;
TIPOAB = 62;
TIPODOC = 'EGRESO';
FOR SELECT E.egre_id, PREF_PRE, EGRE_NUMERO, EGRE_FECHA, D.egcc_abono+D.egcc_dtof, D.egcc_rtfte+D.egcc_rtiva+D.egcc_rtica
    FROM EGRESOS_CRUCEC D, EGRESOS E WHERE E.egre_id = D.egre_id AND EGCC_TIPODOC = :TIPO AND EGCC_IDDOC = :id AND EGRE_ANULADO = 'N'
    INTO :idab, :PREFIJO, :NUMERO, :FECHA, :abono, :retes
    DO
    suspend;
end
^

SET TERM ; ^


SET TERM ^ ;

CREATE OR ALTER PROCEDURE ABONOS_DOCUMENTO_CXPAGAR(
    TIPO INTEGER,
    ID INTEGER)
RETURNS (
    TIPOAB INTEGER,
    IDAB INTEGER,
    TIPODOC VARCHAR(8),
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    ABONO NUMERIC(18,2),
    RETES NUMERIC(18,2))
AS
begin
TIPOAB = 62;
TIPODOC = 'EGRESO';
FOR SELECT D.EGRE_ID, PREF_PRE, EGRE_NUMERO, EGRE_FECHA, EGDE_ABONO + EGDE_DTOF, EGDE_RTFTE+EGDE_RTIVA+EGDE_RTICA
    FROM EGRESOS_DETALLE D, EGRESOS E WHERE E.EGRE_ID = D.EGRE_ID AND EGDE_TIPODOC = :TIPO AND EGDE_IDDOC = :id AND EGRE_ANULADO = 'N'
    INTO :idab, :PREFIJO, :NUMERO, :FECHA, :abono, :retes
    DO
    suspend;
TIPOAB = 53;
TIPODOC = 'APLICAPR';
FOR SELECT D.APPR_ID, PREF_PRE, APPR_NUMERO, APPR_FECHA, APPD_APLICADO, APPD_RTFTE+APPD_RTIVA+APPD_RTICA
    FROM APLICACION_PROVEEDOR_DETALLE D, APLICACION_PROVEDOR A WHERE A.appr_id = D.APPR_ID AND APPD_TIPODOC = :TIPO AND APPD_IDDOC = :id AND APPR_ANULADO = 'N'
    INTO :idab, :PREFIJO, :NUMERO, :FECHA, :abono, :retes
    DO
    suspend;
TIPOAB = 61;
TIPODOC = 'RECIBO';
FOR SELECT R.reca_id, PREF_PRE, RECA_NUMERO, RECA_FECHA, D.rccr_abono + D.rccr_dtof, D.rccr_rtfte+D.rccr_rtiva+D.rccr_rtica
    FROM recibos_caja_crucec D, recibos_caja R WHERE R.reca_id = D.reca_id AND D.rccr_tipodoc = :TIPO AND D.rccr_iddoc = :id AND RECA_ANULADO = 'N'
    INTO :idab, :PREFIJO, :NUMERO, :FECHA, :abono, :retes
    DO
    suspend;
end
^

SET TERM ; ^


/* chequeo caja inicial y final */
 SET TERM ^ ;

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

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

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

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

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

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

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

  /* ACTUALICE LA SALIDA DEL DOCUMENTO DE PAGO */
  UPDATE DOCUMENTOS_PAGO_CAJA
    SET DPCA_TIPOSAL = 64, DPCA_IDSAL = :id
    WHERE FOPA_ID = :FORMA AND DPCA_BANCO = :BANCO AND DPCA_CUENTA = :CUENTA AND
    DPCA_NUMERO = :NUMERO AND DPCA_TIPOSAL = 0 AND DPCA_IDSAL = 0;
  end

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

SET TERM ; ^



/* anular cruces al anular recibos y egresos */
SET TERM ^ ;

CREATE OR ALTER TRIGGER EGRESOS_AU FOR EGRESOS
ACTIVE AFTER UPDATE POSITION 0
as
declare variable consec INTEGER;
begin
/* BORRE LA CONTABILIZACION */
if (NEW.EGRE_ANULADO = 'S') then
    BEGIN
    select enco_consec from comprobante_encabezado where enco_tiporef = 62 and enco_idref = old.egre_id into :consec;
    if (NOT consec is null) then
      delete from comprobante_detalle where enco_consec = :consec;
    delete from comprobante_encabezado where enco_tiporef = 62 and enco_idref = old.egre_id;    
    INSERT INTO AUDITORIA(audi_usuario, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
        VALUES (USER, 62, NEW.egre_id, 'A', NEW.pref_pre || NEW.egre_numero);
    END
/* BORRE EL ANTERIOR Y GRABE EL NUEVO */
if ((OLD.egre_id <> 0) AND (OLD.egre_anulado = 'N')) then
    BEGIN
    if ((OLD.EGRE_TIPO = '2') AND OLD.CAJA_ID <> 0) then
        BEGIN
        DELETE FROM MOVIMIENTO_CAJA WHERE MOCA_TIPOREF = 62 AND MOCA_IDREF = OLD.EGRE_ID;
        /* GRABE EL DOCUMENTO DE PAGO EN CAJA */
        EXECUTE PROCEDURE SUME_SALDO_EFECTIVO (OLD.caja_id, OLD.egre_fecha, OLD.egre_monto, 'S');
        END
    end
if ((NEW.EGRE_ID <> 0)  AND (NEW.egre_anulado = 'N')) then
    BEGIN
    if ((NEW.EGRE_TIPO = '2') AND NEW.CAJA_ID <> 0) then
        BEGIN
        INSERT INTO MOVIMIENTO_CAJA
            (MOCA_ID, CAJA_ID, MOCA_TIPOREF, MOCA_PREFREF, MOCA_NUMREF, MOCA_FECHA, MOCA_CONC, MOCA_DEBITOS, MOCA_CREDITOS, MOCA_DB, MOCA_IDREF)
            VALUES(GEN_ID(id_movcaja,1), NEW.CAJA_ID, 62, NEW.PREF_PRE, NEW.EGRE_NUMERO, NEW.EGRE_FECHA, NEW.EGRE_CONC, NEW.EGRE_MONTO, 0, 'S', new.EGRE_ID);
        /* GRABE EL DOCUMENTO DE PAGO EN CAJA */
        EXECUTE PROCEDURE SUME_SALDO_EFECTIVO (NEW.caja_id, NEW.egre_fecha, NEW.egre_monto, 'N');
        END
    INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
        VALUES (USER, 62, NEW.egre_id, 'U', NEW.pref_pre || NEW.egre_numero);
    END
/* si hubo un cambio critico afecte los detalles */
if ((OLD.pref_pre <> NEW.pref_pre) or
    (OLD.egre_numero <> NEW.egre_numero) or
    (OLD.egre_fecha <> NEW.egre_fecha)) then
    BEGIN
    UPDATE EGRESOS_CAJA SET EGCA_TRANSMIT = 'N' WHERE EGRE_ID = NEW.EGRE_ID;
    UPDATE EGRESOS_BANCO SET EGBC_TRANSMIT = 'N' WHERE EGRE_ID = NEW.EGRE_ID;
    UPDATE EGRESOS_DETALLE SET EGDE_TRANSMIT = 'N' WHERE EGRE_ID = NEW.EGRE_ID;
    UPDATE egresos_crucec SET EGCC_TRANSMIT = 'N' WHERE EGRE_ID = NEW.EGRE_ID;
    END
/* ANULE LOS DETALLES */
if (OLD.egre_anulado <> NEW.egre_anulado) then
    BEGIN
    UPDATE egresos_caja SET EGCA_ANULADO = NEW.EGRE_anulado WHERE EGRE_ID = NEW.EGRE_ID;
    UPDATE egresos_banco SET EGBC_ANULADO = NEW.EGRE_anulado WHERE EGRE_ID = NEW.EGRE_ID;
    UPDATE egresos_detalle SET EGDE_ANULADO = NEW.EGRE_anulado WHERE EGRE_ID = NEW.EGRE_ID;
    UPDATE egresos_crucec SET EGCC_ANULADO = NEW.EGRE_anulado WHERE EGRE_ID = NEW.EGRE_ID;
    END
/* TRASMITA LOS DETALLES */
if (OLD.EGRE_transmit <> NEW.EGRE_transmit) then
    BEGIN
    UPDATE EGRESOS_CAJA SET EGCA_TRANSMIT = NEW.EGRE_TRANSMIT WHERE EGRE_ID = NEW.EGRE_ID;
    UPDATE EGRESOS_BANCO SET EGBC_TRANSMIT = NEW.EGRE_TRANSMIT WHERE EGRE_ID = NEW.EGRE_ID;
    UPDATE EGRESOS_DETALLE SET EGDE_TRANSMIT = NEW.EGRE_TRANSMIT WHERE EGRE_ID = NEW.EGRE_ID;
    UPDATE egresos_crucec SET EGCC_TRANSMIT = NEW.EGRE_TRANSMIT WHERE EGRE_ID = NEW.EGRE_ID;
    END
end
^

SET TERM ; ^


SET TERM ^ ;

CREATE OR ALTER TRIGGER RECIBOS_CAJA_AU FOR RECIBOS_CAJA
ACTIVE AFTER UPDATE POSITION 0
AS
declare variable consec INTEGER;
BEGIN
/* Borre la contabilizacion */
if (new.reca_anulado = 'S') then
    begin
    select enco_consec from comprobante_encabezado where enco_tiporef = 61 and enco_idref = old.reca_id into :consec;
    if (NOT consec is null) then
      delete from comprobante_detalle where enco_consec = :consec;
    delete from comprobante_encabezado where enco_tiporef = 61 and enco_idref = old.reca_id;
    INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
        VALUES (USER, 61, NEW.reca_id, 'A', NEW.pref_pre || NEW.reca_numero);
    end

/* si existia un recibo provisional borrelo */
if ((old.reca_id <> 0) and (old.reca_anulado = 'N')) then
    if ((old.reca_provid is not null) and (old.reca_provid <> 0)) then
        update recibo_provisional set rcpr_idcruce = 0, rcpr_feccruce = null where rcpr_id = old.reca_provid;
if ((new.reca_id <> 0) and (new.reca_anulado = 'N')) then
    BEGIN
    if ((new.reca_provid is not null) and (new.reca_provid <> 0)) then
        update recibo_provisional set rcpr_idcruce = new.reca_id, rcpr_feccruce = new.reca_fecha where rcpr_id = new.reca_provid;
    INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
        VALUES (USER, 61, NEW.reca_id, 'U', NEW.pref_pre || NEW.reca_numero);
    END
/* si cambio fecha o numero actualice detalles */
if ((OLD.pref_pre <> NEW.pref_pre) or
    (OLD.reca_numero <> NEW.reca_numero) or
    (OLD.reca_fecha <> NEW.reca_fecha)) then
    BEGIN
    UPDATE recibos_caja_pago SET RCPA_TRANSMIT = 'N' WHERE RECA_ID = NEW.RECA_ID;
    UPDATE recibos_caja_detalle SET RCDE_TRANSMIT = 'N' WHERE RECA_ID = NEW.RECA_ID;
    UPDATE recibos_caja_crucec SET RCCR_TRANSMIT = 'N' WHERE RECA_ID = NEW.RECA_ID;
    END
/* ACTUALICE EL ANULADO EN LOS DETALLES */
if (OLD.RECA_anulado <> NEW.RECA_anulado) then
    BEGIN
    UPDATE recibos_caja_pago SET RCPA_ANULADO = NEW.RECA_anulado WHERE RECA_ID = NEW.RECA_ID;
    UPDATE recibos_caja_detalle SET RCDE_ANULADO = NEW.RECA_anulado WHERE RECA_ID = NEW.RECA_ID;
    UPDATE recibos_caja_crucec SET RCCR_ANULADO = NEW.RECA_anulado WHERE RECA_ID = NEW.RECA_ID;
    END
if (OLD.reca_transmit <> NEW.reca_transmit) then
    BEGIN
    UPDATE recibos_caja_pago SET RCPA_TRANSMIT = NEW.reca_transmit WHERE RECA_ID = NEW.RECA_ID;
    UPDATE recibos_caja_detalle SET RCDE_TRANSMIT = NEW.reca_transmit WHERE RECA_ID = NEW.RECA_ID;
    UPDATE recibos_caja_crucec SET RCCR_TRANSMIT = NEW.reca_transmit WHERE RECA_ID = NEW.RECA_ID;
    END
END
^

SET TERM ; ^

alter table RECIBOS_CAJA_CRUCEC add constraint FK_RECIBOS_CAJA_CRUCEC_1
foreign key (RECA_ID) references RECIBOS_CAJA(RECA_ID) on delete CASCADE on update CASCADE;

alter table EGRESOS_CRUCEC add constraint FK_EGRESOS_CRUCEC_1
foreign key (EGRE_ID) references EGRESOS(EGRE_ID) on delete CASCADE on update CASCADE;


/* revisa precios con marcas */
SET TERM ^ ;

CREATE OR ALTER PROCEDURE REVISA_PRECIOS(
    LISTA INTEGER,
    FECHA DATE)
RETURNS (
    ARTICULO VARCHAR(20),
    DESCR VARCHAR(60),
    FIJO NUMERIC(18,2),
    UNIDAD VARCHAR(8),
    PORC NUMERIC(9,4),
    SUGERIDO NUMERIC(18,2),
    DIFER NUMERIC(18,2),
    NUEVO NUMERIC(18,2),
    OK CHAR(1))
AS
declare variable marg numeric(9,4);
declare variable UOM VARCHAR(10);
declare variable BASE VARCHAR(10);
declare variable CAMBIO VARCHAR(10);
declare variable COSTO numeric(18,2);
declare variable COSTOP numeric(18,2);
declare variable COSTOU numeric(18,2);
declare variable DIFMAX numeric(18,2);
declare variable DIG INTEGER;
declare variable TARIVA NUMERIC(9,4);
declare variable IVAINC CHAR(1);
declare variable LISTAREF INTEGER;
begin
execute procedure lee_configuracion ('FACTURACION', 'ARTICULOS', 'SUGERIR PRECIOS CON PORCENTAJE DE MARGEN O UTILIDAD') returning_values (:UOM);
EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION', 'ARTICULOS', 'REDONDEO AL MULTIPLO DE DIEZ EN PRECIOS') RETURNING_VALUES (:DIG);
EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION','ARTICULOS','CAMBIO DE PRECIOS AUTOMATICO AL CAMBIAR COSTO O PRECIO') returning_values (CAMBIO);
EXECUTE PROCEDURE lee_configuracion('FACTURACION','ARTICULOS','COSTO BASE PARA CALCULO DE PRECIOS DE VENTA AUTOMATICOS') returning_values (:BASE);
EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION','ARTICULOS','CODIGO DE LA LISTA DE PRECIOS BASE PARA CAMBIO DE PRECIOS AUTOMATICO') returning_values (LISTAREF);
EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION','ARTICULOS','DIFERENCIA EN PESOS MAXIMA A PERMITIR PARA CAMBIAR PRECIOS') returning_values (DIFMAX);
for select A.arti_cod, A.arti_des, A.arti_unidad, prar_fijo, prar_margen, prar_util, TAIV_PORC
    from precios_articulo p, articulo a, tarifa_iva T
    where a.arti_cod = p.arti_cod and lipr_cod = :lista and a.taiv_cod = t.taiv_cod order by A.arti_cod
    into :articulo, descr, :unidad, :fijo, :marg, :porc, :tariva
    do
    begin
    if (UOM <> 'UTILIDAD') then
        PORC = MARG;
    if (CAMBIO = 'COSTO') then
        BEGIN
        EXECUTE PROCEDURE COSTO_PROMEDIO (:ARTICULO, :FECHA) RETURNING_VALUES(:COSTOP);
        EXECUTE PROCEDURE ULTIMO_COSTO (:ARTICULO, :FECHA, :UNIDAD) RETURNING_VALUES(:COSTOU);
        if (base = 'ULTIMO') then
            COSTO = COSTOU;
        ELSE
            BEGIN
            COSTO = COSTOP;
            if (base = 'MAYOR') then
                if (COSTOP < COSTOU) then
                    COSTO = COSTOU;
            END
        SELECT LIPR_MODIF FROM LISTA_PRECIOS WHERE LIPR_COD = :lista INTO :IVAINC;
        if (IVAINC = 'S') then
            COSTO = COSTO * (1 + TARIVA/100);
        if (UOM = 'UTILIDAD') then
            SUGERIDO = COSTO * (1 + :PORC/100);
        ELSE
            SUGERIDO = COSTO / (1 - :PORC/100);
        END
    ELSE
        if (LISTA <> LISTAREF) then
            BEGIN
            SELECT PRAR_FIJO FROM PRECIOS_ARTICULO WHERE ARTI_COD = :articulo AND LIPR_COD = :LISTAREF INTO :SUGERIDO;
            if (IVAINC = 'S') then
                SUGERIDO = SUGERIDO / (1 + TARIVA/100);
            if (UOM = 'UTILIDAD') then
                SUGERIDO = SUGERIDO * (1 + :PORC/100);
            ELSE
                SUGERIDO = SUGERIDO / (1 - :PORC/100);
            END
    EXECUTE PROCEDURE REDONDEE (SUGERIDO, DIG) returning_values (SUGERIDO);
    DIFER = SUGERIDO - FIJO;
    NUEVO = SUGERIDO;
    OK = 'S';
    if ((DIFER > DIFMAX) and (sugerido <> 0)) then
        suspend;
    end
end
^

SET TERM ; ^

GRANT EXECUTE ON PROCEDURE LEE_CONFIGURACION TO PROCEDURE REVISA_PRECIOS;
GRANT SELECT ON PRECIOS_ARTICULO TO PROCEDURE REVISA_PRECIOS;
GRANT SELECT ON ARTICULO TO PROCEDURE REVISA_PRECIOS;
GRANT SELECT ON TARIFA_IVA TO PROCEDURE REVISA_PRECIOS;
GRANT EXECUTE ON PROCEDURE COSTO_PROMEDIO TO PROCEDURE REVISA_PRECIOS;
GRANT EXECUTE ON PROCEDURE ULTIMO_COSTO TO PROCEDURE REVISA_PRECIOS;
GRANT SELECT ON LISTA_PRECIOS TO PROCEDURE REVISA_PRECIOS;
GRANT EXECUTE ON PROCEDURE REDONDEE TO PROCEDURE REVISA_PRECIOS;


/* promedio de salidas sin incluir dias sin existencias */ 

INSERT INTO CONFIGURACION (CONF_MODULO, CONF_CATEGORIA, CONF_PROPIEDAD, CONF_VALOR, CONF_POSIBLES, CONF_AYUDA) VALUES ('INVENTARIO', 'EXISTENCIAS', 'INCLUIR DIAS SIN EXISTENCIA EN PROMEDIO DE VENTAS DIARIO', 'SI', 'SI,NO', 'SI:Promedia las ventas dividiendo entre el número días indicado para el artículo. NO: Promedia dividiendo entre el número de días con existencia');
commit work;


SET TERM ^ ;

CREATE OR ALTER PROCEDURE PROMEDIO_SALIDAS_ARTICULO(
    ARTICULO VARCHAR(15),
    FECHA DATE,
    BODEGA VARCHAR(2))
RETURNS (
    PROMEDIO NUMERIC(18,4),
    SALIDAS NUMERIC(18,4))
AS
declare variable FECINI DATE;
declare variable DIASC VARCHAR(255);
declare variable DIAS INTEGER;
declare variable DIA_ART VARCHAR(2) CHARACTER SET NONE;
declare variable INCSALI VARCHAR(2);
declare variable SININV VARCHAR(2);
declare variable saldo numeric(18,2);
BEGIN
  EXECUTE PROCEDURE lee_configuracion ('INVENTARIO', 'EXISTENCIAS', 'INCLUIR SALIDAS POR CONCEPTOS DIFERENTES A VENTA EN CALCULO DE PROMEDIO DE SALIDAS POR ARTICULO') returning_values (INCSALI);
  /*DE ACUERDO A PARAMETRO TOME LOS DIAS PARA EL PROMDIO*/
  EXECUTE PROCEDURE lee_configuracion ('INVENTARIO', 'EXISTENCIAS', 'PROMEDIAR LAS SALIDAS DEL INVENTARIO CON EL NUMERO DE DIAS ASIGNADO A CADA ARTICULO') returning_values (:DIA_ART);
  /* SUME LAS CANTIDADES SALIDAS DEL INVENTARIO */
  EXECUTE PROCEDURE lee_configuracion ('INVENTARIO', 'EXISTENCIAS', 'NUMERO DE DIAS PARA PROMEDIO DE SALIDAS POR ARTICULO') returning_values (DIASC);
  EXECUTE PROCEDURE lee_configuracion ('INVENTARIO', 'EXISTENCIAS', 'INCLUIR DIAS SIN EXISTENCIA EN PROMEDIO DE VENTAS DIARIO') returning_values (:SININV);
  if (DIA_ART = 'SI') then
    BEGIN
      SELECT ARTI_DIANALIS FROM ARTICULO WHERE ARTI_COD = :ARTICULO
       INTO :DIAS;
    END
  ELSE
     DIAS = CAST(DIASC AS INTEGER);

  FECINI = FECHA - DIAS;
  if (INCSALI = 'SI') then
      SELECT SUM(MVAR_CANT) FROM MOVIMIENTO_ARTICULO
        WHERE ARTI_COD = :ARTICULO AND BODE_COD = :BODEGA AND MVAR_FECHA >= :FECINI AND MVAR_FECHA <= :FECHA AND MVAR_ENTRADA = 'N' AND MVAR_TIPODOC <> 13 INTO :SALIDAS;
  else
      SELECT SUM(MVAR_CANT) FROM MOVIMIENTO_ARTICULO
        WHERE ARTI_COD = :ARTICULO AND BODE_COD = :BODEGA AND MVAR_FECHA >= :FECINI AND MVAR_FECHA <= :FECHA AND ((MVAR_TIPODOC = 31) or (MVAR_TIPODOC = 32)) INTO :SALIDAS;
  if (SALIDAS IS NULL) then
    SALIDAS = 0;
  if (SININV = 'SI') then
      PROMEDIO = SALIDAS / DIAS;
  else
    begin
    dias = 0;
    while (fecini < fecha) do
        begin
        execute procedure saldo_inventario (:articulo, :bodega, :fecini) returning_values (:saldo);
        if (SALDO <> 0) then
            DIAS = DIAS + 1;
        fecini = fecini + 1;
        end
    if (DIAS = 0) then
        PROMEDIO = 0;
    ELSE
        PROMEDIO = SALIDAS / DIAS;
    end
  SUSPEND;
END
^

SET TERM ; ^

GRANT EXECUTE ON PROCEDURE LEE_CONFIGURACION TO PROCEDURE PROMEDIO_SALIDAS_ARTICULO;
GRANT SELECT ON ARTICULO TO PROCEDURE PROMEDIO_SALIDAS_ARTICULO;
GRANT SELECT ON MOVIMIENTO_ARTICULO TO PROCEDURE PROMEDIO_SALIDAS_ARTICULO;
GRANT EXECUTE ON PROCEDURE SALDO_INVENTARIO TO PROCEDURE PROMEDIO_SALIDAS_ARTICULO;

SET TERM ^ ;

ALTER PROCEDURE DISPONIBILIDAD_ARTICULO(
    ARTICULO VARCHAR(15),
    FECHA DATE,
    BODEGA VARCHAR(2))
RETURNS (
    DISPONIBILIDAD INTEGER,
    EXIST NUMERIC(18,4),
    PROMEDIO NUMERIC(18,4),
    SALIDAS NUMERIC(18,4))
AS
BEGIN
  EXECUTE PROCEDURE SALDO_INVENTARIO (ARTICULO, BODEGA, FECHA) returning_values (:EXIST);
  EXECUTE PROCEDURE PROMEDIO_SALIDAS_ARTICULO(:ARTICULO, :FECHA, :BODEGA) returning_values (:PROMEDIO, :SALIDAS);
  if (PROMEDIO > 0) then
    DISPONIBILIDAD = EXIST / PROMEDIO;
  ELSE
    DISPONIBILIDAD = 0;
  SUSPEND;
END

^

SET TERM ; ^

SET TERM ^ ;

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

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE MINIMO_ARTICULO(
    ARTICULO VARCHAR(15),
    FECHA DATE,
    BODEGA CHAR(2))
RETURNS (
    MINIMO NUMERIC(18,4))
AS
declare variable DIAS CHAR(2);
declare variable PROMEDIO NUMERIC(18,4);
declare variable SALIDAS NUMERIC(18,4);
BEGIN
  /* CUANDO CONFIGURACION MINIMO EN DIAS */
  EXECUTE PROCEDURE LEE_CONFIGURACION ('INVENTARIO', 'EXISTENCIAS', 'MINIMO INVENTARIO EN DIAS') returning_values (DIAS);
  if (DIAS = 'SI') then
    BEGIN
    EXECUTE PROCEDURE PROMEDIO_SALIDAS_ARTICULO(:ARTICULO, :FECHA, :BODEGA) returning_values (:PROMEDIO, :SALIDAS);
    SELECT ARTI_DIAS * :PROMEDIO FROM ARTICULO WHERE ARTI_COD = :ARTICULO INTO :MINIMO;
    end
  ELSE
    BEGIN
    SELECT ARTI_MIN FROM ARTICULO WHERE ARTI_COD = :ARTICULO INTO :MINIMO;
    END
  if (MINIMO IS NULL) then
    MINIMO = 0;
  SUSPEND;
END

^

SET TERM ; ^

SET TERM ^ ;

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

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE REP_DISPONIBILIDAD(
    FECHA DATE,
    ARTINI VARCHAR(20),
    ARTFIN VARCHAR(20),
    GRPINI VARCHAR(2),
    GRPFIN VARCHAR(2),
    ORDEN CHAR(1),
    CEROS CHAR(1),
    DETALLE CHAR(1),
    SUCURSAL INTEGER)
RETURNS (
    CODIGO VARCHAR(15),
    NOMBRE VARCHAR(60),
    UNIDAD VARCHAR(8),
    CODGRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    CODSUBG VARCHAR(3),
    NOMSUBG VARCHAR(30),
    CODMARC VARCHAR(3),
    NOMMARC VARCHAR(30),
    CODBOD VARCHAR(2),
    NOMBOD VARCHAR(30),
    EXIST NUMERIC(18,4),
    PROMEDIO NUMERIC(18,4),
    SALIDAS NUMERIC(18,4),
    DISPONIBILIDAD INTEGER,
    DIAS INTEGER,
    PROMEDIADO INTEGER,
    COSTO NUMERIC(18,2),
    COSTOPRO NUMERIC(18,2),
    SUGERIDO NUMERIC(18,4),
    FECCOMPRA DATE)
AS
DECLARE VARIABLE CODINI VARCHAR(20);
DECLARE VARIABLE CODFIN VARCHAR(20);
DECLARE VARIABLE DESINI VARCHAR(20);
declare variable FECINI DATE;
declare variable DIASC VARCHAR(255);
DECLARE VARIABLE DESFIN VARCHAR(20);
declare variable DIA_ART VARCHAR(2) CHARACTER SET NONE;
BEGIN
if (ORDEN = 'C') then
    BEGIN
    CODINI = ARTINI;
    CODFIN = ARTFIN;
    DESINI = '';
    DESFIN = 'zz';
    END
ELSE
    BEGIN
    DESINI = ARTINI;
    DESFIN = ARTFIN;
    CODINI = '';
    CODFIN = 'zz';
    END
if (DETALLE = 'S') then
  BEGIN
  FOR SELECT ARTI_COD, ARTI_DES, ARTI_UNIDAD, ARTI_DIAS, A.GRUP_COD, GRUP_NOM, A.SUBG_COD, A.MARC_COD, BODE_COD, BODE_NOM, ARTI_DIANALIS
      FROM ARTICULO A, GRUPO G, BODEGA B
      WHERE ARTI_COD >= :CODINI AND ARTI_COD <= :CODFIN AND A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :GRPFIN AND ARTI_DES >= :DESINI AND ARTI_DES <= :DESFIN AND
      G.GRUP_COD = A.GRUP_COD AND A.ESAR_COD <> 'I' AND ((SUCU_ID = :SUCURSAL) or (:SUCURSAL = 0))
      INTO :CODIGO, :NOMBRE, :UNIDAD, :DIAS, :CODGRUPO, :NOMGRUPO, :CODSUBG, :CODMARC, :CODBOD, :NOMBOD, :PROMEDIADO
      DO
        BEGIN
        NOMMARC = '';
        NOMSUBG = '';
        SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO :NOMMARC;
        SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
        EXECUTE PROCEDURE ultimo_costo(:CODIGO, :FECHA, :UNIDAD) returning_values (:COSTO);
        EXECUTE PROCEDURE costo_promedio(:CODIGO, :FECHA) RETURNING_VALUES :costopro;
        EXECUTE PROCEDURE DISPONIBILIDAD_ARTICULO(CODIGO, FECHA, :CODBOD) returning_values (:DISPONIBILIDAD, :EXIST, :PROMEDIO, :SALIDAS);
        /*ESTABLECER CUAL ES EL VALOR DE DIAS PARA PROMEDIO*/
        EXECUTE PROCEDURE lee_configuracion ('INVENTARIO', 'EXISTENCIAS', 'PROMEDIAR LAS SALIDAS DEL INVENTARIO CON EL NUMERO DE DIAS ASIGNADO A CADA ARTICULO') returning_values (:DIA_ART);
        if (DIA_ART = 'NO') then
          BEGIN
            EXECUTE PROCEDURE lee_configuracion ('INVENTARIO', 'EXISTENCIAS', 'NUMERO DE DIAS PARA PROMEDIO DE SALIDAS POR ARTICULO') returning_values (DIASC);
            PROMEDIADO = CAST(DIASC AS INTEGER);
          END
        FECINI = :FECHA - :PROMEDIADO;
        if ((DISPONIBILIDAD < DIAS) and (PROMEDIO > 0))then
            SUGERIDO = (DIAS * PROMEDIO) - EXIST;
        ELSE
            SUGERIDO = 0;
        SELECT MAX(FACO_FECHA) FROM FACTURAS_COMPRA F, FACTURAS_COMPRAS_DETALLE D
            WHERE F.FACO_ID = D.faco_id AND D.ARTI_COD = :CODIGO AND FACO_FECHA <= :FECHA AND D.bode_cod = :codbod
            INTO :FECCOMPRA;
        if ((PROMEDIO > 0) or (EXIST <> 0) or (CEROS = 'S')) then
            SUSPEND;
        END
  END
ELSE
  BEGIN
  FOR SELECT ARTI_COD, ARTI_DES, ARTI_UNIDAD, ARTI_DIAS, A.GRUP_COD, GRUP_NOM, A.SUBG_COD, A.MARC_COD, ARTI_DIANALIS
      FROM ARTICULO A, GRUPO G
      WHERE ARTI_COD >= :CODINI AND ARTI_COD <= :CODFIN AND A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :GRPFIN AND ARTI_DES >= :DESINI AND ARTI_DES <= :DESFIN AND G.GRUP_COD = A.GRUP_COD AND A.ESAR_COD <> 'I'
      INTO :CODIGO, :NOMBRE, :UNIDAD, :DIAS, :CODGRUPO, :NOMGRUPO, :CODSUBG, :CODMARC, :PROMEDIADO
      DO
        BEGIN
        NOMMARC = '';
        NOMSUBG = '';
        SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO :NOMMARC;
        SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
        EXECUTE PROCEDURE costo_promedio(:CODIGO, :FECHA) RETURNING_VALUES :costopro;
        EXECUTE PROCEDURE ultimo_costo(:CODIGO, :FECHA, :UNIDAD) returning_values (:COSTO);
        EXECUTE PROCEDURE DISPONIBILIDAD_TOTAL_ARTICULO(CODIGO, FECHA) returning_values (:DISPONIBILIDAD, :EXIST, :PROMEDIO, :SALIDAS);
        /*ESTABLECER CUAL ES EL VALOR DE DIAS PARA PROMEDIO*/
        EXECUTE PROCEDURE lee_configuracion ('INVENTARIO', 'EXISTENCIAS', 'PROMEDIAR LAS SALIDAS DEL INVENTARIO CON EL NUMERO DE DIAS ASIGNADO A CADA ARTICULO') returning_values (:DIA_ART);
        if (DIA_ART = 'NO') then
          BEGIN
            EXECUTE PROCEDURE lee_configuracion ('INVENTARIO', 'EXISTENCIAS', 'NUMERO DE DIAS PARA PROMEDIO DE SALIDAS POR ARTICULO') returning_values (DIASC);
            PROMEDIADO = CAST(DIASC AS INTEGER);
          END
        FECINI = :FECHA - :PROMEDIADO;
        if ((DISPONIBILIDAD < DIAS) and (PROMEDIO > 0))then
            SUGERIDO = (DIAS * PROMEDIO) - EXIST;
        ELSE
            SUGERIDO = 0;
        SELECT MAX(FACO_FECHA) FROM FACTURAS_COMPRA F, FACTURAS_COMPRAS_DETALLE D
            WHERE F.FACO_ID = D.faco_id AND D.ARTI_COD = :CODIGO AND FACO_FECHA <= :FECHA
            INTO :FECCOMPRA;
        if ((PROMEDIO > 0) or (EXIST <> 0) or (CEROS = 'S')) then
            SUSPEND;
        END
  END
END

^

SET TERM ; ^


/* 20080626 */
ALTER TABLE LOTES ADD BODE_COD VARCHAR(2) NOT NULL ;
ALTER TABLE EXISTENCIA_LOTE ADD BODE_COD VARCHAR(2) NOT NULL ;
ALTER TABLE EXISTENCIA_LOTE DROP CONSTRAINT FK_EXISTLOTE_LOTES;
ALTER TABLE EXISTENCIA_LOTE DROP CONSTRAINT PK_EXISTENCIA_LOTE;
ALTER TABLE LOTES DROP CONSTRAINT PK_LOTES;
delete from existencia_lote;
delete from lotes;
commit work;

alter table LOTES add constraint PK_LOTES primary key (ARTI_COD,BODE_COD,LOTE_NRO);
alter table EXISTENCIA_LOTE add constraint PK_EXISTENCIA_LOTE primary key (ARTI_COD,BODE_COD,LOTE_NRO,EXLO_FECHA);
alter table EXISTENCIA_LOTE add constraint FK_EXISTENCIA_LOTE_1 foreign key (ARTI_COD,BODE_COD,LOTE_NRO) references LOTES(ARTI_COD,BODE_COD,LOTE_NRO);

SET TERM ^ ;

CREATE OR ALTER PROCEDURE CHEQUEO_INVENTARIO(
    ARTINI VARCHAR(20),
    ARTFIN VARCHAR(20))
AS
DECLARE VARIABLE FECHA DATE;
DECLARE VARIABLE CANT NUMERIC(15,4);
DECLARE VARIABLE COSTO NUMERIC(18,2);
DECLARE VARIABLE ENTRADA CHAR(1);
DECLARE VARIABLE BODEGA CHAR(2);
DECLARE VARIABLE ID INTEGER;
DECLARE VARIABLE TIPO INTEGER;
declare variable TIPOEX CHAR(1);
DECLARE VARIABLE LOTE VARCHAR(20);
DECLARE VARIABLE EXISTE CHAR(1);
declare variable ARTICULO VARCHAR(20);
declare variable IDL INTEGER;
BEGIN
for select arti_cod from articulo where arti_cod >= :artini and arti_cod <= :artfin into :ARTICULO
  DO
  BEGIN
  DELETE FROM existencia_lote where arti_cod = :articulo;
  DELETE FROM lotes where arti_cod = :articulo;
  delete from costos where arti_cod = :ARTICULO;
  delete from existencia WHERE ARTI_COD = :ARTICULO;
  for select mvar_cons, mvar_fecha, mvar_cant, mvar_costo, mvar_entrada, bode_cod, mvar_tipodoc, mvar_lote
    from movimiento_articulo WHERE ARTI_COD = :ARTICULO
    order by mvar_fecha, mvar_cons
    into :id, :fecha, :cant, :costo, :entrada, :bodega, :tipo, :lote
  do
    begin
    SELECT ARTI_EXIST
        FROM   ARTICULO
        WHERE  ARTICULO.ARTI_COD = :ARTICULO
        INTO :TIPOEX;
    if ((TIPO <> 13)) then
        EXECUTE PROCEDURE actualice_costo(:ARTICULO, :fecha, :costo, :cant, :entrada, 'N', :id, :tipo);
    /* actualice existencias */
    if (:entrada = 'S') then
        begin
        execute procedure sume_existencia(:articulo, :bodega, :fecha, :cant, 'N');
        if (TIPOEX = 'L') then
            begin
            EXISTE = 'N';
            SELECT 'S' FROM LOTES WHERE ARTI_COD = :ARTICULO AND BODE_COD = :BODEGA AND LOTE_NRO = :lote INTO :EXISTE;
            if (EXISTE = 'S') then
                UPDATE LOTES
                    set lote_saldo = lote_saldo + :cant
                    where (arti_cod = :ARTICULO) and (BODE_COD = :BODEGA) AND (lote_nro = :lote);
            ELSE
                INSERT INTO LOTES (ARTI_COD, BODE_COD, LOTE_NRO, LOTE_FECHA, LOTE_CANT, LOTE_COSTO, LOTE_SALDO)
                    VALUES (:ARTICULO, :bodega, :lote, :fecha, :cant, :costo, :cant);
            end
        end
    else
        begin
        execute procedure reste_existencia(:articulo, :bodega, :fecha, :cant, 'N');
        if (TIPOEX = 'L') then
            begin
            EXISTE = 'N';
            SELECT 'S' FROM LOTES WHERE ARTI_COD = :ARTICULO AND BODE_COD = :BODEGA AND LOTE_NRO = :lote INTO :EXISTE;
            if (EXISTE = 'S') then
                UPDATE LOTES
                    set lote_saldo = lote_saldo - :cant
                    where (arti_cod = :ARTICULO) AND (BODE_COD = :BODEGA) and (lote_nro = :lote);
            ELSE
                BEGIN
                /* ARREGLE EL LOTE YA QUE NO EXISTE */
                SELECT MIN(LOTE_ID) FROM LOTES WHERE ARTI_COD = :articulo AND BODE_COD = :BODEGA AND LOTE_CANT >= :cant INTO :IDL;
                SELECT LOTE_NRO FROM LOTES WHERE LOTE_ID = :IDL INTO :LOTE;
                UPDATE MOVIMIENTO_ARTICULO SET MVAR_LOTE = :LOTE WHERE MVAR_CONS = :ID;
                UPDATE LOTES
                    set lote_saldo = lote_saldo - :cant
                    where (arti_cod = :ARTICULO) and (BODE_COD = :BODEGA) AND (lote_nro = :lote);
                END
            EXISTE = 'N';
            SELECT 'S' FROM EXISTENCIA_LOTE
                WHERE LOTE_NRO = :LOTE AND EXLO_FECHA = :FECHA AND ARTI_COD = :ARTICULO AND BODE_COD = :bodega
                INTO :EXISTE;
            if (EXISTE = 'S') then
                UPDATE EXISTENCIA_LOTE
                       SET EXLO_SAL = EXLO_SAL + :cant
                    WHERE LOTE_NRO = :LOTE AND EXLO_FECHA = :FECHA AND ARTI_COD = :ARTICULO AND BODE_COD = :bodega;
            else
                INSERT INTO EXISTENCIA_LOTE (ARTI_COD, BODE_COD, LOTE_NRO, EXLO_FECHA, EXLO_SAL)
                    VALUES (:ARTICULO, :BODEGA, :LOTE, :FECHA, :CANT);
            end
        end
    END
  END
END
^

SET TERM ; ^

GRANT SELECT ON ARTICULO TO PROCEDURE CHEQUEO_INVENTARIO;
GRANT SELECT,INSERT,DELETE,UPDATE ON EXISTENCIA_LOTE TO PROCEDURE CHEQUEO_INVENTARIO;
GRANT SELECT,INSERT,DELETE,UPDATE ON LOTES TO PROCEDURE CHEQUEO_INVENTARIO;
GRANT SELECT,DELETE ON COSTOS TO PROCEDURE CHEQUEO_INVENTARIO;
GRANT SELECT,DELETE ON EXISTENCIA TO PROCEDURE CHEQUEO_INVENTARIO;
GRANT SELECT,UPDATE ON MOVIMIENTO_ARTICULO TO PROCEDURE CHEQUEO_INVENTARIO;
GRANT EXECUTE ON PROCEDURE ACTUALICE_COSTO TO PROCEDURE CHEQUEO_INVENTARIO;
GRANT EXECUTE ON PROCEDURE SUME_EXISTENCIA TO PROCEDURE CHEQUEO_INVENTARIO;
GRANT EXECUTE ON PROCEDURE RESTE_EXISTENCIA TO PROCEDURE CHEQUEO_INVENTARIO;

SET TERM ^ ;

CREATE OR ALTER TRIGGER LOTES_AI FOR LOTES
ACTIVE AFTER INSERT POSITION 0
AS
BEGIN
  /* INSERTE UNA EXISTENCIA DEL LOTE EN LA FECHA */
  INSERT INTO EXISTENCIA_LOTE (ARTI_COD, BODE_COD, LOTE_NRO, EXLO_FECHA, EXLO_SAL, EXLO_SALDO)
    VALUES (NEW.ARTI_COD, NEW.bode_cod, NEW.lote_nro, NEW.lote_fecha, 0, NEW.lote_cant);
END
^

SET TERM ; ^

GRANT UPDATE,REFERENCES ON LOTES TO TRIGGER LOTES_AI;
GRANT INSERT ON EXISTENCIA_LOTE TO TRIGGER LOTES_AI;

SET TERM ^ ;

CREATE OR ALTER TRIGGER LOTES_BD FOR LOTES
ACTIVE BEFORE DELETE POSITION 0
AS
declare variable SUMA NUMERIC(15,4);
BEGIN
  /* CUANDO LO INTENTEN BORRAR MIRE QUE NO TENGA SALIDAS */
  SUMA = 0;
  SELECT SUM(EXLO_SAL) FROM EXISTENCIA_LOTE WHERE ARTI_COD = OLD.ARTI_COD AND BODE_COD = OLD.bode_cod AND LOTE_NRO = OLD.LOTE_NRO INTO :SUMA;
  if ((SUMA IS NULL) or (SUMA = 0)) then
    DELETE FROM EXISTENCIA_LOTE
        WHERE ARTI_COD = OLD.ARTI_COD AND BODE_COD = OLD.bode_cod AND LOTE_NRO = OLD.LOTE_NRO;
  ELSE
    EXCEPTION lote_con_movimientos 'El Articulo ' || old.arti_cod || ' con lote ' || old.lote_nro || ' tiene salidas registradas en la bodega ' || old.bode_cod;
END
^

SET TERM ; ^

GRANT UPDATE,REFERENCES ON LOTES TO TRIGGER LOTES_BD;
GRANT SELECT,DELETE ON EXISTENCIA_LOTE TO TRIGGER LOTES_BD;

SET TERM ^ ;

CREATE OR ALTER TRIGGER MOVIMIENTO_ARTICULO_AI FOR MOVIMIENTO_ARTICULO
ACTIVE AFTER INSERT POSITION 0
AS
declare variable EXISTE CHAR(1);
declare variable LOTE CHAR(1);
BEGIN
  /* INSERTE EL NUEVO LOTE */
  SELECT ARTI_EXIST FROM ARTICULO WHERE ARTICULO.ARTI_COD = NEW.ARTI_COD INTO :LOTE;
  /* ACTUALICE COSTOS cuando no es transferencia */
  if (new.mvar_tipodoc <> 13) then
      BEGIN
      EXECUTE PROCEDURE actualice_costo(new.arti_cod, new.mvar_fecha, new.mvar_costo, new.mvar_cant, new.mvar_entrada, 'N', new.mvar_cons, new.mvar_tipodoc);
      EXECUTE PROCEDURE chequeo_costos(NEW.arti_cod, NEW.mvar_fecha);
      END
  /* actualice existencias */
  if (new.mvar_entrada = 'S') then
    BEGIN
    execute procedure sume_existencia(new.arti_cod, new.bode_cod, new.mvar_fecha, new.mvar_cant, 'N');
    if (LOTE = 'L') then
        BEGIN
        if (NEW.MVAR_LOTE IS NULL) then
            EXCEPTION LOTE_OBLIGATORIO 'Debe especificar un número de lote para el articulo ' || new.arti_cod;
        ELSE
         BEGIN
         EXISTE = 'N';
         SELECT 'S' FROM LOTES WHERE ARTI_COD = NEW.ARTI_COD AND BODE_COD = NEW.bode_cod AND LOTE_NRO = new.mvar_lote INTO :EXISTE;
         if (EXISTE = 'S') then
            UPDATE LOTES
             set lote_saldo = lote_saldo + new.mvar_cant
              where (arti_cod = NEW.ARTI_COD) and (BODE_COD = NEW.bode_cod) and (lote_nro = new.mvar_lote);
         ELSE
            INSERT INTO LOTES (ARTI_COD, BODE_COD, LOTE_NRO, LOTE_FECHA, LOTE_CANT, LOTE_COSTO, LOTE_SALDO)
                VALUES (NEW.ARTI_COD, NEW.bode_cod, NEW.mvar_lote, NEW.mvar_fecha, NEW.mvar_cant, NEW.mvar_costo, NEW.mvar_cant);
         END
        END
    END
  else
    BEGIN
    execute procedure reste_existencia(new.arti_cod, new.bode_cod, new.mvar_fecha, new.mvar_cant, 'N');
    /* ACTUALICE LA EXISTENCIA DEL LOTE */
    if (LOTE = 'L') then
    if (NEW.mvar_lote IS NULL) then
        EXCEPTION LOTE_NEGATIVO 'Debe indicar un número de lote para el artículo ' || new.arti_cod;
    ELSE
        BEGIN
        /* Actualice el saldo historico del lote */
        EXISTE = 'N';
        SELECT 'S' FROM EXISTENCIA_LOTE WHERE LOTE_NRO = NEW.MVAR_LOTE AND EXLO_FECHA = NEW.MVAR_FECHA AND ARTI_COD = NEW.arti_cod AND BODE_COD = NEW.bode_cod INTO :EXISTE;
        if (EXISTE = 'S') then
            BEGIN
            UPDATE EXISTENCIA_LOTE
                SET EXLO_SAL = EXLO_SAL + NEW.mvar_cant
                WHERE LOTE_NRO = NEW.MVAR_LOTE AND EXLO_FECHA = NEW.MVAR_FECHA AND ARTI_COD = NEW.ARTI_COD AND BODE_COD = NEW.bode_cod;
            END
        ELSE
            BEGIN
            INSERT INTO EXISTENCIA_LOTE (ARTI_COD, BODE_COD, LOTE_NRO, EXLO_FECHA, EXLO_SAL)
                VALUES (NEW.ARTI_COD, NEW.bode_cod, NEW.MVAR_LOTE, NEW.MVAR_FECHA, NEW.MVAR_CANT);
            END
        UPDATE LOTES
            set lote_saldo = lote_saldo - new.mvar_cant
            where (arti_cod = NEW.ARTI_COD) and (BODE_COD = NEW.bode_cod) and (lote_nro = new.mvar_lote);
        END
    END
END
^

SET TERM ; ^

GRANT UPDATE,REFERENCES ON MOVIMIENTO_ARTICULO TO TRIGGER MOVIMIENTO_ARTICULO_AI;
GRANT SELECT ON ARTICULO TO TRIGGER MOVIMIENTO_ARTICULO_AI;
GRANT EXECUTE ON PROCEDURE ACTUALICE_COSTO TO TRIGGER MOVIMIENTO_ARTICULO_AI;
GRANT EXECUTE ON PROCEDURE CHEQUEO_COSTOS TO TRIGGER MOVIMIENTO_ARTICULO_AI;
GRANT EXECUTE ON PROCEDURE SUME_EXISTENCIA TO TRIGGER MOVIMIENTO_ARTICULO_AI;
GRANT SELECT,INSERT,UPDATE ON LOTES TO TRIGGER MOVIMIENTO_ARTICULO_AI;
GRANT EXECUTE ON PROCEDURE RESTE_EXISTENCIA TO TRIGGER MOVIMIENTO_ARTICULO_AI;
GRANT SELECT,INSERT,UPDATE ON EXISTENCIA_LOTE TO TRIGGER MOVIMIENTO_ARTICULO_AI;

SET TERM ^ ;

CREATE OR ALTER TRIGGER TI_EXISTENCIA_LOTE FOR EXISTENCIA_LOTE
ACTIVE BEFORE INSERT POSITION 0
AS
DECLARE VARIABLE NUMROWS INTEGER;
BEGIN
    /*  PARENT 'LOTES' MUST EXIST WHEN INSERTING A CHILD IN 'EXISTENCIA_LOTE'  */
    IF (NEW.ARTI_COD IS NOT NULL AND
        NEW.bode_cod IS NOT NULL AND
        NEW.LOTE_NRO IS NOT NULL) THEN
    BEGIN
       SELECT COUNT(*)
       FROM   LOTES
       WHERE  LOTES.ARTI_COD = NEW.ARTI_COD
        AND   LOTES.bode_cod = NEW.bode_cod
        AND   LOTES.LOTE_NRO = NEW.LOTE_NRO
       INTO   :NUMROWS;
       IF (NUMROWS = 0) THEN
       BEGIN
          EXCEPTION LOTE_NO_EXISTE 'No se encontró el numero de lote ' || new.lote_nro || ' para el artículo ' || new.arti_cod || ' en la bodega ' || new.bode_cod;
       END
    END
END
^

SET TERM ; ^

GRANT UPDATE,REFERENCES ON EXISTENCIA_LOTE TO TRIGGER TI_EXISTENCIA_LOTE;
GRANT SELECT ON LOTES TO TRIGGER TI_EXISTENCIA_LOTE;

SET TERM ^ ;

CREATE OR ALTER PROCEDURE EXISTENCIAS_DESDE_HASTA(
    FECHA DATE,
    ARTINI VARCHAR(20),
    ARTFIN VARCHAR(20),
    GRPINI VARCHAR(3),
    GRPFIN VARCHAR(3),
    BODINI VARCHAR(2),
    BODFIN VARCHAR(2),
    ORDEN CHAR(1),
    AGRUPA CHAR(1),
    DETALLE CHAR(1),
    RESERVA CHAR(1),
    SUCURSAL INTEGER)
RETURNS (
    CANT NUMERIC(18,4),
    COSTO NUMERIC(18,2),
    COSTO_LOTE NUMERIC(18,2),
    CODIGO VARCHAR(15),
    NOMBRE VARCHAR(60),
    UNIDAD VARCHAR(8),
    STAND VARCHAR(15),
    CODGRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    CODSUBG VARCHAR(3),
    NOMSUBG VARCHAR(30),
    CODMARC VARCHAR(3),
    NOMMARC VARCHAR(30),
    CODBOD VARCHAR(2),
    LOTE VARCHAR(15),
    NOMBOD VARCHAR(30),
    COSTOTOT NUMERIC(18,2),
    ULTCOSTO NUMERIC(18,2),
    FECHACOSTO DATE,
    CONSUMO NUMERIC(18,2),
    RESERVADO NUMERIC(18,4),
    ORDENADO NUMERIC(18,4),
    IVA NUMERIC(9,2),
    CODBAR VARCHAR(20))
AS
declare variable exist char(1);
declare variable codini varchar(20);
declare variable codfin varchar(20);
declare variable desini varchar(20);
declare variable desfin varchar(20);
declare variable ordenc numeric(18,4);
declare variable pedido numeric(18,4);
declare variable ok char(1);
declare variable id integer;
declare variable item integer;
declare variable und varchar(8);
declare variable factor numeric(18,4);
declare variable cant2 numeric(18,4);
declare variable PEDAUTO CHAR(2);
BEGIN
if (ORDEN = 'C') then
    BEGIN
    CODINI = ARTINI;
    CODFIN = ARTFIN;
    DESINI = '';
    DESFIN = 'zz';
    END
ELSE
    BEGIN
    DESINI = ARTINI;
    DESFIN = ARTFIN;
    CODINI = '';
    CODFIN = 'zz';
    END
EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION', 'FACTURAS', 'GENERAR PEDIDO AUTOMATICAMENTE CON LA FACTURA') returning_values (pedauto);
if (DETALLE = 'B') then
  BEGIN
  FOR SELECT ARTI_COD, ARTI_DES, ARTI_UNIDAD, ARTI_EXIST, TAIV_PORC, A.GRUP_COD, A.SUBG_COD, A.MARC_COD, BODE_COD, BODE_NOM, ARTI_CONSUMO
      FROM ARTICULO A, BODEGA B, TARIFA_IVA T
      WHERE ARTI_COD >= :CODINI AND ARTI_COD <= :CODFIN AND ARTI_DES >= :DESINI AND ARTI_DES <= :DESFIN AND ESAR_COD <> 'I' AND BODE_COD >= :BODINI AND
      BODE_COD <= :BODFIN AND ((SUCU_ID = :SUCURSAL) or (:SUCURSAL = 0)) AND A.TAIV_COD = T.TAIV_COD
      INTO :CODIGO, :NOMBRE, :UNIDAD, :EXIST, :IVA, :CODGRUPO, :CODSUBG, :CODMARC, :CODBOD, :NOMBOD, :CONSUMO
      DO
        BEGIN
        OK = 'N';
        if (AGRUPA = 'G') then
            BEGIN
            if ((CODGRUPO >= GRPINI) AND (CODGRUPO <= GRPFIN)) then
                OK = 'S';
            end
        ELSE
            if (AGRUPA = 'M') then
                BEGIN
                if ((CODMARC >= GRPINI) AND (CODMARC <= GRPFIN)) then
                    OK = 'S';
                END
        if (OK = 'S') then
            BEGIN
            NOMGRUPO = '';
            NOMMARC = '';
            NOMSUBG = '';
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            SELECT MAX(COBA_COD) FROM BARRAS_ARTICULO WHERE ARTI_COD = :codigo AND COBA_UNIDAD = :unidad INTO :codbar;
            if (CODBAR IS NULL) then
                CODBAR = CODIGO;
            if (EXIST <> 'N') then
                BEGIN
                SELECT MAX(EXIS_STAND) FROM EXISTENCIA WHERE ARTI_COD = :CODIGO AND BODE_COD = :CODBOD INTO :STAND;
                EXECUTE PROCEDURE SALDO_INICIAL_INVENTARIO(CODIGO, FECHA, :CODBOD) returning_values (CANT);
                EXECUTE PROCEDURE COSTO_PROMEDIO_UNIDAD(CODIGO, FECHA, UNIDAD) returning_values (COSTO);
                EXECUTE PROCEDURE ULTIMO_COSTO(CODIGO, FECHA, UNIDAD) returning_values (ULTCOSTO);
                SELECT MAX(MVAR_FECHA) FROM MOVIMIENTO_ARTICULO WHERE ARTI_COD = :CODIGO AND MVAR_ENTRADA = 'S' AND MVAR_FECHA <= :FECHA INTO :FECHACOSTO;
                COSTOTOT = :CANT * :COSTO;
                CONSUMO = CONSUMO * CANT;
                if (RESERVA = 'S') then
                    BEGIN
                    SELECT SUM(ORID_ENTREGAR)
                        FROM ORDENINVENTARIO_DETALLE OD, ordenes_inventario O
                        WHERE O.ORIN_ID = OD.ORIN_ID AND ARTI_COD = :CODIGO AND ORIN_FECHA <= :FECHA AND ORIN_FECLLEGA >= :FECHA AND ORID_ANULADO = 'N' AND OD.BODE_COD = :CODBOD
                        INTO :ORDENADO;
                    if (ORDENADO IS NULL) then
                        ORDENADO = 0;
                    ORDENC = 0;
                    FOR SELECT O.ORDC_ID, OCDE_ITEM, OCDE_CANT * OCDE_FACTOR
                        FROM ORDENES_COMPRA O, ORDENES_COMPRA_DETALLE OD
                        WHERE O.ORDC_ID = OD.ORDC_ID AND OD.ARTI_COD = :CODIGO AND (ORDC_FECHA+ORDC_VALIDEZ) >= :FECHA AND ORDC_FECHA <= :FECHA AND OCDE_ANULADO = 'N' AND OD.BODE_COD = :CODBOD
                        INTO :ID, :ITEM, :CANT2
                        do
                        BEGIN
                        EXECUTE PROCEDURE FALTANTE(23, 21, ID, ITEM) returning_values (PEDIDO, UND, FACTOR);
                        if (PEDIDO * FACTOR = CANT2) then /* SI NO SE HA FACTURADO MIRE A VER SI SE REMISIONO */
                            EXECUTE PROCEDURE FALTANTE(23, 22, ID, ITEM) returning_values (PEDIDO, UND, FACTOR);
                        if (PEDIDO IS NULL) then
                            PEDIDO = 0;
                        ORDENC = ORDENC + PEDIDO * FACTOR;
                        END
                    ORDENADO = ORDENADO + ORDENC;
                    SELECT SUM(RSDE_LIBERAR)
                        FROM RESERVAS_DETALLE RD, RESERVAS R
                        WHERE R.RESE_ID = RD.RESE_ID AND ARTI_COD = :CODIGO AND RESE_FECHA <= :FECHA AND RESE_VENCE >= :FECHA AND RD.BODE_COD = :CODBOD AND RSDE_ANULADO = 'N'
                        INTO :RESERVADO;
                    if (RESERVADO IS NULL) then
                        RESERVADO = 0;
                    PEDIDO = 0;
                    FOR SELECT P.PEDI_ID, PEDE_ITEM, PEDE_CANT * PEDE_FACTOR
                        FROM PEDIDOS P, PEDIDOS_DETALLE PD
                        WHERE P.PEDI_ID = PD.PEDI_ID AND PD.ARTI_COD = :CODIGO AND (PEDI_FECHA+PEDI_VALIDEZ) >= :FECHA AND PEDI_FECHA <= :FECHA AND PEDE_ANULADO = 'N' AND BODE_COD = :CODBOD
                        INTO :ID, :ITEM, :CANT2
                        do
                        BEGIN
                        EXECUTE PROCEDURE FALTANTE(34, 31, ID, ITEM) returning_values (ORDENC, UND, FACTOR);
                        if ((ORDENC * FACTOR = CANT2) or (PEDAUTO = 'SI')) then /* SI NO SE HA FACTURADO MIRE A VER SI SE REMISIONO */
                            EXECUTE PROCEDURE FALTANTE(34, 32, ID, ITEM) returning_values (ORDENC, UND, FACTOR);
                        if (ORDENC IS NULL) then
                            ORDENC = 0;
                        PEDIDO = PEDIDO + ORDENC * FACTOR;
                        END
                    RESERVADO = RESERVADO + PEDIDO;
                    END
                ELSE
                    BEGIN
                    RESERVADO = 0;
                    ORDENADO = 0;
                    END
                SUSPEND;
                END
            END
        END
  END

if (DETALLE = 'L') then
  BEGIN
  FOR SELECT A.ARTI_COD, ARTI_DES, ARTI_UNIDAD, ARTI_EXIST, TAIV_PORC, A.GRUP_COD, A.SUBG_COD, A.MARC_COD, L.lote_nro, L.lote_nro||' - '||L.lote_vence, ARTI_CONSUMO,l.bode_cod, L.lote_saldo,l.lote_costo
      FROM ARTICULO A, LOTES l, TARIFA_IVA T
      WHERE A.ARTI_COD >= '0' AND A.ARTI_COD <= 'zz' AND ARTI_DES >= '' AND ARTI_DES <= 'zz' AND ESAR_COD <> 'I' AND A.TAIV_COD = T.TAIV_COD and a.arti_cod = l.arti_cod
      INTO :CODIGO, :NOMBRE, :UNIDAD, :EXIST, :IVA, :CODGRUPO, :CODSUBG, :CODMARC, :LOTE, :NOMBOD, :CONSUMO, :codbod, :cant, :costo_lote
      DO
        BEGIN
        OK = 'N';
        if (AGRUPA = 'G') then
            BEGIN
            if ((CODGRUPO >= GRPINI) AND (CODGRUPO <= GRPFIN)) then
                OK = 'S';
            end
        ELSE
            if (AGRUPA = 'M') then
                BEGIN
                if ((CODMARC >= GRPINI) AND (CODMARC <= GRPFIN)) then
                    OK = 'S';
                END
        if (OK = 'S') then
            BEGIN
            NOMGRUPO = '';
            NOMMARC = '';
            NOMSUBG = '';
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            SELECT MAX(COBA_COD) FROM BARRAS_ARTICULO WHERE ARTI_COD = :codigo AND COBA_UNIDAD = :unidad INTO :codbar;
            if (CODBAR IS NULL) then
                CODBAR = CODIGO;

            if (EXIST <> 'N') then
                BEGIN
                EXECUTE PROCEDURE COSTO_PROMEDIO_UNIDAD(CODIGO, FECHA, UNIDAD) returning_values (COSTO);
                EXECUTE PROCEDURE ULTIMO_COSTO(CODIGO, FECHA, UNIDAD) returning_values (ULTCOSTO);
                SELECT MAX(MVAR_FECHA) FROM MOVIMIENTO_ARTICULO WHERE ARTI_COD = :CODIGO AND MVAR_ENTRADA = 'S' AND MVAR_FECHA <= :FECHA INTO :FECHACOSTO;
                COSTOTOT = :CANT * :COSTO;
                CONSUMO = CONSUMO * CANT;
                if (RESERVA = 'S') then
                    BEGIN
                    SELECT SUM(ORID_ENTREGAR)
                        FROM ORDENINVENTARIO_DETALLE OD, ordenes_inventario O
                        WHERE O.ORIN_ID = OD.ORIN_ID AND ARTI_COD = :CODIGO AND ORIN_FECHA <= :FECHA AND ORIN_FECLLEGA >= :FECHA AND ORID_ANULADO = 'N'
                        INTO :ORDENADO;
                    if (ORDENADO IS NULL) then
                        ORDENADO = 0;
                    ORDENC = 0;
                    FOR SELECT O.ORDC_ID, OCDE_ITEM, OCDE_CANT * OCDE_FACTOR
                        FROM ORDENES_COMPRA O, ORDENES_COMPRA_DETALLE OD
                        WHERE O.ORDC_ID = OD.ORDC_ID AND OD.ARTI_COD = :CODIGO AND (ORDC_FECHA+ORDC_VALIDEZ) >= :FECHA AND ORDC_FECHA <= :FECHA AND OCDE_ANULADO = 'N'
                        INTO :ID, :ITEM, :CANT2
                        do
                        BEGIN
                        EXECUTE PROCEDURE FALTANTE(23, 21, ID, ITEM) returning_values (PEDIDO, UND, FACTOR);
                        if (PEDIDO * FACTOR = CANT2) then /* SI NO SE HA FACTURADO MIRE A VER SI SE REMISIONO */
                            EXECUTE PROCEDURE FALTANTE(23, 22, ID, ITEM) returning_values (PEDIDO, UND, FACTOR);
                        if (PEDIDO IS NULL) then
                            PEDIDO = 0;
                        ORDENC = ORDENC + PEDIDO * FACTOR;
                        END
                    ORDENADO = ORDENADO + ORDENC;
                    SELECT SUM(RSDE_LIBERAR)
                        FROM RESERVAS_DETALLE RD, RESERVAS R
                        WHERE R.RESE_ID = RD.RESE_ID AND ARTI_COD = :CODIGO AND RESE_FECHA <= :FECHA AND RESE_VENCE >= :FECHA AND RSDE_ANULADO = 'N'
                        INTO :RESERVADO;
                    if (RESERVADO IS NULL) then
                        RESERVADO = 0;
                    PEDIDO = 0;
                    FOR SELECT P.PEDI_ID, PEDE_ITEM, PEDE_CANT * PEDE_FACTOR
                        FROM PEDIDOS P, PEDIDOS_DETALLE PD
                        WHERE P.PEDI_ID = PD.PEDI_ID AND PD.ARTI_COD = :CODIGO AND (PEDI_FECHA+PEDI_VALIDEZ) >= :FECHA AND PEDI_FECHA <= :FECHA AND PEDE_ANULADO = 'N'
                        INTO :ID, :ITEM, :CANT2
                        do
                        BEGIN
                        EXECUTE PROCEDURE FALTANTE(34, 31, ID, ITEM) returning_values (ORDENC, UND, FACTOR);
                        if ((ORDENC * FACTOR = CANT2) or (PEDAUTO = 'SI')) then /* SI NO SE HA FACTURADO MIRE A VER SI SE REMISIONO */
                            EXECUTE PROCEDURE FALTANTE(34, 32, ID, ITEM) returning_values (ORDENC, UND, FACTOR);
                        if (ORDENC IS NULL) then
                            ORDENC = 0;
                        PEDIDO = PEDIDO + ORDENC * FACTOR;
                        END
                    RESERVADO = RESERVADO + PEDIDO;
                    END
                ELSE
                    BEGIN
                    RESERVADO = 0;
                    ORDENADO = 0;
                    END
                SUSPEND;
                END
            END
        END
  end
if (DETALLE = 'N') then
  BEGIN
  FOR SELECT ARTI_COD, ARTI_DES, ARTI_UNIDAD, ARTI_EXIST, TAIV_PORC, A.GRUP_COD, A.SUBG_COD, A.MARC_COD, ARTI_CONSUMO
      FROM ARTICULO A, TARIFA_IVA T
      WHERE ARTI_COD >= :CODINI AND ARTI_COD <= :CODFIN AND ARTI_DES >= :DESINI AND ARTI_DES <= :DESFIN AND ESAR_COD <> 'I' AND A.TAIV_COD = T.TAIV_COD
      INTO :CODIGO, :NOMBRE, :UNIDAD, :EXIST, :IVA, :CODGRUPO, :CODSUBG, :CODMARC, :CONSUMO
      DO
        BEGIN
        OK = 'N';
        if (AGRUPA = 'G') then
            BEGIN
            if ((GRPINI = '0') AND (GRPFIN = 'zz')) then
                OK = 'S';
            else
                if ((CODGRUPO >= GRPINI) AND (CODGRUPO <= GRPFIN)) then
                    OK = 'S';
            end
        ELSE
            if (AGRUPA = 'M') then
                BEGIN
                if ((GRPINI = '0') AND (GRPFIN = 'zzz')) then
                    OK = 'S';
                else
                    if ((CODMARC >= GRPINI) AND (CODMARC <= GRPFIN)) then
                        OK = 'S';
                END
        if (OK = 'S') then
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            SELECT MAX(COBA_COD) FROM BARRAS_ARTICULO WHERE ARTI_COD = :codigo AND COBA_UNIDAD = :unidad INTO :codbar;
            if (CODBAR IS NULL) then
                CODBAR = CODIGO;

            if (EXIST <> 'N') then
                BEGIN
                EXECUTE PROCEDURE SALDO_INICIAL_TOTAL_INV(CODIGO, FECHA) returning_values (CANT);
                EXECUTE PROCEDURE COSTO_PROMEDIO_UNIDAD(CODIGO, FECHA, UNIDAD) returning_values (COSTO);
                EXECUTE PROCEDURE ULTIMO_COSTO(CODIGO, FECHA, UNIDAD) returning_values (ULTCOSTO);
                SELECT MAX(MVAR_FECHA) FROM MOVIMIENTO_ARTICULO WHERE ARTI_COD = :CODIGO AND MVAR_ENTRADA = 'S' AND MVAR_FECHA <= :FECHA INTO :FECHACOSTO;
                COSTOTOT = :CANT * :COSTO;
                CONSUMO = CONSUMO * CANT;
                if (RESERVA = 'S') then
                    BEGIN
                    SELECT SUM(ORID_ENTREGAR)
                        FROM ORDENINVENTARIO_DETALLE OD, ordenes_inventario O
                        WHERE O.ORIN_ID = OD.ORIN_ID AND ARTI_COD = :CODIGO AND ORIN_FECHA <= :FECHA AND ORIN_FECLLEGA >= :FECHA AND ORID_ANULADO = 'N'
                        INTO :ORDENADO;
                        if (ORDENADO IS NULL) then
                            ORDENADO = 0;
                    ORDENC = 0;
                    FOR SELECT O.ORDC_ID, OCDE_ITEM, OCDE_CANT * OCDE_FACTOR
                        FROM ORDENES_COMPRA O, ORDENES_COMPRA_DETALLE OD
                        WHERE O.ORDC_ID = OD.ORDC_ID AND OD.ARTI_COD = :CODIGO AND (ORDC_FECHA+ORDC_VALIDEZ) >= :FECHA AND ORDC_FECHA <= :FECHA AND OCDE_ANULADO = 'N'
                        INTO :ID, :ITEM, :CANT2
                        do
                        BEGIN
                        EXECUTE PROCEDURE FALTANTE(23, 21, ID, ITEM) returning_values (PEDIDO, UND, FACTOR);
                        if (PEDIDO * FACTOR = CANT2) then /* SI NO SE HA FACTURADO MIRE A VER SI SE REMISIONO */
                            EXECUTE PROCEDURE FALTANTE(23, 22, ID, ITEM) returning_values (PEDIDO, UND, FACTOR);
                        if (PEDIDO IS NULL) then
                            PEDIDO = 0;
                        ORDENC = ORDENC + PEDIDO * FACTOR;
                        END
                    ORDENADO = ORDENADO + ORDENC;
                    SELECT SUM(RSDE_LIBERAR)
                        FROM RESERVAS_DETALLE RD, RESERVAS R
                        WHERE R.RESE_ID = RD.RESE_ID AND ARTI_COD = :CODIGO AND RESE_FECHA <= :FECHA AND RESE_VENCE >= :FECHA AND RSDE_ANULADO = 'N'
                        INTO :RESERVADO;
                    if (RESERVADO IS NULL) then
                        RESERVADO = 0;
                    PEDIDO = 0;
                    FOR SELECT P.PEDI_ID, PEDE_ITEM, PEDE_CANT * PEDE_FACTOR
                        FROM PEDIDOS P, PEDIDOS_DETALLE PD, PUNTO_VENTA PT
                        WHERE P.PEDI_ID = PD.PEDI_ID AND PD.ARTI_COD = :CODIGO AND PT.ptvt_id = P.PTVT_ID AND (PEDI_FECHA+PEDI_VALIDEZ) >= :FECHA AND PEDI_FECHA <= :FECHA AND PEDE_ANULADO = 'N'
                        INTO :ID, :ITEM, :CANT2
                        do
                        BEGIN
                        EXECUTE PROCEDURE FALTANTE(34, 31, ID, ITEM) returning_values (ORDENC, UND, FACTOR);
                        if ((ORDENC * FACTOR = CANT2) or (PEDAUTO = 'SI')) then /* SI NO SE HA FACTURADO MIRE A VER SI SE REMISIONO */
                            EXECUTE PROCEDURE FALTANTE(34, 32, ID, ITEM) returning_values (ORDENC, UND, FACTOR);
                        if (ORDENC IS NULL) then
                            ORDENC = 0;
                        PEDIDO = PEDIDO + ORDENC * FACTOR;
                        END
                    if (PEDIDO IS NULL) then
                        PEDIDO = 0;
                    RESERVADO = RESERVADO + PEDIDO;
                    END
                ELSE
                    BEGIN
                    RESERVADO = 0;
                    ORDENADO = 0;
                    END
                SUSPEND;
                END
            END
        END
  END
END
^

SET TERM ; ^

GRANT EXECUTE ON PROCEDURE LEE_CONFIGURACION TO PROCEDURE EXISTENCIAS_DESDE_HASTA;
GRANT SELECT ON ARTICULO TO PROCEDURE EXISTENCIAS_DESDE_HASTA;
GRANT SELECT ON BODEGA TO PROCEDURE EXISTENCIAS_DESDE_HASTA;
GRANT SELECT ON TARIFA_IVA TO PROCEDURE EXISTENCIAS_DESDE_HASTA;
GRANT SELECT ON GRUPO TO PROCEDURE EXISTENCIAS_DESDE_HASTA;
GRANT SELECT ON MARCAS TO PROCEDURE EXISTENCIAS_DESDE_HASTA;
GRANT SELECT ON SUBGRUPO TO PROCEDURE EXISTENCIAS_DESDE_HASTA;
GRANT SELECT ON BARRAS_ARTICULO TO PROCEDURE EXISTENCIAS_DESDE_HASTA;
GRANT SELECT ON EXISTENCIA TO PROCEDURE EXISTENCIAS_DESDE_HASTA;
GRANT EXECUTE ON PROCEDURE SALDO_INICIAL_INVENTARIO TO PROCEDURE EXISTENCIAS_DESDE_HASTA;
GRANT EXECUTE ON PROCEDURE COSTO_PROMEDIO_UNIDAD TO PROCEDURE EXISTENCIAS_DESDE_HASTA;
GRANT EXECUTE ON PROCEDURE ULTIMO_COSTO TO PROCEDURE EXISTENCIAS_DESDE_HASTA;
GRANT SELECT ON MOVIMIENTO_ARTICULO TO PROCEDURE EXISTENCIAS_DESDE_HASTA;
GRANT SELECT ON ORDENINVENTARIO_DETALLE TO PROCEDURE EXISTENCIAS_DESDE_HASTA;
GRANT SELECT ON ORDENES_INVENTARIO TO PROCEDURE EXISTENCIAS_DESDE_HASTA;
GRANT SELECT ON ORDENES_COMPRA TO PROCEDURE EXISTENCIAS_DESDE_HASTA;
GRANT SELECT ON ORDENES_COMPRA_DETALLE TO PROCEDURE EXISTENCIAS_DESDE_HASTA;
GRANT EXECUTE ON PROCEDURE FALTANTE TO PROCEDURE EXISTENCIAS_DESDE_HASTA;
GRANT SELECT ON RESERVAS_DETALLE TO PROCEDURE EXISTENCIAS_DESDE_HASTA;
GRANT SELECT ON RESERVAS TO PROCEDURE EXISTENCIAS_DESDE_HASTA;
GRANT SELECT ON PEDIDOS TO PROCEDURE EXISTENCIAS_DESDE_HASTA;
GRANT SELECT ON PEDIDOS_DETALLE TO PROCEDURE EXISTENCIAS_DESDE_HASTA;
GRANT SELECT ON LOTES TO PROCEDURE EXISTENCIAS_DESDE_HASTA;
GRANT EXECUTE ON PROCEDURE SALDO_INICIAL_TOTAL_INV TO PROCEDURE EXISTENCIAS_DESDE_HASTA;
GRANT SELECT ON PUNTO_VENTA TO PROCEDURE EXISTENCIAS_DESDE_HASTA;

SET TERM ^ ;

CREATE OR ALTER PROCEDURE IMPR_FACTURA(
    ID INTEGER)
RETURNS (
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    VENCE DATE,
    DIASVENCE INTEGER,
    CONTCRED CHAR(17),
    NIT VARCHAR(20),
    NOMTERCERO VARCHAR(60),
    VENDEDOR INTEGER,
    NOMVENDEDOR VARCHAR(60),
    PUNTOVTA INTEGER,
    NOMPUNTOVTA VARCHAR(30),
    CODBODEGA VARCHAR(2),
    NOMBODEGA VARCHAR(30),
    AUTORIZACION VARCHAR(20),
    DESPACHO VARCHAR(255),
    TRANSPORTADOR VARCHAR(60),
    COTIZACION VARCHAR(30),
    PEDIDO VARCHAR(30),
    REMISION VARCHAR(30),
    PACIENTE VARCHAR(20),
    NOMPACIENTE VARCHAR(60),
    COMIPORC NUMERIC(9,2),
    COMIMONTO NUMERIC(18,2),
    SUBTOTAL NUMERIC(18,2),
    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),
    EXTRA NUMERIC(18,2),
    DTOFPORC NUMERIC(9,2),
    DTOFMONTO NUMERIC(18,2),
    FECHADTO DATE,
    TOTALFAC NUMERIC(18,2),
    TOTALPAGAR NUMERIC(18,2),
    OBS BLOB SUB_TYPE 1 SEGMENT SIZE 80,
    ITEM INTEGER,
    ARTICULO VARCHAR(15),
    CODBAR VARCHAR(15),
    ARTIDES VARCHAR(60),
    CANT NUMERIC(18,4),
    LOTE VARCHAR(15),
    VLOTE DATE,
    UNIDAD VARCHAR(8),
    FACTOR INTEGER,
    LISTAPR INTEGER,
    REFITEM VARCHAR(60),
    BODITEM VARCHAR(2),
    PRUNIT NUMERIC(18,2),
    DTOITPORC NUMERIC(9,2),
    DTOITMONTO NUMERIC(18,2),
    PRNETO NUMERIC(18,2),
    IVAPORC NUMERIC(9,2),
    IVAITMONTO NUMERIC(18,2),
    CONSUMO NUMERIC(18,2),
    SUBTOTIT NUMERIC(18,2),
    SUBTOTITCON NUMERIC(18,2),
    TOTAL NUMERIC(18,2),
    CODIGOCL VARCHAR(20),
    ZONACOD VARCHAR(2),
    ZONANOM VARCHAR(60),
    DV CHAR(1),
    DIRECCION VARCHAR(60),
    CIUDAD VARCHAR(40),
    TELEFONO VARCHAR(40),
    CONTACTO VARCHAR(60),
    FAX VARCHAR(25),
    GRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    SUBGRUPO VARCHAR(3),
    NOMSUBG VARCHAR(30),
    MARCA VARCHAR(3),
    NOMMARCA VARCHAR(30),
    PESO NUMERIC(18,4),
    ANCHO NUMERIC(18,4),
    ALTO NUMERIC(18,4),
    LARGO NUMERIC(18,4),
    SUMA1 NUMERIC(18,2),
    SUMA2 NUMERIC(18,2),
    SUMA3 NUMERIC(18,2),
    IVA1 NUMERIC(18,2),
    IVA2 NUMERIC(18,2),
    IVA3 NUMERIC(18,2),
    SUMAEX NUMERIC(18,2),
    SUMAGR NUMERIC(18,2),
    TOTCONSUMO NUMERIC(18,2),
    VEHICULO VARCHAR(8),
    RECIBIDO NUMERIC(18,2),
    CAMBIO NUMERIC(18,2),
    HORA TIME,
    FORMAPAGO1 VARCHAR(30),
    MONTOPAGO1 NUMERIC(18,2),
    FORMAPAGO2 VARCHAR(30),
    MONTOPAGO2 NUMERIC(18,2),
    FORMAPAGO3 VARCHAR(30),
    MONTOPAGO3 NUMERIC(18,2),
    PUNTOS INTEGER,
    PUNTOSACUM INTEGER,
    PUNTOSVENC INTEGER,
    OBSITEM BLOB SUB_TYPE 1 SEGMENT SIZE 80)
AS
DECLARE VARIABLE IMPTOS CHAR(1);
DECLARE VARIABLE TARIFA INTEGER;
declare variable DEVUELTO NUMERIC(18,2);
/*DECLARE VARIABLE NROCOPIA INTEGER;*/
declare variable ORDENCOD CHAR(2);
declare variable IMPRDEV CHAR(2);
declare variable IMPR CHAR(1);
declare variable ITEMFP INTEGER;
declare variable FORMAP VARCHAR(30);
declare variable MONTOP NUMERIC(18,2);
declare variable SUCUR VARCHAR(10);
BEGIN
  SELECT F.PREF_PRE, FACT_NUMERO, FACT_FECHA, FACT_VENCE, F.BODE_COD, BODE_NOM, F.TERC_NIT, FACT_NOMCLIENTE, F.VEND_COD, VEND_NOMBRE, F.PTVT_ID, PTVT_NOM,
    AUTO_NUMERO, FACT_DESPACHO, FACT_TRANSP, FACT_COTIZACI, FACT_PEDIDO, FACT_REMISION, FACT_COMIPORC, FACT_COMIMONTO, FACT_IVAINC, 
    FACT_DTOPOR, FACT_DTOMONTO, FACT_ADICIONAL, FACT_IVAMONTO, FACT_RTFTEPOR, FACT_RTFTEMONTO, FACT_RTIVAPOR, FACT_RTIVAMONTO, FACT_RTICAPOR, FACT_RTICAMONTO, FACT_EXTRA, FACT_DTOFPOR, FACT_DTOFMONTO, FACT_DTOFFECHA, FACT_TOTAL,
    TERC_DIR, TERC_CIU, TERC_TEL, TERC_CONTACTO, TERC_FAX, TERC_DV,
    FACT_OBS, VEHI_COD, /*FACT_NROCOPIA,*/ FACT_RECIBIDO, FACT_SUCURSAL, FACT_DETCLI, FACT_DETCLINOM
    FROM FACTURAS F, BODEGA B, VENDEDORES V, PUNTO_VENTA P, TERCEROS T
    WHERE F.BODE_COD = B.BODE_COD AND F.VEND_COD = V.VEND_COD AND F.PTVT_ID = P.PTVT_ID AND F.TERC_NIT = T.TERC_NIT AND F.FACT_ID = :ID
    into :PREF, :NUMERO, :FECHA, :VENCE, :CODBODEGA, :NOMBODEGA, :NIT, :NOMTERCERO, :VENDEDOR, :NOMVENDEDOR, :PUNTOVTA, :NOMPUNTOVTA,
    :AUTORIZACION, :DESPACHO, :TRANSPORTADOR, :COTIZACION, :PEDIDO, :REMISION, :COMIPORC, :COMIMONTO, :IMPTOS,
    :DTOPORC, :DTOMONTO, :ADICIONAL, :IVAMONTO, :RTEFTEPORC, :RTEFTEMONTO, :RTEIVAPORC, :RTEIVAMONTO, :RTEICAPORC, :RTEICAMONTO, :EXTRA, :DTOFPORC, :DTOFMONTO, :FECHADTO, :TOTALFAC,
    :DIRECCION, :CIUDAD, :TELEFONO, :CONTACTO, :FAX, :DV, :OBS, :VEHICULO,/* :NROCOPIA,*/ :RECIBIDO, :SUCUR, :paciente, :nompaciente;

  /* ACUMULE LOS PUNTOS, SE HACE ACA POR SER POSTERIOR AL DETALLE */
  EXECUTE PROCEDURE acumula_puntos_cliente (31, :id, :nit, :fecha) returning_values (:PUNTOS);
  EXECUTE PROCEDURE consulta_puntos_cliente (:id, :nit, :fecha) returning_values (:puntos, :puntosacum, :puntosvenc);

  SELECT CLIE_COD, C.ZONA_COD, ZONA_NOM
    FROM CLIENTES C, ZONAS Z
    WHERE TERC_NIT = :NIT AND C.ZONA_COD = Z.ZONA_COD
    INTO :CODIGOCL, :ZONACOD, :ZONANOM;
  /*SELECT NOCO_NOMBRE FROM NOMBRES_COPIAS where NOCO_ID = :NROCOPIA INTO :NOMCOPIA;*/
  SELECT CLSU_DIR, CLSU_CIUDAD, CLSU_TEL FROM CLIENTE_SUCURSALES WHERE TERC_NIT = :NIT AND CLCU_COD = :SUCUR
    INTO :DIRECCION, :CIUDAD, :TELEFONO;
  /*if (NOMCOPIA IS NULL) then
    NOMCOPIA = 'COPIA No. ' || NROCOPIA;**/
  DIASVENCE = VENCE - FECHA;
  if (DIASVENCE > 0) then
    CONTCRED = 'CREDITO ' || CAST(DIASVENCE AS VARCHAR(3)) || ' DIAS';
  ELSE
    CONTCRED = 'CONTADO';
  SUBTOTAL = TOTALFAC - EXTRA - IVAMONTO - ADICIONAL + DTOMONTO;
  TOTALPAGAR = TOTALFAC - RTEFTEMONTO - RTEIVAMONTO - RTEICAMONTO;
  if (RECIBIDO <> 0) then
      CAMBIO = RECIBIDO - totalpagar;
  ELSE
    CAMBIO = 0;
  SUMAEX = 0;
  SUMA1 = 0;
  SUMA2 = 0;
  SUMA3 = 0;
  IVA1 = 0;
  IVA2 = 0;
  IVA3 = 0;
  TOTCONSUMO = 0;
  MONTOPAGO1 = 0;
  SELECT MAX(AUDI_HORA) FROM AUDITORIA WHERE TIDO_COD = 31 AND AUDI_IDDOC = :ID AND AUDI_OPER = 'I' INTO :HORA;
  /* AHORA LAS FORMAS DE PAGO, BUSQUE EL ABONO DE HOY A LA FACTURA */
  ITEMFP = 1;
  MONTOPAGO1 = 0;
  MONTOPAGO2 = 0;
  MONTOPAGO3 = 0;
  FOR SELECT FOPA_NOM, RCPA_MONTO FROM RECIBOS_CAJA_PAGO P, FORMAS_PAGO F, RECIBOS_CAJA R, RECIBOS_CAJA_DETALLE D
    WHERE R.RECA_ID = P.RECA_ID AND R.RECA_ID = D.RECA_ID AND P.FOPA_ID = F.FOPA_ID AND RECA_FECHA = :FECHA AND RCDE_TIPODOC = 31 AND RCDE_IDDOC = :ID
    INTO :formap, :MONTOP
    DO
    BEGIN
    if (ITEMFP = 1) then
        BEGIN
        FORMAPAGO1 = FORMAP;
        MONTOPAGO1 = MONTOP;
        END
    if (ITEMFP = 2) then
        BEGIN
        FORMAPAGO2 = FORMAP;
        MONTOPAGO2 = MONTOP;
        END
    if (ITEMFP = 3) then
        BEGIN
        FORMAPAGO3 = FORMAP;
        MONTOPAGO3 = MONTOP;
        END
    ITEMFP = ITEMFP + 1;
    END
  EXECUTE PROCEDURE lee_configuracion ('FACTURACION','DOCUMENTOS','ORDENAR ITEMS POR CODIGO DE ARTICULO') returning_values (:ORDENCOD);
  EXECUTE PROCEDURE lee_configuracion ('FACTURACION','POS', 'IMPRIMIR DEVOLUCIONES DE ARTICULOS NEGATIVOS') returning_values (:imprdev);
  if (ORDENCOD = 'SI') then
    BEGIN
    FOR SELECT FADE_ITEM, D.ARTI_COD, FADE_CODBAR, SUBSTR(FADE_DESC,1,60), FADE_CANT, FADE_UNIDAD, FADE_FACTOR, BODE_COD, FADE_LOTE, LIPR_COD, FADE_PRUNIT, FADE_DTOPORC, FADE_DTOMONTO, FADE_IVAPORC, FADE_IVAMONTO, FADE_CONSUMO, FADE_TOTAL, FADE_REFERENCIA,
        GRUP_COD, SUBG_COD, MARC_COD, ARTI_PESO, ARTI_ANCHO, ARTI_ALTO, ARTI_LARGO, TAIV_COD, FADE_DEVUELTO, FADE_OBS
        FROM FACTURAS_DETALLE D, ARTICULO A
        WHERE D.ARTI_COD = A.ARTI_COD AND D.FACT_ID = :ID
        ORDER BY D.ARTI_COD
        INTO :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :FACTOR, :BODITEM, :LOTE, :LISTAPR, :PRUNIT, :DTOITPORC, :DTOITMONTO, :IVAPORC, :IVAITMONTO, :CONSUMO, :TOTAL, :refitem,
        :GRUPO, :SUBGRUPO, :MARCA, :PESO, :ANCHO, :ALTO, :LARGO, :TARIFA, :devuelto, :obsitem
        DO
          BEGIN
          if (ARTICULO = CODBAR) then
            SELECT FIRST 1 COBA_COD FROM barras_articulo WHERE ARTI_COD = :articulo INTO :CODBAR;
          if (IMPRDEV <> 'SI') then
            BEGIN
            if ((CANT >= 0) AND (DEVUELTO = 0)) then
                IMPR = 'S';
            ELSE
                IMPR = 'N'; /* ES DEVOLUCION */
            END
          ELSE
            IMPR = 'S';
          if (IMPR = 'S') then
            BEGIN
            if (IMPTOS = 'S') then
                if (cant <> 0) then
                    PRNETO = PRUNIT - DTOITMONTO - ((IVAITMONTO+CONSUMO) / CANT);
                else
                    PRNETO = PRUNIT - DTOITMONTO;
            ELSE
                PRNETO = PRUNIT - DTOITMONTO;
            SUBTOTIT = TOTAL - IVAITMONTO - CONSUMO;
            SUBTOTITCON = TOTAL;
            TOTCONSUMO = TOTCONSUMO + CONSUMO;
            SELECT LOTE_VENCE FROM LOTES WHERE LOTE_NRO = :lote AND ARTI_COD = :ARTICULO AND BODE_COD = :boditem INTO :vlote;
            if (TARIFA = 0) then
                SUMAEX = SUMAEX + TOTAL;
            if (TARIFA = 1) then
                BEGIN
                SUMA1 = SUMA1 + TOTAL - IVAITMONTO;
                IVA1 = IVA1 + IVAITMONTO;
                END
            if (TARIFA = 2) then
                BEGIN
                SUMA2 = SUMA2 + TOTAL - IVAITMONTO;
                IVA2 = IVA2 + IVAITMONTO;
                END
            if (TARIFA = 3) then
                BEGIN
                SUMA3 = SUMA3 + TOTAL - IVAITMONTO;
                IVA3 = IVA3 + IVAITMONTO;
                END
            SUMAGR = SUMA1 + SUMA2 + SUMA3;
            if (IMPTOS = 'N') then
                TOTAL = TOTAL - IVAITMONTO - CONSUMO;
            if (ANCHO IS NULL) then
                ANCHO = 0;
            if (ALTO IS NULL) then
                ALTO = 0;
            if (LARGO IS NULL) then
                LARGO = 0;
            if (PESO IS NULL) then
                PESO = 0;
            PESO = PESO * CANT;
            SUSPEND;
            END
          END
    END
ELSE
    BEGIN
    FOR SELECT FADE_ITEM, D.ARTI_COD, FADE_CODBAR, SUBSTR(FADE_DESC,1,60), FADE_CANT, FADE_UNIDAD, FADE_FACTOR, BODE_COD, FADE_LOTE, LIPR_COD, FADE_PRUNIT, FADE_DTOPORC, FADE_DTOMONTO, FADE_IVAPORC, FADE_IVAMONTO, FADE_CONSUMO, FADE_TOTAL, FADE_REFERENCIA,
        GRUP_COD, SUBG_COD, MARC_COD, ARTI_PESO, ARTI_ANCHO, ARTI_ALTO, ARTI_LARGO, TAIV_COD, FADE_DEVUELTO, FADE_OBS
        FROM FACTURAS_DETALLE D, ARTICULO A
        WHERE D.ARTI_COD = A.ARTI_COD AND D.FACT_ID = :ID
        ORDER BY FADE_ITEM
        INTO :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :FACTOR, :BODITEM, :LOTE, :LISTAPR, :PRUNIT, :DTOITPORC, :DTOITMONTO, :IVAPORC, :IVAITMONTO, :CONSUMO, :TOTAL, :refitem, 
        :GRUPO, :SUBGRUPO, :MARCA, :PESO, :ANCHO, :ALTO, :LARGO, :TARIFA, :devuelto, :obsitem
        DO
          BEGIN
          if (IMPRDEV <> 'SI') then
            BEGIN
            if ((CANT >= 0) AND (DEVUELTO = 0)) then
                IMPR = 'S';
            ELSE
                IMPR = 'N'; /* ES DEVOLUCION */
            END
          ELSE
            IMPR = 'S';
          if (IMPR = 'S') then
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :GRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :MARCA INTO NOMMARCA;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :SUBGRUPO AND GRUP_COD = :GRUPO INTO :NOMSUBG;
            if (IMPTOS = 'S') then
              PRNETO = PRUNIT - DTOITMONTO - ((IVAITMONTO+CONSUMO) / CANT);
            ELSE
              PRNETO = PRUNIT - DTOITMONTO;
            SUBTOTIT = TOTAL - IVAITMONTO - CONSUMO;
            SUBTOTITCON = TOTAL;
            TOTCONSUMO = TOTCONSUMO + CONSUMO;
            SELECT LOTE_VENCE FROM LOTES WHERE LOTE_NRO = :lote AND ARTI_COD = :ARTICULO AND BODE_COD = :boditem INTO :vlote;
            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;
            if (ANCHO IS NULL) then
                ANCHO = 0;
            if (ALTO IS NULL) then
                ALTO = 0;
            if (LARGO IS NULL) then
                LARGO = 0;
            if (PESO IS NULL) then
                PESO = 0;
            PESO = PESO * CANT;
            SUSPEND;
            END
          END
    END
END
^

SET TERM ; ^

GRANT SELECT ON FACTURAS TO PROCEDURE IMPR_FACTURA;
GRANT SELECT ON BODEGA TO PROCEDURE IMPR_FACTURA;
GRANT SELECT ON VENDEDORES TO PROCEDURE IMPR_FACTURA;
GRANT SELECT ON PUNTO_VENTA TO PROCEDURE IMPR_FACTURA;
GRANT SELECT ON TERCEROS TO PROCEDURE IMPR_FACTURA;
GRANT EXECUTE ON PROCEDURE ACUMULA_PUNTOS_CLIENTE TO PROCEDURE IMPR_FACTURA;
GRANT EXECUTE ON PROCEDURE CONSULTA_PUNTOS_CLIENTE TO PROCEDURE IMPR_FACTURA;
GRANT SELECT ON CLIENTES TO PROCEDURE IMPR_FACTURA;
GRANT SELECT ON ZONAS TO PROCEDURE IMPR_FACTURA;
GRANT SELECT ON CLIENTE_SUCURSALES TO PROCEDURE IMPR_FACTURA;
GRANT SELECT ON AUDITORIA TO PROCEDURE IMPR_FACTURA;
GRANT SELECT ON RECIBOS_CAJA_PAGO TO PROCEDURE IMPR_FACTURA;
GRANT SELECT ON FORMAS_PAGO TO PROCEDURE IMPR_FACTURA;
GRANT SELECT ON RECIBOS_CAJA TO PROCEDURE IMPR_FACTURA;
GRANT SELECT ON RECIBOS_CAJA_DETALLE TO PROCEDURE IMPR_FACTURA;
GRANT EXECUTE ON PROCEDURE LEE_CONFIGURACION TO PROCEDURE IMPR_FACTURA;
GRANT SELECT ON FACTURAS_DETALLE TO PROCEDURE IMPR_FACTURA;
GRANT SELECT ON ARTICULO TO PROCEDURE IMPR_FACTURA;
GRANT SELECT ON BARRAS_ARTICULO TO PROCEDURE IMPR_FACTURA;
GRANT SELECT ON LOTES TO PROCEDURE IMPR_FACTURA;
GRANT SELECT ON GRUPO TO PROCEDURE IMPR_FACTURA;
GRANT SELECT ON MARCAS TO PROCEDURE IMPR_FACTURA;
GRANT SELECT ON SUBGRUPO TO PROCEDURE IMPR_FACTURA;

SET TERM ^ ;

CREATE OR ALTER PROCEDURE IMPR_REMISION(
    ID INTEGER)
RETURNS (
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    NIT VARCHAR(20),
    NOMTERCERO VARCHAR(60),
    VENDEDOR INTEGER,
    NOMVENDEDOR VARCHAR(60),
    PUNTOVTA INTEGER,
    NOMPUNTOVTA VARCHAR(30),
    CODBODEGA VARCHAR(2),
    NOMBODEGA VARCHAR(30),
    COTIZACION VARCHAR(30),
    PEDIDO VARCHAR(30),
    FACTURA VARCHAR(30),
    SUBTOTAL NUMERIC(18,2),
    IVAMONTO NUMERIC(18,2),
    TOTALFAC NUMERIC(18,2),
    DESPACHO VARCHAR(255),
    TRANSPORTADOR VARCHAR(60),
    OBS BLOB SUB_TYPE 1 SEGMENT SIZE 80,
    ITEM INTEGER,
    ARTICULO VARCHAR(15),
    CODBAR VARCHAR(15),
    ARTIDES VARCHAR(60),
    CANT NUMERIC(18,4),
    LOTE VARCHAR(15),
    VLOTE DATE,
    UNIDAD VARCHAR(8),
    DEVUELTO NUMERIC(18,4),
    LISTAPR INTEGER,
    REFITEM VARCHAR(60),
    BODITEM VARCHAR(2),
    PRUNIT NUMERIC(18,2),
    DTOITPORC NUMERIC(9,2),
    DTOITMONTO NUMERIC(18,2),
    SUBTOTALITEM NUMERIC(18,2),
    PRNETOSINIVA NUMERIC(18,2),
    PRNETO NUMERIC(18,2),
    IVAPORC NUMERIC(9,2),
    IVAITMONTO NUMERIC(18,2),
    CONSUMO NUMERIC(18,2),
    TOTAL NUMERIC(18,2),
    CODIGOCL VARCHAR(20),
    ZONACOD VARCHAR(2),
    ZONANOM VARCHAR(60),
    DV CHAR(1),
    DIRECCION VARCHAR(60),
    CIUDAD VARCHAR(40),
    TELEFONO VARCHAR(40),
    CONTACTO VARCHAR(60),
    FAX VARCHAR(25),
    GRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    SUBGRUPO VARCHAR(3),
    NOMSUBG VARCHAR(30),
    MARCA VARCHAR(3),
    NOMMARCA VARCHAR(30),
    PESO NUMERIC(9,4),
    ANCHO NUMERIC(18,4),
    ALTO NUMERIC(18,4),
    LARGO NUMERIC(18,4),
    SUMA1 NUMERIC(18,2),
    SUMA2 NUMERIC(18,2),
    SUMA3 NUMERIC(18,2),
    IVA1 NUMERIC(18,2),
    IVA2 NUMERIC(18,2),
    IVA3 NUMERIC(18,2),
    SUMAEX NUMERIC(18,2),
    SUMAGR NUMERIC(18,2),
    OBSITEM BLOB SUB_TYPE 1 SEGMENT SIZE 80)
AS
DECLARE VARIABLE IMPTOS CHAR(1);
DECLARE VARIABLE TARIFA INTEGER;
declare variable ORDENCOD CHAR(2);
declare variable SUCUR VARCHAR(10);
BEGIN
  /*  */
  SELECT F.PREF_PRE, REVT_NUMERO, REVT_FECHA, F.BODE_COD, BODE_NOM, F.TERC_NIT, REVT_NOMTERC, F.VEND_COD, VEND_NOMBRE, F.PTVT_ID, PTVT_NOM,
    REVT_COTIZACI, REVT_PEDIDO, REVT_FACTURA, REVT_IVAINC,
    REVT_IVAMONTO, REVT_TOTAL, REVT_DESPACHO, REVT_TRANSP,
    TERC_CONTACTO, TERC_FAX, TERC_DV, REVT_OBS, REVT_SUCURSAL
    FROM REMISIONES_VENTA F, BODEGA B, VENDEDORES V, PUNTO_VENTA P, TERCEROS T
    WHERE F.BODE_COD = B.BODE_COD AND F.VEND_COD = V.VEND_COD AND F.PTVT_ID = P.PTVT_ID AND F.TERC_NIT = T.TERC_NIT AND F.REVT_ID = :ID
    into :PREF, :NUMERO, :FECHA, :CODBODEGA, :NOMBODEGA, :NIT, :NOMTERCERO, :VENDEDOR, :NOMVENDEDOR, :PUNTOVTA, :NOMPUNTOVTA,
    :COTIZACION, :PEDIDO, :FACTURA, :IMPTOS,
    :IVAMONTO, :TOTALFAC, :DESPACHO, :transportador, 
    :CONTACTO, :FAX, :DV, :OBS, :SUCUR;
  SUBTOTAL = TOTALFAC - IVAMONTO;

  SELECT CLIE_COD, C.ZONA_COD, ZONA_NOM
    FROM CLIENTES C, ZONAS Z
    WHERE TERC_NIT = :NIT AND C.ZONA_COD = Z.ZONA_COD
    INTO :CODIGOCL, :ZONACOD, :ZONANOM;
  SELECT CLSU_DIR, CLSU_CIUDAD, CLSU_TEL FROM CLIENTE_SUCURSALES WHERE TERC_NIT = :NIT AND CLCU_COD = :SUCUR
    INTO :DIRECCION, :CIUDAD, :TELEFONO;
    
  SUMAEX = 0;
  SUMA1 = 0;
  SUMA2 = 0;
  SUMA3 = 0;
  IVA1 = 0;
  IVA2 = 0;
  IVA3 = 0;
  ITEM = 0;
  EXECUTE PROCEDURE lee_configuracion ('FACTURACION','DOCUMENTOS','ORDENAR ITEMS POR CODIGO DE ARTICULO') returning_values (:ORDENCOD);
  if (ORDENCOD = 'SI') then
    BEGIN
    FOR SELECT D.ARTI_COD, RVDE_CODBAR, SUBSTR(RVDE_DESC,1,60), RVDE_CANT, RVDE_UNIDAD, BODE_COD, RVDE_LOTE, LIPR_COD, RVDE_PRUNIT, RVDE_DTOPORC, RVDE_DTOMONTO, RVDE_IVAPORC, RVDE_IVAMONTO, RVDE_CONSUMO, RVDE_TOTAL, RVDE_REFERENCIA,
        GRUP_COD, SUBG_COD, MARC_COD, ARTI_PESO, ARTI_ANCHO, ARTI_ALTO, ARTI_LARGO, TAIV_COD, RVDE_DEVUELTO, RVDE_OBS
        FROM REMISIONES_VENTA_DETALLE D, ARTICULO A
        WHERE D.ARTI_COD = A.ARTI_COD AND D.REVT_ID = :ID
        ORDER BY RVDE_CODBAR
        INTO :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :BODITEM, :LOTE, :LISTAPR, :PRUNIT, :DTOITPORC, :DTOITMONTO, :IVAPORC, :IVAITMONTO, :CONSUMO, :TOTAL, :refitem,
            :GRUPO, :SUBGRUPO, :MARCA, :PESO, :ANCHO, :ALTO, :LARGO, :TARIFA, :DEVUELTO, :obsitem
        DO
        BEGIN
        if (ARTICULO = CODBAR) then
            SELECT FIRST 1 COBA_COD FROM barras_articulo WHERE ARTI_COD = :articulo INTO :CODBAR;
        SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :GRUPO INTO NOMGRUPO;
        SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :MARCA INTO NOMMARCA;
        SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :SUBGRUPO AND GRUP_COD = :GRUPO INTO :NOMSUBG;
        SELECT LOTE_VENCE FROM LOTES WHERE LOTE_NRO = :lote AND ARTI_COD = :ARTICULO AND BODE_COD = :boditem INTO :vlote;
        ITEM = ITEM + 1;
        PRNETO = PRUNIT - DTOITMONTO;
        if (IVAPORC = 0) then
            SUMAEX = SUMAEX + TOTAL;
        if (TARIFA = 1) then
            BEGIN
            SUMA1 = SUMA1 + TOTAL - IVAITMONTO;
            IVA1 = IVA1 + IVAITMONTO;
            END
        if (TARIFA = 2) then
            BEGIN
            SUMA2 = SUMA2 + TOTAL - IVAITMONTO;
            IVA2 = IVA2 + IVAITMONTO;
            END
        if (TARIFA = 3) then
            BEGIN
            SUMA3 = SUMA3 + TOTAL - IVAITMONTO;
            IVA3 = IVA3 + IVAITMONTO;
            END
        SUMAGR = SUMA1 + SUMA2 + SUMA3;

        if (IMPTOS = 'N') then
            TOTAL = TOTAL - IVAITMONTO;
        ELSE
           BEGIN
           PRNETOSINIVA = PRUNIT / (1 + ivaporc/100);
           SUBTOTALITEM = PRNETOSINIVA * :CANT;
           END
        SUSPEND;
        END
    END
ELSE
    BEGIN
    FOR SELECT RVDE_ITEM, D.ARTI_COD, RVDE_CODBAR, SUBSTR(RVDE_DESC,1,60), RVDE_CANT, RVDE_UNIDAD, BODE_COD, RVDE_LOTE, LIPR_COD, RVDE_PRUNIT, RVDE_DTOPORC, RVDE_DTOMONTO, RVDE_IVAPORC, RVDE_IVAMONTO, RVDE_CONSUMO, RVDE_TOTAL, RVDE_REFERENCIA,
        GRUP_COD, SUBG_COD, MARC_COD, ARTI_PESO, ARTI_ANCHO, ARTI_ALTO, ARTI_LARGO, TAIV_COD, RVDE_DEVUELTO, RVDE_OBS
        FROM REMISIONES_VENTA_DETALLE D, ARTICULO A
        WHERE D.ARTI_COD = A.ARTI_COD AND D.REVT_ID = :ID
        ORDER BY RVDE_ITEM
        INTO :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :BODITEM, :LOTE, :LISTAPR, :PRUNIT, :DTOITPORC, :DTOITMONTO, :IVAPORC, :IVAITMONTO, :CONSUMO, :TOTAL, :refitem,
            :GRUPO, :SUBGRUPO, :MARCA, :PESO, :ANCHO, :ALTO, :LARGO, :TARIFA, :DEVUELTO, :obsitem
        DO
        BEGIN
        SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :GRUPO INTO NOMGRUPO;
        SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :MARCA INTO NOMMARCA;
        SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :SUBGRUPO AND GRUP_COD = :GRUPO INTO :NOMSUBG;
        SELECT LOTE_VENCE FROM LOTES WHERE LOTE_NRO = :lote AND ARTI_COD = :ARTICULO AND BODE_COD = :boditem INTO :vlote;
        ITEM = ITEM + 1;
        PRNETO = PRUNIT - DTOITMONTO;
        if (IVAPORC = 0) then
            SUMAEX = SUMAEX + TOTAL;
        if (TARIFA = 1) then
            BEGIN
            SUMA1 = SUMA1 + TOTAL - IVAITMONTO;
            IVA1 = IVA1 + IVAITMONTO;
            END
        if (TARIFA = 2) then
            BEGIN
            SUMA2 = SUMA2 + TOTAL - IVAITMONTO;
            IVA2 = IVA2 + IVAITMONTO;
            END
        if (TARIFA = 3) then
            BEGIN
            SUMA3 = SUMA3 + TOTAL - IVAITMONTO;
            IVA3 = IVA3 + IVAITMONTO;
            END
        SUMAGR = SUMA1 + SUMA2 + SUMA3;
        SUBTOTALITEM = TOTAL - IVAITMONTO;
        if (IMPTOS = 'N') then
            TOTAL = TOTAL - IVAITMONTO;
        ELSE
           BEGIN
             PRNETOSINIVA = PRUNIT / (1 + ivaporc/100);
             SUBTOTALITEM = PRNETOSINIVA * :CANT;
           END
        SUSPEND;
        END
    END
END
^

SET TERM ; ^

GRANT SELECT ON REMISIONES_VENTA TO PROCEDURE IMPR_REMISION;
GRANT SELECT ON BODEGA TO PROCEDURE IMPR_REMISION;
GRANT SELECT ON VENDEDORES TO PROCEDURE IMPR_REMISION;
GRANT SELECT ON PUNTO_VENTA TO PROCEDURE IMPR_REMISION;
GRANT SELECT ON TERCEROS TO PROCEDURE IMPR_REMISION;
GRANT SELECT ON CLIENTES TO PROCEDURE IMPR_REMISION;
GRANT SELECT ON ZONAS TO PROCEDURE IMPR_REMISION;
GRANT SELECT ON CLIENTE_SUCURSALES TO PROCEDURE IMPR_REMISION;
GRANT EXECUTE ON PROCEDURE LEE_CONFIGURACION TO PROCEDURE IMPR_REMISION;
GRANT SELECT ON REMISIONES_VENTA_DETALLE TO PROCEDURE IMPR_REMISION;
GRANT SELECT ON ARTICULO TO PROCEDURE IMPR_REMISION;
GRANT SELECT ON BARRAS_ARTICULO TO PROCEDURE IMPR_REMISION;
GRANT SELECT ON GRUPO TO PROCEDURE IMPR_REMISION;
GRANT SELECT ON MARCAS TO PROCEDURE IMPR_REMISION;
GRANT SELECT ON SUBGRUPO TO PROCEDURE IMPR_REMISION;
GRANT SELECT ON LOTES TO PROCEDURE IMPR_REMISION;

SET TERM ^ ;

CREATE OR ALTER PROCEDURE LISTA_LOTES(
    ARTICULO VARCHAR(15),
    BODEGA VARCHAR(2),
    CANT NUMERIC(18,4))
RETURNS (
    LOTE VARCHAR(15),
    SALDO NUMERIC(18,4),
    VENCE DATE)
AS
BEGIN
  /* Muestra los lotes del artículo con existencia */
  for select lote_nro, lote_saldo, lote_vence from lotes
    where arti_cod = :articulo and BODE_COD = :bodega AND lote_saldo >= :cant and lote_saldo <> 0
    into :lote, :saldo, :vence
    do
      SUSPEND;
END
^

SET TERM ; ^

GRANT SELECT ON LOTES TO PROCEDURE LISTA_LOTES;

SET TERM ^ ;

CREATE OR ALTER PROCEDURE MAYOR_SALDO_LOTE(
    ARTICULO VARCHAR(15),
    BODEGA VARCHAR(2))
RETURNS (
    LOTE VARCHAR(15),
    SALDO NUMERIC(18,4))
AS
BEGIN
  SELECT MAX(LOTE_SALDO) FROM LOTES
    WHERE ARTI_COD = :ARTICULO AND BODE_COD = :bodega INTO :SALDO;
  SELECT LOTE_NRO FROM LOTES
    WHERE (ARTI_COD = :ARTICULO) AND BODE_COD = :bodega AND LOTE_SALDO = :SALDO INTO :LOTE;
  SUSPEND;
END
^

SET TERM ; ^

GRANT SELECT ON LOTES TO PROCEDURE MAYOR_SALDO_LOTE;

SET TERM ^ ;

CREATE OR ALTER PROCEDURE REP_MOVIMIENTO_X_ARTICULO(
    DETALLE CHAR(1),
    FECINI DATE,
    FECFIN DATE,
    ARTINI VARCHAR(20),
    ARTFIN VARCHAR(20),
    GRPINI VARCHAR(2),
    GRPFIN VARCHAR(2),
    ORDEN CHAR(1),
    SUBEMPRESA INTEGER)
RETURNS (
    CODIGO VARCHAR(15),
    NOMBRE VARCHAR(60),
    UNIDAD VARCHAR(8),
    CODGRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    CODSUBG VARCHAR(3),
    NOMSUBG VARCHAR(30),
    CODMARC VARCHAR(3),
    NOMMARC VARCHAR(30),
    CODBOD VARCHAR(2),
    NOMBOD VARCHAR(30),
    SALDOINI NUMERIC(18,4),
    ENTRADAS NUMERIC(18,4),
    SALIDAS NUMERIC(18,4),
    SALDOFIN NUMERIC(18,4),
    TIPODOC VARCHAR(8),
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    CONCEPTO VARCHAR(60),
    LOTE VARCHAR(15),
    LO_VENCE DATE,
    NIT VARCHAR(20),
    NOMTERC VARCHAR(60),
    CONS INTEGER)
AS
declare variable ENTRADA CHAR(1);
declare variable IDMOV INTEGER;
declare variable CODINI VARCHAR(20);
declare variable CODant VARCHAR(15) CHARACTER SET NONE;
declare variable CODFIN VARCHAR(20);
declare variable DESINI VARCHAR(20);
declare variable DESFIN VARCHAR(20);
DECLARE VARIABLE FEC DATE;
BEGIN
if (ORDEN = 'C') then
    BEGIN
    CODINI = ARTINI;
    CODFIN = ARTFIN;
    DESINI = '';
    DESFIN = 'zz';
    END
ELSE
    BEGIN
    DESINI = ARTINI;
    DESFIN = ARTFIN;
    CODINI = '';
    CODFIN = 'zz';
    END

if (DETALLE = 'L') then
  BEGIN
   codant = 0;
   for SELECT A.ARTI_COD, ARTI_DES, ARTI_UNIDAD, A.GRUP_COD, A.SUBG_COD, A.MARC_COD, LOTE_NRO,LOTE_VENCE, BODE_COD
     FROM ARTICULO A, LOTES L
     WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :GRPFIN AND
       ARTI_DES >= :DESINI AND ARTI_DES <= :DESFIN AND A.ESAR_COD <> 'I' AND a.arti_cod = l.arti_cod
     INTO :CODIGO, :NOMBRE, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :LOTE, :LO_VENCE, :codbod
     DO
     BEGIN
      SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
      SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
      SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;

      SELECT  MAX(EXIS_FECHA) FROM EXISTENCIA
        WHERE (ARTI_COD = :CODIGO) AND (BODE_COD = :codbod) AND (EXIS_FECHA < :FECINI) INTO :FEC;
      IF (FEC IS NULL) THEN
        SALDOINI = 0;
      ELSE
        begin
        /* Con la fecha máxima calcule el nuevo saldo */
        if (FECINI = FEC) then
          SELECT SUM(EXIS_SALDO) FROM EXISTENCIA
            WHERE (ARTI_COD = :CODIGO) AND (BODE_COD = :codbod) AND (EXIS_FECHA = :FEC) INTO :SALDOINI;
        ELSE
          SELECT SUM(EXIS_ENTR - EXIS_SAL) FROM EXISTENCIA
            WHERE (ARTI_COD = :CODIGO) AND (BODE_COD = :codbod) AND (EXIS_FECHA <= :FEC) INTO :SALDOINI;
        end
      if (SALDOINI IS NULL) then
        SALDOINI = 0;
      if (codigo <> codant) then
          SALDOFIN = SALDOINI;
/*      for SELECT * FROM MOVLOTES_DESDE_HASTA(:codigo, :LOTE,:fecini, :fecfin,:SUBEMPRESA)
        ORDER BY FECHA,CONS
        INTO :TIPODOC, :PREFIJO, :NUMERO, :FECHA, :CONCEPTO, :ENTRADA, :ENTRADAS, :SALIDAS, :IDMOV, :NIT, :CONS
        DO
        BEGIN
          if (nit is not null) then
            SELECT TERC_NOM FROM TERCEROS WHERE TERC_NIT = :NIT INTO :NOMTERC;
          else
            NOMTERC = '';
          if (ENTRADA = 'S') then
           BEGIN
            salidas = 0;
            SALDOFIN = SALDOFIN + ENTRADAS;
           END
          ELSE
           BEGIN
            ENTRADAS = 0;
            SALDOFIN = SALDOFIN - SALIDAS;
           END
          SUSPEND;
        END */
      codant = :codigo;
    END
  END
ELSE
 BEGIN
  FOR
    SELECT ARTI_COD, ARTI_DES, ARTI_UNIDAD, A.GRUP_COD, A.SUBG_COD, A.MARC_COD, BODE_COD, BODE_NOM
      FROM ARTICULO A, BODEGA B
      WHERE ARTI_COD >= :CODINI AND ARTI_COD <= :CODFIN AND A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :GRPFIN AND
       ARTI_DES >= :DESINI AND ARTI_DES <= :DESFIN AND A.ESAR_COD <> 'I' AND ((SUCU_ID = :SUBEMPRESA) OR (:SUBEMPRESA = 0))
      INTO :CODIGO, :NOMBRE, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :CODBOD, :NOMBOD
      DO
        BEGIN
        SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
        SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
        SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
        EXECUTE PROCEDURE SALDO_INICIAL_INVENTARIO(CODIGO, FECINI, :CODBOD) returning_values (:SALDOINI);
        if (DETALLE = 'N') then
            BEGIN
            /* SUME LAS ENTRADAS */
            SELECT SUM(MVAR_CANT) FROM MOVIMIENTO_ARTICULO
              WHERE (MVAR_FECHA >= :FECINI) AND (MVAR_FECHA <= :FECFIN) AND
              (ARTI_COD = :CODIGO) AND (BODE_COD = :CODBOD) AND (MVAR_ENTRADA = 'S') INTO :ENTRADAS;
            if (ENTRADAS IS NULL) then
              ENTRADAS = 0;
            /* CALCULE LAS SALIDAS A COSTO PROMEDIO */
            SALIDAS = 0;
            SELECT SUM(MVAR_CANT)
                FROM MOVIMIENTO_ARTICULO
                WHERE (MVAR_FECHA >= :FECINI) AND (MVAR_FECHA <= :FECFIN) AND
                (ARTI_COD = :CODIGO) AND (BODE_COD = :CODBOD) AND (MVAR_ENTRADA = 'N')
                INTO :SALIDAS;
            if (SALIDAS IS NULL) then
              SALIDAS = 0;
            SALDOFIN = SALDOINI + ENTRADAS - SALIDAS;
            SUSPEND;
            END
        if (DETALLE = 'B') then
            BEGIN
            SALDOFIN = SALDOINI;
            FOR SELECT TIDO_NOMCORTO, MVAR_ENTRADA, MVAR_PREF, MVAR_NUMERO, MVAR_CANT, MVAR_CONC, MVAR_FECHA, M.TERC_NIT, MVAR_CONS
                FROM MOVIMIENTO_ARTICULO M, TIPO_DOCUMENTO TD
                WHERE TD.TIDO_COD = MVAR_TIPODOC AND (MVAR_FECHA >= :FECINI) AND (MVAR_FECHA <= :FECFIN) AND (ARTI_COD = :CODIGO) AND (BODE_COD = :CODBOD)
                ORDER BY MVAR_FECHA, MVAR_CONS
                INTO :TIPODOC, :ENTRADA, :PREFIJO, :NUMERO, :ENTRADAS, :CONCEPTO, :FECHA, :NIT, :CONS
                DO
                    BEGIN
                    if (nit is not null) then
                        SELECT TERC_NOM FROM TERCEROS WHERE TERC_NIT = :NIT INTO :NOMTERC;
                    else
                        NOMTERC = '';
                    if (ENTRADA = 'S') then
                        BEGIN
                        SALIDAS = 0;
                        SALDOFIN = SALDOFIN + ENTRADAS;
                        end
                    ELSE
                        BEGIN
                        SALIDAS = ENTRADAS;
                        ENTRADAS = 0;
                        SALDOFIN = SALDOFIN - SALIDAS;
                        END
                    SUSPEND;
                    END
            END
        END
  END
END
^

SET TERM ; ^

GRANT SELECT ON ARTICULO TO PROCEDURE REP_MOVIMIENTO_X_ARTICULO;
GRANT SELECT ON LOTES TO PROCEDURE REP_MOVIMIENTO_X_ARTICULO;
GRANT SELECT ON GRUPO TO PROCEDURE REP_MOVIMIENTO_X_ARTICULO;
GRANT SELECT ON MARCAS TO PROCEDURE REP_MOVIMIENTO_X_ARTICULO;
GRANT SELECT ON SUBGRUPO TO PROCEDURE REP_MOVIMIENTO_X_ARTICULO;
GRANT SELECT ON EXISTENCIA TO PROCEDURE REP_MOVIMIENTO_X_ARTICULO;
GRANT SELECT ON BODEGA TO PROCEDURE REP_MOVIMIENTO_X_ARTICULO;
GRANT EXECUTE ON PROCEDURE SALDO_INICIAL_INVENTARIO TO PROCEDURE REP_MOVIMIENTO_X_ARTICULO;
GRANT SELECT ON MOVIMIENTO_ARTICULO TO PROCEDURE REP_MOVIMIENTO_X_ARTICULO;
GRANT SELECT ON TIPO_DOCUMENTO TO PROCEDURE REP_MOVIMIENTO_X_ARTICULO;
GRANT SELECT ON TERCEROS TO PROCEDURE REP_MOVIMIENTO_X_ARTICULO;

SET TERM ^ ;

CREATE OR ALTER PROCEDURE MOVLOTES_DESDE_HASTA(
    ARTICULO VARCHAR(15),
    BODEGA VARCHAR(2),
    LOTE VARCHAR(15),
    DESDE DATE,
    HASTA DATE,
    AGENCIA INTEGER)
RETURNS (
    TIPODOC VARCHAR(8),
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    CONCEPTO VARCHAR(60),
    ENT CHAR(1),
    CANTENT NUMERIC(18,4),
    CANTSAL NUMERIC(18,4),
    IDMOV INTEGER,
    NIT VARCHAR(20),
    CONS INTEGER)
AS
declare variable Cant numeric(18,4);
begin
  /* Retorna el mov. x LOTE detallado desde hasta */
  for select tido_nomcorto, mvar_pref, mvar_numero, mvar_fecha, mvar_conc, mvar_entrada, mvar_cant, MVAR_IDREF,TERC_NIT, MVAR_CONS
    from tipo_documento t, movimiento_articulo m, prefijos p
    where t.tido_cod = m.mvar_tipodoc and arti_cod = :articulo and BODE_COD = :BODEGA and MVAR_LOTE = :LOTE and mvar_fecha >= :desde and mvar_fecha <= :hasta and
    p.tido_cod = t.tido_cod and p.pref_pre = m.mvar_pref and ((:agencia = 0) or (p.sucu_id = :agencia))
    ORDER BY MVAR_FECHA into :tipodoc, :prefijo, :numero, :fecha, :concepto, :Ent, :Cant, :IDMOV, :nit, :cons 
    do
        begin
          if (:Ent = 'S') then
            begin
            CANTENT = Cant;
            CANTSAL = 0;
            end
          else
            begin
            CANTENT = 0;
            CANTSAL = Cant;
            end
          SUSPEND;
        end
end
^

SET TERM ; ^

GRANT SELECT ON TIPO_DOCUMENTO TO PROCEDURE MOVLOTES_DESDE_HASTA;
GRANT SELECT ON MOVIMIENTO_ARTICULO TO PROCEDURE MOVLOTES_DESDE_HASTA;
GRANT SELECT ON PREFIJOS TO PROCEDURE MOVLOTES_DESDE_HASTA;

SET TERM ^ ;

CREATE OR ALTER PROCEDURE REP_MOVIMIENTO_X_ARTICULO(
    DETALLE CHAR(1),
    FECINI DATE,
    FECFIN DATE,
    ARTINI VARCHAR(20),
    ARTFIN VARCHAR(20),
    GRPINI VARCHAR(2),
    GRPFIN VARCHAR(2),
    ORDEN CHAR(1),
    SUBEMPRESA INTEGER)
RETURNS (
    CODIGO VARCHAR(15),
    NOMBRE VARCHAR(60),
    UNIDAD VARCHAR(8),
    CODGRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    CODSUBG VARCHAR(3),
    NOMSUBG VARCHAR(30),
    CODMARC VARCHAR(3),
    NOMMARC VARCHAR(30),
    CODBOD VARCHAR(2),
    NOMBOD VARCHAR(30),
    SALDOINI NUMERIC(18,4),
    ENTRADAS NUMERIC(18,4),
    SALIDAS NUMERIC(18,4),
    SALDOFIN NUMERIC(18,4),
    TIPODOC VARCHAR(8),
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    CONCEPTO VARCHAR(60),
    LOTE VARCHAR(15),
    LO_VENCE DATE,
    NIT VARCHAR(20),
    NOMTERC VARCHAR(60),
    CONS INTEGER)
AS
declare variable ENTRADA CHAR(1);
declare variable CODINI VARCHAR(20);
declare variable CODant VARCHAR(15) CHARACTER SET NONE;
declare variable CODFIN VARCHAR(20);
declare variable DESINI VARCHAR(20);
declare variable DESFIN VARCHAR(20);
DECLARE VARIABLE FEC DATE;
BEGIN
if (ORDEN = 'C') then
    BEGIN
    CODINI = ARTINI;
    CODFIN = ARTFIN;
    DESINI = '';
    DESFIN = 'zz';
    END
ELSE
    BEGIN
    DESINI = ARTINI;
    DESFIN = ARTFIN;
    CODINI = '';
    CODFIN = 'zz';
    END

if (DETALLE = 'L') then
  BEGIN
   codant = 0;
   for SELECT A.ARTI_COD, ARTI_DES, ARTI_UNIDAD, A.GRUP_COD, A.SUBG_COD, A.MARC_COD, LOTE_NRO,LOTE_VENCE, BODE_COD
     FROM ARTICULO A, LOTES L
     WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :GRPFIN AND
       ARTI_DES >= :DESINI AND ARTI_DES <= :DESFIN AND A.ESAR_COD <> 'I' AND a.arti_cod = l.arti_cod
     INTO :CODIGO, :NOMBRE, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :LOTE, :LO_VENCE, :codbod
     DO
     BEGIN
      SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
      SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
      SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
      SELECT BODE_NOM FROM BODEGA WHERE BODE_COD = :codbod INTO nombod;

      SELECT  MAX(EXIS_FECHA) FROM EXISTENCIA
        WHERE (ARTI_COD = :CODIGO) AND (BODE_COD = :codbod) AND (EXIS_FECHA < :FECINI) INTO :FEC;
      IF (FEC IS NULL) THEN
        SALDOINI = 0;
      ELSE
        begin
        /* Con la fecha máxima calcule el nuevo saldo */
        if (FECINI = FEC) then
          SELECT SUM(EXIS_SALDO) FROM EXISTENCIA
            WHERE (ARTI_COD = :CODIGO) AND (BODE_COD = :codbod) AND (EXIS_FECHA = :FEC) INTO :SALDOINI;
        ELSE
          SELECT SUM(EXIS_ENTR - EXIS_SAL) FROM EXISTENCIA
            WHERE (ARTI_COD = :CODIGO) AND (BODE_COD = :codbod) AND (EXIS_FECHA <= :FEC) INTO :SALDOINI;
        end
      if (SALDOINI IS NULL) then
        SALDOINI = 0;
      if (codigo <> codant) then
          SALDOFIN = SALDOINI;
      for SELECT TIPODOC, PREFIJO, NUMERO, FECHA, CONCEPTO, ENT, CANTENT, CANTSAL, NIT, CONS
        FROM MOVLOTES_DESDE_HASTA(:codigo, :codbod, :LOTE,:fecini, :fecfin,:SUBEMPRESA)
        ORDER BY FECHA,CONS
        INTO :TIPODOC, :PREFIJO, :NUMERO, :FECHA, :CONCEPTO, :ENTRADA, :ENTRADAS, :SALIDAS, :NIT, :CONS
        DO
        BEGIN
          if (nit is not null) then
            SELECT TERC_NOM FROM TERCEROS WHERE TERC_NIT = :NIT INTO :NOMTERC;
          else
            NOMTERC = '';
          if (ENTRADA = 'S') then
           BEGIN
            salidas = 0;
            SALDOFIN = SALDOFIN + ENTRADAS;
           END
          ELSE
           BEGIN
            ENTRADAS = 0;
            SALDOFIN = SALDOFIN - SALIDAS;
           END
          SUSPEND;
        END
      codant = :codigo;
    END
  END
ELSE
 BEGIN
  FOR
    SELECT ARTI_COD, ARTI_DES, ARTI_UNIDAD, A.GRUP_COD, A.SUBG_COD, A.MARC_COD, BODE_COD, BODE_NOM
      FROM ARTICULO A, BODEGA B
      WHERE ARTI_COD >= :CODINI AND ARTI_COD <= :CODFIN AND A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :GRPFIN AND
       ARTI_DES >= :DESINI AND ARTI_DES <= :DESFIN AND A.ESAR_COD <> 'I' AND ((SUCU_ID = :SUBEMPRESA) OR (:SUBEMPRESA = 0))
      INTO :CODIGO, :NOMBRE, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :CODBOD, :NOMBOD
      DO
        BEGIN
        SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
        SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
        SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
        EXECUTE PROCEDURE SALDO_INICIAL_INVENTARIO(CODIGO, FECINI, :CODBOD) returning_values (:SALDOINI);
        if (DETALLE = 'N') then
            BEGIN
            /* SUME LAS ENTRADAS */
            SELECT SUM(MVAR_CANT) FROM MOVIMIENTO_ARTICULO
              WHERE (MVAR_FECHA >= :FECINI) AND (MVAR_FECHA <= :FECFIN) AND
              (ARTI_COD = :CODIGO) AND (BODE_COD = :CODBOD) AND (MVAR_ENTRADA = 'S') INTO :ENTRADAS;
            if (ENTRADAS IS NULL) then
              ENTRADAS = 0;
            /* CALCULE LAS SALIDAS A COSTO PROMEDIO */
            SALIDAS = 0;
            SELECT SUM(MVAR_CANT)
                FROM MOVIMIENTO_ARTICULO
                WHERE (MVAR_FECHA >= :FECINI) AND (MVAR_FECHA <= :FECFIN) AND
                (ARTI_COD = :CODIGO) AND (BODE_COD = :CODBOD) AND (MVAR_ENTRADA = 'N')
                INTO :SALIDAS;
            if (SALIDAS IS NULL) then
              SALIDAS = 0;
            SALDOFIN = SALDOINI + ENTRADAS - SALIDAS;
            SUSPEND;
            END
        if (DETALLE = 'B') then
            BEGIN
            SALDOFIN = SALDOINI;
            FOR SELECT TIDO_NOMCORTO, MVAR_ENTRADA, MVAR_PREF, MVAR_NUMERO, MVAR_CANT, MVAR_CONC, MVAR_FECHA, M.TERC_NIT, MVAR_CONS
                FROM MOVIMIENTO_ARTICULO M, TIPO_DOCUMENTO TD
                WHERE TD.TIDO_COD = MVAR_TIPODOC AND (MVAR_FECHA >= :FECINI) AND (MVAR_FECHA <= :FECFIN) AND (ARTI_COD = :CODIGO) AND (BODE_COD = :CODBOD)
                ORDER BY MVAR_FECHA, MVAR_CONS
                INTO :TIPODOC, :ENTRADA, :PREFIJO, :NUMERO, :ENTRADAS, :CONCEPTO, :FECHA, :NIT, :CONS
                DO
                    BEGIN
                    if (nit is not null) then
                        SELECT TERC_NOM FROM TERCEROS WHERE TERC_NIT = :NIT INTO :NOMTERC;
                    else
                        NOMTERC = '';
                    if (ENTRADA = 'S') then
                        BEGIN
                        SALIDAS = 0;
                        SALDOFIN = SALDOFIN + ENTRADAS;
                        end
                    ELSE
                        BEGIN
                        SALIDAS = ENTRADAS;
                        ENTRADAS = 0;
                        SALDOFIN = SALDOFIN - SALIDAS;
                        END
                    SUSPEND;
                    END
            END
        END
  END
END
^

SET TERM ; ^

GRANT SELECT ON ARTICULO TO PROCEDURE REP_MOVIMIENTO_X_ARTICULO;
GRANT SELECT ON LOTES TO PROCEDURE REP_MOVIMIENTO_X_ARTICULO;
GRANT SELECT ON GRUPO TO PROCEDURE REP_MOVIMIENTO_X_ARTICULO;
GRANT SELECT ON MARCAS TO PROCEDURE REP_MOVIMIENTO_X_ARTICULO;
GRANT SELECT ON SUBGRUPO TO PROCEDURE REP_MOVIMIENTO_X_ARTICULO;
GRANT SELECT ON BODEGA TO PROCEDURE REP_MOVIMIENTO_X_ARTICULO;
GRANT SELECT ON EXISTENCIA TO PROCEDURE REP_MOVIMIENTO_X_ARTICULO;
GRANT EXECUTE ON PROCEDURE MOVLOTES_DESDE_HASTA TO PROCEDURE REP_MOVIMIENTO_X_ARTICULO;
GRANT SELECT ON TERCEROS TO PROCEDURE REP_MOVIMIENTO_X_ARTICULO;
GRANT EXECUTE ON PROCEDURE SALDO_INICIAL_INVENTARIO TO PROCEDURE REP_MOVIMIENTO_X_ARTICULO;
GRANT SELECT ON MOVIMIENTO_ARTICULO TO PROCEDURE REP_MOVIMIENTO_X_ARTICULO;
GRANT SELECT ON TIPO_DOCUMENTO TO PROCEDURE REP_MOVIMIENTO_X_ARTICULO;

SET TERM ^ ;

CREATE OR ALTER PROCEDURE SALDO_LOTE(
    ARTICULO VARCHAR(15),
    BODEGA VARCHAR(2),
    LOTE VARCHAR(15))
RETURNS (
    SALDO NUMERIC(18,4))
AS
BEGIN
  /* Busca la fecha del último movimiento del artículo en la bodega antes de la fecha */
  SELECT LOTE_SALDO FROM LOTES
    WHERE (ARTI_COD = :ARTICULO) AND (BODE_COD = :BODEGA) AND (LOTE_NRO = :LOTE) INTO :SALDO;
  if (saldo is null) then
    saldo = 0;
  SUSPEND;
END
^

SET TERM ; ^

GRANT SELECT ON LOTES TO PROCEDURE SALDO_LOTE;

SET TERM ^ ;

CREATE OR ALTER TRIGGER MOVIMIENTO_ARTICULO_BI FOR MOVIMIENTO_ARTICULO
ACTIVE BEFORE INSERT POSITION 0
AS
declare variable LOTE CHAR(1);
BEGIN
  /* INSERTE EL NUEVO LOTE */
  SELECT ARTI_EXIST
    FROM   ARTICULO
    WHERE  ARTICULO.ARTI_COD = NEW.ARTI_COD
    INTO :LOTE;
  if (LOTE = 'L') then
    BEGIN
      if ((NEW.mvar_lote IS NULL) or (NEW.mvar_lote = '')) then
        if (new.mvar_entrada = 'S') then
            new.mvar_lote = cast(new.mvar_cons as varchar(15));
        else
            begin
            /* NO HAY LOTE, ENTONCES CALCULELO SEGUN CONFIGURACION
            execute procedure seleccione_lote(new.arti_cod, NEW.mvar_cant) returning_values(NEW.MVAR_LOTE); */
            if (new.mvar_lote is null) then
                EXCEPTION LOTE_NEGATIVO 'No hay un lote del artículo ' || new.arti_cod || ' con existencia suficiente.';
            end
    END
END
^

SET TERM ; ^

GRANT UPDATE,REFERENCES ON MOVIMIENTO_ARTICULO TO TRIGGER MOVIMIENTO_ARTICULO_BI;
GRANT SELECT ON ARTICULO TO TRIGGER MOVIMIENTO_ARTICULO_BI;

SET TERM ^ ;

CREATE OR ALTER PROCEDURE SELECCIONE_LOTE(
    ARTICULO VARCHAR(15),
    BODEGA VARCHAR(2),
    CANT NUMERIC(18,4))
RETURNS (
    LOTE VARCHAR(15))
AS
declare variable PEPS VARCHAR(4);
declare variable IDLOTE INTEGER;
BEGIN
  EXECUTE PROCEDURE lee_configuracion('INVENTARIO', 'EXISTENCIAS', 'DINAMICA DE LOS LOTES DE MERCANCIA') returning_values (:PEPS);
  if (PEPS = 'PEPS') then
    BEGIN
    SELECT min(LOTE_ID) FROM LOTES WHERE (ARTI_COD = :ARTICULO) AND (BODE_COD = :BODEGA) AND (LOTE_SALDO >= :CANT) INTO :IDLOTE;
    if (IDLOTE > 0) then
        SELECT LOTE_NRO FROM LOTES WHERE LOTE_ID = :IDLOTE INTO :LOTE;
    ELSE
        LOTE = NULL;
    END
  ELSE
    BEGIN
    SELECT MAX(LOTE_ID) FROM LOTES WHERE (ARTI_COD = :ARTICULO) AND (BODE_COD = :BODEGA) AND (LOTE_SALDO >= :CANT) INTO :IDLOTE;
    if (IDLOTE > 0) then
        SELECT LOTE_NRO FROM LOTES WHERE LOTE_ID = :IDLOTE INTO :LOTE;
    ELSE
        LOTE = NULL;
    END
  SUSPEND;
END
^

SET TERM ; ^

GRANT EXECUTE ON PROCEDURE LEE_CONFIGURACION TO PROCEDURE SELECCIONE_LOTE;
GRANT SELECT ON LOTES TO PROCEDURE SELECCIONE_LOTE;

SET TERM ^ ;

CREATE OR ALTER TRIGGER MOVIMIENTO_ARTICULO_BI FOR MOVIMIENTO_ARTICULO
ACTIVE BEFORE INSERT POSITION 0
AS
declare variable LOTE CHAR(1);
BEGIN
  /* INSERTE EL NUEVO LOTE */
  SELECT ARTI_EXIST
    FROM   ARTICULO
    WHERE  ARTICULO.ARTI_COD = NEW.ARTI_COD
    INTO :LOTE;
  if (LOTE = 'L') then
    BEGIN
      if ((NEW.mvar_lote IS NULL) or (NEW.mvar_lote = '')) then
        if (new.mvar_entrada = 'S') then
            new.mvar_lote = cast(new.mvar_cons as varchar(15));
        else
            begin
            /* NO HAY LOTE, ENTONCES CALCULELO SEGUN CONFIGURACION */
            execute procedure seleccione_lote(new.arti_cod, NEW.bode_cod, NEW.mvar_cant) returning_values(NEW.MVAR_LOTE);
            if (new.mvar_lote is null) then
                EXCEPTION LOTE_NEGATIVO 'No hay un lote del artículo ' || new.arti_cod || ' con existencia suficiente.';
            end
    END
END
^

SET TERM ; ^

GRANT UPDATE,REFERENCES ON MOVIMIENTO_ARTICULO TO TRIGGER MOVIMIENTO_ARTICULO_BI;
GRANT SELECT ON ARTICULO TO TRIGGER MOVIMIENTO_ARTICULO_BI;
GRANT EXECUTE ON PROCEDURE SELECCIONE_LOTE TO TRIGGER MOVIMIENTO_ARTICULO_BI;

SET TERM ^ ;

CREATE OR ALTER TRIGGER MOVIMIENTO_ARTICULO_AD FOR MOVIMIENTO_ARTICULO
ACTIVE AFTER DELETE POSITION 0
AS
declare variable LOTE CHAR(1);
BEGIN
  /* INSERTE EL NUEVO LOTE */
  SELECT ARTI_EXIST
    FROM   ARTICULO
    WHERE  ARTICULO.ARTI_COD = OLD.ARTI_COD
    INTO :LOTE;
  /* BORRE LOS VIEJOS */
  if (old.mvar_tipodoc <> 13) then
      BEGIN
      EXECUTE PROCEDURE actualice_costo(old.arti_cod, old.mvar_fecha, old.mvar_costo, old.mvar_cant, old.mvar_entrada, 'S', OLD.mvar_cons, OLD.mvar_tipodoc);
      EXECUTE PROCEDURE chequeo_costos(old.arti_cod, old.mvar_fecha);
      END
  /* actualice existencias */
  if (old.mvar_entrada = 'S') then
    BEGIN
    execute procedure sume_existencia(old.arti_cod, old.bode_cod, old.mvar_fecha, old.mvar_cant, 'S');
    if (LOTE = 'L') then
        UPDATE LOTES
            set lote_saldo = lote_saldo - old.mvar_cant
            where (arti_cod = old.ARTI_COD) and (bode_cod = old.bode_cod) and (lote_nro = old.mvar_lote);
    END
  else
    BEGIN
    execute procedure reste_existencia(old.arti_cod, old.bode_cod, old.mvar_fecha, old.mvar_cant, 'S');
    if (LOTE = 'L') then
        UPDATE LOTES
            set lote_saldo = lote_saldo + old.mvar_cant
            where (arti_cod = old.ARTI_COD) and (bode_cod = old.bode_cod) and (lote_nro = old.mvar_lote);
    END
END
^

SET TERM ; ^

GRANT UPDATE,REFERENCES ON MOVIMIENTO_ARTICULO TO TRIGGER MOVIMIENTO_ARTICULO_AD;
GRANT SELECT ON ARTICULO TO TRIGGER MOVIMIENTO_ARTICULO_AD;
GRANT EXECUTE ON PROCEDURE ACTUALICE_COSTO TO TRIGGER MOVIMIENTO_ARTICULO_AD;
GRANT EXECUTE ON PROCEDURE CHEQUEO_COSTOS TO TRIGGER MOVIMIENTO_ARTICULO_AD;
GRANT EXECUTE ON PROCEDURE SUME_EXISTENCIA TO TRIGGER MOVIMIENTO_ARTICULO_AD;
GRANT SELECT,UPDATE ON LOTES TO TRIGGER MOVIMIENTO_ARTICULO_AD;
GRANT EXECUTE ON PROCEDURE RESTE_EXISTENCIA TO TRIGGER MOVIMIENTO_ARTICULO_AD;

SET TERM ^ ;

CREATE OR ALTER PROCEDURE VENTAS_VENDEDOR(
    CODVEND INTEGER,
    FECINI DATE,
    FECFIN DATE,
    SUBEMPRESA INTEGER)
RETURNS (
    FACTURAS INTEGER,
    MFACTURAS NUMERIC(18,2),
    DEVOLUCIONES INTEGER,
    MDEVOLUCIONES NUMERIC(18,2),
    IVAFACT NUMERIC(18,2),
    IVADEV NUMERIC(18,2),
    CONSUMOF NUMERIC(18,2),
    CONSUMOD NUMERIC(18,2))
AS
BEGIN
  SELECT COUNT(*), SUM(FACT_TOTAL-FACT_IVAMONTO), SUM(FACT_IVAMONTO)
    FROM FACTURAS F, PREFIJOS P
      WHERE VEND_COD = :CODVEND AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND FACT_ANULADO = 'N'
       AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
      INTO :FACTURAS, :MFACTURAS, :IVAFACT;
  SELECT COUNT(*), SUM(DEVT_TOTAL-DEVT_IVAMONTO), SUM(DEVT_IVAMONTO)
    FROM devoluciones_ventas F, PREFIJOS P
      WHERE VEND_COD = :CODVEND AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN  AND DEVT_ANULADO = 'N'
       AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 33 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) and ((devt_remid is null) or (DEVT_REMID = 0))
      INTO :DEVOLUCIONES, :MDEVOLUCIONES, :IVADEV;
  if (MFACTURAS IS NULL) then
    MFACTURAS = 0;
  if (MDEVOLUCIONES IS NULL) then
    MDEVOLUCIONES = 0;
  if (IVAFACT IS NULL) then
    IVAFACT = 0;
  if (IVADEV IS NULL) then
    IVADEV = 0;
  select sum(fade_consumo) from facturas_detalle d, facturas f, PREFIJOS P
    where d.fact_id = f.fact_id and VEND_COD = :CODVEND AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND FACT_ANULADO = 'N'
     AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
    into :consumof;
    if (consumof is null) then
        consumof = 0;
    mfacturas = mfacturas - consumof;
  select sum(dvde_consumo) from devoluciones_ventas_detalle d, devoluciones_ventas f, PREFIJOS P
    where d.devt_id = f.devt_id and VEND_COD = :CODVEND AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND DEVT_ANULADO = 'N'
     AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 33 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) and ((devt_remid is null) or (DEVT_REMID = 0))
    into :consumod;
    if (consumod is null) then
        consumod = 0;
    mdevoluciones = mdevoluciones - consumod;
  SUSPEND;
END
^

SET TERM ; ^

GRANT SELECT ON FACTURAS TO PROCEDURE VENTAS_VENDEDOR;
GRANT SELECT ON PREFIJOS TO PROCEDURE VENTAS_VENDEDOR;
GRANT SELECT ON DEVOLUCIONES_VENTAS TO PROCEDURE VENTAS_VENDEDOR;
GRANT SELECT ON FACTURAS_DETALLE TO PROCEDURE VENTAS_VENDEDOR;
GRANT SELECT ON DEVOLUCIONES_VENTAS_DETALLE TO PROCEDURE VENTAS_VENDEDOR;
SET TERM ^ ;

ALTER PROCEDURE VENTAS_VENDEDOR_MES(
    FECINI DATE,
    FECFIN DATE,
    SUBEMPRESA INTEGER)
RETURNS (
    CODIGO INTEGER,
    NOMBRE VARCHAR(60),
    FACTURAS INTEGER,
    MFACTURAS NUMERIC(18,2),
    DEVOLUCIONES INTEGER,
    MDEVOLUCIONES NUMERIC(18,2),
    IVAFACT NUMERIC(18,2),
    IVADEV NUMERIC(18,2),
    CONSUMOF NUMERIC(18,2),
    CONSUMOD NUMERIC(18,2))
AS
BEGIN /*$$IBE$$ 
  for select VEND_COD, VEND_NOMBRE from VENDEDORES into :CODIGO, :NOMBRE
  DO
    BEGIN
    EXECUTE PROCEDURE VENTAS_VENDEDOR (CODIGO, FECINI, FECFIN, SUBEMPRESA) returning_values (FACTURAS, MFACTURAS, DEVOLUCIONES, MDEVOLUCIONES, IVAFACT, IVADEV, CONSUMOF, CONSUMOD);
    SUSPEND;
    END
 $$IBE$$*/ SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE VENTAS_VENDEDOR_MES(
    FECINI DATE,
    FECFIN DATE,
    SUBEMPRESA INTEGER)
RETURNS (
    CODIGO INTEGER,
    NOMBRE VARCHAR(60),
    FACTURAS INTEGER,
    MFACTURAS NUMERIC(18,2),
    DEVOLUCIONES INTEGER,
    MDEVOLUCIONES NUMERIC(18,2),
    IVAFACT NUMERIC(18,2),
    IVADEV NUMERIC(18,2),
    CONSUMOF NUMERIC(18,2),
    CONSUMOD NUMERIC(18,2))
AS
BEGIN
  for select VEND_COD, VEND_NOMBRE from VENDEDORES into :CODIGO, :NOMBRE
  DO
    BEGIN
    EXECUTE PROCEDURE VENTAS_VENDEDOR (CODIGO, FECINI, FECFIN, SUBEMPRESA) returning_values (FACTURAS, MFACTURAS, DEVOLUCIONES, MDEVOLUCIONES, IVAFACT, IVADEV, CONSUMOF, CONSUMOD);
    SUSPEND;
    END
END

^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER PROCEDURE VENTAS_CLIENTE(
    NIT VARCHAR(20),
    FECINI DATE,
    FECFIN DATE,
    SUBEMPRESA INTEGER)
RETURNS (
    FACTURAS INTEGER,
    MFACTURAS NUMERIC(18,2),
    DEVOLUCIONES INTEGER,
    MDEVOLUCIONES NUMERIC(18,2),
    IVAFACT NUMERIC(18,2),
    IVADEV NUMERIC(18,2),
    CONSUMOF NUMERIC(18,2),
    CONSUMOD NUMERIC(18,2))
AS
BEGIN
  SELECT COUNT(*), SUM(FACT_TOTAL-FACT_IVAMONTO), SUM(FACT_IVAMONTO)
    FROM FACTURAS F, PREFIJOS P
    WHERE TERC_NIT = :NIT AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND FACT_ANULADO = 'N'
     AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
    INTO :FACTURAS, :MFACTURAS, :IVAFACT;
  SELECT COUNT(*), SUM(DEVT_TOTAL-DEVT_IVAMONTO), SUM(DEVT_IVAMONTO)
    FROM devoluciones_ventas F, PREFIJOS P
    WHERE TERC_NIT = :NIT AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND DEVT_ANULADO = 'N'
     AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 33 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) and ((devt_remid is null) or (DEVT_REMID = 0))
    INTO :DEVOLUCIONES, :MDEVOLUCIONES, :IVADEV;
  if (MFACTURAS IS NULL) then
    MFACTURAS = 0;
  if (MDEVOLUCIONES IS NULL) then
    MDEVOLUCIONES = 0;
  if (IVAFACT IS NULL) then
    IVAFACT = 0;
  if (IVADEV IS NULL) then
    IVADEV = 0;
  select sum(fade_consumo) from facturas_detalle d, facturas f, PREFIJOS P
    where d.fact_id = f.fact_id and TERC_NIT = :NIT AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND FACT_ANULADO = 'N'
     AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
    into :consumof;
    if (consumof is null) then
        consumof = 0;
    mfacturas = mfacturas - consumof;
  select sum(dvde_consumo) from devoluciones_ventas_detalle d, devoluciones_ventas f, PREFIJOS P
    where d.devt_id = f.devt_id and TERC_NIT = :NIT AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND DEVT_ANULADO = 'N'
     AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 33 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) and  ((devt_remid is null) or (DEVT_REMID = 0))
    into :consumod;
    if (consumod is null) then
        consumod = 0;
    mdevoluciones = mdevoluciones - consumod;
  SUSPEND;
END
^

SET TERM ; ^

GRANT SELECT ON FACTURAS TO PROCEDURE VENTAS_CLIENTE;
GRANT SELECT ON PREFIJOS TO PROCEDURE VENTAS_CLIENTE;
GRANT SELECT ON DEVOLUCIONES_VENTAS TO PROCEDURE VENTAS_CLIENTE;
GRANT SELECT ON FACTURAS_DETALLE TO PROCEDURE VENTAS_CLIENTE;
GRANT SELECT ON DEVOLUCIONES_VENTAS_DETALLE TO PROCEDURE VENTAS_CLIENTE;
SET TERM ^ ;

ALTER PROCEDURE VENTAS_CLIENTE_MES(
    FECINI DATE,
    FECFIN DATE,
    SUBEMPRESA INTEGER)
RETURNS (
    NIT VARCHAR(20),
    NOMBRE VARCHAR(60),
    FACTURAS INTEGER,
    MFACTURAS NUMERIC(18,2),
    DEVOLUCIONES INTEGER,
    MDEVOLUCIONES NUMERIC(18,2),
    IVAFACT NUMERIC(18,2),
    IVADEV NUMERIC(18,2),
    CONSUMOF NUMERIC(18,2),
    CONSUMOD NUMERIC(18,2))
AS
BEGIN /*$$IBE$$ 
  for select TERC_NIT, TERC_NOM from TERCEROS WHERE TERC_CLIE = 'S' into :NIT, :NOMBRE
  DO
    BEGIN
    EXECUTE PROCEDURE VENTAS_CLIENTE (NIT, FECINI, FECFIN, SUBEMPRESA) returning_values (FACTURAS, MFACTURAS, DEVOLUCIONES, MDEVOLUCIONES, IVAFACT, IVADEV, CONSUMOF, CONSUMOD);
    SUSPEND;
    END
 $$IBE$$*/ SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE VENTAS_CLIENTE_MES(
    FECINI DATE,
    FECFIN DATE,
    SUBEMPRESA INTEGER)
RETURNS (
    NIT VARCHAR(20),
    NOMBRE VARCHAR(60),
    FACTURAS INTEGER,
    MFACTURAS NUMERIC(18,2),
    DEVOLUCIONES INTEGER,
    MDEVOLUCIONES NUMERIC(18,2),
    IVAFACT NUMERIC(18,2),
    IVADEV NUMERIC(18,2),
    CONSUMOF NUMERIC(18,2),
    CONSUMOD NUMERIC(18,2))
AS
BEGIN
  for select TERC_NIT, TERC_NOM from TERCEROS WHERE TERC_CLIE = 'S' into :NIT, :NOMBRE
  DO
    BEGIN
    EXECUTE PROCEDURE VENTAS_CLIENTE (NIT, FECINI, FECFIN, SUBEMPRESA) returning_values (FACTURAS, MFACTURAS, DEVOLUCIONES, MDEVOLUCIONES, IVAFACT, IVADEV, CONSUMOF, CONSUMOD);
    SUSPEND;
    END
END

^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER PROCEDURE VENTAS_ARTICULO_MES(
    FECINI DATE,
    FECFIN DATE,
    SUBEMPRESA INTEGER)
RETURNS (
    ARTICULO VARCHAR(15),
    DESCRIPCION VARCHAR(60),
    CODGRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    CODSUBG VARCHAR(3),
    NOMSUBG VARCHAR(30),
    CODMARC VARCHAR(3),
    NOMMARC VARCHAR(30),
    UNIDAD VARCHAR(8),
    CANTVTAS NUMERIC(18,4),
    BASEVTAS NUMERIC(18,2),
    IVAVTAS NUMERIC(18,2),
    CANTDEV NUMERIC(18,4),
    BASEDEV NUMERIC(18,2),
    IVADEV NUMERIC(18,2))
AS
BEGIN
FOR SELECT MAX(ARTI_COD), SUM(FADE_CANT * FADE_FACTOR), SUM((cast(FADE_TOTAL as double precision)-FADE_IVAMONTO-FADE_CONSUMO)*FACT_FACTOR),
    SUM(FADE_IVAMONTO*FACT_FACTOR)
    FROM FACTURAS_DETALLE D, FACTURAS F, PREFIJOS P
    WHERE F.FACT_ID = D.FACT_ID AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND FACT_ANULADO = 'N'
       AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
    GROUP BY ARTI_COD
    INTO :ARTICULO, :CANTVTAS, :BASEVTAS, :IVAVTAS
    DO
    BEGIN
    SELECT ARTI_DES, ARTI_UNIDAD, A.GRUP_COD, A.SUBG_COD, A.MARC_COD, GRUP_NOM 
        FROM ARTICULO A, GRUPO G WHERE A.ARTI_COD = :articulo AND A.GRUP_COD = G.grup_cod
        INTO :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :NOMGRUPO;
    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
    SELECT SUM(DVDE_CANT * DVDE_FACTOR), SUM((cast(DVDE_TOTAL as double precision)-DVDE_IVAMONTO-DVDE_CONSUMO)*DEVT_FACTOR),
        SUM(DVDE_IVAMONTO*DEVT_FACTOR)
        FROM DEVOLUCIONES_VENTAS F, devoluciones_ventas_DETALLE D, PREFIJOS P
        WHERE F.DEVT_ID = D.DEVT_ID AND ARTI_COD = :ARTICULO AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND DEVT_ANULADO = 'N' AND ((devt_remid is null) or (DEVT_REMID = 0))
        AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 33 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
        INTO :CANTDEV, :BASEDEV, :IVADEV;
    if (cantvtas IS NULL) then
        cantvtas = 0;
    if (cantdev IS NULL) then
        cantdev = 0;
    if (ivavtas IS NULL) then
        ivavtas = 0;
    if (IVADEV IS NULL) then
        IVADEV = 0;
    if (basevtas IS NULL) then
        basevtas = 0;
    if (basedev IS NULL) then
        basedev = 0;
    if ((CANTVTAS <> 0) or (CANTDEV <> 0)) then
        SUSPEND;
    END
END
^

SET TERM ; ^

GRANT SELECT ON FACTURAS_DETALLE TO PROCEDURE VENTAS_ARTICULO_MES;
GRANT SELECT ON FACTURAS TO PROCEDURE VENTAS_ARTICULO_MES;
GRANT SELECT ON PREFIJOS TO PROCEDURE VENTAS_ARTICULO_MES;
GRANT SELECT ON ARTICULO TO PROCEDURE VENTAS_ARTICULO_MES;
GRANT SELECT ON GRUPO TO PROCEDURE VENTAS_ARTICULO_MES;
GRANT SELECT ON MARCAS TO PROCEDURE VENTAS_ARTICULO_MES;
GRANT SELECT ON SUBGRUPO TO PROCEDURE VENTAS_ARTICULO_MES;
GRANT SELECT ON DEVOLUCIONES_VENTAS TO PROCEDURE VENTAS_ARTICULO_MES;
GRANT SELECT ON DEVOLUCIONES_VENTAS_DETALLE TO PROCEDURE VENTAS_ARTICULO_MES;
SET TERM ^ ;

CREATE OR ALTER PROCEDURE DETALLE_VENTAS_VENDEDOR(
    VEND INTEGER,
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    TIPO VARCHAR(8),
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(6),
    ID INTEGER,
    FECDOC DATE,
    SUBTOTAL NUMERIC(18,2),
    IVA NUMERIC(18,2),
    CONSUMO NUMERIC(18,2),
    TOTAL NUMERIC(18,2))
AS
BEGIN
  TIPO = 'FACTVENT';
  FOR SELECT FACT_ID, PREF_PRE, FACT_NUMERO, FACT_FECHA
    FROM FACTURAS
    WHERE VEND_COD = :VEND AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN  AND FACT_ANULADO = 'N'
    INTO :ID, :PREFIJO, :NUMERO, :FECDOC DO
    BEGIN
    EXECUTE PROCEDURE TOTAL_DOC_VENTAS(31, ID) returning_values (SUBTOTAL, IVA, CONSUMO);
    TOTAL = SUBTOTAL + IVA + CONSUMO;
    SUSPEND;
    END
    
  TIPO = 'DEVOLCLI';
  FOR SELECT DEVT_ID, PREF_PRE, DEVT_NUMERO, DEVT_FECHA
    FROM DEVOLUCIONES_VENTAS
    WHERE VEND_COD = :VEND AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND DEVT_ANULADO = 'N' AND ((DEVT_REMID IS NULL) or (DEVT_REMID = 0))
    INTO :ID, :PREFIJO, :NUMERO, :FECDOC DO
    BEGIN
    EXECUTE PROCEDURE TOTAL_DOC_VENTAS(33, ID) returning_values (SUBTOTAL, IVA, CONSUMO);
    TOTAL = SUBTOTAL + IVA + CONSUMO;
    SUBTOTAL = SUBTOTAL * -1;
    IVA = IVA * -1;
    CONSUMO = CONSUMO * -1;
    TOTAL = TOTAL * -1;
    SUSPEND;
    END
END
^

SET TERM ; ^

GRANT SELECT ON FACTURAS TO PROCEDURE DETALLE_VENTAS_VENDEDOR;
GRANT EXECUTE ON PROCEDURE TOTAL_DOC_VENTAS TO PROCEDURE DETALLE_VENTAS_VENDEDOR;
GRANT SELECT ON DEVOLUCIONES_VENTAS TO PROCEDURE DETALLE_VENTAS_VENDEDOR;
SET TERM ^ ;

CREATE OR ALTER PROCEDURE DETALLE_VENTAS_CLIENTE(
    NIT VARCHAR(20),
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    TIPO VARCHAR(8),
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(6),
    ID INTEGER,
    FECDOC DATE,
    SUBTOTAL NUMERIC(18,2),
    IVA NUMERIC(18,2),
    CONSUMO NUMERIC(18,2),
    TOTAL NUMERIC(18,2))
AS
BEGIN
  TIPO = 'FACTVENT';
  FOR SELECT FACT_ID, PREF_PRE, FACT_NUMERO, FACT_FECHA
    FROM FACTURAS
    WHERE TERC_NIT = :NIT AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND FACT_ANULADO = 'N'
    INTO :ID, :PREFIJO, :NUMERO, :FECDOC DO
    BEGIN
    EXECUTE PROCEDURE TOTAL_DOC_VENTAS(31, ID) returning_values (SUBTOTAL, IVA, CONSUMO);
    TOTAL = SUBTOTAL + IVA + CONSUMO;
    SUSPEND;
    END
    
  TIPO = 'DEVOLCLI';
  FOR SELECT DEVT_ID, PREF_PRE, DEVT_NUMERO, DEVT_FECHA
    FROM DEVOLUCIONES_VENTAS
    WHERE TERC_NIT = :NIT AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND DEVT_ANULADO = 'N' AND ((DEVT_REMID IS NULL) or (DEVT_REMID = 0))
    INTO :ID, :PREFIJO, :NUMERO, :FECDOC DO
    BEGIN
    EXECUTE PROCEDURE TOTAL_DOC_VENTAS(33, ID) returning_values (SUBTOTAL, IVA, CONSUMO);
    TOTAL = SUBTOTAL + IVA + CONSUMO;
    SUBTOTAL = SUBTOTAL * -1;
    IVA = IVA * -1;
    CONSUMO = CONSUMO * -1;
    TOTAL = TOTAL * -1;
    SUSPEND;
    END
END
^

SET TERM ; ^

GRANT SELECT ON FACTURAS TO PROCEDURE DETALLE_VENTAS_CLIENTE;
GRANT EXECUTE ON PROCEDURE TOTAL_DOC_VENTAS TO PROCEDURE DETALLE_VENTAS_CLIENTE;
GRANT SELECT ON DEVOLUCIONES_VENTAS TO PROCEDURE DETALLE_VENTAS_CLIENTE;
GRANT ALL ON egresos_crucec TO PUBLIC;
GRANT ALL ON recibos_caja_crucec TO PUBLIC;

/* 20080704 */
SET TERM ^ ;

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

        if (COSTO > 0 ) then
         BEGIN
          /* ACTUALICE EL COSTO POR PROVEEDOR */
          SELECT PVAR_FECHA FROM PROVEEDOR_ARTICULO
            WHERE TERC_NIT = :Nit AND ARTI_COD = NEW.ARTI_COD
            INTO :FECAUX;
          if (FECAUX IS NULL) then
            INSERT INTO PROVEEDOR_ARTICULO (TERC_NIT, ARTI_COD, PVAR_COSTO, PVAR_FECHA, PVAR_COD,PVAR_DES)
                VALUES (:Nit, NEW.ARTI_COD, :COSTO, :fec, NEW.fcde_codprov,NEW.fcde_desc);
          else
            UPDATE PROVEEDOR_ARTICULO
                SET PVAR_COSTO = :COSTO, PVAR_FECHA = :fec, PVAR_COD = NEW.fcde_codprov
                WHERE ARTI_COD = NEW.ARTI_COD AND TERC_NIT = :Nit;
         END
        /* RECORRA LAS LISTAS DE PRECIOS Y CAMBIE EL PRECIO */
        EXECUTE PROCEDURE CALCULA_PRECIOS(NEW.ARTI_COD, :FEC);
        END /* AFECTAR INV */
      else
        BEGIN
        /* SI LOS COSTOS DE LA REMISION ERAN CERO ACTUALICE EL REGISTRO EN MOVIMIENTO_ARTICULO */
        numrows = 0;
        select mvar_cons, MVAR_ITEM, MVAR_FECHA, MVAR_IDREF, MVAR_COSTO, MVAR_CANT, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO
            from movimiento_articulo M, consolidado_faltantes C
            where C.cofa_id = :CONSOLIDA AND mvar_tipodoc = 22 and mvar_idref = C.cofa_idori AND C.cofa_tipoori = 22 and m.arti_cod = new.arti_cod
            into :numrows, :iterem, :fecrem, :idrem, :costorem, :cantrem, :loterem, :prefrem, :numrem;

        if ((numrows <> 0) AND (costorem = 0)) then
            BEGIN
            DELETE FROM MOVIMIENTO_ARTICULO WHERE MVAR_CONS = :numrows;
            INSERT INTO MOVIMIENTO_ARTICULO
              (ARTI_COD, MVAR_CONS, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM, TERC_NIT)
              VALUES(NEW.ARTI_COD, GEN_ID(ID_MOVARTI,1), NEW.BODE_COD, :fecrem, 22, :idrem,
              :CONC, :cantrem, :costo, 'S', :loterem, :prefrem, :numrem, :iterem, :Nit);

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

    /* ACTUALICE EL PENDIENTE  */
    if (CONSOLIDA <> 0) then
        BEGIN
        UPDATE consolidado_faltantes SET COFA_OK = 'S' WHERE COFA_ID = :consolida AND COFA_ITEM = NEW.FCDE_ITEM AND ARTI_COD = NEW.arti_cod;
        EXECUTE procedure LEE_CONFIGURACION ('COMPRAS','DOCUMENTOS','SUMAR CANTIDADES PENDIENTES AL CONSOLIDAR DOCUMENTOS') returning_values (CONSO);
        /* IGNORE LA CONSOLIDACION SI SE VALIDAN CODIGOS DE LA ORDEN */
        SELECT MIN(CEFA_TIPOORI) FROM consolide_faltantes WHERE CEFA_ID = :CONSOLIDA INTO :NUMROWS;
        if (NUMROWS = 23) then
            BEGIN
            EXECUTE PROCEDURE LEE_CONFIGURACION('COMPRAS', 'FACTURAS', 'VERIFICAR CODIGOS DE LA ORDEN') returning_values (MENORV);
            if (MENORV = 'SI') then
                CONSO = 'NO';
            END
        SELECT COUNT(CEFA_ITEM) FROM consolide_faltantes WHERE CEFA_ID = :CONSOLIDA INTO :NUMROWS;
        if ((CONSO = 'SI') AND (NUMROWS > 1)) then
            UPDATE consolidado_faltantes SET COFA_IDDES = NEW.faco_id, COFA_OK = 'S' WHERE COFA_ID = :consolida;
        else
            BEGIN
            /* BUSQUE EL CONSOLIDADO EN EL MISMO ITEM Y SI ES DIFERENTE ACTUALICELO */
            select COFA_CANT * COFA_FACTOR FROM consolidado_faltantes WHERE COFA_ID = :consolida AND COFA_ITEM = NEW.FCDE_ITEM AND ARTI_COD = NEW.arti_cod INTO :CANTREL;
            if (NEW.FCDE_CANT * NEW.FCDE_FACTOR < CANTREL) then
                UPDATE consolidado_faltantes SET COFA_IDDES = NEW.faco_id, COFA_CANT = NEW.FCDE_CANT, COFA_FACTOR = NEW.FCDE_FACTOR
                    WHERE COFA_ID = :consolida AND COFA_ITEM = NEW.FCDE_ITEM AND ARTI_COD = NEW.arti_cod;
            END
        END
    END
END
^

SET TERM ; ^

GRANT UPDATE,REFERENCES ON FACTURAS_COMPRAS_DETALLE TO TRIGGER FACTCOMP_DETALLE_AI;
GRANT SELECT ON FACTURAS_COMPRA TO TRIGGER FACTCOMP_DETALLE_AI;
GRANT SELECT ON CONSOLIDE_FALTANTES TO TRIGGER FACTCOMP_DETALLE_AI;
GRANT EXECUTE ON PROCEDURE LEE_CONFIGURACION TO TRIGGER FACTCOMP_DETALLE_AI;
GRANT EXECUTE ON PROCEDURE FACTOR_UNIDAD_CANT TO TRIGGER FACTCOMP_DETALLE_AI;
GRANT SELECT,INSERT,DELETE ON MOVIMIENTO_ARTICULO TO TRIGGER FACTCOMP_DETALLE_AI;
GRANT SELECT,INSERT,UPDATE ON PROVEEDOR_ARTICULO TO TRIGGER FACTCOMP_DETALLE_AI;
GRANT EXECUTE ON PROCEDURE CALCULA_PRECIOS TO TRIGGER FACTCOMP_DETALLE_AI;
GRANT SELECT,UPDATE ON CONSOLIDADO_FALTANTES TO TRIGGER FACTCOMP_DETALLE_AI;


/* 20080705 */
SET TERM ^ ;

CREATE OR ALTER TRIGGER LOTES_BI FOR LOTES
ACTIVE BEFORE INSERT POSITION 0
AS
declare variable EXISTE integer;
declare variable VENCE DATE;
BEGIN
  /* coloque el ID */
  new.lote_id = gen_ID(ID_LOTE, 1);
  select count(*), max(lote_vence) from entradas_detalle where ARTI_COD = NEW.ARTI_COD AND ENDE_LOTE = NEW.LOTE_NRO INTO :EXISTE, :VENCE;
  if (EXISTE > 0) then
     NEW.LOTE_VENCE = :VENCE;
  else
     begin
     SELECT count(*), max(lote_vence) from ensambles WHERE ARTI_COD = NEW.ARTI_COD AND ENSA_LOTE = NEW.LOTE_NRO INTO :EXISTE, :VENCE;
     if (EXISTE > 0) then
       NEW.LOTE_VENCE = :VENCE;
     else
      begin
      SELECT count(*), max(lote_vence) from facturas_compras_detalle WHERE ARTI_COD = NEW.ARTI_COD AND FCDE_LOTE = NEW.LOTE_NRO INTO :EXISTE, :VENCE;
      if (EXISTE > 0) then
        NEW.LOTE_VENCE = :VENCE;
      else
       begin
       SELECT count(*), max(lote_vence) from remision_proveedor_det WHERE ARTI_COD = NEW.ARTI_COD AND RPVD_LOTE = NEW.LOTE_NRO INTO :EXISTE, :VENCE;
       if (EXISTE > 0) then
         NEW.LOTE_VENCE = :VENCE;
       else
        begin
        SELECT count(*), max(lote_vence) from devoluciones_ventas_detalle WHERE ARTI_COD = NEW.ARTI_COD AND DVDE_LOTE = NEW.LOTE_NRO INTO :EXISTE, :VENCE;
        if (EXISTE > 0) then
          NEW.LOTE_VENCE = :VENCE;
        end
       end
      end
     END
END
^

SET TERM ; ^

GRANT UPDATE,REFERENCES ON LOTES TO TRIGGER LOTES_BI;
GRANT SELECT ON ENTRADAS_DETALLE TO TRIGGER LOTES_BI;
GRANT SELECT ON ENSAMBLES TO TRIGGER LOTES_BI;
GRANT SELECT ON FACTURAS_COMPRAS_DETALLE TO TRIGGER LOTES_BI;
GRANT SELECT ON REMISION_PROVEEDOR_DET TO TRIGGER LOTES_BI;
GRANT SELECT ON DEVOLUCIONES_VENTAS_DETALLE TO TRIGGER LOTES_BI;


/* 20080706 */
SET TERM ^ ;

CREATE OR ALTER PROCEDURE REP_ARTICULOS_VENDEDOR(
    TIPO INTEGER,
    DETALLE CHAR(1),
    DESDE VARCHAR(20),
    HASTA VARCHAR(20),
    FECINI DATE,
    FECFIN DATE,
    ARTINI VARCHAR(15),
    ARTFIN VARCHAR(15),
    GRPINI VARCHAR(3),
    GRPFIN VARCHAR(3),
    ORDEN CHAR(1),
    AGRUPA CHAR(1),
    ZONA CHAR(1),
    CEROS CHAR(1),
    SUBEMPRESA INTEGER,
    ZONAINI CHAR(2),
    ZONAFIN CHAR(2))
RETURNS (
    CODVEND VARCHAR(20),
    NOMVEND VARCHAR(60),
    NOMTIPO VARCHAR(50),
    ARTICULO VARCHAR(15),
    DESCRIPCION VARCHAR(60),
    CODGRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    CODSUBG VARCHAR(3),
    NOMSUBG VARCHAR(30),
    CODMARC VARCHAR(3),
    NOMMARC VARCHAR(30),
    UNIDAD VARCHAR(8),
    CANTIDAD NUMERIC(18,4),
    BASE NUMERIC(18,2),
    IVA NUMERIC(18,2),
    CONSUMO NUMERIC(18,2),
    TOTAL NUMERIC(18,2),
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    DTO NUMERIC(9,2),
    NIT VARCHAR(20),
    NOMCLIENTE VARCHAR(60),
    CODZONA VARCHAR(2),
    NOMZONA VARCHAR(60))
AS
declare variable codini varchar(15);
declare variable codfin varchar(15);
declare variable desini varchar(15);
declare variable desfin varchar(15);
declare variable marini varchar(3);
declare variable marfin varchar(3);
BEGIN
if (ORDEN = 'C') then
    BEGIN
    CODINI = ARTINI;
    CODFIN = ARTFIN;
    DESINI = '';
    DESFIN = 'zz';
    END
ELSE
    BEGIN
    DESINI = ARTINI;
    DESFIN = ARTFIN;
    CODINI = '';
    CODFIN = 'zz';
    END
if (AGRUPA = 'G') then
    BEGIN
    MARINI = '';
    MARFIN = 'zz';
    END
ELSE
    if (AGRUPA = 'M') then
        BEGIN
        MARINI = GRPINI;
        MARFIN = GRPFIN;
        GRPINI = '';
        GRPFIN = 'zz';
        END
    ELSE
        BEGIN
        MARINI = '';
        MARFIN = 'zz';
        END
if (DETALLE = 'N') then
    BEGIN
    if (BIN_AND(TIPO, 1) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 31 INTO :NOMTIPO;
        FOR SELECT MAX(D.ARTI_COD), MAX(VEND_COD), SUM(FADE_CANT * FADE_FACTOR), SUM((FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO)*FACT_FACTOR), SUM(FADE_IVAMONTO*FACT_FACTOR), SUM(FADE_CONSUMO), SUM(FADE_TOTAL*FACT_FACTOR),
            MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD)
            FROM FACTURAS_DETALLE D, FACTURAS F, PREFIJOS P, ARTICULO A
            WHERE F.FACT_ID = D.FACT_ID AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND D.ARTI_COD = A.arti_cod AND
            VEND_COD >= :DESDE AND VEND_COD <= :HASTA AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            FACT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY VEND_COD, D.ARTI_COD
            INTO :ARTICULO, :CODVEND, :CANTIDAD, :BASE, :IVA, :CONSUMO, :TOTAL,
            :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
            DO
            BEGIN
            select VEND_NOMBRE from VENDEDORES where VEND_COD = :CODVEND INTO :NOMVEND;
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            if (CEROS = 'S') then
                SUSPEND;
            ELSE
                if ((BASE <> 0) AND (CANTIDAD <> 0)) then
                    SUSPEND;
            END /* FOR */
        END
    if (BIN_AND(TIPO, 2) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 32 INTO :NOMTIPO;
        FOR SELECT MAX(D.ARTI_COD), MAX(VEND_COD), SUM(RVDE_CANT * RVDE_FACTOR), SUM(RVDE_TOTAL-RVDE_IVAMONTO-RVDE_CONSUMO), SUM(RVDE_IVAMONTO), SUM(RVDE_CONSUMO), SUM(RVDE_TOTAL),
            MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD)
            FROM REMISIONES_VENTA_DETALLE D, REMISIONES_VENTA R, PREFIJOS P, ARTICULO A
            WHERE R.REVT_ID = D.REVT_ID AND P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = 32 AND D.ARTI_COD = A.arti_cod AND
            VEND_COD >= :DESDE AND VEND_COD <= :HASTA AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            REVT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY R.vend_cod, D.ARTI_COD
            INTO :ARTICULO, :CODVEND, :CANTIDAD, :BASE, :IVA, :CONSUMO, :TOTAL,
            :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
            DO
            BEGIN
            select VEND_NOMBRE from VENDEDORES where VEND_COD = :CODVEND INTO :NOMVEND;
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            if (CEROS = 'S') then
                SUSPEND;
            ELSE
                if ((BASE <> 0) AND (CANTIDAD <> 0)) then
                    SUSPEND;
            END /* FOR */
        END
    if (BIN_AND(TIPO, 4) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 33 INTO :NOMTIPO;
        FOR SELECT MAX(D.ARTI_COD), MAX(VEND_COD), SUM(DVDE_CANT * DVDE_FACTOR), SUM((DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO)*DEVT_FACTOR), SUM(DVDE_IVAMONTO*DEVT_FACTOR), SUM(DVDE_CONSUMO), SUM(DVDE_TOTAL*DEVT_FACTOR),
            MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD)
            FROM devoluciones_ventas_detalle D, DEVOLUCIONES_VENTAS V, PREFIJOS P, ARTICULO A
            WHERE V.DEVT_ID = D.DEVT_ID AND P.PREF_PRE = V.PREF_PRE AND P.TIDO_COD = 33 AND D.ARTI_COD = A.arti_cod AND
            VEND_COD >= :DESDE AND VEND_COD <= :HASTA AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            DEVT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY V.vend_cod, D.ARTI_COD
            INTO :ARTICULO, :CODVEND, :CANTIDAD, :BASE, :IVA, :CONSUMO, :TOTAL,
            :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
            DO
            BEGIN
            select VEND_NOMBRE from VENDEDORES where VEND_COD = :CODVEND INTO :NOMVEND;
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            if (CEROS = 'S') then
                SUSPEND;
            ELSE
                if ((BASE <> 0) AND (CANTIDAD <> 0)) then
                    SUSPEND;
            END /* FOR */
        END
    if (BIN_AND(TIPO, 8) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 34 INTO :NOMTIPO;
        FOR SELECT MAX(D.ARTI_COD), MAX(VEND_COD), SUM(PEDE_CANT * PEDE_FACTOR), SUM((PEDE_TOTAL-PEDE_IVAMONTO-PEDE_CONSUMO)*PEDI_FACTOR), SUM(PEDE_IVAMONTO*PEDI_FACTOR), SUM(PEDE_CONSUMO), SUM(PEDE_TOTAL*PEDI_FACTOR),
            MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD)
            FROM PEDIDOS_DETALLE D, PEDIDOS P, PREFIJOS R, ARTICULO A
            WHERE P.PEDI_ID = D.PEDI_ID AND P.PREF_PRE = R.PREF_PRE AND R.TIDO_COD = 34 AND D.ARTI_COD = A.arti_cod AND
            VEND_COD >= :DESDE AND VEND_COD <= :HASTA AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            PEDI_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY P.vend_cod, D.ARTI_COD
            INTO :ARTICULO, :CODVEND, :CANTIDAD, :BASE, :IVA, :CONSUMO, :TOTAL,
            :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
            DO
            BEGIN
            select VEND_NOMBRE from VENDEDORES where VEND_COD = :CODVEND INTO :NOMVEND;
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            if (CEROS = 'S') then
                SUSPEND;
            ELSE
                if ((BASE <> 0) AND (CANTIDAD <> 0)) then
                    SUSPEND;
            END /* FOR */
        END
    if (BIN_AND(TIPO, 16) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 35 INTO :NOMTIPO;
        FOR SELECT MAX(D.ARTI_COD), MAX(VEND_COD), SUM(CTDE_CANT * CTDE_FACTOR), SUM((CTDE_TOTAL-CTDE_IVAMONTO-CTDE_CONSUMO)*COTI_FACTOR), SUM(CTDE_IVAMONTO*COTI_FACTOR), SUM(CTDE_CONSUMO), SUM(CTDE_TOTAL*COTI_FACTOR),
            MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD)
            FROM COTIZACIONES_DETALLE D, COTIZACIONES C, PREFIJOS P, ARTICULO A
            WHERE C.COTI_ID = D.COTI_ID AND P.PREF_PRE = C.PREF_PRE AND P.TIDO_COD = 35 AND D.ARTI_COD = A.arti_cod AND
            VEND_COD >= :DESDE AND VEND_COD <= :HASTA AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND COTI_FECHA >= :FECINI AND COTI_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            COTI_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY C.vend_cod, D.ARTI_COD
            INTO :ARTICULO, :CODVEND, :CANTIDAD, :BASE, :IVA, :CONSUMO, :TOTAL,
            :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
            DO
            BEGIN
            select VEND_NOMBRE from VENDEDORES where VEND_COD = :CODVEND INTO :NOMVEND;
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            if (CEROS = 'S') then
                SUSPEND;
            ELSE
                if ((BASE <> 0) AND (CANTIDAD <> 0)) then
                    SUSPEND;
            END /* FOR */
        END
    END
ELSE
  if (DETALLE = 'S') then
    BEGIN
    if (BIN_AND(TIPO, 1) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 31 INTO :NOMTIPO;
        FOR SELECT F.PREF_PRE, FACT_NUMERO, FACT_FECHA, VEND_COD, D.ARTI_COD, FADE_CANT * FADE_FACTOR, (FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO)*FACT_FACTOR, FADE_IVAMONTO*FACT_FACTOR, FADE_CONSUMO, FADE_DTOPORC, FADE_TOTAL*FACT_FACTOR,
            ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD , F.TERC_NIT, F.fact_nomcliente
            FROM FACTURAS F, FACTURAS_DETALLE D, PREFIJOS P, ARTICULO A
            WHERE F.FACT_ID = D.FACT_ID AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND D.ARTI_COD = A.arti_cod AND
                VEND_COD >= :DESDE AND VEND_COD <= :HASTA AND
                A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
                A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND FACT_FECHA >= :FECINI AND
                (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
                FACT_FECHA <= :FECFIN AND FACT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            ORDER BY VEND_COD, D.ARTI_COD, FACT_FECHA, F.FACT_ID, FADE_ITEM
            INTO :PREFIJO, :NUMERO, :FECHA, :CODVEND, :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO, :DTO, :TOTAL,
                :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :NIT, :nomcliente
            DO
            BEGIN
            select VEND_NOMBRE from VENDEDORES where VEND_COD = :CODVEND INTO :NOMVEND;
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            SUSPEND;
            END
        END
    if (BIN_AND(TIPO, 2) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 32 INTO :NOMTIPO;
        FOR SELECT R.PREF_PRE, REVT_NUMERO, REVT_FECHA, VEND_COD, D.ARTI_COD, RVDE_CANT * RVDE_FACTOR, (RVDE_TOTAL-RVDE_IVAMONTO-RVDE_CONSUMO), RVDE_IVAMONTO, RVDE_CONSUMO, RVDE_DTOPORC, RVDE_TOTAL,
            ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD, R.terc_nit, R.revt_nomterc
            FROM REMISIONES_VENTA R, REMISIONES_VENTA_DETALLE D, PREFIJOS P, ARTICULO A
            WHERE R.REVT_ID = D.REVT_ID AND P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = 32 AND D.ARTI_COD = A.arti_cod AND
                VEND_COD >= :DESDE AND VEND_COD <= :HASTA AND
                A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
                A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN AND
                (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
                REVT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            ORDER BY VEND_COD, D.ARTI_COD, REVT_FECHA, R.REVT_ID, RVDE_ITEM
            INTO :PREFIJO, :NUMERO, :FECHA, :CODVEND, :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO, :DTO, :TOTAL,
                :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :NIT, :nomcliente
            DO
            BEGIN
            select VEND_NOMBRE from VENDEDORES where VEND_COD = :CODVEND INTO :NOMVEND;
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            SUSPEND;
            END
        END
    if (BIN_AND(TIPO, 4) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 33 INTO :NOMTIPO;
        FOR SELECT V.PREF_PRE, DEVT_NUMERO, DEVT_FECHA, VEND_COD, D.ARTI_COD, DVDE_CANT * DVDE_FACTOR, (DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO)*DEVT_FACTOR, DVDE_IVAMONTO*DEVT_FACTOR, DVDE_CONSUMO, DVDE_DTOPORC, DVDE_TOTAL*DEVT_FACTOR,
            ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD, V.terc_nit, V.devt_nomterc
            FROM DEVOLUCIONES_VENTAS V, DEVOLUCIONES_VENTAS_DETALLE D, PREFIJOS P, ARTICULO A
            WHERE V.DEVT_ID = D.DEVT_ID AND P.PREF_PRE = V.PREF_PRE AND P.TIDO_COD = 33 AND D.ARTI_COD = A.arti_cod AND
                VEND_COD >= :DESDE AND VEND_COD <= :HASTA AND
                A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
                A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND
                (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
                DEVT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            ORDER BY VEND_COD, D.ARTI_COD, DEVT_FECHA, V.DEVT_ID, DVDE_ITEM
            INTO :PREFIJO, :NUMERO, :FECHA, :CODVEND, :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO, :DTO, :TOTAL,
                :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :NIT, :nomcliente
            DO
            BEGIN
            select VEND_NOMBRE from VENDEDORES where VEND_COD = :CODVEND INTO :NOMVEND;
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            SUSPEND;
            END
        END
    if (BIN_AND(TIPO, 8) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 34 INTO :NOMTIPO;
        FOR SELECT P.PREF_PRE, PEDI_NUMERO, PEDI_FECHA, VEND_COD, D.ARTI_COD, PEDE_CANT * PEDE_FACTOR, (PEDE_TOTAL-PEDE_IVAMONTO-PEDE_CONSUMO)*PEDI_FACTOR, PEDE_IVAMONTO*PEDI_FACTOR, PEDE_CONSUMO, PEDE_DTOPORC, PEDE_TOTAL*PEDI_FACTOR,
            ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD, P.terc_nit, P.pedi_nomterc
            FROM PEDIDOS P, PEDIDOS_DETALLE D, PREFIJOS R, ARTICULO A
            WHERE P.PEDI_ID = D.PEDI_ID AND P.PREF_PRE = R.PREF_PRE AND R.TIDO_COD = 34 AND D.ARTI_COD = A.arti_cod AND
                VEND_COD >= :DESDE AND VEND_COD <= :HASTA AND
                A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
                A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND
                (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
                PEDI_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            ORDER BY VEND_COD, D.ARTI_COD, PEDI_FECHA, P.PEDI_ID, PEDE_ITEM
            INTO :PREFIJO, :NUMERO, :FECHA, :CODVEND, :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO, :DTO, :TOTAL,
                :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :NIT, :nomcliente
            DO
            BEGIN
            select VEND_NOMBRE from VENDEDORES where VEND_COD = :CODVEND INTO :NOMVEND;
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            SUSPEND;
            END
        END
    if (BIN_AND(TIPO, 16) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 35 INTO :NOMTIPO;
        FOR SELECT C.PREF_PRE, COTI_NUMERO, COTI_FECHA, VEND_COD, D.ARTI_COD, CTDE_CANT * CTDE_FACTOR, (CTDE_TOTAL-CTDE_IVAMONTO-CTDE_CONSUMO)*COTI_FACTOR, CTDE_IVAMONTO*COTI_FACTOR, CTDE_CONSUMO, CTDE_DTOPORC, CTDE_TOTAL*COTI_FACTOR,
            ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD, C.terc_nit, C.coti_nomterc
            FROM COTIZACIONES C, COTIZACIONES_DETALLE D, PREFIJOS P, ARTICULO A
            WHERE C.COTI_ID = D.COTI_ID AND P.PREF_PRE = C.PREF_PRE AND P.TIDO_COD = 35 AND D.ARTI_COD = A.arti_cod AND
                VEND_COD >= :DESDE AND VEND_COD <= :HASTA AND
                A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
                A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND COTI_FECHA >= :FECINI AND COTI_FECHA <= :FECFIN AND
                (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
                COTI_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            ORDER BY VEND_COD, D.ARTI_COD, COTI_FECHA, C.COTI_ID, CTDE_ITEM
            INTO :PREFIJO, :NUMERO, :FECHA, :CODVEND, :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO, :DTO, :TOTAL,
                :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :NIT, :nomcliente
            DO
            BEGIN
            select VEND_NOMBRE from VENDEDORES where VEND_COD = :CODVEND INTO :NOMVEND;
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            SUSPEND;
            END
        END
    END
  ELSE
if (DETALLE = 'C') then
    BEGIN
    if (BIN_AND(TIPO, 1) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 31 INTO :NOMTIPO;
        FOR SELECT MAX(D.ARTI_COD), MAX(VEND_COD), SUM(FADE_CANT * FADE_FACTOR), SUM((FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO)*FACT_FACTOR), SUM(FADE_IVAMONTO*FACT_FACTOR), SUM(FADE_CONSUMO), SUM(FADE_TOTAL*FACT_FACTOR),
            MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD), MAX(F.terc_nit), MAX(F.fact_nomcliente)
            FROM FACTURAS_DETALLE D, FACTURAS F, PREFIJOS P, ARTICULO A
            WHERE F.FACT_ID = D.FACT_ID AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND D.ARTI_COD = A.arti_cod AND
            VEND_COD >= :DESDE AND VEND_COD <= :HASTA AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            FACT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY F.VEND_COD, F.TERC_NIT, D.ARTI_COD
            INTO :ARTICULO, :CODVEND, :CANTIDAD, :BASE, :IVA, :CONSUMO, :TOTAL,
            :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :nit, :nomcliente
            DO
            BEGIN
            select VEND_NOMBRE from VENDEDORES where VEND_COD = :CODVEND INTO :NOMVEND;
            SELECT C.ZONA_COD, ZONA_NOM FROM CLIENTES C, ZONAS Z WHERE C.zona_cod = Z.zona_cod AND C.terc_nit = :nit INTO :codzona, :nomzona;
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            if (CEROS = 'S') then
                SUSPEND;
            ELSE
                if ((BASE <> 0) AND (CANTIDAD <> 0)) then
                    SUSPEND;
            END /* FOR */
        END
    if (BIN_AND(TIPO, 2) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 32 INTO :NOMTIPO;
        FOR SELECT MAX(D.ARTI_COD), MAX(VEND_COD), SUM(RVDE_CANT * RVDE_FACTOR), SUM(RVDE_TOTAL-RVDE_IVAMONTO-RVDE_CONSUMO), SUM(RVDE_IVAMONTO), SUM(RVDE_CONSUMO), SUM(RVDE_TOTAL),
            MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD), MAX(R.terc_nit), MAX(R.revt_nomterc)
            FROM REMISIONES_VENTA_DETALLE D, REMISIONES_VENTA R, PREFIJOS P, ARTICULO A
            WHERE R.REVT_ID = D.REVT_ID AND P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = 32 AND D.ARTI_COD = A.arti_cod AND
            VEND_COD >= :DESDE AND VEND_COD <= :HASTA AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            REVT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY R.vend_cod, R.terc_nit, D.arti_cod
            INTO :ARTICULO, :CODVEND, :CANTIDAD, :BASE, :IVA, :CONSUMO, :TOTAL,
            :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :nit, :nomcliente
            DO
            BEGIN
            SELECT C.ZONA_COD, ZONA_NOM FROM CLIENTES C, ZONAS Z WHERE C.zona_cod = Z.zona_cod AND C.terc_nit = :nit INTO :codzona, :nomzona;
            select VEND_NOMBRE from VENDEDORES where VEND_COD = :CODVEND INTO :NOMVEND;
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            if (CEROS = 'S') then
                SUSPEND;
            ELSE
                if ((BASE <> 0) AND (CANTIDAD <> 0)) then
                    SUSPEND;
            END /* FOR */
        END
    if (BIN_AND(TIPO, 4) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 33 INTO :NOMTIPO;
        FOR SELECT MAX(D.ARTI_COD), MAX(VEND_COD), SUM(DVDE_CANT * DVDE_FACTOR), SUM((DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO)*DEVT_FACTOR), SUM(DVDE_IVAMONTO*DEVT_FACTOR), SUM(DVDE_CONSUMO), SUM(DVDE_TOTAL*DEVT_FACTOR),
            MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD), MAX(V.terc_nit), MAX(V.devt_nomterc)
            FROM devoluciones_ventas_detalle D, DEVOLUCIONES_VENTAS V, PREFIJOS P, ARTICULO A
            WHERE V.DEVT_ID = D.DEVT_ID AND P.PREF_PRE = V.PREF_PRE AND P.TIDO_COD = 33 AND D.ARTI_COD = A.arti_cod AND
            VEND_COD >= :DESDE AND VEND_COD <= :HASTA AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            DEVT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY V.vend_cod, V.terc_nit, D.arti_cod
            INTO :ARTICULO, :CODVEND, :CANTIDAD, :BASE, :IVA, :CONSUMO, :TOTAL,
            :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :nit, :nomcliente
            DO
            BEGIN
            SELECT C.ZONA_COD, ZONA_NOM FROM CLIENTES C, ZONAS Z WHERE C.zona_cod = Z.zona_cod AND C.terc_nit = :nit INTO :codzona, :nomzona;
            select VEND_NOMBRE from VENDEDORES where VEND_COD = :CODVEND INTO :NOMVEND;
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            if (CEROS = 'S') then
                SUSPEND;
            ELSE
                if ((BASE <> 0) AND (CANTIDAD <> 0)) then
                    SUSPEND;
            END /* FOR */
        END
    if (BIN_AND(TIPO, 8) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 34 INTO :NOMTIPO;
        FOR SELECT MAX(D.ARTI_COD), MAX(VEND_COD), SUM(PEDE_CANT * PEDE_FACTOR), SUM((PEDE_TOTAL-PEDE_IVAMONTO-PEDE_CONSUMO)*PEDI_FACTOR), SUM(PEDE_IVAMONTO*PEDI_FACTOR), SUM(PEDE_CONSUMO), SUM(PEDE_TOTAL*PEDI_FACTOR),
            MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD), MAX(P.terc_nit), MAX(P.pedi_nomterc)
            FROM PEDIDOS_DETALLE D, PEDIDOS P, PREFIJOS R, ARTICULO A
            WHERE P.PEDI_ID = D.PEDI_ID AND P.PREF_PRE = R.PREF_PRE AND R.TIDO_COD = 34 AND D.ARTI_COD = A.arti_cod AND
            VEND_COD >= :DESDE AND VEND_COD <= :HASTA AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            PEDI_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY P.vend_cod, P.terc_nit, D.arti_cod
            INTO :ARTICULO, :CODVEND, :CANTIDAD, :BASE, :IVA, :CONSUMO, :TOTAL,
            :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :nit, :nomcliente
            DO
            BEGIN
            SELECT C.ZONA_COD, ZONA_NOM FROM CLIENTES C, ZONAS Z WHERE C.zona_cod = Z.zona_cod AND C.terc_nit = :nit INTO :codzona, :nomzona;
            select VEND_NOMBRE from VENDEDORES where VEND_COD = :CODVEND INTO :NOMVEND;
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            if (CEROS = 'S') then
                SUSPEND;
            ELSE
                if ((BASE <> 0) AND (CANTIDAD <> 0)) then
                    SUSPEND;
            END /* FOR */
        END
    if (BIN_AND(TIPO, 16) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 35 INTO :NOMTIPO;
        FOR SELECT MAX(D.ARTI_COD), MAX(VEND_COD), SUM(CTDE_CANT * CTDE_FACTOR), SUM((CTDE_TOTAL-CTDE_IVAMONTO-CTDE_CONSUMO)*COTI_FACTOR), SUM(CTDE_IVAMONTO*COTI_FACTOR), SUM(CTDE_CONSUMO), SUM(CTDE_TOTAL*COTI_FACTOR),
            MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD), MAX(C.terc_nit), MAX(C.coti_nomterc)
            FROM COTIZACIONES_DETALLE D, COTIZACIONES C, PREFIJOS P, ARTICULO A
            WHERE C.COTI_ID = D.COTI_ID AND P.PREF_PRE = C.PREF_PRE AND P.TIDO_COD = 35 AND D.ARTI_COD = A.arti_cod AND
            VEND_COD >= :DESDE AND VEND_COD <= :HASTA AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND COTI_FECHA >= :FECINI AND COTI_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            COTI_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY C.vend_cod, C.terc_nit, D.arti_cod
            INTO :ARTICULO, :CODVEND, :CANTIDAD, :BASE, :IVA, :CONSUMO, :TOTAL,
            :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :nit, :nomcliente
            DO
            BEGIN
            SELECT C.ZONA_COD, ZONA_NOM FROM CLIENTES C, ZONAS Z WHERE C.zona_cod = Z.zona_cod AND C.terc_nit = :nit INTO :codzona, :nomzona;
            select VEND_NOMBRE from VENDEDORES where VEND_COD = :CODVEND INTO :NOMVEND;
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            if (CEROS = 'S') then
                SUSPEND;
            ELSE
                if ((BASE <> 0) AND (CANTIDAD <> 0)) then
                    SUSPEND;
            END /* FOR */
        END
    END
if (zona = 'S') then
    BEGIN
    if (BIN_AND(TIPO, 1) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 31 INTO :NOMTIPO;
        FOR SELECT MAX(D.ARTI_COD), MAX(F.VEND_COD), SUM(FADE_CANT * FADE_FACTOR), SUM((FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO)*FACT_FACTOR), SUM(FADE_IVAMONTO*FACT_FACTOR), SUM(FADE_CONSUMO), SUM(FADE_TOTAL*FACT_FACTOR),
            MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD), MAX(F.terc_nit), MAX(F.fact_nomcliente)
            FROM FACTURAS_DETALLE D, FACTURAS F, PREFIJOS P, ARTICULO A, clientes C, ZONAS Z
            WHERE F.FACT_ID = D.FACT_ID AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND D.ARTI_COD = A.arti_cod AND
            F.VEND_COD >= :DESDE AND F.VEND_COD <= :HASTA AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            FACT_ANULADO = 'N' AND ((P.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) AND F.terc_nit = C.terc_nit AND
            Z.zona_cod = C.zona_cod AND C.zona_cod >= :zonaini AND C.zona_cod <= :zonafin
            GROUP BY F.VEND_COD, C.zona_cod ,D.ARTI_COD , C.terc_nit
            INTO :ARTICULO, :CODVEND, :CANTIDAD, :BASE, :IVA, :CONSUMO, :TOTAL,
            :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :nit, :nomcliente
            DO
            BEGIN
            select VEND_NOMBRE from VENDEDORES where VEND_COD = :CODVEND INTO :NOMVEND;
            SELECT C.ZONA_COD, ZONA_NOM FROM CLIENTES C, ZONAS Z WHERE C.zona_cod = Z.zona_cod AND C.terc_nit = :nit /*AND Z.zona_cod >= :zonaini AND Z.zona_cod >= :zonafin*/ INTO :codzona, :nomzona;
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            if (CEROS = 'S') then
                SUSPEND;
            ELSE
                if ((BASE <> 0) AND (CANTIDAD <> 0)) then
                    SUSPEND;
            END /* FOR */
        END
    if (BIN_AND(TIPO, 2) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 32 INTO :NOMTIPO;
        FOR SELECT MAX(D.ARTI_COD), MAX(R.VEND_COD), SUM(RVDE_CANT * RVDE_FACTOR), SUM(RVDE_TOTAL-RVDE_IVAMONTO-RVDE_CONSUMO), SUM(RVDE_IVAMONTO), SUM(RVDE_CONSUMO), SUM(RVDE_TOTAL),
            MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD), MAX(R.terc_nit), MAX(R.revt_nomterc)
            FROM REMISIONES_VENTA_DETALLE D, REMISIONES_VENTA R, PREFIJOS P, ARTICULO A, clientes C, ZONAS Z
            WHERE R.REVT_ID = D.REVT_ID AND P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = 32 AND D.ARTI_COD = A.arti_cod AND
            R.VEND_COD >= :DESDE AND R.VEND_COD <= :HASTA AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            REVT_ANULADO = 'N' AND ((P.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))AND R.terc_nit = C.terc_nit AND
            Z.zona_cod = C.zona_cod AND C.zona_cod >= :zonaini AND C.zona_cod <= :zonafin
            GROUP BY R.vend_cod, c.zona_cod, D.arti_cod , R.terc_nit
            INTO :ARTICULO, :CODVEND, :CANTIDAD, :BASE, :IVA, :CONSUMO, :TOTAL,
            :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :nit, :nomcliente
            DO
            BEGIN
            SELECT C.ZONA_COD, ZONA_NOM FROM CLIENTES C, ZONAS Z WHERE C.zona_cod = Z.zona_cod AND C.terc_nit = :nit INTO :codzona, :nomzona;
            select VEND_NOMBRE from VENDEDORES where VEND_COD = :CODVEND INTO :NOMVEND;
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            if (CEROS = 'S') then
                SUSPEND;
            ELSE
                if ((BASE <> 0) AND (CANTIDAD <> 0)) then
                    SUSPEND;
            END /* FOR */
        END
    if (BIN_AND(TIPO, 4) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 33 INTO :NOMTIPO;
        FOR SELECT MAX(D.ARTI_COD), MAX(V.VEND_COD), SUM(DVDE_CANT * DVDE_FACTOR), SUM((DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO)*DEVT_FACTOR), SUM(DVDE_IVAMONTO*DEVT_FACTOR), SUM(DVDE_CONSUMO), SUM(DVDE_TOTAL*DEVT_FACTOR),
            MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD), MAX(V.terc_nit), MAX(V.devt_nomterc)
            FROM devoluciones_ventas_detalle D, DEVOLUCIONES_VENTAS V, PREFIJOS P, ARTICULO A, clientes C, ZONAS Z
            WHERE V.DEVT_ID = D.DEVT_ID AND P.PREF_PRE = V.PREF_PRE AND P.TIDO_COD = 33 AND D.ARTI_COD = A.arti_cod AND
            V.VEND_COD >= :DESDE AND V.VEND_COD <= :HASTA AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            DEVT_ANULADO = 'N' AND ((P.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))AND V.terc_nit = C.terc_nit AND
            Z.zona_cod = C.zona_cod AND C.zona_cod >= :zonaini AND C.zona_cod <= :zonafin
            GROUP BY V.vend_cod, c.zona_cod, D.arti_cod , V.terc_nit
            INTO :ARTICULO, :CODVEND, :CANTIDAD, :BASE, :IVA, :CONSUMO, :TOTAL,
            :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :nit, :nomcliente
            DO
            BEGIN
            SELECT C.ZONA_COD, ZONA_NOM FROM CLIENTES C, ZONAS Z WHERE C.zona_cod = Z.zona_cod AND C.terc_nit = :nit INTO :codzona, :nomzona;
            select VEND_NOMBRE from VENDEDORES where VEND_COD = :CODVEND INTO :NOMVEND;
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            if (CEROS = 'S') then
                SUSPEND;
            ELSE
                if ((BASE <> 0) AND (CANTIDAD <> 0)) then
                    SUSPEND;
            END /* FOR */
        END
    if (BIN_AND(TIPO, 8) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 34 INTO :NOMTIPO;
        FOR SELECT MAX(D.ARTI_COD), MAX(P.VEND_COD), SUM(PEDE_CANT * PEDE_FACTOR), SUM((PEDE_TOTAL-PEDE_IVAMONTO-PEDE_CONSUMO)*PEDI_FACTOR), SUM(PEDE_IVAMONTO*PEDI_FACTOR), SUM(PEDE_CONSUMO), SUM(PEDE_TOTAL*PEDI_FACTOR),
            MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD), MAX(P.terc_nit), MAX(P.pedi_nomterc)
            FROM PEDIDOS_DETALLE D, PEDIDOS P, PREFIJOS R, ARTICULO A, clientes C, ZONAS Z
            WHERE P.PEDI_ID = D.PEDI_ID AND P.PREF_PRE = R.PREF_PRE AND R.TIDO_COD = 34 AND D.ARTI_COD = A.arti_cod AND
            P.VEND_COD >= :DESDE AND P.VEND_COD <= :HASTA AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            PEDI_ANULADO = 'N' AND ((R.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))AND P.terc_nit = C.terc_nit AND
            Z.zona_cod = C.zona_cod AND C.zona_cod >= :zonaini AND C.zona_cod <= :zonafin
            GROUP BY P.vend_cod, c.zona_cod, D.arti_cod , P.terc_nit
            INTO :ARTICULO, :CODVEND, :CANTIDAD, :BASE, :IVA, :CONSUMO, :TOTAL,
            :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :nit, :nomcliente
            DO
            BEGIN
            SELECT C.ZONA_COD, ZONA_NOM FROM CLIENTES C, ZONAS Z WHERE C.zona_cod = Z.zona_cod AND C.terc_nit = :nit INTO :codzona, :nomzona;
            select VEND_NOMBRE from VENDEDORES where VEND_COD = :CODVEND INTO :NOMVEND;
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            if (CEROS = 'S') then
                SUSPEND;
            ELSE
                if ((BASE <> 0) AND (CANTIDAD <> 0)) then
                    SUSPEND;
            END /* FOR */
        END
    if (BIN_AND(TIPO, 16) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 35 INTO :NOMTIPO;
        FOR SELECT MAX(D.ARTI_COD), MAX(C.VEND_COD), SUM(CTDE_CANT * CTDE_FACTOR), SUM((CTDE_TOTAL-CTDE_IVAMONTO-CTDE_CONSUMO)*COTI_FACTOR), SUM(CTDE_IVAMONTO*COTI_FACTOR), SUM(CTDE_CONSUMO), SUM(CTDE_TOTAL*COTI_FACTOR),
            MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD), MAX(C.terc_nit), MAX(C.coti_nomterc)
            FROM COTIZACIONES_DETALLE D, COTIZACIONES C, PREFIJOS P, ARTICULO A, clientes T, ZONAS Z
            WHERE C.COTI_ID = D.COTI_ID AND P.PREF_PRE = C.PREF_PRE AND P.TIDO_COD = 35 AND D.ARTI_COD = A.arti_cod AND
            C.VEND_COD >= :DESDE AND C.VEND_COD <= :HASTA AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND COTI_FECHA >= :FECINI AND COTI_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            COTI_ANULADO = 'N' AND ((P.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))AND C.terc_nit = T.terc_nit AND
            Z.zona_cod = T.zona_cod AND T.zona_cod >= :zonaini AND T.zona_cod <= :zonafin
            GROUP BY C.vend_cod, t.zona_cod, D.arti_cod , C.terc_nit
            INTO :ARTICULO, :CODVEND, :CANTIDAD, :BASE, :IVA, :CONSUMO, :TOTAL,
            :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :nit, :nomcliente
            DO
            BEGIN
            SELECT C.ZONA_COD, ZONA_NOM FROM CLIENTES C, ZONAS Z WHERE C.zona_cod = Z.zona_cod AND C.terc_nit = :nit INTO :codzona, :nomzona;
            select VEND_NOMBRE from VENDEDORES where VEND_COD = :CODVEND INTO :NOMVEND;
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            if (CEROS = 'S') then
                SUSPEND;
            ELSE
                if ((BASE <> 0) AND (CANTIDAD <> 0)) then
                    SUSPEND;
            END /* FOR */
        END
    END
END
^

SET TERM ; ^

GRANT SELECT ON TIPO_DOCUMENTO TO PROCEDURE REP_ARTICULOS_VENDEDOR;
GRANT SELECT ON FACTURAS_DETALLE TO PROCEDURE REP_ARTICULOS_VENDEDOR;
GRANT SELECT ON FACTURAS TO PROCEDURE REP_ARTICULOS_VENDEDOR;
GRANT SELECT ON PREFIJOS TO PROCEDURE REP_ARTICULOS_VENDEDOR;
GRANT SELECT ON ARTICULO TO PROCEDURE REP_ARTICULOS_VENDEDOR;
GRANT SELECT ON VENDEDORES TO PROCEDURE REP_ARTICULOS_VENDEDOR;
GRANT SELECT ON GRUPO TO PROCEDURE REP_ARTICULOS_VENDEDOR;
GRANT SELECT ON MARCAS TO PROCEDURE REP_ARTICULOS_VENDEDOR;
GRANT SELECT ON SUBGRUPO TO PROCEDURE REP_ARTICULOS_VENDEDOR;
GRANT SELECT ON REMISIONES_VENTA_DETALLE TO PROCEDURE REP_ARTICULOS_VENDEDOR;
GRANT SELECT ON REMISIONES_VENTA TO PROCEDURE REP_ARTICULOS_VENDEDOR;
GRANT SELECT ON DEVOLUCIONES_VENTAS_DETALLE TO PROCEDURE REP_ARTICULOS_VENDEDOR;
GRANT SELECT ON DEVOLUCIONES_VENTAS TO PROCEDURE REP_ARTICULOS_VENDEDOR;
GRANT SELECT ON PEDIDOS_DETALLE TO PROCEDURE REP_ARTICULOS_VENDEDOR;
GRANT SELECT ON PEDIDOS TO PROCEDURE REP_ARTICULOS_VENDEDOR;
GRANT SELECT ON COTIZACIONES_DETALLE TO PROCEDURE REP_ARTICULOS_VENDEDOR;
GRANT SELECT ON COTIZACIONES TO PROCEDURE REP_ARTICULOS_VENDEDOR;
GRANT SELECT ON CLIENTES TO PROCEDURE REP_ARTICULOS_VENDEDOR;
GRANT SELECT ON ZONAS TO PROCEDURE REP_ARTICULOS_VENDEDOR;


/* 20080707 */

INSERT INTO CONFIGURACION (CONF_MODULO, CONF_CATEGORIA, CONF_PROPIEDAD, CONF_VALOR, CONF_POSIBLES, CONF_AYUDA) VALUES ('CAJA', 'RECIBOS', 'MAXIMO DESCUENTO PERMITIDO EN RECIBOS DE CAJA', '100', '', 'Indique el máximo valor absoluto permitido para digitar como descuento en el recibo y ajustar el valor recibido del cliente sin hacer notas de cartera');
commit work;

INSERT INTO CONFIGURACION (CONF_MODULO, CONF_CATEGORIA, CONF_PROPIEDAD, CONF_VALOR, CONF_POSIBLES, CONF_AYUDA) VALUES ('CAJA', 'EGRESOS', 'MAXIMO DESCUENTO PERMITIDO EN EGRESOS', '100', '', 'Indique el máximo valor absoluto permitido para digitar como descuento en el egreso y ajustar el valor pagado al acreedor sin hacer otros documentos');
commit work;


/* 20080708 */
SET TERM ^ ;

ALTER PROCEDURE COSTO_PROMEDIO(
    ARTICULO VARCHAR(15),
    FECHA DATE)
RETURNS (
    COSTOP NUMERIC(18,2))
AS
declare variable saldop numeric(18,2);
declare variable saldoc numeric(15,4);
declare variable entp numeric(18,2);
declare variable entc numeric(15,4);
DECLARE VARIABLE FEC DATE;
declare variable ITEM INTEGER;
BEGIN
  /* Busca la fecha del £ltimo movimiento del art¡culo antes de la fecha */
  SELECT  MAX(COST_FECHA) FROM COSTOS
  WHERE (ARTI_COD = :ARTICULO) AND (COST_FECHA <= :FECHA) INTO :FEC;
  IF (FEC IS NULL) THEN
    COSTOP = 0;
  ELSE
    begin
    SELECT  MAX(COST_ITEM) FROM COSTOS
        WHERE (ARTI_COD = :ARTICULO) AND (COST_FECHA = :FEC) INTO :ITEM;

    /* Con la fecha m xima calcule el costo promedio */
    SELECT COST_SALDOP, COST_ENTP,COST_SALDOC, COST_ENTC, COST_ULTIMO FROM COSTOS
        WHERE (ARTI_COD = :ARTICULO) AND (COST_FECHA = :FEC) AND (COST_ITEM = :ITEM)
        INTO :SALDOP, ENTP, :SALDOC, ENTC, :COSTOP;
    if ((SALDOC < 0) AND (SALDOC+ENTC > 0)) then
        COSTOP = ENTP/ENTC;
    else
        /* Cuando hay existencia calcule el promedio, de otra manera retorne el ultimo */
        if (SALDOC+ENTC > 0) then
            COSTOP = (SALDOP+ENTP) / (SALDOC+ENTC);
    end
  SUSPEND;
END

^

SET TERM ; ^

GRANT SELECT ON COSTOS TO PROCEDURE COSTO_PROMEDIO;

SET TERM ^ ;

ALTER PROCEDURE ACTUALICE_COSTO(
    ARTICULO VARCHAR(15),
    FECHA DATE,
    COSTO NUMERIC(18,2),
    CANTIDAD NUMERIC(18,2),
    ENTRADA CHAR(1),
    ANULAR CHAR(1),
    IDMOV INTEGER,
    TIPO INTEGER)
AS
DECLARE VARIABLE saldo NUMERIC(18,2);
DECLARE VARIABLE COSTOP NUMERIC(18,2);
DECLARE VARIABLE exart CHAR(1);
DECLARE VARIABLE UCOSTO NUMERIC(18,2);
declare variable FECAUX DATE;
declare variable SALDOC NUMERIC(15,4);
declare variable ITEM INTEGER;
declare variable UNIDAD VARCHAR(8);
BEGIN
/* Verfique si el artículo tiene control de existencias */ /*$$IBE$$ 
SELECT arti_exist, ARTI_UNIDAD FROM articulo WHERE arti_COD = :articulo
    INTO :exart, :UNIDAD;
IF (exart <> 'N') THEN
    BEGIN
    if (ANULAR = 'S') then
        BEGIN
        select cost_saldoc, cost_saldop from costos
            WHERE (arti_cod = :articulo) AND (cost_fecha = :fecha) AND (cost_idmov = :IDMOV) AND (COST_TIPO = :TIPO)
            into :SALDOC, :SALDO;  $$IBE$$*/ /* para dejar inicializadas las 2 variables */ /*$$IBE$$ 
        DELETE FROM COSTOS WHERE (arti_cod = :articulo) AND (cost_fecha = :fecha) AND (cost_idmov = :IDMOV) AND (COST_TIPO = :TIPO);
         $$IBE$$*/ /* para inicializar el ultimo costo */ /*$$IBE$$ 
        SELECT MAX(COST_FECHA) FROM costos
            WHERE (arti_cod = :articulo) AND (cost_fecha <= :fecha) INTO :FECAUX;
        if (FECAUX IS NULL) then
            UCOSTO = 0;
        ELSE
            BEGIN
            SELECT MAX(COST_ITEM) FROM costos
                WHERE (arti_cod = :articulo) AND (cost_fecha = :fecaux) INTO :ITEM;
            SELECT COST_ULTIMO FROM costos
                WHERE (arti_cod = :articulo) AND (cost_fecha = :fecaux) AND (cost_item = :ITEM) INTO :UCOSTO;
            END
        END
    ELSE
        BEGIN
        select max(cost_fecha) from costos WHERE (arti_cod = :articulo) AND (cost_fecha <= :fecha) into :fecaux;
        select max(cost_item) from costos WHERE (arti_cod = :articulo) AND (cost_fecha = :fecaux) into :item;
        select (cost_saldoc + cost_entc - cost_salc) from costos WHERE (arti_cod = :articulo) AND (cost_fecha = :fecaux) AND (cost_item = :item) into :saldoc;
        if (saldoc is null) THEN
            SALDOC = 0;
        EXECUTE PROCEDURE costo_promedio(:articulo, :fecha) RETURNING_VALUES :costop;
        if (ENTRADA = 'S') then
            if (TIPO = 33) then
                BEGIN
                EXECUTE PROCEDURE ULTIMO_COSTO(ARTICULO, FECHA, UNIDAD) returning_values (UCOSTO);
                INSERT INTO COSTOS (arti_cod, cost_fecha,
                    cost_entc, cost_entp, cost_salc, cost_salp,
                    cost_saldoc, cost_saldop, cost_ultimo, cost_idmov, cost_tipo)
                    VALUES (:articulo, :fecha, :cantidad, :cantidad*:costop, 0, 0, :saldoc, :saldoc*:costop, :ucosto, :IDMOV, :TIPO);
                SALDO = (SALDOC * COSTOP) + (CANTIDAD * COSTOP);
                SALDOC = SALDOC + CANTIDAD;
                END
            ELSE
                BEGIN
                UCOSTO = :COSTO;
                INSERT INTO COSTOS (arti_cod, cost_fecha,
                    cost_entc, cost_entp, cost_salc, cost_salp,
                    cost_saldoc, cost_saldop, cost_ultimo, cost_idmov, cost_tipo)
                    VALUES (:articulo, :fecha, :cantidad, :cantidad*:costo, 0, 0, :saldoc, :saldoc*:costop, :costo, :IDMOV, :TIPO);
                SALDO = (SALDOC * COSTOP) + (CANTIDAD * COSTO);
                SALDOC = SALDOC + CANTIDAD;
                END
        ELSE
            BEGIN
            EXECUTE PROCEDURE ULTIMO_COSTO(ARTICULO, FECHA, UNIDAD) returning_values (UCOSTO);
            INSERT INTO COSTOS (arti_cod, cost_fecha,
                cost_entc, cost_entp, cost_salc, cost_salp,
                cost_saldoc, cost_saldop, cost_ultimo, cost_idmov, cost_tipo)
                VALUES (:articulo, :fecha, 0, 0, :cantidad, :cantidad*:costop, :saldoc, :saldoc*:costop, :UCOSTO, :IDMOV, :TIPO);
            SALDOC = SALDOC - CANTIDAD;
            SALDO = SALDOC * COSTOP;  $$IBE$$*/ /* YA ESTA RESTADA LA CANTIDAD */ /*$$IBE$$ 
            END
        END
    END
 $$IBE$$*/ EXIT;
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE CALCULA_PRECIOS(
    ARTICULO VARCHAR(20),
    FECHA DATE)
AS
declare variable LISTA INTEGER;
declare variable MARGEN NUMERIC(9, 4);
declare variable UTIL NUMERIC(9, 4);
declare variable UNIDAD VARCHAR(8);
declare variable UOR VARCHAR(20);
declare variable COSTOP NUMERIC(18, 2);
declare variable COSTOU NUMERIC(18, 2);
declare variable COSTO NUMERIC(18, 2);
declare variable DIG INTEGER;
declare variable IVAINC CHAR(1);
declare variable TARIVA NUMERIC(9,2);
declare variable AUTOM CHAR(1);
declare variable BASE varchar(10);
declare variable CAMBIO CHAR(7);
BEGIN /*$$IBE$$ 
EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION','ARTICULOS','CAMBIO DE PRECIOS AUTOMATICO AL CAMBIAR COSTO O PRECIO') returning_values (CAMBIO);
if (CAMBIO = 'COSTO') then
  BEGIN
  FOR SELECT P.LIPR_COD, PRAR_MARGEN, PRAR_UTIL, LIPR_MODIF, PRAR_AUTO
    FROM PRECIOS_ARTICULO P, LISTA_PRECIOS L
    WHERE P.LIPR_COD = L.LIPR_COD AND ARTI_COD = :articulo
    INTO :LISTA, :MARGEN, :UTIL, :IVAINC, :AUTOM
    DO
      if (AUTOM = 'S') then
        BEGIN
        if (UTIL IS NULL) then
            UTIL = 0;
        if (MARGEN IS NULL) then
            MARGEN = 0;
        SELECT ARTI_UNIDAD, TAIV_PORC FROM ARTICULO A, TARIFA_IVA T WHERE A.TAIV_COD = T.TAIV_COD AND ARTI_COD = :ARTICULO INTO :UNIDAD, :TARIVA;
        EXECUTE PROCEDURE lee_configuracion('FACTURACION','ARTICULOS','COSTO BASE PARA CALCULO DE PRECIOS DE VENTA AUTOMATICOS') returning_values (:BASE);
            EXECUTE PROCEDURE COSTO_PROMEDIO (:ARTICULO, :FECHA) RETURNING_VALUES(:COSTOP);
            EXECUTE PROCEDURE ULTIMO_COSTO (:ARTICULO, :FECHA, :UNIDAD) RETURNING_VALUES(:COSTOU);
        if (base = 'ULTIMO') then
            COSTO = COSTOU;
        ELSE
            BEGIN
            COSTO = COSTOP;
            if (base = 'MAYOR') then
                if (COSTOP < COSTOU) then
                    COSTO = COSTOU;
            END
        if (IVAINC = 'S') then
            COSTO = COSTO * (1 + TARIVA/100);
        EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION', 'ARTICULOS', 'SUGERIR PRECIOS CON PORCENTAJE DE MARGEN O UTILIDAD') RETURNING_VALUES (:UOR);
        EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION', 'ARTICULOS', 'REDONDEO AL MULTIPLO DE DIEZ EN PRECIOS') RETURNING_VALUES (:DIG);
        if (UOR = 'UTILIDAD') then
            BEGIN
            COSTO = COSTO * (1 + :UTIL/100);
            EXECUTE PROCEDURE REDONDEE (COSTO, DIG) returning_values (COSTO);
            UPDATE PRECIOS_ARTICULO
                SET PRAR_FIJO = :COSTO
                WHERE ARTI_COD = :ARTICULO AND LIPR_COD = :LISTA;
            END
        ELSE
            BEGIN
            COSTO = COSTO / (1 - :MARGEN/100);
            EXECUTE PROCEDURE REDONDEE (COSTO, DIG) returning_values (COSTO);
            UPDATE PRECIOS_ARTICULO
                SET PRAR_FIJO = :COSTO
                WHERE ARTI_COD = :ARTICULO AND LIPR_COD = :LISTA;
            END
        END
  END
 $$IBE$$*/ EXIT;
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE COSTO_EN_VENTAS(
    TIPO INTEGER,
    ID INTEGER)
AS
declare variable FECHA DATE;
declare variable ARTICULO VARCHAR(20);
declare variable CANTIDAD NUMERIC(18,4);
declare variable COSTO NUMERIC(18,2);
declare variable CTACOSTO VARCHAR(20);
declare variable CTAINVEN VARCHAR(20);
BEGIN /*$$IBE$$ 
DELETE FROM COSTO_VENTAS;
if (TIPO = 31) then
    BEGIN
     $$IBE$$*/ /* FACTURA DE VENTA */ /*$$IBE$$ 
    FOR SELECT D.ARTI_COD, FADE_CANT * FADE_FACTOR, COAR_CTACOS, COAR_CTAINV, FACT_FECHA
        FROM ARTICULO A, FACTURAS F, FACTURAS_DETALLE D, CONTABIL_ARTICULO C
        WHERE F.FACT_ID = D.FACT_ID AND A.ARTI_COD = D.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND F.FACT_ID = :ID AND FACT_ANULADO = 'N'
        INTO :ARTICULO, :CANTIDAD, :CTACOSTO, :CTAINVEN, :FECHA
        DO
        BEGIN
        EXECUTE PROCEDURE COSTO_PROMEDIO(:ARTICULO, :FECHA) returning_values (:COSTO);
        INSERT INTO COSTO_VENTAS VALUES (:ARTICULO, :CANTIDAD, :COSTO, :CTACOSTO, :CTAINVEN);
        END
    END
if (TIPO = 32) then
    BEGIN
     $$IBE$$*/ /* REMISION */ /*$$IBE$$ 
    FOR SELECT D.ARTI_COD, RVDE_CANT * RVDE_FACTOR, COAR_CTACOS, COAR_CTAINV, REVT_FECHA
        FROM ARTICULO A, REMISIONES_VENTA R, REMISIONES_VENTA_DETALLE D, CONTABIL_ARTICULO C
        WHERE R.REVT_ID = D.REVT_ID AND A.ARTI_COD = D.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND R.REVT_ID = :ID AND REVT_ANULADO = 'N'
        INTO :ARTICULO, :CANTIDAD, :CTACOSTO, :CTAINVEN, :FECHA
        DO
        BEGIN
        EXECUTE PROCEDURE COSTO_PROMEDIO(:ARTICULO, :FECHA) returning_values (:COSTO);
        INSERT INTO COSTO_VENTAS VALUES (:ARTICULO, :CANTIDAD, :COSTO, :CTACOSTO, :CTAINVEN);
        END
    END
if (TIPO = 33) then
    BEGIN
     $$IBE$$*/ /* DEVOLUCION */ /*$$IBE$$ 
    FOR SELECT D.ARTI_COD, DVDE_CANT * DVDE_FACTOR, COAR_CTACOS, COAR_CTAINV, DEVT_FECHA
        FROM ARTICULO A, DEVOLUCIONES_VENTAS DV, DEVOLUCIONES_VENTAS_DETALLE D, CONTABIL_ARTICULO C
        WHERE DV.DEVT_ID = D.DEVT_ID AND A.ARTI_COD = D.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND DV.DEVT_ID = :ID AND DEVT_ANULADO = 'N'
        INTO :ARTICULO, :CANTIDAD, :CTACOSTO, :CTAINVEN, :FECHA
        DO
        BEGIN
        EXECUTE PROCEDURE COSTO_PROMEDIO(:ARTICULO, :FECHA) returning_values (:COSTO);
        INSERT INTO COSTO_VENTAS VALUES (:ARTICULO, :CANTIDAD, :COSTO, :CTACOSTO, :CTAINVEN);
        END
    END
 $$IBE$$*/ EXIT;
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE COSTO_EN_VENTAS_CONTADO(
    FECFAC DATE,
    PREF VARCHAR(4),
    PTVTA INTEGER)
AS
declare variable ARTICULO VARCHAR(20);
declare variable CANTIDAD NUMERIC(18,4);
declare variable COSTO NUMERIC(18,2);
declare variable CTACOSTO VARCHAR(20);
declare variable CTAINVEN VARCHAR(20);
BEGIN /*$$IBE$$ 
    DELETE FROM COSTO_VENTAS;
     $$IBE$$*/ /* FACTURA DE VENTA */ /*$$IBE$$ 
    FOR SELECT MAX(D.ARTI_COD), SUM(FADE_CANT * FADE_FACTOR), MAX(COAR_CTACOS), MAX(COAR_CTAINV)
        FROM ARTICULO A, FACTURAS F, FACTURAS_DETALLE D, CONTABIL_ARTICULO C
        WHERE F.FACT_ID = D.FACT_ID AND A.ARTI_COD = D.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND FACT_ANULADO = 'N' AND FACT_FECHA = :FECFAC AND F.PREF_PRE = :PREF AND F.PTVT_ID = :PTVTA
        GROUP BY D.ARTI_COD
        INTO :ARTICULO, :CANTIDAD, :CTACOSTO, :CTAINVEN
        DO
        BEGIN
        EXECUTE PROCEDURE COSTO_PROMEDIO(:ARTICULO, :FECFAC) returning_values (:COSTO);
        INSERT INTO COSTO_VENTAS VALUES (:ARTICULO, :CANTIDAD, :COSTO * :CANTIDAD, :CTACOSTO, :CTAINVEN);
        END
 $$IBE$$*/ EXIT;
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE COSTO_PROMEDIO_UNIDAD(
    ARTICULO VARCHAR(15),
    FECHA DATE,
    UNIDAD VARCHAR(8))
RETURNS (
    COSTO NUMERIC(18,2))
AS
declare variable FACTOR NUMERIC(15,4);
BEGIN /*$$IBE$$ 
  EXECUTE PROCEDURE COSTO_PROMEDIO(ARTICULO, FECHA) returning_values (COSTO);
  EXECUTE PROCEDURE FACTOR_UNIDAD_CANT(ARTICULO, UNIDAD) returning_values (FACTOR);
  COSTO = COSTO * FACTOR;
  SUSPEND;
 $$IBE$$*/ SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE IMPR_AJUSTE(
    ID INTEGER)
RETURNS (
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    CONCEPTO VARCHAR(60),
    CODBODEGA VARCHAR(2),
    NOMBODEGA VARCHAR(30),
    OBS BLOB SUB_TYPE 1 SEGMENT SIZE 80,
    ITEM INTEGER,
    ARTICULO VARCHAR(15),
    CODBAR VARCHAR(15),
    ARTIDES VARCHAR(60),
    EXANT NUMERIC(18,4),
    EXNUE NUMERIC(18,4),
    UNIDAD VARCHAR(8),
    BODITEM VARCHAR(2),
    LOTE VARCHAR(15),
    COSTO NUMERIC(18,2),
    TOTAL NUMERIC(18,2))
AS
DECLARE VARIABLE ITEMS INTEGER;
DECLARE VARIABLE MAX_AJUSTE INTEGER;
BEGIN
  /*  */ /*$$IBE$$ 
  SELECT PREF_PRE, AJUS_NUMERO, AJUS_FECHA, AJUS_CONC, A.BODE_COD, BODE_NOM, AJUS_OBS
    FROM AJUSTES A, BODEGA B WHERE A.BODE_COD = B.BODE_COD AND A.AJUS_ID = :ID into
    :PREF, :NUMERO, :FECHA, :CONCEPTO, :CODBODEGA, :NOMBODEGA, :OBS;
  FOR SELECT AJUS_ITEM, A.ARTI_COD, AJUS_CODBAR, AJDE_DESC, AJUS_EXANT, AJUS_UNIDAD, BODE_COD, AJUS_EXNUE, AJUS_LOTE
    FROM AJUSTES_DETALLE D, ARTICULO A
    WHERE D.ARTI_COD = A.ARTI_COD AND D.AJUS_ID = :ID
    ORDER BY AJUS_ITEM
    INTO :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :EXANT, :UNIDAD, :BODITEM, :EXNUE, :LOTE
    DO
      BEGIN
      EXECUTE PROCEDURE COSTO_PROMEDIO(:ARTICULO, :FECHA) returning_values (:COSTO);
      TOTAL = (EXNUE - EXANT) * COSTO;
      SUSPEND;
      END
 $$IBE$$*/ SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

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

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE REP_COMPROBANTES_ARTICULO(
    TIPODOC INTEGER,
    DETALLE CHAR(1),
    FECINI DATE,
    FECFIN DATE,
    ARTINI VARCHAR(20),
    ARTFIN VARCHAR(20),
    GRPINI VARCHAR(2),
    GRPFIN VARCHAR(2),
    ORDEN CHAR(1),
    SUBEMPRESA INTEGER)
RETURNS (
    CODIGO VARCHAR(15),
    NOMBRE VARCHAR(60),
    UNIDAD VARCHAR(8),
    CODGRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    CODSUBG VARCHAR(3),
    NOMSUBG VARCHAR(30),
    CODMARC VARCHAR(3),
    NOMMARC VARCHAR(30),
    CODBOD VARCHAR(2),
    NOMTIPO VARCHAR(30),
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    CONCEPTO VARCHAR(60),
    NIT VARCHAR(20),
    NOMTERC VARCHAR(60),
    CONS INTEGER,
    CANT NUMERIC(18,4),
    COSTO NUMERIC(18,2),
    COSTOTOT NUMERIC(18,2))
AS
declare variable ENT CHAR(1);
declare variable ENTRADAS NUMERIC(18,4);
declare variable COSTOENT NUMERIC(18,2);
declare variable SALIDAS NUMERIC(18,4);
declare variable COSTOSAL NUMERIC(18,2);
declare variable CODINI VARCHAR(20);
declare variable CODFIN VARCHAR(20);
declare variable DESINI VARCHAR(20);
declare variable DESFIN VARCHAR(20);
BEGIN /*$$IBE$$ 
  SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = :TIPODOC INTO :NOMTIPO;
  if (ORDEN = 'C') then
    BEGIN
    CODINI = ARTINI;
    CODFIN = ARTFIN;
    DESINI = '';
    DESFIN = 'zz';
    END
  ELSE
    BEGIN
    DESINI = ARTINI;
    DESFIN = ARTFIN;
    CODINI = '';
    CODFIN = 'zz';
    END
  FOR
    SELECT ARTI_COD, ARTI_DES, ARTI_UNIDAD, A.GRUP_COD, A.SUBG_COD, A.MARC_COD
      FROM ARTICULO A
      WHERE ARTI_COD >= :CODINI AND ARTI_COD <= :CODFIN AND A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :GRPFIN AND ARTI_DES >= :DESINI AND ARTI_DES <= :DESFIN
      INTO :CODIGO, :NOMBRE, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
      DO
        BEGIN
        NOMMARC = '';
        NOMSUBG = '';
        SELECT GRUP_NOM FROM GRUPO WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
        SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
        SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
        if (DETALLE = 'N') then
            BEGIN
            CANT = 0;
            COSTOTOT = 0;
             $$IBE$$*/ /* SUME LAS ENTRADAS */ /*$$IBE$$ 
            SELECT SUM(MVAR_CANT), SUM(MVAR_CANT * MVAR_COSTO) FROM MOVIMIENTO_ARTICULO M, PREFIJOS P
              WHERE P.PREF_PRE = M.MVAR_PREF AND P.TIDO_COD = M.mvar_tipodoc AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA)) AND
              (MVAR_FECHA >= :FECINI) AND (MVAR_FECHA < :FECFIN) AND
              (ARTI_COD = :CODIGO) AND (MVAR_ENTRADA = 'S') AND (MVAR_TIPODOC = :TIPODOC)
              INTO :ENTRADAS, :COSTOENT;
            if (ENTRADAS IS NULL) then
              ENTRADAS = 0;
            if (COSTOENT IS NULL) then
              COSTOENT = 0;
             $$IBE$$*/ /* CALCULE LAS SALIDAS A COSTO PROMEDIO */ /*$$IBE$$ 
            SALIDAS = 0;
            COSTOSAL = 0;
            FOR SELECT MVAR_CANT, MVAR_FECHA
                FROM MOVIMIENTO_ARTICULO M, PREFIJOS P
                WHERE P.PREF_PRE = M.MVAR_PREF AND P.TIDO_COD = M.mvar_tipodoc AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA)) AND
                (MVAR_FECHA >= :FECINI) AND (MVAR_FECHA <= :FECFIN) AND
                (ARTI_COD = :CODIGO) AND (MVAR_ENTRADA = 'N') AND (MVAR_TIPODOC = :TIPODOC)
                INTO :CANT, :FECHA
                DO
                    BEGIN
                    EXECUTE PROCEDURE COSTO_PROMEDIO(:CODIGO, :FECHA) returning_values (:COSTO);
                    SALIDAS = SALIDAS + CANT;
                    COSTOSAL = COSTOSAL + (COSTO * CANT);
                    END
            if (SALIDAS IS NULL) then
              SALIDAS = 0;
            if (COSTOSAL IS NULL) then
              COSTOSAL = 0;
            if (ENTRADAS > 0) then
                CANT = ENTRADAS;
            if (SALIDAS > 0) then
                CANT = SALIDAS;
            if (COSTOENT > 0) then
                COSTOTOT = COSTOENT;
            if (COSTOSAL > 0) then
                COSTOTOT = COSTOSAL;
            if (CANT > 0) then
                COSTO = COSTOTOT / CANT;
            ELSE
                COSTO = 0;
            if (CANT <> 0) then
                SUSPEND;
            END
        ELSE
            BEGIN
            FOR SELECT MVAR_ENTRADA, MVAR_PREF, MVAR_NUMERO, MVAR_CANT, MVAR_COSTO, MVAR_CONC, MVAR_FECHA, M.TERC_NIT, TERC_NOM, MVAR_CONS, BODE_COD
                FROM MOVIMIENTO_ARTICULO M, TIPO_DOCUMENTO TD, PREFIJOS P
                LEFT OUTER JOIN TERCEROS T ON (M.TERC_NIT = T.TERC_NIT)
                WHERE TD.TIDO_COD = MVAR_TIPODOC AND P.PREF_PRE = M.MVAR_PREF AND P.TIDO_COD = M.mvar_tipodoc AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA)) AND
                (MVAR_FECHA >= :FECINI) AND (MVAR_FECHA < :FECFIN) AND (ARTI_COD = :CODIGO) AND (MVAR_TIPODOC = :TIPODOC)
                ORDER BY MVAR_FECHA, MVAR_CONS
                INTO :ENT, :PREFIJO, :NUMERO, :CANT, :COSTO, :CONCEPTO, :FECHA, :NIT, :NOMTERC, :CONS, :CODBOD
                DO
                    BEGIN
                    if (ENT = 'S') then
                        BEGIN
                        COSTOTOT = (CANT * COSTO);
                        end
                    ELSE
                        BEGIN
                        EXECUTE PROCEDURE COSTO_PROMEDIO(:CODIGO, :FECHA) returning_values (:COSTO);
                        COSTOTOT = (CANT * COSTO);
                        END
                    SUSPEND;
                    END
            END
        END
 $$IBE$$*/ SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE REP_COMPROBANTES_INV(
    TIPO INTEGER,
    DETALLE CHAR(1),
    FECINI DATE,
    FECFIN DATE,
    PREFIJO VARCHAR(4),
    ANULADOS CHAR(1),
    SUBEMPRESA INTEGER)
RETURNS (
    NOMTIPO VARCHAR(30),
    ID INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    VENCE DATE,
    CONCEPTO VARCHAR(60),
    REFER VARCHAR(60),
    CODBODORI VARCHAR(2),
    NOMBODORI VARCHAR(30),
    CODBODDES VARCHAR(2),
    NOMBODDES VARCHAR(30),
    NOMTERCERO VARCHAR(60),
    PRODCODBAR VARCHAR(15),
    PRODDES VARCHAR(60),
    PRODCANT NUMERIC(18,4),
    PRODUNIDAD VARCHAR(8),
    PRODLOTE VARCHAR(15),
    OBS BLOB SUB_TYPE 0 SEGMENT SIZE 80,
    ITEM INTEGER,
    ARTICULO VARCHAR(15),
    CODBAR VARCHAR(15),
    ARTIDES VARCHAR(60),
    CANT NUMERIC(18,4),
    EXANT NUMERIC(18,4),
    UNIDAD VARCHAR(8),
    BODITEM VARCHAR(2),
    COSTO NUMERIC(18,2),
    DTOPORC NUMERIC(9,2),
    DTOMONTO NUMERIC(18,2),
    IVAPORC NUMERIC(9,2),
    IVAMONTO NUMERIC(18,2),
    CONSUMO NUMERIC(18,2),
    SUBTOTAL NUMERIC(18,2),
    TOTAL NUMERIC(18,2),
    LOTE VARCHAR(15),
    ANULADO CHAR(1),
    OBSITEM BLOB SUB_TYPE 0 SEGMENT SIZE 80)
AS
BEGIN
  /* DETERMINE LA TABLA A EXAMINAR */ /*$$IBE$$ 
  if (BIN_AND(TIPO, 1) <> 0) then
    BEGIN
    SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 11 INTO :NOMTIPO;
    FOR SELECT ENTR_ID, E.PREF_PRE, ENTR_NUMERO, ENTR_FECHA, ENTR_CONC, ENTR_REFER, E.BODE_COD, BODE_NOM, ENTR_NOMTERC, ENTR_OBS, ENTR_ANULADO
    FROM ENTRADAS E, BODEGA B, PREFIJOS P
    WHERE E.BODE_COD = B.BODE_COD AND ENTR_FECHA >= :FECINI AND ENTR_FECHA <= :FECFIN
     AND P.PREF_PRE = E.PREF_PRE AND P.TIDO_COD = 11 AND ((P.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
    ORDER BY ENTR_FECHA, ENTR_ID
    INTO :ID, :PREF, :NUMERO, :FECHA, :CONCEPTO, :REFER, :CODBODORI, :NOMBODORI, :NOMTERCERO, :OBS, :ANULADO
    DO
        BEGIN
        if (((:PREFIJO = '') or (:PREF = :PREFIJO)) AND ((:ANULADOS = 'S') or (:ANULADO = 'N'))) then
            BEGIN
            if (anulado = 'S') then
             BEGIN
              ITEM = 0;
              ARTICULO = '';
              CODBAR = '';
              ARTIDES = '';
              CANT = 0;
              UNIDAD = '';
              BODITEM = '';
              lote = '';
              costo = 0;
              DTOPORC = 0;
              DTOMONTO = 0;
              IVAPORC = 0;
              IVAMONTO = 0;
              CONSUMO = 0;
              TOTAL = 0;
              OBSITEM = null;
              SUBTOTAL = 0;
              SUSPEND;
             END
            ELSE
             BEGIN
              if (DETALLE = 'S') then
                FOR SELECT ENDE_ITEM, A.ARTI_COD, ENDE_CODBAR, ENDE_DESC, ENDE_CANT, ENDE_UNIDAD, BODE_COD, ENDE_COSTO, ENDE_DTOPORC, ENDE_DTOMONTO, ENDE_IVAPORC, ENDE_IVAMONTO, ENDE_CONSUMO, ENDE_TOTAL, ENDE_LOTE, ENDE_OBS
                    FROM ENTRADAS_DETALLE D, ARTICULO A WHERE D.ARTI_COD = A.ARTI_COD AND D.ENTR_ID = :ID INTO
                    :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :BODITEM, :COSTO, :DTOPORC, :DTOMONTO, :IVAPORC, :IVAMONTO, :CONSUMO, :TOTAL, :LOTE, :OBSITEM
                    DO
                    BEGIN
                    SUBTOTAL = TOTAL - IVAMONTO - CONSUMO;
                    SUSPEND;
                    END
              ELSE
                BEGIN
                SELECT SUM(ENDE_IVAMONTO), SUM(ENDE_CONSUMO), SUM(ENDE_TOTAL)
                    FROM ENTRADAS_DETALLE D WHERE D.ENTR_ID = :ID INTO
                    :IVAMONTO, :CONSUMO, :TOTAL;
                SUBTOTAL = TOTAL - IVAMONTO - CONSUMO;
                SUSPEND;
                END
             END
            END
        END
    END
  if (BIN_AND(TIPO, 2) <> 0) then
    BEGIN
    SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 12 INTO :NOMTIPO;
    FOR SELECT SALI_ID, S.PREF_PRE, SALI_NUMERO, SALI_FECHA, SALI_CONC, SALI_REFER, S.BODE_COD, BODE_NOM, SALI_NOMTERC, SALI_OBS, SALI_ANULADO
    FROM SALIDAS S, BODEGA B, PREFIJOS P
    WHERE S.BODE_COD = B.BODE_COD AND SALI_FECHA >= :FECINI AND SALI_FECHA <= :FECFIN 
     AND P.PREF_PRE = S.PREF_PRE AND P.TIDO_COD = 12 AND ((P.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
    ORDER BY SALI_FECHA, SALI_ID
    into :ID, :PREF, :NUMERO, :FECHA, :CONCEPTO, :REFER, :CODBODORI, :NOMBODORI, :NOMTERCERO, :OBS, :ANULADO
    DO
        BEGIN
        if (((:PREFIJO = '') or (:PREF = :PREFIJO)) AND ((:ANULADOS = 'S') or (:ANULADO = 'N'))) then
            BEGIN
            if (anulado = 'S') then
             BEGIN
              ITEM = 0;
              ARTICULO = '';
              CODBAR = '';
              ARTIDES = '';
              CANT = 0;
              UNIDAD = '';
              BODITEM = '';
              lote = '';
              costo = 0;
              DTOPORC = 0;
              DTOMONTO = 0;
              IVAPORC = 0;
              IVAMONTO = 0;
              CONSUMO = 0;
              EXANT = 0;
              TOTAL = 0;
              OBSITEM = null;
              SUBTOTAL = 0;
              SUSPEND;
             END
            ELSE
             BEGIN
              if (DETALLE = 'S') then
                FOR SELECT SADE_ITEM, A.ARTI_COD, SADE_CODBAR, SADE_DESC, SADE_CANT, SADE_UNIDAD, BODE_COD, SADE_COSTO, SADE_IVAPORC, SADE_IVAMONTO, SADE_CONSUMO, SADE_TOTAL, SADE_LOTE, SADE_OBS
                    FROM SALIDAS_DETALLE D, ARTICULO A WHERE D.ARTI_COD = A.ARTI_COD AND D.SALI_ID = :ID INTO
                    :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :BODITEM, :COSTO, :IVAPORC, :IVAMONTO, :CONSUMO, :TOTAL, :LOTE, :OBSITEM
                    DO
                BEGIN
                SUBTOTAL = TOTAL - IVAMONTO - CONSUMO;
                SUSPEND;
                END
              ELSE
                BEGIN
                SELECT SUM(SADE_IVAMONTO), SUM(SADE_CONSUMO), SUM(SADE_TOTAL)
                    FROM SALIDAS_DETALLE D WHERE D.SALI_ID = :ID INTO
                    :IVAMONTO, :CONSUMO, :TOTAL;
                SUBTOTAL = TOTAL - IVAMONTO - CONSUMO;
                SUSPEND;
                END
             END
            END
        END
    END
  if (BIN_AND(TIPO, 4) <> 0) then
    BEGIN
    SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 13 INTO :NOMTIPO;
    FOR SELECT TRAN_ID, T.PREF_PRE, TRAN_NUMERO, TRAN_FECHA, TRAN_CONC, TRAN_REFER, T.BODE_COD, BO.BODE_NOM, TRAN_BODDES, BD.BODE_NOM, TRAN_OBS, TRAN_ANULADO
    FROM TRASFERENCIAS T, BODEGA BO, BODEGA BD, PREFIJOS P
    WHERE T.BODE_COD = BO.BODE_COD AND T.TRAN_BODDES = BD.BODE_COD AND TRAN_FECHA >= :FECINI AND TRAN_FECHA <= :FECFIN 
     AND P.PREF_PRE = T.PREF_PRE AND P.TIDO_COD = 13 AND ((P.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
    ORDER BY TRAN_FECHA, TRAN_ID
    into :ID, :PREF, :NUMERO, :FECHA, :CONCEPTO, :REFER, :CODBODORI, :NOMBODORI, :CODBODDES, :NOMBODDES, :OBS, :ANULADO
    DO
        BEGIN
        if (((:PREFIJO = '') or (:PREF = :PREFIJO)) AND ((:ANULADOS = 'S') or (:ANULADO = 'N'))) then
            BEGIN
            if (anulado = 'S') then
             BEGIN
              ITEM = 0;
              ARTICULO = '';
              CODBAR = '';
              ARTIDES = '';
              CANT = 0;
              UNIDAD = '';
              BODITEM = '';
              lote = '';
              costo = 0;
              DTOPORC = 0;
              DTOMONTO = 0;
              IVAPORC = 0;
              IVAMONTO = 0;
              CONSUMO = 0;
              EXANT = 0;
              TOTAL = 0;
              OBSITEM = null;
              SUBTOTAL = 0;
              SUSPEND;
             END
            ELSE
             BEGIN
              if (DETALLE = 'S') then
                FOR SELECT TRAS_ITEM, A.ARTI_COD, TRAS_CODBAR, TRAS_DESC, TRAS_CANT, TRAS_UNIDAD, TRAS_COSTO, TRAS_IVAPORC, TRAS_IVAMONTO, TRAS_CONSUMO, TRAS_TOTAL, TRAS_LOTE, TRAS_OBS
                    FROM TRASFERENCIAS_DETALLE D, ARTICULO A WHERE D.ARTI_COD = A.ARTI_COD AND D.TRAN_ID = :ID INTO
                    :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :COSTO, :IVAPORC, :IVAMONTO, :CONSUMO, :TOTAL, :LOTE, :OBSITEM
                    DO
                    BEGIN
                    SUBTOTAL = TOTAL - IVAMONTO - CONSUMO;
                    SUSPEND;
                    END
              ELSE
                BEGIN
                SELECT SUM(TRAS_IVAMONTO), SUM(TRAS_CONSUMO), SUM(TRAS_TOTAL) FROM trasferencias_detalle D
                    WHERE D.TRAN_ID = :ID INTO :IVAMONTO, :CONSUMO, :TOTAL;
                SUBTOTAL = TOTAL - IVAMONTO - CONSUMO;
                SUSPEND;
                END
             END
            END
        END
    END
  if (BIN_AND(TIPO, 8) <> 0) then
    BEGIN
    SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 14 INTO :NOMTIPO;
    FOR SELECT AJUS_ID, A.PREF_PRE, AJUS_NUMERO, AJUS_FECHA, AJUS_CONC, A.BODE_COD, BODE_NOM, AJUS_OBS, AJUS_ANULADO
    FROM AJUSTES A, BODEGA B, PREFIJOS P
    WHERE A.BODE_COD = B.BODE_COD AND AJUS_FECHA >= :FECINI AND AJUS_FECHA <= :FECFIN 
     AND P.PREF_PRE = A.PREF_PRE AND P.TIDO_COD = 14 AND ((P.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
    ORDER BY AJUS_FECHA, AJUS_ID
    into :ID, :PREF, :NUMERO, :FECHA, :CONCEPTO, :CODBODORI, :NOMBODORI, :OBS, :ANULADO
    DO
        BEGIN
        if (((:PREFIJO = '') or (:PREF = :PREFIJO)) AND ((:ANULADOS = 'S') or (:ANULADO = 'N'))) then
            BEGIN
            if (anulado = 'S') then
             BEGIN
              ITEM = 0;
              ARTICULO = '';
              CODBAR = '';
              ARTIDES = '';
              CANT = 0;
              UNIDAD = '';
              BODITEM = '';
              lote = '';
              costo = 0;
              DTOPORC = 0;
              DTOMONTO = 0;
              IVAPORC = 0;
              IVAMONTO = 0;
              CONSUMO = 0;
              EXANT = 0;
              TOTAL = 0;
              OBSITEM = null;
              SUBTOTAL = 0;
              SUSPEND;
             END
            ELSE
             BEGIN
              if (DETALLE = 'S') then
                FOR SELECT AJUS_ITEM, A.ARTI_COD, AJUS_CODBAR, AJDE_DESC, AJUS_EXANT, AJUS_UNIDAD, BODE_COD, AJUS_EXNUE, AJUS_LOTE, AJDE_OBS
                    FROM AJUSTES_DETALLE D, ARTICULO A WHERE D.ARTI_COD = A.ARTI_COD AND D.AJUS_ID = :ID INTO
                    :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :EXANT, :UNIDAD, :BODITEM, :CANT, :LOTE, :OBSITEM
                    DO
                      BEGIN
                      EXECUTE PROCEDURE COSTO_PROMEDIO(:ARTICULO, :FECHA) returning_values (:COSTO);
                      TOTAL = (CANT - EXANT) * COSTO;
                      SUBTOTAL = TOTAL;
                      SUSPEND;
                      END
              ELSE
                BEGIN
                TOTAL = 0;
                FOR SELECT ARTI_COD, AJUS_EXNUE, AJUS_EXANT FROM AJUSTES_DETALLE D WHERE D.AJUS_ID = :ID INTO
                    :ARTICULO, :CANT, :EXANT
                    DO
                      BEGIN
                      EXECUTE PROCEDURE COSTO_PROMEDIO(:ARTICULO, :FECHA) returning_values (:COSTO);
                      TOTAL = TOTAL + ((CANT - EXANT) * COSTO);
                      SUBTOTAL = TOTAL;
                      END
                SUSPEND;
                END
             END
            END
        END
    END
  if (BIN_AND(TIPO, 16) <> 0) then
    BEGIN
    SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 15 INTO :NOMTIPO;
    FOR SELECT ENSA_ID, E.PREF_PRE, ENSA_NUMERO, ENSA_FECHA, ENSA_CONC, ENSA_REFER, E.BODE_COD, BODE_NOM, ENSA_CODBAR, ENSA_DESC, ENSA_CANT, ENSA_UNIDAD, ENSA_LOTE, ENSA_OBS, ENSA_ANULADO
    FROM ENSAMBLES E, BODEGA B, PREFIJOS P
    WHERE E.BODE_COD = B.BODE_COD AND E.ENSA_FECHA >= :FECINI AND E.ENSA_FECHA <= :FECFIN
     AND P.PREF_PRE = E.PREF_PRE AND P.TIDO_COD = 15 AND ((P.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
    ORDER BY ENSA_FECHA, ENSA_ID
    into :ID, :PREF, :NUMERO, :FECHA, :CONCEPTO, :REFER, :CODBODORI, :NOMBODORI, :PRODCODBAR, :PRODDES, :PRODCANT, :PRODUNIDAD, :PRODLOTE, :OBS, :ANULADO
    DO
        BEGIN
        if (((:PREFIJO = '') or (:PREF = :PREFIJO)) AND ((:ANULADOS = 'S') or (:ANULADO = 'N'))) then
            BEGIN
            if (anulado = 'S') then
             BEGIN
              ITEM = 0;
              ARTICULO = '';
              CODBAR = '';
              ARTIDES = '';
              CANT = 0;
              UNIDAD = '';
              BODITEM = '';
              lote = '';
              costo = 0;
              DTOPORC = 0;
              DTOMONTO = 0;
              IVAPORC = 0;
              IVAMONTO = 0;
              CONSUMO = 0;
              EXANT = 0;
              TOTAL = 0;
              OBSITEM = null;
              SUBTOTAL = 0;
              SUSPEND;
             END
            ELSE
             BEGIN
              if (DETALLE = 'S') then
                FOR SELECT ESDE_ITEM, A.ARTI_COD, ESDE_CODBAR, ESDE_DESC, ESDE_CANT, ESDE_UNIDAD, BODE_COD, ESDE_COSTO, ESDE_IVAPORC, ESDE_IVAMONTO, ESDE_CONSUMO, ESDE_TOTAL, ESDE_LOTE, ESDE_OBS
                    FROM ensambles_detalle D, ARTICULO A WHERE D.ARTI_COD = A.ARTI_COD AND D.ENSA_ID = :ID INTO
                    :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :BODITEM, :COSTO, :IVAPORC, :IVAMONTO, :CONSUMO, :TOTAL, :LOTE, :OBSITEM
                    DO
                    BEGIN
                    SUBTOTAL = TOTAL - IVAMONTO - CONSUMO;
                    SUSPEND;
                    END
              ELSE
                BEGIN
                SELECT SUM(ESDE_IVAMONTO), SUM(ESDE_CONSUMO), SUM(ESDE_TOTAL) FROM ENSAMBLES_detalle D WHERE D.ENSA_ID = :ID INTO
                    :IVAMONTO, :CONSUMO, :TOTAL;
                SUBTOTAL = TOTAL - IVAMONTO - CONSUMO;
                SUSPEND;
                END
             END
            END
        END
    END
  if (BIN_AND(TIPO, 32) <> 0) then
    BEGIN
    SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 16 INTO :NOMTIPO;
    FOR SELECT DESE_ID, E.PREF_PRE, DESE_NUMERO, DESE_FECHA, DESE_CONC, DESE_REFER, E.BODE_COD, BODE_NOM, DESE_CODBAR, DESE_DESC, DESE_CANT, DESE_UNIDAD, DESE_LOTE, DESE_OBS, DESE_ANULADO
    FROM DESENSAMBLES E, BODEGA B, PREFIJOS P
    WHERE E.BODE_COD = B.BODE_COD AND DESE_FECHA >= :FECINI AND DESE_FECHA <= :FECFIN 
     AND P.PREF_PRE = E.PREF_PRE AND P.TIDO_COD = 16 AND ((P.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
    ORDER BY DESE_FECHA, DESE_ID
    into :ID, PREF, :NUMERO, :FECHA, :CONCEPTO, :REFER, :CODBODORI, :NOMBODORI, :PRODCODBAR, :PRODDES, :PRODCANT, :PRODUNIDAD, :PRODLOTE, :OBS, :ANULADO
    DO
        BEGIN
        if (((:PREFIJO = '') or (:PREF = :PREFIJO)) AND ((:ANULADOS = 'S') or (:ANULADO = 'N'))) then
            BEGIN
            if (anulado = 'S') then
             BEGIN
              ITEM = 0;
              ARTICULO = '';
              CODBAR = '';
              ARTIDES = '';
              CANT = 0;
              UNIDAD = '';
              BODITEM = '';
              lote = '';
              costo = 0;
              DTOPORC = 0;
              DTOMONTO = 0;
              IVAPORC = 0;
              IVAMONTO = 0;
              CONSUMO = 0;
              EXANT = 0;
              TOTAL = 0;
              OBSITEM = null;
              SUBTOTAL = 0;
              SUSPEND;
             END
            ELSE
             BEGIN
              if (DETALLE = 'S') then
                FOR SELECT DESE_ITEM, A.ARTI_COD, DEDE_CODBAR, DEDE_DESC, DEDE_CANT, DEDE_UNIDAD, BODE_COD, DEDE_COSTO, DEDE_IVAPORC, DEDE_IVAMONTO, DEDE_CONSUMO, DEDE_TOTAL, DEDE_LOTE, DEDE_OBS
                    FROM desensambles_detalle D, ARTICULO A WHERE D.ARTI_COD = A.ARTI_COD AND D.DESE_ID = :ID INTO
                    :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :BODITEM, :COSTO, :IVAPORC, :IVAMONTO, :CONSUMO, :TOTAL, :LOTE, :OBSITEM
                    DO
                    BEGIN
                    SUBTOTAL = TOTAL - IVAMONTO - CONSUMO;
                    SUSPEND;
                    END
              ELSE
                BEGIN
                SELECT SUM(DEDE_IVAMONTO), SUM(DEDE_CONSUMO), SUM(DEDE_TOTAL) FROM DESENSAMBLES_detalle D WHERE D.DESE_ID = :ID INTO
                    :IVAMONTO, :CONSUMO, :TOTAL;
                SUBTOTAL = TOTAL - IVAMONTO - CONSUMO;
                SUSPEND;
                END
             END
            END
        END
    END
  if (BIN_AND(TIPO, 64) <> 0) then
    BEGIN
    SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 17 INTO :NOMTIPO;
    FOR SELECT RESE_ID, R.PREF_PRE, RESE_NUMERO, RESE_FECHA, RESE_CONC, RESE_REFER, R.BODE_COD, BODE_NOM, RESE_NOMTERC, RESE_OBS, RESE_ANULADO
    FROM RESERVAS R, BODEGA B, PREFIJOS P
    WHERE R.BODE_COD = B.BODE_COD AND R.RESE_FECHA >= :FECINI AND R.RESE_FECHA <= :FECFIN 
     AND P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = 17 AND ((P.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
    ORDER BY RESE_FECHA, RESE_ID
    into :ID, :PREF, :NUMERO, :FECHA, :CONCEPTO, :REFER, :CODBODORI, :NOMBODORI, :NOMTERCERO, :OBS, :ANULADO
    DO
        BEGIN
        if (((:PREFIJO = '') or (:PREF = :PREFIJO)) AND ((:ANULADOS = 'S') or (:ANULADO = 'N'))) then
            BEGIN
            if (anulado = 'S') then
             BEGIN
              ITEM = 0;
              ARTICULO = '';
              CODBAR = '';
              ARTIDES = '';
              CANT = 0;
              UNIDAD = '';
              BODITEM = '';
              lote = '';
              costo = 0;
              DTOPORC = 0;
              DTOMONTO = 0;
              IVAPORC = 0;
              IVAMONTO = 0;
              CONSUMO = 0;
              EXANT = 0;
              TOTAL = 0;
              OBSITEM = null;
              SUBTOTAL = 0;
              SUSPEND;
             END
            ELSE
             BEGIN
              if (DETALLE = 'S') then
                FOR SELECT RSDE_ITEM, A.ARTI_COD, RSDE_CODBAR, RSDE_DESC, RDSE_CANT, RSDE_UNIDAD, BODE_COD, RSDE_OBS
                    FROM RESERVAS_DETALLE D, ARTICULO A WHERE D.ARTI_COD = A.ARTI_COD AND D.RESE_ID = :ID INTO
                    :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :BODITEM, :OBSITEM
                    DO
                    SUSPEND;
              ELSE
                BEGIN
                SELECT SUM(RDSE_CANT) FROM RESERVAS_detalle D WHERE D.RESE_ID = :ID INTO
                    :CANT;
                SUSPEND;
                END
             END
            END
        END
    END
  if (BIN_AND(TIPO, 128) <> 0) then
    BEGIN
    SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 18 INTO :NOMTIPO;
    FOR SELECT ORIN_ID, O.PREF_PRE, ORIN_NUMERO, ORIN_FECHA, ORIN_FECLLEGA, ORIN_CONC, ORIN_REFER, ORIN_NOMTERC, ORIN_OBS, ORIN_ANULADO
        FROM ORDENES_INVENTARIO O, PREFIJOS P
        WHERE ORIN_FECHA >= :FECINI AND ORIN_FECHA <= :FECFIN 
        AND P.PREF_PRE = O.PREF_PRE AND P.TIDO_COD = 18 AND ((P.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
        ORDER BY ORIN_FECHA, ORIN_ID
        into :ID, PREF, :NUMERO, :FECHA, :VENCE, :CONCEPTO, :REFER, :NOMTERCERO, :OBS, :ANULADO
        DO
        BEGIN
        if (((:PREFIJO = '') or (:PREF = :PREFIJO)) AND ((:ANULADOS = 'S') or (:ANULADO = 'N'))) then
            BEGIN
            if (anulado = 'S') then
             BEGIN
              ITEM = 0;
              ARTICULO = '';
              CODBAR = '';
              ARTIDES = '';
              CANT = 0;
              UNIDAD = '';
              BODITEM = '';
              lote = '';
              costo = 0;
              DTOPORC = 0;
              DTOMONTO = 0;
              IVAPORC = 0;
              IVAMONTO = 0;
              CONSUMO = 0;
              EXANT = 0;
              TOTAL = 0;
              OBSITEM = null;
              SUBTOTAL = 0;
              SUSPEND;
             END
            ELSE
             BEGIN
              if (DETALLE = 'S') then
                FOR SELECT ORID_ITEM, A.ARTI_COD, ORID_CODBAR, ORID_DESC, ORID_CANT, ORID_UNIDAD, ORIN_COSTO, ORID_DTOPORC, ORID_DTOMONTO, ORID_IVAPORC, ORID_IVAMONTO, ORID_CONSUMO, ORID_TOTAL, ORID_OBS, ORID_LOTE
                    FROM ORDENINVENTARIO_DETALLE D, ARTICULO A WHERE D.ARTI_COD = A.ARTI_COD AND D.ORIN_ID = :ID INTO
                    :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :COSTO, :DTOPORC, :DTOMONTO, :IVAPORC, :IVAMONTO, :CONSUMO, :TOTAL, :OBSITEM, :LOTE
                    DO
                    BEGIN
                    SUBTOTAL = TOTAL - IVAMONTO - CONSUMO;
                    SUSPEND;
                    END
              ELSE
                BEGIN
                SELECT SUM(ORID_IVAMONTO), SUM(ORID_CONSUMO), SUM(ORID_TOTAL) FROM ordeninventario_detalle D WHERE D.ORIN_ID = :ID INTO
                    :IVAMONTO, :CONSUMO, :TOTAL;
                SUBTOTAL = TOTAL - IVAMONTO - CONSUMO;
                SUSPEND;
                END
             END
            END
        END
    END
 $$IBE$$*/ SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE REP_CONSECUTIVOS_INV(
    TIPO INTEGER,
    DETALLE CHAR(1),
    PREINI VARCHAR(4),
    PREFIN VARCHAR(4),
    NUMINI VARCHAR(6),
    NUMFIN VARCHAR(6),
    ANULADOS CHAR(1),
    SUBEMPRESA INTEGER)
RETURNS (
    NOMTIPO VARCHAR(30),
    ID INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    VENCE DATE,
    CONCEPTO VARCHAR(60),
    REFER VARCHAR(60),
    CODBODORI VARCHAR(2),
    NOMBODORI VARCHAR(30),
    CODBODDES VARCHAR(2),
    NOMBODDES VARCHAR(30),
    NOMTERCERO VARCHAR(60),
    PRODCODBAR VARCHAR(15),
    PRODDES VARCHAR(60),
    PRODCANT NUMERIC(18,4),
    PRODUNIDAD VARCHAR(8),
    PRODLOTE VARCHAR(15),
    OBS BLOB SUB_TYPE 0 SEGMENT SIZE 80,
    ITEM INTEGER,
    ARTICULO VARCHAR(15),
    CODBAR VARCHAR(15),
    ARTIDES VARCHAR(60),
    CANT NUMERIC(18,4),
    EXANT NUMERIC(18,4),
    UNIDAD VARCHAR(8),
    BODITEM VARCHAR(2),
    COSTO NUMERIC(18,2),
    DTOPORC NUMERIC(9,2),
    DTOMONTO NUMERIC(18,2),
    IVAPORC NUMERIC(9,2),
    IVAMONTO NUMERIC(18,2),
    CONSUMO NUMERIC(18,2),
    SUBTOTAL NUMERIC(18,2),
    TOTAL NUMERIC(18,2),
    LOTE VARCHAR(15),
    ANULADO CHAR(1),
    OBSITEM BLOB SUB_TYPE 0 SEGMENT SIZE 80)
AS
BEGIN
  /* DETERMINE LA TABLA A EXAMINAR */ /*$$IBE$$ 
  if (BIN_AND(TIPO, 1) <> 0) then
    BEGIN
    SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 11 INTO :NOMTIPO;
    FOR SELECT ENTR_ID, E.PREF_PRE, ENTR_NUMERO, ENTR_FECHA, ENTR_CONC, ENTR_REFER, E.BODE_COD, BODE_NOM, ENTR_NOMTERC, ENTR_OBS, ENTR_ANULADO
    FROM ENTRADAS E, BODEGA B, PREFIJOS PR
    WHERE E.BODE_COD = B.BODE_COD AND E.PREF_PRE >= :PREINI AND E.PREF_PRE <= :PREFIN AND ENTR_NUMERO >= :NUMINI AND ENTR_NUMERO <= :NUMFIN
     AND PR.PREF_PRE = E.PREF_PRE AND PR.TIDO_COD = 11 AND ((PR.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
    ORDER BY E.PREF_PRE, ENTR_NUMERO
    INTO :ID, :PREF, :NUMERO, :FECHA, :CONCEPTO, :REFER, :CODBODORI, :NOMBODORI, :NOMTERCERO, :OBS, :ANULADO
    DO
        BEGIN
        if ((:ANULADOS = 'S') or (:ANULADO = 'N')) then
            BEGIN
            if (anulado = 'S') then
             BEGIN
              ITEM = 0;
              ARTICULO = '';
              CODBAR = '';
              ARTIDES = '';
              CANT = 0;
              UNIDAD = '';
              BODITEM = '';
              lote = '';
              costo = 0;
              DTOPORC = 0;
              DTOMONTO = 0;
              IVAPORC = 0;
              IVAMONTO = 0;
              CONSUMO = 0;
              TOTAL = 0;
              OBSITEM = null;
              SUBTOTAL = 0;
              SUSPEND;
             END
            ELSE
             BEGIN
              if (DETALLE = 'S') then
                FOR SELECT ENDE_ITEM, A.ARTI_COD, ENDE_CODBAR, ENDE_DESC, ENDE_CANT, ENDE_UNIDAD, BODE_COD, ENDE_COSTO, ENDE_DTOPORC, ENDE_DTOMONTO, ENDE_IVAPORC, ENDE_IVAMONTO, ENDE_CONSUMO, ENDE_TOTAL, ENDE_LOTE, ENDE_OBS
                    FROM ENTRADAS_DETALLE D, ARTICULO A
                    WHERE D.ARTI_COD = A.ARTI_COD AND D.ENTR_ID = :ID
                    ORDER BY ENDE_ITEM
                    INTO :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :BODITEM, :COSTO, :DTOPORC, :DTOMONTO, :IVAPORC, :IVAMONTO, :CONSUMO, :TOTAL, :LOTE, :OBSITEM
                    DO
                    BEGIN
                    SUBTOTAL = TOTAL - IVAMONTO - CONSUMO;
                    SUSPEND;
                    END
              ELSE
                BEGIN
                SELECT SUM(ENDE_IVAMONTO), SUM(ENDE_CONSUMO), SUM(ENDE_TOTAL) FROM ENTRADAS_DETALLE D WHERE D.ENTR_ID = :ID INTO
                    :IVAMONTO, :CONSUMO, :TOTAL;
                SUBTOTAL = TOTAL - IVAMONTO - CONSUMO;
                SUSPEND;
                END
             END
            END
        END
    END
  if (BIN_AND(TIPO, 2) <> 0) then
    BEGIN
    SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 12 INTO :NOMTIPO;
    FOR SELECT SALI_ID, S.PREF_PRE, SALI_NUMERO, SALI_FECHA, SALI_CONC, SALI_REFER, S.BODE_COD, BODE_NOM, SALI_NOMTERC, SALI_OBS, SALI_ANULADO
    FROM SALIDAS S, BODEGA B, PREFIJOS PR
    WHERE S.BODE_COD = B.BODE_COD AND S.PREF_PRE >= :PREINI AND S.PREF_PRE <= :PREFIN AND SALI_NUMERO >= :NUMINI AND SALI_NUMERO <= :NUMFIN
     AND PR.PREF_PRE = S.PREF_PRE AND PR.TIDO_COD = 12 AND ((PR.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
    ORDER BY S.PREF_PRE, SALI_NUMERO
    into :ID, :PREF, :NUMERO, :FECHA, :CONCEPTO, :REFER, :CODBODORI, :NOMBODORI, :NOMTERCERO, :OBS, :ANULADO
    DO
        BEGIN
        if ((:ANULADOS = 'S') or (:ANULADO = 'N')) then
            BEGIN
            if (anulado = 'S') then
             BEGIN
              ITEM = 0;
              ARTICULO = '';
              CODBAR = '';
              ARTIDES = '';
              CANT = 0;
              UNIDAD = '';
              BODITEM = '';
              lote = '';
              costo = 0;
              DTOPORC = 0;
              DTOMONTO = 0;
              IVAPORC = 0;
              IVAMONTO = 0;
              CONSUMO = 0;
              TOTAL = 0;
              OBSITEM = null;
              SUBTOTAL = 0;
              SUSPEND;
             END
            ELSE
             BEGIN
              if (DETALLE = 'S') then
                FOR SELECT SADE_ITEM, A.ARTI_COD, SADE_CODBAR, SADE_DESC, SADE_CANT, SADE_UNIDAD, BODE_COD, SADE_COSTO, SADE_IVAPORC, SADE_IVAMONTO, SADE_CONSUMO, SADE_TOTAL, SADE_LOTE, SADE_OBS
                FROM SALIDAS_DETALLE D, ARTICULO A
                WHERE D.ARTI_COD = A.ARTI_COD AND D.SALI_ID = :ID
                ORDER BY SADE_ITEM
                INTO :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :BODITEM, :COSTO, :IVAPORC, :IVAMONTO, :CONSUMO, :TOTAL, :LOTE, :OBSITEM
                    DO
                BEGIN
                SUBTOTAL = TOTAL - IVAMONTO - CONSUMO;
                SUSPEND;
                END
              ELSE
                BEGIN
                SELECT SUM(SADE_IVAMONTO), SUM(SADE_CONSUMO), SUM(SADE_TOTAL) FROM SALIDAS_DETALLE D WHERE D.SALI_ID = :ID INTO
                    :IVAMONTO, :CONSUMO, :TOTAL;
                SUBTOTAL = TOTAL - IVAMONTO - CONSUMO;
                SUSPEND;
                END
             END
            END
        END
    END
  if (BIN_AND(TIPO, 4) <> 0) then
    BEGIN
    SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 13 INTO :NOMTIPO;
    FOR SELECT TRAN_ID, T.PREF_PRE, TRAN_NUMERO, TRAN_FECHA, TRAN_CONC, TRAN_REFER, T.BODE_COD, BO.BODE_NOM, TRAN_BODDES, BD.BODE_NOM, TRAN_OBS, TRAN_ANULADO
    FROM TRASFERENCIAS T, BODEGA BO, BODEGA BD, PREFIJOS PR
    WHERE T.BODE_COD = BO.BODE_COD AND T.TRAN_BODDES = BD.BODE_COD AND T.PREF_PRE >= :PREINI AND T.PREF_PRE <= :PREFIN AND TRAN_NUMERO >= :NUMINI AND TRAN_NUMERO <= :NUMFIN
     AND PR.PREF_PRE = T.PREF_PRE AND PR.TIDO_COD = 13 AND ((PR.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
    ORDER BY T.PREF_PRE, TRAN_NUMERO
    into :ID, :PREF, :NUMERO, :FECHA, :CONCEPTO, :REFER, :CODBODORI, :NOMBODORI, :CODBODDES, :NOMBODDES, :OBS, :ANULADO
    DO
        BEGIN
        if ((:ANULADOS = 'S') or (:ANULADO = 'N')) then
            BEGIN
            if (anulado = 'S') then
             BEGIN
              ITEM = 0;
              ARTICULO = '';
              CODBAR = '';
              ARTIDES = '';
              CANT = 0;
              UNIDAD = '';
              BODITEM = '';
              lote = '';
              costo = 0;
              DTOPORC = 0;
              DTOMONTO = 0;
              IVAPORC = 0;
              IVAMONTO = 0;
              CONSUMO = 0;
              TOTAL = 0;
              OBSITEM = null;
              SUBTOTAL = 0;
              SUSPEND;
             END
            ELSE
             BEGIN
              if (DETALLE = 'S') then
                FOR SELECT TRAS_ITEM, A.ARTI_COD, TRAS_CODBAR, TRAS_DESC, TRAS_CANT, TRAS_UNIDAD, TRAS_COSTO, TRAS_IVAPORC, TRAS_IVAMONTO, TRAS_CONSUMO, TRAS_TOTAL, TRAS_LOTE, TRAS_OBS
                FROM TRASFERENCIAS_DETALLE D, ARTICULO A
                WHERE D.ARTI_COD = A.ARTI_COD AND D.TRAN_ID = :ID
                ORDER BY TRAS_ITEM
                INTO :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :COSTO, :IVAPORC, :IVAMONTO, :CONSUMO, :TOTAL, :LOTE, :OBSITEM
                    DO
                    BEGIN
                    SUBTOTAL = TOTAL - IVAMONTO - CONSUMO;
                    SUSPEND;
                    END
              ELSE
                BEGIN
                SELECT SUM(TRAS_IVAMONTO), SUM(TRAS_CONSUMO), SUM(TRAS_TOTAL) FROM trasferencias_detalle D WHERE D.TRAN_ID = :ID INTO
                    :IVAMONTO, :CONSUMO, :TOTAL;
                SUBTOTAL = TOTAL - IVAMONTO - CONSUMO;
                SUSPEND;
                END
             END
            END
        END
    END
  if (BIN_AND(TIPO, 8) <> 0) then
    BEGIN
    SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 14 INTO :NOMTIPO;
    FOR SELECT AJUS_ID, A.PREF_PRE, AJUS_NUMERO, AJUS_FECHA, AJUS_CONC, A.BODE_COD, BODE_NOM, AJUS_OBS, AJUS_ANULADO
    FROM AJUSTES A, BODEGA B, PREFIJOS PR
    WHERE A.BODE_COD = B.BODE_COD AND A.PREF_PRE >= :PREINI AND A.PREF_PRE <= :PREFIN AND AJUS_NUMERO >= :NUMINI AND AJUS_NUMERO <= :NUMFIN
     AND PR.PREF_PRE = A.PREF_PRE AND PR.TIDO_COD = 14 AND ((PR.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
    ORDER BY A.PREF_PRE, AJUS_NUMERO
    into :ID, :PREF, :NUMERO, :FECHA, :CONCEPTO, :CODBODORI, :NOMBODORI, :OBS, :ANULADO
    DO
        BEGIN
        if ((:ANULADOS = 'S') or (:ANULADO = 'N')) then
            BEGIN
            if (anulado = 'S') then
             BEGIN
              ITEM = 0;
              ARTICULO = '';
              CODBAR = '';
              ARTIDES = '';
              CANT = 0;
              UNIDAD = '';
              BODITEM = '';
              lote = '';
              costo = 0;
              DTOPORC = 0;
              DTOMONTO = 0;
              IVAPORC = 0;
              IVAMONTO = 0;
              CONSUMO = 0;
              EXANT = 0;
              TOTAL = 0;
              OBSITEM = null;
              SUBTOTAL = 0;
              SUSPEND;
             END
            ELSE
             BEGIN
              if (DETALLE = 'S') then
                FOR SELECT AJUS_ITEM, A.ARTI_COD, AJUS_CODBAR, AJDE_DESC, AJUS_EXANT, AJUS_UNIDAD, BODE_COD, AJUS_EXNUE, AJUS_LOTE, AJDE_OBS
                FROM AJUSTES_DETALLE D, ARTICULO A
                WHERE D.ARTI_COD = A.ARTI_COD AND D.AJUS_ID = :ID
                ORDER BY AJUS_ITEM
                INTO :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :EXANT, :UNIDAD, :BODITEM, :CANT, :LOTE, :OBSITEM
                    DO
                      BEGIN
                      TOTAL = (CANT - EXANT) * COSTO;
                      SUBTOTAL = TOTAL;
                      SUSPEND;
                      END
              ELSE
                BEGIN
                TOTAL = 0;
                FOR SELECT ARTI_COD, AJUS_EXNUE, AJUS_EXANT FROM AJUSTES_DETALLE D WHERE D.AJUS_ID = :ID INTO
                    :ARTICULO, :CANT, :EXANT
                    DO
                      BEGIN
                      EXECUTE PROCEDURE COSTO_PROMEDIO(:ARTICULO, :FECHA) returning_values (:COSTO);
                      TOTAL = TOTAL + ((CANT - EXANT) * COSTO);
                      SUBTOTAL = TOTAL;
                      END
                SUSPEND;
                END
             END
            END
        END
    END
  if (BIN_AND(TIPO, 16) <> 0) then
    BEGIN
    SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 15 INTO :NOMTIPO;
    FOR SELECT ENSA_ID, E.PREF_PRE, ENSA_NUMERO, ENSA_FECHA, ENSA_CONC, ENSA_REFER, E.BODE_COD, BODE_NOM, ENSA_CODBAR, ENSA_DESC, ENSA_CANT, ENSA_UNIDAD, ENSA_LOTE, ENSA_OBS, ENSA_ANULADO
    FROM ENSAMBLES E, BODEGA B, PREFIJOS PR
    WHERE E.BODE_COD = B.BODE_COD AND E.PREF_PRE >= :PREINI AND E.PREF_PRE <= :PREFIN AND ENSA_NUMERO >= :NUMINI AND ENSA_NUMERO <= :NUMFIN
     AND PR.PREF_PRE = E.PREF_PRE AND PR.TIDO_COD = 15 AND ((PR.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
    ORDER BY E.PREF_PRE, ENSA_NUMERO
    into :ID, :PREF, :NUMERO, :FECHA, :CONCEPTO, :REFER, :CODBODORI, :NOMBODORI, :PRODCODBAR, :PRODDES, :PRODCANT, :PRODUNIDAD, :PRODLOTE, :OBS, :ANULADO
    DO
        BEGIN
        if ((:ANULADOS = 'S') or (:ANULADO = 'N')) then
            BEGIN
            if (anulado = 'S') then
             BEGIN
              ITEM = 0;
              ARTICULO = '';
              CODBAR = '';
              ARTIDES = '';
              CANT = 0;
              UNIDAD = '';
              BODITEM = '';
              lote = '';
              costo = 0;
              DTOPORC = 0;
              DTOMONTO = 0;
              IVAPORC = 0;
              IVAMONTO = 0;
              CONSUMO = 0;
              TOTAL = 0;
              OBSITEM = null;
              SUBTOTAL = 0;
              SUSPEND;
             END
            ELSE
             BEGIN
              if (DETALLE = 'S') then
                FOR SELECT ESDE_ITEM, A.ARTI_COD, ESDE_CODBAR, ESDE_DESC, ESDE_CANT, ESDE_UNIDAD, BODE_COD, ESDE_COSTO, ESDE_IVAPORC, ESDE_IVAMONTO, ESDE_CONSUMO, ESDE_TOTAL, ESDE_LOTE, ESDE_OBS
                FROM ensambles_detalle D, ARTICULO A
                WHERE D.ARTI_COD = A.ARTI_COD AND D.ENSA_ID = :ID
                ORDER BY ESDE_ITEM
                INTO :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :BODITEM, :COSTO, :IVAPORC, :IVAMONTO, :CONSUMO, :TOTAL, :LOTE, :OBSITEM
                    DO
                    BEGIN
                    SUBTOTAL = TOTAL - IVAMONTO - CONSUMO;
                    SUSPEND;
                    END
              ELSE
                BEGIN
                SELECT SUM(ESDE_IVAMONTO), SUM(ESDE_CONSUMO), SUM(ESDE_TOTAL) FROM ENSAMBLES_detalle D WHERE D.ENSA_ID = :ID INTO
                    :IVAMONTO, :CONSUMO, :TOTAL;
                SUBTOTAL = TOTAL - IVAMONTO - CONSUMO;
                SUSPEND;
                END
             END
            END
        END
    END
  if (BIN_AND(TIPO, 32) <> 0) then
    BEGIN
    SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 16 INTO :NOMTIPO;
    FOR SELECT DESE_ID, E.PREF_PRE, DESE_NUMERO, DESE_FECHA, DESE_CONC, DESE_REFER, E.BODE_COD, BODE_NOM, DESE_CODBAR, DESE_DESC, DESE_CANT, DESE_UNIDAD, DESE_LOTE, DESE_OBS, DESE_ANULADO
    FROM DESENSAMBLES E, BODEGA B, PREFIJOS PR
    WHERE E.BODE_COD = B.BODE_COD AND E.PREF_PRE >= :PREINI AND E.PREF_PRE <= :PREFIN AND DESE_NUMERO >= :NUMINI AND DESE_NUMERO <= :NUMFIN
     AND PR.PREF_PRE = E.PREF_PRE AND PR.TIDO_COD = 16 AND ((PR.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
    ORDER BY E.PREF_PRE, DESE_NUMERO
    into :ID, :PREF, :NUMERO, :FECHA, :CONCEPTO, :REFER, :CODBODORI, :NOMBODORI, :PRODCODBAR, :PRODDES, :PRODCANT, :PRODUNIDAD, :PRODLOTE, :OBS, :ANULADO
    DO
        BEGIN
        if ((:ANULADOS = 'S') or (:ANULADO = 'N')) then
            BEGIN
            if (anulado = 'S') then
             BEGIN
              ITEM = 0;
              ARTICULO = '';
              CODBAR = '';
              ARTIDES = '';
              CANT = 0;
              UNIDAD = '';
              BODITEM = '';
              lote = '';
              costo = 0;
              DTOPORC = 0;
              DTOMONTO = 0;
              IVAPORC = 0;
              IVAMONTO = 0;
              CONSUMO = 0;
              TOTAL = 0;
              OBSITEM = null;
              SUBTOTAL = 0;
              SUSPEND;
             END
            ELSE
             BEGIN
              if (DETALLE = 'S') then
                FOR SELECT DESE_ITEM, A.ARTI_COD, DEDE_CODBAR, DEDE_DESC, DEDE_CANT, DEDE_UNIDAD, BODE_COD, DEDE_COSTO, DEDE_IVAPORC, DEDE_IVAMONTO, DEDE_CONSUMO, DEDE_TOTAL, DEDE_LOTE, DEDE_OBS
                FROM DESensambles_detalle D, ARTICULO A
                WHERE D.ARTI_COD = A.ARTI_COD AND D.DESE_ID = :ID
                ORDER BY DESE_ITEM
                INTO
                    :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :BODITEM, :COSTO, :IVAPORC, :IVAMONTO, :CONSUMO, :TOTAL, :LOTE, :OBSITEM
                    DO
                    BEGIN
                    SUBTOTAL = TOTAL - IVAMONTO - CONSUMO;
                    SUSPEND;
                    END
              ELSE
                BEGIN
                SELECT SUM(DEDE_IVAMONTO), SUM(DEDE_CONSUMO), SUM(DEDE_TOTAL) FROM DESENSAMBLES_detalle D WHERE D.DESE_ID = :ID INTO
                    :IVAMONTO, :CONSUMO, :TOTAL;
                SUBTOTAL = TOTAL - IVAMONTO - CONSUMO;
                SUSPEND;
                END
             END
            END
        END
    END
  if (BIN_AND(TIPO, 64) <> 0) then
    BEGIN
    SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 17 INTO :NOMTIPO;
    FOR SELECT RESE_ID, R.PREF_PRE, RESE_NUMERO, RESE_FECHA, RESE_CONC, RESE_REFER, R.BODE_COD, BODE_NOM, RESE_NOMTERC, RESE_OBS, RESE_ANULADO
    FROM RESERVAS R, BODEGA B, PREFIJOS PR
    WHERE R.BODE_COD = B.BODE_COD AND R.PREF_PRE >= :PREINI AND R.PREF_PRE <= :PREFIN AND RESE_NUMERO >= :NUMINI AND RESE_NUMERO <= :NUMFIN
     AND PR.PREF_PRE = R.PREF_PRE AND PR.TIDO_COD = 17 AND ((PR.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
    ORDER BY R.PREF_PRE, RESE_NUMERO
    into :ID, :PREF, :NUMERO, :FECHA, :CONCEPTO, :REFER, :CODBODORI, :NOMBODORI, :NOMTERCERO, :OBS, :ANULADO
    DO
        BEGIN
        if ((:ANULADOS = 'S') or (:ANULADO = 'N')) then
            BEGIN
            if (anulado = 'S') then
             BEGIN
              ITEM = 0;
              ARTICULO = '';
              CODBAR = '';
              ARTIDES = '';
              CANT = 0;
              UNIDAD = '';
              BODITEM = '';
              lote = '';
              costo = 0;
              DTOPORC = 0;
              DTOMONTO = 0;
              IVAPORC = 0;
              IVAMONTO = 0;
              CONSUMO = 0;
              EXANT = 0;
              TOTAL = 0;
              OBSITEM = null;
              SUBTOTAL = 0;
              SUSPEND;
             END
            ELSE
             BEGIN
              if (DETALLE = 'S') then
                FOR SELECT RSDE_ITEM, A.ARTI_COD, RSDE_CODBAR, RSDE_DESC, RDSE_CANT, RSDE_UNIDAD, BODE_COD, RSDE_OBS
                FROM RESERVAS_DETALLE D, ARTICULO A
                WHERE D.ARTI_COD = A.ARTI_COD AND D.RESE_ID = :ID
                ORDER BY RSDE_ITEM
                INTO :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :BODITEM, :OBSITEM
                    DO
                    SUSPEND;
              ELSE
                BEGIN
                SELECT SUM(RDSE_CANT) FROM RESERVAS_detalle D WHERE D.RESE_ID = :ID INTO
                    :CANT;
                SUSPEND;
                END
             END
            END
        END
    END
  if (BIN_AND(TIPO, 128) <> 0) then
    BEGIN
    SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 18 INTO :NOMTIPO;
    FOR SELECT ORIN_ID, O.PREF_PRE, ORIN_NUMERO, ORIN_FECHA, ORIN_FECLLEGA, ORIN_CONC, ORIN_REFER, ORIN_NOMTERC, ORIN_OBS, ORIN_ANULADO
    FROM ORDENES_INVENTARIO O, PREFIJOS PR
    WHERE O.PREF_PRE >= :PREINI AND O.PREF_PRE <= :PREFIN AND ORIN_NUMERO >= :NUMINI AND ORIN_NUMERO <= :NUMFIN
     AND PR.PREF_PRE = O.PREF_PRE AND PR.TIDO_COD = 18 AND ((PR.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
    ORDER BY O.PREF_PRE, ORIN_NUMERO
    into :ID, :PREF, :NUMERO, :FECHA, :VENCE, :CONCEPTO, :REFER, :NOMTERCERO, :OBS, :ANULADO
    DO
        BEGIN
        if ((:ANULADOS = 'S') or (:ANULADO = 'N')) then
            BEGIN
            if (anulado = 'S') then
             BEGIN
              ITEM = 0;
              ARTICULO = '';
              CODBAR = '';
              ARTIDES = '';
              CANT = 0;
              UNIDAD = '';
              BODITEM = '';
              lote = '';
              costo = 0;
              DTOPORC = 0;
              DTOMONTO = 0;
              IVAPORC = 0;
              IVAMONTO = 0;
              CONSUMO = 0;
              EXANT = 0;
              TOTAL = 0;
              OBSITEM = null;
              SUBTOTAL = 0;
              SUSPEND;
             END
            ELSE
             BEGIN
              if (DETALLE = 'S') then
                FOR SELECT ORID_ITEM, A.ARTI_COD, ORID_CODBAR, ORID_DESC, ORID_CANT, ORID_UNIDAD, ORIN_COSTO, ORID_DTOPORC, ORID_DTOMONTO, ORID_IVAPORC, ORID_IVAMONTO, ORID_CONSUMO, ORID_TOTAL, ORID_OBS, ORID_LOTE
                FROM ORDENINVENTARIO_DETALLE D, ARTICULO A
                WHERE D.ARTI_COD = A.ARTI_COD AND D.ORIN_ID = :ID
                ORDER BY ORID_ITEM
                INTO :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :COSTO, :DTOPORC, :DTOMONTO, :IVAPORC, :IVAMONTO, :CONSUMO, :TOTAL, :OBSITEM, :LOTE
                    DO
                    BEGIN
                    SUBTOTAL = TOTAL - IVAMONTO - CONSUMO;
                    SUSPEND;
                    END
              ELSE
                BEGIN
                SELECT SUM(ORID_IVAMONTO), SUM(ORID_CONSUMO), SUM(ORID_TOTAL) FROM ordeninventario_detalle D WHERE D.ORIN_ID = :ID INTO
                    :IVAMONTO, :CONSUMO, :TOTAL;
                SUBTOTAL = TOTAL - IVAMONTO - CONSUMO;
                SUSPEND;
                END
             END
            END
        END
    END
 $$IBE$$*/ SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE REP_DISPONIBILIDAD(
    FECHA DATE,
    ARTINI VARCHAR(20),
    ARTFIN VARCHAR(20),
    GRPINI VARCHAR(2),
    GRPFIN VARCHAR(2),
    ORDEN CHAR(1),
    CEROS CHAR(1),
    DETALLE CHAR(1),
    SUCURSAL INTEGER)
RETURNS (
    CODIGO VARCHAR(15),
    NOMBRE VARCHAR(60),
    UNIDAD VARCHAR(8),
    CODGRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    CODSUBG VARCHAR(3),
    NOMSUBG VARCHAR(30),
    CODMARC VARCHAR(3),
    NOMMARC VARCHAR(30),
    CODBOD VARCHAR(2),
    NOMBOD VARCHAR(30),
    EXIST NUMERIC(18,4),
    PROMEDIO NUMERIC(18,4),
    SALIDAS NUMERIC(18,4),
    DISPONIBILIDAD INTEGER,
    DIAS INTEGER,
    PROMEDIADO INTEGER,
    COSTO NUMERIC(18,2),
    COSTOPRO NUMERIC(18,2),
    SUGERIDO NUMERIC(18,4),
    FECCOMPRA DATE)
AS
DECLARE VARIABLE CODINI VARCHAR(20);
DECLARE VARIABLE CODFIN VARCHAR(20);
DECLARE VARIABLE DESINI VARCHAR(20);
declare variable FECINI DATE;
declare variable DIASC VARCHAR(255);
DECLARE VARIABLE DESFIN VARCHAR(20);
declare variable DIA_ART VARCHAR(2) CHARACTER SET NONE;
BEGIN /*$$IBE$$ 
if (ORDEN = 'C') then
    BEGIN
    CODINI = ARTINI;
    CODFIN = ARTFIN;
    DESINI = '';
    DESFIN = 'zz';
    END
ELSE
    BEGIN
    DESINI = ARTINI;
    DESFIN = ARTFIN;
    CODINI = '';
    CODFIN = 'zz';
    END
if (DETALLE = 'S') then
  BEGIN
  FOR SELECT ARTI_COD, ARTI_DES, ARTI_UNIDAD, ARTI_DIAS, A.GRUP_COD, GRUP_NOM, A.SUBG_COD, A.MARC_COD, BODE_COD, BODE_NOM, ARTI_DIANALIS
      FROM ARTICULO A, GRUPO G, BODEGA B
      WHERE ARTI_COD >= :CODINI AND ARTI_COD <= :CODFIN AND A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :GRPFIN AND ARTI_DES >= :DESINI AND ARTI_DES <= :DESFIN AND
      G.GRUP_COD = A.GRUP_COD AND A.ESAR_COD <> 'I' AND ((SUCU_ID = :SUCURSAL) or (:SUCURSAL = 0))
      INTO :CODIGO, :NOMBRE, :UNIDAD, :DIAS, :CODGRUPO, :NOMGRUPO, :CODSUBG, :CODMARC, :CODBOD, :NOMBOD, :PROMEDIADO
      DO
        BEGIN
        NOMMARC = '';
        NOMSUBG = '';
        SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO :NOMMARC;
        SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
        EXECUTE PROCEDURE ultimo_costo(:CODIGO, :FECHA, :UNIDAD) returning_values (:COSTO);
        EXECUTE PROCEDURE costo_promedio(:CODIGO, :FECHA) RETURNING_VALUES :costopro;
        EXECUTE PROCEDURE DISPONIBILIDAD_ARTICULO(CODIGO, FECHA, :CODBOD) returning_values (:DISPONIBILIDAD, :EXIST, :PROMEDIO, :SALIDAS);
         $$IBE$$*/ /*ESTABLECER CUAL ES EL VALOR DE DIAS PARA PROMEDIO*/ /*$$IBE$$ 
        EXECUTE PROCEDURE lee_configuracion ('INVENTARIO', 'EXISTENCIAS', 'PROMEDIAR LAS SALIDAS DEL INVENTARIO CON EL NUMERO DE DIAS ASIGNADO A CADA ARTICULO') returning_values (:DIA_ART);
        if (DIA_ART = 'NO') then
          BEGIN
            EXECUTE PROCEDURE lee_configuracion ('INVENTARIO', 'EXISTENCIAS', 'NUMERO DE DIAS PARA PROMEDIO DE SALIDAS POR ARTICULO') returning_values (DIASC);
            PROMEDIADO = CAST(DIASC AS INTEGER);
          END
        FECINI = :FECHA - :PROMEDIADO;
        if ((DISPONIBILIDAD < DIAS) and (PROMEDIO > 0))then
            SUGERIDO = (DIAS * PROMEDIO) - EXIST;
        ELSE
            SUGERIDO = 0;
        SELECT MAX(FACO_FECHA) FROM FACTURAS_COMPRA F, FACTURAS_COMPRAS_DETALLE D
            WHERE F.FACO_ID = D.faco_id AND D.ARTI_COD = :CODIGO AND FACO_FECHA <= :FECHA AND D.bode_cod = :codbod
            INTO :FECCOMPRA;
        if ((PROMEDIO > 0) or (EXIST <> 0) or (CEROS = 'S')) then
            SUSPEND;
        END
  END
ELSE
  BEGIN
  FOR SELECT ARTI_COD, ARTI_DES, ARTI_UNIDAD, ARTI_DIAS, A.GRUP_COD, GRUP_NOM, A.SUBG_COD, A.MARC_COD, ARTI_DIANALIS
      FROM ARTICULO A, GRUPO G
      WHERE ARTI_COD >= :CODINI AND ARTI_COD <= :CODFIN AND A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :GRPFIN AND ARTI_DES >= :DESINI AND ARTI_DES <= :DESFIN AND G.GRUP_COD = A.GRUP_COD AND A.ESAR_COD <> 'I'
      INTO :CODIGO, :NOMBRE, :UNIDAD, :DIAS, :CODGRUPO, :NOMGRUPO, :CODSUBG, :CODMARC, :PROMEDIADO
      DO
        BEGIN
        NOMMARC = '';
        NOMSUBG = '';
        SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO :NOMMARC;
        SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
        EXECUTE PROCEDURE costo_promedio(:CODIGO, :FECHA) RETURNING_VALUES :costopro;
        EXECUTE PROCEDURE ultimo_costo(:CODIGO, :FECHA, :UNIDAD) returning_values (:COSTO);
        EXECUTE PROCEDURE DISPONIBILIDAD_TOTAL_ARTICULO(CODIGO, FECHA) returning_values (:DISPONIBILIDAD, :EXIST, :PROMEDIO, :SALIDAS);
         $$IBE$$*/ /*ESTABLECER CUAL ES EL VALOR DE DIAS PARA PROMEDIO*/ /*$$IBE$$ 
        EXECUTE PROCEDURE lee_configuracion ('INVENTARIO', 'EXISTENCIAS', 'PROMEDIAR LAS SALIDAS DEL INVENTARIO CON EL NUMERO DE DIAS ASIGNADO A CADA ARTICULO') returning_values (:DIA_ART);
        if (DIA_ART = 'NO') then
          BEGIN
            EXECUTE PROCEDURE lee_configuracion ('INVENTARIO', 'EXISTENCIAS', 'NUMERO DE DIAS PARA PROMEDIO DE SALIDAS POR ARTICULO') returning_values (DIASC);
            PROMEDIADO = CAST(DIASC AS INTEGER);
          END
        FECINI = :FECHA - :PROMEDIADO;
        if ((DISPONIBILIDAD < DIAS) and (PROMEDIO > 0))then
            SUGERIDO = (DIAS * PROMEDIO) - EXIST;
        ELSE
            SUGERIDO = 0;
        SELECT MAX(FACO_FECHA) FROM FACTURAS_COMPRA F, FACTURAS_COMPRAS_DETALLE D
            WHERE F.FACO_ID = D.faco_id AND D.ARTI_COD = :CODIGO AND FACO_FECHA <= :FECHA
            INTO :FECCOMPRA;
        if ((PROMEDIO > 0) or (EXIST <> 0) or (CEROS = 'S')) then
            SUSPEND;
        END
  END
 $$IBE$$*/ SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE REP_KARDEX_ARTICULO(
    DETALLE CHAR(1),
    FECINI DATE,
    FECFIN DATE,
    ARTINI VARCHAR(20),
    ARTFIN VARCHAR(20),
    GRPINI VARCHAR(2),
    GRPFIN VARCHAR(2),
    ORDEN CHAR(1),
    BODEGA VARCHAR(2))
RETURNS (
    CODIGO VARCHAR(15),
    NOMBRE VARCHAR(60),
    UNIDAD VARCHAR(8),
    CODGRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    CODSUBG VARCHAR(3),
    NOMSUBG VARCHAR(30),
    CODMARC VARCHAR(3),
    NOMMARC VARCHAR(30),
    CODBOD VARCHAR(2),
    SALDOINI NUMERIC(18,4),
    COSTOINI NUMERIC(18,2),
    ENTRADAS NUMERIC(18,4),
    COSTOENT NUMERIC(18,2),
    SALIDAS NUMERIC(18,4),
    COSTOSAL NUMERIC(18,2),
    SALDOFIN NUMERIC(18,4),
    COSTOFIN NUMERIC(18,2),
    TIPODOC VARCHAR(8),
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    CONCEPTO VARCHAR(60),
    NIT VARCHAR(20),
    CONS INTEGER,
    CANFINAL NUMERIC(18,4),
    COSFINAL NUMERIC(18,2))
AS
DECLARE VARIABLE ENTRADA CHAR(1);
DECLARE VARIABLE CANT NUMERIC(18,4);
DECLARE VARIABLE EXIST NUMERIC(18,4);
DECLARE VARIABLE COSTO NUMERIC(18,2);
DECLARE VARIABLE CODINI VARCHAR(20);
DECLARE VARIABLE CODFIN VARCHAR(20);
DECLARE VARIABLE DESINI VARCHAR(20);
DECLARE VARIABLE DESFIN VARCHAR(20);
declare variable TIPO INTEGER;
declare variable ID INTEGER;
BEGIN /*$$IBE$$ 
if (ORDEN = 'C') then
    BEGIN
    CODINI = ARTINI;
    CODFIN = ARTFIN;
    DESINI = '';
    DESFIN = 'zz';
    END
ELSE
    BEGIN
    DESINI = ARTINI;
    DESFIN = ARTFIN;
    CODINI = '';
    CODFIN = 'zz';
    END
  FOR
    SELECT ARTI_COD, ARTI_DES, ARTI_UNIDAD, A.GRUP_COD, A.SUBG_COD, A.MARC_COD
      FROM ARTICULO A
      WHERE ARTI_COD >= :CODINI AND ARTI_COD <= :CODFIN AND A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :GRPFIN AND ARTI_DES >= :DESINI AND ARTI_DES <= :DESFIN AND A.ESAR_COD <> 'I'
      INTO :CODIGO, :NOMBRE, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
      DO
        BEGIN
        NOMMARC = '';
        NOMSUBG = '';
        SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
        SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
        SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
        if (BODEGA = '') then
            BEGIN
            EXECUTE PROCEDURE SALDO_INICIAL_TOTAL_INV(CODIGO, FECINI) returning_values (:SALDOINI);
            EXECUTE PROCEDURE VALOR_INICIAL_INVENTARIO(CODIGO, FECINI) returning_values (COSTOINI);
            END
        ELSE
            BEGIN
            EXECUTE PROCEDURE SALDO_INICIAL_INVENTARIO(CODIGO, FECINI, :BODEGA) returning_values (SALDOINI);
            EXECUTE PROCEDURE COSTO_PROMEDIO(CODIGO, FECINI) returning_values (COSTOINI);
            COSTOINI = COSTOINI * saldoini;
            END
        if (DETALLE = 'N') then
            BEGIN
             $$IBE$$*/ /* SUME LAS ENTRADAS */ /*$$IBE$$ 
            if (BODEGA = '') then
                SELECT SUM(MVAR_CANT), SUM(MVAR_CANT * MVAR_COSTO) FROM MOVIMIENTO_ARTICULO
                  WHERE (MVAR_FECHA >= :FECINI) AND (MVAR_FECHA <= :FECFIN) AND (MVAR_TIPODOC <> 13) AND
                  (ARTI_COD = :CODIGO) AND (MVAR_ENTRADA = 'S') INTO :ENTRADAS, :COSTOENT;
            ELSE
                SELECT SUM(MVAR_CANT), SUM(MVAR_CANT * MVAR_COSTO) FROM MOVIMIENTO_ARTICULO
                  WHERE (MVAR_FECHA >= :FECINI) AND (MVAR_FECHA <= :FECFIN) AND (MVAR_TIPODOC <> 13) AND
                  (ARTI_COD = :CODIGO) AND (MVAR_ENTRADA = 'S') AND BODE_COD = :BODEGA
                  INTO :ENTRADAS, :COSTOENT;
                
            if (ENTRADAS IS NULL) then
              ENTRADAS = 0;
            if (COSTOENT IS NULL) then
              COSTOENT = 0;
             $$IBE$$*/ /* CALCULE LAS SALIDAS A COSTO PROMEDIO */ /*$$IBE$$ 
            SALIDAS = 0;
            COSTOSAL = 0;
            if (BODEGA = '') then
                FOR SELECT MVAR_CANT, MVAR_FECHA, MVAR_TIPODOC, MVAR_CONS
                    FROM MOVIMIENTO_ARTICULO
                    WHERE (MVAR_FECHA >= :FECINI) AND (MVAR_FECHA <= :FECFIN) AND (MVAR_TIPODOC <> 13) AND
                    (ARTI_COD = :CODIGO) AND (MVAR_ENTRADA = 'N')
                    INTO :CANT, :FECHA, :TIPO, :ID
                    DO
                    BEGIN
                    SELECT COST_SALDOP, COST_SALDOC FROM COSTOS WHERE COST_TIPO = :TIPO AND COST_IDMOV = :ID INTO :COSTO, :EXIST;
                    if (EXIST <> 0) then
                        COSTO = COSTO / EXIST;
                    ELSE
                        COSTO = 0;
                    COSTOSAL = COSTOSAL + (COSTO*CANT);
                    SALIDAS = SALIDAS + CANT;
                    END
            ELSE
                FOR SELECT MVAR_CANT, MVAR_FECHA, MVAR_TIPODOC, MVAR_CONS
                    FROM MOVIMIENTO_ARTICULO
                    WHERE (MVAR_FECHA >= :FECINI) AND (MVAR_FECHA <= :FECFIN) AND (MVAR_TIPODOC <> 13) AND
                    (ARTI_COD = :CODIGO) AND (MVAR_ENTRADA = 'N') AND BODE_COD = :BODEGA
                    INTO :CANT, :FECHA, :TIPO, :ID
                    DO
                    BEGIN
                    SELECT COST_SALDOP, COST_SALDOC FROM COSTOS WHERE COST_TIPO = :TIPO AND COST_IDMOV = :ID INTO :COSTO, :EXIST;
                    if (EXIST <> 0) then
                        COSTO = COSTO / EXIST;
                    ELSE
                        COSTO = 0;
                    COSTOSAL = COSTOSAL + (COSTO*CANT);
                    SALIDAS = SALIDAS + CANT;
                    END
            if (SALIDAS IS NULL) then
              SALIDAS = 0;
            if (COSTOSAL IS NULL) then
              COSTOSAL = 0;
            SALDOFIN = SALDOINI + ENTRADAS - SALIDAS;
            COSTOFIN = COSTOINI + COSTOENT - COSTOSAL;
            if (BODEGA = '') then
                BEGIN
                EXECUTE PROCEDURE SALDO_INICIAL_TOTAL_INV(CODIGO, fecfin+1) returning_values (canfinal);
                EXECUTE PROCEDURE VALOR_INICIAL_INVENTARIO(CODIGO, FECFIN+1) returning_values (cosfinal);
                END
            ELSE
                BEGIN
                EXECUTE PROCEDURE SALDO_INICIAL_INVENTARIO(CODIGO, FECFIN+1, :BODEGA) returning_values (CANFINAL);
                EXECUTE PROCEDURE COSTO_PROMEDIO(CODIGO, FECFIN+1) returning_values (COSFINAL);
                COSFINAL = COSFINAL * CANFINAL;
                END
            SUSPEND;
            END
        ELSE
            BEGIN
            SALDOFIN = SALDOINI;
            COSTOFIN = COSTOINI;
            COSTOENT = 0;
            COSTOSAL = 0;
            FOR SELECT TIDO_NOMCORTO, MVAR_ENTRADA, MVAR_PREF, MVAR_NUMERO, MVAR_CANT, MVAR_COSTO, MVAR_CONC, MVAR_FECHA, M.TERC_NIT, MVAR_CONS, BODE_COD
                FROM MOVIMIENTO_ARTICULO M, TIPO_DOCUMENTO TD
                WHERE TD.TIDO_COD = MVAR_TIPODOC AND (MVAR_FECHA >= :FECINI) AND (MVAR_FECHA <= :FECFIN) AND (MVAR_TIPODOC <> 13) AND (ARTI_COD = :CODIGO)
                ORDER BY MVAR_FECHA, MVAR_CONS
                INTO :TIPODOC, :ENTRADA, :PREFIJO, :NUMERO, :ENTRADAS, :COSTOENT, :CONCEPTO, :FECHA, :NIT, :CONS, :CODBOD
                DO
                    BEGIN
                    if (ENTRADA = 'S') then
                        BEGIN
                        SALIDAS = 0;
                        SALDOFIN = SALDOFIN + ENTRADAS;
                        COSTOFIN = COSTOFIN + (ENTRADAS * COSTOENT);
                        if (SALDOFIN > 0) then
                            COSTOSAL = COSTOFIN / SALDOFIN;
                        end
                    ELSE
                        BEGIN
                        SALIDAS = ENTRADAS;
                        ENTRADAS = 0;
                        if (SALDOFIN > 0) then
                            COSTOENT = COSTOFIN / SALDOFIN;
                        else
                            EXECUTE PROCEDURE COSTO_PROMEDIO(:CODIGO, :FECHA) returning_values (:COSTOENT);
                        SALDOFIN = SALDOFIN - SALIDAS;
                        COSTOFIN = COSTOFIN - (SALIDAS * COSTOENT);
                        if (SALDOFIN > 0) then
                            COSTOSAL = COSTOFIN / SALDOFIN;
                        END
                    SUSPEND;
                    END
            END
        END
 $$IBE$$*/ SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE REP_PRODUCTOS(
    ORDEN CHAR(1),
    DESDE VARCHAR(15),
    HASTA VARCHAR(15),
    FECHA DATE)
RETURNS (
    CODIGO VARCHAR(15),
    DESCR VARCHAR(60),
    GRUPCOD VARCHAR(2),
    GRUPNOM VARCHAR(30),
    SUBGCOD VARCHAR(3),
    SUBGNOM VARCHAR(30),
    MARCCOD VARCHAR(3),
    MARCNOM VARCHAR(30),
    ESTADO CHAR(1),
    UNIDAD VARCHAR(8),
    CODCOMP VARCHAR(15),
    DESCOMP VARCHAR(60),
    CANT NUMERIC(18,4),
    UNDCOMP VARCHAR(8),
    CODBARCOMP VARCHAR(15),
    COSTO NUMERIC(18,2),
    TOTAL NUMERIC(18,2))
AS
BEGIN /*$$IBE$$ 
  FOR SELECT ARTI_COD, ARTI_DES, ARTI_UNIDAD, A.GRUP_COD, GRUP_NOM, A.SUBG_COD, A.MARC_COD, A.esar_cod
  FROM ARTICULO A, GRUPO G, estado_articulo E
  WHERE A.GRUP_COD = G.GRUP_COD AND A.ESAR_COD = E.ESAR_COD AND ARTI_COD IN (SELECT DISTINCT ARTI_COD FROM ARTICULOS_PRODUCTO)
  INTO :CODIGO, :DESCR, :unidad, :GRUPCOD, :GRUPNOM, :SUBGCOD, :MARCCOD, :ESTADO
  DO
    if ((ORDEN = 'C' AND CODIGO >= :DESDE AND CODIGO <= :HASTA) OR
        (ORDEN = 'D' AND DESCR >= :DESDE AND DESCR <= :HASTA)) then
        BEGIN
        SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :MARCCOD INTO MARCNOM;
        SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :SUBGCOD AND GRUP_COD = :GRUPCOD INTO :SUBGNOM;
        FOR SELECT ARPR_COMP, ARTI_DES, ARPR_CODBAR, ARPR_CANT, ARPR_UNIDAD
        FROM ARTICULOS_PRODUCTO P, ARTICULO A
        WHERE P.ARTI_COD = :CODIGO AND P.ARPR_COMP = A.ARTI_COD
          INTO :CODCOMP, :DESCOMP, :CODBARCOMP, :CANT, :UNDCOMP
          DO
            begin
            EXECUTE PROCEDURE COSTO_PROMEDIO (:CODCOMP, :FECHA) returning_values (:COSTO);
            EXECUTE PROCEDURE CANTIDAD_POR_FACTOR (:CODCOMP, :CANT, :UNDCOMP) returning_values (:CANT);
            TOTAL = COSTO * CANT;
            SUSPEND;
            END
        END
 $$IBE$$*/ SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE REP_UTILIDAD_CLIENTE(
    TIPO INTEGER,
    DETALLE CHAR(1),
    TERINI VARCHAR(20),
    TERFIN VARCHAR(20),
    FECINI DATE,
    FECFIN DATE,
    ARTINI VARCHAR(15),
    ARTFIN VARCHAR(15),
    ORDEN CHAR(1),
    CEROS CHAR(1),
    SUBEMPRESA INTEGER)
RETURNS (
    NIT VARCHAR(20),
    NOMBRE VARCHAR(60),
    TELEFONO VARCHAR(40),
    CIUDAD VARCHAR(40),
    CODZONA VARCHAR(2),
    NOMZONA VARCHAR(30),
    NOMTIPO VARCHAR(50),
    ARTICULO VARCHAR(15),
    DESCRIPCION VARCHAR(60),
    CODGRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    CODSUBG VARCHAR(3),
    NOMSUBG VARCHAR(30),
    CODMARC VARCHAR(3),
    NOMMARC VARCHAR(30),
    UNIDAD VARCHAR(8),
    CANTIDAD NUMERIC(18,4),
    BASE NUMERIC(18,2),
    IVA NUMERIC(18,2),
    COSTO NUMERIC(18,2),
    UTILIDAD NUMERIC(18,4),
    PORC NUMERIC(9,2),
    TOTAL NUMERIC(18,2),
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    DTO NUMERIC(9,2))
AS
DECLARE VARIABLE COSTOUNIT NUMERIC(18,4);
DECLARE VARIABLE CODINI VARCHAR(15);
DECLARE VARIABLE CODFIN VARCHAR(15);
DECLARE VARIABLE DESINI VARCHAR(15);
DECLARE VARIABLE DESFIN VARCHAR(15);
declare variable UOM VARCHAR(20);
declare variable NUMROWS INTEGER;
BEGIN /*$$IBE$$ 
if (ORDEN = 'C') then
    BEGIN
    CODINI = ARTINI;
    CODFIN = ARTFIN;
    DESINI = '';
    DESFIN = 'zz';
    END
ELSE
    BEGIN
    DESINI = ARTINI;
    DESFIN = ARTFIN;
    CODINI = '';
    CODFIN = 'zz';
    END
EXECUTE PROCEDURE lee_configuracion ('FACTURACION', 'ARTICULOS', 'SUGERIR PRECIOS CON PORCENTAJE DE MARGEN O UTILIDAD') returning_values (:UOM);
SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = :TIPO INTO :NOMTIPO;
if (DETALLE = 'N') then
    BEGIN
    if (BIN_AND(TIPO, 1) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 31 INTO :NOMTIPO;
         $$IBE$$*/ /* BORRA LA TABLA AUXILIAR */ /*$$IBE$$ 
        DELETE FROM reportes_aux WHERE REPA_ID = 3 AND REPA_USER = USER;

        FOR SELECT MAX(T.TERC_NIT), MAX(TERC_NOM), MAX(TERC_TEL), MAX(TERC_CIU), MAX(ZONA_COD), MAX(ARTI_COD), SUM(FADE_CANT * FADE_FACTOR), SUM(FACT_FACTOR*(FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO)),
            SUM(FACT_FACTOR*FADE_IVAMONTO), SUM(FACT_FACTOR*FADE_TOTAL)
            FROM FACTURAS_DETALLE D, FACTURAS F, PREFIJOS P, terceros T, CLIENTES C
            WHERE C.TERC_NIT = T.TERC_NIT AND TERC_CLIE = 'S' AND F.terc_nit = T.terc_nit AND T.TERC_NIT >= :TERINI AND T.TERC_NIT <= :TERFIN AND
            F.FACT_ID = D.FACT_ID AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND FACT_ANULADO = 'N'
            AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY T.TERC_NIT, ARTI_COD
            INTO :NIT, :NOMBRE, :TELEFONO, :CIUDAD, :CODZONA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :TOTAL
            DO
            BEGIN
            SELECT ZONA_NOM FROM ZONAS WHERE ZONA_COD = :CODZONA INTO :NOMZONA;
            SELECT ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                FROM ARTICULO WHERE ARTI_COD = :ARTICULO
                INTO :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC;
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            EXECUTE PROCEDURE costo_promedio (:ARTICULO, :FECFIN) RETURNING_VALUES (:COSTOUNIT);
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            COSTO = CANTIDAD * COSTOUNIT;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            if (CEROS = 'S') then
                INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (3, USER, :ARTICULO);
            SUSPEND;
            END  $$IBE$$*/ /* FOR */ /*$$IBE$$ 
        if (CEROS = 'S') then
            BEGIN
            COSTO = 0;
            UTILIDAD = 0;
            PORC = 0;
             $$IBE$$*/ /* agregue los articulos sin factura */ /*$$IBE$$ 
            FOR SELECT ARTI_COD, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN
                INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                DO
                BEGIN
                SELECT COUNT(REPA_ARTICULO) FROM REPORTES_AUX WHERE REPA_ID = 3 AND REPA_USER = USER AND REPA_ARTICULO = :articulo INTO :numrows;
                if (numrows = 0) then
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        END
    if (BIN_AND(TIPO, 2) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 32 INTO :NOMTIPO;
         $$IBE$$*/ /* BORRA LA TABLA AUXILIAR */ /*$$IBE$$ 
        DELETE FROM reportes_aux WHERE REPA_ID = 3 AND REPA_USER = USER;

        FOR SELECT MAX(T.TERC_NIT), MAX(TERC_NOM), MAX(TERC_TEL), MAX(TERC_CIU), MAX(ZONA_COD), MAX(ARTI_COD), SUM(RVDE_CANT * RVDE_FACTOR), SUM(RVDE_TOTAL-RVDE_IVAMONTO-RVDE_CONSUMO), SUM(RVDE_IVAMONTO), SUM(RVDE_TOTAL)
            FROM REMISIONES_VENTA_DETALLE D, REMISIONES_VENTA R, PREFIJOS P, terceros T, CLIENTES C
            WHERE C.TERC_NIT = T.TERC_NIT AND TERC_CLIE = 'S' AND R.terc_nit = T.terc_nit AND T.TERC_NIT >= :TERINI AND T.TERC_NIT <= :TERFIN AND
            R.REVT_ID = D.REVT_ID AND REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN AND REVT_ANULADO = 'N'
            AND P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = 32 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY T.TERC_NIT, ARTI_COD
            INTO :NIT, :NOMBRE, :TELEFONO, :CIUDAD, :CODZONA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :TOTAL
            DO
                BEGIN
                SELECT ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO WHERE ARTI_COD = :ARTICULO
                    INTO :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC;
                SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                EXECUTE PROCEDURE costo_promedio (:ARTICULO, :FECFIN) RETURNING_VALUES (:COSTOUNIT);
                if (CANTIDAD IS NULL) then
                    CANTIDAD = 0;
                if (BASE IS NULL) then
                    BASE = 0;
                if (IVA IS NULL) then
                    IVA = 0;
                COSTO = CANTIDAD * COSTOUNIT;
                UTILIDAD = BASE - COSTO;
                if (UOM = 'UTILIDAD') then
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                else
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            if (CEROS = 'S') then
                INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (3, USER, :ARTICULO);
            SUSPEND;
            END  $$IBE$$*/ /* FOR */ /*$$IBE$$ 
        if (CEROS = 'S') then
            BEGIN
            COSTO = 0;
            UTILIDAD = 0;
            PORC = 0;
             $$IBE$$*/ /* agregue los articulos sin factura */ /*$$IBE$$ 
            FOR SELECT ARTI_COD, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN
                INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                DO
                BEGIN
                SELECT COUNT(REPA_ARTICULO) FROM REPORTES_AUX WHERE REPA_ID = 3 AND REPA_USER = USER AND REPA_ARTICULO = :articulo INTO :numrows;
                if (numrows = 0) then
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        END
    if (BIN_AND(TIPO, 4) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 33 INTO :NOMTIPO;
         $$IBE$$*/ /* BORRA LA TABLA AUXILIAR */ /*$$IBE$$ 
        DELETE FROM reportes_aux WHERE REPA_ID = 3 AND REPA_USER = USER;

        FOR SELECT MAX(T.TERC_NIT), MAX(TERC_NOM), MAX(TERC_TEL), MAX(TERC_CIU), MAX(ZONA_COD), MAX(ARTI_COD), SUM(DVDE_CANT * DVDE_FACTOR), SUM(DEVT_FACTOR*(DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO)),
            SUM(DEVT_FACTOR*DVDE_IVAMONTO), SUM(DEVT_FACTOR*DVDE_TOTAL)
            FROM devoluciones_ventas_detalle D, DEVOLUCIONES_VENTAS V, PREFIJOS P, terceros T, CLIENTES C
            WHERE C.TERC_NIT = T.TERC_NIT AND TERC_CLIE = 'S' AND V.terc_nit = T.terc_nit AND T.TERC_NIT >= :TERINI AND T.TERC_NIT <= :TERFIN AND
            V.DEVT_ID = D.DEVT_ID AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND DEVT_ANULADO = 'N'
            AND P.PREF_PRE = V.PREF_PRE AND P.TIDO_COD = 33 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY T.TERC_NIT, ARTI_COD
            INTO :NIT, :NOMBRE, :TELEFONO, :CIUDAD, :CODZONA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :TOTAL
            DO
            BEGIN
            SELECT ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                FROM ARTICULO WHERE ARTI_COD = :ARTICULO
                INTO :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC;
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            EXECUTE PROCEDURE costo_promedio (:ARTICULO, :FECFIN) RETURNING_VALUES (:COSTOUNIT);
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            COSTO = CANTIDAD * COSTOUNIT;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            TOTAL = TOTAL * -1;
            IVA = IVA * -1;
            BASE = BASE * -1;
            CANTIDAD = CANTIDAD * -1;
            COSTO = COSTO * -1;
            UTILIDAD = UTILIDAD * -1;
            if (CEROS = 'S') then
                INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (3, USER, :ARTICULO);
            SUSPEND;
            END  $$IBE$$*/ /* FOR */ /*$$IBE$$ 
        if (CEROS = 'S') then
            BEGIN
            COSTO = 0;
            UTILIDAD = 0;
            PORC = 0;
             $$IBE$$*/ /* agregue los articulos sin factura */ /*$$IBE$$ 
            FOR SELECT ARTI_COD, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN
                INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                DO
                BEGIN
                SELECT COUNT(REPA_ARTICULO) FROM REPORTES_AUX WHERE REPA_ID = 3 AND REPA_USER = USER AND REPA_ARTICULO = :articulo INTO :numrows;
                if (numrows = 0) then
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        END
    if (BIN_AND(TIPO, 8) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 34 INTO :NOMTIPO;
         $$IBE$$*/ /* BORRA LA TABLA AUXILIAR */ /*$$IBE$$ 
        DELETE FROM reportes_aux WHERE REPA_ID = 3 AND REPA_USER = USER;

        FOR SELECT MAX(T.TERC_NIT), MAX(TERC_NOM), MAX(TERC_TEL), MAX(TERC_CIU), MAX(ZONA_COD), MAX(ARTI_COD), SUM(PEDE_CANT * PEDE_FACTOR), SUM(PEDI_FACTOR*(PEDE_TOTAL-PEDE_IVAMONTO-PEDE_CONSUMO)),
            SUM(PEDI_FACTOR*PEDE_IVAMONTO), SUM(PEDI_FACTOR*PEDE_TOTAL)
            FROM PEDIDOS_DETALLE D, PEDIDOS P, PREFIJOS PR, terceros T, CLIENTES C
            WHERE C.TERC_NIT = T.TERC_NIT AND TERC_CLIE = 'S' AND P.terc_nit = T.terc_nit AND T.TERC_NIT >= :TERINI AND T.TERC_NIT <= :TERFIN AND
            P.PEDI_ID = D.PEDI_ID AND PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND PEDI_ANULADO = 'N'
            AND PR.PREF_PRE = P.PREF_PRE AND P.TIDO_COD = 34 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY T.TERC_NIT, ARTI_COD
            INTO :NIT, :NOMBRE, :TELEFONO, :CIUDAD, :CODZONA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :TOTAL
            DO
            BEGIN
            SELECT ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                FROM ARTICULO WHERE ARTI_COD = :ARTICULO
                INTO :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC;
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            EXECUTE PROCEDURE costo_promedio (:ARTICULO, :FECFIN) RETURNING_VALUES (:COSTOUNIT);
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            COSTO = CANTIDAD * COSTOUNIT;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            if (CEROS = 'S') then
                INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (3, USER, :ARTICULO);
            SUSPEND;
            END  $$IBE$$*/ /* FOR */ /*$$IBE$$ 
        if (CEROS = 'S') then
            BEGIN
            COSTO = 0;
            UTILIDAD = 0;
            PORC = 0;
             $$IBE$$*/ /* agregue los articulos sin factura */ /*$$IBE$$ 
            FOR SELECT ARTI_COD, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN
                INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                DO
                BEGIN
                SELECT COUNT(REPA_ARTICULO) FROM REPORTES_AUX WHERE REPA_ID = 3 AND REPA_USER = USER AND REPA_ARTICULO = :articulo INTO :numrows;
                if (numrows = 0) then
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        END
    if (BIN_AND(TIPO, 16) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 35 INTO :NOMTIPO;
         $$IBE$$*/ /* BORRA LA TABLA AUXILIAR */ /*$$IBE$$ 
        DELETE FROM reportes_aux WHERE REPA_ID = 3 AND REPA_USER = USER;

        FOR SELECT MAX(T.TERC_NIT), MAX(TERC_NOM), MAX(TERC_TEL), MAX(TERC_CIU), MAX(ZONA_COD), MAX(ARTI_COD), SUM(CTDE_CANT * CTDE_FACTOR), SUM(COTI_FACTOR*(CTDE_TOTAL-CTDE_IVAMONTO-CTDE_CONSUMO)),
            SUM(COTI_FACTOR*CTDE_IVAMONTO), SUM(COTI_FACTOR*CTDE_TOTAL)
            FROM COTIZACIONES_DETALLE D, COTIZACIONES CT, PREFIJOS P, terceros T, CLIENTES C
            WHERE C.TERC_NIT = T.TERC_NIT AND TERC_CLIE = 'S' AND C.terc_nit = T.terc_nit AND T.TERC_NIT >= :TERINI AND T.TERC_NIT <= :TERFIN AND
            CT.COTI_ID = D.COTI_ID AND COTI_FECHA >= :FECINI AND COTI_FECHA <= :FECFIN AND COTI_ANULADO = 'N'
            AND P.PREF_PRE = CT.PREF_PRE AND P.TIDO_COD = 35 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY T.TERC_NIT, ARTI_COD
            INTO :NIT, :NOMBRE, :TELEFONO, :CIUDAD, :CODZONA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :TOTAL
            DO
            BEGIN
            SELECT ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                FROM ARTICULO WHERE ARTI_COD = :ARTICULO
                INTO :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC;
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            EXECUTE PROCEDURE costo_promedio (:ARTICULO, :FECFIN) RETURNING_VALUES (:COSTOUNIT);
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            COSTO = CANTIDAD * COSTOUNIT;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            if (CEROS = 'S') then
                INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (3, USER, :ARTICULO);
            SUSPEND;
            END  $$IBE$$*/ /* FOR */ /*$$IBE$$ 
        if (CEROS = 'S') then
            BEGIN
            COSTO = 0;
            UTILIDAD = 0;
            PORC = 0;
             $$IBE$$*/ /* agregue los articulos sin factura */ /*$$IBE$$ 
            FOR SELECT ARTI_COD, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN
                INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                DO
                BEGIN
                SELECT COUNT(REPA_ARTICULO) FROM REPORTES_AUX WHERE REPA_ID = 3 AND REPA_USER = USER AND REPA_ARTICULO = :articulo INTO :numrows;
                if (numrows = 0) then
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        END
    END
ELSE
    BEGIN
    if (BIN_AND(TIPO, 1) <> 0) then
            BEGIN
            SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 31 INTO :NOMTIPO;
            FOR SELECT F.PREF_PRE, FACT_NUMERO, FACT_FECHA, ARTI_COD, FADE_CANT * FADE_FACTOR, (FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO)*FACT_FACTOR,
                FADE_IVAMONTO*FACT_FACTOR, FADE_DTOPORC, FADE_TOTAL*FACT_FACTOR, F.terc_nit, F.fact_nomcliente
                FROM FACTURAS F, FACTURAS_DETALLE D, PREFIJOS P
                WHERE F.FACT_ID = D.FACT_ID AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND F.TERC_NIT >= :TERINI AND F.TERC_NIT <= :TERFIN AND FACT_ANULADO = 'N'
                 AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                ORDER BY f.terc_nit, ARTI_COD, FACT_FECHA, F.FACT_ID, FADE_ITEM
                INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :DTO, :TOTAL, :NIT, :nombre
                DO
                BEGIN
                SELECT ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO WHERE ARTI_COD = :ARTICULO
                    INTO :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC;
                SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                EXECUTE PROCEDURE costo_promedio (:ARTICULO, :FECHA) RETURNING_VALUES (:COSTOUNIT);
                COSTO = COSTOUNIT * CANTIDAD;
                UTILIDAD = BASE - COSTO;
                if (UOM = 'UTILIDAD') then
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                else
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
                SUSPEND;
                END
            END
    if (BIN_AND(TIPO, 2) <> 0) then
            BEGIN
            SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 32 INTO :NOMTIPO;
            FOR SELECT R.PREF_PRE, REVT_NUMERO, REVT_FECHA, ARTI_COD, RVDE_CANT * RVDE_FACTOR,
                (RVDE_TOTAL - RVDE_IVAMONTO), RVDE_IVAMONTO, RVDE_DTOPORC, RVDE_TOTAL, R.terc_nit, R.revt_nomterc
                FROM REMISIONES_VENTA R, REMISIONES_VENTA_DETALLE D, PREFIJOS P
                WHERE R.REVT_ID = D.REVT_ID AND REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN AND R.TERC_NIT >= :TERINI AND R.TERC_NIT <= :TERFIN AND REVT_ANULADO = 'N'
                 AND P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = 32 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                ORDER BY r.terc_nit, ARTI_COD, REVT_FECHA, R.REVT_ID, RVDE_ITEM
                INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :DTO, :TOTAL, :NIT, :nombre
                DO
                BEGIN
                SELECT ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO WHERE ARTI_COD = :ARTICULO
                    INTO :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC;
                SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                EXECUTE PROCEDURE costo_promedio (:ARTICULO, :FECHA) RETURNING_VALUES (:COSTOUNIT);
                COSTO = COSTOUNIT * CANTIDAD;
                UTILIDAD = BASE - COSTO;
                if (UOM = 'UTILIDAD') then
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                else
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
                SUSPEND;
                END
            END
    if (BIN_AND(TIPO, 4) <> 0) then
            BEGIN
            SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 33 INTO :NOMTIPO;
            FOR SELECT V.PREF_PRE, DEVT_NUMERO, DEVT_FECHA, ARTI_COD, DVDE_CANT * DVDE_FACTOR, (DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO)*DEVT_FACTOR,
                DVDE_IVAMONTO*DEVT_FACTOR, DVDE_DTOPORC, DVDE_TOTAL*DEVT_FACTOR, V.terc_nit, V.devt_nomterc
                FROM DEVOLUCIONES_VENTAS V, DEVOLUCIONES_VENTAS_DETALLE D, PREFIJOS P
                WHERE V.DEVT_ID = D.DEVT_ID AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND V.TERC_NIT >= :TERINI AND V.TERC_NIT <= :TERFIN AND DEVT_ANULADO = 'N'
                 AND P.PREF_PRE = V.PREF_PRE AND P.TIDO_COD = 33 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                ORDER BY v.terc_nit, ARTI_COD, DEVT_FECHA, D.DEVT_ID, DVDE_ITEM
                INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :DTO, :TOTAL, :NIT, :nombre
                DO
                BEGIN
                SELECT ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO WHERE ARTI_COD = :ARTICULO
                    INTO :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC;
                SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                EXECUTE PROCEDURE costo_promedio (:ARTICULO, :FECHA) RETURNING_VALUES (:COSTOUNIT);
                COSTO = COSTOUNIT * CANTIDAD;
                UTILIDAD = BASE - COSTO;
                if (UOM = 'UTILIDAD') then
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                else
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
                TOTAL = TOTAL * -1;
                IVA = IVA * -1;
                BASE = BASE * -1;
                CANTIDAD = CANTIDAD * -1;
                COSTO = COSTO * -1;
                UTILIDAD = UTILIDAD * -1;
                SUSPEND;
                END
            END
    if (BIN_AND(TIPO, 8) <> 0) then
            BEGIN
            SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 34 INTO :NOMTIPO;
            FOR SELECT P.PREF_PRE, PEDI_NUMERO, PEDI_FECHA, ARTI_COD, PEDE_CANT * PEDE_FACTOR, (PEDE_TOTAL-PEDE_IVAMONTO-PEDE_CONSUMO)*PEDI_FACTOR,
                PEDE_IVAMONTO*PEDI_FACTOR, PEDE_DTOPORC, PEDE_TOTAL*PEDI_FACTOR, P.terc_nit, P.pedi_nomterc
                FROM PEDIDOS P, PEDIDOS_DETALLE D, PREFIJOS PR
                WHERE P.PEDI_ID = D.PEDI_ID AND PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND P.TERC_NIT >= :TERINI AND P.TERC_NIT <= :TERFIN AND PEDI_ANULADO = 'N'
                 AND P.PREF_PRE = PR.PREF_PRE AND P.TIDO_COD = 34 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                ORDER BY p.terc_nit, ARTI_COD, PEDI_FECHA, P.PEDI_ID, PEDE_ITEM
                INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :DTO, :TOTAL, :NIT, :nombre
                DO
                BEGIN
                SELECT ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO WHERE ARTI_COD = :ARTICULO
                    INTO :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC;
                SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                EXECUTE PROCEDURE costo_promedio (:ARTICULO, :FECHA) RETURNING_VALUES (:COSTOUNIT);
                COSTO = COSTOUNIT * CANTIDAD;
                UTILIDAD = BASE - COSTO;
                if (UOM = 'UTILIDAD') then
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                else
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
                SUSPEND;
                END
            END
    if (BIN_AND(TIPO, 16) <> 0) then
            BEGIN
            SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 35 INTO :NOMTIPO;
            FOR SELECT C.PREF_PRE, COTI_NUMERO, COTI_FECHA, ARTI_COD, CTDE_CANT * CTDE_FACTOR, (CTDE_TOTAL-CTDE_IVAMONTO-CTDE_CONSUMO)*COTI_FACTOR,
                CTDE_IVAMONTO*COTI_FACTOR, CTDE_DTOPORC, CTDE_TOTAL*COTI_FACTOR, C.terc_nit, C.coti_nomterc
                FROM COTIZACIONES C, COTIZACIONES_DETALLE D, PREFIJOS P
                WHERE C.COTI_ID = D.COTI_ID AND ARTI_COD = :ARTICULO AND COTI_FECHA >= :FECINI AND COTI_FECHA <= :FECFIN AND C.TERC_NIT >= :TERINI AND C.TERC_NIT <= :TERFIN AND COTI_ANULADO = 'N'
                 AND P.PREF_PRE = C.PREF_PRE AND P.TIDO_COD = 35 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                ORDER BY c.terc_nit, COTI_FECHA, C.COTI_ID, CTDE_ITEM
                INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :DTO, :TOTAL, :NIT, :nombre
                DO
                BEGIN
                SELECT ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO WHERE ARTI_COD = :ARTICULO
                    INTO :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC;
                SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                EXECUTE PROCEDURE costo_promedio (:ARTICULO, :FECHA) RETURNING_VALUES (:COSTOUNIT);
                COSTO = COSTOUNIT * CANTIDAD;
                UTILIDAD = BASE - COSTO;
                if (UOM = 'UTILIDAD') then
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                else
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
                SUSPEND;
                END
            END
    END
 $$IBE$$*/ SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE REP_UTILIDAD_VENDEDOR(
    TIPO INTEGER,
    DETALLE CHAR(1),
    VENINI VARCHAR(20),
    VENFIN VARCHAR(20),
    FECINI DATE,
    FECFIN DATE,
    ARTINI VARCHAR(15),
    ARTFIN VARCHAR(15),
    ORDEN CHAR(1),
    CEROS CHAR(1),
    SUBEMPRESA INTEGER)
RETURNS (
    CODVEND VARCHAR(20),
    NOMVEND VARCHAR(60),
    NOMTIPO VARCHAR(50),
    ARTICULO VARCHAR(15),
    DESCRIPCION VARCHAR(60),
    CODGRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    CODSUBG VARCHAR(3),
    NOMSUBG VARCHAR(30),
    CODMARC VARCHAR(3),
    NOMMARC VARCHAR(30),
    UNIDAD VARCHAR(8),
    CANTIDAD NUMERIC(18,4),
    BASE NUMERIC(18,2),
    IVA NUMERIC(18,2),
    CONSUMO NUMERIC(18,2),
    COSTO NUMERIC(18,2),
    UTILIDAD NUMERIC(18,4),
    PORC NUMERIC(9,2),
    TOTAL NUMERIC(18,2),
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    DTO NUMERIC(9,2))
AS
DECLARE VARIABLE COSTOUNIT NUMERIC(18,4);
DECLARE VARIABLE CODINI VARCHAR(15);
DECLARE VARIABLE CODFIN VARCHAR(15);
DECLARE VARIABLE DESINI VARCHAR(15);
DECLARE VARIABLE DESFIN VARCHAR(15);
declare variable UOM VARCHAR(20);
BEGIN /*$$IBE$$ 
if (ORDEN = 'C') then
    BEGIN
    CODINI = ARTINI;
    CODFIN = ARTFIN;
    DESINI = '';
    DESFIN = 'zz';
    END
ELSE
    BEGIN
    DESINI = ARTINI;
    DESFIN = ARTFIN;
    CODINI = '';
    CODFIN = 'zz';
    END
  EXECUTE PROCEDURE lee_configuracion ('FACTURACION', 'ARTICULOS', 'SUGERIR PRECIOS CON PORCENTAJE DE MARGEN O UTILIDAD') returning_values (:UOM);
  SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = :TIPO INTO :NOMTIPO;
  FOR select VEND_COD, VEND_NOMBRE
    from VENDEDORES
    where VEND_COD >= :VENINI AND VEND_COD <= :VENFIN
    INTO :CODVEND, :NOMVEND
    DO  
    BEGIN
    if (DETALLE = 'N') then
        BEGIN
        if (BIN_AND(TIPO, 1) <> 0) then
            BEGIN
            SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 31 INTO :NOMTIPO;
             $$IBE$$*/ /* BORRA LA TABLA AUXILIAR */ /*$$IBE$$ 
            DELETE FROM reportes_aux WHERE REPA_ID = 4 AND REPA_USER = USER;
            FOR SELECT MAX(ARTI_COD), SUM(FADE_CANT * FADE_FACTOR), SUM(FACT_FACTOR*(FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO)),
                SUM(FACT_FACTOR*FADE_IVAMONTO), SUM(FACT_FACTOR*FADE_TOTAL), SUM(FADE_CONSUMO)
                FROM FACTURAS_DETALLE D, FACTURAS F, PREFIJOS P
                WHERE F.FACT_ID = D.FACT_ID AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND VEND_COD = :CODVEND AND FACT_ANULADO = 'N'
                 AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                GROUP BY ARTI_COD
                INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :TOTAL, :CONSUMO
                DO
                BEGIN
                SELECT ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO WHERE ARTI_COD = :ARTICULO
                    INTO :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC;
                SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                EXECUTE PROCEDURE costo_promedio (:ARTICULO, :FECFIN) RETURNING_VALUES (:COSTOUNIT);
                if (CANTIDAD IS NULL) then
                    CANTIDAD = 0;
                if (BASE IS NULL) then
                    BASE = 0;
                if (IVA IS NULL) then
                    IVA = 0;
                COSTO = CANTIDAD * COSTOUNIT;
                UTILIDAD = BASE - COSTO;
                if (UOM = 'UTILIDAD') then
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                else
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
                if (CEROS = 'S') then
                    begin
                    INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (4, USER, :ARTICULO);
                    SUSPEND;
                    end
                ELSE
                    if ((BASE <> 0) AND (CANTIDAD <> 0)) then
                        SUSPEND;
                END
            if (CEROS = 'S') then
                BEGIN
                COSTO = 0;
                UTILIDAD = 0;
                PORC = 0;
                 $$IBE$$*/ /* agregue los articulos sin factura */ /*$$IBE$$ 
                FOR SELECT ARTI_COD, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN and
                    not exists (select REPA_ARTICULO FROM REPORTES_AUX WHERE REPA_ID = 4 AND REPA_USER = USER AND REPA_ARTICULO = a.arti_cod)
                    INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                    DO
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        if (BIN_AND(TIPO, 2) <> 0) then
            BEGIN
            SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 32 INTO :NOMTIPO;
            FOR SELECT MAX(ARTI_COD), SUM(RVDE_CANT * RVDE_FACTOR), SUM(RVDE_TOTAL-RVDE_IVAMONTO-RVDE_CONSUMO), SUM(RVDE_IVAMONTO), SUM(RVDE_TOTAL), SUM(RVDE_CONSUMO)
                FROM REMISIONES_VENTA_DETALLE D, REMISIONES_VENTA R, PREFIJOS P
                WHERE R.REVT_ID = D.REVT_ID AND REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN AND VEND_COD = :CODVEND AND REVT_ANULADO = 'N'
                 AND P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = 32 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                GROUP BY ARTI_COD
                INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :TOTAL, :CONSUMO
                DO
                BEGIN
                SELECT ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO WHERE ARTI_COD = :ARTICULO
                    INTO :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC;
                SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                EXECUTE PROCEDURE costo_promedio (:ARTICULO, :FECFIN) RETURNING_VALUES (:COSTOUNIT);
                if (CANTIDAD IS NULL) then
                    CANTIDAD = 0;
                if (BASE IS NULL) then
                    BASE = 0;
                if (IVA IS NULL) then
                    IVA = 0;
                COSTO = CANTIDAD * COSTOUNIT;
                UTILIDAD = BASE - COSTO;
                if (UOM = 'UTILIDAD') then
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                else
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
                if (CEROS = 'S') then
                    begin
                    INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (4, USER, :ARTICULO);
                    SUSPEND;
                    end
                ELSE
                    if ((BASE <> 0) AND (CANTIDAD <> 0)) then
                        SUSPEND;
                END
            if (CEROS = 'S') then
                BEGIN
                COSTO = 0;
                UTILIDAD = 0;
                PORC = 0;
                 $$IBE$$*/ /* agregue los articulos sin factura */ /*$$IBE$$ 
                FOR SELECT ARTI_COD, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN and
                    not exists (select REPA_ARTICULO FROM REPORTES_AUX WHERE REPA_ID = 4 AND REPA_USER = USER AND REPA_ARTICULO = a.arti_cod)
                    INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                    DO
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        if (BIN_AND(TIPO, 4) <> 0) then
            BEGIN
            SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 33 INTO :NOMTIPO;
            FOR SELECT MAX(ARTI_COD), SUM(DVDE_CANT * DVDE_FACTOR), SUM(DEVT_FACTOR*(DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO)),
                SUM(DEVT_FACTOR*DVDE_IVAMONTO), SUM(DEVT_FACTOR*DVDE_TOTAL), SUM(DVDE_CONSUMO)
                FROM devoluciones_ventas_detalle D, DEVOLUCIONES_VENTAS V, PREFIJOS P
                WHERE V.DEVT_ID = D.DEVT_ID AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND VEND_COD = :CODVEND AND DEVT_ANULADO = 'N'
                 AND P.PREF_PRE = V.PREF_PRE AND P.TIDO_COD = 33 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                GROUP BY ARTI_COD
                INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :TOTAL, :CONSUMO
                DO
                BEGIN
                SELECT ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO WHERE ARTI_COD = :ARTICULO
                    INTO :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC;
                SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                EXECUTE PROCEDURE costo_promedio (:ARTICULO, :FECFIN) RETURNING_VALUES (:COSTOUNIT);
                if (CANTIDAD IS NULL) then
                    CANTIDAD = 0;
                if (BASE IS NULL) then
                    BASE = 0;
                if (IVA IS NULL) then
                    IVA = 0;
                COSTO = CANTIDAD * COSTOUNIT;
                UTILIDAD = BASE - COSTO;
                if (UOM = 'UTILIDAD') then
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                else
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
                TOTAL = TOTAL * -1;
                IVA = IVA * -1;
                BASE = BASE * -1;
                CANTIDAD = CANTIDAD * -1;
                COSTO = COSTO * -1;
                UTILIDAD = UTILIDAD * -1;
                if (CEROS = 'S') then
                    begin
                    INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (4, USER, :ARTICULO);
                    SUSPEND;
                    end
                ELSE
                    if ((BASE <> 0) AND (CANTIDAD <> 0)) then
                        SUSPEND;
                END
            if (CEROS = 'S') then
                BEGIN
                COSTO = 0;
                UTILIDAD = 0;
                PORC = 0;
                 $$IBE$$*/ /* agregue los articulos sin factura */ /*$$IBE$$ 
                FOR SELECT ARTI_COD, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN and
                    not exists (select REPA_ARTICULO FROM REPORTES_AUX WHERE REPA_ID = 4 AND REPA_USER = USER AND REPA_ARTICULO = a.arti_cod)
                    INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                    DO
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        if (BIN_AND(TIPO, 8) <> 0) then
            BEGIN
            SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 34 INTO :NOMTIPO;
            FOR SELECT MAX(ARTI_COD), SUM(PEDE_CANT * PEDE_FACTOR), SUM(PEDI_FACTOR*(PEDE_TOTAL-PEDE_IVAMONTO-PEDE_CONSUMO)),
                SUM(PEDI_FACTOR*PEDE_IVAMONTO), SUM(PEDI_FACTOR*PEDE_TOTAL), SUM(PEDE_CONSUMO)
                FROM PEDIDOS_DETALLE D, PEDIDOS P, PREFIJOS PR
                WHERE P.PEDI_ID = D.PEDI_ID AND PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND VEND_COD = :CODVEND AND PEDI_ANULADO = 'N'
                 AND PR.PREF_PRE = P.PREF_PRE AND P.TIDO_COD = 34 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                GROUP BY ARTI_COD
                INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :TOTAL, :CONSUMO
                DO
                BEGIN
                SELECT ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO WHERE ARTI_COD = :ARTICULO
                    INTO :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC;
                SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                EXECUTE PROCEDURE costo_promedio (:ARTICULO, :FECFIN) RETURNING_VALUES (:COSTOUNIT);
                if (CANTIDAD IS NULL) then
                    CANTIDAD = 0;
                if (BASE IS NULL) then
                    BASE = 0;
                if (IVA IS NULL) then
                    IVA = 0;
                COSTO = CANTIDAD * COSTOUNIT;
                UTILIDAD = BASE - COSTO;
                if (UOM = 'UTILIDAD') then
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                else
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
                if (CEROS = 'S') then
                    begin
                    INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (4, USER, :ARTICULO);
                    SUSPEND;
                    end
                ELSE
                    if ((BASE <> 0) AND (CANTIDAD <> 0)) then
                        SUSPEND;
                END
            if (CEROS = 'S') then
                BEGIN
                COSTO = 0;
                UTILIDAD = 0;
                PORC = 0;
                 $$IBE$$*/ /* agregue los articulos sin factura */ /*$$IBE$$ 
                FOR SELECT ARTI_COD, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN and
                    not exists (select REPA_ARTICULO FROM REPORTES_AUX WHERE REPA_ID = 4 AND REPA_USER = USER AND REPA_ARTICULO = a.arti_cod)
                    INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                    DO
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        if (BIN_AND(TIPO, 16) <> 0) then
            BEGIN
            SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 35 INTO :NOMTIPO;
            FOR SELECT MAX(ARTI_COD), SUM(CTDE_CANT * CTDE_FACTOR), SUM(COTI_FACTOR*(CTDE_TOTAL-CTDE_IVAMONTO-CTDE_CONSUMO)),
                SUM(COTI_FACTOR*CTDE_IVAMONTO), SUM(COTI_FACTOR*CTDE_TOTAL), SUM(CTDE_CONSUMO)
                FROM COTIZACIONES_DETALLE D, COTIZACIONES C, PREFIJOS P
                WHERE C.COTI_ID = D.COTI_ID AND COTI_FECHA >= :FECINI AND COTI_FECHA <= :FECFIN AND VEND_COD = :CODVEND AND COTI_ANULADO = 'N'
                 AND P.PREF_PRE = C.PREF_PRE AND P.TIDO_COD = 35 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                GROUP BY ARTI_COD
                INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :TOTAL, :CONSUMO
                DO
                BEGIN
                SELECT ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO WHERE ARTI_COD = :ARTICULO
                    INTO :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC;
                SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                EXECUTE PROCEDURE costo_promedio (:ARTICULO, :FECFIN) RETURNING_VALUES (:COSTOUNIT);
                if (CANTIDAD IS NULL) then
                    CANTIDAD = 0;
                if (BASE IS NULL) then
                    BASE = 0;
                if (IVA IS NULL) then
                    IVA = 0;
                COSTO = CANTIDAD * COSTOUNIT;
                UTILIDAD = BASE - COSTO;
                if (UOM = 'UTILIDAD') then
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                else
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
                if (CEROS = 'S') then
                    begin
                    INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (4, USER, :ARTICULO);
                    SUSPEND;
                    end
                ELSE
                    if ((BASE <> 0) AND (CANTIDAD <> 0)) then
                        SUSPEND;
                END
            if (CEROS = 'S') then
                BEGIN
                COSTO = 0;
                UTILIDAD = 0;
                PORC = 0;
                 $$IBE$$*/ /* agregue los articulos sin factura */ /*$$IBE$$ 
                FOR SELECT ARTI_COD, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN and
                    not exists (select REPA_ARTICULO FROM REPORTES_AUX WHERE REPA_ID = 4 AND REPA_USER = USER AND REPA_ARTICULO = a.arti_cod)
                    INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                    DO
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        END
    ELSE
        BEGIN
        if (BIN_AND(TIPO, 1) <> 0) then
            BEGIN
            SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 31 INTO :NOMTIPO;
            FOR SELECT F.PREF_PRE, FACT_NUMERO, FACT_FECHA, ARTI_COD, FADE_CANT * FADE_FACTOR, (FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO)*FACT_FACTOR,
                FADE_IVAMONTO*FACT_FACTOR, FADE_DTOPORC, FADE_TOTAL*FACT_FACTOR, FADE_CONSUMO
                FROM FACTURAS F, FACTURAS_DETALLE D, PREFIJOS P
                WHERE F.FACT_ID = D.FACT_ID AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND VEND_COD = :CODVEND AND FACT_ANULADO = 'N'
                 AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                ORDER BY ARTI_COD, FACT_FECHA, F.FACT_ID, FADE_ITEM
                INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :DTO, :TOTAL, :CONSUMO
                DO
                BEGIN
                SELECT ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO WHERE ARTI_COD = :ARTICULO
                    INTO :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC;
                SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                EXECUTE PROCEDURE costo_promedio (:ARTICULO, :FECHA) RETURNING_VALUES (:COSTOUNIT);
                COSTO = COSTOUNIT * CANTIDAD;
                UTILIDAD = BASE - COSTO;
                if (UOM = 'UTILIDAD') then
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                else
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
                if (CEROS = 'S') then
                    INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (4, USER, :ARTICULO);
                SUSPEND;
                END
            if (CEROS = 'S') then
                BEGIN
                COSTO = 0;
                UTILIDAD = 0;
                PORC = 0;
                 $$IBE$$*/ /* agregue los articulos sin factura */ /*$$IBE$$ 
                FOR SELECT ARTI_COD, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN and
                    not exists (select REPA_ARTICULO FROM REPORTES_AUX WHERE REPA_ID = 4 AND REPA_USER = USER AND REPA_ARTICULO = a.arti_cod)
                    INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                    DO
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        if (BIN_AND(TIPO, 2) <> 0) then
            BEGIN
            SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 32 INTO :NOMTIPO;
            FOR SELECT R.PREF_PRE, REVT_NUMERO, REVT_FECHA, ARTI_COD, RVDE_CANT * RVDE_FACTOR, (RVDE_TOTAL - RVDE_IVAMONTO), RVDE_IVAMONTO, RVDE_DTOPORC, RVDE_TOTAL, RVDE_CONSUMO
                FROM REMISIONES_VENTA R, REMISIONES_VENTA_DETALLE D, PREFIJOS P
                WHERE R.REVT_ID = D.REVT_ID AND REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN AND VEND_COD = :CODVEND AND REVT_ANULADO = 'N'
                 AND P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = 32 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                ORDER BY ARTI_COD, REVT_FECHA, R.REVT_ID, RVDE_ITEM
                INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :DTO, :TOTAL, :CONSUMO
                DO
                BEGIN
                SELECT ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO WHERE ARTI_COD = :ARTICULO
                    INTO :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC;
                SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                EXECUTE PROCEDURE costo_promedio (:ARTICULO, :FECHA) RETURNING_VALUES (:COSTOUNIT);
                COSTO = COSTOUNIT * CANTIDAD;
                UTILIDAD = BASE - COSTO;
                if (UOM = 'UTILIDAD') then
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                else
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
                if (CEROS = 'S') then
                    INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (4, USER, :ARTICULO);
                SUSPEND;
                END
            if (CEROS = 'S') then
                BEGIN
                COSTO = 0;
                UTILIDAD = 0;
                PORC = 0;
                 $$IBE$$*/ /* agregue los articulos sin factura */ /*$$IBE$$ 
                FOR SELECT ARTI_COD, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN and
                    not exists (select REPA_ARTICULO FROM REPORTES_AUX WHERE REPA_ID = 4 AND REPA_USER = USER AND REPA_ARTICULO = a.arti_cod)
                    INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                    DO
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        if (BIN_AND(TIPO, 4) <> 0) then
            BEGIN
            SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 33 INTO :NOMTIPO;
            FOR SELECT V.PREF_PRE, DEVT_NUMERO, DEVT_FECHA, ARTI_COD, DVDE_CANT * DVDE_FACTOR, (DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO)*DEVT_FACTOR,
                DVDE_IVAMONTO*DEVT_FACTOR, DVDE_DTOPORC, DVDE_TOTAL*DEVT_FACTOR, DVDE_CONSUMO
                FROM DEVOLUCIONES_VENTAS V, DEVOLUCIONES_VENTAS_DETALLE D, PREFIJOS P
                WHERE V.DEVT_ID = D.DEVT_ID AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND VEND_COD = :CODVEND AND DEVT_ANULADO = 'N'
                 AND P.PREF_PRE = V.PREF_PRE AND P.TIDO_COD = 33 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                ORDER BY ARTI_COD, DEVT_FECHA, D.DEVT_ID, DVDE_ITEM
                INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :DTO, :TOTAL, :CONSUMO
                DO
                BEGIN
                SELECT ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO WHERE ARTI_COD = :ARTICULO
                    INTO :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC;
                SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                EXECUTE PROCEDURE costo_promedio (:ARTICULO, :FECHA) RETURNING_VALUES (:COSTOUNIT);
                COSTO = COSTOUNIT * CANTIDAD;
                UTILIDAD = BASE - COSTO;
                if (UOM = 'UTILIDAD') then
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                else
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
                TOTAL = TOTAL * -1;
                IVA = IVA * -1;
                BASE = BASE * -1;
                CANTIDAD = CANTIDAD * -1;
                COSTO = COSTO * -1;
                UTILIDAD = UTILIDAD * -1;
                if (CEROS = 'S') then
                    INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (4, USER, :ARTICULO);
                SUSPEND;
                END
            if (CEROS = 'S') then
                BEGIN
                COSTO = 0;
                UTILIDAD = 0;
                PORC = 0;
                 $$IBE$$*/ /* agregue los articulos sin factura */ /*$$IBE$$ 
                FOR SELECT ARTI_COD, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN and
                    not exists (select REPA_ARTICULO FROM REPORTES_AUX WHERE REPA_ID = 4 AND REPA_USER = USER AND REPA_ARTICULO = a.arti_cod)
                    INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                    DO
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        if (BIN_AND(TIPO, 8) <> 0) then
            BEGIN
            SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 34 INTO :NOMTIPO;
            FOR SELECT P.PREF_PRE, PEDI_NUMERO, PEDI_FECHA, ARTI_COD, PEDE_CANT * PEDE_FACTOR, (PEDE_TOTAL-PEDE_IVAMONTO-PEDE_CONSUMO)*PEDI_FACTOR,
                PEDE_IVAMONTO*PEDI_FACTOR, PEDE_DTOPORC, PEDE_TOTAL*PEDI_FACTOR, PEDE_CONSUMO
                FROM PEDIDOS P, PEDIDOS_DETALLE D, PREFIJOS PR
                WHERE P.PEDI_ID = D.PEDI_ID AND PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND VEND_COD = :CODVEND AND PEDI_ANULADO = 'N'
                 AND P.PREF_PRE = PR.PREF_PRE AND P.TIDO_COD = 34 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                ORDER BY ARTI_COD, PEDI_FECHA, P.PEDI_ID, PEDE_ITEM
                INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :DTO, :TOTAL, :CONSUMO
                DO
                BEGIN
                SELECT ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO WHERE ARTI_COD = :ARTICULO
                    INTO :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC;
                SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                EXECUTE PROCEDURE costo_promedio (:ARTICULO, :FECHA) RETURNING_VALUES (:COSTOUNIT);
                COSTO = COSTOUNIT * CANTIDAD;
                UTILIDAD = BASE - COSTO;
                if (UOM = 'UTILIDAD') then
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                else
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
                if (CEROS = 'S') then
                    INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (4, USER, :ARTICULO);
                SUSPEND;
                END
            if (CEROS = 'S') then
                BEGIN
                COSTO = 0;
                UTILIDAD = 0;
                PORC = 0;
                 $$IBE$$*/ /* agregue los articulos sin factura */ /*$$IBE$$ 
                FOR SELECT ARTI_COD, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN and
                    not exists (select REPA_ARTICULO FROM REPORTES_AUX WHERE REPA_ID = 4 AND REPA_USER = USER AND REPA_ARTICULO = a.arti_cod)
                    INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                    DO
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        if (BIN_AND(TIPO, 16) <> 0) then
            BEGIN
            SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 35 INTO :NOMTIPO;
            FOR SELECT C.PREF_PRE, COTI_NUMERO, COTI_FECHA, ARTI_COD, CTDE_CANT * CTDE_FACTOR, (CTDE_TOTAL-CTDE_IVAMONTO-CTDE_CONSUMO)*COTI_FACTOR,
                CTDE_IVAMONTO*COTI_FACTOR, CTDE_DTOPORC, CTDE_TOTAL*COTI_FACTOR, CTDE_CONSUMO
                FROM COTIZACIONES C, COTIZACIONES_DETALLE D, PREFIJOS P
                WHERE C.COTI_ID = D.COTI_ID AND ARTI_COD = :ARTICULO AND COTI_FECHA >= :FECINI AND COTI_FECHA <= :FECFIN AND VEND_COD = :CODVEND AND COTI_ANULADO = 'N'
                 AND P.PREF_PRE = C.PREF_PRE AND P.TIDO_COD = 35 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                ORDER BY COTI_FECHA, C.COTI_ID, CTDE_ITEM
                INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :DTO, :TOTAL, :CONSUMO
                DO
                BEGIN
                SELECT ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO WHERE ARTI_COD = :ARTICULO
                    INTO :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC;
                SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                EXECUTE PROCEDURE costo_promedio (:ARTICULO, :FECHA) RETURNING_VALUES (:COSTOUNIT);
                COSTO = COSTOUNIT * CANTIDAD;
                UTILIDAD = BASE - COSTO;
                if (UOM = 'UTILIDAD') then
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                else
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
                if (CEROS = 'S') then
                    INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (4, USER, :ARTICULO);
                SUSPEND;
                END
            if (CEROS = 'S') then
                BEGIN
                COSTO = 0;
                UTILIDAD = 0;
                PORC = 0;
                 $$IBE$$*/ /* agregue los articulos sin factura */ /*$$IBE$$ 
                FOR SELECT ARTI_COD, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN and
                    not exists (select REPA_ARTICULO FROM REPORTES_AUX WHERE REPA_ID = 4 AND REPA_USER = USER AND REPA_ARTICULO = a.arti_cod)
                    INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                    DO
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        END
    END
 $$IBE$$*/ SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE REP_UTILIDAD_VENTAS(
    TIPO INTEGER,
    DETALLE CHAR(1),
    FECINI DATE,
    FECFIN DATE,
    ARTINI VARCHAR(15),
    ARTFIN VARCHAR(15),
    GRPINI VARCHAR(3),
    GRPFIN VARCHAR(3),
    ORDEN CHAR(1),
    AGRUPA CHAR(1),
    CEROS CHAR(1),
    EQUILIBRIO CHAR(1),
    SUBEMPRESA INTEGER)
RETURNS (
    ARTICULO VARCHAR(15),
    DESCRIPCION VARCHAR(60),
    CODGRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    CODSUBG VARCHAR(3),
    NOMSUBG VARCHAR(30),
    CODMARC VARCHAR(3),
    NOMMARC VARCHAR(30),
    UNIDAD VARCHAR(8),
    CANTIDAD NUMERIC(18,4),
    BASE NUMERIC(18,4),
    COSTO NUMERIC(18,4),
    UTILIDAD NUMERIC(18,4),
    PORC NUMERIC(9,2),
    IVA NUMERIC(18,4),
    CONSUMO NUMERIC(18,4),
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    TIPODOC INTEGER)
AS
DECLARE VARIABLE COSTOUNIT NUMERIC(18,4);
declare variable CODINI VARCHAR(15);
declare variable CODFIN VARCHAR(15);
declare variable DESINI VARCHAR(15);
declare variable DESFIN VARCHAR(15);
declare variable MARINI VARCHAR(3);
declare variable MARFIN VARCHAR(3);
declare variable UOM VARCHAR(20);
declare variable NUMROWS INTEGER;
declare variable TOTAL NUMERIC(18,2);
declare variable CUENTA VARCHAR(20);
declare variable SECC INTEGER;
declare variable DB CHAR(1);
declare variable FECCNT VARCHAR(8);
declare variable FIJOS NUMERIC(18,2);
declare variable VARIA NUMERIC(18,2);
declare variable SALDO NUMERIC(18,2);
BEGIN /*$$IBE$$ 
if (ORDEN = 'C') then
    BEGIN
    CODINI = ARTINI;
    CODFIN = ARTFIN;
    DESINI = '';
    DESFIN = 'zz';
    END
ELSE
    BEGIN
    DESINI = ARTINI;
    DESFIN = ARTFIN;
    CODINI = '';
    CODFIN = 'zz';
    END
if (AGRUPA = 'G') then
    BEGIN
    MARINI = '';
    MARFIN = 'zz';
    END
ELSE
    if (AGRUPA = 'M') then
        BEGIN
        MARINI = GRPINI;
        MARFIN = GRPFIN;
        GRPINI = '';
        GRPFIN = 'zz';
        END
    ELSE
        BEGIN
        MARINI = '';
        MARFIN = 'zz';
        GRPINI = '';
        GRPFIN = 'zz';
        END
EXECUTE PROCEDURE lee_configuracion ('FACTURACION', 'ARTICULOS', 'SUGERIR PRECIOS CON PORCENTAJE DE MARGEN O UTILIDAD') returning_values (:UOM);
if (DETALLE = 'N') then
    BEGIN
    if (BIN_AND(TIPO, 1) <> 0) then
        BEGIN
        TIPODOC = 31;
         $$IBE$$*/ /* BORRA LA TABLA AUXILIAR */ /*$$IBE$$ 
        DELETE FROM reportes_aux WHERE REPA_ID = 2 AND REPA_USER = USER;
        if (EQUILIBRIO = 'S') then
            BEGIN
            SELECT SUM((FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO)*FACT_FACTOR)
                FROM FACTURAS_DETALLE D, FACTURAS F, PREFIJOS P
                WHERE F.FACT_ID = D.FACT_ID AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND 
                FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND
                FACT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                INTO :TOTAL;

            execute PROCEDURE fecha_a_conta (:FECFIN) returning_values (:FECCNT);
            FIJOS = 0;
            FOR SELECT PTEQ_CUENTA, PTEQ_DB FROM PUNTO_EQUILIBRIO WHERE PTEQ_SECC = 1 INTO :CUENTA, :DB
                DO
                BEGIN
                 $$IBE$$*/ /* CALCULE EL SALDO DE LA CUENTA */ /*$$IBE$$ 
                EXECUTE PROCEDURE saldo_cuenta (CUENTA, :FECCNT) returning_values (:SALDO);
                if (DB = 'S') then
                    FIJOS = FIJOS + SALDO;
                ELSE
                    FIJOS = FIJOS - SALDO;
                END
            VARIA = 0;
            FOR SELECT PTEQ_CUENTA, PTEQ_DB FROM PUNTO_EQUILIBRIO WHERE PTEQ_SECC = 2 INTO :CUENTA, :DB
                DO
                BEGIN
                 $$IBE$$*/ /* CALCULE EL SALDO DE LA CUENTA */ /*$$IBE$$ 
                EXECUTE PROCEDURE saldo_cuenta (CUENTA, :FECCNT) returning_values (:SALDO);
                if (DB = 'S') then
                    VARIA = VARIA + SALDO;
                ELSE
                    VARIA = VARIA - SALDO;
                END
            END

        FOR SELECT MAX(D.ARTI_COD), SUM(FADE_CANT * FADE_FACTOR), SUM((FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO)*FACT_FACTOR), SUM(FADE_IVAMONTO*FACT_FACTOR), SUM(FADE_CONSUMO),
            MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD), SUM(COST_SALP)
            FROM FACTURAS_DETALLE D, FACTURAS F, PREFIJOS P, ARTICULO A, movimiento_articulo m, costos c
            WHERE F.FACT_ID = D.FACT_ID AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND D.ARTI_COD = A.arti_cod AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            F.fact_id = M.mvar_idref AND M.mvar_tipodoc = 31 AND M.mvar_item = D.fade_item AND M.mvar_cons = C.cost_idmov AND
            FACT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY D.ARTI_COD
            INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,
            :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :COSTO
            DO
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
 $$IBE$$*/ /*            EXECUTE PROCEDURE costo_promedio (:ARTICULO, :FECFIN) RETURNING_VALUES (:COSTOUNIT);*/ /*$$IBE$$ 
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
 $$IBE$$*/ /*            COSTO = cantidad * COSTOUNIT;*/ /*$$IBE$$ 
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                if (COSTO > 0) then
                    PORC = UTILIDAD * 100 / COSTO;
                ELSE
                    PORC = 100;
            else
                if (BASE > 0) then
                    PORC = UTILIDAD * 100 / BASE;
                ELSE
                    PORC = 0;
            if (CEROS = 'S') then
                INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (2, USER, :ARTICULO);
            SUSPEND;
            END  $$IBE$$*/ /* FOR */ /*$$IBE$$ 
        if (CEROS = 'S') then
            BEGIN
            COSTO = 0;
            UTILIDAD = 0;
            PORC = 0;
             $$IBE$$*/ /* agregue los articulos sin factura */ /*$$IBE$$ 
            FOR SELECT ARTI_COD, 0, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND
                    A.ARTI_DES <= :DESFIN AND A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND
                    (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN)))
                INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,:DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                DO
                BEGIN
                SELECT COUNT(REPA_ARTICULO) FROM REPORTES_AUX WHERE REPA_ID = 2 AND REPA_USER = USER AND REPA_ARTICULO = :articulo INTO :numrows;
                if (numrows = 0) then
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        END
    if (BIN_AND(TIPO, 2) <> 0) then
        BEGIN
        TIPODOC = 32;
         $$IBE$$*/ /* BORRA LA TABLA AUXILIAR */ /*$$IBE$$ 
        DELETE FROM reportes_aux WHERE REPA_ID = 2 AND REPA_USER = USER;

        FOR SELECT MAX(D.ARTI_COD), SUM(RVDE_CANT * RVDE_FACTOR), SUM(RVDE_TOTAL-RVDE_IVAMONTO-RVDE_CONSUMO), SUM(RVDE_IVAMONTO), SUM(RVDE_CONSUMO),
            MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD), SUM(COST_SALP)
            FROM REMISIONES_VENTA_DETALLE D, REMISIONES_VENTA R, PREFIJOS P, ARTICULO A, movimiento_articulo m, costos c
            WHERE R.REVT_ID = D.REVT_ID AND P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = 32 AND D.ARTI_COD = A.arti_cod AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            R.revt_id = M.mvar_idref AND M.mvar_tipodoc = 32 AND M.mvar_item = D.rvde_item AND M.mvar_cons = C.cost_idmov AND
            REVT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY D.ARTI_COD
            INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,
            :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :COSTO
            DO
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
 $$IBE$$*/ /*            EXECUTE PROCEDURE costo_promedio (:ARTICULO, :FECFIN) RETURNING_VALUES (:COSTOUNIT); */
/*            COSTO = cantidad * COSTOUNIT;*/ /*$$IBE$$ 
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                if (COSTO > 0) then
                    PORC = UTILIDAD * 100 / COSTO;
                ELSE
                    PORC = 100;
            else
                if (BASE > 0) then
                    PORC = UTILIDAD * 100 / BASE;
                ELSE
                    PORC = 0;
            if (CEROS = 'S') then
                INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (2, USER, :ARTICULO);
            SUSPEND;
            END  $$IBE$$*/ /* FOR */ /*$$IBE$$ 
        if (CEROS = 'S') then
            BEGIN
            COSTO = 0;
            UTILIDAD = 0;
            PORC = 0;
             $$IBE$$*/ /* agregue los articulos sin factura */ /*$$IBE$$ 
            FOR SELECT ARTI_COD, 0, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND
                    A.ARTI_DES <= :DESFIN AND A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND
                    (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN)))
                INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,:DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                DO
                BEGIN
                SELECT COUNT(REPA_ARTICULO) FROM REPORTES_AUX WHERE REPA_ID = 2 AND REPA_USER = USER AND REPA_ARTICULO = :articulo INTO :numrows;
                if (numrows = 0) then
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        END
    if (BIN_AND(TIPO, 4) <> 0) then
        BEGIN
        TIPODOC = 33;
         $$IBE$$*/ /* BORRA LA TABLA AUXILIAR */ /*$$IBE$$ 
        DELETE FROM reportes_aux WHERE REPA_ID = 2 AND REPA_USER = USER;

        FOR SELECT MAX(D.ARTI_COD), SUM(DVDE_CANT * DVDE_FACTOR), SUM((DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO)*DEVT_FACTOR), SUM(DVDE_IVAMONTO*DEVT_FACTOR), SUM(DVDE_CONSUMO),
            MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD), SUM(COST_ENTP)
            FROM devoluciones_ventas_detalle D, DEVOLUCIONES_VENTAS V, PREFIJOS P, ARTICULO A, MOVIMIENTO_ARTICULO M, COSTOS C
            WHERE V.DEVT_ID = D.DEVT_ID AND P.PREF_PRE = V.PREF_PRE AND P.TIDO_COD = 33 AND D.ARTI_COD = A.arti_cod AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            V.devt_id = M.mvar_idref AND M.mvar_tipodoc = 33 AND M.mvar_item = D.dvde_item AND M.mvar_cons = C.cost_idmov AND
            DEVT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY D.ARTI_COD
            INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,
            :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :COSTO
            DO
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            else
                CANTIDAD = CANTIDAD * -1;
            if (BASE IS NULL) then
                BASE = 0;
            else
                BASE = BASE * -1;
            if (IVA IS NULL) then
                IVA = 0;
            else
                IVA = IVA * -1;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            else
                CONSUMO = CONSUMO * -1;
 $$IBE$$*/ /*            EXECUTE PROCEDURE costo_promedio (:ARTICULO, :FECFIN) RETURNING_VALUES (:COSTOUNIT);*/
/*            COSTO = cantidad * COSTOUNIT;*/ /*$$IBE$$ 
            COSTO = costo * -1;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                if (COSTO > 0) then
                    PORC = UTILIDAD * 100 / COSTO;
                ELSE
                    PORC = 100;
            else
                if (BASE > 0) then
                    PORC = UTILIDAD * 100 / BASE;
                ELSE
                    PORC = 0;
            if (CEROS = 'S') then
                INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (2, USER, :ARTICULO);
            SUSPEND;
            END  $$IBE$$*/ /* FOR */ /*$$IBE$$ 
        if (CEROS = 'S') then
            BEGIN
            COSTO = 0;
            UTILIDAD = 0;
            PORC = 0;
             $$IBE$$*/ /* agregue los articulos sin factura */ /*$$IBE$$ 
            FOR SELECT ARTI_COD, 0, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND
                    A.ARTI_DES <= :DESFIN AND A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND
                    (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN)))
                INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,:DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                DO
                BEGIN
                SELECT COUNT(REPA_ARTICULO) FROM REPORTES_AUX WHERE REPA_ID = 2 AND REPA_USER = USER AND REPA_ARTICULO = :articulo INTO :numrows;
                if (numrows = 0) then
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        END
    if (BIN_AND(TIPO, 8) <> 0) then
        BEGIN
        TIPODOC = 34;
         $$IBE$$*/ /* BORRA LA TABLA AUXILIAR */ /*$$IBE$$ 
        DELETE FROM reportes_aux WHERE REPA_ID = 2 AND REPA_USER = USER;

        FOR SELECT MAX(D.ARTI_COD), SUM(PEDE_CANT * PEDE_FACTOR), SUM((PEDE_TOTAL-PEDE_IVAMONTO-PEDE_CONSUMO)*PEDI_FACTOR), SUM(PEDE_IVAMONTO*PEDI_FACTOR), SUM(PEDE_CONSUMO),
            MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD)
            FROM PEDIDOS_DETALLE D, PEDIDOS P, PREFIJOS R, ARTICULO A
            WHERE P.PEDI_ID = D.PEDI_ID AND P.PREF_PRE = R.PREF_PRE AND R.TIDO_COD = 34 AND D.ARTI_COD = A.arti_cod AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            PEDI_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY D.ARTI_COD
            INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,
            :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
            DO
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            EXECUTE PROCEDURE costo_promedio (:ARTICULO, :FECFIN) RETURNING_VALUES (:COSTOUNIT);
            COSTO = cantidad * COSTOUNIT;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                if (COSTO > 0) then
                    PORC = UTILIDAD * 100 / COSTO;
                ELSE
                    PORC = 100;
            else
                if (BASE > 0) then
                    PORC = UTILIDAD * 100 / BASE;
                ELSE
                    PORC = 0;
            if (CEROS = 'S') then
                INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (2, USER, :ARTICULO);
            SUSPEND;
            END  $$IBE$$*/ /* FOR */ /*$$IBE$$ 
        if (CEROS = 'S') then
            BEGIN
            COSTO = 0;
            UTILIDAD = 0;
            PORC = 0;
             $$IBE$$*/ /* agregue los articulos sin factura */ /*$$IBE$$ 
            FOR SELECT ARTI_COD, 0, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND
                    A.ARTI_DES <= :DESFIN AND A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND
                    (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN)))
                INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,:DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                DO
                BEGIN
                SELECT COUNT(REPA_ARTICULO) FROM REPORTES_AUX WHERE REPA_ID = 2 AND REPA_USER = USER AND REPA_ARTICULO = :articulo INTO :numrows;
                if (numrows = 0) then
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        END
    if (BIN_AND(TIPO, 16) <> 0) then
        BEGIN
        TIPODOC = 35;
         $$IBE$$*/ /* BORRA LA TABLA AUXILIAR */ /*$$IBE$$ 
        DELETE FROM reportes_aux WHERE REPA_ID = 2 AND REPA_USER = USER;

        FOR SELECT MAX(D.ARTI_COD), SUM(CTDE_CANT * CTDE_FACTOR), SUM((CTDE_TOTAL-CTDE_IVAMONTO-CTDE_CONSUMO)*COTI_FACTOR), SUM(CTDE_IVAMONTO), SUM(CTDE_CONSUMO),
            MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD)
            FROM COTIZACIONES_DETALLE D, COTIZACIONES C, PREFIJOS P, ARTICULO A
            WHERE C.COTI_ID = D.COTI_ID AND P.PREF_PRE = C.PREF_PRE AND P.TIDO_COD = 35 AND D.ARTI_COD = A.arti_cod AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND COTI_FECHA >= :FECINI AND COTI_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            COTI_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY D.ARTI_COD
            INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,
            :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
            DO
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            EXECUTE PROCEDURE costo_promedio (:ARTICULO, :FECFIN) RETURNING_VALUES (:COSTOUNIT);
            COSTO = cantidad * COSTOUNIT;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                if (COSTO > 0) then
                    PORC = UTILIDAD * 100 / COSTO;
                ELSE
                    PORC = 100;
            else
                if (BASE > 0) then
                    PORC = UTILIDAD * 100 / BASE;
                ELSE
                    PORC = 0;
            if (CEROS = 'S') then
                INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (2, USER, :ARTICULO);
            SUSPEND;
            END  $$IBE$$*/ /* FOR */ /*$$IBE$$ 
        if (CEROS = 'S') then
            BEGIN
            COSTO = 0;
            UTILIDAD = 0;
            PORC = 0;
             $$IBE$$*/ /* agregue los articulos sin factura */ /*$$IBE$$ 
            FOR SELECT ARTI_COD, 0, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND
                    A.ARTI_DES <= :DESFIN AND A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND
                    (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN)))
                INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,:DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                DO
                BEGIN
                SELECT COUNT(REPA_ARTICULO) FROM REPORTES_AUX WHERE REPA_ID = 2 AND REPA_USER = USER AND REPA_ARTICULO = :articulo INTO :numrows;
                if (numrows = 0) then
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        END
    END
ELSE
    BEGIN
    if (BIN_AND(TIPO, 1) <> 0) then
        BEGIN
        TIPODOC = 31;
        FOR SELECT F.PREF_PRE, FACT_NUMERO, FACT_FECHA, D.ARTI_COD, FADE_CANT * FADE_FACTOR, (FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO)*FACT_FACTOR, FADE_IVAMONTO*FACT_FACTOR, FADE_CONSUMO,
            ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD, COST_SALP
            FROM FACTURAS F, FACTURAS_DETALLE D, PREFIJOS P, ARTICULO A, MOVIMIENTO_ARTICULO M, COSTOS C
            WHERE F.FACT_ID = D.FACT_ID AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND D.ARTI_COD = A.arti_cod AND
                A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
                A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND FACT_FECHA >= :FECINI AND
                (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
                F.fact_id = M.mvar_idref AND M.mvar_tipodoc = 31 AND M.mvar_item = D.fade_item AND M.mvar_cons = C.cost_idmov AND
                FACT_FECHA <= :FECFIN AND FACT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            ORDER BY D.ARTI_COD, FACT_FECHA, F.FACT_ID, FADE_ITEM
            INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,
                :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :COSTO
            DO
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
 $$IBE$$*/ /*            EXECUTE PROCEDURE costo_promedio (:ARTICULO, :FECHA) RETURNING_VALUES (:COSTOUNIT);*/
/*            COSTO = COSTOUNIT * CANTIDAD;*/ /*$$IBE$$ 
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                if (COSTO > 0) then
                    PORC = UTILIDAD * 100 / COSTO;
                ELSE
                    PORC = 100;
            else
                if (BASE > 0) then
                    PORC = UTILIDAD * 100 / BASE;
                ELSE
                    PORC = 0;
            SUSPEND;
            END
        END
    if (BIN_AND(TIPO, 2) <> 0) then
        BEGIN
        TIPODOC = 32;
        FOR SELECT R.PREF_PRE, REVT_NUMERO, REVT_FECHA, D.ARTI_COD, RVDE_CANT * RVDE_FACTOR, RVDE_TOTAL-RVDE_IVAMONTO-RVDE_CONSUMO, RVDE_IVAMONTO, RVDE_CONSUMO,
            ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD, COST_SALP
            FROM REMISIONES_VENTA R, REMISIONES_VENTA_DETALLE D, PREFIJOS P, ARTICULO A, MOVIMIENTO_ARTICULO M, COSTOS C
            WHERE R.REVT_ID = D.REVT_ID AND P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = 32 AND D.ARTI_COD = A.arti_cod AND
                A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
                A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN AND
                R.revt_id = M.mvar_idref AND M.mvar_tipodoc = 32 AND M.mvar_item = D.rvde_item AND M.mvar_cons = C.cost_idmov AND
                (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
                REVT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            ORDER BY D.ARTI_COD, REVT_FECHA, R.REVT_ID, RVDE_ITEM
            INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,
                :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :COSTO
            DO
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            EXECUTE PROCEDURE costo_promedio (:ARTICULO, :FECHA) RETURNING_VALUES (:COSTOUNIT);
            COSTO = COSTOUNIT * CANTIDAD;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                if (COSTO > 0) then
                    PORC = UTILIDAD * 100 / COSTO;
                ELSE
                    PORC = 100;
            else
                if (BASE > 0) then
                    PORC = UTILIDAD * 100 / BASE;
                ELSE
                    PORC = 0;
            SUSPEND;
            END
        END
    if (BIN_AND(TIPO, 4) <> 0) then
        BEGIN
        TIPODOC = 33;
        FOR SELECT V.PREF_PRE, DEVT_NUMERO, DEVT_FECHA, D.ARTI_COD, DVDE_CANT * DVDE_FACTOR, (DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO)*DEVT_FACTOR, DVDE_IVAMONTO*DEVT_FACTOR, DVDE_CONSUMO,
            ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD, COST_ENTP
            FROM DEVOLUCIONES_VENTAS V, DEVOLUCIONES_VENTAS_DETALLE D, PREFIJOS P, ARTICULO A, MOVIMIENTO_ARTICULO M, COSTOS C
            WHERE V.DEVT_ID = D.DEVT_ID AND P.PREF_PRE = V.PREF_PRE AND P.TIDO_COD = 33 AND D.ARTI_COD = A.arti_cod AND
                A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
                A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND
                (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
                V.devt_id = M.mvar_idref AND M.mvar_tipodoc = 33 AND M.mvar_item = D.dvde_item AND M.mvar_cons = C.cost_idmov AND
                DEVT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            ORDER BY D.ARTI_COD, DEVT_FECHA, V.DEVT_ID, DVDE_ITEM
            INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,
                :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :COSTO
            DO
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            EXECUTE PROCEDURE costo_promedio (:ARTICULO, :FECHA) RETURNING_VALUES (:COSTOUNIT);
            BASE = BASE * -1;
            CANTIDAD = CANTIDAD * -1;
            IVA = IVA * -1;
            CONSUMO = CONSUMO * -1;
            COSTO = COSTOUNIT * CANTIDAD;
            COSTO = COSTO * -1;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                if (COSTO > 0) then
                    PORC = UTILIDAD * 100 / COSTO;
                ELSE
                    PORC = 100;
            else
                if (BASE > 0) then
                    PORC = UTILIDAD * 100 / BASE;
                ELSE
                    PORC = 0;
            SUSPEND;
            END
        END
    if (BIN_AND(TIPO, 8) <> 0) then
        BEGIN
        TIPODOC = 34;
        FOR SELECT P.PREF_PRE, PEDI_NUMERO, PEDI_FECHA, D.ARTI_COD, PEDE_CANT * PEDE_FACTOR, (PEDE_TOTAL-PEDE_IVAMONTO-PEDE_CONSUMO)*PEDI_FACTOR, PEDE_IVAMONTO*PEDI_FACTOR, PEDE_CONSUMO,
            ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD 
            FROM PEDIDOS P, PEDIDOS_DETALLE D, PREFIJOS R, ARTICULO A
            WHERE P.PEDI_ID = D.PEDI_ID AND P.PREF_PRE = R.PREF_PRE AND R.TIDO_COD = 34 AND D.ARTI_COD = A.arti_cod AND
                A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
                A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND
                (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
                PEDI_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            ORDER BY D.ARTI_COD, PEDI_FECHA, P.PEDI_ID, PEDE_ITEM
            INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,
                :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
            DO
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            EXECUTE PROCEDURE costo_promedio (:ARTICULO, :FECHA) RETURNING_VALUES (:COSTOUNIT);
            COSTO = COSTOUNIT * CANTIDAD;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                if (COSTO > 0) then
                    PORC = UTILIDAD * 100 / COSTO;
                ELSE
                    PORC = 100;
            else
                if (BASE > 0) then
                    PORC = UTILIDAD * 100 / BASE;
                ELSE
                    PORC = 0;
            SUSPEND;
            END
        END
    if (BIN_AND(TIPO, 16) <> 0) then
        BEGIN
        TIPODOC = 35;
        FOR SELECT C.PREF_PRE, COTI_NUMERO, COTI_FECHA, D.ARTI_COD, CTDE_CANT * CTDE_FACTOR, (CTDE_TOTAL-CTDE_IVAMONTO-CTDE_CONSUMO)*COTI_FACTOR, CTDE_IVAMONTO*COTI_FACTOR, CTDE_CONSUMO,
            ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD 
            FROM COTIZACIONES C, COTIZACIONES_DETALLE D, PREFIJOS P, ARTICULO A
            WHERE C.COTI_ID = D.COTI_ID AND P.PREF_PRE = C.PREF_PRE AND P.TIDO_COD = 35 AND D.ARTI_COD = A.arti_cod AND
                A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
                A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND COTI_FECHA >= :FECINI AND COTI_FECHA <= :FECFIN AND
                (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
                COTI_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            ORDER BY D.ARTI_COD, COTI_FECHA, C.COTI_ID, CTDE_ITEM
            INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,
                :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
            DO
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            EXECUTE PROCEDURE costo_promedio (:ARTICULO, :FECHA) RETURNING_VALUES (:COSTOUNIT);
            COSTO = COSTOUNIT * CANTIDAD;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                if (COSTO > 0) then
                    PORC = UTILIDAD * 100 / COSTO;
                ELSE
                    PORC = 100;
            else
                if (BASE > 0) then
                    PORC = UTILIDAD * 100 / BASE;
                ELSE
                    PORC = 0;
            SUSPEND;
            END
        END
    END
 $$IBE$$*/ SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

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

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE REVISA_PRECIOS(
    LISTA INTEGER,
    FECHA DATE)
RETURNS (
    ARTICULO VARCHAR(20),
    DESCR VARCHAR(60),
    FIJO NUMERIC(18,2),
    UNIDAD VARCHAR(8),
    PORC NUMERIC(9,4),
    SUGERIDO NUMERIC(18,2),
    DIFER NUMERIC(18,2),
    NUEVO NUMERIC(18,2),
    OK CHAR(1))
AS
declare variable marg numeric(9,4);
declare variable UOM VARCHAR(10);
declare variable BASE VARCHAR(10);
declare variable CAMBIO VARCHAR(10);
declare variable COSTO numeric(18,2);
declare variable COSTOP numeric(18,2);
declare variable COSTOU numeric(18,2);
declare variable DIFMAX numeric(18,2);
declare variable DIG INTEGER;
declare variable TARIVA NUMERIC(9,4);
declare variable IVAINC CHAR(1);
declare variable LISTAREF INTEGER;
begin /*$$IBE$$ 
execute procedure lee_configuracion ('FACTURACION', 'ARTICULOS', 'SUGERIR PRECIOS CON PORCENTAJE DE MARGEN O UTILIDAD') returning_values (:UOM);
EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION', 'ARTICULOS', 'REDONDEO AL MULTIPLO DE DIEZ EN PRECIOS') RETURNING_VALUES (:DIG);
EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION','ARTICULOS','CAMBIO DE PRECIOS AUTOMATICO AL CAMBIAR COSTO O PRECIO') returning_values (CAMBIO);
EXECUTE PROCEDURE lee_configuracion('FACTURACION','ARTICULOS','COSTO BASE PARA CALCULO DE PRECIOS DE VENTA AUTOMATICOS') returning_values (:BASE);
EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION','ARTICULOS','CODIGO DE LA LISTA DE PRECIOS BASE PARA CAMBIO DE PRECIOS AUTOMATICO') returning_values (LISTAREF);
EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION','ARTICULOS','DIFERENCIA EN PESOS MAXIMA A PERMITIR PARA CAMBIAR PRECIOS') returning_values (DIFMAX);
for select A.arti_cod, A.arti_des, A.arti_unidad, prar_fijo, prar_margen, prar_util, TAIV_PORC
    from precios_articulo p, articulo a, tarifa_iva T
    where a.arti_cod = p.arti_cod and lipr_cod = :lista and a.taiv_cod = t.taiv_cod order by A.arti_cod
    into :articulo, descr, :unidad, :fijo, :marg, :porc, :tariva
    do
    begin
    if (UOM <> 'UTILIDAD') then
        PORC = MARG;
    if (CAMBIO = 'COSTO') then
        BEGIN
        EXECUTE PROCEDURE COSTO_PROMEDIO (:ARTICULO, :FECHA) RETURNING_VALUES(:COSTOP);
        EXECUTE PROCEDURE ULTIMO_COSTO (:ARTICULO, :FECHA, :UNIDAD) RETURNING_VALUES(:COSTOU);
        if (base = 'ULTIMO') then
            COSTO = COSTOU;
        ELSE
            BEGIN
            COSTO = COSTOP;
            if (base = 'MAYOR') then
                if (COSTOP < COSTOU) then
                    COSTO = COSTOU;
            END
        SELECT LIPR_MODIF FROM LISTA_PRECIOS WHERE LIPR_COD = :lista INTO :IVAINC;
        if (IVAINC = 'S') then
            COSTO = COSTO * (1 + TARIVA/100);
        if (UOM = 'UTILIDAD') then
            SUGERIDO = COSTO * (1 + :PORC/100);
        ELSE
            SUGERIDO = COSTO / (1 - :PORC/100);
        END
    ELSE
        if (LISTA <> LISTAREF) then
            BEGIN
            SELECT PRAR_FIJO FROM PRECIOS_ARTICULO WHERE ARTI_COD = :articulo AND LIPR_COD = :LISTAREF INTO :SUGERIDO;
            if (IVAINC = 'S') then
                SUGERIDO = SUGERIDO / (1 + TARIVA/100);
            if (UOM = 'UTILIDAD') then
                SUGERIDO = SUGERIDO * (1 + :PORC/100);
            ELSE
                SUGERIDO = SUGERIDO / (1 - :PORC/100);
            END
    EXECUTE PROCEDURE REDONDEE (SUGERIDO, DIG) returning_values (SUGERIDO);
    DIFER = SUGERIDO - FIJO;
    NUEVO = SUGERIDO;
    OK = 'S';
    if ((DIFER > DIFMAX) and (sugerido <> 0)) then
        suspend;
    end
 $$IBE$$*/ SUSPEND;
end
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE UTILIDAD_VENTAS(
    TIPO INTEGER,
    DETALLE CHAR(1),
    FECINI DATE,
    FECFIN DATE,
    PREFIJO VARCHAR(4),
    SUBEMPRESA INTEGER)
RETURNS (
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    PTVTID INTEGER,
    VENDCOD INTEGER,
    NIT VARCHAR(20),
    NOMTERCERO VARCHAR(60),
    ARTICULO VARCHAR(15),
    ARTIDES VARCHAR(60),
    CANT NUMERIC(18,4),
    UNIDAD VARCHAR(8),
    PRECIO NUMERIC(18,2),
    COSTO NUMERIC(18,2),
    UTILIDAD NUMERIC(18,2),
    PORC NUMERIC(9,2))
AS
declare variable IMPTOS CHAR(1);
declare variable ID INTEGER;
declare variable IVA NUMERIC(18,2);
declare variable COSTOT NUMERIC(18,2);
declare variable PRECIOT NUMERIC(18,2);
declare variable UOM VARCHAR(20);
BEGIN /*$$IBE$$ 
EXECUTE PROCEDURE lee_configuracion ('FACTURACION', 'ARTICULOS', 'SUGERIR PRECIOS CON PORCENTAJE DE MARGEN O UTILIDAD') returning_values (:UOM);
 $$IBE$$*/ /* DETERMINE LA TABLA A EXAMINAR */ /*$$IBE$$ 
if (TIPO = 31) then
    BEGIN
     $$IBE$$*/ /* FACTURA */ /*$$IBE$$ 
    FOR SELECT FACT_ID, F.PREF_PRE, FACT_NUMERO, FACT_FECHA, PTVT_ID, VEND_COD, TERC_NIT, FACT_NOMCLIENTE, FACT_IVAINC
        FROM FACTURAS F, PREFIJOS P
        WHERE FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND FACT_ANULADO = 'N'
         AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = :TIPO AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
        ORDER BY FACT_FECHA, F.PREF_PRE, FACT_NUMERO
        INTO :ID, :PREF, :NUMERO, :FECHA, :PTVTID, :VENDCOD, :NIT, :NOMTERCERO, :IMPTOS
        DO
        if ((PREFIJO = '') or (PREFIJO = PREF)) then
          BEGIN
          COSTOT = 0;
          PRECIOT = 0;
          FOR SELECT ARTI_COD, SUBSTR(FADE_DESC,1,60), FADE_CANT * FADE_FACTOR, FADE_UNIDAD, (FADE_PRUNIT - FADE_DTOMONTO) / FADE_FACTOR, FADE_IVAMONTO
            FROM FACTURAS_DETALLE
            WHERE FACT_ID = :ID
            INTO :ARTICULO, :ARTIDES, :CANT, :UNIDAD, :PRECIO, :IVA
            DO
                BEGIN
                EXECUTE PROCEDURE COSTO_PROMEDIO(:ARTICULO, :FECHA) returning_values (:COSTO);
                COSTO = COSTO * CANT;
                PRECIO = PRECIO * CANT;
                if (IMPTOS = 'S') then
                    PRECIO = PRECIO - IVA;
                UTILIDAD = PRECIO - COSTO;
                if (DETALLE = 'S') then
                    BEGIN
                    if (UOM = 'UTILIDAD') then
                        EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                    else
                        EXECUTE PROCEDURE PORCENTAJE (utilidad,  PRECIO, 'S') returning_values (PORC);
                    SUSPEND;
                    END
                ELSE
                    BEGIN
                    COSTOT = COSTOT + COSTO;
                    PRECIOT = PRECIOT + PRECIO;
                    END
                END
          if (DETALLE <> 'S') then
            BEGIN
            COSTO = COSTOT;
            PRECIO = PRECIOT;
            UTILIDAD = PRECIO - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  PRECIO, 'S') returning_values (PORC);
            SUSPEND;
            END
          END
    END
  if (TIPO = 32) then
    BEGIN
     $$IBE$$*/ /* REMISION */ /*$$IBE$$ 
    FOR SELECT REVT_ID, R.PREF_PRE, REVT_NUMERO, REVT_FECHA, PTVT_ID, VEND_COD, TERC_NIT, REVT_NOMTERC, REVT_IVAINC
        FROM REMISIONES_VENTA R, PREFIJOS P
        WHERE REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN AND REVT_ANULADO = 'N'
         AND P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = :TIPO AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
        ORDER BY REVT_FECHA, R.PREF_PRE, REVT_NUMERO
        INTO :ID, :PREF, :NUMERO, :FECHA, :PTVTID, :VENDCOD, :NIT, :NOMTERCERO, :IMPTOS
        DO
        if ((PREFIJO = '') or (PREFIJO = PREF)) then
          BEGIN
          COSTOT = 0;
          PRECIOT = 0;
          FOR SELECT ARTI_COD, SUBSTR(RVDE_DESC,1,60), RVDE_CANT * RVDE_FACTOR, RVDE_UNIDAD, (RVDE_PRUNIT - RVDE_DTOMONTO) / RVDE_FACTOR, RVDE_IVAMONTO
            FROM REMISIONES_VENTA_DETALLE
            WHERE REVT_ID = :ID
            INTO :ARTICULO, :ARTIDES, :CANT, :UNIDAD, :PRECIO, :IVA
            DO
                BEGIN
                EXECUTE PROCEDURE COSTO_PROMEDIO(:ARTICULO, :FECHA) returning_values (:COSTO);
                COSTO = COSTO * CANT;
                PRECIO = PRECIO * CANT;
                if (IMPTOS = 'S') then
                    PRECIO = PRECIO - IVA;
                UTILIDAD = PRECIO - COSTO;
                if (DETALLE = 'S') then
                    BEGIN
                    if (UOM = 'UTILIDAD') then
                        EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                    else
                        EXECUTE PROCEDURE PORCENTAJE (utilidad,  PRECIO, 'S') returning_values (PORC);
                    SUSPEND;
                    END
                ELSE
                    BEGIN
                    COSTOT = COSTOT + COSTO;
                    PRECIOT = PRECIOT + PRECIO;
                    END
                END
          if (DETALLE <> 'S') then
            BEGIN
            COSTO = COSTOT;
            PRECIO = PRECIOT;
            UTILIDAD = PRECIO - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  PRECIO, 'S') returning_values (PORC);
            SUSPEND;
            END
          END
    END
  if (TIPO = 33) then
    BEGIN
     $$IBE$$*/ /* DEVOLUCION */ /*$$IBE$$ 
    FOR SELECT DEVT_ID, D.PREF_PRE, DEVT_NUMERO, DEVT_FECHA, PTVT_ID, VEND_COD, TERC_NIT, DEVT_NOMTERC, DEVT_IVAINC
        FROM DEVOLUCIONES_VENTAS D, PREFIJOS P
        WHERE DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND DEVT_ANULADO = 'N'
         AND P.PREF_PRE = D.PREF_PRE AND P.TIDO_COD = :TIPO AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
        ORDER BY DEVT_FECHA, D.PREF_PRE, DEVT_NUMERO
        INTO :ID, :PREF, :NUMERO, :FECHA, :PTVTID, :VENDCOD, :NIT, :NOMTERCERO, :IMPTOS
        DO
        if ((PREFIJO = '') or (PREFIJO = PREF)) then
          BEGIN
          COSTOT = 0;
          PRECIOT = 0;
          FOR SELECT ARTI_COD, SUBSTR(DVDE_DESC,1,60), DVDE_CANT * DVDE_FACTOR, DVDE_UNIDAD, (DVDE_PRUNIT - DVDE_DTOMONTO) / DVDE_FACTOR, DVDE_IVAMONTO
            FROM DEVOLUCIONES_VENTAS_DETALLE
            WHERE DEVT_ID = :ID
            INTO :ARTICULO, :ARTIDES, :CANT, :UNIDAD, :PRECIO, :IVA
            DO
                BEGIN
                EXECUTE PROCEDURE COSTO_PROMEDIO(:ARTICULO, :FECHA) returning_values (:COSTO);
                COSTO = COSTO * CANT;
                PRECIO = PRECIO * CANT;
                if (IMPTOS = 'S') then
                    PRECIO = PRECIO - IVA;
                UTILIDAD = PRECIO - COSTO;
                if (DETALLE = 'S') then
                    BEGIN
                    if (UOM = 'UTILIDAD') then
                        EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                    else
                        EXECUTE PROCEDURE PORCENTAJE (utilidad,  PRECIO, 'S') returning_values (PORC);
                    SUSPEND;
                    END
                ELSE
                    BEGIN
                    COSTOT = COSTOT + COSTO;
                    PRECIOT = PRECIOT + PRECIO;
                    END
                END
        if (DETALLE <> 'S') then
            BEGIN
            COSTO = COSTOT;
            PRECIO = PRECIOT;
            UTILIDAD = PRECIO - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  PRECIO, 'S') returning_values (PORC);
            SUSPEND;
            END
        END
    END
  if (TIPO = 34) then
    BEGIN
     $$IBE$$*/ /* PEDIDO */ /*$$IBE$$ 
    FOR SELECT PEDI_ID, P.PREF_PRE, PEDI_NUMERO, PEDI_FECHA, PTVT_ID, VEND_COD, TERC_NIT, PEDI_NOMTERC, PEDI_IVAINC
        FROM PEDIDOS P, PREFIJOS R
        WHERE PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND PEDI_ANULADO = 'N'
         AND P.PREF_PRE = R.PREF_PRE AND R.TIDO_COD = :TIPO AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
        ORDER BY PEDI_FECHA, P.PREF_PRE, PEDI_NUMERO
        INTO :ID, :PREF, :NUMERO, :FECHA, :PTVTID, :VENDCOD, :NIT, :NOMTERCERO, :IMPTOS
        DO
        if ((PREFIJO = '') or (PREFIJO = PREF)) then
          BEGIN
          COSTOT = 0;
          PRECIOT = 0;
          FOR SELECT ARTI_COD, SUBSTR(PEDE_DESC,1,60), PEDE_CANT * PEDE_FACTOR, PEDE_UNIDAD, (PEDE_PRUNIT - PEDE_DTOMONTO) / PEDE_FACTOR, PEDE_IVAMONTO
            FROM PEDIDOS_DETALLE
            WHERE PEDI_ID = :ID
            INTO :ARTICULO, :ARTIDES, :CANT, :UNIDAD, :PRECIO, :IVA
            DO
                BEGIN
                EXECUTE PROCEDURE COSTO_PROMEDIO(:ARTICULO, :FECHA) returning_values (:COSTO);
                COSTO = COSTO * CANT;
                PRECIO = PRECIO * CANT;
                if (IMPTOS = 'S') then
                    PRECIO = PRECIO - IVA;
                UTILIDAD = PRECIO - COSTO;
                if (DETALLE = 'S') then
                    BEGIN
                    if (UOM = 'UTILIDAD') then
                        EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                    else
                        EXECUTE PROCEDURE PORCENTAJE (utilidad,  PRECIO, 'S') returning_values (PORC);
                    SUSPEND;
                    END
                ELSE
                    BEGIN
                    COSTOT = COSTOT + COSTO;
                    PRECIOT = PRECIOT + PRECIO;
                    END
                END
        if (DETALLE <> 'S') then
            BEGIN
            COSTO = COSTOT;
            PRECIO = PRECIOT;
            UTILIDAD = PRECIO - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  PRECIO, 'S') returning_values (PORC);
            SUSPEND;
            END
        END
    END
  if (TIPO = 35) then
    BEGIN
     $$IBE$$*/ /* COTIZACION */ /*$$IBE$$ 
    FOR SELECT COTI_ID, C.PREF_PRE, COTI_NUMERO, COTI_FECHA, PTVT_ID, VEND_COD, TERC_NIT, COTI_NOMTERC, COTI_IMPTOS
        FROM COTIZACIONES C, PREFIJOS P
        WHERE COTI_FECHA >= :FECINI AND COTI_FECHA <= :FECFIN AND COTI_ANULADO = 'N'
         AND P.PREF_PRE = C.PREF_PRE AND P.TIDO_COD = :TIPO AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
        ORDER BY COTI_FECHA, C.PREF_PRE, COTI_NUMERO
        INTO :ID, :PREF, :NUMERO, :FECHA, :PTVTID, :VENDCOD, :NIT, :NOMTERCERO, :IMPTOS
        DO
        if ((PREFIJO = '') or (PREFIJO = PREF)) then
          BEGIN
          COSTOT = 0;
          PRECIOT = 0;
          FOR SELECT ARTI_COD, SUBSTR(CTDE_DESC,1,60), CTDE_CANT * CTDE_FACTOR, CTDE_UNIDAD, (CTDE_PRUNIT - CTDE_DTOMONTO) / CTDE_FACTOR, CTDE_IVAMONTO
            FROM COTIZACIONES_DETALLE
            WHERE COTI_ID = :ID
            INTO :ARTICULO, :ARTIDES, :CANT, :UNIDAD, :PRECIO, :IVA
            DO
                BEGIN
                EXECUTE PROCEDURE COSTO_PROMEDIO(:ARTICULO, :FECHA) returning_values (:COSTO);
                COSTO = COSTO * CANT;
                PRECIO = PRECIO * CANT;
                if (IMPTOS = 'S') then
                    PRECIO = PRECIO - IVA;
                UTILIDAD = PRECIO - COSTO;
                if (DETALLE = 'S') then
                    BEGIN
                    if (UOM = 'UTILIDAD') then
                        EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                    else
                        EXECUTE PROCEDURE PORCENTAJE (utilidad,  PRECIO, 'S') returning_values (PORC);
                    SUSPEND;
                    END
                ELSE
                    BEGIN
                    COSTOT = COSTOT + COSTO;
                    PRECIOT = PRECIOT + PRECIO;
                    END
                END
        if (DETALLE <> 'S') then
            BEGIN
            COSTO = COSTOT;
            PRECIO = PRECIOT;
            UTILIDAD = PRECIO - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  PRECIO, 'S') returning_values (PORC);
            SUSPEND;
            END
        END
    END
 $$IBE$$*/ SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE CHEQUEO_COSTOS(
    ARTICULO VARCHAR(20),
    FECHA DATE)
AS
declare variable NUMROWS INTEGER;
DECLARE VARIABLE ID INTEGER;
DECLARE VARIABLE FECMV DATE;
DECLARE VARIABLE CANT NUMERIC(15,4);
DECLARE VARIABLE COSTO NUMERIC(18,2);
DECLARE VARIABLE ENTRADA CHAR(1);
DECLARE VARIABLE TIPO INTEGER;
begin /*$$IBE$$ 
SELECT COUNT(*) FROM COSTOS WHERE ARTI_COD = :ARTICULO AND COST_FECHA > :FECHA INTO :NUMROWS;
if (NUMROWS > 0) then
    BEGIN
    delete from costos where arti_cod = :ARTICULO AND COST_FECHA > :FECHA;
    for select mvar_cons, mvar_fecha, mvar_cant, mvar_costo, mvar_entrada, mvar_tipodoc
        from movimiento_articulo WHERE ARTI_COD = :ARTICULO AND MVAR_FECHA > :FECHA
        order by mvar_fecha, mvar_cons  $$IBE$$*/ /* SE HACE ESTRICTAMENTE EN ORDEN DE FECHA Y REGISTRO, SI LO EDITAN CAMBIA EL ORDEN */ /*$$IBE$$ 
        into :id, :fecmv, :cant, :costo, :entrada, :tipo
        do
        if ((TIPO <> 13)) then
            EXECUTE PROCEDURE actualice_costo(:ARTICULO, :fecmv, :costo, :cant, :entrada, 'N', :id, :tipo);
    END
 $$IBE$$*/ EXIT;
end
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE CHEQUEO_INVENTARIO(
    ARTINI VARCHAR(20),
    ARTFIN VARCHAR(20))
AS
DECLARE VARIABLE FECHA DATE;
DECLARE VARIABLE CANT NUMERIC(15,4);
DECLARE VARIABLE COSTO NUMERIC(18,2);
DECLARE VARIABLE ENTRADA CHAR(1);
DECLARE VARIABLE BODEGA CHAR(2);
DECLARE VARIABLE ID INTEGER;
DECLARE VARIABLE TIPO INTEGER;
declare variable TIPOEX CHAR(1);
DECLARE VARIABLE LOTE VARCHAR(20);
DECLARE VARIABLE EXISTE CHAR(1);
declare variable ARTICULO VARCHAR(20);
declare variable IDL INTEGER;
BEGIN /*$$IBE$$ 
for select arti_cod from articulo where arti_cod >= :artini and arti_cod <= :artfin into :ARTICULO
  DO
  BEGIN
  DELETE FROM existencia_lote where arti_cod = :articulo;
  DELETE FROM lotes where arti_cod = :articulo;
  delete from costos where arti_cod = :ARTICULO;
  delete from existencia WHERE ARTI_COD = :ARTICULO;
  for select mvar_cons, mvar_fecha, mvar_cant, mvar_costo, mvar_entrada, bode_cod, mvar_tipodoc, mvar_lote
    from movimiento_articulo WHERE ARTI_COD = :ARTICULO
    order by mvar_fecha, mvar_cons
    into :id, :fecha, :cant, :costo, :entrada, :bodega, :tipo, :lote
  do
    begin
    SELECT ARTI_EXIST
        FROM   ARTICULO
        WHERE  ARTICULO.ARTI_COD = :ARTICULO
        INTO :TIPOEX;
    if ((TIPO <> 13)) then
        EXECUTE PROCEDURE actualice_costo(:ARTICULO, :fecha, :costo, :cant, :entrada, 'N', :id, :tipo);
     $$IBE$$*/ /* actualice existencias */ /*$$IBE$$ 
    if (:entrada = 'S') then
        begin
        execute procedure sume_existencia(:articulo, :bodega, :fecha, :cant, 'N');
        if (TIPOEX = 'L') then
            begin
            EXISTE = 'N';
            SELECT 'S' FROM LOTES WHERE ARTI_COD = :ARTICULO AND BODE_COD = :BODEGA AND LOTE_NRO = :lote INTO :EXISTE;
            if (EXISTE = 'S') then
                UPDATE LOTES
                    set lote_saldo = lote_saldo + :cant
                    where (arti_cod = :ARTICULO) and (BODE_COD = :BODEGA) AND (lote_nro = :lote);
            ELSE
                INSERT INTO LOTES (ARTI_COD, BODE_COD, LOTE_NRO, LOTE_FECHA, LOTE_CANT, LOTE_COSTO, LOTE_SALDO)
                    VALUES (:ARTICULO, :bodega, :lote, :fecha, :cant, :costo, :cant);
            end
        end
    else
        begin
        execute procedure reste_existencia(:articulo, :bodega, :fecha, :cant, 'N');
        if (TIPOEX = 'L') then
            begin
            EXISTE = 'N';
            SELECT 'S' FROM LOTES WHERE ARTI_COD = :ARTICULO AND BODE_COD = :BODEGA AND LOTE_NRO = :lote INTO :EXISTE;
            if (EXISTE = 'S') then
                UPDATE LOTES
                    set lote_saldo = lote_saldo - :cant
                    where (arti_cod = :ARTICULO) AND (BODE_COD = :BODEGA) and (lote_nro = :lote);
            ELSE
                BEGIN
                 $$IBE$$*/ /* ARREGLE EL LOTE YA QUE NO EXISTE */ /*$$IBE$$ 
                SELECT MIN(LOTE_ID) FROM LOTES WHERE ARTI_COD = :articulo AND BODE_COD = :BODEGA AND LOTE_CANT >= :cant INTO :IDL;
                SELECT LOTE_NRO FROM LOTES WHERE LOTE_ID = :IDL INTO :LOTE;
                UPDATE MOVIMIENTO_ARTICULO SET MVAR_LOTE = :LOTE WHERE MVAR_CONS = :ID;
                UPDATE LOTES
                    set lote_saldo = lote_saldo - :cant
                    where (arti_cod = :ARTICULO) and (BODE_COD = :BODEGA) AND (lote_nro = :lote);
                END
            EXISTE = 'N';
            SELECT 'S' FROM EXISTENCIA_LOTE
                WHERE LOTE_NRO = :LOTE AND EXLO_FECHA = :FECHA AND ARTI_COD = :ARTICULO AND BODE_COD = :bodega
                INTO :EXISTE;
            if (EXISTE = 'S') then
                UPDATE EXISTENCIA_LOTE
                       SET EXLO_SAL = EXLO_SAL + :cant
                    WHERE LOTE_NRO = :LOTE AND EXLO_FECHA = :FECHA AND ARTI_COD = :ARTICULO AND BODE_COD = :bodega;
            else
                INSERT INTO EXISTENCIA_LOTE (ARTI_COD, BODE_COD, LOTE_NRO, EXLO_FECHA, EXLO_SAL)
                    VALUES (:ARTICULO, :BODEGA, :LOTE, :FECHA, :CANT);
            end
        end
    END
  END
 $$IBE$$*/ EXIT;
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE CAMBIO_PRECIOS(
    FECHA DATE)
AS
declare variable ART VARCHAR(20);
BEGIN /*$$IBE$$ 
FOR SELECT ARTI_COD FROM ARTICULO INTO :ART DO
    EXECUTE PROCEDURE CALCULA_PRECIOS(:ART, :FECHA);
  SUSPEND;
 $$IBE$$*/ EXIT;
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE CONTABILICE_COSTO_VENTAS(
    ID INTEGER,
    IDINTER INTEGER)
RETURNS (
    IDC INTEGER)
AS
declare variable PREF VARCHAR(4);
declare variable NUM VARCHAR(6);
declare variable NUMERO VARCHAR(10);
declare variable INVEN CHAR(1);
declare variable CTAINVEN VARCHAR(20);
declare variable COSTOS CHAR(1);
declare variable CTACOSTOS VARCHAR(20);
declare variable EXISTE CHAR(1);
declare variable CUENTA VARCHAR(20);
declare variable MONTO NUMERIC(18,2);
declare variable TIPOCUEN CHAR(1);
declare variable NIT VARCHAR(20);
declare variable PROY VARCHAR(4);
declare variable CENTRO VARCHAR(4);
declare variable ART VARCHAR(15);
declare variable ANULADO CHAR(1);
declare variable NROI INTEGER;
declare variable NUMROWS INTEGER;
declare variable CONC CHAR(120);
declare variable VENCEAUX DATE;
declare variable VENCE CHAR(8);
begin
/* TRAIGA EL ID DEL ENCABEZADO DEL COMPROBANTE CONTABLE */ /*$$IBE$$ 
SELECT ENCO_CONSEC FROM COMPROBANTE_ENCABEZADO WHERE ENCO_TIPOREF = 31 AND ENCO_IDREF = :ID INTO :IDC;
SELECT MAX(CODE_ITEM) FROM COMPROBANTE_DETALLE WHERE ENCO_CONSEC = :idc INTO :NROI;
NROI = NROI + 1;
 $$IBE$$*/ /* EJECUTE LA PARTE DE CONTABIL_FACTURA QUE CORRESPONDE A LOS COSTOS */ /*$$IBE$$ 
EXISTE = 'N';
SELECT 'S', INVE_COSTO, INVE_INVEN, INVE_CTAINVEN, INVE_CTACOSTOS
    FROM INTERFAZ_VENTAS
    WHERE INVE_ID = :IDINTER
    INTO :EXISTE, :COSTOS, :INVEN, :CTAINVEN, :CTACOSTOS;
if (EXISTE = 'S') then
  BEGIN
  SELECT FACT_ANULADO, PREF_PRE, FACT_NUMERO, FACT_VENCE, TERC_NIT FROM FACTURAS F
        WHERE FACT_ID = :ID INTO :ANULADO, :PREF, :NUMERO, :VENCEAUX, :NIT;
  NUMERO = PREF || NUM;
  CONC = 'COSTO EN VENTAS FACTURA ' || :NUMERO;
  EXECUTE PROCEDURE FECHA_A_CONTA(:VENCEAUX) returning_values (:VENCE);
  if (ANULADO = 'N') then
    BEGIN
    SELECT BODE_CENTRO, BODE_PROY FROM BODEGA B, FACTURAS F, PUNTO_VENTA P
        WHERE B.BODE_COD = P.BODE_COD AND P.PTVT_ID = F.PTVT_ID AND F.FACT_ID = :ID INTO :CENTRO, :PROY;
     $$IBE$$*/ /* SE ASUME QUE NO HAN CAMBIADO LAS CUENTAS DE COSTOS, POR ESO SE HACE UPDATE A LOS MOVIMIENTOS DE ESAS CUENTAS */ /*$$IBE$$ 
    EXECUTE PROCEDURE COSTO_EN_VENTAS(31, :ID);
    if (COSTOS = 'A') then
        BEGIN
        FOR SELECT MAX(CTACOS), SUM(CANT * COSTO)
            FROM COSTO_VENTAS
            GROUP BY CTACOS
            INTO :CTACOSTOS, :MONTO
        DO
            BEGIN
            if (MONTO <> 0) then
                BEGIN
                CUENTA = NULL;
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :CTACOSTOS INTO :CUENTA, :TIPOCUEN;
                IF (CUENTA IS NULL) THEN
                    begin
                    EXCEPTION CUENTA_NO_EXISTE 'La cuenta ' || :ctacostos || ' no existe.';
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                     $$IBE$$*/ /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */ /*$$IBE$$ 
                    FOR SELECT ARTI_COD, CANT * COSTO
                        FROM COSTO_VENTAS
                        WHERE CTACOS = :CUENTA
                        INTO :ART, :MONTO
                    DO
                        BEGIN
                        SELECT COUNT(*) FROM COMPROBANTE_DETALLE WHERE CUEN_COD = :CUENTA AND ENCO_CONSEC = :IDC AND ARTI_COD = :ART INTO :NUMROWS;
                        if (NUMROWS = 0) then
                            BEGIN
                            INSERT INTO comprobante_detalle (ENCO_CONSEC, CODE_ITEM, CUEN_COD, CODE_CONCEPTO, CODE_REFER, CODE_DEBITO, CODE_CREDITO, CODE_BASE, CODE_PORC, TERC_NIT, PROY_COD, CENT_COD, CNDE_DOCNUMERO, CNDE_DOCAPLICA, DOCO_VENCE, ARTI_COD, CODE_TIPOAPL, CODE_TIPONUE)
                                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                            NROI = NROI + 1;
                            END
                        ELSE
                            UPDATE COMPROBANTE_DETALLE
                                SET CODE_DEBITO = :MONTO
                            WHERE CUEN_COD = :CUENTA AND ENCO_CONSEC = :IDC AND ARTI_COD = :ART;
                        END
                    END
                ELSE
                    BEGIN
                    SELECT COUNT(*) FROM COMPROBANTE_DETALLE WHERE CUEN_COD = :CUENTA AND ENCO_CONSEC = :IDC INTO :NUMROWS;
                    if (NUMROWS = 0) then
                        BEGIN
                        if (TIPOCUEN = 'C') then
                            INSERT INTO comprobante_detalle (ENCO_CONSEC, CODE_ITEM, CUEN_COD, CODE_CONCEPTO, CODE_REFER, CODE_DEBITO, CODE_CREDITO, CODE_BASE, CODE_PORC, TERC_NIT, PROY_COD, CENT_COD, CNDE_DOCNUMERO, CNDE_DOCAPLICA, DOCO_VENCE, ARTI_COD, CODE_TIPOAPL, CODE_TIPONUE)
                                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                        ELSE
                            INSERT INTO comprobante_detalle (ENCO_CONSEC, CODE_ITEM, CUEN_COD, CODE_CONCEPTO, CODE_REFER, CODE_DEBITO, CODE_CREDITO, CODE_BASE, CODE_PORC, TERC_NIT, PROY_COD, CENT_COD, CNDE_DOCNUMERO, CNDE_DOCAPLICA, DOCO_VENCE, ARTI_COD, CODE_TIPOAPL, CODE_TIPONUE)
                                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NROI = NROI + 1;
                        END
                    ELSE
                        UPDATE COMPROBANTE_DETALLE
                            SET CODE_DEBITO = :MONTO
                        WHERE CUEN_COD = :CUENTA AND ENCO_CONSEC = :IDC;
                    END
                END  $$IBE$$*/ /* MONTO <> 0 */ /*$$IBE$$ 
            END  $$IBE$$*/ /* FOR */ /*$$IBE$$ 
        END  $$IBE$$*/ /* COSTOS */ /*$$IBE$$ 
    if (COSTOS = 'K') then
        BEGIN
        SELECT SUM(CANT * COSTO)
            FROM COSTO_VENTAS
            INTO :MONTO;
        if (MONTO <> 0) then
            BEGIN
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTACOSTOS INTO :CUENTA, :TIPOCUEN;
            IF (CUENTA IS NULL) THEN
                begin
                EXCEPTION CUENTA_NO_EXISTE 'La cuenta ' || :ctacostos || ' no existe.';
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                 $$IBE$$*/ /* ES UNA CUENTA DE INVENTARIO, REGISTRE UNO A UNO LOS ARTICULOS */ /*$$IBE$$ 
                FOR SELECT ARTI_COD, CANT * COSTO
                    FROM COSTO_VENTAS
                    INTO :ART, :MONTO
                DO
                    BEGIN
                    SELECT COUNT(*) FROM COMPROBANTE_DETALLE WHERE CUEN_COD = :CUENTA AND ENCO_CONSEC = :IDC AND ARTI_COD = :ART INTO :NUMROWS;
                    if (NUMROWS = 0) then
                        BEGIN
                            INSERT INTO comprobante_detalle (ENCO_CONSEC, CODE_ITEM, CUEN_COD, CODE_CONCEPTO, CODE_REFER, CODE_DEBITO, CODE_CREDITO, CODE_BASE, CODE_PORC, TERC_NIT, PROY_COD, CENT_COD, CNDE_DOCNUMERO, CNDE_DOCAPLICA, DOCO_VENCE, ARTI_COD, CODE_TIPOAPL, CODE_TIPONUE)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        END
                    ELSE
                        UPDATE COMPROBANTE_DETALLE
                            SET CODE_DEBITO = :MONTO
                        WHERE CUEN_COD = :CUENTA AND ENCO_CONSEC = :IDC AND ARTI_COD = :ART;
                    END
                END
            ELSE
                BEGIN
                SELECT COUNT(*) FROM COMPROBANTE_DETALLE WHERE CUEN_COD = :CUENTA AND ENCO_CONSEC = :IDC INTO :NUMROWS;
                if (NUMROWS = 0) then
                    BEGIN
                    if (TIPOCUEN = 'C') then
                        INSERT INTO comprobante_detalle (ENCO_CONSEC, CODE_ITEM, CUEN_COD, CODE_CONCEPTO, CODE_REFER, CODE_DEBITO, CODE_CREDITO, CODE_BASE, CODE_PORC, TERC_NIT, PROY_COD, CENT_COD, CNDE_DOCNUMERO, CNDE_DOCAPLICA, DOCO_VENCE, ARTI_COD, CODE_TIPOAPL, CODE_TIPONUE)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    ELSE
                        INSERT INTO comprobante_detalle (ENCO_CONSEC, CODE_ITEM, CUEN_COD, CODE_CONCEPTO, CODE_REFER, CODE_DEBITO, CODE_CREDITO, CODE_BASE, CODE_PORC, TERC_NIT, PROY_COD, CENT_COD, CNDE_DOCNUMERO, CNDE_DOCAPLICA, DOCO_VENCE, ARTI_COD, CODE_TIPOAPL, CODE_TIPONUE)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    END
                ELSE
                    UPDATE COMPROBANTE_DETALLE
                        SET CODE_DEBITO = :MONTO
                    WHERE CUEN_COD = :CUENTA AND ENCO_CONSEC = :IDC;
                END
            END  $$IBE$$*/ /* MONTO <> 0 */ /*$$IBE$$ 
        END  $$IBE$$*/ /* COSTOS = K */ /*$$IBE$$ 
    if (INVEN = 'A') then
        BEGIN
        FOR SELECT MAX(CTAINV), SUM(CANT * COSTO)
            FROM COSTO_VENTAS
            GROUP BY CTAINV
            INTO :CTAINVEN, :MONTO
        DO
            BEGIN
            if (MONTO <> 0) then
                BEGIN
                CUENTA = NULL;
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :CTAINVEN INTO :CUENTA, :TIPOCUEN;
                IF (CUENTA IS NULL) THEN
                    begin
                    EXCEPTION CUENTA_NO_EXISTE 'La cuenta ' || :ctainven || ' no existe.';
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                     $$IBE$$*/ /* ES UNA CUENTA DE INVENTARIO, REGISTRE UNO A UNO LOS ARTICULOS */ /*$$IBE$$ 
                    FOR SELECT ARTI_COD, CANT * COSTO
                        FROM COSTO_VENTAS
                        WHERE CTAINV = :CUENTA
                        INTO :ART, :MONTO
                    DO
                        BEGIN
                        SELECT COUNT(*) FROM COMPROBANTE_DETALLE WHERE CUEN_COD = :CUENTA AND ENCO_CONSEC = :IDC AND ARTI_COD = :ART INTO :NUMROWS;
                        if (NUMROWS = 0) then
                            BEGIN
                            INSERT INTO comprobante_detalle (ENCO_CONSEC, CODE_ITEM, CUEN_COD, CODE_CONCEPTO, CODE_REFER, CODE_DEBITO, CODE_CREDITO, CODE_BASE, CODE_PORC, TERC_NIT, PROY_COD, CENT_COD, CNDE_DOCNUMERO, CNDE_DOCAPLICA, DOCO_VENCE, ARTI_COD, CODE_TIPOAPL, CODE_TIPONUE)
                                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                            NROI = NROI + 1;
                            END
                        ELSE
                            UPDATE COMPROBANTE_DETALLE
                                SET CODE_CREDITO = :MONTO
                            WHERE CUEN_COD = :CUENTA AND ENCO_CONSEC = :IDC AND ARTI_COD = :ART;
                        END
                    END
                ELSE
                    BEGIN
                    SELECT COUNT(*) FROM COMPROBANTE_DETALLE WHERE CUEN_COD = :CUENTA AND ENCO_CONSEC = :IDC INTO :NUMROWS;
                    if (NUMROWS = 0) then
                        BEGIN
                        if (TIPOCUEN = 'C') then
                            INSERT INTO comprobante_detalle (ENCO_CONSEC, CODE_ITEM, CUEN_COD, CODE_CONCEPTO, CODE_REFER, CODE_DEBITO, CODE_CREDITO, CODE_BASE, CODE_PORC, TERC_NIT, PROY_COD, CENT_COD, CNDE_DOCNUMERO, CNDE_DOCAPLICA, DOCO_VENCE, ARTI_COD, CODE_TIPOAPL, CODE_TIPONUE)
                                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                        ELSE
                            INSERT INTO comprobante_detalle (ENCO_CONSEC, CODE_ITEM, CUEN_COD, CODE_CONCEPTO, CODE_REFER, CODE_DEBITO, CODE_CREDITO, CODE_BASE, CODE_PORC, TERC_NIT, PROY_COD, CENT_COD, CNDE_DOCNUMERO, CNDE_DOCAPLICA, DOCO_VENCE, ARTI_COD, CODE_TIPOAPL, CODE_TIPONUE)
                                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NROI = NROI + 1;
                        END
                    ELSE
                        UPDATE COMPROBANTE_DETALLE
                            SET CODE_CREDITO = :MONTO
                        WHERE CUEN_COD = :CUENTA AND ENCO_CONSEC = :IDC;
                    END
                END  $$IBE$$*/ /* MONTO <> 0 */ /*$$IBE$$ 
            END  $$IBE$$*/ /* FOR */ /*$$IBE$$ 
        END  $$IBE$$*/ /* INVEN = A */ /*$$IBE$$ 
    if (INVEN = 'K') then
        BEGIN
        SELECT SUM(CANT * COSTO)
            FROM COSTO_VENTAS
            INTO :MONTO;
        if (MONTO <> 0) then
            BEGIN
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTAINVEN INTO :CUENTA, :TIPOCUEN;
            IF (CUENTA IS NULL) THEN
                begin
                EXCEPTION CUENTA_NO_EXISTE 'La cuenta ' || :ctainven || ' no existe.';
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                 $$IBE$$*/ /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */ /*$$IBE$$ 
                FOR SELECT ARTI_COD, CANT * COSTO
                    FROM COSTO_VENTAS
                    INTO :ART, :MONTO
                DO
                    BEGIN
                    SELECT COUNT(*) FROM COMPROBANTE_DETALLE WHERE CUEN_COD = :CUENTA AND ENCO_CONSEC = :IDC AND ARTI_COD = :ART INTO :NUMROWS;
                    if (NUMROWS = 0) then
                        BEGIN
                        INSERT INTO comprobante_detalle (ENCO_CONSEC, CODE_ITEM, CUEN_COD, CODE_CONCEPTO, CODE_REFER, CODE_DEBITO, CODE_CREDITO, CODE_BASE, CODE_PORC, TERC_NIT, PROY_COD, CENT_COD, CNDE_DOCNUMERO, CNDE_DOCAPLICA, DOCO_VENCE, ARTI_COD, CODE_TIPOAPL, CODE_TIPONUE)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        END
                    ELSE
                        UPDATE COMPROBANTE_DETALLE
                            SET CODE_CREDITO = :MONTO
                        WHERE CUEN_COD = :CUENTA AND ENCO_CONSEC = :IDC AND ARTI_COD = :ART;
                    END
                END
            ELSE
                BEGIN
                SELECT COUNT(*) FROM COMPROBANTE_DETALLE WHERE CUEN_COD = :CUENTA AND ENCO_CONSEC = :IDC INTO :NUMROWS;
                if (NUMROWS = 0) then
                    BEGIN
                    if (TIPOCUEN = 'C') then
                        INSERT INTO comprobante_detalle (ENCO_CONSEC, CODE_ITEM, CUEN_COD, CODE_CONCEPTO, CODE_REFER, CODE_DEBITO, CODE_CREDITO, CODE_BASE, CODE_PORC, TERC_NIT, PROY_COD, CENT_COD, CNDE_DOCNUMERO, CNDE_DOCAPLICA, DOCO_VENCE, ARTI_COD, CODE_TIPOAPL, CODE_TIPONUE)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    ELSE
                        INSERT INTO comprobante_detalle (ENCO_CONSEC, CODE_ITEM, CUEN_COD, CODE_CONCEPTO, CODE_REFER, CODE_DEBITO, CODE_CREDITO, CODE_BASE, CODE_PORC, TERC_NIT, PROY_COD, CENT_COD, CNDE_DOCNUMERO, CNDE_DOCAPLICA, DOCO_VENCE, ARTI_COD, CODE_TIPOAPL, CODE_TIPONUE)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    END
                ELSE
                    UPDATE COMPROBANTE_DETALLE
                        SET CODE_CREDITO = :MONTO
                    WHERE CUEN_COD = :CUENTA AND ENCO_CONSEC = :IDC;
                END
            END  $$IBE$$*/ /* MONTO <> 0 */ /*$$IBE$$ 
        END  $$IBE$$*/ /* INVEN = K */ /*$$IBE$$ 
    END
  END
 $$IBE$$*/ SUSPEND;
end
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE CONTABIL_DEVOLCLI(
    IDDOC INTEGER,
    IDINTER INTEGER)
RETURNS (
    ERROR INTEGER,
    VER CHAR(1),
    IDC INTEGER)
AS
declare variable PREF VARCHAR(4);
declare variable NUM VARCHAR(6);
declare variable NUMERO VARCHAR(10);
declare variable FECAUX DATE;
declare variable FECHA CHAR(8);
declare variable CONC CHAR(120);
declare variable NUMFAC VARCHAR(10);
declare variable VRDTO NUMERIC(18, 2);
declare variable VRADIC NUMERIC(18, 2);
declare variable VRSUBT NUMERIC(18, 2);
declare variable VRIVA NUMERIC(18, 2);
declare variable PRTFTE NUMERIC(9, 2);
declare variable VRRTFTE NUMERIC(18, 2);
declare variable VRRTIVA NUMERIC(18, 2);
declare variable PRTICA NUMERIC(9, 2);
declare variable VRRTICA NUMERIC(18, 2);
declare variable VRTOTAL NUMERIC(18, 2);
declare variable VREXTRA NUMERIC(18, 2);
declare variable TIPOCOMP VARCHAR(3);
declare variable PREFCONT VARCHAR(4);
declare variable VENTAS CHAR(1);
declare variable CTAVENTAS VARCHAR(20);
declare variable IVA CHAR(1);
declare variable CTAIVA VARCHAR(20);
declare variable CONSUMO CHAR(1);
declare variable CTACONSUMO VARCHAR(20);
declare variable CARTERA CHAR(1);
declare variable CTACARTERA VARCHAR(20);
declare variable RTFTE CHAR(1);
declare variable CTARTFTE VARCHAR(20);
declare variable RTIVA CHAR(1);
declare variable CTARTIVA VARCHAR(20);
declare variable RTICA CHAR(1);
declare variable CTARTICA VARCHAR(20);
declare variable INVEN CHAR(1);
declare variable CTAINVEN VARCHAR(20);
declare variable COSTOS CHAR(1);
declare variable CTACOSTOS VARCHAR(20);
declare variable CTADTO VARCHAR(20);
declare variable CTAADIC VARCHAR(20);
declare variable CTAEXTRA VARCHAR(20);
declare variable EXISTE CHAR(1);
declare variable CUENTA VARCHAR(20);
declare variable MONTO NUMERIC(18,2);
declare variable TIPOCUEN CHAR(1);
declare variable NIT VARCHAR(20);
declare variable PROY VARCHAR(4);
declare variable CENTRO VARCHAR(4);
declare variable PORC NUMERIC(5,2);
declare variable DEBITO NUMERIC(18,2);
declare variable CREDITO NUMERIC(18,2);
declare variable NROI INTEGER;
declare variable ART VARCHAR(15);
declare variable IMPINC CHAR(1);
declare variable IMPTOS NUMERIC(18, 2);
declare variable SUMA NUMERIC(18,2);
declare variable PORCIVA NUMERIC(9,2);
declare variable TCTACLIEN VARCHAR(20);
declare variable TCTAVENTA VARCHAR(20);
declare variable TCTARTFTE VARCHAR(20);
declare variable TCTARTIVA VARCHAR(20);
declare variable TCTARTICA VARCHAR(20);
declare variable CTADIC VARCHAR(20);
declare variable BASEADIC VARCHAR(20);
declare variable PORCADIC NUMERIC(5,2);
declare variable VALORADIC NUMERIC(18,2);
declare variable DBADIC CHAR(1);
declare variable PTOVTA INTEGER;
declare variable ANULADO CHAR(1);
declare variable CENT CHAR(1);
DECLARE VARIABLE MERCANCIA NUMERIC(18,2);
declare variable FACTOR DOUBLE PRECISION;
declare variable DIG INTEGER;
DECLARE VARIABLE FOMENTO VARCHAR(2);
DECLARE VARIABLE VRCONSUMO NUMERIC(18,2);
declare variable AUTORET VARCHAR(10);
declare variable FAUTORET DATE;
declare variable IDREM INTEGER;
declare variable DTOXIT CHAR(2);
declare variable ERRORC INTEGER;
BEGIN /*$$IBE$$ 
EXECUTE PROCEDURE LEE_CONFIGURACION('COMPRAS', 'FACTURAS', 'USAR IMPOCONSUMO COMO PORCENTAJE DE FOMENTO') returning_values (FOMENTO);
EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'FECHA AUTORETENEDOR NO DESCONTAR RETENCIONES DEL SALDO PERO SI CONTABILIZARLAS') returning_values (AUTORET);
if (AUTORET <> '') then
    FAUTORET = CAST(AUTORET AS DATE);
else
    FAUTORET = '9999/12/31';
   $$IBE$$*/ /* BUSQUE LA INTERFACE */ /*$$IBE$$ 
  EXISTE = 'N';
  SELECT 'S', TICO_COD, PRCO_PRE, INVE_VENTAS, INVE_IVA, INVE_CONSUMO, INVE_CARTERA, INVE_RTFTE, INVE_RTIVA, INVE_RTICA, INVE_COSTO, INVE_INVEN, INVE_CTAVENTAS, INVE_CTAIVA, INVE_CTACONSUMO, INVE_CTADTO, INVE_CTAADIC, INVE_CTAEXTRA, INVE_CTACARTERA, INVE_CTARTFTE, INVE_CTARTIVA, INVE_CTARTICA, INVE_CTAINVEN, INVE_CTACOSTOS, INVE_CONFIRMAR, INVE_CENTRO
    FROM INTERFAZ_VENTAS
    WHERE INVE_ID = :IDINTER
    INTO :EXISTE, :TIPOCOMP, :PREFCONT, :VENTAS, :IVA, :CONSUMO, :CARTERA, :RTFTE, :RTIVA, :RTICA, :COSTOS, :INVEN, :CTAVENTAS, :CTAIVA, :CTACONSUMO, :CTADTO, :CTAADIC, :CTAEXTRA, :CTACARTERA, :CTARTFTE, :CTARTIVA, :CTARTICA, :CTAINVEN, :CTACOSTOS, :VER, :CENT;
  if (EXISTE = 'S') then
   BEGIN
     $$IBE$$*/ /* BORRE CUALQUEIR CONTABILIZACION PREVIA */ /*$$IBE$$ 
    DELETE FROM CONTABILIZACION WHERE CNTB_TIPOREF = 33 AND CNTB_IDREF = :IDDOC;
     $$IBE$$*/ /* TRAIGA EL ENCABEZADO DE LA DEVOLUCION */ /*$$IBE$$ 
   SELECT PREF_PRE, DEVT_NUMERO, DEVT_FECHA, F.TERC_NIT, DEVT_IVAINC, PTVT_ID, DEVT_FACTURA, DEVT_DTOMONTO, DEVT_ADICIONAL, DEVT_IVAMONTO, DEVT_EXTRA, DEVT_TOTAL, DEVT_RTFTEPORC, DEVT_RTFTEMONTO, DEVT_RTIVAPORC, DEVT_RTIVAMONTO, DEVT_RTICAPORC, DEVT_RTICAMONTO, TERC_CTARTFTE, TERC_CTARTIVA, TERC_CTARTICA, TERC_CTAVENTA, TERC_CTACLIENTE, DEVT_ANULADO, DEVT_REMID
        FROM DEVOLUCIONES_VENTAS F, TERCEROS T
        WHERE DEVT_ID = :IDDOC AND F.TERC_NIT = T.TERC_NIT
        INTO :PREF, :NUM, :FECAUX, :NIT, :IMPINC, :PTOVTA, :NUMFAC, :VRDTO, :VRADIC, :VRIVA, :VREXTRA, :VRTOTAL, :PRTFTE, :VRRTFTE, :PORC, :VRRTIVA, :PRTICA, :VRRTICA, :TCTARTFTE, TCTARTIVA, TCTARTICA, TCTAVENTA, TCTACLIEN, ANULADO, :IDREM;
   if (idrem is null) Then
    IDREM = 0;
   if ((ANULADO = 'N') AND (IDREM = 0)) then
    BEGIN
    NUMERO = PREF || NUM;
    SELECT SUM(DVDE_CONSUMO) FROM devoluciones_ventas_detalle WHERE DEVT_ID = :iddoc INTO :MERCANCIA;
    VRSUBT = VRTOTAL - VREXTRA - VRIVA - MERCANCIA;  $$IBE$$*/ /* BASE DE RETEFTE Y RETEICA */ /*$$IBE$$ 
    EXECUTE PROCEDURE lee_configuracion ('FACTURACION', 'DEVOLUCIONES', 'DESCUENTO PIE DEVOLUCION IGUAL A SUMA DE DESCUENTOS POR ITEM') returning_values (:DTOXIT);
    if (DTOXIT = 'SI') then
        VRDTO = 0;
    MERCANCIA = VRSUBT - VRADIC + VRDTO;
    IF (CENT = 'B') THEN
        SELECT B.BODE_CENTRO, B.BODE_PROY FROM BODEGA B, DEVOLUCIONES_VENTAS F
            WHERE B.BODE_COD = F.BODE_COD AND F.DEVT_ID = :IDDOC INTO :CENTRO, :PROY;
    IF (CENT = 'V') THEN
        SELECT V.CENT_COD, V.PROY_COD FROM VENDEDORES V, DEVOLUCIONES_VENTAS F
            WHERE V.VEND_COD = F.VEND_COD AND F.DEVT_ID = :IDDOC INTO :CENTRO, :PROY;
    IF (CENT = 'P') THEN
        SELECT P.PREF_CENTRO,P.PREF_PROY  FROM PREFIJOS P, DEVOLUCIONES_VENTAS F
            WHERE P.PREF_PRE = F.PREF_PRE AND F.DEVT_ID = :IDDOC AND P.TIDO_COD = 33 INTO :CENTRO, :PROY;
    EXECUTE PROCEDURE FECHA_A_CONTA(:FECAUX) returning_values (:FECHA);
     $$IBE$$*/ /* REGISTRE EL ENCABEZADO CONTABLE */ /*$$IBE$$ 
    IDC = GEN_ID(ID_CONTABILIZA, 1);
    CONC = 'DEVOLUCION VENTAS No. ' || NUMERO || ' EN FACTURA ' || NUMFAC;
    CONC = SUBSTR(CONC, 1, 60);
    INSERT INTO CONTABILIZACION (CNTB_ID, CNTB_TIPOCOMP, CNTB_PREFCNT, CNTB_NUMERO, CNTB_FECHA, CNTB_CONCEPTO, CNTB_REF, CNTB_TIPOREF, CNTB_IDREF, CNTB_PREFREF, CNTB_NUMREF, CNTB_PROCESADO)
        VALUES (:IDC, :TIPOCOMP, :PREFCONT, :NUM, :FECHA, :CONC, '', 33, :IDDOC, :PREF, :NUM, 'N');
    NROI = 0;
    SUMA = 0;
    ERROR = 0;
     $$IBE$$*/ /* SI NO HAY CUENTA DE DESCUENTO NI ADICIONAL CALCULE UN FACTOR PARA LAS VENTAS Y EL IVA */ /*$$IBE$$ 
    if (MERCANCIA <> 0) then
        FACTOR = CAST(VRSUBT AS DOUBLE PRECISION) / CAST(MERCANCIA AS DOUBLE PRECISION);
    ELSE
        FACTOR = 1;
     $$IBE$$*/ /* TRAIGA EL NUMERO DE DIGITOS PARA EL REDONDEO */ /*$$IBE$$ 
    SELECT CAST(CONF_VALOR AS INTEGER) FROM CONFIGURACION WHERE CONF_MODULO = 'FACTURACION' AND
        CONF_CATEGORIA = 'GENERAL' AND CONF_PROPIEDAD = 'REDONDEO AL MULTIPLO DE DIEZ EN TOTALES' INTO :DIG;
     $$IBE$$*/ /* CUENTAS DE VENTAS */ /*$$IBE$$ 
    if (VENTAS = 'A') then
        BEGIN
        FOR SELECT MAX(COAR_CTADEV), SUM(cast(DVDE_CANT as double precision) * (DVDE_PRUNIT-DVDE_DTOMONTO)), SUM(DVDE_IVAMONTO), SUM(DVDE_CONSUMO)
            FROM ARTICULO A, CONTABIL_ARTICULO C, DEVOLUCIONES_VENTAS_DETALLE F
            WHERE F.DEVT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD
            GROUP BY COAR_CTADEV
            INTO :CTAVENTAS, :MONTO, :IMPTOS, :VRCONSUMO
            DO
            BEGIN
            if (IMPINC = 'S') then
                if (FOMENTO = 'SI') then
                    MONTO = MONTO - IMPTOS;
                ELSE
                    MONTO = MONTO - IMPTOS - VRCONSUMO;
            ELSE
            if (FOMENTO = 'SI') then
            MONTO = MONTO + VRCONSUMO;
            if ((CTADTO IS NULL) OR (CTADTO = '')) then
                MONTO = MONTO * FACTOR;
            execute procedure redondee(MONTO, DIG) returning_values (MONTO);
            if (MONTO <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTAVENTAS, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                     $$IBE$$*/ /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */ /*$$IBE$$ 
                    FOR SELECT F.ARTI_COD, (cast(DVDE_CANT as double precision) * (DVDE_PRUNIT-DVDE_DTOMONTO)), (DVDE_IVAMONTO+DVDE_CONSUMO)
                        FROM ARTICULO A, CONTABIL_ARTICULO C, DEVOLUCIONES_VENTAS_DETALLE F
                        WHERE F.DEVT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTAINV = :CUENTA
                        INTO :ART, :MONTO, :IMPTOS
                    DO
                        BEGIN
                        if (IMPINC = 'S') then
                            MONTO = MONTO - IMPTOS;
                        if ((CTADTO IS NULL) OR (CTADTO = '')) then
                            MONTO = MONTO * FACTOR;
                        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        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, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                    NROI = NROI + 1;
                    SUMA = SUMA + MONTO;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA + MONTO;
                    END
                END  $$IBE$$*/ /* MONTO <> 0 */ /*$$IBE$$ 
            END  $$IBE$$*/ /* FOR */ /*$$IBE$$ 
        END  $$IBE$$*/ /* VENTAS X ARTICULO */ /*$$IBE$$ 
     IF ((VENTAS = 'C') OR (VENTAS = 'K')) THEN
        BEGIN
        IF (VENTAS = 'C') THEN
            CTAVENTAS = TCTAVENTA;
        SELECT SUM(cast(DVDE_CANT as double precision) * (DVDE_PRUNIT-DVDE_DTOMONTO)), SUM(DVDE_IVAMONTO), SUM(DVDE_CONSUMO)
            FROM DEVOLUCIONES_VENTAS_DETALLE F
            WHERE F.DEVT_ID = :IDDOC 
            INTO :MONTO, :IMPTOS, :VRCONSUMO;
        if (IMPINC = 'S') then
            if (FOMENTO = 'SI') then
               MONTO = MONTO - IMPTOS;
            ELSE
               MONTO = MONTO - IMPTOS - VRCONSUMO;
        ELSE
         if (FOMENTO = 'SI') then
          MONTO = MONTO + VRCONSUMO;
        if ((CTADTO IS NULL) OR (CTADTO = '')) then
            MONTO = MONTO * FACTOR;
        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
        if (MONTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTAVENTAS, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'I') then
                BEGIN
                 $$IBE$$*/ /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */ /*$$IBE$$ 
                FOR SELECT F.ARTI_COD, (cast(DVDE_CANT as double precision) * (DVDE_PRUNIT-DVDE_DTOMONTO)), (DVDE_IVAMONTO+DVDE_CONSUMO)
                    FROM ARTICULO A, DEVOLUCIONES_VENTAS_DETALLE F
                    WHERE F.DEVT_ID = :IDDOC
                    INTO :ART, :MONTO, :IMPTOS
                    DO
                    BEGIN
                    if (IMPINC = 'S') then
                        MONTO = MONTO - IMPTOS;
                    if ((CTADTO IS NULL) OR (CTADTO = '')) then
                        MONTO = MONTO * FACTOR;
                    execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                    NROI = NROI + 1;
                    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, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                NROI = NROI + 1;
                SUMA = SUMA + MONTO;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA + MONTO;
                END
            END  $$IBE$$*/ /* MONTO <> 0 */ /*$$IBE$$ 
        END  $$IBE$$*/ /* VENTAS DE CLIENTE O CONSTANTE */
    /* EL IVA EN VENTAS */ /*$$IBE$$ 
    if (IVA = 'A') then
        BEGIN
        FOR SELECT MAX(COAR_CTAIVAV), SUM(DVDE_IVAMONTO), SUM(DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO), SUM(DVDE_CONSUMO)
            FROM ARTICULO A, CONTABIL_ARTICULO C, DEVOLUCIONES_VENTAS_DETALLE F
            WHERE F.DEVT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD
            GROUP BY COAR_CTAIVAV
            INTO :CTAIVA, :IMPTOS, :MONTO, :VALORADIC
        DO
            BEGIN
            if (FOMENTO = 'SI') then
                MONTO = MONTO + VALORADIC;
            MONTO = MONTO * -1;
            MONTO = MONTO * FACTOR;
            IMPTOS = IMPTOS * FACTOR;
            execute procedure redondee(MONTO, DIG) returning_values (MONTO);
            execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
            if (IMPTOS <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTAIVA, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                     $$IBE$$*/ /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */ /*$$IBE$$ 
                    FOR SELECT F.ARTI_COD, DVDE_IVAMONTO, (cast(DVDE_CANT as double precision) * (DVDE_PRUNIT-DVDE_DTOMONTO)), TAIV_PORC, DVDE_CONSUMO
                        FROM ARTICULO A, CONTABIL_ARTICULO C, DEVOLUCIONES_VENTAS_DETALLE F, TARIFA_IVA T
                        WHERE F.DEVT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND A.TAIV_COD = T.TAIV_COD AND COAR_CTAIVAV = :CUENTA
                        INTO :ART, :IMPTOS, :MONTO, :PORCIVA, :VALORADIC
                    DO
                        BEGIN
                        if (IMPINC = 'S') then
                            MONTO = MONTO - IMPTOS - VALORADIC;
                        MONTO = MONTO * -1;
                        MONTO = MONTO * FACTOR;
                        IMPTOS = IMPTOS * FACTOR;
                        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                        execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                        if (IMPTOS <> 0) then
                            BEGIN
                            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :IMPTOS, 0, :MONTO, :PORCIVA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                            NROI = NROI + 1;
                            SUMA = SUMA + IMPTOS;
                            END
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                    NROI = NROI + 1;
                    SUMA = SUMA + IMPTOS;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA + IMPTOS;
                    END
                END    $$IBE$$*/ /* IMPTOS <> 0 */ /*$$IBE$$ 
            END  $$IBE$$*/ /* FOR */ /*$$IBE$$ 
        END  $$IBE$$*/ /* IVA X ARTICULO */ /*$$IBE$$ 
    if (IVA = 'K') then  $$IBE$$*/ /* IVA EN CTA CONSTANTE */ /*$$IBE$$ 
        BEGIN
        SELECT SUM(DVDE_IVAMONTO), SUM(DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO), SUM(DVDE_CONSUMO)
            FROM DEVOLUCIONES_VENTAS_DETALLE F
            WHERE F.DEVT_ID = :IDDOC 
            INTO :IMPTOS, :MONTO, :VALORADIC;
        if (FOMENTO = 'SI') then
            MONTO = MONTO + VALORADIC;
        MONTO = MONTO * -1;
        MONTO = MONTO * FACTOR;
        IMPTOS = IMPTOS * FACTOR;
        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
        execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
        if (IMPTOS <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTAIVA, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'I') then
                BEGIN
                 $$IBE$$*/ /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */ /*$$IBE$$ 
                FOR SELECT F.ARTI_COD, (cast(DVDE_CANT as double precision) * (DVDE_PRUNIT-DVDE_DTOMONTO)), DVDE_IVAMONTO, TAIV_PORC, DVDE_CONSUMO
                    FROM ARTICULO A, DEVOLUCIONES_VENTAS_DETALLE F, TARIFA_IVA T
                    WHERE F.DEVT_ID = :IDDOC AND A.TAIV_COD = T.TAIV_COD
                    INTO :ART, :MONTO, :IMPTOS, :PORCIVA, :VALORADIC
                    DO
                    BEGIN
                    if (IMPINC = 'S') then
                        MONTO = MONTO - IMPTOS - VALORADIC;
                    MONTO = MONTO * -1;
                    MONTO = MONTO * FACTOR;
                    IMPTOS = IMPTOS * FACTOR;
                    execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                    execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                    if (IMPTOS <> 0) then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', :IMPTOS, 0, :MONTO, :PORCIVA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        SUMA = SUMA + IMPTOS;
                        END
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                NROI = NROI + 1;
                SUMA = SUMA + IMPTOS;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA + IMPTOS;
                END
            END  $$IBE$$*/ /* IMPTOS <> 0 */ /*$$IBE$$ 
        END  $$IBE$$*/ /* IVA EN CTA CONSTANTE */
    /* EL IMPOCONSUMO */ /*$$IBE$$ 
    if ((CONSUMO = 'A') AND (FOMENTO <> 'SI')) then
        BEGIN
        FOR SELECT MAX(COAR_CTACONS), SUM(DVDE_CONSUMO)
            FROM ARTICULO A, CONTABIL_ARTICULO C, DEVOLUCIONES_VENTAS_DETALLE F
            WHERE F.DEVT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD
            GROUP BY COAR_CTACONS
            INTO :CTACONSUMO, :IMPTOS
        DO
            BEGIN
            if (IMPTOS <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTACONSUMO, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                     $$IBE$$*/ /* ES UNA CUENTA DE INVENTARIO, REGISTRE UNO A UNO LOS ARTICULOS */ /*$$IBE$$ 
                    FOR SELECT F.ARTI_COD, DVDE_CONSUMO
                        FROM ARTICULO A, CONTABIL_ARTICULO C, DEVOLUCIONES_VENTAS_DETALLE F
                        WHERE F.DEVT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTACONS = :CUENTA
                        INTO :ART, :IMPTOS
                    DO
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 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, :NROI, :CUENTA, :CONC, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                    NROI = NROI + 1;
                    SUMA = SUMA + IMPTOS;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA + IMPTOS;
                    END
                END  $$IBE$$*/ /* IMPTOS <> 0 */ /*$$IBE$$ 
            END  $$IBE$$*/ /* FOR */ /*$$IBE$$ 
        END  $$IBE$$*/ /* CONSUMO X ARTICULO */ /*$$IBE$$ 
    if ((CONSUMO = 'K') AND (FOMENTO <> 'SI')) then
        BEGIN
        SELECT SUM(DVDE_CONSUMO)
            FROM DEVOLUCIONES_VENTAS_DETALLE F
            WHERE F.DEVT_ID = :IDDOC 
            INTO :IMPTOS;
        if (IMPTOS <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTACONSUMO, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'I') then
                BEGIN
                 $$IBE$$*/ /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */ /*$$IBE$$ 
                FOR SELECT F.ARTI_COD, DVDE_CONSUMO
                    FROM ARTICULO A, DEVOLUCIONES_VENTAS_DETALLE F
                    WHERE F.DEVT_ID = :IDDOC 
                    INTO :ART, :IMPTOS
                    DO
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTACONSUMO, :CONC, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                    NROI = NROI + 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, :NROI, :CTACONSUMO, :CONC, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA + IMPTOS;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTACONSUMO, :CONC, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA + IMPTOS;
                END
            END  $$IBE$$*/ /* IMPTOS <> 0 */ /*$$IBE$$ 
        END  $$IBE$$*/ /* CONSUMO EN CTA CONSTANTE */
    /* DESCUENTO */ /*$$IBE$$ 
    if ((CTADTO IS NOT NULL) AND
        (CTADTO <> '') AND
        (VRDTO <> 0)) THEN
        BEGIN
        EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTADTO, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRDTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
            NROI = NROI + 1;
            SUMA = SUMA - VRDTO;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRDTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 33);
            NROI = NROI + 1;
            SUMA = SUMA - VRDTO;
            END
        END  $$IBE$$*/ /* DESCUENTO */
    /* VALOR ADIC */ /*$$IBE$$ 
    if ((CTAADIC IS NOT NULL) AND
        (CTAADIC <> '') AND
        (VRADIC <> 0)) THEN
        BEGIN
        EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTAADIC, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRADIC, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
            NROI = NROI + 1;
            SUMA = SUMA + VRADIC;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRADIC, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 33);
            NROI = NROI + 1;
            SUMA = SUMA + VRADIC;
            END
        END  $$IBE$$*/ /* VR. ADIC */
    /* VALOR EXTRA */ /*$$IBE$$ 
    if ((CTAEXTRA IS NOT NULL) AND
        (CTAEXTRA <> '') AND
        (VREXTRA <> 0)) THEN
        BEGIN
        EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTAEXTRA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VREXTRA, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
            NROI = NROI + 1;
            SUMA = SUMA + VREXTRA;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VREXTRA, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 33);
            NROI = NROI + 1;
            SUMA = SUMA + VREXTRA;
            END
        END  $$IBE$$*/ /* VR. EXTRA */
    /* RETENCION FUENTE */ /*$$IBE$$ 
    if ((RTFTE = 'C') or (RTFTE = 'K')) then
      if (VRRTFTE <> 0) then
        BEGIN
        if (RTFTE = 'C') then
            CTARTFTE = TCTARTFTE;
        EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTARTFTE, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, (:VRSUBT*-1), :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
            NROI = NROI + 1;
            SUMA = SUMA - VRRTFTE;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, (:VRSUBT*-1), :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA - VRRTFTE;
            END
         $$IBE$$*/ /* AUTORETENCION */ /*$$IBE$$ 
        if (FAUTORET <= fecaux) then
            BEGIN
            EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'CUENTA DE AUTORETENCION EN LA FUENTE') returning_values (CTARTFTE);
            EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTARTFTE, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :VRSUBT, :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                NROI = NROI + 1;
                SUMA = SUMA + VRRTFTE;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :VRSUBT, :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA + VRRTFTE;
                END
            END
        END  $$IBE$$*/ /* RTFTE */ /*$$IBE$$ 
    if (RTFTE = 'A') then
      BEGIN
      FOR SELECT MAX(COAR_CTARTFTEV), MAX(COAR_RTFTE), MIN(COAR_RTBASE), SUM(DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO), SUM((DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO)*COAR_RTFTE)
        FROM CONTABIL_ARTICULO C, devoluciones_ventas_detalle F
        WHERE F.devt_id = :IDDOC AND F.ARTI_COD = C.ARTI_COD
        GROUP BY COAR_CTARTFTEV
        INTO :CTARTFTE, :PRTFTE, :baseadic, :MONTO, :VRRTFTE
        DO
        BEGIN
        MONTO = MONTO * FACTOR;
        if (MONTO >= BASEADIC) then
            BEGIN
            VRRTFTE = VRRTFTE * FACTOR / 100;
            execute procedure redondee(VRRTFTE, DIG) returning_values (VRRTFTE);
            execute procedure redondee(MONTO, DIG) returning_values (MONTO);
            if (VRRTFTE <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTARTFTE, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, (:MONTO*-1), :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                    NROI = NROI + 1;
                    SUMA = SUMA - VRRTFTE;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, (:MONTO*-1), :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA - VRRTFTE;
                    END
                 $$IBE$$*/ /* AUTORETENCION */ /*$$IBE$$ 
                if (FAUTORET <= fecaux) then
                    BEGIN
                    EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'CUENTA DE AUTORETENCION EN LA FUENTE') returning_values (CTARTFTE);
                    EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTARTFTE, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
                    if (ERRORC <> 0) then
                        ERROR = ERROR + 1;
                    if (TIPOCUEN = 'C') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :MONTO, :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                        NROI = NROI + 1;
                        SUMA = SUMA + VRRTFTE;
                        END
                    if (TIPOCUEN = 'N') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :MONTO, :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NROI = NROI + 1;
                        SUMA = SUMA + VRRTFTE;
                        END
                    END
                END
            END
        END  $$IBE$$*/ /* RTFTE */ /*$$IBE$$ 
      END
     $$IBE$$*/ /* RETENCION IVA */ /*$$IBE$$ 
    if ((RTIVA = 'C') or (RTIVA = 'K')) then
      if (VRRTIVA <> 0) then
        BEGIN
        if (RTIVA = 'C') then
            CTARTIVA = TCTARTIVA;
        EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTARTIVA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTIVA, (:VRIVA*-1), :PORC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
            NROI = NROI + 1;
            SUMA = SUMA - VRRTIVA;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTIVA, (:VRIVA*-1), :PORC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA - VRRTIVA;
            END
        END  $$IBE$$*/ /* RTIVA */
    /* RETENCION DE ICA */ /*$$IBE$$ 
    if ((RTICA = 'C') or (RTICA = 'K')) then
      if (VRRTICA <> 0) then
        BEGIN
        if (RTICA = 'C') then
            CTARTICA = TCTARTICA;
        EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTARTICA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTICA, (:VRSUBT*-1), :PRTICA, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
            NROI = NROI + 1;
            SUMA = SUMA - VRRTICA;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTICA, (:VRSUBT*-1), :PRTICA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA - VRRTICA;
            END
        END  $$IBE$$*/ /* RTICA */
    /* CIERRE EL COMPROBANTE CONTRA LA CUENTA DEL TERCERO O LA CONSTANTE */ /*$$IBE$$ 
    if ((SUMA <> 0) and ((CARTERA = 'C') or (CARTERA = 'K') or (CARTERA = 'J'))) then
        BEGIN
        if (SUMA < 0) then
            BEGIN
            DEBITO = SUMA * -1;
            CREDITO = 0;
            END
        ELSE
            BEGIN
            DEBITO = 0;
            CREDITO = SUMA;
            END
        if (CARTERA = 'C') then
            CTACARTERA = TCTACLIEN;
        if (CARTERA = 'J') then
            BEGIN
             $$IBE$$*/ /* BUSQUE LA CUENTA DE LA CAJA */ /*$$IBE$$ 
            SELECT CAJA_CUENTA FROM CAJAS C, PUNTO_VENTA P
                WHERE P.CAJA_ID = C.CAJA_ID AND PTVT_ID = :PTOVTA
                INTO :CTACARTERA;
            END
        EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTACARTERA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :DEBITO, :CREDITO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
        if (TIPOCUEN = 'N') then
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :DEBITO, :CREDITO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
        NROI = NROI + 1;
        END  $$IBE$$*/ /* SUMA EN CARTERA */
    /* CALCULE COSTOS EN VENTAS */ /*$$IBE$$ 
    EXECUTE PROCEDURE COSTO_EN_VENTAS(33, :IDDOC);
    if (COSTOS = 'A') then
        BEGIN
        FOR SELECT MAX(CTACOS), SUM(cast(CANT as double precision) * COSTO)
            FROM COSTO_VENTAS
            GROUP BY CTACOS
            INTO :CTACOSTOS, :MONTO
        DO
            BEGIN
            if (MONTO <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTACOSTOS, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                     $$IBE$$*/ /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */ /*$$IBE$$ 
                    FOR SELECT ARTI_COD, cast(CANT as double precision) * COSTO
                        FROM COSTO_VENTAS
                        WHERE CTACOS = :CUENTA
                        INTO :ART, :MONTO
                    DO
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                    NROI = NROI + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    END
                END  $$IBE$$*/ /* MONTO <> 0 */ /*$$IBE$$ 
            END  $$IBE$$*/ /* FOR */ /*$$IBE$$ 
        END  $$IBE$$*/ /* COSTOS */ /*$$IBE$$ 
    if (COSTOS = 'K') then
        BEGIN
        SELECT SUM(cast(CANT as double precision) * COSTO)
            FROM COSTO_VENTAS
            INTO :MONTO;
        if (MONTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTACOSTOS, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'I') then
                BEGIN
                 $$IBE$$*/ /* ES UNA CUENTA DE INVENTARIO, REGISTRE UNO A UNO LOS ARTICULOS */ /*$$IBE$$ 
                FOR SELECT ARTI_COD, cast(CANT as double precision) * COSTO
                    FROM COSTO_VENTAS
                    INTO :ART, :MONTO
                DO
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTACOSTOS, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                    NROI = NROI + 1;
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTACOSTOS, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                NROI = NROI + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTACOSTOS, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                END
            END  $$IBE$$*/ /* MONTO <> 0 */ /*$$IBE$$ 
        END  $$IBE$$*/ /* COSTOS = K */ /*$$IBE$$ 
    if (INVEN = 'A') then
        BEGIN
        FOR SELECT MAX(CTAINV), SUM(cast(CANT as double precision) * COSTO)
            FROM COSTO_VENTAS
            GROUP BY CTAINV
            INTO :CTAINVEN, :MONTO
        DO
            BEGIN
            if (MONTO <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTAINVEN, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                     $$IBE$$*/ /* ES UNA CUENTA DE INVENTARIO, REGISTRE UNO A UNO LOS ARTICULOS */ /*$$IBE$$ 
                    FOR SELECT ARTI_COD, cast(CANT as double precision) * COSTO
                        FROM COSTO_VENTAS
                        WHERE CTAINV = :CUENTA
                        INTO :ART, :MONTO
                    DO
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                    NROI = NROI + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    END
                END  $$IBE$$*/ /* MONTO <> 0 */ /*$$IBE$$ 
            END  $$IBE$$*/ /* FOR */ /*$$IBE$$ 
        END  $$IBE$$*/ /* INVEN = A */ /*$$IBE$$ 
    if (INVEN = 'K') then
        BEGIN
        SELECT SUM(cast(CANT as double precision) * COSTO)
            FROM COSTO_VENTAS
            INTO :MONTO;
        if (MONTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTAINVEN, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'I') then
                BEGIN
                 $$IBE$$*/ /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */ /*$$IBE$$ 
                FOR SELECT ARTI_COD, cast(CANT as double precision) * COSTO
                    FROM COSTO_VENTAS
                    INTO :ART, :MONTO
                DO
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTAINVEN, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                    NROI = NROI + 1;
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAINVEN, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                NROI = NROI + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAINVEN, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                END
            END  $$IBE$$*/ /* MONTO <> 0 */ /*$$IBE$$ 
        END  $$IBE$$*/ /* INVEN = K */
    /* recorra las cuentas adicionales */ /*$$IBE$$ 
    FOR SELECT INVC_CUENTA, INVC_BASE, INVC_PORC, INVC_VALOR, INVC_DB
        FROM INTERFAZ_VENTAS_CTAS WHERE INVE_ID = :IDINTER
        INTO :CTADIC, :BASEADIC, :PORCADIC, :VALORADIC, :DBADIC
        DO
        BEGIN
        if (valoradic <> 0) then
            monto = valoradic;
        else
            BEGIN
            if (:BASEADIC = 'SUBTOTAL') then
                VALORADIC = vrsubt;
            if (:BASEADIC = 'DESCUENTO') then
                VALORADIC = VRDTO;
            if (:BASEADIC = 'IVA') then
                VALORADIC = VRIVA;
            if (:BASEADIC = 'ADICIONAL') then
                VALORADIC = VRADIC;
            if (:BASEADIC = 'EXTRA') then
                VALORADIC = VREXTRA;
            if (:BASEADIC = 'TOTAL') then
                VALORADIC = VRTOTAL;
            MONTO = VALORADIC * PORCADIC;
            END
        if (MONTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTADIC, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                if (DBADIC = 'S') then
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                ELSE
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                NROI = NROI + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                if (DBADIC = 'S') then
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                ELSE
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                END
            NROI = NROI + 1;
            END
        END
    if (error > 0) then
        ver = 'S';
    SUSPEND;
    END
   END  $$IBE$$*/ /* EXISTE LA INTERFAZ */ /*$$IBE$$ 
  ELSE
    BEGIN
    EXECUTE PROCEDURE ERROR (33, :IDDOC, :PREF, 1);
    ERROR = ERROR + 1;
    VER = 'S';
    SUSPEND;
    END
 $$IBE$$*/ SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE CONTABIL_FACTURA(
    IDDOC INTEGER,
    IDINTER INTEGER)
RETURNS (
    ERROR INTEGER,
    VER CHAR(1),
    IDC INTEGER)
AS
declare variable pref varchar(4);
declare variable num varchar(6);
declare variable numero varchar(10);
declare variable fecaux date;
declare variable fecha char(8);
declare variable conc varchar(60);
declare variable venceaux date;
declare variable vence char(8);
declare variable vrdto numeric(18,2);
declare variable vradic numeric(18,2);
declare variable vrsubt numeric(18,2);
declare variable vriva numeric(18,2);
declare variable prtfte numeric(9,2);
declare variable vrrtfte numeric(18,2);
declare variable vrrtiva numeric(18,2);
declare variable prtica numeric(9,2);
declare variable vrrtica numeric(18,2);
declare variable vrtotal numeric(18,2);
declare variable vrextra numeric(18,2);
declare variable tipocomp varchar(3);
declare variable prefcont varchar(4);
declare variable ventas char(1);
declare variable ctaventas varchar(20);
declare variable iva char(1);
declare variable ctaiva varchar(20);
declare variable consumo char(1);
declare variable ctaconsumo varchar(20);
declare variable cartera char(1);
declare variable ctacartera varchar(20);
declare variable rtfte char(1);
declare variable ctartfte varchar(20);
declare variable rtiva char(1);
declare variable ctartiva varchar(20);
declare variable rtica char(1);
declare variable ctartica varchar(20);
declare variable inven char(1);
declare variable ctainven varchar(20);
declare variable costos char(1);
declare variable ctacostos varchar(20);
declare variable ctadto varchar(20);
declare variable ctaadic varchar(20);
declare variable ctaextra varchar(20);
declare variable existe char(1);
declare variable cuenta varchar(20);
declare variable monto numeric(18,2);
declare variable tipocuen char(1);
declare variable nit varchar(20);
declare variable nombre varchar(60);
declare variable proy varchar(4);
declare variable centro varchar(4);
declare variable porc numeric(5,2);
declare variable debito numeric(18,2);
declare variable credito numeric(18,2);
declare variable nroi integer;
declare variable art varchar(15);
declare variable imptos numeric(18,2);
declare variable suma numeric(18,2);
declare variable porciva numeric(9,2);
declare variable tctaclien varchar(20);
declare variable tctaventa varchar(20);
declare variable tctartfte varchar(20);
declare variable tctartiva varchar(20);
declare variable tctartica varchar(20);
declare variable ctadic varchar(20);
declare variable baseadic varchar(20);
declare variable porcadic numeric(5,2);
declare variable valoradic numeric(18,2);
declare variable dbadic char(1);
declare variable ptovta integer;
declare variable anulado char(1);
declare variable dig integer;
declare variable mercancia numeric(18,2);
declare variable fomento varchar(2);
declare variable DTOXIT varchar(2);
declare variable vrconsumo numeric(18,2);
declare variable factor double precision;
declare variable cent char(1);
declare variable AUTORET VARCHAR(10);
declare variable FAUTORET DATE;
declare variable ERRORC INTEGER;
BEGIN /*$$IBE$$ 
EXECUTE PROCEDURE LEE_CONFIGURACION('COMPRAS', 'FACTURAS', 'USAR IMPOCONSUMO COMO PORCENTAJE DE FOMENTO') returning_values (FOMENTO);
EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'FECHA AUTORETENEDOR NO DESCONTAR RETENCIONES DEL SALDO PERO SI CONTABILIZARLAS') returning_values (AUTORET);
if (AUTORET <> '') then
    FAUTORET = CAST(AUTORET AS DATE);
else
    FAUTORET = '9999/12/31';
 $$IBE$$*/ /* BUSQUE LA INTERFACE */ /*$$IBE$$ 
EXISTE = 'N';
SELECT 'S', TICO_COD, PRCO_PRE, INVE_VENTAS, INVE_IVA, INVE_CONSUMO, INVE_CARTERA, INVE_RTFTE, INVE_RTIVA, INVE_RTICA, INVE_COSTO, INVE_INVEN, INVE_CTAVENTAS, INVE_CTAIVA, INVE_CTACONSUMO, INVE_CTADTO, INVE_CTAADIC, INVE_CTAEXTRA, INVE_CTACARTERA, INVE_CTARTFTE, INVE_CTARTIVA, INVE_CTARTICA, INVE_CTAINVEN, INVE_CTACOSTOS, INVE_CONFIRMAR, INVE_CENTRO
    FROM INTERFAZ_VENTAS
    WHERE INVE_ID = :IDINTER
    INTO :EXISTE, :TIPOCOMP, :PREFCONT, :VENTAS, :IVA, :CONSUMO, :CARTERA, :RTFTE, :RTIVA, :RTICA, :COSTOS, :INVEN, :CTAVENTAS, :CTAIVA, :CTACONSUMO, :CTADTO, :CTAADIC, :CTAEXTRA, :CTACARTERA, :CTARTFTE, :CTARTIVA, :CTARTICA, :CTAINVEN, :CTACOSTOS, :VER, :CENT;
if (EXISTE = 'S') then
  BEGIN
     $$IBE$$*/ /* BORRE CUALQUEIR CONTABILIZACION PREVIA */ /*$$IBE$$ 
    DELETE FROM CONTABILIZACION WHERE CNTB_TIPOREF = 31 AND CNTB_IDREF = :IDDOC;

   $$IBE$$*/ /* TRAIGA EL ENCABEZADO DE LA FACTURA */ /*$$IBE$$ 
  SELECT PREF_PRE, FACT_NUMERO, FACT_FECHA, F.TERC_NIT, PTVT_ID, FACT_VENCE, FACT_DTOMONTO, FACT_ADICIONAL, FACT_IVAMONTO, FACT_EXTRA, FACT_TOTAL, FACT_RTFTEPOR, FACT_RTFTEMONTO, FACT_RTIVAPOR, FACT_RTIVAMONTO, FACT_RTICAPOR, FACT_RTICAMONTO, FACT_NOMCLIENTE, TERC_CTARTFTE, TERC_CTARTIVA, TERC_CTARTICA, TERC_CTAVENTA, TERC_CTACLIENTE, FACT_ANULADO
        FROM FACTURAS F, TERCEROS T
        WHERE FACT_ID = :IDDOC AND F.TERC_NIT = T.TERC_NIT
        INTO :PREF, :NUM, :FECAUX, :NIT, :PTOVTA, :VENCEAUX, :VRDTO, :VRADIC, :VRIVA, :VREXTRA, :VRTOTAL, :PRTFTE, :VRRTFTE, :PORC, :VRRTIVA, :PRTICA, :VRRTICA, :NOMBRE, TCTARTFTE, TCTARTIVA, TCTARTICA, TCTAVENTA, TCTACLIEN, ANULADO;
  if (ANULADO = 'N') then
    BEGIN
     $$IBE$$*/ /* BUSQUE EL CENTRO DEL PUNTO, LA BODEGA, O EL PREFIJO  */ /*$$IBE$$ 
    IF (CENT = 'B') THEN
        SELECT B.BODE_CENTRO, B.BODE_PROY FROM BODEGA B, FACTURAS F
            WHERE B.BODE_COD = F.BODE_COD AND F.FACT_ID = :IDDOC INTO :CENTRO, :PROY;
    IF (CENT = 'V') THEN
        SELECT V.CENT_COD, V.PROY_COD FROM VENDEDORES V, FACTURAS F
            WHERE V.VEND_COD = F.VEND_COD AND F.FACT_ID = :IDDOC INTO :CENTRO, :PROY;
    IF (CENT = 'P') THEN
        SELECT P.PREF_CENTRO,P.PREF_PROY  FROM PREFIJOS P, FACTURAS F
            WHERE P.PREF_PRE = F.PREF_PRE AND F.FACT_ID = :IDDOC AND P.TIDO_COD = 31 INTO :CENTRO, :PROY;
    NUMERO = PREF || NUM;
    SELECT SUM (FADE_CONSUMO) FROM FACTURAS_DETALLE WHERE FACT_ID = :IDDOC INTO MERCANCIA;
    VRSUBT = VRTOTAL - VREXTRA - VRIVA - MERCANCIA;  $$IBE$$*/ /* BASE DE RETEFTE Y RETEICA */ /*$$IBE$$ 

    EXECUTE PROCEDURE lee_configuracion ('FACTURACION', 'FACTURAS', 'DESCUENTO PIE FACTURA IGUAL A SUMA DE DESCUENTOS POR ITEM') returning_values (:DTOXIT);
    if (DTOXIT = 'SI') then
        VRDTO = 0;
    MERCANCIA = VRSUBT - VRADIC + VRDTO;
    EXECUTE PROCEDURE FECHA_A_CONTA(:FECAUX) returning_values (:FECHA);
    EXECUTE PROCEDURE FECHA_A_CONTA(:VENCEAUX) returning_values (:VENCE);
     $$IBE$$*/ /* REGISTRE EL ENCABEZADO CONTABLE */ /*$$IBE$$ 
    IDC = GEN_ID(ID_CONTABILIZA, 1);
    if (STRLEN(NOMBRE)> 43 ) then
      CONC = 'FV No.' || NUMERO || '-' || SUBSTR(NOMBRE,1,43);
    ELSE
      CONC = 'FV No.' || NUMERO || '-' || NOMBRE;
    INSERT INTO CONTABILIZACION (CNTB_ID, CNTB_TIPOCOMP, CNTB_PREFCNT, CNTB_NUMERO, CNTB_FECHA, CNTB_CONCEPTO, CNTB_REF, CNTB_TIPOREF, CNTB_IDREF, CNTB_PREFREF, CNTB_NUMREF, CNTB_PROCESADO)
        VALUES (:IDC, :TIPOCOMP, :PREFCONT, :NUM, :FECHA, :CONC, '', 31, :IDDOC, :PREF, :NUM, 'N');
    NROI = 0;
    SUMA = 0;
    ERROR = 0;
     $$IBE$$*/ /* SI NO HAY CUENTA DE DESCUENTO NI ADICIONAL CALCULE UN FACTOR PARA LAS VENTAS Y EL IVA */ /*$$IBE$$ 
    if (MERCANCIA <> 0) then
        FACTOR = CAST(VRSUBT AS DOUBLE PRECISION) / CAST(MERCANCIA AS DOUBLE PRECISION);
    ELSE
        FACTOR = 1;
     $$IBE$$*/ /* TRAIGA EL NUMERO DE DIGITOS PARA EL REDONDEO */ /*$$IBE$$ 
    SELECT CAST(CONF_VALOR AS INTEGER) FROM CONFIGURACION WHERE CONF_MODULO = 'FACTURACION' AND
        CONF_CATEGORIA = 'GENERAL' AND CONF_PROPIEDAD = 'REDONDEO AL MULTIPLO DE DIEZ EN TOTALES' INTO :DIG;
     $$IBE$$*/ /* CUENTAS DE VENTAS */ /*$$IBE$$ 
    if (VENTAS = 'A') then
        BEGIN
        FOR SELECT MAX(COAR_CTAVNT), SUM(FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), SUM(FADE_IVAMONTO), SUM(FADE_CONSUMO)
            FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_DETALLE F
            WHERE F.FACT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD
            GROUP BY COAR_CTAVNT
            INTO :CTAVENTAS, :MONTO, :IMPTOS, :VRCONSUMO
            DO
            BEGIN
            if (FOMENTO = 'SI') then
                MONTO = MONTO + VRCONSUMO;
            if ((CTADTO IS NULL) OR (CTADTO = '')) then
                MONTO = MONTO * FACTOR;
            execute procedure redondee(MONTO, DIG) returning_values (MONTO);
            if (MONTO <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTAVENTAS, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                     $$IBE$$*/ /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */ /*$$IBE$$ 
                    FOR SELECT F.ARTI_COD, (FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), FADE_CONSUMO
                        FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_DETALLE F
                        WHERE F.FACT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTAINV = :CUENTA
                        INTO :ART, :MONTO, :IMPTOS
                    DO
                        BEGIN
                        if (FOMENTO = 'SI') then
                            MONTO = MONTO + IMPTOS;
                        if ((CTADTO IS NULL) OR (CTADTO = '')) then
                            MONTO = MONTO * FACTOR;
                        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                        if (MONTO <> 0) then
                            BEGIN
                            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                            NROI = NROI + 1;
                            SUMA = SUMA - MONTO;
                            END
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    NROI = NROI + 1;
                    SUMA = SUMA - MONTO;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA - MONTO;
                    END
                END  $$IBE$$*/ /* MONTO <> 0 */ /*$$IBE$$ 
            END  $$IBE$$*/ /* FOR */ /*$$IBE$$ 
        END  $$IBE$$*/ /* VENTAS X ARTICULO */ /*$$IBE$$ 
     IF ((VENTAS = 'C') OR (VENTAS = 'K')) THEN
        BEGIN
        IF (VENTAS = 'C') THEN
            CTAVENTAS = TCTAVENTA;
        SELECT SUM(FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), SUM(FADE_IVAMONTO), SUM (FADE_CONSUMO)
            FROM FACTURAS_DETALLE F
            WHERE F.FACT_ID = :IDDOC 
            INTO :MONTO, :IMPTOS, :VRCONSUMO;
        if (FOMENTO = 'SI') then
            MONTO = MONTO + VRCONSUMO;
        if ((CTADTO IS NULL) OR (CTADTO = '')) then
            MONTO = MONTO * FACTOR;
        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
        if (MONTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTAVENTAS, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'I') then
                BEGIN
                 $$IBE$$*/ /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */ /*$$IBE$$ 
                FOR SELECT F.ARTI_COD, (FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), FADE_CONSUMO
                    FROM ARTICULO A, FACTURAS_DETALLE F
                    WHERE F.FACT_ID = :IDDOC 
                    INTO :ART, :MONTO, :IMPTOS
                    DO
                    BEGIN
                    if (FOMENTO = 'SI') then
                        MONTO = MONTO + VRCONSUMO;
                    if ((CTADTO IS NULL) OR (CTADTO = '')) then
                        MONTO = MONTO * FACTOR;
                    execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                    if (MONTO <> 0) then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        SUMA = SUMA - MONTO;
                        END
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - MONTO;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - MONTO;
                END
            END  $$IBE$$*/ /* MONTO <> 0 */ /*$$IBE$$ 
        END  $$IBE$$*/ /* VENTAS DE CLIENTE O CONSTANTE */
    /* EL IVA EN VENTAS */ /*$$IBE$$ 
    if (IVA = 'A') then
        BEGIN
        FOR SELECT MAX(COAR_CTAIVAV), SUM(FADE_IVAMONTO), SUM(FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), sum(FADE_CONSUMO)
            FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_DETALLE F
            WHERE F.FACT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD
            GROUP BY COAR_CTAIVAV
            INTO :CTAIVA, :IMPTOS, :MONTO, :VALORADIC
        DO
            BEGIN
            if (FOMENTO = 'SI') then
                MONTO = MONTO + VALORADIC;
            MONTO = MONTO * -1;
            MONTO = MONTO * FACTOR;
            IMPTOS = IMPTOS * FACTOR;
            execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
            execute procedure redondee(MONTO, DIG) returning_values (MONTO);
            if (IMPTOS <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTAIVA, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                     $$IBE$$*/ /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */ /*$$IBE$$ 
                    FOR SELECT F.ARTI_COD, FADE_IVAMONTO, (FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), TAIV_PORC, FADE_CONSUMO
                        FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_DETALLE F, TARIFA_IVA T
                        WHERE F.FACT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTAIVAV = :CUENTA AND A.TAIV_COD = T.TAIV_COD
                        INTO :ART, :IMPTOS, :MONTO, :PORCIVA, :VALORADIC
                    DO
                        BEGIN
                        if (FOMENTO = 'SI') then
                            MONTO = MONTO + VALORADIC;
                        MONTO = MONTO * -1;
                        MONTO = MONTO * FACTOR;
                        IMPTOS = IMPTOS * FACTOR;
                        execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                        if (IMPTOS <> 0) then
                            BEGIN
                            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, :MONTO, :PORCIVA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                            NROI = NROI + 1;
                            SUMA = SUMA + DEBITO - CREDITO;
                            END
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, :MONTO, ABS(:IMPTOS*100/:MONTO), :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    NROI = NROI + 1;
                    SUMA = SUMA - IMPTOS;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, :MONTO, ABS(:IMPTOS*100/:MONTO), :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA - IMPTOS;
                    END
                END    $$IBE$$*/ /* IMPTOS <> 0 */ /*$$IBE$$ 
            END  $$IBE$$*/ /* FOR */ /*$$IBE$$ 
        END  $$IBE$$*/ /* IVA X ARTICULO */ /*$$IBE$$ 
    if (IVA = 'K') then  $$IBE$$*/ /* IVA EN CTA CONSTANTE */ /*$$IBE$$ 
        BEGIN
        SELECT SUM(FADE_IVAMONTO), SUM(FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), SUM(FADE_CONSUMO)
            FROM FACTURAS_DETALLE F
            WHERE F.FACT_ID = :IDDOC and FADE_IVAMONTO <> 0
            INTO :IMPTOS, :MONTO, :valoradic;
        if (FOMENTO = 'SI') then
            MONTO = MONTO + VALORADIC;
        MONTO = MONTO * -1;
        MONTO = MONTO * FACTOR;
        IMPTOS = IMPTOS * FACTOR;
        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
        execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
        if (IMPTOS <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTAIVA, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'I') then
                BEGIN
                 $$IBE$$*/ /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */ /*$$IBE$$ 
                FOR SELECT F.ARTI_COD, (FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), FADE_IVAMONTO, TAIV_PORC, FADE_CONSUMO
                    FROM ARTICULO A, FACTURAS_DETALLE F, TARIFA_IVA T
                    WHERE F.FACT_ID = :IDDOC AND A.TAIV_COD = T.TAIV_COD
                    INTO :ART, :MONTO, :IMPTOS, :PORCIVA, :VALORADIC
                    DO
                    BEGIN
                    if (FOMENTO = 'SI') then
                        MONTO = MONTO + VALORADIC;
                    MONTO = MONTO * -1;
                    MONTO = MONTO * FACTOR;
                    IMPTOS = IMPTOS * FACTOR;
                    execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                    execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                    if (IMPTOS <> 0) then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', 0, :IMPTOS, :MONTO, :PORCIVA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        SUMA = SUMA - IMPTOS;
                        END
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', 0, :IMPTOS, :MONTO, ABS(:IMPTOS*100/:MONTO), :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - IMPTOS;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', 0, :IMPTOS, :MONTO, ABS(:IMPTOS*100/:MONTO), :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - IMPTOS;
                END
            END  $$IBE$$*/ /* IMPTOS <> 0 */ /*$$IBE$$ 
        END  $$IBE$$*/ /* IVA EN CTA CONSTANTE */
    /* EL IMPOCONSUMO */ /*$$IBE$$ 
    if ((CONSUMO = 'A') AND (FOMENTO <> 'SI')) then
        BEGIN
        FOR SELECT MAX(COAR_CTACONS), SUM(FADE_CONSUMO)
            FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_DETALLE F
            WHERE F.FACT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD
            GROUP BY COAR_CTACONS
            INTO :CTACONSUMO, :IMPTOS
        DO
            BEGIN
            execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
            if (IMPTOS <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTACONSUMO, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                     $$IBE$$*/ /* ES UNA CUENTA DE INVENTARIO, REGISTRE UNO A UNO LOS ARTICULOS */ /*$$IBE$$ 
                    FOR SELECT F.ARTI_COD, FADE_CONSUMO
                        FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_DETALLE F
                        WHERE F.FACT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTACONS = :CUENTA
                        INTO :ART, :IMPTOS
                    DO
                        BEGIN
                        execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                        if (IMPTOS <> 0) then
                            BEGIN
                            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                            NROI = NROI + 1;
                            SUMA = SUMA - IMPTOS;
                            END
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    NROI = NROI + 1;
                    SUMA = SUMA - IMPTOS;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA - IMPTOS;
                    END
                END  $$IBE$$*/ /* IMPTOS <> 0 */ /*$$IBE$$ 
            END  $$IBE$$*/ /* FOR */ /*$$IBE$$ 
        END  $$IBE$$*/ /* CONSUMO X ARTICULO */ /*$$IBE$$ 
    if ((CONSUMO = 'K') AND (FOMENTO <> 'SI')) then  $$IBE$$*/ /* CONSUMO EN CTA CONSTANTE */ /*$$IBE$$ 
        BEGIN
        SELECT SUM(FADE_CONSUMO)
            FROM FACTURAS_DETALLE F
            WHERE F.FACT_ID = :IDDOC 
            INTO :IMPTOS;
        execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
        if (IMPTOS <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTACONSUMO, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'I') then
                BEGIN
                 $$IBE$$*/ /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */ /*$$IBE$$ 
                FOR SELECT F.ARTI_COD, FADE_CONSUMO
                    FROM ARTICULO A, FACTURAS_DETALLE F
                    WHERE F.FACT_ID = :IDDOC 
                    INTO :ART, :IMPTOS
                    DO
                    BEGIN
                    execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                    if (IMPTOS <> 0) then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CTACONSUMO, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        SUMA = SUMA - IMPTOS;
                        END
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTACONSUMO, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - IMPTOS;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTACONSUMO, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - IMPTOS;
                END
            END  $$IBE$$*/ /* IMPTOS <> 0 */ /*$$IBE$$ 
        END  $$IBE$$*/ /* CONSUMO EN CTA CONSTANTE */
    /* DESCUENTO */ /*$$IBE$$ 
    if ((CTADTO IS NOT NULL) AND (CTADTO <> '')) then
        BEGIN
        execute procedure redondee(VRDTO, DIG) returning_values (VRDTO);
        if (VRDTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTADTO, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRDTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA + VRDTO;
                END
            if (TIPOCUEN = 'N') then
                    BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRDTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA + VRDTO;
                END
            END
        END  $$IBE$$*/ /* DESCUENTO */
    /* VALOR ADIC */ /*$$IBE$$ 
    if ((CTAADIC IS NOT NULL) AND (CTAADIC <> '')) then
        BEGIN
        execute procedure redondee(VRADIC, DIG) returning_values (VRADIC);
        if (VRADIC <> 0) THEN
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTAADIC, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRADIC, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - VRADIC;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRADIC, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - VRADIC;
                END
            END
        END  $$IBE$$*/ /* VR. ADIC */
    /* VALOR EXTRA */ /*$$IBE$$ 
    if ((CTAEXTRA IS NOT NULL) AND (CTAEXTRA <> '')) THEN
        BEGIN
        execute procedure redondee(VREXTRA, DIG) returning_values (VREXTRA);
        if (VREXTRA <> 0) THEN
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTAEXTRA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VREXTRA, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - VREXTRA;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VREXTRA, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - VREXTRA;
                END
            END
        END  $$IBE$$*/ /* VR. EXTRA */
    /* DESCUENTE EL IMPOCONSUMO */ /*$$IBE$$ 
    SELECT SUM(FADE_CONSUMO)
        FROM FACTURAS_DETALLE F WHERE F.FACT_ID = :IDDOC INTO :IMPTOS;
    vrsubt = vrsubt - IMPTOS;
     $$IBE$$*/ /* RETENCION FUENTE */ /*$$IBE$$ 
    if ((RTFTE = 'C') or (RTFTE = 'K')) then
      BEGIN
      execute procedure redondee(VRRTFTE, DIG) returning_values (VRRTFTE);
      if (VRRTFTE <> 0) then
        BEGIN
        if (RTFTE = 'C') then
            CTARTFTE = TCTARTFTE;
        EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTARTFTE, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :VRSUBT, :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTFTE;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :VRSUBT, :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTFTE;
            END
         $$IBE$$*/ /* AUTORETENCION */ /*$$IBE$$ 
        if (FAUTORET <= fecaux) then
            BEGIN
            EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'CUENTA DE AUTORETENCION EN LA FUENTE') returning_values (CTARTFTE);
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTARTFTE INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERROR (31, :IDDOC, :CTARTFTE, 2);
                CUENTA = CTARTFTE;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                begin
                EXECUTE PROCEDURE ERROR (31, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, (:VRSUBT*-1), :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - VRRTFTE;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, (:VRSUBT*-1), :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - VRRTFTE;
                END
            END
        END  $$IBE$$*/ /* RTFTE */ /*$$IBE$$ 
      END
    if (RTFTE = 'A') then
      BEGIN
      FOR SELECT MAX(COAR_CTARTFTEV), MAX(COAR_RTFTE), MIN(COAR_RTBASE), SUM(FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), SUM((FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO)*COAR_RTFTE)
        FROM CONTABIL_ARTICULO C, FACTURAS_DETALLE F
        WHERE F.FACT_ID = :IDDOC AND F.ARTI_COD = C.ARTI_COD
        GROUP BY COAR_CTARTFTEV
        INTO :CTARTFTE, :PRTFTE, :baseadic, :MONTO, :VRRTFTE
        DO
        BEGIN
        MONTO = MONTO * FACTOR;
        if (MONTO >= BASEADIC) then
            BEGIN
            VRRTFTE = VRRTFTE * FACTOR / 100;
            execute procedure redondee(VRRTFTE, DIG) returning_values (VRRTFTE);
            execute procedure redondee(MONTO, DIG) returning_values (MONTO);
            if (VRRTFTE <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTARTFTE, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :MONTO, :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    NROI = NROI + 1;
                    SUMA = SUMA + VRRTFTE;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :MONTO, :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA + VRRTFTE;
                    END
                 $$IBE$$*/ /* AUTORETENCION */ /*$$IBE$$ 
                if (FAUTORET <= fecaux) then
                    BEGIN
                    EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'CUENTA DE AUTORETENCION EN LA FUENTE') returning_values (CTARTFTE);
                    EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTARTFTE, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
                    if (ERRORC <> 0) then
                        ERROR = ERROR + 1;
                    if (TIPOCUEN = 'C') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, (:MONTO*-1), :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                        NROI = NROI + 1;
                        SUMA = SUMA - VRRTFTE;
                        END
                    if (TIPOCUEN = 'N') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, (:MONTO*-1), :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NROI = NROI + 1;
                        SUMA = SUMA - VRRTFTE;
                        END
                    END
                END
            END
        END  $$IBE$$*/ /* RTFTE */ /*$$IBE$$ 
      END
     $$IBE$$*/ /* RETENCION IVA */ /*$$IBE$$ 
    if ((RTIVA = 'C') or (RTIVA = 'K')) then
      BEGIN
      execute procedure redondee(VRRTIVA, DIG) returning_values (VRRTIVA);
      if (VRRTIVA <> 0) then
        BEGIN
        if (RTIVA = 'C') then
            CTARTIVA = TCTARTIVA;
        EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTARTIVA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTIVA, 0, :VRIVA, :PORC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTIVA;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTIVA, 0, :VRIVA, :PORC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTIVA;
            END
        END  $$IBE$$*/ /* RTIVA */ /*$$IBE$$ 
      END
     $$IBE$$*/ /* RETENCION DE ICA */ /*$$IBE$$ 
    if ((RTICA = 'C') or (RTICA = 'K')) then
      BEGIN
      execute procedure redondee(VRRTICA, DIG) returning_values (VRRTICA);
      if (VRRTICA <> 0) then
        BEGIN
        if (RTICA = 'C') then
            CTARTICA = TCTARTICA;
        EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTARTICA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTICA, 0, :VRSUBT, :PRTICA, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTICA;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTICA, 0, :VRSUBT, :PRTICA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTICA;
            END
        END  $$IBE$$*/ /* RTICA */ /*$$IBE$$ 
      END
     $$IBE$$*/ /* CIERRE EL COMPROBANTE CONTRA LA CUENTA DEL TERCERO O LA CONSTANTE */ /*$$IBE$$ 
    if ((SUMA <> 0) and ((CARTERA = 'C') or (CARTERA = 'K') or (CARTERA = 'J'))) then
        BEGIN
        if (SUMA < 0) then
            BEGIN
            DEBITO = SUMA * -1;
            CREDITO = 0;
            END
        ELSE
            BEGIN
            DEBITO = 0;
            CREDITO = SUMA;
            END
        if (CARTERA = 'C') then
            CTACARTERA = TCTACLIEN;
        if (CARTERA = 'J') then
            BEGIN
             $$IBE$$*/ /* BUSQUE LA CUENTA DE LA CAJA */ /*$$IBE$$ 
            SELECT CAJA_CUENTA FROM CAJAS C, PUNTO_VENTA P
                WHERE P.CAJA_ID = C.CAJA_ID AND PTVT_ID = :PTOVTA
                INTO :CTACARTERA;
            END
        EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTACARTERA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :DEBITO, :CREDITO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
        if (TIPOCUEN = 'N') then
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :DEBITO, :CREDITO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
        NROI = NROI + 1;
        END  $$IBE$$*/ /* SUMA EN CARTERA */
    /* CALCULE COSTOS EN VENTAS */ /*$$IBE$$ 
    EXECUTE PROCEDURE COSTO_EN_VENTAS(31, :IDDOC);
    if (COSTOS = 'A') then
        BEGIN
        FOR SELECT MAX(CTACOS), SUM(CAST(CANT AS DOUBLE PRECISION) * COSTO)
            FROM COSTO_VENTAS
            GROUP BY CTACOS
            INTO :CTACOSTOS, :MONTO
        DO
            BEGIN
            if (MONTO <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTACOSTOS, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                     $$IBE$$*/ /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */ /*$$IBE$$ 
                    FOR SELECT ARTI_COD, CANT * COSTO
                        FROM COSTO_VENTAS
                        WHERE CTACOS = :CUENTA
                        INTO :ART, :MONTO
                    DO
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    NROI = NROI + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    END
                END  $$IBE$$*/ /* MONTO <> 0 */ /*$$IBE$$ 
            END  $$IBE$$*/ /* FOR */ /*$$IBE$$ 
        END  $$IBE$$*/ /* COSTOS */ /*$$IBE$$ 
    if (COSTOS = 'K') then
        BEGIN
        SELECT SUM(CAST(CANT AS DOUBLE PRECISION) * COSTO)
            FROM COSTO_VENTAS
            INTO :MONTO;
        if (MONTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTACOSTOS, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'I') then
                BEGIN
                 $$IBE$$*/ /* ES UNA CUENTA DE INVENTARIO, REGISTRE UNO A UNO LOS ARTICULOS */ /*$$IBE$$ 
                FOR SELECT ARTI_COD, CANT * COSTO
                    FROM COSTO_VENTAS
                    INTO :ART, :MONTO
                DO
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTACOSTOS, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                    NROI = NROI + 1;
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTACOSTOS, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTACOSTOS, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                END
            END  $$IBE$$*/ /* MONTO <> 0 */ /*$$IBE$$ 
        END  $$IBE$$*/ /* COSTOS = K */ /*$$IBE$$ 
    if (INVEN = 'A') then
        BEGIN
        FOR SELECT MAX(CTAINV), SUM(CAST(CANT AS DOUBLE PRECISION) * COSTO)
            FROM COSTO_VENTAS
            GROUP BY CTAINV
            INTO :CTAINVEN, :MONTO
        DO
            BEGIN
            if (MONTO <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTAINVEN, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                     $$IBE$$*/ /* ES UNA CUENTA DE INVENTARIO, REGISTRE UNO A UNO LOS ARTICULOS */ /*$$IBE$$ 
                    FOR SELECT ARTI_COD, CANT * COSTO
                        FROM COSTO_VENTAS
                        WHERE CTAINV = :CUENTA
                        INTO :ART, :MONTO
                    DO
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    NROI = NROI + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    END
                END  $$IBE$$*/ /* MONTO <> 0 */ /*$$IBE$$ 
            END  $$IBE$$*/ /* FOR */ /*$$IBE$$ 
        END  $$IBE$$*/ /* INVEN = A */ /*$$IBE$$ 
    if (INVEN = 'K') then
        BEGIN
        SELECT SUM(CAST(CANT AS DOUBLE PRECISION) * COSTO)
            FROM COSTO_VENTAS
            INTO :MONTO;
        if (MONTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTAINVEN, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'I') then
                BEGIN
                 $$IBE$$*/ /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */ /*$$IBE$$ 
                FOR SELECT ARTI_COD, CANT * COSTO
                    FROM COSTO_VENTAS
                    INTO :ART, :MONTO
                DO
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTAINVEN, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                    NROI = NROI + 1;
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAINVEN, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAINVEN, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                END
            END  $$IBE$$*/ /* MONTO <> 0 */ /*$$IBE$$ 
        END  $$IBE$$*/ /* INVEN = K */
    /* recorra las cuentas adicionales */ /*$$IBE$$ 
    FOR SELECT INVC_CUENTA, INVC_BASE, INVC_PORC, INVC_VALOR, INVC_DB
        FROM INTERFAZ_VENTAS_CTAS
        WHERE INVE_ID = :IDINTER
        INTO :CTADIC, :BASEADIC, :PORCADIC, :VALORADIC, :DBADIC
        DO
        BEGIN
        if (VALORADIC <> 0) then
            MONTO = VALORADIC;
        ELSE
            BEGIN
            if (:BASEADIC = 'SUBTOTAL') then
                VALORADIC = vrsubt;
            if (:BASEADIC = 'DESCUENTO') then
                VALORADIC = VRDTO;
            if (:BASEADIC = 'IVA') then
                VALORADIC = VRIVA;
            if (:BASEADIC = 'ADICIONAL') then
                VALORADIC = VRADIC;
            if (:BASEADIC = 'EXTRA') then
                VALORADIC = VREXTRA;
            if (:BASEADIC = 'TOTAL') then
                VALORADIC = VRTOTAL;
            MONTO = VALORADIC * PORCADIC / 100;
            END
        if (MONTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTADIC, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                if (DBADIC = 'S') then
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                ELSE
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                if (DBADIC = 'S') then
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                ELSE
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                END
            NROI = NROI + 1;
            END
        END
    if (ERROR > 0) then
        VER = 'S';
    SUSPEND;
    END  $$IBE$$*/ /* NO ANULADO */ /*$$IBE$$ 
  END  $$IBE$$*/ /* EXISTE LA INTERFAZ */ /*$$IBE$$ 
ELSE
    BEGIN
    EXECUTE PROCEDURE ERROR (31, :IDDOC, :PREF, 1);
    ERROR = ERROR + 1;
    VER = 'S';
    SUSPEND;
    END
 $$IBE$$*/ SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

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

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE CONTABIL_FACTURAS_CONTADO(
    FECFAC DATE,
    NIT VARCHAR(20),
    PREF VARCHAR(4),
    PTVTA INTEGER,
    IDINTER INTEGER)
RETURNS (
    ERROR INTEGER,
    VER CHAR(1),
    IDC INTEGER)
AS
declare variable num varchar(8);
declare variable numero varchar(10);
declare variable fecha char(8);
declare variable conc char(120);
declare variable vence char(8);
declare variable vrdto numeric(18,2);
declare variable vradic numeric(18,2);
declare variable vrsubt numeric(18,2);
declare variable vriva numeric(18,2);
declare variable prtfte numeric(9,2);
declare variable vrrtfte numeric(18,2);
declare variable vrrtiva numeric(18,2);
declare variable prtica numeric(9,2);
declare variable vrrtica numeric(18,2);
declare variable vrtotal numeric(18,2);
declare variable vrextra numeric(18,2);
declare variable tipocomp varchar(3);
declare variable prefcont varchar(4);
declare variable ventas char(1);
declare variable ctaventas varchar(20);
declare variable iva char(1);
declare variable ctaiva varchar(20);
declare variable consumo char(1);
declare variable ctaconsumo varchar(20);
declare variable cartera char(1);
declare variable ctacartera varchar(20);
declare variable rtfte char(1);
declare variable ctartfte varchar(20);
declare variable rtiva char(1);
declare variable ctartiva varchar(20);
declare variable rtica char(1);
declare variable ctartica varchar(20);
declare variable inven char(1);
declare variable ctainven varchar(20);
declare variable costos char(1);
declare variable ctacostos varchar(20);
declare variable ctadto varchar(20);
declare variable ctaadic varchar(20);
declare variable ctaextra varchar(20);
declare variable existe char(1);
declare variable cuenta varchar(20);
declare variable monto numeric(18,2);
declare variable tipocuen char(1);
declare variable nombre varchar(60);
declare variable proy varchar(4);
declare variable centro varchar(4);
declare variable porc numeric(5,2);
declare variable debito numeric(18,2);
declare variable credito numeric(18,2);
declare variable nroi integer;
declare variable art varchar(15);
declare variable impinc char(1);
declare variable imptos numeric(18,2);
declare variable suma numeric(18,2);
declare variable porciva numeric(9,2);
declare variable tctaclien varchar(20);
declare variable tctaventa varchar(20);
declare variable tctartfte varchar(20);
declare variable tctartiva varchar(20);
declare variable tctartica varchar(20);
declare variable ctadic varchar(20);
declare variable baseadic varchar(20);
declare variable porcadic numeric(5,2);
declare variable valoradic numeric(18,2);
declare variable dbadic char(1);
declare variable ptovta integer;
declare variable dig integer;
declare variable mercancia numeric(18,2);
declare variable factor double precision;
declare variable cent char(1);
BEGIN
/* BUSQUE LA INTERFACE */ /*$$IBE$$ 
EXISTE = 'N';
SELECT 'S', TICO_COD, PRCO_PRE, INVE_VENTAS, INVE_IVA, INVE_CONSUMO, INVE_CARTERA, INVE_RTFTE, INVE_RTIVA, INVE_RTICA, INVE_COSTO, INVE_INVEN, INVE_CTAVENTAS, INVE_CTAIVA, INVE_CTACONSUMO, INVE_CTADTO, INVE_CTAADIC, INVE_CTAEXTRA, INVE_CTACARTERA, INVE_CTARTFTE, INVE_CTARTIVA, INVE_CTARTICA, INVE_CTAINVEN, INVE_CTACOSTOS, INVE_CONFIRMAR, INVE_CENTRO
    FROM INTERFAZ_VENTAS
    WHERE INVE_ID = :IDINTER
    INTO :EXISTE, :TIPOCOMP, :PREFCONT, :VENTAS, :IVA, :CONSUMO, :CARTERA, :RTFTE, :RTIVA, :RTICA, :COSTOS, :INVEN, :CTAVENTAS, :CTAIVA, :CTACONSUMO, :CTADTO, :CTAADIC, :CTAEXTRA, :CTACARTERA, :CTARTFTE, :CTARTIVA, :CTARTICA, :CTAINVEN, :CTACOSTOS, :VER, :CENT;
if (EXISTE = 'S') then
  BEGIN
   $$IBE$$*/ /* BORRE CUALQUEIR CONTABILIZACION PREVIA */
/*  DELETE FROM CONTABILIZACION WHERE CNTB_TIPOREF = 31 AND CNTB_IDREF = 0;
  /* BUSQUE EL CENTRO DEL PUNTO, LA BODEGA, O EL PREFIJO  */ /*$$IBE$$ 
  IF (CENT = 'B') THEN
    SELECT B.BODE_CENTRO, B.BODE_PROY FROM BODEGA B, PUNTO_VENTA P
        WHERE B.BODE_COD = P.BODE_COD AND P.ptvt_id = :ptvta INTO :CENTRO, :PROY;
  IF (CENT = 'V') THEN
    SELECT MAX(V.CENT_COD), MAX(V.PROY_COD) FROM VENDEDORES V
        WHERE V.PTVT_ID = :PTVTA INTO :CENTRO, :PROY;
  IF (CENT = 'P') THEN
    SELECT P.PREF_PROY, P.PREF_CENTRO FROM PREFIJOS P
        WHERE P.PREF_PRE = :PREF AND P.TIDO_COD = 31 INTO :CENTRO, :PROY;
   $$IBE$$*/ /* TRAIGA LOS DATOS DEL CLIENTE */ /*$$IBE$$ 
  SELECT TERC_NOM, TERC_CTARTFTE, TERC_CTARTIVA, TERC_CTARTICA, TERC_CTAVENTA, TERC_CTACLIENTE
        FROM TERCEROS T WHERE TERC_NIT = :NIT
        INTO :NOMBRE, TCTARTFTE, TCTARTIVA, TCTARTICA, TCTAVENTA, TCTACLIEN;
  SELECT SUM(FACT_DTOMONTO), SUM(FACT_ADICIONAL), SUM(FACT_IVAMONTO), SUM(FACT_EXTRA), SUM(FACT_TOTAL), SUM(FACT_RTFTEMONTO), SUM(FACT_RTIVAMONTO), SUM(FACT_RTICAMONTO), MAX(FACT_IVAINC)
        FROM FACTURAS F WHERE FACT_FECHA = :FECFAC AND FACT_ANULADO = 'N' AND PTVT_ID = :ptvta AND PREF_PRE = :PREF
        INTO :VRDTO, :VRADIC, :VRIVA, :VREXTRA, :VRTOTAL, :VRRTFTE, :VRRTIVA, :VRRTICA, :impinc;
  VRSUBT = VRTOTAL - VREXTRA - VRIVA;  $$IBE$$*/ /* BASE DE RETEFTE Y RETEICA */ /*$$IBE$$ 
  MERCANCIA = VRSUBT - VRADIC + VRDTO;
  EXECUTE PROCEDURE FECHA_A_CONTA(:FECFAC) returning_values (:FECHA);
  VENCE = FECHA;
   $$IBE$$*/ /* REGISTRE EL ENCABEZADO CONTABLE */ /*$$IBE$$ 
  IDC = GEN_ID(ID_CONTABILIZA, 1);
  CONC = 'RESUMEN VENTAS ' || FECHA;
  NUM = SUBSTR(FECHA, 3, 8);
  INSERT INTO CONTABILIZACION (CNTB_ID, CNTB_TIPOCOMP, CNTB_PREFCNT, CNTB_NUMERO, CNTB_FECHA, CNTB_CONCEPTO, CNTB_REF, CNTB_TIPOREF, CNTB_IDREF, CNTB_PREFREF, CNTB_NUMREF, CNTB_PROCESADO)
        VALUES (:IDC, :TIPOCOMP, :PREFCONT, :NUM, :FECHA, :CONC, '', 0, 0, :PREF, :NUM, 'N');
  NROI = 0;
  SUMA = 0;
  ERROR = 0;
   $$IBE$$*/ /* SI NO HAY CUENTA DE DESCUENTO NI ADICIONAL CALCULE UN FACTOR PARA LAS VENTAS Y EL IVA */ /*$$IBE$$ 
  if (MERCANCIA <> 0) then
    FACTOR = CAST(VRSUBT AS DOUBLE PRECISION) / CAST(MERCANCIA AS DOUBLE PRECISION);
  ELSE
    FACTOR = 1;
   $$IBE$$*/ /* TRAIGA EL NUMERO DE DIGITOS PARA EL REDONDEO */ /*$$IBE$$ 
  SELECT CAST(CONF_VALOR AS INTEGER) FROM CONFIGURACION WHERE CONF_MODULO = 'FACTURACION' AND
        CONF_CATEGORIA = 'GENERAL' AND CONF_PROPIEDAD = 'REDONDEO AL MULTIPLO DE DIEZ EN TOTALES' INTO :DIG;
   $$IBE$$*/ /* CUENTAS DE VENTAS */ /*$$IBE$$ 
  if (VENTAS = 'A') then
        BEGIN
        FOR SELECT MAX(COAR_CTAVNT), SUM(CAST(FADE_CANT AS DOUBLE PRECISION) * (FADE_PRUNIT-FADE_DTOMONTO)), SUM(FADE_IVAMONTO+FADE_CONSUMO)
            FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_DETALLE FD, FACTURAS F
            WHERE F.FACT_ID = FD.FACT_ID AND FACT_FECHA = :FECFAC AND FD.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND F.PREF_PRE = :PREF AND F.PTVT_ID = :PTVTA AND FACT_ANULADO = 'N'
            GROUP BY COAR_CTAVNT
            INTO :CTAVENTAS, :MONTO, :IMPTOS
            DO
            BEGIN
            if (IMPINC = 'S') then
                MONTO = MONTO - IMPTOS;
            if ((CTADTO IS NULL) OR (CTADTO = '')) then
                MONTO = MONTO * FACTOR;
            execute procedure redondee(MONTO, DIG) returning_values (MONTO);
            if (MONTO <> 0) then
                BEGIN
                CUENTA = NULL;
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :CTAVENTAS INTO :CUENTA, :TIPOCUEN;
                if (CUENTA IS NULL) then
                    begin
                    EXECUTE PROCEDURE ERROR (31, 0, :CTAVENTAS, 2);
                    CUENTA = CTAVENTAS;
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                     $$IBE$$*/ /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */ /*$$IBE$$ 
                    FOR SELECT FD.ARTI_COD, (CAST(FADE_CANT AS DOUBLE PRECISION) * (FADE_PRUNIT-FADE_DTOMONTO)), (FADE_IVAMONTO+FADE_CONSUMO)
                        FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_DETALLE FD, FACTURAS F
                        WHERE F.FACT_ID = FD.FACT_ID AND FACT_FECHA = :FECFAC AND F.PREF_PRE = :PREF AND F.PTVT_ID = :PTVTA AND FD.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTAINV = :CUENTA AND FACT_ANULADO = 'N'
                        INTO :ART, :MONTO, :IMPTOS
                    DO
                        BEGIN
                        if (IMPINC = 'S') then
                            MONTO = MONTO - IMPTOS;
                        if ((CTADTO IS NULL) OR (CTADTO = '')) then
                            MONTO = MONTO * FACTOR;
                        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                        if (MONTO <> 0) then
                            BEGIN
                            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                            NROI = NROI + 1;
                            SUMA = SUMA - MONTO;
                            END
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    NROI = NROI + 1;
                    SUMA = SUMA - MONTO;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA - MONTO;
                    END
                END  $$IBE$$*/ /* MONTO <> 0 */ /*$$IBE$$ 
            END  $$IBE$$*/ /* FOR */ /*$$IBE$$ 
        END  $$IBE$$*/ /* VENTAS X ARTICULO */ /*$$IBE$$ 
     IF ((VENTAS = 'C') OR (VENTAS = 'K')) THEN
        BEGIN
        IF (VENTAS = 'C') THEN
            CTAVENTAS = TCTAVENTA;
        SELECT SUM(CAST(FADE_CANT AS DOUBLE PRECISION) * (FADE_PRUNIT-FADE_DTOMONTO)), SUM(FADE_IVAMONTO+FADE_CONSUMO)
            FROM FACTURAS_DETALLE FD, FACTURAS F
            WHERE F.FACT_ID = FD.FACT_ID AND FACT_FECHA = :FECFAC AND F.PREF_PRE = :PREF AND F.PTVT_ID = :PTVTA AND FACT_ANULADO = 'N'
            INTO :MONTO, :IMPTOS;
        if (IMPINC = 'S') then
            MONTO = MONTO - IMPTOS;
        if ((CTADTO IS NULL) OR (CTADTO = '')) then
            MONTO = MONTO * FACTOR;
        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
        if (MONTO <> 0) then
            BEGIN
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTAVENTAS INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERROR (31, 0, :CTAVENTAS, 2);
                CUENTA = CTAVENTAS;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                 $$IBE$$*/ /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */ /*$$IBE$$ 
                FOR SELECT FD.ARTI_COD, (CAST(FADE_CANT AS DOUBLE PRECISION) * (FADE_PRUNIT-FADE_DTOMONTO)), (FADE_IVAMONTO+FADE_CONSUMO)
                    FROM  $$IBE$$*/ /*ARTICULO A,*/ /*$$IBE$$  FACTURAS_DETALLE FD, FACTURAS F
                    WHERE F.FACT_ID = FD.FACT_ID AND FACT_FECHA = :FECFAC AND F.PREF_PRE = :PREF AND F.PTVT_ID = :PTVTA AND FACT_ANULADO = 'N'
                    INTO :ART, :MONTO, :IMPTOS
                    DO
                    BEGIN
                    if (IMPINC = 'S') then
                        MONTO = MONTO - IMPTOS;
                    if ((CTADTO IS NULL) OR (CTADTO = '')) then
                        MONTO = MONTO * FACTOR;
                    execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                    if (MONTO <> 0) then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        SUMA = SUMA - MONTO;
                        END
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - MONTO;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - MONTO;
                END
            END  $$IBE$$*/ /* MONTO <> 0 */ /*$$IBE$$ 
        END  $$IBE$$*/ /* VENTAS DE CLIENTE O CONSTANTE */
    /* EL IVA EN VENTAS */ /*$$IBE$$ 
    if (IVA = 'A') then
        BEGIN
        FOR SELECT MAX(COAR_CTAIVAV), SUM(FADE_IVAMONTO), SUM(CAST(FADE_CANT AS DOUBLE PRECISION) * (FADE_PRUNIT-FADE_DTOMONTO)), sum(FADE_CONSUMO)
            FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_DETALLE FD, FACTURAS F
            WHERE F.FACT_ID = FD.FACT_ID AND FACT_FECHA = :FECFAC AND F.PREF_PRE = :PREF AND F.PTVT_ID = :PTVTA AND FD.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND FACT_ANULADO = 'N'
            GROUP BY COAR_CTAIVAV
            INTO :CTAIVA, :IMPTOS, :MONTO, :VALORADIC
        DO
            BEGIN
            if (IMPINC = 'S') then
                MONTO = MONTO - IMPTOS - VALORADIC;
            MONTO = MONTO * -1;
            MONTO = MONTO * FACTOR;
            IMPTOS = IMPTOS * FACTOR;
            execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
            execute procedure redondee(MONTO, DIG) returning_values (MONTO);
            if (IMPTOS <> 0) then
                BEGIN
                CUENTA = NULL;
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :CTAIVA INTO :CUENTA, :TIPOCUEN;
                if (CUENTA IS NULL) then
                    begin
                    EXECUTE PROCEDURE ERROR (31, 0, :CTAIVA, 2);
                    CUENTA = CTAIVA;
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                     $$IBE$$*/ /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */ /*$$IBE$$ 
                    FOR SELECT FD.ARTI_COD, FADE_IVAMONTO, (CAST(FADE_CANT AS DOUBLE PRECISION) * (FADE_PRUNIT-FADE_DTOMONTO)), TAIV_PORC, FADE_CONSUMO
                        FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_DETALLE FD, FACTURAS F, TARIFA_IVA T
                        WHERE F.FACT_ID = FD.FACT_ID AND FACT_FECHA = :FECFAC AND F.PREF_PRE = :PREF AND F.PTVT_ID = :PTVTA AND FD.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTAIVAV = :CUENTA AND A.TAIV_COD = T.TAIV_COD AND FACT_ANULADO = 'N'
                        INTO :ART, :IMPTOS, :MONTO, :PORCIVA, :VALORADIC
                    DO
                        BEGIN
                        if (IMPINC = 'S') then
                            MONTO = MONTO - IMPTOS - VALORADIC;
                        MONTO = MONTO * -1;
                        MONTO = MONTO * FACTOR;
                        IMPTOS = IMPTOS * FACTOR;
                        execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                        if (IMPTOS <> 0) then
                            BEGIN
                            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, :MONTO, :PORCIVA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                            NROI = NROI + 1;
                            SUMA = SUMA + DEBITO - CREDITO;
                            END
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, :MONTO, ABS(:IMPTOS*100/:MONTO), :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    NROI = NROI + 1;
                    SUMA = SUMA - IMPTOS;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, :MONTO, ABS(:IMPTOS*100/:MONTO), :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA - IMPTOS;
                    END
                END    $$IBE$$*/ /* IMPTOS <> 0 */ /*$$IBE$$ 
            END  $$IBE$$*/ /* FOR */ /*$$IBE$$ 
        END  $$IBE$$*/ /* IVA X ARTICULO */ /*$$IBE$$ 
    if (IVA = 'K') then  $$IBE$$*/ /* IVA EN CTA CONSTANTE */ /*$$IBE$$ 
        BEGIN
        SELECT SUM(FADE_IVAMONTO), SUM(CAST(FADE_CANT AS DOUBLE PRECISION) * (FADE_PRUNIT-FADE_DTOMONTO)), SUM(FADE_CONSUMO)
            FROM FACTURAS_DETALLE FD, FACTURAS F
            WHERE F.FACT_ID = FD.FACT_ID AND FACT_FECHA = :FECFAC AND F.PREF_PRE = :PREF AND F.PTVT_ID = :PTVTA AND FACT_ANULADO = 'N'
            INTO :IMPTOS, :MONTO, :valoradic;
        if (IMPINC = 'S') then
            MONTO = MONTO - IMPTOS - VALORADIC;
        MONTO = MONTO * -1;
        MONTO = MONTO * FACTOR;
        IMPTOS = IMPTOS * FACTOR;
        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
        execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
        if (IMPTOS <> 0) then
            BEGIN
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTAIVA INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERROR (31, 0, :CTAIVA, 2);
                CUENTA = CTAIVA;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                 $$IBE$$*/ /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */ /*$$IBE$$ 
                FOR SELECT FD.ARTI_COD, (CAST(FADE_CANT AS DOUBLE PRECISION) * (FADE_PRUNIT-FADE_DTOMONTO)), FADE_IVAMONTO, TAIV_PORC, FADE_CONSUMO
                    FROM ARTICULO A, FACTURAS_DETALLE FD, FACTURAS F, TARIFA_IVA T
                    WHERE F.FACT_ID = FD.FACT_ID AND FACT_FECHA = :FECFAC AND F.PREF_PRE = :PREF AND F.PTVT_ID = :PTVTA AND FD.arti_cod = A.arti_cod AND T.TAIV_COD=A.TAIV_COD AND FACT_ANULADO = 'N'
                    INTO :ART, :MONTO, :IMPTOS, :PORCIVA, :VALORADIC
                    DO
                    BEGIN
                    if (IMPINC = 'S') then
                        MONTO = MONTO - IMPTOS - VALORADIC;
                    MONTO = MONTO * -1;
                    MONTO = MONTO * FACTOR;
                    IMPTOS = IMPTOS * FACTOR;
                    execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                    execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                    if (IMPTOS <> 0) then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', 0, :IMPTOS, :MONTO, :PORCIVA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        SUMA = SUMA - IMPTOS;
                        END
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', 0, :IMPTOS, :MONTO, ABS(:IMPTOS*100/:MONTO), :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - IMPTOS;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', 0, :IMPTOS, :MONTO, ABS(:IMPTOS*100/:MONTO), :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - IMPTOS;
                END
            END  $$IBE$$*/ /* IMPTOS <> 0 */ /*$$IBE$$ 
        END  $$IBE$$*/ /* IVA EN CTA CONSTANTE */
    /* EL IMPOCONSUMO */ /*$$IBE$$ 
    if (CONSUMO = 'A') then
        BEGIN
        FOR SELECT MAX(COAR_CTACONS), SUM(FADE_CONSUMO)
            FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_DETALLE FD, FACTURAS F
            WHERE F.FACT_ID = FD.FACT_ID AND FACT_FECHA = :FECFAC AND F.PREF_PRE = :PREF AND F.PTVT_ID = :PTVTA AND FD.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND FACT_ANULADO = 'N'
            GROUP BY COAR_CTACONS
            INTO :CTACONSUMO, :IMPTOS
        DO
            BEGIN
            execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
            if (IMPTOS <> 0) then
                BEGIN
                CUENTA = NULL;
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :CTACONSUMO INTO :CUENTA, :TIPOCUEN;
                if (CUENTA IS NULL) then
                    begin
                    EXECUTE PROCEDURE ERROR (31, 0, :CTACONSUMO, 2);
                    CUENTA = CTACONSUMO;
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                     $$IBE$$*/ /* ES UNA CUENTA DE INVENTARIO, REGISTRE UNO A UNO LOS ARTICULOS */ /*$$IBE$$ 
                    FOR SELECT FD.ARTI_COD, FADE_CONSUMO
                        FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_DETALLE FD, FACTURAS F
                        WHERE F.FACT_ID = FD.FACT_ID AND FACT_FECHA = :FECFAC AND F.PREF_PRE = :PREF AND F.PTVT_ID = :PTVTA AND FD.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTACONS = :CUENTA AND FACT_ANULADO = 'N'
                        INTO :ART, :IMPTOS
                    DO
                        BEGIN
                        execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                        if (IMPTOS <> 0) then
                            BEGIN
                            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                            NROI = NROI + 1;
                            SUMA = SUMA - IMPTOS;
                            END
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    NROI = NROI + 1;
                    SUMA = SUMA - IMPTOS;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA - CREDITO;
                    END
                END  $$IBE$$*/ /* IMPTOS <> 0 */ /*$$IBE$$ 
            END  $$IBE$$*/ /* FOR */ /*$$IBE$$ 
        END  $$IBE$$*/ /* CONSUMO X ARTICULO */ /*$$IBE$$ 
    if (CONSUMO = 'K') then  $$IBE$$*/ /* CONSUMO EN CTA CONSTANTE */ /*$$IBE$$ 
        BEGIN
        SELECT SUM(FADE_CONSUMO)
            FROM FACTURAS_DETALLE FD, FACTURAS F
            WHERE F.FACT_ID = FD.FACT_ID AND FACT_FECHA = :FECFAC AND F.PREF_PRE = :PREF AND F.PTVT_ID = :PTVTA AND FACT_ANULADO = 'N'
            INTO :IMPTOS;
        execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
        if (IMPTOS <> 0) then
            BEGIN
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTACONSUMO INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERROR (31, 0, :CTACONSUMO, 2);
                CUENTA = CTACONSUMO;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                 $$IBE$$*/ /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */ /*$$IBE$$ 
                FOR SELECT FD.ARTI_COD, FADE_CONSUMO
                    FROM  $$IBE$$*/ /*ARTICULO A,*/ /*$$IBE$$  FACTURAS_DETALLE FD, FACTURAS F
                    WHERE F.FACT_ID = FD.FACT_ID AND FACT_FECHA = :FECFAC AND F.PREF_PRE = :PREF AND F.PTVT_ID = :PTVTA AND FACT_ANULADO = 'N'
                    INTO :ART, :IMPTOS
                    DO
                    BEGIN
                    execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                    if (IMPTOS <> 0) then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CTACONSUMO, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        SUMA = SUMA - IMPTOS;
                        END
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTACONSUMO, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - IMPTOS;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTACONSUMO, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - IMPTOS;
                END
            END  $$IBE$$*/ /* IMPTOS <> 0 */ /*$$IBE$$ 
        END  $$IBE$$*/ /* CONSUMO EN CTA CONSTANTE */
    /* DESCUENTO */ /*$$IBE$$ 
    if ((CTADTO IS NOT NULL) AND (CTADTO <> '')) then
        BEGIN
        execute procedure redondee(VRDTO, DIG) returning_values (VRDTO);
        if (VRDTO <> 0) then
            BEGIN
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTADTO INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERROR (31, 0, :CTADTO, 2);
                CUENTA = CTADTO;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                begin
                EXECUTE PROCEDURE ERROR (31, 0, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRDTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA + VRDTO;
                END
            if (TIPOCUEN = 'N') then
                    BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRDTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA + VRDTO;
                END
            END
        END  $$IBE$$*/ /* DESCUENTO */
    /* VALOR ADIC */ /*$$IBE$$ 
    if ((CTAADIC IS NOT NULL) AND (CTAADIC <> '')) then
        BEGIN
        execute procedure redondee(VRADIC, DIG) returning_values (VRADIC);
        if (VRADIC <> 0) THEN
            BEGIN
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTAADIC INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERROR (31, 0, :CTAADIC, 2);
                CUENTA = CTAADIC;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                begin
                EXECUTE PROCEDURE ERROR (31, 0, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRADIC, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - VRADIC;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRADIC, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - VRADIC;
                END
            END
        END  $$IBE$$*/ /* VR. ADIC */
    /* VALOR EXTRA */ /*$$IBE$$ 
    if ((CTAEXTRA IS NOT NULL) AND (CTAEXTRA <> '')) THEN
        BEGIN
        execute procedure redondee(VREXTRA, DIG) returning_values (VREXTRA);
        if (VREXTRA <> 0) THEN
            BEGIN
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTAEXTRA INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERROR (31, 0, :CTAEXTRA, 2);
                CUENTA = CTAEXTRA;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                begin
                EXECUTE PROCEDURE ERROR (31, 0, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VREXTRA, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - VREXTRA;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VREXTRA, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - VREXTRA;
                END
            END
        END  $$IBE$$*/ /* VR. EXTRA */
    /* RETENCION FUENTE */ /*$$IBE$$ 
    if ((RTFTE = 'C') or (RTFTE = 'K')) then
      BEGIN
      execute procedure redondee(VRRTFTE, DIG) returning_values (VRRTFTE);
      if (VRRTFTE <> 0) then
        BEGIN
        if (RTFTE = 'C') then
            CTARTFTE = TCTARTFTE;
        CUENTA = NULL;
        SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
            WHERE CUEN_COD = :CTARTFTE INTO :CUENTA, :TIPOCUEN;
        if (CUENTA IS NULL) then
            begin
            EXECUTE PROCEDURE ERROR (31, 0, :CTARTFTE, 2);
            CUENTA = CTARTFTE;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            begin
            EXECUTE PROCEDURE ERROR (31, 0, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :VRSUBT, :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTFTE;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :VRSUBT, :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTFTE;
            END
        END  $$IBE$$*/ /* RTFTE */ /*$$IBE$$ 
      END
     $$IBE$$*/ /* RETENCION IVA */ /*$$IBE$$ 
    if ((RTIVA = 'C') or (RTIVA = 'K')) then
      BEGIN
      execute procedure redondee(VRRTIVA, DIG) returning_values (VRRTIVA);
      if (VRRTIVA <> 0) then
        BEGIN
        if (RTIVA = 'C') then
            CTARTIVA = TCTARTIVA;
        CUENTA = NULL;
        SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
            WHERE CUEN_COD = :CTARTIVA INTO :CUENTA, :TIPOCUEN;
        if (CUENTA IS NULL) then
            begin
            EXECUTE PROCEDURE ERROR (31, 0, :CTARTIVA, 2);
            CUENTA = CTARTIVA;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            begin
            EXECUTE PROCEDURE ERROR (31, 0, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTIVA, 0, :VRIVA, :PORC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTIVA;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTIVA, 0, :VRIVA, :PORC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTIVA;
            END
        END  $$IBE$$*/ /* RTIVA */ /*$$IBE$$ 
      END
     $$IBE$$*/ /* RETENCION DE ICA */ /*$$IBE$$ 
    if ((RTICA = 'C') or (RTICA = 'K')) then
      BEGIN
      execute procedure redondee(VRRTICA, DIG) returning_values (VRRTICA);
      if (VRRTICA <> 0) then
        BEGIN
        if (RTICA = 'C') then
            CTARTICA = TCTARTICA;
        CUENTA = NULL;
        SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
            WHERE CUEN_COD = :CTARTICA INTO :CUENTA, :TIPOCUEN;
        if (CUENTA IS NULL) then
            begin
            EXECUTE PROCEDURE ERROR (31, 0, :CTARTICA, 2);
            CUENTA = CTARTICA;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            begin
            EXECUTE PROCEDURE ERROR (31, 0, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTICA, 0, :VRSUBT, :PRTICA, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTICA;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTICA, 0, :VRSUBT, :PRTICA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTICA;
            END
        END  $$IBE$$*/ /* RTICA */ /*$$IBE$$ 
      END
     $$IBE$$*/ /* CIERRE EL COMPROBANTE CONTRA LA CUENTA DEL TERCERO O LA CONSTANTE */ /*$$IBE$$ 
    if ((SUMA <> 0) and ((CARTERA = 'C') or (CARTERA = 'K') or (CARTERA = 'J'))) then
        BEGIN
        if (SUMA < 0) then
            BEGIN
            DEBITO = SUMA * -1;
            CREDITO = 0;
            END
        ELSE
            BEGIN
            DEBITO = 0;
            CREDITO = SUMA;
            END
        if (CARTERA = 'C') then
            CTACARTERA = TCTACLIEN;
        if (CARTERA = 'J') then
            BEGIN
             $$IBE$$*/ /* BUSQUE LA CUENTA DE LA CAJA */ /*$$IBE$$ 
            SELECT CAJA_CUENTA FROM CAJAS C, PUNTO_VENTA P
                WHERE P.CAJA_ID = C.CAJA_ID AND PTVT_ID = :PTOVTA
                INTO :CTACARTERA;
            END
        CUENTA = NULL;
        SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
            WHERE CUEN_COD = :CTACARTERA INTO :CUENTA, :TIPOCUEN;
        if (CUENTA IS NULL) then
            begin
            EXECUTE PROCEDURE ERROR (31, 0, :CTACARTERA, 2);
            CUENTA = CTACARTERA;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            begin
            EXECUTE PROCEDURE ERROR (31, 0, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'C') then
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :DEBITO, :CREDITO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
        if (TIPOCUEN = 'N') then
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :DEBITO, :CREDITO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
        NROI = NROI + 1;
        END  $$IBE$$*/ /* SUMA EN CARTERA */
    /* CALCULE LOS COSTOS */ /*$$IBE$$ 
    EXECUTE PROCEDURE costo_en_ventas_contado(:fecfac,  :pref, :ptvta);
    if (COSTOS = 'A') then
        BEGIN
        FOR SELECT MAX(CTACOS), SUM(COSTO)
            FROM COSTO_VENTAS
            GROUP BY CTACOS
            INTO :CTACOSTOS, :MONTO
        DO
            BEGIN
            if (MONTO <> 0) then
                BEGIN
                CUENTA = NULL;
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :CTACOSTOS INTO :CUENTA, :TIPOCUEN;
                IF (CUENTA IS NULL) THEN
                    begin
                    EXECUTE PROCEDURE ERROR (31, 0, :CTACOSTOS, 2);
                    CUENTA = CTARTFTE;
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                     $$IBE$$*/ /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */ /*$$IBE$$ 
                    FOR SELECT ARTI_COD, CANT * COSTO
                        FROM COSTO_VENTAS
                        WHERE CTACOS = :CUENTA
                        INTO :ART, :MONTO
                    DO
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    NROI = NROI + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    END
                END  $$IBE$$*/ /* MONTO <> 0 */ /*$$IBE$$ 
            END  $$IBE$$*/ /* FOR */ /*$$IBE$$ 
        END  $$IBE$$*/ /* COSTOS */ /*$$IBE$$ 
    if (COSTOS = 'K') then
        BEGIN
        SELECT SUM(COSTO)
            FROM COSTO_VENTAS
            INTO :MONTO;
        if (MONTO <> 0) then
            BEGIN
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTACOSTOS INTO :CUENTA, :TIPOCUEN;
            IF (CUENTA IS NULL) THEN
                begin
                EXECUTE PROCEDURE ERROR (31, 0, :CTACOSTOS, 2);
                CUENTA = CTARTFTE;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                 $$IBE$$*/ /* ES UNA CUENTA DE INVENTARIO, REGISTRE UNO A UNO LOS ARTICULOS */ /*$$IBE$$ 
                FOR SELECT ARTI_COD, CANT * COSTO
                    FROM COSTO_VENTAS
                    INTO :ART, :MONTO
                DO
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTACOSTOS, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                    NROI = NROI + 1;
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTACOSTOS, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTACOSTOS, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                END
            END  $$IBE$$*/ /* MONTO <> 0 */ /*$$IBE$$ 
        END  $$IBE$$*/ /* COSTOS = K */ /*$$IBE$$ 
    if (INVEN = 'A') then
        BEGIN
        FOR SELECT MAX(CTAINV), SUM(COSTO)
            FROM COSTO_VENTAS
            GROUP BY CTAINV
            INTO :CTAINVEN, :MONTO
        DO
            BEGIN
            if (MONTO <> 0) then
                BEGIN
                CUENTA = NULL;
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :CTAINVEN INTO :CUENTA, :TIPOCUEN;
                IF (CUENTA IS NULL) THEN
                    begin
                    EXECUTE PROCEDURE ERROR (31, 0, :CTAINVEN, 2);
                    CUENTA = CTAINVEN;
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                     $$IBE$$*/ /* ES UNA CUENTA DE INVENTARIO, REGISTRE UNO A UNO LOS ARTICULOS */ /*$$IBE$$ 
                    FOR SELECT ARTI_COD, CANT * COSTO
                        FROM COSTO_VENTAS
                        WHERE CTAINV = :CUENTA
                        INTO :ART, :MONTO
                    DO
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    NROI = NROI + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    END
                END  $$IBE$$*/ /* MONTO <> 0 */ /*$$IBE$$ 
            END  $$IBE$$*/ /* FOR */ /*$$IBE$$ 
        END  $$IBE$$*/ /* INVEN = A */ /*$$IBE$$ 
    if (INVEN = 'K') then
        BEGIN
        SELECT SUM(COSTO)
            FROM COSTO_VENTAS
            INTO :MONTO;
        if (MONTO <> 0) then
            BEGIN
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTAINVEN INTO :CUENTA, :TIPOCUEN;
            IF (CUENTA IS NULL) THEN
                begin
                EXECUTE PROCEDURE ERROR (31, 0, :CTAINVEN, 2);
                CUENTA = CTAINVEN;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                 $$IBE$$*/ /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */ /*$$IBE$$ 
                FOR SELECT ARTI_COD, CANT * COSTO
                    FROM COSTO_VENTAS
                    INTO :ART, :MONTO
                DO
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTAINVEN, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                    NROI = NROI + 1;
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAINVEN, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAINVEN, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                END
            END  $$IBE$$*/ /* MONTO <> 0 */ /*$$IBE$$ 
        END  $$IBE$$*/ /* INVEN = K */
    /* recorra las cuentas adicionales */ /*$$IBE$$ 
    FOR SELECT INVC_CUENTA, INVC_BASE, INVC_PORC, INVC_VALOR, INVC_DB
        FROM INTERFAZ_VENTAS_CTAS
        WHERE INVE_ID = :IDINTER
        INTO :CTADIC, :BASEADIC, :PORCADIC, :VALORADIC, :DBADIC
        DO
        BEGIN
        if (VALORADIC <> 0) then
            MONTO = VALORADIC;
        ELSE
            BEGIN
            if (:BASEADIC = 'SUBTOTAL') then
                VALORADIC = vrsubt;
            if (:BASEADIC = 'DESCUENTO') then
                VALORADIC = VRDTO;
            if (:BASEADIC = 'IVA') then
                VALORADIC = VRIVA;
            if (:BASEADIC = 'ADICIONAL') then
                VALORADIC = VRADIC;
            if (:BASEADIC = 'EXTRA') then
                VALORADIC = VREXTRA;
            if (:BASEADIC = 'TOTAL') then
                VALORADIC = VRTOTAL;
            MONTO = VALORADIC * PORCADIC / 100;
            END
        if (MONTO <> 0) then
            BEGIN
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTADIC INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERROR (31, 0, :CTADIC, 2);
                CUENTA = CTADIC;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                begin
                EXECUTE PROCEDURE ERROR (31, 0, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'C') then
                BEGIN
                if (DBADIC = 'S') then
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                ELSE
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                if (DBADIC = 'S') then
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                ELSE
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                END
            NROI = NROI + 1;
            END
        END
    if (ERROR > 0) then
        VER = 'S';
    SUSPEND;
    END  $$IBE$$*/ /* EXISTE LA INTERFAZ */ /*$$IBE$$ 
ELSE
    BEGIN
    EXECUTE PROCEDURE ERROR (31, 0, :PREF, 1);
    ERROR = ERROR + 1;
    VER = 'S';
    SUSPEND;
    END
 $$IBE$$*/ SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE EXISTENCIAS_DESDE_HASTA(
    FECHA DATE,
    ARTINI VARCHAR(20),
    ARTFIN VARCHAR(20),
    GRPINI VARCHAR(3),
    GRPFIN VARCHAR(3),
    BODINI VARCHAR(2),
    BODFIN VARCHAR(2),
    ORDEN CHAR(1),
    AGRUPA CHAR(1),
    DETALLE CHAR(1),
    RESERVA CHAR(1),
    SUCURSAL INTEGER)
RETURNS (
    CANT NUMERIC(18,4),
    COSTO NUMERIC(18,2),
    COSTO_LOTE NUMERIC(18,2),
    CODIGO VARCHAR(15),
    NOMBRE VARCHAR(60),
    UNIDAD VARCHAR(8),
    STAND VARCHAR(15),
    CODGRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    CODSUBG VARCHAR(3),
    NOMSUBG VARCHAR(30),
    CODMARC VARCHAR(3),
    NOMMARC VARCHAR(30),
    CODBOD VARCHAR(2),
    LOTE VARCHAR(15),
    NOMBOD VARCHAR(30),
    COSTOTOT NUMERIC(18,2),
    ULTCOSTO NUMERIC(18,2),
    FECHACOSTO DATE,
    CONSUMO NUMERIC(18,2),
    RESERVADO NUMERIC(18,4),
    ORDENADO NUMERIC(18,4),
    IVA NUMERIC(9,2),
    CODBAR VARCHAR(20))
AS
declare variable exist char(1);
declare variable codini varchar(20);
declare variable codfin varchar(20);
declare variable desini varchar(20);
declare variable desfin varchar(20);
declare variable ordenc numeric(18,4);
declare variable pedido numeric(18,4);
declare variable ok char(1);
declare variable id integer;
declare variable item integer;
declare variable und varchar(8);
declare variable factor numeric(18,4);
declare variable cant2 numeric(18,4);
declare variable PEDAUTO CHAR(2);
BEGIN /*$$IBE$$ 
if (ORDEN = 'C') then
    BEGIN
    CODINI = ARTINI;
    CODFIN = ARTFIN;
    DESINI = '';
    DESFIN = 'zz';
    END
ELSE
    BEGIN
    DESINI = ARTINI;
    DESFIN = ARTFIN;
    CODINI = '';
    CODFIN = 'zz';
    END
EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION', 'FACTURAS', 'GENERAR PEDIDO AUTOMATICAMENTE CON LA FACTURA') returning_values (pedauto);
if (DETALLE = 'B') then
  BEGIN
  FOR SELECT ARTI_COD, ARTI_DES, ARTI_UNIDAD, ARTI_EXIST, TAIV_PORC, A.GRUP_COD, A.SUBG_COD, A.MARC_COD, BODE_COD, BODE_NOM, ARTI_CONSUMO
      FROM ARTICULO A, BODEGA B, TARIFA_IVA T
      WHERE ARTI_COD >= :CODINI AND ARTI_COD <= :CODFIN AND ARTI_DES >= :DESINI AND ARTI_DES <= :DESFIN AND ESAR_COD <> 'I' AND BODE_COD >= :BODINI AND
      BODE_COD <= :BODFIN AND ((SUCU_ID = :SUCURSAL) or (:SUCURSAL = 0)) AND A.TAIV_COD = T.TAIV_COD
      INTO :CODIGO, :NOMBRE, :UNIDAD, :EXIST, :IVA, :CODGRUPO, :CODSUBG, :CODMARC, :CODBOD, :NOMBOD, :CONSUMO
      DO
        BEGIN
        OK = 'N';
        if (AGRUPA = 'G') then
            BEGIN
            if ((CODGRUPO >= GRPINI) AND (CODGRUPO <= GRPFIN)) then
                OK = 'S';
            end
        ELSE
            if (AGRUPA = 'M') then
                BEGIN
                if ((CODMARC >= GRPINI) AND (CODMARC <= GRPFIN)) then
                    OK = 'S';
                END
        if (OK = 'S') then
            BEGIN
            NOMGRUPO = '';
            NOMMARC = '';
            NOMSUBG = '';
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            SELECT MAX(COBA_COD) FROM BARRAS_ARTICULO WHERE ARTI_COD = :codigo AND COBA_UNIDAD = :unidad INTO :codbar;
            if (CODBAR IS NULL) then
                CODBAR = CODIGO;
            if (EXIST <> 'N') then
                BEGIN
                SELECT MAX(EXIS_STAND) FROM EXISTENCIA WHERE ARTI_COD = :CODIGO AND BODE_COD = :CODBOD INTO :STAND;
                EXECUTE PROCEDURE SALDO_INICIAL_INVENTARIO(CODIGO, FECHA, :CODBOD) returning_values (CANT);
                EXECUTE PROCEDURE COSTO_PROMEDIO_UNIDAD(CODIGO, FECHA, UNIDAD) returning_values (COSTO);
                EXECUTE PROCEDURE ULTIMO_COSTO(CODIGO, FECHA, UNIDAD) returning_values (ULTCOSTO);
                SELECT MAX(MVAR_FECHA) FROM MOVIMIENTO_ARTICULO WHERE ARTI_COD = :CODIGO AND MVAR_ENTRADA = 'S' AND MVAR_FECHA <= :FECHA INTO :FECHACOSTO;
                COSTOTOT = :CANT * :COSTO;
                CONSUMO = CONSUMO * CANT;
                if (RESERVA = 'S') then
                    BEGIN
                    SELECT SUM(ORID_ENTREGAR)
                        FROM ORDENINVENTARIO_DETALLE OD, ordenes_inventario O
                        WHERE O.ORIN_ID = OD.ORIN_ID AND ARTI_COD = :CODIGO AND ORIN_FECHA <= :FECHA AND ORIN_FECLLEGA >= :FECHA AND ORID_ANULADO = 'N' AND OD.BODE_COD = :CODBOD
                        INTO :ORDENADO;
                    if (ORDENADO IS NULL) then
                        ORDENADO = 0;
                    ORDENC = 0;
                    FOR SELECT O.ORDC_ID, OCDE_ITEM, OCDE_CANT * OCDE_FACTOR
                        FROM ORDENES_COMPRA O, ORDENES_COMPRA_DETALLE OD
                        WHERE O.ORDC_ID = OD.ORDC_ID AND OD.ARTI_COD = :CODIGO AND (ORDC_FECHA+ORDC_VALIDEZ) >= :FECHA AND ORDC_FECHA <= :FECHA AND OCDE_ANULADO = 'N' AND OD.BODE_COD = :CODBOD
                        INTO :ID, :ITEM, :CANT2
                        do
                        BEGIN
                        EXECUTE PROCEDURE FALTANTE(23, 21, ID, ITEM) returning_values (PEDIDO, UND, FACTOR);
                        if (PEDIDO * FACTOR = CANT2) then  $$IBE$$*/ /* SI NO SE HA FACTURADO MIRE A VER SI SE REMISIONO */ /*$$IBE$$ 
                            EXECUTE PROCEDURE FALTANTE(23, 22, ID, ITEM) returning_values (PEDIDO, UND, FACTOR);
                        if (PEDIDO IS NULL) then
                            PEDIDO = 0;
                        ORDENC = ORDENC + PEDIDO * FACTOR;
                        END
                    ORDENADO = ORDENADO + ORDENC;
                    SELECT SUM(RSDE_LIBERAR)
                        FROM RESERVAS_DETALLE RD, RESERVAS R
                        WHERE R.RESE_ID = RD.RESE_ID AND ARTI_COD = :CODIGO AND RESE_FECHA <= :FECHA AND RESE_VENCE >= :FECHA AND RD.BODE_COD = :CODBOD AND RSDE_ANULADO = 'N'
                        INTO :RESERVADO;
                    if (RESERVADO IS NULL) then
                        RESERVADO = 0;
                    PEDIDO = 0;
                    FOR SELECT P.PEDI_ID, PEDE_ITEM, PEDE_CANT * PEDE_FACTOR
                        FROM PEDIDOS P, PEDIDOS_DETALLE PD
                        WHERE P.PEDI_ID = PD.PEDI_ID AND PD.ARTI_COD = :CODIGO AND (PEDI_FECHA+PEDI_VALIDEZ) >= :FECHA AND PEDI_FECHA <= :FECHA AND PEDE_ANULADO = 'N' AND BODE_COD = :CODBOD
                        INTO :ID, :ITEM, :CANT2
                        do
                        BEGIN
                        EXECUTE PROCEDURE FALTANTE(34, 31, ID, ITEM) returning_values (ORDENC, UND, FACTOR);
                        if ((ORDENC * FACTOR = CANT2) or (PEDAUTO = 'SI')) then  $$IBE$$*/ /* SI NO SE HA FACTURADO MIRE A VER SI SE REMISIONO */ /*$$IBE$$ 
                            EXECUTE PROCEDURE FALTANTE(34, 32, ID, ITEM) returning_values (ORDENC, UND, FACTOR);
                        if (ORDENC IS NULL) then
                            ORDENC = 0;
                        PEDIDO = PEDIDO + ORDENC * FACTOR;
                        END
                    RESERVADO = RESERVADO + PEDIDO;
                    END
                ELSE
                    BEGIN
                    RESERVADO = 0;
                    ORDENADO = 0;
                    END
                SUSPEND;
                END
            END
        END
  END

if (DETALLE = 'L') then
  BEGIN
  FOR SELECT A.ARTI_COD, ARTI_DES, ARTI_UNIDAD, ARTI_EXIST, TAIV_PORC, A.GRUP_COD, A.SUBG_COD, A.MARC_COD, L.lote_nro, L.lote_nro||' - '||L.lote_vence, ARTI_CONSUMO,l.bode_cod, L.lote_saldo,l.lote_costo
      FROM ARTICULO A, LOTES l, TARIFA_IVA T
      WHERE A.ARTI_COD >= '0' AND A.ARTI_COD <= 'zz' AND ARTI_DES >= '' AND ARTI_DES <= 'zz' AND ESAR_COD <> 'I' AND A.TAIV_COD = T.TAIV_COD and a.arti_cod = l.arti_cod
      INTO :CODIGO, :NOMBRE, :UNIDAD, :EXIST, :IVA, :CODGRUPO, :CODSUBG, :CODMARC, :LOTE, :NOMBOD, :CONSUMO, :codbod, :cant, :costo_lote
      DO
        BEGIN
        OK = 'N';
        if (AGRUPA = 'G') then
            BEGIN
            if ((CODGRUPO >= GRPINI) AND (CODGRUPO <= GRPFIN)) then
                OK = 'S';
            end
        ELSE
            if (AGRUPA = 'M') then
                BEGIN
                if ((CODMARC >= GRPINI) AND (CODMARC <= GRPFIN)) then
                    OK = 'S';
                END
        if (OK = 'S') then
            BEGIN
            NOMGRUPO = '';
            NOMMARC = '';
            NOMSUBG = '';
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            SELECT MAX(COBA_COD) FROM BARRAS_ARTICULO WHERE ARTI_COD = :codigo AND COBA_UNIDAD = :unidad INTO :codbar;
            if (CODBAR IS NULL) then
                CODBAR = CODIGO;

            if (EXIST <> 'N') then
                BEGIN
                EXECUTE PROCEDURE COSTO_PROMEDIO_UNIDAD(CODIGO, FECHA, UNIDAD) returning_values (COSTO);
                EXECUTE PROCEDURE ULTIMO_COSTO(CODIGO, FECHA, UNIDAD) returning_values (ULTCOSTO);
                SELECT MAX(MVAR_FECHA) FROM MOVIMIENTO_ARTICULO WHERE ARTI_COD = :CODIGO AND MVAR_ENTRADA = 'S' AND MVAR_FECHA <= :FECHA INTO :FECHACOSTO;
                COSTOTOT = :CANT * :COSTO;
                CONSUMO = CONSUMO * CANT;
                if (RESERVA = 'S') then
                    BEGIN
                    SELECT SUM(ORID_ENTREGAR)
                        FROM ORDENINVENTARIO_DETALLE OD, ordenes_inventario O
                        WHERE O.ORIN_ID = OD.ORIN_ID AND ARTI_COD = :CODIGO AND ORIN_FECHA <= :FECHA AND ORIN_FECLLEGA >= :FECHA AND ORID_ANULADO = 'N'
                        INTO :ORDENADO;
                    if (ORDENADO IS NULL) then
                        ORDENADO = 0;
                    ORDENC = 0;
                    FOR SELECT O.ORDC_ID, OCDE_ITEM, OCDE_CANT * OCDE_FACTOR
                        FROM ORDENES_COMPRA O, ORDENES_COMPRA_DETALLE OD
                        WHERE O.ORDC_ID = OD.ORDC_ID AND OD.ARTI_COD = :CODIGO AND (ORDC_FECHA+ORDC_VALIDEZ) >= :FECHA AND ORDC_FECHA <= :FECHA AND OCDE_ANULADO = 'N'
                        INTO :ID, :ITEM, :CANT2
                        do
                        BEGIN
                        EXECUTE PROCEDURE FALTANTE(23, 21, ID, ITEM) returning_values (PEDIDO, UND, FACTOR);
                        if (PEDIDO * FACTOR = CANT2) then  $$IBE$$*/ /* SI NO SE HA FACTURADO MIRE A VER SI SE REMISIONO */ /*$$IBE$$ 
                            EXECUTE PROCEDURE FALTANTE(23, 22, ID, ITEM) returning_values (PEDIDO, UND, FACTOR);
                        if (PEDIDO IS NULL) then
                            PEDIDO = 0;
                        ORDENC = ORDENC + PEDIDO * FACTOR;
                        END
                    ORDENADO = ORDENADO + ORDENC;
                    SELECT SUM(RSDE_LIBERAR)
                        FROM RESERVAS_DETALLE RD, RESERVAS R
                        WHERE R.RESE_ID = RD.RESE_ID AND ARTI_COD = :CODIGO AND RESE_FECHA <= :FECHA AND RESE_VENCE >= :FECHA AND RSDE_ANULADO = 'N'
                        INTO :RESERVADO;
                    if (RESERVADO IS NULL) then
                        RESERVADO = 0;
                    PEDIDO = 0;
                    FOR SELECT P.PEDI_ID, PEDE_ITEM, PEDE_CANT * PEDE_FACTOR
                        FROM PEDIDOS P, PEDIDOS_DETALLE PD
                        WHERE P.PEDI_ID = PD.PEDI_ID AND PD.ARTI_COD = :CODIGO AND (PEDI_FECHA+PEDI_VALIDEZ) >= :FECHA AND PEDI_FECHA <= :FECHA AND PEDE_ANULADO = 'N'
                        INTO :ID, :ITEM, :CANT2
                        do
                        BEGIN
                        EXECUTE PROCEDURE FALTANTE(34, 31, ID, ITEM) returning_values (ORDENC, UND, FACTOR);
                        if ((ORDENC * FACTOR = CANT2) or (PEDAUTO = 'SI')) then  $$IBE$$*/ /* SI NO SE HA FACTURADO MIRE A VER SI SE REMISIONO */ /*$$IBE$$ 
                            EXECUTE PROCEDURE FALTANTE(34, 32, ID, ITEM) returning_values (ORDENC, UND, FACTOR);
                        if (ORDENC IS NULL) then
                            ORDENC = 0;
                        PEDIDO = PEDIDO + ORDENC * FACTOR;
                        END
                    RESERVADO = RESERVADO + PEDIDO;
                    END
                ELSE
                    BEGIN
                    RESERVADO = 0;
                    ORDENADO = 0;
                    END
                SUSPEND;
                END
            END
        END
  end
if (DETALLE = 'N') then
  BEGIN
  FOR SELECT ARTI_COD, ARTI_DES, ARTI_UNIDAD, ARTI_EXIST, TAIV_PORC, A.GRUP_COD, A.SUBG_COD, A.MARC_COD, ARTI_CONSUMO
      FROM ARTICULO A, TARIFA_IVA T
      WHERE ARTI_COD >= :CODINI AND ARTI_COD <= :CODFIN AND ARTI_DES >= :DESINI AND ARTI_DES <= :DESFIN AND ESAR_COD <> 'I' AND A.TAIV_COD = T.TAIV_COD
      INTO :CODIGO, :NOMBRE, :UNIDAD, :EXIST, :IVA, :CODGRUPO, :CODSUBG, :CODMARC, :CONSUMO
      DO
        BEGIN
        OK = 'N';
        if (AGRUPA = 'G') then
            BEGIN
            if ((GRPINI = '0') AND (GRPFIN = 'zz')) then
                OK = 'S';
            else
                if ((CODGRUPO >= GRPINI) AND (CODGRUPO <= GRPFIN)) then
                    OK = 'S';
            end
        ELSE
            if (AGRUPA = 'M') then
                BEGIN
                if ((GRPINI = '0') AND (GRPFIN = 'zzz')) then
                    OK = 'S';
                else
                    if ((CODMARC >= GRPINI) AND (CODMARC <= GRPFIN)) then
                        OK = 'S';
                END
        if (OK = 'S') then
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            SELECT MAX(COBA_COD) FROM BARRAS_ARTICULO WHERE ARTI_COD = :codigo AND COBA_UNIDAD = :unidad INTO :codbar;
            if (CODBAR IS NULL) then
                CODBAR = CODIGO;

            if (EXIST <> 'N') then
                BEGIN
                EXECUTE PROCEDURE SALDO_INICIAL_TOTAL_INV(CODIGO, FECHA) returning_values (CANT);
                EXECUTE PROCEDURE COSTO_PROMEDIO_UNIDAD(CODIGO, FECHA, UNIDAD) returning_values (COSTO);
                EXECUTE PROCEDURE ULTIMO_COSTO(CODIGO, FECHA, UNIDAD) returning_values (ULTCOSTO);
                SELECT MAX(MVAR_FECHA) FROM MOVIMIENTO_ARTICULO WHERE ARTI_COD = :CODIGO AND MVAR_ENTRADA = 'S' AND MVAR_FECHA <= :FECHA INTO :FECHACOSTO;
                COSTOTOT = :CANT * :COSTO;
                CONSUMO = CONSUMO * CANT;
                if (RESERVA = 'S') then
                    BEGIN
                    SELECT SUM(ORID_ENTREGAR)
                        FROM ORDENINVENTARIO_DETALLE OD, ordenes_inventario O
                        WHERE O.ORIN_ID = OD.ORIN_ID AND ARTI_COD = :CODIGO AND ORIN_FECHA <= :FECHA AND ORIN_FECLLEGA >= :FECHA AND ORID_ANULADO = 'N'
                        INTO :ORDENADO;
                        if (ORDENADO IS NULL) then
                            ORDENADO = 0;
                    ORDENC = 0;
                    FOR SELECT O.ORDC_ID, OCDE_ITEM, OCDE_CANT * OCDE_FACTOR
                        FROM ORDENES_COMPRA O, ORDENES_COMPRA_DETALLE OD
                        WHERE O.ORDC_ID = OD.ORDC_ID AND OD.ARTI_COD = :CODIGO AND (ORDC_FECHA+ORDC_VALIDEZ) >= :FECHA AND ORDC_FECHA <= :FECHA AND OCDE_ANULADO = 'N'
                        INTO :ID, :ITEM, :CANT2
                        do
                        BEGIN
                        EXECUTE PROCEDURE FALTANTE(23, 21, ID, ITEM) returning_values (PEDIDO, UND, FACTOR);
                        if (PEDIDO * FACTOR = CANT2) then  $$IBE$$*/ /* SI NO SE HA FACTURADO MIRE A VER SI SE REMISIONO */ /*$$IBE$$ 
                            EXECUTE PROCEDURE FALTANTE(23, 22, ID, ITEM) returning_values (PEDIDO, UND, FACTOR);
                        if (PEDIDO IS NULL) then
                            PEDIDO = 0;
                        ORDENC = ORDENC + PEDIDO * FACTOR;
                        END
                    ORDENADO = ORDENADO + ORDENC;
                    SELECT SUM(RSDE_LIBERAR)
                        FROM RESERVAS_DETALLE RD, RESERVAS R
                        WHERE R.RESE_ID = RD.RESE_ID AND ARTI_COD = :CODIGO AND RESE_FECHA <= :FECHA AND RESE_VENCE >= :FECHA AND RSDE_ANULADO = 'N'
                        INTO :RESERVADO;
                    if (RESERVADO IS NULL) then
                        RESERVADO = 0;
                    PEDIDO = 0;
                    FOR SELECT P.PEDI_ID, PEDE_ITEM, PEDE_CANT * PEDE_FACTOR
                        FROM PEDIDOS P, PEDIDOS_DETALLE PD, PUNTO_VENTA PT
                        WHERE P.PEDI_ID = PD.PEDI_ID AND PD.ARTI_COD = :CODIGO AND PT.ptvt_id = P.PTVT_ID AND (PEDI_FECHA+PEDI_VALIDEZ) >= :FECHA AND PEDI_FECHA <= :FECHA AND PEDE_ANULADO = 'N'
                        INTO :ID, :ITEM, :CANT2
                        do
                        BEGIN
                        EXECUTE PROCEDURE FALTANTE(34, 31, ID, ITEM) returning_values (ORDENC, UND, FACTOR);
                        if ((ORDENC * FACTOR = CANT2) or (PEDAUTO = 'SI')) then  $$IBE$$*/ /* SI NO SE HA FACTURADO MIRE A VER SI SE REMISIONO */ /*$$IBE$$ 
                            EXECUTE PROCEDURE FALTANTE(34, 32, ID, ITEM) returning_values (ORDENC, UND, FACTOR);
                        if (ORDENC IS NULL) then
                            ORDENC = 0;
                        PEDIDO = PEDIDO + ORDENC * FACTOR;
                        END
                    if (PEDIDO IS NULL) then
                        PEDIDO = 0;
                    RESERVADO = RESERVADO + PEDIDO;
                    END
                ELSE
                    BEGIN
                    RESERVADO = 0;
                    ORDENADO = 0;
                    END
                SUSPEND;
                END
            END
        END
  END
 $$IBE$$*/ SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER PROCEDURE INVENTARIO_FAMILIA(
    FECHA DATE,
    FAMILIA VARCHAR(20))
RETURNS (
    ARTICULO VARCHAR(20),
    INTERNO VARCHAR(20),
    DESCRIPCION VARCHAR(60),
    CANTIDAD NUMERIC(18,2),
    UNIDAD VARCHAR(8),
    TOTAL NUMERIC(18,2))
AS
declare variable COSTO NUMERIC(18,4);
begin /*$$IBE$$ 
FOR SELECT A.ARTI_COD, ARTI_DES, ARTI_UNIDAD, p.pvar_cod FROM ARTICULO A, PROVEEDOR_ARTICULO P
    WHERE ESAR_COD <> 'I' AND A.arti_cod = P.arti_cod AND P.terc_nit = :FAMILIA
    INTO :ARTICULO, :descripcion, :UNIDAD, :INTERNO
    DO
    BEGIN
    EXECUTE PROCEDURE SALDO_INICIAL_TOTAL_INV(ARTICULO, FECHA) returning_values (cantidad);
    EXECUTE PROCEDURE COSTO_PROMEDIO_UNIDAD(ARTICULO, FECHA, UNIDAD) returning_values (COSTO);
    TOTAL = COSTO * CANTIDAD;
    suspend;
    END
 $$IBE$$*/ SUSPEND;
end
^

SET TERM ; ^

SET TERM ^ ;

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

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE DEVOLUCIONES_SIN_CONTABILIDAD(
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    ID INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    ESTADO VARCHAR(20),
    IDI INTEGER,
    IDC INTEGER)
AS
DECLARE VARIABLE VER CHAR(2);
declare variable FECICNT VARCHAR(10);
declare variable FECFCNT VARCHAR(10);
declare variable ERROR INTEGER;
declare variable idref INTEGER;
BEGIN /*$$IBE$$ 
EXECUTE PROCEDURE fecha_a_conta(FECINI) returning_values (FECICNT);
EXECUTE PROCEDURE fecha_a_conta(FECFIN) returning_values (FECFCNT);
FOR SELECT DEVT_ID, PREF_PRE, DEVT_NUMERO FROM devoluciones_ventas WHERE DEVT_ANULADO = 'N' AND
    DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN
    INTO :ID, :PREF, :NUMERO
DO
  BEGIN
  idref = null;
  SELECT ENCO_IDREF FROM COMPROBANTE_ENCABEZADO WHERE ENCO_TIPOREF = 33 AND ENCO_FECHA >= :FECICNT AND ENCO_FECHA <= :FECFCNT and ENCO_IDREF = :id into :idref;
  if (idref IS NULL) then
  begin
   ESTADO = 'PROCESANDO';
   SUSPEND;
   SELECT MAX(INVE_ID) FROM INTERFAZ_VENTAS WHERE PREF_PRE = :PREF AND TIDO_COD = 33 INTO :IDI;
   EXECUTE PROCEDURE contabil_devolcli (:ID, :IDI) RETURNING_VALUES (:ERROR, :VER, :IDC);
   if (ERROR = 0) then
    BEGIN
    EXECUTE PROCEDURE CONTABILIZA_PENDIENTE (:IDC);
    ESTADO = 'OK';
    END
   ELSE
    ESTADO = 'ERROR';
   suspend;
  End
  END
 $$IBE$$*/ SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE FACTURAS_SIN_CONTABILIDAD(
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    ID INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    ESTADO VARCHAR(20),
    IDI INTEGER,
    IDC INTEGER)
AS
DECLARE VARIABLE VER CHAR(2);
declare variable FECICNT VARCHAR(10);
declare variable FECFCNT VARCHAR(10);
declare variable ERROR INTEGER;
declare variable idref INTEGER;
BEGIN /*$$IBE$$ 
EXECUTE PROCEDURE fecha_a_conta(FECINI) returning_values (FECICNT);
EXECUTE PROCEDURE fecha_a_conta(FECFIN) returning_values (FECFCNT);
FOR SELECT FACT_ID, PREF_PRE, FACT_NUMERO FROM FACTURAS WHERE FACT_ANULADO = 'N' AND
    FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN INTO :ID, :PREF, :NUMERO
DO
  BEGIN
  idref = null;
  SELECT ENCO_IDREF FROM COMPROBANTE_ENCABEZADO WHERE ENCO_TIPOREF = 31 AND ENCO_FECHA >= :FECICNT AND ENCO_FECHA <= :FECFCNT and ENCO_IDREF = :ID into :idref;
  if (idref IS NULL) then
  begin
   ESTADO = 'PROCESANDO';
   ERROR = NULL;
   SUSPEND;
   SELECT MAX(INVE_ID) FROM INTERFAZ_VENTAS WHERE PREF_PRE = :PREF AND TIDO_COD = 31 INTO :IDI;
   EXECUTE PROCEDURE CONTABIL_FACTURA (:ID, :IDI) RETURNING_VALUES (:ERROR, VER, :IDC);
   if ((ERROR = 0) or (error IS NULL)) then
    BEGIN
    EXECUTE PROCEDURE CONTABILIZA_PENDIENTE (:IDC);
    ESTADO = 'OK';
    END
   ELSE
    ESTADO = 'ERROR';
   suspend;
  end
  END
 $$IBE$$*/ SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE ACTUALICE_COSTO(
    ARTICULO VARCHAR(15),
    FECHA DATE,
    COSTO NUMERIC(18,2),
    CANTIDAD NUMERIC(18,2),
    ENTRADA CHAR(1),
    ANULAR CHAR(1),
    IDMOV INTEGER,
    TIPO INTEGER)
AS
DECLARE VARIABLE saldo NUMERIC(18,2);
DECLARE VARIABLE COSTOP NUMERIC(18,2);
DECLARE VARIABLE exart CHAR(1);
DECLARE VARIABLE UCOSTO NUMERIC(18,2);
declare variable FECAUX DATE;
declare variable SALDOC NUMERIC(15,4);
declare variable ITEM INTEGER;
declare variable UNIDAD VARCHAR(8);
BEGIN
/* Verfique si el artículo tiene control de existencias */
SELECT arti_exist, ARTI_UNIDAD FROM articulo WHERE arti_COD = :articulo
    INTO :exart, :UNIDAD;
IF (exart <> 'N') THEN
    BEGIN
    if (ANULAR = 'S') then
        BEGIN
        select cost_saldoc, cost_saldop from costos
            WHERE (arti_cod = :articulo) AND (cost_fecha = :fecha) AND (cost_idmov = :IDMOV) AND (COST_TIPO = :TIPO)
            into :SALDOC, :SALDO; /* para dejar inicializadas las 2 variables */
        DELETE FROM COSTOS WHERE (arti_cod = :articulo) AND (cost_fecha = :fecha) AND (cost_idmov = :IDMOV) AND (COST_TIPO = :TIPO);
        /* para inicializar el ultimo costo */
        SELECT MAX(COST_FECHA) FROM costos
            WHERE (arti_cod = :articulo) AND (cost_fecha <= :fecha) INTO :FECAUX;
        if (FECAUX IS NULL) then
            UCOSTO = 0;
        ELSE
            BEGIN
            SELECT MAX(COST_ITEM) FROM costos
                WHERE (arti_cod = :articulo) AND (cost_fecha = :fecaux) INTO :ITEM;
            SELECT COST_ULTIMO FROM costos
                WHERE (arti_cod = :articulo) AND (cost_fecha = :fecaux) AND (cost_item = :ITEM) INTO :UCOSTO;
            END
        END
    ELSE
        BEGIN
        select max(cost_fecha) from costos WHERE (arti_cod = :articulo) AND (cost_fecha <= :fecha) into :fecaux;
        select max(cost_item) from costos WHERE (arti_cod = :articulo) AND (cost_fecha = :fecaux) into :item;
        select (cost_saldoc + cost_entc - cost_salc) from costos WHERE (arti_cod = :articulo) AND (cost_fecha = :fecaux) AND (cost_item = :item) into :saldoc;
        if (saldoc is null) THEN
            SALDOC = 0;
        EXECUTE PROCEDURE costo_promedio(:articulo, :fecha) RETURNING_VALUES :costop;
        if (ENTRADA = 'S') then
            if (TIPO = 33) then
                BEGIN
                EXECUTE PROCEDURE ULTIMO_COSTO(ARTICULO, FECHA, UNIDAD) returning_values (UCOSTO);
                INSERT INTO COSTOS (arti_cod, cost_fecha,
                    cost_entc, cost_entp, cost_salc, cost_salp,
                    cost_saldoc, cost_saldop, cost_ultimo, cost_idmov, cost_tipo)
                    VALUES (:articulo, :fecha, :cantidad, :cantidad*:costop, 0, 0, :saldoc, :saldoc*:costop, :ucosto, :IDMOV, :TIPO);
                SALDO = (SALDOC * COSTOP) + (CANTIDAD * COSTOP);
                SALDOC = SALDOC + CANTIDAD;
                END
            ELSE
                BEGIN
                UCOSTO = :COSTO;
                INSERT INTO COSTOS (arti_cod, cost_fecha,
                    cost_entc, cost_entp, cost_salc, cost_salp,
                    cost_saldoc, cost_saldop, cost_ultimo, cost_idmov, cost_tipo)
                    VALUES (:articulo, :fecha, :cantidad, :cantidad*:costo, 0, 0, :saldoc, :saldoc*:costop, :costo, :IDMOV, :TIPO);
                SALDO = (SALDOC * COSTOP) + (CANTIDAD * COSTO);
                SALDOC = SALDOC + CANTIDAD;
                END
        ELSE
            BEGIN
            EXECUTE PROCEDURE ULTIMO_COSTO(ARTICULO, FECHA, UNIDAD) returning_values (UCOSTO);
            INSERT INTO COSTOS (arti_cod, cost_fecha,
                cost_entc, cost_entp, cost_salc, cost_salp,
                cost_saldoc, cost_saldop, cost_ultimo, cost_idmov, cost_tipo)
                VALUES (:articulo, :fecha, 0, 0, :cantidad, :cantidad*:costop, :saldoc, :saldoc*:costop, :UCOSTO, :IDMOV, :TIPO);
            SALDOC = SALDOC - CANTIDAD;
            SALDO = SALDOC * COSTOP; /* YA ESTA RESTADA LA CANTIDAD */
            END
        END
    END
END

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE CALCULA_PRECIOS(
    ARTICULO VARCHAR(20),
    FECHA DATE)
AS
declare variable LISTA INTEGER;
declare variable MARGEN NUMERIC(9, 4);
declare variable UTIL NUMERIC(9, 4);
declare variable UNIDAD VARCHAR(8);
declare variable UOR VARCHAR(20);
declare variable COSTOP NUMERIC(18, 2);
declare variable COSTOU NUMERIC(18, 2);
declare variable COSTO NUMERIC(18, 2);
declare variable DIG INTEGER;
declare variable IVAINC CHAR(1);
declare variable TARIVA NUMERIC(9,2);
declare variable AUTOM CHAR(1);
declare variable BASE varchar(10);
declare variable CAMBIO CHAR(7);
BEGIN
EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION','ARTICULOS','CAMBIO DE PRECIOS AUTOMATICO AL CAMBIAR COSTO O PRECIO') returning_values (CAMBIO);
if (CAMBIO = 'COSTO') then
  BEGIN
  FOR SELECT P.LIPR_COD, PRAR_MARGEN, PRAR_UTIL, LIPR_MODIF, PRAR_AUTO
    FROM PRECIOS_ARTICULO P, LISTA_PRECIOS L
    WHERE P.LIPR_COD = L.LIPR_COD AND ARTI_COD = :articulo
    INTO :LISTA, :MARGEN, :UTIL, :IVAINC, :AUTOM
    DO
      if (AUTOM = 'S') then
        BEGIN
        if (UTIL IS NULL) then
            UTIL = 0;
        if (MARGEN IS NULL) then
            MARGEN = 0;
        SELECT ARTI_UNIDAD, TAIV_PORC FROM ARTICULO A, TARIFA_IVA T WHERE A.TAIV_COD = T.TAIV_COD AND ARTI_COD = :ARTICULO INTO :UNIDAD, :TARIVA;
        EXECUTE PROCEDURE lee_configuracion('FACTURACION','ARTICULOS','COSTO BASE PARA CALCULO DE PRECIOS DE VENTA AUTOMATICOS') returning_values (:BASE);
            EXECUTE PROCEDURE COSTO_PROMEDIO (:ARTICULO, :FECHA) RETURNING_VALUES(:COSTOP);
            EXECUTE PROCEDURE ULTIMO_COSTO (:ARTICULO, :FECHA, :UNIDAD) RETURNING_VALUES(:COSTOU);
        if (base = 'ULTIMO') then
            COSTO = COSTOU;
        ELSE
            BEGIN
            COSTO = COSTOP;
            if (base = 'MAYOR') then
                if (COSTOP < COSTOU) then
                    COSTO = COSTOU;
            END
        if (IVAINC = 'S') then
            COSTO = COSTO * (1 + TARIVA/100);
        EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION', 'ARTICULOS', 'SUGERIR PRECIOS CON PORCENTAJE DE MARGEN O UTILIDAD') RETURNING_VALUES (:UOR);
        EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION', 'ARTICULOS', 'REDONDEO AL MULTIPLO DE DIEZ EN PRECIOS') RETURNING_VALUES (:DIG);
        if (UOR = 'UTILIDAD') then
            BEGIN
            COSTO = COSTO * (1 + :UTIL/100);
            EXECUTE PROCEDURE REDONDEE (COSTO, DIG) returning_values (COSTO);
            UPDATE PRECIOS_ARTICULO
                SET PRAR_FIJO = :COSTO
                WHERE ARTI_COD = :ARTICULO AND LIPR_COD = :LISTA;
            END
        ELSE
            BEGIN
            COSTO = COSTO / (1 - :MARGEN/100);
            EXECUTE PROCEDURE REDONDEE (COSTO, DIG) returning_values (COSTO);
            UPDATE PRECIOS_ARTICULO
                SET PRAR_FIJO = :COSTO
                WHERE ARTI_COD = :ARTICULO AND LIPR_COD = :LISTA;
            END
        END
  END
END

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE COSTO_EN_VENTAS(
    TIPO INTEGER,
    ID INTEGER)
AS
declare variable FECHA DATE;
declare variable ARTICULO VARCHAR(20);
declare variable CANTIDAD NUMERIC(18,4);
declare variable COSTO NUMERIC(18,2);
declare variable CTACOSTO VARCHAR(20);
declare variable CTAINVEN VARCHAR(20);
BEGIN
DELETE FROM COSTO_VENTAS;
if (TIPO = 31) then
    BEGIN
    /* FACTURA DE VENTA */
    FOR SELECT D.ARTI_COD, FADE_CANT * FADE_FACTOR, COAR_CTACOS, COAR_CTAINV, FACT_FECHA
        FROM ARTICULO A, FACTURAS F, FACTURAS_DETALLE D, CONTABIL_ARTICULO C
        WHERE F.FACT_ID = D.FACT_ID AND A.ARTI_COD = D.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND F.FACT_ID = :ID AND FACT_ANULADO = 'N'
        INTO :ARTICULO, :CANTIDAD, :CTACOSTO, :CTAINVEN, :FECHA
        DO
        BEGIN
        EXECUTE PROCEDURE COSTO_PROMEDIO(:ARTICULO, :FECHA) returning_values (:COSTO);
        INSERT INTO COSTO_VENTAS VALUES (:ARTICULO, :CANTIDAD, :COSTO, :CTACOSTO, :CTAINVEN);
        END
    END
if (TIPO = 32) then
    BEGIN
    /* REMISION */
    FOR SELECT D.ARTI_COD, RVDE_CANT * RVDE_FACTOR, COAR_CTACOS, COAR_CTAINV, REVT_FECHA
        FROM ARTICULO A, REMISIONES_VENTA R, REMISIONES_VENTA_DETALLE D, CONTABIL_ARTICULO C
        WHERE R.REVT_ID = D.REVT_ID AND A.ARTI_COD = D.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND R.REVT_ID = :ID AND REVT_ANULADO = 'N'
        INTO :ARTICULO, :CANTIDAD, :CTACOSTO, :CTAINVEN, :FECHA
        DO
        BEGIN
        EXECUTE PROCEDURE COSTO_PROMEDIO(:ARTICULO, :FECHA) returning_values (:COSTO);
        INSERT INTO COSTO_VENTAS VALUES (:ARTICULO, :CANTIDAD, :COSTO, :CTACOSTO, :CTAINVEN);
        END
    END
if (TIPO = 33) then
    BEGIN
    /* DEVOLUCION */
    FOR SELECT D.ARTI_COD, DVDE_CANT * DVDE_FACTOR, COAR_CTACOS, COAR_CTAINV, DEVT_FECHA
        FROM ARTICULO A, DEVOLUCIONES_VENTAS DV, DEVOLUCIONES_VENTAS_DETALLE D, CONTABIL_ARTICULO C
        WHERE DV.DEVT_ID = D.DEVT_ID AND A.ARTI_COD = D.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND DV.DEVT_ID = :ID AND DEVT_ANULADO = 'N'
        INTO :ARTICULO, :CANTIDAD, :CTACOSTO, :CTAINVEN, :FECHA
        DO
        BEGIN
        EXECUTE PROCEDURE COSTO_PROMEDIO(:ARTICULO, :FECHA) returning_values (:COSTO);
        INSERT INTO COSTO_VENTAS VALUES (:ARTICULO, :CANTIDAD, :COSTO, :CTACOSTO, :CTAINVEN);
        END
    END
END

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE COSTO_EN_VENTAS_CONTADO(
    FECFAC DATE,
    PREF VARCHAR(4),
    PTVTA INTEGER)
AS
declare variable ARTICULO VARCHAR(20);
declare variable CANTIDAD NUMERIC(18,4);
declare variable COSTO NUMERIC(18,2);
declare variable CTACOSTO VARCHAR(20);
declare variable CTAINVEN VARCHAR(20);
BEGIN
    DELETE FROM COSTO_VENTAS;
    /* FACTURA DE VENTA */
    FOR SELECT MAX(D.ARTI_COD), SUM(FADE_CANT * FADE_FACTOR), MAX(COAR_CTACOS), MAX(COAR_CTAINV)
        FROM ARTICULO A, FACTURAS F, FACTURAS_DETALLE D, CONTABIL_ARTICULO C
        WHERE F.FACT_ID = D.FACT_ID AND A.ARTI_COD = D.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND FACT_ANULADO = 'N' AND FACT_FECHA = :FECFAC AND F.PREF_PRE = :PREF AND F.PTVT_ID = :PTVTA
        GROUP BY D.ARTI_COD
        INTO :ARTICULO, :CANTIDAD, :CTACOSTO, :CTAINVEN
        DO
        BEGIN
        EXECUTE PROCEDURE COSTO_PROMEDIO(:ARTICULO, :FECFAC) returning_values (:COSTO);
        INSERT INTO COSTO_VENTAS VALUES (:ARTICULO, :CANTIDAD, :COSTO * :CANTIDAD, :CTACOSTO, :CTAINVEN);
        END
END

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE COSTO_PROMEDIO_UNIDAD(
    ARTICULO VARCHAR(15),
    FECHA DATE,
    UNIDAD VARCHAR(8))
RETURNS (
    COSTO NUMERIC(18,2))
AS
declare variable FACTOR NUMERIC(15,4);
BEGIN
  EXECUTE PROCEDURE COSTO_PROMEDIO(ARTICULO, FECHA) returning_values (COSTO);
  EXECUTE PROCEDURE FACTOR_UNIDAD_CANT(ARTICULO, UNIDAD) returning_values (FACTOR);
  COSTO = COSTO * FACTOR;
  SUSPEND;
END

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE IMPR_AJUSTE(
    ID INTEGER)
RETURNS (
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    CONCEPTO VARCHAR(60),
    CODBODEGA VARCHAR(2),
    NOMBODEGA VARCHAR(30),
    OBS BLOB SUB_TYPE 1 SEGMENT SIZE 80,
    ITEM INTEGER,
    ARTICULO VARCHAR(15),
    CODBAR VARCHAR(15),
    ARTIDES VARCHAR(60),
    EXANT NUMERIC(18,4),
    EXNUE NUMERIC(18,4),
    UNIDAD VARCHAR(8),
    BODITEM VARCHAR(2),
    LOTE VARCHAR(15),
    COSTO NUMERIC(18,2),
    TOTAL NUMERIC(18,2))
AS
DECLARE VARIABLE ITEMS INTEGER;
DECLARE VARIABLE MAX_AJUSTE INTEGER;
BEGIN
  /*  */
  SELECT PREF_PRE, AJUS_NUMERO, AJUS_FECHA, AJUS_CONC, A.BODE_COD, BODE_NOM, AJUS_OBS
    FROM AJUSTES A, BODEGA B WHERE A.BODE_COD = B.BODE_COD AND A.AJUS_ID = :ID into
    :PREF, :NUMERO, :FECHA, :CONCEPTO, :CODBODEGA, :NOMBODEGA, :OBS;
  FOR SELECT AJUS_ITEM, A.ARTI_COD, AJUS_CODBAR, AJDE_DESC, AJUS_EXANT, AJUS_UNIDAD, BODE_COD, AJUS_EXNUE, AJUS_LOTE
    FROM AJUSTES_DETALLE D, ARTICULO A
    WHERE D.ARTI_COD = A.ARTI_COD AND D.AJUS_ID = :ID
    ORDER BY AJUS_ITEM
    INTO :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :EXANT, :UNIDAD, :BODITEM, :EXNUE, :LOTE
    DO
      BEGIN
      EXECUTE PROCEDURE COSTO_PROMEDIO(:ARTICULO, :FECHA) returning_values (:COSTO);
      TOTAL = (EXNUE - EXANT) * COSTO;
      SUSPEND;
      END
END

^

SET TERM ; ^

SET TERM ^ ;

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

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE REP_COMPROBANTES_ARTICULO(
    TIPODOC INTEGER,
    DETALLE CHAR(1),
    FECINI DATE,
    FECFIN DATE,
    ARTINI VARCHAR(20),
    ARTFIN VARCHAR(20),
    GRPINI VARCHAR(2),
    GRPFIN VARCHAR(2),
    ORDEN CHAR(1),
    SUBEMPRESA INTEGER)
RETURNS (
    CODIGO VARCHAR(15),
    NOMBRE VARCHAR(60),
    UNIDAD VARCHAR(8),
    CODGRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    CODSUBG VARCHAR(3),
    NOMSUBG VARCHAR(30),
    CODMARC VARCHAR(3),
    NOMMARC VARCHAR(30),
    CODBOD VARCHAR(2),
    NOMTIPO VARCHAR(30),
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    CONCEPTO VARCHAR(60),
    NIT VARCHAR(20),
    NOMTERC VARCHAR(60),
    CONS INTEGER,
    CANT NUMERIC(18,4),
    COSTO NUMERIC(18,2),
    COSTOTOT NUMERIC(18,2))
AS
declare variable ENT CHAR(1);
declare variable ENTRADAS NUMERIC(18,4);
declare variable COSTOENT NUMERIC(18,2);
declare variable SALIDAS NUMERIC(18,4);
declare variable COSTOSAL NUMERIC(18,2);
declare variable CODINI VARCHAR(20);
declare variable CODFIN VARCHAR(20);
declare variable DESINI VARCHAR(20);
declare variable DESFIN VARCHAR(20);
BEGIN
  SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = :TIPODOC INTO :NOMTIPO;
  if (ORDEN = 'C') then
    BEGIN
    CODINI = ARTINI;
    CODFIN = ARTFIN;
    DESINI = '';
    DESFIN = 'zz';
    END
  ELSE
    BEGIN
    DESINI = ARTINI;
    DESFIN = ARTFIN;
    CODINI = '';
    CODFIN = 'zz';
    END
  FOR
    SELECT ARTI_COD, ARTI_DES, ARTI_UNIDAD, A.GRUP_COD, A.SUBG_COD, A.MARC_COD
      FROM ARTICULO A
      WHERE ARTI_COD >= :CODINI AND ARTI_COD <= :CODFIN AND A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :GRPFIN AND ARTI_DES >= :DESINI AND ARTI_DES <= :DESFIN
      INTO :CODIGO, :NOMBRE, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
      DO
        BEGIN
        NOMMARC = '';
        NOMSUBG = '';
        SELECT GRUP_NOM FROM GRUPO WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
        SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
        SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
        if (DETALLE = 'N') then
            BEGIN
            CANT = 0;
            COSTOTOT = 0;
            /* SUME LAS ENTRADAS */
            SELECT SUM(MVAR_CANT), SUM(MVAR_CANT * MVAR_COSTO) FROM MOVIMIENTO_ARTICULO M, PREFIJOS P
              WHERE P.PREF_PRE = M.MVAR_PREF AND P.TIDO_COD = M.mvar_tipodoc AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA)) AND
              (MVAR_FECHA >= :FECINI) AND (MVAR_FECHA < :FECFIN) AND
              (ARTI_COD = :CODIGO) AND (MVAR_ENTRADA = 'S') AND (MVAR_TIPODOC = :TIPODOC)
              INTO :ENTRADAS, :COSTOENT;
            if (ENTRADAS IS NULL) then
              ENTRADAS = 0;
            if (COSTOENT IS NULL) then
              COSTOENT = 0;
            /* CALCULE LAS SALIDAS A COSTO PROMEDIO */
            SALIDAS = 0;
            COSTOSAL = 0;
            FOR SELECT MVAR_CANT, MVAR_FECHA
                FROM MOVIMIENTO_ARTICULO M, PREFIJOS P
                WHERE P.PREF_PRE = M.MVAR_PREF AND P.TIDO_COD = M.mvar_tipodoc AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA)) AND
                (MVAR_FECHA >= :FECINI) AND (MVAR_FECHA <= :FECFIN) AND
                (ARTI_COD = :CODIGO) AND (MVAR_ENTRADA = 'N') AND (MVAR_TIPODOC = :TIPODOC)
                INTO :CANT, :FECHA
                DO
                    BEGIN
                    EXECUTE PROCEDURE COSTO_PROMEDIO(:CODIGO, :FECHA) returning_values (:COSTO);
                    SALIDAS = SALIDAS + CANT;
                    COSTOSAL = COSTOSAL + (COSTO * CANT);
                    END
            if (SALIDAS IS NULL) then
              SALIDAS = 0;
            if (COSTOSAL IS NULL) then
              COSTOSAL = 0;
            if (ENTRADAS > 0) then
                CANT = ENTRADAS;
            if (SALIDAS > 0) then
                CANT = SALIDAS;
            if (COSTOENT > 0) then
                COSTOTOT = COSTOENT;
            if (COSTOSAL > 0) then
                COSTOTOT = COSTOSAL;
            if (CANT > 0) then
                COSTO = COSTOTOT / CANT;
            ELSE
                COSTO = 0;
            if (CANT <> 0) then
                SUSPEND;
            END
        ELSE
            BEGIN
            FOR SELECT MVAR_ENTRADA, MVAR_PREF, MVAR_NUMERO, MVAR_CANT, MVAR_COSTO, MVAR_CONC, MVAR_FECHA, M.TERC_NIT, TERC_NOM, MVAR_CONS, BODE_COD
                FROM MOVIMIENTO_ARTICULO M, TIPO_DOCUMENTO TD, PREFIJOS P
                LEFT OUTER JOIN TERCEROS T ON (M.TERC_NIT = T.TERC_NIT)
                WHERE TD.TIDO_COD = MVAR_TIPODOC AND P.PREF_PRE = M.MVAR_PREF AND P.TIDO_COD = M.mvar_tipodoc AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA)) AND
                (MVAR_FECHA >= :FECINI) AND (MVAR_FECHA < :FECFIN) AND (ARTI_COD = :CODIGO) AND (MVAR_TIPODOC = :TIPODOC)
                ORDER BY MVAR_FECHA, MVAR_CONS
                INTO :ENT, :PREFIJO, :NUMERO, :CANT, :COSTO, :CONCEPTO, :FECHA, :NIT, :NOMTERC, :CONS, :CODBOD
                DO
                    BEGIN
                    if (ENT = 'S') then
                        BEGIN
                        COSTOTOT = (CANT * COSTO);
                        end
                    ELSE
                        BEGIN
                        EXECUTE PROCEDURE COSTO_PROMEDIO(:CODIGO, :FECHA) returning_values (:COSTO);
                        COSTOTOT = (CANT * COSTO);
                        END
                    SUSPEND;
                    END
            END
        END
END

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE REP_COMPROBANTES_INV(
    TIPO INTEGER,
    DETALLE CHAR(1),
    FECINI DATE,
    FECFIN DATE,
    PREFIJO VARCHAR(4),
    ANULADOS CHAR(1),
    SUBEMPRESA INTEGER)
RETURNS (
    NOMTIPO VARCHAR(30),
    ID INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    VENCE DATE,
    CONCEPTO VARCHAR(60),
    REFER VARCHAR(60),
    CODBODORI VARCHAR(2),
    NOMBODORI VARCHAR(30),
    CODBODDES VARCHAR(2),
    NOMBODDES VARCHAR(30),
    NOMTERCERO VARCHAR(60),
    PRODCODBAR VARCHAR(15),
    PRODDES VARCHAR(60),
    PRODCANT NUMERIC(18,4),
    PRODUNIDAD VARCHAR(8),
    PRODLOTE VARCHAR(15),
    OBS BLOB SUB_TYPE 0 SEGMENT SIZE 80,
    ITEM INTEGER,
    ARTICULO VARCHAR(15),
    CODBAR VARCHAR(15),
    ARTIDES VARCHAR(60),
    CANT NUMERIC(18,4),
    EXANT NUMERIC(18,4),
    UNIDAD VARCHAR(8),
    BODITEM VARCHAR(2),
    COSTO NUMERIC(18,2),
    DTOPORC NUMERIC(9,2),
    DTOMONTO NUMERIC(18,2),
    IVAPORC NUMERIC(9,2),
    IVAMONTO NUMERIC(18,2),
    CONSUMO NUMERIC(18,2),
    SUBTOTAL NUMERIC(18,2),
    TOTAL NUMERIC(18,2),
    LOTE VARCHAR(15),
    ANULADO CHAR(1),
    OBSITEM BLOB SUB_TYPE 0 SEGMENT SIZE 80)
AS
BEGIN
  /* DETERMINE LA TABLA A EXAMINAR */
  if (BIN_AND(TIPO, 1) <> 0) then
    BEGIN
    SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 11 INTO :NOMTIPO;
    FOR SELECT ENTR_ID, E.PREF_PRE, ENTR_NUMERO, ENTR_FECHA, ENTR_CONC, ENTR_REFER, E.BODE_COD, BODE_NOM, ENTR_NOMTERC, ENTR_OBS, ENTR_ANULADO
    FROM ENTRADAS E, BODEGA B, PREFIJOS P
    WHERE E.BODE_COD = B.BODE_COD AND ENTR_FECHA >= :FECINI AND ENTR_FECHA <= :FECFIN
     AND P.PREF_PRE = E.PREF_PRE AND P.TIDO_COD = 11 AND ((P.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
    ORDER BY ENTR_FECHA, ENTR_ID
    INTO :ID, :PREF, :NUMERO, :FECHA, :CONCEPTO, :REFER, :CODBODORI, :NOMBODORI, :NOMTERCERO, :OBS, :ANULADO
    DO
        BEGIN
        if (((:PREFIJO = '') or (:PREF = :PREFIJO)) AND ((:ANULADOS = 'S') or (:ANULADO = 'N'))) then
            BEGIN
            if (anulado = 'S') then
             BEGIN
              ITEM = 0;
              ARTICULO = '';
              CODBAR = '';
              ARTIDES = '';
              CANT = 0;
              UNIDAD = '';
              BODITEM = '';
              lote = '';
              costo = 0;
              DTOPORC = 0;
              DTOMONTO = 0;
              IVAPORC = 0;
              IVAMONTO = 0;
              CONSUMO = 0;
              TOTAL = 0;
              OBSITEM = null;
              SUBTOTAL = 0;
              SUSPEND;
             END
            ELSE
             BEGIN
              if (DETALLE = 'S') then
                FOR SELECT ENDE_ITEM, A.ARTI_COD, ENDE_CODBAR, ENDE_DESC, ENDE_CANT, ENDE_UNIDAD, BODE_COD, ENDE_COSTO, ENDE_DTOPORC, ENDE_DTOMONTO, ENDE_IVAPORC, ENDE_IVAMONTO, ENDE_CONSUMO, ENDE_TOTAL, ENDE_LOTE, ENDE_OBS
                    FROM ENTRADAS_DETALLE D, ARTICULO A WHERE D.ARTI_COD = A.ARTI_COD AND D.ENTR_ID = :ID INTO
                    :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :BODITEM, :COSTO, :DTOPORC, :DTOMONTO, :IVAPORC, :IVAMONTO, :CONSUMO, :TOTAL, :LOTE, :OBSITEM
                    DO
                    BEGIN
                    SUBTOTAL = TOTAL - IVAMONTO - CONSUMO;
                    SUSPEND;
                    END
              ELSE
                BEGIN
                SELECT SUM(ENDE_IVAMONTO), SUM(ENDE_CONSUMO), SUM(ENDE_TOTAL)
                    FROM ENTRADAS_DETALLE D WHERE D.ENTR_ID = :ID INTO
                    :IVAMONTO, :CONSUMO, :TOTAL;
                SUBTOTAL = TOTAL - IVAMONTO - CONSUMO;
                SUSPEND;
                END
             END
            END
        END
    END
  if (BIN_AND(TIPO, 2) <> 0) then
    BEGIN
    SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 12 INTO :NOMTIPO;
    FOR SELECT SALI_ID, S.PREF_PRE, SALI_NUMERO, SALI_FECHA, SALI_CONC, SALI_REFER, S.BODE_COD, BODE_NOM, SALI_NOMTERC, SALI_OBS, SALI_ANULADO
    FROM SALIDAS S, BODEGA B, PREFIJOS P
    WHERE S.BODE_COD = B.BODE_COD AND SALI_FECHA >= :FECINI AND SALI_FECHA <= :FECFIN 
     AND P.PREF_PRE = S.PREF_PRE AND P.TIDO_COD = 12 AND ((P.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
    ORDER BY SALI_FECHA, SALI_ID
    into :ID, :PREF, :NUMERO, :FECHA, :CONCEPTO, :REFER, :CODBODORI, :NOMBODORI, :NOMTERCERO, :OBS, :ANULADO
    DO
        BEGIN
        if (((:PREFIJO = '') or (:PREF = :PREFIJO)) AND ((:ANULADOS = 'S') or (:ANULADO = 'N'))) then
            BEGIN
            if (anulado = 'S') then
             BEGIN
              ITEM = 0;
              ARTICULO = '';
              CODBAR = '';
              ARTIDES = '';
              CANT = 0;
              UNIDAD = '';
              BODITEM = '';
              lote = '';
              costo = 0;
              DTOPORC = 0;
              DTOMONTO = 0;
              IVAPORC = 0;
              IVAMONTO = 0;
              CONSUMO = 0;
              EXANT = 0;
              TOTAL = 0;
              OBSITEM = null;
              SUBTOTAL = 0;
              SUSPEND;
             END
            ELSE
             BEGIN
              if (DETALLE = 'S') then
                FOR SELECT SADE_ITEM, A.ARTI_COD, SADE_CODBAR, SADE_DESC, SADE_CANT, SADE_UNIDAD, BODE_COD, SADE_COSTO, SADE_IVAPORC, SADE_IVAMONTO, SADE_CONSUMO, SADE_TOTAL, SADE_LOTE, SADE_OBS
                    FROM SALIDAS_DETALLE D, ARTICULO A WHERE D.ARTI_COD = A.ARTI_COD AND D.SALI_ID = :ID INTO
                    :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :BODITEM, :COSTO, :IVAPORC, :IVAMONTO, :CONSUMO, :TOTAL, :LOTE, :OBSITEM
                    DO
                BEGIN
                SUBTOTAL = TOTAL - IVAMONTO - CONSUMO;
                SUSPEND;
                END
              ELSE
                BEGIN
                SELECT SUM(SADE_IVAMONTO), SUM(SADE_CONSUMO), SUM(SADE_TOTAL)
                    FROM SALIDAS_DETALLE D WHERE D.SALI_ID = :ID INTO
                    :IVAMONTO, :CONSUMO, :TOTAL;
                SUBTOTAL = TOTAL - IVAMONTO - CONSUMO;
                SUSPEND;
                END
             END
            END
        END
    END
  if (BIN_AND(TIPO, 4) <> 0) then
    BEGIN
    SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 13 INTO :NOMTIPO;
    FOR SELECT TRAN_ID, T.PREF_PRE, TRAN_NUMERO, TRAN_FECHA, TRAN_CONC, TRAN_REFER, T.BODE_COD, BO.BODE_NOM, TRAN_BODDES, BD.BODE_NOM, TRAN_OBS, TRAN_ANULADO
    FROM TRASFERENCIAS T, BODEGA BO, BODEGA BD, PREFIJOS P
    WHERE T.BODE_COD = BO.BODE_COD AND T.TRAN_BODDES = BD.BODE_COD AND TRAN_FECHA >= :FECINI AND TRAN_FECHA <= :FECFIN 
     AND P.PREF_PRE = T.PREF_PRE AND P.TIDO_COD = 13 AND ((P.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
    ORDER BY TRAN_FECHA, TRAN_ID
    into :ID, :PREF, :NUMERO, :FECHA, :CONCEPTO, :REFER, :CODBODORI, :NOMBODORI, :CODBODDES, :NOMBODDES, :OBS, :ANULADO
    DO
        BEGIN
        if (((:PREFIJO = '') or (:PREF = :PREFIJO)) AND ((:ANULADOS = 'S') or (:ANULADO = 'N'))) then
            BEGIN
            if (anulado = 'S') then
             BEGIN
              ITEM = 0;
              ARTICULO = '';
              CODBAR = '';
              ARTIDES = '';
              CANT = 0;
              UNIDAD = '';
              BODITEM = '';
              lote = '';
              costo = 0;
              DTOPORC = 0;
              DTOMONTO = 0;
              IVAPORC = 0;
              IVAMONTO = 0;
              CONSUMO = 0;
              EXANT = 0;
              TOTAL = 0;
              OBSITEM = null;
              SUBTOTAL = 0;
              SUSPEND;
             END
            ELSE
             BEGIN
              if (DETALLE = 'S') then
                FOR SELECT TRAS_ITEM, A.ARTI_COD, TRAS_CODBAR, TRAS_DESC, TRAS_CANT, TRAS_UNIDAD, TRAS_COSTO, TRAS_IVAPORC, TRAS_IVAMONTO, TRAS_CONSUMO, TRAS_TOTAL, TRAS_LOTE, TRAS_OBS
                    FROM TRASFERENCIAS_DETALLE D, ARTICULO A WHERE D.ARTI_COD = A.ARTI_COD AND D.TRAN_ID = :ID INTO
                    :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :COSTO, :IVAPORC, :IVAMONTO, :CONSUMO, :TOTAL, :LOTE, :OBSITEM
                    DO
                    BEGIN
                    SUBTOTAL = TOTAL - IVAMONTO - CONSUMO;
                    SUSPEND;
                    END
              ELSE
                BEGIN
                SELECT SUM(TRAS_IVAMONTO), SUM(TRAS_CONSUMO), SUM(TRAS_TOTAL) FROM trasferencias_detalle D
                    WHERE D.TRAN_ID = :ID INTO :IVAMONTO, :CONSUMO, :TOTAL;
                SUBTOTAL = TOTAL - IVAMONTO - CONSUMO;
                SUSPEND;
                END
             END
            END
        END
    END
  if (BIN_AND(TIPO, 8) <> 0) then
    BEGIN
    SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 14 INTO :NOMTIPO;
    FOR SELECT AJUS_ID, A.PREF_PRE, AJUS_NUMERO, AJUS_FECHA, AJUS_CONC, A.BODE_COD, BODE_NOM, AJUS_OBS, AJUS_ANULADO
    FROM AJUSTES A, BODEGA B, PREFIJOS P
    WHERE A.BODE_COD = B.BODE_COD AND AJUS_FECHA >= :FECINI AND AJUS_FECHA <= :FECFIN 
     AND P.PREF_PRE = A.PREF_PRE AND P.TIDO_COD = 14 AND ((P.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
    ORDER BY AJUS_FECHA, AJUS_ID
    into :ID, :PREF, :NUMERO, :FECHA, :CONCEPTO, :CODBODORI, :NOMBODORI, :OBS, :ANULADO
    DO
        BEGIN
        if (((:PREFIJO = '') or (:PREF = :PREFIJO)) AND ((:ANULADOS = 'S') or (:ANULADO = 'N'))) then
            BEGIN
            if (anulado = 'S') then
             BEGIN
              ITEM = 0;
              ARTICULO = '';
              CODBAR = '';
              ARTIDES = '';
              CANT = 0;
              UNIDAD = '';
              BODITEM = '';
              lote = '';
              costo = 0;
              DTOPORC = 0;
              DTOMONTO = 0;
              IVAPORC = 0;
              IVAMONTO = 0;
              CONSUMO = 0;
              EXANT = 0;
              TOTAL = 0;
              OBSITEM = null;
              SUBTOTAL = 0;
              SUSPEND;
             END
            ELSE
             BEGIN
              if (DETALLE = 'S') then
                FOR SELECT AJUS_ITEM, A.ARTI_COD, AJUS_CODBAR, AJDE_DESC, AJUS_EXANT, AJUS_UNIDAD, BODE_COD, AJUS_EXNUE, AJUS_LOTE, AJDE_OBS
                    FROM AJUSTES_DETALLE D, ARTICULO A WHERE D.ARTI_COD = A.ARTI_COD AND D.AJUS_ID = :ID INTO
                    :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :EXANT, :UNIDAD, :BODITEM, :CANT, :LOTE, :OBSITEM
                    DO
                      BEGIN
                      EXECUTE PROCEDURE COSTO_PROMEDIO(:ARTICULO, :FECHA) returning_values (:COSTO);
                      TOTAL = (CANT - EXANT) * COSTO;
                      SUBTOTAL = TOTAL;
                      SUSPEND;
                      END
              ELSE
                BEGIN
                TOTAL = 0;
                FOR SELECT ARTI_COD, AJUS_EXNUE, AJUS_EXANT FROM AJUSTES_DETALLE D WHERE D.AJUS_ID = :ID INTO
                    :ARTICULO, :CANT, :EXANT
                    DO
                      BEGIN
                      EXECUTE PROCEDURE COSTO_PROMEDIO(:ARTICULO, :FECHA) returning_values (:COSTO);
                      TOTAL = TOTAL + ((CANT - EXANT) * COSTO);
                      SUBTOTAL = TOTAL;
                      END
                SUSPEND;
                END
             END
            END
        END
    END
  if (BIN_AND(TIPO, 16) <> 0) then
    BEGIN
    SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 15 INTO :NOMTIPO;
    FOR SELECT ENSA_ID, E.PREF_PRE, ENSA_NUMERO, ENSA_FECHA, ENSA_CONC, ENSA_REFER, E.BODE_COD, BODE_NOM, ENSA_CODBAR, ENSA_DESC, ENSA_CANT, ENSA_UNIDAD, ENSA_LOTE, ENSA_OBS, ENSA_ANULADO
    FROM ENSAMBLES E, BODEGA B, PREFIJOS P
    WHERE E.BODE_COD = B.BODE_COD AND E.ENSA_FECHA >= :FECINI AND E.ENSA_FECHA <= :FECFIN
     AND P.PREF_PRE = E.PREF_PRE AND P.TIDO_COD = 15 AND ((P.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
    ORDER BY ENSA_FECHA, ENSA_ID
    into :ID, :PREF, :NUMERO, :FECHA, :CONCEPTO, :REFER, :CODBODORI, :NOMBODORI, :PRODCODBAR, :PRODDES, :PRODCANT, :PRODUNIDAD, :PRODLOTE, :OBS, :ANULADO
    DO
        BEGIN
        if (((:PREFIJO = '') or (:PREF = :PREFIJO)) AND ((:ANULADOS = 'S') or (:ANULADO = 'N'))) then
            BEGIN
            if (anulado = 'S') then
             BEGIN
              ITEM = 0;
              ARTICULO = '';
              CODBAR = '';
              ARTIDES = '';
              CANT = 0;
              UNIDAD = '';
              BODITEM = '';
              lote = '';
              costo = 0;
              DTOPORC = 0;
              DTOMONTO = 0;
              IVAPORC = 0;
              IVAMONTO = 0;
              CONSUMO = 0;
              EXANT = 0;
              TOTAL = 0;
              OBSITEM = null;
              SUBTOTAL = 0;
              SUSPEND;
             END
            ELSE
             BEGIN
              if (DETALLE = 'S') then
                FOR SELECT ESDE_ITEM, A.ARTI_COD, ESDE_CODBAR, ESDE_DESC, ESDE_CANT, ESDE_UNIDAD, BODE_COD, ESDE_COSTO, ESDE_IVAPORC, ESDE_IVAMONTO, ESDE_CONSUMO, ESDE_TOTAL, ESDE_LOTE, ESDE_OBS
                    FROM ensambles_detalle D, ARTICULO A WHERE D.ARTI_COD = A.ARTI_COD AND D.ENSA_ID = :ID INTO
                    :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :BODITEM, :COSTO, :IVAPORC, :IVAMONTO, :CONSUMO, :TOTAL, :LOTE, :OBSITEM
                    DO
                    BEGIN
                    SUBTOTAL = TOTAL - IVAMONTO - CONSUMO;
                    SUSPEND;
                    END
              ELSE
                BEGIN
                SELECT SUM(ESDE_IVAMONTO), SUM(ESDE_CONSUMO), SUM(ESDE_TOTAL) FROM ENSAMBLES_detalle D WHERE D.ENSA_ID = :ID INTO
                    :IVAMONTO, :CONSUMO, :TOTAL;
                SUBTOTAL = TOTAL - IVAMONTO - CONSUMO;
                SUSPEND;
                END
             END
            END
        END
    END
  if (BIN_AND(TIPO, 32) <> 0) then
    BEGIN
    SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 16 INTO :NOMTIPO;
    FOR SELECT DESE_ID, E.PREF_PRE, DESE_NUMERO, DESE_FECHA, DESE_CONC, DESE_REFER, E.BODE_COD, BODE_NOM, DESE_CODBAR, DESE_DESC, DESE_CANT, DESE_UNIDAD, DESE_LOTE, DESE_OBS, DESE_ANULADO
    FROM DESENSAMBLES E, BODEGA B, PREFIJOS P
    WHERE E.BODE_COD = B.BODE_COD AND DESE_FECHA >= :FECINI AND DESE_FECHA <= :FECFIN 
     AND P.PREF_PRE = E.PREF_PRE AND P.TIDO_COD = 16 AND ((P.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
    ORDER BY DESE_FECHA, DESE_ID
    into :ID, PREF, :NUMERO, :FECHA, :CONCEPTO, :REFER, :CODBODORI, :NOMBODORI, :PRODCODBAR, :PRODDES, :PRODCANT, :PRODUNIDAD, :PRODLOTE, :OBS, :ANULADO
    DO
        BEGIN
        if (((:PREFIJO = '') or (:PREF = :PREFIJO)) AND ((:ANULADOS = 'S') or (:ANULADO = 'N'))) then
            BEGIN
            if (anulado = 'S') then
             BEGIN
              ITEM = 0;
              ARTICULO = '';
              CODBAR = '';
              ARTIDES = '';
              CANT = 0;
              UNIDAD = '';
              BODITEM = '';
              lote = '';
              costo = 0;
              DTOPORC = 0;
              DTOMONTO = 0;
              IVAPORC = 0;
              IVAMONTO = 0;
              CONSUMO = 0;
              EXANT = 0;
              TOTAL = 0;
              OBSITEM = null;
              SUBTOTAL = 0;
              SUSPEND;
             END
            ELSE
             BEGIN
              if (DETALLE = 'S') then
                FOR SELECT DESE_ITEM, A.ARTI_COD, DEDE_CODBAR, DEDE_DESC, DEDE_CANT, DEDE_UNIDAD, BODE_COD, DEDE_COSTO, DEDE_IVAPORC, DEDE_IVAMONTO, DEDE_CONSUMO, DEDE_TOTAL, DEDE_LOTE, DEDE_OBS
                    FROM desensambles_detalle D, ARTICULO A WHERE D.ARTI_COD = A.ARTI_COD AND D.DESE_ID = :ID INTO
                    :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :BODITEM, :COSTO, :IVAPORC, :IVAMONTO, :CONSUMO, :TOTAL, :LOTE, :OBSITEM
                    DO
                    BEGIN
                    SUBTOTAL = TOTAL - IVAMONTO - CONSUMO;
                    SUSPEND;
                    END
              ELSE
                BEGIN
                SELECT SUM(DEDE_IVAMONTO), SUM(DEDE_CONSUMO), SUM(DEDE_TOTAL) FROM DESENSAMBLES_detalle D WHERE D.DESE_ID = :ID INTO
                    :IVAMONTO, :CONSUMO, :TOTAL;
                SUBTOTAL = TOTAL - IVAMONTO - CONSUMO;
                SUSPEND;
                END
             END
            END
        END
    END
  if (BIN_AND(TIPO, 64) <> 0) then
    BEGIN
    SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 17 INTO :NOMTIPO;
    FOR SELECT RESE_ID, R.PREF_PRE, RESE_NUMERO, RESE_FECHA, RESE_CONC, RESE_REFER, R.BODE_COD, BODE_NOM, RESE_NOMTERC, RESE_OBS, RESE_ANULADO
    FROM RESERVAS R, BODEGA B, PREFIJOS P
    WHERE R.BODE_COD = B.BODE_COD AND R.RESE_FECHA >= :FECINI AND R.RESE_FECHA <= :FECFIN 
     AND P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = 17 AND ((P.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
    ORDER BY RESE_FECHA, RESE_ID
    into :ID, :PREF, :NUMERO, :FECHA, :CONCEPTO, :REFER, :CODBODORI, :NOMBODORI, :NOMTERCERO, :OBS, :ANULADO
    DO
        BEGIN
        if (((:PREFIJO = '') or (:PREF = :PREFIJO)) AND ((:ANULADOS = 'S') or (:ANULADO = 'N'))) then
            BEGIN
            if (anulado = 'S') then
             BEGIN
              ITEM = 0;
              ARTICULO = '';
              CODBAR = '';
              ARTIDES = '';
              CANT = 0;
              UNIDAD = '';
              BODITEM = '';
              lote = '';
              costo = 0;
              DTOPORC = 0;
              DTOMONTO = 0;
              IVAPORC = 0;
              IVAMONTO = 0;
              CONSUMO = 0;
              EXANT = 0;
              TOTAL = 0;
              OBSITEM = null;
              SUBTOTAL = 0;
              SUSPEND;
             END
            ELSE
             BEGIN
              if (DETALLE = 'S') then
                FOR SELECT RSDE_ITEM, A.ARTI_COD, RSDE_CODBAR, RSDE_DESC, RDSE_CANT, RSDE_UNIDAD, BODE_COD, RSDE_OBS
                    FROM RESERVAS_DETALLE D, ARTICULO A WHERE D.ARTI_COD = A.ARTI_COD AND D.RESE_ID = :ID INTO
                    :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :BODITEM, :OBSITEM
                    DO
                    SUSPEND;
              ELSE
                BEGIN
                SELECT SUM(RDSE_CANT) FROM RESERVAS_detalle D WHERE D.RESE_ID = :ID INTO
                    :CANT;
                SUSPEND;
                END
             END
            END
        END
    END
  if (BIN_AND(TIPO, 128) <> 0) then
    BEGIN
    SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 18 INTO :NOMTIPO;
    FOR SELECT ORIN_ID, O.PREF_PRE, ORIN_NUMERO, ORIN_FECHA, ORIN_FECLLEGA, ORIN_CONC, ORIN_REFER, ORIN_NOMTERC, ORIN_OBS, ORIN_ANULADO
        FROM ORDENES_INVENTARIO O, PREFIJOS P
        WHERE ORIN_FECHA >= :FECINI AND ORIN_FECHA <= :FECFIN 
        AND P.PREF_PRE = O.PREF_PRE AND P.TIDO_COD = 18 AND ((P.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
        ORDER BY ORIN_FECHA, ORIN_ID
        into :ID, PREF, :NUMERO, :FECHA, :VENCE, :CONCEPTO, :REFER, :NOMTERCERO, :OBS, :ANULADO
        DO
        BEGIN
        if (((:PREFIJO = '') or (:PREF = :PREFIJO)) AND ((:ANULADOS = 'S') or (:ANULADO = 'N'))) then
            BEGIN
            if (anulado = 'S') then
             BEGIN
              ITEM = 0;
              ARTICULO = '';
              CODBAR = '';
              ARTIDES = '';
              CANT = 0;
              UNIDAD = '';
              BODITEM = '';
              lote = '';
              costo = 0;
              DTOPORC = 0;
              DTOMONTO = 0;
              IVAPORC = 0;
              IVAMONTO = 0;
              CONSUMO = 0;
              EXANT = 0;
              TOTAL = 0;
              OBSITEM = null;
              SUBTOTAL = 0;
              SUSPEND;
             END
            ELSE
             BEGIN
              if (DETALLE = 'S') then
                FOR SELECT ORID_ITEM, A.ARTI_COD, ORID_CODBAR, ORID_DESC, ORID_CANT, ORID_UNIDAD, ORIN_COSTO, ORID_DTOPORC, ORID_DTOMONTO, ORID_IVAPORC, ORID_IVAMONTO, ORID_CONSUMO, ORID_TOTAL, ORID_OBS, ORID_LOTE
                    FROM ORDENINVENTARIO_DETALLE D, ARTICULO A WHERE D.ARTI_COD = A.ARTI_COD AND D.ORIN_ID = :ID INTO
                    :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :COSTO, :DTOPORC, :DTOMONTO, :IVAPORC, :IVAMONTO, :CONSUMO, :TOTAL, :OBSITEM, :LOTE
                    DO
                    BEGIN
                    SUBTOTAL = TOTAL - IVAMONTO - CONSUMO;
                    SUSPEND;
                    END
              ELSE
                BEGIN
                SELECT SUM(ORID_IVAMONTO), SUM(ORID_CONSUMO), SUM(ORID_TOTAL) FROM ordeninventario_detalle D WHERE D.ORIN_ID = :ID INTO
                    :IVAMONTO, :CONSUMO, :TOTAL;
                SUBTOTAL = TOTAL - IVAMONTO - CONSUMO;
                SUSPEND;
                END
             END
            END
        END
    END
END

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE REP_CONSECUTIVOS_INV(
    TIPO INTEGER,
    DETALLE CHAR(1),
    PREINI VARCHAR(4),
    PREFIN VARCHAR(4),
    NUMINI VARCHAR(6),
    NUMFIN VARCHAR(6),
    ANULADOS CHAR(1),
    SUBEMPRESA INTEGER)
RETURNS (
    NOMTIPO VARCHAR(30),
    ID INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    VENCE DATE,
    CONCEPTO VARCHAR(60),
    REFER VARCHAR(60),
    CODBODORI VARCHAR(2),
    NOMBODORI VARCHAR(30),
    CODBODDES VARCHAR(2),
    NOMBODDES VARCHAR(30),
    NOMTERCERO VARCHAR(60),
    PRODCODBAR VARCHAR(15),
    PRODDES VARCHAR(60),
    PRODCANT NUMERIC(18,4),
    PRODUNIDAD VARCHAR(8),
    PRODLOTE VARCHAR(15),
    OBS BLOB SUB_TYPE 0 SEGMENT SIZE 80,
    ITEM INTEGER,
    ARTICULO VARCHAR(15),
    CODBAR VARCHAR(15),
    ARTIDES VARCHAR(60),
    CANT NUMERIC(18,4),
    EXANT NUMERIC(18,4),
    UNIDAD VARCHAR(8),
    BODITEM VARCHAR(2),
    COSTO NUMERIC(18,2),
    DTOPORC NUMERIC(9,2),
    DTOMONTO NUMERIC(18,2),
    IVAPORC NUMERIC(9,2),
    IVAMONTO NUMERIC(18,2),
    CONSUMO NUMERIC(18,2),
    SUBTOTAL NUMERIC(18,2),
    TOTAL NUMERIC(18,2),
    LOTE VARCHAR(15),
    ANULADO CHAR(1),
    OBSITEM BLOB SUB_TYPE 0 SEGMENT SIZE 80)
AS
BEGIN
  /* DETERMINE LA TABLA A EXAMINAR */
  if (BIN_AND(TIPO, 1) <> 0) then
    BEGIN
    SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 11 INTO :NOMTIPO;
    FOR SELECT ENTR_ID, E.PREF_PRE, ENTR_NUMERO, ENTR_FECHA, ENTR_CONC, ENTR_REFER, E.BODE_COD, BODE_NOM, ENTR_NOMTERC, ENTR_OBS, ENTR_ANULADO
    FROM ENTRADAS E, BODEGA B, PREFIJOS PR
    WHERE E.BODE_COD = B.BODE_COD AND E.PREF_PRE >= :PREINI AND E.PREF_PRE <= :PREFIN AND ENTR_NUMERO >= :NUMINI AND ENTR_NUMERO <= :NUMFIN
     AND PR.PREF_PRE = E.PREF_PRE AND PR.TIDO_COD = 11 AND ((PR.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
    ORDER BY E.PREF_PRE, ENTR_NUMERO
    INTO :ID, :PREF, :NUMERO, :FECHA, :CONCEPTO, :REFER, :CODBODORI, :NOMBODORI, :NOMTERCERO, :OBS, :ANULADO
    DO
        BEGIN
        if ((:ANULADOS = 'S') or (:ANULADO = 'N')) then
            BEGIN
            if (anulado = 'S') then
             BEGIN
              ITEM = 0;
              ARTICULO = '';
              CODBAR = '';
              ARTIDES = '';
              CANT = 0;
              UNIDAD = '';
              BODITEM = '';
              lote = '';
              costo = 0;
              DTOPORC = 0;
              DTOMONTO = 0;
              IVAPORC = 0;
              IVAMONTO = 0;
              CONSUMO = 0;
              TOTAL = 0;
              OBSITEM = null;
              SUBTOTAL = 0;
              SUSPEND;
             END
            ELSE
             BEGIN
              if (DETALLE = 'S') then
                FOR SELECT ENDE_ITEM, A.ARTI_COD, ENDE_CODBAR, ENDE_DESC, ENDE_CANT, ENDE_UNIDAD, BODE_COD, ENDE_COSTO, ENDE_DTOPORC, ENDE_DTOMONTO, ENDE_IVAPORC, ENDE_IVAMONTO, ENDE_CONSUMO, ENDE_TOTAL, ENDE_LOTE, ENDE_OBS
                    FROM ENTRADAS_DETALLE D, ARTICULO A
                    WHERE D.ARTI_COD = A.ARTI_COD AND D.ENTR_ID = :ID
                    ORDER BY ENDE_ITEM
                    INTO :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :BODITEM, :COSTO, :DTOPORC, :DTOMONTO, :IVAPORC, :IVAMONTO, :CONSUMO, :TOTAL, :LOTE, :OBSITEM
                    DO
                    BEGIN
                    SUBTOTAL = TOTAL - IVAMONTO - CONSUMO;
                    SUSPEND;
                    END
              ELSE
                BEGIN
                SELECT SUM(ENDE_IVAMONTO), SUM(ENDE_CONSUMO), SUM(ENDE_TOTAL) FROM ENTRADAS_DETALLE D WHERE D.ENTR_ID = :ID INTO
                    :IVAMONTO, :CONSUMO, :TOTAL;
                SUBTOTAL = TOTAL - IVAMONTO - CONSUMO;
                SUSPEND;
                END
             END
            END
        END
    END
  if (BIN_AND(TIPO, 2) <> 0) then
    BEGIN
    SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 12 INTO :NOMTIPO;
    FOR SELECT SALI_ID, S.PREF_PRE, SALI_NUMERO, SALI_FECHA, SALI_CONC, SALI_REFER, S.BODE_COD, BODE_NOM, SALI_NOMTERC, SALI_OBS, SALI_ANULADO
    FROM SALIDAS S, BODEGA B, PREFIJOS PR
    WHERE S.BODE_COD = B.BODE_COD AND S.PREF_PRE >= :PREINI AND S.PREF_PRE <= :PREFIN AND SALI_NUMERO >= :NUMINI AND SALI_NUMERO <= :NUMFIN
     AND PR.PREF_PRE = S.PREF_PRE AND PR.TIDO_COD = 12 AND ((PR.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
    ORDER BY S.PREF_PRE, SALI_NUMERO
    into :ID, :PREF, :NUMERO, :FECHA, :CONCEPTO, :REFER, :CODBODORI, :NOMBODORI, :NOMTERCERO, :OBS, :ANULADO
    DO
        BEGIN
        if ((:ANULADOS = 'S') or (:ANULADO = 'N')) then
            BEGIN
            if (anulado = 'S') then
             BEGIN
              ITEM = 0;
              ARTICULO = '';
              CODBAR = '';
              ARTIDES = '';
              CANT = 0;
              UNIDAD = '';
              BODITEM = '';
              lote = '';
              costo = 0;
              DTOPORC = 0;
              DTOMONTO = 0;
              IVAPORC = 0;
              IVAMONTO = 0;
              CONSUMO = 0;
              TOTAL = 0;
              OBSITEM = null;
              SUBTOTAL = 0;
              SUSPEND;
             END
            ELSE
             BEGIN
              if (DETALLE = 'S') then
                FOR SELECT SADE_ITEM, A.ARTI_COD, SADE_CODBAR, SADE_DESC, SADE_CANT, SADE_UNIDAD, BODE_COD, SADE_COSTO, SADE_IVAPORC, SADE_IVAMONTO, SADE_CONSUMO, SADE_TOTAL, SADE_LOTE, SADE_OBS
                FROM SALIDAS_DETALLE D, ARTICULO A
                WHERE D.ARTI_COD = A.ARTI_COD AND D.SALI_ID = :ID
                ORDER BY SADE_ITEM
                INTO :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :BODITEM, :COSTO, :IVAPORC, :IVAMONTO, :CONSUMO, :TOTAL, :LOTE, :OBSITEM
                    DO
                BEGIN
                SUBTOTAL = TOTAL - IVAMONTO - CONSUMO;
                SUSPEND;
                END
              ELSE
                BEGIN
                SELECT SUM(SADE_IVAMONTO), SUM(SADE_CONSUMO), SUM(SADE_TOTAL) FROM SALIDAS_DETALLE D WHERE D.SALI_ID = :ID INTO
                    :IVAMONTO, :CONSUMO, :TOTAL;
                SUBTOTAL = TOTAL - IVAMONTO - CONSUMO;
                SUSPEND;
                END
             END
            END
        END
    END
  if (BIN_AND(TIPO, 4) <> 0) then
    BEGIN
    SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 13 INTO :NOMTIPO;
    FOR SELECT TRAN_ID, T.PREF_PRE, TRAN_NUMERO, TRAN_FECHA, TRAN_CONC, TRAN_REFER, T.BODE_COD, BO.BODE_NOM, TRAN_BODDES, BD.BODE_NOM, TRAN_OBS, TRAN_ANULADO
    FROM TRASFERENCIAS T, BODEGA BO, BODEGA BD, PREFIJOS PR
    WHERE T.BODE_COD = BO.BODE_COD AND T.TRAN_BODDES = BD.BODE_COD AND T.PREF_PRE >= :PREINI AND T.PREF_PRE <= :PREFIN AND TRAN_NUMERO >= :NUMINI AND TRAN_NUMERO <= :NUMFIN
     AND PR.PREF_PRE = T.PREF_PRE AND PR.TIDO_COD = 13 AND ((PR.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
    ORDER BY T.PREF_PRE, TRAN_NUMERO
    into :ID, :PREF, :NUMERO, :FECHA, :CONCEPTO, :REFER, :CODBODORI, :NOMBODORI, :CODBODDES, :NOMBODDES, :OBS, :ANULADO
    DO
        BEGIN
        if ((:ANULADOS = 'S') or (:ANULADO = 'N')) then
            BEGIN
            if (anulado = 'S') then
             BEGIN
              ITEM = 0;
              ARTICULO = '';
              CODBAR = '';
              ARTIDES = '';
              CANT = 0;
              UNIDAD = '';
              BODITEM = '';
              lote = '';
              costo = 0;
              DTOPORC = 0;
              DTOMONTO = 0;
              IVAPORC = 0;
              IVAMONTO = 0;
              CONSUMO = 0;
              TOTAL = 0;
              OBSITEM = null;
              SUBTOTAL = 0;
              SUSPEND;
             END
            ELSE
             BEGIN
              if (DETALLE = 'S') then
                FOR SELECT TRAS_ITEM, A.ARTI_COD, TRAS_CODBAR, TRAS_DESC, TRAS_CANT, TRAS_UNIDAD, TRAS_COSTO, TRAS_IVAPORC, TRAS_IVAMONTO, TRAS_CONSUMO, TRAS_TOTAL, TRAS_LOTE, TRAS_OBS
                FROM TRASFERENCIAS_DETALLE D, ARTICULO A
                WHERE D.ARTI_COD = A.ARTI_COD AND D.TRAN_ID = :ID
                ORDER BY TRAS_ITEM
                INTO :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :COSTO, :IVAPORC, :IVAMONTO, :CONSUMO, :TOTAL, :LOTE, :OBSITEM
                    DO
                    BEGIN
                    SUBTOTAL = TOTAL - IVAMONTO - CONSUMO;
                    SUSPEND;
                    END
              ELSE
                BEGIN
                SELECT SUM(TRAS_IVAMONTO), SUM(TRAS_CONSUMO), SUM(TRAS_TOTAL) FROM trasferencias_detalle D WHERE D.TRAN_ID = :ID INTO
                    :IVAMONTO, :CONSUMO, :TOTAL;
                SUBTOTAL = TOTAL - IVAMONTO - CONSUMO;
                SUSPEND;
                END
             END
            END
        END
    END
  if (BIN_AND(TIPO, 8) <> 0) then
    BEGIN
    SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 14 INTO :NOMTIPO;
    FOR SELECT AJUS_ID, A.PREF_PRE, AJUS_NUMERO, AJUS_FECHA, AJUS_CONC, A.BODE_COD, BODE_NOM, AJUS_OBS, AJUS_ANULADO
    FROM AJUSTES A, BODEGA B, PREFIJOS PR
    WHERE A.BODE_COD = B.BODE_COD AND A.PREF_PRE >= :PREINI AND A.PREF_PRE <= :PREFIN AND AJUS_NUMERO >= :NUMINI AND AJUS_NUMERO <= :NUMFIN
     AND PR.PREF_PRE = A.PREF_PRE AND PR.TIDO_COD = 14 AND ((PR.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
    ORDER BY A.PREF_PRE, AJUS_NUMERO
    into :ID, :PREF, :NUMERO, :FECHA, :CONCEPTO, :CODBODORI, :NOMBODORI, :OBS, :ANULADO
    DO
        BEGIN
        if ((:ANULADOS = 'S') or (:ANULADO = 'N')) then
            BEGIN
            if (anulado = 'S') then
             BEGIN
              ITEM = 0;
              ARTICULO = '';
              CODBAR = '';
              ARTIDES = '';
              CANT = 0;
              UNIDAD = '';
              BODITEM = '';
              lote = '';
              costo = 0;
              DTOPORC = 0;
              DTOMONTO = 0;
              IVAPORC = 0;
              IVAMONTO = 0;
              CONSUMO = 0;
              EXANT = 0;
              TOTAL = 0;
              OBSITEM = null;
              SUBTOTAL = 0;
              SUSPEND;
             END
            ELSE
             BEGIN
              if (DETALLE = 'S') then
                FOR SELECT AJUS_ITEM, A.ARTI_COD, AJUS_CODBAR, AJDE_DESC, AJUS_EXANT, AJUS_UNIDAD, BODE_COD, AJUS_EXNUE, AJUS_LOTE, AJDE_OBS
                FROM AJUSTES_DETALLE D, ARTICULO A
                WHERE D.ARTI_COD = A.ARTI_COD AND D.AJUS_ID = :ID
                ORDER BY AJUS_ITEM
                INTO :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :EXANT, :UNIDAD, :BODITEM, :CANT, :LOTE, :OBSITEM
                    DO
                      BEGIN
                      TOTAL = (CANT - EXANT) * COSTO;
                      SUBTOTAL = TOTAL;
                      SUSPEND;
                      END
              ELSE
                BEGIN
                TOTAL = 0;
                FOR SELECT ARTI_COD, AJUS_EXNUE, AJUS_EXANT FROM AJUSTES_DETALLE D WHERE D.AJUS_ID = :ID INTO
                    :ARTICULO, :CANT, :EXANT
                    DO
                      BEGIN
                      EXECUTE PROCEDURE COSTO_PROMEDIO(:ARTICULO, :FECHA) returning_values (:COSTO);
                      TOTAL = TOTAL + ((CANT - EXANT) * COSTO);
                      SUBTOTAL = TOTAL;
                      END
                SUSPEND;
                END
             END
            END
        END
    END
  if (BIN_AND(TIPO, 16) <> 0) then
    BEGIN
    SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 15 INTO :NOMTIPO;
    FOR SELECT ENSA_ID, E.PREF_PRE, ENSA_NUMERO, ENSA_FECHA, ENSA_CONC, ENSA_REFER, E.BODE_COD, BODE_NOM, ENSA_CODBAR, ENSA_DESC, ENSA_CANT, ENSA_UNIDAD, ENSA_LOTE, ENSA_OBS, ENSA_ANULADO
    FROM ENSAMBLES E, BODEGA B, PREFIJOS PR
    WHERE E.BODE_COD = B.BODE_COD AND E.PREF_PRE >= :PREINI AND E.PREF_PRE <= :PREFIN AND ENSA_NUMERO >= :NUMINI AND ENSA_NUMERO <= :NUMFIN
     AND PR.PREF_PRE = E.PREF_PRE AND PR.TIDO_COD = 15 AND ((PR.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
    ORDER BY E.PREF_PRE, ENSA_NUMERO
    into :ID, :PREF, :NUMERO, :FECHA, :CONCEPTO, :REFER, :CODBODORI, :NOMBODORI, :PRODCODBAR, :PRODDES, :PRODCANT, :PRODUNIDAD, :PRODLOTE, :OBS, :ANULADO
    DO
        BEGIN
        if ((:ANULADOS = 'S') or (:ANULADO = 'N')) then
            BEGIN
            if (anulado = 'S') then
             BEGIN
              ITEM = 0;
              ARTICULO = '';
              CODBAR = '';
              ARTIDES = '';
              CANT = 0;
              UNIDAD = '';
              BODITEM = '';
              lote = '';
              costo = 0;
              DTOPORC = 0;
              DTOMONTO = 0;
              IVAPORC = 0;
              IVAMONTO = 0;
              CONSUMO = 0;
              TOTAL = 0;
              OBSITEM = null;
              SUBTOTAL = 0;
              SUSPEND;
             END
            ELSE
             BEGIN
              if (DETALLE = 'S') then
                FOR SELECT ESDE_ITEM, A.ARTI_COD, ESDE_CODBAR, ESDE_DESC, ESDE_CANT, ESDE_UNIDAD, BODE_COD, ESDE_COSTO, ESDE_IVAPORC, ESDE_IVAMONTO, ESDE_CONSUMO, ESDE_TOTAL, ESDE_LOTE, ESDE_OBS
                FROM ensambles_detalle D, ARTICULO A
                WHERE D.ARTI_COD = A.ARTI_COD AND D.ENSA_ID = :ID
                ORDER BY ESDE_ITEM
                INTO :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :BODITEM, :COSTO, :IVAPORC, :IVAMONTO, :CONSUMO, :TOTAL, :LOTE, :OBSITEM
                    DO
                    BEGIN
                    SUBTOTAL = TOTAL - IVAMONTO - CONSUMO;
                    SUSPEND;
                    END
              ELSE
                BEGIN
                SELECT SUM(ESDE_IVAMONTO), SUM(ESDE_CONSUMO), SUM(ESDE_TOTAL) FROM ENSAMBLES_detalle D WHERE D.ENSA_ID = :ID INTO
                    :IVAMONTO, :CONSUMO, :TOTAL;
                SUBTOTAL = TOTAL - IVAMONTO - CONSUMO;
                SUSPEND;
                END
             END
            END
        END
    END
  if (BIN_AND(TIPO, 32) <> 0) then
    BEGIN
    SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 16 INTO :NOMTIPO;
    FOR SELECT DESE_ID, E.PREF_PRE, DESE_NUMERO, DESE_FECHA, DESE_CONC, DESE_REFER, E.BODE_COD, BODE_NOM, DESE_CODBAR, DESE_DESC, DESE_CANT, DESE_UNIDAD, DESE_LOTE, DESE_OBS, DESE_ANULADO
    FROM DESENSAMBLES E, BODEGA B, PREFIJOS PR
    WHERE E.BODE_COD = B.BODE_COD AND E.PREF_PRE >= :PREINI AND E.PREF_PRE <= :PREFIN AND DESE_NUMERO >= :NUMINI AND DESE_NUMERO <= :NUMFIN
     AND PR.PREF_PRE = E.PREF_PRE AND PR.TIDO_COD = 16 AND ((PR.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
    ORDER BY E.PREF_PRE, DESE_NUMERO
    into :ID, :PREF, :NUMERO, :FECHA, :CONCEPTO, :REFER, :CODBODORI, :NOMBODORI, :PRODCODBAR, :PRODDES, :PRODCANT, :PRODUNIDAD, :PRODLOTE, :OBS, :ANULADO
    DO
        BEGIN
        if ((:ANULADOS = 'S') or (:ANULADO = 'N')) then
            BEGIN
            if (anulado = 'S') then
             BEGIN
              ITEM = 0;
              ARTICULO = '';
              CODBAR = '';
              ARTIDES = '';
              CANT = 0;
              UNIDAD = '';
              BODITEM = '';
              lote = '';
              costo = 0;
              DTOPORC = 0;
              DTOMONTO = 0;
              IVAPORC = 0;
              IVAMONTO = 0;
              CONSUMO = 0;
              TOTAL = 0;
              OBSITEM = null;
              SUBTOTAL = 0;
              SUSPEND;
             END
            ELSE
             BEGIN
              if (DETALLE = 'S') then
                FOR SELECT DESE_ITEM, A.ARTI_COD, DEDE_CODBAR, DEDE_DESC, DEDE_CANT, DEDE_UNIDAD, BODE_COD, DEDE_COSTO, DEDE_IVAPORC, DEDE_IVAMONTO, DEDE_CONSUMO, DEDE_TOTAL, DEDE_LOTE, DEDE_OBS
                FROM DESensambles_detalle D, ARTICULO A
                WHERE D.ARTI_COD = A.ARTI_COD AND D.DESE_ID = :ID
                ORDER BY DESE_ITEM
                INTO
                    :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :BODITEM, :COSTO, :IVAPORC, :IVAMONTO, :CONSUMO, :TOTAL, :LOTE, :OBSITEM
                    DO
                    BEGIN
                    SUBTOTAL = TOTAL - IVAMONTO - CONSUMO;
                    SUSPEND;
                    END
              ELSE
                BEGIN
                SELECT SUM(DEDE_IVAMONTO), SUM(DEDE_CONSUMO), SUM(DEDE_TOTAL) FROM DESENSAMBLES_detalle D WHERE D.DESE_ID = :ID INTO
                    :IVAMONTO, :CONSUMO, :TOTAL;
                SUBTOTAL = TOTAL - IVAMONTO - CONSUMO;
                SUSPEND;
                END
             END
            END
        END
    END
  if (BIN_AND(TIPO, 64) <> 0) then
    BEGIN
    SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 17 INTO :NOMTIPO;
    FOR SELECT RESE_ID, R.PREF_PRE, RESE_NUMERO, RESE_FECHA, RESE_CONC, RESE_REFER, R.BODE_COD, BODE_NOM, RESE_NOMTERC, RESE_OBS, RESE_ANULADO
    FROM RESERVAS R, BODEGA B, PREFIJOS PR
    WHERE R.BODE_COD = B.BODE_COD AND R.PREF_PRE >= :PREINI AND R.PREF_PRE <= :PREFIN AND RESE_NUMERO >= :NUMINI AND RESE_NUMERO <= :NUMFIN
     AND PR.PREF_PRE = R.PREF_PRE AND PR.TIDO_COD = 17 AND ((PR.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
    ORDER BY R.PREF_PRE, RESE_NUMERO
    into :ID, :PREF, :NUMERO, :FECHA, :CONCEPTO, :REFER, :CODBODORI, :NOMBODORI, :NOMTERCERO, :OBS, :ANULADO
    DO
        BEGIN
        if ((:ANULADOS = 'S') or (:ANULADO = 'N')) then
            BEGIN
            if (anulado = 'S') then
             BEGIN
              ITEM = 0;
              ARTICULO = '';
              CODBAR = '';
              ARTIDES = '';
              CANT = 0;
              UNIDAD = '';
              BODITEM = '';
              lote = '';
              costo = 0;
              DTOPORC = 0;
              DTOMONTO = 0;
              IVAPORC = 0;
              IVAMONTO = 0;
              CONSUMO = 0;
              EXANT = 0;
              TOTAL = 0;
              OBSITEM = null;
              SUBTOTAL = 0;
              SUSPEND;
             END
            ELSE
             BEGIN
              if (DETALLE = 'S') then
                FOR SELECT RSDE_ITEM, A.ARTI_COD, RSDE_CODBAR, RSDE_DESC, RDSE_CANT, RSDE_UNIDAD, BODE_COD, RSDE_OBS
                FROM RESERVAS_DETALLE D, ARTICULO A
                WHERE D.ARTI_COD = A.ARTI_COD AND D.RESE_ID = :ID
                ORDER BY RSDE_ITEM
                INTO :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :BODITEM, :OBSITEM
                    DO
                    SUSPEND;
              ELSE
                BEGIN
                SELECT SUM(RDSE_CANT) FROM RESERVAS_detalle D WHERE D.RESE_ID = :ID INTO
                    :CANT;
                SUSPEND;
                END
             END
            END
        END
    END
  if (BIN_AND(TIPO, 128) <> 0) then
    BEGIN
    SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 18 INTO :NOMTIPO;
    FOR SELECT ORIN_ID, O.PREF_PRE, ORIN_NUMERO, ORIN_FECHA, ORIN_FECLLEGA, ORIN_CONC, ORIN_REFER, ORIN_NOMTERC, ORIN_OBS, ORIN_ANULADO
    FROM ORDENES_INVENTARIO O, PREFIJOS PR
    WHERE O.PREF_PRE >= :PREINI AND O.PREF_PRE <= :PREFIN AND ORIN_NUMERO >= :NUMINI AND ORIN_NUMERO <= :NUMFIN
     AND PR.PREF_PRE = O.PREF_PRE AND PR.TIDO_COD = 18 AND ((PR.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
    ORDER BY O.PREF_PRE, ORIN_NUMERO
    into :ID, :PREF, :NUMERO, :FECHA, :VENCE, :CONCEPTO, :REFER, :NOMTERCERO, :OBS, :ANULADO
    DO
        BEGIN
        if ((:ANULADOS = 'S') or (:ANULADO = 'N')) then
            BEGIN
            if (anulado = 'S') then
             BEGIN
              ITEM = 0;
              ARTICULO = '';
              CODBAR = '';
              ARTIDES = '';
              CANT = 0;
              UNIDAD = '';
              BODITEM = '';
              lote = '';
              costo = 0;
              DTOPORC = 0;
              DTOMONTO = 0;
              IVAPORC = 0;
              IVAMONTO = 0;
              CONSUMO = 0;
              EXANT = 0;
              TOTAL = 0;
              OBSITEM = null;
              SUBTOTAL = 0;
              SUSPEND;
             END
            ELSE
             BEGIN
              if (DETALLE = 'S') then
                FOR SELECT ORID_ITEM, A.ARTI_COD, ORID_CODBAR, ORID_DESC, ORID_CANT, ORID_UNIDAD, ORIN_COSTO, ORID_DTOPORC, ORID_DTOMONTO, ORID_IVAPORC, ORID_IVAMONTO, ORID_CONSUMO, ORID_TOTAL, ORID_OBS, ORID_LOTE
                FROM ORDENINVENTARIO_DETALLE D, ARTICULO A
                WHERE D.ARTI_COD = A.ARTI_COD AND D.ORIN_ID = :ID
                ORDER BY ORID_ITEM
                INTO :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :COSTO, :DTOPORC, :DTOMONTO, :IVAPORC, :IVAMONTO, :CONSUMO, :TOTAL, :OBSITEM, :LOTE
                    DO
                    BEGIN
                    SUBTOTAL = TOTAL - IVAMONTO - CONSUMO;
                    SUSPEND;
                    END
              ELSE
                BEGIN
                SELECT SUM(ORID_IVAMONTO), SUM(ORID_CONSUMO), SUM(ORID_TOTAL) FROM ordeninventario_detalle D WHERE D.ORIN_ID = :ID INTO
                    :IVAMONTO, :CONSUMO, :TOTAL;
                SUBTOTAL = TOTAL - IVAMONTO - CONSUMO;
                SUSPEND;
                END
             END
            END
        END
    END
END

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE REP_DISPONIBILIDAD(
    FECHA DATE,
    ARTINI VARCHAR(20),
    ARTFIN VARCHAR(20),
    GRPINI VARCHAR(2),
    GRPFIN VARCHAR(2),
    ORDEN CHAR(1),
    CEROS CHAR(1),
    DETALLE CHAR(1),
    SUCURSAL INTEGER)
RETURNS (
    CODIGO VARCHAR(15),
    NOMBRE VARCHAR(60),
    UNIDAD VARCHAR(8),
    CODGRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    CODSUBG VARCHAR(3),
    NOMSUBG VARCHAR(30),
    CODMARC VARCHAR(3),
    NOMMARC VARCHAR(30),
    CODBOD VARCHAR(2),
    NOMBOD VARCHAR(30),
    EXIST NUMERIC(18,4),
    PROMEDIO NUMERIC(18,4),
    SALIDAS NUMERIC(18,4),
    DISPONIBILIDAD INTEGER,
    DIAS INTEGER,
    PROMEDIADO INTEGER,
    COSTO NUMERIC(18,2),
    COSTOPRO NUMERIC(18,2),
    SUGERIDO NUMERIC(18,4),
    FECCOMPRA DATE)
AS
DECLARE VARIABLE CODINI VARCHAR(20);
DECLARE VARIABLE CODFIN VARCHAR(20);
DECLARE VARIABLE DESINI VARCHAR(20);
declare variable FECINI DATE;
declare variable DIASC VARCHAR(255);
DECLARE VARIABLE DESFIN VARCHAR(20);
declare variable DIA_ART VARCHAR(2) CHARACTER SET NONE;
BEGIN
if (ORDEN = 'C') then
    BEGIN
    CODINI = ARTINI;
    CODFIN = ARTFIN;
    DESINI = '';
    DESFIN = 'zz';
    END
ELSE
    BEGIN
    DESINI = ARTINI;
    DESFIN = ARTFIN;
    CODINI = '';
    CODFIN = 'zz';
    END
if (DETALLE = 'S') then
  BEGIN
  FOR SELECT ARTI_COD, ARTI_DES, ARTI_UNIDAD, ARTI_DIAS, A.GRUP_COD, GRUP_NOM, A.SUBG_COD, A.MARC_COD, BODE_COD, BODE_NOM, ARTI_DIANALIS
      FROM ARTICULO A, GRUPO G, BODEGA B
      WHERE ARTI_COD >= :CODINI AND ARTI_COD <= :CODFIN AND A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :GRPFIN AND ARTI_DES >= :DESINI AND ARTI_DES <= :DESFIN AND
      G.GRUP_COD = A.GRUP_COD AND A.ESAR_COD <> 'I' AND ((SUCU_ID = :SUCURSAL) or (:SUCURSAL = 0))
      INTO :CODIGO, :NOMBRE, :UNIDAD, :DIAS, :CODGRUPO, :NOMGRUPO, :CODSUBG, :CODMARC, :CODBOD, :NOMBOD, :PROMEDIADO
      DO
        BEGIN
        NOMMARC = '';
        NOMSUBG = '';
        SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO :NOMMARC;
        SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
        EXECUTE PROCEDURE ultimo_costo(:CODIGO, :FECHA, :UNIDAD) returning_values (:COSTO);
        EXECUTE PROCEDURE costo_promedio(:CODIGO, :FECHA) RETURNING_VALUES :costopro;
        EXECUTE PROCEDURE DISPONIBILIDAD_ARTICULO(CODIGO, FECHA, :CODBOD) returning_values (:DISPONIBILIDAD, :EXIST, :PROMEDIO, :SALIDAS);
        /*ESTABLECER CUAL ES EL VALOR DE DIAS PARA PROMEDIO*/
        EXECUTE PROCEDURE lee_configuracion ('INVENTARIO', 'EXISTENCIAS', 'PROMEDIAR LAS SALIDAS DEL INVENTARIO CON EL NUMERO DE DIAS ASIGNADO A CADA ARTICULO') returning_values (:DIA_ART);
        if (DIA_ART = 'NO') then
          BEGIN
            EXECUTE PROCEDURE lee_configuracion ('INVENTARIO', 'EXISTENCIAS', 'NUMERO DE DIAS PARA PROMEDIO DE SALIDAS POR ARTICULO') returning_values (DIASC);
            PROMEDIADO = CAST(DIASC AS INTEGER);
          END
        FECINI = :FECHA - :PROMEDIADO;
        if ((DISPONIBILIDAD < DIAS) and (PROMEDIO > 0))then
            SUGERIDO = (DIAS * PROMEDIO) - EXIST;
        ELSE
            SUGERIDO = 0;
        SELECT MAX(FACO_FECHA) FROM FACTURAS_COMPRA F, FACTURAS_COMPRAS_DETALLE D
            WHERE F.FACO_ID = D.faco_id AND D.ARTI_COD = :CODIGO AND FACO_FECHA <= :FECHA AND D.bode_cod = :codbod
            INTO :FECCOMPRA;
        if ((PROMEDIO > 0) or (EXIST <> 0) or (CEROS = 'S')) then
            SUSPEND;
        END
  END
ELSE
  BEGIN
  FOR SELECT ARTI_COD, ARTI_DES, ARTI_UNIDAD, ARTI_DIAS, A.GRUP_COD, GRUP_NOM, A.SUBG_COD, A.MARC_COD, ARTI_DIANALIS
      FROM ARTICULO A, GRUPO G
      WHERE ARTI_COD >= :CODINI AND ARTI_COD <= :CODFIN AND A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :GRPFIN AND ARTI_DES >= :DESINI AND ARTI_DES <= :DESFIN AND G.GRUP_COD = A.GRUP_COD AND A.ESAR_COD <> 'I'
      INTO :CODIGO, :NOMBRE, :UNIDAD, :DIAS, :CODGRUPO, :NOMGRUPO, :CODSUBG, :CODMARC, :PROMEDIADO
      DO
        BEGIN
        NOMMARC = '';
        NOMSUBG = '';
        SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO :NOMMARC;
        SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
        EXECUTE PROCEDURE costo_promedio(:CODIGO, :FECHA) RETURNING_VALUES :costopro;
        EXECUTE PROCEDURE ultimo_costo(:CODIGO, :FECHA, :UNIDAD) returning_values (:COSTO);
        EXECUTE PROCEDURE DISPONIBILIDAD_TOTAL_ARTICULO(CODIGO, FECHA) returning_values (:DISPONIBILIDAD, :EXIST, :PROMEDIO, :SALIDAS);
        /*ESTABLECER CUAL ES EL VALOR DE DIAS PARA PROMEDIO*/
        EXECUTE PROCEDURE lee_configuracion ('INVENTARIO', 'EXISTENCIAS', 'PROMEDIAR LAS SALIDAS DEL INVENTARIO CON EL NUMERO DE DIAS ASIGNADO A CADA ARTICULO') returning_values (:DIA_ART);
        if (DIA_ART = 'NO') then
          BEGIN
            EXECUTE PROCEDURE lee_configuracion ('INVENTARIO', 'EXISTENCIAS', 'NUMERO DE DIAS PARA PROMEDIO DE SALIDAS POR ARTICULO') returning_values (DIASC);
            PROMEDIADO = CAST(DIASC AS INTEGER);
          END
        FECINI = :FECHA - :PROMEDIADO;
        if ((DISPONIBILIDAD < DIAS) and (PROMEDIO > 0))then
            SUGERIDO = (DIAS * PROMEDIO) - EXIST;
        ELSE
            SUGERIDO = 0;
        SELECT MAX(FACO_FECHA) FROM FACTURAS_COMPRA F, FACTURAS_COMPRAS_DETALLE D
            WHERE F.FACO_ID = D.faco_id AND D.ARTI_COD = :CODIGO AND FACO_FECHA <= :FECHA
            INTO :FECCOMPRA;
        if ((PROMEDIO > 0) or (EXIST <> 0) or (CEROS = 'S')) then
            SUSPEND;
        END
  END
END

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE REP_KARDEX_ARTICULO(
    DETALLE CHAR(1),
    FECINI DATE,
    FECFIN DATE,
    ARTINI VARCHAR(20),
    ARTFIN VARCHAR(20),
    GRPINI VARCHAR(2),
    GRPFIN VARCHAR(2),
    ORDEN CHAR(1),
    BODEGA VARCHAR(2))
RETURNS (
    CODIGO VARCHAR(15),
    NOMBRE VARCHAR(60),
    UNIDAD VARCHAR(8),
    CODGRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    CODSUBG VARCHAR(3),
    NOMSUBG VARCHAR(30),
    CODMARC VARCHAR(3),
    NOMMARC VARCHAR(30),
    CODBOD VARCHAR(2),
    SALDOINI NUMERIC(18,4),
    COSTOINI NUMERIC(18,2),
    ENTRADAS NUMERIC(18,4),
    COSTOENT NUMERIC(18,2),
    SALIDAS NUMERIC(18,4),
    COSTOSAL NUMERIC(18,2),
    SALDOFIN NUMERIC(18,4),
    COSTOFIN NUMERIC(18,2),
    TIPODOC VARCHAR(8),
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    CONCEPTO VARCHAR(60),
    NIT VARCHAR(20),
    CONS INTEGER,
    CANFINAL NUMERIC(18,4),
    COSFINAL NUMERIC(18,2))
AS
DECLARE VARIABLE ENTRADA CHAR(1);
DECLARE VARIABLE CANT NUMERIC(18,4);
DECLARE VARIABLE EXIST NUMERIC(18,4);
DECLARE VARIABLE COSTO NUMERIC(18,2);
DECLARE VARIABLE CODINI VARCHAR(20);
DECLARE VARIABLE CODFIN VARCHAR(20);
DECLARE VARIABLE DESINI VARCHAR(20);
DECLARE VARIABLE DESFIN VARCHAR(20);
declare variable TIPO INTEGER;
declare variable ID INTEGER;
BEGIN
if (ORDEN = 'C') then
    BEGIN
    CODINI = ARTINI;
    CODFIN = ARTFIN;
    DESINI = '';
    DESFIN = 'zz';
    END
ELSE
    BEGIN
    DESINI = ARTINI;
    DESFIN = ARTFIN;
    CODINI = '';
    CODFIN = 'zz';
    END
  FOR
    SELECT ARTI_COD, ARTI_DES, ARTI_UNIDAD, A.GRUP_COD, A.SUBG_COD, A.MARC_COD
      FROM ARTICULO A
      WHERE ARTI_COD >= :CODINI AND ARTI_COD <= :CODFIN AND A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :GRPFIN AND ARTI_DES >= :DESINI AND ARTI_DES <= :DESFIN AND A.ESAR_COD <> 'I'
      INTO :CODIGO, :NOMBRE, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
      DO
        BEGIN
        NOMMARC = '';
        NOMSUBG = '';
        SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
        SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
        SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
        if (BODEGA = '') then
            BEGIN
            EXECUTE PROCEDURE SALDO_INICIAL_TOTAL_INV(CODIGO, FECINI) returning_values (:SALDOINI);
            EXECUTE PROCEDURE VALOR_INICIAL_INVENTARIO(CODIGO, FECINI) returning_values (COSTOINI);
            END
        ELSE
            BEGIN
            EXECUTE PROCEDURE SALDO_INICIAL_INVENTARIO(CODIGO, FECINI, :BODEGA) returning_values (SALDOINI);
            EXECUTE PROCEDURE COSTO_PROMEDIO(CODIGO, FECINI) returning_values (COSTOINI);
            COSTOINI = COSTOINI * saldoini;
            END
        if (DETALLE = 'N') then
            BEGIN
            /* SUME LAS ENTRADAS */
            if (BODEGA = '') then
                SELECT SUM(MVAR_CANT), SUM(MVAR_CANT * MVAR_COSTO) FROM MOVIMIENTO_ARTICULO
                  WHERE (MVAR_FECHA >= :FECINI) AND (MVAR_FECHA <= :FECFIN) AND (MVAR_TIPODOC <> 13) AND
                  (ARTI_COD = :CODIGO) AND (MVAR_ENTRADA = 'S') INTO :ENTRADAS, :COSTOENT;
            ELSE
                SELECT SUM(MVAR_CANT), SUM(MVAR_CANT * MVAR_COSTO) FROM MOVIMIENTO_ARTICULO
                  WHERE (MVAR_FECHA >= :FECINI) AND (MVAR_FECHA <= :FECFIN) AND (MVAR_TIPODOC <> 13) AND
                  (ARTI_COD = :CODIGO) AND (MVAR_ENTRADA = 'S') AND BODE_COD = :BODEGA
                  INTO :ENTRADAS, :COSTOENT;
                
            if (ENTRADAS IS NULL) then
              ENTRADAS = 0;
            if (COSTOENT IS NULL) then
              COSTOENT = 0;
            /* CALCULE LAS SALIDAS A COSTO PROMEDIO */
            SALIDAS = 0;
            COSTOSAL = 0;
            if (BODEGA = '') then
                FOR SELECT MVAR_CANT, MVAR_FECHA, MVAR_TIPODOC, MVAR_CONS
                    FROM MOVIMIENTO_ARTICULO
                    WHERE (MVAR_FECHA >= :FECINI) AND (MVAR_FECHA <= :FECFIN) AND (MVAR_TIPODOC <> 13) AND
                    (ARTI_COD = :CODIGO) AND (MVAR_ENTRADA = 'N')
                    INTO :CANT, :FECHA, :TIPO, :ID
                    DO
                    BEGIN
                    SELECT COST_SALDOP, COST_SALDOC FROM COSTOS WHERE COST_TIPO = :TIPO AND COST_IDMOV = :ID INTO :COSTO, :EXIST;
                    if (EXIST <> 0) then
                        COSTO = COSTO / EXIST;
                    ELSE
                        COSTO = 0;
                    COSTOSAL = COSTOSAL + (COSTO*CANT);
                    SALIDAS = SALIDAS + CANT;
                    END
            ELSE
                FOR SELECT MVAR_CANT, MVAR_FECHA, MVAR_TIPODOC, MVAR_CONS
                    FROM MOVIMIENTO_ARTICULO
                    WHERE (MVAR_FECHA >= :FECINI) AND (MVAR_FECHA <= :FECFIN) AND (MVAR_TIPODOC <> 13) AND
                    (ARTI_COD = :CODIGO) AND (MVAR_ENTRADA = 'N') AND BODE_COD = :BODEGA
                    INTO :CANT, :FECHA, :TIPO, :ID
                    DO
                    BEGIN
                    SELECT COST_SALDOP, COST_SALDOC FROM COSTOS WHERE COST_TIPO = :TIPO AND COST_IDMOV = :ID INTO :COSTO, :EXIST;
                    if (EXIST <> 0) then
                        COSTO = COSTO / EXIST;
                    ELSE
                        COSTO = 0;
                    COSTOSAL = COSTOSAL + (COSTO*CANT);
                    SALIDAS = SALIDAS + CANT;
                    END
            if (SALIDAS IS NULL) then
              SALIDAS = 0;
            if (COSTOSAL IS NULL) then
              COSTOSAL = 0;
            SALDOFIN = SALDOINI + ENTRADAS - SALIDAS;
            COSTOFIN = COSTOINI + COSTOENT - COSTOSAL;
            if (BODEGA = '') then
                BEGIN
                EXECUTE PROCEDURE SALDO_INICIAL_TOTAL_INV(CODIGO, fecfin+1) returning_values (canfinal);
                EXECUTE PROCEDURE VALOR_INICIAL_INVENTARIO(CODIGO, FECFIN+1) returning_values (cosfinal);
                END
            ELSE
                BEGIN
                EXECUTE PROCEDURE SALDO_INICIAL_INVENTARIO(CODIGO, FECFIN+1, :BODEGA) returning_values (CANFINAL);
                EXECUTE PROCEDURE COSTO_PROMEDIO(CODIGO, FECFIN+1) returning_values (COSFINAL);
                COSFINAL = COSFINAL * CANFINAL;
                END
            SUSPEND;
            END
        ELSE
            BEGIN
            SALDOFIN = SALDOINI;
            COSTOFIN = COSTOINI;
            COSTOENT = 0;
            COSTOSAL = 0;
            FOR SELECT TIDO_NOMCORTO, MVAR_ENTRADA, MVAR_PREF, MVAR_NUMERO, MVAR_CANT, MVAR_COSTO, MVAR_CONC, MVAR_FECHA, M.TERC_NIT, MVAR_CONS, BODE_COD
                FROM MOVIMIENTO_ARTICULO M, TIPO_DOCUMENTO TD
                WHERE TD.TIDO_COD = MVAR_TIPODOC AND (MVAR_FECHA >= :FECINI) AND (MVAR_FECHA <= :FECFIN) AND (MVAR_TIPODOC <> 13) AND (ARTI_COD = :CODIGO)
                ORDER BY MVAR_FECHA, MVAR_CONS
                INTO :TIPODOC, :ENTRADA, :PREFIJO, :NUMERO, :ENTRADAS, :COSTOENT, :CONCEPTO, :FECHA, :NIT, :CONS, :CODBOD
                DO
                    BEGIN
                    if (ENTRADA = 'S') then
                        BEGIN
                        SALIDAS = 0;
                        SALDOFIN = SALDOFIN + ENTRADAS;
                        COSTOFIN = COSTOFIN + (ENTRADAS * COSTOENT);
                        if (SALDOFIN > 0) then
                            COSTOSAL = COSTOFIN / SALDOFIN;
                        end
                    ELSE
                        BEGIN
                        SALIDAS = ENTRADAS;
                        ENTRADAS = 0;
                        if (SALDOFIN > 0) then
                            COSTOENT = COSTOFIN / SALDOFIN;
                        else
                            EXECUTE PROCEDURE COSTO_PROMEDIO(:CODIGO, :FECHA) returning_values (:COSTOENT);
                        SALDOFIN = SALDOFIN - SALIDAS;
                        COSTOFIN = COSTOFIN - (SALIDAS * COSTOENT);
                        if (SALDOFIN > 0) then
                            COSTOSAL = COSTOFIN / SALDOFIN;
                        END
                    SUSPEND;
                    END
            END
        END
END

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE REP_PRODUCTOS(
    ORDEN CHAR(1),
    DESDE VARCHAR(15),
    HASTA VARCHAR(15),
    FECHA DATE)
RETURNS (
    CODIGO VARCHAR(15),
    DESCR VARCHAR(60),
    GRUPCOD VARCHAR(2),
    GRUPNOM VARCHAR(30),
    SUBGCOD VARCHAR(3),
    SUBGNOM VARCHAR(30),
    MARCCOD VARCHAR(3),
    MARCNOM VARCHAR(30),
    ESTADO CHAR(1),
    UNIDAD VARCHAR(8),
    CODCOMP VARCHAR(15),
    DESCOMP VARCHAR(60),
    CANT NUMERIC(18,4),
    UNDCOMP VARCHAR(8),
    CODBARCOMP VARCHAR(15),
    COSTO NUMERIC(18,2),
    TOTAL NUMERIC(18,2))
AS
BEGIN
  FOR SELECT ARTI_COD, ARTI_DES, ARTI_UNIDAD, A.GRUP_COD, GRUP_NOM, A.SUBG_COD, A.MARC_COD, A.esar_cod
  FROM ARTICULO A, GRUPO G, estado_articulo E
  WHERE A.GRUP_COD = G.GRUP_COD AND A.ESAR_COD = E.ESAR_COD AND ARTI_COD IN (SELECT DISTINCT ARTI_COD FROM ARTICULOS_PRODUCTO)
  INTO :CODIGO, :DESCR, :unidad, :GRUPCOD, :GRUPNOM, :SUBGCOD, :MARCCOD, :ESTADO
  DO
    if ((ORDEN = 'C' AND CODIGO >= :DESDE AND CODIGO <= :HASTA) OR
        (ORDEN = 'D' AND DESCR >= :DESDE AND DESCR <= :HASTA)) then
        BEGIN
        SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :MARCCOD INTO MARCNOM;
        SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :SUBGCOD AND GRUP_COD = :GRUPCOD INTO :SUBGNOM;
        FOR SELECT ARPR_COMP, ARTI_DES, ARPR_CODBAR, ARPR_CANT, ARPR_UNIDAD
        FROM ARTICULOS_PRODUCTO P, ARTICULO A
        WHERE P.ARTI_COD = :CODIGO AND P.ARPR_COMP = A.ARTI_COD
          INTO :CODCOMP, :DESCOMP, :CODBARCOMP, :CANT, :UNDCOMP
          DO
            begin
            EXECUTE PROCEDURE COSTO_PROMEDIO (:CODCOMP, :FECHA) returning_values (:COSTO);
            EXECUTE PROCEDURE CANTIDAD_POR_FACTOR (:CODCOMP, :CANT, :UNDCOMP) returning_values (:CANT);
            TOTAL = COSTO * CANT;
            SUSPEND;
            END
        END
END

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE REP_UTILIDAD_CLIENTE(
    TIPO INTEGER,
    DETALLE CHAR(1),
    TERINI VARCHAR(20),
    TERFIN VARCHAR(20),
    FECINI DATE,
    FECFIN DATE,
    ARTINI VARCHAR(15),
    ARTFIN VARCHAR(15),
    ORDEN CHAR(1),
    CEROS CHAR(1),
    SUBEMPRESA INTEGER)
RETURNS (
    NIT VARCHAR(20),
    NOMBRE VARCHAR(60),
    TELEFONO VARCHAR(40),
    CIUDAD VARCHAR(40),
    CODZONA VARCHAR(2),
    NOMZONA VARCHAR(30),
    NOMTIPO VARCHAR(50),
    ARTICULO VARCHAR(15),
    DESCRIPCION VARCHAR(60),
    CODGRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    CODSUBG VARCHAR(3),
    NOMSUBG VARCHAR(30),
    CODMARC VARCHAR(3),
    NOMMARC VARCHAR(30),
    UNIDAD VARCHAR(8),
    CANTIDAD NUMERIC(18,4),
    BASE NUMERIC(18,2),
    IVA NUMERIC(18,2),
    COSTO NUMERIC(18,2),
    UTILIDAD NUMERIC(18,4),
    PORC NUMERIC(9,2),
    TOTAL NUMERIC(18,2),
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    DTO NUMERIC(9,2))
AS
DECLARE VARIABLE COSTOUNIT NUMERIC(18,4);
DECLARE VARIABLE CODINI VARCHAR(15);
DECLARE VARIABLE CODFIN VARCHAR(15);
DECLARE VARIABLE DESINI VARCHAR(15);
DECLARE VARIABLE DESFIN VARCHAR(15);
declare variable UOM VARCHAR(20);
declare variable NUMROWS INTEGER;
BEGIN
if (ORDEN = 'C') then
    BEGIN
    CODINI = ARTINI;
    CODFIN = ARTFIN;
    DESINI = '';
    DESFIN = 'zz';
    END
ELSE
    BEGIN
    DESINI = ARTINI;
    DESFIN = ARTFIN;
    CODINI = '';
    CODFIN = 'zz';
    END
EXECUTE PROCEDURE lee_configuracion ('FACTURACION', 'ARTICULOS', 'SUGERIR PRECIOS CON PORCENTAJE DE MARGEN O UTILIDAD') returning_values (:UOM);
SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = :TIPO INTO :NOMTIPO;
if (DETALLE = 'N') then
    BEGIN
    if (BIN_AND(TIPO, 1) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 31 INTO :NOMTIPO;
        /* BORRA LA TABLA AUXILIAR */
        DELETE FROM reportes_aux WHERE REPA_ID = 3 AND REPA_USER = USER;

        FOR SELECT MAX(T.TERC_NIT), MAX(TERC_NOM), MAX(TERC_TEL), MAX(TERC_CIU), MAX(ZONA_COD), MAX(ARTI_COD), SUM(FADE_CANT * FADE_FACTOR), SUM(FACT_FACTOR*(FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO)),
            SUM(FACT_FACTOR*FADE_IVAMONTO), SUM(FACT_FACTOR*FADE_TOTAL)
            FROM FACTURAS_DETALLE D, FACTURAS F, PREFIJOS P, terceros T, CLIENTES C
            WHERE C.TERC_NIT = T.TERC_NIT AND TERC_CLIE = 'S' AND F.terc_nit = T.terc_nit AND T.TERC_NIT >= :TERINI AND T.TERC_NIT <= :TERFIN AND
            F.FACT_ID = D.FACT_ID AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND FACT_ANULADO = 'N'
            AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY T.TERC_NIT, ARTI_COD
            INTO :NIT, :NOMBRE, :TELEFONO, :CIUDAD, :CODZONA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :TOTAL
            DO
            BEGIN
            SELECT ZONA_NOM FROM ZONAS WHERE ZONA_COD = :CODZONA INTO :NOMZONA;
            SELECT ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                FROM ARTICULO WHERE ARTI_COD = :ARTICULO
                INTO :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC;
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            EXECUTE PROCEDURE costo_promedio (:ARTICULO, :FECFIN) RETURNING_VALUES (:COSTOUNIT);
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            COSTO = CANTIDAD * COSTOUNIT;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            if (CEROS = 'S') then
                INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (3, USER, :ARTICULO);
            SUSPEND;
            END /* FOR */
        if (CEROS = 'S') then
            BEGIN
            COSTO = 0;
            UTILIDAD = 0;
            PORC = 0;
            /* agregue los articulos sin factura */
            FOR SELECT ARTI_COD, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN
                INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                DO
                BEGIN
                SELECT COUNT(REPA_ARTICULO) FROM REPORTES_AUX WHERE REPA_ID = 3 AND REPA_USER = USER AND REPA_ARTICULO = :articulo INTO :numrows;
                if (numrows = 0) then
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        END
    if (BIN_AND(TIPO, 2) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 32 INTO :NOMTIPO;
        /* BORRA LA TABLA AUXILIAR */
        DELETE FROM reportes_aux WHERE REPA_ID = 3 AND REPA_USER = USER;

        FOR SELECT MAX(T.TERC_NIT), MAX(TERC_NOM), MAX(TERC_TEL), MAX(TERC_CIU), MAX(ZONA_COD), MAX(ARTI_COD), SUM(RVDE_CANT * RVDE_FACTOR), SUM(RVDE_TOTAL-RVDE_IVAMONTO-RVDE_CONSUMO), SUM(RVDE_IVAMONTO), SUM(RVDE_TOTAL)
            FROM REMISIONES_VENTA_DETALLE D, REMISIONES_VENTA R, PREFIJOS P, terceros T, CLIENTES C
            WHERE C.TERC_NIT = T.TERC_NIT AND TERC_CLIE = 'S' AND R.terc_nit = T.terc_nit AND T.TERC_NIT >= :TERINI AND T.TERC_NIT <= :TERFIN AND
            R.REVT_ID = D.REVT_ID AND REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN AND REVT_ANULADO = 'N'
            AND P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = 32 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY T.TERC_NIT, ARTI_COD
            INTO :NIT, :NOMBRE, :TELEFONO, :CIUDAD, :CODZONA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :TOTAL
            DO
                BEGIN
                SELECT ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO WHERE ARTI_COD = :ARTICULO
                    INTO :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC;
                SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                EXECUTE PROCEDURE costo_promedio (:ARTICULO, :FECFIN) RETURNING_VALUES (:COSTOUNIT);
                if (CANTIDAD IS NULL) then
                    CANTIDAD = 0;
                if (BASE IS NULL) then
                    BASE = 0;
                if (IVA IS NULL) then
                    IVA = 0;
                COSTO = CANTIDAD * COSTOUNIT;
                UTILIDAD = BASE - COSTO;
                if (UOM = 'UTILIDAD') then
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                else
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            if (CEROS = 'S') then
                INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (3, USER, :ARTICULO);
            SUSPEND;
            END /* FOR */
        if (CEROS = 'S') then
            BEGIN
            COSTO = 0;
            UTILIDAD = 0;
            PORC = 0;
            /* agregue los articulos sin factura */
            FOR SELECT ARTI_COD, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN
                INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                DO
                BEGIN
                SELECT COUNT(REPA_ARTICULO) FROM REPORTES_AUX WHERE REPA_ID = 3 AND REPA_USER = USER AND REPA_ARTICULO = :articulo INTO :numrows;
                if (numrows = 0) then
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        END
    if (BIN_AND(TIPO, 4) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 33 INTO :NOMTIPO;
        /* BORRA LA TABLA AUXILIAR */
        DELETE FROM reportes_aux WHERE REPA_ID = 3 AND REPA_USER = USER;

        FOR SELECT MAX(T.TERC_NIT), MAX(TERC_NOM), MAX(TERC_TEL), MAX(TERC_CIU), MAX(ZONA_COD), MAX(ARTI_COD), SUM(DVDE_CANT * DVDE_FACTOR), SUM(DEVT_FACTOR*(DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO)),
            SUM(DEVT_FACTOR*DVDE_IVAMONTO), SUM(DEVT_FACTOR*DVDE_TOTAL)
            FROM devoluciones_ventas_detalle D, DEVOLUCIONES_VENTAS V, PREFIJOS P, terceros T, CLIENTES C
            WHERE C.TERC_NIT = T.TERC_NIT AND TERC_CLIE = 'S' AND V.terc_nit = T.terc_nit AND T.TERC_NIT >= :TERINI AND T.TERC_NIT <= :TERFIN AND
            V.DEVT_ID = D.DEVT_ID AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND DEVT_ANULADO = 'N'
            AND P.PREF_PRE = V.PREF_PRE AND P.TIDO_COD = 33 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY T.TERC_NIT, ARTI_COD
            INTO :NIT, :NOMBRE, :TELEFONO, :CIUDAD, :CODZONA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :TOTAL
            DO
            BEGIN
            SELECT ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                FROM ARTICULO WHERE ARTI_COD = :ARTICULO
                INTO :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC;
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            EXECUTE PROCEDURE costo_promedio (:ARTICULO, :FECFIN) RETURNING_VALUES (:COSTOUNIT);
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            COSTO = CANTIDAD * COSTOUNIT;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            TOTAL = TOTAL * -1;
            IVA = IVA * -1;
            BASE = BASE * -1;
            CANTIDAD = CANTIDAD * -1;
            COSTO = COSTO * -1;
            UTILIDAD = UTILIDAD * -1;
            if (CEROS = 'S') then
                INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (3, USER, :ARTICULO);
            SUSPEND;
            END /* FOR */
        if (CEROS = 'S') then
            BEGIN
            COSTO = 0;
            UTILIDAD = 0;
            PORC = 0;
            /* agregue los articulos sin factura */
            FOR SELECT ARTI_COD, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN
                INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                DO
                BEGIN
                SELECT COUNT(REPA_ARTICULO) FROM REPORTES_AUX WHERE REPA_ID = 3 AND REPA_USER = USER AND REPA_ARTICULO = :articulo INTO :numrows;
                if (numrows = 0) then
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        END
    if (BIN_AND(TIPO, 8) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 34 INTO :NOMTIPO;
        /* BORRA LA TABLA AUXILIAR */
        DELETE FROM reportes_aux WHERE REPA_ID = 3 AND REPA_USER = USER;

        FOR SELECT MAX(T.TERC_NIT), MAX(TERC_NOM), MAX(TERC_TEL), MAX(TERC_CIU), MAX(ZONA_COD), MAX(ARTI_COD), SUM(PEDE_CANT * PEDE_FACTOR), SUM(PEDI_FACTOR*(PEDE_TOTAL-PEDE_IVAMONTO-PEDE_CONSUMO)),
            SUM(PEDI_FACTOR*PEDE_IVAMONTO), SUM(PEDI_FACTOR*PEDE_TOTAL)
            FROM PEDIDOS_DETALLE D, PEDIDOS P, PREFIJOS PR, terceros T, CLIENTES C
            WHERE C.TERC_NIT = T.TERC_NIT AND TERC_CLIE = 'S' AND P.terc_nit = T.terc_nit AND T.TERC_NIT >= :TERINI AND T.TERC_NIT <= :TERFIN AND
            P.PEDI_ID = D.PEDI_ID AND PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND PEDI_ANULADO = 'N'
            AND PR.PREF_PRE = P.PREF_PRE AND P.TIDO_COD = 34 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY T.TERC_NIT, ARTI_COD
            INTO :NIT, :NOMBRE, :TELEFONO, :CIUDAD, :CODZONA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :TOTAL
            DO
            BEGIN
            SELECT ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                FROM ARTICULO WHERE ARTI_COD = :ARTICULO
                INTO :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC;
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            EXECUTE PROCEDURE costo_promedio (:ARTICULO, :FECFIN) RETURNING_VALUES (:COSTOUNIT);
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            COSTO = CANTIDAD * COSTOUNIT;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            if (CEROS = 'S') then
                INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (3, USER, :ARTICULO);
            SUSPEND;
            END /* FOR */
        if (CEROS = 'S') then
            BEGIN
            COSTO = 0;
            UTILIDAD = 0;
            PORC = 0;
            /* agregue los articulos sin factura */
            FOR SELECT ARTI_COD, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN
                INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                DO
                BEGIN
                SELECT COUNT(REPA_ARTICULO) FROM REPORTES_AUX WHERE REPA_ID = 3 AND REPA_USER = USER AND REPA_ARTICULO = :articulo INTO :numrows;
                if (numrows = 0) then
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        END
    if (BIN_AND(TIPO, 16) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 35 INTO :NOMTIPO;
        /* BORRA LA TABLA AUXILIAR */
        DELETE FROM reportes_aux WHERE REPA_ID = 3 AND REPA_USER = USER;

        FOR SELECT MAX(T.TERC_NIT), MAX(TERC_NOM), MAX(TERC_TEL), MAX(TERC_CIU), MAX(ZONA_COD), MAX(ARTI_COD), SUM(CTDE_CANT * CTDE_FACTOR), SUM(COTI_FACTOR*(CTDE_TOTAL-CTDE_IVAMONTO-CTDE_CONSUMO)),
            SUM(COTI_FACTOR*CTDE_IVAMONTO), SUM(COTI_FACTOR*CTDE_TOTAL)
            FROM COTIZACIONES_DETALLE D, COTIZACIONES CT, PREFIJOS P, terceros T, CLIENTES C
            WHERE C.TERC_NIT = T.TERC_NIT AND TERC_CLIE = 'S' AND C.terc_nit = T.terc_nit AND T.TERC_NIT >= :TERINI AND T.TERC_NIT <= :TERFIN AND
            CT.COTI_ID = D.COTI_ID AND COTI_FECHA >= :FECINI AND COTI_FECHA <= :FECFIN AND COTI_ANULADO = 'N'
            AND P.PREF_PRE = CT.PREF_PRE AND P.TIDO_COD = 35 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY T.TERC_NIT, ARTI_COD
            INTO :NIT, :NOMBRE, :TELEFONO, :CIUDAD, :CODZONA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :TOTAL
            DO
            BEGIN
            SELECT ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                FROM ARTICULO WHERE ARTI_COD = :ARTICULO
                INTO :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC;
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            EXECUTE PROCEDURE costo_promedio (:ARTICULO, :FECFIN) RETURNING_VALUES (:COSTOUNIT);
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            COSTO = CANTIDAD * COSTOUNIT;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            if (CEROS = 'S') then
                INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (3, USER, :ARTICULO);
            SUSPEND;
            END /* FOR */
        if (CEROS = 'S') then
            BEGIN
            COSTO = 0;
            UTILIDAD = 0;
            PORC = 0;
            /* agregue los articulos sin factura */
            FOR SELECT ARTI_COD, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN
                INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                DO
                BEGIN
                SELECT COUNT(REPA_ARTICULO) FROM REPORTES_AUX WHERE REPA_ID = 3 AND REPA_USER = USER AND REPA_ARTICULO = :articulo INTO :numrows;
                if (numrows = 0) then
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        END
    END
ELSE
    BEGIN
    if (BIN_AND(TIPO, 1) <> 0) then
            BEGIN
            SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 31 INTO :NOMTIPO;
            FOR SELECT F.PREF_PRE, FACT_NUMERO, FACT_FECHA, ARTI_COD, FADE_CANT * FADE_FACTOR, (FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO)*FACT_FACTOR,
                FADE_IVAMONTO*FACT_FACTOR, FADE_DTOPORC, FADE_TOTAL*FACT_FACTOR, F.terc_nit, F.fact_nomcliente
                FROM FACTURAS F, FACTURAS_DETALLE D, PREFIJOS P
                WHERE F.FACT_ID = D.FACT_ID AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND F.TERC_NIT >= :TERINI AND F.TERC_NIT <= :TERFIN AND FACT_ANULADO = 'N'
                 AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                ORDER BY f.terc_nit, ARTI_COD, FACT_FECHA, F.FACT_ID, FADE_ITEM
                INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :DTO, :TOTAL, :NIT, :nombre
                DO
                BEGIN
                SELECT ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO WHERE ARTI_COD = :ARTICULO
                    INTO :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC;
                SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                EXECUTE PROCEDURE costo_promedio (:ARTICULO, :FECHA) RETURNING_VALUES (:COSTOUNIT);
                COSTO = COSTOUNIT * CANTIDAD;
                UTILIDAD = BASE - COSTO;
                if (UOM = 'UTILIDAD') then
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                else
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
                SUSPEND;
                END
            END
    if (BIN_AND(TIPO, 2) <> 0) then
            BEGIN
            SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 32 INTO :NOMTIPO;
            FOR SELECT R.PREF_PRE, REVT_NUMERO, REVT_FECHA, ARTI_COD, RVDE_CANT * RVDE_FACTOR,
                (RVDE_TOTAL - RVDE_IVAMONTO), RVDE_IVAMONTO, RVDE_DTOPORC, RVDE_TOTAL, R.terc_nit, R.revt_nomterc
                FROM REMISIONES_VENTA R, REMISIONES_VENTA_DETALLE D, PREFIJOS P
                WHERE R.REVT_ID = D.REVT_ID AND REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN AND R.TERC_NIT >= :TERINI AND R.TERC_NIT <= :TERFIN AND REVT_ANULADO = 'N'
                 AND P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = 32 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                ORDER BY r.terc_nit, ARTI_COD, REVT_FECHA, R.REVT_ID, RVDE_ITEM
                INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :DTO, :TOTAL, :NIT, :nombre
                DO
                BEGIN
                SELECT ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO WHERE ARTI_COD = :ARTICULO
                    INTO :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC;
                SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                EXECUTE PROCEDURE costo_promedio (:ARTICULO, :FECHA) RETURNING_VALUES (:COSTOUNIT);
                COSTO = COSTOUNIT * CANTIDAD;
                UTILIDAD = BASE - COSTO;
                if (UOM = 'UTILIDAD') then
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                else
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
                SUSPEND;
                END
            END
    if (BIN_AND(TIPO, 4) <> 0) then
            BEGIN
            SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 33 INTO :NOMTIPO;
            FOR SELECT V.PREF_PRE, DEVT_NUMERO, DEVT_FECHA, ARTI_COD, DVDE_CANT * DVDE_FACTOR, (DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO)*DEVT_FACTOR,
                DVDE_IVAMONTO*DEVT_FACTOR, DVDE_DTOPORC, DVDE_TOTAL*DEVT_FACTOR, V.terc_nit, V.devt_nomterc
                FROM DEVOLUCIONES_VENTAS V, DEVOLUCIONES_VENTAS_DETALLE D, PREFIJOS P
                WHERE V.DEVT_ID = D.DEVT_ID AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND V.TERC_NIT >= :TERINI AND V.TERC_NIT <= :TERFIN AND DEVT_ANULADO = 'N'
                 AND P.PREF_PRE = V.PREF_PRE AND P.TIDO_COD = 33 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                ORDER BY v.terc_nit, ARTI_COD, DEVT_FECHA, D.DEVT_ID, DVDE_ITEM
                INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :DTO, :TOTAL, :NIT, :nombre
                DO
                BEGIN
                SELECT ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO WHERE ARTI_COD = :ARTICULO
                    INTO :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC;
                SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                EXECUTE PROCEDURE costo_promedio (:ARTICULO, :FECHA) RETURNING_VALUES (:COSTOUNIT);
                COSTO = COSTOUNIT * CANTIDAD;
                UTILIDAD = BASE - COSTO;
                if (UOM = 'UTILIDAD') then
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                else
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
                TOTAL = TOTAL * -1;
                IVA = IVA * -1;
                BASE = BASE * -1;
                CANTIDAD = CANTIDAD * -1;
                COSTO = COSTO * -1;
                UTILIDAD = UTILIDAD * -1;
                SUSPEND;
                END
            END
    if (BIN_AND(TIPO, 8) <> 0) then
            BEGIN
            SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 34 INTO :NOMTIPO;
            FOR SELECT P.PREF_PRE, PEDI_NUMERO, PEDI_FECHA, ARTI_COD, PEDE_CANT * PEDE_FACTOR, (PEDE_TOTAL-PEDE_IVAMONTO-PEDE_CONSUMO)*PEDI_FACTOR,
                PEDE_IVAMONTO*PEDI_FACTOR, PEDE_DTOPORC, PEDE_TOTAL*PEDI_FACTOR, P.terc_nit, P.pedi_nomterc
                FROM PEDIDOS P, PEDIDOS_DETALLE D, PREFIJOS PR
                WHERE P.PEDI_ID = D.PEDI_ID AND PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND P.TERC_NIT >= :TERINI AND P.TERC_NIT <= :TERFIN AND PEDI_ANULADO = 'N'
                 AND P.PREF_PRE = PR.PREF_PRE AND P.TIDO_COD = 34 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                ORDER BY p.terc_nit, ARTI_COD, PEDI_FECHA, P.PEDI_ID, PEDE_ITEM
                INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :DTO, :TOTAL, :NIT, :nombre
                DO
                BEGIN
                SELECT ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO WHERE ARTI_COD = :ARTICULO
                    INTO :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC;
                SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                EXECUTE PROCEDURE costo_promedio (:ARTICULO, :FECHA) RETURNING_VALUES (:COSTOUNIT);
                COSTO = COSTOUNIT * CANTIDAD;
                UTILIDAD = BASE - COSTO;
                if (UOM = 'UTILIDAD') then
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                else
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
                SUSPEND;
                END
            END
    if (BIN_AND(TIPO, 16) <> 0) then
            BEGIN
            SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 35 INTO :NOMTIPO;
            FOR SELECT C.PREF_PRE, COTI_NUMERO, COTI_FECHA, ARTI_COD, CTDE_CANT * CTDE_FACTOR, (CTDE_TOTAL-CTDE_IVAMONTO-CTDE_CONSUMO)*COTI_FACTOR,
                CTDE_IVAMONTO*COTI_FACTOR, CTDE_DTOPORC, CTDE_TOTAL*COTI_FACTOR, C.terc_nit, C.coti_nomterc
                FROM COTIZACIONES C, COTIZACIONES_DETALLE D, PREFIJOS P
                WHERE C.COTI_ID = D.COTI_ID AND ARTI_COD = :ARTICULO AND COTI_FECHA >= :FECINI AND COTI_FECHA <= :FECFIN AND C.TERC_NIT >= :TERINI AND C.TERC_NIT <= :TERFIN AND COTI_ANULADO = 'N'
                 AND P.PREF_PRE = C.PREF_PRE AND P.TIDO_COD = 35 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                ORDER BY c.terc_nit, COTI_FECHA, C.COTI_ID, CTDE_ITEM
                INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :DTO, :TOTAL, :NIT, :nombre
                DO
                BEGIN
                SELECT ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO WHERE ARTI_COD = :ARTICULO
                    INTO :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC;
                SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                EXECUTE PROCEDURE costo_promedio (:ARTICULO, :FECHA) RETURNING_VALUES (:COSTOUNIT);
                COSTO = COSTOUNIT * CANTIDAD;
                UTILIDAD = BASE - COSTO;
                if (UOM = 'UTILIDAD') then
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                else
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
                SUSPEND;
                END
            END
    END
END

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE REP_UTILIDAD_VENDEDOR(
    TIPO INTEGER,
    DETALLE CHAR(1),
    VENINI VARCHAR(20),
    VENFIN VARCHAR(20),
    FECINI DATE,
    FECFIN DATE,
    ARTINI VARCHAR(15),
    ARTFIN VARCHAR(15),
    ORDEN CHAR(1),
    CEROS CHAR(1),
    SUBEMPRESA INTEGER)
RETURNS (
    CODVEND VARCHAR(20),
    NOMVEND VARCHAR(60),
    NOMTIPO VARCHAR(50),
    ARTICULO VARCHAR(15),
    DESCRIPCION VARCHAR(60),
    CODGRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    CODSUBG VARCHAR(3),
    NOMSUBG VARCHAR(30),
    CODMARC VARCHAR(3),
    NOMMARC VARCHAR(30),
    UNIDAD VARCHAR(8),
    CANTIDAD NUMERIC(18,4),
    BASE NUMERIC(18,2),
    IVA NUMERIC(18,2),
    CONSUMO NUMERIC(18,2),
    COSTO NUMERIC(18,2),
    UTILIDAD NUMERIC(18,4),
    PORC NUMERIC(9,2),
    TOTAL NUMERIC(18,2),
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    DTO NUMERIC(9,2))
AS
DECLARE VARIABLE COSTOUNIT NUMERIC(18,4);
DECLARE VARIABLE CODINI VARCHAR(15);
DECLARE VARIABLE CODFIN VARCHAR(15);
DECLARE VARIABLE DESINI VARCHAR(15);
DECLARE VARIABLE DESFIN VARCHAR(15);
declare variable UOM VARCHAR(20);
BEGIN
if (ORDEN = 'C') then
    BEGIN
    CODINI = ARTINI;
    CODFIN = ARTFIN;
    DESINI = '';
    DESFIN = 'zz';
    END
ELSE
    BEGIN
    DESINI = ARTINI;
    DESFIN = ARTFIN;
    CODINI = '';
    CODFIN = 'zz';
    END
  EXECUTE PROCEDURE lee_configuracion ('FACTURACION', 'ARTICULOS', 'SUGERIR PRECIOS CON PORCENTAJE DE MARGEN O UTILIDAD') returning_values (:UOM);
  SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = :TIPO INTO :NOMTIPO;
  FOR select VEND_COD, VEND_NOMBRE
    from VENDEDORES
    where VEND_COD >= :VENINI AND VEND_COD <= :VENFIN
    INTO :CODVEND, :NOMVEND
    DO  
    BEGIN
    if (DETALLE = 'N') then
        BEGIN
        if (BIN_AND(TIPO, 1) <> 0) then
            BEGIN
            SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 31 INTO :NOMTIPO;
            /* BORRA LA TABLA AUXILIAR */
            DELETE FROM reportes_aux WHERE REPA_ID = 4 AND REPA_USER = USER;
            FOR SELECT MAX(ARTI_COD), SUM(FADE_CANT * FADE_FACTOR), SUM(FACT_FACTOR*(FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO)),
                SUM(FACT_FACTOR*FADE_IVAMONTO), SUM(FACT_FACTOR*FADE_TOTAL), SUM(FADE_CONSUMO)
                FROM FACTURAS_DETALLE D, FACTURAS F, PREFIJOS P
                WHERE F.FACT_ID = D.FACT_ID AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND VEND_COD = :CODVEND AND FACT_ANULADO = 'N'
                 AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                GROUP BY ARTI_COD
                INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :TOTAL, :CONSUMO
                DO
                BEGIN
                SELECT ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO WHERE ARTI_COD = :ARTICULO
                    INTO :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC;
                SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                EXECUTE PROCEDURE costo_promedio (:ARTICULO, :FECFIN) RETURNING_VALUES (:COSTOUNIT);
                if (CANTIDAD IS NULL) then
                    CANTIDAD = 0;
                if (BASE IS NULL) then
                    BASE = 0;
                if (IVA IS NULL) then
                    IVA = 0;
                COSTO = CANTIDAD * COSTOUNIT;
                UTILIDAD = BASE - COSTO;
                if (UOM = 'UTILIDAD') then
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                else
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
                if (CEROS = 'S') then
                    begin
                    INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (4, USER, :ARTICULO);
                    SUSPEND;
                    end
                ELSE
                    if ((BASE <> 0) AND (CANTIDAD <> 0)) then
                        SUSPEND;
                END
            if (CEROS = 'S') then
                BEGIN
                COSTO = 0;
                UTILIDAD = 0;
                PORC = 0;
                /* agregue los articulos sin factura */
                FOR SELECT ARTI_COD, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN and
                    not exists (select REPA_ARTICULO FROM REPORTES_AUX WHERE REPA_ID = 4 AND REPA_USER = USER AND REPA_ARTICULO = a.arti_cod)
                    INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                    DO
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        if (BIN_AND(TIPO, 2) <> 0) then
            BEGIN
            SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 32 INTO :NOMTIPO;
            FOR SELECT MAX(ARTI_COD), SUM(RVDE_CANT * RVDE_FACTOR), SUM(RVDE_TOTAL-RVDE_IVAMONTO-RVDE_CONSUMO), SUM(RVDE_IVAMONTO), SUM(RVDE_TOTAL), SUM(RVDE_CONSUMO)
                FROM REMISIONES_VENTA_DETALLE D, REMISIONES_VENTA R, PREFIJOS P
                WHERE R.REVT_ID = D.REVT_ID AND REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN AND VEND_COD = :CODVEND AND REVT_ANULADO = 'N'
                 AND P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = 32 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                GROUP BY ARTI_COD
                INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :TOTAL, :CONSUMO
                DO
                BEGIN
                SELECT ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO WHERE ARTI_COD = :ARTICULO
                    INTO :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC;
                SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                EXECUTE PROCEDURE costo_promedio (:ARTICULO, :FECFIN) RETURNING_VALUES (:COSTOUNIT);
                if (CANTIDAD IS NULL) then
                    CANTIDAD = 0;
                if (BASE IS NULL) then
                    BASE = 0;
                if (IVA IS NULL) then
                    IVA = 0;
                COSTO = CANTIDAD * COSTOUNIT;
                UTILIDAD = BASE - COSTO;
                if (UOM = 'UTILIDAD') then
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                else
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
                if (CEROS = 'S') then
                    begin
                    INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (4, USER, :ARTICULO);
                    SUSPEND;
                    end
                ELSE
                    if ((BASE <> 0) AND (CANTIDAD <> 0)) then
                        SUSPEND;
                END
            if (CEROS = 'S') then
                BEGIN
                COSTO = 0;
                UTILIDAD = 0;
                PORC = 0;
                /* agregue los articulos sin factura */
                FOR SELECT ARTI_COD, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN and
                    not exists (select REPA_ARTICULO FROM REPORTES_AUX WHERE REPA_ID = 4 AND REPA_USER = USER AND REPA_ARTICULO = a.arti_cod)
                    INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                    DO
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        if (BIN_AND(TIPO, 4) <> 0) then
            BEGIN
            SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 33 INTO :NOMTIPO;
            FOR SELECT MAX(ARTI_COD), SUM(DVDE_CANT * DVDE_FACTOR), SUM(DEVT_FACTOR*(DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO)),
                SUM(DEVT_FACTOR*DVDE_IVAMONTO), SUM(DEVT_FACTOR*DVDE_TOTAL), SUM(DVDE_CONSUMO)
                FROM devoluciones_ventas_detalle D, DEVOLUCIONES_VENTAS V, PREFIJOS P
                WHERE V.DEVT_ID = D.DEVT_ID AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND VEND_COD = :CODVEND AND DEVT_ANULADO = 'N'
                 AND P.PREF_PRE = V.PREF_PRE AND P.TIDO_COD = 33 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                GROUP BY ARTI_COD
                INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :TOTAL, :CONSUMO
                DO
                BEGIN
                SELECT ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO WHERE ARTI_COD = :ARTICULO
                    INTO :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC;
                SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                EXECUTE PROCEDURE costo_promedio (:ARTICULO, :FECFIN) RETURNING_VALUES (:COSTOUNIT);
                if (CANTIDAD IS NULL) then
                    CANTIDAD = 0;
                if (BASE IS NULL) then
                    BASE = 0;
                if (IVA IS NULL) then
                    IVA = 0;
                COSTO = CANTIDAD * COSTOUNIT;
                UTILIDAD = BASE - COSTO;
                if (UOM = 'UTILIDAD') then
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                else
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
                TOTAL = TOTAL * -1;
                IVA = IVA * -1;
                BASE = BASE * -1;
                CANTIDAD = CANTIDAD * -1;
                COSTO = COSTO * -1;
                UTILIDAD = UTILIDAD * -1;
                if (CEROS = 'S') then
                    begin
                    INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (4, USER, :ARTICULO);
                    SUSPEND;
                    end
                ELSE
                    if ((BASE <> 0) AND (CANTIDAD <> 0)) then
                        SUSPEND;
                END
            if (CEROS = 'S') then
                BEGIN
                COSTO = 0;
                UTILIDAD = 0;
                PORC = 0;
                /* agregue los articulos sin factura */
                FOR SELECT ARTI_COD, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN and
                    not exists (select REPA_ARTICULO FROM REPORTES_AUX WHERE REPA_ID = 4 AND REPA_USER = USER AND REPA_ARTICULO = a.arti_cod)
                    INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                    DO
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        if (BIN_AND(TIPO, 8) <> 0) then
            BEGIN
            SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 34 INTO :NOMTIPO;
            FOR SELECT MAX(ARTI_COD), SUM(PEDE_CANT * PEDE_FACTOR), SUM(PEDI_FACTOR*(PEDE_TOTAL-PEDE_IVAMONTO-PEDE_CONSUMO)),
                SUM(PEDI_FACTOR*PEDE_IVAMONTO), SUM(PEDI_FACTOR*PEDE_TOTAL), SUM(PEDE_CONSUMO)
                FROM PEDIDOS_DETALLE D, PEDIDOS P, PREFIJOS PR
                WHERE P.PEDI_ID = D.PEDI_ID AND PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND VEND_COD = :CODVEND AND PEDI_ANULADO = 'N'
                 AND PR.PREF_PRE = P.PREF_PRE AND P.TIDO_COD = 34 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                GROUP BY ARTI_COD
                INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :TOTAL, :CONSUMO
                DO
                BEGIN
                SELECT ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO WHERE ARTI_COD = :ARTICULO
                    INTO :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC;
                SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                EXECUTE PROCEDURE costo_promedio (:ARTICULO, :FECFIN) RETURNING_VALUES (:COSTOUNIT);
                if (CANTIDAD IS NULL) then
                    CANTIDAD = 0;
                if (BASE IS NULL) then
                    BASE = 0;
                if (IVA IS NULL) then
                    IVA = 0;
                COSTO = CANTIDAD * COSTOUNIT;
                UTILIDAD = BASE - COSTO;
                if (UOM = 'UTILIDAD') then
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                else
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
                if (CEROS = 'S') then
                    begin
                    INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (4, USER, :ARTICULO);
                    SUSPEND;
                    end
                ELSE
                    if ((BASE <> 0) AND (CANTIDAD <> 0)) then
                        SUSPEND;
                END
            if (CEROS = 'S') then
                BEGIN
                COSTO = 0;
                UTILIDAD = 0;
                PORC = 0;
                /* agregue los articulos sin factura */
                FOR SELECT ARTI_COD, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN and
                    not exists (select REPA_ARTICULO FROM REPORTES_AUX WHERE REPA_ID = 4 AND REPA_USER = USER AND REPA_ARTICULO = a.arti_cod)
                    INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                    DO
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        if (BIN_AND(TIPO, 16) <> 0) then
            BEGIN
            SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 35 INTO :NOMTIPO;
            FOR SELECT MAX(ARTI_COD), SUM(CTDE_CANT * CTDE_FACTOR), SUM(COTI_FACTOR*(CTDE_TOTAL-CTDE_IVAMONTO-CTDE_CONSUMO)),
                SUM(COTI_FACTOR*CTDE_IVAMONTO), SUM(COTI_FACTOR*CTDE_TOTAL), SUM(CTDE_CONSUMO)
                FROM COTIZACIONES_DETALLE D, COTIZACIONES C, PREFIJOS P
                WHERE C.COTI_ID = D.COTI_ID AND COTI_FECHA >= :FECINI AND COTI_FECHA <= :FECFIN AND VEND_COD = :CODVEND AND COTI_ANULADO = 'N'
                 AND P.PREF_PRE = C.PREF_PRE AND P.TIDO_COD = 35 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                GROUP BY ARTI_COD
                INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :TOTAL, :CONSUMO
                DO
                BEGIN
                SELECT ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO WHERE ARTI_COD = :ARTICULO
                    INTO :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC;
                SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                EXECUTE PROCEDURE costo_promedio (:ARTICULO, :FECFIN) RETURNING_VALUES (:COSTOUNIT);
                if (CANTIDAD IS NULL) then
                    CANTIDAD = 0;
                if (BASE IS NULL) then
                    BASE = 0;
                if (IVA IS NULL) then
                    IVA = 0;
                COSTO = CANTIDAD * COSTOUNIT;
                UTILIDAD = BASE - COSTO;
                if (UOM = 'UTILIDAD') then
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                else
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
                if (CEROS = 'S') then
                    begin
                    INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (4, USER, :ARTICULO);
                    SUSPEND;
                    end
                ELSE
                    if ((BASE <> 0) AND (CANTIDAD <> 0)) then
                        SUSPEND;
                END
            if (CEROS = 'S') then
                BEGIN
                COSTO = 0;
                UTILIDAD = 0;
                PORC = 0;
                /* agregue los articulos sin factura */
                FOR SELECT ARTI_COD, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN and
                    not exists (select REPA_ARTICULO FROM REPORTES_AUX WHERE REPA_ID = 4 AND REPA_USER = USER AND REPA_ARTICULO = a.arti_cod)
                    INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                    DO
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        END
    ELSE
        BEGIN
        if (BIN_AND(TIPO, 1) <> 0) then
            BEGIN
            SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 31 INTO :NOMTIPO;
            FOR SELECT F.PREF_PRE, FACT_NUMERO, FACT_FECHA, ARTI_COD, FADE_CANT * FADE_FACTOR, (FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO)*FACT_FACTOR,
                FADE_IVAMONTO*FACT_FACTOR, FADE_DTOPORC, FADE_TOTAL*FACT_FACTOR, FADE_CONSUMO
                FROM FACTURAS F, FACTURAS_DETALLE D, PREFIJOS P
                WHERE F.FACT_ID = D.FACT_ID AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND VEND_COD = :CODVEND AND FACT_ANULADO = 'N'
                 AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                ORDER BY ARTI_COD, FACT_FECHA, F.FACT_ID, FADE_ITEM
                INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :DTO, :TOTAL, :CONSUMO
                DO
                BEGIN
                SELECT ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO WHERE ARTI_COD = :ARTICULO
                    INTO :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC;
                SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                EXECUTE PROCEDURE costo_promedio (:ARTICULO, :FECHA) RETURNING_VALUES (:COSTOUNIT);
                COSTO = COSTOUNIT * CANTIDAD;
                UTILIDAD = BASE - COSTO;
                if (UOM = 'UTILIDAD') then
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                else
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
                if (CEROS = 'S') then
                    INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (4, USER, :ARTICULO);
                SUSPEND;
                END
            if (CEROS = 'S') then
                BEGIN
                COSTO = 0;
                UTILIDAD = 0;
                PORC = 0;
                /* agregue los articulos sin factura */
                FOR SELECT ARTI_COD, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN and
                    not exists (select REPA_ARTICULO FROM REPORTES_AUX WHERE REPA_ID = 4 AND REPA_USER = USER AND REPA_ARTICULO = a.arti_cod)
                    INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                    DO
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        if (BIN_AND(TIPO, 2) <> 0) then
            BEGIN
            SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 32 INTO :NOMTIPO;
            FOR SELECT R.PREF_PRE, REVT_NUMERO, REVT_FECHA, ARTI_COD, RVDE_CANT * RVDE_FACTOR, (RVDE_TOTAL - RVDE_IVAMONTO), RVDE_IVAMONTO, RVDE_DTOPORC, RVDE_TOTAL, RVDE_CONSUMO
                FROM REMISIONES_VENTA R, REMISIONES_VENTA_DETALLE D, PREFIJOS P
                WHERE R.REVT_ID = D.REVT_ID AND REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN AND VEND_COD = :CODVEND AND REVT_ANULADO = 'N'
                 AND P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = 32 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                ORDER BY ARTI_COD, REVT_FECHA, R.REVT_ID, RVDE_ITEM
                INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :DTO, :TOTAL, :CONSUMO
                DO
                BEGIN
                SELECT ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO WHERE ARTI_COD = :ARTICULO
                    INTO :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC;
                SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                EXECUTE PROCEDURE costo_promedio (:ARTICULO, :FECHA) RETURNING_VALUES (:COSTOUNIT);
                COSTO = COSTOUNIT * CANTIDAD;
                UTILIDAD = BASE - COSTO;
                if (UOM = 'UTILIDAD') then
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                else
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
                if (CEROS = 'S') then
                    INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (4, USER, :ARTICULO);
                SUSPEND;
                END
            if (CEROS = 'S') then
                BEGIN
                COSTO = 0;
                UTILIDAD = 0;
                PORC = 0;
                /* agregue los articulos sin factura */
                FOR SELECT ARTI_COD, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN and
                    not exists (select REPA_ARTICULO FROM REPORTES_AUX WHERE REPA_ID = 4 AND REPA_USER = USER AND REPA_ARTICULO = a.arti_cod)
                    INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                    DO
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        if (BIN_AND(TIPO, 4) <> 0) then
            BEGIN
            SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 33 INTO :NOMTIPO;
            FOR SELECT V.PREF_PRE, DEVT_NUMERO, DEVT_FECHA, ARTI_COD, DVDE_CANT * DVDE_FACTOR, (DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO)*DEVT_FACTOR,
                DVDE_IVAMONTO*DEVT_FACTOR, DVDE_DTOPORC, DVDE_TOTAL*DEVT_FACTOR, DVDE_CONSUMO
                FROM DEVOLUCIONES_VENTAS V, DEVOLUCIONES_VENTAS_DETALLE D, PREFIJOS P
                WHERE V.DEVT_ID = D.DEVT_ID AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND VEND_COD = :CODVEND AND DEVT_ANULADO = 'N'
                 AND P.PREF_PRE = V.PREF_PRE AND P.TIDO_COD = 33 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                ORDER BY ARTI_COD, DEVT_FECHA, D.DEVT_ID, DVDE_ITEM
                INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :DTO, :TOTAL, :CONSUMO
                DO
                BEGIN
                SELECT ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO WHERE ARTI_COD = :ARTICULO
                    INTO :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC;
                SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                EXECUTE PROCEDURE costo_promedio (:ARTICULO, :FECHA) RETURNING_VALUES (:COSTOUNIT);
                COSTO = COSTOUNIT * CANTIDAD;
                UTILIDAD = BASE - COSTO;
                if (UOM = 'UTILIDAD') then
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                else
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
                TOTAL = TOTAL * -1;
                IVA = IVA * -1;
                BASE = BASE * -1;
                CANTIDAD = CANTIDAD * -1;
                COSTO = COSTO * -1;
                UTILIDAD = UTILIDAD * -1;
                if (CEROS = 'S') then
                    INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (4, USER, :ARTICULO);
                SUSPEND;
                END
            if (CEROS = 'S') then
                BEGIN
                COSTO = 0;
                UTILIDAD = 0;
                PORC = 0;
                /* agregue los articulos sin factura */
                FOR SELECT ARTI_COD, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN and
                    not exists (select REPA_ARTICULO FROM REPORTES_AUX WHERE REPA_ID = 4 AND REPA_USER = USER AND REPA_ARTICULO = a.arti_cod)
                    INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                    DO
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        if (BIN_AND(TIPO, 8) <> 0) then
            BEGIN
            SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 34 INTO :NOMTIPO;
            FOR SELECT P.PREF_PRE, PEDI_NUMERO, PEDI_FECHA, ARTI_COD, PEDE_CANT * PEDE_FACTOR, (PEDE_TOTAL-PEDE_IVAMONTO-PEDE_CONSUMO)*PEDI_FACTOR,
                PEDE_IVAMONTO*PEDI_FACTOR, PEDE_DTOPORC, PEDE_TOTAL*PEDI_FACTOR, PEDE_CONSUMO
                FROM PEDIDOS P, PEDIDOS_DETALLE D, PREFIJOS PR
                WHERE P.PEDI_ID = D.PEDI_ID AND PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND VEND_COD = :CODVEND AND PEDI_ANULADO = 'N'
                 AND P.PREF_PRE = PR.PREF_PRE AND P.TIDO_COD = 34 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                ORDER BY ARTI_COD, PEDI_FECHA, P.PEDI_ID, PEDE_ITEM
                INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :DTO, :TOTAL, :CONSUMO
                DO
                BEGIN
                SELECT ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO WHERE ARTI_COD = :ARTICULO
                    INTO :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC;
                SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                EXECUTE PROCEDURE costo_promedio (:ARTICULO, :FECHA) RETURNING_VALUES (:COSTOUNIT);
                COSTO = COSTOUNIT * CANTIDAD;
                UTILIDAD = BASE - COSTO;
                if (UOM = 'UTILIDAD') then
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                else
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
                if (CEROS = 'S') then
                    INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (4, USER, :ARTICULO);
                SUSPEND;
                END
            if (CEROS = 'S') then
                BEGIN
                COSTO = 0;
                UTILIDAD = 0;
                PORC = 0;
                /* agregue los articulos sin factura */
                FOR SELECT ARTI_COD, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN and
                    not exists (select REPA_ARTICULO FROM REPORTES_AUX WHERE REPA_ID = 4 AND REPA_USER = USER AND REPA_ARTICULO = a.arti_cod)
                    INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                    DO
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        if (BIN_AND(TIPO, 16) <> 0) then
            BEGIN
            SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 35 INTO :NOMTIPO;
            FOR SELECT C.PREF_PRE, COTI_NUMERO, COTI_FECHA, ARTI_COD, CTDE_CANT * CTDE_FACTOR, (CTDE_TOTAL-CTDE_IVAMONTO-CTDE_CONSUMO)*COTI_FACTOR,
                CTDE_IVAMONTO*COTI_FACTOR, CTDE_DTOPORC, CTDE_TOTAL*COTI_FACTOR, CTDE_CONSUMO
                FROM COTIZACIONES C, COTIZACIONES_DETALLE D, PREFIJOS P
                WHERE C.COTI_ID = D.COTI_ID AND ARTI_COD = :ARTICULO AND COTI_FECHA >= :FECINI AND COTI_FECHA <= :FECFIN AND VEND_COD = :CODVEND AND COTI_ANULADO = 'N'
                 AND P.PREF_PRE = C.PREF_PRE AND P.TIDO_COD = 35 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                ORDER BY COTI_FECHA, C.COTI_ID, CTDE_ITEM
                INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :DTO, :TOTAL, :CONSUMO
                DO
                BEGIN
                SELECT ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO WHERE ARTI_COD = :ARTICULO
                    INTO :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC;
                SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                EXECUTE PROCEDURE costo_promedio (:ARTICULO, :FECHA) RETURNING_VALUES (:COSTOUNIT);
                COSTO = COSTOUNIT * CANTIDAD;
                UTILIDAD = BASE - COSTO;
                if (UOM = 'UTILIDAD') then
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                else
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
                if (CEROS = 'S') then
                    INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (4, USER, :ARTICULO);
                SUSPEND;
                END
            if (CEROS = 'S') then
                BEGIN
                COSTO = 0;
                UTILIDAD = 0;
                PORC = 0;
                /* agregue los articulos sin factura */
                FOR SELECT ARTI_COD, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN and
                    not exists (select REPA_ARTICULO FROM REPORTES_AUX WHERE REPA_ID = 4 AND REPA_USER = USER AND REPA_ARTICULO = a.arti_cod)
                    INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                    DO
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        END
    END
END

^

SET TERM ; ^

CREATE TABLE PUNTO_EQUILIBRIO (
    PTEQ_ITEM    T_ID NOT NULL,
    PTEQ_CUENTA  T_CTA_CONTABLE,
    PTEQ_SECC    SMALLINT,
    PTEQ_DB      T_BOOLEANO
);

SET TERM ^ ;

ALTER PROCEDURE REP_UTILIDAD_VENTAS(
    TIPO INTEGER,
    DETALLE CHAR(1),
    FECINI DATE,
    FECFIN DATE,
    ARTINI VARCHAR(15),
    ARTFIN VARCHAR(15),
    GRPINI VARCHAR(3),
    GRPFIN VARCHAR(3),
    ORDEN CHAR(1),
    AGRUPA CHAR(1),
    CEROS CHAR(1),
    EQUILIBRIO CHAR(1),
    SUBEMPRESA INTEGER)
RETURNS (
    ARTICULO VARCHAR(15),
    DESCRIPCION VARCHAR(60),
    CODGRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    CODSUBG VARCHAR(3),
    NOMSUBG VARCHAR(30),
    CODMARC VARCHAR(3),
    NOMMARC VARCHAR(30),
    UNIDAD VARCHAR(8),
    CANTIDAD NUMERIC(18,4),
    BASE NUMERIC(18,4),
    COSTO NUMERIC(18,4),
    UTILIDAD NUMERIC(18,4),
    PORC NUMERIC(9,2),
    IVA NUMERIC(18,4),
    CONSUMO NUMERIC(18,4),
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    TIPODOC INTEGER)
AS
DECLARE VARIABLE COSTOUNIT NUMERIC(18,4);
declare variable CODINI VARCHAR(15);
declare variable CODFIN VARCHAR(15);
declare variable DESINI VARCHAR(15);
declare variable DESFIN VARCHAR(15);
declare variable MARINI VARCHAR(3);
declare variable MARFIN VARCHAR(3);
declare variable UOM VARCHAR(20);
declare variable NUMROWS INTEGER;
declare variable TOTAL NUMERIC(18,2);
declare variable CUENTA VARCHAR(20);
declare variable SECC INTEGER;
declare variable DB CHAR(1);
declare variable FECCNT VARCHAR(8);
declare variable FIJOS NUMERIC(18,2);
declare variable VARIA NUMERIC(18,2);
declare variable SALDO NUMERIC(18,2);
BEGIN
if (ORDEN = 'C') then
    BEGIN
    CODINI = ARTINI;
    CODFIN = ARTFIN;
    DESINI = '';
    DESFIN = 'zz';
    END
ELSE
    BEGIN
    DESINI = ARTINI;
    DESFIN = ARTFIN;
    CODINI = '';
    CODFIN = 'zz';
    END
if (AGRUPA = 'G') then
    BEGIN
    MARINI = '';
    MARFIN = 'zz';
    END
ELSE
    if (AGRUPA = 'M') then
        BEGIN
        MARINI = GRPINI;
        MARFIN = GRPFIN;
        GRPINI = '';
        GRPFIN = 'zz';
        END
    ELSE
        BEGIN
        MARINI = '';
        MARFIN = 'zz';
        GRPINI = '';
        GRPFIN = 'zz';
        END
EXECUTE PROCEDURE lee_configuracion ('FACTURACION', 'ARTICULOS', 'SUGERIR PRECIOS CON PORCENTAJE DE MARGEN O UTILIDAD') returning_values (:UOM);
if (DETALLE = 'N') then
    BEGIN
    if (BIN_AND(TIPO, 1) <> 0) then
        BEGIN
        TIPODOC = 31;
        /* BORRA LA TABLA AUXILIAR */
        DELETE FROM reportes_aux WHERE REPA_ID = 2 AND REPA_USER = USER;
        if (EQUILIBRIO = 'S') then
            BEGIN
            SELECT SUM((FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO)*FACT_FACTOR)
                FROM FACTURAS_DETALLE D, FACTURAS F, PREFIJOS P
                WHERE F.FACT_ID = D.FACT_ID AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND 
                FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND
                FACT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                INTO :TOTAL;

            execute PROCEDURE fecha_a_conta (:FECFIN) returning_values (:FECCNT);
            FIJOS = 0;
            FOR SELECT PTEQ_CUENTA, PTEQ_DB FROM PUNTO_EQUILIBRIO WHERE PTEQ_SECC = 1 INTO :CUENTA, :DB
                DO
                BEGIN
                /* CALCULE EL SALDO DE LA CUENTA */
                EXECUTE PROCEDURE saldo_cuenta (CUENTA, :FECCNT) returning_values (:SALDO);
                if (DB = 'S') then
                    FIJOS = FIJOS + SALDO;
                ELSE
                    FIJOS = FIJOS - SALDO;
                END
            VARIA = 0;
            FOR SELECT PTEQ_CUENTA, PTEQ_DB FROM PUNTO_EQUILIBRIO WHERE PTEQ_SECC = 2 INTO :CUENTA, :DB
                DO
                BEGIN
                /* CALCULE EL SALDO DE LA CUENTA */
                EXECUTE PROCEDURE saldo_cuenta (CUENTA, :FECCNT) returning_values (:SALDO);
                if (DB = 'S') then
                    VARIA = VARIA + SALDO;
                ELSE
                    VARIA = VARIA - SALDO;
                END
            END

        FOR SELECT MAX(D.ARTI_COD), SUM(FADE_CANT * FADE_FACTOR), SUM((FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO)*FACT_FACTOR), SUM(FADE_IVAMONTO*FACT_FACTOR), SUM(FADE_CONSUMO),
            MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD), SUM(COST_SALP)
            FROM FACTURAS_DETALLE D, FACTURAS F, PREFIJOS P, ARTICULO A, movimiento_articulo m, costos c
            WHERE F.FACT_ID = D.FACT_ID AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND D.ARTI_COD = A.arti_cod AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            F.fact_id = M.mvar_idref AND M.mvar_tipodoc = 31 AND M.mvar_item = D.fade_item AND M.mvar_cons = C.cost_idmov AND
            FACT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY D.ARTI_COD
            INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,
            :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :COSTO
            DO
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
/*            EXECUTE PROCEDURE costo_promedio (:ARTICULO, :FECFIN) RETURNING_VALUES (:COSTOUNIT);*/
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
/*            COSTO = cantidad * COSTOUNIT;*/
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                if (COSTO > 0) then
                    PORC = UTILIDAD * 100 / COSTO;
                ELSE
                    PORC = 100;
            else
                if (BASE > 0) then
                    PORC = UTILIDAD * 100 / BASE;
                ELSE
                    PORC = 0;
            if (CEROS = 'S') then
                INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (2, USER, :ARTICULO);
            SUSPEND;
            END /* FOR */
        if (CEROS = 'S') then
            BEGIN
            COSTO = 0;
            UTILIDAD = 0;
            PORC = 0;
            /* agregue los articulos sin factura */
            FOR SELECT ARTI_COD, 0, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND
                    A.ARTI_DES <= :DESFIN AND A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND
                    (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN)))
                INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,:DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                DO
                BEGIN
                SELECT COUNT(REPA_ARTICULO) FROM REPORTES_AUX WHERE REPA_ID = 2 AND REPA_USER = USER AND REPA_ARTICULO = :articulo INTO :numrows;
                if (numrows = 0) then
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        END
    if (BIN_AND(TIPO, 2) <> 0) then
        BEGIN
        TIPODOC = 32;
        /* BORRA LA TABLA AUXILIAR */
        DELETE FROM reportes_aux WHERE REPA_ID = 2 AND REPA_USER = USER;

        FOR SELECT MAX(D.ARTI_COD), SUM(RVDE_CANT * RVDE_FACTOR), SUM(RVDE_TOTAL-RVDE_IVAMONTO-RVDE_CONSUMO), SUM(RVDE_IVAMONTO), SUM(RVDE_CONSUMO),
            MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD), SUM(COST_SALP)
            FROM REMISIONES_VENTA_DETALLE D, REMISIONES_VENTA R, PREFIJOS P, ARTICULO A, movimiento_articulo m, costos c
            WHERE R.REVT_ID = D.REVT_ID AND P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = 32 AND D.ARTI_COD = A.arti_cod AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            R.revt_id = M.mvar_idref AND M.mvar_tipodoc = 32 AND M.mvar_item = D.rvde_item AND M.mvar_cons = C.cost_idmov AND
            REVT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY D.ARTI_COD
            INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,
            :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :COSTO
            DO
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
/*            EXECUTE PROCEDURE costo_promedio (:ARTICULO, :FECFIN) RETURNING_VALUES (:COSTOUNIT); */
/*            COSTO = cantidad * COSTOUNIT;*/
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                if (COSTO > 0) then
                    PORC = UTILIDAD * 100 / COSTO;
                ELSE
                    PORC = 100;
            else
                if (BASE > 0) then
                    PORC = UTILIDAD * 100 / BASE;
                ELSE
                    PORC = 0;
            if (CEROS = 'S') then
                INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (2, USER, :ARTICULO);
            SUSPEND;
            END /* FOR */
        if (CEROS = 'S') then
            BEGIN
            COSTO = 0;
            UTILIDAD = 0;
            PORC = 0;
            /* agregue los articulos sin factura */
            FOR SELECT ARTI_COD, 0, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND
                    A.ARTI_DES <= :DESFIN AND A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND
                    (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN)))
                INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,:DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                DO
                BEGIN
                SELECT COUNT(REPA_ARTICULO) FROM REPORTES_AUX WHERE REPA_ID = 2 AND REPA_USER = USER AND REPA_ARTICULO = :articulo INTO :numrows;
                if (numrows = 0) then
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        END
    if (BIN_AND(TIPO, 4) <> 0) then
        BEGIN
        TIPODOC = 33;
        /* BORRA LA TABLA AUXILIAR */
        DELETE FROM reportes_aux WHERE REPA_ID = 2 AND REPA_USER = USER;

        FOR SELECT MAX(D.ARTI_COD), SUM(DVDE_CANT * DVDE_FACTOR), SUM((DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO)*DEVT_FACTOR), SUM(DVDE_IVAMONTO*DEVT_FACTOR), SUM(DVDE_CONSUMO),
            MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD), SUM(COST_ENTP)
            FROM devoluciones_ventas_detalle D, DEVOLUCIONES_VENTAS V, PREFIJOS P, ARTICULO A, MOVIMIENTO_ARTICULO M, COSTOS C
            WHERE V.DEVT_ID = D.DEVT_ID AND P.PREF_PRE = V.PREF_PRE AND P.TIDO_COD = 33 AND D.ARTI_COD = A.arti_cod AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            V.devt_id = M.mvar_idref AND M.mvar_tipodoc = 33 AND M.mvar_item = D.dvde_item AND M.mvar_cons = C.cost_idmov AND
            DEVT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY D.ARTI_COD
            INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,
            :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :COSTO
            DO
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            else
                CANTIDAD = CANTIDAD * -1;
            if (BASE IS NULL) then
                BASE = 0;
            else
                BASE = BASE * -1;
            if (IVA IS NULL) then
                IVA = 0;
            else
                IVA = IVA * -1;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            else
                CONSUMO = CONSUMO * -1;
/*            EXECUTE PROCEDURE costo_promedio (:ARTICULO, :FECFIN) RETURNING_VALUES (:COSTOUNIT);*/
/*            COSTO = cantidad * COSTOUNIT;*/
            COSTO = costo * -1;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                if (COSTO > 0) then
                    PORC = UTILIDAD * 100 / COSTO;
                ELSE
                    PORC = 100;
            else
                if (BASE > 0) then
                    PORC = UTILIDAD * 100 / BASE;
                ELSE
                    PORC = 0;
            if (CEROS = 'S') then
                INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (2, USER, :ARTICULO);
            SUSPEND;
            END /* FOR */
        if (CEROS = 'S') then
            BEGIN
            COSTO = 0;
            UTILIDAD = 0;
            PORC = 0;
            /* agregue los articulos sin factura */
            FOR SELECT ARTI_COD, 0, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND
                    A.ARTI_DES <= :DESFIN AND A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND
                    (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN)))
                INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,:DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                DO
                BEGIN
                SELECT COUNT(REPA_ARTICULO) FROM REPORTES_AUX WHERE REPA_ID = 2 AND REPA_USER = USER AND REPA_ARTICULO = :articulo INTO :numrows;
                if (numrows = 0) then
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        END
    if (BIN_AND(TIPO, 8) <> 0) then
        BEGIN
        TIPODOC = 34;
        /* BORRA LA TABLA AUXILIAR */
        DELETE FROM reportes_aux WHERE REPA_ID = 2 AND REPA_USER = USER;

        FOR SELECT MAX(D.ARTI_COD), SUM(PEDE_CANT * PEDE_FACTOR), SUM((PEDE_TOTAL-PEDE_IVAMONTO-PEDE_CONSUMO)*PEDI_FACTOR), SUM(PEDE_IVAMONTO*PEDI_FACTOR), SUM(PEDE_CONSUMO),
            MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD)
            FROM PEDIDOS_DETALLE D, PEDIDOS P, PREFIJOS R, ARTICULO A
            WHERE P.PEDI_ID = D.PEDI_ID AND P.PREF_PRE = R.PREF_PRE AND R.TIDO_COD = 34 AND D.ARTI_COD = A.arti_cod AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            PEDI_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY D.ARTI_COD
            INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,
            :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
            DO
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            EXECUTE PROCEDURE costo_promedio (:ARTICULO, :FECFIN) RETURNING_VALUES (:COSTOUNIT);
            COSTO = cantidad * COSTOUNIT;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                if (COSTO > 0) then
                    PORC = UTILIDAD * 100 / COSTO;
                ELSE
                    PORC = 100;
            else
                if (BASE > 0) then
                    PORC = UTILIDAD * 100 / BASE;
                ELSE
                    PORC = 0;
            if (CEROS = 'S') then
                INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (2, USER, :ARTICULO);
            SUSPEND;
            END /* FOR */
        if (CEROS = 'S') then
            BEGIN
            COSTO = 0;
            UTILIDAD = 0;
            PORC = 0;
            /* agregue los articulos sin factura */
            FOR SELECT ARTI_COD, 0, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND
                    A.ARTI_DES <= :DESFIN AND A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND
                    (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN)))
                INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,:DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                DO
                BEGIN
                SELECT COUNT(REPA_ARTICULO) FROM REPORTES_AUX WHERE REPA_ID = 2 AND REPA_USER = USER AND REPA_ARTICULO = :articulo INTO :numrows;
                if (numrows = 0) then
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        END
    if (BIN_AND(TIPO, 16) <> 0) then
        BEGIN
        TIPODOC = 35;
        /* BORRA LA TABLA AUXILIAR */
        DELETE FROM reportes_aux WHERE REPA_ID = 2 AND REPA_USER = USER;

        FOR SELECT MAX(D.ARTI_COD), SUM(CTDE_CANT * CTDE_FACTOR), SUM((CTDE_TOTAL-CTDE_IVAMONTO-CTDE_CONSUMO)*COTI_FACTOR), SUM(CTDE_IVAMONTO), SUM(CTDE_CONSUMO),
            MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD)
            FROM COTIZACIONES_DETALLE D, COTIZACIONES C, PREFIJOS P, ARTICULO A
            WHERE C.COTI_ID = D.COTI_ID AND P.PREF_PRE = C.PREF_PRE AND P.TIDO_COD = 35 AND D.ARTI_COD = A.arti_cod AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND COTI_FECHA >= :FECINI AND COTI_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            COTI_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY D.ARTI_COD
            INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,
            :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
            DO
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            EXECUTE PROCEDURE costo_promedio (:ARTICULO, :FECFIN) RETURNING_VALUES (:COSTOUNIT);
            COSTO = cantidad * COSTOUNIT;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                if (COSTO > 0) then
                    PORC = UTILIDAD * 100 / COSTO;
                ELSE
                    PORC = 100;
            else
                if (BASE > 0) then
                    PORC = UTILIDAD * 100 / BASE;
                ELSE
                    PORC = 0;
            if (CEROS = 'S') then
                INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (2, USER, :ARTICULO);
            SUSPEND;
            END /* FOR */
        if (CEROS = 'S') then
            BEGIN
            COSTO = 0;
            UTILIDAD = 0;
            PORC = 0;
            /* agregue los articulos sin factura */
            FOR SELECT ARTI_COD, 0, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND
                    A.ARTI_DES <= :DESFIN AND A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND
                    (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN)))
                INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,:DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                DO
                BEGIN
                SELECT COUNT(REPA_ARTICULO) FROM REPORTES_AUX WHERE REPA_ID = 2 AND REPA_USER = USER AND REPA_ARTICULO = :articulo INTO :numrows;
                if (numrows = 0) then
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        END
    END
ELSE
    BEGIN
    if (BIN_AND(TIPO, 1) <> 0) then
        BEGIN
        TIPODOC = 31;
        FOR SELECT F.PREF_PRE, FACT_NUMERO, FACT_FECHA, D.ARTI_COD, FADE_CANT * FADE_FACTOR, (FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO)*FACT_FACTOR, FADE_IVAMONTO*FACT_FACTOR, FADE_CONSUMO,
            ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD, COST_SALP
            FROM FACTURAS F, FACTURAS_DETALLE D, PREFIJOS P, ARTICULO A, MOVIMIENTO_ARTICULO M, COSTOS C
            WHERE F.FACT_ID = D.FACT_ID AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND D.ARTI_COD = A.arti_cod AND
                A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
                A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND FACT_FECHA >= :FECINI AND
                (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
                F.fact_id = M.mvar_idref AND M.mvar_tipodoc = 31 AND M.mvar_item = D.fade_item AND M.mvar_cons = C.cost_idmov AND
                FACT_FECHA <= :FECFIN AND FACT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            ORDER BY D.ARTI_COD, FACT_FECHA, F.FACT_ID, FADE_ITEM
            INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,
                :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :COSTO
            DO
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
/*            EXECUTE PROCEDURE costo_promedio (:ARTICULO, :FECHA) RETURNING_VALUES (:COSTOUNIT);*/
/*            COSTO = COSTOUNIT * CANTIDAD;*/
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                if (COSTO > 0) then
                    PORC = UTILIDAD * 100 / COSTO;
                ELSE
                    PORC = 100;
            else
                if (BASE > 0) then
                    PORC = UTILIDAD * 100 / BASE;
                ELSE
                    PORC = 0;
            SUSPEND;
            END
        END
    if (BIN_AND(TIPO, 2) <> 0) then
        BEGIN
        TIPODOC = 32;
        FOR SELECT R.PREF_PRE, REVT_NUMERO, REVT_FECHA, D.ARTI_COD, RVDE_CANT * RVDE_FACTOR, RVDE_TOTAL-RVDE_IVAMONTO-RVDE_CONSUMO, RVDE_IVAMONTO, RVDE_CONSUMO,
            ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD, COST_SALP
            FROM REMISIONES_VENTA R, REMISIONES_VENTA_DETALLE D, PREFIJOS P, ARTICULO A, MOVIMIENTO_ARTICULO M, COSTOS C
            WHERE R.REVT_ID = D.REVT_ID AND P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = 32 AND D.ARTI_COD = A.arti_cod AND
                A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
                A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN AND
                R.revt_id = M.mvar_idref AND M.mvar_tipodoc = 32 AND M.mvar_item = D.rvde_item AND M.mvar_cons = C.cost_idmov AND
                (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
                REVT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            ORDER BY D.ARTI_COD, REVT_FECHA, R.REVT_ID, RVDE_ITEM
            INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,
                :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :COSTO
            DO
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            EXECUTE PROCEDURE costo_promedio (:ARTICULO, :FECHA) RETURNING_VALUES (:COSTOUNIT);
            COSTO = COSTOUNIT * CANTIDAD;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                if (COSTO > 0) then
                    PORC = UTILIDAD * 100 / COSTO;
                ELSE
                    PORC = 100;
            else
                if (BASE > 0) then
                    PORC = UTILIDAD * 100 / BASE;
                ELSE
                    PORC = 0;
            SUSPEND;
            END
        END
    if (BIN_AND(TIPO, 4) <> 0) then
        BEGIN
        TIPODOC = 33;
        FOR SELECT V.PREF_PRE, DEVT_NUMERO, DEVT_FECHA, D.ARTI_COD, DVDE_CANT * DVDE_FACTOR, (DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO)*DEVT_FACTOR, DVDE_IVAMONTO*DEVT_FACTOR, DVDE_CONSUMO,
            ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD, COST_ENTP
            FROM DEVOLUCIONES_VENTAS V, DEVOLUCIONES_VENTAS_DETALLE D, PREFIJOS P, ARTICULO A, MOVIMIENTO_ARTICULO M, COSTOS C
            WHERE V.DEVT_ID = D.DEVT_ID AND P.PREF_PRE = V.PREF_PRE AND P.TIDO_COD = 33 AND D.ARTI_COD = A.arti_cod AND
                A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
                A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND
                (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
                V.devt_id = M.mvar_idref AND M.mvar_tipodoc = 33 AND M.mvar_item = D.dvde_item AND M.mvar_cons = C.cost_idmov AND
                DEVT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            ORDER BY D.ARTI_COD, DEVT_FECHA, V.DEVT_ID, DVDE_ITEM
            INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,
                :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :COSTO
            DO
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            EXECUTE PROCEDURE costo_promedio (:ARTICULO, :FECHA) RETURNING_VALUES (:COSTOUNIT);
            BASE = BASE * -1;
            CANTIDAD = CANTIDAD * -1;
            IVA = IVA * -1;
            CONSUMO = CONSUMO * -1;
            COSTO = COSTOUNIT * CANTIDAD;
            COSTO = COSTO * -1;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                if (COSTO > 0) then
                    PORC = UTILIDAD * 100 / COSTO;
                ELSE
                    PORC = 100;
            else
                if (BASE > 0) then
                    PORC = UTILIDAD * 100 / BASE;
                ELSE
                    PORC = 0;
            SUSPEND;
            END
        END
    if (BIN_AND(TIPO, 8) <> 0) then
        BEGIN
        TIPODOC = 34;
        FOR SELECT P.PREF_PRE, PEDI_NUMERO, PEDI_FECHA, D.ARTI_COD, PEDE_CANT * PEDE_FACTOR, (PEDE_TOTAL-PEDE_IVAMONTO-PEDE_CONSUMO)*PEDI_FACTOR, PEDE_IVAMONTO*PEDI_FACTOR, PEDE_CONSUMO,
            ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD 
            FROM PEDIDOS P, PEDIDOS_DETALLE D, PREFIJOS R, ARTICULO A
            WHERE P.PEDI_ID = D.PEDI_ID AND P.PREF_PRE = R.PREF_PRE AND R.TIDO_COD = 34 AND D.ARTI_COD = A.arti_cod AND
                A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
                A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND
                (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
                PEDI_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            ORDER BY D.ARTI_COD, PEDI_FECHA, P.PEDI_ID, PEDE_ITEM
            INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,
                :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
            DO
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            EXECUTE PROCEDURE costo_promedio (:ARTICULO, :FECHA) RETURNING_VALUES (:COSTOUNIT);
            COSTO = COSTOUNIT * CANTIDAD;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                if (COSTO > 0) then
                    PORC = UTILIDAD * 100 / COSTO;
                ELSE
                    PORC = 100;
            else
                if (BASE > 0) then
                    PORC = UTILIDAD * 100 / BASE;
                ELSE
                    PORC = 0;
            SUSPEND;
            END
        END
    if (BIN_AND(TIPO, 16) <> 0) then
        BEGIN
        TIPODOC = 35;
        FOR SELECT C.PREF_PRE, COTI_NUMERO, COTI_FECHA, D.ARTI_COD, CTDE_CANT * CTDE_FACTOR, (CTDE_TOTAL-CTDE_IVAMONTO-CTDE_CONSUMO)*COTI_FACTOR, CTDE_IVAMONTO*COTI_FACTOR, CTDE_CONSUMO,
            ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD 
            FROM COTIZACIONES C, COTIZACIONES_DETALLE D, PREFIJOS P, ARTICULO A
            WHERE C.COTI_ID = D.COTI_ID AND P.PREF_PRE = C.PREF_PRE AND P.TIDO_COD = 35 AND D.ARTI_COD = A.arti_cod AND
                A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
                A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND COTI_FECHA >= :FECINI AND COTI_FECHA <= :FECFIN AND
                (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
                COTI_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            ORDER BY D.ARTI_COD, COTI_FECHA, C.COTI_ID, CTDE_ITEM
            INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,
                :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
            DO
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            EXECUTE PROCEDURE costo_promedio (:ARTICULO, :FECHA) RETURNING_VALUES (:COSTOUNIT);
            COSTO = COSTOUNIT * CANTIDAD;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                if (COSTO > 0) then
                    PORC = UTILIDAD * 100 / COSTO;
                ELSE
                    PORC = 100;
            else
                if (BASE > 0) then
                    PORC = UTILIDAD * 100 / BASE;
                ELSE
                    PORC = 0;
            SUSPEND;
            END
        END
    END
END

^

SET TERM ; ^

SET TERM ^ ;

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

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE REVISA_PRECIOS(
    LISTA INTEGER,
    FECHA DATE)
RETURNS (
    ARTICULO VARCHAR(20),
    DESCR VARCHAR(60),
    FIJO NUMERIC(18,2),
    UNIDAD VARCHAR(8),
    PORC NUMERIC(9,4),
    SUGERIDO NUMERIC(18,2),
    DIFER NUMERIC(18,2),
    NUEVO NUMERIC(18,2),
    OK CHAR(1))
AS
declare variable marg numeric(9,4);
declare variable UOM VARCHAR(10);
declare variable BASE VARCHAR(10);
declare variable CAMBIO VARCHAR(10);
declare variable COSTO numeric(18,2);
declare variable COSTOP numeric(18,2);
declare variable COSTOU numeric(18,2);
declare variable DIFMAX numeric(18,2);
declare variable DIG INTEGER;
declare variable TARIVA NUMERIC(9,4);
declare variable IVAINC CHAR(1);
declare variable LISTAREF INTEGER;
begin
execute procedure lee_configuracion ('FACTURACION', 'ARTICULOS', 'SUGERIR PRECIOS CON PORCENTAJE DE MARGEN O UTILIDAD') returning_values (:UOM);
EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION', 'ARTICULOS', 'REDONDEO AL MULTIPLO DE DIEZ EN PRECIOS') RETURNING_VALUES (:DIG);
EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION','ARTICULOS','CAMBIO DE PRECIOS AUTOMATICO AL CAMBIAR COSTO O PRECIO') returning_values (CAMBIO);
EXECUTE PROCEDURE lee_configuracion('FACTURACION','ARTICULOS','COSTO BASE PARA CALCULO DE PRECIOS DE VENTA AUTOMATICOS') returning_values (:BASE);
EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION','ARTICULOS','CODIGO DE LA LISTA DE PRECIOS BASE PARA CAMBIO DE PRECIOS AUTOMATICO') returning_values (LISTAREF);
EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION','ARTICULOS','DIFERENCIA EN PESOS MAXIMA A PERMITIR PARA CAMBIAR PRECIOS') returning_values (DIFMAX);
for select A.arti_cod, A.arti_des, A.arti_unidad, prar_fijo, prar_margen, prar_util, TAIV_PORC
    from precios_articulo p, articulo a, tarifa_iva T
    where a.arti_cod = p.arti_cod and lipr_cod = :lista and a.taiv_cod = t.taiv_cod order by A.arti_cod
    into :articulo, descr, :unidad, :fijo, :marg, :porc, :tariva
    do
    begin
    if (UOM <> 'UTILIDAD') then
        PORC = MARG;
    if (CAMBIO = 'COSTO') then
        BEGIN
        EXECUTE PROCEDURE COSTO_PROMEDIO (:ARTICULO, :FECHA) RETURNING_VALUES(:COSTOP);
        EXECUTE PROCEDURE ULTIMO_COSTO (:ARTICULO, :FECHA, :UNIDAD) RETURNING_VALUES(:COSTOU);
        if (base = 'ULTIMO') then
            COSTO = COSTOU;
        ELSE
            BEGIN
            COSTO = COSTOP;
            if (base = 'MAYOR') then
                if (COSTOP < COSTOU) then
                    COSTO = COSTOU;
            END
        SELECT LIPR_MODIF FROM LISTA_PRECIOS WHERE LIPR_COD = :lista INTO :IVAINC;
        if (IVAINC = 'S') then
            COSTO = COSTO * (1 + TARIVA/100);
        if (UOM = 'UTILIDAD') then
            SUGERIDO = COSTO * (1 + :PORC/100);
        ELSE
            SUGERIDO = COSTO / (1 - :PORC/100);
        END
    ELSE
        if (LISTA <> LISTAREF) then
            BEGIN
            SELECT PRAR_FIJO FROM PRECIOS_ARTICULO WHERE ARTI_COD = :articulo AND LIPR_COD = :LISTAREF INTO :SUGERIDO;
            if (IVAINC = 'S') then
                SUGERIDO = SUGERIDO / (1 + TARIVA/100);
            if (UOM = 'UTILIDAD') then
                SUGERIDO = SUGERIDO * (1 + :PORC/100);
            ELSE
                SUGERIDO = SUGERIDO / (1 - :PORC/100);
            END
    EXECUTE PROCEDURE REDONDEE (SUGERIDO, DIG) returning_values (SUGERIDO);
    DIFER = SUGERIDO - FIJO;
    NUEVO = SUGERIDO;
    OK = 'S';
    if ((DIFER > DIFMAX) and (sugerido <> 0)) then
        suspend;
    end
end

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE UTILIDAD_VENTAS(
    TIPO INTEGER,
    DETALLE CHAR(1),
    FECINI DATE,
    FECFIN DATE,
    PREFIJO VARCHAR(4),
    SUBEMPRESA INTEGER)
RETURNS (
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    PTVTID INTEGER,
    VENDCOD INTEGER,
    NIT VARCHAR(20),
    NOMTERCERO VARCHAR(60),
    ARTICULO VARCHAR(15),
    ARTIDES VARCHAR(60),
    CANT NUMERIC(18,4),
    UNIDAD VARCHAR(8),
    PRECIO NUMERIC(18,2),
    COSTO NUMERIC(18,2),
    UTILIDAD NUMERIC(18,2),
    PORC NUMERIC(9,2))
AS
declare variable IMPTOS CHAR(1);
declare variable ID INTEGER;
declare variable IVA NUMERIC(18,2);
declare variable COSTOT NUMERIC(18,2);
declare variable PRECIOT NUMERIC(18,2);
declare variable UOM VARCHAR(20);
BEGIN
EXECUTE PROCEDURE lee_configuracion ('FACTURACION', 'ARTICULOS', 'SUGERIR PRECIOS CON PORCENTAJE DE MARGEN O UTILIDAD') returning_values (:UOM);
/* DETERMINE LA TABLA A EXAMINAR */
if (TIPO = 31) then
    BEGIN
    /* FACTURA */
    FOR SELECT FACT_ID, F.PREF_PRE, FACT_NUMERO, FACT_FECHA, PTVT_ID, VEND_COD, TERC_NIT, FACT_NOMCLIENTE, FACT_IVAINC
        FROM FACTURAS F, PREFIJOS P
        WHERE FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND FACT_ANULADO = 'N'
         AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = :TIPO AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
        ORDER BY FACT_FECHA, F.PREF_PRE, FACT_NUMERO
        INTO :ID, :PREF, :NUMERO, :FECHA, :PTVTID, :VENDCOD, :NIT, :NOMTERCERO, :IMPTOS
        DO
        if ((PREFIJO = '') or (PREFIJO = PREF)) then
          BEGIN
          COSTOT = 0;
          PRECIOT = 0;
          FOR SELECT ARTI_COD, SUBSTR(FADE_DESC,1,60), FADE_CANT * FADE_FACTOR, FADE_UNIDAD, (FADE_PRUNIT - FADE_DTOMONTO) / FADE_FACTOR, FADE_IVAMONTO
            FROM FACTURAS_DETALLE
            WHERE FACT_ID = :ID
            INTO :ARTICULO, :ARTIDES, :CANT, :UNIDAD, :PRECIO, :IVA
            DO
                BEGIN
                EXECUTE PROCEDURE COSTO_PROMEDIO(:ARTICULO, :FECHA) returning_values (:COSTO);
                COSTO = COSTO * CANT;
                PRECIO = PRECIO * CANT;
                if (IMPTOS = 'S') then
                    PRECIO = PRECIO - IVA;
                UTILIDAD = PRECIO - COSTO;
                if (DETALLE = 'S') then
                    BEGIN
                    if (UOM = 'UTILIDAD') then
                        EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                    else
                        EXECUTE PROCEDURE PORCENTAJE (utilidad,  PRECIO, 'S') returning_values (PORC);
                    SUSPEND;
                    END
                ELSE
                    BEGIN
                    COSTOT = COSTOT + COSTO;
                    PRECIOT = PRECIOT + PRECIO;
                    END
                END
          if (DETALLE <> 'S') then
            BEGIN
            COSTO = COSTOT;
            PRECIO = PRECIOT;
            UTILIDAD = PRECIO - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  PRECIO, 'S') returning_values (PORC);
            SUSPEND;
            END
          END
    END
  if (TIPO = 32) then
    BEGIN
    /* REMISION */
    FOR SELECT REVT_ID, R.PREF_PRE, REVT_NUMERO, REVT_FECHA, PTVT_ID, VEND_COD, TERC_NIT, REVT_NOMTERC, REVT_IVAINC
        FROM REMISIONES_VENTA R, PREFIJOS P
        WHERE REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN AND REVT_ANULADO = 'N'
         AND P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = :TIPO AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
        ORDER BY REVT_FECHA, R.PREF_PRE, REVT_NUMERO
        INTO :ID, :PREF, :NUMERO, :FECHA, :PTVTID, :VENDCOD, :NIT, :NOMTERCERO, :IMPTOS
        DO
        if ((PREFIJO = '') or (PREFIJO = PREF)) then
          BEGIN
          COSTOT = 0;
          PRECIOT = 0;
          FOR SELECT ARTI_COD, SUBSTR(RVDE_DESC,1,60), RVDE_CANT * RVDE_FACTOR, RVDE_UNIDAD, (RVDE_PRUNIT - RVDE_DTOMONTO) / RVDE_FACTOR, RVDE_IVAMONTO
            FROM REMISIONES_VENTA_DETALLE
            WHERE REVT_ID = :ID
            INTO :ARTICULO, :ARTIDES, :CANT, :UNIDAD, :PRECIO, :IVA
            DO
                BEGIN
                EXECUTE PROCEDURE COSTO_PROMEDIO(:ARTICULO, :FECHA) returning_values (:COSTO);
                COSTO = COSTO * CANT;
                PRECIO = PRECIO * CANT;
                if (IMPTOS = 'S') then
                    PRECIO = PRECIO - IVA;
                UTILIDAD = PRECIO - COSTO;
                if (DETALLE = 'S') then
                    BEGIN
                    if (UOM = 'UTILIDAD') then
                        EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                    else
                        EXECUTE PROCEDURE PORCENTAJE (utilidad,  PRECIO, 'S') returning_values (PORC);
                    SUSPEND;
                    END
                ELSE
                    BEGIN
                    COSTOT = COSTOT + COSTO;
                    PRECIOT = PRECIOT + PRECIO;
                    END
                END
          if (DETALLE <> 'S') then
            BEGIN
            COSTO = COSTOT;
            PRECIO = PRECIOT;
            UTILIDAD = PRECIO - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  PRECIO, 'S') returning_values (PORC);
            SUSPEND;
            END
          END
    END
  if (TIPO = 33) then
    BEGIN
    /* DEVOLUCION */
    FOR SELECT DEVT_ID, D.PREF_PRE, DEVT_NUMERO, DEVT_FECHA, PTVT_ID, VEND_COD, TERC_NIT, DEVT_NOMTERC, DEVT_IVAINC
        FROM DEVOLUCIONES_VENTAS D, PREFIJOS P
        WHERE DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND DEVT_ANULADO = 'N'
         AND P.PREF_PRE = D.PREF_PRE AND P.TIDO_COD = :TIPO AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
        ORDER BY DEVT_FECHA, D.PREF_PRE, DEVT_NUMERO
        INTO :ID, :PREF, :NUMERO, :FECHA, :PTVTID, :VENDCOD, :NIT, :NOMTERCERO, :IMPTOS
        DO
        if ((PREFIJO = '') or (PREFIJO = PREF)) then
          BEGIN
          COSTOT = 0;
          PRECIOT = 0;
          FOR SELECT ARTI_COD, SUBSTR(DVDE_DESC,1,60), DVDE_CANT * DVDE_FACTOR, DVDE_UNIDAD, (DVDE_PRUNIT - DVDE_DTOMONTO) / DVDE_FACTOR, DVDE_IVAMONTO
            FROM DEVOLUCIONES_VENTAS_DETALLE
            WHERE DEVT_ID = :ID
            INTO :ARTICULO, :ARTIDES, :CANT, :UNIDAD, :PRECIO, :IVA
            DO
                BEGIN
                EXECUTE PROCEDURE COSTO_PROMEDIO(:ARTICULO, :FECHA) returning_values (:COSTO);
                COSTO = COSTO * CANT;
                PRECIO = PRECIO * CANT;
                if (IMPTOS = 'S') then
                    PRECIO = PRECIO - IVA;
                UTILIDAD = PRECIO - COSTO;
                if (DETALLE = 'S') then
                    BEGIN
                    if (UOM = 'UTILIDAD') then
                        EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                    else
                        EXECUTE PROCEDURE PORCENTAJE (utilidad,  PRECIO, 'S') returning_values (PORC);
                    SUSPEND;
                    END
                ELSE
                    BEGIN
                    COSTOT = COSTOT + COSTO;
                    PRECIOT = PRECIOT + PRECIO;
                    END
                END
        if (DETALLE <> 'S') then
            BEGIN
            COSTO = COSTOT;
            PRECIO = PRECIOT;
            UTILIDAD = PRECIO - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  PRECIO, 'S') returning_values (PORC);
            SUSPEND;
            END
        END
    END
  if (TIPO = 34) then
    BEGIN
    /* PEDIDO */
    FOR SELECT PEDI_ID, P.PREF_PRE, PEDI_NUMERO, PEDI_FECHA, PTVT_ID, VEND_COD, TERC_NIT, PEDI_NOMTERC, PEDI_IVAINC
        FROM PEDIDOS P, PREFIJOS R
        WHERE PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND PEDI_ANULADO = 'N'
         AND P.PREF_PRE = R.PREF_PRE AND R.TIDO_COD = :TIPO AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
        ORDER BY PEDI_FECHA, P.PREF_PRE, PEDI_NUMERO
        INTO :ID, :PREF, :NUMERO, :FECHA, :PTVTID, :VENDCOD, :NIT, :NOMTERCERO, :IMPTOS
        DO
        if ((PREFIJO = '') or (PREFIJO = PREF)) then
          BEGIN
          COSTOT = 0;
          PRECIOT = 0;
          FOR SELECT ARTI_COD, SUBSTR(PEDE_DESC,1,60), PEDE_CANT * PEDE_FACTOR, PEDE_UNIDAD, (PEDE_PRUNIT - PEDE_DTOMONTO) / PEDE_FACTOR, PEDE_IVAMONTO
            FROM PEDIDOS_DETALLE
            WHERE PEDI_ID = :ID
            INTO :ARTICULO, :ARTIDES, :CANT, :UNIDAD, :PRECIO, :IVA
            DO
                BEGIN
                EXECUTE PROCEDURE COSTO_PROMEDIO(:ARTICULO, :FECHA) returning_values (:COSTO);
                COSTO = COSTO * CANT;
                PRECIO = PRECIO * CANT;
                if (IMPTOS = 'S') then
                    PRECIO = PRECIO - IVA;
                UTILIDAD = PRECIO - COSTO;
                if (DETALLE = 'S') then
                    BEGIN
                    if (UOM = 'UTILIDAD') then
                        EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                    else
                        EXECUTE PROCEDURE PORCENTAJE (utilidad,  PRECIO, 'S') returning_values (PORC);
                    SUSPEND;
                    END
                ELSE
                    BEGIN
                    COSTOT = COSTOT + COSTO;
                    PRECIOT = PRECIOT + PRECIO;
                    END
                END
        if (DETALLE <> 'S') then
            BEGIN
            COSTO = COSTOT;
            PRECIO = PRECIOT;
            UTILIDAD = PRECIO - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  PRECIO, 'S') returning_values (PORC);
            SUSPEND;
            END
        END
    END
  if (TIPO = 35) then
    BEGIN
    /* COTIZACION */
    FOR SELECT COTI_ID, C.PREF_PRE, COTI_NUMERO, COTI_FECHA, PTVT_ID, VEND_COD, TERC_NIT, COTI_NOMTERC, COTI_IMPTOS
        FROM COTIZACIONES C, PREFIJOS P
        WHERE COTI_FECHA >= :FECINI AND COTI_FECHA <= :FECFIN AND COTI_ANULADO = 'N'
         AND P.PREF_PRE = C.PREF_PRE AND P.TIDO_COD = :TIPO AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
        ORDER BY COTI_FECHA, C.PREF_PRE, COTI_NUMERO
        INTO :ID, :PREF, :NUMERO, :FECHA, :PTVTID, :VENDCOD, :NIT, :NOMTERCERO, :IMPTOS
        DO
        if ((PREFIJO = '') or (PREFIJO = PREF)) then
          BEGIN
          COSTOT = 0;
          PRECIOT = 0;
          FOR SELECT ARTI_COD, SUBSTR(CTDE_DESC,1,60), CTDE_CANT * CTDE_FACTOR, CTDE_UNIDAD, (CTDE_PRUNIT - CTDE_DTOMONTO) / CTDE_FACTOR, CTDE_IVAMONTO
            FROM COTIZACIONES_DETALLE
            WHERE COTI_ID = :ID
            INTO :ARTICULO, :ARTIDES, :CANT, :UNIDAD, :PRECIO, :IVA
            DO
                BEGIN
                EXECUTE PROCEDURE COSTO_PROMEDIO(:ARTICULO, :FECHA) returning_values (:COSTO);
                COSTO = COSTO * CANT;
                PRECIO = PRECIO * CANT;
                if (IMPTOS = 'S') then
                    PRECIO = PRECIO - IVA;
                UTILIDAD = PRECIO - COSTO;
                if (DETALLE = 'S') then
                    BEGIN
                    if (UOM = 'UTILIDAD') then
                        EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                    else
                        EXECUTE PROCEDURE PORCENTAJE (utilidad,  PRECIO, 'S') returning_values (PORC);
                    SUSPEND;
                    END
                ELSE
                    BEGIN
                    COSTOT = COSTOT + COSTO;
                    PRECIOT = PRECIOT + PRECIO;
                    END
                END
        if (DETALLE <> 'S') then
            BEGIN
            COSTO = COSTOT;
            PRECIO = PRECIOT;
            UTILIDAD = PRECIO - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  PRECIO, 'S') returning_values (PORC);
            SUSPEND;
            END
        END
    END
END

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE CHEQUEO_COSTOS(
    ARTICULO VARCHAR(20),
    FECHA DATE)
AS
declare variable NUMROWS INTEGER;
DECLARE VARIABLE ID INTEGER;
DECLARE VARIABLE FECMV DATE;
DECLARE VARIABLE CANT NUMERIC(15,4);
DECLARE VARIABLE COSTO NUMERIC(18,2);
DECLARE VARIABLE ENTRADA CHAR(1);
DECLARE VARIABLE TIPO INTEGER;
begin
SELECT COUNT(*) FROM COSTOS WHERE ARTI_COD = :ARTICULO AND COST_FECHA > :FECHA INTO :NUMROWS;
if (NUMROWS > 0) then
    BEGIN
    delete from costos where arti_cod = :ARTICULO AND COST_FECHA > :FECHA;
    for select mvar_cons, mvar_fecha, mvar_cant, mvar_costo, mvar_entrada, mvar_tipodoc
        from movimiento_articulo WHERE ARTI_COD = :ARTICULO AND MVAR_FECHA > :FECHA
        order by mvar_fecha, mvar_cons /* SE HACE ESTRICTAMENTE EN ORDEN DE FECHA Y REGISTRO, SI LO EDITAN CAMBIA EL ORDEN */
        into :id, :fecmv, :cant, :costo, :entrada, :tipo
        do
        if ((TIPO <> 13)) then
            EXECUTE PROCEDURE actualice_costo(:ARTICULO, :fecmv, :costo, :cant, :entrada, 'N', :id, :tipo);
    END
end

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE CHEQUEO_INVENTARIO(
    ARTINI VARCHAR(20),
    ARTFIN VARCHAR(20))
AS
DECLARE VARIABLE FECHA DATE;
DECLARE VARIABLE CANT NUMERIC(15,4);
DECLARE VARIABLE COSTO NUMERIC(18,2);
DECLARE VARIABLE ENTRADA CHAR(1);
DECLARE VARIABLE BODEGA CHAR(2);
DECLARE VARIABLE ID INTEGER;
DECLARE VARIABLE TIPO INTEGER;
declare variable TIPOEX CHAR(1);
DECLARE VARIABLE LOTE VARCHAR(20);
DECLARE VARIABLE EXISTE CHAR(1);
declare variable ARTICULO VARCHAR(20);
declare variable IDL INTEGER;
BEGIN
for select arti_cod from articulo where arti_cod >= :artini and arti_cod <= :artfin into :ARTICULO
  DO
  BEGIN
  DELETE FROM existencia_lote where arti_cod = :articulo;
  DELETE FROM lotes where arti_cod = :articulo;
  delete from costos where arti_cod = :ARTICULO;
  delete from existencia WHERE ARTI_COD = :ARTICULO;
  for select mvar_cons, mvar_fecha, mvar_cant, mvar_costo, mvar_entrada, bode_cod, mvar_tipodoc, mvar_lote
    from movimiento_articulo WHERE ARTI_COD = :ARTICULO
    order by mvar_fecha, mvar_cons
    into :id, :fecha, :cant, :costo, :entrada, :bodega, :tipo, :lote
  do
    begin
    SELECT ARTI_EXIST
        FROM   ARTICULO
        WHERE  ARTICULO.ARTI_COD = :ARTICULO
        INTO :TIPOEX;
    if ((TIPO <> 13)) then
        EXECUTE PROCEDURE actualice_costo(:ARTICULO, :fecha, :costo, :cant, :entrada, 'N', :id, :tipo);
    /* actualice existencias */
    if (:entrada = 'S') then
        begin
        execute procedure sume_existencia(:articulo, :bodega, :fecha, :cant, 'N');
        if (TIPOEX = 'L') then
            begin
            EXISTE = 'N';
            SELECT 'S' FROM LOTES WHERE ARTI_COD = :ARTICULO AND BODE_COD = :BODEGA AND LOTE_NRO = :lote INTO :EXISTE;
            if (EXISTE = 'S') then
                UPDATE LOTES
                    set lote_saldo = lote_saldo + :cant
                    where (arti_cod = :ARTICULO) and (BODE_COD = :BODEGA) AND (lote_nro = :lote);
            ELSE
                INSERT INTO LOTES (ARTI_COD, BODE_COD, LOTE_NRO, LOTE_FECHA, LOTE_CANT, LOTE_COSTO, LOTE_SALDO)
                    VALUES (:ARTICULO, :bodega, :lote, :fecha, :cant, :costo, :cant);
            end
        end
    else
        begin
        execute procedure reste_existencia(:articulo, :bodega, :fecha, :cant, 'N');
        if (TIPOEX = 'L') then
            begin
            EXISTE = 'N';
            SELECT 'S' FROM LOTES WHERE ARTI_COD = :ARTICULO AND BODE_COD = :BODEGA AND LOTE_NRO = :lote INTO :EXISTE;
            if (EXISTE = 'S') then
                UPDATE LOTES
                    set lote_saldo = lote_saldo - :cant
                    where (arti_cod = :ARTICULO) AND (BODE_COD = :BODEGA) and (lote_nro = :lote);
            ELSE
                BEGIN
                /* ARREGLE EL LOTE YA QUE NO EXISTE */
                SELECT MIN(LOTE_ID) FROM LOTES WHERE ARTI_COD = :articulo AND BODE_COD = :BODEGA AND LOTE_CANT >= :cant INTO :IDL;
                SELECT LOTE_NRO FROM LOTES WHERE LOTE_ID = :IDL INTO :LOTE;
                UPDATE MOVIMIENTO_ARTICULO SET MVAR_LOTE = :LOTE WHERE MVAR_CONS = :ID;
                UPDATE LOTES
                    set lote_saldo = lote_saldo - :cant
                    where (arti_cod = :ARTICULO) and (BODE_COD = :BODEGA) AND (lote_nro = :lote);
                END
            EXISTE = 'N';
            SELECT 'S' FROM EXISTENCIA_LOTE
                WHERE LOTE_NRO = :LOTE AND EXLO_FECHA = :FECHA AND ARTI_COD = :ARTICULO AND BODE_COD = :bodega
                INTO :EXISTE;
            if (EXISTE = 'S') then
                UPDATE EXISTENCIA_LOTE
                       SET EXLO_SAL = EXLO_SAL + :cant
                    WHERE LOTE_NRO = :LOTE AND EXLO_FECHA = :FECHA AND ARTI_COD = :ARTICULO AND BODE_COD = :bodega;
            else
                INSERT INTO EXISTENCIA_LOTE (ARTI_COD, BODE_COD, LOTE_NRO, EXLO_FECHA, EXLO_SAL)
                    VALUES (:ARTICULO, :BODEGA, :LOTE, :FECHA, :CANT);
            end
        end
    END
  END
END

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE CAMBIO_PRECIOS(
    FECHA DATE)
AS
declare variable ART VARCHAR(20);
BEGIN
FOR SELECT ARTI_COD FROM ARTICULO INTO :ART DO
    EXECUTE PROCEDURE CALCULA_PRECIOS(:ART, :FECHA);
  SUSPEND;
END

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE CONTABILICE_COSTO_VENTAS(
    ID INTEGER,
    IDINTER INTEGER)
RETURNS (
    IDC INTEGER)
AS
declare variable PREF VARCHAR(4);
declare variable NUM VARCHAR(6);
declare variable NUMERO VARCHAR(10);
declare variable INVEN CHAR(1);
declare variable CTAINVEN VARCHAR(20);
declare variable COSTOS CHAR(1);
declare variable CTACOSTOS VARCHAR(20);
declare variable EXISTE CHAR(1);
declare variable CUENTA VARCHAR(20);
declare variable MONTO NUMERIC(18,2);
declare variable TIPOCUEN CHAR(1);
declare variable NIT VARCHAR(20);
declare variable PROY VARCHAR(4);
declare variable CENTRO VARCHAR(4);
declare variable ART VARCHAR(15);
declare variable ANULADO CHAR(1);
declare variable NROI INTEGER;
declare variable NUMROWS INTEGER;
declare variable CONC CHAR(120);
declare variable VENCEAUX DATE;
declare variable VENCE CHAR(8);
begin
/* TRAIGA EL ID DEL ENCABEZADO DEL COMPROBANTE CONTABLE */
SELECT ENCO_CONSEC FROM COMPROBANTE_ENCABEZADO WHERE ENCO_TIPOREF = 31 AND ENCO_IDREF = :ID INTO :IDC;
SELECT MAX(CODE_ITEM) FROM COMPROBANTE_DETALLE WHERE ENCO_CONSEC = :idc INTO :NROI;
NROI = NROI + 1;
/* EJECUTE LA PARTE DE CONTABIL_FACTURA QUE CORRESPONDE A LOS COSTOS */
EXISTE = 'N';
SELECT 'S', INVE_COSTO, INVE_INVEN, INVE_CTAINVEN, INVE_CTACOSTOS
    FROM INTERFAZ_VENTAS
    WHERE INVE_ID = :IDINTER
    INTO :EXISTE, :COSTOS, :INVEN, :CTAINVEN, :CTACOSTOS;
if (EXISTE = 'S') then
  BEGIN
  SELECT FACT_ANULADO, PREF_PRE, FACT_NUMERO, FACT_VENCE, TERC_NIT FROM FACTURAS F
        WHERE FACT_ID = :ID INTO :ANULADO, :PREF, :NUMERO, :VENCEAUX, :NIT;
  NUMERO = PREF || NUM;
  CONC = 'COSTO EN VENTAS FACTURA ' || :NUMERO;
  EXECUTE PROCEDURE FECHA_A_CONTA(:VENCEAUX) returning_values (:VENCE);
  if (ANULADO = 'N') then
    BEGIN
    SELECT BODE_CENTRO, BODE_PROY FROM BODEGA B, FACTURAS F, PUNTO_VENTA P
        WHERE B.BODE_COD = P.BODE_COD AND P.PTVT_ID = F.PTVT_ID AND F.FACT_ID = :ID INTO :CENTRO, :PROY;
    /* SE ASUME QUE NO HAN CAMBIADO LAS CUENTAS DE COSTOS, POR ESO SE HACE UPDATE A LOS MOVIMIENTOS DE ESAS CUENTAS */
    EXECUTE PROCEDURE COSTO_EN_VENTAS(31, :ID);
    if (COSTOS = 'A') then
        BEGIN
        FOR SELECT MAX(CTACOS), SUM(CANT * COSTO)
            FROM COSTO_VENTAS
            GROUP BY CTACOS
            INTO :CTACOSTOS, :MONTO
        DO
            BEGIN
            if (MONTO <> 0) then
                BEGIN
                CUENTA = NULL;
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :CTACOSTOS INTO :CUENTA, :TIPOCUEN;
                IF (CUENTA IS NULL) THEN
                    begin
                    EXCEPTION CUENTA_NO_EXISTE 'La cuenta ' || :ctacostos || ' no existe.';
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT ARTI_COD, CANT * COSTO
                        FROM COSTO_VENTAS
                        WHERE CTACOS = :CUENTA
                        INTO :ART, :MONTO
                    DO
                        BEGIN
                        SELECT COUNT(*) FROM COMPROBANTE_DETALLE WHERE CUEN_COD = :CUENTA AND ENCO_CONSEC = :IDC AND ARTI_COD = :ART INTO :NUMROWS;
                        if (NUMROWS = 0) then
                            BEGIN
                            INSERT INTO comprobante_detalle (ENCO_CONSEC, CODE_ITEM, CUEN_COD, CODE_CONCEPTO, CODE_REFER, CODE_DEBITO, CODE_CREDITO, CODE_BASE, CODE_PORC, TERC_NIT, PROY_COD, CENT_COD, CNDE_DOCNUMERO, CNDE_DOCAPLICA, DOCO_VENCE, ARTI_COD, CODE_TIPOAPL, CODE_TIPONUE)
                                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                            NROI = NROI + 1;
                            END
                        ELSE
                            UPDATE COMPROBANTE_DETALLE
                                SET CODE_DEBITO = :MONTO
                            WHERE CUEN_COD = :CUENTA AND ENCO_CONSEC = :IDC AND ARTI_COD = :ART;
                        END
                    END
                ELSE
                    BEGIN
                    SELECT COUNT(*) FROM COMPROBANTE_DETALLE WHERE CUEN_COD = :CUENTA AND ENCO_CONSEC = :IDC INTO :NUMROWS;
                    if (NUMROWS = 0) then
                        BEGIN
                        if (TIPOCUEN = 'C') then
                            INSERT INTO comprobante_detalle (ENCO_CONSEC, CODE_ITEM, CUEN_COD, CODE_CONCEPTO, CODE_REFER, CODE_DEBITO, CODE_CREDITO, CODE_BASE, CODE_PORC, TERC_NIT, PROY_COD, CENT_COD, CNDE_DOCNUMERO, CNDE_DOCAPLICA, DOCO_VENCE, ARTI_COD, CODE_TIPOAPL, CODE_TIPONUE)
                                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                        ELSE
                            INSERT INTO comprobante_detalle (ENCO_CONSEC, CODE_ITEM, CUEN_COD, CODE_CONCEPTO, CODE_REFER, CODE_DEBITO, CODE_CREDITO, CODE_BASE, CODE_PORC, TERC_NIT, PROY_COD, CENT_COD, CNDE_DOCNUMERO, CNDE_DOCAPLICA, DOCO_VENCE, ARTI_COD, CODE_TIPOAPL, CODE_TIPONUE)
                                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NROI = NROI + 1;
                        END
                    ELSE
                        UPDATE COMPROBANTE_DETALLE
                            SET CODE_DEBITO = :MONTO
                        WHERE CUEN_COD = :CUENTA AND ENCO_CONSEC = :IDC;
                    END
                END /* MONTO <> 0 */
            END /* FOR */
        END /* COSTOS */
    if (COSTOS = 'K') then
        BEGIN
        SELECT SUM(CANT * COSTO)
            FROM COSTO_VENTAS
            INTO :MONTO;
        if (MONTO <> 0) then
            BEGIN
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTACOSTOS INTO :CUENTA, :TIPOCUEN;
            IF (CUENTA IS NULL) THEN
                begin
                EXCEPTION CUENTA_NO_EXISTE 'La cuenta ' || :ctacostos || ' no existe.';
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, REGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT ARTI_COD, CANT * COSTO
                    FROM COSTO_VENTAS
                    INTO :ART, :MONTO
                DO
                    BEGIN
                    SELECT COUNT(*) FROM COMPROBANTE_DETALLE WHERE CUEN_COD = :CUENTA AND ENCO_CONSEC = :IDC AND ARTI_COD = :ART INTO :NUMROWS;
                    if (NUMROWS = 0) then
                        BEGIN
                            INSERT INTO comprobante_detalle (ENCO_CONSEC, CODE_ITEM, CUEN_COD, CODE_CONCEPTO, CODE_REFER, CODE_DEBITO, CODE_CREDITO, CODE_BASE, CODE_PORC, TERC_NIT, PROY_COD, CENT_COD, CNDE_DOCNUMERO, CNDE_DOCAPLICA, DOCO_VENCE, ARTI_COD, CODE_TIPOAPL, CODE_TIPONUE)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        END
                    ELSE
                        UPDATE COMPROBANTE_DETALLE
                            SET CODE_DEBITO = :MONTO
                        WHERE CUEN_COD = :CUENTA AND ENCO_CONSEC = :IDC AND ARTI_COD = :ART;
                    END
                END
            ELSE
                BEGIN
                SELECT COUNT(*) FROM COMPROBANTE_DETALLE WHERE CUEN_COD = :CUENTA AND ENCO_CONSEC = :IDC INTO :NUMROWS;
                if (NUMROWS = 0) then
                    BEGIN
                    if (TIPOCUEN = 'C') then
                        INSERT INTO comprobante_detalle (ENCO_CONSEC, CODE_ITEM, CUEN_COD, CODE_CONCEPTO, CODE_REFER, CODE_DEBITO, CODE_CREDITO, CODE_BASE, CODE_PORC, TERC_NIT, PROY_COD, CENT_COD, CNDE_DOCNUMERO, CNDE_DOCAPLICA, DOCO_VENCE, ARTI_COD, CODE_TIPOAPL, CODE_TIPONUE)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    ELSE
                        INSERT INTO comprobante_detalle (ENCO_CONSEC, CODE_ITEM, CUEN_COD, CODE_CONCEPTO, CODE_REFER, CODE_DEBITO, CODE_CREDITO, CODE_BASE, CODE_PORC, TERC_NIT, PROY_COD, CENT_COD, CNDE_DOCNUMERO, CNDE_DOCAPLICA, DOCO_VENCE, ARTI_COD, CODE_TIPOAPL, CODE_TIPONUE)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    END
                ELSE
                    UPDATE COMPROBANTE_DETALLE
                        SET CODE_DEBITO = :MONTO
                    WHERE CUEN_COD = :CUENTA AND ENCO_CONSEC = :IDC;
                END
            END /* MONTO <> 0 */
        END /* COSTOS = K */
    if (INVEN = 'A') then
        BEGIN
        FOR SELECT MAX(CTAINV), SUM(CANT * COSTO)
            FROM COSTO_VENTAS
            GROUP BY CTAINV
            INTO :CTAINVEN, :MONTO
        DO
            BEGIN
            if (MONTO <> 0) then
                BEGIN
                CUENTA = NULL;
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :CTAINVEN INTO :CUENTA, :TIPOCUEN;
                IF (CUENTA IS NULL) THEN
                    begin
                    EXCEPTION CUENTA_NO_EXISTE 'La cuenta ' || :ctainven || ' no existe.';
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, REGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT ARTI_COD, CANT * COSTO
                        FROM COSTO_VENTAS
                        WHERE CTAINV = :CUENTA
                        INTO :ART, :MONTO
                    DO
                        BEGIN
                        SELECT COUNT(*) FROM COMPROBANTE_DETALLE WHERE CUEN_COD = :CUENTA AND ENCO_CONSEC = :IDC AND ARTI_COD = :ART INTO :NUMROWS;
                        if (NUMROWS = 0) then
                            BEGIN
                            INSERT INTO comprobante_detalle (ENCO_CONSEC, CODE_ITEM, CUEN_COD, CODE_CONCEPTO, CODE_REFER, CODE_DEBITO, CODE_CREDITO, CODE_BASE, CODE_PORC, TERC_NIT, PROY_COD, CENT_COD, CNDE_DOCNUMERO, CNDE_DOCAPLICA, DOCO_VENCE, ARTI_COD, CODE_TIPOAPL, CODE_TIPONUE)
                                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                            NROI = NROI + 1;
                            END
                        ELSE
                            UPDATE COMPROBANTE_DETALLE
                                SET CODE_CREDITO = :MONTO
                            WHERE CUEN_COD = :CUENTA AND ENCO_CONSEC = :IDC AND ARTI_COD = :ART;
                        END
                    END
                ELSE
                    BEGIN
                    SELECT COUNT(*) FROM COMPROBANTE_DETALLE WHERE CUEN_COD = :CUENTA AND ENCO_CONSEC = :IDC INTO :NUMROWS;
                    if (NUMROWS = 0) then
                        BEGIN
                        if (TIPOCUEN = 'C') then
                            INSERT INTO comprobante_detalle (ENCO_CONSEC, CODE_ITEM, CUEN_COD, CODE_CONCEPTO, CODE_REFER, CODE_DEBITO, CODE_CREDITO, CODE_BASE, CODE_PORC, TERC_NIT, PROY_COD, CENT_COD, CNDE_DOCNUMERO, CNDE_DOCAPLICA, DOCO_VENCE, ARTI_COD, CODE_TIPOAPL, CODE_TIPONUE)
                                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                        ELSE
                            INSERT INTO comprobante_detalle (ENCO_CONSEC, CODE_ITEM, CUEN_COD, CODE_CONCEPTO, CODE_REFER, CODE_DEBITO, CODE_CREDITO, CODE_BASE, CODE_PORC, TERC_NIT, PROY_COD, CENT_COD, CNDE_DOCNUMERO, CNDE_DOCAPLICA, DOCO_VENCE, ARTI_COD, CODE_TIPOAPL, CODE_TIPONUE)
                                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NROI = NROI + 1;
                        END
                    ELSE
                        UPDATE COMPROBANTE_DETALLE
                            SET CODE_CREDITO = :MONTO
                        WHERE CUEN_COD = :CUENTA AND ENCO_CONSEC = :IDC;
                    END
                END /* MONTO <> 0 */
            END /* FOR */
        END /* INVEN = A */
    if (INVEN = 'K') then
        BEGIN
        SELECT SUM(CANT * COSTO)
            FROM COSTO_VENTAS
            INTO :MONTO;
        if (MONTO <> 0) then
            BEGIN
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTAINVEN INTO :CUENTA, :TIPOCUEN;
            IF (CUENTA IS NULL) THEN
                begin
                EXCEPTION CUENTA_NO_EXISTE 'La cuenta ' || :ctainven || ' no existe.';
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT ARTI_COD, CANT * COSTO
                    FROM COSTO_VENTAS
                    INTO :ART, :MONTO
                DO
                    BEGIN
                    SELECT COUNT(*) FROM COMPROBANTE_DETALLE WHERE CUEN_COD = :CUENTA AND ENCO_CONSEC = :IDC AND ARTI_COD = :ART INTO :NUMROWS;
                    if (NUMROWS = 0) then
                        BEGIN
                        INSERT INTO comprobante_detalle (ENCO_CONSEC, CODE_ITEM, CUEN_COD, CODE_CONCEPTO, CODE_REFER, CODE_DEBITO, CODE_CREDITO, CODE_BASE, CODE_PORC, TERC_NIT, PROY_COD, CENT_COD, CNDE_DOCNUMERO, CNDE_DOCAPLICA, DOCO_VENCE, ARTI_COD, CODE_TIPOAPL, CODE_TIPONUE)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        END
                    ELSE
                        UPDATE COMPROBANTE_DETALLE
                            SET CODE_CREDITO = :MONTO
                        WHERE CUEN_COD = :CUENTA AND ENCO_CONSEC = :IDC AND ARTI_COD = :ART;
                    END
                END
            ELSE
                BEGIN
                SELECT COUNT(*) FROM COMPROBANTE_DETALLE WHERE CUEN_COD = :CUENTA AND ENCO_CONSEC = :IDC INTO :NUMROWS;
                if (NUMROWS = 0) then
                    BEGIN
                    if (TIPOCUEN = 'C') then
                        INSERT INTO comprobante_detalle (ENCO_CONSEC, CODE_ITEM, CUEN_COD, CODE_CONCEPTO, CODE_REFER, CODE_DEBITO, CODE_CREDITO, CODE_BASE, CODE_PORC, TERC_NIT, PROY_COD, CENT_COD, CNDE_DOCNUMERO, CNDE_DOCAPLICA, DOCO_VENCE, ARTI_COD, CODE_TIPOAPL, CODE_TIPONUE)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    ELSE
                        INSERT INTO comprobante_detalle (ENCO_CONSEC, CODE_ITEM, CUEN_COD, CODE_CONCEPTO, CODE_REFER, CODE_DEBITO, CODE_CREDITO, CODE_BASE, CODE_PORC, TERC_NIT, PROY_COD, CENT_COD, CNDE_DOCNUMERO, CNDE_DOCAPLICA, DOCO_VENCE, ARTI_COD, CODE_TIPOAPL, CODE_TIPONUE)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    END
                ELSE
                    UPDATE COMPROBANTE_DETALLE
                        SET CODE_CREDITO = :MONTO
                    WHERE CUEN_COD = :CUENTA AND ENCO_CONSEC = :IDC;
                END
            END /* MONTO <> 0 */
        END /* INVEN = K */
    END
  END
end

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE CONTABIL_DEVOLCLI(
    IDDOC INTEGER,
    IDINTER INTEGER)
RETURNS (
    ERROR INTEGER,
    VER CHAR(1),
    IDC INTEGER)
AS
declare variable PREF VARCHAR(4);
declare variable NUM VARCHAR(6);
declare variable NUMERO VARCHAR(10);
declare variable FECAUX DATE;
declare variable FECHA CHAR(8);
declare variable CONC CHAR(120);
declare variable NUMFAC VARCHAR(10);
declare variable VRDTO NUMERIC(18, 2);
declare variable VRADIC NUMERIC(18, 2);
declare variable VRSUBT NUMERIC(18, 2);
declare variable VRIVA NUMERIC(18, 2);
declare variable PRTFTE NUMERIC(9, 2);
declare variable VRRTFTE NUMERIC(18, 2);
declare variable VRRTIVA NUMERIC(18, 2);
declare variable PRTICA NUMERIC(9, 2);
declare variable VRRTICA NUMERIC(18, 2);
declare variable VRTOTAL NUMERIC(18, 2);
declare variable VREXTRA NUMERIC(18, 2);
declare variable TIPOCOMP VARCHAR(3);
declare variable PREFCONT VARCHAR(4);
declare variable VENTAS CHAR(1);
declare variable CTAVENTAS VARCHAR(20);
declare variable IVA CHAR(1);
declare variable CTAIVA VARCHAR(20);
declare variable CONSUMO CHAR(1);
declare variable CTACONSUMO VARCHAR(20);
declare variable CARTERA CHAR(1);
declare variable CTACARTERA VARCHAR(20);
declare variable RTFTE CHAR(1);
declare variable CTARTFTE VARCHAR(20);
declare variable RTIVA CHAR(1);
declare variable CTARTIVA VARCHAR(20);
declare variable RTICA CHAR(1);
declare variable CTARTICA VARCHAR(20);
declare variable INVEN CHAR(1);
declare variable CTAINVEN VARCHAR(20);
declare variable COSTOS CHAR(1);
declare variable CTACOSTOS VARCHAR(20);
declare variable CTADTO VARCHAR(20);
declare variable CTAADIC VARCHAR(20);
declare variable CTAEXTRA VARCHAR(20);
declare variable EXISTE CHAR(1);
declare variable CUENTA VARCHAR(20);
declare variable MONTO NUMERIC(18,2);
declare variable TIPOCUEN CHAR(1);
declare variable NIT VARCHAR(20);
declare variable PROY VARCHAR(4);
declare variable CENTRO VARCHAR(4);
declare variable PORC NUMERIC(5,2);
declare variable DEBITO NUMERIC(18,2);
declare variable CREDITO NUMERIC(18,2);
declare variable NROI INTEGER;
declare variable ART VARCHAR(15);
declare variable IMPINC CHAR(1);
declare variable IMPTOS NUMERIC(18, 2);
declare variable SUMA NUMERIC(18,2);
declare variable PORCIVA NUMERIC(9,2);
declare variable TCTACLIEN VARCHAR(20);
declare variable TCTAVENTA VARCHAR(20);
declare variable TCTARTFTE VARCHAR(20);
declare variable TCTARTIVA VARCHAR(20);
declare variable TCTARTICA VARCHAR(20);
declare variable CTADIC VARCHAR(20);
declare variable BASEADIC VARCHAR(20);
declare variable PORCADIC NUMERIC(5,2);
declare variable VALORADIC NUMERIC(18,2);
declare variable DBADIC CHAR(1);
declare variable PTOVTA INTEGER;
declare variable ANULADO CHAR(1);
declare variable CENT CHAR(1);
DECLARE VARIABLE MERCANCIA NUMERIC(18,2);
declare variable FACTOR DOUBLE PRECISION;
declare variable DIG INTEGER;
DECLARE VARIABLE FOMENTO VARCHAR(2);
DECLARE VARIABLE VRCONSUMO NUMERIC(18,2);
declare variable AUTORET VARCHAR(10);
declare variable FAUTORET DATE;
declare variable IDREM INTEGER;
declare variable DTOXIT CHAR(2);
declare variable ERRORC INTEGER;
BEGIN
EXECUTE PROCEDURE LEE_CONFIGURACION('COMPRAS', 'FACTURAS', 'USAR IMPOCONSUMO COMO PORCENTAJE DE FOMENTO') returning_values (FOMENTO);
EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'FECHA AUTORETENEDOR NO DESCONTAR RETENCIONES DEL SALDO PERO SI CONTABILIZARLAS') returning_values (AUTORET);
if (AUTORET <> '') then
    FAUTORET = CAST(AUTORET AS DATE);
else
    FAUTORET = '9999/12/31';
  /* BUSQUE LA INTERFACE */
  EXISTE = 'N';
  SELECT 'S', TICO_COD, PRCO_PRE, INVE_VENTAS, INVE_IVA, INVE_CONSUMO, INVE_CARTERA, INVE_RTFTE, INVE_RTIVA, INVE_RTICA, INVE_COSTO, INVE_INVEN, INVE_CTAVENTAS, INVE_CTAIVA, INVE_CTACONSUMO, INVE_CTADTO, INVE_CTAADIC, INVE_CTAEXTRA, INVE_CTACARTERA, INVE_CTARTFTE, INVE_CTARTIVA, INVE_CTARTICA, INVE_CTAINVEN, INVE_CTACOSTOS, INVE_CONFIRMAR, INVE_CENTRO
    FROM INTERFAZ_VENTAS
    WHERE INVE_ID = :IDINTER
    INTO :EXISTE, :TIPOCOMP, :PREFCONT, :VENTAS, :IVA, :CONSUMO, :CARTERA, :RTFTE, :RTIVA, :RTICA, :COSTOS, :INVEN, :CTAVENTAS, :CTAIVA, :CTACONSUMO, :CTADTO, :CTAADIC, :CTAEXTRA, :CTACARTERA, :CTARTFTE, :CTARTIVA, :CTARTICA, :CTAINVEN, :CTACOSTOS, :VER, :CENT;
  if (EXISTE = 'S') then
   BEGIN
    /* BORRE CUALQUEIR CONTABILIZACION PREVIA */
    DELETE FROM CONTABILIZACION WHERE CNTB_TIPOREF = 33 AND CNTB_IDREF = :IDDOC;
    /* TRAIGA EL ENCABEZADO DE LA DEVOLUCION */
   SELECT PREF_PRE, DEVT_NUMERO, DEVT_FECHA, F.TERC_NIT, DEVT_IVAINC, PTVT_ID, DEVT_FACTURA, DEVT_DTOMONTO, DEVT_ADICIONAL, DEVT_IVAMONTO, DEVT_EXTRA, DEVT_TOTAL, DEVT_RTFTEPORC, DEVT_RTFTEMONTO, DEVT_RTIVAPORC, DEVT_RTIVAMONTO, DEVT_RTICAPORC, DEVT_RTICAMONTO, TERC_CTARTFTE, TERC_CTARTIVA, TERC_CTARTICA, TERC_CTAVENTA, TERC_CTACLIENTE, DEVT_ANULADO, DEVT_REMID
        FROM DEVOLUCIONES_VENTAS F, TERCEROS T
        WHERE DEVT_ID = :IDDOC AND F.TERC_NIT = T.TERC_NIT
        INTO :PREF, :NUM, :FECAUX, :NIT, :IMPINC, :PTOVTA, :NUMFAC, :VRDTO, :VRADIC, :VRIVA, :VREXTRA, :VRTOTAL, :PRTFTE, :VRRTFTE, :PORC, :VRRTIVA, :PRTICA, :VRRTICA, :TCTARTFTE, TCTARTIVA, TCTARTICA, TCTAVENTA, TCTACLIEN, ANULADO, :IDREM;
   if (idrem is null) Then
    IDREM = 0;
   if ((ANULADO = 'N') AND (IDREM = 0)) then
    BEGIN
    NUMERO = PREF || NUM;
    SELECT SUM(DVDE_CONSUMO) FROM devoluciones_ventas_detalle WHERE DEVT_ID = :iddoc INTO :MERCANCIA;
    VRSUBT = VRTOTAL - VREXTRA - VRIVA - MERCANCIA; /* BASE DE RETEFTE Y RETEICA */
    EXECUTE PROCEDURE lee_configuracion ('FACTURACION', 'DEVOLUCIONES', 'DESCUENTO PIE DEVOLUCION IGUAL A SUMA DE DESCUENTOS POR ITEM') returning_values (:DTOXIT);
    if (DTOXIT = 'SI') then
        VRDTO = 0;
    MERCANCIA = VRSUBT - VRADIC + VRDTO;
    IF (CENT = 'B') THEN
        SELECT B.BODE_CENTRO, B.BODE_PROY FROM BODEGA B, DEVOLUCIONES_VENTAS F
            WHERE B.BODE_COD = F.BODE_COD AND F.DEVT_ID = :IDDOC INTO :CENTRO, :PROY;
    IF (CENT = 'V') THEN
        SELECT V.CENT_COD, V.PROY_COD FROM VENDEDORES V, DEVOLUCIONES_VENTAS F
            WHERE V.VEND_COD = F.VEND_COD AND F.DEVT_ID = :IDDOC INTO :CENTRO, :PROY;
    IF (CENT = 'P') THEN
        SELECT P.PREF_CENTRO,P.PREF_PROY  FROM PREFIJOS P, DEVOLUCIONES_VENTAS F
            WHERE P.PREF_PRE = F.PREF_PRE AND F.DEVT_ID = :IDDOC AND P.TIDO_COD = 33 INTO :CENTRO, :PROY;
    EXECUTE PROCEDURE FECHA_A_CONTA(:FECAUX) returning_values (:FECHA);
    /* REGISTRE EL ENCABEZADO CONTABLE */
    IDC = GEN_ID(ID_CONTABILIZA, 1);
    CONC = 'DEVOLUCION VENTAS No. ' || NUMERO || ' EN FACTURA ' || NUMFAC;
    CONC = SUBSTR(CONC, 1, 60);
    INSERT INTO CONTABILIZACION (CNTB_ID, CNTB_TIPOCOMP, CNTB_PREFCNT, CNTB_NUMERO, CNTB_FECHA, CNTB_CONCEPTO, CNTB_REF, CNTB_TIPOREF, CNTB_IDREF, CNTB_PREFREF, CNTB_NUMREF, CNTB_PROCESADO)
        VALUES (:IDC, :TIPOCOMP, :PREFCONT, :NUM, :FECHA, :CONC, '', 33, :IDDOC, :PREF, :NUM, 'N');
    NROI = 0;
    SUMA = 0;
    ERROR = 0;
    /* SI NO HAY CUENTA DE DESCUENTO NI ADICIONAL CALCULE UN FACTOR PARA LAS VENTAS Y EL IVA */
    if (MERCANCIA <> 0) then
        FACTOR = CAST(VRSUBT AS DOUBLE PRECISION) / CAST(MERCANCIA AS DOUBLE PRECISION);
    ELSE
        FACTOR = 1;
    /* TRAIGA EL NUMERO DE DIGITOS PARA EL REDONDEO */
    SELECT CAST(CONF_VALOR AS INTEGER) FROM CONFIGURACION WHERE CONF_MODULO = 'FACTURACION' AND
        CONF_CATEGORIA = 'GENERAL' AND CONF_PROPIEDAD = 'REDONDEO AL MULTIPLO DE DIEZ EN TOTALES' INTO :DIG;
    /* CUENTAS DE VENTAS */
    if (VENTAS = 'A') then
        BEGIN
        FOR SELECT MAX(COAR_CTADEV), SUM(cast(DVDE_CANT as double precision) * (DVDE_PRUNIT-DVDE_DTOMONTO)), SUM(DVDE_IVAMONTO), SUM(DVDE_CONSUMO)
            FROM ARTICULO A, CONTABIL_ARTICULO C, DEVOLUCIONES_VENTAS_DETALLE F
            WHERE F.DEVT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD
            GROUP BY COAR_CTADEV
            INTO :CTAVENTAS, :MONTO, :IMPTOS, :VRCONSUMO
            DO
            BEGIN
            if (IMPINC = 'S') then
                if (FOMENTO = 'SI') then
                    MONTO = MONTO - IMPTOS;
                ELSE
                    MONTO = MONTO - IMPTOS - VRCONSUMO;
            ELSE
            if (FOMENTO = 'SI') then
            MONTO = MONTO + VRCONSUMO;
            if ((CTADTO IS NULL) OR (CTADTO = '')) then
                MONTO = MONTO * FACTOR;
            execute procedure redondee(MONTO, DIG) returning_values (MONTO);
            if (MONTO <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTAVENTAS, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT F.ARTI_COD, (cast(DVDE_CANT as double precision) * (DVDE_PRUNIT-DVDE_DTOMONTO)), (DVDE_IVAMONTO+DVDE_CONSUMO)
                        FROM ARTICULO A, CONTABIL_ARTICULO C, DEVOLUCIONES_VENTAS_DETALLE F
                        WHERE F.DEVT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTAINV = :CUENTA
                        INTO :ART, :MONTO, :IMPTOS
                    DO
                        BEGIN
                        if (IMPINC = 'S') then
                            MONTO = MONTO - IMPTOS;
                        if ((CTADTO IS NULL) OR (CTADTO = '')) then
                            MONTO = MONTO * FACTOR;
                        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        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, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                    NROI = NROI + 1;
                    SUMA = SUMA + MONTO;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA + MONTO;
                    END
                END /* MONTO <> 0 */
            END /* FOR */
        END /* VENTAS X ARTICULO */
     IF ((VENTAS = 'C') OR (VENTAS = 'K')) THEN
        BEGIN
        IF (VENTAS = 'C') THEN
            CTAVENTAS = TCTAVENTA;
        SELECT SUM(cast(DVDE_CANT as double precision) * (DVDE_PRUNIT-DVDE_DTOMONTO)), SUM(DVDE_IVAMONTO), SUM(DVDE_CONSUMO)
            FROM DEVOLUCIONES_VENTAS_DETALLE F
            WHERE F.DEVT_ID = :IDDOC 
            INTO :MONTO, :IMPTOS, :VRCONSUMO;
        if (IMPINC = 'S') then
            if (FOMENTO = 'SI') then
               MONTO = MONTO - IMPTOS;
            ELSE
               MONTO = MONTO - IMPTOS - VRCONSUMO;
        ELSE
         if (FOMENTO = 'SI') then
          MONTO = MONTO + VRCONSUMO;
        if ((CTADTO IS NULL) OR (CTADTO = '')) then
            MONTO = MONTO * FACTOR;
        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
        if (MONTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTAVENTAS, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT F.ARTI_COD, (cast(DVDE_CANT as double precision) * (DVDE_PRUNIT-DVDE_DTOMONTO)), (DVDE_IVAMONTO+DVDE_CONSUMO)
                    FROM ARTICULO A, DEVOLUCIONES_VENTAS_DETALLE F
                    WHERE F.DEVT_ID = :IDDOC
                    INTO :ART, :MONTO, :IMPTOS
                    DO
                    BEGIN
                    if (IMPINC = 'S') then
                        MONTO = MONTO - IMPTOS;
                    if ((CTADTO IS NULL) OR (CTADTO = '')) then
                        MONTO = MONTO * FACTOR;
                    execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                    NROI = NROI + 1;
                    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, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                NROI = NROI + 1;
                SUMA = SUMA + MONTO;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA + MONTO;
                END
            END /* MONTO <> 0 */
        END /* VENTAS DE CLIENTE O CONSTANTE */
    /* EL IVA EN VENTAS */
    if (IVA = 'A') then
        BEGIN
        FOR SELECT MAX(COAR_CTAIVAV), SUM(DVDE_IVAMONTO), SUM(DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO), SUM(DVDE_CONSUMO)
            FROM ARTICULO A, CONTABIL_ARTICULO C, DEVOLUCIONES_VENTAS_DETALLE F
            WHERE F.DEVT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD
            GROUP BY COAR_CTAIVAV
            INTO :CTAIVA, :IMPTOS, :MONTO, :VALORADIC
        DO
            BEGIN
            if (FOMENTO = 'SI') then
                MONTO = MONTO + VALORADIC;
            MONTO = MONTO * -1;
            MONTO = MONTO * FACTOR;
            IMPTOS = IMPTOS * FACTOR;
            execute procedure redondee(MONTO, DIG) returning_values (MONTO);
            execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
            if (IMPTOS <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTAIVA, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT F.ARTI_COD, DVDE_IVAMONTO, (cast(DVDE_CANT as double precision) * (DVDE_PRUNIT-DVDE_DTOMONTO)), TAIV_PORC, DVDE_CONSUMO
                        FROM ARTICULO A, CONTABIL_ARTICULO C, DEVOLUCIONES_VENTAS_DETALLE F, TARIFA_IVA T
                        WHERE F.DEVT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND A.TAIV_COD = T.TAIV_COD AND COAR_CTAIVAV = :CUENTA
                        INTO :ART, :IMPTOS, :MONTO, :PORCIVA, :VALORADIC
                    DO
                        BEGIN
                        if (IMPINC = 'S') then
                            MONTO = MONTO - IMPTOS - VALORADIC;
                        MONTO = MONTO * -1;
                        MONTO = MONTO * FACTOR;
                        IMPTOS = IMPTOS * FACTOR;
                        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                        execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                        if (IMPTOS <> 0) then
                            BEGIN
                            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :IMPTOS, 0, :MONTO, :PORCIVA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                            NROI = NROI + 1;
                            SUMA = SUMA + IMPTOS;
                            END
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                    NROI = NROI + 1;
                    SUMA = SUMA + IMPTOS;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA + IMPTOS;
                    END
                END   /* IMPTOS <> 0 */
            END /* FOR */
        END /* IVA X ARTICULO */
    if (IVA = 'K') then /* IVA EN CTA CONSTANTE */
        BEGIN
        SELECT SUM(DVDE_IVAMONTO), SUM(DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO), SUM(DVDE_CONSUMO)
            FROM DEVOLUCIONES_VENTAS_DETALLE F
            WHERE F.DEVT_ID = :IDDOC 
            INTO :IMPTOS, :MONTO, :VALORADIC;
        if (FOMENTO = 'SI') then
            MONTO = MONTO + VALORADIC;
        MONTO = MONTO * -1;
        MONTO = MONTO * FACTOR;
        IMPTOS = IMPTOS * FACTOR;
        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
        execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
        if (IMPTOS <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTAIVA, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT F.ARTI_COD, (cast(DVDE_CANT as double precision) * (DVDE_PRUNIT-DVDE_DTOMONTO)), DVDE_IVAMONTO, TAIV_PORC, DVDE_CONSUMO
                    FROM ARTICULO A, DEVOLUCIONES_VENTAS_DETALLE F, TARIFA_IVA T
                    WHERE F.DEVT_ID = :IDDOC AND A.TAIV_COD = T.TAIV_COD
                    INTO :ART, :MONTO, :IMPTOS, :PORCIVA, :VALORADIC
                    DO
                    BEGIN
                    if (IMPINC = 'S') then
                        MONTO = MONTO - IMPTOS - VALORADIC;
                    MONTO = MONTO * -1;
                    MONTO = MONTO * FACTOR;
                    IMPTOS = IMPTOS * FACTOR;
                    execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                    execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                    if (IMPTOS <> 0) then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', :IMPTOS, 0, :MONTO, :PORCIVA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        SUMA = SUMA + IMPTOS;
                        END
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                NROI = NROI + 1;
                SUMA = SUMA + IMPTOS;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA + IMPTOS;
                END
            END /* IMPTOS <> 0 */
        END /* IVA EN CTA CONSTANTE */
    /* EL IMPOCONSUMO */
    if ((CONSUMO = 'A') AND (FOMENTO <> 'SI')) then
        BEGIN
        FOR SELECT MAX(COAR_CTACONS), SUM(DVDE_CONSUMO)
            FROM ARTICULO A, CONTABIL_ARTICULO C, DEVOLUCIONES_VENTAS_DETALLE F
            WHERE F.DEVT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD
            GROUP BY COAR_CTACONS
            INTO :CTACONSUMO, :IMPTOS
        DO
            BEGIN
            if (IMPTOS <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTACONSUMO, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, REGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT F.ARTI_COD, DVDE_CONSUMO
                        FROM ARTICULO A, CONTABIL_ARTICULO C, DEVOLUCIONES_VENTAS_DETALLE F
                        WHERE F.DEVT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTACONS = :CUENTA
                        INTO :ART, :IMPTOS
                    DO
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 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, :NROI, :CUENTA, :CONC, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                    NROI = NROI + 1;
                    SUMA = SUMA + IMPTOS;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA + IMPTOS;
                    END
                END /* IMPTOS <> 0 */
            END /* FOR */
        END /* CONSUMO X ARTICULO */
    if ((CONSUMO = 'K') AND (FOMENTO <> 'SI')) then
        BEGIN
        SELECT SUM(DVDE_CONSUMO)
            FROM DEVOLUCIONES_VENTAS_DETALLE F
            WHERE F.DEVT_ID = :IDDOC 
            INTO :IMPTOS;
        if (IMPTOS <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTACONSUMO, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT F.ARTI_COD, DVDE_CONSUMO
                    FROM ARTICULO A, DEVOLUCIONES_VENTAS_DETALLE F
                    WHERE F.DEVT_ID = :IDDOC 
                    INTO :ART, :IMPTOS
                    DO
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTACONSUMO, :CONC, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                    NROI = NROI + 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, :NROI, :CTACONSUMO, :CONC, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA + IMPTOS;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTACONSUMO, :CONC, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA + IMPTOS;
                END
            END /* IMPTOS <> 0 */
        END /* CONSUMO EN CTA CONSTANTE */
    /* DESCUENTO */
    if ((CTADTO IS NOT NULL) AND
        (CTADTO <> '') AND
        (VRDTO <> 0)) THEN
        BEGIN
        EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTADTO, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRDTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
            NROI = NROI + 1;
            SUMA = SUMA - VRDTO;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRDTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 33);
            NROI = NROI + 1;
            SUMA = SUMA - VRDTO;
            END
        END /* DESCUENTO */
    /* VALOR ADIC */
    if ((CTAADIC IS NOT NULL) AND
        (CTAADIC <> '') AND
        (VRADIC <> 0)) THEN
        BEGIN
        EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTAADIC, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRADIC, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
            NROI = NROI + 1;
            SUMA = SUMA + VRADIC;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRADIC, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 33);
            NROI = NROI + 1;
            SUMA = SUMA + VRADIC;
            END
        END /* VR. ADIC */
    /* VALOR EXTRA */
    if ((CTAEXTRA IS NOT NULL) AND
        (CTAEXTRA <> '') AND
        (VREXTRA <> 0)) THEN
        BEGIN
        EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTAEXTRA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VREXTRA, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
            NROI = NROI + 1;
            SUMA = SUMA + VREXTRA;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VREXTRA, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 33);
            NROI = NROI + 1;
            SUMA = SUMA + VREXTRA;
            END
        END /* VR. EXTRA */
    /* RETENCION FUENTE */
    if ((RTFTE = 'C') or (RTFTE = 'K')) then
      if (VRRTFTE <> 0) then
        BEGIN
        if (RTFTE = 'C') then
            CTARTFTE = TCTARTFTE;
        EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTARTFTE, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, (:VRSUBT*-1), :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
            NROI = NROI + 1;
            SUMA = SUMA - VRRTFTE;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, (:VRSUBT*-1), :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA - VRRTFTE;
            END
        /* AUTORETENCION */
        if (FAUTORET <= fecaux) then
            BEGIN
            EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'CUENTA DE AUTORETENCION EN LA FUENTE') returning_values (CTARTFTE);
            EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTARTFTE, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :VRSUBT, :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                NROI = NROI + 1;
                SUMA = SUMA + VRRTFTE;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :VRSUBT, :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA + VRRTFTE;
                END
            END
        END /* RTFTE */
    if (RTFTE = 'A') then
      BEGIN
      FOR SELECT MAX(COAR_CTARTFTEV), MAX(COAR_RTFTE), MIN(COAR_RTBASE), SUM(DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO), SUM((DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO)*COAR_RTFTE)
        FROM CONTABIL_ARTICULO C, devoluciones_ventas_detalle F
        WHERE F.devt_id = :IDDOC AND F.ARTI_COD = C.ARTI_COD
        GROUP BY COAR_CTARTFTEV
        INTO :CTARTFTE, :PRTFTE, :baseadic, :MONTO, :VRRTFTE
        DO
        BEGIN
        MONTO = MONTO * FACTOR;
        if (MONTO >= BASEADIC) then
            BEGIN
            VRRTFTE = VRRTFTE * FACTOR / 100;
            execute procedure redondee(VRRTFTE, DIG) returning_values (VRRTFTE);
            execute procedure redondee(MONTO, DIG) returning_values (MONTO);
            if (VRRTFTE <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTARTFTE, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, (:MONTO*-1), :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                    NROI = NROI + 1;
                    SUMA = SUMA - VRRTFTE;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, (:MONTO*-1), :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA - VRRTFTE;
                    END
                /* AUTORETENCION */
                if (FAUTORET <= fecaux) then
                    BEGIN
                    EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'CUENTA DE AUTORETENCION EN LA FUENTE') returning_values (CTARTFTE);
                    EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTARTFTE, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
                    if (ERRORC <> 0) then
                        ERROR = ERROR + 1;
                    if (TIPOCUEN = 'C') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :MONTO, :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                        NROI = NROI + 1;
                        SUMA = SUMA + VRRTFTE;
                        END
                    if (TIPOCUEN = 'N') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :MONTO, :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NROI = NROI + 1;
                        SUMA = SUMA + VRRTFTE;
                        END
                    END
                END
            END
        END /* RTFTE */
      END
    /* RETENCION IVA */
    if ((RTIVA = 'C') or (RTIVA = 'K')) then
      if (VRRTIVA <> 0) then
        BEGIN
        if (RTIVA = 'C') then
            CTARTIVA = TCTARTIVA;
        EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTARTIVA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTIVA, (:VRIVA*-1), :PORC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
            NROI = NROI + 1;
            SUMA = SUMA - VRRTIVA;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTIVA, (:VRIVA*-1), :PORC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA - VRRTIVA;
            END
        END /* RTIVA */
    /* RETENCION DE ICA */
    if ((RTICA = 'C') or (RTICA = 'K')) then
      if (VRRTICA <> 0) then
        BEGIN
        if (RTICA = 'C') then
            CTARTICA = TCTARTICA;
        EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTARTICA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTICA, (:VRSUBT*-1), :PRTICA, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
            NROI = NROI + 1;
            SUMA = SUMA - VRRTICA;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTICA, (:VRSUBT*-1), :PRTICA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA - VRRTICA;
            END
        END /* RTICA */
    /* CIERRE EL COMPROBANTE CONTRA LA CUENTA DEL TERCERO O LA CONSTANTE */
    if ((SUMA <> 0) and ((CARTERA = 'C') or (CARTERA = 'K') or (CARTERA = 'J'))) then
        BEGIN
        if (SUMA < 0) then
            BEGIN
            DEBITO = SUMA * -1;
            CREDITO = 0;
            END
        ELSE
            BEGIN
            DEBITO = 0;
            CREDITO = SUMA;
            END
        if (CARTERA = 'C') then
            CTACARTERA = TCTACLIEN;
        if (CARTERA = 'J') then
            BEGIN
            /* BUSQUE LA CUENTA DE LA CAJA */
            SELECT CAJA_CUENTA FROM CAJAS C, PUNTO_VENTA P
                WHERE P.CAJA_ID = C.CAJA_ID AND PTVT_ID = :PTOVTA
                INTO :CTACARTERA;
            END
        EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTACARTERA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :DEBITO, :CREDITO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
        if (TIPOCUEN = 'N') then
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :DEBITO, :CREDITO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
        NROI = NROI + 1;
        END /* SUMA EN CARTERA */
    /* CALCULE COSTOS EN VENTAS */
    EXECUTE PROCEDURE COSTO_EN_VENTAS(33, :IDDOC);
    if (COSTOS = 'A') then
        BEGIN
        FOR SELECT MAX(CTACOS), SUM(cast(CANT as double precision) * COSTO)
            FROM COSTO_VENTAS
            GROUP BY CTACOS
            INTO :CTACOSTOS, :MONTO
        DO
            BEGIN
            if (MONTO <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTACOSTOS, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT ARTI_COD, cast(CANT as double precision) * COSTO
                        FROM COSTO_VENTAS
                        WHERE CTACOS = :CUENTA
                        INTO :ART, :MONTO
                    DO
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                    NROI = NROI + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    END
                END /* MONTO <> 0 */
            END /* FOR */
        END /* COSTOS */
    if (COSTOS = 'K') then
        BEGIN
        SELECT SUM(cast(CANT as double precision) * COSTO)
            FROM COSTO_VENTAS
            INTO :MONTO;
        if (MONTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTACOSTOS, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, REGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT ARTI_COD, cast(CANT as double precision) * COSTO
                    FROM COSTO_VENTAS
                    INTO :ART, :MONTO
                DO
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTACOSTOS, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                    NROI = NROI + 1;
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTACOSTOS, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                NROI = NROI + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTACOSTOS, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                END
            END /* MONTO <> 0 */
        END /* COSTOS = K */
    if (INVEN = 'A') then
        BEGIN
        FOR SELECT MAX(CTAINV), SUM(cast(CANT as double precision) * COSTO)
            FROM COSTO_VENTAS
            GROUP BY CTAINV
            INTO :CTAINVEN, :MONTO
        DO
            BEGIN
            if (MONTO <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTAINVEN, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, REGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT ARTI_COD, cast(CANT as double precision) * COSTO
                        FROM COSTO_VENTAS
                        WHERE CTAINV = :CUENTA
                        INTO :ART, :MONTO
                    DO
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                    NROI = NROI + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    END
                END /* MONTO <> 0 */
            END /* FOR */
        END /* INVEN = A */
    if (INVEN = 'K') then
        BEGIN
        SELECT SUM(cast(CANT as double precision) * COSTO)
            FROM COSTO_VENTAS
            INTO :MONTO;
        if (MONTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTAINVEN, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT ARTI_COD, cast(CANT as double precision) * COSTO
                    FROM COSTO_VENTAS
                    INTO :ART, :MONTO
                DO
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTAINVEN, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                    NROI = NROI + 1;
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAINVEN, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                NROI = NROI + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAINVEN, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                END
            END /* MONTO <> 0 */
        END /* INVEN = K */
    /* recorra las cuentas adicionales */
    FOR SELECT INVC_CUENTA, INVC_BASE, INVC_PORC, INVC_VALOR, INVC_DB
        FROM INTERFAZ_VENTAS_CTAS WHERE INVE_ID = :IDINTER
        INTO :CTADIC, :BASEADIC, :PORCADIC, :VALORADIC, :DBADIC
        DO
        BEGIN
        if (valoradic <> 0) then
            monto = valoradic;
        else
            BEGIN
            if (:BASEADIC = 'SUBTOTAL') then
                VALORADIC = vrsubt;
            if (:BASEADIC = 'DESCUENTO') then
                VALORADIC = VRDTO;
            if (:BASEADIC = 'IVA') then
                VALORADIC = VRIVA;
            if (:BASEADIC = 'ADICIONAL') then
                VALORADIC = VRADIC;
            if (:BASEADIC = 'EXTRA') then
                VALORADIC = VREXTRA;
            if (:BASEADIC = 'TOTAL') then
                VALORADIC = VRTOTAL;
            MONTO = VALORADIC * PORCADIC;
            END
        if (MONTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTADIC, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                if (DBADIC = 'S') then
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                ELSE
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                NROI = NROI + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                if (DBADIC = 'S') then
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                ELSE
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                END
            NROI = NROI + 1;
            END
        END
    if (error > 0) then
        ver = 'S';
    SUSPEND;
    END
   END /* EXISTE LA INTERFAZ */
  ELSE
    BEGIN
    EXECUTE PROCEDURE ERROR (33, :IDDOC, :PREF, 1);
    ERROR = ERROR + 1;
    VER = 'S';
    SUSPEND;
    END
END

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE CONTABIL_FACTURA(
    IDDOC INTEGER,
    IDINTER INTEGER)
RETURNS (
    ERROR INTEGER,
    VER CHAR(1),
    IDC INTEGER)
AS
declare variable pref varchar(4);
declare variable num varchar(6);
declare variable numero varchar(10);
declare variable fecaux date;
declare variable fecha char(8);
declare variable conc varchar(60);
declare variable venceaux date;
declare variable vence char(8);
declare variable vrdto numeric(18,2);
declare variable vradic numeric(18,2);
declare variable vrsubt numeric(18,2);
declare variable vriva numeric(18,2);
declare variable prtfte numeric(9,2);
declare variable vrrtfte numeric(18,2);
declare variable vrrtiva numeric(18,2);
declare variable prtica numeric(9,2);
declare variable vrrtica numeric(18,2);
declare variable vrtotal numeric(18,2);
declare variable vrextra numeric(18,2);
declare variable tipocomp varchar(3);
declare variable prefcont varchar(4);
declare variable ventas char(1);
declare variable ctaventas varchar(20);
declare variable iva char(1);
declare variable ctaiva varchar(20);
declare variable consumo char(1);
declare variable ctaconsumo varchar(20);
declare variable cartera char(1);
declare variable ctacartera varchar(20);
declare variable rtfte char(1);
declare variable ctartfte varchar(20);
declare variable rtiva char(1);
declare variable ctartiva varchar(20);
declare variable rtica char(1);
declare variable ctartica varchar(20);
declare variable inven char(1);
declare variable ctainven varchar(20);
declare variable costos char(1);
declare variable ctacostos varchar(20);
declare variable ctadto varchar(20);
declare variable ctaadic varchar(20);
declare variable ctaextra varchar(20);
declare variable existe char(1);
declare variable cuenta varchar(20);
declare variable monto numeric(18,2);
declare variable tipocuen char(1);
declare variable nit varchar(20);
declare variable nombre varchar(60);
declare variable proy varchar(4);
declare variable centro varchar(4);
declare variable porc numeric(5,2);
declare variable debito numeric(18,2);
declare variable credito numeric(18,2);
declare variable nroi integer;
declare variable art varchar(15);
declare variable imptos numeric(18,2);
declare variable suma numeric(18,2);
declare variable porciva numeric(9,2);
declare variable tctaclien varchar(20);
declare variable tctaventa varchar(20);
declare variable tctartfte varchar(20);
declare variable tctartiva varchar(20);
declare variable tctartica varchar(20);
declare variable ctadic varchar(20);
declare variable baseadic varchar(20);
declare variable porcadic numeric(5,2);
declare variable valoradic numeric(18,2);
declare variable dbadic char(1);
declare variable ptovta integer;
declare variable anulado char(1);
declare variable dig integer;
declare variable mercancia numeric(18,2);
declare variable fomento varchar(2);
declare variable DTOXIT varchar(2);
declare variable vrconsumo numeric(18,2);
declare variable factor double precision;
declare variable cent char(1);
declare variable AUTORET VARCHAR(10);
declare variable FAUTORET DATE;
declare variable ERRORC INTEGER;
BEGIN
EXECUTE PROCEDURE LEE_CONFIGURACION('COMPRAS', 'FACTURAS', 'USAR IMPOCONSUMO COMO PORCENTAJE DE FOMENTO') returning_values (FOMENTO);
EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'FECHA AUTORETENEDOR NO DESCONTAR RETENCIONES DEL SALDO PERO SI CONTABILIZARLAS') returning_values (AUTORET);
if (AUTORET <> '') then
    FAUTORET = CAST(AUTORET AS DATE);
else
    FAUTORET = '9999/12/31';
/* BUSQUE LA INTERFACE */
EXISTE = 'N';
SELECT 'S', TICO_COD, PRCO_PRE, INVE_VENTAS, INVE_IVA, INVE_CONSUMO, INVE_CARTERA, INVE_RTFTE, INVE_RTIVA, INVE_RTICA, INVE_COSTO, INVE_INVEN, INVE_CTAVENTAS, INVE_CTAIVA, INVE_CTACONSUMO, INVE_CTADTO, INVE_CTAADIC, INVE_CTAEXTRA, INVE_CTACARTERA, INVE_CTARTFTE, INVE_CTARTIVA, INVE_CTARTICA, INVE_CTAINVEN, INVE_CTACOSTOS, INVE_CONFIRMAR, INVE_CENTRO
    FROM INTERFAZ_VENTAS
    WHERE INVE_ID = :IDINTER
    INTO :EXISTE, :TIPOCOMP, :PREFCONT, :VENTAS, :IVA, :CONSUMO, :CARTERA, :RTFTE, :RTIVA, :RTICA, :COSTOS, :INVEN, :CTAVENTAS, :CTAIVA, :CTACONSUMO, :CTADTO, :CTAADIC, :CTAEXTRA, :CTACARTERA, :CTARTFTE, :CTARTIVA, :CTARTICA, :CTAINVEN, :CTACOSTOS, :VER, :CENT;
if (EXISTE = 'S') then
  BEGIN
    /* BORRE CUALQUEIR CONTABILIZACION PREVIA */
    DELETE FROM CONTABILIZACION WHERE CNTB_TIPOREF = 31 AND CNTB_IDREF = :IDDOC;

  /* TRAIGA EL ENCABEZADO DE LA FACTURA */
  SELECT PREF_PRE, FACT_NUMERO, FACT_FECHA, F.TERC_NIT, PTVT_ID, FACT_VENCE, FACT_DTOMONTO, FACT_ADICIONAL, FACT_IVAMONTO, FACT_EXTRA, FACT_TOTAL, FACT_RTFTEPOR, FACT_RTFTEMONTO, FACT_RTIVAPOR, FACT_RTIVAMONTO, FACT_RTICAPOR, FACT_RTICAMONTO, FACT_NOMCLIENTE, TERC_CTARTFTE, TERC_CTARTIVA, TERC_CTARTICA, TERC_CTAVENTA, TERC_CTACLIENTE, FACT_ANULADO
        FROM FACTURAS F, TERCEROS T
        WHERE FACT_ID = :IDDOC AND F.TERC_NIT = T.TERC_NIT
        INTO :PREF, :NUM, :FECAUX, :NIT, :PTOVTA, :VENCEAUX, :VRDTO, :VRADIC, :VRIVA, :VREXTRA, :VRTOTAL, :PRTFTE, :VRRTFTE, :PORC, :VRRTIVA, :PRTICA, :VRRTICA, :NOMBRE, TCTARTFTE, TCTARTIVA, TCTARTICA, TCTAVENTA, TCTACLIEN, ANULADO;
  if (ANULADO = 'N') then
    BEGIN
    /* BUSQUE EL CENTRO DEL PUNTO, LA BODEGA, O EL PREFIJO  */
    IF (CENT = 'B') THEN
        SELECT B.BODE_CENTRO, B.BODE_PROY FROM BODEGA B, FACTURAS F
            WHERE B.BODE_COD = F.BODE_COD AND F.FACT_ID = :IDDOC INTO :CENTRO, :PROY;
    IF (CENT = 'V') THEN
        SELECT V.CENT_COD, V.PROY_COD FROM VENDEDORES V, FACTURAS F
            WHERE V.VEND_COD = F.VEND_COD AND F.FACT_ID = :IDDOC INTO :CENTRO, :PROY;
    IF (CENT = 'P') THEN
        SELECT P.PREF_CENTRO,P.PREF_PROY  FROM PREFIJOS P, FACTURAS F
            WHERE P.PREF_PRE = F.PREF_PRE AND F.FACT_ID = :IDDOC AND P.TIDO_COD = 31 INTO :CENTRO, :PROY;
    NUMERO = PREF || NUM;
    SELECT SUM (FADE_CONSUMO) FROM FACTURAS_DETALLE WHERE FACT_ID = :IDDOC INTO MERCANCIA;
    VRSUBT = VRTOTAL - VREXTRA - VRIVA - MERCANCIA; /* BASE DE RETEFTE Y RETEICA */

    EXECUTE PROCEDURE lee_configuracion ('FACTURACION', 'FACTURAS', 'DESCUENTO PIE FACTURA IGUAL A SUMA DE DESCUENTOS POR ITEM') returning_values (:DTOXIT);
    if (DTOXIT = 'SI') then
        VRDTO = 0;
    MERCANCIA = VRSUBT - VRADIC + VRDTO;
    EXECUTE PROCEDURE FECHA_A_CONTA(:FECAUX) returning_values (:FECHA);
    EXECUTE PROCEDURE FECHA_A_CONTA(:VENCEAUX) returning_values (:VENCE);
    /* REGISTRE EL ENCABEZADO CONTABLE */
    IDC = GEN_ID(ID_CONTABILIZA, 1);
    if (STRLEN(NOMBRE)> 43 ) then
      CONC = 'FV No.' || NUMERO || '-' || SUBSTR(NOMBRE,1,43);
    ELSE
      CONC = 'FV No.' || NUMERO || '-' || NOMBRE;
    INSERT INTO CONTABILIZACION (CNTB_ID, CNTB_TIPOCOMP, CNTB_PREFCNT, CNTB_NUMERO, CNTB_FECHA, CNTB_CONCEPTO, CNTB_REF, CNTB_TIPOREF, CNTB_IDREF, CNTB_PREFREF, CNTB_NUMREF, CNTB_PROCESADO)
        VALUES (:IDC, :TIPOCOMP, :PREFCONT, :NUM, :FECHA, :CONC, '', 31, :IDDOC, :PREF, :NUM, 'N');
    NROI = 0;
    SUMA = 0;
    ERROR = 0;
    /* SI NO HAY CUENTA DE DESCUENTO NI ADICIONAL CALCULE UN FACTOR PARA LAS VENTAS Y EL IVA */
    if (MERCANCIA <> 0) then
        FACTOR = CAST(VRSUBT AS DOUBLE PRECISION) / CAST(MERCANCIA AS DOUBLE PRECISION);
    ELSE
        FACTOR = 1;
    /* TRAIGA EL NUMERO DE DIGITOS PARA EL REDONDEO */
    SELECT CAST(CONF_VALOR AS INTEGER) FROM CONFIGURACION WHERE CONF_MODULO = 'FACTURACION' AND
        CONF_CATEGORIA = 'GENERAL' AND CONF_PROPIEDAD = 'REDONDEO AL MULTIPLO DE DIEZ EN TOTALES' INTO :DIG;
    /* CUENTAS DE VENTAS */
    if (VENTAS = 'A') then
        BEGIN
        FOR SELECT MAX(COAR_CTAVNT), SUM(FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), SUM(FADE_IVAMONTO), SUM(FADE_CONSUMO)
            FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_DETALLE F
            WHERE F.FACT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD
            GROUP BY COAR_CTAVNT
            INTO :CTAVENTAS, :MONTO, :IMPTOS, :VRCONSUMO
            DO
            BEGIN
            if (FOMENTO = 'SI') then
                MONTO = MONTO + VRCONSUMO;
            if ((CTADTO IS NULL) OR (CTADTO = '')) then
                MONTO = MONTO * FACTOR;
            execute procedure redondee(MONTO, DIG) returning_values (MONTO);
            if (MONTO <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTAVENTAS, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT F.ARTI_COD, (FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), FADE_CONSUMO
                        FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_DETALLE F
                        WHERE F.FACT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTAINV = :CUENTA
                        INTO :ART, :MONTO, :IMPTOS
                    DO
                        BEGIN
                        if (FOMENTO = 'SI') then
                            MONTO = MONTO + IMPTOS;
                        if ((CTADTO IS NULL) OR (CTADTO = '')) then
                            MONTO = MONTO * FACTOR;
                        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                        if (MONTO <> 0) then
                            BEGIN
                            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                            NROI = NROI + 1;
                            SUMA = SUMA - MONTO;
                            END
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    NROI = NROI + 1;
                    SUMA = SUMA - MONTO;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA - MONTO;
                    END
                END /* MONTO <> 0 */
            END /* FOR */
        END /* VENTAS X ARTICULO */
     IF ((VENTAS = 'C') OR (VENTAS = 'K')) THEN
        BEGIN
        IF (VENTAS = 'C') THEN
            CTAVENTAS = TCTAVENTA;
        SELECT SUM(FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), SUM(FADE_IVAMONTO), SUM (FADE_CONSUMO)
            FROM FACTURAS_DETALLE F
            WHERE F.FACT_ID = :IDDOC 
            INTO :MONTO, :IMPTOS, :VRCONSUMO;
        if (FOMENTO = 'SI') then
            MONTO = MONTO + VRCONSUMO;
        if ((CTADTO IS NULL) OR (CTADTO = '')) then
            MONTO = MONTO * FACTOR;
        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
        if (MONTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTAVENTAS, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT F.ARTI_COD, (FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), FADE_CONSUMO
                    FROM ARTICULO A, FACTURAS_DETALLE F
                    WHERE F.FACT_ID = :IDDOC 
                    INTO :ART, :MONTO, :IMPTOS
                    DO
                    BEGIN
                    if (FOMENTO = 'SI') then
                        MONTO = MONTO + VRCONSUMO;
                    if ((CTADTO IS NULL) OR (CTADTO = '')) then
                        MONTO = MONTO * FACTOR;
                    execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                    if (MONTO <> 0) then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        SUMA = SUMA - MONTO;
                        END
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - MONTO;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - MONTO;
                END
            END /* MONTO <> 0 */
        END /* VENTAS DE CLIENTE O CONSTANTE */
    /* EL IVA EN VENTAS */
    if (IVA = 'A') then
        BEGIN
        FOR SELECT MAX(COAR_CTAIVAV), SUM(FADE_IVAMONTO), SUM(FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), sum(FADE_CONSUMO)
            FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_DETALLE F
            WHERE F.FACT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD
            GROUP BY COAR_CTAIVAV
            INTO :CTAIVA, :IMPTOS, :MONTO, :VALORADIC
        DO
            BEGIN
            if (FOMENTO = 'SI') then
                MONTO = MONTO + VALORADIC;
            MONTO = MONTO * -1;
            MONTO = MONTO * FACTOR;
            IMPTOS = IMPTOS * FACTOR;
            execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
            execute procedure redondee(MONTO, DIG) returning_values (MONTO);
            if (IMPTOS <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTAIVA, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT F.ARTI_COD, FADE_IVAMONTO, (FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), TAIV_PORC, FADE_CONSUMO
                        FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_DETALLE F, TARIFA_IVA T
                        WHERE F.FACT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTAIVAV = :CUENTA AND A.TAIV_COD = T.TAIV_COD
                        INTO :ART, :IMPTOS, :MONTO, :PORCIVA, :VALORADIC
                    DO
                        BEGIN
                        if (FOMENTO = 'SI') then
                            MONTO = MONTO + VALORADIC;
                        MONTO = MONTO * -1;
                        MONTO = MONTO * FACTOR;
                        IMPTOS = IMPTOS * FACTOR;
                        execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                        if (IMPTOS <> 0) then
                            BEGIN
                            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, :MONTO, :PORCIVA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                            NROI = NROI + 1;
                            SUMA = SUMA + DEBITO - CREDITO;
                            END
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, :MONTO, ABS(:IMPTOS*100/:MONTO), :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    NROI = NROI + 1;
                    SUMA = SUMA - IMPTOS;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, :MONTO, ABS(:IMPTOS*100/:MONTO), :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA - IMPTOS;
                    END
                END   /* IMPTOS <> 0 */
            END /* FOR */
        END /* IVA X ARTICULO */
    if (IVA = 'K') then /* IVA EN CTA CONSTANTE */
        BEGIN
        SELECT SUM(FADE_IVAMONTO), SUM(FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), SUM(FADE_CONSUMO)
            FROM FACTURAS_DETALLE F
            WHERE F.FACT_ID = :IDDOC and FADE_IVAMONTO <> 0
            INTO :IMPTOS, :MONTO, :valoradic;
        if (FOMENTO = 'SI') then
            MONTO = MONTO + VALORADIC;
        MONTO = MONTO * -1;
        MONTO = MONTO * FACTOR;
        IMPTOS = IMPTOS * FACTOR;
        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
        execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
        if (IMPTOS <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTAIVA, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT F.ARTI_COD, (FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), FADE_IVAMONTO, TAIV_PORC, FADE_CONSUMO
                    FROM ARTICULO A, FACTURAS_DETALLE F, TARIFA_IVA T
                    WHERE F.FACT_ID = :IDDOC AND A.TAIV_COD = T.TAIV_COD
                    INTO :ART, :MONTO, :IMPTOS, :PORCIVA, :VALORADIC
                    DO
                    BEGIN
                    if (FOMENTO = 'SI') then
                        MONTO = MONTO + VALORADIC;
                    MONTO = MONTO * -1;
                    MONTO = MONTO * FACTOR;
                    IMPTOS = IMPTOS * FACTOR;
                    execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                    execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                    if (IMPTOS <> 0) then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', 0, :IMPTOS, :MONTO, :PORCIVA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        SUMA = SUMA - IMPTOS;
                        END
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', 0, :IMPTOS, :MONTO, ABS(:IMPTOS*100/:MONTO), :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - IMPTOS;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', 0, :IMPTOS, :MONTO, ABS(:IMPTOS*100/:MONTO), :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - IMPTOS;
                END
            END /* IMPTOS <> 0 */
        END /* IVA EN CTA CONSTANTE */
    /* EL IMPOCONSUMO */
    if ((CONSUMO = 'A') AND (FOMENTO <> 'SI')) then
        BEGIN
        FOR SELECT MAX(COAR_CTACONS), SUM(FADE_CONSUMO)
            FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_DETALLE F
            WHERE F.FACT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD
            GROUP BY COAR_CTACONS
            INTO :CTACONSUMO, :IMPTOS
        DO
            BEGIN
            execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
            if (IMPTOS <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTACONSUMO, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, REGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT F.ARTI_COD, FADE_CONSUMO
                        FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_DETALLE F
                        WHERE F.FACT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTACONS = :CUENTA
                        INTO :ART, :IMPTOS
                    DO
                        BEGIN
                        execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                        if (IMPTOS <> 0) then
                            BEGIN
                            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                            NROI = NROI + 1;
                            SUMA = SUMA - IMPTOS;
                            END
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    NROI = NROI + 1;
                    SUMA = SUMA - IMPTOS;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA - IMPTOS;
                    END
                END /* IMPTOS <> 0 */
            END /* FOR */
        END /* CONSUMO X ARTICULO */
    if ((CONSUMO = 'K') AND (FOMENTO <> 'SI')) then /* CONSUMO EN CTA CONSTANTE */
        BEGIN
        SELECT SUM(FADE_CONSUMO)
            FROM FACTURAS_DETALLE F
            WHERE F.FACT_ID = :IDDOC 
            INTO :IMPTOS;
        execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
        if (IMPTOS <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTACONSUMO, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT F.ARTI_COD, FADE_CONSUMO
                    FROM ARTICULO A, FACTURAS_DETALLE F
                    WHERE F.FACT_ID = :IDDOC 
                    INTO :ART, :IMPTOS
                    DO
                    BEGIN
                    execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                    if (IMPTOS <> 0) then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CTACONSUMO, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        SUMA = SUMA - IMPTOS;
                        END
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTACONSUMO, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - IMPTOS;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTACONSUMO, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - IMPTOS;
                END
            END /* IMPTOS <> 0 */
        END /* CONSUMO EN CTA CONSTANTE */
    /* DESCUENTO */
    if ((CTADTO IS NOT NULL) AND (CTADTO <> '')) then
        BEGIN
        execute procedure redondee(VRDTO, DIG) returning_values (VRDTO);
        if (VRDTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTADTO, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRDTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA + VRDTO;
                END
            if (TIPOCUEN = 'N') then
                    BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRDTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA + VRDTO;
                END
            END
        END /* DESCUENTO */
    /* VALOR ADIC */
    if ((CTAADIC IS NOT NULL) AND (CTAADIC <> '')) then
        BEGIN
        execute procedure redondee(VRADIC, DIG) returning_values (VRADIC);
        if (VRADIC <> 0) THEN
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTAADIC, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRADIC, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - VRADIC;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRADIC, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - VRADIC;
                END
            END
        END /* VR. ADIC */
    /* VALOR EXTRA */
    if ((CTAEXTRA IS NOT NULL) AND (CTAEXTRA <> '')) THEN
        BEGIN
        execute procedure redondee(VREXTRA, DIG) returning_values (VREXTRA);
        if (VREXTRA <> 0) THEN
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTAEXTRA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VREXTRA, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - VREXTRA;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VREXTRA, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - VREXTRA;
                END
            END
        END /* VR. EXTRA */
    /* DESCUENTE EL IMPOCONSUMO */
    SELECT SUM(FADE_CONSUMO)
        FROM FACTURAS_DETALLE F WHERE F.FACT_ID = :IDDOC INTO :IMPTOS;
    vrsubt = vrsubt - IMPTOS;
    /* RETENCION FUENTE */
    if ((RTFTE = 'C') or (RTFTE = 'K')) then
      BEGIN
      execute procedure redondee(VRRTFTE, DIG) returning_values (VRRTFTE);
      if (VRRTFTE <> 0) then
        BEGIN
        if (RTFTE = 'C') then
            CTARTFTE = TCTARTFTE;
        EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTARTFTE, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :VRSUBT, :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTFTE;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :VRSUBT, :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTFTE;
            END
        /* AUTORETENCION */
        if (FAUTORET <= fecaux) then
            BEGIN
            EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'CUENTA DE AUTORETENCION EN LA FUENTE') returning_values (CTARTFTE);
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTARTFTE INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERROR (31, :IDDOC, :CTARTFTE, 2);
                CUENTA = CTARTFTE;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                begin
                EXECUTE PROCEDURE ERROR (31, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, (:VRSUBT*-1), :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - VRRTFTE;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, (:VRSUBT*-1), :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - VRRTFTE;
                END
            END
        END /* RTFTE */
      END
    if (RTFTE = 'A') then
      BEGIN
      FOR SELECT MAX(COAR_CTARTFTEV), MAX(COAR_RTFTE), MIN(COAR_RTBASE), SUM(FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), SUM((FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO)*COAR_RTFTE)
        FROM CONTABIL_ARTICULO C, FACTURAS_DETALLE F
        WHERE F.FACT_ID = :IDDOC AND F.ARTI_COD = C.ARTI_COD
        GROUP BY COAR_CTARTFTEV
        INTO :CTARTFTE, :PRTFTE, :baseadic, :MONTO, :VRRTFTE
        DO
        BEGIN
        MONTO = MONTO * FACTOR;
        if (MONTO >= BASEADIC) then
            BEGIN
            VRRTFTE = VRRTFTE * FACTOR / 100;
            execute procedure redondee(VRRTFTE, DIG) returning_values (VRRTFTE);
            execute procedure redondee(MONTO, DIG) returning_values (MONTO);
            if (VRRTFTE <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTARTFTE, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :MONTO, :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    NROI = NROI + 1;
                    SUMA = SUMA + VRRTFTE;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :MONTO, :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA + VRRTFTE;
                    END
                /* AUTORETENCION */
                if (FAUTORET <= fecaux) then
                    BEGIN
                    EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'CUENTA DE AUTORETENCION EN LA FUENTE') returning_values (CTARTFTE);
                    EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTARTFTE, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
                    if (ERRORC <> 0) then
                        ERROR = ERROR + 1;
                    if (TIPOCUEN = 'C') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, (:MONTO*-1), :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                        NROI = NROI + 1;
                        SUMA = SUMA - VRRTFTE;
                        END
                    if (TIPOCUEN = 'N') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, (:MONTO*-1), :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NROI = NROI + 1;
                        SUMA = SUMA - VRRTFTE;
                        END
                    END
                END
            END
        END /* RTFTE */
      END
    /* RETENCION IVA */
    if ((RTIVA = 'C') or (RTIVA = 'K')) then
      BEGIN
      execute procedure redondee(VRRTIVA, DIG) returning_values (VRRTIVA);
      if (VRRTIVA <> 0) then
        BEGIN
        if (RTIVA = 'C') then
            CTARTIVA = TCTARTIVA;
        EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTARTIVA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTIVA, 0, :VRIVA, :PORC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTIVA;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTIVA, 0, :VRIVA, :PORC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTIVA;
            END
        END /* RTIVA */
      END
    /* RETENCION DE ICA */
    if ((RTICA = 'C') or (RTICA = 'K')) then
      BEGIN
      execute procedure redondee(VRRTICA, DIG) returning_values (VRRTICA);
      if (VRRTICA <> 0) then
        BEGIN
        if (RTICA = 'C') then
            CTARTICA = TCTARTICA;
        EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTARTICA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTICA, 0, :VRSUBT, :PRTICA, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTICA;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTICA, 0, :VRSUBT, :PRTICA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTICA;
            END
        END /* RTICA */
      END
    /* CIERRE EL COMPROBANTE CONTRA LA CUENTA DEL TERCERO O LA CONSTANTE */
    if ((SUMA <> 0) and ((CARTERA = 'C') or (CARTERA = 'K') or (CARTERA = 'J'))) then
        BEGIN
        if (SUMA < 0) then
            BEGIN
            DEBITO = SUMA * -1;
            CREDITO = 0;
            END
        ELSE
            BEGIN
            DEBITO = 0;
            CREDITO = SUMA;
            END
        if (CARTERA = 'C') then
            CTACARTERA = TCTACLIEN;
        if (CARTERA = 'J') then
            BEGIN
            /* BUSQUE LA CUENTA DE LA CAJA */
            SELECT CAJA_CUENTA FROM CAJAS C, PUNTO_VENTA P
                WHERE P.CAJA_ID = C.CAJA_ID AND PTVT_ID = :PTOVTA
                INTO :CTACARTERA;
            END
        EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTACARTERA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :DEBITO, :CREDITO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
        if (TIPOCUEN = 'N') then
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :DEBITO, :CREDITO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
        NROI = NROI + 1;
        END /* SUMA EN CARTERA */
    /* CALCULE COSTOS EN VENTAS */
    EXECUTE PROCEDURE COSTO_EN_VENTAS(31, :IDDOC);
    if (COSTOS = 'A') then
        BEGIN
        FOR SELECT MAX(CTACOS), SUM(CAST(CANT AS DOUBLE PRECISION) * COSTO)
            FROM COSTO_VENTAS
            GROUP BY CTACOS
            INTO :CTACOSTOS, :MONTO
        DO
            BEGIN
            if (MONTO <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTACOSTOS, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT ARTI_COD, CANT * COSTO
                        FROM COSTO_VENTAS
                        WHERE CTACOS = :CUENTA
                        INTO :ART, :MONTO
                    DO
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    NROI = NROI + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    END
                END /* MONTO <> 0 */
            END /* FOR */
        END /* COSTOS */
    if (COSTOS = 'K') then
        BEGIN
        SELECT SUM(CAST(CANT AS DOUBLE PRECISION) * COSTO)
            FROM COSTO_VENTAS
            INTO :MONTO;
        if (MONTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTACOSTOS, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, REGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT ARTI_COD, CANT * COSTO
                    FROM COSTO_VENTAS
                    INTO :ART, :MONTO
                DO
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTACOSTOS, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                    NROI = NROI + 1;
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTACOSTOS, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTACOSTOS, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                END
            END /* MONTO <> 0 */
        END /* COSTOS = K */
    if (INVEN = 'A') then
        BEGIN
        FOR SELECT MAX(CTAINV), SUM(CAST(CANT AS DOUBLE PRECISION) * COSTO)
            FROM COSTO_VENTAS
            GROUP BY CTAINV
            INTO :CTAINVEN, :MONTO
        DO
            BEGIN
            if (MONTO <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTAINVEN, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, REGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT ARTI_COD, CANT * COSTO
                        FROM COSTO_VENTAS
                        WHERE CTAINV = :CUENTA
                        INTO :ART, :MONTO
                    DO
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    NROI = NROI + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    END
                END /* MONTO <> 0 */
            END /* FOR */
        END /* INVEN = A */
    if (INVEN = 'K') then
        BEGIN
        SELECT SUM(CAST(CANT AS DOUBLE PRECISION) * COSTO)
            FROM COSTO_VENTAS
            INTO :MONTO;
        if (MONTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTAINVEN, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT ARTI_COD, CANT * COSTO
                    FROM COSTO_VENTAS
                    INTO :ART, :MONTO
                DO
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTAINVEN, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                    NROI = NROI + 1;
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAINVEN, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAINVEN, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                END
            END /* MONTO <> 0 */
        END /* INVEN = K */
    /* recorra las cuentas adicionales */
    FOR SELECT INVC_CUENTA, INVC_BASE, INVC_PORC, INVC_VALOR, INVC_DB
        FROM INTERFAZ_VENTAS_CTAS
        WHERE INVE_ID = :IDINTER
        INTO :CTADIC, :BASEADIC, :PORCADIC, :VALORADIC, :DBADIC
        DO
        BEGIN
        if (VALORADIC <> 0) then
            MONTO = VALORADIC;
        ELSE
            BEGIN
            if (:BASEADIC = 'SUBTOTAL') then
                VALORADIC = vrsubt;
            if (:BASEADIC = 'DESCUENTO') then
                VALORADIC = VRDTO;
            if (:BASEADIC = 'IVA') then
                VALORADIC = VRIVA;
            if (:BASEADIC = 'ADICIONAL') then
                VALORADIC = VRADIC;
            if (:BASEADIC = 'EXTRA') then
                VALORADIC = VREXTRA;
            if (:BASEADIC = 'TOTAL') then
                VALORADIC = VRTOTAL;
            MONTO = VALORADIC * PORCADIC / 100;
            END
        if (MONTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTADIC, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                if (DBADIC = 'S') then
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                ELSE
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                if (DBADIC = 'S') then
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                ELSE
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                END
            NROI = NROI + 1;
            END
        END
    if (ERROR > 0) then
        VER = 'S';
    SUSPEND;
    END /* NO ANULADO */
  END /* EXISTE LA INTERFAZ */
ELSE
    BEGIN
    EXECUTE PROCEDURE ERROR (31, :IDDOC, :PREF, 1);
    ERROR = ERROR + 1;
    VER = 'S';
    SUSPEND;
    END
END

^

SET TERM ; ^

SET TERM ^ ;

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

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE CONTABIL_FACTURAS_CONTADO(
    FECFAC DATE,
    NIT VARCHAR(20),
    PREF VARCHAR(4),
    PTVTA INTEGER,
    IDINTER INTEGER)
RETURNS (
    ERROR INTEGER,
    VER CHAR(1),
    IDC INTEGER)
AS
declare variable num varchar(8);
declare variable numero varchar(10);
declare variable fecha char(8);
declare variable conc char(120);
declare variable vence char(8);
declare variable vrdto numeric(18,2);
declare variable vradic numeric(18,2);
declare variable vrsubt numeric(18,2);
declare variable vriva numeric(18,2);
declare variable prtfte numeric(9,2);
declare variable vrrtfte numeric(18,2);
declare variable vrrtiva numeric(18,2);
declare variable prtica numeric(9,2);
declare variable vrrtica numeric(18,2);
declare variable vrtotal numeric(18,2);
declare variable vrextra numeric(18,2);
declare variable tipocomp varchar(3);
declare variable prefcont varchar(4);
declare variable ventas char(1);
declare variable ctaventas varchar(20);
declare variable iva char(1);
declare variable ctaiva varchar(20);
declare variable consumo char(1);
declare variable ctaconsumo varchar(20);
declare variable cartera char(1);
declare variable ctacartera varchar(20);
declare variable rtfte char(1);
declare variable ctartfte varchar(20);
declare variable rtiva char(1);
declare variable ctartiva varchar(20);
declare variable rtica char(1);
declare variable ctartica varchar(20);
declare variable inven char(1);
declare variable ctainven varchar(20);
declare variable costos char(1);
declare variable ctacostos varchar(20);
declare variable ctadto varchar(20);
declare variable ctaadic varchar(20);
declare variable ctaextra varchar(20);
declare variable existe char(1);
declare variable cuenta varchar(20);
declare variable monto numeric(18,2);
declare variable tipocuen char(1);
declare variable nombre varchar(60);
declare variable proy varchar(4);
declare variable centro varchar(4);
declare variable porc numeric(5,2);
declare variable debito numeric(18,2);
declare variable credito numeric(18,2);
declare variable nroi integer;
declare variable art varchar(15);
declare variable impinc char(1);
declare variable imptos numeric(18,2);
declare variable suma numeric(18,2);
declare variable porciva numeric(9,2);
declare variable tctaclien varchar(20);
declare variable tctaventa varchar(20);
declare variable tctartfte varchar(20);
declare variable tctartiva varchar(20);
declare variable tctartica varchar(20);
declare variable ctadic varchar(20);
declare variable baseadic varchar(20);
declare variable porcadic numeric(5,2);
declare variable valoradic numeric(18,2);
declare variable dbadic char(1);
declare variable ptovta integer;
declare variable dig integer;
declare variable mercancia numeric(18,2);
declare variable factor double precision;
declare variable cent char(1);
BEGIN
/* BUSQUE LA INTERFACE */
EXISTE = 'N';
SELECT 'S', TICO_COD, PRCO_PRE, INVE_VENTAS, INVE_IVA, INVE_CONSUMO, INVE_CARTERA, INVE_RTFTE, INVE_RTIVA, INVE_RTICA, INVE_COSTO, INVE_INVEN, INVE_CTAVENTAS, INVE_CTAIVA, INVE_CTACONSUMO, INVE_CTADTO, INVE_CTAADIC, INVE_CTAEXTRA, INVE_CTACARTERA, INVE_CTARTFTE, INVE_CTARTIVA, INVE_CTARTICA, INVE_CTAINVEN, INVE_CTACOSTOS, INVE_CONFIRMAR, INVE_CENTRO
    FROM INTERFAZ_VENTAS
    WHERE INVE_ID = :IDINTER
    INTO :EXISTE, :TIPOCOMP, :PREFCONT, :VENTAS, :IVA, :CONSUMO, :CARTERA, :RTFTE, :RTIVA, :RTICA, :COSTOS, :INVEN, :CTAVENTAS, :CTAIVA, :CTACONSUMO, :CTADTO, :CTAADIC, :CTAEXTRA, :CTACARTERA, :CTARTFTE, :CTARTIVA, :CTARTICA, :CTAINVEN, :CTACOSTOS, :VER, :CENT;
if (EXISTE = 'S') then
  BEGIN
  /* BORRE CUALQUEIR CONTABILIZACION PREVIA */
/*  DELETE FROM CONTABILIZACION WHERE CNTB_TIPOREF = 31 AND CNTB_IDREF = 0;
  /* BUSQUE EL CENTRO DEL PUNTO, LA BODEGA, O EL PREFIJO  */
  IF (CENT = 'B') THEN
    SELECT B.BODE_CENTRO, B.BODE_PROY FROM BODEGA B, PUNTO_VENTA P
        WHERE B.BODE_COD = P.BODE_COD AND P.ptvt_id = :ptvta INTO :CENTRO, :PROY;
  IF (CENT = 'V') THEN
    SELECT MAX(V.CENT_COD), MAX(V.PROY_COD) FROM VENDEDORES V
        WHERE V.PTVT_ID = :PTVTA INTO :CENTRO, :PROY;
  IF (CENT = 'P') THEN
    SELECT P.PREF_PROY, P.PREF_CENTRO FROM PREFIJOS P
        WHERE P.PREF_PRE = :PREF AND P.TIDO_COD = 31 INTO :CENTRO, :PROY;
  /* TRAIGA LOS DATOS DEL CLIENTE */
  SELECT TERC_NOM, TERC_CTARTFTE, TERC_CTARTIVA, TERC_CTARTICA, TERC_CTAVENTA, TERC_CTACLIENTE
        FROM TERCEROS T WHERE TERC_NIT = :NIT
        INTO :NOMBRE, TCTARTFTE, TCTARTIVA, TCTARTICA, TCTAVENTA, TCTACLIEN;
  SELECT SUM(FACT_DTOMONTO), SUM(FACT_ADICIONAL), SUM(FACT_IVAMONTO), SUM(FACT_EXTRA), SUM(FACT_TOTAL), SUM(FACT_RTFTEMONTO), SUM(FACT_RTIVAMONTO), SUM(FACT_RTICAMONTO), MAX(FACT_IVAINC)
        FROM FACTURAS F WHERE FACT_FECHA = :FECFAC AND FACT_ANULADO = 'N' AND PTVT_ID = :ptvta AND PREF_PRE = :PREF
        INTO :VRDTO, :VRADIC, :VRIVA, :VREXTRA, :VRTOTAL, :VRRTFTE, :VRRTIVA, :VRRTICA, :impinc;
  VRSUBT = VRTOTAL - VREXTRA - VRIVA; /* BASE DE RETEFTE Y RETEICA */
  MERCANCIA = VRSUBT - VRADIC + VRDTO;
  EXECUTE PROCEDURE FECHA_A_CONTA(:FECFAC) returning_values (:FECHA);
  VENCE = FECHA;
  /* REGISTRE EL ENCABEZADO CONTABLE */
  IDC = GEN_ID(ID_CONTABILIZA, 1);
  CONC = 'RESUMEN VENTAS ' || FECHA;
  NUM = SUBSTR(FECHA, 3, 8);
  INSERT INTO CONTABILIZACION (CNTB_ID, CNTB_TIPOCOMP, CNTB_PREFCNT, CNTB_NUMERO, CNTB_FECHA, CNTB_CONCEPTO, CNTB_REF, CNTB_TIPOREF, CNTB_IDREF, CNTB_PREFREF, CNTB_NUMREF, CNTB_PROCESADO)
        VALUES (:IDC, :TIPOCOMP, :PREFCONT, :NUM, :FECHA, :CONC, '', 0, 0, :PREF, :NUM, 'N');
  NROI = 0;
  SUMA = 0;
  ERROR = 0;
  /* SI NO HAY CUENTA DE DESCUENTO NI ADICIONAL CALCULE UN FACTOR PARA LAS VENTAS Y EL IVA */
  if (MERCANCIA <> 0) then
    FACTOR = CAST(VRSUBT AS DOUBLE PRECISION) / CAST(MERCANCIA AS DOUBLE PRECISION);
  ELSE
    FACTOR = 1;
  /* TRAIGA EL NUMERO DE DIGITOS PARA EL REDONDEO */
  SELECT CAST(CONF_VALOR AS INTEGER) FROM CONFIGURACION WHERE CONF_MODULO = 'FACTURACION' AND
        CONF_CATEGORIA = 'GENERAL' AND CONF_PROPIEDAD = 'REDONDEO AL MULTIPLO DE DIEZ EN TOTALES' INTO :DIG;
  /* CUENTAS DE VENTAS */
  if (VENTAS = 'A') then
        BEGIN
        FOR SELECT MAX(COAR_CTAVNT), SUM(CAST(FADE_CANT AS DOUBLE PRECISION) * (FADE_PRUNIT-FADE_DTOMONTO)), SUM(FADE_IVAMONTO+FADE_CONSUMO)
            FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_DETALLE FD, FACTURAS F
            WHERE F.FACT_ID = FD.FACT_ID AND FACT_FECHA = :FECFAC AND FD.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND F.PREF_PRE = :PREF AND F.PTVT_ID = :PTVTA AND FACT_ANULADO = 'N'
            GROUP BY COAR_CTAVNT
            INTO :CTAVENTAS, :MONTO, :IMPTOS
            DO
            BEGIN
            if (IMPINC = 'S') then
                MONTO = MONTO - IMPTOS;
            if ((CTADTO IS NULL) OR (CTADTO = '')) then
                MONTO = MONTO * FACTOR;
            execute procedure redondee(MONTO, DIG) returning_values (MONTO);
            if (MONTO <> 0) then
                BEGIN
                CUENTA = NULL;
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :CTAVENTAS INTO :CUENTA, :TIPOCUEN;
                if (CUENTA IS NULL) then
                    begin
                    EXECUTE PROCEDURE ERROR (31, 0, :CTAVENTAS, 2);
                    CUENTA = CTAVENTAS;
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT FD.ARTI_COD, (CAST(FADE_CANT AS DOUBLE PRECISION) * (FADE_PRUNIT-FADE_DTOMONTO)), (FADE_IVAMONTO+FADE_CONSUMO)
                        FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_DETALLE FD, FACTURAS F
                        WHERE F.FACT_ID = FD.FACT_ID AND FACT_FECHA = :FECFAC AND F.PREF_PRE = :PREF AND F.PTVT_ID = :PTVTA AND FD.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTAINV = :CUENTA AND FACT_ANULADO = 'N'
                        INTO :ART, :MONTO, :IMPTOS
                    DO
                        BEGIN
                        if (IMPINC = 'S') then
                            MONTO = MONTO - IMPTOS;
                        if ((CTADTO IS NULL) OR (CTADTO = '')) then
                            MONTO = MONTO * FACTOR;
                        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                        if (MONTO <> 0) then
                            BEGIN
                            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                            NROI = NROI + 1;
                            SUMA = SUMA - MONTO;
                            END
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    NROI = NROI + 1;
                    SUMA = SUMA - MONTO;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA - MONTO;
                    END
                END /* MONTO <> 0 */
            END /* FOR */
        END /* VENTAS X ARTICULO */
     IF ((VENTAS = 'C') OR (VENTAS = 'K')) THEN
        BEGIN
        IF (VENTAS = 'C') THEN
            CTAVENTAS = TCTAVENTA;
        SELECT SUM(CAST(FADE_CANT AS DOUBLE PRECISION) * (FADE_PRUNIT-FADE_DTOMONTO)), SUM(FADE_IVAMONTO+FADE_CONSUMO)
            FROM FACTURAS_DETALLE FD, FACTURAS F
            WHERE F.FACT_ID = FD.FACT_ID AND FACT_FECHA = :FECFAC AND F.PREF_PRE = :PREF AND F.PTVT_ID = :PTVTA AND FACT_ANULADO = 'N'
            INTO :MONTO, :IMPTOS;
        if (IMPINC = 'S') then
            MONTO = MONTO - IMPTOS;
        if ((CTADTO IS NULL) OR (CTADTO = '')) then
            MONTO = MONTO * FACTOR;
        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
        if (MONTO <> 0) then
            BEGIN
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTAVENTAS INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERROR (31, 0, :CTAVENTAS, 2);
                CUENTA = CTAVENTAS;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT FD.ARTI_COD, (CAST(FADE_CANT AS DOUBLE PRECISION) * (FADE_PRUNIT-FADE_DTOMONTO)), (FADE_IVAMONTO+FADE_CONSUMO)
                    FROM /*ARTICULO A,*/ FACTURAS_DETALLE FD, FACTURAS F
                    WHERE F.FACT_ID = FD.FACT_ID AND FACT_FECHA = :FECFAC AND F.PREF_PRE = :PREF AND F.PTVT_ID = :PTVTA AND FACT_ANULADO = 'N'
                    INTO :ART, :MONTO, :IMPTOS
                    DO
                    BEGIN
                    if (IMPINC = 'S') then
                        MONTO = MONTO - IMPTOS;
                    if ((CTADTO IS NULL) OR (CTADTO = '')) then
                        MONTO = MONTO * FACTOR;
                    execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                    if (MONTO <> 0) then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        SUMA = SUMA - MONTO;
                        END
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - MONTO;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - MONTO;
                END
            END /* MONTO <> 0 */
        END /* VENTAS DE CLIENTE O CONSTANTE */
    /* EL IVA EN VENTAS */
    if (IVA = 'A') then
        BEGIN
        FOR SELECT MAX(COAR_CTAIVAV), SUM(FADE_IVAMONTO), SUM(CAST(FADE_CANT AS DOUBLE PRECISION) * (FADE_PRUNIT-FADE_DTOMONTO)), sum(FADE_CONSUMO)
            FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_DETALLE FD, FACTURAS F
            WHERE F.FACT_ID = FD.FACT_ID AND FACT_FECHA = :FECFAC AND F.PREF_PRE = :PREF AND F.PTVT_ID = :PTVTA AND FD.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND FACT_ANULADO = 'N'
            GROUP BY COAR_CTAIVAV
            INTO :CTAIVA, :IMPTOS, :MONTO, :VALORADIC
        DO
            BEGIN
            if (IMPINC = 'S') then
                MONTO = MONTO - IMPTOS - VALORADIC;
            MONTO = MONTO * -1;
            MONTO = MONTO * FACTOR;
            IMPTOS = IMPTOS * FACTOR;
            execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
            execute procedure redondee(MONTO, DIG) returning_values (MONTO);
            if (IMPTOS <> 0) then
                BEGIN
                CUENTA = NULL;
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :CTAIVA INTO :CUENTA, :TIPOCUEN;
                if (CUENTA IS NULL) then
                    begin
                    EXECUTE PROCEDURE ERROR (31, 0, :CTAIVA, 2);
                    CUENTA = CTAIVA;
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT FD.ARTI_COD, FADE_IVAMONTO, (CAST(FADE_CANT AS DOUBLE PRECISION) * (FADE_PRUNIT-FADE_DTOMONTO)), TAIV_PORC, FADE_CONSUMO
                        FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_DETALLE FD, FACTURAS F, TARIFA_IVA T
                        WHERE F.FACT_ID = FD.FACT_ID AND FACT_FECHA = :FECFAC AND F.PREF_PRE = :PREF AND F.PTVT_ID = :PTVTA AND FD.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTAIVAV = :CUENTA AND A.TAIV_COD = T.TAIV_COD AND FACT_ANULADO = 'N'
                        INTO :ART, :IMPTOS, :MONTO, :PORCIVA, :VALORADIC
                    DO
                        BEGIN
                        if (IMPINC = 'S') then
                            MONTO = MONTO - IMPTOS - VALORADIC;
                        MONTO = MONTO * -1;
                        MONTO = MONTO * FACTOR;
                        IMPTOS = IMPTOS * FACTOR;
                        execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                        if (IMPTOS <> 0) then
                            BEGIN
                            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, :MONTO, :PORCIVA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                            NROI = NROI + 1;
                            SUMA = SUMA + DEBITO - CREDITO;
                            END
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, :MONTO, ABS(:IMPTOS*100/:MONTO), :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    NROI = NROI + 1;
                    SUMA = SUMA - IMPTOS;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, :MONTO, ABS(:IMPTOS*100/:MONTO), :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA - IMPTOS;
                    END
                END   /* IMPTOS <> 0 */
            END /* FOR */
        END /* IVA X ARTICULO */
    if (IVA = 'K') then /* IVA EN CTA CONSTANTE */
        BEGIN
        SELECT SUM(FADE_IVAMONTO), SUM(CAST(FADE_CANT AS DOUBLE PRECISION) * (FADE_PRUNIT-FADE_DTOMONTO)), SUM(FADE_CONSUMO)
            FROM FACTURAS_DETALLE FD, FACTURAS F
            WHERE F.FACT_ID = FD.FACT_ID AND FACT_FECHA = :FECFAC AND F.PREF_PRE = :PREF AND F.PTVT_ID = :PTVTA AND FACT_ANULADO = 'N'
            INTO :IMPTOS, :MONTO, :valoradic;
        if (IMPINC = 'S') then
            MONTO = MONTO - IMPTOS - VALORADIC;
        MONTO = MONTO * -1;
        MONTO = MONTO * FACTOR;
        IMPTOS = IMPTOS * FACTOR;
        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
        execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
        if (IMPTOS <> 0) then
            BEGIN
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTAIVA INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERROR (31, 0, :CTAIVA, 2);
                CUENTA = CTAIVA;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT FD.ARTI_COD, (CAST(FADE_CANT AS DOUBLE PRECISION) * (FADE_PRUNIT-FADE_DTOMONTO)), FADE_IVAMONTO, TAIV_PORC, FADE_CONSUMO
                    FROM ARTICULO A, FACTURAS_DETALLE FD, FACTURAS F, TARIFA_IVA T
                    WHERE F.FACT_ID = FD.FACT_ID AND FACT_FECHA = :FECFAC AND F.PREF_PRE = :PREF AND F.PTVT_ID = :PTVTA AND FD.arti_cod = A.arti_cod AND T.TAIV_COD=A.TAIV_COD AND FACT_ANULADO = 'N'
                    INTO :ART, :MONTO, :IMPTOS, :PORCIVA, :VALORADIC
                    DO
                    BEGIN
                    if (IMPINC = 'S') then
                        MONTO = MONTO - IMPTOS - VALORADIC;
                    MONTO = MONTO * -1;
                    MONTO = MONTO * FACTOR;
                    IMPTOS = IMPTOS * FACTOR;
                    execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                    execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                    if (IMPTOS <> 0) then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', 0, :IMPTOS, :MONTO, :PORCIVA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        SUMA = SUMA - IMPTOS;
                        END
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', 0, :IMPTOS, :MONTO, ABS(:IMPTOS*100/:MONTO), :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - IMPTOS;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', 0, :IMPTOS, :MONTO, ABS(:IMPTOS*100/:MONTO), :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - IMPTOS;
                END
            END /* IMPTOS <> 0 */
        END /* IVA EN CTA CONSTANTE */
    /* EL IMPOCONSUMO */
    if (CONSUMO = 'A') then
        BEGIN
        FOR SELECT MAX(COAR_CTACONS), SUM(FADE_CONSUMO)
            FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_DETALLE FD, FACTURAS F
            WHERE F.FACT_ID = FD.FACT_ID AND FACT_FECHA = :FECFAC AND F.PREF_PRE = :PREF AND F.PTVT_ID = :PTVTA AND FD.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND FACT_ANULADO = 'N'
            GROUP BY COAR_CTACONS
            INTO :CTACONSUMO, :IMPTOS
        DO
            BEGIN
            execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
            if (IMPTOS <> 0) then
                BEGIN
                CUENTA = NULL;
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :CTACONSUMO INTO :CUENTA, :TIPOCUEN;
                if (CUENTA IS NULL) then
                    begin
                    EXECUTE PROCEDURE ERROR (31, 0, :CTACONSUMO, 2);
                    CUENTA = CTACONSUMO;
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, REGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT FD.ARTI_COD, FADE_CONSUMO
                        FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_DETALLE FD, FACTURAS F
                        WHERE F.FACT_ID = FD.FACT_ID AND FACT_FECHA = :FECFAC AND F.PREF_PRE = :PREF AND F.PTVT_ID = :PTVTA AND FD.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTACONS = :CUENTA AND FACT_ANULADO = 'N'
                        INTO :ART, :IMPTOS
                    DO
                        BEGIN
                        execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                        if (IMPTOS <> 0) then
                            BEGIN
                            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                            NROI = NROI + 1;
                            SUMA = SUMA - IMPTOS;
                            END
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    NROI = NROI + 1;
                    SUMA = SUMA - IMPTOS;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA - CREDITO;
                    END
                END /* IMPTOS <> 0 */
            END /* FOR */
        END /* CONSUMO X ARTICULO */
    if (CONSUMO = 'K') then /* CONSUMO EN CTA CONSTANTE */
        BEGIN
        SELECT SUM(FADE_CONSUMO)
            FROM FACTURAS_DETALLE FD, FACTURAS F
            WHERE F.FACT_ID = FD.FACT_ID AND FACT_FECHA = :FECFAC AND F.PREF_PRE = :PREF AND F.PTVT_ID = :PTVTA AND FACT_ANULADO = 'N'
            INTO :IMPTOS;
        execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
        if (IMPTOS <> 0) then
            BEGIN
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTACONSUMO INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERROR (31, 0, :CTACONSUMO, 2);
                CUENTA = CTACONSUMO;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT FD.ARTI_COD, FADE_CONSUMO
                    FROM /*ARTICULO A,*/ FACTURAS_DETALLE FD, FACTURAS F
                    WHERE F.FACT_ID = FD.FACT_ID AND FACT_FECHA = :FECFAC AND F.PREF_PRE = :PREF AND F.PTVT_ID = :PTVTA AND FACT_ANULADO = 'N'
                    INTO :ART, :IMPTOS
                    DO
                    BEGIN
                    execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                    if (IMPTOS <> 0) then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CTACONSUMO, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        SUMA = SUMA - IMPTOS;
                        END
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTACONSUMO, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - IMPTOS;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTACONSUMO, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - IMPTOS;
                END
            END /* IMPTOS <> 0 */
        END /* CONSUMO EN CTA CONSTANTE */
    /* DESCUENTO */
    if ((CTADTO IS NOT NULL) AND (CTADTO <> '')) then
        BEGIN
        execute procedure redondee(VRDTO, DIG) returning_values (VRDTO);
        if (VRDTO <> 0) then
            BEGIN
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTADTO INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERROR (31, 0, :CTADTO, 2);
                CUENTA = CTADTO;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                begin
                EXECUTE PROCEDURE ERROR (31, 0, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRDTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA + VRDTO;
                END
            if (TIPOCUEN = 'N') then
                    BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRDTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA + VRDTO;
                END
            END
        END /* DESCUENTO */
    /* VALOR ADIC */
    if ((CTAADIC IS NOT NULL) AND (CTAADIC <> '')) then
        BEGIN
        execute procedure redondee(VRADIC, DIG) returning_values (VRADIC);
        if (VRADIC <> 0) THEN
            BEGIN
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTAADIC INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERROR (31, 0, :CTAADIC, 2);
                CUENTA = CTAADIC;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                begin
                EXECUTE PROCEDURE ERROR (31, 0, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRADIC, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - VRADIC;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRADIC, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - VRADIC;
                END
            END
        END /* VR. ADIC */
    /* VALOR EXTRA */
    if ((CTAEXTRA IS NOT NULL) AND (CTAEXTRA <> '')) THEN
        BEGIN
        execute procedure redondee(VREXTRA, DIG) returning_values (VREXTRA);
        if (VREXTRA <> 0) THEN
            BEGIN
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTAEXTRA INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERROR (31, 0, :CTAEXTRA, 2);
                CUENTA = CTAEXTRA;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                begin
                EXECUTE PROCEDURE ERROR (31, 0, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VREXTRA, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - VREXTRA;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VREXTRA, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - VREXTRA;
                END
            END
        END /* VR. EXTRA */
    /* RETENCION FUENTE */
    if ((RTFTE = 'C') or (RTFTE = 'K')) then
      BEGIN
      execute procedure redondee(VRRTFTE, DIG) returning_values (VRRTFTE);
      if (VRRTFTE <> 0) then
        BEGIN
        if (RTFTE = 'C') then
            CTARTFTE = TCTARTFTE;
        CUENTA = NULL;
        SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
            WHERE CUEN_COD = :CTARTFTE INTO :CUENTA, :TIPOCUEN;
        if (CUENTA IS NULL) then
            begin
            EXECUTE PROCEDURE ERROR (31, 0, :CTARTFTE, 2);
            CUENTA = CTARTFTE;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            begin
            EXECUTE PROCEDURE ERROR (31, 0, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :VRSUBT, :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTFTE;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :VRSUBT, :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTFTE;
            END
        END /* RTFTE */
      END
    /* RETENCION IVA */
    if ((RTIVA = 'C') or (RTIVA = 'K')) then
      BEGIN
      execute procedure redondee(VRRTIVA, DIG) returning_values (VRRTIVA);
      if (VRRTIVA <> 0) then
        BEGIN
        if (RTIVA = 'C') then
            CTARTIVA = TCTARTIVA;
        CUENTA = NULL;
        SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
            WHERE CUEN_COD = :CTARTIVA INTO :CUENTA, :TIPOCUEN;
        if (CUENTA IS NULL) then
            begin
            EXECUTE PROCEDURE ERROR (31, 0, :CTARTIVA, 2);
            CUENTA = CTARTIVA;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            begin
            EXECUTE PROCEDURE ERROR (31, 0, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTIVA, 0, :VRIVA, :PORC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTIVA;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTIVA, 0, :VRIVA, :PORC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTIVA;
            END
        END /* RTIVA */
      END
    /* RETENCION DE ICA */
    if ((RTICA = 'C') or (RTICA = 'K')) then
      BEGIN
      execute procedure redondee(VRRTICA, DIG) returning_values (VRRTICA);
      if (VRRTICA <> 0) then
        BEGIN
        if (RTICA = 'C') then
            CTARTICA = TCTARTICA;
        CUENTA = NULL;
        SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
            WHERE CUEN_COD = :CTARTICA INTO :CUENTA, :TIPOCUEN;
        if (CUENTA IS NULL) then
            begin
            EXECUTE PROCEDURE ERROR (31, 0, :CTARTICA, 2);
            CUENTA = CTARTICA;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            begin
            EXECUTE PROCEDURE ERROR (31, 0, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTICA, 0, :VRSUBT, :PRTICA, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTICA;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTICA, 0, :VRSUBT, :PRTICA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTICA;
            END
        END /* RTICA */
      END
    /* CIERRE EL COMPROBANTE CONTRA LA CUENTA DEL TERCERO O LA CONSTANTE */
    if ((SUMA <> 0) and ((CARTERA = 'C') or (CARTERA = 'K') or (CARTERA = 'J'))) then
        BEGIN
        if (SUMA < 0) then
            BEGIN
            DEBITO = SUMA * -1;
            CREDITO = 0;
            END
        ELSE
            BEGIN
            DEBITO = 0;
            CREDITO = SUMA;
            END
        if (CARTERA = 'C') then
            CTACARTERA = TCTACLIEN;
        if (CARTERA = 'J') then
            BEGIN
            /* BUSQUE LA CUENTA DE LA CAJA */
            SELECT CAJA_CUENTA FROM CAJAS C, PUNTO_VENTA P
                WHERE P.CAJA_ID = C.CAJA_ID AND PTVT_ID = :PTOVTA
                INTO :CTACARTERA;
            END
        CUENTA = NULL;
        SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
            WHERE CUEN_COD = :CTACARTERA INTO :CUENTA, :TIPOCUEN;
        if (CUENTA IS NULL) then
            begin
            EXECUTE PROCEDURE ERROR (31, 0, :CTACARTERA, 2);
            CUENTA = CTACARTERA;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            begin
            EXECUTE PROCEDURE ERROR (31, 0, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'C') then
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :DEBITO, :CREDITO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
        if (TIPOCUEN = 'N') then
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :DEBITO, :CREDITO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
        NROI = NROI + 1;
        END /* SUMA EN CARTERA */
    /* CALCULE LOS COSTOS */
    EXECUTE PROCEDURE costo_en_ventas_contado(:fecfac,  :pref, :ptvta);
    if (COSTOS = 'A') then
        BEGIN
        FOR SELECT MAX(CTACOS), SUM(COSTO)
            FROM COSTO_VENTAS
            GROUP BY CTACOS
            INTO :CTACOSTOS, :MONTO
        DO
            BEGIN
            if (MONTO <> 0) then
                BEGIN
                CUENTA = NULL;
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :CTACOSTOS INTO :CUENTA, :TIPOCUEN;
                IF (CUENTA IS NULL) THEN
                    begin
                    EXECUTE PROCEDURE ERROR (31, 0, :CTACOSTOS, 2);
                    CUENTA = CTARTFTE;
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT ARTI_COD, CANT * COSTO
                        FROM COSTO_VENTAS
                        WHERE CTACOS = :CUENTA
                        INTO :ART, :MONTO
                    DO
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    NROI = NROI + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    END
                END /* MONTO <> 0 */
            END /* FOR */
        END /* COSTOS */
    if (COSTOS = 'K') then
        BEGIN
        SELECT SUM(COSTO)
            FROM COSTO_VENTAS
            INTO :MONTO;
        if (MONTO <> 0) then
            BEGIN
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTACOSTOS INTO :CUENTA, :TIPOCUEN;
            IF (CUENTA IS NULL) THEN
                begin
                EXECUTE PROCEDURE ERROR (31, 0, :CTACOSTOS, 2);
                CUENTA = CTARTFTE;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, REGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT ARTI_COD, CANT * COSTO
                    FROM COSTO_VENTAS
                    INTO :ART, :MONTO
                DO
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTACOSTOS, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                    NROI = NROI + 1;
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTACOSTOS, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTACOSTOS, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                END
            END /* MONTO <> 0 */
        END /* COSTOS = K */
    if (INVEN = 'A') then
        BEGIN
        FOR SELECT MAX(CTAINV), SUM(COSTO)
            FROM COSTO_VENTAS
            GROUP BY CTAINV
            INTO :CTAINVEN, :MONTO
        DO
            BEGIN
            if (MONTO <> 0) then
                BEGIN
                CUENTA = NULL;
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :CTAINVEN INTO :CUENTA, :TIPOCUEN;
                IF (CUENTA IS NULL) THEN
                    begin
                    EXECUTE PROCEDURE ERROR (31, 0, :CTAINVEN, 2);
                    CUENTA = CTAINVEN;
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, REGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT ARTI_COD, CANT * COSTO
                        FROM COSTO_VENTAS
                        WHERE CTAINV = :CUENTA
                        INTO :ART, :MONTO
                    DO
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    NROI = NROI + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    END
                END /* MONTO <> 0 */
            END /* FOR */
        END /* INVEN = A */
    if (INVEN = 'K') then
        BEGIN
        SELECT SUM(COSTO)
            FROM COSTO_VENTAS
            INTO :MONTO;
        if (MONTO <> 0) then
            BEGIN
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTAINVEN INTO :CUENTA, :TIPOCUEN;
            IF (CUENTA IS NULL) THEN
                begin
                EXECUTE PROCEDURE ERROR (31, 0, :CTAINVEN, 2);
                CUENTA = CTAINVEN;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT ARTI_COD, CANT * COSTO
                    FROM COSTO_VENTAS
                    INTO :ART, :MONTO
                DO
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTAINVEN, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                    NROI = NROI + 1;
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAINVEN, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAINVEN, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                END
            END /* MONTO <> 0 */
        END /* INVEN = K */
    /* recorra las cuentas adicionales */
    FOR SELECT INVC_CUENTA, INVC_BASE, INVC_PORC, INVC_VALOR, INVC_DB
        FROM INTERFAZ_VENTAS_CTAS
        WHERE INVE_ID = :IDINTER
        INTO :CTADIC, :BASEADIC, :PORCADIC, :VALORADIC, :DBADIC
        DO
        BEGIN
        if (VALORADIC <> 0) then
            MONTO = VALORADIC;
        ELSE
            BEGIN
            if (:BASEADIC = 'SUBTOTAL') then
                VALORADIC = vrsubt;
            if (:BASEADIC = 'DESCUENTO') then
                VALORADIC = VRDTO;
            if (:BASEADIC = 'IVA') then
                VALORADIC = VRIVA;
            if (:BASEADIC = 'ADICIONAL') then
                VALORADIC = VRADIC;
            if (:BASEADIC = 'EXTRA') then
                VALORADIC = VREXTRA;
            if (:BASEADIC = 'TOTAL') then
                VALORADIC = VRTOTAL;
            MONTO = VALORADIC * PORCADIC / 100;
            END
        if (MONTO <> 0) then
            BEGIN
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTADIC INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERROR (31, 0, :CTADIC, 2);
                CUENTA = CTADIC;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                begin
                EXECUTE PROCEDURE ERROR (31, 0, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'C') then
                BEGIN
                if (DBADIC = 'S') then
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                ELSE
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                if (DBADIC = 'S') then
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                ELSE
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                END
            NROI = NROI + 1;
            END
        END
    if (ERROR > 0) then
        VER = 'S';
    SUSPEND;
    END /* EXISTE LA INTERFAZ */
ELSE
    BEGIN
    EXECUTE PROCEDURE ERROR (31, 0, :PREF, 1);
    ERROR = ERROR + 1;
    VER = 'S';
    SUSPEND;
    END
END

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE EXISTENCIAS_DESDE_HASTA(
    FECHA DATE,
    ARTINI VARCHAR(20),
    ARTFIN VARCHAR(20),
    GRPINI VARCHAR(3),
    GRPFIN VARCHAR(3),
    BODINI VARCHAR(2),
    BODFIN VARCHAR(2),
    ORDEN CHAR(1),
    AGRUPA CHAR(1),
    DETALLE CHAR(1),
    RESERVA CHAR(1),
    SUCURSAL INTEGER)
RETURNS (
    CANT NUMERIC(18,4),
    COSTO NUMERIC(18,2),
    COSTO_LOTE NUMERIC(18,2),
    CODIGO VARCHAR(15),
    NOMBRE VARCHAR(60),
    UNIDAD VARCHAR(8),
    STAND VARCHAR(15),
    CODGRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    CODSUBG VARCHAR(3),
    NOMSUBG VARCHAR(30),
    CODMARC VARCHAR(3),
    NOMMARC VARCHAR(30),
    CODBOD VARCHAR(2),
    LOTE VARCHAR(15),
    NOMBOD VARCHAR(30),
    COSTOTOT NUMERIC(18,2),
    ULTCOSTO NUMERIC(18,2),
    FECHACOSTO DATE,
    CONSUMO NUMERIC(18,2),
    RESERVADO NUMERIC(18,4),
    ORDENADO NUMERIC(18,4),
    IVA NUMERIC(9,2),
    CODBAR VARCHAR(20))
AS
declare variable exist char(1);
declare variable codini varchar(20);
declare variable codfin varchar(20);
declare variable desini varchar(20);
declare variable desfin varchar(20);
declare variable ordenc numeric(18,4);
declare variable pedido numeric(18,4);
declare variable ok char(1);
declare variable id integer;
declare variable item integer;
declare variable und varchar(8);
declare variable factor numeric(18,4);
declare variable cant2 numeric(18,4);
declare variable PEDAUTO CHAR(2);
BEGIN
if (ORDEN = 'C') then
    BEGIN
    CODINI = ARTINI;
    CODFIN = ARTFIN;
    DESINI = '';
    DESFIN = 'zz';
    END
ELSE
    BEGIN
    DESINI = ARTINI;
    DESFIN = ARTFIN;
    CODINI = '';
    CODFIN = 'zz';
    END
EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION', 'FACTURAS', 'GENERAR PEDIDO AUTOMATICAMENTE CON LA FACTURA') returning_values (pedauto);
if (DETALLE = 'B') then
  BEGIN
  FOR SELECT ARTI_COD, ARTI_DES, ARTI_UNIDAD, ARTI_EXIST, TAIV_PORC, A.GRUP_COD, A.SUBG_COD, A.MARC_COD, BODE_COD, BODE_NOM, ARTI_CONSUMO
      FROM ARTICULO A, BODEGA B, TARIFA_IVA T
      WHERE ARTI_COD >= :CODINI AND ARTI_COD <= :CODFIN AND ARTI_DES >= :DESINI AND ARTI_DES <= :DESFIN AND ESAR_COD <> 'I' AND BODE_COD >= :BODINI AND
      BODE_COD <= :BODFIN AND ((SUCU_ID = :SUCURSAL) or (:SUCURSAL = 0)) AND A.TAIV_COD = T.TAIV_COD
      INTO :CODIGO, :NOMBRE, :UNIDAD, :EXIST, :IVA, :CODGRUPO, :CODSUBG, :CODMARC, :CODBOD, :NOMBOD, :CONSUMO
      DO
        BEGIN
        OK = 'N';
        if (AGRUPA = 'G') then
            BEGIN
            if ((CODGRUPO >= GRPINI) AND (CODGRUPO <= GRPFIN)) then
                OK = 'S';
            end
        ELSE
            if (AGRUPA = 'M') then
                BEGIN
                if ((CODMARC >= GRPINI) AND (CODMARC <= GRPFIN)) then
                    OK = 'S';
                END
        if (OK = 'S') then
            BEGIN
            NOMGRUPO = '';
            NOMMARC = '';
            NOMSUBG = '';
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            SELECT MAX(COBA_COD) FROM BARRAS_ARTICULO WHERE ARTI_COD = :codigo AND COBA_UNIDAD = :unidad INTO :codbar;
            if (CODBAR IS NULL) then
                CODBAR = CODIGO;
            if (EXIST <> 'N') then
                BEGIN
                SELECT MAX(EXIS_STAND) FROM EXISTENCIA WHERE ARTI_COD = :CODIGO AND BODE_COD = :CODBOD INTO :STAND;
                EXECUTE PROCEDURE SALDO_INICIAL_INVENTARIO(CODIGO, FECHA, :CODBOD) returning_values (CANT);
                EXECUTE PROCEDURE COSTO_PROMEDIO_UNIDAD(CODIGO, FECHA, UNIDAD) returning_values (COSTO);
                EXECUTE PROCEDURE ULTIMO_COSTO(CODIGO, FECHA, UNIDAD) returning_values (ULTCOSTO);
                SELECT MAX(MVAR_FECHA) FROM MOVIMIENTO_ARTICULO WHERE ARTI_COD = :CODIGO AND MVAR_ENTRADA = 'S' AND MVAR_FECHA <= :FECHA INTO :FECHACOSTO;
                COSTOTOT = :CANT * :COSTO;
                CONSUMO = CONSUMO * CANT;
                if (RESERVA = 'S') then
                    BEGIN
                    SELECT SUM(ORID_ENTREGAR)
                        FROM ORDENINVENTARIO_DETALLE OD, ordenes_inventario O
                        WHERE O.ORIN_ID = OD.ORIN_ID AND ARTI_COD = :CODIGO AND ORIN_FECHA <= :FECHA AND ORIN_FECLLEGA >= :FECHA AND ORID_ANULADO = 'N' AND OD.BODE_COD = :CODBOD
                        INTO :ORDENADO;
                    if (ORDENADO IS NULL) then
                        ORDENADO = 0;
                    ORDENC = 0;
                    FOR SELECT O.ORDC_ID, OCDE_ITEM, OCDE_CANT * OCDE_FACTOR
                        FROM ORDENES_COMPRA O, ORDENES_COMPRA_DETALLE OD
                        WHERE O.ORDC_ID = OD.ORDC_ID AND OD.ARTI_COD = :CODIGO AND (ORDC_FECHA+ORDC_VALIDEZ) >= :FECHA AND ORDC_FECHA <= :FECHA AND OCDE_ANULADO = 'N' AND OD.BODE_COD = :CODBOD
                        INTO :ID, :ITEM, :CANT2
                        do
                        BEGIN
                        EXECUTE PROCEDURE FALTANTE(23, 21, ID, ITEM) returning_values (PEDIDO, UND, FACTOR);
                        if (PEDIDO * FACTOR = CANT2) then /* SI NO SE HA FACTURADO MIRE A VER SI SE REMISIONO */
                            EXECUTE PROCEDURE FALTANTE(23, 22, ID, ITEM) returning_values (PEDIDO, UND, FACTOR);
                        if (PEDIDO IS NULL) then
                            PEDIDO = 0;
                        ORDENC = ORDENC + PEDIDO * FACTOR;
                        END
                    ORDENADO = ORDENADO + ORDENC;
                    SELECT SUM(RSDE_LIBERAR)
                        FROM RESERVAS_DETALLE RD, RESERVAS R
                        WHERE R.RESE_ID = RD.RESE_ID AND ARTI_COD = :CODIGO AND RESE_FECHA <= :FECHA AND RESE_VENCE >= :FECHA AND RD.BODE_COD = :CODBOD AND RSDE_ANULADO = 'N'
                        INTO :RESERVADO;
                    if (RESERVADO IS NULL) then
                        RESERVADO = 0;
                    PEDIDO = 0;
                    FOR SELECT P.PEDI_ID, PEDE_ITEM, PEDE_CANT * PEDE_FACTOR
                        FROM PEDIDOS P, PEDIDOS_DETALLE PD
                        WHERE P.PEDI_ID = PD.PEDI_ID AND PD.ARTI_COD = :CODIGO AND (PEDI_FECHA+PEDI_VALIDEZ) >= :FECHA AND PEDI_FECHA <= :FECHA AND PEDE_ANULADO = 'N' AND BODE_COD = :CODBOD
                        INTO :ID, :ITEM, :CANT2
                        do
                        BEGIN
                        EXECUTE PROCEDURE FALTANTE(34, 31, ID, ITEM) returning_values (ORDENC, UND, FACTOR);
                        if ((ORDENC * FACTOR = CANT2) or (PEDAUTO = 'SI')) then /* SI NO SE HA FACTURADO MIRE A VER SI SE REMISIONO */
                            EXECUTE PROCEDURE FALTANTE(34, 32, ID, ITEM) returning_values (ORDENC, UND, FACTOR);
                        if (ORDENC IS NULL) then
                            ORDENC = 0;
                        PEDIDO = PEDIDO + ORDENC * FACTOR;
                        END
                    RESERVADO = RESERVADO + PEDIDO;
                    END
                ELSE
                    BEGIN
                    RESERVADO = 0;
                    ORDENADO = 0;
                    END
                SUSPEND;
                END
            END
        END
  END

if (DETALLE = 'L') then
  BEGIN
  FOR SELECT A.ARTI_COD, ARTI_DES, ARTI_UNIDAD, ARTI_EXIST, TAIV_PORC, A.GRUP_COD, A.SUBG_COD, A.MARC_COD, L.lote_nro, L.lote_nro||' - '||L.lote_vence, ARTI_CONSUMO,l.bode_cod, L.lote_saldo,l.lote_costo
      FROM ARTICULO A, LOTES l, TARIFA_IVA T
      WHERE A.ARTI_COD >= '0' AND A.ARTI_COD <= 'zz' AND ARTI_DES >= '' AND ARTI_DES <= 'zz' AND ESAR_COD <> 'I' AND A.TAIV_COD = T.TAIV_COD and a.arti_cod = l.arti_cod
      INTO :CODIGO, :NOMBRE, :UNIDAD, :EXIST, :IVA, :CODGRUPO, :CODSUBG, :CODMARC, :LOTE, :NOMBOD, :CONSUMO, :codbod, :cant, :costo_lote
      DO
        BEGIN
        OK = 'N';
        if (AGRUPA = 'G') then
            BEGIN
            if ((CODGRUPO >= GRPINI) AND (CODGRUPO <= GRPFIN)) then
                OK = 'S';
            end
        ELSE
            if (AGRUPA = 'M') then
                BEGIN
                if ((CODMARC >= GRPINI) AND (CODMARC <= GRPFIN)) then
                    OK = 'S';
                END
        if (OK = 'S') then
            BEGIN
            NOMGRUPO = '';
            NOMMARC = '';
            NOMSUBG = '';
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            SELECT MAX(COBA_COD) FROM BARRAS_ARTICULO WHERE ARTI_COD = :codigo AND COBA_UNIDAD = :unidad INTO :codbar;
            if (CODBAR IS NULL) then
                CODBAR = CODIGO;

            if (EXIST <> 'N') then
                BEGIN
                EXECUTE PROCEDURE COSTO_PROMEDIO_UNIDAD(CODIGO, FECHA, UNIDAD) returning_values (COSTO);
                EXECUTE PROCEDURE ULTIMO_COSTO(CODIGO, FECHA, UNIDAD) returning_values (ULTCOSTO);
                SELECT MAX(MVAR_FECHA) FROM MOVIMIENTO_ARTICULO WHERE ARTI_COD = :CODIGO AND MVAR_ENTRADA = 'S' AND MVAR_FECHA <= :FECHA INTO :FECHACOSTO;
                COSTOTOT = :CANT * :COSTO;
                CONSUMO = CONSUMO * CANT;
                if (RESERVA = 'S') then
                    BEGIN
                    SELECT SUM(ORID_ENTREGAR)
                        FROM ORDENINVENTARIO_DETALLE OD, ordenes_inventario O
                        WHERE O.ORIN_ID = OD.ORIN_ID AND ARTI_COD = :CODIGO AND ORIN_FECHA <= :FECHA AND ORIN_FECLLEGA >= :FECHA AND ORID_ANULADO = 'N'
                        INTO :ORDENADO;
                    if (ORDENADO IS NULL) then
                        ORDENADO = 0;
                    ORDENC = 0;
                    FOR SELECT O.ORDC_ID, OCDE_ITEM, OCDE_CANT * OCDE_FACTOR
                        FROM ORDENES_COMPRA O, ORDENES_COMPRA_DETALLE OD
                        WHERE O.ORDC_ID = OD.ORDC_ID AND OD.ARTI_COD = :CODIGO AND (ORDC_FECHA+ORDC_VALIDEZ) >= :FECHA AND ORDC_FECHA <= :FECHA AND OCDE_ANULADO = 'N'
                        INTO :ID, :ITEM, :CANT2
                        do
                        BEGIN
                        EXECUTE PROCEDURE FALTANTE(23, 21, ID, ITEM) returning_values (PEDIDO, UND, FACTOR);
                        if (PEDIDO * FACTOR = CANT2) then /* SI NO SE HA FACTURADO MIRE A VER SI SE REMISIONO */
                            EXECUTE PROCEDURE FALTANTE(23, 22, ID, ITEM) returning_values (PEDIDO, UND, FACTOR);
                        if (PEDIDO IS NULL) then
                            PEDIDO = 0;
                        ORDENC = ORDENC + PEDIDO * FACTOR;
                        END
                    ORDENADO = ORDENADO + ORDENC;
                    SELECT SUM(RSDE_LIBERAR)
                        FROM RESERVAS_DETALLE RD, RESERVAS R
                        WHERE R.RESE_ID = RD.RESE_ID AND ARTI_COD = :CODIGO AND RESE_FECHA <= :FECHA AND RESE_VENCE >= :FECHA AND RSDE_ANULADO = 'N'
                        INTO :RESERVADO;
                    if (RESERVADO IS NULL) then
                        RESERVADO = 0;
                    PEDIDO = 0;
                    FOR SELECT P.PEDI_ID, PEDE_ITEM, PEDE_CANT * PEDE_FACTOR
                        FROM PEDIDOS P, PEDIDOS_DETALLE PD
                        WHERE P.PEDI_ID = PD.PEDI_ID AND PD.ARTI_COD = :CODIGO AND (PEDI_FECHA+PEDI_VALIDEZ) >= :FECHA AND PEDI_FECHA <= :FECHA AND PEDE_ANULADO = 'N'
                        INTO :ID, :ITEM, :CANT2
                        do
                        BEGIN
                        EXECUTE PROCEDURE FALTANTE(34, 31, ID, ITEM) returning_values (ORDENC, UND, FACTOR);
                        if ((ORDENC * FACTOR = CANT2) or (PEDAUTO = 'SI')) then /* SI NO SE HA FACTURADO MIRE A VER SI SE REMISIONO */
                            EXECUTE PROCEDURE FALTANTE(34, 32, ID, ITEM) returning_values (ORDENC, UND, FACTOR);
                        if (ORDENC IS NULL) then
                            ORDENC = 0;
                        PEDIDO = PEDIDO + ORDENC * FACTOR;
                        END
                    RESERVADO = RESERVADO + PEDIDO;
                    END
                ELSE
                    BEGIN
                    RESERVADO = 0;
                    ORDENADO = 0;
                    END
                SUSPEND;
                END
            END
        END
  end
if (DETALLE = 'N') then
  BEGIN
  FOR SELECT ARTI_COD, ARTI_DES, ARTI_UNIDAD, ARTI_EXIST, TAIV_PORC, A.GRUP_COD, A.SUBG_COD, A.MARC_COD, ARTI_CONSUMO
      FROM ARTICULO A, TARIFA_IVA T
      WHERE ARTI_COD >= :CODINI AND ARTI_COD <= :CODFIN AND ARTI_DES >= :DESINI AND ARTI_DES <= :DESFIN AND ESAR_COD <> 'I' AND A.TAIV_COD = T.TAIV_COD
      INTO :CODIGO, :NOMBRE, :UNIDAD, :EXIST, :IVA, :CODGRUPO, :CODSUBG, :CODMARC, :CONSUMO
      DO
        BEGIN
        OK = 'N';
        if (AGRUPA = 'G') then
            BEGIN
            if ((GRPINI = '0') AND (GRPFIN = 'zz')) then
                OK = 'S';
            else
                if ((CODGRUPO >= GRPINI) AND (CODGRUPO <= GRPFIN)) then
                    OK = 'S';
            end
        ELSE
            if (AGRUPA = 'M') then
                BEGIN
                if ((GRPINI = '0') AND (GRPFIN = 'zzz')) then
                    OK = 'S';
                else
                    if ((CODMARC >= GRPINI) AND (CODMARC <= GRPFIN)) then
                        OK = 'S';
                END
        if (OK = 'S') then
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            SELECT MAX(COBA_COD) FROM BARRAS_ARTICULO WHERE ARTI_COD = :codigo AND COBA_UNIDAD = :unidad INTO :codbar;
            if (CODBAR IS NULL) then
                CODBAR = CODIGO;

            if (EXIST <> 'N') then
                BEGIN
                EXECUTE PROCEDURE SALDO_INICIAL_TOTAL_INV(CODIGO, FECHA) returning_values (CANT);
                EXECUTE PROCEDURE COSTO_PROMEDIO_UNIDAD(CODIGO, FECHA, UNIDAD) returning_values (COSTO);
                EXECUTE PROCEDURE ULTIMO_COSTO(CODIGO, FECHA, UNIDAD) returning_values (ULTCOSTO);
                SELECT MAX(MVAR_FECHA) FROM MOVIMIENTO_ARTICULO WHERE ARTI_COD = :CODIGO AND MVAR_ENTRADA = 'S' AND MVAR_FECHA <= :FECHA INTO :FECHACOSTO;
                COSTOTOT = :CANT * :COSTO;
                CONSUMO = CONSUMO * CANT;
                if (RESERVA = 'S') then
                    BEGIN
                    SELECT SUM(ORID_ENTREGAR)
                        FROM ORDENINVENTARIO_DETALLE OD, ordenes_inventario O
                        WHERE O.ORIN_ID = OD.ORIN_ID AND ARTI_COD = :CODIGO AND ORIN_FECHA <= :FECHA AND ORIN_FECLLEGA >= :FECHA AND ORID_ANULADO = 'N'
                        INTO :ORDENADO;
                        if (ORDENADO IS NULL) then
                            ORDENADO = 0;
                    ORDENC = 0;
                    FOR SELECT O.ORDC_ID, OCDE_ITEM, OCDE_CANT * OCDE_FACTOR
                        FROM ORDENES_COMPRA O, ORDENES_COMPRA_DETALLE OD
                        WHERE O.ORDC_ID = OD.ORDC_ID AND OD.ARTI_COD = :CODIGO AND (ORDC_FECHA+ORDC_VALIDEZ) >= :FECHA AND ORDC_FECHA <= :FECHA AND OCDE_ANULADO = 'N'
                        INTO :ID, :ITEM, :CANT2
                        do
                        BEGIN
                        EXECUTE PROCEDURE FALTANTE(23, 21, ID, ITEM) returning_values (PEDIDO, UND, FACTOR);
                        if (PEDIDO * FACTOR = CANT2) then /* SI NO SE HA FACTURADO MIRE A VER SI SE REMISIONO */
                            EXECUTE PROCEDURE FALTANTE(23, 22, ID, ITEM) returning_values (PEDIDO, UND, FACTOR);
                        if (PEDIDO IS NULL) then
                            PEDIDO = 0;
                        ORDENC = ORDENC + PEDIDO * FACTOR;
                        END
                    ORDENADO = ORDENADO + ORDENC;
                    SELECT SUM(RSDE_LIBERAR)
                        FROM RESERVAS_DETALLE RD, RESERVAS R
                        WHERE R.RESE_ID = RD.RESE_ID AND ARTI_COD = :CODIGO AND RESE_FECHA <= :FECHA AND RESE_VENCE >= :FECHA AND RSDE_ANULADO = 'N'
                        INTO :RESERVADO;
                    if (RESERVADO IS NULL) then
                        RESERVADO = 0;
                    PEDIDO = 0;
                    FOR SELECT P.PEDI_ID, PEDE_ITEM, PEDE_CANT * PEDE_FACTOR
                        FROM PEDIDOS P, PEDIDOS_DETALLE PD, PUNTO_VENTA PT
                        WHERE P.PEDI_ID = PD.PEDI_ID AND PD.ARTI_COD = :CODIGO AND PT.ptvt_id = P.PTVT_ID AND (PEDI_FECHA+PEDI_VALIDEZ) >= :FECHA AND PEDI_FECHA <= :FECHA AND PEDE_ANULADO = 'N'
                        INTO :ID, :ITEM, :CANT2
                        do
                        BEGIN
                        EXECUTE PROCEDURE FALTANTE(34, 31, ID, ITEM) returning_values (ORDENC, UND, FACTOR);
                        if ((ORDENC * FACTOR = CANT2) or (PEDAUTO = 'SI')) then /* SI NO SE HA FACTURADO MIRE A VER SI SE REMISIONO */
                            EXECUTE PROCEDURE FALTANTE(34, 32, ID, ITEM) returning_values (ORDENC, UND, FACTOR);
                        if (ORDENC IS NULL) then
                            ORDENC = 0;
                        PEDIDO = PEDIDO + ORDENC * FACTOR;
                        END
                    if (PEDIDO IS NULL) then
                        PEDIDO = 0;
                    RESERVADO = RESERVADO + PEDIDO;
                    END
                ELSE
                    BEGIN
                    RESERVADO = 0;
                    ORDENADO = 0;
                    END
                SUSPEND;
                END
            END
        END
  END
END

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE INVENTARIO_FAMILIA(
    FECHA DATE,
    FAMILIA VARCHAR(20))
RETURNS (
    ARTICULO VARCHAR(20),
    INTERNO VARCHAR(20),
    DESCRIPCION VARCHAR(60),
    CANTIDAD NUMERIC(18,2),
    UNIDAD VARCHAR(8),
    TOTAL NUMERIC(18,2))
AS
declare variable COSTO NUMERIC(18,4);
begin
FOR SELECT A.ARTI_COD, ARTI_DES, ARTI_UNIDAD, p.pvar_cod FROM ARTICULO A, PROVEEDOR_ARTICULO P
    WHERE ESAR_COD <> 'I' AND A.arti_cod = P.arti_cod AND P.terc_nit = :FAMILIA
    INTO :ARTICULO, :descripcion, :UNIDAD, :INTERNO
    DO
    BEGIN
    EXECUTE PROCEDURE SALDO_INICIAL_TOTAL_INV(ARTICULO, FECHA) returning_values (cantidad);
    EXECUTE PROCEDURE COSTO_PROMEDIO_UNIDAD(ARTICULO, FECHA, UNIDAD) returning_values (COSTO);
    TOTAL = COSTO * CANTIDAD;
    suspend;
    END
end

^

SET TERM ; ^

SET TERM ^ ;

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

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE DEVOLUCIONES_SIN_CONTABILIDAD(
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    ID INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    ESTADO VARCHAR(20),
    IDI INTEGER,
    IDC INTEGER)
AS
DECLARE VARIABLE VER CHAR(2);
declare variable FECICNT VARCHAR(10);
declare variable FECFCNT VARCHAR(10);
declare variable ERROR INTEGER;
declare variable idref INTEGER;
BEGIN
EXECUTE PROCEDURE fecha_a_conta(FECINI) returning_values (FECICNT);
EXECUTE PROCEDURE fecha_a_conta(FECFIN) returning_values (FECFCNT);
FOR SELECT DEVT_ID, PREF_PRE, DEVT_NUMERO FROM devoluciones_ventas WHERE DEVT_ANULADO = 'N' AND
    DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN
    INTO :ID, :PREF, :NUMERO
DO
  BEGIN
  idref = null;
  SELECT ENCO_IDREF FROM COMPROBANTE_ENCABEZADO WHERE ENCO_TIPOREF = 33 AND ENCO_FECHA >= :FECICNT AND ENCO_FECHA <= :FECFCNT and ENCO_IDREF = :id into :idref;
  if (idref IS NULL) then
  begin
   ESTADO = 'PROCESANDO';
   SUSPEND;
   SELECT MAX(INVE_ID) FROM INTERFAZ_VENTAS WHERE PREF_PRE = :PREF AND TIDO_COD = 33 INTO :IDI;
   EXECUTE PROCEDURE contabil_devolcli (:ID, :IDI) RETURNING_VALUES (:ERROR, :VER, :IDC);
   if (ERROR = 0) then
    BEGIN
    EXECUTE PROCEDURE CONTABILIZA_PENDIENTE (:IDC);
    ESTADO = 'OK';
    END
   ELSE
    ESTADO = 'ERROR';
   suspend;
  End
  END
END

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE FACTURAS_SIN_CONTABILIDAD(
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    ID INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    ESTADO VARCHAR(20),
    IDI INTEGER,
    IDC INTEGER)
AS
DECLARE VARIABLE VER CHAR(2);
declare variable FECICNT VARCHAR(10);
declare variable FECFCNT VARCHAR(10);
declare variable ERROR INTEGER;
declare variable idref INTEGER;
BEGIN
EXECUTE PROCEDURE fecha_a_conta(FECINI) returning_values (FECICNT);
EXECUTE PROCEDURE fecha_a_conta(FECFIN) returning_values (FECFCNT);
FOR SELECT FACT_ID, PREF_PRE, FACT_NUMERO FROM FACTURAS WHERE FACT_ANULADO = 'N' AND
    FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN INTO :ID, :PREF, :NUMERO
DO
  BEGIN
  idref = null;
  SELECT ENCO_IDREF FROM COMPROBANTE_ENCABEZADO WHERE ENCO_TIPOREF = 31 AND ENCO_FECHA >= :FECICNT AND ENCO_FECHA <= :FECFCNT and ENCO_IDREF = :ID into :idref;
  if (idref IS NULL) then
  begin
   ESTADO = 'PROCESANDO';
   ERROR = NULL;
   SUSPEND;
   SELECT MAX(INVE_ID) FROM INTERFAZ_VENTAS WHERE PREF_PRE = :PREF AND TIDO_COD = 31 INTO :IDI;
   EXECUTE PROCEDURE CONTABIL_FACTURA (:ID, :IDI) RETURNING_VALUES (:ERROR, VER, :IDC);
   if ((ERROR = 0) or (error IS NULL)) then
    BEGIN
    EXECUTE PROCEDURE CONTABILIZA_PENDIENTE (:IDC);
    ESTADO = 'OK';
    END
   ELSE
    ESTADO = 'ERROR';
   suspend;
  end
  END
END

^

SET TERM ; ^

SET TERM ^ ;

ALTER TRIGGER AJUSTES_DETALLE_AI
AS
declare variable fec date;
declare variable CONC VARCHAR(60);
declare variable Pref varchar(4);
declare variable Num varchar(6);
declare variable CANTAJ numeric(18,4);
declare variable COSTO NUMERIC(18,2);
declare variable factor numeric(18,4);
BEGIN
  if ((NEW.AJUS_ID <> 0) and (new.ajde_anulado = 'N')) then
    BEGIN
    execute procedure factor_unidad_cant(new.arti_cod, new.ajus_unidad) returning_values(factor);
    CANTAJ = NEW.ajus_exant - (NEW.ajus_exnue / :factor);
    /* CUANDO CAMBIA LA EXISTENCIA REGISTRE EL MOV. */
    select AJUS_fecha, AJUS_conc, AJUS_NUMERO, PREF_PRE from AJUSTES where AJUS_id = new.AJUS_id into :fec, :conc, :Num, :Pref;
    if (CANTAJ > 0) then
      BEGIN
      /* ES UNA SALIDA */
      INSERT INTO MOVIMIENTO_ARTICULO
        (ARTI_COD, MVAR_CONS, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM)
        VALUES(NEW.ARTI_COD, GEN_ID(ID_MOVARTI,1), NEW.BODE_COD, :FEC, 14, NEW.AJUS_id,
        :CONC, :cantaj, 0, 'N', NEW.ajus_lote, :Pref, :Num, NEW.ajus_item);
      END
    ELSE
      BEGIN
      /* ES UNA ENTRADA */
      EXECUTE PROCEDURE costo_promedio(NEW.arti_cod, :FEC) returning_values (:COSTO);
      INSERT INTO MOVIMIENTO_ARTICULO
        (ARTI_COD, MVAR_CONS, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM)
        VALUES(NEW.ARTI_COD, GEN_ID(ID_MOVARTI,1), NEW.BODE_COD, :FEC, 14, NEW.AJUS_id,
        :CONC, abs(:cantaj), :COSTO, 'S', NEW.ajus_lote, :Pref, :Num, NEW.ajus_item);
      END
    END
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER TRIGGER AJUSTES_DETALLE_AU
as
declare variable fec date;
declare variable CONC VARCHAR(60);
declare variable cantaj numeric(18,4);
declare variable Pref varchar(4);
declare variable Num varchar(6);
declare variable COSTO NUMERIC(18,2);
declare variable factor numeric(18,4);
BEGIN
if ((old.ajus_id <> 0) and (old.ajde_anulado = 'N')) then
    DELETE FROM MOVIMIENTO_ARTICULO WHERE (mvar_tipodoc = 14) and (mvar_idref = new.ajus_id) and (mvar_item = new.ajus_item);
if ((NEW.AJUS_id <> 0) and (NEW.ajde_anulado = 'N')) then
    begin
    execute procedure factor_unidad_cant(new.arti_cod, new.ajus_unidad) returning_values(factor);
    CANTAJ = NEW.ajus_exant - (NEW.ajus_exnue / :factor);
    /* CUANDO CAMBIA LA EXISTENCIA REGISTRE EL MOV. */
    select AJUS_fecha, AJUS_conc, AJUS_NUMERO, PREF_PRE from AJUSTES where AJUS_id = new.AJUS_id into :fec, :conc, :Num, :Pref;
    if (CANTAJ > 0) then
        BEGIN
        /* ES UNA SALIDA */
        INSERT INTO MOVIMIENTO_ARTICULO
            (ARTI_COD, MVAR_CONS, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM)
            VALUES(NEW.ARTI_COD, GEN_ID(ID_MOVARTI,1), NEW.BODE_COD, :FEC, 14, NEW.AJUS_id,
            :CONC, :cantaj, 0, 'N', NEW.ajus_lote, :Pref, :Num, new.ajus_item);
        END
    ELSE
        BEGIN
        /* ES UNA ENTRADA */
        EXECUTE PROCEDURE costo_promedio(NEW.arti_cod, :FEC) returning_values (:COSTO);
        INSERT INTO MOVIMIENTO_ARTICULO
            (ARTI_COD, MVAR_CONS, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM)
            VALUES(NEW.ARTI_COD, GEN_ID(ID_MOVARTI,1), NEW.BODE_COD, :FEC, 14, NEW.AJUS_id,
            :CONC, abs(:cantaj), :costo, 'S', NEW.ajus_lote, :Pref, :Num, new.ajus_item);
        END
    END
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER TRIGGER AJUSTES_DETALLE_BI
as
declare variable FECHA DATE;
begin
/* COLOQUE EL COSTO PROMEDIO */
SELECT AJUS_FECHA FROM AJUSTES WHERE AJUS_ID = NEW.ajus_id INTO :FECHA;
EXECUTE PROCEDURE costo_promedio(NEW.arti_cod, :FECHA) returning_values (NEW.ajde_costo);
end
^

SET TERM ; ^

SET TERM ^ ;

ALTER TRIGGER DESENSAMBLES_DETALLE_AI
AS
declare variable fec date;
declare variable CONC VARCHAR(60);
declare variable factor numeric(18,4);
declare variable COSTO numeric(18,2);
declare variable Pref varchar(4);
declare variable Num varchar(6);
declare variable CANT NUMERIC(18,2);
declare variable CANTOT CHAR(2);
BEGIN
  if ((NEW.DESE_id <> 0) and (new.dede_anulado = 'N')) then
    begin
    select dese_fecha, dese_conc, pref_pre, dese_numero, dese_cant * dese_factor from desensambles where dese_id = new.dese_id into :fec, :conc, :Pref, :Num, :CANT;
    execute procedure factor_unidad_cant(new.arti_cod, new.dede_unidad) returning_values(factor);
    execute procedure costo_promedio(new.arti_cod, :FEC) returning_values (:COSTO);
    EXECUTE PROCEDURE LEE_CONFIGURACION('INVENTARIO', 'ENSAMBLES', 'FORMACIONES CON CANTIDADES TOTALES') returning_values (:CANTOT);
    if (CANTOT <> 'SI') then
        CANT = CANT * factor * new.dede_cant;
    ELSE
        CANT = factor * new.dede_cant;
    INSERT INTO MOVIMIENTO_ARTICULO
      (ARTI_COD, MVAR_CONS, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM)
      VALUES(NEW.ARTI_COD, GEN_ID(ID_MOVARTI,1), NEW.BODE_COD, :FEC, 16, NEW.dese_id,
      :CONC, :CANT, :COSTO, 'S', new.dede_lote, :Pref, :Num, new.dese_item);
    END
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER TRIGGER DESENSAMBLES_DETALLE_AU
AS
declare variable fec date;
declare variable CONC VARCHAR(60);
declare variable Pref varchar(4);
declare variable Num varchar(6);
declare variable factor numeric(18,4);
declare variable COSTO numeric(18,2);
declare variable CANT NUMERIC(18,2);
declare variable CANTOT CHAR(2);
BEGIN
/* Anule el anterior */
if ((OLD.DESE_ID <> 0) AND (OLD.dede_anulado = 'N')) then
    delete from movimiento_articulo where (mvar_tipodoc = 16) and (mvar_idref = old.DESE_id) and (mvar_item = old.dese_item);
if ((NEW.dese_id <> 0) AND (new.dede_anulado = 'N')) then
    BEGIN
    EXECUTE PROCEDURE LEE_CONFIGURACION('INVENTARIO', 'ENSAMBLES', 'FORMACIONES CON CANTIDADES TOTALES') returning_values (:CANTOT);
    select dese_fecha, dese_conc, pref_pre, dese_numero, dese_cant * dese_factor from desensambles where dese_id = new.dese_id into :fec, :conc, :Pref, :Num, :CANT;
    execute procedure factor_unidad_cant(new.arti_cod, new.dede_unidad) returning_values(factor);
    execute procedure costo_promedio(new.arti_cod, :FEC) returning_values (:COSTO);
    if (CANTOT <> 'SI') then
        CANT = CANT * factor * new.dede_cant;
    ELSE
        CANT = factor * new.dede_cant;
    INSERT INTO MOVIMIENTO_ARTICULO
        (ARTI_COD, MVAR_CONS, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM)
        VALUES(NEW.ARTI_COD, GEN_ID(ID_MOVARTI,1), NEW.BODE_COD, :FEC, 16, NEW.dese_id,
        :CONC, :CANT, :COSTO, 'S', new.dede_lote, :Pref, :Num, new.dese_item);
    END
END
^

SET TERM ; ^

SET TERM ^ ;

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

SET TERM ; ^

SET TERM ^ ;

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

SET TERM ; ^

SET TERM ^ ;

ALTER TRIGGER NOTAS_CREDITO_PROVEEDOR_AI
AS
declare variable COSTO NUMERIC(18,2);
declare variable EXISTENCIA NUMERIC(18,4);
declare variable CODBOD VARCHAR(3);
BEGIN
if ((NEW.NCPR_ID <> 0) and (new.ncpr_anulado = 'N')) then
    BEGIN
    /* Registre el nuevo saldo del documento */
    INSERT INTO SALDOS_DOC_CXPAGAR (SDCP_TIPOREF, SDCP_IDREF, SDCP_FECHA, TERC_NIT, SDCP_RTEFTE, SDCP_RTIVA, SDCP_RTICA, SDCP_ABONO, SDCP_ABRTFTE, SDCP_ABRTIVA, SDCP_ABRTICA, SDCP_DEBITO, SDCP_MONTO)
        VALUES (52, NEW.NCPR_ID, NEW.ncpr_fecha, NEW.terc_nit, (NEW.ncpr_rtftemonto * -1), (NEW.ncpr_rtivamonto * -1), (NEW.ncpr_rticamonto * -1), 0, 0, 0, 0, 'N', (NEW.ncpr_monto+NEW.ncpr_ivamonto)*-1);
    /* Registre el movimiento del proveedor */
    INSERT INTO MOVIMIENTO_PROVEEDOR (MVPR_ID, TERC_NIT, MVPR_TIPOREF, MVPR_IDREF, MVPR_FECHA, MVPR_VENCE, MVPR_CONC, MVPR_MONTO, MVPR_RTFTE, MVPR_RTIVA, MVPR_RTICA, MVPR_DEBITO, MVPR_ABONO, MVPR_PREFIJO, MVPR_NUMERO)
      VALUES (GEN_ID(ID_MOVPROV, 1), NEW.TERC_NIT, 52, NEW.NCPR_ID, NEW.NCPR_FECHA, NEW.NCPR_FECHA, NEW.NCPR_CONC, NEW.NCPR_MONTO+NEW.NCPR_IVAMONTO, NEW.NCPR_RTFTEMONTO, NEW.NCPR_RTIVAMONTO, NEW.NCPR_RTICAMONTO, 'N', 'N', NEW.pref_pre, NEW.ncpr_numero);
    /* afecte el articulo */
    if (new.arti_cod <> '') then
        begin
        /* CALCULE EL NUEVO COSTO */
        execute procedure costo_promedio (new.arti_cod, new.ncpr_fecha) returning_values (:COSTO);
        execute procedure saldo_total_inventario (new.arti_cod, new.ncpr_fecha) returning_values (:EXISTENCIA);
        COSTO = (COSTO * EXISTENCIA - (NEW.ncpr_monto - NEW.ncpr_ivamonto)) / EXISTENCIA;
        FOR SELECT DISTINCT BODE_COD FROM EXISTENCIA WHERE ARTI_COD = NEW.ARTI_COD INTO :CODBOD do
            BEGIN
            execute procedure saldo_inventario (new.arti_cod, :CODBOD, new.ncpr_fecha) returning_values (:EXISTENCIA);
            /* SAQUE TODO LO QUE TENGA */
            INSERT INTO MOVIMIENTO_ARTICULO
              (ARTI_COD, MVAR_CONS, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM, TERC_NIT)
              VALUES(NEW.ARTI_COD, GEN_ID(ID_MOVARTI,1), :CODBOD, new.ncpr_fecha, 52, NEW.ncpr_id,
              new.ncpr_conc, :EXISTENCIA, 0, 'N', '', new.pref_pre, new.ncpr_numero, 1, new.terc_nit);
            /* META TODO CON EL NUEVO COSTO */
            INSERT INTO MOVIMIENTO_ARTICULO
              (ARTI_COD, MVAR_CONS, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM, TERC_NIT)
              VALUES(NEW.ARTI_COD, GEN_ID(ID_MOVARTI,1), :CODBOD, new.ncpr_fecha, 52, NEW.ncpr_id,
              new.ncpr_conc, :EXISTENCIA, :COSTO, 'S', '', new.pref_pre, new.ncpr_numero, 1, new.terc_nit);
            END
        /* RECORRA LAS LISTAS DE PRECIOS Y CAMBIE EL PRECIO */
        EXECUTE PROCEDURE CALCULA_PRECIOS(NEW.ARTI_COD, new.ncpr_fecha);
        end
    INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
        VALUES (USER, 52, NEW.ncpr_id, 'I', NEW.pref_pre || NEW.ncpr_numero);
    END
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER TRIGGER NOTAS_CREDITO_PROVEEDOR_AU
AS
declare variable ABONOS char(1);
declare variable consec INTEGER;
declare variable COSTO NUMERIC(18,2);
declare variable EXISTENCIA NUMERIC(18,4);
declare variable CODBOD VARCHAR(3);
BEGIN
if (new.ncpr_anulado = 'S') then
    begin
    select enco_consec from comprobante_encabezado where enco_tiporef = 52 and enco_idref = old.ncpr_id into :consec;
    if (NOT consec is null) then
      delete from comprobante_detalle where enco_consec = :consec;
    delete from comprobante_encabezado where enco_tiporef = 52 and enco_idref = old.ncpr_id;
    INSERT INTO AUDITORIA (AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
        VALUES (USER, 52, new.ncpr_id, 'A', NEW.pref_pre || NEW.ncpr_numero);
    end

/* BORRE EL REGISTRO PREVIO */
if ((old.ncpr_id <> 0) and (old.ncpr_anulado = 'N')) then
    begin
    /* Verifique si habia abonos a la nota */
    ABONOS = 'N';
    select 'S' FROM SALDOS_DOC_CXPAGAR WHERE SDCP_TIPOREF = 52 AND SDCP_IDREF = OLD.NCPR_ID AND SDCP_ABONO <> 0 INTO :ABONOS;
    if (ABONOS = 'N') then
        BEGIN
        /* BORRE EL REGISTRO PREVIO */
        delete from saldos_doc_cxpagar where sdcp_tiporef = 52 and sdcp_idref = old.ncpr_id;
        delete from movimiento_PROVEEDOR where (mvpr_tiporef = 52) and (mvpr_idref = old.ncpr_id);
        delete from movimiento_articulo where  (mvar_tipodoc = 52) and (mvar_idref = old.ncpr_id);
        END
    else
        exception DOCUMENTO_CON_ABONOS;
    end
if ((new.ncpr_id <> 0) and (new.ncpr_anulado = 'N')) then
    begin
    /* Registre el nuevo saldo del documento */
    INSERT INTO SALDOS_DOC_CXPAGAR (SDCP_TIPOREF, SDCP_IDREF, SDCP_FECHA, TERC_NIT, SDCP_RTEFTE, SDCP_RTIVA, SDCP_RTICA, SDCP_ABONO, SDCP_ABRTFTE, SDCP_ABRTIVA, SDCP_ABRTICA, SDCP_DEBITO, SDCP_MONTO)
        VALUES (52, NEW.NCPR_ID, NEW.ncpr_fecha, NEW.terc_nit, (NEW.ncpr_rtftemonto * -1), (NEW.ncpr_rtivamonto * -1), (NEW.ncpr_rticamonto * -1), 0, 0, 0, 0, 'N', (NEW.ncpr_monto+NEW.ncpr_ivamonto)*-1);
    /* Registre el movimiento del proveedor */
    INSERT INTO MOVIMIENTO_PROVEEDOR (MVPR_ID, TERC_NIT, MVPR_TIPOREF, MVPR_IDREF, MVPR_FECHA, MVPR_VENCE, MVPR_CONC, MVPR_MONTO, MVPR_RTFTE, MVPR_RTIVA, MVPR_RTICA, MVPR_DEBITO, MVPR_ABONO, MVPR_PREFIJO, MVPR_NUMERO)
        VALUES (GEN_ID(ID_MOVPROV, 1), NEW.TERC_NIT, 52, NEW.NCPR_ID, NEW.NCPR_FECHA, NEW.NCPR_FECHA, NEW.NCPR_CONC, NEW.NCPR_MONTO+NEW.ncpr_ivamonto, NEW.NCPR_RTFTEMONTO, NEW.NCPR_RTIVAMONTO, NEW.NCPR_RTICAMONTO, 'N', 'N', NEW.pref_pre, NEW.ncpr_numero);
    /* afecte el articulo */
    if (new.arti_cod <> '') then
        begin
        /* CALCULE EL NUEVO COSTO */
        execute procedure costo_promedio (new.arti_cod, new.ncpr_fecha) returning_values (:COSTO);
        execute procedure saldo_total_inventario (new.arti_cod, new.ncpr_fecha) returning_values (:EXISTENCIA);
        COSTO = (COSTO * EXISTENCIA - (NEW.ncpr_monto - NEW.ncpr_ivamonto)) / EXISTENCIA;
        FOR SELECT DISTINCT BODE_COD FROM EXISTENCIA WHERE ARTI_COD = NEW.ARTI_COD INTO :CODBOD do
            BEGIN
            execute procedure saldo_inventario (new.arti_cod, :CODBOD, new.ncpr_fecha) returning_values (:EXISTENCIA);
            /* SAQUE TODO LO QUE TENGA */
            INSERT INTO MOVIMIENTO_ARTICULO
                (ARTI_COD, MVAR_CONS, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM, TERC_NIT)
                VALUES(NEW.ARTI_COD, GEN_ID(ID_MOVARTI,1), :CODBOD, new.ncpr_fecha, 52, NEW.ncpr_id,
                new.ncpr_conc, :EXISTENCIA, 0, 'N', '', new.pref_pre, new.ncpr_numero, 1, new.terc_nit);
            /* META TODO CON EL NUEVO COSTO */
            INSERT INTO MOVIMIENTO_ARTICULO
                (ARTI_COD, MVAR_CONS, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM, TERC_NIT)
                VALUES(NEW.ARTI_COD, GEN_ID(ID_MOVARTI,1), :CODBOD, new.ncpr_fecha, 52, NEW.ncpr_id,
                new.ncpr_conc, :EXISTENCIA, :COSTO, 'S', '', new.pref_pre, new.ncpr_numero, 1, new.terc_nit);
            END
        /* RECORRA LAS LISTAS DE PRECIOS Y CAMBIE EL PRECIO */
        EXECUTE PROCEDURE CALCULA_PRECIOS(NEW.ARTI_COD, new.ncpr_fecha);
        end
    INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
        VALUES (USER, 52, NEW.ncpr_id, 'U', NEW.pref_pre || NEW.ncpr_numero);
    end
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER TRIGGER PRECIOS_ARTICULO_BI
AS
declare variable UNIDAD VARCHAR(8);
declare variable UOR VARCHAR(20);
declare variable COSTOP NUMERIC(18, 2);
declare variable COSTOU NUMERIC(18, 2);
declare variable COSTO NUMERIC(18, 2);
declare variable DIG INTEGER;
declare variable IVAINC CHAR(1);
declare variable IVAINC1 CHAR(1);
declare variable TARIVA NUMERIC(9,2);
declare variable BASE varchar(10);
declare variable CAMBIO CHAR(7);
declare variable LISTA INTEGER;
declare variable PRECIO NUMERIC(18, 4);
BEGIN
if (NEW.prar_util IS NULL) then
    NEW.prar_util = 0;
if (NEW.prar_margen IS NULL) then
    NEW.prar_margen = 0;
if (NEW.prar_cantmin IS NULL) then
    NEW.prar_cantmin = 0.01;
if (NEW.prar_auto = 'S') then
    BEGIN
    SELECT LIPR_MODIF FROM LISTA_PRECIOS L
        WHERE LIPR_COD = NEW.LIPR_COD INTO :IVAINC;
    
    SELECT ARTI_UNIDAD, TAIV_PORC FROM ARTICULO A, TARIFA_IVA T
        WHERE ARTI_COD = NEW.ARTI_COD AND A.taiv_cod = T.taiv_cod INTO :UNIDAD, :TARIVA;
    EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION', 'ARTICULOS', 'SUGERIR PRECIOS CON PORCENTAJE DE MARGEN O UTILIDAD') RETURNING_VALUES (:UOR);
    EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION', 'ARTICULOS', 'REDONDEO AL MULTIPLO DE DIEZ EN PRECIOS') RETURNING_VALUES (:DIG);
    EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION','ARTICULOS','CAMBIO DE PRECIOS AUTOMATICO AL CAMBIAR COSTO O PRECIO') returning_values (CAMBIO);
    if (CAMBIO <> 'PRECIO') then
        BEGIN
        EXECUTE PROCEDURE lee_configuracion('FACTURACION','ARTICULOS','COSTO BASE PARA CALCULO DE PRECIOS DE VENTA AUTOMATICOS') returning_values (:BASE);
        EXECUTE PROCEDURE COSTO_PROMEDIO (NEW.ARTI_COD, 'NOW') RETURNING_VALUES(:COSTOP);
        EXECUTE PROCEDURE ULTIMO_COSTO (NEW.ARTI_COD, 'NOW', :UNIDAD) RETURNING_VALUES(:COSTOU);
        if (base = 'ULTIMO') then
            BEGIN
            COSTO = COSTOU;
            END
        ELSE
            BEGIN
            COSTO = COSTOP;
            if (base = 'MAYOR') then
                if (COSTOP < COSTOU) then
                    COSTO = COSTOU;
            END
        if (IVAINC = 'S') then
            COSTO = COSTO * (1 + TARIVA/100);
        if (UOR = 'UTILIDAD') then
            NEW.PRAR_FIJO = (:COSTO * (1 + NEW.prar_util/100));
        ELSE
            NEW.PRAR_FIJO = (:COSTO / (1 - NEW.prar_margen/100));
        END
    ELSE
        BEGIN
        /* PRECIO */
        EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION','ARTICULOS','CODIGO DE LA LISTA DE PRECIOS BASE PARA CAMBIO DE PRECIOS AUTOMATICO') returning_values (LISTA);
        if (NEW.lipr_cod <> :LISTA) then
            BEGIN
            SELECT PRAR_FIJO FROM PRECIOS_ARTICULO WHERE LIPR_COD = :LISTA AND ARTI_COD = NEW.arti_cod INTO :PRECIO;
            SELECT LIPR_MODIF FROM LISTA_PRECIOS L
                WHERE LIPR_COD = :lista INTO :IVAINC1;
            if (ivainc = 'S') then
                if (IVAINC1 = 'S') then
                    NEW.prar_fijo = precio;
                else
                    NEW.prar_fijo = precio * (1 + TARIVA/100);
            ELSE
                if (IVAINC1 = 'S') then
                    NEW.prar_fijo = precio / (1 + TARIVA/100);
                else
                    NEW.prar_fijo = precio;
            if (UOR = 'UTILIDAD') then
                NEW.prar_fijo = NEW.prar_fijo * (1 + NEW.prar_util/100);
            ELSE
                NEW.prar_fijo = NEW.prar_fijo / (1 - NEW.prar_margen/100);
            EXECUTE PROCEDURE REDONDEE (NEW.prar_fijo, DIG) returning_values (NEW.prar_fijo);
            END
        END
    END
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER TRIGGER PRECIOS_ARTICULO_BU
as
declare variable UNIDAD VARCHAR(8);
declare variable UOR VARCHAR(20);
declare variable DIG INTEGER;
declare variable IVAINC CHAR(1);
declare variable TARIVA NUMERIC(9,4);
declare variable CAMBIO CHAR(7);
declare variable BASE VARCHAR(10);
declare variable REP CHAR(2);
declare variable COSTOP NUMERIC(18, 2);
declare variable COSTOU NUMERIC(18, 2);
declare variable COSTO NUMERIC(18, 2);
declare variable LISTA INTEGER;
declare variable PRECIO NUMERIC(18, 4);
declare variable IVAINC1 CHAR(1);
begin
if (NEW.prar_auto = 'S') then
    BEGIN
    EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION','ARTICULOS','CAMBIO DE PRECIOS AUTOMATICO AL CAMBIAR COSTO O PRECIO') returning_values (CAMBIO);
    EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION', 'ARTICULOS', 'SUGERIR PRECIOS CON PORCENTAJE DE MARGEN O UTILIDAD') RETURNING_VALUES (:UOR);
    EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION', 'ARTICULOS', 'REDONDEO AL MULTIPLO DE DIEZ EN PRECIOS') RETURNING_VALUES (:DIG);
    EXECUTE PROCEDURE LEE_CONFIGURACION('INVENTARIO', 'ARTICULOS', 'REPLICAR CAMBIOS EN ARTICULOS') RETURNING_VALUES (:REP);
    SELECT LIPR_MODIF FROM LISTA_PRECIOS L
        WHERE LIPR_COD = NEW.LIPR_COD INTO :IVAINC;
    
    if (CAMBIO <> 'PRECIO') then
      begin
      if (REP <> 'SI') then
        BEGIN
        SELECT ARTI_UNIDAD, TAIV_PORC FROM ARTICULO A, TARIFA_IVA T WHERE A.TAIV_COD = T.TAIV_COD AND ARTI_COD = NEW.arti_cod INTO :UNIDAD, :TARIVA;
        EXECUTE PROCEDURE lee_configuracion('FACTURACION','ARTICULOS','COSTO BASE PARA CALCULO DE PRECIOS DE VENTA AUTOMATICOS') returning_values (:BASE);
        EXECUTE PROCEDURE COSTO_PROMEDIO (NEW.arti_cod, 'NOW') RETURNING_VALUES(:COSTOP);
        EXECUTE PROCEDURE ULTIMO_COSTO (NEW.arti_cod, 'NOW', :UNIDAD) RETURNING_VALUES(:COSTOU);
        if (base = 'ULTIMO') then
            COSTO = COSTOU;
        ELSE
            BEGIN
            COSTO = COSTOP;
            if (base = 'MAYOR') then
                if (COSTOP < COSTOU) then
                    COSTO = COSTOU;
            END
        if (IVAINC = 'S') then
            COSTO = COSTO * (1 + TARIVA/100);
            
        if (UOR = 'UTILIDAD') then
            BEGIN
            COSTO = COSTO * (1 + NEW.prar_util/100);
            EXECUTE PROCEDURE REDONDEE (COSTO, DIG) returning_values (COSTO);
            new.prar_fijo = :COSTO;
            END
        ELSE
            BEGIN
            COSTO = COSTO / (1 - NEW.prar_margen/100);
            EXECUTE PROCEDURE REDONDEE (COSTO, DIG) returning_values (COSTO);
            NEW.PRAR_FIJO = :COSTO;
            END
        END
      end
    else
        begin
        /* PRECIO */
        EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION','ARTICULOS','CODIGO DE LA LISTA DE PRECIOS BASE PARA CAMBIO DE PRECIOS AUTOMATICO') returning_values (LISTA);
        if (NEW.lipr_cod <> :LISTA) then
            BEGIN
            SELECT PRAR_FIJO FROM PRECIOS_ARTICULO WHERE LIPR_COD = :LISTA AND ARTI_COD = NEW.arti_cod INTO :PRECIO;
            SELECT LIPR_MODIF FROM LISTA_PRECIOS L
                WHERE LIPR_COD = :lista INTO :IVAINC1;
            if (ivainc = 'S') then
                if (IVAINC1 = 'S') then
                    NEW.prar_fijo = precio;
                else
                    NEW.prar_fijo = precio * (1 + TARIVA/100);
            ELSE
                if (IVAINC1 = 'S') then
                    NEW.prar_fijo = precio / (1 + TARIVA/100);
                else
                    NEW.prar_fijo = precio;
            if (UOR = 'UTILIDAD') then
                NEW.prar_fijo = NEW.prar_fijo * (1 + NEW.prar_util/100);
            ELSE
                NEW.prar_fijo = NEW.prar_fijo / (1 - NEW.prar_margen/100);
            EXECUTE PROCEDURE REDONDEE (NEW.prar_fijo, DIG) returning_values (NEW.prar_fijo);
            END
        end
    END
end
^

SET TERM ; ^

SET TERM ^ ;

ALTER TRIGGER MOVIMIENTO_ARTICULO_AD
AS
declare variable LOTE CHAR(1);
BEGIN
  /* INSERTE EL NUEVO LOTE */
  SELECT ARTI_EXIST
    FROM   ARTICULO
    WHERE  ARTICULO.ARTI_COD = OLD.ARTI_COD
    INTO :LOTE;
  /* BORRE LOS VIEJOS */
  if (old.mvar_tipodoc <> 13) then
      BEGIN
      EXECUTE PROCEDURE actualice_costo(old.arti_cod, old.mvar_fecha, old.mvar_costo, old.mvar_cant, old.mvar_entrada, 'S', OLD.mvar_cons, OLD.mvar_tipodoc);
      EXECUTE PROCEDURE chequeo_costos(old.arti_cod, old.mvar_fecha);
      END
  /* actualice existencias */
  if (old.mvar_entrada = 'S') then
    BEGIN
    execute procedure sume_existencia(old.arti_cod, old.bode_cod, old.mvar_fecha, old.mvar_cant, 'S');
    if (LOTE = 'L') then
        UPDATE LOTES
            set lote_saldo = lote_saldo - old.mvar_cant
            where (arti_cod = old.ARTI_COD) and (bode_cod = old.bode_cod) and (lote_nro = old.mvar_lote);
    END
  else
    BEGIN
    execute procedure reste_existencia(old.arti_cod, old.bode_cod, old.mvar_fecha, old.mvar_cant, 'S');
    if (LOTE = 'L') then
        UPDATE LOTES
            set lote_saldo = lote_saldo + old.mvar_cant
            where (arti_cod = old.ARTI_COD) and (bode_cod = old.bode_cod) and (lote_nro = old.mvar_lote);
    END
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER TRIGGER MOVIMIENTO_ARTICULO_AI
AS
declare variable EXISTE CHAR(1);
declare variable LOTE CHAR(1);
BEGIN
  /* INSERTE EL NUEVO LOTE */
  SELECT ARTI_EXIST FROM ARTICULO WHERE ARTICULO.ARTI_COD = NEW.ARTI_COD INTO :LOTE;
  /* ACTUALICE COSTOS cuando no es transferencia */
  if (new.mvar_tipodoc <> 13) then
      BEGIN
      EXECUTE PROCEDURE actualice_costo(new.arti_cod, new.mvar_fecha, new.mvar_costo, new.mvar_cant, new.mvar_entrada, 'N', new.mvar_cons, new.mvar_tipodoc);
      EXECUTE PROCEDURE chequeo_costos(NEW.arti_cod, NEW.mvar_fecha);
      END
  /* actualice existencias */
  if (new.mvar_entrada = 'S') then
    BEGIN
    execute procedure sume_existencia(new.arti_cod, new.bode_cod, new.mvar_fecha, new.mvar_cant, 'N');
    if (LOTE = 'L') then
        BEGIN
        if (NEW.MVAR_LOTE IS NULL) then
            EXCEPTION LOTE_OBLIGATORIO 'Debe especificar un número de lote para el articulo ' || new.arti_cod;
        ELSE
         BEGIN
         EXISTE = 'N';
         SELECT 'S' FROM LOTES WHERE ARTI_COD = NEW.ARTI_COD AND BODE_COD = NEW.bode_cod AND LOTE_NRO = new.mvar_lote INTO :EXISTE;
         if (EXISTE = 'S') then
            UPDATE LOTES
             set lote_saldo = lote_saldo + new.mvar_cant
              where (arti_cod = NEW.ARTI_COD) and (BODE_COD = NEW.bode_cod) and (lote_nro = new.mvar_lote);
         ELSE
            INSERT INTO LOTES (ARTI_COD, BODE_COD, LOTE_NRO, LOTE_FECHA, LOTE_CANT, LOTE_COSTO, LOTE_SALDO)
                VALUES (NEW.ARTI_COD, NEW.bode_cod, NEW.mvar_lote, NEW.mvar_fecha, NEW.mvar_cant, NEW.mvar_costo, NEW.mvar_cant);
         END
        END
    END
  else
    BEGIN
    execute procedure reste_existencia(new.arti_cod, new.bode_cod, new.mvar_fecha, new.mvar_cant, 'N');
    /* ACTUALICE LA EXISTENCIA DEL LOTE */
    if (LOTE = 'L') then
    if (NEW.mvar_lote IS NULL) then
        EXCEPTION LOTE_NEGATIVO 'Debe indicar un número de lote para el artículo ' || new.arti_cod;
    ELSE
        BEGIN
        /* Actualice el saldo historico del lote */
        EXISTE = 'N';
        SELECT 'S' FROM EXISTENCIA_LOTE WHERE LOTE_NRO = NEW.MVAR_LOTE AND EXLO_FECHA = NEW.MVAR_FECHA AND ARTI_COD = NEW.arti_cod AND BODE_COD = NEW.bode_cod INTO :EXISTE;
        if (EXISTE = 'S') then
            BEGIN
            UPDATE EXISTENCIA_LOTE
                SET EXLO_SAL = EXLO_SAL + NEW.mvar_cant
                WHERE LOTE_NRO = NEW.MVAR_LOTE AND EXLO_FECHA = NEW.MVAR_FECHA AND ARTI_COD = NEW.ARTI_COD AND BODE_COD = NEW.bode_cod;
            END
        ELSE
            BEGIN
            INSERT INTO EXISTENCIA_LOTE (ARTI_COD, BODE_COD, LOTE_NRO, EXLO_FECHA, EXLO_SAL)
                VALUES (NEW.ARTI_COD, NEW.bode_cod, NEW.MVAR_LOTE, NEW.MVAR_FECHA, NEW.MVAR_CANT);
            END
        UPDATE LOTES
            set lote_saldo = lote_saldo - new.mvar_cant
            where (arti_cod = NEW.ARTI_COD) and (BODE_COD = NEW.bode_cod) and (lote_nro = new.mvar_lote);
        END
    END
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER TRIGGER ENTRADAS_DETALLE_AI
AS
declare variable fec date;
declare variable CONC VARCHAR(60);
declare variable factor numeric(18,4);
declare variable Pref varchar(4);
declare variable Num varchar(6);
declare variable Nit varchar(20);
declare variable IVAINC CHAR(2);
declare variable COSTO NUMERIC(18,2);
BEGIN
  if ((NEW.entr_id <> 0) and (new.ende_anulado = 'N')) then
    BEGIN
    select entr_fecha, entr_conc, pref_pre, entr_numero, terc_nit, entr_imptos
        from entradas where entr_id = new.entr_id
        into :fec, :conc, :Pref, :Num, :Nit, :ivainc;
    execute procedure factor_unidad_cant(new.arti_cod, new.ende_unidad) returning_values(factor);
    COSTO = ((new.ende_costo - NEW.ende_dtomonto) / :factor);
    if (IVAINC = 'S') then
        COSTO = COSTO / (1 + NEW.ende_ivaporc/100);
    INSERT INTO MOVIMIENTO_ARTICULO
      (ARTI_COD, MVAR_CONS, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM, TERC_NIT)
      VALUES(NEW.ARTI_COD, GEN_ID(ID_MOVARTI,1), NEW.BODE_COD, :FEC, 11, NEW.entr_id,
      :CONC, :factor * new.ende_cant, :costo, 'S', new.ende_lote, :Pref, :Num, new.ende_item, :Nit);
    /* RECORRA LAS LISTAS DE PRECIOS Y CAMBIE EL PRECIO */
    EXECUTE PROCEDURE CALCULA_PRECIOS(NEW.ARTI_COD, :FEC);
    END
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER TRIGGER ENTRADAS_DETALLE_AU
as
declare variable fec date;
declare variable CONC VARCHAR(60);
declare variable Pref varchar(4);
declare variable Num varchar(6);
declare variable Nit varchar(20);
declare variable factor numeric(18,4);
declare variable IVAINC CHAR(2);
declare variable COSTO NUMERIC(18,2);
BEGIN
if ((OLD.entr_id <> 0) AND (OLD.ende_anulado = 'N')) then
    DELETE FROM MOVIMIENTO_ARTICULO WHERE (mvar_tipodoc = 11) and (mvar_idref = new.entr_id) and (mvar_item = old.ende_item);
if ((NEW.entr_id <> 0) AND (NEW.ende_anulado = 'N')) then
    begin
    select entr_fecha, entr_conc, pref_pre, entr_numero, terc_nit, entr_imptos
        from entradas where entr_id = new.entr_id
        into :fec, :conc, :Pref, :Num, :Nit, :ivainc;
    execute procedure factor_unidad_cant(new.arti_cod, new.ende_unidad) returning_values(factor);
    COSTO = ((new.ende_costo - NEW.ende_dtomonto) / :factor);
    if (IVAINC = 'S') then
        COSTO = COSTO / (1 + NEW.ende_ivaporc/100);
    INSERT INTO MOVIMIENTO_ARTICULO
        (ARTI_COD, MVAR_CONS, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM, TERC_NIT)
        VALUES(NEW.ARTI_COD, GEN_ID(ID_MOVARTI,1), NEW.BODE_COD, :FEC, 11, NEW.entr_id,
        :CONC, :factor * new.ende_cant, :COSTO, 'S', new.ende_lote, :Pref, :Num, new.ende_item, :Nit);
    /* RECORRA LAS LISTAS DE PRECIOS Y CAMBIE EL PRECIO */
    EXECUTE PROCEDURE CALCULA_PRECIOS(NEW.ARTI_COD, :FEC);
    END
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER TRIGGER FACTCOMP_DETALLE_AD
AS
declare variable fec date;
declare variable CONSO VARCHAR(2);
declare variable CONSOLIDA INTEGER;
declare variable NUMROWS INTEGER;
declare variable VERIF CHAR(2);
BEGIN
if ((old.fcde_anulado = 'N') and (OLD.faco_id <> 0)) then
    begin
    select faco_fecha, faco_consolida from facturas_compra where faco_id = old.faco_id into :fec, :consolida;
    DELETE FROM MOVIMIENTO_ARTICULO WHERE (mvar_tipodoc = 21) and (mvar_idref = old.faco_id) and (mvar_item = old.fcde_item);
    /* RECORRA LAS LISTAS DE PRECIOS Y CAMBIE EL PRECIO */
    EXECUTE PROCEDURE CALCULA_PRECIOS(old.ARTI_COD, :FEC);
    /* LOS PENDIENTES */
    if (CONSOLIDA <> 0) then
        BEGIN
        UPDATE consolidado_faltantes SET COFA_OK = 'N' WHERE COFA_ID = :consolida AND COFA_ITEM = old.FCDE_ITEM AND ARTI_COD = old.arti_cod;
        SELECT COUNT(CEFA_ITEM) FROM consolide_faltantes WHERE CEFA_ID = :CONSOLIDA INTO :NUMROWS;
        EXECUTE procedure LEE_CONFIGURACION ('COMPRAS','DOCUMENTOS','SUMAR CANTIDADES PENDIENTES AL CONSOLIDAR DOCUMENTOS') returning_values (CONSO);
        /* IGNORE LA CONSOLIDACION SI SE VALIDAN CODIGOS DE LA ORDEN */
        SELECT MIN(CEFA_TIPOORI) FROM consolide_faltantes WHERE CEFA_ID = :CONSOLIDA INTO :NUMROWS;
        if (NUMROWS = 23) then
            BEGIN
            EXECUTE PROCEDURE LEE_CONFIGURACION('COMPRAS', 'FACTURAS', 'VERIFICAR CODIGOS DE LA ORDEN') returning_values (VERIF);
            if (VERIF = 'SI') then
                CONSO = 'NO';
            END
        SELECT COUNT(CEFA_ITEM) FROM consolide_faltantes WHERE CEFA_ID = :CONSOLIDA INTO :NUMROWS;
        if ((CONSO = 'SI') AND (NUMROWS > 1)) then
            UPDATE consolidado_faltantes SET COFA_OK = 'N' WHERE COFA_ID = :consolida;
        END
    enD
END
^

SET TERM ; ^

SET TERM ^ ;

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

        if (COSTO > 0 ) then
         BEGIN
          /* ACTUALICE EL COSTO POR PROVEEDOR */
          SELECT PVAR_FECHA FROM PROVEEDOR_ARTICULO
            WHERE TERC_NIT = :Nit AND ARTI_COD = NEW.ARTI_COD
            INTO :FECAUX;
          if (FECAUX IS NULL) then
            INSERT INTO PROVEEDOR_ARTICULO (TERC_NIT, ARTI_COD, PVAR_COSTO, PVAR_FECHA, PVAR_COD,PVAR_DES)
                VALUES (:Nit, NEW.ARTI_COD, :COSTO, :fec, NEW.fcde_codprov,NEW.fcde_desc);
          else
            UPDATE PROVEEDOR_ARTICULO
                SET PVAR_COSTO = :COSTO, PVAR_FECHA = :fec, PVAR_COD = NEW.fcde_codprov
                WHERE ARTI_COD = NEW.ARTI_COD AND TERC_NIT = :Nit;
         END
        /* RECORRA LAS LISTAS DE PRECIOS Y CAMBIE EL PRECIO */
        EXECUTE PROCEDURE CALCULA_PRECIOS(NEW.ARTI_COD, :FEC);
        END /* AFECTAR INV */
    EXECUTE PROCEDURE lee_configuracion('COMPRAS', 'FACTURAS', 'ACTUALIZAR COSTOS DE LA REMISION RELACIONADA AL GRABAR LA FACTURA') returning_values (:ACTREM);
    if ((ACTREM = 'SI') and (Tipo = 22)) then
        BEGIN
        numrows = 0;
        select mvar_cons, MVAR_ITEM, MVAR_FECHA, MVAR_IDREF, MVAR_CANT, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO
            from movimiento_articulo M, consolidado_faltantes C
            where C.cofa_id = :CONSOLIDA AND mvar_tipodoc = 22 and mvar_idref = C.cofa_idori AND C.cofa_tipoori = 22 and m.arti_cod = new.arti_cod
            into :numrows, :iterem, :fecrem, :idrem, :cantrem, :loterem, :prefrem, :numrem;
        
        if (numrows <> 0) then
            BEGIN
            DELETE FROM MOVIMIENTO_ARTICULO WHERE MVAR_CONS = :numrows;
            INSERT INTO MOVIMIENTO_ARTICULO
                (ARTI_COD, MVAR_CONS, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM, TERC_NIT)
                VALUES(NEW.ARTI_COD, GEN_ID(ID_MOVARTI,1), NEW.BODE_COD, :fecrem, 22, :idrem,
                :CONC, :cantrem, :costo, 'S', :loterem, :prefrem, :numrem, :iterem, :Nit);
        
            if (COSTO > 0 ) then
                BEGIN
                /* ACTUALICE EL COSTO POR PROVEEDOR */
                SELECT PVAR_FECHA FROM PROVEEDOR_ARTICULO
                    WHERE TERC_NIT = :Nit AND ARTI_COD = NEW.ARTI_COD
                    INTO :FECAUX;
                if (FECAUX IS NULL) then
                    INSERT INTO PROVEEDOR_ARTICULO (TERC_NIT, ARTI_COD, PVAR_COSTO, PVAR_FECHA, PVAR_COD,PVAR_DES)
                        VALUES (:Nit, NEW.ARTI_COD, :COSTO, :fec, NEW.fcde_codprov,NEW.fcde_desc);
                else
                    UPDATE PROVEEDOR_ARTICULO
                        SET PVAR_COSTO = :COSTO, PVAR_FECHA = :fec, PVAR_COD = NEW.fcde_codprov
                        WHERE ARTI_COD = NEW.ARTI_COD AND TERC_NIT = :Nit;
                END
            /* RECORRA LAS LISTAS DE PRECIOS Y CAMBIE EL PRECIO */
            EXECUTE PROCEDURE CALCULA_PRECIOS(NEW.ARTI_COD, :FEC);
            END
        END

    /* ACTUALICE EL PENDIENTE  */
    if (CONSOLIDA <> 0) then
        BEGIN
        UPDATE consolidado_faltantes SET COFA_OK = 'S' WHERE COFA_ID = :consolida AND COFA_ITEM = NEW.FCDE_ITEM AND ARTI_COD = NEW.arti_cod;
        EXECUTE procedure LEE_CONFIGURACION ('COMPRAS','DOCUMENTOS','SUMAR CANTIDADES PENDIENTES AL CONSOLIDAR DOCUMENTOS') returning_values (CONSO);
        /* IGNORE LA CONSOLIDACION SI SE VALIDAN CODIGOS DE LA ORDEN */
        SELECT MIN(CEFA_TIPOORI) FROM consolide_faltantes WHERE CEFA_ID = :CONSOLIDA INTO :NUMROWS;
        if (NUMROWS = 23) then
            BEGIN
            EXECUTE PROCEDURE LEE_CONFIGURACION('COMPRAS', 'FACTURAS', 'VERIFICAR CODIGOS DE LA ORDEN') returning_values (MENORV);
            if (MENORV = 'SI') then
                CONSO = 'NO';
            END
        SELECT COUNT(CEFA_ITEM) FROM consolide_faltantes WHERE CEFA_ID = :CONSOLIDA INTO :NUMROWS;
        if ((CONSO = 'SI') AND (NUMROWS > 1)) then
            UPDATE consolidado_faltantes SET COFA_IDDES = NEW.faco_id, COFA_OK = 'S' WHERE COFA_ID = :consolida;
        else
            BEGIN
            /* BUSQUE EL CONSOLIDADO EN EL MISMO ITEM Y SI ES DIFERENTE ACTUALICELO */
            select COFA_CANT * COFA_FACTOR FROM consolidado_faltantes WHERE COFA_ID = :consolida AND COFA_ITEM = NEW.FCDE_ITEM AND ARTI_COD = NEW.arti_cod INTO :CANTREL;
            if (NEW.FCDE_CANT * NEW.FCDE_FACTOR < CANTREL) then
                UPDATE consolidado_faltantes SET COFA_IDDES = NEW.faco_id, COFA_CANT = NEW.FCDE_CANT, COFA_FACTOR = NEW.FCDE_FACTOR
                    WHERE COFA_ID = :consolida AND COFA_ITEM = NEW.FCDE_ITEM AND ARTI_COD = NEW.arti_cod;
            END
        END
    END
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER TRIGGER FACTCOMP_DETALLE_AU
as
declare variable fec date;
declare variable fecaux date;
declare variable AUX varchar(90);
declare variable CONC VARCHAR(60);
declare variable Pref varchar(4);
declare variable Num varchar(6);
declare variable Nit varchar(20);
declare variable factor numeric(18,4);
declare variable TIPO INTEGER;
declare variable INVFAC CHAR(2);
declare variable IVAINC CHAR(2);
declare variable COSTO NUMERIC(18,2);
declare variable CANTREL NUMERIC(18,4);
declare variable NUMPROV VARCHAR(10);
declare variable NUMPED VARCHAR(30);
declare variable NUMREM VARCHAR(30);
declare variable CONSO VARCHAR(2);
declare variable CONSOLIDA INTEGER;
declare variable NUMROWS INTEGER;
declare variable DTOPIE NUMERIC(18,2);
declare variable ADICIONAL NUMERIC(18,2);
declare variable TOTAL NUMERIC(18,2);
declare variable IVAMONTO NUMERIC(18,2);
declare variable EXTRA NUMERIC(18,2);
declare variable FACT NUMERIC(18,4);
declare variable MENORV CHAR(2);
declare variable ACTREM CHAR(2);
declare variable FECREM date;
declare variable IDREM INTEGER;
declare variable ITEREM INTEGER;
declare variable CANTREM NUMERIC(18,4);
declare variable LOTEREM VARCHAR(15);
declare variable PREFREM CHAR(4);
BEGIN
if (old.fcde_devuelto = new.fcde_devuelto) then
    begin
    /* deshaga lo viejo */
    if ((old.fcde_anulado = 'N') and (OLD.faco_id <> 0)) then
        begin
        select faco_fecha, faco_consolida from facturas_compra where faco_id = old.faco_id into :fec, :consolida;
        DELETE FROM MOVIMIENTO_ARTICULO WHERE (mvar_tipodoc = 21) and (mvar_idref = old.faco_id) and (mvar_item = old.fcde_item);
        /* RECORRA LAS LISTAS DE PRECIOS Y CAMBIE EL PRECIO */
        EXECUTE PROCEDURE CALCULA_PRECIOS(old.ARTI_COD, :FEC);
        /* LOS PENDIENTES */
        if (CONSOLIDA <> 0) then
            BEGIN
            UPDATE consolidado_faltantes SET COFA_OK = 'N' WHERE COFA_ID = :consolida AND COFA_ITEM = old.FCDE_ITEM AND ARTI_COD = old.arti_cod;
            SELECT COUNT(CEFA_ITEM) FROM consolide_faltantes WHERE CEFA_ID = :CONSOLIDA INTO :NUMROWS;
            EXECUTE procedure LEE_CONFIGURACION ('COMPRAS','DOCUMENTOS','SUMAR CANTIDADES PENDIENTES AL CONSOLIDAR DOCUMENTOS') returning_values (CONSO);
            /* IGNORE LA CONSOLIDACION SI SE VALIDAN CODIGOS DE LA ORDEN */
            SELECT MIN(CEFA_TIPOORI) FROM consolide_faltantes WHERE CEFA_ID = :CONSOLIDA INTO :NUMROWS;
            if (NUMROWS = 23) then
                BEGIN
                EXECUTE PROCEDURE LEE_CONFIGURACION('COMPRAS', 'FACTURAS', 'VERIFICAR CODIGOS DE LA ORDEN') returning_values (MENORV);
                if (MENORV = 'SI') then
                    CONSO = 'NO';
                END
            if (CONSO = 'SI') then
                UPDATE consolidado_faltantes SET COFA_OK = 'N' WHERE COFA_ID = :consolida;
            END
        end
    /* Registre el nuevo */
    if ((new.fcde_anulado = 'N') and (new.faco_id <> 0)) then
        BEGIN
        select faco_fecha, pref_pre, faco_numero, terc_nit, faco_imptos, faco_numprov, faco_remision, faco_orden, faco_consolida, faco_dtomonto, faco_adicional, faco_total, faco_ivamonto, faco_extra
            from facturas_compra where faco_id = new.faco_id
            into :fec, :Pref, :Num, :Nit, :ivainc, :numprov, :numrem, :numped, :consolida, :dtopie, :adicional, :total, :ivamonto, :extra;
        conc = 'FACTURA DE COMPRA No.' || PREF || NUM || '-' || NUMPROV;
        if (NUMREM <> '') then
            BEGIN
            AUX = SUBSTR(NUMREM, 1, 15);
            conc = conc || '-REM:' || AUX;
            END
        else
            if (NUMPED <> '') then
                BEGIN
                AUX = SUBSTR(NUMPED, 1, 15);
                conc = conc || '-ORDEN ' || AUX;
                END
        SELECT MAX(CEFA_TIPOORI) FROM consolide_faltantes WHERE CEFA_ID = :CONSOLIDA INTO :TIPO;
        if (Tipo is null) then
            Tipo = 0;
        execute procedure lee_configuracion('COMPRAS', 'FACTURAS', 'AFECTAR INVENTARIO CON LA FACTURA') returning_values (:INVFAC);
        /* si se hizo con base en una remision no afecte inventario */
        if ((Tipo <> 22) and (INVFAC = 'SI')) then
            begin
            execute procedure factor_unidad_cant(new.arti_cod, new.fcde_unidad) returning_values(factor);
            COSTO = ((new.fcde_prunit - NEW.fcde_dtomonto) / :factor);
            if (IVAINC = 'S') then
                COSTO = COSTO / (1 + NEW.fcde_ivaporc/100);
            EXECUTE PROCEDURE lee_configuracion('COMPRAS','FACTURAS','DESCUENTO Y VALOR ADICIONAL DEL DOCUMENTO COMO MENOR VALOR DEL COSTO') returning_values (:MENORV);
            if (MENORV = 'SI') then
                BEGIN
                FACT = (TOTAL - EXTRA - IVAMONTO);
                if ((FACT - ADICIONAL + DTOPIE) <> 0) then
                    FACT = FACT / (FACT - ADICIONAL + DTOPIE);
                ELSE
                    FACT = 1;
                COSTO = COSTO * FACT;
                END
            INSERT INTO MOVIMIENTO_ARTICULO
                (ARTI_COD, MVAR_CONS, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM, TERC_NIT)
                VALUES(NEW.ARTI_COD, GEN_ID(ID_MOVARTI,1), NEW.BODE_COD, :FEC, 21, NEW.faco_id,
                :CONC, :factor * new.fcde_cant, :COSTO, 'S', new.fcde_lote, :Pref, :Num, NEW.fcde_item, :Nit);
            if (COSTO > 0 ) then
             BEGIN
              /* ACTUALICE EL COSTO POR PROVEEDOR */
              SELECT PVAR_FECHA FROM PROVEEDOR_ARTICULO
                WHERE TERC_NIT = :Nit AND ARTI_COD = NEW.ARTI_COD INTO :FECAUX;
              if (FECAUX IS NULL) then
                INSERT INTO PROVEEDOR_ARTICULO (TERC_NIT, ARTI_COD, PVAR_COSTO, PVAR_FECHA, PVAR_COD,PVAR_DES)
                    VALUES (:Nit, NEW.ARTI_COD, :COSTO, :fec, NEW.fcde_codprov,NEW.fcde_desc);
              else
                UPDATE PROVEEDOR_ARTICULO
                    SET PVAR_COSTO = :COSTO, PVAR_FECHA = :fec, PVAR_COD = NEW.fcde_codprov
                    WHERE ARTI_COD = NEW.ARTI_COD AND TERC_NIT = :Nit;
             END
            /* RECORRA LAS LISTAS DE PRECIOS Y CAMBIE EL PRECIO */
            EXECUTE PROCEDURE CALCULA_PRECIOS(NEW.ARTI_COD, :FEC);
            end
        EXECUTE PROCEDURE lee_configuracion('COMPRAS', 'FACTURAS', 'ACTUALIZAR COSTOS DE LA REMISION RELACIONADA AL GRABAR LA FACTURA') returning_values (:ACTREM);
        if ((ACTREM = 'SI') and (Tipo = 22)) then
            BEGIN
            numrows = 0;
            select mvar_cons, MVAR_ITEM, MVAR_FECHA, MVAR_IDREF, MVAR_CANT, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO
                from movimiento_articulo M, consolidado_faltantes C
                where C.cofa_id = :CONSOLIDA AND mvar_tipodoc = 22 and mvar_idref = C.cofa_idori AND C.cofa_tipoori = 22 and m.arti_cod = new.arti_cod
                into :numrows, :iterem, :fecrem, :idrem, :cantrem, :loterem, :prefrem, :numrem;
            
            if (numrows <> 0) then
                BEGIN
                DELETE FROM MOVIMIENTO_ARTICULO WHERE MVAR_CONS = :numrows;
                INSERT INTO MOVIMIENTO_ARTICULO
                    (ARTI_COD, MVAR_CONS, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM, TERC_NIT)
                    VALUES(NEW.ARTI_COD, GEN_ID(ID_MOVARTI,1), NEW.BODE_COD, :fecrem, 22, :idrem,
                    :CONC, :cantrem, :costo, 'S', :loterem, :prefrem, :numrem, :iterem, :Nit);
        
                if (COSTO > 0 ) then
                    BEGIN
                    /* ACTUALICE EL COSTO POR PROVEEDOR */
                    SELECT PVAR_FECHA FROM PROVEEDOR_ARTICULO
                        WHERE TERC_NIT = :Nit AND ARTI_COD = NEW.ARTI_COD
                        INTO :FECAUX;
                    if (FECAUX IS NULL) then
                        INSERT INTO PROVEEDOR_ARTICULO (TERC_NIT, ARTI_COD, PVAR_COSTO, PVAR_FECHA, PVAR_COD,PVAR_DES)
                            VALUES (:Nit, NEW.ARTI_COD, :COSTO, :fec, NEW.fcde_codprov,NEW.fcde_desc);
                    else
                        UPDATE PROVEEDOR_ARTICULO
                            SET PVAR_COSTO = :COSTO, PVAR_FECHA = :fec, PVAR_COD = NEW.fcde_codprov
                            WHERE ARTI_COD = NEW.ARTI_COD AND TERC_NIT = :Nit;
                    END
                /* RECORRA LAS LISTAS DE PRECIOS Y CAMBIE EL PRECIO */
                EXECUTE PROCEDURE CALCULA_PRECIOS(NEW.ARTI_COD, :FEC);
                END
            END

        if (CONSOLIDA <> 0) then
            begin
            UPDATE consolidado_faltantes SET COFA_OK = 'S' WHERE COFA_ID = :consolida AND COFA_ITEM = NEW.FCDE_ITEM AND ARTI_COD = NEW.arti_cod;
            EXECUTE procedure LEE_CONFIGURACION ('COMPRAS','DOCUMENTOS','SUMAR CANTIDADES PENDIENTES AL CONSOLIDAR DOCUMENTOS') returning_values (CONSO);
            /* IGNORE LA CONSOLIDACION SI SE VALIDAN CODIGOS DE LA ORDEN */
            SELECT MIN(CEFA_TIPOORI) FROM consolide_faltantes WHERE CEFA_ID = :CONSOLIDA INTO :NUMROWS;
            if (NUMROWS = 23) then
                BEGIN
                EXECUTE PROCEDURE LEE_CONFIGURACION('COMPRAS', 'FACTURAS', 'VERIFICAR CODIGOS DE LA ORDEN') returning_values (MENORV);
                if (MENORV = 'SI') then
                    CONSO = 'NO';
                END
            SELECT COUNT(CEFA_ITEM) FROM consolide_faltantes WHERE CEFA_ID = :CONSOLIDA INTO :NUMROWS;
            if ((CONSO = 'SI') AND (NUMROWS > 1)) then
                UPDATE consolidado_faltantes SET COFA_IDDES = NEW.faco_id, COFA_OK = 'S' WHERE COFA_ID = :consolida;
            else
                BEGIN
                /* BUSQUE EL CONSOLIDADO EN EL MISMO ITEM Y SI ES DIFERENTE ACTUALICELO */
                select COFA_CANT * COFA_FACTOR FROM consolidado_faltantes WHERE COFA_ID = :consolida AND COFA_ITEM = NEW.FCDE_ITEM AND ARTI_COD = NEW.arti_cod INTO :CANTREL;
                if (NEW.FCDE_CANT * NEW.FCDE_FACTOR < CANTREL) then
                    UPDATE consolidado_faltantes SET COFA_IDDES = NEW.faco_id, COFA_CANT = NEW.FCDE_CANT, COFA_FACTOR = NEW.FCDE_FACTOR
                        WHERE COFA_ID = :consolida AND COFA_ITEM = NEW.FCDE_ITEM AND ARTI_COD = NEW.arti_cod;
                END
            end
        END
    end
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER TRIGGER REMISION_PROVEEDOR_DET_AI
AS
declare variable fec date;
declare variable CONC VARCHAR(60);
declare variable factor numeric(18,4);
declare variable Pref varchar(4);
declare variable Num varchar(6);
declare variable EXISTE CHAR(1);
declare variable NIT VARCHAR(20);
declare variable NUMPROV VARCHAR(20);
declare variable Tipo Integer;
declare variable idfact integer;
declare variable numrows integer;
declare variable IVAINC CHAR(2);
declare variable COSTO NUMERIC(18,2);
declare variable CANTREL NUMERIC(18,4);
declare variable NUMPED VARCHAR(30);
declare variable CONSO CHAR(2);
declare variable CONSOLIDA INTEGER;
declare variable DTOPIE NUMERIC(18,2);
declare variable ADICIONAL NUMERIC(18,2);
declare variable TOTAL NUMERIC(18,2);
declare variable IVAMONTO NUMERIC(18,2);
declare variable EXTRA NUMERIC(18,2);
declare variable FACT NUMERIC(18,4);
declare variable MENORV CHAR(2);
BEGIN
  if ((NEW.repr_id <> 0) and (new.rpvd_anulado = 'N')) then
    BEGIN
    select max(rprd_tiporel), max(rprd_idrel) from remision_proveedor_docrela
        where repr_id = new.repr_id into :Tipo, :idfact;
    if (Tipo is null) then
        Tipo = 0;
    /* si se hizo con base en una factura que afecto el inventario no afecte inventario */
    numrows = 0;
    if (Tipo = 21) Then
        select count(*) from movimiento_articulo where mvar_tipodoc = 21 and mvar_idref = :idfact into :numrows;
    if (numrows is null) then
        numrows = 0;
    if (numrows = 0) then
        begin
        select repr_fecha, pref_pre, repr_numero, REPR_IMPTOS, terc_nit, REPR_NUMPROV, REPR_ORDEN, REPR_CONSOLIDA, repr_dtomonto, repr_adicional, repr_total, repr_ivamonto, repr_extra
            from remision_proveedor where repr_id = new.repr_id
            into :fec, :Pref, :Num, :IVAINC, :NIT, :NUMPROV, :numped, :CONSOLIDA, :dtopie, :adicional, :total, :ivamonto, :extra;
        execute procedure factor_unidad_cant(new.arti_cod, new.rpvd_unidad) returning_values(factor);
        CONC = 'REMISION PROVEEDOR No.' || PREF || NUM || '-' || NUMPROV;
        if (numped <> '') then
            conc = conc || '-ORDEN ' || NUMPED;
        COSTO = ((new.rpvd_prunit - NEW.rpvd_dtomonto) / :factor);
        if (IVAINC = 'S') then
            COSTO = COSTO / (1 + NEW.rpvd_ivaporc/100);
        EXECUTE PROCEDURE lee_configuracion('COMPRAS','FACTURAS','DESCUENTO Y VALOR ADICIONAL DEL DOCUMENTO COMO MENOR VALOR DEL COSTO') returning_values (:MENORV);
        if (MENORV = 'SI') then
            BEGIN
            FACT = (TOTAL - EXTRA - IVAMONTO);
            if ((FACT - ADICIONAL + DTOPIE) <> 0) then
                FACT = FACT / (FACT - ADICIONAL + DTOPIE);
            ELSE
                FACT = 1;
            COSTO = COSTO * FACT;
            END
        INSERT INTO MOVIMIENTO_ARTICULO
          (ARTI_COD, MVAR_CONS, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM, TERC_NIT)
          VALUES(NEW.ARTI_COD, GEN_ID(ID_MOVARTI,1), NEW.BODE_COD, :FEC, 22, NEW.repr_id,
          :CONC, :factor * new.rpvd_cant, :COSTO, 'S', new.rpvd_lote, :Pref, :Num, new.rpvd_item, :Nit);

        /* RECORRA LAS LISTAS DE PRECIOS Y CAMBIE EL PRECIO */
        EXECUTE PROCEDURE CALCULA_PRECIOS(NEW.ARTI_COD, :FEC);

        if (COSTO > 0 ) then
         BEGIN
          /* GRABE PROV X ARTICULO */
          EXISTE = 'N';
          SELECT 'S' FROM PROVEEDOR_ARTICULO WHERE TERC_NIT = :NIT AND ARTI_COD = NEW.ARTI_COD INTO :EXISTE;
          if (EXISTE = 'S') then
            UPDATE PROVEEDOR_ARTICULO 
                SET PVAR_FECHA = :FEC, PVAR_COSTO = :COSTO, PVAR_COD = NEW.rpvd_codprov
                WHERE TERC_NIT = :NIT AND ARTI_COD = NEW.ARTI_COD;
          ELSE
            INSERT INTO PROVEEDOR_ARTICULO (TERC_NIT, ARTI_COD, PVAR_COSTO, PVAR_FECHA, PVAR_COD,PVAR_DES)
                VALUES (:NIT, NEW.ARTI_COD, :COSTO, :FEC, NEW.rpvd_codprov,NEW.rpvd_desc);
         END
        end

    /* ACTUALICE EL PENDIENTE  */
    if (CONSOLIDA <> 0) then
        BEGIN
        EXECUTE PROCEDURE LEE_CONFIGURACION ('COMPRAS','DOCUMENTOS','SUMAR CANTIDADES PENDIENTES AL CONSOLIDAR DOCUMENTOS') returning_values (CONSO);
        SELECT MIN(CEFA_TIPOORI) FROM consolide_faltantes WHERE CEFA_ID = :CONSOLIDA INTO :NUMROWS;
        if (NUMROWS = 23) then
            BEGIN
            EXECUTE PROCEDURE LEE_CONFIGURACION('COMPRAS', 'REMISIONES', 'VERIFICAR CODIGOS DE LA ORDEN') returning_values (MENORV);
            if (MENORV = 'SI') then
                CONSO = 'NO';
            END
        SELECT COUNT(CEFA_ITEM) FROM consolide_faltantes WHERE CEFA_ID = :CONSOLIDA INTO :NUMROWS;
        if ((CONSO = 'SI') AND (NUMROWS > 1)) then
            UPDATE consolidado_faltantes SET COFA_OK = 'S' WHERE COFA_ID = :consolida;
        ELSE
            BEGIN
            /* BUSQUE EL CONSOLIDADO EN EL MISMO ITEM Y SI ES DIFERENTE ACTUALICELO */
            select COFA_CANT * COFA_FACTOR FROM consolidado_faltantes WHERE COFA_ID = :consolida AND COFA_ITEM = NEW.RPVD_ITEM AND ARTI_COD = NEW.arti_cod INTO :CANTREL;
            if (NEW.RPVD_CANT * NEW.RPVD_FACTOR < CANTREL) then
                UPDATE consolidado_faltantes SET COFA_IDDES = NEW.repr_id, COFA_CANT = NEW.RPVD_CANT, COFA_FACTOR = NEW.RPVD_FACTOR
                    WHERE COFA_ID = :consolida AND COFA_ITEM = NEW.RPVD_ITEM AND ARTI_COD = NEW.arti_cod;
            ELSE
                UPDATE consolidado_faltantes SET COFA_IDDES = NEW.repr_id, COFA_OK = 'S' WHERE COFA_ID = :consolida AND COFA_ITEM = NEW.RPVD_ITEM AND ARTI_COD = NEW.arti_cod;
            END
        END
    END
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER TRIGGER REMISION_PROVEEDOR_DET_AU
AS
declare variable fec date;
declare variable CONC VARCHAR(60);
declare variable Pref varchar(4);
declare variable Num varchar(6);
declare variable factor numeric(18,4);
declare variable EXISTE CHAR(1);
declare variable NIT VARCHAR(20);
declare variable NUMPROV VARCHAR(20);
declare variable Tipo integer;
declare variable idfact integer;
declare variable numrows integer;
declare variable IVAINC CHAR(2);
declare variable COSTO NUMERIC(18,2);
declare variable CANTREL NUMERIC(18,4);
declare variable NUMPED VARCHAR(30);
declare variable CONSO CHAR(2);
declare variable CONSOLIDA INTEGER;
declare variable DTOPIE NUMERIC(18,2);
declare variable ADICIONAL NUMERIC(18,2);
declare variable TOTAL NUMERIC(18,2);
declare variable IVAMONTO NUMERIC(18,2);
declare variable EXTRA NUMERIC(18,2);
declare variable FACT NUMERIC(18,4);
declare variable MENORV CHAR(2);
BEGIN
if ((OLD.repr_id <> 0) AND (OLD.rpvd_anulado = 'N')) then
    begin
    DELETE FROM MOVIMIENTO_ARTICULO WHERE (mvar_tipodoc = 22) and (mvar_idref = new.repr_id) and (mvar_item = old.rpvd_item);
    select REPR_CONSOLIDA from remision_proveedor where repr_id = old.repr_id into :CONSOLIDA;
    if (CONSOLIDA <> 0) then
        begin
        EXECUTE PROCEDURE LEE_CONFIGURACION ('COMPRAS','DOCUMENTOS','SUMAR CANTIDADES PENDIENTES AL CONSOLIDAR DOCUMENTOS') returning_values (CONSO);
        SELECT COUNT(CEFA_ITEM) FROM consolide_faltantes WHERE CEFA_ID = :CONSOLIDA INTO :NUMROWS;
        if ((NUMROWS = 1) OR (CONSO = 'NO')) then
            UPDATE consolidado_faltantes SET COFA_OK = 'N' WHERE COFA_ID = :consolida AND COFA_ITEM = old.RPVD_ITEM AND ARTI_COD = old.arti_cod;
        else
            UPDATE consolidado_faltantes SET COFA_OK = 'N' WHERE COFA_ID = :consolida;
        END
    end
/* Registre el nuevo */
if ((new.repr_id <> 0) AND (new.rpvd_anulado = 'N')) then
    begin
    select repr_fecha, pref_pre, repr_numero, repr_imptos, terc_nit, REPR_NUMPROV, REPR_ORDEN, REPR_CONSOLIDA, repr_dtomonto, repr_adicional, repr_total, repr_ivamonto, repr_extra
        from remision_proveedor where repr_id = new.repr_id
        into :fec, :Pref, :Num, :IVAINC, :NIT, :NUMPROV, :numped, :CONSOLIDA, :dtopie, :adicional, :total, :ivamonto, :extra;
    CONC = 'REMISION PROVEEDOR No.' || PREF || NUM || '-' || NUMPROV;
    if (numped <> '') then
        conc = conc || '-ORDEN ' || NUMPED;
    SELECT MAX(CEFA_TIPOORI) FROM consolide_faltantes WHERE CEFA_ID = :CONSOLIDA INTO :TIPO;
    if (Tipo is null) then
        Tipo = 0;
    select FACO_ID from FACTURAS_COMPRA WHERE FACO_CONSOLIDA = :consolida INTO :IDFACT;
    if (Idfact is null) then
        Idfact = 0;
    /* si se hizo con base en una factura que afecto el inventario no afecte inventario */
    numrows = 0;
    if (Tipo = 21) Then
        select count(*) from movimiento_articulo where mvar_tipodoc = 21 and mvar_idref = :idfact into :numrows;
    if (numrows is null) then
        numrows = 0;
    if (numrows = 0) then
        begin
        execute procedure factor_unidad_cant(new.arti_cod, new.rpvd_unidad) returning_values(factor);
        COSTO = ((new.rpvd_prunit - NEW.rpvd_dtomonto) / :factor);
        if (IVAINC = 'S') then
            COSTO = COSTO / (1 + NEW.rpvd_ivaporc/100);
        EXECUTE PROCEDURE lee_configuracion('COMPRAS','FACTURAS','DESCUENTO Y VALOR ADICIONAL DEL DOCUMENTO COMO MENOR VALOR DEL COSTO') returning_values (:MENORV);
        if (MENORV = 'SI') then
            BEGIN
            FACT = (TOTAL - EXTRA - IVAMONTO);
            if ((FACT - ADICIONAL + DTOPIE) <> 0) then
                FACT = FACT / (FACT - ADICIONAL + DTOPIE);
            ELSE
                FACT = 1;
            COSTO = COSTO * FACT;
            END
        INSERT INTO MOVIMIENTO_ARTICULO
            (ARTI_COD, MVAR_CONS, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM, TERC_NIT)
            VALUES(NEW.ARTI_COD, GEN_ID(ID_MOVARTI,1), NEW.BODE_COD, :FEC, 22, NEW.repr_id,
            :CONC, :factor * new.rpvd_cant, :COSTO, 'S', new.rpvd_lote, :Pref, :Num, new.rpvd_item, :Nit);
            
        /* RECORRA LAS LISTAS DE PRECIOS Y CAMBIE EL PRECIO */
        EXECUTE PROCEDURE CALCULA_PRECIOS(NEW.ARTI_COD, :FEC);
          
        if (COSTO > 0 ) then
         BEGIN
          /* GRABE PROV X ARTICULO */
          EXISTE = 'N';
          SELECT 'S' FROM PROVEEDOR_ARTICULO WHERE TERC_NIT = :NIT AND ARTI_COD = NEW.ARTI_COD INTO :EXISTE;
          if (EXISTE = 'S') then
            UPDATE PROVEEDOR_ARTICULO
                SET PVAR_FECHA = :FEC, PVAR_COSTO = :COSTO, PVAR_COD = NEW.rpvd_codprov
                WHERE TERC_NIT = :NIT AND ARTI_COD = NEW.ARTI_COD;
          ELSE
            INSERT INTO PROVEEDOR_ARTICULO (TERC_NIT, ARTI_COD, PVAR_COSTO, PVAR_FECHA, PVAR_COD,PVAR_DES)
                VALUES (:NIT, NEW.ARTI_COD, :COSTO, :FEC, NEW.rpvd_codprov,NEW.rpvd_desc);
         END
        end
    if (CONSOLIDA <> 0) then
        BEGIN
        EXECUTE PROCEDURE LEE_CONFIGURACION ('COMPRAS','DOCUMENTOS','SUMAR CANTIDADES PENDIENTES AL CONSOLIDAR DOCUMENTOS') returning_values (CONSO);
        /* IGNORE LA CONSOLIDACION SI SE VALIDAN CODIGOS DE LA ORDEN */
        SELECT MIN(CEFA_TIPOORI) FROM consolide_faltantes WHERE CEFA_ID = :CONSOLIDA INTO :NUMROWS;
        if (NUMROWS = 23) then
            BEGIN
            EXECUTE PROCEDURE LEE_CONFIGURACION('COMPRAS', 'REMISIONES', 'VERIFICAR CODIGOS DE LA ORDEN') returning_values (MENORV);
            if (MENORV = 'SI') then
                CONSO = 'NO';
            END
        SELECT COUNT(CEFA_ITEM) FROM consolide_faltantes WHERE CEFA_ID = :CONSOLIDA INTO :NUMROWS;
        if ((CONSO = 'SI') AND (NUMROWS > 1)) then
            UPDATE consolidado_faltantes SET COFA_IDDES = NEW.repr_id, COFA_OK = 'S' WHERE COFA_ID = :consolida;
        ELSE
            BEGIN
            /* BUSQUE EL CONSOLIDADO EN EL MISMO ITEM Y SI ES DIFERENTE ACTUALICELO */
            select COFA_CANT * COFA_FACTOR FROM consolidado_faltantes WHERE COFA_ID = :consolida AND COFA_ITEM = NEW.RPVD_ITEM AND ARTI_COD = NEW.arti_cod INTO :CANTREL;
            if (NEW.RPVD_CANT * NEW.RPVD_FACTOR < CANTREL) then
                UPDATE consolidado_faltantes SET COFA_IDDES = NEW.repr_id, COFA_CANT = NEW.RPVD_CANT, COFA_FACTOR = NEW.RPVD_FACTOR
                    WHERE COFA_ID = :consolida AND COFA_ITEM = NEW.RPVD_ITEM AND ARTI_COD = NEW.arti_cod;
            else
                UPDATE consolidado_faltantes SET COFA_IDDES = NEW.repr_id, COFA_OK = 'S' WHERE COFA_ID = :consolida AND COFA_ITEM = NEW.RPVD_ITEM AND ARTI_COD = NEW.arti_cod;
            END
        END
    END
END
^

SET TERM ; ^

/* quedaba la salida del documento como 66 y no como 62 al anular no reponia las formas de pago */

SET TERM ^ ;

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

SET TERM ; ^

GRANT UPDATE,REFERENCES ON EGRESOS_CAJA TO TRIGGER EGRESOS_CAJA_AI;
GRANT EXECUTE ON PROCEDURE LEE_CONFIGURACION TO TRIGGER EGRESOS_CAJA_AI;
GRANT SELECT ON EGRESOS TO TRIGGER EGRESOS_CAJA_AI;
GRANT SELECT,INSERT,UPDATE ON MOVIMIENTO_CAJA TO TRIGGER EGRESOS_CAJA_AI;
GRANT SELECT,UPDATE ON DOCUMENTOS_PAGO_CAJA TO TRIGGER EGRESOS_CAJA_AI;
GRANT EXECUTE ON PROCEDURE RESTE_SALDO_EFECTIVO TO TRIGGER EGRESOS_CAJA_AI;

SET TERM ^ ;

CREATE OR ALTER PROCEDURE PUNTOS_VENDEDOR_FECHAS(
    VENDI INTEGER,
    VENDF INTEGER,
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    CODVEN INTEGER,
    NOMVEN VARCHAR(60),
    FECDOC DATE,
    CLIENTE VARCHAR(60),
    NUMDOC VARCHAR(10),
    MONDOC NUMERIC(18,2),
    FECREC DATE,
    NUMREC VARCHAR(10),
    MONREC NUMERIC(18,2),
    COMI CHAR(2),
    DB NUMERIC(18,2),
    CR NUMERIC(18,2))
AS
declare variable TIPO INTEGER;
declare variable ID INTEGER;
begin
FOR SELECT VEND_COD, PTVT_FECHA, PTVT_TIPODOC, PTVT_IDDOC, PTVT_DB, PTVT_CR FROM puntos_vendedor
    WHERE PTVT_FECHA >= :FECINI AND PTVT_FECHA <= :FECFIN AND VEND_COD >= :VENDI AND VEND_COD <= :VENDF
    ORDER BY VEND_COD, PTVT_FECHA, PTVT_TIPODOC, PTVT_IDDOC
    INTO :CODVEN, :FECDOC, :tipo, :id, :db, :cr
    DO
    BEGIN
    SELECT VEND_NOMBRE FROM VENDEDORES WHERE VEND_COD = :codven INTO :nomven;
    if (TIPO = 31) then
        SELECT PREF_PRE || FACT_NUMERO, FACT_TOTAL, fact_nomcliente FROM FACTURAS WHERE FACT_ID = :ID INTO :numdoc, :mondoc, :CLIENTE;
    if (TIPO = 33) then
        SELECT PREF_PRE || DEVT_NUMERO, DEVT_TOTAL, DEVT_NOMTERC FROM devoluciones_ventas WHERE DEVT_ID = :ID INTO :numdoc, :mondoc, :CLIENTE;
    if (TIPO = 41) then
        SELECT PREF_PRE || NDCL_NUMERO, NDCL_MONTO, NDCL_CONC FROM notas_debito_clientes WHERE NDCL_ID = :ID INTO :numdoc, :mondoc, :CLIENTE;
    if (TIPO = 42) then
        SELECT PREF_PRE || NCCL_NUMERO, NCCL_MONTO, NCCL_CONC FROM notas_credito_clientes WHERE NCCL_ID = :ID INTO :numdoc, :mondoc, :CLIENTE;

    SELECT MAX(PREF_PRE || RECA_NUMERO), MAX(RECA_FECHA), SUM(RCDE_ABONO), MAX(RCDE_COMIP) FROM RECIBOS_CAJA R, RECIBOS_CAJA_DETALLE D
        WHERE R.reca_id = D.reca_id AND RECA_FECHA = :FECDOC AND D.rcde_tipodoc = :TIPO AND D.rcde_iddoc = :id
        INTO :numrec, :fecrec, :monrec, :comi;
    suspend;
    END
end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER PROCEDURE CUADRE_CAJA_DETALLE(
    FECHA DATE)
RETURNS (
    CXCTIPO VARCHAR(10),
    CXCNUMERO VARCHAR(10),
    CXCMONTO NUMERIC(18,2))
AS
declare variable id integer;
declare variable TIPO integer;
declare variable ABONO NUMERIC(18,2);
begin
/* DETALLE DE LA CARTERA DEL DIA */
for SELECT MVCL_IDREF, mvcl_tiporef, TIDO_NOMCORTO, MVCL_PREFREF || MVCL_NUMREF, MVCL_MONTO FROM MOVIMIENTO_CLIENTES M, TIPO_DOCUMENTO T
    WHERE MVCL_FECHA = :FECHA AND MVCL_ABONO = 'N' AND M.mvcl_tiporef = T.tido_cod
    into :id, :TIPO, :cxctipo, :cxcnumero, cxcmonto
    do
    BEGIN
    if (cxcmonto IS NULL) then
        cxcmonto = 0;
    SELECT sum(SDCA_ABONO) FROM SALDOS_DOC_CARTERA WHERE sdca_idref = :id AND sdca_tiporef = :TIPO AND SDCA_FECHA = :FECHA AND SDCA_ABONO <> 0
        INTO :ABONO;
    if (ABONO IS NULL) then
        ABONO = 0;
    if (CXCMONTO <> ABONO) then
        BEGIN
        if ((cxctipo = 'DEVOLCLI') or (cxctipo = 'NOTACRCL')) then
            begin
            cxcmonto = cxcmonto + abono;
            CXCMONTO = CXCMONTO * -1;
            end
        else
            cxcmonto = cxcmonto - abono;
        SUSPEND;
        END
    END
end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER FACTURAS_BI FOR FACTURAS
ACTIVE BEFORE INSERT POSITION 0
AS
declare variable NUMERO VARCHAR(6);
declare variable AUTOM CHAR(1);
declare variable EXISTE CHAR(1);
DECLARE VARIABLE VALCUPO CHAR(10);
declare variable DISPONIBLE NUMERIC(18,2);
declare variable OK CHAR(1);
declare variable SITOT CHAR(2);
declare variable CODCOBR INTEGER;
declare variable CODVEND INTEGER;
declare variable contado char(1);
declare variable BLOQAUTO CHAR(2);
declare variable FECCONTA VARCHAR(8);
declare variable FECBLO VARCHAR(8);
BEGIN
EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION', 'POS', 'CAMBIAR FECHA DE BLOQUEO AUTOMATICAMENTE AL CAMBIAR FECHA DE LA FACTURA') RETURNING_VALUES (:bloqauto);
if (bloqauto = 'SI') then
    BEGIN
    EXECUTE PROCEDURE LEE_CONFIGURACION ('CONTABILIDAD', 'GENERAL', 'FECHA DE BLOQUEO') RETURNING_VALUES (:FECBLO);
    EXECUTE PROCEDURE fecha_a_conta (NEW.fact_fecha) returning_values (:FECCONTA);
    if (FECBLO > FECCONTA) then
        EXCEPTION CONTABILIDAD_BLOQUEADA;
    if (FECBLO < FECCONTA) then
        UPDATE CONFIGURACION
            SET CONF_VALOR = :FECCONTA
            WHERE (CONF_MODULO = 'CONTABILIDAD') AND (CONF_CATEGORIA = 'GENERAL') AND (CONF_PROPIEDAD = 'FECHA DE BLOQUEO');
    END
OK = 'S';
EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'ACCION A TOMAR SI EL CUPO DE CREDITO ES INSUFICIENTE') RETURNING_VALUES (:VALCUPO);
select auto_contado from autorizaciones where pref_pre = new.pref_pre and tido_cod = 31 into :contado;
if (contado='N') then
BEGIN
  IF (VALCUPO = 'PROHIBIR') THEN
  BEGIN
  OK = 'N';
  /* VERIFIQUE EL CUPO DE CREDITO */
  execute procedure cupo_disponible(new.TERC_NIT, NEW.fact_fecha, NEW.fact_sucursal) returning_values (:DISPONIBLE);
  if (DISPONIBLE >= NEW.FACT_TOTAL) then
    OK = 'S';
  END
END
IF (OK = 'S') THEN
  begin
  /* calcule la comision */
  EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION', 'VENDEDORES', 'COMISIONES EN VENTA INCLUYENDO IMPUESTOS') returning_values (:SITOT);
  if ((NEW.fact_comiporc IS NULL) or (NEW.fact_comiporc = 0)) THEN
    BEGIN
    if (SITOT = 'SI') then
      SELECT MAX(COMI_PORC) FROM comisiones WHERE VEND_COD = NEW.vend_cod AND
        COMI_INICIAL <= NEW.fact_total AND COMI_FINAL >= NEW.fact_total
        INTO NEW.fact_comiporc;
    else
      SELECT MAX(COMI_PORC) FROM comisiones WHERE VEND_COD = NEW.vend_cod AND
        COMI_INICIAL <= (NEW.fact_total -NEW.fact_ivamonto) AND COMI_FINAL >= (NEW.fact_total -NEW.fact_ivamonto)
        INTO NEW.fact_comiporc;
    if (NEW.fact_comiporc IS NULL) then
        NEW.fact_comiporc = 0;
    END
  if (SITOT = 'SI') then
      NEW.fact_comimonto = NEW.fact_total * NEW.fact_comiporc / 100;
  ELSE
      NEW.fact_comimonto = (NEW.fact_total -NEW.fact_ivamonto) * NEW.fact_comiporc / 100;

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

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

select auto_numero from autorizaciones where auto_inicial <= new.fact_numero and auto_final >= new.fact_numero and auto_fecha <= new.fact_fecha and auto_vence >= new.fact_fecha and pref_pre = new.pref_pre into new.auto_numero;
END
^

SET TERM ; ^

GRANT SELECT,UPDATE,REFERENCES ON FACTURAS TO TRIGGER FACTURAS_BI;
GRANT EXECUTE ON PROCEDURE LEE_CONFIGURACION TO TRIGGER FACTURAS_BI;
GRANT EXECUTE ON PROCEDURE FECHA_A_CONTA TO TRIGGER FACTURAS_BI;
GRANT SELECT,UPDATE ON CONFIGURACION TO TRIGGER FACTURAS_BI;
GRANT SELECT ON AUTORIZACIONES TO TRIGGER FACTURAS_BI;
GRANT EXECUTE ON PROCEDURE CUPO_DISPONIBLE TO TRIGGER FACTURAS_BI;
GRANT SELECT ON COMISIONES TO TRIGGER FACTURAS_BI;
GRANT SELECT,UPDATE ON PREFIJOS TO TRIGGER FACTURAS_BI;
GRANT EXECUTE ON PROCEDURE COMPLETA_CEROS TO TRIGGER FACTURAS_BI;
GRANT SELECT ON CLIENTE_SUCURSALES TO TRIGGER FACTURAS_BI;

INSERT INTO CONFIGURACION (CONF_MODULO, CONF_CATEGORIA, CONF_PROPIEDAD, CONF_VALOR, CONF_POSIBLES, CONF_AYUDA) VALUES ('FACTURACION', 'POS', 'CAMBIAR FECHA DE BLOQUEO AUTOMATICAMENTE AL CAMBIAR FECHA DE LA FACTURA', 'NO', 'SI,NO', 'SI: El sistema modificará automáticamente la fecha de bloqueo contable cada vez que se grabe una factura con fecha posterior al bloqueo impidiendo nuevos registros de fechas anteriores');
commit work;

SET TERM ^ ;

CREATE OR ALTER TRIGGER COMPROBANTE_DETALLE_AU FOR COMPROBANTE_DETALLE
ACTIVE AFTER UPDATE POSITION 0
AS
DECLARE VARIABLE FECHA CHAR(8);
DECLARE VARIABLE DIF_DB NUMERIC(15,2);
DECLARE VARIABLE DIF_CR NUMERIC(15,2);
BEGIN
/* DESHAGA LO VIEJO */
SELECT ENCO_FECHA FROM COMPROBANTE_ENCABEZADO WHERE ENCO_CONSEC = NEW.ENCO_CONSEC INTO :FECHA;
DIF_DB = - OLD.CODE_DEBITO;
DIF_CR = - OLD.CODE_CREDITO;
EXECUTE PROCEDURE ACTUALICE_SALDO_CENTRO_TERCERO(OLD.CUEN_COD, OLD.PROY_COD, OLD.CENT_COD, OLD.TERC_NIT, FECHA, DIF_DB, DIF_CR);
EXECUTE PROCEDURE ACTUALICE_SALDO_CENTRO(OLD.CUEN_COD, OLD.PROY_COD, OLD.CENT_COD, FECHA, DIF_DB, DIF_CR);
EXECUTE PROCEDURE ACTUALICE_SALDO_TERCERO(OLD.CUEN_COD, OLD.TERC_NIT, FECHA, DIF_DB, DIF_CR);
EXECUTE PROCEDURE ACTUALICE_SALDO_CUENTA(OLD.CUEN_COD, FECHA, DIF_DB, DIF_CR);
if (OLD.ARTI_COD IS NOT NULL) then
    EXECUTE PROCEDURE ACTUALICE_SALDO_ARTICULO(OLD.CUEN_COD, OLD.ARTI_COD, FECHA, DIF_DB, DIF_CR);
/* GRABE LOS NUEVOS */
SELECT ENCO_FECHA FROM COMPROBANTE_ENCABEZADO WHERE ENCO_CONSEC = NEW.ENCO_CONSEC INTO :FECHA;
EXECUTE PROCEDURE ACTUALICE_SALDO_CENTRO_TERCERO(NEW.CUEN_COD, NEW.PROY_COD, NEW.CENT_COD, NEW.TERC_NIT, FECHA, NEW.CODE_DEBITO, NEW.CODE_CREDITO);
EXECUTE PROCEDURE ACTUALICE_SALDO_CENTRO(NEW.CUEN_COD, NEW.PROY_COD, NEW.CENT_COD, FECHA, NEW.CODE_DEBITO, NEW.CODE_CREDITO);
EXECUTE PROCEDURE ACTUALICE_SALDO_TERCERO(NEW.CUEN_COD, NEW.TERC_NIT, FECHA, NEW.CODE_DEBITO, NEW.CODE_CREDITO);
EXECUTE PROCEDURE ACTUALICE_SALDO_CUENTA(NEW.CUEN_COD, FECHA, NEW.CODE_DEBITO, NEW.CODE_CREDITO);
if (NEW.ARTI_COD IS NOT NULL) then
    EXECUTE PROCEDURE ACTUALICE_SALDO_ARTICULO(NEW.CUEN_COD, NEW.ARTI_COD, FECHA, NEW.code_debito, NEW.code_credito);
END
^

SET TERM ; ^

GRANT UPDATE,REFERENCES ON COMPROBANTE_DETALLE TO TRIGGER COMPROBANTE_DETALLE_AU;
GRANT SELECT ON COMPROBANTE_ENCABEZADO TO TRIGGER COMPROBANTE_DETALLE_AU;
GRANT EXECUTE ON PROCEDURE ACTUALICE_SALDO_CENTRO_TERCERO TO TRIGGER COMPROBANTE_DETALLE_AU;
GRANT EXECUTE ON PROCEDURE ACTUALICE_SALDO_CENTRO TO TRIGGER COMPROBANTE_DETALLE_AU;
GRANT EXECUTE ON PROCEDURE ACTUALICE_SALDO_TERCERO TO TRIGGER COMPROBANTE_DETALLE_AU;
GRANT EXECUTE ON PROCEDURE ACTUALICE_SALDO_CUENTA TO TRIGGER COMPROBANTE_DETALLE_AU;
GRANT EXECUTE ON PROCEDURE ACTUALICE_SALDO_ARTICULO TO TRIGGER COMPROBANTE_DETALLE_AU;


/* 20080709b compras, recalcular precio unitario */

INSERT INTO CONFIGURACION (CONF_MODULO, CONF_CATEGORIA, CONF_PROPIEDAD, CONF_VALOR, CONF_POSIBLES, CONF_AYUDA) VALUES ('COMPRAS', 'DOCUMENTOS', 'RECALCULAR COSTOS UNITARIOS AL CAMBIAR IMPUESTOS INCLUIDOS', 'NO', 'SI,NO', 'SI: Al cambiar la condición de impuestos incluidos en el encabezado se recalculan todos los precios unitarios y los impuestos. NO: Se conserva el mismo precio unitario originalmente digitado y se recalculan los impuestos');
commit work;


/* 20080714 */

INSERT INTO CONFIGURACION (CONF_MODULO, CONF_CATEGORIA, CONF_PROPIEDAD, CONF_VALOR, CONF_POSIBLES, CONF_AYUDA) VALUES ('COMPRAS', 'DOCUMENTOS', 'SUGERIR ULTIMO COSTO POR PROVEEDOR O GENERAL PARA EL ARTICULO', 'PROVEEDOR', 'PROVEEDOR,GENERAL', 'PROVEEDOR:Suguiere el último costo para el proveedor específico del documento, GENERAL: Suguiere el ultimo costo del artículo');
commit work;

SET TERM ^ ;

CREATE OR ALTER PROCEDURE COSTO_PROVEEDOR(
    NIT VARCHAR(20),
    ARTI VARCHAR(15),
    FECHA DATE)
RETURNS (
    COSTO NUMERIC(18,2))
AS
declare variable UNIDAD VARCHAR(8);
declare variable porprov char(10);
BEGIN
execute procedure lee_configuracion('COMPRAS', 'DOCUMENTOS', 'SUGERIR ULTIMO COSTO POR PROVEEDOR O GENERAL PARA EL ARTICULO') returning_values (:porprov);
/* busque el costo del proveedor, cuendo no hay trae el ultimo */
SELECT PVAR_COSTO FROM PROVEEDOR_ARTICULO
    WHERE TERC_NIT = :Nit AND ARTI_COD = :ARTI
    INTO :COSTO;
if ((COSTO IS NULL) or (PORPROV = 'GENERAL')) then
    BEGIN
    SELECT ARTI_UNIDAD FROM ARTICULO WHERE ARTI_COD = :ARTI INTO :UNIDAD;
    EXECUTE PROCEDURE ultimo_costo(:ARTI, :FECHA, :UNIDAD) returning_values (:COSTO);
    END
SUSPEND;
END
^

SET TERM ; ^

GRANT EXECUTE ON PROCEDURE LEE_CONFIGURACION TO PROCEDURE COSTO_PROVEEDOR;
GRANT SELECT ON PROVEEDOR_ARTICULO TO PROCEDURE COSTO_PROVEEDOR;
GRANT SELECT ON ARTICULO TO PROCEDURE COSTO_PROVEEDOR;
GRANT EXECUTE ON PROCEDURE ULTIMO_COSTO TO PROCEDURE COSTO_PROVEEDOR;

/* 20080715 */
SET TERM ^ ;

CREATE OR ALTER PROCEDURE EXISTE_TERCERO(
    NIT VARCHAR(20))
RETURNS (
    OK CHAR(1))
AS
BEGIN
  OK = 'N';
  SELECT 'S' FROM TERCEROS WHERE TERC_NIT = :NIT AND TERC_ESTADO = 'S' INTO :OK;
  SUSPEND;
END
^

SET TERM ; ^

GRANT SELECT ON TERCEROS TO PROCEDURE EXISTE_TERCERO;

SET TERM ^ ;

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

SET TERM ; ^

SET TERM ^ ;

ALTER TRIGGER PLANTILLA_DETALLE_BI
AS
DECLARE VARIABLE OK CHAR(1);
DECLARE VARIABLE TERCERO CHAR(1);
DECLARE VARIABLE RETENCION CHAR(1);
DECLARE VARIABLE CENTRO CHAR(1);
declare variable TIPO CHAR(1);
BEGIN
/* VERIFIQUE QUE LA CUENTA EXISTA Y QUE SEA AFECTABLE */
EXECUTE PROCEDURE VALIDE_CUENTA (NEW.CUEN_COD) RETURNING_VALUES (:OK);
IF (OK = 'S') THEN
  BEGIN
  IF (NEW.PLDE_DEBITOS IS NULL) THEN
        NEW.PLDE_DEBITOS = 0;
        IF (NEW.PLDE_CREDITOS IS NULL) THEN
          NEW.PLDE_CREDITOS = 0;
    if (NEW.plde_base IS NULL) then
    NEW.PLDE_BASE = 0;
    if (NEW.plde_porc IS NULL) then
    NEW.PLDE_PORC = 0;
  IF (NEW.TERC_NIT IS NULL) THEN
    EXECUTE PROCEDURE LEE_CONFIGURACION('CONTABILIDAD', 'GENERAL', 'NIT COMPAÑIA') RETURNING_VALUES (NEW.TERC_NIT);
  IF (NEW.PROY_COD IS NULL) THEN
    EXECUTE PROCEDURE LEE_CONFIGURACION('CONTABILIDAD', 'GENERAL', 'PROYECTO UNICO') RETURNING_VALUES (NEW.PROY_COD);
  IF (NEW.CENT_COD IS NULL) THEN
    EXECUTE PROCEDURE LEE_CONFIGURACION('CONTABILIDAD', 'GENERAL', 'CENTRO DE COSTOS UNICO') RETURNING_VALUES (NEW.CENT_COD);
  SELECT CUEN_TERCERO, CUEN_RETENCION, CUEN_CENTRO, CUEN_TIPO FROM CUENTAS WHERE CUEN_COD = NEW.CUEN_COD INTO :TERCERO, :RETENCION, :CENTRO, :TIPO;
  /* VERIFIQUE QUE LA CUENTA PERMITA RETENCION Y VERIFIQUE EL TERCERO */
  IF (TERCERO = 'S' OR RETENCION = 'S') THEN
    EXECUTE PROCEDURE EXISTE_TERCERO (NEW.TERC_NIT) RETURNING_VALUES (:OK);
  ELSE
    EXECUTE PROCEDURE LEE_CONFIGURACION('CONTABILIDAD', 'GENERAL', 'NIT COMPAÑIA') RETURNING_VALUES (NEW.TERC_NIT);
  IF (OK = 'S') THEN
    BEGIN
    /* SI LA CUENTA ES DE RETENCION ASEGURECE QUE TENGA BASE Y PORCENTAJE */
    IF (RETENCION = 'S') THEN
      BEGIN
      IF ((NEW.PLDE_BASE = 0) OR (NEW.PLDE_PORC = 0)) THEN
        EXCEPTION FALTA_BASE 'FALTA INDICAR LA BASE PARA LA CUENTA ' || NEW.cuen_cod;
      END
    ELSE
       BEGIN
      IF (CENTRO = 'S') THEN
        EXECUTE PROCEDURE EXISTE_CENTRO (NEW.PROY_COD, NEW.CENT_COD) RETURNING_VALUES (:OK);
        ELSE
        BEGIN
        EXECUTE PROCEDURE LEE_CONFIGURACION('CONTABILIDAD', 'GENERAL', 'PROYECTO UNICO') RETURNING_VALUES (NEW.PROY_COD);
        EXECUTE PROCEDURE LEE_CONFIGURACION('CONTABILIDAD', 'GENERAL', 'CENTRO DE COSTOS UNICO') RETURNING_VALUES (NEW.CENT_COD);
          END
      END
  END
  if (:TIPO = 'I') then
    BEGIN
    if (NEW.ARTI_COD IS NULL) then
        EXCEPTION FALTA_ARTICULO 'FALTA INDICAR EL ARTICULO PARA LA CUENTA ' || NEW.cuen_cod;
    END
END
END
^

SET TERM ; ^

SET TERM ^ ;

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

SET TERM ; ^



/* CANTIDAD COMPRADA EN LA ULTIMA FECHA */
SET TERM ^ ;

CREATE OR ALTER PROCEDURE EXISTENCIAS_COMPRAS(
    ARTICULO VARCHAR(15),
    FECHA DATE,
    UNIDAD VARCHAR(8))
RETURNS (
    BODEGA VARCHAR(2),
    EXISTENCIA NUMERIC(18,4),
    RESERVADO NUMERIC(18,4),
    ORDENADO NUMERIC(18,4),
    PROMEDIO NUMERIC(18,4),
    VENTAMES NUMERIC(18,4),
    FECHACMP DATE,
    CANTCMP NUMERIC(18,4),
    DIAS INTEGER,
    SUGERIDO NUMERIC(18,4),
    STAND VARCHAR(15))
AS
declare variable FACTOR NUMERIC(15,4);
declare variable ORDENC NUMERIC(18,4);
declare variable PEDIDO NUMERIC(18,4);
declare variable ITEM INTEGER;
declare variable ID INTEGER;
declare variable UND VARCHAR(8);
declare variable CANT NUMERIC(18,4);
declare variable FACTOR2 NUMERIC(18,4);
declare variable fecini DATE;
declare variable FECHAAUX VARCHAR(10);
declare variable AGENCIA INTEGER;
declare variable DEVMES NUMERIC(18,2);
declare variable MFAC INTEGER;
declare variable MDEV INTEGER;
declare variable IVAF NUMERIC(18,2);
declare variable IVAD NUMERIC(18,2);
declare variable DIA_ART VARCHAR(2) CHARACTER SET NONE;
declare variable DIASC VARCHAR(255);
declare variable PEDAUTO CHAR(2);
declare variable SALIDAS NUMERIC(18,4);
BEGIN
  for select bode_cod, SUCU_ID from bodega into :bodega, :agencia
    do
    begin
    execute procedure saldo_inventario (:articulo, :bodega, :fecha) returning_values (:Existencia);
    EXECUTE PROCEDURE FACTOR_UNIDAD_CANT(:ARTICULO, :UNIDAD) returning_values (:FACTOR);
    if (FACTOR <> 0) then
        EXISTENCIA = EXISTENCIA / FACTOR;
    else
        EXISTENCIA = 0;
    SELECT MAX(EXIS_STAND) FROM EXISTENCIA WHERE ARTI_COD = :ARTICULO AND BODE_COD = :BODEGA INTO :STAND;
    EXECUTE PROCEDURE promedio_salidas_articulo (:ARTICULO, :FECHA, :BODEGA) returning_values (:PROMEDIO, :SALIDAS);
    EXECUTE PROCEDURE lee_configuracion ('INVENTARIO', 'EXISTENCIAS', 'PROMEDIAR LAS SALIDAS DEL INVENTARIO CON EL NUMERO DE DIAS ASIGNADO A CADA ARTICULO') returning_values (:DIA_ART);
    if (DIA_ART = 'NO') then
        BEGIN
        EXECUTE PROCEDURE lee_configuracion ('INVENTARIO', 'EXISTENCIAS', 'NUMERO DE DIAS PARA PROMEDIO DE SALIDAS POR ARTICULO') returning_values (DIASC);
        DIAS = CAST(DIASC AS INTEGER);
        END
    ELSE
        SELECT ARTI_DIAS FROM ARTICULO WHERE ARTI_COD = :ARTICULO INTO :DIAS;
    if (DIAS is null) then
        DIAS = 0;
    PROMEDIO = DIAS * PROMEDIO;
    if (FACTOR <> 0) then
        PROMEDIO = PROMEDIO / FACTOR;
    SUGERIDO = PROMEDIO - EXISTENCIA;
    SELECT SUM(ORID_ENTREGAR)
      FROM ORDENINVENTARIO_DETALLE OD, ordenes_inventario O
      WHERE O.ORIN_ID = OD.ORIN_ID AND ARTI_COD = :ARTICULO AND ORIN_FECHA <= :FECHA AND ORIN_FECLLEGA >= :FECHA AND ORID_ANULADO = 'N' AND OD.BODE_COD = :BODEGA
      INTO :ORDENADO;
    if (ORDENADO IS NULL) then
        ORDENADO = 0;
    ORDENC = 0;
    FOR SELECT O.ORDC_ID, OCDE_ITEM, OCDE_CANT * OCDE_FACTOR
        FROM ORDENES_COMPRA O, ORDENES_COMPRA_DETALLE OD
        WHERE O.ORDC_ID = OD.ORDC_ID AND OD.ARTI_COD = :ARTICULO AND (ORDC_FECHA+ORDC_VALIDEZ) >= :FECHA AND ORDC_FECHA <= :FECHA AND OCDE_ANULADO = 'N' AND OD.BODE_COD = :BODEGA
        INTO :ID, :ITEM, :CANT
        do
        BEGIN
        EXECUTE PROCEDURE FALTANTE(23, 21, ID, ITEM) returning_values (PEDIDO, UND, FACTOR2);
        if (PEDIDO * FACTOR2 = CANT) then /* SI NO SE HA FACTURADO MIRE A VER SI SE REMISIONO */
            EXECUTE PROCEDURE FALTANTE(23, 22, ID, ITEM) returning_values (PEDIDO, UND, FACTOR2);
        if (PEDIDO IS NULL) then
            PEDIDO = 0;
        ORDENC = ORDENC + PEDIDO * FACTOR2;
        END
    ORDENADO = ORDENADO + ORDENC;
    if (FACTOR <> 0) then
        ORDENADO = ORDENADO / FACTOR;
    SELECT SUM(RSDE_LIBERAR)
      FROM RESERVAS_DETALLE RD, RESERVAS R
      WHERE R.RESE_ID = RD.RESE_ID AND ARTI_COD = :ARTICULO AND RESE_FECHA <= :FECHA AND RESE_VENCE >= :FECHA AND RD.BODE_COD = :BODEGA AND RSDE_ANULADO = 'N'
      INTO :RESERVADO;
    if (RESERVADO IS NULL) then
        RESERVADO = 0;
    PEDIDO = 0;
    FOR SELECT P.PEDI_ID, PEDE_ITEM, PEDE_CANT * PEDE_FACTOR
        FROM PEDIDOS P, PEDIDOS_DETALLE PD
        WHERE P.PEDI_ID = PD.PEDI_ID AND PD.ARTI_COD = :ARTICULO AND (PEDI_FECHA+PEDI_VALIDEZ) >= :FECHA AND PEDI_FECHA <= :FECHA AND PEDE_ANULADO = 'N' AND BODE_COD = :BODEGA
        INTO :ID, :ITEM, :CANT
        do
        BEGIN
        EXECUTE PROCEDURE FALTANTE(34, 31, ID, ITEM) returning_values (ORDENC, UND, FACTOR2);
        EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION', 'FACTURAS', 'GENERAR PEDIDO AUTOMATICAMENTE CON LA FACTURA') returning_values (pedauto);
        if ((ORDENC * FACTOR2 = CANT) or (PEDAUTO = 'SI')) then /* SI NO SE HA FACTURADO MIRE A VER SI SE REMISIONO */
            EXECUTE PROCEDURE FALTANTE(34, 32, ID, ITEM) returning_values (ORDENC, UND, FACTOR2);
        if (ORDENC IS NULL) then
            ORDENC = 0;
        PEDIDO = PEDIDO + ORDENC * FACTOR2;
        END
    RESERVADO = RESERVADO + PEDIDO;
    if (FACTOR <> 0) then
        RESERVADO = RESERVADO / FACTOR;
    /* VENTAS MES */
    FECHAAUX = CAST (FECHA AS VARCHAR(10));
    FECHAAUX = SUBSTR(FECHAAUX, 1, 7) || '/01';
    FECINI = CAST (FECHAAUX AS DATE);
    EXECUTE PROCEDURE ventas_articulo (:ARTICULO, :FECINI, :FECHA, :agencia) returning_values (:ventames, :mfac, :devmes, :mdev, :ivaf, :ivad);
    ventames = ventames - devmes;
    if (FACTOR <> 0) then
        ventames = ventames / FACTOR;
    /* FECHA COMPRA */
    SELECT FIRST 1 FACO_FECHA, FCDE_CANT * FCDE_FACTOR FROM FACTURAS_COMPRA F, FACTURAS_COMPRAS_DETALLE D
        WHERE F.FACO_ID = D.faco_id AND D.ARTI_COD = :articulo AND FACO_FECHA <= :FECHA AND D.bode_cod = :BODEGA
        ORDER BY FACO_FECHA DESC, F.FACO_ID DESC
        INTO :fechacmp, :cantcmp;
    SUSPEND;
    end
END
^

SET TERM ; ^

GRANT SELECT ON BODEGA TO PROCEDURE EXISTENCIAS_COMPRAS;
GRANT EXECUTE ON PROCEDURE SALDO_INVENTARIO TO PROCEDURE EXISTENCIAS_COMPRAS;
GRANT EXECUTE ON PROCEDURE FACTOR_UNIDAD_CANT TO PROCEDURE EXISTENCIAS_COMPRAS;
GRANT SELECT ON EXISTENCIA TO PROCEDURE EXISTENCIAS_COMPRAS;
GRANT EXECUTE ON PROCEDURE PROMEDIO_SALIDAS_ARTICULO TO PROCEDURE EXISTENCIAS_COMPRAS;
GRANT EXECUTE ON PROCEDURE LEE_CONFIGURACION TO PROCEDURE EXISTENCIAS_COMPRAS;
GRANT SELECT ON ARTICULO TO PROCEDURE EXISTENCIAS_COMPRAS;
GRANT SELECT ON ORDENINVENTARIO_DETALLE TO PROCEDURE EXISTENCIAS_COMPRAS;
GRANT SELECT ON ORDENES_INVENTARIO TO PROCEDURE EXISTENCIAS_COMPRAS;
GRANT SELECT ON ORDENES_COMPRA TO PROCEDURE EXISTENCIAS_COMPRAS;
GRANT SELECT ON ORDENES_COMPRA_DETALLE TO PROCEDURE EXISTENCIAS_COMPRAS;
GRANT EXECUTE ON PROCEDURE FALTANTE TO PROCEDURE EXISTENCIAS_COMPRAS;
GRANT SELECT ON RESERVAS_DETALLE TO PROCEDURE EXISTENCIAS_COMPRAS;
GRANT SELECT ON RESERVAS TO PROCEDURE EXISTENCIAS_COMPRAS;
GRANT SELECT ON PEDIDOS TO PROCEDURE EXISTENCIAS_COMPRAS;
GRANT SELECT ON PEDIDOS_DETALLE TO PROCEDURE EXISTENCIAS_COMPRAS;
GRANT EXECUTE ON PROCEDURE VENTAS_ARTICULO TO PROCEDURE EXISTENCIAS_COMPRAS;
GRANT SELECT ON FACTURAS_COMPRA TO PROCEDURE EXISTENCIAS_COMPRAS;
GRANT SELECT ON FACTURAS_COMPRAS_DETALLE TO PROCEDURE EXISTENCIAS_COMPRAS;



SET TERM ^ ;

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

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

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

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

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

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

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

FOR SELECT E.EGRE_ID, PREF_PRE, EGRE_NUMERO, EGRE_FECHA, EGRE_CONC, TERC_NIT, EGDE_ABONO+EGDE_DTOF, EGDE_RTFTE, EGDE_RTIVA, EGDE_RTICA
    FROM EGRESOS_DETALLE D, EGRESOS E
    WHERE E.EGRE_ID = D.EGRE_ID AND E.EGRE_ID <> 0 AND EGRE_ANULADO = 'N' AND TERC_NIT >= :PRVINI AND TERC_NIT <= :PRVFIN
    ORDER BY EGRE_FECHA
    INTO :IDR, :PREF, :NUMERO, :FECHA, :CONC, :NIT, :MONTO, :RTFTE, :RTIVA, :RTICA
    DO
    BEGIN
    EXISTE = 'N';
    SELECT 'S' FROM MOVIMIENTO_PROVEEDOR WHERE MVPR_TIPOREF = 62 AND MVPR_IDREF = :ID INTO :EXISTE;
    if (EXISTE = 'S') then
        begin
        UPDATE movimiento_proveedor
            SET MVPR_MONTO = MVPR_MONTO + :MONTO,
                MVPR_RTFTE = MVPR_RTFTE + :rtfte,
                MVPR_RTIVA = MVPR_RTIVA + :rtiva,
                MVPR_RTICA = MVPR_RTICA + :rtica
            WHERE MVPR_TIPOREF = 62 AND MVPR_IDREF = :IDR;
        end
    ELSE
        INSERT INTO MOVIMIENTO_PROVEEDOR (MVPR_ID, TERC_NIT, MVPR_TIPOREF, MVPR_IDREF, MVPR_FECHA, MVPR_VENCE, MVPR_CONC, MVPR_MONTO, MVPR_RTFTE, MVPR_RTIVA, MVPR_RTICA, MVPR_DEBITO, MVPR_ABONO, MVPR_PREFIJO, MVPR_NUMERO)
            VALUES (GEN_ID(ID_MOVPROV, 1), :NIT, 62, :IDR, :FECHA, :FECHA, :CONC, :MONTO, :RTFTE, :RTIVA, :RTICA, 'N', 'S', :PREF, :NUMERO);
    END
END
^

SET TERM ; ^

GRANT SELECT,DELETE ON ANTICIPOS_PROVEEDOR TO PROCEDURE CHEQUEO_MOVIMIENTO_CXPAGAR;
GRANT SELECT,DELETE ON SALDOS_DOC_CXPAGAR TO PROCEDURE CHEQUEO_MOVIMIENTO_CXPAGAR;
GRANT SELECT,INSERT,DELETE,UPDATE ON MOVIMIENTO_PROVEEDOR TO PROCEDURE CHEQUEO_MOVIMIENTO_CXPAGAR;
GRANT SELECT ON FACTURAS_COMPRA TO PROCEDURE CHEQUEO_MOVIMIENTO_CXPAGAR;
GRANT SELECT ON NOTAS_DEBITO_PROVEEDOR TO PROCEDURE CHEQUEO_MOVIMIENTO_CXPAGAR;
GRANT SELECT ON DEVOLUCIONES_COMPRAS TO PROCEDURE CHEQUEO_MOVIMIENTO_CXPAGAR;
GRANT SELECT ON NOTAS_CREDITO_PROVEEDOR TO PROCEDURE CHEQUEO_MOVIMIENTO_CXPAGAR;
GRANT SELECT ON APLICACION_PROVEEDOR_DETALLE TO PROCEDURE CHEQUEO_MOVIMIENTO_CXPAGAR;
GRANT SELECT ON APLICACION_PROVEDOR TO PROCEDURE CHEQUEO_MOVIMIENTO_CXPAGAR;
GRANT SELECT ON EGRESOS_DETALLE TO PROCEDURE CHEQUEO_MOVIMIENTO_CXPAGAR;
GRANT SELECT ON EGRESOS TO PROCEDURE CHEQUEO_MOVIMIENTO_CXPAGAR;


/* 20080716 */
/* NO RESTE LAS RETENCIONES SI EL PARAMETRO DE DESCONTAR ESTA EN NO */
SET TERM ^ ;

CREATE OR ALTER PROCEDURE CARTERA_CLIENTE(
    NIT VARCHAR(20),
    FECHA DATE,
    SUCURSAL VARCHAR(10))
RETURNS (
    TIPO INTEGER,
    ID INTEGER,
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(6),
    CONCEPTO VARCHAR(60),
    SALDO NUMERIC(18,2),
    RTFTE NUMERIC(18,2),
    RTIVA NUMERIC(18,2),
    RTICA NUMERIC(18,2),
    DTOF NUMERIC(18,2),
    TIPONOM VARCHAR(8),
    VENCE DATE,
    FECDOC DATE,
    DIAS INTEGER,
    RECPROV_ID INTEGER,
    RECIPROV CHAR(1),
    NOTA VARCHAR(256))
AS
declare variable FEC DATE;
declare variable DESC_RTES CHAR(2);
declare variable DTOAPL NUMERIC(18,2);
declare variable IDNOTA INTEGER;
declare variable AUTORET VARCHAR(10);
declare variable FAUTORET DATE;
BEGIN
  /* BUSQUE EN SALDOS_DOC_CARTERA LOS QUE TENGAN SALDO > 0 */
  FOR SELECT MVCL_TIPOREF, MVCL_IDREF, MVCL_FECHA, MVCL_VENCE, MVCL_PREFREF, MVCL_NUMREF, MVCL_CONC
  FROM MOVIMIENTO_CLIENTES
  WHERE TERC_NIT = :NIT AND mvcl_sucursal = :sucursal and MVCL_FECHA <= :FECHA AND MVCL_ABONO = 'N'
  INTO :TIPO, :ID, :FECDOC, :VENCE, :PREFIJO, :NUMERO, :CONCEPTO
    DO
    BEGIN
    DIAS = (FECHA -VENCE );
    EXECUTE PROCEDURE saldo_doc_cartera(TIPO, ID, FECHA) returning_values (SALDO);
    if (SALDO <> 0) then
        BEGIN
        SELECT TIDO_NOMCORTO FROM TIPO_DOCUMENTO WHERE TIDO_COD = :TIPO INTO :TIPONOM;
        if (TIPO = 41) then
            SELECT NDCL_DTOFMONTO, NDCL_FECHADTO FROM NOTAS_DEBITO_CLIENTES WHERE NDCL_ID = :ID INTO :DTOF, :FEC;
        if (TIPO = 42) then
            SELECT 0, NCCL_FECHA FROM NOTAS_CREDITO_CLIENTES WHERE NCCL_ID = :ID INTO :DTOF, :FEC;
        if (TIPO = 45) then
            SELECT ANCL_DTOFMONTO, ANCL_DTOFECHA FROM ANTICIPOS_CLIENTE WHERE ANCL_ID = :ID INTO :DTOF, :FEC;
        if (TIPO = 31) then
            SELECT FACT_DTOFMONTO, FACT_DTOFFECHA FROM FACTURAS WHERE FACT_ID = :ID INTO :DTOF, :FEC;
        if (TIPO = 33) then
                SELECT 0, :FECHA FROM devoluciones_ventas WHERE DEVT_ID = :ID INTO :DTOF, :FEC;
                            /* POR WILLIAM IDENTIFICAR SI EL DOCUMENTO TIENE RECIBO PROVISIONAL*/
        recprov_id = 0;
        SELECT max(RCPR_ID) FROM recibo_provisional_detalle WHERE RPDE_IDDOC = :ID AND RPDE_TIPODOC = :TIPO and RPDE_ANULADO = 'N' INTO :recprov_id;
        if /*(recprov_id = 0) or */(recprov_id is null) then
           BEGIN
           reciprov = 'N';
           end 
        ELSE
          begin 
           reciprov = 'S';
          END
         /*FIN WILLIAM*/
        if (FECHA > FEC) then
            DTOF = 0;
        if (DTOF IS NULL) then
            DTOF = 0;
        if (DTOF <> 0) then
            BEGIN
            SELECT SUM(RCDE_DTOF) FROM RECIBOS_CAJA_DETALLE WHERE RCDE_IDDOC = :ID AND RCDE_TIPODOC = :TIPO INTO :DTOAPL;
            if (DTOAPL IS NULL) then
                DTOAPL = 0;
            DTOF = DTOF - DTOAPL;
            END
        SELECT SUM(SDCA_RTFTE - SDCA_ABRTFTE), SUM(SDCA_RTIVA - SDCA_ABRTIVA), SUM(SDCA_RTICA - SDCA_ABRTICA)
            FROM SALDOS_DOC_CARTERA WHERE SDCA_TIPOREF = :TIPO AND SDCA_IDREF = :ID
            INTO :RTFTE, :RTIVA, :RTICA;
        if (RTFTE IS NULL) then
            RTFTE = 0;
        if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) THEN
            BEGIN
            if (RTFTE > 0) then
                RTFTE = 0;
            END
        ELSE
            BEGIN
            if (RTFTE < 0) then
                RTFTE = 0;
            END

        if (RTIVA IS NULL) then
            RTIVA = 0;
        if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) THEN
            BEGIN
            if (RTIVA > 0) then
                RTIVA = 0;
            END
        ELSE
            BEGIN
            if (RTIVA < 0) then
                RTIVA = 0;
            END

        if (RTICA IS NULL) then
            RTICA = 0;
        if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) THEN
            BEGIN
            if (RTICA > 0) then
                RTICA = 0;
            END
        ELSE
            BEGIN
            if (RTICA < 0) then
                RTICA = 0;
            END

        EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'FECHA AUTORETENEDOR NO DESCONTAR RETENCIONES DEL SALDO PERO SI CONTABILIZARLAS') returning_values (AUTORET);
        if (AUTORET <> '') then
            FAUTORET = CAST(AUTORET AS DATE);
        else
            FAUTORET = '9999/12/31';
        if (FAUTORET <= FECDOC) then
            BEGIN
            RTFTE = 0;
            RTIVA = 0;
            RTICA = 0;
            END
        /* RESTE LAS RETENCIONES YA QUE SE SUGERIRAN
        EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'DESCONTAR RETENCIONES POR CAUSACION') returning_values (DESC_RTES);
        if (DESC_RTES = 'NO') then
            SALDO = SALDO - RTFTE - RTIVA - RTICA;
        /* SI TIENE NOTA AGREGUELA */
        SELECT MAX(NOCL_ID) FROM NOTAS_CLIENTES WHERE TERC_NIT = :NIT AND CLSU_COD = :SUCURSAL AND NOCL_TIPODOC = :TIPO AND NOCL_IDDOC = :ID INTO :IDNOTA;
        if (IDNOTA IS NOT NULL) then
            SELECT NOCL_TEXTO FROM NOTAS_CLIENTES WHERE NOCL_ID = :IDNOTA INTO :NOTA;
        else
            NOTA = '';
        SUSPEND;
        END
    END
END
^

SET TERM ; ^

GRANT SELECT ON MOVIMIENTO_CLIENTES TO PROCEDURE CARTERA_CLIENTE;
GRANT EXECUTE ON PROCEDURE SALDO_DOC_CARTERA TO PROCEDURE CARTERA_CLIENTE;
GRANT SELECT ON TIPO_DOCUMENTO TO PROCEDURE CARTERA_CLIENTE;
GRANT SELECT ON NOTAS_DEBITO_CLIENTES TO PROCEDURE CARTERA_CLIENTE;
GRANT SELECT ON NOTAS_CREDITO_CLIENTES TO PROCEDURE CARTERA_CLIENTE;
GRANT SELECT ON ANTICIPOS_CLIENTE TO PROCEDURE CARTERA_CLIENTE;
GRANT SELECT ON FACTURAS TO PROCEDURE CARTERA_CLIENTE;
GRANT SELECT ON DEVOLUCIONES_VENTAS TO PROCEDURE CARTERA_CLIENTE;
GRANT SELECT ON RECIBO_PROVISIONAL_DETALLE TO PROCEDURE CARTERA_CLIENTE;
GRANT SELECT ON RECIBOS_CAJA_DETALLE TO PROCEDURE CARTERA_CLIENTE;
GRANT SELECT ON SALDOS_DOC_CARTERA TO PROCEDURE CARTERA_CLIENTE;
GRANT EXECUTE ON PROCEDURE LEE_CONFIGURACION TO PROCEDURE CARTERA_CLIENTE;
GRANT SELECT ON NOTAS_CLIENTES TO PROCEDURE CARTERA_CLIENTE;

/* 20080717 */
SET TERM ^ ;

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

SET TERM ; ^

GRANT EXECUTE ON PROCEDURE LEE_CONFIGURACION TO PROCEDURE REP_MOVIMIENTO_CLIENTE;
GRANT SELECT ON TERCEROS TO PROCEDURE REP_MOVIMIENTO_CLIENTE;
GRANT SELECT ON CLIENTES TO PROCEDURE REP_MOVIMIENTO_CLIENTE;
GRANT SELECT ON CLIENTE_SUCURSALES TO PROCEDURE REP_MOVIMIENTO_CLIENTE;
GRANT SELECT ON COBRADORES TO PROCEDURE REP_MOVIMIENTO_CLIENTE;
GRANT SELECT ON ZONAS TO PROCEDURE REP_MOVIMIENTO_CLIENTE;
GRANT SELECT ON CIUDADES TO PROCEDURE REP_MOVIMIENTO_CLIENTE;
GRANT SELECT ON MOVIMIENTO_CLIENTES TO PROCEDURE REP_MOVIMIENTO_CLIENTE;
GRANT EXECUTE ON PROCEDURE SALDO_DOC_CARTERA TO PROCEDURE REP_MOVIMIENTO_CLIENTE;
GRANT SELECT ON TIPO_DOCUMENTO TO PROCEDURE REP_MOVIMIENTO_CLIENTE;


/* 20080718 */
/* diferencia con valor absoluto para poder diagnosticar por encima y por debajo del precio ideal */
SET TERM ^ ;

CREATE OR ALTER PROCEDURE REVISA_PRECIOS(
    LISTA INTEGER,
    FECHA DATE)
RETURNS (
    ARTICULO VARCHAR(20),
    DESCR VARCHAR(60),
    FIJO NUMERIC(18,2),
    UNIDAD VARCHAR(8),
    PORC NUMERIC(9,4),
    SUGERIDO NUMERIC(18,2),
    DIFER NUMERIC(18,2),
    NUEVO NUMERIC(18,2),
    OK CHAR(1))
AS
declare variable marg numeric(9,4);
declare variable UOM VARCHAR(10);
declare variable BASE VARCHAR(10);
declare variable CAMBIO VARCHAR(10);
declare variable COSTO numeric(18,2);
declare variable COSTOP numeric(18,2);
declare variable COSTOU numeric(18,2);
declare variable DIFMAX numeric(18,2);
declare variable DIG INTEGER;
declare variable TARIVA NUMERIC(9,4);
declare variable IVAINC CHAR(1);
declare variable LISTAREF INTEGER;
begin
execute procedure lee_configuracion ('FACTURACION', 'ARTICULOS', 'SUGERIR PRECIOS CON PORCENTAJE DE MARGEN O UTILIDAD') returning_values (:UOM);
EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION', 'ARTICULOS', 'REDONDEO AL MULTIPLO DE DIEZ EN PRECIOS') RETURNING_VALUES (:DIG);
EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION','ARTICULOS','CAMBIO DE PRECIOS AUTOMATICO AL CAMBIAR COSTO O PRECIO') returning_values (CAMBIO);
EXECUTE PROCEDURE lee_configuracion('FACTURACION','ARTICULOS','COSTO BASE PARA CALCULO DE PRECIOS DE VENTA AUTOMATICOS') returning_values (:BASE);
EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION','ARTICULOS','CODIGO DE LA LISTA DE PRECIOS BASE PARA CAMBIO DE PRECIOS AUTOMATICO') returning_values (LISTAREF);
EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION','ARTICULOS','DIFERENCIA EN PESOS MAXIMA A PERMITIR PARA CAMBIAR PRECIOS') returning_values (DIFMAX);
for select A.arti_cod, A.arti_des, A.arti_unidad, prar_fijo, prar_margen, prar_util, TAIV_PORC
    from precios_articulo p, articulo a, tarifa_iva T
    where a.arti_cod = p.arti_cod and lipr_cod = :lista and a.taiv_cod = t.taiv_cod order by A.arti_cod
    into :articulo, descr, :unidad, :fijo, :marg, :porc, :tariva
    do
    begin
    if (UOM <> 'UTILIDAD') then
        PORC = MARG;
    if (CAMBIO = 'COSTO') then
        BEGIN
        EXECUTE PROCEDURE COSTO_PROMEDIO (:ARTICULO, :FECHA) RETURNING_VALUES(:COSTOP);
        EXECUTE PROCEDURE ULTIMO_COSTO (:ARTICULO, :FECHA, :UNIDAD) RETURNING_VALUES(:COSTOU);
        if (base = 'ULTIMO') then
            COSTO = COSTOU;
        ELSE
            BEGIN
            COSTO = COSTOP;
            if (base = 'MAYOR') then
                if (COSTOP < COSTOU) then
                    COSTO = COSTOU;
            END
        SELECT LIPR_MODIF FROM LISTA_PRECIOS WHERE LIPR_COD = :lista INTO :IVAINC;
        if (IVAINC = 'S') then
            COSTO = COSTO * (1 + TARIVA/100);
        if (UOM = 'UTILIDAD') then
            SUGERIDO = COSTO * (1 + :PORC/100);
        ELSE
            SUGERIDO = COSTO / (1 - :PORC/100);
        END
    ELSE
        if (LISTA <> LISTAREF) then
            BEGIN
            SELECT PRAR_FIJO FROM PRECIOS_ARTICULO WHERE ARTI_COD = :articulo AND LIPR_COD = :LISTAREF INTO :SUGERIDO;
            if (IVAINC = 'S') then
                SUGERIDO = SUGERIDO / (1 + TARIVA/100);
            if (UOM = 'UTILIDAD') then
                SUGERIDO = SUGERIDO * (1 + :PORC/100);
            ELSE
                SUGERIDO = SUGERIDO / (1 - :PORC/100);
            END
    EXECUTE PROCEDURE REDONDEE (SUGERIDO, DIG) returning_values (SUGERIDO);
    DIFER = SUGERIDO - FIJO;
    NUEVO = SUGERIDO;
    OK = 'S';
    if ((abs(DIFER) > DIFMAX) and (sugerido <> 0)) then
        suspend;
    end
end
^

SET TERM ; ^

GRANT EXECUTE ON PROCEDURE LEE_CONFIGURACION TO PROCEDURE REVISA_PRECIOS;
GRANT SELECT ON PRECIOS_ARTICULO TO PROCEDURE REVISA_PRECIOS;
GRANT SELECT ON ARTICULO TO PROCEDURE REVISA_PRECIOS;
GRANT SELECT ON TARIFA_IVA TO PROCEDURE REVISA_PRECIOS;
GRANT EXECUTE ON PROCEDURE COSTO_PROMEDIO TO PROCEDURE REVISA_PRECIOS;
GRANT EXECUTE ON PROCEDURE ULTIMO_COSTO TO PROCEDURE REVISA_PRECIOS;
GRANT SELECT ON LISTA_PRECIOS TO PROCEDURE REVISA_PRECIOS;
GRANT EXECUTE ON PROCEDURE REDONDEE TO PROCEDURE REVISA_PRECIOS;


/* 20080719 */
SET TERM ^ ;

CREATE OR ALTER PROCEDURE REP_FALTANTES_VENTA(
    TIPOORI INTEGER,
    FECINI DATE,
    FECFIN DATE,
    TIPODES INTEGER,
    CEROS CHAR(1),
    SUBEMPRESA INTEGER)
RETURNS (
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    NIT VARCHAR(20),
    NOMCLIENTE VARCHAR(60),
    VENCE DATE,
    ARTICULO VARCHAR(15),
    DESCRIPCION VARCHAR(60),
    CANTIDAD NUMERIC(18,4),
    UNIDAD VARCHAR(8),
    PRECIO NUMERIC(18,2),
    DESCUENTO NUMERIC(9,4),
    FALTANTE NUMERIC(18,4),
    OBS VARCHAR(255))
AS
declare variable ID INTEGER;
declare variable ITEM INTEGER;
declare variable FACTOR NUMERIC(18,4);
BEGIN
if (TIPOORI = 32) then
    FOR SELECT R.REVT_ID, R.PREF_PRE, REVT_NUMERO, REVT_FECHA, REVT_FECHA VENCE, RVDE_ITEM, R.TERC_NIT, REVT_NOMTERC, ARTI_COD, SUBSTR(RVDE_DESC,1,60), RVDE_UNIDAD, RVDE_CANT, RVDE_PRUNIT, RVDE_DTOPORC, SUBSTRING(REVT_OBS FROM 1 FOR 255)
      FROM REMISIONES_VENTA R, REMISIONES_VENTA_DETALLE D, PREFIJOS P
      WHERE R.REVT_ID = D.REVT_ID AND REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN and REVT_ANULADO = 'N'
       AND P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = 32 AND ((P.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
      ORDER BY REVT_FECHA, R.PREF_PRE, REVT_NUMERO, RVDE_ITEM
      INTO :ID, :PREFIJO, :NUMERO, :FECHA, :VENCE, :ITEM, :NIT, :NOMCLIENTE, :ARTICULO, :DESCRIPCION, :UNIDAD, :CANTIDAD, :PRECIO, :DESCUENTO, :OBS
      DO
        BEGIN
        EXECUTE PROCEDURE FALTANTE(:TIPOORI, :TIPODES, :ID,  :ITEM) returning_values (:FALTANTE, :UNIDAD, :FACTOR);
        if ((CEROS = 'S') or (FALTANTE <> 0)) then
          SUSPEND;
        END
if (TIPOORI = 34) then
    FOR SELECT P.PEDI_ID, P.PREF_PRE, PEDI_NUMERO, PEDI_FECHA, (PEDI_FECHA + PEDI_VALIDEZ), PEDE_ITEM, P.TERC_NIT, PEDI_NOMTERC, ARTI_COD, SUBSTR(PEDE_DESC,1,60), PEDE_UNIDAD, PEDE_CANT, PEDE_PRUNIT, PEDE_DTOPORC, SUBSTRING(PEDI_OBS FROM 1 FOR 255)
      FROM PEDIDOS P, PEDIDOS_DETALLE D, PREFIJOS PR
      WHERE P.PEDI_ID = D.PEDI_ID AND PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND PEDI_ANULADO = 'N'
       AND PR.PREF_PRE = P.PREF_PRE AND PR.TIDO_COD = 34 AND ((PR.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
      ORDER BY PEDI_FECHA, P.PREF_PRE, PEDI_NUMERO, PEDE_ITEM
      INTO :ID, :PREFIJO, :NUMERO, :FECHA, :VENCE, :ITEM, :NIT, :NOMCLIENTE, :ARTICULO, :DESCRIPCION, :UNIDAD, :CANTIDAD, :PRECIO, :DESCUENTO, :OBS
      DO
        BEGIN
        EXECUTE PROCEDURE FALTANTE(:TIPOORI, :TIPODES, :ID,  :ITEM) returning_values (:FALTANTE, :UNIDAD, :FACTOR);
        if ((CEROS = 'S') or (FALTANTE <> 0)) then
          SUSPEND;
        END
if (TIPOORI = 35) then
    FOR SELECT C.COTI_ID, C.PREF_PRE, COTI_NUMERO, COTI_FECHA, (COTI_FECHA + COTI_VALIDEZ), CTDE_ITEM, C.TERC_NIT, COTI_NOMTERC, ARTI_COD, SUBSTR(CTDE_DESC,1,60), CTDE_UNIDAD, CTDE_CANT, CTDE_PRUNIT, CTDE_DTOPORC, SUBSTRING(COTI_OBS FROM 1 FOR 255)
      FROM COTIZACIONES C, COTIZACIONES_DETALLE D, PREFIJOS P
      WHERE C.COTI_ID = D.COTI_ID AND COTI_FECHA >= :FECINI AND COTI_FECHA <= :FECFIN AND COTI_ANULADO = 'N'
       AND P.PREF_PRE = C.PREF_PRE AND P.TIDO_COD = 35 AND ((P.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
      ORDER BY COTI_FECHA, C.PREF_PRE, COTI_NUMERO, CTDE_ITEM
      INTO :ID, :PREFIJO, :NUMERO, :FECHA, :VENCE, :ITEM, :NIT, :NOMCLIENTE, :ARTICULO, :DESCRIPCION, :UNIDAD, :CANTIDAD, :PRECIO, :DESCUENTO, :OBS
      DO
        BEGIN
        EXECUTE PROCEDURE FALTANTE(:TIPOORI, :TIPODES, :ID,  :ITEM) returning_values (:FALTANTE, :UNIDAD, :FACTOR);
        if ((CEROS = 'S') or (FALTANTE <> 0)) then
          SUSPEND;
        END
END
^

SET TERM ; ^

GRANT SELECT ON REMISIONES_VENTA TO PROCEDURE REP_FALTANTES_VENTA;
GRANT SELECT ON REMISIONES_VENTA_DETALLE TO PROCEDURE REP_FALTANTES_VENTA;
GRANT SELECT ON PREFIJOS TO PROCEDURE REP_FALTANTES_VENTA;
GRANT EXECUTE ON PROCEDURE FALTANTE TO PROCEDURE REP_FALTANTES_VENTA;
GRANT SELECT ON PEDIDOS TO PROCEDURE REP_FALTANTES_VENTA;
GRANT SELECT ON PEDIDOS_DETALLE TO PROCEDURE REP_FALTANTES_VENTA;
GRANT SELECT ON COTIZACIONES TO PROCEDURE REP_FALTANTES_VENTA;
GRANT SELECT ON COTIZACIONES_DETALLE TO PROCEDURE REP_FALTANTES_VENTA;

SET TERM ^ ;

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

SET TERM ; ^

GRANT SELECT ON TIPO_DOCUMENTO TO PROCEDURE REP_FALTANTES_CLIENTES;
GRANT SELECT ON CLIENTES TO PROCEDURE REP_FALTANTES_CLIENTES;
GRANT SELECT ON CLIENTE_SUCURSALES TO PROCEDURE REP_FALTANTES_CLIENTES;
GRANT SELECT ON ZONAS TO PROCEDURE REP_FALTANTES_CLIENTES;
GRANT SELECT ON FACTURAS_DETALLE TO PROCEDURE REP_FALTANTES_CLIENTES;
GRANT SELECT ON FACTURAS TO PROCEDURE REP_FALTANTES_CLIENTES;
GRANT SELECT ON ARTICULO TO PROCEDURE REP_FALTANTES_CLIENTES;
GRANT SELECT ON PREFIJOS TO PROCEDURE REP_FALTANTES_CLIENTES;
GRANT SELECT ON GRUPO TO PROCEDURE REP_FALTANTES_CLIENTES;
GRANT SELECT ON MARCAS TO PROCEDURE REP_FALTANTES_CLIENTES;
GRANT SELECT ON SUBGRUPO TO PROCEDURE REP_FALTANTES_CLIENTES;
GRANT EXECUTE ON PROCEDURE FALTANTE TO PROCEDURE REP_FALTANTES_CLIENTES;
GRANT SELECT ON REMISIONES_VENTA_DETALLE TO PROCEDURE REP_FALTANTES_CLIENTES;
GRANT SELECT ON REMISIONES_VENTA TO PROCEDURE REP_FALTANTES_CLIENTES;
GRANT SELECT ON PEDIDOS_DETALLE TO PROCEDURE REP_FALTANTES_CLIENTES;
GRANT SELECT ON PEDIDOS TO PROCEDURE REP_FALTANTES_CLIENTES;
GRANT SELECT ON COTIZACIONES_DETALLE TO PROCEDURE REP_FALTANTES_CLIENTES;
GRANT SELECT ON COTIZACIONES TO PROCEDURE REP_FALTANTES_CLIENTES;

SET TERM ^ ;

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

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

SET TERM ; ^

GRANT SELECT ON TIPO_DOCUMENTO TO PROCEDURE REP_FALTANTES_VENDEDOR;
GRANT SELECT ON FACTURAS_DETALLE TO PROCEDURE REP_FALTANTES_VENDEDOR;
GRANT SELECT ON FACTURAS TO PROCEDURE REP_FALTANTES_VENDEDOR;
GRANT SELECT ON ARTICULO TO PROCEDURE REP_FALTANTES_VENDEDOR;
GRANT SELECT ON PREFIJOS TO PROCEDURE REP_FALTANTES_VENDEDOR;
GRANT SELECT ON VENDEDORES TO PROCEDURE REP_FALTANTES_VENDEDOR;
GRANT SELECT ON GRUPO TO PROCEDURE REP_FALTANTES_VENDEDOR;
GRANT SELECT ON MARCAS TO PROCEDURE REP_FALTANTES_VENDEDOR;
GRANT SELECT ON SUBGRUPO TO PROCEDURE REP_FALTANTES_VENDEDOR;
GRANT EXECUTE ON PROCEDURE FALTANTE TO PROCEDURE REP_FALTANTES_VENDEDOR;
GRANT SELECT ON REMISIONES_VENTA_DETALLE TO PROCEDURE REP_FALTANTES_VENDEDOR;
GRANT SELECT ON REMISIONES_VENTA TO PROCEDURE REP_FALTANTES_VENDEDOR;
GRANT SELECT ON PEDIDOS_DETALLE TO PROCEDURE REP_FALTANTES_VENDEDOR;
GRANT SELECT ON PEDIDOS TO PROCEDURE REP_FALTANTES_VENDEDOR;
GRANT SELECT ON COTIZACIONES_DETALLE TO PROCEDURE REP_FALTANTES_VENDEDOR;
GRANT SELECT ON COTIZACIONES TO PROCEDURE REP_FALTANTES_VENDEDOR;

SET TERM ^ ;

CREATE OR ALTER PROCEDURE FALTANTES_VENTAS_ARTICULO(
    DESDE VARCHAR(20),
    HASTA VARCHAR(20),
    FECINI DATE,
    FECFIN DATE,
    DETALLE CHAR(1),
    TIPO INTEGER,
    DESTINO INTEGER,
    ORDEN CHAR(1),
    CEROS CHAR(1),
    SUCURSAL INTEGER)
RETURNS (
    ARTICULO VARCHAR(15),
    DESCRIPCION VARCHAR(60),
    CODGRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    CODSUBG VARCHAR(3),
    NOMSUBG VARCHAR(30),
    CODMARC VARCHAR(3),
    NOMMARC VARCHAR(30),
    CANTIDAD NUMERIC(18,4),
    UNIDAD VARCHAR(8),
    FALTANTE NUMERIC(18,4),
    BASE NUMERIC(18,2),
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    OBS VARCHAR(255))
AS
declare variable ID INTEGER;
declare variable ITEM INTEGER;
declare variable CANT NUMERIC(18,2);
declare variable CODINI VARCHAR(15);
declare variable CODFIN VARCHAR(15);
declare variable DESINI VARCHAR(15);
declare variable DESFIN VARCHAR(15);
declare variable MONTO NUMERIC(18,2);
declare variable FACTOR NUMERIC(18,4);
BEGIN
if (ORDEN = 'C') then
    BEGIN
    CODINI = DESDE;
    CODFIN = HASTA;
    DESINI = '';
    DESFIN = 'zz';
    END
ELSE
    BEGIN
    DESINI = DESDE;
    DESFIN = HASTA;
    CODINI = '';
    CODFIN = 'zz';
    END
  FOR SELECT ARTI_COD, ARTI_DES, ARTI_UNIDAD, A.GRUP_COD, A.SUBG_COD, A.MARC_COD FROM ARTICULO A
      WHERE ARTI_COD >= :CODINI AND ARTI_COD <= :CODFIN AND ARTI_DES >= :DESINI AND ARTI_DES <= :DESFIN
      INTO :ARTICULO, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
  DO
    BEGIN
    CANTIDAD = 0;
    faltante = 0;
    base = 0;
    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
    if (DETALLE = 'N') then
        BEGIN
        if (TIPO = 31) then
            BEGIN
            FOR SELECT F.FACT_ID, FADE_ITEM, FADE_CANT * FADE_FACTOR, (FADE_PRUNIT-FADE_DTOMONTO)
                FROM FACTURAS_DETALLE D, FACTURAS F, PREFIJOS P
                WHERE F.FACT_ID = D.FACT_ID AND ARTI_COD = :ARTICULO AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND FACT_ANULADO = 'N' AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND ((SUCU_ID = :SUCURSAL) or (:SUCURSAL = 0))
                ORDER BY F.FACT_ID, FADE_ITEM INTO :ID, :ITEM, :CANT, :MONTO
                DO
                BEGIN
                CANTIDAD = CANTIDAD + CANT;
                EXECUTE PROCEDURE FALTANTE(:TIPO, :DESTINO, :ID, :ITEM) returning_values (:CANT, :UNIDAD, :FACTOR);
                FALTANTE = FALTANTE + CANT;
                BASE = BASE + MONTO * CANT;
                END
            END
        if (TIPO = 32) then
            BEGIN
            FOR SELECT R.revt_id, rvde_item, RVDE_CANT * RVDE_FACTOR, (RVDE_PRUNIT-RVDE_DTOMONTO)
                FROM REMISIONES_VENTA_DETALLE D, REMISIONES_VENTA R, PREFIJOS P
                WHERE R.REVT_ID = D.REVT_ID AND ARTI_COD = :ARTICULO AND REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN AND REVT_ANULADO = 'N' AND P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = 32  AND ((SUCU_ID = :SUCURSAL) or (:SUCURSAL = 0))
                ORDER BY R.REVT_ID, RVDE_ITEM INTO :ID, :ITEM, :CANT, :MONTO
                DO
                BEGIN
                CANTIDAD = CANTIDAD + CANT;
                EXECUTE PROCEDURE FALTANTE(:TIPO, :DESTINO, :ID, :ITEM) returning_values (:CANT, :UNIDAD, :FACTOR);
                FALTANTE = FALTANTE + CANT;
                BASE = BASE + MONTO * CANT;
                END
            END
        if (TIPO = 34) then
            BEGIN
            FOR SELECT P.PEDI_ID, PEDE_ITEM, PEDE_CANT * PEDE_FACTOR, (PEDE_PRUNIT-PEDE_DTOMONTO)
                FROM PEDIDOS_DETALLE D, PEDIDOS P, PREFIJOS R
                WHERE P.PEDI_ID = D.PEDI_ID AND ARTI_COD = :ARTICULO AND PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND PEDI_ANULADO = 'N' AND P.PREF_PRE = R.PREF_PRE AND R.TIDO_COD = 34  AND ((SUCU_ID = :SUCURSAL) or (:SUCURSAL = 0))
                ORDER BY P.PEDI_ID, PEDE_ITEM INTO :ID, :ITEM, :CANT, :MONTO
                DO
                BEGIN
                CANTIDAD = CANTIDAD + CANT;
                EXECUTE PROCEDURE FALTANTE(:TIPO, :DESTINO, :ID, :ITEM) returning_values (:CANT, :UNIDAD, :FACTOR);
                FALTANTE = FALTANTE + CANT;
                BASE = BASE + MONTO * CANT;
                END
            END
        if (TIPO = 35) then
            BEGIN
            FOR SELECT C.COTI_ID, CTDE_ITEM, CTDE_CANT * CTDE_FACTOR, (CTDE_PRUNIT-CTDE_DTOMONTO)
                FROM COTIZACIONES_DETALLE D, COTIZACIONES C, PREFIJOS P
                WHERE C.COTI_ID = D.COTI_ID AND ARTI_COD = :ARTICULO AND COTI_FECHA >= :FECINI AND COTI_FECHA <= :FECFIN AND COTI_ANULADO = 'N' AND P.PREF_PRE = C.PREF_PRE AND P.TIDO_COD = 35  AND ((SUCU_ID = :SUCURSAL) or (:SUCURSAL = 0))
                ORDER BY C.COTI_ID, CTDE_ITEM INTO :ID, :ITEM, :CANT, :MONTO
                DO
                BEGIN
                CANTIDAD = CANTIDAD + CANT;
                EXECUTE PROCEDURE FALTANTE(:TIPO, :DESTINO, :ID, :ITEM) returning_values (:CANT, :UNIDAD, :FACTOR);
                FALTANTE = FALTANTE + CANT;
                BASE = BASE + MONTO * CANT;
                END
            END
        if (CANTIDAD IS NULL) then
            CANTIDAD = 0;
        if (BASE IS NULL) then
            BASE = 0;
        if (FALTANTE IS NULL) then
            FALTANTE = 0;
        if (CEROS = 'S') then
            SUSPEND;
        ELSE
            if (FALTANTE <> 0) then
                SUSPEND;
        END
    ELSE
        BEGIN
        if (TIPO = 31) then
            FOR SELECT F.FACT_ID, FADE_ITEM, F.PREF_PRE, FACT_NUMERO, FACT_FECHA, FADE_CANT * FADE_FACTOR, (FADE_PRUNIT-FADE_DTOMONTO), SUBSTRING(FACT_OBS FROM 1 FOR 255)
                FROM FACTURAS F, FACTURAS_DETALLE D, PREFIJOS P
                WHERE F.FACT_ID = D.FACT_ID AND ARTI_COD = :ARTICULO AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND FACT_ANULADO = 'N' AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND ((SUCU_ID = :SUCURSAL) or (:SUCURSAL = 0))
                ORDER BY F.FACT_ID, FADE_ITEM
                INTO :ID, :ITEM, :PREFIJO, :NUMERO, :FECHA, :CANTIDAD, :BASE, :OBS
                DO
                    BEGIN
                    EXECUTE PROCEDURE FALTANTE(:TIPO, :DESTINO, :ID, :ITEM) returning_values (:FALTANTE, :UNIDAD, :FACTOR);
                    if ((CEROS = 'S') or (FALTANTE <> 0)) then
                        SUSPEND;
                    END
        if (TIPO = 32) then
            FOR SELECT R.REVT_ID, RVDE_ITEM, R.PREF_PRE, REVT_NUMERO, REVT_FECHA, RVDE_CANT * RVDE_FACTOR, (RVDE_PRUNIT-RVDE_DTOMONTO), SUBSTRING(REVT_OBS FROM 1 FOR 255)
                FROM REMISIONES_VENTA R, REMISIONES_VENTA_DETALLE D, PREFIJOS P
                WHERE R.REVT_ID = D.REVT_ID AND ARTI_COD = :ARTICULO AND REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN AND REVT_ANULADO = 'N' AND P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = 32 AND ((SUCU_ID = :SUCURSAL) or (:SUCURSAL = 0))
                INTO :ID, :ITEM, :PREFIJO, :NUMERO, :FECHA, :CANTIDAD, :BASE, :OBS
                DO
                    BEGIN
                    EXECUTE PROCEDURE FALTANTE(:TIPO, :DESTINO, :ID, :ITEM) returning_values (:FALTANTE, :UNIDAD, :FACTOR);
                    if ((CEROS = 'S') or (FALTANTE <> 0)) then
                        SUSPEND;
                    END
        if (TIPO = 34) then
            FOR SELECT P.PEDI_ID, PEDE_ITEM, P.PREF_PRE, PEDI_NUMERO, PEDI_FECHA, PEDE_CANT * PEDE_FACTOR, (PEDE_PRUNIT-PEDE_DTOMONTO), SUBSTRING(PEDI_OBS FROM 1 FOR 255)
                FROM PEDIDOS P, PEDIDOS_DETALLE D, PREFIJOS R
                WHERE P.PEDI_ID = D.PEDI_ID AND ARTI_COD = :ARTICULO AND PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND PEDI_ANULADO = 'N' AND P.PREF_PRE = R.PREF_PRE AND R.TIDO_COD = 34 AND ((SUCU_ID = :SUCURSAL) or (:SUCURSAL = 0))
                INTO :ID, :ITEM, PREFIJO, :NUMERO, :FECHA, :CANTIDAD, :BASE, :OBS
                DO
                    BEGIN
                    EXECUTE PROCEDURE FALTANTE(:TIPO, :DESTINO, :ID, :ITEM) returning_values (:FALTANTE, :UNIDAD, :FACTOR);
                    if ((CEROS = 'S') or (FALTANTE <> 0)) then
                        SUSPEND;
                    END
        if (TIPO = 35) then
            FOR SELECT C.COTI_ID, CTDE_ITEM, C.PREF_PRE, COTI_NUMERO, COTI_FECHA, CTDE_CANT * CTDE_FACTOR, (CTDE_PRUNIT-CTDE_DTOMONTO), SUBSTRING(COTI_OBS FROM 1 FOR 255)
                FROM COTIZACIONES C, COTIZACIONES_DETALLE D, PREFIJOS P
                WHERE C.COTI_ID = D.COTI_ID AND ARTI_COD = :ARTICULO AND COTI_FECHA >= :FECINI AND COTI_FECHA <= :FECFIN AND COTI_ANULADO = 'N' AND P.PREF_PRE = C.PREF_PRE AND P.TIDO_COD = 35 AND ((SUCU_ID = :SUCURSAL) or (:SUCURSAL = 0))
                INTO :ID, :ITEM, PREFIJO, :NUMERO, :FECHA, :CANTIDAD, :BASE, :OBS
                DO
                    BEGIN
                    EXECUTE PROCEDURE FALTANTE(:TIPO, :DESTINO, :ID, :ITEM) returning_values (:FALTANTE, :UNIDAD, :FACTOR);
                    if ((CEROS = 'S') or (FALTANTE <> 0)) then
                        SUSPEND;
                    END
        END
    END
END
^

SET TERM ; ^

GRANT SELECT ON ARTICULO TO PROCEDURE FALTANTES_VENTAS_ARTICULO;
GRANT SELECT ON GRUPO TO PROCEDURE FALTANTES_VENTAS_ARTICULO;
GRANT SELECT ON MARCAS TO PROCEDURE FALTANTES_VENTAS_ARTICULO;
GRANT SELECT ON SUBGRUPO TO PROCEDURE FALTANTES_VENTAS_ARTICULO;
GRANT SELECT ON FACTURAS_DETALLE TO PROCEDURE FALTANTES_VENTAS_ARTICULO;
GRANT SELECT ON FACTURAS TO PROCEDURE FALTANTES_VENTAS_ARTICULO;
GRANT SELECT ON PREFIJOS TO PROCEDURE FALTANTES_VENTAS_ARTICULO;
GRANT EXECUTE ON PROCEDURE FALTANTE TO PROCEDURE FALTANTES_VENTAS_ARTICULO;
GRANT SELECT ON REMISIONES_VENTA_DETALLE TO PROCEDURE FALTANTES_VENTAS_ARTICULO;
GRANT SELECT ON REMISIONES_VENTA TO PROCEDURE FALTANTES_VENTAS_ARTICULO;
GRANT SELECT ON PEDIDOS_DETALLE TO PROCEDURE FALTANTES_VENTAS_ARTICULO;
GRANT SELECT ON PEDIDOS TO PROCEDURE FALTANTES_VENTAS_ARTICULO;
GRANT SELECT ON COTIZACIONES_DETALLE TO PROCEDURE FALTANTES_VENTAS_ARTICULO;
GRANT SELECT ON COTIZACIONES TO PROCEDURE FALTANTES_VENTAS_ARTICULO;

SET TERM ^ ;

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

SET TERM ; ^

GRANT SELECT ON TIPO_DOCUMENTO TO PROCEDURE REP_COMPROBANTES_FAC;
GRANT SELECT ON FACTURAS TO PROCEDURE REP_COMPROBANTES_FAC;
GRANT SELECT ON BODEGA TO PROCEDURE REP_COMPROBANTES_FAC;
GRANT SELECT ON PUNTO_VENTA TO PROCEDURE REP_COMPROBANTES_FAC;
GRANT SELECT ON VENDEDORES TO PROCEDURE REP_COMPROBANTES_FAC;
GRANT SELECT ON PREFIJOS TO PROCEDURE REP_COMPROBANTES_FAC;
GRANT SELECT ON FACTURAS_DETALLE TO PROCEDURE REP_COMPROBANTES_FAC;
GRANT SELECT ON REMISIONES_VENTA TO PROCEDURE REP_COMPROBANTES_FAC;
GRANT SELECT ON REMISIONES_VENTA_DETALLE TO PROCEDURE REP_COMPROBANTES_FAC;
GRANT SELECT ON DEVOLUCIONES_VENTAS TO PROCEDURE REP_COMPROBANTES_FAC;
GRANT SELECT ON DEVOLUCIONES_VENTAS_DETALLE TO PROCEDURE REP_COMPROBANTES_FAC;
GRANT SELECT ON PEDIDOS TO PROCEDURE REP_COMPROBANTES_FAC;
GRANT SELECT ON PEDIDOS_DETALLE TO PROCEDURE REP_COMPROBANTES_FAC;
GRANT SELECT ON COTIZACIONES TO PROCEDURE REP_COMPROBANTES_FAC;
GRANT SELECT ON COTIZACIONES_DETALLE TO PROCEDURE REP_COMPROBANTES_FAC;

SET TERM ^ ;

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

SET TERM ; ^

GRANT SELECT ON TIPO_DOCUMENTO TO PROCEDURE REP_CONSECUTIVOS_FAC;
GRANT SELECT ON FACTURAS TO PROCEDURE REP_CONSECUTIVOS_FAC;
GRANT SELECT ON BODEGA TO PROCEDURE REP_CONSECUTIVOS_FAC;
GRANT SELECT ON PUNTO_VENTA TO PROCEDURE REP_CONSECUTIVOS_FAC;
GRANT SELECT ON VENDEDORES TO PROCEDURE REP_CONSECUTIVOS_FAC;
GRANT SELECT ON PREFIJOS TO PROCEDURE REP_CONSECUTIVOS_FAC;
GRANT SELECT ON FACTURAS_DETALLE TO PROCEDURE REP_CONSECUTIVOS_FAC;
GRANT SELECT ON REMISIONES_VENTA TO PROCEDURE REP_CONSECUTIVOS_FAC;
GRANT SELECT ON REMISIONES_VENTA_DETALLE TO PROCEDURE REP_CONSECUTIVOS_FAC;
GRANT SELECT ON DEVOLUCIONES_VENTAS TO PROCEDURE REP_CONSECUTIVOS_FAC;
GRANT SELECT ON DEVOLUCIONES_VENTAS_DETALLE TO PROCEDURE REP_CONSECUTIVOS_FAC;
GRANT SELECT ON PEDIDOS TO PROCEDURE REP_CONSECUTIVOS_FAC;
GRANT SELECT ON PEDIDOS_DETALLE TO PROCEDURE REP_CONSECUTIVOS_FAC;
GRANT SELECT ON COTIZACIONES TO PROCEDURE REP_CONSECUTIVOS_FAC;
GRANT SELECT ON COTIZACIONES_DETALLE TO PROCEDURE REP_CONSECUTIVOS_FAC;

/* 20080721 */

INSERT INTO CONFIGURACION (CONF_MODULO, CONF_CATEGORIA, CONF_PROPIEDAD, CONF_VALOR, CONF_POSIBLES, CONF_AYUDA) VALUES ('CAJA', 'EGRESOS', 'SINCRONIZAR PREFIJOS DE EGRESOS Y DOCUMENTOS CANCELADOS', 'NO', 'SI,NO', 'SI:Obliga que el prefijo del egreso coincida con los prefijos de los documentos abonados. Evita que se paguen documentos de diferentes agencias por error.');
commit work;


/* 20080726 */
CREATE INDEX COMPROBANTE_DETALLE_IDX2
ON COMPROBANTE_DETALLE (TERC_NIT);

/* 20080728 - REPORTE DE CLIENTES EN FACTURACION */
SET TERM ^ ;

CREATE OR ALTER PROCEDURE REP_CLIENTES(
    DESDE VARCHAR(20),
    HASTA VARCHAR(20),
    ZONINI VARCHAR(5),
    ZONFIN VARCHAR(5),
    VENINI INTEGER,
    VENFIN INTEGER,
    AGRUPA CHAR(1),
    ORDEN CHAR(1),
    INACTIVOS CHAR(1))
RETURNS (
    NIT VARCHAR(20),
    NOM VARCHAR(60),
    DIR VARCHAR(60),
    CIU VARCHAR(40),
    TEL VARCHAR(40),
    CONTACTO VARCHAR(60),
    OBS VARCHAR(255),
    EMAIL VARCHAR(100),
    FAX VARCHAR(25),
    CEL VARCHAR(25),
    CODCLIE VARCHAR(20),
    CODCIU VARCHAR(6),
    ZONA VARCHAR(2),
    ESTADO CHAR(1),
    RTEFTE NUMERIC(9,4),
    RTEIVA NUMERIC(9,4),
    RTEICA NUMERIC(9,4),
    RTFTEBASE NUMERIC(18,2),
    DTOMAX NUMERIC(9,4),
    CUPO NUMERIC(18,2),
    COBR INTEGER,
    VEND INTEGER,
    ANIV DATE,
    CLIDESDE DATE,
    LISTA INTEGER,
    DIAS INTEGER,
    DIASBLOQ INTEGER,
    DETALLE CHAR(1),
    NOMLISTA VARCHAR(30),
    NOMVEND VARCHAR(60),
    NOMCOBR VARCHAR(60),
    NOMZONA VARCHAR(60),
    NOMCIUD VARCHAR(60),
    CTACLIE VARCHAR(20),
    CTAVNTA VARCHAR(20),
    CTARTFTE VARCHAR(20),
    CTARTIVA VARCHAR(20),
    CTARTICA VARCHAR(20))
AS
declare variable NITINI VARCHAR(20);
declare variable NITFIN VARCHAR(20);
declare variable NOMINI VARCHAR(20);
declare variable NOMFIN VARCHAR(20);
begin
if (ORDEN = 'C') then
    BEGIN
    NITINI = DESDE;
    NITFIN = HASTA;
    NOMINI = '';
    NOMFIN = 'zz';
    END
ELSE
    BEGIN
    NOMINI = DESDE;
    NOMFIN = HASTA;
    NITINI = '';
    NITFIN = 'zz';
    END

for select t.terc_nit,terc_nom,terc_dir,terc_ciu,terc_tel,terc_contacto,SUBSTRING(TERC_OBS FROM 1 FOR 255),
    terc_email,terc_fax,terc_cel,c.clie_cod,c.zona_cod,c.clie_estado,c.clie_rtefte,c.clie_rteiva,c.clie_rteica,c.clie_rtftebase,c.clie_dtomax,
    c.clie_cupo,c.vend_cod, c.cobr_cod, c.clie_aniv, c.clie_fecha, c.lipr_cod, c.clie_dias, c.clie_diasbloq, c.clie_detalle,
    terc_ctartfte,terc_ctartiva,terc_ctartica,terc_ctaventa,terc_ctacliente, T.ciud_cod
    from terceros t,clientes c where t.terc_nit = c.terc_nit and t.terc_nit >= :nitini and t.terc_nit <= :nitfin and terc_nom >= :nomini and terc_nom <= :nomfin
    into :nit, :nom, :dir, :ciu, :tel, :contacto, :obs,
    :email, :fax, :cel, :codclie, :zona, :estado, :rtefte, :rteiva, :rteica,
    :rtftebase, :dtomax, :cupo, :vend, :cobr, :aniv, :clidesde, :lista, :dias, :diasbloq, :detalle,
    :ctartfte, :ctartiva, :ctartica, :ctavnta, :ctaclie, :codciu
    do
    begin
    if ((inactivos = 'S') or (estado <> 'I'))  then
        begin
        nomzona = '';
        nomcobr = '';
        nomciud = '';
        nomvend = '';
        nomlista = '';
        select zona_nom from zonas where zona_cod = :zona into :nomzona;
        select cobr_nom from cobradores where cobr_cod = :cobr into nomcobr;
        select vend_nombre from vendedores where vend_cod = :vend into nomvend;
        select ciud_nom from ciudades where ciud_cod = :nomcobr into nomciud;
        select lipr_nom from LISTA_PRECIOS where lipr_cod = :lista into nomlista;
        if (AGRUPA = 'V') then
          begin
          if ((vend >= :venini) and (vend <= :venfin)) then
            suspend;
          end
        else
          if (AGRUPA = 'B') then
            begin
            if ((cobr >= :venini) and (cobr <= :venfin)) then
                suspend;
            end
          else
            if (AGRUPA = 'Z') then
              begin
              if ((zona >= :zonini) and (zona <= :zonfin)) then
                suspend;
              end
            else
              if (AGRUPA = 'C') then
                begin
                if ((codciu >= :zonini) and (codciu <= :zonfin)) then
                  suspend;
                end
              else
                suspend;
        end
    end
end
^

SET TERM ; ^

GRANT SELECT ON TERCEROS TO PROCEDURE REP_CLIENTES;
GRANT SELECT ON CLIENTES TO PROCEDURE REP_CLIENTES;
GRANT SELECT ON ZONAS TO PROCEDURE REP_CLIENTES;
GRANT SELECT ON COBRADORES TO PROCEDURE REP_CLIENTES;
GRANT SELECT ON VENDEDORES TO PROCEDURE REP_CLIENTES;
GRANT SELECT ON CIUDADES TO PROCEDURE REP_CLIENTES;
GRANT SELECT ON LISTA_PRECIOS TO PROCEDURE REP_CLIENTES;
grant execute on procedure rep_clientes to PUBLIC;


/* 20080729 COMISIONES COBRO CON RETENCIONES, DESCUENTO Y FECHA DE VENCIMIENTO */

SET TERM ^ ;

CREATE OR ALTER PROCEDURE COMISIONES_COBRO(
    DESDE INTEGER,
    HASTA INTEGER,
    FECINI DATE,
    FECFIN DATE,
    DETALLE CHAR(1))
RETURNS (
    CODVEND INTEGER,
    NOMVEND VARCHAR(60),
    NIT VARCHAR(20),
    CLIENTE VARCHAR(60),
    NOMTIPO VARCHAR(8),
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(6),
    FECDOC DATE,
    PREFREC VARCHAR(4),
    NUMREC VARCHAR(6),
    FECREC DATE,
    DIAS INTEGER,
    ABONO NUMERIC(18,2),
    BASE NUMERIC(18,2),
    COMIMONTO NUMERIC(18,2),
    COMIPORC NUMERIC(9,2),
    ARTICULO VARCHAR(20),
    CODGRP VARCHAR(2),
    CANT NUMERIC(18,4),
    DTOFIN NUMERIC(18,2),
    VENCE DATE,
    RTFTE NUMERIC(18,2),
    RTIVA NUMERIC(18,2),
    RTICA NUMERIC(18,2))
AS
DECLARE VARIABLE TIPO INTEGER;
DECLARE VARIABLE ID INTEGER;
DECLARE VARIABLE IVAMONTO NUMERIC(18,2);
DECLARE VARIABLE TOTAL NUMERIC(18,2);
DECLARE VARIABLE SITOT CHAR(2);
DECLARE VARIABLE VENTA CHAR(2);
DECLARE VARIABLE COMIV NUMERIC(18,2);
DECLARE VARIABLE PORCV NUMERIC(18,2);
DECLARE VARIABLE CONSUMO NUMERIC(18,2);
declare variable ALFINAL CHAR(2);
declare variable SALDO NUMERIC(18,2);
declare variable COMISION VARCHAR(10);
declare variable porcaux NUMERIC(9,2);
declare variable BASEAUX DOUBLE PRECISION;
declare variable SUCURSAL VARCHAR(20);
BEGIN
EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION', 'VENDEDORES', 'COMISIONES EN VENTA INCLUYENDO IMPUESTOS') returning_values (:SITOT);
EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA','COMISIONES','COMISION POR COBRO PAGADERA SOLO EN EL COBRO TOTAL') returning_values (:ALFINAL);
execute procedure lee_configuracion('CARTERA','COMISIONES','COMISION POR COBRO COMO PORCENTAJE DE LA COMISION VENTA') returning_values (:venta);
EXECUTE PROCEDURE lee_configuracion('CARTERA', 'COMISIONES', 'LIQUIDAR COMISION COBRO CON COBRADOR DEL DOCUMENTO O DEL RECIBO') returning_values (:COMISION);
FOR SELECT RCDE_TIPODOC, RCDE_IDDOC, RCDE_PREFIJO, RCDE_NUMERO, R.TERC_NIT, TERC_NOM, RECA_FECHA, (RCDE_ABONO+RCDE_RTFTE+RCDE_RTIVA+RCDE_RTICA), PREF_PRE, RECA_NUMERO, COBR_COD, RCDE_DTOF, RCDE_RTFTE, RCDE_RTIVA, RCDE_RTICA
    FROM RECIBOS_CAJA R, RECIBOS_CAJA_DETALLE RD, TERCEROS T
    WHERE R.RECA_ID = RD.RECA_ID AND RECA_FECHA >= :FECINI AND RECA_FECHA <= :FECFIN AND R.TERC_NIT = T.TERC_NIT AND RECA_ANULADO = 'N'
    ORDER BY TERC_NIT, RECA_FECHA
    INTO :TIPO, :ID, :PREFIJO, :NUMERO, :NIT, :CLIENTE, :FECREC, :ABONO, :PREFREC, :NUMREC, :codvend, :DTOFIN, :rtfte, :RTIVA, :RTICA
    DO
    BEGIN
    SELECT TIDO_NOMCORTO FROM TIPO_DOCUMENTO WHERE TIDO_COD = :TIPO INTO :NOMTIPO;
    if (COMISION = 'DOCUMENTO') then
        SELECT MVCL_FECHA, COBR_COD, MVCL_VENCE FROM MOVIMIENTO_CLIENTES WHERE MVCL_TIPOREF = :TIPO AND MVCL_IDREF = :ID
            INTO :FECDOC, :codvend, :VENCE;
    else
        SELECT MVCL_FECHA, MVCL_VENCE FROM MOVIMIENTO_CLIENTES WHERE MVCL_TIPOREF = :TIPO AND MVCL_IDREF = :ID
            INTO :FECDOC, :VENCE;
    if (FECDOC IS NOT NULL) then
        DIAS = FECREC - FECDOC;
    ELSE
        DIAS = 999;
    if ((codvend >= :DESDE) AND (codvend <= :hasta)) then
        BEGIN
        /* TRAIGA EL PORCENTAJE DE ACUERDO A LOS DIAS */
        COMIPORC = 0;
        SELECT CMCB_PORC FROM COMISION_COBRO WHERE CMCB_DIASINI <= :dias AND CMCB_DIASFIN >= :DIAS AND COBR_COD = :CODVEND INTO :COMIPORC;
        if (COMIPORC IS NULL) THEN
            COMIPORC = 0;
        if (VENTA = 'NO') then
            BEGIN
            if (TIPO = 31) then
                BEGIN
                if (DETALLE = 'N') then
                    SELECT MAX(FACT_TOTAL), MAX(FACT_IVAMONTO), SUM(FADE_CONSUMO) FROM FACTURAS F, FACTURAS_DETALLE D
                        WHERE F.FACT_ID = D.FACT_ID AND F.FACT_ID = :ID INTO :TOTAL, :IVAMONTO, :CONSUMO;
                ELSE
                    FOR SELECT D.ARTI_COD, FADE_CANT, FADE_TOTAL, FADE_IVAMONTO, FADE_CONSUMO, GRUP_COD
                        FROM FACTURAS F, FACTURAS_DETALLE D, ARTICULO A
                        WHERE F.FACT_ID = D.FACT_ID AND D.arti_cod = A.arti_cod AND F.FACT_ID = :ID
                        INTO :ARTICULO, :CANT, :TOTAL, :IVAMONTO, :CONSUMO, :CODGRP
                        DO
                        BEGIN
                        if (SITOT = 'SI') then
                            BASEAUX = TOTAL;
                        ELSE
                            BASEAUX = (TOTAL - IVAMONTO - CONSUMO);
                        BASE = BASEAUX;
                        COMIMONTO = BASE / 100 * COMIPORC;
                        SUSPEND;
                        END
                END
            if (TIPO = 33) then
                if (DETALLE = 'N') then
                    SELECT MAX(DEVT_TOTAL*-1), MAX(DEVT_IVAMONTO*-1), SUM(DVDE_CONSUMO) FROM DEVOLUCIONES_VENTAS V, DEVOLUCIONES_VENTAS_DETALLE D
                        WHERE V.DEVT_ID = D.DEVT_ID AND V.DEVT_ID = :ID INTO :TOTAL, :IVAMONTO, :CONSUMO;
                ELSE
                    FOR SELECT D.ARTI_COD, DVDE_CANT, DVDE_TOTAL*-1, DVDE_IVAMONTO*-1, DVDE_CONSUMO*-1, GRUP_COD
                        FROM DEVOLUCIONES_VENTAS V, DEVOLUCIONES_VENTAS_DETALLE D, ARTICULO A
                        WHERE V.DEVT_ID = D.DEVT_ID AND D.arti_cod = A.arti_cod AND V.DEVT_ID = :ID
                        INTO :ARTICULO, :CANT, :TOTAL, :IVAMONTO, :CONSUMO, :codgrp
                        DO
                        BEGIN
                        if (SITOT = 'SI') then
                            BASEAUX = TOTAL;
                        ELSE
                            BASEAUX = TOTAL - IVAMONTO - CONSUMO;
                        BASE = BASEAUX;
                        COMIMONTO = BASE / 100 * COMIPORC;
                        SUSPEND;
                        END
            if (TIPO = 41) then
                SELECT NDCL_MONTO, NDCL_IVAMONTO, 0 FROM NOTAS_DEBITO_CLIENTES WHERE NDCL_ID = :ID INTO :TOTAL, :IVAMONTO, :CONSUMO;
            if (TIPO = 42) then
                SELECT NCCL_MONTO*-1, NCCL_IVAMONTO*-1, 0 FROM NOTAS_CREDITO_CLIENTES WHERE NCCL_ID = :ID INTO :TOTAL, :IVAMONTO, :CONSUMO;
            if (TIPO = 77) then
                SELECT DVCH_MONTO, 0, 0 FROM DEVOLUCION_CHEQUES WHERE DVCH_ID = :ID INTO :TOTAL, :IVAMONTO, :CONSUMO;
            if (SITOT = 'SI') then
                BASEAUX = ABONO;
            ELSE
                if ((TOTAL - IVAMONTO - CONSUMO) <> 0) then
                    BASEAUX = (ABONO / TOTAL) * (TOTAL - IVAMONTO - CONSUMO);
                ELSE
                    BASEAUX = 0;
            BASE = BASEAUX;
            COMIMONTO = BASE / 100 * COMIPORC;
            END
        ELSE
            BEGIN
            if (TIPO = 31) then
                if (DETALLE = 'N') then
                    SELECT MAX(FACT_TOTAL), MAX(FACT_IVAMONTO), MAX(FACT_COMIPORC), SUM(FADE_CONSUMO)
                        FROM FACTURAS F, FACTURAS_DETALLE D WHERE F.FACT_ID = D.FACT_ID AND F.FACT_ID = :ID
                        INTO :TOTAL, :IVAMONTO, :PORCV, :CONSUMO;
                ELSE
                    FOR SELECT D.ARTI_COD, FADE_CANT, FADE_TOTAL, FADE_IVAMONTO, FADE_CONSUMO, FACT_COMIPORC, GRUP_COD
                        FROM FACTURAS F, FACTURAS_DETALLE D, ARTICULO A
                        WHERE F.FACT_ID = D.FACT_ID AND D.arti_cod = A.arti_cod AND F.FACT_ID = :ID
                        INTO :ARTICULO, :CANT, :TOTAL, :IVAMONTO, :CONSUMO, :porcv, :codgrp
                        DO
                        BEGIN
                        if (SITOT = 'SI') then
                            BASEAUX = TOTAL;
                        ELSE
                            BASEAUX = (TOTAL - IVAMONTO - CONSUMO);
                        COMIV = PORCV / 100 * BASEAUX;
                        COMIMONTO = COMIV / 100 * COMIPORC;
                        porcaux = comiporc;
                        comiporc = PORCV / 100 * COMIPORC;
                        BASE = BASEAUX;
                        SUSPEND;
                        END
            if (TIPO = 33) then
                if (DETALLE = 'N') then
                    SELECT MAX(DEVT_TOTAL), MAX(DEVT_IVAMONTO), MAX(DEVT_COMIPORC), SUM(DVDE_CONSUMO)
                        FROM DEVOLUCIONES_VENTAS V, DEVOLUCIONES_VENTAS_DETALLE D WHERE V.DEVT_ID = D.DEVT_ID AND D.DEVT_ID = :ID
                        INTO :TOTAL, :IVAMONTO, :PORCV, :CONSUMO;
                ELSE
                    FOR SELECT D.ARTI_COD, DVDE_CANT, DVDE_TOTAL*-1, DVDE_IVAMONTO*-1, DVDE_CONSUMO*-1, DEVT_COMIPORC, GRUP_COD
                        FROM DEVOLUCIONES_VENTAS V, DEVOLUCIONES_VENTAS_DETALLE D, ARTICULO A
                        WHERE V.DEVT_ID = D.DEVT_ID AND D.arti_cod = A.arti_cod AND V.DEVT_ID = :ID
                        INTO :ARTICULO, :CANT, :TOTAL, :IVAMONTO, :CONSUMO, :porcv, :codgrp
                        DO
                        BEGIN
                        if (SITOT = 'SI') then
                            BASEAUX = TOTAL;
                        ELSE
                            BASEAUX = (TOTAL - IVAMONTO - CONSUMO);
                        COMIV = PORCV / 100 * BASEAUX;
                        COMIMONTO = COMIV / 100 * COMIPORC;
                        porcaux = comiporc;
                        comiporc = PORCV / 100 * COMIPORC;
                        BASE = BASEAUX;
                        SUSPEND;
                        END
            if (TIPO = 41) then
                SELECT NDCL_MONTO, NDCL_IVAMONTO, NDCL_COMIPORC, 0 FROM NOTAS_DEBITO_CLIENTES
                    WHERE NDCL_ID = :ID INTO :TOTAL, :IVAMONTO, :PORCV, :CONSUMO;
            if (TIPO = 42) then
                SELECT NCCL_MONTO, NCCL_IVAMONTO, NCCL_COMIPORC, 0  FROM NOTAS_CREDITO_CLIENTES
                    WHERE NCCL_ID = :ID INTO :TOTAL, :IVAMONTO, :PORCV, :CONSUMO;
            if (TIPO = 77) then
                SELECT DVCH_MONTO, 0, 0, 0 FROM DEVOLUCION_CHEQUES WHERE DVCH_ID = :ID INTO :TOTAL, :IVAMONTO, :PORCV, :CONSUMO;
            if (SITOT = 'SI') then
                BASEAUX = ABONO;
            ELSE
                if ((total <> 0) AND (ABONO <> 0)) then
                    BASEAUX = (TOTAL - IVAMONTO - CONSUMO) / TOTAL * ABONO;
                ELSE
                    BASEAUX = 0;
            COMIV = PORCV / 100 * BASEAUX;
            COMIMONTO = COMIV / 100 * COMIPORC;
            porcaux = comiporc;
            comiporc = PORCV / 100 * COMIPORC;
            BASE = BASEAUX;
            END
        select COBR_NOM from COBRADORES where COBR_COD = :codvend INTO :nomvend;
        if (DETALLE = 'N') then
            if (ALFINAL = 'SI') then
                BEGIN
                /* VERIFIQUE EL SALDO DEL DOCUMENTO, SI ES CERO LIQUIDE COMISION SOBRE EL TOTAL */
                EXECUTE PROCEDURE saldo_doc_cartera(:tipo, :ID, :FECREC) returning_values (:SALDO);
                if (SALDO = 0) then
                    BEGIN
                    if (VENTA = 'NO') then
                        begin
                        if (SITOT = 'SI') then
                            BASEAUX = TOTAL;
                        ELSE
                            BASEAUX = TOTAL - IVAMONTO - CONSUMO;
                        COMIMONTO = BASEAUX * COMIPORC / 100;
                        end
                    ELSE
                        BEGIN
                        if (SITOT = 'SI') then
                            BASEAUX = TOTAL;
                        ELSE
                            BASEAUX = TOTAL - IVAMONTO - CONSUMO;
                        COMIV = PORCV * BASEAUX / 100;
                        COMIMONTO = COMIV / 100 * porcaux;
                        comiporc = PORCV / 100 * porcaux;
                        END
                    BASE = BASEAUX;
                    SUSPEND;
                    END
                END
            ELSE
                SUSPEND;
        ELSE
            if ((TIPO <> 31) AND (TIPO <> 33)) then
                SUSPEND;
        END
    END
FOR SELECT EGCC_TIPODOC, EGCC_IDDOC, EGCC_PREFIJO, EGCC_NUMERO, E.TERC_NIT, TERC_NOM, EGRE_FECHA, (EGCC_ABONO+EGCC_RTFTE+EGCC_RTIVA+EGCC_RTICA), PREF_PRE, EGRE_NUMERO, EGCC_SUCURSAL
    FROM EGRESOS E, EGRESOS_CRUCEC C, TERCEROS T
    WHERE E.EGRE_ID = C.EGRE_ID AND EGRE_FECHA >= :FECINI AND EGRE_FECHA <= :FECFIN AND E.TERC_NIT = T.TERC_NIT AND EGRE_ANULADO = 'N'
    ORDER BY TERC_NIT, EGRE_FECHA
    INTO :TIPO, :ID, :PREFIJO, :NUMERO, :NIT, :CLIENTE, :FECREC, :ABONO, :PREFREC, :NUMREC, :SUCURSAL
    DO
    BEGIN
    SELECT COBR_COD FROM cliente_sucursales WHERE TERC_NIT = :NIT AND CLCU_COD = :sucursal INTO :codvend;
    SELECT TIDO_NOMCORTO FROM TIPO_DOCUMENTO WHERE TIDO_COD = :TIPO INTO :NOMTIPO;
    if (COMISION = 'DOCUMENTO') then
        SELECT MVCL_FECHA, COBR_COD, MVCL_VENCE FROM MOVIMIENTO_CLIENTES WHERE MVCL_TIPOREF = :TIPO AND MVCL_IDREF = :ID
            INTO :FECDOC, :codvend, :VENCE;
    else
        SELECT MVCL_FECHA, MVCL_VENCE FROM MOVIMIENTO_CLIENTES WHERE MVCL_TIPOREF = :TIPO AND MVCL_IDREF = :ID
            INTO :FECDOC, :VENCE;
    if (FECDOC IS NOT NULL) then
        DIAS = FECREC - FECDOC;
    ELSE
        DIAS = 999;
    if ((codvend >= :DESDE) AND (codvend <= :hasta)) then
        BEGIN
        /* TRAIGA EL PORCENTAJE DE ACUERDO A LOS DIAS */
        COMIPORC = 0;
        SELECT CMCB_PORC FROM COMISION_COBRO WHERE CMCB_DIASINI <= :dias AND CMCB_DIASFIN >= :DIAS AND COBR_COD = :CODVEND INTO :COMIPORC;
        if (COMIPORC IS NULL) THEN
            COMIPORC = 0;
        if (VENTA = 'NO') then
            BEGIN
            if (TIPO = 31) then
                BEGIN
                if (DETALLE = 'N') then
                    SELECT MAX(FACT_TOTAL), MAX(FACT_IVAMONTO), SUM(FADE_CONSUMO) FROM FACTURAS F, FACTURAS_DETALLE D
                        WHERE F.FACT_ID = D.FACT_ID AND F.FACT_ID = :ID INTO :TOTAL, :IVAMONTO, :CONSUMO;
                ELSE
                    FOR SELECT D.ARTI_COD, FADE_CANT, FADE_TOTAL, FADE_IVAMONTO, FADE_CONSUMO, GRUP_COD
                        FROM FACTURAS F, FACTURAS_DETALLE D, ARTICULO A
                        WHERE F.FACT_ID = D.FACT_ID AND D.arti_cod = A.arti_cod AND F.FACT_ID = :ID
                        INTO :ARTICULO, :CANT, :TOTAL, :IVAMONTO, :CONSUMO, :CODGRP
                        DO
                        BEGIN
                        if (SITOT = 'SI') then
                            BASEAUX = TOTAL;
                        ELSE
                            BASEAUX = (TOTAL - IVAMONTO - CONSUMO);
                        BASE = BASEAUX;
                        COMIMONTO = BASE / 100 * COMIPORC;
                        SUSPEND;
                        END
                END
            if (TIPO = 33) then
                if (DETALLE = 'N') then
                    SELECT MAX(DEVT_TOTAL*-1), MAX(DEVT_IVAMONTO*-1), SUM(DVDE_CONSUMO) FROM DEVOLUCIONES_VENTAS V, DEVOLUCIONES_VENTAS_DETALLE D
                        WHERE V.DEVT_ID = D.DEVT_ID AND V.DEVT_ID = :ID INTO :TOTAL, :IVAMONTO, :CONSUMO;
                ELSE
                    FOR SELECT D.ARTI_COD, DVDE_CANT, DVDE_TOTAL*-1, DVDE_IVAMONTO*-1, DVDE_CONSUMO*-1, GRUP_COD
                        FROM DEVOLUCIONES_VENTAS V, DEVOLUCIONES_VENTAS_DETALLE D, ARTICULO A
                        WHERE V.DEVT_ID = D.DEVT_ID AND D.arti_cod = A.arti_cod AND V.DEVT_ID = :ID
                        INTO :ARTICULO, :CANT, :TOTAL, :IVAMONTO, :CONSUMO, :codgrp
                        DO
                        BEGIN
                        if (SITOT = 'SI') then
                            BASEAUX = TOTAL;
                        ELSE
                            BASEAUX = TOTAL - IVAMONTO - CONSUMO;
                        BASE = BASEAUX;
                        COMIMONTO = BASE / 100 * COMIPORC;
                        SUSPEND;
                        END
            if (TIPO = 41) then
                SELECT NDCL_MONTO, NDCL_IVAMONTO, 0 FROM NOTAS_DEBITO_CLIENTES WHERE NDCL_ID = :ID INTO :TOTAL, :IVAMONTO, :CONSUMO;
            if (TIPO = 42) then
                SELECT NCCL_MONTO*-1, NCCL_IVAMONTO*-1, 0 FROM NOTAS_CREDITO_CLIENTES WHERE NCCL_ID = :ID INTO :TOTAL, :IVAMONTO, :CONSUMO;
            if (TIPO = 77) then
                SELECT DVCH_MONTO, 0, 0 FROM DEVOLUCION_CHEQUES WHERE DVCH_ID = :ID INTO :TOTAL, :IVAMONTO, :CONSUMO;
            if (SITOT = 'SI') then
                BASEAUX = ABONO;
            ELSE
                if ((TOTAL - IVAMONTO - CONSUMO) <> 0) then
                    BASEAUX = (ABONO / TOTAL) * (TOTAL - IVAMONTO - CONSUMO);
                ELSE
                    BASEAUX = 0;
            BASE = BASEAUX;
            COMIMONTO = BASE / 100 * COMIPORC;
            END
        ELSE
            BEGIN
            if (TIPO = 31) then
                if (DETALLE = 'N') then
                    SELECT MAX(FACT_TOTAL), MAX(FACT_IVAMONTO), MAX(FACT_COMIPORC), SUM(FADE_CONSUMO)
                        FROM FACTURAS F, FACTURAS_DETALLE D WHERE F.FACT_ID = D.FACT_ID AND F.FACT_ID = :ID
                        INTO :TOTAL, :IVAMONTO, :PORCV, :CONSUMO;
                ELSE
                    FOR SELECT D.ARTI_COD, FADE_CANT, FADE_TOTAL, FADE_IVAMONTO, FADE_CONSUMO, FACT_COMIPORC, GRUP_COD
                        FROM FACTURAS F, FACTURAS_DETALLE D, ARTICULO A
                        WHERE F.FACT_ID = D.FACT_ID AND D.arti_cod = A.arti_cod AND F.FACT_ID = :ID
                        INTO :ARTICULO, :CANT, :TOTAL, :IVAMONTO, :CONSUMO, :porcv, :codgrp
                        DO
                        BEGIN
                        if (SITOT = 'SI') then
                            BASEAUX = TOTAL;
                        ELSE
                            BASEAUX = (TOTAL - IVAMONTO - CONSUMO);
                        COMIV = PORCV / 100 * BASEAUX;
                        COMIMONTO = COMIV / 100 * COMIPORC;
                        porcaux = comiporc;
                        comiporc = PORCV / 100 * COMIPORC;
                        BASE = BASEAUX;
                        SUSPEND;
                        END
            if (TIPO = 33) then
                if (DETALLE = 'N') then
                    SELECT MAX(DEVT_TOTAL), MAX(DEVT_IVAMONTO), MAX(DEVT_COMIPORC), SUM(DVDE_CONSUMO)
                        FROM DEVOLUCIONES_VENTAS V, DEVOLUCIONES_VENTAS_DETALLE D WHERE V.DEVT_ID = D.DEVT_ID AND D.DEVT_ID = :ID
                        INTO :TOTAL, :IVAMONTO, :PORCV, :CONSUMO;
                ELSE
                    FOR SELECT D.ARTI_COD, DVDE_CANT, DVDE_TOTAL*-1, DVDE_IVAMONTO*-1, DVDE_CONSUMO*-1, DEVT_COMIPORC, GRUP_COD
                        FROM DEVOLUCIONES_VENTAS V, DEVOLUCIONES_VENTAS_DETALLE D, ARTICULO A
                        WHERE V.DEVT_ID = D.DEVT_ID AND D.arti_cod = A.arti_cod AND V.DEVT_ID = :ID
                        INTO :ARTICULO, :CANT, :TOTAL, :IVAMONTO, :CONSUMO, :porcv, :codgrp
                        DO
                        BEGIN
                        if (SITOT = 'SI') then
                            BASEAUX = TOTAL;
                        ELSE
                            BASEAUX = (TOTAL - IVAMONTO - CONSUMO);
                        COMIV = PORCV / 100 * BASEAUX;
                        COMIMONTO = COMIV / 100 * COMIPORC;
                        porcaux = comiporc;
                        comiporc = PORCV / 100 * COMIPORC;
                        BASE = BASEAUX;
                        SUSPEND;
                        END
            if (TIPO = 41) then
                SELECT NDCL_MONTO, NDCL_IVAMONTO, NDCL_COMIPORC, 0 FROM NOTAS_DEBITO_CLIENTES
                    WHERE NDCL_ID = :ID INTO :TOTAL, :IVAMONTO, :PORCV, :CONSUMO;
            if (TIPO = 42) then
                SELECT NCCL_MONTO, NCCL_IVAMONTO, NCCL_COMIPORC, 0  FROM NOTAS_CREDITO_CLIENTES
                    WHERE NCCL_ID = :ID INTO :TOTAL, :IVAMONTO, :PORCV, :CONSUMO;
            if (TIPO = 77) then
                SELECT DVCH_MONTO, 0, 0, 0 FROM DEVOLUCION_CHEQUES WHERE DVCH_ID = :ID INTO :TOTAL, :IVAMONTO, :PORCV, :CONSUMO;
            if (SITOT = 'SI') then
                BASEAUX = ABONO;
            ELSE
                if ((total <> 0) AND (ABONO <> 0)) then
                    BASEAUX = (TOTAL - IVAMONTO - CONSUMO) / TOTAL * ABONO;
                ELSE
                    BASEAUX = 0;
            COMIV = PORCV / 100 * BASEAUX;
            COMIMONTO = COMIV / 100 * COMIPORC;
            porcaux = comiporc;
            comiporc = PORCV / 100 * COMIPORC;
            BASE = BASEAUX;
            END
        select COBR_NOM from COBRADORES where COBR_COD = :codvend INTO :nomvend;
        if (DETALLE = 'N') then
            if (ALFINAL = 'SI') then
                BEGIN
                /* VERIFIQUE EL SALDO DEL DOCUMENTO, SI ES CERO LIQUIDE COMISION SOBRE EL TOTAL */
                EXECUTE PROCEDURE saldo_doc_cartera(:tipo, :ID, :FECREC) returning_values (:SALDO);
                if (SALDO = 0) then
                    BEGIN
                    if (VENTA = 'NO') then
                        begin
                        if (SITOT = 'SI') then
                            BASEAUX = TOTAL;
                        ELSE
                            BASEAUX = TOTAL - IVAMONTO - CONSUMO;
                        COMIMONTO = BASEAUX * COMIPORC / 100;
                        end
                    ELSE
                        BEGIN
                        if (SITOT = 'SI') then
                            BASEAUX = TOTAL;
                        ELSE
                            BASEAUX = TOTAL - IVAMONTO - CONSUMO;
                        COMIV = PORCV * BASEAUX / 100;
                        COMIMONTO = COMIV / 100 * porcaux;
                        comiporc = PORCV / 100 * porcaux;
                        END
                    BASE = BASEAUX;
                    SUSPEND;
                    END
                END
            ELSE
                SUSPEND;
        ELSE
            if ((TIPO <> 31) AND (TIPO <> 33)) then
                SUSPEND;
        END
    END
FOR SELECT 'DEVOCHEQ', DVCH_MONTO*-1, DVCH_FECHA, PRBA_PREF, DVCH_NUMDOC, DVCH_FECHA, D.TERC_NIT, DVCH_NOMTERC, '', '', D.COBR_COD
    FROM DEVOLUCION_CHEQUES D, CLIENTES C
    WHERE DVCH_FECHA >= :FECINI AND DVCH_FECHA <= :FECFIN AND D.TERC_NIT = C.TERC_NIT AND D.COBR_COD = :CODVEND
    INTO :NOMTIPO, :BASE, :FECDOC, :PREFIJO, :NUMERO, :FECREC, :NIT, :CLIENTE, :PREFREC, :NUMREC, :codvend
    DO
    BEGIN
    COMIPORC = 0;
    COMIMONTO = 0;
    VENCE = fecdoc;
    RTFTE = 0;
    RTIVA = 0;
    RTICA = 0;
    DTOFIN = 0;
    if ((codvend >= :DESDE) AND (codvend <= :hasta)) then
        BEGIN
        select COBR_NOM from COBRADORES where COBR_COD = :codvend INTO :nomvend;
        /* SELECT CMCB_PORC FROM COMISION_COBRO WHERE CMCB_DIASINI <= 1 AND CMCB_DIASFIN >= 1 AND COBR_COD = :CODVEND INTO :COMIPORC;
        if (COMIPORC IS NULL) THEN
            COMIPORC = 0;
        COMIMONTO = BASE * COMIPORC / 100; */
        SUSPEND;
        END
    END
END
^

SET TERM ; ^

GRANT EXECUTE ON PROCEDURE LEE_CONFIGURACION TO PROCEDURE COMISIONES_COBRO;
GRANT SELECT ON RECIBOS_CAJA TO PROCEDURE COMISIONES_COBRO;
GRANT SELECT ON RECIBOS_CAJA_DETALLE TO PROCEDURE COMISIONES_COBRO;
GRANT SELECT ON TERCEROS TO PROCEDURE COMISIONES_COBRO;
GRANT SELECT ON TIPO_DOCUMENTO TO PROCEDURE COMISIONES_COBRO;
GRANT SELECT ON MOVIMIENTO_CLIENTES TO PROCEDURE COMISIONES_COBRO;
GRANT SELECT ON COMISION_COBRO TO PROCEDURE COMISIONES_COBRO;
GRANT SELECT ON FACTURAS TO PROCEDURE COMISIONES_COBRO;
GRANT SELECT ON FACTURAS_DETALLE TO PROCEDURE COMISIONES_COBRO;
GRANT SELECT ON ARTICULO TO PROCEDURE COMISIONES_COBRO;
GRANT SELECT ON DEVOLUCIONES_VENTAS TO PROCEDURE COMISIONES_COBRO;
GRANT SELECT ON DEVOLUCIONES_VENTAS_DETALLE TO PROCEDURE COMISIONES_COBRO;
GRANT SELECT ON NOTAS_DEBITO_CLIENTES TO PROCEDURE COMISIONES_COBRO;
GRANT SELECT ON NOTAS_CREDITO_CLIENTES TO PROCEDURE COMISIONES_COBRO;
GRANT SELECT ON DEVOLUCION_CHEQUES TO PROCEDURE COMISIONES_COBRO;
GRANT SELECT ON COBRADORES TO PROCEDURE COMISIONES_COBRO;
GRANT EXECUTE ON PROCEDURE SALDO_DOC_CARTERA TO PROCEDURE COMISIONES_COBRO;
GRANT SELECT ON EGRESOS TO PROCEDURE COMISIONES_COBRO;
GRANT SELECT ON EGRESOS_CRUCEC TO PROCEDURE COMISIONES_COBRO;
GRANT SELECT ON CLIENTE_SUCURSALES TO PROCEDURE COMISIONES_COBRO;
GRANT SELECT ON CLIENTES TO PROCEDURE COMISIONES_COBRO;

/* 20080729B */
/* generador de puntos estaba cruzado con el de clientes */
SET TERM ^ ;

CREATE OR ALTER TRIGGER PUNTOS_VENDEDOR_BI FOR PUNTOS_VENDEDOR
ACTIVE BEFORE INSERT POSITION 0
as
declare variable ID INTEGER;
declare variable fec DATE;
declare variable SALDOANT NUMERIC(18,2);
declare variable MOV NUMERIC(18,2);
begin
  /* Trigger text */
new.ptvt_id=gen_id(id_puntosvend,1);
SELECT MAX(PTVT_ID) FROM puntos_vendedor WHERE VEND_COD = NEW.vend_cod AND PTVT_FECHA < NEW.ptvt_fecha INTO :ID;
if (ID IS NULL) then
    NEW.ptvt_saldo = 0;
ELSE
    BEGIN
    SELECT PTVT_FECHA, PTVT_SALDO FROM puntos_vendedor WHERE VEND_COD = NEW.vend_cod AND PTVT_ID = :id INTO :fec, :saldoant;
    SELECT SUM(PTVT_DB - PTVT_CR) FROM puntos_vendedor WHERE VEND_COD = NEW.vend_cod AND PTVT_FECHA = :fec INTO :mov;
    NEW.ptvt_saldo = saldoant + mov;
    END
end
^

SET TERM ; ^

GRANT SELECT,UPDATE,REFERENCES ON PUNTOS_VENDEDOR TO TRIGGER PUNTOS_VENDEDOR_BI;


/* 20080729C - 3 DESCUENTOS POR ITEM Y NUMERO DE CAJAS EN FACTURA Y REMISION EN VENTA */
/* modificaciones DICOM */
/* 3 descuentos por item */
INSERT INTO CONFIGURACION (CONF_MODULO, CONF_CATEGORIA, CONF_PROPIEDAD, CONF_VALOR, CONF_POSIBLES, CONF_AYUDA) VALUES ('FACTURACION', 'FACTURAS', 'COLUMNAS DE DESCUENTO POR ITEM ADICIONALES', 'NO', 'SI,NO', 'SI:Separa el descuento por item en tres columnas independientes con su total respectivo en la liquidación. NO:Toma un solo descuento por item por artículo');
commit work;

ALTER TABLE FACTURAS_DETALLE
ADD FADE_DTO1 T_PORCENTAJE;
ALTER TABLE FACTURAS_DETALLE
ADD FADE_DTO2 T_PORCENTAJE;
ALTER TABLE FACTURAS_DETALLE
ADD FADE_DTO3 T_PORCENTAJE;

ALTER TABLE FACTURAS_DETALLE
ADD FADE_DTOM1 T_MONTO;
ALTER TABLE FACTURAS_DETALLE
ADD FADE_DTOM2 T_MONTO;
ALTER TABLE FACTURAS_DETALLE
ADD FADE_DTOM3 T_MONTO;

ALTER TABLE FACTURAS
ADD FACT_DTOIT1 T_MONTO;
ALTER TABLE FACTURAS
ADD FACT_DTOIT2 T_MONTO;
ALTER TABLE FACTURAS
ADD FACT_DTOIT3 T_MONTO;

/* numero de cajas */
INSERT INTO CONFIGURACION (CONF_MODULO, CONF_CATEGORIA, CONF_PROPIEDAD, CONF_VALOR, CONF_POSIBLES, CONF_AYUDA) VALUES ('FACTURACION', 'DOCUMENTOS', 'PREGUNTAR NUMERO DE CAJAS POR ITEM', 'NO', 'SI,NO', 'SI:El usuario podrá digitar el número de paquetes o cajas que conforman la cantidad facturada.');
commit work;

ALTER TABLE FACTURAS_DETALLE
ADD FADE_CAJAS T_CANTIDAD;

SET TERM ^ ;

CREATE OR ALTER PROCEDURE IMPR_FACTURA(
    ID INTEGER)
RETURNS (
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    VENCE DATE,
    DIASVENCE INTEGER,
    CONTCRED CHAR(17),
    NIT VARCHAR(20),
    NOMTERCERO VARCHAR(60),
    VENDEDOR INTEGER,
    NOMVENDEDOR VARCHAR(60),
    PUNTOVTA INTEGER,
    NOMPUNTOVTA VARCHAR(30),
    CODBODEGA VARCHAR(2),
    NOMBODEGA VARCHAR(30),
    AUTORIZACION VARCHAR(20),
    DESPACHO VARCHAR(255),
    TRANSPORTADOR VARCHAR(60),
    COTIZACION VARCHAR(30),
    PEDIDO VARCHAR(30),
    REMISION VARCHAR(30),
    PACIENTE VARCHAR(20),
    NOMPACIENTE VARCHAR(60),
    COMIPORC NUMERIC(9,2),
    COMIMONTO NUMERIC(18,2),
    SUBTOTAL NUMERIC(18,2),
    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),
    EXTRA NUMERIC(18,2),
    DTOFPORC NUMERIC(9,2),
    DTOFMONTO NUMERIC(18,2),
    FECHADTO DATE,
    TOTALFAC NUMERIC(18,2),
    TOTALPAGAR NUMERIC(18,2),
    OBS BLOB SUB_TYPE 1 SEGMENT SIZE 80,
    ITEM INTEGER,
    ARTICULO VARCHAR(15),
    CODBAR VARCHAR(15),
    ARTIDES VARCHAR(60),
    CANT NUMERIC(18,4),
    LOTE VARCHAR(15),
    VLOTE DATE,
    UNIDAD VARCHAR(8),
    CAJAS NUMERIC(18,4),
    FACTOR INTEGER,
    LISTAPR INTEGER,
    REFITEM VARCHAR(60),
    BODITEM VARCHAR(2),
    PRUNIT NUMERIC(18,2),
    DTOITPORC NUMERIC(9,2),
    DTOITMONTO NUMERIC(18,2),
    PRNETO NUMERIC(18,2),
    IVAPORC NUMERIC(9,2),
    IVAITMONTO NUMERIC(18,2),
    CONSUMO NUMERIC(18,2),
    SUBTOTIT NUMERIC(18,2),
    SUBTOTITCON NUMERIC(18,2),
    DTOIT1 NUMERIC(9,2),
    DTOIT2 NUMERIC(9,2),
    DTOIT3 NUMERIC(9,2),
    TOTAL NUMERIC(18,2),
    CODIGOCL VARCHAR(20),
    ZONACOD VARCHAR(2),
    ZONANOM VARCHAR(60),
    DV CHAR(1),
    DIRECCION VARCHAR(60),
    CIUDAD VARCHAR(40),
    TELEFONO VARCHAR(40),
    CONTACTO VARCHAR(60),
    FAX VARCHAR(25),
    GRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    SUBGRUPO VARCHAR(3),
    NOMSUBG VARCHAR(30),
    MARCA VARCHAR(3),
    NOMMARCA VARCHAR(30),
    PESO NUMERIC(18,4),
    ANCHO NUMERIC(18,4),
    ALTO NUMERIC(18,4),
    LARGO NUMERIC(18,4),
    SUMA1 NUMERIC(18,2),
    SUMA2 NUMERIC(18,2),
    SUMA3 NUMERIC(18,2),
    IVA1 NUMERIC(18,2),
    IVA2 NUMERIC(18,2),
    IVA3 NUMERIC(18,2),
    SUMAEX NUMERIC(18,2),
    SUMAGR NUMERIC(18,2),
    TOTCONSUMO NUMERIC(18,2),
    DTOIT1M NUMERIC(18,2),
    DTOIT2M NUMERIC(18,2),
    DTOIT3M NUMERIC(18,2),
    TOTCAJAS NUMERIC(18,2),
    VEHICULO VARCHAR(8),
    RECIBIDO NUMERIC(18,2),
    CAMBIO NUMERIC(18,2),
    HORA TIME,
    FORMAPAGO1 VARCHAR(30),
    MONTOPAGO1 NUMERIC(18,2),
    FORMAPAGO2 VARCHAR(30),
    MONTOPAGO2 NUMERIC(18,2),
    FORMAPAGO3 VARCHAR(30),
    MONTOPAGO3 NUMERIC(18,2),
    PUNTOS INTEGER,
    PUNTOSACUM INTEGER,
    PUNTOSVENC INTEGER,
    OBSITEM BLOB SUB_TYPE 1 SEGMENT SIZE 80)
AS
DECLARE VARIABLE IMPTOS CHAR(1);
DECLARE VARIABLE TARIFA INTEGER;
declare variable DEVUELTO NUMERIC(18,2);
/*DECLARE VARIABLE NROCOPIA INTEGER;*/
declare variable ORDENCOD CHAR(2);
declare variable IMPRDEV CHAR(2);
declare variable IMPR CHAR(1);
declare variable ITEMFP INTEGER;
declare variable FORMAP VARCHAR(30);
declare variable MONTOP NUMERIC(18,2);
declare variable SUCUR VARCHAR(10);
BEGIN
  SELECT F.PREF_PRE, FACT_NUMERO, FACT_FECHA, FACT_VENCE, F.BODE_COD, BODE_NOM, F.TERC_NIT, FACT_NOMCLIENTE, F.VEND_COD, VEND_NOMBRE, F.PTVT_ID, PTVT_NOM,
    AUTO_NUMERO, FACT_DESPACHO, FACT_TRANSP, FACT_COTIZACI, FACT_PEDIDO, FACT_REMISION, FACT_COMIPORC, FACT_COMIMONTO, FACT_IVAINC, 
    FACT_DTOPOR, FACT_DTOMONTO, FACT_ADICIONAL, FACT_IVAMONTO, FACT_RTFTEPOR, FACT_RTFTEMONTO, FACT_RTIVAPOR, FACT_RTIVAMONTO, FACT_RTICAPOR, FACT_RTICAMONTO, FACT_EXTRA, FACT_DTOFPOR, FACT_DTOFMONTO, FACT_DTOFFECHA, FACT_TOTAL,
    TERC_DIR, TERC_CIU, TERC_TEL, TERC_CONTACTO, TERC_FAX, TERC_DV, FACT_DTOIT1, FACT_DTOIT2, FACT_DTOIT3,
    FACT_OBS, VEHI_COD, /*FACT_NROCOPIA,*/ FACT_RECIBIDO, FACT_SUCURSAL, FACT_DETCLI, FACT_DETCLINOM
    FROM FACTURAS F, BODEGA B, VENDEDORES V, PUNTO_VENTA P, TERCEROS T
    WHERE F.BODE_COD = B.BODE_COD AND F.VEND_COD = V.VEND_COD AND F.PTVT_ID = P.PTVT_ID AND F.TERC_NIT = T.TERC_NIT AND F.FACT_ID = :ID
    into :PREF, :NUMERO, :FECHA, :VENCE, :CODBODEGA, :NOMBODEGA, :NIT, :NOMTERCERO, :VENDEDOR, :NOMVENDEDOR, :PUNTOVTA, :NOMPUNTOVTA,
    :AUTORIZACION, :DESPACHO, :TRANSPORTADOR, :COTIZACION, :PEDIDO, :REMISION, :COMIPORC, :COMIMONTO, :IMPTOS,
    :DTOPORC, :DTOMONTO, :ADICIONAL, :IVAMONTO, :RTEFTEPORC, :RTEFTEMONTO, :RTEIVAPORC, :RTEIVAMONTO, :RTEICAPORC, :RTEICAMONTO, :EXTRA, :DTOFPORC, :DTOFMONTO, :FECHADTO, :TOTALFAC,
    :DIRECCION, :CIUDAD, :TELEFONO, :CONTACTO, :FAX, :DV, :dtoit1m, :dtoit2m, :dtoit3m,
    :OBS, :VEHICULO,/* :NROCOPIA,*/ :RECIBIDO, :SUCUR, :paciente, :nompaciente;

  /* ACUMULE LOS PUNTOS, SE HACE ACA POR SER POSTERIOR AL DETALLE */
  EXECUTE PROCEDURE acumula_puntos_cliente (31, :id, :nit, :fecha) returning_values (:PUNTOS);
  EXECUTE PROCEDURE consulta_puntos_cliente (:id, :nit, :fecha) returning_values (:puntos, :puntosacum, :puntosvenc);

  SELECT CLIE_COD, C.ZONA_COD, ZONA_NOM
    FROM CLIENTES C, ZONAS Z
    WHERE TERC_NIT = :NIT AND C.ZONA_COD = Z.ZONA_COD
    INTO :CODIGOCL, :ZONACOD, :ZONANOM;
  /*SELECT NOCO_NOMBRE FROM NOMBRES_COPIAS where NOCO_ID = :NROCOPIA INTO :NOMCOPIA;*/
  SELECT CLSU_DIR, CLSU_CIUDAD, CLSU_TEL FROM CLIENTE_SUCURSALES WHERE TERC_NIT = :NIT AND CLCU_COD = :SUCUR
    INTO :DIRECCION, :CIUDAD, :TELEFONO;
  /*if (NOMCOPIA IS NULL) then
    NOMCOPIA = 'COPIA No. ' || NROCOPIA;**/
  DIASVENCE = VENCE - FECHA;
  if (DIASVENCE > 0) then
    CONTCRED = 'CREDITO ' || CAST(DIASVENCE AS VARCHAR(3)) || ' DIAS';
  ELSE
    CONTCRED = 'CONTADO';
  SUBTOTAL = TOTALFAC - EXTRA - IVAMONTO - ADICIONAL + DTOMONTO;
  TOTALPAGAR = TOTALFAC - RTEFTEMONTO - RTEIVAMONTO - RTEICAMONTO;
  if (RECIBIDO <> 0) then
      CAMBIO = RECIBIDO - totalpagar;
  ELSE
    CAMBIO = 0;
  SUMAEX = 0;
  SUMA1 = 0;
  SUMA2 = 0;
  SUMA3 = 0;
  IVA1 = 0;
  IVA2 = 0;
  IVA3 = 0;
  TOTCONSUMO = 0;
  MONTOPAGO1 = 0;
  SELECT MAX(AUDI_HORA) FROM AUDITORIA WHERE TIDO_COD = 31 AND AUDI_IDDOC = :ID AND AUDI_OPER = 'I' INTO :HORA;
  /* AHORA LAS FORMAS DE PAGO, BUSQUE EL ABONO DE HOY A LA FACTURA */
  ITEMFP = 1;
  MONTOPAGO1 = 0;
  MONTOPAGO2 = 0;
  MONTOPAGO3 = 0;
  FOR SELECT FOPA_NOM, RCPA_MONTO FROM RECIBOS_CAJA_PAGO P, FORMAS_PAGO F, RECIBOS_CAJA R, RECIBOS_CAJA_DETALLE D
    WHERE R.RECA_ID = P.RECA_ID AND R.RECA_ID = D.RECA_ID AND P.FOPA_ID = F.FOPA_ID AND RECA_FECHA = :FECHA AND RCDE_TIPODOC = 31 AND RCDE_IDDOC = :ID
    INTO :formap, :MONTOP
    DO
    BEGIN
    if (ITEMFP = 1) then
        BEGIN
        FORMAPAGO1 = FORMAP;
        MONTOPAGO1 = MONTOP;
        END
    if (ITEMFP = 2) then
        BEGIN
        FORMAPAGO2 = FORMAP;
        MONTOPAGO2 = MONTOP;
        END
    if (ITEMFP = 3) then
        BEGIN
        FORMAPAGO3 = FORMAP;
        MONTOPAGO3 = MONTOP;
        END
    ITEMFP = ITEMFP + 1;
    END
  EXECUTE PROCEDURE lee_configuracion ('FACTURACION','DOCUMENTOS','ORDENAR ITEMS POR CODIGO DE ARTICULO') returning_values (:ORDENCOD);
  EXECUTE PROCEDURE lee_configuracion ('FACTURACION','POS', 'IMPRIMIR DEVOLUCIONES DE ARTICULOS NEGATIVOS') returning_values (:imprdev);
  totcajas = 0;
  if (ORDENCOD = 'SI') then
    BEGIN
    FOR SELECT FADE_ITEM, D.ARTI_COD, FADE_CODBAR, SUBSTR(FADE_DESC,1,60), FADE_CANT, FADE_UNIDAD, FADE_FACTOR, BODE_COD, FADE_LOTE, LIPR_COD, FADE_PRUNIT, FADE_DTOPORC, FADE_DTOMONTO, FADE_IVAPORC, FADE_IVAMONTO, FADE_CONSUMO, FADE_TOTAL, FADE_REFERENCIA,
        GRUP_COD, SUBG_COD, MARC_COD, ARTI_PESO, ARTI_ANCHO, ARTI_ALTO, ARTI_LARGO, TAIV_COD, FADE_DEVUELTO, FADE_OBS, FADE_DTO1, FADE_DTO2, FADE_DTO3, FADE_CAJAS
        FROM FACTURAS_DETALLE D, ARTICULO A
        WHERE D.ARTI_COD = A.ARTI_COD AND D.FACT_ID = :ID
        ORDER BY D.ARTI_COD
        INTO :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :FACTOR, :BODITEM, :LOTE, :LISTAPR, :PRUNIT, :DTOITPORC, :DTOITMONTO, :IVAPORC, :IVAITMONTO, :CONSUMO, :TOTAL, :refitem,
        :GRUPO, :SUBGRUPO, :MARCA, :PESO, :ANCHO, :ALTO, :LARGO, :TARIFA, :devuelto, :obsitem, :dtoit1, :dtoit2, :dtoit3, :cajas
        DO
          BEGIN
          if (ARTICULO = CODBAR) then
            SELECT FIRST 1 COBA_COD FROM barras_articulo WHERE ARTI_COD = :articulo INTO :CODBAR;
          if (IMPRDEV <> 'SI') then
            BEGIN
            if ((CANT >= 0) AND (DEVUELTO = 0)) then
                IMPR = 'S';
            ELSE
                IMPR = 'N'; /* ES DEVOLUCION */
            END
          ELSE
            IMPR = 'S';
          if (IMPR = 'S') then
            BEGIN
            if (IMPTOS = 'S') then
                if (cant <> 0) then
                    PRNETO = PRUNIT - DTOITMONTO - ((IVAITMONTO+CONSUMO) / CANT);
                else
                    PRNETO = PRUNIT - DTOITMONTO;
            ELSE
                PRNETO = PRUNIT - DTOITMONTO;
            SUBTOTIT = TOTAL - IVAITMONTO - CONSUMO;
            SUBTOTITCON = TOTAL;
            TOTCONSUMO = TOTCONSUMO + CONSUMO;
            SELECT LOTE_VENCE FROM LOTES WHERE LOTE_NRO = :lote AND ARTI_COD = :ARTICULO AND BODE_COD = :boditem INTO :vlote;
            if (TARIFA = 0) then
                SUMAEX = SUMAEX + TOTAL;
            if (TARIFA = 1) then
                BEGIN
                SUMA1 = SUMA1 + TOTAL - IVAITMONTO;
                IVA1 = IVA1 + IVAITMONTO;
                END
            if (TARIFA = 2) then
                BEGIN
                SUMA2 = SUMA2 + TOTAL - IVAITMONTO;
                IVA2 = IVA2 + IVAITMONTO;
                END
            if (TARIFA = 3) then
                BEGIN
                SUMA3 = SUMA3 + TOTAL - IVAITMONTO;
                IVA3 = IVA3 + IVAITMONTO;
                END
            SUMAGR = SUMA1 + SUMA2 + SUMA3;
            if (IMPTOS = 'N') then
                TOTAL = TOTAL - IVAITMONTO - CONSUMO;
            if (ANCHO IS NULL) then
                ANCHO = 0;
            if (ALTO IS NULL) then
                ALTO = 0;
            if (LARGO IS NULL) then
                LARGO = 0;
            if (PESO IS NULL) then
                PESO = 0;
            PESO = PESO * CANT;
            totcajas = totcajas + cajas;
            SUSPEND;
            END
          END
    END
ELSE
    BEGIN
    FOR SELECT FADE_ITEM, D.ARTI_COD, FADE_CODBAR, SUBSTR(FADE_DESC,1,60), FADE_CANT, FADE_UNIDAD, FADE_FACTOR, BODE_COD, FADE_LOTE, LIPR_COD, FADE_PRUNIT, FADE_DTOPORC, FADE_DTOMONTO, FADE_IVAPORC, FADE_IVAMONTO, FADE_CONSUMO, FADE_TOTAL, FADE_REFERENCIA,
        GRUP_COD, SUBG_COD, MARC_COD, ARTI_PESO, ARTI_ANCHO, ARTI_ALTO, ARTI_LARGO, TAIV_COD, FADE_DEVUELTO, FADE_OBS, FADE_DTO1, FADE_DTO2, FADE_DTO3, FADE_CAJAS
        FROM FACTURAS_DETALLE D, ARTICULO A
        WHERE D.ARTI_COD = A.ARTI_COD AND D.FACT_ID = :ID
        ORDER BY FADE_ITEM
        INTO :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :FACTOR, :BODITEM, :LOTE, :LISTAPR, :PRUNIT, :DTOITPORC, :DTOITMONTO, :IVAPORC, :IVAITMONTO, :CONSUMO, :TOTAL, :refitem, 
        :GRUPO, :SUBGRUPO, :MARCA, :PESO, :ANCHO, :ALTO, :LARGO, :TARIFA, :devuelto, :obsitem, :dtoit1, :dtoit2, :dtoit3, :cajas
        DO
          BEGIN
          if (IMPRDEV <> 'SI') then
            BEGIN
            if ((CANT >= 0) AND (DEVUELTO = 0)) then
                IMPR = 'S';
            ELSE
                IMPR = 'N'; /* ES DEVOLUCION */
            END
          ELSE
            IMPR = 'S';
          if (IMPR = 'S') then
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :GRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :MARCA INTO NOMMARCA;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :SUBGRUPO AND GRUP_COD = :GRUPO INTO :NOMSUBG;
            if (IMPTOS = 'S') then
              PRNETO = PRUNIT - DTOITMONTO - ((IVAITMONTO+CONSUMO) / CANT);
            ELSE
              PRNETO = PRUNIT - DTOITMONTO;
            SUBTOTIT = TOTAL - IVAITMONTO - CONSUMO;
            SUBTOTITCON = TOTAL;
            TOTCONSUMO = TOTCONSUMO + CONSUMO;
            SELECT LOTE_VENCE FROM LOTES WHERE LOTE_NRO = :lote AND ARTI_COD = :ARTICULO AND BODE_COD = :boditem INTO :vlote;
            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;
            if (ANCHO IS NULL) then
                ANCHO = 0;
            if (ALTO IS NULL) then
                ALTO = 0;
            if (LARGO IS NULL) then
                LARGO = 0;
            if (PESO IS NULL) then
                PESO = 0;
            PESO = PESO * CANT;
            totcajas = totcajas + cajas;
            SUSPEND;
            END
          END
    END
END
^

SET TERM ; ^

GRANT SELECT ON FACTURAS TO PROCEDURE IMPR_FACTURA;
GRANT SELECT ON BODEGA TO PROCEDURE IMPR_FACTURA;
GRANT SELECT ON VENDEDORES TO PROCEDURE IMPR_FACTURA;
GRANT SELECT ON PUNTO_VENTA TO PROCEDURE IMPR_FACTURA;
GRANT SELECT ON TERCEROS TO PROCEDURE IMPR_FACTURA;
GRANT EXECUTE ON PROCEDURE ACUMULA_PUNTOS_CLIENTE TO PROCEDURE IMPR_FACTURA;
GRANT EXECUTE ON PROCEDURE CONSULTA_PUNTOS_CLIENTE TO PROCEDURE IMPR_FACTURA;
GRANT SELECT ON CLIENTES TO PROCEDURE IMPR_FACTURA;
GRANT SELECT ON ZONAS TO PROCEDURE IMPR_FACTURA;
GRANT SELECT ON CLIENTE_SUCURSALES TO PROCEDURE IMPR_FACTURA;
GRANT SELECT ON AUDITORIA TO PROCEDURE IMPR_FACTURA;
GRANT SELECT ON RECIBOS_CAJA_PAGO TO PROCEDURE IMPR_FACTURA;
GRANT SELECT ON FORMAS_PAGO TO PROCEDURE IMPR_FACTURA;
GRANT SELECT ON RECIBOS_CAJA TO PROCEDURE IMPR_FACTURA;
GRANT SELECT ON RECIBOS_CAJA_DETALLE TO PROCEDURE IMPR_FACTURA;
GRANT EXECUTE ON PROCEDURE LEE_CONFIGURACION TO PROCEDURE IMPR_FACTURA;
GRANT SELECT ON FACTURAS_DETALLE TO PROCEDURE IMPR_FACTURA;
GRANT SELECT ON ARTICULO TO PROCEDURE IMPR_FACTURA;
GRANT SELECT ON BARRAS_ARTICULO TO PROCEDURE IMPR_FACTURA;
GRANT SELECT ON LOTES TO PROCEDURE IMPR_FACTURA;
GRANT SELECT ON GRUPO TO PROCEDURE IMPR_FACTURA;
GRANT SELECT ON MARCAS TO PROCEDURE IMPR_FACTURA;
GRANT SELECT ON SUBGRUPO TO PROCEDURE IMPR_FACTURA;

ALTER TABLE REMISIONES_VENTA_DETALLE
ADD RVDE_CAJAS T_CANTIDAD;

SET TERM ^ ;

CREATE OR ALTER PROCEDURE IMPR_REMISION(
    ID INTEGER)
RETURNS (
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    NIT VARCHAR(20),
    NOMTERCERO VARCHAR(60),
    VENDEDOR INTEGER,
    NOMVENDEDOR VARCHAR(60),
    PUNTOVTA INTEGER,
    NOMPUNTOVTA VARCHAR(30),
    CODBODEGA VARCHAR(2),
    NOMBODEGA VARCHAR(30),
    COTIZACION VARCHAR(30),
    PEDIDO VARCHAR(30),
    FACTURA VARCHAR(30),
    SUBTOTAL NUMERIC(18,2),
    IVAMONTO NUMERIC(18,2),
    TOTALFAC NUMERIC(18,2),
    DESPACHO VARCHAR(255),
    TRANSPORTADOR VARCHAR(60),
    OBS BLOB SUB_TYPE 1 SEGMENT SIZE 80,
    ITEM INTEGER,
    ARTICULO VARCHAR(15),
    CODBAR VARCHAR(15),
    ARTIDES VARCHAR(60),
    CANT NUMERIC(18,4),
    LOTE VARCHAR(15),
    VLOTE DATE,
    UNIDAD VARCHAR(8),
    CAJAS NUMERIC(18,4),
    DEVUELTO NUMERIC(18,4),
    LISTAPR INTEGER,
    REFITEM VARCHAR(60),
    BODITEM VARCHAR(2),
    PRUNIT NUMERIC(18,2),
    DTOITPORC NUMERIC(9,2),
    DTOITMONTO NUMERIC(18,2),
    SUBTOTALITEM NUMERIC(18,2),
    PRNETOSINIVA NUMERIC(18,2),
    PRNETO NUMERIC(18,2),
    IVAPORC NUMERIC(9,2),
    IVAITMONTO NUMERIC(18,2),
    CONSUMO NUMERIC(18,2),
    TOTAL NUMERIC(18,2),
    CODIGOCL VARCHAR(20),
    ZONACOD VARCHAR(2),
    ZONANOM VARCHAR(60),
    DV CHAR(1),
    DIRECCION VARCHAR(60),
    CIUDAD VARCHAR(40),
    TELEFONO VARCHAR(40),
    CONTACTO VARCHAR(60),
    FAX VARCHAR(25),
    GRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    SUBGRUPO VARCHAR(3),
    NOMSUBG VARCHAR(30),
    MARCA VARCHAR(3),
    NOMMARCA VARCHAR(30),
    PESO NUMERIC(9,4),
    ANCHO NUMERIC(18,4),
    ALTO NUMERIC(18,4),
    LARGO NUMERIC(18,4),
    SUMA1 NUMERIC(18,2),
    SUMA2 NUMERIC(18,2),
    SUMA3 NUMERIC(18,2),
    IVA1 NUMERIC(18,2),
    IVA2 NUMERIC(18,2),
    IVA3 NUMERIC(18,2),
    SUMAEX NUMERIC(18,2),
    SUMAGR NUMERIC(18,2),
    TOTCAJAS NUMERIC(18,2),
    OBSITEM BLOB SUB_TYPE 1 SEGMENT SIZE 80)
AS
DECLARE VARIABLE IMPTOS CHAR(1);
DECLARE VARIABLE TARIFA INTEGER;
declare variable ORDENCOD CHAR(2);
declare variable SUCUR VARCHAR(10);
BEGIN
  /*  */
  SELECT F.PREF_PRE, REVT_NUMERO, REVT_FECHA, F.BODE_COD, BODE_NOM, F.TERC_NIT, REVT_NOMTERC, F.VEND_COD, VEND_NOMBRE, F.PTVT_ID, PTVT_NOM,
    REVT_COTIZACI, REVT_PEDIDO, REVT_FACTURA, REVT_IVAINC,
    REVT_IVAMONTO, REVT_TOTAL, REVT_DESPACHO, REVT_TRANSP,
    TERC_CONTACTO, TERC_FAX, TERC_DV, REVT_OBS, REVT_SUCURSAL
    FROM REMISIONES_VENTA F, BODEGA B, VENDEDORES V, PUNTO_VENTA P, TERCEROS T
    WHERE F.BODE_COD = B.BODE_COD AND F.VEND_COD = V.VEND_COD AND F.PTVT_ID = P.PTVT_ID AND F.TERC_NIT = T.TERC_NIT AND F.REVT_ID = :ID
    into :PREF, :NUMERO, :FECHA, :CODBODEGA, :NOMBODEGA, :NIT, :NOMTERCERO, :VENDEDOR, :NOMVENDEDOR, :PUNTOVTA, :NOMPUNTOVTA,
    :COTIZACION, :PEDIDO, :FACTURA, :IMPTOS,
    :IVAMONTO, :TOTALFAC, :DESPACHO, :transportador, 
    :CONTACTO, :FAX, :DV, :OBS, :SUCUR;
  SUBTOTAL = TOTALFAC - IVAMONTO;

  SELECT CLIE_COD, C.ZONA_COD, ZONA_NOM
    FROM CLIENTES C, ZONAS Z
    WHERE TERC_NIT = :NIT AND C.ZONA_COD = Z.ZONA_COD
    INTO :CODIGOCL, :ZONACOD, :ZONANOM;
  SELECT CLSU_DIR, CLSU_CIUDAD, CLSU_TEL FROM CLIENTE_SUCURSALES WHERE TERC_NIT = :NIT AND CLCU_COD = :SUCUR
    INTO :DIRECCION, :CIUDAD, :TELEFONO;
    
  SUMAEX = 0;
  SUMA1 = 0;
  SUMA2 = 0;
  SUMA3 = 0;
  IVA1 = 0;
  IVA2 = 0;
  IVA3 = 0;
  ITEM = 0;
  totcajas = 0;
  EXECUTE PROCEDURE lee_configuracion ('FACTURACION','DOCUMENTOS','ORDENAR ITEMS POR CODIGO DE ARTICULO') returning_values (:ORDENCOD);
  if (ORDENCOD = 'SI') then
    BEGIN
    FOR SELECT D.ARTI_COD, RVDE_CODBAR, SUBSTR(RVDE_DESC,1,60), RVDE_CANT, RVDE_UNIDAD, BODE_COD, RVDE_LOTE, LIPR_COD, RVDE_PRUNIT, RVDE_DTOPORC, RVDE_DTOMONTO, RVDE_IVAPORC, RVDE_IVAMONTO, RVDE_CONSUMO, RVDE_TOTAL, RVDE_REFERENCIA,
        GRUP_COD, SUBG_COD, MARC_COD, ARTI_PESO, ARTI_ANCHO, ARTI_ALTO, ARTI_LARGO, TAIV_COD, RVDE_DEVUELTO, RVDE_OBS, RVDE_CAJAS
        FROM REMISIONES_VENTA_DETALLE D, ARTICULO A
        WHERE D.ARTI_COD = A.ARTI_COD AND D.REVT_ID = :ID
        ORDER BY RVDE_CODBAR
        INTO :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :BODITEM, :LOTE, :LISTAPR, :PRUNIT, :DTOITPORC, :DTOITMONTO, :IVAPORC, :IVAITMONTO, :CONSUMO, :TOTAL, :refitem,
            :GRUPO, :SUBGRUPO, :MARCA, :PESO, :ANCHO, :ALTO, :LARGO, :TARIFA, :DEVUELTO, :obsitem, :CAJAS
        DO
        BEGIN
        if (ARTICULO = CODBAR) then
            SELECT FIRST 1 COBA_COD FROM barras_articulo WHERE ARTI_COD = :articulo INTO :CODBAR;
        SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :GRUPO INTO NOMGRUPO;
        SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :MARCA INTO NOMMARCA;
        SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :SUBGRUPO AND GRUP_COD = :GRUPO INTO :NOMSUBG;
        SELECT LOTE_VENCE FROM LOTES WHERE LOTE_NRO = :lote AND ARTI_COD = :ARTICULO AND BODE_COD = :boditem INTO :vlote;
        ITEM = ITEM + 1;
        PRNETO = PRUNIT - DTOITMONTO;
        if (IVAPORC = 0) then
            SUMAEX = SUMAEX + TOTAL;
        if (TARIFA = 1) then
            BEGIN
            SUMA1 = SUMA1 + TOTAL - IVAITMONTO;
            IVA1 = IVA1 + IVAITMONTO;
            END
        if (TARIFA = 2) then
            BEGIN
            SUMA2 = SUMA2 + TOTAL - IVAITMONTO;
            IVA2 = IVA2 + IVAITMONTO;
            END
        if (TARIFA = 3) then
            BEGIN
            SUMA3 = SUMA3 + TOTAL - IVAITMONTO;
            IVA3 = IVA3 + IVAITMONTO;
            END
        SUMAGR = SUMA1 + SUMA2 + SUMA3;

        if (IMPTOS = 'N') then
            TOTAL = TOTAL - IVAITMONTO;
        ELSE
           BEGIN
           PRNETOSINIVA = PRUNIT / (1 + ivaporc/100);
           SUBTOTALITEM = PRNETOSINIVA * :CANT;
           END
        totcajas = totcajas + cajas;
        SUSPEND;
        END
    END
ELSE
    BEGIN
    FOR SELECT RVDE_ITEM, D.ARTI_COD, RVDE_CODBAR, SUBSTR(RVDE_DESC,1,60), RVDE_CANT, RVDE_UNIDAD, BODE_COD, RVDE_LOTE, LIPR_COD, RVDE_PRUNIT, RVDE_DTOPORC, RVDE_DTOMONTO, RVDE_IVAPORC, RVDE_IVAMONTO, RVDE_CONSUMO, RVDE_TOTAL, RVDE_REFERENCIA,
        GRUP_COD, SUBG_COD, MARC_COD, ARTI_PESO, ARTI_ANCHO, ARTI_ALTO, ARTI_LARGO, TAIV_COD, RVDE_DEVUELTO, RVDE_OBS, RVDE_CAJAS
        FROM REMISIONES_VENTA_DETALLE D, ARTICULO A
        WHERE D.ARTI_COD = A.ARTI_COD AND D.REVT_ID = :ID
        ORDER BY RVDE_ITEM
        INTO :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :BODITEM, :LOTE, :LISTAPR, :PRUNIT, :DTOITPORC, :DTOITMONTO, :IVAPORC, :IVAITMONTO, :CONSUMO, :TOTAL, :refitem,
            :GRUPO, :SUBGRUPO, :MARCA, :PESO, :ANCHO, :ALTO, :LARGO, :TARIFA, :DEVUELTO, :obsitem, :CAJAS
        DO
        BEGIN
        SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :GRUPO INTO NOMGRUPO;
        SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :MARCA INTO NOMMARCA;
        SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :SUBGRUPO AND GRUP_COD = :GRUPO INTO :NOMSUBG;
        SELECT LOTE_VENCE FROM LOTES WHERE LOTE_NRO = :lote AND ARTI_COD = :ARTICULO AND BODE_COD = :boditem INTO :vlote;
        ITEM = ITEM + 1;
        PRNETO = PRUNIT - DTOITMONTO;
        if (IVAPORC = 0) then
            SUMAEX = SUMAEX + TOTAL;
        if (TARIFA = 1) then
            BEGIN
            SUMA1 = SUMA1 + TOTAL - IVAITMONTO;
            IVA1 = IVA1 + IVAITMONTO;
            END
        if (TARIFA = 2) then
            BEGIN
            SUMA2 = SUMA2 + TOTAL - IVAITMONTO;
            IVA2 = IVA2 + IVAITMONTO;
            END
        if (TARIFA = 3) then
            BEGIN
            SUMA3 = SUMA3 + TOTAL - IVAITMONTO;
            IVA3 = IVA3 + IVAITMONTO;
            END
        SUMAGR = SUMA1 + SUMA2 + SUMA3;
        SUBTOTALITEM = TOTAL - IVAITMONTO;
        if (IMPTOS = 'N') then
            TOTAL = TOTAL - IVAITMONTO;
        ELSE
           BEGIN
             PRNETOSINIVA = PRUNIT / (1 + ivaporc/100);
             SUBTOTALITEM = PRNETOSINIVA * :CANT;
           END
        totcajas = totcajas + cajas;
        SUSPEND;
        END
    END
END
^

SET TERM ; ^

GRANT SELECT ON REMISIONES_VENTA TO PROCEDURE IMPR_REMISION;
GRANT SELECT ON BODEGA TO PROCEDURE IMPR_REMISION;
GRANT SELECT ON VENDEDORES TO PROCEDURE IMPR_REMISION;
GRANT SELECT ON PUNTO_VENTA TO PROCEDURE IMPR_REMISION;
GRANT SELECT ON TERCEROS TO PROCEDURE IMPR_REMISION;
GRANT SELECT ON CLIENTES TO PROCEDURE IMPR_REMISION;
GRANT SELECT ON ZONAS TO PROCEDURE IMPR_REMISION;
GRANT SELECT ON CLIENTE_SUCURSALES TO PROCEDURE IMPR_REMISION;
GRANT EXECUTE ON PROCEDURE LEE_CONFIGURACION TO PROCEDURE IMPR_REMISION;
GRANT SELECT ON REMISIONES_VENTA_DETALLE TO PROCEDURE IMPR_REMISION;
GRANT SELECT ON ARTICULO TO PROCEDURE IMPR_REMISION;
GRANT SELECT ON BARRAS_ARTICULO TO PROCEDURE IMPR_REMISION;
GRANT SELECT ON GRUPO TO PROCEDURE IMPR_REMISION;
GRANT SELECT ON MARCAS TO PROCEDURE IMPR_REMISION;
GRANT SELECT ON SUBGRUPO TO PROCEDURE IMPR_REMISION;
GRANT SELECT ON LOTES TO PROCEDURE IMPR_REMISION;

/* 20080730 RUTEROS DE FACTURAS */
CREATE TABLE RUTAS_ENTREGA (
    RUTA_ID T_ID NOT NULL,
    RUTA_NOM T_CONCEPTO);
alter table RUTAS_ENTREGA
add constraint PK_RUTAS_ENTREGA
primary key (RUTA_ID);

CREATE TABLE RUTERO_FAC (
    TIDO_COD T_ID NOT NULL,
    RUTA_ID T_ID NOT NULL,
    RUTA_FECHA DATE NOT NULL,
    RUTA_IDDOC T_ID,
    RUTA_OK T_BOOLEANO);
alter table RUTERO_FAC
add constraint PK_RUTERO_FAC
primary key (TIDO_COD,RUTA_ID,RUTA_FECHA);

INSERT INTO CONFIGURACION (CONF_MODULO, CONF_CATEGORIA, CONF_PROPIEDAD, CONF_VALOR, CONF_POSIBLES, CONF_AYUDA) VALUES ('FACTURACION', 'DOCUMENTOS', 'NUMERO DE DIAS MAXIMO PARA ASIGNAR DOCUMENTO A UNA RUTA', '5', '1,2,3,4,5,15,30', 'Indique el número de días máximo a tener en cuenta al asignar rutas a los documentos a entregar');
commit work;

ALTER TABLE RUTERO_FAC
ADD RUTA_RAZON T_ID;
ALTER TABLE RUTERO_FAC
ADD RUTA_EXPLICA T_CONCEPTO;

CREATE TABLE RUTERO_RAZON (
    RAZO_ID T_ID NOT NULL,
    RAZO_NOM T_CONCEPTO);
alter table RUTERO_RAZON
add constraint PK_RUTERO_RAZON
primary key (RAZO_ID);


INSERT INTO RUTERO_RAZON (RAZO_ID, RAZO_NOM) VALUES (1, 'DIRECCION DEFICIENTE');
INSERT INTO RUTERO_RAZON (RAZO_ID, RAZO_NOM) VALUES (2, 'CLIENTE DESCONOCIDO');
INSERT INTO RUTERO_RAZON (RAZO_ID, RAZO_NOM) VALUES (3, 'CAMBIO DE DOMICILIO');
INSERT INTO RUTERO_RAZON (RAZO_ID, RAZO_NOM) VALUES (4, 'PEDIDO RECHAZADO');
INSERT INTO RUTERO_RAZON (RAZO_ID, RAZO_NOM) VALUES (5, 'ESTABLECIMIENTO CERRADO');
INSERT INTO RUTERO_RAZON (RAZO_ID, RAZO_NOM) VALUES (6, 'SIN CONDICIONES DE PAGO');
COMMIT WORK;

SET TERM ^ ;

CREATE OR ALTER PROCEDURE ASIGNA_RUTERO_FAC(
    TIPO INTEGER,
    FECFIN DATE,
    SUBEMPRESA INTEGER)
RETURNS (
    ID INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    FECDOC DATE,
    VENDCOD INTEGER,
    NIT VARCHAR(20),
    NOMTERCERO VARCHAR(60),
    PEDIDO VARCHAR(30),
    REMISION VARCHAR(30),
    CANT NUMERIC(18,4),
    CAJAS NUMERIC(18,4),
    TOTAL NUMERIC(18,2),
    OK CHAR(1),
    ENTREGADO CHAR(1),
    RAZON INTEGER,
    EXPLICA VARCHAR(60))
AS
declare variable FECINI DATE;
declare variable DIAS INTEGER;
BEGIN
OK = 'N';
ENTREGADO = 'N';
RAZON = 0;
EXPLICA = '';
EXECUTE PROCEDURE lee_configuracion('FACTURACION', 'DOCUMENTOS', 'NUMERO DE DIAS MAXIMO PARA ASIGNAR DOCUMENTO A UNA RUTA') returning_values (DIAS);
FECINI = FECFIN - DIAS;
/* DETERMINE LA TABLA A EXAMINAR */
if (TIPO=31) then
    BEGIN
    FOR SELECT FACT_ID, F.PREF_PRE, FACT_NUMERO, FACT_FECHA, F.VEND_COD, F.TERC_NIT, FACT_NOMCLIENTE, FACT_PEDIDO, FACT_REMISION, FACT_TOTAL
        FROM FACTURAS F, PREFIJOS PR
        WHERE FACT_FECHA >= :fecini AND FACT_FECHA <= :fecfin AND PR.PREF_PRE = F.PREF_PRE AND PR.TIDO_COD = 31 AND ((PR.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            AND FACT_ANULADO = 'N' AND NOT EXISTS (SELECT RUTA_ID FROM RUTERO_FAC WHERE TIDO_COD = 31 AND RUTA_IDDOC = F.fact_id)
        ORDER BY FACT_FECHA, FACT_ID
        INTO :ID, :PREF, :NUMERO, :FECDOC, :VENDCOD, :NIT, :NOMTERCERO, :PEDIDO, :REMISION, :TOTAL
        DO
        BEGIN
        SELECT SUM(FADE_CANT), SUM(FADE_CAJAS) FROM FACTURAS_DETALLE WHERE FACT_ID = :ID INTO :CANT, :CAJAS;
        SUSPEND;
        END
    END
if (TIPO=32) then
    BEGIN
    FOR SELECT REVT_ID, R.PREF_PRE, REVT_NUMERO, REVT_FECHA, R.VEND_COD, R.TERC_NIT, REVT_NOMTERC, REVT_PEDIDO, REVT_FACTURA, REVT_TOTAL
        FROM REMISIONES_VENTA R, PREFIJOS PR
        WHERE REVT_FECHA >= :fecini AND REVT_FECHA <= :fecfin AND PR.PREF_PRE = R.PREF_PRE AND PR.TIDO_COD = 32 AND ((PR.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
        AND REVT_ANULADO = 'N' AND NOT EXISTS (SELECT RUTA_ID FROM RUTERO_FAC WHERE TIDO_COD = 32 AND RUTA_IDDOC = R.revt_id)
        ORDER BY REVT_FECHA, REVT_ID
        INTO :ID, :PREF, :NUMERO, :FECDOC, :VENDCOD, :NIT, :NOMTERCERO, :PEDIDO, :REMISION, :TOTAL
        DO
        BEGIN
        SELECT SUM(RVDE_CANT), SUM(RVDE_CAJAS) FROM REMISIONES_VENTA_DETALLE WHERE REVT_ID = :ID INTO :CANT, :CAJAS;
        SUSPEND;
        END
    END
END
^

SET TERM ; ^

GRANT EXECUTE ON PROCEDURE LEE_CONFIGURACION TO PROCEDURE ASIGNA_RUTERO_FAC;
GRANT SELECT ON FACTURAS TO PROCEDURE ASIGNA_RUTERO_FAC;
GRANT SELECT ON PREFIJOS TO PROCEDURE ASIGNA_RUTERO_FAC;
GRANT SELECT ON RUTERO_FAC TO PROCEDURE ASIGNA_RUTERO_FAC;
GRANT SELECT ON FACTURAS_DETALLE TO PROCEDURE ASIGNA_RUTERO_FAC;
GRANT SELECT ON REMISIONES_VENTA TO PROCEDURE ASIGNA_RUTERO_FAC;
GRANT SELECT ON REMISIONES_VENTA_DETALLE TO PROCEDURE ASIGNA_RUTERO_FAC;
GRANT EXECUTE ON PROCEDURE asigna_rutero_fac TO PUBLIC;

SET TERM ^ ;

CREATE OR ALTER PROCEDURE CONFIRMA_RUTERO_FAC(
    TIPO INTEGER,
    RUTA INTEGER,
    FECHA DATE)
RETURNS (
    ID INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    FECDOC DATE,
    VENDCOD INTEGER,
    NIT VARCHAR(20),
    NOMTERCERO VARCHAR(60),
    PEDIDO VARCHAR(30),
    REMISION VARCHAR(30),
    CANT NUMERIC(18,4),
    CAJAS NUMERIC(18,4),
    TOTAL NUMERIC(18,2),
    OK CHAR(1),
    ENTREGADO CHAR(1),
    RAZON INTEGER,
    EXPLICA VARCHAR(60))
AS
BEGIN
ENTREGADO = 'N';
RAZON = 0;
EXPLICA = '';
FOR SELECT FACT_ID, F.PREF_PRE, FACT_NUMERO, FACT_FECHA, F.VEND_COD, F.TERC_NIT, FACT_NOMCLIENTE, FACT_PEDIDO, FACT_REMISION, FACT_TOTAL
    FROM FACTURAS F, rutero_fac R WHERE R.ruta_fecha = :FECHA AND R.ruta_id = :RUTA AND R.tido_cod = :tipo AND R.ruta_iddoc = F.fact_id AND FACT_ANULADO = 'N'
    ORDER BY F.pref_pre, FACT_NUMERO
    INTO :ID, :PREF, :NUMERO, :FECDOC, :VENDCOD, :NIT, :NOMTERCERO, :PEDIDO, :REMISION, :TOTAL
    DO
    BEGIN
    SELECT SUM(FADE_CANT), SUM(FADE_CAJAS) FROM FACTURAS_DETALLE WHERE FACT_ID = :ID INTO :CANT, :CAJAS;
    SUSPEND;
    END
END
^

SET TERM ; ^

GRANT SELECT ON FACTURAS TO PROCEDURE CONFIRMA_RUTERO_FAC;
GRANT SELECT ON RUTERO_FAC TO PROCEDURE CONFIRMA_RUTERO_FAC;
GRANT SELECT ON FACTURAS_DETALLE TO PROCEDURE CONFIRMA_RUTERO_FAC;
GRANT EXECUTE ON PROCEDURE confirma_rutero_fac TO PUBLIC;

ALTER TABLE RUTERO_FAC DROP CONSTRAINT PK_RUTERO_FAC;
update RDB$RELATION_FIELDS set
RDB$NULL_FLAG = 1
where (RDB$FIELD_NAME = 'RUTA_IDDOC') and
(RDB$RELATION_NAME = 'RUTERO_FAC');

alter table RUTERO_FAC
add constraint PK_RUTERO_FAC
primary key (TIDO_COD,RUTA_ID,RUTA_FECHA,RUTA_IDDOC);


SET TERM ^ ;

CREATE OR ALTER PROCEDURE CONFIRMA_RUTERO_FAC(
    TIPO INTEGER,
    RUTA INTEGER,
    FECHA DATE)
RETURNS (
    ID INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    FECDOC DATE,
    VENDCOD INTEGER,
    NIT VARCHAR(20),
    NOMTERCERO VARCHAR(60),
    PEDIDO VARCHAR(30),
    REMISION VARCHAR(30),
    CANT NUMERIC(18,4),
    CAJAS NUMERIC(18,4),
    TOTAL NUMERIC(18,2),
    OK CHAR(1),
    ENTREGADO CHAR(1),
    RAZON INTEGER,
    EXPLICA VARCHAR(60))
AS
BEGIN
OK = 'S';
FOR SELECT FACT_ID, F.PREF_PRE, FACT_NUMERO, FACT_FECHA, F.VEND_COD, F.TERC_NIT, FACT_NOMCLIENTE, FACT_PEDIDO, FACT_REMISION, FACT_TOTAL, R.ruta_ok, R.ruta_razon, R.ruta_explica
    FROM FACTURAS F, rutero_fac R WHERE R.ruta_fecha = :FECHA AND R.ruta_id = :RUTA AND R.tido_cod = :tipo AND R.ruta_iddoc = F.fact_id AND FACT_ANULADO = 'N'
    ORDER BY F.pref_pre, FACT_NUMERO
    INTO :ID, :PREF, :NUMERO, :FECDOC, :VENDCOD, :NIT, :NOMTERCERO, :PEDIDO, :REMISION, :TOTAL, :entregado, :razon, :explica
    DO
    BEGIN
    SELECT SUM(FADE_CANT), SUM(FADE_CAJAS) FROM FACTURAS_DETALLE WHERE FACT_ID = :ID INTO :CANT, :CAJAS;
    SUSPEND;
    END
END
^

SET TERM ; ^

GRANT SELECT ON FACTURAS TO PROCEDURE CONFIRMA_RUTERO_FAC;
GRANT SELECT ON RUTERO_FAC TO PROCEDURE CONFIRMA_RUTERO_FAC;
GRANT SELECT ON FACTURAS_DETALLE TO PROCEDURE CONFIRMA_RUTERO_FAC;


/* 20080730B CONTABILIZACION DE ACTIVOS */
CREATE TABLE SALDOS_ACTIVO (
    ACFJ_COD T_COD_ARTICULO NOT NULL,
    CUEN_COD T_CTA_CONTABLE NOT NULL,
    SAAC_FECHA CHAR(8) NOT NULL,
    SAAC_SALDO T_MONTO,
    SAAC_DEBITOS T_MONTO,
    SAAC_CREDITOS T_MONTO);
alter table SALDOS_ACTIVO
add constraint PK_SALDOS_ACTIVO
primary key (ACFJ_COD,CUEN_COD,SAAC_FECHA);

CREATE EXCEPTION FALTA_ACTIVO 'Debe indicar el código del activo a mover';
SET TERM ^ ;

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

SET TERM ; ^

GRANT UPDATE,REFERENCES ON COMPROBANTE_DETALLE TO TRIGGER COMPROBANTE_DETALLE_BI;
GRANT SELECT ON COMPROBANTE_ENCABEZADO TO TRIGGER COMPROBANTE_DETALLE_BI;
GRANT EXECUTE ON PROCEDURE VALIDE_CUENTA TO TRIGGER COMPROBANTE_DETALLE_BI;
GRANT EXECUTE ON PROCEDURE LEE_CONFIGURACION TO TRIGGER COMPROBANTE_DETALLE_BI;
GRANT SELECT ON CUENTAS TO TRIGGER COMPROBANTE_DETALLE_BI;
GRANT EXECUTE ON PROCEDURE EXISTE_TERCERO TO TRIGGER COMPROBANTE_DETALLE_BI;
GRANT EXECUTE ON PROCEDURE EXISTE_CENTRO TO TRIGGER COMPROBANTE_DETALLE_BI;

SET TERM ^ ;

CREATE OR ALTER PROCEDURE SALDO_ACTIVO(
    CUENTA VARCHAR(20),
    ACTIVO VARCHAR(15),
    FECHA CHAR(8))
RETURNS (
    SALDO NUMERIC(18,2))
AS
DECLARE VARIABLE FEC CHAR(8);
BEGIN
/* Busca la fecha del último movimiento de la cuenta-ARTICULO antes de la fecha */
SELECT  MAX(SAAC_FECHA) FROM saldos_activo
  WHERE (CUEN_COD = :CUENTA) AND (ACFJ_COD = :activo) AND (SAAC_FECHA <= :FECHA) INTO :FEC;
IF (FEC IS NULL) THEN
  SALDO = 0;
ELSE
  /* Con la fecha máxima calcule el nuevo saldo */
  SELECT MAX(SAAC_SALDO+SAAC_DEBITOS-SAAC_CREDITOS) FROM saldos_activo
    WHERE (CUEN_COD = :CUENTA) AND (ACFJ_COD = :activo) AND (SAAC_FECHA = :FEC) INTO :SALDO;
SUSPEND;
END
^

SET TERM ; ^

GRANT SELECT ON SALDOS_ACTIVO TO PROCEDURE SALDO_ACTIVO;

SET TERM ^ ;

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

SET TERM ; ^

GRANT SELECT,INSERT,UPDATE ON SALDOS_ACTIVO TO PROCEDURE ACTUALICE_SALDO_ACTIVO;
GRANT EXECUTE ON PROCEDURE SALDO_ACTIVO TO PROCEDURE ACTUALICE_SALDO_ACTIVO;

SET TERM ^ ;

CREATE OR ALTER TRIGGER COMPROBANTE_DETALLE_AI FOR COMPROBANTE_DETALLE
ACTIVE AFTER INSERT POSITION 0
AS
DECLARE VARIABLE FECHA CHAR(8);
declare variable TIPO CHAR(1);
BEGIN
SELECT ENCO_FECHA FROM COMPROBANTE_ENCABEZADO WHERE ENCO_CONSEC = NEW.ENCO_CONSEC INTO :FECHA;
/* ACTUALICE LOS SALDOS */
EXECUTE PROCEDURE ACTUALICE_SALDO_CUENTA(NEW.CUEN_COD, FECHA, NEW.CODE_DEBITO, NEW.CODE_CREDITO);
EXECUTE PROCEDURE ACTUALICE_SALDO_TERCERO(NEW.CUEN_COD, NEW.TERC_NIT, FECHA, NEW.CODE_DEBITO, NEW.CODE_CREDITO);
if (NEW.ARTI_COD IS NOT NULL) then
  BEGIN
  SELECT CUEN_TIPO FROM CUENTAS WHERE CUEN_COD = NEW.CUEN_COD INTO :TIPO;
  if (TIPO = 'I') then
    EXECUTE PROCEDURE ACTUALICE_SALDO_ARTICULO(NEW.CUEN_COD, NEW.ARTI_COD, FECHA, NEW.CODE_DEBITO, NEW.CODE_CREDITO);
  else
    if (TIPO = 'A') then
      EXECUTE PROCEDURE actualice_saldo_activo(NEW.CUEN_COD, NEW.ARTI_COD, FECHA, NEW.CODE_DEBITO, NEW.CODE_CREDITO);
  END
EXECUTE PROCEDURE ACTUALICE_SALDO_CENTRO(NEW.CUEN_COD, NEW.PROY_COD, NEW.CENT_COD, FECHA, NEW.CODE_DEBITO, NEW.CODE_CREDITO);
EXECUTE PROCEDURE ACTUALICE_SALDO_CENTRO_TERCERO(NEW.CUEN_COD, NEW.PROY_COD, NEW.CENT_COD, NEW.TERC_NIT, FECHA, NEW.CODE_DEBITO, NEW.CODE_CREDITO);
END
^

SET TERM ; ^

GRANT UPDATE,REFERENCES ON COMPROBANTE_DETALLE TO TRIGGER COMPROBANTE_DETALLE_AI;
GRANT SELECT ON COMPROBANTE_ENCABEZADO TO TRIGGER COMPROBANTE_DETALLE_AI;
GRANT EXECUTE ON PROCEDURE ACTUALICE_SALDO_CUENTA TO TRIGGER COMPROBANTE_DETALLE_AI;
GRANT EXECUTE ON PROCEDURE ACTUALICE_SALDO_TERCERO TO TRIGGER COMPROBANTE_DETALLE_AI;
GRANT SELECT ON CUENTAS TO TRIGGER COMPROBANTE_DETALLE_AI;
GRANT EXECUTE ON PROCEDURE ACTUALICE_SALDO_ARTICULO TO TRIGGER COMPROBANTE_DETALLE_AI;
GRANT EXECUTE ON PROCEDURE ACTUALICE_SALDO_ACTIVO TO TRIGGER COMPROBANTE_DETALLE_AI;
GRANT EXECUTE ON PROCEDURE ACTUALICE_SALDO_CENTRO TO TRIGGER COMPROBANTE_DETALLE_AI;
GRANT EXECUTE ON PROCEDURE ACTUALICE_SALDO_CENTRO_TERCERO TO TRIGGER COMPROBANTE_DETALLE_AI;

SET TERM ^ ;

CREATE OR ALTER TRIGGER COMPROBANTE_DETALLE_AU FOR COMPROBANTE_DETALLE
ACTIVE AFTER UPDATE POSITION 0
AS
DECLARE VARIABLE FECHA CHAR(8);
DECLARE VARIABLE DIF_DB NUMERIC(15,2);
DECLARE VARIABLE DIF_CR NUMERIC(15,2);
declare variable TIPO CHAR(1);
BEGIN
/* DESHAGA LO VIEJO */
SELECT ENCO_FECHA FROM COMPROBANTE_ENCABEZADO WHERE ENCO_CONSEC = NEW.ENCO_CONSEC INTO :FECHA;
DIF_DB = - OLD.CODE_DEBITO;
DIF_CR = - OLD.CODE_CREDITO;
EXECUTE PROCEDURE ACTUALICE_SALDO_CENTRO_TERCERO(OLD.CUEN_COD, OLD.PROY_COD, OLD.CENT_COD, OLD.TERC_NIT, FECHA, DIF_DB, DIF_CR);
EXECUTE PROCEDURE ACTUALICE_SALDO_CENTRO(OLD.CUEN_COD, OLD.PROY_COD, OLD.CENT_COD, FECHA, DIF_DB, DIF_CR);
EXECUTE PROCEDURE ACTUALICE_SALDO_TERCERO(OLD.CUEN_COD, OLD.TERC_NIT, FECHA, DIF_DB, DIF_CR);
EXECUTE PROCEDURE ACTUALICE_SALDO_CUENTA(OLD.CUEN_COD, FECHA, DIF_DB, DIF_CR);
if (OLD.ARTI_COD IS NOT NULL) then
  BEGIN
  SELECT CUEN_TIPO FROM CUENTAS WHERE CUEN_COD = NEW.CUEN_COD INTO :TIPO;
  if (TIPO = 'I') then
    EXECUTE PROCEDURE ACTUALICE_SALDO_ARTICULO(OLD.CUEN_COD, OLD.ARTI_COD, FECHA, DIF_DB, DIF_CR);
  ELSE
    EXECUTE PROCEDURE actualice_saldo_activo(OLD.CUEN_COD, OLD.ARTI_COD, FECHA, DIF_DB, DIF_CR);
  END
/* GRABE LOS NUEVOS */
EXECUTE PROCEDURE ACTUALICE_SALDO_CUENTA(NEW.CUEN_COD, FECHA, NEW.CODE_DEBITO, NEW.CODE_CREDITO);
EXECUTE PROCEDURE ACTUALICE_SALDO_TERCERO(NEW.CUEN_COD, NEW.TERC_NIT, FECHA, NEW.CODE_DEBITO, NEW.CODE_CREDITO);
EXECUTE PROCEDURE ACTUALICE_SALDO_CENTRO(NEW.CUEN_COD, NEW.PROY_COD, NEW.CENT_COD, FECHA, NEW.CODE_DEBITO, NEW.CODE_CREDITO);
EXECUTE PROCEDURE ACTUALICE_SALDO_CENTRO_TERCERO(NEW.CUEN_COD, NEW.PROY_COD, NEW.CENT_COD, NEW.TERC_NIT, FECHA, NEW.CODE_DEBITO, NEW.CODE_CREDITO);
if (NEW.ARTI_COD IS NOT NULL) then
  BEGIN
  SELECT CUEN_TIPO FROM CUENTAS WHERE CUEN_COD = NEW.CUEN_COD INTO :TIPO;
  if (TIPO = 'I') then
    EXECUTE PROCEDURE ACTUALICE_SALDO_ARTICULO(NEW.CUEN_COD, NEW.ARTI_COD, FECHA, NEW.code_debito, NEW.code_credito);
  ELSE
    EXECUTE PROCEDURE actualice_saldo_activo(NEW.CUEN_COD, NEW.ARTI_COD, FECHA, NEW.code_debito, NEW.code_credito);
  END
END
^

SET TERM ; ^

GRANT UPDATE,REFERENCES ON COMPROBANTE_DETALLE TO TRIGGER COMPROBANTE_DETALLE_AU;
GRANT SELECT ON COMPROBANTE_ENCABEZADO TO TRIGGER COMPROBANTE_DETALLE_AU;
GRANT EXECUTE ON PROCEDURE ACTUALICE_SALDO_CENTRO_TERCERO TO TRIGGER COMPROBANTE_DETALLE_AU;
GRANT EXECUTE ON PROCEDURE ACTUALICE_SALDO_CENTRO TO TRIGGER COMPROBANTE_DETALLE_AU;
GRANT EXECUTE ON PROCEDURE ACTUALICE_SALDO_TERCERO TO TRIGGER COMPROBANTE_DETALLE_AU;
GRANT EXECUTE ON PROCEDURE ACTUALICE_SALDO_CUENTA TO TRIGGER COMPROBANTE_DETALLE_AU;
GRANT SELECT ON CUENTAS TO TRIGGER COMPROBANTE_DETALLE_AU;
GRANT EXECUTE ON PROCEDURE ACTUALICE_SALDO_ARTICULO TO TRIGGER COMPROBANTE_DETALLE_AU;
GRANT EXECUTE ON PROCEDURE ACTUALICE_SALDO_ACTIVO TO TRIGGER COMPROBANTE_DETALLE_AU;

SET TERM ^ ;

CREATE OR ALTER TRIGGER COMPROBANTE_DETALLE_AD FOR COMPROBANTE_DETALLE
ACTIVE AFTER DELETE POSITION 0
AS
DECLARE VARIABLE FECHA CHAR(8);
DECLARE VARIABLE DIF_DB NUMERIC(15,2);
DECLARE VARIABLE DIF_CR NUMERIC(15,2);
declare variable TIPO CHAR(1);
BEGIN
/* DESHAGA LO VIEJO */
SELECT ENCO_FECHA FROM COMPROBANTE_ENCABEZADO WHERE ENCO_CONSEC = OLD.ENCO_CONSEC INTO :FECHA;
DIF_DB = - OLD.CODE_DEBITO;
DIF_CR = - OLD.CODE_CREDITO;
EXECUTE PROCEDURE ACTUALICE_SALDO_CENTRO_TERCERO(OLD.CUEN_COD, OLD.PROY_COD, OLD.CENT_COD, OLD.TERC_NIT, FECHA, DIF_DB, DIF_CR);
EXECUTE PROCEDURE ACTUALICE_SALDO_CENTRO(OLD.CUEN_COD, OLD.PROY_COD, OLD.CENT_COD, FECHA, DIF_DB, DIF_CR);
EXECUTE PROCEDURE ACTUALICE_SALDO_TERCERO(OLD.CUEN_COD, OLD.TERC_NIT, FECHA, DIF_DB, DIF_CR);
EXECUTE PROCEDURE ACTUALICE_SALDO_CUENTA(OLD.CUEN_COD, FECHA, DIF_DB, DIF_CR);
if (OLD.ARTI_COD IS NOT NULL) then
  BEGIN
  SELECT CUEN_TIPO FROM CUENTAS WHERE CUEN_COD = OLD.CUEN_COD INTO :TIPO;
  if (TIPO = 'I') then
    EXECUTE PROCEDURE ACTUALICE_SALDO_ARTICULO(OLD.CUEN_COD, OLD.ARTI_COD, FECHA, DIF_DB, DIF_CR);
  ELSE
    EXECUTE PROCEDURE actualice_saldo_activo(OLD.CUEN_COD, OLD.ARTI_COD, FECHA, DIF_DB, DIF_CR);
  END
END
^

SET TERM ; ^

GRANT UPDATE,REFERENCES ON COMPROBANTE_DETALLE TO TRIGGER COMPROBANTE_DETALLE_AD;
GRANT SELECT ON COMPROBANTE_ENCABEZADO TO TRIGGER COMPROBANTE_DETALLE_AD;
GRANT EXECUTE ON PROCEDURE ACTUALICE_SALDO_CENTRO_TERCERO TO TRIGGER COMPROBANTE_DETALLE_AD;
GRANT EXECUTE ON PROCEDURE ACTUALICE_SALDO_CENTRO TO TRIGGER COMPROBANTE_DETALLE_AD;
GRANT EXECUTE ON PROCEDURE ACTUALICE_SALDO_TERCERO TO TRIGGER COMPROBANTE_DETALLE_AD;
GRANT EXECUTE ON PROCEDURE ACTUALICE_SALDO_CUENTA TO TRIGGER COMPROBANTE_DETALLE_AD;
GRANT SELECT ON CUENTAS TO TRIGGER COMPROBANTE_DETALLE_AD;
GRANT EXECUTE ON PROCEDURE ACTUALICE_SALDO_ARTICULO TO TRIGGER COMPROBANTE_DETALLE_AD;
GRANT EXECUTE ON PROCEDURE ACTUALICE_SALDO_ACTIVO TO TRIGGER COMPROBANTE_DETALLE_AD;

SET TERM ^ ;

CREATE OR ALTER TRIGGER TI_COMPROBANTE_DETALLE FOR COMPROBANTE_DETALLE
ACTIVE BEFORE INSERT POSITION 0
AS
DECLARE VARIABLE NUMROWS INTEGER;
BEGIN
    /*  PARENT 'CUENTAS' MUST EXIST WHEN INSERTING A CHILD IN 'COMPROBANTE_DETALLE'  */
    IF (NEW.CUEN_COD IS NOT NULL) THEN
    BEGIN
       SELECT COUNT(*)
       FROM   CUENTAS
       WHERE  CUENTAS.CUEN_COD = NEW.CUEN_COD
       INTO   :NUMROWS;
       IF (NUMROWS = 0) THEN
        BEGIN
        EXCEPTION CUENTA_NO_EXISTE 'La cuenta ' || new.cuen_cod || ' no existe.';
        END
    END
    /*  PARENT 'COMPROBANTE_ENCABEZADO' MUST EXIST WHEN INSERTING A CHILD IN 'COMPROBANTE_DETALLE'  */
    IF (NEW.ENCO_CONSEC IS NOT NULL) THEN
    BEGIN
       SELECT COUNT(*)
       FROM   COMPROBANTE_ENCABEZADO
       WHERE  COMPROBANTE_ENCABEZADO.ENCO_CONSEC = NEW.ENCO_CONSEC
       INTO   :NUMROWS;
       IF (NUMROWS = 0) THEN
       BEGIN
          EXCEPTION COMPROBAENCABEZA_NO_EXISTE;
       END
    END
    IF (NEW.TERC_NIT IS NOT NULL) THEN
    BEGIN
       SELECT COUNT(*)
       FROM   TERCEROS
       WHERE  TERCEROS.TERC_NIT = NEW.TERC_NIT
       INTO   :NUMROWS;
       IF (NUMROWS = 0) THEN
       BEGIN
          EXCEPTION tercero_no_existe 'El NIT ' || new.terc_nit || ' no existe.';
       END
    END
    IF (NEW.PROY_COD IS NOT NULL) THEN
    BEGIN
       SELECT COUNT(*)
       FROM   PROYECTOS
       WHERE  PROYECTOS.PROY_COD = NEW.PROY_COD
       INTO   :NUMROWS;
       IF (NUMROWS = 0) THEN
       BEGIN
          EXCEPTION proyecto_no_existe 'El proyecto ' || new.proy_cod || ' no existe.';
       END
    END
    IF (NEW.CENT_COD IS NOT NULL) THEN
    BEGIN
       SELECT COUNT(*)
       FROM   CENTROS
       WHERE  CENTROS.CENT_COD = NEW.CENT_COD AND CENTROS.PROY_COD = NEW.PROY_COD
       INTO   :NUMROWS;
       IF (NUMROWS = 0) THEN
       BEGIN
          EXCEPTION centro_no_existe 'El centro ' || new.proy_cod || '-' || new.cent_cod || ' no existe.';
       END
    END
END
^

SET TERM ; ^

GRANT UPDATE,REFERENCES ON COMPROBANTE_DETALLE TO TRIGGER TI_COMPROBANTE_DETALLE;
GRANT SELECT ON CUENTAS TO TRIGGER TI_COMPROBANTE_DETALLE;
GRANT SELECT ON COMPROBANTE_ENCABEZADO TO TRIGGER TI_COMPROBANTE_DETALLE;
GRANT SELECT ON TERCEROS TO TRIGGER TI_COMPROBANTE_DETALLE;
GRANT SELECT ON PROYECTOS TO TRIGGER TI_COMPROBANTE_DETALLE;
GRANT SELECT ON CENTROS TO TRIGGER TI_COMPROBANTE_DETALLE;

SET TERM ^ ;

CREATE OR ALTER PROCEDURE IMPR_COMPROBANTE(
    ID INTEGER)
RETURNS (
    TIPO VARCHAR(3),
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA CHAR(8),
    CONCEPTO VARCHAR(60),
    REFER VARCHAR(8),
    NOMTIPO VARCHAR(60),
    ITEM INTEGER,
    CUENTA VARCHAR(20),
    NOMCUENTA VARCHAR(60),
    NIT VARCHAR(20),
    NOMTERCERO VARCHAR(60),
    PROYECTO VARCHAR(4),
    CENTRO VARCHAR(4),
    NOMPROY VARCHAR(60),
    NOMCENT VARCHAR(60),
    ITCONCEPTO VARCHAR(60),
    ITREFER VARCHAR(8),
    ARTICULO VARCHAR(15),
    NOMARTIC VARCHAR(60),
    DEBITO NUMERIC(18,2),
    CREDITO NUMERIC(18,2),
    BASE NUMERIC(18,2),
    PORC NUMERIC(9,4),
    NUMDOC VARCHAR(8),
    NUMAPLICA VARCHAR(8),
    VENCE CHAR(8),
    TIPODOC VARCHAR(8),
    TIPODOCAP VARCHAR(8))
AS
declare variable ITEMS INTEGER;
declare variable MAX_COMPROBA INTEGER;
declare variable TIPOCUEN CHAR(1);
BEGIN
  /*  */
  SELECT E.TICO_COD, PRCO_PREF, ENCO_NUMERO, ENCO_FECHA, ENCO_CONCEPTO, ENCO_REFER, TICO_NOM
    FROM COMPROBANTE_ENCABEZADO E, TIPO_COMPROBANTE T WHERE E.TICO_COD = T.TICO_COD AND E.ENCO_CONSEC = :ID into
    :TIPO, :PREF, :NUMERO, :FECHA, :CONCEPTO, :REFER, NOMTIPO;
  FOR
    SELECT CODE_ITEM, D.CUEN_COD, C.CUEN_NOM, D.TERC_NIT, TERC_NOM, D.PROY_COD, D.CENT_COD, PROY_NOM, CENT_NOM, CODE_CONCEPTO, CODE_REFER, D.ARTI_COD, CODE_DEBITO, CODE_CREDITO, CODE_BASE, CODE_PORC, CNDE_DOCNUMERO, CNDE_DOCAPLICA, DOCO_VENCE, CODE_TIPONUE, CODE_TIPOAPL
    FROM COMPROBANTE_DETALLE D, CUENTAS C, TERCEROS T, PROYECTOS P, CENTROS CE
    WHERE D.CUEN_COD = C.CUEN_COD AND D.TERC_NIT = T.TERC_NIT AND D.PROY_COD = P.PROY_COD AND D.CENT_COD = CE.CENT_COD AND P.PROY_COD = CE.PROY_COD AND D.ENCO_CONSEC = :ID
    ORDER BY CODE_ITEM
    INTO
    :ITEM, :CUENTA, :NOMCUENTA, :NIT, :NOMTERCERO, :PROYECTO, :CENTRO, :NOMPROY, :NOMCENT, :ITCONCEPTO, :ITREFER, :ARTICULO, :DEBITO, :CREDITO, :BASE, :PORC, :NUMDOC, :NUMAPLICA, :VENCE, :TIPODOC, :TIPODOCAP
    DO
    begin
    SELECT CUEN_TIPO FROM CUENTAS WHERE CUEN_COD = :cuenta INTO :tipocuen;
    if (tipocuen = 'I') then
        select ARTI_DES from ARTICULO where ARTI_COD = :articulo into :NOMARTIC;
    ELSE
        if (tipocuen = 'A') then
            select ACFJ_DESC from activos_fijos where ACFJ_COD = :articulo into :NOMARTIC;
    select TIDO_NOMCORTO from TIPO_DOCUMENTO where TIDO_COD = :tipodoc INTO :tipodoc;
    select TIDO_NOMCORTO from TIPO_DOCUMENTO where TIDO_COD = :tipodocap INTO :tipodocap;
    SUSPEND;
    end
  SELECT COUNT(*) FROM COMPROBANTE_DETALLE WHERE ENCO_CONSEC = :ID INTO :ITEMS;
  EXECUTE PROCEDURE LEE_CONFIGURACION('CONTABILIDAD','GENERAL','NUMERO DE ITEMS EN IMPRESION DE COMPROBANTES') returning_values :MAX_COMPROBA;
  ITEM = NULL;
  CUENTA = NULL;
  NOMCUENTA = NULL;
  NIT = NULL;
  NOMTERCERO = NULL;
  PROYECTO = NULL;
  CENTRO = NULL;
  NOMPROY = NULL;
  NOMCENT = NULL;
  ITCONCEPTO = NULL;
  ITREFER = NULL;
  ARTICULO = NULL;
  NOMARTIC = NULL;
  DEBITO = NULL;
  CREDITO = NULL;
  BASE = NULL;
  PORC = NULL;
  NUMDOC = NULL;
  NUMAPLICA = NULL;
  VENCE = NULL;
  TIPODOC = NULL;
  TIPODOCAP = NULL;
  WHILE (ITEMS < MAX_COMPROBA) DO
    BEGIN
    ITEMS = ITEMS + 1;
    SUSPEND;
    END
END
^

SET TERM ; ^

GRANT SELECT ON COMPROBANTE_ENCABEZADO TO PROCEDURE IMPR_COMPROBANTE;
GRANT SELECT ON TIPO_COMPROBANTE TO PROCEDURE IMPR_COMPROBANTE;
GRANT SELECT ON COMPROBANTE_DETALLE TO PROCEDURE IMPR_COMPROBANTE;
GRANT SELECT ON CUENTAS TO PROCEDURE IMPR_COMPROBANTE;
GRANT SELECT ON TERCEROS TO PROCEDURE IMPR_COMPROBANTE;
GRANT SELECT ON PROYECTOS TO PROCEDURE IMPR_COMPROBANTE;
GRANT SELECT ON CENTROS TO PROCEDURE IMPR_COMPROBANTE;
GRANT SELECT ON ARTICULO TO PROCEDURE IMPR_COMPROBANTE;
GRANT SELECT ON ACTIVOS_FIJOS TO PROCEDURE IMPR_COMPROBANTE;
GRANT SELECT ON TIPO_DOCUMENTO TO PROCEDURE IMPR_COMPROBANTE;
GRANT EXECUTE ON PROCEDURE LEE_CONFIGURACION TO PROCEDURE IMPR_COMPROBANTE;

SET TERM ^ ;

CREATE OR ALTER PROCEDURE COMPROBANTES_ACTIVO(
    ACTIVO VARCHAR(20))
RETURNS (
    ID INTEGER,
    TIPO VARCHAR(3),
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA CHAR(8),
    CONCEPTO VARCHAR(60),
    REF VARCHAR(20),
    TIPOREF INTEGER)
AS
BEGIN
  /* TRAE LOS COMPROBANTES SEGUN EL RANGO DADO */
    FOR SELECT MAX(E.ENCO_CONSEC), MAX(TICO_COD), MAX(PRCO_PREF), MAX(ENCO_NUMERO), MAX(ENCO_FECHA), MAX(ENCO_CONCEPTO), MAX(ENCO_REFER), MAX(ENCO_TIPOREF)
        FROM COMPROBANTE_ENCABEZADO E, COMPROBANTE_DETALLE D, CUENTAS C
        WHERE E.ENCO_CONSEC = D.ENCO_CONSEC AND ARTI_COD = :activo AND C.cuen_cod = D.cuen_cod AND C.cuen_tipo = 'A'
        GROUP BY ENCO_FECHA, TICO_COD, E.ENCO_CONSEC
        ORDER BY ENCO_FECHA, TICO_COD, E.ENCO_CONSEC
        INTO :ID, :TIPO, :PREFIJO, :NUMERO, :FECHA, :CONCEPTO, :REF, :TIPOREF
        DO
            SUSPEND;
END
^

SET TERM ; ^

GRANT SELECT ON COMPROBANTE_ENCABEZADO TO PROCEDURE COMPROBANTES_ACTIVO;
GRANT SELECT ON COMPROBANTE_DETALLE TO PROCEDURE COMPROBANTES_ACTIVO;
GRANT SELECT ON CUENTAS TO PROCEDURE COMPROBANTES_ACTIVO;
grant EXECUTE on PROCEDURE comprobantes_activo to PUBLIC;

grant ALL ON RUTAS_ENTREGA TO PUBLIC;
grant ALL ON RUTERO_FAC  TO PUBLIC;

/* 20080731 */

INSERT INTO IMPORTACION_INVENTARIO (IMIN_TIPO, IMIN_DATO, IMIN_COLUMNA, IMIN_ANCHO) VALUES (10, 'TERC_TIPOID', 15, 1);
INSERT INTO IMPORTACION_INVENTARIO (IMIN_TIPO, IMIN_DATO, IMIN_COLUMNA, IMIN_ANCHO) VALUES (10, 'TERC_APELLIDO1', 16, 60);
INSERT INTO IMPORTACION_INVENTARIO (IMIN_TIPO, IMIN_DATO, IMIN_COLUMNA, IMIN_ANCHO) VALUES (10, 'TERC_APELLIDO2', 17, 60);
INSERT INTO IMPORTACION_INVENTARIO (IMIN_TIPO, IMIN_DATO, IMIN_COLUMNA, IMIN_ANCHO) VALUES (10, 'TERC_NOMBRE1', 18, 60);
INSERT INTO IMPORTACION_INVENTARIO (IMIN_TIPO, IMIN_DATO, IMIN_COLUMNA, IMIN_ANCHO) VALUES (10, 'TERC_NOMBRE2', 19, 60);

INSERT INTO IMPORTACION_INVENTARIO (IMIN_TIPO, IMIN_DATO, IMIN_COLUMNA, IMIN_ANCHO) VALUES (14, 'TERC_TIPOID', 11, 1);
INSERT INTO IMPORTACION_INVENTARIO (IMIN_TIPO, IMIN_DATO, IMIN_COLUMNA, IMIN_ANCHO) VALUES (14, 'TERC_APELLIDO1', 12, 60);
INSERT INTO IMPORTACION_INVENTARIO (IMIN_TIPO, IMIN_DATO, IMIN_COLUMNA, IMIN_ANCHO) VALUES (14, 'TERC_APELLIDO2', 13, 60);
INSERT INTO IMPORTACION_INVENTARIO (IMIN_TIPO, IMIN_DATO, IMIN_COLUMNA, IMIN_ANCHO) VALUES (14, 'TERC_NOMBRE1', 14, 60);
INSERT INTO IMPORTACION_INVENTARIO (IMIN_TIPO, IMIN_DATO, IMIN_COLUMNA, IMIN_ANCHO) VALUES (14, 'TERC_NOMBRE2', 15, 60);
COMMIT WORK;

/* 20080731B DISCRIMINAR TARIFAS DE IVA DE ENSAMBLES AL FACTURAR */

INSERT INTO CONFIGURACION (CONF_MODULO, CONF_CATEGORIA, CONF_PROPIEDAD, CONF_VALOR, CONF_POSIBLES, CONF_AYUDA) VALUES ('FACTURACION', 'DOCUMENTOS', 'FACTURAR ENSAMBLES DISCRIMINANDO TARIFAS DE IVA DE LOS COMPONENTES', 'NO', 'SI,NO', 'SI: Factura independientemente el total de cada tarifa de IVA y omite la tarifa del producto. NO: Factura el producto con la tarifa de iva definida al producto');
COMMIT WORK;

SET TERM ^ ;

CREATE OR ALTER procedure TARIFAS_ENSAMBLE (
    PRODUCTO VARCHAR(20),
    PRECIO NUMERIC(18,2),
    FECHA DATE)
returns (
    T0 NUMERIC(18,2),
    T1 NUMERIC(18,2),
    T2 NUMERIC(18,2),
    T3 NUMERIC(18,2),
    T4 NUMERIC(18,2),
    TC NUMERIC(18,2))
as
declare variable COSTO NUMERIC(18,2);
declare variable TOTAL NUMERIC(18,2);
declare variable TARIFA INTEGER;
declare variable COMPON VARCHAR(20);
declare variable CANT NUMERIC(18,4);
declare variable UNIDAD VARCHAR(8);
declare variable CONSUMO NUMERIC(18,2);
begin
T0 = 0;
T1 = 0;
T2 = 0;
T3 = 0;
T4 = 0;
TC = 0;
TOTAL = 0;
FOR SELECT ARPR_COMP, ARPR_CANT, ARPR_UNIDAD, TAIV_COD, ARTI_CONSUMO
    FROM articulos_producto P, ARTICULO A WHERE P.ARTI_COD = :PRODUCTO AND P.arpr_comp = A.arti_cod
    INTO :COMPON, :CANT, :UNIDAD, :TARIFA, :CONSUMO
    DO
    BEGIN
    EXECUTE PROCEDURE cantidad_por_factor (:COMPON, :CANT, :UNIDAD) returning_values (:cant);
    EXECUTE PROCEDURE costo_promedio (:COMPON, :FECHA) returning_values (:COSTO);
    TOTAL = TOTAL + COSTO * CANT;
    TC = TC + CONSUMO * CANT;
    if (TARIFA = 0) then
        T0 = T0 + COSTO * CANT;
    if (TARIFA = 1) then
        T1 = T1 + COSTO * CANT;
    if (TARIFA = 2) then
        T2 = T2 + COSTO * CANT;
    if (TARIFA = 3) then
        T3 = T3 + COSTO * CANT;
    if (TARIFA = 4) then
        T4 = T4 + COSTO * CANT;
    END
if (TOTAL <> 0) then
    BEGIN
    T0 = T0 * PRECIO / TOTAL;
    T1 = T1 * PRECIO / TOTAL;
    T2 = T2 * PRECIO / TOTAL;
    T3 = T3 * PRECIO / TOTAL;
    T4 = T4 * PRECIO / TOTAL;
    END
ELSE
    BEGIN
    T0 = 0;
    T1 = 0;
    T2 = 0;
    T3 = 0;
    T4 = 0;
    END
suspend;
end
^

SET TERM ; ^

GRANT SELECT ON ARTICULOS_PRODUCTO TO PROCEDURE TARIFAS_ENSAMBLE;
GRANT SELECT ON ARTICULO TO PROCEDURE TARIFAS_ENSAMBLE;
GRANT EXECUTE ON PROCEDURE CANTIDAD_POR_FACTOR TO PROCEDURE TARIFAS_ENSAMBLE;
GRANT EXECUTE ON PROCEDURE COSTO_PROMEDIO TO PROCEDURE TARIFAS_ENSAMBLE;
grant EXECUTE on PROCEDURE TARIFAS_ENSAMBLE to PUBLIC;


INSERT INTO GRUPO (GRUP_COD, GRUP_NOM, GRUP_CTAINVENT, GRUP_CTAVENTAS, GRUP_CTACOSTOS, GRUP_CTAIVACMP, GRUP_CTAIVAVNT, GRUP_COMIPOR, GRUP_COMIMONTO, GRUP_CTACOMP, GRUP_CTADEV, GRUP_CTARTFTEV, GRUP_CTARTFTEC, GRUP_RTFTEB, GRUP_RTFTEP) VALUES ('.t', 'INTERNO', NULL, NULL, NULL, NULL, NULL, 0, 0, NULL, NULL, NULL, NULL, 0, 0);
INSERT INTO ARTICULO (ARTI_COD, GRUP_COD, SUBG_COD, MARC_COD, ARTI_DES, ARTI_DESVAR, ARTI_TIPO, ARTI_EXIST, ARTI_FECHA, ARTI_UNIDAD, ARTI_PRECIO, ARTI_CONSUMO, ARTI_IMPOTRO, ARTI_PESO, ARTI_ANCHO, ARTI_ALTO, ARTI_LARGO, ARTI_OBS, ARTI_FOTO, ARTI_MAX, ARTI_MIN, ARTI_DIAS, ESAR_COD, ARTI_USUARIO, TAIV_COD, ARTI_CLASE, ARTI_DIANALIS) VALUES ('.t', '.t', NULL, NULL, '', 'S', 'A', 'N', '21-JUL-2008', '', 0, 0, 0, NULL, NULL, NULL, NULL, NULL, NULL, 0, 0, 0, 'A', NULL, 0, 'A', NULL);
INSERT INTO ARTICULO (ARTI_COD, GRUP_COD, SUBG_COD, MARC_COD, ARTI_DES, ARTI_DESVAR, ARTI_TIPO, ARTI_EXIST, ARTI_FECHA, ARTI_UNIDAD, ARTI_PRECIO, ARTI_CONSUMO, ARTI_IMPOTRO, ARTI_PESO, ARTI_ANCHO, ARTI_ALTO, ARTI_LARGO, ARTI_OBS, ARTI_FOTO, ARTI_MAX, ARTI_MIN, ARTI_DIAS, ESAR_COD, ARTI_USUARIO, TAIV_COD, ARTI_CLASE, ARTI_DIANALIS) VALUES ('.t0', '.t', NULL, NULL, 'ARTICULOS EXENTOS', 'S', 'A', 'N', '31-JUL-2008', '', 0, 0, 0, NULL, NULL, NULL, NULL, NULL, NULL, 0, 0, 0, 'A', NULL, 0, 'A', NULL);
INSERT INTO ARTICULO (ARTI_COD, GRUP_COD, SUBG_COD, MARC_COD, ARTI_DES, ARTI_DESVAR, ARTI_TIPO, ARTI_EXIST, ARTI_FECHA, ARTI_UNIDAD, ARTI_PRECIO, ARTI_CONSUMO, ARTI_IMPOTRO, ARTI_PESO, ARTI_ANCHO, ARTI_ALTO, ARTI_LARGO, ARTI_OBS, ARTI_FOTO, ARTI_MAX, ARTI_MIN, ARTI_DIAS, ESAR_COD, ARTI_USUARIO, TAIV_COD, ARTI_CLASE, ARTI_DIANALIS) VALUES ('.t1', '.t', NULL, NULL, 'ARTICULOS GRAVADOS 16%', 'S', 'A', 'N', '31-JUL-2008', '', 0, 0, 0, NULL, NULL, NULL, NULL, NULL, NULL, 0, 0, 0, 'A', NULL, 1, 'A', NULL);
INSERT INTO ARTICULO (ARTI_COD, GRUP_COD, SUBG_COD, MARC_COD, ARTI_DES, ARTI_DESVAR, ARTI_TIPO, ARTI_EXIST, ARTI_FECHA, ARTI_UNIDAD, ARTI_PRECIO, ARTI_CONSUMO, ARTI_IMPOTRO, ARTI_PESO, ARTI_ANCHO, ARTI_ALTO, ARTI_LARGO, ARTI_OBS, ARTI_FOTO, ARTI_MAX, ARTI_MIN, ARTI_DIAS, ESAR_COD, ARTI_USUARIO, TAIV_COD, ARTI_CLASE, ARTI_DIANALIS) VALUES ('.t2', '.t', NULL, NULL, 'ARTICULOS GRAVADOS 10%', 'S', 'A', 'N', '31-JUL-2008', '', 0, 0, 0, NULL, NULL, NULL, NULL, NULL, NULL, 0, 0, 0, 'A', NULL, 2, 'A', NULL);
commit work;

/* 20080801 : BUSQUEDA ARTICULOS */

INSERT INTO CONFIGURACION (CONF_MODULO, CONF_CATEGORIA, CONF_PROPIEDAD, CONF_VALOR, CONF_POSIBLES, CONF_AYUDA) VALUES ('INVENTARIO', 'ARTICULOS', 'FORMA DE HACER LAS BUSQUEDAS DE ARTICULOS DE VARIAS PALABRAS', 'EXACTA', 'EXACTA,TODAS,CUALQUIERA', 'EXACTA: Trae los artículos con exactamente las palabras en el orden dado. TODAS: Trae los artículos con todas las palabras sin importar el orden. CUALQUIERA: Trae los artículos que tengan al menos una de las palabras');
commit work;

SET TERM ^ ;

CREATE OR ALTER PROCEDURE CONSULTA_ARTICULOS_VTAS(
    FECHA DATE,
    INACTIVOS CHAR(1),
    MODULO VARCHAR(20))
RETURNS (
    CODIGO VARCHAR(20),
    DES VARCHAR(60),
    REF VARCHAR(20),
    GRUPO VARCHAR(30),
    MARCA VARCHAR(30),
    UNIDAD VARCHAR(8),
    ESTADO VARCHAR(30),
    IVA NUMERIC(9,2),
    EXISTEN NUMERIC(18,4),
    PRECIO NUMERIC(18,2),
    CLASE CHAR(1),
    OBS VARCHAR(255))
AS
DECLARE VARIABLE LISTA INTEGER;
DECLARE VARIABLE EXIST CHAR(2);
DECLARE VARIABLE SINEXIST CHAR(2);
declare variable DIG INTEGER;
BEGIN
EXISTEN = 0;
EXECUTE PROCEDURE lee_configuracion ('FACTURACION','ARTICULOS', 'VER EXISTENCIA EN CONSULTA ARTICULOS') returning_values (:EXIST);
EXECUTE PROCEDURE lee_configuracion ('FACTURACION','FACTURAS', 'CODIGO DE LA LISTA DE PRECIOS A MOSTRAR EN ARTICULOS') returning_values (:LISTA);
if (modulo = 'FACTURACION') then
  EXECUTE PROCEDURE lee_configuracion ('FACTURACION','ARTICULOS','VER ARTICULOS SIN EXISTENCIA EN CONSULTA DE ARTICULOS') returning_values (:sinexist);
else
  sinexist = 'SI';
EXECUTE PROCEDURE LEE_CONFIGURACION ('FACTURACION', 'ARTICULOS', 'REDONDEO AL MULTIPLO DE DIEZ EN PRECIOS') returning_values (DIG);
if (LISTA > 0) then
    BEGIN
    FOR select a.arti_cod, arti_des, grup_cod, arti_unidad, esar_cod, taiv_porc, marc_cod,arti_clase, SUBSTRING(ARTI_OBS FROM 1 FOR 255)
        from articulo a, tarifa_iva t
        where a.taiv_cod = t.taiv_cod and substring(a.arti_cod from 1 FOR 2) <> '.t' and
        ((:INACTIVOS = 'S') or (esar_cod = 'A') or ((:INACTIVOS = 'C') AND (esar_cod = 'N')))
        INTO :CODIGO, :DES, :GRUPO, :UNIDAD, :ESTADO, :IVA, :MARCA, :CLASE, :OBS
        do
        begin
        PRECIO = 0;
        SELECT prar_fijo PRECIO FROM precios_articulo WHERE arti_cod = :CODIGO and lipr_cod = :LISTA INTO :PRECIO;
        EXECUTE PROCEDURE redondee(PRECIO, DIG) returning_values (PRECIO);
        if (EXIST = 'SI') then
            BEGIN
            EXECUTE PROCEDURE saldo_total_inventario (:CODIGO, :FECHA) returning_values (:EXISTEN);
            if ((SINEXIST = 'SI')  or (existen <> 0)) then
                SUSPEND;
            END
        ELSE
            SUSPEND;
        select first 1 coba_cod from barras_articulo where arti_cod = :codigo into :ref;
        end
    END
ELSE
    FOR select arti_cod, arti_des, grup_cod, arti_unidad, esar_cod, taiv_porc, arti_precio, marc_cod, arti_clase, SUBSTRING(ARTI_OBS FROM 1 FOR 255)
        from articulo a, tarifa_iva t
        where a.taiv_cod = t.taiv_cod and substring(a.arti_cod from 1 FOR 2) <> '.t' and
        ((:INACTIVOS = 'S') or (esar_cod = 'A') or ((:INACTIVOS = 'C') AND (esar_cod = 'N')))
        INTO :CODIGO, :DES, :GRUPO, :UNIDAD, :ESTADO, :IVA, :PRECIO, :MARCA, :CLASE, :OBS
        do
        begin
        if (EXIST = 'SI') then
            BEGIN
            EXECUTE PROCEDURE saldo_total_inventario (:CODIGO, :FECHA) returning_values (:EXISTEN);
            if ((SINEXIST = 'SI') or (existen <> 0)) then
                SUSPEND;
            END
        ELSE
            SUSPEND;
        select first 1 coba_cod from barras_articulo where arti_cod = :codigo into :ref;
        end
END
^

SET TERM ; ^

GRANT EXECUTE ON PROCEDURE LEE_CONFIGURACION TO PROCEDURE CONSULTA_ARTICULOS_VTAS;
GRANT SELECT ON ARTICULO TO PROCEDURE CONSULTA_ARTICULOS_VTAS;
GRANT SELECT ON TARIFA_IVA TO PROCEDURE CONSULTA_ARTICULOS_VTAS;
GRANT SELECT ON PRECIOS_ARTICULO TO PROCEDURE CONSULTA_ARTICULOS_VTAS;
GRANT EXECUTE ON PROCEDURE REDONDEE TO PROCEDURE CONSULTA_ARTICULOS_VTAS;
GRANT EXECUTE ON PROCEDURE SALDO_TOTAL_INVENTARIO TO PROCEDURE CONSULTA_ARTICULOS_VTAS;

/* 20080804 */
ALTER TABLE GRUPO ADD GRUP_DTO T_PORCENTAJE;

/* 20080805 */
SET TERM ^ ;

CREATE OR ALTER PROCEDURE CONSULTA_ARTICULOS_VTAS(
    FECHA DATE,
    INACTIVOS CHAR(1),
    MODULO VARCHAR(20))
RETURNS (
    CODIGO VARCHAR(20),
    DES VARCHAR(60),
    REF VARCHAR(20),
    GRUPO VARCHAR(30),
    MARCA VARCHAR(30),
    UNIDAD VARCHAR(8),
    ESTADO VARCHAR(30),
    IVA NUMERIC(9,2),
    EXISTEN NUMERIC(18,4),
    PRECIO NUMERIC(18,2),
    CLASE CHAR(1),
    OBS VARCHAR(255))
AS
DECLARE VARIABLE LISTA INTEGER;
DECLARE VARIABLE EXIST CHAR(2);
DECLARE VARIABLE SINEXIST CHAR(2);
declare variable DIG INTEGER;
BEGIN
EXISTEN = 0;
EXECUTE PROCEDURE lee_configuracion ('FACTURACION','ARTICULOS', 'VER EXISTENCIA EN CONSULTA ARTICULOS') returning_values (:EXIST);
EXECUTE PROCEDURE lee_configuracion ('FACTURACION','FACTURAS', 'CODIGO DE LA LISTA DE PRECIOS A MOSTRAR EN ARTICULOS') returning_values (:LISTA);
if (modulo = 'FACTURACION') then
  EXECUTE PROCEDURE lee_configuracion ('FACTURACION','ARTICULOS','VER ARTICULOS SIN EXISTENCIA EN CONSULTA DE ARTICULOS') returning_values (:sinexist);
else
  sinexist = 'SI';
EXECUTE PROCEDURE LEE_CONFIGURACION ('FACTURACION', 'ARTICULOS', 'REDONDEO AL MULTIPLO DE DIEZ EN PRECIOS') returning_values (DIG);
if (LISTA > 0) then
    BEGIN
    FOR select a.arti_cod, arti_des, grup_cod, arti_unidad, esar_cod, taiv_porc, marc_cod,arti_clase, SUBSTRING(ARTI_OBS FROM 1 FOR 255)
        from articulo a, tarifa_iva t
        where a.taiv_cod = t.taiv_cod and substring(a.arti_cod from 1 FOR 2) <> '.t' and
        ((:INACTIVOS = 'S') or (esar_cod = 'A') or ((:INACTIVOS = 'C') AND (esar_cod = 'N')))
        INTO :CODIGO, :DES, :GRUPO, :UNIDAD, :ESTADO, :IVA, :MARCA, :CLASE, :OBS
        do
        begin
        PRECIO = 0;
        SELECT prar_fijo PRECIO FROM precios_articulo WHERE arti_cod = :CODIGO and lipr_cod = :LISTA INTO :PRECIO;
        EXECUTE PROCEDURE redondee(PRECIO, DIG) returning_values (PRECIO);
        select first 1 coba_cod from barras_articulo where arti_cod = :codigo into :ref;
        if (EXIST = 'SI') then
            BEGIN
            EXECUTE PROCEDURE saldo_total_inventario (:CODIGO, :FECHA) returning_values (:EXISTEN);
            if ((SINEXIST = 'SI')  or (existen <> 0)) then
                SUSPEND;
            END
        ELSE
            SUSPEND;
        end
    END
ELSE
    FOR select arti_cod, arti_des, grup_cod, arti_unidad, esar_cod, taiv_porc, arti_precio, marc_cod, arti_clase, SUBSTRING(ARTI_OBS FROM 1 FOR 255)
        from articulo a, tarifa_iva t
        where a.taiv_cod = t.taiv_cod and substring(a.arti_cod from 1 FOR 2) <> '.t' and
        ((:INACTIVOS = 'S') or (esar_cod = 'A') or ((:INACTIVOS = 'C') AND (esar_cod = 'N')))
        INTO :CODIGO, :DES, :GRUPO, :UNIDAD, :ESTADO, :IVA, :PRECIO, :MARCA, :CLASE, :OBS
        do
        begin
        select first 1 coba_cod from barras_articulo where arti_cod = :codigo into :ref;
        if (EXIST = 'SI') then
            BEGIN
            EXECUTE PROCEDURE saldo_total_inventario (:CODIGO, :FECHA) returning_values (:EXISTEN);
            if ((SINEXIST = 'SI') or (existen <> 0)) then
                SUSPEND;
            END
        ELSE
            SUSPEND;
        end
END
^

SET TERM ; ^

GRANT EXECUTE ON PROCEDURE LEE_CONFIGURACION TO PROCEDURE CONSULTA_ARTICULOS_VTAS;
GRANT SELECT ON ARTICULO TO PROCEDURE CONSULTA_ARTICULOS_VTAS;
GRANT SELECT ON TARIFA_IVA TO PROCEDURE CONSULTA_ARTICULOS_VTAS;
GRANT SELECT ON PRECIOS_ARTICULO TO PROCEDURE CONSULTA_ARTICULOS_VTAS;
GRANT EXECUTE ON PROCEDURE REDONDEE TO PROCEDURE CONSULTA_ARTICULOS_VTAS;
GRANT SELECT ON BARRAS_ARTICULO TO PROCEDURE CONSULTA_ARTICULOS_VTAS;
GRANT EXECUTE ON PROCEDURE SALDO_TOTAL_INVENTARIO TO PROCEDURE CONSULTA_ARTICULOS_VTAS;


/* 20080806 */

INSERT INTO CONFIGURACION (CONF_MODULO, CONF_CATEGORIA, CONF_PROPIEDAD, CONF_VALOR, CONF_POSIBLES, CONF_AYUDA) VALUES ('FACTURACION', 'DOCUMENTOS', 'PERMITIR MODIFICAR MANUALMENTE EL MONTO DE LAS RETENCIONES', 'NO', 'SI,NO', 'SI: Permite digitar un valor manual en el monto de las retenciones, el porcentaje se deja en cero. NO: Sólo se permite digitar un porcentaje y con ese se calcula el monto.');
commit work;

GRANT EXECUTE ON PROCEDURE BUSQUEDA_REMISIONES TO PUBLIC;

GRANT ALL ON PUNTO_EQUILIBRIO TO PUBLIC;
GRANT ALL ON ACTIVOS_FIJOS TO PUBLIC;

update revision set revi_FECHA = '2008/08/06';
COMMIT WORK;

/* 20080816 */
/* agregar grupo, subg y marca a la revisión para filtrar */
SET TERM ^ ;

CREATE OR ALTER PROCEDURE REVISA_PRECIOS(
    LISTA INTEGER,
    FECHA DATE)
RETURNS (
    ARTICULO VARCHAR(20),
    DESCR VARCHAR(60),
    GRUPO VARCHAR(2),
    SUBGRUPO VARCHAR(3),
    MARCA VARCHAR(3),
    FIJO NUMERIC(18,2),
    UNIDAD VARCHAR(8),
    PORC NUMERIC(9,4),
    SUGERIDO NUMERIC(18,2),
    DIFER NUMERIC(18,2),
    NUEVO NUMERIC(18,2),
    OK CHAR(1))
AS
declare variable marg numeric(9,4);
declare variable UOM VARCHAR(10);
declare variable BASE VARCHAR(10);
declare variable CAMBIO VARCHAR(10);
declare variable COSTO numeric(18,2);
declare variable COSTOP numeric(18,2);
declare variable COSTOU numeric(18,2);
declare variable DIFMAX numeric(18,2);
declare variable DIG INTEGER;
declare variable TARIVA NUMERIC(9,4);
declare variable IVAINC CHAR(1);
declare variable LISTAREF INTEGER;
begin
execute procedure lee_configuracion ('FACTURACION', 'ARTICULOS', 'SUGERIR PRECIOS CON PORCENTAJE DE MARGEN O UTILIDAD') returning_values (:UOM);
EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION', 'ARTICULOS', 'REDONDEO AL MULTIPLO DE DIEZ EN PRECIOS') RETURNING_VALUES (:DIG);
EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION','ARTICULOS','CAMBIO DE PRECIOS AUTOMATICO AL CAMBIAR COSTO O PRECIO') returning_values (CAMBIO);
EXECUTE PROCEDURE lee_configuracion('FACTURACION','ARTICULOS','COSTO BASE PARA CALCULO DE PRECIOS DE VENTA AUTOMATICOS') returning_values (:BASE);
EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION','ARTICULOS','CODIGO DE LA LISTA DE PRECIOS BASE PARA CAMBIO DE PRECIOS AUTOMATICO') returning_values (LISTAREF);
EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION','ARTICULOS','DIFERENCIA EN PESOS MAXIMA A PERMITIR PARA CAMBIAR PRECIOS') returning_values (DIFMAX);
for select A.arti_cod, A.arti_des, A.grup_cod, A.subg_cod, A.marc_cod, A.arti_unidad, prar_fijo, prar_margen, prar_util, TAIV_PORC
    from precios_articulo p, articulo a, tarifa_iva T
    where a.arti_cod = p.arti_cod and lipr_cod = :lista and a.taiv_cod = t.taiv_cod order by A.arti_cod
    into :articulo, descr, :grupo, :subgrupo, :marca, :unidad, :fijo, :marg, :porc, :tariva
    do
    begin
    if (UOM <> 'UTILIDAD') then
        PORC = MARG;
    if (CAMBIO = 'COSTO') then
        BEGIN
        EXECUTE PROCEDURE COSTO_PROMEDIO (:ARTICULO, :FECHA) RETURNING_VALUES(:COSTOP);
        EXECUTE PROCEDURE ULTIMO_COSTO (:ARTICULO, :FECHA, :UNIDAD) RETURNING_VALUES(:COSTOU);
        if (base = 'ULTIMO') then
            COSTO = COSTOU;
        ELSE
            BEGIN
            COSTO = COSTOP;
            if (base = 'MAYOR') then
                if (COSTOP < COSTOU) then
                    COSTO = COSTOU;
            END
        SELECT LIPR_MODIF FROM LISTA_PRECIOS WHERE LIPR_COD = :lista INTO :IVAINC;
        if (IVAINC = 'S') then
            COSTO = COSTO * (1 + TARIVA/100);
        if (UOM = 'UTILIDAD') then
            SUGERIDO = COSTO * (1 + :PORC/100);
        ELSE
            SUGERIDO = COSTO / (1 - :PORC/100);
        END
    ELSE
        if (LISTA <> LISTAREF) then
            BEGIN
            SELECT PRAR_FIJO FROM PRECIOS_ARTICULO WHERE ARTI_COD = :articulo AND LIPR_COD = :LISTAREF INTO :SUGERIDO;
            if (IVAINC = 'S') then
                SUGERIDO = SUGERIDO / (1 + TARIVA/100);
            if (UOM = 'UTILIDAD') then
                SUGERIDO = SUGERIDO * (1 + :PORC/100);
            ELSE
                SUGERIDO = SUGERIDO / (1 - :PORC/100);
            END
    EXECUTE PROCEDURE REDONDEE (SUGERIDO, DIG) returning_values (SUGERIDO);
    DIFER = SUGERIDO - FIJO;
    NUEVO = SUGERIDO;
    OK = 'S';
    if ((abs(DIFER) > DIFMAX) and (sugerido <> 0)) then
        suspend;
    end
end
^

SET TERM ; ^

GRANT EXECUTE ON PROCEDURE LEE_CONFIGURACION TO PROCEDURE REVISA_PRECIOS;
GRANT SELECT ON PRECIOS_ARTICULO TO PROCEDURE REVISA_PRECIOS;
GRANT SELECT ON ARTICULO TO PROCEDURE REVISA_PRECIOS;
GRANT SELECT ON TARIFA_IVA TO PROCEDURE REVISA_PRECIOS;
GRANT EXECUTE ON PROCEDURE COSTO_PROMEDIO TO PROCEDURE REVISA_PRECIOS;
GRANT EXECUTE ON PROCEDURE ULTIMO_COSTO TO PROCEDURE REVISA_PRECIOS;
GRANT SELECT ON LISTA_PRECIOS TO PROCEDURE REVISA_PRECIOS;
GRANT EXECUTE ON PROCEDURE REDONDEE TO PROCEDURE REVISA_PRECIOS;

/* AGREGAR IMPOCONSUMO A IMPORTACION DE INVENTARIO */
INSERT INTO IMPORTACION_INVENTARIO (IMIN_TIPO, IMIN_DATO, IMIN_COLUMNA, IMIN_ANCHO) VALUES (3, 'ENDE_CONSUMO', 8, 20);
COMMIT WORK;
INSERT INTO NOMBRES_CAMPOS (NOMBRE, DESCRIPCION) VALUES ('ENDE_CONSUMO', 'Impuesto al consumo');
commit work;

/* busquedas de clientes */
INSERT INTO CONFIGURACION (CONF_MODULO, CONF_CATEGORIA, CONF_PROPIEDAD, CONF_VALOR, CONF_POSIBLES, CONF_AYUDA) VALUES ('CARTERA', 'GENERAL', 'FORMA DE HACER LAS BUSQUEDAS DE CLIENTES DE VARIAS PALABRAS', 'TODAS', 'EXACTA,TODAS,CUALQUIERA', 'EXACTA: Trae los clientes con exactamente las palabras en el orden dado. TODAS: Trae los clientes con todas las palabras sin importar el orden. CUALQUIERA: Trae los clientes que tengan al menos una de las palabras');
COMMIT WORK;

/* INICIALIZAR DEVT_REMID = 0 PARA QUE LOS REPORTES DE VENTAS NO INCLUYAN LAS DEV. DE REMISIONES */
SET TERM ^ ;

CREATE OR ALTER TRIGGER DEVOLUCIONES_VENTAS_BI FOR DEVOLUCIONES_VENTAS
ACTIVE BEFORE INSERT POSITION 0
AS
declare variable NUMERO VARCHAR(6);
declare variable AUTOM CHAR(1);
declare variable EXISTE CHAR(1);
declare variable SITOT CHAR(2);
declare variable CODCOBR INTEGER;
declare variable CODVEND INTEGER;
BEGIN
if (new.devt_remid is null) then
    NEW.devt_remid = 0;
execute procedure LEE_CONFIGURACION ('FACTURACION','DEVOLUCIONES','PERMITIR DEVOLVER ITEMS NO FACTURADOS') returning_values (:SITOT);
if ((SITOT = 'NO') AND (NEW.devt_factid = 0)) then
    exception factura_no_existe;
/* CALCULE LA COMISION CON BASE EN LA FACTURA */
EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION', 'VENDEDORES', 'COMISIONES EN VENTA INCLUYENDO IMPUESTOS') returning_values (:SITOT);
SELECT FACT_COMIPORC FROM FACTURAS WHERE FACT_ID = NEW.devt_factid INTO NEW.devt_comiporc;
if (NEW.devt_comiporc IS NULL) then
    NEW.devt_comiporc = 0;

if (SITOT = 'SI') then
    NEW.devt_comimonto = NEW.devt_total * NEW.devt_comiporc / 100;
ELSE
    NEW.devt_comimonto = (NEW.devt_total - NEW.devt_ivamonto) * NEW.devt_comiporc / 100;

if (NEW.numok = 'N') then
  BEGIN
  /* Actualice el contador del prefijo */
  SELECT PREF_ACTUAL, PREF_AUTO FROM PREFIJOS WHERE TIDO_COD = 33 AND PREF_PRE = NEW.PREF_PRE INTO :NUMERO, :AUTOM;
  /* ACTUALICE EL NUMERO EN COMPROBANTE_ENCABEZADO  */
  if (AUTOM = 'S') then
    BEGIN
    NEW.DEVT_NUMERO = NUMERO;
    NUMERO = CAST((CAST(NUMERO AS INTEGER) + 1) AS CHAR(6));
    UPDATE PREFIJOS
      SET PREF_ACTUAL = :NUMERO
    WHERE TIDO_COD = 33 AND PREF_PRE = NEW.PREF_PRE;
    END
  ELSE
    BEGIN
    if (CAST(NUMERO AS INTEGER) = CAST(NEW.DEVT_NUMERO AS INTEGER)) then
        UPDATE PREFIJOS
          SET PREF_ACTUAL = CAST((CAST(PREF_ACTUAL AS INTEGER) + 1) AS CHAR(6))
        WHERE TIDO_COD = 33 AND PREF_PRE = NEW.PREF_PRE;
    END
  EXECUTE PROCEDURE COMPLETA_CEROS (NEW.DEVT_numero) returning_values (NEW.DEVT_numero);
  NEW.numok = 'S';
  END
/* Verifique que el numero no existe previamente */
EXISTE = 'N';
SELECT 'S' FROM DEVOLUCIONES_VENTAS WHERE PREF_PRE = NEW.PREF_PRE AND DEVT_NUMERO = NEW.DEVT_NUMERO INTO :EXISTE;
if (EXISTE = 'S') then
    EXCEPTION DOCUMENTO_REGISTRADO;
select COBR_COD, VEND_COD FROM CLIENTES WHERE TERC_NIT = NEW.terc_nit INTO :CODCOBR, CODVEND;
if (NEW.cobr_cod IS NULL) then
    NEW.cobr_cod = :CODCOBR;
if (NEW.vend_cod IS NULL) then
    NEW.vend_cod = :CODVEND;
if ((new.DEVT_TOTAL-new.DEVT_IVAMONTO+new.DEVT_DTOMONTO-new.DEVT_ADICIONAL) = 0) then
    NEW.DEVT_FACTOR = 1;
else
    NEW.DEVT_FACTOR = (new.DEVT_TOTAL-new.DEVT_IVAMONTO)/(new.DEVT_TOTAL-new.DEVT_IVAMONTO+new.DEVT_DTOMONTO-new.DEVT_ADICIONAL);
END
^

SET TERM ; ^

GRANT SELECT,UPDATE,REFERENCES ON DEVOLUCIONES_VENTAS TO TRIGGER DEVOLUCIONES_VENTAS_BI;
GRANT EXECUTE ON PROCEDURE LEE_CONFIGURACION TO TRIGGER DEVOLUCIONES_VENTAS_BI;
GRANT SELECT ON FACTURAS TO TRIGGER DEVOLUCIONES_VENTAS_BI;
GRANT SELECT,UPDATE ON PREFIJOS TO TRIGGER DEVOLUCIONES_VENTAS_BI;
GRANT EXECUTE ON PROCEDURE COMPLETA_CEROS TO TRIGGER DEVOLUCIONES_VENTAS_BI;
GRANT SELECT ON CLIENTES TO TRIGGER DEVOLUCIONES_VENTAS_BI;

/* AGREGAR CONTACTO A CONSULTA DE CARTERA PARA PODER UBICAR POR RAZON SOCIAL */
SET TERM ^ ;

CREATE OR ALTER PROCEDURE MOVIMIENTO_CARTERA_MES(
    FECINI DATE,
    FECFIN DATE,
    SUBEMPRESA INTEGER,
    CONTADO CHAR(1))
RETURNS (
    NIT VARCHAR(20),
    NOMBRE VARCHAR(60),
    CONTACTO VARCHAR(60),
    INICIAL NUMERIC(18,2),
    DEBITOS NUMERIC(18,2),
    CREDITOS NUMERIC(18,2),
    ABONOS NUMERIC(18,2),
    FINAL NUMERIC(18,2))
AS
declare variable RETES CHAR(2);
declare variable TIPODOC INTEGER;
declare variable IDDOC INTEGER;
declare variable SALDO NUMERIC(18,2);
declare variable NUMROWS INTEGER;
BEGIN
  for select TERC_NIT, TERC_NOM, TERC_CONTACTO from TERCEROS WHERE TERC_CLIE = 'S' into :NIT, :NOMBRE, :CONTACTO
  DO
    BEGIN
    SELECT COUNT(*) FROM AUTORIZACIONES WHERE AUTO_NITCONTADO = :NIT INTO :numrows;
    IF ((CONTADO = 'S') or (numrows = 0)) THEN
        BEGIN
        FECINI = FECINI - 1;
        INICIAL = 0;
        FOR SELECT MVCL_TIPOREF, MVCL_IDREF FROM MOVIMIENTO_CLIENTES
            WHERE TERC_NIT = :NIT AND MVCL_FECHA <= :FECINI AND
            MVCL_ABONO = 'N' AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA))
            INTO :TIPODOC, :IDDOC
            DO
            BEGIN
            EXECUTE PROCEDURE saldo_doc_cartera(TIPODOC, IDDOC, FECINI) returning_values (SALDO);
            INICIAL = INICIAL + SALDO;
            END
        EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'DESCONTAR RETENCIONES POR CAUSACION') returning_values(:RETES);
        FECINI = FECINI + 1;
        if (RETES = 'SI') then
            BEGIN
            SELECT SUM(MVCL_MONTO-MVCL_RTEFTE-MVCL_RTEIVA-MVCL_RTEICA) FROM movimiento_clientes
                WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND MVCL_FECHA < :FECFIN
                AND MVCL_DEBITO = 'S' AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA))
                INTO :DEBITOS;
            SELECT SUM(MVCL_MONTO-MVCL_RTEFTE-MVCL_RTEIVA-MVCL_RTEICA) FROM movimiento_clientes
                WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND MVCL_FECHA < :FECFIN
                AND MVCL_DEBITO = 'N' AND MVCL_ABONO = 'N' and MVCL_TIPOREF <> 45 AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA))
                INTO :CREDITOS;
            SELECT SUM(MVCL_MONTO) FROM movimiento_clientes
                WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND MVCL_FECHA < :FECFIN
                AND MVCL_ABONO = 'S' AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA))
                INTO :ABONOS;
            END
        ELSE
            BEGIN
            SELECT SUM(MVCL_MONTO) FROM movimiento_clientes
                WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND MVCL_FECHA < :FECFIN
                AND MVCL_DEBITO = 'S' AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA))
                INTO :DEBITOS;
            SELECT SUM(MVCL_MONTO) FROM movimiento_clientes
                WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND MVCL_FECHA < :FECFIN
                AND MVCL_DEBITO = 'N' AND MVCL_ABONO = 'N' and MVCL_TIPOREF <> 45 AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA))
                INTO :CREDITOS;
            SELECT SUM(MVCL_MONTO+MVCL_RTEFTE+MVCL_RTEIVA+MVCL_RTEICA) FROM movimiento_clientes
                WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND MVCL_FECHA < :FECFIN
                AND MVCL_ABONO = 'S' AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA))
                INTO :ABONOS;
            END
        if (DEBITOS IS NULL) then
            DEBITOS = 0;
        if (CREDITOS IS NULL) then
            CREDITOS = 0;
        if (ABONOS IS NULL) then
            ABONOS = 0;
        FINAL = INICIAL + DEBITOS - CREDITOS - ABONOS;
        SUSPEND;
        END
    END
END
^

SET TERM ; ^

GRANT SELECT ON TERCEROS TO PROCEDURE MOVIMIENTO_CARTERA_MES;
GRANT SELECT ON AUTORIZACIONES TO PROCEDURE MOVIMIENTO_CARTERA_MES;
GRANT SELECT ON MOVIMIENTO_CLIENTES TO PROCEDURE MOVIMIENTO_CARTERA_MES;
GRANT EXECUTE ON PROCEDURE SALDO_DOC_CARTERA TO PROCEDURE MOVIMIENTO_CARTERA_MES;
GRANT EXECUTE ON PROCEDURE LEE_CONFIGURACION TO PROCEDURE MOVIMIENTO_CARTERA_MES;

/* no permitir cantidades mayores a las ordenadas */

INSERT INTO CONFIGURACION (CONF_MODULO, CONF_CATEGORIA, CONF_PROPIEDAD, CONF_VALOR, CONF_POSIBLES, CONF_AYUDA) VALUES ('COMPRAS', 'FACTURAS', 'PERMITIR CANTIDADES MAYORES A LAS ORDENADAS', 'NO', 'SI,NO', 'NO: Impide que se digiten cantidades mayores a las unidades perviamente ordenadas.');
commit work;

/* INACTIVAR CODIGOS DE BARRAS */
ALTER TABLE BARRAS_ARTICULO ADD COBA_ACTIVO T_BOOLEANO;

update barras_articulo set COBA_ACTIVO = 'S';
COMMIT WORK;

SET TERM ^ ;

CREATE OR ALTER TRIGGER TI_BARRAS_ARTICULO FOR BARRAS_ARTICULO
ACTIVE BEFORE INSERT POSITION 0
AS
DECLARE VARIABLE NUMROWS INTEGER;
BEGIN
if (NEW.coba_activo IS NULL) then
    NEW.coba_activo = 'S';
    /*  PARENT 'ARTICULO' MUST EXIST WHEN INSERTING A CHILD IN 'BARRAS_ARTICULO'  */
    IF (NEW.ARTI_COD IS NOT NULL) THEN
    BEGIN
       SELECT COUNT(*)
       FROM   ARTICULO
       WHERE  ARTICULO.ARTI_COD = NEW.ARTI_COD
       INTO   :NUMROWS;
       IF (NUMROWS = 0) THEN
       BEGIN
          EXCEPTION ARTICULO_NO_EXISTE;
       END
    END
END
^

SET TERM ; ^

GRANT UPDATE,REFERENCES ON BARRAS_ARTICULO TO TRIGGER TI_BARRAS_ARTICULO;
GRANT SELECT ON ARTICULO TO TRIGGER TI_BARRAS_ARTICULO;

SET TERM ^ ;

CREATE OR ALTER PROCEDURE VALIDE_ARTICULO(
    CODIGO VARCHAR(15))
RETURNS (
    TIPO CHAR(1),
    DESCRIPCION VARCHAR(60),
    UNIDAD VARCHAR(8),
    ID VARCHAR(15),
    LOTE CHAR(1))
AS
BEGIN
  TIPO = '0';
  DESCRIPCION = '';
  UNIDAD = '';
  LOTE = '';
  /* Busquelo como código de barras */
  SELECT FIRST 1 '1', B.ARTI_COD, COBA_DES,COBA_UNIDAD, ARTI_EXIST
        from BARRAS_ARTICULO B, ARTICULO A
        WHERE B.ARTI_COD = A.ARTI_COD AND COBA_COD = :CODIGO AND COBA_ACTIVO = 'S'
        INTO :TIPO, :ID, :DESCRIPCION, :UNIDAD, :LOTE;
  if (TIPO <> '1') then
    SELECT '2', ARTI_COD, ARTI_DES, ARTI_UNIDAD, ARTI_EXIST
        FROM ARTICULO
        WHERE ARTI_COD = :CODIGO
        INTO :TIPO, :ID, :DESCRIPCION, :UNIDAD, :LOTE;
  SUSPEND;
END
^

SET TERM ; ^

GRANT SELECT ON BARRAS_ARTICULO TO PROCEDURE VALIDE_ARTICULO;
GRANT SELECT ON ARTICULO TO PROCEDURE VALIDE_ARTICULO;

/* ORDEN SUGERIDA CON F7 */
SET TERM ^ ;

CREATE OR ALTER PROCEDURE ORDEN_SUGERIDA(
    PROVEEDOR VARCHAR(20),
    FECHA DATE)
RETURNS (
    ARTICULO VARCHAR(15),
    BODEGA VARCHAR(2),
    CANT NUMERIC(18,4),
    UNIDAD VARCHAR(8),
    COSTO NUMERIC(18,2))
AS
declare variable FACTOR NUMERIC(15,4);
declare variable DIAS INTEGER;
declare variable EXISTENCIA NUMERIC(18,4);
declare variable PROMEDIO NUMERIC(18,4);
declare variable AGENCIA INTEGER;
declare variable DIA_ART VARCHAR(2) CHARACTER SET NONE;
declare variable DIASC VARCHAR(255);
declare variable SALIDAS NUMERIC(18,4);
BEGIN
FOR SELECT ARTI_COD, PVAR_COSTO FROM proveedor_articulo WHERE TERC_NIT = :proveedor INTO :articulo, :costo
  DO BEGIN
  for select bode_cod, SUCU_ID from bodega into :bodega, :agencia
    do
    begin
    SELECT ARTI_UNIDAD FROM ARTICULO WHERE ARTI_COD = :articulo INTO :unidad;
    execute procedure saldo_inventario (:articulo, :bodega, :fecha) returning_values (:Existencia);
    EXECUTE PROCEDURE FACTOR_UNIDAD_CANT(:ARTICULO, :UNIDAD) returning_values (:FACTOR);
    if (FACTOR <> 0) then
        EXISTENCIA = EXISTENCIA / FACTOR;
    else
        EXISTENCIA = 0;
    EXECUTE PROCEDURE promedio_salidas_articulo (:ARTICULO, :FECHA, :BODEGA) returning_values (:PROMEDIO, :SALIDAS);
    EXECUTE PROCEDURE lee_configuracion ('INVENTARIO', 'EXISTENCIAS', 'PROMEDIAR LAS SALIDAS DEL INVENTARIO CON EL NUMERO DE DIAS ASIGNADO A CADA ARTICULO') returning_values (:DIA_ART);
    if (DIA_ART = 'NO') then
        BEGIN
        EXECUTE PROCEDURE lee_configuracion ('INVENTARIO', 'EXISTENCIAS', 'NUMERO DE DIAS PARA PROMEDIO DE SALIDAS POR ARTICULO') returning_values (DIASC);
        DIAS = CAST(DIASC AS INTEGER);
        END
    ELSE
        SELECT ARTI_DIAS FROM ARTICULO WHERE ARTI_COD = :ARTICULO INTO :DIAS;
    if (DIAS is null) then
        DIAS = 0;
    PROMEDIO = DIAS * PROMEDIO;
    if (FACTOR <> 0) then
        PROMEDIO = PROMEDIO / FACTOR;
    CANT = PROMEDIO - EXISTENCIA;
    if (CANT > 0) then
        SUSPEND;
    end
  END
END
^

SET TERM ; ^

GRANT SELECT ON PROVEEDOR_ARTICULO TO PROCEDURE ORDEN_SUGERIDA;
GRANT SELECT ON BODEGA TO PROCEDURE ORDEN_SUGERIDA;
GRANT SELECT ON ARTICULO TO PROCEDURE ORDEN_SUGERIDA;
GRANT EXECUTE ON PROCEDURE SALDO_INVENTARIO TO PROCEDURE ORDEN_SUGERIDA;
GRANT EXECUTE ON PROCEDURE FACTOR_UNIDAD_CANT TO PROCEDURE ORDEN_SUGERIDA;
GRANT EXECUTE ON PROCEDURE PROMEDIO_SALIDAS_ARTICULO TO PROCEDURE ORDEN_SUGERIDA;
GRANT EXECUTE ON PROCEDURE LEE_CONFIGURACION TO PROCEDURE ORDEN_SUGERIDA;
grant EXECUTE on PROCEDURE ORDEN_SUGERIDA to PUBLIC;

/* 20080819 */
CREATE TABLE CONCILIACION_ENCABEZADO (
    COBN_ID T_ID NOT NULL,
    COBN_PREFIJO VARCHAR(4),
    COBN_NUMERO T_NUMDOC,
    COBN_FECHA DATE,
    COBN_CONCEPTO T_CONCEPTO);
alter table CONCILIACION_ENCABEZADO add constraint PK_CONCILIACION_ENCABEZADO primary key (COBN_ID);
ALTER TABLE CONCILIACION_ENCABEZADO ADD CUBA_COD T_ID;
ALTER TABLE CONCILIACION_ENCABEZADO ADD COBN_ANULADO T_BOOLEANO;
ALTER TABLE CONCILIACION_ENCABEZADO ADD COBN_FECINI DATE;
ALTER TABLE CONCILIACION_ENCABEZADO ADD COBN_FECFIN DATE;

CREATE TABLE CONCILIACION_BANCARIA (
    CUBA_COD T_ID NOT NULL,
    COBN_ITEM T_ID NOT NULL,
    COBN_OPER VARCHAR(20),
    COBN_FEC DATE,
    COBN_CONC T_CONCEPTO,
    COBN_PREFIJO VARCHAR(4),
    COBN_NUMERO T_NUMDOC,
    COBN_REF VARCHAR(20),
    COBN_MONTO T_MONTO,
    COBN_TIPODOC INTEGER,
    COBN_OK T_BOOLEANO,
    COBN_CONCEPTO T_CONCEPTO,
    COBN_EXPLICA BLOB SUB_TYPE 1 SEGMENT SIZE 80);
ALTER TABLE CONCILIACION_BANCARIA ADD COBN_ID T_ID NOT NULL ;
alter table CONCILIACION_BANCARIA add constraint PK_CONCILIACION_BANCARIA primary key (COBN_ID,COBN_ITEM);
ALTER TABLE CONCILIACION_BANCARIA ADD COBN_ANULADO T_BOOLEANO;

CREATE TABLE CONCILIACION_OPERACIONES (
    CUBA_COD T_ID NOT NULL,
    COOP_OPER VARCHAR(20) NOT NULL,
    COOP_TIPODOC T_ID);
alter table CONCILIACION_OPERACIONES
add constraint PK_CONCILIACION_OPERACIONES primary key (CUBA_COD,COOP_OPER);

ALTER TABLE CONCILIACION_BANCARIA ADD COBN_IDDOC T_ID;
ALTER TABLE CONCILIACION_BANCARIA ADD COBN_DB T_BOOLEANO;
ALTER TABLE CONCILIACION_OPERACIONES ADD COOP_DB T_BOOLEANO;

grant select, delete, insert, update on conciliacion_bancaria to PUBLIC;
grant select, delete, insert, update on conciliacion_operaciones to PUBLIC;

SET TERM ^ ;

CREATE OR ALTER PROCEDURE CONCILIA_BANCO(
    ID INTEGER)
RETURNS (
    GRUPO INTEGER,
    TIPODOC INTEGER,
    OPER VARCHAR(20),
    IDDOC INTEGER,
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    CONCEPTO VARCHAR(60),
    MONTO NUMERIC(18,2))
AS
declare variable FECINI DATE;
declare variable FECFIN DATE;
declare variable ITEM INTEGER;
declare variable DB CHAR(1);
begin
select COBN_FECINI, COBN_FECFIN FROM conciliacion_encabezado WHERE COBN_ID = :ID INTO :FECINI, :FECFIN;
/* COMPARE LA TABLA CON LOS MOVIMIENTOS DEL BANCO */
FOR SELECT COBN_ITEM, ABS(COBN_MONTO), COBN_FEC, COBN_TIPODOC, COBN_DB, COBN_CONC
    FROM CONCILIACION_BANCARIA
    WHERE COBN_ID = :ID
    INTO :ITEM, :MONTO, :FECHA, :TIPODOC, :DB, :concepto
    DO
    BEGIN
    /* BUSQUE LA OPERACION  */
    if (TIPODOC <> 0) then
        BEGIN
        PREFIJO = '';
        SELECT FIRST 1 MOBA_PREF, MOBA_NUMERO, MOBA_IDREF
            FROM movimiento_banco M WHERE MOBA_TIPODOC = :tipodoc AND MOBA_TOTAL = :MONTO AND
                NOT EXISTS (SELECT COBN_ITEM FROM CONCILIACION_BANCARIA WHERE COBN_IDDOC = m.moba_idref AND COBN_TIPODOC = :tipodoc)
            ORDER BY ABS(MOBA_FECHA - :FECHA)
            INTO :prefijo, :numero, :IDDOC;
        if (PREFIJO <> '') then
            BEGIN
            GRUPO = 1;
            UPDATE conciliacion_bancaria SET COBN_PREFIJO = :PREFIJO, COBN_NUMERO = :NUMERO, COBN_IDDOC = :iddoc    
                WHERE COBN_ID = :ID AND COBN_ITEM = :ITEM;
            suspend;
            END
        ELSE
            BEGIN
            /* BUSQUELO COMO DEBITO O CREDITO SIN IMPORTAR EL TIPO */
            SELECT FIRST 1 MOBA_PREF, MOBA_NUMERO, MOBA_IDREF
                FROM movimiento_banco M WHERE MOBA_DB = :DB AND MOBA_TOTAL = :MONTO AND
                    NOT EXISTS (SELECT COBN_ITEM FROM CONCILIACION_BANCARIA WHERE COBN_IDDOC = m.moba_idref AND COBN_TIPODOC = :tipodoc)
                ORDER BY ABS(MOBA_FECHA - :FECHA)
                INTO :prefijo, :numero, :IDDOC;
            if (PREFIJO <> '') then
                BEGIN
                GRUPO = 1;
                UPDATE conciliacion_bancaria SET COBN_PREFIJO = :PREFIJO, COBN_NUMERO = :NUMERO, COBN_IDDOC = :iddoc    
                    WHERE COBN_ID = :ID AND COBN_ITEM = :ITEM;
                suspend;
                END
            ELSE
                BEGIN
                GRUPO = 2;
                suspend;
                END
            END
        END
    ELSE
        BEGIN
        /* BUSQUELO COMO DEBITO O CREDITO SIN IMPORTAR EL TIPO */
        SELECT FIRST 1 MOBA_PREF, MOBA_NUMERO, MOBA_IDREF
            FROM movimiento_banco M WHERE MOBA_DB = :DB AND MOBA_TOTAL = :MONTO AND
                NOT EXISTS (SELECT COBN_ITEM FROM CONCILIACION_BANCARIA WHERE COBN_IDDOC = m.moba_idref AND COBN_TIPODOC = :tipodoc)
            ORDER BY ABS(MOBA_FECHA - :FECHA)
            INTO :prefijo, :numero, :IDDOC;
        if (PREFIJO <> '') then
            BEGIN
            GRUPO = 1;
            UPDATE conciliacion_bancaria SET COBN_PREFIJO = :PREFIJO, COBN_NUMERO = :NUMERO, COBN_IDDOC = :iddoc
                WHERE COBN_ID = :ID AND COBN_ITEM = :ITEM;
            suspend;
            END
        END
    /* AGREGUE LOS DOCUMENTOS SIN UBICAR */
    GRUPO = 3;
    FOR SELECT MOBA_PREF, MOBA_NUMERO, MOBA_FECHA, MOBA_TOTAL, TIDO_NOMCORTO, MOBA_CONCEPTO
        FROM MOVIMIENTO_BANCO M, tipo_documento T
        WHERE T.tido_cod = M.moba_tipodoc AND MOBA_FECHA >= :FECINI AND MOBA_FECHA <= :FECFIN AND
            NOT EXISTS (SELECT COBN_ITEM FROM conciliacion_bancaria WHERE COBN_TIPODOC = M.moba_tipodoc AND COBN_IDDOC = M.moba_idref)
        INTO :prefijo, :numero, :fecha, :monto, :oper, :concepto
        DO
        SUSPEND;
    END
end
^

SET TERM ; ^

GRANT SELECT ON CONCILIACION_ENCABEZADO TO PROCEDURE CONCILIA_BANCO;
GRANT SELECT,UPDATE ON CONCILIACION_BANCARIA TO PROCEDURE CONCILIA_BANCO;
GRANT SELECT ON MOVIMIENTO_BANCO TO PROCEDURE CONCILIA_BANCO;
GRANT SELECT ON TIPO_DOCUMENTO TO PROCEDURE CONCILIA_BANCO;
grant EXECUTE on procedure concilia_banco to PUBLIC;

CREATE SEQUENCE ID_CONCILIAB;

SET TERM ^ ;

CREATE OR ALTER PROCEDURE CAMBIE_ID_CONCILIAB
RETURNS (
    ID INTEGER)
AS
declare variable NUMROWS INTEGER;
BEGIN
/* TRAE EL ID NUEVO Y LO ACTUALIZA */
NUMROWS = 1;
while (NUMROWS > 0) DO
    BEGIN
    ID = GEN_ID(id_conciliab, 1);
    /* VERIFIQUE SI YA EXISTE */
    SELECT COUNT(*) FROM conciliacion_bancaria WHERE COBN_ID = :ID INTO :NUMROWS;
    END
SUSPEND;
END
^

SET TERM ; ^

GRANT SELECT ON CONCILIACION_BANCARIA TO PROCEDURE CAMBIE_ID_CONCILIAB;
GRANT EXECUTE ON PROCEDURE CAMBIE_ID_CONCILIAB TO PUBLIC;


INSERT INTO IMPORTACION_INVENTARIO (IMIN_TIPO, IMIN_DATO, IMIN_COLUMNA, IMIN_ANCHO) VALUES (22, 'COBN_CONC', 3, 60);
INSERT INTO IMPORTACION_INVENTARIO (IMIN_TIPO, IMIN_DATO, IMIN_COLUMNA, IMIN_ANCHO) VALUES (22, 'COBN_FEC', 1, 10);
INSERT INTO IMPORTACION_INVENTARIO (IMIN_TIPO, IMIN_DATO, IMIN_COLUMNA, IMIN_ANCHO) VALUES (22, 'COBN_MONTO', 4, 20);
INSERT INTO IMPORTACION_INVENTARIO (IMIN_TIPO, IMIN_DATO, IMIN_COLUMNA, IMIN_ANCHO) VALUES (22, 'COBN_REF', 2, 20);
COMMIT WORK;

INSERT INTO NOMBRES_CAMPOS (NOMBRE, DESCRIPCION) VALUES ('COBN_CONC', 'Concepto movimiento extracto');
INSERT INTO NOMBRES_CAMPOS (NOMBRE, DESCRIPCION) VALUES ('COBN_FEC', 'Fecha movimiento extracto');
INSERT INTO NOMBRES_CAMPOS (NOMBRE, DESCRIPCION) VALUES ('COBN_MONTO', 'Monto movimiento extracto');
INSERT INTO NOMBRES_CAMPOS (NOMBRE, DESCRIPCION) VALUES ('COBN_REF', 'Número referencia movimiento extracto');
commit work;

alter table CONCILIACION_BANCARIA add constraint FK_CONCILIACION_BANCARIA_1
foreign key (COBN_ID) references CONCILIACION_ENCABEZADO(COBN_ID) on delete CASCADE on update CASCADE;

INSERT INTO CONFIGURACION (CONF_MODULO, CONF_CATEGORIA, CONF_PROPIEDAD, CONF_VALOR, CONF_POSIBLES, CONF_AYUDA) VALUES ('BANCOS', 'DOCUMENTOS', 'NUMERO DE CARACTERES A LEER COMO OPERACION EN CONCILIACION', '5', '4,5,6,7,8,9,10', 'Indique el número de caracteres iniciales del concepto a traducir como operación del banco al hacer la conciliación bancaria');
commit work;

INSERT INTO TIPO_DOCUMENTO (TIDO_COD, TIDO_NOMCORTO, TIDO_NOMLARGO, TIDO_MODULO, TIDO_INVE, TIDO_CART, TIDO_CXP, TIDO_CAJA, TIDO_BCOS) VALUES (80, 'CONCILIA', 'CONCILIACION BANCARIA', 'BANCOS', 'N', 'N', 'N', 'N', 'N');
COMMIT WORK;

SET TERM ^ ;

create trigger CONCILIACION_ENCABEZADO_BI for CONCILIACION_ENCABEZADO
active BEFORE INSERT position 0
as
declare variable NUMERO VARCHAR(6);
declare variable AUTOM CHAR(1);
declare variable EXISTE CHAR(1);
BEGIN
/* Actualice el contador del prefijo */
SELECT PRBA_NUMERO, PRBA_AUTO FROM PREFIJOS_BANCOS
    WHERE TIDO_COD = 80 AND CUBA_COD = NEW.CUBA_COD AND PRBA_PREF = NEW.cobn_prefijo INTO :NUMERO, :AUTOM;
/* ACTUALICE EL NUMERO EN COMPROBANTE_ENCABEZADO */
if (AUTOM = 'S') then
    BEGIN
    NEW.cobn_numero = NUMERO;
    NUMERO = CAST((CAST(NUMERO AS INTEGER) + 1) AS CHAR(6));
    UPDATE PREFIJOS_BANCOS
      SET PRBA_NUMERO = :NUMERO
    WHERE TIDO_COD = 80 AND CUBA_COD = NEW.CUBA_COD AND PRBA_PREF = NEW.cobn_prefijo;
    END
ELSE
    BEGIN
    if (CAST(NUMERO AS INTEGER) = CAST(NEW.cobn_numero AS INTEGER)) then
        UPDATE PREFIJOS_BANCOS
          SET PRBA_NUMERO = CAST((CAST(PRBA_NUMERO AS INTEGER) + 1) AS CHAR(6))
        WHERE TIDO_COD = 80 AND CUBA_COD = NEW.CUBA_COD AND PRBA_PREF = NEW.cobn_prefijo;
    END
EXECUTE PROCEDURE COMPLETA_CEROS (NEW.cobn_numero) returning_values (NEW.cobn_numero);
/* Verifique que el numero no existe previamente */
EXISTE = 'N';
SELECT 'S' FROM conciliacion_encabezado
    WHERE CUBA_COD = NEW.CUBA_COD AND COBN_PREFIJO = NEW.cobn_prefijo AND COBN_NUMERO = NEW.cobn_numero INTO :EXISTE;
if (EXISTE = 'S') then
    EXCEPTION DOCUMENTO_REGISTRADO;
end
^

SET TERM ; ^

GRANT SELECT,UPDATE,REFERENCES ON CONCILIACION_ENCABEZADO TO TRIGGER CONCILIACION_ENCABEZADO_BI;
GRANT SELECT,UPDATE ON PREFIJOS_BANCOS TO TRIGGER CONCILIACION_ENCABEZADO_BI;
GRANT EXECUTE ON PROCEDURE COMPLETA_CEROS TO TRIGGER CONCILIACION_ENCABEZADO_BI;

SET TERM ^ ;

CREATE OR ALTER TRIGGER CONCILIACION_ENCABEZADO_AI FOR CONCILIACION_ENCABEZADO
ACTIVE AFTER INSERT POSITION 0
as
begin
INSERT INTO AUDITORIA (AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD, AUDI_TICO)
    VALUES (USER, 80, NEW.cobn_id, 'I', NEW.cobn_prefijo || NEW.cobn_numero, NEW.cuba_cod);
end
^

SET TERM ; ^

GRANT UPDATE,REFERENCES ON CONCILIACION_ENCABEZADO TO TRIGGER CONCILIACION_ENCABEZADO_AI;
GRANT INSERT ON AUDITORIA TO TRIGGER CONCILIACION_ENCABEZADO_AI;

SET TERM ^ ;

CREATE OR ALTER TRIGGER CONCILIACION_ENCABEZADO_AU FOR CONCILIACION_ENCABEZADO
ACTIVE AFTER UPDATE POSITION 0
as
begin
IF (NEW.cobn_anulado = 'S') then
    INSERT INTO AUDITORIA (AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD, AUDI_TICO)
        VALUES (USER, 80, new.cobn_id, 'A', NEW.cobn_prefijo || NEW.cobn_numero, NEW.cuba_cod);
ELSE
    INSERT INTO AUDITORIA (AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD, AUDI_TICO)
        VALUES (USER, 80, new.cobn_id, 'U', NEW.cobn_prefijo || NEW.cobn_numero, NEW.cuba_cod);
end
^

SET TERM ; ^

GRANT UPDATE,REFERENCES ON CONCILIACION_ENCABEZADO TO TRIGGER CONCILIACION_ENCABEZADO_AU;
GRANT INSERT ON AUDITORIA TO TRIGGER CONCILIACION_ENCABEZADO_AU;

SET TERM ^ ;

create trigger CONCILIACION_ENCABEZADO_AD for CONCILIACION_ENCABEZADO
active AFTER DELETE position 0
as
begin
INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD, AUDI_TICO)
    VALUES (USER, 80, OLD.cobn_id, 'D', OLD.cobn_prefijo || OLD.cobn_numero, OLD.cuba_cod);
end
^

SET TERM ; ^

GRANT UPDATE,REFERENCES ON CONCILIACION_ENCABEZADO TO TRIGGER CONCILIACION_ENCABEZADO_AD;
GRANT INSERT ON AUDITORIA TO TRIGGER CONCILIACION_ENCABEZADO_AD;

ALTER TABLE CONCILIACION_BANCARIA ADD COBN_CLASE CHAR(1);

SET TERM ^ ;

CREATE OR ALTER PROCEDURE CONCILIA_BANCO(
    ID INTEGER)
AS
declare variable FECINI DATE;
declare variable FECFIN DATE;
declare variable ITEM INTEGER;
declare variable DB CHAR(1);
declare variable CUENTA INTEGER;
declare variable TIPODOC INTEGER;
declare variable IDDOC INTEGER;
declare variable PREFIJO VARCHAR(4);
declare variable NUMERO VARCHAR(6);
declare variable FECHA DATE;
declare variable CONCEPTO VARCHAR(60);
declare variable MONTO NUMERIC(18,2);
begin
select CUBA_COD, COBN_FECINI, COBN_FECFIN FROM conciliacion_encabezado WHERE COBN_ID = :ID INTO :CUENTA, :FECINI, :FECFIN;
/* COMPARE LA TABLA CON LOS MOVIMIENTOS DEL BANCO */
FOR SELECT COBN_ITEM, ABS(COBN_MONTO), COBN_FEC, COBN_TIPODOC, COBN_DB, COBN_CONC
    FROM CONCILIACION_BANCARIA
    WHERE COBN_ID = :ID AND ((COBN_IDDOC = 0) or (cobn_iddoc is null))
    INTO :ITEM, :MONTO, :FECHA, :TIPODOC, :DB, :concepto
    DO
    BEGIN
    PREFIJO = '';
    NUMERO = '';
    IDDOC = 0;
    /* BUSQUE LA OPERACION  */
    if (TIPODOC <> 0) then
        BEGIN
        SELECT FIRST 1 MOBA_PREF, MOBA_NUMERO, MOBA_IDREF
            FROM movimiento_banco M WHERE MOBA_TIPODOC = :tipodoc AND MOBA_TOTAL = :MONTO AND
                NOT EXISTS (SELECT COBN_ITEM FROM CONCILIACION_BANCARIA WHERE COBN_IDDOC = m.moba_idref AND COBN_TIPODOC = :tipodoc)
            ORDER BY ABS(MOBA_FECHA - :FECHA)
            INTO :prefijo, :numero, :IDDOC;
        if (PREFIJO <> '') then
            BEGIN
            UPDATE conciliacion_bancaria SET COBN_PREFIJO = :PREFIJO, COBN_NUMERO = :NUMERO, COBN_IDDOC = :iddoc, COBN_OK = 'S', COBN_CLASE = '0'
                WHERE COBN_ID = :ID AND COBN_ITEM = :ITEM;
            END
        ELSE
            BEGIN
            /* BUSQUELO COMO DEBITO O CREDITO SIN IMPORTAR EL TIPO */
            SELECT FIRST 1 MOBA_PREF, MOBA_NUMERO, MOBA_IDREF
                FROM movimiento_banco M WHERE MOBA_DB = :DB AND MOBA_TOTAL = :MONTO AND
                    NOT EXISTS (SELECT COBN_ITEM FROM CONCILIACION_BANCARIA WHERE COBN_IDDOC = m.moba_idref AND COBN_TIPODOC = :tipodoc)
                ORDER BY ABS(MOBA_FECHA - :FECHA)
                INTO :prefijo, :numero, :IDDOC;
            if (PREFIJO <> '') then
                BEGIN
                UPDATE conciliacion_bancaria SET COBN_PREFIJO = :PREFIJO, COBN_NUMERO = :NUMERO, COBN_IDDOC = :iddoc, COBN_OK = 'S', COBN_CLASE = '0'
                    WHERE COBN_ID = :ID AND COBN_ITEM = :ITEM;
                END
            ELSE
                BEGIN
                if (DB = 'N') then
                    UPDATE conciliacion_bancaria SET COBN_OK = 'N', COBN_CLASE = '2'
                        WHERE COBN_ID = :ID AND COBN_ITEM = :ITEM;
                else
                    UPDATE conciliacion_bancaria SET COBN_OK = 'N', COBN_CLASE = '1'
                        WHERE COBN_ID = :ID AND COBN_ITEM = :ITEM;
                END
            END
        END
    ELSE
        BEGIN
        /* BUSQUELO COMO DEBITO O CREDITO SIN IMPORTAR EL TIPO */
        SELECT FIRST 1 MOBA_PREF, MOBA_NUMERO, MOBA_IDREF, MOBA_TIPODOC
            FROM movimiento_banco M WHERE MOBA_DB = :DB AND MOBA_TOTAL = :MONTO AND
                NOT EXISTS (SELECT COBN_ITEM FROM CONCILIACION_BANCARIA WHERE COBN_IDDOC = m.moba_idref AND COBN_DB = :DB)
            ORDER BY ABS(MOBA_FECHA - :FECHA)
            INTO :prefijo, :numero, :IDDOC, :TIPODOC;
        if (PREFIJO <> '') then
            BEGIN
            UPDATE conciliacion_bancaria SET COBN_PREFIJO = :PREFIJO, COBN_NUMERO = :NUMERO, COBN_IDDOC = :iddoc, COBN_TIPODOC = :TIPODOC, COBN_OK = 'S', COBN_CLASE = '0'
                WHERE COBN_ID = :ID AND COBN_ITEM = :ITEM;
            END
        ELSE
            BEGIN
            if (DB = 'N') then
                UPDATE conciliacion_bancaria SET COBN_OK = 'N', COBN_CLASE = '2'
                    WHERE COBN_ID = :ID AND COBN_ITEM = :ITEM;
            else
                UPDATE conciliacion_bancaria SET COBN_OK = 'N', COBN_CLASE = '1'
                    WHERE COBN_ID = :ID AND COBN_ITEM = :ITEM;
            END
        END
    END
/* AGREGUE LOS DOCUMENTOS SIN UBICAR */
SELECT MAX(COBN_ITEM) FROM conciliacion_bancaria WHERE COBN_ID = :ID INTO :item;
FOR SELECT MOBA_PREF, MOBA_NUMERO, MOBA_FECHA, MOBA_TOTAL, MOBA_CONCEPTO, MOBA_TIPODOC, MOBA_IDREF, MOBA_DB
    FROM MOVIMIENTO_BANCO M
    WHERE MOBA_FECHA >= :FECINI AND MOBA_FECHA <= :FECFIN AND
        NOT EXISTS (SELECT COBN_ITEM FROM conciliacion_bancaria WHERE COBN_TIPODOC = M.moba_tipodoc AND COBN_IDDOC = M.moba_idref)
    INTO :prefijo, :numero, :fecha, :monto, :concepto, :tipodoc, :iddoc, :DB
    DO
    BEGIN
    ITEM = ITEM + 1;
    if (DB = 'N') then
        INSERT INTO conciliacion_bancaria (CUBA_COD, COBN_ID, COBN_ITEM, COBN_FEC, COBN_PREFIJO, COBN_NUMERO, COBN_MONTO, COBN_TIPODOC, COBN_ANULADO, COBN_OK, COBN_CONC, COBN_IDDOC, COBN_DB, COBN_CLASE)
            VALUES (:CUENTA, :ID, :ITEM, :FECHA, :PREFIJO, :NUMERO, :monto, :TIPODOC, 'N', 'N', :concepto, :iddoc, :DB, '4');
    else
        INSERT INTO conciliacion_bancaria (CUBA_COD, COBN_ID, COBN_ITEM, COBN_FEC, COBN_PREFIJO, COBN_NUMERO, COBN_MONTO, COBN_TIPODOC, COBN_ANULADO, COBN_OK, COBN_CONC, COBN_IDDOC, COBN_DB, COBN_CLASE)
            VALUES (:CUENTA, :ID, :ITEM, :FECHA, :PREFIJO, :NUMERO, :monto, :TIPODOC, 'N', 'N', :concepto, :iddoc, :DB, '3');
    END
end
^

SET TERM ; ^

GRANT SELECT ON CONCILIACION_ENCABEZADO TO PROCEDURE CONCILIA_BANCO;
GRANT SELECT,INSERT,UPDATE ON CONCILIACION_BANCARIA TO PROCEDURE CONCILIA_BANCO;
GRANT SELECT ON MOVIMIENTO_BANCO TO PROCEDURE CONCILIA_BANCO;

ALTER TABLE CONCILIACION_ENCABEZADO ADD COBN_EXTRACTOINI T_MONTO;
ALTER TABLE CONCILIACION_ENCABEZADO ADD COBN_EXTRACTOFIN T_MONTO;

/* 20080820 */

UPDATE CONFIGURACION
SET CONF_CATEGORIA = 'DOCUMENTOS'
WHERE (CONF_MODULO = 'COMPRAS') AND (CONF_CATEGORIA = 'FACTURAS') AND (CONF_PROPIEDAD = 'PERMITIR CANTIDADES MAYORES A LAS ORDENADAS');
COMMIT WORK;




/* 20080821 */
SET TERM ^ ;

CREATE OR ALTER PROCEDURE COMPRAS_ARTICULO_MES(
    fecini date,
    fecfin date,
    SUCURSAL INTEGER)
RETURNS (
    ARTICULO VARCHAR(15),
    DESCRIPCION VARCHAR(60),
    CODGRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    CODSUBG VARCHAR(3),
    NOMSUBG VARCHAR(30),
    CODMARC VARCHAR(3),
    NOMMARC VARCHAR(30),
    UNIDAD VARCHAR(8),
    CANTVTAS NUMERIC(18,4),
    BASEVTAS NUMERIC(18,2),
    IVAVTAS NUMERIC(18,2),
    CANTDEV NUMERIC(18,4),
    BASEDEV NUMERIC(18,2),
    IVADEV NUMERIC(18,2))
AS
BEGIN
  FOR SELECT ARTI_COD, ARTI_DES, ARTI_UNIDAD, A.GRUP_COD, A.SUBG_COD, A.MARC_COD FROM ARTICULO A
      INTO :ARTICULO, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
  DO
    BEGIN
    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
    EXECUTE PROCEDURE COMPRAS_ARTICULO (:ARTICULO, :FECINI, :FECFIN, :SUCURSAL) returning_values (CANTVTAS, BASEVTAS, CANTDEV, BASEDEV, IVAVTAS, IVADEV);
    if ((CANTVTAS <> 0) or (CANTDEV <> 0)) then
        SUSPEND;
    END
END
^

SET TERM ; ^

GRANT SELECT ON ARTICULO TO PROCEDURE COMPRAS_ARTICULO_MES;
GRANT SELECT ON GRUPO TO PROCEDURE COMPRAS_ARTICULO_MES;
GRANT SELECT ON MARCAS TO PROCEDURE COMPRAS_ARTICULO_MES;
GRANT SELECT ON SUBGRUPO TO PROCEDURE COMPRAS_ARTICULO_MES;
GRANT EXECUTE ON PROCEDURE COMPRAS_ARTICULO TO PROCEDURE COMPRAS_ARTICULO_MES;

SET TERM ^ ;

CREATE OR ALTER PROCEDURE COMPRAS_PROVEEDOR_MES(
    FECINI DATE,
    FECFIN DATE,
    SUCURSAL INTEGER)
RETURNS (
    NIT VARCHAR(20),
    NOMBRE VARCHAR(60),
    FACTURAS INTEGER,
    MFACTURAS NUMERIC(18,2),
    DEVOLUCIONES INTEGER,
    MDEVOLUCIONES NUMERIC(18,2),
    IVAFACT NUMERIC(18,2),
    IVADEV NUMERIC(18,2))
AS
BEGIN
  for select TERC_NIT, TERC_NOM from TERCEROS WHERE TERC_PROV = 'S' into :NIT, :NOMBRE
  DO
    BEGIN
    EXECUTE PROCEDURE COMPRAS_PROVEEDOR (NIT, FECINI, FECFIN, SUCURSAL) returning_values (FACTURAS, MFACTURAS, DEVOLUCIONES, MDEVOLUCIONES, IVAFACT, IVADEV);
    SUSPEND;
    END
END
^

SET TERM ; ^

GRANT SELECT ON TERCEROS TO PROCEDURE COMPRAS_PROVEEDOR_MES;
GRANT EXECUTE ON PROCEDURE COMPRAS_PROVEEDOR TO PROCEDURE COMPRAS_PROVEEDOR_MES;

/* 20080822 */
/* mostraban los articulos .t */

SET TERM ^ ;

CREATE OR ALTER PROCEDURE MOVIMIENTO_ARTICULO_DESDE_HASTA(
    FECINI DATE,
    FECFIN DATE,
    SUCURSAL INTEGER)
RETURNS (
    INICIAL NUMERIC(18,4),
    ENTRADAS NUMERIC(18,4),
    SALIDAS NUMERIC(18,4),
    FINAL NUMERIC(18,4),
    CODIGO VARCHAR(15),
    NOMBRE VARCHAR(60),
    UNIDAD VARCHAR(8),
    CODGRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    CODSUBG VARCHAR(3),
    NOMSUBG VARCHAR(17),
    CODMARC VARCHAR(3),
    NOMMARC VARCHAR(30),
    CODBOD VARCHAR(2),
    NOMBOD VARCHAR(30))
AS
BEGIN
  FOR
    SELECT ARTI_COD, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD, BODE_COD, BODE_NOM
        FROM ARTICULO A, BODEGA B
        WHERE (SUCU_ID = :SUCURSAL) or (:SUCURSAL = 0)
      INTO :CODIGO, :NOMBRE, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :CODBOD, NOMBOD
      DO
        BEGIN
        NOMMARC = '';
        NOMSUBG = '';
        SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
        SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
        SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
        EXECUTE PROCEDURE SALDO_INICIAL_INVENTARIO(CODIGO, FECINI, :CODBOD) returning_values (INICIAL);
        SELECT SUM(MVAR_CANT) FROM MOVIMIENTO_ARTICULO
          WHERE (MVAR_FECHA >= :FECINI) AND (MVAR_FECHA < :FECFIN) AND
          (ARTI_COD = :codigo) AND (BODE_COD = :CODBOD) AND (MVAR_ENTRADA = 'S') INTO :ENTRADAS;
        if (ENTRADAS IS NULL) then
          ENTRADAS = 0;
        SELECT SUM(MVAR_CANT) FROM MOVIMIENTO_ARTICULO
          WHERE (MVAR_FECHA >= :FECINI) AND (MVAR_FECHA < :FECFIN) AND
          (ARTI_COD = :CODIGO) AND (BODE_COD = :CODBOD) AND (MVAR_ENTRADA = 'N') INTO :SALIDAS;
        if (SALIDAS IS NULL) then
          SALIDAS = 0;
        FINAL = INICIAL + ENTRADAS - SALIDAS;
        SUSPEND;
        END
END
^

SET TERM ; ^

GRANT SELECT ON ARTICULO TO PROCEDURE MOVIMIENTO_ARTICULO_DESDE_HASTA;
GRANT SELECT ON BODEGA TO PROCEDURE MOVIMIENTO_ARTICULO_DESDE_HASTA;
GRANT SELECT ON GRUPO TO PROCEDURE MOVIMIENTO_ARTICULO_DESDE_HASTA;
GRANT SELECT ON MARCAS TO PROCEDURE MOVIMIENTO_ARTICULO_DESDE_HASTA;
GRANT SELECT ON SUBGRUPO TO PROCEDURE MOVIMIENTO_ARTICULO_DESDE_HASTA;
GRANT EXECUTE ON PROCEDURE SALDO_INICIAL_INVENTARIO TO PROCEDURE MOVIMIENTO_ARTICULO_DESDE_HASTA;
GRANT SELECT ON MOVIMIENTO_ARTICULO TO PROCEDURE MOVIMIENTO_ARTICULO_DESDE_HASTA;

SET TERM ^ ;

CREATE OR ALTER PROCEDURE MOVIMIENTO_INVENTARIO_MES(
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    CODIGO VARCHAR(15),
    DESCRIPCION VARCHAR(60),
    INICIAL NUMERIC(18,4),
    ENTRADA NUMERIC(18,4),
    SALIDA NUMERIC(18,4),
    FINAL NUMERIC(18,4))
AS
BEGIN
  for select arti_cod, arti_des from articulo where substring(arti_cod from 1 FOR 2) <> '.t' order by arti_des into :CODIGO, :DESCRIPCION
  DO
    BEGIN
    EXECUTE PROCEDURE MOVIMIENTO_TOTAL_ARTICULO_MES(CODIGO, FECINI, FECFIN) returning_values (:INICIAL, :ENTRADA, :SALIDA);
    FINAL = INICIAL + ENTRADA - SALIDA;
    SUSPEND;
    END
END
^

SET TERM ; ^

GRANT SELECT ON ARTICULO TO PROCEDURE MOVIMIENTO_INVENTARIO_MES;
GRANT EXECUTE ON PROCEDURE MOVIMIENTO_TOTAL_ARTICULO_MES TO PROCEDURE MOVIMIENTO_INVENTARIO_MES;

SET TERM ^ ;

CREATE OR ALTER PROCEDURE KARDEX_INVENTARIO_MES(
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    CODIGO VARCHAR(15),
    DESCRIPCION VARCHAR(60),
    INICIAL NUMERIC(18,2),
    ENTRADA NUMERIC(18,2),
    SALIDA NUMERIC(18,2),
    FINAL NUMERIC(18,2))
AS
BEGIN
  for select arti_cod, arti_des from articulo where substring(arti_cod from 1 FOR 2) <> '.t' into :CODIGO, :DESCRIPCION
  DO
    BEGIN
    EXECUTE PROCEDURE KARDEX_ARTICULO_MES(CODIGO, FECINI, FECFIN) returning_values (:INICIAL, :ENTRADA, :SALIDA);
    FINAL = INICIAL + ENTRADA - SALIDA;
    SUSPEND;
    END
END
^

SET TERM ; ^

GRANT SELECT ON ARTICULO TO PROCEDURE KARDEX_INVENTARIO_MES;
GRANT EXECUTE ON PROCEDURE KARDEX_ARTICULO_MES TO PROCEDURE KARDEX_INVENTARIO_MES;

/* TRASLADOS ENTRE BODEGAS LLAMANDO UNA ORDEN PREVIA */
ALTER TABLE TRASFERENCIAS
ADD TRAN_ORDEN VARCHAR(10);
ALTER TABLE TRASFERENCIAS
ADD TRAN_ORDENID T_ID;

SET TERM ^ ;

CREATE OR ALTER TRIGGER TRASFERENCIAS_AI FOR TRASFERENCIAS
ACTIVE AFTER INSERT POSITION 0
as
begin
IF (NEW.TRAN_ID <> 0) THEN
  BEGIN
  /* ANULE LA ORDEN SI LA HAY*/
  if ((new.tran_ordenid <> 0) and (new.tran_ordenid is not null)) then
     update ordenes_inventario set ORIN_ANULADO = 'S' where ORIN_ID = new.tran_ordenid;
  INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
    VALUES (USER, 13, NEW.tran_id, 'I', NEW.pref_pre || NEW.tran_numero);
  END
end
^

SET TERM ; ^

GRANT UPDATE,REFERENCES ON TRASFERENCIAS TO TRIGGER TRASFERENCIAS_AI;
GRANT SELECT,UPDATE ON ORDENES_INVENTARIO TO TRIGGER TRASFERENCIAS_AI;
GRANT INSERT ON AUDITORIA TO TRIGGER TRASFERENCIAS_AI;

SET TERM ^ ;

CREATE OR ALTER TRIGGER TRASFERENCIAS_AU FOR TRASFERENCIAS
ACTIVE AFTER UPDATE POSITION 0
AS
declare variable consec INTEGER;
BEGIN
/* borre la contabilizacion */
if (new.tran_anulado = 'S') then
    begin
    if ((old.tran_ordenid <> 0) and (old.tran_ordenid is not null)) then
        update ordenes_inventario set ORIN_ANULADO = 'N' where ORIN_ID = old.tran_ordenid;
    select enco_consec from comprobante_encabezado where enco_tiporef = 13 and enco_idref = old.tran_id into :consec;
    if (NOT consec is null) then
     delete from comprobante_detalle where enco_consec = :consec;
    delete from comprobante_encabezado where enco_tiporef = 13 and enco_idref = old.tran_id;
    INSERT INTO AUDITORIA (AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
        VALUES (USER, 13, new.tran_id, 'A', NEW.pref_pre || NEW.tran_numero);
    end
ELSE
    INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
        VALUES (USER, 13, NEW.tran_id, 'U', NEW.pref_pre || NEW.tran_numero);

if ((OLD.pref_pre <> NEW.pref_pre) or
    (OLD.tran_numero <> NEW.tran_numero) or
    (OLD.tran_fecha <> NEW.tran_fecha) or
    (OLD.tran_confirma <> NEW.tran_confirma)) then
    UPDATE TRASFERENCIAS_DETALLE SET TRAS_CONFIRMA = NEW.tran_confirma
        WHERE TRAN_ID = NEW.TRAN_ID;
if (OLD.tran_anulado <> NEW.tran_anulado) then
    UPDATE TRASFERENCIAS_DETALLE SET TRAS_ANULADO = NEW.TRAN_anulado
        WHERE TRAN_ID = NEW.TRAN_ID;
if (OLD.tran_transmit <> NEW.tran_transmit) then
    UPDATE TRASFERENCIAS_DETALLE SET TRAS_TRANSMIT = NEW.tran_transmit
        WHERE TRAN_ID = NEW.TRAN_ID;
END
^

SET TERM ; ^

GRANT UPDATE,REFERENCES ON TRASFERENCIAS TO TRIGGER TRASFERENCIAS_AU;
GRANT SELECT,UPDATE ON ORDENES_INVENTARIO TO TRIGGER TRASFERENCIAS_AU;
GRANT SELECT,DELETE ON COMPROBANTE_ENCABEZADO TO TRIGGER TRASFERENCIAS_AU;
GRANT SELECT,DELETE ON COMPROBANTE_DETALLE TO TRIGGER TRASFERENCIAS_AU;
GRANT INSERT ON AUDITORIA TO TRIGGER TRASFERENCIAS_AU;
GRANT SELECT,UPDATE ON TRASFERENCIAS_DETALLE TO TRIGGER TRASFERENCIAS_AU;

SET TERM ^ ;

CREATE OR ALTER TRIGGER TRASFERENCIAS_AD FOR TRASFERENCIAS
ACTIVE AFTER DELETE POSITION 0
as
declare variable consec INTEGER;
begin
if ((old.tran_ordenid <> 0) and (old.tran_ordenid is not null)) then
    update ordenes_inventario set ORIN_ANULADO = 'N' where ORIN_ID = old.tran_ordenid;
select enco_consec from comprobante_encabezado where enco_tiporef = 13 and enco_idref = old.tran_id into :consec;
if (NOT consec is null) then
 delete from comprobante_detalle where enco_consec = :consec;
delete from comprobante_encabezado where enco_tiporef = 13 and enco_idref = old.tran_id;

INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
    VALUES (USER, 13, OLD.tran_id, 'D', OLD.pref_pre || OLD.tran_numero);
end
^

SET TERM ; ^

GRANT UPDATE,REFERENCES ON TRASFERENCIAS TO TRIGGER TRASFERENCIAS_AD;
GRANT SELECT,UPDATE ON ORDENES_INVENTARIO TO TRIGGER TRASFERENCIAS_AD;
GRANT SELECT,DELETE ON COMPROBANTE_ENCABEZADO TO TRIGGER TRASFERENCIAS_AD;
GRANT SELECT,DELETE ON COMPROBANTE_DETALLE TO TRIGGER TRASFERENCIAS_AD;
GRANT INSERT ON AUDITORIA TO TRIGGER TRASFERENCIAS_AD;

INSERT INTO CONFIGURACION (CONF_MODULO, CONF_CATEGORIA, CONF_PROPIEDAD, CONF_VALOR, CONF_POSIBLES, CONF_AYUDA) VALUES ('INVENTARIO', 'TRASLADOS', 'VERIFICAR CODIGOS DE LA ORDEN', 'NO', 'SI,NO', 'SI: Al hacer la entrada con base en una orden no se copian automáticamente los códigos pero si se verifica que corresponda a lo ordenado. NO: Trae automáticamente el contenido de la orden al traslado');
COMMIT WORK;

/* 20080823 */
SET TERM ^ ;

CREATE OR ALTER PROCEDURE BUSCA_ID_DOC(
    TIPO INTEGER,
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(6))
RETURNS (
    ID INTEGER)
AS
BEGIN
ID = 0;
EXECUTE PROCEDURE COMPLETA_CEROS(NUMERO) returning_values (NUMERO);
if (TIPO = 11) then
    SELECT ENTR_ID FROM entradas WHERE PREF_PRE = :PREFIJO AND ENTR_NUMERO = :NUMERO INTO :ID;
if (TIPO = 12) then
    SELECT SALI_ID FROM SALIDAS WHERE PREF_PRE = :PREFIJO AND SALI_NUMERO = :NUMERO INTO :ID;
if (TIPO = 13) then
    SELECT TRAN_ID FROM trasferencias WHERE PREF_PRE = :PREFIJO AND TRAN_NUMERO = :NUMERO INTO :ID;
if (TIPO = 14) then
    SELECT AJUS_ID FROM ajustes WHERE PREF_PRE = :PREFIJO AND AJUS_NUMERO = :NUMERO INTO :ID;
if (TIPO = 15) then
    SELECT ENSA_ID FROM ensambles WHERE PREF_PRE = :PREFIJO AND ENSA_NUMERO = :NUMERO INTO :ID;
if (TIPO = 16) then
    SELECT DESE_ID FROM desensambles WHERE PREF_PRE = :PREFIJO AND DESE_NUMERO = :NUMERO INTO :ID;
if (TIPO = 21) then
    SELECT FACO_ID FROM FACTURAS_COMPRA WHERE PREF_PRE = :PREFIJO AND FACO_NUMERO = :NUMERO INTO :ID;
if (TIPO = 24) then
    SELECT DVCO_ID FROM devoluciones_compras WHERE PREF_PRE = :PREFIJO AND DVCO_NUMERO = :NUMERO INTO :ID;
if (TIPO = 31) then
    SELECT FACT_ID FROM FACTURAS WHERE PREF_PRE = :PREFIJO AND FACT_NUMERO = :NUMERO INTO :ID;
if (TIPO = 33) then
    SELECT DEVT_ID FROM devoluciones_ventas WHERE PREF_PRE = :PREFIJO AND DEVT_NUMERO = :NUMERO INTO :ID;
if (TIPO = 41) then
    SELECT NDCL_ID FROM NOTAS_DEBITO_CLIENTES WHERE PREF_PRE = :PREFIJO AND NDCL_NUMERO = :NUMERO INTO :ID;
if (TIPO = 42) then
    SELECT NCCL_ID FROM NOTAS_CREDITO_CLIENTES WHERE PREF_PRE = :PREFIJO AND NCCL_NUMERO = :NUMERO INTO :ID;
if (TIPO = 43) then
    SELECT APCL_ID FROM aplicacion_cliente WHERE PREF_PRE = :PREFIJO AND APCL_NUMERO = :NUMERO INTO :ID;
if (TIPO = 45) then
    SELECT ANCL_ID FROM ANTICIPOS_CLIENTE WHERE PREF_PRE = :PREFIJO AND ANCL_NUMERO = :NUMERO INTO :ID;
if (TIPO = 77) then
    SELECT DVCH_ID FROM devolucion_cheques WHERE PRBA_PREf = :PREFIJO AND DVCH_NUMDOC = :NUMERO INTO :ID;
if (TIPO = 51) then
    SELECT NDPR_ID FROM NOTAS_DEBITO_PROVEEDOR WHERE PREF_PRE = :PREFIJO AND NDPR_NUMERO = :NUMERO INTO :ID;
if (TIPO = 52) then
    SELECT NCPR_ID FROM NOTAS_CREDITO_PROVEEDOR WHERE PREF_PRE = :PREFIJO AND NCPR_NUMERO = :NUMERO INTO :ID;
if (TIPO = 53) then
    SELECT APPR_ID FROM aplicacion_provedor WHERE PREF_PRE = :PREFIJO AND APPR_NUMERO = :NUMERO INTO :ID;
if (TIPO = 55) then
    SELECT ANPR_ID FROM ANTICIPOS_PROVEEDOR WHERE PREF_PRE = :PREFIJO AND ANPR_NUMERO = :NUMERO INTO :ID;
if (TIPO = 61) then
    SELECT RECA_ID FROM recibos_caja WHERE PREF_PRE = :PREFIJO AND RECA_NUMERO = :NUMERO INTO :ID;
if (TIPO = 62) then
    SELECT EGRE_ID FROM EGRESOS WHERE PREF_PRE = :PREFIJO AND EGRE_NUMERO = :NUMERO INTO :ID;
if (TIPO = 64) then
    SELECT COTJ_ID FROM consigna_tarjetas WHERE PREF_PRE = :PREFIJO AND COTJ_NUMERO = :NUMERO INTO :ID;
if (TIPO = 66) then
    SELECT TRCJ_ID FROM traslados_caja WHERE PREF_PRE = :PREFIJO AND TRCJ_NUMERO = :NUMERO INTO :ID;
if (TIPO = 71) then
    SELECT FIRST 1 CONS_ID FROM CONSIGNA WHERE PRBA_PREF = :PREFIJO AND CONS_NUMERO = :NUMERO INTO :ID;
if (TIPO = 72) then
    SELECT CHEQ_ID FROM CHEQUES WHERE PRBA_PREF = :PREFIJO AND CHEQ_NUMERO = :NUMERO INTO :ID;
if (TIPO = 73) then
    SELECT FIRST 1 RETI_ID FROM RETIROS WHERE PRBA_PREF = :PREFIJO AND RETI_NUMERO = :NUMERO INTO :ID;
if (TIPO = 74) then
    SELECT FIRST 1 NDBC_ID FROM notas_debito WHERE PRBA_PREF = :PREFIJO AND NDBC_NUMERO = :NUMERO INTO :ID;
if (TIPO = 75) then
    SELECT FIRST 1 NCBC_ID FROM notas_credito WHERE PRBA_PREF = :PREFIJO AND NCBC_NUMERO = :NUMERO INTO :ID;
if (TIPO = 76) then
    SELECT FIRST 1 TRAS_ID FROM traslados WHERE PRBA_PREF = :PREFIJO AND TRAS_NUMERO = :NUMERO INTO :ID;
if (TIPO = 77) then
    SELECT FIRST 1 DVCH_ID FROM devolucion_cheques WHERE PRBA_PREF = :PREFIJO AND DVCH_NUMDOC = :NUMERO INTO :ID;
SUSPEND;
END
^

SET TERM ; ^

GRANT EXECUTE ON PROCEDURE COMPLETA_CEROS TO PROCEDURE BUSCA_ID_DOC;
GRANT SELECT ON ENTRADAS TO PROCEDURE BUSCA_ID_DOC;
GRANT SELECT ON SALIDAS TO PROCEDURE BUSCA_ID_DOC;
GRANT SELECT ON TRASFERENCIAS TO PROCEDURE BUSCA_ID_DOC;
GRANT SELECT ON AJUSTES TO PROCEDURE BUSCA_ID_DOC;
GRANT SELECT ON ENSAMBLES TO PROCEDURE BUSCA_ID_DOC;
GRANT SELECT ON DESENSAMBLES TO PROCEDURE BUSCA_ID_DOC;
GRANT SELECT ON FACTURAS_COMPRA TO PROCEDURE BUSCA_ID_DOC;
GRANT SELECT ON DEVOLUCIONES_COMPRAS TO PROCEDURE BUSCA_ID_DOC;
GRANT SELECT ON FACTURAS TO PROCEDURE BUSCA_ID_DOC;
GRANT SELECT ON DEVOLUCIONES_VENTAS TO PROCEDURE BUSCA_ID_DOC;
GRANT SELECT ON NOTAS_DEBITO_CLIENTES TO PROCEDURE BUSCA_ID_DOC;
GRANT SELECT ON NOTAS_CREDITO_CLIENTES TO PROCEDURE BUSCA_ID_DOC;
GRANT SELECT ON APLICACION_CLIENTE TO PROCEDURE BUSCA_ID_DOC;
GRANT SELECT ON ANTICIPOS_CLIENTE TO PROCEDURE BUSCA_ID_DOC;
GRANT SELECT ON DEVOLUCION_CHEQUES TO PROCEDURE BUSCA_ID_DOC;
GRANT SELECT ON NOTAS_DEBITO_PROVEEDOR TO PROCEDURE BUSCA_ID_DOC;
GRANT SELECT ON NOTAS_CREDITO_PROVEEDOR TO PROCEDURE BUSCA_ID_DOC;
GRANT SELECT ON APLICACION_PROVEDOR TO PROCEDURE BUSCA_ID_DOC;
GRANT SELECT ON ANTICIPOS_PROVEEDOR TO PROCEDURE BUSCA_ID_DOC;
GRANT SELECT ON RECIBOS_CAJA TO PROCEDURE BUSCA_ID_DOC;
GRANT SELECT ON EGRESOS TO PROCEDURE BUSCA_ID_DOC;
GRANT SELECT ON CONSIGNA_TARJETAS TO PROCEDURE BUSCA_ID_DOC;
GRANT SELECT ON TRASLADOS_CAJA TO PROCEDURE BUSCA_ID_DOC;
GRANT SELECT ON CONSIGNA TO PROCEDURE BUSCA_ID_DOC;
GRANT SELECT ON CHEQUES TO PROCEDURE BUSCA_ID_DOC;
GRANT SELECT ON RETIROS TO PROCEDURE BUSCA_ID_DOC;
GRANT SELECT ON NOTAS_DEBITO TO PROCEDURE BUSCA_ID_DOC;
GRANT SELECT ON NOTAS_CREDITO TO PROCEDURE BUSCA_ID_DOC;
GRANT SELECT ON TRASLADOS TO PROCEDURE BUSCA_ID_DOC;
grant EXECUTE on PROCEDURE BUSCA_ID_DOC to PUBLIC;


/* 20080824 */
SET TERM ^ ;

CREATE OR ALTER PROCEDURE MOVIMIENTO_CARTERA_MES(
    FECINI DATE,
    FECFIN DATE,
    SUBEMPRESA INTEGER,
    CONTADO CHAR(1))
RETURNS (
    NIT VARCHAR(20),
    NOMBRE VARCHAR(60),
    CONTACTO VARCHAR(60),
    DIASMAX INTEGER,
    TELEFONO VARCHAR(40),
    INICIAL NUMERIC(18,2),
    DEBITOS NUMERIC(18,2),
    CREDITOS NUMERIC(18,2),
    ABONOS NUMERIC(18,2),
    FINAL NUMERIC(18,2))
AS
declare variable RETES CHAR(2);
declare variable TIPODOC INTEGER;
declare variable IDDOC INTEGER;
declare variable SALDO NUMERIC(18,2);
declare variable NUMROWS INTEGER;
BEGIN
  for select TERC_NIT, TERC_NOM, TERC_CONTACTO, TERC_TEL from TERCEROS WHERE TERC_CLIE = 'S' into :NIT, :NOMBRE, :CONTACTO, :TELEFONO
  DO
    BEGIN
    diasmax = 0;
    SELECT COUNT(*) FROM AUTORIZACIONES WHERE AUTO_NITCONTADO = :NIT INTO :numrows;
    IF ((CONTADO = 'S') or (numrows = 0)) THEN
        BEGIN
        FECINI = FECINI - 1;
        INICIAL = 0;
        FOR SELECT MVCL_TIPOREF, MVCL_IDREF FROM MOVIMIENTO_CLIENTES
            WHERE TERC_NIT = :NIT AND MVCL_FECHA <= :FECINI AND
            MVCL_ABONO = 'N' AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA))
            INTO :TIPODOC, :IDDOC
            DO
            BEGIN
            EXECUTE PROCEDURE saldo_doc_cartera(TIPODOC, IDDOC, FECINI) returning_values (SALDO);
            INICIAL = INICIAL + SALDO;
            END
        EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'DESCONTAR RETENCIONES POR CAUSACION') returning_values(:RETES);
        FECINI = FECINI + 1;
        if (RETES = 'SI') then
            BEGIN
            SELECT SUM(MVCL_MONTO-MVCL_RTEFTE-MVCL_RTEIVA-MVCL_RTEICA), MAX(MVCL_VENCE-MVCL_FECHA) FROM movimiento_clientes
                WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND MVCL_FECHA < :FECFIN
                AND MVCL_DEBITO = 'S' AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA))
                INTO :DEBITOS, :diasmax;
            SELECT SUM(MVCL_MONTO-MVCL_RTEFTE-MVCL_RTEIVA-MVCL_RTEICA) FROM movimiento_clientes
                WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND MVCL_FECHA < :FECFIN
                AND MVCL_DEBITO = 'N' AND MVCL_ABONO = 'N' and MVCL_TIPOREF <> 45 AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA))
                INTO :CREDITOS;
            SELECT SUM(MVCL_MONTO) FROM movimiento_clientes
                WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND MVCL_FECHA < :FECFIN
                AND MVCL_ABONO = 'S' AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA))
                INTO :ABONOS;
            END
        ELSE
            BEGIN
            SELECT SUM(MVCL_MONTO), MAX(MVCL_VENCE-MVCL_FECHA) FROM movimiento_clientes
                WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND MVCL_FECHA < :FECFIN
                AND MVCL_DEBITO = 'S' AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA))
                INTO :DEBITOS, :DIASMAX;
            SELECT SUM(MVCL_MONTO) FROM movimiento_clientes
                WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND MVCL_FECHA < :FECFIN
                AND MVCL_DEBITO = 'N' AND MVCL_ABONO = 'N' and MVCL_TIPOREF <> 45 AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA))
                INTO :CREDITOS;
            SELECT SUM(MVCL_MONTO+MVCL_RTEFTE+MVCL_RTEIVA+MVCL_RTEICA) FROM movimiento_clientes
                WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND MVCL_FECHA < :FECFIN
                AND MVCL_ABONO = 'S' AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA))
                INTO :ABONOS;
            END
        if (DEBITOS IS NULL) then
            DEBITOS = 0;
        if (CREDITOS IS NULL) then
            CREDITOS = 0;
        if (ABONOS IS NULL) then
            ABONOS = 0;
        FINAL = INICIAL + DEBITOS - CREDITOS - ABONOS;
        SUSPEND;
        END
    END
END
^

SET TERM ; ^

GRANT SELECT ON TERCEROS TO PROCEDURE MOVIMIENTO_CARTERA_MES;
GRANT SELECT ON AUTORIZACIONES TO PROCEDURE MOVIMIENTO_CARTERA_MES;
GRANT SELECT ON MOVIMIENTO_CLIENTES TO PROCEDURE MOVIMIENTO_CARTERA_MES;
GRANT EXECUTE ON PROCEDURE SALDO_DOC_CARTERA TO PROCEDURE MOVIMIENTO_CARTERA_MES;
GRANT EXECUTE ON PROCEDURE LEE_CONFIGURACION TO PROCEDURE MOVIMIENTO_CARTERA_MES;

SET TERM ^ ;

CREATE OR ALTER PROCEDURE DETALLE_VENTAS_ARTICULO_VEND(
    ARTICULO VARCHAR(15),
    FECINI DATE,
    FECFIN DATE,
    VEND INTEGER)
RETURNS (
    TIPO VARCHAR(8),
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(6),
    ID INTEGER,
    FECDOC DATE,
    CANTIDAD NUMERIC(18,4),
    PRUNIT NUMERIC(18,2),
    DTO NUMERIC(9,2),
    IVA NUMERIC(18,2),
    TOTAL NUMERIC(18,2))
AS
BEGIN
  TIPO = 'FACTVENT';
  if ((VEND = 0) or (VEND IS NULL)) then
      FOR SELECT F.FACT_ID, PREF_PRE, FACT_NUMERO, FACT_FECHA, FADE_CANT * FADE_FACTOR, FADE_PRUNIT / FADE_FACTOR, FADE_DTOPORC, FADE_IVAMONTO, FADE_TOTAL
        FROM FACTURAS F, FACTURAS_DETALLE D
        WHERE F.FACT_ID = D.FACT_ID AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND ARTI_COD = :ARTICULO AND FACT_ANULADO = 'N'
        INTO :ID, :PREFIJO, :NUMERO, :FECDOC, :CANTIDAD, :PRUNIT, :DTO, :IVA, :TOTAL
        DO
        SUSPEND;
  ELSE
      FOR SELECT F.FACT_ID, PREF_PRE, FACT_NUMERO, FACT_FECHA, FADE_CANT * FADE_FACTOR, FADE_PRUNIT / FADE_FACTOR, FADE_DTOPORC, FADE_IVAMONTO, FADE_TOTAL
        FROM FACTURAS F, FACTURAS_DETALLE D
        WHERE F.FACT_ID = D.FACT_ID AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND ARTI_COD = :ARTICULO AND VEND_COD = :VEND AND FACT_ANULADO = 'N'
        INTO :ID, :PREFIJO, :NUMERO, :FECDOC, :CANTIDAD, :PRUNIT, :DTO, :IVA, :TOTAL
        DO
        SUSPEND;
    
  TIPO = 'DEVOLCLI';
  if ((VEND = 0) or (VEND IS NULL)) then
      FOR SELECT V.DEVT_ID, PREF_PRE, DEVT_NUMERO, DEVT_FECHA, DVDE_CANT * DVDE_FACTOR, DVDE_PRUNIT / DVDE_FACTOR, DVDE_DTOPORC, DVDE_IVAMONTO, DVDE_TOTAL
        FROM DEVOLUCIONES_VENTAS V, DEVOLUCIONES_VENTAS_DETALLE D
        WHERE V.DEVT_ID = D.DEVT_ID AND ARTI_COD = :ARTICULO AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND DEVT_ANULADO = 'N'
        INTO :ID, :PREFIJO, :NUMERO, :FECDOC, :CANTIDAD, :PRUNIT, :DTO, :IVA, :TOTAL
        DO
        BEGIN
        CANTIDAD = CANTIDAD * -1;
        IVA = IVA * -1;
        TOTAL = TOTAL * -1;
        SUSPEND;
        END
  ELSE
      FOR SELECT V.DEVT_ID, PREF_PRE, DEVT_NUMERO, DEVT_FECHA, DVDE_CANT * DVDE_FACTOR, DVDE_PRUNIT / DVDE_FACTOR, DVDE_DTOPORC, DVDE_IVAMONTO, DVDE_TOTAL
        FROM DEVOLUCIONES_VENTAS V, DEVOLUCIONES_VENTAS_DETALLE D
        WHERE V.DEVT_ID = D.DEVT_ID AND ARTI_COD = :ARTICULO AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND VEND_COD = :VEND AND DEVT_ANULADO = 'N'
        INTO :ID, :PREFIJO, :NUMERO, :FECDOC, :CANTIDAD, :PRUNIT, :DTO, :IVA, :TOTAL
        DO
        BEGIN
        CANTIDAD = CANTIDAD * -1;
        IVA = IVA * -1;
        TOTAL = TOTAL * -1;
        SUSPEND;
        END
END
^

SET TERM ; ^

GRANT SELECT ON FACTURAS TO PROCEDURE DETALLE_VENTAS_ARTICULO_VEND;
GRANT SELECT ON FACTURAS_DETALLE TO PROCEDURE DETALLE_VENTAS_ARTICULO_VEND;
GRANT SELECT ON DEVOLUCIONES_VENTAS TO PROCEDURE DETALLE_VENTAS_ARTICULO_VEND;
GRANT SELECT ON DEVOLUCIONES_VENTAS_DETALLE TO PROCEDURE DETALLE_VENTAS_ARTICULO_VEND;
grant EXECUTE on PROCEDURE DETALLE_VENTAS_ARTICULO_VEND to PUBLIC;

/* 20080825 */

INSERT INTO CONFIGURACION (CONF_MODULO, CONF_CATEGORIA, CONF_PROPIEDAD, CONF_VALOR, CONF_POSIBLES, CONF_AYUDA) VALUES ('FACTURACION', 'DOCUMENTOS', 'FILTRAR PUNTOS DE VENTA SEGUN EL PREFIJO', 'NO', 'SI,NO', 'SI: Permite usar solamente los puntos de venta asociados al prefijo. NO: Premite escoger cualquier punto de venta activo');
commit work;


SET TERM ^ ;

ALTER PROCEDURE CRUCES_DOCUMENTOS(
    TIPOORI INTEGER,
    IDORI INTEGER)
RETURNS (
    TIPODES INTEGER,
    ID INTEGER,
    NOMTIPO VARCHAR(8),
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE)
AS
declare variable IDC INTEGER;
declare variable PEDAUTO CHAR(2);
begin
EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION','FACTURAS','GENERAR PEDIDO AUTOMATICAMENTE CON LA FACTURA') RETURNING_VALUES (PEDAUTO);
FOR SELECT DISTINCT COFA_TIPODES, COFA_ID FROM CONSOLIDADO_FALTANTES
    WHERE COFA_TIPOORI = :TIPOORI AND COFA_IDORI = :IDORI AND COFA_OK = 'S' INTO :TIPODES, :IDC
    DO
    BEGIN
    SELECT TIDO_NOMCORTO FROM tipo_documento WHERE TIDO_COD = :tipodes INTO :nomtipo;
    if (TIPODES = 21) then
        SELECT FACO_ID, PREF_PRE, FACO_NUMERO, FACO_FECHA FROM FACTURAS_COMPRA WHERE FACO_CONSOLIDA = :IDC AND FACO_ANULADO = 'N' INTO :ID, :PREFIJO, :NUMERO, :FECHA;
    if (TIPODES = 22) then
        SELECT REPR_ID, PREF_PRE, REPR_NUMERO, REPR_FECHA FROM remision_proveedor WHERE REPR_CONSOLIDA = :IDC AND REPR_ANULADO = 'N' INTO :ID, :PREFIJO, :NUMERO, :FECHA;
    if (TIPODES = 23) then
        SELECT ORDC_ID, PREF_PRE, ORDC_NUMERO, ORDC_FECHA FROM ORDENES_COMPRA WHERE ORDC_CONSOLIDA = :IDC AND ORDC_ANULADO = 'N' INTO :ID, :PREFIJO, :NUMERO, :FECHA;
    if (TIPODES = 31) then
        SELECT FACT_ID, PREF_PRE, FACT_NUMERO, FACT_FECHA FROM FACTURAS WHERE FACT_CONSOLIDA = :IDC AND FACT_ANULADO = 'N' INTO :ID, :PREFIJO, :NUMERO, :FECHA;
    if (TIPODES = 32) then
        SELECT REVT_ID, PREF_PRE, REVT_NUMERO, REVT_FECHA FROM remisiones_venta WHERE REVT_CONSOLIDA = :IDC AND REVT_ANULADO = 'N' INTO :ID, :PREFIJO, :NUMERO, :FECHA;
    if (TIPODES = 34) then
        SELECT PEDI_ID, PREF_PRE, PEDI_NUMERO, PEDI_FECHA FROM PEDIDOS WHERE PEDI_CONSOLIDA = :IDC AND PEDI_ANULADO = 'N' INTO :ID, :PREFIJO, :NUMERO, :FECHA;
    suspend;
    END

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

    tipodes = 34;
    if (PEDAUTO = 'SI') then
        BEGIN
        SELECT PEDI_ID FROM PEDIDOS P, FACTURAS F WHERE P.PREF_PRE = F.pref_pre AND PEDI_NUMERO = FACT_NUMERO AND fact_id = :idori into :idori;
        FOR SELECT DISTINCT COFA_TIPODES, COFA_ID FROM CONSOLIDADO_FALTANTES
            WHERE COFA_TIPOORI = 34 AND COFA_IDORI = :IDORI AND COFA_OK = 'S'
            INTO :TIPODES, :IDC
            DO
            BEGIN
            if (TIPODES = 32) then
                BEGIN
                SELECT TIDO_NOMCORTO FROM tipo_documento WHERE TIDO_COD = :tipodes INTO :nomtipo;
                SELECT REVT_ID, PREF_PRE, REVT_NUMERO, REVT_FECHA FROM remisiones_venta
                    WHERE REVT_CONSOLIDA = :IDC AND REVT_ANULADO = 'N'
                    INTO :ID, :PREFIJO, :NUMERO, :FECHA;
                SUSPEND;
                END
            END
        END
    END
if (tipoori = 32) then
    BEGIN
    tipodes = 33;
    SELECT TIDO_NOMCORTO FROM tipo_documento WHERE TIDO_COD = :tipodes INTO :nomtipo;
    for select devt_id, pref_pre, devt_numero, devt_fecha from devoluciones_ventas where devt_remid = :idori and devt_anulado = 'N'
        into :ID, :PREFIJO, :NUMERO, :FECHA
        do
        suspend;
    END
end
^

SET TERM ; ^

/* PROCEDIMIENTO PARA CAMBIAR EL AÑO A MOVIMIENTOS CONTABLES */

SET TERM ^ ;

CREATE OR ALTER procedure cambio_ano_conta(anoa char(4), anon char(4)) returns (id integer, fecha char(8))
as
begin
for select enco_consec, substring(enco_fecha from 5 for 4) from comprobante_encabezado where substring(enco_fecha from 1 for 4) = :anoa
into :id, :fecha
    do
    begin
    update comprobante_encabezado set enco_fecha = :anon || :fecha where enco_consec = :id;
    fecha = anon || fecha;
    suspend;
    end
end    

^

SET TERM ; ^

GRANT SELECT,UPDATE ON COMPROBANTE_ENCABEZADO TO PROCEDURE CAMBIO_ANO_CONTA;


/* 20080830 REP. UTILIDAD ERROR */
SET TERM ^ ;

CREATE OR ALTER PROCEDURE REP_UTILIDAD_VENTAS(
    TIPO INTEGER,
    DETALLE CHAR(1),
    FECINI DATE,
    FECFIN DATE,
    ARTINI VARCHAR(15),
    ARTFIN VARCHAR(15),
    GRPINI VARCHAR(3),
    GRPFIN VARCHAR(3),
    ORDEN CHAR(1),
    AGRUPA CHAR(1),
    CEROS CHAR(1),
    SUBEMPRESA INTEGER)
RETURNS (
    ARTICULO VARCHAR(15),
    DESCRIPCION VARCHAR(60),
    CODGRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    CODSUBG VARCHAR(3),
    NOMSUBG VARCHAR(30),
    CODMARC VARCHAR(3),
    NOMMARC VARCHAR(30),
    UNIDAD VARCHAR(8),
    CANTIDAD NUMERIC(18,4),
    BASE NUMERIC(18,4),
    COSTO NUMERIC(18,4),
    UTILIDAD NUMERIC(18,4),
    PORC NUMERIC(9,2),
    IVA NUMERIC(18,4),
    CONSUMO NUMERIC(18,4),
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    TIPODOC INTEGER)
AS
DECLARE VARIABLE COSTOUNIT NUMERIC(18,4);
declare variable CODINI VARCHAR(15);
declare variable CODFIN VARCHAR(15);
declare variable DESINI VARCHAR(15);
declare variable DESFIN VARCHAR(15);
declare variable MARINI VARCHAR(3);
declare variable MARFIN VARCHAR(3);
declare variable UOM VARCHAR(20);
declare variable NUMROWS INTEGER;
BEGIN
if (ORDEN = 'C') then
    BEGIN
    CODINI = ARTINI;
    CODFIN = ARTFIN;
    DESINI = '';
    DESFIN = 'zz';
    END
ELSE
    BEGIN
    DESINI = ARTINI;
    DESFIN = ARTFIN;
    CODINI = '';
    CODFIN = 'zz';
    END
if (AGRUPA = 'G') then
    BEGIN
    MARINI = '';
    MARFIN = 'zz';
    END
ELSE
    if (AGRUPA = 'M') then
        BEGIN
        MARINI = GRPINI;
        MARFIN = GRPFIN;
        GRPINI = '';
        GRPFIN = 'zz';
        END
    ELSE
        BEGIN
        MARINI = '';
        MARFIN = 'zz';
        GRPINI = '';
        GRPFIN = 'zz';
        END
EXECUTE PROCEDURE lee_configuracion ('FACTURACION', 'ARTICULOS', 'SUGERIR PRECIOS CON PORCENTAJE DE MARGEN O UTILIDAD') returning_values (:UOM);
if (DETALLE = 'N') then
    BEGIN
    if (BIN_AND(TIPO, 1) <> 0) then
        BEGIN
        TIPODOC = 31;
        /* BORRA LA TABLA AUXILIAR */
        DELETE FROM reportes_aux WHERE REPA_ID = 2 AND REPA_USER = USER;

        FOR SELECT MAX(D.ARTI_COD), SUM(FADE_CANT * FADE_FACTOR), SUM((FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO)*FACT_FACTOR), SUM(FADE_IVAMONTO*FACT_FACTOR), SUM(FADE_CONSUMO),
            MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD), SUM(COST_SALP)
            FROM FACTURAS_DETALLE D, FACTURAS F, PREFIJOS P, ARTICULO A, movimiento_articulo m, costos c
            WHERE F.FACT_ID = D.FACT_ID AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND D.ARTI_COD = A.arti_cod AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            F.fact_id = M.mvar_idref AND M.mvar_tipodoc = 31 AND M.mvar_item = D.fade_item AND M.mvar_cons = C.cost_idmov AND
            FACT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY D.ARTI_COD
            INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,
            :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :COSTO
            DO
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
/*            EXECUTE PROCEDURE costo_promedio (:ARTICULO, :FECFIN) RETURNING_VALUES (:COSTOUNIT);*/
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
/*            COSTO = cantidad * COSTOUNIT;*/
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                if (COSTO > 0) then
                    PORC = UTILIDAD * 100 / COSTO;
                ELSE
                    PORC = 100;
            else
                if (BASE > 0) then
                    PORC = UTILIDAD * 100 / BASE;
                ELSE
                    PORC = 0;
            if (CEROS = 'S') then
                INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (2, USER, :ARTICULO);
            SUSPEND;
            END /* FOR */
        if (CEROS = 'S') then
            BEGIN
            COSTO = 0;
            UTILIDAD = 0;
            PORC = 0;
            /* agregue los articulos sin factura */
            FOR SELECT ARTI_COD, 0, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND
                    A.ARTI_DES <= :DESFIN AND A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND
                    (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN)))
                INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,:DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                DO
                BEGIN
                SELECT COUNT(REPA_ARTICULO) FROM REPORTES_AUX WHERE REPA_ID = 2 AND REPA_USER = USER AND REPA_ARTICULO = :articulo INTO :numrows;
                if (numrows = 0) then
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        END
    if (BIN_AND(TIPO, 2) <> 0) then
        BEGIN
        TIPODOC = 32;
        /* BORRA LA TABLA AUXILIAR */
        DELETE FROM reportes_aux WHERE REPA_ID = 2 AND REPA_USER = USER;

        FOR SELECT MAX(D.ARTI_COD), SUM(RVDE_CANT * RVDE_FACTOR), SUM(RVDE_TOTAL-RVDE_IVAMONTO-RVDE_CONSUMO), SUM(RVDE_IVAMONTO), SUM(RVDE_CONSUMO),
            MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD), SUM(COST_SALP)
            FROM REMISIONES_VENTA_DETALLE D, REMISIONES_VENTA R, PREFIJOS P, ARTICULO A, movimiento_articulo m, costos c
            WHERE R.REVT_ID = D.REVT_ID AND P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = 32 AND D.ARTI_COD = A.arti_cod AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            R.revt_id = M.mvar_idref AND M.mvar_tipodoc = 32 AND M.mvar_item = D.rvde_item AND M.mvar_cons = C.cost_idmov AND
            REVT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY D.ARTI_COD
            INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,
            :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :COSTO
            DO
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
/*            EXECUTE PROCEDURE costo_promedio (:ARTICULO, :FECFIN) RETURNING_VALUES (:COSTOUNIT); */
/*            COSTO = cantidad * COSTOUNIT;*/
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                if (COSTO > 0) then
                    PORC = UTILIDAD * 100 / COSTO;
                ELSE
                    PORC = 100;
            else
                if (BASE > 0) then
                    PORC = UTILIDAD * 100 / BASE;
                ELSE
                    PORC = 0;
            if (CEROS = 'S') then
                INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (2, USER, :ARTICULO);
            SUSPEND;
            END /* FOR */
        if (CEROS = 'S') then
            BEGIN
            COSTO = 0;
            UTILIDAD = 0;
            PORC = 0;
            /* agregue los articulos sin factura */
            FOR SELECT ARTI_COD, 0, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND
                    A.ARTI_DES <= :DESFIN AND A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND
                    (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN)))
                INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,:DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                DO
                BEGIN
                SELECT COUNT(REPA_ARTICULO) FROM REPORTES_AUX WHERE REPA_ID = 2 AND REPA_USER = USER AND REPA_ARTICULO = :articulo INTO :numrows;
                if (numrows = 0) then
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        END
    if (BIN_AND(TIPO, 4) <> 0) then
        BEGIN
        TIPODOC = 33;
        /* BORRA LA TABLA AUXILIAR */
        DELETE FROM reportes_aux WHERE REPA_ID = 2 AND REPA_USER = USER;

        FOR SELECT MAX(D.ARTI_COD), SUM(DVDE_CANT * DVDE_FACTOR), SUM((DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO)*DEVT_FACTOR), SUM(DVDE_IVAMONTO*DEVT_FACTOR), SUM(DVDE_CONSUMO),
            MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD), SUM(COST_ENTP)
            FROM devoluciones_ventas_detalle D, DEVOLUCIONES_VENTAS V, PREFIJOS P, ARTICULO A, MOVIMIENTO_ARTICULO M, COSTOS C
            WHERE V.DEVT_ID = D.DEVT_ID AND P.PREF_PRE = V.PREF_PRE AND P.TIDO_COD = 33 AND D.ARTI_COD = A.arti_cod AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            V.devt_id = M.mvar_idref AND M.mvar_tipodoc = 33 AND M.mvar_item = D.dvde_item AND M.mvar_cons = C.cost_idmov AND
            DEVT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY D.ARTI_COD
            INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,
            :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :COSTO
            DO
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            else
                CANTIDAD = CANTIDAD * -1;
            if (BASE IS NULL) then
                BASE = 0;
            else
                BASE = BASE * -1;
            if (IVA IS NULL) then
                IVA = 0;
            else
                IVA = IVA * -1;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            else
                CONSUMO = CONSUMO * -1;
/*            EXECUTE PROCEDURE costo_promedio (:ARTICULO, :FECFIN) RETURNING_VALUES (:COSTOUNIT);*/
/*            COSTO = cantidad * COSTOUNIT;*/
            COSTO = costo * -1;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                if (COSTO > 0) then
                    PORC = UTILIDAD * 100 / COSTO;
                ELSE
                    PORC = 100;
            else
                if (BASE > 0) then
                    PORC = UTILIDAD * 100 / BASE;
                ELSE
                    PORC = 0;
            if (CEROS = 'S') then
                INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (2, USER, :ARTICULO);
            SUSPEND;
            END /* FOR */
        if (CEROS = 'S') then
            BEGIN
            COSTO = 0;
            UTILIDAD = 0;
            PORC = 0;
            /* agregue los articulos sin factura */
            FOR SELECT ARTI_COD, 0, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND
                    A.ARTI_DES <= :DESFIN AND A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND
                    (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN)))
                INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,:DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                DO
                BEGIN
                SELECT COUNT(REPA_ARTICULO) FROM REPORTES_AUX WHERE REPA_ID = 2 AND REPA_USER = USER AND REPA_ARTICULO = :articulo INTO :numrows;
                if (numrows = 0) then
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        END
    if (BIN_AND(TIPO, 8) <> 0) then
        BEGIN
        TIPODOC = 34;
        /* BORRA LA TABLA AUXILIAR */
        DELETE FROM reportes_aux WHERE REPA_ID = 2 AND REPA_USER = USER;

        FOR SELECT MAX(D.ARTI_COD), SUM(PEDE_CANT * PEDE_FACTOR), SUM((PEDE_TOTAL-PEDE_IVAMONTO-PEDE_CONSUMO)*PEDI_FACTOR), SUM(PEDE_IVAMONTO*PEDI_FACTOR), SUM(PEDE_CONSUMO),
            MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD)
            FROM PEDIDOS_DETALLE D, PEDIDOS P, PREFIJOS R, ARTICULO A
            WHERE P.PEDI_ID = D.PEDI_ID AND P.PREF_PRE = R.PREF_PRE AND R.TIDO_COD = 34 AND D.ARTI_COD = A.arti_cod AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            PEDI_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY D.ARTI_COD
            INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,
            :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
            DO
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            EXECUTE PROCEDURE costo_promedio (:ARTICULO, :FECFIN) RETURNING_VALUES (:COSTOUNIT);
            COSTO = cantidad * COSTOUNIT;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                if (COSTO > 0) then
                    PORC = UTILIDAD * 100 / COSTO;
                ELSE
                    PORC = 100;
            else
                if (BASE > 0) then
                    PORC = UTILIDAD * 100 / BASE;
                ELSE
                    PORC = 0;
            if (CEROS = 'S') then
                INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (2, USER, :ARTICULO);
            SUSPEND;
            END /* FOR */
        if (CEROS = 'S') then
            BEGIN
            COSTO = 0;
            UTILIDAD = 0;
            PORC = 0;
            /* agregue los articulos sin factura */
            FOR SELECT ARTI_COD, 0, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND
                    A.ARTI_DES <= :DESFIN AND A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND
                    (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN)))
                INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,:DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                DO
                BEGIN
                SELECT COUNT(REPA_ARTICULO) FROM REPORTES_AUX WHERE REPA_ID = 2 AND REPA_USER = USER AND REPA_ARTICULO = :articulo INTO :numrows;
                if (numrows = 0) then
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        END
    if (BIN_AND(TIPO, 16) <> 0) then
        BEGIN
        TIPODOC = 35;
        /* BORRA LA TABLA AUXILIAR */
        DELETE FROM reportes_aux WHERE REPA_ID = 2 AND REPA_USER = USER;

        FOR SELECT MAX(D.ARTI_COD), SUM(CTDE_CANT * CTDE_FACTOR), SUM((CTDE_TOTAL-CTDE_IVAMONTO-CTDE_CONSUMO)*COTI_FACTOR), SUM(CTDE_IVAMONTO), SUM(CTDE_CONSUMO),
            MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD)
            FROM COTIZACIONES_DETALLE D, COTIZACIONES C, PREFIJOS P, ARTICULO A
            WHERE C.COTI_ID = D.COTI_ID AND P.PREF_PRE = C.PREF_PRE AND P.TIDO_COD = 35 AND D.ARTI_COD = A.arti_cod AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND COTI_FECHA >= :FECINI AND COTI_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            COTI_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY D.ARTI_COD
            INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,
            :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
            DO
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            EXECUTE PROCEDURE costo_promedio (:ARTICULO, :FECFIN) RETURNING_VALUES (:COSTOUNIT);
            COSTO = cantidad * COSTOUNIT;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                if (COSTO > 0) then
                    PORC = UTILIDAD * 100 / COSTO;
                ELSE
                    PORC = 100;
            else
                if (BASE > 0) then
                    PORC = UTILIDAD * 100 / BASE;
                ELSE
                    PORC = 0;
            if (CEROS = 'S') then
                INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (2, USER, :ARTICULO);
            SUSPEND;
            END /* FOR */
        if (CEROS = 'S') then
            BEGIN
            COSTO = 0;
            UTILIDAD = 0;
            PORC = 0;
            /* agregue los articulos sin factura */
            FOR SELECT ARTI_COD, 0, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND
                    A.ARTI_DES <= :DESFIN AND A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND
                    (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN)))
                INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,:DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                DO
                BEGIN
                SELECT COUNT(REPA_ARTICULO) FROM REPORTES_AUX WHERE REPA_ID = 2 AND REPA_USER = USER AND REPA_ARTICULO = :articulo INTO :numrows;
                if (numrows = 0) then
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        END
    END
ELSE
    BEGIN
    if (BIN_AND(TIPO, 1) <> 0) then
        BEGIN
        TIPODOC = 31;
        FOR SELECT F.PREF_PRE, FACT_NUMERO, FACT_FECHA, D.ARTI_COD, FADE_CANT * FADE_FACTOR, (FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO)*FACT_FACTOR, FADE_IVAMONTO*FACT_FACTOR, FADE_CONSUMO,
            ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD, COST_SALP
            FROM FACTURAS F, FACTURAS_DETALLE D, PREFIJOS P, ARTICULO A, MOVIMIENTO_ARTICULO M, COSTOS C
            WHERE F.FACT_ID = D.FACT_ID AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND D.ARTI_COD = A.arti_cod AND
                A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
                A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND FACT_FECHA >= :FECINI AND
                (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
                F.fact_id = M.mvar_idref AND M.mvar_tipodoc = 31 AND M.mvar_item = D.fade_item AND M.mvar_cons = C.cost_idmov AND
                FACT_FECHA <= :FECFIN AND FACT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            ORDER BY D.ARTI_COD, FACT_FECHA, F.FACT_ID, FADE_ITEM
            INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,
                :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :COSTO
            DO
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
/*            EXECUTE PROCEDURE costo_promedio (:ARTICULO, :FECHA) RETURNING_VALUES (:COSTOUNIT);*/
/*            COSTO = COSTOUNIT * CANTIDAD;*/
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                if (COSTO > 0) then
                    PORC = UTILIDAD * 100 / COSTO;
                ELSE
                    PORC = 100;
            else
                if (BASE > 0) then
                    PORC = UTILIDAD * 100 / BASE;
                ELSE
                    PORC = 0;
            SUSPEND;
            END
        END
    if (BIN_AND(TIPO, 2) <> 0) then
        BEGIN
        TIPODOC = 32;
        FOR SELECT R.PREF_PRE, REVT_NUMERO, REVT_FECHA, D.ARTI_COD, RVDE_CANT * RVDE_FACTOR, RVDE_TOTAL-RVDE_IVAMONTO-RVDE_CONSUMO, RVDE_IVAMONTO, RVDE_CONSUMO,
            ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD, COST_SALP
            FROM REMISIONES_VENTA R, REMISIONES_VENTA_DETALLE D, PREFIJOS P, ARTICULO A, MOVIMIENTO_ARTICULO M, COSTOS C
            WHERE R.REVT_ID = D.REVT_ID AND P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = 32 AND D.ARTI_COD = A.arti_cod AND
                A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
                A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN AND
                R.revt_id = M.mvar_idref AND M.mvar_tipodoc = 32 AND M.mvar_item = D.rvde_item AND M.mvar_cons = C.cost_idmov AND
                (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
                REVT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            ORDER BY D.ARTI_COD, REVT_FECHA, R.REVT_ID, RVDE_ITEM
            INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,
                :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :COSTO
            DO
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            EXECUTE PROCEDURE costo_promedio (:ARTICULO, :FECHA) RETURNING_VALUES (:COSTOUNIT);
            COSTO = COSTOUNIT * CANTIDAD;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                if (COSTO > 0) then
                    PORC = UTILIDAD * 100 / COSTO;
                ELSE
                    PORC = 100;
            else
                if (BASE > 0) then
                    PORC = UTILIDAD * 100 / BASE;
                ELSE
                    PORC = 0;
            SUSPEND;
            END
        END
    if (BIN_AND(TIPO, 4) <> 0) then
        BEGIN
        TIPODOC = 33;
        FOR SELECT V.PREF_PRE, DEVT_NUMERO, DEVT_FECHA, D.ARTI_COD, DVDE_CANT * DVDE_FACTOR, (DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO)*DEVT_FACTOR, DVDE_IVAMONTO*DEVT_FACTOR, DVDE_CONSUMO,
            ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD, COST_ENTP
            FROM DEVOLUCIONES_VENTAS V, DEVOLUCIONES_VENTAS_DETALLE D, PREFIJOS P, ARTICULO A, MOVIMIENTO_ARTICULO M, COSTOS C
            WHERE V.DEVT_ID = D.DEVT_ID AND P.PREF_PRE = V.PREF_PRE AND P.TIDO_COD = 33 AND D.ARTI_COD = A.arti_cod AND
                A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
                A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND
                (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
                V.devt_id = M.mvar_idref AND M.mvar_tipodoc = 33 AND M.mvar_item = D.dvde_item AND M.mvar_cons = C.cost_idmov AND
                DEVT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            ORDER BY D.ARTI_COD, DEVT_FECHA, V.DEVT_ID, DVDE_ITEM
            INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,
                :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :COSTO
            DO
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            EXECUTE PROCEDURE costo_promedio (:ARTICULO, :FECHA) RETURNING_VALUES (:COSTOUNIT);
            BASE = BASE * -1;
            CANTIDAD = CANTIDAD * -1;
            IVA = IVA * -1;
            CONSUMO = CONSUMO * -1;
            COSTO = COSTOUNIT * CANTIDAD;
            COSTO = COSTO * -1;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                if (COSTO > 0) then
                    PORC = UTILIDAD * 100 / COSTO;
                ELSE
                    PORC = 100;
            else
                if (BASE > 0) then
                    PORC = UTILIDAD * 100 / BASE;
                ELSE
                    PORC = 0;
            SUSPEND;
            END
        END
    if (BIN_AND(TIPO, 8) <> 0) then
        BEGIN
        TIPODOC = 34;
        FOR SELECT P.PREF_PRE, PEDI_NUMERO, PEDI_FECHA, D.ARTI_COD, PEDE_CANT * PEDE_FACTOR, (PEDE_TOTAL-PEDE_IVAMONTO-PEDE_CONSUMO)*PEDI_FACTOR, PEDE_IVAMONTO*PEDI_FACTOR, PEDE_CONSUMO,
            ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD 
            FROM PEDIDOS P, PEDIDOS_DETALLE D, PREFIJOS R, ARTICULO A
            WHERE P.PEDI_ID = D.PEDI_ID AND P.PREF_PRE = R.PREF_PRE AND R.TIDO_COD = 34 AND D.ARTI_COD = A.arti_cod AND
                A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
                A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND
                (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
                PEDI_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            ORDER BY D.ARTI_COD, PEDI_FECHA, P.PEDI_ID, PEDE_ITEM
            INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,
                :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
            DO
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            EXECUTE PROCEDURE costo_promedio (:ARTICULO, :FECHA) RETURNING_VALUES (:COSTOUNIT);
            COSTO = COSTOUNIT * CANTIDAD;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                if (COSTO > 0) then
                    PORC = UTILIDAD * 100 / COSTO;
                ELSE
                    PORC = 100;
            else
                if (BASE > 0) then
                    PORC = UTILIDAD * 100 / BASE;
                ELSE
                    PORC = 0;
            SUSPEND;
            END
        END
    if (BIN_AND(TIPO, 16) <> 0) then
        BEGIN
        TIPODOC = 35;
        FOR SELECT C.PREF_PRE, COTI_NUMERO, COTI_FECHA, D.ARTI_COD, CTDE_CANT * CTDE_FACTOR, (CTDE_TOTAL-CTDE_IVAMONTO-CTDE_CONSUMO)*COTI_FACTOR, CTDE_IVAMONTO*COTI_FACTOR, CTDE_CONSUMO,
            ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD 
            FROM COTIZACIONES C, COTIZACIONES_DETALLE D, PREFIJOS P, ARTICULO A
            WHERE C.COTI_ID = D.COTI_ID AND P.PREF_PRE = C.PREF_PRE AND P.TIDO_COD = 35 AND D.ARTI_COD = A.arti_cod AND
                A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
                A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND COTI_FECHA >= :FECINI AND COTI_FECHA <= :FECFIN AND
                (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
                COTI_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            ORDER BY D.ARTI_COD, COTI_FECHA, C.COTI_ID, CTDE_ITEM
            INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,
                :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
            DO
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            EXECUTE PROCEDURE costo_promedio (:ARTICULO, :FECHA) RETURNING_VALUES (:COSTOUNIT);
            COSTO = COSTOUNIT * CANTIDAD;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                if (COSTO > 0) then
                    PORC = UTILIDAD * 100 / COSTO;
                ELSE
                    PORC = 100;
            else
                if (BASE > 0) then
                    PORC = UTILIDAD * 100 / BASE;
                ELSE
                    PORC = 0;
            SUSPEND;
            END
        END
    END
END
^

SET TERM ; ^

GRANT EXECUTE ON PROCEDURE LEE_CONFIGURACION TO PROCEDURE REP_UTILIDAD_VENTAS;
GRANT SELECT,INSERT,DELETE ON REPORTES_AUX TO PROCEDURE REP_UTILIDAD_VENTAS;
GRANT SELECT ON FACTURAS_DETALLE TO PROCEDURE REP_UTILIDAD_VENTAS;
GRANT SELECT ON FACTURAS TO PROCEDURE REP_UTILIDAD_VENTAS;
GRANT SELECT ON PREFIJOS TO PROCEDURE REP_UTILIDAD_VENTAS;
GRANT SELECT ON ARTICULO TO PROCEDURE REP_UTILIDAD_VENTAS;
GRANT SELECT ON MOVIMIENTO_ARTICULO TO PROCEDURE REP_UTILIDAD_VENTAS;
GRANT SELECT ON COSTOS TO PROCEDURE REP_UTILIDAD_VENTAS;
GRANT SELECT ON GRUPO TO PROCEDURE REP_UTILIDAD_VENTAS;
GRANT SELECT ON MARCAS TO PROCEDURE REP_UTILIDAD_VENTAS;
GRANT SELECT ON SUBGRUPO TO PROCEDURE REP_UTILIDAD_VENTAS;
GRANT SELECT ON REMISIONES_VENTA_DETALLE TO PROCEDURE REP_UTILIDAD_VENTAS;
GRANT SELECT ON REMISIONES_VENTA TO PROCEDURE REP_UTILIDAD_VENTAS;
GRANT SELECT ON DEVOLUCIONES_VENTAS_DETALLE TO PROCEDURE REP_UTILIDAD_VENTAS;
GRANT SELECT ON DEVOLUCIONES_VENTAS TO PROCEDURE REP_UTILIDAD_VENTAS;
GRANT SELECT ON PEDIDOS_DETALLE TO PROCEDURE REP_UTILIDAD_VENTAS;
GRANT SELECT ON PEDIDOS TO PROCEDURE REP_UTILIDAD_VENTAS;
GRANT EXECUTE ON PROCEDURE COSTO_PROMEDIO TO PROCEDURE REP_UTILIDAD_VENTAS;
GRANT SELECT ON COTIZACIONES_DETALLE TO PROCEDURE REP_UTILIDAD_VENTAS;
GRANT SELECT ON COTIZACIONES TO PROCEDURE REP_UTILIDAD_VENTAS;

/* DIASMAX MAL EN CONSULTA DE CARTERA */
SET TERM ^ ;

CREATE OR ALTER PROCEDURE MOVIMIENTO_CARTERA_MES(
    FECINI DATE,
    FECFIN DATE,
    SUBEMPRESA INTEGER,
    CONTADO CHAR(1))
RETURNS (
    NIT VARCHAR(20),
    NOMBRE VARCHAR(60),
    CONTACTO VARCHAR(60),
    DIASMAX INTEGER,
    TELEFONO VARCHAR(40),
    INICIAL NUMERIC(18,2),
    DEBITOS NUMERIC(18,2),
    CREDITOS NUMERIC(18,2),
    ABONOS NUMERIC(18,2),
    FINAL NUMERIC(18,2))
AS
declare variable RETES CHAR(2);
declare variable TIPODOC INTEGER;
declare variable IDDOC INTEGER;
declare variable SALDO NUMERIC(18,2);
declare variable NUMROWS INTEGER;
declare variable DIASF INTEGER;
declare variable DIAS INTEGER;
DECLARE VARIABLE FOV CHAR(11);
BEGIN
EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'ANALISIS DE CARTERA CON FECHA FACTURA O VENCIMIENTO') RETURNING_VALUES (FOV);
for select TERC_NIT, TERC_NOM, TERC_CONTACTO, TERC_TEL from TERCEROS WHERE TERC_CLIE = 'S' into :NIT, :NOMBRE, :CONTACTO, :TELEFONO
  DO
    BEGIN
    diasmax = 0;
    SELECT COUNT(*) FROM AUTORIZACIONES WHERE AUTO_NITCONTADO = :NIT INTO :numrows;
    IF ((CONTADO = 'S') or (numrows = 0)) THEN
        BEGIN
        FECINI = FECINI - 1;
        INICIAL = 0;
        FOR SELECT MVCL_TIPOREF, MVCL_IDREF, (:FECFIN-MVCL_FECHA), (:FECFIN-MVCL_VENCE) FROM MOVIMIENTO_CLIENTES
            WHERE TERC_NIT = :NIT AND MVCL_FECHA <= :FECINI AND
            MVCL_ABONO = 'N' AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA))
            INTO :TIPODOC, :IDDOC, :DIASF, DIAS
            DO
            BEGIN
            EXECUTE PROCEDURE saldo_doc_cartera(TIPODOC, IDDOC, FECINI) returning_values (SALDO);
            if (SALDO <> 0) then
                BEGIN
                INICIAL = INICIAL + SALDO;
                if (FOV = 'FECHA') then
                    BEGIN
                    if ((SALDO > 0) AND (DIASMAX < DIASF)) then
                        DIASMAX = DIASF;
                    END
                ELSE
                    BEGIN
                    if ((SALDO > 0) AND (DIASMAX < DIAS)) then
                        DIASMAX = DIAS;
                    END
                END
            END
        EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'DESCONTAR RETENCIONES POR CAUSACION') returning_values(:RETES);
        FECINI = FECINI + 1;
        if (RETES = 'SI') then
            BEGIN
            SELECT SUM(MVCL_MONTO-MVCL_RTEFTE-MVCL_RTEIVA-MVCL_RTEICA), MAX(:FECFIN-MVCL_FECHA), MAX(:FECFIN-MVCL_VENCE) FROM movimiento_clientes
                WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND MVCL_FECHA < :FECFIN
                AND MVCL_DEBITO = 'S' AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA))
                INTO :DEBITOS, :diasf, :dias;
            SELECT SUM(MVCL_MONTO-MVCL_RTEFTE-MVCL_RTEIVA-MVCL_RTEICA) FROM movimiento_clientes
                WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND MVCL_FECHA < :FECFIN
                AND MVCL_DEBITO = 'N' AND MVCL_ABONO = 'N' and MVCL_TIPOREF <> 45 AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA))
                INTO :CREDITOS;
            SELECT SUM(MVCL_MONTO) FROM movimiento_clientes
                WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND MVCL_FECHA < :FECFIN
                AND MVCL_ABONO = 'S' AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA))
                INTO :ABONOS;
            END
        ELSE
            BEGIN
            SELECT SUM(MVCL_MONTO), MAX(:FECFIN-MVCL_FECHA), MAX(:FECFIN-MVCL_VENCE) FROM movimiento_clientes
                WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND MVCL_FECHA < :FECFIN
                AND MVCL_DEBITO = 'S' AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA))
                INTO :DEBITOS, :diasf, :dias;
            SELECT SUM(MVCL_MONTO) FROM movimiento_clientes
                WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND MVCL_FECHA < :FECFIN
                AND MVCL_DEBITO = 'N' AND MVCL_ABONO = 'N' and MVCL_TIPOREF <> 45 AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA))
                INTO :CREDITOS;
            SELECT SUM(MVCL_MONTO+MVCL_RTEFTE+MVCL_RTEIVA+MVCL_RTEICA) FROM movimiento_clientes
                WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND MVCL_FECHA < :FECFIN
                AND MVCL_ABONO = 'S' AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA))
                INTO :ABONOS;
            END
        if (FOV = 'FECHA') then
            BEGIN
            if ((DIASMAX < DIASF) AND (DIASF IS NOT NULL)) then
                DIASMAX = DIASF;
            END
        ELSE
            BEGIN
            if ((DIASMAX < DIAS) AND (DIAS IS NOT NULL)) then
                DIASMAX = DIAS;
            END
        if (DEBITOS IS NULL) then
            DEBITOS = 0;
        if (CREDITOS IS NULL) then
            CREDITOS = 0;
        if (ABONOS IS NULL) then
            ABONOS = 0;
        FINAL = INICIAL + DEBITOS - CREDITOS - ABONOS;
        SUSPEND;
        END
    END
END
^

SET TERM ; ^

GRANT EXECUTE ON PROCEDURE LEE_CONFIGURACION TO PROCEDURE MOVIMIENTO_CARTERA_MES;
GRANT SELECT ON TERCEROS TO PROCEDURE MOVIMIENTO_CARTERA_MES;
GRANT SELECT ON AUTORIZACIONES TO PROCEDURE MOVIMIENTO_CARTERA_MES;
GRANT SELECT ON MOVIMIENTO_CLIENTES TO PROCEDURE MOVIMIENTO_CARTERA_MES;
GRANT EXECUTE ON PROCEDURE SALDO_DOC_CARTERA TO PROCEDURE MOVIMIENTO_CARTERA_MES;


/* ARTICULOS VENDIDOS POR VENDEDOR NO RESTA LAS DEVOLUCIONES */
SET TERM ^ ;

CREATE OR ALTER PROCEDURE REP_ARTICULOS_VENDEDOR(
    TIPO INTEGER,
    DETALLE CHAR(1),
    DESDE VARCHAR(20),
    HASTA VARCHAR(20),
    FECINI DATE,
    FECFIN DATE,
    ARTINI VARCHAR(15),
    ARTFIN VARCHAR(15),
    GRPINI VARCHAR(3),
    GRPFIN VARCHAR(3),
    ORDEN CHAR(1),
    AGRUPA CHAR(1),
    ZONA CHAR(1),
    CEROS CHAR(1),
    SUBEMPRESA INTEGER,
    ZONAINI CHAR(2),
    ZONAFIN CHAR(2))
RETURNS (
    CODVEND VARCHAR(20),
    NOMVEND VARCHAR(60),
    NOMTIPO VARCHAR(50),
    ARTICULO VARCHAR(15),
    DESCRIPCION VARCHAR(60),
    CODGRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    CODSUBG VARCHAR(3),
    NOMSUBG VARCHAR(30),
    CODMARC VARCHAR(3),
    NOMMARC VARCHAR(30),
    UNIDAD VARCHAR(8),
    CANTIDAD NUMERIC(18,4),
    BASE NUMERIC(18,2),
    IVA NUMERIC(18,2),
    CONSUMO NUMERIC(18,2),
    TOTAL NUMERIC(18,2),
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    DTO NUMERIC(9,2),
    NIT VARCHAR(20),
    NOMCLIENTE VARCHAR(60),
    CODZONA VARCHAR(2),
    NOMZONA VARCHAR(60))
AS
declare variable codini varchar(15);
declare variable codfin varchar(15);
declare variable desini varchar(15);
declare variable desfin varchar(15);
declare variable marini varchar(3);
declare variable marfin varchar(3);
BEGIN
if (ORDEN = 'C') then
    BEGIN
    CODINI = ARTINI;
    CODFIN = ARTFIN;
    DESINI = '';
    DESFIN = 'zz';
    END
ELSE
    BEGIN
    DESINI = ARTINI;
    DESFIN = ARTFIN;
    CODINI = '';
    CODFIN = 'zz';
    END
if (AGRUPA = 'G') then
    BEGIN
    MARINI = '';
    MARFIN = 'zz';
    END
ELSE
    if (AGRUPA = 'M') then
        BEGIN
        MARINI = GRPINI;
        MARFIN = GRPFIN;
        GRPINI = '';
        GRPFIN = 'zz';
        END
    ELSE
        BEGIN
        MARINI = '';
        MARFIN = 'zz';
        END
if (DETALLE = 'N') then
    BEGIN
    if (BIN_AND(TIPO, 1) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 31 INTO :NOMTIPO;
        FOR SELECT MAX(D.ARTI_COD), MAX(VEND_COD), SUM(FADE_CANT * FADE_FACTOR), SUM((FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO)*FACT_FACTOR), SUM(FADE_IVAMONTO*FACT_FACTOR), SUM(FADE_CONSUMO), SUM(FADE_TOTAL*FACT_FACTOR),
            MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD)
            FROM FACTURAS_DETALLE D, FACTURAS F, PREFIJOS P, ARTICULO A
            WHERE F.FACT_ID = D.FACT_ID AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND D.ARTI_COD = A.arti_cod AND
            VEND_COD >= :DESDE AND VEND_COD <= :HASTA AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            FACT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY VEND_COD, D.ARTI_COD
            INTO :ARTICULO, :CODVEND, :CANTIDAD, :BASE, :IVA, :CONSUMO, :TOTAL,
            :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
            DO
            BEGIN
            select VEND_NOMBRE from VENDEDORES where VEND_COD = :CODVEND INTO :NOMVEND;
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            if (CEROS = 'S') then
                SUSPEND;
            ELSE
                if ((BASE <> 0) AND (CANTIDAD <> 0)) then
                    SUSPEND;
            END /* FOR */
        END
    if (BIN_AND(TIPO, 2) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 32 INTO :NOMTIPO;
        FOR SELECT MAX(D.ARTI_COD), MAX(VEND_COD), SUM(RVDE_CANT * RVDE_FACTOR), SUM(RVDE_TOTAL-RVDE_IVAMONTO-RVDE_CONSUMO), SUM(RVDE_IVAMONTO), SUM(RVDE_CONSUMO), SUM(RVDE_TOTAL),
            MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD)
            FROM REMISIONES_VENTA_DETALLE D, REMISIONES_VENTA R, PREFIJOS P, ARTICULO A
            WHERE R.REVT_ID = D.REVT_ID AND P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = 32 AND D.ARTI_COD = A.arti_cod AND
            VEND_COD >= :DESDE AND VEND_COD <= :HASTA AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            REVT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY R.vend_cod, D.ARTI_COD
            INTO :ARTICULO, :CODVEND, :CANTIDAD, :BASE, :IVA, :CONSUMO, :TOTAL,
            :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
            DO
            BEGIN
            select VEND_NOMBRE from VENDEDORES where VEND_COD = :CODVEND INTO :NOMVEND;
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            if (CEROS = 'S') then
                SUSPEND;
            ELSE
                if ((BASE <> 0) AND (CANTIDAD <> 0)) then
                    SUSPEND;
            END /* FOR */
        END
    if (BIN_AND(TIPO, 4) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 33 INTO :NOMTIPO;
        FOR SELECT MAX(D.ARTI_COD), MAX(VEND_COD), SUM(DVDE_CANT * DVDE_FACTOR), SUM((DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO)*DEVT_FACTOR), SUM(DVDE_IVAMONTO*DEVT_FACTOR), SUM(DVDE_CONSUMO), SUM(DVDE_TOTAL*DEVT_FACTOR),
            MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD)
            FROM devoluciones_ventas_detalle D, DEVOLUCIONES_VENTAS V, PREFIJOS P, ARTICULO A
            WHERE V.DEVT_ID = D.DEVT_ID AND P.PREF_PRE = V.PREF_PRE AND P.TIDO_COD = 33 AND D.ARTI_COD = A.arti_cod AND
            VEND_COD >= :DESDE AND VEND_COD <= :HASTA AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            DEVT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY V.vend_cod, D.ARTI_COD
            INTO :ARTICULO, :CODVEND, :CANTIDAD, :BASE, :IVA, :CONSUMO, :TOTAL,
            :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
            DO
            BEGIN
            select VEND_NOMBRE from VENDEDORES where VEND_COD = :CODVEND INTO :NOMVEND;
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            if (CEROS = 'S') then
                SUSPEND;
            ELSE
                if ((BASE <> 0) AND (CANTIDAD <> 0)) then
                    BEGIN
                    BASE = BASE * -1;
                    IVA = IVA * -1;
                    CANTIDAD = CANTIDAD * -1;
                    TOTAL = TOTAL * -1;
                    SUSPEND;
                    END
            END /* FOR */
        END
    if (BIN_AND(TIPO, 8) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 34 INTO :NOMTIPO;
        FOR SELECT MAX(D.ARTI_COD), MAX(VEND_COD), SUM(PEDE_CANT * PEDE_FACTOR), SUM((PEDE_TOTAL-PEDE_IVAMONTO-PEDE_CONSUMO)*PEDI_FACTOR), SUM(PEDE_IVAMONTO*PEDI_FACTOR), SUM(PEDE_CONSUMO), SUM(PEDE_TOTAL*PEDI_FACTOR),
            MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD)
            FROM PEDIDOS_DETALLE D, PEDIDOS P, PREFIJOS R, ARTICULO A
            WHERE P.PEDI_ID = D.PEDI_ID AND P.PREF_PRE = R.PREF_PRE AND R.TIDO_COD = 34 AND D.ARTI_COD = A.arti_cod AND
            VEND_COD >= :DESDE AND VEND_COD <= :HASTA AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            PEDI_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY P.vend_cod, D.ARTI_COD
            INTO :ARTICULO, :CODVEND, :CANTIDAD, :BASE, :IVA, :CONSUMO, :TOTAL,
            :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
            DO
            BEGIN
            select VEND_NOMBRE from VENDEDORES where VEND_COD = :CODVEND INTO :NOMVEND;
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            if (CEROS = 'S') then
                SUSPEND;
            ELSE
                if ((BASE <> 0) AND (CANTIDAD <> 0)) then
                    SUSPEND;
            END /* FOR */
        END
    if (BIN_AND(TIPO, 16) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 35 INTO :NOMTIPO;
        FOR SELECT MAX(D.ARTI_COD), MAX(VEND_COD), SUM(CTDE_CANT * CTDE_FACTOR), SUM((CTDE_TOTAL-CTDE_IVAMONTO-CTDE_CONSUMO)*COTI_FACTOR), SUM(CTDE_IVAMONTO*COTI_FACTOR), SUM(CTDE_CONSUMO), SUM(CTDE_TOTAL*COTI_FACTOR),
            MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD)
            FROM COTIZACIONES_DETALLE D, COTIZACIONES C, PREFIJOS P, ARTICULO A
            WHERE C.COTI_ID = D.COTI_ID AND P.PREF_PRE = C.PREF_PRE AND P.TIDO_COD = 35 AND D.ARTI_COD = A.arti_cod AND
            VEND_COD >= :DESDE AND VEND_COD <= :HASTA AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND COTI_FECHA >= :FECINI AND COTI_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            COTI_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY C.vend_cod, D.ARTI_COD
            INTO :ARTICULO, :CODVEND, :CANTIDAD, :BASE, :IVA, :CONSUMO, :TOTAL,
            :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
            DO
            BEGIN
            select VEND_NOMBRE from VENDEDORES where VEND_COD = :CODVEND INTO :NOMVEND;
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            if (CEROS = 'S') then
                SUSPEND;
            ELSE
                if ((BASE <> 0) AND (CANTIDAD <> 0)) then
                    SUSPEND;
            END /* FOR */
        END
    END
ELSE
  if (DETALLE = 'S') then
    BEGIN
    if (BIN_AND(TIPO, 1) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 31 INTO :NOMTIPO;
        FOR SELECT F.PREF_PRE, FACT_NUMERO, FACT_FECHA, VEND_COD, D.ARTI_COD, FADE_CANT * FADE_FACTOR, (FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO)*FACT_FACTOR, FADE_IVAMONTO*FACT_FACTOR, FADE_CONSUMO, FADE_DTOPORC, FADE_TOTAL*FACT_FACTOR,
            ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD , F.TERC_NIT, F.fact_nomcliente
            FROM FACTURAS F, FACTURAS_DETALLE D, PREFIJOS P, ARTICULO A
            WHERE F.FACT_ID = D.FACT_ID AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND D.ARTI_COD = A.arti_cod AND
                VEND_COD >= :DESDE AND VEND_COD <= :HASTA AND
                A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
                A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND FACT_FECHA >= :FECINI AND
                (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
                FACT_FECHA <= :FECFIN AND FACT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            ORDER BY VEND_COD, D.ARTI_COD, FACT_FECHA, F.FACT_ID, FADE_ITEM
            INTO :PREFIJO, :NUMERO, :FECHA, :CODVEND, :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO, :DTO, :TOTAL,
                :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :NIT, :nomcliente
            DO
            BEGIN
            select VEND_NOMBRE from VENDEDORES where VEND_COD = :CODVEND INTO :NOMVEND;
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            SUSPEND;
            END
        END
    if (BIN_AND(TIPO, 2) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 32 INTO :NOMTIPO;
        FOR SELECT R.PREF_PRE, REVT_NUMERO, REVT_FECHA, VEND_COD, D.ARTI_COD, RVDE_CANT * RVDE_FACTOR, (RVDE_TOTAL-RVDE_IVAMONTO-RVDE_CONSUMO), RVDE_IVAMONTO, RVDE_CONSUMO, RVDE_DTOPORC, RVDE_TOTAL,
            ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD, R.terc_nit, R.revt_nomterc
            FROM REMISIONES_VENTA R, REMISIONES_VENTA_DETALLE D, PREFIJOS P, ARTICULO A
            WHERE R.REVT_ID = D.REVT_ID AND P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = 32 AND D.ARTI_COD = A.arti_cod AND
                VEND_COD >= :DESDE AND VEND_COD <= :HASTA AND
                A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
                A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN AND
                (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
                REVT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            ORDER BY VEND_COD, D.ARTI_COD, REVT_FECHA, R.REVT_ID, RVDE_ITEM
            INTO :PREFIJO, :NUMERO, :FECHA, :CODVEND, :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO, :DTO, :TOTAL,
                :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :NIT, :nomcliente
            DO
            BEGIN
            select VEND_NOMBRE from VENDEDORES where VEND_COD = :CODVEND INTO :NOMVEND;
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            SUSPEND;
            END
        END
    if (BIN_AND(TIPO, 4) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 33 INTO :NOMTIPO;
        FOR SELECT V.PREF_PRE, DEVT_NUMERO, DEVT_FECHA, VEND_COD, D.ARTI_COD, DVDE_CANT * DVDE_FACTOR, (DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO)*DEVT_FACTOR, DVDE_IVAMONTO*DEVT_FACTOR, DVDE_CONSUMO, DVDE_DTOPORC, DVDE_TOTAL*DEVT_FACTOR,
            ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD, V.terc_nit, V.devt_nomterc
            FROM DEVOLUCIONES_VENTAS V, DEVOLUCIONES_VENTAS_DETALLE D, PREFIJOS P, ARTICULO A
            WHERE V.DEVT_ID = D.DEVT_ID AND P.PREF_PRE = V.PREF_PRE AND P.TIDO_COD = 33 AND D.ARTI_COD = A.arti_cod AND
                VEND_COD >= :DESDE AND VEND_COD <= :HASTA AND
                A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
                A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND
                (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
                DEVT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            ORDER BY VEND_COD, D.ARTI_COD, DEVT_FECHA, V.DEVT_ID, DVDE_ITEM
            INTO :PREFIJO, :NUMERO, :FECHA, :CODVEND, :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO, :DTO, :TOTAL,
                :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :NIT, :nomcliente
            DO
            BEGIN
            select VEND_NOMBRE from VENDEDORES where VEND_COD = :CODVEND INTO :NOMVEND;
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            SUSPEND;
            END
        END
    if (BIN_AND(TIPO, 8) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 34 INTO :NOMTIPO;
        FOR SELECT P.PREF_PRE, PEDI_NUMERO, PEDI_FECHA, VEND_COD, D.ARTI_COD, PEDE_CANT * PEDE_FACTOR, (PEDE_TOTAL-PEDE_IVAMONTO-PEDE_CONSUMO)*PEDI_FACTOR, PEDE_IVAMONTO*PEDI_FACTOR, PEDE_CONSUMO, PEDE_DTOPORC, PEDE_TOTAL*PEDI_FACTOR,
            ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD, P.terc_nit, P.pedi_nomterc
            FROM PEDIDOS P, PEDIDOS_DETALLE D, PREFIJOS R, ARTICULO A
            WHERE P.PEDI_ID = D.PEDI_ID AND P.PREF_PRE = R.PREF_PRE AND R.TIDO_COD = 34 AND D.ARTI_COD = A.arti_cod AND
                VEND_COD >= :DESDE AND VEND_COD <= :HASTA AND
                A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
                A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND
                (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
                PEDI_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            ORDER BY VEND_COD, D.ARTI_COD, PEDI_FECHA, P.PEDI_ID, PEDE_ITEM
            INTO :PREFIJO, :NUMERO, :FECHA, :CODVEND, :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO, :DTO, :TOTAL,
                :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :NIT, :nomcliente
            DO
            BEGIN
            select VEND_NOMBRE from VENDEDORES where VEND_COD = :CODVEND INTO :NOMVEND;
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            SUSPEND;
            END
        END
    if (BIN_AND(TIPO, 16) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 35 INTO :NOMTIPO;
        FOR SELECT C.PREF_PRE, COTI_NUMERO, COTI_FECHA, VEND_COD, D.ARTI_COD, CTDE_CANT * CTDE_FACTOR, (CTDE_TOTAL-CTDE_IVAMONTO-CTDE_CONSUMO)*COTI_FACTOR, CTDE_IVAMONTO*COTI_FACTOR, CTDE_CONSUMO, CTDE_DTOPORC, CTDE_TOTAL*COTI_FACTOR,
            ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD, C.terc_nit, C.coti_nomterc
            FROM COTIZACIONES C, COTIZACIONES_DETALLE D, PREFIJOS P, ARTICULO A
            WHERE C.COTI_ID = D.COTI_ID AND P.PREF_PRE = C.PREF_PRE AND P.TIDO_COD = 35 AND D.ARTI_COD = A.arti_cod AND
                VEND_COD >= :DESDE AND VEND_COD <= :HASTA AND
                A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
                A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND COTI_FECHA >= :FECINI AND COTI_FECHA <= :FECFIN AND
                (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
                COTI_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            ORDER BY VEND_COD, D.ARTI_COD, COTI_FECHA, C.COTI_ID, CTDE_ITEM
            INTO :PREFIJO, :NUMERO, :FECHA, :CODVEND, :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO, :DTO, :TOTAL,
                :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :NIT, :nomcliente
            DO
            BEGIN
            select VEND_NOMBRE from VENDEDORES where VEND_COD = :CODVEND INTO :NOMVEND;
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            SUSPEND;
            END
        END
    END
  ELSE
if (DETALLE = 'C') then
    BEGIN
    if (BIN_AND(TIPO, 1) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 31 INTO :NOMTIPO;
        FOR SELECT MAX(D.ARTI_COD), MAX(VEND_COD), SUM(FADE_CANT * FADE_FACTOR), SUM((FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO)*FACT_FACTOR), SUM(FADE_IVAMONTO*FACT_FACTOR), SUM(FADE_CONSUMO), SUM(FADE_TOTAL*FACT_FACTOR),
            MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD), MAX(F.terc_nit), MAX(F.fact_nomcliente)
            FROM FACTURAS_DETALLE D, FACTURAS F, PREFIJOS P, ARTICULO A
            WHERE F.FACT_ID = D.FACT_ID AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND D.ARTI_COD = A.arti_cod AND
            VEND_COD >= :DESDE AND VEND_COD <= :HASTA AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            FACT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY F.VEND_COD, F.TERC_NIT, D.ARTI_COD
            INTO :ARTICULO, :CODVEND, :CANTIDAD, :BASE, :IVA, :CONSUMO, :TOTAL,
            :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :nit, :nomcliente
            DO
            BEGIN
            select VEND_NOMBRE from VENDEDORES where VEND_COD = :CODVEND INTO :NOMVEND;
            SELECT C.ZONA_COD, ZONA_NOM FROM CLIENTES C, ZONAS Z WHERE C.zona_cod = Z.zona_cod AND C.terc_nit = :nit INTO :codzona, :nomzona;
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            if (CEROS = 'S') then
                SUSPEND;
            ELSE
                if ((BASE <> 0) AND (CANTIDAD <> 0)) then
                    SUSPEND;
            END /* FOR */
        END
    if (BIN_AND(TIPO, 2) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 32 INTO :NOMTIPO;
        FOR SELECT MAX(D.ARTI_COD), MAX(VEND_COD), SUM(RVDE_CANT * RVDE_FACTOR), SUM(RVDE_TOTAL-RVDE_IVAMONTO-RVDE_CONSUMO), SUM(RVDE_IVAMONTO), SUM(RVDE_CONSUMO), SUM(RVDE_TOTAL),
            MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD), MAX(R.terc_nit), MAX(R.revt_nomterc)
            FROM REMISIONES_VENTA_DETALLE D, REMISIONES_VENTA R, PREFIJOS P, ARTICULO A
            WHERE R.REVT_ID = D.REVT_ID AND P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = 32 AND D.ARTI_COD = A.arti_cod AND
            VEND_COD >= :DESDE AND VEND_COD <= :HASTA AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            REVT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY R.vend_cod, R.terc_nit, D.arti_cod
            INTO :ARTICULO, :CODVEND, :CANTIDAD, :BASE, :IVA, :CONSUMO, :TOTAL,
            :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :nit, :nomcliente
            DO
            BEGIN
            SELECT C.ZONA_COD, ZONA_NOM FROM CLIENTES C, ZONAS Z WHERE C.zona_cod = Z.zona_cod AND C.terc_nit = :nit INTO :codzona, :nomzona;
            select VEND_NOMBRE from VENDEDORES where VEND_COD = :CODVEND INTO :NOMVEND;
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            if (CEROS = 'S') then
                SUSPEND;
            ELSE
                if ((BASE <> 0) AND (CANTIDAD <> 0)) then
                    SUSPEND;
            END /* FOR */
        END
    if (BIN_AND(TIPO, 4) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 33 INTO :NOMTIPO;
        FOR SELECT MAX(D.ARTI_COD), MAX(VEND_COD), SUM(DVDE_CANT * DVDE_FACTOR), SUM((DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO)*DEVT_FACTOR), SUM(DVDE_IVAMONTO*DEVT_FACTOR), SUM(DVDE_CONSUMO), SUM(DVDE_TOTAL*DEVT_FACTOR),
            MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD), MAX(V.terc_nit), MAX(V.devt_nomterc)
            FROM devoluciones_ventas_detalle D, DEVOLUCIONES_VENTAS V, PREFIJOS P, ARTICULO A
            WHERE V.DEVT_ID = D.DEVT_ID AND P.PREF_PRE = V.PREF_PRE AND P.TIDO_COD = 33 AND D.ARTI_COD = A.arti_cod AND
            VEND_COD >= :DESDE AND VEND_COD <= :HASTA AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            DEVT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY V.vend_cod, V.terc_nit, D.arti_cod
            INTO :ARTICULO, :CODVEND, :CANTIDAD, :BASE, :IVA, :CONSUMO, :TOTAL,
            :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :nit, :nomcliente
            DO
            BEGIN
            SELECT C.ZONA_COD, ZONA_NOM FROM CLIENTES C, ZONAS Z WHERE C.zona_cod = Z.zona_cod AND C.terc_nit = :nit INTO :codzona, :nomzona;
            select VEND_NOMBRE from VENDEDORES where VEND_COD = :CODVEND INTO :NOMVEND;
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            if (CEROS = 'S') then
                SUSPEND;
            ELSE
                if ((BASE <> 0) AND (CANTIDAD <> 0)) then
                    SUSPEND;
            END /* FOR */
        END
    if (BIN_AND(TIPO, 8) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 34 INTO :NOMTIPO;
        FOR SELECT MAX(D.ARTI_COD), MAX(VEND_COD), SUM(PEDE_CANT * PEDE_FACTOR), SUM((PEDE_TOTAL-PEDE_IVAMONTO-PEDE_CONSUMO)*PEDI_FACTOR), SUM(PEDE_IVAMONTO*PEDI_FACTOR), SUM(PEDE_CONSUMO), SUM(PEDE_TOTAL*PEDI_FACTOR),
            MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD), MAX(P.terc_nit), MAX(P.pedi_nomterc)
            FROM PEDIDOS_DETALLE D, PEDIDOS P, PREFIJOS R, ARTICULO A
            WHERE P.PEDI_ID = D.PEDI_ID AND P.PREF_PRE = R.PREF_PRE AND R.TIDO_COD = 34 AND D.ARTI_COD = A.arti_cod AND
            VEND_COD >= :DESDE AND VEND_COD <= :HASTA AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            PEDI_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY P.vend_cod, P.terc_nit, D.arti_cod
            INTO :ARTICULO, :CODVEND, :CANTIDAD, :BASE, :IVA, :CONSUMO, :TOTAL,
            :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :nit, :nomcliente
            DO
            BEGIN
            SELECT C.ZONA_COD, ZONA_NOM FROM CLIENTES C, ZONAS Z WHERE C.zona_cod = Z.zona_cod AND C.terc_nit = :nit INTO :codzona, :nomzona;
            select VEND_NOMBRE from VENDEDORES where VEND_COD = :CODVEND INTO :NOMVEND;
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            if (CEROS = 'S') then
                SUSPEND;
            ELSE
                if ((BASE <> 0) AND (CANTIDAD <> 0)) then
                    SUSPEND;
            END /* FOR */
        END
    if (BIN_AND(TIPO, 16) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 35 INTO :NOMTIPO;
        FOR SELECT MAX(D.ARTI_COD), MAX(VEND_COD), SUM(CTDE_CANT * CTDE_FACTOR), SUM((CTDE_TOTAL-CTDE_IVAMONTO-CTDE_CONSUMO)*COTI_FACTOR), SUM(CTDE_IVAMONTO*COTI_FACTOR), SUM(CTDE_CONSUMO), SUM(CTDE_TOTAL*COTI_FACTOR),
            MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD), MAX(C.terc_nit), MAX(C.coti_nomterc)
            FROM COTIZACIONES_DETALLE D, COTIZACIONES C, PREFIJOS P, ARTICULO A
            WHERE C.COTI_ID = D.COTI_ID AND P.PREF_PRE = C.PREF_PRE AND P.TIDO_COD = 35 AND D.ARTI_COD = A.arti_cod AND
            VEND_COD >= :DESDE AND VEND_COD <= :HASTA AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND COTI_FECHA >= :FECINI AND COTI_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            COTI_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY C.vend_cod, C.terc_nit, D.arti_cod
            INTO :ARTICULO, :CODVEND, :CANTIDAD, :BASE, :IVA, :CONSUMO, :TOTAL,
            :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :nit, :nomcliente
            DO
            BEGIN
            SELECT C.ZONA_COD, ZONA_NOM FROM CLIENTES C, ZONAS Z WHERE C.zona_cod = Z.zona_cod AND C.terc_nit = :nit INTO :codzona, :nomzona;
            select VEND_NOMBRE from VENDEDORES where VEND_COD = :CODVEND INTO :NOMVEND;
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            if (CEROS = 'S') then
                SUSPEND;
            ELSE
                if ((BASE <> 0) AND (CANTIDAD <> 0)) then
                    SUSPEND;
            END /* FOR */
        END
    END
if (zona = 'S') then
    BEGIN
    if (BIN_AND(TIPO, 1) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 31 INTO :NOMTIPO;
        FOR SELECT MAX(D.ARTI_COD), MAX(F.VEND_COD), SUM(FADE_CANT * FADE_FACTOR), SUM((FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO)*FACT_FACTOR), SUM(FADE_IVAMONTO*FACT_FACTOR), SUM(FADE_CONSUMO), SUM(FADE_TOTAL*FACT_FACTOR),
            MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD), MAX(F.terc_nit), MAX(F.fact_nomcliente)
            FROM FACTURAS_DETALLE D, FACTURAS F, PREFIJOS P, ARTICULO A, clientes C, ZONAS Z
            WHERE F.FACT_ID = D.FACT_ID AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND D.ARTI_COD = A.arti_cod AND
            F.VEND_COD >= :DESDE AND F.VEND_COD <= :HASTA AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            FACT_ANULADO = 'N' AND ((P.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) AND F.terc_nit = C.terc_nit AND
            Z.zona_cod = C.zona_cod AND C.zona_cod >= :zonaini AND C.zona_cod <= :zonafin
            GROUP BY F.VEND_COD, C.zona_cod ,D.ARTI_COD , C.terc_nit
            INTO :ARTICULO, :CODVEND, :CANTIDAD, :BASE, :IVA, :CONSUMO, :TOTAL,
            :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :nit, :nomcliente
            DO
            BEGIN
            select VEND_NOMBRE from VENDEDORES where VEND_COD = :CODVEND INTO :NOMVEND;
            SELECT C.ZONA_COD, ZONA_NOM FROM CLIENTES C, ZONAS Z WHERE C.zona_cod = Z.zona_cod AND C.terc_nit = :nit /*AND Z.zona_cod >= :zonaini AND Z.zona_cod >= :zonafin*/ INTO :codzona, :nomzona;
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            if (CEROS = 'S') then
                SUSPEND;
            ELSE
                if ((BASE <> 0) AND (CANTIDAD <> 0)) then
                    SUSPEND;
            END /* FOR */
        END
    if (BIN_AND(TIPO, 2) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 32 INTO :NOMTIPO;
        FOR SELECT MAX(D.ARTI_COD), MAX(R.VEND_COD), SUM(RVDE_CANT * RVDE_FACTOR), SUM(RVDE_TOTAL-RVDE_IVAMONTO-RVDE_CONSUMO), SUM(RVDE_IVAMONTO), SUM(RVDE_CONSUMO), SUM(RVDE_TOTAL),
            MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD), MAX(R.terc_nit), MAX(R.revt_nomterc)
            FROM REMISIONES_VENTA_DETALLE D, REMISIONES_VENTA R, PREFIJOS P, ARTICULO A, clientes C, ZONAS Z
            WHERE R.REVT_ID = D.REVT_ID AND P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = 32 AND D.ARTI_COD = A.arti_cod AND
            R.VEND_COD >= :DESDE AND R.VEND_COD <= :HASTA AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            REVT_ANULADO = 'N' AND ((P.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))AND R.terc_nit = C.terc_nit AND
            Z.zona_cod = C.zona_cod AND C.zona_cod >= :zonaini AND C.zona_cod <= :zonafin
            GROUP BY R.vend_cod, c.zona_cod, D.arti_cod , R.terc_nit
            INTO :ARTICULO, :CODVEND, :CANTIDAD, :BASE, :IVA, :CONSUMO, :TOTAL,
            :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :nit, :nomcliente
            DO
            BEGIN
            SELECT C.ZONA_COD, ZONA_NOM FROM CLIENTES C, ZONAS Z WHERE C.zona_cod = Z.zona_cod AND C.terc_nit = :nit INTO :codzona, :nomzona;
            select VEND_NOMBRE from VENDEDORES where VEND_COD = :CODVEND INTO :NOMVEND;
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            if (CEROS = 'S') then
                SUSPEND;
            ELSE
                if ((BASE <> 0) AND (CANTIDAD <> 0)) then
                    SUSPEND;
            END /* FOR */
        END
    if (BIN_AND(TIPO, 4) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 33 INTO :NOMTIPO;
        FOR SELECT MAX(D.ARTI_COD), MAX(V.VEND_COD), SUM(DVDE_CANT * DVDE_FACTOR), SUM((DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO)*DEVT_FACTOR), SUM(DVDE_IVAMONTO*DEVT_FACTOR), SUM(DVDE_CONSUMO), SUM(DVDE_TOTAL*DEVT_FACTOR),
            MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD), MAX(V.terc_nit), MAX(V.devt_nomterc)
            FROM devoluciones_ventas_detalle D, DEVOLUCIONES_VENTAS V, PREFIJOS P, ARTICULO A, clientes C, ZONAS Z
            WHERE V.DEVT_ID = D.DEVT_ID AND P.PREF_PRE = V.PREF_PRE AND P.TIDO_COD = 33 AND D.ARTI_COD = A.arti_cod AND
            V.VEND_COD >= :DESDE AND V.VEND_COD <= :HASTA AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            DEVT_ANULADO = 'N' AND ((P.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))AND V.terc_nit = C.terc_nit AND
            Z.zona_cod = C.zona_cod AND C.zona_cod >= :zonaini AND C.zona_cod <= :zonafin
            GROUP BY V.vend_cod, c.zona_cod, D.arti_cod , V.terc_nit
            INTO :ARTICULO, :CODVEND, :CANTIDAD, :BASE, :IVA, :CONSUMO, :TOTAL,
            :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :nit, :nomcliente
            DO
            BEGIN
            SELECT C.ZONA_COD, ZONA_NOM FROM CLIENTES C, ZONAS Z WHERE C.zona_cod = Z.zona_cod AND C.terc_nit = :nit INTO :codzona, :nomzona;
            select VEND_NOMBRE from VENDEDORES where VEND_COD = :CODVEND INTO :NOMVEND;
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            if (CEROS = 'S') then
                SUSPEND;
            ELSE
                if ((BASE <> 0) AND (CANTIDAD <> 0)) then
                    SUSPEND;
            END /* FOR */
        END
    if (BIN_AND(TIPO, 8) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 34 INTO :NOMTIPO;
        FOR SELECT MAX(D.ARTI_COD), MAX(P.VEND_COD), SUM(PEDE_CANT * PEDE_FACTOR), SUM((PEDE_TOTAL-PEDE_IVAMONTO-PEDE_CONSUMO)*PEDI_FACTOR), SUM(PEDE_IVAMONTO*PEDI_FACTOR), SUM(PEDE_CONSUMO), SUM(PEDE_TOTAL*PEDI_FACTOR),
            MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD), MAX(P.terc_nit), MAX(P.pedi_nomterc)
            FROM PEDIDOS_DETALLE D, PEDIDOS P, PREFIJOS R, ARTICULO A, clientes C, ZONAS Z
            WHERE P.PEDI_ID = D.PEDI_ID AND P.PREF_PRE = R.PREF_PRE AND R.TIDO_COD = 34 AND D.ARTI_COD = A.arti_cod AND
            P.VEND_COD >= :DESDE AND P.VEND_COD <= :HASTA AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            PEDI_ANULADO = 'N' AND ((R.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))AND P.terc_nit = C.terc_nit AND
            Z.zona_cod = C.zona_cod AND C.zona_cod >= :zonaini AND C.zona_cod <= :zonafin
            GROUP BY P.vend_cod, c.zona_cod, D.arti_cod , P.terc_nit
            INTO :ARTICULO, :CODVEND, :CANTIDAD, :BASE, :IVA, :CONSUMO, :TOTAL,
            :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :nit, :nomcliente
            DO
            BEGIN
            SELECT C.ZONA_COD, ZONA_NOM FROM CLIENTES C, ZONAS Z WHERE C.zona_cod = Z.zona_cod AND C.terc_nit = :nit INTO :codzona, :nomzona;
            select VEND_NOMBRE from VENDEDORES where VEND_COD = :CODVEND INTO :NOMVEND;
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            if (CEROS = 'S') then
                SUSPEND;
            ELSE
                if ((BASE <> 0) AND (CANTIDAD <> 0)) then
                    SUSPEND;
            END /* FOR */
        END
    if (BIN_AND(TIPO, 16) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 35 INTO :NOMTIPO;
        FOR SELECT MAX(D.ARTI_COD), MAX(C.VEND_COD), SUM(CTDE_CANT * CTDE_FACTOR), SUM((CTDE_TOTAL-CTDE_IVAMONTO-CTDE_CONSUMO)*COTI_FACTOR), SUM(CTDE_IVAMONTO*COTI_FACTOR), SUM(CTDE_CONSUMO), SUM(CTDE_TOTAL*COTI_FACTOR),
            MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD), MAX(C.terc_nit), MAX(C.coti_nomterc)
            FROM COTIZACIONES_DETALLE D, COTIZACIONES C, PREFIJOS P, ARTICULO A, clientes T, ZONAS Z
            WHERE C.COTI_ID = D.COTI_ID AND P.PREF_PRE = C.PREF_PRE AND P.TIDO_COD = 35 AND D.ARTI_COD = A.arti_cod AND
            C.VEND_COD >= :DESDE AND C.VEND_COD <= :HASTA AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND COTI_FECHA >= :FECINI AND COTI_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            COTI_ANULADO = 'N' AND ((P.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))AND C.terc_nit = T.terc_nit AND
            Z.zona_cod = T.zona_cod AND T.zona_cod >= :zonaini AND T.zona_cod <= :zonafin
            GROUP BY C.vend_cod, t.zona_cod, D.arti_cod , C.terc_nit
            INTO :ARTICULO, :CODVEND, :CANTIDAD, :BASE, :IVA, :CONSUMO, :TOTAL,
            :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :nit, :nomcliente
            DO
            BEGIN
            SELECT C.ZONA_COD, ZONA_NOM FROM CLIENTES C, ZONAS Z WHERE C.zona_cod = Z.zona_cod AND C.terc_nit = :nit INTO :codzona, :nomzona;
            select VEND_NOMBRE from VENDEDORES where VEND_COD = :CODVEND INTO :NOMVEND;
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            if (CEROS = 'S') then
                SUSPEND;
            ELSE
                if ((BASE <> 0) AND (CANTIDAD <> 0)) then
                    SUSPEND;
            END /* FOR */
        END
    END
END
^

SET TERM ; ^

GRANT SELECT ON TIPO_DOCUMENTO TO PROCEDURE REP_ARTICULOS_VENDEDOR;
GRANT SELECT ON FACTURAS_DETALLE TO PROCEDURE REP_ARTICULOS_VENDEDOR;
GRANT SELECT ON FACTURAS TO PROCEDURE REP_ARTICULOS_VENDEDOR;
GRANT SELECT ON PREFIJOS TO PROCEDURE REP_ARTICULOS_VENDEDOR;
GRANT SELECT ON ARTICULO TO PROCEDURE REP_ARTICULOS_VENDEDOR;
GRANT SELECT ON VENDEDORES TO PROCEDURE REP_ARTICULOS_VENDEDOR;
GRANT SELECT ON GRUPO TO PROCEDURE REP_ARTICULOS_VENDEDOR;
GRANT SELECT ON MARCAS TO PROCEDURE REP_ARTICULOS_VENDEDOR;
GRANT SELECT ON SUBGRUPO TO PROCEDURE REP_ARTICULOS_VENDEDOR;
GRANT SELECT ON REMISIONES_VENTA_DETALLE TO PROCEDURE REP_ARTICULOS_VENDEDOR;
GRANT SELECT ON REMISIONES_VENTA TO PROCEDURE REP_ARTICULOS_VENDEDOR;
GRANT SELECT ON DEVOLUCIONES_VENTAS_DETALLE TO PROCEDURE REP_ARTICULOS_VENDEDOR;
GRANT SELECT ON DEVOLUCIONES_VENTAS TO PROCEDURE REP_ARTICULOS_VENDEDOR;
GRANT SELECT ON PEDIDOS_DETALLE TO PROCEDURE REP_ARTICULOS_VENDEDOR;
GRANT SELECT ON PEDIDOS TO PROCEDURE REP_ARTICULOS_VENDEDOR;
GRANT SELECT ON COTIZACIONES_DETALLE TO PROCEDURE REP_ARTICULOS_VENDEDOR;
GRANT SELECT ON COTIZACIONES TO PROCEDURE REP_ARTICULOS_VENDEDOR;
GRANT SELECT ON CLIENTES TO PROCEDURE REP_ARTICULOS_VENDEDOR;
GRANT SELECT ON ZONAS TO PROCEDURE REP_ARTICULOS_VENDEDOR;


update revision set revi_FECHA = '2008/08/31';
COMMIT WORK;

/* 20080905: SALDOS DOC CARTERA MEJORA EN LA VELOCIDAD DE LA CARTERA POR CLIENTE EN CLIENTES DE CONTADO - CAB */

CREATE INDEX SALDOS_DOC_CARTERA_IDX1
ON SALDOS_DOC_CARTERA (TERC_NIT,SDCA_FECHA);

SET TERM ^ ;

CREATE OR ALTER PROCEDURE CARTERA_CLIENTE(
    NIT VARCHAR(20),
    FECHA DATE,
    SUCURSAL VARCHAR(10))
RETURNS (
    TIPO INTEGER,
    ID INTEGER,
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(6),
    CONCEPTO VARCHAR(60),
    SALDO NUMERIC(18,2),
    RTFTE NUMERIC(18,2),
    RTIVA NUMERIC(18,2),
    RTICA NUMERIC(18,2),
    DTOF NUMERIC(18,2),
    TIPONOM VARCHAR(8),
    VENCE DATE,
    FECDOC DATE,
    DIAS INTEGER,
    RECPROV_ID INTEGER,
    RECIPROV CHAR(1),
    NOTA VARCHAR(256))
AS
declare variable FEC DATE;
declare variable DESC_RTES CHAR(2);
declare variable DTOAPL NUMERIC(18,2);
declare variable IDNOTA INTEGER;
declare variable AUTORET VARCHAR(10);
declare variable FAUTORET DATE;
BEGIN
EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'DESCONTAR RETENCIONES POR CAUSACION') returning_values (DESC_RTES);
EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'FECHA AUTORETENEDOR NO DESCONTAR RETENCIONES DEL SALDO PERO SI CONTABILIZARLAS') returning_values (AUTORET);
if (AUTORET <> '') then
    FAUTORET = CAST(AUTORET AS DATE);
else
    FAUTORET = '9999/12/31';
/* LAS DE ANTES DE LA AUTORETENCION */
if (DESC_RTES = 'SI') then
    FOR SELECT MAX(SDCA_TIPOREF), MAX(SDCA_IDREF), sum(SDCA_MONTO-SDCA_ABONO-SDCA_RTFTE-SDCA_RTIVA-SDCA_RTICA), SUM(SDCA_RTFTE - SDCA_ABRTFTE), SUM(SDCA_RTIVA - SDCA_ABRTIVA), SUM(SDCA_RTICA - SDCA_ABRTICA)
        FROM saldos_doc_cartera WHERE TERC_NIT = :nit AND (SDCA_FECHA <= :FECHA) AND (SDCA_FECHA < :FAUTORET) group by sdca_tiporef, sdca_idref
        INTO :TIPO, :ID, :SALDO, :RTFTE, :RTIVA, :RTICA
        DO
        begin
        if (SALDO <> 0) then
            BEGIN
            SELECT MVCL_FECHA, MVCL_VENCE, MVCL_PREFREF, MVCL_NUMREF, MVCL_CONC
              FROM MOVIMIENTO_CLIENTES WHERE TERC_NIT = :NIT AND mvcl_sucursal = :sucursal and MVCL_FECHA <= :FECHA AND MVCL_ABONO = 'N' and mvcl_tiporef = :tipo and mvcl_idref = :id
              INTO :FECDOC, :VENCE, :PREFIJO, :NUMERO, :CONCEPTO;
            DIAS = (FECHA -VENCE );
            SELECT TIDO_NOMCORTO FROM TIPO_DOCUMENTO WHERE TIDO_COD = :TIPO INTO :TIPONOM;
            if (TIPO = 41) then
                SELECT NDCL_DTOFMONTO, NDCL_FECHADTO FROM NOTAS_DEBITO_CLIENTES WHERE NDCL_ID = :ID INTO :DTOF, :FEC;
            if (TIPO = 42) then
                SELECT 0, NCCL_FECHA FROM NOTAS_CREDITO_CLIENTES WHERE NCCL_ID = :ID INTO :DTOF, :FEC;
            if (TIPO = 45) then
                SELECT ANCL_DTOFMONTO, ANCL_DTOFECHA FROM ANTICIPOS_CLIENTE WHERE ANCL_ID = :ID INTO :DTOF, :FEC;
            if (TIPO = 31) then
                SELECT FACT_DTOFMONTO, FACT_DTOFFECHA FROM FACTURAS WHERE FACT_ID = :ID INTO :DTOF, :FEC;
            if (TIPO = 33) then
                SELECT 0, :FECHA FROM devoluciones_ventas WHERE DEVT_ID = :ID INTO :DTOF, :FEC;

            recprov_id = 0;
            SELECT max(RCPR_ID) FROM recibo_provisional_detalle WHERE RPDE_IDDOC = :ID AND RPDE_TIPODOC = :TIPO and RPDE_ANULADO = 'N' INTO :recprov_id;
            if (recprov_id is null) then
                reciprov = 'N';
            ELSE
                reciprov = 'S';
            if (FECHA > FEC) then
                DTOF = 0;
            if (DTOF IS NULL) then
                DTOF = 0;
            if (DTOF <> 0) then
                BEGIN
                SELECT SUM(RCDE_DTOF) FROM RECIBOS_CAJA_DETALLE WHERE RCDE_IDDOC = :ID AND RCDE_TIPODOC = :TIPO INTO :DTOAPL;
                if (DTOAPL IS NULL) then
                    DTOAPL = 0;
                DTOF = DTOF - DTOAPL;
                END
            if (RTFTE IS NULL) then
                RTFTE = 0;
            if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) THEN
                BEGIN
                if (RTFTE > 0) then
                    RTFTE = 0;
                END
            ELSE
                BEGIN
                if (RTFTE < 0) then
                    RTFTE = 0;
                END

            if (RTIVA IS NULL) then
                RTIVA = 0;
            if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) THEN
                BEGIN
                if (RTIVA > 0) then
                    RTIVA = 0;
                END
            ELSE
                BEGIN
                if (RTIVA < 0) then
                    RTIVA = 0;
                END

            if (RTICA IS NULL) then
                RTICA = 0;
            if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) THEN
                BEGIN
                if (RTICA > 0) then
                    RTICA = 0;
                END
            ELSE
                BEGIN
                if (RTICA < 0) then
                    RTICA = 0;
                END

            /* SI TIENE NOTA AGREGUELA */
            SELECT MAX(NOCL_ID) FROM NOTAS_CLIENTES WHERE TERC_NIT = :NIT AND CLSU_COD = :SUCURSAL AND NOCL_TIPODOC = :TIPO AND NOCL_IDDOC = :ID INTO :IDNOTA;
            if (IDNOTA IS NOT NULL) then
                SELECT NOCL_TEXTO FROM NOTAS_CLIENTES WHERE NOCL_ID = :IDNOTA INTO :NOTA;
            else
                NOTA = '';
            SUSPEND;
            END
        end
ELSE
    FOR SELECT MAX(SDCA_TIPOREF), MAX(SDCA_IDREF), sum(SDCA_MONTO-SDCA_ABONO-SDCA_ABRTFTE-SDCA_ABRTIVA-SDCA_ABRTICA), SUM(SDCA_RTFTE - SDCA_ABRTFTE), SUM(SDCA_RTIVA - SDCA_ABRTIVA), SUM(SDCA_RTICA - SDCA_ABRTICA)
        FROM saldos_doc_cartera WHERE (TERC_NIT = :nit) AND (SDCA_FECHA <= :FECHA) AND (SDCA_FECHA < :FAUTORET) group by sdca_tiporef, sdca_idref
        INTO :TIPO, :ID, :SALDO, :RTFTE, :RTIVA, :RTICA
        DO
        begin
        if (SALDO <> 0) then
            BEGIN
            SELECT MVCL_FECHA, MVCL_VENCE, MVCL_PREFREF, MVCL_NUMREF, MVCL_CONC
              FROM MOVIMIENTO_CLIENTES WHERE TERC_NIT = :NIT AND mvcl_sucursal = :sucursal and MVCL_FECHA <= :FECHA AND MVCL_ABONO = 'N' and mvcl_tiporef = :tipo and mvcl_idref = :id
              INTO :FECDOC, :VENCE, :PREFIJO, :NUMERO, :CONCEPTO;
            DIAS = (FECHA -VENCE );
            SELECT TIDO_NOMCORTO FROM TIPO_DOCUMENTO WHERE TIDO_COD = :TIPO INTO :TIPONOM;
            if (TIPO = 41) then
                SELECT NDCL_DTOFMONTO, NDCL_FECHADTO FROM NOTAS_DEBITO_CLIENTES WHERE NDCL_ID = :ID INTO :DTOF, :FEC;
            if (TIPO = 42) then
                SELECT 0, NCCL_FECHA FROM NOTAS_CREDITO_CLIENTES WHERE NCCL_ID = :ID INTO :DTOF, :FEC;
            if (TIPO = 45) then
                SELECT ANCL_DTOFMONTO, ANCL_DTOFECHA FROM ANTICIPOS_CLIENTE WHERE ANCL_ID = :ID INTO :DTOF, :FEC;
            if (TIPO = 31) then
                SELECT FACT_DTOFMONTO, FACT_DTOFFECHA FROM FACTURAS WHERE FACT_ID = :ID INTO :DTOF, :FEC;
            if (TIPO = 33) then
                SELECT 0, :FECHA FROM devoluciones_ventas WHERE DEVT_ID = :ID INTO :DTOF, :FEC;

            recprov_id = 0;
            SELECT max(RCPR_ID) FROM recibo_provisional_detalle WHERE RPDE_IDDOC = :ID AND RPDE_TIPODOC = :TIPO and RPDE_ANULADO = 'N' INTO :recprov_id;
            if (recprov_id is null) then
                reciprov = 'N';
            ELSE
                reciprov = 'S';
            if (FECHA > FEC) then
                DTOF = 0;
            if (DTOF IS NULL) then
                DTOF = 0;
            if (DTOF <> 0) then
                BEGIN
                SELECT SUM(RCDE_DTOF) FROM RECIBOS_CAJA_DETALLE WHERE RCDE_IDDOC = :ID AND RCDE_TIPODOC = :TIPO INTO :DTOAPL;
                if (DTOAPL IS NULL) then
                    DTOAPL = 0;
                DTOF = DTOF - DTOAPL;
                END
            if (RTFTE IS NULL) then
                RTFTE = 0;
            if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) THEN
                BEGIN
                if (RTFTE > 0) then
                    RTFTE = 0;
                END
            ELSE
                BEGIN
                if (RTFTE < 0) then
                    RTFTE = 0;
                END

            if (RTIVA IS NULL) then
                RTIVA = 0;
            if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) THEN
                BEGIN
                if (RTIVA > 0) then
                    RTIVA = 0;
                END
            ELSE
                BEGIN
                if (RTIVA < 0) then
                    RTIVA = 0;
                END

            if (RTICA IS NULL) then
                RTICA = 0;
            if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) THEN
                BEGIN
                if (RTICA > 0) then
                    RTICA = 0;
                END
            ELSE
                BEGIN
                if (RTICA < 0) then
                    RTICA = 0;
                END

            /* SI TIENE NOTA AGREGUELA */
            SELECT MAX(NOCL_ID) FROM NOTAS_CLIENTES WHERE TERC_NIT = :NIT AND CLSU_COD = :SUCURSAL AND NOCL_TIPODOC = :TIPO AND NOCL_IDDOC = :ID INTO :IDNOTA;
            if (IDNOTA IS NOT NULL) then
                SELECT NOCL_TEXTO FROM NOTAS_CLIENTES WHERE NOCL_ID = :IDNOTA INTO :NOTA;
            else
                NOTA = '';
            SUSPEND;
            END
        end
/* LAS DE DESPUES DE LA AUTORETENCION */
if (DESC_RTES = 'SI') then
    FOR SELECT MAX(SDCA_TIPOREF), MAX(SDCA_IDREF), sum(SDCA_MONTO-SDCA_ABONO-SDCA_RTIVA-SDCA_RTICA), 0, SUM(SDCA_RTIVA - SDCA_ABRTIVA), SUM(SDCA_RTICA - SDCA_ABRTICA)
        FROM saldos_doc_cartera WHERE (TERC_NIT = :nit) AND (SDCA_FECHA <= :FECHA) AND (SDCA_FECHA >= :FAUTORET) group by sdca_tiporef, sdca_idref
        INTO :TIPO, :ID, :SALDO, :RTFTE, :RTIVA, :RTICA
        DO
        begin
        if (SALDO <> 0) then
            BEGIN
            SELECT MVCL_FECHA, MVCL_VENCE, MVCL_PREFREF, MVCL_NUMREF, MVCL_CONC
              FROM MOVIMIENTO_CLIENTES WHERE TERC_NIT = :NIT AND mvcl_sucursal = :sucursal and MVCL_FECHA <= :FECHA AND MVCL_ABONO = 'N' and mvcl_tiporef = :tipo and mvcl_idref = :id
              INTO :FECDOC, :VENCE, :PREFIJO, :NUMERO, :CONCEPTO;
            DIAS = (FECHA -VENCE );
            SELECT TIDO_NOMCORTO FROM TIPO_DOCUMENTO WHERE TIDO_COD = :TIPO INTO :TIPONOM;
            if (TIPO = 41) then
                SELECT NDCL_DTOFMONTO, NDCL_FECHADTO FROM NOTAS_DEBITO_CLIENTES WHERE NDCL_ID = :ID INTO :DTOF, :FEC;
            if (TIPO = 42) then
                SELECT 0, NCCL_FECHA FROM NOTAS_CREDITO_CLIENTES WHERE NCCL_ID = :ID INTO :DTOF, :FEC;
            if (TIPO = 45) then
                SELECT ANCL_DTOFMONTO, ANCL_DTOFECHA FROM ANTICIPOS_CLIENTE WHERE ANCL_ID = :ID INTO :DTOF, :FEC;
            if (TIPO = 31) then
                SELECT FACT_DTOFMONTO, FACT_DTOFFECHA FROM FACTURAS WHERE FACT_ID = :ID INTO :DTOF, :FEC;
            if (TIPO = 33) then
                SELECT 0, :FECHA FROM devoluciones_ventas WHERE DEVT_ID = :ID INTO :DTOF, :FEC;

            recprov_id = 0;
            SELECT max(RCPR_ID) FROM recibo_provisional_detalle WHERE RPDE_IDDOC = :ID AND RPDE_TIPODOC = :TIPO and RPDE_ANULADO = 'N' INTO :recprov_id;
            if (recprov_id is null) then
                reciprov = 'N';
            ELSE
                reciprov = 'S';
            if (FECHA > FEC) then
                DTOF = 0;
            if (DTOF IS NULL) then
                DTOF = 0;
            if (DTOF <> 0) then
                BEGIN
                SELECT SUM(RCDE_DTOF) FROM RECIBOS_CAJA_DETALLE WHERE RCDE_IDDOC = :ID AND RCDE_TIPODOC = :TIPO INTO :DTOAPL;
                if (DTOAPL IS NULL) then
                    DTOAPL = 0;
                DTOF = DTOF - DTOAPL;
                END

            if (RTIVA IS NULL) then
                RTIVA = 0;
            if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) THEN
                BEGIN
                if (RTIVA > 0) then
                    RTIVA = 0;
                END
            ELSE
                BEGIN
                if (RTIVA < 0) then
                    RTIVA = 0;
                END

            if (RTICA IS NULL) then
                RTICA = 0;
            if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) THEN
                BEGIN
                if (RTICA > 0) then
                    RTICA = 0;
                END
            ELSE
                BEGIN
                if (RTICA < 0) then
                    RTICA = 0;
                END

            /* SI TIENE NOTA AGREGUELA */
            SELECT MAX(NOCL_ID) FROM NOTAS_CLIENTES WHERE TERC_NIT = :NIT AND CLSU_COD = :SUCURSAL AND NOCL_TIPODOC = :TIPO AND NOCL_IDDOC = :ID INTO :IDNOTA;
            if (IDNOTA IS NOT NULL) then
                SELECT NOCL_TEXTO FROM NOTAS_CLIENTES WHERE NOCL_ID = :IDNOTA INTO :NOTA;
            else
                NOTA = '';
            SUSPEND;
            END
        end
ELSE
    FOR SELECT MAX(SDCA_TIPOREF), MAX(SDCA_IDREF), sum(SDCA_MONTO-SDCA_ABONO-SDCA_ABRTIVA-SDCA_ABRTICA), SUM(SDCA_RTFTE - SDCA_ABRTFTE), SUM(SDCA_RTIVA - SDCA_ABRTIVA), SUM(SDCA_RTICA - SDCA_ABRTICA)
        FROM saldos_doc_cartera WHERE (TERC_NIT = :nit) AND (SDCA_FECHA <= :FECHA) AND (SDCA_FECHA >= :FAUTORET) group by sdca_tiporef, sdca_idref
        INTO :TIPO, :ID, :SALDO, :RTFTE, :RTIVA, :RTICA
        DO
        begin
        if (SALDO <> 0) then
            BEGIN
            SELECT MVCL_FECHA, MVCL_VENCE, MVCL_PREFREF, MVCL_NUMREF, MVCL_CONC
              FROM MOVIMIENTO_CLIENTES WHERE TERC_NIT = :NIT AND mvcl_sucursal = :sucursal and MVCL_FECHA <= :FECHA AND MVCL_ABONO = 'N' and mvcl_tiporef = :tipo and mvcl_idref = :id
              INTO :FECDOC, :VENCE, :PREFIJO, :NUMERO, :CONCEPTO;
            DIAS = (FECHA -VENCE );
            SELECT TIDO_NOMCORTO FROM TIPO_DOCUMENTO WHERE TIDO_COD = :TIPO INTO :TIPONOM;
            if (TIPO = 41) then
                SELECT NDCL_DTOFMONTO, NDCL_FECHADTO FROM NOTAS_DEBITO_CLIENTES WHERE NDCL_ID = :ID INTO :DTOF, :FEC;
            if (TIPO = 42) then
                SELECT 0, NCCL_FECHA FROM NOTAS_CREDITO_CLIENTES WHERE NCCL_ID = :ID INTO :DTOF, :FEC;
            if (TIPO = 45) then
                SELECT ANCL_DTOFMONTO, ANCL_DTOFECHA FROM ANTICIPOS_CLIENTE WHERE ANCL_ID = :ID INTO :DTOF, :FEC;
            if (TIPO = 31) then
                SELECT FACT_DTOFMONTO, FACT_DTOFFECHA FROM FACTURAS WHERE FACT_ID = :ID INTO :DTOF, :FEC;
            if (TIPO = 33) then
                SELECT 0, :FECHA FROM devoluciones_ventas WHERE DEVT_ID = :ID INTO :DTOF, :FEC;

            recprov_id = 0;
            SELECT max(RCPR_ID) FROM recibo_provisional_detalle WHERE RPDE_IDDOC = :ID AND RPDE_TIPODOC = :TIPO and RPDE_ANULADO = 'N' INTO :recprov_id;
            if (recprov_id is null) then
                reciprov = 'N';
            ELSE
                reciprov = 'S';
            if (FECHA > FEC) then
                DTOF = 0;
            if (DTOF IS NULL) then
                DTOF = 0;
            if (DTOF <> 0) then
                BEGIN
                SELECT SUM(RCDE_DTOF) FROM RECIBOS_CAJA_DETALLE WHERE RCDE_IDDOC = :ID AND RCDE_TIPODOC = :TIPO INTO :DTOAPL;
                if (DTOAPL IS NULL) then
                    DTOAPL = 0;
                DTOF = DTOF - DTOAPL;
                END

            if (RTIVA IS NULL) then
                RTIVA = 0;
            if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) THEN
                BEGIN
                if (RTIVA > 0) then
                    RTIVA = 0;
                END
            ELSE
                BEGIN
                if (RTIVA < 0) then
                    RTIVA = 0;
                END

            if (RTICA IS NULL) then
                RTICA = 0;
            if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) THEN
                BEGIN
                if (RTICA > 0) then
                    RTICA = 0;
                END
            ELSE
                BEGIN
                if (RTICA < 0) then
                    RTICA = 0;
                END

            /* SI TIENE NOTA AGREGUELA */
            SELECT MAX(NOCL_ID) FROM NOTAS_CLIENTES WHERE TERC_NIT = :NIT AND CLSU_COD = :SUCURSAL AND NOCL_TIPODOC = :TIPO AND NOCL_IDDOC = :ID INTO :IDNOTA;
            if (IDNOTA IS NOT NULL) then
                SELECT NOCL_TEXTO FROM NOTAS_CLIENTES WHERE NOCL_ID = :IDNOTA INTO :NOTA;
            else
                NOTA = '';
            SUSPEND;
            END
        end
END
^

SET TERM ; ^


/* 20080908: BASE Y PORCENTAJE DE RETENCIONES EN NOTAS DE PROVEEDORES */
SET TERM ^ ;

CREATE OR ALTER PROCEDURE CONTABIL_NOTADBPR(
    IDDOC INTEGER,
    IDINTER INTEGER)
RETURNS (
    ERROR INTEGER,
    VER CHAR(1),
    IDC INTEGER)
AS
declare variable PREF VARCHAR(4);
declare variable NUM VARCHAR(6);
declare variable NUMERO VARCHAR(10);
declare variable FECAUX DATE;
declare variable FECHA CHAR(8);
declare variable CONC CHAR(120);
declare variable VENCEAUX DATE;
declare variable VENCE CHAR(8);
declare variable VRSUBT NUMERIC(18, 2);
declare variable VRIVA NUMERIC(18, 2);
declare variable PRTFTE NUMERIC(9, 2);
declare variable VRRTFTE NUMERIC(18, 2);
declare variable PRTIVA NUMERIC(9, 2);
declare variable VRRTIVA NUMERIC(18, 2);
declare variable PRTICA NUMERIC(9, 2);
declare variable VRRTICA NUMERIC(18, 2);
declare variable VRTOTAL NUMERIC(18, 2);
declare variable TIPOCOMP VARCHAR(3);
declare variable PREFCONT VARCHAR(4);
declare variable BASE CHAR(1);
declare variable CTABASE VARCHAR(20);
declare variable IVA CHAR(1);
declare variable CTAIVA VARCHAR(20);
declare variable CLIE CHAR(1);
declare variable CTACLIE VARCHAR(20);
declare variable RTFTE CHAR(1);
declare variable CTARTFTE VARCHAR(20);
declare variable RTIVA CHAR(1);
declare variable CTARTIVA VARCHAR(20);
declare variable RTICA CHAR(1);
declare variable CTARTICA VARCHAR(20);
declare variable EXISTE CHAR(1);
declare variable CUENTA VARCHAR(20);
declare variable MONTO NUMERIC(18,2);
declare variable ES_RETENCION CHAR(1);
declare variable TIPOCUEN CHAR(1);
declare variable NIT VARCHAR(20);
declare variable PROY VARCHAR(4);
declare variable CENTRO VARCHAR(4);
declare variable MONTOBASE NUMERIC(18,2);
declare variable PORC NUMERIC(5,2);
declare variable DEBITO NUMERIC(18,2);
declare variable CREDITO NUMERIC(18,2);
declare variable NROI INTEGER;
declare variable SUMA NUMERIC(18,2);
declare variable TCTACLIEN VARCHAR(20);
declare variable TCTABASE VARCHAR(20);
declare variable TCTARTFTE VARCHAR(20);
declare variable TCTARTIVA VARCHAR(20);
declare variable TCTARTICA VARCHAR(20);
declare variable CUENTAADIC VARCHAR(20);
declare variable BASEADIC VARCHAR(20);
declare variable PORCADIC NUMERIC(5,2);
declare variable VALORADIC NUMERIC(18,2);
declare variable DBADIC CHAR(1);
declare variable NPROY VARCHAR(4);
declare variable NCENTRO VARCHAR(4);
declare variable ANULADO CHAR(1);
BEGIN
ERROR = 0;
/* BUSQUE LA INTERFACE */
EXISTE = 'N';
SELECT 'S', TICO_COD, PRCO_PRE, INCP_BASE, INCP_IVA, INCP_RTFTE, INCP_RTIVA, INCP_RTICA, INCP_PROV, INCP_CTABASE, INCP_CTAIVA, INCP_CTARTFTE, INCP_CTARTIVA, INCP_CTARTICA, INCP_CTAPROV, INCP_CONFIRMAR
    FROM INTERFAZ_CXPAGAR
    WHERE INCP_ID = :IDINTER
    INTO :EXISTE, :TIPOCOMP, :PREFCONT, :BASE, :IVA, :RTFTE, :RTIVA, :RTICA, :CLIE, :CTABASE, :CTAIVA, :CTARTFTE, :CTARTIVA, :CTARTICA, :CTACLIE, :VER;

if (EXISTE = 'S') then
  BEGIN
  /* BORRE CUALQUEIR CONTABILIZACION PREVIA */
  DELETE FROM CONTABILIZACION WHERE CNTB_TIPOREF = 51 AND CNTB_IDREF = :IDDOC;
  /* TRAIGA EL ENCABEZADO DE LA NOTA */
  SELECT PREF_PRE, NDPR_NUMERO, NDPR_FECHA, NDPR_VENCE, N.TERC_NIT, NDPR_CONC, NDPR_IVAPORC, NDPR_IVAMONTO, NDPR_MONTO, NDPR_RTFTEPORC, NDPR_RTFTEMONTO, NDPR_RTIVAPORC, NDPR_RTIVAMONTO, NDPR_RTICAPORC, NDPR_RTICAMONTO, TERC_CTAVENTA, TERC_CTARTFTE, TERC_CTARTIVA, TERC_CTARTICA, TERC_CTACLIENTE, NDPR_PROY, NDPR_CENTRO, NDPR_ANULADO
        FROM NOTAS_DEBITO_PROVEEDOR N, TERCEROS T
        WHERE NDPR_ID = :IDDOC AND N.TERC_NIT = T.TERC_NIT
        INTO :PREF, :NUM, :FECAUX, :VENCEAUX, :NIT, :CONC, :PORC, :VRIVA, :VRTOTAL, :PRTFTE, :VRRTFTE, :PRTIVA, :VRRTIVA, :PRTICA, :VRRTICA, :TCTABASE, TCTARTFTE, TCTARTIVA, TCTARTICA, TCTACLIEN, NPROY, NCENTRO, ANULADO;
  if (ANULADO = 'N') then
    BEGIN
    /* SI ES PROVEEDOR, SOBREESCIBE LAS CUENTAS  */
    SELECT PROV_CTAPAGAR, PROV_CTARTFTE, PROV_CTARTIVA, PROV_CTARTICA, PROV_CTACAUSA
        FROM PROVEEDORES WHERE TERC_NIT = :NIT
        INTO TCTACLIEN, TCTARTFTE, TCTARTIVA, TCTARTICA, TCTABASE;
        
    /* SI EL DOCUMENTO ESPECIFICA ALGUNAS SOBRESCRIBA LAS DEL PROVEEDOR */
    SELECT NDPR_CTAPAGAR, NDPR_CTACAUSA
        FROM NOTAS_DEBITO_PROVEEDOR
        WHERE NDPR_ID = :IDDOC
        INTO :TCTACLIEN, TCTABASE;
    SELECT PREF_CENTRO, PREF_PROY FROM PREFIJOS P, NOTAS_DEBITO_PROVEEDOR N
        WHERE P.PREF_PRE = N.PREF_PRE AND P.TIDO_COD = 51 AND N.NDPR_ID = :IDDOC INTO :CENTRO, :PROY;
    if (NPROY <> '') then
        PROY = NPROY;
    if (NCENTRO <> '') then
        CENTRO = NCENTRO;
    NUMERO = PREF || NUM;
    VRSUBT = VRTOTAL; /* BASE DE RETEFTE Y RETEICA */

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

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

    NROI = 0;
    SUMA = 0;

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

        if (VRSUBT <> 0) then
            BEGIN
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO, CUEN_RETENCION FROM CUENTAS
                WHERE CUEN_COD = :CTABASE INTO :CUENTA, :TIPOCUEN, :ES_RETENCION;
            if (CUENTA IS NULL) then
                begin
                INSERT INTO  ERRORES (ERRO_ITEM, ERRO_TIPODOC, ERRO_IDDOC, ERRO_CODIGO, ERRO_CANT, ERRO_CADENA)
                    VALUES(GEN_ID(id_errores, 1), 51, :IDDOC, 'CUENTA NO EXISTE', 0, :CTABASE);
                CUENTA = CTABASE;
                ERROR = ERROR + 1;
                end
            if (ES_RETENCION = 'S') then
                if ((prtiva <> 0) and (vriva = 0)) then
                    montobase = FLOOR(VRSUBT / prtiva);
                else
                    montobase = VRSUBT;
            else
                montobase = 0;
            if (TIPOCUEN = 'I') then
                BEGIN
                INSERT INTO  ERRORES (ERRO_ITEM, ERRO_TIPODOC, ERRO_IDDOC, ERRO_CODIGO, ERRO_CANT, ERRO_CADENA)
                    VALUES(GEN_ID(id_errores, 1), 51, :IDDOC, 'CUENTA DE INVENTARIO', 0, :CUENTA);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRSUBT, 0, :MONTOBASE, :prtiva, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 41);
                NROI = NROI + 1;
                SUMA = SUMA + VRSUBT;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRSUBT, 0, :MONTOBASE, :prtiva, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA + VRSUBT;
                END
            END /* MONTO <> 0 */
        END /* BASE TERCERO O CONSTANTE */
        
    if (IVA = 'K') then /* IVA EN CTA CONSTANTE */
        BEGIN
        if (VRIVA <> 0) then
            BEGIN
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTAIVA INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                INSERT INTO  ERRORES (ERRO_ITEM, ERRO_TIPODOC, ERRO_IDDOC, ERRO_CODIGO, ERRO_CANT, ERRO_CADENA)
                    VALUES(GEN_ID(id_errores, 1), 51, :IDDOC, 'CUENTA NO EXISTE', 0, :CTAIVA);
                CUENTA = CTAIVA;
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                INSERT INTO  ERRORES (ERRO_ITEM, ERRO_TIPODOC, ERRO_IDDOC, ERRO_CODIGO, ERRO_CANT, ERRO_CADENA)
                    VALUES(GEN_ID(id_errores, 1), 51, :IDDOC, 'CUENTA DE INVENTARIO', 0, :CUENTA);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', :VRIVA, 0, :vrsubt, :porc, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 41);
                NROI = NROI + 1;
                SUMA = SUMA + VRIVA;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', :VRIVA, 0, :vrsubt, :porc, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA + VRIVA;
                END
            END /* VRIVA <> 0 */
        END /* IVA EN CTA CONSTANTE */
        
    /* RETENCION FUENTE */
    if ((RTFTE = 'T') or (RTFTE = 'K')) then
      if (VRRTFTE <> 0) then
        BEGIN
        if (RTFTE = 'T') then
            CTARTFTE = TCTARTFTE;
            
        CUENTA = NULL;
        SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
            WHERE CUEN_COD = :CTARTFTE INTO :CUENTA, :TIPOCUEN;
        if (CUENTA IS NULL) then
            begin
            INSERT INTO  ERRORES (ERRO_ITEM, ERRO_TIPODOC, ERRO_IDDOC, ERRO_CODIGO, ERRO_CANT, ERRO_CADENA)
                VALUES(GEN_ID(id_errores, 1), 51, :IDDOC, 'CUENTA NO EXISTE', 0, :CTARTFTE);
            CUENTA = CTARTFTE;
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            INSERT INTO  ERRORES (ERRO_ITEM, ERRO_TIPODOC, ERRO_IDDOC, ERRO_CODIGO, ERRO_CANT, ERRO_CADENA)
                    VALUES(GEN_ID(id_errores, 1), 51, :IDDOC, 'CUENTA DE INVENTARIO', 0, :CUENTA);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, :VRSUBT, :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 41);
            NROI = NROI + 1;
            SUMA = SUMA - VRRTFTE;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, :VRSUBT, :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA - VRRTFTE;
            END
        END /* RTFTE */
        
    /* RETENCION IVA */
    if ((RTIVA = 'T') or (RTIVA = 'K')) then
      if (VRRTIVA <> 0) then
        BEGIN
        if (RTIVA = 'T') then
            CTARTIVA = TCTARTIVA;
            
        CUENTA = NULL;
        SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
            WHERE CUEN_COD = :CTARTIVA INTO :CUENTA, :TIPOCUEN;
        if (CUENTA IS NULL) then
            begin
            INSERT INTO  ERRORES (ERRO_ITEM, ERRO_TIPODOC, ERRO_IDDOC, ERRO_CODIGO, ERRO_CANT, ERRO_CADENA)
                VALUES(GEN_ID(id_errores, 1), 51, :IDDOC, 'CUENTA NO EXISTE', 0, :CTARTIVA);
            CUENTA = CTARTIVA;
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            INSERT INTO  ERRORES (ERRO_ITEM, ERRO_TIPODOC, ERRO_IDDOC, ERRO_CODIGO, ERRO_CANT, ERRO_CADENA)
                VALUES(GEN_ID(id_errores, 1), 51, :IDDOC, 'CUENTA DE INVENTARIO', 0, :CUENTA);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTIVA, :VRIVA, :prtiva, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 41);
            NROI = NROI + 1;
            SUMA = SUMA - VRRTIVA;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTIVA, :VRIVA, :prtiva, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA - VRRTIVA;
            END
        END /* RTIVA */
        
    /* RETENCION DE ICA */
    if ((RTICA = 'T') or (RTICA = 'K')) then
      if (VRRTICA <> 0) then
        BEGIN
        if (RTICA = 'T') then
            CTARTICA = TCTARTICA;
            
        CUENTA = NULL;
        SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
            WHERE CUEN_COD = :CTARTICA INTO :CUENTA, :TIPOCUEN;
        if (CUENTA IS NULL) then
            begin
            INSERT INTO  ERRORES (ERRO_ITEM, ERRO_TIPODOC, ERRO_IDDOC, ERRO_CODIGO, ERRO_CANT, ERRO_CADENA)
                    VALUES(GEN_ID(id_errores, 1), 51, :IDDOC, 'CUENTA NO EXISTE', 0, :CTARTICA);
            CUENTA = CTARTICA;
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            INSERT INTO  ERRORES (ERRO_ITEM, ERRO_TIPODOC, ERRO_IDDOC, ERRO_CODIGO, ERRO_CANT, ERRO_CADENA)
                VALUES(GEN_ID(id_errores, 1), 51, :IDDOC, 'CUENTA DE INVENTARIO', 0, :CUENTA);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTICA, :VRSUBT, :PRTICA, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 41);
            NROI = NROI + 1;
            SUMA = SUMA - VRRTICA;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTICA, :VRSUBT, :PRTICA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA - VRRTICA;
            END
        END /* RTICA */
        
    /* recorra las cuentas adicionales */
    FOR SELECT INPC_CUENTA, INPC_BASE, INPC_PORC, INPC_VALOR, INPC_DB
        FROM INTERFAZ_CXPAGAR_CTAS
        WHERE INCP_ID = :IDINTER
        INTO :CUENTAADIC, :BASEADIC, :PORCADIC, :VALORADIC, :DBADIC
        DO
        BEGIN
        if (:BASEADIC = 'SUBTOTAL') then
            VALORADIC = VRTOTAL - VRIVA;
        if (:BASEADIC = 'IVA') then
            VALORADIC = VRIVA;
        if (:BASEADIC = 'TOTAL') then
            VALORADIC = VRTOTAL;
        MONTO = VALORADIC * PORCADIC;
        
        /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
        CUENTA = NULL;
        SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
            WHERE CUEN_COD = :CUENTAADIC INTO :CUENTA, :TIPOCUEN;
        IF (CUENTA IS NULL) THEN
            begin
            INSERT INTO  ERRORES (ERRO_ITEM, ERRO_TIPODOC, ERRO_IDDOC, ERRO_CODIGO, ERRO_CANT, ERRO_CADENA)
                    VALUES(GEN_ID(id_errores, 1), 51, :IDDOC, 'CUENTA NO EXISTE', 0, :CUENTAADIC);
            CUENTA = CUENTAADIC;
            ERROR = ERROR + 1;
            end
        /* DEPENDE DEL TIPO DE CUENTA */
        if (TIPOCUEN = 'I') then
            BEGIN
            INSERT INTO  ERRORES (ERRO_ITEM, ERRO_TIPODOC, ERRO_IDDOC, ERRO_CODIGO, ERRO_CANT, ERRO_CADENA)
                VALUES(GEN_ID(id_errores, 1), 51, :IDDOC, 'CUENTA DE INVENTARIO', 0, :CUENTA);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            if (DBADIC = 'S') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTAADIC, :CONC, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 31);
                SUMA = SUMA + MONTO;
                END
            ELSE
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTAADIC, :CONC, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 31);
                SUMA = SUMA - MONTO;
                END
            NROI = NROI + 1;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            if (DBADIC = 'S') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTAADIC, :CONC, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                SUMA = SUMA + MONTO;
                END
            ELSE
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTAADIC, :CONC, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                SUMA = SUMA - MONTO;
                END
            NROI = NROI + 1;
            END
        
        NROI = NROI + 1;
        END
        
    /* CIERRE EL COMPROBANTE CONTRA LA CUENTA DEL TERCERO O LA CONSTANTE */
    if ((SUMA <> 0) and ((CLIE = 'T') or (CLIE = 'K'))) then
        BEGIN
        if (SUMA < 0) then
            BEGIN
            DEBITO = SUMA * -1;
            CREDITO = 0;
            END
        ELSE
            BEGIN
            DEBITO = 0;
            CREDITO = SUMA;
            END
        if (CLIE = 'T') then
            CTACLIE = TCTACLIEN;

        CUENTA = NULL;
        SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
            WHERE CUEN_COD = :CTACLIE INTO :CUENTA, :TIPOCUEN;
        IF (CUENTA IS NULL) then
            begin
            INSERT INTO  ERRORES (ERRO_ITEM, ERRO_TIPODOC, ERRO_IDDOC, ERRO_CODIGO, ERRO_CANT, ERRO_CADENA)
                VALUES(GEN_ID(id_errores, 1), 51, :IDDOC, 'CUENTA NO EXISTE', 0, :CTACLIE);
            CUENTA = CTACLIE;
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            INSERT INTO  ERRORES (ERRO_ITEM, ERRO_TIPODOC, ERRO_IDDOC, ERRO_CODIGO, ERRO_CANT, ERRO_CADENA)
                VALUES(GEN_ID(id_errores, 1), 51, :IDDOC, 'CUENTA DE INVENTARIO', 0, :CUENTA);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :DEBITO, :CREDITO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 41);
        if (TIPOCUEN = 'N') then
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :DEBITO, :CREDITO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
        NROI = NROI + 1;
        END /* SUMA EN CARTERA */
    if (ERROR > 0) then
        VER = 'S';
    SUSPEND;
    END /* ANULADO */
  END /* EXISTE LA INTERFAZ */
ELSE
    BEGIN
    INSERT INTO  ERRORES (ERRO_ITEM, ERRO_TIPODOC, ERRO_IDDOC, ERRO_CODIGO, ERRO_CANT, ERRO_CADENA)
        VALUES(GEN_ID(id_errores, 1), 51, :IDDOC, 'INTERFAZ NO EXISTE', 0, :pref);
    ERROR = ERROR + 1;
    VER = 'S';
    SUSPEND;
    END
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE NOTADBPR_SIN_CONTABILIDAD(
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    ID INTEGER,
    IDI INTEGER,
    IDC INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    ESTADO VARCHAR(20),
    ERROR INTEGER)
AS
DECLARE VARIABLE VER CHAR(2);
declare variable FECICNT VARCHAR(10);
declare variable FECFCNT VARCHAR(10);
declare variable idref INTEGER;
BEGIN /*$$IBE$$ 
EXECUTE PROCEDURE fecha_a_conta(FECINI) returning_values (FECICNT);
EXECUTE PROCEDURE fecha_a_conta(FECFIN) returning_values (FECFCNT);
FOR SELECT NDPR_ID, PREF_PRE, NDPR_NUMERO FROM NOTAS_DEBITO_PROVEEDOR WHERE NDPR_ANULADO = 'N' AND
    NDPR_FECHA >= :FECINI AND NDPR_FECHA <= :FECFIN
    ORDER BY NDPR_ID INTO :ID, :PREF, :NUMERO
DO
  BEGIN
  idref = null;
  SELECT ENCO_IDREF FROM COMPROBANTE_ENCABEZADO WHERE ENCO_TIPOREF = 51 AND ENCO_FECHA >= :FECICNT AND ENCO_FECHA <= :FECFCNT and ENCO_IDREF = :id into :idref;
  if (idref IS NULL) then
  begin
  ESTADO = 'PROCESANDO';
  SUSPEND;
  SELECT MAX(INCA_ID) FROM INTERFAZ_CARTERA WHERE PREF_PRE = :PREF AND TIDO_COD = 51 INTO :IDI;
  if (IDI IS NOT NULL) then
    BEGIN
    EXECUTE PROCEDURE CONTABIL_NOTADBPR (:ID, :IDI) RETURNING_VALUES (:ERROR, :VER, :IDC);
    if (ERROR = 0) then
      BEGIN
      EXECUTE PROCEDURE CONTABILIZA_PENDIENTE (:IDC);
      ESTADO = 'OK';
      END
    ELSE
      ESTADO = 'ERROR';
    suspend;
    END
  end
  END
 $$IBE$$*/ SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE NOTADBPR_SIN_CONTABILIDAD(
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    ID INTEGER,
    IDI INTEGER,
    IDC INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    ESTADO VARCHAR(20),
    ERROR INTEGER)
AS
DECLARE VARIABLE VER CHAR(2);
declare variable FECICNT VARCHAR(10);
declare variable FECFCNT VARCHAR(10);
declare variable idref INTEGER;
BEGIN
EXECUTE PROCEDURE fecha_a_conta(FECINI) returning_values (FECICNT);
EXECUTE PROCEDURE fecha_a_conta(FECFIN) returning_values (FECFCNT);
FOR SELECT NDPR_ID, PREF_PRE, NDPR_NUMERO FROM NOTAS_DEBITO_PROVEEDOR WHERE NDPR_ANULADO = 'N' AND
    NDPR_FECHA >= :FECINI AND NDPR_FECHA <= :FECFIN
    ORDER BY NDPR_ID INTO :ID, :PREF, :NUMERO
DO
  BEGIN
  idref = null;
  SELECT ENCO_IDREF FROM COMPROBANTE_ENCABEZADO WHERE ENCO_TIPOREF = 51 AND ENCO_FECHA >= :FECICNT AND ENCO_FECHA <= :FECFCNT and ENCO_IDREF = :id into :idref;
  if (idref IS NULL) then
  begin
  ESTADO = 'PROCESANDO';
  SUSPEND;
  SELECT MAX(INCA_ID) FROM INTERFAZ_CARTERA WHERE PREF_PRE = :PREF AND TIDO_COD = 51 INTO :IDI;
  if (IDI IS NOT NULL) then
    BEGIN
    EXECUTE PROCEDURE CONTABIL_NOTADBPR (:ID, :IDI) RETURNING_VALUES (:ERROR, :VER, :IDC);
    if (ERROR = 0) then
      BEGIN
      EXECUTE PROCEDURE CONTABILIZA_PENDIENTE (:IDC);
      ESTADO = 'OK';
      END
    ELSE
      ESTADO = 'ERROR';
    suspend;
    END
  end
  END
END

^

SET TERM ; ^

/* 20080909: MEJORA EN RENDIMIENTO DE LA CONSULTA DE PRECIOS POR UNIDAD */
SET TERM ^ ;

CREATE OR ALTER PROCEDURE PRECIOS_UNIDAD(
    ARTICULO VARCHAR(20),
    UNIDAD VARCHAR(8))
RETURNS (
    LISTA INTEGER,
    PRECIO NUMERIC(18,2),
    RENTA NUMERIC(9,2),
    UTIL NUMERIC(9,2),
    AUTOM CHAR(1),
    COMIPORC NUMERIC(9,2),
    CANTMIN NUMERIC(18,4),
    SUBEMPRESA INTEGER)
AS
DECLARE VARIABLE FACTOR NUMERIC(18,4);
BEGIN
FOR SELECT P.LIPR_COD, PRAR_FIJO, PRAR_MARGEN, PRAR_UTIL, PRAR_AUTO, PRAR_COMI, PRAR_CANTMIN, sucu_id
    FROM PRECIOS_ARTICULO P, lista_precios L WHERE ARTI_COD = :ARTICULO AND P.lipr_cod = L.lipr_cod AND L.lipr_fecini <= cast('now' as DATE) AND L.lipr_fecfin >= cast('now' as DATE)
    INTO :LISTA, :PRECIO, :RENTA, :UTIL, :AUTOM, :COMIPORC, :CANTMIN, :SUBEMPRESA
    DO
    BEGIN
    EXECUTE PROCEDURE FACTOR_UNIDAD_PRE (:ARTICULO, :UNIDAD) returning_values (:FACTOR);
    PRECIO = PRECIO * FACTOR;
    SUSPEND;
    END
END
^

SET TERM ; ^


/* 20080910:  se perdian los decimales del porcentaje de comision al dividr entre 100, se cambio el orden de la operación */

SET TERM ^ ;

CREATE OR ALTER PROCEDURE COMISIONES_COBRO(
    DESDE INTEGER,
    HASTA INTEGER,
    FECINI DATE,
    FECFIN DATE,
    DETALLE CHAR(1))
RETURNS (
    CODVEND INTEGER,
    NOMVEND VARCHAR(60),
    NIT VARCHAR(20),
    CLIENTE VARCHAR(60),
    NOMTIPO VARCHAR(8),
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(6),
    FECDOC DATE,
    PREFREC VARCHAR(4),
    NUMREC VARCHAR(6),
    FECREC DATE,
    DIAS INTEGER,
    ABONO NUMERIC(18,2),
    BASE NUMERIC(18,2),
    COMIMONTO NUMERIC(18,2),
    COMIPORC NUMERIC(9,2),
    ARTICULO VARCHAR(20),
    CODGRP VARCHAR(2),
    CANT NUMERIC(18,4),
    DTOFIN NUMERIC(18,2),
    VENCE DATE,
    RTFTE NUMERIC(18,2),
    RTIVA NUMERIC(18,2),
    RTICA NUMERIC(18,2))
AS
DECLARE VARIABLE TIPO INTEGER;
DECLARE VARIABLE ID INTEGER;
DECLARE VARIABLE IVAMONTO NUMERIC(18,2);
DECLARE VARIABLE TOTAL NUMERIC(18,2);
DECLARE VARIABLE SITOT CHAR(2);
DECLARE VARIABLE VENTA CHAR(2);
DECLARE VARIABLE COMIV NUMERIC(18,2);
DECLARE VARIABLE PORCV NUMERIC(18,2);
DECLARE VARIABLE CONSUMO NUMERIC(18,2);
declare variable ALFINAL CHAR(2);
declare variable SALDO NUMERIC(18,2);
declare variable COMISION VARCHAR(10);
declare variable porcaux NUMERIC(9,2);
declare variable BASEAUX DOUBLE PRECISION;
declare variable SUCURSAL VARCHAR(20);
BEGIN
EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION', 'VENDEDORES', 'COMISIONES EN VENTA INCLUYENDO IMPUESTOS') returning_values (:SITOT);
EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA','COMISIONES','COMISION POR COBRO PAGADERA SOLO EN EL COBRO TOTAL') returning_values (:ALFINAL);
execute procedure lee_configuracion('CARTERA','COMISIONES','COMISION POR COBRO COMO PORCENTAJE DE LA COMISION VENTA') returning_values (:venta);
EXECUTE PROCEDURE lee_configuracion('CARTERA', 'COMISIONES', 'LIQUIDAR COMISION COBRO CON COBRADOR DEL DOCUMENTO O DEL RECIBO') returning_values (:COMISION);
FOR SELECT RCDE_TIPODOC, RCDE_IDDOC, RCDE_PREFIJO, RCDE_NUMERO, R.TERC_NIT, TERC_NOM, RECA_FECHA, (RCDE_ABONO+RCDE_RTFTE+RCDE_RTIVA+RCDE_RTICA), PREF_PRE, RECA_NUMERO, COBR_COD, RCDE_DTOF, RCDE_RTFTE, RCDE_RTIVA, RCDE_RTICA
    FROM RECIBOS_CAJA R, RECIBOS_CAJA_DETALLE RD, TERCEROS T
    WHERE R.RECA_ID = RD.RECA_ID AND RECA_FECHA >= :FECINI AND RECA_FECHA <= :FECFIN AND R.TERC_NIT = T.TERC_NIT AND RECA_ANULADO = 'N'
    ORDER BY TERC_NIT, RECA_FECHA
    INTO :TIPO, :ID, :PREFIJO, :NUMERO, :NIT, :CLIENTE, :FECREC, :ABONO, :PREFREC, :NUMREC, :codvend, :DTOFIN, :rtfte, :RTIVA, :RTICA
    DO
    BEGIN
    SELECT TIDO_NOMCORTO FROM TIPO_DOCUMENTO WHERE TIDO_COD = :TIPO INTO :NOMTIPO;
    if (COMISION = 'DOCUMENTO') then
        SELECT MVCL_FECHA, COBR_COD, MVCL_VENCE FROM MOVIMIENTO_CLIENTES WHERE MVCL_TIPOREF = :TIPO AND MVCL_IDREF = :ID
            INTO :FECDOC, :codvend, :VENCE;
    else
        SELECT MVCL_FECHA, MVCL_VENCE FROM MOVIMIENTO_CLIENTES WHERE MVCL_TIPOREF = :TIPO AND MVCL_IDREF = :ID
            INTO :FECDOC, :VENCE;
    if (FECDOC IS NOT NULL) then
        DIAS = FECREC - FECDOC;
    ELSE
        DIAS = 999;
    if ((codvend >= :DESDE) AND (codvend <= :hasta)) then
        BEGIN
        /* TRAIGA EL PORCENTAJE DE ACUERDO A LOS DIAS */
        COMIPORC = 0;
        SELECT CMCB_PORC FROM COMISION_COBRO WHERE CMCB_DIASINI <= :dias AND CMCB_DIASFIN >= :DIAS AND COBR_COD = :CODVEND INTO :COMIPORC;
        if (COMIPORC IS NULL) THEN
            COMIPORC = 0;
        if (VENTA = 'NO') then
            BEGIN
            if (TIPO = 31) then
                BEGIN
                if (DETALLE = 'N') then
                    SELECT MAX(FACT_TOTAL), MAX(FACT_IVAMONTO), SUM(FADE_CONSUMO) FROM FACTURAS F, FACTURAS_DETALLE D
                        WHERE F.FACT_ID = D.FACT_ID AND F.FACT_ID = :ID INTO :TOTAL, :IVAMONTO, :CONSUMO;
                ELSE
                    FOR SELECT D.ARTI_COD, FADE_CANT, FADE_TOTAL, FADE_IVAMONTO, FADE_CONSUMO, GRUP_COD
                        FROM FACTURAS F, FACTURAS_DETALLE D, ARTICULO A
                        WHERE F.FACT_ID = D.FACT_ID AND D.arti_cod = A.arti_cod AND F.FACT_ID = :ID
                        INTO :ARTICULO, :CANT, :TOTAL, :IVAMONTO, :CONSUMO, :CODGRP
                        DO
                        BEGIN
                        if (SITOT = 'SI') then
                            BASEAUX = TOTAL;
                        ELSE
                            BASEAUX = (TOTAL - IVAMONTO - CONSUMO);
                        BASE = BASEAUX;
                        COMIMONTO = BASE / 100 * COMIPORC;
                        SUSPEND;
                        END
                END
            if (TIPO = 33) then
                if (DETALLE = 'N') then
                    SELECT MAX(DEVT_TOTAL*-1), MAX(DEVT_IVAMONTO*-1), SUM(DVDE_CONSUMO) FROM DEVOLUCIONES_VENTAS V, DEVOLUCIONES_VENTAS_DETALLE D
                        WHERE V.DEVT_ID = D.DEVT_ID AND V.DEVT_ID = :ID INTO :TOTAL, :IVAMONTO, :CONSUMO;
                ELSE
                    FOR SELECT D.ARTI_COD, DVDE_CANT, DVDE_TOTAL*-1, DVDE_IVAMONTO*-1, DVDE_CONSUMO*-1, GRUP_COD
                        FROM DEVOLUCIONES_VENTAS V, DEVOLUCIONES_VENTAS_DETALLE D, ARTICULO A
                        WHERE V.DEVT_ID = D.DEVT_ID AND D.arti_cod = A.arti_cod AND V.DEVT_ID = :ID
                        INTO :ARTICULO, :CANT, :TOTAL, :IVAMONTO, :CONSUMO, :codgrp
                        DO
                        BEGIN
                        if (SITOT = 'SI') then
                            BASEAUX = TOTAL;
                        ELSE
                            BASEAUX = TOTAL - IVAMONTO - CONSUMO;
                        BASE = BASEAUX;
                        COMIMONTO = BASE / 100 * COMIPORC;
                        SUSPEND;
                        END
            if (TIPO = 41) then
                SELECT NDCL_MONTO, NDCL_IVAMONTO, 0 FROM NOTAS_DEBITO_CLIENTES WHERE NDCL_ID = :ID INTO :TOTAL, :IVAMONTO, :CONSUMO;
            if (TIPO = 42) then
                SELECT NCCL_MONTO*-1, NCCL_IVAMONTO*-1, 0 FROM NOTAS_CREDITO_CLIENTES WHERE NCCL_ID = :ID INTO :TOTAL, :IVAMONTO, :CONSUMO;
            if (TIPO = 77) then
                SELECT DVCH_MONTO, 0, 0 FROM DEVOLUCION_CHEQUES WHERE DVCH_ID = :ID INTO :TOTAL, :IVAMONTO, :CONSUMO;
            if (SITOT = 'SI') then
                BASEAUX = ABONO;
            ELSE
                if ((TOTAL - IVAMONTO - CONSUMO) <> 0) then
                    BASEAUX = (ABONO / TOTAL) * (TOTAL - IVAMONTO - CONSUMO);
                ELSE
                    BASEAUX = 0;
            BASE = BASEAUX;
            COMIMONTO = BASE / 100 * COMIPORC;
            END
        ELSE
            BEGIN
            if (TIPO = 31) then
                if (DETALLE = 'N') then
                    SELECT MAX(FACT_TOTAL), MAX(FACT_IVAMONTO), MAX(FACT_COMIPORC), SUM(FADE_CONSUMO)
                        FROM FACTURAS F, FACTURAS_DETALLE D WHERE F.FACT_ID = D.FACT_ID AND F.FACT_ID = :ID
                        INTO :TOTAL, :IVAMONTO, :PORCV, :CONSUMO;
                ELSE
                    FOR SELECT D.ARTI_COD, FADE_CANT, FADE_TOTAL, FADE_IVAMONTO, FADE_CONSUMO, FACT_COMIPORC, GRUP_COD
                        FROM FACTURAS F, FACTURAS_DETALLE D, ARTICULO A
                        WHERE F.FACT_ID = D.FACT_ID AND D.arti_cod = A.arti_cod AND F.FACT_ID = :ID
                        INTO :ARTICULO, :CANT, :TOTAL, :IVAMONTO, :CONSUMO, :porcv, :codgrp
                        DO
                        BEGIN
                        if (SITOT = 'SI') then
                            BASEAUX = TOTAL;
                        ELSE
                            BASEAUX = (TOTAL - IVAMONTO - CONSUMO);
                        COMIV = PORCV * BASEAUX / 100;
                        COMIMONTO = COMIV / 100 * COMIPORC;
                        porcaux = comiporc;
                        comiporc = PORCV * COMIPORC / 100;
                        BASE = BASEAUX;
                        SUSPEND;
                        END
            if (TIPO = 33) then
                if (DETALLE = 'N') then
                    SELECT MAX(DEVT_TOTAL), MAX(DEVT_IVAMONTO), MAX(DEVT_COMIPORC), SUM(DVDE_CONSUMO)
                        FROM DEVOLUCIONES_VENTAS V, DEVOLUCIONES_VENTAS_DETALLE D WHERE V.DEVT_ID = D.DEVT_ID AND D.DEVT_ID = :ID
                        INTO :TOTAL, :IVAMONTO, :PORCV, :CONSUMO;
                ELSE
                    FOR SELECT D.ARTI_COD, DVDE_CANT, DVDE_TOTAL*-1, DVDE_IVAMONTO*-1, DVDE_CONSUMO*-1, DEVT_COMIPORC, GRUP_COD
                        FROM DEVOLUCIONES_VENTAS V, DEVOLUCIONES_VENTAS_DETALLE D, ARTICULO A
                        WHERE V.DEVT_ID = D.DEVT_ID AND D.arti_cod = A.arti_cod AND V.DEVT_ID = :ID
                        INTO :ARTICULO, :CANT, :TOTAL, :IVAMONTO, :CONSUMO, :porcv, :codgrp
                        DO
                        BEGIN
                        if (SITOT = 'SI') then
                            BASEAUX = TOTAL;
                        ELSE
                            BASEAUX = (TOTAL - IVAMONTO - CONSUMO);
                        COMIV = PORCV * BASEAUX / 100;
                        COMIMONTO = COMIV / 100 * COMIPORC;
                        porcaux = comiporc;
                        comiporc = PORCV * COMIPORC / 100;
                        BASE = BASEAUX;
                        SUSPEND;
                        END
            if (TIPO = 41) then
                SELECT NDCL_MONTO, NDCL_IVAMONTO, NDCL_COMIPORC, 0 FROM NOTAS_DEBITO_CLIENTES
                    WHERE NDCL_ID = :ID INTO :TOTAL, :IVAMONTO, :PORCV, :CONSUMO;
            if (TIPO = 42) then
                SELECT NCCL_MONTO, NCCL_IVAMONTO, NCCL_COMIPORC, 0  FROM NOTAS_CREDITO_CLIENTES
                    WHERE NCCL_ID = :ID INTO :TOTAL, :IVAMONTO, :PORCV, :CONSUMO;
            if (TIPO = 77) then
                SELECT DVCH_MONTO, 0, 0, 0 FROM DEVOLUCION_CHEQUES WHERE DVCH_ID = :ID INTO :TOTAL, :IVAMONTO, :PORCV, :CONSUMO;
            if (SITOT = 'SI') then
                BASEAUX = ABONO;
            ELSE
                if ((total <> 0) AND (ABONO <> 0)) then
                    BASEAUX = (TOTAL - IVAMONTO - CONSUMO) / TOTAL * ABONO;
                ELSE
                    BASEAUX = 0;
            COMIV = PORCV * BASEAUX / 100;
            COMIMONTO = COMIV / 100 * COMIPORC;
            porcaux = comiporc;
            comiporc = PORCV * COMIPORC / 100;
            BASE = BASEAUX;
            END
        select COBR_NOM from COBRADORES where COBR_COD = :codvend INTO :nomvend;
        if (DETALLE = 'N') then
            if (ALFINAL = 'SI') then
                BEGIN
                /* VERIFIQUE EL SALDO DEL DOCUMENTO, SI ES CERO LIQUIDE COMISION SOBRE EL TOTAL */
                EXECUTE PROCEDURE saldo_doc_cartera(:tipo, :ID, :FECREC) returning_values (:SALDO);
                if (SALDO = 0) then
                    BEGIN
                    if (VENTA = 'NO') then
                        begin
                        if (SITOT = 'SI') then
                            BASEAUX = TOTAL;
                        ELSE
                            BASEAUX = TOTAL - IVAMONTO - CONSUMO;
                        COMIMONTO = BASEAUX * COMIPORC / 100;
                        end
                    ELSE
                        BEGIN
                        if (SITOT = 'SI') then
                            BASEAUX = TOTAL;
                        ELSE
                            BASEAUX = TOTAL - IVAMONTO - CONSUMO;
                        COMIV = PORCV * BASEAUX / 100;
                        COMIMONTO = COMIV / 100 * porcaux;
                        comiporc = PORCV * porcaux / 100;
                        END
                    BASE = BASEAUX;
                    SUSPEND;
                    END
                END
            ELSE
                SUSPEND;
        ELSE
            if ((TIPO <> 31) AND (TIPO <> 33)) then
                SUSPEND;
        END
    END
FOR SELECT EGCC_TIPODOC, EGCC_IDDOC, EGCC_PREFIJO, EGCC_NUMERO, E.TERC_NIT, TERC_NOM, EGRE_FECHA, (EGCC_ABONO+EGCC_RTFTE+EGCC_RTIVA+EGCC_RTICA), PREF_PRE, EGRE_NUMERO, EGCC_SUCURSAL
    FROM EGRESOS E, EGRESOS_CRUCEC C, TERCEROS T
    WHERE E.EGRE_ID = C.EGRE_ID AND EGRE_FECHA >= :FECINI AND EGRE_FECHA <= :FECFIN AND E.TERC_NIT = T.TERC_NIT AND EGRE_ANULADO = 'N'
    ORDER BY TERC_NIT, EGRE_FECHA
    INTO :TIPO, :ID, :PREFIJO, :NUMERO, :NIT, :CLIENTE, :FECREC, :ABONO, :PREFREC, :NUMREC, :SUCURSAL
    DO
    BEGIN
    SELECT COBR_COD FROM cliente_sucursales WHERE TERC_NIT = :NIT AND CLCU_COD = :sucursal INTO :codvend;
    SELECT TIDO_NOMCORTO FROM TIPO_DOCUMENTO WHERE TIDO_COD = :TIPO INTO :NOMTIPO;
    if (COMISION = 'DOCUMENTO') then
        SELECT MVCL_FECHA, COBR_COD, MVCL_VENCE FROM MOVIMIENTO_CLIENTES WHERE MVCL_TIPOREF = :TIPO AND MVCL_IDREF = :ID
            INTO :FECDOC, :codvend, :VENCE;
    else
        SELECT MVCL_FECHA, MVCL_VENCE FROM MOVIMIENTO_CLIENTES WHERE MVCL_TIPOREF = :TIPO AND MVCL_IDREF = :ID
            INTO :FECDOC, :VENCE;
    if (FECDOC IS NOT NULL) then
        DIAS = FECREC - FECDOC;
    ELSE
        DIAS = 999;
    if ((codvend >= :DESDE) AND (codvend <= :hasta)) then
        BEGIN
        /* TRAIGA EL PORCENTAJE DE ACUERDO A LOS DIAS */
        COMIPORC = 0;
        SELECT CMCB_PORC FROM COMISION_COBRO WHERE CMCB_DIASINI <= :dias AND CMCB_DIASFIN >= :DIAS AND COBR_COD = :CODVEND INTO :COMIPORC;
        if (COMIPORC IS NULL) THEN
            COMIPORC = 0;
        if (VENTA = 'NO') then
            BEGIN
            if (TIPO = 31) then
                BEGIN
                if (DETALLE = 'N') then
                    SELECT MAX(FACT_TOTAL), MAX(FACT_IVAMONTO), SUM(FADE_CONSUMO) FROM FACTURAS F, FACTURAS_DETALLE D
                        WHERE F.FACT_ID = D.FACT_ID AND F.FACT_ID = :ID INTO :TOTAL, :IVAMONTO, :CONSUMO;
                ELSE
                    FOR SELECT D.ARTI_COD, FADE_CANT, FADE_TOTAL, FADE_IVAMONTO, FADE_CONSUMO, GRUP_COD
                        FROM FACTURAS F, FACTURAS_DETALLE D, ARTICULO A
                        WHERE F.FACT_ID = D.FACT_ID AND D.arti_cod = A.arti_cod AND F.FACT_ID = :ID
                        INTO :ARTICULO, :CANT, :TOTAL, :IVAMONTO, :CONSUMO, :CODGRP
                        DO
                        BEGIN
                        if (SITOT = 'SI') then
                            BASEAUX = TOTAL;
                        ELSE
                            BASEAUX = (TOTAL - IVAMONTO - CONSUMO);
                        BASE = BASEAUX;
                        COMIMONTO = BASE / 100 * COMIPORC;
                        SUSPEND;
                        END
                END
            if (TIPO = 33) then
                if (DETALLE = 'N') then
                    SELECT MAX(DEVT_TOTAL*-1), MAX(DEVT_IVAMONTO*-1), SUM(DVDE_CONSUMO) FROM DEVOLUCIONES_VENTAS V, DEVOLUCIONES_VENTAS_DETALLE D
                        WHERE V.DEVT_ID = D.DEVT_ID AND V.DEVT_ID = :ID INTO :TOTAL, :IVAMONTO, :CONSUMO;
                ELSE
                    FOR SELECT D.ARTI_COD, DVDE_CANT, DVDE_TOTAL*-1, DVDE_IVAMONTO*-1, DVDE_CONSUMO*-1, GRUP_COD
                        FROM DEVOLUCIONES_VENTAS V, DEVOLUCIONES_VENTAS_DETALLE D, ARTICULO A
                        WHERE V.DEVT_ID = D.DEVT_ID AND D.arti_cod = A.arti_cod AND V.DEVT_ID = :ID
                        INTO :ARTICULO, :CANT, :TOTAL, :IVAMONTO, :CONSUMO, :codgrp
                        DO
                        BEGIN
                        if (SITOT = 'SI') then
                            BASEAUX = TOTAL;
                        ELSE
                            BASEAUX = TOTAL - IVAMONTO - CONSUMO;
                        BASE = BASEAUX;
                        COMIMONTO = BASE / 100 * COMIPORC;
                        SUSPEND;
                        END
            if (TIPO = 41) then
                SELECT NDCL_MONTO, NDCL_IVAMONTO, 0 FROM NOTAS_DEBITO_CLIENTES WHERE NDCL_ID = :ID INTO :TOTAL, :IVAMONTO, :CONSUMO;
            if (TIPO = 42) then
                SELECT NCCL_MONTO*-1, NCCL_IVAMONTO*-1, 0 FROM NOTAS_CREDITO_CLIENTES WHERE NCCL_ID = :ID INTO :TOTAL, :IVAMONTO, :CONSUMO;
            if (TIPO = 77) then
                SELECT DVCH_MONTO, 0, 0 FROM DEVOLUCION_CHEQUES WHERE DVCH_ID = :ID INTO :TOTAL, :IVAMONTO, :CONSUMO;
            if (SITOT = 'SI') then
                BASEAUX = ABONO;
            ELSE
                if ((TOTAL - IVAMONTO - CONSUMO) <> 0) then
                    BASEAUX = (ABONO / TOTAL) * (TOTAL - IVAMONTO - CONSUMO);
                ELSE
                    BASEAUX = 0;
            BASE = BASEAUX;
            COMIMONTO = BASE / 100 * COMIPORC;
            END
        ELSE
            BEGIN
            if (TIPO = 31) then
                if (DETALLE = 'N') then
                    SELECT MAX(FACT_TOTAL), MAX(FACT_IVAMONTO), MAX(FACT_COMIPORC), SUM(FADE_CONSUMO)
                        FROM FACTURAS F, FACTURAS_DETALLE D WHERE F.FACT_ID = D.FACT_ID AND F.FACT_ID = :ID
                        INTO :TOTAL, :IVAMONTO, :PORCV, :CONSUMO;
                ELSE
                    FOR SELECT D.ARTI_COD, FADE_CANT, FADE_TOTAL, FADE_IVAMONTO, FADE_CONSUMO, FACT_COMIPORC, GRUP_COD
                        FROM FACTURAS F, FACTURAS_DETALLE D, ARTICULO A
                        WHERE F.FACT_ID = D.FACT_ID AND D.arti_cod = A.arti_cod AND F.FACT_ID = :ID
                        INTO :ARTICULO, :CANT, :TOTAL, :IVAMONTO, :CONSUMO, :porcv, :codgrp
                        DO
                        BEGIN
                        if (SITOT = 'SI') then
                            BASEAUX = TOTAL;
                        ELSE
                            BASEAUX = (TOTAL - IVAMONTO - CONSUMO);
                        COMIV = PORCV * BASEAUX / 100;
                        COMIMONTO = COMIV / 100 * COMIPORC;
                        porcaux = comiporc;
                        comiporc = PORCV * COMIPORC / 100;
                        BASE = BASEAUX;
                        SUSPEND;
                        END
            if (TIPO = 33) then
                if (DETALLE = 'N') then
                    SELECT MAX(DEVT_TOTAL), MAX(DEVT_IVAMONTO), MAX(DEVT_COMIPORC), SUM(DVDE_CONSUMO)
                        FROM DEVOLUCIONES_VENTAS V, DEVOLUCIONES_VENTAS_DETALLE D WHERE V.DEVT_ID = D.DEVT_ID AND D.DEVT_ID = :ID
                        INTO :TOTAL, :IVAMONTO, :PORCV, :CONSUMO;
                ELSE
                    FOR SELECT D.ARTI_COD, DVDE_CANT, DVDE_TOTAL*-1, DVDE_IVAMONTO*-1, DVDE_CONSUMO*-1, DEVT_COMIPORC, GRUP_COD
                        FROM DEVOLUCIONES_VENTAS V, DEVOLUCIONES_VENTAS_DETALLE D, ARTICULO A
                        WHERE V.DEVT_ID = D.DEVT_ID AND D.arti_cod = A.arti_cod AND V.DEVT_ID = :ID
                        INTO :ARTICULO, :CANT, :TOTAL, :IVAMONTO, :CONSUMO, :porcv, :codgrp
                        DO
                        BEGIN
                        if (SITOT = 'SI') then
                            BASEAUX = TOTAL;
                        ELSE
                            BASEAUX = (TOTAL - IVAMONTO - CONSUMO);
                        COMIV = PORCV * BASEAUX / 100;
                        COMIMONTO = COMIV / 100 * COMIPORC;
                        porcaux = comiporc;
                        comiporc = PORCV * COMIPORC / 100;
                        BASE = BASEAUX;
                        SUSPEND;
                        END
            if (TIPO = 41) then
                SELECT NDCL_MONTO, NDCL_IVAMONTO, NDCL_COMIPORC, 0 FROM NOTAS_DEBITO_CLIENTES
                    WHERE NDCL_ID = :ID INTO :TOTAL, :IVAMONTO, :PORCV, :CONSUMO;
            if (TIPO = 42) then
                SELECT NCCL_MONTO, NCCL_IVAMONTO, NCCL_COMIPORC, 0  FROM NOTAS_CREDITO_CLIENTES
                    WHERE NCCL_ID = :ID INTO :TOTAL, :IVAMONTO, :PORCV, :CONSUMO;
            if (TIPO = 77) then
                SELECT DVCH_MONTO, 0, 0, 0 FROM DEVOLUCION_CHEQUES WHERE DVCH_ID = :ID INTO :TOTAL, :IVAMONTO, :PORCV, :CONSUMO;
            if (SITOT = 'SI') then
                BASEAUX = ABONO;
            ELSE
                if ((total <> 0) AND (ABONO <> 0)) then
                    BASEAUX = (TOTAL - IVAMONTO - CONSUMO) / TOTAL * ABONO;
                ELSE
                    BASEAUX = 0;
            COMIV = PORCV * BASEAUX / 100;
            COMIMONTO = COMIV / 100 * COMIPORC;
            porcaux = comiporc;
            comiporc = PORCV * COMIPORC / 100;
            BASE = BASEAUX;
            END
        select COBR_NOM from COBRADORES where COBR_COD = :codvend INTO :nomvend;
        if (DETALLE = 'N') then
            if (ALFINAL = 'SI') then
                BEGIN
                /* VERIFIQUE EL SALDO DEL DOCUMENTO, SI ES CERO LIQUIDE COMISION SOBRE EL TOTAL */
                EXECUTE PROCEDURE saldo_doc_cartera(:tipo, :ID, :FECREC) returning_values (:SALDO);
                if (SALDO = 0) then
                    BEGIN
                    if (VENTA = 'NO') then
                        begin
                        if (SITOT = 'SI') then
                            BASEAUX = TOTAL;
                        ELSE
                            BASEAUX = TOTAL - IVAMONTO - CONSUMO;
                        COMIMONTO = BASEAUX * COMIPORC / 100;
                        end
                    ELSE
                        BEGIN
                        if (SITOT = 'SI') then
                            BASEAUX = TOTAL;
                        ELSE
                            BASEAUX = TOTAL - IVAMONTO - CONSUMO;
                        COMIV = PORCV * BASEAUX / 100;
                        COMIMONTO = COMIV / 100 * porcaux;
                        comiporc = PORCV * porcaux / 100;
                        END
                    BASE = BASEAUX;
                    SUSPEND;
                    END
                END
            ELSE
                SUSPEND;
        ELSE
            if ((TIPO <> 31) AND (TIPO <> 33)) then
                SUSPEND;
        END
    END
FOR SELECT 'DEVOCHEQ', DVCH_MONTO*-1, DVCH_FECHA, PRBA_PREF, DVCH_NUMDOC, DVCH_FECHA, D.TERC_NIT, DVCH_NOMTERC, '', '', D.COBR_COD
    FROM DEVOLUCION_CHEQUES D, CLIENTES C
    WHERE DVCH_FECHA >= :FECINI AND DVCH_FECHA <= :FECFIN AND D.TERC_NIT = C.TERC_NIT AND D.COBR_COD = :CODVEND
    INTO :NOMTIPO, :BASE, :FECDOC, :PREFIJO, :NUMERO, :FECREC, :NIT, :CLIENTE, :PREFREC, :NUMREC, :codvend
    DO
    BEGIN
    COMIPORC = 0;
    COMIMONTO = 0;
    VENCE = fecdoc;
    RTFTE = 0;
    RTIVA = 0;
    RTICA = 0;
    DTOFIN = 0;
    if ((codvend >= :DESDE) AND (codvend <= :hasta)) then
        BEGIN
        select COBR_NOM from COBRADORES where COBR_COD = :codvend INTO :nomvend;
        /* SELECT CMCB_PORC FROM COMISION_COBRO WHERE CMCB_DIASINI <= 1 AND CMCB_DIASFIN >= 1 AND COBR_COD = :CODVEND INTO :COMIPORC;
        if (COMIPORC IS NULL) THEN
            COMIPORC = 0;
        COMIMONTO = BASE * COMIPORC / 100; */
        SUSPEND;
        END
    END
END
^

SET TERM ; ^


/* 20080910b: CONTABILIZAR EN CUENTA DE CRUCES CON CXP */

SET TERM ^ ;

CREATE OR ALTER PROCEDURE CONTABIL_RECICAJA(
    IDDOC INTEGER,
    IDINTER INTEGER)
RETURNS (
    ERROR INTEGER,
    VER CHAR(1),
    IDC INTEGER)
AS
declare variable PREF VARCHAR(4);
declare variable NUM VARCHAR(6);
declare variable FECAUX DATE;
declare variable FECHA CHAR(8);
declare variable CONC CHAR(120);
declare variable VRDTO NUMERIC(18, 2);
declare variable VRRTFTE NUMERIC(18, 2);
declare variable VRRTIVA NUMERIC(18, 2);
declare variable VRRTICA NUMERIC(18, 2);
declare variable VRTOTAL NUMERIC(18, 2);
declare variable TIPOCOMP VARCHAR(3);
declare variable PREFCONT VARCHAR(4);
declare variable BASE CHAR(1);
declare variable CTABASE VARCHAR(20);
declare variable CAJA CHAR(1);
declare variable CTACAJA VARCHAR(20);
declare variable RTFTE CHAR(1);
declare variable CTARTFTE VARCHAR(20);
declare variable RTIVA CHAR(1);
declare variable CTARTIVA VARCHAR(20);
declare variable RTICA CHAR(1);
declare variable CTARTICA VARCHAR(20);
declare variable DTO CHAR(1);
declare variable CTADTO VARCHAR(20);
declare variable EXISTE CHAR(1);
declare variable CUENTA VARCHAR(20);
declare variable MONTO NUMERIC(18,2);
declare variable ES_RETENCION CHAR(1);
declare variable TIPOCUEN CHAR(1);
declare variable NIT VARCHAR(20);
declare variable PROY VARCHAR(4);
declare variable CENTRO VARCHAR(4);
declare variable DEBITO NUMERIC(18,2);
declare variable CREDITO NUMERIC(18,2);
declare variable NROI INTEGER;
declare variable SUMA NUMERIC(18,2);
declare variable TCTACLIEN VARCHAR(20);
declare variable TCTARTFTE VARCHAR(20);
declare variable TCTARTIVA VARCHAR(20);
declare variable TCTARTICA VARCHAR(20);
declare variable TIPOIT INTEGER;
declare variable PREFIT VARCHAR(4);
declare variable NUMIT VARCHAR(6);
declare variable NUMEROIT VARCHAR(10);
declare variable ABONOIT NUMERIC(18,2);
declare variable CTADIC VARCHAR(20);
declare variable BASEADIC VARCHAR(20);
declare variable PORCADIC NUMERIC(5,2);
declare variable VALORADIC NUMERIC(18,2);
declare variable DBADIC CHAR(1);
declare variable ANULADO CHAR(1);
declare variable VRBASE NUMERIC(18,2);
declare variable PORC numeric(9,2);
declare variable OK INTEGER;
declare variable CRUCES NUMERIC(18,2);
declare variable VRCAJA NUMERIC(18,2);
BEGIN
ERROR = 0;
/* BUSQUE LA INTERFACE */
EXISTE = 'N';
SELECT 'S', TICO_COD, PRCO_PRE, INCJ_BASE, INCJ_DTOPP, INCJ_RTFTE, INCJ_RTIVA, INCJ_RTICA, INCJ_CAJA, INCJ_CTABASE, INCJ_CTADTO, INCJ_CTARTFTE, INCJ_CTARTIVA, INCJ_CTARTICA, INCJ_CTACAJA, INCJ_CONFIRMAR
    FROM INTERFAZ_CAJA
    WHERE INCJ_ID = :IDINTER
    INTO :EXISTE, :TIPOCOMP, :PREFCONT, :BASE, :DTO, :RTFTE, :RTIVA, :RTICA, :CAJA, :CTABASE, :CTADTO, :CTARTFTE, :CTARTIVA, :CTARTICA, :CTACAJA, :VER;
if (EXISTE = 'S') then
  BEGIN
  /* BORRE LA CONTABILIZACION ANTERIOR */
  OK = 0;
  FOR SELECT CNTB_ID FROM CONTABILIZACION WHERE CNTB_TIPOREF = 61 AND CNTB_IDREF = :IDDOC INTO :OK DO
    BEGIN
    DELETE FROM CONTABILIZACION_DET WHERE CNTB_ID = :OK;
    DELETE FROM CONTABILIZACION WHERE CNTB_ID = :OK;
    END
  /* TRAIGA EL ENCABEZADO DEL RECIBO */
  SELECT PREF_PRE, RECA_NUMERO, RECA_FECHA, R.TERC_NIT, RECA_CONC, RECA_DTOF, RECA_MONTO, RECA_RTFTEMONTO, RECA_RTIVAMONTO, RECA_RTICAMONTO, TERC_CTARTFTE, TERC_CTARTIVA, TERC_CTARTICA, TERC_CTACLIENTE, RECA_ANULADO
    FROM RECIBOS_CAJA R, TERCEROS T
    WHERE RECA_ID = :IDDOC AND R.TERC_NIT = T.TERC_NIT
    INTO :PREF, :NUM, :FECAUX, :NIT, :CONC, :VRDTO, :VRTOTAL, :VRRTFTE, :VRRTIVA, :VRRTICA, :TCTARTFTE, TCTARTIVA, TCTARTICA, TCTACLIEN, :ANULADO;
  if (ANULADO = 'N') then
    BEGIN
    SELECT PREF_CENTRO, PREF_PROY FROM PREFIJOS
        WHERE PREF_PRE = :PREF AND TIDO_COD = 61 INTO :CENTRO, :PROY;
    EXECUTE PROCEDURE FECHA_A_CONTA(:FECAUX) returning_values (:FECHA);
    /* REGISTRE EL ENCABEZADO CONTABLE */
    IDC = GEN_ID(ID_CONTABILIZA, 1);
    INSERT INTO CONTABILIZACION (CNTB_ID, CNTB_TIPOCOMP, CNTB_PREFCNT, CNTB_NUMERO, CNTB_FECHA, CNTB_CONCEPTO, CNTB_REF, CNTB_TIPOREF, CNTB_IDREF, CNTB_PREFREF, CNTB_NUMREF, CNTB_PROCESADO)
        VALUES (:IDC, :TIPOCOMP, :PREFCONT, :NUM, :FECHA, :CONC, '', 61, :IDDOC, :PREF, :NUM, 'N');
    NROI = 0;
    SUMA = 0;
    /* SUME LOS CRUCES PARA LLEVARLOS A LA CUENTA X PAGAR Y RESTAR DE LA CAJA */
    SELECT SUM(RCCR_ABONO) FROM RECIBOS_CAJA_CRUCEC WHERE RECA_ID = :iddoc INTO :CRUCES;
    if (CRUCES IS NULL) then
        CRUCES = 0;
    VRCAJA = VRTOTAL - CRUCES;
    IF ((CAJA = 'K')) THEN
        BEGIN
        if (VRCAJA <> 0) then
            BEGIN
            CUENTA = NULL;
            EXECUTE PROCEDURE VALIDE_CUENTA_C (CTACAJA) RETURNING_VALUES (:OK);
            IF (OK = 0) THEN
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :CTACAJA INTO :CUENTA, :TIPOCUEN;
            ELSE
                begin
                EXECUTE PROCEDURE ERROR (61, :IDDOC, :CTACAJA, 2);
                CUENTA = CTACAJA;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERROR (61, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                EXECUTE PROCEDURE ERROR (61, :IDDOC, :CUENTA, 4);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                IF (VRCAJA > 0) THEN
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRCAJA, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    SUMA = SUMA + VRCAJA;
                    END
                ELSE   
                    BEGIN                     
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                       VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, ABS(:VRCAJA), 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    SUMA = SUMA + VRCAJA;
                    END
                NROI = NROI + 1;
                END
            END /* VRCAJA <> 0 */
        END /* CAJA CONSTANTE */
    IF ((CAJA = 'F')) THEN
        BEGIN
        /* AGRUPE LAS CUENTAS DE LAS FORMAS DE PAGO */
        FOR SELECT MAX(FOPA_CTACONTA), SUM(RCPA_MONTO)
            FROM formas_pago F, recibos_caja_pago R
            WHERE R.RECA_ID = :IDDOC AND R.FOPA_ID = F.FOPA_ID
            GROUP BY FOPA_CTACONTA
            INTO :CTACAJA, :MONTO
        DO
            BEGIN
            if (MONTO <> 0) then
                BEGIN
                CUENTA = NULL;
                EXECUTE PROCEDURE VALIDE_CUENTA_C (CTACAJA) RETURNING_VALUES (:OK);
                IF (OK = 0) THEN
                    SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                        WHERE CUEN_COD = :CTACAJA INTO :CUENTA, :TIPOCUEN;
                ELSE
                    begin
                    EXECUTE PROCEDURE ERROR (61, :IDDOC, :CTACAJA, 2);
                    CUENTA = CTACAJA;
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (61, :IDDOC, :CUENTA, 3);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (61, :IDDOC, :CUENTA, 4);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    IF (MONTO > 0) THEN
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        SUMA = SUMA + MONTO;
                        END
                    ELSE
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, abs(:MONTO), 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        SUMA = SUMA + MONTO;
                        END
                    NROI = NROI + 1;
                    END
                END /* MONTO <> 0 */
            END /* DO FORMA_PAGO */
        END /* CAJA = F */
    if (DTO = 'K') then /* DTO EN CTA CONSTANTE */
        BEGIN
        if (VRDTO <> 0) then
            BEGIN
            CUENTA = NULL;
            EXECUTE PROCEDURE VALIDE_CUENTA_C (CTADTO) RETURNING_VALUES (:OK);
            IF (OK = 0) THEN
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :CTADTO INTO :CUENTA, :TIPOCUEN;
            ELSE
                begin
                EXECUTE PROCEDURE ERROR (61, :IDDOC, :CTADTO, 2);
                CUENTA = CTADTO;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERROR (61, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                EXECUTE PROCEDURE ERROR (61, :IDDOC, :CUENTA, 4);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRDTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA + VRDTO;
                END
            END /* VRDTO <> 0 */
        END /* DTO EN CTA CONSTANTE */
    /* RETENCION FUENTE */
    if ((RTFTE = 'T') or (RTFTE = 'K')) then
      if (VRRTFTE <> 0) then
        BEGIN
        if (RTFTE = 'T') then
            CTARTFTE = TCTARTFTE;
        CUENTA = NULL;
        EXECUTE PROCEDURE VALIDE_CUENTA_C (CTARTFTE) RETURNING_VALUES (:OK);
        IF (OK = 0) THEN
            SELECT CUEN_COD, CUEN_RETENCION, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTARTFTE INTO :CUENTA, :ES_RETENCION, :TIPOCUEN;
        ELSE
            begin
            EXECUTE PROCEDURE ERROR (61, :IDDOC, :CTARTFTE, 2);
            CUENTA = CTARTFTE;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERROR (61, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERROR (61, :IDDOC, :CUENTA, 4);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            if (ES_RETENCION = 'S') then
                BEGIN
                VRBASE = VRTOTAL + VRDTO + vrrtfte + vrrtiva + vrrtica;
                SELECT CLIE_rtefte from clientes where terc_nit = :NIT INTO :PORC;
                END
            ELSE
                BEGIN
                VRBASE = 0;
                PORC = 0;
                END
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :VRBASE, :PORC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTFTE;
            END
        END /* RTFTE */
    /* RETENCION IVA */
    if ((RTIVA = 'T') or (RTIVA = 'K')) then
      if (VRRTIVA <> 0) then
        BEGIN
        if (RTIVA = 'T') then
            CTARTIVA = TCTARTIVA;
        CUENTA = NULL;
        EXECUTE PROCEDURE VALIDE_CUENTA_C (CTARTIVA) RETURNING_VALUES (:OK);
        IF (OK = 0) THEN
            SELECT CUEN_COD, CUEN_RETENCION, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTARTIVA INTO :CUENTA, :ES_RETENCION, :TIPOCUEN;
        ELSE
            begin
            EXECUTE PROCEDURE ERROR (61, :IDDOC, :CTARTIVA, 2);
            CUENTA = CTARTIVA;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERROR (61, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERROR (61, :IDDOC, :CUENTA, 4);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            if (ES_RETENCION = 'S') then
                BEGIN
                VRBASE = VRTOTAL + VRDTO + vrrtfte + vrrtiva + vrrtica;
                SELECT CLIE_RTEIVA from clientes where terc_nit = :NIT INTO :PORC;
                END
            ELSE
                BEGIN
                VRBASE = 0;
                PORC = 0;
                END
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTIVA, 0, :VRBASE, :PORC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTIVA;
            END
        END /* RTIVA */
    /* RETENCION DE ICA */
    if ((RTICA = 'T') or (RTICA = 'K')) then
      if (VRRTICA <> 0) then
        BEGIN
        if (RTICA = 'T') then
            CTARTICA = TCTARTICA;
        CUENTA = NULL;
        EXECUTE PROCEDURE VALIDE_CUENTA_C (CTARTICA) RETURNING_VALUES (:OK);
        IF (OK = 0) THEN
            SELECT CUEN_COD, CUEN_RETENCION, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTARTICA INTO :CUENTA, :ES_RETENCION, :TIPOCUEN;
        ELSE
            begin
            EXECUTE PROCEDURE ERROR (61, :IDDOC, :CTARTICA, 2);
            CUENTA = CTARTICA;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERROR (61, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERROR (61, :IDDOC, :CUENTA, 4);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            if (ES_RETENCION = 'S') then
                BEGIN
                VRBASE = VRTOTAL + VRDTO + vrrtfte + vrrtiva + vrrtica;
                SELECT CLIE_RTEICA from clientes where terc_nit = :NIT INTO :PORC;
                END
            ELSE
                BEGIN
                VRBASE = 0;
                PORC = 0;
                END
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTICA, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTICA;
            END
        END /* RTICA */
    /* CRUCES CON CXP */
    if (CRUCES <> 0) then
        BEGIN
        SELECT PROV_CARTERA FROM PROVEEDORES WHERE TERC_NIT = :nit INTO :ctabase;
        if (CTABASE IS NULL) then
            ctabase = tctaclien;
        CUENTA = NULL;
        EXECUTE PROCEDURE VALIDE_CUENTA_C (CTABASE) RETURNING_VALUES (:OK);
        IF (OK = 0) THEN
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTABASE INTO :CUENTA, :TIPOCUEN;
        ELSE
            begin
            EXECUTE PROCEDURE ERROR (61, :IDDOC, :CTABASE, 2);
            CUENTA = CTABASE;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERROR (61, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            /* DEBERIA RECORRER DOCUMENTO POR DOCUMENTO */
            FOR SELECT RCCR_TIPODOC, RCCR_PREFIJO, RCCR_NUMERO, RCCR_ABONO+RCCR_RTFTE+RCCR_RTIVA+RCCR_RTICA+RCCR_DTOF
                FROM recibos_caja_crucec WHERE RECA_ID = :IDDOC
                INTO :TIPOIT, PREFIT, NUMIT, ABONOIT
                DO
                BEGIN
                NUMEROIT = PREFIT || NUMIT;
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :ABONOIT, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, :NUMEROIT, NULL, NULL, :TIPOIT, 0);
                SUMA = SUMA + ABONOIT;
                NROI = NROI + 1;
                END
            END
        if (TIPOCUEN = 'N') then
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :CRUCES, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
        SUMA = SUMA + CRUCES;
        NROI = NROI + 1;
        END /* cruces */
    /* CIERRE EL COMPROBANTE CONTRA LA CUENTA DEL TERCERO O LA BASE CONSTANTE */
    if ((SUMA <> 0) and ((BASE = 'T') or (BASE = 'K'))) then
        BEGIN
        if (SUMA < 0) then
            BEGIN
            DEBITO = SUMA * -1;
            CREDITO = 0;
            END
        ELSE
            BEGIN
            DEBITO = 0;
            CREDITO = SUMA;
            END
        if (BASE = 'T') then
            CTABASE = TCTACLIEN;
        CUENTA = NULL;
        EXECUTE PROCEDURE VALIDE_CUENTA_C (CTABASE) RETURNING_VALUES (:OK);
        IF (OK = 0) THEN
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTABASE INTO :CUENTA, :TIPOCUEN;
        ELSE
            begin
            EXECUTE PROCEDURE ERROR (61, :IDDOC, :CTABASE, 2);
            CUENTA = CTABASE;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERROR (61, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            /* DEBERIA RECORRER DOCUMENTO POR DOCUMENTO */
            FOR SELECT RCDE_TIPODOC, RCDE_PREFIJO, RCDE_NUMERO, RCDE_ABONO+RCDE_RTFTE+RCDE_RTIVA+RCDE_RTICA+RCDE_DTOF
                FROM RECIBOS_CAJA_DETALLE WHERE RECA_ID = :IDDOC
                INTO :TIPOIT, PREFIT, NUMIT, ABONOIT
                DO
                BEGIN
                NUMEROIT = PREFIT || NUMIT;
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :ABONOIT, 0, 0, :NIT, :PROY, :CENTRO, NULL, :NUMEROIT, NULL, NULL, :TIPOIT, 0);
                NROI = NROI + 1;
                END
            END
        if (TIPOCUEN = 'N') then
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :DEBITO, :CREDITO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
        NROI = NROI + 1;
        END /* SUMA EN CARTERA */
    /* recorra las cuentas adicionales */
    FOR SELECT INJC_CUENTA, INJC_BASE, INJC_PORC, INJC_VALOR, INJC_DB
        FROM INTERFAZ_CAJA_CTAS
        WHERE INCJ_ID = :IDINTER
        INTO :CTADIC, :BASEADIC, :PORCADIC, :VALORADIC, :DBADIC
        DO
        BEGIN
        if (:BASEADIC = 'TOTAL') then
            VALORADIC = VRTOTAL;
        if (:BASEADIC = 'DESCUENTO') then
            VALORADIC = VRDTO;
        if (:BASEADIC = 'RTFTE') then
            VALORADIC = VRRTFTE;
        if (:BASEADIC = 'RTIVA') then
            VALORADIC = VRRTIVA;
        if (:BASEADIC = 'RTICA') then
            VALORADIC = VRRTICA;
        MONTO = VALORADIC * PORCADIC;
        CUENTA = NULL;
        EXECUTE PROCEDURE VALIDE_CUENTA_C (CTADIC) RETURNING_VALUES (:OK);
        IF (OK = 0) THEN
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTADIC INTO :CUENTA, :TIPOCUEN;
        ELSE
            begin
            EXECUTE PROCEDURE ERROR (61, :IDDOC, :CTADIC, 2);
            CUENTA = CTADIC;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERROR (61, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERROR (61, :IDDOC, :CUENTA, 4);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            if (DBADIC = 'S') then
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTADIC, :CONC, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            ELSE
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTADIC, :CONC, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            END
        NROI = NROI + 1;
        END
    if (ERROR > 0) then
        VER = 'S';
    SUSPEND;
    END /* NO ANULADO */
  END /* EXISTE LA INTERFAZ */
ELSE
    BEGIN
    EXECUTE PROCEDURE ERROR (61, :IDDOC, :PREF, 1);
    ERROR = ERROR + 1;
    VER = 'S';
    SUSPEND;
    END
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE RECIBOS_SIN_CONTABILIDAD(
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    ID INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    ESTADO VARCHAR(20),
    IDI INTEGER,
    IDC INTEGER,
    ERROR INTEGER)
AS
DECLARE VARIABLE VER CHAR(2);
declare variable FECICNT VARCHAR(10);
declare variable FECFCNT VARCHAR(10);
declare variable idref INTEGER;
BEGIN /*$$IBE$$ 
EXECUTE PROCEDURE fecha_a_conta(FECINI) returning_values (FECICNT);
EXECUTE PROCEDURE fecha_a_conta(FECFIN) returning_values (FECFCNT);
FOR SELECT RECA_ID, PREF_PRE, RECA_NUMERO FROM RECIBOS_CAJA WHERE RECA_ANULADO = 'N' AND
    RECA_FECHA >= :FECINI AND RECA_FECHA <= :FECFIN and PREF_PRE NOT IN (SELECT AUTO_PREFRDC FROM AUTORIZACIONES) ORDER BY RECA_ID
    INTO :ID, :PREF, :NUMERO
DO
  BEGIN
  idref = null;
  SELECT ENCO_IDREF FROM COMPROBANTE_ENCABEZADO WHERE ENCO_TIPOREF = 61 AND ENCO_FECHA >= :FECICNT AND ENCO_FECHA <= :FECFCNT and ENCO_IDREF = :id into :idref;
  if (idref IS NULL) then
  begin
   ESTADO = 'PROCESANDO';
   SUSPEND;
   SELECT MAX(INCJ_ID) FROM INTERFAZ_CAJA WHERE PREF_PRE = :PREF AND TIDO_COD = 61 INTO :IDI;
   EXECUTE PROCEDURE CONTABIL_RECICAJA (:ID, :IDI) RETURNING_VALUES (:ERROR, :VER, :IDC);
   if (ERROR = 0) then
    BEGIN
    EXECUTE PROCEDURE CONTABILIZA_PENDIENTE (:IDC);
    ESTADO = 'OK';
    END
   ELSE
    ESTADO = 'ERROR';
   suspend;
  end
  END
 $$IBE$$*/ SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE RECIBOS_SIN_CONTABILIDAD(
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    ID INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    ESTADO VARCHAR(20),
    IDI INTEGER,
    IDC INTEGER,
    ERROR INTEGER)
AS
DECLARE VARIABLE VER CHAR(2);
declare variable FECICNT VARCHAR(10);
declare variable FECFCNT VARCHAR(10);
declare variable idref INTEGER;
BEGIN
EXECUTE PROCEDURE fecha_a_conta(FECINI) returning_values (FECICNT);
EXECUTE PROCEDURE fecha_a_conta(FECFIN) returning_values (FECFCNT);
FOR SELECT RECA_ID, PREF_PRE, RECA_NUMERO FROM RECIBOS_CAJA WHERE RECA_ANULADO = 'N' AND
    RECA_FECHA >= :FECINI AND RECA_FECHA <= :FECFIN and PREF_PRE NOT IN (SELECT AUTO_PREFRDC FROM AUTORIZACIONES) ORDER BY RECA_ID
    INTO :ID, :PREF, :NUMERO
DO
  BEGIN
  idref = null;
  SELECT ENCO_IDREF FROM COMPROBANTE_ENCABEZADO WHERE ENCO_TIPOREF = 61 AND ENCO_FECHA >= :FECICNT AND ENCO_FECHA <= :FECFCNT and ENCO_IDREF = :id into :idref;
  if (idref IS NULL) then
  begin
   ESTADO = 'PROCESANDO';
   SUSPEND;
   SELECT MAX(INCJ_ID) FROM INTERFAZ_CAJA WHERE PREF_PRE = :PREF AND TIDO_COD = 61 INTO :IDI;
   EXECUTE PROCEDURE CONTABIL_RECICAJA (:ID, :IDI) RETURNING_VALUES (:ERROR, :VER, :IDC);
   if (ERROR = 0) then
    BEGIN
    EXECUTE PROCEDURE CONTABILIZA_PENDIENTE (:IDC);
    ESTADO = 'OK';
    END
   ELSE
    ESTADO = 'ERROR';
   suspend;
  end
  END
END

^

SET TERM ; ^

/* 20080910C: CONTABILIZAICON CRUCES DE CXC */
SET TERM ^ ;

CREATE OR ALTER PROCEDURE CONTABIL_EGRESO(
    IDDOC INTEGER,
    IDINTER INTEGER)
RETURNS (
    ERROR INTEGER,
    VER CHAR(1),
    IDC INTEGER)
AS
declare variable PREF VARCHAR(4);
declare variable NUM VARCHAR(6);
declare variable FECAUX DATE;
declare variable FECHA CHAR(8);
declare variable CONC CHAR(120);
declare variable VRDTO NUMERIC(18, 2);
declare variable VRRTFTE NUMERIC(18, 2);
declare variable VRRTIVA NUMERIC(18, 2);
declare variable VRRTICA NUMERIC(18, 2);
declare variable VRTOTAL NUMERIC(18, 2);
declare variable TIPOCOMP VARCHAR(3);
declare variable PREFCONT VARCHAR(4);
declare variable BASE CHAR(1);
declare variable CTABASE VARCHAR(20);
declare variable CAJA CHAR(1);
declare variable CTACAJA VARCHAR(20);
declare variable RTFTE CHAR(1);
declare variable CTARTFTE VARCHAR(20);
declare variable RTIVA CHAR(1);
declare variable CTARTIVA VARCHAR(20);
declare variable RTICA CHAR(1);
declare variable CTARTICA VARCHAR(20);
declare variable DTO CHAR(1);
declare variable CTADTO VARCHAR(20);
declare variable EXISTE CHAR(1);
declare variable CUENTA VARCHAR(20);
declare variable MONTO NUMERIC(18,2);
declare variable ES_RETENCION CHAR(1);
declare variable TIPOCUEN CHAR(1);
declare variable NIT VARCHAR(20);
declare variable PROY VARCHAR(4);
declare variable CENTRO VARCHAR(4);
declare variable MONTOBASE NUMERIC(18,2);
declare variable PORC NUMERIC(9,2);
declare variable DEBITO NUMERIC(18,2);
declare variable CREDITO NUMERIC(18,2);
declare variable NROI INTEGER;
declare variable SUMA NUMERIC(18,2);
declare variable TCTACLIEN VARCHAR(20);
declare variable TCTARTFTE VARCHAR(20);
declare variable TCTARTIVA VARCHAR(20);
declare variable TCTARTICA VARCHAR(20);
declare variable TIPOIT INTEGER;
declare variable PREFIT VARCHAR(4);
declare variable NUMIT VARCHAR(6);
declare variable NUMEROIT VARCHAR(10);
declare variable ABONOIT NUMERIC(18,2);
declare variable CTADIC VARCHAR(20);
declare variable BASEADIC VARCHAR(20);
declare variable PORCADIC NUMERIC(5,2);
declare variable VALORADIC NUMERIC(18,2);
declare variable DBADIC CHAR(1);
declare variable VRBASE NUMERIC(18,2);
declare variable GMF CHAR(1);
declare variable CODBCO INTEGER;
declare variable NUMCHEQ VARCHAR(20);
declare variable CRUCES NUMERIC(18,2);
declare variable VRCAJA NUMERIC(18,2);
declare variable OK INTEGER;
BEGIN
/* BUSQUE LA INTERFACE */
EXISTE = 'N';
SELECT 'S', TICO_COD, PRCO_PRE, INCJ_BASE, INCJ_DTOPP, INCJ_RTFTE, INCJ_RTIVA, INCJ_RTICA, INCJ_CAJA, INCJ_CTABASE, INCJ_CTADTO, INCJ_CTARTFTE, INCJ_CTARTIVA, INCJ_CTARTICA, INCJ_CTACAJA, INCJ_CONFIRMAR
    FROM INTERFAZ_CAJA
    WHERE INCJ_ID = :IDINTER
    INTO :EXISTE, :TIPOCOMP, :PREFCONT, :BASE, :DTO, :RTFTE, :RTIVA, :RTICA, :CAJA, :CTABASE, :CTADTO, :CTARTFTE, :CTARTIVA, :CTARTICA, :CTACAJA, :VER;
if (EXISTE = 'S') then
    BEGIN
    OK = 0;
    FOR SELECT CNTB_ID FROM CONTABILIZACION WHERE CNTB_TIPOREF = 62 AND CNTB_IDREF = :IDDOC INTO :OK DO
        BEGIN
        DELETE FROM CONTABILIZACION_DET WHERE CNTB_ID = :OK;
        DELETE FROM CONTABILIZACION WHERE CNTB_ID = :OK;
        END

    /* TRAIGA EL ENCABEZADO DEL EGRESO */
    SELECT PREF_PRE, EGRE_NUMERO, EGRE_FECHA, E.TERC_NIT, EGRE_CONC, EGRE_DTOF, EGRE_MONTO, EGRE_RTFTEMONTO, EGRE_RTIVAMONTO, EGRE_RTICAMONTO, TERC_CTARTFTE, TERC_CTARTIVA, TERC_CTARTICA, TERC_CTACLIENTE
        FROM EGRESOS E, TERCEROS T
        WHERE EGRE_ID = :IDDOC AND E.TERC_NIT = T.TERC_NIT
        INTO :PREF, :NUM, :FECAUX, :NIT, :CONC, :VRDTO, :VRTOTAL, :VRRTFTE, :VRRTIVA, :VRRTICA, :TCTARTFTE, TCTARTIVA, TCTARTICA, TCTACLIEN;
    /* SI ES PROVEEDOR, SOBREESCIBE LAS CUENTAS  */
    SELECT PROV_CTAPAGAR, PROV_CTARTFTE, PROV_CTARTIVA, PROV_CTARTICA
        FROM PROVEEDORES WHERE TERC_NIT = :NIT
        INTO TCTACLIEN, TCTARTFTE, TCTARTIVA, TCTARTICA;
    SELECT PREF_CENTRO, PREF_PROY FROM PREFIJOS
        WHERE PREF_PRE = :PREF AND TIDO_COD = 62 INTO :CENTRO, :PROY;
    EXECUTE PROCEDURE FECHA_A_CONTA(:FECAUX) returning_values (:FECHA);
    /* REGISTRE EL ENCABEZADO CONTABLE */
    IDC = GEN_ID(ID_CONTABILIZA, 1);
    INSERT INTO CONTABILIZACION (CNTB_ID, CNTB_TIPOCOMP, CNTB_PREFCNT, CNTB_NUMERO, CNTB_FECHA, CNTB_CONCEPTO, CNTB_REF, CNTB_TIPOREF, CNTB_IDREF, CNTB_PREFREF, CNTB_NUMREF, CNTB_PROCESADO)
        VALUES (:IDC, :TIPOCOMP, :PREFCONT, :NUM, :FECHA, :CONC, '', 62, :IDDOC, :PREF, :NUM, 'N');
    /* SUME LOS CRUCES PARA LLEVARLOS A LA CUENTA X PAGAR Y RESTAR DE LA CAJA */
    SELECT SUM(EGCC_ABONO) FROM EGRESOS_CRUCEC WHERE EGRE_ID = :iddoc INTO :CRUCES;
    if (CRUCES IS NULL) then
        CRUCES = 0;
    VRCAJA = VRTOTAL - CRUCES;
    NROI = 0;
    SUMA = 0;
    ERROR = 0;
    /* EL CREDITO EN LA CAJA O EL BANCO */
    IF ((CAJA = 'K')) THEN
        BEGIN
        if (VRCAJA <> 0) then
            BEGIN
            CUENTA = NULL;
            EXECUTE PROCEDURE VALIDE_CUENTA_C (CTACAJA) RETURNING_VALUES (:OK);
            IF (OK = 0) THEN
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :CTACAJA INTO :CUENTA, :TIPOCUEN;
            ELSE
                begin
                EXECUTE PROCEDURE ERROR (62, :IDDOC, :CTACAJA, 2);
                CUENTA = CTACAJA;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 4);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRCAJA, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - VRTOTAL;
                END
            END /* VRCAJA <> 0 */
        END /* CAJA CONSTANTE */
    IF ((CAJA = 'F')) THEN
        BEGIN
        /* mueva la cuenta de la caja o el banco o ambas */
        /* PRIMERO LA CAJA */
        FOR SELECT CAJA_CUENTA, EGCA_MONTO FROM EGRESOS_CAJA E, CAJAS C
            WHERE C.CAJA_ID = E.CAJA_ID AND EGRE_ID = :IDDOC
            INTO :CTACAJA, :MONTO
            DO
            BEGIN
            if (MONTO <> 0) then
                BEGIN
                CUENTA = NULL;
                EXECUTE PROCEDURE VALIDE_CUENTA_C (CTACAJA) RETURNING_VALUES (:OK);
                IF (OK = 0) THEN
                    SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                        WHERE CUEN_COD = :CTACAJA INTO :CUENTA, :TIPOCUEN;
                ELSE
                    begin
                    EXECUTE PROCEDURE ERROR (62, :IDDOC, :CTACAJA, 2);
                    CUENTA = CTACAJA;
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 4);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA - MONTO;
                    END
                END /* MONTO <> 0 */
            END /* DO CAJA */
        /* AHORA EL BANCO */
        MONTO = 0;
        SELECT CUBA_CTACONTA, EGBC_MONTO, EGBC_GMF, E.CUBA_COD, CUBA_GMFPOR, EGBC_NUMERO
            FROM EGRESOS_BANCO E, CUENTAS_BANCO C
            WHERE E.CUBA_COD = C.CUBA_COD AND EGRE_ID = :IDDOC
            INTO :CTACAJA, :MONTO, :GMF, :CODBCO, :PORC, :NUMCHEQ;
        if (MONTO <> 0) then
            BEGIN
            if (MONTO <> 0) then
                BEGIN
                CUENTA = NULL;
                EXECUTE PROCEDURE VALIDE_CUENTA_C (CTACAJA) RETURNING_VALUES (:OK);
                IF (OK = 0) THEN
                    SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                        WHERE CUEN_COD = :CTACAJA INTO :CUENTA, :TIPOCUEN;
                ELSE
                    begin
                    EXECUTE PROCEDURE ERROR (62, :IDDOC, :CTACAJA, 2);
                    CUENTA = CTACAJA;
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 4);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, :NUMCHEQ, 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA - MONTO;
                    END
                /* EL GMF */
                if ((GMF = 'S') AND (PORC <> 0)) then
                    BEGIN
                    EXECUTE procedure REDONDEE(:MONTO * :PORC / 1000, 0) returning_values (MONTO);
                    /* REGISTRE EL GMF EN LA MISMA CUENTA DEL BANCO COMO CREDITO */
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, :NUMCHEQ, 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA - MONTO;

                    /* AHORA LA CUENTA DEL GASTO */
                    SELECT CUBA_CTAGMF FROM CUENTAS_BANCO
                        where CUBA_COD = :CODBCO INTO :CTACAJA;
                    EXECUTE PROCEDURE VALIDE_CUENTA_C (CTACAJA) RETURNING_VALUES (:OK);
                    IF (OK = 0) THEN
                        SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                            WHERE CUEN_COD = :CTACAJA INTO :CUENTA, :TIPOCUEN;
                    ELSE
                        begin
                        EXECUTE PROCEDURE ERROR (62, :IDDOC, :CTACAJA, 2);
                        CUENTA = CTACAJA;
                        TIPOCUEN = 'N';
                        ERROR = ERROR + 1;
                        end
                    if (TIPOCUEN = 'I') then
                        BEGIN
                        EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
                        TIPOCUEN = 'N';
                        ERROR = ERROR + 1;
                        END
                    if (TIPOCUEN = 'C') then
                        BEGIN
                        EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 4);
                        TIPOCUEN = 'N';
                        ERROR = ERROR + 1;
                        END
                    if (TIPOCUEN = 'N') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, :NUMCHEQ, :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NROI = NROI + 1;
                        SUMA = SUMA + MONTO;
                        END
                    END /* GMF */
                END /* MONTO <> 0 */
            END /* EGRESO_BANCO */
        END /* CAJA = F */

    /* LOS CRUCES CON CUENTAS X COBRAR */
    if (CRUCES <> 0) then
        BEGIN
        SELECT TERC_CTACLIENTE FROM TERCEROS WHERE TERC_NIT = :nit INTO :ctabase;
        if (CTABASE IS NULL) then
            ctabase = tctaclien;
        CUENTA = NULL;
        EXECUTE PROCEDURE VALIDE_CUENTA_C (CTABASE) RETURNING_VALUES (:OK);
        IF (OK = 0) THEN
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTABASE INTO :CUENTA, :TIPOCUEN;
        ELSE
            begin
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :CTABASE, 2);
            CUENTA = CTABASE;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            /* DEBERIA RECORRER DOCUMENTO POR DOCUMENTO */
            FOR SELECT EGCC_TIPODOC, EGCC_PREFIJO, EGCC_NUMERO, EGCC_ABONO+EGCC_RTFTE+EGCC_RTIVA+EGCC_RTICA+EGCC_DTOF
                FROM egresos_crucec WHERE EGRE_ID = :IDDOC
                INTO :TIPOIT, PREFIT, NUMIT, ABONOIT
                DO
                BEGIN
                NUMEROIT = PREFIT || NUMIT;
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :ABONOIT, 0, 0, :NIT, :PROY, :CENTRO, NULL, :NUMEROIT, NULL, NULL, :TIPOIT, 0);
                SUMA = SUMA - ABONOIT;
                NROI = NROI + 1;
                END
            END
        if (TIPOCUEN = 'N') then
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :CRUCES, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
        SUMA = SUMA - CRUCES;
        NROI = NROI + 1;
        END /* cruces */

    if (DTO = 'K') then /* DTO EN CTA CONSTANTE */
        BEGIN
        if (VRDTO <> 0) then
            BEGIN
            CUENTA = NULL;
            EXECUTE PROCEDURE VALIDE_CUENTA_C (CTADTO) RETURNING_VALUES (:OK);
            IF (OK = 0) THEN
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :CTADTO INTO :CUENTA, :TIPOCUEN;
            ELSE
                begin
                EXECUTE PROCEDURE ERROR (62, :IDDOC, :CTADTO, 2);
                CUENTA = CTADTO;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 4);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRDTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - VRDTO;
                END
            END /* VRDTO <> 0 */
        END /* DTO EN CTA CONSTANTE */
    /* RETENCION FUENTE */
    if ((RTFTE = 'T') or (RTFTE = 'K')) then
      if (VRRTFTE <> 0) then
        BEGIN
        if (RTFTE = 'T') then
            CTARTFTE = TCTARTFTE;
        CUENTA = NULL;
        EXECUTE PROCEDURE VALIDE_CUENTA_C (CTARTFTE) RETURNING_VALUES (:OK);
        IF (OK = 0) THEN
            SELECT CUEN_COD, CUEN_RETENCION, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTARTFTE INTO :CUENTA, :ES_RETENCION, :TIPOCUEN;
        ELSE
            begin
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :CTARTFTE, 2);
            CUENTA = CTARTFTE;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 4);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            if (ES_RETENCION = 'S') then
                BEGIN
                VRBASE = VRTOTAL;
                SELECT PROV_RETEFTE from proveedores where terc_nit = :NIT INTO :PORC;
                END
            ELSE
                BEGIN
                VRBASE = 0;
                PORC = 0;
                END
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, :VRBASE, :PORC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA - VRRTFTE;
            END
        END /* RTFTE */
    /* RETENCION IVA */
    if ((RTIVA = 'T') or (RTIVA = 'K')) then
      if (VRRTIVA <> 0) then
        BEGIN
        if (RTIVA = 'T') then
            CTARTIVA = TCTARTIVA;
        CUENTA = NULL;
        EXECUTE PROCEDURE VALIDE_CUENTA_C (CTARTIVA) RETURNING_VALUES (:OK);
        IF (OK = 0) THEN
            SELECT CUEN_COD, CUEN_RETENCION, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTARTIVA INTO :CUENTA, :ES_RETENCION, :TIPOCUEN;
        ELSE
            begin
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :CTARTIVA, 2);
            CUENTA = CTARTIVA;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 4);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            if (ES_RETENCION = 'S') then
                BEGIN
                VRBASE = VRTOTAL;
                SELECT PROV_RTEIVA from proveedores where terc_nit = :NIT INTO :PORC;
                END
            ELSE
                BEGIN
                VRBASE = 0;
                PORC = 0;
                END
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTIVA, :VRBASE, :PORC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA - VRRTIVA;
            END
        END /* RTIVA */
    /* RETENCION DE ICA */
    if ((RTICA = 'T') or (RTICA = 'K')) then
      if (VRRTICA <> 0) then
        BEGIN
        if (RTICA = 'T') then
            CTARTICA = TCTARTICA;
        CUENTA = NULL;
        EXECUTE PROCEDURE VALIDE_CUENTA_C (CTARTICA) RETURNING_VALUES (:OK);
        IF (OK = 0) THEN
            SELECT CUEN_COD, CUEN_RETENCION, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTARTICA INTO :CUENTA, :ES_RETENCION, :TIPOCUEN;
        ELSE
            begin
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :CTARTICA, 2);
            CUENTA = CTARTICA;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 4);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            if (ES_RETENCION = 'S') then
                BEGIN
                VRBASE = VRTOTAL;
                SELECT PROV_RTEICA from proveedores where terc_nit = :NIT INTO :PORC;
                END
            ELSE
                BEGIN
                VRBASE = 0;
                PORC = 0;
                END
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTICA, :VRBASE, :PORC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA - VRRTICA;
            END
        END /* RTICA */
    /* RECORRA LAS CUENTAS DE EGRESOS_CONTABILIDAD */
    FOR SELECT CUEN_COD, EGCO_NIT, EGCO_PROY, EGCO_CENTRO, EGCO_CONC, EGCO_DEBITOS, EGCO_CREDITOS, EGCO_BASEM, EGCO_PORC
        FROM EGRESOS_CONTABILIDAD WHERE EGRE_ID = :IDDOC ORDER BY EGCO_ITEM
        INTO :CTABASE, :NIT, :PROY, :CENTRO, :CONC, :DEBITO, :CREDITO, :MONTOBASE, :PORC
        DO
        BEGIN
        CUENTA = NULL;
        EXECUTE PROCEDURE VALIDE_CUENTA_C (CTABASE) RETURNING_VALUES (:OK);
        IF (OK = 0) THEN
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTABASE INTO :CUENTA, :TIPOCUEN;
        ELSE
            begin
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :CTABASE, 2);
            CUENTA = CTABASE;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 4);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'N') then
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :DEBITO, :CREDITO, :MONTOBASE, :PORC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
        SUMA = SUMA + DEBITO - CREDITO;
        NROI = NROI + 1;
        END
    /* CIERRE EL COMPROBANTE CONTRA LA CUENTA DEL TERCERO O LA BASE CONSTANTE */
    if ((SUMA <> 0) and (BASE = 'F') or (BASE = 'T') or (BASE = 'K')) then
        BEGIN
        if (SUMA < 0) then
            BEGIN
            DEBITO = SUMA * -1;
            CREDITO = 0;
            END
        ELSE
            BEGIN
            DEBITO = 0;
            CREDITO = SUMA;
            END
        if (BASE = 'T') then
            CTABASE = TCTACLIEN;
        if (BASE = 'F') then
            BEGIN
            SELECT CAJA_CUENTA FROM EGRESOS E, CAJAS C
                WHERE C.CAJA_ID = E.CAJA_ID AND EGRE_ID = :IDDOC INTO :CTABASE;
            END
        CUENTA = NULL;
        EXECUTE PROCEDURE VALIDE_CUENTA_C (CTABASE) RETURNING_VALUES (:OK);
        IF (OK = 0) THEN
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTABASE INTO :CUENTA, :TIPOCUEN;
        ELSE
            begin
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :CTABASE, 2);
            CUENTA = CTABASE;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            /* DEBERIA RECORRER DOCUMENTO POR DOCUMENTO */
            FOR SELECT RCDE_TIPODOC, RCDE_PREFIJO, RCDE_NUMERO, RCDE_ABONO+RCDE_RTFTE+RCDE_RTIVA+RCDE_RTICA+RCDE_DTOF
                FROM RECIBOS_CAJA_DETALLE WHERE RECA_ID = :IDDOC
                INTO :TIPOIT, PREFIT, NUMIT, ABONOIT
                DO
                BEGIN
                NUMEROIT = PREFIT || NUMIT;
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :ABONOIT, 0, 0, :NIT, :PROY, :CENTRO, NULL, :NUMEROIT, NULL, NULL, :TIPOIT, 0);
                NROI = NROI + 1;
                END
            END
        if (TIPOCUEN = 'N') then
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :DEBITO, :CREDITO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
        NROI = NROI + 1;
        END /* SUMA EN CARTERA */
    /* recorra las cuentas adicionales */
    FOR SELECT INJC_CUENTA, INJC_BASE, INJC_PORC, INJC_VALOR, INJC_DB
        FROM INTERFAZ_CAJA_CTAS
        WHERE INCJ_ID = :IDINTER
        INTO :CTADIC, :BASEADIC, :PORCADIC, :VALORADIC, :DBADIC
        DO
        BEGIN
        if (:BASEADIC = 'TOTAL') then
            VALORADIC = VRTOTAL;
        if (:BASEADIC = 'DESCUENTO') then
            VALORADIC = VRDTO;
        if (:BASEADIC = 'RTFTE') then
            VALORADIC = VRRTFTE;
        if (:BASEADIC = 'RTIVA') then
            VALORADIC = VRRTIVA;
        if (:BASEADIC = 'RTICA') then
            VALORADIC = VRRTICA;
        MONTO = VALORADIC * PORCADIC;
        CUENTA = NULL;
        EXECUTE PROCEDURE VALIDE_CUENTA_C (CTADIC) RETURNING_VALUES (:OK);
        IF (OK = 0) THEN
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTADIC INTO :CUENTA, :TIPOCUEN;
        ELSE
            begin
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :CTADIC, 2);
            CUENTA = CTADIC;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 4);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            if (DBADIC = 'S') then
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTADIC, :CONC, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            ELSE
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTADIC, :CONC, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            END
        NROI = NROI + 1;
        END
    if (ERROR > 0) then
        VER = 'S';
    SUSPEND;
    END /* EXISTE LA INTERFAZ */
  ELSE
    BEGIN
    EXECUTE PROCEDURE ERROR (62, :IDDOC, :PREF, 1);
    ERROR = ERROR + 1;
    VER = 'S';
    SUSPEND;
    END
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE EGRESOS_SIN_CONTABILIDAD(
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    ID INTEGER,
    IDI INTEGER,
    IDC INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    ESTADO VARCHAR(20),
    ERROR INTEGER)
AS
DECLARE VARIABLE VER CHAR(2);
declare variable FECICNT VARCHAR(10);
declare variable FECFCNT VARCHAR(10);
declare variable idref INTEGER;
BEGIN /*$$IBE$$ 
EXECUTE PROCEDURE fecha_a_conta(FECINI) returning_values (FECICNT);
EXECUTE PROCEDURE fecha_a_conta(FECFIN) returning_values (FECFCNT);
FOR SELECT EGRE_ID, PREF_PRE, egre_numero FROM EGRESOS WHERE EGRE_ANULADO = 'N' AND PREF_PRE <> 'R004' AND
    EGRE_FECHA >= :FECINI AND EGRE_FECHA <= :FECFIN ORDER BY EGRE_ID INTO :ID, :PREF, :NUMERO
DO
  BEGIN
  idref = null;
  SELECT ENCO_IDREF FROM COMPROBANTE_ENCABEZADO WHERE ENCO_TIPOREF = 62 AND ENCO_FECHA >= :FECICNT AND ENCO_FECHA <= :FECFCNT and ENCO_IDREF = :ID into :idref;
  if (idref IS NULL) then
  begin
   ESTADO = 'PROCESANDO';
   SUSPEND;
   SELECT MAX(INCJ_ID) FROM INTERFAZ_CAJA WHERE PREF_PRE = :PREF AND TIDO_COD = 62 INTO :IDI;
   EXECUTE PROCEDURE CONTABIL_EGRESO (:ID, :IDI) RETURNING_VALUES (:ERROR, :VER, :IDC);
   IF (ERROR = 0) THEN
      BEGIN
      EXECUTE PROCEDURE CONTABILIZA_PENDIENTE (:IDC);
      ESTADO = 'OK';
      END
   ELSE
    ESTADO = 'ERROR';
   suspend;
  end
  END
 $$IBE$$*/ SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE EGRESOS_SIN_CONTABILIDAD(
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    ID INTEGER,
    IDI INTEGER,
    IDC INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    ESTADO VARCHAR(20),
    ERROR INTEGER)
AS
DECLARE VARIABLE VER CHAR(2);
declare variable FECICNT VARCHAR(10);
declare variable FECFCNT VARCHAR(10);
declare variable idref INTEGER;
BEGIN
EXECUTE PROCEDURE fecha_a_conta(FECINI) returning_values (FECICNT);
EXECUTE PROCEDURE fecha_a_conta(FECFIN) returning_values (FECFCNT);
FOR SELECT EGRE_ID, PREF_PRE, egre_numero FROM EGRESOS WHERE EGRE_ANULADO = 'N' AND PREF_PRE <> 'R004' AND
    EGRE_FECHA >= :FECINI AND EGRE_FECHA <= :FECFIN ORDER BY EGRE_ID INTO :ID, :PREF, :NUMERO
DO
  BEGIN
  idref = null;
  SELECT ENCO_IDREF FROM COMPROBANTE_ENCABEZADO WHERE ENCO_TIPOREF = 62 AND ENCO_FECHA >= :FECICNT AND ENCO_FECHA <= :FECFCNT and ENCO_IDREF = :ID into :idref;
  if (idref IS NULL) then
  begin
   ESTADO = 'PROCESANDO';
   SUSPEND;
   SELECT MAX(INCJ_ID) FROM INTERFAZ_CAJA WHERE PREF_PRE = :PREF AND TIDO_COD = 62 INTO :IDI;
   EXECUTE PROCEDURE CONTABIL_EGRESO (:ID, :IDI) RETURNING_VALUES (:ERROR, :VER, :IDC);
   IF (ERROR = 0) THEN
      BEGIN
      EXECUTE PROCEDURE CONTABILIZA_PENDIENTE (:IDC);
      ESTADO = 'OK';
      END
   ELSE
    ESTADO = 'ERROR';
   suspend;
  end
  END
END

^

SET TERM ; ^

/* 20080910D : mejora rendimiento reporte d cartera con notas */

CREATE INDEX NOTAS_CLIENTES_IDX1
ON NOTAS_CLIENTES (TERC_NIT,CLSU_COD);

SET TERM ^ ;

CREATE OR ALTER PROCEDURE REP_CARTERA_NOTAS(
    DESDE VARCHAR(20),
    HASTA VARCHAR(20),
    GRPINI VARCHAR(5),
    GRPFIN VARCHAR(5),
    FECHA DATE,
    ORDEN CHAR(1),
    AGRUPA CHAR(1),
    SUBEMPRESA INTEGER,
    VENCEINI DATE,
    VENCEFIN DATE,
    GRUPCART INTEGER)
RETURNS (
    NIT VARCHAR(20),
    NOMBRE VARCHAR(60),
    TELEFONO VARCHAR(40),
    CIUDAD VARCHAR(40),
    CODZONA VARCHAR(2),
    NOMZONA VARCHAR(60),
    CODCOBR INTEGER,
    NOMCOBR VARCHAR(60),
    SUCURSAL VARCHAR(10),
    DV CHAR(1),
    CODCIUD CHAR(5),
    NOMCIUD VARCHAR(60),
    SALDO NUMERIC(18,2),
    NOTA1 VARCHAR(256),
    NOTA2 VARCHAR(256),
    CUPO NUMERIC(18,2),
    DISPONIBLE NUMERIC(18,2),
    PROVISIONAL NUMERIC(18,2),
    CONTACTO VARCHAR(60),
    ESTADO CHAR(1),
    GRUPCOD INTEGER,
    GRUPNOM VARCHAR(30))
AS
declare variable NITINI VARCHAR(20);
declare variable NITFIN VARCHAR(20);
declare variable NOMINI VARCHAR(20);
declare variable NOMFIN VARCHAR(20);
declare variable OK CHAR(1);
declare variable PSALDO NUMERIC(18,2);
declare variable TIPO INTEGER;
declare variable ID INTEGER;
declare variable NOTA VARCHAR(277);
declare variable TIPODOC VARCHAR(8);
declare variable NUMDOC VARCHAR(10);
declare variable FECNOTA VARCHAR(10);
declare variable I INTEGER;
declare variable INCLANTI CHAR(2);
BEGIN
if (ORDEN = 'C') then
    BEGIN
    NITINI = DESDE;
    NITFIN = HASTA;
    NOMINI = '';
    NOMFIN = 'zz';
    END
ELSE
    BEGIN
    NOMINI = DESDE;
    NOMFIN = HASTA;
    NITINI = '';
    NITFIN = 'zz';
    END
  EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'INCLUIR ANTICIPOS DE CLIENTES EN REPORTES Y CONSULTAS DE CARTERA') returning_values (INCLANTI);
  /* Ubique el NIT */
  FOR select T.TERC_NIT, CLSU_NOMBRE, TERC_DV, CLSU_TEL, CLSU_CIUDAD, TERC_CONTACTO, S.COBR_COD, S.ZONA_COD, CIUD_COD, CLIE_CUPO, CLIE_ESTADO, CLCU_COD, C.GRCA_COD
    from terceros T, CLIENTES C, CLIENTE_SUCURSALES S
    where C.TERC_NIT = T.TERC_NIT AND TERC_CLIE = 'S' AND S.TERC_NIT = C.TERC_NIT AND T.TERC_NIT >= :NITINI AND T.TERC_NIT <= :NITFIN AND
        TERC_NOM >= :NOMINI AND TERC_NOM <= :NOMFIN AND ((:GRUPCART = 0) or (C.GRCA_COD = :GRUPCART))
    INTO :NIT, :NOMBRE, :DV, :TELEFONO, :CIUDAD, :CONTACTO, :CODCOBR, :CODZONA, :CODCIUD, :CUPO, :ESTADO, :SUCURSAL, :GRUPCOD
    DO  
    BEGIN
    SELECT GRCA_NOMBRE FROM GRUPO_CARTERA WHERE GRCA_COD = :GRUPCOD INTO :GRUPNOM;
    OK = 'N';
    if (AGRUPA = 'Z') then
        BEGIN
        if (GRPINI = '') then
            BEGIN
            if ((CODZONA IS NULL) or (CODZONA >= :GRPINI AND CODZONA <= :GRPFIN)) then
                OK = 'S';
            END
        ELSE
            if (CODZONA >= :GRPINI AND CODZONA <= :GRPFIN) then
                OK = 'S';
        END
    if (AGRUPA = 'I') then
        BEGIN
        if (GRPINI = '') then
            BEGIN
            if ((CODCIUD IS NULL) or (CODCIUD >= :GRPINI AND CODCIUD <= :GRPFIN)) then
                OK = 'S';
            END
        ELSE
            if (CODCIUD >= :GRPINI AND CODCIUD <= :GRPFIN) then
                OK = 'S';
        END
    if (AGRUPA = 'N') then
        OK = 'S';
        
    if (OK = 'S') then
        BEGIN
        if (CODCOBR IS NOT NULL) then
            SELECT COBR_NOM FROM COBRADORES  WHERE COBR_COD = :CODCOBR INTO :NOMCOBR;
        if (CODZONA IS NOT NULL) then
            SELECT ZONA_NOM FROM ZONAS WHERE ZONA_COD = :CODZONA INTO :NOMZONA;
        if (CODCIUD IS NOT NULL) then
            SELECT CIUD_NOM FROM CIUDADES  WHERE CIUD_COD = :CODCIUD INTO :NOMCIUD;
    
        SALDO = 0;
        /* BUSQUE EN SALDOS_DOC_CARTERA LOS QUE TENGAN SALDO > 0 */
        FOR SELECT MVCL_TIPOREF, MVCL_IDREF
          FROM MOVIMIENTO_CLIENTES WHERE TERC_NIT = :NIT AND MVCL_SUCURSAL = :SUCURSAL AND MVCL_FECHA <= :FECHA AND
          MVCL_ABONO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) AND MVCL_VENCE >= :VENCEINI AND MVCL_VENCE <= :VENCEFIN
          INTO :TIPO, :ID
          DO
            if ((inclanti = 'SI') or (TIPO <> 45)) then
                BEGIN
                EXECUTE PROCEDURE saldo_doc_cartera(TIPO, ID, FECHA) returning_values (PSALDO);
                if (PSALDO <> 0) then
                    SALDO = SALDO + PSALDO;
                END
        DISPONIBLE = CUPO - SALDO;
        /* LOS RECIBOS PROVISIONALES */
        SELECT SUM(RPDE_ABONO) FROM RECIBO_PROVISIONAL P, recibo_provisional_detalle D
            WHERE P.rcpr_id = D.rcpr_id AND TERC_NIT = :NIT AND RPDE_SUCURSAL = :SUCURSAL AND
            RCPR_FECHA <= :FECHA AND RCPR_ANULADO = 'N' AND ((RCPR_FECCRUCE IS NULL) or (RCPR_FECCRUCE > :FECHA)) AND
            ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            INTO :provisional;
        /* LAS NOTAS DE CLIENTES */
        I = 0;
        NOTA1 = '';
        NOTA2 = '';
        FOR SELECT CAST(NOCL_FECHA AS VARCHAR(10)), tido_nomcorto, NOCL_NUMDOC, NOCL_TEXTO
            FROM NOTAS_CLIENTES N, TIPO_DOCUMENTO T WHERE N.NOCL_TIPODOC = T.TIDO_COD AND TERC_NIT = :NIT
            AND N.TINO_COD = 3 AND N.CLSU_COD = :SUCURSAL
            ORDER BY NOCL_ID DESC INTO :FECNOTA, :TIPODOC, :NUMDOC, :NOTA
            DO
            BEGIN
            if (I = 0) then
                NOTA1 = NOTA;
            if (I = 1) then
                NOTA2 = NOTA;
            I = I + 1;
            END
        SUSPEND;
        END
    if (AGRUPA = 'C') then
        BEGIN
        if (CODZONA IS NOT NULL) then
            SELECT ZONA_NOM FROM ZONAS WHERE ZONA_COD = :CODZONA INTO :NOMZONA;
        if (CODCIUD IS NOT NULL) then
            SELECT CIUD_NOM FROM CIUDADES  WHERE CIUD_COD = :CODCIUD INTO :NOMCIUD;
        FOR SELECT DISTINCT COBR_COD FROM MOVIMIENTO_CLIENTES WHERE TERC_NIT = :NIT AND
            MVCL_SUCURSAL = :SUCURSAL AND MVCL_FECHA <= :FECHA AND
            MVCL_ABONO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) AND MVCL_VENCE >= :VENCEINI AND MVCL_VENCE <= :VENCEFIN
            INTO :codcobr
            DO
            begin
            OK = 'N';
            if (GRPINI = '') then
                BEGIN
                if ((CODCOBR IS NULL) or (CODCOBR >= :GRPINI AND CODCOBR <= :GRPFIN)) then
                    OK = 'S';
                END
            ELSE
                if (CODCOBR >= :GRPINI AND CODCOBR <= :GRPFIN) then
                    OK = 'S';
            if (OK = 'S') then
                BEGIN
                SELECT COBR_NOM FROM COBRADORES  WHERE COBR_COD = :CODCOBR INTO :NOMCOBR;

                SALDO = 0;
                /* BUSQUE EN SALDOS_DOC_CARTERA LOS QUE TENGAN SALDO > 0 */
                FOR SELECT MVCL_TIPOREF, MVCL_IDREF
                  FROM MOVIMIENTO_CLIENTES WHERE TERC_NIT = :NIT AND MVCL_SUCURSAL = :SUCURSAL AND
                  MVCL_FECHA <= :FECHA AND COBR_COD = :codcobr AND MVCL_ABONO = 'N' AND
                  ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) AND MVCL_VENCE >= :VENCEINI AND MVCL_VENCE <= :VENCEFIN
                  INTO :TIPO, :ID
                  DO
                    if ((inclanti = 'SI') or (TIPO <> 45)) then
                        BEGIN
                        EXECUTE PROCEDURE saldo_doc_cartera(TIPO, ID, FECHA) returning_values (PSALDO);
                        if (PSALDO <> 0) then
                            BEGIN
                            SALDO = SALDO + PSALDO;
                            END
                        END
                DISPONIBLE = CUPO - SALDO;
                /* LOS RECIBOS PROVISIONALES */
                SELECT SUM(RPDE_ABONO) FROM RECIBO_PROVISIONAL P, recibo_provisional_detalle D
                    WHERE P.rcpr_id = D.rcpr_id AND TERC_NIT = :NIT AND RPDE_SUCURSAL = :SUCURSAL AND
                    VEND_COD = :CODCOBR AND RCPR_FECHA <= :FECHA AND RCPR_ANULADO = 'N' AND ((RCPR_FECCRUCE IS NULL) or (RCPR_FECCRUCE > :FECHA)) AND
                    ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                    INTO :provisional;
                /* LAS NOTAS DE CLIENTES */
                I = 0;
                NOTA1 = '';
                NOTA2 = '';
                FOR SELECT CAST(NOCL_FECHA AS VARCHAR(10)), tido_nomcorto, NOCL_NUMDOC, NOCL_TEXTO
                    FROM NOTAS_CLIENTES N, TIPO_DOCUMENTO T WHERE N.NOCL_TIPODOC = T.TIDO_COD AND TERC_NIT = :NIT
                    AND N.TINO_COD = 3 AND N.CLSU_COD = :SUCURSAL
                    ORDER BY NOCL_FECHA DESC INTO :FECNOTA, :TIPODOC, :NUMDOC, :NOTA
                    DO
                    BEGIN
                    if (I = 0) then
                        NOTA1 = NOTA;
                    if (I = 1) then
                        NOTA2 = NOTA;
                    I = I + 1;
                    END
                SUSPEND;
                END /* OK = S */
            END /* FOR COBRADOR */
        END /* AGRUPA = C */
    END /* FOR NIT */
END
^

SET TERM ; ^


SET TERM ^ ;

CREATE OR ALTER PROCEDURE CARTERA_CLIENTE(
    NIT VARCHAR(20),
    FECHA DATE,
    SUCURSAL VARCHAR(10))
RETURNS (
    TIPO INTEGER,
    ID INTEGER,
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(6),
    CONCEPTO VARCHAR(60),
    SALDO NUMERIC(18,2),
    RTFTE NUMERIC(18,2),
    RTIVA NUMERIC(18,2),
    RTICA NUMERIC(18,2),
    DTOF NUMERIC(18,2),
    TIPONOM VARCHAR(8),
    VENCE DATE,
    FECDOC DATE,
    DIAS INTEGER,
    RECPROV_ID INTEGER,
    RECIPROV CHAR(1),
    NOTA VARCHAR(256))
AS
declare variable FEC DATE;
declare variable DESC_RTES CHAR(2);
declare variable DTOAPL NUMERIC(18,2);
declare variable IDNOTA INTEGER;
declare variable AUTORET VARCHAR(10);
declare variable FAUTORET DATE;
BEGIN
EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'DESCONTAR RETENCIONES POR CAUSACION') returning_values (DESC_RTES);
EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'FECHA AUTORETENEDOR NO DESCONTAR RETENCIONES DEL SALDO PERO SI CONTABILIZARLAS') returning_values (AUTORET);
if (AUTORET <> '') then
    FAUTORET = CAST(AUTORET AS DATE);
else
    FAUTORET = '9999/12/31';
/* LAS DE ANTES DE LA AUTORETENCION */
if (DESC_RTES = 'SI') then
    FOR SELECT MAX(SDCA_TIPOREF), MAX(SDCA_IDREF), sum(SDCA_MONTO-SDCA_ABONO-SDCA_RTFTE-SDCA_RTIVA-SDCA_RTICA), SUM(SDCA_RTFTE - SDCA_ABRTFTE), SUM(SDCA_RTIVA - SDCA_ABRTIVA), SUM(SDCA_RTICA - SDCA_ABRTICA)
        FROM saldos_doc_cartera WHERE TERC_NIT = :nit AND (SDCA_FECHA <= :FECHA) AND (SDCA_FECHA < :FAUTORET) group by sdca_tiporef, sdca_idref
        INTO :TIPO, :ID, :SALDO, :RTFTE, :RTIVA, :RTICA
        DO
        begin
        if (SALDO <> 0) then
            BEGIN
            SELECT MVCL_FECHA, MVCL_VENCE, MVCL_PREFREF, MVCL_NUMREF, MVCL_CONC
              FROM MOVIMIENTO_CLIENTES WHERE TERC_NIT = :NIT AND mvcl_sucursal = :sucursal and MVCL_FECHA <= :FECHA AND MVCL_ABONO = 'N' and mvcl_tiporef = :tipo and mvcl_idref = :id
              INTO :FECDOC, :VENCE, :PREFIJO, :NUMERO, :CONCEPTO;
            DIAS = (FECHA -VENCE );
            SELECT TIDO_NOMCORTO FROM TIPO_DOCUMENTO WHERE TIDO_COD = :TIPO INTO :TIPONOM;
            if (TIPO = 41) then
                SELECT NDCL_DTOFMONTO, NDCL_FECHADTO FROM NOTAS_DEBITO_CLIENTES WHERE NDCL_ID = :ID INTO :DTOF, :FEC;
            if (TIPO = 42) then
                SELECT 0, NCCL_FECHA FROM NOTAS_CREDITO_CLIENTES WHERE NCCL_ID = :ID INTO :DTOF, :FEC;
            if (TIPO = 45) then
                SELECT ANCL_DTOFMONTO, ANCL_DTOFECHA FROM ANTICIPOS_CLIENTE WHERE ANCL_ID = :ID INTO :DTOF, :FEC;
            if (TIPO = 31) then
                SELECT FACT_DTOFMONTO, FACT_DTOFFECHA FROM FACTURAS WHERE FACT_ID = :ID INTO :DTOF, :FEC;
            if (TIPO = 33) then
                SELECT 0, :FECHA FROM devoluciones_ventas WHERE DEVT_ID = :ID INTO :DTOF, :FEC;

            recprov_id = 0;
            SELECT max(RCPR_ID) FROM recibo_provisional_detalle WHERE RPDE_IDDOC = :ID AND RPDE_TIPODOC = :TIPO and RPDE_ANULADO = 'N' INTO :recprov_id;
            if (recprov_id is null) then
                reciprov = 'N';
            ELSE
                reciprov = 'S';
            if (FECHA > FEC) then
                DTOF = 0;
            if (DTOF IS NULL) then
                DTOF = 0;
            if (DTOF <> 0) then
                BEGIN
                SELECT SUM(RCDE_DTOF) FROM RECIBOS_CAJA_DETALLE WHERE RCDE_IDDOC = :ID AND RCDE_TIPODOC = :TIPO INTO :DTOAPL;
                if (DTOAPL IS NULL) then
                    DTOAPL = 0;
                DTOF = DTOF - DTOAPL;
                END
            if (RTFTE IS NULL) then
                RTFTE = 0;
            if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) THEN
                BEGIN
                if (RTFTE > 0) then
                    RTFTE = 0;
                END
            ELSE
                BEGIN
                if (RTFTE < 0) then
                    RTFTE = 0;
                END

            if (RTIVA IS NULL) then
                RTIVA = 0;
            if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) THEN
                BEGIN
                if (RTIVA > 0) then
                    RTIVA = 0;
                END
            ELSE
                BEGIN
                if (RTIVA < 0) then
                    RTIVA = 0;
                END

            if (RTICA IS NULL) then
                RTICA = 0;
            if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) THEN
                BEGIN
                if (RTICA > 0) then
                    RTICA = 0;
                END
            ELSE
                BEGIN
                if (RTICA < 0) then
                    RTICA = 0;
                END

            /* SI TIENE NOTA AGREGUELA */
            SELECT MAX(NOCL_ID) FROM NOTAS_CLIENTES WHERE TERC_NIT = :NIT AND CLSU_COD = :SUCURSAL AND NOCL_TIPODOC = :TIPO AND NOCL_IDDOC = :ID INTO :IDNOTA;
            if (IDNOTA IS NOT NULL) then
                SELECT NOCL_TEXTO FROM NOTAS_CLIENTES WHERE NOCL_ID = :IDNOTA INTO :NOTA;
            else
                NOTA = '';
            SUSPEND;
            END
        end
ELSE
    FOR SELECT MAX(SDCA_TIPOREF), MAX(SDCA_IDREF), sum(SDCA_MONTO-SDCA_ABONO-SDCA_ABRTFTE-SDCA_ABRTIVA-SDCA_ABRTICA), SUM(SDCA_RTFTE - SDCA_ABRTFTE), SUM(SDCA_RTIVA - SDCA_ABRTIVA), SUM(SDCA_RTICA - SDCA_ABRTICA)
        FROM saldos_doc_cartera WHERE (TERC_NIT = :nit) AND (SDCA_FECHA <= :FECHA) AND (SDCA_FECHA < :FAUTORET) group by sdca_tiporef, sdca_idref
        INTO :TIPO, :ID, :SALDO, :RTFTE, :RTIVA, :RTICA
        DO
        begin
        if (SALDO <> 0) then
            BEGIN
            SELECT MVCL_FECHA, MVCL_VENCE, MVCL_PREFREF, MVCL_NUMREF, MVCL_CONC
              FROM MOVIMIENTO_CLIENTES WHERE TERC_NIT = :NIT AND mvcl_sucursal = :sucursal and MVCL_FECHA <= :FECHA AND MVCL_ABONO = 'N' and mvcl_tiporef = :tipo and mvcl_idref = :id
              INTO :FECDOC, :VENCE, :PREFIJO, :NUMERO, :CONCEPTO;
            DIAS = (FECHA -VENCE );
            SELECT TIDO_NOMCORTO FROM TIPO_DOCUMENTO WHERE TIDO_COD = :TIPO INTO :TIPONOM;
            if (TIPO = 41) then
                SELECT NDCL_DTOFMONTO, NDCL_FECHADTO FROM NOTAS_DEBITO_CLIENTES WHERE NDCL_ID = :ID INTO :DTOF, :FEC;
            if (TIPO = 42) then
                SELECT 0, NCCL_FECHA FROM NOTAS_CREDITO_CLIENTES WHERE NCCL_ID = :ID INTO :DTOF, :FEC;
            if (TIPO = 45) then
                SELECT ANCL_DTOFMONTO, ANCL_DTOFECHA FROM ANTICIPOS_CLIENTE WHERE ANCL_ID = :ID INTO :DTOF, :FEC;
            if (TIPO = 31) then
                SELECT FACT_DTOFMONTO, FACT_DTOFFECHA FROM FACTURAS WHERE FACT_ID = :ID INTO :DTOF, :FEC;
            if (TIPO = 33) then
                SELECT 0, :FECHA FROM devoluciones_ventas WHERE DEVT_ID = :ID INTO :DTOF, :FEC;

            recprov_id = 0;
            SELECT max(RCPR_ID) FROM recibo_provisional_detalle WHERE RPDE_IDDOC = :ID AND RPDE_TIPODOC = :TIPO and RPDE_ANULADO = 'N' INTO :recprov_id;
            if (recprov_id is null) then
                reciprov = 'N';
            ELSE
                reciprov = 'S';
            if (FECHA > FEC) then
                DTOF = 0;
            if (DTOF IS NULL) then
                DTOF = 0;
            if (DTOF <> 0) then
                BEGIN
                SELECT SUM(RCDE_DTOF) FROM RECIBOS_CAJA_DETALLE WHERE RCDE_IDDOC = :ID AND RCDE_TIPODOC = :TIPO INTO :DTOAPL;
                if (DTOAPL IS NULL) then
                    DTOAPL = 0;
                DTOF = DTOF - DTOAPL;
                END
            if (RTFTE IS NULL) then
                RTFTE = 0;
            if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) THEN
                BEGIN
                if (RTFTE > 0) then
                    RTFTE = 0;
                END
            ELSE
                BEGIN
                if (RTFTE < 0) then
                    RTFTE = 0;
                END

            if (RTIVA IS NULL) then
                RTIVA = 0;
            if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) THEN
                BEGIN
                if (RTIVA > 0) then
                    RTIVA = 0;
                END
            ELSE
                BEGIN
                if (RTIVA < 0) then
                    RTIVA = 0;
                END

            if (RTICA IS NULL) then
                RTICA = 0;
            if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) THEN
                BEGIN
                if (RTICA > 0) then
                    RTICA = 0;
                END
            ELSE
                BEGIN
                if (RTICA < 0) then
                    RTICA = 0;
                END

            /* SI TIENE NOTA AGREGUELA */
            SELECT MAX(NOCL_ID) FROM NOTAS_CLIENTES WHERE TERC_NIT = :NIT AND CLSU_COD = :SUCURSAL AND NOCL_TIPODOC = :TIPO AND NOCL_IDDOC = :ID INTO :IDNOTA;
            if (IDNOTA IS NOT NULL) then
                SELECT NOCL_TEXTO FROM NOTAS_CLIENTES WHERE NOCL_ID = :IDNOTA INTO :NOTA;
            else
                NOTA = '';
            SUSPEND;
            END
        end
/* LAS DE DESPUES DE LA AUTORETENCION */
if (DESC_RTES = 'SI') then
    FOR SELECT MAX(SDCA_TIPOREF), MAX(SDCA_IDREF), sum(SDCA_MONTO-SDCA_ABONO-SDCA_RTIVA-SDCA_RTICA), 0, SUM(SDCA_RTIVA - SDCA_ABRTIVA), SUM(SDCA_RTICA - SDCA_ABRTICA)
        FROM saldos_doc_cartera WHERE (TERC_NIT = :nit) AND (SDCA_FECHA <= :FECHA) AND (SDCA_FECHA >= :FAUTORET) group by sdca_tiporef, sdca_idref
        INTO :TIPO, :ID, :SALDO, :RTFTE, :RTIVA, :RTICA
        DO
        begin
        if (SALDO <> 0) then
            BEGIN
            SELECT MVCL_FECHA, MVCL_VENCE, MVCL_PREFREF, MVCL_NUMREF, MVCL_CONC
              FROM MOVIMIENTO_CLIENTES WHERE TERC_NIT = :NIT AND mvcl_sucursal = :sucursal and MVCL_FECHA <= :FECHA AND MVCL_ABONO = 'N' and mvcl_tiporef = :tipo and mvcl_idref = :id
              INTO :FECDOC, :VENCE, :PREFIJO, :NUMERO, :CONCEPTO;
            DIAS = (FECHA -VENCE );
            SELECT TIDO_NOMCORTO FROM TIPO_DOCUMENTO WHERE TIDO_COD = :TIPO INTO :TIPONOM;
            if (TIPO = 41) then
                SELECT NDCL_DTOFMONTO, NDCL_FECHADTO FROM NOTAS_DEBITO_CLIENTES WHERE NDCL_ID = :ID INTO :DTOF, :FEC;
            if (TIPO = 42) then
                SELECT 0, NCCL_FECHA FROM NOTAS_CREDITO_CLIENTES WHERE NCCL_ID = :ID INTO :DTOF, :FEC;
            if (TIPO = 45) then
                SELECT ANCL_DTOFMONTO, ANCL_DTOFECHA FROM ANTICIPOS_CLIENTE WHERE ANCL_ID = :ID INTO :DTOF, :FEC;
            if (TIPO = 31) then
                SELECT FACT_DTOFMONTO, FACT_DTOFFECHA FROM FACTURAS WHERE FACT_ID = :ID INTO :DTOF, :FEC;
            if (TIPO = 33) then
                SELECT 0, :FECHA FROM devoluciones_ventas WHERE DEVT_ID = :ID INTO :DTOF, :FEC;

            recprov_id = 0;
            SELECT max(RCPR_ID) FROM recibo_provisional_detalle WHERE RPDE_IDDOC = :ID AND RPDE_TIPODOC = :TIPO and RPDE_ANULADO = 'N' INTO :recprov_id;
            if (recprov_id is null) then
                reciprov = 'N';
            ELSE
                reciprov = 'S';
            if (FECHA > FEC) then
                DTOF = 0;
            if (DTOF IS NULL) then
                DTOF = 0;
            if (DTOF <> 0) then
                BEGIN
                SELECT SUM(RCDE_DTOF) FROM RECIBOS_CAJA_DETALLE WHERE RCDE_IDDOC = :ID AND RCDE_TIPODOC = :TIPO INTO :DTOAPL;
                if (DTOAPL IS NULL) then
                    DTOAPL = 0;
                DTOF = DTOF - DTOAPL;
                END

            if (RTIVA IS NULL) then
                RTIVA = 0;
            if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) THEN
                BEGIN
                if (RTIVA > 0) then
                    RTIVA = 0;
                END
            ELSE
                BEGIN
                if (RTIVA < 0) then
                    RTIVA = 0;
                END

            if (RTICA IS NULL) then
                RTICA = 0;
            if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) THEN
                BEGIN
                if (RTICA > 0) then
                    RTICA = 0;
                END
            ELSE
                BEGIN
                if (RTICA < 0) then
                    RTICA = 0;
                END

            /* SI TIENE NOTA AGREGUELA */
            SELECT MAX(NOCL_ID) FROM NOTAS_CLIENTES WHERE TERC_NIT = :NIT AND CLSU_COD = :SUCURSAL AND NOCL_TIPODOC = :TIPO AND NOCL_IDDOC = :ID INTO :IDNOTA;
            if (IDNOTA IS NOT NULL) then
                SELECT NOCL_TEXTO FROM NOTAS_CLIENTES WHERE NOCL_ID = :IDNOTA INTO :NOTA;
            else
                NOTA = '';
            SUSPEND;
            END
        end
ELSE
    FOR SELECT MAX(SDCA_TIPOREF), MAX(SDCA_IDREF), sum(SDCA_MONTO-SDCA_ABONO-SDCA_ABRTIVA-SDCA_ABRTICA), SUM(SDCA_RTFTE - SDCA_ABRTFTE), SUM(SDCA_RTIVA - SDCA_ABRTIVA), SUM(SDCA_RTICA - SDCA_ABRTICA)
        FROM saldos_doc_cartera WHERE (TERC_NIT = :nit) AND (SDCA_FECHA <= :FECHA) AND (SDCA_FECHA >= :FAUTORET) group by sdca_tiporef, sdca_idref
        INTO :TIPO, :ID, :SALDO, :RTFTE, :RTIVA, :RTICA
        DO
        begin
        if (SALDO <> 0) then
            BEGIN
            SELECT MVCL_FECHA, MVCL_VENCE, MVCL_PREFREF, MVCL_NUMREF, MVCL_CONC
              FROM MOVIMIENTO_CLIENTES WHERE TERC_NIT = :NIT AND mvcl_sucursal = :sucursal and MVCL_FECHA <= :FECHA AND MVCL_ABONO = 'N' and mvcl_tiporef = :tipo and mvcl_idref = :id
              INTO :FECDOC, :VENCE, :PREFIJO, :NUMERO, :CONCEPTO;
            DIAS = (FECHA -VENCE );
            SELECT TIDO_NOMCORTO FROM TIPO_DOCUMENTO WHERE TIDO_COD = :TIPO INTO :TIPONOM;
            if (TIPO = 41) then
                SELECT NDCL_DTOFMONTO, NDCL_FECHADTO FROM NOTAS_DEBITO_CLIENTES WHERE NDCL_ID = :ID INTO :DTOF, :FEC;
            if (TIPO = 42) then
                SELECT 0, NCCL_FECHA FROM NOTAS_CREDITO_CLIENTES WHERE NCCL_ID = :ID INTO :DTOF, :FEC;
            if (TIPO = 45) then
                SELECT ANCL_DTOFMONTO, ANCL_DTOFECHA FROM ANTICIPOS_CLIENTE WHERE ANCL_ID = :ID INTO :DTOF, :FEC;
            if (TIPO = 31) then
                SELECT FACT_DTOFMONTO, FACT_DTOFFECHA FROM FACTURAS WHERE FACT_ID = :ID INTO :DTOF, :FEC;
            if (TIPO = 33) then
                SELECT 0, :FECHA FROM devoluciones_ventas WHERE DEVT_ID = :ID INTO :DTOF, :FEC;

            recprov_id = 0;
            SELECT max(RCPR_ID) FROM recibo_provisional_detalle WHERE RPDE_IDDOC = :ID AND RPDE_TIPODOC = :TIPO and RPDE_ANULADO = 'N' INTO :recprov_id;
            if (recprov_id is null) then
                reciprov = 'N';
            ELSE
                reciprov = 'S';
            if (FECHA > FEC) then
                DTOF = 0;
            if (DTOF IS NULL) then
                DTOF = 0;
            if (DTOF <> 0) then
                BEGIN
                SELECT SUM(RCDE_DTOF) FROM RECIBOS_CAJA_DETALLE WHERE RCDE_IDDOC = :ID AND RCDE_TIPODOC = :TIPO INTO :DTOAPL;
                if (DTOAPL IS NULL) then
                    DTOAPL = 0;
                DTOF = DTOF - DTOAPL;
                END

            if (RTIVA IS NULL) then
                RTIVA = 0;
            if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) THEN
                BEGIN
                if (RTIVA > 0) then
                    RTIVA = 0;
                END
            ELSE
                BEGIN
                if (RTIVA < 0) then
                    RTIVA = 0;
                END

            if (RTICA IS NULL) then
                RTICA = 0;
            if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) THEN
                BEGIN
                if (RTICA > 0) then
                    RTICA = 0;
                END
            ELSE
                BEGIN
                if (RTICA < 0) then
                    RTICA = 0;
                END

            /* SI TIENE NOTA AGREGUELA */
            SELECT MAX(NOCL_ID) FROM NOTAS_CLIENTES WHERE TERC_NIT = :NIT AND CLSU_COD = :SUCURSAL AND NOCL_TIPODOC = :TIPO AND NOCL_IDDOC = :ID INTO :IDNOTA;
            if (IDNOTA IS NOT NULL) then
                SELECT NOCL_TEXTO FROM NOTAS_CLIENTES WHERE NOCL_ID = :IDNOTA INTO :NOTA;
            else
                NOTA = '';
            SUSPEND;
            END
        end
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER PROCEDURE REP_CARTERA_CLIENTES(
    DESDE VARCHAR(20),
    HASTA VARCHAR(20),
    GRPINI VARCHAR(5),
    GRPFIN VARCHAR(5),
    FECHA DATE,
    ORDEN CHAR(1),
    AGRUPA CHAR(1),
    SUBEMPRESA INTEGER,
    GRUPCART INTEGER)
RETURNS (
    NIT VARCHAR(20),
    NOMBRE VARCHAR(60),
    DIR VARCHAR(60),
    TELEFONO VARCHAR(40),
    CIUDAD VARCHAR(40),
    CONTACTO VARCHAR(60),
    EMAIL VARCHAR(100),
    FAX VARCHAR(25),
    CEL VARCHAR(25),
    CODCLI VARCHAR(20),
    CODZONA VARCHAR(2),
    NOMZONA VARCHAR(60),
    CODCOBR INTEGER,
    NOMCOBR VARCHAR(60),
    SUCURSAL VARCHAR(10),
    NOMSUC VARCHAR(60),
    DV CHAR(1),
    CODCIUD CHAR(5),
    NOMCIUD VARCHAR(60),
    TIPO INTEGER,
    ID INTEGER,
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(6),
    CONCEPTO VARCHAR(60),
    SALDO NUMERIC(18,2),
    PROVISIONAL NUMERIC(18,2),
    RTFTE NUMERIC(18,2),
    RTIVA NUMERIC(18,2),
    RTICA NUMERIC(18,2),
    DTOF NUMERIC(18,2),
    TIPONOM VARCHAR(8),
    FECDOC DATE,
    VENCE DATE,
    DIAS INTEGER,
    CUPO NUMERIC(18,2),
    DISPONIBLE NUMERIC(18,2),
    NOTA VARCHAR(256),
    OBS BLOB SUB_TYPE 0 SEGMENT SIZE 80,
    GRUPCOD INTEGER,
    GRUPNOM VARCHAR(30))
AS
DECLARE VARIABLE NITINI VARCHAR(20);
DECLARE VARIABLE NITFIN VARCHAR(20);
DECLARE VARIABLE NOMINI VARCHAR(20);
DECLARE VARIABLE NOMFIN VARCHAR(20);
DECLARE VARIABLE OK CHAR(1);
DECLARE VARIABLE FOV CHAR(11);
DECLARE VARIABLE DTOAPL NUMERIC(18,2);
DECLARE VARIABLE FECDTO DATE;
DECLARE VARIABLE FECNOTA VARCHAR(10);
DECLARE VARIABLE AUXNOTA VARCHAR(256);
DECLARE VARIABLE IDNOTA INTEGER;
declare variable descnt_prov char(2);
declare variable AUTORET VARCHAR(10);
declare variable FAUTORET DATE;
declare variable INCLANTI CHAR(2);
BEGIN
if (ORDEN = 'C') then
    BEGIN
    NITINI = DESDE;
    NITFIN = HASTA;
    NOMINI = '';
    NOMFIN = 'zz';
    END
ELSE
    BEGIN
    NOMINI = DESDE;
    NOMFIN = HASTA;
    NITINI = '';
    NITFIN = 'zz';
    END
  EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'DESCONTAR RECIBOS PROVISIONALES EN INFORMES DE CARTERA') RETURNING_VALUES (:descnt_prov);
  EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'INCLUIR ANTICIPOS DE CLIENTES EN REPORTES Y CONSULTAS DE CARTERA') returning_values (INCLANTI);
  EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'FECHA AUTORETENEDOR NO DESCONTAR RETENCIONES DEL SALDO PERO SI CONTABILIZARLAS') returning_values (AUTORET);
  if (AUTORET <> '') then
    FAUTORET = CAST(AUTORET AS DATE);
  else
    FAUTORET = '9999/12/31';
  /* Ubique el NIT */
  FOR select C.TERC_NIT, TERC_NOM, TERC_DV, CLSU_DIR, CLSU_TEL, CLSU_CIUDAD, S.COBR_COD, S.ZONA_COD, T.CIUD_COD, CLIE_CUPO, CLCU_COD, CLSU_NOMBRE, t.terc_obs, C.GRCA_COD, TERC_CONTACTO, TERC_EMAIL, TERC_FAX, TERC_CEL, CLIE_COD
    from terceros T, CLIENTES C, CLIENTE_SUCURSALES S
    where C.TERC_NIT = T.TERC_NIT AND TERC_CLIE = 'S' AND S.TERC_NIT = C.TERC_NIT AND C.TERC_NIT >= :NITINI AND C.TERC_NIT <= :NITFIN AND
        TERC_NOM >= :NOMINI AND TERC_NOM <= :NOMFIN AND ((:GRUPCART = 0) or (C.GRCA_COD = :GRUPCART))
    INTO :NIT, :NOMBRE, :DV, :DIR, :TELEFONO, :CIUDAD, :CODCOBR, :CODZONA, :CODCIUD, :CUPO, :SUCURSAL, :NOMSUC, :obs, :GRUPCOD, :CONTACTO, :EMAIL, :FAX, :CEL, :CODCLI
    DO  
    BEGIN
    if (CODCOBR IS NOT NULL) then
        SELECT COBR_NOM FROM COBRADORES  WHERE COBR_COD = :CODCOBR INTO :NOMCOBR;
    if (CODZONA IS NOT NULL) then
        SELECT ZONA_NOM FROM ZONAS WHERE ZONA_COD = :CODZONA INTO :NOMZONA;
    if (CODCIUD IS NOT NULL) then
        SELECT CIUD_NOM FROM CIUDADES  WHERE CIUD_COD = :CODCIUD INTO :NOMCIUD;
    SELECT GRCA_NOMBRE FROM GRUPO_CARTERA WHERE GRCA_COD = :GRUPCOD INTO :GRUPNOM;
    DISPONIBLE = CUPO;
    OK = 'N';
    if (AGRUPA = 'Z') then
        BEGIN
        if (GRPINI = '') then
            BEGIN
            if ((CODZONA IS NULL) or (CODZONA >= :GRPINI AND CODZONA <= :GRPFIN)) then
                OK = 'S';
            END
        ELSE
            if (CODZONA >= :GRPINI AND CODZONA <= :GRPFIN) then
                OK = 'S';
        END
    if (AGRUPA = 'I') then
        BEGIN
        if (GRPINI = '') then
            BEGIN
            if ((CODCIUD IS NULL) or (CODCIUD >= :GRPINI AND CODCIUD <= :GRPFIN)) then
                OK = 'S';
            END
        ELSE
            if (CODCIUD >= :GRPINI AND CODCIUD <= :GRPFIN) then
                OK = 'S';
        END
    if (AGRUPA = 'N') then
        OK = 'S';
        
    if (OK = 'S') then
        BEGIN
        /* BUSQUE EN SALDOS_DOC_CARTERA LOS QUE TENGAN SALDO > 0 */
        FOR SELECT MVCL_TIPOREF, MVCL_IDREF, MVCL_PREFREF, MVCL_NUMREF, MVCL_FECHA, MVCL_VENCE, MVCL_CONC
            FROM MOVIMIENTO_CLIENTES WHERE TERC_NIT = :NIT AND MVCL_SUCURSAL = :SUCURSAL AND MVCL_FECHA <= :FECHA AND
            MVCL_ABONO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            INTO :TIPO, :ID, :PREFIJO, :NUMERO, :FECDOC, :VENCE, :CONCEPTO
            DO
            BEGIN
            if ((inclanti = 'SI') or (TIPO <> 45)) then
                BEGIN
                EXECUTE PROCEDURE saldo_doc_cartera(TIPO, ID, FECHA) returning_values (SALDO);
                if (SALDO <> 0) then
                    BEGIN
                    PROVISIONAL = 0;
                    EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'ANALISIS DE CARTERA CON FECHA FACTURA O VENCIMIENTO') RETURNING_VALUES (FOV);
                    if (FOV = 'FECHA') then
                       DIAS = FECHA - FECDOC;
                    ELSE
                      DIAS = FECHA - VENCE;
                    DISPONIBLE = DISPONIBLE - SALDO;
                    SELECT TIDO_NOMCORTO FROM TIPO_DOCUMENTO WHERE TIDO_COD = :TIPO INTO :TIPONOM;
                    if (TIPO = 41) then
                        SELECT NDCL_DTOFMONTO, NDCL_FECHADTO FROM NOTAS_DEBITO_CLIENTES WHERE NDCL_ID = :ID INTO :DTOF, :FECDTO;
                    if (TIPO = 42) then
                        SELECT 0, :FECDOC FROM NOTAS_CREDITO_CLIENTES WHERE NCCL_ID = :ID INTO :DTOF, :FECDTO;
                    if (TIPO = 45) then
                        SELECT ANCL_DTOFMONTO, ANCL_DTOFECHA FROM ANTICIPOS_CLIENTE WHERE ANCL_ID = :ID INTO :DTOF, :FECDTO;
                    if (TIPO = 31) then
                        SELECT FACT_DTOFMONTO, FACT_DTOFFECHA FROM FACTURAS WHERE FACT_ID = :ID INTO :DTOF, :FECDTO;
                    if (TIPO = 33) then
                        SELECT 0, :FECDOC FROM devoluciones_ventas WHERE DEVT_ID = :ID INTO :DTOF, :FECDTO;
                    if (DTOF IS NULL) then
                        DTOF = 0;
                    if (DTOF <> 0) then
                        BEGIN
                        SELECT SUM(RCDE_DTOF) FROM RECIBOS_CAJA_DETALLE WHERE RCDE_IDDOC = :ID AND RCDE_TIPODOC = :TIPO INTO :DTOAPL;
                        if (DTOAPL IS NULL) then
                            DTOAPL = 0;
                        DTOF = DTOF - DTOAPL;
                        /* SI YA SE VENCIO DEJELO EN CERO */
                        if (FECDTO < FECHA) then
                            DTOF = 0;
                        END
                    SELECT SUM(SDCA_RTFTE - SDCA_ABRTFTE), SUM(SDCA_RTIVA - SDCA_ABRTIVA), SUM(SDCA_RTICA - SDCA_ABRTICA)
                        FROM SALDOS_DOC_CARTERA WHERE SDCA_TIPOREF = :TIPO AND SDCA_IDREF = :ID INTO :RTFTE, :RTIVA, :RTICA;
                    if (RTFTE IS NULL) then
                        RTFTE = 0;
                    if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) THEN
                        BEGIN
                        if (RTFTE > 0) then
                            RTFTE = 0;
                        END
                    ELSE
                        BEGIN
                        if (RTFTE < 0) then
                            RTFTE = 0;
                        END
                    if (RTIVA IS NULL) then
                        RTIVA = 0;
                    if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) THEN
                        BEGIN
                        if (RTIVA > 0) then
                            RTIVA = 0;
                        END
                    ELSE
                        BEGIN
                        if (RTIVA < 0) then
                            RTIVA = 0;
                        END
                    if (RTICA IS NULL) then
                        RTICA = 0;
                    if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) THEN
                        BEGIN
                        if (RTICA > 0) then
                            RTICA = 0;
                        END
                    ELSE
                        BEGIN
                        if (RTICA < 0) then
                            RTICA = 0;
                        END
                    if (FAUTORET <= FECDOC) then
                        RTFTE = 0;
                    /* SI TIENE NOTA AGREGUELA */
                    SELECT MAX(NOCL_ID) FROM NOTAS_CLIENTES WHERE TERC_NIT = :NIT AND CLSU_COD = :SUCURSAL AND NOCL_TIPODOC = :TIPO AND NOCL_IDDOC = :ID INTO :IDNOTA;
                    if (IDNOTA IS NOT NULL) then
                        BEGIN
                        SELECT cast(NOCL_FECHA as char(10)), NOCL_TEXTO FROM NOTAS_CLIENTES
                            WHERE NOCL_ID = :IDNOTA INTO :FECNOTA, :AUXNOTA;
                        if (STRLEN(AUXNOTA) < 244) then
                            NOTA = FECNOTA || ':' || AUXNOTA;
                        ELSE
                            NOTA = AUXNOTA;
                        END
                    else
                        NOTA = '';
                    SUSPEND;
                    END /* SALDO <> 0 */
                END /* NO ANTICIPO */
            END /* FOR */
        /* AGREGUE LOS RECIBOS PROVISIONALES CON SIGNO NEGATIVO */
        FOR SELECT 65, MAX(P.RCPR_ID), MAX(PREF_PRE), MAX(RCPR_NUMERO), MAX(RCPR_FECHA), MAX(RCPR_CONC), SUM(RPDE_ABONO * -1), SUM(RPDE_RTFTE*-1), SUM(RPDE_RTIVA*-1), SUM(RPDE_RTICA*-1)
            FROM RECIBO_PROVISIONAL P, recibo_provisional_detalle D
            WHERE P.rcpr_id = D.rcpr_id AND P.TERC_NIT = :NIT AND RCPR_FECHA <= :FECHA AND RCPR_ANULADO = 'N' AND
            ((RCPR_FECCRUCE IS NULL) or (RCPR_FECCRUCE > :FECHA)) AND RPDE_SUCURSAL = :SUCURSAL AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY P.rcpr_id
            INTO :TIPO, :ID, :PREFIJO, :NUMERO, :FECDOC, :CONCEPTO, :PROVISIONAL, :rtfte,  :RTIVA, :RTICA
            DO
            BEGIN
            if (:descnt_prov = 'NO') then
              SALDO = 0;
            else
              SALDO = :PROVISIONAL;
            SELECT TIDO_NOMCORTO FROM TIPO_DOCUMENTO WHERE TIDO_COD = :TIPO INTO :TIPONOM;
            /* CALCULE EL VENCIMIENTO DEL ULTIMO DOCUMENTO POSFECHADO */
            SELECT MAX(RPPA_FECHA) FROM recibo_provisional_pago WHERE RCPR_ID = :ID INTO :VENCE;
            DIAS = VENCE - FECHA;
            SUSPEND;
            END
        END
    if (AGRUPA = 'C') then
        BEGIN
        FOR SELECT DISTINCT COBR_COD FROM MOVIMIENTO_CLIENTES
            WHERE TERC_NIT = :NIT AND MVCL_SUCURSAL = :SUCURSAL AND MVCL_FECHA <= :FECHA AND
            MVCL_ABONO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            INTO :codcobr
            DO
            BEGIN
            OK = 'N';
            if (GRPINI = '') then
                BEGIN
                if ((CODCOBR IS NULL) or (CODCOBR >= :GRPINI AND CODCOBR <= :GRPFIN)) then
                    OK = 'S';
                END
            ELSE
                if (CODCOBR >= :GRPINI AND CODCOBR <= :GRPFIN) then
                    OK = 'S';
            if (OK = 'S') then
                BEGIN
                SELECT COBR_NOM FROM COBRADORES  WHERE COBR_COD = :CODCOBR INTO :NOMCOBR;
                /* BUSQUE EN SALDOS_DOC_CARTERA LOS QUE TENGAN SALDO > 0 */
                FOR SELECT MVCL_TIPOREF, MVCL_IDREF, MVCL_PREFREF, MVCL_NUMREF, MVCL_FECHA, MVCL_VENCE, MVCL_CONC
                    FROM MOVIMIENTO_CLIENTES WHERE TERC_NIT = :NIT AND MVCL_SUCURSAL = :SUCURSAL AND MVCL_FECHA <= :FECHA AND
                    MVCL_ABONO = 'N' AND COBR_COD = :codcobr AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                    INTO :TIPO, :ID, :PREFIJO, :NUMERO, :FECDOC, :VENCE, :CONCEPTO
                    DO
                    BEGIN
                    if ((inclanti = 'SI') or (TIPO <> 45)) then
                        BEGIN
                        EXECUTE PROCEDURE saldo_doc_cartera(TIPO, ID, FECHA) returning_values (SALDO);
                        if (SALDO <> 0) then
                            BEGIN
                            PROVISIONAL = 0;
                            EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'ANALISIS DE CARTERA CON FECHA FACTURA O VENCIMIENTO') RETURNING_VALUES (FOV);
                            if (FOV = 'FECHA') then
                               DIAS = FECHA - FECDOC;
                            ELSE
                              DIAS = FECHA - VENCE;
                            DISPONIBLE = DISPONIBLE - SALDO;
                            SELECT TIDO_NOMCORTO FROM TIPO_DOCUMENTO WHERE TIDO_COD = :TIPO INTO :TIPONOM;
                            if (TIPO = 41) then
                                SELECT NDCL_DTOFMONTO, NDCL_FECHADTO FROM NOTAS_DEBITO_CLIENTES WHERE NDCL_ID = :ID INTO :DTOF, :FECDTO;
                            if (TIPO = 42) then
                                SELECT 0, :FECDOC FROM NOTAS_CREDITO_CLIENTES WHERE NCCL_ID = :ID INTO :DTOF, :FECDTO;
                            if (TIPO = 45) then
                                SELECT ANCL_DTOFMONTO, ANCL_DTOFECHA FROM ANTICIPOS_CLIENTE WHERE ANCL_ID = :ID INTO :DTOF, :FECDTO;
                            if (TIPO = 31) then
                                SELECT FACT_DTOFMONTO, FACT_DTOFFECHA FROM FACTURAS WHERE FACT_ID = :ID INTO :DTOF, :FECDTO;
                            if (TIPO = 33) then
                                SELECT 0, :FECDOC FROM devoluciones_ventas WHERE DEVT_ID = :ID INTO :DTOF, :FECDTO;
                            if (DTOF IS NULL) then
                                DTOF = 0;
                            if (DTOF <> 0) then
                                BEGIN
                                SELECT SUM(RCDE_DTOF) FROM RECIBOS_CAJA_DETALLE WHERE RCDE_IDDOC = :ID AND RCDE_TIPODOC = :TIPO INTO :DTOAPL;
                                if (DTOAPL IS NULL) then
                                    DTOAPL = 0;
                                DTOF = DTOF - DTOAPL;
                                /* SI YA SE VENCIO DEJELO EN CERO */
                                if (FECDTO < FECHA) then
                                    DTOF = 0;
                                END
                            SELECT SUM(SDCA_RTFTE - SDCA_ABRTFTE), SUM(SDCA_RTIVA - SDCA_ABRTIVA), SUM(SDCA_RTICA - SDCA_ABRTICA)
                                FROM SALDOS_DOC_CARTERA WHERE SDCA_TIPOREF = :TIPO AND SDCA_IDREF = :ID INTO :RTFTE, :RTIVA, :RTICA;
                            if (RTFTE IS NULL) then
                                RTFTE = 0;
                            if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) THEN
                                BEGIN
                                if (RTFTE > 0) then
                                    RTFTE = 0;
                                END
                            ELSE
                                BEGIN
                                if (RTFTE < 0) then
                                    RTFTE = 0;
                                END
                            if (FAUTORET <= FECDOC) then
                                RTFTE = 0;
                            if (RTIVA IS NULL) then
                                RTIVA = 0;
                            if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) THEN
                                BEGIN
                                if (RTIVA > 0) then
                                    RTIVA = 0;
                                END
                            ELSE
                                BEGIN
                                if (RTIVA < 0) then
                                    RTIVA = 0;
                                END
                            if (RTICA IS NULL) then
                                RTICA = 0;
                            if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) THEN
                                BEGIN
                                if (RTICA > 0) then
                                    RTICA = 0;
                                END
                            ELSE
                                BEGIN
                                if (RTICA < 0) then
                                    RTICA = 0;
                                END
                            /* SI TIENE NOTA AGREGUELA */
                            SELECT MAX(NOCL_FECHA) FROM NOTAS_CLIENTES WHERE TERC_NIT = :NIT AND CLSU_COD = :SUCURSAL AND NOCL_TIPODOC = :TIPO AND NOCL_IDDOC = :ID INTO :FECDTO;
                            if (FECDTO IS NOT NULL) then
                                BEGIN
                                SELECT cast(NOCL_FECHA as char(10)), NOCL_TEXTO FROM NOTAS_CLIENTES
                                    WHERE NOCL_ID = :IDNOTA INTO :FECNOTA, :AUXNOTA;
                                if (STRLEN(AUXNOTA) < 244) then
                                    NOTA = FECNOTA || ':' || AUXNOTA;
                                ELSE
                                    NOTA = AUXNOTA;
                                END
                            else
                                NOTA = '';
                            SUSPEND;
                            END /* SALDO <> 0 */
                        END /* NO ANTICIPO */
                    END /* FOR */
                /* AGREGUE LOS RECIBOS PROVISIONALES CON SIGNO NEGATIVO */
                FOR SELECT 65, MAX(P.RCPR_ID), MAX(PREF_PRE), MAX(RCPR_NUMERO), MAX(RCPR_FECHA), MAX(RCPR_CONC), SUM(RPDE_ABONO * -1), SUM(RPDE_RTFTE*-1), SUM(RPDE_RTIVA*-1), SUM(RPDE_RTICA*-1)
                    FROM RECIBO_PROVISIONAL P, recibo_provisional_detalle D
                    WHERE P.rcpr_id = D.rcpr_id AND P.TERC_NIT = :NIT AND P.VEND_COD = :codcobr AND RCPR_FECHA <= :FECHA AND RCPR_ANULADO = 'N' AND
                    ((RCPR_FECCRUCE IS NULL) or (RCPR_FECCRUCE > :FECHA)) AND RPDE_SUCURSAL = :SUCURSAL AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                    GROUP BY P.rcpr_id
                    INTO :TIPO, :ID, :PREFIJO, :NUMERO, :FECDOC, :CONCEPTO, :PROVISIONAL, :rtfte,  :RTIVA, :RTICA
                    DO
                    BEGIN
                    if (:descnt_prov = 'NO') then
                      SALDO = 0;
                    else
                      SALDO = :PROVISIONAL;
                    SELECT TIDO_NOMCORTO FROM TIPO_DOCUMENTO WHERE TIDO_COD = :TIPO INTO :TIPONOM;
                    /* CALCULE EL VENCIMIENTO DEL ULTIMO DOCUMENTO POSFECHADO */
                    SELECT MAX(RPPA_FECHA) FROM recibo_provisional_pago WHERE RCPR_ID = :ID INTO :VENCE;
                    DIAS = VENCE - FECHA;
                    SUSPEND;
                    END
                END /* ok */
            END /* FOR COBR */
        END /* AGRUPA = C */
    END /* FOR NIT */
END
^

SET TERM ; ^


/* 20080916: FALTABA NUMERO DE EGRESO Y NIT EN RETIROS */
SET TERM ^ ;

CREATE OR ALTER TRIGGER EGRESOS_BANCO_AI FOR EGRESOS_BANCO
ACTIVE AFTER INSERT POSITION 0
AS
declare variable GMFPORC NUMERIC(5,2);
declare variable GMFMONTO NUMERIC(18,2);
declare variable egrenumero varchar(10);
declare variable nit varchar(20);
BEGIN
  /* REGISTRE EL MOVIMIENTO DEL BANCO */
  if ((NEW.EGRE_ID <> 0) and (new.egbc_anulado = 'N')) then
    BEGIN
    /* BUSQUE EL GMF DE LA CUENTA */
    if (NEW.EGBC_GMF = 'S') then
        BEGIN
        SELECT CUBA_GMFPOR FROM CUENTAS_BANCO WHERE CUBA_COD = NEW.CUBA_COD INTO :GMFPORC;
        if (GMFPORC IS NULL) then
            GMFPORC = 0;
        END
    ELSE
        GMFPORC = 0;
    GMFMONTO = FLOOR(NEW.EGBC_MONTO * GMFPORC / 1000);
    select pref_pre||egre_numero,terc_nit from egresos where egre_id = new.egre_id into :egrenumero, :nit;

    if (NEW.EGBC_TIPOBCO = 72) then
        BEGIN
        /* CHEQUE */
        INSERT INTO CHEQUES (CHEQ_ID, CUBA_COD, PRBA_PREF, CHEQ_NUMERO, CHEQ_FECHA, CHEQ_IDEGRESO, CHEQ_CONCEPTO, CHEQ_BENEF, CHEQ_MONTO, CHEQ_GMFPORC, CHEQ_GMFMONTO, CHEQ_ANULADO, CHEQ_TRANSMIT,CHEQ_EGRESO,TERC_NIT)
            VALUES (GEN_ID(ID_CHEQUES, 1), NEW.CUBA_COD, NEW.PRBA_PREF, NEW.EGBC_NUMERO, NEW.EGBC_FECHA, NEW.EGRE_ID, NEW.EGBC_CONCEPTO, NEW.EGBC_BENEF, NEW.EGBC_MONTO, :GMFPORC, :GMFMONTO, 'N', 'N',:egrenumero, :NIT);
        END
    if (NEW.EGBC_TIPOBCO = 73) then
        BEGIN
        /* RETIRO */
        INSERT INTO RETIROS (RETI_ID, CUBA_COD, PRBA_PREF, RETI_NUMERO, RETI_FECHA, RETI_IDEGRESO, RETI_CONCEPTO, RETI_BENEF, RETI_MONTO, RETI_GMFPORC, RETI_GMFMONTO, RETI_ANULADO, RETI_TRANSMIT,RETI_EGRESO,TERC_NIT)
            VALUES (GEN_ID(id_retiros, 1), NEW.CUBA_COD, NEW.PRBA_PREF, NEW.EGBC_NUMERO, NEW.EGBC_FECHA, NEW.EGRE_ID, NEW.EGBC_CONCEPTO, NEW.EGBC_BENEF, NEW.EGBC_MONTO, :GMFPORC, :GMFMONTO, 'N', 'N',:egrenumero, :NIT);
        END
    END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER EGRESOS_BANCO_AU FOR EGRESOS_BANCO
ACTIVE AFTER UPDATE POSITION 0
AS
declare variable GMFPORC NUMERIC(5,2);
declare variable GMFMONTO NUMERIC(18,2);
declare variable egrenumero varchar(10);
declare variable nit varchar(20);
BEGIN
if (NEW.egbc_anulado = 'S') then
  begin
    if (OLD.EGBC_TIPOBCO = 72) then
        UPDATE CHEQUES SET CHEQ_ANULADO = 'S' WHERE CHEQ_IDEGRESO = OLD.EGRE_ID;
    if (OLD.EGBC_TIPOBCO = 73) then
        UPDATE RETIROS SET RETI_ANULADO = 'S' WHERE RETI_IDEGRESO = OLD.EGRE_ID;
  end
ELSE
    BEGIN
    /* BORRE EL ANTERIOR */
    if ((OLD.EGRE_ID <> 0) AND (OLD.egbc_anulado = 'N')) then
        BEGIN
        if (OLD.EGBC_TIPOBCO = 72) then
            DELETE FROM CHEQUES WHERE CHEQ_IDEGRESO = OLD.EGRE_ID;
        if (OLD.EGBC_TIPOBCO = 73) then
            DELETE FROM RETIROS WHERE RETI_IDEGRESO = OLD.EGRE_ID;
        END
    /* REGISTRE EL MOVIMIENTO DEL BANCO */
    if ((NEW.EGRE_ID <> 0) AND (NEW.egbc_anulado = 'N')) then
        BEGIN
        if (NEW.EGBC_GMF = 'S') then
            BEGIN
            /* BUSQUE EL GMF DE LA CUENTA */
            SELECT CUBA_GMFPOR FROM CUENTAS_BANCO WHERE CUBA_COD = NEW.CUBA_COD INTO :GMFPORC;
            if (GMFPORC IS NULL) then
                GMFPORC = 0;
            END
        ELSE
            GMFPORC = 0;
        GMFMONTO = FLOOR(NEW.EGBC_MONTO * GMFPORC / 1000);
        select pref_pre||egre_numero,terc_nit from egresos where egre_id = new.egre_id into :egrenumero, :nit;
        if (NEW.EGBC_TIPOBCO = 72) then
            BEGIN
            /* CHEQUE */
            INSERT INTO CHEQUES (CHEQ_ID, CUBA_COD, PRBA_PREF, CHEQ_NUMERO, CHEQ_FECHA, CHEQ_IDEGRESO, CHEQ_CONCEPTO, CHEQ_BENEF, CHEQ_MONTO, CHEQ_GMFPORC, CHEQ_GMFMONTO, CHEQ_ANULADO, CHEQ_TRANSMIT,CHEQ_EGRESO,TERC_NIT)
                VALUES (GEN_ID(ID_CHEQUES, 1), NEW.CUBA_COD, NEW.PRBA_PREF, NEW.EGBC_NUMERO, NEW.EGBC_FECHA, NEW.EGRE_ID, NEW.EGBC_CONCEPTO, NEW.EGBC_BENEF, NEW.EGBC_MONTO, :GMFPORC, :GMFMONTO, 'N', 'N',:egrenumero, :NIT);
            END
        if (NEW.EGBC_TIPOBCO = 73) then
            BEGIN
            /* RETIRO */
            INSERT INTO RETIROS (RETI_ID, CUBA_COD, PRBA_PREF, RETI_NUMERO, RETI_FECHA, RETI_IDEGRESO, RETI_CONCEPTO, RETI_BENEF, RETI_MONTO, RETI_GMFPORC, RETI_GMFMONTO, RETI_ANULADO, RETI_TRANSMIT,RETI_EGRESO,TERC_NIT)
                VALUES (GEN_ID(id_retiros, 1), NEW.CUBA_COD, NEW.PRBA_PREF, NEW.EGBC_NUMERO, NEW.EGBC_FECHA, NEW.EGRE_ID, NEW.EGBC_CONCEPTO, NEW.EGBC_BENEF, NEW.EGBC_MONTO, :GMFPORC, :GMFMONTO, 'N', 'N',:egrenumero, :NIT);
            END
        END
    END
END
^

SET TERM ; ^


/* 20080917: zonanom muy pequeño ocasionaba string truncation */

SET TERM ^ ;

CREATE OR ALTER PROCEDURE IMPR_FACTCOMP(
    ID INTEGER)
RETURNS (
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    VENCE DATE,
    DIASVENCE INTEGER,
    NIT VARCHAR(20),
    NOMTERCERO VARCHAR(60),
    SIMPLIFICADO VARCHAR(15),
    CODBODEGA VARCHAR(2),
    NOMBODEGA VARCHAR(30),
    NUMPROV VARCHAR(10),
    COTIZACION VARCHAR(30),
    PEDIDO VARCHAR(30),
    REMISION VARCHAR(30),
    SUBTOTAL NUMERIC(18,2),
    DTOPORC NUMERIC(9,2),
    DTOMONTO NUMERIC(18,2),
    ADICIONAL NUMERIC(18,2),
    IVAMONTO NUMERIC(18,2),
    RTEFTEPORC NUMERIC(9,2),
    RTEFTEMONTO NUMERIC(18,2),
    RTEIVAPORC NUMERIC(9,2),
    RTEIVAMONTO NUMERIC(18,2),
    RTEICAPORC NUMERIC(9,2),
    RTEICAMONTO NUMERIC(18,2),
    EXTRA NUMERIC(18,2),
    DTOFPORC NUMERIC(9,2),
    DTOFMONTO NUMERIC(18,2),
    FECHADTO DATE,
    TOTALFAC NUMERIC(18,2),
    TOTALPAGAR NUMERIC(18,2),
    OBS BLOB SUB_TYPE 1 SEGMENT SIZE 80,
    ITEM INTEGER,
    ARTICULO VARCHAR(15),
    CODBAR VARCHAR(15),
    ARTIDES VARCHAR(60),
    ARTIPROV VARCHAR(15),
    CANT NUMERIC(18,4),
    LOTE VARCHAR(15),
    UNIDAD VARCHAR(8),
    REFITEM VARCHAR(60),
    BODITEM VARCHAR(2),
    PRUNIT NUMERIC(18,2),
    DTOITPORC NUMERIC(9,2),
    DTOITMONTO NUMERIC(18,2),
    PRNETO NUMERIC(18,2),
    IVAPORC NUMERIC(9,2),
    IVAITMONTO NUMERIC(18,2),
    CONSUMO NUMERIC(18,2),
    SUBTOTIT NUMERIC(18,2),
    SUBTOTITCON NUMERIC(18,2),
    TOTAL NUMERIC(18,2),
    CODIGOPR VARCHAR(20),
    ZONACOD VARCHAR(2),
    ZONANOM VARCHAR(60),
    DV CHAR(1),
    DIRECCION VARCHAR(60),
    CIUDAD VARCHAR(40),
    TELEFONO VARCHAR(40),
    CONTACTO VARCHAR(60),
    FAX VARCHAR(25),
    GRUPO VARCHAR(2),
    SUBGRUPO VARCHAR(3),
    MARCA VARCHAR(3),
    PESO NUMERIC(9,4),
    ANCHO NUMERIC(18,4),
    ALTO NUMERIC(18,4),
    LARGO NUMERIC(18,4),
    SUMA1 NUMERIC(18,2),
    SUMA2 NUMERIC(18,2),
    SUMA3 NUMERIC(18,2),
    IVA1 NUMERIC(18,2),
    IVA2 NUMERIC(18,2),
    IVA3 NUMERIC(18,2),
    TOTCONSUMO NUMERIC(18,2),
    SUMAEX NUMERIC(18,2),
    SUMAGR NUMERIC(18,2))
AS
declare variable IMPTOS CHAR(1);
declare variable TARIFA INTEGER;
declare variable SIMPLIFICA CHAR(1);
declare variable orden char(2);
BEGIN
  SELECT PREF_PRE, FACO_NUMERO, FACO_FECHA, FACO_VENCE, F.BODE_COD, BODE_NOM, F.TERC_NIT, TERC_NOM, FACO_NUMPROV, FACO_COTIZACI, FACO_ORDEN, FACO_REMISION, FACO_IMPTOS,
    FACO_DTOPORC, FACO_DTOMONTO, FACO_ADICIONAL, FACO_IVAMONTO, FACO_RTFTEPORC, FACO_RTFTEMONTO, FACO_RTIVAPOR, FACO_RTIVAMONTO, FACO_RTICAPOR, FACO_RTICAMONTO,
    FACO_EXTRA, FACO_DTOFPOR, FACO_DTOFMONTO, FACO_DTOFFECHA, FACO_TOTAL, TERC_DIR, TERC_CIU, TERC_TEL, TERC_CONTACTO, TERC_FAX, TERC_DV,
    FACO_OBS, FACO_SIMPLIFICADO
    FROM FACTURAS_COMPRA F, BODEGA B, TERCEROS T
    WHERE F.BODE_COD = B.BODE_COD AND F.TERC_NIT = T.TERC_NIT AND F.FACO_ID = :ID
    into :PREF, :NUMERO, :FECHA, :VENCE, :CODBODEGA, :NOMBODEGA, :NIT, :NOMTERCERO, :NUMPROV, :COTIZACION, :PEDIDO, :REMISION, :IMPTOS,
    :DTOPORC, :DTOMONTO, :ADICIONAL, :IVAMONTO, :RTEFTEPORC, :RTEFTEMONTO, :RTEIVAPORC, :RTEIVAMONTO, :RTEICAPORC, :RTEICAMONTO, :EXTRA, :DTOFPORC, :DTOFMONTO, :FECHADTO, :TOTALFAC,
    :DIRECCION, :CIUDAD, :TELEFONO, :CONTACTO, :FAX, :DV, :OBS, :SIMPLIFICA;
    
    if (SIMPLIFICA = 'N') then
         SIMPLIFICADO = 'COMUN';
    ELSE
        SIMPLIFICADO = 'SIMPLIFICADO';

  SELECT PROV_COD, P.GRPR_COD, GRPR_NOM
    FROM PROVEEDORES P, GRUPOS_PROVEEDORES G
    WHERE TERC_NIT = :NIT AND G.GRPR_COD = P.GRPR_COD
    INTO :CODIGOPR, :ZONACOD, :ZONANOM;

  DIASVENCE = VENCE - FECHA;
  SUBTOTAL = TOTALFAC - EXTRA - IVAMONTO - ADICIONAL + DTOMONTO;
  TOTALPAGAR = TOTALFAC - RTEFTEMONTO - RTEIVAMONTO - RTEICAMONTO;
  SUMAEX = 0;
  SUMA1 = 0;
  SUMA2 = 0;
  SUMA3 = 0;
  IVA1 = 0;
  IVA2 = 0;
  IVA3 = 0;
  TOTCONSUMO = 0;

execute procedure lee_configuracion('COMPRAS', 'DOCUMENTOS', 'ORDENAR ITEMS POR BODEGA AL IMPRIMIR DOCUMENTOS') returning_values (:Orden);
if (orden = 'NO') then
  BEGIN
  FOR SELECT FCDE_ITEM, D.ARTI_COD, FCDE_CODBAR, SUBSTR(FCDE_DESC,1,60), FCDE_CANT, FCDE_UNIDAD, BODE_COD, FCDE_LOTE, FCDE_PRUNIT,
    FCDE_DTOPORC, FCDE_DTOMONTO, FCDE_IVAPORC, FCDE_IVAMONTO, FCDE_CONSUMO, FCDE_TOTAL,
    GRUP_COD, SUBG_COD, MARC_COD, ARTI_PESO, ARTI_ANCHO, ARTI_ALTO, ARTI_LARGO, TAIV_COD, FCDE_CODPROV, FCDE_REFERENCIA
    FROM FACTURAS_COMPRAS_DETALLE D, ARTICULO A
    WHERE D.ARTI_COD = A.ARTI_COD AND D.FACO_ID = :ID
    ORDER BY FCDE_ITEM
    INTO :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :BODITEM, :LOTE, :PRUNIT,
    :DTOITPORC, :DTOITMONTO, :IVAPORC, :IVAITMONTO, :CONSUMO, :TOTAL,
    :GRUPO, :SUBGRUPO, :MARCA, :PESO, :ANCHO, :ALTO, :LARGO, :TARIFA, :ARTIPROV, :REFITEM
    DO
      BEGIN
      PRNETO = PRUNIT - DTOITMONTO - ((IVAITMONTO+CONSUMO) / CANT);
      SUBTOTIT = TOTAL - IVAITMONTO - CONSUMO;
      SUBTOTITCON = TOTAL;
      TOTCONSUMO = TOTCONSUMO + CONSUMO;
      if (IVAPORC = 0) then
        SUMAEX = SUMAEX + TOTAL;
      if (TARIFA = 1) then
        BEGIN
        SUMA1 = SUMA1 + TOTAL - IVAITMONTO;
        IVA1 = IVA1 + IVAITMONTO;
        END
      if (TARIFA = 2) then
        BEGIN
        SUMA2 = SUMA2 + TOTAL - IVAITMONTO;
        IVA2 = IVA2 + IVAITMONTO;
        END
      if (TARIFA = 3) then
        BEGIN
        SUMA3 = SUMA3 + TOTAL - IVAITMONTO;
        IVA3 = IVA3 + IVAITMONTO;
        END
      SUMAGR = SUMA1 + SUMA2 + SUMA3;
      if (IMPTOS = 'N') then
        TOTAL = TOTAL - IVAITMONTO - CONSUMO;
      SUSPEND;
      END
  END
ELSE
  BEGIN
  FOR SELECT FCDE_ITEM, D.ARTI_COD, FCDE_CODBAR, SUBSTR(FCDE_DESC,1,60), FCDE_CANT, FCDE_UNIDAD, BODE_COD, FCDE_LOTE, FCDE_PRUNIT,
    FCDE_DTOPORC, FCDE_DTOMONTO, FCDE_IVAPORC, FCDE_IVAMONTO, FCDE_CONSUMO, FCDE_TOTAL,
    GRUP_COD, SUBG_COD, MARC_COD, ARTI_PESO, ARTI_ANCHO, ARTI_ALTO, ARTI_LARGO, TAIV_COD, FCDE_CODPROV, FCDE_REFERENCIA
    FROM FACTURAS_COMPRAS_DETALLE D, ARTICULO A
    WHERE D.ARTI_COD = A.ARTI_COD AND D.FACO_ID = :ID
    ORDER BY D.bode_cod, FCDE_ITEM
    INTO :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :BODITEM, :LOTE, :PRUNIT,
    :DTOITPORC, :DTOITMONTO, :IVAPORC, :IVAITMONTO, :CONSUMO, :TOTAL,
    :GRUPO, :SUBGRUPO, :MARCA, :PESO, :ANCHO, :ALTO, :LARGO, :TARIFA, :ARTIPROV, :REFITEM
    DO
      BEGIN
      PRNETO = PRUNIT - DTOITMONTO - ((IVAITMONTO+CONSUMO) / CANT);
      SUBTOTIT = TOTAL - IVAITMONTO - CONSUMO;
      SUBTOTITCON = TOTAL;
      TOTCONSUMO = TOTCONSUMO + CONSUMO;
      if (IVAPORC = 0) then
        SUMAEX = SUMAEX + TOTAL;
      if (TARIFA = 1) then
        BEGIN
        SUMA1 = SUMA1 + TOTAL - IVAITMONTO;
        IVA1 = IVA1 + IVAITMONTO;
        END
      if (TARIFA = 2) then
        BEGIN
        SUMA2 = SUMA2 + TOTAL - IVAITMONTO;
        IVA2 = IVA2 + IVAITMONTO;
        END
      if (TARIFA = 3) then
        BEGIN
        SUMA3 = SUMA3 + TOTAL - IVAITMONTO;
        IVA3 = IVA3 + IVAITMONTO;
        END
      SUMAGR = SUMA1 + SUMA2 + SUMA3;
      if (IMPTOS = 'N') then
        TOTAL = TOTAL - IVAITMONTO - CONSUMO;
      SUSPEND;
      END
  END
END
^

SET TERM ; ^



/* 20080917B: REEMPLACE LA FECHA DEL DOCUMENTO CON LA DEL SERVIDOR SI LA CONFIGURACION INHABILITAR FECHA LO INDICA */
SET TERM ^ ;

CREATE OR ALTER TRIGGER FACTURAS_BI FOR FACTURAS
ACTIVE BEFORE INSERT POSITION 0
AS
declare variable NUMERO VARCHAR(6);
declare variable AUTOM CHAR(1);
declare variable EXISTE CHAR(1);
DECLARE VARIABLE VALCUPO CHAR(10);
declare variable DISPONIBLE NUMERIC(18,2);
declare variable OK CHAR(1);
declare variable SITOT CHAR(2);
declare variable CODCOBR INTEGER;
declare variable CODVEND INTEGER;
declare variable contado char(1);
declare variable BLOQAUTO CHAR(2);
declare variable FECCONTA VARCHAR(8);
declare variable FECBLO VARCHAR(8);
declare variable FECSERVER CHAR(2);
BEGIN
EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION', 'DOCUMENTOS', 'INHABILITAR FECHA EN DOCUMENTOS') returning_values (:fecserver);
if (FECSERVER = 'SI') then
    NEW.fact_fecha = CAST ('NOW' AS DATE);
EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION', 'POS', 'CAMBIAR FECHA DE BLOQUEO AUTOMATICAMENTE AL CAMBIAR FECHA DE LA FACTURA') RETURNING_VALUES (:bloqauto);
if (bloqauto = 'SI') then
    BEGIN
    EXECUTE PROCEDURE LEE_CONFIGURACION ('CONTABILIDAD', 'GENERAL', 'FECHA DE BLOQUEO') RETURNING_VALUES (:FECBLO);
    EXECUTE PROCEDURE fecha_a_conta (NEW.fact_fecha) returning_values (:FECCONTA);
    if (FECBLO > FECCONTA) then
        EXCEPTION CONTABILIDAD_BLOQUEADA;
    if (FECBLO < FECCONTA) then
        UPDATE CONFIGURACION
            SET CONF_VALOR = :FECCONTA
            WHERE (CONF_MODULO = 'CONTABILIDAD') AND (CONF_CATEGORIA = 'GENERAL') AND (CONF_PROPIEDAD = 'FECHA DE BLOQUEO');
    END
OK = 'S';
EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'ACCION A TOMAR SI EL CUPO DE CREDITO ES INSUFICIENTE') RETURNING_VALUES (:VALCUPO);
select auto_contado from autorizaciones where pref_pre = new.pref_pre and tido_cod = 31 into :contado;
if (contado='N') then
BEGIN
  IF (VALCUPO = 'PROHIBIR') THEN
  BEGIN
  OK = 'N';
  /* VERIFIQUE EL CUPO DE CREDITO */
  execute procedure cupo_disponible(new.TERC_NIT, NEW.fact_fecha, NEW.fact_sucursal) returning_values (:DISPONIBLE);
  if (DISPONIBLE >= NEW.FACT_TOTAL) then
    OK = 'S';
  END
END
IF (OK = 'S') THEN
  begin
  /* calcule la comision */
  EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION', 'VENDEDORES', 'COMISIONES EN VENTA INCLUYENDO IMPUESTOS') returning_values (:SITOT);
  if ((NEW.fact_comiporc IS NULL) or (NEW.fact_comiporc = 0)) THEN
    BEGIN
    if (SITOT = 'SI') then
      SELECT MAX(COMI_PORC) FROM comisiones WHERE VEND_COD = NEW.vend_cod AND
        COMI_INICIAL <= NEW.fact_total AND COMI_FINAL >= NEW.fact_total
        INTO NEW.fact_comiporc;
    else
      SELECT MAX(COMI_PORC) FROM comisiones WHERE VEND_COD = NEW.vend_cod AND
        COMI_INICIAL <= (NEW.fact_total -NEW.fact_ivamonto) AND COMI_FINAL >= (NEW.fact_total -NEW.fact_ivamonto)
        INTO NEW.fact_comiporc;
    if (NEW.fact_comiporc IS NULL) then
        NEW.fact_comiporc = 0;
    END
  if (SITOT = 'SI') then
      NEW.fact_comimonto = NEW.fact_total * NEW.fact_comiporc / 100;
  ELSE
      NEW.fact_comimonto = (NEW.fact_total -NEW.fact_ivamonto) * NEW.fact_comiporc / 100;

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

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

select auto_numero from autorizaciones where auto_inicial <= new.fact_numero and auto_final >= new.fact_numero and auto_fecha <= new.fact_fecha and auto_vence >= new.fact_fecha and pref_pre = new.pref_pre into new.auto_numero;
END
^

SET TERM ; ^


SET TERM ^ ;

CREATE OR ALTER TRIGGER PEDIDOS_BI FOR PEDIDOS
ACTIVE BEFORE INSERT POSITION 0
AS
declare variable NUMERO VARCHAR(6);
declare variable AUTOM CHAR(1);
declare variable EXISTE CHAR(1);
/*DECLARE VARIABLE VALCUPO CHAR(10);*/
declare variable CUPOPED CHAR(10);
declare variable DISPONIBLE NUMERIC(18,2);
declare variable OK CHAR(1);
declare variable FECSERVER CHAR(2);
BEGIN
EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION', 'DOCUMENTOS', 'INHABILITAR FECHA EN DOCUMENTOS') returning_values (:fecserver);
if (FECSERVER = 'SI') then
    NEW.pedi_fecha = CAST ('NOW' AS DATE);
OK = 'S';
/*EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'ACCION A TOMAR SI EL CUPO DE CREDITO ES INSUFICIENTE') RETURNING_VALUES (:VALCUPO);*/
EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION','PEDIDOS','VALIDAR CUPO DE CREDITO EN EL PEDIDO') RETURNING_VALUES (:CUPOPED);
IF (CUPOPED = 'PROHIBIR') THEN /*AND (CUPOPED = 'SI')) THEN*/
  BEGIN
  OK = 'N';
  /* VERIFIQUE EL CUPO DE CREDITO */
  execute procedure cupo_disponible(new.TERC_NIT, NEW.pedi_fecha, NEW.pedi_sucursal) returning_values (:DISPONIBLE);
  if (DISPONIBLE >= NEW.pedi_total) then
    OK = 'S';
  END
IF (OK = 'S') THEN
  begin
  if (NEW.NUMOK = 'N') then
    BEGIN
    /* Actualice el contador del prefijo */
    SELECT PREF_ACTUAL, PREF_AUTO FROM PREFIJOS WHERE TIDO_COD = 34 AND PREF_PRE = NEW.PREF_PRE INTO :NUMERO, :AUTOM;
    /* ACTUALICE EL NUMERO EN COMPROBANTE_ENCABEZADO  */
    if (AUTOM = 'S') then
        BEGIN
        NEW.PEDI_NUMERO = NUMERO;
        NUMERO = CAST((CAST(NUMERO AS INTEGER) + 1) AS CHAR(6));
        UPDATE PREFIJOS
          SET PREF_ACTUAL = :NUMERO
          WHERE TIDO_COD = 34 AND PREF_PRE = NEW.PREF_PRE;
        END
    ELSE
        BEGIN
        if (CAST(NUMERO AS INTEGER) = CAST(NEW.PEDI_NUMERO AS INTEGER)) then
            UPDATE PREFIJOS
                SET PREF_ACTUAL = CAST((CAST(PREF_ACTUAL AS INTEGER) + 1) AS CHAR(6))
                WHERE TIDO_COD = 34 AND PREF_PRE = NEW.PREF_PRE;
        END
    EXECUTE PROCEDURE COMPLETA_CEROS (NEW.PEDI_numero) returning_values (NEW.PEDI_numero);
    NEW.NUMOK = 'S';
    END
  /* Verifique que el numero no existe previamente */
  EXISTE = 'N';
  SELECT 'S' FROM PEDIDOS WHERE PREF_PRE = NEW.PREF_PRE AND PEDI_NUMERO = NEW.PEDI_NUMERO INTO :EXISTE;
  if (EXISTE = 'S') then
    EXCEPTION DOCUMENTO_REGISTRADO;
  END
else
  begin
  EXCEPTION CUPO_INSUFICIENTE;
  end
if ((new.PEDI_TOTAL-new.PEDI_IVAMONTO+new.PEDI_DTOMONTO-new.PEDI_ADICIONAL) = 0) then
    NEW.PEDI_FACTOR = 1;
else
    NEW.PEDI_FACTOR = (new.PEDI_TOTAL-new.PEDI_IVAMONTO)/(new.PEDI_TOTAL-new.PEDI_IVAMONTO+new.PEDI_DTOMONTO-new.PEDI_ADICIONAL);
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER COTIZACIONES_BI FOR COTIZACIONES
ACTIVE BEFORE INSERT POSITION 0
AS
declare variable NUMERO VARCHAR(6);
declare variable AUTOM CHAR(1);
declare variable EXISTE CHAR(1);
declare variable FECSERVER CHAR(2);
BEGIN
EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION', 'DOCUMENTOS', 'INHABILITAR FECHA EN DOCUMENTOS') returning_values (:fecserver);
if (FECSERVER = 'SI') then
    NEW.coti_fecha = CAST ('NOW' AS DATE);
if (NEW.numok = 'N') then
  BEGIN
  /* Actualice el contador del prefijo */
  SELECT PREF_ACTUAL, PREF_AUTO FROM PREFIJOS WHERE TIDO_COD = 35 AND PREF_PRE = NEW.PREF_PRE INTO :NUMERO, :AUTOM;
  /* ACTUALICE EL NUMERO EN COMPROBANTE_ENCABEZADO  */
  if (AUTOM = 'S') then
    BEGIN
    NEW.COTI_NUMERO = NUMERO;
    NUMERO = CAST((CAST(NUMERO AS INTEGER) + 1) AS CHAR(6));
    UPDATE PREFIJOS
      SET PREF_ACTUAL = :NUMERO
    WHERE TIDO_COD = 35 AND PREF_PRE = NEW.PREF_PRE;
    END
  ELSE
    BEGIN
    if (CAST(NUMERO AS INTEGER) = CAST(NEW.COTI_NUMERO AS INTEGER)) then
        UPDATE PREFIJOS
          SET PREF_ACTUAL = CAST((CAST(PREF_ACTUAL AS INTEGER) + 1) AS CHAR(6))
        WHERE TIDO_COD = 35 AND PREF_PRE = NEW.PREF_PRE;
    END
  EXECUTE procedure completa_ceros (NEW.COTI_numero) returning_values (NEW.COTI_numero);
  NEW.numok = 'S';
  END
/* Verifique que el numero no existe previamente */
EXISTE = 'N';
SELECT 'S' FROM COTIZACIONES WHERE PREF_PRE = NEW.PREF_PRE AND COTI_NUMERO = NEW.COTI_NUMERO INTO :EXISTE;
if (EXISTE = 'S') then
    EXCEPTION DOCUMENTO_REGISTRADO;
if ((new.COTI_TOTAL-new.COTI_IVAMONTO+new.COTI_DTOMONTO-new.COTI_ADICIONAL) = 0) then
    NEW.COTI_FACTOR = 1;
else
    NEW.COTI_FACTOR = (new.COTI_TOTAL-new.COTI_IVAMONTO)/(new.COTI_TOTAL-new.COTI_IVAMONTO+new.COTI_DTOMONTO-new.COTI_ADICIONAL);
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER REMISIONES_VENTA_BI FOR REMISIONES_VENTA
ACTIVE BEFORE INSERT POSITION 0
AS
declare variable NUMERO VARCHAR(6);
declare variable AUTOM CHAR(1);
declare variable EXISTE CHAR(1);
declare variable PEDAUTO CHAR(2);
declare variable ITEM INTEGER;
declare variable IDF INTEGER;
declare variable IDP INTEGER;
declare variable IDC INTEGER;
declare variable FECSERVER CHAR(2);
BEGIN
EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION', 'DOCUMENTOS', 'INHABILITAR FECHA EN DOCUMENTOS') returning_values (:fecserver);
if (FECSERVER = 'SI') then
    NEW.revt_fecha = CAST ('NOW' AS DATE);
if (NEW.numok = 'N') then
  BEGIN
  /* Actualice el contador del prefijo */
  SELECT PREF_ACTUAL, PREF_AUTO FROM PREFIJOS WHERE TIDO_COD = 32 AND PREF_PRE = NEW.PREF_PRE INTO :NUMERO, :AUTOM;
  /* ACTUALICE EL NUMERO EN COMPROBANTE_ENCABEZADO  */
  if (AUTOM = 'S') then
    BEGIN
    NEW.REVT_NUMERO = NUMERO;
    NUMERO = CAST((CAST(NUMERO AS INTEGER) + 1) AS CHAR(6));
    UPDATE PREFIJOS
      SET PREF_ACTUAL = :NUMERO
    WHERE TIDO_COD = 32 AND PREF_PRE = NEW.PREF_PRE;
    END
  ELSE
    BEGIN
    if (CAST(NUMERO AS INTEGER) = CAST(NEW.REVT_NUMERO AS INTEGER)) then
        UPDATE PREFIJOS
          SET PREF_ACTUAL = CAST((CAST(PREF_ACTUAL AS INTEGER) + 1) AS CHAR(6))
        WHERE TIDO_COD = 32 AND PREF_PRE = NEW.PREF_PRE;
    END
  EXECUTE PROCEDURE COMPLETA_CEROS (NEW.REVT_numero) returning_values (NEW.REVT_numero);
  NEW.numok = 'S';
  END
/* Verifique que el numero no existe previamente */
EXISTE = 'N';
SELECT 'S' FROM REMISIONES_VENTA WHERE PREF_PRE = NEW.PREF_PRE AND REVT_NUMERO = NEW.REVT_NUMERO INTO :EXISTE;
if (EXISTE = 'S') then
    EXCEPTION DOCUMENTO_REGISTRADO;

/* si hay pedido automatico saque una copia de la consolidacion */
EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION', 'FACTURAS', 'GENERAR PEDIDO AUTOMATICAMENTE CON LA FACTURA') returning_values (pedauto);
if (PEDAUTO = 'SI') then
    begin
    IDC = gen_id(id_cons,1);
    for select cefa_item, cefa_idori from consolide_faltantes where cefa_id = new.revt_consolida
        into :item, :idf
        do
        begin
        SELECT PEDI_ID FROM PEDIDOS P, FACTURAS F WHERE P.PREF_PRE = F.pref_pre AND P.pedi_numero = F.fact_numero AND F.fact_id = :IDF INTO :IDP;
        insert into consolide_faltantes (cefa_id, cefa_item, cefa_tipodes, cefa_tipoori, cefa_idori)
            VALUES(:IDC, :item, 32, 34, :IDP);
        end
    EXECUTE PROCEDURE consolide_pendientes (:IDC);
    NEW.lipr_cod = :IDC;
    end
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER DEVOLUCIONES_VENTAS_BI FOR DEVOLUCIONES_VENTAS
ACTIVE BEFORE INSERT POSITION 0
AS
declare variable NUMERO VARCHAR(6);
declare variable AUTOM CHAR(1);
declare variable EXISTE CHAR(1);
declare variable SITOT CHAR(2);
declare variable CODCOBR INTEGER;
declare variable CODVEND INTEGER;
declare variable FECSERVER CHAR(2);
BEGIN
EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION', 'DOCUMENTOS', 'INHABILITAR FECHA EN DOCUMENTOS') returning_values (:fecserver);
if (FECSERVER = 'SI') then
    NEW.devt_fecha = CAST ('NOW' AS DATE);
if (new.devt_remid is null) then
    NEW.devt_remid = 0;
execute procedure LEE_CONFIGURACION ('FACTURACION','DEVOLUCIONES','PERMITIR DEVOLVER ITEMS NO FACTURADOS') returning_values (:SITOT);
if ((SITOT = 'NO') AND (NEW.devt_factid = 0)) then
    exception factura_no_existe;
/* CALCULE LA COMISION CON BASE EN LA FACTURA */
EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION', 'VENDEDORES', 'COMISIONES EN VENTA INCLUYENDO IMPUESTOS') returning_values (:SITOT);
SELECT FACT_COMIPORC FROM FACTURAS WHERE FACT_ID = NEW.devt_factid INTO NEW.devt_comiporc;
if (NEW.devt_comiporc IS NULL) then
    NEW.devt_comiporc = 0;

if (SITOT = 'SI') then
    NEW.devt_comimonto = NEW.devt_total * NEW.devt_comiporc / 100;
ELSE
    NEW.devt_comimonto = (NEW.devt_total - NEW.devt_ivamonto) * NEW.devt_comiporc / 100;

if (NEW.numok = 'N') then
  BEGIN
  /* Actualice el contador del prefijo */
  SELECT PREF_ACTUAL, PREF_AUTO FROM PREFIJOS WHERE TIDO_COD = 33 AND PREF_PRE = NEW.PREF_PRE INTO :NUMERO, :AUTOM;
  /* ACTUALICE EL NUMERO EN COMPROBANTE_ENCABEZADO  */
  if (AUTOM = 'S') then
    BEGIN
    NEW.DEVT_NUMERO = NUMERO;
    NUMERO = CAST((CAST(NUMERO AS INTEGER) + 1) AS CHAR(6));
    UPDATE PREFIJOS
      SET PREF_ACTUAL = :NUMERO
    WHERE TIDO_COD = 33 AND PREF_PRE = NEW.PREF_PRE;
    END
  ELSE
    BEGIN
    if (CAST(NUMERO AS INTEGER) = CAST(NEW.DEVT_NUMERO AS INTEGER)) then
        UPDATE PREFIJOS
          SET PREF_ACTUAL = CAST((CAST(PREF_ACTUAL AS INTEGER) + 1) AS CHAR(6))
        WHERE TIDO_COD = 33 AND PREF_PRE = NEW.PREF_PRE;
    END
  EXECUTE PROCEDURE COMPLETA_CEROS (NEW.DEVT_numero) returning_values (NEW.DEVT_numero);
  NEW.numok = 'S';
  END
/* Verifique que el numero no existe previamente */
EXISTE = 'N';
SELECT 'S' FROM DEVOLUCIONES_VENTAS WHERE PREF_PRE = NEW.PREF_PRE AND DEVT_NUMERO = NEW.DEVT_NUMERO INTO :EXISTE;
if (EXISTE = 'S') then
    EXCEPTION DOCUMENTO_REGISTRADO;
select COBR_COD, VEND_COD FROM CLIENTES WHERE TERC_NIT = NEW.terc_nit INTO :CODCOBR, CODVEND;
if (NEW.cobr_cod IS NULL) then
    NEW.cobr_cod = :CODCOBR;
if (NEW.vend_cod IS NULL) then
    NEW.vend_cod = :CODVEND;
if ((new.DEVT_TOTAL-new.DEVT_IVAMONTO+new.DEVT_DTOMONTO-new.DEVT_ADICIONAL) = 0) then
    NEW.DEVT_FACTOR = 1;
else
    NEW.DEVT_FACTOR = (new.DEVT_TOTAL-new.DEVT_IVAMONTO)/(new.DEVT_TOTAL-new.DEVT_IVAMONTO+new.DEVT_DTOMONTO-new.DEVT_ADICIONAL);
END
^

SET TERM ; ^


/* 20080917C: VERIFIQUE ADEMAS DE BANCO, CUENTA Y NUMERO EL MONTOAL HACER LAS SALIDAS DE CAJA PARA PREVENIR PROBLEMAS POR DOCUMENTOS REPETIDOS */
SET TERM ^ ;

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

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

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

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

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

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

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

  /* ACTUALICE LA SALIDA DEL DOCUMENTO DE PAGO */
  UPDATE DOCUMENTOS_PAGO_CAJA
    SET DPCA_TIPOSAL = 64, DPCA_IDSAL = :id
    WHERE FOPA_ID = :FORMA AND DPCA_BANCO = :BANCO AND DPCA_CUENTA = :CUENTA AND
    DPCA_NUMERO = :NUMERO AND DPCA_TIPOSAL = 0 AND DPCA_IDSAL = 0 AND DPCA_MONTO = :MONTO;
  end

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

SET TERM ; ^


SET TERM ^ ;

CREATE OR ALTER TRIGGER CAMBIODOC_ENTRADAS_AD FOR CAMBIODOC_ENTRADAS
ACTIVE AFTER DELETE POSITION 0
AS
declare variable CAJA INTEGER;
declare variable FEC DATE;
BEGIN
if ((OLD.CADO_ID <> 0) AND (OLD.cden_anulado = 'N')) then
    BEGIN
    SELECT CAJA_ID, CADO_FECHA FROM CAMBIO_DOCUMENTOS WHERE CADO_ID = OLD.CADO_ID INTO :CAJA, :FEC;
    update movimiento_caja
        set moca_creditos = moca_creditos - OLD.cden_monto
        where moca_tiporef = 63 and moca_idref = OLD.cado_id and caja_id = :CAJA;

    /* ANULE EL CAMBIO ANTERIOR */
    if (OLD.FOPA_ID <> 1) then
        UPDATE DOCUMENTOS_PAGO_CAJA
            SET DPCA_TIPOSAL = 0, DPCA_IDSAL = 0
            WHERE FOPA_ID = OLD.FOPA_ID AND DPCA_BANCO = OLD.CDEN_BANCO AND
            DPCA_CUENTA = OLD.CDEN_CUENTA AND DPCA_NUMERO = OLD.CDEN_NUMERO AND
            DPCA_TIPOSAL = 63 AND DPCA_IDSAL = OLD.CADO_ID AND DPCA_MONTO = OLD.cden_monto;
    ELSE
        EXECUTE PROCEDURE RESTE_SALDO_EFECTIVO(:CAJA, :FEC, OLD.CDEN_MONTO, 'S');
    END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER CAMBIODOC_ENTRADAS_AI FOR CAMBIODOC_ENTRADAS
ACTIVE AFTER INSERT POSITION 0
AS
declare variable PREF VARCHAR(4);
declare variable NUMERO VARCHAR(6);
declare variable CAJA INTEGER;
declare variable FEC DATE;
declare variable CONC VARCHAR(60);
declare variable EXISTE CHAR(1);
declare variable VALFP char(2);
BEGIN
if ((NEW.CADO_ID <> 0) AND (NEW.CDEN_ANULADO = 'N')) then
    BEGIN
    EXECUTE PROCEDURE LEE_CONFIGURACION('BANCOS','CONSIGNACIONES','VALIDAR FORMAS DE PAGO EN CAJA') RETURNING_VALUES (VALFP);
    SELECT PREF_PRE, CADO_NUMERO, CADO_FECHA, CADO_CONC, CAJA_ID
        FROM CAMBIO_DOCUMENTOS WHERE CADO_ID = NEW.CADO_ID INTO :PREF, :numero, :FEC, :CONC, :CAJA;
    select 'S' from movimiento_caja where moca_tiporef = 63 and moca_idref = new.cado_id and caja_id = :CAJA into :Existe;
    if (Existe = 'S') then
        begin
        update movimiento_caja
            set moca_creditos = moca_creditos + new.cden_monto
            where moca_tiporef = 63 and moca_idref = new.cado_id and caja_id = :CAJA;
        end
    else
        INSERT INTO MOVIMIENTO_CAJA
            (MOCA_ID, CAJA_ID, MOCA_TIPOREF, MOCA_PREFREF, MOCA_NUMREF, MOCA_FECHA, MOCA_CONC, MOCA_DEBITOS, MOCA_CREDITOS, MOCA_DB, MOCA_IDREF)
            VALUES(GEN_ID(ID_MOVCAJA,1), :CAJA, 63, :Pref, :Numero, :Fec, :Conc, 0, NEW.cden_monto, 'N', new.cado_id);
        
    /* ACTUALICE LA SALIDA DEL DOCUMENTO */
    if (NEW.FOPA_ID <> 1) then
      BEGIN
      EXISTE = 'N';
      SELECT 'S' FROM DOCUMENTOS_PAGO_CAJA WHERE FOPA_ID = NEW.FOPA_ID AND DPCA_BANCO = NEW.CDEN_BANCO AND DPCA_CUENTA = NEW.CDEN_CUENTA AND
            DPCA_NUMERO = NEW.CDEN_NUMERO AND DPCA_TIPOSAL = 0 AND DPCA_IDSAL = 0 INTO :EXISTE;
      if (EXISTE = 'S') then
        UPDATE DOCUMENTOS_PAGO_CAJA
            SET DPCA_TIPOSAL = 63, DPCA_IDSAL = NEW.cado_id
            WHERE FOPA_ID = NEW.FOPA_ID AND DPCA_BANCO = NEW.CDEN_BANCO AND DPCA_CUENTA = NEW.CDEN_CUENTA AND
            DPCA_NUMERO = NEW.CDEN_NUMERO AND DPCA_TIPOSAL = 0 AND DPCA_IDSAL = 0 AND DPCA_MONTO = NEW.cden_monto;
      ELSE
        IF (VALFP = 'SI') THEN
          EXCEPTION documento_pago_salido;
      END
    ELSE
        EXECUTE PROCEDURE RESTE_SALDO_EFECTIVO(:CAJA, :FEC, NEW.CDEN_MONTO, 'N');
    END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER CAMBIODOC_ENTRADAS_AU FOR CAMBIODOC_ENTRADAS
ACTIVE AFTER UPDATE POSITION 0
AS
declare variable PREF VARCHAR(4);
declare variable NUMERO VARCHAR(6);
declare variable CAJA INTEGER;
declare variable FEC DATE;
declare variable CONC VARCHAR(60);
declare variable EXISTE CHAR(1);
BEGIN
SELECT CAJA_ID, CADO_FECHA FROM CAMBIO_DOCUMENTOS WHERE CADO_ID = OLD.CADO_ID INTO :CAJA, :FEC;
if ((OLD.CADO_ID <> 0) and (old.cden_anulado = 'N')) then
    begin
    update movimiento_caja
        set moca_creditos = moca_creditos - OLD.cden_monto
        where moca_tiporef = 63 and moca_idref = OLD.cado_id and caja_id = :CAJA;

    /* ANULE EL CAMBIO ANTERIOR */
    if (OLD.FOPA_ID <> 1) then
        UPDATE DOCUMENTOS_PAGO_CAJA
            SET DPCA_TIPOSAL = 0, DPCA_IDSAL = 0
            WHERE FOPA_ID = OLD.FOPA_ID AND DPCA_BANCO = OLD.CDEN_BANCO AND
            DPCA_CUENTA = OLD.CDEN_CUENTA AND DPCA_NUMERO = OLD.CDEN_NUMERO AND
            DPCA_TIPOSAL = 63 AND DPCA_IDSAL = OLD.CADO_ID AND DPCA_MONTO = OLD.cden_monto;
    ELSE
        EXECUTE PROCEDURE RESTE_SALDO_EFECTIVO(:CAJA, :FEC, OLD.CDEN_MONTO, 'S');
    end
            
if ((NEW.CADO_ID <> 0) and (NEW.cden_anulado = 'N')) then
    BEGIN
    SELECT PREF_PRE, CADO_NUMERO, CADO_FECHA, CADO_CONC, CAJA_ID
        FROM CAMBIO_DOCUMENTOS WHERE CADO_ID = NEW.CADO_ID INTO :PREF, :numero, :FEC, :CONC, :CAJA;
    select 'S' from movimiento_caja where moca_tiporef = 63 and moca_idref = new.cado_id and caja_id = :CAJA into :Existe;
    if (Existe = 'S') then
        begin
        update movimiento_caja
            set moca_creditos = moca_creditos + new.cden_monto
            where moca_tiporef = 63 and moca_idref = new.cado_id and caja_id = :CAJA;
        end
    else
        INSERT INTO MOVIMIENTO_CAJA
            (MOCA_ID, CAJA_ID, MOCA_TIPOREF, MOCA_PREFREF, MOCA_NUMREF, MOCA_FECHA, MOCA_CONC, MOCA_DEBITOS, MOCA_CREDITOS, MOCA_DB, MOCA_IDREF)
            VALUES(GEN_ID(ID_MOVCAJA,1), :CAJA, 63, :Pref, :Numero, :Fec, :Conc, 0, NEW.cden_monto, 'N', new.cado_id);
        
    /* ACTUALICE LA SALIDA DEL DOCUMENTO */
    if (NEW.FOPA_ID <> 1) then
        UPDATE DOCUMENTOS_PAGO_CAJA
            SET DPCA_TIPOSAL = 63, DPCA_IDSAL = NEW.cado_id
            WHERE FOPA_ID = NEW.FOPA_ID AND DPCA_BANCO = NEW.CDEN_BANCO AND DPCA_CUENTA = NEW.CDEN_CUENTA AND
            DPCA_NUMERO = NEW.CDEN_NUMERO AND DPCA_TIPOSAL = 0 AND DPCA_IDSAL = 0 AND DPCA_MONTO = NEW.cden_monto;
    ELSE
        EXECUTE PROCEDURE RESTE_SALDO_EFECTIVO(:CAJA, :FEC, NEW.CDEN_MONTO, 'N');
    END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER CONSIGNA_DETALLE_AD FOR CONSIGNA_DETALLE
ACTIVE AFTER DELETE POSITION 0
AS
declare variable Existe CHAR(1);
declare variable FEC DATE;
BEGIN
if ((OLD.cons_id <> 0) AND (OLD.code_anulado = 'N')) then
    BEGIN
    SELECT CONS_FECHA FROM CONSIGNA WHERE CONS_ID = OLD.CONS_ID INTO :FEC;
    /* Actualice el total del movimiento del banco */
    select 'S' from movimiento_banco where moba_tipodoc = 71 and moba_idref = old.cons_id into :Existe;
    if (Existe = 'S') then
        update movimiento_banco
            set moba_total = moba_total - old.code_monto
            where moba_tipodoc = 71 and moba_idref = old.cons_id;
    /* afecte la caja */
    select 'S' from movimiento_caja where moca_tiporef = 71 and moca_idref = old.cons_id and caja_id = old.caja_id into :Existe;
    if (Existe = 'S') then
        update movimiento_caja
            set moca_creditos = moca_creditos - old.code_monto
        where moca_tiporef = 71 and moca_idref = old.cons_id and caja_id = old.caja_id;
    /* ANULE LA SALIDA DEL DOCUMENTO DE PAGO */
    if (OLD.FOPA_ID <> 1) then
        UPDATE DOCUMENTOS_PAGO_CAJA
            SET DPCA_TIPOSAL = 0, DPCA_IDSAL = 0
            WHERE FOPA_ID = OLD.FOPA_ID AND DPCA_BANCO = OLD.CODE_BANCO AND
            DPCA_CUENTA = OLD.CODE_CUENTA AND DPCA_NUMERO = OLD.CODE_NUMERO AND
            DPCA_TIPOSAL = 71 AND DPCA_IDSAL = OLD.CONS_ID AND DPCA_MONTO = OLD.code_monto;
    ELSE
        EXECUTE PROCEDURE RESTE_SALDO_EFECTIVO(OLD.CAJA_ID, :FEC, OLD.CODE_MONTO, 'S');
    END
END
^

SET TERM ; ^

SET TERM ^ ;

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

  /* ACTUALICE LA SALIDA DEL DOCUMENTO DE PAGO */
  if (NEW.FOPA_ID <> 1) then
      BEGIN
      EXISTE = 'N';
      SELECT 'S' FROM DOCUMENTOS_PAGO_CAJA WHERE FOPA_ID = NEW.FOPA_ID AND DPCA_BANCO = NEW.CODE_BANCO AND
        DPCA_CUENTA = NEW.CODE_CUENTA AND DPCA_NUMERO = NEW.CODE_NUMERO AND DPCA_TIPOSAL = 0 AND DPCA_IDSAL = 0 INTO :EXISTE;
      if (EXISTE = 'S') then
        UPDATE DOCUMENTOS_PAGO_CAJA
          SET DPCA_TIPOSAL = 71, DPCA_IDSAL = NEW.cons_id
          WHERE FOPA_ID = NEW.FOPA_ID AND DPCA_BANCO = NEW.CODE_BANCO AND DPCA_CUENTA = NEW.CODE_CUENTA AND
          DPCA_NUMERO = NEW.CODE_NUMERO AND DPCA_TIPOSAL = 0 AND DPCA_IDSAL = 0 AND DPCA_MONTO = NEW.code_monto;
      ELSE
        IF (VALFP = 'SI') THEN
          EXCEPTION documento_pago_salido;
      END
  ELSE
      EXECUTE PROCEDURE RESTE_SALDO_EFECTIVO(NEW.CAJA_ID, :FEC, NEW.CODE_MONTO, 'N');
  end
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER CONSIGNA_DETALLE_AU FOR CONSIGNA_DETALLE
ACTIVE AFTER UPDATE POSITION 0
AS
declare variable Fec date;
declare variable Cuenta integer;
declare variable Conc VARCHAR(60);
declare variable Pref varchar(4);
declare variable Num varchar(6);
declare variable Existe char(1);
BEGIN
if ((old.cons_id <> 0) and (old.code_anulado = 'N')) then
    begin
    /* Actualice el total del movimiento del banco */
    select cons_fecha, cuba_cod, cons_concepto, prba_pref, cons_numero from consigna where cons_id = new.cons_id into :Fec, :Cuenta, :Conc, :Pref, :Num;
    Existe = 'N';
    select 'S' from movimiento_banco where moba_tipodoc = 71 and moba_idref = new.cons_id into :Existe;
    if (Existe = 'S') then
        update movimiento_banco
            set moba_concepto = 'ANULADO', moba_total = moba_total - new.code_monto
            where moba_tipodoc = 71 and moba_idref = new.cons_id;
    /* afecte la caja */
    select cons_fecha, cons_concepto, prba_pref, cons_numero from consigna
        where cons_id = new.cons_id into :Fec, :Conc, :Pref, :Num;
    Existe = 'N';
    select 'S' from movimiento_caja where moca_tiporef = 71 and moca_idref = new.cons_id and caja_id = new.caja_id into :Existe;
    if (Existe = 'S') then
        update movimiento_caja
            set moca_creditos = moca_creditos - new.code_monto
            where moca_tiporef = 71 and moca_idref = new.cons_id and caja_id = new.caja_id;
    /* ANULE LA SALIDA DEL DOCUMENTO DE PAGO */
    if (OLD.FOPA_ID <> 1) then
        UPDATE DOCUMENTOS_PAGO_CAJA
            SET DPCA_TIPOSAL = 0, DPCA_IDSAL = 0
            WHERE FOPA_ID = OLD.FOPA_ID AND DPCA_BANCO = OLD.CODE_BANCO AND
            DPCA_CUENTA = OLD.CODE_CUENTA AND DPCA_NUMERO = OLD.CODE_NUMERO AND
            DPCA_TIPOSAL = 71 AND DPCA_IDSAL = OLD.CONS_ID AND DPCA_MONTO = OLD.code_monto;
    ELSE
        EXECUTE PROCEDURE RESTE_SALDO_EFECTIVO(OLD.CAJA_ID, :FEC, OLD.CODE_MONTO, 'S');
    end
if ((new.cons_id <> 0) and (new.code_anulado = 'N')) then
    begin
    /* Actualice el total del movimiento del banco */
    select cons_fecha, cuba_cod, cons_concepto, prba_pref, cons_numero
        from consigna where cons_id = new.cons_id
        into :Fec, :Cuenta, :Conc, :Pref, :Num;
    Existe = 'N';
    select 'S' from movimiento_banco where moba_tipodoc = 71 and moba_idref = new.cons_id into :Existe;
    if (Existe = 'S') then
        update movimiento_banco
            set moba_concepto = :conc, moba_total = moba_total + new.code_monto
            where moba_tipodoc = 71 and moba_idref = new.cons_id;
    else
        INSERT INTO MOVIMIENTO_BANCO
            (MOBA_ID, CUBA_COD, MOBA_TIPODOC, MOBA_PREF, MOBA_NUMERO, MOBA_FECHA, MOBA_CONCEPTO, MOBA_TOTAL, MOBA_DB, MOBA_IDREF, MOBA_TIPOREF)
            VALUES(GEN_ID(ID_MOVBANCO,1), :Cuenta, 71, :Pref, :Num, :Fec, :Conc, NEW.code_monto, 'S', new.cons_id, 71);
    /* afecte la caja */
    select cons_fecha, cons_concepto, prba_pref, cons_numero from consigna
        where cons_id = new.cons_id into :Fec, :Conc, :Pref, :Num;
    Existe = 'N';
    select 'S' from movimiento_caja where moca_tiporef = 71 and moca_idref = new.cons_id and caja_id = new.caja_id into :Existe;
    if (Existe = 'S') then
        update movimiento_caja
            set moca_creditos = moca_creditos + new.code_monto
            where moca_tiporef = 71 and moca_idref = new.cons_id and caja_id = new.caja_id;
    else
        INSERT INTO MOVIMIENTO_CAJA
            (MOCA_ID, CAJA_ID, MOCA_TIPOREF, MOCA_PREFREF, MOCA_NUMREF, MOCA_FECHA, MOCA_CONC, MOCA_DEBITOS, MOCA_CREDITOS, MOCA_DB, MOCA_IDREF)
            VALUES(GEN_ID(ID_MOVCAJA,1), NEW.CAJA_ID, 71, :Pref, :Num, :Fec, :Conc, 0, NEW.code_monto, 'N', new.cons_id);
    /* ACTUALICE LA SALIDA DEL DOCUMENTO DE PAGO */
    if (NEW.FOPA_ID <> 1) then
        UPDATE DOCUMENTOS_PAGO_CAJA
            SET DPCA_TIPOSAL = 71, DPCA_IDSAL = NEW.cons_id
            WHERE FOPA_ID = NEW.FOPA_ID AND DPCA_BANCO = NEW.CODE_BANCO AND DPCA_CUENTA = NEW.CODE_CUENTA AND
            DPCA_NUMERO = NEW.CODE_NUMERO AND DPCA_TIPOSAL = 0 AND DPCA_IDSAL = 0;
    ELSE
        EXECUTE PROCEDURE RESTE_SALDO_EFECTIVO(NEW.CAJA_ID, :FEC, NEW.CODE_MONTO, 'N');
    end
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER CONSIGNA_TARJETAS_DET_AD FOR CONSIGNA_TARJETAS_DET
ACTIVE AFTER DELETE POSITION 0
as
begin
if ((old.ctjd_anulado = 'N') AND (OLD.cotj_id <> 0)) then
    begin
    /* borre los movimientos en caja */
    update movimiento_caja
        set moca_creditos = moca_creditos - (old.ctjd_base + old.ctjd_iva)
        where moca_tiporef = 64 and moca_idref = old.cotj_id;
    /* ANULE LA SALIDA DEL DOCUMENTO DE PAGO */
    UPDATE DOCUMENTOS_PAGO_CAJA
        SET DPCA_TIPOSAL = 0, DPCA_IDSAL = 0
        WHERE FOPA_ID = OLD.FOPA_ID AND DPCA_BANCO = OLD.TARJ_COD AND
            DPCA_CUENTA = OLD.CTJD_NROTJ AND DPCA_NUMERO = OLD.CTJD_COMPROB AND
            DPCA_TIPOSAL = 64 AND DPCA_IDSAL = OLD.COTJ_ID AND DPCA_MONTO = OLD.ctjd_base;
    end
end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER CONSIGNA_TARJETAS_DET_AI FOR CONSIGNA_TARJETAS_DET
ACTIVE AFTER INSERT POSITION 0
as
declare variable Fec DATE;
declare variable Caja integer;
declare variable Conc VARCHAR(60);
declare variable Pref varchar(4);
declare variable Num varchar(6);
declare variable Existe char(1);
begin
if ((new.COTJ_ID <> 0) and (new.ctjd_anulado = 'N')) then
  begin
  /* afecte la caja */
  select cotj_fecha, cotj_concepto, pref_pre, cotj_numero, caja_id from consigna_tarjetas
    where cotj_id = new.cotj_id into :Fec, :Conc, :Pref, :Num, :caja;
  Existe = 'N';
  select 'S' from movimiento_caja where moca_tiporef = 64 and moca_idref = new.cotj_id into :Existe;
  if (Existe = 'S') then
    update movimiento_caja
      set moca_creditos = moca_creditos + new.ctjd_base
      where moca_tiporef = 64 and moca_idref = new.cotj_id;
  else
    INSERT INTO MOVIMIENTO_CAJA
        (MOCA_ID, CAJA_ID, MOCA_TIPOREF, MOCA_PREFREF, MOCA_NUMREF, MOCA_FECHA, MOCA_CONC, MOCA_DEBITOS, MOCA_CREDITOS, MOCA_DB, MOCA_IDREF)
        VALUES(GEN_ID(ID_MOVCAJA,1), :Caja, 64, :Pref, :Num, :Fec, :Conc, 0, NEW.ctjd_base, 'N', new.cotj_id);

  /* ACTUALICE LA SALIDA DEL DOCUMENTO DE PAGO */
  UPDATE DOCUMENTOS_PAGO_CAJA
    SET DPCA_TIPOSAL = 64, DPCA_IDSAL = NEW.cotj_id
    WHERE FOPA_ID = NEW.FOPA_ID AND DPCA_BANCO = NEW.TARJ_COD AND DPCA_CUENTA = NEW.CTJD_NROTJ AND
    DPCA_NUMERO = NEW.CTJD_COMPROB AND DPCA_TIPOSAL = 0 AND DPCA_IDSAL = 0 AND DPCA_MONTO = NEW.ctjd_base;
  end
end
^

SET TERM ; ^
SET TERM ^ ;

CREATE OR ALTER TRIGGER CONSIGNA_TARJETAS_DET_AU FOR CONSIGNA_TARJETAS_DET
ACTIVE AFTER UPDATE POSITION 0
as
declare variable Fec DATE;
declare variable Caja integer;
declare variable Conc VARCHAR(60);
declare variable Pref varchar(4);
declare variable Num varchar(6);
declare variable Existe char(1);
begin
if ((old.COTJ_ID <> 0) and (old.ctjd_anulado = 'N')) then
    begin
    /* borre los movimientos en caja */
    update movimiento_caja
        set moca_creditos = moca_creditos - (old.ctjd_base + old.ctjd_iva)
        where moca_tiporef = 64 and moca_idref = old.cotj_id;
    /* ANULE LA SALIDA DEL DOCUMENTO DE PAGO */
    UPDATE DOCUMENTOS_PAGO_CAJA
        SET DPCA_TIPOSAL = 0, DPCA_IDSAL = 0
        WHERE FOPA_ID = OLD.FOPA_ID AND DPCA_BANCO = OLD.TARJ_COD AND
        DPCA_CUENTA = OLD.CTJD_NROTJ AND DPCA_NUMERO = OLD.CTJD_COMPROB AND
        DPCA_TIPOSAL = 64 AND DPCA_IDSAL = OLD.COTJ_ID AND DPCA_MONTO = OLD.ctjd_base;
    end
if ((new.COTJ_ID <> 0) and (new.ctjd_anulado = 'N')) then
  begin
  /* afecte la caja */
  select cotj_fecha, cotj_concepto, pref_pre, cotj_numero, caja_id from consigna_tarjetas
    where cotj_id = new.cotj_id into :Fec, :Conc, :Pref, :Num, :caja;
  Existe = 'N';
  select 'S' from movimiento_caja where moca_tiporef = 64 and moca_idref = new.cotj_id into :Existe;
  if (Existe = 'S') then
    update movimiento_caja
      set moca_creditos = moca_creditos + new.ctjd_base
      where moca_tiporef = 64 and moca_idref = new.cotj_id;
  else
    INSERT INTO MOVIMIENTO_CAJA
        (MOCA_ID, CAJA_ID, MOCA_TIPOREF, MOCA_PREFREF, MOCA_NUMREF, MOCA_FECHA, MOCA_CONC, MOCA_DEBITOS, MOCA_CREDITOS, MOCA_DB, MOCA_IDREF)
        VALUES(GEN_ID(ID_MOVCAJA,1), :Caja, 64, :Pref, :Num, :Fec, :Conc, 0, NEW.ctjd_base, 'N', new.cotj_id);

  /* ACTUALICE LA SALIDA DEL DOCUMENTO DE PAGO */
  UPDATE DOCUMENTOS_PAGO_CAJA
    SET DPCA_TIPOSAL = 64, DPCA_IDSAL = NEW.cotj_id
    WHERE FOPA_ID = OLD.FOPA_ID AND DPCA_BANCO = NEW.TARJ_COD AND DPCA_CUENTA = NEW.CTJD_NROTJ AND
    DPCA_NUMERO = NEW.CTJD_COMPROB AND DPCA_TIPOSAL = 0 AND DPCA_IDSAL = 0 AND DPCA_MONTO = NEW.ctjd_base;
  end
end
^

SET TERM ; ^

SET TERM ^ ;

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

SET TERM ; ^

SET TERM ^ ;

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

SET TERM ; ^

SET TERM ^ ;

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

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER RECIBOS_CAJA_PAGO_AD FOR RECIBOS_CAJA_PAGO
ACTIVE AFTER DELETE POSITION 0
AS
declare variable Existe CHAR(1);
declare variable CAJA INTEGER;
declare variable FEC DATE;
declare variable TIPOCON INTEGER;
declare variable IDCONS INTEGER;
BEGIN
if ((OLD.reca_id <> 0) AND (OLD.rcpa_anulado = 'N')) then
    BEGIN
    /* anule la consignación */
    existe = 'N';
    select 'S', cofa_tipodes, cofa_iddes from consolidado_faltantes
        where cofa_tipoori = 61 and cofa_idori = old.reca_id and cofa_itemori = old.rcpa_item
        into :existe, :tipocon, :idcons;
    if (existe = 'S') then
        begin
        if (:tipocon = 71) then
            BEGIN
            DELETE FROM CONSIGNA_DETALLE WHERE CONS_ID = :idcons;
            DELETE FROM CONSIGNA WHERE CONS_ID = :idcons;
            END
        if (:tipocon = 64) then
            BEGIN
            DELETE FROM consigna_tarjetas_det WHERE COTJ_ID = :idcons;
            DELETE FROM consigna_tarjetas WHERE COTJ_ID = :idcons;
            END
        end

    select 'S' from movimiento_caja where moca_tiporef = 61 and moca_idref = old.reca_id into :Existe;
    if (Existe = 'S') then
        update movimiento_caja
            set moca_debitos = moca_debitos - old.rcpa_monto
            where moca_tiporef = 61 and moca_idref = old.reca_id;
    /* BORRE EL DOCUMENTO EN CAJA */
    SELECT CAJA_ID, RECA_FECHA FROM RECIBOS_CAJA WHERE RECA_ID = OLD.RECA_ID INTO :CAJA, :FEC;
    if (OLD.FOPA_ID <> 1) then
        DELETE FROM DOCUMENTOS_PAGO_CAJA WHERE DPCA_TIPOENT = 61 AND DPCA_IDENT = OLD.RECA_ID AND
            DPCA_BANCO = OLD.RCPA_BANCO AND DPCA_CUENTA = OLD.RCPA_CUENTA AND DPCA_NUMERO = OLD.RCPA_NUMERO AND DPCA_MONTO = OLD.rcpa_monto;
    ELSE
        EXECUTE PROCEDURE SUME_SALDO_EFECTIVO (:CAJA, :FEC, OLD.RCPA_MONTO, 'S');

    END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER RECIBOS_CAJA_PAGO_AU FOR RECIBOS_CAJA_PAGO
ACTIVE AFTER UPDATE POSITION 0
as
declare variable Fec date;
declare variable Caja integer;
declare variable Conc VARCHAR(60);
declare variable Pref varchar(4);
declare variable Num varchar(6);
declare variable Existe char(1);
declare variable TIPOCON INTEGER;
declare variable CONS CHAR(1);
declare variable CTABCO INTEGER;
declare variable PREFBCO VARCHAR(4);
declare variable TARJ VARCHAR(3);
declare variable IDCONS INTEGER;
declare variable COMIP NUMERIC(9,2);
declare variable RTFTEP NUMERIC(9,2);
declare variable RTIVAP NUMERIC(9,2);
declare variable RTICAP NUMERIC(9,2);
declare variable COMI NUMERIC(18,2);
declare variable RTFTE NUMERIC(18,2);
declare variable RTIVA NUMERIC(18,2);
declare variable RTICA NUMERIC(18,2);
BEGIN
select reca_fecha, caja_id, reca_conc, pref_pre, reca_numero
    from recibos_caja where reca_id = new.reca_id
    into :Fec, :Caja, :Conc, :Pref, :Num;
if ((OLD.reca_id <> 0) AND (OLD.rcpa_anulado = 'N')) then
    begin
    /* anule la consignación */
    existe = 'N';
    select 'S', cofa_tipodes, cofa_iddes from consolidado_faltantes
        where cofa_tipoori = 61 and cofa_idori = old.reca_id and cofa_itemori = old.rcpa_item
        into :existe, :tipocon, :idcons;
    if (existe = 'S') then
        begin
        if (:tipocon = 71) then
            BEGIN
            DELETE FROM CONSIGNA_DETALLE WHERE CONS_ID = :idcons;
            DELETE FROM CONSIGNA WHERE CONS_ID = :idcons;
            END
        if (:tipocon = 64) then
            BEGIN
            DELETE FROM consigna_tarjetas_det WHERE COTJ_ID = :idcons;
            DELETE FROM consigna_tarjetas WHERE COTJ_ID = :idcons;
            END
        end
    /* Actualice el total del movimiento caja */
    select 'S' from movimiento_caja where moca_tiporef = 61 and moca_idref = new.reca_id into :Existe;
    if (Existe = 'S') then
        update movimiento_caja
            set moca_debitos = moca_debitos - new.rcpa_monto
            where moca_tiporef = 61 and moca_idref = new.reca_id;
    /* BORRE EL DOCUMENTO EN CAJA */
    if (OLD.FOPA_ID <> 1) then
        DELETE FROM DOCUMENTOS_PAGO_CAJA WHERE DPCA_TIPOENT = 61 AND DPCA_IDENT = OLD.RECA_ID AND
            DPCA_BANCO = OLD.RCPA_BANCO AND DPCA_CUENTA = OLD.RCPA_CUENTA AND DPCA_NUMERO = OLD.RCPA_NUMERO AND DPCA_MONTO = OLD.rcpa_monto;
    ELSE
        EXECUTE PROCEDURE SUME_SALDO_EFECTIVO (:CAJA, :FEC, OLD.RCPA_MONTO, 'S');
    end
if ((new.reca_id <> 0) AND (new.rcpa_anulado = 'N')) then
    begin
    existe = 'N';
    select 'S' from movimiento_caja where moca_tiporef = 61 and moca_idref = new.reca_id into :Existe;
    if (Existe = 'S') then
        update movimiento_caja
            set moca_debitos = moca_debitos + new.rcpa_monto
            where moca_tiporef = 61 and moca_idref = new.reca_id;
    else
        INSERT INTO MOVIMIENTO_CAJA
            (MOCA_ID, CAJA_ID, MOCA_TIPOREF, MOCA_PREFREF, MOCA_NUMREF, MOCA_FECHA, MOCA_CONC, MOCA_DEBITOS, MOCA_CREDITOS, MOCA_DB, MOCA_IDREF)
            VALUES(GEN_ID(id_movcaja,1), :Caja, 61, :Pref, :Num, :Fec, :Conc, NEW.rcpa_monto, 0, 'S', new.reca_id);
                
    /* GRABE EL DOCUMENTO DE PAGO EN CAJA */
    if (NEW.FOPA_ID <> 1) then
        INSERT INTO DOCUMENTOS_PAGO_CAJA (DPCA_ID, FOPA_ID, CAJA_ID, DPCA_BANCO, DPCA_CUENTA, DPCA_NUMERO, DPCA_FECHA, DPCA_MONTO, DPCA_TIPOENT, DPCA_IDENT, DPCA_TIPOSAL, DPCA_IDSAL)
            VALUES (GEN_ID(ID_DOCPAGOCAJA, 1), NEW.FOPA_ID, :CAJA, NEW.RCPA_BANCO, NEW.RCPA_CUENTA, NEW.RCPA_NUMERO, NEW.RCPA_FECHA, NEW.RCPA_MONTO, 61, NEW.RECA_ID, 0, 0);
    ELSE
        EXECUTE PROCEDURE SUME_SALDO_EFECTIVO (:CAJA, :FEC, NEW.RCPA_MONTO, 'N');

    /* SI ES DE CONSIGNACION LA FORMA GRABELA */
    SELECT FOPA_CONSIGNA, FOPA_CTABCO, FOPA_PREFBCO, FOPA_TARJETA FROM FORMAS_PAGO
        WHERE FOPA_ID = NEW.fopa_id INTO :CONS, :CTABCO, :PREFBCO, :TARJ;
    if (CONS = 'S') then
        begin
        if ((TARJ IS NULL) OR (TARJ = '')) then
            BEGIN
            if ((CTABCO <> 0) AND (PREFBCO <> '')) then
                BEGIN
                /* CONSIGNACION */
                IDCONS = GEN_ID(ID_CONSIGNA, 1);
                INSERT INTO CONSIGNA (CONS_ID, CUBA_COD, PRBA_PREF, CONS_NUMERO, CONS_FECHA, CONS_CONCEPTO, CONS_ANULADO, CONS_TRANSMIT, NUMOK)
                    VALUES (:idcons, :ctabco, :prefbco, SUBSTR(NEW.rcpa_numero, 1, 6), :fec, :conc, 'N', 'N', 'N');
                INSERT INTO CONSIGNA_DETALLE (CONS_ID, CODE_ITEM2, FOPA_ID, CODE_BANCO, CODE_CUENTA, CODE_NUMERO, CODE_FECHA, CODE_MONTO, CODE_ANULADO, CODE_TRANSMIT, CAJA_ID)
                    VALUES (:idcons, 1, new.fopa_id, NEW.rcpa_banco, NEW.rcpa_cuenta, NEW.rcpa_numero, NEW.rcpa_fecha, NEW.rcpa_monto, 'N', 'N', :caja);

                insert into consolidado_faltantes (cofa_id, cofa_item, cofa_tipoori, cofa_tipodes, cofa_iddes, cofa_idori, cofa_itemori, cofa_ok, cofa_lista, cofa_unidad)
                    values (gen_id(id_cons, 1), 1, 61, 71, :idcons, new.reca_id, new.rcpa_item, 'N', :ctabco, :prefbco);
                END
            END
        else
            BEGIN
            /* CONSIGNACION DE TARJETA */
            if ((ctabco <> 0) AND (PREFBCO <> '')) then
                BEGIN
            select TARJ_COMIPORC, TARJ_RTFTEPORC, TARJ_RTIVAPORC, TARJ_RTICAPORC FROM TARJETAS WHERE TARJ_COD = :tarj
                INTO :comip, :rtftep, :rtivap, :rticap;
                COMI = (NEW.rcpa_monto-NEW.rcpa_ivamonto) * :comip / 100;
                EXECUTE PROCEDURE REDONDEE (COMI,0) returning_values (COMI);
                RTFTE = (NEW.rcpa_monto-NEW.rcpa_ivamonto) * :rtftep / 100;
                EXECUTE PROCEDURE REDONDEE (RTFTE,0) returning_values (RTFTE);
                RTIVA = NEW.rcpa_ivamonto * :rtivap / 100;
                EXECUTE PROCEDURE REDONDEE (RTIVA,0) returning_values (RTIVA);
                RTICA = (NEW.rcpa_monto-NEW.rcpa_ivamonto) * :rticap / 1000;
                EXECUTE PROCEDURE REDONDEE (RTICA,0) returning_values (RTICA);
                IDCONS = GEN_ID(ID_CONSIGNATAR, 1);
                INSERT INTO CONSIGNA_TARJETAS (COTJ_ID, PREF_PRE, COTJ_NUMERO, COTJ_FECHA, COTJ_CONCEPTO, COTJ_CHEQUE, CUBA_COD,
                    COTJ_MONTO, COTJ_RTFTE, COTJ_COMISION, COTJ_RTIVA, COTJ_RTICA, COTJ_ANULADO, COTJ_TRANSMIT, NUMOK, CAJA_ID)
                    VALUES (:idcons, :prefbco, SUBSTR(NEW.rcpa_numero, 1, 6), :fec, :conc, 'N', :ctabco,
                    new.rcpa_monto-:COMI-:RTFTE-:RTIVA-:RTICA, :rtfte,  :COMI, :rtiva, :rtica, 'N', 'N', 'N', :caja);
                INSERT INTO CONSIGNA_TARJETAS_DET (COTJ_ID, CTJD_ITEM, TARJ_COD, CTJD_NROTJ, CTJD_COMPROB, CTJD_BASE, CTJD_IVA, CTJD_COMIPORC, CTJD_COMIIVA, CTJD_COMIMONTO,
                    CTJD_RTFTEPORC, CTJD_RTFTEMONTO, CTJD_RTIVAPOC, CTJD_RTIVAMONTO, CTJD_ANULADO, CTJD_TRANSMIT, FOPA_ID, CTJD_RTICAPORC, CTJD_RTCAMONTO)
                    VALUES (:idcons, 1, NEW.rcpa_banco, NEW.rcpa_cuenta, NEW.rcpa_numero, new.rcpa_monto, NEW.rcpa_ivamonto, :COMIP, 'N', :comi,
                    :rtftep, :rtfte, :rtivap, :rtiva, 'N', 'N', new.fopa_id, :rticap, :rtica);
                insert into consolidado_faltantes (cofa_id, cofa_item, cofa_tipoori, cofa_tipodes, cofa_iddes, cofa_idori, cofa_itemori, cofa_ok, cofa_lista, cofa_unidad)
                    values (gen_id(id_cons, 1), 1, 61, 64, :idcons, new.reca_id, new.rcpa_item, 'N', :ctabco, :prefbco);
                END
            END
        end /* consignacion */
    end
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER TRASLADOS_CAJA_DET_AD FOR TRASLADOS_CAJA_DET
ACTIVE AFTER DELETE POSITION 0
AS
declare variable Ori integer;
declare variable Des integer;
declare variable Fec Date;
declare variable Existe char(1);
BEGIN
if ((OLD.trcj_id <> 0) AND (OLD.trcd_anulado = 'N')) then
    BEGIN
    select caja_id, trcj_destino, trcj_fecha
        from traslados_caja where trcj_id = OLD.trcj_id
        into :Ori, :Des, :Fec;
    /* 1. Borre lo viejo */
    /* 1.1 La caja origen */
    /* 1.1.1 Deshaga el mov. en la caja */
    select 'S' from movimiento_caja where moca_tiporef = 66 and moca_idref = old.trcj_id and caja_id = :Ori into :Existe;
    if (Existe = 'S') then
        begin
        update movimiento_caja
            set moca_creditos = moca_creditos - old.trcd_monto
            where moca_tiporef = 66 and moca_idref = old.trcj_id and caja_id = :Ori;
        end
    /* 1.1.2 Borre la salida del documento en la caja origen */
    if (old.fopa_id <> 1) then
        UPDATE DOCUMENTOS_PAGO_CAJA
            SET DPCA_TIPOSAL = 0, DPCA_IDSAL = 0
            WHERE FOPA_ID = OLD.FOPA_ID AND DPCA_BANCO = OLD.TRCD_BANCO AND DPCA_CUENTA = OLD.TRCD_CUENTA AND
            DPCA_NUMERO = OLD.TRCD_NUMERO AND DPCA_TIPOSAL = 66 AND DPCA_IDSAL = old.trcj_id AND DPCA_MONTO = OLD.trcd_monto;
    ELSE
        EXECUTE PROCEDURE RESTE_SALDO_EFECTIVO (:Ori, :Fec, OLD.TRCD_MONTO, 'S');
    
    /* 1.2 La caja destino */
    /* 1.2.1 Actualice el movimiento en caja destino */
    select 'S' from movimiento_caja where moca_tiporef = 66 and moca_idref = old.trcj_id and caja_id = :Des into :Existe;
    if (Existe = 'S') then
        begin
        update movimiento_caja
            set moca_debitos = moca_debitos - old.trcd_monto
            where moca_tiporef = 66 and moca_idref = old.trcj_id and caja_id = :Des;
        end
    /* 1.2.2 Borre el doc. de pago */
    if (OLD.FOPA_ID <> 1) then
        delete from DOCUMENTOS_PAGO_CAJA
            WHERE FOPA_ID = OLD.FOPA_ID AND DPCA_BANCO = OLD.TRCD_BANCO AND DPCA_CUENTA = OLD.TRCD_CUENTA AND
            DPCA_NUMERO = OLD.TRCD_NUMERO AND DPCA_TIPOENT = 66 and DPCA_IDENT = old.TRCJ_ID AND DPCA_MONTO = OLD.trcd_monto;
    ELSE
        EXECUTE PROCEDURE SUME_SALDO_EFECTIVO (:Des, :Fec, OLD.TRCD_MONTO, 'S');
    END
END
^

SET TERM ; ^

SET TERM ^ ;

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

SET TERM ; ^

SET TERM ^ ;

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

SET TERM ; ^


/* 20080917D: INCLUIR FECHA Y HORA DE REGISTRO EN COMPROBANTES VENTAS */
SET TERM ^ ;

CREATE OR ALTER PROCEDURE REP_COMPROBANTES_FAC(
    TIPO INTEGER,
    DETALLE CHAR(1),
    FECINI DATE,
    FECFIN DATE,
    PREFINI VARCHAR(4),
    PREFFIN VARCHAR(4),
    PTOINI INTEGER,
    PTOFIN INTEGER,
    ANULADOS CHAR(1),
    SUBEMPRESA INTEGER)
RETURNS (
    NOMTIPO VARCHAR(30),
    ID INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    VENCE DATE,
    CODBOD VARCHAR(2),
    NOMBOD VARCHAR(30),
    AUTORIZA VARCHAR(20),
    PTVTID INTEGER,
    PTVTNOM VARCHAR(60),
    VENDCOD INTEGER,
    VENDNOM VARCHAR(60),
    COMIPORC NUMERIC(9,2),
    COMIMONTO NUMERIC(18,2),
    NIT VARCHAR(20),
    NOMTERCERO VARCHAR(60),
    PEDIDO VARCHAR(30),
    COTIZACI VARCHAR(30),
    REMISION VARCHAR(30),
    OBS VARCHAR(255),
    ITEM INTEGER,
    ARTICULO VARCHAR(15),
    CODBAR VARCHAR(15),
    ARTIDES VARCHAR(60),
    CANT NUMERIC(18,4),
    UNIDAD VARCHAR(8),
    BODITEM VARCHAR(2),
    LOTE VARCHAR(15),
    REFERENCIA VARCHAR(60),
    PRECIO NUMERIC(18,2),
    DTOPORCIT NUMERIC(9,2),
    DTOMONTOIT NUMERIC(18,2),
    IVAPORCIT NUMERIC(9,2),
    IVAMONTOIT NUMERIC(18,2),
    CONSUMOIT NUMERIC(18,2),
    SUBTOTALIT NUMERIC(18,2),
    DTOPOR NUMERIC(9,2),
    DTOMONTO NUMERIC(18,2),
    ADICIONAL NUMERIC(18,2),
    IVAMONTO NUMERIC(18,2),
    RTFTEPOR NUMERIC(9,2),
    RTFTEMONTO NUMERIC(18,2),
    RTIVAPOR NUMERIC(9,2),
    RTIVAMONTO NUMERIC(18,2),
    RTICAPOR NUMERIC(9,2),
    RTICAMONTO NUMERIC(18,2),
    EXTRA NUMERIC(18,2),
    DTOFPOR NUMERIC(9,2),
    DTOFMONTO NUMERIC(18,2),
    DTOFFECHA DATE,
    TOTAL NUMERIC(18,2),
    ANULADO CHAR(1),
    VEHICULO VARCHAR(8),
    FECREG DATE,
    HORAREG TIME)
AS
declare variable descaux varchar(255);
BEGIN
VEHICULO = '';
  /* DETERMINE LA TABLA A EXAMINAR */
  if (BIN_AND(TIPO, 1) <> 0) then
    BEGIN
    SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 31 INTO :NOMTIPO;
    FOR SELECT FACT_ID, F.PREF_PRE, FACT_NUMERO, FACT_FECHA, FACT_VENCE, F.BODE_COD, B.BODE_NOM, F.AUTO_NUMERO, F.PTVT_ID, PTVT_NOM, F.VEND_COD, VEND_NOMBRE, F.FACT_COMIPORC, F.FACT_COMIMONTO, F.TERC_NIT, FACT_NOMCLIENTE, FACT_PEDIDO, FACT_COTIZACI, FACT_REMISION, FACT_DTOPOR, FACT_DTOMONTO, FACT_ADICIONAL, FACT_IVAMONTO, FACT_RTFTEPOR, FACT_RTFTEMONTO, FACT_RTIVAPOR, FACT_RTIVAMONTO, FACT_RTICAPOR, FACT_RTICAMONTO, FACT_EXTRA, FACT_DTOFPOR, FACT_DTOFMONTO, FACT_DTOFFECHA, FACT_TOTAL, FACT_ANULADO, VEHI_COD, SUBSTRING(FACT_OBS FROM 1 FOR 255)
        FROM FACTURAS F, BODEGA B, PUNTO_VENTA P, VENDEDORES V, PREFIJOS PR WHERE F.PTVT_ID >= :PTOINI AND F.PTVT_ID <= :PTOFIN AND
         F.BODE_COD = B.BODE_COD AND F.PTVT_ID = P.PTVT_ID AND F.VEND_COD = V.VEND_COD AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN
         AND PR.PREF_PRE = F.PREF_PRE AND PR.TIDO_COD = 31 AND ((PR.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) AND
         F.PREF_PRE >= :prefini AND F.PREF_PRE <= :preffin
        ORDER BY FACT_FECHA, FACT_ID
        INTO :ID, :PREF, :NUMERO, :FECHA, :VENCE, :CODBOD, :NOMBOD, :AUTORIZA, :PTVTID, :PTVTNOM, :VENDCOD, :VENDNOM, :COMIPORC, :COMIMONTO, :NIT, :NOMTERCERO, :PEDIDO, :COTIZACI, :REMISION, :DTOPOR, :DTOMONTO, :ADICIONAL, :IVAMONTO, :RTFTEPOR, :RTFTEMONTO, :RTIVAPOR, :RTIVAMONTO, :RTICAPOR, :RTICAMONTO, :EXTRA, :DTOFPOR, :DTOFMONTO, :DTOFFECHA, :TOTAL, :ANULADO, :VEHICULO, :OBS
        DO
        BEGIN
        if ((ANULADOS = 'S') or (ANULADO = 'N')) then
            BEGIN
            SELECT AUDI_FECHA, AUDI_HORA FROM AUDITORIA
                WHERE AUDI_IDDOC = :ID AND TIDO_COD = 31 AND AUDI_OPER = 'I' INTO :FECREG, :HORAREG;
            if (anulado = 'S') then
                BEGIN
                COMIPORC = 0;
                COMIMONTO = 0;
                DTOPOR = 0;
                DTOMONTO = 0;
                ADICIONAL = 0;
                IVAMONTO = 0;
                RTFTEPOR = 0;
                RTFTEMONTO = 0;
                RTIVAPOR = 0;
                RTIVAMONTO = 0;
                RTICAPOR = 0;
                RTICAMONTO = 0;
                EXTRA = 0;
                DTOFPOR = 0;
                DTOFMONTO = 0;
                TOTAL = 0;
                END
            if (DETALLE = 'S') then
                BEGIN
                if (anulado = 'S') then
                    BEGIN
                    ITEM = 0;
                    ARTICULO = '';
                    CODBAR = '';
                    ARTIDES = '';
                    CANT = 0;
                    UNIDAD = '';
                    BODITEM = '';
                    LOTE = '';
                    REFERENCIA = '';
                    PRECIO = 0;
                    DTOPORCIT = 0;
                    DTOMONTOIT = 0;
                    IVAPORCIT = 0;
                    IVAMONTOIT = 0;
                    CONSUMOIT = 0;
                    SUBTOTALIT = 0;
                    SUSPEND;
                    END
                ELSE
                    BEGIN
                    FOR SELECT FADE_ITEM, ARTI_COD, FADE_CODBAR, FADE_DESC, FADE_CANT, FADE_UNIDAD, BODE_COD, FADE_LOTE, FADE_REFERENCIA, FADE_PRUNIT, FADE_DTOPORC, FADE_DTOMONTO, FADE_IVAPORC, FADE_IVAMONTO, FADE_CONSUMO, FADE_TOTAL
                        FROM FACTURAS_DETALLE
                        WHERE FACT_ID = :ID
                        ORDER BY FADE_ITEM
                        INTO :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :BODITEM, :LOTE, :REFERENCIA, :PRECIO, :DTOPORCIT, :DTOMONTOIT, :IVAPORCIT, :IVAMONTOIT, :CONSUMOIT, :SUBTOTALIT
                        DO
                        SUSPEND;
                    END
                END
            ELSE
                SUSPEND;
            END
        END
    END
  if (BIN_AND(TIPO, 2) <> 0) then
    BEGIN
    SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 32 INTO :NOMTIPO;
    FOR SELECT REVT_ID, R.PREF_PRE, REVT_NUMERO, REVT_FECHA, REVT_FECHA VENCE, R.BODE_COD, B.BODE_NOM, '', R.PTVT_ID, PTVT_NOM, R.VEND_COD, VEND_NOMBRE, 0, 0, R.TERC_NIT, REVT_NOMTERC, '', '', '', 0, 0, 0, REVT_IVAMONTO, 0, 0, 0, 0, 0, 0, 0, 0, 0, REVT_FECHA DTOF, REVT_TOTAL, REVT_ANULADO, SUBSTRING(REVT_OBS FROM 1 FOR 255)
        FROM REMISIONES_VENTA R, BODEGA B, PUNTO_VENTA P, VENDEDORES V, PREFIJOS PR WHERE R.PTVT_ID >= :PTOINI AND R.PTVT_ID <= :PTOFIN AND
         R.BODE_COD = B.BODE_COD AND R.PTVT_ID = P.PTVT_ID AND R.VEND_COD = V.VEND_COD AND REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN
         AND PR.PREF_PRE = R.PREF_PRE AND PR.TIDO_COD = 32 AND ((PR.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) AND
         R.PREF_PRE >= :prefini AND R.PREF_PRE <= :preffin
        ORDER BY REVT_FECHA, REVT_ID
        INTO :ID, :PREF, :NUMERO, :FECHA, :VENCE, :CODBOD, :NOMBOD, :AUTORIZA, :PTVTID, :PTVTNOM, :VENDCOD, :VENDNOM, :COMIPORC, :COMIMONTO, :NIT, :NOMTERCERO, :PEDIDO, :COTIZACI, :REMISION, :DTOPOR, :DTOMONTO, :ADICIONAL, :IVAMONTO, :RTFTEPOR, :RTFTEMONTO, :RTIVAPOR, :RTIVAMONTO, :RTICAPOR, :RTICAMONTO, :EXTRA, :DTOFPOR, :DTOFMONTO, :DTOFFECHA, :TOTAL, :ANULADO, :OBS
        DO
        BEGIN
        if ((ANULADOS = 'S') or (ANULADO = 'N')) then
            BEGIN
            SELECT AUDI_FECHA, AUDI_HORA FROM AUDITORIA
                WHERE AUDI_IDDOC = :ID AND TIDO_COD = 32 AND AUDI_OPER = 'I' INTO :FECREG, :HORAREG;
            if (anulado = 'S') then
                BEGIN
                COMIPORC = 0;
                COMIMONTO = 0;
                DTOPOR = 0;
                DTOMONTO = 0;
                ADICIONAL = 0;
                IVAMONTO = 0;
                RTFTEPOR = 0;
                RTFTEMONTO = 0;
                RTIVAPOR = 0;
                RTIVAMONTO = 0;
                RTICAPOR = 0;
                RTICAMONTO = 0;
                EXTRA = 0;
                DTOFPOR = 0;
                DTOFMONTO = 0;
                TOTAL = 0;
                END
            if (DETALLE = 'S') then
                BEGIN
                if (anulado = 'S') then
                    BEGIN
                    ITEM = 0;
                    ARTICULO = '';
                    CODBAR = '';
                    ARTIDES = '';
                    CANT = 0;
                    UNIDAD = '';
                    BODITEM = '';
                    LOTE = '';
                    REFERENCIA = '';
                    PRECIO = 0;
                    DTOPORCIT = 0;
                    DTOMONTOIT = 0;
                    IVAPORCIT = 0;
                    IVAMONTOIT = 0;
                    CONSUMOIT = 0;
                    SUBTOTALIT = 0;
                    SUSPEND;
                    END
                ELSE
                    BEGIN
                    FOR SELECT RVDE_ITEM, ARTI_COD, RVDE_CODBAR, RVDE_DESC, RVDE_CANT, RVDE_UNIDAD, BODE_COD, RVDE_LOTE, RVDE_REFERENCIA, RVDE_PRUNIT, RVDE_DTOPORC, RVDE_DTOMONTO, RVDE_IVAPORC, RVDE_IVAMONTO, RVDE_CONSUMO, RVDE_TOTAL
                        FROM REMISIONES_VENTA_DETALLE
                        WHERE REVT_ID = :ID
                        ORDER BY RVDE_ITEM
                        INTO :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :BODITEM, :LOTE, :REFERENCIA, :PRECIO, :DTOPORCIT, :DTOMONTOIT, :IVAPORCIT, :IVAMONTOIT, :CONSUMOIT, :SUBTOTALIT
                        DO
                        SUSPEND;
                    END
                END
            ELSE
                SUSPEND;
            END
        END
    END
  if (BIN_AND(TIPO, 4) <> 0) then
    BEGIN
    SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 33 INTO :NOMTIPO;
    FOR SELECT DEVT_ID, D.PREF_PRE, DEVT_NUMERO, DEVT_FECHA, DEVT_FECHA VENCE, D.BODE_COD, B.BODE_NOM, '', D.PTVT_ID, PTVT_NOM, D.VEND_COD, VEND_NOMBRE, DEVT_COMIPORC, DEVT_COMIMONTO, D.TERC_NIT, DEVT_NOMTERC, '', '', '', DEVT_DTOPOR, DEVT_DTOMONTO, DEVT_ADICIONAL, DEVT_IVAMONTO, DEVT_RTFTEPORC, DEVT_RTFTEMONTO, DEVT_RTIVAPORC, DEVT_RTIVAMONTO, DEVT_RTICAPORC, DEVT_RTICAMONTO, DEVT_EXTRA, 0, 0, DEVT_FECHA DTOF, DEVT_TOTAL, DEVT_ANULADO, SUBSTRING(DEVT_OBS FROM 1 FOR 255)
        FROM DEVOLUCIONES_VENTAS D, BODEGA B, PUNTO_VENTA P, VENDEDORES V, PREFIJOS PR WHERE D.PTVT_ID >= :PTOINI AND D.PTVT_ID <= :PTOFIN AND
         D.BODE_COD = B.BODE_COD AND D.PTVT_ID = P.PTVT_ID AND D.VEND_COD = V.VEND_COD AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN
         AND PR.PREF_PRE = D.PREF_PRE AND PR.TIDO_COD = 33 AND ((PR.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) AND
         D.PREF_PRE >= :prefini AND D.PREF_PRE <= :preffin
        ORDER BY DEVT_FECHA, DEVT_ID
        INTO :ID, :PREF, :NUMERO, :FECHA, :VENCE, :CODBOD, :NOMBOD, :AUTORIZA, :PTVTID, :PTVTNOM, :VENDCOD, :VENDNOM, :COMIPORC, :COMIMONTO, :NIT, :NOMTERCERO, :PEDIDO, :COTIZACI, :REMISION, :DTOPOR, :DTOMONTO, :ADICIONAL, :IVAMONTO, :RTFTEPOR, :RTFTEMONTO, :RTIVAPOR, :RTIVAMONTO, :RTICAPOR, :RTICAMONTO, :EXTRA, :DTOFPOR, :DTOFMONTO, :DTOFFECHA, :TOTAL, :ANULADO, :OBS
        DO
        BEGIN
        if ((ANULADOS = 'S') or (ANULADO = 'N')) then
            BEGIN
            SELECT AUDI_FECHA, AUDI_HORA FROM AUDITORIA
                WHERE AUDI_IDDOC = :ID AND TIDO_COD = 33 AND AUDI_OPER = 'I' INTO :FECREG, :HORAREG;
            if (anulado = 'S') then
                BEGIN
                COMIPORC = 0;
                COMIMONTO = 0;
                DTOPOR = 0;
                DTOMONTO = 0;
                ADICIONAL = 0;
                IVAMONTO = 0;
                RTFTEPOR = 0;
                RTFTEMONTO = 0;
                RTIVAPOR = 0;
                RTIVAMONTO = 0;
                RTICAPOR = 0;
                RTICAMONTO = 0;
                EXTRA = 0;
                DTOFPOR = 0;
                DTOFMONTO = 0;
                TOTAL = 0;
                END
            if (DETALLE = 'S') then
                BEGIN
                if (anulado = 'S') then
                    BEGIN
                    ITEM = 0;
                    ARTICULO = '';
                    CODBAR = '';
                    ARTIDES = '';
                    CANT = 0;
                    UNIDAD = '';
                    BODITEM = '';
                    LOTE = '';
                    REFERENCIA = '';
                    PRECIO = 0;
                    DTOPORCIT = 0;
                    DTOMONTOIT = 0;
                    IVAPORCIT = 0;
                    IVAMONTOIT = 0;
                    CONSUMOIT = 0;
                    SUBTOTALIT = 0;
                    SUSPEND;
                    END
                ELSE
                    BEGIN
                    FOR SELECT DVDE_ITEM, ARTI_COD, DVDE_CODBAR, DVDE_DESC, DVDE_CANT, DVDE_UNIDAD, BODE_COD, DVDE_LOTE, DVDE_REFERENCIA, DVDE_PRUNIT, DVDE_DTOPORC, DVDE_DTOMONTO, DVDE_IVAPORC, DVDE_IVAMONTO, DVDE_CONSUMO, DVDE_TOTAL
                        FROM DEVOLUCIONES_VENTAS_DETALLE
                        WHERE DEVT_ID = :ID
                        ORDER BY DVDE_ITEM
                        INTO :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :BODITEM, :LOTE, :REFERENCIA, :PRECIO, :DTOPORCIT, :DTOMONTOIT, :IVAPORCIT, :IVAMONTOIT, :CONSUMOIT, :SUBTOTALIT
                        DO
                        SUSPEND;
                    END
                END
            ELSE
                SUSPEND;
            END
        END
    END
  if (BIN_AND(TIPO, 8) <> 0) then
    BEGIN
    SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 34 INTO :NOMTIPO;
    FOR SELECT PEDI_ID, P.PREF_PRE, PEDI_NUMERO, PEDI_FECHA, PEDI_FECHA VENCE, '', '', '', P.PTVT_ID, PTVT_NOM, P.VEND_COD, VEND_NOMBRE, 0, 0, P.TERC_NIT, PEDI_NOMTERC, '', '', '', PEDI_DTOPOR, PEDI_DTOMONTO, PEDI_ADICIONAL, PEDI_IVAMONTO, 0, 0, 0, 0, 0, 0, PEDI_EXTRA, 0, 0, PEDI_FECHA DTOF, PEDI_TOTAL, PEDI_ANULADO, SUBSTRING(PEDI_OBS FROM 1 FOR 255)
        FROM PEDIDOS P, PUNTO_VENTA PT, VENDEDORES V, PREFIJOS PR WHERE P.PTVT_ID >= :PTOINI AND P.PTVT_ID <= :PTOFIN AND
         P.PTVT_ID = PT.PTVT_ID AND P.VEND_COD = V.VEND_COD AND PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN
         AND PR.PREF_PRE = P.PREF_PRE AND PR.TIDO_COD = 34 AND ((PR.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) AND
         P.PREF_PRE >= :prefini AND P.PREF_PRE <= :preffin
        ORDER BY PEDI_FECHA, PEDI_ID
        INTO :ID, :PREF, :NUMERO, :FECHA, :VENCE, :CODBOD, :NOMBOD, :AUTORIZA, :PTVTID, :PTVTNOM, :VENDCOD, :VENDNOM, :COMIPORC, :COMIMONTO, :NIT, :NOMTERCERO, :PEDIDO, :COTIZACI, :REMISION, :DTOPOR, :DTOMONTO, :ADICIONAL, :IVAMONTO, :RTFTEPOR, :RTFTEMONTO, :RTIVAPOR, :RTIVAMONTO, :RTICAPOR, :RTICAMONTO, :EXTRA, :DTOFPOR, :DTOFMONTO, :DTOFFECHA, :TOTAL, :ANULADO, :OBS
        DO
        BEGIN
        if ((ANULADOS = 'S') or (ANULADO = 'N')) then
            BEGIN
            SELECT AUDI_FECHA, AUDI_HORA FROM AUDITORIA
                WHERE AUDI_IDDOC = :ID AND TIDO_COD = 34 AND AUDI_OPER = 'I' INTO :FECREG, :HORAREG;
            if (anulado = 'S') then
                BEGIN
                COMIPORC = 0;
                COMIMONTO = 0;
                DTOPOR = 0;
                DTOMONTO = 0;
                ADICIONAL = 0;
                IVAMONTO = 0;
                RTFTEPOR = 0;
                RTFTEMONTO = 0;
                RTIVAPOR = 0;
                RTIVAMONTO = 0;
                RTICAPOR = 0;
                RTICAMONTO = 0;
                EXTRA = 0;
                DTOFPOR = 0;
                DTOFMONTO = 0;
                TOTAL = 0;
                END
            if (DETALLE = 'S') then
                BEGIN
                if (anulado = 'S') then
                    BEGIN
                    ITEM = 0;
                    ARTICULO = '';
                    CODBAR = '';
                    ARTIDES = '';
                    CANT = 0;
                    UNIDAD = '';
                    BODITEM = '';
                    LOTE = '';
                    REFERENCIA = '';
                    PRECIO = 0;
                    DTOPORCIT = 0;
                    DTOMONTOIT = 0;
                    IVAPORCIT = 0;
                    IVAMONTOIT = 0;
                    CONSUMOIT = 0;
                    SUBTOTALIT = 0;
                    SUSPEND;
                    END
                ELSE
                    BEGIN
                    FOR SELECT PEDE_ITEM, ARTI_COD, PEDE_CODBAR, PEDE_DESC, PEDE_CANT, PEDE_UNIDAD, '', '', PEDE_REFERENCIA, PEDE_PRUNIT, PEDE_DTOPORC, PEDE_DTOMONTO, PEDE_IVAPORC, PEDE_IVAMONTO, PEDE_CONSUMO, PEDE_TOTAL
                        FROM PEDIDOS_DETALLE
                        WHERE PEDI_ID = :ID
                        ORDER BY PEDE_ITEM
                        INTO :ITEM, :ARTICULO, :CODBAR, :descaux, :CANT, :UNIDAD, :BODITEM, :LOTE, :REFERENCIA, :PRECIO, :DTOPORCIT, :DTOMONTOIT, :IVAPORCIT, :IVAMONTOIT, :CONSUMOIT, :SUBTOTALIT
                        DO
                         begin
                          if (STRLEN(descaux)> 60 ) then
                            ARTIDES = SUBSTR(descaux,1,60);
                          ELSE
                            ARTIDES = :descaux;
                         end
                        SUSPEND;
                    END
                END
            ELSE
                SUSPEND;
            END
        END
    END
  if (BIN_AND(TIPO, 16) <> 0) then
    BEGIN
    SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 35 INTO :NOMTIPO;
    FOR SELECT COTI_ID, C.PREF_PRE, COTI_NUMERO, COTI_FECHA, COTI_FECHA VENCE, '', '', '', C.PTVT_ID, PTVT_NOM, C.VEND_COD, VEND_NOMBRE, 0, 0, C.TERC_NIT, COTI_NOMTERC, '', '', '', COTI_DTOPORC, COTI_DTOMONTO, COTI_ADICIONAL, COTI_IVAMONTO, 0, 0, 0, 0, 0, 0, COTI_EXTRA, 0, 0, COTI_FECHA DTOF, COTI_TOTAL, COTI_ANULADO, SUBSTRING(COTI_OBS FROM 1 FOR 255)
        FROM COTIZACIONES C, PUNTO_VENTA P, VENDEDORES V, PREFIJOS PR WHERE C.PTVT_ID >= :PTOINI AND C.PTVT_ID <= :PTOFIN AND
         C.PTVT_ID = P.PTVT_ID AND C.VEND_COD = V.VEND_COD AND COTI_FECHA >= :FECINI AND COTI_FECHA <= :FECFIN
         AND PR.PREF_PRE = C.PREF_PRE AND PR.TIDO_COD = 35 AND ((PR.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) AND
         C.PREF_PRE >= :prefini AND C.PREF_PRE <= :preffin
        ORDER BY COTI_FECHA, COTI_ID
        INTO :ID, :PREF, :NUMERO, :FECHA, :VENCE, :CODBOD, :NOMBOD, :AUTORIZA, :PTVTID, :PTVTNOM, :VENDCOD, :VENDNOM, :COMIPORC, :COMIMONTO, :NIT, :NOMTERCERO, :PEDIDO, :COTIZACI, :REMISION, :DTOPOR, :DTOMONTO, :ADICIONAL, :IVAMONTO, :RTFTEPOR, :RTFTEMONTO, :RTIVAPOR, :RTIVAMONTO, :RTICAPOR, :RTICAMONTO, :EXTRA, :DTOFPOR, :DTOFMONTO, :DTOFFECHA, :TOTAL, :ANULADO, :OBS
        DO
        BEGIN
        if ((ANULADOS = 'S') or (ANULADO = 'N')) then
            BEGIN
            SELECT AUDI_FECHA, AUDI_HORA FROM AUDITORIA
                WHERE AUDI_IDDOC = :ID AND TIDO_COD = 35 AND AUDI_OPER = 'I' INTO :FECREG, :HORAREG;
            if (anulado = 'S') then
                BEGIN
                COMIPORC = 0;
                COMIMONTO = 0;
                DTOPOR = 0;
                DTOMONTO = 0;
                ADICIONAL = 0;
                IVAMONTO = 0;
                RTFTEPOR = 0;
                RTFTEMONTO = 0;
                RTIVAPOR = 0;
                RTIVAMONTO = 0;
                RTICAPOR = 0;
                RTICAMONTO = 0;
                EXTRA = 0;
                DTOFPOR = 0;
                DTOFMONTO = 0;
                TOTAL = 0;
                END
            if (DETALLE = 'S') then
                BEGIN
                if (anulado = 'S') then
                    BEGIN
                    ITEM = 0;
                    ARTICULO = '';
                    CODBAR = '';
                    ARTIDES = '';
                    CANT = 0;
                    UNIDAD = '';
                    BODITEM = '';
                    LOTE = '';
                    REFERENCIA = '';
                    PRECIO = 0;
                    DTOPORCIT = 0;
                    DTOMONTOIT = 0;
                    IVAPORCIT = 0;
                    IVAMONTOIT = 0;
                    CONSUMOIT = 0;
                    SUBTOTALIT = 0;
                    SUSPEND;
                    END
                ELSE
                    BEGIN
                    FOR SELECT CTDE_ITEM, ARTI_COD, CTDE_CODBAR, CTDE_DESC, CTDE_CANT, CTDE_UNIDAD, '', '', CTDE_REFERENCIA, CTDE_PRUNIT, CTDE_DTOPORC, CTDE_DTOMONTO, CTDE_IVAPORC, CTDE_IVAMONTO, CTDE_CONSUMO, CTDE_TOTAL
                        FROM COTIZACIONES_DETALLE
                        WHERE COTI_ID = :ID
                        ORDER BY CTDE_ITEM
                        INTO :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :BODITEM, :LOTE, :REFERENCIA, :PRECIO, :DTOPORCIT, :DTOMONTOIT, :IVAPORCIT, :IVAMONTOIT, :CONSUMOIT, :SUBTOTALIT
                        DO
                        SUSPEND;
                    END
                END
            ELSE
                SUSPEND;
            END
        END
    END
END
^

SET TERM ; ^



/* 20080920: REGISTRAR RECIBOS DE AUTORIZCIONES DE CONTADO QUE POR ALGUNA RAZON NO QUEDARON GRABADOS CON LA FACTURA */
SET TERM ^ ;

CREATE OR ALTER PROCEDURE REGISTRA_RECIBOS_CONTADO(
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    PREFAC VARCHAR(4),
    MONTO NUMERIC(18,2))
AS
declare variable id integer;
declare variable idr integer;
declare variable NIT VARCHAR(20);
declare variable punto integer;
declare variable caja integer;
declare variable vend integer;
begin
for select fact_id, f.pref_pre, fact_numero, fact_fecha, vend_cod, terc_nit, a.auto_prefrdc, ptvt_id from facturas f, autorizaciones a
    where f.pref_pre = a.pref_pre and a.auto_contado = 'S' and fact_fecha >= :fecini and fact_fecha <= :fecfin
    into :id, :prefac, :numero, :fecha, :vend, :NIT, :PREF, :punto
    do
    begin
    select caja_id from punto_venta where ptvt_id = :punto into :caja;
    execute procedure saldo_doc_cartera(31, :id, cast('now' as date)) returning_values (:monto);
    if (monto <> 0) then
        begin
        idr = gen_id(id_recicaja, 1);
        insert into recibos_caja (reca_id, caja_id, tido_cod, pref_pre, reca_numero, reca_fecha, reca_conc, reca_monto,
            reca_rtftemonto, reca_rtivamonto, reca_rticamonto, reca_dtof, reca_obs, terc_nit, reca_nomterc, reca_anulado,
            reca_transmit, cobr_cod, numok)
            values (:idr, :caja, 61, :pref, :numero, :fecha, 'CANCELA FACTURA CONTADO No. ' || :prefac || :numero,  :MONTO,
            0, 0, 0, 0, NULL, :NIT, 'VENTAS CONTADO', 'N', 'N', :vend, 'N');
        insert into recibos_caja_detalle (reca_id, rcde_item, rcde_tipodoc, rcde_iddoc, rcde_prefijo, rcde_numero, rcde_abono,
            rcde_rtfte, rcde_rtiva, rcde_rtica, rcde_dtof, rcde_anulado, rcde_transmit, rcde_comip, rcde_sucursal)
            values (:idr, 1, 31, :id, :prefac, :numero, :monto, 0, 0, 0, 0, 'N', 'N', '', '01');
        insert into recibos_caja_pago (reca_id, rcpa_item, fopa_id, rcpa_banco, rcpa_cuenta, rcpa_numero, rcpa_fecha, rcpa_monto,
            rcpa_anulado, rcpa_transmit, rcpa_ivamonto)
            values (:idr, 1, 1, null, null, null, :fecha, :monto, 'N', 'N', 0);
        suspend;
        end
    end
end
^

SET TERM ; ^



/* 20080922: VALIDAR CUPO DE CREDITO OPCIONAL AL IR DIGITANDO, SI NO, SE VALIDA SOLO AL PRESIONAR F2 PARA PERMITIR ABONAR DE CONTADO SIN MOLESTAR */

INSERT INTO CONFIGURACION (CONF_MODULO, CONF_CATEGORIA, CONF_PROPIEDAD, CONF_VALOR, CONF_POSIBLES, CONF_AYUDA) VALUES ('FACTURACION', 'FACTURAS', 'VERIFICAR CUPO DE CREDITO AL AGREGAR ITEMS', 'NO', 'SI,NO', 'SI: Por cada item que se agrega a la factura se va verificando el cupo de crédito disponible. NO: Solo se verifica el cupo de crédito al grabar la factura, permite hacer recibo antes de grabar para poder registrar.');
INSERT INTO CONFIGURACION (CONF_MODULO, CONF_CATEGORIA, CONF_PROPIEDAD, CONF_VALOR, CONF_POSIBLES, CONF_AYUDA) VALUES ('FACTURACION', 'PEDIDOS', 'VERIFICAR CUPO DE CREDITO AL AGREGAR ITEMS', 'NO', 'SI,NO', 'SI: Por cada item que se agrega a la factura se va verificando el cupo de crédito disponible. NO: Solo se verifica el cupo de crédito al grabar la factura, permite hacer recibo antes de grabar para poder registrar.');
commit work;


/* 20080923: NOMBRE DEL TERCERO ORIGINAL  Y CODIGO DE SUCURSAL COMO DATOS IMPRIMIBLES EN LA FACTURA */
SET TERM ^ ;

CREATE OR ALTER PROCEDURE IMPR_FACTURA(
    ID INTEGER)
RETURNS (
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    VENCE DATE,
    DIASVENCE INTEGER,
    CONTCRED CHAR(17),
    NIT VARCHAR(20),
    NOMTERCERO VARCHAR(60),
    NOMCLIENTE VARCHAR(60),
    VENDEDOR INTEGER,
    NOMVENDEDOR VARCHAR(60),
    PUNTOVTA INTEGER,
    NOMPUNTOVTA VARCHAR(30),
    CODBODEGA VARCHAR(2),
    NOMBODEGA VARCHAR(30),
    AUTORIZACION VARCHAR(20),
    DESPACHO VARCHAR(255),
    TRANSPORTADOR VARCHAR(60),
    COTIZACION VARCHAR(30),
    PEDIDO VARCHAR(30),
    REMISION VARCHAR(30),
    PACIENTE VARCHAR(20),
    NOMPACIENTE VARCHAR(60),
    COMIPORC NUMERIC(9,2),
    COMIMONTO NUMERIC(18,2),
    SUBTOTAL NUMERIC(18,2),
    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),
    EXTRA NUMERIC(18,2),
    DTOFPORC NUMERIC(9,2),
    DTOFMONTO NUMERIC(18,2),
    FECHADTO DATE,
    TOTALFAC NUMERIC(18,2),
    TOTALPAGAR NUMERIC(18,2),
    OBS BLOB SUB_TYPE 1 SEGMENT SIZE 80,
    ITEM INTEGER,
    ARTICULO VARCHAR(15),
    CODBAR VARCHAR(15),
    ARTIDES VARCHAR(60),
    CANT NUMERIC(18,4),
    LOTE VARCHAR(15),
    VLOTE DATE,
    UNIDAD VARCHAR(8),
    CAJAS NUMERIC(18,4),
    FACTOR INTEGER,
    LISTAPR INTEGER,
    REFITEM VARCHAR(60),
    BODITEM VARCHAR(2),
    PRUNIT NUMERIC(18,2),
    DTOITPORC NUMERIC(9,2),
    DTOITMONTO NUMERIC(18,2),
    PRNETO NUMERIC(18,2),
    IVAPORC NUMERIC(9,2),
    IVAITMONTO NUMERIC(18,2),
    CONSUMO NUMERIC(18,2),
    SUBTOTIT NUMERIC(18,2),
    SUBTOTITCON NUMERIC(18,2),
    DTOIT1 NUMERIC(9,2),
    DTOIT2 NUMERIC(9,2),
    DTOIT3 NUMERIC(9,2),
    TOTAL NUMERIC(18,2),
    CODIGOCL VARCHAR(20),
    ZONACOD VARCHAR(2),
    ZONANOM VARCHAR(60),
    DV CHAR(1),
    DIRECCION VARCHAR(60),
    CIUDAD VARCHAR(40),
    TELEFONO VARCHAR(40),
    CONTACTO VARCHAR(60),
    FAX VARCHAR(25),
    GRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    SUBGRUPO VARCHAR(3),
    NOMSUBG VARCHAR(30),
    MARCA VARCHAR(3),
    NOMMARCA VARCHAR(30),
    PESO NUMERIC(18,4),
    ANCHO NUMERIC(18,4),
    ALTO NUMERIC(18,4),
    LARGO NUMERIC(18,4),
    SUMA1 NUMERIC(18,2),
    SUMA2 NUMERIC(18,2),
    SUMA3 NUMERIC(18,2),
    IVA1 NUMERIC(18,2),
    IVA2 NUMERIC(18,2),
    IVA3 NUMERIC(18,2),
    SUMAEX NUMERIC(18,2),
    SUMAGR NUMERIC(18,2),
    TOTCONSUMO NUMERIC(18,2),
    DTOIT1M NUMERIC(18,2),
    DTOIT2M NUMERIC(18,2),
    DTOIT3M NUMERIC(18,2),
    TOTCAJAS NUMERIC(18,2),
    VEHICULO VARCHAR(8),
    RECIBIDO NUMERIC(18,2),
    CAMBIO NUMERIC(18,2),
    HORA TIME,
    FORMAPAGO1 VARCHAR(30),
    MONTOPAGO1 NUMERIC(18,2),
    FORMAPAGO2 VARCHAR(30),
    MONTOPAGO2 NUMERIC(18,2),
    FORMAPAGO3 VARCHAR(30),
    MONTOPAGO3 NUMERIC(18,2),
    PUNTOS INTEGER,
    PUNTOSACUM INTEGER,
    PUNTOSVENC INTEGER,
    OBSITEM BLOB SUB_TYPE 1 SEGMENT SIZE 80,
    SUCUR VARCHAR(10))
AS
DECLARE VARIABLE IMPTOS CHAR(1);
DECLARE VARIABLE TARIFA INTEGER;
declare variable DEVUELTO NUMERIC(18,2);
/*DECLARE VARIABLE NROCOPIA INTEGER;*/
declare variable ORDENCOD CHAR(2);
declare variable IMPRDEV CHAR(2);
declare variable IMPR CHAR(1);
declare variable ITEMFP INTEGER;
declare variable FORMAP VARCHAR(30);
declare variable MONTOP NUMERIC(18,2);
BEGIN
  SELECT F.PREF_PRE, FACT_NUMERO, FACT_FECHA, FACT_VENCE, F.BODE_COD, BODE_NOM, F.TERC_NIT, FACT_NOMCLIENTE, F.VEND_COD, VEND_NOMBRE, F.PTVT_ID, PTVT_NOM,
    AUTO_NUMERO, FACT_DESPACHO, FACT_TRANSP, FACT_COTIZACI, FACT_PEDIDO, FACT_REMISION, FACT_COMIPORC, FACT_COMIMONTO, FACT_IVAINC, 
    FACT_DTOPOR, FACT_DTOMONTO, FACT_ADICIONAL, FACT_IVAMONTO, FACT_RTFTEPOR, FACT_RTFTEMONTO, FACT_RTIVAPOR, FACT_RTIVAMONTO, FACT_RTICAPOR, FACT_RTICAMONTO, FACT_EXTRA, FACT_DTOFPOR, FACT_DTOFMONTO, FACT_DTOFFECHA, FACT_TOTAL,
    TERC_DIR, TERC_CIU, TERC_TEL, TERC_CONTACTO, TERC_FAX, TERC_DV, FACT_DTOIT1, FACT_DTOIT2, FACT_DTOIT3,
    FACT_OBS, VEHI_COD, /*FACT_NROCOPIA,*/ FACT_RECIBIDO, FACT_SUCURSAL, FACT_DETCLI, FACT_DETCLINOM, TERC_NOM
    FROM FACTURAS F, BODEGA B, VENDEDORES V, PUNTO_VENTA P, TERCEROS T
    WHERE F.BODE_COD = B.BODE_COD AND F.VEND_COD = V.VEND_COD AND F.PTVT_ID = P.PTVT_ID AND F.TERC_NIT = T.TERC_NIT AND F.FACT_ID = :ID
    into :PREF, :NUMERO, :FECHA, :VENCE, :CODBODEGA, :NOMBODEGA, :NIT, :NOMTERCERO, :VENDEDOR, :NOMVENDEDOR, :PUNTOVTA, :NOMPUNTOVTA,
    :AUTORIZACION, :DESPACHO, :TRANSPORTADOR, :COTIZACION, :PEDIDO, :REMISION, :COMIPORC, :COMIMONTO, :IMPTOS,
    :DTOPORC, :DTOMONTO, :ADICIONAL, :IVAMONTO, :RTEFTEPORC, :RTEFTEMONTO, :RTEIVAPORC, :RTEIVAMONTO, :RTEICAPORC, :RTEICAMONTO, :EXTRA, :DTOFPORC, :DTOFMONTO, :FECHADTO, :TOTALFAC,
    :DIRECCION, :CIUDAD, :TELEFONO, :CONTACTO, :FAX, :DV, :dtoit1m, :dtoit2m, :dtoit3m,
    :OBS, :VEHICULO,/* :NROCOPIA,*/ :RECIBIDO, :SUCUR, :paciente, :nompaciente, :nomcliente;

  /* ACUMULE LOS PUNTOS, SE HACE ACA POR SER POSTERIOR AL DETALLE */
  EXECUTE PROCEDURE acumula_puntos_cliente (31, :id, :nit, :fecha) returning_values (:PUNTOS);
  EXECUTE PROCEDURE consulta_puntos_cliente (:id, :nit, :fecha) returning_values (:puntos, :puntosacum, :puntosvenc);

  SELECT CLIE_COD, C.ZONA_COD, ZONA_NOM
    FROM CLIENTES C, ZONAS Z
    WHERE TERC_NIT = :NIT AND C.ZONA_COD = Z.ZONA_COD
    INTO :CODIGOCL, :ZONACOD, :ZONANOM;
  /*SELECT NOCO_NOMBRE FROM NOMBRES_COPIAS where NOCO_ID = :NROCOPIA INTO :NOMCOPIA;*/
  SELECT CLSU_DIR, CLSU_CIUDAD, CLSU_TEL FROM CLIENTE_SUCURSALES WHERE TERC_NIT = :NIT AND CLCU_COD = :SUCUR
    INTO :DIRECCION, :CIUDAD, :TELEFONO;
  /*if (NOMCOPIA IS NULL) then
    NOMCOPIA = 'COPIA No. ' || NROCOPIA;**/
  DIASVENCE = VENCE - FECHA;
  if (DIASVENCE > 0) then
    CONTCRED = 'CREDITO ' || CAST(DIASVENCE AS VARCHAR(3)) || ' DIAS';
  ELSE
    CONTCRED = 'CONTADO';
  SUBTOTAL = TOTALFAC - EXTRA - IVAMONTO - ADICIONAL + DTOMONTO;
  TOTALPAGAR = TOTALFAC - RTEFTEMONTO - RTEIVAMONTO - RTEICAMONTO;
  if (RECIBIDO <> 0) then
      CAMBIO = RECIBIDO - totalpagar;
  ELSE
    CAMBIO = 0;
  SUMAEX = 0;
  SUMA1 = 0;
  SUMA2 = 0;
  SUMA3 = 0;
  IVA1 = 0;
  IVA2 = 0;
  IVA3 = 0;
  TOTCONSUMO = 0;
  MONTOPAGO1 = 0;
  SELECT MAX(AUDI_HORA) FROM AUDITORIA WHERE TIDO_COD = 31 AND AUDI_IDDOC = :ID AND AUDI_OPER = 'I' INTO :HORA;
  /* AHORA LAS FORMAS DE PAGO, BUSQUE EL ABONO DE HOY A LA FACTURA */
  ITEMFP = 1;
  MONTOPAGO1 = 0;
  MONTOPAGO2 = 0;
  MONTOPAGO3 = 0;
  FOR SELECT FOPA_NOM, RCPA_MONTO FROM RECIBOS_CAJA_PAGO P, FORMAS_PAGO F, RECIBOS_CAJA R, RECIBOS_CAJA_DETALLE D
    WHERE R.RECA_ID = P.RECA_ID AND R.RECA_ID = D.RECA_ID AND P.FOPA_ID = F.FOPA_ID AND RECA_FECHA = :FECHA AND RCDE_TIPODOC = 31 AND RCDE_IDDOC = :ID
    INTO :formap, :MONTOP
    DO
    BEGIN
    if (ITEMFP = 1) then
        BEGIN
        FORMAPAGO1 = FORMAP;
        MONTOPAGO1 = MONTOP;
        END
    if (ITEMFP = 2) then
        BEGIN
        FORMAPAGO2 = FORMAP;
        MONTOPAGO2 = MONTOP;
        END
    if (ITEMFP = 3) then
        BEGIN
        FORMAPAGO3 = FORMAP;
        MONTOPAGO3 = MONTOP;
        END
    ITEMFP = ITEMFP + 1;
    END
  EXECUTE PROCEDURE lee_configuracion ('FACTURACION','DOCUMENTOS','ORDENAR ITEMS POR CODIGO DE ARTICULO') returning_values (:ORDENCOD);
  EXECUTE PROCEDURE lee_configuracion ('FACTURACION','POS', 'IMPRIMIR DEVOLUCIONES DE ARTICULOS NEGATIVOS') returning_values (:imprdev);
  totcajas = 0;
  if (ORDENCOD = 'SI') then
    BEGIN
    FOR SELECT FADE_ITEM, D.ARTI_COD, FADE_CODBAR, SUBSTR(FADE_DESC,1,60), FADE_CANT, FADE_UNIDAD, FADE_FACTOR, BODE_COD, FADE_LOTE, LIPR_COD, FADE_PRUNIT, FADE_DTOPORC, FADE_DTOMONTO, FADE_IVAPORC, FADE_IVAMONTO, FADE_CONSUMO, FADE_TOTAL, FADE_REFERENCIA,
        GRUP_COD, SUBG_COD, MARC_COD, ARTI_PESO, ARTI_ANCHO, ARTI_ALTO, ARTI_LARGO, TAIV_COD, FADE_DEVUELTO, FADE_OBS, FADE_DTO1, FADE_DTO2, FADE_DTO3, FADE_CAJAS
        FROM FACTURAS_DETALLE D, ARTICULO A
        WHERE D.ARTI_COD = A.ARTI_COD AND D.FACT_ID = :ID
        ORDER BY D.ARTI_COD
        INTO :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :FACTOR, :BODITEM, :LOTE, :LISTAPR, :PRUNIT, :DTOITPORC, :DTOITMONTO, :IVAPORC, :IVAITMONTO, :CONSUMO, :TOTAL, :refitem,
        :GRUPO, :SUBGRUPO, :MARCA, :PESO, :ANCHO, :ALTO, :LARGO, :TARIFA, :devuelto, :obsitem, :dtoit1, :dtoit2, :dtoit3, :cajas
        DO
          BEGIN
          if (ARTICULO = CODBAR) then
            SELECT FIRST 1 COBA_COD FROM barras_articulo WHERE ARTI_COD = :articulo INTO :CODBAR;
          if (IMPRDEV <> 'SI') then
            BEGIN
            if ((CANT >= 0) AND (DEVUELTO = 0)) then
                IMPR = 'S';
            ELSE
                IMPR = 'N'; /* ES DEVOLUCION */
            END
          ELSE
            IMPR = 'S';
          if (IMPR = 'S') then
            BEGIN
            if (IMPTOS = 'S') then
                if (cant <> 0) then
                    PRNETO = PRUNIT - DTOITMONTO - ((IVAITMONTO+CONSUMO) / CANT);
                else
                    PRNETO = PRUNIT - DTOITMONTO;
            ELSE
                PRNETO = PRUNIT - DTOITMONTO;
            SUBTOTIT = TOTAL - IVAITMONTO - CONSUMO;
            SUBTOTITCON = TOTAL;
            TOTCONSUMO = TOTCONSUMO + CONSUMO;
            SELECT LOTE_VENCE FROM LOTES WHERE LOTE_NRO = :lote AND ARTI_COD = :ARTICULO AND BODE_COD = :boditem INTO :vlote;
            if (TARIFA = 0) then
                SUMAEX = SUMAEX + TOTAL;
            if (TARIFA = 1) then
                BEGIN
                SUMA1 = SUMA1 + TOTAL - IVAITMONTO;
                IVA1 = IVA1 + IVAITMONTO;
                END
            if (TARIFA = 2) then
                BEGIN
                SUMA2 = SUMA2 + TOTAL - IVAITMONTO;
                IVA2 = IVA2 + IVAITMONTO;
                END
            if (TARIFA = 3) then
                BEGIN
                SUMA3 = SUMA3 + TOTAL - IVAITMONTO;
                IVA3 = IVA3 + IVAITMONTO;
                END
            SUMAGR = SUMA1 + SUMA2 + SUMA3;
            if (IMPTOS = 'N') then
                TOTAL = TOTAL - IVAITMONTO - CONSUMO;
            if (ANCHO IS NULL) then
                ANCHO = 0;
            if (ALTO IS NULL) then
                ALTO = 0;
            if (LARGO IS NULL) then
                LARGO = 0;
            if (PESO IS NULL) then
                PESO = 0;
            PESO = PESO * CANT;
            totcajas = totcajas + cajas;
            SUSPEND;
            END
          END
    END
ELSE
    BEGIN
    FOR SELECT FADE_ITEM, D.ARTI_COD, FADE_CODBAR, SUBSTR(FADE_DESC,1,60), FADE_CANT, FADE_UNIDAD, FADE_FACTOR, BODE_COD, FADE_LOTE, LIPR_COD, FADE_PRUNIT, FADE_DTOPORC, FADE_DTOMONTO, FADE_IVAPORC, FADE_IVAMONTO, FADE_CONSUMO, FADE_TOTAL, FADE_REFERENCIA,
        GRUP_COD, SUBG_COD, MARC_COD, ARTI_PESO, ARTI_ANCHO, ARTI_ALTO, ARTI_LARGO, TAIV_COD, FADE_DEVUELTO, FADE_OBS, FADE_DTO1, FADE_DTO2, FADE_DTO3, FADE_CAJAS
        FROM FACTURAS_DETALLE D, ARTICULO A
        WHERE D.ARTI_COD = A.ARTI_COD AND D.FACT_ID = :ID
        ORDER BY FADE_ITEM
        INTO :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :FACTOR, :BODITEM, :LOTE, :LISTAPR, :PRUNIT, :DTOITPORC, :DTOITMONTO, :IVAPORC, :IVAITMONTO, :CONSUMO, :TOTAL, :refitem, 
        :GRUPO, :SUBGRUPO, :MARCA, :PESO, :ANCHO, :ALTO, :LARGO, :TARIFA, :devuelto, :obsitem, :dtoit1, :dtoit2, :dtoit3, :cajas
        DO
          BEGIN
          if (IMPRDEV <> 'SI') then
            BEGIN
            if ((CANT >= 0) AND (DEVUELTO = 0)) then
                IMPR = 'S';
            ELSE
                IMPR = 'N'; /* ES DEVOLUCION */
            END
          ELSE
            IMPR = 'S';
          if (IMPR = 'S') then
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :GRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :MARCA INTO NOMMARCA;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :SUBGRUPO AND GRUP_COD = :GRUPO INTO :NOMSUBG;
            if (IMPTOS = 'S') then
              PRNETO = PRUNIT - DTOITMONTO - ((IVAITMONTO+CONSUMO) / CANT);
            ELSE
              PRNETO = PRUNIT - DTOITMONTO;
            SUBTOTIT = TOTAL - IVAITMONTO - CONSUMO;
            SUBTOTITCON = TOTAL;
            TOTCONSUMO = TOTCONSUMO + CONSUMO;
            SELECT LOTE_VENCE FROM LOTES WHERE LOTE_NRO = :lote AND ARTI_COD = :ARTICULO AND BODE_COD = :boditem INTO :vlote;
            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;
            if (ANCHO IS NULL) then
                ANCHO = 0;
            if (ALTO IS NULL) then
                ALTO = 0;
            if (LARGO IS NULL) then
                LARGO = 0;
            if (PESO IS NULL) then
                PESO = 0;
            PESO = PESO * CANT;
            totcajas = totcajas + cajas;
            SUSPEND;
            END
          END
    END
END
^

SET TERM ; ^



/* 20080924: AVISE EL NUMERO DEL DOCUMENTO QUE CAUSA LA EXCEPCION DE ABONO MAYOR */
SET TERM ^ ;

CREATE OR ALTER TRIGGER APLICACION_CLIENTE_DETALLE_AI FOR APLICACION_CLIENTE_DETALLE
ACTIVE AFTER INSERT POSITION 0
AS
declare variable EXISTE CHAR(1);
declare variable FEC DATE;
declare variable NIT VARCHAR(20);
declare variable CONCEPTO VARCHAR(60);
declare variable PREFIJO VARCHAR(4);
declare variable NUMERO VARCHAR(6);
declare variable SALDO NUMERIC(18,2);
declare variable RETES CHAR(2);
declare variable SUCURSAL VARCHAR(10);
declare variable COBR INTEGER;
BEGIN
if ((NEW.APCL_ID <> 0) and (new.acde_anulado = 'N')) then
    BEGIN
    /* Abone el documento referenciado */
    select PREF_PRE, APCL_NUMERO, apcl_fecha, APCL_CONCEPTO, TERC_NIT, APCL_SUCURSAL, COBR_COD
        from aplicacion_cliente where apcl_id = new.apcl_id
        into :PREFIJO, :NUMERO, :FEC, :CONCEPTO, :NIT, :SUCURSAL, :COBR;
    /* valide que no se pase del saldo */
    execute procedure saldo_doc_cartera(new.acde_tipodoc, new.acde_iddoc, '9999/12/31') returning_values(saldo);
    execute procedure lee_configuracion('CARTERA', 'SALDOS', 'DESCONTAR RETENCIONES POR CAUSACION') returning_values (RETES);
    if (SALDO < 0) then
        BEGIN
        if (RETES = 'SI') then
            begin
            if (saldo > NEW.acde_aplicado) then
                EXCEPTION DOCUMENTO_ABONO_MAYOR 'EL SALDO DEL DOCUMENTO ' || NEW.acde_prefijo || NEW.acde_numero || ' ES INSUFICIENTE.';
            end
        ELSE
            begin
            if (saldo > (NEW.acde_aplicado + NEW.acde_rtfte + NEW.acde_rtiva + NEW.acde_rtica)) then
                EXCEPTION DOCUMENTO_ABONO_MAYOR 'EL SALDO DEL DOCUMENTO ' || NEW.acde_prefijo || NEW.acde_numero || ' ES INSUFICIENTE.';
            end
        END
    else
        BEGIN
        if (RETES = 'SI') then
            begin
            if (saldo < NEW.acde_aplicado) then
                EXCEPTION DOCUMENTO_ABONO_MAYOR 'EL SALDO DEL DOCUMENTO ' || NEW.acde_prefijo || NEW.acde_numero || ' ES INSUFICIENTE.';
            end
        ELSE
            begin
            if (saldo < (NEW.acde_aplicado + NEW.acde_rtfte + NEW.acde_rtiva + NEW.acde_rtica)) then
                EXCEPTION DOCUMENTO_ABONO_MAYOR 'EL SALDO DEL DOCUMENTO ' || NEW.acde_prefijo || NEW.acde_numero || ' ES INSUFICIENTE.';
            end
        END
    select 'S' from saldos_doc_cartera where sdca_tiporef = new.acde_tipodoc and sdca_idref = new.acde_iddoc and sdca_fecha = :FEC into :EXISTE;
    if (Existe = 'S') then
        begin
        /* actualice el saldo del dia */
        UPDATE saldos_doc_cartera
            SET SDCA_ABONO = SDCA_ABONO + NEW.acde_aplicado,
                SDCA_ABRTFTE = SDCA_ABRTFTE + NEW.acde_RTFTE,
                SDCA_ABRTIVA = SDCA_ABRTIVA + NEW.acde_RTIVA,
                SDCA_ABRTICA = SDCA_ABRTICA + NEW.acde_RTICA
            WHERE SDCA_TIPOREF = NEW.ACDE_TIPODOC AND SDCA_IDREF = NEW.acde_IDDOC AND SDCA_FECHA = :FEC;
        END
    ELSE
        BEGIN
        /* Inserte un nuevo saldo diario */
        INSERT INTO SALDOS_DOC_CARTERA (SDCA_TIPOREF, SDCA_IDREF, SDCA_FECHA, TERC_NIT, SDCA_RTFTE, SDCA_RTIVA, SDCA_RTICA, SDCA_ABONO, SDCA_ABRTFTE, SDCA_ABRTIVA, SDCA_ABRTICA, SDCA_DEBITO, SDCA_MONTO)
            VALUES (NEW.ACDE_TIPODOC, NEW.ACDE_IDDOC, :FEC, :NIT, 0, 0, 0, NEW.acde_aplicado, NEW.acde_rtfte, NEW.acde_rtiva, NEW.acde_rtica, 'N', 0);
        END
    /* actualice el registro en mov_cliente (por si son varios items) */
    EXISTE = 'N';
    SELECT 'S' FROM MOVIMIENTO_CLIENTES WHERE MVCL_TIPOREF = 43 AND MVCL_IDREF = NEW.APCL_ID INTO :EXISTE;
    if (EXISTE = 'S') then
        begin
        UPDATE movimiento_clientes
            SET MVCL_MONTO = MVCL_MONTO + NEW.acde_aplicado,
                MVCL_RTEFTE = MVCL_RTEFTE + NEW.acde_rtfte,
                MVCL_RTEIVA = MVCL_RTEIVA + NEW.acde_rtiva,
                MVCL_RTEICA = MVCL_RTEICA + NEW.acde_rtica
            WHERE MVCL_TIPOREF = 43 AND MVCL_IDREF = NEW.APCL_ID;
        end
    ELSE
        INSERT INTO MOVIMIENTO_CLIENTES (MVCL_ID, TERC_NIT, MVCL_TIPOREF, MVCL_IDREF, MVCL_FECHA, MVCL_VENCE, MVCL_CONC, MVCL_MONTO, MVCL_RTEFTE, MVCL_RTEIVA, MVCL_RTEICA, MVCL_DEBITO, MVCL_ABONO, MVCL_PREFREF, MVCL_NUMREF, MVCL_SUCURSAL, COBR_COD)
            VALUES (GEN_ID(ID_MOVCLI, 1), :NIT, 43, NEW.APCL_ID, :FEC, :FEC, :CONCEPTO, NEW.ACDE_APLICADO, NEW.ACDE_RTFTE, NEW.ACDE_RTIVA, NEW.ACDE_RTICA, 'N', 'S', :PREFIJO, :NUMERO, :SUCURSAL, :COBR);
    end
END
^

SET TERM ; ^


SET TERM ^ ;

CREATE OR ALTER TRIGGER RECIBOS_CAJA_DETALLE_AI FOR RECIBOS_CAJA_DETALLE
ACTIVE AFTER INSERT POSITION 0
AS
declare variable EXISTE CHAR(1);
declare variable FEC DATE;
declare variable NIT VARCHAR(20);
declare variable CONCEPTO VARCHAR(60);
declare variable PREFIJO VARCHAR(4);
declare variable NUMERO VARCHAR(6);
declare variable SALDO NUMERIC(18,2);
declare variable RETES CHAR(2);
declare variable OK CHAR(1);
declare variable RCANTI INTEGER;
declare variable COBR INTEGER;
declare variable ACUMULA CHAR(2);
declare variable DIASMAX INTEGER;
declare variable FACTOR NUMERIC(9,4);
declare variable FACTORD NUMERIC(9,4);
declare variable DIAS INTEGER;
declare variable FECDOC DATE;
BEGIN
if ((NEW.RECA_ID <> 0) and (new.rcde_anulado = 'N')) then
    BEGIN
    /* Abone el documento referenciado */
    select PREF_PRE, RECA_NUMERO, RECA_fecha, RECA_CONC, TERC_NIT, COBR_COD from RECIBOS_CAJA
        where RECA_id = new.RECA_id into :PREFIJO, :NUMERO, :FEC, :CONCEPTO, :NIT, :COBR;
    OK = 'N';
    if (new.RCDE_TIPODOC = 45) then
        BEGIN
        /* BUSQUE SI TIENE RECA_ID, SI NO LO ACTUALIZA */
        SELECT RECA_ID FROM ANTICIPOS_CLIENTE WHERE ANCL_ID = NEW.RCDE_IDDOC INTO :RCANTI;
        if (RCANTI = 0) then
            BEGIN
            OK = 'S';
            UPDATE ANTICIPOS_CLIENTE SET RECA_ID = NEW.RECA_ID WHERE ANCL_ID = NEW.RCDE_IDDOC;
            END
        END
    if (OK = 'N') then
        BEGIN
        /* valide que no se pase del saldo */
        execute procedure saldo_doc_cartera(new.rcde_tipodoc, new.rcde_iddoc, '9999/12/31') returning_values(saldo);
        execute procedure lee_configuracion('CARTERA', 'SALDOS', 'DESCONTAR RETENCIONES POR CAUSACION') returning_values (RETES);
        if (SALDO < 0) then
            BEGIN
            if (RETES = 'SI') then
                begin
                if (saldo > (NEW.rcde_abono + NEW.rcde_dtof)) then
                    EXCEPTION DOCUMENTO_ABONO_MAYOR 'EL SALDO DEL DOCUMENTO ' || NEW.rcde_prefijo || NEW.rcde_numero || ' ES INSUFICIENTE.';
                end
            ELSE
                begin
                if (saldo > (NEW.rcde_abono + NEW.rcde_rtfte + NEW.rcde_rtiva + NEW.rcde_rtica + NEW.rcde_dtof)) then
                    EXCEPTION DOCUMENTO_ABONO_MAYOR 'EL SALDO DEL DOCUMENTO ' || NEW.rcde_prefijo || NEW.rcde_numero || ' ES INSUFICIENTE.';
                end
            END
        else
            BEGIN
            if (RETES = 'SI') then
                begin
                if (saldo < (NEW.rcde_abono + NEW.rcde_dtof)) then
                    EXCEPTION DOCUMENTO_ABONO_MAYOR 'EL SALDO DEL DOCUMENTO ' || NEW.rcde_prefijo || NEW.rcde_numero || ' ES INSUFICIENTE.';
                end
            ELSE
                begin
                if (saldo < (NEW.rcde_abono + NEW.rcde_rtfte + NEW.rcde_rtiva + NEW.rcde_rtica + NEW.rcde_dtof)) then
                    EXCEPTION DOCUMENTO_ABONO_MAYOR 'EL SALDO DEL DOCUMENTO ' || NEW.rcde_prefijo || NEW.rcde_numero || ' ES INSUFICIENTE.';
                end
            END
        EXISTE = 'N';
        select 'S' from saldos_doc_cartera where sdca_tiporef = new.rcde_tipodoc and sdca_idref = new.rcde_iddoc and sdca_fecha = :FEC into :EXISTE;
        if (Existe = 'S') then
            begin
            /* actualice el saldo del dia */
            UPDATE saldos_doc_cartera
                SET SDCA_ABONO = SDCA_ABONO + NEW.rcde_abono + new.rcde_dtof,
                SDCA_ABRTFTE = SDCA_ABRTFTE + NEW.rcde_RTFTE,
                SDCA_ABRTIVA = SDCA_ABRTIVA + NEW.rcde_RTIVA,
                SDCA_ABRTICA = SDCA_ABRTICA + NEW.rcde_RTICA
                WHERE SDCA_TIPOREF = NEW.RCDE_TIPODOC AND SDCA_IDREF = NEW.rcde_IDDOC AND SDCA_FECHA = :FEC;
            END
        ELSE
            BEGIN
            /* Inserte un nuevo saldo diario */
            INSERT INTO SALDOS_DOC_CARTERA (SDCA_TIPOREF, SDCA_IDREF, SDCA_FECHA, TERC_NIT, SDCA_RTFTE, SDCA_RTIVA, SDCA_RTICA, SDCA_ABONO, SDCA_ABRTFTE, SDCA_ABRTIVA, SDCA_ABRTICA, SDCA_DEBITO, SDCA_MONTO)
                VALUES (NEW.RCDE_TIPODOC, NEW.RCDE_IDDOC, :FEC, :NIT, 0, 0, 0, (NEW.rcde_abono+NEW.rcde_dtof), NEW.rcde_rtfte, NEW.rcde_rtiva, NEW.rcde_rtica, 'N', 0);
            END
        END
    /* actualice el registro en mov_cliente (por si son varios items) */
    EXISTE = 'N';
    SELECT 'S' FROM MOVIMIENTO_CLIENTES WHERE MVCL_TIPOREF = 61 AND MVCL_IDREF = NEW.RECA_ID AND MVCL_SUCURSAL = NEW.rcde_sucursal INTO :EXISTE;
    if (EXISTE = 'S') then
        begin
        UPDATE movimiento_clientes
            SET MVCL_MONTO = MVCL_MONTO + NEW.rcde_abono + NEW.rcde_dtof,
                MVCL_RTEFTE = MVCL_RTEFTE + NEW.rcde_rtfte,
                MVCL_RTEIVA = MVCL_RTEIVA + NEW.rcde_rtiva,
                MVCL_RTEICA = MVCL_RTEICA + NEW.rcde_rtica
            WHERE MVCL_TIPOREF = 61 AND MVCL_IDREF = NEW.RECA_ID AND MVCL_SUCURSAL = NEW.rcde_sucursal;
        end
    ELSE
        INSERT INTO MOVIMIENTO_CLIENTES (MVCL_ID, TERC_NIT, MVCL_TIPOREF, MVCL_IDREF, MVCL_FECHA, MVCL_VENCE, MVCL_CONC, MVCL_MONTO, MVCL_RTEFTE, MVCL_RTEIVA, MVCL_RTEICA, MVCL_DEBITO, MVCL_ABONO, MVCL_PREFREF, MVCL_NUMREF, MVCL_SUCURSAL, COBR_COD)
            VALUES (GEN_ID(ID_MOVCLI, 1), :NIT, 61, NEW.RECA_ID, :FEC, :FEC, :CONCEPTO, (NEW.RCDE_ABONO+NEW.RCDE_DTOF), NEW.RCDE_RTFTE, NEW.RCDE_RTIVA, NEW.RCDE_RTICA, 'N', 'S', :PREFIJO, :NUMERO, NEW.rcde_sucursal, :COBR);

    /* acumule los puntos del vendedor */
    SELECT MVCL_FECHA FROM MOVIMIENTO_CLIENTES WHERE MVCL_TIPOREF = new.rcde_tipodoc AND MVCL_IDREF = new.rcde_iddoc
        INTO :FECDOC;
    if (FECDOC IS NOT NULL) then
        DIAS = FEC - FECDOC;
    else
        DIAS = 999;
    execute procedure lee_configuracion('FACTURACION', 'FACTURAS', 'ACUMULAR PUNTOS DE VENTAS POR VENDEDOR') returning_values (ACUMULA);
    execute procedure lee_configuracion('FACTURACION', 'FACTURAS', 'DIAS DE RECAUDO MAXIMO PARA ACUMULAR PUNTOS AL VENDEDOR') returning_values (DIASMAX);
    if ((acumula = 'SI') and (diasmax >= dias)) then
        begin
        SELECT COPU_FACTOR FROM comisiones_puntos WHERE COPU_COD = NEW.rcde_comip INTO :FACTOR;
        if ((NEW.rcde_tipodoc = 31) or (NEW.rcde_tipodoc = 41)) then
            begin
            /* recorra la factura acumulando los puntos */
            if (new.rcde_tipodoc = 31) then
                select (fact_total-fact_ivamonto)/fact_total from facturas where fact_id = new.rcde_iddoc into :factord;
            if (new.rcde_tipodoc = 41) then
                select ndcl_monto/(ndcl_monto+ndcl_ivamonto) from notas_debito_clientes where ndcl_id = new.rcde_iddoc into :factord;
            /* inserte el registro de puntos */
            insert into puntos_vendedor (vend_cod, ptvt_fecha, ptvt_tipodoc, ptvt_iddoc, ptvt_db, ptvt_cr)
                values (:cobr, :fec, new.rcde_tipodoc, new.rcde_iddoc, (new.rcde_abono*:factord*:factor), 0);
            end
        if ((new.rcde_tipodoc = 33) or (new.rcde_tipodoc = 42)) then
            begin
            if (new.rcde_tipodoc = 33) then
                select (devt_total-devt_ivamonto)/devt_total from devoluciones_ventas where devt_id = new.rcde_iddoc into :factord;
            if (new.rcde_tipodoc = 42) then
                select nccl_monto/(nccl_monto+nccl_ivamonto) from notas_credito_clientes where nccl_id = new.rcde_iddoc into :factord;
            /* inserte el registro de puntos */
            insert into puntos_vendedor (vend_cod, ptvt_fecha, ptvt_tipodoc, ptvt_iddoc, ptvt_db, ptvt_cr)
                values (:cobr, :fec, new.rcde_tipodoc, new.rcde_iddoc, 0, (new.rcde_abono*:factord*:factor));
            end
        end
    end
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER EGRESOS_DETALLE_AI FOR EGRESOS_DETALLE
ACTIVE AFTER INSERT POSITION 0
AS
declare variable EXISTE CHAR(1);
declare variable FEC DATE;
declare variable CONC VARCHAR(60);
declare variable NIT VARCHAR(20);
declare variable CONCEPTO VARCHAR(60);
declare variable PREFIJO VARCHAR(4);
declare variable NUMERO VARCHAR(6);
declare variable OK CHAR(1);
declare variable EGANTI INTEGER;
declare variable RETES CHAR(2);
declare variable SALDO NUMERIC(18,2);
BEGIN
  if ((NEW.EGRE_ID <> 0) and (new.egde_anulado = 'N')) then
    BEGIN
    OK = 'N';
    if (new.EGDE_TIPODOC = 55) then
        BEGIN
        /* BUSQUE SI TIENE EGRE_ID, SI NO LO ACTUALIZA */
        SELECT EGRE_ID FROM ANTICIPOS_PROVEEDOR WHERE ANPR_ID = NEW.EGDE_IDDOC INTO :EGANTI;
        if (EGANTI = 0) then
            BEGIN
            OK = 'S';
            UPDATE ANTICIPOS_PROVEEDOR SET EGRE_ID = NEW.EGRE_ID WHERE ANPR_ID = NEW.EGDE_IDDOC;
            END
        END
    /* Abone el documento referenciado en EGRESOS_DETALLE */
    select PREF_PRE, EGRE_NUMERO, EGRE_FECHA, EGRE_CONC, TERC_NIT
        from EGRESOS where EGRE_ID = new.EGRE_ID into :PREFIJO, :NUMERO, :FEC, :CONCEPTO, :NIT;
    /* valide que no se pase del saldo */
    execute procedure saldo_doc_cxpagar(new.egde_tipodoc, new.egde_iddoc, '9999/12/31') returning_values(saldo);
    execute procedure lee_configuracion('CXPAGAR', 'SALDOS', 'DESCONTAR RETENCIONES POR CAUSACION') returning_values (RETES);
    if (SALDO < 0) then
        BEGIN
        if (RETES = 'SI') then
            begin
            if (saldo > NEW.egde_abono) then
                EXCEPTION DOCUMENTO_ABONO_MAYOR 'EL SALDO DEL DOCUMENTO ' || NEW.egde_prefijo || NEW.egde_numero || ' ES INSUFICIENTE.';
            end
        ELSE
            begin
            if (saldo > (NEW.egde_abono + NEW.egde_rtfte + NEW.egde_rtiva + NEW.egde_rtica + new.egde_dtof)) then
                EXCEPTION DOCUMENTO_ABONO_MAYOR 'EL SALDO DEL DOCUMENTO ' || NEW.egde_prefijo || NEW.egde_numero || ' ES INSUFICIENTE.';
            end
        END
    else
        BEGIN
        if (RETES = 'SI') then
            begin
            if (saldo < NEW.egde_abono) then
                EXCEPTION DOCUMENTO_ABONO_MAYOR 'EL SALDO DEL DOCUMENTO ' || NEW.egde_prefijo || NEW.egde_numero || ' ES INSUFICIENTE.';
            end
        ELSE
            begin
            if (saldo < (NEW.egde_abono + NEW.egde_rtfte + NEW.egde_rtiva + NEW.egde_rtica + NEW.egde_dtof)) then
                EXCEPTION DOCUMENTO_ABONO_MAYOR 'EL SALDO DEL DOCUMENTO ' || NEW.egde_prefijo || NEW.egde_numero || ' ES INSUFICIENTE.';
            end
        END
    if (OK = 'N') then
        BEGIN
        select 'S' from saldos_doc_cxpagar where sdcp_tiporef = new.egde_tipodoc and
            sdcp_idref = new.egde_iddoc and sdcp_fecha = :FEC into :EXISTE;
        if (Existe = 'S') then
            begin
            /* actualice el saldo del dia */
            UPDATE saldos_doc_cxpagar
                SET SDCP_ABONO = SDCP_ABONO + (NEW.egde_abono + NEW.egde_dtof),
                    SDCP_ABRTFTE = SDCP_ABRTFTE + NEW.egde_RTFTE,
                    SDCP_ABRTIVA = SDCP_ABRTIVA + NEW.egde_RTIVA,
                    SDCP_ABRTICA = SDCP_ABRTICA + NEW.egde_RTICA
                WHERE SDCP_TIPOREF = NEW.EGDE_TIPODOC AND SDCP_IDREF = NEW.egde_IDDOC AND SDCP_FECHA = :FEC;
            END
        ELSE
            BEGIN
            /* Inserte un nuevo saldo diario */
            INSERT INTO SALDOS_DOC_CXPAGAR (SDCP_TIPOREF, SDCP_IDREF, SDCP_FECHA, TERC_NIT, SDCP_RTEFTE, SDCP_RTIVA, SDCP_RTICA, SDCP_ABONO, SDCP_ABRTFTE, SDCP_ABRTIVA, SDCP_ABRTICA, SDCP_DEBITO, SDCP_MONTO)
                VALUES (NEW.EGDE_TIPODOC, NEW.EGDE_IDDOC, :FEC, :NIT, 0, 0, 0, (NEW.egde_abono+NEW.egde_dtof), NEW.egde_rtfte, NEW.egde_rtiva, NEW.egde_rtica, 'N', 0);
            END
        END
    /* actualice el registro en mov_proveedor (por si son varios items) */
    EXISTE = 'N';
    SELECT 'S' FROM MOVIMIENTO_PROVEEDOR WHERE MVPR_TIPOREF = 62 AND MVPR_IDREF = NEW.EGRE_ID INTO :EXISTE;
    if (EXISTE = 'S') then
        begin
        UPDATE movimiento_proveedor
            SET MVPR_MONTO = MVPR_MONTO + (NEW.egde_abono + NEW.egde_dtof),
                MVPR_RTFTE = MVPR_RTFTE + NEW.egde_rtfte,
                MVPR_RTIVA = MVPR_RTIVA + NEW.egde_rtiva,
                MVPR_RTICA = MVPR_RTICA + NEW.egde_rtica
            WHERE MVPR_TIPOREF = 62 AND MVPR_IDREF = NEW.EGRE_ID;
        end
    ELSE
        INSERT INTO MOVIMIENTO_PROVEEDOR (MVPR_ID, TERC_NIT, MVPR_TIPOREF, MVPR_IDREF, MVPR_FECHA, MVPR_VENCE, MVPR_CONC, MVPR_MONTO, MVPR_RTFTE, MVPR_RTIVA, MVPR_RTICA, MVPR_DEBITO, MVPR_ABONO, MVPR_PREFIJO, MVPR_NUMERO)
            VALUES (GEN_ID(ID_MOVPROV, 1), :NIT, 62, NEW.EGRE_ID, :FEC, :FEC, :CONCEPTO, (NEW.EGDE_ABONO+NEW.egde_dtof), NEW.EGDE_RTFTE, NEW.EGDE_RTIVA, NEW.EGDE_RTICA, 'N', 'S', :PREFIJO, :NUMERO);
    END
END
^

SET TERM ; ^


/* 20080925: recalcular precios de productos al hacer ensambles */
SET TERM ^ ;

CREATE OR ALTER TRIGGER ENSAMBLES_AI FOR ENSAMBLES
ACTIVE AFTER INSERT POSITION 0
AS
declare variable COSTO NUMERIC(18,2);
BEGIN
if ((NEW.ENSA_id <> 0) and (new.ensa_anulado = 'N')) then
  begin
  COSTO = new.ensa_costo / NEW.ensa_factor;
  INSERT INTO MOVIMIENTO_ARTICULO
    (ARTI_COD, MVAR_CONS, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM)
    VALUES(NEW.ARTI_COD, GEN_ID(ID_MOVARTI,1), new.bode_cod, new.ensa_fecha, 15, NEW.ensa_id,
    new.ensa_conc, NEW.ensa_factor * new.ensa_cant, :COSTO, 'S', new.ensa_lote, new.pref_pre, new.ensa_numero, 0);

  /* RECORRA LAS LISTAS DE PRECIOS Y CAMBIE EL PRECIO */
  EXECUTE PROCEDURE CALCULA_PRECIOS(NEW.ARTI_COD, new.ensa_fecha);

  INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
    VALUES (USER, 15, NEW.ensa_id, 'I', NEW.pref_pre || NEW.ensa_numero);
  end
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER ENSAMBLES_AU FOR ENSAMBLES
ACTIVE AFTER UPDATE POSITION 0
AS
declare variable COSTO NUMERIC(18,2);
declare variable consec INTEGER;
BEGIN
/* BORRE LA CONTABILIZACION */
if (NEW.ensa_anulado = 'S') then
    BEGIN
    select enco_consec from comprobante_encabezado where enco_tiporef = 15 and enco_idref = old.ensa_id into :consec;
    if (NOT consec is null) then
     delete from comprobante_detalle where enco_consec = :consec;
    delete from comprobante_encabezado where enco_tiporef = 15 and enco_idref = old.ensa_id;
    INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
        VALUES (USER, 15, NEW.ensa_id, 'A', NEW.pref_pre || NEW.ensa_numero);
    END

/* BORRE EL ANTERIOR Y GRABE EL NUEVO */
if ((OLD.ensa_id <> 0) AND (OLD.ensa_anulado = 'N')) then
    begin
    delete from movimiento_articulo where (mvar_tipodoc = 15) and (mvar_idref = old.ensa_id) and (mvar_item = 0);
    end
if ((new.ensa_id <> 0) AND (NEW.ensa_anulado = 'N')) then
    begin
    COSTO = new.ensa_costo / NEW.ensa_factor;
    INSERT INTO MOVIMIENTO_ARTICULO
        (ARTI_COD, MVAR_CONS, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM)
        VALUES(NEW.ARTI_COD, GEN_ID(ID_MOVARTI,1), new.bode_cod, new.ensa_fecha, 15, NEW.ensa_id,
        new.ensa_conc, NEW.ensa_factor * new.ensa_cant, :COSTO, 'S', new.ensa_lote, new.pref_pre, new.ensa_numero, 0);

    /* RECORRA LAS LISTAS DE PRECIOS Y CAMBIE EL PRECIO */
    EXECUTE PROCEDURE CALCULA_PRECIOS(NEW.ARTI_COD, new.ensa_fecha);

    INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
        VALUES (USER, 15, NEW.ensa_id, 'U', NEW.pref_pre || NEW.ensa_numero);
    end
/* SI CAMBIO LA FECHA ACTUALICE LOS DETALLES */
if ((OLD.pref_pre <> NEW.pref_pre) or
    (OLD.ensa_numero <> NEW.ensa_numero) or
    (OLD.ensa_fecha <> NEW.ensa_fecha) ) then
    UPDATE ENSAMBLES_DETALLE SET ESDE_TRANSMIT = 'N' WHERE ENSA_ID = OLD.ENSA_ID;

if (OLD.ensa_anulado <> NEW.ensa_anulado) then
    UPDATE ENSAMBLES_DETALLE SET ESDE_ANULADO = NEW.ensa_anulado WHERE ENSA_ID = OLD.ENSA_ID;

if (OLD.ensa_transmit <> NEW.ensa_transmit) then
    UPDATE ENSAMBLES_DETALLE SET ESDE_TRANSMIT = NEW.ensa_transmit WHERE ENSA_ID = OLD.ENSA_ID;
END
^

SET TERM ; ^

/* recalcular precios de componentes al hacer desensambles */

SET TERM ^ ;

CREATE OR ALTER TRIGGER DESENSAMBLES_DETALLE_AI FOR DESENSAMBLES_DETALLE
ACTIVE AFTER INSERT POSITION 0
AS
declare variable fec date;
declare variable CONC VARCHAR(60);
declare variable factor numeric(18,4);
declare variable COSTO numeric(18,2);
declare variable Pref varchar(4);
declare variable Num varchar(6);
declare variable CANT NUMERIC(18,2);
declare variable CANTOT CHAR(2);
BEGIN
  if ((NEW.DESE_id <> 0) and (new.dede_anulado = 'N')) then
    begin
    select dese_fecha, dese_conc, pref_pre, dese_numero, dese_cant * dese_factor
        from desensambles where dese_id = new.dese_id into :fec, :conc, :Pref, :Num, :CANT;
    execute procedure factor_unidad_cant(new.arti_cod, new.dede_unidad) returning_values(factor);
    execute procedure costo_promedio(new.arti_cod, :FEC) returning_values (:COSTO);
    EXECUTE PROCEDURE LEE_CONFIGURACION('INVENTARIO', 'ENSAMBLES', 'FORMACIONES CON CANTIDADES TOTALES') returning_values (:CANTOT);
    if (CANTOT <> 'SI') then
        CANT = CANT * factor * new.dede_cant;
    ELSE
        CANT = factor * new.dede_cant;
    INSERT INTO MOVIMIENTO_ARTICULO
      (ARTI_COD, MVAR_CONS, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM)
      VALUES(NEW.ARTI_COD, GEN_ID(ID_MOVARTI,1), NEW.BODE_COD, :FEC, 16, NEW.dese_id,
      :CONC, :CANT, :COSTO, 'S', new.dede_lote, :Pref, :Num, new.dese_item);

    /* RECORRA LAS LISTAS DE PRECIOS Y CAMBIE EL PRECIO */
    EXECUTE PROCEDURE CALCULA_PRECIOS(NEW.ARTI_COD, :fec);
    END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER DESENSAMBLES_DETALLE_AU FOR DESENSAMBLES_DETALLE
ACTIVE AFTER UPDATE POSITION 0
AS
declare variable fec date;
declare variable CONC VARCHAR(60);
declare variable Pref varchar(4);
declare variable Num varchar(6);
declare variable factor numeric(18,4);
declare variable COSTO numeric(18,2);
declare variable CANT NUMERIC(18,2);
declare variable CANTOT CHAR(2);
BEGIN
/* Anule el anterior */
if ((OLD.DESE_ID <> 0) AND (OLD.dede_anulado = 'N')) then
    delete from movimiento_articulo where (mvar_tipodoc = 16) and (mvar_idref = old.DESE_id) and (mvar_item = old.dese_item);
if ((NEW.dese_id <> 0) AND (new.dede_anulado = 'N')) then
    BEGIN
    EXECUTE PROCEDURE LEE_CONFIGURACION('INVENTARIO', 'ENSAMBLES', 'FORMACIONES CON CANTIDADES TOTALES') returning_values (:CANTOT);
    select dese_fecha, dese_conc, pref_pre, dese_numero, dese_cant * dese_factor
        from desensambles where dese_id = new.dese_id into :fec, :conc, :Pref, :Num, :CANT;
    execute procedure factor_unidad_cant(new.arti_cod, new.dede_unidad) returning_values(factor);
    execute procedure costo_promedio(new.arti_cod, :FEC) returning_values (:COSTO);
    if (CANTOT <> 'SI') then
        CANT = CANT * factor * new.dede_cant;
    ELSE
        CANT = factor * new.dede_cant;
    INSERT INTO MOVIMIENTO_ARTICULO
        (ARTI_COD, MVAR_CONS, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM)
        VALUES(NEW.ARTI_COD, GEN_ID(ID_MOVARTI,1), NEW.BODE_COD, :FEC, 16, NEW.dese_id,
        :CONC, :CANT, :COSTO, 'S', new.dede_lote, :Pref, :Num, new.dese_item);

    /* RECORRA LAS LISTAS DE PRECIOS Y CAMBIE EL PRECIO */
    EXECUTE PROCEDURE CALCULA_PRECIOS(NEW.ARTI_COD, :fec);
    END
END
^

SET TERM ; ^


/* 20080930: COMISIONES COBRO MUY LENTO, BORRE EL INDICE POR TIPO + ID Y CREELO POR SEPARADO */
DROP INDEX MOVIMIENTO_CLIENTES_IDX1;
CREATE INDEX MOVIMIENTO_CLIENTES_IDX1
ON MOVIMIENTO_CLIENTES (MVCL_TIPOREF);
CREATE INDEX MOVIMIENTO_CLIENTES_IDX2
ON MOVIMIENTO_CLIENTES (MVCL_IDREF);

SET TERM ^ ;

CREATE OR ALTER PROCEDURE COMISIONES_COBRO(
    DESDE INTEGER,
    HASTA INTEGER,
    FECINI DATE,
    FECFIN DATE,
    DETALLE CHAR(1))
RETURNS (
    CODVEND INTEGER,
    NOMVEND VARCHAR(60),
    NIT VARCHAR(20),
    CLIENTE VARCHAR(60),
    NOMTIPO VARCHAR(8),
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(6),
    FECDOC DATE,
    PREFREC VARCHAR(4),
    NUMREC VARCHAR(6),
    FECREC DATE,
    DIAS INTEGER,
    ABONO NUMERIC(18,2),
    BASE NUMERIC(18,2),
    COMIMONTO NUMERIC(18,2),
    COMIPORC NUMERIC(9,2),
    ARTICULO VARCHAR(20),
    CODGRP VARCHAR(2),
    CANT NUMERIC(18,4),
    DTOFIN NUMERIC(18,2),
    VENCE DATE,
    RTFTE NUMERIC(18,2),
    RTIVA NUMERIC(18,2),
    RTICA NUMERIC(18,2))
AS
DECLARE VARIABLE TIPO INTEGER;
DECLARE VARIABLE ID INTEGER;
DECLARE VARIABLE IVAMONTO NUMERIC(18,2);
DECLARE VARIABLE TOTAL NUMERIC(18,2);
DECLARE VARIABLE SITOT CHAR(2);
DECLARE VARIABLE VENTA CHAR(2);
DECLARE VARIABLE COMIV NUMERIC(18,2);
DECLARE VARIABLE PORCV NUMERIC(18,2);
DECLARE VARIABLE CONSUMO NUMERIC(18,2);
declare variable ALFINAL CHAR(2);
declare variable SALDO NUMERIC(18,2);
declare variable COMISION VARCHAR(10);
declare variable porcaux NUMERIC(9,2);
declare variable BASEAUX DOUBLE PRECISION;
declare variable SUCURSAL VARCHAR(20);
declare variable vend integer;
BEGIN
EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION', 'VENDEDORES', 'COMISIONES EN VENTA INCLUYENDO IMPUESTOS') returning_values (:SITOT);
EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA','COMISIONES','COMISION POR COBRO PAGADERA SOLO EN EL COBRO TOTAL') returning_values (:ALFINAL);
execute procedure lee_configuracion('CARTERA','COMISIONES','COMISION POR COBRO COMO PORCENTAJE DE LA COMISION VENTA') returning_values (:venta);
EXECUTE PROCEDURE lee_configuracion('CARTERA', 'COMISIONES', 'LIQUIDAR COMISION COBRO CON COBRADOR DEL DOCUMENTO O DEL RECIBO') returning_values (:COMISION);
FOR SELECT RCDE_TIPODOC, RCDE_IDDOC, RCDE_PREFIJO, RCDE_NUMERO, R.TERC_NIT, TERC_NOM, RECA_FECHA, (RCDE_ABONO+RCDE_RTFTE+RCDE_RTIVA+RCDE_RTICA),
    PREF_PRE, RECA_NUMERO, R.COBR_COD, RCDE_DTOF, RCDE_RTFTE, RCDE_RTIVA, RCDE_RTICA, MVCL_FECHA, M.COBR_COD, MVCL_VENCE
    FROM RECIBOS_CAJA R, RECIBOS_CAJA_DETALLE RD, TERCEROS T, MOVIMIENTO_CLIENTES M
    WHERE R.RECA_ID = RD.RECA_ID AND RECA_FECHA >= :FECINI AND RECA_FECHA <= :FECFIN AND R.TERC_NIT = T.TERC_NIT AND RECA_ANULADO = 'N' AND
        M.MVCL_TIPOREF = RD.rcde_tipodoc AND M.MVCL_IDREF = RD.rcde_iddoc
    ORDER BY TERC_NIT, RECA_FECHA
    INTO :TIPO, :ID, :PREFIJO, :NUMERO, :NIT, :CLIENTE, :FECREC, :ABONO,
        :PREFREC, :NUMREC, :codvend, :DTOFIN, :rtfte, :RTIVA, :RTICA, :FECDOC, :vend, :VENCE
    DO
    BEGIN
    SELECT TIDO_NOMCORTO FROM TIPO_DOCUMENTO WHERE TIDO_COD = :TIPO INTO :nomtipo;
    if (COMISION = 'DOCUMENTO') then
        codvend = VEND;
    if (FECDOC IS NOT NULL) then
        DIAS = FECREC - FECDOC;
    ELSE
        DIAS = 999;
    if ((codvend >= :DESDE) AND (codvend <= :hasta)) then
        BEGIN
        /* TRAIGA EL PORCENTAJE DE ACUERDO A LOS DIAS */
        COMIPORC = 0;
        SELECT CMCB_PORC FROM COMISION_COBRO WHERE CMCB_DIASINI <= :dias AND CMCB_DIASFIN >= :DIAS AND COBR_COD = :CODVEND INTO :COMIPORC;
        if (COMIPORC IS NULL) THEN
            COMIPORC = 0;
        if (VENTA = 'NO') then
            BEGIN
            if (TIPO = 31) then
                BEGIN
                if (DETALLE = 'N') then
                    SELECT MAX(FACT_TOTAL), MAX(FACT_IVAMONTO), SUM(FADE_CONSUMO) FROM FACTURAS F, FACTURAS_DETALLE D
                        WHERE F.FACT_ID = D.FACT_ID AND F.FACT_ID = :ID INTO :TOTAL, :IVAMONTO, :CONSUMO;
                ELSE
                    FOR SELECT D.ARTI_COD, FADE_CANT, FADE_TOTAL, FADE_IVAMONTO, FADE_CONSUMO, GRUP_COD
                        FROM FACTURAS F, FACTURAS_DETALLE D, ARTICULO A
                        WHERE F.FACT_ID = D.FACT_ID AND D.arti_cod = A.arti_cod AND F.FACT_ID = :ID
                        INTO :ARTICULO, :CANT, :TOTAL, :IVAMONTO, :CONSUMO, :CODGRP
                        DO
                        BEGIN
                        if (SITOT = 'SI') then
                            BASEAUX = TOTAL;
                        ELSE
                            BASEAUX = (TOTAL - IVAMONTO - CONSUMO);
                        BASE = BASEAUX;
                        COMIMONTO = BASE / 100 * COMIPORC;
                        SUSPEND;
                        END
                END
            if (TIPO = 33) then
                if (DETALLE = 'N') then
                    SELECT MAX(DEVT_TOTAL*-1), MAX(DEVT_IVAMONTO*-1), SUM(DVDE_CONSUMO) FROM DEVOLUCIONES_VENTAS V, DEVOLUCIONES_VENTAS_DETALLE D
                        WHERE V.DEVT_ID = D.DEVT_ID AND V.DEVT_ID = :ID INTO :TOTAL, :IVAMONTO, :CONSUMO;
                ELSE
                    FOR SELECT D.ARTI_COD, DVDE_CANT, DVDE_TOTAL*-1, DVDE_IVAMONTO*-1, DVDE_CONSUMO*-1, GRUP_COD
                        FROM DEVOLUCIONES_VENTAS V, DEVOLUCIONES_VENTAS_DETALLE D, ARTICULO A
                        WHERE V.DEVT_ID = D.DEVT_ID AND D.arti_cod = A.arti_cod AND V.DEVT_ID = :ID
                        INTO :ARTICULO, :CANT, :TOTAL, :IVAMONTO, :CONSUMO, :codgrp
                        DO
                        BEGIN
                        if (SITOT = 'SI') then
                            BASEAUX = TOTAL;
                        ELSE
                            BASEAUX = TOTAL - IVAMONTO - CONSUMO;
                        BASE = BASEAUX;
                        COMIMONTO = BASE / 100 * COMIPORC;
                        SUSPEND;
                        END
            if (TIPO = 41) then
                SELECT NDCL_MONTO, NDCL_IVAMONTO, 0 FROM NOTAS_DEBITO_CLIENTES WHERE NDCL_ID = :ID INTO :TOTAL, :IVAMONTO, :CONSUMO;
            if (TIPO = 42) then
                SELECT NCCL_MONTO*-1, NCCL_IVAMONTO*-1, 0 FROM NOTAS_CREDITO_CLIENTES WHERE NCCL_ID = :ID INTO :TOTAL, :IVAMONTO, :CONSUMO;
            if (TIPO = 77) then
                SELECT DVCH_MONTO, 0, 0 FROM DEVOLUCION_CHEQUES WHERE DVCH_ID = :ID INTO :TOTAL, :IVAMONTO, :CONSUMO;
            if (SITOT = 'SI') then
                BASEAUX = ABONO;
            ELSE
                if ((TOTAL - IVAMONTO - CONSUMO) <> 0) then
                    BASEAUX = (ABONO / TOTAL) * (TOTAL - IVAMONTO - CONSUMO);
                ELSE
                    BASEAUX = 0;
            BASE = BASEAUX;
            COMIMONTO = BASE / 100 * COMIPORC;
            END
        ELSE
            BEGIN
            if (TIPO = 31) then
                if (DETALLE = 'N') then
                    SELECT MAX(FACT_TOTAL), MAX(FACT_IVAMONTO), MAX(FACT_COMIPORC), SUM(FADE_CONSUMO)
                        FROM FACTURAS F, FACTURAS_DETALLE D WHERE F.FACT_ID = D.FACT_ID AND F.FACT_ID = :ID
                        INTO :TOTAL, :IVAMONTO, :PORCV, :CONSUMO;
                ELSE
                    FOR SELECT D.ARTI_COD, FADE_CANT, FADE_TOTAL, FADE_IVAMONTO, FADE_CONSUMO, FACT_COMIPORC, GRUP_COD
                        FROM FACTURAS F, FACTURAS_DETALLE D, ARTICULO A
                        WHERE F.FACT_ID = D.FACT_ID AND D.arti_cod = A.arti_cod AND F.FACT_ID = :ID
                        INTO :ARTICULO, :CANT, :TOTAL, :IVAMONTO, :CONSUMO, :porcv, :codgrp
                        DO
                        BEGIN
                        if (SITOT = 'SI') then
                            BASEAUX = TOTAL;
                        ELSE
                            BASEAUX = (TOTAL - IVAMONTO - CONSUMO);
                        COMIV = PORCV * BASEAUX / 100;
                        COMIMONTO = COMIV / 100 * COMIPORC;
                        porcaux = comiporc;
                        comiporc = PORCV * COMIPORC / 100;
                        BASE = BASEAUX;
                        SUSPEND;
                        END
            if (TIPO = 33) then
                if (DETALLE = 'N') then
                    SELECT MAX(DEVT_TOTAL), MAX(DEVT_IVAMONTO), MAX(DEVT_COMIPORC), SUM(DVDE_CONSUMO)
                        FROM DEVOLUCIONES_VENTAS V, DEVOLUCIONES_VENTAS_DETALLE D WHERE V.DEVT_ID = D.DEVT_ID AND D.DEVT_ID = :ID
                        INTO :TOTAL, :IVAMONTO, :PORCV, :CONSUMO;
                ELSE
                    FOR SELECT D.ARTI_COD, DVDE_CANT, DVDE_TOTAL*-1, DVDE_IVAMONTO*-1, DVDE_CONSUMO*-1, DEVT_COMIPORC, GRUP_COD
                        FROM DEVOLUCIONES_VENTAS V, DEVOLUCIONES_VENTAS_DETALLE D, ARTICULO A
                        WHERE V.DEVT_ID = D.DEVT_ID AND D.arti_cod = A.arti_cod AND V.DEVT_ID = :ID
                        INTO :ARTICULO, :CANT, :TOTAL, :IVAMONTO, :CONSUMO, :porcv, :codgrp
                        DO
                        BEGIN
                        if (SITOT = 'SI') then
                            BASEAUX = TOTAL;
                        ELSE
                            BASEAUX = (TOTAL - IVAMONTO - CONSUMO);
                        COMIV = PORCV * BASEAUX / 100;
                        COMIMONTO = COMIV / 100 * COMIPORC;
                        porcaux = comiporc;
                        comiporc = PORCV * COMIPORC / 100;
                        BASE = BASEAUX;
                        SUSPEND;
                        END
            if (TIPO = 41) then
                SELECT NDCL_MONTO, NDCL_IVAMONTO, NDCL_COMIPORC, 0 FROM NOTAS_DEBITO_CLIENTES
                    WHERE NDCL_ID = :ID INTO :TOTAL, :IVAMONTO, :PORCV, :CONSUMO;
            if (TIPO = 42) then
                SELECT NCCL_MONTO, NCCL_IVAMONTO, NCCL_COMIPORC, 0  FROM NOTAS_CREDITO_CLIENTES
                    WHERE NCCL_ID = :ID INTO :TOTAL, :IVAMONTO, :PORCV, :CONSUMO;
            if (TIPO = 77) then
                SELECT DVCH_MONTO, 0, 0, 0 FROM DEVOLUCION_CHEQUES WHERE DVCH_ID = :ID INTO :TOTAL, :IVAMONTO, :PORCV, :CONSUMO;
            if (SITOT = 'SI') then
                BASEAUX = ABONO;
            ELSE
                if ((total <> 0) AND (ABONO <> 0)) then
                    BASEAUX = (TOTAL - IVAMONTO - CONSUMO) / TOTAL * ABONO;
                ELSE
                    BASEAUX = 0;
            COMIV = PORCV * BASEAUX / 100;
            COMIMONTO = COMIV / 100 * COMIPORC;
            porcaux = comiporc;
            comiporc = PORCV * COMIPORC / 100;
            BASE = BASEAUX;
            END
        select COBR_NOM from COBRADORES where COBR_COD = :codvend INTO :nomvend;
        if (DETALLE = 'N') then
            if (ALFINAL = 'SI') then
                BEGIN
                /* VERIFIQUE EL SALDO DEL DOCUMENTO, SI ES CERO LIQUIDE COMISION SOBRE EL TOTAL */
                EXECUTE PROCEDURE saldo_doc_cartera(:tipo, :ID, :FECREC) returning_values (:SALDO);
                if (SALDO = 0) then
                    BEGIN
                    if (VENTA = 'NO') then
                        begin
                        if (SITOT = 'SI') then
                            BASEAUX = TOTAL;
                        ELSE
                            BASEAUX = TOTAL - IVAMONTO - CONSUMO;
                        COMIMONTO = BASEAUX * COMIPORC / 100;
                        end
                    ELSE
                        BEGIN
                        if (SITOT = 'SI') then
                            BASEAUX = TOTAL;
                        ELSE
                            BASEAUX = TOTAL - IVAMONTO - CONSUMO;
                        COMIV = PORCV * BASEAUX / 100;
                        COMIMONTO = COMIV / 100 * porcaux;
                        comiporc = PORCV * porcaux / 100;
                        END
                    BASE = BASEAUX;
                    SUSPEND;
                    END
                END
            ELSE
                SUSPEND;
        ELSE
            if ((TIPO <> 31) AND (TIPO <> 33)) then
                SUSPEND;
        END
    END
FOR SELECT EGCC_TIPODOC, EGCC_IDDOC, EGCC_PREFIJO, EGCC_NUMERO, E.TERC_NIT, TERC_NOM, EGRE_FECHA, (EGCC_ABONO+EGCC_RTFTE+EGCC_RTIVA+EGCC_RTICA), PREF_PRE, EGRE_NUMERO, EGCC_SUCURSAL
    FROM EGRESOS E, EGRESOS_CRUCEC C, TERCEROS T
    WHERE E.EGRE_ID = C.EGRE_ID AND EGRE_FECHA >= :FECINI AND EGRE_FECHA <= :FECFIN AND E.TERC_NIT = T.TERC_NIT AND EGRE_ANULADO = 'N'
    ORDER BY TERC_NIT, EGRE_FECHA
    INTO :TIPO, :ID, :PREFIJO, :NUMERO, :NIT, :CLIENTE, :FECREC, :ABONO, :PREFREC, :NUMREC, :SUCURSAL
    DO
    BEGIN
    SELECT COBR_COD FROM cliente_sucursales WHERE TERC_NIT = :NIT AND CLCU_COD = :sucursal INTO :codvend;
    SELECT TIDO_NOMCORTO FROM TIPO_DOCUMENTO WHERE TIDO_COD = :TIPO INTO :NOMTIPO;
    if (COMISION = 'DOCUMENTO') then
        SELECT MVCL_FECHA, COBR_COD, MVCL_VENCE FROM MOVIMIENTO_CLIENTES WHERE MVCL_TIPOREF = :TIPO AND MVCL_IDREF = :ID
            INTO :FECDOC, :codvend, :VENCE;
    else
        SELECT MVCL_FECHA, MVCL_VENCE FROM MOVIMIENTO_CLIENTES WHERE MVCL_TIPOREF = :TIPO AND MVCL_IDREF = :ID
            INTO :FECDOC, :VENCE;
    if (FECDOC IS NOT NULL) then
        DIAS = FECREC - FECDOC;
    ELSE
        DIAS = 999;
    if ((codvend >= :DESDE) AND (codvend <= :hasta)) then
        BEGIN
        /* TRAIGA EL PORCENTAJE DE ACUERDO A LOS DIAS */
        COMIPORC = 0;
        SELECT CMCB_PORC FROM COMISION_COBRO WHERE CMCB_DIASINI <= :dias AND CMCB_DIASFIN >= :DIAS AND COBR_COD = :CODVEND INTO :COMIPORC;
        if (COMIPORC IS NULL) THEN
            COMIPORC = 0;
        if (VENTA = 'NO') then
            BEGIN
            if (TIPO = 31) then
                BEGIN
                if (DETALLE = 'N') then
                    SELECT MAX(FACT_TOTAL), MAX(FACT_IVAMONTO), SUM(FADE_CONSUMO) FROM FACTURAS F, FACTURAS_DETALLE D
                        WHERE F.FACT_ID = D.FACT_ID AND F.FACT_ID = :ID INTO :TOTAL, :IVAMONTO, :CONSUMO;
                ELSE
                    FOR SELECT D.ARTI_COD, FADE_CANT, FADE_TOTAL, FADE_IVAMONTO, FADE_CONSUMO, GRUP_COD
                        FROM FACTURAS F, FACTURAS_DETALLE D, ARTICULO A
                        WHERE F.FACT_ID = D.FACT_ID AND D.arti_cod = A.arti_cod AND F.FACT_ID = :ID
                        INTO :ARTICULO, :CANT, :TOTAL, :IVAMONTO, :CONSUMO, :CODGRP
                        DO
                        BEGIN
                        if (SITOT = 'SI') then
                            BASEAUX = TOTAL;
                        ELSE
                            BASEAUX = (TOTAL - IVAMONTO - CONSUMO);
                        BASE = BASEAUX;
                        COMIMONTO = BASE / 100 * COMIPORC;
                        SUSPEND;
                        END
                END
            if (TIPO = 33) then
                if (DETALLE = 'N') then
                    SELECT MAX(DEVT_TOTAL*-1), MAX(DEVT_IVAMONTO*-1), SUM(DVDE_CONSUMO) FROM DEVOLUCIONES_VENTAS V, DEVOLUCIONES_VENTAS_DETALLE D
                        WHERE V.DEVT_ID = D.DEVT_ID AND V.DEVT_ID = :ID INTO :TOTAL, :IVAMONTO, :CONSUMO;
                ELSE
                    FOR SELECT D.ARTI_COD, DVDE_CANT, DVDE_TOTAL*-1, DVDE_IVAMONTO*-1, DVDE_CONSUMO*-1, GRUP_COD
                        FROM DEVOLUCIONES_VENTAS V, DEVOLUCIONES_VENTAS_DETALLE D, ARTICULO A
                        WHERE V.DEVT_ID = D.DEVT_ID AND D.arti_cod = A.arti_cod AND V.DEVT_ID = :ID
                        INTO :ARTICULO, :CANT, :TOTAL, :IVAMONTO, :CONSUMO, :codgrp
                        DO
                        BEGIN
                        if (SITOT = 'SI') then
                            BASEAUX = TOTAL;
                        ELSE
                            BASEAUX = TOTAL - IVAMONTO - CONSUMO;
                        BASE = BASEAUX;
                        COMIMONTO = BASE / 100 * COMIPORC;
                        SUSPEND;
                        END
            if (TIPO = 41) then
                SELECT NDCL_MONTO, NDCL_IVAMONTO, 0 FROM NOTAS_DEBITO_CLIENTES WHERE NDCL_ID = :ID INTO :TOTAL, :IVAMONTO, :CONSUMO;
            if (TIPO = 42) then
                SELECT NCCL_MONTO*-1, NCCL_IVAMONTO*-1, 0 FROM NOTAS_CREDITO_CLIENTES WHERE NCCL_ID = :ID INTO :TOTAL, :IVAMONTO, :CONSUMO;
            if (TIPO = 77) then
                SELECT DVCH_MONTO, 0, 0 FROM DEVOLUCION_CHEQUES WHERE DVCH_ID = :ID INTO :TOTAL, :IVAMONTO, :CONSUMO;
            if (SITOT = 'SI') then
                BASEAUX = ABONO;
            ELSE
                if ((TOTAL - IVAMONTO - CONSUMO) <> 0) then
                    BASEAUX = (ABONO / TOTAL) * (TOTAL - IVAMONTO - CONSUMO);
                ELSE
                    BASEAUX = 0;
            BASE = BASEAUX;
            COMIMONTO = BASE / 100 * COMIPORC;
            END
        ELSE
            BEGIN
            if (TIPO = 31) then
                if (DETALLE = 'N') then
                    SELECT MAX(FACT_TOTAL), MAX(FACT_IVAMONTO), MAX(FACT_COMIPORC), SUM(FADE_CONSUMO)
                        FROM FACTURAS F, FACTURAS_DETALLE D WHERE F.FACT_ID = D.FACT_ID AND F.FACT_ID = :ID
                        INTO :TOTAL, :IVAMONTO, :PORCV, :CONSUMO;
                ELSE
                    FOR SELECT D.ARTI_COD, FADE_CANT, FADE_TOTAL, FADE_IVAMONTO, FADE_CONSUMO, FACT_COMIPORC, GRUP_COD
                        FROM FACTURAS F, FACTURAS_DETALLE D, ARTICULO A
                        WHERE F.FACT_ID = D.FACT_ID AND D.arti_cod = A.arti_cod AND F.FACT_ID = :ID
                        INTO :ARTICULO, :CANT, :TOTAL, :IVAMONTO, :CONSUMO, :porcv, :codgrp
                        DO
                        BEGIN
                        if (SITOT = 'SI') then
                            BASEAUX = TOTAL;
                        ELSE
                            BASEAUX = (TOTAL - IVAMONTO - CONSUMO);
                        COMIV = PORCV * BASEAUX / 100;
                        COMIMONTO = COMIV / 100 * COMIPORC;
                        porcaux = comiporc;
                        comiporc = PORCV * COMIPORC / 100;
                        BASE = BASEAUX;
                        SUSPEND;
                        END
            if (TIPO = 33) then
                if (DETALLE = 'N') then
                    SELECT MAX(DEVT_TOTAL), MAX(DEVT_IVAMONTO), MAX(DEVT_COMIPORC), SUM(DVDE_CONSUMO)
                        FROM DEVOLUCIONES_VENTAS V, DEVOLUCIONES_VENTAS_DETALLE D WHERE V.DEVT_ID = D.DEVT_ID AND D.DEVT_ID = :ID
                        INTO :TOTAL, :IVAMONTO, :PORCV, :CONSUMO;
                ELSE
                    FOR SELECT D.ARTI_COD, DVDE_CANT, DVDE_TOTAL*-1, DVDE_IVAMONTO*-1, DVDE_CONSUMO*-1, DEVT_COMIPORC, GRUP_COD
                        FROM DEVOLUCIONES_VENTAS V, DEVOLUCIONES_VENTAS_DETALLE D, ARTICULO A
                        WHERE V.DEVT_ID = D.DEVT_ID AND D.arti_cod = A.arti_cod AND V.DEVT_ID = :ID
                        INTO :ARTICULO, :CANT, :TOTAL, :IVAMONTO, :CONSUMO, :porcv, :codgrp
                        DO
                        BEGIN
                        if (SITOT = 'SI') then
                            BASEAUX = TOTAL;
                        ELSE
                            BASEAUX = (TOTAL - IVAMONTO - CONSUMO);
                        COMIV = PORCV * BASEAUX / 100;
                        COMIMONTO = COMIV / 100 * COMIPORC;
                        porcaux = comiporc;
                        comiporc = PORCV * COMIPORC / 100;
                        BASE = BASEAUX;
                        SUSPEND;
                        END
            if (TIPO = 41) then
                SELECT NDCL_MONTO, NDCL_IVAMONTO, NDCL_COMIPORC, 0 FROM NOTAS_DEBITO_CLIENTES
                    WHERE NDCL_ID = :ID INTO :TOTAL, :IVAMONTO, :PORCV, :CONSUMO;
            if (TIPO = 42) then
                SELECT NCCL_MONTO, NCCL_IVAMONTO, NCCL_COMIPORC, 0  FROM NOTAS_CREDITO_CLIENTES
                    WHERE NCCL_ID = :ID INTO :TOTAL, :IVAMONTO, :PORCV, :CONSUMO;
            if (TIPO = 77) then
                SELECT DVCH_MONTO, 0, 0, 0 FROM DEVOLUCION_CHEQUES WHERE DVCH_ID = :ID INTO :TOTAL, :IVAMONTO, :PORCV, :CONSUMO;
            if (SITOT = 'SI') then
                BASEAUX = ABONO;
            ELSE
                if ((total <> 0) AND (ABONO <> 0)) then
                    BASEAUX = (TOTAL - IVAMONTO - CONSUMO) / TOTAL * ABONO;
                ELSE
                    BASEAUX = 0;
            COMIV = PORCV * BASEAUX / 100;
            COMIMONTO = COMIV / 100 * COMIPORC;
            porcaux = comiporc;
            comiporc = PORCV * COMIPORC / 100;
            BASE = BASEAUX;
            END
        select COBR_NOM from COBRADORES where COBR_COD = :codvend INTO :nomvend;
        if (DETALLE = 'N') then
            if (ALFINAL = 'SI') then
                BEGIN
                /* VERIFIQUE EL SALDO DEL DOCUMENTO, SI ES CERO LIQUIDE COMISION SOBRE EL TOTAL */
                EXECUTE PROCEDURE saldo_doc_cartera(:tipo, :ID, :FECREC) returning_values (:SALDO);
                if (SALDO = 0) then
                    BEGIN
                    if (VENTA = 'NO') then
                        begin
                        if (SITOT = 'SI') then
                            BASEAUX = TOTAL;
                        ELSE
                            BASEAUX = TOTAL - IVAMONTO - CONSUMO;
                        COMIMONTO = BASEAUX * COMIPORC / 100;
                        end
                    ELSE
                        BEGIN
                        if (SITOT = 'SI') then
                            BASEAUX = TOTAL;
                        ELSE
                            BASEAUX = TOTAL - IVAMONTO - CONSUMO;
                        COMIV = PORCV * BASEAUX / 100;
                        COMIMONTO = COMIV / 100 * porcaux;
                        comiporc = PORCV * porcaux / 100;
                        END
                    BASE = BASEAUX;
                    SUSPEND;
                    END
                END
            ELSE
                SUSPEND;
        ELSE
            if ((TIPO <> 31) AND (TIPO <> 33)) then
                SUSPEND;
        END
    END
FOR SELECT 'DEVOCHEQ', DVCH_MONTO*-1, DVCH_FECHA, PRBA_PREF, DVCH_NUMDOC, DVCH_FECHA, D.TERC_NIT, DVCH_NOMTERC, '', '', D.COBR_COD
    FROM DEVOLUCION_CHEQUES D, CLIENTES C
    WHERE DVCH_FECHA >= :FECINI AND DVCH_FECHA <= :FECFIN AND D.TERC_NIT = C.TERC_NIT AND D.COBR_COD = :CODVEND
    INTO :NOMTIPO, :BASE, :FECDOC, :PREFIJO, :NUMERO, :FECREC, :NIT, :CLIENTE, :PREFREC, :NUMREC, :codvend
    DO
    BEGIN
    COMIPORC = 0;
    COMIMONTO = 0;
    VENCE = fecdoc;
    RTFTE = 0;
    RTIVA = 0;
    RTICA = 0;
    DTOFIN = 0;
    if ((codvend >= :DESDE) AND (codvend <= :hasta)) then
        BEGIN
        select COBR_NOM from COBRADORES where COBR_COD = :codvend INTO :nomvend;
        /* SELECT CMCB_PORC FROM COMISION_COBRO WHERE CMCB_DIASINI <= 1 AND CMCB_DIASFIN >= 1 AND COBR_COD = :CODVEND INTO :COMIPORC;
        if (COMIPORC IS NULL) THEN
            COMIPORC = 0;
        COMIMONTO = BASE * COMIPORC / 100; */
        SUSPEND;
        END
    END
END
^

SET TERM ; ^


/* 2008093OB */
SET TERM ^ ;

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

SET TERM ; ^

SET TERM ^ ;

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

SET TERM ; ^

SET TERM ^ ;

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

SET TERM ; ^

SET TERM ^ ;

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

^

SET TERM ; ^

SET TERM ^ ;

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

^

SET TERM ; ^

SET TERM ^ ;

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

/* si hay pedido automatico saque una copia de la consolidacion */
EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION', 'FACTURAS', 'GENERAR PEDIDO AUTOMATICAMENTE CON LA FACTURA') returning_values (pedauto);
if (PEDAUTO = 'SI') then
    begin
    IDC = gen_id(id_cons,1);
    for select cefa_item, cefa_idori from consolide_faltantes where cefa_id = new.revt_consolida
        into :item, :idf
        do
        begin
        SELECT PEDI_ID FROM PEDIDOS P, FACTURAS F WHERE P.PREF_PRE = F.pref_pre AND P.pedi_numero = F.fact_numero AND F.fact_id = :IDF INTO :IDP;
        insert into consolide_faltantes (cefa_id, cefa_item, cefa_tipodes, cefa_tipoori, cefa_idori)
            VALUES(:IDC, :item, 32, 34, :IDP);
        end
    EXECUTE PROCEDURE consolide_pendientes (:IDC);
    NEW.lipr_cod = :IDC;
    end
END
^

SET TERM ; ^

/* 20081009: OVERFLOW AL USAR DIMENSIONES DE ARTICULOS, SE CONVIRTIO DE CM3 A M3 */
SET TERM ^ ;

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

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER PROCEDURE IMPR_SALIDA(
    ID INTEGER)
RETURNS (
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    CONCEPTO VARCHAR(60),
    REFER VARCHAR(60),
    CODBODEGA VARCHAR(2),
    NOMBODEGA VARCHAR(30),
    NOMTERCERO VARCHAR(60),
    OBS BLOB SUB_TYPE 0 SEGMENT SIZE 80,
    ITEM INTEGER,
    ARTICULO VARCHAR(15),
    CODBAR VARCHAR(15),
    ARTIDES VARCHAR(60),
    CANT NUMERIC(18,4),
    UNIDAD VARCHAR(8),
    BODITEM VARCHAR(2),
    COSTO NUMERIC(18,2),
    IVAPORC NUMERIC(9,2),
    IVAMONTO NUMERIC(18,2),
    CONSUMO NUMERIC(18,2),
    TOTAL NUMERIC(18,2),
    TOTALITEM NUMERIC(18,2),
    PRECIO NUMERIC(18,2),
    LOTE VARCHAR(15),
    PESOUNIT NUMERIC(18,4),
    PESOTOT NUMERIC(18,4),
    VOLUMUNIT NUMERIC(18,4),
    VOLUMTOT NUMERIC(18,4),
    TOTALDOC NUMERIC(18,2),
    ULTIMO NUMERIC(18,2),
    TOTALULT NUMERIC(18,2),
    CONSUMODOC NUMERIC(18,2),
    TOTALMASIMP NUMERIC(18,2))
AS
declare variable IMPTOS CHAR(1);
declare variable LARGO NUMERIC(18,4);
declare variable ANCHO NUMERIC(18,4);
declare variable ALTO NUMERIC(18,4);
declare variable LISTA CHAR(3);
BEGIN
  /*  */
  SELECT PREF_PRE, SALI_NUMERO, SALI_FECHA, SALI_CONC, SALI_REFER, S.BODE_COD, BODE_NOM, SALI_NOMTERC, SALI_IMPTOS, SALI_OBS
    FROM SALIDAS S, BODEGA B WHERE S.BODE_COD = B.BODE_COD AND S.SALI_ID = :ID into
    :PREF, :NUMERO, :FECHA, :CONCEPTO, :REFER, :CODBODEGA, :NOMBODEGA, :NOMTERCERO, :IMPTOS, :OBS;
  SELECT SUM(SADE_TOTAL), SUM(SADE_IVAMONTO), SUM(SADE_CONSUMO*SADE_CANT*SADE_FACTOR) FROM SALIDAS_DETALLE
    WHERE SALI_ID = :ID INTO :TOTALDOC, :IVAMONTO, :CONSUMODOC;
  TOTALMASIMP = TOTALDOC + CONSUMODOC;
  if (IMPTOS = 'N') then
    TOTALDOC = TOTALDOC - IVAMONTO;
  FOR SELECT SADE_ITEM, A.ARTI_COD, SADE_CODBAR, SADE_DESC, SADE_CANT, SADE_UNIDAD, BODE_COD, SADE_COSTO, SADE_IVAPORC, SADE_IVAMONTO, SADE_CONSUMO, SADE_TOTAL, SADE_LOTE,
    (ARTI_PESO * SADE_CANT * SADE_FACTOR / 1000), (ARTI_LARGO * SADE_FACTOR / 100), (ARTI_ANCHO * SADE_FACTOR / 100), (ARTI_ALTO * SADE_FACTOR / 100)
    FROM SALIDAS_DETALLE D, ARTICULO A
    WHERE D.ARTI_COD = A.ARTI_COD AND D.SALI_ID = :ID
    ORDER BY SADE_ITEM
    INTO :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :BODITEM, :COSTO, :IVAPORC, :IVAMONTO, :CONSUMO, :TOTAL, :LOTE, :PESOUNIT, :LARGO, :ANCHO, :ALTO
    DO
      BEGIN
      EXECUTE PROCEDURE LEE_CONFIGURACION('INVENTARIO','DOCUMENTOS','CODIGO DE LISTA DE PRECIOS A IMPRIMIR EN DOCUMENTOS') returning_values (:LISTA);
      if (NOT lista IS NULL) then
          SELECT PRAR_FIJO FROM PRECIOS_ARTICULO WHERE ARTI_COD = :articulo AND LIPR_COD = :LISTA INTO :PRECIO;
      EXECUTE PROCEDURE ultimo_costo(:articulo, :fecha,  :unidad) returning_values (:ultimo);
      TOTALULT = CANT * ULTIMO;
      TOTALITEM = COSTO + IVAMONTO + CONSUMO;
      if (IMPTOS = 'N') then
        TOTAL = TOTAL - IVAMONTO;
      if (PESOUNIT IS NULL) then
        PESOUNIT = 0;
      PESOTOT = PESOTOT + PESOUNIT;
      VOLUMUNIT = ANCHO * ALTO * LARGO;
      volumunit = VOLUMUNIT * CANT;
      if (VOLUMUNIT IS NULL) then
        VOLUMUNIT = 0;
      VOLUMTOT = VOLUMTOT + VOLUMUNIT;
      SUSPEND;
      END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER PROCEDURE IMPR_ENTRADA(
    ID INTEGER)
RETURNS (
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    CONCEPTO VARCHAR(60),
    REFER VARCHAR(60),
    CODBODEGA VARCHAR(2),
    NOMBODEGA VARCHAR(30),
    NOMTERCERO VARCHAR(60),
    OBS BLOB SUB_TYPE 1 SEGMENT SIZE 80,
    ITEM INTEGER,
    ARTICULO VARCHAR(15),
    CODBAR VARCHAR(15),
    ARTIDES VARCHAR(60),
    CANT NUMERIC(18,4),
    UNIDAD VARCHAR(8),
    BODITEM VARCHAR(2),
    COSTO NUMERIC(18,2),
    DTOPORC NUMERIC(9,2),
    DTOMONTO NUMERIC(18,2),
    IVAPORC NUMERIC(9,2),
    IVAMONTO NUMERIC(18,2),
    CONSUMO NUMERIC(18,2),
    TOTAL NUMERIC(18,2),
    PRECIO NUMERIC(18,2),
    LOTE VARCHAR(15),
    PESOUNIT NUMERIC(18,4),
    PESOTOT NUMERIC(18,4),
    VOLUMUNIT NUMERIC(18,4),
    VOLUMTOT NUMERIC(18,4),
    TOTALDOC NUMERIC(18,2),
    CONSUMODOC NUMERIC(18,2),
    TOTALMASIMP NUMERIC(18,2))
AS
declare variable IMPTOS CHAR(1);
declare variable LARGO NUMERIC(18,4);
declare variable ANCHO NUMERIC(18,4);
declare variable ALTO NUMERIC(18,4);
declare variable LISTA CHAR(3);
BEGIN
  /*  */
  PESOTOT = 0;
  VOLUMTOT = 0;
  SELECT PREF_PRE, ENTR_NUMERO, ENTR_FECHA, ENTR_CONC, ENTR_REFER, E.BODE_COD, BODE_NOM, ENTR_NOMTERC, ENTR_IMPTOS, ENTR_OBS
    FROM ENTRADAS E, BODEGA B
    WHERE E.BODE_COD = B.BODE_COD AND E.ENTR_ID = :ID
    into :PREF, :NUMERO, :FECHA, :CONCEPTO, :REFER, :CODBODEGA, :NOMBODEGA, :NOMTERCERO, :IMPTOS, :OBS;
  SELECT SUM(ENDE_TOTAL), SUM(ENDE_IVAMONTO), SUM(ENDE_CONSUMO*ENDE_CANT*ENDE_FACTOR) FROM ENTRADAS_DETALLE
    WHERE ENTR_ID = :ID INTO :TOTALDOC, :IVAMONTO, :CONSUMODOC;
  TOTALMASIMP = TOTALDOC + CONSUMODOC;
  if (IMPTOS = 'N') then
    TOTALDOC = TOTALDOC - IVAMONTO;
    
  FOR SELECT ENDE_ITEM, A.ARTI_COD, ENDE_CODBAR, SUBSTR(ENDE_DESC,1,60), ENDE_CANT, ENDE_UNIDAD, BODE_COD, ENDE_COSTO, ENDE_DTOPORC, ENDE_DTOMONTO, ENDE_IVAPORC, ENDE_IVAMONTO, ENDE_CONSUMO, ENDE_TOTAL, ENDE_LOTE,
    (ARTI_PESO * ENDE_CANT * ENDE_FACTOR / 1000), (ARTI_LARGO * ENDE_FACTOR / 100), (ARTI_ANCHO * ENDE_FACTOR / 100), (ARTI_ALTO * ENDE_FACTOR / 100)
    FROM ENTRADAS_DETALLE D, ARTICULO A
    WHERE D.ARTI_COD = A.ARTI_COD AND D.ENTR_ID = :ID
    ORDER BY ENDE_ITEM
    INTO :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :BODITEM, :COSTO, :DTOPORC, :DTOMONTO, :IVAPORC, :IVAMONTO, :CONSUMO, :TOTAL, :LOTE, :PESOUNIT, :LARGO, :ANCHO, :ALTO
    DO
      BEGIN
      EXECUTE PROCEDURE LEE_CONFIGURACION('INVENTARIO','DOCUMENTOS','CODIGO DE LISTA DE PRECIOS A IMPRIMIR EN DOCUMENTOS') returning_values (:LISTA);
      if (NOT lista IS NULL) then
          SELECT PRAR_FIJO FROM PRECIOS_ARTICULO WHERE ARTI_COD = :articulo AND LIPR_COD = :LISTA INTO :PRECIO;
      if (PESOUNIT IS NULL) then
        PESOUNIT = 0;
      PESOTOT = PESOTOT + PESOUNIT;
      VOLUMUNIT = ANCHO * ALTO * LARGO;
      volumunit = VOLUMUNIT * CANT;
      if (VOLUMUNIT IS NULL) then
        VOLUMUNIT = 0;
      VOLUMTOT = VOLUMTOT + VOLUMUNIT;
      if (IMPTOS = 'N') then
        TOTAL = TOTAL - IVAMONTO;
      SUSPEND;
      END
END
^

SET TERM ; ^



/* 20081010: AL DEJAR LOS APELLIDOS Y NOMBRES AL FINAL QUEDA EL NOMBRE COMPUESTO VACIO SE CAMBIO EL ORDEN DE LAS COLUMNAS */

DELETE FROM IMPORTACION_INVENTARIO WHERE IMIN_TIPO = 10;
INSERT INTO IMPORTACION_INVENTARIO (IMIN_TIPO, IMIN_DATO, IMIN_COLUMNA, IMIN_ANCHO) VALUES (10, 'TERC_NIT', 1, 20);
INSERT INTO IMPORTACION_INVENTARIO (IMIN_TIPO, IMIN_DATO, IMIN_COLUMNA, IMIN_ANCHO) VALUES (10, 'TERC_NOM', 2, 60);
INSERT INTO IMPORTACION_INVENTARIO (IMIN_TIPO, IMIN_DATO, IMIN_COLUMNA, IMIN_ANCHO) VALUES (10, 'TERC_APELLIDO1', 3, 60);
INSERT INTO IMPORTACION_INVENTARIO (IMIN_TIPO, IMIN_DATO, IMIN_COLUMNA, IMIN_ANCHO) VALUES (10, 'TERC_APELLIDO2', 4, 60);
INSERT INTO IMPORTACION_INVENTARIO (IMIN_TIPO, IMIN_DATO, IMIN_COLUMNA, IMIN_ANCHO) VALUES (10, 'TERC_NOMBRE1', 5, 60);
INSERT INTO IMPORTACION_INVENTARIO (IMIN_TIPO, IMIN_DATO, IMIN_COLUMNA, IMIN_ANCHO) VALUES (10, 'TERC_NOMBRE2', 6, 60);
INSERT INTO IMPORTACION_INVENTARIO (IMIN_TIPO, IMIN_DATO, IMIN_COLUMNA, IMIN_ANCHO) VALUES (10, 'CLIE_COD', 7, 10);
INSERT INTO IMPORTACION_INVENTARIO (IMIN_TIPO, IMIN_DATO, IMIN_COLUMNA, IMIN_ANCHO) VALUES (10, 'TERC_DIR', 8, 60);
INSERT INTO IMPORTACION_INVENTARIO (IMIN_TIPO, IMIN_DATO, IMIN_COLUMNA, IMIN_ANCHO) VALUES (10, 'TERC_CIU', 9, 40);
INSERT INTO IMPORTACION_INVENTARIO (IMIN_TIPO, IMIN_DATO, IMIN_COLUMNA, IMIN_ANCHO) VALUES (10, 'TERC_TEL', 10, 40);
INSERT INTO IMPORTACION_INVENTARIO (IMIN_TIPO, IMIN_DATO, IMIN_COLUMNA, IMIN_ANCHO) VALUES (10, 'TERC_CONTACTO', 11, 60);
INSERT INTO IMPORTACION_INVENTARIO (IMIN_TIPO, IMIN_DATO, IMIN_COLUMNA, IMIN_ANCHO) VALUES (10, 'TERC_FAX', 12, 25);
INSERT INTO IMPORTACION_INVENTARIO (IMIN_TIPO, IMIN_DATO, IMIN_COLUMNA, IMIN_ANCHO) VALUES (10, 'TERC_CEL', 13, 25);
INSERT INTO IMPORTACION_INVENTARIO (IMIN_TIPO, IMIN_DATO, IMIN_COLUMNA, IMIN_ANCHO) VALUES (10, 'ZONA_COD', 14, 2);
INSERT INTO IMPORTACION_INVENTARIO (IMIN_TIPO, IMIN_DATO, IMIN_COLUMNA, IMIN_ANCHO) VALUES (10, 'COBR_COD', 15, 2);
INSERT INTO IMPORTACION_INVENTARIO (IMIN_TIPO, IMIN_DATO, IMIN_COLUMNA, IMIN_ANCHO) VALUES (10, 'CLIE_CUPO', 16, 15);
INSERT INTO IMPORTACION_INVENTARIO (IMIN_TIPO, IMIN_DATO, IMIN_COLUMNA, IMIN_ANCHO) VALUES (10, 'VEND_COD', 17, 2);
INSERT INTO IMPORTACION_INVENTARIO (IMIN_TIPO, IMIN_DATO, IMIN_COLUMNA, IMIN_ANCHO) VALUES (10, 'LIPR_COD', 18, 2);
INSERT INTO IMPORTACION_INVENTARIO (IMIN_TIPO, IMIN_DATO, IMIN_COLUMNA, IMIN_ANCHO) VALUES (10, 'TERC_TIPOID', 19, 1);
COMMIT WORK;

DELETE FROM IMPORTACION_INVENTARIO WHERE IMIN_TIPO = 14;
INSERT INTO IMPORTACION_INVENTARIO (IMIN_TIPO, IMIN_DATO, IMIN_COLUMNA, IMIN_ANCHO) VALUES (14, 'TERC_NIT', 1, 20);
INSERT INTO IMPORTACION_INVENTARIO (IMIN_TIPO, IMIN_DATO, IMIN_COLUMNA, IMIN_ANCHO) VALUES (14, 'TERC_NOM', 2, 60);
INSERT INTO IMPORTACION_INVENTARIO (IMIN_TIPO, IMIN_DATO, IMIN_COLUMNA, IMIN_ANCHO) VALUES (14, 'TERC_APELLIDO1', 3, 60);
INSERT INTO IMPORTACION_INVENTARIO (IMIN_TIPO, IMIN_DATO, IMIN_COLUMNA, IMIN_ANCHO) VALUES (14, 'TERC_APELLIDO2', 4, 60);
INSERT INTO IMPORTACION_INVENTARIO (IMIN_TIPO, IMIN_DATO, IMIN_COLUMNA, IMIN_ANCHO) VALUES (14, 'TERC_NOMBRE1', 5, 60);
INSERT INTO IMPORTACION_INVENTARIO (IMIN_TIPO, IMIN_DATO, IMIN_COLUMNA, IMIN_ANCHO) VALUES (14, 'TERC_NOMBRE2', 6, 60);
INSERT INTO IMPORTACION_INVENTARIO (IMIN_TIPO, IMIN_DATO, IMIN_COLUMNA, IMIN_ANCHO) VALUES (14, 'PROV_COD', 7, 10);
INSERT INTO IMPORTACION_INVENTARIO (IMIN_TIPO, IMIN_DATO, IMIN_COLUMNA, IMIN_ANCHO) VALUES (14, 'TERC_DIR', 8, 60);
INSERT INTO IMPORTACION_INVENTARIO (IMIN_TIPO, IMIN_DATO, IMIN_COLUMNA, IMIN_ANCHO) VALUES (14, 'TERC_CIU', 9, 40);
INSERT INTO IMPORTACION_INVENTARIO (IMIN_TIPO, IMIN_DATO, IMIN_COLUMNA, IMIN_ANCHO) VALUES (14, 'TERC_TEL', 10, 40);
INSERT INTO IMPORTACION_INVENTARIO (IMIN_TIPO, IMIN_DATO, IMIN_COLUMNA, IMIN_ANCHO) VALUES (14, 'TERC_CONTACTO', 11, 60);
INSERT INTO IMPORTACION_INVENTARIO (IMIN_TIPO, IMIN_DATO, IMIN_COLUMNA, IMIN_ANCHO) VALUES (14, 'TERC_FAX', 12, 25);
INSERT INTO IMPORTACION_INVENTARIO (IMIN_TIPO, IMIN_DATO, IMIN_COLUMNA, IMIN_ANCHO) VALUES (14, 'TERC_CEL', 13, 25);
INSERT INTO IMPORTACION_INVENTARIO (IMIN_TIPO, IMIN_DATO, IMIN_COLUMNA, IMIN_ANCHO) VALUES (14, 'GRPR_COD', 14, 2);
INSERT INTO IMPORTACION_INVENTARIO (IMIN_TIPO, IMIN_DATO, IMIN_COLUMNA, IMIN_ANCHO) VALUES (14, 'TERC_TIPOID', 15, 1);
COMMIT WORK;

/* 20081014: REPORTES DE CAJA RECIBIAN LA CAJA COMO CADENA, DEBE SER ENTERO */

SET TERM ^ ;

CREATE OR ALTER PROCEDURE MOV_DETALLE_CAJAS(
    FECINI DATE,
    FECFIN DATE,
    CAJINI INTEGER,
    CAJFIN INTEGER,
    DETALLE CHAR(1),
    SUCURSAL INTEGER)
RETURNS (
    FECHA DATE,
    TIPO VARCHAR(8),
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(6),
    DBEFECTIVO NUMERIC(18,2),
    DBCHEQUES NUMERIC(18,2),
    CREFECTIVO NUMERIC(18,2),
    CRCHEQUES NUMERIC(18,2),
    SALDO NUMERIC(18,2),
    CONCEPTO VARCHAR(60),
    TERCERO VARCHAR(60),
    ENCARGADO VARCHAR(60),
    CAJA VARCHAR(60),
    SALDOINICIAL NUMERIC(18,2),
    CODIGO INTEGER)
AS
declare variable DB CHAR(1);
declare variable ID INTEGER;
declare variable NUMROWS INTEGER;
declare variable TIPOCOD INTEGER;
declare variable DEBITO NUMERIC(18,2);
declare variable CREDITO NUMERIC(18,2);
BEGIN
FOR SELECT CAJA_ID,CAJA_NOMBRE,CAJA_RESP
  FROM CAJAS
  WHERE CAJA_ID >= :CAJINI AND CAJA_ID <= :CAJFIN AND ((SUCU_ID = :SUCURSAL) or (:SUCURSAL = 0))
  ORDER BY CAJA_ID
  INTO :CODIGO,:CAJA,:ENCARGADO
  DO
  begin
  if (DETALLE = 'S') then
    BEGIN
    EXECUTE PROCEDURE SALDO_EN_CAJA(:CODIGO, :FECINI) returning_values(:SALDOINICIAL);
    SALDO =SALDOINICIAL;
    SELECT COUNT(MOCA_ID) FROM MOVIMIENTO_CAJA
        WHERE CAJA_ID = :CODIGO AND MOCA_FECHA >= :FECINI AND MOCA_FECHA <= :FECFIN INTO :NUMROWS;
    if (NUMROWS = 0) then
        BEGIN
        TIPO = '';
        PREFIJO = '';
        NUMERO = '';
        CONCEPTO = '';
        tercero = '';
        DEBITO = 0;
        CREDITO = 0;
        DBEFECTIVO = 0;
        CREFECTIVO = 0;
        DBCHEQUES = 0;
        CRCHEQUES = 0;
        SUSPEND;
        END
    ELSE
    FOR SELECT MOCA_TIPOREF, MOCA_IDREF, MOCA_FECHA, TIDO_NOMCORTO, MOCA_PREFREF, MOCA_NUMREF, MOCA_CONC, MOCA_DB, MOCA_DEBITOS, MOCA_CREDITOS
        FROM MOVIMIENTO_CAJA M, TIPO_DOCUMENTO T
        WHERE M.MOCA_TIPOREF = T.TIDO_COD AND M.CAJA_ID =:CODIGO AND M.MOCA_FECHA >=:FECINI AND M.MOCA_FECHA <=:FECFIN
        ORDER BY MOCA_FECHA, MOCA_TIPOREF, MOCA_ID
        INTO :TIPOCOD, :ID, :FECHA, :TIPO, :PREFIJO, :NUMERO, :CONCEPTO, :DB, :DEBITO, :CREDITO
        DO
        BEGIN
        DBEFECTIVO = 0;
        CREFECTIVO = 0;
        DBCHEQUES = 0;
        CRCHEQUES = 0;
        tercero = '';
        if (DB = 'S') then
            BEGIN
            /* BUSQUE CUANTO FUE EN EFECTIVO Y CUANTO EN CHEQUE */
            if (TIPOCOD = 61) then
                BEGIN
                SELECT SUM(RCPA_MONTO) FROM RECIBOS_CAJA_PAGO WHERE RECA_ID = :ID AND FOPA_ID = 1 INTO :DBEFECTIVO;
                if (DBEFECTIVO IS NULL) then
                    DBEFECTIVO = 0;
                DBCHEQUES = DEBITO - DBEFECTIVO;
                SELECT TERC_NOM from TERCEROS T, RECIBOS_CAJA R WHERE R.TERC_NIT = T.terc_nit and reca_id = :id INTO :TERCERO;
                END
            if (TIPOCOD = 62) then
                BEGIN
                /* ES UN TRASLADO A CAJA EL TOTAL VA A LA CAJA */
                SELECT EGRE_MONTO, TERC_NOM FROM EGRESOS E, TERCEROS T WHERE EGRE_ID = :ID AND E.TERC_NIT = T.terc_nit AND EGRE_TIPO = 2 AND CAJA_ID = :CODIGO INTO :DBEFECTIVO, :TERCERO;
                if (DBEFECTIVO IS NULL) then
                    DBEFECTIVO = 0;
                DBCHEQUES = DEBITO - DBEFECTIVO;
                END
            if (TIPOCOD = 63) then
                BEGIN
                DEBITO = CREDITO;
                SELECT SUM(CDEN_MONTO) FROM CAMBIODOC_ENTRADAS WHERE
                    CADO_ID = :ID AND FOPA_ID = 1 INTO :CREFECTIVO;
                if (CREFECTIVO IS NULL) then
                    CREFECTIVO = 0;
                CRCHEQUES = CREDITO - CREFECTIVO;
                TERCERO = '';
                SELECT SUM(CDSA_MONTO) FROM CAMBIODOC_SALIDAS WHERE
                    CADO_ID = :ID AND FOPA_ID = 1 INTO :DBEFECTIVO;
                if (DBEFECTIVO IS NULL) then
                    DBEFECTIVO = 0;
                DBCHEQUES = DEBITO - DBEFECTIVO;
                END
            if (TIPOCOD = 65) then
                BEGIN
                SELECT SUM(RPPA_MONTO) FROM RECIBO_PROVISIONAL_PAGO WHERE RCPR_ID = :ID AND FOPA_ID = 1 INTO :DBEFECTIVO;
                if (DBEFECTIVO IS NULL) then
                    DBEFECTIVO = 0;
                DBCHEQUES = DEBITO - DBEFECTIVO;
                SELECT TERC_NOM from TERCEROS T, RECIBO_PROVISIONAL R WHERE R.TERC_NIT = T.terc_nit AND RCPR_ID = :ID INTO :TERCERO;
                END
            if (TIPOCOD = 66) then
                BEGIN
                SELECT SUM(TRCD_MONTO) FROM TRASLADOS_CAJA_DET WHERE TRCJ_ID = :ID AND FOPA_ID = 1 INTO :DBEFECTIVO;
                if (DBEFECTIVO IS NULL) then
                    DBEFECTIVO = 0;
                DBCHEQUES = DEBITO - DBEFECTIVO;
                TERCERO = '';
                END
            if (TIPOCOD = 77) then
                BEGIN
                DBCHEQUES = DEBITO;
                TERCERO = '';
                END
            END
        ELSE
            BEGIN
            if (TIPOCOD = 62) then
                BEGIN
                SELECT SUM(EGCA_MONTO) FROM EGRESOS_CAJA WHERE EGRE_ID = :ID AND FOPA_ID = 1 AND CAJA_ID = :CODIGO INTO :CREFECTIVO;
                if (CREFECTIVO IS NULL) then
                    CREFECTIVO = 0;
                CRCHEQUES = CREDITO - CREFECTIVO;
                SELECT TERC_NOM from TERCEROS T, EGRESOS E WHERE E.TERC_NIT = T.terc_nit AND EGRE_ID = :ID INTO :TERCERO;
                END
            if (TIPOCOD = 63) then
                BEGIN
                DEBITO = CREDITO;
                SELECT SUM(CDEN_MONTO) FROM CAMBIODOC_ENTRADAS WHERE
                    CADO_ID = :ID AND FOPA_ID = 1 INTO :CREFECTIVO;
                if (CREFECTIVO IS NULL) then
                    CREFECTIVO = 0;
                CRCHEQUES = CREDITO - CREFECTIVO;
                TERCERO = '';
                SELECT SUM(CDSA_MONTO) FROM CAMBIODOC_SALIDAS WHERE
                    CADO_ID = :ID AND FOPA_ID = 1 INTO :DBEFECTIVO;
                if (DBEFECTIVO IS NULL) then
                    DBEFECTIVO = 0;
                DBCHEQUES = DEBITO - DBEFECTIVO;
                END
            if (TIPOCOD = 66) then
                BEGIN
                SELECT SUM(TRCD_MONTO) FROM TRASLADOS_CAJA_DET WHERE TRCJ_ID = :ID AND FOPA_ID = 1 INTO :CREFECTIVO;
                if (CREFECTIVO IS NULL) then
                    CREFECTIVO = 0;
                CRCHEQUES = CREDITO - CREFECTIVO;
                TERCERO = '';
                END
            if (TIPOCOD = 71) then
                BEGIN
                SELECT SUM(CODE_MONTO) FROM CONSIGNA_DETALLE WHERE CONS_ID = :ID AND FOPA_ID = 1 INTO :CREFECTIVO;
                if (CREFECTIVO IS NULL) then
                    CREFECTIVO = 0;
                CRCHEQUES = CREDITO - CREFECTIVO;
                TERCERO = '';
                END
            END
        SALDO = SALDO + DEBITO - CREDITO;
        SUSPEND;
        END
    END
  ELSE
    BEGIN
    SELECT COUNT(SACA_FECHA) FROM SALDO_CAJA
        WHERE CAJA_ID = :CODIGO AND SACA_FECHA >= :FECINI AND SACA_FECHA <= :FECFIN INTO :NUMROWS;
    if (NUMROWS = 0) then
        BEGIN
        EXECUTE PROCEDURE SALDO_EN_CAJA(:CODIGO, :FECINI) returning_values(:SALDOINICIAL);
        SALDO =SALDOINICIAL;
        TIPO = '';
        PREFIJO = '';
        NUMERO = '';
        CONCEPTO = '';
        DEBITO = 0;
        CREDITO = 0;
        DBEFECTIVO = 0;
        CREFECTIVO = 0;
        DBCHEQUES = 0;
        CRCHEQUES = 0;
        SUSPEND;
        END
    ELSE
        FOR SELECT SACA_FECHA, SACA_SALDO, SACA_DEBITOS, SACA_CREDITOS
            FROM SALDO_CAJA
            WHERE CAJA_ID = :CODIGO AND SACA_FECHA >= :FECINI AND SACA_FECHA <= :FECFIN
            ORDER BY SACA_FECHA
            INTO :fecha, :SALDOINICIAL, :DBEFECTIVO, :CREFECTIVO
            DO
                BEGIN
                /* sume los cambios de documento
                SELECT SUM(CDEN_MONTO) FROM cambiodoc_entradas E, cambio_documentos C
                    WHERE C.CADO_FECHA = :fecha AND c.cado_anulado = 'N' and C.CAJA_ID = :CODIGO AND C.CADO_ID = E.CADO_ID INTO :dbcheques;
                if (dbcheques is null) then
                    dbcheques = 0;
                DBEFECTIVO = DBEFECTIVO + DBCHEQUES;
                CREFECTIVO = CREFECTIVO + DBCHEQUES; */
                DBCHEQUES = 0;
                SALDO = SALDOINICIAL + DBEFECTIVO - CREFECTIVO;
                SUSPEND;
                END
    END
  end
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER PROCEDURE REP_MOVCAJA_DOCUMENTOS(
    FECINI DATE,
    FECFIN DATE,
    CAJINI INTEGER,
    CAJFIN INTEGER,
    SUBEMPRESA INTEGER)
RETURNS (
    FECHA DATE,
    TIPO VARCHAR(8),
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(6),
    FORPAGO VARCHAR(30),
    BANCO VARCHAR(2),
    CUENTA VARCHAR(20),
    NUMDOC VARCHAR(20),
    DEBITO NUMERIC(18,2),
    CREDITO NUMERIC(18,2),
    CONCEPTO VARCHAR(60),
    ENCARGADO VARCHAR(60),
    CAJA VARCHAR(60),
    CODIGO INTEGER,
    TIPODOC INTEGER,
    IDDOC INTEGER,
    IDFORMA INTEGER)
AS
BEGIN
FOR SELECT CAJA_ID,CAJA_NOMBRE,CAJA_RESP
  FROM CAJAS
  WHERE CAJA_ID >= :CAJINI AND CAJA_ID <= :CAJFIN AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
  ORDER BY CAJA_ID
  INTO :CODIGO,:CAJA,:ENCARGADO
  DO
    BEGIN
    FOR SELECT MOCA_TIPOREF, MOCA_IDREF, MOCA_FECHA, TIDO_NOMCORTO, MOCA_PREFREF, MOCA_NUMREF, MOCA_CONC
        FROM MOVIMIENTO_CAJA M, TIPO_DOCUMENTO T
        WHERE M.MOCA_TIPOREF = T.TIDO_COD AND M.CAJA_ID =:CODIGO AND M.MOCA_FECHA >=:FECINI AND M.MOCA_FECHA <=:FECFIN
        ORDER BY MOCA_FECHA, MOCA_TIPOREF, MOCA_ID
        INTO :TIPODOC, :IDDOC, :FECHA, :TIPO, :PREFIJO, :NUMERO, :CONCEPTO
        DO
        BEGIN
        if (TIPODOC = 61) then
            BEGIN
            FOR SELECT FOPA_NOM, RCPA_BANCO, RCPA_CUENTA, RCPA_NUMERO, RCPA_MONTO, 0, R.FOPA_ID
                FROM RECIBOS_CAJA_PAGO R, FORMAS_PAGO F
                WHERE RECA_ID = :IDDOC AND R.FOPA_ID = F.FOPA_ID
                ORDER BY RCPA_ITEM
                INTO :FORPAGO, :BANCO, :CUENTA, :NUMDOC, :DEBITO, :CREDITO, :IDFORMA
                DO
                    SUSPEND;
            END
        if (TIPODOC = 62) then
            BEGIN
            FOR SELECT 'EFECTIVO', NULL, NULL, NULL, EGRE_MONTO, 0, 1 FROM EGRESOS E
                WHERE EGRE_ID = :IDDOC AND EGRE_TIPO = 2 AND CAJA_ID = :CODIGO
                INTO :FORPAGO, :BANCO, :CUENTA, :NUMDOC, :DEBITO, :CREDITO, :IDFORMA
                DO
                    SUSPEND;
            FOR SELECT FOPA_NOM, EGCA_BANCO, EGCA_CUENTA, EGCA_NUMERO, 0, EGCA_MONTO, E.FOPA_ID
                FROM EGRESOS_CAJA E, FORMAS_PAGO F
                WHERE EGRE_ID = :IDDOC AND E.FOPA_ID = F.FOPA_ID AND CAJA_ID = :CODIGO
                ORDER BY EGCA_ITEM
                INTO :FORPAGO, :BANCO, :CUENTA, :NUMDOC, :DEBITO, :CREDITO, :IDFORMA
                DO
                    SUSPEND;
            END
        if (TIPODOC = 63) then
            BEGIN
            FOR SELECT FOPA_NOM, CDEN_BANCO, CDEN_CUENTA, CDEN_NUMERO, 0, CDEN_MONTO, E.FOPA_ID
                FROM CAMBIODOC_ENTRADAS E, FORMAS_PAGO F
                WHERE CADO_ID = :IDDOC AND E.FOPA_ID = F.FOPA_ID
                ORDER BY CDEN_ITEM
                INTO :FORPAGO, :BANCO, :CUENTA, :NUMDOC, :DEBITO, :CREDITO, :IDFORMA
                DO
                    SUSPEND;
            FOR SELECT FOPA_NOM, CDSA_BANCO, CDSA_CUENTA, CDSA_NUMERO, CDSA_MONTO, 0, E.FOPA_ID
                FROM CAMBIODOC_SALIDAS E, FORMAS_PAGO F
                WHERE CADO_ID = :IDDOC AND E.FOPA_ID = F.FOPA_ID
                ORDER BY CDSA_ITEM
                INTO :FORPAGO, :BANCO, :CUENTA, :NUMDOC, :DEBITO, :CREDITO, :IDFORMA
                DO
                    SUSPEND;
            END
        if (TIPODOC = 65) then
            BEGIN
            FOR SELECT FOPA_NOM, RPPA_BANCO, RPPA_CUENTA, RPPA_NUMERO, RPPA_MONTO, 0, R.FOPA_ID
                FROM RECIBO_PROVISIONAL_PAGO R, FORMAS_PAGO F
                WHERE RCPR_ID = :IDDOC AND R.FOPA_ID = F.FOPA_ID
                ORDER BY RPPA_ITEM
                INTO :FORPAGO, :BANCO, :CUENTA, :NUMDOC, :DEBITO, :CREDITO, :IDFORMA
                DO
                    SUSPEND;
            END
        if (TIPODOC = 66) then
            BEGIN
            FOR SELECT FOPA_NOM, TRCD_BANCO, TRCD_CUENTA, TRCD_NUMERO, 0, TRCD_MONTO, R.FOPA_ID
                FROM TRASLADOS_CAJA T, TRASLADOS_CAJA_DET R, FORMAS_PAGO F
                WHERE T.TRCJ_ID = :IDDOC AND R.FOPA_ID = F.FOPA_ID AND T.CAJA_ID = :CODIGO AND T.TRCJ_ID = R.TRCJ_ID
                ORDER BY TRCD_ITEM
                INTO :FORPAGO, :BANCO, :CUENTA, :NUMDOC, :DEBITO, :CREDITO, :IDFORMA
                DO
                    SUSPEND;
            FOR SELECT FOPA_NOM, TRCD_BANCO, TRCD_CUENTA, TRCD_NUMERO, TRCD_MONTO, 0, R.FOPA_ID
                FROM TRASLADOS_CAJA T, TRASLADOS_CAJA_DET R, FORMAS_PAGO F
                WHERE T.TRCJ_ID = :IDDOC AND R.FOPA_ID = F.FOPA_ID AND T.TRCJ_DESTINO = :CODIGO AND T.TRCJ_ID = R.TRCJ_ID
                ORDER BY TRCD_ITEM
                INTO :FORPAGO, :BANCO, :CUENTA, :NUMDOC, :DEBITO, :CREDITO, :IDFORMA
                DO
                    SUSPEND;
            END
        if (TIPODOC = 71) then
            BEGIN
            FOR SELECT FOPA_NOM, CODE_BANCO, CODE_CUENTA, CODE_NUMERO, 0, CODE_MONTO, C.FOPA_ID
                FROM CONSIGNA_DETALLE C, FORMAS_PAGO F
                WHERE CONS_ID = :IDDOC AND C.FOPA_ID = F.FOPA_ID AND CAJA_ID = :CODIGO
                INTO :FORPAGO, :BANCO, :CUENTA, :NUMDOC, :DEBITO, :CREDITO, :IDFORMA
                DO
                    SUSPEND;
            END
        if (TIPODOC = 77) then
            BEGIN
            SELECT DVCH_BANCO, DVCH_CUENTA, DVCH_NROCH, DVCH_MONTO, 0, 2
                FROM DEVOLUCION_CHEQUES D
                WHERE DVCH_ID = :IDDOC
                INTO :BANCO, :CUENTA, :NUMDOC, :DEBITO, :CREDITO, :IDFORMA;
            FORPAGO  = 'CHEQUE';
            SUSPEND;
            END
        END
    END
END
^

SET TERM ; ^



/* 20081015: CONSUMO CONSTANTE USA LA ULTIMA CUENTA REGISTRADA EN LUGAR DE LA CUENTA DEFINIDA EN LA INTERFAZ */
SET TERM ^ ;

CREATE OR ALTER PROCEDURE CONTABIL_SALIDA(
    IDDOC INTEGER,
    IDINTER INTEGER)
RETURNS (
    ERROR INTEGER,
    VER CHAR(1),
    IDC INTEGER)
AS
declare variable PREFIJO VARCHAR(4);
declare variable NUMERO VARCHAR(6);
declare variable FECAUX DATE;
declare variable FECHA CHAR(8);
declare variable CONCEPTO CHAR(60);
declare variable TIPOCOMP VARCHAR(3);
declare variable PREFCONT VARCHAR(4);
declare variable CTACIERRE VARCHAR(20);
declare variable BASE CHAR(1);
declare variable IVAV CHAR(1);
declare variable CONSUMO CHAR(1);
declare variable TOTAL CHAR(1);
declare variable EXISTE CHAR(1);
declare variable CUENTA VARCHAR(20);
declare variable MONTO NUMERIC(18,2);
declare variable TIPOCUEN CHAR(1);
declare variable NIT VARCHAR(20);
declare variable PROY VARCHAR(4);
declare variable CENTRO VARCHAR(4);
declare variable DEBITO NUMERIC(18,2);
declare variable CREDITO NUMERIC(18,2);
declare variable NUMITEMS INTEGER;
declare variable ARTICULO VARCHAR(15);
declare variable IMPINC CHAR(1);
declare variable IMPTOS NUMERIC(18, 2);
declare variable SUMA NUMERIC(18,2);
declare variable CTABASE VARCHAR(20);
declare variable CTAIVA VARCHAR(20);
declare variable CTACONSUMO VARCHAR(20);
declare variable VRBASE NUMERIC(18,2);
declare variable CUENTAADIC VARCHAR(20);
declare variable BASEADIC VARCHAR(20);
declare variable PORCADIC NUMERIC(5,2);
declare variable VALORADIC NUMERIC(18,2);
declare variable DBADIC CHAR(1);
declare variable PROV CHAR(1);
declare variable ANULADO CHAR(1);
declare variable CENT CHAR(1);
BEGIN
ERROR = 0;
/* BUSQUE LA INTERFACE */
EXISTE = 'N';
SELECT 'S', PREF_PRE, TICO_COD, PRCO_PREF, ININ_BASE, ININ_IVAV, ININ_CONSUMO, ININ_TOTAL, ININ_CTABASE, ININ_CTAIVA, ININ_CTACONSUMO, ININ_CTACIERRE, ININ_CONFIRMAR, ININ_CENTRO
    FROM INTERFAZ_INVENTARIO
    WHERE ININ_ID = :IDINTER
    INTO :EXISTE, :PREFIJO, :TIPOCOMP, :PREFCONT, :BASE, :IVAV, :CONSUMO, :TOTAL, :CTABASE, :CTAIVA, :CTACONSUMO, :CTACIERRE, :VER, :CENT;
if (EXISTE = 'S') then
    BEGIN
    /* TRAIGA EL ENCABEZADO DE LA SALIDA */
    SELECT PREF_PRE, SALI_NUMERO, SALI_FECHA, SALI_CONC, TERC_NIT, SALI_IMPTOS, SALI_ANULADO
        FROM SALIDAS
        WHERE SALI_ID = :IDDOC
        INTO :PREFIJO, :NUMERO, :FECAUX, :CONCEPTO, :NIT, :IMPINC, :ANULADO;
    /* BORRE CUALQUEIR CONTABILIZACION PREVIA */
    DELETE FROM CONTABILIZACION WHERE CNTB_TIPOREF = 12 AND CNTB_IDREF = :IDDOC;

    if (ANULADO = 'N') then
        BEGIN
        if (CENT = 'B') then
            SELECT BODE_CENTRO, BODE_PROY FROM BODEGA B, SALIDAS E
                WHERE B.BODE_COD = E.BODE_COD AND E.SALI_ID = :IDDOC INTO :CENTRO, :PROY;
        ELSE
            SELECT PREF_CENTRO, PREF_PROY FROM PREFIJOS P, SALIDAS E
                WHERE P.PREF_PRE = E.PREF_PRE AND E.SALI_ID = :IDDOC AND P.TIDO_COD = 12 INTO :CENTRO, :PROY;
        /* CONVIERTA LA FECHA A CADENA */
        EXECUTE PROCEDURE FECHA_A_CONTA(:FECAUX) returning_values (:FECHA);
        IDC = GEN_ID(ID_CONTABILIZA, 1);
        /* REGISTRE EL ENCABEZADO CONTABLE */
        INSERT INTO CONTABILIZACION (CNTB_ID, CNTB_TIPOCOMP, CNTB_PREFCNT, CNTB_NUMERO, CNTB_FECHA, CNTB_CONCEPTO, CNTB_REF, CNTB_TIPOREF, CNTB_IDREF, CNTB_PREFREF, CNTB_NUMREF, CNTB_PROCESADO)
            VALUES (:IDC, :TIPOCOMP, :PREFCONT, :NUMERO, :FECHA, :CONCEPTO, '', 12, :IDDOC, :PREFIJO, :NUMERO, 'N');
        NUMITEMS = 0;
        SUMA = 0;
        /* PRIMERO LA BASE */
        if (BASE = 'A') then
            BEGIN
            /* SUME LAS BASES DE LOS ARTICULOS DEL DOCUMENTO */
            FOR SELECT MAX(COAR_CTAINV), SUM(SADE_CANT * SADE_COSTO), SUM(SADE_IVAMONTO + (SADE_CONSUMO*SADE_CANT*SADE_FACTOR))
                FROM ARTICULO A, CONTABIL_ARTICULO C, SALIDAS_DETALLE E
                WHERE E.SALI_ID = :IDDOC AND E.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD
                GROUP BY COAR_CTAINV
                INTO :CTABASE, :MONTO, :IMPTOS
            DO
                BEGIN
                if (IMPINC = 'S') then
                    MONTO = MONTO - IMPTOS;
                VRBASE = MONTO;
                if (MONTO <> 0) then
                    BEGIN
                    /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
                    SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                        WHERE CUEN_COD = :CTABASE INTO :CUENTA, :TIPOCUEN;
                    if (CUENTA IS NULL) then
                        begin
                        EXECUTE PROCEDURE ERROR (12, :IDDOC, :CTABASE, 2);
                        CUENTA = CTABASE;
                        TIPOCUEN = 'N';
                        ERROR = ERROR + 1;
                        end
                    /* DEPENDE DEL TIPO DE CUENTA */
                    if (TIPOCUEN = 'I') then
                        BEGIN
                        /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                        FOR SELECT E.ARTI_COD, (SADE_CANT * SADE_COSTO), (SADE_IVAMONTO + (SADE_CONSUMO*SADE_CANT*SADE_FACTOR))
                            FROM ARTICULO A, CONTABIL_ARTICULO C, SALIDAS_DETALLE E
                            WHERE E.SALI_ID = :IDDOC AND E.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTAINV = :CUENTA
                            INTO :ARTICULO, :MONTO, :IMPTOS
                        DO
                            BEGIN
                            if (IMPINC = 'S') then
                                MONTO = MONTO - IMPTOS;
                            if (MONTO <> 0) then
                                BEGIN
                                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                                NUMITEMS = NUMITEMS + 1;
                                SUMA = SUMA - MONTO;
                                END
                            END
                        END
                    if (TIPOCUEN = 'C') then
                        BEGIN
                        EXECUTE PROCEDURE ERROR (12, :IDDOC, :CUENTA, 4);
                        TIPOCUEN = 'N';
                        ERROR = ERROR + 1;
                        END
                    if (TIPOCUEN = 'N') then
                        BEGIN
                        /* INSERTE EL REGISTRO DE LA BASE */
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NUMITEMS = NUMITEMS + 1;
                        SUMA = SUMA - MONTO;
                        END
                    END
                END /* FOR */
            END /* BASE POR ARTICULO */
        if (BASE = 'I') then
            BEGIN
            /* SUME LAS BASES DE LOS ARTICULOS DEL DOCUMENTO */
            FOR SELECT MAX(TAIV_CTAINV), SUM(SADE_CANT * SADE_COSTO), SUM(SADE_IVAMONTO + (SADE_CONSUMO*SADE_CANT*SADE_FACTOR))
                FROM ARTICULO A, TARIFA_IVA I, SALIDAS_DETALLE E
                WHERE E.SALI_ID = :IDDOC AND E.ARTI_COD = A.ARTI_COD AND A.TAIV_COD = I.TAIV_COD
                GROUP BY TAIV_CTAINV
                INTO :CTABASE, :MONTO, :IMPTOS
            DO
                BEGIN
                if (IMPINC = 'S') then
                    MONTO = MONTO - IMPTOS;
                VRBASE = MONTO;
                if (MONTO <> 0) then
                    BEGIN
                    /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
                    SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                        WHERE CUEN_COD = :CTABASE INTO :CUENTA, :TIPOCUEN;
                    if (CUENTA IS NULL) then
                        begin
                        EXECUTE PROCEDURE ERROR (12, :IDDOC, :CTABASE, 2);
                        CUENTA = CTABASE;
                        TIPOCUEN = 'N';
                        ERROR = ERROR + 1;
                        end
                    /* DEPENDE DEL TIPO DE CUENTA */
                    if (TIPOCUEN = 'I') then
                        BEGIN
                        /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                        FOR SELECT E.ARTI_COD, (SADE_CANT * SADE_COSTO), (SADE_IVAMONTO + (SADE_CONSUMO*SADE_CANT*SADE_FACTOR))
                            FROM ARTICULO A, TARIFA_IVA I, SALIDAS_DETALLE E
                            WHERE E.SALI_ID = :IDDOC AND E.ARTI_COD = A.ARTI_COD AND A.TAIV_COD = I.TAIV_COD AND TAIV_CTAINV = :CUENTA
                            INTO :ARTICULO, :MONTO, :IMPTOS
                        DO
                            BEGIN
                            if (IMPINC = 'S') then
                                MONTO = MONTO - IMPTOS;
                            if (MONTO <> 0) then
                                BEGIN
                                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                                NUMITEMS = NUMITEMS + 1;
                                SUMA = SUMA - MONTO;
                                END
                            END
                        END
                    if (TIPOCUEN = 'C') then
                        BEGIN
                        EXECUTE PROCEDURE ERROR (12, :IDDOC, :CUENTA, 4);
                        TIPOCUEN = 'N';
                        ERROR = ERROR + 1;
                        END
                    if (TIPOCUEN = 'N') then
                        BEGIN
                        /* INSERTE EL REGISTRO DE LA BASE */
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NUMITEMS = NUMITEMS + 1;
                        SUMA = SUMA - MONTO;
                        END
                    END
                END /* FOR */
            END /* BASE POR IVA */
        if ((BASE = 'K') or (BASE = 'T')) then
            BEGIN
            if (BASE = 'T') then
                BEGIN
                SELECT TERC_PROV, TERC_CTAVENTA FROM TERCEROS WHERE TERC_NIT = :NIT INTO :PROV, :CTABASE;
                if (:PROV = 'S') then
                    SELECT PROV_CTACAUSA FROM PROVEEDORES WHERE TERC_NIT = :NIT INTO :CTABASE;
                END
            /* SUME LAS BASES DE LOS ARTICULOS DEL DOCUMENTO */
            FOR SELECT SUM(SADE_CANT * SADE_COSTO), SUM(SADE_IVAMONTO + (SADE_CONSUMO*SADE_CANT*SADE_FACTOR))
                FROM SALIDAS_DETALLE
                WHERE SALI_ID = :IDDOC
                INTO :MONTO, :IMPTOS
            DO
                BEGIN
                if (IMPINC = 'S') then
                    MONTO = MONTO - IMPTOS;
                VRBASE = MONTO;
                if (MONTO <> 0) then
                    BEGIN
                    /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
                    SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                        WHERE CUEN_COD = :CTABASE INTO :CUENTA, :TIPOCUEN;
                    if (CUENTA IS NULL) then
                        begin
                        EXECUTE PROCEDURE ERROR (12, :IDDOC, :CTABASE, 2);
                        CUENTA = CTABASE;
                        TIPOCUEN = 'N';
                        ERROR = ERROR + 1;
                        end
                    /* DEPENDE DEL TIPO DE CUENTA */
                    if (TIPOCUEN = 'I') then
                        BEGIN
                        /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                        FOR SELECT E.ARTI_COD, (SADE_CANT * SADE_COSTO), (SADE_IVAMONTO + (SADE_CONSUMO*SADE_CANT*SADE_FACTOR))
                            FROM ARTICULO A, CONTABIL_ARTICULO C, SALIDAS_DETALLE E
                            WHERE E.SALI_ID = :IDDOC AND E.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTAINV = :CUENTA
                            INTO :ARTICULO, :MONTO, :IMPTOS
                        DO
                            BEGIN
                            if (IMPINC = 'S') then
                                MONTO = MONTO - IMPTOS;
                            if (MONTO <> 0) then
                                BEGIN
                                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                                NUMITEMS = NUMITEMS + 1;
                                SUMA = SUMA - MONTO;
                                END
                            END
                        END
                    if (TIPOCUEN = 'C') then
                        BEGIN
                        EXECUTE PROCEDURE ERROR (12, :IDDOC, :CUENTA, 4);
                        TIPOCUEN = 'N';
                        ERROR = ERROR + 1;
                        END
                    if (TIPOCUEN = 'N') then
                        BEGIN
                        /* INSERTE EL REGISTRO DE LA BASE */
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NUMITEMS = NUMITEMS + 1;
                        SUMA = SUMA - MONTO;
                        END
                    END
                END /* FOR */
            END /* BASE K O POR TERCERO */
        /* EL IVA EN VENTAS */
        if (IVAV = 'A') then
            BEGIN
            /* SUME LAS BASES DE LOS ARTICULOS DEL DOCUMENTO */
            FOR SELECT MAX(COAR_CTAIVAV), SUM(SADE_IVAMONTO), SUM(SADE_CANT * SADE_COSTO)
                FROM ARTICULO A, CONTABIL_ARTICULO C, SALIDAS_DETALLE E
                WHERE E.SALI_ID = :IDDOC AND E.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD
                GROUP BY COAR_CTAIVAV
                INTO :CTAIVA, :IMPTOS, :MONTO
            DO
                BEGIN
                if (IMPTOS <> 0) then
                    BEGIN
                    /* TRAIGA LAS CARCATERISTICAS DE LA CUENTA */
                    SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                        WHERE CUEN_COD = :CTAIVA INTO :CUENTA, :TIPOCUEN;
                    if (CUENTA IS NULL) then
                        begin
                        EXECUTE PROCEDURE ERROR (12, :IDDOC, :CTAIVA, 2);
                        CUENTA = CTAIVA;
                        TIPOCUEN = 'N';
                        ERROR = ERROR + 1;
                        end
                    if (TIPOCUEN = 'I') then
                        BEGIN
                        /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                        FOR SELECT E.ARTI_COD, SADE_IVAMONTO, (SADE_CANT * SADE_COSTO)
                            FROM ARTICULO A, CONTABIL_ARTICULO C, SALIDAS_DETALLE E
                            WHERE E.SALI_ID = :IDDOC AND E.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTAIVAV = :CUENTA
                            INTO :ARTICULO, :IMPTOS, :MONTO
                        DO
                            BEGIN
                            if (IMPINC = 'S') then
                                MONTO = MONTO - IMPTOS;
                            MONTO = MONTO * -1;
                            if (IMPTOS <> 0) then
                                BEGIN
                                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :IMPTOS, :MONTO, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                                NUMITEMS = NUMITEMS + 1;
                                SUMA = SUMA - IMPTOS;
                                END
                            END
                        END
                    if (TIPOCUEN = 'C') then
                        BEGIN
                        EXECUTE PROCEDURE ERROR (12, :IDDOC, :CUENTA, 4);
                        TIPOCUEN = 'N';
                        ERROR = ERROR + 1;
                        END
                    if (TIPOCUEN = 'N') then
                        BEGIN
                        /* INSERTE EL REGISTRO DEL IVA EN VENTAS */
                        if (IMPINC = 'S') then
                            MONTO = MONTO - IMPTOS;
                        MONTO = MONTO * -1;
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :IMPTOS, :MONTO, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NUMITEMS = NUMITEMS + 1;
                        SUMA = SUMA - IMPTOS;
                        END
                    END
                END /* FOR */
            END /* IVA POR ARTICULO */
        if (IVAV = 'I') then
            BEGIN
            /* SUME LAS BASES DE LOS ARTICULOS DEL DOCUMENTO */
            FOR SELECT MAX(TAIV_CTAIVAVNT), SUM(SADE_IVAMONTO), SUM(SADE_CANT * SADE_COSTO)
                FROM ARTICULO A, TARIFA_IVA I, SALIDAS_DETALLE E
                WHERE E.SALI_ID = :IDDOC AND E.ARTI_COD = A.ARTI_COD AND A.TAIV_COD = I.TAIV_COD
                GROUP BY TAIV_CTAIVAVNT
                INTO :CTAIVA, :IMPTOS, :MONTO
            DO
                BEGIN
                if (IMPTOS <> 0) then
                    BEGIN
                    /* TRAIGA LAS CARCATERISTICAS DE LA CUENTA */
                    SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                        WHERE CUEN_COD = :CTAIVA INTO :CUENTA, :TIPOCUEN;
                    if (CUENTA IS NULL) then
                        begin
                        EXECUTE PROCEDURE ERROR (12, :IDDOC, :CTAIVA, 2);
                        CUENTA = CTAIVA;
                        TIPOCUEN = 'N';
                        ERROR = ERROR + 1;
                        end
                    if (TIPOCUEN = 'I') then
                        BEGIN
                        /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                        FOR SELECT E.ARTI_COD, SADE_IVAMONTO, (SADE_CANT * SADE_COSTO)
                            FROM ARTICULO A, TARIFA_IVA I, SALIDAS_DETALLE E
                            WHERE E.SALI_ID = :IDDOC AND E.ARTI_COD = A.ARTI_COD AND A.TAIV_COD = I.TAIV_COD AND TAIV_CTAIVAVNT = :CUENTA
                            INTO :ARTICULO, :IMPTOS, :MONTO
                        DO
                            BEGIN
                            if (IMPINC = 'S') then
                                MONTO = MONTO - IMPTOS;
                            MONTO = MONTO * -1;
                            if (IMPTOS <> 0) then
                                BEGIN
                                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :IMPTOS, :MONTO, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                                NUMITEMS = NUMITEMS + 1;
                                SUMA = SUMA - IMPTOS;
                                END
                            END
                        END
                    if (TIPOCUEN = 'C') then
                        BEGIN
                        EXECUTE PROCEDURE ERROR (12, :IDDOC, :CUENTA, 4);
                        TIPOCUEN = 'N';
                        ERROR = ERROR + 1;
                        END
                    if (TIPOCUEN = 'N') then
                        BEGIN
                        /* INSERTE EL REGISTRO DEL IVA EN VENTAS */
                        if (IMPINC = 'S') then
                            MONTO = MONTO - IMPTOS;
                        MONTO = MONTO * -1;
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :IMPTOS, :MONTO, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NUMITEMS = NUMITEMS + 1;
                        SUMA = SUMA - IMPTOS;
                        END
                    END
                END /* FOR */
            END /* IVA POR TARIFA */
        if (IVAV = 'K') then
            BEGIN
            /* SUME LAS BASES DE LOS ARTICULOS DEL DOCUMENTO */
            SELECT SUM(SADE_IVAMONTO), SUM(SADE_CANT * SADE_COSTO)
                FROM SALIDAS_DETALLE
                WHERE SALI_ID = :IDDOC
                INTO :IMPTOS, :MONTO;
            if (IMPTOS <> 0) then
                BEGIN
                /* TRAIGA LAS CARCATERISTICAS DE LA CUENTA */
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :CTAIVA INTO :CUENTA, :TIPOCUEN;
                if (CUENTA IS NULL) then
                    begin
                    EXECUTE PROCEDURE ERROR (12, :IDDOC, :CTAIVA, 2);
                    CUENTA = CTAIVA;
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT E.ARTI_COD, SADE_IVAMONTO, (SADE_CANT * SADE_COSTO)
                        FROM ARTICULO A, CONTABIL_ARTICULO C, SALIDAS_DETALLE E
                        WHERE E.SALI_ID = :IDDOC AND E.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTAIVAV = :CUENTA
                        INTO :ARTICULO, :IMPTOS, :MONTO
                        DO
                        BEGIN
                        if (IMPTOS <> 0) then
                            BEGIN
                            if (IMPINC = 'S') then
                                MONTO = MONTO - IMPTOS;
                            MONTO = MONTO * -1;
                            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :IMPTOS, :MONTO, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                            NUMITEMS = NUMITEMS + 1;
                            SUMA = SUMA - IMPTOS;
                            END
                        END
                    END
                if (TIPOCUEN = 'C') then
                        BEGIN
                        EXECUTE PROCEDURE ERROR (12, :IDDOC, :CUENTA, 4);
                        TIPOCUEN = 'N';
                        ERROR = ERROR + 1;
                        END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    /* INSERTE EL REGISTRO DEL IVA EN VENTAS */
                    if (IMPINC = 'S') then
                        MONTO = MONTO - IMPTOS;
                    MONTO = MONTO * -1;
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :IMPTOS, :MONTO, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NUMITEMS = NUMITEMS + 1;
                    SUMA = SUMA - IMPTOS;
                    END
                END
            END /* IVA CONSTANTE */
        /* EL IMPOCONSUMO */
        if (CONSUMO = 'A') then
            BEGIN
            /* SUME LAS BASES DE LOS ARTICULOS DEL DOCUMENTO */
            FOR SELECT MAX(COAR_CTACONS), SUM(SADE_CONSUMO*SADE_CANT*SADE_FACTOR)
                FROM ARTICULO A, CONTABIL_ARTICULO C, SALIDAS_DETALLE E
                WHERE E.SALI_ID = :IDDOC AND E.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD
                GROUP BY COAR_CTACONS
                INTO :CTACONSUMO, :IMPTOS
            DO
                BEGIN
                if (IMPTOS <> 0) then
                    BEGIN
                    /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
                    SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                        WHERE CUEN_COD = :CTACONSUMO INTO :CUENTA, :TIPOCUEN;
                    if (CUENTA IS NULL) then
                        begin
                        EXECUTE PROCEDURE ERROR (12, :IDDOC, :CTACONSUMO, 2);
                        CUENTA = CTACONSUMO;
                        TIPOCUEN = 'N';
                        ERROR = ERROR + 1;
                        end
                    if (TIPOCUEN = 'I') then
                        BEGIN
                        /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                        FOR SELECT E.ARTI_COD, SADE_CONSUMO*SADE_CANT*SADE_FACTOR
                            FROM ARTICULO A, CONTABIL_ARTICULO C, SALIDAS_DETALLE E
                            WHERE E.SALI_ID = :IDDOC AND E.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTACONS = :CUENTA
                            INTO :ARTICULO, :IMPTOS
                            DO
                            if (IMPTOS <> 0) then
                                BEGIN
                                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                                NUMITEMS = NUMITEMS + 1;
                                SUMA = SUMA - IMPTOS;
                                END
                        END
                    if (TIPOCUEN = 'C') then
                        BEGIN
                        EXECUTE PROCEDURE ERROR (12, :IDDOC, :CUENTA, 4);
                        TIPOCUEN = 'N';
                        ERROR = ERROR + 1;
                        END
                    if (TIPOCUEN = 'N') then
                        BEGIN
                        /* INSERTE EL REGISTRO DE LA BASE */
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NUMITEMS = NUMITEMS + 1;
                        SUMA = SUMA - IMPTOS;
                        END
                    END
                END /* FOR */
            END /* CONSUMO POR ARTICULO */
        if (CONSUMO = 'K') then
            BEGIN
            /* SUME LAS BASES DE LOS ARTICULOS DEL DOCUMENTO */
            SELECT SUM(SADE_CONSUMO*SADE_CANT*SADE_FACTOR)
                FROM SALIDAS_DETALLE
                WHERE SALI_ID = :IDDOC
                INTO :IMPTOS;
            if (IMPTOS <> 0) then
                BEGIN
                /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :ctaconsumo INTO :CUENTA, :TIPOCUEN;
                if (CUENTA IS NULL) then
                    begin
                    EXECUTE PROCEDURE ERROR (12, :IDDOC, :CTACONSUMO, 2);
                    CUENTA = CTACONSUMO;
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT E.ARTI_COD, SADE_CONSUMO*SADE_CANT*SADE_FACTOR
                    FROM ARTICULO A, CONTABIL_ARTICULO C, SALIDAS_DETALLE E
                        WHERE E.SALI_ID = :IDDOC AND E.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTACONS = :CUENTA
                        INTO :ARTICULO, :IMPTOS
                        DO
                        if (IMPTOS <> 0) then
                            BEGIN
                            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                            NUMITEMS = NUMITEMS + 1;
                            SUMA = SUMA - IMPTOS;
                            END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (12, :IDDOC, :CUENTA, 4);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    /* INSERTE EL REGISTRO DE LA BASE */
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NUMITEMS = NUMITEMS + 1;
                    SUMA = SUMA - IMPTOS;
                    END
                END
            END /* CONSUMO CONSTANTE */
        /* recorra las cuentas adicionales */
        FOR SELECT INIC_CUENTA, INIC_BASE, INIC_PORC, INIC_VALOR, INIC_DB
            FROM INTERFAZ_INVENTARIO_CTAS
            WHERE ININ_ID = :IDINTER
            INTO :CUENTAADIC, :BASEADIC, :PORCADIC, :VALORADIC, :DBADIC
            DO
            BEGIN
            if (VALORADIC <> 0) then
                MONTO = VALORADIC;
            ELSE
                BEGIN
                if (:BASEADIC = 'SUBTOTAL') then
                    SELECT SUM(SADE_CANT * SADE_COSTO)
                    FROM SALIDAS_DETALLE E
                    WHERE E.SALI_ID = :IDDOC 
                    INTO :VALORADIC;
                if (:BASEADIC = 'IVA') then
                    SELECT SUM(SADE_IVAMONTO)
                    FROM SALIDAS_DETALLE E
                    WHERE E.SALI_ID = :IDDOC 
                    INTO :VALORADIC;
                if (:BASEADIC = 'CONSUMO') then
                    SELECT SUM(SADE_CONSUMO*SADE_CANT*SADE_FACTOR)
                    FROM SALIDAS_DETALLE E
                    WHERE E.SALI_ID = :IDDOC 
                    INTO :VALORADIC;
                MONTO = VALORADIC * PORCADIC / 100;
                END
            if (MONTO <> 0) then
                BEGIN
                /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
                CUENTA = NULL;
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :CUENTAADIC INTO :CUENTA, :TIPOCUEN;
                if (CUENTA IS NULL) then
                    begin
                    EXECUTE PROCEDURE ERROR (12, :IDDOC, :CUENTAADIC, 2);
                    CUENTA = CUENTAADIC;
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (12, :IDDOC, :CUENTA, 3);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (12, :IDDOC, :CUENTA, 4);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    if (DBADIC = 'S') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTAADIC, :CONCEPTO, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        SUMA = SUMA + MONTO;
                        END
                    ELSE
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTAADIC, :CONCEPTO, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        SUMA = SUMA - MONTO;
                        END
                    NUMITEMS = NUMITEMS + 1;
                    END
                END
            END
        /* CIERRE EL COMPROBANTE  */
        if (SUMA <> 0) then
            BEGIN
            if (SUMA > 0) then
                BEGIN
                DEBITO = 0;
                CREDITO = SUMA;
                END
            ELSE    
                BEGIN
                DEBITO = SUMA * -1;
                CREDITO = 0;
                END
            if ((TOTAL = 'K') or (TOTAL = 'T')) then
                BEGIN
                if (TOTAL = 'T') then
                    BEGIN
                    SELECT TERC_CTAPROV, TERC_PROV
                        FROM TERCEROS WHERE TERC_NIT = :NIT
                        INTO :CTACIERRE, :PROV;
                    if (PROV = 'S') then
                        SELECT PROV_CTAPAGAR FROM PROVEEDORES WHERE TERC_NIT = :nit
                        INTO :CTACIERRE;
                    END
                /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :CTACIERRE INTO :CUENTA, :TIPOCUEN;
                if (CUENTA IS NULL) then
                    begin
                    EXECUTE PROCEDURE ERROR (12, :IDDOC, :CTACIERRE, 2);
                    CUENTA = CTACIERRE;
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (12, :IDDOC, :CUENTA, 3);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (12, :IDDOC, :CUENTA, 4);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'N') then
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :DEBITO, :CREDITO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                END
            END /* SUMA */
        if (ERROR > 0) then
            VER = 'S';
        SUSPEND;
        END /* NO ANULADO */
    END /* EXISTE LA INTERFAZ */
ELSE
    BEGIN
    EXECUTE PROCEDURE ERROR (12, :IDDOC, :PREFIJO, 1);
    ERROR = ERROR + 1;
    VER = 'S';
    SUSPEND;
    END
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE SALIDAS_SIN_CONTABILIDAD(
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    ID INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    ESTADO VARCHAR(20),
    IDI INTEGER,
    IDC INTEGER)
AS
DECLARE VARIABLE VER CHAR(2);
declare variable FECICNT VARCHAR(10);
declare variable FECFCNT VARCHAR(10);
declare variable ERROR INTEGER;
declare variable idref INTEGER;
BEGIN /*$$IBE$$ 
EXECUTE PROCEDURE fecha_a_conta(FECINI) returning_values (FECICNT);
EXECUTE PROCEDURE fecha_a_conta(FECFIN) returning_values (FECFCNT);
FOR SELECT SALI_ID, PREF_PRE, SALI_NUMERO FROM SALIDAS WHERE SALI_ANULADO = 'N' AND
    SALI_FECHA >= :FECINI AND SALI_FECHA <= :FECFIN
    INTO :ID, :PREF, :NUMERO
DO
  BEGIN
  idref = null;
  SELECT ENCO_IDREF FROM COMPROBANTE_ENCABEZADO WHERE ENCO_TIPOREF = 12 AND ENCO_FECHA >= :FECICNT AND ENCO_FECHA <= :FECFCNT and ENCO_IDREF = :id into :idref;
  if (idref IS NULL) then
  begin
  ESTADO = 'PROCESANDO';
  SUSPEND;
  SELECT MAX(ININ_ID) FROM INTERFAZ_INVENTARIO WHERE PREF_PRE = :PREF AND TIDO_COD = 12 INTO :IDI;
  EXECUTE PROCEDURE CONTABIL_SALIDA (:ID, :IDI) RETURNING_VALUES (:ERROR, :VER, :IDC);
  if (ERROR = 0) then
    BEGIN
      EXECUTE PROCEDURE CONTABILIZA_PENDIENTE (:IDC);
      ESTADO = 'OK';
      END
  ELSE
    ESTADO = 'ERROR';
  suspend;
  end
  END
 $$IBE$$*/ SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE SALIDAS_SIN_CONTABILIDAD(
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    ID INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    ESTADO VARCHAR(20),
    IDI INTEGER,
    IDC INTEGER)
AS
DECLARE VARIABLE VER CHAR(2);
declare variable FECICNT VARCHAR(10);
declare variable FECFCNT VARCHAR(10);
declare variable ERROR INTEGER;
declare variable idref INTEGER;
BEGIN
EXECUTE PROCEDURE fecha_a_conta(FECINI) returning_values (FECICNT);
EXECUTE PROCEDURE fecha_a_conta(FECFIN) returning_values (FECFCNT);
FOR SELECT SALI_ID, PREF_PRE, SALI_NUMERO FROM SALIDAS WHERE SALI_ANULADO = 'N' AND
    SALI_FECHA >= :FECINI AND SALI_FECHA <= :FECFIN
    INTO :ID, :PREF, :NUMERO
DO
  BEGIN
  idref = null;
  SELECT ENCO_IDREF FROM COMPROBANTE_ENCABEZADO WHERE ENCO_TIPOREF = 12 AND ENCO_FECHA >= :FECICNT AND ENCO_FECHA <= :FECFCNT and ENCO_IDREF = :id into :idref;
  if (idref IS NULL) then
  begin
  ESTADO = 'PROCESANDO';
  SUSPEND;
  SELECT MAX(ININ_ID) FROM INTERFAZ_INVENTARIO WHERE PREF_PRE = :PREF AND TIDO_COD = 12 INTO :IDI;
  EXECUTE PROCEDURE CONTABIL_SALIDA (:ID, :IDI) RETURNING_VALUES (:ERROR, :VER, :IDC);
  if (ERROR = 0) then
    BEGIN
      EXECUTE PROCEDURE CONTABILIZA_PENDIENTE (:IDC);
      ESTADO = 'OK';
      END
  ELSE
    ESTADO = 'ERROR';
  suspend;
  end
  END
END

^

SET TERM ; ^

/* 20081016: ORDENES DE COMPRA A PROV. SIMPLIFICADO NO LIQUIDAR IVA */

ALTER TABLE ORDENES_COMPRA
ADD ORDC_SIMPLIFICADO T_BOOLEANO;


/* 20081021: INTERFAZ COMISIONES NOMINA */

ALTER TABLE VENDEDORES
ADD VEND_CC T_NIT;
ALTER TABLE COBRADORES
ADD COBR_CC T_NIT;

CREATE TABLE COMISIONES_POR_PAGAR (
    CMPP_ID T_ID NOT NULL,
    CMPP_FECHA DATE,
    CMPP_VEND T_ID NOT NULL,
    CMPP_DESDE DATE,
    CMPP_HASTA DATE,
    CMPP_MONTO T_MONTO,
    CMPP_CONCEPTO T_CONCEPTO,
    CMPP_NOMINA T_ID);
alter table COMISIONES_POR_PAGAR
add constraint PK_COMISIONES_POR_PAGAR
primary key (CMPP_ID);

ALTER TABLE COMISIONES_POR_PAGAR ADD CMPP_NIT T_NIT;
CREATE INDEX COMISIONES_POR_PAGAR_IDX2
ON COMISIONES_POR_PAGAR (CMPP_VEND);
CREATE INDEX COMISIONES_POR_PAGAR_IDX1
ON COMISIONES_POR_PAGAR (CMPP_NIT);

SET TERM ^ ;

CREATE OR ALTER TRIGGER VENDEDORES_AI FOR VENDEDORES
ACTIVE AFTER INSERT POSITION 0
as
declare variable cobr CHAR(2);
declare variable NUMROWS INTEGER;
begin
EXECUTE PROCEDURE lee_configuracion ('CARTERA','COMISIONES','UNIFICAR CODIGOS DE VENDEDORES Y COBRADORES') returning_values (:COBR);
if (COBR = 'SI') then
    BEGIN
    SELECT COUNT(*) FROM COBRADORES WHERE COBR_COD = NEW.vend_cod INTO :NUMROWS;
    if (NUMROWS = 0) then
      if (new.vend_estado = 'A') then
          INSERT INTO COBRADORES(COBR_COD, COBR_NOM, COBR_ESTADO, COBR_DIRECCION, COBR_TELEFONOS, COBR_CC)
            VALUES (NEW.vend_cod, NEW.vend_nombre, 'S', NEW.vend_direccion, NEW.vend_telefonos, NEW.vend_cc);
      else
          INSERT INTO COBRADORES(COBR_COD, COBR_NOM, COBR_ESTADO, COBR_DIRECCION, COBR_TELEFONOS, COBR_CC)
            VALUES (NEW.vend_cod, NEW.vend_nombre, 'N', NEW.vend_direccion, NEW.vend_telefonos, NEW.vend_cc);
    END
INSERT INTO AUDITORIA(TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
    VALUES (106, 1, 'I', NEW.vend_cod);
end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER VENDEDORES_AU FOR VENDEDORES
ACTIVE AFTER UPDATE POSITION 0
as
declare variable cobr CHAR(2);
declare variable NUMROWS INTEGER;
begin
EXECUTE PROCEDURE lee_configuracion ('CARTERA','COMISIONES','UNIFICAR CODIGOS DE VENDEDORES Y COBRADORES') returning_values (:COBR);
if (COBR = 'SI') then
    BEGIN
    SELECT COUNT(*) FROM COBRADORES WHERE COBR_COD = NEW.vend_cod INTO :NUMROWS;
    if (NUMROWS = 0) then
      if (new.vend_estado = 'A') then
          INSERT INTO COBRADORES(COBR_COD, COBR_NOM, COBR_ESTADO, COBR_DIRECCION, COBR_TELEFONOS, COBR_CC)
            VALUES (NEW.vend_cod, NEW.vend_nombre, 'S', NEW.vend_direccion, NEW.vend_telefonos, NEW.vend_cc);
      else
          INSERT INTO COBRADORES(COBR_COD, COBR_NOM, COBR_ESTADO, COBR_DIRECCION, COBR_TELEFONOS, COBR_CC)
            VALUES (NEW.vend_cod, NEW.vend_nombre, 'N', NEW.vend_direccion, NEW.vend_telefonos, NEW.vend_cc);
    ELSE
      if (new.vend_estado = 'A') then
        UPDATE COBRADORES SET COBR_NOM = NEW.vend_nombre,
            COBR_ESTADO = 'S',
            COBR_DIRECCION = NEW.vend_direccion,
            COBR_TELEFONOS = NEW.vend_telefonos,
            COBR_CC = NEW.vend_cc
            WHERE COBR_COD = NEW.vend_cod;
      else
        UPDATE COBRADORES SET COBR_NOM = NEW.vend_nombre,
            COBR_ESTADO = 'N',
            COBR_DIRECCION = NEW.vend_direccion,
            COBR_TELEFONOS = NEW.vend_telefonos,
            COBR_CC = NEW.vend_cc
            WHERE COBR_COD = NEW.vend_cod;
    END
  INSERT INTO AUDITORIA(TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
    VALUES (106, 1, 'U', NEW.vend_cod);
end
^

SET TERM ; ^


/* 20081022 OPCIONALMENTE INCLUIR EN LOS DOCUMENTOS DEL CLIENTE LOS DEL NIT DE CONTADO POR SI HAY QUE CONVERTIRLO A DOCUMENTO CON NIT */

INSERT INTO CONFIGURACION (CONF_MODULO, CONF_CATEGORIA, CONF_PROPIEDAD, CONF_VALOR, CONF_POSIBLES, CONF_AYUDA) VALUES ('FACTURACION', 'DOCUMENTOS', 'TRAER DOCUMENTOS PENDIENTES DEL CLIENTE DE CONTADO EN DOCUMENTOS DE OTROS CLIENTES', 'NO', 'SI,NO', 'SI: Permiter registrar una factura o remisión de un pedido o cotización originalmente hecha con el NIT de contado');
commit work;

SET TERM ^ ;

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

if (TIPODOC = 31) then /* FACTURA */
    BEGIN
    FOR SELECT FACT_ID, PREF_PRE, FACT_NUMERO, FACT_FECHA, FACT_VENCE, FACT_SUCURSAL
        FROM FACTURAS
        WHERE TERC_NIT = :NIT AND FACT_FECHA <= :FECHA AND (FACT_FECHA >= (:FECHA - :DIAS)) AND FACT_ANULADO = 'N' AND FACT_SUCURSAL = :SUCURSAL
        INTO :ID, :PREFIJO, :NUMERO, :FECDOC, :VENCE, :SUCUR DO
        BEGIN
        EXECUTE PROCEDURE TOTAL_DOC_VENTAS(TIPODOC, ID) returning_values (SUBTOTAL, IVA, CONSUMO);
        TOTAL = SUBTOTAL + IVA + CONSUMO;
        VALIDEZ = VENCE - FECDOC;
        if (TIPODES = 33) then
            BEGIN
            /* VERIFIQUE SI HAY PENDIENTES */
            SELECT SUM(FADE_CANT * FADE_FACTOR - FADE_DEVUELTO) FROM FACTURAS_DETALLE WHERE FACT_ID = :ID INTO :FALTA;
            if (FALTA <> 0) then
                suspend;
            END
        ELSE
            BEGIN
            /* RECORRA LOS ITEMS PARA VER SI TODO ESTA USADO */
            FALTAT = 0;
            FOR SELECT FADE_ITEM FROM FACTURAS_DETALLE WHERE FACT_ID = :ID ORDER BY FADE_ITEM INTO :ITEM DO
                BEGIN
                EXECUTE procedure FALTANTE(TIPODOC, :TIPODES, :ID, :ITEM) returning_values (:FALTA, :UNIDAD, :FACTOR);
                FALTAT = FALTAT + FALTA;
                END
            if (FALTAT <> 0) then
                SUSPEND;
            END
        END
    END
  if (TIPODOC = 32) then /* REMISION */
    BEGIN
    FOR SELECT REVT_ID, PREF_PRE, REVT_NUMERO, REVT_FECHA, 0, REVT_SUCURSAL
        FROM remisiones_venta
        WHERE TERC_NIT = :NIT AND REVT_FECHA <= :FECHA AND (REVT_FECHA >= (:FECHA - :DIAS)) AND REVT_ANULADO = 'N' AND REVT_SUCURSAL = :SUCURSAL
        INTO :ID, :PREFIJO, :NUMERO, :FECDOC, :VALIDEZ, :SUCUR DO
        BEGIN
        EXECUTE PROCEDURE TOTAL_DOC_VENTAS(TIPODOC, ID) returning_values (SUBTOTAL, IVA, CONSUMO);
        TOTAL = SUBTOTAL + IVA + CONSUMO;
        if (TIPODES <> 0) then
            BEGIN
            /* RECORRA LOS ITEMS PARA VER SI TODO ESTA USADO */
            FALTAT = 0;
            FOR SELECT RVDE_ITEM FROM REMISIONES_VENTA_DETALLE WHERE REVT_ID = :ID ORDER BY RVDE_ITEM INTO :ITEM DO
                BEGIN
                EXECUTE procedure FALTANTE(TIPODOC, :TIPODES, :ID, :ITEM) returning_values (:FALTA, :UNIDAD, :FACTOR);
                FALTAT = FALTAT + FALTA;
                END
            if (FALTAT <> 0) then
                SUSPEND;
            END
        END
    END
  if (TIPODOC = 33) then /* DEVOLUCION */
    BEGIN
    FOR SELECT DEVT_ID, PREF_PRE, DEVT_NUMERO, DEVT_FECHA, 0, DEVT_SUCURSAL
        FROM DEVOLUCIONES_VENTAS
        WHERE TERC_NIT = :NIT AND DEVT_FECHA <= :FECHA AND DEVT_ANULADO = 'N' AND DEVT_SUCURSAL = :SUCURSAL
        INTO :ID, :PREFIJO, :NUMERO, :FECDOC, :VALIDEZ, :SUCUR DO
        BEGIN
        EXECUTE PROCEDURE TOTAL_DOC_VENTAS(TIPODOC, ID) returning_values (SUBTOTAL, IVA, CONSUMO);
        TOTAL = SUBTOTAL + IVA + CONSUMO;
        SUSPEND;
        END
    END
  if (TIPODOC = 34) then /* PEDIDO */
    BEGIN
    FOR SELECT PEDI_ID, PREF_PRE, PEDI_NUMERO, PEDI_FECHA, PEDI_VALIDEZ, PEDI_SUCURSAL
        FROM PEDIDOS
        WHERE ((TERC_NIT = :NIT) OR ((:traercontado = 'SI') AND (TERC_NIT IN (SELECT TERC_NIT FROM PUNTO_VENTA))))
        AND PEDI_FECHA <= :FECHA AND PEDI_FECHA+PEDI_VALIDEZ >= :FECHA AND PEDI_ANULADO = 'N' AND PEDI_SUCURSAL = :SUCURSAL
        INTO :ID, :PREFIJO, :NUMERO, :FECDOC, :VALIDEZ, :SUCUR DO
        BEGIN
        EXECUTE PROCEDURE TOTAL_DOC_VENTAS(TIPODOC, ID) returning_values (SUBTOTAL, IVA, CONSUMO);
        TOTAL = SUBTOTAL + IVA + CONSUMO;
        if (TIPODES <> 0) then
            BEGIN
            /* RECORRA LOS ITEMS PARA VER SI TODO ESTA USADO */
            FALTAT = 0;
            EXECUTE PROCEDURE lee_configuracion('FACTURACION','DOCUMENTOS','PERMITIR LLAMAR DOCUMENTOS PREVIAMENTE USADOS EN OTRO TIPO DE DOCUMENTO') returning_values (:USADO);
            if (USADO = 'NO') then
                SELECT COUNT(*) FROM consolide_faltantes WHERE CEFA_TIPOORI = 34 AND CEFA_IDORI = :ID AND CEFA_TIPODES <> :tipodes INTO :NUMROWS;
            ELSE
                NUMROWS = 0;
            if (NUMROWS = 0) then
                FOR SELECT PEDE_ITEM FROM PEDIDOS_DETALLE WHERE PEDI_ID = :ID ORDER BY PEDE_ITEM INTO :ITEM DO
                    BEGIN
                    EXECUTE procedure FALTANTE(TIPODOC, :TIPODES, :ID, :ITEM) returning_values (:FALTA, :UNIDAD, :FACTOR);
                    FALTAT = FALTAT + FALTA;
                    END
            if (FALTAT <> 0) then
                SUSPEND;
            END
        ELSE
            SUSPEND;
        END
    END
  if (TIPODOC = 35) then /* COTIZACION */
    BEGIN
    FOR SELECT COTI_ID, PREF_PRE, COTI_NUMERO, COTI_FECHA, COTI_VALIDEZ, COTI_SUCURSAL
        FROM cotizaciones
        WHERE ((TERC_NIT = :NIT) OR ((:traercontado = 'SI') AND (TERC_NIT IN (SELECT TERC_NIT FROM PUNTO_VENTA))))
        AND COTI_FECHA <= :FECHA AND COTI_FECHA+COTI_VALIDEZ >= :FECHA AND COTI_ANULADO = 'N' AND COTI_SUCURSAL = :SUCURSAL
        INTO :ID, :PREFIJO, :NUMERO, :FECDOC, :VALIDEZ, :SUCUR DO
        BEGIN
        EXECUTE PROCEDURE TOTAL_DOC_VENTAS(TIPODOC, ID) returning_values (SUBTOTAL, IVA, CONSUMO);
        TOTAL = SUBTOTAL + IVA + CONSUMO;
        if (TIPODES <> 0) then
            BEGIN
            /* RECORRA LOS ITEMS PARA VER SI TODO ESTA USADO */
            FALTAT = 0;
            EXECUTE PROCEDURE lee_configuracion('FACTURACION','DOCUMENTOS','PERMITIR LLAMAR DOCUMENTOS PREVIAMENTE USADOS EN OTRO TIPO DE DOCUMENTO') returning_values (:USADO);
            if (USADO = 'NO') then
                SELECT COUNT(*) FROM consolide_faltantes WHERE CEFA_TIPOORI = 35 AND CEFA_IDORI = :ID AND CEFA_TIPODES <> :tipodes INTO :NUMROWS;
            ELSE
                NUMROWS = 0;
            if (NUMROWS = 0) then
                FOR SELECT CTDE_ITEM FROM COTIZACIONES_DETALLE WHERE COTI_ID = :ID ORDER BY CTDE_ITEM INTO :ITEM DO
                    BEGIN
                    EXECUTE procedure FALTANTE(TIPODOC, :TIPODES, :ID, :ITEM) returning_values (:FALTA, :UNIDAD, :FACTOR);
                    FALTAT = FALTAT + FALTA;
                    END
            if (FALTAT <> 0) then
                SUSPEND;
            END
        ELSE
            SUSPEND;
        END
    END
END
^

SET TERM ; ^


/* 20081023: MULTIPLE ROWS IN SINGLETON SELECT EN REPORTE DE BARRAS ARTICULO */

SET TERM ^ ;

CREATE OR ALTER PROCEDURE REP_ARTICULO_BARRAS(
    ARTINI VARCHAR(20),
    ARTFIN VARCHAR(20),
    ORDEN CHAR(1))
RETURNS (
    ARTI_COD VARCHAR(15),
    ARTI_DES VARCHAR(60),
    GRUP_COD VARCHAR(2),
    GRUP_NOM VARCHAR(30),
    SUBG_COD VARCHAR(3),
    SUBG_NOM VARCHAR(30),
    MARC_COD VARCHAR(3),
    MARC_NOM VARCHAR(30),
    ARTI_UNIDAD VARCHAR(8),
    COBA_COD VARCHAR(15),
    COBA_DES VARCHAR(60),
    COBA_UNIDAD VARCHAR(8))
AS
DECLARE VARIABLE CODINI VARCHAR(20);
DECLARE VARIABLE CODFIN VARCHAR(20);
DECLARE VARIABLE DESINI VARCHAR(20);
DECLARE VARIABLE DESFIN VARCHAR(20);
begin
if (ORDEN = 'C') then
    BEGIN
    CODINI = ARTINI;
    CODFIN = ARTFIN;
    DESINI = '';
    DESFIN = 'zz';
    END
ELSE
    BEGIN
    DESINI = ARTINI;
    DESFIN = ARTFIN;
    CODINI = '';
    CODFIN = 'zz';
    END
FOR select a.arti_cod, arti_des, a.grup_cod, subg_cod, marc_cod, arti_unidad, coba_cod, coba_des, coba_unidad
    from articulo a , barras_articulo b WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND ARTI_DES >= :DESINI AND ARTI_DES <= :DESFIN AND A.arti_cod = B.arti_cod
    INTO  :ARTI_COD, :ARTI_DES, :GRUP_COD, :SUBG_COD, :MARC_COD, :ARTI_UNIDAD, :COBA_COD, :COBA_DES, :COBA_UNIDAD
    do
    BEGIN
      SELECT GRUP_NOM FROM GRUPO WHERE GRUP_COD = :GRUP_COD INTO :GRUP_NOM;
      SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :MARC_COD INTO :MARC_NOM;
      SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :SUBG_COD AND grup_cod = :grup_cod INTO :SUBG_NOM;
       suspend;
    END
end
^

SET TERM ; ^



/* 20081024: CODIGO DEL CLIENTE ESTABA MAL DIMENSIONADO, PODIA PRODUCIR STRINF TRUNCATION */
SET TERM ^ ;

CREATE OR ALTER PROCEDURE IMPR_NOTACRCL(
    ID INTEGER)
RETURNS (
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    CONCEPTO VARCHAR(60),
    NIT VARCHAR(20),
    NOMBRE VARCHAR(60),
    DIR VARCHAR(60),
    CIU VARCHAR(40),
    TEL VARCHAR(40),
    CONTACTO VARCHAR(60),
    FAX VARCHAR(25),
    CEL VARCHAR(25),
    EMAIL VARCHAR(100),
    MONTO NUMERIC(18,2),
    IVAPORC NUMERIC(9,2),
    IVAMONTO NUMERIC(18,2),
    RTFTEPORC NUMERIC(9,2),
    RTFTEMONTO NUMERIC(18,2),
    RTIVAPORC NUMERIC(9,2),
    RTIVAMONTO NUMERIC(18,2),
    RTICAPORC NUMERIC(9,2),
    RTICAMONTO NUMERIC(18,2),
    DTOFECHA DATE,
    DTOPORC NUMERIC(9,2),
    DTOMONTO NUMERIC(18,2),
    TOTAL NUMERIC(18,2),
    TOTALPAGAR NUMERIC(18,2),
    OBS BLOB SUB_TYPE 1 SEGMENT SIZE 80,
    CLIE_COD VARCHAR(20),
    ZONA_COD VARCHAR(60),
    COBR_COD INTEGER,
    COBR_NOM VARCHAR(60),
    DOCAPLICADO VARCHAR(21))
AS
declare variable tipoAPL INTEGER;
declare variable numAPL VARCHAR(10) CHARACTER SET NONE;
BEGIN
  SELECT PREF_PRE, NCCL_NUMERO, NCCL_FECHA, NCCL_CONC, N.TERC_NIT, TERC_NOM, TERC_DIR, TERC_CIU, TERC_TEL, TERC_CONTACTO, TERC_FAX, TERC_CEL, TERC_EMAIL, NCCL_MONTO,
    NCCL_IVAPORC, NCCL_IVAMONTO, NCCL_RTFTEPORC, NCCL_RTFTEMONTO, NCCL_RTIVAPORC, NCCL_RTIVAMONTO, NCCL_RTICAPORC, NCCL_RTICAMONTO, NCCL_OBS, CLIE_COD, N.COBR_COD,N.NCCL_TIPODOCAPL,N.NCCL_NUMDOCAPL
    FROM NOTAS_CREDITO_CLIENTES N, TERCEROS T, CLIENTES C
    WHERE N.TERC_NIT = T.TERC_NIT AND T.TERC_NIT = C.TERC_NIT AND NCCL_ID = :ID
    INTO :PREFIJO, :NUMERO, :FECHA, :CONCEPTO, :NIT, :NOMBRE, :DIR, :CIU, :TEL, :CONTACTO, :FAX, :CEL, :EMAIL, :MONTO, :IVAPORC, :IVAMONTO, :RTFTEPORC, :RTFTEMONTO, :RTIVAPORC, :RTIVAMONTO, :RTICAPORC, :RTICAMONTO, :OBS, :CLIE_COD, :COBR_COD,:tipoapl ,:numapl;
  if (COBR_COD IS NOT NULL) then
    SELECT COBR_NOM FROM COBRADORES  WHERE COBR_COD = :COBR_COD INTO :COBR_NOM;
  TOTAL = MONTO + IVAMONTO;
  TOTALPAGAR = TOTAL - RTFTEMONTO - RTIVAMONTO - RTICAMONTO;
  if (tipoAPL IS NOT NULL) then
    BEGIN
     SELECT (T.TIDO_NOMCORTO||' - '||:numAPL) FROM TIPO_DOCUMENTO T WHERE T.TIDO_COD = :tipoAPL
       INTO :DOCAPLICADO;
    END
  SUSPEND;
END
^

SET TERM ; ^


SET TERM ^ ;

CREATE OR ALTER PROCEDURE IMPR_NOTADBCL(
    ID INTEGER)
RETURNS (
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    CONCEPTO VARCHAR(60),
    NIT VARCHAR(20),
    NOMBRE VARCHAR(60),
    DIR VARCHAR(60),
    CIU VARCHAR(40),
    TEL VARCHAR(40),
    CONTACTO VARCHAR(60),
    FAX VARCHAR(25),
    CEL VARCHAR(25),
    EMAIL VARCHAR(100),
    VENCE DATE,
    MONTO NUMERIC(18,2),
    IVAPORC NUMERIC(9,2),
    IVAMONTO NUMERIC(18,2),
    RTFTEPORC NUMERIC(9,2),
    RTFTEMONTO NUMERIC(18,2),
    RTIVAPORC NUMERIC(9,2),
    RTIVAMONTO NUMERIC(18,2),
    RTICAPORC NUMERIC(9,2),
    RTICAMONTO NUMERIC(18,2),
    DTOFECHA DATE,
    DTOPORC NUMERIC(9,2),
    DTOMONTO NUMERIC(18,2),
    TOTAL NUMERIC(18,2),
    TOTALPAGAR NUMERIC(18,2),
    OBS BLOB SUB_TYPE 1 SEGMENT SIZE 80,
    CLIE_COD VARCHAR(20),
    ZONA_COD VARCHAR(60),
    COBR_COD INTEGER,
    COBR_NOM VARCHAR(60))
AS
BEGIN
  SELECT PREF_PRE, NDCL_NUMERO, NDCL_FECHA, NDCL_CONC, N.TERC_NIT, TERC_NOM, TERC_DIR, TERC_CIU, TERC_TEL, TERC_CONTACTO, TERC_FAX, TERC_CEL, TERC_EMAIL, NDCL_VENCE, NDCL_MONTO,
    NDCL_IVAPORC, NDCL_IVAMONTO, NDCL_RTFTEPORC, NDCL_RTFTEMONTO, NDCL_RTIVAPORC, NDCL_RTIVAMONTO, NDCL_RTICAPORC, NDCL_RTICAMONTO, NDCL_FECHADTO, NDCL_DTOFPORC, NDCL_DTOFMONTO, NDCL_OBS, CLIE_COD, N.COBR_COD
    FROM NOTAS_DEBITO_CLIENTES N, TERCEROS T, CLIENTES C
    WHERE N.TERC_NIT = T.TERC_NIT AND T.TERC_NIT = C.TERC_NIT AND NDCL_ID = :ID
    INTO :PREFIJO, :NUMERO, :FECHA, :CONCEPTO, :NIT, :NOMBRE, :DIR, :CIU, :TEL, :CONTACTO, :FAX, :CEL, :EMAIL, :VENCE, :MONTO, :IVAPORC, :IVAMONTO, :RTFTEPORC, :RTFTEMONTO, :RTIVAPORC, :RTIVAMONTO, :RTICAPORC, :RTICAMONTO, :DTOFECHA, :DTOPORC, :DTOMONTO, :OBS, :CLIE_COD, :COBR_COD;
  if (COBR_COD IS NOT NULL) then
    SELECT COBR_NOM FROM COBRADORES  WHERE COBR_COD = :COBR_COD INTO :COBR_NOM;
  TOTAL = MONTO + IVAMONTO;
  TOTALPAGAR = TOTAL - RTFTEMONTO - RTIVAMONTO - RTICAMONTO;
    
  SUSPEND;
END
^

SET TERM ; ^


/* 20081025:  VENDEDOR EN DOC X CLIENTE */

SET TERM ^ ;

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

if (TIPODOC = 31) then /* FACTURA */
    BEGIN
    FOR SELECT FACT_ID, PREF_PRE, FACT_NUMERO, FACT_FECHA, FACT_VENCE, FACT_SUCURSAL, VEND_COD
        FROM FACTURAS
        WHERE TERC_NIT = :NIT AND FACT_FECHA <= :FECHA AND (FACT_FECHA >= (:FECHA - :DIAS)) AND FACT_ANULADO = 'N' AND FACT_SUCURSAL = :SUCURSAL
        INTO :ID, :PREFIJO, :NUMERO, :FECDOC, :VENCE, :SUCUR, :VEND DO
        BEGIN
        EXECUTE PROCEDURE TOTAL_DOC_VENTAS(TIPODOC, ID) returning_values (SUBTOTAL, IVA, CONSUMO);
        TOTAL = SUBTOTAL + IVA + CONSUMO;
        VALIDEZ = VENCE - FECDOC;
        if (TIPODES = 33) then
            BEGIN
            /* VERIFIQUE SI HAY PENDIENTES */
            SELECT SUM(FADE_CANT * FADE_FACTOR - FADE_DEVUELTO) FROM FACTURAS_DETALLE WHERE FACT_ID = :ID INTO :FALTA;
            if (FALTA <> 0) then
                suspend;
            END
        ELSE
            BEGIN
            /* RECORRA LOS ITEMS PARA VER SI TODO ESTA USADO */
            FALTAT = 0;
            FOR SELECT FADE_ITEM FROM FACTURAS_DETALLE WHERE FACT_ID = :ID ORDER BY FADE_ITEM INTO :ITEM DO
                BEGIN
                EXECUTE procedure FALTANTE(TIPODOC, :TIPODES, :ID, :ITEM) returning_values (:FALTA, :UNIDAD, :FACTOR);
                FALTAT = FALTAT + FALTA;
                END
            if (FALTAT <> 0) then
                SUSPEND;
            END
        END
    END
  if (TIPODOC = 32) then /* REMISION */
    BEGIN
    FOR SELECT REVT_ID, PREF_PRE, REVT_NUMERO, REVT_FECHA, 0, REVT_SUCURSAL, VEND_COD
        FROM remisiones_venta
        WHERE TERC_NIT = :NIT AND REVT_FECHA <= :FECHA AND (REVT_FECHA >= (:FECHA - :DIAS)) AND REVT_ANULADO = 'N' AND REVT_SUCURSAL = :SUCURSAL
        INTO :ID, :PREFIJO, :NUMERO, :FECDOC, :VALIDEZ, :SUCUR, :VEND DO
        BEGIN
        EXECUTE PROCEDURE TOTAL_DOC_VENTAS(TIPODOC, ID) returning_values (SUBTOTAL, IVA, CONSUMO);
        TOTAL = SUBTOTAL + IVA + CONSUMO;
        if (TIPODES <> 0) then
            BEGIN
            /* RECORRA LOS ITEMS PARA VER SI TODO ESTA USADO */
            FALTAT = 0;
            FOR SELECT RVDE_ITEM FROM REMISIONES_VENTA_DETALLE WHERE REVT_ID = :ID ORDER BY RVDE_ITEM INTO :ITEM DO
                BEGIN
                EXECUTE procedure FALTANTE(TIPODOC, :TIPODES, :ID, :ITEM) returning_values (:FALTA, :UNIDAD, :FACTOR);
                FALTAT = FALTAT + FALTA;
                END
            if (FALTAT <> 0) then
                SUSPEND;
            END
        END
    END
  if (TIPODOC = 33) then /* DEVOLUCION */
    BEGIN
    FOR SELECT DEVT_ID, PREF_PRE, DEVT_NUMERO, DEVT_FECHA, 0, DEVT_SUCURSAL, VEND_COD
        FROM DEVOLUCIONES_VENTAS
        WHERE TERC_NIT = :NIT AND DEVT_FECHA <= :FECHA AND DEVT_ANULADO = 'N' AND DEVT_SUCURSAL = :SUCURSAL
        INTO :ID, :PREFIJO, :NUMERO, :FECDOC, :VALIDEZ, :SUCUR, :VEND DO
        BEGIN
        EXECUTE PROCEDURE TOTAL_DOC_VENTAS(TIPODOC, ID) returning_values (SUBTOTAL, IVA, CONSUMO);
        TOTAL = SUBTOTAL + IVA + CONSUMO;
        SUSPEND;
        END
    END
  if (TIPODOC = 34) then /* PEDIDO */
    BEGIN
    FOR SELECT PEDI_ID, PREF_PRE, PEDI_NUMERO, PEDI_FECHA, PEDI_VALIDEZ, PEDI_SUCURSAL, VEND_COD
        FROM PEDIDOS
        WHERE ((TERC_NIT = :NIT) OR ((:traercontado = 'SI') AND (TERC_NIT IN (SELECT TERC_NIT FROM PUNTO_VENTA))))
        AND PEDI_FECHA <= :FECHA AND PEDI_FECHA+PEDI_VALIDEZ >= :FECHA AND PEDI_ANULADO = 'N' AND PEDI_SUCURSAL = :SUCURSAL
        INTO :ID, :PREFIJO, :NUMERO, :FECDOC, :VALIDEZ, :SUCUR, :VEND DO
        BEGIN
        EXECUTE PROCEDURE TOTAL_DOC_VENTAS(TIPODOC, ID) returning_values (SUBTOTAL, IVA, CONSUMO);
        TOTAL = SUBTOTAL + IVA + CONSUMO;
        if (TIPODES <> 0) then
            BEGIN
            /* RECORRA LOS ITEMS PARA VER SI TODO ESTA USADO */
            FALTAT = 0;
            EXECUTE PROCEDURE lee_configuracion('FACTURACION','DOCUMENTOS','PERMITIR LLAMAR DOCUMENTOS PREVIAMENTE USADOS EN OTRO TIPO DE DOCUMENTO') returning_values (:USADO);
            if (USADO = 'NO') then
                SELECT COUNT(*) FROM consolide_faltantes WHERE CEFA_TIPOORI = 34 AND CEFA_IDORI = :ID AND CEFA_TIPODES <> :tipodes INTO :NUMROWS;
            ELSE
                NUMROWS = 0;
            if (NUMROWS = 0) then
                FOR SELECT PEDE_ITEM FROM PEDIDOS_DETALLE WHERE PEDI_ID = :ID ORDER BY PEDE_ITEM INTO :ITEM DO
                    BEGIN
                    EXECUTE procedure FALTANTE(TIPODOC, :TIPODES, :ID, :ITEM) returning_values (:FALTA, :UNIDAD, :FACTOR);
                    FALTAT = FALTAT + FALTA;
                    END
            if (FALTAT <> 0) then
                SUSPEND;
            END
        ELSE
            SUSPEND;
        END
    END
  if (TIPODOC = 35) then /* COTIZACION */
    BEGIN
    FOR SELECT COTI_ID, PREF_PRE, COTI_NUMERO, COTI_FECHA, COTI_VALIDEZ, COTI_SUCURSAL, VEND_COD
        FROM cotizaciones
        WHERE ((TERC_NIT = :NIT) OR ((:traercontado = 'SI') AND (TERC_NIT IN (SELECT TERC_NIT FROM PUNTO_VENTA))))
        AND COTI_FECHA <= :FECHA AND COTI_FECHA+COTI_VALIDEZ >= :FECHA AND COTI_ANULADO = 'N' AND COTI_SUCURSAL = :SUCURSAL
        INTO :ID, :PREFIJO, :NUMERO, :FECDOC, :VALIDEZ, :SUCUR, :VEND DO
        BEGIN
        EXECUTE PROCEDURE TOTAL_DOC_VENTAS(TIPODOC, ID) returning_values (SUBTOTAL, IVA, CONSUMO);
        TOTAL = SUBTOTAL + IVA + CONSUMO;
        if (TIPODES <> 0) then
            BEGIN
            /* RECORRA LOS ITEMS PARA VER SI TODO ESTA USADO */
            FALTAT = 0;
            EXECUTE PROCEDURE lee_configuracion('FACTURACION','DOCUMENTOS','PERMITIR LLAMAR DOCUMENTOS PREVIAMENTE USADOS EN OTRO TIPO DE DOCUMENTO') returning_values (:USADO);
            if (USADO = 'NO') then
                SELECT COUNT(*) FROM consolide_faltantes WHERE CEFA_TIPOORI = 35 AND CEFA_IDORI = :ID AND CEFA_TIPODES <> :tipodes INTO :NUMROWS;
            ELSE
                NUMROWS = 0;
            if (NUMROWS = 0) then
                FOR SELECT CTDE_ITEM FROM COTIZACIONES_DETALLE WHERE COTI_ID = :ID ORDER BY CTDE_ITEM INTO :ITEM DO
                    BEGIN
                    EXECUTE procedure FALTANTE(TIPODOC, :TIPODES, :ID, :ITEM) returning_values (:FALTA, :UNIDAD, :FACTOR);
                    FALTAT = FALTAT + FALTA;
                    END
            if (FALTAT <> 0) then
                SUSPEND;
            END
        ELSE
            SUSPEND;
        END
    END
END
^

SET TERM ; ^



/* 20081029: STRING TRUNCATION POR NOMBRE GRUPO MUY CORTO  */

SET TERM ^ ;

CREATE OR ALTER PROCEDURE REP_COMPRAS_PROVEEDOR(
    TIPO INTEGER,
    NITDESDE VARCHAR(20),
    NITHASTA VARCHAR(20),
    FECINI DATE,
    FECFIN DATE,
    DETALLE CHAR(1),
    ORDEN CHAR(1),
    CEROS CHAR(1))
RETURNS (
    NIT VARCHAR(20),
    NOMBRE VARCHAR(60),
    TELEFONO VARCHAR(40),
    CIUDAD VARCHAR(40),
    CODZONA VARCHAR(2),
    NOMZONA VARCHAR(60),
    NOMTIPO VARCHAR(50),
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(6),
    NUMPROV VARCHAR(20),
    ID INTEGER,
    FECDOC DATE,
    CANTIDAD INTEGER,
    SUBTOTAL NUMERIC(18,2),
    DTO NUMERIC(18,2),
    ADICIONAL NUMERIC(18,2),
    IVA NUMERIC(18,2),
    EXTRA NUMERIC(18,2),
    TOTAL NUMERIC(18,2),
    RTFTE NUMERIC(18,2),
    RTIVA NUMERIC(18,2),
    RTICA NUMERIC(18,2),
    NETO NUMERIC(18,2))
AS
declare variable NITINI VARCHAR(15);
declare variable NITFIN VARCHAR(15);
declare variable NOMINI VARCHAR(15);
declare variable NOMFIN VARCHAR(15);
BEGIN
if (ORDEN = 'C') then
    BEGIN
    NITINI = NITDESDE;
    NITFIN = NITHASTA;
    NOMINI = '';
    NOMFIN = 'zz';
    END
ELSE
    BEGIN
    NITINI = NITDESDE;
    NITFIN = NITHASTA;
    NOMINI = '';
    NOMFIN = 'zz';
    END

SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = :TIPO INTO :NOMTIPO;
FOR select T.TERC_NIT, TERC_NOM,  TERC_TEL, TERC_CIU, P.GRPR_COD
    from terceros T, PROVEEDORES P
    where P.TERC_NIT = T.TERC_NIT AND TERC_PROV = 'S' AND T.TERC_NIT >= :NITINI AND T.TERC_NIT <= :NITFIN AND TERC_NOM >= :NOMINI AND TERC_NOM <= :NOMFIN
    INTO :NIT, :NOMBRE, :TELEFONO, :CIUDAD, :CODZONA
    DO  
    BEGIN
    SELECT GRPR_NOM FROM GRUPOS_PROVEEDORES WHERE GRPR_COD = :CODZONA INTO :NOMZONA;
    if (DETALLE = 'N') then
        BEGIN
        if (TIPO = 21) then
          SELECT COUNT(*), SUM(FACO_DTOMONTO), SUM(FACO_ADICIONAL), SUM(FACO_IVAMONTO), SUM(FACO_EXTRA), SUM(FACO_RTFTEMONTO), SUM(FACO_RTIVAMONTO), SUM(FACO_RTICAMONTO), SUM(FACO_TOTAL)
            FROM FACTURAS_COMPRA
            WHERE TERC_NIT = :NIT AND FACO_FECHA >= :FECINI AND FACO_FECHA <= :FECFIN AND FACO_ANULADO = 'N'
            INTO :CANTIDAD, :DTO, :ADICIONAL, :IVA, :EXTRA, :RTFTE, :RTIVA, :RTICA, :TOTAL;
        if (TIPO = 22) then
          SELECT COUNT(*), 0, 0, SUM(REPR_IVAMONTO), 0, 0, 0, 0, SUM(REPR_TOTAL)
            FROM REMISION_PROVEEDOR
            WHERE TERC_NIT = :NIT AND REPR_FECHA >= :FECINI AND REPR_FECHA <= :FECFIN AND REPR_ANULADO = 'N'
            INTO :CANTIDAD, :DTO, :ADICIONAL, :IVA, :EXTRA, :RTFTE, :RTIVA, :RTICA, :TOTAL;
        if (TIPO = 24) then
          SELECT COUNT(*), SUM(DVCO_DTOMONTO), SUM(DVCO_ADICIONAL), SUM(DVCO_IVAMONTO), SUM(DVCO_EXTRA), SUM(DVCO_RTFTEMONTO), SUM(DVCO_RTIVAMONTO), SUM(DVCO_RTICAMONTO), SUM(DVCO_TOTAL)
            FROM DEVOLUCIONES_COMPRAS
            WHERE TERC_NIT = :NIT AND DVCO_FECHA >= :FECINI AND DVCO_FECHA <= :FECFIN AND DVCO_ANULADO = 'N'
            INTO :CANTIDAD, :DTO, :ADICIONAL, :IVA, :EXTRA, :RTFTE, :RTIVA, :RTICA, :TOTAL;
        if (TIPO = 23) then
          SELECT COUNT(*), SUM(ORDC_DTOMONTO), SUM(ORDC_ADICIONAL), SUM(ORDC_IVAMONTO), SUM(ORDC_EXTRA), 0, 0, 0, SUM(ORDC_TOTAL)
            FROM ORDENES_COMPRA
            WHERE TERC_NIT = :NIT AND ORDC_FECHA >= :FECINI AND ORDC_FECHA <= :FECFIN AND ORDC_ANULADO = 'N'
            INTO :CANTIDAD, :DTO, :ADICIONAL, :IVA, :EXTRA, :RTFTE, :RTIVA, :RTICA, :TOTAL;
        if (TIPO = 25) then
          SELECT COUNT(*), SUM(COPR_DTOMONTO), SUM(COPR_ADICIONAL), SUM(COPR_IVAMONTO), SUM(COPR_EXTRA), 0, 0, 0, SUM(COPR_TOTAL)
            FROM COTIZACION_PROVEEDOR
            WHERE TERC_NIT = :NIT AND COPR_FECHA >= :FECINI AND COPR_FECHA <= :FECFIN AND COPR_ANULADO = 'N'
            INTO :CANTIDAD, :DTO, :ADICIONAL, :IVA, :EXTRA, :RTFTE, :RTIVA, :RTICA, :TOTAL;
        if (CANTIDAD IS NULL) then
            CANTIDAD = 0;
        if (DTO IS NULL) then
            DTO = 0;
        if (ADICIONAL IS NULL) then
            ADICIONAL = 0;
        if (IVA IS NULL) then
            IVA = 0;
        if (EXTRA IS NULL) then
            EXTRA = 0;
        if (RTFTE IS NULL) then
            RTFTE = 0;
        if (RTIVA IS NULL) then
            RTIVA = 0;
        if (RTICA IS NULL) then
            RTICA = 0;
        SUBTOTAL = TOTAL - EXTRA - IVA - ADICIONAL + DTO;
        NETO = TOTAL - RTFTE - RTIVA - RTICA;
        if (CEROS = 'S') then
          SUSPEND;
        ELSE
          if (CANTIDAD > 0) then
            SUSPEND;
        END
    ELSE
        BEGIN
        if (TIPO = 21) THEN
          FOR SELECT FACO_ID, PREF_PRE, FACO_NUMERO, FACO_NUMPROV, FACO_FECHA, FACO_DTOMONTO, FACO_ADICIONAL, FACO_IVAMONTO, FACO_EXTRA, FACO_TOTAL, FACO_RTFTEMONTO, FACO_RTIVAMONTO, FACO_RTICAMONTO
            FROM FACTURAS_COMPRA WHERE TERC_NIT = :NIT AND FACO_FECHA >= :FECINI AND FACO_FECHA <= :FECFIN AND FACO_ANULADO = 'N' ORDER BY FACO_FECHA, FACO_ID
            INTO :ID, :PREFIJO, :NUMERO, :NUMPROV, :FECDOC, :DTO, :ADICIONAL, :IVA, :EXTRA, :TOTAL, :RTFTE, :RTIVA, :RTICA
            DO
            BEGIN
            SUBTOTAL = TOTAL - EXTRA - IVA - ADICIONAL + DTO;
            NETO = TOTAL - RTFTE - RTIVA - RTICA;
            SUSPEND;
            END
        if (TIPO = 22) THEN
          FOR SELECT REPR_ID, PREF_PRE, REPR_NUMERO, REPR_NUMPROV, REPR_FECHA, 0, 0, REPR_IVAMONTO, 0, REPR_TOTAL, 0, 0, 0
            FROM REMISION_PROVEEDOR WHERE TERC_NIT = :NIT AND REPR_FECHA >= :FECINI AND REPR_FECHA <= :FECFIN AND REPR_ANULADO = 'N' ORDER BY REPR_FECHA, REPR_ID
            INTO :ID, :PREFIJO, :NUMERO, :NUMPROV, :FECDOC, :DTO, :ADICIONAL, :IVA, :EXTRA, :TOTAL, :RTFTE, :RTIVA, :RTICA
            DO
            BEGIN
            SUBTOTAL = TOTAL - EXTRA - IVA - ADICIONAL + DTO;
            NETO = TOTAL - RTFTE - RTIVA - RTICA;
            SUSPEND;
            END
        if (TIPO = 24) then
          FOR SELECT DVCO_ID, PREF_PRE, DVCO_NUMERO, '', DVCO_FECHA, DVCO_DTOMONTO, DVCO_ADICIONAL, DVCO_IVAMONTO, DVCO_EXTRA, DVCO_TOTAL, DVCO_RTFTEMONTO, DVCO_RTIVAMONTO, DVCO_RTICAMONTO
            FROM DEVOLUCIONES_COMPRAS WHERE TERC_NIT = :NIT AND DVCO_FECHA >= :FECINI AND DVCO_FECHA <= :FECFIN AND DVCO_ANULADO = 'N' ORDER BY DVCO_FECHA, DVCO_ID
            INTO :ID, :PREFIJO, :NUMERO, :NUMPROV, :FECDOC, :DTO, :ADICIONAL, :IVA, :EXTRA, :TOTAL, :RTFTE, :RTIVA, :RTICA
            DO
            BEGIN
            SUBTOTAL = TOTAL - EXTRA - IVA - ADICIONAL + DTO;
            NETO = TOTAL - RTFTE - RTIVA - RTICA;
            SUSPEND;
            END
        if (TIPO = 23) THEN
          FOR SELECT ORDC_ID, PREF_PRE, ORDC_NUMERO, '', ORDC_FECHA, ORDC_DTOMONTO, ORDC_ADICIONAL, ORDC_IVAMONTO, ORDC_EXTRA, ORDC_TOTAL, 0, 0, 0
            FROM ORDENES_COMPRA WHERE TERC_NIT = :NIT AND ORDC_FECHA >= :FECINI AND ORDC_FECHA <= :FECFIN AND ORDC_ANULADO = 'N' ORDER BY ORDC_FECHA, ORDC_ID
            INTO :ID, :PREFIJO, :NUMERO, :NUMPROV, :FECDOC, :DTO, :ADICIONAL, :IVA, :EXTRA, :TOTAL, :RTFTE, :RTIVA, :RTICA
            DO
            BEGIN
            SUBTOTAL = TOTAL - EXTRA - IVA - ADICIONAL + DTO;
            NETO = TOTAL - RTFTE - RTIVA - RTICA;
            SUSPEND;
            END
        if (TIPO = 25) THEN
          FOR SELECT COPR_ID, PREF_PRE, COPR_NUMERO, '', COPR_FECHA, COPR_DTOMONTO, COPR_ADICIONAL, COPR_IVAMONTO, COPR_EXTRA, COPR_TOTAL, 0, 0, 0
            FROM COTIZACION_PROVEEDOR WHERE TERC_NIT = :NIT AND COPR_FECHA >= :FECINI AND COPR_FECHA <= :FECFIN AND COPR_ANULADO = 'N' ORDER BY COPR_FECHA, COPR_ID
            INTO :ID, :PREFIJO, :NUMERO, :NUMPROV, :FECDOC, :DTO, :ADICIONAL, :IVA, :EXTRA, :TOTAL, :RTFTE, :RTIVA, :RTICA
            DO
            BEGIN
            SUBTOTAL = TOTAL - EXTRA - IVA - ADICIONAL + DTO;
            NETO = TOTAL - RTFTE - RTIVA - RTICA;
            SUSPEND;
            END
        END
    END
END
^

SET TERM ; ^

/* 20081030: FACTURACION PERIODICA, CONCEPTOS A FACTURAR Y POSIBILIDAD DE ASOCIAR UN CLIENTE A UN CONCEPTO PERIODICO  */

CREATE TABLE FACTURA_CONCEPTO (
    FACC_ID T_ID NOT NULL,
    FACC_NOMBRE T_CONCEPTO);
alter table FACTURA_CONCEPTO
add constraint PK_FACTURA_CONCEPTO primary key (FACC_ID);

CREATE TABLE FACTURA_CONCEPTO_ITEMS (
    FACC_ID T_ID NOT NULL,
    FACI_ITEM T_ID NOT NULL,
    ARTI_COD T_COD_ARTICULO,
    FACI_CANT T_CANTIDAD,
    FACI_PRUNIT T_MONTO);
alter table FACTURA_CONCEPTO_ITEMS
add constraint PK_FACTURA_CONCEPTO_ITEMS primary key (FACC_ID,FACI_ITEM);

alter table FACTURA_CONCEPTO_ITEMS
add constraint FK_FACTURA_CONCEPTO_ITEMS_1 foreign key (FACC_ID)
references FACTURA_CONCEPTO(FACC_ID) on delete CASCADE on update CASCADE;

ALTER TABLE CLIENTES
ADD CLIE_FACC T_ID;

ALTER TABLE FACTURA_CONCEPTO
ADD FACC_VEND T_ID;
ALTER TABLE FACTURA_CONCEPTO
ADD FACC_DIAS SMALLINT;
ALTER TABLE FACTURA_CONCEPTO
ADD FACC_PREF VARCHAR(4);
ALTER TABLE FACTURA_CONCEPTO
ADD FACC_PTVT T_ID;
ALTER TABLE FACTURA_CONCEPTO
ADD FACC_OBS BLOB SUB_TYPE 1 SEGMENT SIZE 80;

/* 20081031 CARTERA Y CXPAGAR EN OTRA MONEDA CON REPORTES, CONSULTAR E IMPRESION EN MONEDA ORIGINAL O PESOS Y CONTABILIZACION EN PESOS*/
/* ELIMINE LA tabla y el procedimiento SALDO_CLIENTE */

SET TERM ^ ;

CREATE OR ALTER PROCEDURE MOVIMIENTO_CARTERA_DESDE_HASTA(
    NIT VARCHAR(20),
    DESDE DATE,
    HASTA DATE,
    EMPSUCURSAL INTEGER)
RETURNS (
    INICIAL NUMERIC(18,2),
    TIPODOC VARCHAR(8),
    IDDOC INTEGER,
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    CONCEPTO VARCHAR(60),
    DEBITO NUMERIC(18,2),
    CREDITO NUMERIC(18,2),
    SALDO NUMERIC(18,2),
    NOMBRE VARCHAR(60),
    RTFTE NUMERIC(18,2),
    RTIVA NUMERIC(18,2),
    RTICA NUMERIC(18,2),
    SUCURSAL VARCHAR(10),
    RECPROV_ID INTEGER,
    RECIPROV CHAR(1))
AS
declare variable DB CHAR(1);
declare variable AB CHAR(1);
declare variable RETES CHAR(2);
declare variable tipo integer;
BEGIN
  /* Ubique el NIT */
  select terc_nom from terceros where terc_nit = :NIT INTO :NOMBRE;
  DESDE = DESDE - 1;
  INICIAL = 0;
  FOR SELECT MVCL_TIPOREF, MVCL_IDREF FROM MOVIMIENTO_CLIENTES
    WHERE TERC_NIT = :NIT AND MVCL_FECHA <= :DESDE AND MVCL_ABONO = 'N' AND ((:empsucursal = 0) or (SUCU_ID = :empsucursal))
    INTO :TIPODOC, :IDDOC
    DO
    BEGIN
    EXECUTE PROCEDURE saldo_doc_cartera(TIPODOC, IDDOC, DESDE) returning_values (SALDO);
    if (SALDO <> 0) then
        INICIAL = INICIAL + SALDO;
    END
  DESDE = DESDE + 1;
  SALDO = INICIAL;
  EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'DESCONTAR RETENCIONES POR CAUSACION') returning_values(:RETES);
  FOR select tido_nomcorto, MVCL_TIPOREF, mvcl_idref, mvcl_prefref, mvcl_numref, mvcl_fecha, mvcl_conc, mvcl_monto, mvcl_debito, mvcl_rtefte, mvcl_rteiva, mvcl_rteica, mvcl_abono, mvcl_sucursal
    from movimiento_clientes m, tipo_documento t
    where m.mvcl_tiporef = t.tido_cod and terc_nit = :NIT and mvcl_fecha >= :DESDE and mvcl_fecha <= :HASTA and mvcl_tiporef <> 45 AND ((SUCU_ID = :EMPSUCURSAL) or (:EMPSUCURSAL = 0))
    order by mvcl_fecha, mvcl_tiporef
    into :TIPODOC,:tipo,  :IDDOC, :PREFIJO, :NUMERO, :FECHA, :CONCEPTO, :DEBITO, :DB, :RTFTE, :RTIVA, :RTICA, :AB, :SUCURSAL
    DO
    BEGIN
    if (DB = 'N') then
        BEGIN
        if (AB = 'S') then
            if (RETES = 'SI') then
                CREDITO = DEBITO;
            ELSE
                CREDITO = DEBITO + RTFTE + RTIVA + RTICA;
        ELSE
            if (RETES = 'SI') then
                CREDITO = DEBITO - RTFTE - RTIVA - RTICA;
            ELSE
                CREDITO = DEBITO;
        DEBITO = 0;
        END
    ELSE
        BEGIN
        if (RETES = 'SI') then
            DEBITO = DEBITO - RTFTE - RTIVA - RTICA;
        CREDITO = 0;
        END
    SALDO = SALDO + DEBITO - CREDITO;
    /* IDENTIFICAR SI EL DOCUMENTO TIENE RECIBO PROVISIONAL*/
    recprov_id = 0;
    SELECT max(RCPR_ID) FROM recibo_provisional_detalle WHERE RPDE_IDDOC = :iddoc  AND RPDE_TIPODOC = :TIPO and RPDE_ANULADO = 'N' INTO :recprov_id;
    if /*(recprov_id = 0) or */(recprov_id is null) then
      BEGIN
       reciprov = 'N';
      end
    ELSE
      begin
       reciprov = 'S';
      END
    SUSPEND;
    END
END
^

SET TERM ; ^

DROP PROCEDURE CHEQUEO_SALDOS_CARTERA;
DROP TRIGGER MOVIMIENTO_CLIENTES_AI;

SET TERM ^ ;

CREATE OR ALTER TRIGGER MOVIMIENTO_CLIENTES_AU FOR MOVIMIENTO_CLIENTES
ACTIVE AFTER UPDATE POSITION 0
AS
declare variable existe char(1);
BEGIN
/* SI QUEDO EN CEROS EL MONTO Y LAS RETES, ELIMINE EL REGISTRO */
if ((NEW.mvcl_monto = 0) AND (NEW.mvcl_rtefte = 0) AND (NEW.mvcl_rteica = 0) AND (NEW.mvcl_rteiva = 0)) then
    IF (NEW.mvcl_tiporef <> 43) then
        DELETE FROM movimiento_clientes WHERE MVCL_ID = NEW.mvcl_id;
    ELSE
        BEGIN
        SELECT APCL_ANULADO FROM aplicacion_cliente WHERE APCL_ID = NEW.mvcl_idref INTO :EXISTE;
        if (EXISTE = 'S') then
            DELETE FROM movimiento_clientes WHERE MVCL_ID = NEW.mvcl_id;
        END
END
^

SET TERM ; ^

DROP PROCEDURE SALDO_CLIENTE;
DROP TRIGGER MOVIMIENTO_CLIENTES_AD;
DROP TRIGGER SALDOS_CLIENTES_AU;
DROP TRIGGER TI_SALDOS_CLIENTES;
DROP TABLE SALDOS_CLIENTES;

/* ELIMINE LA TABLA DE SALDOS_PROVEEDOR */
SET TERM ^ ;

CREATE OR ALTER PROCEDURE SALDO_PROVEEDOR(
    NIT VARCHAR(20),
    FECHA DATE)
RETURNS (
    SALDO NUMERIC(18,2))
AS
DECLARE VARIABLE sal numeric(18,2);
declare variable TIPODOC INTEGER;
declare variable IDDOC INTEGER;
BEGIN
fecha = fecha - 1;
saldo = 0;
FOR SELECT MVPR_TIPOREF, MVPR_IDREF FROM movimiento_proveedor
    WHERE TERC_NIT = :NIT AND MVPR_FECHA <= :FECHA AND MVPR_ABONO = 'N'
    INTO :TIPODOC, :IDDOC
    DO
    BEGIN
    EXECUTE PROCEDURE saldo_doc_cxpagar(TIPODOC, IDDOC, FECHA) returning_values (SAL);
    if (SAL <> 0) then
        SALDO = SALDO + SAL;
    END
SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE CHEQUEO_SALDOS_CXPAGAR(
    PROVINI VARCHAR(20),
    PROVFIN VARCHAR(20))
AS
declare variable existe char(1);
declare variable NIT VARCHAR(20);
declare variable FECHA DATE;
declare variable MONTO NUMERIC(18, 2);
declare variable DB CHAR(2);
declare variable AB CHAR(2);
declare variable RTFTE NUMERIC(18, 2);
declare variable RTIVA NUMERIC(18, 2);
declare variable RTICA NUMERIC(18, 2);
declare variable NETO NUMERIC(18, 2);
declare variable SALDO NUMERIC(18, 2);
declare variable desc_rtes char(2);
BEGIN /*$$IBE$$ 
DELETE FROM ANTICIPOS_PROVEEDOR WHERE EGRE_ID = 0;
DELETE FROM SALDOS_PROVEEDOR WHERE TERC_NIT >= :PROVINI AND TERC_NIT <= :PROVFIN;
 $$IBE$$*/ /* Verifique si hay que descontar retenciones */ /*$$IBE$$ 
EXECUTE PROCEDURE LEE_CONFIGURACION('CXPAGAR', 'SALDOS', 'DESCONTAR RETENCIONES POR CAUSACION') returning_values (DESC_RTES);
FOR SELECT TERC_NIT, MVPR_FECHA, MVPR_MONTO, MVPR_DEBITO, MVPR_ABONO, MVPR_RTFTE, MVPR_RTIVA, MVPR_RTICA 
    FROM MOVIMIENTO_PROVEEDOR where MVPR_TIPOREF <> 55 AND TERC_NIT >= :PROVINI AND TERC_NIT <= :PROVFIN
    ORDER BY TERC_NIT, MVPR_FECHA
    INTO :NIT, :FECHA, :MONTO, :DB, :AB, :RTFTE, :RTIVA, :RTICA
DO
    BEGIN
    NETO = MONTO;
    if ((DESC_RTES = 'SI') AND (AB <> 'S')) then
        NETO = MONTO - RTFTE - RTIVA - RTICA;
    if ((DESC_RTES = 'NO') AND (AB = 'S')) then
        NETO = MONTO + RTFTE + RTIVA + RTICA;
    if (NETO <> 0) then
      BEGIN
      EXISTE = 'N';
      select 'S' FROM saldos_proveedor WHERE TERC_NIT = :NIT AND SAPR_FECHA = :FECHA INTO :EXISTE;
      if (EXISTE = 'S') then
        BEGIN
         $$IBE$$*/ /* ACTUALICE LOS DEBITOS/CREDITOS */ /*$$IBE$$ 
        if (DB = 'S') then
            UPDATE SALDOS_PROVEEDOR
                SET SAPR_DEBITOS = SAPR_DEBITOS + :NETO
                WHERE TERC_NIT = :NIT AND SAPR_FECHA = :FECHA;
            ELSE
                UPDATE SALDOS_PROVEEDOR
                SET SAPR_CREDITOS = SAPR_CREDITOS + :NETO
                WHERE TERC_NIT = :NIT AND SAPR_FECHA = :FECHA;
        END
      ELSE
        BEGIN
         $$IBE$$*/ /* INSERTE UN NUEVO REGISTRO */ /*$$IBE$$ 
        EXECUTE PROCEDURE SALDO_PROVEEDOR (NIT, FECHA) returning_values (SALDO);
        if (DB = 'S') then
            INSERT INTO SALDOS_PROVEEDOR (TERC_NIT, SAPR_FECHA, SAPR_DEBITOS, SAPR_CREDITOS, SAPR_SALDO)
                VALUES(:NIT, :FECHA, :NETO, 0, :SALDO);
        else
            INSERT INTO saldos_proveedor (TERC_NIT, SAPR_FECHA, SAPR_DEBITOS, SAPR_CREDITOS, SAPR_SALDO)
                VALUES(:NIT, :FECHA, 0, :NETO, :SALDO);
        END
      END
    END
 $$IBE$$*/ EXIT;
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE CONCILIA_CXPAGAR(
    FECINI DATE,
    FECFIN DATE,
    CTACART VARCHAR(20),
    SUBEMPRESA INTEGER,
    ANTERIOR CHAR(1))
RETURNS (
    NIT VARCHAR(20),
    NOMBRE VARCHAR(60),
    INICIAL NUMERIC(18,2),
    INICIALC NUMERIC(18,2),
    DEBITOS NUMERIC(18,2),
    DEBITOSC NUMERIC(18,2),
    CREDITOS NUMERIC(18,2),
    CREDITOSC NUMERIC(18,2),
    SALDO NUMERIC(18,2),
    SALDOC NUMERIC(18,2),
    DIFERENCIA NUMERIC(18,2))
AS
declare variable ANO CHAR(4);
declare variable MES INTEGER;
declare variable ABONOS NUMERIC(18,2);
declare variable RETES CHAR(2);
begin /*$$IBE$$ 
ano = EXTRACT(YEAR FROM FECFIN);
mes = EXTRACT(MONTH FROM FECFIN);

for select TERC_NIT, TERC_NOM from TERCEROS WHERE TERC_PROV = 'S' into :NIT, :NOMBRE
    DO
    BEGIN
    EXECUTE PROCEDURE saldo_proveedor (NIT, FECINI) returning_values (INICIAL);
    EXECUTE PROCEDURE LEE_CONFIGURACION('CXPAGAR', 'SALDOS', 'DESCONTAR RETENCIONES POR CAUSACION') returning_values(:RETES);
    if (RETES = 'SI') then
        BEGIN
        SELECT SUM(MVPR_MONTO-MVPR_RTFTE-MVPR_RTIVA-MVPR_RTICA)
            FROM movimiento_proveedor
            WHERE TERC_NIT = :NIT AND MVPR_FECHA >= :FECINI AND MVPR_FECHA < :FECFIN AND MVPR_DEBITO = 'S'
            INTO :DEBITOS;
        SELECT SUM(MVPR_MONTO-MVPR_RTFTE-MVPR_RTIVA-MVPR_RTICA)
            FROM movimiento_proveedor
            WHERE TERC_NIT = :NIT AND MVPR_FECHA >= :FECINI AND MVPR_FECHA < :FECFIN AND MVPR_DEBITO = 'N' AND MVPR_ABONO = 'N' and MVPR_TIPOREF <> 55
            INTO :CREDITOS;
        SELECT SUM(MVPR_MONTO) FROM movimiento_proveedor
            WHERE TERC_NIT = :NIT AND MVPR_FECHA >= :FECINI AND MVPR_FECHA < :FECFIN AND MVPR_ABONO = 'S'
            INTO :ABONOS;
        END
    ELSE
        BEGIN
        SELECT SUM(MVPR_MONTO)
            FROM movimiento_proveedor
            WHERE TERC_NIT = :NIT AND MVPR_FECHA >= :FECINI AND MVPR_FECHA < :FECFIN AND MVPR_DEBITO = 'S'
            INTO :DEBITOS;
        SELECT SUM(MVPR_MONTO)
            FROM movimiento_proveedor
            WHERE TERC_NIT = :NIT AND MVPR_FECHA >= :FECINI AND MVPR_FECHA < :FECFIN AND MVPR_DEBITO = 'N' AND MVPR_ABONO = 'N' AND MVPR_TIPOREF <> 55
            INTO :CREDITOS;
        SELECT SUM(MVPR_MONTO+MVPR_RTFTE+MVPR_RTIVA+MVPR_RTICA)
            FROM movimiento_proveedor
            WHERE TERC_NIT = :NIT AND MVPR_FECHA >= :FECINI AND MVPR_FECHA < :FECFIN AND MVPR_ABONO = 'S'
            INTO :ABONOS;
        END
    if (DEBITOS IS NULL) then
        DEBITOS = 0;
    if (CREDITOS IS NULL) then
        CREDITOS = 0;
    if (ABONOS IS NULL) then
        ABONOS = 0;
    CREDITOS = CREDITOS + ABONOS;
    SALDO = INICIAL + DEBITOS - CREDITOS;

     $$IBE$$*/ /* LO CONTABLE */ /*$$IBE$$ 
    EXECUTE PROCEDURE SALDO_TERCERO_MES(ctacart, NIT, ANO, MES, 'S') RETURNING_VALUES (INICIALC);
    EXECUTE PROCEDURE MOVIMIENTO_TERCERO_MES(ctacart, NIT, ANO, MES, 'S') RETURNING_VALUES(DEBITOSC);
    EXECUTE PROCEDURE MOVIMIENTO_TERCERO_MES(ctacart, NIT, ANO, MES, 'N') RETURNING_VALUES(CREDITOSC);
    SALDOC = INICIALC + DEBITOSC - CREDITOSC;
    diferencia = SALDO + SALDOC;
    if (DIFERENCIA <> 0) then
        BEGIN
        if (ANTERIOR <> 'S') then
            SUSPEND;
        ELSE
            BEGIN
            if (DIFERENCIA <> (INICIAL + INICIALC)) then
                SUSPEND;
            END
        END
    END
 $$IBE$$*/ SUSPEND;
end
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE IMPR_EGRESO(
    ID INTEGER)
RETURNS (
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    NIT VARCHAR(20),
    NOMBRE VARCHAR(60),
    DIR VARCHAR(60),
    CIU VARCHAR(40),
    TEL VARCHAR(40),
    CONCEPTO VARCHAR(60),
    MONTO NUMERIC(18,2),
    RTFTE NUMERIC(18,2),
    RTIVA NUMERIC(18,2),
    RTICA NUMERIC(18,2),
    DSCTO NUMERIC(18,2),
    OBS BLOB SUB_TYPE 1 SEGMENT SIZE 80,
    ITEMDOC INTEGER,
    TIPODOC VARCHAR(8),
    PREFDOC VARCHAR(4),
    NUMDOC VARCHAR(6),
    NUMPRV VARCHAR(10),
    ABONODOC NUMERIC(18,2),
    RTFTEDOC NUMERIC(18,2),
    RTIVADOC NUMERIC(18,2),
    RTICADOC NUMERIC(18,2),
    DSCTODOC NUMERIC(18,2),
    SALDODOC NUMERIC(18,2),
    SALDOPROV NUMERIC(18,2),
    ANTERDOC NUMERIC(18,2))
AS
declare variable NUMROWS INTEGER;
declare variable TIPO integer;
declare variable IDDOC INTEGER;
BEGIN /*$$IBE$$ 
  SELECT PREF_PRE, EGRE_NUMERO, EGRE_FECHA, EGRE_CONC,
        E.TERC_NIT, EGRE_NOMTERC, TERC_DIR, TERC_CIU, TERC_TEL,
        EGRE_MONTO, EGRE_RTFTEMONTO, EGRE_RTIVAMONTO, EGRE_RTICAMONTO, EGRE_DTOF,
        EGRE_OBS
    FROM EGRESOS E, TERCEROS T
    WHERE E.TERC_NIT = T.TERC_NIT AND E.EGRE_ID = :ID
    INTO :PREFIJO, :NUMERO, :FECHA, :CONCEPTO, 
        :NIT, :NOMBRE, :DIR, :CIU, :TEL,
        :MONTO, :RTFTE, :RTIVA, :RTICA, :DSCTO,
        :OBS;
  select SALDO from saldo_proveedor(:NIT, :FECHA+1) into :SALDOPROV;
   $$IBE$$*/ /*EXECUTE PROCEDURE saldo_proveedor(:NIT, (CAST('FECHA'+1 AS DATE))) returning_values (:SALDOPROV);*/ /*$$IBE$$ 
  SELECT COUNT(EGDE_ITEM) FROM EGRESOS_DETALLE
    WHERE EGRE_ID = :ID INTO :NUMROWS;
  if (NUMROWS > 0) then
    FOR SELECT EGDE_ITEM, EGDE_TIPODOC, TIDO_NOMCORTO, EGDE_IDDOC, EGDE_PREFIJO, EGDE_NUMERO, EGDE_ABONO, EGDE_RTFTE, EGDE_RTIVA, EGDE_RTICA, EGDE_DTOF
        FROM EGRESOS_DETALLE ED, TIPO_DOCUMENTO TD
        WHERE TD.TIDO_COD = ED.EGDE_TIPODOC AND ED.EGRE_ID = :ID
        order by egde_item
        INTO :ITEMDOC, :TIPO, :TIPODOC, :IDDOC, :PREFDOC, :NUMDOC, :ABONODOC, :RTFTEDOC, :RTIVADOC, :RTICADOC, :DSCTODOC
        DO
            BEGIN
            if (TIPO = 21) then
                SELECT FACO_NUMPROV FROM FACTURAS_COMPRA WHERE FACO_ID = :iddoc INTO :numprv;
            ELSE
                if (TIPO = 51) then
                    SELECT NDPR_NUMPROV FROM NOTAS_DEBITO_PROVEEDOR WHERE NDPR_ID = :iddoc INTO :numprv;
                ELSE
                    numprv = numdoc;
            EXECUTE PROCEDURE saldo_doc_cxpagar(:TIPO, :IDDOC, :FECHA) returning_values (:SALDODOC);
            ANTERDOC = SALDODOC + RTFTEDOC + RTIVADOC + RTICADOC + ABONODOC + DSCTODOC;
            SUSPEND;
            END
  else
    BEGIN
    SALDOPROV = 0;
    ANTERDOC = 0;
    SALDODOC = 0;
    RTFTEDOC = 0;
    RTIVADOC = 0;
    RTICADOC = 0;
    ABONODOC = 0;
    DSCTODOC = 0;
    numprv = '';
    SUSPEND;
    END
 $$IBE$$*/ SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE MOVIMIENTO_CXPAGAR_DESDE_HASTA(
    NIT VARCHAR(20),
    DESDE DATE,
    HASTA DATE)
RETURNS (
    INICIAL NUMERIC(18,2),
    TIPODOC VARCHAR(8),
    IDDOC INTEGER,
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    CONCEPTO VARCHAR(60),
    DEBITO NUMERIC(18,2),
    CREDITO NUMERIC(18,2),
    SALDO NUMERIC(18,2),
    NOMBRE VARCHAR(60),
    RTFTE NUMERIC(18,2),
    RTIVA NUMERIC(18,2),
    RTICA NUMERIC(18,2),
    NUMPROV VARCHAR(20))
AS
declare variable DB CHAR(1);
declare variable AB CHAR(1);
declare variable RETES CHAR(2);
BEGIN
  /* Ubique el NIT */ /*$$IBE$$ 
  select terc_nom from terceros where terc_nit = :NIT INTO :NOMBRE;
  execute procedure saldo_proveedor (NIT, DESDE) returning_values (INICIAL);
  if (INICIAL is null) then
    INICIAL = 0;
  SALDO = INICIAL;
  EXECUTE PROCEDURE LEE_CONFIGURACION('CXPAGAR', 'SALDOS', 'DESCONTAR RETENCIONES POR CAUSACION') returning_values(:RETES);
  FOR select tido_nomcorto, mvpr_idref, mvpr_prefijo, mvpr_numero, mvpr_fecha, mvpr_conc, mvpr_monto, mvpr_debito, mvpr_rtfte, mvpr_rtiva, mvpr_rtica, mvpr_abono
    from movimiento_proveedor m, tipo_documento t
    where m.mvpr_tiporef = t.tido_cod and terc_nit = :NIT and mvpr_fecha >= :DESDE and mvpr_fecha <= :HASTA AND mvpr_tiporef <> 55
    order by mvpr_fecha, mvpr_tiporef
    into :TIPODOC, :IDDOC, :PREFIJO, :NUMERO, :FECHA, :CONCEPTO, :DEBITO, :DB, :RTFTE, :RTIVA, :RTICA, :AB
    DO
    BEGIN
    if (DB = 'N') then
        BEGIN
        if (AB = 'S') then
            if (RETES = 'SI') then
                CREDITO = DEBITO;
            ELSE
                CREDITO = DEBITO + RTFTE + RTIVA + RTICA;
        ELSE
            if (RETES = 'SI') then
                CREDITO = DEBITO - RTFTE - RTIVA - RTICA;
            ELSE
                CREDITO = DEBITO;
        DEBITO = 0;
        END
    ELSE
        BEGIN
        if (RETES = 'SI') then
            DEBITO = DEBITO - RTFTE - RTIVA - RTICA;
        CREDITO = 0;
        END
    SALDO = SALDO + DEBITO - CREDITO;
    NUMPROV = '';
    if (TIPODOC = 'CARGOACR') then
        SELECT NDPR_NUMPROV FROM NOTAS_DEBITO_PROVEEDOR WHERE NDPR_ID = :IDDOC INTO :NUMPROV;
    if (TIPODOC = 'FACTCOMP') then
        SELECT FACO_NUMPROV FROM FACTURAS_COMPRA WHERE FACO_ID = :IDDOC INTO :NUMPROV;
    SUSPEND;
    END
 $$IBE$$*/ SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE MOVIMIENTO_CXPAGAR_MES(
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    NIT VARCHAR(20),
    NOMBRE VARCHAR(60),
    INICIAL NUMERIC(18,4),
    DEBITOS NUMERIC(18,4),
    CREDITOS NUMERIC(18,4),
    ABONOS NUMERIC(18,4),
    FINAL NUMERIC(18,4))
AS
declare variable RETES CHAR(2);
BEGIN /*$$IBE$$ 
  for select TERC_NIT, TERC_NOM from TERCEROS WHERE TERC_PROV = 'S' into :NIT, :NOMBRE
  DO
    BEGIN
    EXECUTE PROCEDURE saldo_proveedor (NIT, FECINI) returning_values (INICIAL);
    EXECUTE PROCEDURE LEE_CONFIGURACION('CXPAGAR', 'SALDOS', 'DESCONTAR RETENCIONES POR CAUSACION') returning_values(:RETES);
    if (RETES = 'SI') then
        BEGIN
        SELECT SUM(MVPR_MONTO-MVPR_RTFTE-MVPR_RTIVA-MVPR_RTICA)
            FROM movimiento_proveedor
            WHERE TERC_NIT = :NIT AND MVPR_FECHA >= :FECINI AND MVPR_FECHA < :FECFIN AND MVPR_DEBITO = 'S'
            INTO :DEBITOS;
        SELECT SUM(MVPR_MONTO-MVPR_RTFTE-MVPR_RTIVA-MVPR_RTICA)
            FROM movimiento_proveedor
            WHERE TERC_NIT = :NIT AND MVPR_FECHA >= :FECINI AND MVPR_FECHA < :FECFIN AND MVPR_DEBITO = 'N' AND MVPR_ABONO = 'N' and MVPR_TIPOREF <> 55
            INTO :CREDITOS;
        SELECT SUM(MVPR_MONTO) FROM movimiento_proveedor
            WHERE TERC_NIT = :NIT AND MVPR_FECHA >= :FECINI AND MVPR_FECHA < :FECFIN AND MVPR_ABONO = 'S'
            INTO :ABONOS;
        END
    ELSE
        BEGIN
        SELECT SUM(MVPR_MONTO)
            FROM movimiento_proveedor
            WHERE TERC_NIT = :NIT AND MVPR_FECHA >= :FECINI AND MVPR_FECHA < :FECFIN AND MVPR_DEBITO = 'S'
            INTO :DEBITOS;
        SELECT SUM(MVPR_MONTO)
            FROM movimiento_proveedor
            WHERE TERC_NIT = :NIT AND MVPR_FECHA >= :FECINI AND MVPR_FECHA < :FECFIN AND MVPR_DEBITO = 'N' AND MVPR_ABONO = 'N' AND MVPR_TIPOREF <> 55
            INTO :CREDITOS;
        SELECT SUM(MVPR_MONTO+MVPR_RTFTE+MVPR_RTIVA+MVPR_RTICA)
            FROM movimiento_proveedor
            WHERE TERC_NIT = :NIT AND MVPR_FECHA >= :FECINI AND MVPR_FECHA < :FECFIN AND MVPR_ABONO = 'S'
            INTO :ABONOS;
        END
    if (DEBITOS IS NULL) then
        DEBITOS = 0;
    if (CREDITOS IS NULL) then
        CREDITOS = 0;
    if (ABONOS IS NULL) then
        ABONOS = 0;
    FINAL = INICIAL + DEBITOS - CREDITOS - ABONOS;
    SUSPEND;
    END
 $$IBE$$*/ SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE REP_MOVIMIENTO_PROVEEDOR(
    DESDE VARCHAR(20),
    HASTA VARCHAR(20),
    GRPINI VARCHAR(5),
    GRPFIN VARCHAR(5),
    FECINI DATE,
    FECFIN DATE,
    DETALLE CHAR(1),
    ORDEN CHAR(1),
    AGRUPA CHAR(1))
RETURNS (
    NIT VARCHAR(20),
    NOMBRE VARCHAR(60),
    TELEFONO VARCHAR(40),
    CIUDAD VARCHAR(40),
    CODZONA VARCHAR(2),
    NOMZONA VARCHAR(60),
    DV CHAR(1),
    CODCIUD CHAR(5),
    NOMCIUD VARCHAR(60),
    INICIAL NUMERIC(18,2),
    TIPODOC VARCHAR(8),
    IDDOC INTEGER,
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    CONCEPTO VARCHAR(60),
    DEBITO NUMERIC(18,2),
    CREDITO NUMERIC(18,2),
    ABONO NUMERIC(18,2),
    SALDO NUMERIC(18,2),
    RTFTE NUMERIC(18,2),
    RTIVA NUMERIC(18,2),
    RTICA NUMERIC(18,2),
    ARTFTE NUMERIC(18,2),
    ARTIVA NUMERIC(18,2),
    ARTICA NUMERIC(18,2))
AS
declare variable NITINI VARCHAR(20);
declare variable NITFIN VARCHAR(20);
declare variable NOMINI VARCHAR(20);
declare variable NOMFIN VARCHAR(20);
declare variable OK CHAR(1);
declare variable DB CHAR(1);
declare variable AB CHAR(1);
declare variable DESCRETE CHAR(2);
BEGIN /*$$IBE$$ 
if (ORDEN = 'C') then
    BEGIN
    NITINI = DESDE;
    NITFIN = HASTA;
    NOMINI = '';
    NOMFIN = 'zz';
    END
ELSE
    BEGIN
    NOMINI = DESDE;
    NOMFIN = HASTA;
    NITINI = '';
    NITFIN = 'zz';
    END
EXECUTE PROCEDURE LEE_CONFIGURACION('CXPAGAR', 'SALDOS', 'DESCONTAR RETENCIONES POR CAUSACION') returning_values (DESCRETE);
 $$IBE$$*/ /* Ubique el NIT */ /*$$IBE$$ 
FOR select T.TERC_NIT, TERC_NOM, TERC_DV, TERC_TEL, TERC_CIU, P.GRPR_COD, T.CIUD_COD
    from terceros T, PROVEEDORES P
    where P.TERC_NIT = T.TERC_NIT AND TERC_PROV = 'S' AND T.TERC_NIT >= :NITINI AND T.TERC_NIT <= :NITFIN AND
        TERC_NOM >= :NOMINI AND TERC_NOM <= :NOMFIN
    INTO :NIT, :NOMBRE, :DV, :TELEFONO, :CIUDAD, :CODZONA, :CODCIUD
    DO  
    BEGIN

    SELECT GRPR_NOM FROM GRUPOS_PROVEEDORES WHERE GRPR_COD = :CODZONA INTO :NOMZONA;
    SELECT CIUD_NOM FROM CIUDADES WHERE CIUD_COD = :CODCIUD INTO :NOMCIUD;
    OK = 'N';
    if (AGRUPA = 'Z') then
        BEGIN
        if (GRPINI = '') then
            BEGIN
            if ((CODZONA IS NULL) or (CODZONA >= :GRPINI AND CODZONA <= :GRPFIN)) then
                OK = 'S';
            END
        ELSE
            if (CODZONA >= :GRPINI AND CODZONA <= :GRPFIN) then
                OK = 'S';
        END
    if (AGRUPA = 'C') then
        BEGIN
        if (GRPINI = '') then
            BEGIN
            if ((CODCIUD IS NULL) or (CODCIUD >= :GRPINI AND CODCIUD <= :GRPFIN)) then
                OK = 'S';
            END
        ELSE
            if (CODCIUD >= :GRPINI AND CODCIUD <= :GRPFIN) then
                OK = 'S';
        END
    if (AGRUPA = 'N') then
        OK = 'S';
        
    if (OK = 'S') then
        BEGIN
        execute procedure saldo_proveedor (NIT, FECINI) returning_values (INICIAL);
        if (INICIAL is null) then
            INICIAL = 0;
        SALDO = INICIAL;
        if (DETALLE = 'S') then
          BEGIN
          FOR select tido_nomcorto, mvpr_idref, mvpr_prefijo, mvpr_numero, mvpr_fecha, mvpr_conc, mvpr_monto, mvpr_debito, mvpr_rtfte, mvpr_rtiva, mvpr_rtica, mvpr_abono
            from movimiento_proveedor m, tipo_documento t
            where m.mvpr_tiporef = t.tido_cod and terc_nit = :NIT and mvpr_fecha >= :FECINI and mvpr_fecha <= :FECFIN AND MVPR_TIPOREF <> 55
            order by mvpr_fecha, mvpr_tiporef
            into :TIPODOC, :IDDOC, :PREFIJO, :NUMERO, :FECHA, :CONCEPTO, :DEBITO, :DB, :RTFTE, :RTIVA, :RTICA, :AB
            DO
            BEGIN
            if (RTFTE IS NULL) then
                RTFTE = 0;
            if (RTIVA IS NULL) then
                RTIVA = 0;
            if (RTICA IS NULL) then
                RTICA = 0;
            if (DB = 'N') then
                BEGIN
                CREDITO = DEBITO;
                DEBITO = 0;
                RTFTE = RTFTE * -1;
                RTIVA = RTIVA * -1;
                RTICA = RTICA * -1;
                END
            ELSE
                CREDITO = 0;
            SALDO = SALDO + DEBITO - CREDITO;
            if (AB = 'N') then
                BEGIN
                if (DESCRETE = 'SI') then
                    SALDO = SALDO - RTFTE - RTIVA - RTICA;
                ABONO = 0;
                END
            ELSE
                BEGIN
                ABONO = CREDITO;
                CREDITO = 0;
                if (DESCRETE <> 'SI') then
                    SALDO = SALDO + RTFTE + RTIVA + RTICA;
                END
            SUSPEND;
            END
          END
        ELSE
            BEGIN
            SELECT SUM(MVPR_MONTO), sum(mvpr_rtfte), sum(mvpr_rtiva), sum(mvpr_rtica) FROM movimiento_proveedor WHERE TERC_NIT = :NIT AND MVPR_FECHA >= :FECINI AND MVPR_FECHA <= :FECFIN AND MVPR_DEBITO = 'S' and MVPR_ABONO = 'N' INTO :DEBITO, :RTFTE, :RTIVA, :RTICA;
            if (DEBITO IS NULL) then
                DEBITO = 0;
            if (RTFTE IS NULL) then
                RTFTE = 0;
            if (RTIVA IS NULL) then
                RTIVA = 0;
            if (RTICA IS NULL) then
                RTICA = 0;
            if (DESCRETE = 'SI') then
                DEBITO = DEBITO - RTFTE - RTIVA - RTICA;
            SELECT SUM(MVPR_MONTO), sum(mvpr_rtfte), sum(mvpr_rtiva), sum(mvpr_rtica) FROM movimiento_proveedor WHERE TERC_NIT = :NIT AND MVPR_FECHA >= :FECINI AND MVPR_FECHA <= :FECFIN AND MVPR_DEBITO = 'N' AND MVPR_TIPOREF <> 55 AND MVPR_ABONO = 'N' INTO :CREDITO, :ARTFTE, :ARTIVA, :ARTICA;
            if (CREDITO IS NULL) then
                CREDITO = 0;
            if (ARTFTE IS NULL) then
                ARTFTE = 0;
            if (ARTIVA IS NULL) then
                ARTIVA = 0;
            if (ARTICA IS NULL) then
                ARTICA = 0;
            if (DESCRETE = 'SI') then
                CREDITO = CREDITO - ARTFTE - ARTIVA - ARTICA;
            RTFTE = RTFTE - ARTFTE;
            RTIVA = RTIVA - ARTIVA;
            RTICA = RTICA - ARTICA;
            SELECT SUM(MVPR_MONTO), sum(mvpr_rtfte), sum(mvpr_rtiva), sum(mvpr_rtica) FROM movimiento_proveedor WHERE TERC_NIT = :NIT AND MVPR_FECHA >= :FECINI AND MVPR_FECHA <= :FECFIN AND MVPR_ABONO = 'S' INTO :ABONO, :ARTFTE, :ARTIVA, :ARTICA;
            if (ABONO IS NULL) then
                ABONO = 0;
            if (ARTFTE IS NULL) then
                ARTFTE = 0;
            if (ARTIVA IS NULL) then
                ARTIVA = 0;
            if (ARTICA IS NULL) then
                ARTICA = 0;
            if (DESCRETE <> 'SI') then
                ABONO = ABONO + ARTFTE + ARTIVA + ARTICA;
            SALDO = INICIAL + DEBITO - CREDITO - ABONO;
            SUSPEND;
            END
        END
    END
 $$IBE$$*/ SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE CHEQUEO_SALDOS_CXPAGAR(
    PROVINI VARCHAR(20),
    PROVFIN VARCHAR(20))
AS
declare variable existe char(1);
declare variable NIT VARCHAR(20);
declare variable FECHA DATE;
declare variable MONTO NUMERIC(18, 2);
declare variable DB CHAR(2);
declare variable AB CHAR(2);
declare variable RTFTE NUMERIC(18, 2);
declare variable RTIVA NUMERIC(18, 2);
declare variable RTICA NUMERIC(18, 2);
declare variable NETO NUMERIC(18, 2);
declare variable SALDO NUMERIC(18, 2);
declare variable desc_rtes char(2);
BEGIN
DELETE FROM ANTICIPOS_PROVEEDOR WHERE EGRE_ID = 0;
DELETE FROM SALDOS_PROVEEDOR WHERE TERC_NIT >= :PROVINI AND TERC_NIT <= :PROVFIN;
/* Verifique si hay que descontar retenciones */
EXECUTE PROCEDURE LEE_CONFIGURACION('CXPAGAR', 'SALDOS', 'DESCONTAR RETENCIONES POR CAUSACION') returning_values (DESC_RTES);
FOR SELECT TERC_NIT, MVPR_FECHA, MVPR_MONTO, MVPR_DEBITO, MVPR_ABONO, MVPR_RTFTE, MVPR_RTIVA, MVPR_RTICA 
    FROM MOVIMIENTO_PROVEEDOR where MVPR_TIPOREF <> 55 AND TERC_NIT >= :PROVINI AND TERC_NIT <= :PROVFIN
    ORDER BY TERC_NIT, MVPR_FECHA
    INTO :NIT, :FECHA, :MONTO, :DB, :AB, :RTFTE, :RTIVA, :RTICA
DO
    BEGIN
    NETO = MONTO;
    if ((DESC_RTES = 'SI') AND (AB <> 'S')) then
        NETO = MONTO - RTFTE - RTIVA - RTICA;
    if ((DESC_RTES = 'NO') AND (AB = 'S')) then
        NETO = MONTO + RTFTE + RTIVA + RTICA;
    if (NETO <> 0) then
      BEGIN
      EXISTE = 'N';
      select 'S' FROM saldos_proveedor WHERE TERC_NIT = :NIT AND SAPR_FECHA = :FECHA INTO :EXISTE;
      if (EXISTE = 'S') then
        BEGIN
        /* ACTUALICE LOS DEBITOS/CREDITOS */
        if (DB = 'S') then
            UPDATE SALDOS_PROVEEDOR
                SET SAPR_DEBITOS = SAPR_DEBITOS + :NETO
                WHERE TERC_NIT = :NIT AND SAPR_FECHA = :FECHA;
            ELSE
                UPDATE SALDOS_PROVEEDOR
                SET SAPR_CREDITOS = SAPR_CREDITOS + :NETO
                WHERE TERC_NIT = :NIT AND SAPR_FECHA = :FECHA;
        END
      ELSE
        BEGIN
        /* INSERTE UN NUEVO REGISTRO */
        EXECUTE PROCEDURE SALDO_PROVEEDOR (NIT, FECHA) returning_values (SALDO);
        if (DB = 'S') then
            INSERT INTO SALDOS_PROVEEDOR (TERC_NIT, SAPR_FECHA, SAPR_DEBITOS, SAPR_CREDITOS, SAPR_SALDO)
                VALUES(:NIT, :FECHA, :NETO, 0, :SALDO);
        else
            INSERT INTO saldos_proveedor (TERC_NIT, SAPR_FECHA, SAPR_DEBITOS, SAPR_CREDITOS, SAPR_SALDO)
                VALUES(:NIT, :FECHA, 0, :NETO, :SALDO);
        END
      END
    END
END

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE CONCILIA_CXPAGAR(
    FECINI DATE,
    FECFIN DATE,
    CTACART VARCHAR(20),
    SUBEMPRESA INTEGER,
    ANTERIOR CHAR(1))
RETURNS (
    NIT VARCHAR(20),
    NOMBRE VARCHAR(60),
    INICIAL NUMERIC(18,2),
    INICIALC NUMERIC(18,2),
    DEBITOS NUMERIC(18,2),
    DEBITOSC NUMERIC(18,2),
    CREDITOS NUMERIC(18,2),
    CREDITOSC NUMERIC(18,2),
    SALDO NUMERIC(18,2),
    SALDOC NUMERIC(18,2),
    DIFERENCIA NUMERIC(18,2))
AS
declare variable ANO CHAR(4);
declare variable MES INTEGER;
declare variable ABONOS NUMERIC(18,2);
declare variable RETES CHAR(2);
begin
ano = EXTRACT(YEAR FROM FECFIN);
mes = EXTRACT(MONTH FROM FECFIN);

for select TERC_NIT, TERC_NOM from TERCEROS WHERE TERC_PROV = 'S' into :NIT, :NOMBRE
    DO
    BEGIN
    EXECUTE PROCEDURE saldo_proveedor (NIT, FECINI) returning_values (INICIAL);
    EXECUTE PROCEDURE LEE_CONFIGURACION('CXPAGAR', 'SALDOS', 'DESCONTAR RETENCIONES POR CAUSACION') returning_values(:RETES);
    if (RETES = 'SI') then
        BEGIN
        SELECT SUM(MVPR_MONTO-MVPR_RTFTE-MVPR_RTIVA-MVPR_RTICA)
            FROM movimiento_proveedor
            WHERE TERC_NIT = :NIT AND MVPR_FECHA >= :FECINI AND MVPR_FECHA < :FECFIN AND MVPR_DEBITO = 'S'
            INTO :DEBITOS;
        SELECT SUM(MVPR_MONTO-MVPR_RTFTE-MVPR_RTIVA-MVPR_RTICA)
            FROM movimiento_proveedor
            WHERE TERC_NIT = :NIT AND MVPR_FECHA >= :FECINI AND MVPR_FECHA < :FECFIN AND MVPR_DEBITO = 'N' AND MVPR_ABONO = 'N' and MVPR_TIPOREF <> 55
            INTO :CREDITOS;
        SELECT SUM(MVPR_MONTO) FROM movimiento_proveedor
            WHERE TERC_NIT = :NIT AND MVPR_FECHA >= :FECINI AND MVPR_FECHA < :FECFIN AND MVPR_ABONO = 'S'
            INTO :ABONOS;
        END
    ELSE
        BEGIN
        SELECT SUM(MVPR_MONTO)
            FROM movimiento_proveedor
            WHERE TERC_NIT = :NIT AND MVPR_FECHA >= :FECINI AND MVPR_FECHA < :FECFIN AND MVPR_DEBITO = 'S'
            INTO :DEBITOS;
        SELECT SUM(MVPR_MONTO)
            FROM movimiento_proveedor
            WHERE TERC_NIT = :NIT AND MVPR_FECHA >= :FECINI AND MVPR_FECHA < :FECFIN AND MVPR_DEBITO = 'N' AND MVPR_ABONO = 'N' AND MVPR_TIPOREF <> 55
            INTO :CREDITOS;
        SELECT SUM(MVPR_MONTO+MVPR_RTFTE+MVPR_RTIVA+MVPR_RTICA)
            FROM movimiento_proveedor
            WHERE TERC_NIT = :NIT AND MVPR_FECHA >= :FECINI AND MVPR_FECHA < :FECFIN AND MVPR_ABONO = 'S'
            INTO :ABONOS;
        END
    if (DEBITOS IS NULL) then
        DEBITOS = 0;
    if (CREDITOS IS NULL) then
        CREDITOS = 0;
    if (ABONOS IS NULL) then
        ABONOS = 0;
    CREDITOS = CREDITOS + ABONOS;
    SALDO = INICIAL + DEBITOS - CREDITOS;

    /* LO CONTABLE */
    EXECUTE PROCEDURE SALDO_TERCERO_MES(ctacart, NIT, ANO, MES, 'S') RETURNING_VALUES (INICIALC);
    EXECUTE PROCEDURE MOVIMIENTO_TERCERO_MES(ctacart, NIT, ANO, MES, 'S') RETURNING_VALUES(DEBITOSC);
    EXECUTE PROCEDURE MOVIMIENTO_TERCERO_MES(ctacart, NIT, ANO, MES, 'N') RETURNING_VALUES(CREDITOSC);
    SALDOC = INICIALC + DEBITOSC - CREDITOSC;
    diferencia = SALDO + SALDOC;
    if (DIFERENCIA <> 0) then
        BEGIN
        if (ANTERIOR <> 'S') then
            SUSPEND;
        ELSE
            BEGIN
            if (DIFERENCIA <> (INICIAL + INICIALC)) then
                SUSPEND;
            END
        END
    END
end

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE IMPR_EGRESO(
    ID INTEGER)
RETURNS (
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    NIT VARCHAR(20),
    NOMBRE VARCHAR(60),
    DIR VARCHAR(60),
    CIU VARCHAR(40),
    TEL VARCHAR(40),
    CONCEPTO VARCHAR(60),
    MONTO NUMERIC(18,2),
    RTFTE NUMERIC(18,2),
    RTIVA NUMERIC(18,2),
    RTICA NUMERIC(18,2),
    DSCTO NUMERIC(18,2),
    OBS BLOB SUB_TYPE 1 SEGMENT SIZE 80,
    ITEMDOC INTEGER,
    TIPODOC VARCHAR(8),
    PREFDOC VARCHAR(4),
    NUMDOC VARCHAR(6),
    NUMPRV VARCHAR(10),
    ABONODOC NUMERIC(18,2),
    RTFTEDOC NUMERIC(18,2),
    RTIVADOC NUMERIC(18,2),
    RTICADOC NUMERIC(18,2),
    DSCTODOC NUMERIC(18,2),
    SALDODOC NUMERIC(18,2),
    SALDOPROV NUMERIC(18,2),
    ANTERDOC NUMERIC(18,2))
AS
declare variable NUMROWS INTEGER;
declare variable TIPO integer;
declare variable IDDOC INTEGER;
BEGIN
  SELECT PREF_PRE, EGRE_NUMERO, EGRE_FECHA, EGRE_CONC,
        E.TERC_NIT, EGRE_NOMTERC, TERC_DIR, TERC_CIU, TERC_TEL,
        EGRE_MONTO, EGRE_RTFTEMONTO, EGRE_RTIVAMONTO, EGRE_RTICAMONTO, EGRE_DTOF,
        EGRE_OBS
    FROM EGRESOS E, TERCEROS T
    WHERE E.TERC_NIT = T.TERC_NIT AND E.EGRE_ID = :ID
    INTO :PREFIJO, :NUMERO, :FECHA, :CONCEPTO, 
        :NIT, :NOMBRE, :DIR, :CIU, :TEL,
        :MONTO, :RTFTE, :RTIVA, :RTICA, :DSCTO,
        :OBS;
  select SALDO from saldo_proveedor(:NIT, :FECHA+1) into :SALDOPROV;
  /*EXECUTE PROCEDURE saldo_proveedor(:NIT, (CAST('FECHA'+1 AS DATE))) returning_values (:SALDOPROV);*/
  SELECT COUNT(EGDE_ITEM) FROM EGRESOS_DETALLE
    WHERE EGRE_ID = :ID INTO :NUMROWS;
  if (NUMROWS > 0) then
    FOR SELECT EGDE_ITEM, EGDE_TIPODOC, TIDO_NOMCORTO, EGDE_IDDOC, EGDE_PREFIJO, EGDE_NUMERO, EGDE_ABONO, EGDE_RTFTE, EGDE_RTIVA, EGDE_RTICA, EGDE_DTOF
        FROM EGRESOS_DETALLE ED, TIPO_DOCUMENTO TD
        WHERE TD.TIDO_COD = ED.EGDE_TIPODOC AND ED.EGRE_ID = :ID
        order by egde_item
        INTO :ITEMDOC, :TIPO, :TIPODOC, :IDDOC, :PREFDOC, :NUMDOC, :ABONODOC, :RTFTEDOC, :RTIVADOC, :RTICADOC, :DSCTODOC
        DO
            BEGIN
            if (TIPO = 21) then
                SELECT FACO_NUMPROV FROM FACTURAS_COMPRA WHERE FACO_ID = :iddoc INTO :numprv;
            ELSE
                if (TIPO = 51) then
                    SELECT NDPR_NUMPROV FROM NOTAS_DEBITO_PROVEEDOR WHERE NDPR_ID = :iddoc INTO :numprv;
                ELSE
                    numprv = numdoc;
            EXECUTE PROCEDURE saldo_doc_cxpagar(:TIPO, :IDDOC, :FECHA) returning_values (:SALDODOC);
            ANTERDOC = SALDODOC + RTFTEDOC + RTIVADOC + RTICADOC + ABONODOC + DSCTODOC;
            SUSPEND;
            END
  else
    BEGIN
    SALDOPROV = 0;
    ANTERDOC = 0;
    SALDODOC = 0;
    RTFTEDOC = 0;
    RTIVADOC = 0;
    RTICADOC = 0;
    ABONODOC = 0;
    DSCTODOC = 0;
    numprv = '';
    SUSPEND;
    END
END

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE MOVIMIENTO_CXPAGAR_DESDE_HASTA(
    NIT VARCHAR(20),
    DESDE DATE,
    HASTA DATE)
RETURNS (
    INICIAL NUMERIC(18,2),
    TIPODOC VARCHAR(8),
    IDDOC INTEGER,
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    CONCEPTO VARCHAR(60),
    DEBITO NUMERIC(18,2),
    CREDITO NUMERIC(18,2),
    SALDO NUMERIC(18,2),
    NOMBRE VARCHAR(60),
    RTFTE NUMERIC(18,2),
    RTIVA NUMERIC(18,2),
    RTICA NUMERIC(18,2),
    NUMPROV VARCHAR(20))
AS
declare variable DB CHAR(1);
declare variable AB CHAR(1);
declare variable RETES CHAR(2);
BEGIN
  /* Ubique el NIT */
  select terc_nom from terceros where terc_nit = :NIT INTO :NOMBRE;
  execute procedure saldo_proveedor (NIT, DESDE) returning_values (INICIAL);
  if (INICIAL is null) then
    INICIAL = 0;
  SALDO = INICIAL;
  EXECUTE PROCEDURE LEE_CONFIGURACION('CXPAGAR', 'SALDOS', 'DESCONTAR RETENCIONES POR CAUSACION') returning_values(:RETES);
  FOR select tido_nomcorto, mvpr_idref, mvpr_prefijo, mvpr_numero, mvpr_fecha, mvpr_conc, mvpr_monto, mvpr_debito, mvpr_rtfte, mvpr_rtiva, mvpr_rtica, mvpr_abono
    from movimiento_proveedor m, tipo_documento t
    where m.mvpr_tiporef = t.tido_cod and terc_nit = :NIT and mvpr_fecha >= :DESDE and mvpr_fecha <= :HASTA AND mvpr_tiporef <> 55
    order by mvpr_fecha, mvpr_tiporef
    into :TIPODOC, :IDDOC, :PREFIJO, :NUMERO, :FECHA, :CONCEPTO, :DEBITO, :DB, :RTFTE, :RTIVA, :RTICA, :AB
    DO
    BEGIN
    if (DB = 'N') then
        BEGIN
        if (AB = 'S') then
            if (RETES = 'SI') then
                CREDITO = DEBITO;
            ELSE
                CREDITO = DEBITO + RTFTE + RTIVA + RTICA;
        ELSE
            if (RETES = 'SI') then
                CREDITO = DEBITO - RTFTE - RTIVA - RTICA;
            ELSE
                CREDITO = DEBITO;
        DEBITO = 0;
        END
    ELSE
        BEGIN
        if (RETES = 'SI') then
            DEBITO = DEBITO - RTFTE - RTIVA - RTICA;
        CREDITO = 0;
        END
    SALDO = SALDO + DEBITO - CREDITO;
    NUMPROV = '';
    if (TIPODOC = 'CARGOACR') then
        SELECT NDPR_NUMPROV FROM NOTAS_DEBITO_PROVEEDOR WHERE NDPR_ID = :IDDOC INTO :NUMPROV;
    if (TIPODOC = 'FACTCOMP') then
        SELECT FACO_NUMPROV FROM FACTURAS_COMPRA WHERE FACO_ID = :IDDOC INTO :NUMPROV;
    SUSPEND;
    END
END

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE MOVIMIENTO_CXPAGAR_MES(
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    NIT VARCHAR(20),
    NOMBRE VARCHAR(60),
    INICIAL NUMERIC(18,4),
    DEBITOS NUMERIC(18,4),
    CREDITOS NUMERIC(18,4),
    ABONOS NUMERIC(18,4),
    FINAL NUMERIC(18,4))
AS
declare variable RETES CHAR(2);
BEGIN
  for select TERC_NIT, TERC_NOM from TERCEROS WHERE TERC_PROV = 'S' into :NIT, :NOMBRE
  DO
    BEGIN
    EXECUTE PROCEDURE saldo_proveedor (NIT, FECINI) returning_values (INICIAL);
    EXECUTE PROCEDURE LEE_CONFIGURACION('CXPAGAR', 'SALDOS', 'DESCONTAR RETENCIONES POR CAUSACION') returning_values(:RETES);
    if (RETES = 'SI') then
        BEGIN
        SELECT SUM(MVPR_MONTO-MVPR_RTFTE-MVPR_RTIVA-MVPR_RTICA)
            FROM movimiento_proveedor
            WHERE TERC_NIT = :NIT AND MVPR_FECHA >= :FECINI AND MVPR_FECHA < :FECFIN AND MVPR_DEBITO = 'S'
            INTO :DEBITOS;
        SELECT SUM(MVPR_MONTO-MVPR_RTFTE-MVPR_RTIVA-MVPR_RTICA)
            FROM movimiento_proveedor
            WHERE TERC_NIT = :NIT AND MVPR_FECHA >= :FECINI AND MVPR_FECHA < :FECFIN AND MVPR_DEBITO = 'N' AND MVPR_ABONO = 'N' and MVPR_TIPOREF <> 55
            INTO :CREDITOS;
        SELECT SUM(MVPR_MONTO) FROM movimiento_proveedor
            WHERE TERC_NIT = :NIT AND MVPR_FECHA >= :FECINI AND MVPR_FECHA < :FECFIN AND MVPR_ABONO = 'S'
            INTO :ABONOS;
        END
    ELSE
        BEGIN
        SELECT SUM(MVPR_MONTO)
            FROM movimiento_proveedor
            WHERE TERC_NIT = :NIT AND MVPR_FECHA >= :FECINI AND MVPR_FECHA < :FECFIN AND MVPR_DEBITO = 'S'
            INTO :DEBITOS;
        SELECT SUM(MVPR_MONTO)
            FROM movimiento_proveedor
            WHERE TERC_NIT = :NIT AND MVPR_FECHA >= :FECINI AND MVPR_FECHA < :FECFIN AND MVPR_DEBITO = 'N' AND MVPR_ABONO = 'N' AND MVPR_TIPOREF <> 55
            INTO :CREDITOS;
        SELECT SUM(MVPR_MONTO+MVPR_RTFTE+MVPR_RTIVA+MVPR_RTICA)
            FROM movimiento_proveedor
            WHERE TERC_NIT = :NIT AND MVPR_FECHA >= :FECINI AND MVPR_FECHA < :FECFIN AND MVPR_ABONO = 'S'
            INTO :ABONOS;
        END
    if (DEBITOS IS NULL) then
        DEBITOS = 0;
    if (CREDITOS IS NULL) then
        CREDITOS = 0;
    if (ABONOS IS NULL) then
        ABONOS = 0;
    FINAL = INICIAL + DEBITOS - CREDITOS - ABONOS;
    SUSPEND;
    END
END

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE REP_MOVIMIENTO_PROVEEDOR(
    DESDE VARCHAR(20),
    HASTA VARCHAR(20),
    GRPINI VARCHAR(5),
    GRPFIN VARCHAR(5),
    FECINI DATE,
    FECFIN DATE,
    DETALLE CHAR(1),
    ORDEN CHAR(1),
    AGRUPA CHAR(1))
RETURNS (
    NIT VARCHAR(20),
    NOMBRE VARCHAR(60),
    TELEFONO VARCHAR(40),
    CIUDAD VARCHAR(40),
    CODZONA VARCHAR(2),
    NOMZONA VARCHAR(60),
    DV CHAR(1),
    CODCIUD CHAR(5),
    NOMCIUD VARCHAR(60),
    INICIAL NUMERIC(18,2),
    TIPODOC VARCHAR(8),
    IDDOC INTEGER,
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    CONCEPTO VARCHAR(60),
    DEBITO NUMERIC(18,2),
    CREDITO NUMERIC(18,2),
    ABONO NUMERIC(18,2),
    SALDO NUMERIC(18,2),
    RTFTE NUMERIC(18,2),
    RTIVA NUMERIC(18,2),
    RTICA NUMERIC(18,2),
    ARTFTE NUMERIC(18,2),
    ARTIVA NUMERIC(18,2),
    ARTICA NUMERIC(18,2))
AS
declare variable NITINI VARCHAR(20);
declare variable NITFIN VARCHAR(20);
declare variable NOMINI VARCHAR(20);
declare variable NOMFIN VARCHAR(20);
declare variable OK CHAR(1);
declare variable DB CHAR(1);
declare variable AB CHAR(1);
declare variable DESCRETE CHAR(2);
BEGIN
if (ORDEN = 'C') then
    BEGIN
    NITINI = DESDE;
    NITFIN = HASTA;
    NOMINI = '';
    NOMFIN = 'zz';
    END
ELSE
    BEGIN
    NOMINI = DESDE;
    NOMFIN = HASTA;
    NITINI = '';
    NITFIN = 'zz';
    END
EXECUTE PROCEDURE LEE_CONFIGURACION('CXPAGAR', 'SALDOS', 'DESCONTAR RETENCIONES POR CAUSACION') returning_values (DESCRETE);
/* Ubique el NIT */
FOR select T.TERC_NIT, TERC_NOM, TERC_DV, TERC_TEL, TERC_CIU, P.GRPR_COD, T.CIUD_COD
    from terceros T, PROVEEDORES P
    where P.TERC_NIT = T.TERC_NIT AND TERC_PROV = 'S' AND T.TERC_NIT >= :NITINI AND T.TERC_NIT <= :NITFIN AND
        TERC_NOM >= :NOMINI AND TERC_NOM <= :NOMFIN
    INTO :NIT, :NOMBRE, :DV, :TELEFONO, :CIUDAD, :CODZONA, :CODCIUD
    DO  
    BEGIN

    SELECT GRPR_NOM FROM GRUPOS_PROVEEDORES WHERE GRPR_COD = :CODZONA INTO :NOMZONA;
    SELECT CIUD_NOM FROM CIUDADES WHERE CIUD_COD = :CODCIUD INTO :NOMCIUD;
    OK = 'N';
    if (AGRUPA = 'Z') then
        BEGIN
        if (GRPINI = '') then
            BEGIN
            if ((CODZONA IS NULL) or (CODZONA >= :GRPINI AND CODZONA <= :GRPFIN)) then
                OK = 'S';
            END
        ELSE
            if (CODZONA >= :GRPINI AND CODZONA <= :GRPFIN) then
                OK = 'S';
        END
    if (AGRUPA = 'C') then
        BEGIN
        if (GRPINI = '') then
            BEGIN
            if ((CODCIUD IS NULL) or (CODCIUD >= :GRPINI AND CODCIUD <= :GRPFIN)) then
                OK = 'S';
            END
        ELSE
            if (CODCIUD >= :GRPINI AND CODCIUD <= :GRPFIN) then
                OK = 'S';
        END
    if (AGRUPA = 'N') then
        OK = 'S';
        
    if (OK = 'S') then
        BEGIN
        execute procedure saldo_proveedor (NIT, FECINI) returning_values (INICIAL);
        if (INICIAL is null) then
            INICIAL = 0;
        SALDO = INICIAL;
        if (DETALLE = 'S') then
          BEGIN
          FOR select tido_nomcorto, mvpr_idref, mvpr_prefijo, mvpr_numero, mvpr_fecha, mvpr_conc, mvpr_monto, mvpr_debito, mvpr_rtfte, mvpr_rtiva, mvpr_rtica, mvpr_abono
            from movimiento_proveedor m, tipo_documento t
            where m.mvpr_tiporef = t.tido_cod and terc_nit = :NIT and mvpr_fecha >= :FECINI and mvpr_fecha <= :FECFIN AND MVPR_TIPOREF <> 55
            order by mvpr_fecha, mvpr_tiporef
            into :TIPODOC, :IDDOC, :PREFIJO, :NUMERO, :FECHA, :CONCEPTO, :DEBITO, :DB, :RTFTE, :RTIVA, :RTICA, :AB
            DO
            BEGIN
            if (RTFTE IS NULL) then
                RTFTE = 0;
            if (RTIVA IS NULL) then
                RTIVA = 0;
            if (RTICA IS NULL) then
                RTICA = 0;
            if (DB = 'N') then
                BEGIN
                CREDITO = DEBITO;
                DEBITO = 0;
                RTFTE = RTFTE * -1;
                RTIVA = RTIVA * -1;
                RTICA = RTICA * -1;
                END
            ELSE
                CREDITO = 0;
            SALDO = SALDO + DEBITO - CREDITO;
            if (AB = 'N') then
                BEGIN
                if (DESCRETE = 'SI') then
                    SALDO = SALDO - RTFTE - RTIVA - RTICA;
                ABONO = 0;
                END
            ELSE
                BEGIN
                ABONO = CREDITO;
                CREDITO = 0;
                if (DESCRETE <> 'SI') then
                    SALDO = SALDO + RTFTE + RTIVA + RTICA;
                END
            SUSPEND;
            END
          END
        ELSE
            BEGIN
            SELECT SUM(MVPR_MONTO), sum(mvpr_rtfte), sum(mvpr_rtiva), sum(mvpr_rtica) FROM movimiento_proveedor WHERE TERC_NIT = :NIT AND MVPR_FECHA >= :FECINI AND MVPR_FECHA <= :FECFIN AND MVPR_DEBITO = 'S' and MVPR_ABONO = 'N' INTO :DEBITO, :RTFTE, :RTIVA, :RTICA;
            if (DEBITO IS NULL) then
                DEBITO = 0;
            if (RTFTE IS NULL) then
                RTFTE = 0;
            if (RTIVA IS NULL) then
                RTIVA = 0;
            if (RTICA IS NULL) then
                RTICA = 0;
            if (DESCRETE = 'SI') then
                DEBITO = DEBITO - RTFTE - RTIVA - RTICA;
            SELECT SUM(MVPR_MONTO), sum(mvpr_rtfte), sum(mvpr_rtiva), sum(mvpr_rtica) FROM movimiento_proveedor WHERE TERC_NIT = :NIT AND MVPR_FECHA >= :FECINI AND MVPR_FECHA <= :FECFIN AND MVPR_DEBITO = 'N' AND MVPR_TIPOREF <> 55 AND MVPR_ABONO = 'N' INTO :CREDITO, :ARTFTE, :ARTIVA, :ARTICA;
            if (CREDITO IS NULL) then
                CREDITO = 0;
            if (ARTFTE IS NULL) then
                ARTFTE = 0;
            if (ARTIVA IS NULL) then
                ARTIVA = 0;
            if (ARTICA IS NULL) then
                ARTICA = 0;
            if (DESCRETE = 'SI') then
                CREDITO = CREDITO - ARTFTE - ARTIVA - ARTICA;
            RTFTE = RTFTE - ARTFTE;
            RTIVA = RTIVA - ARTIVA;
            RTICA = RTICA - ARTICA;
            SELECT SUM(MVPR_MONTO), sum(mvpr_rtfte), sum(mvpr_rtiva), sum(mvpr_rtica) FROM movimiento_proveedor WHERE TERC_NIT = :NIT AND MVPR_FECHA >= :FECINI AND MVPR_FECHA <= :FECFIN AND MVPR_ABONO = 'S' INTO :ABONO, :ARTFTE, :ARTIVA, :ARTICA;
            if (ABONO IS NULL) then
                ABONO = 0;
            if (ARTFTE IS NULL) then
                ARTFTE = 0;
            if (ARTIVA IS NULL) then
                ARTIVA = 0;
            if (ARTICA IS NULL) then
                ARTICA = 0;
            if (DESCRETE <> 'SI') then
                ABONO = ABONO + ARTFTE + ARTIVA + ARTICA;
            SALDO = INICIAL + DEBITO - CREDITO - ABONO;
            SUSPEND;
            END
        END
    END
END

^

SET TERM ; ^

SET TERM ^ ;

ALTER TRIGGER MOVIMIENTO_PROVEEDOR_AI
AS
declare variable existe char(1);
declare variable NETO NUMERIC(18, 2);
declare variable SALDO NUMERIC(18, 2);
declare variable desc_rtes char(2);
BEGIN
if (new.mvpr_tiporef <> 55) Then
  begin
  /* Verifique si hay que descontar retenciones */
  EXECUTE PROCEDURE LEE_CONFIGURACION('CXPAGAR', 'SALDOS', 'DESCONTAR RETENCIONES POR CAUSACION') returning_values (DESC_RTES);
  NETO = NEW.MVPR_MONTO;
  if ((DESC_RTES = 'SI') AND (NEW.mvpr_abono <> 'S')) then
    NETO = NEW.MVPR_MONTO - NEW.MVPR_RTFTE - NEW.MVPR_RTIVA - NEW.MVPR_RTICA;
  if ((DESC_RTES = 'NO') AND (NEW.mvpr_abono = 'S')) then
    NETO = NEW.MVPR_MONTO + NEW.MVPR_RTFTE + NEW.MVPR_RTIVA + NEW.MVPR_RTICA;
  if (NETO <> 0) then
    BEGIN
    EXISTE = 'N';
    select 'S' FROM saldos_proveedor WHERE TERC_NIT = NEW.TERC_NIT AND SAPR_FECHA = NEW.MVPR_FECHA INTO :EXISTE;
    if (EXISTE = 'S') then
      BEGIN
      /* ACTUALICE LOS DEBITOS/CREDITOS */
      if (NEW.MVPR_DEBITO = 'S') then
        UPDATE SALDOS_PROVEEDOR
          SET SAPR_DEBITOS = SAPR_DEBITOS + :NETO
        WHERE TERC_NIT = NEW.TERC_NIT AND SAPR_FECHA = NEW.MVPR_FECHA;
      ELSE
        UPDATE SALDOS_PROVEEDOR
          SET SAPR_CREDITOS = SAPR_CREDITOS + :NETO
        WHERE TERC_NIT = NEW.TERC_NIT AND SAPR_FECHA = NEW.MVPR_FECHA;
      END
    ELSE
      BEGIN
      /* INSERTE UN NUEVO REGISTRO */
      EXECUTE PROCEDURE SALDO_PROVEEDOR (NEW.TERC_NIT, NEW.MVPR_FECHA) returning_values (SALDO);
      if (NEW.MVPR_DEBITO = 'S') then
        INSERT INTO SALDOS_PROVEEDOR (TERC_NIT, SAPR_FECHA, SAPR_DEBITOS, SAPR_CREDITOS, SAPR_SALDO)
          VALUES(NEW.TERC_NIT, NEW.MVPR_FECHA, :NETO, 0, :SALDO);
      else
        INSERT INTO saldos_proveedor (TERC_NIT, SAPR_FECHA, SAPR_DEBITOS, SAPR_CREDITOS, SAPR_SALDO)
          VALUES(NEW.TERC_NIT, NEW.MVPR_FECHA, 0, :NETO, :SALDO);
      END
    /* ACTUALICE LOS SALDOS POSTERIORES */
    if (NEW.MVPR_DEBITO = 'S') then
      UPDATE SALDOS_PROVEEDOR
        SET SAPR_SALDO = SAPR_SALDO + :NETO
        WHERE TERC_NIT = NEW.TERC_NIT AND SAPR_FECHA > NEW.MVPR_FECHA;
    ELSE
      UPDATE SALDOS_PROVEEDOR
        SET SAPR_SALDO = SAPR_SALDO - :NETO
        WHERE TERC_NIT = NEW.TERC_NIT AND SAPR_FECHA > NEW.MVPR_FECHA;
    END
  END
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER TRIGGER MOVIMIENTO_PROVEEDOR_AU
AS
declare variable existe char(1);
declare variable NETO NUMERIC(18, 2);
declare variable SALDO NUMERIC(18, 2);
declare variable desc_rtes char(2);
BEGIN
if (new.mvpr_tiporef <> 55) Then
  begin
  /* Verifique si hay que descontar retenciones */
  EXECUTE PROCEDURE LEE_CONFIGURACION('CXPAGAR', 'SALDOS', 'DESCONTAR RETENCIONES POR CAUSACION') returning_values (DESC_RTES);
  NETO = OLD.MVPR_MONTO;
  if ((DESC_RTES = 'SI') AND (OLD.mvpr_abono <> 'S')) then
    NETO = OLD.MVPR_MONTO - OLD.MVPR_RTFTE - OLD.MVPR_RTIVA - OLD.MVPR_RTICA;
  if ((DESC_RTES = 'NO') AND (OLD.mvpr_abono = 'S')) then
    NETO = OLD.MVPR_MONTO + OLD.MVPR_RTFTE + OLD.MVPR_RTIVA + OLD.MVPR_RTICA;
  /* BORRE EL REGISTRO PREVIO */
  if (NETO <> 0) then
    BEGIN
    EXISTE = 'N';
    select 'S' FROM saldos_proveedor WHERE TERC_NIT = OLD.TERC_NIT AND SAPR_FECHA = OLD.MVPR_FECHA INTO :EXISTE;
    if (EXISTE = 'S') then
      BEGIN
      /* ACTUALICE LOS DEBITOS/CREDITOS */
      if (OLD.MVPR_DEBITO = 'S') then
        UPDATE SALDOS_PROVEEDOR
          SET SAPR_DEBITOS = SAPR_DEBITOS - :NETO
        WHERE TERC_NIT = OLD.TERC_NIT AND SAPR_FECHA = OLD.MVPR_FECHA;
      ELSE
        UPDATE SALDOS_PROVEEDOR
          SET SAPR_CREDITOS = SAPR_CREDITOS - :NETO
        WHERE TERC_NIT = OLD.TERC_NIT AND SAPR_FECHA = OLD.MVPR_FECHA;
      END
    /* ACTUALICE LOS SALDOS POSTERIORES */
    if (OLD.MVPR_DEBITO = 'S') then
      UPDATE SALDOS_PROVEEDOR
        SET SAPR_SALDO = SAPR_SALDO - :NETO
        WHERE TERC_NIT = OLD.TERC_NIT AND SAPR_FECHA > OLD.MVPR_FECHA;
    ELSE
      UPDATE SALDOS_PROVEEDOR
        SET SAPR_SALDO = SAPR_SALDO + :NETO
        WHERE TERC_NIT = OLD.TERC_NIT AND SAPR_FECHA > OLD.MVPR_FECHA;
    END
  /* REGISTRE LO NUEVO */
  NETO = NEW.MVPR_MONTO;
  if ((DESC_RTES = 'SI') AND (NEW.mvpr_abono <> 'S')) then
    NETO = NEW.MVPR_MONTO - NEW.MVPR_RTFTE - NEW.MVPR_RTIVA - NEW.MVPR_RTICA;
  if ((DESC_RTES = 'NO') AND (NEW.mvpr_abono = 'S')) then
    NETO = NEW.MVPR_MONTO + NEW.MVPR_RTFTE + NEW.MVPR_RTIVA + NEW.MVPR_RTICA;
  if (NETO <> 0) then
    BEGIN
    EXISTE = 'N';
    select 'S' FROM saldos_proveedor WHERE TERC_NIT = NEW.TERC_NIT AND SAPR_FECHA = NEW.MVPR_FECHA INTO :EXISTE;
    if (EXISTE = 'S') then
      BEGIN
      /* ACTUALICE LOS DEBITOS/CREDITOS */
      if (NEW.MVPR_DEBITO = 'S') then
        UPDATE SALDOS_PROVEEDOR
          SET SAPR_DEBITOS = SAPR_DEBITOS + :NETO
        WHERE TERC_NIT = NEW.TERC_NIT AND SAPR_FECHA = NEW.MVPR_FECHA;
      ELSE
        UPDATE SALDOS_PROVEEDOR
          SET SAPR_CREDITOS = SAPR_CREDITOS + :NETO
        WHERE TERC_NIT = NEW.TERC_NIT AND SAPR_FECHA = NEW.MVPR_FECHA;
      END
    ELSE
      BEGIN
      /* INSERTE UN NUEVO REGISTRO */
      EXECUTE PROCEDURE SALDO_PROVEEDOR (NEW.TERC_NIT, NEW.MVPR_FECHA) returning_values (SALDO);
      if (NEW.MVPR_DEBITO = 'S') then
        INSERT INTO saldos_proveedor (TERC_NIT, SAPR_FECHA, SAPR_DEBITOS, SAPR_CREDITOS, SAPR_SALDO)
          VALUES(NEW.TERC_NIT, NEW.MVPR_FECHA, :NETO, 0, :SALDO);
      else
        INSERT INTO saldos_proveedor (TERC_NIT, SAPR_FECHA, SAPR_DEBITOS, SAPR_CREDITOS, SAPR_SALDO)
          VALUES(NEW.TERC_NIT, NEW.MVPR_FECHA, 0, :NETO, :SALDO);
      END
    /* ACTUALICE LOS SALDOS POSTERIORES */
    if (NEW.MVPR_DEBITO = 'S') then
      UPDATE SALDOS_PROVEEDOR
        SET SAPR_SALDO = SAPR_SALDO + :NETO
        WHERE TERC_NIT = NEW.TERC_NIT AND SAPR_FECHA > NEW.MVPR_FECHA;
    ELSE
      UPDATE SALDOS_PROVEEDOR
        SET SAPR_SALDO = SAPR_SALDO - :NETO
        WHERE TERC_NIT = NEW.TERC_NIT AND SAPR_FECHA > NEW.MVPR_FECHA;
    END
  
  /* SI QUEDO EN CEROS EL MONTO Y LAS RETES, ELIMINE EL REGISTRO */
  if ((NEW.mvpr_monto = 0) AND (NEW.mvpr_rtfte = 0) AND (NEW.mvpr_rtica = 0) AND (NEW.mvpr_rtiva = 0)) then
    IF (NEW.MVPR_TIPOREF <> 53) THEN
      DELETE FROM movimiento_proveedor WHERE MVPR_ID = NEW.mvpr_id;
    ELSE
      BEGIN
      SELECT APPR_ANULADO FROM APLICACION_PROVEDOR WHERE APPR_ID = NEW.mvpr_idref INTO :EXISTE;
      if (EXISTE = 'S') then
            DELETE FROM movimiento_proveedor WHERE MVPR_ID = NEW.mvpr_id;
      END
  END
END
^

SET TERM ; ^

DROP PROCEDURE CHEQUEO_SALDOS_CXPAGAR;
DROP TRIGGER MOVIMIENTO_PROVEEDOR_AD;
DROP TRIGGER MOVIMIENTO_PROVEEDOR_AI;

SET TERM ^ ;

CREATE OR ALTER TRIGGER MOVIMIENTO_PROVEEDOR_AU FOR MOVIMIENTO_PROVEEDOR
ACTIVE AFTER UPDATE POSITION 0
AS
declare variable existe char(1);
BEGIN
if (new.mvpr_tiporef <> 55) Then
  begin
  /* SI QUEDO EN CEROS EL MONTO Y LAS RETES, ELIMINE EL REGISTRO */
  if ((NEW.mvpr_monto = 0) AND (NEW.mvpr_rtfte = 0) AND (NEW.mvpr_rtica = 0) AND (NEW.mvpr_rtiva = 0)) then
    IF (NEW.MVPR_TIPOREF <> 53) THEN
      DELETE FROM movimiento_proveedor WHERE MVPR_ID = NEW.mvpr_id;
    ELSE
      BEGIN
      SELECT APPR_ANULADO FROM APLICACION_PROVEDOR WHERE APPR_ID = NEW.mvpr_idref INTO :EXISTE;
      if (EXISTE = 'S') then
            DELETE FROM movimiento_proveedor WHERE MVPR_ID = NEW.mvpr_id;
      END
  END
END
^

SET TERM ; ^

DROP TRIGGER SALDOS_PROVEEDOR_AU;
DROP TRIGGER TI_SALDOS_PROVEEDOR;
DROP TABLE SALDOS_PROVEEDOR;
/* ahora si los cambios para la doble moneda */

INSERT INTO CONFIGURACION (CONF_MODULO, CONF_CATEGORIA, CONF_PROPIEDAD, CONF_VALOR, CONF_POSIBLES, CONF_AYUDA) VALUES ('GENERAL', 'GENERAL', 'PREGUNTAR TASA DE CAMBIO EN DOCUMENTOS DE CARTERA', 'NO', 'SI,NO', 'SI: Cada documento de cartera preguntará los montos en moneda extranjera y la tasa de cambio del dia para convertir a pesos el documento');
INSERT INTO CONFIGURACION (CONF_MODULO, CONF_CATEGORIA, CONF_PROPIEDAD, CONF_VALOR, CONF_POSIBLES, CONF_AYUDA) VALUES ('GENERAL', 'GENERAL', 'PREGUNTAR TASA DE CAMBIO EN DOCUMENTOS DE CUENTAS POR PAGAR', 'NO', 'SI,NO', 'SI: Cada documento de cuentas por pagar preguntará los montos en moneda extranjera y la tasa d cambio del día para convertir a pesos el documento');
COMMIT WORK;

ALTER TABLE FACTURAS ADD FACT_TRM T_MONTO;

ALTER TABLE MOVIMIENTO_CLIENTES ADD MVCL_TRM T_MONTO;

ALTER TABLE SALDOS_DOC_CARTERA ADD SDCA_TRM T_MONTO;


SET TERM ^ ;

CREATE OR ALTER TRIGGER FACTURAS_BI FOR FACTURAS
ACTIVE BEFORE INSERT POSITION 0
AS
declare variable NUMERO VARCHAR(6);
declare variable AUTOM CHAR(1);
declare variable EXISTE CHAR(1);
DECLARE VARIABLE VALCUPO CHAR(10);
declare variable DISPONIBLE NUMERIC(18,2);
declare variable OK CHAR(1);
declare variable SITOT CHAR(2);
declare variable CODCOBR INTEGER;
declare variable CODVEND INTEGER;
declare variable contado char(1);
declare variable BLOQAUTO CHAR(2);
declare variable FECCONTA VARCHAR(8);
declare variable FECBLO VARCHAR(8);
declare variable FECSERVER CHAR(2);
declare variable PREGTASA CHAR(2);
BEGIN
EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION', 'DOCUMENTOS', 'INHABILITAR FECHA EN DOCUMENTOS') returning_values (:fecserver);
if (FECSERVER = 'SI') then
    NEW.fact_fecha = CAST ('NOW' AS DATE);
/* doble moneda */
if ((NEW.fact_trm IS NULL) OR (NEW.fact_trm = 0)) then
    NEW.fact_trm = 1;
EXECUTE PROCEDURE LEE_CONFIGURACION('GENERAL', 'GENERAL', 'PREGUNTAR TASA DE CAMBIO EN DOCUMENTOS DE CARTERA') returning_values (:pregtasa);
if (PREGTASA = 'SI') then
    BEGIN
    NEW.fact_dtomonto = NEW.fact_dtomonto * NEW.fact_trm;
    NEW.fact_comimonto = NEW.fact_comimonto * NEW.fact_trm;
    NEW.fact_adicional = NEW.fact_adicional * NEW.fact_trm;
    NEW.fact_ivamonto = NEW.fact_ivamonto * NEW.fact_trm;
    NEW.fact_rtftemonto = NEW.fact_rtftemonto * NEW.fact_trm;
    NEW.fact_rtivamonto = NEW.fact_rtivamonto * NEW.fact_trm;
    NEW.fact_rticamonto = NEW.fact_rticamonto * NEW.fact_trm;
    NEW.fact_extra = NEW.fact_extra * NEW.fact_trm;
    NEW.fact_dtofmonto = NEW.fact_dtofmonto * NEW.fact_trm;
    NEW.fact_total = NEW.fact_total * NEW.fact_trm;
    NEW.fact_dtoit1 = NEW.fact_dtoit1 * NEW.fact_trm;
    NEW.fact_dtoit2 = NEW.fact_dtoit2 * NEW.fact_trm;
    NEW.fact_dtoit3 = NEW.fact_dtoit3 * NEW.fact_trm;
    END
EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION', 'POS', 'CAMBIAR FECHA DE BLOQUEO AUTOMATICAMENTE AL CAMBIAR FECHA DE LA FACTURA') RETURNING_VALUES (:bloqauto);
if (bloqauto = 'SI') then
    BEGIN
    EXECUTE PROCEDURE LEE_CONFIGURACION ('CONTABILIDAD', 'GENERAL', 'FECHA DE BLOQUEO') RETURNING_VALUES (:FECBLO);
    EXECUTE PROCEDURE fecha_a_conta (NEW.fact_fecha) returning_values (:FECCONTA);
    if (FECBLO > FECCONTA) then
        EXCEPTION CONTABILIDAD_BLOQUEADA;
    if (FECBLO < FECCONTA) then
        UPDATE CONFIGURACION
            SET CONF_VALOR = :FECCONTA
            WHERE (CONF_MODULO = 'CONTABILIDAD') AND (CONF_CATEGORIA = 'GENERAL') AND (CONF_PROPIEDAD = 'FECHA DE BLOQUEO');
    END
OK = 'S';
EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'ACCION A TOMAR SI EL CUPO DE CREDITO ES INSUFICIENTE') RETURNING_VALUES (:VALCUPO);
select auto_contado from autorizaciones where pref_pre = new.pref_pre and tido_cod = 31 into :contado;
if (contado='N') then
BEGIN
  IF (VALCUPO = 'PROHIBIR') THEN
  BEGIN
  OK = 'N';
  /* VERIFIQUE EL CUPO DE CREDITO */
  execute procedure cupo_disponible(new.TERC_NIT, NEW.fact_fecha, NEW.fact_sucursal) returning_values (:DISPONIBLE);
  if (DISPONIBLE >= NEW.FACT_TOTAL) then
    OK = 'S';
  END
END
IF (OK = 'S') THEN
  begin
  /* calcule la comision */
  EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION', 'VENDEDORES', 'COMISIONES EN VENTA INCLUYENDO IMPUESTOS') returning_values (:SITOT);
  if ((NEW.fact_comiporc IS NULL) or (NEW.fact_comiporc = 0)) THEN
    BEGIN
    if (SITOT = 'SI') then
      SELECT MAX(COMI_PORC) FROM comisiones WHERE VEND_COD = NEW.vend_cod AND
        COMI_INICIAL <= NEW.fact_total AND COMI_FINAL >= NEW.fact_total
        INTO NEW.fact_comiporc;
    else
      SELECT MAX(COMI_PORC) FROM comisiones WHERE VEND_COD = NEW.vend_cod AND
        COMI_INICIAL <= (NEW.fact_total -NEW.fact_ivamonto) AND COMI_FINAL >= (NEW.fact_total -NEW.fact_ivamonto)
        INTO NEW.fact_comiporc;
    if (NEW.fact_comiporc IS NULL) then
        NEW.fact_comiporc = 0;
    END
  if (SITOT = 'SI') then
      NEW.fact_comimonto = NEW.fact_total * NEW.fact_comiporc / 100;
  ELSE
      NEW.fact_comimonto = (NEW.fact_total -NEW.fact_ivamonto) * NEW.fact_comiporc / 100;

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

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

select auto_numero from autorizaciones where auto_inicial <= new.fact_numero and auto_final >= new.fact_numero and auto_fecha <= new.fact_fecha and auto_vence >= new.fact_fecha and pref_pre = new.pref_pre into new.auto_numero;
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER FACTURAS_AI FOR FACTURAS
ACTIVE AFTER INSERT POSITION 0
AS
declare variable CONC VARCHAR(60);
declare variable PEDAUTO CHAR(2);
declare variable DIAS INTEGER;
declare variable NUMERO VARCHAR(6);
declare variable AUTOM CHAR(1);
declare variable NUMROWS INTEGER;
BEGIN
if ((NEW.FACT_ID <> 0) and (new.fact_anulado = 'N')) then
    BEGIN
    /* actualice el prefijo si se pasaron de una hoja impresa */
    execute procedure lee_configuracion('FACTURACION','FACTURAS','INCREMENTAR NUMERACION AUTOMATICAMENTE EN FACTURAS DE VARIAS HOJAS') returning_values (:pedauto);
    if (PEDAUTO = 'SI') then
        BEGIN
        select FORM_NROITEMS from FORMATOS where tido_cod = 31 and pref_pre = new.pref_pre into :dias;
        select count(*) from facturas_detalle where fact_id = new.fact_id into :numrows;
        if (numrows > dias) then
            begin
            SELECT PREF_ACTUAL, PREF_AUTO FROM PREFIJOS WHERE TIDO_COD = 31 AND PREF_PRE = NEW.PREF_PRE INTO :NUMERO, :AUTOM;
            if (AUTOM = 'S' or NUMERO = NEW.fact_numero) then
                BEGIN
                NUMROWS = CAST(NUMERO AS INTEGER) + DIV(numrows,dias);
                NUMERO = CAST(NUMROWS AS CHAR(6));
                update prefijos set pref_actual = :NUMERO WHERE TIDO_COD = 31 AND PREF_PRE = NEW.PREF_PRE;
                END
            end
        END
    /* Registre el nuevo saldo del documento */
    INSERT INTO SALDOS_DOC_CARTERA (SDCA_TIPOREF, SDCA_IDREF, SDCA_FECHA, TERC_NIT, SDCA_RTFTE, SDCA_RTIVA, SDCA_RTICA, SDCA_ABONO, SDCA_ABRTFTE, SDCA_ABRTIVA, SDCA_ABRTICA, SDCA_DEBITO, SDCA_MONTO, SDCA_TRM)
        VALUES (31, NEW.FACT_ID, NEW.FACT_fecha, NEW.terc_nit, NEW.FACT_rtftemonto, NEW.FACT_rtivamonto, NEW.FACT_rticamonto, 0, 0, 0, 0, 'S', NEW.FACT_TOTAL, NEW.fact_trm);
    /* Registre el movimiento del cliente */
    if (STRLEN(NEW.FACT_NOMCLIENTE) > 42) then
        CONC = 'FV No.' || NEW.PREF_PRE || NEW.FACT_NUMERO || '-' || SUBSTR(NEW.FACT_NOMCLIENTE, 1, 42);
    ELSE
        CONC = 'FV No.' || NEW.PREF_PRE || NEW.FACT_NUMERO || '-' || NEW.FACT_NOMCLIENTE;
    INSERT INTO MOVIMIENTO_CLIENTES (MVCL_ID, TERC_NIT, MVCL_TIPOREF, MVCL_IDREF, MVCL_FECHA, MVCL_VENCE, MVCL_CONC, MVCL_MONTO, MVCL_RTEFTE, MVCL_RTEIVA, MVCL_RTEICA, MVCL_DEBITO, MVCL_ABONO, MVCL_PREFREF, MVCL_NUMREF, mvcl_sucursal, COBR_COD, MVCL_TRM)
      VALUES (GEN_ID(ID_MOVCLI, 1), NEW.TERC_NIT, 31, NEW.FACT_ID, NEW.FACT_FECHA, NEW.FACT_VENCE, :CONC, NEW.FACT_TOTAL, NEW.FACT_RTFTEMONTO, NEW.FACT_RTIVAMONTO, NEW.FACT_RTICAMONTO, 'S', 'N', NEW.pref_pre, NEW.FACT_numero, new.fact_sucursal, NEW.cobr_cod, NEW.fact_trm);
    EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION','FACTURAS','GENERAR PEDIDO AUTOMATICAMENTE CON LA FACTURA') RETURNING_VALUES (PEDAUTO);
    if (PEDAUTO = 'SI') then
        BEGIN
        EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION','PEDIDOS','DIAS DE VALIDEZ') RETURNING_VALUES (DIAS);
        INSERT INTO PEDIDOS (PEDI_ID, TERC_NIT, VEND_COD, TIDO_COD, PREF_PRE, PEDI_NUMERO, PEDI_FECHA, PEDI_VALIDEZ, PEDI_DESPACHO, PEDI_OBS, PEDI_IVAINC, PEDI_NOMTERC, PEDI_DTOPOR, PEDI_DTOMONTO, PEDI_ADICIONAL, PEDI_IVAMONTO, PEDI_EXTRA, PEDI_TOTAL, PEDI_ANULADO, PEDI_TRANSMIT, PTVT_ID, PEDI_COTIZACI, PEDI_RTFTEPORC, PEDI_RTFTEMONTO, PEDI_RTIVAPORC, PEDI_RTIVAMONTO, PEDI_RTICAPORC, PEDI_RTICAMONTO, PEDI_SUCURSAL)
            VALUES (GEN_ID(ID_PEDIDO, 1), NEW.TERC_NIT, NEW.VEND_COD, 34, NEW.PREF_PRE, NEW.FACT_NUMERO, NEW.FACT_FECHA, :DIAS, NEW.FACT_DESPACHO, NEW.FACT_OBS, NEW.FACT_IVAINC, NEW.FACT_NOMCLIENTE, NEW.FACT_DTOPOR, NEW.FACT_DTOMONTO, NEW.FACT_ADICIONAL, NEW.FACT_IVAMONTO, NEW.FACT_EXTRA, NEW.FACT_TOTAL, 'N', 'N', NEW.PTVT_ID, NULL, NEW.FACT_RTFTEPOR, NEW.FACT_RTFTEMONTO, NEW.FACT_RTIVAPOR, NEW.FACT_RTIVAMONTO, NEW.FACT_RTICAPOR, NEW.FACT_RTICAMONTO, NEW.fact_sucursal);
        END
    INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
        VALUES (USER, 31, NEW.fact_id, 'I', NEW.pref_pre || NEW.fact_numero);
    END
END
^

SET TERM ; ^

SET TERM ^ ;

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

    DELETE FROM puntos_cliente WHERE PTCL_TIPODOC = 31 AND PTCL_IDDOC = OLD.fact_id;

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

    /* Verifique si habia abonos a la nota */
    ABONOS = 0;
    select COUNT(*) FROM SALDOS_DOC_CARTERA WHERE SDCA_TIPOREF = 31 AND SDCA_IDREF = OLD.FACT_ID AND SDCA_ABONO <> 0 INTO :ABONOS;
    if (ABONOS = 0) then
        BEGIN
        /* BORRE EL REGISTRO PREVIO */
        delete from saldos_doc_cartera where sdca_tiporef = 31 and sdca_idref = old.fact_id;
        delete from movimiento_clientes where (mvcl_tiporef = 31) and (mvcl_idref = old.fact_id);
        if (PEDAUTO = 'SI') then
            BEGIN
            /* INTENTE ANULAR EL PEDIDO DEL MISMO NUMERO */
            UPDATE PEDIDOS SET PEDI_ANULADO = 'S' WHERE PREF_PRE = OLD.pref_pre AND PEDI_NUMERO = OLD.fact_numero;
            END
        /* ANULE LA CONSOLIDACION */
        if (OLD.FACT_CONSOLIDA <> 0) then
            BEGIN
            UPDATE consolidado_faltantes SET COFA_OK = 'N' WHERE COFA_ID = OLD.fact_consolida;
            END
        END
    else
        exception DOCUMENTO_CON_ABONOS;
    end
if ((NEW.FACT_ID <> 0) AND (new.fact_anulado = 'N')) then
    BEGIN
    if (OLD.fact_id = 0) then
        BEGIN
        /* actualice el prefijo si se pasaron de una hoja impresa */
        execute procedure lee_configuracion('FACTURACION','FACTURAS','INCREMENTAR NUMERACION AUTOMATICAMENTE EN FACTURAS DE VARIAS HOJAS') returning_values (:CONC);
        if (CONC = 'SI') then
            BEGIN
            select FORM_NROITEMS from FORMATOS where tido_cod = 31 and pref_pre = new.pref_pre into :dias;
            select count(*) from facturas_detalle where fact_id = old.fact_id into :numrows;
            if (numrows > dias) then
                begin
                SELECT PREF_ACTUAL, PREF_AUTO FROM PREFIJOS WHERE TIDO_COD = 31 AND PREF_PRE = NEW.PREF_PRE INTO :NUMERO, :AUTOM;
                if (AUTOM = 'S' or NUMERO = NEW.fact_numero) then
                    BEGIN
                    NUMROWS = CAST(NUMERO AS INTEGER) + DIV(numrows,dias);
                    NUMERO = CAST(NUMROWS AS CHAR(6));
                    update prefijos set pref_actual = :NUMERO WHERE TIDO_COD = 31 AND PREF_PRE = NEW.PREF_PRE;
                    END
                end
            END
        END
  
    /* Registre el nuevo saldo del documento */
    INSERT INTO SALDOS_DOC_CARTERA (SDCA_TIPOREF, SDCA_IDREF, SDCA_FECHA, TERC_NIT, SDCA_RTFTE, SDCA_RTIVA, SDCA_RTICA, SDCA_ABONO, SDCA_ABRTFTE, SDCA_ABRTIVA, SDCA_ABRTICA, SDCA_DEBITO, SDCA_MONTO, SDCA_TRM)
        VALUES (31, NEW.FACT_ID, NEW.FACT_fecha, NEW.terc_nit, NEW.FACT_rtftemonto, NEW.FACT_rtivamonto, NEW.FACT_rticamonto, 0, 0, 0, 0, 'S', NEW.FACT_TOTAL, NEW.fact_trm);
    AUX = 'FACTURA DE VENTA No.' || NEW.PREF_PRE || NEW.FACT_NUMERO || '-' || NEW.FACT_NOMCLIENTE;
    if (STRLEN(AUX) > 60) then
        CONC = SUBSTR(AUX, 1, 60);
    else
        CONC = AUX;
    INSERT INTO MOVIMIENTO_CLIENTES (MVCL_ID, TERC_NIT, MVCL_TIPOREF, MVCL_IDREF, MVCL_FECHA, MVCL_VENCE, MVCL_CONC, MVCL_MONTO, MVCL_RTEFTE, MVCL_RTEIVA, MVCL_RTEICA, MVCL_DEBITO, MVCL_ABONO, MVCL_PREFREF, MVCL_NUMREF, MVCL_SUCURSAL, COBR_COD, MVCL_TRM)
        VALUES (GEN_ID(ID_MOVCLI, 1), NEW.TERC_NIT, 31, NEW.FACT_ID, NEW.FACT_FECHA, NEW.fact_vence, :CONC, NEW.FACT_TOTAL, NEW.FACT_RTFTEMONTO, NEW.FACT_RTIVAMONTO, NEW.FACT_RTICAMONTO, 'S', 'N', NEW.pref_pre, NEW.FACT_numero, NEW.fact_sucursal, NEW.cobr_cod, NEW.fact_trm);
    if (PEDAUTO = 'SI') then
        BEGIN
        EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION','PEDIDOS','DIAS DE VALIDEZ') RETURNING_VALUES (DIAS);
        INSERT INTO PEDIDOS (PEDI_ID, TERC_NIT, VEND_COD, TIDO_COD, PREF_PRE, PEDI_NUMERO, PEDI_FECHA, PEDI_VALIDEZ, PEDI_DESPACHO, PEDI_OBS, PEDI_IVAINC, PEDI_NOMTERC, PEDI_DTOPOR, PEDI_DTOMONTO, PEDI_ADICIONAL, PEDI_IVAMONTO, PEDI_EXTRA, PEDI_TOTAL, PEDI_ANULADO, PEDI_TRANSMIT, PTVT_ID, PEDI_COTIZACI, PEDI_RTFTEPORC, PEDI_RTFTEMONTO, PEDI_RTIVAPORC, PEDI_RTIVAMONTO, PEDI_RTICAPORC, PEDI_RTICAMONTO, PEDI_SUCURSAL)
            VALUES (0, NEW.TERC_NIT, NEW.VEND_COD, 34, NEW.PREF_PRE, NEW.FACT_NUMERO, NEW.FACT_FECHA, :DIAS, NEW.FACT_DESPACHO, NEW.FACT_OBS, NEW.FACT_IVAINC, NEW.FACT_NOMCLIENTE, NEW.FACT_DTOPOR, NEW.FACT_DTOMONTO, NEW.FACT_ADICIONAL, NEW.FACT_IVAMONTO, NEW.FACT_EXTRA, NEW.FACT_TOTAL, 'N', 'N', NEW.PTVT_ID, NULL, NEW.FACT_RTFTEPOR, NEW.FACT_RTFTEMONTO, NEW.FACT_RTIVAPOR, NEW.FACT_RTIVAMONTO, NEW.FACT_RTICAPOR, NEW.FACT_RTICAMONTO, NEW.fact_sucursal);
        END
    INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
        VALUES (USER, 31, NEW.fact_id, 'U', NEW.pref_pre || NEW.fact_numero);
    end
/* SI CAMBIA EL NUEMRO O LA FECHA CAMBIE EL DETALLE */
if ((OLD.pref_pre <> NEW.pref_pre) or
    (OLD.fact_numero <> NEW.fact_numero) or
    (OLD.fact_fecha <> NEW.fact_fecha)) then
    UPDATE FACTURAS_DETALLE SET FADE_TRANSMIT = 'N' WHERE FACT_ID = NEW.FACT_ID;
/* ACTUALICE EL ANULADO EN LOS DETALLES */
if (OLD.FACT_anulado <> NEW.FACT_anulado) then
    UPDATE FACTURAS_DETALLE SET FADE_ANULADO = NEW.FACT_anulado WHERE FACT_ID = NEW.FACT_ID;
if (OLD.fact_transmit <> NEW.fact_transmit) then
    UPDATE FACTURAS_DETALLE SET FADE_TRANSMIT = NEW.fact_transmit WHERE FACT_ID = NEW.FACT_ID;
END
^

SET TERM ; ^

CREATE TABLE TIPOS_MONEDA (
    TIMO_COD INTEGER NOT NULL,
    TIMO_NOMBRE VARCHAR(60));
alter table TIPOS_MONEDA
add constraint PK_TIPOS_MONEDA
primary key (TIMO_COD);

CREATE TABLE TASA_CAMBIO_MONEDA (
    TACA_ID INTEGER NOT NULL,
    TACA_FECHA DATE NOT NULL,
    TIMO_COD INTEGER NOT NULL,
    TACA_VALOR NUMERIC(18,2));
alter table TASA_CAMBIO_MONEDA
add constraint PK_TASA_CAMBIO_MONEDA
primary key (TACA_ID);

alter table TASA_CAMBIO_MONEDA
add constraint FK_TASA_CAMBIO_MONEDA_2
foreign key (TIMO_COD)
references TIPOS_MONEDA(TIMO_COD);

ALTER TABLE DEVOLUCIONES_VENTAS
ADD DEVT_TRM T_MONTO;

SET TERM ^ ;


CREATE OR ALTER TRIGGER DEVOLUCIONES_VENTAS_BI FOR DEVOLUCIONES_VENTAS
ACTIVE BEFORE INSERT POSITION 0
AS
declare variable NUMERO VARCHAR(6);
declare variable AUTOM CHAR(1);
declare variable EXISTE CHAR(1);
declare variable SITOT CHAR(2);
declare variable CODCOBR INTEGER;
declare variable CODVEND INTEGER;
declare variable FECSERVER CHAR(2);
declare variable PREGTASA CHAR(2);
BEGIN
if ((NEW.devt_trm IS NULL) OR (NEW.DEVT_TRM = 0)) then
    NEW.devt_trm = 1;
EXECUTE PROCEDURE LEE_CONFIGURACION('GENERAL', 'GENERAL', 'PREGUNTAR TASA DE CAMBIO EN DOCUMENTOS DE CARTERA') returning_values (:pregtasa);
if (PREGTASA = 'SI') then
    BEGIN
    NEW.devt_adicional = NEW.devt_adicional * NEW.devt_trm;
    NEW.devt_ivamonto = NEW.devt_ivamonto * NEW.devt_trm;
    NEW.devt_extra = NEW.devt_extra * NEW.devt_trm;
    NEW.devt_rtftemonto = NEW.devt_rtftemonto * NEW.devt_trm;
    NEW.devt_rtivamonto = NEW.devt_rtivamonto * NEW.devt_trm;
    NEW.devt_rticamonto = NEW.devt_rticamonto * NEW.devt_trm;
    NEW.devt_dtomonto = NEW.devt_dtomonto * NEW.devt_trm;
    END
EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION', 'DOCUMENTOS', 'INHABILITAR FECHA EN DOCUMENTOS') returning_values (:fecserver);
if (FECSERVER = 'SI') then
    NEW.devt_fecha = CAST ('NOW' AS DATE);
if (new.devt_remid is null) then
    NEW.devt_remid = 0;
execute procedure LEE_CONFIGURACION ('FACTURACION','DEVOLUCIONES','PERMITIR DEVOLVER ITEMS NO FACTURADOS') returning_values (:SITOT);
if ((SITOT = 'NO') AND (NEW.devt_factid = 0)) then
    exception factura_no_existe;
/* CALCULE LA COMISION CON BASE EN LA FACTURA */
EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION', 'VENDEDORES', 'COMISIONES EN VENTA INCLUYENDO IMPUESTOS') returning_values (:SITOT);
SELECT FACT_COMIPORC FROM FACTURAS WHERE FACT_ID = NEW.devt_factid INTO NEW.devt_comiporc;
if (NEW.devt_comiporc IS NULL) then
    NEW.devt_comiporc = 0;

if (SITOT = 'SI') then
    NEW.devt_comimonto = NEW.devt_total * NEW.devt_comiporc / 100;
ELSE
    NEW.devt_comimonto = (NEW.devt_total - NEW.devt_ivamonto) * NEW.devt_comiporc / 100;

if (NEW.numok = 'N') then
  BEGIN
  /* Actualice el contador del prefijo */
  SELECT PREF_ACTUAL, PREF_AUTO FROM PREFIJOS WHERE TIDO_COD = 33 AND PREF_PRE = NEW.PREF_PRE INTO :NUMERO, :AUTOM;
  /* ACTUALICE EL NUMERO EN COMPROBANTE_ENCABEZADO  */
  if (AUTOM = 'S') then
    BEGIN
    NEW.DEVT_NUMERO = NUMERO;
    NUMERO = CAST((CAST(NUMERO AS INTEGER) + 1) AS CHAR(6));
    UPDATE PREFIJOS
      SET PREF_ACTUAL = :NUMERO
    WHERE TIDO_COD = 33 AND PREF_PRE = NEW.PREF_PRE;
    END
  ELSE
    BEGIN
    if (CAST(NUMERO AS INTEGER) = CAST(NEW.DEVT_NUMERO AS INTEGER)) then
        UPDATE PREFIJOS
          SET PREF_ACTUAL = CAST((CAST(PREF_ACTUAL AS INTEGER) + 1) AS CHAR(6))
        WHERE TIDO_COD = 33 AND PREF_PRE = NEW.PREF_PRE;
    END
  EXECUTE PROCEDURE COMPLETA_CEROS (NEW.DEVT_numero) returning_values (NEW.DEVT_numero);
  NEW.numok = 'S';
  END
/* Verifique que el numero no existe previamente */
EXISTE = 'N';
SELECT 'S' FROM DEVOLUCIONES_VENTAS WHERE PREF_PRE = NEW.PREF_PRE AND DEVT_NUMERO = NEW.DEVT_NUMERO INTO :EXISTE;
if (EXISTE = 'S') then
    EXCEPTION DOCUMENTO_REGISTRADO;
select COBR_COD, VEND_COD FROM CLIENTES WHERE TERC_NIT = NEW.terc_nit INTO :CODCOBR, CODVEND;
if (NEW.cobr_cod IS NULL) then
    NEW.cobr_cod = :CODCOBR;
if (NEW.vend_cod IS NULL) then
    NEW.vend_cod = :CODVEND;
if ((new.DEVT_TOTAL-new.DEVT_IVAMONTO+new.DEVT_DTOMONTO-new.DEVT_ADICIONAL) = 0) then
    NEW.DEVT_FACTOR = 1;
else
    NEW.DEVT_FACTOR = (new.DEVT_TOTAL-new.DEVT_IVAMONTO)/(new.DEVT_TOTAL-new.DEVT_IVAMONTO+new.DEVT_DTOMONTO-new.DEVT_ADICIONAL);
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER DEVOLUCIONES_VENTAS_AI FOR DEVOLUCIONES_VENTAS
ACTIVE AFTER INSERT POSITION 0
AS
declare variable CONC VARCHAR(60);
BEGIN
if ((NEW.DEVT_ID <> 0) and (new.devt_anulado = 'N')) then
    BEGIN
    /* Registre el nuevo saldo del documento */
    INSERT INTO SALDOS_DOC_CARTERA (SDCA_TIPOREF, SDCA_IDREF, SDCA_FECHA, TERC_NIT, SDCA_RTFTE, SDCA_RTIVA, SDCA_RTICA, SDCA_ABONO, SDCA_ABRTFTE, SDCA_ABRTIVA, SDCA_ABRTICA, SDCA_DEBITO, SDCA_MONTO, SDCA_TRM)
        VALUES (33, NEW.DEVT_ID, NEW.DEVT_fecha, NEW.terc_nit, (NEW.DEVT_rtftemonto*-1), (NEW.DEVT_rtivamonto*-1), (NEW.DEVT_rticamonto*-1), 0, 0, 0, 0, 'N', (NEW.DEVT_TOTAL*-1), new.devt_trm);
    /* Registre el movimiento del cliente */
    CONC = 'DEVOLUCION VENTA No.' || NEW.PREF_PRE || NEW.DEVT_NUMERO || ' EN FACTURA ' || NEW.devt_factura;
    INSERT INTO MOVIMIENTO_CLIENTES (MVCL_ID, TERC_NIT, MVCL_TIPOREF, MVCL_IDREF, MVCL_FECHA, MVCL_VENCE, MVCL_CONC, MVCL_MONTO, MVCL_RTEFTE, MVCL_RTEIVA, MVCL_RTEICA, MVCL_DEBITO, MVCL_ABONO, MVCL_PREFREF, MVCL_NUMREF, MVCL_SUCURSAL, COBR_COD, MVCL_TRM)
      VALUES (GEN_ID(ID_MOVCLI, 1), NEW.TERC_NIT, 33, NEW.DEVT_ID, NEW.DEVT_FECHA, NEW.DEVT_FECHA, :CONC, NEW.DEVT_TOTAL, NEW.DEVT_RTFTEMONTO, NEW.DEVT_RTIVAMONTO, NEW.DEVT_RTICAMONTO, 'N', 'N', NEW.pref_pre, NEW.DEVT_numero, NEW.devt_sucursal, NEW.cobr_cod, new.devt_trm);
    /* ACTUALICE LA CONSOLIDACION */
    if (NEW.DEVT_CONSOLIDA <> 0) then
        UPDATE consolidado_faltantes SET COFA_IDDES = NEW.devt_id, COFA_OK = 'S' WHERE COFA_ID = NEW.devt_consolida;
    INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
        VALUES (USER, 33, NEW.devt_id, 'I', NEW.pref_pre || NEW.devt_numero);
    END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER DEVOLUCIONES_VENTAS_AU FOR DEVOLUCIONES_VENTAS
ACTIVE AFTER UPDATE POSITION 0
AS
declare variable ABONOS integer;
declare variable CONC VARCHAR(60);
declare variable consec INTEGER;
BEGIN
if (new.devt_anulado = 'S') then
    begin
    select enco_consec from comprobante_encabezado where enco_tiporef = 33 and enco_idref = old.devt_id into :consec;
    if (NOT consec is null) then
      delete from comprobante_detalle where enco_consec = :consec;
    delete from comprobante_encabezado where enco_tiporef = 33 and enco_idref = old.devt_id;

    DELETE FROM puntos_cliente WHERE PTCL_TIPODOC = 33 AND PTCL_IDDOC = OLD.devt_id;

    INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
        VALUES (USER, 33, NEW.devt_id, 'A', NEW.pref_pre || NEW.devt_numero);
    end
if ((old.DEVT_id <> 0) and (old.devt_anulado = 'N')) then
    begin
    /* Verifique si habia abonos a la nota */
    ABONOS = 0;
    select COUNT(*) FROM SALDOS_DOC_CARTERA WHERE SDCA_TIPOREF = 33 AND SDCA_IDREF = OLD.DEVT_ID AND SDCA_ABONO <> 0 INTO :ABONOS;
    if (ABONOS = 0) then
        BEGIN
        /* BORRE EL REGISTRO PREVIO */
        delete from saldos_doc_cartera where sdca_tiporef = 33 and sdca_idref = old.devt_id;
        delete from movimiento_clientes where (mvcl_tiporef = 33) and (mvcl_idref = old.devt_id);
        /* ACTUALICE LA CONSOLIDACION */
        if (OLD.DEVT_CONSOLIDA <> 0) then
            UPDATE consolidado_faltantes SET COFA_OK = 'N' WHERE COFA_ID = old.devt_consolida;
        END
    else
        exception DOCUMENTO_CON_ABONOS;
    END
if ((new.DEVT_id <> 0) and (new.devt_anulado = 'N')) then
    BEGIN
    /* Registre el nuevo saldo del documento */
    INSERT INTO SALDOS_DOC_CARTERA (SDCA_TIPOREF, SDCA_IDREF, SDCA_FECHA, TERC_NIT, SDCA_RTFTE, SDCA_RTIVA, SDCA_RTICA, SDCA_ABONO, SDCA_ABRTFTE, SDCA_ABRTIVA, SDCA_ABRTICA, SDCA_DEBITO, SDCA_MONTO, SDCA_TRM)
        VALUES (33, NEW.DEVT_ID, NEW.DEVT_fecha, NEW.terc_nit, (NEW.DEVT_rtftemonto*-1), (NEW.DEVT_rtivamonto*-1), (NEW.DEVT_rticamonto*-1), 0, 0, 0, 0, 'N', (NEW.DEVT_TOTAL*-1), NEW.devt_trm);
    /* Registre el movimiento del cliente */
    CONC = 'DEVOLUCION VENTA No.' || NEW.PREF_PRE || NEW.DEVT_NUMERO || ' EN FACTURA ' || NEW.devt_factura;
    INSERT INTO MOVIMIENTO_CLIENTES (MVCL_ID, TERC_NIT, MVCL_TIPOREF, MVCL_IDREF, MVCL_FECHA, MVCL_VENCE, MVCL_CONC, MVCL_MONTO, MVCL_RTEFTE, MVCL_RTEIVA, MVCL_RTEICA, MVCL_DEBITO, MVCL_ABONO, MVCL_PREFREF, MVCL_NUMREF, MVCL_SUCURSAL, COBR_COD, MVCL_TRM)
        VALUES (GEN_ID(ID_MOVCLI, 1), NEW.TERC_NIT, 33, NEW.DEVT_ID, NEW.DEVT_FECHA, NEW.DEVT_FECHA, :CONC, NEW.DEVT_TOTAL, NEW.DEVT_RTFTEMONTO, NEW.DEVT_RTIVAMONTO, NEW.DEVT_RTICAMONTO, 'N', 'N', NEW.pref_pre, NEW.DEVT_numero, NEW.devt_sucursal, NEW.cobr_cod, NEW.devt_trm);
    /* ACTUALICE LA CONSOLIDACION */
    if (NEW.DEVT_CONSOLIDA <> 0) then
        UPDATE consolidado_faltantes SET COFA_IDDES = NEW.devt_id, COFA_OK = 'S' WHERE COFA_ID = NEW.devt_consolida;
    INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
        VALUES (USER, 33, NEW.devt_id, 'U', NEW.pref_pre || NEW.devt_numero);
    END
/* si cambio un dato critico actualice el detalle */
if ((OLD.devt_fecha <> NEW.devt_fecha) or
    (OLD.devt_numero <> NEW.devt_numero) or
    (OLD.pref_pre <> NEW.pref_pre) or
    (OLD.devt_factid <> NEW.devt_factid)) then
    UPDATE DEVOLUCIONES_VENTAS_DETALLE
        SET DVDE_TRANSMIT = 'N'
        WHERE DEVT_ID = NEW.DEVT_ID;
/* ACTUALICE EL ANULADO EN LOS DETALLES */
if (OLD.DEVT_anulado <> NEW.DEVT_anulado) then
    UPDATE DEVOLUCIONES_VENTAS_DETALLE
        SET DVDE_ANULADO = NEW.DEVT_anulado
        WHERE DEVT_ID = NEW.DEVT_ID;
if (OLD.devt_transmit <> NEW.devt_transmit) then
    UPDATE DEVOLUCIONES_VENTAS_DETALLE
        SET DVDE_TRANSMIT = NEW.devt_transmit
        WHERE DEVT_ID = NEW.DEVT_ID;
END
^

SET TERM ; ^

ALTER TABLE NOTAS_CREDITO_CLIENTES
ADD NCCL_TRM T_MONTO;

SET TERM ^ ;

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

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER NOTAS_CREDITO_CLIENTES_AI FOR NOTAS_CREDITO_CLIENTES
ACTIVE AFTER INSERT POSITION 0
AS
BEGIN
  if ((NEW.NCCL_ID <> 0) and (new.nccl_anulado = 'N')) then
    BEGIN
    /* Registre el nuevo saldo del documento */
    INSERT INTO SALDOS_DOC_CARTERA (SDCA_TIPOREF, SDCA_IDREF, SDCA_FECHA, TERC_NIT, SDCA_RTFTE, SDCA_RTIVA, SDCA_RTICA, SDCA_ABONO, SDCA_ABRTFTE, SDCA_ABRTIVA, SDCA_ABRTICA, SDCA_DEBITO, SDCA_MONTO, SDCA_TRM)
        VALUES (42, NEW.NCCL_ID, NEW.nccl_fecha, NEW.terc_nit, (NEW.nccl_rtftemonto*-1), (NEW.nccl_rtivamonto*-1), (NEW.nccl_rticamonto*-1), 0, 0, 0, 0, 'N', ((NEW.nccl_monto+NEW.nccl_ivamonto)*-1), NEW.nccl_trm);
    /* Registre el movimiento del proveedor */
    INSERT INTO MOVIMIENTO_CLIENTES (MVCL_ID, TERC_NIT, MVCL_TIPOREF, MVCL_IDREF, MVCL_FECHA, MVCL_VENCE, MVCL_CONC, MVCL_MONTO, MVCL_RTEFTE, MVCL_RTEIVA, MVCL_RTEICA, MVCL_DEBITO, MVCL_ABONO, MVCL_PREFREF, MVCL_NUMREF, MVCL_SUCURSAL, COBR_COD, MVCL_TRM)
      VALUES (GEN_ID(ID_MOVCLI, 1), NEW.TERC_NIT, 42, NEW.NCCL_ID, NEW.NCCL_FECHA, NEW.NCCL_FECHA, NEW.NCCL_CONC, NEW.NCCL_MONTO+NEW.NCCL_IVAMONTO, NEW.NCCL_RTFTEMONTO, NEW.NCCL_RTIVAMONTO, NEW.NCCL_RTICAMONTO, 'N', 'N', NEW.pref_pre, NEW.nccl_numero, NEW.nccl_sucursal, NEW.cobr_cod, NEW.nccl_trm);
    INSERT INTO AUDITORIA(audi_usuario, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
        VALUES (USER, 42, NEW.nccl_id, 'I', NEW.pref_pre || NEW.nccl_numero);
    END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER NOTAS_CREDITO_CLIENTES_AU FOR NOTAS_CREDITO_CLIENTES
ACTIVE AFTER UPDATE POSITION 0
AS
declare variable consec INTEGER;
declare variable ABONOS char(1);
BEGIN
if (new.nccl_anulado = 'S') then
    begin
    select enco_consec from comprobante_encabezado where enco_tiporef = 42 and enco_idref = old.nccl_id into :consec;
    if (NOT consec is null) then
     delete from comprobante_detalle where enco_consec = :consec;
    delete from comprobante_encabezado where enco_tiporef = 42 and enco_idref = old.nccl_id;
    INSERT INTO AUDITORIA (AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
        VALUES (USER, 42, new.nccl_id, 'A', NEW.pref_pre || NEW.nccl_numero);
    end

/* BORRE EL REGISTRO PREVIO */
if ((old.nccl_id <> 0) and (old.nccl_anulado = 'N')) then
    begin
    /* Verifique si habia abonos a la nota */
    ABONOS = 'N';
    select 'S' FROM SALDOS_DOC_CARTERA WHERE SDCA_TIPOREF = 42 AND SDCA_IDREF = OLD.NCCL_ID AND SDCA_ABONO <> 0 INTO :ABONOS;
    if (ABONOS = 'N') then
        BEGIN
        /* BORRE EL REGISTRO PREVIO */
        delete from saldos_doc_cartera where sdca_tiporef = 42 and sdca_idref = old.nccl_id;
        delete from movimiento_clientes where (mvcl_tiporef = 42) and (mvcl_idref = old.nccl_id);
        END
    else
        exception DOCUMENTO_CON_ABONOS;
    end
if ((new.nccl_id <> 0) and (new.nccl_anulado = 'N')) then
    begin
    /* Registre el nuevo saldo del documento */
    INSERT INTO SALDOS_DOC_CARTERA (SDCA_TIPOREF, SDCA_IDREF, SDCA_FECHA, TERC_NIT, SDCA_RTFTE, SDCA_RTIVA, SDCA_RTICA, SDCA_ABONO, SDCA_ABRTFTE, SDCA_ABRTIVA, SDCA_ABRTICA, SDCA_DEBITO, SDCA_MONTO, SDCA_TRM)
        VALUES (42, NEW.NCCL_ID, NEW.nccl_fecha, NEW.terc_nit, (NEW.nccl_rtftemonto*-1), (NEW.nccl_rtivamonto*-1), (NEW.nccl_rticamonto*-1), 0, 0, 0, 0, 'N', ((NEW.nccl_monto+NEW.nccl_ivamonto)*-1), NEW.nccl_trm);
    /* Registre el movimiento del proveedor */
    INSERT INTO MOVIMIENTO_CLIENTES (MVCL_ID, TERC_NIT, MVCL_TIPOREF, MVCL_IDREF, MVCL_FECHA, MVCL_VENCE, MVCL_CONC, MVCL_MONTO, MVCL_RTEFTE, MVCL_RTEIVA, MVCL_RTEICA, MVCL_DEBITO, MVCL_ABONO, MVCL_PREFREF, MVCL_NUMREF, MVCL_SUCURSAL, COBR_COD, MVCL_TRM)
        VALUES (GEN_ID(ID_MOVCLI, 1), NEW.TERC_NIT, 42, NEW.NCCL_ID, NEW.NCCL_FECHA, NEW.NCCL_FECHA, NEW.NCCL_CONC, NEW.NCCL_MONTO+NEW.nccl_ivamonto, NEW.NCCL_RTFTEMONTO, NEW.NCCL_RTIVAMONTO, NEW.NCCL_RTICAMONTO, 'N', 'N', NEW.pref_pre, NEW.nccl_numero, NEW.nccl_sucursal, NEW.cobr_cod, NEW.nccl_trm);
    INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
        VALUES (USER, 42, NEW.nccl_id, 'U', NEW.pref_pre || NEW.nccl_numero);
    end
END
^

SET TERM ; ^

ALTER TABLE NOTAS_DEBITO_CLIENTES
ADD NDCL_TRM T_MONTO;

SET TERM ^ ;

CREATE OR ALTER TRIGGER NOTAS_DEBITO_CLIENTES_BI FOR NOTAS_DEBITO_CLIENTES
ACTIVE BEFORE INSERT POSITION 0
AS
declare variable NUMERO VARCHAR(6);
declare variable AUTOM CHAR(1);
declare variable EXISTE CHAR(1);
declare variable CODCOBR INTEGER;
declare variable CODVEND INTEGER;
declare variable PREGTASA CHAR(2);
declare variable SITOT CHAR(2);
BEGIN
/* Complete los campos nulos */
select COBR_COD, VEND_COD FROM CLIENTES WHERE TERC_NIT = NEW.terc_nit INTO :CODCOBR, CODVEND;
if (NEW.cobr_cod IS NULL) then
    NEW.cobr_cod = :CODCOBR;
if (NEW.vend_cod IS NULL) then
    NEW.vend_cod = :CODVEND;
if (NEW.ndcl_monto IS NULL) then
    NEW.ndcl_monto = 0;
if (NEW.ndcl_ivaporc IS NULL) then
    NEW.ndcl_ivaporc = 0;
if (NEW.ndcl_ivamonto IS NULL) then
    NEW.ndcl_ivamonto = 0;
if (NEW.ndcl_rtfteporc IS NULL) then
    NEW.ndcl_rtfteporc = 0;
if (NEW.ndcl_rtivaporc IS NULL) then
    NEW.ndcl_rtivaporc = 0;
if (NEW.ndcl_rticaporc IS NULL) then
    NEW.ndcl_rticaporc = 0;
if (NEW.ndcl_rtftemonto IS NULL) then
    NEW.ndcl_rtftemonto = 0;
if (NEW.ndcl_rtivamonto IS NULL) then
    NEW.ndcl_rtivamonto = 0;
if (NEW.ndcl_rticamonto IS NULL) then
    NEW.ndcl_rticamonto = 0;
if (NEW.ndcl_dtofporc IS NULL) then
    NEW.ndcl_dtofporc = 0;
if (NEW.ndcl_dtofmonto IS NULL) then
    NEW.ndcl_dtofmonto = 0;
if ((NEW.ndcl_trm IS NULL) OR (NEW.NDCL_TRM = 0)) then
    NEW.ndcl_trm = 1;
EXECUTE PROCEDURE LEE_CONFIGURACION('GENERAL', 'GENERAL', 'PREGUNTAR TASA DE CAMBIO EN DOCUMENTOS DE CARTERA') returning_values (:pregtasa);
if (PREGTASA = 'SI') then
    BEGIN
    NEW.ndcl_monto = NEW.ndcl_monto * NEW.ndcl_trm;
    NEW.ndcl_ivamonto = NEW.ndcl_ivamonto * NEW.ndcl_trm;
    NEW.ndcl_rtftemonto = NEW.ndcl_rtftemonto * NEW.ndcl_trm;
    NEW.ndcl_rtivamonto = NEW.ndcl_rtivamonto * NEW.ndcl_trm;
    NEW.ndcl_rticamonto = NEW.ndcl_rticamonto * NEW.ndcl_trm;
    NEW.ndcl_dtofmonto = NEW.ndcl_dtofmonto * NEW.ndcl_trm;
    END
EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION', 'VENDEDORES', 'COMISIONES EN VENTA INCLUYENDO IMPUESTOS') returning_values (:SITOT);
if (SITOT <> 'SI') then
    NEW.ndcl_comimonto = NEW.ndcl_monto * NEW.ndcl_comiporc / 100;
ELSE
    NEW.ndcl_comimonto = (NEW.ndcl_monto + NEW.ndcl_ivamonto) * NEW.ndcl_comiporc / 100;
if (NEW.numok = 'N') then
  BEGIN
  /* Actualice el contador del prefijo */
  SELECT PREF_ACTUAL, PREF_AUTO FROM PREFIJOS WHERE TIDO_COD = NEW.TIDO_COD AND PREF_PRE = NEW.PREF_PRE INTO :NUMERO, :AUTOM;
  /* ACTUALICE EL NUMERO EN COMPROBANTE_ENCABEZADO  */
  if (AUTOM = 'S') then
    BEGIN
    NEW.NDCL_NUMERO = NUMERO;
    NUMERO = CAST((CAST(NUMERO AS INTEGER) + 1) AS CHAR(6));
    UPDATE PREFIJOS
      SET PREF_ACTUAL = :NUMERO
    WHERE TIDO_COD = NEW.TIDO_COD AND PREF_PRE = NEW.PREF_PRE;
    END
  ELSE
    BEGIN
    if (CAST(NUMERO AS INTEGER) = CAST(NEW.NDCL_NUMERO AS INTEGER)) then
        UPDATE PREFIJOS
          SET PREF_ACTUAL = CAST((CAST(PREF_ACTUAL AS INTEGER) + 1) AS CHAR(6))
        WHERE TIDO_COD = NEW.TIDO_COD AND PREF_PRE = NEW.PREF_PRE;
    END
  EXECUTE PROCEDURE COMPLETA_CEROS (NEW.NDCL_numero) returning_values (NEW.NDCL_numero);
  NEW.numok = 'S';
  END
/* Verifique que el numero no existe previamente */
EXISTE = 'N';
SELECT 'S' FROM NOTAS_DEBITO_CLIENTES WHERE PREF_PRE = NEW.PREF_PRE AND NDCL_NUMERO = NEW.NDCL_NUMERO INTO :EXISTE;
if (EXISTE = 'S') then
    EXCEPTION DOCUMENTO_REGISTRADO;
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER NOTAS_DEBITO_CLIENTES_AI FOR NOTAS_DEBITO_CLIENTES
ACTIVE AFTER INSERT POSITION 0
AS
BEGIN
  if ((NEW.NDCL_ID <> 0) and (new.ndcl_anulado = 'N')) then
    BEGIN
    /* Registre el nuevo saldo del documento */
    INSERT INTO SALDOS_DOC_CARTERA (SDCA_TIPOREF, SDCA_IDREF, SDCA_FECHA, TERC_NIT, SDCA_RTFTE, SDCA_RTIVA, SDCA_RTICA, SDCA_ABONO, SDCA_ABRTFTE, SDCA_ABRTIVA, SDCA_ABRTICA, SDCA_DEBITO, SDCA_MONTO, SDCA_TRM)
        VALUES (41, NEW.NDCL_ID, NEW.ndcl_fecha, NEW.terc_nit, NEW.ndcl_rtftemonto, NEW.ndcl_rtivamonto, NEW.ndcl_rticamonto, 0, 0, 0, 0, 'S', NEW.ndcl_monto+NEW.ndcl_ivamonto, NEW.ndcl_trm);
    /* Registre el movimiento del proveedor */
    INSERT INTO MOVIMIENTO_CLIENTES (MVCL_ID, TERC_NIT, MVCL_TIPOREF, MVCL_IDREF, MVCL_FECHA, MVCL_VENCE, MVCL_CONC, MVCL_MONTO, MVCL_RTEFTE, MVCL_RTEIVA, MVCL_RTEICA, MVCL_DEBITO, MVCL_ABONO, MVCL_PREFREF, MVCL_NUMREF, MVCL_SUCURSAL, COBR_COD, MVCL_TRM)
      VALUES (GEN_ID(ID_MOVCLI, 1), NEW.TERC_NIT, 41, NEW.NDCL_ID, NEW.NDCL_FECHA, NEW.NDCL_VENCE, NEW.NDCL_CONC, NEW.NDCL_MONTO+NEW.NDCL_IVAMONTO, NEW.NDCL_RTFTEMONTO, NEW.NDCL_RTIVAMONTO, NEW.NDCL_RTICAMONTO, 'S', 'N', NEW.pref_pre, NEW.ndcl_numero, NEW.ndcl_sucursal, NEW.cobr_cod, NEW.ndcl_trm);
    INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
        VALUES (USER, 41, NEW.ndcl_id, 'I', NEW.pref_pre || NEW.ndcl_numero);
    END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER NOTAS_DEBITO_CLIENTES_AU FOR NOTAS_DEBITO_CLIENTES
ACTIVE AFTER UPDATE POSITION 0
AS
declare variable ABONOS INTEGER;
declare variable consec INTEGER;
BEGIN
/* borre la contabilizacion */
if (new.ndcl_anulado = 'S') then
    begin
    select enco_consec from comprobante_encabezado where enco_tiporef = 41 and enco_idref = old.ndcl_id into :consec;
    if (NOT consec is null) then
      delete from comprobante_detalle where enco_consec = :consec;
    delete from comprobante_encabezado where enco_tiporef = 41 and enco_idref = old.ndcl_id;
    INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
        VALUES (USER, 41, NEW.ndcl_id, 'A', NEW.pref_pre || NEW.ndcl_numero);
    end

/* BORRE EL REGISTRO PREVIO */
if ((old.ndcl_id <> 0) and (old.ndcl_anulado = 'N')) then
    begin
    /* Verifique si habia abonos a la nota */
    ABONOS = 0;
    select COUNT(*) FROM SALDOS_DOC_CARTERA WHERE SDCA_TIPOREF = 41 AND SDCA_IDREF = OLD.NDCL_ID AND SDCA_ABONO <> 0 INTO :ABONOS;
    if (ABONOS = 0) then
        BEGIN
        /* BORRE EL REGISTRO PREVIO */
        delete from saldos_doc_cartera where sdca_tiporef = 41 and sdca_idref = old.ndcl_id;
        delete from movimiento_clientes where (mvcl_tiporef = 41) and (mvcl_idref = old.ndcl_id);
        END
    else
        exception DOCUMENTO_CON_ABONOS;
    end
if ((new.ndcl_id <> 0) and (new.ndcl_anulado = 'N')) then
    begin
    /* Registre el nuevo saldo del documento */
    INSERT INTO SALDOS_DOC_CARTERA (SDCA_TIPOREF, SDCA_IDREF, SDCA_FECHA, TERC_NIT, SDCA_RTFTE, SDCA_RTIVA, SDCA_RTICA, SDCA_ABONO, SDCA_ABRTFTE, SDCA_ABRTIVA, SDCA_ABRTICA, SDCA_DEBITO, SDCA_MONTO, SDCA_TRM)
        VALUES (41, NEW.NDCL_ID, NEW.ndcl_fecha, NEW.terc_nit, NEW.ndcl_rtftemonto, NEW.ndcl_rtivamonto, NEW.ndcl_rticamonto, 0, 0, 0, 0, 'N', NEW.ndcl_monto+NEW.ndcl_ivamonto, NEW.ndcl_trm);
    /* Registre el movimiento del proveedor */
    INSERT INTO MOVIMIENTO_CLIENTES (MVCL_ID, TERC_NIT, MVCL_TIPOREF, MVCL_IDREF, MVCL_FECHA, MVCL_VENCE, MVCL_CONC, MVCL_MONTO, MVCL_RTEFTE, MVCL_RTEIVA, MVCL_RTEICA, MVCL_DEBITO, MVCL_ABONO, MVCL_PREFREF, MVCL_NUMREF, MVCL_SUCURSAL, COBR_COD, MVCL_TRM)
        VALUES (GEN_ID(ID_MOVCLI, 1), NEW.TERC_NIT, 41, NEW.NDCL_ID, NEW.NDCL_FECHA, NEW.NDCL_VENCE, NEW.NDCL_CONC, NEW.NDCL_MONTO+NEW.ndcl_ivamonto, NEW.NDCL_RTFTEMONTO, NEW.NDCL_RTIVAMONTO, NEW.NDCL_RTICAMONTO, 'S', 'N', NEW.pref_pre, NEW.ndcl_numero, NEW.ndcl_sucursal, NEW.cobr_cod, NEW.ndcl_trm);
    INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
        VALUES (NEW.ndcl_usuario, 41, NEW.ndcl_id, 'U', NEW.pref_pre || NEW.ndcl_numero);
    end
END
^

SET TERM ; ^

ALTER TABLE ANTICIPOS_CLIENTE
ADD ANCL_TRM T_MONTO;

SET TERM ^ ;

CREATE OR ALTER TRIGGER ANTICIPOS_CLIENTE_BI FOR ANTICIPOS_CLIENTE
ACTIVE BEFORE INSERT POSITION 0
AS
declare variable NUMERO VARCHAR(6);
declare variable AUTOM CHAR(1);
declare variable EXISTE CHAR(1);
declare variable PREGTASA CHAR(2);
BEGIN
/* Complete con ceros los campos nulos */
if (NEW.ancl_base IS NULL) then
    NEW.ancl_base = 0;
if (NEW.ancl_rtfteporc IS NULL) then
    NEW.ancl_rtivaporc = 0;
if (NEW.ancl_rtivaporc IS NULL) then
    NEW.ancl_rtivaporc = 0;
if (NEW.ancl_rticaporc IS NULL) then
    NEW.ancl_rticaporc = 0;
if (NEW.ancl_rtftemonto IS NULL) then
    NEW.ancl_rtftemonto = 0;
if (NEW.ancl_rtivamonto IS NULL) then
    NEW.ancl_rtivamonto = 0;
if (NEW.ancl_rticamonto IS NULL) then
    NEW.ancl_rticamonto = 0;
if (NEW.ancl_dtofporc IS NULL) then
    NEW.ancl_dtofporc = 0;
if (NEW.ancl_dtofmonto IS NULL) then
    NEW.ancl_dtofmonto = 0;
if ((NEW.ancl_trm IS NULL) OR (NEW.ANCL_TRM = 0)) then
    NEW.ancl_trm = 1;
EXECUTE PROCEDURE LEE_CONFIGURACION('GENERAL', 'GENERAL', 'PREGUNTAR TASA DE CAMBIO EN DOCUMENTOS DE CARTERA') returning_values (:pregtasa);
if (PREGTASA = 'SI') then
    BEGIN
    NEW.ancl_base = NEW.ancl_base * NEW.ancl_trm;
    NEW.ancl_ivamonto = NEW.ancl_ivamonto * NEW.ancl_trm;
    NEW.ancl_rtftemonto = NEW.ancl_rtftemonto * NEW.ancl_trm;
    NEW.ancl_rtivamonto = NEW.ancl_rtivamonto * NEW.ancl_trm;
    NEW.ancl_rticamonto = NEW.ancl_rticamonto * NEW.ancl_trm;
    NEW.ancl_dtofmonto = NEW.ancl_dtofmonto * NEW.ancl_trm;
    END
if (NEW.numok = 'N') then
  BEGIN
  /* Actualice el contador del prefijo */
  SELECT PREF_ACTUAL, PREF_AUTO FROM PREFIJOS
    WHERE TIDO_COD = NEW.TIDO_COD AND PREF_PRE = NEW.PREF_PRE INTO :NUMERO, :AUTOM;
  /* ACTUALICE EL NUMERO EN COMPROBANTE_ENCABEZADO  */
  if (AUTOM = 'S') then
    BEGIN
    NEW.ANCL_NUMERO = NUMERO;
    NUMERO = CAST((CAST(NUMERO AS INTEGER) + 1) AS CHAR(6));
    UPDATE PREFIJOS
      SET PREF_ACTUAL = :NUMERO
    WHERE TIDO_COD = NEW.TIDO_COD AND PREF_PRE = NEW.PREF_PRE;
    END
  ELSE
    BEGIN
    if (CAST(NUMERO AS INTEGER) = CAST(NEW.ANCL_NUMERO AS INTEGER)) then
        UPDATE PREFIJOS
          SET PREF_ACTUAL = CAST((CAST(PREF_ACTUAL AS INTEGER) + 1) AS CHAR(6))
        WHERE TIDO_COD = NEW.TIDO_COD AND PREF_PRE = NEW.PREF_PRE;
    END
  execute PROCEDURE COMPLETA_CEROS(NEW.ANCL_numero) returning_values (NEW.ANCL_numero);
  NEW.numok = 'S';
  END
/* Verifique que el numero no existe previamente */
EXISTE = 'N';
SELECT 'S' FROM ANTICIPOS_CLIENTE WHERE PREF_PRE = NEW.PREF_PRE AND ANCL_NUMERO = NEW.ANCL_NUMERO INTO :EXISTE;
if (EXISTE = 'S') then
    EXCEPTION DOCUMENTO_REGISTRADO;
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER ANTICIPOS_CLIENTE_AI FOR ANTICIPOS_CLIENTE
ACTIVE AFTER INSERT POSITION 0
AS
BEGIN
  if ((NEW.ANCL_ID <> 0) and (new.ancl_anulado = 'N')) then
    BEGIN
    INSERT INTO SALDOS_DOC_CARTERA (SDCA_TIPOREF, SDCA_IDREF, SDCA_FECHA, TERC_NIT, SDCA_RTFTE, SDCA_RTIVA, SDCA_RTICA, SDCA_ABONO, SDCA_ABRTFTE, SDCA_ABRTIVA, SDCA_ABRTICA, SDCA_DEBITO, SDCA_MONTO, SDCA_TRM)
        VALUES (45, NEW.ANCL_ID, NEW.ancl_fecha, NEW.terc_nit, (NEW.ancl_rtftemonto*-1), (NEW.ancl_rtivamonto*-1), (NEW.ancl_rticamonto*-1), 0, 0, 0, 0, 'N', ((NEW.ancl_base+NEW.ancl_ivamonto)*-1), NEW.ancl_trm);
    /* Registre el movimiento del proveedor */
    INSERT INTO MOVIMIENTO_CLIENTES (MVCL_ID, TERC_NIT, MVCL_TIPOREF, MVCL_IDREF, MVCL_FECHA, MVCL_VENCE, MVCL_CONC, MVCL_MONTO, MVCL_RTEFTE, MVCL_RTEIVA, MVCL_RTEICA, MVCL_DEBITO, MVCL_ABONO, MVCL_PREFREF, MVCL_NUMREF, MVCL_SUCURSAL, COBR_COD, MVCL_TRM)
      VALUES (GEN_ID(ID_MOVCLI, 1), NEW.TERC_NIT, 45, NEW.ANCL_ID, NEW.ANCL_FECHA, NEW.ANCL_FECHA, NEW.ANCL_CONC, NEW.ANCL_BASE+NEW.ancl_ivamonto, NEW.ANCL_RTFTEMONTO, NEW.ANCL_RTIVAMONTO, NEW.ANCL_RTICAMONTO, 'N', 'N', NEW.pref_pre, NEW.ancl_numero, NEW.ancl_sucursal, NEW.cobr_cod, NEW.ancl_trm);
    INSERT INTO AUDITORIA (AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
        VALUES (USER, 45, NEW.ancl_id, 'I', NEW.pref_pre || NEW.ancl_numero);
    END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER ANTICIPOS_CLIENTE_AU FOR ANTICIPOS_CLIENTE
ACTIVE AFTER UPDATE POSITION 0
AS
declare variable ABONOS char(1);
declare variable consec INTEGER;
BEGIN
/* borre el viejo y grabe el nuevo */
if ((OLD.ANCL_anulado = 'N') and (old.ancl_id <> 0)) then
    begin
    /* Verifique si habia abonos a la nota */
    ABONOS = 'N';
    select 'S' FROM SALDOS_DOC_CARTERA WHERE SDCA_TIPOREF = 45 AND SDCA_IDREF = OLD.ANCL_ID AND SDCA_ABONO <> 0 INTO :ABONOS;
    if (ABONOS = 'N') then
        BEGIN
        /* BORRE EL REGISTRO PREVIO */
        delete from saldos_doc_cartera where sdca_tiporef = 45 and sdca_idref = old.ancl_id;
        delete from movimiento_CLIENTES where (mvcl_tiporef = 45) and (mvcl_idref = old.ancl_id);
        if (new.ancl_anulado = 'S') then
            begin
            select enco_consec from comprobante_encabezado where enco_tiporef = 45 and enco_idref = old.ancl_id into :consec;
            if (NOT consec is null) then
             delete from comprobante_detalle where enco_consec = :consec;
            delete from comprobante_encabezado where enco_tiporef = 45 and enco_idref = old.ancl_id;
            INSERT INTO AUDITORIA (AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
                VALUES (USER, 45, NEW.ancl_id, 'A', NEW.pref_pre || NEW.ancl_numero);
            end
        END
    else
        exception DOCUMENTO_CON_ABONOS;
    end
if ((new.ancl_anulado = 'N') and (new.ancl_id <> 0)) then
    begin
    /* Registre el nuevo saldo del documento */
    INSERT INTO SALDOS_DOC_CARTERA (SDCA_TIPOREF, SDCA_IDREF, SDCA_FECHA, TERC_NIT, SDCA_RTFTE, SDCA_RTIVA, SDCA_RTICA, SDCA_ABONO, SDCA_ABRTFTE, SDCA_ABRTIVA, SDCA_ABRTICA, SDCA_DEBITO, SDCA_MONTO, SDCA_TRM)
        VALUES (45, NEW.ANCL_ID, NEW.ancl_fecha, NEW.terc_nit, (NEW.ancl_rtftemonto*-1), (NEW.ancl_rtivamonto*-1), (NEW.ancl_rticamonto*-1), 0, 0, 0, 0, 'N', ((NEW.ancl_BASE+NEW.ancl_ivamonto)*-1), NEW.ancl_trm);
    /* Registre el movimiento del proveedor */
    INSERT INTO MOVIMIENTO_CLIENTES (MVCL_ID, TERC_NIT, MVCL_TIPOREF, MVCL_IDREF, MVCL_FECHA, MVCL_VENCE, MVCL_CONC, MVCL_MONTO, MVCL_RTEFTE, MVCL_RTEIVA, MVCL_RTEICA, MVCL_DEBITO, MVCL_ABONO, MVCL_PREFREF, MVCL_NUMREF, MVCL_SUCURSAL, COBR_COD, MVCL_TRM)
        VALUES (GEN_ID(ID_MOVCLI, 1), NEW.TERC_NIT, 45, NEW.ANCL_ID, NEW.ANCL_FECHA, NEW.ANCL_FECHA, NEW.ANCL_CONC, NEW.ANCL_BASE+NEW.ancl_ivamonto, NEW.ANCL_RTFTEMONTO, NEW.ANCL_RTIVAMONTO, NEW.ANCL_RTICAMONTO, 'N', 'N', NEW.pref_pre, NEW.ancl_numero, NEW.ancl_sucursal, NEW.cobr_cod, NEW.ancl_trm);
    INSERT INTO AUDITORIA (AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
        VALUES (USER, 45, NEW.ancl_id, 'U', NEW.pref_pre || NEW.ancl_numero);
    end
END
^

SET TERM ; ^

ALTER TABLE DEVOLUCION_CHEQUES
ADD DVCH_TRM T_MONTO;

SET TERM ^ ;

CREATE OR ALTER TRIGGER DEVOLUCION_CHEQUES_BI FOR DEVOLUCION_CHEQUES
ACTIVE BEFORE INSERT POSITION 0
AS
declare variable NUMERO VARCHAR(6);
declare variable AUTOM CHAR(1);
declare variable EXISTE CHAR(1);
declare variable POR_CTA CHAR(2);
declare variable CODCOBR INTEGER;
declare variable CODVEND INTEGER;
declare variable NUMROWS INTEGER;
declare variable PREGTASA CHAR(2);
BEGIN
if ((NEW.dvch_trm IS NULL) OR (NEW.DVCH_TRM = 0)) then
    NEW.dvch_trm = 1;
EXECUTE PROCEDURE LEE_CONFIGURACION('GENERAL', 'GENERAL', 'PREGUNTAR TASA DE CAMBIO EN DOCUMENTOS DE CARTERA') returning_values (:pregtasa);
if (PREGTASA = 'SI') then
    NEW.dvch_monto = NEW.dvch_monto * NEW.dvch_trm;

if (NEW.numok = 'N') then
  BEGIN
  /* Actualice el contador del prefijo */
  EXECUTE PROCEDURE LEE_configuracion('BANCOS', 'DEVOLUCIONES', 'CONSECUTIVOS POR CUENTA') returning_values(:POR_CTA);
  if (por_cta = 'SI') then
    BEGIN
    SELECT PRBA_NUMERO, PRBA_AUTO FROM PREFIJOS_BANCOS
        WHERE TIDO_COD = 77 AND CUBA_COD = NEW.CUBA_COD AND PRBA_PREF = NEW.PRBA_PREF INTO :NUMERO, :AUTOM;
    if (AUTOM = 'S') then
        BEGIN
        NEW.DVCH_NUMDOC = NUMERO;
        NUMERO = CAST((CAST(NUMERO AS INTEGER) + 1) AS CHAR(6));
        UPDATE PREFIJOS_BANCOS
            SET PRBA_NUMERO = :NUMERO
            WHERE TIDO_COD = 77 AND CUBA_COD = NEW.CUBA_COD AND PRBA_PREF = NEW.PRBA_PREF;
        END
    ELSE
        BEGIN
        if (CAST(NUMERO AS INTEGER) = CAST(NEW.DVCH_NUMDOC AS INTEGER)) then
            UPDATE PREFIJOS_BANCOS
                SET PRBA_NUMERO = CAST((CAST(PRBA_NUMERO AS INTEGER) + 1) AS CHAR(6))
                WHERE TIDO_COD = 77 AND CUBA_COD = NEW.CUBA_COD AND PRBA_PREF = NEW.PRBA_PREF;
        END
    END
  ELSE
    BEGIN
    SELECT PREF_ACTUAL, PREF_AUTO FROM PREFIJOS
        WHERE TIDO_COD = 77 AND PREF_PRE = NEW.PRBA_PREF INTO :NUMERO, :AUTOM;
    if (AUTOM = 'S') then
        BEGIN
        NEW.DVCH_NUMDOC = NUMERO;
        NUMERO = CAST((CAST(NUMERO AS INTEGER) + 1) AS CHAR(6));
        UPDATE PREFIJOS
            SET PREF_ACTUAL = :NUMERO
            WHERE TIDO_COD = 77 AND PREF_PRE = NEW.PRBA_PREF;
        END
    ELSE
        BEGIN
        if (CAST(NUMERO AS INTEGER) = CAST(NEW.DVCH_NUMDOC AS INTEGER)) then
            UPDATE PREFIJOS
                SET PREF_ACTUAL = CAST((CAST(PREF_ACTUAL AS INTEGER) + 1) AS CHAR(6))
                WHERE TIDO_COD = 77 AND PREF_PRE = NEW.PRBA_PREF;
        END
    END
  /* ACTUALICE EL NUMERO EN COMPROBANTE_ENCABEZADO */
  EXECUTE PROCEDURE COMPLETA_CEROS (NEW.DVCH_NUMDOC) returning_values (NEW.DVCH_NUMDOC);
  NEW.numok = 'S';
  END
/* Verifique que el numero no existe previamente */
EXISTE = 'N';
if (POR_CTA = 'SI') then
    SELECT 'S' FROM DEVOLUCION_CHEQUES
        WHERE CUBA_COD = NEW.CUBA_COD AND PRBA_PREF = NEW.PRBA_PREF AND DVCH_NUMDOC = NEW.DVCH_NUMDOC INTO :EXISTE;
else
    SELECT 'S' FROM DEVOLUCION_CHEQUES
        WHERE PRBA_PREF = NEW.PRBA_PREF AND DVCH_NUMDOC = NEW.DVCH_NUMDOC INTO :EXISTE;
if (EXISTE = 'S') then
    EXCEPTION DOCUMENTO_REGISTRADO;
/* SI ES A CARTERA AGREGE LOS DATOS DE VEND Y COBR */
if (NEW.dvch_cartera = 'S') then
    BEGIN
    select COBR_COD, VEND_COD FROM CLIENTES WHERE TERC_NIT = NEW.terc_nit INTO :CODCOBR, CODVEND;
    if (NEW.cobr_cod IS NULL) then
        NEW.cobr_cod = :CODCOBR;
    if (NEW.vend_cod IS NULL) then
        NEW.vend_cod = :CODVEND;
    END
/* NO PERMITA UNA FORMA DE PAGO REPETIDA */
SELECT COUNT(*) FROM documentos_pago_caja WHERE caja_id = NEW.caja_id AND fopa_id = 2 AND dpca_banco = NEW.dvch_banco AND
    dpca_cuenta = NEW.dvch_cuenta AND dpca_numero = NEW.dvch_nroch AND dpca_tiposal = 0 and dpca_idsal = 0
    INTO :NUMROWS;
if (numrows > 0) then
    exception documento_pago_salido;
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER DEVOLUCION_CHEQUES_AI FOR DEVOLUCION_CHEQUES
ACTIVE AFTER INSERT POSITION 0
as
begin
if ((NEW.dvch_id <> 0) and (new.dvch_anulado = 'N')) then
  BEGIN
  /* Actualice el movimiento del banco */
  INSERT INTO MOVIMIENTO_BANCO
    (MOBA_ID, CUBA_COD, MOBA_TIPODOC, MOBA_PREF, MOBA_NUMERO, MOBA_FECHA, MOBA_CONCEPTO, MOBA_TOTAL, MOBA_DB, MOBA_IDREF, MOBA_TIPOREF)
    VALUES(GEN_ID(ID_MOVBANCO,1), NEW.cuba_cod, 77, NEW.PRBA_PREF, NEW.dvch_numdoc, NEW.dvch_fecha, NEW.dvch_conc, NEW.dvch_monto, 'N', new.dvch_id, 77);
  /* ACTUALICE EL DEVUELTO DE LA CONSIGNACION */
  UPDATE CONSIGNA_DETALLE SET CODE_DEVUELTO = 'S'
    WHERE CODE_BANCO = NEW.dvch_banco AND CODE_CUENTA = NEW.dvch_cuenta AND CODE_NUMERO = NEW.dvch_nroch;
  /* ACTUALICE LA CARTERA O LA CAJA */
  if (NEW.dvch_cartera = 'S') then
    BEGIN
    INSERT INTO SALDOS_DOC_CARTERA (SDCA_TIPOREF, SDCA_IDREF, SDCA_FECHA, TERC_NIT, SDCA_RTFTE, SDCA_RTIVA, SDCA_RTICA, SDCA_ABONO, SDCA_ABRTFTE, SDCA_ABRTIVA, SDCA_ABRTICA, SDCA_DEBITO, SDCA_MONTO, SDCA_TRM)
        VALUES (77, NEW.dvch_id, NEW.dvch_fecha, NEW.terc_nit, 0, 0, 0, 0, 0, 0, 0, 'S', NEW.dvch_monto, NEW.dvch_trm);
    INSERT INTO  MOVIMIENTO_CLIENTES
        (MVCL_ID, TERC_NIT, MVCL_TIPOREF, MVCL_IDREF, MVCL_PREFREF, MVCL_NUMREF, MVCL_FECHA, MVCL_VENCE, MVCL_CONC, MVCL_MONTO, MVCL_RTEFTE, MVCL_RTEIVA, MVCL_RTEICA, MVCL_ABONO, MVCL_DEBITO, MVCL_SUCURSAL, COBR_COD, MVCL_TRM)
        VALUES (GEN_ID(ID_MOVCLI, 1), NEW.TERC_NIT, 77, NEW.DVCH_ID, NEW.PRBA_PREF, NEW.DVCH_NUMDOC, NEW.DVCH_FECHA, NEW.DVCH_FECHA, NEW.DVCH_CONC, NEW.DVCH_MONTO, 0, 0, 0, 'N', 'S', new.dvch_sucursal, NEW.cobr_cod, NEW.dvch_trm);
    END
  else
    BEGIN
    INSERT INTO MOVIMIENTO_CAJA
        (MOCA_ID, CAJA_ID, MOCA_TIPOREF, MOCA_PREFREF, MOCA_NUMREF, MOCA_FECHA, MOCA_CONC, MOCA_DEBITOS, MOCA_CREDITOS, MOCA_DB, MOCA_IDREF)
        VALUES(GEN_ID(ID_MOVCAJA,1), NEW.CAJA_ID, 77, NEW.PRBA_PREF, NEW.DVCH_NUMDOC, NEW.DVCH_FECHA, NEW.DVCH_CONC, NEW.DVCH_MONTO, 0, 'S', NEW.DVCH_ID);
    INSERT INTO DOCUMENTOS_PAGO_CAJA (DPCA_ID, FOPA_ID, CAJA_ID, DPCA_BANCO, DPCA_CUENTA, DPCA_NUMERO, DPCA_FECHA, DPCA_MONTO, DPCA_TIPOENT, DPCA_IDENT, DPCA_TIPOSAL, DPCA_IDSAL)
        VALUES (GEN_ID(ID_DOCPAGOCAJA, 1), 2, NEW.caja_id, NEW.dvch_banco, NEW.dvch_cuenta, NEW.dvch_nroch, NEW.dvch_fecch, NEW.dvch_monto, 77, NEW.dvch_id, 0, 0);
    END
  INSERT INTO AUDITORIA (AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD, AUDI_TICO)
    VALUES (USER, 77, new.dvch_id, 'I', NEW.prba_pref || NEW.dvch_numdoc, NEW.cuba_cod);
  END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER DEVOLUCION_CHEQUES_AU FOR DEVOLUCION_CHEQUES
ACTIVE AFTER UPDATE POSITION 0
AS
declare variable consec INTEGER;
BEGIN
if (new.dvch_anulado = 'S') then
    begin
    select enco_consec from comprobante_encabezado where enco_tiporef = 77 and enco_idref = old.dvch_id into :consec;
    if (NOT consec is null) then
      delete from comprobante_detalle where enco_consec = :consec;
    delete from comprobante_encabezado where enco_tiporef = 77 and enco_idref = old.dvch_id;
    INSERT INTO AUDITORIA (AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD, AUDI_TICO)
        VALUES (USER, 77, new.dvch_id, 'A', NEW.prba_pref || NEW.dvch_numdoc, NEW.cuba_cod);
    end
/* BORRE LO VIEJO Y GRABE LO NUEVO */
if ((OLD.dvch_anulado = 'N') AND (OLD.dvch_id <> 0)) then
    BEGIN
    /* ACTUALICE LA CARTERA O LA CAJA */
    if (OLD.dvch_cartera = 'S') then
        BEGIN
        delete from saldos_doc_cartera where sdca_tiporef = 77 and sdca_idref = old.dvch_id;
        DELETE FROM MOVIMIENTO_CLIENTES WHERE MVCL_TIPOREF = 77 AND MVCL_IDREF = OLD.dvch_id;
        END
    else
        BEGIN
        DELETE FROM MOVIMIENTO_CAJA WHERE MOCA_TIPOREF = 77 AND MOCA_IDREF = OLD.DVCH_ID;
        DELETE FROM documentos_pago_caja WHERE DPCA_TIPOENT = 77 AND DPCA_IDENT = OLD.dvch_id;
        END
    UPDATE MOVIMIENTO_BANCO
        SET MOBA_CONCEPTO = 'ANULADO', MOBA_TOTAL = 0
        WHERE MOBA_TIPODOC = 77 AND MOBA_IDREF = OLD.dvch_id;
    /* ACTUALICE EL DEVUELTO DE LA CONSIGNACION */
    UPDATE CONSIGNA_DETALLE SET CODE_DEVUELTO = 'N'
        WHERE CODE_BANCO = OLD.dvch_banco AND CODE_CUENTA = OLD.dvch_cuenta AND CODE_NUMERO = OLD.dvch_nroch;
    END
if ((NEW.dvch_anulado = 'N') AND (NEW.dvch_id <> 0)) then
    BEGIN
    INSERT INTO MOVIMIENTO_BANCO
        (MOBA_ID, CUBA_COD, MOBA_TIPODOC, MOBA_PREF, MOBA_NUMERO, MOBA_FECHA, MOBA_CONCEPTO, MOBA_TOTAL, MOBA_DB, MOBA_IDREF, MOBA_TIPOREF)
        VALUES(GEN_ID(ID_MOVBANCO,1), NEW.cuba_cod, 77, NEW.PRBA_PREF, NEW.dvch_numdoc, NEW.dvch_fecha, NEW.dvch_conc, NEW.dvch_monto, 'N', new.dvch_id, 77);
    /* ACTUALICE EL DEVUELTO DE LA CONSIGNACION */
    UPDATE CONSIGNA_DETALLE SET CODE_DEVUELTO = 'S'
        WHERE CODE_BANCO = NEW.dvch_banco AND CODE_CUENTA = NEW.dvch_cuenta AND CODE_NUMERO = NEW.dvch_nroch;
    /* ACTUALICE LA CARTERA O LA CAJA */
    if (NEW.dvch_cartera = 'S') then
        BEGIN
        INSERT INTO SALDOS_DOC_CARTERA (SDCA_TIPOREF, SDCA_IDREF, SDCA_FECHA, TERC_NIT, SDCA_RTFTE, SDCA_RTIVA, SDCA_RTICA, SDCA_ABONO, SDCA_ABRTFTE, SDCA_ABRTIVA, SDCA_ABRTICA, SDCA_DEBITO, SDCA_MONTO, SDCA_TRM)
            VALUES (77, NEW.dvch_id, NEW.dvch_fecha, NEW.terc_nit, 0, 0, 0, 0, 0, 0, 0, 'S', NEW.dvch_monto, NEW.dvch_trm);
        INSERT INTO  MOVIMIENTO_CLIENTES
            (MVCL_ID, TERC_NIT, MVCL_TIPOREF, MVCL_IDREF, MVCL_PREFREF, MVCL_NUMREF, MVCL_FECHA, MVCL_VENCE, MVCL_CONC, MVCL_MONTO, MVCL_RTEFTE, MVCL_RTEIVA, MVCL_RTEICA, MVCL_ABONO, MVCL_DEBITO, MVCL_SUCURSAL, COBR_COD, MVCL_TRM)
            VALUES (GEN_ID(ID_MOVCLI, 1), NEW.TERC_NIT, 77, NEW.DVCH_ID, NEW.PRBA_PREF, NEW.DVCH_NUMDOC, NEW.DVCH_FECHA, NEW.DVCH_FECHA, NEW.DVCH_CONC, NEW.DVCH_MONTO, 0, 0, 0, 'N', 'S', new.dvch_sucursal, NEW.cobr_cod, NEW.dvch_trm);
        END
    else
        BEGIN
        INSERT INTO MOVIMIENTO_CAJA
            (MOCA_ID, CAJA_ID, MOCA_TIPOREF, MOCA_PREFREF, MOCA_NUMREF, MOCA_FECHA, MOCA_CONC, MOCA_DEBITOS, MOCA_CREDITOS, MOCA_DB, MOCA_IDREF)
            VALUES(GEN_ID(ID_MOVCAJA,1), NEW.CAJA_ID, 77, NEW.PRBA_PREF, NEW.DVCH_NUMDOC, NEW.DVCH_FECHA, NEW.DVCH_CONC, NEW.DVCH_MONTO, 0, 'S', NEW.DVCH_ID);
        INSERT INTO DOCUMENTOS_PAGO_CAJA (DPCA_ID, FOPA_ID, CAJA_ID, DPCA_BANCO, DPCA_CUENTA, DPCA_NUMERO, DPCA_FECHA, DPCA_MONTO, DPCA_TIPOENT, DPCA_IDENT, DPCA_TIPOSAL, DPCA_IDSAL)
            VALUES (GEN_ID(ID_DOCPAGOCAJA, 1), 2, NEW.caja_id, NEW.dvch_banco, NEW.dvch_cuenta, NEW.dvch_nroch, NEW.dvch_fecch, NEW.dvch_monto, 77, NEW.dvch_id, 0, 0);
        END
    INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD, AUDI_TICO)
        VALUES (USER, 77, NEW.dvch_id, 'U', NEW.prba_pref || NEW.dvch_numdoc, NEW.cuba_cod);
    END
END
^

SET TERM ; ^

ALTER TABLE RECIBOS_CAJA
ADD RECA_TRM T_MONTO;

SET TERM ^ ;

ALTER PROCEDURE BUSCAR_DEVOLCHEQ(
    CUENTA INTEGER)
RETURNS (
    ID INTEGER,
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    NOMTERC VARCHAR(60),
    MONTO NUMERIC(18,2),
    CODCTA VARCHAR(30),
    CHNUMERO VARCHAR(20),
    CHCUENTA VARCHAR(20),
    CHBANCO VARCHAR(2),
    ANULAR CHAR(1),
    SALDO NUMERIC(18,2))
AS
begin /*$$IBE$$ 
for select dvch_id, prba_pref, dvch_numdoc, dvch_fecha, dvch_nomterc, dvch_monto, cuba_codcta,
    dvch_nroch, dvch_cuenta, dvch_banco, dvch_anulado
    from devolucion_cheques ch, cuentas_banco c where ch.cuba_cod = c.cuba_cod and ch.cuba_cod = :CUENTA
    INTO :ID, :prefijo, :numero, :fecha, :nomterc, :monto, :codcta, :chnumero, :chcuenta, :chbanco, :anular
    do
    begin
    execute procedure saldo_doc_cartera(77, :id,  '2099-12-31') returning_values (:SALDO);
    suspend;
    end
 $$IBE$$*/ SUSPEND;
end
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE BUSCA_ID_DOC_CARTERA(
    TIPO INTEGER,
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(6),
    NIT VARCHAR(20),
    FECHA DATE)
RETURNS (
    ID INTEGER,
    SALDO NUMERIC(18,2),
    RTFTE NUMERIC(18,2),
    RTIVA NUMERIC(18,2),
    RTICA NUMERIC(18,2),
    DTOF NUMERIC(18,2),
    ERROR INTEGER)
AS
declare variable vernit varchar(20);
declare variable fec date;
declare variable fecdto date;
declare variable desc_rtes char(2);
declare variable dtoapl numeric(18,2);
declare variable AUTORET VARCHAR(10);
declare variable FAUTORET DATE;
declare variable FECDOC DATE;
BEGIN /*$$IBE$$ 
ID = 0;
ERROR = 0;
EXECUTE PROCEDURE COMPLETA_CEROS(NUMERO) returning_values (NUMERO);
if (TIPO = 41) then
    SELECT NDCL_ID, TERC_NIT, NDCL_FECHA, NDCL_DTOFMONTO, NDCL_FECHADTO FROM NOTAS_DEBITO_CLIENTES WHERE PREF_PRE = :PREFIJO AND NDCL_NUMERO = :NUMERO INTO :ID, :VERNIT, :FEC, :DTOF, :FECDTO;
if (TIPO = 42) then
    SELECT NCCL_ID, TERC_NIT, NCCL_FECHA, 0, NCCL_FECHA FROM NOTAS_CREDITO_CLIENTES WHERE PREF_PRE = :PREFIJO AND NCCL_NUMERO = :NUMERO INTO :ID, :VERNIT, :FEC, :DTOF, :FECDTO;
if (TIPO = 45) then
    SELECT ANCL_ID, TERC_NIT, ANCL_FECHA, ANCL_DTOFMONTO, ANCL_DTOFECHA FROM ANTICIPOS_CLIENTE WHERE PREF_PRE = :PREFIJO AND ANCL_NUMERO = :NUMERO INTO :ID, :VERNIT, :FEC, :DTOF, :FECDTO;
if (TIPO = 31) then
    SELECT FACT_ID, TERC_NIT, FACT_FECHA, FACT_DTOFMONTO, FACT_DTOFFECHA FROM FACTURAS WHERE PREF_PRE = :PREFIJO AND FACT_NUMERO = :NUMERO INTO :ID, :VERNIT, :FEC, :DTOF, :FECDTO;
if (TIPO = 33) then
    SELECT DEVT_ID, TERC_NIT, DEVT_FECHA, 0, DEVT_FECHA FROM devoluciones_ventas WHERE PREF_PRE = :PREFIJO AND DEVT_NUMERO = :NUMERO INTO :ID, :VERNIT, :FEC, :DTOF, :FECDTO;
if (TIPO = 77) then
    SELECT DVCH_ID, TERC_NIT, DVCH_FECHA, 0, DVCH_FECHA FROM devolucion_cheques WHERE PRBA_PREf = :PREFIJO AND DVCH_NUMDOC = :NUMERO INTO :ID, :VERNIT, :FEC, :DTOF, :FECDTO;
if (FECHA > FECDTO) then
    DTOF = 0;
if (DTOF IS NULL) then
    DTOF = 0;
if (DTOF <> 0) then
    BEGIN
    SELECT SUM(RCDE_DTOF) FROM RECIBOS_CAJA_DETALLE WHERE RCDE_IDDOC = :ID AND RCDE_TIPODOC = :TIPO INTO :DTOAPL;
    if (DTOAPL IS NULL) then
        DTOAPL = 0;
    DTOF = DTOF - DTOAPL;
    END
IF (ID = 0) then
    ERROR = 1;
ELSE
  BEGIN
   $$IBE$$*/ /* VERIFIQUE EL NIT */ /*$$IBE$$ 
  if (VERNIT <> NIT) then
    ERROR = 2;
  else
    BEGIN
     $$IBE$$*/ /* VERIFIQUE QUE LA FECHA DEL ABONO SEA POSTERIOR O IGUAL AL DOC */ /*$$IBE$$ 
    if (FEC > FECHA) then
        ERROR = 3;
    else
        begin
         $$IBE$$*/ /* CALCULE LOS SALDOS */ /*$$IBE$$ 
        SELECT SUM(SDCA_MONTO - SDCA_ABONO), SUM(SDCA_RTFTE - SDCA_ABRTFTE), SUM(SDCA_RTIVA - SDCA_ABRTIVA), SUM(SDCA_RTICA - SDCA_ABRTICA)
            FROM SALDOS_DOC_CARTERA WHERE SDCA_TIPOREF = :TIPO AND SDCA_IDREF = :ID
            INTO :SALDO, :RTFTE, :RTIVA, :RTICA;
        if ((TIPO = 31) or (TIPO = 41) or (TIPO = 77)) then
            begin
            if ((RTFTE IS NULL) or (RTFTE < 0))  then
                RTFTE = 0;
            if ((RTIVA IS NULL) or (RTIVA < 0 ))  then
                RTIVA = 0;
            if ((RTICA IS NULL) or (RTICA < 0))  then
                RTICA = 0;
            end
        if ((TIPO = 33) or (TIPO = 42) or (TIPO = 45)) then
            begin
            if ((RTFTE IS NULL) or (RTFTE > 0))  then
                RTFTE = 0;
            if ((RTIVA IS NULL) or (RTIVA > 0 ))  then
                RTIVA = 0;
            if ((RTICA IS NULL) or (RTICA > 0))  then
                RTICA = 0;
            end
         $$IBE$$*/ /* TRAIGA EL SALDO NETO */ /*$$IBE$$ 
        EXECUTE PROCEDURE SALDO_DOC_CARTERA(TIPO, ID, FECHA) returning_values (SALDO);
        if (SALDO = 0) then
            ERROR = 4;
        ELSE
            BEGIN
            EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'FECHA AUTORETENEDOR NO DESCONTAR RETENCIONES DEL SALDO PERO SI CONTABILIZARLAS') returning_values (AUTORET);
            if (AUTORET <> '') then
                FAUTORET = CAST(AUTORET AS DATE);
            else
                FAUTORET = '9999/12/31';
             $$IBE$$*/ /* BUSQUE LA FECHA DEL DOCUMENTO */ /*$$IBE$$ 
            SELECT MIN(SDCA_FECHA) FROM SALDOS_DOC_CARTERA WHERE (SDCA_TIPOREF = :TIPO) AND (SDCA_IDREF = :ID) AND (SDCA_MONTO <> 0) INTO :FECDOC;
            if (FAUTORET <= FECDOC) then
                BEGIN
                RTFTE = 0;
                RTIVA = 0;
                RTICA = 0;
                END
             $$IBE$$*/ /* RESTE LAS RETENCIONES YA QUE SE SUGERIRAN */ /*$$IBE$$ 
            EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'DESCONTAR RETENCIONES POR CAUSACION') returning_values (DESC_RTES);
            if (DESC_RTES = 'NO') then
                SALDO = SALDO - RTFTE - RTIVA - RTICA;
            SALDO = SALDO - DTOF;
            END
        end
    END
  end
SUSPEND;
 $$IBE$$*/ SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE CHEQUEO_SALDOS_DOC_CARTERA(
    CLIINI VARCHAR(20),
    CLIFIN VARCHAR(20))
RETURNS (
    ERROR VARCHAR(60),
    TIPO INTEGER,
    ID INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(6))
AS
declare variable FECHA DATE;
declare variable NIT VARCHAR(20);
declare variable RTFTE NUMERIC(18, 2);
declare variable RTIVA NUMERIC(18, 2);
declare variable RTICA NUMERIC(18, 2);
declare variable MONTO NUMERIC(18, 2);
declare variable EXISTE CHAR(1);
declare variable IDR INTEGER;
declare variable RECAID INTEGER;
BEGIN /*$$IBE$$ 
DELETE FROM SALDOS_DOC_CARTERA WHERE TERC_NIT >= :CLIINI AND TERC_NIT <= :CLIFIN;
DELETE FROM ANTICIPOS_CLIENTE WHERE RECA_ID = 0;

FOR SELECT FACT_ID, FACT_FECHA, TERC_NIT, FACT_RTFTEMONTO, FACT_rtivamonto, FACT_rticamonto, FACT_TOTAL
    FROM FACTURAS WHERE FACT_ID <> 0 and fact_anulado = 'N' AND TERC_NIT >= :CLIINI AND TERC_NIT <= :CLIFIN
    ORDER BY FACT_FECHA
    INTO :ID, :FECHA, :nit,  :RTFTE, :RTIVA, :RTICA, :MONTO
    DO
    INSERT INTO SALDOS_DOC_CARTERA (SDCA_TIPOREF, SDCA_IDREF, SDCA_FECHA, TERC_NIT, SDCA_RTFTE, SDCA_RTIVA, SDCA_RTICA, SDCA_ABONO, SDCA_ABRTFTE, SDCA_ABRTIVA, SDCA_ABRTICA, SDCA_DEBITO, SDCA_MONTO)
        VALUES (31, :ID, :fecha, :nit, :rtfte, :rtiva, :rtica, 0, 0, 0, 0, 'S', :MONTO);

FOR SELECT NDCL_ID, NDCL_FECHA, TERC_NIT, NDCL_RTFTEMONTO, NDCL_rtivamonto, NDCL_rticamonto, ndcl_monto+ndcl_ivamonto
    FROM NOTAS_DEBITO_CLIENTES WHERE NDCL_ID <> 0 and NDCL_anulado = 'N'  AND TERC_NIT >= :CLIINI AND TERC_NIT <= :CLIFIN
    ORDER BY NDCL_FECHA
    INTO :ID, :FECHA, :nit,  :RTFTE, :RTIVA, :RTICA, :MONTO
    DO
    INSERT INTO SALDOS_DOC_CARTERA (SDCA_TIPOREF, SDCA_IDREF, SDCA_FECHA, TERC_NIT, SDCA_RTFTE, SDCA_RTIVA, SDCA_RTICA, SDCA_ABONO, SDCA_ABRTFTE, SDCA_ABRTIVA, SDCA_ABRTICA, SDCA_DEBITO, SDCA_MONTO)
        VALUES (41, :ID, :fecha, :nit, :rtfte, :rtiva, :rtica, 0, 0, 0, 0, 'S', :MONTO);

FOR SELECT DVCH_ID, DVCH_FECHA, TERC_NIT, 0, 0, 0, DVCH_MONTO
    FROM devolucion_cheques WHERE DVCH_ID <> 0 and DVCH_anulado = 'N' AND DVCH_CARTERA = 'S'  AND TERC_NIT >= :CLIINI AND TERC_NIT <= :CLIFIN
    ORDER BY DVCH_FECHA
    INTO :ID, :FECHA, :nit,  :RTFTE, :RTIVA, :RTICA, :MONTO
    DO
    INSERT INTO SALDOS_DOC_CARTERA (SDCA_TIPOREF, SDCA_IDREF, SDCA_FECHA, TERC_NIT, SDCA_RTFTE, SDCA_RTIVA, SDCA_RTICA, SDCA_ABONO, SDCA_ABRTFTE, SDCA_ABRTIVA, SDCA_ABRTICA, SDCA_DEBITO, SDCA_MONTO)
        VALUES (77, :ID, :fecha, :nit, :rtfte, :rtiva, :rtica, 0, 0, 0, 0, 'S', :MONTO);

FOR SELECT DEVT_ID, DEVT_FECHA, TERC_NIT, DEVT_RTFTEMONTO, DEVT_rtivamonto, DEVT_rticamonto, devt_total
    FROM DEVOLUCIONES_VENTAS WHERE DEVT_ID <> 0 and DEVT_anulado = 'N' AND TERC_NIT >= :CLIINI AND TERC_NIT <= :CLIFIN
    ORDER BY DEVT_FECHA
    INTO :ID, :FECHA, :nit,  :RTFTE, :RTIVA, :RTICA, :MONTO
    DO
    INSERT INTO SALDOS_DOC_CARTERA (SDCA_TIPOREF, SDCA_IDREF, SDCA_FECHA, TERC_NIT, SDCA_RTFTE, SDCA_RTIVA, SDCA_RTICA, SDCA_ABONO, SDCA_ABRTFTE, SDCA_ABRTIVA, SDCA_ABRTICA, SDCA_DEBITO, SDCA_MONTO)
        VALUES (33, :ID, :fecha, :nit, :rtfte*-1, :rtiva*-1, :rtica*-1, 0, 0, 0, 0, 'N', :MONTO * -1);

FOR SELECT NCCL_ID, NCCL_FECHA, TERC_NIT, NCCL_RTFTEMONTO, NCCL_rtivamonto, NCCL_rticamonto, nccl_monto+nccl_ivamonto
    FROM NOTAS_CREDITO_CLIENTES WHERE NCCL_ID <> 0 and NCCL_anulado = 'N' AND TERC_NIT >= :CLIINI AND TERC_NIT <= :CLIFIN
    ORDER BY NCCL_FECHA
    INTO :ID, :FECHA, :nit,  :RTFTE, :RTIVA, :RTICA, :MONTO
    DO
    INSERT INTO SALDOS_DOC_CARTERA (SDCA_TIPOREF, SDCA_IDREF, SDCA_FECHA, TERC_NIT, SDCA_RTFTE, SDCA_RTIVA, SDCA_RTICA, SDCA_ABONO, SDCA_ABRTFTE, SDCA_ABRTIVA, SDCA_ABRTICA, SDCA_DEBITO, SDCA_MONTO)
        VALUES (42, :ID, :fecha, :nit, :rtfte*-1, :rtiva*-1, :rtica*-1, 0, 0, 0, 0, 'N', :MONTO * -1);

FOR SELECT ANCL_ID, ANCL_FECHA, TERC_NIT, ANCL_RTFTEMONTO, ANCL_rtivamonto, ANCL_rticamonto, ancl_base+ancl_ivamonto
    FROM ANTICIPOS_CLIENTE WHERE ANCL_ID <> 0 and ANCL_anulado = 'N' AND TERC_NIT >= :CLIINI AND TERC_NIT <= :CLIFIN
    ORDER BY ANCL_FECHA
    INTO :ID, :FECHA, :nit,  :RTFTE, :RTIVA, :RTICA, :MONTO
    DO
    INSERT INTO SALDOS_DOC_CARTERA (SDCA_TIPOREF, SDCA_IDREF, SDCA_FECHA, TERC_NIT, SDCA_RTFTE, SDCA_RTIVA, SDCA_RTICA, SDCA_ABONO, SDCA_ABRTFTE, SDCA_ABRTIVA, SDCA_ABRTICA, SDCA_DEBITO, SDCA_MONTO)
        VALUES (45, :ID, :fecha, :nit, :rtfte*-1, :rtiva*-1, :rtica*-1, 0, 0, 0, 0, 'N', :MONTO * -1);

FOR SELECT ACDE_TIPODOC, ACDE_IDDOC, APCL_FECHA, TERC_NIT, ACDE_APLICADO, ACDE_RTFTE, ACDE_RTIVA, ACDE_RTICA
    FROM APLICACION_CLIENTE_DETALLE D, APLICACION_CLIENTE A
    WHERE A.APCL_ID = D.apcl_id AND A.APCL_ID <> 0 AND APCL_ANULADO = 'N' AND TERC_NIT >= :CLIINI AND TERC_NIT <= :CLIFIN
    ORDER BY APCL_FECHA
    INTO :TIPO, :ID, :FECHA, :NIT, :MONTO, :RTFTE, :RTIVA, :RTICA
    DO
    BEGIN
    EXISTE = 'N';
    select 'S' from saldos_doc_cartera where sdca_tiporef = :TIPO and sdca_idref = :ID and sdca_fecha = :fecha into :EXISTE;
    if (Existe = 'S') then
        begin
         $$IBE$$*/ /* actualice el saldo del dia */ /*$$IBE$$ 
        UPDATE saldos_doc_cartera
            SET SDCA_ABONO = SDCA_ABONO + :MONTO,
                SDCA_ABRTFTE = SDCA_ABRTFTE + :RTFTE,
                SDCA_ABRTIVA = SDCA_ABRTIVA + :RTIVA,
                SDCA_ABRTICA = SDCA_ABRTICA + :RTICA
            WHERE SDCA_TIPOREF = :TIPO AND SDCA_IDREF = :ID AND SDCA_FECHA = :fecha;
        END
    ELSE
        BEGIN
         $$IBE$$*/ /* Inserte un nuevo saldo diario */ /*$$IBE$$ 
        INSERT INTO SALDOS_DOC_CARTERA (SDCA_TIPOREF, SDCA_IDREF, SDCA_FECHA, TERC_NIT, SDCA_RTFTE, SDCA_RTIVA, SDCA_RTICA, SDCA_ABONO, SDCA_ABRTFTE, SDCA_ABRTIVA, SDCA_ABRTICA, SDCA_DEBITO, SDCA_MONTO)
            VALUES (:TIPO, :ID, :fecha, :NIT, 0, 0, 0, :MONTO, :rtfte, :rtiva, :rtica, 'N', 0);
        END
    END

FOR SELECT R.RECA_ID, RCDE_TIPODOC, RCDE_IDDOC, RECA_FECHA, TERC_NIT, RCDE_ABONO+RCDE_DTOF, RCDE_RTFTE, RCDE_RTIVA, RCDE_RTICA
    FROM RECIBOS_CAJA_DETALLE D, RECIBOS_CAJA R
    WHERE R.RECA_ID = D.RECA_id AND R.RECA_ID <> 0 AND RECA_ANULADO = 'N' AND TERC_NIT >= :CLIINI AND TERC_NIT <= :CLIFIN
    ORDER BY RECA_FECHA
    INTO :IDR, :TIPO, :ID, :FECHA, :NIT, :MONTO, :RTFTE, :RTIVA, :RTICA
    DO
    BEGIN
    EXISTE = 'N';
    if (TIPO = 45) then
        BEGIN
        SELECT RECA_ID FROM ANTICIPOS_CLIENTE WHERE ANCL_ID = :ID INTO :RECAID;
        if (RECAID = IDR) then
            EXISTE = 'S';
        END
    if (EXISTE = 'N') then
        BEGIN
        select 'S' from saldos_doc_cartera where sdca_tiporef = :TIPO and sdca_idref = :ID and sdca_fecha = :fecha into :EXISTE;
        if (Existe = 'S') then
            begin
             $$IBE$$*/ /* actualice el saldo del dia */ /*$$IBE$$ 
            UPDATE saldos_doc_cartera
                SET SDCA_ABONO = SDCA_ABONO + :MONTO,
                    SDCA_ABRTFTE = SDCA_ABRTFTE + :RTFTE,
                    SDCA_ABRTIVA = SDCA_ABRTIVA + :RTIVA,
                    SDCA_ABRTICA = SDCA_ABRTICA + :RTICA
                WHERE SDCA_TIPOREF = :TIPO AND SDCA_IDREF = :ID AND SDCA_FECHA = :fecha;
            END
        ELSE
            BEGIN
             $$IBE$$*/ /* Inserte un nuevo saldo diario */ /*$$IBE$$ 
            INSERT INTO SALDOS_DOC_CARTERA (SDCA_TIPOREF, SDCA_IDREF, SDCA_FECHA, TERC_NIT, SDCA_RTFTE, SDCA_RTIVA, SDCA_RTICA, SDCA_ABONO, SDCA_ABRTFTE, SDCA_ABRTIVA, SDCA_ABRTICA, SDCA_DEBITO, SDCA_MONTO)
                VALUES (:TIPO, :ID, :fecha, :NIT, 0, 0, 0, :MONTO, :rtfte, :rtiva, :rtica, 'N', 0);
            END
        END
    END

FOR SELECT E.egre_id, EGCC_TIPODOC, EGCC_IDDOC, EGRE_FECHA, TERC_NIT, EGCC_ABONO+EGCC_DTOF, EGCC_RTFTE, EGCC_RTIVA, EGCC_RTICA
    FROM EGRESOS_CRUCEC C, EGRESOS E
    WHERE E.egre_id = C.egre_id AND EGRE_ANULADO = 'N' AND TERC_NIT >= :CLIINI AND TERC_NIT <= :CLIFIN
    ORDER BY EGRE_FECHA
    INTO :IDR, :TIPO, :ID, :FECHA, :NIT, :MONTO, :RTFTE, :RTIVA, :RTICA
    DO
    BEGIN
    select 'S' from saldos_doc_cartera where sdca_tiporef = :TIPO and sdca_idref = :ID and sdca_fecha = :fecha into :EXISTE;
    if (Existe = 'S') then
        begin
         $$IBE$$*/ /* actualice el saldo del dia */ /*$$IBE$$ 
        UPDATE saldos_doc_cartera
            SET SDCA_ABONO = SDCA_ABONO + :MONTO,
            SDCA_ABRTFTE = SDCA_ABRTFTE + :RTFTE,
            SDCA_ABRTIVA = SDCA_ABRTIVA + :RTIVA,
            SDCA_ABRTICA = SDCA_ABRTICA + :RTICA
            WHERE SDCA_TIPOREF = :TIPO AND SDCA_IDREF = :ID AND SDCA_FECHA = :fecha;
        END
    ELSE
        BEGIN
         $$IBE$$*/ /* Inserte un nuevo saldo diario */ /*$$IBE$$ 
        INSERT INTO SALDOS_DOC_CARTERA (SDCA_TIPOREF, SDCA_IDREF, SDCA_FECHA, TERC_NIT, SDCA_RTFTE, SDCA_RTIVA, SDCA_RTICA, SDCA_ABONO, SDCA_ABRTFTE, SDCA_ABRTIVA, SDCA_ABRTICA, SDCA_DEBITO, SDCA_MONTO)
            VALUES (:TIPO, :ID, :fecha, :NIT, 0, 0, 0, :MONTO, :rtfte, :rtiva, :rtica, 'N', 0);
        END
    END

for select ancl_id, ancl_base+ancl_ivamonto, PREF_PRE, ANCL_NUMERO from anticipos_cliente
    where ANCL_ANULADO = 'N' and reca_id not in (select reca_id from recibos_caja where reca_anulado = 'N')
    into :ID, :MONTO, :PREF, :NUMERO
    do
    begin
    FECHA = cast('now' as date);
    execute procedure saldo_doc_cartera(45, :id, :FECHA) returning_values (:RTFTE);
    if ((MONTO = RTFTE) or (RTFTE IS NULL)) then
        DELETE FROM ANTICIPOS_CLIENTE WHERE ANCL_ID = :ID;
    ELSE
        BEGIN
        TIPO = 45;
        ERROR = 'DOCUMENTO ANULADO CON ABONOS';
        SUSPEND;
        END
    end
 $$IBE$$*/ SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE COMISIONES_COBRO(
    DESDE INTEGER,
    HASTA INTEGER,
    FECINI DATE,
    FECFIN DATE,
    DETALLE CHAR(1))
RETURNS (
    CODVEND INTEGER,
    NOMVEND VARCHAR(60),
    NIT VARCHAR(20),
    CLIENTE VARCHAR(60),
    NOMTIPO VARCHAR(8),
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(6),
    FECDOC DATE,
    PREFREC VARCHAR(4),
    NUMREC VARCHAR(6),
    FECREC DATE,
    DIAS INTEGER,
    ABONO NUMERIC(18,2),
    BASE NUMERIC(18,2),
    COMIMONTO NUMERIC(18,2),
    COMIPORC NUMERIC(9,2),
    ARTICULO VARCHAR(20),
    CODGRP VARCHAR(2),
    CANT NUMERIC(18,4))
AS
DECLARE VARIABLE TIPO INTEGER;
DECLARE VARIABLE ID INTEGER;
DECLARE VARIABLE IVAMONTO NUMERIC(18,2);
DECLARE VARIABLE TOTAL NUMERIC(18,2);
DECLARE VARIABLE SITOT CHAR(2);
DECLARE VARIABLE VENTA CHAR(2);
DECLARE VARIABLE COMIV NUMERIC(18,2);
DECLARE VARIABLE PORCV NUMERIC(18,2);
DECLARE VARIABLE CONSUMO NUMERIC(18,2);
declare variable ALFINAL CHAR(2);
declare variable SALDO NUMERIC(18,2);
declare variable COMISION VARCHAR(10);
declare variable porcaux NUMERIC(9,2);
declare variable BASEAUX DOUBLE PRECISION;
declare variable SUCURSAL VARCHAR(20);
BEGIN /*$$IBE$$ 
EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION', 'VENDEDORES', 'COMISIONES EN VENTA INCLUYENDO IMPUESTOS') returning_values (:SITOT);
EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA','COMISIONES','COMISION POR COBRO PAGADERA SOLO EN EL COBRO TOTAL') returning_values (:ALFINAL);
execute procedure lee_configuracion('CARTERA','COMISIONES','COMISION POR COBRO COMO PORCENTAJE DE LA COMISION VENTA') returning_values (:venta);
EXECUTE PROCEDURE lee_configuracion('CARTERA', 'COMISIONES', 'LIQUIDAR COMISION COBRO CON COBRADOR DEL DOCUMENTO O DEL RECIBO') returning_values (:COMISION);
FOR SELECT RCDE_TIPODOC, RCDE_IDDOC, RCDE_PREFIJO, RCDE_NUMERO, R.TERC_NIT, TERC_NOM, RECA_FECHA, (RCDE_ABONO+RCDE_RTFTE+RCDE_RTIVA+RCDE_RTICA), PREF_PRE, RECA_NUMERO, COBR_COD
    FROM RECIBOS_CAJA R, RECIBOS_CAJA_DETALLE RD, TERCEROS T
    WHERE R.RECA_ID = RD.RECA_ID AND RECA_FECHA >= :FECINI AND RECA_FECHA <= :FECFIN AND R.TERC_NIT = T.TERC_NIT AND RECA_ANULADO = 'N'
    ORDER BY TERC_NIT, RECA_FECHA
    INTO :TIPO, :ID, :PREFIJO, :NUMERO, :NIT, :CLIENTE, :FECREC, :ABONO, :PREFREC, :NUMREC, :codvend
    DO
    BEGIN
    SELECT TIDO_NOMCORTO FROM TIPO_DOCUMENTO WHERE TIDO_COD = :TIPO INTO :NOMTIPO;
    if (COMISION = 'DOCUMENTO') then
        SELECT MVCL_FECHA, COBR_COD FROM MOVIMIENTO_CLIENTES WHERE MVCL_TIPOREF = :TIPO AND MVCL_IDREF = :ID
            INTO :FECDOC, :codvend;
    else
        SELECT MVCL_FECHA FROM MOVIMIENTO_CLIENTES WHERE MVCL_TIPOREF = :TIPO AND MVCL_IDREF = :ID
            INTO :FECDOC;
    if (FECDOC IS NOT NULL) then
        DIAS = FECREC - FECDOC;
    ELSE
        DIAS = 999;
    if ((codvend >= :DESDE) AND (codvend <= :hasta)) then
        BEGIN
         $$IBE$$*/ /* TRAIGA EL PORCENTAJE DE ACUERDO A LOS DIAS */ /*$$IBE$$ 
        COMIPORC = 0;
        SELECT CMCB_PORC FROM COMISION_COBRO WHERE CMCB_DIASINI <= :dias AND CMCB_DIASFIN >= :DIAS AND COBR_COD = :CODVEND INTO :COMIPORC;
        if (COMIPORC IS NULL) THEN
            COMIPORC = 0;
        if (VENTA = 'NO') then
            BEGIN
            if (TIPO = 31) then
                BEGIN
                if (DETALLE = 'N') then
                    SELECT MAX(FACT_TOTAL), MAX(FACT_IVAMONTO), SUM(FADE_CONSUMO) FROM FACTURAS F, FACTURAS_DETALLE D
                        WHERE F.FACT_ID = D.FACT_ID AND F.FACT_ID = :ID INTO :TOTAL, :IVAMONTO, :CONSUMO;
                ELSE
                    FOR SELECT D.ARTI_COD, FADE_CANT, FADE_TOTAL, FADE_IVAMONTO, FADE_CONSUMO, GRUP_COD
                        FROM FACTURAS F, FACTURAS_DETALLE D, ARTICULO A
                        WHERE F.FACT_ID = D.FACT_ID AND D.arti_cod = A.arti_cod AND F.FACT_ID = :ID
                        INTO :ARTICULO, :CANT, :TOTAL, :IVAMONTO, :CONSUMO, :CODGRP
                        DO
                        BEGIN
                        if (SITOT = 'SI') then
                            BASEAUX = TOTAL;
                        ELSE
                            BASEAUX = (TOTAL - IVAMONTO - CONSUMO);
                        BASE = BASEAUX;
                        COMIMONTO = BASE / 100 * COMIPORC;
                        SUSPEND;
                        END
                END
            if (TIPO = 33) then
                if (DETALLE = 'N') then
                    SELECT MAX(DEVT_TOTAL*-1), MAX(DEVT_IVAMONTO*-1), SUM(DVDE_CONSUMO) FROM DEVOLUCIONES_VENTAS V, DEVOLUCIONES_VENTAS_DETALLE D
                        WHERE V.DEVT_ID = D.DEVT_ID AND V.DEVT_ID = :ID INTO :TOTAL, :IVAMONTO, :CONSUMO;
                ELSE
                    FOR SELECT D.ARTI_COD, DVDE_CANT, DVDE_TOTAL*-1, DVDE_IVAMONTO*-1, DVDE_CONSUMO*-1, GRUP_COD
                        FROM DEVOLUCIONES_VENTAS V, DEVOLUCIONES_VENTAS_DETALLE D, ARTICULO A
                        WHERE V.DEVT_ID = D.DEVT_ID AND D.arti_cod = A.arti_cod AND V.DEVT_ID = :ID
                        INTO :ARTICULO, :CANT, :TOTAL, :IVAMONTO, :CONSUMO, :codgrp
                        DO
                        BEGIN
                        if (SITOT = 'SI') then
                            BASEAUX = TOTAL;
                        ELSE
                            BASEAUX = TOTAL - IVAMONTO - CONSUMO;
                        BASE = BASEAUX;
                        COMIMONTO = BASE / 100 * COMIPORC;
                        SUSPEND;
                        END
            if (TIPO = 41) then
                SELECT NDCL_MONTO, NDCL_IVAMONTO, 0 FROM NOTAS_DEBITO_CLIENTES WHERE NDCL_ID = :ID INTO :TOTAL, :IVAMONTO, :CONSUMO;
            if (TIPO = 42) then
                SELECT NCCL_MONTO*-1, NCCL_IVAMONTO*-1, 0 FROM NOTAS_CREDITO_CLIENTES WHERE NCCL_ID = :ID INTO :TOTAL, :IVAMONTO, :CONSUMO;
            if (TIPO = 77) then
                SELECT DVCH_MONTO, 0, 0 FROM DEVOLUCION_CHEQUES WHERE DVCH_ID = :ID INTO :TOTAL, :IVAMONTO, :CONSUMO;
            if (SITOT = 'SI') then
                BASEAUX = ABONO;
            ELSE
                if ((TOTAL - IVAMONTO - CONSUMO) <> 0) then
                    BASEAUX = (ABONO / TOTAL) * (TOTAL - IVAMONTO - CONSUMO);
                ELSE
                    BASEAUX = 0;
            BASE = BASEAUX;
            COMIMONTO = BASE / 100 * COMIPORC;
            END
        ELSE
            BEGIN
            if (TIPO = 31) then
                if (DETALLE = 'N') then
                    SELECT MAX(FACT_TOTAL), MAX(FACT_IVAMONTO), MAX(FACT_COMIPORC), SUM(FADE_CONSUMO)
                        FROM FACTURAS F, FACTURAS_DETALLE D WHERE F.FACT_ID = D.FACT_ID AND F.FACT_ID = :ID
                        INTO :TOTAL, :IVAMONTO, :PORCV, :CONSUMO;
                ELSE
                    FOR SELECT D.ARTI_COD, FADE_CANT, FADE_TOTAL, FADE_IVAMONTO, FADE_CONSUMO, FACT_COMIPORC, GRUP_COD
                        FROM FACTURAS F, FACTURAS_DETALLE D, ARTICULO A
                        WHERE F.FACT_ID = D.FACT_ID AND D.arti_cod = A.arti_cod AND F.FACT_ID = :ID
                        INTO :ARTICULO, :CANT, :TOTAL, :IVAMONTO, :CONSUMO, :porcv, :codgrp
                        DO
                        BEGIN
                        if (SITOT = 'SI') then
                            BASEAUX = TOTAL;
                        ELSE
                            BASEAUX = (TOTAL - IVAMONTO - CONSUMO);
                        COMIV = PORCV / 100 * BASEAUX;
                        COMIMONTO = COMIV / 100 * COMIPORC;
                        porcaux = comiporc;
                        comiporc = PORCV / 100 * COMIPORC;
                        BASE = BASEAUX;
                        SUSPEND;
                        END
            if (TIPO = 33) then
                if (DETALLE = 'N') then
                    SELECT MAX(DEVT_TOTAL), MAX(DEVT_IVAMONTO), MAX(DEVT_COMIPORC), SUM(DVDE_CONSUMO)
                        FROM DEVOLUCIONES_VENTAS V, DEVOLUCIONES_VENTAS_DETALLE D WHERE V.DEVT_ID = D.DEVT_ID AND D.DEVT_ID = :ID
                        INTO :TOTAL, :IVAMONTO, :PORCV, :CONSUMO;
                ELSE
                    FOR SELECT D.ARTI_COD, DVDE_CANT, DVDE_TOTAL*-1, DVDE_IVAMONTO*-1, DVDE_CONSUMO*-1, DEVT_COMIPORC, GRUP_COD
                        FROM DEVOLUCIONES_VENTAS V, DEVOLUCIONES_VENTAS_DETALLE D, ARTICULO A
                        WHERE V.DEVT_ID = D.DEVT_ID AND D.arti_cod = A.arti_cod AND V.DEVT_ID = :ID
                        INTO :ARTICULO, :CANT, :TOTAL, :IVAMONTO, :CONSUMO, :porcv, :codgrp
                        DO
                        BEGIN
                        if (SITOT = 'SI') then
                            BASEAUX = TOTAL;
                        ELSE
                            BASEAUX = (TOTAL - IVAMONTO - CONSUMO);
                        COMIV = PORCV / 100 * BASEAUX;
                        COMIMONTO = COMIV / 100 * COMIPORC;
                        porcaux = comiporc;
                        comiporc = PORCV / 100 * COMIPORC;
                        BASE = BASEAUX;
                        SUSPEND;
                        END
            if (TIPO = 41) then
                SELECT NDCL_MONTO, NDCL_IVAMONTO, NDCL_COMIPORC, 0 FROM NOTAS_DEBITO_CLIENTES
                    WHERE NDCL_ID = :ID INTO :TOTAL, :IVAMONTO, :PORCV, :CONSUMO;
            if (TIPO = 42) then
                SELECT NCCL_MONTO, NCCL_IVAMONTO, NCCL_COMIPORC, 0  FROM NOTAS_CREDITO_CLIENTES
                    WHERE NCCL_ID = :ID INTO :TOTAL, :IVAMONTO, :PORCV, :CONSUMO;
            if (TIPO = 77) then
                SELECT DVCH_MONTO, 0, 0, 0 FROM DEVOLUCION_CHEQUES WHERE DVCH_ID = :ID INTO :TOTAL, :IVAMONTO, :PORCV, :CONSUMO;
            if (SITOT = 'SI') then
                BASEAUX = ABONO;
            ELSE
                if ((total <> 0) AND (ABONO <> 0)) then
                    BASEAUX = (TOTAL - IVAMONTO - CONSUMO) / TOTAL * ABONO;
                ELSE
                    BASEAUX = 0;
            COMIV = PORCV / 100 * BASEAUX;
            COMIMONTO = COMIV / 100 * COMIPORC;
            porcaux = comiporc;
            comiporc = PORCV / 100 * COMIPORC;
            BASE = BASEAUX;
            END
        select COBR_NOM from COBRADORES where COBR_COD = :codvend INTO :nomvend;
        if (DETALLE = 'N') then
            if (ALFINAL = 'SI') then
                BEGIN
                 $$IBE$$*/ /* VERIFIQUE EL SALDO DEL DOCUMENTO, SI ES CERO LIQUIDE COMISION SOBRE EL TOTAL */ /*$$IBE$$ 
                EXECUTE PROCEDURE saldo_doc_cartera(:tipo, :ID, :FECREC) returning_values (:SALDO);
                if (SALDO = 0) then
                    BEGIN
                    if (VENTA = 'NO') then
                        begin
                        if (SITOT = 'SI') then
                            BASEAUX = TOTAL;
                        ELSE
                            BASEAUX = TOTAL - IVAMONTO - CONSUMO;
                        COMIMONTO = BASEAUX * COMIPORC / 100;
                        end
                    ELSE
                        BEGIN
                        if (SITOT = 'SI') then
                            BASEAUX = TOTAL;
                        ELSE
                            BASEAUX = TOTAL - IVAMONTO - CONSUMO;
                        COMIV = PORCV * BASEAUX / 100;
                        COMIMONTO = COMIV / 100 * porcaux;
                        comiporc = PORCV / 100 * porcaux;
                        END
                    BASE = BASEAUX;
                    SUSPEND;
                    END
                END
            ELSE
                SUSPEND;
        ELSE
            if ((TIPO <> 31) AND (TIPO <> 33)) then
                SUSPEND;
        END
    END
FOR SELECT EGCC_TIPODOC, EGCC_IDDOC, EGCC_PREFIJO, EGCC_NUMERO, E.TERC_NIT, TERC_NOM, EGRE_FECHA, (EGCC_ABONO+EGCC_RTFTE+EGCC_RTIVA+EGCC_RTICA), PREF_PRE, EGRE_NUMERO, EGCC_SUCURSAL
    FROM EGRESOS E, EGRESOS_CRUCEC C, TERCEROS T
    WHERE E.EGRE_ID = C.EGRE_ID AND EGRE_FECHA >= :FECINI AND EGRE_FECHA <= :FECFIN AND E.TERC_NIT = T.TERC_NIT AND EGRE_ANULADO = 'N'
    ORDER BY TERC_NIT, EGRE_FECHA
    INTO :TIPO, :ID, :PREFIJO, :NUMERO, :NIT, :CLIENTE, :FECREC, :ABONO, :PREFREC, :NUMREC, :SUCURSAL
    DO
    BEGIN
    SELECT COBR_COD FROM cliente_sucursales WHERE TERC_NIT = :NIT AND CLCU_COD = :sucursal INTO :codvend;
    SELECT TIDO_NOMCORTO FROM TIPO_DOCUMENTO WHERE TIDO_COD = :TIPO INTO :NOMTIPO;
    if (COMISION = 'DOCUMENTO') then
        SELECT MVCL_FECHA, COBR_COD FROM MOVIMIENTO_CLIENTES WHERE MVCL_TIPOREF = :TIPO AND MVCL_IDREF = :ID
            INTO :FECDOC, :codvend;
    else
        SELECT MVCL_FECHA FROM MOVIMIENTO_CLIENTES WHERE MVCL_TIPOREF = :TIPO AND MVCL_IDREF = :ID
            INTO :FECDOC;
    if (FECDOC IS NOT NULL) then
        DIAS = FECREC - FECDOC;
    ELSE
        DIAS = 999;
    if ((codvend >= :DESDE) AND (codvend <= :hasta)) then
        BEGIN
         $$IBE$$*/ /* TRAIGA EL PORCENTAJE DE ACUERDO A LOS DIAS */ /*$$IBE$$ 
        COMIPORC = 0;
        SELECT CMCB_PORC FROM COMISION_COBRO WHERE CMCB_DIASINI <= :dias AND CMCB_DIASFIN >= :DIAS AND COBR_COD = :CODVEND INTO :COMIPORC;
        if (COMIPORC IS NULL) THEN
            COMIPORC = 0;
        if (VENTA = 'NO') then
            BEGIN
            if (TIPO = 31) then
                BEGIN
                if (DETALLE = 'N') then
                    SELECT MAX(FACT_TOTAL), MAX(FACT_IVAMONTO), SUM(FADE_CONSUMO) FROM FACTURAS F, FACTURAS_DETALLE D
                        WHERE F.FACT_ID = D.FACT_ID AND F.FACT_ID = :ID INTO :TOTAL, :IVAMONTO, :CONSUMO;
                ELSE
                    FOR SELECT D.ARTI_COD, FADE_CANT, FADE_TOTAL, FADE_IVAMONTO, FADE_CONSUMO, GRUP_COD
                        FROM FACTURAS F, FACTURAS_DETALLE D, ARTICULO A
                        WHERE F.FACT_ID = D.FACT_ID AND D.arti_cod = A.arti_cod AND F.FACT_ID = :ID
                        INTO :ARTICULO, :CANT, :TOTAL, :IVAMONTO, :CONSUMO, :CODGRP
                        DO
                        BEGIN
                        if (SITOT = 'SI') then
                            BASEAUX = TOTAL;
                        ELSE
                            BASEAUX = (TOTAL - IVAMONTO - CONSUMO);
                        BASE = BASEAUX;
                        COMIMONTO = BASE / 100 * COMIPORC;
                        SUSPEND;
                        END
                END
            if (TIPO = 33) then
                if (DETALLE = 'N') then
                    SELECT MAX(DEVT_TOTAL*-1), MAX(DEVT_IVAMONTO*-1), SUM(DVDE_CONSUMO) FROM DEVOLUCIONES_VENTAS V, DEVOLUCIONES_VENTAS_DETALLE D
                        WHERE V.DEVT_ID = D.DEVT_ID AND V.DEVT_ID = :ID INTO :TOTAL, :IVAMONTO, :CONSUMO;
                ELSE
                    FOR SELECT D.ARTI_COD, DVDE_CANT, DVDE_TOTAL*-1, DVDE_IVAMONTO*-1, DVDE_CONSUMO*-1, GRUP_COD
                        FROM DEVOLUCIONES_VENTAS V, DEVOLUCIONES_VENTAS_DETALLE D, ARTICULO A
                        WHERE V.DEVT_ID = D.DEVT_ID AND D.arti_cod = A.arti_cod AND V.DEVT_ID = :ID
                        INTO :ARTICULO, :CANT, :TOTAL, :IVAMONTO, :CONSUMO, :codgrp
                        DO
                        BEGIN
                        if (SITOT = 'SI') then
                            BASEAUX = TOTAL;
                        ELSE
                            BASEAUX = TOTAL - IVAMONTO - CONSUMO;
                        BASE = BASEAUX;
                        COMIMONTO = BASE / 100 * COMIPORC;
                        SUSPEND;
                        END
            if (TIPO = 41) then
                SELECT NDCL_MONTO, NDCL_IVAMONTO, 0 FROM NOTAS_DEBITO_CLIENTES WHERE NDCL_ID = :ID INTO :TOTAL, :IVAMONTO, :CONSUMO;
            if (TIPO = 42) then
                SELECT NCCL_MONTO*-1, NCCL_IVAMONTO*-1, 0 FROM NOTAS_CREDITO_CLIENTES WHERE NCCL_ID = :ID INTO :TOTAL, :IVAMONTO, :CONSUMO;
            if (TIPO = 77) then
                SELECT DVCH_MONTO, 0, 0 FROM DEVOLUCION_CHEQUES WHERE DVCH_ID = :ID INTO :TOTAL, :IVAMONTO, :CONSUMO;
            if (SITOT = 'SI') then
                BASEAUX = ABONO;
            ELSE
                if ((TOTAL - IVAMONTO - CONSUMO) <> 0) then
                    BASEAUX = (ABONO / TOTAL) * (TOTAL - IVAMONTO - CONSUMO);
                ELSE
                    BASEAUX = 0;
            BASE = BASEAUX;
            COMIMONTO = BASE / 100 * COMIPORC;
            END
        ELSE
            BEGIN
            if (TIPO = 31) then
                if (DETALLE = 'N') then
                    SELECT MAX(FACT_TOTAL), MAX(FACT_IVAMONTO), MAX(FACT_COMIPORC), SUM(FADE_CONSUMO)
                        FROM FACTURAS F, FACTURAS_DETALLE D WHERE F.FACT_ID = D.FACT_ID AND F.FACT_ID = :ID
                        INTO :TOTAL, :IVAMONTO, :PORCV, :CONSUMO;
                ELSE
                    FOR SELECT D.ARTI_COD, FADE_CANT, FADE_TOTAL, FADE_IVAMONTO, FADE_CONSUMO, FACT_COMIPORC, GRUP_COD
                        FROM FACTURAS F, FACTURAS_DETALLE D, ARTICULO A
                        WHERE F.FACT_ID = D.FACT_ID AND D.arti_cod = A.arti_cod AND F.FACT_ID = :ID
                        INTO :ARTICULO, :CANT, :TOTAL, :IVAMONTO, :CONSUMO, :porcv, :codgrp
                        DO
                        BEGIN
                        if (SITOT = 'SI') then
                            BASEAUX = TOTAL;
                        ELSE
                            BASEAUX = (TOTAL - IVAMONTO - CONSUMO);
                        COMIV = PORCV / 100 * BASEAUX;
                        COMIMONTO = COMIV / 100 * COMIPORC;
                        porcaux = comiporc;
                        comiporc = PORCV / 100 * COMIPORC;
                        BASE = BASEAUX;
                        SUSPEND;
                        END
            if (TIPO = 33) then
                if (DETALLE = 'N') then
                    SELECT MAX(DEVT_TOTAL), MAX(DEVT_IVAMONTO), MAX(DEVT_COMIPORC), SUM(DVDE_CONSUMO)
                        FROM DEVOLUCIONES_VENTAS V, DEVOLUCIONES_VENTAS_DETALLE D WHERE V.DEVT_ID = D.DEVT_ID AND D.DEVT_ID = :ID
                        INTO :TOTAL, :IVAMONTO, :PORCV, :CONSUMO;
                ELSE
                    FOR SELECT D.ARTI_COD, DVDE_CANT, DVDE_TOTAL*-1, DVDE_IVAMONTO*-1, DVDE_CONSUMO*-1, DEVT_COMIPORC, GRUP_COD
                        FROM DEVOLUCIONES_VENTAS V, DEVOLUCIONES_VENTAS_DETALLE D, ARTICULO A
                        WHERE V.DEVT_ID = D.DEVT_ID AND D.arti_cod = A.arti_cod AND V.DEVT_ID = :ID
                        INTO :ARTICULO, :CANT, :TOTAL, :IVAMONTO, :CONSUMO, :porcv, :codgrp
                        DO
                        BEGIN
                        if (SITOT = 'SI') then
                            BASEAUX = TOTAL;
                        ELSE
                            BASEAUX = (TOTAL - IVAMONTO - CONSUMO);
                        COMIV = PORCV / 100 * BASEAUX;
                        COMIMONTO = COMIV / 100 * COMIPORC;
                        porcaux = comiporc;
                        comiporc = PORCV / 100 * COMIPORC;
                        BASE = BASEAUX;
                        SUSPEND;
                        END
            if (TIPO = 41) then
                SELECT NDCL_MONTO, NDCL_IVAMONTO, NDCL_COMIPORC, 0 FROM NOTAS_DEBITO_CLIENTES
                    WHERE NDCL_ID = :ID INTO :TOTAL, :IVAMONTO, :PORCV, :CONSUMO;
            if (TIPO = 42) then
                SELECT NCCL_MONTO, NCCL_IVAMONTO, NCCL_COMIPORC, 0  FROM NOTAS_CREDITO_CLIENTES
                    WHERE NCCL_ID = :ID INTO :TOTAL, :IVAMONTO, :PORCV, :CONSUMO;
            if (TIPO = 77) then
                SELECT DVCH_MONTO, 0, 0, 0 FROM DEVOLUCION_CHEQUES WHERE DVCH_ID = :ID INTO :TOTAL, :IVAMONTO, :PORCV, :CONSUMO;
            if (SITOT = 'SI') then
                BASEAUX = ABONO;
            ELSE
                if ((total <> 0) AND (ABONO <> 0)) then
                    BASEAUX = (TOTAL - IVAMONTO - CONSUMO) / TOTAL * ABONO;
                ELSE
                    BASEAUX = 0;
            COMIV = PORCV / 100 * BASEAUX;
            COMIMONTO = COMIV / 100 * COMIPORC;
            porcaux = comiporc;
            comiporc = PORCV / 100 * COMIPORC;
            BASE = BASEAUX;
            END
        select COBR_NOM from COBRADORES where COBR_COD = :codvend INTO :nomvend;
        if (DETALLE = 'N') then
            if (ALFINAL = 'SI') then
                BEGIN
                 $$IBE$$*/ /* VERIFIQUE EL SALDO DEL DOCUMENTO, SI ES CERO LIQUIDE COMISION SOBRE EL TOTAL */ /*$$IBE$$ 
                EXECUTE PROCEDURE saldo_doc_cartera(:tipo, :ID, :FECREC) returning_values (:SALDO);
                if (SALDO = 0) then
                    BEGIN
                    if (VENTA = 'NO') then
                        begin
                        if (SITOT = 'SI') then
                            BASEAUX = TOTAL;
                        ELSE
                            BASEAUX = TOTAL - IVAMONTO - CONSUMO;
                        COMIMONTO = BASEAUX * COMIPORC / 100;
                        end
                    ELSE
                        BEGIN
                        if (SITOT = 'SI') then
                            BASEAUX = TOTAL;
                        ELSE
                            BASEAUX = TOTAL - IVAMONTO - CONSUMO;
                        COMIV = PORCV * BASEAUX / 100;
                        COMIMONTO = COMIV / 100 * porcaux;
                        comiporc = PORCV / 100 * porcaux;
                        END
                    BASE = BASEAUX;
                    SUSPEND;
                    END
                END
            ELSE
                SUSPEND;
        ELSE
            if ((TIPO <> 31) AND (TIPO <> 33)) then
                SUSPEND;
        END
    END
FOR SELECT 'DEVOCHEQ', DVCH_MONTO*-1, DVCH_FECHA, PRBA_PREF, DVCH_NUMDOC, DVCH_FECHA, D.TERC_NIT, DVCH_NOMTERC, '', '', D.COBR_COD
    FROM DEVOLUCION_CHEQUES D, CLIENTES C
    WHERE DVCH_FECHA >= :FECINI AND DVCH_FECHA <= :FECFIN AND D.TERC_NIT = C.TERC_NIT AND D.COBR_COD = :CODVEND
    INTO :NOMTIPO, :BASE, :FECDOC, :PREFIJO, :NUMERO, :FECREC, :NIT, :CLIENTE, :PREFREC, :NUMREC, :codvend
    DO
    BEGIN
    COMIPORC = 0;
    COMIMONTO = 0;
    if ((codvend >= :DESDE) AND (codvend <= :hasta)) then
        BEGIN
        select COBR_NOM from COBRADORES where COBR_COD = :codvend INTO :nomvend;
         $$IBE$$*/ /* SELECT CMCB_PORC FROM COMISION_COBRO WHERE CMCB_DIASINI <= 1 AND CMCB_DIASFIN >= 1 AND COBR_COD = :CODVEND INTO :COMIPORC;
        if (COMIPORC IS NULL) THEN
            COMIPORC = 0;
        COMIMONTO = BASE * COMIPORC / 100; */ /*$$IBE$$ 
        SUSPEND;
        END
    END
 $$IBE$$*/ SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE CONCILIA_CARTERA(
    FECINI DATE,
    FECFIN DATE,
    CTACART VARCHAR(20),
    SUBEMPRESA INTEGER,
    ANTERIOR CHAR(1))
RETURNS (
    NIT VARCHAR(20),
    NOMBRE VARCHAR(60),
    INICIAL NUMERIC(18,2),
    INICIALC NUMERIC(18,2),
    DEBITOS NUMERIC(18,2),
    DEBITOSC NUMERIC(18,2),
    CREDITOS NUMERIC(18,2),
    CREDITOSC NUMERIC(18,2),
    SALDO NUMERIC(18,2),
    SALDOC NUMERIC(18,2),
    DIFERENCIA NUMERIC(18,2))
AS
declare variable ANO CHAR(4);
declare variable MES INTEGER;
declare variable NUMROWS INTEGER;
declare variable ABONOS NUMERIC(18,2);
declare variable TIPODOC INTEGER;
declare variable IDDOC INTEGER;
declare variable RETES CHAR(2);
begin /*$$IBE$$ 
ano = EXTRACT(YEAR FROM FECFIN);
mes = EXTRACT(MONTH FROM FECFIN);

for select TERC_NIT, TERC_NOM from TERCEROS WHERE TERC_CLIE = 'S' into :NIT, :NOMBRE
    DO
    BEGIN
     $$IBE$$*/ /* OMITE LOS CLIENTES DE CONTADO */ /*$$IBE$$ 
    SELECT COUNT(*) FROM AUTORIZACIONES WHERE AUTO_NITCONTADO = :NIT INTO :numrows;
    IF (numrows = 0) THEN
        BEGIN
        FECINI = FECINI - 1;
        INICIAL = 0;
        FOR SELECT MVCL_TIPOREF, MVCL_IDREF FROM MOVIMIENTO_CLIENTES
            WHERE TERC_NIT = :NIT AND MVCL_FECHA <= :FECINI AND
            MVCL_ABONO = 'N' AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA))
            INTO :TIPODOC, :IDDOC
            DO
            BEGIN
            EXECUTE PROCEDURE saldo_doc_cartera(TIPODOC, IDDOC, FECINI) returning_values (SALDO);
            INICIAL = INICIAL + SALDO;
            END
        EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'DESCONTAR RETENCIONES POR CAUSACION') returning_values(:RETES);
        FECINI = FECINI + 1;
        if (RETES = 'SI') then
            BEGIN
            SELECT SUM(MVCL_MONTO-MVCL_RTEFTE-MVCL_RTEIVA-MVCL_RTEICA) FROM movimiento_clientes
                WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND MVCL_FECHA < :FECFIN
                AND MVCL_DEBITO = 'S' AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA))
                INTO :DEBITOS;
            SELECT SUM(MVCL_MONTO-MVCL_RTEFTE-MVCL_RTEIVA-MVCL_RTEICA) FROM movimiento_clientes
                WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND MVCL_FECHA < :FECFIN
                AND MVCL_DEBITO = 'N' AND MVCL_ABONO = 'N' and MVCL_TIPOREF <> 45 AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA))
                INTO :CREDITOS;
            SELECT SUM(MVCL_MONTO) FROM movimiento_clientes
                WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND MVCL_FECHA < :FECFIN
                AND MVCL_ABONO = 'S' AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA))
                INTO :ABONOS;
            END
        ELSE
            BEGIN
            SELECT SUM(MVCL_MONTO) FROM movimiento_clientes
                WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND MVCL_FECHA < :FECFIN
                AND MVCL_DEBITO = 'S' AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA))
                INTO :DEBITOS;
            SELECT SUM(MVCL_MONTO) FROM movimiento_clientes
                WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND MVCL_FECHA < :FECFIN
                AND MVCL_DEBITO = 'N' AND MVCL_ABONO = 'N' and MVCL_TIPOREF <> 45 AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA))
                INTO :CREDITOS;
            SELECT SUM(MVCL_MONTO+MVCL_RTEFTE+MVCL_RTEIVA+MVCL_RTEICA) FROM movimiento_clientes
                WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND MVCL_FECHA < :FECFIN
                AND MVCL_ABONO = 'S' AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA))
                INTO :ABONOS;
            END
        if (DEBITOS IS NULL) then
            DEBITOS = 0;
        if (CREDITOS IS NULL) then
            CREDITOS = 0;
        if (ABONOS IS NULL) then
            ABONOS = 0;
        CREDITOS = CREDITOS + ABONOS;
        SALDO = INICIAL + DEBITOS - CREDITOS;

         $$IBE$$*/ /* LO CONTABLE */ /*$$IBE$$ 
        EXECUTE PROCEDURE SALDO_TERCERO_MES(ctacart, NIT, ANO, MES, 'S') RETURNING_VALUES (INICIALC);
        EXECUTE PROCEDURE MOVIMIENTO_TERCERO_MES(ctacart, NIT, ANO, MES, 'S') RETURNING_VALUES(DEBITOSC);
        EXECUTE PROCEDURE MOVIMIENTO_TERCERO_MES(ctacart, NIT, ANO, MES, 'N') RETURNING_VALUES(CREDITOSC);
        SALDOC = INICIALC + DEBITOSC - CREDITOSC;
        diferencia = SALDO - SALDOC;
        if (DIFERENCIA <> 0) then
            BEGIN
            if (ANTERIOR <> 'S') then
                SUSPEND;
            ELSE
                BEGIN
                if (DIFERENCIA <> (INICIAL - INICIALC)) then
                    SUSPEND;
                END
            END
        END
    END
 $$IBE$$*/ SUSPEND;
end
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE IMPR_APLICLIE(
    ID INTEGER)
RETURNS (
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    CONCEPTO VARCHAR(60),
    NIT VARCHAR(20),
    NOMBRE VARCHAR(60),
    DIR VARCHAR(60),
    CIU VARCHAR(40),
    TEL VARCHAR(40),
    CONTACTO VARCHAR(60),
    FAX VARCHAR(25),
    CEL VARCHAR(25),
    EMAIL VARCHAR(100),
    ITEM INTEGER,
    TIPODOC VARCHAR(8),
    PREFDOC VARCHAR(4),
    NUMDOC VARCHAR(6),
    ABONO NUMERIC(18,2),
    RTFTEMONTO NUMERIC(18,2),
    RTIVAMONTO NUMERIC(18,2),
    RTICAMONTO NUMERIC(18,2),
    SALDODOC NUMERIC(18,2),
    ANTERDOC NUMERIC(18,2),
    OBS BLOB SUB_TYPE 1 SEGMENT SIZE 80,
    CLIE_COD VARCHAR(15),
    COBR_COD INTEGER,
    COBR_NOM VARCHAR(60))
AS
declare variable TIPO INTEGER;
declare variable IDDOC INTEGER;
BEGIN /*$$IBE$$ 
  FOR SELECT PREF_PRE, APCL_NUMERO, APCL_FECHA, APCL_CONCEPTO, P.TERC_NIT, TERC_NOM, TERC_DIR, TERC_CIU, TERC_TEL, TERC_CONTACTO, TERC_FAX, TERC_CEL, TERC_EMAIL,
    ACDE_ITEM, ACDE_TIPODOC, ACDE_IDDOC, TIDO_NOMCORTO, ACDE_PREFIJO, ACDE_NUMERO, ACDE_APLICADO,
    ACDE_RTFTE, ACDE_RTIVA, ACDE_RTICA, APCL_OBS, CLIE_COD, P.COBR_COD, COBR_NOM
    FROM APLICACION_CLIENTE P, APLICACION_CLIENTE_DETALLE PD, TERCEROS T, CLIENTES C, TIPO_DOCUMENTO TD, COBRADORES CO
    WHERE P.TERC_NIT = T.TERC_NIT AND T.TERC_NIT = C.TERC_NIT AND P.APCL_ID = PD.APCL_ID AND P.APCL_ID = :ID AND ACDE_TIPODOC = TD.TIDO_COD AND P.COBR_COD = CO.COBR_COD
    ORDER BY ACDE_ITEM
    INTO :PREFIJO, :NUMERO, :FECHA, :CONCEPTO, :NIT, :NOMBRE, :DIR, :CIU, :TEL, :CONTACTO, :FAX, :CEL, :EMAIL, :ITEM, :TIPO, :IDDOC, :TIPODOC, :PREFDOC, :NUMDOC, :ABONO, :RTFTEMONTO, :RTIVAMONTO, :RTICAMONTO, :OBS, :CLIE_COD, :COBR_COD, :COBR_NOM
    DO
        begin
        EXECUTE PROCEDURE SALDO_DOC_CARTERA(:TIPO, :IDDOC, :FECHA) returning_values (:SALDODOC);
        if (SALDODOC IS NULL) then
            SALDODOC = 0;
        ANTERDOC = SALDODOC + rtftemonto + rtivamonto + rticamonto + abono;
        if (anterdoc IS NULL) then
            ANTERDOC = 0;
        SUSPEND;
        end
 $$IBE$$*/ SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE IMPR_APLIPROV(
    ID INTEGER)
RETURNS (
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    CONCEPTO VARCHAR(60),
    NIT VARCHAR(20),
    NOMBRE VARCHAR(60),
    DIR VARCHAR(60),
    CIU VARCHAR(40),
    TEL VARCHAR(40),
    CONTACTO VARCHAR(60),
    FAX VARCHAR(25),
    CEL VARCHAR(25),
    EMAIL VARCHAR(100),
    ITEM INTEGER,
    TIPODOC VARCHAR(8),
    PREFDOC VARCHAR(4),
    NUMDOC VARCHAR(6),
    ABONO NUMERIC(18,2),
    RTFTEMONTO NUMERIC(18,2),
    RTIVAMONTO NUMERIC(18,2),
    RTICAMONTO NUMERIC(18,2),
    SALDODOC NUMERIC(18,2),
    ANTERDOC NUMERIC(18,2),
    OBS BLOB SUB_TYPE 1 SEGMENT SIZE 80,
    PROV_COD VARCHAR(15),
    PROV_CARTERA VARCHAR(60),
    PROV_CODIGOINT VARCHAR(15))
AS
declare variable TIPO INTEGER;
declare variable IDDOC INTEGER;
BEGIN /*$$IBE$$ 
  FOR SELECT PREF_PRE, APPR_NUMERO, APPR_FECHA, APPR_CONC, P.TERC_NIT, TERC_NOM, TERC_DIR, TERC_CIU, TERC_TEL, TERC_CONTACTO, TERC_FAX, TERC_CEL, TERC_EMAIL,
    APPD_ITEM, APPD_TIPODOC, APPD_IDDOC, TIDO_NOMCORTO, APPD_PREFIJO, APPD_NUMERO, APPD_APLICADO,
    APPD_RTFTE, APPD_RTIVA, APPD_RTICA, APPR_OBS, PROV_COD, PROV_CARTERA, PROV_CODIGOINT
    FROM APLICACION_PROVEDOR P, APLICACION_PROVEEDOR_DETALLE PD, TERCEROS T, PROVEEDORES PR, TIPO_DOCUMENTO TD
    WHERE P.TERC_NIT = T.TERC_NIT AND T.TERC_NIT = PR.TERC_NIT AND P.APPR_ID = PD.APPR_ID AND P.APPR_ID = :ID AND APPD_TIPODOC = TD.TIDO_COD
    ORDER BY APPD_ITEM
    INTO :PREFIJO, :NUMERO, :FECHA, :CONCEPTO, :NIT, :NOMBRE, :DIR, :CIU, :TEL, :CONTACTO, :FAX, :CEL, :EMAIL, :ITEM, :TIPO, :IDDOC, :TIPODOC, :PREFDOC, :NUMDOC, :ABONO, :RTFTEMONTO, :RTIVAMONTO, :RTICAMONTO, :OBS, :PROV_COD, :PROV_CARTERA, :PROV_CODIGOINT
    DO
        begin
        EXECUTE PROCEDURE SALDO_DOC_CARTERA(:TIPO, :IDDOC, :FECHA) returning_values (:SALDODOC);
        if (saldodoc IS NULL) then
            SALDODOC = 0;
        ANTERDOC = SALDODOC + rtftemonto + rtivamonto + rticamonto + abono;
        if (anterdoc IS NULL) then
            ANTERDOC = 0;
        SUSPEND;
        end
 $$IBE$$*/ SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE IMPR_RECICAJA(
    ID INTEGER)
RETURNS (
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    NOMCAJA VARCHAR(60),
    CODCOBR INTEGER,
    NOMCOBR VARCHAR(60),
    NIT VARCHAR(20),
    NOMBRE VARCHAR(60),
    DIR VARCHAR(60),
    CIU VARCHAR(40),
    TEL VARCHAR(40),
    CONCEPTO VARCHAR(60),
    MONTO NUMERIC(18,2),
    RTFTE NUMERIC(18,2),
    RTIVA NUMERIC(18,2),
    RTICA NUMERIC(18,2),
    DSCTO NUMERIC(18,2),
    OBS BLOB SUB_TYPE 1 SEGMENT SIZE 80,
    ITEMDOC INTEGER,
    TIPODOC VARCHAR(8),
    PREFDOC VARCHAR(4),
    NUMDOC VARCHAR(6),
    SUCURSAL VARCHAR(10),
    ABONODOC NUMERIC(18,2),
    RTFTEDOC NUMERIC(18,2),
    RTIVADOC NUMERIC(18,2),
    RTICADOC NUMERIC(18,2),
    DSCTODOC NUMERIC(18,2),
    SALDODOC NUMERIC(18,2),
    ANTERDOC NUMERIC(18,2))
AS
declare variable NUMROWS INTEGER;
declare variable TIPO integer;
declare variable IDDOC INTEGER;
BEGIN /*$$IBE$$ 
  SELECT PREF_PRE, RECA_NUMERO, RECA_FECHA, CAJA_NOMBRE, RECA_CONC, R.COBR_COD,
        R.TERC_NIT, RECA_NOMTERC, TERC_DIR, TERC_CIU, TERC_TEL,
        RECA_MONTO, RECA_RTFTEMONTO, RECA_RTIVAMONTO, RECA_RTICAMONTO, RECA_DTOF,
        RECA_OBS
  FROM RECIBOS_CAJA R, TERCEROS T, CAJAS C
  WHERE R.TERC_NIT = T.TERC_NIT AND R.CAJA_ID = C.CAJA_ID AND
        R.RECA_ID = :ID
  INTO :PREFIJO, :NUMERO, :FECHA, :NOMCAJA, :CONCEPTO, :CODCOBR,
        :NIT, :NOMBRE, :DIR, :CIU, :TEL,
        :MONTO, :RTFTE, :RTIVA, :RTICA, :DSCTO,
        :OBS;
  SELECT COBR_NOM FROM COBRADORES WHERE COBR_COD = :CODCOBR INTO :NOMCOBR;
  SELECT COUNT(RCDE_ITEM) FROM RECIBOS_CAJA_DETALLE
    WHERE RECA_ID = :ID INTO :NUMROWS;
  if (NUMROWS > 0) then
    FOR SELECT RCDE_ITEM, RCDE_TIPODOC, RCDE_IDDOC, TIDO_NOMCORTO, RCDE_PREFIJO, RCDE_NUMERO,
        RCDE_ABONO, RCDE_RTFTE, RCDE_RTIVA, RCDE_RTICA, RCDE_DTOF, RCDE_SUCURSAL
        FROM RECIBOS_CAJA_DETALLE D, TIPO_DOCUMENTO TD
        WHERE D.RECA_ID = :ID AND TD.TIDO_COD = D.RCDE_TIPODOC
        ORDER BY RCDE_ITEM
        INTO :ITEMDOC, :TIPO, :IDDOC, :TIPODOC, :PREFDOC, :NUMDOC, :ABONODOC, :RTFTEDOC, :RTIVADOC, :RTICADOC, :DSCTODOC, :sucursal
        DO
            BEGIN
            EXECUTE PROCEDURE SALDO_DOC_CARTERA(:TIPO, :IDDOC, :FECHA) returning_values (:SALDODOC);
            ANTERDOC = SALDODOC + RTFTEDOC + RTIVADOC + RTICADOC + ABONODOC + DSCTODOC;
            SUSPEND;
            END
  ELSE
    SUSPEND;
 $$IBE$$*/ SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE IMPR_RECIPROV(
    ID INTEGER)
RETURNS (
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    NOMCAJA VARCHAR(60),
    CODCOBR INTEGER,
    NOMCOBR VARCHAR(60),
    NIT VARCHAR(20),
    NOMBRE VARCHAR(60),
    DIR VARCHAR(60),
    CIU VARCHAR(40),
    TEL VARCHAR(40),
    CONCEPTO VARCHAR(60),
    MONTO NUMERIC(18,2),
    RTFTE NUMERIC(18,2),
    RTIVA NUMERIC(18,2),
    RTICA NUMERIC(18,2),
    DSCTO NUMERIC(18,2),
    OBS BLOB SUB_TYPE 1 SEGMENT SIZE 80,
    PREPAGC VARCHAR(4),
    NUMPAGC VARCHAR(6),
    ITEMDOC INTEGER,
    TIPODOC VARCHAR(8),
    PREFDOC VARCHAR(4),
    NUMDOC VARCHAR(6),
    ABONODOC NUMERIC(18,2),
    RTFTEDOC NUMERIC(18,2),
    RTIVADOC NUMERIC(18,2),
    RTICADOC NUMERIC(18,2),
    DSCTODOC NUMERIC(18,2),
    SALDODOC NUMERIC(18,2),
    ANTERDOC NUMERIC(18,2))
AS
declare variable NUMROWS INTEGER;
declare variable TIPO integer;
declare variable IDDOC INTEGER;
BEGIN /*$$IBE$$ 
  SELECT PREF_PRE, RCPR_NUMERO, RCPR_FECHA, CAJA_NOMBRE, RCPR_CONC, R.VEND_COD,
        R.TERC_NIT, RCPR_NOMTERC, TERC_DIR, TERC_CIU, TERC_TEL,
        RCPR_MONTO, RCPR_RTFTE, RCPR_RTIVA, RCPR_RTICA, RCPR_DTOF,
        RCPR_OBS
  FROM RECIBO_PROVISIONAL R, TERCEROS T, CAJAS C
  WHERE R.TERC_NIT = T.TERC_NIT AND R.CAJA_ID = C.CAJA_ID AND
        R.RCPR_ID = :ID
  INTO :PREFIJO, :NUMERO, :FECHA, :NOMCAJA, :CONCEPTO, :CODCOBR,
        :NIT, :NOMBRE, :DIR, :CIU, :TEL,
        :MONTO, :RTFTE, :RTIVA, :RTICA, :DSCTO,
        :OBS;
  SELECT COBR_NOM FROM COBRADORES WHERE COBR_COD = :CODCOBR INTO :NOMCOBR;
  SELECT COUNT(RPDE_ITEM) FROM RECIBO_PROVISIONAL_DETALLE
    WHERE RCPR_ID = :ID INTO :NUMROWS;
  if (NUMROWS > 0) then
    FOR SELECT RPDE_ITEM, RPDE_TIPODOC, RPDE_IDDOC, TIDO_NOMCORTO, RPDE_PREFDOC, RPDE_NUMDOC,
        RPDE_ABONO, RPDE_RTFTE, RPDE_RTIVA, RPDE_RTICA, RPDE_DTOF
        FROM RECIBO_PROVISIONAL_DETALLE D, TIPO_DOCUMENTO TD
        WHERE D.RCPR_ID = :ID AND TD.TIDO_COD = D.RPDE_TIPODOC
        ORDER BY RPDE_ITEM
        INTO :ITEMDOC, :TIPO, :IDDOC, :TIPODOC, :PREFDOC, :NUMDOC, :ABONODOC, :RTFTEDOC, :RTIVADOC, :RTICADOC, :DSCTODOC
        DO
            BEGIN
            EXECUTE PROCEDURE SALDO_DOC_CARTERA(:TIPO, :ID, :FECHA) returning_values (:SALDODOC);
            ANTERDOC = SALDODOC + RTFTEDOC + RTIVADOC + RTICADOC + ABONODOC + DSCTODOC;
            SUSPEND;
            END
  ELSE
    SUSPEND;
 $$IBE$$*/ SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE MOVIMIENTO_CARTERA_MES(
    FECINI DATE,
    FECFIN DATE,
    SUBEMPRESA INTEGER,
    CONTADO CHAR(1))
RETURNS (
    NIT VARCHAR(20),
    NOMBRE VARCHAR(60),
    CONTACTO VARCHAR(60),
    DIASMAX INTEGER,
    TELEFONO VARCHAR(40),
    INICIAL NUMERIC(18,2),
    DEBITOS NUMERIC(18,2),
    CREDITOS NUMERIC(18,2),
    ABONOS NUMERIC(18,2),
    FINAL NUMERIC(18,2))
AS
declare variable RETES CHAR(2);
declare variable TIPODOC INTEGER;
declare variable IDDOC INTEGER;
declare variable SALDO NUMERIC(18,2);
declare variable NUMROWS INTEGER;
declare variable DIASF INTEGER;
declare variable DIAS INTEGER;
DECLARE VARIABLE FOV CHAR(11);
BEGIN /*$$IBE$$ 
EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'ANALISIS DE CARTERA CON FECHA FACTURA O VENCIMIENTO') RETURNING_VALUES (FOV);
for select TERC_NIT, TERC_NOM, TERC_CONTACTO, TERC_TEL from TERCEROS WHERE TERC_CLIE = 'S' into :NIT, :NOMBRE, :CONTACTO, :TELEFONO
  DO
    BEGIN
    diasmax = 0;
    SELECT COUNT(*) FROM AUTORIZACIONES WHERE AUTO_NITCONTADO = :NIT INTO :numrows;
    IF ((CONTADO = 'S') or (numrows = 0)) THEN
        BEGIN
        FECINI = FECINI - 1;
        INICIAL = 0;
        FOR SELECT MVCL_TIPOREF, MVCL_IDREF, (:FECFIN-MVCL_FECHA), (:FECFIN-MVCL_VENCE) FROM MOVIMIENTO_CLIENTES
            WHERE TERC_NIT = :NIT AND MVCL_FECHA <= :FECINI AND
            MVCL_ABONO = 'N' AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA))
            INTO :TIPODOC, :IDDOC, :DIASF, DIAS
            DO
            BEGIN
            EXECUTE PROCEDURE saldo_doc_cartera(TIPODOC, IDDOC, FECINI) returning_values (SALDO);
            if (SALDO <> 0) then
                BEGIN
                INICIAL = INICIAL + SALDO;
                if (FOV = 'FECHA') then
                    BEGIN
                    if ((SALDO > 0) AND (DIASMAX < DIASF)) then
                        DIASMAX = DIASF;
                    END
                ELSE
                    BEGIN
                    if ((SALDO > 0) AND (DIASMAX < DIAS)) then
                        DIASMAX = DIAS;
                    END
                END
            END
        EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'DESCONTAR RETENCIONES POR CAUSACION') returning_values(:RETES);
        FECINI = FECINI + 1;
        if (RETES = 'SI') then
            BEGIN
            SELECT SUM(MVCL_MONTO-MVCL_RTEFTE-MVCL_RTEIVA-MVCL_RTEICA), MAX(:FECFIN-MVCL_FECHA), MAX(:FECFIN-MVCL_VENCE) FROM movimiento_clientes
                WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND MVCL_FECHA < :FECFIN
                AND MVCL_DEBITO = 'S' AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA))
                INTO :DEBITOS, :diasf, :dias;
            SELECT SUM(MVCL_MONTO-MVCL_RTEFTE-MVCL_RTEIVA-MVCL_RTEICA) FROM movimiento_clientes
                WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND MVCL_FECHA < :FECFIN
                AND MVCL_DEBITO = 'N' AND MVCL_ABONO = 'N' and MVCL_TIPOREF <> 45 AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA))
                INTO :CREDITOS;
            SELECT SUM(MVCL_MONTO) FROM movimiento_clientes
                WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND MVCL_FECHA < :FECFIN
                AND MVCL_ABONO = 'S' AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA))
                INTO :ABONOS;
            END
        ELSE
            BEGIN
            SELECT SUM(MVCL_MONTO), MAX(:FECFIN-MVCL_FECHA), MAX(:FECFIN-MVCL_VENCE) FROM movimiento_clientes
                WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND MVCL_FECHA < :FECFIN
                AND MVCL_DEBITO = 'S' AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA))
                INTO :DEBITOS, :diasf, :dias;
            SELECT SUM(MVCL_MONTO) FROM movimiento_clientes
                WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND MVCL_FECHA < :FECFIN
                AND MVCL_DEBITO = 'N' AND MVCL_ABONO = 'N' and MVCL_TIPOREF <> 45 AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA))
                INTO :CREDITOS;
            SELECT SUM(MVCL_MONTO+MVCL_RTEFTE+MVCL_RTEIVA+MVCL_RTEICA) FROM movimiento_clientes
                WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND MVCL_FECHA < :FECFIN
                AND MVCL_ABONO = 'S' AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA))
                INTO :ABONOS;
            END
        if (FOV = 'FECHA') then
            BEGIN
            if ((DIASMAX < DIASF) AND (DIASF IS NOT NULL)) then
                DIASMAX = DIASF;
            END
        ELSE
            BEGIN
            if ((DIASMAX < DIAS) AND (DIAS IS NOT NULL)) then
                DIASMAX = DIAS;
            END
        if (DEBITOS IS NULL) then
            DEBITOS = 0;
        if (CREDITOS IS NULL) then
            CREDITOS = 0;
        if (ABONOS IS NULL) then
            ABONOS = 0;
        FINAL = INICIAL + DEBITOS - CREDITOS - ABONOS;
        SUSPEND;
        END
    END
 $$IBE$$*/ SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE RECUPERACION_CARTERA(
    DESDE VARCHAR(20),
    HASTA VARCHAR(20),
    GRPINI VARCHAR(5),
    GRPFIN VARCHAR(5),
    FECHA DATE,
    ORDEN CHAR(1),
    AGRUPA CHAR(1),
    SUCURSAL INTEGER)
RETURNS (
    NIT VARCHAR(20),
    NOMBRE VARCHAR(60),
    TELEFONO VARCHAR(40),
    CIUDAD VARCHAR(60),
    CODZONA VARCHAR(2),
    NOMZONA VARCHAR(60),
    CODCOBR INTEGER,
    NOMCOBR VARCHAR(60),
    DV CHAR(1),
    CODCIUD CHAR(5),
    NOMCIUD VARCHAR(60),
    INICIAL NUMERIC(18,2),
    CARGOS1 NUMERIC(18,2),
    ABONOS1 NUMERIC(18,2),
    CARGOS2 NUMERIC(18,2),
    ABONOS2 NUMERIC(18,2),
    CARGOS3 NUMERIC(18,2),
    ABONOS3 NUMERIC(18,2),
    FINAL NUMERIC(18,2))
AS
declare variable NITINI VARCHAR(20);
declare variable NITFIN VARCHAR(20);
declare variable NOMINI VARCHAR(60);
declare variable NOMFIN VARCHAR(60);
declare variable OK CHAR(1);
declare variable FECINI DATE;
declare variable FECFIN DATE;
declare variable DEBITO NUMERIC(18,2);
declare variable CREDITO NUMERIC(18,2);
declare variable TIPODOC INTEGER;
declare variable IDDOC INTEGER;
declare variable SALDO NUMERIC(18,2);
declare variable RTFTE NUMERIC(18,2);
declare variable RTIVA NUMERIC(18,2);
declare variable RTICA NUMERIC(18,2);
declare variable RETES CHAR(2);
BEGIN /*$$IBE$$ 
EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'DESCONTAR RETENCIONES POR CAUSACION') returning_values (:RETES);
if (ORDEN = 'C') then
    BEGIN
    NITINI = DESDE;
    NITFIN = HASTA;
    NOMINI = '';
    NOMFIN = 'zz';
    END
ELSE
    BEGIN
    NOMINI = DESDE;
    NOMFIN = HASTA;
    NITINI = '';
    NITFIN = 'zz';
    END
   $$IBE$$*/ /* Ubique el NIT */ /*$$IBE$$ 
  FOR select T.TERC_NIT, TERC_NOM, TERC_DV, TERC_TEL, TERC_CIU, S.COBR_COD, C.ZONA_COD, T.CIUD_COD
    from terceros T, CLIENTES C, CLIENTE_SUCURSALES S
    where S.TERC_NIT = T.TERC_NIT AND C.TERC_NIT = T.TERC_NIT AND TERC_CLIE = 'S' AND T.TERC_NIT >= :NITINI AND T.TERC_NIT <= :NITFIN AND
        TERC_NOM >= :NOMINI AND TERC_NOM <= :NOMFIN
    INTO :NIT, :NOMBRE, :DV, :TELEFONO, :CIUDAD, :CODCOBR, :CODZONA, :CODCIUD
    DO  
    BEGIN
    FECINI = FECHA - 90;
    OK = 'N';
    if (AGRUPA = 'Z') then
        BEGIN
        if (GRPINI = '') then
            BEGIN
            if ((CODZONA IS NULL) or (CODZONA >= :GRPINI AND CODZONA <= :GRPFIN)) then
                OK = 'S';
            END
        ELSE
            if (CODZONA >= :GRPINI AND CODZONA <= :GRPFIN) then
                OK = 'S';
        END
    if (AGRUPA = 'I') then
        BEGIN
        if (GRPINI = '') then
            BEGIN
            if ((CODCIUD IS NULL) or (CODCIUD >= :GRPINI AND CODCIUD <= :GRPFIN)) then
                OK = 'S';
            END
        ELSE
            if (CODCIUD >= :GRPINI AND CODCIUD <= :GRPFIN) then
                OK = 'S';
        END
    if (AGRUPA = 'N') then
        OK = 'S';
        
    if (OK = 'S') then
        BEGIN
        SELECT COBR_NOM FROM COBRADORES CB WHERE COBR_COD = :CODCOBR INTO :NOMCOBR;
        SELECT ZONA_NOM FROM ZONAS WHERE ZONA_COD = :CODZONA INTO :NOMZONA;
        SELECT CIUD_NOM FROM CIUDADES WHERE CIUD_COD = :CODCIUD INTO :NOMCIUD;
        CARGOS1 = 0;
        ABONOS1 = 0;
        CARGOS2 = 0;
        ABONOS2 = 0;
        CARGOS3 = 0;
        ABONOS3 = 0;
        INICIAL = 0;
        FOR SELECT MVCL_TIPOREF, MVCL_IDREF FROM MOVIMIENTO_CLIENTES
            WHERE TERC_NIT = :NIT AND MVCL_FECHA <= :FECINI AND
            MVCL_ABONO = 'N' AND ((:SUCURSAL = 0) or (SUCU_ID = :SUCURSAL))
            INTO :TIPODOC, :IDDOC
            DO
            BEGIN
            EXECUTE PROCEDURE saldo_doc_cartera(TIPODOC, IDDOC, FECINI) returning_values (SALDO);
            INICIAL = INICIAL + SALDO;
            END
        FECFIN = FECINI + 30;
        SELECT SUM(MVCL_MONTO), SUM(MVCL_RTEFTE), SUM(MVCL_RTEIVA), SUM(MVCL_RTEICA) FROM movimiento_clientes WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND
            MVCL_FECHA < :FECFIN AND MVCL_DEBITO = 'S' AND MVCL_ABONO = 'N' AND ((:SUCURSAL = 0) or (SUCU_ID = :SUCURSAL))
            INTO :DEBITO, :RTFTE, :RTIVA, :RTICA;
        if (DEBITO IS NULL) then
            DEBITO = 0;
        if (rtfte IS NULL) then
            rtfte = 0;
        if (rtiva IS NULL) then
            rtiva = 0;
        if (rtica IS NULL) then
            rtica = 0;
        IF (RETES = 'SI') then
            DEBITO = DEBITO - RTFTE - RTIVA - RTICA;

        SELECT SUM(MVCL_MONTO), SUM(MVCL_RTEFTE), SUM(MVCL_RTEIVA), SUM(MVCL_RTEICA)  FROM movimiento_clientes WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI
            AND MVCL_FECHA < :FECFIN AND MVCL_DEBITO = 'N'  AND MVCL_ABONO = 'N' AND ((:SUCURSAL = 0) or (SUCU_ID = :SUCURSAL))
            INTO :CREDITO, :RTFTE, :RTIVA, :RTICA;
        if (CREDITO IS NULL) then
            CREDITO = 0;
        if (rtfte IS NULL) then
            rtfte = 0;
        if (rtiva IS NULL) then
            rtiva = 0;
        if (rtica IS NULL) then
            rtica = 0;
        IF (RETES = 'SI') then
            CREDITO = CREDITO - RTFTE - RTIVA - RTICA;
        CARGOS3 = DEBITO - CREDITO;
 $$IBE$$*/ /*        SELECT SUM(MVCL_MONTO), SUM(MVCL_RTEFTE), SUM(MVCL_RTEIVA), SUM(MVCL_RTEICA)  FROM movimiento_clientes WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI
            AND MVCL_FECHA < :FECFIN AND MVCL_DEBITO = 'S' AND MVCL_ABONO = 'S' AND ((:SUCURSAL = 0) or (SUCU_ID = :SUCURSAL))
            INTO :DEBITO, :RTFTE, :RTIVA, :RTICA;
        if (DEBITO IS NULL) then
            DEBITO = 0;
        IF (RETES = 'NO') then
            DEBITO = DEBITO + RTFTE + RTIVA + RTICA; */ /*$$IBE$$ 
        SELECT SUM(MVCL_MONTO), SUM(MVCL_RTEFTE), SUM(MVCL_RTEIVA), SUM(MVCL_RTEICA)  FROM movimiento_clientes WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI
            AND MVCL_FECHA < :FECFIN AND MVCL_DEBITO = 'N' AND MVCL_ABONO = 'S' AND ((:SUCURSAL = 0) or (SUCU_ID = :SUCURSAL))
            INTO :CREDITO, :RTFTE, :RTIVA, :RTICA;
        if (CREDITO IS NULL) then
            CREDITO = 0;
        if (rtfte IS NULL) then
            rtfte = 0;
        if (rtiva IS NULL) then
            rtiva = 0;
        if (rtica IS NULL) then
            rtica = 0;
        IF (RETES = 'NO') then
            CREDITO = CREDITO + RTFTE + RTIVA + RTICA;
 $$IBE$$*/ /*        ABONOS3 = DEBITO - CREDITO; */ /*$$IBE$$ 
        ABONOS3 = CREDITO;
        FECINI = FECFIN;
        FECFIN = FECINI + 30;
        SELECT SUM(MVCL_MONTO), SUM(MVCL_RTEFTE), SUM(MVCL_RTEIVA), SUM(MVCL_RTEICA)  FROM movimiento_clientes WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI
            AND MVCL_FECHA < :FECFIN AND MVCL_DEBITO = 'S' AND MVCL_ABONO = 'N' AND ((:SUCURSAL = 0) or (SUCU_ID = :SUCURSAL))
            INTO :DEBITO, :RTFTE, :RTIVA, :RTICA;
        if (DEBITO IS NULL) then
            DEBITO = 0;
        if (rtfte IS NULL) then
            rtfte = 0;
        if (rtiva IS NULL) then
            rtiva = 0;
        if (rtica IS NULL) then
            rtica = 0;
        IF (RETES = 'SI') then
            DEBITO = DEBITO - RTFTE - RTIVA - RTICA;
        SELECT SUM(MVCL_MONTO), SUM(MVCL_RTEFTE), SUM(MVCL_RTEIVA), SUM(MVCL_RTEICA)  FROM movimiento_clientes WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI
            AND MVCL_FECHA < :FECFIN AND MVCL_DEBITO = 'N'  AND MVCL_ABONO = 'N' AND ((:SUCURSAL = 0) or (SUCU_ID = :SUCURSAL))
            INTO :CREDITO, :RTFTE, :RTIVA, :RTICA;
        if (CREDITO IS NULL) then
            CREDITO = 0;
        if (rtfte IS NULL) then
            rtfte = 0;
        if (rtiva IS NULL) then
            rtiva = 0;
        if (rtica IS NULL) then
            rtica = 0;
        IF (RETES = 'SI') then
            CREDITO = CREDITO - RTFTE - RTIVA - RTICA;
        CARGOS2 = DEBITO - CREDITO;
 $$IBE$$*/ /*        SELECT SUM(MVCL_MONTO), SUM(MVCL_RTEFTE), SUM(MVCL_RTEIVA), SUM(MVCL_RTEICA)  FROM movimiento_clientes WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI
            AND MVCL_FECHA < :FECFIN AND MVCL_DEBITO = 'S' AND MVCL_ABONO = 'S' AND ((:SUCURSAL = 0) or (SUCU_ID = :SUCURSAL))
            INTO :DEBITO, :RTFTE, :RTIVA, :RTICA;
        if (DEBITO IS NULL) then
            DEBITO = 0;
        IF (RETES = 'NO') then
            DEBITO = DEBITO + RTFTE + RTIVA + RTICA; */ /*$$IBE$$ 
        SELECT SUM(MVCL_MONTO), SUM(MVCL_RTEFTE), SUM(MVCL_RTEIVA), SUM(MVCL_RTEICA)  FROM movimiento_clientes WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI
            AND MVCL_FECHA < :FECFIN AND MVCL_DEBITO = 'N'  AND MVCL_ABONO = 'S' AND ((:SUCURSAL = 0) or (SUCU_ID = :SUCURSAL))
            INTO :CREDITO, :RTFTE, :RTIVA, :RTICA;
        if (CREDITO IS NULL) then
            CREDITO = 0;
        if (rtfte IS NULL) then
            rtfte = 0;
        if (rtiva IS NULL) then
            rtiva = 0;
        if (rtica IS NULL) then
            rtica = 0;
        IF (RETES = 'NO') then
            CREDITO = CREDITO + RTFTE + RTIVA + RTICA;
        ABONOS2 = CREDITO;
        FECINI = FECFIN;
        FECFIN = FECINI + 30;
        SELECT SUM(MVCL_MONTO), SUM(MVCL_RTEFTE), SUM(MVCL_RTEIVA), SUM(MVCL_RTEICA)  FROM movimiento_clientes WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI
            AND MVCL_FECHA < :FECFIN AND MVCL_DEBITO = 'S' AND MVCL_ABONO = 'N' AND ((:SUCURSAL = 0) or (SUCU_ID = :SUCURSAL))
            INTO :DEBITO, :RTFTE, :RTIVA, :RTICA;
        if (DEBITO IS NULL) then
            DEBITO = 0;
        if (rtfte IS NULL) then
            rtfte = 0;
        if (rtiva IS NULL) then
            rtiva = 0;
        if (rtica IS NULL) then
            rtica = 0;
        IF (RETES = 'SI') then
            DEBITO = DEBITO - RTFTE - RTIVA - RTICA;
        SELECT SUM(MVCL_MONTO), SUM(MVCL_RTEFTE), SUM(MVCL_RTEIVA), SUM(MVCL_RTEICA)  FROM movimiento_clientes WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI
            AND MVCL_FECHA < :FECFIN AND MVCL_DEBITO = 'N'  AND MVCL_ABONO = 'N' AND ((:SUCURSAL = 0) or (SUCU_ID = :SUCURSAL))
            INTO :CREDITO, :RTFTE, :RTIVA, :RTICA;
        if (CREDITO IS NULL) then
            CREDITO = 0;
        if (rtfte IS NULL) then
            rtfte = 0;
        if (rtiva IS NULL) then
            rtiva = 0;
        if (rtica IS NULL) then
            rtica = 0;
        IF (RETES = 'SI') then
            CREDITO = CREDITO - RTFTE - RTIVA - RTICA;
        CARGOS1 = DEBITO - CREDITO;
 $$IBE$$*/ /*        SELECT SUM(MVCL_MONTO), SUM(MVCL_RTEFTE), SUM(MVCL_RTEIVA), SUM(MVCL_RTEICA)  FROM movimiento_clientes WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI
            AND MVCL_FECHA < :FECFIN AND MVCL_DEBITO = 'S' AND MVCL_ABONO = 'S' AND ((:SUCURSAL = 0) or (SUCU_ID = :SUCURSAL))
            INTO :DEBITO, :RTFTE, :RTIVA, :RTICA;
        if (DEBITO IS NULL) then
            DEBITO = 0;
        IF (RETES = 'NO') then
            DEBITO = DEBITO + RTFTE + RTIVA + RTICA; */ /*$$IBE$$ 
        SELECT SUM(MVCL_MONTO), SUM(MVCL_RTEFTE), SUM(MVCL_RTEIVA), SUM(MVCL_RTEICA)  FROM movimiento_clientes WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI
            AND MVCL_FECHA < :FECFIN AND MVCL_DEBITO = 'N'  AND MVCL_ABONO = 'S' AND ((:SUCURSAL = 0) or (SUCU_ID = :SUCURSAL))
            INTO :CREDITO, :RTFTE, :RTIVA, :RTICA;
        if (CREDITO IS NULL) then
            CREDITO = 0;
        if (rtfte IS NULL) then
            rtfte = 0;
        if (rtiva IS NULL) then
            rtiva = 0;
        if (rtica IS NULL) then
            rtica = 0;
        IF (RETES = 'NO') then
            CREDITO = CREDITO + RTFTE + RTIVA + RTICA;
        ABONOS1 = CREDITO;
        FINAL = INICIAL + CARGOS3 + CARGOS2 + CARGOS1 + ABONOS3 + ABONOS2 + ABONOS1;
        SUSPEND;
        END

    if (AGRUPA = 'C') then
        BEGIN
        CARGOS1 = 0;
        ABONOS1 = 0;
        CARGOS2 = 0;
        ABONOS2 = 0;
        CARGOS3 = 0;
        ABONOS3 = 0;
        INICIAL = 0;
        for select distinct cobr_cod from movimiento_clientes
            WHERE TERC_NIT = :NIT AND MVCL_FECHA <= :FECINI AND
            MVCL_ABONO = 'N' AND ((:SUCURSAL = 0) or (SUCU_ID = :SUCURSAL))
            into :codcobr
            do
            BEGIN
            OK = 'N';
            if (GRPINI = '') then
                BEGIN
                if ((CODCOBR IS NULL) or (CODCOBR >= :GRPINI AND CODCOBR <= :GRPFIN)) then
                    OK = 'S';
                END
            ELSE
                if (CODCOBR >= :GRPINI AND CODCOBR <= :GRPFIN) then
                    OK = 'S';
            if (OK = 'S') then
                begin
                SELECT COBR_NOM FROM COBRADORES WHERE COBR_COD = :codcobr INTO :nomcobr;
                FOR SELECT MVCL_TIPOREF, MVCL_IDREF FROM MOVIMIENTO_CLIENTES
                    WHERE TERC_NIT = :NIT AND MVCL_FECHA <= :FECINI AND COBR_COD = :codcobr AND
                    MVCL_ABONO = 'N' AND ((:SUCURSAL = 0) or (SUCU_ID = :SUCURSAL))
                    INTO :TIPODOC, :IDDOC
                    DO
                    BEGIN
                    EXECUTE PROCEDURE saldo_doc_cartera(TIPODOC, IDDOC, FECINI) returning_values (SALDO);
                    INICIAL = INICIAL + SALDO;
                    END
                FECFIN = FECINI + 30;
                SELECT SUM(MVCL_MONTO), SUM(MVCL_RTEFTE), SUM(MVCL_RTEIVA), SUM(MVCL_RTEICA) FROM movimiento_clientes WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND
                    MVCL_FECHA < :FECFIN AND MVCL_DEBITO = 'S' AND MVCL_ABONO = 'N' AND COBR_COD = :codcobr AND ((:SUCURSAL = 0) or (SUCU_ID = :SUCURSAL))
                    INTO :DEBITO, :RTFTE, :RTIVA, :RTICA;
                if (DEBITO IS NULL) then
                    DEBITO = 0;
                if (rtfte IS NULL) then
                    rtfte = 0;
                if (rtiva IS NULL) then
                    rtiva = 0;
                if (rtica IS NULL) then
                    rtica = 0;
                IF (RETES = 'SI') then
                    DEBITO = DEBITO - RTFTE - RTIVA - RTICA;
                SELECT SUM(MVCL_MONTO), SUM(MVCL_RTEFTE), SUM(MVCL_RTEIVA), SUM(MVCL_RTEICA) FROM movimiento_clientes WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI
                    AND MVCL_FECHA < :FECFIN AND MVCL_DEBITO = 'N'  AND MVCL_ABONO = 'N' AND COBR_COD = :codcobr AND ((:SUCURSAL = 0) or (SUCU_ID = :SUCURSAL))
                    INTO :CREDITO, :RTFTE, :RTIVA, :RTICA;
                if (CREDITO IS NULL) then
                    CREDITO = 0;
                if (rtfte IS NULL) then
                    rtfte = 0;
                if (rtiva IS NULL) then
                    rtiva = 0;
                if (rtica IS NULL) then
                    rtica = 0;
                IF (RETES = 'SI') then
                    CREDITO = CREDITO - RTFTE - RTIVA - RTICA;
                CARGOS3 = DEBITO - CREDITO;
 $$IBE$$*/ /*                SELECT SUM(MVCL_MONTO), SUM(MVCL_RTEFTE), SUM(MVCL_RTEIVA), SUM(MVCL_RTEICA) FROM movimiento_clientes WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI
                    AND MVCL_FECHA < :FECFIN AND MVCL_DEBITO = 'S' AND MVCL_ABONO = 'S' AND COBR_COD = :codcobr AND ((:SUCURSAL = 0) or (SUCU_ID = :SUCURSAL))
                    INTO :DEBITO, :RTFTE, :RTIVA, :RTICA;
                if (DEBITO IS NULL) then
                    DEBITO = 0;
                IF (RETES = 'NO') then
                    DEBITO = DEBITO + RTFTE + RTIVA + RTICA; */ /*$$IBE$$ 
                SELECT SUM(MVCL_MONTO), SUM(MVCL_RTEFTE), SUM(MVCL_RTEIVA), SUM(MVCL_RTEICA) FROM movimiento_clientes WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI
                    AND MVCL_FECHA < :FECFIN AND MVCL_DEBITO = 'N' AND MVCL_ABONO = 'S' AND COBR_COD = :codcobr AND ((:SUCURSAL = 0) or (SUCU_ID = :SUCURSAL))
                    INTO :CREDITO, :RTFTE, :RTIVA, :RTICA;
                if (CREDITO IS NULL) then
                    CREDITO = 0;
                if (rtfte IS NULL) then
                    rtfte = 0;
                if (rtiva IS NULL) then
                    rtiva = 0;
                if (rtica IS NULL) then
                    rtica = 0;
                IF (RETES = 'NO') then
                    CREDITO = CREDITO + RTFTE + RTIVA + RTICA;
                ABONOS3 = CREDITO;
                FECINI = FECFIN;
                FECFIN = FECINI + 30;
                SELECT SUM(MVCL_MONTO), SUM(MVCL_RTEFTE), SUM(MVCL_RTEIVA), SUM(MVCL_RTEICA) FROM movimiento_clientes WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI
                    AND MVCL_FECHA < :FECFIN AND MVCL_DEBITO = 'S' AND MVCL_ABONO = 'N' AND COBR_COD = :codcobr AND ((:SUCURSAL = 0) or (SUCU_ID = :SUCURSAL))
                    INTO :DEBITO, :RTFTE, :RTIVA, :RTICA;
                if (DEBITO IS NULL) then
                    DEBITO = 0;
                if (rtfte IS NULL) then
                    rtfte = 0;
                if (rtiva IS NULL) then
                    rtiva = 0;
                if (rtica IS NULL) then
                    rtica = 0;
                IF (RETES = 'SI') then
                    DEBITO = DEBITO - RTFTE - RTIVA - RTICA;
                SELECT SUM(MVCL_MONTO), SUM(MVCL_RTEFTE), SUM(MVCL_RTEIVA), SUM(MVCL_RTEICA) FROM movimiento_clientes WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI
                    AND MVCL_FECHA < :FECFIN AND MVCL_DEBITO = 'N'  AND MVCL_ABONO = 'N' AND COBR_COD = :codcobr AND ((:SUCURSAL = 0) or (SUCU_ID = :SUCURSAL))
                    INTO :CREDITO, :RTFTE, :RTIVA, :RTICA;
                if (CREDITO IS NULL) then
                    CREDITO = 0;
                if (rtfte IS NULL) then
                    rtfte = 0;
                if (rtiva IS NULL) then
                    rtiva = 0;
                if (rtica IS NULL) then
                    rtica = 0;
                IF (RETES = 'SI') then
                    CREDITO = CREDITO - RTFTE - RTIVA - RTICA;
                CARGOS2 = DEBITO - CREDITO;
 $$IBE$$*/ /*                SELECT SUM(MVCL_MONTO), SUM(MVCL_RTEFTE), SUM(MVCL_RTEIVA), SUM(MVCL_RTEICA) FROM movimiento_clientes WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI
                    AND MVCL_FECHA < :FECFIN AND MVCL_DEBITO = 'S' AND MVCL_ABONO = 'S' AND COBR_COD = :codcobr AND ((:SUCURSAL = 0) or (SUCU_ID = :SUCURSAL))
                    INTO :DEBITO, :RTFTE, :RTIVA, :RTICA;
                if (DEBITO IS NULL) then
                    DEBITO = 0;
                IF (RETES = 'NO') then
                    DEBITO = DEBITO + RTFTE + RTIVA + RTICA; */ /*$$IBE$$ 
                SELECT SUM(MVCL_MONTO), SUM(MVCL_RTEFTE), SUM(MVCL_RTEIVA), SUM(MVCL_RTEICA) FROM movimiento_clientes WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI
                    AND MVCL_FECHA < :FECFIN AND MVCL_DEBITO = 'N'  AND MVCL_ABONO = 'S' AND COBR_COD = :codcobr AND ((:SUCURSAL = 0) or (SUCU_ID = :SUCURSAL))
                    INTO :CREDITO, :RTFTE, :RTIVA, :RTICA;
                if (CREDITO IS NULL) then
                    CREDITO = 0;
                if (rtfte IS NULL) then
                    rtfte = 0;
                if (rtiva IS NULL) then
                    rtiva = 0;
                if (rtica IS NULL) then
                    rtica = 0;
                IF (RETES = 'NO') then
                    CREDITO = CREDITO + RTFTE + RTIVA + RTICA;
                ABONOS2 = CREDITO;
                FECINI = FECFIN;
                FECFIN = FECINI + 30;
                SELECT SUM(MVCL_MONTO), SUM(MVCL_RTEFTE), SUM(MVCL_RTEIVA), SUM(MVCL_RTEICA) FROM movimiento_clientes WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI
                    AND MVCL_FECHA < :FECFIN AND MVCL_DEBITO = 'S' AND MVCL_ABONO = 'N' AND COBR_COD = :codcobr AND ((:SUCURSAL = 0) or (SUCU_ID = :SUCURSAL))
                    INTO :DEBITO, :RTFTE, :RTIVA, :RTICA;
                if (DEBITO IS NULL) then
                    DEBITO = 0;
                if (rtfte IS NULL) then
                    rtfte = 0;
                if (rtiva IS NULL) then
                    rtiva = 0;
                if (rtica IS NULL) then
                    rtica = 0;
                IF (RETES = 'SI') then
                    DEBITO = DEBITO - RTFTE - RTIVA - RTICA;
                SELECT SUM(MVCL_MONTO), SUM(MVCL_RTEFTE), SUM(MVCL_RTEIVA), SUM(MVCL_RTEICA) FROM movimiento_clientes WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI
                    AND MVCL_FECHA < :FECFIN AND MVCL_DEBITO = 'N'  AND MVCL_ABONO = 'N' AND COBR_COD = :codcobr AND ((:SUCURSAL = 0) or (SUCU_ID = :SUCURSAL))
                    INTO :CREDITO, :RTFTE, :RTIVA, :RTICA;
                if (CREDITO IS NULL) then
                    CREDITO = 0;
                if (rtfte IS NULL) then
                    rtfte = 0;
                if (rtiva IS NULL) then
                    rtiva = 0;
                if (rtica IS NULL) then
                    rtica = 0;
                IF (RETES = 'SI') then
                    CREDITO = CREDITO - RTFTE - RTIVA - RTICA;
                CARGOS1 = DEBITO - CREDITO;
 $$IBE$$*/ /*                SELECT SUM(MVCL_MONTO), SUM(MVCL_RTEFTE), SUM(MVCL_RTEIVA), SUM(MVCL_RTEICA) FROM movimiento_clientes WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI
                    AND MVCL_FECHA < :FECFIN AND MVCL_DEBITO = 'S' AND MVCL_ABONO = 'S' AND COBR_COD = :codcobr AND ((:SUCURSAL = 0) or (SUCU_ID = :SUCURSAL))
                    INTO :DEBITO, :RTFTE, :RTIVA, :RTICA;
                if (DEBITO IS NULL) then
                    DEBITO = 0;
                IF (RETES = 'NO') then
                    DEBITO = DEBITO + RTFTE + RTIVA + RTICA; */ /*$$IBE$$ 
                SELECT SUM(MVCL_MONTO), SUM(MVCL_RTEFTE), SUM(MVCL_RTEIVA), SUM(MVCL_RTEICA) FROM movimiento_clientes WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI
                    AND MVCL_FECHA < :FECFIN AND MVCL_DEBITO = 'N'  AND MVCL_ABONO = 'S' AND COBR_COD = :codcobr AND ((:SUCURSAL = 0) or (SUCU_ID = :SUCURSAL))
                    INTO :CREDITO, :RTFTE, :RTIVA, :RTICA;
                if (CREDITO IS NULL) then
                    CREDITO = 0;
                if (rtfte IS NULL) then
                    rtfte = 0;
                if (rtiva IS NULL) then
                    rtiva = 0;
                if (rtica IS NULL) then
                    rtica = 0;
                IF (RETES = 'NO') then
                    CREDITO = CREDITO + RTFTE + RTIVA + RTICA;
                ABONOS1 = CREDITO;
                FINAL = INICIAL + CARGOS3 + CARGOS2 + CARGOS1 - ABONOS3 - ABONOS2 - ABONOS1;
                SUSPEND;
                END
            END
        END
    END
 $$IBE$$*/ SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE REP_ANALISIS_CARTERA(
    DESDE VARCHAR(20),
    HASTA VARCHAR(20),
    GRPINI VARCHAR(5),
    GRPFIN VARCHAR(5),
    FECHA DATE,
    DETALLE CHAR(1),
    ORDEN CHAR(1),
    AGRUPA CHAR(1),
    DIASR INTEGER,
    SUBEMPRESA INTEGER,
    GRUPCART INTEGER,
    EXTENDIDA CHAR(1))
RETURNS (
    NIT VARCHAR(20),
    NOMBRE VARCHAR(60),
    TELEFONO VARCHAR(40),
    CIUDAD VARCHAR(40),
    CONTACTO VARCHAR(60),
    EMAIL VARCHAR(100),
    FAX VARCHAR(25),
    CEL VARCHAR(25),
    CODCLI VARCHAR(20),
    CODZONA VARCHAR(2),
    NOMZONA VARCHAR(60),
    CODCOBR INTEGER,
    NOMCOBR VARCHAR(60),
    DV CHAR(1),
    CODCIUD CHAR(5),
    NOMCIUD VARCHAR(60),
    SUCURSAL VARCHAR(10),
    NOMSUC VARCHAR(60),
    TIPO INTEGER,
    ID INTEGER,
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(6),
    DIAS INTEGER,
    SALDO NUMERIC(18,2),
    CORRIENTE NUMERIC(18,2),
    CERO NUMERIC(18,2),
    TREINTA NUMERIC(18,2),
    SESENTA NUMERIC(18,2),
    NOVENTA NUMERIC(18,2),
    CIENTOCHENTA NUMERIC(18,2),
    DOSSETENTA NUMERIC(18,2),
    TRESSESENTA NUMERIC(18,2),
    PROVISIONAL NUMERIC(18,2),
    TIPONOM VARCHAR(8),
    FECDOC DATE,
    VENCE DATE,
    CUPO NUMERIC(18,2),
    DISPONIBLE NUMERIC(18,2),
    OBS BLOB SUB_TYPE 0 SEGMENT SIZE 80,
    GRUPCOD INTEGER,
    DIA_CAR INTEGER,
    GRUPNOM VARCHAR(30))
AS
DECLARE VARIABLE NITINI VARCHAR(20);
DECLARE VARIABLE NITFIN VARCHAR(20);
DECLARE VARIABLE NOMINI VARCHAR(20);
DECLARE VARIABLE NOMFIN VARCHAR(20);
DECLARE VARIABLE RTFTE NUMERIC(18,2);
DECLARE VARIABLE RTIVA NUMERIC(18,2);
DECLARE VARIABLE RTICA NUMERIC(18,2);
DECLARE VARIABLE VENCIMIENTO VARCHAR(12);
DECLARE VARIABLE OK CHAR(1);
declare variable AUTORET VARCHAR(10);
declare variable FAUTORET DATE;
declare variable INCLANTI CHAR(2);
declare variable descnt_prov char(2);
declare variable MAXDIAS INTEGER;
BEGIN /*$$IBE$$ 
if (ORDEN = 'C') then
    BEGIN
    NITINI = DESDE;
    NITFIN = HASTA;
    NOMINI = '';
    NOMFIN = 'zz';
    END
ELSE
    BEGIN
    NOMINI = DESDE;
    NOMFIN = HASTA;
    NITINI = '';
    NITFIN = 'zz';
    END
   $$IBE$$*/ /* Ubique el NIT */ /*$$IBE$$ 
EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'FECHA AUTORETENEDOR NO DESCONTAR RETENCIONES DEL SALDO PERO SI CONTABILIZARLAS') returning_values (AUTORET);
if (AUTORET <> '') then
    FAUTORET = CAST(AUTORET AS DATE);
else
    FAUTORET = '9999/12/31';
EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'ANALISIS DE CARTERA CON FECHA FACTURA O VENCIMIENTO') returning_values (VENCIMIENTO);
EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'INCLUIR ANTICIPOS DE CLIENTES EN REPORTES Y CONSULTAS DE CARTERA') returning_values (INCLANTI);
EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'DESCONTAR RECIBOS PROVISIONALES EN INFORMES DE CARTERA') RETURNING_VALUES (:descnt_prov);

FOR select T.TERC_NIT, TERC_NOM, TERC_DV, CLSU_TEL, CLSU_CIUDAD, S.COBR_COD, S.ZONA_COD, T.CIUD_COD, CLIE_CUPO, CLIE_DIAS, CLCU_COD, CLSU_NOMBRE, t.terc_obs, C.GRCA_COD, TERC_CONTACTO, TERC_EMAIL, TERC_FAX, TERC_CEL, CLIE_COD
    from terceros T, CLIENTES C, CLIENTE_SUCURSALES S
    where C.TERC_NIT = T.TERC_NIT AND TERC_CLIE = 'S' AND S.TERC_NIT = C.TERC_NIT and T.TERC_NIT >= :NITINI AND T.TERC_NIT <= :NITFIN AND
        T.TERC_NOM >= :NOMINI AND T.TERC_NOM <= :NOMFIN AND ((:GRUPCART = 0) or (C.GRCA_COD = :GRUPCART))
    INTO :NIT, :NOMBRE, :DV, :TELEFONO, :CIUDAD, :CODCOBR, :CODZONA, :CODCIUD, :CUPO, :DIA_CAR,  :SUCURSAL, :NOMSUC, :obs, :GRUPCOD, :CONTACTO, :EMAIL, :FAX, :CEL, :CODCLI
    DO  
    BEGIN
    SELECT COBR_NOM FROM COBRADORES CB WHERE COBR_COD = :CODCOBR INTO :NOMCOBR;
    SELECT ZONA_NOM FROM ZONAS Z WHERE ZONA_COD = :CODZONA INTO :NOMZONA;
    SELECT CIUD_NOM FROM CIUDADES WHERE CIUD_COD = :CODCIUD INTO :NOMCIUD;
    SELECT GRCA_NOMBRE FROM GRUPO_CARTERA WHERE GRCA_COD = :GRUPCOD INTO :GRUPNOM;
    provisional = 0;
    MAXDIAS = 0;
    OK = 'N';
    if (AGRUPA = 'Z') then
        BEGIN
        if (GRPINI = '') then
            BEGIN
            if ((CODZONA IS NULL) or (CODZONA >= :GRPINI AND CODZONA <= :GRPFIN)) then
                OK = 'S';
            END
        ELSE
            if (CODZONA >= :GRPINI AND CODZONA <= :GRPFIN) then
                OK = 'S';
        END
    if (AGRUPA = 'I') then
        BEGIN
        if (GRPINI = '') then
            BEGIN
            if ((CODCIUD IS NULL) or (CODCIUD >= :GRPINI AND CODCIUD <= :GRPFIN)) then
                OK = 'S';
            END
        ELSE
            if (CODCIUD >= :GRPINI AND CODCIUD <= :GRPFIN) then
                OK = 'S';
        END
    if (AGRUPA = 'N') then
        OK = 'S';
    if (OK = 'S') then
        BEGIN
        DISPONIBLE = CUPO;
        CORRIENTE = 0;
        CERO = 0;
        TREINTA = 0;
        SESENTA = 0;
        NOVENTA = 0;
        CIENTOCHENTA = 0;
        DOSSETENTA = 0;
        TRESSESENTA = 0;
         $$IBE$$*/ /* BUSQUE EN SALDOS_DOC_CARTERA LOS QUE TENGAN SALDO > 0 */ /*$$IBE$$ 
        FOR SELECT MVCL_TIPOREF, MVCL_IDREF, MVCL_PREFREF, MVCL_NUMREF, MVCL_FECHA, MVCL_VENCE
            FROM MOVIMIENTO_CLIENTES
            WHERE TERC_NIT = :NIT AND MVCL_SUCURSAL = :SUCURSAL AND MVCL_FECHA <= :FECHA
                AND MVCL_ABONO = 'N' AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA))
            INTO :TIPO, :ID, :PREFIJO, :NUMERO, :FECDOC, :VENCE
            DO
            BEGIN
            if ((inclanti = 'SI') or (TIPO <> 45)) then
                BEGIN
                EXECUTE PROCEDURE saldo_doc_cartera(TIPO, ID, FECHA) returning_values (SALDO);
                if (SALDO <> 0) then
                    BEGIN
                    DISPONIBLE = DISPONIBLE - SALDO;
                    SELECT TIDO_NOMCORTO FROM TIPO_DOCUMENTO WHERE TIDO_COD = :TIPO INTO :TIPONOM;

                    SELECT SUM(SDCA_RTFTE - SDCA_ABRTFTE), SUM(SDCA_RTIVA - SDCA_ABRTIVA), SUM(SDCA_RTICA - SDCA_ABRTICA)
                        FROM SALDOS_DOC_CARTERA WHERE SDCA_TIPOREF = :TIPO AND SDCA_IDREF = :ID
                        INTO :RTFTE, :RTIVA, :RTICA;
                    if (RTFTE IS NULL) then
                        RTFTE = 0;
                    if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) THEN
                        BEGIN
                        if (RTFTE > 0) then
                            RTFTE = 0;
                        END
                    ELSE
                        BEGIN
                        if (RTFTE < 0) then
                            RTFTE = 0;
                        END
                    if (FAUTORET <= FECDOC) then
                        RTFTE = 0;
                    if (RTIVA IS NULL) then
                        RTIVA = 0;
                    if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) THEN
                        BEGIN
                        if (RTIVA > 0) then
                            RTIVA = 0;
                        END
                    ELSE
                        BEGIN
                        if (RTIVA < 0) then
                            RTIVA = 0;
                        END
                    if (RTICA IS NULL) then
                        RTICA = 0;
                    if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) THEN
                        BEGIN
                        if (RTICA > 0) then
                            RTICA = 0;
                        END
                    ELSE
                        BEGIN
                        if (RTICA < 0) then
                            RTICA = 0;
                        END
                     $$IBE$$*/ /* AHORA CLASIFIQUE LOS DIAS */ /*$$IBE$$ 
                    if (VENCIMIENTO = 'FECHA') then
                        DIAS = FECHA - FECDOC;
                    ELSE
                        DIAS = FECHA - VENCE;
                    if (MAXDIAS < DIAS) then
                        MAXDIAS = DIAS;
                    if (DETALLE = 'S') then
                        BEGIN
                        CORRIENTE = 0;
                        CERO = 0;
                        TREINTA = 0;
                        SESENTA = 0;
                        NOVENTA = 0;
                        CIENTOCHENTA = 0;
                        DOSSETENTA = 0;
                        tressesenta = 0;
                        END
                    if (DIAS < 0) then
                        CORRIENTE = CORRIENTE + SALDO;
                    ELSE
                        if (DIAS < DIASR) then
                            CERO = CERO + SALDO;
                        ELSE
                            if (DIAS < (DIASR * 2)) then
                                TREINTA = TREINTA + SALDO;
                            ELSE
                                if (DIAS < (DIASR * 3)) then
                                    SESENTA = SESENTA + SALDO;
                                ELSE
                                    BEGIN
                                    if (EXTENDIDA = 'N') then
                                        NOVENTA = NOVENTA + SALDO;
                                    else    
                                        BEGIN
                                        if (DIAS < (DIASR * 3) * 2) then
                                            NOVENTA = NOVENTA + SALDO;
                                        ELSE
                                            if (DIAS < (DIASR * 3) * 3) then
                                                CIENTOCHENTA = CIENTOCHENTA + SALDO;
                                            ELSE
                                                if (DIAS < (DIASR * 3) * 4) then
                                                    dossetenta = dossetenta + SALDO;
                                            ELSE
                                                tressesenta = tressesenta + SALDO;
                                        END
                                    END
                    if (DETALLE = 'S') then
                        SUSPEND;
                    END  $$IBE$$*/ /* SALDO */ /*$$IBE$$ 
                END  $$IBE$$*/ /* NO ANTICIPO */ /*$$IBE$$ 
            END  $$IBE$$*/ /* FOR MOV_CLI */
        /* AGREGUE LOS RECIBOS PROVISIONALES CON SIGNO NEGATIVO */ /*$$IBE$$ 
        FOR SELECT 65, MAX(P.RCPR_ID), MAX(PREF_PRE), MAX(RCPR_NUMERO), MAX(RCPR_FECHA), SUM(RPDE_ABONO * -1), SUM(RPDE_RTFTE*-1), SUM(RPDE_RTIVA*-1), SUM(RPDE_RTICA*-1)
            FROM RECIBO_PROVISIONAL P, recibo_provisional_detalle D
            WHERE P.rcpr_id = D.rcpr_id AND P.TERC_NIT = :NIT AND D.RPDE_SUCURSAL = :SUCURSAL AND P.RCPR_FECHA <= :FECHA AND P.RCPR_ANULADO = 'N' AND
            ((RCPR_FECCRUCE IS NULL) or (RCPR_FECCRUCE > :FECHA)) AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA))
            GROUP BY P.rcpr_id
            INTO :TIPO, :ID, :PREFIJO, :NUMERO, :FECDOC, :PROVISIONAL, :rtfte,  :RTIVA, :RTICA
            DO
            BEGIN
            if (:descnt_prov = 'NO') then
              SALDO = 0;
            else
              SALDO = :PROVISIONAL;
            SELECT TIDO_NOMCORTO FROM TIPO_DOCUMENTO WHERE TIDO_COD = :TIPO INTO :TIPONOM;
             $$IBE$$*/ /* CALCULE EL VENCIMIENTO DEL ULTIMO DOCUMENTO POSFECHADO */ /*$$IBE$$ 
            SELECT MAX(RPPA_FECHA) FROM recibo_provisional_pago WHERE RCPR_ID = :ID INTO :VENCE;
            DIAS = VENCE - FECHA;
            if (DETALLE = 'S') then
                BEGIN
                CORRIENTE = 0;
                CERO = 0;
                TREINTA = 0;
                SESENTA = 0;
                NOVENTA = 0;
                CIENTOCHENTA = 0;
                DOSSETENTA = 0;
                tressesenta = 0;
                END
            if (DIAS < 0) then
                CORRIENTE = CORRIENTE + SALDO;
            ELSE
                if (DIAS < DIASR) then
                    CERO = CERO + SALDO;
                ELSE
                    if (DIAS < (DIASR * 2)) then
                        TREINTA = TREINTA + SALDO;
                    ELSE
                        if (DIAS < (DIASR * 3)) then
                            SESENTA = SESENTA + SALDO;
                        ELSE
                            BEGIN
                            if (EXTENDIDA = 'N') then
                                NOVENTA = NOVENTA + SALDO;
                            else
                                BEGIN
                                if (DIAS < (DIASR * 3) * 2) then
                                    CIENTOCHENTA = CIENTOCHENTA + SALDO;
                                ELSE
                                    if (DIAS < (DIASR * 3) * 3) then
                                        DOSSETENTA = DOSSETENTA + SALDO;
                                    ELSE
                                        TRESSESENTA = TRESSESENTA + SALDO;
                                END
                            END
            if (DETALLE = 'S') then
                SUSPEND;
            END
        if (DETALLE = 'N') then
            begin
            SALDO = CORRIENTE + CERO + TREINTA + SESENTA + NOVENTA;
            DIAS = MAXDIAS;
            SUSPEND;
            end
        END
    if (AGRUPA = 'C') then
        BEGIN
        FOR SELECT DISTINCT COBR_COD FROM MOVIMIENTO_CLIENTES
            WHERE TERC_NIT = :NIT AND MVCL_SUCURSAL = :SUCURSAL AND MVCL_FECHA <= :FECHA
                AND MVCL_ABONO = 'N' AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA))
            INTO :codcobr
            DO
            BEGIN
            OK = 'N';
            if (GRPINI = '') then
                BEGIN
                if ((CODCOBR IS NULL) or (CODCOBR >= :GRPINI AND CODCOBR <= :GRPFIN)) then
                    OK = 'S';
                END
            ELSE
                if (CODCOBR >= :GRPINI AND CODCOBR <= :GRPFIN) then
                    OK = 'S';
            if (OK = 'S') then
                BEGIN
                DISPONIBLE = CUPO;
                CORRIENTE = 0;
                CERO = 0;
                TREINTA = 0;
                SESENTA = 0;
                NOVENTA = 0;
                CIENTOCHENTA = 0;
                DOSSETENTA = 0;
                tressesenta = 0;
                SELECT COBR_NOM FROM COBRADORES WHERE COBR_COD = :codcobr INTO :nomcobr;
                 $$IBE$$*/ /* BUSQUE EN SALDOS_DOC_CARTERA LOS QUE TENGAN SALDO > 0 */ /*$$IBE$$ 
                FOR SELECT MVCL_TIPOREF, MVCL_IDREF, MVCL_PREFREF, MVCL_NUMREF, MVCL_FECHA, MVCL_VENCE
                    FROM MOVIMIENTO_CLIENTES
                    WHERE TERC_NIT = :NIT AND COBR_COD = :CODCOBR AND MVCL_SUCURSAL = :SUCURSAL AND MVCL_FECHA <= :FECHA
                        AND MVCL_ABONO = 'N' AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA))
                    INTO :TIPO, :ID, :PREFIJO, :NUMERO, :FECDOC, :VENCE
                    DO
                    BEGIN
                    if ((inclanti = 'SI') or (TIPO <> 45)) then
                        BEGIN
                        EXECUTE PROCEDURE saldo_doc_cartera(TIPO, ID, FECHA) returning_values (SALDO);
                        if (SALDO <> 0) then
                            BEGIN
                            DISPONIBLE = DISPONIBLE - SALDO;
                            SELECT TIDO_NOMCORTO FROM TIPO_DOCUMENTO WHERE TIDO_COD = :TIPO INTO :TIPONOM;
                            SELECT SUM(SDCA_RTFTE - SDCA_ABRTFTE), SUM(SDCA_RTIVA - SDCA_ABRTIVA), SUM(SDCA_RTICA - SDCA_ABRTICA)
                                FROM SALDOS_DOC_CARTERA WHERE SDCA_TIPOREF = :TIPO AND SDCA_IDREF = :ID
                                INTO :RTFTE, :RTIVA, :RTICA;
                            if (RTFTE IS NULL) then
                                RTFTE = 0;
                            if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) THEN
                                BEGIN
                                if (RTFTE > 0) then
                                    RTFTE = 0;
                                END
                            ELSE
                                BEGIN
                                if (RTFTE < 0) then
                                    RTFTE = 0;
                                END
                            if (FAUTORET <= FECDOC) then
                                RTFTE = 0;
                            if (RTIVA IS NULL) then
                                RTIVA = 0;
                            if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) THEN
                                BEGIN
                                if (RTIVA > 0) then
                                    RTIVA = 0;
                                END
                            ELSE
                                BEGIN
                                if (RTIVA < 0) then
                                    RTIVA = 0;
                                END
                            if (RTICA IS NULL) then
                                RTICA = 0;
                            if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) THEN
                                BEGIN
                                if (RTICA > 0) then
                                    RTICA = 0;
                                END
                            ELSE
                                BEGIN
                                if (RTICA < 0) then
                                    RTICA = 0;
                                END
                             $$IBE$$*/ /* AHORA CLASIFIQUE LOS DIAS */ /*$$IBE$$ 
                            if (VENCIMIENTO = 'FECHA') then
                                DIAS = FECHA - FECDOC;
                            ELSE
                                DIAS = FECHA - VENCE;
                            if (MAXDIAS < DIAS) then
                                MAXDIAS = DIAS;
                            if (DETALLE = 'S') then
                                BEGIN
                                CORRIENTE = 0;
                                CERO = 0;
                                TREINTA = 0;
                                SESENTA = 0;
                                NOVENTA = 0;
                                CIENTOCHENTA = 0;
                                DOSSETENTA = 0;
                                tressesenta = 0;
                                END
                            if (DIAS < 0) then
                                CORRIENTE = CORRIENTE + SALDO;
                            ELSE
                                if (DIAS < DIASR) then
                                    CERO = CERO + SALDO;
                                ELSE
                                    if (DIAS < (DIASR * 2)) then
                                        TREINTA = TREINTA + SALDO;
                                    ELSE
                                        if (DIAS < (DIASR * 3)) then
                                            SESENTA = SESENTA + SALDO;
                                        ELSE
                                            BEGIN
                                            if (EXTENDIDA = 'N') then
                                                NOVENTA = NOVENTA + SALDO;
                                            else    
                                                BEGIN
                                                if (DIAS < (DIASR * 3) * 2) then
                                                    CIENTOCHENTA = CIENTOCHENTA + SALDO;
                                                ELSE
                                                    if (DIAS < (DIASR * 3) * 3) then
                                                        DOSSETENTA = DOSSETENTA + SALDO;
                                                    ELSE
                                                        TRESSESENTA = TRESSESENTA + SALDO;
                                                END
                                            END
                            if (DETALLE = 'S') then
                                SUSPEND;
                            END  $$IBE$$*/ /* SALDO <>  0 */ /*$$IBE$$ 
                        END  $$IBE$$*/ /* NO ANTICIPO */ /*$$IBE$$ 
                    END  $$IBE$$*/ /* FOR MOV_CLI */
                /* AGREGUE LOS RECIBOS PROVISIONALES CON SIGNO NEGATIVO */ /*$$IBE$$ 
                FOR SELECT 65, MAX(P.RCPR_ID), MAX(PREF_PRE), MAX(RCPR_NUMERO), MAX(RCPR_FECHA), SUM(RPDE_ABONO * -1), SUM(RPDE_RTFTE*-1), SUM(RPDE_RTIVA*-1), SUM(RPDE_RTICA*-1)
                    FROM RECIBO_PROVISIONAL P, recibo_provisional_detalle D
                    WHERE P.rcpr_id = D.rcpr_id AND P.TERC_NIT = :NIT AND RPDE_SUCURSAL = :SUCURSAL AND P.VEND_COD = :CODCOBR AND P.RCPR_FECHA <= :FECHA AND P.RCPR_ANULADO = 'N' AND
                    ((RCPR_FECCRUCE IS NULL) or (RCPR_FECCRUCE > :FECHA)) AND ((SUCU_ID = :SUBEMPRESA) OR (:SUBEMPRESA = 0))
                    GROUP BY P.rcpr_id
                    INTO :TIPO, :ID, :PREFIJO, :NUMERO, :FECDOC, :PROVISIONAL, :rtfte,  :RTIVA, :RTICA
                    DO
                    BEGIN
                    if (:descnt_prov = 'NO') then
                      SALDO = 0;
                    else
                      SALDO = :PROVISIONAL;
                    SELECT TIDO_NOMCORTO FROM TIPO_DOCUMENTO WHERE TIDO_COD = :TIPO INTO :TIPONOM;
                     $$IBE$$*/ /* CALCULE EL VENCIMIENTO DEL ULTIMO DOCUMENTO POSFECHADO */ /*$$IBE$$ 
                    SELECT MAX(RPPA_FECHA) FROM recibo_provisional_pago WHERE RCPR_ID = :ID INTO :VENCE;
                    DIAS = VENCE - FECHA;
                    if (DETALLE = 'S') then
                        BEGIN
                        CORRIENTE = 0;
                        CERO = 0;
                        TREINTA = 0;
                        SESENTA = 0;
                        NOVENTA = 0;
                        CIENTOCHENTA = 0;
                        DOSSETENTA = 0;
                        tressesenta = 0;
                        END
                    if (DIAS < 0) then
                        CORRIENTE = CORRIENTE + SALDO;
                    ELSE
                        if (DIAS < DIASR) then
                            CERO = CERO + SALDO;
                        ELSE
                            if (DIAS < (DIASR * 2)) then
                                TREINTA = TREINTA + SALDO;
                            ELSE
                                if (DIAS < (DIASR * 3)) then
                                    SESENTA = SESENTA + SALDO;
                                ELSE
                                    BEGIN
                                    if (EXTENDIDA = 'N') then
                                        NOVENTA = NOVENTA + SALDO;
                                    else    
                                        BEGIN
                                        if (DIAS < (DIASR * 3) * 2) then
                                            CIENTOCHENTA = CIENTOCHENTA + SALDO;
                                        ELSE
                                            if (DIAS < (DIASR * 3) * 3) then
                                                DOSSETENTA = DOSSETENTA + SALDO;
                                            ELSE
                                                TRESSESENTA = TRESSESENTA + SALDO;
                                        END
                                    END
                    if (DETALLE = 'S') then
                        SUSPEND;
                    END
                if (DETALLE = 'N') then
                    begin
                    SALDO = CORRIENTE + CERO + TREINTA + SESENTA + NOVENTA;
                    DIAS = MAXDIAS;
                    SUSPEND;
                    end
                END
            END  $$IBE$$*/ /* FOR COBRADOR */ /*$$IBE$$ 
        END
    END  $$IBE$$*/ /* FOR NIT */
SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE REP_CARTERA_CLIENTES(
    DESDE VARCHAR(20),
    HASTA VARCHAR(20),
    GRPINI VARCHAR(5),
    GRPFIN VARCHAR(5),
    FECHA DATE,
    ORDEN CHAR(1),
    AGRUPA CHAR(1),
    SUBEMPRESA INTEGER,
    GRUPCART INTEGER)
RETURNS (
    NIT VARCHAR(20),
    NOMBRE VARCHAR(60),
    DIR VARCHAR(60),
    TELEFONO VARCHAR(40),
    CIUDAD VARCHAR(40),
    CONTACTO VARCHAR(60),
    EMAIL VARCHAR(100),
    FAX VARCHAR(25),
    CEL VARCHAR(25),
    CODCLI VARCHAR(20),
    CODZONA VARCHAR(2),
    NOMZONA VARCHAR(60),
    CODCOBR INTEGER,
    NOMCOBR VARCHAR(60),
    SUCURSAL VARCHAR(10),
    NOMSUC VARCHAR(60),
    DV CHAR(1),
    CODCIUD CHAR(5),
    NOMCIUD VARCHAR(60),
    TIPO INTEGER,
    ID INTEGER,
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(6),
    CONCEPTO VARCHAR(60),
    SALDO NUMERIC(18,2),
    PROVISIONAL NUMERIC(18,2),
    RTFTE NUMERIC(18,2),
    RTIVA NUMERIC(18,2),
    RTICA NUMERIC(18,2),
    DTOF NUMERIC(18,2),
    TIPONOM VARCHAR(8),
    FECDOC DATE,
    VENCE DATE,
    DIAS INTEGER,
    CUPO NUMERIC(18,2),
    DISPONIBLE NUMERIC(18,2),
    NOTA VARCHAR(256),
    OBS BLOB SUB_TYPE 0 SEGMENT SIZE 80,
    GRUPCOD INTEGER,
    GRUPNOM VARCHAR(30))
AS
DECLARE VARIABLE NITINI VARCHAR(20);
DECLARE VARIABLE NITFIN VARCHAR(20);
DECLARE VARIABLE NOMINI VARCHAR(20);
DECLARE VARIABLE NOMFIN VARCHAR(20);
DECLARE VARIABLE OK CHAR(1);
DECLARE VARIABLE FOV CHAR(11);
DECLARE VARIABLE DTOAPL NUMERIC(18,2);
DECLARE VARIABLE FECDTO DATE;
DECLARE VARIABLE FECNOTA VARCHAR(10);
DECLARE VARIABLE AUXNOTA VARCHAR(256);
DECLARE VARIABLE IDNOTA INTEGER;
declare variable descnt_prov char(2);
declare variable AUTORET VARCHAR(10);
declare variable FAUTORET DATE;
declare variable INCLANTI CHAR(2);
BEGIN /*$$IBE$$ 
if (ORDEN = 'C') then
    BEGIN
    NITINI = DESDE;
    NITFIN = HASTA;
    NOMINI = '';
    NOMFIN = 'zz';
    END
ELSE
    BEGIN
    NOMINI = DESDE;
    NOMFIN = HASTA;
    NITINI = '';
    NITFIN = 'zz';
    END
  EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'DESCONTAR RECIBOS PROVISIONALES EN INFORMES DE CARTERA') RETURNING_VALUES (:descnt_prov);
  EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'INCLUIR ANTICIPOS DE CLIENTES EN REPORTES Y CONSULTAS DE CARTERA') returning_values (INCLANTI);
  EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'FECHA AUTORETENEDOR NO DESCONTAR RETENCIONES DEL SALDO PERO SI CONTABILIZARLAS') returning_values (AUTORET);
  if (AUTORET <> '') then
    FAUTORET = CAST(AUTORET AS DATE);
  else
    FAUTORET = '9999/12/31';
   $$IBE$$*/ /* Ubique el NIT */ /*$$IBE$$ 
  FOR select C.TERC_NIT, TERC_NOM, TERC_DV, CLSU_DIR, CLSU_TEL, CLSU_CIUDAD, S.COBR_COD, S.ZONA_COD, T.CIUD_COD, CLIE_CUPO, CLCU_COD, CLSU_NOMBRE, t.terc_obs, C.GRCA_COD, TERC_CONTACTO, TERC_EMAIL, TERC_FAX, TERC_CEL, CLIE_COD
    from terceros T, CLIENTES C, CLIENTE_SUCURSALES S
    where C.TERC_NIT = T.TERC_NIT AND TERC_CLIE = 'S' AND S.TERC_NIT = C.TERC_NIT AND C.TERC_NIT >= :NITINI AND C.TERC_NIT <= :NITFIN AND
        TERC_NOM >= :NOMINI AND TERC_NOM <= :NOMFIN AND ((:GRUPCART = 0) or (C.GRCA_COD = :GRUPCART))
    INTO :NIT, :NOMBRE, :DV, :DIR, :TELEFONO, :CIUDAD, :CODCOBR, :CODZONA, :CODCIUD, :CUPO, :SUCURSAL, :NOMSUC, :obs, :GRUPCOD, :CONTACTO, :EMAIL, :FAX, :CEL, :CODCLI
    DO  
    BEGIN
    if (CODCOBR IS NOT NULL) then
        SELECT COBR_NOM FROM COBRADORES  WHERE COBR_COD = :CODCOBR INTO :NOMCOBR;
    if (CODZONA IS NOT NULL) then
        SELECT ZONA_NOM FROM ZONAS WHERE ZONA_COD = :CODZONA INTO :NOMZONA;
    if (CODCIUD IS NOT NULL) then
        SELECT CIUD_NOM FROM CIUDADES  WHERE CIUD_COD = :CODCIUD INTO :NOMCIUD;
    SELECT GRCA_NOMBRE FROM GRUPO_CARTERA WHERE GRCA_COD = :GRUPCOD INTO :GRUPNOM;
    DISPONIBLE = CUPO;
    OK = 'N';
    if (AGRUPA = 'Z') then
        BEGIN
        if (GRPINI = '') then
            BEGIN
            if ((CODZONA IS NULL) or (CODZONA >= :GRPINI AND CODZONA <= :GRPFIN)) then
                OK = 'S';
            END
        ELSE
            if (CODZONA >= :GRPINI AND CODZONA <= :GRPFIN) then
                OK = 'S';
        END
    if (AGRUPA = 'I') then
        BEGIN
        if (GRPINI = '') then
            BEGIN
            if ((CODCIUD IS NULL) or (CODCIUD >= :GRPINI AND CODCIUD <= :GRPFIN)) then
                OK = 'S';
            END
        ELSE
            if (CODCIUD >= :GRPINI AND CODCIUD <= :GRPFIN) then
                OK = 'S';
        END
    if (AGRUPA = 'N') then
        OK = 'S';
        
    if (OK = 'S') then
        BEGIN
         $$IBE$$*/ /* BUSQUE EN SALDOS_DOC_CARTERA LOS QUE TENGAN SALDO > 0 */ /*$$IBE$$ 
        FOR SELECT MVCL_TIPOREF, MVCL_IDREF, MVCL_PREFREF, MVCL_NUMREF, MVCL_FECHA, MVCL_VENCE, MVCL_CONC
            FROM MOVIMIENTO_CLIENTES WHERE TERC_NIT = :NIT AND MVCL_SUCURSAL = :SUCURSAL AND MVCL_FECHA <= :FECHA AND
            MVCL_ABONO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            INTO :TIPO, :ID, :PREFIJO, :NUMERO, :FECDOC, :VENCE, :CONCEPTO
            DO
            BEGIN
            if ((inclanti = 'SI') or (TIPO <> 45)) then
                BEGIN
                EXECUTE PROCEDURE saldo_doc_cartera(TIPO, ID, FECHA) returning_values (SALDO);
                if (SALDO <> 0) then
                    BEGIN
                    PROVISIONAL = 0;
                    EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'ANALISIS DE CARTERA CON FECHA FACTURA O VENCIMIENTO') RETURNING_VALUES (FOV);
                    if (FOV = 'FECHA') then
                       DIAS = FECHA - FECDOC;
                    ELSE
                      DIAS = FECHA - VENCE;
                    DISPONIBLE = DISPONIBLE - SALDO;
                    SELECT TIDO_NOMCORTO FROM TIPO_DOCUMENTO WHERE TIDO_COD = :TIPO INTO :TIPONOM;
                    if (TIPO = 41) then
                        SELECT NDCL_DTOFMONTO, NDCL_FECHADTO FROM NOTAS_DEBITO_CLIENTES WHERE NDCL_ID = :ID INTO :DTOF, :FECDTO;
                    if (TIPO = 42) then
                        SELECT 0, :FECDOC FROM NOTAS_CREDITO_CLIENTES WHERE NCCL_ID = :ID INTO :DTOF, :FECDTO;
                    if (TIPO = 45) then
                        SELECT ANCL_DTOFMONTO, ANCL_DTOFECHA FROM ANTICIPOS_CLIENTE WHERE ANCL_ID = :ID INTO :DTOF, :FECDTO;
                    if (TIPO = 31) then
                        SELECT FACT_DTOFMONTO, FACT_DTOFFECHA FROM FACTURAS WHERE FACT_ID = :ID INTO :DTOF, :FECDTO;
                    if (TIPO = 33) then
                        SELECT 0, :FECDOC FROM devoluciones_ventas WHERE DEVT_ID = :ID INTO :DTOF, :FECDTO;
                    if (DTOF IS NULL) then
                        DTOF = 0;
                    if (DTOF <> 0) then
                        BEGIN
                        SELECT SUM(RCDE_DTOF) FROM RECIBOS_CAJA_DETALLE WHERE RCDE_IDDOC = :ID AND RCDE_TIPODOC = :TIPO INTO :DTOAPL;
                        if (DTOAPL IS NULL) then
                            DTOAPL = 0;
                        DTOF = DTOF - DTOAPL;
                         $$IBE$$*/ /* SI YA SE VENCIO DEJELO EN CERO */ /*$$IBE$$ 
                        if (FECDTO < FECHA) then
                            DTOF = 0;
                        END
                    SELECT SUM(SDCA_RTFTE - SDCA_ABRTFTE), SUM(SDCA_RTIVA - SDCA_ABRTIVA), SUM(SDCA_RTICA - SDCA_ABRTICA)
                        FROM SALDOS_DOC_CARTERA WHERE SDCA_TIPOREF = :TIPO AND SDCA_IDREF = :ID INTO :RTFTE, :RTIVA, :RTICA;
                    if (RTFTE IS NULL) then
                        RTFTE = 0;
                    if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) THEN
                        BEGIN
                        if (RTFTE > 0) then
                            RTFTE = 0;
                        END
                    ELSE
                        BEGIN
                        if (RTFTE < 0) then
                            RTFTE = 0;
                        END
                    if (RTIVA IS NULL) then
                        RTIVA = 0;
                    if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) THEN
                        BEGIN
                        if (RTIVA > 0) then
                            RTIVA = 0;
                        END
                    ELSE
                        BEGIN
                        if (RTIVA < 0) then
                            RTIVA = 0;
                        END
                    if (RTICA IS NULL) then
                        RTICA = 0;
                    if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) THEN
                        BEGIN
                        if (RTICA > 0) then
                            RTICA = 0;
                        END
                    ELSE
                        BEGIN
                        if (RTICA < 0) then
                            RTICA = 0;
                        END
                    if (FAUTORET <= FECDOC) then
                        RTFTE = 0;
                     $$IBE$$*/ /* SI TIENE NOTA AGREGUELA */ /*$$IBE$$ 
                    SELECT MAX(NOCL_ID) FROM NOTAS_CLIENTES WHERE TERC_NIT = :NIT AND CLSU_COD = :SUCURSAL AND NOCL_TIPODOC = :TIPO AND NOCL_IDDOC = :ID INTO :IDNOTA;
                    if (IDNOTA IS NOT NULL) then
                        BEGIN
                        SELECT cast(NOCL_FECHA as char(10)), NOCL_TEXTO FROM NOTAS_CLIENTES
                            WHERE NOCL_ID = :IDNOTA INTO :FECNOTA, :AUXNOTA;
                        if (STRLEN(AUXNOTA) < 244) then
                            NOTA = FECNOTA || ':' || AUXNOTA;
                        ELSE
                            NOTA = AUXNOTA;
                        END
                    else
                        NOTA = '';
                    SUSPEND;
                    END  $$IBE$$*/ /* SALDO <> 0 */ /*$$IBE$$ 
                END  $$IBE$$*/ /* NO ANTICIPO */ /*$$IBE$$ 
            END  $$IBE$$*/ /* FOR */
        /* AGREGUE LOS RECIBOS PROVISIONALES CON SIGNO NEGATIVO */ /*$$IBE$$ 
        FOR SELECT 65, MAX(P.RCPR_ID), MAX(PREF_PRE), MAX(RCPR_NUMERO), MAX(RCPR_FECHA), MAX(RCPR_CONC), SUM(RPDE_ABONO * -1), SUM(RPDE_RTFTE*-1), SUM(RPDE_RTIVA*-1), SUM(RPDE_RTICA*-1)
            FROM RECIBO_PROVISIONAL P, recibo_provisional_detalle D
            WHERE P.rcpr_id = D.rcpr_id AND P.TERC_NIT = :NIT AND RCPR_FECHA <= :FECHA AND RCPR_ANULADO = 'N' AND
            ((RCPR_FECCRUCE IS NULL) or (RCPR_FECCRUCE > :FECHA)) AND RPDE_SUCURSAL = :SUCURSAL AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY P.rcpr_id
            INTO :TIPO, :ID, :PREFIJO, :NUMERO, :FECDOC, :CONCEPTO, :PROVISIONAL, :rtfte,  :RTIVA, :RTICA
            DO
            BEGIN
            if (:descnt_prov = 'NO') then
              SALDO = 0;
            else
              SALDO = :PROVISIONAL;
            SELECT TIDO_NOMCORTO FROM TIPO_DOCUMENTO WHERE TIDO_COD = :TIPO INTO :TIPONOM;
             $$IBE$$*/ /* CALCULE EL VENCIMIENTO DEL ULTIMO DOCUMENTO POSFECHADO */ /*$$IBE$$ 
            SELECT MAX(RPPA_FECHA) FROM recibo_provisional_pago WHERE RCPR_ID = :ID INTO :VENCE;
            DIAS = VENCE - FECHA;
            SUSPEND;
            END
        END
    if (AGRUPA = 'C') then
        BEGIN
        FOR SELECT DISTINCT COBR_COD FROM MOVIMIENTO_CLIENTES
            WHERE TERC_NIT = :NIT AND MVCL_SUCURSAL = :SUCURSAL AND MVCL_FECHA <= :FECHA AND
            MVCL_ABONO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            INTO :codcobr
            DO
            BEGIN
            OK = 'N';
            if (GRPINI = '') then
                BEGIN
                if ((CODCOBR IS NULL) or (CODCOBR >= :GRPINI AND CODCOBR <= :GRPFIN)) then
                    OK = 'S';
                END
            ELSE
                if (CODCOBR >= :GRPINI AND CODCOBR <= :GRPFIN) then
                    OK = 'S';
            if (OK = 'S') then
                BEGIN
                SELECT COBR_NOM FROM COBRADORES  WHERE COBR_COD = :CODCOBR INTO :NOMCOBR;
                 $$IBE$$*/ /* BUSQUE EN SALDOS_DOC_CARTERA LOS QUE TENGAN SALDO > 0 */ /*$$IBE$$ 
                FOR SELECT MVCL_TIPOREF, MVCL_IDREF, MVCL_PREFREF, MVCL_NUMREF, MVCL_FECHA, MVCL_VENCE, MVCL_CONC
                    FROM MOVIMIENTO_CLIENTES WHERE TERC_NIT = :NIT AND MVCL_SUCURSAL = :SUCURSAL AND MVCL_FECHA <= :FECHA AND
                    MVCL_ABONO = 'N' AND COBR_COD = :codcobr AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                    INTO :TIPO, :ID, :PREFIJO, :NUMERO, :FECDOC, :VENCE, :CONCEPTO
                    DO
                    BEGIN
                    if ((inclanti = 'SI') or (TIPO <> 45)) then
                        BEGIN
                        EXECUTE PROCEDURE saldo_doc_cartera(TIPO, ID, FECHA) returning_values (SALDO);
                        if (SALDO <> 0) then
                            BEGIN
                            PROVISIONAL = 0;
                            EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'ANALISIS DE CARTERA CON FECHA FACTURA O VENCIMIENTO') RETURNING_VALUES (FOV);
                            if (FOV = 'FECHA') then
                               DIAS = FECHA - FECDOC;
                            ELSE
                              DIAS = FECHA - VENCE;
                            DISPONIBLE = DISPONIBLE - SALDO;
                            SELECT TIDO_NOMCORTO FROM TIPO_DOCUMENTO WHERE TIDO_COD = :TIPO INTO :TIPONOM;
                            if (TIPO = 41) then
                                SELECT NDCL_DTOFMONTO, NDCL_FECHADTO FROM NOTAS_DEBITO_CLIENTES WHERE NDCL_ID = :ID INTO :DTOF, :FECDTO;
                            if (TIPO = 42) then
                                SELECT 0, :FECDOC FROM NOTAS_CREDITO_CLIENTES WHERE NCCL_ID = :ID INTO :DTOF, :FECDTO;
                            if (TIPO = 45) then
                                SELECT ANCL_DTOFMONTO, ANCL_DTOFECHA FROM ANTICIPOS_CLIENTE WHERE ANCL_ID = :ID INTO :DTOF, :FECDTO;
                            if (TIPO = 31) then
                                SELECT FACT_DTOFMONTO, FACT_DTOFFECHA FROM FACTURAS WHERE FACT_ID = :ID INTO :DTOF, :FECDTO;
                            if (TIPO = 33) then
                                SELECT 0, :FECDOC FROM devoluciones_ventas WHERE DEVT_ID = :ID INTO :DTOF, :FECDTO;
                            if (DTOF IS NULL) then
                                DTOF = 0;
                            if (DTOF <> 0) then
                                BEGIN
                                SELECT SUM(RCDE_DTOF) FROM RECIBOS_CAJA_DETALLE WHERE RCDE_IDDOC = :ID AND RCDE_TIPODOC = :TIPO INTO :DTOAPL;
                                if (DTOAPL IS NULL) then
                                    DTOAPL = 0;
                                DTOF = DTOF - DTOAPL;
                                 $$IBE$$*/ /* SI YA SE VENCIO DEJELO EN CERO */ /*$$IBE$$ 
                                if (FECDTO < FECHA) then
                                    DTOF = 0;
                                END
                            SELECT SUM(SDCA_RTFTE - SDCA_ABRTFTE), SUM(SDCA_RTIVA - SDCA_ABRTIVA), SUM(SDCA_RTICA - SDCA_ABRTICA)
                                FROM SALDOS_DOC_CARTERA WHERE SDCA_TIPOREF = :TIPO AND SDCA_IDREF = :ID INTO :RTFTE, :RTIVA, :RTICA;
                            if (RTFTE IS NULL) then
                                RTFTE = 0;
                            if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) THEN
                                BEGIN
                                if (RTFTE > 0) then
                                    RTFTE = 0;
                                END
                            ELSE
                                BEGIN
                                if (RTFTE < 0) then
                                    RTFTE = 0;
                                END
                            if (FAUTORET <= FECDOC) then
                                RTFTE = 0;
                            if (RTIVA IS NULL) then
                                RTIVA = 0;
                            if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) THEN
                                BEGIN
                                if (RTIVA > 0) then
                                    RTIVA = 0;
                                END
                            ELSE
                                BEGIN
                                if (RTIVA < 0) then
                                    RTIVA = 0;
                                END
                            if (RTICA IS NULL) then
                                RTICA = 0;
                            if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) THEN
                                BEGIN
                                if (RTICA > 0) then
                                    RTICA = 0;
                                END
                            ELSE
                                BEGIN
                                if (RTICA < 0) then
                                    RTICA = 0;
                                END
                             $$IBE$$*/ /* SI TIENE NOTA AGREGUELA */ /*$$IBE$$ 
                            SELECT MAX(NOCL_FECHA) FROM NOTAS_CLIENTES WHERE TERC_NIT = :NIT AND CLSU_COD = :SUCURSAL AND NOCL_TIPODOC = :TIPO AND NOCL_IDDOC = :ID INTO :FECDTO;
                            if (FECDTO IS NOT NULL) then
                                BEGIN
                                SELECT cast(NOCL_FECHA as char(10)), NOCL_TEXTO FROM NOTAS_CLIENTES
                                    WHERE NOCL_ID = :IDNOTA INTO :FECNOTA, :AUXNOTA;
                                if (STRLEN(AUXNOTA) < 244) then
                                    NOTA = FECNOTA || ':' || AUXNOTA;
                                ELSE
                                    NOTA = AUXNOTA;
                                END
                            else
                                NOTA = '';
                            SUSPEND;
                            END  $$IBE$$*/ /* SALDO <> 0 */ /*$$IBE$$ 
                        END  $$IBE$$*/ /* NO ANTICIPO */ /*$$IBE$$ 
                    END  $$IBE$$*/ /* FOR */
                /* AGREGUE LOS RECIBOS PROVISIONALES CON SIGNO NEGATIVO */ /*$$IBE$$ 
                FOR SELECT 65, MAX(P.RCPR_ID), MAX(PREF_PRE), MAX(RCPR_NUMERO), MAX(RCPR_FECHA), MAX(RCPR_CONC), SUM(RPDE_ABONO * -1), SUM(RPDE_RTFTE*-1), SUM(RPDE_RTIVA*-1), SUM(RPDE_RTICA*-1)
                    FROM RECIBO_PROVISIONAL P, recibo_provisional_detalle D
                    WHERE P.rcpr_id = D.rcpr_id AND P.TERC_NIT = :NIT AND P.VEND_COD = :codcobr AND RCPR_FECHA <= :FECHA AND RCPR_ANULADO = 'N' AND
                    ((RCPR_FECCRUCE IS NULL) or (RCPR_FECCRUCE > :FECHA)) AND RPDE_SUCURSAL = :SUCURSAL AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                    GROUP BY P.rcpr_id
                    INTO :TIPO, :ID, :PREFIJO, :NUMERO, :FECDOC, :CONCEPTO, :PROVISIONAL, :rtfte,  :RTIVA, :RTICA
                    DO
                    BEGIN
                    if (:descnt_prov = 'NO') then
                      SALDO = 0;
                    else
                      SALDO = :PROVISIONAL;
                    SELECT TIDO_NOMCORTO FROM TIPO_DOCUMENTO WHERE TIDO_COD = :TIPO INTO :TIPONOM;
                     $$IBE$$*/ /* CALCULE EL VENCIMIENTO DEL ULTIMO DOCUMENTO POSFECHADO */ /*$$IBE$$ 
                    SELECT MAX(RPPA_FECHA) FROM recibo_provisional_pago WHERE RCPR_ID = :ID INTO :VENCE;
                    DIAS = VENCE - FECHA;
                    SUSPEND;
                    END
                END  $$IBE$$*/ /* ok */ /*$$IBE$$ 
            END  $$IBE$$*/ /* FOR COBR */ /*$$IBE$$ 
        END  $$IBE$$*/ /* AGRUPA = C */ /*$$IBE$$ 
    END  $$IBE$$*/ /* FOR NIT */
SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE REP_CARTERA_CONSOLIDADA(
    DESDE VARCHAR(20),
    HASTA VARCHAR(20),
    GRPINI VARCHAR(5),
    GRPFIN VARCHAR(5),
    FECHA DATE,
    ORDEN CHAR(1),
    AGRUPA CHAR(1),
    SUBEMPRESA INTEGER,
    GRUPCART INTEGER)
RETURNS (
    NIT VARCHAR(20),
    NOMBRE VARCHAR(60),
    TELEFONO VARCHAR(40),
    CIUDAD VARCHAR(40),
    EMAIL VARCHAR(100),
    FAX VARCHAR(25),
    CEL VARCHAR(25),
    CODCLI VARCHAR(20),
    CODZONA VARCHAR(2),
    NOMZONA VARCHAR(60),
    CODCOBR INTEGER,
    NOMCOBR VARCHAR(60),
    SUCURSAL VARCHAR(10),
    DV CHAR(1),
    CODCIUD CHAR(5),
    NOMCIUD VARCHAR(60),
    SALDO NUMERIC(18,2),
    RTFTE NUMERIC(18,2),
    RTIVA NUMERIC(18,2),
    RTICA NUMERIC(18,2),
    DTOF NUMERIC(18,2),
    CUPO NUMERIC(18,2),
    DISPONIBLE NUMERIC(18,2),
    PROVISIONAL NUMERIC(18,2),
    CONTACTO VARCHAR(60),
    ESTADO CHAR(1),
    GRUPCOD INTEGER,
    GRUPNOM VARCHAR(30))
AS
declare variable NITINI VARCHAR(20);
declare variable NITFIN VARCHAR(20);
declare variable NOMINI VARCHAR(20);
declare variable NOMFIN VARCHAR(20);
declare variable OK CHAR(1);
declare variable PSALDO NUMERIC(18,2);
declare variable PRTFTE NUMERIC(18,2);
declare variable PRTIVA NUMERIC(18,2);
declare variable PRTICA NUMERIC(18,2);
declare variable PDTOF NUMERIC(18,2);
declare variable TIPO INTEGER;
declare variable ID INTEGER;
declare variable DTOAPL NUMERIC(18,2);
declare variable FECDTO DATE;
declare variable descnt_prov char(2);
declare variable AUTORET VARCHAR(10);
declare variable FAUTORET DATE;
declare variable FECDOC DATE;
declare variable INCLANTI CHAR(2);
BEGIN /*$$IBE$$ 
if (ORDEN = 'C') then
    BEGIN
    NITINI = DESDE;
    NITFIN = HASTA;
    NOMINI = '';
    NOMFIN = 'zz';
    END
ELSE
    BEGIN
    NOMINI = DESDE;
    NOMFIN = HASTA;
    NITINI = '';
    NITFIN = 'zz';
    END
  EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'DESCONTAR RECIBOS PROVISIONALES EN INFORMES DE CARTERA') RETURNING_VALUES (:descnt_prov);
  EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'INCLUIR ANTICIPOS DE CLIENTES EN REPORTES Y CONSULTAS DE CARTERA') returning_values (INCLANTI);
  EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'FECHA AUTORETENEDOR NO DESCONTAR RETENCIONES DEL SALDO PERO SI CONTABILIZARLAS') returning_values (AUTORET);
  if (AUTORET <> '') then
    FAUTORET = CAST(AUTORET AS DATE);
  else
    FAUTORET = '9999/12/31';
   $$IBE$$*/ /* Ubique el NIT */ /*$$IBE$$ 
  FOR select C.TERC_NIT, CLSU_NOMBRE, TERC_DV, CLSU_TEL, CLSU_CIUDAD, TERC_CONTACTO, S.COBR_COD, S.ZONA_COD, T.CIUD_COD, CLIE_CUPO, CLIE_ESTADO, CLCU_COD, C.GRCA_COD, TERC_EMAIL, TERC_FAX, TERC_CEL, CLIE_COD
    from terceros T, CLIENTES C, CLIENTE_SUCURSALES S
    where C.TERC_NIT = T.TERC_NIT AND TERC_CLIE = 'S' AND S.TERC_NIT = C.TERC_NIT AND C.TERC_NIT >= :NITINI AND C.TERC_NIT <= :NITFIN AND
        TERC_NOM >= :NOMINI AND TERC_NOM <= :NOMFIN AND ((:GRUPCART = 0) or (C.GRCA_COD = :GRUPCART))
    INTO :NIT, :NOMBRE, :DV, :TELEFONO, :CIUDAD, :CONTACTO, :CODCOBR, :CODZONA, :CODCIUD, :CUPO, :ESTADO, :SUCURSAL, :GRUPCOD, :EMAIL, :FAX, :CEL, :CODCLI
    DO  
    BEGIN
    SELECT GRCA_NOMBRE FROM GRUPO_CARTERA WHERE GRCA_COD = :GRUPCOD INTO :GRUPNOM;
    OK = 'N';
    if (AGRUPA = 'Z') then
        BEGIN
        if (GRPINI = '') then
            BEGIN
            if ((CODZONA IS NULL) or (CODZONA >= :GRPINI AND CODZONA <= :GRPFIN)) then
                OK = 'S';
            END
        ELSE
            if (CODZONA >= :GRPINI AND CODZONA <= :GRPFIN) then
                OK = 'S';
        END
    if (AGRUPA = 'I') then
        BEGIN
        if (GRPINI = '') then
            BEGIN
            if ((CODCIUD IS NULL) or (CODCIUD >= :GRPINI AND CODCIUD <= :GRPFIN)) then
                OK = 'S';
            END
        ELSE
            if (CODCIUD >= :GRPINI AND CODCIUD <= :GRPFIN) then
                OK = 'S';
        END
    if (AGRUPA = 'N') then
        OK = 'S';
        
    if (OK = 'S') then
        BEGIN
        if (CODCOBR IS NOT NULL) then
            SELECT COBR_NOM FROM COBRADORES  WHERE COBR_COD = :CODCOBR INTO :NOMCOBR;
        if (CODZONA IS NOT NULL) then
            SELECT ZONA_NOM FROM ZONAS WHERE ZONA_COD = :CODZONA INTO :NOMZONA;
        if (CODCIUD IS NOT NULL) then
            SELECT CIUD_NOM FROM CIUDADES  WHERE CIUD_COD = :CODCIUD INTO :NOMCIUD;
    
        SALDO = 0;
        RTFTE = 0;
        RTIVA = 0;
        RTICA = 0;
        DTOF = 0;
         $$IBE$$*/ /* BUSQUE EN SALDOS_DOC_CARTERA LOS QUE TENGAN SALDO > 0 */ /*$$IBE$$ 
        FOR SELECT MVCL_TIPOREF, MVCL_IDREF, MVCL_FECHA
          FROM MOVIMIENTO_CLIENTES WHERE TERC_NIT = :NIT AND MVCL_SUCURSAL = :SUCURSAL AND MVCL_FECHA <= :FECHA AND
          MVCL_ABONO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
          INTO :TIPO, :ID, :FECDOC
          DO
            BEGIN
            if ((inclanti = 'SI') or (TIPO <> 45)) then
                BEGIN
                EXECUTE PROCEDURE saldo_doc_cartera(TIPO, ID, FECHA) returning_values (PSALDO);
                if (PSALDO <> 0) then
                    BEGIN
                    if (TIPO = 41) then
                        SELECT NDCL_DTOFMONTO, NDCL_FECHADTO FROM NOTAS_DEBITO_CLIENTES WHERE NDCL_ID = :ID INTO :PDTOF, :FECDTO;
                    if (TIPO = 42) then
                        SELECT 0, NCCL_FECHA FROM NOTAS_CREDITO_CLIENTES WHERE NCCL_ID = :ID INTO :PDTOF, :FECDTO;
                    if (TIPO = 45) then
                        SELECT ANCL_DTOFMONTO, ANCL_DTOFECHA FROM ANTICIPOS_CLIENTE WHERE ANCL_ID = :ID INTO :PDTOF, :FECDTO;
                    if (TIPO = 31) then
                        SELECT FACT_DTOFMONTO, FACT_DTOFFECHA FROM FACTURAS WHERE FACT_ID = :ID INTO :PDTOF, :FECDTO;
                    if (TIPO = 33) then
                        SELECT 0, DEVT_FECHA FROM devoluciones_ventas WHERE DEVT_ID = :ID INTO :PDTOF, :FECDTO;
                    if (PDTOF IS NULL) then
                        PDTOF = 0;
                    if (PDTOF <> 0) then
                        BEGIN
                        SELECT SUM(RCDE_DTOF) FROM RECIBOS_CAJA_DETALLE WHERE RCDE_IDDOC = :ID AND RCDE_TIPODOC = :TIPO INTO :DTOAPL;
                        if (DTOAPL IS NULL) then
                            DTOAPL = 0;
                        PDTOF = PDTOF - DTOAPL;
                         $$IBE$$*/ /* SI YA SE VENCIO DEJELO EN CERO */ /*$$IBE$$ 
                        if (FECDTO < FECHA) then
                            PDTOF = 0;
                        END
                    SELECT SUM(SDCA_RTFTE - SDCA_ABRTFTE), SUM(SDCA_RTIVA - SDCA_ABRTIVA), SUM(SDCA_RTICA - SDCA_ABRTICA)
                        FROM SALDOS_DOC_CARTERA WHERE SDCA_TIPOREF = :TIPO AND SDCA_IDREF = :ID
                        INTO :PRTFTE, :PRTIVA, :PRTICA;
                    if (PRTFTE IS NULL) then
                        PRTFTE = 0;
                    if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) THEN
                        BEGIN
                        if (PRTFTE > 0) then
                            PRTFTE = 0;
                        END
                    ELSE    
                        BEGIN
                        if (PRTFTE < 0) then
                            PRTFTE = 0;
                        END
                    if (PRTIVA IS NULL) then
                        PRTIVA = 0;
                    if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) THEN
                        BEGIN
                        if (PRTIVA > 0) then
                            PRTIVA = 0;
                        END
                    ELSE
                        BEGIN
                        if (PRTIVA < 0) then
                            PRTIVA = 0;
                        END
                    if (PRTICA IS NULL) then
                        PRTICA = 0;
                    if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) THEN
                        BEGIN
                        if (PRTICA > 0) then
                            PRTICA = 0;
                        END
                    ELSE
                        BEGIN
                        if (PRTICA < 0) then
                            PRTICA = 0;
                        END

                    if (FAUTORET <= FECDOC) then
                        PRTFTE = 0;

                    SALDO = SALDO + PSALDO;
                    RTFTE = RTFTE + PRTFTE;
                    RTIVA = RTIVA + PRTIVA;
                    RTICA = RTICA + PRTICA;
                    DTOF = DTOF + PDTOF;
                    END  $$IBE$$*/ /* SALDO <> 0 */ /*$$IBE$$ 
                END  $$IBE$$*/ /* NO ANTICIPO */ /*$$IBE$$ 
            END
        DISPONIBLE = CUPO - SALDO;
         $$IBE$$*/ /* LOS RECIBOS PROVISIONALES */ /*$$IBE$$ 
        SELECT SUM(RPDE_ABONO) FROM recibo_provisional P, recibo_provisional_detalle D
            WHERE P.rcpr_id = D.rcpr_id AND TERC_NIT = :NIT AND RPDE_SUCURSAL = :SUCURSAL AND
            RCPR_FECHA <= :FECHA AND RCPR_ANULADO = 'N' AND ((RCPR_FECCRUCE IS NULL) or (RCPR_FECCRUCE > :FECHA)) AND
            ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            INTO :provisional;
           if (:descnt_prov = 'SI') then
             if (NOT :provisional is NULL) then
              SALDO = :saldo - :PROVISIONAL;
        SUSPEND;
        END
    if (AGRUPA = 'C') then
        BEGIN
        if (CODZONA IS NOT NULL) then
            SELECT ZONA_NOM FROM ZONAS WHERE ZONA_COD = :CODZONA INTO :NOMZONA;
        if (CODCIUD IS NOT NULL) then
            SELECT CIUD_NOM FROM CIUDADES  WHERE CIUD_COD = :CODCIUD INTO :NOMCIUD;
        FOR SELECT DISTINCT COBR_COD FROM MOVIMIENTO_CLIENTES WHERE TERC_NIT = :NIT AND
            MVCL_SUCURSAL = :SUCURSAL AND MVCL_FECHA <= :FECHA AND
            MVCL_ABONO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            INTO :codcobr
            DO
            begin
            OK = 'N';
            if (GRPINI = '') then
                BEGIN
                if ((CODCOBR IS NULL) or (CODCOBR >= :GRPINI AND CODCOBR <= :GRPFIN)) then
                    OK = 'S';
                END
            ELSE
                if (CODCOBR >= :GRPINI AND CODCOBR <= :GRPFIN) then
                    OK = 'S';
            if (OK = 'S') then
                BEGIN
                SELECT COBR_NOM FROM COBRADORES  WHERE COBR_COD = :CODCOBR INTO :NOMCOBR;

                SALDO = 0;
                RTFTE = 0;
                RTIVA = 0;
                RTICA = 0;
                DTOF = 0;
                 $$IBE$$*/ /* BUSQUE EN SALDOS_DOC_CARTERA LOS QUE TENGAN SALDO > 0 */ /*$$IBE$$ 
                FOR SELECT MVCL_TIPOREF, MVCL_IDREF, MVCL_FECHA
                  FROM MOVIMIENTO_CLIENTES WHERE TERC_NIT = :NIT AND MVCL_SUCURSAL = :SUCURSAL AND
                  MVCL_FECHA <= :FECHA AND COBR_COD = :codcobr AND MVCL_ABONO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                  INTO :TIPO, :ID, :FECDOC
                  DO
                    BEGIN
                    if ((inclanti = 'SI') or (TIPO <> 45)) then
                        BEGIN
                        EXECUTE PROCEDURE saldo_doc_cartera(TIPO, ID, FECHA) returning_values (PSALDO);
                        if (PSALDO <> 0) then
                            BEGIN
                            if (TIPO = 41) then
                                SELECT NDCL_DTOFMONTO, NDCL_FECHADTO FROM NOTAS_DEBITO_CLIENTES WHERE NDCL_ID = :ID INTO :PDTOF, :FECDTO;
                            if (TIPO = 42) then
                                SELECT 0, NCCL_FECHA FROM NOTAS_CREDITO_CLIENTES WHERE NCCL_ID = :ID INTO :PDTOF, :FECDTO;
                            if (TIPO = 45) then
                                SELECT ANCL_DTOFMONTO, ANCL_DTOFECHA FROM ANTICIPOS_CLIENTE WHERE ANCL_ID = :ID INTO :PDTOF, :FECDTO;
                            if (TIPO = 31) then
                                SELECT FACT_DTOFMONTO, FACT_DTOFFECHA FROM FACTURAS WHERE FACT_ID = :ID INTO :PDTOF, :FECDTO;
                            if (TIPO = 33) then
                                SELECT 0, DEVT_FECHA FROM devoluciones_ventas WHERE DEVT_ID = :ID INTO :PDTOF, :FECDTO;
                            if (PDTOF IS NULL) then
                                PDTOF = 0;
                            if (PDTOF <> 0) then
                                BEGIN
                                SELECT SUM(RCDE_DTOF) FROM RECIBOS_CAJA_DETALLE WHERE RCDE_IDDOC = :ID AND RCDE_TIPODOC = :TIPO INTO :DTOAPL;
                                if (DTOAPL IS NULL) then
                                    DTOAPL = 0;
                                PDTOF = PDTOF - DTOAPL;
                                 $$IBE$$*/ /* SI YA SE VENCIO DEJELO EN CERO */ /*$$IBE$$ 
                                if (FECDTO < FECHA) then
                                    PDTOF = 0;
                                END
                            SELECT SUM(SDCA_RTFTE - SDCA_ABRTFTE), SUM(SDCA_RTIVA - SDCA_ABRTIVA), SUM(SDCA_RTICA - SDCA_ABRTICA)
                                FROM SALDOS_DOC_CARTERA WHERE SDCA_TIPOREF = :TIPO AND SDCA_IDREF = :ID
                                INTO :PRTFTE, :PRTIVA, :PRTICA;
                            if (PRTFTE IS NULL) then
                                PRTFTE = 0;
                            if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) THEN
                                BEGIN
                                if (PRTFTE > 0) then
                                    PRTFTE = 0;
                                END
                            ELSE
                                BEGIN
                                if (PRTFTE < 0) then
                                    PRTFTE = 0;
                                END
                            if (PRTIVA IS NULL) then
                                PRTIVA = 0;
                            if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) THEN
                                BEGIN
                                if (PRTIVA > 0) then
                                    PRTIVA = 0;
                                END
                            ELSE
                                BEGIN
                                if (PRTIVA < 0) then
                                    PRTIVA = 0;
                                END
                            if (PRTICA IS NULL) then
                                PRTICA = 0;
                            if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) THEN
                                BEGIN
                                if (PRTICA > 0) then
                                    PRTICA = 0;
                                END
                            ELSE
                                BEGIN
                                if (PRTICA < 0) then
                                    PRTICA = 0;
                                END
                            if (FAUTORET <= FECDOC) then
                                PRTFTE = 0;
                            SALDO = SALDO + PSALDO;
                            RTFTE = RTFTE + PRTFTE;
                            RTIVA = RTIVA + PRTIVA;
                            RTICA = RTICA + PRTICA;
                            DTOF = DTOF + PDTOF;
                            END   $$IBE$$*/ /* SALDO <> 0 */ /*$$IBE$$ 
                        END  $$IBE$$*/ /* NO ANTICIPO */ /*$$IBE$$ 
                    END
                DISPONIBLE = CUPO - SALDO;
                 $$IBE$$*/ /* LOS RECIBOS PROVISIONALES */ /*$$IBE$$ 
                SELECT SUM(RPDE_ABONO) FROM RECIBO_PROVISIONAL P, recibo_provisional_detalle D
                    WHERE P.rcpr_id = D.rcpr_id AND TERC_NIT = :NIT AND RPDE_SUCURSAL = :SUCURSAL AND
                    VEND_COD = :CODCOBR AND RCPR_FECHA <= :FECHA AND RCPR_ANULADO = 'N' AND ((RCPR_FECCRUCE IS NULL) or (RCPR_FECCRUCE > :FECHA)) AND 
                    ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                    INTO :provisional;
                  if (:descnt_prov = 'SI') then
                   if (NOT :provisional IS NULL) then
                    SALDO = :saldo - :PROVISIONAL;
                if (AUTORET = 'SI') then
                    BEGIN
                    RTFTE = 0;
                    RTIVA = 0;
                    RTICA = 0;
                    END
                SUSPEND;
                END  $$IBE$$*/ /* OK = S */ /*$$IBE$$ 
            END  $$IBE$$*/ /* FOR COBRADOR */ /*$$IBE$$ 
        END  $$IBE$$*/ /* AGRUPA = C */ /*$$IBE$$ 
    END  $$IBE$$*/ /* FOR NIT */
SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE REP_CARTERA_NOTAS(
    DESDE VARCHAR(20),
    HASTA VARCHAR(20),
    GRPINI VARCHAR(5),
    GRPFIN VARCHAR(5),
    FECHA DATE,
    ORDEN CHAR(1),
    AGRUPA CHAR(1),
    SUBEMPRESA INTEGER,
    VENCEINI DATE,
    VENCEFIN DATE,
    GRUPCART INTEGER)
RETURNS (
    NIT VARCHAR(20),
    NOMBRE VARCHAR(60),
    TELEFONO VARCHAR(40),
    CIUDAD VARCHAR(40),
    CODZONA VARCHAR(2),
    NOMZONA VARCHAR(60),
    CODCOBR INTEGER,
    NOMCOBR VARCHAR(60),
    SUCURSAL VARCHAR(10),
    DV CHAR(1),
    CODCIUD CHAR(5),
    NOMCIUD VARCHAR(60),
    SALDO NUMERIC(18,2),
    NOTA1 VARCHAR(256),
    NOTA2 VARCHAR(256),
    CUPO NUMERIC(18,2),
    DISPONIBLE NUMERIC(18,2),
    PROVISIONAL NUMERIC(18,2),
    CONTACTO VARCHAR(60),
    ESTADO CHAR(1),
    GRUPCOD INTEGER,
    GRUPNOM VARCHAR(30))
AS
declare variable NITINI VARCHAR(20);
declare variable NITFIN VARCHAR(20);
declare variable NOMINI VARCHAR(20);
declare variable NOMFIN VARCHAR(20);
declare variable OK CHAR(1);
declare variable PSALDO NUMERIC(18,2);
declare variable TIPO INTEGER;
declare variable ID INTEGER;
declare variable NOTA VARCHAR(277);
declare variable TIPODOC VARCHAR(8);
declare variable NUMDOC VARCHAR(10);
declare variable FECNOTA VARCHAR(10);
declare variable I INTEGER;
declare variable INCLANTI CHAR(2);
BEGIN /*$$IBE$$ 
if (ORDEN = 'C') then
    BEGIN
    NITINI = DESDE;
    NITFIN = HASTA;
    NOMINI = '';
    NOMFIN = 'zz';
    END
ELSE
    BEGIN
    NOMINI = DESDE;
    NOMFIN = HASTA;
    NITINI = '';
    NITFIN = 'zz';
    END
  EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'INCLUIR ANTICIPOS DE CLIENTES EN REPORTES Y CONSULTAS DE CARTERA') returning_values (INCLANTI);
   $$IBE$$*/ /* Ubique el NIT */ /*$$IBE$$ 
  FOR select T.TERC_NIT, CLSU_NOMBRE, TERC_DV, CLSU_TEL, CLSU_CIUDAD, TERC_CONTACTO, S.COBR_COD, S.ZONA_COD, CIUD_COD, CLIE_CUPO, CLIE_ESTADO, CLCU_COD, C.GRCA_COD
    from terceros T, CLIENTES C, CLIENTE_SUCURSALES S
    where C.TERC_NIT = T.TERC_NIT AND TERC_CLIE = 'S' AND S.TERC_NIT = C.TERC_NIT AND T.TERC_NIT >= :NITINI AND T.TERC_NIT <= :NITFIN AND
        TERC_NOM >= :NOMINI AND TERC_NOM <= :NOMFIN AND ((:GRUPCART = 0) or (C.GRCA_COD = :GRUPCART))
    INTO :NIT, :NOMBRE, :DV, :TELEFONO, :CIUDAD, :CONTACTO, :CODCOBR, :CODZONA, :CODCIUD, :CUPO, :ESTADO, :SUCURSAL, :GRUPCOD
    DO  
    BEGIN
    SELECT GRCA_NOMBRE FROM GRUPO_CARTERA WHERE GRCA_COD = :GRUPCOD INTO :GRUPNOM;
    OK = 'N';
    if (AGRUPA = 'Z') then
        BEGIN
        if (GRPINI = '') then
            BEGIN
            if ((CODZONA IS NULL) or (CODZONA >= :GRPINI AND CODZONA <= :GRPFIN)) then
                OK = 'S';
            END
        ELSE
            if (CODZONA >= :GRPINI AND CODZONA <= :GRPFIN) then
                OK = 'S';
        END
    if (AGRUPA = 'I') then
        BEGIN
        if (GRPINI = '') then
            BEGIN
            if ((CODCIUD IS NULL) or (CODCIUD >= :GRPINI AND CODCIUD <= :GRPFIN)) then
                OK = 'S';
            END
        ELSE
            if (CODCIUD >= :GRPINI AND CODCIUD <= :GRPFIN) then
                OK = 'S';
        END
    if (AGRUPA = 'N') then
        OK = 'S';
        
    if (OK = 'S') then
        BEGIN
        if (CODCOBR IS NOT NULL) then
            SELECT COBR_NOM FROM COBRADORES  WHERE COBR_COD = :CODCOBR INTO :NOMCOBR;
        if (CODZONA IS NOT NULL) then
            SELECT ZONA_NOM FROM ZONAS WHERE ZONA_COD = :CODZONA INTO :NOMZONA;
        if (CODCIUD IS NOT NULL) then
            SELECT CIUD_NOM FROM CIUDADES  WHERE CIUD_COD = :CODCIUD INTO :NOMCIUD;
    
        SALDO = 0;
         $$IBE$$*/ /* BUSQUE EN SALDOS_DOC_CARTERA LOS QUE TENGAN SALDO > 0 */ /*$$IBE$$ 
        FOR SELECT MVCL_TIPOREF, MVCL_IDREF
          FROM MOVIMIENTO_CLIENTES WHERE TERC_NIT = :NIT AND MVCL_SUCURSAL = :SUCURSAL AND MVCL_FECHA <= :FECHA AND
          MVCL_ABONO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) AND MVCL_VENCE >= :VENCEINI AND MVCL_VENCE <= :VENCEFIN
          INTO :TIPO, :ID
          DO
            if ((inclanti = 'SI') or (TIPO <> 45)) then
                BEGIN
                EXECUTE PROCEDURE saldo_doc_cartera(TIPO, ID, FECHA) returning_values (PSALDO);
                if (PSALDO <> 0) then
                    SALDO = SALDO + PSALDO;
                END
        DISPONIBLE = CUPO - SALDO;
         $$IBE$$*/ /* LOS RECIBOS PROVISIONALES */ /*$$IBE$$ 
        SELECT SUM(RPDE_ABONO) FROM RECIBO_PROVISIONAL P, recibo_provisional_detalle D
            WHERE P.rcpr_id = D.rcpr_id AND TERC_NIT = :NIT AND RPDE_SUCURSAL = :SUCURSAL AND
            RCPR_FECHA <= :FECHA AND RCPR_ANULADO = 'N' AND ((RCPR_FECCRUCE IS NULL) or (RCPR_FECCRUCE > :FECHA)) AND
            ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            INTO :provisional;
         $$IBE$$*/ /* LAS NOTAS DE CLIENTES */ /*$$IBE$$ 
        I = 0;
        NOTA1 = '';
        NOTA2 = '';
        FOR SELECT CAST(NOCL_FECHA AS VARCHAR(10)), tido_nomcorto, NOCL_NUMDOC, NOCL_TEXTO
            FROM NOTAS_CLIENTES N, TIPO_DOCUMENTO T WHERE N.NOCL_TIPODOC = T.TIDO_COD AND TERC_NIT = :NIT
            AND N.TINO_COD = 3 AND N.CLSU_COD = :SUCURSAL
            ORDER BY NOCL_ID DESC INTO :FECNOTA, :TIPODOC, :NUMDOC, :NOTA
            DO
            BEGIN
            if (I = 0) then
                NOTA1 = NOTA;
            if (I = 1) then
                NOTA2 = NOTA;
            I = I + 1;
            END
        SUSPEND;
        END
    if (AGRUPA = 'C') then
        BEGIN
        if (CODZONA IS NOT NULL) then
            SELECT ZONA_NOM FROM ZONAS WHERE ZONA_COD = :CODZONA INTO :NOMZONA;
        if (CODCIUD IS NOT NULL) then
            SELECT CIUD_NOM FROM CIUDADES  WHERE CIUD_COD = :CODCIUD INTO :NOMCIUD;
        FOR SELECT DISTINCT COBR_COD FROM MOVIMIENTO_CLIENTES WHERE TERC_NIT = :NIT AND
            MVCL_SUCURSAL = :SUCURSAL AND MVCL_FECHA <= :FECHA AND
            MVCL_ABONO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) AND MVCL_VENCE >= :VENCEINI AND MVCL_VENCE <= :VENCEFIN
            INTO :codcobr
            DO
            begin
            OK = 'N';
            if (GRPINI = '') then
                BEGIN
                if ((CODCOBR IS NULL) or (CODCOBR >= :GRPINI AND CODCOBR <= :GRPFIN)) then
                    OK = 'S';
                END
            ELSE
                if (CODCOBR >= :GRPINI AND CODCOBR <= :GRPFIN) then
                    OK = 'S';
            if (OK = 'S') then
                BEGIN
                SELECT COBR_NOM FROM COBRADORES  WHERE COBR_COD = :CODCOBR INTO :NOMCOBR;

                SALDO = 0;
                 $$IBE$$*/ /* BUSQUE EN SALDOS_DOC_CARTERA LOS QUE TENGAN SALDO > 0 */ /*$$IBE$$ 
                FOR SELECT MVCL_TIPOREF, MVCL_IDREF
                  FROM MOVIMIENTO_CLIENTES WHERE TERC_NIT = :NIT AND MVCL_SUCURSAL = :SUCURSAL AND
                  MVCL_FECHA <= :FECHA AND COBR_COD = :codcobr AND MVCL_ABONO = 'N' AND
                  ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) AND MVCL_VENCE >= :VENCEINI AND MVCL_VENCE <= :VENCEFIN
                  INTO :TIPO, :ID
                  DO
                    if ((inclanti = 'SI') or (TIPO <> 45)) then
                        BEGIN
                        EXECUTE PROCEDURE saldo_doc_cartera(TIPO, ID, FECHA) returning_values (PSALDO);
                        if (PSALDO <> 0) then
                            BEGIN
                            SALDO = SALDO + PSALDO;
                            END
                        END
                DISPONIBLE = CUPO - SALDO;
                 $$IBE$$*/ /* LOS RECIBOS PROVISIONALES */ /*$$IBE$$ 
                SELECT SUM(RPDE_ABONO) FROM RECIBO_PROVISIONAL P, recibo_provisional_detalle D
                    WHERE P.rcpr_id = D.rcpr_id AND TERC_NIT = :NIT AND RPDE_SUCURSAL = :SUCURSAL AND
                    VEND_COD = :CODCOBR AND RCPR_FECHA <= :FECHA AND RCPR_ANULADO = 'N' AND ((RCPR_FECCRUCE IS NULL) or (RCPR_FECCRUCE > :FECHA)) AND
                    ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                    INTO :provisional;
                 $$IBE$$*/ /* LAS NOTAS DE CLIENTES */ /*$$IBE$$ 
                I = 0;
                NOTA1 = '';
                NOTA2 = '';
                FOR SELECT CAST(NOCL_FECHA AS VARCHAR(10)), tido_nomcorto, NOCL_NUMDOC, NOCL_TEXTO
                    FROM NOTAS_CLIENTES N, TIPO_DOCUMENTO T WHERE N.NOCL_TIPODOC = T.TIDO_COD AND TERC_NIT = :NIT
                    AND N.TINO_COD = 3 AND N.CLSU_COD = :SUCURSAL
                    ORDER BY NOCL_FECHA DESC INTO :FECNOTA, :TIPODOC, :NUMDOC, :NOTA
                    DO
                    BEGIN
                    if (I = 0) then
                        NOTA1 = NOTA;
                    if (I = 1) then
                        NOTA2 = NOTA;
                    I = I + 1;
                    END
                SUSPEND;
                END  $$IBE$$*/ /* OK = S */ /*$$IBE$$ 
            END  $$IBE$$*/ /* FOR COBRADOR */ /*$$IBE$$ 
        END  $$IBE$$*/ /* AGRUPA = C */ /*$$IBE$$ 
    END  $$IBE$$*/ /* FOR NIT */
SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE REP_MOVIMIENTO_CLIENTE(
    DESDE VARCHAR(20),
    HASTA VARCHAR(20),
    GRPINI VARCHAR(5),
    GRPFIN VARCHAR(5),
    FECINI DATE,
    FECFIN DATE,
    DETALLE CHAR(1),
    ORDEN CHAR(1),
    AGRUPA CHAR(1),
    SUBEMPRESA INTEGER)
RETURNS (
    NIT VARCHAR(20),
    NOMBRE VARCHAR(60),
    TELEFONO VARCHAR(40),
    CIUDAD VARCHAR(40),
    CODZONA VARCHAR(2),
    NOMZONA VARCHAR(60),
    CODCOBR INTEGER,
    NOMCOBR VARCHAR(60),
    SUCURSAL VARCHAR(10),
    NOMSUC VARCHAR(60),
    DV CHAR(1),
    CODCIUD CHAR(5),
    NOMCIUD VARCHAR(60),
    INICIAL NUMERIC(18,2),
    TIPODOC VARCHAR(8),
    TIPOREF INTEGER,
    IDDOC INTEGER,
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    VENCE DATE,
    CONCEPTO VARCHAR(60),
    DEBITO NUMERIC(18,2),
    CREDITO NUMERIC(18,2),
    SALDO NUMERIC(18,2),
    RTFTE NUMERIC(18,2),
    RTIVA NUMERIC(18,2),
    RTICA NUMERIC(18,2),
    CUPO NUMERIC(18,2))
AS
declare variable NITINI VARCHAR(20);
declare variable NITFIN VARCHAR(20);
declare variable NOMINI VARCHAR(20);
declare variable NOMFIN VARCHAR(20);
declare variable OK CHAR(1);
declare variable DB CHAR(1);
declare variable AB CHAR(1);
declare variable RETES CHAR(2);
declare variable ABONOS NUMERIC(18,2);
BEGIN /*$$IBE$$ 
if (ORDEN = 'C') then
    BEGIN
    NITINI = DESDE;
    NITFIN = HASTA;
    NOMINI = '';
    NOMFIN = 'zz';
    END
ELSE
    BEGIN
    NOMINI = DESDE;
    NOMFIN = HASTA;
    NITINI = '';
    NITFIN = 'zz';
    END
  EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'DESCONTAR RETENCIONES POR CAUSACION') returning_values (:RETES);
   $$IBE$$*/ /* Ubique el NIT */ /*$$IBE$$ 
  FOR select T.TERC_NIT, TERC_NOM, TERC_DV, CLSU_TEL, CLSU_CIUDAD, S.COBR_COD, S.ZONA_COD, T.CIUD_COD, CLIE_CUPO, CLCU_COD, CLSU_NOMBRE
    from terceros T, CLIENTES C, CLIENTE_SUCURSALES S
    where C.TERC_NIT = T.TERC_NIT AND TERC_CLIE = 'S' AND S.TERC_NIT = C.TERC_NIT AND T.TERC_NIT >= :NITINI AND T.TERC_NIT <= :NITFIN AND
        TERC_NOM >= :NOMINI AND TERC_NOM <= :NOMFIN
    INTO :NIT, :NOMBRE, :DV, :TELEFONO, :CIUDAD, :CODCOBR, :CODZONA, :CODCIUD, :CUPO, :SUCURSAL, :NOMSUC
    DO  
    BEGIN
    SELECT COBR_NOM FROM COBRADORES WHERE COBR_COD = :CODCOBR INTO :NOMCOBR;
    SELECT ZONA_NOM FROM ZONAS WHERE ZONA_COD = :CODZONA INTO :NOMZONA;
    SELECT CIUD_NOM FROM CIUDADES WHERE CIUD_COD = :CODCIUD INTO :NOMCIUD;
    OK = 'N';
    if (AGRUPA = 'Z') then
        BEGIN
        if (GRPINI = '') then
            BEGIN
            if ((CODZONA IS NULL) or (CODZONA >= :GRPINI AND CODZONA <= :GRPFIN)) then
                OK = 'S';
            END
        ELSE
            if (CODZONA >= :GRPINI AND CODZONA <= :GRPFIN) then
                OK = 'S';
        END
    if (AGRUPA = 'I') then
        BEGIN
        if (GRPINI = '') then
            BEGIN
            if ((CODCIUD IS NULL) or (CODCIUD >= :GRPINI AND CODCIUD <= :GRPFIN)) then
                OK = 'S';
            END
        ELSE
            if (CODCIUD >= :GRPINI AND CODCIUD <= :GRPFIN) then
                OK = 'S';
        END
    if (AGRUPA = 'N') then
        OK = 'S';
        
    if (OK = 'S') then
        BEGIN
        INICIAL = 0;
        FECINI = FECINI - 1;
        FOR SELECT MVCL_TIPOREF, MVCL_IDREF FROM MOVIMIENTO_CLIENTES
          WHERE TERC_NIT = :NIT AND MVCL_SUCURSAL = :SUCURSAL AND MVCL_FECHA <= :FECINI AND
            MVCL_ABONO = 'N' AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA))
          INTO :TIPODOC, :IDDOC
          DO
            BEGIN
            EXECUTE PROCEDURE saldo_doc_cartera(TIPODOC, IDDOC, FECINI) returning_values (SALDO);
            INICIAL = INICIAL + SALDO;
            END
        SALDO = INICIAL;
        FECINI = FECINI + 1;
        if (DETALLE = 'S') then
          BEGIN
          FOR select mvcl_tiporef, tido_nomcorto, mvcl_idref, mvcl_prefref, mvcl_numref, mvcl_fecha, mvcl_conc, mvcl_monto, mvcl_debito, mvcl_rtefte, mvcl_rteiva, mvcl_rteica, mvcl_abono, mvcl_vence
            from movimiento_clientes m, tipo_documento t
            where m.mvcl_tiporef = t.tido_cod and terc_nit = :NIT and MVCL_SUCURSAL = :SUCURSAL AND
                mvcl_fecha >= :FECINI and mvcl_fecha <= :FECFIN and mvcl_tiporef <> 45 AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA))
            order by mvcl_fecha, mvcl_tiporef, mvcl_idref
            into :TIPOREF, :TIPODOC, :IDDOC, :PREFIJO, :NUMERO, :FECHA, :CONCEPTO, :DEBITO, :DB, :RTFTE, :RTIVA, :RTICA, :AB, :VENCE
            DO
            BEGIN
            if (RTFTE IS NULL) then
                RTFTE = 0;
            if (RTIVA IS NULL) then
                RTIVA = 0;
            if (RTICA IS NULL) then
                RTICA = 0;
            if (DB = 'N') then
                BEGIN
                CREDITO = DEBITO;
                DEBITO = 0;
                RTFTE = rtfte * -1;
                RTIVA = rtiva * -1;
                RTICA = rtica * -1;
                END
            ELSE
                CREDITO = 0;
            IF (RETES = 'SI') then
                if (AB = 'N') then
                    SALDO = SALDO + DEBITO - CREDITO - RTFTE - RTIVA - RTICA;
                else
                    SALDO = SALDO + DEBITO - CREDITO;
            ELSE
                if (AB = 'N') then
                    SALDO = SALDO + DEBITO - CREDITO;
                else
                    SALDO = SALDO + DEBITO - CREDITO + RTFTE + RTIVA + RTICA;
            SUSPEND;
            END
          END
        ELSE
            BEGIN
            IF (RETES = 'SI') then
                BEGIN
                SELECT SUM(MVCL_MONTO-MVCL_RTEFTE-MVCL_RTEIVA-MVCL_RTEICA) FROM movimiento_clientes
                    WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND MVCL_FECHA <= :FECFIN AND MVCL_DEBITO = 'S'
                        AND MVCL_SUCURSAL = :SUCURSAL AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA)) INTO :DEBITO;
                SELECT SUM(MVCL_MONTO-MVCL_RTEFTE-MVCL_RTEIVA-MVCL_RTEICA) FROM movimiento_clientes
                    WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND MVCL_FECHA <= :FECFIN AND MVCL_DEBITO = 'N' and MVCL_ABONO = 'N' AND mvcl_tiporef <> 45
                        AND MVCL_SUCURSAL = :SUCURSAL AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA)) INTO :CREDITO;
                SELECT SUM(MVCL_MONTO) FROM movimiento_clientes WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI
                    AND MVCL_FECHA <= :FECFIN AND MVCL_DEBITO = 'N'  and MVCL_ABONO = 'S' AND MVCL_SUCURSAL = :SUCURSAL
                        AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA)) INTO :ABONOS;
                END
            ELSE
                BEGIN
                SELECT SUM(MVCL_MONTO) FROM movimiento_clientes WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND MVCL_FECHA <= :FECFIN AND MVCL_DEBITO = 'S'
                    AND MVCL_SUCURSAL = :SUCURSAL AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA)) INTO :DEBITO;
                SELECT SUM(MVCL_MONTO) FROM movimiento_clientes WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND MVCL_FECHA <= :FECFIN AND MVCL_DEBITO = 'N' and MVCL_ABONO = 'N' and mvcl_tiporef <> 45
                    AND MVCL_SUCURSAL = :SUCURSAL AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA)) INTO :CREDITO;
                SELECT SUM(MVCL_MONTO+MVCL_RTEFTE+MVCL_RTEIVA+MVCL_RTEICA) FROM movimiento_clientes WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND MVCL_FECHA <= :FECFIN AND MVCL_DEBITO = 'N'  and MVCL_ABONO = 'S'
                    AND MVCL_SUCURSAL = :SUCURSAL AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA)) INTO :ABONOS;
                END
            if (DEBITO IS NULL) then
                DEBITO = 0;
            if (CREDITO IS NULL) then
                CREDITO = 0;
            if (ABONOS IS NULL) then
                ABONOS = 0;
            CREDITO = CREDITO + ABONOS;
            SALDO = INICIAL + DEBITO - CREDITO;
            SUSPEND;
            END
        END
    if (AGRUPA = 'C') then
        BEGIN
        FOR SELECT DISTINCT COBR_COD FROM MOVIMIENTO_CLIENTES
            WHERE TERC_NIT = :NIT AND MVCL_SUCURSAL = :SUCURSAL AND MVCL_FECHA <= :FECINI AND
            MVCL_ABONO = 'N' AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA))
            INTO :codcobr
            DO
            BEGIN
            OK = 'N';
            if (GRPINI = '') then
                BEGIN
                if ((CODCOBR IS NULL) or (CODCOBR >= :GRPINI AND CODCOBR <= :GRPFIN)) then
                    OK = 'S';
                END
            ELSE
                if (CODCOBR >= :GRPINI AND CODCOBR <= :GRPFIN) then
                    OK = 'S';
            if (OK = 'S') then
                BEGIN
                SELECT COBR_NOM FROM COBRADORES WHERE COBR_COD = :CODCOBR INTO :NOMCOBR;
                INICIAL = 0;
                FECINI = FECINI - 1;
                FOR SELECT MVCL_TIPOREF, MVCL_IDREF FROM MOVIMIENTO_CLIENTES
                  WHERE TERC_NIT = :NIT AND MVCL_SUCURSAL = :SUCURSAL AND MVCL_FECHA <= :FECINI AND
                  COBR_COD = :CODCOBR AND MVCL_ABONO = 'N' AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA))
                  INTO :TIPODOC, :IDDOC
                  DO
                    BEGIN
                    EXECUTE PROCEDURE saldo_doc_cartera(TIPODOC, IDDOC, FECINI) returning_values (SALDO);
                    INICIAL = INICIAL + SALDO;
                    END
                SALDO = INICIAL;
                FECINI = FECINI + 1;
                if (DETALLE = 'S') then
                  BEGIN
                  FOR select mvcl_tiporef, tido_nomcorto, mvcl_idref, mvcl_prefref, mvcl_numref, mvcl_fecha, mvcl_conc, mvcl_monto, mvcl_debito, mvcl_rtefte, mvcl_rteiva, mvcl_rteica, mvcl_abono, mvcl_vence
                    from movimiento_clientes m, tipo_documento t
                    where m.mvcl_tiporef = t.tido_cod and terc_nit = :NIT and MVCL_SUCURSAL = :SUCURSAL AND
                    mvcl_fecha >= :FECINI and mvcl_fecha <= :FECFIN and mvcl_tiporef <> 45 AND
                    COBR_COD = :CODCOBR AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA))
                    order by mvcl_fecha, mvcl_tiporef, mvcl_idref
                    into :TIPOREF, :TIPODOC, :IDDOC, :PREFIJO, :NUMERO, :FECHA, :CONCEPTO, :DEBITO, :DB, :RTFTE, :RTIVA, :RTICA, :AB, :VENCE
                    DO
                    BEGIN
                    if (RTFTE IS NULL) then
                        RTFTE = 0;
                    if (RTIVA IS NULL) then
                        RTIVA = 0;
                    if (RTICA IS NULL) then
                        RTICA = 0;
                    if (DB = 'N') then
                        BEGIN
                        CREDITO = DEBITO;
                        DEBITO = 0;
                        RTFTE = rtfte * -1;
                        RTIVA = rtiva * -1;
                        RTICA = rtica * -1;
                        END
                    ELSE
                        CREDITO = 0;
                    IF (RETES = 'SI') then
                        if (AB = 'N') then
                            SALDO = SALDO + DEBITO - CREDITO - RTFTE - RTIVA - RTICA;
                        else
                            SALDO = SALDO + DEBITO - CREDITO;
                    ELSE
                        if (AB = 'N') then
                            SALDO = SALDO + DEBITO - CREDITO;
                        else
                            SALDO = SALDO + DEBITO - CREDITO - RTFTE - RTIVA - RTICA;
                    SUSPEND;
                    END
                  END
                ELSE
                    BEGIN
                    IF (RETES = 'SI') then
                        BEGIN
                        SELECT SUM(MVCL_MONTO-MVCL_RTEFTE-MVCL_RTEIVA-MVCL_RTEICA)
                            FROM movimiento_clientes WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND
                            COBR_COD = :CODCOBR AND MVCL_FECHA <= :FECFIN AND MVCL_DEBITO = 'S' AND
                            MVCL_SUCURSAL = :SUCURSAL AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA)) INTO :DEBITO;
                        SELECT SUM(MVCL_MONTO-MVCL_RTEFTE-MVCL_RTEIVA-MVCL_RTEICA)
                            FROM movimiento_clientes WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND
                            COBR_COD = :CODCOBR AND MVCL_FECHA <= :FECFIN AND MVCL_DEBITO = 'N' and
                            MVCL_ABONO = 'N' AND mvcl_tiporef <> 45 AND MVCL_SUCURSAL = :SUCURSAL AND
                            ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA)) INTO :CREDITO;
                        SELECT SUM(MVCL_MONTO) FROM movimiento_clientes WHERE TERC_NIT = :NIT AND
                            COBR_COD = :CODCOBR AND MVCL_FECHA >= :FECINI AND MVCL_FECHA <= :FECFIN AND
                            MVCL_DEBITO = 'N'  and MVCL_ABONO = 'S' AND MVCL_SUCURSAL = :SUCURSAL AND
                            ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA)) INTO :ABONOS;
                        END
                    ELSE
                        BEGIN
                        SELECT SUM(MVCL_MONTO) FROM movimiento_clientes WHERE TERC_NIT = :NIT AND
                            COBR_COD = :CODCOBR AND MVCL_FECHA >= :FECINI AND MVCL_FECHA <= :FECFIN AND
                            MVCL_DEBITO = 'S' AND MVCL_SUCURSAL = :SUCURSAL AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA)) INTO :DEBITO;
                        SELECT SUM(MVCL_MONTO) FROM movimiento_clientes WHERE TERC_NIT = :NIT AND
                            COBR_COD = :CODCOBR AND MVCL_FECHA >= :FECINI AND MVCL_FECHA <= :FECFIN AND
                            MVCL_DEBITO = 'N' and MVCL_ABONO = 'N' and mvcl_tiporef <> 45 AND
                            MVCL_SUCURSAL = :SUCURSAL AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA)) INTO :CREDITO;
                        SELECT SUM(MVCL_MONTO+MVCL_RTEFTE+MVCL_RTEIVA+MVCL_RTEICA)
                            FROM movimiento_clientes WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND
                            MVCL_FECHA <= :FECFIN AND COBR_COD = :CODCOBR AND MVCL_DEBITO = 'N' and
                            MVCL_ABONO = 'S' AND MVCL_SUCURSAL = :SUCURSAL AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA)) INTO :ABONOS;
                        END
                    if (DEBITO IS NULL) then
                        DEBITO = 0;
                    if (CREDITO IS NULL) then
                        CREDITO = 0;
                    if (ABONOS IS NULL) then
                        ABONOS = 0;
                    CREDITO = CREDITO + ABONOS;
                    SALDO = INICIAL + DEBITO - CREDITO;
                    SUSPEND;
                    END
                END  $$IBE$$*/ /* ok = S */ /*$$IBE$$ 
            END  $$IBE$$*/ /* FOR COBRADOR */ /*$$IBE$$ 
        END  $$IBE$$*/ /* AGRUPA C */ /*$$IBE$$ 
    END  $$IBE$$*/ /* FOR NIT */
SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE VENCIDO_CLIENTE(
    NIT VARCHAR(20),
    FECHA DATE,
    SUCURSAL VARCHAR(10),
    BLOQ CHAR(1))
RETURNS (
    TIPO INTEGER,
    ID INTEGER,
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(6),
    SALDO NUMERIC(18,2),
    RTFTE NUMERIC(18,2),
    RTIVA NUMERIC(18,2),
    RTICA NUMERIC(18,2),
    DTOF NUMERIC(18,2),
    TIPONOM VARCHAR(8))
AS
DECLARE VARIABLE FEC DATE;
declare variable DB CHAR(1);
declare variable VENCE DATE;
declare variable AUTORET VARCHAR(10);
declare variable FAUTORET DATE;
declare variable FECDOC DATE;
declare variable DIAS INTEGER;
declare variable DIASBLOQ INTEGER;
BEGIN /*$$IBE$$ 
EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'FECHA AUTORETENEDOR NO DESCONTAR RETENCIONES DEL SALDO PERO SI CONTABILIZARLAS') returning_values (AUTORET);
if (AUTORET <> '') then
    FAUTORET = CAST(AUTORET AS DATE);
else
    FAUTORET = '9999/12/31';
 $$IBE$$*/ /* BUSQUE EN SALDOS_DOC_CARTERA LOS QUE TENGAN SALDO > 0 */ /*$$IBE$$ 
FOR SELECT MVCL_TIPOREF, MVCL_IDREF, MVCL_DEBITO, MVCL_PREFREF, MVCL_NUMREF, MVCL_VENCE, MVCL_FECHA
    FROM MOVIMIENTO_CLIENTES
    WHERE TERC_NIT = :NIT AND ((MVCL_SUCURSAL = :SUCURSAL) or (:SUCURSAL = 0)) AND MVCL_FECHA <= :FECHA AND MVCL_ABONO = 'N'
    INTO :TIPO, :ID, :DB, :PREFIJO, :NUMERO, :VENCE, :FECDOC
    DO
    BEGIN
    EXECUTE PROCEDURE saldo_doc_cartera(TIPO, ID, FECHA) returning_values (SALDO);
    if ((SALDO <> 0) AND (VENCE < FECHA)) then
        BEGIN
        DIAS = fecha - vence;
        SELECT CLIE_DIASBLOQ FROM CLIENTES WHERE TERC_NIT = :NIT INTO :DIASBLOQ;
        if (diasbloq IS NULL) then
            diasbloq = 0;
        if ((BLOQ <> 'S') OR (DIAS > DIASBLOQ)) then
            BEGIN
            SELECT TIDO_NOMCORTO FROM TIPO_DOCUMENTO WHERE TIDO_COD = :TIPO INTO :TIPONOM;
            if (TIPO = 41) then
                SELECT NDCL_DTOFMONTO, NDCL_FECHADTO FROM NOTAS_DEBITO_CLIENTES WHERE NDCL_ID = :ID INTO :DTOF, :FEC;
            if (TIPO = 42) then
                SELECT 0, NCCL_FECHA FROM NOTAS_CREDITO_CLIENTES WHERE NCCL_ID = :ID INTO :DTOF, :FEC;
            if (TIPO = 45) then
                SELECT ANCL_DTOFMONTO, ANCL_DTOFECHA FROM ANTICIPOS_CLIENTE WHERE ANCL_ID = :ID INTO :DTOF, :FEC;
            if (TIPO = 31) then
                SELECT 0, :FECHA FROM FACTURAS WHERE FACT_ID = :ID INTO :DTOF, :FEC;
            if (TIPO = 33) then
                SELECT 0, :FECHA FROM devoluciones_ventas WHERE DEVT_ID = :ID INTO :DTOF, :FEC;
            if (FECHA > FEC) then
                DTOF = 0;
            if (DTOF IS NULL) then
                DTOF = 0;
            if (FAUTORET <= FECDOC) then
                BEGIN
                RTFTE = 0;
                RTIVA = 0;
                RTICA = 0;
                END
            ELSE
                BEGIN
                SELECT SUM(SDCA_RTFTE - SDCA_ABRTFTE), SUM(SDCA_RTIVA - SDCA_ABRTIVA), SUM(SDCA_RTICA - SDCA_ABRTICA)
                    FROM SALDOS_DOC_CARTERA WHERE SDCA_TIPOREF = :TIPO AND SDCA_IDREF = :ID INTO :RTFTE, :RTIVA, :RTICA;
                if (RTFTE IS NULL) then
                    RTFTE = 0;
                if (RTIVA IS NULL) then
                    RTIVA = 0;
                if (RTICA IS NULL) then
                    RTICA = 0;
                END
            SUSPEND;
            END
        END
    END
 $$IBE$$*/ SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE CUPO_DISPONIBLE(
    NIT VARCHAR(20),
    FECHA DATE,
    SUCURSAL VARCHAR(10))
RETURNS (
    DISPONIBLE NUMERIC(18,2))
AS
declare variable SALDO NUMERIC(18,2);
begin /*$$IBE$$ 
SELECT CLIE_CUPO FROM CLIENTES WHERE TERC_NIT = :NIT INTO :DISPONIBLE;
if (DISPONIBLE IS NULL) then
    DISPONIBLE = 0;
SELECT SUM(SALDO) FROM VENCIDO_CLIENTE (:NIT, :FECHA, :SUCURSAL, 'N') INTO :SALDO;
if (SALDO IS NULL) then
    SALDO = 0;
DISPONIBLE = DISPONIBLE - SALDO;
suspend;
 $$IBE$$*/ SUSPEND;
end
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE MOVIMIENTO_CARTERA_DESDE_HASTA(
    NIT VARCHAR(20),
    DESDE DATE,
    HASTA DATE,
    EMPSUCURSAL INTEGER)
RETURNS (
    INICIAL NUMERIC(18,2),
    TIPODOC VARCHAR(8),
    IDDOC INTEGER,
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    CONCEPTO VARCHAR(60),
    DEBITO NUMERIC(18,2),
    CREDITO NUMERIC(18,2),
    SALDO NUMERIC(18,2),
    NOMBRE VARCHAR(60),
    RTFTE NUMERIC(18,2),
    RTIVA NUMERIC(18,2),
    RTICA NUMERIC(18,2),
    SUCURSAL VARCHAR(10),
    RECPROV_ID INTEGER,
    RECIPROV CHAR(1))
AS
declare variable DB CHAR(1);
declare variable AB CHAR(1);
declare variable RETES CHAR(2);
declare variable tipo integer;
BEGIN
  /* Ubique el NIT */ /*$$IBE$$ 
  select terc_nom from terceros where terc_nit = :NIT INTO :NOMBRE;
  DESDE = DESDE - 1;
  INICIAL = 0;
  FOR SELECT MVCL_TIPOREF, MVCL_IDREF FROM MOVIMIENTO_CLIENTES
    WHERE TERC_NIT = :NIT AND MVCL_FECHA <= :DESDE AND MVCL_ABONO = 'N' AND ((:empsucursal = 0) or (SUCU_ID = :empsucursal))
    INTO :TIPODOC, :IDDOC
    DO
    BEGIN
    EXECUTE PROCEDURE saldo_doc_cartera(TIPODOC, IDDOC, DESDE) returning_values (SALDO);
    if (SALDO <> 0) then
        INICIAL = INICIAL + SALDO;
    END
  DESDE = DESDE + 1;
  SALDO = INICIAL;
  EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'DESCONTAR RETENCIONES POR CAUSACION') returning_values(:RETES);
  FOR select tido_nomcorto, MVCL_TIPOREF, mvcl_idref, mvcl_prefref, mvcl_numref, mvcl_fecha, mvcl_conc, mvcl_monto, mvcl_debito, mvcl_rtefte, mvcl_rteiva, mvcl_rteica, mvcl_abono, mvcl_sucursal
    from movimiento_clientes m, tipo_documento t
    where m.mvcl_tiporef = t.tido_cod and terc_nit = :NIT and mvcl_fecha >= :DESDE and mvcl_fecha <= :HASTA and mvcl_tiporef <> 45 AND ((SUCU_ID = :EMPSUCURSAL) or (:EMPSUCURSAL = 0))
    order by mvcl_fecha, mvcl_tiporef
    into :TIPODOC,:tipo,  :IDDOC, :PREFIJO, :NUMERO, :FECHA, :CONCEPTO, :DEBITO, :DB, :RTFTE, :RTIVA, :RTICA, :AB, :SUCURSAL
    DO
    BEGIN
    if (DB = 'N') then
        BEGIN
        if (AB = 'S') then
            if (RETES = 'SI') then
                CREDITO = DEBITO;
            ELSE
                CREDITO = DEBITO + RTFTE + RTIVA + RTICA;
        ELSE
            if (RETES = 'SI') then
                CREDITO = DEBITO - RTFTE - RTIVA - RTICA;
            ELSE
                CREDITO = DEBITO;
        DEBITO = 0;
        END
    ELSE
        BEGIN
        if (RETES = 'SI') then
            DEBITO = DEBITO - RTFTE - RTIVA - RTICA;
        CREDITO = 0;
        END
    SALDO = SALDO + DEBITO - CREDITO;
     $$IBE$$*/ /* IDENTIFICAR SI EL DOCUMENTO TIENE RECIBO PROVISIONAL*/ /*$$IBE$$ 
    recprov_id = 0;
    SELECT max(RCPR_ID) FROM recibo_provisional_detalle WHERE RPDE_IDDOC = :iddoc  AND RPDE_TIPODOC = :TIPO and RPDE_ANULADO = 'N' INTO :recprov_id;
    if  $$IBE$$*/ /*(recprov_id = 0) or */ /*$$IBE$$ (recprov_id is null) then
      BEGIN
       reciprov = 'N';
      end
    ELSE
      begin
       reciprov = 'S';
      END
    SUSPEND;
    END
 $$IBE$$*/ SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE REGISTRA_RECIBOS_CONTADO(
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    PREFAC VARCHAR(4),
    MONTO NUMERIC(18,2))
AS
declare variable id integer;
declare variable idr integer;
declare variable NIT VARCHAR(20);
declare variable punto integer;
declare variable caja integer;
declare variable vend integer;
begin /*$$IBE$$ 
for select fact_id, f.pref_pre, fact_numero, fact_fecha, vend_cod, terc_nit, a.auto_prefrdc, ptvt_id from facturas f, autorizaciones a
    where f.pref_pre = a.pref_pre and a.auto_contado = 'S' and fact_fecha >= :fecini and fact_fecha <= :fecfin
    into :id, :prefac, :numero, :fecha, :vend, :NIT, :PREF, :punto
    do
    begin
    select caja_id from punto_venta where ptvt_id = :punto into :caja;
    execute procedure saldo_doc_cartera(31, :id, cast('now' as date)) returning_values (:monto);
    if (monto <> 0) then
        begin
        idr = gen_id(id_recicaja, 1);
        insert into recibos_caja (reca_id, caja_id, tido_cod, pref_pre, reca_numero, reca_fecha, reca_conc, reca_monto,
            reca_rtftemonto, reca_rtivamonto, reca_rticamonto, reca_dtof, reca_obs, terc_nit, reca_nomterc, reca_anulado,
            reca_transmit, cobr_cod, numok)
            values (:idr, :caja, 61, :pref, :numero, :fecha, 'CANCELA FACTURA CONTADO No. ' || :prefac || :numero,  :MONTO,
            0, 0, 0, 0, NULL, :NIT, 'VENTAS CONTADO', 'N', 'N', :vend, 'N');
        insert into recibos_caja_detalle (reca_id, rcde_item, rcde_tipodoc, rcde_iddoc, rcde_prefijo, rcde_numero, rcde_abono,
            rcde_rtfte, rcde_rtiva, rcde_rtica, rcde_dtof, rcde_anulado, rcde_transmit, rcde_comip, rcde_sucursal)
            values (:idr, 1, 31, :id, :prefac, :numero, :monto, 0, 0, 0, 0, 'N', 'N', '', '01');
        insert into recibos_caja_pago (reca_id, rcpa_item, fopa_id, rcpa_banco, rcpa_cuenta, rcpa_numero, rcpa_fecha, rcpa_monto,
            rcpa_anulado, rcpa_transmit, rcpa_ivamonto)
            values (:idr, 1, 1, null, null, null, :fecha, :monto, 'N', 'N', 0);
        suspend;
        end
    end
 $$IBE$$*/ SUSPEND;
end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER APLICACION_CLIENTE_DETALLE_AI FOR APLICACION_CLIENTE_DETALLE
ACTIVE AFTER INSERT POSITION 0
AS
declare variable EXISTE CHAR(1);
declare variable FEC DATE;
declare variable NIT VARCHAR(20);
declare variable CONCEPTO VARCHAR(60);
declare variable PREFIJO VARCHAR(4);
declare variable NUMERO VARCHAR(6);
declare variable SALDO NUMERIC(18,2);
declare variable RETES CHAR(2);
declare variable SUCURSAL VARCHAR(10);
declare variable COBR INTEGER;
BEGIN
if ((NEW.APCL_ID <> 0) and (new.acde_anulado = 'N')) then
    BEGIN
    /* Abone el documento referenciado */
    select PREF_PRE, APCL_NUMERO, apcl_fecha, APCL_CONCEPTO, TERC_NIT, APCL_SUCURSAL, COBR_COD
        from aplicacion_cliente where apcl_id = new.apcl_id
        into :PREFIJO, :NUMERO, :FEC, :CONCEPTO, :NIT, :SUCURSAL, :COBR;
    /* valide que no se pase del saldo */
/*    execute procedure saldo_doc_cartera(new.acde_tipodoc, new.acde_iddoc, '9999/12/31') returning_values(saldo);*/
    execute procedure lee_configuracion('CARTERA', 'SALDOS', 'DESCONTAR RETENCIONES POR CAUSACION') returning_values (RETES);
    if (SALDO < 0) then
        BEGIN
        if (RETES = 'SI') then
            begin
            if (saldo > NEW.acde_aplicado) then
                EXCEPTION DOCUMENTO_ABONO_MAYOR 'EL SALDO DEL DOCUMENTO ' || NEW.acde_prefijo || NEW.acde_numero || ' ES INSUFICIENTE.';
            end
        ELSE
            begin
            if (saldo > (NEW.acde_aplicado + NEW.acde_rtfte + NEW.acde_rtiva + NEW.acde_rtica)) then
                EXCEPTION DOCUMENTO_ABONO_MAYOR 'EL SALDO DEL DOCUMENTO ' || NEW.acde_prefijo || NEW.acde_numero || ' ES INSUFICIENTE.';
            end
        END
    else
        BEGIN
        if (RETES = 'SI') then
            begin
            if (saldo < NEW.acde_aplicado) then
                EXCEPTION DOCUMENTO_ABONO_MAYOR 'EL SALDO DEL DOCUMENTO ' || NEW.acde_prefijo || NEW.acde_numero || ' ES INSUFICIENTE.';
            end
        ELSE
            begin
            if (saldo < (NEW.acde_aplicado + NEW.acde_rtfte + NEW.acde_rtiva + NEW.acde_rtica)) then
                EXCEPTION DOCUMENTO_ABONO_MAYOR 'EL SALDO DEL DOCUMENTO ' || NEW.acde_prefijo || NEW.acde_numero || ' ES INSUFICIENTE.';
            end
        END
    select 'S' from saldos_doc_cartera where sdca_tiporef = new.acde_tipodoc and sdca_idref = new.acde_iddoc and sdca_fecha = :FEC into :EXISTE;
    if (Existe = 'S') then
        begin
        /* actualice el saldo del dia */
        UPDATE saldos_doc_cartera
            SET SDCA_ABONO = SDCA_ABONO + NEW.acde_aplicado,
                SDCA_ABRTFTE = SDCA_ABRTFTE + NEW.acde_RTFTE,
                SDCA_ABRTIVA = SDCA_ABRTIVA + NEW.acde_RTIVA,
                SDCA_ABRTICA = SDCA_ABRTICA + NEW.acde_RTICA
            WHERE SDCA_TIPOREF = NEW.ACDE_TIPODOC AND SDCA_IDREF = NEW.acde_IDDOC AND SDCA_FECHA = :FEC;
        END
    ELSE
        BEGIN
        /* Inserte un nuevo saldo diario */
        INSERT INTO SALDOS_DOC_CARTERA (SDCA_TIPOREF, SDCA_IDREF, SDCA_FECHA, TERC_NIT, SDCA_RTFTE, SDCA_RTIVA, SDCA_RTICA, SDCA_ABONO, SDCA_ABRTFTE, SDCA_ABRTIVA, SDCA_ABRTICA, SDCA_DEBITO, SDCA_MONTO)
            VALUES (NEW.ACDE_TIPODOC, NEW.ACDE_IDDOC, :FEC, :NIT, 0, 0, 0, NEW.acde_aplicado, NEW.acde_rtfte, NEW.acde_rtiva, NEW.acde_rtica, 'N', 0);
        END
    /* actualice el registro en mov_cliente (por si son varios items) */
    EXISTE = 'N';
    SELECT 'S' FROM MOVIMIENTO_CLIENTES WHERE MVCL_TIPOREF = 43 AND MVCL_IDREF = NEW.APCL_ID INTO :EXISTE;
    if (EXISTE = 'S') then
        begin
        UPDATE movimiento_clientes
            SET MVCL_MONTO = MVCL_MONTO + NEW.acde_aplicado,
                MVCL_RTEFTE = MVCL_RTEFTE + NEW.acde_rtfte,
                MVCL_RTEIVA = MVCL_RTEIVA + NEW.acde_rtiva,
                MVCL_RTEICA = MVCL_RTEICA + NEW.acde_rtica
            WHERE MVCL_TIPOREF = 43 AND MVCL_IDREF = NEW.APCL_ID;
        end
    ELSE
        INSERT INTO MOVIMIENTO_CLIENTES (MVCL_ID, TERC_NIT, MVCL_TIPOREF, MVCL_IDREF, MVCL_FECHA, MVCL_VENCE, MVCL_CONC, MVCL_MONTO, MVCL_RTEFTE, MVCL_RTEIVA, MVCL_RTEICA, MVCL_DEBITO, MVCL_ABONO, MVCL_PREFREF, MVCL_NUMREF, MVCL_SUCURSAL, COBR_COD)
            VALUES (GEN_ID(ID_MOVCLI, 1), :NIT, 43, NEW.APCL_ID, :FEC, :FEC, :CONCEPTO, NEW.ACDE_APLICADO, NEW.ACDE_RTFTE, NEW.ACDE_RTIVA, NEW.ACDE_RTICA, 'N', 'S', :PREFIJO, :NUMERO, :SUCURSAL, :COBR);
    end
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER APLICACION_CLIENTE_DETALLE_AU FOR APLICACION_CLIENTE_DETALLE
ACTIVE AFTER UPDATE POSITION 0
AS
declare variable EXISTE CHAR(1);
declare variable FEC DATE;
declare variable NIT VARCHAR(20);
declare variable CONCEPTO VARCHAR(60);
declare variable PREFIJO VARCHAR(4);
declare variable NUMERO VARCHAR(6);
declare variable SALDO NUMERIC(18,2);
declare variable RETES CHAR(2);
declare variable SUCURSAL VARCHAR(10);
declare variable COBR INTEGER;
BEGIN
if ((old.apcl_id <> 0) and (old.acde_anulado = 'N')) then
    begin
    select apcl_fecha from aplicacion_CLIENTE
        where apcl_id = old.apcl_id into :FEC;
    UPDATE saldos_doc_cartera
        SET SDCA_ABONO = SDCA_ABONO - old.acde_aplicado,
        SDCA_ABRTFTE = SDCA_ABRTFTE - old.acde_RTFTE,
        SDCA_ABRTIVA = SDCA_ABRTIVA - old.acde_RTIVA,
        SDCA_ABRTICA = SDCA_ABRTICA - old.acde_RTICA
        WHERE SDCA_TIPOREF = OLD.ACDE_TIPODOC AND SDCA_IDREF = OLD.acde_IDDOC AND SDCA_FECHA = :FEC;
                    
    UPDATE movimiento_clientes
        SET MVCL_MONTO = MVCL_MONTO - OLD.acde_aplicado,
        MVCL_RTEFTE = MVCL_RTEFTE - OLD.acde_rtfte,
        MVCL_RTEIVA = MVCL_RTEIVA - OLD.acde_rtiva,
        MVCL_RTEICA = MVCL_RTEICA - OLD.acde_rtica
        WHERE MVCL_TIPOREF = 43 AND MVCL_IDREF = NEW.APCL_ID;
    end
if ((NEW.acde_anulado = 'N') AND (NEW.APCL_ID <> 0)) then
    BEGIN
    select PREF_PRE, APCL_NUMERO, apcl_fecha, APCL_CONCEPTO, TERC_NIT, APCL_SUCURSAL, COBR_COD
        from aplicacion_CLIENTE
        where apcl_id = new.apcl_id
        into :PREFIJO, :NUMERO, :FEC, :CONCEPTO, :NIT, :SUCURSAL, :COBR;
    /* valide que no se pase del saldo */
/*    execute procedure saldo_doc_cartera(new.acde_tipodoc, new.acde_iddoc, '9999/12/31') returning_values(saldo);*/
    execute procedure lee_configuracion('CARTERA', 'SALDOS', 'DESCONTAR RETENCIONES POR CAUSACION') returning_values (RETES);
    if (SALDO < 0) then
        BEGIN
        if (RETES = 'SI') then
            begin
            if (saldo > NEW.acde_aplicado) then
                EXCEPTION DOCUMENTO_ABONO_MAYOR;
            end
        ELSE
            begin
            if (saldo > (NEW.acde_aplicado + NEW.acde_rtfte + NEW.acde_rtiva + NEW.acde_rtica)) then
                EXCEPTION DOCUMENTO_ABONO_MAYOR;
            end
        END
    else
        BEGIN
        if (RETES = 'SI') then
            begin
            if (saldo < NEW.acde_aplicado) then
                EXCEPTION DOCUMENTO_ABONO_MAYOR;
            end
        ELSE
            begin
            if (saldo < (NEW.acde_aplicado + NEW.acde_rtfte + NEW.acde_rtiva + NEW.acde_rtica)) then
                EXCEPTION DOCUMENTO_ABONO_MAYOR;
            end
        END
        
    /* Abone el documento referenciado  */
    select 'S' from saldos_doc_cartera where sdca_tiporef = new.acde_tipodoc and sdca_idref = new.acde_iddoc and sdca_fecha = :FEC into :EXISTE;
    if (Existe = 'S') then
        /* actualice el saldo del dia */
        UPDATE saldos_doc_cartera
            SET SDCA_ABONO = SDCA_ABONO + NEW.acde_aplicado,
            SDCA_ABRTFTE = SDCA_ABRTFTE + NEW.acde_RTFTE,
            SDCA_ABRTIVA = SDCA_ABRTIVA + NEW.acde_RTIVA,
            SDCA_ABRTICA = SDCA_ABRTICA + NEW.acde_RTICA
        WHERE SDCA_TIPOREF = NEW.ACDE_TIPODOC AND SDCA_IDREF = NEW.acde_IDDOC AND SDCA_FECHA = :FEC;
    ELSE
        /* Inserte un nuevo saldo diario */
        INSERT INTO SALDOS_DOC_CARTERA (SDCA_TIPOREF, SDCA_IDREF, SDCA_FECHA, TERC_NIT, SDCA_RTFTE, SDCA_RTIVA, SDCA_RTICA, SDCA_ABONO, SDCA_ABRTFTE, SDCA_ABRTIVA, SDCA_ABRTICA, SDCA_DEBITO, SDCA_MONTO)
            VALUES (NEW.ACDE_TIPODOC, NEW.ACDE_IDDOC, :FEC, :NIT, 0, 0, 0, NEW.acde_aplicado, NEW.acde_rtfte, NEW.acde_rtiva, NEW.acde_rtica, 'N', 0);
            
    /* Registre o actualice el registro en movimiento */
    EXISTE = 'N';
    SELECT 'S' FROM MOVIMIENTO_CLIENTES WHERE MVCL_TIPOREF = 43 AND MVCL_IDREF = NEW.APCL_ID INTO :EXISTE;
    if (EXISTE = 'S') then
        begin
        UPDATE movimiento_clientes
            SET MVCL_MONTO = MVCL_MONTO + NEW.acde_aplicado,
            MVCL_RTEFTE = MVCL_RTEFTE + NEW.acde_rtfte,
            MVCL_RTEIVA = MVCL_RTEIVA + NEW.acde_rtiva,
            MVCL_RTEICA = MVCL_RTEICA + NEW.acde_rtica
        WHERE MVCL_TIPOREF = 43 AND MVCL_IDREF = NEW.APCL_ID;
        end
    ELSE
        INSERT INTO MOVIMIENTO_CLIENTES (MVCL_ID, TERC_NIT, MVCL_TIPOREF, MVCL_IDREF, MVCL_FECHA, MVCL_VENCE, MVCL_CONC, MVCL_MONTO, MVCL_RTEFTE, MVCL_RTEIVA, MVCL_RTEICA, MVCL_DEBITO, MVCL_ABONO, MVCL_PREFref, MVCL_NUMREF, MVCL_SUCURSAL, COBR_COD)
            VALUES (GEN_ID(ID_MOVCLI, 1), :NIT, 43, NEW.APCL_ID, :FEC, :FEC, :CONCEPTO, NEW.ACDE_APLICADO, NEW.ACDE_RTFTE, NEW.ACDE_RTIVA, NEW.ACDE_RTICA, 'N', 'S', :PREFIJO, :NUMERO, :SUCURSAL, :COBR);
    end
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER EGRESOS_CRUCEC_AI FOR EGRESOS_CRUCEC
ACTIVE AFTER INSERT POSITION 0
AS
declare variable EXISTE CHAR(1);
declare variable FEC DATE;
declare variable NIT VARCHAR(20);
declare variable CONCEPTO VARCHAR(60);
declare variable PREFIJO VARCHAR(4);
declare variable NUMERO VARCHAR(6);
declare variable SALDO NUMERIC(18,2);
declare variable RETES CHAR(2);
declare variable COBR INTEGER;
BEGIN
if ((NEW.egre_id <> 0) and (new.egcc_anulado = 'N')) then
    BEGIN
    /* Abone el documento referenciado */
    select PREF_PRE, EGRE_NUMERO, EGRE_fecha, EGRE_CONC, TERC_NIT from EGRESOS
        where EGRE_id = new.egre_id into :PREFIJO, :NUMERO, :FEC, :CONCEPTO, :NIT;
    SELECT COBR_COD FROM cliente_sucursales WHERE TERC_NIT = :NIT AND CLCU_COD = NEW.egcc_sucursal INTO :COBR;
    /* valide que no se pase del saldo */
/*    execute procedure saldo_doc_cartera(new.egcc_tipodoc, new.egcc_iddoc, '9999/12/31') returning_values(saldo);*/
    execute procedure lee_configuracion('CARTERA', 'SALDOS', 'DESCONTAR RETENCIONES POR CAUSACION') returning_values (RETES);
    if (SALDO < 0) then
        BEGIN
        if (RETES = 'SI') then
            begin
            if (saldo > (NEW.egcc_abono + NEW.egcc_dtof)) then
                EXCEPTION DOCUMENTO_ABONO_MAYOR;
            end
        ELSE
            begin
            if (saldo > (NEW.egcc_abono + NEW.egcc_rtfte + NEW.egcc_rtiva + NEW.egcc_rtica + NEW.egcc_dtof)) then
                EXCEPTION DOCUMENTO_ABONO_MAYOR;
            end
        END
    else
        BEGIN
        if (RETES = 'SI') then
            begin
            if (saldo < (NEW.egcc_abono + NEW.egcc_dtof)) then
                EXCEPTION DOCUMENTO_ABONO_MAYOR;
            end
        ELSE
            begin
            if (saldo < (NEW.egcc_abono + NEW.egcc_rtfte + NEW.egcc_rtiva + NEW.egcc_rtica + NEW.egcc_dtof)) then
                EXCEPTION DOCUMENTO_ABONO_MAYOR;
            end
        END
    EXISTE = 'N';
    select 'S' from saldos_doc_cartera where sdca_tiporef = new.egcc_tipodoc and sdca_idref = new.egcc_iddoc and sdca_fecha = :FEC into :EXISTE;
    if (Existe = 'S') then
        begin
        /* actualice el saldo del dia */
        UPDATE saldos_doc_cartera
            SET SDCA_ABONO = SDCA_ABONO + NEW.egcc_abono + new.egcc_dtof,
                SDCA_ABRTFTE = SDCA_ABRTFTE + NEW.egcc_rtfte,
                SDCA_ABRTIVA = SDCA_ABRTIVA + NEW.egcc_rtiva,
                SDCA_ABRTICA = SDCA_ABRTICA + NEW.egcc_rtica
                WHERE SDCA_TIPOREF = NEW.egcc_tipodoc AND SDCA_IDREF = NEW.egcc_iddoc AND SDCA_FECHA = :FEC;
        END
    ELSE
        BEGIN
        /* Inserte un nuevo saldo diario */
        INSERT INTO SALDOS_DOC_CARTERA (SDCA_TIPOREF, SDCA_IDREF, SDCA_FECHA, TERC_NIT, SDCA_RTFTE, SDCA_RTIVA, SDCA_RTICA, SDCA_ABONO, SDCA_ABRTFTE, SDCA_ABRTIVA, SDCA_ABRTICA, SDCA_DEBITO, SDCA_MONTO)
            VALUES (NEW.egcc_tipodoc, NEW.egcc_iddoc, :FEC, :NIT, 0, 0, 0, (NEW.egcc_abono+NEW.egcc_dtof), NEW.egcc_rtfte, NEW.egcc_rtiva, NEW.egcc_rtica, 'N', 0);
        END
    /* actualice el registro en mov_cliente (por si son varios items) */
    EXISTE = 'N';
    SELECT 'S' FROM MOVIMIENTO_CLIENTES WHERE MVCL_TIPOREF = 62 AND MVCL_IDREF = NEW.egre_id AND MVCL_SUCURSAL = NEW.egcc_sucursal INTO :EXISTE;
    if (EXISTE = 'S') then
        begin
        UPDATE movimiento_clientes
            SET MVCL_MONTO = MVCL_MONTO + NEW.egcc_abono + NEW.egcc_dtof,
                MVCL_RTEFTE = MVCL_RTEFTE + NEW.egcc_rtfte,
                MVCL_RTEIVA = MVCL_RTEIVA + NEW.egcc_rtiva,
                MVCL_RTEICA = MVCL_RTEICA + NEW.egcc_rtica
            WHERE MVCL_TIPOREF = 62 AND MVCL_IDREF = NEW.egre_id;
        end
    ELSE
        INSERT INTO MOVIMIENTO_CLIENTES (MVCL_ID, TERC_NIT, MVCL_TIPOREF, MVCL_IDREF, MVCL_FECHA, MVCL_VENCE, MVCL_CONC, MVCL_MONTO, MVCL_RTEFTE, MVCL_RTEIVA, MVCL_RTEICA, MVCL_DEBITO, MVCL_ABONO, MVCL_PREFREF, MVCL_NUMREF, MVCL_SUCURSAL, COBR_COD)
            VALUES (GEN_ID(ID_MOVCLI, 1), :NIT, 62, NEW.egre_id, :FEC, :FEC, :CONCEPTO, (NEW.egcc_abono+NEW.egcc_dtof), NEW.egcc_rtfte, NEW.egcc_rtiva, NEW.egcc_rtica, 'N', 'S', :PREFIJO, :NUMERO, NEW.egcc_sucursal, :COBR);
    end
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER EGRESOS_CRUCEC_AU FOR EGRESOS_CRUCEC
ACTIVE AFTER UPDATE POSITION 0
AS
declare variable EXISTE CHAR(1);
declare variable FEC DATE;
declare variable NIT VARCHAR(20);
declare variable CONCEPTO VARCHAR(60);
declare variable PREFIJO VARCHAR(4);
declare variable NUMERO VARCHAR(6);
declare variable SALDO NUMERIC(18,2);
declare variable RETES char(2);
declare variable COBR INTEGER;
BEGIN
select PREF_PRE, EGRE_NUMERO, EGRE_fecha, EGRE_CONC, TERC_NIT
    from egresos where egre_id = new.egre_id
    into :PREFIJO, :NUMERO, :FEC, :CONCEPTO, :NIT;
/* Borre el viejo */
if ((old.egre_id <> 0) AND (OLD.egcc_anulado = 'N')) then
    BEGIN
    UPDATE saldos_doc_cartera
        SET SDCA_ABONO = SDCA_ABONO - old.egcc_abono - OLD.egcc_dtof,
        SDCA_ABRTFTE = SDCA_ABRTFTE - old.egcc_rtfte,
        SDCA_ABRTIVA = SDCA_ABRTIVA - old.egcc_rtiva,
        SDCA_ABRTICA = SDCA_ABRTICA - old.egcc_rtica
        WHERE SDCA_TIPOREF = old.egcc_tipodoc AND SDCA_IDREF = old.egcc_iddoc AND SDCA_FECHA = :FEC;
    UPDATE movimiento_clientes
        SET MVCL_MONTO = MVCL_MONTO - OLD.egcc_abono - OLD.egcc_dtof,
        MVCL_RTEFTE = MVCL_RTEFTE - OLD.egcc_rtfte,
        MVCL_RTEIVA = MVCL_RTEIVA - OLD.egcc_rtiva,
        MVCL_RTEICA = MVCL_RTEICA - OLD.egcc_rtica
        WHERE MVCL_TIPOREF = 62 AND MVCL_IDREF = OLD.egre_id AND MVCL_SUCURSAL = old.egcc_sucursal;
    END
if ((NEW.egre_id <> 0) and (NEW.egcc_anulado = 'N')) then
    BEGIN
    SELECT COBR_COD FROM cliente_sucursales WHERE TERC_NIT = :NIT AND CLCU_COD = NEW.egcc_sucursal INTO :COBR;
    /* valide que no se pase del saldo */
/*    execute procedure saldo_doc_cartera(new.egcc_tipodoc, new.egcc_iddoc, '9999/12/31') returning_values(saldo);*/
    execute procedure lee_configuracion('CARTERA', 'SALDOS', 'DESCONTAR RETENCIONES POR CAUSACION') returning_values (RETES);
    if (SALDO < 0) then
        BEGIN
        if (RETES = 'SI') then
            begin
            if (saldo > (NEW.egcc_abono + NEW.egcc_dtof)) then
                EXCEPTION DOCUMENTO_ABONO_MAYOR;
            end
        ELSE
            begin
            if (saldo > (NEW.egcc_abono + NEW.egcc_rtfte + NEW.egcc_rtiva + NEW.egcc_rtica + NEW.egcc_dtof)) then
                EXCEPTION DOCUMENTO_ABONO_MAYOR;
            end
        END
    else
        BEGIN
        if (RETES = 'SI') then
            begin
            if (saldo < (NEW.egcc_abono + NEW.egcc_dtof)) then
                EXCEPTION DOCUMENTO_ABONO_MAYOR;
            end
        ELSE
            begin
            if (saldo < (NEW.egcc_abono + NEW.egcc_rtfte + NEW.egcc_rtiva + NEW.egcc_rtica + NEW.egcc_dtof)) then
                EXCEPTION DOCUMENTO_ABONO_MAYOR;
            end
        END
    select 'S' from saldos_doc_cartera where sdca_tiporef = new.egcc_tipodoc and sdca_idref = new.egcc_iddoc and sdca_fecha = :FEC into :EXISTE;
    if (Existe = 'S') then
        /* actualice el saldo del dia */
        UPDATE saldos_doc_cartera
            SET SDCA_ABONO = SDCA_ABONO + NEW.egcc_abono + NEW.egcc_dtof,
            SDCA_ABRTFTE = SDCA_ABRTFTE + NEW.egcc_rtfte,
            SDCA_ABRTIVA = SDCA_ABRTIVA + NEW.egcc_rtiva,
            SDCA_ABRTICA = SDCA_ABRTICA + NEW.egcc_rtica
            WHERE SDCA_TIPOREF = NEW.egcc_tipodoc AND SDCA_IDREF = NEW.egcc_iddoc AND SDCA_FECHA = :FEC;
    ELSE
        /* Inserte un nuevo saldo diario */
        INSERT INTO SALDOS_DOC_CARTERA (SDCA_TIPOREF, SDCA_IDREF, SDCA_FECHA, TERC_NIT, SDCA_RTFTE, SDCA_RTIVA, SDCA_RTICA, SDCA_ABONO, SDCA_ABRTFTE, SDCA_ABRTIVA, SDCA_ABRTICA, SDCA_DEBITO, SDCA_MONTO)
            VALUES (NEW.egcc_tipodoc, NEW.egcc_iddoc, :FEC, :NIT, 0, 0, 0, (NEW.egcc_abono+NEW.egcc_dtof), NEW.egcc_rtfte, NEW.egcc_rtiva, NEW.egcc_rtica, 'N', 0);
    /* Registre o actualice el registro en movimiento_cliente */
    EXISTE = 'N';
    SELECT 'S' FROM MOVIMIENTO_CLIENTES WHERE MVCL_TIPOREF = 62 AND MVCL_IDREF = NEW.egre_id and mvcl_sucursal = new.egcc_sucursal INTO :EXISTE;
    if (EXISTE = 'S') then
        begin
        /* Deshaga el viejo */
        if (old.egre_id <> 0) then
            UPDATE movimiento_clientes
                SET MVCL_MONTO = MVCL_MONTO - OLD.egcc_abono - OLD.egcc_dtof,
                    MVCL_RTEFTE = MVCL_RTEFTE - OLD.egcc_rtfte,
                    MVCL_RTEIVA = MVCL_RTEIVA - OLD.egcc_rtiva,
                    MVCL_RTEICA = MVCL_RTEICA - OLD.egcc_rtica
                WHERE MVCL_TIPOREF = 62 AND MVCL_IDREF = NEW.egre_id AND MVCL_SUCURSAL = NEW.egcc_sucursal;
        /* Actualice el nuevo */
        UPDATE movimiento_clientes
            SET MVCL_MONTO = MVCL_MONTO + NEW.egcc_abono + NEW.egcc_dtof,
                MVCL_RTEFTE = MVCL_RTEFTE + NEW.egcc_rtfte,
                MVCL_RTEIVA = MVCL_RTEIVA + NEW.egcc_rtiva,
                MVCL_RTEICA = MVCL_RTEICA + NEW.egcc_rtica
            WHERE MVCL_TIPOREF = 62 AND MVCL_IDREF = NEW.egre_id AND MVCL_SUCURSAL = NEW.egcc_sucursal;
        end
    ELSE
        INSERT INTO MOVIMIENTO_CLIENTES (MVCL_ID, TERC_NIT, MVCL_TIPOREF, MVCL_IDREF, MVCL_FECHA, MVCL_VENCE, MVCL_CONC, MVCL_MONTO, MVCL_RTEFTE, MVCL_RTEIVA, MVCL_RTEICA, MVCL_DEBITO, MVCL_ABONO, MVCL_PREFREF, MVCL_NUMREF, MVCL_SUCURSAL, COBR_COD)
            VALUES (GEN_ID(ID_MOVCLI, 1), :NIT, 62, NEW.egre_id, :FEC, :FEC, :CONCEPTO, (NEW.egcc_abono+NEW.egcc_dtof), NEW.egcc_rtfte, NEW.egcc_rtiva, NEW.egcc_rtica, 'N', 'S', :PREFIJO, :NUMERO, NEW.egcc_sucursal, :COBR);
    END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER RECIBOS_CAJA_DETALLE_AI FOR RECIBOS_CAJA_DETALLE
ACTIVE AFTER INSERT POSITION 0
AS
declare variable EXISTE CHAR(1);
declare variable FEC DATE;
declare variable NIT VARCHAR(20);
declare variable CONCEPTO VARCHAR(60);
declare variable PREFIJO VARCHAR(4);
declare variable NUMERO VARCHAR(6);
declare variable SALDO NUMERIC(18,2);
declare variable RETES CHAR(2);
declare variable OK CHAR(1);
declare variable RCANTI INTEGER;
declare variable COBR INTEGER;
declare variable ACUMULA CHAR(2);
declare variable DIASMAX INTEGER;
declare variable FACTOR NUMERIC(9,4);
declare variable FACTORD NUMERIC(9,4);
declare variable DIAS INTEGER;
declare variable FECDOC DATE;
BEGIN
if ((NEW.RECA_ID <> 0) and (new.rcde_anulado = 'N')) then
    BEGIN
    /* Abone el documento referenciado */
    select PREF_PRE, RECA_NUMERO, RECA_fecha, RECA_CONC, TERC_NIT, COBR_COD from RECIBOS_CAJA
        where RECA_id = new.RECA_id into :PREFIJO, :NUMERO, :FEC, :CONCEPTO, :NIT, :COBR;
    OK = 'N';
    if (new.RCDE_TIPODOC = 45) then
        BEGIN
        /* BUSQUE SI TIENE RECA_ID, SI NO LO ACTUALIZA */
        SELECT RECA_ID FROM ANTICIPOS_CLIENTE WHERE ANCL_ID = NEW.RCDE_IDDOC INTO :RCANTI;
        if (RCANTI = 0) then
            BEGIN
            OK = 'S';
            UPDATE ANTICIPOS_CLIENTE SET RECA_ID = NEW.RECA_ID WHERE ANCL_ID = NEW.RCDE_IDDOC;
            END
        END
    if (OK = 'N') then
        BEGIN
        /* valide que no se pase del saldo */
/*        execute procedure saldo_doc_cartera(new.rcde_tipodoc, new.rcde_iddoc, '9999/12/31') returning_values(saldo);*/
        execute procedure lee_configuracion('CARTERA', 'SALDOS', 'DESCONTAR RETENCIONES POR CAUSACION') returning_values (RETES);
        if (SALDO < 0) then
            BEGIN
            if (RETES = 'SI') then
                begin
                if (saldo > (NEW.rcde_abono + NEW.rcde_dtof)) then
                    EXCEPTION DOCUMENTO_ABONO_MAYOR 'EL SALDO DEL DOCUMENTO ' || NEW.rcde_prefijo || NEW.rcde_numero || ' ES INSUFICIENTE.';
                end
            ELSE
                begin
                if (saldo > (NEW.rcde_abono + NEW.rcde_rtfte + NEW.rcde_rtiva + NEW.rcde_rtica + NEW.rcde_dtof)) then
                    EXCEPTION DOCUMENTO_ABONO_MAYOR 'EL SALDO DEL DOCUMENTO ' || NEW.rcde_prefijo || NEW.rcde_numero || ' ES INSUFICIENTE.';
                end
            END
        else
            BEGIN
            if (RETES = 'SI') then
                begin
                if (saldo < (NEW.rcde_abono + NEW.rcde_dtof)) then
                    EXCEPTION DOCUMENTO_ABONO_MAYOR 'EL SALDO DEL DOCUMENTO ' || NEW.rcde_prefijo || NEW.rcde_numero || ' ES INSUFICIENTE.';
                end
            ELSE
                begin
                if (saldo < (NEW.rcde_abono + NEW.rcde_rtfte + NEW.rcde_rtiva + NEW.rcde_rtica + NEW.rcde_dtof)) then
                    EXCEPTION DOCUMENTO_ABONO_MAYOR 'EL SALDO DEL DOCUMENTO ' || NEW.rcde_prefijo || NEW.rcde_numero || ' ES INSUFICIENTE.';
                end
            END
        EXISTE = 'N';
        select 'S' from saldos_doc_cartera where sdca_tiporef = new.rcde_tipodoc and sdca_idref = new.rcde_iddoc and sdca_fecha = :FEC into :EXISTE;
        if (Existe = 'S') then
            begin
            /* actualice el saldo del dia */
            UPDATE saldos_doc_cartera
                SET SDCA_ABONO = SDCA_ABONO + NEW.rcde_abono + new.rcde_dtof,
                SDCA_ABRTFTE = SDCA_ABRTFTE + NEW.rcde_RTFTE,
                SDCA_ABRTIVA = SDCA_ABRTIVA + NEW.rcde_RTIVA,
                SDCA_ABRTICA = SDCA_ABRTICA + NEW.rcde_RTICA
                WHERE SDCA_TIPOREF = NEW.RCDE_TIPODOC AND SDCA_IDREF = NEW.rcde_IDDOC AND SDCA_FECHA = :FEC;
            END
        ELSE
            BEGIN
            /* Inserte un nuevo saldo diario */
            INSERT INTO SALDOS_DOC_CARTERA (SDCA_TIPOREF, SDCA_IDREF, SDCA_FECHA, TERC_NIT, SDCA_RTFTE, SDCA_RTIVA, SDCA_RTICA, SDCA_ABONO, SDCA_ABRTFTE, SDCA_ABRTIVA, SDCA_ABRTICA, SDCA_DEBITO, SDCA_MONTO)
                VALUES (NEW.RCDE_TIPODOC, NEW.RCDE_IDDOC, :FEC, :NIT, 0, 0, 0, (NEW.rcde_abono+NEW.rcde_dtof), NEW.rcde_rtfte, NEW.rcde_rtiva, NEW.rcde_rtica, 'N', 0);
            END
        END
    /* actualice el registro en mov_cliente (por si son varios items) */
    EXISTE = 'N';
    SELECT 'S' FROM MOVIMIENTO_CLIENTES WHERE MVCL_TIPOREF = 61 AND MVCL_IDREF = NEW.RECA_ID AND MVCL_SUCURSAL = NEW.rcde_sucursal INTO :EXISTE;
    if (EXISTE = 'S') then
        begin
        UPDATE movimiento_clientes
            SET MVCL_MONTO = MVCL_MONTO + NEW.rcde_abono + NEW.rcde_dtof,
                MVCL_RTEFTE = MVCL_RTEFTE + NEW.rcde_rtfte,
                MVCL_RTEIVA = MVCL_RTEIVA + NEW.rcde_rtiva,
                MVCL_RTEICA = MVCL_RTEICA + NEW.rcde_rtica
            WHERE MVCL_TIPOREF = 61 AND MVCL_IDREF = NEW.RECA_ID AND MVCL_SUCURSAL = NEW.rcde_sucursal;
        end
    ELSE
        INSERT INTO MOVIMIENTO_CLIENTES (MVCL_ID, TERC_NIT, MVCL_TIPOREF, MVCL_IDREF, MVCL_FECHA, MVCL_VENCE, MVCL_CONC, MVCL_MONTO, MVCL_RTEFTE, MVCL_RTEIVA, MVCL_RTEICA, MVCL_DEBITO, MVCL_ABONO, MVCL_PREFREF, MVCL_NUMREF, MVCL_SUCURSAL, COBR_COD)
            VALUES (GEN_ID(ID_MOVCLI, 1), :NIT, 61, NEW.RECA_ID, :FEC, :FEC, :CONCEPTO, (NEW.RCDE_ABONO+NEW.RCDE_DTOF), NEW.RCDE_RTFTE, NEW.RCDE_RTIVA, NEW.RCDE_RTICA, 'N', 'S', :PREFIJO, :NUMERO, NEW.rcde_sucursal, :COBR);

    /* acumule los puntos del vendedor */
    SELECT MVCL_FECHA FROM MOVIMIENTO_CLIENTES WHERE MVCL_TIPOREF = new.rcde_tipodoc AND MVCL_IDREF = new.rcde_iddoc
        INTO :FECDOC;
    if (FECDOC IS NOT NULL) then
        DIAS = FEC - FECDOC;
    else
        DIAS = 999;
    execute procedure lee_configuracion('FACTURACION', 'FACTURAS', 'ACUMULAR PUNTOS DE VENTAS POR VENDEDOR') returning_values (ACUMULA);
    execute procedure lee_configuracion('FACTURACION', 'FACTURAS', 'DIAS DE RECAUDO MAXIMO PARA ACUMULAR PUNTOS AL VENDEDOR') returning_values (DIASMAX);
    if ((acumula = 'SI') and (diasmax >= dias)) then
        begin
        SELECT COPU_FACTOR FROM comisiones_puntos WHERE COPU_COD = NEW.rcde_comip INTO :FACTOR;
        if ((NEW.rcde_tipodoc = 31) or (NEW.rcde_tipodoc = 41)) then
            begin
            /* recorra la factura acumulando los puntos */
            if (new.rcde_tipodoc = 31) then
                select (fact_total-fact_ivamonto)/fact_total from facturas where fact_id = new.rcde_iddoc into :factord;
            if (new.rcde_tipodoc = 41) then
                select ndcl_monto/(ndcl_monto+ndcl_ivamonto) from notas_debito_clientes where ndcl_id = new.rcde_iddoc into :factord;
            /* inserte el registro de puntos */
            insert into puntos_vendedor (vend_cod, ptvt_fecha, ptvt_tipodoc, ptvt_iddoc, ptvt_db, ptvt_cr)
                values (:cobr, :fec, new.rcde_tipodoc, new.rcde_iddoc, (new.rcde_abono*:factord*:factor), 0);
            end
        if ((new.rcde_tipodoc = 33) or (new.rcde_tipodoc = 42)) then
            begin
            if (new.rcde_tipodoc = 33) then
                select (devt_total-devt_ivamonto)/devt_total from devoluciones_ventas where devt_id = new.rcde_iddoc into :factord;
            if (new.rcde_tipodoc = 42) then
                select nccl_monto/(nccl_monto+nccl_ivamonto) from notas_credito_clientes where nccl_id = new.rcde_iddoc into :factord;
            /* inserte el registro de puntos */
            insert into puntos_vendedor (vend_cod, ptvt_fecha, ptvt_tipodoc, ptvt_iddoc, ptvt_db, ptvt_cr)
                values (:cobr, :fec, new.rcde_tipodoc, new.rcde_iddoc, 0, (new.rcde_abono*:factord*:factor));
            end
        end
    end
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER RECIBOS_CAJA_DETALLE_AU FOR RECIBOS_CAJA_DETALLE
ACTIVE AFTER UPDATE POSITION 0
AS
declare variable EXISTE CHAR(1);
declare variable FEC DATE;
declare variable NIT VARCHAR(20);
declare variable CONCEPTO VARCHAR(60);
declare variable PREFIJO VARCHAR(4);
declare variable NUMERO VARCHAR(6);
declare variable SALDO NUMERIC(18,2);
declare variable RETES char(2);
declare variable OK CHAR(1);
declare variable RCANTI INTEGER;
declare variable COBR INTEGER;
declare variable ACUMULA CHAR(2);
declare variable DIASMAX INTEGER;
declare variable FACTOR NUMERIC(9,4);
declare variable FACTORD NUMERIC(9,4);
declare variable DIAS INTEGER;
declare variable FECDOC DATE;
BEGIN
execute procedure lee_configuracion('FACTURACION', 'FACTURAS', 'ACUMULAR PUNTOS DE VENTAS POR VENDEDOR') returning_values (ACUMULA);
select PREF_PRE, RECA_NUMERO, reca_fecha, RECA_CONC, TERC_NIT, COBR_COD
    from recibos_caja
    where reca_id = new.reca_id
    into :PREFIJO, :NUMERO, :FEC, :CONCEPTO, :NIT, :COBR;
/* Borre el viejo */
if ((old.RECA_ID <> 0) AND (OLD.rcde_anulado = 'N')) then
    BEGIN
    OK = 'N';
    if (OLD.RCDE_TIPODOC = 45) then
        BEGIN
        SELECT RECA_ID FROM ANTICIPOS_CLIENTE WHERE ANCL_ID = OLD.RCDE_IDDOC INTO :RCANTI;
        if (RCANTI = OLD.RECA_ID) then
            begin
            OK = 'S';
            if (NEW.rcde_anulado = 'N') then
                delete from anticipos_cliente where ANCL_ID = OLD.RCDE_IDDOC;
            else
                UPDATE anticipos_cliente SET ANCL_ANULADO = 'S' where ANCL_ID = OLD.RCDE_IDDOC;
            end
        END
    if (OK = 'N') then
        BEGIN
        UPDATE saldos_doc_cartera
            SET SDCA_ABONO = SDCA_ABONO - old.rcde_abono - OLD.RCDE_DTOF,
            SDCA_ABRTFTE = SDCA_ABRTFTE - old.rcde_RTFTE,
            SDCA_ABRTIVA = SDCA_ABRTIVA - old.rcde_RTIVA,
            SDCA_ABRTICA = SDCA_ABRTICA - old.rcde_RTICA
            WHERE SDCA_TIPOREF = old.RCDE_TIPODOC AND SDCA_IDREF = old.rcde_IDDOC AND SDCA_FECHA = :FEC;
        END
    UPDATE movimiento_clientes
        SET MVCL_MONTO = MVCL_MONTO - OLD.rcde_abono - OLD.RCDE_DTOF,
        MVCL_RTEFTE = MVCL_RTEFTE - OLD.rcde_rtfte,
        MVCL_RTEIVA = MVCL_RTEIVA - OLD.rcde_rtiva,
        MVCL_RTEICA = MVCL_RTEICA - OLD.rcde_rtica
        WHERE MVCL_TIPOREF = 61 AND MVCL_IDREF = OLD.RECA_ID;

    /* DESHAGA LOS PUNTOS DEL VENDEDOR */
    if (acumula = 'SI') then
        delete from puntos_vendedor where vend_cod = :cobr and ptvt_tipodoc = old.rcde_tipodoc and ptvt_iddoc = old.rcde_iddoc and ptvt_fecha = :fec;
    END
if ((NEW.RECA_ID <> 0) and (NEW.rcde_anulado = 'N')) then
    BEGIN
    OK = 'N';
    if (new.RCDE_TIPODOC = 45) then
        BEGIN
        /* BUSQUE SI TIENE RECA_ID, SI NO LO ACTUALIZA */
        SELECT RECA_ID FROM ANTICIPOS_CLIENTE WHERE ANCL_ID = NEW.RCDE_IDDOC INTO :RCANTI;
        if (RCANTI = 0) then
            BEGIN
            OK = 'S';
            UPDATE ANTICIPOS_CLIENTE SET RECA_ID = NEW.RECA_ID WHERE ANCL_ID = NEW.RCDE_IDDOC;
            END
        END
    if (OK = 'N') then
        BEGIN
        /* valide que no se pase del saldo */
/*        execute procedure saldo_doc_cartera(new.rcde_tipodoc, new.rcde_iddoc, '9999/12/31') returning_values(saldo);*/
        execute procedure lee_configuracion('CARTERA', 'SALDOS', 'DESCONTAR RETENCIONES POR CAUSACION') returning_values (RETES);
        if (SALDO < 0) then
            BEGIN
            if (RETES = 'SI') then
                begin
                if (saldo > (NEW.rcde_abono + NEW.rcde_dtof)) then
                    EXCEPTION DOCUMENTO_ABONO_MAYOR;
                end
            ELSE
                begin
                if (saldo > (NEW.rcde_abono + NEW.rcde_rtfte + NEW.rcde_rtiva + NEW.rcde_rtica + NEW.rcde_dtof)) then
                    EXCEPTION DOCUMENTO_ABONO_MAYOR;
                end
            END
        else
            BEGIN
            if (RETES = 'SI') then
                begin
                if (saldo < (NEW.rcde_abono + NEW.rcde_dtof)) then
                    EXCEPTION DOCUMENTO_ABONO_MAYOR;
                end
            ELSE
                begin
                if (saldo < (NEW.rcde_abono + NEW.rcde_rtfte + NEW.rcde_rtiva + NEW.rcde_rtica + NEW.rcde_dtof)) then
                    EXCEPTION DOCUMENTO_ABONO_MAYOR;
                end
            END
        select 'S' from saldos_doc_cartera where sdca_tiporef = new.rcde_tipodoc and sdca_idref = new.rcde_iddoc and sdca_fecha = :FEC into :EXISTE;
        if (Existe = 'S') then
            /* actualice el saldo del dia */
            UPDATE saldos_doc_cartera
                SET SDCA_ABONO = SDCA_ABONO + NEW.rcde_abono + NEW.RCDE_DTOF,
                    SDCA_ABRTFTE = SDCA_ABRTFTE + NEW.rcde_RTFTE,
                    SDCA_ABRTIVA = SDCA_ABRTIVA + NEW.rcde_RTIVA,
                    SDCA_ABRTICA = SDCA_ABRTICA + NEW.rcde_RTICA
                WHERE SDCA_TIPOREF = NEW.RCDE_TIPODOC AND SDCA_IDREF = NEW.rcde_IDDOC AND SDCA_FECHA = :FEC;
        ELSE
            /* Inserte un nuevo saldo diario */
            INSERT INTO SALDOS_DOC_CARTERA (SDCA_TIPOREF, SDCA_IDREF, SDCA_FECHA, TERC_NIT, SDCA_RTFTE, SDCA_RTIVA, SDCA_RTICA, SDCA_ABONO, SDCA_ABRTFTE, SDCA_ABRTIVA, SDCA_ABRTICA, SDCA_DEBITO, SDCA_MONTO)
                VALUES (NEW.RCDE_TIPODOC, NEW.RCDE_IDDOC, :FEC, :NIT, 0, 0, 0, (NEW.rcde_abono+NEW.RCDE_DTOF), NEW.rcde_rtfte, NEW.rcde_rtiva, NEW.rcde_rtica, 'N', 0);
        END /* OK = N */
    /* Registre o actualice el registro en movimiento_cliente */
    EXISTE = 'N';
    SELECT 'S' FROM MOVIMIENTO_CLIENTES WHERE MVCL_TIPOREF = 61 AND MVCL_IDREF = NEW.RECA_ID and mvcl_sucursal = new.rcde_sucursal INTO :EXISTE;
    if (EXISTE = 'S') then
        begin
        /* Deshaga el viejo */
        if (old.RECA_ID <> 0) then
            UPDATE movimiento_clientes
                SET MVCL_MONTO = MVCL_MONTO - OLD.rcde_abono - OLD.rcde_dtof,
                    MVCL_RTEFTE = MVCL_RTEFTE - OLD.rcde_rtfte,
                    MVCL_RTEIVA = MVCL_RTEIVA - OLD.rcde_rtiva,
                    MVCL_RTEICA = MVCL_RTEICA - OLD.rcde_rtica
                WHERE MVCL_TIPOREF = 61 AND MVCL_IDREF = NEW.RECA_ID AND MVCL_SUCURSAL = NEW.rcde_sucursal;
        /* Actualice el nuevo */
        UPDATE movimiento_clientes
            SET MVCL_MONTO = MVCL_MONTO + NEW.rcde_abono + NEW.rcde_dtof,
                MVCL_RTEFTE = MVCL_RTEFTE + NEW.rcde_rtfte,
                MVCL_RTEIVA = MVCL_RTEIVA + NEW.rcde_rtiva,
                MVCL_RTEICA = MVCL_RTEICA + NEW.rcde_rtica
            WHERE MVCL_TIPOREF = 61 AND MVCL_IDREF = NEW.RECA_ID AND MVCL_SUCURSAL = NEW.rcde_sucursal;
        end
    ELSE
        INSERT INTO MOVIMIENTO_CLIENTES (MVCL_ID, TERC_NIT, MVCL_TIPOREF, MVCL_IDREF, MVCL_FECHA, MVCL_VENCE, MVCL_CONC, MVCL_MONTO, MVCL_RTEFTE, MVCL_RTEIVA, MVCL_RTEICA, MVCL_DEBITO, MVCL_ABONO, MVCL_PREFREF, MVCL_NUMREF, MVCL_SUCURSAL, COBR_COD)
            VALUES (GEN_ID(ID_MOVCLI, 1), :NIT, 61, NEW.RECA_ID, :FEC, :FEC, :CONCEPTO, (NEW.RCDE_ABONO+NEW.RCDE_DTOF), NEW.RCDE_RTFTE, NEW.RCDE_RTIVA, NEW.RCDE_RTICA, 'N', 'S', :PREFIJO, :NUMERO, NEW.rcde_sucursal, :COBR);

    /* acumule los puntos del vendedor */
    SELECT MVCL_FECHA FROM MOVIMIENTO_CLIENTES WHERE MVCL_TIPOREF = new.rcde_tipodoc AND MVCL_IDREF = new.rcde_iddoc
        INTO :FECDOC;
    if (FECDOC IS NOT NULL) then
        DIAS = FEC - FECDOC;
    else
        DIAS = 999;
    execute procedure lee_configuracion('FACTURACION', 'FACTURAS', 'DIAS DE RECAUDO MAXIMO PARA ACUMULAR PUNTOS AL VENDEDOR') returning_values (DIASMAX);
    if ((acumula = 'SI') and (diasmax >= dias)) then
        begin
        SELECT COPU_FACTOR FROM comisiones_puntos WHERE COPU_COD = NEW.rcde_comip INTO :FACTOR;
        if ((NEW.rcde_tipodoc = 31) or (NEW.rcde_tipodoc = 41)) then
            begin
            /* recorra la factura acumulando los puntos */
            if (new.rcde_tipodoc = 31) then
                select (fact_total-fact_ivamonto)/fact_total from facturas where fact_id = new.rcde_iddoc into :factord;
            if (new.rcde_tipodoc = 41) then
                select ndcl_monto/(ndcl_monto+ndcl_ivamonto) from notas_debito_clientes where ndcl_id = new.rcde_iddoc into :factord;
            /* inserte el registro de puntos */
            insert into puntos_vendedor (vend_cod, ptvt_fecha, ptvt_tipodoc, ptvt_iddoc, ptvt_db, ptvt_cr)
                values (:cobr, :fec, new.rcde_tipodoc, new.rcde_iddoc, (new.rcde_abono*:factord*:factor), 0);
            end
        if ((new.rcde_tipodoc = 33) or (new.rcde_tipodoc = 42)) then
            begin
            if (new.rcde_tipodoc = 33) then
                select (devt_total-devt_ivamonto)/devt_total from devoluciones_ventas where devt_id = new.rcde_iddoc into :factord;
            if (new.rcde_tipodoc = 42) then
                select nccl_monto/(nccl_monto+nccl_ivamonto) from notas_credito_clientes where nccl_id = new.rcde_iddoc into :factord;
            /* inserte el registro de puntos */
            insert into puntos_vendedor (vend_cod, ptvt_fecha, ptvt_tipodoc, ptvt_iddoc, ptvt_db, ptvt_cr)
                values (:cobr, :fec, new.rcde_tipodoc, new.rcde_iddoc, 0, (new.rcde_abono*:factord*:factor));
            end
        end
    END /* NUEVO */
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER PROCEDURE SALDO_DOC_CARTERA(
    TIPO INTEGER,
    ID INTEGER,
    FECHA DATE,
    MONEDA INTEGER)
RETURNS (
    SALDO NUMERIC(18,2))
AS
declare variable DESC_RTES CHAR(2);
declare variable AUTORET VARCHAR(10);
declare variable FAUTORET DATE;
declare variable FECDOC DATE;
BEGIN
EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'DESCONTAR RETENCIONES POR CAUSACION') returning_values (DESC_RTES);
EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'FECHA AUTORETENEDOR NO DESCONTAR RETENCIONES DEL SALDO PERO SI CONTABILIZARLAS') returning_values (AUTORET);
if (AUTORET <> '') then
    FAUTORET = CAST(AUTORET AS DATE);
else
    FAUTORET = '9999/12/31';
/* BUSQUE LA FECHA DEL DOCUMENTO */
SELECT MIN(SDCA_FECHA) FROM SALDOS_DOC_CARTERA WHERE (SDCA_TIPOREF = :TIPO) AND (SDCA_IDREF = :ID) AND (SDCA_MONTO <> 0) INTO :FECDOC;
if (MONEDA <> 0) then
    BEGIN
    if (FAUTORET <= FECDOC) then
        if (DESC_RTES = 'SI') then
            SELECT sum((SDCA_MONTO-SDCA_ABONO-SDCA_RTIVA-SDCA_RTICA)/SDCA_TRM) FROM saldos_doc_cartera
                WHERE (SDCA_TIPOREF = :TIPO) AND (SDCA_IDREF = :ID) AND (SDCA_FECHA <= :FECHA) AND SDCA_TRM <> 1 INTO :SALDO;
        ELSE
            SELECT sum((SDCA_MONTO-SDCA_ABONO-SDCA_ABRTIVA-SDCA_ABRTICA)/SDCA_TRM) FROM saldos_doc_cartera
                WHERE (SDCA_TIPOREF = :TIPO) AND (SDCA_IDREF = :ID) AND (SDCA_FECHA <= :FECHA) AND SDCA_TRM <> 1 INTO :SALDO;
    ELSE
        if (DESC_RTES = 'SI') then
            SELECT sum((SDCA_MONTO-SDCA_ABONO-SDCA_RTFTE-SDCA_RTIVA-SDCA_RTICA)/SDCA_TRM) FROM saldos_doc_cartera
                WHERE (SDCA_TIPOREF = :TIPO) AND (SDCA_IDREF = :ID) AND (SDCA_FECHA <= :FECHA) AND SDCA_TRM <> 1 INTO :SALDO;
        ELSE
            SELECT sum((SDCA_MONTO-SDCA_ABONO-SDCA_ABRTFTE-SDCA_ABRTIVA-SDCA_ABRTICA)/SDCA_TRM) FROM saldos_doc_cartera
                WHERE (SDCA_TIPOREF = :TIPO) AND (SDCA_IDREF = :ID) AND (SDCA_FECHA <= :FECHA) AND SDCA_TRM <> 1 INTO :SALDO;
    END
ELSE
    BEGIN
    if (FAUTORET <= FECDOC) then
        if (DESC_RTES = 'SI') then
            SELECT sum(SDCA_MONTO-SDCA_ABONO-SDCA_RTIVA-SDCA_RTICA) FROM saldos_doc_cartera
                WHERE (SDCA_TIPOREF = :TIPO) AND (SDCA_IDREF = :ID) AND (SDCA_FECHA <= :FECHA) INTO :SALDO;
        ELSE
            SELECT sum(SDCA_MONTO-SDCA_ABONO-SDCA_ABRTIVA-SDCA_ABRTICA) FROM saldos_doc_cartera
                WHERE (SDCA_TIPOREF = :TIPO) AND (SDCA_IDREF = :ID) AND (SDCA_FECHA <= :FECHA) INTO :SALDO;
    ELSE
        if (DESC_RTES = 'SI') then
            SELECT sum(SDCA_MONTO-SDCA_ABONO-SDCA_RTFTE-SDCA_RTIVA-SDCA_RTICA) FROM saldos_doc_cartera
                WHERE (SDCA_TIPOREF = :TIPO) AND (SDCA_IDREF = :ID) AND (SDCA_FECHA <= :FECHA) INTO :SALDO;
        ELSE
            SELECT sum(SDCA_MONTO-SDCA_ABONO-SDCA_ABRTFTE-SDCA_ABRTIVA-SDCA_ABRTICA) FROM saldos_doc_cartera
                WHERE (SDCA_TIPOREF = :TIPO) AND (SDCA_IDREF = :ID) AND (SDCA_FECHA <= :FECHA) INTO :SALDO;
    END
if (SALDO IS NULL) then
    SALDO = 0;
SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER PROCEDURE BUSCAR_DEVOLCHEQ(
    CUENTA INTEGER)
RETURNS (
    ID INTEGER,
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    NOMTERC VARCHAR(60),
    MONTO NUMERIC(18,2),
    CODCTA VARCHAR(30),
    CHNUMERO VARCHAR(20),
    CHCUENTA VARCHAR(20),
    CHBANCO VARCHAR(2),
    ANULAR CHAR(1),
    SALDO NUMERIC(18,2))
AS
begin
for select dvch_id, prba_pref, dvch_numdoc, dvch_fecha, dvch_nomterc, dvch_monto, cuba_codcta,
    dvch_nroch, dvch_cuenta, dvch_banco, dvch_anulado
    from devolucion_cheques ch, cuentas_banco c where ch.cuba_cod = c.cuba_cod and ch.cuba_cod = :CUENTA
    INTO :ID, :prefijo, :numero, :fecha, :nomterc, :monto, :codcta, :chnumero, :chcuenta, :chbanco, :anular
    do
    begin
    execute procedure saldo_doc_cartera(77, :id,  '2099-12-31', 0) returning_values (:SALDO);
    suspend;
    end
SUSPEND;
end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER PROCEDURE BUSCA_ID_DOC_CARTERA(
    TIPO INTEGER,
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(6),
    NIT VARCHAR(20),
    FECHA DATE,
    MONEDA INTEGER)
RETURNS (
    ID INTEGER,
    SALDO NUMERIC(18,2),
    RTFTE NUMERIC(18,2),
    RTIVA NUMERIC(18,2),
    RTICA NUMERIC(18,2),
    DTOF NUMERIC(18,2),
    ERROR INTEGER)
AS
declare variable vernit varchar(20);
declare variable fec date;
declare variable fecdto date;
declare variable desc_rtes char(2);
declare variable dtoapl numeric(18,2);
declare variable AUTORET VARCHAR(10);
declare variable FAUTORET DATE;
declare variable FECDOC DATE;
BEGIN
ID = 0;
ERROR = 0;
EXECUTE PROCEDURE COMPLETA_CEROS(NUMERO) returning_values (NUMERO);
if (TIPO = 41) then
    SELECT NDCL_ID, TERC_NIT, NDCL_FECHA, NDCL_DTOFMONTO, NDCL_FECHADTO FROM NOTAS_DEBITO_CLIENTES WHERE PREF_PRE = :PREFIJO AND NDCL_NUMERO = :NUMERO INTO :ID, :VERNIT, :FEC, :DTOF, :FECDTO;
if (TIPO = 42) then
    SELECT NCCL_ID, TERC_NIT, NCCL_FECHA, 0, NCCL_FECHA FROM NOTAS_CREDITO_CLIENTES WHERE PREF_PRE = :PREFIJO AND NCCL_NUMERO = :NUMERO INTO :ID, :VERNIT, :FEC, :DTOF, :FECDTO;
if (TIPO = 45) then
    SELECT ANCL_ID, TERC_NIT, ANCL_FECHA, ANCL_DTOFMONTO, ANCL_DTOFECHA FROM ANTICIPOS_CLIENTE WHERE PREF_PRE = :PREFIJO AND ANCL_NUMERO = :NUMERO INTO :ID, :VERNIT, :FEC, :DTOF, :FECDTO;
if (TIPO = 31) then
    SELECT FACT_ID, TERC_NIT, FACT_FECHA, FACT_DTOFMONTO, FACT_DTOFFECHA FROM FACTURAS WHERE PREF_PRE = :PREFIJO AND FACT_NUMERO = :NUMERO INTO :ID, :VERNIT, :FEC, :DTOF, :FECDTO;
if (TIPO = 33) then
    SELECT DEVT_ID, TERC_NIT, DEVT_FECHA, 0, DEVT_FECHA FROM devoluciones_ventas WHERE PREF_PRE = :PREFIJO AND DEVT_NUMERO = :NUMERO INTO :ID, :VERNIT, :FEC, :DTOF, :FECDTO;
if (TIPO = 77) then
    SELECT DVCH_ID, TERC_NIT, DVCH_FECHA, 0, DVCH_FECHA FROM devolucion_cheques WHERE PRBA_PREf = :PREFIJO AND DVCH_NUMDOC = :NUMERO INTO :ID, :VERNIT, :FEC, :DTOF, :FECDTO;
if (FECHA > FECDTO) then
    DTOF = 0;
if (DTOF IS NULL) then
    DTOF = 0;
if (DTOF <> 0) then
    BEGIN
    SELECT SUM(RCDE_DTOF) FROM RECIBOS_CAJA_DETALLE WHERE RCDE_IDDOC = :ID AND RCDE_TIPODOC = :TIPO INTO :DTOAPL;
    if (DTOAPL IS NULL) then
        DTOAPL = 0;
    DTOF = DTOF - DTOAPL;
    END
IF (ID = 0) then
    ERROR = 1;
ELSE
  BEGIN
  if (VERNIT <> NIT) then
    ERROR = 2;
  else
    BEGIN
    /* VERIFIQUE QUE LA FECHA DEL ABONO SEA POSTERIOR O IGUAL AL DOC */
    if (FEC > FECHA) then
        ERROR = 3;
    else
        begin
        /* CALCULE LOS SALDOS */
        SELECT SUM(SDCA_MONTO - SDCA_ABONO), SUM(SDCA_RTFTE - SDCA_ABRTFTE), SUM(SDCA_RTIVA - SDCA_ABRTIVA), SUM(SDCA_RTICA - SDCA_ABRTICA)
            FROM SALDOS_DOC_CARTERA WHERE SDCA_TIPOREF = :TIPO AND SDCA_IDREF = :ID
            INTO :SALDO, :RTFTE, :RTIVA, :RTICA;
        if ((TIPO = 31) or (TIPO = 41) or (TIPO = 77)) then
            begin
            if ((RTFTE IS NULL) or (RTFTE < 0))  then
                RTFTE = 0;
            if ((RTIVA IS NULL) or (RTIVA < 0 ))  then
                RTIVA = 0;
            if ((RTICA IS NULL) or (RTICA < 0))  then
                RTICA = 0;
            end
        if ((TIPO = 33) or (TIPO = 42) or (TIPO = 45)) then
            begin
            if ((RTFTE IS NULL) or (RTFTE > 0))  then
                RTFTE = 0;
            if ((RTIVA IS NULL) or (RTIVA > 0 ))  then
                RTIVA = 0;
            if ((RTICA IS NULL) or (RTICA > 0))  then
                RTICA = 0;
            end
        /* TRAIGA EL SALDO NETO */
        EXECUTE PROCEDURE SALDO_DOC_CARTERA(TIPO, ID, FECHA, MONEDA) returning_values (SALDO);
        if (SALDO = 0) then
            ERROR = 4;
        ELSE
            BEGIN
            EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'FECHA AUTORETENEDOR NO DESCONTAR RETENCIONES DEL SALDO PERO SI CONTABILIZARLAS') returning_values (AUTORET);
            if (AUTORET <> '') then
                FAUTORET = CAST(AUTORET AS DATE);
            else
                FAUTORET = '9999/12/31';
            /* BUSQUE LA FECHA DEL DOCUMENTO */
            SELECT MIN(SDCA_FECHA) FROM SALDOS_DOC_CARTERA WHERE (SDCA_TIPOREF = :TIPO) AND (SDCA_IDREF = :ID) AND (SDCA_MONTO <> 0) INTO :FECDOC;
            if (FAUTORET <= FECDOC) then
                BEGIN
                RTFTE = 0;
                RTIVA = 0;
                RTICA = 0;
                END
            /* RESTE LAS RETENCIONES YA QUE SE SUGERIRAN */
            EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'DESCONTAR RETENCIONES POR CAUSACION') returning_values (DESC_RTES);
            if (DESC_RTES = 'NO') then
                SALDO = SALDO - RTFTE - RTIVA - RTICA;
            SALDO = SALDO - DTOF;
            END
        end
    END
  end
SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER PROCEDURE CHEQUEO_SALDOS_DOC_CARTERA(
    CLIINI VARCHAR(20),
    CLIFIN VARCHAR(20))
RETURNS (
    ERROR VARCHAR(60),
    TIPO INTEGER,
    ID INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(6))
AS
declare variable FECHA DATE;
declare variable NIT VARCHAR(20);
declare variable RTFTE NUMERIC(18, 2);
declare variable RTIVA NUMERIC(18, 2);
declare variable RTICA NUMERIC(18, 2);
declare variable MONTO NUMERIC(18, 2);
declare variable EXISTE CHAR(1);
declare variable IDR INTEGER;
declare variable RECAID INTEGER;
BEGIN
DELETE FROM SALDOS_DOC_CARTERA WHERE TERC_NIT >= :CLIINI AND TERC_NIT <= :CLIFIN;
DELETE FROM ANTICIPOS_CLIENTE WHERE RECA_ID = 0;

FOR SELECT FACT_ID, FACT_FECHA, TERC_NIT, FACT_RTFTEMONTO, FACT_rtivamonto, FACT_rticamonto, FACT_TOTAL
    FROM FACTURAS WHERE FACT_ID <> 0 and fact_anulado = 'N' AND TERC_NIT >= :CLIINI AND TERC_NIT <= :CLIFIN
    ORDER BY FACT_FECHA
    INTO :ID, :FECHA, :nit,  :RTFTE, :RTIVA, :RTICA, :MONTO
    DO
    INSERT INTO SALDOS_DOC_CARTERA (SDCA_TIPOREF, SDCA_IDREF, SDCA_FECHA, TERC_NIT, SDCA_RTFTE, SDCA_RTIVA, SDCA_RTICA, SDCA_ABONO, SDCA_ABRTFTE, SDCA_ABRTIVA, SDCA_ABRTICA, SDCA_DEBITO, SDCA_MONTO)
        VALUES (31, :ID, :fecha, :nit, :rtfte, :rtiva, :rtica, 0, 0, 0, 0, 'S', :MONTO);

FOR SELECT NDCL_ID, NDCL_FECHA, TERC_NIT, NDCL_RTFTEMONTO, NDCL_rtivamonto, NDCL_rticamonto, ndcl_monto+ndcl_ivamonto
    FROM NOTAS_DEBITO_CLIENTES WHERE NDCL_ID <> 0 and NDCL_anulado = 'N'  AND TERC_NIT >= :CLIINI AND TERC_NIT <= :CLIFIN
    ORDER BY NDCL_FECHA
    INTO :ID, :FECHA, :nit,  :RTFTE, :RTIVA, :RTICA, :MONTO
    DO
    INSERT INTO SALDOS_DOC_CARTERA (SDCA_TIPOREF, SDCA_IDREF, SDCA_FECHA, TERC_NIT, SDCA_RTFTE, SDCA_RTIVA, SDCA_RTICA, SDCA_ABONO, SDCA_ABRTFTE, SDCA_ABRTIVA, SDCA_ABRTICA, SDCA_DEBITO, SDCA_MONTO)
        VALUES (41, :ID, :fecha, :nit, :rtfte, :rtiva, :rtica, 0, 0, 0, 0, 'S', :MONTO);

FOR SELECT DVCH_ID, DVCH_FECHA, TERC_NIT, 0, 0, 0, DVCH_MONTO
    FROM devolucion_cheques WHERE DVCH_ID <> 0 and DVCH_anulado = 'N' AND DVCH_CARTERA = 'S'  AND TERC_NIT >= :CLIINI AND TERC_NIT <= :CLIFIN
    ORDER BY DVCH_FECHA
    INTO :ID, :FECHA, :nit,  :RTFTE, :RTIVA, :RTICA, :MONTO
    DO
    INSERT INTO SALDOS_DOC_CARTERA (SDCA_TIPOREF, SDCA_IDREF, SDCA_FECHA, TERC_NIT, SDCA_RTFTE, SDCA_RTIVA, SDCA_RTICA, SDCA_ABONO, SDCA_ABRTFTE, SDCA_ABRTIVA, SDCA_ABRTICA, SDCA_DEBITO, SDCA_MONTO)
        VALUES (77, :ID, :fecha, :nit, :rtfte, :rtiva, :rtica, 0, 0, 0, 0, 'S', :MONTO);

FOR SELECT DEVT_ID, DEVT_FECHA, TERC_NIT, DEVT_RTFTEMONTO, DEVT_rtivamonto, DEVT_rticamonto, devt_total
    FROM DEVOLUCIONES_VENTAS WHERE DEVT_ID <> 0 and DEVT_anulado = 'N' AND TERC_NIT >= :CLIINI AND TERC_NIT <= :CLIFIN
    ORDER BY DEVT_FECHA
    INTO :ID, :FECHA, :nit,  :RTFTE, :RTIVA, :RTICA, :MONTO
    DO
    INSERT INTO SALDOS_DOC_CARTERA (SDCA_TIPOREF, SDCA_IDREF, SDCA_FECHA, TERC_NIT, SDCA_RTFTE, SDCA_RTIVA, SDCA_RTICA, SDCA_ABONO, SDCA_ABRTFTE, SDCA_ABRTIVA, SDCA_ABRTICA, SDCA_DEBITO, SDCA_MONTO)
        VALUES (33, :ID, :fecha, :nit, :rtfte*-1, :rtiva*-1, :rtica*-1, 0, 0, 0, 0, 'N', :MONTO * -1);

FOR SELECT NCCL_ID, NCCL_FECHA, TERC_NIT, NCCL_RTFTEMONTO, NCCL_rtivamonto, NCCL_rticamonto, nccl_monto+nccl_ivamonto
    FROM NOTAS_CREDITO_CLIENTES WHERE NCCL_ID <> 0 and NCCL_anulado = 'N' AND TERC_NIT >= :CLIINI AND TERC_NIT <= :CLIFIN
    ORDER BY NCCL_FECHA
    INTO :ID, :FECHA, :nit,  :RTFTE, :RTIVA, :RTICA, :MONTO
    DO
    INSERT INTO SALDOS_DOC_CARTERA (SDCA_TIPOREF, SDCA_IDREF, SDCA_FECHA, TERC_NIT, SDCA_RTFTE, SDCA_RTIVA, SDCA_RTICA, SDCA_ABONO, SDCA_ABRTFTE, SDCA_ABRTIVA, SDCA_ABRTICA, SDCA_DEBITO, SDCA_MONTO)
        VALUES (42, :ID, :fecha, :nit, :rtfte*-1, :rtiva*-1, :rtica*-1, 0, 0, 0, 0, 'N', :MONTO * -1);

FOR SELECT ANCL_ID, ANCL_FECHA, TERC_NIT, ANCL_RTFTEMONTO, ANCL_rtivamonto, ANCL_rticamonto, ancl_base+ancl_ivamonto
    FROM ANTICIPOS_CLIENTE WHERE ANCL_ID <> 0 and ANCL_anulado = 'N' AND TERC_NIT >= :CLIINI AND TERC_NIT <= :CLIFIN
    ORDER BY ANCL_FECHA
    INTO :ID, :FECHA, :nit,  :RTFTE, :RTIVA, :RTICA, :MONTO
    DO
    INSERT INTO SALDOS_DOC_CARTERA (SDCA_TIPOREF, SDCA_IDREF, SDCA_FECHA, TERC_NIT, SDCA_RTFTE, SDCA_RTIVA, SDCA_RTICA, SDCA_ABONO, SDCA_ABRTFTE, SDCA_ABRTIVA, SDCA_ABRTICA, SDCA_DEBITO, SDCA_MONTO)
        VALUES (45, :ID, :fecha, :nit, :rtfte*-1, :rtiva*-1, :rtica*-1, 0, 0, 0, 0, 'N', :MONTO * -1);

FOR SELECT ACDE_TIPODOC, ACDE_IDDOC, APCL_FECHA, TERC_NIT, ACDE_APLICADO, ACDE_RTFTE, ACDE_RTIVA, ACDE_RTICA
    FROM APLICACION_CLIENTE_DETALLE D, APLICACION_CLIENTE A
    WHERE A.APCL_ID = D.apcl_id AND A.APCL_ID <> 0 AND APCL_ANULADO = 'N' AND TERC_NIT >= :CLIINI AND TERC_NIT <= :CLIFIN
    ORDER BY APCL_FECHA
    INTO :TIPO, :ID, :FECHA, :NIT, :MONTO, :RTFTE, :RTIVA, :RTICA
    DO
    BEGIN
    EXISTE = 'N';
    select 'S' from saldos_doc_cartera where sdca_tiporef = :TIPO and sdca_idref = :ID and sdca_fecha = :fecha into :EXISTE;
    if (Existe = 'S') then
        begin
        /* actualice el saldo del dia */
        UPDATE saldos_doc_cartera
            SET SDCA_ABONO = SDCA_ABONO + :MONTO,
                SDCA_ABRTFTE = SDCA_ABRTFTE + :RTFTE,
                SDCA_ABRTIVA = SDCA_ABRTIVA + :RTIVA,
                SDCA_ABRTICA = SDCA_ABRTICA + :RTICA
            WHERE SDCA_TIPOREF = :TIPO AND SDCA_IDREF = :ID AND SDCA_FECHA = :fecha;
        END
    ELSE
        BEGIN
        /* Inserte un nuevo saldo diario */
        INSERT INTO SALDOS_DOC_CARTERA (SDCA_TIPOREF, SDCA_IDREF, SDCA_FECHA, TERC_NIT, SDCA_RTFTE, SDCA_RTIVA, SDCA_RTICA, SDCA_ABONO, SDCA_ABRTFTE, SDCA_ABRTIVA, SDCA_ABRTICA, SDCA_DEBITO, SDCA_MONTO)
            VALUES (:TIPO, :ID, :fecha, :NIT, 0, 0, 0, :MONTO, :rtfte, :rtiva, :rtica, 'N', 0);
        END
    END

FOR SELECT R.RECA_ID, RCDE_TIPODOC, RCDE_IDDOC, RECA_FECHA, TERC_NIT, RCDE_ABONO+RCDE_DTOF, RCDE_RTFTE, RCDE_RTIVA, RCDE_RTICA
    FROM RECIBOS_CAJA_DETALLE D, RECIBOS_CAJA R
    WHERE R.RECA_ID = D.RECA_id AND R.RECA_ID <> 0 AND RECA_ANULADO = 'N' AND TERC_NIT >= :CLIINI AND TERC_NIT <= :CLIFIN
    ORDER BY RECA_FECHA
    INTO :IDR, :TIPO, :ID, :FECHA, :NIT, :MONTO, :RTFTE, :RTIVA, :RTICA
    DO
    BEGIN
    EXISTE = 'N';
    if (TIPO = 45) then
        BEGIN
        SELECT RECA_ID FROM ANTICIPOS_CLIENTE WHERE ANCL_ID = :ID INTO :RECAID;
        if (RECAID = IDR) then
            EXISTE = 'S';
        END
    if (EXISTE = 'N') then
        BEGIN
        select 'S' from saldos_doc_cartera where sdca_tiporef = :TIPO and sdca_idref = :ID and sdca_fecha = :fecha into :EXISTE;
        if (Existe = 'S') then
            begin
            /* actualice el saldo del dia */
            UPDATE saldos_doc_cartera
                SET SDCA_ABONO = SDCA_ABONO + :MONTO,
                    SDCA_ABRTFTE = SDCA_ABRTFTE + :RTFTE,
                    SDCA_ABRTIVA = SDCA_ABRTIVA + :RTIVA,
                    SDCA_ABRTICA = SDCA_ABRTICA + :RTICA
                WHERE SDCA_TIPOREF = :TIPO AND SDCA_IDREF = :ID AND SDCA_FECHA = :fecha;
            END
        ELSE
            BEGIN
            /* Inserte un nuevo saldo diario */
            INSERT INTO SALDOS_DOC_CARTERA (SDCA_TIPOREF, SDCA_IDREF, SDCA_FECHA, TERC_NIT, SDCA_RTFTE, SDCA_RTIVA, SDCA_RTICA, SDCA_ABONO, SDCA_ABRTFTE, SDCA_ABRTIVA, SDCA_ABRTICA, SDCA_DEBITO, SDCA_MONTO)
                VALUES (:TIPO, :ID, :fecha, :NIT, 0, 0, 0, :MONTO, :rtfte, :rtiva, :rtica, 'N', 0);
            END
        END
    END

FOR SELECT E.egre_id, EGCC_TIPODOC, EGCC_IDDOC, EGRE_FECHA, TERC_NIT, EGCC_ABONO+EGCC_DTOF, EGCC_RTFTE, EGCC_RTIVA, EGCC_RTICA
    FROM EGRESOS_CRUCEC C, EGRESOS E
    WHERE E.egre_id = C.egre_id AND EGRE_ANULADO = 'N' AND TERC_NIT >= :CLIINI AND TERC_NIT <= :CLIFIN
    ORDER BY EGRE_FECHA
    INTO :IDR, :TIPO, :ID, :FECHA, :NIT, :MONTO, :RTFTE, :RTIVA, :RTICA
    DO
    BEGIN
    select 'S' from saldos_doc_cartera where sdca_tiporef = :TIPO and sdca_idref = :ID and sdca_fecha = :fecha into :EXISTE;
    if (Existe = 'S') then
        begin
        /* actualice el saldo del dia */
        UPDATE saldos_doc_cartera
            SET SDCA_ABONO = SDCA_ABONO + :MONTO,
            SDCA_ABRTFTE = SDCA_ABRTFTE + :RTFTE,
            SDCA_ABRTIVA = SDCA_ABRTIVA + :RTIVA,
            SDCA_ABRTICA = SDCA_ABRTICA + :RTICA
            WHERE SDCA_TIPOREF = :TIPO AND SDCA_IDREF = :ID AND SDCA_FECHA = :fecha;
        END
    ELSE
        BEGIN
        /* Inserte un nuevo saldo diario */
        INSERT INTO SALDOS_DOC_CARTERA (SDCA_TIPOREF, SDCA_IDREF, SDCA_FECHA, TERC_NIT, SDCA_RTFTE, SDCA_RTIVA, SDCA_RTICA, SDCA_ABONO, SDCA_ABRTFTE, SDCA_ABRTIVA, SDCA_ABRTICA, SDCA_DEBITO, SDCA_MONTO)
            VALUES (:TIPO, :ID, :fecha, :NIT, 0, 0, 0, :MONTO, :rtfte, :rtiva, :rtica, 'N', 0);
        END
    END

for select ancl_id, ancl_base+ancl_ivamonto, PREF_PRE, ANCL_NUMERO from anticipos_cliente
    where ANCL_ANULADO = 'N' and reca_id not in (select reca_id from recibos_caja where reca_anulado = 'N')
    into :ID, :MONTO, :PREF, :NUMERO
    do
    begin
    FECHA = cast('now' as date);
    execute procedure saldo_doc_cartera(45, :id, :FECHA, 0) returning_values (:RTFTE);
    if ((MONTO = RTFTE) or (RTFTE IS NULL)) then
        DELETE FROM ANTICIPOS_CLIENTE WHERE ANCL_ID = :ID;
    ELSE
        BEGIN
        TIPO = 45;
        ERROR = 'DOCUMENTO ANULADO CON ABONOS';
        SUSPEND;
        END
    end
SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER PROCEDURE COMISIONES_COBRO(
    DESDE INTEGER,
    HASTA INTEGER,
    FECINI DATE,
    FECFIN DATE,
    DETALLE CHAR(1))
RETURNS (
    CODVEND INTEGER,
    NOMVEND VARCHAR(60),
    NIT VARCHAR(20),
    CLIENTE VARCHAR(60),
    NOMTIPO VARCHAR(8),
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(6),
    FECDOC DATE,
    PREFREC VARCHAR(4),
    NUMREC VARCHAR(6),
    FECREC DATE,
    DIAS INTEGER,
    ABONO NUMERIC(18,2),
    BASE NUMERIC(18,2),
    COMIMONTO NUMERIC(18,2),
    COMIPORC NUMERIC(9,2),
    ARTICULO VARCHAR(20),
    CODGRP VARCHAR(2),
    CANT NUMERIC(18,4))
AS
DECLARE VARIABLE TIPO INTEGER;
DECLARE VARIABLE ID INTEGER;
DECLARE VARIABLE IVAMONTO NUMERIC(18,2);
DECLARE VARIABLE TOTAL NUMERIC(18,2);
DECLARE VARIABLE SITOT CHAR(2);
DECLARE VARIABLE VENTA CHAR(2);
DECLARE VARIABLE COMIV NUMERIC(18,2);
DECLARE VARIABLE PORCV NUMERIC(18,2);
DECLARE VARIABLE CONSUMO NUMERIC(18,2);
declare variable ALFINAL CHAR(2);
declare variable SALDO NUMERIC(18,2);
declare variable COMISION VARCHAR(10);
declare variable porcaux NUMERIC(9,2);
declare variable BASEAUX DOUBLE PRECISION;
declare variable SUCURSAL VARCHAR(20);
BEGIN
EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION', 'VENDEDORES', 'COMISIONES EN VENTA INCLUYENDO IMPUESTOS') returning_values (:SITOT);
EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA','COMISIONES','COMISION POR COBRO PAGADERA SOLO EN EL COBRO TOTAL') returning_values (:ALFINAL);
execute procedure lee_configuracion('CARTERA','COMISIONES','COMISION POR COBRO COMO PORCENTAJE DE LA COMISION VENTA') returning_values (:venta);
EXECUTE PROCEDURE lee_configuracion('CARTERA', 'COMISIONES', 'LIQUIDAR COMISION COBRO CON COBRADOR DEL DOCUMENTO O DEL RECIBO') returning_values (:COMISION);
FOR SELECT RCDE_TIPODOC, RCDE_IDDOC, RCDE_PREFIJO, RCDE_NUMERO, R.TERC_NIT, TERC_NOM, RECA_FECHA, (RCDE_ABONO+RCDE_RTFTE+RCDE_RTIVA+RCDE_RTICA), PREF_PRE, RECA_NUMERO, COBR_COD
    FROM RECIBOS_CAJA R, RECIBOS_CAJA_DETALLE RD, TERCEROS T
    WHERE R.RECA_ID = RD.RECA_ID AND RECA_FECHA >= :FECINI AND RECA_FECHA <= :FECFIN AND R.TERC_NIT = T.TERC_NIT AND RECA_ANULADO = 'N'
    ORDER BY TERC_NIT, RECA_FECHA
    INTO :TIPO, :ID, :PREFIJO, :NUMERO, :NIT, :CLIENTE, :FECREC, :ABONO, :PREFREC, :NUMREC, :codvend
    DO
    BEGIN
    SELECT TIDO_NOMCORTO FROM TIPO_DOCUMENTO WHERE TIDO_COD = :TIPO INTO :NOMTIPO;
    if (COMISION = 'DOCUMENTO') then
        SELECT MVCL_FECHA, COBR_COD FROM MOVIMIENTO_CLIENTES WHERE MVCL_TIPOREF = :TIPO AND MVCL_IDREF = :ID
            INTO :FECDOC, :codvend;
    else
        SELECT MVCL_FECHA FROM MOVIMIENTO_CLIENTES WHERE MVCL_TIPOREF = :TIPO AND MVCL_IDREF = :ID
            INTO :FECDOC;
    if (FECDOC IS NOT NULL) then
        DIAS = FECREC - FECDOC;
    ELSE
        DIAS = 999;
    if ((codvend >= :DESDE) AND (codvend <= :hasta)) then
        BEGIN
        /* TRAIGA EL PORCENTAJE DE ACUERDO A LOS DIAS */
        COMIPORC = 0;
        SELECT CMCB_PORC FROM COMISION_COBRO WHERE CMCB_DIASINI <= :dias AND CMCB_DIASFIN >= :DIAS AND COBR_COD = :CODVEND INTO :COMIPORC;
        if (COMIPORC IS NULL) THEN
            COMIPORC = 0;
        if (VENTA = 'NO') then
            BEGIN
            if (TIPO = 31) then
                BEGIN
                if (DETALLE = 'N') then
                    SELECT MAX(FACT_TOTAL), MAX(FACT_IVAMONTO), SUM(FADE_CONSUMO) FROM FACTURAS F, FACTURAS_DETALLE D
                        WHERE F.FACT_ID = D.FACT_ID AND F.FACT_ID = :ID INTO :TOTAL, :IVAMONTO, :CONSUMO;
                ELSE
                    FOR SELECT D.ARTI_COD, FADE_CANT, FADE_TOTAL, FADE_IVAMONTO, FADE_CONSUMO, GRUP_COD
                        FROM FACTURAS F, FACTURAS_DETALLE D, ARTICULO A
                        WHERE F.FACT_ID = D.FACT_ID AND D.arti_cod = A.arti_cod AND F.FACT_ID = :ID
                        INTO :ARTICULO, :CANT, :TOTAL, :IVAMONTO, :CONSUMO, :CODGRP
                        DO
                        BEGIN
                        if (SITOT = 'SI') then
                            BASEAUX = TOTAL;
                        ELSE
                            BASEAUX = (TOTAL - IVAMONTO - CONSUMO);
                        BASE = BASEAUX;
                        COMIMONTO = BASE / 100 * COMIPORC;
                        SUSPEND;
                        END
                END
            if (TIPO = 33) then
                if (DETALLE = 'N') then
                    SELECT MAX(DEVT_TOTAL*-1), MAX(DEVT_IVAMONTO*-1), SUM(DVDE_CONSUMO) FROM DEVOLUCIONES_VENTAS V, DEVOLUCIONES_VENTAS_DETALLE D
                        WHERE V.DEVT_ID = D.DEVT_ID AND V.DEVT_ID = :ID INTO :TOTAL, :IVAMONTO, :CONSUMO;
                ELSE
                    FOR SELECT D.ARTI_COD, DVDE_CANT, DVDE_TOTAL*-1, DVDE_IVAMONTO*-1, DVDE_CONSUMO*-1, GRUP_COD
                        FROM DEVOLUCIONES_VENTAS V, DEVOLUCIONES_VENTAS_DETALLE D, ARTICULO A
                        WHERE V.DEVT_ID = D.DEVT_ID AND D.arti_cod = A.arti_cod AND V.DEVT_ID = :ID
                        INTO :ARTICULO, :CANT, :TOTAL, :IVAMONTO, :CONSUMO, :codgrp
                        DO
                        BEGIN
                        if (SITOT = 'SI') then
                            BASEAUX = TOTAL;
                        ELSE
                            BASEAUX = TOTAL - IVAMONTO - CONSUMO;
                        BASE = BASEAUX;
                        COMIMONTO = BASE / 100 * COMIPORC;
                        SUSPEND;
                        END
            if (TIPO = 41) then
                SELECT NDCL_MONTO, NDCL_IVAMONTO, 0 FROM NOTAS_DEBITO_CLIENTES WHERE NDCL_ID = :ID INTO :TOTAL, :IVAMONTO, :CONSUMO;
            if (TIPO = 42) then
                SELECT NCCL_MONTO*-1, NCCL_IVAMONTO*-1, 0 FROM NOTAS_CREDITO_CLIENTES WHERE NCCL_ID = :ID INTO :TOTAL, :IVAMONTO, :CONSUMO;
            if (TIPO = 77) then
                SELECT DVCH_MONTO, 0, 0 FROM DEVOLUCION_CHEQUES WHERE DVCH_ID = :ID INTO :TOTAL, :IVAMONTO, :CONSUMO;
            if (SITOT = 'SI') then
                BASEAUX = ABONO;
            ELSE
                if ((TOTAL - IVAMONTO - CONSUMO) <> 0) then
                    BASEAUX = (ABONO / TOTAL) * (TOTAL - IVAMONTO - CONSUMO);
                ELSE
                    BASEAUX = 0;
            BASE = BASEAUX;
            COMIMONTO = BASE / 100 * COMIPORC;
            END
        ELSE
            BEGIN
            if (TIPO = 31) then
                if (DETALLE = 'N') then
                    SELECT MAX(FACT_TOTAL), MAX(FACT_IVAMONTO), MAX(FACT_COMIPORC), SUM(FADE_CONSUMO)
                        FROM FACTURAS F, FACTURAS_DETALLE D WHERE F.FACT_ID = D.FACT_ID AND F.FACT_ID = :ID
                        INTO :TOTAL, :IVAMONTO, :PORCV, :CONSUMO;
                ELSE
                    FOR SELECT D.ARTI_COD, FADE_CANT, FADE_TOTAL, FADE_IVAMONTO, FADE_CONSUMO, FACT_COMIPORC, GRUP_COD
                        FROM FACTURAS F, FACTURAS_DETALLE D, ARTICULO A
                        WHERE F.FACT_ID = D.FACT_ID AND D.arti_cod = A.arti_cod AND F.FACT_ID = :ID
                        INTO :ARTICULO, :CANT, :TOTAL, :IVAMONTO, :CONSUMO, :porcv, :codgrp
                        DO
                        BEGIN
                        if (SITOT = 'SI') then
                            BASEAUX = TOTAL;
                        ELSE
                            BASEAUX = (TOTAL - IVAMONTO - CONSUMO);
                        COMIV = PORCV / 100 * BASEAUX;
                        COMIMONTO = COMIV / 100 * COMIPORC;
                        porcaux = comiporc;
                        comiporc = PORCV / 100 * COMIPORC;
                        BASE = BASEAUX;
                        SUSPEND;
                        END
            if (TIPO = 33) then
                if (DETALLE = 'N') then
                    SELECT MAX(DEVT_TOTAL), MAX(DEVT_IVAMONTO), MAX(DEVT_COMIPORC), SUM(DVDE_CONSUMO)
                        FROM DEVOLUCIONES_VENTAS V, DEVOLUCIONES_VENTAS_DETALLE D WHERE V.DEVT_ID = D.DEVT_ID AND D.DEVT_ID = :ID
                        INTO :TOTAL, :IVAMONTO, :PORCV, :CONSUMO;
                ELSE
                    FOR SELECT D.ARTI_COD, DVDE_CANT, DVDE_TOTAL*-1, DVDE_IVAMONTO*-1, DVDE_CONSUMO*-1, DEVT_COMIPORC, GRUP_COD
                        FROM DEVOLUCIONES_VENTAS V, DEVOLUCIONES_VENTAS_DETALLE D, ARTICULO A
                        WHERE V.DEVT_ID = D.DEVT_ID AND D.arti_cod = A.arti_cod AND V.DEVT_ID = :ID
                        INTO :ARTICULO, :CANT, :TOTAL, :IVAMONTO, :CONSUMO, :porcv, :codgrp
                        DO
                        BEGIN
                        if (SITOT = 'SI') then
                            BASEAUX = TOTAL;
                        ELSE
                            BASEAUX = (TOTAL - IVAMONTO - CONSUMO);
                        COMIV = PORCV / 100 * BASEAUX;
                        COMIMONTO = COMIV / 100 * COMIPORC;
                        porcaux = comiporc;
                        comiporc = PORCV / 100 * COMIPORC;
                        BASE = BASEAUX;
                        SUSPEND;
                        END
            if (TIPO = 41) then
                SELECT NDCL_MONTO, NDCL_IVAMONTO, NDCL_COMIPORC, 0 FROM NOTAS_DEBITO_CLIENTES
                    WHERE NDCL_ID = :ID INTO :TOTAL, :IVAMONTO, :PORCV, :CONSUMO;
            if (TIPO = 42) then
                SELECT NCCL_MONTO, NCCL_IVAMONTO, NCCL_COMIPORC, 0  FROM NOTAS_CREDITO_CLIENTES
                    WHERE NCCL_ID = :ID INTO :TOTAL, :IVAMONTO, :PORCV, :CONSUMO;
            if (TIPO = 77) then
                SELECT DVCH_MONTO, 0, 0, 0 FROM DEVOLUCION_CHEQUES WHERE DVCH_ID = :ID INTO :TOTAL, :IVAMONTO, :PORCV, :CONSUMO;
            if (SITOT = 'SI') then
                BASEAUX = ABONO;
            ELSE
                if ((total <> 0) AND (ABONO <> 0)) then
                    BASEAUX = (TOTAL - IVAMONTO - CONSUMO) / TOTAL * ABONO;
                ELSE
                    BASEAUX = 0;
            COMIV = PORCV / 100 * BASEAUX;
            COMIMONTO = COMIV / 100 * COMIPORC;
            porcaux = comiporc;
            comiporc = PORCV / 100 * COMIPORC;
            BASE = BASEAUX;
            END
        select COBR_NOM from COBRADORES where COBR_COD = :codvend INTO :nomvend;
        if (DETALLE = 'N') then
            if (ALFINAL = 'SI') then
                BEGIN
                /* VERIFIQUE EL SALDO DEL DOCUMENTO, SI ES CERO LIQUIDE COMISION SOBRE EL TOTAL */
                EXECUTE PROCEDURE saldo_doc_cartera(:tipo, :ID, :FECREC, 0) returning_values (:SALDO);
                if (SALDO = 0) then
                    BEGIN
                    if (VENTA = 'NO') then
                        begin
                        if (SITOT = 'SI') then
                            BASEAUX = TOTAL;
                        ELSE
                            BASEAUX = TOTAL - IVAMONTO - CONSUMO;
                        COMIMONTO = BASEAUX * COMIPORC / 100;
                        end
                    ELSE
                        BEGIN
                        if (SITOT = 'SI') then
                            BASEAUX = TOTAL;
                        ELSE
                            BASEAUX = TOTAL - IVAMONTO - CONSUMO;
                        COMIV = PORCV * BASEAUX / 100;
                        COMIMONTO = COMIV / 100 * porcaux;
                        comiporc = PORCV / 100 * porcaux;
                        END
                    BASE = BASEAUX;
                    SUSPEND;
                    END
                END
            ELSE
                SUSPEND;
        ELSE
            if ((TIPO <> 31) AND (TIPO <> 33)) then
                SUSPEND;
        END
    END
FOR SELECT EGCC_TIPODOC, EGCC_IDDOC, EGCC_PREFIJO, EGCC_NUMERO, E.TERC_NIT, TERC_NOM, EGRE_FECHA, (EGCC_ABONO+EGCC_RTFTE+EGCC_RTIVA+EGCC_RTICA), PREF_PRE, EGRE_NUMERO, EGCC_SUCURSAL
    FROM EGRESOS E, EGRESOS_CRUCEC C, TERCEROS T
    WHERE E.EGRE_ID = C.EGRE_ID AND EGRE_FECHA >= :FECINI AND EGRE_FECHA <= :FECFIN AND E.TERC_NIT = T.TERC_NIT AND EGRE_ANULADO = 'N'
    ORDER BY TERC_NIT, EGRE_FECHA
    INTO :TIPO, :ID, :PREFIJO, :NUMERO, :NIT, :CLIENTE, :FECREC, :ABONO, :PREFREC, :NUMREC, :SUCURSAL
    DO
    BEGIN
    SELECT COBR_COD FROM cliente_sucursales WHERE TERC_NIT = :NIT AND CLCU_COD = :sucursal INTO :codvend;
    SELECT TIDO_NOMCORTO FROM TIPO_DOCUMENTO WHERE TIDO_COD = :TIPO INTO :NOMTIPO;
    if (COMISION = 'DOCUMENTO') then
        SELECT MVCL_FECHA, COBR_COD FROM MOVIMIENTO_CLIENTES WHERE MVCL_TIPOREF = :TIPO AND MVCL_IDREF = :ID
            INTO :FECDOC, :codvend;
    else
        SELECT MVCL_FECHA FROM MOVIMIENTO_CLIENTES WHERE MVCL_TIPOREF = :TIPO AND MVCL_IDREF = :ID
            INTO :FECDOC;
    if (FECDOC IS NOT NULL) then
        DIAS = FECREC - FECDOC;
    ELSE
        DIAS = 999;
    if ((codvend >= :DESDE) AND (codvend <= :hasta)) then
        BEGIN
        /* TRAIGA EL PORCENTAJE DE ACUERDO A LOS DIAS */
        COMIPORC = 0;
        SELECT CMCB_PORC FROM COMISION_COBRO WHERE CMCB_DIASINI <= :dias AND CMCB_DIASFIN >= :DIAS AND COBR_COD = :CODVEND INTO :COMIPORC;
        if (COMIPORC IS NULL) THEN
            COMIPORC = 0;
        if (VENTA = 'NO') then
            BEGIN
            if (TIPO = 31) then
                BEGIN
                if (DETALLE = 'N') then
                    SELECT MAX(FACT_TOTAL), MAX(FACT_IVAMONTO), SUM(FADE_CONSUMO) FROM FACTURAS F, FACTURAS_DETALLE D
                        WHERE F.FACT_ID = D.FACT_ID AND F.FACT_ID = :ID INTO :TOTAL, :IVAMONTO, :CONSUMO;
                ELSE
                    FOR SELECT D.ARTI_COD, FADE_CANT, FADE_TOTAL, FADE_IVAMONTO, FADE_CONSUMO, GRUP_COD
                        FROM FACTURAS F, FACTURAS_DETALLE D, ARTICULO A
                        WHERE F.FACT_ID = D.FACT_ID AND D.arti_cod = A.arti_cod AND F.FACT_ID = :ID
                        INTO :ARTICULO, :CANT, :TOTAL, :IVAMONTO, :CONSUMO, :CODGRP
                        DO
                        BEGIN
                        if (SITOT = 'SI') then
                            BASEAUX = TOTAL;
                        ELSE
                            BASEAUX = (TOTAL - IVAMONTO - CONSUMO);
                        BASE = BASEAUX;
                        COMIMONTO = BASE / 100 * COMIPORC;
                        SUSPEND;
                        END
                END
            if (TIPO = 33) then
                if (DETALLE = 'N') then
                    SELECT MAX(DEVT_TOTAL*-1), MAX(DEVT_IVAMONTO*-1), SUM(DVDE_CONSUMO) FROM DEVOLUCIONES_VENTAS V, DEVOLUCIONES_VENTAS_DETALLE D
                        WHERE V.DEVT_ID = D.DEVT_ID AND V.DEVT_ID = :ID INTO :TOTAL, :IVAMONTO, :CONSUMO;
                ELSE
                    FOR SELECT D.ARTI_COD, DVDE_CANT, DVDE_TOTAL*-1, DVDE_IVAMONTO*-1, DVDE_CONSUMO*-1, GRUP_COD
                        FROM DEVOLUCIONES_VENTAS V, DEVOLUCIONES_VENTAS_DETALLE D, ARTICULO A
                        WHERE V.DEVT_ID = D.DEVT_ID AND D.arti_cod = A.arti_cod AND V.DEVT_ID = :ID
                        INTO :ARTICULO, :CANT, :TOTAL, :IVAMONTO, :CONSUMO, :codgrp
                        DO
                        BEGIN
                        if (SITOT = 'SI') then
                            BASEAUX = TOTAL;
                        ELSE
                            BASEAUX = TOTAL - IVAMONTO - CONSUMO;
                        BASE = BASEAUX;
                        COMIMONTO = BASE / 100 * COMIPORC;
                        SUSPEND;
                        END
            if (TIPO = 41) then
                SELECT NDCL_MONTO, NDCL_IVAMONTO, 0 FROM NOTAS_DEBITO_CLIENTES WHERE NDCL_ID = :ID INTO :TOTAL, :IVAMONTO, :CONSUMO;
            if (TIPO = 42) then
                SELECT NCCL_MONTO*-1, NCCL_IVAMONTO*-1, 0 FROM NOTAS_CREDITO_CLIENTES WHERE NCCL_ID = :ID INTO :TOTAL, :IVAMONTO, :CONSUMO;
            if (TIPO = 77) then
                SELECT DVCH_MONTO, 0, 0 FROM DEVOLUCION_CHEQUES WHERE DVCH_ID = :ID INTO :TOTAL, :IVAMONTO, :CONSUMO;
            if (SITOT = 'SI') then
                BASEAUX = ABONO;
            ELSE
                if ((TOTAL - IVAMONTO - CONSUMO) <> 0) then
                    BASEAUX = (ABONO / TOTAL) * (TOTAL - IVAMONTO - CONSUMO);
                ELSE
                    BASEAUX = 0;
            BASE = BASEAUX;
            COMIMONTO = BASE / 100 * COMIPORC;
            END
        ELSE
            BEGIN
            if (TIPO = 31) then
                if (DETALLE = 'N') then
                    SELECT MAX(FACT_TOTAL), MAX(FACT_IVAMONTO), MAX(FACT_COMIPORC), SUM(FADE_CONSUMO)
                        FROM FACTURAS F, FACTURAS_DETALLE D WHERE F.FACT_ID = D.FACT_ID AND F.FACT_ID = :ID
                        INTO :TOTAL, :IVAMONTO, :PORCV, :CONSUMO;
                ELSE
                    FOR SELECT D.ARTI_COD, FADE_CANT, FADE_TOTAL, FADE_IVAMONTO, FADE_CONSUMO, FACT_COMIPORC, GRUP_COD
                        FROM FACTURAS F, FACTURAS_DETALLE D, ARTICULO A
                        WHERE F.FACT_ID = D.FACT_ID AND D.arti_cod = A.arti_cod AND F.FACT_ID = :ID
                        INTO :ARTICULO, :CANT, :TOTAL, :IVAMONTO, :CONSUMO, :porcv, :codgrp
                        DO
                        BEGIN
                        if (SITOT = 'SI') then
                            BASEAUX = TOTAL;
                        ELSE
                            BASEAUX = (TOTAL - IVAMONTO - CONSUMO);
                        COMIV = PORCV / 100 * BASEAUX;
                        COMIMONTO = COMIV / 100 * COMIPORC;
                        porcaux = comiporc;
                        comiporc = PORCV / 100 * COMIPORC;
                        BASE = BASEAUX;
                        SUSPEND;
                        END
            if (TIPO = 33) then
                if (DETALLE = 'N') then
                    SELECT MAX(DEVT_TOTAL), MAX(DEVT_IVAMONTO), MAX(DEVT_COMIPORC), SUM(DVDE_CONSUMO)
                        FROM DEVOLUCIONES_VENTAS V, DEVOLUCIONES_VENTAS_DETALLE D WHERE V.DEVT_ID = D.DEVT_ID AND D.DEVT_ID = :ID
                        INTO :TOTAL, :IVAMONTO, :PORCV, :CONSUMO;
                ELSE
                    FOR SELECT D.ARTI_COD, DVDE_CANT, DVDE_TOTAL*-1, DVDE_IVAMONTO*-1, DVDE_CONSUMO*-1, DEVT_COMIPORC, GRUP_COD
                        FROM DEVOLUCIONES_VENTAS V, DEVOLUCIONES_VENTAS_DETALLE D, ARTICULO A
                        WHERE V.DEVT_ID = D.DEVT_ID AND D.arti_cod = A.arti_cod AND V.DEVT_ID = :ID
                        INTO :ARTICULO, :CANT, :TOTAL, :IVAMONTO, :CONSUMO, :porcv, :codgrp
                        DO
                        BEGIN
                        if (SITOT = 'SI') then
                            BASEAUX = TOTAL;
                        ELSE
                            BASEAUX = (TOTAL - IVAMONTO - CONSUMO);
                        COMIV = PORCV / 100 * BASEAUX;
                        COMIMONTO = COMIV / 100 * COMIPORC;
                        porcaux = comiporc;
                        comiporc = PORCV / 100 * COMIPORC;
                        BASE = BASEAUX;
                        SUSPEND;
                        END
            if (TIPO = 41) then
                SELECT NDCL_MONTO, NDCL_IVAMONTO, NDCL_COMIPORC, 0 FROM NOTAS_DEBITO_CLIENTES
                    WHERE NDCL_ID = :ID INTO :TOTAL, :IVAMONTO, :PORCV, :CONSUMO;
            if (TIPO = 42) then
                SELECT NCCL_MONTO, NCCL_IVAMONTO, NCCL_COMIPORC, 0  FROM NOTAS_CREDITO_CLIENTES
                    WHERE NCCL_ID = :ID INTO :TOTAL, :IVAMONTO, :PORCV, :CONSUMO;
            if (TIPO = 77) then
                SELECT DVCH_MONTO, 0, 0, 0 FROM DEVOLUCION_CHEQUES WHERE DVCH_ID = :ID INTO :TOTAL, :IVAMONTO, :PORCV, :CONSUMO;
            if (SITOT = 'SI') then
                BASEAUX = ABONO;
            ELSE
                if ((total <> 0) AND (ABONO <> 0)) then
                    BASEAUX = (TOTAL - IVAMONTO - CONSUMO) / TOTAL * ABONO;
                ELSE
                    BASEAUX = 0;
            COMIV = PORCV / 100 * BASEAUX;
            COMIMONTO = COMIV / 100 * COMIPORC;
            porcaux = comiporc;
            comiporc = PORCV / 100 * COMIPORC;
            BASE = BASEAUX;
            END
        select COBR_NOM from COBRADORES where COBR_COD = :codvend INTO :nomvend;
        if (DETALLE = 'N') then
            if (ALFINAL = 'SI') then
                BEGIN
                /* VERIFIQUE EL SALDO DEL DOCUMENTO, SI ES CERO LIQUIDE COMISION SOBRE EL TOTAL */
                EXECUTE PROCEDURE saldo_doc_cartera(:tipo, :ID, :FECREC, 0) returning_values (:SALDO);
                if (SALDO = 0) then
                    BEGIN
                    if (VENTA = 'NO') then
                        begin
                        if (SITOT = 'SI') then
                            BASEAUX = TOTAL;
                        ELSE
                            BASEAUX = TOTAL - IVAMONTO - CONSUMO;
                        COMIMONTO = BASEAUX * COMIPORC / 100;
                        end
                    ELSE
                        BEGIN
                        if (SITOT = 'SI') then
                            BASEAUX = TOTAL;
                        ELSE
                            BASEAUX = TOTAL - IVAMONTO - CONSUMO;
                        COMIV = PORCV * BASEAUX / 100;
                        COMIMONTO = COMIV / 100 * porcaux;
                        comiporc = PORCV / 100 * porcaux;
                        END
                    BASE = BASEAUX;
                    SUSPEND;
                    END
                END
            ELSE
                SUSPEND;
        ELSE
            if ((TIPO <> 31) AND (TIPO <> 33)) then
                SUSPEND;
        END
    END
FOR SELECT 'DEVOCHEQ', DVCH_MONTO*-1, DVCH_FECHA, PRBA_PREF, DVCH_NUMDOC, DVCH_FECHA, D.TERC_NIT, DVCH_NOMTERC, '', '', D.COBR_COD
    FROM DEVOLUCION_CHEQUES D, CLIENTES C
    WHERE DVCH_FECHA >= :FECINI AND DVCH_FECHA <= :FECFIN AND D.TERC_NIT = C.TERC_NIT AND D.COBR_COD = :CODVEND
    INTO :NOMTIPO, :BASE, :FECDOC, :PREFIJO, :NUMERO, :FECREC, :NIT, :CLIENTE, :PREFREC, :NUMREC, :codvend
    DO
    BEGIN
    COMIPORC = 0;
    COMIMONTO = 0;
    if ((codvend >= :DESDE) AND (codvend <= :hasta)) then
        BEGIN
        select COBR_NOM from COBRADORES where COBR_COD = :codvend INTO :nomvend;
        /* SELECT CMCB_PORC FROM COMISION_COBRO WHERE CMCB_DIASINI <= 1 AND CMCB_DIASFIN >= 1 AND COBR_COD = :CODVEND INTO :COMIPORC;
        if (COMIPORC IS NULL) THEN
            COMIPORC = 0;
        COMIMONTO = BASE * COMIPORC / 100; */
        SUSPEND;
        END
    END
SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER PROCEDURE CONCILIA_CARTERA(
    FECINI DATE,
    FECFIN DATE,
    CTACART VARCHAR(20),
    SUBEMPRESA INTEGER,
    ANTERIOR CHAR(1))
RETURNS (
    NIT VARCHAR(20),
    NOMBRE VARCHAR(60),
    INICIAL NUMERIC(18,2),
    INICIALC NUMERIC(18,2),
    DEBITOS NUMERIC(18,2),
    DEBITOSC NUMERIC(18,2),
    CREDITOS NUMERIC(18,2),
    CREDITOSC NUMERIC(18,2),
    SALDO NUMERIC(18,2),
    SALDOC NUMERIC(18,2),
    DIFERENCIA NUMERIC(18,2))
AS
declare variable ANO CHAR(4);
declare variable MES INTEGER;
declare variable NUMROWS INTEGER;
declare variable ABONOS NUMERIC(18,2);
declare variable TIPODOC INTEGER;
declare variable IDDOC INTEGER;
declare variable RETES CHAR(2);
begin
ano = EXTRACT(YEAR FROM FECFIN);
mes = EXTRACT(MONTH FROM FECFIN);

for select TERC_NIT, TERC_NOM from TERCEROS WHERE TERC_CLIE = 'S' into :NIT, :NOMBRE
    DO
    BEGIN
    /* OMITE LOS CLIENTES DE CONTADO */
    SELECT COUNT(*) FROM AUTORIZACIONES WHERE AUTO_NITCONTADO = :NIT INTO :numrows;
    IF (numrows = 0) THEN
        BEGIN
        FECINI = FECINI - 1;
        INICIAL = 0;
        FOR SELECT MVCL_TIPOREF, MVCL_IDREF FROM MOVIMIENTO_CLIENTES
            WHERE TERC_NIT = :NIT AND MVCL_FECHA <= :FECINI AND
            MVCL_ABONO = 'N' AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA))
            INTO :TIPODOC, :IDDOC
            DO
            BEGIN
            EXECUTE PROCEDURE saldo_doc_cartera(TIPODOC, IDDOC, FECINI, 0) returning_values (SALDO);
            INICIAL = INICIAL + SALDO;
            END
        EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'DESCONTAR RETENCIONES POR CAUSACION') returning_values(:RETES);
        FECINI = FECINI + 1;
        if (RETES = 'SI') then
            BEGIN
            SELECT SUM(MVCL_MONTO-MVCL_RTEFTE-MVCL_RTEIVA-MVCL_RTEICA) FROM movimiento_clientes
                WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND MVCL_FECHA < :FECFIN
                AND MVCL_DEBITO = 'S' AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA))
                INTO :DEBITOS;
            SELECT SUM(MVCL_MONTO-MVCL_RTEFTE-MVCL_RTEIVA-MVCL_RTEICA) FROM movimiento_clientes
                WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND MVCL_FECHA < :FECFIN
                AND MVCL_DEBITO = 'N' AND MVCL_ABONO = 'N' and MVCL_TIPOREF <> 45 AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA))
                INTO :CREDITOS;
            SELECT SUM(MVCL_MONTO) FROM movimiento_clientes
                WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND MVCL_FECHA < :FECFIN
                AND MVCL_ABONO = 'S' AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA))
                INTO :ABONOS;
            END
        ELSE
            BEGIN
            SELECT SUM(MVCL_MONTO) FROM movimiento_clientes
                WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND MVCL_FECHA < :FECFIN
                AND MVCL_DEBITO = 'S' AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA))
                INTO :DEBITOS;
            SELECT SUM(MVCL_MONTO) FROM movimiento_clientes
                WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND MVCL_FECHA < :FECFIN
                AND MVCL_DEBITO = 'N' AND MVCL_ABONO = 'N' and MVCL_TIPOREF <> 45 AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA))
                INTO :CREDITOS;
            SELECT SUM(MVCL_MONTO+MVCL_RTEFTE+MVCL_RTEIVA+MVCL_RTEICA) FROM movimiento_clientes
                WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND MVCL_FECHA < :FECFIN
                AND MVCL_ABONO = 'S' AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA))
                INTO :ABONOS;
            END
        if (DEBITOS IS NULL) then
            DEBITOS = 0;
        if (CREDITOS IS NULL) then
            CREDITOS = 0;
        if (ABONOS IS NULL) then
            ABONOS = 0;
        CREDITOS = CREDITOS + ABONOS;
        SALDO = INICIAL + DEBITOS - CREDITOS;

        /* LO CONTABLE */
        EXECUTE PROCEDURE SALDO_TERCERO_MES(ctacart, NIT, ANO, MES, 'S') RETURNING_VALUES (INICIALC);
        EXECUTE PROCEDURE MOVIMIENTO_TERCERO_MES(ctacart, NIT, ANO, MES, 'S') RETURNING_VALUES(DEBITOSC);
        EXECUTE PROCEDURE MOVIMIENTO_TERCERO_MES(ctacart, NIT, ANO, MES, 'N') RETURNING_VALUES(CREDITOSC);
        SALDOC = INICIALC + DEBITOSC - CREDITOSC;
        diferencia = SALDO - SALDOC;
        if (DIFERENCIA <> 0) then
            BEGIN
            if (ANTERIOR <> 'S') then
                SUSPEND;
            ELSE
                BEGIN
                if (DIFERENCIA <> (INICIAL - INICIALC)) then
                    SUSPEND;
                END
            END
        END
    END
SUSPEND;
end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER PROCEDURE IMPR_APLICLIE(
    ID INTEGER)
RETURNS (
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    CONCEPTO VARCHAR(60),
    NIT VARCHAR(20),
    NOMBRE VARCHAR(60),
    DIR VARCHAR(60),
    CIU VARCHAR(40),
    TEL VARCHAR(40),
    CONTACTO VARCHAR(60),
    FAX VARCHAR(25),
    CEL VARCHAR(25),
    EMAIL VARCHAR(100),
    ITEM INTEGER,
    TIPODOC VARCHAR(8),
    PREFDOC VARCHAR(4),
    NUMDOC VARCHAR(6),
    ABONO NUMERIC(18,2),
    RTFTEMONTO NUMERIC(18,2),
    RTIVAMONTO NUMERIC(18,2),
    RTICAMONTO NUMERIC(18,2),
    SALDODOC NUMERIC(18,2),
    ANTERDOC NUMERIC(18,2),
    OBS BLOB SUB_TYPE 1 SEGMENT SIZE 80,
    CLIE_COD VARCHAR(15),
    COBR_COD INTEGER,
    COBR_NOM VARCHAR(60))
AS
declare variable TIPO INTEGER;
declare variable IDDOC INTEGER;
BEGIN
  FOR SELECT PREF_PRE, APCL_NUMERO, APCL_FECHA, APCL_CONCEPTO, P.TERC_NIT, TERC_NOM, TERC_DIR, TERC_CIU, TERC_TEL, TERC_CONTACTO, TERC_FAX, TERC_CEL, TERC_EMAIL,
    ACDE_ITEM, ACDE_TIPODOC, ACDE_IDDOC, TIDO_NOMCORTO, ACDE_PREFIJO, ACDE_NUMERO, ACDE_APLICADO,
    ACDE_RTFTE, ACDE_RTIVA, ACDE_RTICA, APCL_OBS, CLIE_COD, P.COBR_COD, COBR_NOM
    FROM APLICACION_CLIENTE P, APLICACION_CLIENTE_DETALLE PD, TERCEROS T, CLIENTES C, TIPO_DOCUMENTO TD, COBRADORES CO
    WHERE P.TERC_NIT = T.TERC_NIT AND T.TERC_NIT = C.TERC_NIT AND P.APCL_ID = PD.APCL_ID AND P.APCL_ID = :ID AND ACDE_TIPODOC = TD.TIDO_COD AND P.COBR_COD = CO.COBR_COD
    ORDER BY ACDE_ITEM
    INTO :PREFIJO, :NUMERO, :FECHA, :CONCEPTO, :NIT, :NOMBRE, :DIR, :CIU, :TEL, :CONTACTO, :FAX, :CEL, :EMAIL, :ITEM, :TIPO, :IDDOC, :TIPODOC, :PREFDOC, :NUMDOC, :ABONO, :RTFTEMONTO, :RTIVAMONTO, :RTICAMONTO, :OBS, :CLIE_COD, :COBR_COD, :COBR_NOM
    DO
        begin
        EXECUTE PROCEDURE SALDO_DOC_CARTERA(:TIPO, :IDDOC, :FECHA, 0) returning_values (:SALDODOC);
        if (SALDODOC IS NULL) then
            SALDODOC = 0;
        ANTERDOC = SALDODOC + rtftemonto + rtivamonto + rticamonto + abono;
        if (anterdoc IS NULL) then
            ANTERDOC = 0;
        SUSPEND;
        end
SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER PROCEDURE IMPR_APLIPROV(
    ID INTEGER)
RETURNS (
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    CONCEPTO VARCHAR(60),
    NIT VARCHAR(20),
    NOMBRE VARCHAR(60),
    DIR VARCHAR(60),
    CIU VARCHAR(40),
    TEL VARCHAR(40),
    CONTACTO VARCHAR(60),
    FAX VARCHAR(25),
    CEL VARCHAR(25),
    EMAIL VARCHAR(100),
    ITEM INTEGER,
    TIPODOC VARCHAR(8),
    PREFDOC VARCHAR(4),
    NUMDOC VARCHAR(6),
    ABONO NUMERIC(18,2),
    RTFTEMONTO NUMERIC(18,2),
    RTIVAMONTO NUMERIC(18,2),
    RTICAMONTO NUMERIC(18,2),
    SALDODOC NUMERIC(18,2),
    ANTERDOC NUMERIC(18,2),
    OBS BLOB SUB_TYPE 1 SEGMENT SIZE 80,
    PROV_COD VARCHAR(15),
    PROV_CARTERA VARCHAR(60),
    PROV_CODIGOINT VARCHAR(15))
AS
declare variable TIPO INTEGER;
declare variable IDDOC INTEGER;
BEGIN
  FOR SELECT PREF_PRE, APPR_NUMERO, APPR_FECHA, APPR_CONC, P.TERC_NIT, TERC_NOM, TERC_DIR, TERC_CIU, TERC_TEL, TERC_CONTACTO, TERC_FAX, TERC_CEL, TERC_EMAIL,
    APPD_ITEM, APPD_TIPODOC, APPD_IDDOC, TIDO_NOMCORTO, APPD_PREFIJO, APPD_NUMERO, APPD_APLICADO,
    APPD_RTFTE, APPD_RTIVA, APPD_RTICA, APPR_OBS, PROV_COD, PROV_CARTERA, PROV_CODIGOINT
    FROM APLICACION_PROVEDOR P, APLICACION_PROVEEDOR_DETALLE PD, TERCEROS T, PROVEEDORES PR, TIPO_DOCUMENTO TD
    WHERE P.TERC_NIT = T.TERC_NIT AND T.TERC_NIT = PR.TERC_NIT AND P.APPR_ID = PD.APPR_ID AND P.APPR_ID = :ID AND APPD_TIPODOC = TD.TIDO_COD
    ORDER BY APPD_ITEM
    INTO :PREFIJO, :NUMERO, :FECHA, :CONCEPTO, :NIT, :NOMBRE, :DIR, :CIU, :TEL, :CONTACTO, :FAX, :CEL, :EMAIL, :ITEM, :TIPO, :IDDOC, :TIPODOC, :PREFDOC, :NUMDOC, :ABONO, :RTFTEMONTO, :RTIVAMONTO, :RTICAMONTO, :OBS, :PROV_COD, :PROV_CARTERA, :PROV_CODIGOINT
    DO
        begin
        EXECUTE PROCEDURE saldo_doc_cxpagar(:TIPO, :IDDOC, :FECHA) returning_values (:SALDODOC);
        if (saldodoc IS NULL) then
            SALDODOC = 0;
        ANTERDOC = SALDODOC + rtftemonto + rtivamonto + rticamonto + abono;
        if (anterdoc IS NULL) then
            ANTERDOC = 0;
        SUSPEND;
        end
SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER PROCEDURE IMPR_RECICAJA(
    ID INTEGER)
RETURNS (
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    NOMCAJA VARCHAR(60),
    CODCOBR INTEGER,
    NOMCOBR VARCHAR(60),
    NIT VARCHAR(20),
    NOMBRE VARCHAR(60),
    DIR VARCHAR(60),
    CIU VARCHAR(40),
    TEL VARCHAR(40),
    CONCEPTO VARCHAR(60),
    MONTO NUMERIC(18,2),
    RTFTE NUMERIC(18,2),
    RTIVA NUMERIC(18,2),
    RTICA NUMERIC(18,2),
    DSCTO NUMERIC(18,2),
    OBS BLOB SUB_TYPE 1 SEGMENT SIZE 80,
    ITEMDOC INTEGER,
    TIPODOC VARCHAR(8),
    PREFDOC VARCHAR(4),
    NUMDOC VARCHAR(6),
    SUCURSAL VARCHAR(10),
    ABONODOC NUMERIC(18,2),
    RTFTEDOC NUMERIC(18,2),
    RTIVADOC NUMERIC(18,2),
    RTICADOC NUMERIC(18,2),
    DSCTODOC NUMERIC(18,2),
    SALDODOC NUMERIC(18,2),
    ANTERDOC NUMERIC(18,2))
AS
declare variable NUMROWS INTEGER;
declare variable TIPO integer;
declare variable IDDOC INTEGER;
BEGIN
  SELECT PREF_PRE, RECA_NUMERO, RECA_FECHA, CAJA_NOMBRE, RECA_CONC, R.COBR_COD,
        R.TERC_NIT, RECA_NOMTERC, TERC_DIR, TERC_CIU, TERC_TEL,
        RECA_MONTO, RECA_RTFTEMONTO, RECA_RTIVAMONTO, RECA_RTICAMONTO, RECA_DTOF,
        RECA_OBS
  FROM RECIBOS_CAJA R, TERCEROS T, CAJAS C
  WHERE R.TERC_NIT = T.TERC_NIT AND R.CAJA_ID = C.CAJA_ID AND
        R.RECA_ID = :ID
  INTO :PREFIJO, :NUMERO, :FECHA, :NOMCAJA, :CONCEPTO, :CODCOBR,
        :NIT, :NOMBRE, :DIR, :CIU, :TEL,
        :MONTO, :RTFTE, :RTIVA, :RTICA, :DSCTO,
        :OBS;
  SELECT COBR_NOM FROM COBRADORES WHERE COBR_COD = :CODCOBR INTO :NOMCOBR;
  SELECT COUNT(RCDE_ITEM) FROM RECIBOS_CAJA_DETALLE
    WHERE RECA_ID = :ID INTO :NUMROWS;
  if (NUMROWS > 0) then
    FOR SELECT RCDE_ITEM, RCDE_TIPODOC, RCDE_IDDOC, TIDO_NOMCORTO, RCDE_PREFIJO, RCDE_NUMERO,
        RCDE_ABONO, RCDE_RTFTE, RCDE_RTIVA, RCDE_RTICA, RCDE_DTOF, RCDE_SUCURSAL
        FROM RECIBOS_CAJA_DETALLE D, TIPO_DOCUMENTO TD
        WHERE D.RECA_ID = :ID AND TD.TIDO_COD = D.RCDE_TIPODOC
        ORDER BY RCDE_ITEM
        INTO :ITEMDOC, :TIPO, :IDDOC, :TIPODOC, :PREFDOC, :NUMDOC, :ABONODOC, :RTFTEDOC, :RTIVADOC, :RTICADOC, :DSCTODOC, :sucursal
        DO
            BEGIN
            EXECUTE PROCEDURE SALDO_DOC_CARTERA(:TIPO, :IDDOC, :FECHA, 0) returning_values (:SALDODOC);
            ANTERDOC = SALDODOC + RTFTEDOC + RTIVADOC + RTICADOC + ABONODOC + DSCTODOC;
            SUSPEND;
            END
  ELSE
    SUSPEND;
SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER PROCEDURE IMPR_RECIPROV(
    ID INTEGER)
RETURNS (
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    NOMCAJA VARCHAR(60),
    CODCOBR INTEGER,
    NOMCOBR VARCHAR(60),
    NIT VARCHAR(20),
    NOMBRE VARCHAR(60),
    DIR VARCHAR(60),
    CIU VARCHAR(40),
    TEL VARCHAR(40),
    CONCEPTO VARCHAR(60),
    MONTO NUMERIC(18,2),
    RTFTE NUMERIC(18,2),
    RTIVA NUMERIC(18,2),
    RTICA NUMERIC(18,2),
    DSCTO NUMERIC(18,2),
    OBS BLOB SUB_TYPE 1 SEGMENT SIZE 80,
    PREPAGC VARCHAR(4),
    NUMPAGC VARCHAR(6),
    ITEMDOC INTEGER,
    TIPODOC VARCHAR(8),
    PREFDOC VARCHAR(4),
    NUMDOC VARCHAR(6),
    ABONODOC NUMERIC(18,2),
    RTFTEDOC NUMERIC(18,2),
    RTIVADOC NUMERIC(18,2),
    RTICADOC NUMERIC(18,2),
    DSCTODOC NUMERIC(18,2),
    SALDODOC NUMERIC(18,2),
    ANTERDOC NUMERIC(18,2))
AS
declare variable NUMROWS INTEGER;
declare variable TIPO integer;
declare variable IDDOC INTEGER;
BEGIN
  SELECT PREF_PRE, RCPR_NUMERO, RCPR_FECHA, CAJA_NOMBRE, RCPR_CONC, R.VEND_COD,
        R.TERC_NIT, RCPR_NOMTERC, TERC_DIR, TERC_CIU, TERC_TEL,
        RCPR_MONTO, RCPR_RTFTE, RCPR_RTIVA, RCPR_RTICA, RCPR_DTOF,
        RCPR_OBS
  FROM RECIBO_PROVISIONAL R, TERCEROS T, CAJAS C
  WHERE R.TERC_NIT = T.TERC_NIT AND R.CAJA_ID = C.CAJA_ID AND
        R.RCPR_ID = :ID
  INTO :PREFIJO, :NUMERO, :FECHA, :NOMCAJA, :CONCEPTO, :CODCOBR,
        :NIT, :NOMBRE, :DIR, :CIU, :TEL,
        :MONTO, :RTFTE, :RTIVA, :RTICA, :DSCTO,
        :OBS;
  SELECT COBR_NOM FROM COBRADORES WHERE COBR_COD = :CODCOBR INTO :NOMCOBR;
  SELECT COUNT(RPDE_ITEM) FROM RECIBO_PROVISIONAL_DETALLE
    WHERE RCPR_ID = :ID INTO :NUMROWS;
  if (NUMROWS > 0) then
    FOR SELECT RPDE_ITEM, RPDE_TIPODOC, RPDE_IDDOC, TIDO_NOMCORTO, RPDE_PREFDOC, RPDE_NUMDOC,
        RPDE_ABONO, RPDE_RTFTE, RPDE_RTIVA, RPDE_RTICA, RPDE_DTOF
        FROM RECIBO_PROVISIONAL_DETALLE D, TIPO_DOCUMENTO TD
        WHERE D.RCPR_ID = :ID AND TD.TIDO_COD = D.RPDE_TIPODOC
        ORDER BY RPDE_ITEM
        INTO :ITEMDOC, :TIPO, :IDDOC, :TIPODOC, :PREFDOC, :NUMDOC, :ABONODOC, :RTFTEDOC, :RTIVADOC, :RTICADOC, :DSCTODOC
        DO
            BEGIN
            EXECUTE PROCEDURE SALDO_DOC_CARTERA(:TIPO, :ID, :FECHA, 0) returning_values (:SALDODOC);
            ANTERDOC = SALDODOC + RTFTEDOC + RTIVADOC + RTICADOC + ABONODOC + DSCTODOC;
            SUSPEND;
            END
  ELSE
    SUSPEND;
SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER PROCEDURE MOVIMIENTO_CARTERA_MES(
    FECINI DATE,
    FECFIN DATE,
    SUBEMPRESA INTEGER,
    CONTADO CHAR(1),
    MONEDA INTEGER)
RETURNS (
    NIT VARCHAR(20),
    NOMBRE VARCHAR(60),
    CONTACTO VARCHAR(60),
    DIASMAX INTEGER,
    TELEFONO VARCHAR(40),
    INICIAL NUMERIC(18,2),
    DEBITOS NUMERIC(18,2),
    CREDITOS NUMERIC(18,2),
    ABONOS NUMERIC(18,2),
    FINAL NUMERIC(18,2))
AS
declare variable RETES CHAR(2);
declare variable TIPODOC INTEGER;
declare variable IDDOC INTEGER;
declare variable SALDO NUMERIC(18,2);
declare variable NUMROWS INTEGER;
declare variable DIASF INTEGER;
declare variable DIAS INTEGER;
DECLARE VARIABLE FOV CHAR(11);
BEGIN
EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'ANALISIS DE CARTERA CON FECHA FACTURA O VENCIMIENTO') RETURNING_VALUES (FOV);
for select TERC_NIT, TERC_NOM, TERC_CONTACTO, TERC_TEL from TERCEROS WHERE TERC_CLIE = 'S' into :NIT, :NOMBRE, :CONTACTO, :TELEFONO
  DO
    BEGIN
    diasmax = 0;
    SELECT COUNT(*) FROM AUTORIZACIONES WHERE AUTO_NITCONTADO = :NIT INTO :numrows;
    IF ((CONTADO = 'S') or (numrows = 0)) THEN
        BEGIN
        FECINI = FECINI - 1;
        INICIAL = 0;
        FOR SELECT MVCL_TIPOREF, MVCL_IDREF, (:FECFIN-MVCL_FECHA), (:FECFIN-MVCL_VENCE) FROM MOVIMIENTO_CLIENTES
            WHERE TERC_NIT = :NIT AND MVCL_FECHA <= :FECINI AND
            MVCL_ABONO = 'N' AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA)) AND
            ((:moneda = 0) or (MVCL_TRM <> 1))
            INTO :TIPODOC, :IDDOC, :DIASF, DIAS
            DO
            BEGIN
            EXECUTE PROCEDURE saldo_doc_cartera(TIPODOC, IDDOC, FECINI, MONEDA) returning_values (SALDO);
            if (SALDO <> 0) then
                BEGIN
                INICIAL = INICIAL + SALDO;
                if (FOV = 'FECHA') then
                    BEGIN
                    if ((SALDO > 0) AND (DIASMAX < DIASF)) then
                        DIASMAX = DIASF;
                    END
                ELSE
                    BEGIN
                    if ((SALDO > 0) AND (DIASMAX < DIAS)) then
                        DIASMAX = DIAS;
                    END
                END
            END
        EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'DESCONTAR RETENCIONES POR CAUSACION') returning_values(:RETES);
        FECINI = FECINI + 1;
        if (RETES = 'SI') then
            BEGIN
            if (MONEDA = 0) then
                BEGIN
                SELECT SUM(MVCL_MONTO-MVCL_RTEFTE-MVCL_RTEIVA-MVCL_RTEICA), MAX(:FECFIN-MVCL_FECHA), MAX(:FECFIN-MVCL_VENCE) FROM movimiento_clientes
                    WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND MVCL_FECHA < :FECFIN
                    AND MVCL_DEBITO = 'S' AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA))
                    INTO :DEBITOS, :diasf, :dias;
                SELECT SUM(MVCL_MONTO-MVCL_RTEFTE-MVCL_RTEIVA-MVCL_RTEICA) FROM movimiento_clientes
                    WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND MVCL_FECHA < :FECFIN
                    AND MVCL_DEBITO = 'N' AND MVCL_ABONO = 'N' and MVCL_TIPOREF <> 45 AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA))
                    INTO :CREDITOS;
                SELECT SUM(MVCL_MONTO) FROM movimiento_clientes
                    WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND MVCL_FECHA < :FECFIN
                    AND MVCL_ABONO = 'S' AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA))
                    INTO :ABONOS;
                END
            ELSE
                BEGIN
                SELECT SUM((MVCL_MONTO-MVCL_RTEFTE-MVCL_RTEIVA-MVCL_RTEICA)/MVCL_TRM), MAX(:FECFIN-MVCL_FECHA), MAX(:FECFIN-MVCL_VENCE) FROM movimiento_clientes
                    WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND MVCL_FECHA < :FECFIN
                    AND MVCL_DEBITO = 'S' AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA))
                    INTO :DEBITOS, :diasf, :dias;
                SELECT SUM((MVCL_MONTO-MVCL_RTEFTE-MVCL_RTEIVA-MVCL_RTEICA)/MVCL_TRM) FROM movimiento_clientes
                    WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND MVCL_FECHA < :FECFIN
                    AND MVCL_DEBITO = 'N' AND MVCL_ABONO = 'N' and MVCL_TIPOREF <> 45 AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA))
                    INTO :CREDITOS;
                SELECT SUM(MVCL_MONTO/MVCL_TRM) FROM movimiento_clientes
                    WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND MVCL_FECHA < :FECFIN
                    AND MVCL_ABONO = 'S' AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA))
                    INTO :ABONOS;
                END
            END
        ELSE
            BEGIN
            if (MONEDA = 0) then
                BEGIN
                SELECT SUM(MVCL_MONTO), MAX(:FECFIN-MVCL_FECHA), MAX(:FECFIN-MVCL_VENCE) FROM movimiento_clientes
                    WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND MVCL_FECHA < :FECFIN
                    AND MVCL_DEBITO = 'S' AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA))
                    INTO :DEBITOS, :diasf, :dias;
                SELECT SUM(MVCL_MONTO) FROM movimiento_clientes
                    WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND MVCL_FECHA < :FECFIN
                    AND MVCL_DEBITO = 'N' AND MVCL_ABONO = 'N' and MVCL_TIPOREF <> 45 AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA))
                    INTO :CREDITOS;
                SELECT SUM(MVCL_MONTO+MVCL_RTEFTE+MVCL_RTEIVA+MVCL_RTEICA) FROM movimiento_clientes
                    WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND MVCL_FECHA < :FECFIN
                    AND MVCL_ABONO = 'S' AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA))
                    INTO :ABONOS;
                END
            ELSE
                BEGIN
                SELECT SUM(MVCL_MONTO/MVCL_TRM), MAX(:FECFIN-MVCL_FECHA), MAX(:FECFIN-MVCL_VENCE) FROM movimiento_clientes
                    WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND MVCL_FECHA < :FECFIN
                    AND MVCL_DEBITO = 'S' AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA))
                    INTO :DEBITOS, :diasf, :dias;
                SELECT SUM(MVCL_MONTO/MVCL_TRM) FROM movimiento_clientes
                    WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND MVCL_FECHA < :FECFIN
                    AND MVCL_DEBITO = 'N' AND MVCL_ABONO = 'N' and MVCL_TIPOREF <> 45 AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA))
                    INTO :CREDITOS;
                SELECT SUM((MVCL_MONTO+MVCL_RTEFTE+MVCL_RTEIVA+MVCL_RTEICA)/MVCL_TRM) FROM movimiento_clientes
                    WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND MVCL_FECHA < :FECFIN
                    AND MVCL_ABONO = 'S' AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA))
                    INTO :ABONOS;
                END
            END
        if (FOV = 'FECHA') then
            BEGIN
            if ((DIASMAX < DIASF) AND (DIASF IS NOT NULL)) then
                DIASMAX = DIASF;
            END
        ELSE
            BEGIN
            if ((DIASMAX < DIAS) AND (DIAS IS NOT NULL)) then
                DIASMAX = DIAS;
            END
        if (DEBITOS IS NULL) then
            DEBITOS = 0;
        if (CREDITOS IS NULL) then
            CREDITOS = 0;
        if (ABONOS IS NULL) then
            ABONOS = 0;
        FINAL = INICIAL + DEBITOS - CREDITOS - ABONOS;
        SUSPEND;
        END
    END
SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER PROCEDURE RECUPERACION_CARTERA(
    DESDE VARCHAR(20),
    HASTA VARCHAR(20),
    GRPINI VARCHAR(5),
    GRPFIN VARCHAR(5),
    FECHA DATE,
    ORDEN CHAR(1),
    AGRUPA CHAR(1),
    SUCURSAL INTEGER,
    MONEDA INTEGER)
RETURNS (
    NIT VARCHAR(20),
    NOMBRE VARCHAR(60),
    TELEFONO VARCHAR(40),
    CIUDAD VARCHAR(60),
    CODZONA VARCHAR(2),
    NOMZONA VARCHAR(60),
    CODCOBR INTEGER,
    NOMCOBR VARCHAR(60),
    DV CHAR(1),
    CODCIUD CHAR(5),
    NOMCIUD VARCHAR(60),
    INICIAL NUMERIC(18,2),
    CARGOS1 NUMERIC(18,2),
    ABONOS1 NUMERIC(18,2),
    CARGOS2 NUMERIC(18,2),
    ABONOS2 NUMERIC(18,2),
    CARGOS3 NUMERIC(18,2),
    ABONOS3 NUMERIC(18,2),
    FINAL NUMERIC(18,2))
AS
declare variable NITINI VARCHAR(20);
declare variable NITFIN VARCHAR(20);
declare variable NOMINI VARCHAR(60);
declare variable NOMFIN VARCHAR(60);
declare variable OK CHAR(1);
declare variable FECINI DATE;
declare variable FECFIN DATE;
declare variable DEBITO NUMERIC(18,2);
declare variable CREDITO NUMERIC(18,2);
declare variable TIPODOC INTEGER;
declare variable IDDOC INTEGER;
declare variable SALDO NUMERIC(18,2);
declare variable RTFTE NUMERIC(18,2);
declare variable RTIVA NUMERIC(18,2);
declare variable RTICA NUMERIC(18,2);
declare variable RETES CHAR(2);
BEGIN
EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'DESCONTAR RETENCIONES POR CAUSACION') returning_values (:RETES);
if (ORDEN = 'C') then
    BEGIN
    NITINI = DESDE;
    NITFIN = HASTA;
    NOMINI = '';
    NOMFIN = 'zz';
    END
ELSE
    BEGIN
    NOMINI = DESDE;
    NOMFIN = HASTA;
    NITINI = '';
    NITFIN = 'zz';
    END
  /* Ubique el NIT */
  FOR select T.TERC_NIT, TERC_NOM, TERC_DV, TERC_TEL, TERC_CIU, S.COBR_COD, C.ZONA_COD, T.CIUD_COD
    from terceros T, CLIENTES C, CLIENTE_SUCURSALES S
    where S.TERC_NIT = T.TERC_NIT AND C.TERC_NIT = T.TERC_NIT AND TERC_CLIE = 'S' AND T.TERC_NIT >= :NITINI AND T.TERC_NIT <= :NITFIN AND
        TERC_NOM >= :NOMINI AND TERC_NOM <= :NOMFIN
    INTO :NIT, :NOMBRE, :DV, :TELEFONO, :CIUDAD, :CODCOBR, :CODZONA, :CODCIUD
    DO  
    BEGIN
    FECINI = FECHA - 90;
    OK = 'N';
    if (AGRUPA = 'Z') then
        BEGIN
        if (GRPINI = '') then
            BEGIN
            if ((CODZONA IS NULL) or (CODZONA >= :GRPINI AND CODZONA <= :GRPFIN)) then
                OK = 'S';
            END
        ELSE
            if (CODZONA >= :GRPINI AND CODZONA <= :GRPFIN) then
                OK = 'S';
        END
    if (AGRUPA = 'I') then
        BEGIN
        if (GRPINI = '') then
            BEGIN
            if ((CODCIUD IS NULL) or (CODCIUD >= :GRPINI AND CODCIUD <= :GRPFIN)) then
                OK = 'S';
            END
        ELSE
            if (CODCIUD >= :GRPINI AND CODCIUD <= :GRPFIN) then
                OK = 'S';
        END
    if (AGRUPA = 'N') then
        OK = 'S';
        
    if (OK = 'S') then
        BEGIN
        SELECT COBR_NOM FROM COBRADORES CB WHERE COBR_COD = :CODCOBR INTO :NOMCOBR;
        SELECT ZONA_NOM FROM ZONAS WHERE ZONA_COD = :CODZONA INTO :NOMZONA;
        SELECT CIUD_NOM FROM CIUDADES WHERE CIUD_COD = :CODCIUD INTO :NOMCIUD;
        CARGOS1 = 0;
        ABONOS1 = 0;
        CARGOS2 = 0;
        ABONOS2 = 0;
        CARGOS3 = 0;
        ABONOS3 = 0;
        INICIAL = 0;
        FOR SELECT MVCL_TIPOREF, MVCL_IDREF FROM MOVIMIENTO_CLIENTES
            WHERE TERC_NIT = :NIT AND MVCL_FECHA <= :FECINI AND ((:MONEDA = 0) or (MVCL_TRM <> 1)) AND
            MVCL_ABONO = 'N' AND ((:SUCURSAL = 0) or (SUCU_ID = :SUCURSAL))
            INTO :TIPODOC, :IDDOC
            DO
            BEGIN
            EXECUTE PROCEDURE saldo_doc_cartera(TIPODOC, IDDOC, FECINI, MONEDA) returning_values (SALDO);
            INICIAL = INICIAL + SALDO;
            END
        FECFIN = FECINI + 30;
        if (MONEDA = 0) then
            SELECT SUM(MVCL_MONTO), SUM(MVCL_RTEFTE), SUM(MVCL_RTEIVA), SUM(MVCL_RTEICA) FROM movimiento_clientes WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND
                MVCL_FECHA < :FECFIN AND MVCL_DEBITO = 'S' AND MVCL_ABONO = 'N' AND ((:SUCURSAL = 0) or (SUCU_ID = :SUCURSAL))
                INTO :DEBITO, :RTFTE, :RTIVA, :RTICA;
        ELSE
            SELECT SUM(MVCL_MONTO/MVCL_TRM), SUM(MVCL_RTEFTE/MVCL_TRM), SUM(MVCL_RTEIVA/MVCL_TRM), SUM(MVCL_RTEICA/MVCL_TRM)
                FROM movimiento_clientes WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND ((:MONEDA = 0) or (MVCL_TRM <> 1)) AND
                MVCL_FECHA < :FECFIN AND MVCL_DEBITO = 'S' AND MVCL_ABONO = 'N' AND ((:SUCURSAL = 0) or (SUCU_ID = :SUCURSAL))
                INTO :DEBITO, :RTFTE, :RTIVA, :RTICA;
        if (DEBITO IS NULL) then
            DEBITO = 0;
        if (rtfte IS NULL) then
            rtfte = 0;
        if (rtiva IS NULL) then
            rtiva = 0;
        if (rtica IS NULL) then
            rtica = 0;
        IF (RETES = 'SI') then
            DEBITO = DEBITO - RTFTE - RTIVA - RTICA;

        if (MONEDA = 0) then
            SELECT SUM(MVCL_MONTO), SUM(MVCL_RTEFTE), SUM(MVCL_RTEIVA), SUM(MVCL_RTEICA)  FROM movimiento_clientes WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI
                AND MVCL_FECHA < :FECFIN AND MVCL_DEBITO = 'N'  AND MVCL_ABONO = 'N' AND ((:SUCURSAL = 0) or (SUCU_ID = :SUCURSAL))
                INTO :CREDITO, :RTFTE, :RTIVA, :RTICA;
        ELSE
            SELECT SUM(MVCL_MONTO/MVCL_TRM), SUM(MVCL_RTEFTE/MVCL_TRM), SUM(MVCL_RTEIVA/MVCL_TRM), SUM(MVCL_RTEICA/MVCL_TRM)
                FROM movimiento_clientes WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND ((:MONEDA = 0) or (MVCL_TRM <> 1))
                AND MVCL_FECHA < :FECFIN AND MVCL_DEBITO = 'N'  AND MVCL_ABONO = 'N' AND ((:SUCURSAL = 0) or (SUCU_ID = :SUCURSAL))
                INTO :CREDITO, :RTFTE, :RTIVA, :RTICA;
        if (CREDITO IS NULL) then
            CREDITO = 0;
        if (rtfte IS NULL) then
            rtfte = 0;
        if (rtiva IS NULL) then
            rtiva = 0;
        if (rtica IS NULL) then
            rtica = 0;
        IF (RETES = 'SI') then
            CREDITO = CREDITO - RTFTE - RTIVA - RTICA;
        CARGOS3 = DEBITO - CREDITO;
        if (MONEDA = 0) then
            SELECT SUM(MVCL_MONTO), SUM(MVCL_RTEFTE), SUM(MVCL_RTEIVA), SUM(MVCL_RTEICA)  FROM movimiento_clientes WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI
                AND MVCL_FECHA < :FECFIN AND MVCL_DEBITO = 'N' AND MVCL_ABONO = 'S' AND ((:SUCURSAL = 0) or (SUCU_ID = :SUCURSAL))
                INTO :CREDITO, :RTFTE, :RTIVA, :RTICA;
        ELSE
            SELECT SUM(MVCL_MONTO/MVCL_TRM), SUM(MVCL_RTEFTE/MVCL_TRM), SUM(MVCL_RTEIVA/MVCL_TRM), SUM(MVCL_RTEICA/MVCL_TRM)
                FROM movimiento_clientes WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND ((:MONEDA = 0) or (MVCL_TRM <> 1))
                AND MVCL_FECHA < :FECFIN AND MVCL_DEBITO = 'N' AND MVCL_ABONO = 'S' AND ((:SUCURSAL = 0) or (SUCU_ID = :SUCURSAL))
                INTO :CREDITO, :RTFTE, :RTIVA, :RTICA;
        if (CREDITO IS NULL) then
            CREDITO = 0;
        if (rtfte IS NULL) then
            rtfte = 0;
        if (rtiva IS NULL) then
            rtiva = 0;
        if (rtica IS NULL) then
            rtica = 0;
        IF (RETES = 'NO') then
            CREDITO = CREDITO + RTFTE + RTIVA + RTICA;
        ABONOS3 = CREDITO;
        FECINI = FECFIN;
        FECFIN = FECINI + 30;
        if (MONEDA = 0) then
            SELECT SUM(MVCL_MONTO), SUM(MVCL_RTEFTE), SUM(MVCL_RTEIVA), SUM(MVCL_RTEICA)  FROM movimiento_clientes WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI
                AND MVCL_FECHA < :FECFIN AND MVCL_DEBITO = 'S' AND MVCL_ABONO = 'N' AND ((:SUCURSAL = 0) or (SUCU_ID = :SUCURSAL))
                INTO :DEBITO, :RTFTE, :RTIVA, :RTICA;
        ELSE
            SELECT SUM(MVCL_MONTO/MVCL_TRM), SUM(MVCL_RTEFTE/MVCL_TRM), SUM(MVCL_RTEIVA/MVCL_TRM), SUM(MVCL_RTEICA/MVCL_TRM)
                FROM movimiento_clientes WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND ((:MONEDA = 0) or (MVCL_TRM <> 1))
                AND MVCL_FECHA < :FECFIN AND MVCL_DEBITO = 'S' AND MVCL_ABONO = 'N' AND ((:SUCURSAL = 0) or (SUCU_ID = :SUCURSAL))
                INTO :DEBITO, :RTFTE, :RTIVA, :RTICA;
        if (DEBITO IS NULL) then
            DEBITO = 0;
        if (rtfte IS NULL) then
            rtfte = 0;
        if (rtiva IS NULL) then
            rtiva = 0;
        if (rtica IS NULL) then
            rtica = 0;
        IF (RETES = 'SI') then
            DEBITO = DEBITO - RTFTE - RTIVA - RTICA;
        if (MONEDA = 0) then
            SELECT SUM(MVCL_MONTO), SUM(MVCL_RTEFTE), SUM(MVCL_RTEIVA), SUM(MVCL_RTEICA)  FROM movimiento_clientes WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI
                AND MVCL_FECHA < :FECFIN AND MVCL_DEBITO = 'N'  AND MVCL_ABONO = 'N' AND ((:SUCURSAL = 0) or (SUCU_ID = :SUCURSAL))
                INTO :CREDITO, :RTFTE, :RTIVA, :RTICA;
        ELSE
            SELECT SUM(MVCL_MONTO/MVCL_TRM), SUM(MVCL_RTEFTE/MVCL_TRM), SUM(MVCL_RTEIVA/MVCL_TRM), SUM(MVCL_RTEICA/MVCL_TRM)
                FROM movimiento_clientes WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND ((:MONEDA = 0) or (MVCL_TRM <> 1))
                AND MVCL_FECHA < :FECFIN AND MVCL_DEBITO = 'N'  AND MVCL_ABONO = 'N' AND ((:SUCURSAL = 0) or (SUCU_ID = :SUCURSAL))
                INTO :CREDITO, :RTFTE, :RTIVA, :RTICA;
        if (CREDITO IS NULL) then
            CREDITO = 0;
        if (rtfte IS NULL) then
            rtfte = 0;
        if (rtiva IS NULL) then
            rtiva = 0;
        if (rtica IS NULL) then
            rtica = 0;
        IF (RETES = 'SI') then
            CREDITO = CREDITO - RTFTE - RTIVA - RTICA;
        CARGOS2 = DEBITO - CREDITO;
        if (MONEDA = 0) then
            SELECT SUM(MVCL_MONTO), SUM(MVCL_RTEFTE), SUM(MVCL_RTEIVA), SUM(MVCL_RTEICA)  FROM movimiento_clientes WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI
                AND MVCL_FECHA < :FECFIN AND MVCL_DEBITO = 'N'  AND MVCL_ABONO = 'S' AND ((:SUCURSAL = 0) or (SUCU_ID = :SUCURSAL))
                INTO :CREDITO, :RTFTE, :RTIVA, :RTICA;
        ELSE
            SELECT SUM(MVCL_MONTO/MVCL_TRM), SUM(MVCL_RTEFTE/MVCL_TRM), SUM(MVCL_RTEIVA/MVCL_TRM), SUM(MVCL_RTEICA/MVCL_TRM)
                FROM movimiento_clientes WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND ((:MONEDA = 0) or (MVCL_TRM <> 1))
                AND MVCL_FECHA < :FECFIN AND MVCL_DEBITO = 'N'  AND MVCL_ABONO = 'S' AND ((:SUCURSAL = 0) or (SUCU_ID = :SUCURSAL))
                INTO :CREDITO, :RTFTE, :RTIVA, :RTICA;
        if (CREDITO IS NULL) then
            CREDITO = 0;
        if (rtfte IS NULL) then
            rtfte = 0;
        if (rtiva IS NULL) then
            rtiva = 0;
        if (rtica IS NULL) then
            rtica = 0;
        IF (RETES = 'NO') then
            CREDITO = CREDITO + RTFTE + RTIVA + RTICA;
        ABONOS2 = CREDITO;
        FECINI = FECFIN;
        FECFIN = FECINI + 30;
        if (MONEDA = 0) then
            SELECT SUM(MVCL_MONTO), SUM(MVCL_RTEFTE), SUM(MVCL_RTEIVA), SUM(MVCL_RTEICA)  FROM movimiento_clientes WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI
                AND MVCL_FECHA < :FECFIN AND MVCL_DEBITO = 'S' AND MVCL_ABONO = 'N' AND ((:SUCURSAL = 0) or (SUCU_ID = :SUCURSAL))
                INTO :DEBITO, :RTFTE, :RTIVA, :RTICA;
        ELSE
            SELECT SUM(MVCL_MONTO/MVCL_TRM), SUM(MVCL_RTEFTE/MVCL_TRM), SUM(MVCL_RTEIVA/MVCL_TRM), SUM(MVCL_RTEICA/MVCL_TRM)
                FROM movimiento_clientes WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND ((:MONEDA = 0) or (MVCL_TRM <> 1))
                AND MVCL_FECHA < :FECFIN AND MVCL_DEBITO = 'S' AND MVCL_ABONO = 'N' AND ((:SUCURSAL = 0) or (SUCU_ID = :SUCURSAL))
                INTO :DEBITO, :RTFTE, :RTIVA, :RTICA;
        if (DEBITO IS NULL) then
            DEBITO = 0;
        if (rtfte IS NULL) then
            rtfte = 0;
        if (rtiva IS NULL) then
            rtiva = 0;
        if (rtica IS NULL) then
            rtica = 0;
        IF (RETES = 'SI') then
            DEBITO = DEBITO - RTFTE - RTIVA - RTICA;
        if (MONEDA = 0) then
            SELECT SUM(MVCL_MONTO), SUM(MVCL_RTEFTE), SUM(MVCL_RTEIVA), SUM(MVCL_RTEICA)  FROM movimiento_clientes WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI
                AND MVCL_FECHA < :FECFIN AND MVCL_DEBITO = 'N'  AND MVCL_ABONO = 'N' AND ((:SUCURSAL = 0) or (SUCU_ID = :SUCURSAL))
                INTO :CREDITO, :RTFTE, :RTIVA, :RTICA;
        ELSE
            SELECT SUM(MVCL_MONTO/MVCL_TRM), SUM(MVCL_RTEFTE/MVCL_TRM), SUM(MVCL_RTEIVA/MVCL_TRM), SUM(MVCL_RTEICA/MVCL_TRM)
                FROM movimiento_clientes WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND ((:MONEDA = 0) or (MVCL_TRM <> 1))
                AND MVCL_FECHA < :FECFIN AND MVCL_DEBITO = 'N'  AND MVCL_ABONO = 'N' AND ((:SUCURSAL = 0) or (SUCU_ID = :SUCURSAL))
                INTO :CREDITO, :RTFTE, :RTIVA, :RTICA;
        if (CREDITO IS NULL) then
            CREDITO = 0;
        if (rtfte IS NULL) then
            rtfte = 0;
        if (rtiva IS NULL) then
            rtiva = 0;
        if (rtica IS NULL) then
            rtica = 0;
        IF (RETES = 'SI') then
            CREDITO = CREDITO - RTFTE - RTIVA - RTICA;
        CARGOS1 = DEBITO - CREDITO;
        if (MONEDA = 0) then
            SELECT SUM(MVCL_MONTO), SUM(MVCL_RTEFTE), SUM(MVCL_RTEIVA), SUM(MVCL_RTEICA)  FROM movimiento_clientes WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI
                AND MVCL_FECHA < :FECFIN AND MVCL_DEBITO = 'N'  AND MVCL_ABONO = 'S' AND ((:SUCURSAL = 0) or (SUCU_ID = :SUCURSAL))
                INTO :CREDITO, :RTFTE, :RTIVA, :RTICA;
        ELSE
            SELECT SUM(MVCL_MONTO/MVCL_TRM), SUM(MVCL_RTEFTE/MVCL_TRM), SUM(MVCL_RTEIVA/MVCL_TRM), SUM(MVCL_RTEICA/MVCL_TRM)
                FROM movimiento_clientes WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND ((:MONEDA = 0) or (MVCL_TRM <> 1))
                AND MVCL_FECHA < :FECFIN AND MVCL_DEBITO = 'N'  AND MVCL_ABONO = 'S' AND ((:SUCURSAL = 0) or (SUCU_ID = :SUCURSAL))
                INTO :CREDITO, :RTFTE, :RTIVA, :RTICA;
        if (CREDITO IS NULL) then
            CREDITO = 0;
        if (rtfte IS NULL) then
            rtfte = 0;
        if (rtiva IS NULL) then
            rtiva = 0;
        if (rtica IS NULL) then
            rtica = 0;
        IF (RETES = 'NO') then
            CREDITO = CREDITO + RTFTE + RTIVA + RTICA;
        ABONOS1 = CREDITO;
        FINAL = INICIAL + CARGOS3 + CARGOS2 + CARGOS1 + ABONOS3 + ABONOS2 + ABONOS1;
        SUSPEND;
        END

    if (AGRUPA = 'C') then
        BEGIN
        CARGOS1 = 0;
        ABONOS1 = 0;
        CARGOS2 = 0;
        ABONOS2 = 0;
        CARGOS3 = 0;
        ABONOS3 = 0;
        INICIAL = 0;
        for select distinct cobr_cod from movimiento_clientes
            WHERE TERC_NIT = :NIT AND MVCL_FECHA <= :FECINI AND
            MVCL_ABONO = 'N' AND ((:SUCURSAL = 0) or (SUCU_ID = :SUCURSAL))
            into :codcobr
            do
            BEGIN
            OK = 'N';
            if (GRPINI = '') then
                BEGIN
                if ((CODCOBR IS NULL) or (CODCOBR >= :GRPINI AND CODCOBR <= :GRPFIN)) then
                    OK = 'S';
                END
            ELSE
                if (CODCOBR >= :GRPINI AND CODCOBR <= :GRPFIN) then
                    OK = 'S';
            if (OK = 'S') then
                begin
                SELECT COBR_NOM FROM COBRADORES WHERE COBR_COD = :codcobr INTO :nomcobr;
                FOR SELECT MVCL_TIPOREF, MVCL_IDREF FROM MOVIMIENTO_CLIENTES
                    WHERE TERC_NIT = :NIT AND MVCL_FECHA <= :FECINI AND COBR_COD = :codcobr AND
                    MVCL_ABONO = 'N' AND ((:SUCURSAL = 0) or (SUCU_ID = :SUCURSAL))
                    INTO :TIPODOC, :IDDOC
                    DO
                    BEGIN
                    EXECUTE PROCEDURE saldo_doc_cartera(TIPODOC, IDDOC, FECINI, 0) returning_values (SALDO);
                    INICIAL = INICIAL + SALDO;
                    END
                FECFIN = FECINI + 30;
                if (MONEDA = 0) then
                    SELECT SUM(MVCL_MONTO), SUM(MVCL_RTEFTE), SUM(MVCL_RTEIVA), SUM(MVCL_RTEICA) FROM movimiento_clientes WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND
                        MVCL_FECHA < :FECFIN AND MVCL_DEBITO = 'S' AND MVCL_ABONO = 'N' AND COBR_COD = :codcobr AND ((:SUCURSAL = 0) or (SUCU_ID = :SUCURSAL))
                        INTO :DEBITO, :RTFTE, :RTIVA, :RTICA;
                ELSE
                    SELECT SUM(MVCL_MONTO/MVCL_TRM), SUM(MVCL_RTEFTE/MVCL_TRM), SUM(MVCL_RTEIVA/MVCL_TRM), SUM(MVCL_RTEICA/MVCL_TRM)
                        FROM movimiento_clientes WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND ((:MONEDA = 0) or (MVCL_TRM <> 1)) AND
                        MVCL_FECHA < :FECFIN AND MVCL_DEBITO = 'S' AND MVCL_ABONO = 'N' AND COBR_COD = :codcobr AND ((:SUCURSAL = 0) or (SUCU_ID = :SUCURSAL))
                        INTO :DEBITO, :RTFTE, :RTIVA, :RTICA;
                if (DEBITO IS NULL) then
                    DEBITO = 0;
                if (rtfte IS NULL) then
                    rtfte = 0;
                if (rtiva IS NULL) then
                    rtiva = 0;
                if (rtica IS NULL) then
                    rtica = 0;
                IF (RETES = 'SI') then
                    DEBITO = DEBITO - RTFTE - RTIVA - RTICA;
                if (MONEDA = 0) then
                    SELECT SUM(MVCL_MONTO), SUM(MVCL_RTEFTE), SUM(MVCL_RTEIVA), SUM(MVCL_RTEICA) FROM movimiento_clientes WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI
                        AND MVCL_FECHA < :FECFIN AND MVCL_DEBITO = 'N'  AND MVCL_ABONO = 'N' AND COBR_COD = :codcobr AND ((:SUCURSAL = 0) or (SUCU_ID = :SUCURSAL))
                        INTO :CREDITO, :RTFTE, :RTIVA, :RTICA;
                ELSE
                    SELECT SUM(MVCL_MONTO/MVCL_TRM), SUM(MVCL_RTEFTE/MVCL_TRM), SUM(MVCL_RTEIVA/MVCL_TRM), SUM(MVCL_RTEICA/MVCL_TRM)
                        FROM movimiento_clientes WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND ((:MONEDA = 0) or (MVCL_TRM <> 1)) 
                        AND MVCL_FECHA < :FECFIN AND MVCL_DEBITO = 'N'  AND MVCL_ABONO = 'N' AND COBR_COD = :codcobr AND ((:SUCURSAL = 0) or (SUCU_ID = :SUCURSAL))
                        INTO :CREDITO, :RTFTE, :RTIVA, :RTICA;
                if (CREDITO IS NULL) then
                    CREDITO = 0;
                if (rtfte IS NULL) then
                    rtfte = 0;
                if (rtiva IS NULL) then
                    rtiva = 0;
                if (rtica IS NULL) then
                    rtica = 0;
                IF (RETES = 'SI') then
                    CREDITO = CREDITO - RTFTE - RTIVA - RTICA;
                CARGOS3 = DEBITO - CREDITO;
                if (MONEDA = 0) then
                    SELECT SUM(MVCL_MONTO), SUM(MVCL_RTEFTE), SUM(MVCL_RTEIVA), SUM(MVCL_RTEICA) FROM movimiento_clientes WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI
                        AND MVCL_FECHA < :FECFIN AND MVCL_DEBITO = 'N' AND MVCL_ABONO = 'S' AND COBR_COD = :codcobr AND ((:SUCURSAL = 0) or (SUCU_ID = :SUCURSAL))
                        INTO :CREDITO, :RTFTE, :RTIVA, :RTICA;
                ELSE
                    SELECT SUM(MVCL_MONTO/MVCL_TRM), SUM(MVCL_RTEFTE/MVCL_TRM), SUM(MVCL_RTEIVA/MVCL_TRM), SUM(MVCL_RTEICA/MVCL_TRM)
                        FROM movimiento_clientes WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND ((:MONEDA = 0) or (MVCL_TRM <> 1)) 
                        AND MVCL_FECHA < :FECFIN AND MVCL_DEBITO = 'N' AND MVCL_ABONO = 'S' AND COBR_COD = :codcobr AND ((:SUCURSAL = 0) or (SUCU_ID = :SUCURSAL))
                        INTO :CREDITO, :RTFTE, :RTIVA, :RTICA;
                if (CREDITO IS NULL) then
                    CREDITO = 0;
                if (rtfte IS NULL) then
                    rtfte = 0;
                if (rtiva IS NULL) then
                    rtiva = 0;
                if (rtica IS NULL) then
                    rtica = 0;
                IF (RETES = 'NO') then
                    CREDITO = CREDITO + RTFTE + RTIVA + RTICA;
                ABONOS3 = CREDITO;
                FECINI = FECFIN;
                FECFIN = FECINI + 30;
                if (MONEDA = 0) then
                    SELECT SUM(MVCL_MONTO), SUM(MVCL_RTEFTE), SUM(MVCL_RTEIVA), SUM(MVCL_RTEICA) FROM movimiento_clientes WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI
                        AND MVCL_FECHA < :FECFIN AND MVCL_DEBITO = 'S' AND MVCL_ABONO = 'N' AND COBR_COD = :codcobr AND ((:SUCURSAL = 0) or (SUCU_ID = :SUCURSAL))
                        INTO :DEBITO, :RTFTE, :RTIVA, :RTICA;
                ELSE
                    SELECT SUM(MVCL_MONTO/MVCL_TRM), SUM(MVCL_RTEFTE/MVCL_TRM), SUM(MVCL_RTEIVA/MVCL_TRM), SUM(MVCL_RTEICA/MVCL_TRM)
                        FROM movimiento_clientes WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND ((:MONEDA = 0) or (MVCL_TRM <> 1)) 
                        AND MVCL_FECHA < :FECFIN AND MVCL_DEBITO = 'S' AND MVCL_ABONO = 'N' AND COBR_COD = :codcobr AND ((:SUCURSAL = 0) or (SUCU_ID = :SUCURSAL))
                        INTO :DEBITO, :RTFTE, :RTIVA, :RTICA;
                if (DEBITO IS NULL) then
                    DEBITO = 0;
                if (rtfte IS NULL) then
                    rtfte = 0;
                if (rtiva IS NULL) then
                    rtiva = 0;
                if (rtica IS NULL) then
                    rtica = 0;
                IF (RETES = 'SI') then
                    DEBITO = DEBITO - RTFTE - RTIVA - RTICA;
                if (MONEDA = 0) then
                    SELECT SUM(MVCL_MONTO), SUM(MVCL_RTEFTE), SUM(MVCL_RTEIVA), SUM(MVCL_RTEICA) FROM movimiento_clientes WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI
                        AND MVCL_FECHA < :FECFIN AND MVCL_DEBITO = 'N'  AND MVCL_ABONO = 'N' AND COBR_COD = :codcobr AND ((:SUCURSAL = 0) or (SUCU_ID = :SUCURSAL))
                        INTO :CREDITO, :RTFTE, :RTIVA, :RTICA;
                ELSE
                    SELECT SUM(MVCL_MONTO/MVCL_TRM), SUM(MVCL_RTEFTE/MVCL_TRM), SUM(MVCL_RTEIVA/MVCL_TRM), SUM(MVCL_RTEICA/MVCL_TRM)
                        FROM movimiento_clientes WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND ((:MONEDA = 0) or (MVCL_TRM <> 1)) 
                        AND MVCL_FECHA < :FECFIN AND MVCL_DEBITO = 'N'  AND MVCL_ABONO = 'N' AND COBR_COD = :codcobr AND ((:SUCURSAL = 0) or (SUCU_ID = :SUCURSAL))
                        INTO :CREDITO, :RTFTE, :RTIVA, :RTICA;
                if (CREDITO IS NULL) then
                    CREDITO = 0;
                if (rtfte IS NULL) then
                    rtfte = 0;
                if (rtiva IS NULL) then
                    rtiva = 0;
                if (rtica IS NULL) then
                    rtica = 0;
                IF (RETES = 'SI') then
                    CREDITO = CREDITO - RTFTE - RTIVA - RTICA;
                CARGOS2 = DEBITO - CREDITO;
                if (MONEDA = 0) then
                    SELECT SUM(MVCL_MONTO), SUM(MVCL_RTEFTE), SUM(MVCL_RTEIVA), SUM(MVCL_RTEICA) FROM movimiento_clientes WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI
                        AND MVCL_FECHA < :FECFIN AND MVCL_DEBITO = 'N'  AND MVCL_ABONO = 'S' AND COBR_COD = :codcobr AND ((:SUCURSAL = 0) or (SUCU_ID = :SUCURSAL))
                        INTO :CREDITO, :RTFTE, :RTIVA, :RTICA;
                ELSE
                    SELECT SUM(MVCL_MONTO/MVCL_TRM), SUM(MVCL_RTEFTE/MVCL_TRM), SUM(MVCL_RTEIVA/MVCL_TRM), SUM(MVCL_RTEICA/MVCL_TRM)
                        FROM movimiento_clientes WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND ((:MONEDA = 0) or (MVCL_TRM <> 1)) 
                        AND MVCL_FECHA < :FECFIN AND MVCL_DEBITO = 'N'  AND MVCL_ABONO = 'S' AND COBR_COD = :codcobr AND ((:SUCURSAL = 0) or (SUCU_ID = :SUCURSAL))
                        INTO :CREDITO, :RTFTE, :RTIVA, :RTICA;
                if (CREDITO IS NULL) then
                    CREDITO = 0;
                if (rtfte IS NULL) then
                    rtfte = 0;
                if (rtiva IS NULL) then
                    rtiva = 0;
                if (rtica IS NULL) then
                    rtica = 0;
                IF (RETES = 'NO') then
                    CREDITO = CREDITO + RTFTE + RTIVA + RTICA;
                ABONOS2 = CREDITO;
                FECINI = FECFIN;
                FECFIN = FECINI + 30;
                if (MONEDA = 0) then
                    SELECT SUM(MVCL_MONTO), SUM(MVCL_RTEFTE), SUM(MVCL_RTEIVA), SUM(MVCL_RTEICA) FROM movimiento_clientes WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI
                        AND MVCL_FECHA < :FECFIN AND MVCL_DEBITO = 'S' AND MVCL_ABONO = 'N' AND COBR_COD = :codcobr AND ((:SUCURSAL = 0) or (SUCU_ID = :SUCURSAL))
                        INTO :DEBITO, :RTFTE, :RTIVA, :RTICA;
                ELSE
                    SELECT SUM(MVCL_MONTO/MVCL_TRM), SUM(MVCL_RTEFTE/MVCL_TRM), SUM(MVCL_RTEIVA/MVCL_TRM), SUM(MVCL_RTEICA/MVCL_TRM)
                        FROM movimiento_clientes WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND ((:MONEDA = 0) or (MVCL_TRM <> 1)) 
                        AND MVCL_FECHA < :FECFIN AND MVCL_DEBITO = 'S' AND MVCL_ABONO = 'N' AND COBR_COD = :codcobr AND ((:SUCURSAL = 0) or (SUCU_ID = :SUCURSAL))
                        INTO :DEBITO, :RTFTE, :RTIVA, :RTICA;
                if (DEBITO IS NULL) then
                    DEBITO = 0;
                if (rtfte IS NULL) then
                    rtfte = 0;
                if (rtiva IS NULL) then
                    rtiva = 0;
                if (rtica IS NULL) then
                    rtica = 0;
                IF (RETES = 'SI') then
                    DEBITO = DEBITO - RTFTE - RTIVA - RTICA;
                if (MONEDA = 0) then
                    SELECT SUM(MVCL_MONTO), SUM(MVCL_RTEFTE), SUM(MVCL_RTEIVA), SUM(MVCL_RTEICA) FROM movimiento_clientes WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI
                        AND MVCL_FECHA < :FECFIN AND MVCL_DEBITO = 'N'  AND MVCL_ABONO = 'N' AND COBR_COD = :codcobr AND ((:SUCURSAL = 0) or (SUCU_ID = :SUCURSAL))
                        INTO :CREDITO, :RTFTE, :RTIVA, :RTICA;
                ELSE
                    SELECT SUM(MVCL_MONTO/MVCL_TRM), SUM(MVCL_RTEFTE/MVCL_TRM), SUM(MVCL_RTEIVA/MVCL_TRM), SUM(MVCL_RTEICA/MVCL_TRM)
                        FROM movimiento_clientes WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND ((:MONEDA = 0) or (MVCL_TRM <> 1)) 
                        AND MVCL_FECHA < :FECFIN AND MVCL_DEBITO = 'N'  AND MVCL_ABONO = 'N' AND COBR_COD = :codcobr AND ((:SUCURSAL = 0) or (SUCU_ID = :SUCURSAL))
                        INTO :CREDITO, :RTFTE, :RTIVA, :RTICA;
                if (CREDITO IS NULL) then
                    CREDITO = 0;
                if (rtfte IS NULL) then
                    rtfte = 0;
                if (rtiva IS NULL) then
                    rtiva = 0;
                if (rtica IS NULL) then
                    rtica = 0;
                IF (RETES = 'SI') then
                    CREDITO = CREDITO - RTFTE - RTIVA - RTICA;
                CARGOS1 = DEBITO - CREDITO;
                if (MONEDA = 0) then
                    SELECT SUM(MVCL_MONTO), SUM(MVCL_RTEFTE), SUM(MVCL_RTEIVA), SUM(MVCL_RTEICA) FROM movimiento_clientes WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI
                        AND MVCL_FECHA < :FECFIN AND MVCL_DEBITO = 'N'  AND MVCL_ABONO = 'S' AND COBR_COD = :codcobr AND ((:SUCURSAL = 0) or (SUCU_ID = :SUCURSAL))
                        INTO :CREDITO, :RTFTE, :RTIVA, :RTICA;
                ELSE
                    SELECT SUM(MVCL_MONTO/MVCL_TRM), SUM(MVCL_RTEFTE/MVCL_TRM), SUM(MVCL_RTEIVA/MVCL_TRM), SUM(MVCL_RTEICA/MVCL_TRM)
                        FROM movimiento_clientes WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND ((:MONEDA = 0) or (MVCL_TRM <> 1)) 
                        AND MVCL_FECHA < :FECFIN AND MVCL_DEBITO = 'N'  AND MVCL_ABONO = 'S' AND COBR_COD = :codcobr AND ((:SUCURSAL = 0) or (SUCU_ID = :SUCURSAL))
                        INTO :CREDITO, :RTFTE, :RTIVA, :RTICA;
                if (CREDITO IS NULL) then
                    CREDITO = 0;
                if (rtfte IS NULL) then
                    rtfte = 0;
                if (rtiva IS NULL) then
                    rtiva = 0;
                if (rtica IS NULL) then
                    rtica = 0;
                IF (RETES = 'NO') then
                    CREDITO = CREDITO + RTFTE + RTIVA + RTICA;
                ABONOS1 = CREDITO;
                FINAL = INICIAL + CARGOS3 + CARGOS2 + CARGOS1 - ABONOS3 - ABONOS2 - ABONOS1;
                SUSPEND;
                END
            END
        END
    END
SUSPEND;
END
^

SET TERM ; ^

ALTER TABLE RECIBO_PROVISIONAL
ADD RCPR_TRM T_MONTO;

SET TERM ^ ;

CREATE OR ALTER PROCEDURE REP_ANALISIS_CARTERA(
    DESDE VARCHAR(20),
    HASTA VARCHAR(20),
    GRPINI VARCHAR(5),
    GRPFIN VARCHAR(5),
    FECHA DATE,
    DETALLE CHAR(1),
    ORDEN CHAR(1),
    AGRUPA CHAR(1),
    DIASR INTEGER,
    SUBEMPRESA INTEGER,
    GRUPCART INTEGER,
    EXTENDIDA CHAR(1),
    MONEDA INTEGER)
RETURNS (
    NIT VARCHAR(20),
    NOMBRE VARCHAR(60),
    TELEFONO VARCHAR(40),
    CIUDAD VARCHAR(40),
    CONTACTO VARCHAR(60),
    EMAIL VARCHAR(100),
    FAX VARCHAR(25),
    CEL VARCHAR(25),
    CODCLI VARCHAR(20),
    CODZONA VARCHAR(2),
    NOMZONA VARCHAR(60),
    CODCOBR INTEGER,
    NOMCOBR VARCHAR(60),
    DV CHAR(1),
    CODCIUD CHAR(5),
    NOMCIUD VARCHAR(60),
    SUCURSAL VARCHAR(10),
    NOMSUC VARCHAR(60),
    TIPO INTEGER,
    ID INTEGER,
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(6),
    DIAS INTEGER,
    SALDO NUMERIC(18,2),
    CORRIENTE NUMERIC(18,2),
    CERO NUMERIC(18,2),
    TREINTA NUMERIC(18,2),
    SESENTA NUMERIC(18,2),
    NOVENTA NUMERIC(18,2),
    CIENTOCHENTA NUMERIC(18,2),
    DOSSETENTA NUMERIC(18,2),
    TRESSESENTA NUMERIC(18,2),
    PROVISIONAL NUMERIC(18,2),
    TIPONOM VARCHAR(8),
    FECDOC DATE,
    VENCE DATE,
    CUPO NUMERIC(18,2),
    DISPONIBLE NUMERIC(18,2),
    OBS BLOB SUB_TYPE 0 SEGMENT SIZE 80,
    GRUPCOD INTEGER,
    DIA_CAR INTEGER,
    GRUPNOM VARCHAR(30))
AS
DECLARE VARIABLE NITINI VARCHAR(20);
DECLARE VARIABLE NITFIN VARCHAR(20);
DECLARE VARIABLE NOMINI VARCHAR(20);
DECLARE VARIABLE NOMFIN VARCHAR(20);
DECLARE VARIABLE RTFTE NUMERIC(18,2);
DECLARE VARIABLE RTIVA NUMERIC(18,2);
DECLARE VARIABLE RTICA NUMERIC(18,2);
DECLARE VARIABLE VENCIMIENTO VARCHAR(12);
DECLARE VARIABLE OK CHAR(1);
declare variable AUTORET VARCHAR(10);
declare variable FAUTORET DATE;
declare variable INCLANTI CHAR(2);
declare variable descnt_prov char(2);
declare variable MAXDIAS INTEGER;
DECLARE VARIABLE TRM NUMERIC(18,2);
BEGIN
if (ORDEN = 'C') then
    BEGIN
    NITINI = DESDE;
    NITFIN = HASTA;
    NOMINI = '';
    NOMFIN = 'zz';
    END
ELSE
    BEGIN
    NOMINI = DESDE;
    NOMFIN = HASTA;
    NITINI = '';
    NITFIN = 'zz';
    END
/* Ubique el NIT */
EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'FECHA AUTORETENEDOR NO DESCONTAR RETENCIONES DEL SALDO PERO SI CONTABILIZARLAS') returning_values (AUTORET);
if (AUTORET <> '') then
    FAUTORET = CAST(AUTORET AS DATE);
else
    FAUTORET = '9999/12/31';
EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'ANALISIS DE CARTERA CON FECHA FACTURA O VENCIMIENTO') returning_values (VENCIMIENTO);
EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'INCLUIR ANTICIPOS DE CLIENTES EN REPORTES Y CONSULTAS DE CARTERA') returning_values (INCLANTI);
EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'DESCONTAR RECIBOS PROVISIONALES EN INFORMES DE CARTERA') RETURNING_VALUES (:descnt_prov);

FOR select T.TERC_NIT, TERC_NOM, TERC_DV, CLSU_TEL, CLSU_CIUDAD, S.COBR_COD, S.ZONA_COD, T.CIUD_COD, CLIE_CUPO, CLIE_DIAS, CLCU_COD, CLSU_NOMBRE, t.terc_obs, C.GRCA_COD, TERC_CONTACTO, TERC_EMAIL, TERC_FAX, TERC_CEL, CLIE_COD
    from terceros T, CLIENTES C, CLIENTE_SUCURSALES S
    where C.TERC_NIT = T.TERC_NIT AND TERC_CLIE = 'S' AND S.TERC_NIT = C.TERC_NIT and T.TERC_NIT >= :NITINI AND T.TERC_NIT <= :NITFIN AND
        T.TERC_NOM >= :NOMINI AND T.TERC_NOM <= :NOMFIN AND ((:GRUPCART = 0) or (C.GRCA_COD = :GRUPCART))
    INTO :NIT, :NOMBRE, :DV, :TELEFONO, :CIUDAD, :CODCOBR, :CODZONA, :CODCIUD, :CUPO, :DIA_CAR,  :SUCURSAL, :NOMSUC, :obs, :GRUPCOD, :CONTACTO, :EMAIL, :FAX, :CEL, :CODCLI
    DO  
    BEGIN
    SELECT COBR_NOM FROM COBRADORES CB WHERE COBR_COD = :CODCOBR INTO :NOMCOBR;
    SELECT ZONA_NOM FROM ZONAS Z WHERE ZONA_COD = :CODZONA INTO :NOMZONA;
    SELECT CIUD_NOM FROM CIUDADES WHERE CIUD_COD = :CODCIUD INTO :NOMCIUD;
    SELECT GRCA_NOMBRE FROM GRUPO_CARTERA WHERE GRCA_COD = :GRUPCOD INTO :GRUPNOM;
    provisional = 0;
    MAXDIAS = 0;
    OK = 'N';
    if (AGRUPA = 'Z') then
        BEGIN
        if (GRPINI = '') then
            BEGIN
            if ((CODZONA IS NULL) or (CODZONA >= :GRPINI AND CODZONA <= :GRPFIN)) then
                OK = 'S';
            END
        ELSE
            if (CODZONA >= :GRPINI AND CODZONA <= :GRPFIN) then
                OK = 'S';
        END
    if (AGRUPA = 'I') then
        BEGIN
        if (GRPINI = '') then
            BEGIN
            if ((CODCIUD IS NULL) or (CODCIUD >= :GRPINI AND CODCIUD <= :GRPFIN)) then
                OK = 'S';
            END
        ELSE
            if (CODCIUD >= :GRPINI AND CODCIUD <= :GRPFIN) then
                OK = 'S';
        END
    if (AGRUPA = 'N') then
        OK = 'S';
    if (OK = 'S') then
        BEGIN
        DISPONIBLE = CUPO;
        CORRIENTE = 0;
        CERO = 0;
        TREINTA = 0;
        SESENTA = 0;
        NOVENTA = 0;
        CIENTOCHENTA = 0;
        DOSSETENTA = 0;
        TRESSESENTA = 0;
        /* BUSQUE EN SALDOS_DOC_CARTERA LOS QUE TENGAN SALDO > 0 */
        FOR SELECT MVCL_TIPOREF, MVCL_IDREF, MVCL_PREFREF, MVCL_NUMREF, MVCL_FECHA, MVCL_VENCE
            FROM MOVIMIENTO_CLIENTES
            WHERE TERC_NIT = :NIT AND MVCL_SUCURSAL = :SUCURSAL AND MVCL_FECHA <= :FECHA
                AND MVCL_ABONO = 'N' AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA)) AND
                ((:MONEDA = 0) or (MVCL_TRM <> 1))
            INTO :TIPO, :ID, :PREFIJO, :NUMERO, :FECDOC, :VENCE
            DO
            BEGIN
            if ((inclanti = 'SI') or (TIPO <> 45)) then
                BEGIN
                EXECUTE PROCEDURE saldo_doc_cartera(TIPO, ID, FECHA, MONEDA) returning_values (SALDO);
                if (SALDO <> 0) then
                    BEGIN
                    DISPONIBLE = DISPONIBLE - SALDO;
                    SELECT TIDO_NOMCORTO FROM TIPO_DOCUMENTO WHERE TIDO_COD = :TIPO INTO :TIPONOM;

                    if (MONEDA = 0) then
                        SELECT SUM(SDCA_RTFTE - SDCA_ABRTFTE), SUM(SDCA_RTIVA - SDCA_ABRTIVA), SUM(SDCA_RTICA - SDCA_ABRTICA)
                            FROM SALDOS_DOC_CARTERA WHERE SDCA_TIPOREF = :TIPO AND SDCA_IDREF = :ID
                            INTO :RTFTE, :RTIVA, :RTICA;
                    ELSE
                        SELECT SUM((SDCA_RTFTE - SDCA_ABRTFTE)/SDCA_TRM), SUM((SDCA_RTIVA - SDCA_ABRTIVA)/SDCA_TRM), SUM((SDCA_RTICA - SDCA_ABRTICA)/SDCA_TRM)
                            FROM SALDOS_DOC_CARTERA WHERE SDCA_TIPOREF = :TIPO AND SDCA_IDREF = :ID
                            INTO :RTFTE, :RTIVA, :RTICA;
                    if (RTFTE IS NULL) then
                        RTFTE = 0;
                    if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) THEN
                        BEGIN
                        if (RTFTE > 0) then
                            RTFTE = 0;
                        END
                    ELSE
                        BEGIN
                        if (RTFTE < 0) then
                            RTFTE = 0;
                        END
                    if (FAUTORET <= FECDOC) then
                        RTFTE = 0;
                    if (RTIVA IS NULL) then
                        RTIVA = 0;
                    if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) THEN
                        BEGIN
                        if (RTIVA > 0) then
                            RTIVA = 0;
                        END
                    ELSE
                        BEGIN
                        if (RTIVA < 0) then
                            RTIVA = 0;
                        END
                    if (RTICA IS NULL) then
                        RTICA = 0;
                    if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) THEN
                        BEGIN
                        if (RTICA > 0) then
                            RTICA = 0;
                        END
                    ELSE
                        BEGIN
                        if (RTICA < 0) then
                            RTICA = 0;
                        END
                    /* AHORA CLASIFIQUE LOS DIAS */
                    if (VENCIMIENTO = 'FECHA') then
                        DIAS = FECHA - FECDOC;
                    ELSE
                        DIAS = FECHA - VENCE;
                    if (MAXDIAS < DIAS) then
                        MAXDIAS = DIAS;
                    if (DETALLE = 'S') then
                        BEGIN
                        CORRIENTE = 0;
                        CERO = 0;
                        TREINTA = 0;
                        SESENTA = 0;
                        NOVENTA = 0;
                        CIENTOCHENTA = 0;
                        DOSSETENTA = 0;
                        tressesenta = 0;
                        END
                    if (DIAS < 0) then
                        CORRIENTE = CORRIENTE + SALDO;
                    ELSE
                        if (DIAS < DIASR) then
                            CERO = CERO + SALDO;
                        ELSE
                            if (DIAS < (DIASR * 2)) then
                                TREINTA = TREINTA + SALDO;
                            ELSE
                                if (DIAS < (DIASR * 3)) then
                                    SESENTA = SESENTA + SALDO;
                                ELSE
                                    BEGIN
                                    if (EXTENDIDA = 'N') then
                                        NOVENTA = NOVENTA + SALDO;
                                    else    
                                        BEGIN
                                        if (DIAS < (DIASR * 3) * 2) then
                                            NOVENTA = NOVENTA + SALDO;
                                        ELSE
                                            if (DIAS < (DIASR * 3) * 3) then
                                                CIENTOCHENTA = CIENTOCHENTA + SALDO;
                                            ELSE
                                                if (DIAS < (DIASR * 3) * 4) then
                                                    dossetenta = dossetenta + SALDO;
                                            ELSE
                                                tressesenta = tressesenta + SALDO;
                                        END
                                    END
                    if (DETALLE = 'S') then
                        SUSPEND;
                    END  /* SALDO */
                END  /* NO ANTICIPO */
            END  /* FOR MOV_CLI */
        /* AGREGUE LOS RECIBOS PROVISIONALES CON SIGNO NEGATIVO */
        FOR SELECT 65, MAX(P.RCPR_ID), MAX(PREF_PRE), MAX(RCPR_NUMERO), MAX(RCPR_FECHA), SUM(RPDE_ABONO* -1), SUM(RPDE_RTFTE*-1), SUM(RPDE_RTIVA*-1), SUM(RPDE_RTICA*-1), MAX(RCPR_TRM)
            FROM RECIBO_PROVISIONAL P, recibo_provisional_detalle D
            WHERE P.rcpr_id = D.rcpr_id AND P.TERC_NIT = :NIT AND D.RPDE_SUCURSAL = :SUCURSAL AND P.RCPR_FECHA <= :FECHA AND P.RCPR_ANULADO = 'N' AND
            ((RCPR_FECCRUCE IS NULL) or (RCPR_FECCRUCE > :FECHA)) AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA)) AND ((:MONEDA = 0) or (RCPR_TRM <> 1))
            GROUP BY P.rcpr_id
            INTO :TIPO, :ID, :PREFIJO, :NUMERO, :FECDOC, :PROVISIONAL, :rtfte,  :RTIVA, :RTICA, :TRM
            DO
            BEGIN
            if ((MONEDA <> 0) AND (TRM <> 0)) then
                BEGIN
                PROVISIONAL = PROVISIONAL / TRM;
                RTFTE = RTFTE / TRM;
                RTIVA = RTIVA / TRM;
                RTICA = RTICA / TRM;
                END
            if (:descnt_prov = 'NO') then
              SALDO = 0;
            else
              SALDO = :PROVISIONAL;
            SELECT TIDO_NOMCORTO FROM TIPO_DOCUMENTO WHERE TIDO_COD = :TIPO INTO :TIPONOM;
            /* CALCULE EL VENCIMIENTO DEL ULTIMO DOCUMENTO POSFECHADO */
            SELECT MAX(RPPA_FECHA) FROM recibo_provisional_pago WHERE RCPR_ID = :ID INTO :VENCE;
            DIAS = VENCE - FECHA;
            if (DETALLE = 'S') then
                BEGIN
                CORRIENTE = 0;
                CERO = 0;
                TREINTA = 0;
                SESENTA = 0;
                NOVENTA = 0;
                CIENTOCHENTA = 0;
                DOSSETENTA = 0;
                tressesenta = 0;
                END
            if (DIAS < 0) then
                CORRIENTE = CORRIENTE + SALDO;
            ELSE
                if (DIAS < DIASR) then
                    CERO = CERO + SALDO;
                ELSE
                    if (DIAS < (DIASR * 2)) then
                        TREINTA = TREINTA + SALDO;
                    ELSE
                        if (DIAS < (DIASR * 3)) then
                            SESENTA = SESENTA + SALDO;
                        ELSE
                            BEGIN
                            if (EXTENDIDA = 'N') then
                                NOVENTA = NOVENTA + SALDO;
                            else
                                BEGIN
                                if (DIAS < (DIASR * 3) * 2) then
                                    CIENTOCHENTA = CIENTOCHENTA + SALDO;
                                ELSE
                                    if (DIAS < (DIASR * 3) * 3) then
                                        DOSSETENTA = DOSSETENTA + SALDO;
                                    ELSE
                                        TRESSESENTA = TRESSESENTA + SALDO;
                                END
                            END
            if (DETALLE = 'S') then
                SUSPEND;
            END
        if (DETALLE = 'N') then
            begin
            SALDO = CORRIENTE + CERO + TREINTA + SESENTA + NOVENTA;
            DIAS = MAXDIAS;
            SUSPEND;
            end
        END
    if (AGRUPA = 'C') then
        BEGIN
        FOR SELECT DISTINCT COBR_COD FROM MOVIMIENTO_CLIENTES
            WHERE TERC_NIT = :NIT AND MVCL_SUCURSAL = :SUCURSAL AND MVCL_FECHA <= :FECHA
                AND MVCL_ABONO = 'N' AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA)) AND
                ((:MONEDA = 0) or (MVCL_TRM <> 1))
            INTO :codcobr
            DO
            BEGIN
            OK = 'N';
            if (GRPINI = '') then
                BEGIN
                if ((CODCOBR IS NULL) or (CODCOBR >= :GRPINI AND CODCOBR <= :GRPFIN)) then
                    OK = 'S';
                END
            ELSE
                if (CODCOBR >= :GRPINI AND CODCOBR <= :GRPFIN) then
                    OK = 'S';
            if (OK = 'S') then
                BEGIN
                DISPONIBLE = CUPO;
                CORRIENTE = 0;
                CERO = 0;
                TREINTA = 0;
                SESENTA = 0;
                NOVENTA = 0;
                CIENTOCHENTA = 0;
                DOSSETENTA = 0;
                tressesenta = 0;
                SELECT COBR_NOM FROM COBRADORES WHERE COBR_COD = :codcobr INTO :nomcobr;
                /* BUSQUE EN SALDOS_DOC_CARTERA LOS QUE TENGAN SALDO > 0 */
                FOR SELECT MVCL_TIPOREF, MVCL_IDREF, MVCL_PREFREF, MVCL_NUMREF, MVCL_FECHA, MVCL_VENCE
                    FROM MOVIMIENTO_CLIENTES
                    WHERE TERC_NIT = :NIT AND COBR_COD = :CODCOBR AND MVCL_SUCURSAL = :SUCURSAL AND MVCL_FECHA <= :FECHA
                        AND MVCL_ABONO = 'N' AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA))
                    INTO :TIPO, :ID, :PREFIJO, :NUMERO, :FECDOC, :VENCE
                    DO
                    BEGIN
                    if ((inclanti = 'SI') or (TIPO <> 45)) then
                        BEGIN
                        EXECUTE PROCEDURE saldo_doc_cartera(TIPO, ID, FECHA, MONEDA) returning_values (SALDO);
                        if (SALDO <> 0) then
                            BEGIN
                            DISPONIBLE = DISPONIBLE - SALDO;
                            SELECT TIDO_NOMCORTO FROM TIPO_DOCUMENTO WHERE TIDO_COD = :TIPO INTO :TIPONOM;
                            if (MONEDA = 0) then
                                SELECT SUM(SDCA_RTFTE - SDCA_ABRTFTE), SUM(SDCA_RTIVA - SDCA_ABRTIVA), SUM(SDCA_RTICA - SDCA_ABRTICA)
                                    FROM SALDOS_DOC_CARTERA WHERE SDCA_TIPOREF = :TIPO AND SDCA_IDREF = :ID
                                    INTO :RTFTE, :RTIVA, :RTICA;
                            ELSE
                                SELECT SUM((SDCA_RTFTE - SDCA_ABRTFTE)/SDCA_TRM), SUM((SDCA_RTIVA - SDCA_ABRTIVA)/SDCA_TRM), SUM((SDCA_RTICA - SDCA_ABRTICA)/SDCA_TRM)
                                    FROM SALDOS_DOC_CARTERA WHERE SDCA_TIPOREF = :TIPO AND SDCA_IDREF = :ID
                                    INTO :RTFTE, :RTIVA, :RTICA;
                            if (RTFTE IS NULL) then
                                RTFTE = 0;
                            if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) THEN
                                BEGIN
                                if (RTFTE > 0) then
                                    RTFTE = 0;
                                END
                            ELSE
                                BEGIN
                                if (RTFTE < 0) then
                                    RTFTE = 0;
                                END
                            if (FAUTORET <= FECDOC) then
                                RTFTE = 0;
                            if (RTIVA IS NULL) then
                                RTIVA = 0;
                            if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) THEN
                                BEGIN
                                if (RTIVA > 0) then
                                    RTIVA = 0;
                                END
                            ELSE
                                BEGIN
                                if (RTIVA < 0) then
                                    RTIVA = 0;
                                END
                            if (RTICA IS NULL) then
                                RTICA = 0;
                            if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) THEN
                                BEGIN
                                if (RTICA > 0) then
                                    RTICA = 0;
                                END
                            ELSE
                                BEGIN
                                if (RTICA < 0) then
                                    RTICA = 0;
                                END
                            /* AHORA CLASIFIQUE LOS DIAS */
                            if (VENCIMIENTO = 'FECHA') then
                                DIAS = FECHA - FECDOC;
                            ELSE
                                DIAS = FECHA - VENCE;
                            if (MAXDIAS < DIAS) then
                                MAXDIAS = DIAS;
                            if (DETALLE = 'S') then
                                BEGIN
                                CORRIENTE = 0;
                                CERO = 0;
                                TREINTA = 0;
                                SESENTA = 0;
                                NOVENTA = 0;
                                CIENTOCHENTA = 0;
                                DOSSETENTA = 0;
                                tressesenta = 0;
                                END
                            if (DIAS < 0) then
                                CORRIENTE = CORRIENTE + SALDO;
                            ELSE
                                if (DIAS < DIASR) then
                                    CERO = CERO + SALDO;
                                ELSE
                                    if (DIAS < (DIASR * 2)) then
                                        TREINTA = TREINTA + SALDO;
                                    ELSE
                                        if (DIAS < (DIASR * 3)) then
                                            SESENTA = SESENTA + SALDO;
                                        ELSE
                                            BEGIN
                                            if (EXTENDIDA = 'N') then
                                                NOVENTA = NOVENTA + SALDO;
                                            else    
                                                BEGIN
                                                if (DIAS < (DIASR * 3) * 2) then
                                                    CIENTOCHENTA = CIENTOCHENTA + SALDO;
                                                ELSE
                                                    if (DIAS < (DIASR * 3) * 3) then
                                                        DOSSETENTA = DOSSETENTA + SALDO;
                                                    ELSE
                                                        TRESSESENTA = TRESSESENTA + SALDO;
                                                END
                                            END
                            if (DETALLE = 'S') then
                                SUSPEND;
                            END  /* SALDO <>  0 */
                        END  /* NO ANTICIPO */
                    END  /* FOR MOV_CLI */
                /* AGREGUE LOS RECIBOS PROVISIONALES CON SIGNO NEGATIVO */
                FOR SELECT 65, MAX(P.RCPR_ID), MAX(PREF_PRE), MAX(RCPR_NUMERO), MAX(RCPR_FECHA), SUM(RPDE_ABONO * -1), SUM(RPDE_RTFTE*-1), SUM(RPDE_RTIVA*-1), SUM(RPDE_RTICA*-1), MAX(RCPR_TRM)
                    FROM RECIBO_PROVISIONAL P, recibo_provisional_detalle D
                    WHERE P.rcpr_id = D.rcpr_id AND P.TERC_NIT = :NIT AND RPDE_SUCURSAL = :SUCURSAL AND P.VEND_COD = :CODCOBR AND P.RCPR_FECHA <= :FECHA AND P.RCPR_ANULADO = 'N' AND
                    ((RCPR_FECCRUCE IS NULL) or (RCPR_FECCRUCE > :FECHA)) AND ((SUCU_ID = :SUBEMPRESA) OR (:SUBEMPRESA = 0)) AND ((:MONEDA = 0) or (RCPR_TRM <> 1))
                    GROUP BY P.rcpr_id
                    INTO :TIPO, :ID, :PREFIJO, :NUMERO, :FECDOC, :PROVISIONAL, :rtfte,  :RTIVA, :RTICA, :TRM
                    DO
                    BEGIN
                    if ((MONEDA <> 0) AND (TRM <> 0)) then
                        BEGIN
                        PROVISIONAL = PROVISIONAL / TRM;
                        RTFTE = RTFTE / TRM;
                        RTIVA = RTIVA / TRM;
                        RTICA = RTICA / TRM;
                        END
                    if (:descnt_prov = 'NO') then
                      SALDO = 0;
                    else
                      SALDO = :PROVISIONAL;
                    SELECT TIDO_NOMCORTO FROM TIPO_DOCUMENTO WHERE TIDO_COD = :TIPO INTO :TIPONOM;
                    /* CALCULE EL VENCIMIENTO DEL ULTIMO DOCUMENTO POSFECHADO */
                    SELECT MAX(RPPA_FECHA) FROM recibo_provisional_pago WHERE RCPR_ID = :ID INTO :VENCE;
                    DIAS = VENCE - FECHA;
                    if (DETALLE = 'S') then
                        BEGIN
                        CORRIENTE = 0;
                        CERO = 0;
                        TREINTA = 0;
                        SESENTA = 0;
                        NOVENTA = 0;
                        CIENTOCHENTA = 0;
                        DOSSETENTA = 0;
                        tressesenta = 0;
                        END
                    if (DIAS < 0) then
                        CORRIENTE = CORRIENTE + SALDO;
                    ELSE
                        if (DIAS < DIASR) then
                            CERO = CERO + SALDO;
                        ELSE
                            if (DIAS < (DIASR * 2)) then
                                TREINTA = TREINTA + SALDO;
                            ELSE
                                if (DIAS < (DIASR * 3)) then
                                    SESENTA = SESENTA + SALDO;
                                ELSE
                                    BEGIN
                                    if (EXTENDIDA = 'N') then
                                        NOVENTA = NOVENTA + SALDO;
                                    else    
                                        BEGIN
                                        if (DIAS < (DIASR * 3) * 2) then
                                            CIENTOCHENTA = CIENTOCHENTA + SALDO;
                                        ELSE
                                            if (DIAS < (DIASR * 3) * 3) then
                                                DOSSETENTA = DOSSETENTA + SALDO;
                                            ELSE
                                                TRESSESENTA = TRESSESENTA + SALDO;
                                        END
                                    END
                    if (DETALLE = 'S') then
                        SUSPEND;
                    END
                if (DETALLE = 'N') then
                    begin
                    SALDO = CORRIENTE + CERO + TREINTA + SESENTA + NOVENTA;
                    DIAS = MAXDIAS;
                    SUSPEND;
                    end
                END
            END  /* FOR COBRADOR */
        END
    END  /* FOR NIT */
SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER PROCEDURE REP_CARTERA_CLIENTES(
    DESDE VARCHAR(20),
    HASTA VARCHAR(20),
    GRPINI VARCHAR(5),
    GRPFIN VARCHAR(5),
    FECHA DATE,
    ORDEN CHAR(1),
    AGRUPA CHAR(1),
    SUBEMPRESA INTEGER,
    GRUPCART INTEGER,
    MONEDA INTEGER)
RETURNS (
    NIT VARCHAR(20),
    NOMBRE VARCHAR(60),
    DIR VARCHAR(60),
    TELEFONO VARCHAR(40),
    CIUDAD VARCHAR(40),
    CONTACTO VARCHAR(60),
    EMAIL VARCHAR(100),
    FAX VARCHAR(25),
    CEL VARCHAR(25),
    CODCLI VARCHAR(20),
    CODZONA VARCHAR(2),
    NOMZONA VARCHAR(60),
    CODCOBR INTEGER,
    NOMCOBR VARCHAR(60),
    SUCURSAL VARCHAR(10),
    NOMSUC VARCHAR(60),
    DV CHAR(1),
    CODCIUD CHAR(5),
    NOMCIUD VARCHAR(60),
    TIPO INTEGER,
    ID INTEGER,
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(6),
    CONCEPTO VARCHAR(60),
    SALDO NUMERIC(18,2),
    PROVISIONAL NUMERIC(18,2),
    RTFTE NUMERIC(18,2),
    RTIVA NUMERIC(18,2),
    RTICA NUMERIC(18,2),
    DTOF NUMERIC(18,2),
    TIPONOM VARCHAR(8),
    FECDOC DATE,
    VENCE DATE,
    DIAS INTEGER,
    CUPO NUMERIC(18,2),
    DISPONIBLE NUMERIC(18,2),
    NOTA VARCHAR(256),
    OBS BLOB SUB_TYPE 0 SEGMENT SIZE 80,
    GRUPCOD INTEGER,
    GRUPNOM VARCHAR(30))
AS
DECLARE VARIABLE NITINI VARCHAR(20);
DECLARE VARIABLE NITFIN VARCHAR(20);
DECLARE VARIABLE NOMINI VARCHAR(20);
DECLARE VARIABLE NOMFIN VARCHAR(20);
DECLARE VARIABLE OK CHAR(1);
DECLARE VARIABLE FOV CHAR(11);
DECLARE VARIABLE DTOAPL NUMERIC(18,2);
DECLARE VARIABLE FECDTO DATE;
DECLARE VARIABLE FECNOTA VARCHAR(10);
DECLARE VARIABLE AUXNOTA VARCHAR(256);
DECLARE VARIABLE IDNOTA INTEGER;
declare variable descnt_prov char(2);
declare variable AUTORET VARCHAR(10);
declare variable FAUTORET DATE;
declare variable INCLANTI CHAR(2);
DECLARE VARIABLE TRM NUMERIC(18,2);
BEGIN
if (ORDEN = 'C') then
    BEGIN
    NITINI = DESDE;
    NITFIN = HASTA;
    NOMINI = '';
    NOMFIN = 'zz';
    END
ELSE
    BEGIN
    NOMINI = DESDE;
    NOMFIN = HASTA;
    NITINI = '';
    NITFIN = 'zz';
    END
  EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'DESCONTAR RECIBOS PROVISIONALES EN INFORMES DE CARTERA') RETURNING_VALUES (:descnt_prov);
  EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'INCLUIR ANTICIPOS DE CLIENTES EN REPORTES Y CONSULTAS DE CARTERA') returning_values (INCLANTI);
  EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'FECHA AUTORETENEDOR NO DESCONTAR RETENCIONES DEL SALDO PERO SI CONTABILIZARLAS') returning_values (AUTORET);
  if (AUTORET <> '') then
    FAUTORET = CAST(AUTORET AS DATE);
  else
    FAUTORET = '9999/12/31';
  /* Ubique el NIT */
  FOR select C.TERC_NIT, TERC_NOM, TERC_DV, CLSU_DIR, CLSU_TEL, CLSU_CIUDAD, S.COBR_COD, S.ZONA_COD, T.CIUD_COD, CLIE_CUPO, CLCU_COD, CLSU_NOMBRE, t.terc_obs, C.GRCA_COD, TERC_CONTACTO, TERC_EMAIL, TERC_FAX, TERC_CEL, CLIE_COD
    from terceros T, CLIENTES C, CLIENTE_SUCURSALES S
    where C.TERC_NIT = T.TERC_NIT AND TERC_CLIE = 'S' AND S.TERC_NIT = C.TERC_NIT AND C.TERC_NIT >= :NITINI AND C.TERC_NIT <= :NITFIN AND
        TERC_NOM >= :NOMINI AND TERC_NOM <= :NOMFIN AND ((:GRUPCART = 0) or (C.GRCA_COD = :GRUPCART))
    INTO :NIT, :NOMBRE, :DV, :DIR, :TELEFONO, :CIUDAD, :CODCOBR, :CODZONA, :CODCIUD, :CUPO, :SUCURSAL, :NOMSUC, :obs, :GRUPCOD, :CONTACTO, :EMAIL, :FAX, :CEL, :CODCLI
    DO  
    BEGIN
    if (CODCOBR IS NOT NULL) then
        SELECT COBR_NOM FROM COBRADORES  WHERE COBR_COD = :CODCOBR INTO :NOMCOBR;
    if (CODZONA IS NOT NULL) then
        SELECT ZONA_NOM FROM ZONAS WHERE ZONA_COD = :CODZONA INTO :NOMZONA;
    if (CODCIUD IS NOT NULL) then
        SELECT CIUD_NOM FROM CIUDADES  WHERE CIUD_COD = :CODCIUD INTO :NOMCIUD;
    SELECT GRCA_NOMBRE FROM GRUPO_CARTERA WHERE GRCA_COD = :GRUPCOD INTO :GRUPNOM;
    DISPONIBLE = CUPO;
    OK = 'N';
    if (AGRUPA = 'Z') then
        BEGIN
        if (GRPINI = '') then
            BEGIN
            if ((CODZONA IS NULL) or (CODZONA >= :GRPINI AND CODZONA <= :GRPFIN)) then
                OK = 'S';
            END
        ELSE
            if (CODZONA >= :GRPINI AND CODZONA <= :GRPFIN) then
                OK = 'S';
        END
    if (AGRUPA = 'I') then
        BEGIN
        if (GRPINI = '') then
            BEGIN
            if ((CODCIUD IS NULL) or (CODCIUD >= :GRPINI AND CODCIUD <= :GRPFIN)) then
                OK = 'S';
            END
        ELSE
            if (CODCIUD >= :GRPINI AND CODCIUD <= :GRPFIN) then
                OK = 'S';
        END
    if (AGRUPA = 'N') then
        OK = 'S';
        
    if (OK = 'S') then
        BEGIN
        /* BUSQUE EN SALDOS_DOC_CARTERA LOS QUE TENGAN SALDO > 0 */
        FOR SELECT MVCL_TIPOREF, MVCL_IDREF, MVCL_PREFREF, MVCL_NUMREF, MVCL_FECHA, MVCL_VENCE, MVCL_CONC
            FROM MOVIMIENTO_CLIENTES WHERE TERC_NIT = :NIT AND MVCL_SUCURSAL = :SUCURSAL AND MVCL_FECHA <= :FECHA AND
            MVCL_ABONO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) AND ((:MONEDA = 0) or (MVCL_TRM <> 1))
            INTO :TIPO, :ID, :PREFIJO, :NUMERO, :FECDOC, :VENCE, :CONCEPTO
            DO
            BEGIN
            if ((inclanti = 'SI') or (TIPO <> 45)) then
                BEGIN
                EXECUTE PROCEDURE saldo_doc_cartera(TIPO, ID, FECHA, MONEDA) returning_values (SALDO);
                if (SALDO <> 0) then
                    BEGIN
                    PROVISIONAL = 0;
                    EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'ANALISIS DE CARTERA CON FECHA FACTURA O VENCIMIENTO') RETURNING_VALUES (FOV);
                    if (FOV = 'FECHA') then
                       DIAS = FECHA - FECDOC;
                    ELSE
                      DIAS = FECHA - VENCE;
                    DISPONIBLE = DISPONIBLE - SALDO;
                    SELECT TIDO_NOMCORTO FROM TIPO_DOCUMENTO WHERE TIDO_COD = :TIPO INTO :TIPONOM;
                    if (TIPO = 41) then
                        SELECT NDCL_DTOFMONTO, NDCL_FECHADTO, NDCL_TRM FROM NOTAS_DEBITO_CLIENTES
                            WHERE NDCL_ID = :ID INTO :DTOF, :FECDTO, :TRM;
                    if (TIPO = 42) then
                        SELECT 0, :FECDOC, 1 FROM NOTAS_CREDITO_CLIENTES
                            WHERE NCCL_ID = :ID INTO :DTOF, :FECDTO, :TRM;
                    if (TIPO = 45) then
                        SELECT ANCL_DTOFMONTO, ANCL_DTOFECHA, ANCL_TRM FROM ANTICIPOS_CLIENTE
                            WHERE ANCL_ID = :ID INTO :DTOF, :FECDTO, :TRM;
                    if (TIPO = 31) then
                        SELECT FACT_DTOFMONTO, FACT_DTOFFECHA, FACT_TRM FROM FACTURAS
                            WHERE FACT_ID = :ID INTO :DTOF, :FECDTO, :TRM;
                    if (TIPO = 33) then
                        SELECT 0, :FECDOC, 1 FROM devoluciones_ventas
                            WHERE DEVT_ID = :ID INTO :DTOF, :FECDTO, :TRM;
                    if ((MONEDA <> 0) AND (TRM <> 0)) then
                        DTOF = DTOF / TRM;
                    if (DTOF IS NULL) then
                        DTOF = 0;
                    if (DTOF <> 0) then
                        BEGIN
                        SELECT SUM(RCDE_DTOF), MAX(RECA_TRM) FROM RECIBOS_CAJA_DETALLE D, RECIBOS_CAJA R
                            WHERE R.reca_id = D.reca_id AND RCDE_IDDOC = :ID AND RCDE_TIPODOC = :TIPO
                            INTO :DTOAPL, :TRM;
                        if (DTOAPL IS NULL) then
                            DTOAPL = 0;
                        if ((MONEDA <> 0) AND (TRM <> 1)) then
                            DTOAPL = DTOAPL / TRM;
                        DTOF = DTOF - DTOAPL;
                        /* SI YA SE VENCIO DEJELO EN CERO */
                        if (FECDTO < FECHA) then
                            DTOF = 0;
                        END
                    if (MONEDA = 0) then
                        SELECT SUM(SDCA_RTFTE - SDCA_ABRTFTE), SUM(SDCA_RTIVA - SDCA_ABRTIVA), SUM(SDCA_RTICA - SDCA_ABRTICA)
                            FROM SALDOS_DOC_CARTERA WHERE SDCA_TIPOREF = :TIPO AND SDCA_IDREF = :ID
                            INTO :RTFTE, :RTIVA, :RTICA;
                    ELSE
                        SELECT SUM((SDCA_RTFTE - SDCA_ABRTFTE)/SDCA_TRM), SUM((SDCA_RTIVA - SDCA_ABRTIVA)/SDCA_TRM), SUM((SDCA_RTICA - SDCA_ABRTICA)/SDCA_TRM)
                            FROM SALDOS_DOC_CARTERA WHERE SDCA_TIPOREF = :TIPO AND SDCA_IDREF = :ID
                            INTO :RTFTE, :RTIVA, :RTICA;
                    if (RTFTE IS NULL) then
                        RTFTE = 0;
                    if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) THEN
                        BEGIN
                        if (RTFTE > 0) then
                            RTFTE = 0;
                        END
                    ELSE
                        BEGIN
                        if (RTFTE < 0) then
                            RTFTE = 0;
                        END
                    if (RTIVA IS NULL) then
                        RTIVA = 0;
                    if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) THEN
                        BEGIN
                        if (RTIVA > 0) then
                            RTIVA = 0;
                        END
                    ELSE
                        BEGIN
                        if (RTIVA < 0) then
                            RTIVA = 0;
                        END
                    if (RTICA IS NULL) then
                        RTICA = 0;
                    if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) THEN
                        BEGIN
                        if (RTICA > 0) then
                            RTICA = 0;
                        END
                    ELSE
                        BEGIN
                        if (RTICA < 0) then
                            RTICA = 0;
                        END
                    if (FAUTORET <= FECDOC) then
                        RTFTE = 0;
                    /* SI TIENE NOTA AGREGUELA */
                    SELECT MAX(NOCL_ID) FROM NOTAS_CLIENTES WHERE TERC_NIT = :NIT AND CLSU_COD = :SUCURSAL AND NOCL_TIPODOC = :TIPO AND NOCL_IDDOC = :ID INTO :IDNOTA;
                    if (IDNOTA IS NOT NULL) then
                        BEGIN
                        SELECT cast(NOCL_FECHA as char(10)), NOCL_TEXTO FROM NOTAS_CLIENTES
                            WHERE NOCL_ID = :IDNOTA INTO :FECNOTA, :AUXNOTA;
                        if (STRLEN(AUXNOTA) < 244) then
                            NOTA = FECNOTA || ':' || AUXNOTA;
                        ELSE
                            NOTA = AUXNOTA;
                        END
                    else
                        NOTA = '';
                    SUSPEND;
                    END  /* SALDO <> 0 */
                END  /* NO ANTICIPO */
            END  /* FOR */
        /* AGREGUE LOS RECIBOS PROVISIONALES CON SIGNO NEGATIVO */
        FOR SELECT 65, MAX(P.RCPR_ID), MAX(PREF_PRE), MAX(RCPR_NUMERO), MAX(RCPR_FECHA), MAX(RCPR_CONC), SUM(RPDE_ABONO * -1), SUM(RPDE_RTFTE*-1), SUM(RPDE_RTIVA*-1), SUM(RPDE_RTICA*-1), MAX(RCPR_TRM)
            FROM RECIBO_PROVISIONAL P, recibo_provisional_detalle D
            WHERE P.rcpr_id = D.rcpr_id AND P.TERC_NIT = :NIT AND RCPR_FECHA <= :FECHA AND RCPR_ANULADO = 'N' AND
            ((RCPR_FECCRUCE IS NULL) or (RCPR_FECCRUCE > :FECHA)) AND RPDE_SUCURSAL = :SUCURSAL AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY P.rcpr_id
            INTO :TIPO, :ID, :PREFIJO, :NUMERO, :FECDOC, :CONCEPTO, :PROVISIONAL, :rtfte,  :RTIVA, :RTICA, :TRM
            DO
            BEGIN
            if ((MONEDA <> 0) AND (TRM <> 0)) then
                PROVISIONAL = PROVISIONAL / TRM;
            if (:descnt_prov = 'NO') then
              SALDO = 0;
            else
              SALDO = :PROVISIONAL;
            SELECT TIDO_NOMCORTO FROM TIPO_DOCUMENTO WHERE TIDO_COD = :TIPO INTO :TIPONOM;
            /* CALCULE EL VENCIMIENTO DEL ULTIMO DOCUMENTO POSFECHADO */
            SELECT MAX(RPPA_FECHA) FROM recibo_provisional_pago WHERE RCPR_ID = :ID INTO :VENCE;
            DIAS = VENCE - FECHA;
            SUSPEND;
            END
        END
    if (AGRUPA = 'C') then
        BEGIN
        FOR SELECT DISTINCT COBR_COD FROM MOVIMIENTO_CLIENTES
            WHERE TERC_NIT = :NIT AND MVCL_SUCURSAL = :SUCURSAL AND MVCL_FECHA <= :FECHA AND
            MVCL_ABONO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            INTO :codcobr
            DO
            BEGIN
            OK = 'N';
            if (GRPINI = '') then
                BEGIN
                if ((CODCOBR IS NULL) or (CODCOBR >= :GRPINI AND CODCOBR <= :GRPFIN)) then
                    OK = 'S';
                END
            ELSE
                if (CODCOBR >= :GRPINI AND CODCOBR <= :GRPFIN) then
                    OK = 'S';
            if (OK = 'S') then
                BEGIN
                SELECT COBR_NOM FROM COBRADORES  WHERE COBR_COD = :CODCOBR INTO :NOMCOBR;
                /* BUSQUE EN SALDOS_DOC_CARTERA LOS QUE TENGAN SALDO > 0 */
                FOR SELECT MVCL_TIPOREF, MVCL_IDREF, MVCL_PREFREF, MVCL_NUMREF, MVCL_FECHA, MVCL_VENCE, MVCL_CONC
                    FROM MOVIMIENTO_CLIENTES WHERE TERC_NIT = :NIT AND MVCL_SUCURSAL = :SUCURSAL AND MVCL_FECHA <= :FECHA AND
                    MVCL_ABONO = 'N' AND COBR_COD = :codcobr AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) AND
                    ((:MONEDA = 0) or (MVCL_TRM <> 1))
                    INTO :TIPO, :ID, :PREFIJO, :NUMERO, :FECDOC, :VENCE, :CONCEPTO
                    DO
                    BEGIN
                    if ((inclanti = 'SI') or (TIPO <> 45)) then
                        BEGIN
                        EXECUTE PROCEDURE saldo_doc_cartera(TIPO, ID, FECHA, MONEDA) returning_values (SALDO);
                        if (SALDO <> 0) then
                            BEGIN
                            PROVISIONAL = 0;
                            EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'ANALISIS DE CARTERA CON FECHA FACTURA O VENCIMIENTO') RETURNING_VALUES (FOV);
                            if (FOV = 'FECHA') then
                               DIAS = FECHA - FECDOC;
                            ELSE
                              DIAS = FECHA - VENCE;
                            DISPONIBLE = DISPONIBLE - SALDO;
                            SELECT TIDO_NOMCORTO FROM TIPO_DOCUMENTO WHERE TIDO_COD = :TIPO INTO :TIPONOM;
                            if (TIPO = 41) then
                                SELECT NDCL_DTOFMONTO, NDCL_FECHADTO, NDCL_TRM FROM NOTAS_DEBITO_CLIENTES
                                    WHERE NDCL_ID = :ID INTO :DTOF, :FECDTO, :TRM;
                            if (TIPO = 42) then
                                SELECT 0, :FECDOC, 1 FROM NOTAS_CREDITO_CLIENTES
                                    WHERE NCCL_ID = :ID INTO :DTOF, :FECDTO, :TRM;
                            if (TIPO = 45) then
                                SELECT ANCL_DTOFMONTO, ANCL_DTOFECHA, ANCL_TRM FROM ANTICIPOS_CLIENTE
                                    WHERE ANCL_ID = :ID INTO :DTOF, :FECDTO, :TRM;
                            if (TIPO = 31) then
                                SELECT FACT_DTOFMONTO, FACT_DTOFFECHA, FACT_TRM FROM FACTURAS
                                    WHERE FACT_ID = :ID INTO :DTOF, :FECDTO, :TRM;
                            if (TIPO = 33) then
                                SELECT 0, :FECDOC, 1 FROM devoluciones_ventas
                                    WHERE DEVT_ID = :ID INTO :DTOF, :FECDTO, :TRM;
                            if (DTOF IS NULL) then
                                DTOF = 0;
                            if ((MONEDA <> 0) AND (TRM <> 0)) then
                                DTOF = DTOF / TRM;
                            if (DTOF <> 0) then
                                BEGIN
                                SELECT SUM(RCDE_DTOF) FROM RECIBOS_CAJA_DETALLE WHERE RCDE_IDDOC = :ID AND RCDE_TIPODOC = :TIPO INTO :DTOAPL;
                                if (DTOAPL IS NULL) then
                                    DTOAPL = 0;
                                DTOF = DTOF - DTOAPL;
                                /* SI YA SE VENCIO DEJELO EN CERO */
                                if (FECDTO < FECHA) then
                                    DTOF = 0;
                                END
                            SELECT SUM(SDCA_RTFTE - SDCA_ABRTFTE), SUM(SDCA_RTIVA - SDCA_ABRTIVA), SUM(SDCA_RTICA - SDCA_ABRTICA)
                                FROM SALDOS_DOC_CARTERA WHERE SDCA_TIPOREF = :TIPO AND SDCA_IDREF = :ID INTO :RTFTE, :RTIVA, :RTICA;
                            if (RTFTE IS NULL) then
                                RTFTE = 0;
                            if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) THEN
                                BEGIN
                                if (RTFTE > 0) then
                                    RTFTE = 0;
                                END
                            ELSE
                                BEGIN
                                if (RTFTE < 0) then
                                    RTFTE = 0;
                                END
                            if (FAUTORET <= FECDOC) then
                                RTFTE = 0;
                            if (RTIVA IS NULL) then
                                RTIVA = 0;
                            if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) THEN
                                BEGIN
                                if (RTIVA > 0) then
                                    RTIVA = 0;
                                END
                            ELSE
                                BEGIN
                                if (RTIVA < 0) then
                                    RTIVA = 0;
                                END
                            if (RTICA IS NULL) then
                                RTICA = 0;
                            if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) THEN
                                BEGIN
                                if (RTICA > 0) then
                                    RTICA = 0;
                                END
                            ELSE
                                BEGIN
                                if (RTICA < 0) then
                                    RTICA = 0;
                                END
                            /* SI TIENE NOTA AGREGUELA */
                            SELECT MAX(NOCL_FECHA) FROM NOTAS_CLIENTES WHERE TERC_NIT = :NIT AND CLSU_COD = :SUCURSAL AND NOCL_TIPODOC = :TIPO AND NOCL_IDDOC = :ID INTO :FECDTO;
                            if (FECDTO IS NOT NULL) then
                                BEGIN
                                SELECT cast(NOCL_FECHA as char(10)), NOCL_TEXTO FROM NOTAS_CLIENTES
                                    WHERE NOCL_ID = :IDNOTA INTO :FECNOTA, :AUXNOTA;
                                if (STRLEN(AUXNOTA) < 244) then
                                    NOTA = FECNOTA || ':' || AUXNOTA;
                                ELSE
                                    NOTA = AUXNOTA;
                                END
                            else
                                NOTA = '';
                            SUSPEND;
                            END  /* SALDO <> 0 */
                        END  /* NO ANTICIPO */
                    END  /* FOR */
                /* AGREGUE LOS RECIBOS PROVISIONALES CON SIGNO NEGATIVO */
                FOR SELECT 65, MAX(P.RCPR_ID), MAX(PREF_PRE), MAX(RCPR_NUMERO), MAX(RCPR_FECHA), MAX(RCPR_CONC), SUM(RPDE_ABONO * -1), SUM(RPDE_RTFTE*-1), SUM(RPDE_RTIVA*-1), SUM(RPDE_RTICA*-1), MAX(RCPR_TRM)
                    FROM RECIBO_PROVISIONAL P, recibo_provisional_detalle D
                    WHERE P.rcpr_id = D.rcpr_id AND P.TERC_NIT = :NIT AND P.VEND_COD = :codcobr AND RCPR_FECHA <= :FECHA AND RCPR_ANULADO = 'N' AND
                    ((RCPR_FECCRUCE IS NULL) or (RCPR_FECCRUCE > :FECHA)) AND RPDE_SUCURSAL = :SUCURSAL AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                    GROUP BY P.rcpr_id
                    INTO :TIPO, :ID, :PREFIJO, :NUMERO, :FECDOC, :CONCEPTO, :PROVISIONAL, :rtfte,  :RTIVA, :RTICA, :TRM
                    DO
                    BEGIN
                    if ((MONEDA <> 0) AND (TRM <> 0)) then
                        PROVISIONAL = PROVISIONAL / TRM;
                    if (:descnt_prov = 'NO') then
                      SALDO = 0;
                    else
                      SALDO = :PROVISIONAL;
                    SELECT TIDO_NOMCORTO FROM TIPO_DOCUMENTO WHERE TIDO_COD = :TIPO INTO :TIPONOM;
                    /* CALCULE EL VENCIMIENTO DEL ULTIMO DOCUMENTO POSFECHADO */
                    SELECT MAX(RPPA_FECHA) FROM recibo_provisional_pago WHERE RCPR_ID = :ID INTO :VENCE;
                    DIAS = VENCE - FECHA;
                    SUSPEND;
                    END
                END /* ok */
            END  /* FOR COBR */
        END  /* AGRUPA = C */
    END  /* FOR NIT */
SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER PROCEDURE REP_CARTERA_CONSOLIDADA(
    DESDE VARCHAR(20),
    HASTA VARCHAR(20),
    GRPINI VARCHAR(5),
    GRPFIN VARCHAR(5),
    FECHA DATE,
    ORDEN CHAR(1),
    AGRUPA CHAR(1),
    SUBEMPRESA INTEGER,
    GRUPCART INTEGER,
    MONEDA INTEGER)
RETURNS (
    NIT VARCHAR(20),
    NOMBRE VARCHAR(60),
    TELEFONO VARCHAR(40),
    CIUDAD VARCHAR(40),
    EMAIL VARCHAR(100),
    FAX VARCHAR(25),
    CEL VARCHAR(25),
    CODCLI VARCHAR(20),
    CODZONA VARCHAR(2),
    NOMZONA VARCHAR(60),
    CODCOBR INTEGER,
    NOMCOBR VARCHAR(60),
    SUCURSAL VARCHAR(10),
    DV CHAR(1),
    CODCIUD CHAR(5),
    NOMCIUD VARCHAR(60),
    SALDO NUMERIC(18,2),
    RTFTE NUMERIC(18,2),
    RTIVA NUMERIC(18,2),
    RTICA NUMERIC(18,2),
    DTOF NUMERIC(18,2),
    CUPO NUMERIC(18,2),
    DISPONIBLE NUMERIC(18,2),
    PROVISIONAL NUMERIC(18,2),
    CONTACTO VARCHAR(60),
    ESTADO CHAR(1),
    GRUPCOD INTEGER,
    GRUPNOM VARCHAR(30))
AS
declare variable NITINI VARCHAR(20);
declare variable NITFIN VARCHAR(20);
declare variable NOMINI VARCHAR(20);
declare variable NOMFIN VARCHAR(20);
declare variable OK CHAR(1);
declare variable PSALDO NUMERIC(18,2);
declare variable PRTFTE NUMERIC(18,2);
declare variable PRTIVA NUMERIC(18,2);
declare variable PRTICA NUMERIC(18,2);
declare variable PDTOF NUMERIC(18,2);
declare variable TIPO INTEGER;
declare variable ID INTEGER;
declare variable DTOAPL NUMERIC(18,2);
declare variable FECDTO DATE;
declare variable descnt_prov char(2);
declare variable AUTORET VARCHAR(10);
declare variable FAUTORET DATE;
declare variable FECDOC DATE;
declare variable INCLANTI CHAR(2);
declare variable TRM NUMERIC(18,2);
BEGIN
if (ORDEN = 'C') then
    BEGIN
    NITINI = DESDE;
    NITFIN = HASTA;
    NOMINI = '';
    NOMFIN = 'zz';
    END
ELSE
    BEGIN
    NOMINI = DESDE;
    NOMFIN = HASTA;
    NITINI = '';
    NITFIN = 'zz';
    END
  EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'DESCONTAR RECIBOS PROVISIONALES EN INFORMES DE CARTERA') RETURNING_VALUES (:descnt_prov);
  EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'INCLUIR ANTICIPOS DE CLIENTES EN REPORTES Y CONSULTAS DE CARTERA') returning_values (INCLANTI);
  EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'FECHA AUTORETENEDOR NO DESCONTAR RETENCIONES DEL SALDO PERO SI CONTABILIZARLAS') returning_values (AUTORET);
  if (AUTORET <> '') then
    FAUTORET = CAST(AUTORET AS DATE);
  else
    FAUTORET = '9999/12/31';
  /* Ubique el NIT */
  FOR select C.TERC_NIT, CLSU_NOMBRE, TERC_DV, CLSU_TEL, CLSU_CIUDAD, TERC_CONTACTO, S.COBR_COD, S.ZONA_COD, T.CIUD_COD, CLIE_CUPO, CLIE_ESTADO, CLCU_COD, C.GRCA_COD, TERC_EMAIL, TERC_FAX, TERC_CEL, CLIE_COD
    from terceros T, CLIENTES C, CLIENTE_SUCURSALES S
    where C.TERC_NIT = T.TERC_NIT AND TERC_CLIE = 'S' AND S.TERC_NIT = C.TERC_NIT AND C.TERC_NIT >= :NITINI AND C.TERC_NIT <= :NITFIN AND
        TERC_NOM >= :NOMINI AND TERC_NOM <= :NOMFIN AND ((:GRUPCART = 0) or (C.GRCA_COD = :GRUPCART))
    INTO :NIT, :NOMBRE, :DV, :TELEFONO, :CIUDAD, :CONTACTO, :CODCOBR, :CODZONA, :CODCIUD, :CUPO, :ESTADO, :SUCURSAL, :GRUPCOD, :EMAIL, :FAX, :CEL, :CODCLI
    DO  
    BEGIN
    SELECT GRCA_NOMBRE FROM GRUPO_CARTERA WHERE GRCA_COD = :GRUPCOD INTO :GRUPNOM;
    OK = 'N';
    if (AGRUPA = 'Z') then
        BEGIN
        if (GRPINI = '') then
            BEGIN
            if ((CODZONA IS NULL) or (CODZONA >= :GRPINI AND CODZONA <= :GRPFIN)) then
                OK = 'S';
            END
        ELSE
            if (CODZONA >= :GRPINI AND CODZONA <= :GRPFIN) then
                OK = 'S';
        END
    if (AGRUPA = 'I') then
        BEGIN
        if (GRPINI = '') then
            BEGIN
            if ((CODCIUD IS NULL) or (CODCIUD >= :GRPINI AND CODCIUD <= :GRPFIN)) then
                OK = 'S';
            END
        ELSE
            if (CODCIUD >= :GRPINI AND CODCIUD <= :GRPFIN) then
                OK = 'S';
        END
    if (AGRUPA = 'N') then
        OK = 'S';
        
    if (OK = 'S') then
        BEGIN
        if (CODCOBR IS NOT NULL) then
            SELECT COBR_NOM FROM COBRADORES  WHERE COBR_COD = :CODCOBR INTO :NOMCOBR;
        if (CODZONA IS NOT NULL) then
            SELECT ZONA_NOM FROM ZONAS WHERE ZONA_COD = :CODZONA INTO :NOMZONA;
        if (CODCIUD IS NOT NULL) then
            SELECT CIUD_NOM FROM CIUDADES  WHERE CIUD_COD = :CODCIUD INTO :NOMCIUD;
    
        SALDO = 0;
        RTFTE = 0;
        RTIVA = 0;
        RTICA = 0;
        DTOF = 0;
        /* BUSQUE EN SALDOS_DOC_CARTERA LOS QUE TENGAN SALDO > 0 */
        FOR SELECT MVCL_TIPOREF, MVCL_IDREF, MVCL_FECHA
          FROM MOVIMIENTO_CLIENTES WHERE TERC_NIT = :NIT AND MVCL_SUCURSAL = :SUCURSAL AND MVCL_FECHA <= :FECHA AND
          MVCL_ABONO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) AND ((:MONEDA = 0) or (MVCL_TRM <> 1))
          INTO :TIPO, :ID, :FECDOC
          DO
            BEGIN
            if ((inclanti = 'SI') or (TIPO <> 45)) then
                BEGIN
                EXECUTE PROCEDURE saldo_doc_cartera(TIPO, ID, FECHA, MONEDA) returning_values (PSALDO);
                if (PSALDO <> 0) then
                    BEGIN
                    if (TIPO = 41) then
                        SELECT NDCL_DTOFMONTO, NDCL_FECHADTO, NDCL_TRM FROM NOTAS_DEBITO_CLIENTES
                            WHERE NDCL_ID = :ID INTO :PDTOF, :FECDTO, :TRM;
                    if (TIPO = 42) then
                        SELECT 0, NCCL_FECHA, 1 FROM NOTAS_CREDITO_CLIENTES
                            WHERE NCCL_ID = :ID INTO :PDTOF, :FECDTO, :TRM;
                    if (TIPO = 45) then
                        SELECT ANCL_DTOFMONTO, ANCL_DTOFECHA, ANCL_TRM FROM ANTICIPOS_CLIENTE
                            WHERE ANCL_ID = :ID INTO :PDTOF, :FECDTO, :TRM;
                    if (TIPO = 31) then
                        SELECT FACT_DTOFMONTO, FACT_DTOFFECHA, FACT_TRM FROM FACTURAS
                            WHERE FACT_ID = :ID INTO :PDTOF, :FECDTO, :TRM;
                    if (TIPO = 33) then
                        SELECT 0, DEVT_FECHA, 1 FROM devoluciones_ventas
                            WHERE DEVT_ID = :ID INTO :PDTOF, :FECDTO, :TRM;
                    if (PDTOF IS NULL) then
                        PDTOF = 0;
                    if ((MONEDA <> 0) AND (TRM <> 0)) then
                        PDTOF = PDTOF / TRM;
                    if (PDTOF <> 0) then
                        BEGIN
                        SELECT SUM(RCDE_DTOF), MAX(RECA_TRM) FROM RECIBOS_CAJA_DETALLE D, recibos_caja R
                            WHERE R.reca_id = D.reca_id AND RCDE_IDDOC = :ID AND RCDE_TIPODOC = :TIPO INTO :DTOAPL, :TRM;
                        if (DTOAPL IS NULL) then
                            DTOAPL = 0;
                        if ((MONEDA <> 0) AND (TRM <> 0)) then
                           DTOAPL = DTOAPL / TRM;
                        PDTOF = PDTOF - DTOAPL;
                        /* SI YA SE VENCIO DEJELO EN CERO */
                        if (FECDTO < FECHA) then
                            PDTOF = 0;
                        END
                    if (MONEDA = 0) then
                        SELECT SUM(SDCA_RTFTE - SDCA_ABRTFTE), SUM(SDCA_RTIVA - SDCA_ABRTIVA), SUM(SDCA_RTICA - SDCA_ABRTICA)
                            FROM SALDOS_DOC_CARTERA WHERE SDCA_TIPOREF = :TIPO AND SDCA_IDREF = :ID
                            INTO :PRTFTE, :PRTIVA, :PRTICA;
                    ELSE
                        SELECT SUM((SDCA_RTFTE - SDCA_ABRTFTE)/SDCA_TRM), SUM((SDCA_RTIVA - SDCA_ABRTIVA)/SDCA_TRM), SUM((SDCA_RTICA - SDCA_ABRTICA)/SDCA_TRM)
                            FROM SALDOS_DOC_CARTERA WHERE SDCA_TIPOREF = :TIPO AND SDCA_IDREF = :ID
                            INTO :PRTFTE, :PRTIVA, :PRTICA;
                    if (PRTFTE IS NULL) then
                        PRTFTE = 0;
                    if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) THEN
                        BEGIN
                        if (PRTFTE > 0) then
                            PRTFTE = 0;
                        END
                    ELSE    
                        BEGIN
                        if (PRTFTE < 0) then
                            PRTFTE = 0;
                        END
                    if (PRTIVA IS NULL) then
                        PRTIVA = 0;
                    if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) THEN
                        BEGIN
                        if (PRTIVA > 0) then
                            PRTIVA = 0;
                        END
                    ELSE
                        BEGIN
                        if (PRTIVA < 0) then
                            PRTIVA = 0;
                        END
                    if (PRTICA IS NULL) then
                        PRTICA = 0;
                    if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) THEN
                        BEGIN
                        if (PRTICA > 0) then
                            PRTICA = 0;
                        END
                    ELSE
                        BEGIN
                        if (PRTICA < 0) then
                            PRTICA = 0;
                        END

                    if (FAUTORET <= FECDOC) then
                        PRTFTE = 0;

                    SALDO = SALDO + PSALDO;
                    RTFTE = RTFTE + PRTFTE;
                    RTIVA = RTIVA + PRTIVA;
                    RTICA = RTICA + PRTICA;
                    DTOF = DTOF + PDTOF;
                    END /* SALDO <> 0 */
                END  /* NO ANTICIPO */
            END
        DISPONIBLE = CUPO - SALDO;
        /* LOS RECIBOS PROVISIONALES */
        SELECT SUM(RPDE_ABONO), MAX(RCPR_TRM) FROM recibo_provisional P, recibo_provisional_detalle D
            WHERE P.rcpr_id = D.rcpr_id AND TERC_NIT = :NIT AND RPDE_SUCURSAL = :SUCURSAL AND ((:MONEDA = 0) or (RCPR_TRM <> 1)) AND
            RCPR_FECHA <= :FECHA AND RCPR_ANULADO = 'N' AND ((RCPR_FECCRUCE IS NULL) or (RCPR_FECCRUCE > :FECHA)) AND
            ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            INTO :provisional, :TRM;
        if ((MONEDA <> 0) AND (TRM <> 0)) then
            PROVISIONAL = PROVISIONAL / TRM;
           if (:descnt_prov = 'SI') then
             if (NOT :provisional is NULL) then
              SALDO = :saldo - :PROVISIONAL;
        SUSPEND;
        END
    if (AGRUPA = 'C') then
        BEGIN
        if (CODZONA IS NOT NULL) then
            SELECT ZONA_NOM FROM ZONAS WHERE ZONA_COD = :CODZONA INTO :NOMZONA;
        if (CODCIUD IS NOT NULL) then
            SELECT CIUD_NOM FROM CIUDADES  WHERE CIUD_COD = :CODCIUD INTO :NOMCIUD;
        FOR SELECT DISTINCT COBR_COD FROM MOVIMIENTO_CLIENTES WHERE TERC_NIT = :NIT AND
            MVCL_SUCURSAL = :SUCURSAL AND MVCL_FECHA <= :FECHA AND
            MVCL_ABONO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            INTO :codcobr
            DO
            begin
            OK = 'N';
            if (GRPINI = '') then
                BEGIN
                if ((CODCOBR IS NULL) or (CODCOBR >= :GRPINI AND CODCOBR <= :GRPFIN)) then
                    OK = 'S';
                END
            ELSE
                if (CODCOBR >= :GRPINI AND CODCOBR <= :GRPFIN) then
                    OK = 'S';
            if (OK = 'S') then
                BEGIN
                SELECT COBR_NOM FROM COBRADORES  WHERE COBR_COD = :CODCOBR INTO :NOMCOBR;

                SALDO = 0;
                RTFTE = 0;
                RTIVA = 0;
                RTICA = 0;
                DTOF = 0;
                /* BUSQUE EN SALDOS_DOC_CARTERA LOS QUE TENGAN SALDO > 0 */
                FOR SELECT MVCL_TIPOREF, MVCL_IDREF, MVCL_FECHA
                  FROM MOVIMIENTO_CLIENTES WHERE TERC_NIT = :NIT AND MVCL_SUCURSAL = :SUCURSAL AND ((:moneda = 0) or (mvcl_trm <> 1)) AND
                  MVCL_FECHA <= :FECHA AND COBR_COD = :codcobr AND MVCL_ABONO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                  INTO :TIPO, :ID, :FECDOC
                  DO
                    BEGIN
                    if ((inclanti = 'SI') or (TIPO <> 45)) then
                        BEGIN
                        EXECUTE PROCEDURE saldo_doc_cartera(TIPO, ID, FECHA, MONEDA) returning_values (PSALDO);
                        if (PSALDO <> 0) then
                            BEGIN
                            if (TIPO = 41) then
                                SELECT NDCL_DTOFMONTO, NDCL_FECHADTO, NDCL_TRM FROM NOTAS_DEBITO_CLIENTES
                                    WHERE NDCL_ID = :ID INTO :PDTOF, :FECDTO, :TRM;
                            if (TIPO = 42) then
                                SELECT 0, NCCL_FECHA, 1 FROM NOTAS_CREDITO_CLIENTES
                                    WHERE NCCL_ID = :ID INTO :PDTOF, :FECDTO, :TRM;
                            if (TIPO = 45) then
                                SELECT ANCL_DTOFMONTO, ANCL_DTOFECHA, ANCL_TRM FROM ANTICIPOS_CLIENTE
                                    WHERE ANCL_ID = :ID INTO :PDTOF, :FECDTO, :TRM;
                            if (TIPO = 31) then
                                SELECT FACT_DTOFMONTO, FACT_DTOFFECHA, FACT_TRM FROM FACTURAS
                                    WHERE FACT_ID = :ID INTO :PDTOF, :FECDTO, :TRM;
                            if (TIPO = 33) then
                                SELECT 0, DEVT_FECHA, 1 FROM devoluciones_ventas
                                    WHERE DEVT_ID = :ID INTO :PDTOF, :FECDTO, :TRM;
                            if (PDTOF IS NULL) then
                                PDTOF = 0;
                            if ((MONEDA <> 0) AND (TRM <> 0)) then
                                PDTOF = PDTOF / TRM;
                            if (PDTOF <> 0) then
                                BEGIN
                                SELECT SUM(RCDE_DTOF), MAX(RECA_TRM) FROM RECIBOS_CAJA_DETALLE D, RECIBOS_CAJA R
                                    WHERE R.reca_id = D.reca_id AND RCDE_IDDOC = :ID AND RCDE_TIPODOC = :TIPO INTO :DTOAPL, :TRM;
                                if (DTOAPL IS NULL) then
                                    DTOAPL = 0;
                                if ((MONEDA <> 0) AND (TRM <> 0)) then
                                   DTOAPL = DTOAPL / TRM;
                                PDTOF = PDTOF - DTOAPL;
                                /* SI YA SE VENCIO DEJELO EN CERO */
                                if (FECDTO < FECHA) then
                                    PDTOF = 0;
                                END
                            if (MONEDA = 0) then
                                SELECT SUM(SDCA_RTFTE - SDCA_ABRTFTE), SUM(SDCA_RTIVA - SDCA_ABRTIVA), SUM(SDCA_RTICA - SDCA_ABRTICA)
                                    FROM SALDOS_DOC_CARTERA WHERE SDCA_TIPOREF = :TIPO AND SDCA_IDREF = :ID
                                    INTO :PRTFTE, :PRTIVA, :PRTICA;
                            ELSE
                                SELECT SUM((SDCA_RTFTE - SDCA_ABRTFTE)/SDCA_TRM), SUM((SDCA_RTIVA - SDCA_ABRTIVA)/SDCA_TRM), SUM((SDCA_RTICA - SDCA_ABRTICA)/SDCA_TRM)
                                    FROM SALDOS_DOC_CARTERA WHERE SDCA_TIPOREF = :TIPO AND SDCA_IDREF = :ID
                                    INTO :PRTFTE, :PRTIVA, :PRTICA;
                            if (PRTFTE IS NULL) then
                                PRTFTE = 0;
                            if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) THEN
                                BEGIN
                                if (PRTFTE > 0) then
                                    PRTFTE = 0;
                                END
                            ELSE
                                BEGIN
                                if (PRTFTE < 0) then
                                    PRTFTE = 0;
                                END
                            if (PRTIVA IS NULL) then
                                PRTIVA = 0;
                            if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) THEN
                                BEGIN
                                if (PRTIVA > 0) then
                                    PRTIVA = 0;
                                END
                            ELSE
                                BEGIN
                                if (PRTIVA < 0) then
                                    PRTIVA = 0;
                                END
                            if (PRTICA IS NULL) then
                                PRTICA = 0;
                            if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) THEN
                                BEGIN
                                if (PRTICA > 0) then
                                    PRTICA = 0;
                                END
                            ELSE
                                BEGIN
                                if (PRTICA < 0) then
                                    PRTICA = 0;
                                END
                            if (FAUTORET <= FECDOC) then
                                PRTFTE = 0;
                            SALDO = SALDO + PSALDO;
                            RTFTE = RTFTE + PRTFTE;
                            RTIVA = RTIVA + PRTIVA;
                            RTICA = RTICA + PRTICA;
                            DTOF = DTOF + PDTOF;
                            END /* SALDO <> 0 */
                        END  /* NO ANTICIPO */
                    END
                DISPONIBLE = CUPO - SALDO;
                /* LOS RECIBOS PROVISIONALES */
                SELECT SUM(RPDE_ABONO), MAX(RCPR_TRM) FROM RECIBO_PROVISIONAL P, recibo_provisional_detalle D
                    WHERE P.rcpr_id = D.rcpr_id AND TERC_NIT = :NIT AND RPDE_SUCURSAL = :SUCURSAL AND ((:MONEDA = 0) or (RCPR_TRM <> 1)) AND
                    VEND_COD = :CODCOBR AND RCPR_FECHA <= :FECHA AND RCPR_ANULADO = 'N' AND ((RCPR_FECCRUCE IS NULL) or (RCPR_FECCRUCE > :FECHA)) AND 
                    ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                    INTO :provisional, :TRM;
                if ((MONEDA <> 0) AND (TRM <> 0)) then
                    PROVISIONAL = PROVISIONAL / TRM;
                if (:descnt_prov = 'SI') then
                   if (NOT :provisional IS NULL) then
                    SALDO = :saldo - :PROVISIONAL;
                if (AUTORET = 'SI') then
                    BEGIN
                    RTFTE = 0;
                    RTIVA = 0;
                    RTICA = 0;
                    END
                SUSPEND;
                END  /* OK = S */
            END  /* FOR COBRADOR */
        END  /* AGRUPA = C */
    END  /* FOR NIT */
SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER PROCEDURE REP_CARTERA_NOTAS(
    DESDE VARCHAR(20),
    HASTA VARCHAR(20),
    GRPINI VARCHAR(5),
    GRPFIN VARCHAR(5),
    FECHA DATE,
    ORDEN CHAR(1),
    AGRUPA CHAR(1),
    SUBEMPRESA INTEGER,
    VENCEINI DATE,
    VENCEFIN DATE,
    GRUPCART INTEGER,
    MONEDA INTEGER)
RETURNS (
    NIT VARCHAR(20),
    NOMBRE VARCHAR(60),
    TELEFONO VARCHAR(40),
    CIUDAD VARCHAR(40),
    CODZONA VARCHAR(2),
    NOMZONA VARCHAR(60),
    CODCOBR INTEGER,
    NOMCOBR VARCHAR(60),
    SUCURSAL VARCHAR(10),
    DV CHAR(1),
    CODCIUD CHAR(5),
    NOMCIUD VARCHAR(60),
    SALDO NUMERIC(18,2),
    NOTA1 VARCHAR(256),
    NOTA2 VARCHAR(256),
    CUPO NUMERIC(18,2),
    DISPONIBLE NUMERIC(18,2),
    PROVISIONAL NUMERIC(18,2),
    CONTACTO VARCHAR(60),
    ESTADO CHAR(1),
    GRUPCOD INTEGER,
    GRUPNOM VARCHAR(30))
AS
declare variable NITINI VARCHAR(20);
declare variable NITFIN VARCHAR(20);
declare variable NOMINI VARCHAR(20);
declare variable NOMFIN VARCHAR(20);
declare variable OK CHAR(1);
declare variable PSALDO NUMERIC(18,2);
declare variable TIPO INTEGER;
declare variable ID INTEGER;
declare variable NOTA VARCHAR(277);
declare variable TIPODOC VARCHAR(8);
declare variable NUMDOC VARCHAR(10);
declare variable FECNOTA VARCHAR(10);
declare variable I INTEGER;
declare variable INCLANTI CHAR(2);
declare variable TRM NUMERIC(18,2);
BEGIN
if (ORDEN = 'C') then
    BEGIN
    NITINI = DESDE;
    NITFIN = HASTA;
    NOMINI = '';
    NOMFIN = 'zz';
    END
ELSE
    BEGIN
    NOMINI = DESDE;
    NOMFIN = HASTA;
    NITINI = '';
    NITFIN = 'zz';
    END
  EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'INCLUIR ANTICIPOS DE CLIENTES EN REPORTES Y CONSULTAS DE CARTERA') returning_values (INCLANTI);
  /* Ubique el NIT */
  FOR select T.TERC_NIT, CLSU_NOMBRE, TERC_DV, CLSU_TEL, CLSU_CIUDAD, TERC_CONTACTO, S.COBR_COD, S.ZONA_COD, CIUD_COD, CLIE_CUPO, CLIE_ESTADO, CLCU_COD, C.GRCA_COD
    from terceros T, CLIENTES C, CLIENTE_SUCURSALES S
    where C.TERC_NIT = T.TERC_NIT AND TERC_CLIE = 'S' AND S.TERC_NIT = C.TERC_NIT AND T.TERC_NIT >= :NITINI AND T.TERC_NIT <= :NITFIN AND
        TERC_NOM >= :NOMINI AND TERC_NOM <= :NOMFIN AND ((:GRUPCART = 0) or (C.GRCA_COD = :GRUPCART))
    INTO :NIT, :NOMBRE, :DV, :TELEFONO, :CIUDAD, :CONTACTO, :CODCOBR, :CODZONA, :CODCIUD, :CUPO, :ESTADO, :SUCURSAL, :GRUPCOD
    DO  
    BEGIN
    SELECT GRCA_NOMBRE FROM GRUPO_CARTERA WHERE GRCA_COD = :GRUPCOD INTO :GRUPNOM;
    OK = 'N';
    if (AGRUPA = 'Z') then
        BEGIN
        if (GRPINI = '') then
            BEGIN
            if ((CODZONA IS NULL) or (CODZONA >= :GRPINI AND CODZONA <= :GRPFIN)) then
                OK = 'S';
            END
        ELSE
            if (CODZONA >= :GRPINI AND CODZONA <= :GRPFIN) then
                OK = 'S';
        END
    if (AGRUPA = 'I') then
        BEGIN
        if (GRPINI = '') then
            BEGIN
            if ((CODCIUD IS NULL) or (CODCIUD >= :GRPINI AND CODCIUD <= :GRPFIN)) then
                OK = 'S';
            END
        ELSE
            if (CODCIUD >= :GRPINI AND CODCIUD <= :GRPFIN) then
                OK = 'S';
        END
    if (AGRUPA = 'N') then
        OK = 'S';
        
    if (OK = 'S') then
        BEGIN
        if (CODCOBR IS NOT NULL) then
            SELECT COBR_NOM FROM COBRADORES  WHERE COBR_COD = :CODCOBR INTO :NOMCOBR;
        if (CODZONA IS NOT NULL) then
            SELECT ZONA_NOM FROM ZONAS WHERE ZONA_COD = :CODZONA INTO :NOMZONA;
        if (CODCIUD IS NOT NULL) then
            SELECT CIUD_NOM FROM CIUDADES  WHERE CIUD_COD = :CODCIUD INTO :NOMCIUD;
    
        SALDO = 0;
        /* BUSQUE EN SALDOS_DOC_CARTERA LOS QUE TENGAN SALDO > 0 */
        FOR SELECT MVCL_TIPOREF, MVCL_IDREF
          FROM MOVIMIENTO_CLIENTES WHERE TERC_NIT = :NIT AND MVCL_SUCURSAL = :SUCURSAL AND MVCL_FECHA <= :FECHA AND
          MVCL_ABONO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) AND MVCL_VENCE >= :VENCEINI AND
          MVCL_VENCE <= :VENCEFIN AND ((:MONEDA = 0) or (MVCL_TRM <> 1))
          INTO :TIPO, :ID
          DO
            if ((inclanti = 'SI') or (TIPO <> 45)) then
                BEGIN
                EXECUTE PROCEDURE saldo_doc_cartera(TIPO, ID, FECHA, MONEDA) returning_values (PSALDO);
                if (PSALDO <> 0) then
                    SALDO = SALDO + PSALDO;
                END
        DISPONIBLE = CUPO - SALDO;
        /* LOS RECIBOS PROVISIONALES */
        SELECT SUM(RPDE_ABONO), MAX(RCPR_TRM) FROM RECIBO_PROVISIONAL P, recibo_provisional_detalle D
            WHERE P.rcpr_id = D.rcpr_id AND TERC_NIT = :NIT AND RPDE_SUCURSAL = :SUCURSAL AND ((:MONEDA = 0) or (RCPR_TRM <> 1)) AND
            RCPR_FECHA <= :FECHA AND RCPR_ANULADO = 'N' AND ((RCPR_FECCRUCE IS NULL) or (RCPR_FECCRUCE > :FECHA)) AND
            ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            INTO :provisional, :TRM;
        if ((MONEDA <> 0) AND (TRM <> 0)) then
            PROVISIONAL = PROVISIONAL / TRM;
        /* LAS NOTAS DE CLIENTES */
        I = 0;
        NOTA1 = '';
        NOTA2 = '';
        FOR SELECT CAST(NOCL_FECHA AS VARCHAR(10)), tido_nomcorto, NOCL_NUMDOC, NOCL_TEXTO
            FROM NOTAS_CLIENTES N, TIPO_DOCUMENTO T WHERE N.NOCL_TIPODOC = T.TIDO_COD AND TERC_NIT = :NIT
            AND N.TINO_COD = 3 AND N.CLSU_COD = :SUCURSAL
            ORDER BY NOCL_ID DESC INTO :FECNOTA, :TIPODOC, :NUMDOC, :NOTA
            DO
            BEGIN
            if (I = 0) then
                NOTA1 = NOTA;
            if (I = 1) then
                NOTA2 = NOTA;
            I = I + 1;
            END
        SUSPEND;
        END
    if (AGRUPA = 'C') then
        BEGIN
        if (CODZONA IS NOT NULL) then
            SELECT ZONA_NOM FROM ZONAS WHERE ZONA_COD = :CODZONA INTO :NOMZONA;
        if (CODCIUD IS NOT NULL) then
            SELECT CIUD_NOM FROM CIUDADES  WHERE CIUD_COD = :CODCIUD INTO :NOMCIUD;
        FOR SELECT DISTINCT COBR_COD FROM MOVIMIENTO_CLIENTES WHERE TERC_NIT = :NIT AND
            MVCL_SUCURSAL = :SUCURSAL AND MVCL_FECHA <= :FECHA AND
            MVCL_ABONO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) AND MVCL_VENCE >= :VENCEINI AND MVCL_VENCE <= :VENCEFIN
            INTO :codcobr
            DO
            begin
            OK = 'N';
            if (GRPINI = '') then
                BEGIN
                if ((CODCOBR IS NULL) or (CODCOBR >= :GRPINI AND CODCOBR <= :GRPFIN)) then
                    OK = 'S';
                END
            ELSE
                if (CODCOBR >= :GRPINI AND CODCOBR <= :GRPFIN) then
                    OK = 'S';
            if (OK = 'S') then
                BEGIN
                SELECT COBR_NOM FROM COBRADORES  WHERE COBR_COD = :CODCOBR INTO :NOMCOBR;

                SALDO = 0;
                /* BUSQUE EN SALDOS_DOC_CARTERA LOS QUE TENGAN SALDO > 0 */
                FOR SELECT MVCL_TIPOREF, MVCL_IDREF
                  FROM MOVIMIENTO_CLIENTES WHERE TERC_NIT = :NIT AND MVCL_SUCURSAL = :SUCURSAL AND
                  MVCL_FECHA <= :FECHA AND COBR_COD = :codcobr AND MVCL_ABONO = 'N' AND
                  ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) AND MVCL_VENCE >= :VENCEINI AND
                  MVCL_VENCE <= :VENCEFIN AND ((:MONEDA = 0) or (MVCL_TRM <> 1))
                  INTO :TIPO, :ID
                  DO
                    if ((inclanti = 'SI') or (TIPO <> 45)) then
                        BEGIN
                        EXECUTE PROCEDURE saldo_doc_cartera(TIPO, ID, FECHA, MONEDA) returning_values (PSALDO);
                        if (PSALDO <> 0) then
                            BEGIN
                            SALDO = SALDO + PSALDO;
                            END
                        END
                DISPONIBLE = CUPO - SALDO;
                /* LOS RECIBOS PROVISIONALES */
                SELECT SUM(RPDE_ABONO), MAX(RCPR_TRM) FROM RECIBO_PROVISIONAL P, recibo_provisional_detalle D
                    WHERE P.rcpr_id = D.rcpr_id AND TERC_NIT = :NIT AND RPDE_SUCURSAL = :SUCURSAL AND ((:MONEDA = 0) or (RCPR_TRM <> 1)) AND
                    VEND_COD = :CODCOBR AND RCPR_FECHA <= :FECHA AND RCPR_ANULADO = 'N' AND ((RCPR_FECCRUCE IS NULL) or (RCPR_FECCRUCE > :FECHA)) AND
                    ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                    INTO :provisional, :TRM;
                if ((MONEDA <> 0) AND (TRM <> 0)) then
                    PROVISIONAL = PROVISIONAL / TRM;
                /* LAS NOTAS DE CLIENTES */
                I = 0;
                NOTA1 = '';
                NOTA2 = '';
                FOR SELECT CAST(NOCL_FECHA AS VARCHAR(10)), tido_nomcorto, NOCL_NUMDOC, NOCL_TEXTO
                    FROM NOTAS_CLIENTES N, TIPO_DOCUMENTO T WHERE N.NOCL_TIPODOC = T.TIDO_COD AND TERC_NIT = :NIT
                    AND N.TINO_COD = 3 AND N.CLSU_COD = :SUCURSAL
                    ORDER BY NOCL_FECHA DESC INTO :FECNOTA, :TIPODOC, :NUMDOC, :NOTA
                    DO
                    BEGIN
                    if (I = 0) then
                        NOTA1 = NOTA;
                    if (I = 1) then
                        NOTA2 = NOTA;
                    I = I + 1;
                    END
                SUSPEND;
                END  /* OK = S */
            END  /* FOR COBRADOR */
        END  /* AGRUPA = C */
    END  /* FOR NIT */
SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

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

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER PROCEDURE VENCIDO_CLIENTE(
    NIT VARCHAR(20),
    FECHA DATE,
    SUCURSAL VARCHAR(10),
    BLOQ CHAR(1))
RETURNS (
    TIPO INTEGER,
    ID INTEGER,
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(6),
    SALDO NUMERIC(18,2),
    RTFTE NUMERIC(18,2),
    RTIVA NUMERIC(18,2),
    RTICA NUMERIC(18,2),
    DTOF NUMERIC(18,2),
    TIPONOM VARCHAR(8))
AS
DECLARE VARIABLE FEC DATE;
declare variable DB CHAR(1);
declare variable VENCE DATE;
declare variable AUTORET VARCHAR(10);
declare variable FAUTORET DATE;
declare variable FECDOC DATE;
declare variable DIAS INTEGER;
declare variable DIASBLOQ INTEGER;
BEGIN
EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'FECHA AUTORETENEDOR NO DESCONTAR RETENCIONES DEL SALDO PERO SI CONTABILIZARLAS') returning_values (AUTORET);
if (AUTORET <> '') then
    FAUTORET = CAST(AUTORET AS DATE);
else
    FAUTORET = '9999/12/31';
/* BUSQUE EN SALDOS_DOC_CARTERA LOS QUE TENGAN SALDO > 0 */
FOR SELECT MVCL_TIPOREF, MVCL_IDREF, MVCL_DEBITO, MVCL_PREFREF, MVCL_NUMREF, MVCL_VENCE, MVCL_FECHA
    FROM MOVIMIENTO_CLIENTES
    WHERE TERC_NIT = :NIT AND ((MVCL_SUCURSAL = :SUCURSAL) or (:SUCURSAL = 0)) AND MVCL_FECHA <= :FECHA AND MVCL_ABONO = 'N'
    INTO :TIPO, :ID, :DB, :PREFIJO, :NUMERO, :VENCE, :FECDOC
    DO
    BEGIN
    EXECUTE PROCEDURE saldo_doc_cartera(TIPO, ID, FECHA, 0) returning_values (SALDO);
    if ((SALDO <> 0) AND (VENCE < FECHA)) then
        BEGIN
        DIAS = fecha - vence;
        SELECT CLIE_DIASBLOQ FROM CLIENTES WHERE TERC_NIT = :NIT INTO :DIASBLOQ;
        if (diasbloq IS NULL) then
            diasbloq = 0;
        if ((BLOQ <> 'S') OR (DIAS > DIASBLOQ)) then
            BEGIN
            SELECT TIDO_NOMCORTO FROM TIPO_DOCUMENTO WHERE TIDO_COD = :TIPO INTO :TIPONOM;
            if (TIPO = 41) then
                SELECT NDCL_DTOFMONTO, NDCL_FECHADTO FROM NOTAS_DEBITO_CLIENTES WHERE NDCL_ID = :ID INTO :DTOF, :FEC;
            if (TIPO = 42) then
                SELECT 0, NCCL_FECHA FROM NOTAS_CREDITO_CLIENTES WHERE NCCL_ID = :ID INTO :DTOF, :FEC;
            if (TIPO = 45) then
                SELECT ANCL_DTOFMONTO, ANCL_DTOFECHA FROM ANTICIPOS_CLIENTE WHERE ANCL_ID = :ID INTO :DTOF, :FEC;
            if (TIPO = 31) then
                SELECT 0, :FECHA FROM FACTURAS WHERE FACT_ID = :ID INTO :DTOF, :FEC;
            if (TIPO = 33) then
                SELECT 0, :FECHA FROM devoluciones_ventas WHERE DEVT_ID = :ID INTO :DTOF, :FEC;
            if (FECHA > FEC) then
                DTOF = 0;
            if (DTOF IS NULL) then
                DTOF = 0;
            if (FAUTORET <= FECDOC) then
                BEGIN
                RTFTE = 0;
                RTIVA = 0;
                RTICA = 0;
                END
            ELSE
                BEGIN
                SELECT SUM(SDCA_RTFTE - SDCA_ABRTFTE), SUM(SDCA_RTIVA - SDCA_ABRTIVA), SUM(SDCA_RTICA - SDCA_ABRTICA)
                    FROM SALDOS_DOC_CARTERA WHERE SDCA_TIPOREF = :TIPO AND SDCA_IDREF = :ID INTO :RTFTE, :RTIVA, :RTICA;
                if (RTFTE IS NULL) then
                    RTFTE = 0;
                if (RTIVA IS NULL) then
                    RTIVA = 0;
                if (RTICA IS NULL) then
                    RTICA = 0;
                END
            SUSPEND;
            END
        END
    END
SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER PROCEDURE CUPO_DISPONIBLE(
    NIT VARCHAR(20),
    FECHA DATE,
    SUCURSAL VARCHAR(10))
RETURNS (
    DISPONIBLE NUMERIC(18,2))
AS
declare variable SALDO NUMERIC(18,2);
begin
SELECT CLIE_CUPO FROM CLIENTES WHERE TERC_NIT = :NIT INTO :DISPONIBLE;
if (DISPONIBLE IS NULL) then
    DISPONIBLE = 0;
SELECT SUM(SALDO) FROM VENCIDO_CLIENTE (:NIT, :FECHA, :SUCURSAL, 'N') INTO :SALDO;
if (SALDO IS NULL) then
    SALDO = 0;
DISPONIBLE = DISPONIBLE - SALDO;
suspend;
SUSPEND;
end
^

SET TERM ; ^

SET TERM ^ ;

ALTER TRIGGER FACTURAS_BI
AS
declare variable NUMERO VARCHAR(6);
declare variable AUTOM CHAR(1);
declare variable EXISTE CHAR(1);
DECLARE VARIABLE VALCUPO CHAR(10);
declare variable DISPONIBLE NUMERIC(18,2);
declare variable OK CHAR(1);
declare variable SITOT CHAR(2);
declare variable CODCOBR INTEGER;
declare variable CODVEND INTEGER;
declare variable contado char(1);
declare variable BLOQAUTO CHAR(2);
declare variable FECCONTA VARCHAR(8);
declare variable FECBLO VARCHAR(8);
declare variable FECSERVER CHAR(2);
declare variable PREGTASA CHAR(2);
BEGIN
EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION', 'DOCUMENTOS', 'INHABILITAR FECHA EN DOCUMENTOS') returning_values (:fecserver);
if (FECSERVER = 'SI') then
    NEW.fact_fecha = CAST ('NOW' AS DATE);
/* doble moneda */
if ((NEW.fact_trm IS NULL) OR (NEW.FACT_TRM = 0)) then
    NEW.fact_trm = 1;
EXECUTE PROCEDURE LEE_CONFIGURACION('GENERAL', 'GENERAL', 'PREGUNTAR TASA DE CAMBIO EN DOCUMENTOS DE CARTERA') returning_values (:pregtasa);
if (PREGTASA = 'SI') then
    BEGIN
    NEW.fact_dtomonto = NEW.fact_dtomonto * NEW.fact_trm;
    NEW.fact_comimonto = NEW.fact_comimonto * NEW.fact_trm;
    NEW.fact_adicional = NEW.fact_adicional * NEW.fact_trm;
    NEW.fact_ivamonto = NEW.fact_ivamonto * NEW.fact_trm;
    NEW.fact_rtftemonto = NEW.fact_rtftemonto * NEW.fact_trm;
    NEW.fact_rtivamonto = NEW.fact_rtivamonto * NEW.fact_trm;
    NEW.fact_rticamonto = NEW.fact_rticamonto * NEW.fact_trm;
    NEW.fact_extra = NEW.fact_extra * NEW.fact_trm;
    NEW.fact_dtofmonto = NEW.fact_dtofmonto * NEW.fact_trm;
    NEW.fact_total = NEW.fact_total * NEW.fact_trm;
    NEW.fact_dtoit1 = NEW.fact_dtoit1 * NEW.fact_trm;
    NEW.fact_dtoit2 = NEW.fact_dtoit2 * NEW.fact_trm;
    NEW.fact_dtoit3 = NEW.fact_dtoit3 * NEW.fact_trm;
    END
EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION', 'POS', 'CAMBIAR FECHA DE BLOQUEO AUTOMATICAMENTE AL CAMBIAR FECHA DE LA FACTURA') RETURNING_VALUES (:bloqauto);
if (bloqauto = 'SI') then
    BEGIN
    EXECUTE PROCEDURE LEE_CONFIGURACION ('CONTABILIDAD', 'GENERAL', 'FECHA DE BLOQUEO') RETURNING_VALUES (:FECBLO);
    EXECUTE PROCEDURE fecha_a_conta (NEW.fact_fecha) returning_values (:FECCONTA);
    if (FECBLO > FECCONTA) then
        EXCEPTION CONTABILIDAD_BLOQUEADA;
    if (FECBLO < FECCONTA) then
        UPDATE CONFIGURACION
            SET CONF_VALOR = :FECCONTA
            WHERE (CONF_MODULO = 'CONTABILIDAD') AND (CONF_CATEGORIA = 'GENERAL') AND (CONF_PROPIEDAD = 'FECHA DE BLOQUEO');
    END
OK = 'S';
EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'ACCION A TOMAR SI EL CUPO DE CREDITO ES INSUFICIENTE') RETURNING_VALUES (:VALCUPO);
select auto_contado from autorizaciones where pref_pre = new.pref_pre and tido_cod = 31 into :contado;
if (contado='N') then
BEGIN
  IF (VALCUPO = 'PROHIBIR') THEN
  BEGIN
  OK = 'N';
  /* VERIFIQUE EL CUPO DE CREDITO */
  execute procedure cupo_disponible(new.TERC_NIT, NEW.fact_fecha, NEW.fact_sucursal) returning_values (:DISPONIBLE);
  if (DISPONIBLE >= NEW.FACT_TOTAL) then
    OK = 'S';
  END
END
IF (OK = 'S') THEN
  begin
  /* calcule la comision */
  EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION', 'VENDEDORES', 'COMISIONES EN VENTA INCLUYENDO IMPUESTOS') returning_values (:SITOT);
  if ((NEW.fact_comiporc IS NULL) or (NEW.fact_comiporc = 0)) THEN
    BEGIN
    if (SITOT = 'SI') then
      SELECT MAX(COMI_PORC) FROM comisiones WHERE VEND_COD = NEW.vend_cod AND
        COMI_INICIAL <= NEW.fact_total AND COMI_FINAL >= NEW.fact_total
        INTO NEW.fact_comiporc;
    else
      SELECT MAX(COMI_PORC) FROM comisiones WHERE VEND_COD = NEW.vend_cod AND
        COMI_INICIAL <= (NEW.fact_total -NEW.fact_ivamonto) AND COMI_FINAL >= (NEW.fact_total -NEW.fact_ivamonto)
        INTO NEW.fact_comiporc;
    if (NEW.fact_comiporc IS NULL) then
        NEW.fact_comiporc = 0;
    END
  if (SITOT = 'SI') then
      NEW.fact_comimonto = NEW.fact_total * NEW.fact_comiporc / 100;
  ELSE
      NEW.fact_comimonto = (NEW.fact_total -NEW.fact_ivamonto) * NEW.fact_comiporc / 100;

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

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

select auto_numero from autorizaciones where auto_inicial <= new.fact_numero and auto_final >= new.fact_numero and auto_fecha <= new.fact_fecha and auto_vence >= new.fact_fecha and pref_pre = new.pref_pre into new.auto_numero;
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER TRIGGER PEDIDOS_BI
AS
declare variable NUMERO VARCHAR(6);
declare variable AUTOM CHAR(1);
declare variable EXISTE CHAR(1);
/*DECLARE VARIABLE VALCUPO CHAR(10);*/
declare variable CUPOPED CHAR(10);
declare variable DISPONIBLE NUMERIC(18,2);
declare variable OK CHAR(1);
declare variable FECSERVER CHAR(2);
BEGIN
EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION', 'DOCUMENTOS', 'INHABILITAR FECHA EN DOCUMENTOS') returning_values (:fecserver);
if (FECSERVER = 'SI') then
    NEW.pedi_fecha = CAST ('NOW' AS DATE);
OK = 'S';
/*EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'ACCION A TOMAR SI EL CUPO DE CREDITO ES INSUFICIENTE') RETURNING_VALUES (:VALCUPO);*/
EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION','PEDIDOS','VALIDAR CUPO DE CREDITO EN EL PEDIDO') RETURNING_VALUES (:CUPOPED);
IF (CUPOPED = 'PROHIBIR') THEN /*AND (CUPOPED = 'SI')) THEN*/
  BEGIN
  OK = 'N';
  /* VERIFIQUE EL CUPO DE CREDITO */
  execute procedure cupo_disponible(new.TERC_NIT, NEW.pedi_fecha, NEW.pedi_sucursal) returning_values (:DISPONIBLE);
  if (DISPONIBLE >= NEW.pedi_total) then
    OK = 'S';
  END
IF (OK = 'S') THEN
  begin
  if (NEW.NUMOK = 'N') then
    BEGIN
    /* Actualice el contador del prefijo */
    SELECT PREF_ACTUAL, PREF_AUTO FROM PREFIJOS WHERE TIDO_COD = 34 AND PREF_PRE = NEW.PREF_PRE INTO :NUMERO, :AUTOM;
    /* ACTUALICE EL NUMERO EN COMPROBANTE_ENCABEZADO  */
    if (AUTOM = 'S') then
        BEGIN
        NEW.PEDI_NUMERO = NUMERO;
        NUMERO = CAST((CAST(NUMERO AS INTEGER) + 1) AS CHAR(6));
        UPDATE PREFIJOS
          SET PREF_ACTUAL = :NUMERO
          WHERE TIDO_COD = 34 AND PREF_PRE = NEW.PREF_PRE;
        END
    ELSE
        BEGIN
        if (CAST(NUMERO AS INTEGER) = CAST(NEW.PEDI_NUMERO AS INTEGER)) then
            UPDATE PREFIJOS
                SET PREF_ACTUAL = CAST((CAST(PREF_ACTUAL AS INTEGER) + 1) AS CHAR(6))
                WHERE TIDO_COD = 34 AND PREF_PRE = NEW.PREF_PRE;
        END
    EXECUTE PROCEDURE COMPLETA_CEROS (NEW.PEDI_numero) returning_values (NEW.PEDI_numero);
    NEW.NUMOK = 'S';
    END
  /* Verifique que el numero no existe previamente */
  EXISTE = 'N';
  SELECT 'S' FROM PEDIDOS WHERE PREF_PRE = NEW.PREF_PRE AND PEDI_NUMERO = NEW.PEDI_NUMERO INTO :EXISTE;
  if (EXISTE = 'S') then
    EXCEPTION DOCUMENTO_REGISTRADO;
  END
else
  begin
  EXCEPTION CUPO_INSUFICIENTE;
  end
if ((new.PEDI_TOTAL-new.PEDI_IVAMONTO+new.PEDI_DTOMONTO-new.PEDI_ADICIONAL) = 0) then
    NEW.PEDI_FACTOR = 1;
else
    NEW.PEDI_FACTOR = (new.PEDI_TOTAL-new.PEDI_IVAMONTO)/(new.PEDI_TOTAL-new.PEDI_IVAMONTO+new.PEDI_DTOMONTO-new.PEDI_ADICIONAL);
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER PROCEDURE MOVIMIENTO_CARTERA_DESDE_HASTA(
    NIT VARCHAR(20),
    DESDE DATE,
    HASTA DATE,
    EMPSUCURSAL INTEGER,
    MONEDA INTEGER)
RETURNS (
    INICIAL NUMERIC(18,2),
    TIPODOC VARCHAR(8),
    IDDOC INTEGER,
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    CONCEPTO VARCHAR(60),
    DEBITO NUMERIC(18,2),
    CREDITO NUMERIC(18,2),
    SALDO NUMERIC(18,2),
    NOMBRE VARCHAR(60),
    RTFTE NUMERIC(18,2),
    RTIVA NUMERIC(18,2),
    RTICA NUMERIC(18,2),
    SUCURSAL VARCHAR(10),
    RECPROV_ID INTEGER,
    RECIPROV CHAR(1))
AS
declare variable DB CHAR(1);
declare variable AB CHAR(1);
declare variable RETES CHAR(2);
declare variable tipo integer;
declare variable TRM NUMERIC(18,2);
BEGIN
  /* Ubique el NIT */
  select terc_nom from terceros where terc_nit = :NIT INTO :NOMBRE;
  DESDE = DESDE - 1;
  INICIAL = 0;
  FOR SELECT MVCL_TIPOREF, MVCL_IDREF FROM MOVIMIENTO_CLIENTES
    WHERE TERC_NIT = :NIT AND MVCL_FECHA <= :DESDE AND MVCL_ABONO = 'N' AND
    ((:empsucursal = 0) or (SUCU_ID = :empsucursal)) AND ((:MONEDA = 0) or (MVCL_TRM <> 1))
    INTO :TIPODOC, :IDDOC
    DO
    BEGIN
    EXECUTE PROCEDURE saldo_doc_cartera(TIPODOC, IDDOC, DESDE, MONEDA) returning_values (SALDO);
    if (SALDO <> 0) then
        INICIAL = INICIAL + SALDO;
    END
  DESDE = DESDE + 1;
  SALDO = INICIAL;
  EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'DESCONTAR RETENCIONES POR CAUSACION') returning_values(:RETES);
  FOR select tido_nomcorto, MVCL_TIPOREF, mvcl_idref, mvcl_prefref, mvcl_numref, mvcl_fecha, mvcl_conc, mvcl_monto, mvcl_debito, mvcl_rtefte, mvcl_rteiva, mvcl_rteica, mvcl_abono, mvcl_sucursal, MVCL_TRM
    from movimiento_clientes m, tipo_documento t
    where m.mvcl_tiporef = t.tido_cod and terc_nit = :NIT and mvcl_fecha >= :DESDE and mvcl_fecha <= :HASTA and mvcl_tiporef <> 45 AND
    ((SUCU_ID = :EMPSUCURSAL) or (:EMPSUCURSAL = 0)) AND ((:MONEDA = 0) or (MVCL_TRM <> 1))
    order by mvcl_fecha, mvcl_tiporef
    into :TIPODOC,:tipo,  :IDDOC, :PREFIJO, :NUMERO, :FECHA, :CONCEPTO, :DEBITO, :DB, :RTFTE, :RTIVA, :RTICA, :AB, :SUCURSAL, :TRM
    DO
    BEGIN
    if (DB = 'N') then
        BEGIN
        if (AB = 'S') then
            if (RETES = 'SI') then
                CREDITO = DEBITO;
            ELSE
                CREDITO = DEBITO + RTFTE + RTIVA + RTICA;
        ELSE
            if (RETES = 'SI') then
                CREDITO = DEBITO - RTFTE - RTIVA - RTICA;
            ELSE
                CREDITO = DEBITO;
        DEBITO = 0;
        END
    ELSE
        BEGIN
        if (RETES = 'SI') then
            DEBITO = DEBITO - RTFTE - RTIVA - RTICA;
        CREDITO = 0;
        END
    if ((MONEDA <> 0) AND (TRM <> 0)) then
        BEGIN
        DEBITO = DEBITO / TRM;
        CREDITO = CREDITO / TRM;
        RTFTE = RTFTE / TRM;
        RTIVA = RTIVA / TRM;
        RTICA = RTICA / TRM;
        END
    SALDO = SALDO + DEBITO - CREDITO;
    /* IDENTIFICAR SI EL DOCUMENTO TIENE RECIBO PROVISIONAL*/
    recprov_id = 0;
    SELECT max(RCPR_ID) FROM recibo_provisional_detalle WHERE RPDE_IDDOC = :iddoc  AND RPDE_TIPODOC = :TIPO and RPDE_ANULADO = 'N' INTO :recprov_id;
    if (recprov_id is null) then
      BEGIN
       reciprov = 'N';
      end
    ELSE
      begin
       reciprov = 'S';
      END
    SUSPEND;
    END
SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER PROCEDURE REGISTRA_RECIBOS_CONTADO(
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    PREFAC VARCHAR(4),
    MONTO NUMERIC(18,2))
AS
declare variable id integer;
declare variable idr integer;
declare variable NIT VARCHAR(20);
declare variable punto integer;
declare variable caja integer;
declare variable vend integer;
begin
for select fact_id, f.pref_pre, fact_numero, fact_fecha, vend_cod, terc_nit, a.auto_prefrdc, ptvt_id from facturas f, autorizaciones a
    where f.pref_pre = a.pref_pre and a.auto_contado = 'S' and fact_fecha >= :fecini and fact_fecha <= :fecfin
    into :id, :prefac, :numero, :fecha, :vend, :NIT, :PREF, :punto
    do
    begin
    select caja_id from punto_venta where ptvt_id = :punto into :caja;
    execute procedure saldo_doc_cartera(31, :id, cast('now' as date), 0) returning_values (:monto);
    if (monto <> 0) then
        begin
        idr = gen_id(id_recicaja, 1);
        insert into recibos_caja (reca_id, caja_id, tido_cod, pref_pre, reca_numero, reca_fecha, reca_conc, reca_monto,
            reca_rtftemonto, reca_rtivamonto, reca_rticamonto, reca_dtof, reca_obs, terc_nit, reca_nomterc, reca_anulado,
            reca_transmit, cobr_cod, numok)
            values (:idr, :caja, 61, :pref, :numero, :fecha, 'CANCELA FACTURA CONTADO No. ' || :prefac || :numero,  :MONTO,
            0, 0, 0, 0, NULL, :NIT, 'VENTAS CONTADO', 'N', 'N', :vend, 'N');
        insert into recibos_caja_detalle (reca_id, rcde_item, rcde_tipodoc, rcde_iddoc, rcde_prefijo, rcde_numero, rcde_abono,
            rcde_rtfte, rcde_rtiva, rcde_rtica, rcde_dtof, rcde_anulado, rcde_transmit, rcde_comip, rcde_sucursal)
            values (:idr, 1, 31, :id, :prefac, :numero, :monto, 0, 0, 0, 0, 'N', 'N', '', '01');
        insert into recibos_caja_pago (reca_id, rcpa_item, fopa_id, rcpa_banco, rcpa_cuenta, rcpa_numero, rcpa_fecha, rcpa_monto,
            rcpa_anulado, rcpa_transmit, rcpa_ivamonto)
            values (:idr, 1, 1, null, null, null, :fecha, :monto, 'N', 'N', 0);
        suspend;
        end
    end
SUSPEND;
end
^

SET TERM ; ^

ALTER TABLE APLICACION_CLIENTE
ADD APCL_TRM T_MONTO;
SET TERM ^ ;

CREATE OR ALTER TRIGGER APLICACION_CLIENTE_BI FOR APLICACION_CLIENTE
ACTIVE BEFORE INSERT POSITION 0
AS
declare variable NUMERO VARCHAR(6);
declare variable AUTOM CHAR(1);
declare variable EXISTE CHAR(1);
BEGIN
if (NEW.numok = 'N') then
  BEGIN
  /* Actualice el contador del prefijo */
  SELECT PREF_ACTUAL, PREF_AUTO FROM PREFIJOS WHERE TIDO_COD = NEW.TIDO_COD AND PREF_PRE = NEW.PREF_PRE INTO :NUMERO, :AUTOM;
  /* ACTUALICE EL NUMERO EN COMPROBANTE_ENCABEZADO  */
  if (AUTOM = 'S') then
    BEGIN
    NEW.APCL_NUMERO = NUMERO;
    NUMERO = CAST((CAST(NUMERO AS INTEGER) + 1) AS CHAR(6));
    UPDATE PREFIJOS
      SET PREF_ACTUAL = :NUMERO
    WHERE TIDO_COD = NEW.TIDO_COD AND PREF_PRE = NEW.PREF_PRE;
    END
  ELSE
    BEGIN
    if (CAST(NUMERO AS INTEGER) = CAST(NEW.APCL_NUMERO AS INTEGER)) then
        UPDATE PREFIJOS
          SET PREF_ACTUAL = CAST((CAST(PREF_ACTUAL AS INTEGER) + 1) AS CHAR(6))
        WHERE TIDO_COD = NEW.TIDO_COD AND PREF_PRE = NEW.PREF_PRE;
    END
  EXECUTE PROCEDURE completa_ceros (NEW.APCL_numero) returning_values (New.apcl_numero);
  NEW.numok = 'S';
  END
/* Verifique que el numero no existe previamente */
EXISTE = 'N';
SELECT 'S' FROM APLICACION_CLIENTE WHERE PREF_PRE = NEW.PREF_PRE AND APCL_NUMERO = NEW.APCL_NUMERO INTO :EXISTE;
if (EXISTE = 'S') then
    EXCEPTION DOCUMENTO_REGISTRADO;

if ((NEW.apcl_trm IS NULL) OR (NEW.APCL_TRM = 0)) then
    NEW.apcl_trm = 1;
END
^

SET TERM ; ^

ALTER TABLE APLICACION_CLIENTE_DETALLE
ADD ACDE_DIFCAMBIO T_MONTO;

SET TERM ^ ;

CREATE OR ALTER TRIGGER APLICACION_CLIENTE_DETALLE_BI FOR APLICACION_CLIENTE_DETALLE
ACTIVE BEFORE INSERT POSITION 0
as
declare variable PREGTASA CHAR(2);
declare variable TRM NUMERIC(18,2);
declare variable SALDO NUMERIC(18,2);
declare variable SALDOM NUMERIC(18,2);
declare variable RETES CHAR(2);
begin
/* SI TRM <> 1 CONVIERTA A PESOS LOS VALORES */
EXECUTE PROCEDURE LEE_CONFIGURACION('GENERAL', 'GENERAL', 'PREGUNTAR TASA DE CAMBIO EN DOCUMENTOS DE CARTERA') returning_values (:pregtasa);
if (PREGTASA = 'SI') then
    BEGIN
    SELECT APCL_TRM FROM aplicacion_cliente WHERE APCL_ID = NEW.apcl_id INTO :TRM;
    NEW.acde_aplicado = NEW.acde_aplicado * :trm;
    NEW.acde_rtfte = NEW.acde_rtfte * :trm;
    NEW.acde_rtiva = NEW.acde_rtiva * :trm;
    NEW.acde_rtica = NEW.acde_rtica * :trm;
    /* VERIFIQUE LOS SALDOS SI LLEVE LA DIFERENCIA COMO DIF EN CAMBIO */
    execute procedure lee_configuracion('CARTERA', 'SALDOS', 'DESCONTAR RETENCIONES POR CAUSACION') returning_values (RETES);
    execute procedure saldo_doc_cartera(new.acde_tipodoc, new.acde_iddoc, '9999/12/31', 0) returning_values(saldo);
    if (SALDO < 0) then
        BEGIN
        if (RETES = 'SI') then
            begin
            if (saldo > NEW.acde_aplicado) then
                BEGIN
                execute procedure saldo_doc_cartera(new.acde_tipodoc, new.acde_iddoc, '9999/12/31', 1) returning_values(saldoM);
                if (saldoM > (NEW.acde_aplicado/:TRM)) then
                    EXCEPTION DOCUMENTO_ABONO_MAYOR 'EL SALDO DEL DOCUMENTO ' || NEW.acde_prefijo || NEW.acde_numero || ' ES INSUFICIENTE.';
                else
                    BEGIN
                    NEW.acde_difcambio = :SALDO - NEW.acde_aplicado;
                    NEW.acde_aplicado = NEW.acde_aplicado - NEW.acde_difcambio;
                    END
                END
            end
        ELSE
            begin
            if (saldo > (NEW.acde_aplicado + NEW.acde_rtfte + NEW.acde_rtiva + NEW.acde_rtica)) then
                begin
                execute procedure saldo_doc_cartera(new.acde_tipodoc, new.acde_iddoc, '9999/12/31', 1) returning_values(saldoM);
                if (saldoM > ((NEW.acde_aplicado+NEW.acde_rtfte+NEW.acde_rtiva+NEW.acde_rtica)/:TRM)) then
                    EXCEPTION DOCUMENTO_ABONO_MAYOR 'EL SALDO DEL DOCUMENTO ' || NEW.acde_prefijo || NEW.acde_numero || ' ES INSUFICIENTE.';
                else
                    BEGIN
                    NEW.acde_difcambio = :SALDO - (NEW.acde_aplicado+NEW.acde_rtfte+NEW.acde_rtiva+NEW.acde_rtica);
                    NEW.acde_aplicado = NEW.acde_aplicado - NEW.acde_difcambio;
                    END
                end
            end
        END
    else
        BEGIN
        if (RETES = 'SI') then
            begin
            if (saldo < NEW.acde_aplicado) then
                BEGIN
                execute procedure saldo_doc_cartera(new.acde_tipodoc, new.acde_iddoc, '9999/12/31', 1) returning_values(saldoM);
                if (saldoM < (NEW.acde_aplicado/:TRM)) then
                    EXCEPTION DOCUMENTO_ABONO_MAYOR 'EL SALDO DEL DOCUMENTO ' || NEW.acde_prefijo || NEW.acde_numero || ' ES INSUFICIENTE.';
                else
                    BEGIN
                    NEW.acde_difcambio = :SALDO - NEW.acde_aplicado;
                    NEW.acde_aplicado = NEW.acde_aplicado - NEW.acde_difcambio;
                    END
                END
            end
        ELSE
            begin
            if (saldo < (NEW.acde_aplicado + NEW.acde_rtfte + NEW.acde_rtiva + NEW.acde_rtica)) then
                begin
                execute procedure saldo_doc_cartera(new.acde_tipodoc, new.acde_iddoc, '9999/12/31', 1) returning_values(saldoM);
                if (saldoM < ((NEW.acde_aplicado+NEW.acde_rtfte+NEW.acde_rtiva+NEW.acde_rtica)/:TRM)) then
                    EXCEPTION DOCUMENTO_ABONO_MAYOR 'EL SALDO DEL DOCUMENTO ' || NEW.acde_prefijo || NEW.acde_numero || ' ES INSUFICIENTE.';
                else
                    BEGIN
                    NEW.acde_difcambio = :SALDO - (NEW.acde_aplicado+NEW.acde_rtfte+NEW.acde_rtiva+NEW.acde_rtica);
                    NEW.acde_aplicado = NEW.acde_aplicado - NEW.acde_difcambio;
                    END
                end
            end
        END
    end
end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER APLICACION_CLIENTE_DETALLE_AI FOR APLICACION_CLIENTE_DETALLE
ACTIVE AFTER INSERT POSITION 0
AS
declare variable EXISTE CHAR(1);
declare variable FEC DATE;
declare variable NIT VARCHAR(20);
declare variable CONCEPTO VARCHAR(60);
declare variable PREFIJO VARCHAR(4);
declare variable NUMERO VARCHAR(6);
declare variable SALDO NUMERIC(18,2);
declare variable RETES CHAR(2);
declare variable SUCURSAL VARCHAR(10);
declare variable COBR INTEGER;
declare variable TRM NUMERIC(18,2);
BEGIN
if ((NEW.APCL_ID <> 0) and (new.acde_anulado = 'N')) then
    BEGIN
    /* Abone el documento referenciado */
    select PREF_PRE, APCL_NUMERO, apcl_fecha, APCL_CONCEPTO, TERC_NIT, APCL_SUCURSAL, COBR_COD, APCL_TRM
        from aplicacion_cliente where apcl_id = new.apcl_id
        into :PREFIJO, :NUMERO, :FEC, :CONCEPTO, :NIT, :SUCURSAL, :COBR, :TRM;
    /* valide que no se pase del saldo */
    execute procedure saldo_doc_cartera(new.acde_tipodoc, new.acde_iddoc, '9999/12/31', 0) returning_values(saldo);
    execute procedure lee_configuracion('CARTERA', 'SALDOS', 'DESCONTAR RETENCIONES POR CAUSACION') returning_values (RETES);
    if (SALDO < 0) then
        BEGIN
        if (RETES = 'SI') then
            begin
            if (saldo > NEW.acde_aplicado) then
                EXCEPTION DOCUMENTO_ABONO_MAYOR 'EL SALDO DEL DOCUMENTO ' || NEW.acde_prefijo || NEW.acde_numero || ' ES INSUFICIENTE.';
            end
        ELSE
            begin
            if (saldo > (NEW.acde_aplicado + NEW.acde_rtfte + NEW.acde_rtiva + NEW.acde_rtica)) then
                EXCEPTION DOCUMENTO_ABONO_MAYOR 'EL SALDO DEL DOCUMENTO ' || NEW.acde_prefijo || NEW.acde_numero || ' ES INSUFICIENTE.';
            end
        END
    else
        BEGIN
        if (RETES = 'SI') then
            begin
            if (saldo < NEW.acde_aplicado) then
                EXCEPTION DOCUMENTO_ABONO_MAYOR 'EL SALDO DEL DOCUMENTO ' || NEW.acde_prefijo || NEW.acde_numero || ' ES INSUFICIENTE.';
            end
        ELSE
            begin
            if (saldo < (NEW.acde_aplicado + NEW.acde_rtfte + NEW.acde_rtiva + NEW.acde_rtica)) then
                EXCEPTION DOCUMENTO_ABONO_MAYOR 'EL SALDO DEL DOCUMENTO ' || NEW.acde_prefijo || NEW.acde_numero || ' ES INSUFICIENTE.';
            end
        END
    select 'S' from saldos_doc_cartera where sdca_tiporef = new.acde_tipodoc and sdca_idref = new.acde_iddoc and sdca_fecha = :FEC into :EXISTE;
    if (Existe = 'S') then
        begin
        /* actualice el saldo del dia */
        UPDATE saldos_doc_cartera
            SET SDCA_ABONO = SDCA_ABONO + NEW.acde_aplicado,
                SDCA_ABRTFTE = SDCA_ABRTFTE + NEW.acde_RTFTE,
                SDCA_ABRTIVA = SDCA_ABRTIVA + NEW.acde_RTIVA,
                SDCA_ABRTICA = SDCA_ABRTICA + NEW.acde_RTICA,
                SDCA_TRM = :TRM
            WHERE SDCA_TIPOREF = NEW.ACDE_TIPODOC AND SDCA_IDREF = NEW.acde_IDDOC AND SDCA_FECHA = :FEC;
        END
    ELSE
        BEGIN
        /* Inserte un nuevo saldo diario */
        INSERT INTO SALDOS_DOC_CARTERA (SDCA_TIPOREF, SDCA_IDREF, SDCA_FECHA, TERC_NIT, SDCA_RTFTE, SDCA_RTIVA, SDCA_RTICA, SDCA_ABONO, SDCA_ABRTFTE, SDCA_ABRTIVA, SDCA_ABRTICA, SDCA_DEBITO, SDCA_MONTO, SDCA_TRM)
            VALUES (NEW.ACDE_TIPODOC, NEW.ACDE_IDDOC, :FEC, :NIT, 0, 0, 0, NEW.acde_aplicado, NEW.acde_rtfte, NEW.acde_rtiva, NEW.acde_rtica, 'N', 0, :TRM);
        END
    /* actualice el registro en mov_cliente (por si son varios items) */
    EXISTE = 'N';
    SELECT 'S' FROM MOVIMIENTO_CLIENTES WHERE MVCL_TIPOREF = 43 AND MVCL_IDREF = NEW.APCL_ID INTO :EXISTE;
    if (EXISTE = 'S') then
        begin
        UPDATE movimiento_clientes
            SET MVCL_MONTO = MVCL_MONTO + NEW.acde_aplicado,
                MVCL_RTEFTE = MVCL_RTEFTE + NEW.acde_rtfte,
                MVCL_RTEIVA = MVCL_RTEIVA + NEW.acde_rtiva,
                MVCL_RTEICA = MVCL_RTEICA + NEW.acde_rtica,
                MVCL_TRM = :TRM
            WHERE MVCL_TIPOREF = 43 AND MVCL_IDREF = NEW.APCL_ID;
        end
    ELSE
        INSERT INTO MOVIMIENTO_CLIENTES (MVCL_ID, TERC_NIT, MVCL_TIPOREF, MVCL_IDREF, MVCL_FECHA, MVCL_VENCE, MVCL_CONC, MVCL_MONTO, MVCL_RTEFTE, MVCL_RTEIVA, MVCL_RTEICA, MVCL_DEBITO, MVCL_ABONO, MVCL_PREFREF, MVCL_NUMREF, MVCL_SUCURSAL, COBR_COD, MVCL_TRM)
            VALUES (GEN_ID(ID_MOVCLI, 1), :NIT, 43, NEW.APCL_ID, :FEC, :FEC, :CONCEPTO, NEW.ACDE_APLICADO, NEW.ACDE_RTFTE, NEW.ACDE_RTIVA, NEW.ACDE_RTICA, 'N', 'S', :PREFIJO, :NUMERO, :SUCURSAL, :COBR, :TRM);
    end
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER APLICACION_CLIENTE_DETALLE_AU FOR APLICACION_CLIENTE_DETALLE
ACTIVE AFTER UPDATE POSITION 0
AS
declare variable EXISTE CHAR(1);
declare variable FEC DATE;
declare variable NIT VARCHAR(20);
declare variable CONCEPTO VARCHAR(60);
declare variable PREFIJO VARCHAR(4);
declare variable NUMERO VARCHAR(6);
declare variable SALDO NUMERIC(18,2);
declare variable RETES CHAR(2);
declare variable SUCURSAL VARCHAR(10);
declare variable COBR INTEGER;
declare variable TRM NUMERIC(18,2);
BEGIN
if ((old.apcl_id <> 0) and (old.acde_anulado = 'N')) then
    begin
    select apcl_fecha, apcl_trm from aplicacion_CLIENTE
        where apcl_id = old.apcl_id into :FEC, :TRM;
    UPDATE saldos_doc_cartera
        SET SDCA_ABONO = SDCA_ABONO - old.acde_aplicado,
        SDCA_ABRTFTE = SDCA_ABRTFTE - old.acde_RTFTE,
        SDCA_ABRTIVA = SDCA_ABRTIVA - old.acde_RTIVA,
        SDCA_ABRTICA = SDCA_ABRTICA - old.acde_RTICA
        WHERE SDCA_TIPOREF = OLD.ACDE_TIPODOC AND SDCA_IDREF = OLD.acde_IDDOC AND SDCA_FECHA = :FEC;
                    
    UPDATE movimiento_clientes
        SET MVCL_MONTO = MVCL_MONTO - OLD.acde_aplicado,
        MVCL_RTEFTE = MVCL_RTEFTE - OLD.acde_rtfte,
        MVCL_RTEIVA = MVCL_RTEIVA - OLD.acde_rtiva,
        MVCL_RTEICA = MVCL_RTEICA - OLD.acde_rtica
        WHERE MVCL_TIPOREF = 43 AND MVCL_IDREF = NEW.APCL_ID;
    end
if ((NEW.acde_anulado = 'N') AND (NEW.APCL_ID <> 0)) then
    BEGIN
    select PREF_PRE, APCL_NUMERO, apcl_fecha, APCL_CONCEPTO, TERC_NIT, APCL_SUCURSAL, COBR_COD, APCL_TRM
        from aplicacion_CLIENTE
        where apcl_id = new.apcl_id
        into :PREFIJO, :NUMERO, :FEC, :CONCEPTO, :NIT, :SUCURSAL, :COBR, :TRM;
    /* valide que no se pase del saldo */
    execute procedure saldo_doc_cartera(new.acde_tipodoc, new.acde_iddoc, '9999/12/31', 0) returning_values(saldo);
    execute procedure lee_configuracion('CARTERA', 'SALDOS', 'DESCONTAR RETENCIONES POR CAUSACION') returning_values (RETES);
    if (SALDO < 0) then
        BEGIN
        if (RETES = 'SI') then
            begin
            if (saldo > NEW.acde_aplicado) then
                EXCEPTION DOCUMENTO_ABONO_MAYOR;
            end
        ELSE
            begin
            if (saldo > (NEW.acde_aplicado + NEW.acde_rtfte + NEW.acde_rtiva + NEW.acde_rtica)) then
                EXCEPTION DOCUMENTO_ABONO_MAYOR;
            end
        END
    else
        BEGIN
        if (RETES = 'SI') then
            begin
            if (saldo < NEW.acde_aplicado) then
                EXCEPTION DOCUMENTO_ABONO_MAYOR;
            end
        ELSE
            begin
            if (saldo < (NEW.acde_aplicado + NEW.acde_rtfte + NEW.acde_rtiva + NEW.acde_rtica)) then
                EXCEPTION DOCUMENTO_ABONO_MAYOR;
            end
        END
        
    /* Abone el documento referenciado  */
    select 'S' from saldos_doc_cartera where sdca_tiporef = new.acde_tipodoc and sdca_idref = new.acde_iddoc and sdca_fecha = :FEC into :EXISTE;
    if (Existe = 'S') then
        /* actualice el saldo del dia */
        UPDATE saldos_doc_cartera
            SET SDCA_ABONO = SDCA_ABONO + NEW.acde_aplicado,
            SDCA_ABRTFTE = SDCA_ABRTFTE + NEW.acde_RTFTE,
            SDCA_ABRTIVA = SDCA_ABRTIVA + NEW.acde_RTIVA,
            SDCA_ABRTICA = SDCA_ABRTICA + NEW.acde_RTICA,
            SDCA_TRM = :TRM
        WHERE SDCA_TIPOREF = NEW.ACDE_TIPODOC AND SDCA_IDREF = NEW.acde_IDDOC AND SDCA_FECHA = :FEC;
    ELSE
        /* Inserte un nuevo saldo diario */
        INSERT INTO SALDOS_DOC_CARTERA (SDCA_TIPOREF, SDCA_IDREF, SDCA_FECHA, TERC_NIT, SDCA_RTFTE, SDCA_RTIVA, SDCA_RTICA, SDCA_ABONO, SDCA_ABRTFTE, SDCA_ABRTIVA, SDCA_ABRTICA, SDCA_DEBITO, SDCA_MONTO, SDCA_TRM)
            VALUES (NEW.ACDE_TIPODOC, NEW.ACDE_IDDOC, :FEC, :NIT, 0, 0, 0, NEW.acde_aplicado, NEW.acde_rtfte, NEW.acde_rtiva, NEW.acde_rtica, 'N', 0, :TRM);
            
    /* Registre o actualice el registro en movimiento */
    EXISTE = 'N';
    SELECT 'S' FROM MOVIMIENTO_CLIENTES WHERE MVCL_TIPOREF = 43 AND MVCL_IDREF = NEW.APCL_ID INTO :EXISTE;
    if (EXISTE = 'S') then
        begin
        UPDATE movimiento_clientes
            SET MVCL_MONTO = MVCL_MONTO + NEW.acde_aplicado,
            MVCL_RTEFTE = MVCL_RTEFTE + NEW.acde_rtfte,
            MVCL_RTEIVA = MVCL_RTEIVA + NEW.acde_rtiva,
            MVCL_RTEICA = MVCL_RTEICA + NEW.acde_rtica,
            MVCL_TRM = :TRM
        WHERE MVCL_TIPOREF = 43 AND MVCL_IDREF = NEW.APCL_ID;
        end
    ELSE
        INSERT INTO MOVIMIENTO_CLIENTES (MVCL_ID, TERC_NIT, MVCL_TIPOREF, MVCL_IDREF, MVCL_FECHA, MVCL_VENCE, MVCL_CONC, MVCL_MONTO, MVCL_RTEFTE, MVCL_RTEIVA, MVCL_RTEICA, MVCL_DEBITO, MVCL_ABONO, MVCL_PREFref, MVCL_NUMREF, MVCL_SUCURSAL, COBR_COD, MVCL_TRM)
            VALUES (GEN_ID(ID_MOVCLI, 1), :NIT, 43, NEW.APCL_ID, :FEC, :FEC, :CONCEPTO, NEW.ACDE_APLICADO, NEW.ACDE_RTFTE, NEW.ACDE_RTIVA, NEW.ACDE_RTICA, 'N', 'S', :PREFIJO, :NUMERO, :SUCURSAL, :COBR, :TRM);
    end
END
^

SET TERM ; ^

ALTER TABLE EGRESOS
ADD EGRE_TRM T_MONTO;

ALTER TABLE EGRESOS_CRUCEC
ADD EGCC_DIFCAMBIO T_MONTO;

ALTER TABLE EGRESOS_DETALLE
ADD EGDE_DIFCAMBIO T_MONTO;

SET TERM ^ ;

CREATE OR ALTER TRIGGER EGRESOS_CRUCEC_AI FOR EGRESOS_CRUCEC
ACTIVE AFTER INSERT POSITION 0
AS
declare variable EXISTE CHAR(1);
declare variable FEC DATE;
declare variable NIT VARCHAR(20);
declare variable CONCEPTO VARCHAR(60);
declare variable PREFIJO VARCHAR(4);
declare variable NUMERO VARCHAR(6);
declare variable SALDO NUMERIC(18,2);
declare variable RETES CHAR(2);
declare variable COBR INTEGER;
declare variable TRM NUMERIC(18,2);
BEGIN
if ((NEW.egre_id <> 0) and (new.egcc_anulado = 'N')) then
    BEGIN
    /* Abone el documento referenciado */
    select PREF_PRE, EGRE_NUMERO, EGRE_fecha, EGRE_CONC, TERC_NIT, EGRE_TRM from EGRESOS
        where EGRE_id = new.egre_id into :PREFIJO, :NUMERO, :FEC, :CONCEPTO, :NIT, :TRM;
    SELECT COBR_COD FROM cliente_sucursales WHERE TERC_NIT = :NIT AND CLCU_COD = NEW.egcc_sucursal INTO :COBR;
    /* valide que no se pase del saldo */
    execute procedure saldo_doc_cartera(new.egcc_tipodoc, new.egcc_iddoc, '9999/12/31',0) returning_values(saldo);
    execute procedure lee_configuracion('CARTERA', 'SALDOS', 'DESCONTAR RETENCIONES POR CAUSACION') returning_values (RETES);
    if (SALDO < 0) then
        BEGIN
        if (RETES = 'SI') then
            begin
            if (saldo > (NEW.egcc_abono + NEW.egcc_dtof)) then
                EXCEPTION DOCUMENTO_ABONO_MAYOR;
            end
        ELSE
            begin
            if (saldo > (NEW.egcc_abono + NEW.egcc_rtfte + NEW.egcc_rtiva + NEW.egcc_rtica + NEW.egcc_dtof)) then
                EXCEPTION DOCUMENTO_ABONO_MAYOR;
            end
        END
    else
        BEGIN
        if (RETES = 'SI') then
            begin
            if (saldo < (NEW.egcc_abono + NEW.egcc_dtof)) then
                EXCEPTION DOCUMENTO_ABONO_MAYOR;
            end
        ELSE
            begin
            if (saldo < (NEW.egcc_abono + NEW.egcc_rtfte + NEW.egcc_rtiva + NEW.egcc_rtica + NEW.egcc_dtof)) then
                EXCEPTION DOCUMENTO_ABONO_MAYOR;
            end
        END
    EXISTE = 'N';
    select 'S' from saldos_doc_cartera where sdca_tiporef = new.egcc_tipodoc and sdca_idref = new.egcc_iddoc and sdca_fecha = :FEC into :EXISTE;
    if (Existe = 'S') then
        begin
        /* actualice el saldo del dia */
        UPDATE saldos_doc_cartera
            SET SDCA_ABONO = SDCA_ABONO + NEW.egcc_abono + new.egcc_dtof,
                SDCA_ABRTFTE = SDCA_ABRTFTE + NEW.egcc_rtfte,
                SDCA_ABRTIVA = SDCA_ABRTIVA + NEW.egcc_rtiva,
                SDCA_ABRTICA = SDCA_ABRTICA + NEW.egcc_rtica,
                SDCA_TRM = :TRM
                WHERE SDCA_TIPOREF = NEW.egcc_tipodoc AND SDCA_IDREF = NEW.egcc_iddoc AND SDCA_FECHA = :FEC;
        END
    ELSE
        BEGIN
        /* Inserte un nuevo saldo diario */
        INSERT INTO SALDOS_DOC_CARTERA (SDCA_TIPOREF, SDCA_IDREF, SDCA_FECHA, TERC_NIT, SDCA_RTFTE, SDCA_RTIVA, SDCA_RTICA, SDCA_ABONO, SDCA_ABRTFTE, SDCA_ABRTIVA, SDCA_ABRTICA, SDCA_DEBITO, SDCA_MONTO, SDCA_TRM)
            VALUES (NEW.egcc_tipodoc, NEW.egcc_iddoc, :FEC, :NIT, 0, 0, 0, (NEW.egcc_abono+NEW.egcc_dtof), NEW.egcc_rtfte, NEW.egcc_rtiva, NEW.egcc_rtica, 'N', 0, :TRM);
        END
    /* actualice el registro en mov_cliente (por si son varios items) */
    EXISTE = 'N';
    SELECT 'S' FROM MOVIMIENTO_CLIENTES WHERE MVCL_TIPOREF = 62 AND MVCL_IDREF = NEW.egre_id AND MVCL_SUCURSAL = NEW.egcc_sucursal INTO :EXISTE;
    if (EXISTE = 'S') then
        begin
        UPDATE movimiento_clientes
            SET MVCL_MONTO = MVCL_MONTO + NEW.egcc_abono + NEW.egcc_dtof,
                MVCL_RTEFTE = MVCL_RTEFTE + NEW.egcc_rtfte,
                MVCL_RTEIVA = MVCL_RTEIVA + NEW.egcc_rtiva,
                MVCL_RTEICA = MVCL_RTEICA + NEW.egcc_rtica,
                MVCL_TRM = :TRM
            WHERE MVCL_TIPOREF = 62 AND MVCL_IDREF = NEW.egre_id;
        end
    ELSE
        INSERT INTO MOVIMIENTO_CLIENTES (MVCL_ID, TERC_NIT, MVCL_TIPOREF, MVCL_IDREF, MVCL_FECHA, MVCL_VENCE, MVCL_CONC, MVCL_MONTO, MVCL_RTEFTE, MVCL_RTEIVA, MVCL_RTEICA, MVCL_DEBITO, MVCL_ABONO, MVCL_PREFREF, MVCL_NUMREF, MVCL_SUCURSAL, COBR_COD, MVCL_TRM)
            VALUES (GEN_ID(ID_MOVCLI, 1), :NIT, 62, NEW.egre_id, :FEC, :FEC, :CONCEPTO, (NEW.egcc_abono+NEW.egcc_dtof), NEW.egcc_rtfte, NEW.egcc_rtiva, NEW.egcc_rtica, 'N', 'S', :PREFIJO, :NUMERO, NEW.egcc_sucursal, :COBR, :TRM);
    end
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER EGRESOS_CRUCEC_BI FOR EGRESOS_CRUCEC
ACTIVE BEFORE INSERT POSITION 0
as
declare variable PREGTASA CHAR(2);
declare variable TRM NUMERIC(18,2);
declare variable SALDO NUMERIC(18,2);
declare variable SALDOM NUMERIC(18,2);
declare variable RETES CHAR(2);
begin
if (NEW.egcc_sucursal IS NULL) then
    NEW.egcc_sucursal = '01';
/* SI TRM <> 1 CONVIERTA A PESOS LOS VALORES */
EXECUTE PROCEDURE LEE_CONFIGURACION('GENERAL', 'GENERAL', 'PREGUNTAR TASA DE CAMBIO EN DOCUMENTOS DE CARTERA') returning_values (:pregtasa);
if (PREGTASA = 'SI') then
    BEGIN
    SELECT EGRE_TRM FROM egresos WHERE EGRE_ID = NEW.egre_id INTO :TRM;
    NEW.egcc_abono = NEW.egcc_abono * :trm;
    NEW.egcc_rtfte = NEW.egcc_rtfte * :trm;
    NEW.egcc_rtiva = NEW.egcc_rtiva * :trm;
    NEW.egcc_rtica = NEW.egcc_rtica * :trm;
    NEW.egcc_dtof = NEW.egcc_dtof * :trm;
    /* VERIFIQUE LOS SALDOS Y LLEVE LA DIFERENCIA COMO DIF EN CAMBIO */
    execute procedure lee_configuracion('CARTERA', 'SALDOS', 'DESCONTAR RETENCIONES POR CAUSACION') returning_values (RETES);
    execute procedure saldo_doc_cartera(new.egcc_tipodoc, new.egcc_iddoc, '9999/12/31', 0) returning_values(saldo);
    if (SALDO < 0) then
        BEGIN
        if (RETES = 'SI') then
            begin
            if (saldo > NEW.egcc_abono) then
                BEGIN
                execute procedure saldo_doc_cartera(new.egcc_tipodoc, new.egcc_iddoc, '9999/12/31', 1) returning_values(saldoM);
                if (saldoM > (NEW.egcc_abono/:TRM)) then
                    EXCEPTION DOCUMENTO_ABONO_MAYOR 'EL SALDO DEL DOCUMENTO ' || NEW.egcc_prefijo || NEW.egcc_numero || ' ES INSUFICIENTE.';
                else
                    BEGIN
                    NEW.egcc_difcambio = :SALDO - NEW.egcc_abono;
                    NEW.egcc_abono = NEW.egcc_abono - NEW.egcc_difcambio;
                    END
                END
            end
        ELSE
            begin
            if (saldo > (NEW.egcc_abono + NEW.egcc_rtfte + NEW.egcc_rtiva + NEW.egcc_rtica)) then
                begin
                execute procedure saldo_doc_cartera(new.egcc_tipodoc, new.egcc_iddoc, '9999/12/31', 1) returning_values(saldoM);
                if (saldoM > ((NEW.egcc_abono+NEW.egcc_rtfte+NEW.egcc_rtiva+NEW.egcc_rtica)/:TRM)) then
                    EXCEPTION DOCUMENTO_ABONO_MAYOR 'EL SALDO DEL DOCUMENTO ' || NEW.egcc_prefijo || NEW.egcc_numero || ' ES INSUFICIENTE.';
                else
                    BEGIN
                    NEW.egcc_difcambio = :SALDO - (NEW.egcc_abono+NEW.egcc_rtfte+NEW.egcc_rtiva+NEW.egcc_rtica);
                    NEW.egcc_abono = NEW.egcc_abono - NEW.egcc_difcambio;
                    END
                end
            end
        END
    else
        BEGIN
        if (RETES = 'SI') then
            begin
            if (saldo < NEW.egcc_abono) then
                BEGIN
                execute procedure saldo_doc_cartera(new.egcc_tipodoc, new.egcc_iddoc, '9999/12/31', 1) returning_values(saldoM);
                if (saldoM < (NEW.egcc_abono/:TRM)) then
                    EXCEPTION DOCUMENTO_ABONO_MAYOR 'EL SALDO DEL DOCUMENTO ' || NEW.egcc_prefijo || NEW.egcc_numero || ' ES INSUFICIENTE.';
                else
                    BEGIN
                    NEW.egcc_difcambio = :SALDO - NEW.egcc_abono;
                    NEW.egcc_abono = NEW.egcc_abono - NEW.egcc_difcambio;
                    END
                END
            end
        ELSE
            begin
            if (saldo < (NEW.egcc_abono + NEW.egcc_rtfte + NEW.egcc_rtiva + NEW.egcc_rtica)) then
                begin
                execute procedure saldo_doc_cartera(new.egcc_tipodoc, new.egcc_iddoc, '9999/12/31', 1) returning_values(saldoM);
                if (saldoM < ((NEW.egcc_abono+NEW.egcc_rtfte+NEW.egcc_rtiva+NEW.egcc_rtica)/:TRM)) then
                    EXCEPTION DOCUMENTO_ABONO_MAYOR 'EL SALDO DEL DOCUMENTO ' || NEW.egcc_prefijo || NEW.egcc_numero || ' ES INSUFICIENTE.';
                else
                    BEGIN
                    NEW.egcc_difcambio = :SALDO - (NEW.egcc_abono+NEW.egcc_rtfte+NEW.egcc_rtiva+NEW.egcc_rtica);
                    NEW.egcc_abono = NEW.egcc_abono - NEW.egcc_difcambio;
                    END
                end
            end
        END
    end
end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER EGRESOS_CRUCEC_AU FOR EGRESOS_CRUCEC
ACTIVE AFTER UPDATE POSITION 0
AS
declare variable EXISTE CHAR(1);
declare variable FEC DATE;
declare variable NIT VARCHAR(20);
declare variable CONCEPTO VARCHAR(60);
declare variable PREFIJO VARCHAR(4);
declare variable NUMERO VARCHAR(6);
declare variable SALDO NUMERIC(18,2);
declare variable RETES char(2);
declare variable COBR INTEGER;
declare variable TRM NUMERIC(18,2);
BEGIN
select PREF_PRE, EGRE_NUMERO, EGRE_fecha, EGRE_CONC, TERC_NIT, EGRE_TRM
    from egresos where egre_id = new.egre_id
    into :PREFIJO, :NUMERO, :FEC, :CONCEPTO, :NIT, :TRM;
/* Borre el viejo */
if ((old.egre_id <> 0) AND (OLD.egcc_anulado = 'N')) then
    BEGIN
    UPDATE saldos_doc_cartera
        SET SDCA_ABONO = SDCA_ABONO - old.egcc_abono - OLD.egcc_dtof,
        SDCA_ABRTFTE = SDCA_ABRTFTE - old.egcc_rtfte,
        SDCA_ABRTIVA = SDCA_ABRTIVA - old.egcc_rtiva,
        SDCA_ABRTICA = SDCA_ABRTICA - old.egcc_rtica
        WHERE SDCA_TIPOREF = old.egcc_tipodoc AND SDCA_IDREF = old.egcc_iddoc AND SDCA_FECHA = :FEC;
    UPDATE movimiento_clientes
        SET MVCL_MONTO = MVCL_MONTO - OLD.egcc_abono - OLD.egcc_dtof,
        MVCL_RTEFTE = MVCL_RTEFTE - OLD.egcc_rtfte,
        MVCL_RTEIVA = MVCL_RTEIVA - OLD.egcc_rtiva,
        MVCL_RTEICA = MVCL_RTEICA - OLD.egcc_rtica
        WHERE MVCL_TIPOREF = 62 AND MVCL_IDREF = OLD.egre_id AND MVCL_SUCURSAL = old.egcc_sucursal;
    END
if ((NEW.egre_id <> 0) and (NEW.egcc_anulado = 'N')) then
    BEGIN
    SELECT COBR_COD FROM cliente_sucursales WHERE TERC_NIT = :NIT AND CLCU_COD = NEW.egcc_sucursal INTO :COBR;
    /* valide que no se pase del saldo */
    execute procedure saldo_doc_cartera(new.egcc_tipodoc, new.egcc_iddoc, '9999/12/31',0) returning_values(saldo);
    execute procedure lee_configuracion('CARTERA', 'SALDOS', 'DESCONTAR RETENCIONES POR CAUSACION') returning_values (RETES);
    if (SALDO < 0) then
        BEGIN
        if (RETES = 'SI') then
            begin
            if (saldo > (NEW.egcc_abono + NEW.egcc_dtof)) then
                EXCEPTION DOCUMENTO_ABONO_MAYOR;
            end
        ELSE
            begin
            if (saldo > (NEW.egcc_abono + NEW.egcc_rtfte + NEW.egcc_rtiva + NEW.egcc_rtica + NEW.egcc_dtof)) then
                EXCEPTION DOCUMENTO_ABONO_MAYOR;
            end
        END
    else
        BEGIN
        if (RETES = 'SI') then
            begin
            if (saldo < (NEW.egcc_abono + NEW.egcc_dtof)) then
                EXCEPTION DOCUMENTO_ABONO_MAYOR;
            end
        ELSE
            begin
            if (saldo < (NEW.egcc_abono + NEW.egcc_rtfte + NEW.egcc_rtiva + NEW.egcc_rtica + NEW.egcc_dtof)) then
                EXCEPTION DOCUMENTO_ABONO_MAYOR;
            end
        END
    select 'S' from saldos_doc_cartera where sdca_tiporef = new.egcc_tipodoc and sdca_idref = new.egcc_iddoc and sdca_fecha = :FEC into :EXISTE;
    if (Existe = 'S') then
        /* actualice el saldo del dia */
        UPDATE saldos_doc_cartera
            SET SDCA_ABONO = SDCA_ABONO + NEW.egcc_abono + NEW.egcc_dtof,
            SDCA_ABRTFTE = SDCA_ABRTFTE + NEW.egcc_rtfte,
            SDCA_ABRTIVA = SDCA_ABRTIVA + NEW.egcc_rtiva,
            SDCA_ABRTICA = SDCA_ABRTICA + NEW.egcc_rtica,
            SDCA_TRM = :TRM
            WHERE SDCA_TIPOREF = NEW.egcc_tipodoc AND SDCA_IDREF = NEW.egcc_iddoc AND SDCA_FECHA = :FEC;
    ELSE
        /* Inserte un nuevo saldo diario */
        INSERT INTO SALDOS_DOC_CARTERA (SDCA_TIPOREF, SDCA_IDREF, SDCA_FECHA, TERC_NIT, SDCA_RTFTE, SDCA_RTIVA, SDCA_RTICA, SDCA_ABONO, SDCA_ABRTFTE, SDCA_ABRTIVA, SDCA_ABRTICA, SDCA_DEBITO, SDCA_MONTO, SDCA_TRM)
            VALUES (NEW.egcc_tipodoc, NEW.egcc_iddoc, :FEC, :NIT, 0, 0, 0, (NEW.egcc_abono+NEW.egcc_dtof), NEW.egcc_rtfte, NEW.egcc_rtiva, NEW.egcc_rtica, 'N', 0, :TRM);
    /* Registre o actualice el registro en movimiento_cliente */
    EXISTE = 'N';
    SELECT 'S' FROM MOVIMIENTO_CLIENTES WHERE MVCL_TIPOREF = 62 AND MVCL_IDREF = NEW.egre_id and mvcl_sucursal = new.egcc_sucursal INTO :EXISTE;
    if (EXISTE = 'S') then
        begin
        /* Deshaga el viejo */
        if (old.egre_id <> 0) then
            UPDATE movimiento_clientes
                SET MVCL_MONTO = MVCL_MONTO - OLD.egcc_abono - OLD.egcc_dtof,
                    MVCL_RTEFTE = MVCL_RTEFTE - OLD.egcc_rtfte,
                    MVCL_RTEIVA = MVCL_RTEIVA - OLD.egcc_rtiva,
                    MVCL_RTEICA = MVCL_RTEICA - OLD.egcc_rtica
                WHERE MVCL_TIPOREF = 62 AND MVCL_IDREF = NEW.egre_id AND MVCL_SUCURSAL = NEW.egcc_sucursal;
        /* Actualice el nuevo */
        UPDATE movimiento_clientes
            SET MVCL_MONTO = MVCL_MONTO + NEW.egcc_abono + NEW.egcc_dtof,
                MVCL_RTEFTE = MVCL_RTEFTE + NEW.egcc_rtfte,
                MVCL_RTEIVA = MVCL_RTEIVA + NEW.egcc_rtiva,
                MVCL_RTEICA = MVCL_RTEICA + NEW.egcc_rtica,
                MVCL_TRM = :TRM
            WHERE MVCL_TIPOREF = 62 AND MVCL_IDREF = NEW.egre_id AND MVCL_SUCURSAL = NEW.egcc_sucursal;
        end
    ELSE
        INSERT INTO MOVIMIENTO_CLIENTES (MVCL_ID, TERC_NIT, MVCL_TIPOREF, MVCL_IDREF, MVCL_FECHA, MVCL_VENCE, MVCL_CONC, MVCL_MONTO, MVCL_RTEFTE, MVCL_RTEIVA, MVCL_RTEICA, MVCL_DEBITO, MVCL_ABONO, MVCL_PREFREF, MVCL_NUMREF, MVCL_SUCURSAL, COBR_COD, MVCL_TRM)
            VALUES (GEN_ID(ID_MOVCLI, 1), :NIT, 62, NEW.egre_id, :FEC, :FEC, :CONCEPTO, (NEW.egcc_abono+NEW.egcc_dtof), NEW.egcc_rtfte, NEW.egcc_rtiva, NEW.egcc_rtica, 'N', 'S', :PREFIJO, :NUMERO, NEW.egcc_sucursal, :COBR, :TRM);
    END
END
^

SET TERM ; ^

ALTER TABLE RECIBOS_CAJA_DETALLE
ADD RCDE_DIFCAMBIO T_MONTO;

SET TERM ^ ;

CREATE OR ALTER TRIGGER RECIBOS_CAJA_DETALLE_BI FOR RECIBOS_CAJA_DETALLE
ACTIVE BEFORE INSERT POSITION 0
AS
DECLARE VARIABLE NUMROWS INTEGER;
declare variable PREGTASA CHAR(2);
declare variable TRM NUMERIC(18,2);
declare variable SALDO NUMERIC(18,2);
declare variable SALDOM NUMERIC(18,2);
declare variable RETES CHAR(2);
begin
IF (NEW.RECA_ID IS NOT NULL) THEN
    BEGIN
       SELECT COUNT(*)
       FROM   RECIBOS_CAJA
       WHERE  RECIBOS_CAJA.RECA_ID = NEW.RECA_ID
       INTO   :NUMROWS;
       IF (NUMROWS = 0) THEN
       BEGIN
          EXCEPTION recibo_no_existe;
       END
    END
if (NEW.rcde_sucursal IS NULL) then
    NEW.rcde_sucursal = '01';
/* SI TRM <> 1 CONVIERTA A PESOS LOS VALORES */
EXECUTE PROCEDURE LEE_CONFIGURACION('GENERAL', 'GENERAL', 'PREGUNTAR TASA DE CAMBIO EN DOCUMENTOS DE CARTERA') returning_values (:pregtasa);
if (PREGTASA = 'SI') then
    BEGIN
    SELECT RECA_TRM FROM recibos_caja WHERE RECA_ID = NEW.reca_id INTO :TRM;
    NEW.rcde_abono = NEW.rcde_abono * :trm;
    NEW.rcde_rtfte = NEW.rcde_rtfte * :trm;
    NEW.rcde_rtiva = NEW.rcde_rtiva * :trm;
    NEW.rcde_rtica = NEW.rcde_rtica * :trm;
    NEW.rcde_dtof = NEW.rcde_dtof * :trm;
    /* VERIFIQUE LOS SALDOS Y LLEVE LA DIFERENCIA COMO DIF EN CAMBIO */
    execute procedure lee_configuracion('CARTERA', 'SALDOS', 'DESCONTAR RETENCIONES POR CAUSACION') returning_values (RETES);
    execute procedure saldo_doc_cartera(new.rcde_tipodoc, new.rcde_iddoc, '9999/12/31', 0) returning_values(saldo);
    if (SALDO < 0) then
        BEGIN
        if (RETES = 'SI') then
            begin
            if (saldo > (NEW.rcde_abono + NEW.rcde_dtof)) then
                BEGIN
                execute procedure saldo_doc_cartera(new.rcde_tipodoc, new.rcde_iddoc, '9999/12/31', 1) returning_values(saldoM);
                if (saldoM > ((NEW.rcde_abono + NEW.rcde_dtof)/:TRM)) then
                    EXCEPTION DOCUMENTO_ABONO_MAYOR 'EL SALDO DEL DOCUMENTO ' || NEW.rcde_prefijo || NEW.rcde_numero || ' ES INSUFICIENTE.';
                else
                    BEGIN
                    NEW.rcde_difcambio = :SALDO - (NEW.rcde_abono + NEW.rcde_dtof);
                    NEW.rcde_abono = NEW.rcde_abono - NEW.rcde_difcambio;
                    END
                END
            end
        ELSE
            begin
            if (saldo > (NEW.rcde_abono + NEW.rcde_dtof + NEW.rcde_rtfte + NEW.rcde_rtiva + NEW.rcde_rtica)) then
                begin
                execute procedure saldo_doc_cartera(new.rcde_tipodoc, new.rcde_iddoc, '9999/12/31', 1) returning_values(saldoM);
                if (saldoM > ((NEW.rcde_abono+NEW.rcde_dtof+NEW.rcde_rtfte+NEW.rcde_rtiva+NEW.rcde_rtica)/:TRM)) then
                    EXCEPTION DOCUMENTO_ABONO_MAYOR 'EL SALDO DEL DOCUMENTO ' || NEW.rcde_prefijo || NEW.rcde_numero || ' ES INSUFICIENTE.';
                else
                    BEGIN
                    NEW.rcde_difcambio = :SALDO - (NEW.rcde_abono+NEW.rcde_dtof+NEW.rcde_rtfte+NEW.rcde_rtiva+NEW.rcde_rtica);
                    NEW.rcde_abono = NEW.rcde_abono - NEW.rcde_difcambio;
                    END
                end
            end
        END
    else
        BEGIN
        if (RETES = 'SI') then
            begin
            if (saldo < (NEW.rcde_abono + NEW.rcde_dtof)) then
                BEGIN
                execute procedure saldo_doc_cartera(new.rcde_tipodoc, new.rcde_iddoc, '9999/12/31', 1) returning_values(saldoM);
                if (saldoM < ((NEW.rcde_abono + NEW.rcde_dtof)/:TRM)) then
                    EXCEPTION DOCUMENTO_ABONO_MAYOR 'EL SALDO DEL DOCUMENTO ' || NEW.rcde_prefijo || NEW.rcde_numero || ' ES INSUFICIENTE.';
                else
                    BEGIN
                    NEW.rcde_difcambio = :SALDO - (NEW.rcde_abono + NEW.rcde_dtof);
                    NEW.rcde_abono = NEW.rcde_abono - NEW.rcde_difcambio;
                    END
                END
            end
        ELSE
            begin
            if (saldo < (NEW.rcde_abono + NEW.rcde_dtof + NEW.rcde_rtfte + NEW.rcde_rtiva + NEW.rcde_rtica)) then
                begin
                execute procedure saldo_doc_cartera(new.rcde_tipodoc, new.rcde_iddoc, '9999/12/31', 1) returning_values(saldoM);
                if (saldoM < ((NEW.rcde_abono+NEW.rcde_dtof+NEW.rcde_rtfte+NEW.rcde_rtiva+NEW.rcde_rtica)/:TRM)) then
                    EXCEPTION DOCUMENTO_ABONO_MAYOR 'EL SALDO DEL DOCUMENTO ' || NEW.rcde_prefijo || NEW.rcde_numero || ' ES INSUFICIENTE.';
                else
                    BEGIN
                    NEW.rcde_difcambio = :SALDO - (NEW.rcde_abono + NEW.rcde_dtof+NEW.rcde_rtfte+NEW.rcde_rtiva+NEW.rcde_rtica);
                    NEW.rcde_abono = NEW.rcde_abono - NEW.rcde_difcambio;
                    END
                end
            end
        END
    end
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER trigger recibos_caja_detalle_ai for recibos_caja_detalle
active after insert position 0
AS
declare variable EXISTE CHAR(1);
declare variable FEC DATE;
declare variable NIT VARCHAR(20);
declare variable CONCEPTO VARCHAR(60);
declare variable PREFIJO VARCHAR(4);
declare variable NUMERO VARCHAR(6);
declare variable SALDO NUMERIC(18,2);
declare variable RETES CHAR(2);
declare variable OK CHAR(1);
declare variable RCANTI INTEGER;
declare variable COBR INTEGER;
declare variable ACUMULA CHAR(2);
declare variable DIASMAX INTEGER;
declare variable FACTOR NUMERIC(9,4);
declare variable FACTORD NUMERIC(9,4);
declare variable DIAS INTEGER;
declare variable FECDOC DATE;
declare variable TRM NUMERIC(18,2);
BEGIN
if ((NEW.RECA_ID <> 0) and (new.rcde_anulado = 'N')) then
    BEGIN
    /* Abone el documento referenciado */
    select PREF_PRE, RECA_NUMERO, RECA_fecha, RECA_CONC, TERC_NIT, COBR_COD, RECA_TRM from RECIBOS_CAJA
        where RECA_id = new.RECA_id into :PREFIJO, :NUMERO, :FEC, :CONCEPTO, :NIT, :COBR, :TRM;
    OK = 'N';
    if (new.RCDE_TIPODOC = 45) then
        BEGIN
        /* BUSQUE SI TIENE RECA_ID, SI NO LO ACTUALIZA */
        SELECT RECA_ID FROM ANTICIPOS_CLIENTE WHERE ANCL_ID = NEW.RCDE_IDDOC INTO :RCANTI;
        if (RCANTI = 0) then
            BEGIN
            OK = 'S';
            UPDATE ANTICIPOS_CLIENTE SET RECA_ID = NEW.RECA_ID WHERE ANCL_ID = NEW.RCDE_IDDOC;
            END
        END
    if (OK = 'N') then
        BEGIN
        /* valide que no se pase del saldo */
        execute procedure saldo_doc_cartera(new.rcde_tipodoc, new.rcde_iddoc, '9999/12/31', 0) returning_values(saldo);
        execute procedure lee_configuracion('CARTERA', 'SALDOS', 'DESCONTAR RETENCIONES POR CAUSACION') returning_values (RETES);
        if (SALDO < 0) then
            BEGIN
            if (RETES = 'SI') then
                begin
                if (saldo > (NEW.rcde_abono + NEW.rcde_dtof)) then
                    EXCEPTION DOCUMENTO_ABONO_MAYOR 'EL SALDO DEL DOCUMENTO ' || NEW.rcde_prefijo || NEW.rcde_numero || ' ES INSUFICIENTE.';
                end
            ELSE
                begin
                if (saldo > (NEW.rcde_abono + NEW.rcde_rtfte + NEW.rcde_rtiva + NEW.rcde_rtica + NEW.rcde_dtof)) then
                    EXCEPTION DOCUMENTO_ABONO_MAYOR 'EL SALDO DEL DOCUMENTO ' || NEW.rcde_prefijo || NEW.rcde_numero || ' ES INSUFICIENTE.';
                end
            END
        else
            BEGIN
            if (RETES = 'SI') then
                begin
                if (saldo < (NEW.rcde_abono + NEW.rcde_dtof)) then
                    EXCEPTION DOCUMENTO_ABONO_MAYOR 'EL SALDO DEL DOCUMENTO ' || NEW.rcde_prefijo || NEW.rcde_numero || ' ES INSUFICIENTE.';
                end
            ELSE
                begin
                if (saldo < (NEW.rcde_abono + NEW.rcde_rtfte + NEW.rcde_rtiva + NEW.rcde_rtica + NEW.rcde_dtof)) then
                    EXCEPTION DOCUMENTO_ABONO_MAYOR 'EL SALDO DEL DOCUMENTO ' || NEW.rcde_prefijo || NEW.rcde_numero || ' ES INSUFICIENTE.';
                end
            END
        EXISTE = 'N';
        select 'S' from saldos_doc_cartera where sdca_tiporef = new.rcde_tipodoc and sdca_idref = new.rcde_iddoc and sdca_fecha = :FEC into :EXISTE;
        if (Existe = 'S') then
            begin
            /* actualice el saldo del dia */
            UPDATE saldos_doc_cartera
                SET SDCA_ABONO = SDCA_ABONO + NEW.rcde_abono + new.rcde_dtof,
                SDCA_ABRTFTE = SDCA_ABRTFTE + NEW.rcde_RTFTE,
                SDCA_ABRTIVA = SDCA_ABRTIVA + NEW.rcde_RTIVA,
                SDCA_ABRTICA = SDCA_ABRTICA + NEW.rcde_RTICA,
                SDCA_TRM = :TRM
                WHERE SDCA_TIPOREF = NEW.RCDE_TIPODOC AND SDCA_IDREF = NEW.rcde_IDDOC AND SDCA_FECHA = :FEC;
            END
        ELSE
            BEGIN
            /* Inserte un nuevo saldo diario */
            INSERT INTO SALDOS_DOC_CARTERA (SDCA_TIPOREF, SDCA_IDREF, SDCA_FECHA, TERC_NIT, SDCA_RTFTE, SDCA_RTIVA, SDCA_RTICA, SDCA_ABONO, SDCA_ABRTFTE, SDCA_ABRTIVA, SDCA_ABRTICA, SDCA_DEBITO, SDCA_MONTO, SDCA_TRM)
                VALUES (NEW.RCDE_TIPODOC, NEW.RCDE_IDDOC, :FEC, :NIT, 0, 0, 0, (NEW.rcde_abono+NEW.rcde_dtof), NEW.rcde_rtfte, NEW.rcde_rtiva, NEW.rcde_rtica, 'N', 0, :TRM);
            END
        END
    /* actualice el registro en mov_cliente (por si son varios items) */
    EXISTE = 'N';
    SELECT 'S' FROM MOVIMIENTO_CLIENTES WHERE MVCL_TIPOREF = 61 AND MVCL_IDREF = NEW.RECA_ID AND MVCL_SUCURSAL = NEW.rcde_sucursal INTO :EXISTE;
    if (EXISTE = 'S') then
        begin
        UPDATE movimiento_clientes
            SET MVCL_MONTO = MVCL_MONTO + NEW.rcde_abono + NEW.rcde_dtof,
                MVCL_RTEFTE = MVCL_RTEFTE + NEW.rcde_rtfte,
                MVCL_RTEIVA = MVCL_RTEIVA + NEW.rcde_rtiva,
                MVCL_RTEICA = MVCL_RTEICA + NEW.rcde_rtica,
                MVCL_TRM = :TRM
            WHERE MVCL_TIPOREF = 61 AND MVCL_IDREF = NEW.RECA_ID AND MVCL_SUCURSAL = NEW.rcde_sucursal;
        end
    ELSE
        INSERT INTO MOVIMIENTO_CLIENTES (MVCL_ID, TERC_NIT, MVCL_TIPOREF, MVCL_IDREF, MVCL_FECHA, MVCL_VENCE, MVCL_CONC, MVCL_MONTO, MVCL_RTEFTE, MVCL_RTEIVA, MVCL_RTEICA, MVCL_DEBITO, MVCL_ABONO, MVCL_PREFREF, MVCL_NUMREF, MVCL_SUCURSAL, COBR_COD, MVCL_TRM)
            VALUES (GEN_ID(ID_MOVCLI, 1), :NIT, 61, NEW.RECA_ID, :FEC, :FEC, :CONCEPTO, (NEW.RCDE_ABONO+NEW.RCDE_DTOF), NEW.RCDE_RTFTE, NEW.RCDE_RTIVA, NEW.RCDE_RTICA, 'N', 'S', :PREFIJO, :NUMERO, NEW.rcde_sucursal, :COBR, :TRM);

    /* acumule los puntos del vendedor */
    SELECT MVCL_FECHA FROM MOVIMIENTO_CLIENTES WHERE MVCL_TIPOREF = new.rcde_tipodoc AND MVCL_IDREF = new.rcde_iddoc
        INTO :FECDOC;
    if (FECDOC IS NOT NULL) then
        DIAS = FEC - FECDOC;
    else
        DIAS = 999;
    execute procedure lee_configuracion('FACTURACION', 'FACTURAS', 'ACUMULAR PUNTOS DE VENTAS POR VENDEDOR') returning_values (ACUMULA);
    execute procedure lee_configuracion('FACTURACION', 'FACTURAS', 'DIAS DE RECAUDO MAXIMO PARA ACUMULAR PUNTOS AL VENDEDOR') returning_values (DIASMAX);
    if ((acumula = 'SI') and (diasmax >= dias)) then
        begin
        SELECT COPU_FACTOR FROM comisiones_puntos WHERE COPU_COD = NEW.rcde_comip INTO :FACTOR;
        if ((NEW.rcde_tipodoc = 31) or (NEW.rcde_tipodoc = 41)) then
            begin
            /* recorra la factura acumulando los puntos */
            if (new.rcde_tipodoc = 31) then
                select (fact_total-fact_ivamonto)/fact_total from facturas where fact_id = new.rcde_iddoc into :factord;
            if (new.rcde_tipodoc = 41) then
                select ndcl_monto/(ndcl_monto+ndcl_ivamonto) from notas_debito_clientes where ndcl_id = new.rcde_iddoc into :factord;
            /* inserte el registro de puntos */
            insert into puntos_vendedor (vend_cod, ptvt_fecha, ptvt_tipodoc, ptvt_iddoc, ptvt_db, ptvt_cr)
                values (:cobr, :fec, new.rcde_tipodoc, new.rcde_iddoc, (new.rcde_abono*:factord*:factor), 0);
            end
        if ((new.rcde_tipodoc = 33) or (new.rcde_tipodoc = 42)) then
            begin
            if (new.rcde_tipodoc = 33) then
                select (devt_total-devt_ivamonto)/devt_total from devoluciones_ventas where devt_id = new.rcde_iddoc into :factord;
            if (new.rcde_tipodoc = 42) then
                select nccl_monto/(nccl_monto+nccl_ivamonto) from notas_credito_clientes where nccl_id = new.rcde_iddoc into :factord;
            /* inserte el registro de puntos */
            insert into puntos_vendedor (vend_cod, ptvt_fecha, ptvt_tipodoc, ptvt_iddoc, ptvt_db, ptvt_cr)
                values (:cobr, :fec, new.rcde_tipodoc, new.rcde_iddoc, 0, (new.rcde_abono*:factord*:factor));
            end
        end
    end
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER RECIBOS_CAJA_DETALLE_AU FOR RECIBOS_CAJA_DETALLE
ACTIVE AFTER UPDATE POSITION 0
AS
declare variable EXISTE CHAR(1);
declare variable FEC DATE;
declare variable NIT VARCHAR(20);
declare variable CONCEPTO VARCHAR(60);
declare variable PREFIJO VARCHAR(4);
declare variable NUMERO VARCHAR(6);
declare variable SALDO NUMERIC(18,2);
declare variable RETES char(2);
declare variable OK CHAR(1);
declare variable RCANTI INTEGER;
declare variable COBR INTEGER;
declare variable ACUMULA CHAR(2);
declare variable DIASMAX INTEGER;
declare variable FACTOR NUMERIC(9,4);
declare variable FACTORD NUMERIC(9,4);
declare variable DIAS INTEGER;
declare variable FECDOC DATE;
declare variable TRM NUMERIC(18,2);
BEGIN
execute procedure lee_configuracion('FACTURACION', 'FACTURAS', 'ACUMULAR PUNTOS DE VENTAS POR VENDEDOR') returning_values (ACUMULA);
select PREF_PRE, RECA_NUMERO, reca_fecha, RECA_CONC, TERC_NIT, COBR_COD, RECA_TRM
    from recibos_caja where reca_id = new.reca_id
    into :PREFIJO, :NUMERO, :FEC, :CONCEPTO, :NIT, :COBR, :TRM;
/* Borre el viejo */
if ((old.RECA_ID <> 0) AND (OLD.rcde_anulado = 'N')) then
    BEGIN
    OK = 'N';
    if (OLD.RCDE_TIPODOC = 45) then
        BEGIN
        SELECT RECA_ID FROM ANTICIPOS_CLIENTE WHERE ANCL_ID = OLD.RCDE_IDDOC INTO :RCANTI;
        if (RCANTI = OLD.RECA_ID) then
            begin
            OK = 'S';
            if (NEW.rcde_anulado = 'N') then
                delete from anticipos_cliente where ANCL_ID = OLD.RCDE_IDDOC;
            else
                UPDATE anticipos_cliente SET ANCL_ANULADO = 'S' where ANCL_ID = OLD.RCDE_IDDOC;
            end
        END
    if (OK = 'N') then
        BEGIN
        UPDATE saldos_doc_cartera
            SET SDCA_ABONO = SDCA_ABONO - old.rcde_abono - OLD.RCDE_DTOF,
            SDCA_ABRTFTE = SDCA_ABRTFTE - old.rcde_RTFTE,
            SDCA_ABRTIVA = SDCA_ABRTIVA - old.rcde_RTIVA,
            SDCA_ABRTICA = SDCA_ABRTICA - old.rcde_RTICA
            WHERE SDCA_TIPOREF = old.RCDE_TIPODOC AND SDCA_IDREF = old.rcde_IDDOC AND SDCA_FECHA = :FEC;
        END
    UPDATE movimiento_clientes
        SET MVCL_MONTO = MVCL_MONTO - OLD.rcde_abono - OLD.RCDE_DTOF,
        MVCL_RTEFTE = MVCL_RTEFTE - OLD.rcde_rtfte,
        MVCL_RTEIVA = MVCL_RTEIVA - OLD.rcde_rtiva,
        MVCL_RTEICA = MVCL_RTEICA - OLD.rcde_rtica
        WHERE MVCL_TIPOREF = 61 AND MVCL_IDREF = OLD.RECA_ID;

    /* DESHAGA LOS PUNTOS DEL VENDEDOR */
    if (acumula = 'SI') then
        delete from puntos_vendedor where vend_cod = :cobr and ptvt_tipodoc = old.rcde_tipodoc and ptvt_iddoc = old.rcde_iddoc and ptvt_fecha = :fec;
    END
if ((NEW.RECA_ID <> 0) and (NEW.rcde_anulado = 'N')) then
    BEGIN
    OK = 'N';
    if (new.RCDE_TIPODOC = 45) then
        BEGIN
        /* BUSQUE SI TIENE RECA_ID, SI NO LO ACTUALIZA */
        SELECT RECA_ID FROM ANTICIPOS_CLIENTE WHERE ANCL_ID = NEW.RCDE_IDDOC INTO :RCANTI;
        if (RCANTI = 0) then
            BEGIN
            OK = 'S';
            UPDATE ANTICIPOS_CLIENTE SET RECA_ID = NEW.RECA_ID WHERE ANCL_ID = NEW.RCDE_IDDOC;
            END
        END
    if (OK = 'N') then
        BEGIN
        /* valide que no se pase del saldo */
        execute procedure saldo_doc_cartera(new.rcde_tipodoc, new.rcde_iddoc, '9999/12/31', 0) returning_values(saldo);
        execute procedure lee_configuracion('CARTERA', 'SALDOS', 'DESCONTAR RETENCIONES POR CAUSACION') returning_values (RETES);
        if (SALDO < 0) then
            BEGIN
            if (RETES = 'SI') then
                begin
                if (saldo > (NEW.rcde_abono + NEW.rcde_dtof)) then
                    EXCEPTION DOCUMENTO_ABONO_MAYOR;
                end
            ELSE
                begin
                if (saldo > (NEW.rcde_abono + NEW.rcde_rtfte + NEW.rcde_rtiva + NEW.rcde_rtica + NEW.rcde_dtof)) then
                    EXCEPTION DOCUMENTO_ABONO_MAYOR;
                end
            END
        else
            BEGIN
            if (RETES = 'SI') then
                begin
                if (saldo < (NEW.rcde_abono + NEW.rcde_dtof)) then
                    EXCEPTION DOCUMENTO_ABONO_MAYOR;
                end
            ELSE
                begin
                if (saldo < (NEW.rcde_abono + NEW.rcde_rtfte + NEW.rcde_rtiva + NEW.rcde_rtica + NEW.rcde_dtof)) then
                    EXCEPTION DOCUMENTO_ABONO_MAYOR;
                end
            END
        select 'S' from saldos_doc_cartera where sdca_tiporef = new.rcde_tipodoc and sdca_idref = new.rcde_iddoc and sdca_fecha = :FEC into :EXISTE;
        if (Existe = 'S') then
            /* actualice el saldo del dia */
            UPDATE saldos_doc_cartera
                SET SDCA_ABONO = SDCA_ABONO + NEW.rcde_abono + NEW.RCDE_DTOF,
                    SDCA_ABRTFTE = SDCA_ABRTFTE + NEW.rcde_RTFTE,
                    SDCA_ABRTIVA = SDCA_ABRTIVA + NEW.rcde_RTIVA,
                    SDCA_ABRTICA = SDCA_ABRTICA + NEW.rcde_RTICA,
                    SDCA_TRM = :TRM
                WHERE SDCA_TIPOREF = NEW.RCDE_TIPODOC AND SDCA_IDREF = NEW.rcde_IDDOC AND SDCA_FECHA = :FEC;
        ELSE
            /* Inserte un nuevo saldo diario */
            INSERT INTO SALDOS_DOC_CARTERA (SDCA_TIPOREF, SDCA_IDREF, SDCA_FECHA, TERC_NIT, SDCA_RTFTE, SDCA_RTIVA, SDCA_RTICA, SDCA_ABONO, SDCA_ABRTFTE, SDCA_ABRTIVA, SDCA_ABRTICA, SDCA_DEBITO, SDCA_MONTO, SDCA_TRM)
                VALUES (NEW.RCDE_TIPODOC, NEW.RCDE_IDDOC, :FEC, :NIT, 0, 0, 0, (NEW.rcde_abono+NEW.RCDE_DTOF), NEW.rcde_rtfte, NEW.rcde_rtiva, NEW.rcde_rtica, 'N', 0, :TRM);
        END /* OK = N */
    /* Registre o actualice el registro en movimiento_cliente */
    EXISTE = 'N';
    SELECT 'S' FROM MOVIMIENTO_CLIENTES WHERE MVCL_TIPOREF = 61 AND MVCL_IDREF = NEW.RECA_ID and mvcl_sucursal = new.rcde_sucursal INTO :EXISTE;
    if (EXISTE = 'S') then
        begin
        /* Deshaga el viejo */
        if (old.RECA_ID <> 0) then
            UPDATE movimiento_clientes
                SET MVCL_MONTO = MVCL_MONTO - OLD.rcde_abono - OLD.rcde_dtof,
                    MVCL_RTEFTE = MVCL_RTEFTE - OLD.rcde_rtfte,
                    MVCL_RTEIVA = MVCL_RTEIVA - OLD.rcde_rtiva,
                    MVCL_RTEICA = MVCL_RTEICA - OLD.rcde_rtica
                WHERE MVCL_TIPOREF = 61 AND MVCL_IDREF = NEW.RECA_ID AND MVCL_SUCURSAL = NEW.rcde_sucursal;
        /* Actualice el nuevo */
        UPDATE movimiento_clientes
            SET MVCL_MONTO = MVCL_MONTO + NEW.rcde_abono + NEW.rcde_dtof,
                MVCL_RTEFTE = MVCL_RTEFTE + NEW.rcde_rtfte,
                MVCL_RTEIVA = MVCL_RTEIVA + NEW.rcde_rtiva,
                MVCL_RTEICA = MVCL_RTEICA + NEW.rcde_rtica,
                MVCL_TRM = :TRM
            WHERE MVCL_TIPOREF = 61 AND MVCL_IDREF = NEW.RECA_ID AND MVCL_SUCURSAL = NEW.rcde_sucursal;
        end
    ELSE
        INSERT INTO MOVIMIENTO_CLIENTES (MVCL_ID, TERC_NIT, MVCL_TIPOREF, MVCL_IDREF, MVCL_FECHA, MVCL_VENCE, MVCL_CONC, MVCL_MONTO, MVCL_RTEFTE, MVCL_RTEIVA, MVCL_RTEICA, MVCL_DEBITO, MVCL_ABONO, MVCL_PREFREF, MVCL_NUMREF, MVCL_SUCURSAL, COBR_COD, MVCL_TRM)
            VALUES (GEN_ID(ID_MOVCLI, 1), :NIT, 61, NEW.RECA_ID, :FEC, :FEC, :CONCEPTO, (NEW.RCDE_ABONO+NEW.RCDE_DTOF), NEW.RCDE_RTFTE, NEW.RCDE_RTIVA, NEW.RCDE_RTICA, 'N', 'S', :PREFIJO, :NUMERO, NEW.rcde_sucursal, :COBR, :TRM);

    /* acumule los puntos del vendedor */
    SELECT MVCL_FECHA FROM MOVIMIENTO_CLIENTES WHERE MVCL_TIPOREF = new.rcde_tipodoc AND MVCL_IDREF = new.rcde_iddoc
        INTO :FECDOC;
    if (FECDOC IS NOT NULL) then
        DIAS = FEC - FECDOC;
    else
        DIAS = 999;
    execute procedure lee_configuracion('FACTURACION', 'FACTURAS', 'DIAS DE RECAUDO MAXIMO PARA ACUMULAR PUNTOS AL VENDEDOR') returning_values (DIASMAX);
    if ((acumula = 'SI') and (diasmax >= dias)) then
        begin
        SELECT COPU_FACTOR FROM comisiones_puntos WHERE COPU_COD = NEW.rcde_comip INTO :FACTOR;
        if ((NEW.rcde_tipodoc = 31) or (NEW.rcde_tipodoc = 41)) then
            begin
            /* recorra la factura acumulando los puntos */
            if (new.rcde_tipodoc = 31) then
                select (fact_total-fact_ivamonto)/fact_total from facturas where fact_id = new.rcde_iddoc into :factord;
            if (new.rcde_tipodoc = 41) then
                select ndcl_monto/(ndcl_monto+ndcl_ivamonto) from notas_debito_clientes where ndcl_id = new.rcde_iddoc into :factord;
            /* inserte el registro de puntos */
            insert into puntos_vendedor (vend_cod, ptvt_fecha, ptvt_tipodoc, ptvt_iddoc, ptvt_db, ptvt_cr)
                values (:cobr, :fec, new.rcde_tipodoc, new.rcde_iddoc, (new.rcde_abono*:factord*:factor), 0);
            end
        if ((new.rcde_tipodoc = 33) or (new.rcde_tipodoc = 42)) then
            begin
            if (new.rcde_tipodoc = 33) then
                select (devt_total-devt_ivamonto)/devt_total from devoluciones_ventas where devt_id = new.rcde_iddoc into :factord;
            if (new.rcde_tipodoc = 42) then
                select nccl_monto/(nccl_monto+nccl_ivamonto) from notas_credito_clientes where nccl_id = new.rcde_iddoc into :factord;
            /* inserte el registro de puntos */
            insert into puntos_vendedor (vend_cod, ptvt_fecha, ptvt_tipodoc, ptvt_iddoc, ptvt_db, ptvt_cr)
                values (:cobr, :fec, new.rcde_tipodoc, new.rcde_iddoc, 0, (new.rcde_abono*:factord*:factor));
            end
        end
    END /* NUEVO */
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER PROCEDURE BUSCA_ID_DOC_CARTERA(
    TIPO INTEGER,
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(6),
    NIT VARCHAR(20),
    FECHA DATE,
    MONEDA INTEGER)
RETURNS (
    ID INTEGER,
    SALDO NUMERIC(18,2),
    RTFTE NUMERIC(18,2),
    RTIVA NUMERIC(18,2),
    RTICA NUMERIC(18,2),
    DTOF NUMERIC(18,2),
    ERROR INTEGER)
AS
declare variable vernit varchar(20);
declare variable fec date;
declare variable fecdto date;
declare variable desc_rtes char(2);
declare variable dtoapl numeric(18,2);
declare variable AUTORET VARCHAR(10);
declare variable FAUTORET DATE;
declare variable FECDOC DATE;
declare variable TRM numeric(18,2);
BEGIN
ID = 0;
ERROR = 0;
EXECUTE PROCEDURE COMPLETA_CEROS(NUMERO) returning_values (NUMERO);
if (TIPO = 41) then
    SELECT NDCL_ID, TERC_NIT, NDCL_FECHA, NDCL_DTOFMONTO, NDCL_FECHADTO, NDCL_TRM
        FROM NOTAS_DEBITO_CLIENTES WHERE PREF_PRE = :PREFIJO AND NDCL_NUMERO = :NUMERO
        INTO :ID, :VERNIT, :FEC, :DTOF, :FECDTO, :TRM;
if (TIPO = 42) then
    SELECT NCCL_ID, TERC_NIT, NCCL_FECHA, 0, NCCL_FECHA, 1
        FROM NOTAS_CREDITO_CLIENTES WHERE PREF_PRE = :PREFIJO AND NCCL_NUMERO = :NUMERO
        INTO :ID, :VERNIT, :FEC, :DTOF, :FECDTO, :TRM;
if (TIPO = 45) then
    SELECT ANCL_ID, TERC_NIT, ANCL_FECHA, ANCL_DTOFMONTO, ANCL_DTOFECHA, ANCL_TRM
        FROM ANTICIPOS_CLIENTE WHERE PREF_PRE = :PREFIJO AND ANCL_NUMERO = :NUMERO
        INTO :ID, :VERNIT, :FEC, :DTOF, :FECDTO, :TRM;
if (TIPO = 31) then
    SELECT FACT_ID, TERC_NIT, FACT_FECHA, FACT_DTOFMONTO, FACT_DTOFFECHA, FACT_TRM
        FROM FACTURAS WHERE PREF_PRE = :PREFIJO AND FACT_NUMERO = :NUMERO
        INTO :ID, :VERNIT, :FEC, :DTOF, :FECDTO, :TRM;
if (TIPO = 33) then
    SELECT DEVT_ID, TERC_NIT, DEVT_FECHA, 0, DEVT_FECHA, 1 FROM devoluciones_ventas
        WHERE PREF_PRE = :PREFIJO AND DEVT_NUMERO = :NUMERO INTO :ID, :VERNIT, :FEC, :DTOF, :FECDTO, :TRM;
if (TIPO = 77) then
    SELECT DVCH_ID, TERC_NIT, DVCH_FECHA, 0, DVCH_FECHA, 1 FROM devolucion_cheques
        WHERE PRBA_PREf = :PREFIJO AND DVCH_NUMDOC = :NUMERO INTO :ID, :VERNIT, :FEC, :DTOF, :FECDTO, :TRM;
if (FECHA > FECDTO) then
    DTOF = 0;
if (DTOF IS NULL) then
    DTOF = 0;
if (DTOF <> 0) then
    BEGIN
    if ((MONEDA <> 0) AND (TRM <> 0)) then
        DTOF = DTOF / TRM;
    if (MONEDA = 0) then
        SELECT SUM(RCDE_DTOF) FROM RECIBOS_CAJA_DETALLE WHERE RCDE_IDDOC = :ID AND RCDE_TIPODOC = :TIPO INTO :DTOAPL;
    else
        SELECT SUM(RCDE_DTOF/RECA_TRM) FROM RECIBOS_CAJA_DETALLE D, RECIBOS_CAJA R
            WHERE R.reca_id = D.reca_id AND RCDE_IDDOC = :ID AND RCDE_TIPODOC = :TIPO INTO :DTOAPL;
    if (DTOAPL IS NULL) then
        DTOAPL = 0;
    DTOF = DTOF - DTOAPL;
    END
IF (ID = 0) then
    ERROR = 1;
ELSE
  BEGIN
  if (VERNIT <> NIT) then
    ERROR = 2;
  else
    BEGIN
    /* VERIFIQUE QUE LA FECHA DEL ABONO SEA POSTERIOR O IGUAL AL DOC */
    if (FEC > FECHA) then
        ERROR = 3;
    else
        begin
        /* CALCULE LOS SALDOS */
        if (MONEDA = 0) then
          SELECT SUM(SDCA_MONTO - SDCA_ABONO), SUM(SDCA_RTFTE - SDCA_ABRTFTE), SUM(SDCA_RTIVA - SDCA_ABRTIVA), SUM(SDCA_RTICA - SDCA_ABRTICA)
            FROM SALDOS_DOC_CARTERA WHERE SDCA_TIPOREF = :TIPO AND SDCA_IDREF = :ID
            INTO :SALDO, :RTFTE, :RTIVA, :RTICA;
        else
          SELECT SUM((SDCA_MONTO - SDCA_ABONO)/SDCA_TRM), SUM((SDCA_RTFTE - SDCA_ABRTFTE)/SDCA_TRM), SUM((SDCA_RTIVA - SDCA_ABRTIVA)/SDCA_TRM), SUM((SDCA_RTICA - SDCA_ABRTICA)/SDCA_TRM)
            FROM SALDOS_DOC_CARTERA WHERE SDCA_TIPOREF = :TIPO AND SDCA_IDREF = :ID
            INTO :SALDO, :RTFTE, :RTIVA, :RTICA;
        if ((TIPO = 31) or (TIPO = 41) or (TIPO = 77)) then
            begin
            if ((RTFTE IS NULL) or (RTFTE < 0))  then
                RTFTE = 0;
            if ((RTIVA IS NULL) or (RTIVA < 0 ))  then
                RTIVA = 0;
            if ((RTICA IS NULL) or (RTICA < 0))  then
                RTICA = 0;
            end
        if ((TIPO = 33) or (TIPO = 42) or (TIPO = 45)) then
            begin
            if ((RTFTE IS NULL) or (RTFTE > 0))  then
                RTFTE = 0;
            if ((RTIVA IS NULL) or (RTIVA > 0 ))  then
                RTIVA = 0;
            if ((RTICA IS NULL) or (RTICA > 0))  then
                RTICA = 0;
            end
        /* TRAIGA EL SALDO NETO */
        EXECUTE PROCEDURE SALDO_DOC_CARTERA(TIPO, ID, FECHA, MONEDA) returning_values (SALDO);
        if (SALDO = 0) then
            ERROR = 4;
        ELSE
            BEGIN
            EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'FECHA AUTORETENEDOR NO DESCONTAR RETENCIONES DEL SALDO PERO SI CONTABILIZARLAS') returning_values (AUTORET);
            if (AUTORET <> '') then
                FAUTORET = CAST(AUTORET AS DATE);
            else
                FAUTORET = '9999/12/31';
            /* BUSQUE LA FECHA DEL DOCUMENTO */
            SELECT MIN(SDCA_FECHA) FROM SALDOS_DOC_CARTERA WHERE (SDCA_TIPOREF = :TIPO) AND (SDCA_IDREF = :ID) AND (SDCA_MONTO <> 0) INTO :FECDOC;
            if (FAUTORET <= FECDOC) then
                BEGIN
                RTFTE = 0;
                RTIVA = 0;
                RTICA = 0;
                END
            /* RESTE LAS RETENCIONES YA QUE SE SUGERIRAN */
            EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'DESCONTAR RETENCIONES POR CAUSACION') returning_values (DESC_RTES);
            if (DESC_RTES = 'NO') then
                SALDO = SALDO - RTFTE - RTIVA - RTICA;
            SALDO = SALDO - DTOF;
            END
        end
    END
  end
SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER PROCEDURE CHEQUEO_SALDOS_DOC_CARTERA(
    CLIINI VARCHAR(20),
    CLIFIN VARCHAR(20))
RETURNS (
    ERROR VARCHAR(60),
    TIPO INTEGER,
    ID INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(6))
AS
declare variable FECHA DATE;
declare variable NIT VARCHAR(20);
declare variable RTFTE NUMERIC(18, 2);
declare variable RTIVA NUMERIC(18, 2);
declare variable RTICA NUMERIC(18, 2);
declare variable MONTO NUMERIC(18, 2);
declare variable EXISTE CHAR(1);
declare variable IDR INTEGER;
declare variable RECAID INTEGER;
declare variable TRM NUMERIC(18, 2);
BEGIN
DELETE FROM SALDOS_DOC_CARTERA WHERE TERC_NIT >= :CLIINI AND TERC_NIT <= :CLIFIN;
DELETE FROM ANTICIPOS_CLIENTE WHERE RECA_ID = 0;

FOR SELECT FACT_ID, FACT_FECHA, TERC_NIT, FACT_RTFTEMONTO, FACT_rtivamonto, FACT_rticamonto, FACT_TOTAL, FACT_TRM
    FROM FACTURAS WHERE FACT_ID <> 0 and fact_anulado = 'N' AND TERC_NIT >= :CLIINI AND TERC_NIT <= :CLIFIN
    ORDER BY FACT_FECHA
    INTO :ID, :FECHA, :nit,  :RTFTE, :RTIVA, :RTICA, :MONTO, :TRM
    DO
    INSERT INTO SALDOS_DOC_CARTERA (SDCA_TIPOREF, SDCA_IDREF, SDCA_FECHA, TERC_NIT, SDCA_RTFTE, SDCA_RTIVA, SDCA_RTICA, SDCA_ABONO, SDCA_ABRTFTE, SDCA_ABRTIVA, SDCA_ABRTICA, SDCA_DEBITO, SDCA_MONTO, SDCA_TRM)
        VALUES (31, :ID, :fecha, :nit, :rtfte, :rtiva, :rtica, 0, 0, 0, 0, 'S', :MONTO, :TRM);

FOR SELECT NDCL_ID, NDCL_FECHA, TERC_NIT, NDCL_RTFTEMONTO, NDCL_rtivamonto, NDCL_rticamonto, ndcl_monto+ndcl_ivamonto, NDCL_TRM
    FROM NOTAS_DEBITO_CLIENTES WHERE NDCL_ID <> 0 and NDCL_anulado = 'N'  AND TERC_NIT >= :CLIINI AND TERC_NIT <= :CLIFIN
    ORDER BY NDCL_FECHA
    INTO :ID, :FECHA, :nit,  :RTFTE, :RTIVA, :RTICA, :MONTO, :TRM
    DO
    INSERT INTO SALDOS_DOC_CARTERA (SDCA_TIPOREF, SDCA_IDREF, SDCA_FECHA, TERC_NIT, SDCA_RTFTE, SDCA_RTIVA, SDCA_RTICA, SDCA_ABONO, SDCA_ABRTFTE, SDCA_ABRTIVA, SDCA_ABRTICA, SDCA_DEBITO, SDCA_MONTO, SDCA_TRM)
        VALUES (41, :ID, :fecha, :nit, :rtfte, :rtiva, :rtica, 0, 0, 0, 0, 'S', :MONTO, :TRM);

FOR SELECT DVCH_ID, DVCH_FECHA, TERC_NIT, 0, 0, 0, DVCH_MONTO
    FROM devolucion_cheques WHERE DVCH_ID <> 0 and DVCH_anulado = 'N' AND DVCH_CARTERA = 'S'  AND TERC_NIT >= :CLIINI AND TERC_NIT <= :CLIFIN
    ORDER BY DVCH_FECHA
    INTO :ID, :FECHA, :nit,  :RTFTE, :RTIVA, :RTICA, :MONTO
    DO
    INSERT INTO SALDOS_DOC_CARTERA (SDCA_TIPOREF, SDCA_IDREF, SDCA_FECHA, TERC_NIT, SDCA_RTFTE, SDCA_RTIVA, SDCA_RTICA, SDCA_ABONO, SDCA_ABRTFTE, SDCA_ABRTIVA, SDCA_ABRTICA, SDCA_DEBITO, SDCA_MONTO, SDCA_TRM)
        VALUES (77, :ID, :fecha, :nit, :rtfte, :rtiva, :rtica, 0, 0, 0, 0, 'S', :MONTO, 1);

FOR SELECT DEVT_ID, DEVT_FECHA, TERC_NIT, DEVT_RTFTEMONTO, DEVT_rtivamonto, DEVT_rticamonto, devt_total, DEVT_TRM
    FROM DEVOLUCIONES_VENTAS WHERE DEVT_ID <> 0 and DEVT_anulado = 'N' AND TERC_NIT >= :CLIINI AND TERC_NIT <= :CLIFIN
    ORDER BY DEVT_FECHA
    INTO :ID, :FECHA, :nit,  :RTFTE, :RTIVA, :RTICA, :MONTO, :TRM
    DO
    INSERT INTO SALDOS_DOC_CARTERA (SDCA_TIPOREF, SDCA_IDREF, SDCA_FECHA, TERC_NIT, SDCA_RTFTE, SDCA_RTIVA, SDCA_RTICA, SDCA_ABONO, SDCA_ABRTFTE, SDCA_ABRTIVA, SDCA_ABRTICA, SDCA_DEBITO, SDCA_MONTO, SDCA_TRM)
        VALUES (33, :ID, :fecha, :nit, :rtfte*-1, :rtiva*-1, :rtica*-1, 0, 0, 0, 0, 'N', :MONTO * -1, :TRM);

FOR SELECT NCCL_ID, NCCL_FECHA, TERC_NIT, NCCL_RTFTEMONTO, NCCL_rtivamonto, NCCL_rticamonto, nccl_monto+nccl_ivamonto, NCCL_TRM
    FROM NOTAS_CREDITO_CLIENTES WHERE NCCL_ID <> 0 and NCCL_anulado = 'N' AND TERC_NIT >= :CLIINI AND TERC_NIT <= :CLIFIN
    ORDER BY NCCL_FECHA
    INTO :ID, :FECHA, :nit,  :RTFTE, :RTIVA, :RTICA, :MONTO, :TRM
    DO
    INSERT INTO SALDOS_DOC_CARTERA (SDCA_TIPOREF, SDCA_IDREF, SDCA_FECHA, TERC_NIT, SDCA_RTFTE, SDCA_RTIVA, SDCA_RTICA, SDCA_ABONO, SDCA_ABRTFTE, SDCA_ABRTIVA, SDCA_ABRTICA, SDCA_DEBITO, SDCA_MONTO, SDCA_TRM)
        VALUES (42, :ID, :fecha, :nit, :rtfte*-1, :rtiva*-1, :rtica*-1, 0, 0, 0, 0, 'N', :MONTO * -1, :TRM);

FOR SELECT ANCL_ID, ANCL_FECHA, TERC_NIT, ANCL_RTFTEMONTO, ANCL_rtivamonto, ANCL_rticamonto, ancl_base+ancl_ivamonto, ANCL_TRM
    FROM ANTICIPOS_CLIENTE WHERE ANCL_ID <> 0 and ANCL_anulado = 'N' AND TERC_NIT >= :CLIINI AND TERC_NIT <= :CLIFIN
    ORDER BY ANCL_FECHA
    INTO :ID, :FECHA, :nit,  :RTFTE, :RTIVA, :RTICA, :MONTO, :TRM
    DO
    INSERT INTO SALDOS_DOC_CARTERA (SDCA_TIPOREF, SDCA_IDREF, SDCA_FECHA, TERC_NIT, SDCA_RTFTE, SDCA_RTIVA, SDCA_RTICA, SDCA_ABONO, SDCA_ABRTFTE, SDCA_ABRTIVA, SDCA_ABRTICA, SDCA_DEBITO, SDCA_MONTO, SDCA_TRM)
        VALUES (45, :ID, :fecha, :nit, :rtfte*-1, :rtiva*-1, :rtica*-1, 0, 0, 0, 0, 'N', :MONTO * -1, :TRM);

FOR SELECT ACDE_TIPODOC, ACDE_IDDOC, APCL_FECHA, TERC_NIT, ACDE_APLICADO, ACDE_RTFTE, ACDE_RTIVA, ACDE_RTICA, A.apcl_trm
    FROM APLICACION_CLIENTE_DETALLE D, APLICACION_CLIENTE A
    WHERE A.APCL_ID = D.apcl_id AND A.APCL_ID <> 0 AND APCL_ANULADO = 'N' AND TERC_NIT >= :CLIINI AND TERC_NIT <= :CLIFIN
    ORDER BY APCL_FECHA
    INTO :TIPO, :ID, :FECHA, :NIT, :MONTO, :RTFTE, :RTIVA, :RTICA, :TRM
    DO
    BEGIN
    EXISTE = 'N';
    select 'S' from saldos_doc_cartera where sdca_tiporef = :TIPO and sdca_idref = :ID and sdca_fecha = :fecha into :EXISTE;
    if (Existe = 'S') then
        begin
        /* actualice el saldo del dia */
        UPDATE saldos_doc_cartera
            SET SDCA_ABONO = SDCA_ABONO + :MONTO,
                SDCA_ABRTFTE = SDCA_ABRTFTE + :RTFTE,
                SDCA_ABRTIVA = SDCA_ABRTIVA + :RTIVA,
                SDCA_ABRTICA = SDCA_ABRTICA + :RTICA,
                SDCA_TRM = :TRM
            WHERE SDCA_TIPOREF = :TIPO AND SDCA_IDREF = :ID AND SDCA_FECHA = :fecha;
        END
    ELSE
        BEGIN
        /* Inserte un nuevo saldo diario */
        INSERT INTO SALDOS_DOC_CARTERA (SDCA_TIPOREF, SDCA_IDREF, SDCA_FECHA, TERC_NIT, SDCA_RTFTE, SDCA_RTIVA, SDCA_RTICA, SDCA_ABONO, SDCA_ABRTFTE, SDCA_ABRTIVA, SDCA_ABRTICA, SDCA_DEBITO, SDCA_MONTO, SDCA_TRM)
            VALUES (:TIPO, :ID, :fecha, :NIT, 0, 0, 0, :MONTO, :rtfte, :rtiva, :rtica, 'N', 0, :TRM);
        END
    END

FOR SELECT R.RECA_ID, RCDE_TIPODOC, RCDE_IDDOC, RECA_FECHA, TERC_NIT, RCDE_ABONO+RCDE_DTOF, RCDE_RTFTE, RCDE_RTIVA, RCDE_RTICA, RECA_TRM
    FROM RECIBOS_CAJA_DETALLE D, RECIBOS_CAJA R
    WHERE R.RECA_ID = D.RECA_id AND R.RECA_ID <> 0 AND RECA_ANULADO = 'N' AND TERC_NIT >= :CLIINI AND TERC_NIT <= :CLIFIN
    ORDER BY RECA_FECHA
    INTO :IDR, :TIPO, :ID, :FECHA, :NIT, :MONTO, :RTFTE, :RTIVA, :RTICA, :TRM
    DO
    BEGIN
    EXISTE = 'N';
    if (TIPO = 45) then
        BEGIN
        SELECT RECA_ID FROM ANTICIPOS_CLIENTE WHERE ANCL_ID = :ID INTO :RECAID;
        if (RECAID = IDR) then
            EXISTE = 'S';
        END
    if (EXISTE = 'N') then
        BEGIN
        select 'S' from saldos_doc_cartera where sdca_tiporef = :TIPO and sdca_idref = :ID and sdca_fecha = :fecha into :EXISTE;
        if (Existe = 'S') then
            begin
            /* actualice el saldo del dia */
            UPDATE saldos_doc_cartera
                SET SDCA_ABONO = SDCA_ABONO + :MONTO,
                    SDCA_ABRTFTE = SDCA_ABRTFTE + :RTFTE,
                    SDCA_ABRTIVA = SDCA_ABRTIVA + :RTIVA,
                    SDCA_ABRTICA = SDCA_ABRTICA + :RTICA,
                    SDCA_TRM = :TRM
                WHERE SDCA_TIPOREF = :TIPO AND SDCA_IDREF = :ID AND SDCA_FECHA = :fecha;
            END
        ELSE
            BEGIN
            /* Inserte un nuevo saldo diario */
            INSERT INTO SALDOS_DOC_CARTERA (SDCA_TIPOREF, SDCA_IDREF, SDCA_FECHA, TERC_NIT, SDCA_RTFTE, SDCA_RTIVA, SDCA_RTICA, SDCA_ABONO, SDCA_ABRTFTE, SDCA_ABRTIVA, SDCA_ABRTICA, SDCA_DEBITO, SDCA_MONTO, SDCA_TRM)
                VALUES (:TIPO, :ID, :fecha, :NIT, 0, 0, 0, :MONTO, :rtfte, :rtiva, :rtica, 'N', 0, :TRM);
            END
        END
    END

FOR SELECT E.egre_id, EGCC_TIPODOC, EGCC_IDDOC, EGRE_FECHA, TERC_NIT, EGCC_ABONO+EGCC_DTOF, EGCC_RTFTE, EGCC_RTIVA, EGCC_RTICA, EGRE_TRM
    FROM EGRESOS_CRUCEC C, EGRESOS E
    WHERE E.egre_id = C.egre_id AND EGRE_ANULADO = 'N' AND TERC_NIT >= :CLIINI AND TERC_NIT <= :CLIFIN
    ORDER BY EGRE_FECHA
    INTO :IDR, :TIPO, :ID, :FECHA, :NIT, :MONTO, :RTFTE, :RTIVA, :RTICA, :TRM
    DO
    BEGIN
    select 'S' from saldos_doc_cartera where sdca_tiporef = :TIPO and sdca_idref = :ID and sdca_fecha = :fecha into :EXISTE;
    if (Existe = 'S') then
        begin
        /* actualice el saldo del dia */
        UPDATE saldos_doc_cartera
            SET SDCA_ABONO = SDCA_ABONO + :MONTO,
            SDCA_ABRTFTE = SDCA_ABRTFTE + :RTFTE,
            SDCA_ABRTIVA = SDCA_ABRTIVA + :RTIVA,
            SDCA_ABRTICA = SDCA_ABRTICA + :RTICA,
            SDCA_TRM = :TRM
            WHERE SDCA_TIPOREF = :TIPO AND SDCA_IDREF = :ID AND SDCA_FECHA = :fecha;
        END
    ELSE
        BEGIN
        /* Inserte un nuevo saldo diario */
        INSERT INTO SALDOS_DOC_CARTERA (SDCA_TIPOREF, SDCA_IDREF, SDCA_FECHA, TERC_NIT, SDCA_RTFTE, SDCA_RTIVA, SDCA_RTICA, SDCA_ABONO, SDCA_ABRTFTE, SDCA_ABRTIVA, SDCA_ABRTICA, SDCA_DEBITO, SDCA_MONTO, SDCA_TRM)
            VALUES (:TIPO, :ID, :fecha, :NIT, 0, 0, 0, :MONTO, :rtfte, :rtiva, :rtica, 'N', 0, :TRM);
        END
    END

for select ancl_id, ancl_base+ancl_ivamonto, PREF_PRE, ANCL_NUMERO, ANCL_TRM from anticipos_cliente
    where ANCL_ANULADO = 'N' and reca_id not in (select reca_id from recibos_caja where reca_anulado = 'N')
    into :ID, :MONTO, :PREF, :NUMERO, :TRM
    do
    begin
    FECHA = cast('now' as date);
    execute procedure saldo_doc_cartera(45, :id, :FECHA, 0) returning_values (:RTFTE);
    if ((MONTO = RTFTE) or (RTFTE IS NULL)) then
        DELETE FROM ANTICIPOS_CLIENTE WHERE ANCL_ID = :ID;
    ELSE
        BEGIN
        TIPO = 45;
        ERROR = 'DOCUMENTO ANULADO CON ABONOS';
        SUSPEND;
        END
    end
SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER PROCEDURE CARTERA_CLIENTE(
    NIT VARCHAR(20),
    FECHA DATE,
    SUCURSAL VARCHAR(10),
    MONEDA INTEGER)
RETURNS (
    TIPO INTEGER,
    ID INTEGER,
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(6),
    CONCEPTO VARCHAR(60),
    SALDO NUMERIC(18,2),
    RTFTE NUMERIC(18,2),
    RTIVA NUMERIC(18,2),
    RTICA NUMERIC(18,2),
    DTOF NUMERIC(18,2),
    TIPONOM VARCHAR(8),
    VENCE DATE,
    FECDOC DATE,
    DIAS INTEGER,
    RECPROV_ID INTEGER,
    RECIPROV CHAR(1),
    NOTA VARCHAR(256),
    TRMDOC NUMERIC(18,2))
AS
declare variable FEC DATE;
declare variable DESC_RTES CHAR(2);
declare variable DTOAPL NUMERIC(18,2);
declare variable IDNOTA INTEGER;
declare variable AUTORET VARCHAR(10);
declare variable FAUTORET DATE;
BEGIN
EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'DESCONTAR RETENCIONES POR CAUSACION') returning_values (DESC_RTES);
EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'FECHA AUTORETENEDOR NO DESCONTAR RETENCIONES DEL SALDO PERO SI CONTABILIZARLAS') returning_values (AUTORET);
if (AUTORET <> '') then
    FAUTORET = CAST(AUTORET AS DATE);
else
    FAUTORET = '9999/12/31';
/* LAS DE ANTES DE LA AUTORETENCION */
if (MONEDA = 0) then
  BEGIN
  if (DESC_RTES = 'SI') then
    BEGIN
    FOR SELECT MAX(SDCA_TIPOREF), MAX(SDCA_IDREF), sum(SDCA_MONTO-SDCA_ABONO-SDCA_RTFTE-SDCA_RTIVA-SDCA_RTICA), SUM(SDCA_RTFTE - SDCA_ABRTFTE), SUM(SDCA_RTIVA - SDCA_ABRTIVA), SUM(SDCA_RTICA - SDCA_ABRTICA)
        FROM saldos_doc_cartera WHERE TERC_NIT = :nit AND (SDCA_FECHA <= :FECHA) AND (SDCA_FECHA < :FAUTORET)
        group by sdca_tiporef, sdca_idref INTO :TIPO, :ID, :SALDO, :RTFTE, :RTIVA, :RTICA
        DO
        begin
        if (SALDO <> 0) then
            BEGIN
            SELECT MVCL_FECHA, MVCL_VENCE, MVCL_PREFREF, MVCL_NUMREF, MVCL_CONC, MVCL_TRM
              FROM MOVIMIENTO_CLIENTES WHERE TERC_NIT = :NIT AND mvcl_sucursal = :sucursal and MVCL_FECHA <= :FECHA AND MVCL_ABONO = 'N' and mvcl_tiporef = :tipo and mvcl_idref = :id
              INTO :FECDOC, :VENCE, :PREFIJO, :NUMERO, :CONCEPTO, :TRMDOC;
            DIAS = (FECHA -VENCE );
            SELECT TIDO_NOMCORTO FROM TIPO_DOCUMENTO WHERE TIDO_COD = :TIPO INTO :TIPONOM;
            if (TIPO = 41) then
                SELECT NDCL_DTOFMONTO, NDCL_FECHADTO FROM NOTAS_DEBITO_CLIENTES WHERE NDCL_ID = :ID INTO :DTOF, :FEC;
            if (TIPO = 42) then
                SELECT 0, NCCL_FECHA FROM NOTAS_CREDITO_CLIENTES WHERE NCCL_ID = :ID INTO :DTOF, :FEC;
            if (TIPO = 45) then
                SELECT ANCL_DTOFMONTO, ANCL_DTOFECHA FROM ANTICIPOS_CLIENTE WHERE ANCL_ID = :ID INTO :DTOF, :FEC;
            if (TIPO = 31) then
                SELECT FACT_DTOFMONTO, FACT_DTOFFECHA FROM FACTURAS WHERE FACT_ID = :ID INTO :DTOF, :FEC;
            if (TIPO = 33) then
                SELECT 0, :FECHA FROM devoluciones_ventas WHERE DEVT_ID = :ID INTO :DTOF, :FEC;

            recprov_id = 0;
            SELECT max(RCPR_ID) FROM recibo_provisional_detalle WHERE RPDE_IDDOC = :ID AND RPDE_TIPODOC = :TIPO and RPDE_ANULADO = 'N' INTO :recprov_id;
            if (recprov_id is null) then
                reciprov = 'N';
            ELSE
                reciprov = 'S';
            if (FECHA > FEC) then
                DTOF = 0;
            if (DTOF IS NULL) then
                DTOF = 0;
            if (DTOF <> 0) then
                BEGIN
                SELECT SUM(RCDE_DTOF) FROM RECIBOS_CAJA_DETALLE WHERE RCDE_IDDOC = :ID AND RCDE_TIPODOC = :TIPO INTO :DTOAPL;
                if (DTOAPL IS NULL) then
                    DTOAPL = 0;
                DTOF = DTOF - DTOAPL;
                END
            if (RTFTE IS NULL) then
                RTFTE = 0;
            if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) THEN
                BEGIN
                if (RTFTE > 0) then
                    RTFTE = 0;
                END
            ELSE
                BEGIN
                if (RTFTE < 0) then
                    RTFTE = 0;
                END

            if (RTIVA IS NULL) then
                RTIVA = 0;
            if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) THEN
                BEGIN
                if (RTIVA > 0) then
                    RTIVA = 0;
                END
            ELSE
                BEGIN
                if (RTIVA < 0) then
                    RTIVA = 0;
                END

            if (RTICA IS NULL) then
                RTICA = 0;
            if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) THEN
                BEGIN
                if (RTICA > 0) then
                    RTICA = 0;
                END
            ELSE
                BEGIN
                if (RTICA < 0) then
                    RTICA = 0;
                END

            /* SI TIENE NOTA AGREGUELA */
            SELECT MAX(NOCL_ID) FROM NOTAS_CLIENTES WHERE TERC_NIT = :NIT AND CLSU_COD = :SUCURSAL AND NOCL_TIPODOC = :TIPO AND NOCL_IDDOC = :ID INTO :IDNOTA;
            if (IDNOTA IS NOT NULL) then
                SELECT NOCL_TEXTO FROM NOTAS_CLIENTES WHERE NOCL_ID = :IDNOTA INTO :NOTA;
            else
                NOTA = '';
            SUSPEND;
            END
        end
    /* LAS DE DESPUES DE LA AUTORETENCION */
    FOR SELECT MAX(SDCA_TIPOREF), MAX(SDCA_IDREF), sum(SDCA_MONTO-SDCA_ABONO-SDCA_RTIVA-SDCA_RTICA), 0, SUM(SDCA_RTIVA - SDCA_ABRTIVA), SUM(SDCA_RTICA - SDCA_ABRTICA)
        FROM saldos_doc_cartera WHERE (TERC_NIT = :nit) AND (SDCA_FECHA <= :FECHA) AND (SDCA_FECHA >= :FAUTORET) group by sdca_tiporef, sdca_idref
        INTO :TIPO, :ID, :SALDO, :RTFTE, :RTIVA, :RTICA
        DO
        begin
        if (SALDO <> 0) then
            BEGIN
            SELECT MVCL_FECHA, MVCL_VENCE, MVCL_PREFREF, MVCL_NUMREF, MVCL_CONC
              FROM MOVIMIENTO_CLIENTES WHERE TERC_NIT = :NIT AND mvcl_sucursal = :sucursal and MVCL_FECHA <= :FECHA AND MVCL_ABONO = 'N' and mvcl_tiporef = :tipo and mvcl_idref = :id
              INTO :FECDOC, :VENCE, :PREFIJO, :NUMERO, :CONCEPTO;
            DIAS = (FECHA -VENCE );
            SELECT TIDO_NOMCORTO FROM TIPO_DOCUMENTO WHERE TIDO_COD = :TIPO INTO :TIPONOM;
            if (TIPO = 41) then
                SELECT NDCL_DTOFMONTO, NDCL_FECHADTO FROM NOTAS_DEBITO_CLIENTES WHERE NDCL_ID = :ID INTO :DTOF, :FEC;
            if (TIPO = 42) then
                SELECT 0, NCCL_FECHA FROM NOTAS_CREDITO_CLIENTES WHERE NCCL_ID = :ID INTO :DTOF, :FEC;
            if (TIPO = 45) then
                SELECT ANCL_DTOFMONTO, ANCL_DTOFECHA FROM ANTICIPOS_CLIENTE WHERE ANCL_ID = :ID INTO :DTOF, :FEC;
            if (TIPO = 31) then
                SELECT FACT_DTOFMONTO, FACT_DTOFFECHA FROM FACTURAS WHERE FACT_ID = :ID INTO :DTOF, :FEC;
            if (TIPO = 33) then
                SELECT 0, :FECHA FROM devoluciones_ventas WHERE DEVT_ID = :ID INTO :DTOF, :FEC;

            recprov_id = 0;
            SELECT max(RCPR_ID) FROM recibo_provisional_detalle WHERE RPDE_IDDOC = :ID AND RPDE_TIPODOC = :TIPO and RPDE_ANULADO = 'N' INTO :recprov_id;
            if (recprov_id is null) then
                reciprov = 'N';
            ELSE
                reciprov = 'S';
            if (FECHA > FEC) then
                DTOF = 0;
            if (DTOF IS NULL) then
                DTOF = 0;
            if (DTOF <> 0) then
                BEGIN
                SELECT SUM(RCDE_DTOF) FROM RECIBOS_CAJA_DETALLE WHERE RCDE_IDDOC = :ID AND RCDE_TIPODOC = :TIPO INTO :DTOAPL;
                if (DTOAPL IS NULL) then
                    DTOAPL = 0;
                DTOF = DTOF - DTOAPL;
                END

            if (RTIVA IS NULL) then
                RTIVA = 0;
            if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) THEN
                BEGIN
                if (RTIVA > 0) then
                    RTIVA = 0;
                END
            ELSE
                BEGIN
                if (RTIVA < 0) then
                    RTIVA = 0;
                END

            if (RTICA IS NULL) then
                RTICA = 0;
            if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) THEN
                BEGIN
                if (RTICA > 0) then
                    RTICA = 0;
                END
            ELSE
                BEGIN
                if (RTICA < 0) then
                    RTICA = 0;
                END

            /* SI TIENE NOTA AGREGUELA */
            SELECT MAX(NOCL_ID) FROM NOTAS_CLIENTES WHERE TERC_NIT = :NIT AND CLSU_COD = :SUCURSAL AND NOCL_TIPODOC = :TIPO AND NOCL_IDDOC = :ID INTO :IDNOTA;
            if (IDNOTA IS NOT NULL) then
                SELECT NOCL_TEXTO FROM NOTAS_CLIENTES WHERE NOCL_ID = :IDNOTA INTO :NOTA;
            else
                NOTA = '';
            SUSPEND;
            END
        end
    END
  ELSE
    BEGIN
    FOR SELECT MAX(SDCA_TIPOREF), MAX(SDCA_IDREF), sum(SDCA_MONTO-SDCA_ABONO-SDCA_ABRTFTE-SDCA_ABRTIVA-SDCA_ABRTICA), SUM(SDCA_RTFTE - SDCA_ABRTFTE), SUM(SDCA_RTIVA - SDCA_ABRTIVA), SUM(SDCA_RTICA - SDCA_ABRTICA)
        FROM saldos_doc_cartera WHERE (TERC_NIT = :nit) AND (SDCA_FECHA <= :FECHA) AND (SDCA_FECHA < :FAUTORET) group by sdca_tiporef, sdca_idref
        INTO :TIPO, :ID, :SALDO, :RTFTE, :RTIVA, :RTICA
        DO
        begin
        if (SALDO <> 0) then
            BEGIN
            SELECT MVCL_FECHA, MVCL_VENCE, MVCL_PREFREF, MVCL_NUMREF, MVCL_CONC
              FROM MOVIMIENTO_CLIENTES WHERE TERC_NIT = :NIT AND mvcl_sucursal = :sucursal and MVCL_FECHA <= :FECHA AND MVCL_ABONO = 'N' and mvcl_tiporef = :tipo and mvcl_idref = :id
              INTO :FECDOC, :VENCE, :PREFIJO, :NUMERO, :CONCEPTO;
            DIAS = (FECHA -VENCE );
            SELECT TIDO_NOMCORTO FROM TIPO_DOCUMENTO WHERE TIDO_COD = :TIPO INTO :TIPONOM;
            if (TIPO = 41) then
                SELECT NDCL_DTOFMONTO, NDCL_FECHADTO FROM NOTAS_DEBITO_CLIENTES WHERE NDCL_ID = :ID INTO :DTOF, :FEC;
            if (TIPO = 42) then
                SELECT 0, NCCL_FECHA FROM NOTAS_CREDITO_CLIENTES WHERE NCCL_ID = :ID INTO :DTOF, :FEC;
            if (TIPO = 45) then
                SELECT ANCL_DTOFMONTO, ANCL_DTOFECHA FROM ANTICIPOS_CLIENTE WHERE ANCL_ID = :ID INTO :DTOF, :FEC;
            if (TIPO = 31) then
                SELECT FACT_DTOFMONTO, FACT_DTOFFECHA FROM FACTURAS WHERE FACT_ID = :ID INTO :DTOF, :FEC;
            if (TIPO = 33) then
                SELECT 0, :FECHA FROM devoluciones_ventas WHERE DEVT_ID = :ID INTO :DTOF, :FEC;

            recprov_id = 0;
            SELECT max(RCPR_ID) FROM recibo_provisional_detalle WHERE RPDE_IDDOC = :ID AND RPDE_TIPODOC = :TIPO and RPDE_ANULADO = 'N' INTO :recprov_id;
            if (recprov_id is null) then
                reciprov = 'N';
            ELSE
                reciprov = 'S';
            if (FECHA > FEC) then
                DTOF = 0;
            if (DTOF IS NULL) then
                DTOF = 0;
            if (DTOF <> 0) then
                BEGIN
                SELECT SUM(RCDE_DTOF) FROM RECIBOS_CAJA_DETALLE WHERE RCDE_IDDOC = :ID AND RCDE_TIPODOC = :TIPO INTO :DTOAPL;
                if (DTOAPL IS NULL) then
                    DTOAPL = 0;
                DTOF = DTOF - DTOAPL;
                END
            if (RTFTE IS NULL) then
                RTFTE = 0;
            if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) THEN
                BEGIN
                if (RTFTE > 0) then
                    RTFTE = 0;
                END
            ELSE
                BEGIN
                if (RTFTE < 0) then
                    RTFTE = 0;
                END

            if (RTIVA IS NULL) then
                RTIVA = 0;
            if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) THEN
                BEGIN
                if (RTIVA > 0) then
                    RTIVA = 0;
                END
            ELSE
                BEGIN
                if (RTIVA < 0) then
                    RTIVA = 0;
                END

            if (RTICA IS NULL) then
                RTICA = 0;
            if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) THEN
                BEGIN
                if (RTICA > 0) then
                    RTICA = 0;
                END
            ELSE
                BEGIN
                if (RTICA < 0) then
                    RTICA = 0;
                END

            /* SI TIENE NOTA AGREGUELA */
            SELECT MAX(NOCL_ID) FROM NOTAS_CLIENTES WHERE TERC_NIT = :NIT AND CLSU_COD = :SUCURSAL AND NOCL_TIPODOC = :TIPO AND NOCL_IDDOC = :ID INTO :IDNOTA;
            if (IDNOTA IS NOT NULL) then
                SELECT NOCL_TEXTO FROM NOTAS_CLIENTES WHERE NOCL_ID = :IDNOTA INTO :NOTA;
            else
                NOTA = '';
            SUSPEND;
            END
        end
    /* DESPUES DE LA AUTORETENCION */
    FOR SELECT MAX(SDCA_TIPOREF), MAX(SDCA_IDREF), sum(SDCA_MONTO-SDCA_ABONO-SDCA_ABRTIVA-SDCA_ABRTICA), SUM(SDCA_RTFTE - SDCA_ABRTFTE), SUM(SDCA_RTIVA - SDCA_ABRTIVA), SUM(SDCA_RTICA - SDCA_ABRTICA)
        FROM saldos_doc_cartera WHERE (TERC_NIT = :nit) AND (SDCA_FECHA <= :FECHA) AND (SDCA_FECHA >= :FAUTORET) group by sdca_tiporef, sdca_idref
        INTO :TIPO, :ID, :SALDO, :RTFTE, :RTIVA, :RTICA
        DO
        begin
        if (SALDO <> 0) then
            BEGIN
            SELECT MVCL_FECHA, MVCL_VENCE, MVCL_PREFREF, MVCL_NUMREF, MVCL_CONC
              FROM MOVIMIENTO_CLIENTES WHERE TERC_NIT = :NIT AND mvcl_sucursal = :sucursal and MVCL_FECHA <= :FECHA AND MVCL_ABONO = 'N' and mvcl_tiporef = :tipo and mvcl_idref = :id
              INTO :FECDOC, :VENCE, :PREFIJO, :NUMERO, :CONCEPTO;
            DIAS = (FECHA -VENCE );
            SELECT TIDO_NOMCORTO FROM TIPO_DOCUMENTO WHERE TIDO_COD = :TIPO INTO :TIPONOM;
            if (TIPO = 41) then
                SELECT NDCL_DTOFMONTO, NDCL_FECHADTO FROM NOTAS_DEBITO_CLIENTES WHERE NDCL_ID = :ID INTO :DTOF, :FEC;
            if (TIPO = 42) then
                SELECT 0, NCCL_FECHA FROM NOTAS_CREDITO_CLIENTES WHERE NCCL_ID = :ID INTO :DTOF, :FEC;
            if (TIPO = 45) then
                SELECT ANCL_DTOFMONTO, ANCL_DTOFECHA FROM ANTICIPOS_CLIENTE WHERE ANCL_ID = :ID INTO :DTOF, :FEC;
            if (TIPO = 31) then
                SELECT FACT_DTOFMONTO, FACT_DTOFFECHA FROM FACTURAS WHERE FACT_ID = :ID INTO :DTOF, :FEC;
            if (TIPO = 33) then
                SELECT 0, :FECHA FROM devoluciones_ventas WHERE DEVT_ID = :ID INTO :DTOF, :FEC;

            recprov_id = 0;
            SELECT max(RCPR_ID) FROM recibo_provisional_detalle WHERE RPDE_IDDOC = :ID AND RPDE_TIPODOC = :TIPO and RPDE_ANULADO = 'N' INTO :recprov_id;
            if (recprov_id is null) then
                reciprov = 'N';
            ELSE
                reciprov = 'S';
            if (FECHA > FEC) then
                DTOF = 0;
            if (DTOF IS NULL) then
                DTOF = 0;
            if (DTOF <> 0) then
                BEGIN
                SELECT SUM(RCDE_DTOF) FROM RECIBOS_CAJA_DETALLE WHERE RCDE_IDDOC = :ID AND RCDE_TIPODOC = :TIPO INTO :DTOAPL;
                if (DTOAPL IS NULL) then
                    DTOAPL = 0;
                DTOF = DTOF - DTOAPL;
                END

            if (RTIVA IS NULL) then
                RTIVA = 0;
            if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) THEN
                BEGIN
                if (RTIVA > 0) then
                    RTIVA = 0;
                END
            ELSE
                BEGIN
                if (RTIVA < 0) then
                    RTIVA = 0;
                END

            if (RTICA IS NULL) then
                RTICA = 0;
            if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) THEN
                BEGIN
                if (RTICA > 0) then
                    RTICA = 0;
                END
            ELSE
                BEGIN
                if (RTICA < 0) then
                    RTICA = 0;
                END

            /* SI TIENE NOTA AGREGUELA */
            SELECT MAX(NOCL_ID) FROM NOTAS_CLIENTES WHERE TERC_NIT = :NIT AND CLSU_COD = :SUCURSAL AND NOCL_TIPODOC = :TIPO AND NOCL_IDDOC = :ID INTO :IDNOTA;
            if (IDNOTA IS NOT NULL) then
                SELECT NOCL_TEXTO FROM NOTAS_CLIENTES WHERE NOCL_ID = :IDNOTA INTO :NOTA;
            else
                NOTA = '';
            SUSPEND;
            END
        end
    END
  END
ELSE
  BEGIN
  if (DESC_RTES = 'SI') then
    BEGIN
    FOR SELECT MAX(SDCA_TIPOREF), MAX(SDCA_IDREF), sum((SDCA_MONTO-SDCA_ABONO-SDCA_RTFTE-SDCA_RTIVA-SDCA_RTICA)/SDCA_TRM), SUM((SDCA_RTFTE-SDCA_ABRTFTE)/SDCA_TRM), SUM((SDCA_RTIVA-SDCA_ABRTIVA)/SDCA_TRM), SUM((SDCA_RTICA-SDCA_ABRTICA)/SDCA_TRM)
        FROM saldos_doc_cartera WHERE TERC_NIT = :nit AND (SDCA_FECHA <= :FECHA) AND (SDCA_FECHA < :FAUTORET) AND SDCA_TRM <> 1
        group by sdca_tiporef, sdca_idref INTO :TIPO, :ID, :SALDO, :RTFTE, :RTIVA, :RTICA
        DO
        begin
        if (SALDO <> 0) then
            BEGIN
            SELECT MVCL_FECHA, MVCL_VENCE, MVCL_PREFREF, MVCL_NUMREF, MVCL_CONC, MVCL_TRM
              FROM MOVIMIENTO_CLIENTES WHERE TERC_NIT = :NIT AND mvcl_sucursal = :sucursal and MVCL_FECHA <= :FECHA AND MVCL_ABONO = 'N' and mvcl_tiporef = :tipo and mvcl_idref = :id
              INTO :FECDOC, :VENCE, :PREFIJO, :NUMERO, :CONCEPTO, :TRMDOC;
            DIAS = (FECHA -VENCE );
            SELECT TIDO_NOMCORTO FROM TIPO_DOCUMENTO WHERE TIDO_COD = :TIPO INTO :TIPONOM;
            if (TIPO = 41) then
                SELECT NDCL_DTOFMONTO/NDCL_TRM, NDCL_FECHADTO FROM NOTAS_DEBITO_CLIENTES WHERE NDCL_ID = :ID INTO :DTOF, :FEC;
            if (TIPO = 42) then
                SELECT 0, NCCL_FECHA FROM NOTAS_CREDITO_CLIENTES WHERE NCCL_ID = :ID INTO :DTOF, :FEC;
            if (TIPO = 45) then
                SELECT ANCL_DTOFMONTO/ANCL_TRM, ANCL_DTOFECHA FROM ANTICIPOS_CLIENTE WHERE ANCL_ID = :ID INTO :DTOF, :FEC;
            if (TIPO = 31) then
                SELECT FACT_DTOFMONTO/FACT_TRM, FACT_DTOFFECHA FROM FACTURAS WHERE FACT_ID = :ID INTO :DTOF, :FEC;
            if (TIPO = 33) then
                SELECT 0, :FECHA FROM devoluciones_ventas WHERE DEVT_ID = :ID INTO :DTOF, :FEC;

            recprov_id = 0;
            SELECT max(RCPR_ID) FROM recibo_provisional_detalle WHERE RPDE_IDDOC = :ID AND RPDE_TIPODOC = :TIPO and RPDE_ANULADO = 'N' INTO :recprov_id;
            if (recprov_id is null) then
                reciprov = 'N';
            ELSE
                reciprov = 'S';
            if (FECHA > FEC) then
                DTOF = 0;
            if (DTOF IS NULL) then
                DTOF = 0;
            if (DTOF <> 0) then
                BEGIN
                SELECT SUM(RCDE_DTOF/RECA_TRM) FROM RECIBOS_CAJA_DETALLE D, recibos_caja R
                    WHERE R.reca_id = D.reca_id AND RCDE_IDDOC = :ID AND RCDE_TIPODOC = :TIPO INTO :DTOAPL;
                if (DTOAPL IS NULL) then
                    DTOAPL = 0;
                DTOF = DTOF - DTOAPL;
                END
            if (RTFTE IS NULL) then
                RTFTE = 0;
            if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) THEN
                BEGIN
                if (RTFTE > 0) then
                    RTFTE = 0;
                END
            ELSE
                BEGIN
                if (RTFTE < 0) then
                    RTFTE = 0;
                END

            if (RTIVA IS NULL) then
                RTIVA = 0;
            if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) THEN
                BEGIN
                if (RTIVA > 0) then
                    RTIVA = 0;
                END
            ELSE
                BEGIN
                if (RTIVA < 0) then
                    RTIVA = 0;
                END

            if (RTICA IS NULL) then
                RTICA = 0;
            if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) THEN
                BEGIN
                if (RTICA > 0) then
                    RTICA = 0;
                END
            ELSE
                BEGIN
                if (RTICA < 0) then
                    RTICA = 0;
                END

            /* SI TIENE NOTA AGREGUELA */
            SELECT MAX(NOCL_ID) FROM NOTAS_CLIENTES WHERE TERC_NIT = :NIT AND CLSU_COD = :SUCURSAL AND NOCL_TIPODOC = :TIPO AND NOCL_IDDOC = :ID INTO :IDNOTA;
            if (IDNOTA IS NOT NULL) then
                SELECT NOCL_TEXTO FROM NOTAS_CLIENTES WHERE NOCL_ID = :IDNOTA INTO :NOTA;
            else
                NOTA = '';
            SUSPEND;
            END
        end
    /* LAS DE DESPUES DE LA AUTORETENCION */
    FOR SELECT MAX(SDCA_TIPOREF), MAX(SDCA_IDREF), sum((SDCA_MONTO-SDCA_ABONO-SDCA_RTIVA-SDCA_RTICA)/SDCA_TRM), 0, SUM((SDCA_RTIVA-SDCA_ABRTIVA)/SDCA_TRM), SUM((SDCA_RTICA-SDCA_ABRTICA)/SDCA_TRM)
        FROM saldos_doc_cartera WHERE (TERC_NIT = :nit) AND (SDCA_FECHA <= :FECHA) AND (SDCA_FECHA >= :FAUTORET) group by sdca_tiporef, sdca_idref
        INTO :TIPO, :ID, :SALDO, :RTFTE, :RTIVA, :RTICA
        DO
        begin
        if (SALDO <> 0) then
            BEGIN
            SELECT MVCL_FECHA, MVCL_VENCE, MVCL_PREFREF, MVCL_NUMREF, MVCL_CONC
              FROM MOVIMIENTO_CLIENTES WHERE TERC_NIT = :NIT AND mvcl_sucursal = :sucursal and MVCL_FECHA <= :FECHA AND MVCL_ABONO = 'N' and mvcl_tiporef = :tipo and mvcl_idref = :id
              INTO :FECDOC, :VENCE, :PREFIJO, :NUMERO, :CONCEPTO;
            DIAS = (FECHA -VENCE );
            SELECT TIDO_NOMCORTO FROM TIPO_DOCUMENTO WHERE TIDO_COD = :TIPO INTO :TIPONOM;
            if (TIPO = 41) then
                SELECT NDCL_DTOFMONTO/NDCL_TRM, NDCL_FECHADTO FROM NOTAS_DEBITO_CLIENTES WHERE NDCL_ID = :ID INTO :DTOF, :FEC;
            if (TIPO = 42) then
                SELECT 0, NCCL_FECHA FROM NOTAS_CREDITO_CLIENTES WHERE NCCL_ID = :ID INTO :DTOF, :FEC;
            if (TIPO = 45) then
                SELECT ANCL_DTOFMONTO/ANCL_TRM, ANCL_DTOFECHA FROM ANTICIPOS_CLIENTE WHERE ANCL_ID = :ID INTO :DTOF, :FEC;
            if (TIPO = 31) then
                SELECT FACT_DTOFMONTO/FACT_TRM, FACT_DTOFFECHA FROM FACTURAS WHERE FACT_ID = :ID INTO :DTOF, :FEC;
            if (TIPO = 33) then
                SELECT 0, :FECHA FROM devoluciones_ventas WHERE DEVT_ID = :ID INTO :DTOF, :FEC;

            recprov_id = 0;
            SELECT max(RCPR_ID) FROM recibo_provisional_detalle WHERE RPDE_IDDOC = :ID AND RPDE_TIPODOC = :TIPO and RPDE_ANULADO = 'N' INTO :recprov_id;
            if (recprov_id is null) then
                reciprov = 'N';
            ELSE
                reciprov = 'S';
            if (FECHA > FEC) then
                DTOF = 0;
            if (DTOF IS NULL) then
                DTOF = 0;
            if (DTOF <> 0) then
                BEGIN
                SELECT SUM(RCDE_DTOF/RECA_TRM) FROM RECIBOS_CAJA_DETALLE D, RECIBOS_CAJA R
                    WHERE R.reca_id = D.reca_id AND RCDE_IDDOC = :ID AND RCDE_TIPODOC = :TIPO INTO :DTOAPL;
                if (DTOAPL IS NULL) then
                    DTOAPL = 0;
                DTOF = DTOF - DTOAPL;
                END

            if (RTIVA IS NULL) then
                RTIVA = 0;
            if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) THEN
                BEGIN
                if (RTIVA > 0) then
                    RTIVA = 0;
                END
            ELSE
                BEGIN
                if (RTIVA < 0) then
                    RTIVA = 0;
                END

            if (RTICA IS NULL) then
                RTICA = 0;
            if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) THEN
                BEGIN
                if (RTICA > 0) then
                    RTICA = 0;
                END
            ELSE
                BEGIN
                if (RTICA < 0) then
                    RTICA = 0;
                END

            /* SI TIENE NOTA AGREGUELA */
            SELECT MAX(NOCL_ID) FROM NOTAS_CLIENTES WHERE TERC_NIT = :NIT AND CLSU_COD = :SUCURSAL AND NOCL_TIPODOC = :TIPO AND NOCL_IDDOC = :ID INTO :IDNOTA;
            if (IDNOTA IS NOT NULL) then
                SELECT NOCL_TEXTO FROM NOTAS_CLIENTES WHERE NOCL_ID = :IDNOTA INTO :NOTA;
            else
                NOTA = '';
            SUSPEND;
            END
        end
    END
  ELSE
    BEGIN
    FOR SELECT MAX(SDCA_TIPOREF), MAX(SDCA_IDREF), sum((SDCA_MONTO-SDCA_ABONO-SDCA_ABRTFTE-SDCA_ABRTIVA-SDCA_ABRTICA)/SDCA_TRM), SUM((SDCA_RTFTE-SDCA_ABRTFTE)/SDCA_TRM), SUM((SDCA_RTIVA-SDCA_ABRTIVA)/SDCA_TRM), SUM((SDCA_RTICA-SDCA_ABRTICA)/SDCA_TRM)
        FROM saldos_doc_cartera WHERE (TERC_NIT = :nit) AND (SDCA_FECHA <= :FECHA) AND (SDCA_FECHA < :FAUTORET) group by sdca_tiporef, sdca_idref
        INTO :TIPO, :ID, :SALDO, :RTFTE, :RTIVA, :RTICA
        DO
        begin
        if (SALDO <> 0) then
            BEGIN
            SELECT MVCL_FECHA, MVCL_VENCE, MVCL_PREFREF, MVCL_NUMREF, MVCL_CONC
              FROM MOVIMIENTO_CLIENTES WHERE TERC_NIT = :NIT AND mvcl_sucursal = :sucursal and MVCL_FECHA <= :FECHA AND MVCL_ABONO = 'N' and mvcl_tiporef = :tipo and mvcl_idref = :id
              INTO :FECDOC, :VENCE, :PREFIJO, :NUMERO, :CONCEPTO;
            DIAS = (FECHA -VENCE );
            SELECT TIDO_NOMCORTO FROM TIPO_DOCUMENTO WHERE TIDO_COD = :TIPO INTO :TIPONOM;
            if (TIPO = 41) then
                SELECT NDCL_DTOFMONTO/NDCL_TRM, NDCL_FECHADTO FROM NOTAS_DEBITO_CLIENTES WHERE NDCL_ID = :ID INTO :DTOF, :FEC;
            if (TIPO = 42) then
                SELECT 0, NCCL_FECHA FROM NOTAS_CREDITO_CLIENTES WHERE NCCL_ID = :ID INTO :DTOF, :FEC;
            if (TIPO = 45) then
                SELECT ANCL_DTOFMONTO/ANCL_TRM, ANCL_DTOFECHA FROM ANTICIPOS_CLIENTE WHERE ANCL_ID = :ID INTO :DTOF, :FEC;
            if (TIPO = 31) then
                SELECT FACT_DTOFMONTO/FACT_TRM, FACT_DTOFFECHA FROM FACTURAS WHERE FACT_ID = :ID INTO :DTOF, :FEC;
            if (TIPO = 33) then
                SELECT 0, :FECHA FROM devoluciones_ventas WHERE DEVT_ID = :ID INTO :DTOF, :FEC;

            recprov_id = 0;
            SELECT max(RCPR_ID) FROM recibo_provisional_detalle WHERE RPDE_IDDOC = :ID AND RPDE_TIPODOC = :TIPO and RPDE_ANULADO = 'N' INTO :recprov_id;
            if (recprov_id is null) then
                reciprov = 'N';
            ELSE
                reciprov = 'S';
            if (FECHA > FEC) then
                DTOF = 0;
            if (DTOF IS NULL) then
                DTOF = 0;
            if (DTOF <> 0) then
                BEGIN
                SELECT SUM(RCDE_DTOF/RECA_TRM) FROM RECIBOS_CAJA_DETALLE D, RECIBOS_CAJA R
                    WHERE R.reca_id = D.reca_id AND RCDE_IDDOC = :ID AND RCDE_TIPODOC = :TIPO INTO :DTOAPL;
                if (DTOAPL IS NULL) then
                    DTOAPL = 0;
                DTOF = DTOF - DTOAPL;
                END
            if (RTFTE IS NULL) then
                RTFTE = 0;
            if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) THEN
                BEGIN
                if (RTFTE > 0) then
                    RTFTE = 0;
                END
            ELSE
                BEGIN
                if (RTFTE < 0) then
                    RTFTE = 0;
                END

            if (RTIVA IS NULL) then
                RTIVA = 0;
            if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) THEN
                BEGIN
                if (RTIVA > 0) then
                    RTIVA = 0;
                END
            ELSE
                BEGIN
                if (RTIVA < 0) then
                    RTIVA = 0;
                END

            if (RTICA IS NULL) then
                RTICA = 0;
            if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) THEN
                BEGIN
                if (RTICA > 0) then
                    RTICA = 0;
                END
            ELSE
                BEGIN
                if (RTICA < 0) then
                    RTICA = 0;
                END

            /* SI TIENE NOTA AGREGUELA */
            SELECT MAX(NOCL_ID) FROM NOTAS_CLIENTES WHERE TERC_NIT = :NIT AND CLSU_COD = :SUCURSAL AND NOCL_TIPODOC = :TIPO AND NOCL_IDDOC = :ID INTO :IDNOTA;
            if (IDNOTA IS NOT NULL) then
                SELECT NOCL_TEXTO FROM NOTAS_CLIENTES WHERE NOCL_ID = :IDNOTA INTO :NOTA;
            else
                NOTA = '';
            SUSPEND;
            END
        end
    /* DESPUES DE LA AUTORETENCION */
    FOR SELECT MAX(SDCA_TIPOREF), MAX(SDCA_IDREF), sum((SDCA_MONTO-SDCA_ABONO-SDCA_ABRTIVA-SDCA_ABRTICA)/SDCA_TRM), SUM((SDCA_RTFTE-SDCA_ABRTFTE)/SDCA_TRM), SUM((SDCA_RTIVA-SDCA_ABRTIVA)/SDCA_TRM), SUM((SDCA_RTICA-SDCA_ABRTICA)/SDCA_TRM)
        FROM saldos_doc_cartera WHERE (TERC_NIT = :nit) AND (SDCA_FECHA <= :FECHA) AND (SDCA_FECHA >= :FAUTORET) group by sdca_tiporef, sdca_idref
        INTO :TIPO, :ID, :SALDO, :RTFTE, :RTIVA, :RTICA
        DO
        begin
        if (SALDO <> 0) then
            BEGIN
            SELECT MVCL_FECHA, MVCL_VENCE, MVCL_PREFREF, MVCL_NUMREF, MVCL_CONC
              FROM MOVIMIENTO_CLIENTES WHERE TERC_NIT = :NIT AND mvcl_sucursal = :sucursal and MVCL_FECHA <= :FECHA AND MVCL_ABONO = 'N' and mvcl_tiporef = :tipo and mvcl_idref = :id
              INTO :FECDOC, :VENCE, :PREFIJO, :NUMERO, :CONCEPTO;
            DIAS = (FECHA -VENCE );
            SELECT TIDO_NOMCORTO FROM TIPO_DOCUMENTO WHERE TIDO_COD = :TIPO INTO :TIPONOM;
            if (TIPO = 41) then
                SELECT NDCL_DTOFMONTO/NDCL_TRM, NDCL_FECHADTO FROM NOTAS_DEBITO_CLIENTES WHERE NDCL_ID = :ID INTO :DTOF, :FEC;
            if (TIPO = 42) then
                SELECT 0, NCCL_FECHA FROM NOTAS_CREDITO_CLIENTES WHERE NCCL_ID = :ID INTO :DTOF, :FEC;
            if (TIPO = 45) then
                SELECT ANCL_DTOFMONTO/ANCL_TRM, ANCL_DTOFECHA FROM ANTICIPOS_CLIENTE WHERE ANCL_ID = :ID INTO :DTOF, :FEC;
            if (TIPO = 31) then
                SELECT FACT_DTOFMONTO/FACT_TRM, FACT_DTOFFECHA FROM FACTURAS WHERE FACT_ID = :ID INTO :DTOF, :FEC;
            if (TIPO = 33) then
                SELECT 0, :FECHA FROM devoluciones_ventas WHERE DEVT_ID = :ID INTO :DTOF, :FEC;

            recprov_id = 0;
            SELECT max(RCPR_ID) FROM recibo_provisional_detalle WHERE RPDE_IDDOC = :ID AND RPDE_TIPODOC = :TIPO and RPDE_ANULADO = 'N' INTO :recprov_id;
            if (recprov_id is null) then
                reciprov = 'N';
            ELSE
                reciprov = 'S';
            if (FECHA > FEC) then
                DTOF = 0;
            if (DTOF IS NULL) then
                DTOF = 0;
            if (DTOF <> 0) then
                BEGIN
                SELECT SUM(RCDE_DTOF/RECA_TRM) FROM RECIBOS_CAJA_DETALLE D, RECIBOS_CAJA R
                    WHERE R.reca_id = D.reca_id AND RCDE_IDDOC = :ID AND RCDE_TIPODOC = :TIPO INTO :DTOAPL;
                if (DTOAPL IS NULL) then
                    DTOAPL = 0;
                DTOF = DTOF - DTOAPL;
                END

            if (RTIVA IS NULL) then
                RTIVA = 0;
            if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) THEN
                BEGIN
                if (RTIVA > 0) then
                    RTIVA = 0;
                END
            ELSE
                BEGIN
                if (RTIVA < 0) then
                    RTIVA = 0;
                END

            if (RTICA IS NULL) then
                RTICA = 0;
            if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) THEN
                BEGIN
                if (RTICA > 0) then
                    RTICA = 0;
                END
            ELSE
                BEGIN
                if (RTICA < 0) then
                    RTICA = 0;
                END

            /* SI TIENE NOTA AGREGUELA */
            SELECT MAX(NOCL_ID) FROM NOTAS_CLIENTES WHERE TERC_NIT = :NIT AND CLSU_COD = :SUCURSAL AND NOCL_TIPODOC = :TIPO AND NOCL_IDDOC = :ID INTO :IDNOTA;
            if (IDNOTA IS NOT NULL) then
                SELECT NOCL_TEXTO FROM NOTAS_CLIENTES WHERE NOCL_ID = :IDNOTA INTO :NOTA;
            else
                NOTA = '';
            SUSPEND;
            END
        end
    END
  END
END
^

SET TERM ; ^


/* ELIMINE PROVISIONALMENTE LAS DEPENDENCIAS DE SALDO_DOC_CXPAGAR */

SET TERM ^ ;

CREATE OR ALTER PROCEDURE BUSCA_ID_DOC_CXPAGAR(
    TIPO INTEGER,
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(6),
    NIT VARCHAR(20),
    FECHA DATE)
RETURNS (
    ID INTEGER,
    SALDO NUMERIC(18,2),
    RTFTE NUMERIC(18,2),
    RTIVA NUMERIC(18,2),
    RTICA NUMERIC(18,2),
    DTOF NUMERIC(18,2),
    ERROR INTEGER)
AS
declare variable VERNIT VARCHAR(20);
declare variable FEC DATE;
declare variable DTOAPL NUMERIC(18,2);
declare variable FECDTO DATE;
declare variable DESC_RTES CHAR(2);
BEGIN
ERROR = 0;
ID = 0;
EXECUTE PROCEDURE COMPLETA_CEROS(NUMERO) returning_values (NUMERO);
if (TIPO = 51) then
    SELECT NDPR_ID, TERC_NIT, NDPR_FECHA, NDPR_DTOFMONTO, NDPR_DTOFECHA FROM NOTAS_DEBITO_PROVEEDOR WHERE PREF_PRE = :PREFIJO AND NDPR_NUMERO = :NUMERO INTO :ID, :VERNIT, :FEC, :DTOF, :FECDTO;
if (TIPO = 52) then
    SELECT NCPR_ID, TERC_NIT, NCPR_FECHA, NCPR_DTOFMONTO, NCPR_DTOFECHA FROM NOTAS_CREDITO_PROVEEDOR WHERE PREF_PRE = :PREFIJO AND NCPR_NUMERO = :NUMERO INTO :ID, :VERNIT, :FEC, :DTOF, :FECDTO;
if (TIPO = 55) then
    SELECT ANPR_ID, TERC_NIT, ANPR_FECHA, ANPR_DTOFMONTO, ANPR_DTOFECHA FROM ANTICIPOS_PROVEEDOR WHERE PREF_PRE = :PREFIJO AND ANPR_NUMERO = :NUMERO INTO :ID, :VERNIT, :FEC, :DTOF, :FECDTO;
if (TIPO = 21) then
    SELECT FACO_ID, TERC_NIT, FACO_FECHA, FACO_DTOFMONTO, FACO_DTOFFECHA FROM FACTURAS_COMPRA WHERE PREF_PRE = :PREFIJO AND FACO_NUMERO = :NUMERO INTO :ID, :VERNIT, :FEC, :DTOF, :FECDTO;
if (TIPO = 24) then
    SELECT DVCO_ID, TERC_NIT, DVCO_FECHA, 0, DVCO_FECHA FROM devoluciones_compras WHERE PREF_PRE = :PREFIJO AND DVCO_NUMERO = :NUMERO INTO :ID, :VERNIT, :FEC, :DTOF, :FECDTO;
if (fecha > FECDTO) then
    DTOF = 0;
if (DTOF IS NULL) then
    DTOF = 0;
if (DTOF <> 0) then
    BEGIN
    SELECT SUM(EGDE_DTOF) FROM EGRESOS_DETALLE WHERE EGDE_IDDOC = :ID AND EGDE_TIPODOC = :TIPO INTO :DTOAPL;
    if (DTOAPL IS NULL) then
        DTOAPL = 0;
    DTOF = DTOF - DTOAPL;
    END
if (ID = 0) then
  ERROR = 1;
ELSE
  BEGIN
  /* VERIFIQUE EL NIT */
  if (VERNIT <> NIT) then
    ERROR = 2;
  else
    BEGIN
    /* VERIFIQUE QUE LA FECHA DEL ABONO SEA POSTERIOR O IGUAL AL DOC */
    if (FEC > FECHA) then
        ERROR = 3;
    ELSE
        BEGIN
        /* CALCULE LOS SALDOS */
        SELECT SUM(SDCP_MONTO - SDCP_ABONO), SUM(SDCP_RTEFTE - SDCP_ABRTFTE), SUM(SDCP_RTIVA - SDCP_ABRTIVA), SUM(SDCP_RTICA - SDCP_ABRTICA)
            FROM SALDOS_DOC_CXPAGAR WHERE SDCP_TIPOREF = :TIPO AND SDCP_IDREF = :ID
            INTO :SALDO, :RTFTE, :RTIVA, :RTICA;
        if (RTFTE IS NULL) then
            RTFTE = 0;
        if (RTIVA IS NULL) then
            RTIVA = 0;
        if (RTICA IS NULL) then
            RTICA = 0;
        /* TRAIGA EL SALDO NETO */
/*        EXECUTE PROCEDURE SALDO_DOC_CXPAGAR(TIPO, ID, FECHA) returning_values (SALDO); */
        if (SALDO = 0) then
            ERROR = 4;
        ELSE
            BEGIN
            /* RESTE LAS RETENCIONES YA QUE SE SUGERIRAN */
            EXECUTE PROCEDURE LEE_CONFIGURACION('CXPAGAR', 'SALDOS', 'DESCONTAR RETENCIONES POR CAUSACION') returning_values (DESC_RTES);
            if (DESC_RTES = 'NO') then
                SALDO = SALDO - RTFTE - RTIVA - RTICA;
            SALDO = SALDO - DTOF;
            END
        END
    END
  END
SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER PROCEDURE CHEQUEO_SALDOS_DOC_CXPAGAR(
    PRVINI VARCHAR(20),
    PRVFIN VARCHAR(20))
RETURNS (
    ERROR VARCHAR(60),
    TIPO INTEGER,
    ID INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(6))
AS
declare variable FECHA DATE;
declare variable NIT VARCHAR(20);
declare variable RTFTE NUMERIC(18, 2);
declare variable RTIVA NUMERIC(18, 2);
declare variable RTICA NUMERIC(18, 2);
declare variable MONTO NUMERIC(18, 2);
declare variable EXISTE CHAR(1);
declare variable IDR INTEGER;
declare variable EGREID INTEGER;
BEGIN
DELETE FROM anticipos_proveedor WHERE EGRE_ID = 0;
DELETE FROM saldos_doc_cxpagar WHERE TERC_NIT >= :PRVINI AND TERC_NIT <= :PRVFIN;

FOR SELECT FACO_ID, FACO_FECHA, TERC_NIT, FACO_RTFTEMONTO, FACO_rtivamonto, FACO_rticamonto, FACO_TOTAL
    FROM FACTURAS_COMPRA WHERE FACO_ID <> 0 and faco_anulado = 'N' AND TERC_NIT >= :PRVINI AND TERC_NIT <= :PRVFIN
    ORDER BY FACO_FECHA
    INTO :ID, :FECHA, :nit,  :RTFTE, :RTIVA, :RTICA, :MONTO
    DO
    INSERT INTO saldos_doc_cxpagar (SDCP_TIPOREF, SDCP_IDREF, SDCP_FECHA, TERC_NIT, SDCP_RTEFTE, SDCP_RTIVA, SDCP_RTICA, SDCP_ABONO, SDCP_ABRTFTE, SDCP_ABRTIVA, SDCP_ABRTICA, SDCP_DEBITO, SDCP_MONTO)
        VALUES (21, :ID, :fecha, :nit, :rtfte, :rtiva, :rtica, 0, 0, 0, 0, 'S', :MONTO);

FOR SELECT NDPR_ID, NDPR_FECHA, TERC_NIT, NDPR_RTFTEMONTO, NDPR_rtivamonto, NDPR_rticamonto, ndpr_monto+ndpr_ivamonto
    FROM notas_debito_proveedor WHERE NDPR_ID <> 0 and NDPR_anulado = 'N' AND TERC_NIT >= :PRVINI AND TERC_NIT <= :PRVFIN
    ORDER BY NDPR_FECHA
    INTO :ID, :FECHA, :nit,  :RTFTE, :RTIVA, :RTICA, :MONTO
    DO
    INSERT INTO saldos_doc_cxpagar (SDCP_TIPOREF, SDCP_IDREF, SDCP_FECHA, TERC_NIT, SDCP_RTEFTE, SDCP_RTIVA, SDCP_RTICA, SDCP_ABONO, SDCP_ABRTFTE, SDCP_ABRTIVA, SDCP_ABRTICA, SDCP_DEBITO, SDCP_MONTO)
        VALUES (51, :ID, :fecha, :nit, :rtfte, :rtiva, :rtica, 0, 0, 0, 0, 'S', :MONTO);

FOR SELECT DVCO_ID, DVCO_FECHA, TERC_NIT, DVCO_RTFTEMONTO, DVCO_rtivamonto, DVCO_rticamonto, dvco_total
    FROM devoluciones_compras WHERE DVCO_ID <> 0 and DVCO_anulado = 'N' AND TERC_NIT >= :PRVINI AND TERC_NIT <= :PRVFIN
    ORDER BY DVCO_FECHA
    INTO :ID, :FECHA, :nit,  :RTFTE, :RTIVA, :RTICA, :MONTO
    DO
    INSERT INTO saldos_doc_cxpagar (SDCP_TIPOREF, SDCP_IDREF, SDCP_FECHA, TERC_NIT, SDCP_RTEFTE, SDCP_RTIVA, SDCP_RTICA, SDCP_ABONO, SDCP_ABRTFTE, SDCP_ABRTIVA, SDCP_ABRTICA, SDCP_DEBITO, SDCP_MONTO)
        VALUES (24, :ID, :fecha, :nit, :rtfte*-1, :rtiva*-1, :rtica*-1, 0, 0, 0, 0, 'N', :MONTO * -1);

FOR SELECT NCPR_ID, NCPR_FECHA, TERC_NIT, NCPR_RTFTEMONTO, NCPR_rtivamonto, NCPR_rticamonto, ncpr_monto+ncpr_ivamonto
    FROM notas_credito_proveedor WHERE NCPR_ID <> 0 and NCPR_anulado = 'N' AND TERC_NIT >= :PRVINI AND TERC_NIT <= :PRVFIN
    ORDER BY NCPR_FECHA
    INTO :ID, :FECHA, :nit,  :RTFTE, :RTIVA, :RTICA, :MONTO
    DO
    INSERT INTO saldos_doc_cxpagar (SDCP_TIPOREF, SDCP_IDREF, SDCP_FECHA, TERC_NIT, SDCP_RTEFTE, SDCP_RTIVA, SDCP_RTICA, SDCP_ABONO, SDCP_ABRTFTE, SDCP_ABRTIVA, SDCP_ABRTICA, SDCP_DEBITO, SDCP_MONTO)
        VALUES (52, :ID, :fecha, :nit, :rtfte*-1, :rtiva*-1, :rtica*-1, 0, 0, 0, 0, 'N', :MONTO * -1);

FOR SELECT ANPR_ID, ANPR_FECHA, TERC_NIT, ANPR_RTFTEMONTO, ANPR_rtivamonto, ANPR_rticamonto, anpr_base+anpr_ivamonto
    FROM anticipos_proveedor WHERE ANPR_ID <> 0 and ANPR_anulado = 'N' AND TERC_NIT >= :PRVINI AND TERC_NIT <= :PRVFIN
    ORDER BY ANPR_FECHA
    INTO :ID, :FECHA, :nit,  :RTFTE, :RTIVA, :RTICA, :MONTO
    DO
    INSERT INTO saldos_doc_cxpagar (SDCP_TIPOREF, SDCP_IDREF, SDCP_FECHA, TERC_NIT, SDCP_RTEFTE, SDCP_RTIVA, SDCP_RTICA, SDCP_ABONO, SDCP_ABRTFTE, SDCP_ABRTIVA, SDCP_ABRTICA, SDCP_DEBITO, SDCP_MONTO)
        VALUES (55, :ID, :fecha, :nit, :rtfte*-1, :rtiva*-1, :rtica*-1, 0, 0, 0, 0, 'N', :MONTO * -1);

FOR SELECT APPD_TIPODOC, APPD_IDDOC, APPR_FECHA, TERC_NIT, APPD_APLICADO, APPD_RTFTE, APPD_RTIVA, APPD_RTICA
    FROM APLICACION_PROVEEDOR_DETALLE D, aplicacion_provedor A
    WHERE A.APPR_ID = D.appr_id AND A.APPR_ID <> 0 AND APPR_ANULADO = 'N' AND TERC_NIT >= :PRVINI AND TERC_NIT <= :PRVFIN
    ORDER BY APPR_FECHA
    INTO :TIPO, :ID, :FECHA, :NIT, :MONTO, :RTFTE, :RTIVA, :RTICA
    DO
    BEGIN
    EXISTE = 'N';
    select 'S' from saldos_doc_cxpagar where sdcp_tiporef = :TIPO and sdcp_idref = :ID and sdcp_fecha = :fecha into :EXISTE;
    if (Existe = 'S') then
        begin
        /* actualice el saldo del dia */
        UPDATE saldos_doc_cxpagar
            SET SDCP_ABONO = SDCP_ABONO + :MONTO,
                SDCP_ABRTFTE = SDCP_ABRTFTE + :RTFTE,
                SDCP_ABRTIVA = SDCP_ABRTIVA + :RTIVA,
                SDCP_ABRTICA = SDCP_ABRTICA + :RTICA
            WHERE SDCP_TIPOREF = :TIPO AND SDCP_IDREF = :ID AND SDCP_FECHA = :fecha;
        END
    ELSE
        BEGIN
        /* Inserte un nuevo saldo diario */
        INSERT INTO saldos_doc_cxpagar (SDCP_TIPOREF, SDCP_IDREF, SDCP_FECHA, TERC_NIT, SDCP_RTEFTE, SDCP_RTIVA, SDCP_RTICA, SDCP_ABONO, SDCP_ABRTFTE, SDCP_ABRTIVA, SDCP_ABRTICA, SDCP_DEBITO, SDCP_MONTO)
            VALUES (:TIPO, :ID, :fecha, :NIT, 0, 0, 0, :MONTO, :rtfte, :rtiva, :rtica, 'N', 0);
        END
    END

FOR SELECT E.EGRE_ID, EGDE_TIPODOC, EGDE_IDDOC, EGRE_FECHA, TERC_NIT, EGDE_ABONO+EGDE_DTOF, EGDE_RTFTE, EGDE_RTIVA, EGDE_RTICA
    FROM EGRESOS_DETALLE D, EGRESOS E
    WHERE E.EGRE_ID = D.EGRE_ID AND E.EGRE_ID <> 0 AND EGRE_ANULADO = 'N' AND TERC_NIT >= :PRVINI AND TERC_NIT <= :PRVFIN
    ORDER BY EGRE_FECHA
    INTO :IDR, :TIPO, :ID, :FECHA, :NIT, :MONTO, :RTFTE, :RTIVA, :RTICA
    DO
    BEGIN
    EXISTE = 'N';
    if (TIPO = 55) then
        BEGIN
        SELECT EGRE_ID FROM anticipos_proveedor WHERE ANPR_ID = :ID INTO :EGREID;
        if (EGREID = IDR) then
            EXISTE = 'S';
        END
    if (EXISTE = 'N') then
        BEGIN
        select 'S' from saldos_doc_cxpagar where sdcp_tiporef = :TIPO and sdcp_idref = :ID and sdcp_fecha = :fecha into :EXISTE;
        if (Existe = 'S') then
            begin
            /* actualice el saldo del dia */
            UPDATE saldos_doc_cxpagar
                SET SDCP_ABONO = SDCP_ABONO + :MONTO,
                    SDCP_ABRTFTE = SDCP_ABRTFTE + :RTFTE,
                    SDCP_ABRTIVA = SDCP_ABRTIVA + :RTIVA,
                    SDCP_ABRTICA = SDCP_ABRTICA + :RTICA
                WHERE SDCP_TIPOREF = :TIPO AND SDCP_IDREF = :ID AND SDCP_FECHA = :fecha;
            END
        ELSE
            BEGIN
            /* Inserte un nuevo saldo diario */
            INSERT INTO saldos_doc_cxpagar (SDCP_TIPOREF, SDCP_IDREF, SDCP_FECHA, TERC_NIT, SDCP_RTEFTE, SDCP_RTIVA, SDCP_RTICA, SDCP_ABONO, SDCP_ABRTFTE, SDCP_ABRTIVA, SDCP_ABRTICA, SDCP_DEBITO, SDCP_MONTO)
                VALUES (:TIPO, :ID, :fecha, :NIT, 0, 0, 0, :MONTO, :rtfte, :rtiva, :rtica, 'N', 0);
            END
        END
    END

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

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER PROCEDURE CXPAGAR_PROVEEDOR(
    NIT VARCHAR(20),
    FECHA DATE)
RETURNS (
    TIPO INTEGER,
    ID INTEGER,
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(6),
    FECDOC DATE,
    VENCE DATE,
    DIAS INTEGER,
    REFERENCIA VARCHAR(20),
    SALDO NUMERIC(18,2),
    RTFTE NUMERIC(18,2),
    RTIVA NUMERIC(18,2),
    RTICA NUMERIC(18,2),
    DTOF NUMERIC(18,2),
    TIPONOM VARCHAR(8),
    NOMBRE VARCHAR(60),
    CONCEPTO VARCHAR(60))
AS
declare variable FEC DATE;
declare variable DESC_RTES CHAR(2);
declare variable DTOAPL NUMERIC(18,2);
declare variable VENCIMIENTO VARCHAR(12);
BEGIN
  SELECT TERC_NOM FROM TERCEROS WHERE TERC_NIT = :NIT INTO :NOMBRE;
  /* BUSQUE EN SALDOS_DOC_CXPAGAR LOS QUE TENGAN SALDO > 0 */
  FOR SELECT MVPR_TIPOREF, MVPR_IDREF, MVPR_PREFIJO, MVPR_NUMERO, MVPR_CONC, MVPR_FECHA, MVPR_VENCE
    FROM MOVIMIENTO_PROVEEDOR
    WHERE TERC_NIT = :NIT AND MVPR_FECHA <= :FECHA AND MVPR_ABONO = 'N'
    ORDER BY MVPR_FECHA
    INTO :TIPO, :ID, :PREFIJO, :NUMERO, :CONCEPTO, :FECDOC, :VENCE
    DO
    BEGIN
    EXECUTE PROCEDURE LEE_CONFIGURACION('CXPAGAR', 'SALDOS', 'ANALISIS DE CXPAGAR CON FECHA FACTURA O VENCIMIENTO') returning_values (VENCIMIENTO);
    if (VENCIMIENTO = 'FECHA') then
        DIAS = FECHA - FECDOC;
    ELSE
        DIAS = FECHA - VENCE;
    REFERENCIA = '';
/*    EXECUTE PROCEDURE saldo_doc_cxpagar(TIPO, ID, FECHA) returning_values (SALDO); */
    if (SALDO <> 0) then
        BEGIN
        SELECT TIDO_NOMCORTO FROM TIPO_DOCUMENTO WHERE TIDO_COD = :TIPO INTO :TIPONOM;
        if (TIPO = 51) then
            SELECT NDPR_DTOFMONTO, NDPR_DTOFECHA, NDPR_NUMPROV FROM NOTAS_DEBITO_PROVEEDOR WHERE NDPR_ID = :ID INTO :DTOF, :FEC, :REFERENCIA;
        if (TIPO = 52) then
            SELECT NCPR_DTOFMONTO, NCPR_DTOFECHA FROM NOTAS_CREDITO_PROVEEDOR WHERE NCPR_ID = :ID INTO :DTOF, :FEC;
        if (TIPO = 55) then
            SELECT ANPR_DTOFMONTO, ANPR_DTOFECHA FROM ANTICIPOS_PROVEEDOR WHERE ANPR_ID = :ID INTO :DTOF, :FEC;
        if (TIPO = 21) then
            SELECT FACO_DTOFMONTO, FACO_DTOFFECHA, FACO_NUMPROV FROM FACTURAS_COMPRA WHERE FACO_ID = :ID INTO :DTOF, :FEC, :REFERENCIA;
        if (TIPO = 24) then
            SELECT 0, :FECHA FROM devoluciones_compras WHERE DVCO_ID = :ID INTO :DTOF, :FEC;
        if (FECHA > FEC) then
            DTOF = 0;
        if (DTOF IS NULL) then
            DTOF = 0;
        if (DTOF <> 0) then
            BEGIN
            SELECT SUM(EGDE_DTOF) FROM EGRESOS_DETALLE WHERE EGDE_IDDOC = :ID AND EGDE_TIPODOC = :TIPO INTO :DTOAPL;
            if (DTOAPL IS NULL) then
                DTOAPL = 0;
            DTOF = DTOF - DTOAPL;
            END
        SELECT SUM(SDCP_RTEFTE - SDCP_ABRTFTE), SUM(SDCP_RTIVA - SDCP_ABRTIVA), SUM(SDCP_RTICA - SDCP_ABRTICA) FROM SALDOS_DOC_CXPAGAR WHERE SDCP_TIPOREF = :TIPO AND SDCP_IDREF = :ID INTO :RTFTE, :RTIVA, :RTICA;
        if (RTFTE IS NULL) then
            RTFTE = 0;
        if ((TIPO = 52) or (TIPO = 55) or (TIPO = 24)) THEN
            BEGIN
            if (RTFTE > 0) then
                RTFTE = 0;
            END
        ELSE
            BEGIN
            if (RTFTE < 0) then
                RTFTE = 0;
            END

        if (RTIVA IS NULL) then
            RTIVA = 0;
        if ((TIPO = 52) or (TIPO = 55) or (TIPO = 24)) THEN
            BEGIN
            if (RTIVA > 0) then
                RTIVA = 0;
            END
        ELSE
            BEGIN
            if (RTIVA < 0) then
                RTIVA = 0;
            END

        if (RTICA IS NULL) then
            RTICA = 0;
        if ((TIPO = 52) or (TIPO = 55) or (TIPO = 24)) THEN
            BEGIN
            if (RTICA > 0) then
                RTICA = 0;
            END
        ELSE
            BEGIN
            if (RTICA < 0) then
                RTICA = 0;
            END
        /* RESTE LAS RETENCIONES YA QUE SE SUGERIRAN */
        EXECUTE PROCEDURE LEE_CONFIGURACION('CXPAGAR', 'SALDOS', 'DESCONTAR RETENCIONES POR CAUSACION') returning_values (DESC_RTES);
        if (DESC_RTES = 'NO') then
            SALDO = SALDO - RTFTE - RTIVA - RTICA;
        SUSPEND;
        END
    END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER PROCEDURE IMPR_APLIPROV(
    ID INTEGER)
RETURNS (
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    CONCEPTO VARCHAR(60),
    NIT VARCHAR(20),
    NOMBRE VARCHAR(60),
    DIR VARCHAR(60),
    CIU VARCHAR(40),
    TEL VARCHAR(40),
    CONTACTO VARCHAR(60),
    FAX VARCHAR(25),
    CEL VARCHAR(25),
    EMAIL VARCHAR(100),
    ITEM INTEGER,
    TIPODOC VARCHAR(8),
    PREFDOC VARCHAR(4),
    NUMDOC VARCHAR(6),
    ABONO NUMERIC(18,2),
    RTFTEMONTO NUMERIC(18,2),
    RTIVAMONTO NUMERIC(18,2),
    RTICAMONTO NUMERIC(18,2),
    SALDODOC NUMERIC(18,2),
    ANTERDOC NUMERIC(18,2),
    OBS BLOB SUB_TYPE 1 SEGMENT SIZE 80,
    PROV_COD VARCHAR(15),
    PROV_CARTERA VARCHAR(60),
    PROV_CODIGOINT VARCHAR(15))
AS
declare variable TIPO INTEGER;
declare variable IDDOC INTEGER;
BEGIN
  FOR SELECT PREF_PRE, APPR_NUMERO, APPR_FECHA, APPR_CONC, P.TERC_NIT, TERC_NOM, TERC_DIR, TERC_CIU, TERC_TEL, TERC_CONTACTO, TERC_FAX, TERC_CEL, TERC_EMAIL,
    APPD_ITEM, APPD_TIPODOC, APPD_IDDOC, TIDO_NOMCORTO, APPD_PREFIJO, APPD_NUMERO, APPD_APLICADO,
    APPD_RTFTE, APPD_RTIVA, APPD_RTICA, APPR_OBS, PROV_COD, PROV_CARTERA, PROV_CODIGOINT
    FROM APLICACION_PROVEDOR P, APLICACION_PROVEEDOR_DETALLE PD, TERCEROS T, PROVEEDORES PR, TIPO_DOCUMENTO TD
    WHERE P.TERC_NIT = T.TERC_NIT AND T.TERC_NIT = PR.TERC_NIT AND P.APPR_ID = PD.APPR_ID AND P.APPR_ID = :ID AND APPD_TIPODOC = TD.TIDO_COD
    ORDER BY APPD_ITEM
    INTO :PREFIJO, :NUMERO, :FECHA, :CONCEPTO, :NIT, :NOMBRE, :DIR, :CIU, :TEL, :CONTACTO, :FAX, :CEL, :EMAIL, :ITEM, :TIPO, :IDDOC, :TIPODOC, :PREFDOC, :NUMDOC, :ABONO, :RTFTEMONTO, :RTIVAMONTO, :RTICAMONTO, :OBS, :PROV_COD, :PROV_CARTERA, :PROV_CODIGOINT
    DO
        begin
/*        EXECUTE PROCEDURE saldo_doc_cxpagar(:TIPO, :IDDOC, :FECHA) returning_values (:SALDODOC);*/
        if (saldodoc IS NULL) then
            SALDODOC = 0;
        ANTERDOC = SALDODOC + rtftemonto + rtivamonto + rticamonto + abono;
        if (anterdoc IS NULL) then
            ANTERDOC = 0;
        SUSPEND;
        end
SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER PROCEDURE IMPR_EGRESO(
    ID INTEGER)
RETURNS (
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    NIT VARCHAR(20),
    NOMBRE VARCHAR(60),
    DIR VARCHAR(60),
    CIU VARCHAR(40),
    TEL VARCHAR(40),
    CONCEPTO VARCHAR(60),
    MONTO NUMERIC(18,2),
    RTFTE NUMERIC(18,2),
    RTIVA NUMERIC(18,2),
    RTICA NUMERIC(18,2),
    DSCTO NUMERIC(18,2),
    OBS BLOB SUB_TYPE 1 SEGMENT SIZE 80,
    ITEMDOC INTEGER,
    TIPODOC VARCHAR(8),
    PREFDOC VARCHAR(4),
    NUMDOC VARCHAR(6),
    NUMPRV VARCHAR(10),
    ABONODOC NUMERIC(18,2),
    RTFTEDOC NUMERIC(18,2),
    RTIVADOC NUMERIC(18,2),
    RTICADOC NUMERIC(18,2),
    DSCTODOC NUMERIC(18,2),
    SALDODOC NUMERIC(18,2),
    SALDOPROV NUMERIC(18,2),
    ANTERDOC NUMERIC(18,2))
AS
declare variable NUMROWS INTEGER;
declare variable TIPO integer;
declare variable IDDOC INTEGER;
BEGIN
  SELECT PREF_PRE, EGRE_NUMERO, EGRE_FECHA, EGRE_CONC,
        E.TERC_NIT, EGRE_NOMTERC, TERC_DIR, TERC_CIU, TERC_TEL,
        EGRE_MONTO, EGRE_RTFTEMONTO, EGRE_RTIVAMONTO, EGRE_RTICAMONTO, EGRE_DTOF,
        EGRE_OBS
    FROM EGRESOS E, TERCEROS T
    WHERE E.TERC_NIT = T.TERC_NIT AND E.EGRE_ID = :ID
    INTO :PREFIJO, :NUMERO, :FECHA, :CONCEPTO, 
        :NIT, :NOMBRE, :DIR, :CIU, :TEL,
        :MONTO, :RTFTE, :RTIVA, :RTICA, :DSCTO,
        :OBS;
  select SALDO from saldo_proveedor(:NIT, :FECHA+1) into :SALDOPROV;
  /*EXECUTE PROCEDURE saldo_proveedor(:NIT, (CAST('FECHA'+1 AS DATE))) returning_values (:SALDOPROV);*/
  SELECT COUNT(EGDE_ITEM) FROM EGRESOS_DETALLE
    WHERE EGRE_ID = :ID INTO :NUMROWS;
  if (NUMROWS > 0) then
    FOR SELECT EGDE_ITEM, EGDE_TIPODOC, TIDO_NOMCORTO, EGDE_IDDOC, EGDE_PREFIJO, EGDE_NUMERO, EGDE_ABONO, EGDE_RTFTE, EGDE_RTIVA, EGDE_RTICA, EGDE_DTOF
        FROM EGRESOS_DETALLE ED, TIPO_DOCUMENTO TD
        WHERE TD.TIDO_COD = ED.EGDE_TIPODOC AND ED.EGRE_ID = :ID
        order by egde_item
        INTO :ITEMDOC, :TIPO, :TIPODOC, :IDDOC, :PREFDOC, :NUMDOC, :ABONODOC, :RTFTEDOC, :RTIVADOC, :RTICADOC, :DSCTODOC
        DO
            BEGIN
            if (TIPO = 21) then
                SELECT FACO_NUMPROV FROM FACTURAS_COMPRA WHERE FACO_ID = :iddoc INTO :numprv;
            ELSE
                if (TIPO = 51) then
                    SELECT NDPR_NUMPROV FROM NOTAS_DEBITO_PROVEEDOR WHERE NDPR_ID = :iddoc INTO :numprv;
                ELSE
                    numprv = numdoc;
/*            EXECUTE PROCEDURE saldo_doc_cxpagar(:TIPO, :IDDOC, :FECHA) returning_values (:SALDODOC); */
            ANTERDOC = SALDODOC + RTFTEDOC + RTIVADOC + RTICADOC + ABONODOC + DSCTODOC;
            SUSPEND;
            END
  else
    BEGIN
    SALDOPROV = 0;
    ANTERDOC = 0;
    SALDODOC = 0;
    RTFTEDOC = 0;
    RTIVADOC = 0;
    RTICADOC = 0;
    ABONODOC = 0;
    DSCTODOC = 0;
    numprv = '';
    SUSPEND;
    END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER PROCEDURE REP_ANALISIS_CXPAGAR(
    DESDE VARCHAR(20),
    HASTA VARCHAR(20),
    GRPINI VARCHAR(5),
    GRPFIN VARCHAR(5),
    FECHA DATE,
    DETALLE CHAR(1),
    ORDEN CHAR(1),
    AGRUPA CHAR(1),
    DIASR INTEGER)
RETURNS (
    NIT VARCHAR(20),
    NOMBRE VARCHAR(60),
    TELEFONO VARCHAR(40),
    CIUDAD VARCHAR(40),
    GRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(60),
    TIPO INTEGER,
    ID INTEGER,
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(6),
    DIAS INTEGER,
    SALDO NUMERIC(18,2),
    CORRIENTE NUMERIC(18,2),
    CERO NUMERIC(18,2),
    TREINTA NUMERIC(18,2),
    SESENTA NUMERIC(18,2),
    NOVENTA NUMERIC(18,2),
    TIPONOM VARCHAR(8),
    FECDOC DATE,
    VENCE DATE,
    NUMPROV VARCHAR(20))
AS
declare variable NITINI VARCHAR(20);
declare variable NITFIN VARCHAR(20);
declare variable NOMINI VARCHAR(20);
declare variable NOMFIN VARCHAR(20);
declare variable OK CHAR(1);
declare variable RTFTE NUMERIC(18,2);
declare variable RTIVA NUMERIC(18,2);
declare variable RTICA NUMERIC(18,2);
declare variable VENCIMIENTO VARCHAR(12);
BEGIN
if (ORDEN = 'C') then
    BEGIN
    NITINI = DESDE;
    NITFIN = HASTA;
    NOMINI = '';
    NOMFIN = 'zz';
    END
ELSE
    BEGIN
    NOMINI = DESDE;
    NOMFIN = HASTA;
    NITINI = '';
    NITFIN = 'zz';
    END
/* Ubique el NIT */
FOR select T.TERC_NIT, TERC_NOM,  TERC_TEL, TERC_CIU, GRPR_COD
    from terceros T, PROVEEDORES P
    where P.TERC_NIT = T.TERC_NIT AND TERC_PROV = 'S' AND T.TERC_NIT >= :NITINI AND T.TERC_NIT <= :NITFIN AND
        TERC_NOM >= :NOMINI AND TERC_NOM <= :NOMFIN
    INTO :NIT, :NOMBRE, :TELEFONO, :CIUDAD, :GRUPO
    DO  
    BEGIN
    SELECT GRPR_NOM FROM GRUPOS_PROVEEDORES WHERE GRPR_COD = :GRUPO INTO :NOMGRUPO;
    OK = 'N';
    if (AGRUPA = 'G') then
        BEGIN
        if (GRPINI = '') then
            BEGIN
            if ((GRUPO IS NULL) or (GRUPO >= :GRPINI AND GRUPO <= :GRPFIN)) then
                OK = 'S';
            END
        ELSE
            if (GRUPO >= :GRPINI AND GRUPO <= :GRPFIN) then
                OK = 'S';
        END
    if (AGRUPA = 'N') then
        OK = 'S';
    if (OK = 'S') then
        BEGIN
        CORRIENTE = 0;
        CERO = 0;
        TREINTA = 0;
        SESENTA = 0;
        NOVENTA = 0;
        /* BUSQUE EN SALDOS_DOC_CXPAGAR LOS QUE TENGAN SALDO > 0 */
        FOR SELECT MVPR_TIPOREF, MVPR_IDREF, MVPR_PREFIJO, MVPR_NUMERO, MVPR_FECHA, MVPR_VENCE
            FROM MOVIMIENTO_PROVEEDOR
            WHERE TERC_NIT = :NIT AND MVPR_FECHA <= :FECHA AND MVPR_ABONO = 'N'
            INTO :TIPO, :ID, :PREFIJO, :NUMERO, :FECDOC, :VENCE
            DO
            BEGIN
/*            EXECUTE PROCEDURE saldo_doc_cxpagar(TIPO, ID, FECHA) returning_values (SALDO);*/
            if (SALDO <> 0) then
                BEGIN
                SELECT TIDO_NOMCORTO FROM TIPO_DOCUMENTO WHERE TIDO_COD = :TIPO INTO :TIPONOM;
                SELECT SUM(SDCP_RTEFTE - SDCP_ABRTFTE), SUM(SDCP_RTIVA - SDCP_ABRTIVA), SUM(SDCP_RTICA - SDCP_ABRTICA)
                    FROM SALDOS_DOC_CXPAGAR
                    WHERE SDCP_TIPOREF = :TIPO AND SDCP_IDREF = :ID
                    INTO :RTFTE, :RTIVA, :RTICA;
                if (RTFTE IS NULL) then
                    RTFTE = 0;
                if ((TIPO = 52) or (TIPO = 55) or (TIPO = 24)) THEN
                    BEGIN
                    if (RTFTE > 0) then
                        RTFTE = 0;
                    END
                ELSE
                    BEGIN
                    if (RTFTE < 0) then
                        RTFTE = 0;
                    END

                if (RTIVA IS NULL) then
                    RTIVA = 0;
                if ((TIPO = 52) or (TIPO = 55) or (TIPO = 24)) THEN
                    BEGIN
                    if (RTIVA > 0) then
                        RTIVA = 0;
                    END
                ELSE
                    BEGIN
                    if (RTIVA < 0) then
                        RTIVA = 0;
                    END

                if (RTICA IS NULL) then
                    RTICA = 0;
                if ((TIPO = 52) or (TIPO = 55) or (TIPO = 24)) THEN
                    BEGIN
                    if (RTICA > 0) then
                        RTICA = 0;
                    END
                ELSE
                    BEGIN
                    if (RTICA < 0) then
                        RTICA = 0;
                    END
                /* AHORA CLASIFIQUE LOS DIAS */
                if (DETALLE = 'S') then
                    BEGIN
                    CORRIENTE = 0;
                    CERO = 0;
                    TREINTA = 0;
                    SESENTA = 0;
                    NOVENTA = 0;
                    END
                EXECUTE PROCEDURE LEE_CONFIGURACION('CXPAGAR', 'SALDOS', 'ANALISIS DE CXPAGAR CON FECHA FACTURA O VENCIMIENTO') returning_values (VENCIMIENTO);
                if (VENCIMIENTO = 'FECHA') then
                    DIAS = FECHA - FECDOC;
                ELSE
                    DIAS = FECHA - VENCE;
                if (DIAS < 0) then
                    CORRIENTE = CORRIENTE + SALDO;
                ELSE
                    if (DIAS < DIASR) then
                        CERO = CERO + SALDO;
                    ELSE
                        if (DIAS < (DIASR * 2)) then
                            TREINTA = TREINTA + SALDO;
                        ELSE
                            if (DIAS < (DIASR * 3)) then
                                SESENTA = SESENTA + SALDO;
                            ELSE
                                NOVENTA = NOVENTA + SALDO;
                if (DETALLE = 'S') then
                    BEGIN
                    if (TIPO = 51) then
                        SELECT NDPR_NUMPROV FROM NOTAS_DEBITO_PROVEEDOR WHERE NDPR_ID = :ID INTO :NUMPROV;
                    ELSE
                        if (TIPO = 21) then
                            SELECT FACO_NUMPROV FROM FACTURAS_COMPRA WHERE FACO_ID = :ID INTO :NUMPROV;
                        ELSE
                            NUMPROV = '';
                    SUSPEND;
                    END
                END /* SALDO <> 0 */
            END /* FOR MVPR */
        if (DETALLE = 'N') then
            begin
            SALDO = CORRIENTE + CERO + TREINTA + SESENTA + NOVENTA;
            SUSPEND;
            end
        END /* OK */
    END /* FOR NIT */
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER PROCEDURE REP_CXPAGAR_CONSOLIDADAS(
    DESDE VARCHAR(20),
    HASTA VARCHAR(20),
    GRPINI VARCHAR(5),
    GRPFIN VARCHAR(5),
    FECHA DATE,
    ORDEN CHAR(1),
    AGRUPA CHAR(1))
RETURNS (
    NIT VARCHAR(20),
    NOMBRE VARCHAR(60),
    TELEFONO VARCHAR(40),
    CIUDAD VARCHAR(40),
    CODZONA VARCHAR(2),
    NOMZONA VARCHAR(60),
    DV CHAR(1),
    CODCIUD CHAR(5),
    NOMCIUD VARCHAR(60),
    SALDO NUMERIC(18,2),
    RTFTE NUMERIC(18,2),
    RTIVA NUMERIC(18,2),
    RTICA NUMERIC(18,2),
    DTOF NUMERIC(18,2))
AS
declare variable NITINI VARCHAR(20);
declare variable NITFIN VARCHAR(20);
declare variable NOMINI VARCHAR(20);
declare variable NOMFIN VARCHAR(20);
declare variable OK CHAR(1);
declare variable PSALDO NUMERIC(18,2);
declare variable PRTFTE NUMERIC(18,2);
declare variable PRTIVA NUMERIC(18,2);
declare variable PRTICA NUMERIC(18,2);
declare variable PDTOF NUMERIC(18,2);
declare variable TIPO INTEGER;
declare variable ID INTEGER;
declare variable DTOAPL NUMERIC(18,2);
BEGIN
if (ORDEN = 'C') then
    BEGIN
    NITINI = DESDE;
    NITFIN = HASTA;
    NOMINI = '';
    NOMFIN = 'zz';
    END
ELSE
    BEGIN
    NOMINI = DESDE;
    NOMFIN = HASTA;
    NITINI = '';
    NITFIN = 'zz';
    END
  /* Ubique el NIT */
  FOR select T.TERC_NIT, TERC_NOM, TERC_DV, TERC_TEL, TERC_CIU, GRPR_COD, CIUD_COD
    from terceros T, PROVEEDORES P
    where P.TERC_NIT = T.TERC_NIT AND TERC_PROV = 'S' AND T.TERC_NIT >= :NITINI AND T.TERC_NIT <= :NITFIN AND
        TERC_NOM >= :NOMINI AND TERC_NOM <= :NOMFIN
    INTO :NIT, :NOMBRE, :DV, :TELEFONO, :CIUDAD, :CODZONA, :CODCIUD
    DO  
    BEGIN
    OK = 'N';
    if (AGRUPA = 'G') then
        BEGIN
        if (GRPINI = '') then
            BEGIN
            if ((CODZONA IS NULL) or (CODZONA >= :GRPINI AND CODZONA <= :GRPFIN)) then
                OK = 'S';
            END
        ELSE
            if (CODZONA >= :GRPINI AND CODZONA <= :GRPFIN) then
                OK = 'S';
        END
    if (AGRUPA = 'N') then
        OK = 'S';
        
    if (OK = 'S') then
        BEGIN
        SELECT GRPR_NOM FROM GRUPOS_PROVEEDORES WHERE GRPR_COD = :CODZONA INTO :NOMZONA;
        SELECT CIUD_NOM FROM CIUDADES WHERE CIUD_COD = :CODCIUD INTO :NOMCIUD;
        SALDO = 0;
        RTFTE = 0;
        RTIVA = 0;
        RTICA = 0;
        DTOF = 0;
        /* BUSQUE EN SALDOS_DOC_CXPAGAR LOS QUE TENGAN SALDO > 0 */
        FOR SELECT MVPR_TIPOREF, MVPR_IDREF
          FROM MOVIMIENTO_PROVEEDOR
          WHERE TERC_NIT = :NIT AND MVPR_FECHA <= :FECHA AND MVPR_ABONO = 'N'
          INTO :TIPO, :ID
          DO
            BEGIN
/*            EXECUTE PROCEDURE saldo_doc_cxpagar(TIPO, ID, FECHA) returning_values (PSALDO);*/
            if (PSALDO <> 0) then
                BEGIN
                if (TIPO = 51) then
                    SELECT NDPR_DTOFMONTO FROM NOTAS_DEBITO_PROVEEDOR WHERE NDPR_ID = :ID INTO :PDTOF;
                if (TIPO = 52) then
                    SELECT 0 FROM NOTAS_CREDITO_PROVEEDOR WHERE NCPR_ID = :ID INTO :PDTOF;
                if (TIPO = 55) then
                    SELECT ANPR_DTOFMONTO FROM ANTICIPOS_PROVEEDOR WHERE ANPR_ID = :ID INTO :PDTOF;
                if (TIPO = 21) then
                    SELECT 0 FROM FACTURAS_COMPRA WHERE FACO_ID = :ID INTO :PDTOF;
                if (TIPO = 24) then
                    SELECT 0 FROM devoluciones_compras WHERE DVCO_ID = :ID INTO :PDTOF;
                if (DTOF IS NULL) then
                    DTOF = 0;
                if (DTOF <> 0) then
                    BEGIN
                    SELECT SUM(EGDE_DTOF) FROM EGRESOS_DETALLE WHERE EGDE_IDDOC = :ID AND EGDE_TIPODOC = :TIPO INTO :DTOAPL;
                    if (DTOAPL IS NULL) then
                        DTOAPL = 0;
                    DTOF = DTOF - DTOAPL;
                    END
                SELECT SUM(SDCP_RTEFTE - SDCP_ABRTFTE), SUM(SDCP_RTIVA - SDCP_ABRTIVA), SUM(SDCP_RTICA - SDCP_ABRTICA)
                    FROM SALDOS_DOC_CXPAGAR WHERE SDCP_TIPOREF = :TIPO AND SDCP_IDREF = :ID INTO :PRTFTE, :PRTIVA, :PRTICA;
                if (PRTFTE IS NULL) then
                    PRTFTE = 0;
                if ((TIPO = 52) or (TIPO = 55) or (TIPO = 24)) THEN
                    BEGIN
                    if (RTFTE > 0) then
                        RTFTE = 0;
                    END
                ELSE
                    BEGIN
                    if (RTFTE < 0) then
                        RTFTE = 0;
                    END
                if (PRTIVA IS NULL) then
                    PRTIVA = 0;
                if ((TIPO = 52) or (TIPO = 55) or (TIPO = 24)) THEN
                    BEGIN
                    if (RTIVA > 0) then
                        RTIVA = 0;
                    END
                ELSE
                    BEGIN
                    if (RTIVA < 0) then
                        RTIVA = 0;
                    END
                if (PRTICA IS NULL) then
                    PRTICA = 0;
                if ((TIPO = 52) or (TIPO = 55) or (TIPO = 24)) THEN
                    BEGIN
                    if (PRTICA > 0) then
                        PRTICA = 0;
                    END
                ELSE
                    BEGIN
                    if (PRTICA < 0) then
                        PRTICA = 0;
                    END
                SALDO = SALDO + PSALDO;
                RTFTE = RTFTE + PRTFTE;
                RTIVA = RTIVA + PRTIVA;
                RTICA = RTICA + PRTICA;
                DTOF = DTOF + PDTOF;
                END
            END
        SUSPEND;
        END
    END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER PROCEDURE REP_CXPAGAR_PROVEEDOR(
    DESDE VARCHAR(20),
    HASTA VARCHAR(20),
    GRPINI VARCHAR(5),
    GRPFIN VARCHAR(5),
    FECHA DATE,
    ORDEN CHAR(1),
    AGRUPA CHAR(1))
RETURNS (
    NIT VARCHAR(20),
    NOMBRE VARCHAR(60),
    TELEFONO VARCHAR(40),
    CIUDAD VARCHAR(40),
    CODZONA VARCHAR(2),
    NOMZONA VARCHAR(60),
    DV CHAR(1),
    CODCIUD CHAR(5),
    NOMCIUD VARCHAR(60),
    TIPO INTEGER,
    ID INTEGER,
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(6),
    CONCEPTO VARCHAR(60),
    SALDO NUMERIC(18,2),
    RTFTE NUMERIC(18,2),
    RTIVA NUMERIC(18,2),
    RTICA NUMERIC(18,2),
    DTOF NUMERIC(18,2),
    TIPONOM VARCHAR(8),
    FECDOC DATE,
    VENCE DATE,
    DIAS INTEGER,
    NUMPROV VARCHAR(20))
AS
declare variable NITINI VARCHAR(20);
declare variable NITFIN VARCHAR(20);
declare variable NOMINI VARCHAR(20);
declare variable NOMFIN VARCHAR(20);
declare variable OK CHAR(1);
declare variable DTOAPL NUMERIC(18,2);
declare variable FOV CHAR(12);
BEGIN
if (ORDEN = 'C') then
    BEGIN
    NITINI = DESDE;
    NITFIN = HASTA;
    NOMINI = '';
    NOMFIN = 'zz';
    END
ELSE
    BEGIN
    NOMINI = DESDE;
    NOMFIN = HASTA;
    NITINI = '';
    NITFIN = 'zz';
    END
  /* Ubique el NIT */
  FOR select T.TERC_NIT, TERC_NOM, TERC_DV, TERC_TEL, TERC_CIU, P.GRPR_COD, T.CIUD_COD
    from terceros T, PROVEEDORES P 
    where P.TERC_NIT = T.TERC_NIT AND TERC_PROV = 'S' AND T.TERC_NIT >= :NITINI AND T.TERC_NIT <= :NITFIN AND
        TERC_NOM >= :NOMINI AND TERC_NOM <= :NOMFIN
    INTO :NIT, :NOMBRE, :DV, :TELEFONO, :CIUDAD, :CODZONA, :CODCIUD
    DO  
    BEGIN
    select GRPR_NOM from GRUPOS_PROVEEDORES where GRPR_COD = :codzona into :NOMZONA;
    select CIUD_NOM from CIUDADES where CIUD_COD = :codciud into :NOMCIUD;
    OK = 'N';
    if (AGRUPA = 'G') then
        BEGIN
        if (GRPINI = '') then
            BEGIN
            if ((CODZONA IS NULL) or (CODZONA >= :GRPINI AND CODZONA <= :GRPFIN)) then
                OK = 'S';
            END
        ELSE
            if (CODZONA >= :GRPINI AND CODZONA <= :GRPFIN) then
                OK = 'S';
        END
    if (AGRUPA = 'C') then
        BEGIN
        if (GRPINI = '') then
            BEGIN
            if ((CODCIUD IS NULL) or (CODCIUD >= :GRPINI AND CODCIUD <= :GRPFIN)) then
                OK = 'S';
            END
        ELSE
            if (CODCIUD >= :GRPINI AND CODCIUD <= :GRPFIN) then
                OK = 'S';
        END
    if (AGRUPA = 'N') then
        OK = 'S';
        
    if (OK = 'S') then
        BEGIN
        /* BUSQUE EN SALDOS_DOC_CXPAGAR LOS QUE TENGAN SALDO > 0 */
        FOR SELECT MVPR_TIPOREF, MVPR_IDREF, MVPR_PREFIJO, MVPR_NUMERO, MVPR_FECHA, MVPR_VENCE, MVPR_CONC
            FROM MOVIMIENTO_PROVEEDOR
            WHERE TERC_NIT = :NIT AND MVPR_FECHA <= :FECHA AND MVPR_ABONO = 'N'
            INTO :TIPO, :ID, :PREFIJO, :NUMERO, :FECDOC, :VENCE, :CONCEPTO
            DO
            BEGIN
            EXECUTE PROCEDURE LEE_CONFIGURACION('CXPAGAR', 'SALDOS', 'ANALISIS DE CXPAGAR CON FECHA FACTURA O VENCIMIENTO') RETURNING_VALUES (FOV);
            if (FOV = 'FECHA') then
                DIAS = FECHA - FECDOC;
            ELSE
                DIAS = FECHA - VENCE;
/*            EXECUTE PROCEDURE saldo_doc_cxpagar(TIPO, ID, FECHA) returning_values (SALDO); */
            if (SALDO <> 0) then
                BEGIN
                SELECT TIDO_NOMCORTO FROM TIPO_DOCUMENTO WHERE TIDO_COD = :TIPO INTO :TIPONOM;
                if (TIPO = 51) then
                    SELECT NDPR_DTOFMONTO, NDPR_NUMPROV FROM NOTAS_DEBITO_PROVEEDOR WHERE NDPR_ID = :ID INTO :DTOF, :NUMPROV;
                if (TIPO = 52) then
                    SELECT 0, '' FROM NOTAS_CREDITO_PROVEEDOR WHERE NCPR_ID = :ID INTO :DTOF, :NUMPROV;
                if (TIPO = 55) then
                    SELECT ANPR_DTOFMONTO, '' FROM ANTICIPOS_PROVEEDOR WHERE ANPR_ID = :ID INTO :DTOF, :NUMPROV;
                if (TIPO = 21) then
                    SELECT FACO_DTOFMONTO, FACO_NUMPROV FROM FACTURAS_COMPRA WHERE FACO_ID = :ID INTO :DTOF, :NUMPROV;
                if (TIPO = 24) then
                    SELECT 0, '' FROM devoluciones_compras WHERE DVCO_ID = :ID INTO :DTOF, :NUMPROV;
                if (DTOF IS NULL) then
                    DTOF = 0;
                if (DTOF <> 0) then
                    BEGIN
                    SELECT SUM(EGDE_DTOF) FROM EGRESOS_DETALLE WHERE EGDE_IDDOC = :ID AND EGDE_TIPODOC = :TIPO INTO :DTOAPL;
                    if (DTOAPL IS NULL) then
                        DTOAPL = 0;
                    DTOF = DTOF - DTOAPL;
                    END
                SELECT SUM(SDCP_RTEFTE - SDCP_ABRTFTE), SUM(SDCP_RTIVA - SDCP_ABRTIVA), SUM(SDCP_RTICA - SDCP_ABRTICA)
                    FROM SALDOS_DOC_CXPAGAR WHERE SDCP_TIPOREF = :TIPO AND SDCP_IDREF = :ID INTO :RTFTE, :RTIVA, :RTICA;
                if (RTFTE IS NULL) then
                    RTFTE = 0;
                if ((TIPO = 52) or (TIPO = 55) or (TIPO = 24)) THEN
                    BEGIN
                    if (RTFTE > 0) then
                        RTFTE = 0;
                    END
                ELSE
                    BEGIN
                    if (RTFTE < 0) then
                        RTFTE = 0;
                    END

                if (RTIVA IS NULL) then
                    RTIVA = 0;
                if ((TIPO = 52) or (TIPO = 55) or (TIPO = 24)) THEN
                    BEGIN
                    if (RTIVA > 0) then
                        RTIVA = 0;
                    END
                ELSE
                    BEGIN
                    if (RTIVA < 0) then
                        RTIVA = 0;
                    END

                if (RTICA IS NULL) then
                    RTICA = 0;
                if ((TIPO = 52) or (TIPO = 55) or (TIPO = 24)) THEN
                    BEGIN
                    if (RTICA > 0) then
                        RTICA = 0;
                    END
                ELSE
                    BEGIN
                    if (RTICA < 0) then
                        RTICA = 0;
                    END
                SUSPEND;
                END
            END
        END
    END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER PROCEDURE SALDO_PROVEEDOR(
    NIT VARCHAR(20),
    FECHA DATE)
RETURNS (
    SALDO NUMERIC(18,2))
AS
DECLARE VARIABLE sal numeric(18,2);
declare variable TIPODOC INTEGER;
declare variable IDDOC INTEGER;
BEGIN
fecha = fecha - 1;
saldo = 0;
FOR SELECT MVPR_TIPOREF, MVPR_IDREF FROM movimiento_proveedor
    WHERE TERC_NIT = :NIT AND MVPR_FECHA <= :FECHA AND MVPR_ABONO = 'N'
    INTO :TIPODOC, :IDDOC
    DO
    BEGIN
/*    EXECUTE PROCEDURE saldo_doc_cxpagar(TIPODOC, IDDOC, FECHA) returning_values (SAL); */
    if (SAL <> 0) then
        SALDO = SALDO + SAL;
    END
SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE CONCILIA_CXPAGAR(
    FECINI DATE,
    FECFIN DATE,
    CTACART VARCHAR(20),
    SUBEMPRESA INTEGER,
    ANTERIOR CHAR(1))
RETURNS (
    NIT VARCHAR(20),
    NOMBRE VARCHAR(60),
    INICIAL NUMERIC(18,2),
    INICIALC NUMERIC(18,2),
    DEBITOS NUMERIC(18,2),
    DEBITOSC NUMERIC(18,2),
    CREDITOS NUMERIC(18,2),
    CREDITOSC NUMERIC(18,2),
    SALDO NUMERIC(18,2),
    SALDOC NUMERIC(18,2),
    DIFERENCIA NUMERIC(18,2))
AS
declare variable ANO CHAR(4);
declare variable MES INTEGER;
declare variable ABONOS NUMERIC(18,2);
declare variable RETES CHAR(2);
begin /*$$IBE$$ 
ano = EXTRACT(YEAR FROM FECFIN);
mes = EXTRACT(MONTH FROM FECFIN);

for select TERC_NIT, TERC_NOM from TERCEROS WHERE TERC_PROV = 'S' into :NIT, :NOMBRE
    DO
    BEGIN
    EXECUTE PROCEDURE saldo_proveedor (NIT, FECINI) returning_values (INICIAL);
    EXECUTE PROCEDURE LEE_CONFIGURACION('CXPAGAR', 'SALDOS', 'DESCONTAR RETENCIONES POR CAUSACION') returning_values(:RETES);
    if (RETES = 'SI') then
        BEGIN
        SELECT SUM(MVPR_MONTO-MVPR_RTFTE-MVPR_RTIVA-MVPR_RTICA)
            FROM movimiento_proveedor
            WHERE TERC_NIT = :NIT AND MVPR_FECHA >= :FECINI AND MVPR_FECHA < :FECFIN AND MVPR_DEBITO = 'S'
            INTO :DEBITOS;
        SELECT SUM(MVPR_MONTO-MVPR_RTFTE-MVPR_RTIVA-MVPR_RTICA)
            FROM movimiento_proveedor
            WHERE TERC_NIT = :NIT AND MVPR_FECHA >= :FECINI AND MVPR_FECHA < :FECFIN AND MVPR_DEBITO = 'N' AND MVPR_ABONO = 'N' and MVPR_TIPOREF <> 55
            INTO :CREDITOS;
        SELECT SUM(MVPR_MONTO) FROM movimiento_proveedor
            WHERE TERC_NIT = :NIT AND MVPR_FECHA >= :FECINI AND MVPR_FECHA < :FECFIN AND MVPR_ABONO = 'S'
            INTO :ABONOS;
        END
    ELSE
        BEGIN
        SELECT SUM(MVPR_MONTO)
            FROM movimiento_proveedor
            WHERE TERC_NIT = :NIT AND MVPR_FECHA >= :FECINI AND MVPR_FECHA < :FECFIN AND MVPR_DEBITO = 'S'
            INTO :DEBITOS;
        SELECT SUM(MVPR_MONTO)
            FROM movimiento_proveedor
            WHERE TERC_NIT = :NIT AND MVPR_FECHA >= :FECINI AND MVPR_FECHA < :FECFIN AND MVPR_DEBITO = 'N' AND MVPR_ABONO = 'N' AND MVPR_TIPOREF <> 55
            INTO :CREDITOS;
        SELECT SUM(MVPR_MONTO+MVPR_RTFTE+MVPR_RTIVA+MVPR_RTICA)
            FROM movimiento_proveedor
            WHERE TERC_NIT = :NIT AND MVPR_FECHA >= :FECINI AND MVPR_FECHA < :FECFIN AND MVPR_ABONO = 'S'
            INTO :ABONOS;
        END
    if (DEBITOS IS NULL) then
        DEBITOS = 0;
    if (CREDITOS IS NULL) then
        CREDITOS = 0;
    if (ABONOS IS NULL) then
        ABONOS = 0;
    CREDITOS = CREDITOS + ABONOS;
    SALDO = INICIAL + DEBITOS - CREDITOS;

     $$IBE$$*/ /* LO CONTABLE */ /*$$IBE$$ 
    EXECUTE PROCEDURE SALDO_TERCERO_MES(ctacart, NIT, ANO, MES, 'S') RETURNING_VALUES (INICIALC);
    EXECUTE PROCEDURE MOVIMIENTO_TERCERO_MES(ctacart, NIT, ANO, MES, 'S') RETURNING_VALUES(DEBITOSC);
    EXECUTE PROCEDURE MOVIMIENTO_TERCERO_MES(ctacart, NIT, ANO, MES, 'N') RETURNING_VALUES(CREDITOSC);
    SALDOC = INICIALC + DEBITOSC - CREDITOSC;
    diferencia = SALDO + SALDOC;
    if (DIFERENCIA <> 0) then
        BEGIN
        if (ANTERIOR <> 'S') then
            SUSPEND;
        ELSE
            BEGIN
            if (DIFERENCIA <> (INICIAL + INICIALC)) then
                SUSPEND;
            END
        END
    END
 $$IBE$$*/ SUSPEND;
end
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE IMPR_EGRESO(
    ID INTEGER)
RETURNS (
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    NIT VARCHAR(20),
    NOMBRE VARCHAR(60),
    DIR VARCHAR(60),
    CIU VARCHAR(40),
    TEL VARCHAR(40),
    CONCEPTO VARCHAR(60),
    MONTO NUMERIC(18,2),
    RTFTE NUMERIC(18,2),
    RTIVA NUMERIC(18,2),
    RTICA NUMERIC(18,2),
    DSCTO NUMERIC(18,2),
    OBS BLOB SUB_TYPE 1 SEGMENT SIZE 80,
    ITEMDOC INTEGER,
    TIPODOC VARCHAR(8),
    PREFDOC VARCHAR(4),
    NUMDOC VARCHAR(6),
    NUMPRV VARCHAR(10),
    ABONODOC NUMERIC(18,2),
    RTFTEDOC NUMERIC(18,2),
    RTIVADOC NUMERIC(18,2),
    RTICADOC NUMERIC(18,2),
    DSCTODOC NUMERIC(18,2),
    SALDODOC NUMERIC(18,2),
    SALDOPROV NUMERIC(18,2),
    ANTERDOC NUMERIC(18,2))
AS
declare variable NUMROWS INTEGER;
declare variable TIPO integer;
declare variable IDDOC INTEGER;
BEGIN /*$$IBE$$ 
  SELECT PREF_PRE, EGRE_NUMERO, EGRE_FECHA, EGRE_CONC,
        E.TERC_NIT, EGRE_NOMTERC, TERC_DIR, TERC_CIU, TERC_TEL,
        EGRE_MONTO, EGRE_RTFTEMONTO, EGRE_RTIVAMONTO, EGRE_RTICAMONTO, EGRE_DTOF,
        EGRE_OBS
    FROM EGRESOS E, TERCEROS T
    WHERE E.TERC_NIT = T.TERC_NIT AND E.EGRE_ID = :ID
    INTO :PREFIJO, :NUMERO, :FECHA, :CONCEPTO, 
        :NIT, :NOMBRE, :DIR, :CIU, :TEL,
        :MONTO, :RTFTE, :RTIVA, :RTICA, :DSCTO,
        :OBS;
  select SALDO from saldo_proveedor(:NIT, :FECHA+1) into :SALDOPROV;
   $$IBE$$*/ /*EXECUTE PROCEDURE saldo_proveedor(:NIT, (CAST('FECHA'+1 AS DATE))) returning_values (:SALDOPROV);*/ /*$$IBE$$ 
  SELECT COUNT(EGDE_ITEM) FROM EGRESOS_DETALLE
    WHERE EGRE_ID = :ID INTO :NUMROWS;
  if (NUMROWS > 0) then
    FOR SELECT EGDE_ITEM, EGDE_TIPODOC, TIDO_NOMCORTO, EGDE_IDDOC, EGDE_PREFIJO, EGDE_NUMERO, EGDE_ABONO, EGDE_RTFTE, EGDE_RTIVA, EGDE_RTICA, EGDE_DTOF
        FROM EGRESOS_DETALLE ED, TIPO_DOCUMENTO TD
        WHERE TD.TIDO_COD = ED.EGDE_TIPODOC AND ED.EGRE_ID = :ID
        order by egde_item
        INTO :ITEMDOC, :TIPO, :TIPODOC, :IDDOC, :PREFDOC, :NUMDOC, :ABONODOC, :RTFTEDOC, :RTIVADOC, :RTICADOC, :DSCTODOC
        DO
            BEGIN
            if (TIPO = 21) then
                SELECT FACO_NUMPROV FROM FACTURAS_COMPRA WHERE FACO_ID = :iddoc INTO :numprv;
            ELSE
                if (TIPO = 51) then
                    SELECT NDPR_NUMPROV FROM NOTAS_DEBITO_PROVEEDOR WHERE NDPR_ID = :iddoc INTO :numprv;
                ELSE
                    numprv = numdoc;
 $$IBE$$*/ /*            EXECUTE PROCEDURE saldo_doc_cxpagar(:TIPO, :IDDOC, :FECHA) returning_values (:SALDODOC); */ /*$$IBE$$ 
            ANTERDOC = SALDODOC + RTFTEDOC + RTIVADOC + RTICADOC + ABONODOC + DSCTODOC;
            SUSPEND;
            END
  else
    BEGIN
    SALDOPROV = 0;
    ANTERDOC = 0;
    SALDODOC = 0;
    RTFTEDOC = 0;
    RTIVADOC = 0;
    RTICADOC = 0;
    ABONODOC = 0;
    DSCTODOC = 0;
    numprv = '';
    SUSPEND;
    END
 $$IBE$$*/ SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE MOVIMIENTO_CXPAGAR_DESDE_HASTA(
    NIT VARCHAR(20),
    DESDE DATE,
    HASTA DATE)
RETURNS (
    INICIAL NUMERIC(18,2),
    TIPODOC VARCHAR(8),
    IDDOC INTEGER,
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    CONCEPTO VARCHAR(60),
    DEBITO NUMERIC(18,2),
    CREDITO NUMERIC(18,2),
    SALDO NUMERIC(18,2),
    NOMBRE VARCHAR(60),
    RTFTE NUMERIC(18,2),
    RTIVA NUMERIC(18,2),
    RTICA NUMERIC(18,2),
    NUMPROV VARCHAR(20))
AS
declare variable DB CHAR(1);
declare variable AB CHAR(1);
declare variable RETES CHAR(2);
BEGIN
  /* Ubique el NIT */ /*$$IBE$$ 
  select terc_nom from terceros where terc_nit = :NIT INTO :NOMBRE;
  execute procedure saldo_proveedor (NIT, DESDE) returning_values (INICIAL);
  if (INICIAL is null) then
    INICIAL = 0;
  SALDO = INICIAL;
  EXECUTE PROCEDURE LEE_CONFIGURACION('CXPAGAR', 'SALDOS', 'DESCONTAR RETENCIONES POR CAUSACION') returning_values(:RETES);
  FOR select tido_nomcorto, mvpr_idref, mvpr_prefijo, mvpr_numero, mvpr_fecha, mvpr_conc, mvpr_monto, mvpr_debito, mvpr_rtfte, mvpr_rtiva, mvpr_rtica, mvpr_abono
    from movimiento_proveedor m, tipo_documento t
    where m.mvpr_tiporef = t.tido_cod and terc_nit = :NIT and mvpr_fecha >= :DESDE and mvpr_fecha <= :HASTA AND mvpr_tiporef <> 55
    order by mvpr_fecha, mvpr_tiporef
    into :TIPODOC, :IDDOC, :PREFIJO, :NUMERO, :FECHA, :CONCEPTO, :DEBITO, :DB, :RTFTE, :RTIVA, :RTICA, :AB
    DO
    BEGIN
    if (DB = 'N') then
        BEGIN
        if (AB = 'S') then
            if (RETES = 'SI') then
                CREDITO = DEBITO;
            ELSE
                CREDITO = DEBITO + RTFTE + RTIVA + RTICA;
        ELSE
            if (RETES = 'SI') then
                CREDITO = DEBITO - RTFTE - RTIVA - RTICA;
            ELSE
                CREDITO = DEBITO;
        DEBITO = 0;
        END
    ELSE
        BEGIN
        if (RETES = 'SI') then
            DEBITO = DEBITO - RTFTE - RTIVA - RTICA;
        CREDITO = 0;
        END
    SALDO = SALDO + DEBITO - CREDITO;
    NUMPROV = '';
    if (TIPODOC = 'CARGOACR') then
        SELECT NDPR_NUMPROV FROM NOTAS_DEBITO_PROVEEDOR WHERE NDPR_ID = :IDDOC INTO :NUMPROV;
    if (TIPODOC = 'FACTCOMP') then
        SELECT FACO_NUMPROV FROM FACTURAS_COMPRA WHERE FACO_ID = :IDDOC INTO :NUMPROV;
    SUSPEND;
    END
 $$IBE$$*/ SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE MOVIMIENTO_CXPAGAR_MES(
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    NIT VARCHAR(20),
    NOMBRE VARCHAR(60),
    INICIAL NUMERIC(18,4),
    DEBITOS NUMERIC(18,4),
    CREDITOS NUMERIC(18,4),
    ABONOS NUMERIC(18,4),
    FINAL NUMERIC(18,4))
AS
declare variable RETES CHAR(2);
BEGIN /*$$IBE$$ 
  for select TERC_NIT, TERC_NOM from TERCEROS WHERE TERC_PROV = 'S' into :NIT, :NOMBRE
  DO
    BEGIN
    EXECUTE PROCEDURE saldo_proveedor (NIT, FECINI) returning_values (INICIAL);
    EXECUTE PROCEDURE LEE_CONFIGURACION('CXPAGAR', 'SALDOS', 'DESCONTAR RETENCIONES POR CAUSACION') returning_values(:RETES);
    if (RETES = 'SI') then
        BEGIN
        SELECT SUM(MVPR_MONTO-MVPR_RTFTE-MVPR_RTIVA-MVPR_RTICA)
            FROM movimiento_proveedor
            WHERE TERC_NIT = :NIT AND MVPR_FECHA >= :FECINI AND MVPR_FECHA < :FECFIN AND MVPR_DEBITO = 'S'
            INTO :DEBITOS;
        SELECT SUM(MVPR_MONTO-MVPR_RTFTE-MVPR_RTIVA-MVPR_RTICA)
            FROM movimiento_proveedor
            WHERE TERC_NIT = :NIT AND MVPR_FECHA >= :FECINI AND MVPR_FECHA < :FECFIN AND MVPR_DEBITO = 'N' AND MVPR_ABONO = 'N' and MVPR_TIPOREF <> 55
            INTO :CREDITOS;
        SELECT SUM(MVPR_MONTO) FROM movimiento_proveedor
            WHERE TERC_NIT = :NIT AND MVPR_FECHA >= :FECINI AND MVPR_FECHA < :FECFIN AND MVPR_ABONO = 'S'
            INTO :ABONOS;
        END
    ELSE
        BEGIN
        SELECT SUM(MVPR_MONTO)
            FROM movimiento_proveedor
            WHERE TERC_NIT = :NIT AND MVPR_FECHA >= :FECINI AND MVPR_FECHA < :FECFIN AND MVPR_DEBITO = 'S'
            INTO :DEBITOS;
        SELECT SUM(MVPR_MONTO)
            FROM movimiento_proveedor
            WHERE TERC_NIT = :NIT AND MVPR_FECHA >= :FECINI AND MVPR_FECHA < :FECFIN AND MVPR_DEBITO = 'N' AND MVPR_ABONO = 'N' AND MVPR_TIPOREF <> 55
            INTO :CREDITOS;
        SELECT SUM(MVPR_MONTO+MVPR_RTFTE+MVPR_RTIVA+MVPR_RTICA)
            FROM movimiento_proveedor
            WHERE TERC_NIT = :NIT AND MVPR_FECHA >= :FECINI AND MVPR_FECHA < :FECFIN AND MVPR_ABONO = 'S'
            INTO :ABONOS;
        END
    if (DEBITOS IS NULL) then
        DEBITOS = 0;
    if (CREDITOS IS NULL) then
        CREDITOS = 0;
    if (ABONOS IS NULL) then
        ABONOS = 0;
    FINAL = INICIAL + DEBITOS - CREDITOS - ABONOS;
    SUSPEND;
    END
 $$IBE$$*/ SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE REP_MOVIMIENTO_PROVEEDOR(
    DESDE VARCHAR(20),
    HASTA VARCHAR(20),
    GRPINI VARCHAR(5),
    GRPFIN VARCHAR(5),
    FECINI DATE,
    FECFIN DATE,
    DETALLE CHAR(1),
    ORDEN CHAR(1),
    AGRUPA CHAR(1))
RETURNS (
    NIT VARCHAR(20),
    NOMBRE VARCHAR(60),
    TELEFONO VARCHAR(40),
    CIUDAD VARCHAR(40),
    CODZONA VARCHAR(2),
    NOMZONA VARCHAR(60),
    DV CHAR(1),
    CODCIUD CHAR(5),
    NOMCIUD VARCHAR(60),
    INICIAL NUMERIC(18,2),
    TIPODOC VARCHAR(8),
    IDDOC INTEGER,
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    CONCEPTO VARCHAR(60),
    DEBITO NUMERIC(18,2),
    CREDITO NUMERIC(18,2),
    ABONO NUMERIC(18,2),
    SALDO NUMERIC(18,2),
    RTFTE NUMERIC(18,2),
    RTIVA NUMERIC(18,2),
    RTICA NUMERIC(18,2),
    ARTFTE NUMERIC(18,2),
    ARTIVA NUMERIC(18,2),
    ARTICA NUMERIC(18,2))
AS
declare variable NITINI VARCHAR(20);
declare variable NITFIN VARCHAR(20);
declare variable NOMINI VARCHAR(20);
declare variable NOMFIN VARCHAR(20);
declare variable OK CHAR(1);
declare variable DB CHAR(1);
declare variable AB CHAR(1);
declare variable DESCRETE CHAR(2);
BEGIN /*$$IBE$$ 
if (ORDEN = 'C') then
    BEGIN
    NITINI = DESDE;
    NITFIN = HASTA;
    NOMINI = '';
    NOMFIN = 'zz';
    END
ELSE
    BEGIN
    NOMINI = DESDE;
    NOMFIN = HASTA;
    NITINI = '';
    NITFIN = 'zz';
    END
EXECUTE PROCEDURE LEE_CONFIGURACION('CXPAGAR', 'SALDOS', 'DESCONTAR RETENCIONES POR CAUSACION') returning_values (DESCRETE);
 $$IBE$$*/ /* Ubique el NIT */ /*$$IBE$$ 
FOR select T.TERC_NIT, TERC_NOM, TERC_DV, TERC_TEL, TERC_CIU, P.GRPR_COD, T.CIUD_COD
    from terceros T, PROVEEDORES P
    where P.TERC_NIT = T.TERC_NIT AND TERC_PROV = 'S' AND T.TERC_NIT >= :NITINI AND T.TERC_NIT <= :NITFIN AND
        TERC_NOM >= :NOMINI AND TERC_NOM <= :NOMFIN
    INTO :NIT, :NOMBRE, :DV, :TELEFONO, :CIUDAD, :CODZONA, :CODCIUD
    DO  
    BEGIN

    SELECT GRPR_NOM FROM GRUPOS_PROVEEDORES WHERE GRPR_COD = :CODZONA INTO :NOMZONA;
    SELECT CIUD_NOM FROM CIUDADES WHERE CIUD_COD = :CODCIUD INTO :NOMCIUD;
    OK = 'N';
    if (AGRUPA = 'Z') then
        BEGIN
        if (GRPINI = '') then
            BEGIN
            if ((CODZONA IS NULL) or (CODZONA >= :GRPINI AND CODZONA <= :GRPFIN)) then
                OK = 'S';
            END
        ELSE
            if (CODZONA >= :GRPINI AND CODZONA <= :GRPFIN) then
                OK = 'S';
        END
    if (AGRUPA = 'C') then
        BEGIN
        if (GRPINI = '') then
            BEGIN
            if ((CODCIUD IS NULL) or (CODCIUD >= :GRPINI AND CODCIUD <= :GRPFIN)) then
                OK = 'S';
            END
        ELSE
            if (CODCIUD >= :GRPINI AND CODCIUD <= :GRPFIN) then
                OK = 'S';
        END
    if (AGRUPA = 'N') then
        OK = 'S';
        
    if (OK = 'S') then
        BEGIN
        execute procedure saldo_proveedor (NIT, FECINI) returning_values (INICIAL);
        if (INICIAL is null) then
            INICIAL = 0;
        SALDO = INICIAL;
        if (DETALLE = 'S') then
          BEGIN
          FOR select tido_nomcorto, mvpr_idref, mvpr_prefijo, mvpr_numero, mvpr_fecha, mvpr_conc, mvpr_monto, mvpr_debito, mvpr_rtfte, mvpr_rtiva, mvpr_rtica, mvpr_abono
            from movimiento_proveedor m, tipo_documento t
            where m.mvpr_tiporef = t.tido_cod and terc_nit = :NIT and mvpr_fecha >= :FECINI and mvpr_fecha <= :FECFIN AND MVPR_TIPOREF <> 55
            order by mvpr_fecha, mvpr_tiporef
            into :TIPODOC, :IDDOC, :PREFIJO, :NUMERO, :FECHA, :CONCEPTO, :DEBITO, :DB, :RTFTE, :RTIVA, :RTICA, :AB
            DO
            BEGIN
            if (RTFTE IS NULL) then
                RTFTE = 0;
            if (RTIVA IS NULL) then
                RTIVA = 0;
            if (RTICA IS NULL) then
                RTICA = 0;
            if (DB = 'N') then
                BEGIN
                CREDITO = DEBITO;
                DEBITO = 0;
                RTFTE = RTFTE * -1;
                RTIVA = RTIVA * -1;
                RTICA = RTICA * -1;
                END
            ELSE
                CREDITO = 0;
            SALDO = SALDO + DEBITO - CREDITO;
            if (AB = 'N') then
                BEGIN
                if (DESCRETE = 'SI') then
                    SALDO = SALDO - RTFTE - RTIVA - RTICA;
                ABONO = 0;
                END
            ELSE
                BEGIN
                ABONO = CREDITO;
                CREDITO = 0;
                if (DESCRETE <> 'SI') then
                    SALDO = SALDO + RTFTE + RTIVA + RTICA;
                END
            SUSPEND;
            END
          END
        ELSE
            BEGIN
            SELECT SUM(MVPR_MONTO), sum(mvpr_rtfte), sum(mvpr_rtiva), sum(mvpr_rtica) FROM movimiento_proveedor WHERE TERC_NIT = :NIT AND MVPR_FECHA >= :FECINI AND MVPR_FECHA <= :FECFIN AND MVPR_DEBITO = 'S' and MVPR_ABONO = 'N' INTO :DEBITO, :RTFTE, :RTIVA, :RTICA;
            if (DEBITO IS NULL) then
                DEBITO = 0;
            if (RTFTE IS NULL) then
                RTFTE = 0;
            if (RTIVA IS NULL) then
                RTIVA = 0;
            if (RTICA IS NULL) then
                RTICA = 0;
            if (DESCRETE = 'SI') then
                DEBITO = DEBITO - RTFTE - RTIVA - RTICA;
            SELECT SUM(MVPR_MONTO), sum(mvpr_rtfte), sum(mvpr_rtiva), sum(mvpr_rtica) FROM movimiento_proveedor WHERE TERC_NIT = :NIT AND MVPR_FECHA >= :FECINI AND MVPR_FECHA <= :FECFIN AND MVPR_DEBITO = 'N' AND MVPR_TIPOREF <> 55 AND MVPR_ABONO = 'N' INTO :CREDITO, :ARTFTE, :ARTIVA, :ARTICA;
            if (CREDITO IS NULL) then
                CREDITO = 0;
            if (ARTFTE IS NULL) then
                ARTFTE = 0;
            if (ARTIVA IS NULL) then
                ARTIVA = 0;
            if (ARTICA IS NULL) then
                ARTICA = 0;
            if (DESCRETE = 'SI') then
                CREDITO = CREDITO - ARTFTE - ARTIVA - ARTICA;
            RTFTE = RTFTE - ARTFTE;
            RTIVA = RTIVA - ARTIVA;
            RTICA = RTICA - ARTICA;
            SELECT SUM(MVPR_MONTO), sum(mvpr_rtfte), sum(mvpr_rtiva), sum(mvpr_rtica) FROM movimiento_proveedor WHERE TERC_NIT = :NIT AND MVPR_FECHA >= :FECINI AND MVPR_FECHA <= :FECFIN AND MVPR_ABONO = 'S' INTO :ABONO, :ARTFTE, :ARTIVA, :ARTICA;
            if (ABONO IS NULL) then
                ABONO = 0;
            if (ARTFTE IS NULL) then
                ARTFTE = 0;
            if (ARTIVA IS NULL) then
                ARTIVA = 0;
            if (ARTICA IS NULL) then
                ARTICA = 0;
            if (DESCRETE <> 'SI') then
                ABONO = ABONO + ARTFTE + ARTIVA + ARTICA;
            SALDO = INICIAL + DEBITO - CREDITO - ABONO;
            SUSPEND;
            END
        END
    END
 $$IBE$$*/ SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE CONCILIA_CXPAGAR(
    FECINI DATE,
    FECFIN DATE,
    CTACART VARCHAR(20),
    SUBEMPRESA INTEGER,
    ANTERIOR CHAR(1))
RETURNS (
    NIT VARCHAR(20),
    NOMBRE VARCHAR(60),
    INICIAL NUMERIC(18,2),
    INICIALC NUMERIC(18,2),
    DEBITOS NUMERIC(18,2),
    DEBITOSC NUMERIC(18,2),
    CREDITOS NUMERIC(18,2),
    CREDITOSC NUMERIC(18,2),
    SALDO NUMERIC(18,2),
    SALDOC NUMERIC(18,2),
    DIFERENCIA NUMERIC(18,2))
AS
declare variable ANO CHAR(4);
declare variable MES INTEGER;
declare variable ABONOS NUMERIC(18,2);
declare variable RETES CHAR(2);
begin
ano = EXTRACT(YEAR FROM FECFIN);
mes = EXTRACT(MONTH FROM FECFIN);

for select TERC_NIT, TERC_NOM from TERCEROS WHERE TERC_PROV = 'S' into :NIT, :NOMBRE
    DO
    BEGIN
    EXECUTE PROCEDURE saldo_proveedor (NIT, FECINI) returning_values (INICIAL);
    EXECUTE PROCEDURE LEE_CONFIGURACION('CXPAGAR', 'SALDOS', 'DESCONTAR RETENCIONES POR CAUSACION') returning_values(:RETES);
    if (RETES = 'SI') then
        BEGIN
        SELECT SUM(MVPR_MONTO-MVPR_RTFTE-MVPR_RTIVA-MVPR_RTICA)
            FROM movimiento_proveedor
            WHERE TERC_NIT = :NIT AND MVPR_FECHA >= :FECINI AND MVPR_FECHA < :FECFIN AND MVPR_DEBITO = 'S'
            INTO :DEBITOS;
        SELECT SUM(MVPR_MONTO-MVPR_RTFTE-MVPR_RTIVA-MVPR_RTICA)
            FROM movimiento_proveedor
            WHERE TERC_NIT = :NIT AND MVPR_FECHA >= :FECINI AND MVPR_FECHA < :FECFIN AND MVPR_DEBITO = 'N' AND MVPR_ABONO = 'N' and MVPR_TIPOREF <> 55
            INTO :CREDITOS;
        SELECT SUM(MVPR_MONTO) FROM movimiento_proveedor
            WHERE TERC_NIT = :NIT AND MVPR_FECHA >= :FECINI AND MVPR_FECHA < :FECFIN AND MVPR_ABONO = 'S'
            INTO :ABONOS;
        END
    ELSE
        BEGIN
        SELECT SUM(MVPR_MONTO)
            FROM movimiento_proveedor
            WHERE TERC_NIT = :NIT AND MVPR_FECHA >= :FECINI AND MVPR_FECHA < :FECFIN AND MVPR_DEBITO = 'S'
            INTO :DEBITOS;
        SELECT SUM(MVPR_MONTO)
            FROM movimiento_proveedor
            WHERE TERC_NIT = :NIT AND MVPR_FECHA >= :FECINI AND MVPR_FECHA < :FECFIN AND MVPR_DEBITO = 'N' AND MVPR_ABONO = 'N' AND MVPR_TIPOREF <> 55
            INTO :CREDITOS;
        SELECT SUM(MVPR_MONTO+MVPR_RTFTE+MVPR_RTIVA+MVPR_RTICA)
            FROM movimiento_proveedor
            WHERE TERC_NIT = :NIT AND MVPR_FECHA >= :FECINI AND MVPR_FECHA < :FECFIN AND MVPR_ABONO = 'S'
            INTO :ABONOS;
        END
    if (DEBITOS IS NULL) then
        DEBITOS = 0;
    if (CREDITOS IS NULL) then
        CREDITOS = 0;
    if (ABONOS IS NULL) then
        ABONOS = 0;
    CREDITOS = CREDITOS + ABONOS;
    SALDO = INICIAL + DEBITOS - CREDITOS;

    /* LO CONTABLE */
    EXECUTE PROCEDURE SALDO_TERCERO_MES(ctacart, NIT, ANO, MES, 'S') RETURNING_VALUES (INICIALC);
    EXECUTE PROCEDURE MOVIMIENTO_TERCERO_MES(ctacart, NIT, ANO, MES, 'S') RETURNING_VALUES(DEBITOSC);
    EXECUTE PROCEDURE MOVIMIENTO_TERCERO_MES(ctacart, NIT, ANO, MES, 'N') RETURNING_VALUES(CREDITOSC);
    SALDOC = INICIALC + DEBITOSC - CREDITOSC;
    diferencia = SALDO + SALDOC;
    if (DIFERENCIA <> 0) then
        BEGIN
        if (ANTERIOR <> 'S') then
            SUSPEND;
        ELSE
            BEGIN
            if (DIFERENCIA <> (INICIAL + INICIALC)) then
                SUSPEND;
            END
        END
    END
end

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE IMPR_EGRESO(
    ID INTEGER)
RETURNS (
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    NIT VARCHAR(20),
    NOMBRE VARCHAR(60),
    DIR VARCHAR(60),
    CIU VARCHAR(40),
    TEL VARCHAR(40),
    CONCEPTO VARCHAR(60),
    MONTO NUMERIC(18,2),
    RTFTE NUMERIC(18,2),
    RTIVA NUMERIC(18,2),
    RTICA NUMERIC(18,2),
    DSCTO NUMERIC(18,2),
    OBS BLOB SUB_TYPE 1 SEGMENT SIZE 80,
    ITEMDOC INTEGER,
    TIPODOC VARCHAR(8),
    PREFDOC VARCHAR(4),
    NUMDOC VARCHAR(6),
    NUMPRV VARCHAR(10),
    ABONODOC NUMERIC(18,2),
    RTFTEDOC NUMERIC(18,2),
    RTIVADOC NUMERIC(18,2),
    RTICADOC NUMERIC(18,2),
    DSCTODOC NUMERIC(18,2),
    SALDODOC NUMERIC(18,2),
    SALDOPROV NUMERIC(18,2),
    ANTERDOC NUMERIC(18,2))
AS
declare variable NUMROWS INTEGER;
declare variable TIPO integer;
declare variable IDDOC INTEGER;
BEGIN
  SELECT PREF_PRE, EGRE_NUMERO, EGRE_FECHA, EGRE_CONC,
        E.TERC_NIT, EGRE_NOMTERC, TERC_DIR, TERC_CIU, TERC_TEL,
        EGRE_MONTO, EGRE_RTFTEMONTO, EGRE_RTIVAMONTO, EGRE_RTICAMONTO, EGRE_DTOF,
        EGRE_OBS
    FROM EGRESOS E, TERCEROS T
    WHERE E.TERC_NIT = T.TERC_NIT AND E.EGRE_ID = :ID
    INTO :PREFIJO, :NUMERO, :FECHA, :CONCEPTO, 
        :NIT, :NOMBRE, :DIR, :CIU, :TEL,
        :MONTO, :RTFTE, :RTIVA, :RTICA, :DSCTO,
        :OBS;
  select SALDO from saldo_proveedor(:NIT, :FECHA+1) into :SALDOPROV;
  /*EXECUTE PROCEDURE saldo_proveedor(:NIT, (CAST('FECHA'+1 AS DATE))) returning_values (:SALDOPROV);*/
  SELECT COUNT(EGDE_ITEM) FROM EGRESOS_DETALLE
    WHERE EGRE_ID = :ID INTO :NUMROWS;
  if (NUMROWS > 0) then
    FOR SELECT EGDE_ITEM, EGDE_TIPODOC, TIDO_NOMCORTO, EGDE_IDDOC, EGDE_PREFIJO, EGDE_NUMERO, EGDE_ABONO, EGDE_RTFTE, EGDE_RTIVA, EGDE_RTICA, EGDE_DTOF
        FROM EGRESOS_DETALLE ED, TIPO_DOCUMENTO TD
        WHERE TD.TIDO_COD = ED.EGDE_TIPODOC AND ED.EGRE_ID = :ID
        order by egde_item
        INTO :ITEMDOC, :TIPO, :TIPODOC, :IDDOC, :PREFDOC, :NUMDOC, :ABONODOC, :RTFTEDOC, :RTIVADOC, :RTICADOC, :DSCTODOC
        DO
            BEGIN
            if (TIPO = 21) then
                SELECT FACO_NUMPROV FROM FACTURAS_COMPRA WHERE FACO_ID = :iddoc INTO :numprv;
            ELSE
                if (TIPO = 51) then
                    SELECT NDPR_NUMPROV FROM NOTAS_DEBITO_PROVEEDOR WHERE NDPR_ID = :iddoc INTO :numprv;
                ELSE
                    numprv = numdoc;
/*            EXECUTE PROCEDURE saldo_doc_cxpagar(:TIPO, :IDDOC, :FECHA) returning_values (:SALDODOC); */
            ANTERDOC = SALDODOC + RTFTEDOC + RTIVADOC + RTICADOC + ABONODOC + DSCTODOC;
            SUSPEND;
            END
  else
    BEGIN
    SALDOPROV = 0;
    ANTERDOC = 0;
    SALDODOC = 0;
    RTFTEDOC = 0;
    RTIVADOC = 0;
    RTICADOC = 0;
    ABONODOC = 0;
    DSCTODOC = 0;
    numprv = '';
    SUSPEND;
    END
END

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE MOVIMIENTO_CXPAGAR_DESDE_HASTA(
    NIT VARCHAR(20),
    DESDE DATE,
    HASTA DATE)
RETURNS (
    INICIAL NUMERIC(18,2),
    TIPODOC VARCHAR(8),
    IDDOC INTEGER,
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    CONCEPTO VARCHAR(60),
    DEBITO NUMERIC(18,2),
    CREDITO NUMERIC(18,2),
    SALDO NUMERIC(18,2),
    NOMBRE VARCHAR(60),
    RTFTE NUMERIC(18,2),
    RTIVA NUMERIC(18,2),
    RTICA NUMERIC(18,2),
    NUMPROV VARCHAR(20))
AS
declare variable DB CHAR(1);
declare variable AB CHAR(1);
declare variable RETES CHAR(2);
BEGIN
  /* Ubique el NIT */
  select terc_nom from terceros where terc_nit = :NIT INTO :NOMBRE;
  execute procedure saldo_proveedor (NIT, DESDE) returning_values (INICIAL);
  if (INICIAL is null) then
    INICIAL = 0;
  SALDO = INICIAL;
  EXECUTE PROCEDURE LEE_CONFIGURACION('CXPAGAR', 'SALDOS', 'DESCONTAR RETENCIONES POR CAUSACION') returning_values(:RETES);
  FOR select tido_nomcorto, mvpr_idref, mvpr_prefijo, mvpr_numero, mvpr_fecha, mvpr_conc, mvpr_monto, mvpr_debito, mvpr_rtfte, mvpr_rtiva, mvpr_rtica, mvpr_abono
    from movimiento_proveedor m, tipo_documento t
    where m.mvpr_tiporef = t.tido_cod and terc_nit = :NIT and mvpr_fecha >= :DESDE and mvpr_fecha <= :HASTA AND mvpr_tiporef <> 55
    order by mvpr_fecha, mvpr_tiporef
    into :TIPODOC, :IDDOC, :PREFIJO, :NUMERO, :FECHA, :CONCEPTO, :DEBITO, :DB, :RTFTE, :RTIVA, :RTICA, :AB
    DO
    BEGIN
    if (DB = 'N') then
        BEGIN
        if (AB = 'S') then
            if (RETES = 'SI') then
                CREDITO = DEBITO;
            ELSE
                CREDITO = DEBITO + RTFTE + RTIVA + RTICA;
        ELSE
            if (RETES = 'SI') then
                CREDITO = DEBITO - RTFTE - RTIVA - RTICA;
            ELSE
                CREDITO = DEBITO;
        DEBITO = 0;
        END
    ELSE
        BEGIN
        if (RETES = 'SI') then
            DEBITO = DEBITO - RTFTE - RTIVA - RTICA;
        CREDITO = 0;
        END
    SALDO = SALDO + DEBITO - CREDITO;
    NUMPROV = '';
    if (TIPODOC = 'CARGOACR') then
        SELECT NDPR_NUMPROV FROM NOTAS_DEBITO_PROVEEDOR WHERE NDPR_ID = :IDDOC INTO :NUMPROV;
    if (TIPODOC = 'FACTCOMP') then
        SELECT FACO_NUMPROV FROM FACTURAS_COMPRA WHERE FACO_ID = :IDDOC INTO :NUMPROV;
    SUSPEND;
    END
END

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE MOVIMIENTO_CXPAGAR_MES(
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    NIT VARCHAR(20),
    NOMBRE VARCHAR(60),
    INICIAL NUMERIC(18,4),
    DEBITOS NUMERIC(18,4),
    CREDITOS NUMERIC(18,4),
    ABONOS NUMERIC(18,4),
    FINAL NUMERIC(18,4))
AS
declare variable RETES CHAR(2);
BEGIN
  for select TERC_NIT, TERC_NOM from TERCEROS WHERE TERC_PROV = 'S' into :NIT, :NOMBRE
  DO
    BEGIN
    EXECUTE PROCEDURE saldo_proveedor (NIT, FECINI) returning_values (INICIAL);
    EXECUTE PROCEDURE LEE_CONFIGURACION('CXPAGAR', 'SALDOS', 'DESCONTAR RETENCIONES POR CAUSACION') returning_values(:RETES);
    if (RETES = 'SI') then
        BEGIN
        SELECT SUM(MVPR_MONTO-MVPR_RTFTE-MVPR_RTIVA-MVPR_RTICA)
            FROM movimiento_proveedor
            WHERE TERC_NIT = :NIT AND MVPR_FECHA >= :FECINI AND MVPR_FECHA < :FECFIN AND MVPR_DEBITO = 'S'
            INTO :DEBITOS;
        SELECT SUM(MVPR_MONTO-MVPR_RTFTE-MVPR_RTIVA-MVPR_RTICA)
            FROM movimiento_proveedor
            WHERE TERC_NIT = :NIT AND MVPR_FECHA >= :FECINI AND MVPR_FECHA < :FECFIN AND MVPR_DEBITO = 'N' AND MVPR_ABONO = 'N' and MVPR_TIPOREF <> 55
            INTO :CREDITOS;
        SELECT SUM(MVPR_MONTO) FROM movimiento_proveedor
            WHERE TERC_NIT = :NIT AND MVPR_FECHA >= :FECINI AND MVPR_FECHA < :FECFIN AND MVPR_ABONO = 'S'
            INTO :ABONOS;
        END
    ELSE
        BEGIN
        SELECT SUM(MVPR_MONTO)
            FROM movimiento_proveedor
            WHERE TERC_NIT = :NIT AND MVPR_FECHA >= :FECINI AND MVPR_FECHA < :FECFIN AND MVPR_DEBITO = 'S'
            INTO :DEBITOS;
        SELECT SUM(MVPR_MONTO)
            FROM movimiento_proveedor
            WHERE TERC_NIT = :NIT AND MVPR_FECHA >= :FECINI AND MVPR_FECHA < :FECFIN AND MVPR_DEBITO = 'N' AND MVPR_ABONO = 'N' AND MVPR_TIPOREF <> 55
            INTO :CREDITOS;
        SELECT SUM(MVPR_MONTO+MVPR_RTFTE+MVPR_RTIVA+MVPR_RTICA)
            FROM movimiento_proveedor
            WHERE TERC_NIT = :NIT AND MVPR_FECHA >= :FECINI AND MVPR_FECHA < :FECFIN AND MVPR_ABONO = 'S'
            INTO :ABONOS;
        END
    if (DEBITOS IS NULL) then
        DEBITOS = 0;
    if (CREDITOS IS NULL) then
        CREDITOS = 0;
    if (ABONOS IS NULL) then
        ABONOS = 0;
    FINAL = INICIAL + DEBITOS - CREDITOS - ABONOS;
    SUSPEND;
    END
END

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE REP_MOVIMIENTO_PROVEEDOR(
    DESDE VARCHAR(20),
    HASTA VARCHAR(20),
    GRPINI VARCHAR(5),
    GRPFIN VARCHAR(5),
    FECINI DATE,
    FECFIN DATE,
    DETALLE CHAR(1),
    ORDEN CHAR(1),
    AGRUPA CHAR(1))
RETURNS (
    NIT VARCHAR(20),
    NOMBRE VARCHAR(60),
    TELEFONO VARCHAR(40),
    CIUDAD VARCHAR(40),
    CODZONA VARCHAR(2),
    NOMZONA VARCHAR(60),
    DV CHAR(1),
    CODCIUD CHAR(5),
    NOMCIUD VARCHAR(60),
    INICIAL NUMERIC(18,2),
    TIPODOC VARCHAR(8),
    IDDOC INTEGER,
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    CONCEPTO VARCHAR(60),
    DEBITO NUMERIC(18,2),
    CREDITO NUMERIC(18,2),
    ABONO NUMERIC(18,2),
    SALDO NUMERIC(18,2),
    RTFTE NUMERIC(18,2),
    RTIVA NUMERIC(18,2),
    RTICA NUMERIC(18,2),
    ARTFTE NUMERIC(18,2),
    ARTIVA NUMERIC(18,2),
    ARTICA NUMERIC(18,2))
AS
declare variable NITINI VARCHAR(20);
declare variable NITFIN VARCHAR(20);
declare variable NOMINI VARCHAR(20);
declare variable NOMFIN VARCHAR(20);
declare variable OK CHAR(1);
declare variable DB CHAR(1);
declare variable AB CHAR(1);
declare variable DESCRETE CHAR(2);
BEGIN
if (ORDEN = 'C') then
    BEGIN
    NITINI = DESDE;
    NITFIN = HASTA;
    NOMINI = '';
    NOMFIN = 'zz';
    END
ELSE
    BEGIN
    NOMINI = DESDE;
    NOMFIN = HASTA;
    NITINI = '';
    NITFIN = 'zz';
    END
EXECUTE PROCEDURE LEE_CONFIGURACION('CXPAGAR', 'SALDOS', 'DESCONTAR RETENCIONES POR CAUSACION') returning_values (DESCRETE);
/* Ubique el NIT */
FOR select T.TERC_NIT, TERC_NOM, TERC_DV, TERC_TEL, TERC_CIU, P.GRPR_COD, T.CIUD_COD
    from terceros T, PROVEEDORES P
    where P.TERC_NIT = T.TERC_NIT AND TERC_PROV = 'S' AND T.TERC_NIT >= :NITINI AND T.TERC_NIT <= :NITFIN AND
        TERC_NOM >= :NOMINI AND TERC_NOM <= :NOMFIN
    INTO :NIT, :NOMBRE, :DV, :TELEFONO, :CIUDAD, :CODZONA, :CODCIUD
    DO  
    BEGIN

    SELECT GRPR_NOM FROM GRUPOS_PROVEEDORES WHERE GRPR_COD = :CODZONA INTO :NOMZONA;
    SELECT CIUD_NOM FROM CIUDADES WHERE CIUD_COD = :CODCIUD INTO :NOMCIUD;
    OK = 'N';
    if (AGRUPA = 'Z') then
        BEGIN
        if (GRPINI = '') then
            BEGIN
            if ((CODZONA IS NULL) or (CODZONA >= :GRPINI AND CODZONA <= :GRPFIN)) then
                OK = 'S';
            END
        ELSE
            if (CODZONA >= :GRPINI AND CODZONA <= :GRPFIN) then
                OK = 'S';
        END
    if (AGRUPA = 'C') then
        BEGIN
        if (GRPINI = '') then
            BEGIN
            if ((CODCIUD IS NULL) or (CODCIUD >= :GRPINI AND CODCIUD <= :GRPFIN)) then
                OK = 'S';
            END
        ELSE
            if (CODCIUD >= :GRPINI AND CODCIUD <= :GRPFIN) then
                OK = 'S';
        END
    if (AGRUPA = 'N') then
        OK = 'S';
        
    if (OK = 'S') then
        BEGIN
        execute procedure saldo_proveedor (NIT, FECINI) returning_values (INICIAL);
        if (INICIAL is null) then
            INICIAL = 0;
        SALDO = INICIAL;
        if (DETALLE = 'S') then
          BEGIN
          FOR select tido_nomcorto, mvpr_idref, mvpr_prefijo, mvpr_numero, mvpr_fecha, mvpr_conc, mvpr_monto, mvpr_debito, mvpr_rtfte, mvpr_rtiva, mvpr_rtica, mvpr_abono
            from movimiento_proveedor m, tipo_documento t
            where m.mvpr_tiporef = t.tido_cod and terc_nit = :NIT and mvpr_fecha >= :FECINI and mvpr_fecha <= :FECFIN AND MVPR_TIPOREF <> 55
            order by mvpr_fecha, mvpr_tiporef
            into :TIPODOC, :IDDOC, :PREFIJO, :NUMERO, :FECHA, :CONCEPTO, :DEBITO, :DB, :RTFTE, :RTIVA, :RTICA, :AB
            DO
            BEGIN
            if (RTFTE IS NULL) then
                RTFTE = 0;
            if (RTIVA IS NULL) then
                RTIVA = 0;
            if (RTICA IS NULL) then
                RTICA = 0;
            if (DB = 'N') then
                BEGIN
                CREDITO = DEBITO;
                DEBITO = 0;
                RTFTE = RTFTE * -1;
                RTIVA = RTIVA * -1;
                RTICA = RTICA * -1;
                END
            ELSE
                CREDITO = 0;
            SALDO = SALDO + DEBITO - CREDITO;
            if (AB = 'N') then
                BEGIN
                if (DESCRETE = 'SI') then
                    SALDO = SALDO - RTFTE - RTIVA - RTICA;
                ABONO = 0;
                END
            ELSE
                BEGIN
                ABONO = CREDITO;
                CREDITO = 0;
                if (DESCRETE <> 'SI') then
                    SALDO = SALDO + RTFTE + RTIVA + RTICA;
                END
            SUSPEND;
            END
          END
        ELSE
            BEGIN
            SELECT SUM(MVPR_MONTO), sum(mvpr_rtfte), sum(mvpr_rtiva), sum(mvpr_rtica) FROM movimiento_proveedor WHERE TERC_NIT = :NIT AND MVPR_FECHA >= :FECINI AND MVPR_FECHA <= :FECFIN AND MVPR_DEBITO = 'S' and MVPR_ABONO = 'N' INTO :DEBITO, :RTFTE, :RTIVA, :RTICA;
            if (DEBITO IS NULL) then
                DEBITO = 0;
            if (RTFTE IS NULL) then
                RTFTE = 0;
            if (RTIVA IS NULL) then
                RTIVA = 0;
            if (RTICA IS NULL) then
                RTICA = 0;
            if (DESCRETE = 'SI') then
                DEBITO = DEBITO - RTFTE - RTIVA - RTICA;
            SELECT SUM(MVPR_MONTO), sum(mvpr_rtfte), sum(mvpr_rtiva), sum(mvpr_rtica) FROM movimiento_proveedor WHERE TERC_NIT = :NIT AND MVPR_FECHA >= :FECINI AND MVPR_FECHA <= :FECFIN AND MVPR_DEBITO = 'N' AND MVPR_TIPOREF <> 55 AND MVPR_ABONO = 'N' INTO :CREDITO, :ARTFTE, :ARTIVA, :ARTICA;
            if (CREDITO IS NULL) then
                CREDITO = 0;
            if (ARTFTE IS NULL) then
                ARTFTE = 0;
            if (ARTIVA IS NULL) then
                ARTIVA = 0;
            if (ARTICA IS NULL) then
                ARTICA = 0;
            if (DESCRETE = 'SI') then
                CREDITO = CREDITO - ARTFTE - ARTIVA - ARTICA;
            RTFTE = RTFTE - ARTFTE;
            RTIVA = RTIVA - ARTIVA;
            RTICA = RTICA - ARTICA;
            SELECT SUM(MVPR_MONTO), sum(mvpr_rtfte), sum(mvpr_rtiva), sum(mvpr_rtica) FROM movimiento_proveedor WHERE TERC_NIT = :NIT AND MVPR_FECHA >= :FECINI AND MVPR_FECHA <= :FECFIN AND MVPR_ABONO = 'S' INTO :ABONO, :ARTFTE, :ARTIVA, :ARTICA;
            if (ABONO IS NULL) then
                ABONO = 0;
            if (ARTFTE IS NULL) then
                ARTFTE = 0;
            if (ARTIVA IS NULL) then
                ARTIVA = 0;
            if (ARTICA IS NULL) then
                ARTICA = 0;
            if (DESCRETE <> 'SI') then
                ABONO = ABONO + ARTFTE + ARTIVA + ARTICA;
            SALDO = INICIAL + DEBITO - CREDITO - ABONO;
            SUSPEND;
            END
        END
    END
END

^

SET TERM ; ^

SET TERM ^ ;

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

SET TERM ; ^

SET TERM ^ ;

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

    UPDATE movimiento_proveedor
        SET MVPR_MONTO = MVPR_MONTO - OLD.appd_aplicado,
        MVPR_RTFTE = MVPR_RTFTE - OLD.appd_rtfte,
        MVPR_RTIVA = MVPR_RTIVA - OLD.appd_rtiva,
        MVPR_RTICA = MVPR_RTICA - OLD.appd_rtica
        WHERE MVPR_TIPOREF = 53 AND MVPR_IDREF = NEW.APPR_ID;
    end
if ((NEW.appd_anulado = 'N') AND (NEW.APPR_ID <> 0)) then
    begin
    select PREF_PRE, APPR_NUMERO, appr_fecha, APPR_CONC, TERC_NIT
        from aplicacion_provedor where appr_id = new.appr_id
        into :PREFIJO, :NUMERO, :FEC, :CONCEPTO, :NIT;
    /* valide que no se pase del saldo */
/*    execute procedure saldo_doc_cxpagar(new.appd_tipodoc, new.appd_iddoc, '9999/12/31') returning_values(saldo);*/
    execute procedure lee_configuracion('CXPAGAR', 'SALDOS', 'DESCONTAR RETENCIONES POR CAUSACION') returning_values (RETES);
    if (SALDO < 0) then
        BEGIN
        if (RETES = 'SI') then
            begin
            if (saldo > NEW.appd_aplicado) then
                EXCEPTION DOCUMENTO_ABONO_MAYOR;
            end
        ELSE
            begin
            if (saldo > (NEW.appd_aplicado + NEW.appd_rtfte + NEW.appd_rtiva + NEW.appd_rtica)) then
                EXCEPTION DOCUMENTO_ABONO_MAYOR;
            end
        END
    else
        BEGIN
        if (RETES = 'SI') then
            begin
            if (saldo < NEW.appd_aplicado) then
                EXCEPTION DOCUMENTO_ABONO_MAYOR;
            end
        ELSE
            begin
            if (saldo < (NEW.appd_aplicado + NEW.appd_rtfte + NEW.appd_rtiva + NEW.appd_rtica)) then
                EXCEPTION DOCUMENTO_ABONO_MAYOR;
            end
        END
    select 'S' from saldos_doc_cxpagar where sdcp_tiporef = new.appd_tipodoc and sdcp_idref = new.appd_iddoc and sdcp_fecha = :FEC into :EXISTE;
    if (Existe = 'S') then
        /* actualice el saldo del dia */
        UPDATE saldos_doc_cxpagar
            SET SDCP_ABONO = SDCP_ABONO + NEW.appd_aplicado,
                SDCP_ABRTFTE = SDCP_ABRTFTE + NEW.appd_RTFTE,
                SDCP_ABRTIVA = SDCP_ABRTIVA + NEW.appd_RTIVA,
                SDCP_ABRTICA = SDCP_ABRTICA + NEW.appd_RTICA
            WHERE SDCP_TIPOREF = NEW.APPD_TIPODOC AND SDCP_IDREF = NEW.appd_IDDOC AND SDCP_FECHA = :FEC;
    ELSE
        /* Inserte un nuevo saldo diario */
        INSERT INTO SALDOS_DOC_CXPAGAR (SDCP_TIPOREF, SDCP_IDREF, SDCP_FECHA, TERC_NIT, SDCP_RTEFTE, SDCP_RTIVA, SDCP_RTICA, SDCP_ABONO, SDCP_ABRTFTE, SDCP_ABRTIVA, SDCP_ABRTICA, SDCP_DEBITO, SDCP_MONTO)
            VALUES (NEW.APPD_TIPODOC, NEW.APPD_IDDOC, :FEC, :NIT, 0, 0, 0, NEW.appd_aplicado, NEW.appd_rtfte, NEW.appd_rtiva, NEW.appd_rtica, 'N', 0);

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

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER EGRESOS_DETALLE_AI FOR EGRESOS_DETALLE
ACTIVE AFTER INSERT POSITION 0
AS
declare variable EXISTE CHAR(1);
declare variable FEC DATE;
declare variable CONC VARCHAR(60);
declare variable NIT VARCHAR(20);
declare variable CONCEPTO VARCHAR(60);
declare variable PREFIJO VARCHAR(4);
declare variable NUMERO VARCHAR(6);
declare variable OK CHAR(1);
declare variable EGANTI INTEGER;
declare variable RETES CHAR(2);
declare variable SALDO NUMERIC(18,2);
BEGIN
  if ((NEW.EGRE_ID <> 0) and (new.egde_anulado = 'N')) then
    BEGIN
    OK = 'N';
    if (new.EGDE_TIPODOC = 55) then
        BEGIN
        /* BUSQUE SI TIENE EGRE_ID, SI NO LO ACTUALIZA */
        SELECT EGRE_ID FROM ANTICIPOS_PROVEEDOR WHERE ANPR_ID = NEW.EGDE_IDDOC INTO :EGANTI;
        if (EGANTI = 0) then
            BEGIN
            OK = 'S';
            UPDATE ANTICIPOS_PROVEEDOR SET EGRE_ID = NEW.EGRE_ID WHERE ANPR_ID = NEW.EGDE_IDDOC;
            END
        END
    /* Abone el documento referenciado en EGRESOS_DETALLE */
    select PREF_PRE, EGRE_NUMERO, EGRE_FECHA, EGRE_CONC, TERC_NIT
        from EGRESOS where EGRE_ID = new.EGRE_ID into :PREFIJO, :NUMERO, :FEC, :CONCEPTO, :NIT;
    /* valide que no se pase del saldo */
/*    execute procedure saldo_doc_cxpagar(new.egde_tipodoc, new.egde_iddoc, '9999/12/31') returning_values(saldo);*/
    execute procedure lee_configuracion('CXPAGAR', 'SALDOS', 'DESCONTAR RETENCIONES POR CAUSACION') returning_values (RETES);
    if (SALDO < 0) then
        BEGIN
        if (RETES = 'SI') then
            begin
            if (saldo > NEW.egde_abono) then
                EXCEPTION DOCUMENTO_ABONO_MAYOR 'EL SALDO DEL DOCUMENTO ' || NEW.egde_prefijo || NEW.egde_numero || ' ES INSUFICIENTE.';
            end
        ELSE
            begin
            if (saldo > (NEW.egde_abono + NEW.egde_rtfte + NEW.egde_rtiva + NEW.egde_rtica + new.egde_dtof)) then
                EXCEPTION DOCUMENTO_ABONO_MAYOR 'EL SALDO DEL DOCUMENTO ' || NEW.egde_prefijo || NEW.egde_numero || ' ES INSUFICIENTE.';
            end
        END
    else
        BEGIN
        if (RETES = 'SI') then
            begin
            if (saldo < NEW.egde_abono) then
                EXCEPTION DOCUMENTO_ABONO_MAYOR 'EL SALDO DEL DOCUMENTO ' || NEW.egde_prefijo || NEW.egde_numero || ' ES INSUFICIENTE.';
            end
        ELSE
            begin
            if (saldo < (NEW.egde_abono + NEW.egde_rtfte + NEW.egde_rtiva + NEW.egde_rtica + NEW.egde_dtof)) then
                EXCEPTION DOCUMENTO_ABONO_MAYOR 'EL SALDO DEL DOCUMENTO ' || NEW.egde_prefijo || NEW.egde_numero || ' ES INSUFICIENTE.';
            end
        END
    if (OK = 'N') then
        BEGIN
        select 'S' from saldos_doc_cxpagar where sdcp_tiporef = new.egde_tipodoc and
            sdcp_idref = new.egde_iddoc and sdcp_fecha = :FEC into :EXISTE;
        if (Existe = 'S') then
            begin
            /* actualice el saldo del dia */
            UPDATE saldos_doc_cxpagar
                SET SDCP_ABONO = SDCP_ABONO + (NEW.egde_abono + NEW.egde_dtof),
                    SDCP_ABRTFTE = SDCP_ABRTFTE + NEW.egde_RTFTE,
                    SDCP_ABRTIVA = SDCP_ABRTIVA + NEW.egde_RTIVA,
                    SDCP_ABRTICA = SDCP_ABRTICA + NEW.egde_RTICA
                WHERE SDCP_TIPOREF = NEW.EGDE_TIPODOC AND SDCP_IDREF = NEW.egde_IDDOC AND SDCP_FECHA = :FEC;
            END
        ELSE
            BEGIN
            /* Inserte un nuevo saldo diario */
            INSERT INTO SALDOS_DOC_CXPAGAR (SDCP_TIPOREF, SDCP_IDREF, SDCP_FECHA, TERC_NIT, SDCP_RTEFTE, SDCP_RTIVA, SDCP_RTICA, SDCP_ABONO, SDCP_ABRTFTE, SDCP_ABRTIVA, SDCP_ABRTICA, SDCP_DEBITO, SDCP_MONTO)
                VALUES (NEW.EGDE_TIPODOC, NEW.EGDE_IDDOC, :FEC, :NIT, 0, 0, 0, (NEW.egde_abono+NEW.egde_dtof), NEW.egde_rtfte, NEW.egde_rtiva, NEW.egde_rtica, 'N', 0);
            END
        END
    /* actualice el registro en mov_proveedor (por si son varios items) */
    EXISTE = 'N';
    SELECT 'S' FROM MOVIMIENTO_PROVEEDOR WHERE MVPR_TIPOREF = 62 AND MVPR_IDREF = NEW.EGRE_ID INTO :EXISTE;
    if (EXISTE = 'S') then
        begin
        UPDATE movimiento_proveedor
            SET MVPR_MONTO = MVPR_MONTO + (NEW.egde_abono + NEW.egde_dtof),
                MVPR_RTFTE = MVPR_RTFTE + NEW.egde_rtfte,
                MVPR_RTIVA = MVPR_RTIVA + NEW.egde_rtiva,
                MVPR_RTICA = MVPR_RTICA + NEW.egde_rtica
            WHERE MVPR_TIPOREF = 62 AND MVPR_IDREF = NEW.EGRE_ID;
        end
    ELSE
        INSERT INTO MOVIMIENTO_PROVEEDOR (MVPR_ID, TERC_NIT, MVPR_TIPOREF, MVPR_IDREF, MVPR_FECHA, MVPR_VENCE, MVPR_CONC, MVPR_MONTO, MVPR_RTFTE, MVPR_RTIVA, MVPR_RTICA, MVPR_DEBITO, MVPR_ABONO, MVPR_PREFIJO, MVPR_NUMERO)
            VALUES (GEN_ID(ID_MOVPROV, 1), :NIT, 62, NEW.EGRE_ID, :FEC, :FEC, :CONCEPTO, (NEW.EGDE_ABONO+NEW.egde_dtof), NEW.EGDE_RTFTE, NEW.EGDE_RTIVA, NEW.EGDE_RTICA, 'N', 'S', :PREFIJO, :NUMERO);
    END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER EGRESOS_DETALLE_AU FOR EGRESOS_DETALLE
ACTIVE AFTER UPDATE POSITION 0
AS
declare variable EXISTE CHAR(1);
declare variable FEC DATE;
declare variable NIT VARCHAR(20);
declare variable CONCEPTO VARCHAR(60);
declare variable PREFIJO VARCHAR(4);
declare variable NUMERO VARCHAR(6);
declare variable OK CHAR(1);
declare variable EGANTI INTEGER;
declare variable RETES CHAR(2);
declare variable SALDO NUMERIC(18,2);
BEGIN
select PREF_PRE, EGRE_NUMERO, EGRE_FECHA, EGRE_CONC, TERC_NIT from EGRESOS
    where egre_id = new.egre_id into :PREFIJO, :NUMERO, :FEC, :CONCEPTO, :NIT;
if ((OLD.EGRE_ID <> 0) and (old.egde_anulado = 'N')) then
    BEGIN
    /* BORRE EL ANTICIPO SI FUE EL QUIEN LO CREO */
    OK = 'N';
    if (OLD.EGDE_TIPODOC = 55) then
        BEGIN
        SELECT EGRE_ID FROM ANTICIPOS_PROVEEDOR WHERE ANPR_ID = OLD.EGDE_IDDOC INTO :EGANTI;
        if (EGANTI = old.egre_id) then
            begin
            OK = 'S';
            UPDATE anticipos_proveedor SET ANPR_ANULADO = 'S' where ANPR_ID = OLD.EGDE_IDDOC;
            end
        END
    if (OK = 'N') then
        BEGIN
        EXISTE = 'N';
        select 'S' from saldos_doc_cxpagar where sdcp_tiporef = old.egde_tipodoc and
            sdcp_idref = old.egde_iddoc and sdcp_fecha = :FEC into :EXISTE;
        if (Existe = 'S') then
            begin
            /* Borre el viejo */
            if (old.EGRE_ID <> 0) then
                UPDATE saldos_doc_cxpagar
                    SET SDCP_ABONO = SDCP_ABONO - (old.egde_abono + OLD.egde_dtof),
                    SDCP_ABRTFTE = SDCP_ABRTFTE - old.egde_RTFTE,
                    SDCP_ABRTIVA = SDCP_ABRTIVA - old.egde_RTIVA,
                    SDCP_ABRTICA = SDCP_ABRTICA - old.egde_RTICA
                    WHERE SDCP_TIPOREF = OLD.EGDE_TIPODOC AND SDCP_IDREF = OLD.egde_IDDOC AND SDCP_FECHA = :FEC;
            end
        END
    EXISTE = 'N';
    SELECT 'S' FROM MOVIMIENTO_PROVEEDOR WHERE MVPR_TIPOREF = 62 AND MVPR_IDREF = OLD.EGRE_ID INTO :EXISTE;
    if (EXISTE = 'S') then
        begin
        /* Deshaga el viejo */
        UPDATE movimiento_proveedor
            SET MVPR_MONTO = MVPR_MONTO - (OLD.egde_abono + OLD.egde_dtof),
            MVPR_RTFTE = MVPR_RTFTE - OLD.egde_rtfte,
            MVPR_RTIVA = MVPR_RTIVA - OLD.egde_rtiva,
            MVPR_RTICA = MVPR_RTICA - OLD.egde_rtica
            WHERE MVPR_TIPOREF = 62 AND MVPR_IDREF = OLD.EGRE_ID;
        end
    END /* OLD.EGRE_ID <> 0 */
if ((NEW.EGRE_ID <> 0) and (NEW.egde_anulado = 'N')) then
    BEGIN
    /* valide que no se pase del saldo */
/*    execute procedure saldo_doc_cxpagar(new.egde_tipodoc, new.egde_iddoc, '9999/12/31') returning_values(saldo);*/
    execute procedure lee_configuracion('CXPAGAR', 'SALDOS', 'DESCONTAR RETENCIONES POR CAUSACION') returning_values (RETES);
    if (SALDO < 0) then
        BEGIN
        if (RETES = 'SI') then
            begin
            if (saldo > NEW.egde_abono) then
                EXCEPTION DOCUMENTO_ABONO_MAYOR;
            end
        ELSE
            begin
            if (saldo > (NEW.egde_abono + NEW.egde_rtfte + NEW.egde_rtiva + NEW.egde_rtica + new.egde_dtof)) then
                EXCEPTION DOCUMENTO_ABONO_MAYOR;
            end
        END
    else
        BEGIN
        if (RETES = 'SI') then
            begin
            if (saldo < NEW.egde_abono) then
                EXCEPTION DOCUMENTO_ABONO_MAYOR;
            end
        ELSE
            begin
            if (saldo < (NEW.egde_abono + NEW.egde_rtfte + NEW.egde_rtiva + NEW.egde_rtica + NEW.egde_dtof)) then
                EXCEPTION DOCUMENTO_ABONO_MAYOR;
            end
        END
    /* AHORA REGISTRE LO NUEVO */
    OK = 'N';
    if (new.EGDE_TIPODOC = 55) then
        BEGIN
        /* BUSQUE SI TIENE EGRE_ID, SI NO LO ACTUALIZA */
        SELECT EGRE_ID FROM ANTICIPOS_PROVEEDOR WHERE ANPR_ID = NEW.EGDE_IDDOC INTO :EGANTI;
        if (EGANTI = 0) then
            BEGIN
            OK = 'S';
            UPDATE ANTICIPOS_PROVEEDOR SET EGRE_ID = NEW.EGRE_ID WHERE ANPR_ID = NEW.EGDE_IDDOC;
            END
        END
    if (OK = 'N') then
        BEGIN
        EXISTE = 'N';
        select 'S' from saldos_doc_cxpagar where sdcp_tiporef = new.egde_tipodoc and
            sdcp_idref = new.egde_iddoc and sdcp_fecha = :FEC into :EXISTE;
        if (Existe = 'S') then
            /* actualice el saldo del dia */
            UPDATE saldos_doc_cxpagar
                SET SDCP_ABONO = SDCP_ABONO + (NEW.egde_abono + NEW.egde_dtof),
                SDCP_ABRTFTE = SDCP_ABRTFTE + NEW.egde_RTFTE,
                SDCP_ABRTIVA = SDCP_ABRTIVA + NEW.egde_RTIVA,
                SDCP_ABRTICA = SDCP_ABRTICA + NEW.egde_RTICA
                WHERE SDCP_TIPOREF = NEW.EGDE_TIPODOC AND SDCP_IDREF = NEW.egde_IDDOC AND SDCP_FECHA = :FEC;
        else
            /* Inserte un nuevo saldo diario */
            INSERT INTO SALDOS_DOC_CXPAGAR (SDCP_TIPOREF, SDCP_IDREF, SDCP_FECHA, TERC_NIT, SDCP_RTEFTE, SDCP_RTIVA, SDCP_RTICA, SDCP_ABONO, SDCP_ABRTFTE, SDCP_ABRTIVA, SDCP_ABRTICA, SDCP_DEBITO, SDCP_MONTO)
                VALUES (NEW.EGDE_TIPODOC, NEW.EGDE_IDDOC, :FEC, :NIT, 0, 0, 0, (NEW.egde_abono + NEW.egde_dtof), NEW.egde_rtfte, NEW.egde_rtiva, NEW.egde_rtica, 'N', 0);
        END /* ok = n */
    /* Registre o actualice el registro en movimiento_proveedor */
    EXISTE = 'N';
    SELECT 'S' FROM MOVIMIENTO_PROVEEDOR WHERE MVPR_TIPOREF = 62 AND MVPR_IDREF = NEW.EGRE_ID INTO :EXISTE;
    if (EXISTE = 'S') then
        /* Actualice el nuevo */
        UPDATE movimiento_proveedor
            SET MVPR_MONTO = MVPR_MONTO + (NEW.egde_abono + NEW.egde_dtof),
                MVPR_RTFTE = MVPR_RTFTE + NEW.egde_rtfte,
                MVPR_RTIVA = MVPR_RTIVA + NEW.egde_rtiva,
                MVPR_RTICA = MVPR_RTICA + NEW.egde_rtica
            WHERE MVPR_TIPOREF = 62 AND MVPR_IDREF = NEW.EGRE_ID;
    ELSE
        INSERT INTO MOVIMIENTO_PROVEEDOR (MVPR_ID, TERC_NIT, MVPR_TIPOREF, MVPR_IDREF, MVPR_FECHA, MVPR_VENCE, MVPR_CONC, MVPR_MONTO, MVPR_RTFTE, MVPR_RTIVA, MVPR_RTICA, MVPR_DEBITO, MVPR_ABONO, MVPR_PREFIJO, MVPR_NUMERO)
            VALUES (GEN_ID(ID_MOVPROV, 1), :NIT, 62, NEW.EGRE_ID, :FEC, :FEC, :CONCEPTO, (NEW.EGDE_ABONO + NEW.egde_dtof), NEW.EGDE_RTFTE, NEW.EGDE_RTIVA, NEW.EGDE_RTICA, 'N', 'S', :PREFIJO, :NUMERO);
    end
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER RECIBOS_CAJA_CRUCEC_AI FOR RECIBOS_CAJA_CRUCEC
ACTIVE AFTER INSERT POSITION 0
AS
declare variable EXISTE CHAR(1);
declare variable FEC DATE;
declare variable NIT VARCHAR(20);
declare variable CONCEPTO VARCHAR(60);
declare variable PREFIJO VARCHAR(4);
declare variable NUMERO VARCHAR(6);
declare variable OK CHAR(1);
declare variable RETES CHAR(2);
declare variable SALDO NUMERIC(18,2);
BEGIN
  if ((NEW.RECA_ID <> 0) and (new.rccr_anulado = 'N')) then
    BEGIN
    OK = 'N';
    /* Abone el documento referenciado  */
    select PREF_PRE, RECA_NUMERO, RECA_FECHA, RECA_CONC, TERC_NIT
        from RECIBOS_CAJA where RECA_ID = new.reca_id into :PREFIJO, :NUMERO, :FEC, :CONCEPTO, :NIT;
    /* valide que no se pase del saldo */
/*    execute procedure saldo_doc_cxpagar(new.rccr_tipodoc, new.rccr_iddoc, '9999/12/31') returning_values(saldo);*/
    execute procedure lee_configuracion('CXPAGAR', 'SALDOS', 'DESCONTAR RETENCIONES POR CAUSACION') returning_values (RETES);
    if (SALDO < 0) then
        BEGIN
        if (RETES = 'SI') then
            begin
            if (saldo > NEW.rccr_abono) then
                EXCEPTION DOCUMENTO_ABONO_MAYOR;
            end
        ELSE
            begin
            if (saldo > (NEW.rccr_abono + NEW.rccr_rtfte + NEW.rccr_rtiva + NEW.rccr_rtica + new.rccr_dtof)) then
                EXCEPTION DOCUMENTO_ABONO_MAYOR;
            end
        END
    else
        BEGIN
        if (RETES = 'SI') then
            begin
            if (saldo < NEW.rccr_abono) then
                EXCEPTION DOCUMENTO_ABONO_MAYOR;
            end
        ELSE
            begin
            if (saldo < (NEW.rccr_abono + NEW.rccr_rtfte + NEW.rccr_rtiva + NEW.rccr_rtica + NEW.rccr_dtof)) then
                EXCEPTION DOCUMENTO_ABONO_MAYOR;
            end
        END
    if (OK = 'N') then
        BEGIN
        select 'S' from saldos_doc_cxpagar where sdcp_tiporef = new.rccr_tipodoc and
            sdcp_idref = new.rccr_iddoc and sdcp_fecha = :FEC into :EXISTE;
        if (Existe = 'S') then
            begin
            /* actualice el saldo del dia */
            UPDATE saldos_doc_cxpagar
                SET SDCP_ABONO = SDCP_ABONO + (NEW.rccr_abono + NEW.rccr_dtof),
                    SDCP_ABRTFTE = SDCP_ABRTFTE + NEW.rccr_rtfte,
                    SDCP_ABRTIVA = SDCP_ABRTIVA + NEW.rccr_rtiva,
                    SDCP_ABRTICA = SDCP_ABRTICA + NEW.rccr_rtica
                WHERE SDCP_TIPOREF = NEW.rccr_tipodoc AND SDCP_IDREF = NEW.rccr_iddoc AND SDCP_FECHA = :FEC;
            END
        ELSE
            BEGIN
            /* Inserte un nuevo saldo diario */
            INSERT INTO SALDOS_DOC_CXPAGAR (SDCP_TIPOREF, SDCP_IDREF, SDCP_FECHA, TERC_NIT, SDCP_RTEFTE, SDCP_RTIVA, SDCP_RTICA, SDCP_ABONO, SDCP_ABRTFTE, SDCP_ABRTIVA, SDCP_ABRTICA, SDCP_DEBITO, SDCP_MONTO)
                VALUES (NEW.rccr_tipodoc, NEW.rccr_iddoc, :FEC, :NIT, 0, 0, 0, (NEW.rccr_abono+NEW.rccr_dtof), NEW.rccr_rtfte, NEW.rccr_rtiva, NEW.rccr_rtica, 'N', 0);
            END
        END
    /* actualice el registro en mov_proveedor (por si son varios items) */
    EXISTE = 'N';
    SELECT 'S' FROM MOVIMIENTO_PROVEEDOR WHERE MVPR_TIPOREF = 61 AND MVPR_IDREF = NEW.reca_id INTO :EXISTE;
    if (EXISTE = 'S') then
        begin
        UPDATE movimiento_proveedor
            SET MVPR_MONTO = MVPR_MONTO + (NEW.rccr_abono + NEW.rccr_dtof),
                MVPR_RTFTE = MVPR_RTFTE + NEW.rccr_rtfte,
                MVPR_RTIVA = MVPR_RTIVA + NEW.rccr_rtiva,
                MVPR_RTICA = MVPR_RTICA + NEW.rccr_rtica
            WHERE MVPR_TIPOREF = 61 AND MVPR_IDREF = NEW.reca_id;
        end
    ELSE
        INSERT INTO MOVIMIENTO_PROVEEDOR (MVPR_ID, TERC_NIT, MVPR_TIPOREF, MVPR_IDREF, MVPR_FECHA, MVPR_VENCE, MVPR_CONC, MVPR_MONTO, MVPR_RTFTE, MVPR_RTIVA, MVPR_RTICA, MVPR_DEBITO, MVPR_ABONO, MVPR_PREFIJO, MVPR_NUMERO)
            VALUES (GEN_ID(ID_MOVPROV, 1), :NIT, 61, NEW.reca_id, :FEC, :FEC, :CONCEPTO, (NEW.rccr_abono+NEW.rccr_dtof), NEW.rccr_rtfte, NEW.rccr_rtiva, NEW.rccr_rtica, 'N', 'S', :PREFIJO, :NUMERO);
    END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER RECIBOS_CAJA_CRUCEC_AU FOR RECIBOS_CAJA_CRUCEC
ACTIVE AFTER UPDATE POSITION 0
as
declare variable EXISTE CHAR(1);
declare variable FEC DATE;
declare variable NIT VARCHAR(20);
declare variable CONCEPTO VARCHAR(60);
declare variable PREFIJO VARCHAR(4);
declare variable NUMERO VARCHAR(6);
declare variable RETES CHAR(2);
declare variable SALDO NUMERIC(18,2);
BEGIN
select PREF_PRE, RECA_NUMERO, RECA_FECHA, RECA_CONC, TERC_NIT from RECIBOS_CAJA
    where reca_id = new.reca_id into :PREFIJO, :NUMERO, :FEC, :CONCEPTO, :NIT;
if ((OLD.reca_id <> 0) and (old.rccr_anulado = 'N')) then
    BEGIN
    EXISTE = 'N';
    select 'S' from saldos_doc_cxpagar where sdcp_tiporef = old.rccr_tipodoc and
        sdcp_idref = old.rccr_iddoc and sdcp_fecha = :FEC into :EXISTE;
    if (Existe = 'S') then
        UPDATE saldos_doc_cxpagar
            SET SDCP_ABONO = SDCP_ABONO - (old.rccr_abono + OLD.rccr_dtof),
            SDCP_ABRTFTE = SDCP_ABRTFTE - old.rccr_rtfte,
            SDCP_ABRTIVA = SDCP_ABRTIVA - old.rccr_rtiva,
            SDCP_ABRTICA = SDCP_ABRTICA - old.rccr_rtica
            WHERE SDCP_TIPOREF = OLD.rccr_tipodoc AND SDCP_IDREF = OLD.rccr_iddoc AND SDCP_FECHA = :FEC;
    EXISTE = 'N';
    SELECT 'S' FROM MOVIMIENTO_PROVEEDOR WHERE MVPR_TIPOREF = 61 AND MVPR_IDREF = OLD.reca_id INTO :EXISTE;
    if (EXISTE = 'S') then
        UPDATE movimiento_proveedor
            SET MVPR_MONTO = MVPR_MONTO - (OLD.rccr_abono + OLD.rccr_dtof),
            MVPR_RTFTE = MVPR_RTFTE - OLD.rccr_rtfte,
            MVPR_RTIVA = MVPR_RTIVA - OLD.rccr_rtiva,
            MVPR_RTICA = MVPR_RTICA - OLD.rccr_rtica
            WHERE MVPR_TIPOREF = 61 AND MVPR_IDREF = OLD.reca_id;
    END
if ((NEW.reca_id <> 0) and (NEW.rccr_anulado = 'N')) then
    BEGIN
    /* valide que no se pase del saldo */
/*    execute procedure saldo_doc_cxpagar(new.rccr_tipodoc, new.rccr_iddoc, '9999/12/31') returning_values(saldo);*/
    execute procedure lee_configuracion('CXPAGAR', 'SALDOS', 'DESCONTAR RETENCIONES POR CAUSACION') returning_values (RETES);
    if (SALDO < 0) then
        BEGIN
        if (RETES = 'SI') then
            begin
            if (saldo > NEW.rccr_abono) then
                EXCEPTION DOCUMENTO_ABONO_MAYOR;
            end
        ELSE
            begin
            if (saldo > (NEW.rccr_abono + NEW.rccr_rtfte + NEW.rccr_rtiva + NEW.rccr_rtica + new.rccr_dtof)) then
                EXCEPTION DOCUMENTO_ABONO_MAYOR;
            end
        END
    else
        BEGIN
        if (RETES = 'SI') then
            begin
            if (saldo < NEW.rccr_abono) then
                EXCEPTION DOCUMENTO_ABONO_MAYOR;
            end
        ELSE
            begin
            if (saldo < (NEW.rccr_abono + NEW.rccr_rtfte + NEW.rccr_rtiva + NEW.rccr_rtica + NEW.rccr_dtof)) then
                EXCEPTION DOCUMENTO_ABONO_MAYOR;
            end
        END
    /* AHORA REGISTRE LO NUEVO */
    EXISTE = 'N';
    select 'S' from saldos_doc_cxpagar where sdcp_tiporef = new.rccr_tipodoc and
        sdcp_idref = new.rccr_iddoc and sdcp_fecha = :FEC into :EXISTE;
    if (Existe = 'S') then
        UPDATE saldos_doc_cxpagar
            SET SDCP_ABONO = SDCP_ABONO + (NEW.rccr_abono + NEW.rccr_dtof),
            SDCP_ABRTFTE = SDCP_ABRTFTE + NEW.rccr_rtfte,
            SDCP_ABRTIVA = SDCP_ABRTIVA + NEW.rccr_rtiva,
            SDCP_ABRTICA = SDCP_ABRTICA + NEW.rccr_rtica
            WHERE SDCP_TIPOREF = NEW.rccr_tipodoc AND SDCP_IDREF = NEW.rccr_iddoc AND SDCP_FECHA = :FEC;
    else
        INSERT INTO SALDOS_DOC_CXPAGAR (SDCP_TIPOREF, SDCP_IDREF, SDCP_FECHA, TERC_NIT, SDCP_RTEFTE, SDCP_RTIVA, SDCP_RTICA, SDCP_ABONO, SDCP_ABRTFTE, SDCP_ABRTIVA, SDCP_ABRTICA, SDCP_DEBITO, SDCP_MONTO)
            VALUES (NEW.rccr_tipodoc, NEW.rccr_iddoc, :FEC, :NIT, 0, 0, 0, (NEW.rccr_abono + NEW.rccr_dtof), NEW.rccr_rtfte, NEW.rccr_rtiva, NEW.rccr_rtica, 'N', 0);
    /* Registre o actualice el registro en movimiento_proveedor */
    EXISTE = 'N';
    SELECT 'S' FROM MOVIMIENTO_PROVEEDOR WHERE MVPR_TIPOREF = 61 AND MVPR_IDREF = NEW.reca_id INTO :EXISTE;
    if (EXISTE = 'S') then
        /* Actualice el nuevo */
        UPDATE movimiento_proveedor
            SET MVPR_MONTO = MVPR_MONTO + (NEW.rccr_abono + NEW.rccr_dtof),
                MVPR_RTFTE = MVPR_RTFTE + NEW.rccr_rtfte,
                MVPR_RTIVA = MVPR_RTIVA + NEW.rccr_rtiva,
                MVPR_RTICA = MVPR_RTICA + NEW.rccr_rtica
            WHERE MVPR_TIPOREF = 61 AND MVPR_IDREF = NEW.reca_id;
    ELSE
        INSERT INTO MOVIMIENTO_PROVEEDOR (MVPR_ID, TERC_NIT, MVPR_TIPOREF, MVPR_IDREF, MVPR_FECHA, MVPR_VENCE, MVPR_CONC, MVPR_MONTO, MVPR_RTFTE, MVPR_RTIVA, MVPR_RTICA, MVPR_DEBITO, MVPR_ABONO, MVPR_PREFIJO, MVPR_NUMERO)
            VALUES (GEN_ID(ID_MOVPROV, 1), :NIT, 61, NEW.reca_id, :FEC, :FEC, :CONCEPTO, (NEW.rccr_abono + NEW.rccr_dtof), NEW.rccr_rtfte, NEW.rccr_rtiva, NEW.rccr_rtica, 'N', 'S', :PREFIJO, :NUMERO);
    end
END
^

SET TERM ; ^

/* AHORA SI AGREGUE LA TASA DEL DIA A LAS RUTINAS DE SALDOS */

ALTER TABLE SALDOS_DOC_CXPAGAR
ADD SDCP_TRM T_MONTO;
ALTER TABLE MOVIMIENTO_PROVEEDOR
ADD MVPR_TRM T_MONTO;
ALTER TABLE NOTAS_DEBITO_PROVEEDOR
ADD NDPR_TRM T_MONTO;
ALTER TABLE NOTAS_CREDITO_PROVEEDOR
ADD NCPR_TRM T_MONTO;
ALTER TABLE FACTURAS_COMPRA
ADD FACO_TRM T_MONTO;
ALTER TABLE DEVOLUCIONES_COMPRAS
ADD DVCO_TRM T_MONTO;
ALTER TABLE ANTICIPOS_PROVEEDOR
ADD ANPR_TRM T_MONTO;

SET TERM ^ ;

CREATE OR ALTER PROCEDURE SALDO_DOC_CXPAGAR(
    TIPO INTEGER,
    ID INTEGER,
    FECHA DATE,
    MONEDA INTEGER)
RETURNS (
    SALDO NUMERIC(18,2))
AS
declare variable DESC_RTES CHAR(2);
BEGIN
EXECUTE PROCEDURE LEE_CONFIGURACION('CXPAGAR', 'SALDOS', 'DESCONTAR RETENCIONES POR CAUSACION') returning_values (DESC_RTES);
if (DESC_RTES = 'SI') then
  if (MONEDA = 0) then
    SELECT SUM(SDCP_MONTO-SDCP_ABONO-SDCP_RTEFTE-SDCP_RTIVA-SDCP_RTICA) FROM saldos_doc_cxpagar
        WHERE (SDCP_TIPOREF = :TIPO) AND (SDCP_IDREF = :ID) AND (SDCP_FECHA <= :FECHA) INTO :SALDO;
  ELSE
    SELECT SUM((SDCP_MONTO-SDCP_ABONO-SDCP_RTEFTE-SDCP_RTIVA-SDCP_RTICA)/SDCP_TRM) FROM saldos_doc_cxpagar
        WHERE (SDCP_TIPOREF = :TIPO) AND (SDCP_IDREF = :ID) AND (SDCP_FECHA <= :FECHA) INTO :SALDO;
ELSE
  if (MONEDA = 0) then
    SELECT SUM(SDCP_MONTO-SDCP_ABONO-SDCP_ABRTFTE-SDCP_ABRTIVA-SDCP_ABRTICA) FROM saldos_doc_cxpagar
        WHERE (SDCP_TIPOREF = :TIPO) AND (SDCP_IDREF = :ID) AND (SDCP_FECHA <= :FECHA) INTO :SALDO;
  ELSE
    SELECT SUM((SDCP_MONTO-SDCP_ABONO-SDCP_ABRTFTE-SDCP_ABRTIVA-SDCP_ABRTICA)/SDCP_TRM) FROM saldos_doc_cxpagar
        WHERE (SDCP_TIPOREF = :TIPO) AND (SDCP_IDREF = :ID) AND (SDCP_FECHA <= :FECHA) INTO :SALDO;
if (SALDO IS NULL) THEN
    SALDO = 0;
SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER PROCEDURE BUSCA_ID_DOC_CXPAGAR(
    TIPO INTEGER,
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(6),
    NIT VARCHAR(20),
    FECHA DATE,
    MONEDA INTEGER)
RETURNS (
    ID INTEGER,
    SALDO NUMERIC(18,2),
    RTFTE NUMERIC(18,2),
    RTIVA NUMERIC(18,2),
    RTICA NUMERIC(18,2),
    DTOF NUMERIC(18,2),
    ERROR INTEGER)
AS
declare variable VERNIT VARCHAR(20);
declare variable FEC DATE;
declare variable DTOAPL NUMERIC(18,2);
declare variable FECDTO DATE;
declare variable DESC_RTES CHAR(2);
declare variable TRM NUMERIC(18,2);
BEGIN
ERROR = 0;
ID = 0;
EXECUTE PROCEDURE COMPLETA_CEROS(NUMERO) returning_values (NUMERO);
if (TIPO = 51) then
    SELECT NDPR_ID, TERC_NIT, NDPR_FECHA, NDPR_DTOFMONTO, NDPR_DTOFECHA, NDPR_TRM
        FROM NOTAS_DEBITO_PROVEEDOR WHERE PREF_PRE = :PREFIJO AND NDPR_NUMERO = :NUMERO
        INTO :ID, :VERNIT, :FEC, :DTOF, :FECDTO, :TRM;
if (TIPO = 52) then
    SELECT NCPR_ID, TERC_NIT, NCPR_FECHA, NCPR_DTOFMONTO, NCPR_DTOFECHA, NCPR_TRM
        FROM NOTAS_CREDITO_PROVEEDOR WHERE PREF_PRE = :PREFIJO AND NCPR_NUMERO = :NUMERO
        INTO :ID, :VERNIT, :FEC, :DTOF, :FECDTO, :TRM;
if (TIPO = 55) then
    SELECT ANPR_ID, TERC_NIT, ANPR_FECHA, ANPR_DTOFMONTO, ANPR_DTOFECHA, ANPR_TRM
        FROM ANTICIPOS_PROVEEDOR WHERE PREF_PRE = :PREFIJO AND ANPR_NUMERO = :NUMERO
        INTO :ID, :VERNIT, :FEC, :DTOF, :FECDTO, :TRM;
if (TIPO = 21) then
    SELECT FACO_ID, TERC_NIT, FACO_FECHA, FACO_DTOFMONTO, FACO_DTOFFECHA, FACO_TRM
        FROM FACTURAS_COMPRA WHERE PREF_PRE = :PREFIJO AND FACO_NUMERO = :NUMERO
        INTO :ID, :VERNIT, :FEC, :DTOF, :FECDTO, :TRM;
if (TIPO = 24) then
    SELECT DVCO_ID, TERC_NIT, DVCO_FECHA, 0, DVCO_FECHA, DVCO_TRM
        FROM devoluciones_compras WHERE PREF_PRE = :PREFIJO AND DVCO_NUMERO = :NUMERO
        INTO :ID, :VERNIT, :FEC, :DTOF, :FECDTO, :TRM;
if (fecha > FECDTO) then
    DTOF = 0;
if (DTOF IS NULL) then
    DTOF = 0;
if (DTOF <> 0) then
    BEGIN
    if ((MONEDA <> 0) AND (TRM <> 0)) then
        DTOF = DTOF / TRM;
    if (MONEDA = 0) then
        SELECT SUM(EGDE_DTOF) FROM EGRESOS_DETALLE WHERE EGDE_IDDOC = :ID AND EGDE_TIPODOC = :TIPO INTO :DTOAPL;
    ELSE
        SELECT SUM(EGDE_DTOF/EGRE_TRM) FROM EGRESOS_DETALLE D, EGRESOS E
            WHERE E.egre_id = D.egre_id AND EGDE_IDDOC = :ID AND EGDE_TIPODOC = :TIPO INTO :DTOAPL;
    if (DTOAPL IS NULL) then
        DTOAPL = 0;
    DTOF = DTOF - DTOAPL;
    END
if (ID = 0) then
  ERROR = 1;
ELSE
  BEGIN
  /* VERIFIQUE EL NIT */
  if (VERNIT <> NIT) then
    ERROR = 2;
  else
    BEGIN
    /* VERIFIQUE QUE LA FECHA DEL ABONO SEA POSTERIOR O IGUAL AL DOC */
    if (FEC > FECHA) then
        ERROR = 3;
    ELSE
        BEGIN
        /* CALCULE LOS SALDOS */
        if (MONEDA = 0) then
            SELECT SUM(SDCP_MONTO - SDCP_ABONO), SUM(SDCP_RTEFTE - SDCP_ABRTFTE), SUM(SDCP_RTIVA - SDCP_ABRTIVA), SUM(SDCP_RTICA - SDCP_ABRTICA)
                FROM SALDOS_DOC_CXPAGAR WHERE SDCP_TIPOREF = :TIPO AND SDCP_IDREF = :ID
                INTO :SALDO, :RTFTE, :RTIVA, :RTICA;
        ELSE
            SELECT SUM((SDCP_MONTO-SDCP_ABONO)/SDCP_TRM), SUM((SDCP_RTEFTE-SDCP_ABRTFTE)/SDCP_TRM), SUM((SDCP_RTIVA-SDCP_ABRTIVA)/SDCP_TRM), SUM((SDCP_RTICA-SDCP_ABRTICA)/SDCP_TRM)
                FROM SALDOS_DOC_CXPAGAR WHERE SDCP_TIPOREF = :TIPO AND SDCP_IDREF = :ID
                INTO :SALDO, :RTFTE, :RTIVA, :RTICA;
        if (RTFTE IS NULL) then
            RTFTE = 0;
        if (RTIVA IS NULL) then
            RTIVA = 0;
        if (RTICA IS NULL) then
            RTICA = 0;
        /* TRAIGA EL SALDO NETO */
        EXECUTE PROCEDURE SALDO_DOC_CXPAGAR(TIPO, ID, FECHA,MONEDA) returning_values (SALDO);
        if (SALDO = 0) then
            ERROR = 4;
        ELSE
            BEGIN
            /* RESTE LAS RETENCIONES YA QUE SE SUGERIRAN */
            EXECUTE PROCEDURE LEE_CONFIGURACION('CXPAGAR', 'SALDOS', 'DESCONTAR RETENCIONES POR CAUSACION') returning_values (DESC_RTES);
            if (DESC_RTES = 'NO') then
                SALDO = SALDO - RTFTE - RTIVA - RTICA;
            SALDO = SALDO - DTOF;
            END
        END
    END
  END
SUSPEND;
END
^

SET TERM ; ^

ALTER TABLE APLICACION_PROVEDOR
ADD APPR_TRM T_MONTO;

SET TERM ^ ;

CREATE OR ALTER PROCEDURE CHEQUEO_SALDOS_DOC_CXPAGAR(
    PRVINI VARCHAR(20),
    PRVFIN VARCHAR(20))
RETURNS (
    ERROR VARCHAR(60),
    TIPO INTEGER,
    ID INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(6))
AS
declare variable FECHA DATE;
declare variable NIT VARCHAR(20);
declare variable RTFTE NUMERIC(18, 2);
declare variable RTIVA NUMERIC(18, 2);
declare variable RTICA NUMERIC(18, 2);
declare variable MONTO NUMERIC(18, 2);
declare variable EXISTE CHAR(1);
declare variable IDR INTEGER;
declare variable EGREID INTEGER;
declare variable TRM NUMERIC(18, 2);
BEGIN
DELETE FROM anticipos_proveedor WHERE EGRE_ID = 0;
DELETE FROM saldos_doc_cxpagar WHERE TERC_NIT >= :PRVINI AND TERC_NIT <= :PRVFIN;

FOR SELECT FACO_ID, FACO_FECHA, TERC_NIT, FACO_RTFTEMONTO, FACO_rtivamonto, FACO_rticamonto, FACO_TOTAL, FACO_TRM
    FROM FACTURAS_COMPRA WHERE FACO_ID <> 0 and faco_anulado = 'N' AND TERC_NIT >= :PRVINI AND TERC_NIT <= :PRVFIN
    ORDER BY FACO_FECHA
    INTO :ID, :FECHA, :nit,  :RTFTE, :RTIVA, :RTICA, :MONTO, :TRM
    DO
    INSERT INTO saldos_doc_cxpagar (SDCP_TIPOREF, SDCP_IDREF, SDCP_FECHA, TERC_NIT, SDCP_RTEFTE, SDCP_RTIVA, SDCP_RTICA, SDCP_ABONO, SDCP_ABRTFTE, SDCP_ABRTIVA, SDCP_ABRTICA, SDCP_DEBITO, SDCP_MONTO, SDCP_TRM)
        VALUES (21, :ID, :fecha, :nit, :rtfte, :rtiva, :rtica, 0, 0, 0, 0, 'S', :MONTO, :TRM);

FOR SELECT NDPR_ID, NDPR_FECHA, TERC_NIT, NDPR_RTFTEMONTO, NDPR_rtivamonto, NDPR_rticamonto, ndpr_monto+ndpr_ivamonto, NDPR_TRM
    FROM notas_debito_proveedor WHERE NDPR_ID <> 0 and NDPR_anulado = 'N' AND TERC_NIT >= :PRVINI AND TERC_NIT <= :PRVFIN
    ORDER BY NDPR_FECHA
    INTO :ID, :FECHA, :nit,  :RTFTE, :RTIVA, :RTICA, :MONTO, :TRM
    DO
    INSERT INTO saldos_doc_cxpagar (SDCP_TIPOREF, SDCP_IDREF, SDCP_FECHA, TERC_NIT, SDCP_RTEFTE, SDCP_RTIVA, SDCP_RTICA, SDCP_ABONO, SDCP_ABRTFTE, SDCP_ABRTIVA, SDCP_ABRTICA, SDCP_DEBITO, SDCP_MONTO, SDCP_TRM)
        VALUES (51, :ID, :fecha, :nit, :rtfte, :rtiva, :rtica, 0, 0, 0, 0, 'S', :MONTO, :TRM);

FOR SELECT DVCO_ID, DVCO_FECHA, TERC_NIT, DVCO_RTFTEMONTO, DVCO_rtivamonto, DVCO_rticamonto, dvco_total, DVCO_TRM
    FROM devoluciones_compras WHERE DVCO_ID <> 0 and DVCO_anulado = 'N' AND TERC_NIT >= :PRVINI AND TERC_NIT <= :PRVFIN
    ORDER BY DVCO_FECHA
    INTO :ID, :FECHA, :nit,  :RTFTE, :RTIVA, :RTICA, :MONTO, :TRM
    DO
    INSERT INTO saldos_doc_cxpagar (SDCP_TIPOREF, SDCP_IDREF, SDCP_FECHA, TERC_NIT, SDCP_RTEFTE, SDCP_RTIVA, SDCP_RTICA, SDCP_ABONO, SDCP_ABRTFTE, SDCP_ABRTIVA, SDCP_ABRTICA, SDCP_DEBITO, SDCP_MONTO, SDCP_TRM)
        VALUES (24, :ID, :fecha, :nit, :rtfte*-1, :rtiva*-1, :rtica*-1, 0, 0, 0, 0, 'N', :MONTO * -1, :TRM);

FOR SELECT NCPR_ID, NCPR_FECHA, TERC_NIT, NCPR_RTFTEMONTO, NCPR_rtivamonto, NCPR_rticamonto, ncpr_monto+ncpr_ivamonto, NCPR_TRM
    FROM notas_credito_proveedor WHERE NCPR_ID <> 0 and NCPR_anulado = 'N' AND TERC_NIT >= :PRVINI AND TERC_NIT <= :PRVFIN
    ORDER BY NCPR_FECHA
    INTO :ID, :FECHA, :nit,  :RTFTE, :RTIVA, :RTICA, :MONTO, :TRM
    DO
    INSERT INTO saldos_doc_cxpagar (SDCP_TIPOREF, SDCP_IDREF, SDCP_FECHA, TERC_NIT, SDCP_RTEFTE, SDCP_RTIVA, SDCP_RTICA, SDCP_ABONO, SDCP_ABRTFTE, SDCP_ABRTIVA, SDCP_ABRTICA, SDCP_DEBITO, SDCP_MONTO, SDCP_TRM)
        VALUES (52, :ID, :fecha, :nit, :rtfte*-1, :rtiva*-1, :rtica*-1, 0, 0, 0, 0, 'N', :MONTO * -1, :TRM);

FOR SELECT ANPR_ID, ANPR_FECHA, TERC_NIT, ANPR_RTFTEMONTO, ANPR_rtivamonto, ANPR_rticamonto, anpr_base+anpr_ivamonto, ANPR_TRM
    FROM anticipos_proveedor WHERE ANPR_ID <> 0 and ANPR_anulado = 'N' AND TERC_NIT >= :PRVINI AND TERC_NIT <= :PRVFIN
    ORDER BY ANPR_FECHA
    INTO :ID, :FECHA, :nit,  :RTFTE, :RTIVA, :RTICA, :MONTO, :TRM
    DO
    INSERT INTO saldos_doc_cxpagar (SDCP_TIPOREF, SDCP_IDREF, SDCP_FECHA, TERC_NIT, SDCP_RTEFTE, SDCP_RTIVA, SDCP_RTICA, SDCP_ABONO, SDCP_ABRTFTE, SDCP_ABRTIVA, SDCP_ABRTICA, SDCP_DEBITO, SDCP_MONTO, SDCP_TRM)
        VALUES (55, :ID, :fecha, :nit, :rtfte*-1, :rtiva*-1, :rtica*-1, 0, 0, 0, 0, 'N', :MONTO * -1, :TRM);

FOR SELECT APPD_TIPODOC, APPD_IDDOC, APPR_FECHA, TERC_NIT, APPD_APLICADO, APPD_RTFTE, APPD_RTIVA, APPD_RTICA, APPR_TRM
    FROM APLICACION_PROVEEDOR_DETALLE D, aplicacion_provedor A
    WHERE A.APPR_ID = D.appr_id AND A.APPR_ID <> 0 AND APPR_ANULADO = 'N' AND TERC_NIT >= :PRVINI AND TERC_NIT <= :PRVFIN
    ORDER BY APPR_FECHA
    INTO :TIPO, :ID, :FECHA, :NIT, :MONTO, :RTFTE, :RTIVA, :RTICA, :TRM
    DO
    BEGIN
    EXISTE = 'N';
    select 'S' from saldos_doc_cxpagar where sdcp_tiporef = :TIPO and sdcp_idref = :ID and sdcp_fecha = :fecha into :EXISTE;
    if (Existe = 'S') then
        begin
        /* actualice el saldo del dia */
        UPDATE saldos_doc_cxpagar
            SET SDCP_ABONO = SDCP_ABONO + :MONTO,
                SDCP_ABRTFTE = SDCP_ABRTFTE + :RTFTE,
                SDCP_ABRTIVA = SDCP_ABRTIVA + :RTIVA,
                SDCP_ABRTICA = SDCP_ABRTICA + :RTICA,
                SDCP_TRM = :TRM
            WHERE SDCP_TIPOREF = :TIPO AND SDCP_IDREF = :ID AND SDCP_FECHA = :fecha;
        END
    ELSE
        BEGIN
        /* Inserte un nuevo saldo diario */
        INSERT INTO saldos_doc_cxpagar (SDCP_TIPOREF, SDCP_IDREF, SDCP_FECHA, TERC_NIT, SDCP_RTEFTE, SDCP_RTIVA, SDCP_RTICA, SDCP_ABONO, SDCP_ABRTFTE, SDCP_ABRTIVA, SDCP_ABRTICA, SDCP_DEBITO, SDCP_MONTO, SDCP_TRM)
            VALUES (:TIPO, :ID, :fecha, :NIT, 0, 0, 0, :MONTO, :rtfte, :rtiva, :rtica, 'N', 0, :TRM);
        END
    END

FOR SELECT E.EGRE_ID, EGDE_TIPODOC, EGDE_IDDOC, EGRE_FECHA, TERC_NIT, EGDE_ABONO+EGDE_DTOF, EGDE_RTFTE, EGDE_RTIVA, EGDE_RTICA, EGRE_TRM
    FROM EGRESOS_DETALLE D, EGRESOS E
    WHERE E.EGRE_ID = D.EGRE_ID AND E.EGRE_ID <> 0 AND EGRE_ANULADO = 'N' AND TERC_NIT >= :PRVINI AND TERC_NIT <= :PRVFIN
    ORDER BY EGRE_FECHA
    INTO :IDR, :TIPO, :ID, :FECHA, :NIT, :MONTO, :RTFTE, :RTIVA, :RTICA, :TRM
    DO
    BEGIN
    EXISTE = 'N';
    if (TIPO = 55) then
        BEGIN
        SELECT EGRE_ID FROM anticipos_proveedor WHERE ANPR_ID = :ID INTO :EGREID;
        if (EGREID = IDR) then
            EXISTE = 'S';
        END
    if (EXISTE = 'N') then
        BEGIN
        select 'S' from saldos_doc_cxpagar where sdcp_tiporef = :TIPO and sdcp_idref = :ID and sdcp_fecha = :fecha into :EXISTE;
        if (Existe = 'S') then
            begin
            /* actualice el saldo del dia */
            UPDATE saldos_doc_cxpagar
                SET SDCP_ABONO = SDCP_ABONO + :MONTO,
                    SDCP_ABRTFTE = SDCP_ABRTFTE + :RTFTE,
                    SDCP_ABRTIVA = SDCP_ABRTIVA + :RTIVA,
                    SDCP_ABRTICA = SDCP_ABRTICA + :RTICA,
                    SDCP_TRM = :TRM
                WHERE SDCP_TIPOREF = :TIPO AND SDCP_IDREF = :ID AND SDCP_FECHA = :fecha;
            END
        ELSE
            BEGIN
            /* Inserte un nuevo saldo diario */
            INSERT INTO saldos_doc_cxpagar (SDCP_TIPOREF, SDCP_IDREF, SDCP_FECHA, TERC_NIT, SDCP_RTEFTE, SDCP_RTIVA, SDCP_RTICA, SDCP_ABONO, SDCP_ABRTFTE, SDCP_ABRTIVA, SDCP_ABRTICA, SDCP_DEBITO, SDCP_MONTO, SDCP_TRM)
                VALUES (:TIPO, :ID, :fecha, :NIT, 0, 0, 0, :MONTO, :rtfte, :rtiva, :rtica, 'N', 0, :TRM);
            END
        END
    END

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

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER PROCEDURE CXPAGAR_PROVEEDOR(
    NIT VARCHAR(20),
    FECHA DATE,
    MONEDA INTEGER)
RETURNS (
    TIPO INTEGER,
    ID INTEGER,
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(6),
    FECDOC DATE,
    VENCE DATE,
    DIAS INTEGER,
    REFERENCIA VARCHAR(20),
    SALDO NUMERIC(18,2),
    RTFTE NUMERIC(18,2),
    RTIVA NUMERIC(18,2),
    RTICA NUMERIC(18,2),
    DTOF NUMERIC(18,2),
    TIPONOM VARCHAR(8),
    NOMBRE VARCHAR(60),
    CONCEPTO VARCHAR(60),
    TRMDOC NUMERIC(18,2))
AS
declare variable FEC DATE;
declare variable DESC_RTES CHAR(2);
declare variable DTOAPL NUMERIC(18,2);
declare variable VENCIMIENTO VARCHAR(12);
BEGIN
  SELECT TERC_NOM FROM TERCEROS WHERE TERC_NIT = :NIT INTO :NOMBRE;
  /* BUSQUE EN SALDOS_DOC_CXPAGAR LOS QUE TENGAN SALDO > 0 */
  FOR SELECT MVPR_TIPOREF, MVPR_IDREF, MVPR_PREFIJO, MVPR_NUMERO, MVPR_CONC, MVPR_FECHA, MVPR_VENCE
    FROM MOVIMIENTO_PROVEEDOR
    WHERE TERC_NIT = :NIT AND MVPR_FECHA <= :FECHA AND MVPR_ABONO = 'N' and ((:moneda = 0) or (mvpr_trm <> 1))
    ORDER BY MVPR_FECHA
    INTO :TIPO, :ID, :PREFIJO, :NUMERO, :CONCEPTO, :FECDOC, :VENCE
    DO
    BEGIN
    EXECUTE PROCEDURE LEE_CONFIGURACION('CXPAGAR', 'SALDOS', 'ANALISIS DE CXPAGAR CON FECHA FACTURA O VENCIMIENTO') returning_values (VENCIMIENTO);
    if (VENCIMIENTO = 'FECHA') then
        DIAS = FECHA - FECDOC;
    ELSE
        DIAS = FECHA - VENCE;
    REFERENCIA = '';
    EXECUTE PROCEDURE saldo_doc_cxpagar(TIPO, ID, FECHA, MONEDA) returning_values (SALDO);
    if (SALDO <> 0) then
        BEGIN
        SELECT TIDO_NOMCORTO FROM TIPO_DOCUMENTO WHERE TIDO_COD = :TIPO INTO :TIPONOM;
        if (TIPO = 51) then
            SELECT NDPR_DTOFMONTO, NDPR_DTOFECHA, NDPR_NUMPROV, NDPR_TRM
                FROM NOTAS_DEBITO_PROVEEDOR WHERE NDPR_ID = :ID INTO :DTOF, :FEC, :REFERENCIA, :TRMDOC;
        if (TIPO = 52) then
            SELECT NCPR_DTOFMONTO, NCPR_DTOFECHA, NCPR_TRM FROM NOTAS_CREDITO_PROVEEDOR
                WHERE NCPR_ID = :ID INTO :DTOF, :FEC, :TRMDOC;
        if (TIPO = 55) then
            SELECT ANPR_DTOFMONTO, ANPR_DTOFECHA, ANPR_TRM FROM ANTICIPOS_PROVEEDOR
                WHERE ANPR_ID = :ID INTO :DTOF, :FEC, :TRMDOC;
        if (TIPO = 21) then
            SELECT FACO_DTOFMONTO, FACO_DTOFFECHA, FACO_NUMPROV, FACO_TRM FROM FACTURAS_COMPRA
                WHERE FACO_ID = :ID INTO :DTOF, :FEC, :REFERENCIA, :TRMDOC;
        if (TIPO = 24) then
            SELECT 0, :FECHA FROM devoluciones_compras WHERE DVCO_ID = :ID INTO :DTOF, :FEC;
        if (FECHA > FEC) then
            DTOF = 0;
        if (DTOF IS NULL) then
            DTOF = 0;
        if (DTOF <> 0) then
            BEGIN
            if ((moneda <> 0) and (TRMDOC <> 0)) then
                DTOF = DTOF / :TRMDOC;
            if (MONEDA = 0) then
                SELECT SUM(EGDE_DTOF) FROM EGRESOS_DETALLE D, EGRESOS E
                    WHERE E.egre_id = D.egre_id AND EGDE_IDDOC = :ID AND EGDE_TIPODOC = :TIPO INTO :DTOAPL;
            else
                SELECT SUM(EGDE_DTOF/EGRE_TRM) FROM EGRESOS_DETALLE D, EGRESOS E
                    WHERE E.egre_id = D.egre_id AND EGDE_IDDOC = :ID AND EGDE_TIPODOC = :TIPO INTO :DTOAPL;
            if (DTOAPL IS NULL) then
                DTOAPL = 0;
            DTOF = DTOF - DTOAPL;
            END
        if (MONEDA = 0) then
            SELECT SUM(SDCP_RTEFTE - SDCP_ABRTFTE), SUM(SDCP_RTIVA - SDCP_ABRTIVA), SUM(SDCP_RTICA - SDCP_ABRTICA) FROM SALDOS_DOC_CXPAGAR WHERE SDCP_TIPOREF = :TIPO AND SDCP_IDREF = :ID INTO :RTFTE, :RTIVA, :RTICA;
        ELSE
            SELECT SUM((SDCP_RTEFTE-SDCP_ABRTFTE)/SDCP_TRM), SUM((SDCP_RTIVA-SDCP_ABRTIVA)/SDCP_TRM), SUM((SDCP_RTICA-SDCP_ABRTICA)/SDCP_TRM)
                FROM SALDOS_DOC_CXPAGAR WHERE SDCP_TIPOREF = :TIPO AND SDCP_IDREF = :ID INTO :RTFTE, :RTIVA, :RTICA;
        if (RTFTE IS NULL) then
            RTFTE = 0;
        if ((TIPO = 52) or (TIPO = 55) or (TIPO = 24)) THEN
            BEGIN
            if (RTFTE > 0) then
                RTFTE = 0;
            END
        ELSE
            BEGIN
            if (RTFTE < 0) then
                RTFTE = 0;
            END

        if (RTIVA IS NULL) then
            RTIVA = 0;
        if ((TIPO = 52) or (TIPO = 55) or (TIPO = 24)) THEN
            BEGIN
            if (RTIVA > 0) then
                RTIVA = 0;
            END
        ELSE
            BEGIN
            if (RTIVA < 0) then
                RTIVA = 0;
            END

        if (RTICA IS NULL) then
            RTICA = 0;
        if ((TIPO = 52) or (TIPO = 55) or (TIPO = 24)) THEN
            BEGIN
            if (RTICA > 0) then
                RTICA = 0;
            END
        ELSE
            BEGIN
            if (RTICA < 0) then
                RTICA = 0;
            END
        /* RESTE LAS RETENCIONES YA QUE SE SUGERIRAN */
        EXECUTE PROCEDURE LEE_CONFIGURACION('CXPAGAR', 'SALDOS', 'DESCONTAR RETENCIONES POR CAUSACION') returning_values (DESC_RTES);
        if (DESC_RTES = 'NO') then
            SALDO = SALDO - RTFTE - RTIVA - RTICA;
        SUSPEND;
        END
    END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER PROCEDURE IMPR_APLIPROV(
    ID INTEGER)
RETURNS (
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    CONCEPTO VARCHAR(60),
    NIT VARCHAR(20),
    NOMBRE VARCHAR(60),
    DIR VARCHAR(60),
    CIU VARCHAR(40),
    TEL VARCHAR(40),
    CONTACTO VARCHAR(60),
    FAX VARCHAR(25),
    CEL VARCHAR(25),
    EMAIL VARCHAR(100),
    ITEM INTEGER,
    TIPODOC VARCHAR(8),
    PREFDOC VARCHAR(4),
    NUMDOC VARCHAR(6),
    ABONO NUMERIC(18,2),
    RTFTEMONTO NUMERIC(18,2),
    RTIVAMONTO NUMERIC(18,2),
    RTICAMONTO NUMERIC(18,2),
    SALDODOC NUMERIC(18,2),
    ANTERDOC NUMERIC(18,2),
    OBS BLOB SUB_TYPE 1 SEGMENT SIZE 80,
    PROV_COD VARCHAR(15),
    PROV_CARTERA VARCHAR(60),
    PROV_CODIGOINT VARCHAR(15))
AS
declare variable TIPO INTEGER;
declare variable IDDOC INTEGER;
BEGIN
  FOR SELECT PREF_PRE, APPR_NUMERO, APPR_FECHA, APPR_CONC, P.TERC_NIT, TERC_NOM, TERC_DIR, TERC_CIU, TERC_TEL, TERC_CONTACTO, TERC_FAX, TERC_CEL, TERC_EMAIL,
    APPD_ITEM, APPD_TIPODOC, APPD_IDDOC, TIDO_NOMCORTO, APPD_PREFIJO, APPD_NUMERO, APPD_APLICADO,
    APPD_RTFTE, APPD_RTIVA, APPD_RTICA, APPR_OBS, PROV_COD, PROV_CARTERA, PROV_CODIGOINT
    FROM APLICACION_PROVEDOR P, APLICACION_PROVEEDOR_DETALLE PD, TERCEROS T, PROVEEDORES PR, TIPO_DOCUMENTO TD
    WHERE P.TERC_NIT = T.TERC_NIT AND T.TERC_NIT = PR.TERC_NIT AND P.APPR_ID = PD.APPR_ID AND P.APPR_ID = :ID AND APPD_TIPODOC = TD.TIDO_COD
    ORDER BY APPD_ITEM
    INTO :PREFIJO, :NUMERO, :FECHA, :CONCEPTO, :NIT, :NOMBRE, :DIR, :CIU, :TEL, :CONTACTO, :FAX, :CEL, :EMAIL, :ITEM, :TIPO, :IDDOC, :TIPODOC, :PREFDOC, :NUMDOC, :ABONO, :RTFTEMONTO, :RTIVAMONTO, :RTICAMONTO, :OBS, :PROV_COD, :PROV_CARTERA, :PROV_CODIGOINT
    DO
        begin
        EXECUTE PROCEDURE saldo_doc_cxpagar(:TIPO, :IDDOC, :FECHA, 0) returning_values (:SALDODOC);
        if (saldodoc IS NULL) then
            SALDODOC = 0;
        ANTERDOC = SALDODOC + rtftemonto + rtivamonto + rticamonto + abono;
        if (anterdoc IS NULL) then
            ANTERDOC = 0;
        SUSPEND;
        end
SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER PROCEDURE IMPR_EGRESO(
    ID INTEGER)
RETURNS (
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    NIT VARCHAR(20),
    NOMBRE VARCHAR(60),
    DIR VARCHAR(60),
    CIU VARCHAR(40),
    TEL VARCHAR(40),
    CONCEPTO VARCHAR(60),
    MONTO NUMERIC(18,2),
    RTFTE NUMERIC(18,2),
    RTIVA NUMERIC(18,2),
    RTICA NUMERIC(18,2),
    DSCTO NUMERIC(18,2),
    OBS BLOB SUB_TYPE 1 SEGMENT SIZE 80,
    ITEMDOC INTEGER,
    TIPODOC VARCHAR(8),
    PREFDOC VARCHAR(4),
    NUMDOC VARCHAR(6),
    NUMPRV VARCHAR(10),
    ABONODOC NUMERIC(18,2),
    RTFTEDOC NUMERIC(18,2),
    RTIVADOC NUMERIC(18,2),
    RTICADOC NUMERIC(18,2),
    DSCTODOC NUMERIC(18,2),
    SALDODOC NUMERIC(18,2),
    SALDOPROV NUMERIC(18,2),
    ANTERDOC NUMERIC(18,2))
AS
declare variable NUMROWS INTEGER;
declare variable TIPO integer;
declare variable IDDOC INTEGER;
BEGIN
  SELECT PREF_PRE, EGRE_NUMERO, EGRE_FECHA, EGRE_CONC,
        E.TERC_NIT, EGRE_NOMTERC, TERC_DIR, TERC_CIU, TERC_TEL,
        EGRE_MONTO, EGRE_RTFTEMONTO, EGRE_RTIVAMONTO, EGRE_RTICAMONTO, EGRE_DTOF,
        EGRE_OBS
    FROM EGRESOS E, TERCEROS T
    WHERE E.TERC_NIT = T.TERC_NIT AND E.EGRE_ID = :ID
    INTO :PREFIJO, :NUMERO, :FECHA, :CONCEPTO, 
        :NIT, :NOMBRE, :DIR, :CIU, :TEL,
        :MONTO, :RTFTE, :RTIVA, :RTICA, :DSCTO,
        :OBS;
  select SALDO from saldo_proveedor(:NIT, :FECHA+1) into :SALDOPROV;
  /*EXECUTE PROCEDURE saldo_proveedor(:NIT, (CAST('FECHA'+1 AS DATE))) returning_values (:SALDOPROV);*/
  SELECT COUNT(EGDE_ITEM) FROM EGRESOS_DETALLE
    WHERE EGRE_ID = :ID INTO :NUMROWS;
  if (NUMROWS > 0) then
    FOR SELECT EGDE_ITEM, EGDE_TIPODOC, TIDO_NOMCORTO, EGDE_IDDOC, EGDE_PREFIJO, EGDE_NUMERO, EGDE_ABONO, EGDE_RTFTE, EGDE_RTIVA, EGDE_RTICA, EGDE_DTOF
        FROM EGRESOS_DETALLE ED, TIPO_DOCUMENTO TD
        WHERE TD.TIDO_COD = ED.EGDE_TIPODOC AND ED.EGRE_ID = :ID
        order by egde_item
        INTO :ITEMDOC, :TIPO, :TIPODOC, :IDDOC, :PREFDOC, :NUMDOC, :ABONODOC, :RTFTEDOC, :RTIVADOC, :RTICADOC, :DSCTODOC
        DO
            BEGIN
            if (TIPO = 21) then
                SELECT FACO_NUMPROV FROM FACTURAS_COMPRA WHERE FACO_ID = :iddoc INTO :numprv;
            ELSE
                if (TIPO = 51) then
                    SELECT NDPR_NUMPROV FROM NOTAS_DEBITO_PROVEEDOR WHERE NDPR_ID = :iddoc INTO :numprv;
                ELSE
                    numprv = numdoc;
            EXECUTE PROCEDURE saldo_doc_cxpagar(:TIPO, :IDDOC, :FECHA, 0) returning_values (:SALDODOC);
            ANTERDOC = SALDODOC + RTFTEDOC + RTIVADOC + RTICADOC + ABONODOC + DSCTODOC;
            SUSPEND;
            END
  else
    BEGIN
    SALDOPROV = 0;
    ANTERDOC = 0;
    SALDODOC = 0;
    RTFTEDOC = 0;
    RTIVADOC = 0;
    RTICADOC = 0;
    ABONODOC = 0;
    DSCTODOC = 0;
    numprv = '';
    SUSPEND;
    END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER PROCEDURE REP_ANALISIS_CXPAGAR(
    DESDE VARCHAR(20),
    HASTA VARCHAR(20),
    GRPINI VARCHAR(5),
    GRPFIN VARCHAR(5),
    FECHA DATE,
    DETALLE CHAR(1),
    ORDEN CHAR(1),
    AGRUPA CHAR(1),
    DIASR INTEGER,
    MONEDA INTEGER)
RETURNS (
    NIT VARCHAR(20),
    NOMBRE VARCHAR(60),
    TELEFONO VARCHAR(40),
    CIUDAD VARCHAR(40),
    GRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(60),
    TIPO INTEGER,
    ID INTEGER,
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(6),
    DIAS INTEGER,
    SALDO NUMERIC(18,2),
    CORRIENTE NUMERIC(18,2),
    CERO NUMERIC(18,2),
    TREINTA NUMERIC(18,2),
    SESENTA NUMERIC(18,2),
    NOVENTA NUMERIC(18,2),
    TIPONOM VARCHAR(8),
    FECDOC DATE,
    VENCE DATE,
    NUMPROV VARCHAR(20))
AS
declare variable NITINI VARCHAR(20);
declare variable NITFIN VARCHAR(20);
declare variable NOMINI VARCHAR(20);
declare variable NOMFIN VARCHAR(20);
declare variable OK CHAR(1);
declare variable RTFTE NUMERIC(18,2);
declare variable RTIVA NUMERIC(18,2);
declare variable RTICA NUMERIC(18,2);
declare variable VENCIMIENTO VARCHAR(12);
BEGIN
if (ORDEN = 'C') then
    BEGIN
    NITINI = DESDE;
    NITFIN = HASTA;
    NOMINI = '';
    NOMFIN = 'zz';
    END
ELSE
    BEGIN
    NOMINI = DESDE;
    NOMFIN = HASTA;
    NITINI = '';
    NITFIN = 'zz';
    END
/* Ubique el NIT */
FOR select T.TERC_NIT, TERC_NOM,  TERC_TEL, TERC_CIU, GRPR_COD
    from terceros T, PROVEEDORES P
    where P.TERC_NIT = T.TERC_NIT AND TERC_PROV = 'S' AND T.TERC_NIT >= :NITINI AND T.TERC_NIT <= :NITFIN AND
        TERC_NOM >= :NOMINI AND TERC_NOM <= :NOMFIN
    INTO :NIT, :NOMBRE, :TELEFONO, :CIUDAD, :GRUPO
    DO  
    BEGIN
    SELECT GRPR_NOM FROM GRUPOS_PROVEEDORES WHERE GRPR_COD = :GRUPO INTO :NOMGRUPO;
    OK = 'N';
    if (AGRUPA = 'G') then
        BEGIN
        if (GRPINI = '') then
            BEGIN
            if ((GRUPO IS NULL) or (GRUPO >= :GRPINI AND GRUPO <= :GRPFIN)) then
                OK = 'S';
            END
        ELSE
            if (GRUPO >= :GRPINI AND GRUPO <= :GRPFIN) then
                OK = 'S';
        END
    if (AGRUPA = 'N') then
        OK = 'S';
    if (OK = 'S') then
        BEGIN
        CORRIENTE = 0;
        CERO = 0;
        TREINTA = 0;
        SESENTA = 0;
        NOVENTA = 0;
        /* BUSQUE EN SALDOS_DOC_CXPAGAR LOS QUE TENGAN SALDO > 0 */
        FOR SELECT MVPR_TIPOREF, MVPR_IDREF, MVPR_PREFIJO, MVPR_NUMERO, MVPR_FECHA, MVPR_VENCE
            FROM MOVIMIENTO_PROVEEDOR
            WHERE TERC_NIT = :NIT AND MVPR_FECHA <= :FECHA AND MVPR_ABONO = 'N' AND ((:MONEDA = 0) or (MVPR_TRM <> 1))
            INTO :TIPO, :ID, :PREFIJO, :NUMERO, :FECDOC, :VENCE
            DO
            BEGIN
            EXECUTE PROCEDURE saldo_doc_cxpagar(TIPO, ID, FECHA, MONEDA) returning_values (SALDO);
            if (SALDO <> 0) then
                BEGIN
                SELECT TIDO_NOMCORTO FROM TIPO_DOCUMENTO WHERE TIDO_COD = :TIPO INTO :TIPONOM;
                if (MONEDA = 0) then
                    SELECT SUM(SDCP_RTEFTE - SDCP_ABRTFTE), SUM(SDCP_RTIVA - SDCP_ABRTIVA), SUM(SDCP_RTICA - SDCP_ABRTICA)
                        FROM SALDOS_DOC_CXPAGAR WHERE SDCP_TIPOREF = :TIPO AND SDCP_IDREF = :ID
                        INTO :RTFTE, :RTIVA, :RTICA;
                else
                    SELECT SUM((SDCP_RTEFTE-SDCP_ABRTFTE)/SDCP_TRM), SUM((SDCP_RTIVA-SDCP_ABRTIVA)/SDCP_TRM), SUM((SDCP_RTICA-SDCP_ABRTICA)/SDCP_TRM)
                        FROM SALDOS_DOC_CXPAGAR WHERE SDCP_TIPOREF = :TIPO AND SDCP_IDREF = :ID
                        INTO :RTFTE, :RTIVA, :RTICA;
                if (RTFTE IS NULL) then
                    RTFTE = 0;
                if ((TIPO = 52) or (TIPO = 55) or (TIPO = 24)) THEN
                    BEGIN
                    if (RTFTE > 0) then
                        RTFTE = 0;
                    END
                ELSE
                    BEGIN
                    if (RTFTE < 0) then
                        RTFTE = 0;
                    END

                if (RTIVA IS NULL) then
                    RTIVA = 0;
                if ((TIPO = 52) or (TIPO = 55) or (TIPO = 24)) THEN
                    BEGIN
                    if (RTIVA > 0) then
                        RTIVA = 0;
                    END
                ELSE
                    BEGIN
                    if (RTIVA < 0) then
                        RTIVA = 0;
                    END

                if (RTICA IS NULL) then
                    RTICA = 0;
                if ((TIPO = 52) or (TIPO = 55) or (TIPO = 24)) THEN
                    BEGIN
                    if (RTICA > 0) then
                        RTICA = 0;
                    END
                ELSE
                    BEGIN
                    if (RTICA < 0) then
                        RTICA = 0;
                    END
                /* AHORA CLASIFIQUE LOS DIAS */
                if (DETALLE = 'S') then
                    BEGIN
                    CORRIENTE = 0;
                    CERO = 0;
                    TREINTA = 0;
                    SESENTA = 0;
                    NOVENTA = 0;
                    END
                EXECUTE PROCEDURE LEE_CONFIGURACION('CXPAGAR', 'SALDOS', 'ANALISIS DE CXPAGAR CON FECHA FACTURA O VENCIMIENTO') returning_values (VENCIMIENTO);
                if (VENCIMIENTO = 'FECHA') then
                    DIAS = FECHA - FECDOC;
                ELSE
                    DIAS = FECHA - VENCE;
                if (DIAS < 0) then
                    CORRIENTE = CORRIENTE + SALDO;
                ELSE
                    if (DIAS < DIASR) then
                        CERO = CERO + SALDO;
                    ELSE
                        if (DIAS < (DIASR * 2)) then
                            TREINTA = TREINTA + SALDO;
                        ELSE
                            if (DIAS < (DIASR * 3)) then
                                SESENTA = SESENTA + SALDO;
                            ELSE
                                NOVENTA = NOVENTA + SALDO;
                if (DETALLE = 'S') then
                    BEGIN
                    if (TIPO = 51) then
                        SELECT NDPR_NUMPROV FROM NOTAS_DEBITO_PROVEEDOR WHERE NDPR_ID = :ID INTO :NUMPROV;
                    ELSE
                        if (TIPO = 21) then
                            SELECT FACO_NUMPROV FROM FACTURAS_COMPRA WHERE FACO_ID = :ID INTO :NUMPROV;
                        ELSE
                            NUMPROV = '';
                    SUSPEND;
                    END
                END /* SALDO <> 0 */
            END /* FOR MVPR */
        if (DETALLE = 'N') then
            begin
            SALDO = CORRIENTE + CERO + TREINTA + SESENTA + NOVENTA;
            SUSPEND;
            end
        END /* OK */
    END /* FOR NIT */
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER PROCEDURE REP_CXPAGAR_CONSOLIDADAS(
    DESDE VARCHAR(20),
    HASTA VARCHAR(20),
    GRPINI VARCHAR(5),
    GRPFIN VARCHAR(5),
    FECHA DATE,
    ORDEN CHAR(1),
    AGRUPA CHAR(1),
    MONEDA INTEGER)
RETURNS (
    NIT VARCHAR(20),
    NOMBRE VARCHAR(60),
    TELEFONO VARCHAR(40),
    CIUDAD VARCHAR(40),
    CODZONA VARCHAR(2),
    NOMZONA VARCHAR(60),
    DV CHAR(1),
    CODCIUD CHAR(5),
    NOMCIUD VARCHAR(60),
    SALDO NUMERIC(18,2),
    RTFTE NUMERIC(18,2),
    RTIVA NUMERIC(18,2),
    RTICA NUMERIC(18,2),
    DTOF NUMERIC(18,2))
AS
declare variable NITINI VARCHAR(20);
declare variable NITFIN VARCHAR(20);
declare variable NOMINI VARCHAR(20);
declare variable NOMFIN VARCHAR(20);
declare variable OK CHAR(1);
declare variable PSALDO NUMERIC(18,2);
declare variable PRTFTE NUMERIC(18,2);
declare variable PRTIVA NUMERIC(18,2);
declare variable PRTICA NUMERIC(18,2);
declare variable PDTOF NUMERIC(18,2);
declare variable TIPO INTEGER;
declare variable ID INTEGER;
declare variable DTOAPL NUMERIC(18,2);
declare variable TRM NUMERIC(18,2);
BEGIN
if (ORDEN = 'C') then
    BEGIN
    NITINI = DESDE;
    NITFIN = HASTA;
    NOMINI = '';
    NOMFIN = 'zz';
    END
ELSE
    BEGIN
    NOMINI = DESDE;
    NOMFIN = HASTA;
    NITINI = '';
    NITFIN = 'zz';
    END
  /* Ubique el NIT */
  FOR select T.TERC_NIT, TERC_NOM, TERC_DV, TERC_TEL, TERC_CIU, GRPR_COD, CIUD_COD
    from terceros T, PROVEEDORES P
    where P.TERC_NIT = T.TERC_NIT AND TERC_PROV = 'S' AND T.TERC_NIT >= :NITINI AND T.TERC_NIT <= :NITFIN AND
        TERC_NOM >= :NOMINI AND TERC_NOM <= :NOMFIN
    INTO :NIT, :NOMBRE, :DV, :TELEFONO, :CIUDAD, :CODZONA, :CODCIUD
    DO  
    BEGIN
    OK = 'N';
    if (AGRUPA = 'G') then
        BEGIN
        if (GRPINI = '') then
            BEGIN
            if ((CODZONA IS NULL) or (CODZONA >= :GRPINI AND CODZONA <= :GRPFIN)) then
                OK = 'S';
            END
        ELSE
            if (CODZONA >= :GRPINI AND CODZONA <= :GRPFIN) then
                OK = 'S';
        END
    if (AGRUPA = 'N') then
        OK = 'S';
        
    if (OK = 'S') then
        BEGIN
        SELECT GRPR_NOM FROM GRUPOS_PROVEEDORES WHERE GRPR_COD = :CODZONA INTO :NOMZONA;
        SELECT CIUD_NOM FROM CIUDADES WHERE CIUD_COD = :CODCIUD INTO :NOMCIUD;
        SALDO = 0;
        RTFTE = 0;
        RTIVA = 0;
        RTICA = 0;
        DTOF = 0;
        /* BUSQUE EN SALDOS_DOC_CXPAGAR LOS QUE TENGAN SALDO > 0 */
        FOR SELECT MVPR_TIPOREF, MVPR_IDREF
          FROM MOVIMIENTO_PROVEEDOR
          WHERE TERC_NIT = :NIT AND MVPR_FECHA <= :FECHA AND MVPR_ABONO = 'N' AND ((:MONEDA = 0) or (MVPR_TRM <> 1))
          INTO :TIPO, :ID
          DO
            BEGIN
            EXECUTE PROCEDURE saldo_doc_cxpagar(TIPO, ID, FECHA, MONEDA) returning_values (PSALDO);
            if (PSALDO <> 0) then
                BEGIN
                if (TIPO = 51) then
                    SELECT NDPR_DTOFMONTO, NDPR_TRM FROM NOTAS_DEBITO_PROVEEDOR
                        WHERE NDPR_ID = :ID INTO :PDTOF, :TRM;
                if (TIPO = 52) then
                    SELECT 0, 1 FROM NOTAS_CREDITO_PROVEEDOR WHERE NCPR_ID = :ID INTO :PDTOF, :TRM;
                if (TIPO = 55) then
                    SELECT ANPR_DTOFMONTO, ANPR_TRM FROM ANTICIPOS_PROVEEDOR WHERE ANPR_ID = :ID INTO :PDTOF, :TRM;
                if (TIPO = 21) then
                    SELECT 0, 1 FROM FACTURAS_COMPRA WHERE FACO_ID = :ID INTO :PDTOF, :TRM;
                if (TIPO = 24) then
                    SELECT 0, 1 FROM devoluciones_compras WHERE DVCO_ID = :ID INTO :PDTOF, :TRM;
                if (DTOF IS NULL) then
                    DTOF = 0;
                if (DTOF <> 0) then
                    BEGIN
                    if ((MONEDA <> 0) AND (TRM <> 0)) then
                        DTOF = DTOF / TRM;
                    if (MONEDA = 0) then
                        SELECT SUM(EGDE_DTOF) FROM EGRESOS_DETALLE WHERE EGDE_IDDOC = :ID AND EGDE_TIPODOC = :TIPO INTO :DTOAPL;
                    else
                        SELECT SUM(EGDE_DTOF/EGRE_TRM) FROM EGRESOS_DETALLE D, EGRESOS E
                            WHERE E.egre_id = D.egre_id AND EGDE_IDDOC = :ID AND EGDE_TIPODOC = :TIPO INTO :DTOAPL;
                    if (DTOAPL IS NULL) then
                        DTOAPL = 0;
                    DTOF = DTOF - DTOAPL;
                    END
                if (MONEDA = 0) then
                    SELECT SUM(SDCP_RTEFTE - SDCP_ABRTFTE), SUM(SDCP_RTIVA - SDCP_ABRTIVA), SUM(SDCP_RTICA - SDCP_ABRTICA)
                        FROM SALDOS_DOC_CXPAGAR WHERE SDCP_TIPOREF = :TIPO AND SDCP_IDREF = :ID INTO :PRTFTE, :PRTIVA, :PRTICA;
                else
                    SELECT SUM((SDCP_RTEFTE-SDCP_ABRTFTE)/SDCP_TRM), SUM((SDCP_RTIVA-SDCP_ABRTIVA)/SDCP_TRM), SUM((SDCP_RTICA-SDCP_ABRTICA)/SDCP_TRM)
                        FROM SALDOS_DOC_CXPAGAR WHERE SDCP_TIPOREF = :TIPO AND SDCP_IDREF = :ID INTO :PRTFTE, :PRTIVA, :PRTICA;
                if (PRTFTE IS NULL) then
                    PRTFTE = 0;
                if ((TIPO = 52) or (TIPO = 55) or (TIPO = 24)) THEN
                    BEGIN
                    if (RTFTE > 0) then
                        RTFTE = 0;
                    END
                ELSE
                    BEGIN
                    if (RTFTE < 0) then
                        RTFTE = 0;
                    END
                if (PRTIVA IS NULL) then
                    PRTIVA = 0;
                if ((TIPO = 52) or (TIPO = 55) or (TIPO = 24)) THEN
                    BEGIN
                    if (RTIVA > 0) then
                        RTIVA = 0;
                    END
                ELSE
                    BEGIN
                    if (RTIVA < 0) then
                        RTIVA = 0;
                    END
                if (PRTICA IS NULL) then
                    PRTICA = 0;
                if ((TIPO = 52) or (TIPO = 55) or (TIPO = 24)) THEN
                    BEGIN
                    if (PRTICA > 0) then
                        PRTICA = 0;
                    END
                ELSE
                    BEGIN
                    if (PRTICA < 0) then
                        PRTICA = 0;
                    END
                SALDO = SALDO + PSALDO;
                RTFTE = RTFTE + PRTFTE;
                RTIVA = RTIVA + PRTIVA;
                RTICA = RTICA + PRTICA;
                DTOF = DTOF + PDTOF;
                END
            END
        SUSPEND;
        END
    END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER PROCEDURE REP_CXPAGAR_PROVEEDOR(
    DESDE VARCHAR(20),
    HASTA VARCHAR(20),
    GRPINI VARCHAR(5),
    GRPFIN VARCHAR(5),
    FECHA DATE,
    ORDEN CHAR(1),
    AGRUPA CHAR(1),
    MONEDA INTEGER)
RETURNS (
    NIT VARCHAR(20),
    NOMBRE VARCHAR(60),
    TELEFONO VARCHAR(40),
    CIUDAD VARCHAR(40),
    CODZONA VARCHAR(2),
    NOMZONA VARCHAR(60),
    DV CHAR(1),
    CODCIUD CHAR(5),
    NOMCIUD VARCHAR(60),
    TIPO INTEGER,
    ID INTEGER,
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(6),
    CONCEPTO VARCHAR(60),
    SALDO NUMERIC(18,2),
    RTFTE NUMERIC(18,2),
    RTIVA NUMERIC(18,2),
    RTICA NUMERIC(18,2),
    DTOF NUMERIC(18,2),
    TIPONOM VARCHAR(8),
    FECDOC DATE,
    VENCE DATE,
    DIAS INTEGER,
    NUMPROV VARCHAR(20))
AS
declare variable NITINI VARCHAR(20);
declare variable NITFIN VARCHAR(20);
declare variable NOMINI VARCHAR(20);
declare variable NOMFIN VARCHAR(20);
declare variable OK CHAR(1);
declare variable DTOAPL NUMERIC(18,2);
declare variable FOV CHAR(12);
declare variable TRM NUMERIC(18,2);
BEGIN
if (ORDEN = 'C') then
    BEGIN
    NITINI = DESDE;
    NITFIN = HASTA;
    NOMINI = '';
    NOMFIN = 'zz';
    END
ELSE
    BEGIN
    NOMINI = DESDE;
    NOMFIN = HASTA;
    NITINI = '';
    NITFIN = 'zz';
    END
  /* Ubique el NIT */
  FOR select T.TERC_NIT, TERC_NOM, TERC_DV, TERC_TEL, TERC_CIU, P.GRPR_COD, T.CIUD_COD
    from terceros T, PROVEEDORES P 
    where P.TERC_NIT = T.TERC_NIT AND TERC_PROV = 'S' AND T.TERC_NIT >= :NITINI AND T.TERC_NIT <= :NITFIN AND
        TERC_NOM >= :NOMINI AND TERC_NOM <= :NOMFIN
    INTO :NIT, :NOMBRE, :DV, :TELEFONO, :CIUDAD, :CODZONA, :CODCIUD
    DO  
    BEGIN
    select GRPR_NOM from GRUPOS_PROVEEDORES where GRPR_COD = :codzona into :NOMZONA;
    select CIUD_NOM from CIUDADES where CIUD_COD = :codciud into :NOMCIUD;
    OK = 'N';
    if (AGRUPA = 'G') then
        BEGIN
        if (GRPINI = '') then
            BEGIN
            if ((CODZONA IS NULL) or (CODZONA >= :GRPINI AND CODZONA <= :GRPFIN)) then
                OK = 'S';
            END
        ELSE
            if (CODZONA >= :GRPINI AND CODZONA <= :GRPFIN) then
                OK = 'S';
        END
    if (AGRUPA = 'C') then
        BEGIN
        if (GRPINI = '') then
            BEGIN
            if ((CODCIUD IS NULL) or (CODCIUD >= :GRPINI AND CODCIUD <= :GRPFIN)) then
                OK = 'S';
            END
        ELSE
            if (CODCIUD >= :GRPINI AND CODCIUD <= :GRPFIN) then
                OK = 'S';
        END
    if (AGRUPA = 'N') then
        OK = 'S';
        
    if (OK = 'S') then
        BEGIN
        /* BUSQUE EN SALDOS_DOC_CXPAGAR LOS QUE TENGAN SALDO > 0 */
        FOR SELECT MVPR_TIPOREF, MVPR_IDREF, MVPR_PREFIJO, MVPR_NUMERO, MVPR_FECHA, MVPR_VENCE, MVPR_CONC
            FROM MOVIMIENTO_PROVEEDOR
            WHERE TERC_NIT = :NIT AND MVPR_FECHA <= :FECHA AND MVPR_ABONO = 'N' AND ((:MONEDA = 0) or (MVPR_TRM <> 1))
            INTO :TIPO, :ID, :PREFIJO, :NUMERO, :FECDOC, :VENCE, :CONCEPTO
            DO
            BEGIN
            EXECUTE PROCEDURE LEE_CONFIGURACION('CXPAGAR', 'SALDOS', 'ANALISIS DE CXPAGAR CON FECHA FACTURA O VENCIMIENTO') RETURNING_VALUES (FOV);
            if (FOV = 'FECHA') then
                DIAS = FECHA - FECDOC;
            ELSE
                DIAS = FECHA - VENCE;
            EXECUTE PROCEDURE saldo_doc_cxpagar(TIPO, ID, FECHA, MONEDA) returning_values (SALDO);
            if (SALDO <> 0) then
                BEGIN
                SELECT TIDO_NOMCORTO FROM TIPO_DOCUMENTO WHERE TIDO_COD = :TIPO INTO :TIPONOM;
                if (TIPO = 51) then
                    SELECT NDPR_DTOFMONTO, NDPR_NUMPROV, NDPR_TRM FROM NOTAS_DEBITO_PROVEEDOR
                        WHERE NDPR_ID = :ID INTO :DTOF, :NUMPROV, :TRM;
                if (TIPO = 52) then
                    SELECT 0, '', 1 FROM NOTAS_CREDITO_PROVEEDOR WHERE NCPR_ID = :ID INTO :DTOF, :NUMPROV, :TRM;
                if (TIPO = 55) then
                    SELECT ANPR_DTOFMONTO, '', ANPR_TRM FROM ANTICIPOS_PROVEEDOR WHERE ANPR_ID = :ID INTO :DTOF, :NUMPROV, :TRM;
                if (TIPO = 21) then
                    SELECT FACO_DTOFMONTO, FACO_NUMPROV, FACO_TRM FROM FACTURAS_COMPRA WHERE FACO_ID = :ID INTO :DTOF, :NUMPROV, :TRM;
                if (TIPO = 24) then
                    SELECT 0, '', 1 FROM devoluciones_compras WHERE DVCO_ID = :ID INTO :DTOF, :NUMPROV, :TRM;
                if (DTOF IS NULL) then
                    DTOF = 0;
                if (DTOF <> 0) then
                    BEGIN
                    if ((MONEDA <> 0) AND (TRM <> 0)) then
                        DTOF = DTOF / TRM;
                    if (MONEDA = 0) then
                        SELECT SUM(EGDE_DTOF) FROM EGRESOS_DETALLE WHERE EGDE_IDDOC = :ID AND EGDE_TIPODOC = :TIPO INTO :DTOAPL;
                    else
                        SELECT SUM(EGDE_DTOF/EGRE_TRM) FROM EGRESOS_DETALLE D, EGRESOS E
                            WHERE E.egre_id = D.egre_id AND EGDE_IDDOC = :ID AND EGDE_TIPODOC = :TIPO INTO :DTOAPL;

                    if (DTOAPL IS NULL) then
                        DTOAPL = 0;
                    DTOF = DTOF - DTOAPL;
                    END
                if (MONEDA = 0) then
                    SELECT SUM(SDCP_RTEFTE-SDCP_ABRTFTE), SUM(SDCP_RTIVA-SDCP_ABRTIVA), SUM(SDCP_RTICA-SDCP_ABRTICA)
                        FROM SALDOS_DOC_CXPAGAR WHERE SDCP_TIPOREF = :TIPO AND SDCP_IDREF = :ID INTO :RTFTE, :RTIVA, :RTICA;
                else
                    SELECT SUM((SDCP_RTEFTE-SDCP_ABRTFTE)/SDCP_TRM), SUM((SDCP_RTIVA-SDCP_ABRTIVA)/SDCP_TRM), SUM((SDCP_RTICA-SDCP_ABRTICA)/SDCP_TRM)
                        FROM SALDOS_DOC_CXPAGAR WHERE SDCP_TIPOREF = :TIPO AND SDCP_IDREF = :ID INTO :RTFTE, :RTIVA, :RTICA;
                if (RTFTE IS NULL) then
                    RTFTE = 0;
                if ((TIPO = 52) or (TIPO = 55) or (TIPO = 24)) THEN
                    BEGIN
                    if (RTFTE > 0) then
                        RTFTE = 0;
                    END
                ELSE
                    BEGIN
                    if (RTFTE < 0) then
                        RTFTE = 0;
                    END

                if (RTIVA IS NULL) then
                    RTIVA = 0;
                if ((TIPO = 52) or (TIPO = 55) or (TIPO = 24)) THEN
                    BEGIN
                    if (RTIVA > 0) then
                        RTIVA = 0;
                    END
                ELSE
                    BEGIN
                    if (RTIVA < 0) then
                        RTIVA = 0;
                    END

                if (RTICA IS NULL) then
                    RTICA = 0;
                if ((TIPO = 52) or (TIPO = 55) or (TIPO = 24)) THEN
                    BEGIN
                    if (RTICA > 0) then
                        RTICA = 0;
                    END
                ELSE
                    BEGIN
                    if (RTICA < 0) then
                        RTICA = 0;
                    END
                SUSPEND;
                END
            END
        END
    END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER PROCEDURE CONCILIA_CXPAGAR(
    FECINI DATE,
    FECFIN DATE,
    CTACART VARCHAR(20),
    SUBEMPRESA INTEGER,
    ANTERIOR CHAR(1))
RETURNS (
    NIT VARCHAR(20),
    NOMBRE VARCHAR(60),
    INICIAL NUMERIC(18,2),
    INICIALC NUMERIC(18,2),
    DEBITOS NUMERIC(18,2),
    DEBITOSC NUMERIC(18,2),
    CREDITOS NUMERIC(18,2),
    CREDITOSC NUMERIC(18,2),
    SALDO NUMERIC(18,2),
    SALDOC NUMERIC(18,2),
    DIFERENCIA NUMERIC(18,2))
AS
declare variable ANO CHAR(4);
declare variable MES INTEGER;
declare variable ABONOS NUMERIC(18,2);
declare variable RETES CHAR(2);
begin
ano = EXTRACT(YEAR FROM FECFIN);
mes = EXTRACT(MONTH FROM FECFIN);

for select TERC_NIT, TERC_NOM from TERCEROS WHERE TERC_PROV = 'S' into :NIT, :NOMBRE
    DO
    BEGIN
/*    EXECUTE PROCEDURE saldo_proveedor (NIT, FECINI) returning_values (INICIAL); */
    EXECUTE PROCEDURE LEE_CONFIGURACION('CXPAGAR', 'SALDOS', 'DESCONTAR RETENCIONES POR CAUSACION') returning_values(:RETES);
    if (RETES = 'SI') then
        BEGIN
        SELECT SUM(MVPR_MONTO-MVPR_RTFTE-MVPR_RTIVA-MVPR_RTICA)
            FROM movimiento_proveedor
            WHERE TERC_NIT = :NIT AND MVPR_FECHA >= :FECINI AND MVPR_FECHA < :FECFIN AND MVPR_DEBITO = 'S'
            INTO :DEBITOS;
        SELECT SUM(MVPR_MONTO-MVPR_RTFTE-MVPR_RTIVA-MVPR_RTICA)
            FROM movimiento_proveedor
            WHERE TERC_NIT = :NIT AND MVPR_FECHA >= :FECINI AND MVPR_FECHA < :FECFIN AND MVPR_DEBITO = 'N' AND MVPR_ABONO = 'N' and MVPR_TIPOREF <> 55
            INTO :CREDITOS;
        SELECT SUM(MVPR_MONTO) FROM movimiento_proveedor
            WHERE TERC_NIT = :NIT AND MVPR_FECHA >= :FECINI AND MVPR_FECHA < :FECFIN AND MVPR_ABONO = 'S'
            INTO :ABONOS;
        END
    ELSE
        BEGIN
        SELECT SUM(MVPR_MONTO)
            FROM movimiento_proveedor
            WHERE TERC_NIT = :NIT AND MVPR_FECHA >= :FECINI AND MVPR_FECHA < :FECFIN AND MVPR_DEBITO = 'S'
            INTO :DEBITOS;
        SELECT SUM(MVPR_MONTO)
            FROM movimiento_proveedor
            WHERE TERC_NIT = :NIT AND MVPR_FECHA >= :FECINI AND MVPR_FECHA < :FECFIN AND MVPR_DEBITO = 'N' AND MVPR_ABONO = 'N' AND MVPR_TIPOREF <> 55
            INTO :CREDITOS;
        SELECT SUM(MVPR_MONTO+MVPR_RTFTE+MVPR_RTIVA+MVPR_RTICA)
            FROM movimiento_proveedor
            WHERE TERC_NIT = :NIT AND MVPR_FECHA >= :FECINI AND MVPR_FECHA < :FECFIN AND MVPR_ABONO = 'S'
            INTO :ABONOS;
        END
    if (DEBITOS IS NULL) then
        DEBITOS = 0;
    if (CREDITOS IS NULL) then
        CREDITOS = 0;
    if (ABONOS IS NULL) then
        ABONOS = 0;
    CREDITOS = CREDITOS + ABONOS;
    SALDO = INICIAL + DEBITOS - CREDITOS;

    /* LO CONTABLE */
    EXECUTE PROCEDURE SALDO_TERCERO_MES(ctacart, NIT, ANO, MES, 'S') RETURNING_VALUES (INICIALC);
    EXECUTE PROCEDURE MOVIMIENTO_TERCERO_MES(ctacart, NIT, ANO, MES, 'S') RETURNING_VALUES(DEBITOSC);
    EXECUTE PROCEDURE MOVIMIENTO_TERCERO_MES(ctacart, NIT, ANO, MES, 'N') RETURNING_VALUES(CREDITOSC);
    SALDOC = INICIALC + DEBITOSC - CREDITOSC;
    diferencia = SALDO + SALDOC;
    if (DIFERENCIA <> 0) then
        BEGIN
        if (ANTERIOR <> 'S') then
            SUSPEND;
        ELSE
            BEGIN
            if (DIFERENCIA <> (INICIAL + INICIALC)) then
                SUSPEND;
            END
        END
    END
end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER PROCEDURE IMPR_EGRESO(
    ID INTEGER)
RETURNS (
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    NIT VARCHAR(20),
    NOMBRE VARCHAR(60),
    DIR VARCHAR(60),
    CIU VARCHAR(40),
    TEL VARCHAR(40),
    CONCEPTO VARCHAR(60),
    MONTO NUMERIC(18,2),
    RTFTE NUMERIC(18,2),
    RTIVA NUMERIC(18,2),
    RTICA NUMERIC(18,2),
    DSCTO NUMERIC(18,2),
    OBS BLOB SUB_TYPE 1 SEGMENT SIZE 80,
    ITEMDOC INTEGER,
    TIPODOC VARCHAR(8),
    PREFDOC VARCHAR(4),
    NUMDOC VARCHAR(6),
    NUMPRV VARCHAR(10),
    ABONODOC NUMERIC(18,2),
    RTFTEDOC NUMERIC(18,2),
    RTIVADOC NUMERIC(18,2),
    RTICADOC NUMERIC(18,2),
    DSCTODOC NUMERIC(18,2),
    SALDODOC NUMERIC(18,2),
    SALDOPROV NUMERIC(18,2),
    ANTERDOC NUMERIC(18,2))
AS
declare variable NUMROWS INTEGER;
declare variable TIPO integer;
declare variable IDDOC INTEGER;
BEGIN
  SELECT PREF_PRE, EGRE_NUMERO, EGRE_FECHA, EGRE_CONC,
        E.TERC_NIT, EGRE_NOMTERC, TERC_DIR, TERC_CIU, TERC_TEL,
        EGRE_MONTO, EGRE_RTFTEMONTO, EGRE_RTIVAMONTO, EGRE_RTICAMONTO, EGRE_DTOF,
        EGRE_OBS
    FROM EGRESOS E, TERCEROS T
    WHERE E.TERC_NIT = T.TERC_NIT AND E.EGRE_ID = :ID
    INTO :PREFIJO, :NUMERO, :FECHA, :CONCEPTO, 
        :NIT, :NOMBRE, :DIR, :CIU, :TEL,
        :MONTO, :RTFTE, :RTIVA, :RTICA, :DSCTO,
        :OBS;
/*  select SALDO from saldo_proveedor(:NIT, :FECHA+1) into :SALDOPROV;*/
  /*EXECUTE PROCEDURE saldo_proveedor(:NIT, (CAST('FECHA'+1 AS DATE))) returning_values (:SALDOPROV);*/
  SELECT COUNT(EGDE_ITEM) FROM EGRESOS_DETALLE
    WHERE EGRE_ID = :ID INTO :NUMROWS;
  if (NUMROWS > 0) then
    FOR SELECT EGDE_ITEM, EGDE_TIPODOC, TIDO_NOMCORTO, EGDE_IDDOC, EGDE_PREFIJO, EGDE_NUMERO, EGDE_ABONO, EGDE_RTFTE, EGDE_RTIVA, EGDE_RTICA, EGDE_DTOF
        FROM EGRESOS_DETALLE ED, TIPO_DOCUMENTO TD
        WHERE TD.TIDO_COD = ED.EGDE_TIPODOC AND ED.EGRE_ID = :ID
        order by egde_item
        INTO :ITEMDOC, :TIPO, :TIPODOC, :IDDOC, :PREFDOC, :NUMDOC, :ABONODOC, :RTFTEDOC, :RTIVADOC, :RTICADOC, :DSCTODOC
        DO
            BEGIN
            if (TIPO = 21) then
                SELECT FACO_NUMPROV FROM FACTURAS_COMPRA WHERE FACO_ID = :iddoc INTO :numprv;
            ELSE
                if (TIPO = 51) then
                    SELECT NDPR_NUMPROV FROM NOTAS_DEBITO_PROVEEDOR WHERE NDPR_ID = :iddoc INTO :numprv;
                ELSE
                    numprv = numdoc;
            EXECUTE PROCEDURE saldo_doc_cxpagar(:TIPO, :IDDOC, :FECHA, 0) returning_values (:SALDODOC);
            ANTERDOC = SALDODOC + RTFTEDOC + RTIVADOC + RTICADOC + ABONODOC + DSCTODOC;
            SUSPEND;
            END
  else
    BEGIN
    SALDOPROV = 0;
    ANTERDOC = 0;
    SALDODOC = 0;
    RTFTEDOC = 0;
    RTIVADOC = 0;
    RTICADOC = 0;
    ABONODOC = 0;
    DSCTODOC = 0;
    numprv = '';
    SUSPEND;
    END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER PROCEDURE MOVIMIENTO_CXPAGAR_DESDE_HASTA(
    NIT VARCHAR(20),
    DESDE DATE,
    HASTA DATE)
RETURNS (
    INICIAL NUMERIC(18,2),
    TIPODOC VARCHAR(8),
    IDDOC INTEGER,
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    CONCEPTO VARCHAR(60),
    DEBITO NUMERIC(18,2),
    CREDITO NUMERIC(18,2),
    SALDO NUMERIC(18,2),
    NOMBRE VARCHAR(60),
    RTFTE NUMERIC(18,2),
    RTIVA NUMERIC(18,2),
    RTICA NUMERIC(18,2),
    NUMPROV VARCHAR(20))
AS
declare variable DB CHAR(1);
declare variable AB CHAR(1);
declare variable RETES CHAR(2);
BEGIN
  /* Ubique el NIT */
  select terc_nom from terceros where terc_nit = :NIT INTO :NOMBRE;
  /*execute procedure saldo_proveedor (NIT, DESDE) returning_values (INICIAL);*/
  if (INICIAL is null) then
    INICIAL = 0;
  SALDO = INICIAL;
  EXECUTE PROCEDURE LEE_CONFIGURACION('CXPAGAR', 'SALDOS', 'DESCONTAR RETENCIONES POR CAUSACION') returning_values(:RETES);
  FOR select tido_nomcorto, mvpr_idref, mvpr_prefijo, mvpr_numero, mvpr_fecha, mvpr_conc, mvpr_monto, mvpr_debito, mvpr_rtfte, mvpr_rtiva, mvpr_rtica, mvpr_abono
    from movimiento_proveedor m, tipo_documento t
    where m.mvpr_tiporef = t.tido_cod and terc_nit = :NIT and mvpr_fecha >= :DESDE and mvpr_fecha <= :HASTA AND mvpr_tiporef <> 55
    order by mvpr_fecha, mvpr_tiporef
    into :TIPODOC, :IDDOC, :PREFIJO, :NUMERO, :FECHA, :CONCEPTO, :DEBITO, :DB, :RTFTE, :RTIVA, :RTICA, :AB
    DO
    BEGIN
    if (DB = 'N') then
        BEGIN
        if (AB = 'S') then
            if (RETES = 'SI') then
                CREDITO = DEBITO;
            ELSE
                CREDITO = DEBITO + RTFTE + RTIVA + RTICA;
        ELSE
            if (RETES = 'SI') then
                CREDITO = DEBITO - RTFTE - RTIVA - RTICA;
            ELSE
                CREDITO = DEBITO;
        DEBITO = 0;
        END
    ELSE
        BEGIN
        if (RETES = 'SI') then
            DEBITO = DEBITO - RTFTE - RTIVA - RTICA;
        CREDITO = 0;
        END
    SALDO = SALDO + DEBITO - CREDITO;
    NUMPROV = '';
    if (TIPODOC = 'CARGOACR') then
        SELECT NDPR_NUMPROV FROM NOTAS_DEBITO_PROVEEDOR WHERE NDPR_ID = :IDDOC INTO :NUMPROV;
    if (TIPODOC = 'FACTCOMP') then
        SELECT FACO_NUMPROV FROM FACTURAS_COMPRA WHERE FACO_ID = :IDDOC INTO :NUMPROV;
    SUSPEND;
    END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER PROCEDURE MOVIMIENTO_CXPAGAR_MES(
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    NIT VARCHAR(20),
    NOMBRE VARCHAR(60),
    INICIAL NUMERIC(18,4),
    DEBITOS NUMERIC(18,4),
    CREDITOS NUMERIC(18,4),
    ABONOS NUMERIC(18,4),
    FINAL NUMERIC(18,4))
AS
declare variable RETES CHAR(2);
BEGIN
  for select TERC_NIT, TERC_NOM from TERCEROS WHERE TERC_PROV = 'S' into :NIT, :NOMBRE
  DO
    BEGIN
/*    EXECUTE PROCEDURE saldo_proveedor (NIT, FECINI) returning_values (INICIAL);*/
    EXECUTE PROCEDURE LEE_CONFIGURACION('CXPAGAR', 'SALDOS', 'DESCONTAR RETENCIONES POR CAUSACION') returning_values(:RETES);
    if (RETES = 'SI') then
        BEGIN
        SELECT SUM(MVPR_MONTO-MVPR_RTFTE-MVPR_RTIVA-MVPR_RTICA)
            FROM movimiento_proveedor
            WHERE TERC_NIT = :NIT AND MVPR_FECHA >= :FECINI AND MVPR_FECHA < :FECFIN AND MVPR_DEBITO = 'S'
            INTO :DEBITOS;
        SELECT SUM(MVPR_MONTO-MVPR_RTFTE-MVPR_RTIVA-MVPR_RTICA)
            FROM movimiento_proveedor
            WHERE TERC_NIT = :NIT AND MVPR_FECHA >= :FECINI AND MVPR_FECHA < :FECFIN AND MVPR_DEBITO = 'N' AND MVPR_ABONO = 'N' and MVPR_TIPOREF <> 55
            INTO :CREDITOS;
        SELECT SUM(MVPR_MONTO) FROM movimiento_proveedor
            WHERE TERC_NIT = :NIT AND MVPR_FECHA >= :FECINI AND MVPR_FECHA < :FECFIN AND MVPR_ABONO = 'S'
            INTO :ABONOS;
        END
    ELSE
        BEGIN
        SELECT SUM(MVPR_MONTO)
            FROM movimiento_proveedor
            WHERE TERC_NIT = :NIT AND MVPR_FECHA >= :FECINI AND MVPR_FECHA < :FECFIN AND MVPR_DEBITO = 'S'
            INTO :DEBITOS;
        SELECT SUM(MVPR_MONTO)
            FROM movimiento_proveedor
            WHERE TERC_NIT = :NIT AND MVPR_FECHA >= :FECINI AND MVPR_FECHA < :FECFIN AND MVPR_DEBITO = 'N' AND MVPR_ABONO = 'N' AND MVPR_TIPOREF <> 55
            INTO :CREDITOS;
        SELECT SUM(MVPR_MONTO+MVPR_RTFTE+MVPR_RTIVA+MVPR_RTICA)
            FROM movimiento_proveedor
            WHERE TERC_NIT = :NIT AND MVPR_FECHA >= :FECINI AND MVPR_FECHA < :FECFIN AND MVPR_ABONO = 'S'
            INTO :ABONOS;
        END
    if (DEBITOS IS NULL) then
        DEBITOS = 0;
    if (CREDITOS IS NULL) then
        CREDITOS = 0;
    if (ABONOS IS NULL) then
        ABONOS = 0;
    FINAL = INICIAL + DEBITOS - CREDITOS - ABONOS;
    SUSPEND;
    END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER PROCEDURE REP_MOVIMIENTO_PROVEEDOR(
    DESDE VARCHAR(20),
    HASTA VARCHAR(20),
    GRPINI VARCHAR(5),
    GRPFIN VARCHAR(5),
    FECINI DATE,
    FECFIN DATE,
    DETALLE CHAR(1),
    ORDEN CHAR(1),
    AGRUPA CHAR(1))
RETURNS (
    NIT VARCHAR(20),
    NOMBRE VARCHAR(60),
    TELEFONO VARCHAR(40),
    CIUDAD VARCHAR(40),
    CODZONA VARCHAR(2),
    NOMZONA VARCHAR(60),
    DV CHAR(1),
    CODCIUD CHAR(5),
    NOMCIUD VARCHAR(60),
    INICIAL NUMERIC(18,2),
    TIPODOC VARCHAR(8),
    IDDOC INTEGER,
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    CONCEPTO VARCHAR(60),
    DEBITO NUMERIC(18,2),
    CREDITO NUMERIC(18,2),
    ABONO NUMERIC(18,2),
    SALDO NUMERIC(18,2),
    RTFTE NUMERIC(18,2),
    RTIVA NUMERIC(18,2),
    RTICA NUMERIC(18,2),
    ARTFTE NUMERIC(18,2),
    ARTIVA NUMERIC(18,2),
    ARTICA NUMERIC(18,2))
AS
declare variable NITINI VARCHAR(20);
declare variable NITFIN VARCHAR(20);
declare variable NOMINI VARCHAR(20);
declare variable NOMFIN VARCHAR(20);
declare variable OK CHAR(1);
declare variable DB CHAR(1);
declare variable AB CHAR(1);
declare variable DESCRETE CHAR(2);
BEGIN
if (ORDEN = 'C') then
    BEGIN
    NITINI = DESDE;
    NITFIN = HASTA;
    NOMINI = '';
    NOMFIN = 'zz';
    END
ELSE
    BEGIN
    NOMINI = DESDE;
    NOMFIN = HASTA;
    NITINI = '';
    NITFIN = 'zz';
    END
EXECUTE PROCEDURE LEE_CONFIGURACION('CXPAGAR', 'SALDOS', 'DESCONTAR RETENCIONES POR CAUSACION') returning_values (DESCRETE);
/* Ubique el NIT */
FOR select T.TERC_NIT, TERC_NOM, TERC_DV, TERC_TEL, TERC_CIU, P.GRPR_COD, T.CIUD_COD
    from terceros T, PROVEEDORES P
    where P.TERC_NIT = T.TERC_NIT AND TERC_PROV = 'S' AND T.TERC_NIT >= :NITINI AND T.TERC_NIT <= :NITFIN AND
        TERC_NOM >= :NOMINI AND TERC_NOM <= :NOMFIN
    INTO :NIT, :NOMBRE, :DV, :TELEFONO, :CIUDAD, :CODZONA, :CODCIUD
    DO  
    BEGIN

    SELECT GRPR_NOM FROM GRUPOS_PROVEEDORES WHERE GRPR_COD = :CODZONA INTO :NOMZONA;
    SELECT CIUD_NOM FROM CIUDADES WHERE CIUD_COD = :CODCIUD INTO :NOMCIUD;
    OK = 'N';
    if (AGRUPA = 'Z') then
        BEGIN
        if (GRPINI = '') then
            BEGIN
            if ((CODZONA IS NULL) or (CODZONA >= :GRPINI AND CODZONA <= :GRPFIN)) then
                OK = 'S';
            END
        ELSE
            if (CODZONA >= :GRPINI AND CODZONA <= :GRPFIN) then
                OK = 'S';
        END
    if (AGRUPA = 'C') then
        BEGIN
        if (GRPINI = '') then
            BEGIN
            if ((CODCIUD IS NULL) or (CODCIUD >= :GRPINI AND CODCIUD <= :GRPFIN)) then
                OK = 'S';
            END
        ELSE
            if (CODCIUD >= :GRPINI AND CODCIUD <= :GRPFIN) then
                OK = 'S';
        END
    if (AGRUPA = 'N') then
        OK = 'S';
        
    if (OK = 'S') then
        BEGIN
/*        execute procedure saldo_proveedor (NIT, FECINI) returning_values (INICIAL);*/
        if (INICIAL is null) then
            INICIAL = 0;
        SALDO = INICIAL;
        if (DETALLE = 'S') then
          BEGIN
          FOR select tido_nomcorto, mvpr_idref, mvpr_prefijo, mvpr_numero, mvpr_fecha, mvpr_conc, mvpr_monto, mvpr_debito, mvpr_rtfte, mvpr_rtiva, mvpr_rtica, mvpr_abono
            from movimiento_proveedor m, tipo_documento t
            where m.mvpr_tiporef = t.tido_cod and terc_nit = :NIT and mvpr_fecha >= :FECINI and mvpr_fecha <= :FECFIN AND MVPR_TIPOREF <> 55
            order by mvpr_fecha, mvpr_tiporef
            into :TIPODOC, :IDDOC, :PREFIJO, :NUMERO, :FECHA, :CONCEPTO, :DEBITO, :DB, :RTFTE, :RTIVA, :RTICA, :AB
            DO
            BEGIN
            if (RTFTE IS NULL) then
                RTFTE = 0;
            if (RTIVA IS NULL) then
                RTIVA = 0;
            if (RTICA IS NULL) then
                RTICA = 0;
            if (DB = 'N') then
                BEGIN
                CREDITO = DEBITO;
                DEBITO = 0;
                RTFTE = RTFTE * -1;
                RTIVA = RTIVA * -1;
                RTICA = RTICA * -1;
                END
            ELSE
                CREDITO = 0;
            SALDO = SALDO + DEBITO - CREDITO;
            if (AB = 'N') then
                BEGIN
                if (DESCRETE = 'SI') then
                    SALDO = SALDO - RTFTE - RTIVA - RTICA;
                ABONO = 0;
                END
            ELSE
                BEGIN
                ABONO = CREDITO;
                CREDITO = 0;
                if (DESCRETE <> 'SI') then
                    SALDO = SALDO + RTFTE + RTIVA + RTICA;
                END
            SUSPEND;
            END
          END
        ELSE
            BEGIN
            SELECT SUM(MVPR_MONTO), sum(mvpr_rtfte), sum(mvpr_rtiva), sum(mvpr_rtica) FROM movimiento_proveedor WHERE TERC_NIT = :NIT AND MVPR_FECHA >= :FECINI AND MVPR_FECHA <= :FECFIN AND MVPR_DEBITO = 'S' and MVPR_ABONO = 'N' INTO :DEBITO, :RTFTE, :RTIVA, :RTICA;
            if (DEBITO IS NULL) then
                DEBITO = 0;
            if (RTFTE IS NULL) then
                RTFTE = 0;
            if (RTIVA IS NULL) then
                RTIVA = 0;
            if (RTICA IS NULL) then
                RTICA = 0;
            if (DESCRETE = 'SI') then
                DEBITO = DEBITO - RTFTE - RTIVA - RTICA;
            SELECT SUM(MVPR_MONTO), sum(mvpr_rtfte), sum(mvpr_rtiva), sum(mvpr_rtica) FROM movimiento_proveedor WHERE TERC_NIT = :NIT AND MVPR_FECHA >= :FECINI AND MVPR_FECHA <= :FECFIN AND MVPR_DEBITO = 'N' AND MVPR_TIPOREF <> 55 AND MVPR_ABONO = 'N' INTO :CREDITO, :ARTFTE, :ARTIVA, :ARTICA;
            if (CREDITO IS NULL) then
                CREDITO = 0;
            if (ARTFTE IS NULL) then
                ARTFTE = 0;
            if (ARTIVA IS NULL) then
                ARTIVA = 0;
            if (ARTICA IS NULL) then
                ARTICA = 0;
            if (DESCRETE = 'SI') then
                CREDITO = CREDITO - ARTFTE - ARTIVA - ARTICA;
            RTFTE = RTFTE - ARTFTE;
            RTIVA = RTIVA - ARTIVA;
            RTICA = RTICA - ARTICA;
            SELECT SUM(MVPR_MONTO), sum(mvpr_rtfte), sum(mvpr_rtiva), sum(mvpr_rtica) FROM movimiento_proveedor WHERE TERC_NIT = :NIT AND MVPR_FECHA >= :FECINI AND MVPR_FECHA <= :FECFIN AND MVPR_ABONO = 'S' INTO :ABONO, :ARTFTE, :ARTIVA, :ARTICA;
            if (ABONO IS NULL) then
                ABONO = 0;
            if (ARTFTE IS NULL) then
                ARTFTE = 0;
            if (ARTIVA IS NULL) then
                ARTIVA = 0;
            if (ARTICA IS NULL) then
                ARTICA = 0;
            if (DESCRETE <> 'SI') then
                ABONO = ABONO + ARTFTE + ARTIVA + ARTICA;
            SALDO = INICIAL + DEBITO - CREDITO - ABONO;
            SUSPEND;
            END
        END
    END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER PROCEDURE SALDO_PROVEEDOR(
    NIT VARCHAR(20),
    FECHA DATE,
    MONEDA INTEGER)
RETURNS (
    SALDO NUMERIC(18,2))
AS
DECLARE VARIABLE sal numeric(18,2);
declare variable TIPODOC INTEGER;
declare variable IDDOC INTEGER;
BEGIN
fecha = fecha - 1;
saldo = 0;
FOR SELECT MVPR_TIPOREF, MVPR_IDREF FROM movimiento_proveedor
    WHERE TERC_NIT = :NIT AND MVPR_FECHA <= :FECHA AND MVPR_ABONO = 'N'
    INTO :TIPODOC, :IDDOC
    DO
    BEGIN
    EXECUTE PROCEDURE saldo_doc_cxpagar(TIPODOC, IDDOC, FECHA, MONEDA) returning_values (SAL);
    if (SAL <> 0) then
        SALDO = SALDO + SAL;
    END
SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER PROCEDURE CONCILIA_CXPAGAR(
    FECINI DATE,
    FECFIN DATE,
    CTACART VARCHAR(20),
    SUBEMPRESA INTEGER,
    ANTERIOR CHAR(1))
RETURNS (
    NIT VARCHAR(20),
    NOMBRE VARCHAR(60),
    INICIAL NUMERIC(18,2),
    INICIALC NUMERIC(18,2),
    DEBITOS NUMERIC(18,2),
    DEBITOSC NUMERIC(18,2),
    CREDITOS NUMERIC(18,2),
    CREDITOSC NUMERIC(18,2),
    SALDO NUMERIC(18,2),
    SALDOC NUMERIC(18,2),
    DIFERENCIA NUMERIC(18,2))
AS
declare variable ANO CHAR(4);
declare variable MES INTEGER;
declare variable ABONOS NUMERIC(18,2);
declare variable RETES CHAR(2);
begin
ano = EXTRACT(YEAR FROM FECFIN);
mes = EXTRACT(MONTH FROM FECFIN);

for select TERC_NIT, TERC_NOM from TERCEROS WHERE TERC_PROV = 'S' into :NIT, :NOMBRE
    DO
    BEGIN
    EXECUTE PROCEDURE saldo_proveedor (NIT, FECINI, 0) returning_values (INICIAL);
    EXECUTE PROCEDURE LEE_CONFIGURACION('CXPAGAR', 'SALDOS', 'DESCONTAR RETENCIONES POR CAUSACION') returning_values(:RETES);
    if (RETES = 'SI') then
        BEGIN
        SELECT SUM(MVPR_MONTO-MVPR_RTFTE-MVPR_RTIVA-MVPR_RTICA)
            FROM movimiento_proveedor
            WHERE TERC_NIT = :NIT AND MVPR_FECHA >= :FECINI AND MVPR_FECHA < :FECFIN AND MVPR_DEBITO = 'S'
            INTO :DEBITOS;
        SELECT SUM(MVPR_MONTO-MVPR_RTFTE-MVPR_RTIVA-MVPR_RTICA)
            FROM movimiento_proveedor
            WHERE TERC_NIT = :NIT AND MVPR_FECHA >= :FECINI AND MVPR_FECHA < :FECFIN AND MVPR_DEBITO = 'N' AND MVPR_ABONO = 'N' and MVPR_TIPOREF <> 55
            INTO :CREDITOS;
        SELECT SUM(MVPR_MONTO) FROM movimiento_proveedor
            WHERE TERC_NIT = :NIT AND MVPR_FECHA >= :FECINI AND MVPR_FECHA < :FECFIN AND MVPR_ABONO = 'S'
            INTO :ABONOS;
        END
    ELSE
        BEGIN
        SELECT SUM(MVPR_MONTO)
            FROM movimiento_proveedor
            WHERE TERC_NIT = :NIT AND MVPR_FECHA >= :FECINI AND MVPR_FECHA < :FECFIN AND MVPR_DEBITO = 'S'
            INTO :DEBITOS;
        SELECT SUM(MVPR_MONTO)
            FROM movimiento_proveedor
            WHERE TERC_NIT = :NIT AND MVPR_FECHA >= :FECINI AND MVPR_FECHA < :FECFIN AND MVPR_DEBITO = 'N' AND MVPR_ABONO = 'N' AND MVPR_TIPOREF <> 55
            INTO :CREDITOS;
        SELECT SUM(MVPR_MONTO+MVPR_RTFTE+MVPR_RTIVA+MVPR_RTICA)
            FROM movimiento_proveedor
            WHERE TERC_NIT = :NIT AND MVPR_FECHA >= :FECINI AND MVPR_FECHA < :FECFIN AND MVPR_ABONO = 'S'
            INTO :ABONOS;
        END
    if (DEBITOS IS NULL) then
        DEBITOS = 0;
    if (CREDITOS IS NULL) then
        CREDITOS = 0;
    if (ABONOS IS NULL) then
        ABONOS = 0;
    CREDITOS = CREDITOS + ABONOS;
    SALDO = INICIAL + DEBITOS - CREDITOS;

    /* LO CONTABLE */
    EXECUTE PROCEDURE SALDO_TERCERO_MES(ctacart, NIT, ANO, MES, 'S') RETURNING_VALUES (INICIALC);
    EXECUTE PROCEDURE MOVIMIENTO_TERCERO_MES(ctacart, NIT, ANO, MES, 'S') RETURNING_VALUES(DEBITOSC);
    EXECUTE PROCEDURE MOVIMIENTO_TERCERO_MES(ctacart, NIT, ANO, MES, 'N') RETURNING_VALUES(CREDITOSC);
    SALDOC = INICIALC + DEBITOSC - CREDITOSC;
    diferencia = SALDO + SALDOC;
    if (DIFERENCIA <> 0) then
        BEGIN
        if (ANTERIOR <> 'S') then
            SUSPEND;
        ELSE
            BEGIN
            if (DIFERENCIA <> (INICIAL + INICIALC)) then
                SUSPEND;
            END
        END
    END
end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER PROCEDURE IMPR_EGRESO(
    ID INTEGER)
RETURNS (
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    NIT VARCHAR(20),
    NOMBRE VARCHAR(60),
    DIR VARCHAR(60),
    CIU VARCHAR(40),
    TEL VARCHAR(40),
    CONCEPTO VARCHAR(60),
    MONTO NUMERIC(18,2),
    RTFTE NUMERIC(18,2),
    RTIVA NUMERIC(18,2),
    RTICA NUMERIC(18,2),
    DSCTO NUMERIC(18,2),
    OBS BLOB SUB_TYPE 1 SEGMENT SIZE 80,
    ITEMDOC INTEGER,
    TIPODOC VARCHAR(8),
    PREFDOC VARCHAR(4),
    NUMDOC VARCHAR(6),
    NUMPRV VARCHAR(10),
    ABONODOC NUMERIC(18,2),
    RTFTEDOC NUMERIC(18,2),
    RTIVADOC NUMERIC(18,2),
    RTICADOC NUMERIC(18,2),
    DSCTODOC NUMERIC(18,2),
    SALDODOC NUMERIC(18,2),
    SALDOPROV NUMERIC(18,2),
    ANTERDOC NUMERIC(18,2))
AS
declare variable NUMROWS INTEGER;
declare variable TIPO integer;
declare variable IDDOC INTEGER;
BEGIN
  SELECT PREF_PRE, EGRE_NUMERO, EGRE_FECHA, EGRE_CONC,
        E.TERC_NIT, EGRE_NOMTERC, TERC_DIR, TERC_CIU, TERC_TEL,
        EGRE_MONTO, EGRE_RTFTEMONTO, EGRE_RTIVAMONTO, EGRE_RTICAMONTO, EGRE_DTOF,
        EGRE_OBS
    FROM EGRESOS E, TERCEROS T
    WHERE E.TERC_NIT = T.TERC_NIT AND E.EGRE_ID = :ID
    INTO :PREFIJO, :NUMERO, :FECHA, :CONCEPTO, 
        :NIT, :NOMBRE, :DIR, :CIU, :TEL,
        :MONTO, :RTFTE, :RTIVA, :RTICA, :DSCTO,
        :OBS;
  select SALDO from saldo_proveedor(:NIT, :FECHA+1, 0) into :SALDOPROV;
  SELECT COUNT(EGDE_ITEM) FROM EGRESOS_DETALLE
    WHERE EGRE_ID = :ID INTO :NUMROWS;
  if (NUMROWS > 0) then
    FOR SELECT EGDE_ITEM, EGDE_TIPODOC, TIDO_NOMCORTO, EGDE_IDDOC, EGDE_PREFIJO, EGDE_NUMERO, EGDE_ABONO, EGDE_RTFTE, EGDE_RTIVA, EGDE_RTICA, EGDE_DTOF
        FROM EGRESOS_DETALLE ED, TIPO_DOCUMENTO TD
        WHERE TD.TIDO_COD = ED.EGDE_TIPODOC AND ED.EGRE_ID = :ID
        order by egde_item
        INTO :ITEMDOC, :TIPO, :TIPODOC, :IDDOC, :PREFDOC, :NUMDOC, :ABONODOC, :RTFTEDOC, :RTIVADOC, :RTICADOC, :DSCTODOC
        DO
            BEGIN
            if (TIPO = 21) then
                SELECT FACO_NUMPROV FROM FACTURAS_COMPRA WHERE FACO_ID = :iddoc INTO :numprv;
            ELSE
                if (TIPO = 51) then
                    SELECT NDPR_NUMPROV FROM NOTAS_DEBITO_PROVEEDOR WHERE NDPR_ID = :iddoc INTO :numprv;
                ELSE
                    numprv = numdoc;
            EXECUTE PROCEDURE saldo_doc_cxpagar(:TIPO, :IDDOC, :FECHA, 0) returning_values (:SALDODOC);
            ANTERDOC = SALDODOC + RTFTEDOC + RTIVADOC + RTICADOC + ABONODOC + DSCTODOC;
            SUSPEND;
            END
  else
    BEGIN
    SALDOPROV = 0;
    ANTERDOC = 0;
    SALDODOC = 0;
    RTFTEDOC = 0;
    RTIVADOC = 0;
    RTICADOC = 0;
    ABONODOC = 0;
    DSCTODOC = 0;
    numprv = '';
    SUSPEND;
    END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER PROCEDURE MOVIMIENTO_CXPAGAR_DESDE_HASTA(
    NIT VARCHAR(20),
    DESDE DATE,
    HASTA DATE,
    MONEDA INTEGER)
RETURNS (
    INICIAL NUMERIC(18,2),
    TIPODOC VARCHAR(8),
    IDDOC INTEGER,
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    CONCEPTO VARCHAR(60),
    DEBITO NUMERIC(18,2),
    CREDITO NUMERIC(18,2),
    SALDO NUMERIC(18,2),
    NOMBRE VARCHAR(60),
    RTFTE NUMERIC(18,2),
    RTIVA NUMERIC(18,2),
    RTICA NUMERIC(18,2),
    NUMPROV VARCHAR(20))
AS
declare variable DB CHAR(1);
declare variable AB CHAR(1);
declare variable RETES CHAR(2);
declare variable TRM NUMERIC(18,2);
BEGIN
  /* Ubique el NIT */
  select terc_nom from terceros where terc_nit = :NIT INTO :NOMBRE;
  execute procedure saldo_proveedor (NIT, DESDE, MONEDA) returning_values (INICIAL);
  if (INICIAL is null) then
    INICIAL = 0;
  SALDO = INICIAL;
  EXECUTE PROCEDURE LEE_CONFIGURACION('CXPAGAR', 'SALDOS', 'DESCONTAR RETENCIONES POR CAUSACION') returning_values(:RETES);
  FOR select tido_nomcorto, mvpr_idref, mvpr_prefijo, mvpr_numero, mvpr_fecha, mvpr_conc, mvpr_monto, mvpr_debito, mvpr_rtfte, mvpr_rtiva, mvpr_rtica, mvpr_abono, MVPR_TRM
    from movimiento_proveedor m, tipo_documento t
    where m.mvpr_tiporef = t.tido_cod and terc_nit = :NIT and mvpr_fecha >= :DESDE and mvpr_fecha <= :HASTA AND mvpr_tiporef <> 55 AND ((:MONEDA = 0) or (MVPR_TRM <> 1))
    order by mvpr_fecha, mvpr_tiporef
    into :TIPODOC, :IDDOC, :PREFIJO, :NUMERO, :FECHA, :CONCEPTO, :DEBITO, :DB, :RTFTE, :RTIVA, :RTICA, :AB, :TRM
    DO
    BEGIN
    if (DB = 'N') then
        BEGIN
        if (AB = 'S') then
            if (RETES = 'SI') then
                CREDITO = DEBITO;
            ELSE
                CREDITO = DEBITO + RTFTE + RTIVA + RTICA;
        ELSE
            if (RETES = 'SI') then
                CREDITO = DEBITO - RTFTE - RTIVA - RTICA;
            ELSE
                CREDITO = DEBITO;
        DEBITO = 0;
        END
    ELSE
        BEGIN
        if (RETES = 'SI') then
            DEBITO = DEBITO - RTFTE - RTIVA - RTICA;
        CREDITO = 0;
        END
    if ((MONEDA <> 0) AND (TRM <> 0)) then
        BEGIN
        DEBITO = DEBITO / TRM;
        CREDITO = CREDITO / TRM;
        RTFTE = RTFTE / TRM;
        RTIVA = RTIVA / TRM;
        RTICA = RTICA / TRM;
        END
    SALDO = SALDO + DEBITO - CREDITO;
    NUMPROV = '';
    if (TIPODOC = 'CARGOACR') then
        SELECT NDPR_NUMPROV FROM NOTAS_DEBITO_PROVEEDOR WHERE NDPR_ID = :IDDOC INTO :NUMPROV;
    if (TIPODOC = 'FACTCOMP') then
        SELECT FACO_NUMPROV FROM FACTURAS_COMPRA WHERE FACO_ID = :IDDOC INTO :NUMPROV;
    SUSPEND;
    END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER PROCEDURE MOVIMIENTO_CXPAGAR_MES(
    FECINI DATE,
    FECFIN DATE,
    MONEDA INTEGER)
RETURNS (
    NIT VARCHAR(20),
    NOMBRE VARCHAR(60),
    INICIAL NUMERIC(18,4),
    DEBITOS NUMERIC(18,4),
    CREDITOS NUMERIC(18,4),
    ABONOS NUMERIC(18,4),
    FINAL NUMERIC(18,4))
AS
declare variable RETES CHAR(2);
BEGIN
  for select TERC_NIT, TERC_NOM from TERCEROS WHERE TERC_PROV = 'S' into :NIT, :NOMBRE
  DO
    BEGIN
    EXECUTE PROCEDURE saldo_proveedor (NIT, FECINI, MONEDA) returning_values (INICIAL);
    EXECUTE PROCEDURE LEE_CONFIGURACION('CXPAGAR', 'SALDOS', 'DESCONTAR RETENCIONES POR CAUSACION') returning_values(:RETES);
    if (RETES = 'SI') then
        BEGIN
        SELECT SUM((MVPR_MONTO-MVPR_RTFTE-MVPR_RTIVA-MVPR_RTICA)/MVPR_TRM)
            FROM movimiento_proveedor
            WHERE TERC_NIT = :NIT AND MVPR_FECHA >= :FECINI AND MVPR_FECHA < :FECFIN AND MVPR_DEBITO = 'S' AND ((:MONEDA = 0) or (MVPR_TRM <> 1))
            INTO :DEBITOS;
        SELECT SUM((MVPR_MONTO-MVPR_RTFTE-MVPR_RTIVA-MVPR_RTICA)/MVPR_TRM)
            FROM movimiento_proveedor
            WHERE TERC_NIT = :NIT AND MVPR_FECHA >= :FECINI AND MVPR_FECHA < :FECFIN AND MVPR_DEBITO = 'N' AND MVPR_ABONO = 'N' and MVPR_TIPOREF <> 55 AND ((:MONEDA = 0) or (MVPR_TRM <> 1))
            INTO :CREDITOS;
        SELECT SUM(MVPR_MONTO/MVPR_TRM) FROM movimiento_proveedor
            WHERE TERC_NIT = :NIT AND MVPR_FECHA >= :FECINI AND MVPR_FECHA < :FECFIN AND MVPR_ABONO = 'S' AND ((:MONEDA = 0) or (MVPR_TRM <> 1))
            INTO :ABONOS;
        END
    ELSE
        BEGIN
        SELECT SUM(MVPR_MONTO/MVPR_TRM)
            FROM movimiento_proveedor
            WHERE TERC_NIT = :NIT AND MVPR_FECHA >= :FECINI AND MVPR_FECHA < :FECFIN AND MVPR_DEBITO = 'S' AND ((:MONEDA = 0) or (MVPR_TRM <> 1))
            INTO :DEBITOS;
        SELECT SUM(MVPR_MONTO/MVPR_TRM)
            FROM movimiento_proveedor
            WHERE TERC_NIT = :NIT AND MVPR_FECHA >= :FECINI AND MVPR_FECHA < :FECFIN AND MVPR_DEBITO = 'N' AND MVPR_ABONO = 'N' AND MVPR_TIPOREF <> 55 AND ((:MONEDA = 0) or (MVPR_TRM <> 1))
            INTO :CREDITOS;
        SELECT SUM((MVPR_MONTO+MVPR_RTFTE+MVPR_RTIVA+MVPR_RTICA)/MVPR_TRM)
            FROM movimiento_proveedor
            WHERE TERC_NIT = :NIT AND MVPR_FECHA >= :FECINI AND MVPR_FECHA < :FECFIN AND MVPR_ABONO = 'S' AND ((:MONEDA = 0) or (MVPR_TRM <> 1))
            INTO :ABONOS;
        END
    if (DEBITOS IS NULL) then
        DEBITOS = 0;
    if (CREDITOS IS NULL) then
        CREDITOS = 0;
    if (ABONOS IS NULL) then
        ABONOS = 0;
    FINAL = INICIAL + DEBITOS - CREDITOS - ABONOS;
    SUSPEND;
    END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER PROCEDURE REP_MOVIMIENTO_PROVEEDOR(
    DESDE VARCHAR(20),
    HASTA VARCHAR(20),
    GRPINI VARCHAR(5),
    GRPFIN VARCHAR(5),
    FECINI DATE,
    FECFIN DATE,
    DETALLE CHAR(1),
    ORDEN CHAR(1),
    AGRUPA CHAR(1),
    MONEDA INTEGER)
RETURNS (
    NIT VARCHAR(20),
    NOMBRE VARCHAR(60),
    TELEFONO VARCHAR(40),
    CIUDAD VARCHAR(40),
    CODZONA VARCHAR(2),
    NOMZONA VARCHAR(60),
    DV CHAR(1),
    CODCIUD CHAR(5),
    NOMCIUD VARCHAR(60),
    INICIAL NUMERIC(18,2),
    TIPODOC VARCHAR(8),
    IDDOC INTEGER,
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    CONCEPTO VARCHAR(60),
    DEBITO NUMERIC(18,2),
    CREDITO NUMERIC(18,2),
    ABONO NUMERIC(18,2),
    SALDO NUMERIC(18,2),
    RTFTE NUMERIC(18,2),
    RTIVA NUMERIC(18,2),
    RTICA NUMERIC(18,2),
    ARTFTE NUMERIC(18,2),
    ARTIVA NUMERIC(18,2),
    ARTICA NUMERIC(18,2))
AS
declare variable NITINI VARCHAR(20);
declare variable NITFIN VARCHAR(20);
declare variable NOMINI VARCHAR(20);
declare variable NOMFIN VARCHAR(20);
declare variable OK CHAR(1);
declare variable DB CHAR(1);
declare variable AB CHAR(1);
declare variable DESCRETE CHAR(2);
declare variable TRM NUMERIC(18,2);
BEGIN
if (ORDEN = 'C') then
    BEGIN
    NITINI = DESDE;
    NITFIN = HASTA;
    NOMINI = '';
    NOMFIN = 'zz';
    END
ELSE
    BEGIN
    NOMINI = DESDE;
    NOMFIN = HASTA;
    NITINI = '';
    NITFIN = 'zz';
    END
EXECUTE PROCEDURE LEE_CONFIGURACION('CXPAGAR', 'SALDOS', 'DESCONTAR RETENCIONES POR CAUSACION') returning_values (DESCRETE);
/* Ubique el NIT */
FOR select T.TERC_NIT, TERC_NOM, TERC_DV, TERC_TEL, TERC_CIU, P.GRPR_COD, T.CIUD_COD
    from terceros T, PROVEEDORES P
    where P.TERC_NIT = T.TERC_NIT AND TERC_PROV = 'S' AND T.TERC_NIT >= :NITINI AND T.TERC_NIT <= :NITFIN AND
        TERC_NOM >= :NOMINI AND TERC_NOM <= :NOMFIN
    INTO :NIT, :NOMBRE, :DV, :TELEFONO, :CIUDAD, :CODZONA, :CODCIUD
    DO  
    BEGIN

    SELECT GRPR_NOM FROM GRUPOS_PROVEEDORES WHERE GRPR_COD = :CODZONA INTO :NOMZONA;
    SELECT CIUD_NOM FROM CIUDADES WHERE CIUD_COD = :CODCIUD INTO :NOMCIUD;
    OK = 'N';
    if (AGRUPA = 'Z') then
        BEGIN
        if (GRPINI = '') then
            BEGIN
            if ((CODZONA IS NULL) or (CODZONA >= :GRPINI AND CODZONA <= :GRPFIN)) then
                OK = 'S';
            END
        ELSE
            if (CODZONA >= :GRPINI AND CODZONA <= :GRPFIN) then
                OK = 'S';
        END
    if (AGRUPA = 'C') then
        BEGIN
        if (GRPINI = '') then
            BEGIN
            if ((CODCIUD IS NULL) or (CODCIUD >= :GRPINI AND CODCIUD <= :GRPFIN)) then
                OK = 'S';
            END
        ELSE
            if (CODCIUD >= :GRPINI AND CODCIUD <= :GRPFIN) then
                OK = 'S';
        END
    if (AGRUPA = 'N') then
        OK = 'S';
        
    if (OK = 'S') then
        BEGIN
        execute procedure saldo_proveedor (NIT, FECINI, MONEDA) returning_values (INICIAL);
        if (INICIAL is null) then
            INICIAL = 0;
        SALDO = INICIAL;
        if (DETALLE = 'S') then
          BEGIN
          FOR select tido_nomcorto, mvpr_idref, mvpr_prefijo, mvpr_numero, mvpr_fecha, mvpr_conc, mvpr_monto, mvpr_debito, mvpr_rtfte, mvpr_rtiva, mvpr_rtica, mvpr_abono, MVPR_TRM
            from movimiento_proveedor m, tipo_documento t
            where m.mvpr_tiporef = t.tido_cod and terc_nit = :NIT and mvpr_fecha >= :FECINI and mvpr_fecha <= :FECFIN AND MVPR_TIPOREF <> 55 AND ((:MONEDA = 0) or (MVPR_TRM <> 1))
            order by mvpr_fecha, mvpr_tiporef
            into :TIPODOC, :IDDOC, :PREFIJO, :NUMERO, :FECHA, :CONCEPTO, :DEBITO, :DB, :RTFTE, :RTIVA, :RTICA, :AB, :TRM
            DO
            BEGIN
            if (RTFTE IS NULL) then
                RTFTE = 0;
            if (RTIVA IS NULL) then
                RTIVA = 0;
            if (RTICA IS NULL) then
                RTICA = 0;
            if (DB = 'N') then
                BEGIN
                CREDITO = DEBITO;
                DEBITO = 0;
                RTFTE = RTFTE * -1;
                RTIVA = RTIVA * -1;
                RTICA = RTICA * -1;
                END
            ELSE
                CREDITO = 0;
            if ((MONEDA <> 0) AND (TRM <> 0)) then
                BEGIN
                DEBITO = DEBITO / TRM;
                CREDITO = CREDITO / TRM;
                RTFTE = RTFTE / TRM;
                RTIVA = RTIVA / TRM;
                RTICA = RTICA / TRM;
                END
            SALDO = SALDO + DEBITO - CREDITO;
            if (AB = 'N') then
                BEGIN
                if (DESCRETE = 'SI') then
                    SALDO = SALDO - RTFTE - RTIVA - RTICA;
                ABONO = 0;
                END
            ELSE
                BEGIN
                ABONO = CREDITO;
                CREDITO = 0;
                if (DESCRETE <> 'SI') then
                    SALDO = SALDO + RTFTE + RTIVA + RTICA;
                END
            SUSPEND;
            END
          END
        ELSE
            BEGIN
            if (MONEDA = 0) then
                SELECT SUM(MVPR_MONTO), sum(mvpr_rtfte), sum(mvpr_rtiva), sum(mvpr_rtica)
                    FROM movimiento_proveedor WHERE TERC_NIT = :NIT AND MVPR_FECHA >= :FECINI AND MVPR_FECHA <= :FECFIN AND MVPR_DEBITO = 'S' and MVPR_ABONO = 'N'
                    INTO :DEBITO, :RTFTE, :RTIVA, :RTICA;
            else
                SELECT SUM(MVPR_MONTO/MVPR_TRM), sum(mvpr_rtfte/MVPR_TRM), sum(mvpr_rtiva/MVPR_TRM), sum(mvpr_rtica/MVPR_TRM)
                    FROM movimiento_proveedor WHERE TERC_NIT = :NIT AND MVPR_FECHA >= :FECINI AND MVPR_FECHA <= :FECFIN AND MVPR_DEBITO = 'S' and MVPR_ABONO = 'N' AND ((:MONEDA = 0) or (MVPR_TRM <> 1))
                    INTO :DEBITO, :RTFTE, :RTIVA, :RTICA;
            if (DEBITO IS NULL) then
                DEBITO = 0;
            if (RTFTE IS NULL) then
                RTFTE = 0;
            if (RTIVA IS NULL) then
                RTIVA = 0;
            if (RTICA IS NULL) then
                RTICA = 0;
            if (DESCRETE = 'SI') then
                DEBITO = DEBITO - RTFTE - RTIVA - RTICA;
            if (MONEDA = 0) then
                SELECT SUM(MVPR_MONTO), sum(mvpr_rtfte), sum(mvpr_rtiva), sum(mvpr_rtica) FROM movimiento_proveedor
                    WHERE TERC_NIT = :NIT AND MVPR_FECHA >= :FECINI AND MVPR_FECHA <= :FECFIN AND MVPR_DEBITO = 'N' AND MVPR_TIPOREF <> 55 AND MVPR_ABONO = 'N' INTO :CREDITO, :ARTFTE, :ARTIVA, :ARTICA;
            else
                SELECT SUM(MVPR_MONTO/MVPR_TRM), sum(mvpr_rtfte/MVPR_TRM), sum(mvpr_rtiva/MVPR_TRM), sum(mvpr_rtica/MVPR_TRM) FROM movimiento_proveedor
                    WHERE TERC_NIT = :NIT AND MVPR_FECHA >= :FECINI AND MVPR_FECHA <= :FECFIN AND MVPR_DEBITO = 'N' AND MVPR_TIPOREF <> 55 AND MVPR_ABONO = 'N' INTO :CREDITO, :ARTFTE, :ARTIVA, :ARTICA;
            if (CREDITO IS NULL) then
                CREDITO = 0;
            if (ARTFTE IS NULL) then
                ARTFTE = 0;
            if (ARTIVA IS NULL) then
                ARTIVA = 0;
            if (ARTICA IS NULL) then
                ARTICA = 0;
            if (DESCRETE = 'SI') then
                CREDITO = CREDITO - ARTFTE - ARTIVA - ARTICA;
            RTFTE = RTFTE - ARTFTE;
            RTIVA = RTIVA - ARTIVA;
            RTICA = RTICA - ARTICA;
            if (MONEDA = 0) then
                SELECT SUM(MVPR_MONTO), sum(mvpr_rtfte), sum(mvpr_rtiva), sum(mvpr_rtica) FROM movimiento_proveedor
                    WHERE TERC_NIT = :NIT AND MVPR_FECHA >= :FECINI AND MVPR_FECHA <= :FECFIN AND MVPR_ABONO = 'S'
                    INTO :ABONO, :ARTFTE, :ARTIVA, :ARTICA;
            else
                SELECT SUM(MVPR_MONTO/MVPR_TRM), sum(mvpr_rtfte/MVPR_TRM), sum(mvpr_rtiva/MVPR_TRM), sum(mvpr_rtica/MVPR_TRM)
                    FROM movimiento_proveedor
                    WHERE TERC_NIT = :NIT AND MVPR_FECHA >= :FECINI AND MVPR_FECHA <= :FECFIN AND MVPR_ABONO = 'S' AND ((:MONEDA = 0) or (MVPR_TRM <> 1))
                    INTO :ABONO, :ARTFTE, :ARTIVA, :ARTICA;
            if (ABONO IS NULL) then
                ABONO = 0;
            if (ARTFTE IS NULL) then
                ARTFTE = 0;
            if (ARTIVA IS NULL) then
                ARTIVA = 0;
            if (ARTICA IS NULL) then
                ARTICA = 0;
            if (DESCRETE <> 'SI') then
                ABONO = ABONO + ARTFTE + ARTIVA + ARTICA;
            SALDO = INICIAL + DEBITO - CREDITO - ABONO;
            SUSPEND;
            END
        END
    END
END
^

SET TERM ; ^

ALTER TABLE APLICACION_PROVEEDOR_DETALLE
ADD APPD_DIFCAMBIO T_MONTO;

SET TERM ^ ;

create trigger APLICACION_PROVEEDOR_DETALLE_BI for APLICACION_PROVEEDOR_DETALLE
active BEFORE INSERT position 0
as
declare variable PREGTASA CHAR(2);
declare variable TRM NUMERIC(18,2);
declare variable SALDO NUMERIC(18,2);
declare variable SALDOM NUMERIC(18,2);
declare variable RETES CHAR(2);
begin
/* SI TRM <> 1 CONVIERTA A PESOS LOS VALORES */
EXECUTE PROCEDURE LEE_CONFIGURACION('GENERAL', 'GENERAL', 'PREGUNTAR TASA DE CAMBIO EN DOCUMENTOS DE CUENTAS POR PAGAR') returning_values (:pregtasa);
if (PREGTASA = 'SI') then
    BEGIN
    SELECT APPR_TRM FROM aplicacion_provedor WHERE APPR_ID = NEW.appr_id INTO :TRM;
    NEW.appd_aplicado = NEW.appd_aplicado * :trm;
    NEW.appd_rtfte = NEW.appd_rtfte * :trm;
    NEW.appd_rtiva = NEW.appd_rtiva * :trm;
    NEW.appd_rtica = NEW.appd_rtica * :trm;
    /* VERIFIQUE LOS SALDOS SI LLEVE LA DIFERENCIA COMO DIF EN CAMBIO */
    execute procedure lee_configuracion('CXPAGAR', 'SALDOS', 'DESCONTAR RETENCIONES POR CAUSACION') returning_values (RETES);
    execute procedure saldo_doc_cxpagar(new.appd_tipodoc, new.appd_iddoc, '9999/12/31', 0) returning_values(saldo);
    if (SALDO < 0) then
        BEGIN
        if (RETES = 'SI') then
            begin
            if (saldo > NEW.appd_aplicado) then
                BEGIN
                execute procedure saldo_doc_cxpagar(new.appd_tipodoc, new.appd_iddoc, '9999/12/31', 1) returning_values(saldoM);
                if (saldoM > (NEW.appd_aplicado/:TRM)) then
                    EXCEPTION DOCUMENTO_ABONO_MAYOR 'EL SALDO DEL DOCUMENTO ' || NEW.appd_prefijo || NEW.appd_numero || ' ES INSUFICIENTE.';
                else
                    BEGIN
                    NEW.appd_difcambio = :SALDO - NEW.appd_aplicado;
                    NEW.appd_aplicado = NEW.appd_aplicado - NEW.appd_difcambio;
                    END
                END
            end
        ELSE
            begin
            if (saldo > (NEW.appd_aplicado + NEW.appd_rtfte + NEW.appd_rtiva + NEW.appd_rtica)) then
                begin
                execute procedure saldo_doc_cxpagar(new.appd_tipodoc, new.appd_iddoc, '9999/12/31', 1) returning_values(saldoM);
                if (saldoM > ((NEW.appd_aplicado+NEW.appd_rtfte+NEW.appd_rtiva+NEW.appd_rtica)/:TRM)) then
                    EXCEPTION DOCUMENTO_ABONO_MAYOR 'EL SALDO DEL DOCUMENTO ' || NEW.appd_prefijo || NEW.appd_numero || ' ES INSUFICIENTE.';
                else
                    BEGIN
                    NEW.appd_difcambio = :SALDO - (NEW.appd_aplicado+NEW.appd_rtfte+NEW.appd_rtiva+NEW.appd_rtica);
                    NEW.appd_aplicado = NEW.appd_aplicado - NEW.appd_difcambio;
                    END
                end
            end
        END
    else
        BEGIN
        if (RETES = 'SI') then
            begin
            if (saldo < NEW.appd_aplicado) then
                BEGIN
                execute procedure saldo_doc_cxpagar(new.appd_tipodoc, new.appd_iddoc, '9999/12/31', 1) returning_values(saldoM);
                if (saldoM < (NEW.appd_aplicado/:TRM)) then
                    EXCEPTION DOCUMENTO_ABONO_MAYOR 'EL SALDO DEL DOCUMENTO ' || NEW.appd_prefijo || NEW.appd_numero || ' ES INSUFICIENTE.';
                else
                    BEGIN
                    NEW.appd_difcambio = :SALDO - NEW.appd_aplicado;
                    NEW.appd_aplicado = NEW.appd_aplicado - NEW.appd_difcambio;
                    END
                END
            end
        ELSE
            begin
            if (saldo < (NEW.appd_aplicado + NEW.appd_rtfte + NEW.appd_rtiva + NEW.appd_rtica)) then
                begin
                execute procedure saldo_doc_cxpagar(new.appd_tipodoc, new.appd_iddoc, '9999/12/31', 1) returning_values(saldoM);
                if (saldoM < ((NEW.appd_aplicado+NEW.appd_rtfte+NEW.appd_rtiva+NEW.appd_rtica)/:TRM)) then
                    EXCEPTION DOCUMENTO_ABONO_MAYOR 'EL SALDO DEL DOCUMENTO ' || NEW.appd_prefijo || NEW.appd_numero || ' ES INSUFICIENTE.';
                else
                    BEGIN
                    NEW.appd_difcambio = :SALDO - (NEW.appd_aplicado+NEW.appd_rtfte+NEW.appd_rtiva+NEW.appd_rtica);
                    NEW.appd_aplicado = NEW.appd_aplicado - NEW.appd_difcambio;
                    END
                end
            end
        END
    end
end
^

SET TERM ; ^

SET TERM ^ ;

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

SET TERM ; ^

SET TERM ^ ;

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

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

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

SET TERM ; ^

SET TERM ^ ;

create trigger EGRESOS_DETALLE_BI for EGRESOS_DETALLE
active BEFORE INSERT position 0
as
declare variable PREGTASA CHAR(2);
declare variable TRM NUMERIC(18,2);
declare variable SALDO NUMERIC(18,2);
declare variable SALDOM NUMERIC(18,2);
declare variable RETES CHAR(2);
begin
/* SI TRM <> 1 CONVIERTA A PESOS LOS VALORES */
EXECUTE PROCEDURE LEE_CONFIGURACION('GENERAL', 'GENERAL', 'PREGUNTAR TASA DE CAMBIO EN DOCUMENTOS DE CUENTAS POR PAGAR') returning_values (:pregtasa);
if (PREGTASA = 'SI') then
    BEGIN
    SELECT EGRE_TRM FROM EGRESOS WHERE EGRE_ID = NEW.egre_id INTO :TRM;
    NEW.egde_abono = NEW.egde_abono * :trm;
    NEW.egde_rtfte = NEW.egde_rtfte * :trm;
    NEW.egde_rtiva = NEW.egde_rtiva * :trm;
    NEW.egde_rtica = NEW.egde_rtica * :trm;
    NEW.egde_dtof = NEW.egde_dtof * :trm;
    /* VERIFIQUE LOS SALDOS Y LLEVE LA DIFERENCIA COMO DIF EN CAMBIO */
    execute procedure lee_configuracion('CXPAGAR', 'SALDOS', 'DESCONTAR RETENCIONES POR CAUSACION') returning_values (RETES);
    execute procedure saldo_doc_cxpagar(new.egde_tipodoc, new.egde_iddoc, '9999/12/31', 0) returning_values(saldo);
    if (SALDO < 0) then
        BEGIN
        if (RETES = 'SI') then
            begin
            if (saldo > (NEW.egde_abono + NEW.egde_dtof)) then
                BEGIN
                execute procedure saldo_doc_cxpagar(new.egde_tipodoc, new.egde_iddoc, '9999/12/31', 1) returning_values(saldoM);
                if (saldoM > ((NEW.egde_abono + NEW.egde_dtof)/:TRM)) then
                    EXCEPTION DOCUMENTO_ABONO_MAYOR 'EL SALDO DEL DOCUMENTO ' || NEW.egde_prefijo || NEW.egde_numero || ' ES INSUFICIENTE.';
                else
                    BEGIN
                    NEW.egde_difcambio = :SALDO - (NEW.egde_abono + NEW.egde_dtof);
                    NEW.egde_abono = NEW.egde_abono - NEW.egde_difcambio;
                    END
                END
            end
        ELSE
            begin
            if (saldo > (NEW.egde_abono + NEW.egde_dtof + NEW.egde_rtfte + NEW.egde_rtiva + NEW.egde_rtica)) then
                begin
                execute procedure saldo_doc_cxpagar(new.egde_tipodoc, new.egde_iddoc, '9999/12/31', 1) returning_values(saldoM);
                if (saldoM > ((NEW.egde_abono+NEW.egde_dtof+NEW.egde_rtfte+NEW.egde_rtiva+NEW.egde_rtica)/:TRM)) then
                    EXCEPTION DOCUMENTO_ABONO_MAYOR 'EL SALDO DEL DOCUMENTO ' || NEW.egde_prefijo || NEW.egde_numero || ' ES INSUFICIENTE.';
                else
                    BEGIN
                    NEW.egde_difcambio = :SALDO - (NEW.egde_abono+NEW.egde_dtof+NEW.egde_rtfte+NEW.egde_rtiva+NEW.egde_rtica);
                    NEW.egde_abono = NEW.egde_abono - NEW.egde_difcambio;
                    END
                end
            end
        END
    else
        BEGIN
        if (RETES = 'SI') then
            begin
            if (saldo < (NEW.egde_abono + NEW.egde_dtof)) then
                BEGIN
                execute procedure saldo_doc_cxpagar(new.egde_tipodoc, new.egde_iddoc, '9999/12/31', 1) returning_values(saldoM);
                if (saldoM < ((NEW.egde_abono + NEW.egde_dtof)/:TRM)) then
                    EXCEPTION DOCUMENTO_ABONO_MAYOR 'EL SALDO DEL DOCUMENTO ' || NEW.egde_prefijo || NEW.egde_numero || ' ES INSUFICIENTE.';
                else
                    BEGIN
                    NEW.egde_difcambio = :SALDO - (NEW.egde_abono + NEW.egde_dtof);
                    NEW.egde_abono = NEW.egde_abono - NEW.egde_difcambio;
                    END
                END
            end
        ELSE
            begin
            if (saldo < (NEW.egde_abono + NEW.egde_dtof + NEW.egde_rtfte + NEW.egde_rtiva + NEW.egde_rtica)) then
                begin
                execute procedure saldo_doc_cxpagar(new.egde_tipodoc, new.egde_iddoc, '9999/12/31', 1) returning_values(saldoM);
                if (saldoM < ((NEW.egde_abono+NEW.egde_dtof+NEW.egde_rtfte+NEW.egde_rtiva+NEW.egde_rtica)/:TRM)) then
                    EXCEPTION DOCUMENTO_ABONO_MAYOR 'EL SALDO DEL DOCUMENTO ' || NEW.egde_prefijo || NEW.egde_numero || ' ES INSUFICIENTE.';
                else
                    BEGIN
                    NEW.egde_difcambio = :SALDO - (NEW.egde_abono + NEW.egde_dtof+NEW.egde_rtfte+NEW.egde_rtiva+NEW.egde_rtica);
                    NEW.egde_abono = NEW.egde_abono - NEW.egde_difcambio;
                    END
                end
            end
        END
    end
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER EGRESOS_DETALLE_AU FOR EGRESOS_DETALLE
ACTIVE AFTER UPDATE POSITION 0
AS
declare variable EXISTE CHAR(1);
declare variable FEC DATE;
declare variable NIT VARCHAR(20);
declare variable CONCEPTO VARCHAR(60);
declare variable PREFIJO VARCHAR(4);
declare variable NUMERO VARCHAR(6);
declare variable OK CHAR(1);
declare variable EGANTI INTEGER;
declare variable RETES CHAR(2);
declare variable SALDO NUMERIC(18,2);
declare variable TRM NUMERIC(18,2);
BEGIN
select PREF_PRE, EGRE_NUMERO, EGRE_FECHA, EGRE_CONC, TERC_NIT, EGRE_TRM from EGRESOS
    where egre_id = new.egre_id into :PREFIJO, :NUMERO, :FEC, :CONCEPTO, :NIT, :TRM;
if ((OLD.EGRE_ID <> 0) and (old.egde_anulado = 'N')) then
    BEGIN
    /* BORRE EL ANTICIPO SI FUE EL QUIEN LO CREO */
    OK = 'N';
    if (OLD.EGDE_TIPODOC = 55) then
        BEGIN
        SELECT EGRE_ID FROM ANTICIPOS_PROVEEDOR WHERE ANPR_ID = OLD.EGDE_IDDOC INTO :EGANTI;
        if (EGANTI = old.egre_id) then
            begin
            OK = 'S';
            UPDATE anticipos_proveedor SET ANPR_ANULADO = 'S' where ANPR_ID = OLD.EGDE_IDDOC;
            end
        END
    if (OK = 'N') then
        BEGIN
        EXISTE = 'N';
        select 'S' from saldos_doc_cxpagar where sdcp_tiporef = old.egde_tipodoc and
            sdcp_idref = old.egde_iddoc and sdcp_fecha = :FEC into :EXISTE;
        if (Existe = 'S') then
            begin
            /* Borre el viejo */
            if (old.EGRE_ID <> 0) then
                UPDATE saldos_doc_cxpagar
                    SET SDCP_ABONO = SDCP_ABONO - (old.egde_abono + OLD.egde_dtof),
                    SDCP_ABRTFTE = SDCP_ABRTFTE - old.egde_RTFTE,
                    SDCP_ABRTIVA = SDCP_ABRTIVA - old.egde_RTIVA,
                    SDCP_ABRTICA = SDCP_ABRTICA - old.egde_RTICA
                    WHERE SDCP_TIPOREF = OLD.EGDE_TIPODOC AND SDCP_IDREF = OLD.egde_IDDOC AND SDCP_FECHA = :FEC;
            end
        END
    EXISTE = 'N';
    SELECT 'S' FROM MOVIMIENTO_PROVEEDOR WHERE MVPR_TIPOREF = 62 AND MVPR_IDREF = OLD.EGRE_ID INTO :EXISTE;
    if (EXISTE = 'S') then
        begin
        /* Deshaga el viejo */
        UPDATE movimiento_proveedor
            SET MVPR_MONTO = MVPR_MONTO - (OLD.egde_abono + OLD.egde_dtof),
            MVPR_RTFTE = MVPR_RTFTE - OLD.egde_rtfte,
            MVPR_RTIVA = MVPR_RTIVA - OLD.egde_rtiva,
            MVPR_RTICA = MVPR_RTICA - OLD.egde_rtica
            WHERE MVPR_TIPOREF = 62 AND MVPR_IDREF = OLD.EGRE_ID;
        end
    END /* OLD.EGRE_ID <> 0 */
if ((NEW.EGRE_ID <> 0) and (NEW.egde_anulado = 'N')) then
    BEGIN
    /* valide que no se pase del saldo */
    execute procedure saldo_doc_cxpagar(new.egde_tipodoc, new.egde_iddoc, '9999/12/31', 0) returning_values(saldo);
    execute procedure lee_configuracion('CXPAGAR', 'SALDOS', 'DESCONTAR RETENCIONES POR CAUSACION') returning_values (RETES);
    if (SALDO < 0) then
        BEGIN
        if (RETES = 'SI') then
            begin
            if (saldo > NEW.egde_abono) then
                EXCEPTION DOCUMENTO_ABONO_MAYOR;
            end
        ELSE
            begin
            if (saldo > (NEW.egde_abono + NEW.egde_rtfte + NEW.egde_rtiva + NEW.egde_rtica + new.egde_dtof)) then
                EXCEPTION DOCUMENTO_ABONO_MAYOR;
            end
        END
    else
        BEGIN
        if (RETES = 'SI') then
            begin
            if (saldo < NEW.egde_abono) then
                EXCEPTION DOCUMENTO_ABONO_MAYOR;
            end
        ELSE
            begin
            if (saldo < (NEW.egde_abono + NEW.egde_rtfte + NEW.egde_rtiva + NEW.egde_rtica + NEW.egde_dtof)) then
                EXCEPTION DOCUMENTO_ABONO_MAYOR;
            end
        END
    /* AHORA REGISTRE LO NUEVO */
    OK = 'N';
    if (new.EGDE_TIPODOC = 55) then
        BEGIN
        /* BUSQUE SI TIENE EGRE_ID, SI NO LO ACTUALIZA */
        SELECT EGRE_ID FROM ANTICIPOS_PROVEEDOR WHERE ANPR_ID = NEW.EGDE_IDDOC INTO :EGANTI;
        if (EGANTI = 0) then
            BEGIN
            OK = 'S';
            UPDATE ANTICIPOS_PROVEEDOR SET EGRE_ID = NEW.EGRE_ID WHERE ANPR_ID = NEW.EGDE_IDDOC;
            END
        END
    if (OK = 'N') then
        BEGIN
        EXISTE = 'N';
        select 'S' from saldos_doc_cxpagar where sdcp_tiporef = new.egde_tipodoc and
            sdcp_idref = new.egde_iddoc and sdcp_fecha = :FEC into :EXISTE;
        if (Existe = 'S') then
            /* actualice el saldo del dia */
            UPDATE saldos_doc_cxpagar
                SET SDCP_ABONO = SDCP_ABONO + (NEW.egde_abono + NEW.egde_dtof),
                SDCP_ABRTFTE = SDCP_ABRTFTE + NEW.egde_RTFTE,
                SDCP_ABRTIVA = SDCP_ABRTIVA + NEW.egde_RTIVA,
                SDCP_ABRTICA = SDCP_ABRTICA + NEW.egde_RTICA,
                SDCP_TRM = :TRM
                WHERE SDCP_TIPOREF = NEW.EGDE_TIPODOC AND SDCP_IDREF = NEW.egde_IDDOC AND SDCP_FECHA = :FEC;
        else
            /* Inserte un nuevo saldo diario */
            INSERT INTO SALDOS_DOC_CXPAGAR (SDCP_TIPOREF, SDCP_IDREF, SDCP_FECHA, TERC_NIT, SDCP_RTEFTE, SDCP_RTIVA, SDCP_RTICA, SDCP_ABONO, SDCP_ABRTFTE, SDCP_ABRTIVA, SDCP_ABRTICA, SDCP_DEBITO, SDCP_MONTO, SDCP_TRM)
                VALUES (NEW.EGDE_TIPODOC, NEW.EGDE_IDDOC, :FEC, :NIT, 0, 0, 0, (NEW.egde_abono + NEW.egde_dtof), NEW.egde_rtfte, NEW.egde_rtiva, NEW.egde_rtica, 'N', 0, :TRM);
        END /* ok = n */
    /* Registre o actualice el registro en movimiento_proveedor */
    EXISTE = 'N';
    SELECT 'S' FROM MOVIMIENTO_PROVEEDOR WHERE MVPR_TIPOREF = 62 AND MVPR_IDREF = NEW.EGRE_ID INTO :EXISTE;
    if (EXISTE = 'S') then
        /* Actualice el nuevo */
        UPDATE movimiento_proveedor
            SET MVPR_MONTO = MVPR_MONTO + (NEW.egde_abono + NEW.egde_dtof),
                MVPR_RTFTE = MVPR_RTFTE + NEW.egde_rtfte,
                MVPR_RTIVA = MVPR_RTIVA + NEW.egde_rtiva,
                MVPR_RTICA = MVPR_RTICA + NEW.egde_rtica,
                MVPR_TRM = :TRM
            WHERE MVPR_TIPOREF = 62 AND MVPR_IDREF = NEW.EGRE_ID;
    ELSE
        INSERT INTO MOVIMIENTO_PROVEEDOR (MVPR_ID, TERC_NIT, MVPR_TIPOREF, MVPR_IDREF, MVPR_FECHA, MVPR_VENCE, MVPR_CONC, MVPR_MONTO, MVPR_RTFTE, MVPR_RTIVA, MVPR_RTICA, MVPR_DEBITO, MVPR_ABONO, MVPR_PREFIJO, MVPR_NUMERO, MVPR_TRM)
            VALUES (GEN_ID(ID_MOVPROV, 1), :NIT, 62, NEW.EGRE_ID, :FEC, :FEC, :CONCEPTO, (NEW.EGDE_ABONO + NEW.egde_dtof), NEW.EGDE_RTFTE, NEW.EGDE_RTIVA, NEW.EGDE_RTICA, 'N', 'S', :PREFIJO, :NUMERO, :TRM);
    end
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER EGRESOS_DETALLE_AI FOR EGRESOS_DETALLE
ACTIVE AFTER INSERT POSITION 0
AS
declare variable EXISTE CHAR(1);
declare variable FEC DATE;
declare variable CONC VARCHAR(60);
declare variable NIT VARCHAR(20);
declare variable CONCEPTO VARCHAR(60);
declare variable PREFIJO VARCHAR(4);
declare variable NUMERO VARCHAR(6);
declare variable OK CHAR(1);
declare variable EGANTI INTEGER;
declare variable RETES CHAR(2);
declare variable SALDO NUMERIC(18,2);
declare variable TRM NUMERIC(18,2);
BEGIN
/* Abone el documento referenciado en EGRESOS_DETALLE */
select PREF_PRE, EGRE_NUMERO, EGRE_FECHA, EGRE_CONC, TERC_NIT, EGRE_TRM
    from EGRESOS where EGRE_ID = new.EGRE_ID into :PREFIJO, :NUMERO, :FEC, :CONCEPTO, :NIT, :TRM;
if ((NEW.EGRE_ID <> 0) and (new.egde_anulado = 'N')) then
    BEGIN
    OK = 'N';
    if (new.EGDE_TIPODOC = 55) then
        BEGIN
        /* BUSQUE SI TIENE EGRE_ID, SI NO LO ACTUALIZA */
        SELECT EGRE_ID FROM ANTICIPOS_PROVEEDOR WHERE ANPR_ID = NEW.EGDE_IDDOC INTO :EGANTI;
        if (EGANTI = 0) then
            BEGIN
            OK = 'S';
            UPDATE ANTICIPOS_PROVEEDOR SET EGRE_ID = NEW.EGRE_ID WHERE ANPR_ID = NEW.EGDE_IDDOC;
            END
        END
    /* valide que no se pase del saldo */
    execute procedure saldo_doc_cxpagar(new.egde_tipodoc, new.egde_iddoc, '9999/12/31', 0) returning_values(saldo);
    execute procedure lee_configuracion('CXPAGAR', 'SALDOS', 'DESCONTAR RETENCIONES POR CAUSACION') returning_values (RETES);
    if (SALDO < 0) then
        BEGIN
        if (RETES = 'SI') then
            begin
            if (saldo > NEW.egde_abono) then
                EXCEPTION DOCUMENTO_ABONO_MAYOR 'EL SALDO DEL DOCUMENTO ' || NEW.egde_prefijo || NEW.egde_numero || ' ES INSUFICIENTE.';
            end
        ELSE
            begin
            if (saldo > (NEW.egde_abono + NEW.egde_rtfte + NEW.egde_rtiva + NEW.egde_rtica + new.egde_dtof)) then
                EXCEPTION DOCUMENTO_ABONO_MAYOR 'EL SALDO DEL DOCUMENTO ' || NEW.egde_prefijo || NEW.egde_numero || ' ES INSUFICIENTE.';
            end
        END
    else
        BEGIN
        if (RETES = 'SI') then
            begin
            if (saldo < NEW.egde_abono) then
                EXCEPTION DOCUMENTO_ABONO_MAYOR 'EL SALDO DEL DOCUMENTO ' || NEW.egde_prefijo || NEW.egde_numero || ' ES INSUFICIENTE.';
            end
        ELSE
            begin
            if (saldo < (NEW.egde_abono + NEW.egde_rtfte + NEW.egde_rtiva + NEW.egde_rtica + NEW.egde_dtof)) then
                EXCEPTION DOCUMENTO_ABONO_MAYOR 'EL SALDO DEL DOCUMENTO ' || NEW.egde_prefijo || NEW.egde_numero || ' ES INSUFICIENTE.';
            end
        END
    if (OK = 'N') then
        BEGIN
        select 'S' from saldos_doc_cxpagar where sdcp_tiporef = new.egde_tipodoc and
            sdcp_idref = new.egde_iddoc and sdcp_fecha = :FEC into :EXISTE;
        if (Existe = 'S') then
            begin
            /* actualice el saldo del dia */
            UPDATE saldos_doc_cxpagar
                SET SDCP_ABONO = SDCP_ABONO + (NEW.egde_abono + NEW.egde_dtof),
                    SDCP_ABRTFTE = SDCP_ABRTFTE + NEW.egde_RTFTE,
                    SDCP_ABRTIVA = SDCP_ABRTIVA + NEW.egde_RTIVA,
                    SDCP_ABRTICA = SDCP_ABRTICA + NEW.egde_RTICA,
                    SDCP_TRM = :TRM
                WHERE SDCP_TIPOREF = NEW.EGDE_TIPODOC AND SDCP_IDREF = NEW.egde_IDDOC AND SDCP_FECHA = :FEC;
            END
        ELSE
            BEGIN
            /* Inserte un nuevo saldo diario */
            INSERT INTO SALDOS_DOC_CXPAGAR (SDCP_TIPOREF, SDCP_IDREF, SDCP_FECHA, TERC_NIT, SDCP_RTEFTE, SDCP_RTIVA, SDCP_RTICA, SDCP_ABONO, SDCP_ABRTFTE, SDCP_ABRTIVA, SDCP_ABRTICA, SDCP_DEBITO, SDCP_MONTO, SDCP_TRM)
                VALUES (NEW.EGDE_TIPODOC, NEW.EGDE_IDDOC, :FEC, :NIT, 0, 0, 0, (NEW.egde_abono+NEW.egde_dtof), NEW.egde_rtfte, NEW.egde_rtiva, NEW.egde_rtica, 'N', 0, :TRM);
            END
        END
    /* actualice el registro en mov_proveedor (por si son varios items) */
    EXISTE = 'N';
    SELECT 'S' FROM MOVIMIENTO_PROVEEDOR WHERE MVPR_TIPOREF = 62 AND MVPR_IDREF = NEW.EGRE_ID INTO :EXISTE;
    if (EXISTE = 'S') then
        begin
        UPDATE movimiento_proveedor
            SET MVPR_MONTO = MVPR_MONTO + (NEW.egde_abono + NEW.egde_dtof),
                MVPR_RTFTE = MVPR_RTFTE + NEW.egde_rtfte,
                MVPR_RTIVA = MVPR_RTIVA + NEW.egde_rtiva,
                MVPR_RTICA = MVPR_RTICA + NEW.egde_rtica,
                MVPR_TRM = :TRM
            WHERE MVPR_TIPOREF = 62 AND MVPR_IDREF = NEW.EGRE_ID;
        end
    ELSE
        INSERT INTO MOVIMIENTO_PROVEEDOR (MVPR_ID, TERC_NIT, MVPR_TIPOREF, MVPR_IDREF, MVPR_FECHA, MVPR_VENCE, MVPR_CONC, MVPR_MONTO, MVPR_RTFTE, MVPR_RTIVA, MVPR_RTICA, MVPR_DEBITO, MVPR_ABONO, MVPR_PREFIJO, MVPR_NUMERO, MVPR_TRM)
            VALUES (GEN_ID(ID_MOVPROV, 1), :NIT, 62, NEW.EGRE_ID, :FEC, :FEC, :CONCEPTO, (NEW.EGDE_ABONO+NEW.egde_dtof), NEW.EGDE_RTFTE, NEW.EGDE_RTIVA, NEW.EGDE_RTICA, 'N', 'S', :PREFIJO, :NUMERO, :TRM);
    END
END
^

SET TERM ; ^

ALTER TABLE RECIBOS_CAJA_CRUCEC
ADD RCCR_DIFCAMBIO T_MONTO;

SET TERM ^ ;

create trigger RECIBOS_CAJA_CRUCEC_BI for RECIBOS_CAJA_CRUCEC
active BEFORE INSERT position 0
as
declare variable PREGTASA CHAR(2);
declare variable TRM NUMERIC(18,2);
declare variable SALDO NUMERIC(18,2);
declare variable SALDOM NUMERIC(18,2);
declare variable RETES CHAR(2);
begin
/* SI TRM <> 1 CONVIERTA A PESOS LOS VALORES */
EXECUTE PROCEDURE LEE_CONFIGURACION('GENERAL', 'GENERAL', 'PREGUNTAR TASA DE CAMBIO EN DOCUMENTOS DE CUENTAS POR PAGAR') returning_values (:pregtasa);
if (PREGTASA = 'SI') then
    BEGIN
    SELECT RECA_TRM FROM recibos_caja WHERE RECA_ID = NEW.reca_id INTO :TRM;
    NEW.rccr_abono = NEW.rccr_abono * :trm;
    NEW.rccr_rtfte = NEW.rccr_rtfte * :trm;
    NEW.rccr_rtiva = NEW.rccr_rtiva * :trm;
    NEW.rccr_rtica = NEW.rccr_rtica * :trm;
    NEW.rccr_dtof = NEW.rccr_dtof * :trm;
    /* VERIFIQUE LOS SALDOS Y LLEVE LA DIFERENCIA COMO DIF EN CAMBIO */
    execute procedure lee_configuracion('CXPAGAR', 'SALDOS', 'DESCONTAR RETENCIONES POR CAUSACION') returning_values (RETES);
    execute procedure saldo_doc_cxpagar(new.rccr_tipodoc, new.rccr_iddoc, '9999/12/31', 0) returning_values(saldo);
    if (SALDO < 0) then
        BEGIN
        if (RETES = 'SI') then
            begin
            if (saldo > NEW.rccr_abono) then
                BEGIN
                execute procedure saldo_doc_cxpagar(new.rccr_tipodoc, new.rccr_iddoc, '9999/12/31', 1) returning_values(saldoM);
                if (saldoM > (NEW.rccr_abono/:TRM)) then
                    EXCEPTION DOCUMENTO_ABONO_MAYOR 'EL SALDO DEL DOCUMENTO ' || NEW.rccr_prefijo || NEW.rccr_numero || ' ES INSUFICIENTE.';
                else
                    BEGIN
                    NEW.rccr_difcambio = :SALDO - NEW.rccr_abono;
                    NEW.rccr_abono = NEW.rccr_abono - NEW.rccr_difcambio;
                    END
                END
            end
        ELSE
            begin
            if (saldo > (NEW.rccr_abono + NEW.rccr_rtfte + NEW.rccr_rtiva + NEW.rccr_rtica)) then
                begin
                execute procedure saldo_doc_cxpagar(new.rccr_tipodoc, new.rccr_iddoc, '9999/12/31', 1) returning_values(saldoM);
                if (saldoM > ((NEW.rccr_abono+NEW.rccr_rtfte+NEW.rccr_rtiva+NEW.rccr_rtica)/:TRM)) then
                    EXCEPTION DOCUMENTO_ABONO_MAYOR 'EL SALDO DEL DOCUMENTO ' || NEW.rccr_prefijo || NEW.rccr_numero || ' ES INSUFICIENTE.';
                else
                    BEGIN
                    NEW.rccr_difcambio = :SALDO - (NEW.rccr_abono+NEW.rccr_rtfte+NEW.rccr_rtiva+NEW.rccr_rtica);
                    NEW.rccr_abono = NEW.rccr_abono - NEW.rccr_difcambio;
                    END
                end
            end
        END
    else
        BEGIN
        if (RETES = 'SI') then
            begin
            if (saldo < NEW.rccr_abono) then
                BEGIN
                execute procedure saldo_doc_cxpagar(new.rccr_tipodoc, new.rccr_iddoc, '9999/12/31', 1) returning_values(saldoM);
                if (saldoM < (NEW.rccr_abono/:TRM)) then
                    EXCEPTION DOCUMENTO_ABONO_MAYOR 'EL SALDO DEL DOCUMENTO ' || NEW.rccr_prefijo || NEW.rccr_numero || ' ES INSUFICIENTE.';
                else
                    BEGIN
                    NEW.rccr_difcambio = :SALDO - NEW.rccr_abono;
                    NEW.rccr_abono = NEW.rccr_abono - NEW.rccr_difcambio;
                    END
                END
            end
        ELSE
            begin
            if (saldo < (NEW.rccr_abono + NEW.rccr_rtfte + NEW.rccr_rtiva + NEW.rccr_rtica)) then
                begin
                execute procedure saldo_doc_cxpagar(new.rccr_tipodoc, new.rccr_iddoc, '9999/12/31', 1) returning_values(saldoM);
                if (saldoM < ((NEW.rccr_abono+NEW.rccr_rtfte+NEW.rccr_rtiva+NEW.rccr_rtica)/:TRM)) then
                    EXCEPTION DOCUMENTO_ABONO_MAYOR 'EL SALDO DEL DOCUMENTO ' || NEW.rccr_prefijo || NEW.rccr_numero || ' ES INSUFICIENTE.';
                else
                    BEGIN
                    NEW.rccr_difcambio = :SALDO - (NEW.rccr_abono+NEW.rccr_rtfte+NEW.rccr_rtiva+NEW.rccr_rtica);
                    NEW.rccr_abono = NEW.rccr_abono - NEW.rccr_difcambio;
                    END
                end
            end
        END
    end
end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER RECIBOS_CAJA_CRUCEC_AI FOR RECIBOS_CAJA_CRUCEC
ACTIVE AFTER INSERT POSITION 0
AS
declare variable EXISTE CHAR(1);
declare variable FEC DATE;
declare variable NIT VARCHAR(20);
declare variable CONCEPTO VARCHAR(60);
declare variable PREFIJO VARCHAR(4);
declare variable NUMERO VARCHAR(6);
declare variable OK CHAR(1);
declare variable RETES CHAR(2);
declare variable SALDO NUMERIC(18,2);
declare variable TRM NUMERIC(18,2);
BEGIN
/* Abone el documento referenciado  */
select PREF_PRE, RECA_NUMERO, RECA_FECHA, RECA_CONC, TERC_NIT, RECA_TRM
    from RECIBOS_CAJA where RECA_ID = new.reca_id into :PREFIJO, :NUMERO, :FEC, :CONCEPTO, :NIT, :TRM;
if ((NEW.RECA_ID <> 0) and (new.rccr_anulado = 'N')) then
    BEGIN
    OK = 'N';
    /* valide que no se pase del saldo */
    execute procedure saldo_doc_cxpagar(new.rccr_tipodoc, new.rccr_iddoc, '9999/12/31', 0) returning_values(saldo);
    execute procedure lee_configuracion('CXPAGAR', 'SALDOS', 'DESCONTAR RETENCIONES POR CAUSACION') returning_values (RETES);
    if (SALDO < 0) then
        BEGIN
        if (RETES = 'SI') then
            begin
            if (saldo > NEW.rccr_abono) then
                EXCEPTION DOCUMENTO_ABONO_MAYOR;
            end
        ELSE
            begin
            if (saldo > (NEW.rccr_abono + NEW.rccr_rtfte + NEW.rccr_rtiva + NEW.rccr_rtica + new.rccr_dtof)) then
                EXCEPTION DOCUMENTO_ABONO_MAYOR;
            end
        END
    else
        BEGIN
        if (RETES = 'SI') then
            begin
            if (saldo < NEW.rccr_abono) then
                EXCEPTION DOCUMENTO_ABONO_MAYOR;
            end
        ELSE
            begin
            if (saldo < (NEW.rccr_abono + NEW.rccr_rtfte + NEW.rccr_rtiva + NEW.rccr_rtica + NEW.rccr_dtof)) then
                EXCEPTION DOCUMENTO_ABONO_MAYOR;
            end
        END
    if (OK = 'N') then
        BEGIN
        select 'S' from saldos_doc_cxpagar where sdcp_tiporef = new.rccr_tipodoc and
            sdcp_idref = new.rccr_iddoc and sdcp_fecha = :FEC into :EXISTE;
        if (Existe = 'S') then
            begin
            /* actualice el saldo del dia */
            UPDATE saldos_doc_cxpagar
                SET SDCP_ABONO = SDCP_ABONO + (NEW.rccr_abono + NEW.rccr_dtof),
                    SDCP_ABRTFTE = SDCP_ABRTFTE + NEW.rccr_rtfte,
                    SDCP_ABRTIVA = SDCP_ABRTIVA + NEW.rccr_rtiva,
                    SDCP_ABRTICA = SDCP_ABRTICA + NEW.rccr_rtica,
                    SDCP_TRM = :TRM
                WHERE SDCP_TIPOREF = NEW.rccr_tipodoc AND SDCP_IDREF = NEW.rccr_iddoc AND SDCP_FECHA = :FEC;
            END
        ELSE
            BEGIN
            /* Inserte un nuevo saldo diario */
            INSERT INTO SALDOS_DOC_CXPAGAR (SDCP_TIPOREF, SDCP_IDREF, SDCP_FECHA, TERC_NIT, SDCP_RTEFTE, SDCP_RTIVA, SDCP_RTICA, SDCP_ABONO, SDCP_ABRTFTE, SDCP_ABRTIVA, SDCP_ABRTICA, SDCP_DEBITO, SDCP_MONTO, SDCP_TRM)
                VALUES (NEW.rccr_tipodoc, NEW.rccr_iddoc, :FEC, :NIT, 0, 0, 0, (NEW.rccr_abono+NEW.rccr_dtof), NEW.rccr_rtfte, NEW.rccr_rtiva, NEW.rccr_rtica, 'N', 0, :TRM);
            END
        END
    /* actualice el registro en mov_proveedor (por si son varios items) */
    EXISTE = 'N';
    SELECT 'S' FROM MOVIMIENTO_PROVEEDOR WHERE MVPR_TIPOREF = 61 AND MVPR_IDREF = NEW.reca_id INTO :EXISTE;
    if (EXISTE = 'S') then
        begin
        UPDATE movimiento_proveedor
            SET MVPR_MONTO = MVPR_MONTO + (NEW.rccr_abono + NEW.rccr_dtof),
                MVPR_RTFTE = MVPR_RTFTE + NEW.rccr_rtfte,
                MVPR_RTIVA = MVPR_RTIVA + NEW.rccr_rtiva,
                MVPR_RTICA = MVPR_RTICA + NEW.rccr_rtica,
                MVPR_TRM = :TRM
            WHERE MVPR_TIPOREF = 61 AND MVPR_IDREF = NEW.reca_id;
        end
    ELSE
        INSERT INTO MOVIMIENTO_PROVEEDOR (MVPR_ID, TERC_NIT, MVPR_TIPOREF, MVPR_IDREF, MVPR_FECHA, MVPR_VENCE, MVPR_CONC, MVPR_MONTO, MVPR_RTFTE, MVPR_RTIVA, MVPR_RTICA, MVPR_DEBITO, MVPR_ABONO, MVPR_PREFIJO, MVPR_NUMERO, MVPR_TRM)
            VALUES (GEN_ID(ID_MOVPROV, 1), :NIT, 61, NEW.reca_id, :FEC, :FEC, :CONCEPTO, (NEW.rccr_abono+NEW.rccr_dtof), NEW.rccr_rtfte, NEW.rccr_rtiva, NEW.rccr_rtica, 'N', 'S', :PREFIJO, :NUMERO, :TRM);
    END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER RECIBOS_CAJA_CRUCEC_AU FOR RECIBOS_CAJA_CRUCEC
ACTIVE AFTER UPDATE POSITION 0
as
declare variable EXISTE CHAR(1);
declare variable FEC DATE;
declare variable NIT VARCHAR(20);
declare variable CONCEPTO VARCHAR(60);
declare variable PREFIJO VARCHAR(4);
declare variable NUMERO VARCHAR(6);
declare variable RETES CHAR(2);
declare variable SALDO NUMERIC(18,2);
declare variable TRM NUMERIC(18,2);
BEGIN
select PREF_PRE, RECA_NUMERO, RECA_FECHA, RECA_CONC, TERC_NIT, RECA_TRM from RECIBOS_CAJA
    where reca_id = new.reca_id into :PREFIJO, :NUMERO, :FEC, :CONCEPTO, :NIT, :TRM;
if ((OLD.reca_id <> 0) and (old.rccr_anulado = 'N')) then
    BEGIN
    EXISTE = 'N';
    select 'S' from saldos_doc_cxpagar where sdcp_tiporef = old.rccr_tipodoc and
        sdcp_idref = old.rccr_iddoc and sdcp_fecha = :FEC into :EXISTE;
    if (Existe = 'S') then
        UPDATE saldos_doc_cxpagar
            SET SDCP_ABONO = SDCP_ABONO - (old.rccr_abono + OLD.rccr_dtof),
            SDCP_ABRTFTE = SDCP_ABRTFTE - old.rccr_rtfte,
            SDCP_ABRTIVA = SDCP_ABRTIVA - old.rccr_rtiva,
            SDCP_ABRTICA = SDCP_ABRTICA - old.rccr_rtica
            WHERE SDCP_TIPOREF = OLD.rccr_tipodoc AND SDCP_IDREF = OLD.rccr_iddoc AND SDCP_FECHA = :FEC;
    EXISTE = 'N';
    SELECT 'S' FROM MOVIMIENTO_PROVEEDOR WHERE MVPR_TIPOREF = 61 AND MVPR_IDREF = OLD.reca_id INTO :EXISTE;
    if (EXISTE = 'S') then
        UPDATE movimiento_proveedor
            SET MVPR_MONTO = MVPR_MONTO - (OLD.rccr_abono + OLD.rccr_dtof),
            MVPR_RTFTE = MVPR_RTFTE - OLD.rccr_rtfte,
            MVPR_RTIVA = MVPR_RTIVA - OLD.rccr_rtiva,
            MVPR_RTICA = MVPR_RTICA - OLD.rccr_rtica
            WHERE MVPR_TIPOREF = 61 AND MVPR_IDREF = OLD.reca_id;
    END
if ((NEW.reca_id <> 0) and (NEW.rccr_anulado = 'N')) then
    BEGIN
    /* valide que no se pase del saldo */
/*    execute procedure saldo_doc_cxpagar(new.rccr_tipodoc, new.rccr_iddoc, '9999/12/31') returning_values(saldo);*/
    execute procedure lee_configuracion('CXPAGAR', 'SALDOS', 'DESCONTAR RETENCIONES POR CAUSACION') returning_values (RETES);
    if (SALDO < 0) then
        BEGIN
        if (RETES = 'SI') then
            begin
            if (saldo > NEW.rccr_abono) then
                EXCEPTION DOCUMENTO_ABONO_MAYOR;
            end
        ELSE
            begin
            if (saldo > (NEW.rccr_abono + NEW.rccr_rtfte + NEW.rccr_rtiva + NEW.rccr_rtica + new.rccr_dtof)) then
                EXCEPTION DOCUMENTO_ABONO_MAYOR;
            end
        END
    else
        BEGIN
        if (RETES = 'SI') then
            begin
            if (saldo < NEW.rccr_abono) then
                EXCEPTION DOCUMENTO_ABONO_MAYOR;
            end
        ELSE
            begin
            if (saldo < (NEW.rccr_abono + NEW.rccr_rtfte + NEW.rccr_rtiva + NEW.rccr_rtica + NEW.rccr_dtof)) then
                EXCEPTION DOCUMENTO_ABONO_MAYOR;
            end
        END
    /* AHORA REGISTRE LO NUEVO */
    EXISTE = 'N';
    select 'S' from saldos_doc_cxpagar where sdcp_tiporef = new.rccr_tipodoc and
        sdcp_idref = new.rccr_iddoc and sdcp_fecha = :FEC into :EXISTE;
    if (Existe = 'S') then
        UPDATE saldos_doc_cxpagar
            SET SDCP_ABONO = SDCP_ABONO + (NEW.rccr_abono + NEW.rccr_dtof),
            SDCP_ABRTFTE = SDCP_ABRTFTE + NEW.rccr_rtfte,
            SDCP_ABRTIVA = SDCP_ABRTIVA + NEW.rccr_rtiva,
            SDCP_ABRTICA = SDCP_ABRTICA + NEW.rccr_rtica,
            SDCP_TRM = :TRM
            WHERE SDCP_TIPOREF = NEW.rccr_tipodoc AND SDCP_IDREF = NEW.rccr_iddoc AND SDCP_FECHA = :FEC;
    else
        INSERT INTO SALDOS_DOC_CXPAGAR (SDCP_TIPOREF, SDCP_IDREF, SDCP_FECHA, TERC_NIT, SDCP_RTEFTE, SDCP_RTIVA, SDCP_RTICA, SDCP_ABONO, SDCP_ABRTFTE, SDCP_ABRTIVA, SDCP_ABRTICA, SDCP_DEBITO, SDCP_MONTO, SDCP_TRM)
            VALUES (NEW.rccr_tipodoc, NEW.rccr_iddoc, :FEC, :NIT, 0, 0, 0, (NEW.rccr_abono + NEW.rccr_dtof), NEW.rccr_rtfte, NEW.rccr_rtiva, NEW.rccr_rtica, 'N', 0, :TRM);
    /* Registre o actualice el registro en movimiento_proveedor */
    EXISTE = 'N';
    SELECT 'S' FROM MOVIMIENTO_PROVEEDOR WHERE MVPR_TIPOREF = 61 AND MVPR_IDREF = NEW.reca_id INTO :EXISTE;
    if (EXISTE = 'S') then
        /* Actualice el nuevo */
        UPDATE movimiento_proveedor
            SET MVPR_MONTO = MVPR_MONTO + (NEW.rccr_abono + NEW.rccr_dtof),
                MVPR_RTFTE = MVPR_RTFTE + NEW.rccr_rtfte,
                MVPR_RTIVA = MVPR_RTIVA + NEW.rccr_rtiva,
                MVPR_RTICA = MVPR_RTICA + NEW.rccr_rtica,
                MVPR_TRM = :TRM
            WHERE MVPR_TIPOREF = 61 AND MVPR_IDREF = NEW.reca_id;
    ELSE
        INSERT INTO MOVIMIENTO_PROVEEDOR (MVPR_ID, TERC_NIT, MVPR_TIPOREF, MVPR_IDREF, MVPR_FECHA, MVPR_VENCE, MVPR_CONC, MVPR_MONTO, MVPR_RTFTE, MVPR_RTIVA, MVPR_RTICA, MVPR_DEBITO, MVPR_ABONO, MVPR_PREFIJO, MVPR_NUMERO, MVPR_TRM)
            VALUES (GEN_ID(ID_MOVPROV, 1), :NIT, 61, NEW.reca_id, :FEC, :FEC, :CONCEPTO, (NEW.rccr_abono + NEW.rccr_dtof), NEW.rccr_rtfte, NEW.rccr_rtiva, NEW.rccr_rtica, 'N', 'S', :PREFIJO, :NUMERO, :TRM);
    end
END
^

SET TERM ; ^


SET TERM ^ ;

CREATE OR ALTER TRIGGER EGRESOS_DETALLE_BI FOR EGRESOS_DETALLE
ACTIVE BEFORE INSERT POSITION 0
as
declare variable PREGTASA CHAR(2);
declare variable TRM NUMERIC(18,2);
declare variable TRMDOC NUMERIC(18,2);
begin
/* SI TRM <> 1 CONVIERTA A PESOS LOS VALORES */
EXECUTE PROCEDURE LEE_CONFIGURACION('GENERAL', 'GENERAL', 'PREGUNTAR TASA DE CAMBIO EN DOCUMENTOS DE CUENTAS POR PAGAR') returning_values (:pregtasa);
if (PREGTASA = 'SI') then
    BEGIN
    SELECT EGRE_TRM FROM EGRESOS WHERE EGRE_ID = NEW.egre_id INTO :TRM;
    SELECT MVPR_TRM FROM MOVIMIENTO_PROVEEDOR M WHERE M.mvpr_tiporef = NEW.egde_tipodoc AND M.mvpr_idref = NEW.egde_iddoc INTO :TRMDOC;
    NEW.egde_difcambio = (NEW.egde_abono + NEW.egde_dtof) * (TRM - TRMDOC);
    NEW.egde_abono = NEW.egde_abono * :trmdoc;
    NEW.egde_rtfte = NEW.egde_rtfte * :trmdoc;
    NEW.egde_rtiva = NEW.egde_rtiva * :trmdoc;
    NEW.egde_rtica = NEW.egde_rtica * :trmdoc;
    NEW.egde_dtof = NEW.egde_dtof * :trmdoc;
    END
END
^

SET TERM ; ^


SET TERM ^ ;

create trigger EGRESOS_CAJA_BI for EGRESOS_CAJA
active BEFORE INSERT position 0
as
declare variable PREGTASA CHAR(2);
declare variable TRM NUMERIC(18,2);
begin
/* SI TRM <> 1 CONVIERTA A PESOS LOS VALORES */
EXECUTE PROCEDURE LEE_CONFIGURACION('GENERAL', 'GENERAL', 'PREGUNTAR TASA DE CAMBIO EN DOCUMENTOS DE CUENTAS POR PAGAR') returning_values (:pregtasa);
if (PREGTASA = 'SI') then
    BEGIN
    SELECT EGRE_TRM FROM EGRESOS WHERE EGRE_ID = NEW.egre_id INTO :TRM;
    NEW.egca_monto = NEW.egca_monto * :trm;
    END
end
^

SET TERM ; ^

SET TERM ^ ;

create trigger EGRESOS_BANCO_BI for EGRESOS_BANCO
active BEFORE INSERT position 0
as
declare variable PREGTASA CHAR(2);
declare variable TRM NUMERIC(18,2);
begin
/* SI TRM <> 1 CONVIERTA A PESOS LOS VALORES */
EXECUTE PROCEDURE LEE_CONFIGURACION('GENERAL', 'GENERAL', 'PREGUNTAR TASA DE CAMBIO EN DOCUMENTOS DE CUENTAS POR PAGAR') returning_values (:pregtasa);
if (PREGTASA = 'SI') then
    BEGIN
    SELECT EGRE_TRM FROM EGRESOS WHERE EGRE_ID = NEW.egre_id INTO :TRM;
    NEW.egbc_monto = NEW.egbc_monto * :trm;
    END
end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER EGRESOS_CRUCEC_BI FOR EGRESOS_CRUCEC
ACTIVE BEFORE INSERT POSITION 0
as
declare variable PREGTASA CHAR(2);
declare variable TRM NUMERIC(18,2);
declare variable TRMDOC NUMERIC(18,2);
begin
if (NEW.egcc_sucursal IS NULL) then
    NEW.egcc_sucursal = '01';
/* SI TRM <> 1 CONVIERTA A PESOS LOS VALORES */
EXECUTE PROCEDURE LEE_CONFIGURACION('GENERAL', 'GENERAL', 'PREGUNTAR TASA DE CAMBIO EN DOCUMENTOS DE CARTERA') returning_values (:pregtasa);
if (PREGTASA = 'SI') then
    BEGIN
    SELECT EGRE_TRM FROM egresos WHERE EGRE_ID = NEW.egre_id INTO :TRM;
    SELECT MVCL_TRM FROM movimiento_clientes M WHERE M.mvcl_tiporef = NEW.egcc_tipodoc AND M.mvcl_idref = NEW.egcc_iddoc INTO :TRMDOC;
    NEW.egcc_difcambio = (NEW.egcc_abono + NEW.egcc_dtof) * (TRM - TRMDOC);
    NEW.egcc_abono = NEW.egcc_abono * :trmdoc;
    NEW.egcc_rtfte = NEW.egcc_rtfte * :trmdoc;
    NEW.egcc_rtiva = NEW.egcc_rtiva * :trmdoc;
    NEW.egcc_rtica = NEW.egcc_rtica * :trmdoc;
    NEW.egcc_dtof = NEW.egcc_dtof * :trmdoc;
    END
end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER PROCEDURE SALDO_DOC_CARTERA(
    TIPO INTEGER,
    ID INTEGER,
    FECHA DATE,
    MONEDA INTEGER)
RETURNS (
    SALDO NUMERIC(18,2))
AS
declare variable DESC_RTES CHAR(2);
declare variable AUTORET VARCHAR(10);
declare variable FAUTORET DATE;
declare variable FECDOC DATE;
declare variable TRM NUMERIC(18,2);
BEGIN
EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'DESCONTAR RETENCIONES POR CAUSACION') returning_values (DESC_RTES);
EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'FECHA AUTORETENEDOR NO DESCONTAR RETENCIONES DEL SALDO PERO SI CONTABILIZARLAS') returning_values (AUTORET);
if (AUTORET <> '') then
    FAUTORET = CAST(AUTORET AS DATE);
else
    FAUTORET = '9999/12/31';
/* BUSQUE LA FECHA DEL DOCUMENTO */
SELECT MIN(SDCA_FECHA) FROM SALDOS_DOC_CARTERA WHERE (SDCA_TIPOREF = :TIPO) AND (SDCA_IDREF = :ID) AND (SDCA_MONTO <> 0) INTO :FECDOC;
if (FAUTORET <= FECDOC) then
    if (DESC_RTES = 'SI') then
        SELECT sum(SDCA_MONTO-SDCA_ABONO-SDCA_RTIVA-SDCA_RTICA) FROM saldos_doc_cartera
            WHERE (SDCA_TIPOREF = :TIPO) AND (SDCA_IDREF = :ID) AND (SDCA_FECHA <= :FECHA) INTO :SALDO;
    ELSE
        SELECT sum(SDCA_MONTO-SDCA_ABONO-SDCA_ABRTIVA-SDCA_ABRTICA) FROM saldos_doc_cartera
            WHERE (SDCA_TIPOREF = :TIPO) AND (SDCA_IDREF = :ID) AND (SDCA_FECHA <= :FECHA) INTO :SALDO;
ELSE
    if (DESC_RTES = 'SI') then
        SELECT sum(SDCA_MONTO-SDCA_ABONO-SDCA_RTFTE-SDCA_RTIVA-SDCA_RTICA) FROM saldos_doc_cartera
            WHERE (SDCA_TIPOREF = :TIPO) AND (SDCA_IDREF = :ID) AND (SDCA_FECHA <= :FECHA) INTO :SALDO;
    ELSE
        SELECT sum(SDCA_MONTO-SDCA_ABONO-SDCA_ABRTFTE-SDCA_ABRTIVA-SDCA_ABRTICA) FROM saldos_doc_cartera
            WHERE (SDCA_TIPOREF = :TIPO) AND (SDCA_IDREF = :ID) AND (SDCA_FECHA <= :FECHA) INTO :SALDO;

if (SALDO IS NULL) then
    SALDO = 0;
if (MONEDA <> 0) then
    BEGIN
    SELECT MVCL_TRM FROM movimiento_clientes M WHERE M.mvcl_tiporef = :tipo AND M.mvcl_idref = :id INTO :TRM;
    if (TRM <> 0) then
        SALDO = SALDO / TRM;
    END
SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE BUSCAR_DEVOLCHEQ(
    CUENTA INTEGER)
RETURNS (
    ID INTEGER,
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    NOMTERC VARCHAR(60),
    MONTO NUMERIC(18,2),
    CODCTA VARCHAR(30),
    CHNUMERO VARCHAR(20),
    CHCUENTA VARCHAR(20),
    CHBANCO VARCHAR(2),
    ANULAR CHAR(1),
    SALDO NUMERIC(18,2))
AS
begin /*$$IBE$$ 
for select dvch_id, prba_pref, dvch_numdoc, dvch_fecha, dvch_nomterc, dvch_monto, cuba_codcta,
    dvch_nroch, dvch_cuenta, dvch_banco, dvch_anulado
    from devolucion_cheques ch, cuentas_banco c where ch.cuba_cod = c.cuba_cod and ch.cuba_cod = :CUENTA
    INTO :ID, :prefijo, :numero, :fecha, :nomterc, :monto, :codcta, :chnumero, :chcuenta, :chbanco, :anular
    do
    begin
    execute procedure saldo_doc_cartera(77, :id,  '2099-12-31', 0) returning_values (:SALDO);
    suspend;
    end
SUSPEND;
 $$IBE$$*/ SUSPEND;
end
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE BUSCA_ID_DOC_CARTERA(
    TIPO INTEGER,
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(6),
    NIT VARCHAR(20),
    FECHA DATE,
    MONEDA INTEGER)
RETURNS (
    ID INTEGER,
    SALDO NUMERIC(18,2),
    RTFTE NUMERIC(18,2),
    RTIVA NUMERIC(18,2),
    RTICA NUMERIC(18,2),
    DTOF NUMERIC(18,2),
    ERROR INTEGER)
AS
declare variable vernit varchar(20);
declare variable fec date;
declare variable fecdto date;
declare variable desc_rtes char(2);
declare variable dtoapl numeric(18,2);
declare variable AUTORET VARCHAR(10);
declare variable FAUTORET DATE;
declare variable FECDOC DATE;
declare variable TRM numeric(18,2);
BEGIN /*$$IBE$$ 
ID = 0;
ERROR = 0;
EXECUTE PROCEDURE COMPLETA_CEROS(NUMERO) returning_values (NUMERO);
if (TIPO = 41) then
    SELECT NDCL_ID, TERC_NIT, NDCL_FECHA, NDCL_DTOFMONTO, NDCL_FECHADTO, NDCL_TRM
        FROM NOTAS_DEBITO_CLIENTES WHERE PREF_PRE = :PREFIJO AND NDCL_NUMERO = :NUMERO
        INTO :ID, :VERNIT, :FEC, :DTOF, :FECDTO, :TRM;
if (TIPO = 42) then
    SELECT NCCL_ID, TERC_NIT, NCCL_FECHA, 0, NCCL_FECHA, 1
        FROM NOTAS_CREDITO_CLIENTES WHERE PREF_PRE = :PREFIJO AND NCCL_NUMERO = :NUMERO
        INTO :ID, :VERNIT, :FEC, :DTOF, :FECDTO, :TRM;
if (TIPO = 45) then
    SELECT ANCL_ID, TERC_NIT, ANCL_FECHA, ANCL_DTOFMONTO, ANCL_DTOFECHA, ANCL_TRM
        FROM ANTICIPOS_CLIENTE WHERE PREF_PRE = :PREFIJO AND ANCL_NUMERO = :NUMERO
        INTO :ID, :VERNIT, :FEC, :DTOF, :FECDTO, :TRM;
if (TIPO = 31) then
    SELECT FACT_ID, TERC_NIT, FACT_FECHA, FACT_DTOFMONTO, FACT_DTOFFECHA, FACT_TRM
        FROM FACTURAS WHERE PREF_PRE = :PREFIJO AND FACT_NUMERO = :NUMERO
        INTO :ID, :VERNIT, :FEC, :DTOF, :FECDTO, :TRM;
if (TIPO = 33) then
    SELECT DEVT_ID, TERC_NIT, DEVT_FECHA, 0, DEVT_FECHA, 1 FROM devoluciones_ventas
        WHERE PREF_PRE = :PREFIJO AND DEVT_NUMERO = :NUMERO INTO :ID, :VERNIT, :FEC, :DTOF, :FECDTO, :TRM;
if (TIPO = 77) then
    SELECT DVCH_ID, TERC_NIT, DVCH_FECHA, 0, DVCH_FECHA, 1 FROM devolucion_cheques
        WHERE PRBA_PREf = :PREFIJO AND DVCH_NUMDOC = :NUMERO INTO :ID, :VERNIT, :FEC, :DTOF, :FECDTO, :TRM;
if (FECHA > FECDTO) then
    DTOF = 0;
if (DTOF IS NULL) then
    DTOF = 0;
if (DTOF <> 0) then
    BEGIN
    if ((MONEDA <> 0) AND (TRM <> 0)) then
        DTOF = DTOF / TRM;
    if (MONEDA = 0) then
        SELECT SUM(RCDE_DTOF) FROM RECIBOS_CAJA_DETALLE WHERE RCDE_IDDOC = :ID AND RCDE_TIPODOC = :TIPO INTO :DTOAPL;
    else
        SELECT SUM(RCDE_DTOF/RECA_TRM) FROM RECIBOS_CAJA_DETALLE D, RECIBOS_CAJA R
            WHERE R.reca_id = D.reca_id AND RCDE_IDDOC = :ID AND RCDE_TIPODOC = :TIPO INTO :DTOAPL;
    if (DTOAPL IS NULL) then
        DTOAPL = 0;
    DTOF = DTOF - DTOAPL;
    END
IF (ID = 0) then
    ERROR = 1;
ELSE
  BEGIN
  if (VERNIT <> NIT) then
    ERROR = 2;
  else
    BEGIN
     $$IBE$$*/ /* VERIFIQUE QUE LA FECHA DEL ABONO SEA POSTERIOR O IGUAL AL DOC */ /*$$IBE$$ 
    if (FEC > FECHA) then
        ERROR = 3;
    else
        begin
         $$IBE$$*/ /* CALCULE LOS SALDOS */ /*$$IBE$$ 
        if (MONEDA = 0) then
          SELECT SUM(SDCA_MONTO - SDCA_ABONO), SUM(SDCA_RTFTE - SDCA_ABRTFTE), SUM(SDCA_RTIVA - SDCA_ABRTIVA), SUM(SDCA_RTICA - SDCA_ABRTICA)
            FROM SALDOS_DOC_CARTERA WHERE SDCA_TIPOREF = :TIPO AND SDCA_IDREF = :ID
            INTO :SALDO, :RTFTE, :RTIVA, :RTICA;
        else
          SELECT SUM((SDCA_MONTO - SDCA_ABONO)/SDCA_TRM), SUM((SDCA_RTFTE - SDCA_ABRTFTE)/SDCA_TRM), SUM((SDCA_RTIVA - SDCA_ABRTIVA)/SDCA_TRM), SUM((SDCA_RTICA - SDCA_ABRTICA)/SDCA_TRM)
            FROM SALDOS_DOC_CARTERA WHERE SDCA_TIPOREF = :TIPO AND SDCA_IDREF = :ID
            INTO :SALDO, :RTFTE, :RTIVA, :RTICA;
        if ((TIPO = 31) or (TIPO = 41) or (TIPO = 77)) then
            begin
            if ((RTFTE IS NULL) or (RTFTE < 0))  then
                RTFTE = 0;
            if ((RTIVA IS NULL) or (RTIVA < 0 ))  then
                RTIVA = 0;
            if ((RTICA IS NULL) or (RTICA < 0))  then
                RTICA = 0;
            end
        if ((TIPO = 33) or (TIPO = 42) or (TIPO = 45)) then
            begin
            if ((RTFTE IS NULL) or (RTFTE > 0))  then
                RTFTE = 0;
            if ((RTIVA IS NULL) or (RTIVA > 0 ))  then
                RTIVA = 0;
            if ((RTICA IS NULL) or (RTICA > 0))  then
                RTICA = 0;
            end
         $$IBE$$*/ /* TRAIGA EL SALDO NETO */ /*$$IBE$$ 
        EXECUTE PROCEDURE SALDO_DOC_CARTERA(TIPO, ID, FECHA, MONEDA) returning_values (SALDO);
        if (SALDO = 0) then
            ERROR = 4;
        ELSE
            BEGIN
            EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'FECHA AUTORETENEDOR NO DESCONTAR RETENCIONES DEL SALDO PERO SI CONTABILIZARLAS') returning_values (AUTORET);
            if (AUTORET <> '') then
                FAUTORET = CAST(AUTORET AS DATE);
            else
                FAUTORET = '9999/12/31';
             $$IBE$$*/ /* BUSQUE LA FECHA DEL DOCUMENTO */ /*$$IBE$$ 
            SELECT MIN(SDCA_FECHA) FROM SALDOS_DOC_CARTERA WHERE (SDCA_TIPOREF = :TIPO) AND (SDCA_IDREF = :ID) AND (SDCA_MONTO <> 0) INTO :FECDOC;
            if (FAUTORET <= FECDOC) then
                BEGIN
                RTFTE = 0;
                RTIVA = 0;
                RTICA = 0;
                END
             $$IBE$$*/ /* RESTE LAS RETENCIONES YA QUE SE SUGERIRAN */ /*$$IBE$$ 
            EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'DESCONTAR RETENCIONES POR CAUSACION') returning_values (DESC_RTES);
            if (DESC_RTES = 'NO') then
                SALDO = SALDO - RTFTE - RTIVA - RTICA;
            SALDO = SALDO - DTOF;
            END
        end
    END
  end
SUSPEND;
 $$IBE$$*/ SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE CHEQUEO_SALDOS_DOC_CARTERA(
    CLIINI VARCHAR(20),
    CLIFIN VARCHAR(20))
RETURNS (
    ERROR VARCHAR(60),
    TIPO INTEGER,
    ID INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(6))
AS
declare variable FECHA DATE;
declare variable NIT VARCHAR(20);
declare variable RTFTE NUMERIC(18, 2);
declare variable RTIVA NUMERIC(18, 2);
declare variable RTICA NUMERIC(18, 2);
declare variable MONTO NUMERIC(18, 2);
declare variable EXISTE CHAR(1);
declare variable IDR INTEGER;
declare variable RECAID INTEGER;
declare variable TRM NUMERIC(18, 2);
BEGIN /*$$IBE$$ 
DELETE FROM SALDOS_DOC_CARTERA WHERE TERC_NIT >= :CLIINI AND TERC_NIT <= :CLIFIN;
DELETE FROM ANTICIPOS_CLIENTE WHERE RECA_ID = 0;

FOR SELECT FACT_ID, FACT_FECHA, TERC_NIT, FACT_RTFTEMONTO, FACT_rtivamonto, FACT_rticamonto, FACT_TOTAL, FACT_TRM
    FROM FACTURAS WHERE FACT_ID <> 0 and fact_anulado = 'N' AND TERC_NIT >= :CLIINI AND TERC_NIT <= :CLIFIN
    ORDER BY FACT_FECHA
    INTO :ID, :FECHA, :nit,  :RTFTE, :RTIVA, :RTICA, :MONTO, :TRM
    DO
    INSERT INTO SALDOS_DOC_CARTERA (SDCA_TIPOREF, SDCA_IDREF, SDCA_FECHA, TERC_NIT, SDCA_RTFTE, SDCA_RTIVA, SDCA_RTICA, SDCA_ABONO, SDCA_ABRTFTE, SDCA_ABRTIVA, SDCA_ABRTICA, SDCA_DEBITO, SDCA_MONTO, SDCA_TRM)
        VALUES (31, :ID, :fecha, :nit, :rtfte, :rtiva, :rtica, 0, 0, 0, 0, 'S', :MONTO, :TRM);

FOR SELECT NDCL_ID, NDCL_FECHA, TERC_NIT, NDCL_RTFTEMONTO, NDCL_rtivamonto, NDCL_rticamonto, ndcl_monto+ndcl_ivamonto, NDCL_TRM
    FROM NOTAS_DEBITO_CLIENTES WHERE NDCL_ID <> 0 and NDCL_anulado = 'N'  AND TERC_NIT >= :CLIINI AND TERC_NIT <= :CLIFIN
    ORDER BY NDCL_FECHA
    INTO :ID, :FECHA, :nit,  :RTFTE, :RTIVA, :RTICA, :MONTO, :TRM
    DO
    INSERT INTO SALDOS_DOC_CARTERA (SDCA_TIPOREF, SDCA_IDREF, SDCA_FECHA, TERC_NIT, SDCA_RTFTE, SDCA_RTIVA, SDCA_RTICA, SDCA_ABONO, SDCA_ABRTFTE, SDCA_ABRTIVA, SDCA_ABRTICA, SDCA_DEBITO, SDCA_MONTO, SDCA_TRM)
        VALUES (41, :ID, :fecha, :nit, :rtfte, :rtiva, :rtica, 0, 0, 0, 0, 'S', :MONTO, :TRM);

FOR SELECT DVCH_ID, DVCH_FECHA, TERC_NIT, 0, 0, 0, DVCH_MONTO
    FROM devolucion_cheques WHERE DVCH_ID <> 0 and DVCH_anulado = 'N' AND DVCH_CARTERA = 'S'  AND TERC_NIT >= :CLIINI AND TERC_NIT <= :CLIFIN
    ORDER BY DVCH_FECHA
    INTO :ID, :FECHA, :nit,  :RTFTE, :RTIVA, :RTICA, :MONTO
    DO
    INSERT INTO SALDOS_DOC_CARTERA (SDCA_TIPOREF, SDCA_IDREF, SDCA_FECHA, TERC_NIT, SDCA_RTFTE, SDCA_RTIVA, SDCA_RTICA, SDCA_ABONO, SDCA_ABRTFTE, SDCA_ABRTIVA, SDCA_ABRTICA, SDCA_DEBITO, SDCA_MONTO, SDCA_TRM)
        VALUES (77, :ID, :fecha, :nit, :rtfte, :rtiva, :rtica, 0, 0, 0, 0, 'S', :MONTO, 1);

FOR SELECT DEVT_ID, DEVT_FECHA, TERC_NIT, DEVT_RTFTEMONTO, DEVT_rtivamonto, DEVT_rticamonto, devt_total, DEVT_TRM
    FROM DEVOLUCIONES_VENTAS WHERE DEVT_ID <> 0 and DEVT_anulado = 'N' AND TERC_NIT >= :CLIINI AND TERC_NIT <= :CLIFIN
    ORDER BY DEVT_FECHA
    INTO :ID, :FECHA, :nit,  :RTFTE, :RTIVA, :RTICA, :MONTO, :TRM
    DO
    INSERT INTO SALDOS_DOC_CARTERA (SDCA_TIPOREF, SDCA_IDREF, SDCA_FECHA, TERC_NIT, SDCA_RTFTE, SDCA_RTIVA, SDCA_RTICA, SDCA_ABONO, SDCA_ABRTFTE, SDCA_ABRTIVA, SDCA_ABRTICA, SDCA_DEBITO, SDCA_MONTO, SDCA_TRM)
        VALUES (33, :ID, :fecha, :nit, :rtfte*-1, :rtiva*-1, :rtica*-1, 0, 0, 0, 0, 'N', :MONTO * -1, :TRM);

FOR SELECT NCCL_ID, NCCL_FECHA, TERC_NIT, NCCL_RTFTEMONTO, NCCL_rtivamonto, NCCL_rticamonto, nccl_monto+nccl_ivamonto, NCCL_TRM
    FROM NOTAS_CREDITO_CLIENTES WHERE NCCL_ID <> 0 and NCCL_anulado = 'N' AND TERC_NIT >= :CLIINI AND TERC_NIT <= :CLIFIN
    ORDER BY NCCL_FECHA
    INTO :ID, :FECHA, :nit,  :RTFTE, :RTIVA, :RTICA, :MONTO, :TRM
    DO
    INSERT INTO SALDOS_DOC_CARTERA (SDCA_TIPOREF, SDCA_IDREF, SDCA_FECHA, TERC_NIT, SDCA_RTFTE, SDCA_RTIVA, SDCA_RTICA, SDCA_ABONO, SDCA_ABRTFTE, SDCA_ABRTIVA, SDCA_ABRTICA, SDCA_DEBITO, SDCA_MONTO, SDCA_TRM)
        VALUES (42, :ID, :fecha, :nit, :rtfte*-1, :rtiva*-1, :rtica*-1, 0, 0, 0, 0, 'N', :MONTO * -1, :TRM);

FOR SELECT ANCL_ID, ANCL_FECHA, TERC_NIT, ANCL_RTFTEMONTO, ANCL_rtivamonto, ANCL_rticamonto, ancl_base+ancl_ivamonto, ANCL_TRM
    FROM ANTICIPOS_CLIENTE WHERE ANCL_ID <> 0 and ANCL_anulado = 'N' AND TERC_NIT >= :CLIINI AND TERC_NIT <= :CLIFIN
    ORDER BY ANCL_FECHA
    INTO :ID, :FECHA, :nit,  :RTFTE, :RTIVA, :RTICA, :MONTO, :TRM
    DO
    INSERT INTO SALDOS_DOC_CARTERA (SDCA_TIPOREF, SDCA_IDREF, SDCA_FECHA, TERC_NIT, SDCA_RTFTE, SDCA_RTIVA, SDCA_RTICA, SDCA_ABONO, SDCA_ABRTFTE, SDCA_ABRTIVA, SDCA_ABRTICA, SDCA_DEBITO, SDCA_MONTO, SDCA_TRM)
        VALUES (45, :ID, :fecha, :nit, :rtfte*-1, :rtiva*-1, :rtica*-1, 0, 0, 0, 0, 'N', :MONTO * -1, :TRM);

FOR SELECT ACDE_TIPODOC, ACDE_IDDOC, APCL_FECHA, TERC_NIT, ACDE_APLICADO, ACDE_RTFTE, ACDE_RTIVA, ACDE_RTICA, A.apcl_trm
    FROM APLICACION_CLIENTE_DETALLE D, APLICACION_CLIENTE A
    WHERE A.APCL_ID = D.apcl_id AND A.APCL_ID <> 0 AND APCL_ANULADO = 'N' AND TERC_NIT >= :CLIINI AND TERC_NIT <= :CLIFIN
    ORDER BY APCL_FECHA
    INTO :TIPO, :ID, :FECHA, :NIT, :MONTO, :RTFTE, :RTIVA, :RTICA, :TRM
    DO
    BEGIN
    EXISTE = 'N';
    select 'S' from saldos_doc_cartera where sdca_tiporef = :TIPO and sdca_idref = :ID and sdca_fecha = :fecha into :EXISTE;
    if (Existe = 'S') then
        begin
         $$IBE$$*/ /* actualice el saldo del dia */ /*$$IBE$$ 
        UPDATE saldos_doc_cartera
            SET SDCA_ABONO = SDCA_ABONO + :MONTO,
                SDCA_ABRTFTE = SDCA_ABRTFTE + :RTFTE,
                SDCA_ABRTIVA = SDCA_ABRTIVA + :RTIVA,
                SDCA_ABRTICA = SDCA_ABRTICA + :RTICA,
                SDCA_TRM = :TRM
            WHERE SDCA_TIPOREF = :TIPO AND SDCA_IDREF = :ID AND SDCA_FECHA = :fecha;
        END
    ELSE
        BEGIN
         $$IBE$$*/ /* Inserte un nuevo saldo diario */ /*$$IBE$$ 
        INSERT INTO SALDOS_DOC_CARTERA (SDCA_TIPOREF, SDCA_IDREF, SDCA_FECHA, TERC_NIT, SDCA_RTFTE, SDCA_RTIVA, SDCA_RTICA, SDCA_ABONO, SDCA_ABRTFTE, SDCA_ABRTIVA, SDCA_ABRTICA, SDCA_DEBITO, SDCA_MONTO, SDCA_TRM)
            VALUES (:TIPO, :ID, :fecha, :NIT, 0, 0, 0, :MONTO, :rtfte, :rtiva, :rtica, 'N', 0, :TRM);
        END
    END

FOR SELECT R.RECA_ID, RCDE_TIPODOC, RCDE_IDDOC, RECA_FECHA, TERC_NIT, RCDE_ABONO+RCDE_DTOF, RCDE_RTFTE, RCDE_RTIVA, RCDE_RTICA, RECA_TRM
    FROM RECIBOS_CAJA_DETALLE D, RECIBOS_CAJA R
    WHERE R.RECA_ID = D.RECA_id AND R.RECA_ID <> 0 AND RECA_ANULADO = 'N' AND TERC_NIT >= :CLIINI AND TERC_NIT <= :CLIFIN
    ORDER BY RECA_FECHA
    INTO :IDR, :TIPO, :ID, :FECHA, :NIT, :MONTO, :RTFTE, :RTIVA, :RTICA, :TRM
    DO
    BEGIN
    EXISTE = 'N';
    if (TIPO = 45) then
        BEGIN
        SELECT RECA_ID FROM ANTICIPOS_CLIENTE WHERE ANCL_ID = :ID INTO :RECAID;
        if (RECAID = IDR) then
            EXISTE = 'S';
        END
    if (EXISTE = 'N') then
        BEGIN
        select 'S' from saldos_doc_cartera where sdca_tiporef = :TIPO and sdca_idref = :ID and sdca_fecha = :fecha into :EXISTE;
        if (Existe = 'S') then
            begin
             $$IBE$$*/ /* actualice el saldo del dia */ /*$$IBE$$ 
            UPDATE saldos_doc_cartera
                SET SDCA_ABONO = SDCA_ABONO + :MONTO,
                    SDCA_ABRTFTE = SDCA_ABRTFTE + :RTFTE,
                    SDCA_ABRTIVA = SDCA_ABRTIVA + :RTIVA,
                    SDCA_ABRTICA = SDCA_ABRTICA + :RTICA,
                    SDCA_TRM = :TRM
                WHERE SDCA_TIPOREF = :TIPO AND SDCA_IDREF = :ID AND SDCA_FECHA = :fecha;
            END
        ELSE
            BEGIN
             $$IBE$$*/ /* Inserte un nuevo saldo diario */ /*$$IBE$$ 
            INSERT INTO SALDOS_DOC_CARTERA (SDCA_TIPOREF, SDCA_IDREF, SDCA_FECHA, TERC_NIT, SDCA_RTFTE, SDCA_RTIVA, SDCA_RTICA, SDCA_ABONO, SDCA_ABRTFTE, SDCA_ABRTIVA, SDCA_ABRTICA, SDCA_DEBITO, SDCA_MONTO, SDCA_TRM)
                VALUES (:TIPO, :ID, :fecha, :NIT, 0, 0, 0, :MONTO, :rtfte, :rtiva, :rtica, 'N', 0, :TRM);
            END
        END
    END

FOR SELECT E.egre_id, EGCC_TIPODOC, EGCC_IDDOC, EGRE_FECHA, TERC_NIT, EGCC_ABONO+EGCC_DTOF, EGCC_RTFTE, EGCC_RTIVA, EGCC_RTICA, EGRE_TRM
    FROM EGRESOS_CRUCEC C, EGRESOS E
    WHERE E.egre_id = C.egre_id AND EGRE_ANULADO = 'N' AND TERC_NIT >= :CLIINI AND TERC_NIT <= :CLIFIN
    ORDER BY EGRE_FECHA
    INTO :IDR, :TIPO, :ID, :FECHA, :NIT, :MONTO, :RTFTE, :RTIVA, :RTICA, :TRM
    DO
    BEGIN
    select 'S' from saldos_doc_cartera where sdca_tiporef = :TIPO and sdca_idref = :ID and sdca_fecha = :fecha into :EXISTE;
    if (Existe = 'S') then
        begin
         $$IBE$$*/ /* actualice el saldo del dia */ /*$$IBE$$ 
        UPDATE saldos_doc_cartera
            SET SDCA_ABONO = SDCA_ABONO + :MONTO,
            SDCA_ABRTFTE = SDCA_ABRTFTE + :RTFTE,
            SDCA_ABRTIVA = SDCA_ABRTIVA + :RTIVA,
            SDCA_ABRTICA = SDCA_ABRTICA + :RTICA,
            SDCA_TRM = :TRM
            WHERE SDCA_TIPOREF = :TIPO AND SDCA_IDREF = :ID AND SDCA_FECHA = :fecha;
        END
    ELSE
        BEGIN
         $$IBE$$*/ /* Inserte un nuevo saldo diario */ /*$$IBE$$ 
        INSERT INTO SALDOS_DOC_CARTERA (SDCA_TIPOREF, SDCA_IDREF, SDCA_FECHA, TERC_NIT, SDCA_RTFTE, SDCA_RTIVA, SDCA_RTICA, SDCA_ABONO, SDCA_ABRTFTE, SDCA_ABRTIVA, SDCA_ABRTICA, SDCA_DEBITO, SDCA_MONTO, SDCA_TRM)
            VALUES (:TIPO, :ID, :fecha, :NIT, 0, 0, 0, :MONTO, :rtfte, :rtiva, :rtica, 'N', 0, :TRM);
        END
    END

for select ancl_id, ancl_base+ancl_ivamonto, PREF_PRE, ANCL_NUMERO, ANCL_TRM from anticipos_cliente
    where ANCL_ANULADO = 'N' and reca_id not in (select reca_id from recibos_caja where reca_anulado = 'N')
    into :ID, :MONTO, :PREF, :NUMERO, :TRM
    do
    begin
    FECHA = cast('now' as date);
    execute procedure saldo_doc_cartera(45, :id, :FECHA, 0) returning_values (:RTFTE);
    if ((MONTO = RTFTE) or (RTFTE IS NULL)) then
        DELETE FROM ANTICIPOS_CLIENTE WHERE ANCL_ID = :ID;
    ELSE
        BEGIN
        TIPO = 45;
        ERROR = 'DOCUMENTO ANULADO CON ABONOS';
        SUSPEND;
        END
    end
SUSPEND;
 $$IBE$$*/ SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE COMISIONES_COBRO(
    DESDE INTEGER,
    HASTA INTEGER,
    FECINI DATE,
    FECFIN DATE,
    DETALLE CHAR(1))
RETURNS (
    CODVEND INTEGER,
    NOMVEND VARCHAR(60),
    NIT VARCHAR(20),
    CLIENTE VARCHAR(60),
    NOMTIPO VARCHAR(8),
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(6),
    FECDOC DATE,
    PREFREC VARCHAR(4),
    NUMREC VARCHAR(6),
    FECREC DATE,
    DIAS INTEGER,
    ABONO NUMERIC(18,2),
    BASE NUMERIC(18,2),
    COMIMONTO NUMERIC(18,2),
    COMIPORC NUMERIC(9,2),
    ARTICULO VARCHAR(20),
    CODGRP VARCHAR(2),
    CANT NUMERIC(18,4))
AS
DECLARE VARIABLE TIPO INTEGER;
DECLARE VARIABLE ID INTEGER;
DECLARE VARIABLE IVAMONTO NUMERIC(18,2);
DECLARE VARIABLE TOTAL NUMERIC(18,2);
DECLARE VARIABLE SITOT CHAR(2);
DECLARE VARIABLE VENTA CHAR(2);
DECLARE VARIABLE COMIV NUMERIC(18,2);
DECLARE VARIABLE PORCV NUMERIC(18,2);
DECLARE VARIABLE CONSUMO NUMERIC(18,2);
declare variable ALFINAL CHAR(2);
declare variable SALDO NUMERIC(18,2);
declare variable COMISION VARCHAR(10);
declare variable porcaux NUMERIC(9,2);
declare variable BASEAUX DOUBLE PRECISION;
declare variable SUCURSAL VARCHAR(20);
BEGIN /*$$IBE$$ 
EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION', 'VENDEDORES', 'COMISIONES EN VENTA INCLUYENDO IMPUESTOS') returning_values (:SITOT);
EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA','COMISIONES','COMISION POR COBRO PAGADERA SOLO EN EL COBRO TOTAL') returning_values (:ALFINAL);
execute procedure lee_configuracion('CARTERA','COMISIONES','COMISION POR COBRO COMO PORCENTAJE DE LA COMISION VENTA') returning_values (:venta);
EXECUTE PROCEDURE lee_configuracion('CARTERA', 'COMISIONES', 'LIQUIDAR COMISION COBRO CON COBRADOR DEL DOCUMENTO O DEL RECIBO') returning_values (:COMISION);
FOR SELECT RCDE_TIPODOC, RCDE_IDDOC, RCDE_PREFIJO, RCDE_NUMERO, R.TERC_NIT, TERC_NOM, RECA_FECHA, (RCDE_ABONO+RCDE_RTFTE+RCDE_RTIVA+RCDE_RTICA), PREF_PRE, RECA_NUMERO, COBR_COD
    FROM RECIBOS_CAJA R, RECIBOS_CAJA_DETALLE RD, TERCEROS T
    WHERE R.RECA_ID = RD.RECA_ID AND RECA_FECHA >= :FECINI AND RECA_FECHA <= :FECFIN AND R.TERC_NIT = T.TERC_NIT AND RECA_ANULADO = 'N'
    ORDER BY TERC_NIT, RECA_FECHA
    INTO :TIPO, :ID, :PREFIJO, :NUMERO, :NIT, :CLIENTE, :FECREC, :ABONO, :PREFREC, :NUMREC, :codvend
    DO
    BEGIN
    SELECT TIDO_NOMCORTO FROM TIPO_DOCUMENTO WHERE TIDO_COD = :TIPO INTO :NOMTIPO;
    if (COMISION = 'DOCUMENTO') then
        SELECT MVCL_FECHA, COBR_COD FROM MOVIMIENTO_CLIENTES WHERE MVCL_TIPOREF = :TIPO AND MVCL_IDREF = :ID
            INTO :FECDOC, :codvend;
    else
        SELECT MVCL_FECHA FROM MOVIMIENTO_CLIENTES WHERE MVCL_TIPOREF = :TIPO AND MVCL_IDREF = :ID
            INTO :FECDOC;
    if (FECDOC IS NOT NULL) then
        DIAS = FECREC - FECDOC;
    ELSE
        DIAS = 999;
    if ((codvend >= :DESDE) AND (codvend <= :hasta)) then
        BEGIN
         $$IBE$$*/ /* TRAIGA EL PORCENTAJE DE ACUERDO A LOS DIAS */ /*$$IBE$$ 
        COMIPORC = 0;
        SELECT CMCB_PORC FROM COMISION_COBRO WHERE CMCB_DIASINI <= :dias AND CMCB_DIASFIN >= :DIAS AND COBR_COD = :CODVEND INTO :COMIPORC;
        if (COMIPORC IS NULL) THEN
            COMIPORC = 0;
        if (VENTA = 'NO') then
            BEGIN
            if (TIPO = 31) then
                BEGIN
                if (DETALLE = 'N') then
                    SELECT MAX(FACT_TOTAL), MAX(FACT_IVAMONTO), SUM(FADE_CONSUMO) FROM FACTURAS F, FACTURAS_DETALLE D
                        WHERE F.FACT_ID = D.FACT_ID AND F.FACT_ID = :ID INTO :TOTAL, :IVAMONTO, :CONSUMO;
                ELSE
                    FOR SELECT D.ARTI_COD, FADE_CANT, FADE_TOTAL, FADE_IVAMONTO, FADE_CONSUMO, GRUP_COD
                        FROM FACTURAS F, FACTURAS_DETALLE D, ARTICULO A
                        WHERE F.FACT_ID = D.FACT_ID AND D.arti_cod = A.arti_cod AND F.FACT_ID = :ID
                        INTO :ARTICULO, :CANT, :TOTAL, :IVAMONTO, :CONSUMO, :CODGRP
                        DO
                        BEGIN
                        if (SITOT = 'SI') then
                            BASEAUX = TOTAL;
                        ELSE
                            BASEAUX = (TOTAL - IVAMONTO - CONSUMO);
                        BASE = BASEAUX;
                        COMIMONTO = BASE / 100 * COMIPORC;
                        SUSPEND;
                        END
                END
            if (TIPO = 33) then
                if (DETALLE = 'N') then
                    SELECT MAX(DEVT_TOTAL*-1), MAX(DEVT_IVAMONTO*-1), SUM(DVDE_CONSUMO) FROM DEVOLUCIONES_VENTAS V, DEVOLUCIONES_VENTAS_DETALLE D
                        WHERE V.DEVT_ID = D.DEVT_ID AND V.DEVT_ID = :ID INTO :TOTAL, :IVAMONTO, :CONSUMO;
                ELSE
                    FOR SELECT D.ARTI_COD, DVDE_CANT, DVDE_TOTAL*-1, DVDE_IVAMONTO*-1, DVDE_CONSUMO*-1, GRUP_COD
                        FROM DEVOLUCIONES_VENTAS V, DEVOLUCIONES_VENTAS_DETALLE D, ARTICULO A
                        WHERE V.DEVT_ID = D.DEVT_ID AND D.arti_cod = A.arti_cod AND V.DEVT_ID = :ID
                        INTO :ARTICULO, :CANT, :TOTAL, :IVAMONTO, :CONSUMO, :codgrp
                        DO
                        BEGIN
                        if (SITOT = 'SI') then
                            BASEAUX = TOTAL;
                        ELSE
                            BASEAUX = TOTAL - IVAMONTO - CONSUMO;
                        BASE = BASEAUX;
                        COMIMONTO = BASE / 100 * COMIPORC;
                        SUSPEND;
                        END
            if (TIPO = 41) then
                SELECT NDCL_MONTO, NDCL_IVAMONTO, 0 FROM NOTAS_DEBITO_CLIENTES WHERE NDCL_ID = :ID INTO :TOTAL, :IVAMONTO, :CONSUMO;
            if (TIPO = 42) then
                SELECT NCCL_MONTO*-1, NCCL_IVAMONTO*-1, 0 FROM NOTAS_CREDITO_CLIENTES WHERE NCCL_ID = :ID INTO :TOTAL, :IVAMONTO, :CONSUMO;
            if (TIPO = 77) then
                SELECT DVCH_MONTO, 0, 0 FROM DEVOLUCION_CHEQUES WHERE DVCH_ID = :ID INTO :TOTAL, :IVAMONTO, :CONSUMO;
            if (SITOT = 'SI') then
                BASEAUX = ABONO;
            ELSE
                if ((TOTAL - IVAMONTO - CONSUMO) <> 0) then
                    BASEAUX = (ABONO / TOTAL) * (TOTAL - IVAMONTO - CONSUMO);
                ELSE
                    BASEAUX = 0;
            BASE = BASEAUX;
            COMIMONTO = BASE / 100 * COMIPORC;
            END
        ELSE
            BEGIN
            if (TIPO = 31) then
                if (DETALLE = 'N') then
                    SELECT MAX(FACT_TOTAL), MAX(FACT_IVAMONTO), MAX(FACT_COMIPORC), SUM(FADE_CONSUMO)
                        FROM FACTURAS F, FACTURAS_DETALLE D WHERE F.FACT_ID = D.FACT_ID AND F.FACT_ID = :ID
                        INTO :TOTAL, :IVAMONTO, :PORCV, :CONSUMO;
                ELSE
                    FOR SELECT D.ARTI_COD, FADE_CANT, FADE_TOTAL, FADE_IVAMONTO, FADE_CONSUMO, FACT_COMIPORC, GRUP_COD
                        FROM FACTURAS F, FACTURAS_DETALLE D, ARTICULO A
                        WHERE F.FACT_ID = D.FACT_ID AND D.arti_cod = A.arti_cod AND F.FACT_ID = :ID
                        INTO :ARTICULO, :CANT, :TOTAL, :IVAMONTO, :CONSUMO, :porcv, :codgrp
                        DO
                        BEGIN
                        if (SITOT = 'SI') then
                            BASEAUX = TOTAL;
                        ELSE
                            BASEAUX = (TOTAL - IVAMONTO - CONSUMO);
                        COMIV = PORCV / 100 * BASEAUX;
                        COMIMONTO = COMIV / 100 * COMIPORC;
                        porcaux = comiporc;
                        comiporc = PORCV / 100 * COMIPORC;
                        BASE = BASEAUX;
                        SUSPEND;
                        END
            if (TIPO = 33) then
                if (DETALLE = 'N') then
                    SELECT MAX(DEVT_TOTAL), MAX(DEVT_IVAMONTO), MAX(DEVT_COMIPORC), SUM(DVDE_CONSUMO)
                        FROM DEVOLUCIONES_VENTAS V, DEVOLUCIONES_VENTAS_DETALLE D WHERE V.DEVT_ID = D.DEVT_ID AND D.DEVT_ID = :ID
                        INTO :TOTAL, :IVAMONTO, :PORCV, :CONSUMO;
                ELSE
                    FOR SELECT D.ARTI_COD, DVDE_CANT, DVDE_TOTAL*-1, DVDE_IVAMONTO*-1, DVDE_CONSUMO*-1, DEVT_COMIPORC, GRUP_COD
                        FROM DEVOLUCIONES_VENTAS V, DEVOLUCIONES_VENTAS_DETALLE D, ARTICULO A
                        WHERE V.DEVT_ID = D.DEVT_ID AND D.arti_cod = A.arti_cod AND V.DEVT_ID = :ID
                        INTO :ARTICULO, :CANT, :TOTAL, :IVAMONTO, :CONSUMO, :porcv, :codgrp
                        DO
                        BEGIN
                        if (SITOT = 'SI') then
                            BASEAUX = TOTAL;
                        ELSE
                            BASEAUX = (TOTAL - IVAMONTO - CONSUMO);
                        COMIV = PORCV / 100 * BASEAUX;
                        COMIMONTO = COMIV / 100 * COMIPORC;
                        porcaux = comiporc;
                        comiporc = PORCV / 100 * COMIPORC;
                        BASE = BASEAUX;
                        SUSPEND;
                        END
            if (TIPO = 41) then
                SELECT NDCL_MONTO, NDCL_IVAMONTO, NDCL_COMIPORC, 0 FROM NOTAS_DEBITO_CLIENTES
                    WHERE NDCL_ID = :ID INTO :TOTAL, :IVAMONTO, :PORCV, :CONSUMO;
            if (TIPO = 42) then
                SELECT NCCL_MONTO, NCCL_IVAMONTO, NCCL_COMIPORC, 0  FROM NOTAS_CREDITO_CLIENTES
                    WHERE NCCL_ID = :ID INTO :TOTAL, :IVAMONTO, :PORCV, :CONSUMO;
            if (TIPO = 77) then
                SELECT DVCH_MONTO, 0, 0, 0 FROM DEVOLUCION_CHEQUES WHERE DVCH_ID = :ID INTO :TOTAL, :IVAMONTO, :PORCV, :CONSUMO;
            if (SITOT = 'SI') then
                BASEAUX = ABONO;
            ELSE
                if ((total <> 0) AND (ABONO <> 0)) then
                    BASEAUX = (TOTAL - IVAMONTO - CONSUMO) / TOTAL * ABONO;
                ELSE
                    BASEAUX = 0;
            COMIV = PORCV / 100 * BASEAUX;
            COMIMONTO = COMIV / 100 * COMIPORC;
            porcaux = comiporc;
            comiporc = PORCV / 100 * COMIPORC;
            BASE = BASEAUX;
            END
        select COBR_NOM from COBRADORES where COBR_COD = :codvend INTO :nomvend;
        if (DETALLE = 'N') then
            if (ALFINAL = 'SI') then
                BEGIN
                 $$IBE$$*/ /* VERIFIQUE EL SALDO DEL DOCUMENTO, SI ES CERO LIQUIDE COMISION SOBRE EL TOTAL */ /*$$IBE$$ 
                EXECUTE PROCEDURE saldo_doc_cartera(:tipo, :ID, :FECREC, 0) returning_values (:SALDO);
                if (SALDO = 0) then
                    BEGIN
                    if (VENTA = 'NO') then
                        begin
                        if (SITOT = 'SI') then
                            BASEAUX = TOTAL;
                        ELSE
                            BASEAUX = TOTAL - IVAMONTO - CONSUMO;
                        COMIMONTO = BASEAUX * COMIPORC / 100;
                        end
                    ELSE
                        BEGIN
                        if (SITOT = 'SI') then
                            BASEAUX = TOTAL;
                        ELSE
                            BASEAUX = TOTAL - IVAMONTO - CONSUMO;
                        COMIV = PORCV * BASEAUX / 100;
                        COMIMONTO = COMIV / 100 * porcaux;
                        comiporc = PORCV / 100 * porcaux;
                        END
                    BASE = BASEAUX;
                    SUSPEND;
                    END
                END
            ELSE
                SUSPEND;
        ELSE
            if ((TIPO <> 31) AND (TIPO <> 33)) then
                SUSPEND;
        END
    END
FOR SELECT EGCC_TIPODOC, EGCC_IDDOC, EGCC_PREFIJO, EGCC_NUMERO, E.TERC_NIT, TERC_NOM, EGRE_FECHA, (EGCC_ABONO+EGCC_RTFTE+EGCC_RTIVA+EGCC_RTICA), PREF_PRE, EGRE_NUMERO, EGCC_SUCURSAL
    FROM EGRESOS E, EGRESOS_CRUCEC C, TERCEROS T
    WHERE E.EGRE_ID = C.EGRE_ID AND EGRE_FECHA >= :FECINI AND EGRE_FECHA <= :FECFIN AND E.TERC_NIT = T.TERC_NIT AND EGRE_ANULADO = 'N'
    ORDER BY TERC_NIT, EGRE_FECHA
    INTO :TIPO, :ID, :PREFIJO, :NUMERO, :NIT, :CLIENTE, :FECREC, :ABONO, :PREFREC, :NUMREC, :SUCURSAL
    DO
    BEGIN
    SELECT COBR_COD FROM cliente_sucursales WHERE TERC_NIT = :NIT AND CLCU_COD = :sucursal INTO :codvend;
    SELECT TIDO_NOMCORTO FROM TIPO_DOCUMENTO WHERE TIDO_COD = :TIPO INTO :NOMTIPO;
    if (COMISION = 'DOCUMENTO') then
        SELECT MVCL_FECHA, COBR_COD FROM MOVIMIENTO_CLIENTES WHERE MVCL_TIPOREF = :TIPO AND MVCL_IDREF = :ID
            INTO :FECDOC, :codvend;
    else
        SELECT MVCL_FECHA FROM MOVIMIENTO_CLIENTES WHERE MVCL_TIPOREF = :TIPO AND MVCL_IDREF = :ID
            INTO :FECDOC;
    if (FECDOC IS NOT NULL) then
        DIAS = FECREC - FECDOC;
    ELSE
        DIAS = 999;
    if ((codvend >= :DESDE) AND (codvend <= :hasta)) then
        BEGIN
         $$IBE$$*/ /* TRAIGA EL PORCENTAJE DE ACUERDO A LOS DIAS */ /*$$IBE$$ 
        COMIPORC = 0;
        SELECT CMCB_PORC FROM COMISION_COBRO WHERE CMCB_DIASINI <= :dias AND CMCB_DIASFIN >= :DIAS AND COBR_COD = :CODVEND INTO :COMIPORC;
        if (COMIPORC IS NULL) THEN
            COMIPORC = 0;
        if (VENTA = 'NO') then
            BEGIN
            if (TIPO = 31) then
                BEGIN
                if (DETALLE = 'N') then
                    SELECT MAX(FACT_TOTAL), MAX(FACT_IVAMONTO), SUM(FADE_CONSUMO) FROM FACTURAS F, FACTURAS_DETALLE D
                        WHERE F.FACT_ID = D.FACT_ID AND F.FACT_ID = :ID INTO :TOTAL, :IVAMONTO, :CONSUMO;
                ELSE
                    FOR SELECT D.ARTI_COD, FADE_CANT, FADE_TOTAL, FADE_IVAMONTO, FADE_CONSUMO, GRUP_COD
                        FROM FACTURAS F, FACTURAS_DETALLE D, ARTICULO A
                        WHERE F.FACT_ID = D.FACT_ID AND D.arti_cod = A.arti_cod AND F.FACT_ID = :ID
                        INTO :ARTICULO, :CANT, :TOTAL, :IVAMONTO, :CONSUMO, :CODGRP
                        DO
                        BEGIN
                        if (SITOT = 'SI') then
                            BASEAUX = TOTAL;
                        ELSE
                            BASEAUX = (TOTAL - IVAMONTO - CONSUMO);
                        BASE = BASEAUX;
                        COMIMONTO = BASE / 100 * COMIPORC;
                        SUSPEND;
                        END
                END
            if (TIPO = 33) then
                if (DETALLE = 'N') then
                    SELECT MAX(DEVT_TOTAL*-1), MAX(DEVT_IVAMONTO*-1), SUM(DVDE_CONSUMO) FROM DEVOLUCIONES_VENTAS V, DEVOLUCIONES_VENTAS_DETALLE D
                        WHERE V.DEVT_ID = D.DEVT_ID AND V.DEVT_ID = :ID INTO :TOTAL, :IVAMONTO, :CONSUMO;
                ELSE
                    FOR SELECT D.ARTI_COD, DVDE_CANT, DVDE_TOTAL*-1, DVDE_IVAMONTO*-1, DVDE_CONSUMO*-1, GRUP_COD
                        FROM DEVOLUCIONES_VENTAS V, DEVOLUCIONES_VENTAS_DETALLE D, ARTICULO A
                        WHERE V.DEVT_ID = D.DEVT_ID AND D.arti_cod = A.arti_cod AND V.DEVT_ID = :ID
                        INTO :ARTICULO, :CANT, :TOTAL, :IVAMONTO, :CONSUMO, :codgrp
                        DO
                        BEGIN
                        if (SITOT = 'SI') then
                            BASEAUX = TOTAL;
                        ELSE
                            BASEAUX = TOTAL - IVAMONTO - CONSUMO;
                        BASE = BASEAUX;
                        COMIMONTO = BASE / 100 * COMIPORC;
                        SUSPEND;
                        END
            if (TIPO = 41) then
                SELECT NDCL_MONTO, NDCL_IVAMONTO, 0 FROM NOTAS_DEBITO_CLIENTES WHERE NDCL_ID = :ID INTO :TOTAL, :IVAMONTO, :CONSUMO;
            if (TIPO = 42) then
                SELECT NCCL_MONTO*-1, NCCL_IVAMONTO*-1, 0 FROM NOTAS_CREDITO_CLIENTES WHERE NCCL_ID = :ID INTO :TOTAL, :IVAMONTO, :CONSUMO;
            if (TIPO = 77) then
                SELECT DVCH_MONTO, 0, 0 FROM DEVOLUCION_CHEQUES WHERE DVCH_ID = :ID INTO :TOTAL, :IVAMONTO, :CONSUMO;
            if (SITOT = 'SI') then
                BASEAUX = ABONO;
            ELSE
                if ((TOTAL - IVAMONTO - CONSUMO) <> 0) then
                    BASEAUX = (ABONO / TOTAL) * (TOTAL - IVAMONTO - CONSUMO);
                ELSE
                    BASEAUX = 0;
            BASE = BASEAUX;
            COMIMONTO = BASE / 100 * COMIPORC;
            END
        ELSE
            BEGIN
            if (TIPO = 31) then
                if (DETALLE = 'N') then
                    SELECT MAX(FACT_TOTAL), MAX(FACT_IVAMONTO), MAX(FACT_COMIPORC), SUM(FADE_CONSUMO)
                        FROM FACTURAS F, FACTURAS_DETALLE D WHERE F.FACT_ID = D.FACT_ID AND F.FACT_ID = :ID
                        INTO :TOTAL, :IVAMONTO, :PORCV, :CONSUMO;
                ELSE
                    FOR SELECT D.ARTI_COD, FADE_CANT, FADE_TOTAL, FADE_IVAMONTO, FADE_CONSUMO, FACT_COMIPORC, GRUP_COD
                        FROM FACTURAS F, FACTURAS_DETALLE D, ARTICULO A
                        WHERE F.FACT_ID = D.FACT_ID AND D.arti_cod = A.arti_cod AND F.FACT_ID = :ID
                        INTO :ARTICULO, :CANT, :TOTAL, :IVAMONTO, :CONSUMO, :porcv, :codgrp
                        DO
                        BEGIN
                        if (SITOT = 'SI') then
                            BASEAUX = TOTAL;
                        ELSE
                            BASEAUX = (TOTAL - IVAMONTO - CONSUMO);
                        COMIV = PORCV / 100 * BASEAUX;
                        COMIMONTO = COMIV / 100 * COMIPORC;
                        porcaux = comiporc;
                        comiporc = PORCV / 100 * COMIPORC;
                        BASE = BASEAUX;
                        SUSPEND;
                        END
            if (TIPO = 33) then
                if (DETALLE = 'N') then
                    SELECT MAX(DEVT_TOTAL), MAX(DEVT_IVAMONTO), MAX(DEVT_COMIPORC), SUM(DVDE_CONSUMO)
                        FROM DEVOLUCIONES_VENTAS V, DEVOLUCIONES_VENTAS_DETALLE D WHERE V.DEVT_ID = D.DEVT_ID AND D.DEVT_ID = :ID
                        INTO :TOTAL, :IVAMONTO, :PORCV, :CONSUMO;
                ELSE
                    FOR SELECT D.ARTI_COD, DVDE_CANT, DVDE_TOTAL*-1, DVDE_IVAMONTO*-1, DVDE_CONSUMO*-1, DEVT_COMIPORC, GRUP_COD
                        FROM DEVOLUCIONES_VENTAS V, DEVOLUCIONES_VENTAS_DETALLE D, ARTICULO A
                        WHERE V.DEVT_ID = D.DEVT_ID AND D.arti_cod = A.arti_cod AND V.DEVT_ID = :ID
                        INTO :ARTICULO, :CANT, :TOTAL, :IVAMONTO, :CONSUMO, :porcv, :codgrp
                        DO
                        BEGIN
                        if (SITOT = 'SI') then
                            BASEAUX = TOTAL;
                        ELSE
                            BASEAUX = (TOTAL - IVAMONTO - CONSUMO);
                        COMIV = PORCV / 100 * BASEAUX;
                        COMIMONTO = COMIV / 100 * COMIPORC;
                        porcaux = comiporc;
                        comiporc = PORCV / 100 * COMIPORC;
                        BASE = BASEAUX;
                        SUSPEND;
                        END
            if (TIPO = 41) then
                SELECT NDCL_MONTO, NDCL_IVAMONTO, NDCL_COMIPORC, 0 FROM NOTAS_DEBITO_CLIENTES
                    WHERE NDCL_ID = :ID INTO :TOTAL, :IVAMONTO, :PORCV, :CONSUMO;
            if (TIPO = 42) then
                SELECT NCCL_MONTO, NCCL_IVAMONTO, NCCL_COMIPORC, 0  FROM NOTAS_CREDITO_CLIENTES
                    WHERE NCCL_ID = :ID INTO :TOTAL, :IVAMONTO, :PORCV, :CONSUMO;
            if (TIPO = 77) then
                SELECT DVCH_MONTO, 0, 0, 0 FROM DEVOLUCION_CHEQUES WHERE DVCH_ID = :ID INTO :TOTAL, :IVAMONTO, :PORCV, :CONSUMO;
            if (SITOT = 'SI') then
                BASEAUX = ABONO;
            ELSE
                if ((total <> 0) AND (ABONO <> 0)) then
                    BASEAUX = (TOTAL - IVAMONTO - CONSUMO) / TOTAL * ABONO;
                ELSE
                    BASEAUX = 0;
            COMIV = PORCV / 100 * BASEAUX;
            COMIMONTO = COMIV / 100 * COMIPORC;
            porcaux = comiporc;
            comiporc = PORCV / 100 * COMIPORC;
            BASE = BASEAUX;
            END
        select COBR_NOM from COBRADORES where COBR_COD = :codvend INTO :nomvend;
        if (DETALLE = 'N') then
            if (ALFINAL = 'SI') then
                BEGIN
                 $$IBE$$*/ /* VERIFIQUE EL SALDO DEL DOCUMENTO, SI ES CERO LIQUIDE COMISION SOBRE EL TOTAL */ /*$$IBE$$ 
                EXECUTE PROCEDURE saldo_doc_cartera(:tipo, :ID, :FECREC, 0) returning_values (:SALDO);
                if (SALDO = 0) then
                    BEGIN
                    if (VENTA = 'NO') then
                        begin
                        if (SITOT = 'SI') then
                            BASEAUX = TOTAL;
                        ELSE
                            BASEAUX = TOTAL - IVAMONTO - CONSUMO;
                        COMIMONTO = BASEAUX * COMIPORC / 100;
                        end
                    ELSE
                        BEGIN
                        if (SITOT = 'SI') then
                            BASEAUX = TOTAL;
                        ELSE
                            BASEAUX = TOTAL - IVAMONTO - CONSUMO;
                        COMIV = PORCV * BASEAUX / 100;
                        COMIMONTO = COMIV / 100 * porcaux;
                        comiporc = PORCV / 100 * porcaux;
                        END
                    BASE = BASEAUX;
                    SUSPEND;
                    END
                END
            ELSE
                SUSPEND;
        ELSE
            if ((TIPO <> 31) AND (TIPO <> 33)) then
                SUSPEND;
        END
    END
FOR SELECT 'DEVOCHEQ', DVCH_MONTO*-1, DVCH_FECHA, PRBA_PREF, DVCH_NUMDOC, DVCH_FECHA, D.TERC_NIT, DVCH_NOMTERC, '', '', D.COBR_COD
    FROM DEVOLUCION_CHEQUES D, CLIENTES C
    WHERE DVCH_FECHA >= :FECINI AND DVCH_FECHA <= :FECFIN AND D.TERC_NIT = C.TERC_NIT AND D.COBR_COD = :CODVEND
    INTO :NOMTIPO, :BASE, :FECDOC, :PREFIJO, :NUMERO, :FECREC, :NIT, :CLIENTE, :PREFREC, :NUMREC, :codvend
    DO
    BEGIN
    COMIPORC = 0;
    COMIMONTO = 0;
    if ((codvend >= :DESDE) AND (codvend <= :hasta)) then
        BEGIN
        select COBR_NOM from COBRADORES where COBR_COD = :codvend INTO :nomvend;
         $$IBE$$*/ /* SELECT CMCB_PORC FROM COMISION_COBRO WHERE CMCB_DIASINI <= 1 AND CMCB_DIASFIN >= 1 AND COBR_COD = :CODVEND INTO :COMIPORC;
        if (COMIPORC IS NULL) THEN
            COMIPORC = 0;
        COMIMONTO = BASE * COMIPORC / 100; */ /*$$IBE$$ 
        SUSPEND;
        END
    END
SUSPEND;
 $$IBE$$*/ SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE CONCILIA_CARTERA(
    FECINI DATE,
    FECFIN DATE,
    CTACART VARCHAR(20),
    SUBEMPRESA INTEGER,
    ANTERIOR CHAR(1))
RETURNS (
    NIT VARCHAR(20),
    NOMBRE VARCHAR(60),
    INICIAL NUMERIC(18,2),
    INICIALC NUMERIC(18,2),
    DEBITOS NUMERIC(18,2),
    DEBITOSC NUMERIC(18,2),
    CREDITOS NUMERIC(18,2),
    CREDITOSC NUMERIC(18,2),
    SALDO NUMERIC(18,2),
    SALDOC NUMERIC(18,2),
    DIFERENCIA NUMERIC(18,2))
AS
declare variable ANO CHAR(4);
declare variable MES INTEGER;
declare variable NUMROWS INTEGER;
declare variable ABONOS NUMERIC(18,2);
declare variable TIPODOC INTEGER;
declare variable IDDOC INTEGER;
declare variable RETES CHAR(2);
begin /*$$IBE$$ 
ano = EXTRACT(YEAR FROM FECFIN);
mes = EXTRACT(MONTH FROM FECFIN);

for select TERC_NIT, TERC_NOM from TERCEROS WHERE TERC_CLIE = 'S' into :NIT, :NOMBRE
    DO
    BEGIN
     $$IBE$$*/ /* OMITE LOS CLIENTES DE CONTADO */ /*$$IBE$$ 
    SELECT COUNT(*) FROM AUTORIZACIONES WHERE AUTO_NITCONTADO = :NIT INTO :numrows;
    IF (numrows = 0) THEN
        BEGIN
        FECINI = FECINI - 1;
        INICIAL = 0;
        FOR SELECT MVCL_TIPOREF, MVCL_IDREF FROM MOVIMIENTO_CLIENTES
            WHERE TERC_NIT = :NIT AND MVCL_FECHA <= :FECINI AND
            MVCL_ABONO = 'N' AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA))
            INTO :TIPODOC, :IDDOC
            DO
            BEGIN
            EXECUTE PROCEDURE saldo_doc_cartera(TIPODOC, IDDOC, FECINI, 0) returning_values (SALDO);
            INICIAL = INICIAL + SALDO;
            END
        EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'DESCONTAR RETENCIONES POR CAUSACION') returning_values(:RETES);
        FECINI = FECINI + 1;
        if (RETES = 'SI') then
            BEGIN
            SELECT SUM(MVCL_MONTO-MVCL_RTEFTE-MVCL_RTEIVA-MVCL_RTEICA) FROM movimiento_clientes
                WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND MVCL_FECHA < :FECFIN
                AND MVCL_DEBITO = 'S' AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA))
                INTO :DEBITOS;
            SELECT SUM(MVCL_MONTO-MVCL_RTEFTE-MVCL_RTEIVA-MVCL_RTEICA) FROM movimiento_clientes
                WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND MVCL_FECHA < :FECFIN
                AND MVCL_DEBITO = 'N' AND MVCL_ABONO = 'N' and MVCL_TIPOREF <> 45 AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA))
                INTO :CREDITOS;
            SELECT SUM(MVCL_MONTO) FROM movimiento_clientes
                WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND MVCL_FECHA < :FECFIN
                AND MVCL_ABONO = 'S' AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA))
                INTO :ABONOS;
            END
        ELSE
            BEGIN
            SELECT SUM(MVCL_MONTO) FROM movimiento_clientes
                WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND MVCL_FECHA < :FECFIN
                AND MVCL_DEBITO = 'S' AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA))
                INTO :DEBITOS;
            SELECT SUM(MVCL_MONTO) FROM movimiento_clientes
                WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND MVCL_FECHA < :FECFIN
                AND MVCL_DEBITO = 'N' AND MVCL_ABONO = 'N' and MVCL_TIPOREF <> 45 AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA))
                INTO :CREDITOS;
            SELECT SUM(MVCL_MONTO+MVCL_RTEFTE+MVCL_RTEIVA+MVCL_RTEICA) FROM movimiento_clientes
                WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND MVCL_FECHA < :FECFIN
                AND MVCL_ABONO = 'S' AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA))
                INTO :ABONOS;
            END
        if (DEBITOS IS NULL) then
            DEBITOS = 0;
        if (CREDITOS IS NULL) then
            CREDITOS = 0;
        if (ABONOS IS NULL) then
            ABONOS = 0;
        CREDITOS = CREDITOS + ABONOS;
        SALDO = INICIAL + DEBITOS - CREDITOS;

         $$IBE$$*/ /* LO CONTABLE */ /*$$IBE$$ 
        EXECUTE PROCEDURE SALDO_TERCERO_MES(ctacart, NIT, ANO, MES, 'S') RETURNING_VALUES (INICIALC);
        EXECUTE PROCEDURE MOVIMIENTO_TERCERO_MES(ctacart, NIT, ANO, MES, 'S') RETURNING_VALUES(DEBITOSC);
        EXECUTE PROCEDURE MOVIMIENTO_TERCERO_MES(ctacart, NIT, ANO, MES, 'N') RETURNING_VALUES(CREDITOSC);
        SALDOC = INICIALC + DEBITOSC - CREDITOSC;
        diferencia = SALDO - SALDOC;
        if (DIFERENCIA <> 0) then
            BEGIN
            if (ANTERIOR <> 'S') then
                SUSPEND;
            ELSE
                BEGIN
                if (DIFERENCIA <> (INICIAL - INICIALC)) then
                    SUSPEND;
                END
            END
        END
    END
SUSPEND;
 $$IBE$$*/ SUSPEND;
end
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE IMPR_APLICLIE(
    ID INTEGER)
RETURNS (
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    CONCEPTO VARCHAR(60),
    NIT VARCHAR(20),
    NOMBRE VARCHAR(60),
    DIR VARCHAR(60),
    CIU VARCHAR(40),
    TEL VARCHAR(40),
    CONTACTO VARCHAR(60),
    FAX VARCHAR(25),
    CEL VARCHAR(25),
    EMAIL VARCHAR(100),
    ITEM INTEGER,
    TIPODOC VARCHAR(8),
    PREFDOC VARCHAR(4),
    NUMDOC VARCHAR(6),
    ABONO NUMERIC(18,2),
    RTFTEMONTO NUMERIC(18,2),
    RTIVAMONTO NUMERIC(18,2),
    RTICAMONTO NUMERIC(18,2),
    SALDODOC NUMERIC(18,2),
    ANTERDOC NUMERIC(18,2),
    OBS BLOB SUB_TYPE 1 SEGMENT SIZE 80,
    CLIE_COD VARCHAR(15),
    COBR_COD INTEGER,
    COBR_NOM VARCHAR(60))
AS
declare variable TIPO INTEGER;
declare variable IDDOC INTEGER;
BEGIN /*$$IBE$$ 
  FOR SELECT PREF_PRE, APCL_NUMERO, APCL_FECHA, APCL_CONCEPTO, P.TERC_NIT, TERC_NOM, TERC_DIR, TERC_CIU, TERC_TEL, TERC_CONTACTO, TERC_FAX, TERC_CEL, TERC_EMAIL,
    ACDE_ITEM, ACDE_TIPODOC, ACDE_IDDOC, TIDO_NOMCORTO, ACDE_PREFIJO, ACDE_NUMERO, ACDE_APLICADO,
    ACDE_RTFTE, ACDE_RTIVA, ACDE_RTICA, APCL_OBS, CLIE_COD, P.COBR_COD, COBR_NOM
    FROM APLICACION_CLIENTE P, APLICACION_CLIENTE_DETALLE PD, TERCEROS T, CLIENTES C, TIPO_DOCUMENTO TD, COBRADORES CO
    WHERE P.TERC_NIT = T.TERC_NIT AND T.TERC_NIT = C.TERC_NIT AND P.APCL_ID = PD.APCL_ID AND P.APCL_ID = :ID AND ACDE_TIPODOC = TD.TIDO_COD AND P.COBR_COD = CO.COBR_COD
    ORDER BY ACDE_ITEM
    INTO :PREFIJO, :NUMERO, :FECHA, :CONCEPTO, :NIT, :NOMBRE, :DIR, :CIU, :TEL, :CONTACTO, :FAX, :CEL, :EMAIL, :ITEM, :TIPO, :IDDOC, :TIPODOC, :PREFDOC, :NUMDOC, :ABONO, :RTFTEMONTO, :RTIVAMONTO, :RTICAMONTO, :OBS, :CLIE_COD, :COBR_COD, :COBR_NOM
    DO
        begin
        EXECUTE PROCEDURE SALDO_DOC_CARTERA(:TIPO, :IDDOC, :FECHA, 0) returning_values (:SALDODOC);
        if (SALDODOC IS NULL) then
            SALDODOC = 0;
        ANTERDOC = SALDODOC + rtftemonto + rtivamonto + rticamonto + abono;
        if (anterdoc IS NULL) then
            ANTERDOC = 0;
        SUSPEND;
        end
SUSPEND;
 $$IBE$$*/ SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE IMPR_RECICAJA(
    ID INTEGER)
RETURNS (
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    NOMCAJA VARCHAR(60),
    CODCOBR INTEGER,
    NOMCOBR VARCHAR(60),
    NIT VARCHAR(20),
    NOMBRE VARCHAR(60),
    DIR VARCHAR(60),
    CIU VARCHAR(40),
    TEL VARCHAR(40),
    CONCEPTO VARCHAR(60),
    MONTO NUMERIC(18,2),
    RTFTE NUMERIC(18,2),
    RTIVA NUMERIC(18,2),
    RTICA NUMERIC(18,2),
    DSCTO NUMERIC(18,2),
    OBS BLOB SUB_TYPE 1 SEGMENT SIZE 80,
    ITEMDOC INTEGER,
    TIPODOC VARCHAR(8),
    PREFDOC VARCHAR(4),
    NUMDOC VARCHAR(6),
    SUCURSAL VARCHAR(10),
    ABONODOC NUMERIC(18,2),
    RTFTEDOC NUMERIC(18,2),
    RTIVADOC NUMERIC(18,2),
    RTICADOC NUMERIC(18,2),
    DSCTODOC NUMERIC(18,2),
    SALDODOC NUMERIC(18,2),
    ANTERDOC NUMERIC(18,2))
AS
declare variable NUMROWS INTEGER;
declare variable TIPO integer;
declare variable IDDOC INTEGER;
BEGIN /*$$IBE$$ 
  SELECT PREF_PRE, RECA_NUMERO, RECA_FECHA, CAJA_NOMBRE, RECA_CONC, R.COBR_COD,
        R.TERC_NIT, RECA_NOMTERC, TERC_DIR, TERC_CIU, TERC_TEL,
        RECA_MONTO, RECA_RTFTEMONTO, RECA_RTIVAMONTO, RECA_RTICAMONTO, RECA_DTOF,
        RECA_OBS
  FROM RECIBOS_CAJA R, TERCEROS T, CAJAS C
  WHERE R.TERC_NIT = T.TERC_NIT AND R.CAJA_ID = C.CAJA_ID AND
        R.RECA_ID = :ID
  INTO :PREFIJO, :NUMERO, :FECHA, :NOMCAJA, :CONCEPTO, :CODCOBR,
        :NIT, :NOMBRE, :DIR, :CIU, :TEL,
        :MONTO, :RTFTE, :RTIVA, :RTICA, :DSCTO,
        :OBS;
  SELECT COBR_NOM FROM COBRADORES WHERE COBR_COD = :CODCOBR INTO :NOMCOBR;
  SELECT COUNT(RCDE_ITEM) FROM RECIBOS_CAJA_DETALLE
    WHERE RECA_ID = :ID INTO :NUMROWS;
  if (NUMROWS > 0) then
    FOR SELECT RCDE_ITEM, RCDE_TIPODOC, RCDE_IDDOC, TIDO_NOMCORTO, RCDE_PREFIJO, RCDE_NUMERO,
        RCDE_ABONO, RCDE_RTFTE, RCDE_RTIVA, RCDE_RTICA, RCDE_DTOF, RCDE_SUCURSAL
        FROM RECIBOS_CAJA_DETALLE D, TIPO_DOCUMENTO TD
        WHERE D.RECA_ID = :ID AND TD.TIDO_COD = D.RCDE_TIPODOC
        ORDER BY RCDE_ITEM
        INTO :ITEMDOC, :TIPO, :IDDOC, :TIPODOC, :PREFDOC, :NUMDOC, :ABONODOC, :RTFTEDOC, :RTIVADOC, :RTICADOC, :DSCTODOC, :sucursal
        DO
            BEGIN
            EXECUTE PROCEDURE SALDO_DOC_CARTERA(:TIPO, :IDDOC, :FECHA, 0) returning_values (:SALDODOC);
            ANTERDOC = SALDODOC + RTFTEDOC + RTIVADOC + RTICADOC + ABONODOC + DSCTODOC;
            SUSPEND;
            END
  ELSE
    SUSPEND;
SUSPEND;
 $$IBE$$*/ SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE IMPR_RECIPROV(
    ID INTEGER)
RETURNS (
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    NOMCAJA VARCHAR(60),
    CODCOBR INTEGER,
    NOMCOBR VARCHAR(60),
    NIT VARCHAR(20),
    NOMBRE VARCHAR(60),
    DIR VARCHAR(60),
    CIU VARCHAR(40),
    TEL VARCHAR(40),
    CONCEPTO VARCHAR(60),
    MONTO NUMERIC(18,2),
    RTFTE NUMERIC(18,2),
    RTIVA NUMERIC(18,2),
    RTICA NUMERIC(18,2),
    DSCTO NUMERIC(18,2),
    OBS BLOB SUB_TYPE 1 SEGMENT SIZE 80,
    PREPAGC VARCHAR(4),
    NUMPAGC VARCHAR(6),
    ITEMDOC INTEGER,
    TIPODOC VARCHAR(8),
    PREFDOC VARCHAR(4),
    NUMDOC VARCHAR(6),
    ABONODOC NUMERIC(18,2),
    RTFTEDOC NUMERIC(18,2),
    RTIVADOC NUMERIC(18,2),
    RTICADOC NUMERIC(18,2),
    DSCTODOC NUMERIC(18,2),
    SALDODOC NUMERIC(18,2),
    ANTERDOC NUMERIC(18,2))
AS
declare variable NUMROWS INTEGER;
declare variable TIPO integer;
declare variable IDDOC INTEGER;
BEGIN /*$$IBE$$ 
  SELECT PREF_PRE, RCPR_NUMERO, RCPR_FECHA, CAJA_NOMBRE, RCPR_CONC, R.VEND_COD,
        R.TERC_NIT, RCPR_NOMTERC, TERC_DIR, TERC_CIU, TERC_TEL,
        RCPR_MONTO, RCPR_RTFTE, RCPR_RTIVA, RCPR_RTICA, RCPR_DTOF,
        RCPR_OBS
  FROM RECIBO_PROVISIONAL R, TERCEROS T, CAJAS C
  WHERE R.TERC_NIT = T.TERC_NIT AND R.CAJA_ID = C.CAJA_ID AND
        R.RCPR_ID = :ID
  INTO :PREFIJO, :NUMERO, :FECHA, :NOMCAJA, :CONCEPTO, :CODCOBR,
        :NIT, :NOMBRE, :DIR, :CIU, :TEL,
        :MONTO, :RTFTE, :RTIVA, :RTICA, :DSCTO,
        :OBS;
  SELECT COBR_NOM FROM COBRADORES WHERE COBR_COD = :CODCOBR INTO :NOMCOBR;
  SELECT COUNT(RPDE_ITEM) FROM RECIBO_PROVISIONAL_DETALLE
    WHERE RCPR_ID = :ID INTO :NUMROWS;
  if (NUMROWS > 0) then
    FOR SELECT RPDE_ITEM, RPDE_TIPODOC, RPDE_IDDOC, TIDO_NOMCORTO, RPDE_PREFDOC, RPDE_NUMDOC,
        RPDE_ABONO, RPDE_RTFTE, RPDE_RTIVA, RPDE_RTICA, RPDE_DTOF
        FROM RECIBO_PROVISIONAL_DETALLE D, TIPO_DOCUMENTO TD
        WHERE D.RCPR_ID = :ID AND TD.TIDO_COD = D.RPDE_TIPODOC
        ORDER BY RPDE_ITEM
        INTO :ITEMDOC, :TIPO, :IDDOC, :TIPODOC, :PREFDOC, :NUMDOC, :ABONODOC, :RTFTEDOC, :RTIVADOC, :RTICADOC, :DSCTODOC
        DO
            BEGIN
            EXECUTE PROCEDURE SALDO_DOC_CARTERA(:TIPO, :ID, :FECHA, 0) returning_values (:SALDODOC);
            ANTERDOC = SALDODOC + RTFTEDOC + RTIVADOC + RTICADOC + ABONODOC + DSCTODOC;
            SUSPEND;
            END
  ELSE
    SUSPEND;
SUSPEND;
 $$IBE$$*/ SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE MOVIMIENTO_CARTERA_DESDE_HASTA(
    NIT VARCHAR(20),
    DESDE DATE,
    HASTA DATE,
    EMPSUCURSAL INTEGER,
    MONEDA INTEGER)
RETURNS (
    INICIAL NUMERIC(18,2),
    TIPODOC VARCHAR(8),
    IDDOC INTEGER,
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    CONCEPTO VARCHAR(60),
    DEBITO NUMERIC(18,2),
    CREDITO NUMERIC(18,2),
    SALDO NUMERIC(18,2),
    NOMBRE VARCHAR(60),
    RTFTE NUMERIC(18,2),
    RTIVA NUMERIC(18,2),
    RTICA NUMERIC(18,2),
    SUCURSAL VARCHAR(10),
    RECPROV_ID INTEGER,
    RECIPROV CHAR(1))
AS
declare variable DB CHAR(1);
declare variable AB CHAR(1);
declare variable RETES CHAR(2);
declare variable tipo integer;
declare variable TRM NUMERIC(18,2);
BEGIN
  /* Ubique el NIT */ /*$$IBE$$ 
  select terc_nom from terceros where terc_nit = :NIT INTO :NOMBRE;
  DESDE = DESDE - 1;
  INICIAL = 0;
  FOR SELECT MVCL_TIPOREF, MVCL_IDREF FROM MOVIMIENTO_CLIENTES
    WHERE TERC_NIT = :NIT AND MVCL_FECHA <= :DESDE AND MVCL_ABONO = 'N' AND
    ((:empsucursal = 0) or (SUCU_ID = :empsucursal)) AND ((:MONEDA = 0) or (MVCL_TRM <> 1))
    INTO :TIPODOC, :IDDOC
    DO
    BEGIN
    EXECUTE PROCEDURE saldo_doc_cartera(TIPODOC, IDDOC, DESDE, MONEDA) returning_values (SALDO);
    if (SALDO <> 0) then
        INICIAL = INICIAL + SALDO;
    END
  DESDE = DESDE + 1;
  SALDO = INICIAL;
  EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'DESCONTAR RETENCIONES POR CAUSACION') returning_values(:RETES);
  FOR select tido_nomcorto, MVCL_TIPOREF, mvcl_idref, mvcl_prefref, mvcl_numref, mvcl_fecha, mvcl_conc, mvcl_monto, mvcl_debito, mvcl_rtefte, mvcl_rteiva, mvcl_rteica, mvcl_abono, mvcl_sucursal, MVCL_TRM
    from movimiento_clientes m, tipo_documento t
    where m.mvcl_tiporef = t.tido_cod and terc_nit = :NIT and mvcl_fecha >= :DESDE and mvcl_fecha <= :HASTA and mvcl_tiporef <> 45 AND
    ((SUCU_ID = :EMPSUCURSAL) or (:EMPSUCURSAL = 0)) AND ((:MONEDA = 0) or (MVCL_TRM <> 1))
    order by mvcl_fecha, mvcl_tiporef
    into :TIPODOC,:tipo,  :IDDOC, :PREFIJO, :NUMERO, :FECHA, :CONCEPTO, :DEBITO, :DB, :RTFTE, :RTIVA, :RTICA, :AB, :SUCURSAL, :TRM
    DO
    BEGIN
    if (DB = 'N') then
        BEGIN
        if (AB = 'S') then
            if (RETES = 'SI') then
                CREDITO = DEBITO;
            ELSE
                CREDITO = DEBITO + RTFTE + RTIVA + RTICA;
        ELSE
            if (RETES = 'SI') then
                CREDITO = DEBITO - RTFTE - RTIVA - RTICA;
            ELSE
                CREDITO = DEBITO;
        DEBITO = 0;
        END
    ELSE
        BEGIN
        if (RETES = 'SI') then
            DEBITO = DEBITO - RTFTE - RTIVA - RTICA;
        CREDITO = 0;
        END
    if ((MONEDA <> 0) AND (TRM <> 0)) then
        BEGIN
        DEBITO = DEBITO / TRM;
        CREDITO = CREDITO / TRM;
        RTFTE = RTFTE / TRM;
        RTIVA = RTIVA / TRM;
        RTICA = RTICA / TRM;
        END
    SALDO = SALDO + DEBITO - CREDITO;
     $$IBE$$*/ /* IDENTIFICAR SI EL DOCUMENTO TIENE RECIBO PROVISIONAL*/ /*$$IBE$$ 
    recprov_id = 0;
    SELECT max(RCPR_ID) FROM recibo_provisional_detalle WHERE RPDE_IDDOC = :iddoc  AND RPDE_TIPODOC = :TIPO and RPDE_ANULADO = 'N' INTO :recprov_id;
    if (recprov_id is null) then
      BEGIN
       reciprov = 'N';
      end
    ELSE
      begin
       reciprov = 'S';
      END
    SUSPEND;
    END
SUSPEND;
 $$IBE$$*/ SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE MOVIMIENTO_CARTERA_MES(
    FECINI DATE,
    FECFIN DATE,
    SUBEMPRESA INTEGER,
    CONTADO CHAR(1),
    MONEDA INTEGER)
RETURNS (
    NIT VARCHAR(20),
    NOMBRE VARCHAR(60),
    CONTACTO VARCHAR(60),
    DIASMAX INTEGER,
    TELEFONO VARCHAR(40),
    INICIAL NUMERIC(18,2),
    DEBITOS NUMERIC(18,2),
    CREDITOS NUMERIC(18,2),
    ABONOS NUMERIC(18,2),
    FINAL NUMERIC(18,2))
AS
declare variable RETES CHAR(2);
declare variable TIPODOC INTEGER;
declare variable IDDOC INTEGER;
declare variable SALDO NUMERIC(18,2);
declare variable NUMROWS INTEGER;
declare variable DIASF INTEGER;
declare variable DIAS INTEGER;
DECLARE VARIABLE FOV CHAR(11);
BEGIN /*$$IBE$$ 
EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'ANALISIS DE CARTERA CON FECHA FACTURA O VENCIMIENTO') RETURNING_VALUES (FOV);
for select TERC_NIT, TERC_NOM, TERC_CONTACTO, TERC_TEL from TERCEROS WHERE TERC_CLIE = 'S' into :NIT, :NOMBRE, :CONTACTO, :TELEFONO
  DO
    BEGIN
    diasmax = 0;
    SELECT COUNT(*) FROM AUTORIZACIONES WHERE AUTO_NITCONTADO = :NIT INTO :numrows;
    IF ((CONTADO = 'S') or (numrows = 0)) THEN
        BEGIN
        FECINI = FECINI - 1;
        INICIAL = 0;
        FOR SELECT MVCL_TIPOREF, MVCL_IDREF, (:FECFIN-MVCL_FECHA), (:FECFIN-MVCL_VENCE) FROM MOVIMIENTO_CLIENTES
            WHERE TERC_NIT = :NIT AND MVCL_FECHA <= :FECINI AND
            MVCL_ABONO = 'N' AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA)) AND
            ((:moneda = 0) or (MVCL_TRM <> 1))
            INTO :TIPODOC, :IDDOC, :DIASF, DIAS
            DO
            BEGIN
            EXECUTE PROCEDURE saldo_doc_cartera(TIPODOC, IDDOC, FECINI, MONEDA) returning_values (SALDO);
            if (SALDO <> 0) then
                BEGIN
                INICIAL = INICIAL + SALDO;
                if (FOV = 'FECHA') then
                    BEGIN
                    if ((SALDO > 0) AND (DIASMAX < DIASF)) then
                        DIASMAX = DIASF;
                    END
                ELSE
                    BEGIN
                    if ((SALDO > 0) AND (DIASMAX < DIAS)) then
                        DIASMAX = DIAS;
                    END
                END
            END
        EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'DESCONTAR RETENCIONES POR CAUSACION') returning_values(:RETES);
        FECINI = FECINI + 1;
        if (RETES = 'SI') then
            BEGIN
            if (MONEDA = 0) then
                BEGIN
                SELECT SUM(MVCL_MONTO-MVCL_RTEFTE-MVCL_RTEIVA-MVCL_RTEICA), MAX(:FECFIN-MVCL_FECHA), MAX(:FECFIN-MVCL_VENCE) FROM movimiento_clientes
                    WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND MVCL_FECHA < :FECFIN
                    AND MVCL_DEBITO = 'S' AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA))
                    INTO :DEBITOS, :diasf, :dias;
                SELECT SUM(MVCL_MONTO-MVCL_RTEFTE-MVCL_RTEIVA-MVCL_RTEICA) FROM movimiento_clientes
                    WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND MVCL_FECHA < :FECFIN
                    AND MVCL_DEBITO = 'N' AND MVCL_ABONO = 'N' and MVCL_TIPOREF <> 45 AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA))
                    INTO :CREDITOS;
                SELECT SUM(MVCL_MONTO) FROM movimiento_clientes
                    WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND MVCL_FECHA < :FECFIN
                    AND MVCL_ABONO = 'S' AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA))
                    INTO :ABONOS;
                END
            ELSE
                BEGIN
                SELECT SUM((MVCL_MONTO-MVCL_RTEFTE-MVCL_RTEIVA-MVCL_RTEICA)/MVCL_TRM), MAX(:FECFIN-MVCL_FECHA), MAX(:FECFIN-MVCL_VENCE) FROM movimiento_clientes
                    WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND MVCL_FECHA < :FECFIN
                    AND MVCL_DEBITO = 'S' AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA))
                    INTO :DEBITOS, :diasf, :dias;
                SELECT SUM((MVCL_MONTO-MVCL_RTEFTE-MVCL_RTEIVA-MVCL_RTEICA)/MVCL_TRM) FROM movimiento_clientes
                    WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND MVCL_FECHA < :FECFIN
                    AND MVCL_DEBITO = 'N' AND MVCL_ABONO = 'N' and MVCL_TIPOREF <> 45 AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA))
                    INTO :CREDITOS;
                SELECT SUM(MVCL_MONTO/MVCL_TRM) FROM movimiento_clientes
                    WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND MVCL_FECHA < :FECFIN
                    AND MVCL_ABONO = 'S' AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA))
                    INTO :ABONOS;
                END
            END
        ELSE
            BEGIN
            if (MONEDA = 0) then
                BEGIN
                SELECT SUM(MVCL_MONTO), MAX(:FECFIN-MVCL_FECHA), MAX(:FECFIN-MVCL_VENCE) FROM movimiento_clientes
                    WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND MVCL_FECHA < :FECFIN
                    AND MVCL_DEBITO = 'S' AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA))
                    INTO :DEBITOS, :diasf, :dias;
                SELECT SUM(MVCL_MONTO) FROM movimiento_clientes
                    WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND MVCL_FECHA < :FECFIN
                    AND MVCL_DEBITO = 'N' AND MVCL_ABONO = 'N' and MVCL_TIPOREF <> 45 AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA))
                    INTO :CREDITOS;
                SELECT SUM(MVCL_MONTO+MVCL_RTEFTE+MVCL_RTEIVA+MVCL_RTEICA) FROM movimiento_clientes
                    WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND MVCL_FECHA < :FECFIN
                    AND MVCL_ABONO = 'S' AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA))
                    INTO :ABONOS;
                END
            ELSE
                BEGIN
                SELECT SUM(MVCL_MONTO/MVCL_TRM), MAX(:FECFIN-MVCL_FECHA), MAX(:FECFIN-MVCL_VENCE) FROM movimiento_clientes
                    WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND MVCL_FECHA < :FECFIN
                    AND MVCL_DEBITO = 'S' AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA))
                    INTO :DEBITOS, :diasf, :dias;
                SELECT SUM(MVCL_MONTO/MVCL_TRM) FROM movimiento_clientes
                    WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND MVCL_FECHA < :FECFIN
                    AND MVCL_DEBITO = 'N' AND MVCL_ABONO = 'N' and MVCL_TIPOREF <> 45 AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA))
                    INTO :CREDITOS;
                SELECT SUM((MVCL_MONTO+MVCL_RTEFTE+MVCL_RTEIVA+MVCL_RTEICA)/MVCL_TRM) FROM movimiento_clientes
                    WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND MVCL_FECHA < :FECFIN
                    AND MVCL_ABONO = 'S' AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA))
                    INTO :ABONOS;
                END
            END
        if (FOV = 'FECHA') then
            BEGIN
            if ((DIASMAX < DIASF) AND (DIASF IS NOT NULL)) then
                DIASMAX = DIASF;
            END
        ELSE
            BEGIN
            if ((DIASMAX < DIAS) AND (DIAS IS NOT NULL)) then
                DIASMAX = DIAS;
            END
        if (DEBITOS IS NULL) then
            DEBITOS = 0;
        if (CREDITOS IS NULL) then
            CREDITOS = 0;
        if (ABONOS IS NULL) then
            ABONOS = 0;
        FINAL = INICIAL + DEBITOS - CREDITOS - ABONOS;
        SUSPEND;
        END
    END
SUSPEND;
 $$IBE$$*/ SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE RECUPERACION_CARTERA(
    DESDE VARCHAR(20),
    HASTA VARCHAR(20),
    GRPINI VARCHAR(5),
    GRPFIN VARCHAR(5),
    FECHA DATE,
    ORDEN CHAR(1),
    AGRUPA CHAR(1),
    SUCURSAL INTEGER,
    MONEDA INTEGER)
RETURNS (
    NIT VARCHAR(20),
    NOMBRE VARCHAR(60),
    TELEFONO VARCHAR(40),
    CIUDAD VARCHAR(60),
    CODZONA VARCHAR(2),
    NOMZONA VARCHAR(60),
    CODCOBR INTEGER,
    NOMCOBR VARCHAR(60),
    DV CHAR(1),
    CODCIUD CHAR(5),
    NOMCIUD VARCHAR(60),
    INICIAL NUMERIC(18,2),
    CARGOS1 NUMERIC(18,2),
    ABONOS1 NUMERIC(18,2),
    CARGOS2 NUMERIC(18,2),
    ABONOS2 NUMERIC(18,2),
    CARGOS3 NUMERIC(18,2),
    ABONOS3 NUMERIC(18,2),
    FINAL NUMERIC(18,2))
AS
declare variable NITINI VARCHAR(20);
declare variable NITFIN VARCHAR(20);
declare variable NOMINI VARCHAR(60);
declare variable NOMFIN VARCHAR(60);
declare variable OK CHAR(1);
declare variable FECINI DATE;
declare variable FECFIN DATE;
declare variable DEBITO NUMERIC(18,2);
declare variable CREDITO NUMERIC(18,2);
declare variable TIPODOC INTEGER;
declare variable IDDOC INTEGER;
declare variable SALDO NUMERIC(18,2);
declare variable RTFTE NUMERIC(18,2);
declare variable RTIVA NUMERIC(18,2);
declare variable RTICA NUMERIC(18,2);
declare variable RETES CHAR(2);
BEGIN /*$$IBE$$ 
EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'DESCONTAR RETENCIONES POR CAUSACION') returning_values (:RETES);
if (ORDEN = 'C') then
    BEGIN
    NITINI = DESDE;
    NITFIN = HASTA;
    NOMINI = '';
    NOMFIN = 'zz';
    END
ELSE
    BEGIN
    NOMINI = DESDE;
    NOMFIN = HASTA;
    NITINI = '';
    NITFIN = 'zz';
    END
   $$IBE$$*/ /* Ubique el NIT */ /*$$IBE$$ 
  FOR select T.TERC_NIT, TERC_NOM, TERC_DV, TERC_TEL, TERC_CIU, S.COBR_COD, C.ZONA_COD, T.CIUD_COD
    from terceros T, CLIENTES C, CLIENTE_SUCURSALES S
    where S.TERC_NIT = T.TERC_NIT AND C.TERC_NIT = T.TERC_NIT AND TERC_CLIE = 'S' AND T.TERC_NIT >= :NITINI AND T.TERC_NIT <= :NITFIN AND
        TERC_NOM >= :NOMINI AND TERC_NOM <= :NOMFIN
    INTO :NIT, :NOMBRE, :DV, :TELEFONO, :CIUDAD, :CODCOBR, :CODZONA, :CODCIUD
    DO  
    BEGIN
    FECINI = FECHA - 90;
    OK = 'N';
    if (AGRUPA = 'Z') then
        BEGIN
        if (GRPINI = '') then
            BEGIN
            if ((CODZONA IS NULL) or (CODZONA >= :GRPINI AND CODZONA <= :GRPFIN)) then
                OK = 'S';
            END
        ELSE
            if (CODZONA >= :GRPINI AND CODZONA <= :GRPFIN) then
                OK = 'S';
        END
    if (AGRUPA = 'I') then
        BEGIN
        if (GRPINI = '') then
            BEGIN
            if ((CODCIUD IS NULL) or (CODCIUD >= :GRPINI AND CODCIUD <= :GRPFIN)) then
                OK = 'S';
            END
        ELSE
            if (CODCIUD >= :GRPINI AND CODCIUD <= :GRPFIN) then
                OK = 'S';
        END
    if (AGRUPA = 'N') then
        OK = 'S';
        
    if (OK = 'S') then
        BEGIN
        SELECT COBR_NOM FROM COBRADORES CB WHERE COBR_COD = :CODCOBR INTO :NOMCOBR;
        SELECT ZONA_NOM FROM ZONAS WHERE ZONA_COD = :CODZONA INTO :NOMZONA;
        SELECT CIUD_NOM FROM CIUDADES WHERE CIUD_COD = :CODCIUD INTO :NOMCIUD;
        CARGOS1 = 0;
        ABONOS1 = 0;
        CARGOS2 = 0;
        ABONOS2 = 0;
        CARGOS3 = 0;
        ABONOS3 = 0;
        INICIAL = 0;
        FOR SELECT MVCL_TIPOREF, MVCL_IDREF FROM MOVIMIENTO_CLIENTES
            WHERE TERC_NIT = :NIT AND MVCL_FECHA <= :FECINI AND ((:MONEDA = 0) or (MVCL_TRM <> 1)) AND
            MVCL_ABONO = 'N' AND ((:SUCURSAL = 0) or (SUCU_ID = :SUCURSAL))
            INTO :TIPODOC, :IDDOC
            DO
            BEGIN
            EXECUTE PROCEDURE saldo_doc_cartera(TIPODOC, IDDOC, FECINI, MONEDA) returning_values (SALDO);
            INICIAL = INICIAL + SALDO;
            END
        FECFIN = FECINI + 30;
        if (MONEDA = 0) then
            SELECT SUM(MVCL_MONTO), SUM(MVCL_RTEFTE), SUM(MVCL_RTEIVA), SUM(MVCL_RTEICA) FROM movimiento_clientes WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND
                MVCL_FECHA < :FECFIN AND MVCL_DEBITO = 'S' AND MVCL_ABONO = 'N' AND ((:SUCURSAL = 0) or (SUCU_ID = :SUCURSAL))
                INTO :DEBITO, :RTFTE, :RTIVA, :RTICA;
        ELSE
            SELECT SUM(MVCL_MONTO/MVCL_TRM), SUM(MVCL_RTEFTE/MVCL_TRM), SUM(MVCL_RTEIVA/MVCL_TRM), SUM(MVCL_RTEICA/MVCL_TRM)
                FROM movimiento_clientes WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND ((:MONEDA = 0) or (MVCL_TRM <> 1)) AND
                MVCL_FECHA < :FECFIN AND MVCL_DEBITO = 'S' AND MVCL_ABONO = 'N' AND ((:SUCURSAL = 0) or (SUCU_ID = :SUCURSAL))
                INTO :DEBITO, :RTFTE, :RTIVA, :RTICA;
        if (DEBITO IS NULL) then
            DEBITO = 0;
        if (rtfte IS NULL) then
            rtfte = 0;
        if (rtiva IS NULL) then
            rtiva = 0;
        if (rtica IS NULL) then
            rtica = 0;
        IF (RETES = 'SI') then
            DEBITO = DEBITO - RTFTE - RTIVA - RTICA;

        if (MONEDA = 0) then
            SELECT SUM(MVCL_MONTO), SUM(MVCL_RTEFTE), SUM(MVCL_RTEIVA), SUM(MVCL_RTEICA)  FROM movimiento_clientes WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI
                AND MVCL_FECHA < :FECFIN AND MVCL_DEBITO = 'N'  AND MVCL_ABONO = 'N' AND ((:SUCURSAL = 0) or (SUCU_ID = :SUCURSAL))
                INTO :CREDITO, :RTFTE, :RTIVA, :RTICA;
        ELSE
            SELECT SUM(MVCL_MONTO/MVCL_TRM), SUM(MVCL_RTEFTE/MVCL_TRM), SUM(MVCL_RTEIVA/MVCL_TRM), SUM(MVCL_RTEICA/MVCL_TRM)
                FROM movimiento_clientes WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND ((:MONEDA = 0) or (MVCL_TRM <> 1))
                AND MVCL_FECHA < :FECFIN AND MVCL_DEBITO = 'N'  AND MVCL_ABONO = 'N' AND ((:SUCURSAL = 0) or (SUCU_ID = :SUCURSAL))
                INTO :CREDITO, :RTFTE, :RTIVA, :RTICA;
        if (CREDITO IS NULL) then
            CREDITO = 0;
        if (rtfte IS NULL) then
            rtfte = 0;
        if (rtiva IS NULL) then
            rtiva = 0;
        if (rtica IS NULL) then
            rtica = 0;
        IF (RETES = 'SI') then
            CREDITO = CREDITO - RTFTE - RTIVA - RTICA;
        CARGOS3 = DEBITO - CREDITO;
        if (MONEDA = 0) then
            SELECT SUM(MVCL_MONTO), SUM(MVCL_RTEFTE), SUM(MVCL_RTEIVA), SUM(MVCL_RTEICA)  FROM movimiento_clientes WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI
                AND MVCL_FECHA < :FECFIN AND MVCL_DEBITO = 'N' AND MVCL_ABONO = 'S' AND ((:SUCURSAL = 0) or (SUCU_ID = :SUCURSAL))
                INTO :CREDITO, :RTFTE, :RTIVA, :RTICA;
        ELSE
            SELECT SUM(MVCL_MONTO/MVCL_TRM), SUM(MVCL_RTEFTE/MVCL_TRM), SUM(MVCL_RTEIVA/MVCL_TRM), SUM(MVCL_RTEICA/MVCL_TRM)
                FROM movimiento_clientes WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND ((:MONEDA = 0) or (MVCL_TRM <> 1))
                AND MVCL_FECHA < :FECFIN AND MVCL_DEBITO = 'N' AND MVCL_ABONO = 'S' AND ((:SUCURSAL = 0) or (SUCU_ID = :SUCURSAL))
                INTO :CREDITO, :RTFTE, :RTIVA, :RTICA;
        if (CREDITO IS NULL) then
            CREDITO = 0;
        if (rtfte IS NULL) then
            rtfte = 0;
        if (rtiva IS NULL) then
            rtiva = 0;
        if (rtica IS NULL) then
            rtica = 0;
        IF (RETES = 'NO') then
            CREDITO = CREDITO + RTFTE + RTIVA + RTICA;
        ABONOS3 = CREDITO;
        FECINI = FECFIN;
        FECFIN = FECINI + 30;
        if (MONEDA = 0) then
            SELECT SUM(MVCL_MONTO), SUM(MVCL_RTEFTE), SUM(MVCL_RTEIVA), SUM(MVCL_RTEICA)  FROM movimiento_clientes WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI
                AND MVCL_FECHA < :FECFIN AND MVCL_DEBITO = 'S' AND MVCL_ABONO = 'N' AND ((:SUCURSAL = 0) or (SUCU_ID = :SUCURSAL))
                INTO :DEBITO, :RTFTE, :RTIVA, :RTICA;
        ELSE
            SELECT SUM(MVCL_MONTO/MVCL_TRM), SUM(MVCL_RTEFTE/MVCL_TRM), SUM(MVCL_RTEIVA/MVCL_TRM), SUM(MVCL_RTEICA/MVCL_TRM)
                FROM movimiento_clientes WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND ((:MONEDA = 0) or (MVCL_TRM <> 1))
                AND MVCL_FECHA < :FECFIN AND MVCL_DEBITO = 'S' AND MVCL_ABONO = 'N' AND ((:SUCURSAL = 0) or (SUCU_ID = :SUCURSAL))
                INTO :DEBITO, :RTFTE, :RTIVA, :RTICA;
        if (DEBITO IS NULL) then
            DEBITO = 0;
        if (rtfte IS NULL) then
            rtfte = 0;
        if (rtiva IS NULL) then
            rtiva = 0;
        if (rtica IS NULL) then
            rtica = 0;
        IF (RETES = 'SI') then
            DEBITO = DEBITO - RTFTE - RTIVA - RTICA;
        if (MONEDA = 0) then
            SELECT SUM(MVCL_MONTO), SUM(MVCL_RTEFTE), SUM(MVCL_RTEIVA), SUM(MVCL_RTEICA)  FROM movimiento_clientes WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI
                AND MVCL_FECHA < :FECFIN AND MVCL_DEBITO = 'N'  AND MVCL_ABONO = 'N' AND ((:SUCURSAL = 0) or (SUCU_ID = :SUCURSAL))
                INTO :CREDITO, :RTFTE, :RTIVA, :RTICA;
        ELSE
            SELECT SUM(MVCL_MONTO/MVCL_TRM), SUM(MVCL_RTEFTE/MVCL_TRM), SUM(MVCL_RTEIVA/MVCL_TRM), SUM(MVCL_RTEICA/MVCL_TRM)
                FROM movimiento_clientes WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND ((:MONEDA = 0) or (MVCL_TRM <> 1))
                AND MVCL_FECHA < :FECFIN AND MVCL_DEBITO = 'N'  AND MVCL_ABONO = 'N' AND ((:SUCURSAL = 0) or (SUCU_ID = :SUCURSAL))
                INTO :CREDITO, :RTFTE, :RTIVA, :RTICA;
        if (CREDITO IS NULL) then
            CREDITO = 0;
        if (rtfte IS NULL) then
            rtfte = 0;
        if (rtiva IS NULL) then
            rtiva = 0;
        if (rtica IS NULL) then
            rtica = 0;
        IF (RETES = 'SI') then
            CREDITO = CREDITO - RTFTE - RTIVA - RTICA;
        CARGOS2 = DEBITO - CREDITO;
        if (MONEDA = 0) then
            SELECT SUM(MVCL_MONTO), SUM(MVCL_RTEFTE), SUM(MVCL_RTEIVA), SUM(MVCL_RTEICA)  FROM movimiento_clientes WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI
                AND MVCL_FECHA < :FECFIN AND MVCL_DEBITO = 'N'  AND MVCL_ABONO = 'S' AND ((:SUCURSAL = 0) or (SUCU_ID = :SUCURSAL))
                INTO :CREDITO, :RTFTE, :RTIVA, :RTICA;
        ELSE
            SELECT SUM(MVCL_MONTO/MVCL_TRM), SUM(MVCL_RTEFTE/MVCL_TRM), SUM(MVCL_RTEIVA/MVCL_TRM), SUM(MVCL_RTEICA/MVCL_TRM)
                FROM movimiento_clientes WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND ((:MONEDA = 0) or (MVCL_TRM <> 1))
                AND MVCL_FECHA < :FECFIN AND MVCL_DEBITO = 'N'  AND MVCL_ABONO = 'S' AND ((:SUCURSAL = 0) or (SUCU_ID = :SUCURSAL))
                INTO :CREDITO, :RTFTE, :RTIVA, :RTICA;
        if (CREDITO IS NULL) then
            CREDITO = 0;
        if (rtfte IS NULL) then
            rtfte = 0;
        if (rtiva IS NULL) then
            rtiva = 0;
        if (rtica IS NULL) then
            rtica = 0;
        IF (RETES = 'NO') then
            CREDITO = CREDITO + RTFTE + RTIVA + RTICA;
        ABONOS2 = CREDITO;
        FECINI = FECFIN;
        FECFIN = FECINI + 30;
        if (MONEDA = 0) then
            SELECT SUM(MVCL_MONTO), SUM(MVCL_RTEFTE), SUM(MVCL_RTEIVA), SUM(MVCL_RTEICA)  FROM movimiento_clientes WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI
                AND MVCL_FECHA < :FECFIN AND MVCL_DEBITO = 'S' AND MVCL_ABONO = 'N' AND ((:SUCURSAL = 0) or (SUCU_ID = :SUCURSAL))
                INTO :DEBITO, :RTFTE, :RTIVA, :RTICA;
        ELSE
            SELECT SUM(MVCL_MONTO/MVCL_TRM), SUM(MVCL_RTEFTE/MVCL_TRM), SUM(MVCL_RTEIVA/MVCL_TRM), SUM(MVCL_RTEICA/MVCL_TRM)
                FROM movimiento_clientes WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND ((:MONEDA = 0) or (MVCL_TRM <> 1))
                AND MVCL_FECHA < :FECFIN AND MVCL_DEBITO = 'S' AND MVCL_ABONO = 'N' AND ((:SUCURSAL = 0) or (SUCU_ID = :SUCURSAL))
                INTO :DEBITO, :RTFTE, :RTIVA, :RTICA;
        if (DEBITO IS NULL) then
            DEBITO = 0;
        if (rtfte IS NULL) then
            rtfte = 0;
        if (rtiva IS NULL) then
            rtiva = 0;
        if (rtica IS NULL) then
            rtica = 0;
        IF (RETES = 'SI') then
            DEBITO = DEBITO - RTFTE - RTIVA - RTICA;
        if (MONEDA = 0) then
            SELECT SUM(MVCL_MONTO), SUM(MVCL_RTEFTE), SUM(MVCL_RTEIVA), SUM(MVCL_RTEICA)  FROM movimiento_clientes WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI
                AND MVCL_FECHA < :FECFIN AND MVCL_DEBITO = 'N'  AND MVCL_ABONO = 'N' AND ((:SUCURSAL = 0) or (SUCU_ID = :SUCURSAL))
                INTO :CREDITO, :RTFTE, :RTIVA, :RTICA;
        ELSE
            SELECT SUM(MVCL_MONTO/MVCL_TRM), SUM(MVCL_RTEFTE/MVCL_TRM), SUM(MVCL_RTEIVA/MVCL_TRM), SUM(MVCL_RTEICA/MVCL_TRM)
                FROM movimiento_clientes WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND ((:MONEDA = 0) or (MVCL_TRM <> 1))
                AND MVCL_FECHA < :FECFIN AND MVCL_DEBITO = 'N'  AND MVCL_ABONO = 'N' AND ((:SUCURSAL = 0) or (SUCU_ID = :SUCURSAL))
                INTO :CREDITO, :RTFTE, :RTIVA, :RTICA;
        if (CREDITO IS NULL) then
            CREDITO = 0;
        if (rtfte IS NULL) then
            rtfte = 0;
        if (rtiva IS NULL) then
            rtiva = 0;
        if (rtica IS NULL) then
            rtica = 0;
        IF (RETES = 'SI') then
            CREDITO = CREDITO - RTFTE - RTIVA - RTICA;
        CARGOS1 = DEBITO - CREDITO;
        if (MONEDA = 0) then
            SELECT SUM(MVCL_MONTO), SUM(MVCL_RTEFTE), SUM(MVCL_RTEIVA), SUM(MVCL_RTEICA)  FROM movimiento_clientes WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI
                AND MVCL_FECHA < :FECFIN AND MVCL_DEBITO = 'N'  AND MVCL_ABONO = 'S' AND ((:SUCURSAL = 0) or (SUCU_ID = :SUCURSAL))
                INTO :CREDITO, :RTFTE, :RTIVA, :RTICA;
        ELSE
            SELECT SUM(MVCL_MONTO/MVCL_TRM), SUM(MVCL_RTEFTE/MVCL_TRM), SUM(MVCL_RTEIVA/MVCL_TRM), SUM(MVCL_RTEICA/MVCL_TRM)
                FROM movimiento_clientes WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND ((:MONEDA = 0) or (MVCL_TRM <> 1))
                AND MVCL_FECHA < :FECFIN AND MVCL_DEBITO = 'N'  AND MVCL_ABONO = 'S' AND ((:SUCURSAL = 0) or (SUCU_ID = :SUCURSAL))
                INTO :CREDITO, :RTFTE, :RTIVA, :RTICA;
        if (CREDITO IS NULL) then
            CREDITO = 0;
        if (rtfte IS NULL) then
            rtfte = 0;
        if (rtiva IS NULL) then
            rtiva = 0;
        if (rtica IS NULL) then
            rtica = 0;
        IF (RETES = 'NO') then
            CREDITO = CREDITO + RTFTE + RTIVA + RTICA;
        ABONOS1 = CREDITO;
        FINAL = INICIAL + CARGOS3 + CARGOS2 + CARGOS1 + ABONOS3 + ABONOS2 + ABONOS1;
        SUSPEND;
        END

    if (AGRUPA = 'C') then
        BEGIN
        CARGOS1 = 0;
        ABONOS1 = 0;
        CARGOS2 = 0;
        ABONOS2 = 0;
        CARGOS3 = 0;
        ABONOS3 = 0;
        INICIAL = 0;
        for select distinct cobr_cod from movimiento_clientes
            WHERE TERC_NIT = :NIT AND MVCL_FECHA <= :FECINI AND
            MVCL_ABONO = 'N' AND ((:SUCURSAL = 0) or (SUCU_ID = :SUCURSAL))
            into :codcobr
            do
            BEGIN
            OK = 'N';
            if (GRPINI = '') then
                BEGIN
                if ((CODCOBR IS NULL) or (CODCOBR >= :GRPINI AND CODCOBR <= :GRPFIN)) then
                    OK = 'S';
                END
            ELSE
                if (CODCOBR >= :GRPINI AND CODCOBR <= :GRPFIN) then
                    OK = 'S';
            if (OK = 'S') then
                begin
                SELECT COBR_NOM FROM COBRADORES WHERE COBR_COD = :codcobr INTO :nomcobr;
                FOR SELECT MVCL_TIPOREF, MVCL_IDREF FROM MOVIMIENTO_CLIENTES
                    WHERE TERC_NIT = :NIT AND MVCL_FECHA <= :FECINI AND COBR_COD = :codcobr AND
                    MVCL_ABONO = 'N' AND ((:SUCURSAL = 0) or (SUCU_ID = :SUCURSAL))
                    INTO :TIPODOC, :IDDOC
                    DO
                    BEGIN
                    EXECUTE PROCEDURE saldo_doc_cartera(TIPODOC, IDDOC, FECINI, 0) returning_values (SALDO);
                    INICIAL = INICIAL + SALDO;
                    END
                FECFIN = FECINI + 30;
                if (MONEDA = 0) then
                    SELECT SUM(MVCL_MONTO), SUM(MVCL_RTEFTE), SUM(MVCL_RTEIVA), SUM(MVCL_RTEICA) FROM movimiento_clientes WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND
                        MVCL_FECHA < :FECFIN AND MVCL_DEBITO = 'S' AND MVCL_ABONO = 'N' AND COBR_COD = :codcobr AND ((:SUCURSAL = 0) or (SUCU_ID = :SUCURSAL))
                        INTO :DEBITO, :RTFTE, :RTIVA, :RTICA;
                ELSE
                    SELECT SUM(MVCL_MONTO/MVCL_TRM), SUM(MVCL_RTEFTE/MVCL_TRM), SUM(MVCL_RTEIVA/MVCL_TRM), SUM(MVCL_RTEICA/MVCL_TRM)
                        FROM movimiento_clientes WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND ((:MONEDA = 0) or (MVCL_TRM <> 1)) AND
                        MVCL_FECHA < :FECFIN AND MVCL_DEBITO = 'S' AND MVCL_ABONO = 'N' AND COBR_COD = :codcobr AND ((:SUCURSAL = 0) or (SUCU_ID = :SUCURSAL))
                        INTO :DEBITO, :RTFTE, :RTIVA, :RTICA;
                if (DEBITO IS NULL) then
                    DEBITO = 0;
                if (rtfte IS NULL) then
                    rtfte = 0;
                if (rtiva IS NULL) then
                    rtiva = 0;
                if (rtica IS NULL) then
                    rtica = 0;
                IF (RETES = 'SI') then
                    DEBITO = DEBITO - RTFTE - RTIVA - RTICA;
                if (MONEDA = 0) then
                    SELECT SUM(MVCL_MONTO), SUM(MVCL_RTEFTE), SUM(MVCL_RTEIVA), SUM(MVCL_RTEICA) FROM movimiento_clientes WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI
                        AND MVCL_FECHA < :FECFIN AND MVCL_DEBITO = 'N'  AND MVCL_ABONO = 'N' AND COBR_COD = :codcobr AND ((:SUCURSAL = 0) or (SUCU_ID = :SUCURSAL))
                        INTO :CREDITO, :RTFTE, :RTIVA, :RTICA;
                ELSE
                    SELECT SUM(MVCL_MONTO/MVCL_TRM), SUM(MVCL_RTEFTE/MVCL_TRM), SUM(MVCL_RTEIVA/MVCL_TRM), SUM(MVCL_RTEICA/MVCL_TRM)
                        FROM movimiento_clientes WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND ((:MONEDA = 0) or (MVCL_TRM <> 1)) 
                        AND MVCL_FECHA < :FECFIN AND MVCL_DEBITO = 'N'  AND MVCL_ABONO = 'N' AND COBR_COD = :codcobr AND ((:SUCURSAL = 0) or (SUCU_ID = :SUCURSAL))
                        INTO :CREDITO, :RTFTE, :RTIVA, :RTICA;
                if (CREDITO IS NULL) then
                    CREDITO = 0;
                if (rtfte IS NULL) then
                    rtfte = 0;
                if (rtiva IS NULL) then
                    rtiva = 0;
                if (rtica IS NULL) then
                    rtica = 0;
                IF (RETES = 'SI') then
                    CREDITO = CREDITO - RTFTE - RTIVA - RTICA;
                CARGOS3 = DEBITO - CREDITO;
                if (MONEDA = 0) then
                    SELECT SUM(MVCL_MONTO), SUM(MVCL_RTEFTE), SUM(MVCL_RTEIVA), SUM(MVCL_RTEICA) FROM movimiento_clientes WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI
                        AND MVCL_FECHA < :FECFIN AND MVCL_DEBITO = 'N' AND MVCL_ABONO = 'S' AND COBR_COD = :codcobr AND ((:SUCURSAL = 0) or (SUCU_ID = :SUCURSAL))
                        INTO :CREDITO, :RTFTE, :RTIVA, :RTICA;
                ELSE
                    SELECT SUM(MVCL_MONTO/MVCL_TRM), SUM(MVCL_RTEFTE/MVCL_TRM), SUM(MVCL_RTEIVA/MVCL_TRM), SUM(MVCL_RTEICA/MVCL_TRM)
                        FROM movimiento_clientes WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND ((:MONEDA = 0) or (MVCL_TRM <> 1)) 
                        AND MVCL_FECHA < :FECFIN AND MVCL_DEBITO = 'N' AND MVCL_ABONO = 'S' AND COBR_COD = :codcobr AND ((:SUCURSAL = 0) or (SUCU_ID = :SUCURSAL))
                        INTO :CREDITO, :RTFTE, :RTIVA, :RTICA;
                if (CREDITO IS NULL) then
                    CREDITO = 0;
                if (rtfte IS NULL) then
                    rtfte = 0;
                if (rtiva IS NULL) then
                    rtiva = 0;
                if (rtica IS NULL) then
                    rtica = 0;
                IF (RETES = 'NO') then
                    CREDITO = CREDITO + RTFTE + RTIVA + RTICA;
                ABONOS3 = CREDITO;
                FECINI = FECFIN;
                FECFIN = FECINI + 30;
                if (MONEDA = 0) then
                    SELECT SUM(MVCL_MONTO), SUM(MVCL_RTEFTE), SUM(MVCL_RTEIVA), SUM(MVCL_RTEICA) FROM movimiento_clientes WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI
                        AND MVCL_FECHA < :FECFIN AND MVCL_DEBITO = 'S' AND MVCL_ABONO = 'N' AND COBR_COD = :codcobr AND ((:SUCURSAL = 0) or (SUCU_ID = :SUCURSAL))
                        INTO :DEBITO, :RTFTE, :RTIVA, :RTICA;
                ELSE
                    SELECT SUM(MVCL_MONTO/MVCL_TRM), SUM(MVCL_RTEFTE/MVCL_TRM), SUM(MVCL_RTEIVA/MVCL_TRM), SUM(MVCL_RTEICA/MVCL_TRM)
                        FROM movimiento_clientes WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND ((:MONEDA = 0) or (MVCL_TRM <> 1)) 
                        AND MVCL_FECHA < :FECFIN AND MVCL_DEBITO = 'S' AND MVCL_ABONO = 'N' AND COBR_COD = :codcobr AND ((:SUCURSAL = 0) or (SUCU_ID = :SUCURSAL))
                        INTO :DEBITO, :RTFTE, :RTIVA, :RTICA;
                if (DEBITO IS NULL) then
                    DEBITO = 0;
                if (rtfte IS NULL) then
                    rtfte = 0;
                if (rtiva IS NULL) then
                    rtiva = 0;
                if (rtica IS NULL) then
                    rtica = 0;
                IF (RETES = 'SI') then
                    DEBITO = DEBITO - RTFTE - RTIVA - RTICA;
                if (MONEDA = 0) then
                    SELECT SUM(MVCL_MONTO), SUM(MVCL_RTEFTE), SUM(MVCL_RTEIVA), SUM(MVCL_RTEICA) FROM movimiento_clientes WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI
                        AND MVCL_FECHA < :FECFIN AND MVCL_DEBITO = 'N'  AND MVCL_ABONO = 'N' AND COBR_COD = :codcobr AND ((:SUCURSAL = 0) or (SUCU_ID = :SUCURSAL))
                        INTO :CREDITO, :RTFTE, :RTIVA, :RTICA;
                ELSE
                    SELECT SUM(MVCL_MONTO/MVCL_TRM), SUM(MVCL_RTEFTE/MVCL_TRM), SUM(MVCL_RTEIVA/MVCL_TRM), SUM(MVCL_RTEICA/MVCL_TRM)
                        FROM movimiento_clientes WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND ((:MONEDA = 0) or (MVCL_TRM <> 1)) 
                        AND MVCL_FECHA < :FECFIN AND MVCL_DEBITO = 'N'  AND MVCL_ABONO = 'N' AND COBR_COD = :codcobr AND ((:SUCURSAL = 0) or (SUCU_ID = :SUCURSAL))
                        INTO :CREDITO, :RTFTE, :RTIVA, :RTICA;
                if (CREDITO IS NULL) then
                    CREDITO = 0;
                if (rtfte IS NULL) then
                    rtfte = 0;
                if (rtiva IS NULL) then
                    rtiva = 0;
                if (rtica IS NULL) then
                    rtica = 0;
                IF (RETES = 'SI') then
                    CREDITO = CREDITO - RTFTE - RTIVA - RTICA;
                CARGOS2 = DEBITO - CREDITO;
                if (MONEDA = 0) then
                    SELECT SUM(MVCL_MONTO), SUM(MVCL_RTEFTE), SUM(MVCL_RTEIVA), SUM(MVCL_RTEICA) FROM movimiento_clientes WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI
                        AND MVCL_FECHA < :FECFIN AND MVCL_DEBITO = 'N'  AND MVCL_ABONO = 'S' AND COBR_COD = :codcobr AND ((:SUCURSAL = 0) or (SUCU_ID = :SUCURSAL))
                        INTO :CREDITO, :RTFTE, :RTIVA, :RTICA;
                ELSE
                    SELECT SUM(MVCL_MONTO/MVCL_TRM), SUM(MVCL_RTEFTE/MVCL_TRM), SUM(MVCL_RTEIVA/MVCL_TRM), SUM(MVCL_RTEICA/MVCL_TRM)
                        FROM movimiento_clientes WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND ((:MONEDA = 0) or (MVCL_TRM <> 1)) 
                        AND MVCL_FECHA < :FECFIN AND MVCL_DEBITO = 'N'  AND MVCL_ABONO = 'S' AND COBR_COD = :codcobr AND ((:SUCURSAL = 0) or (SUCU_ID = :SUCURSAL))
                        INTO :CREDITO, :RTFTE, :RTIVA, :RTICA;
                if (CREDITO IS NULL) then
                    CREDITO = 0;
                if (rtfte IS NULL) then
                    rtfte = 0;
                if (rtiva IS NULL) then
                    rtiva = 0;
                if (rtica IS NULL) then
                    rtica = 0;
                IF (RETES = 'NO') then
                    CREDITO = CREDITO + RTFTE + RTIVA + RTICA;
                ABONOS2 = CREDITO;
                FECINI = FECFIN;
                FECFIN = FECINI + 30;
                if (MONEDA = 0) then
                    SELECT SUM(MVCL_MONTO), SUM(MVCL_RTEFTE), SUM(MVCL_RTEIVA), SUM(MVCL_RTEICA) FROM movimiento_clientes WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI
                        AND MVCL_FECHA < :FECFIN AND MVCL_DEBITO = 'S' AND MVCL_ABONO = 'N' AND COBR_COD = :codcobr AND ((:SUCURSAL = 0) or (SUCU_ID = :SUCURSAL))
                        INTO :DEBITO, :RTFTE, :RTIVA, :RTICA;
                ELSE
                    SELECT SUM(MVCL_MONTO/MVCL_TRM), SUM(MVCL_RTEFTE/MVCL_TRM), SUM(MVCL_RTEIVA/MVCL_TRM), SUM(MVCL_RTEICA/MVCL_TRM)
                        FROM movimiento_clientes WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND ((:MONEDA = 0) or (MVCL_TRM <> 1)) 
                        AND MVCL_FECHA < :FECFIN AND MVCL_DEBITO = 'S' AND MVCL_ABONO = 'N' AND COBR_COD = :codcobr AND ((:SUCURSAL = 0) or (SUCU_ID = :SUCURSAL))
                        INTO :DEBITO, :RTFTE, :RTIVA, :RTICA;
                if (DEBITO IS NULL) then
                    DEBITO = 0;
                if (rtfte IS NULL) then
                    rtfte = 0;
                if (rtiva IS NULL) then
                    rtiva = 0;
                if (rtica IS NULL) then
                    rtica = 0;
                IF (RETES = 'SI') then
                    DEBITO = DEBITO - RTFTE - RTIVA - RTICA;
                if (MONEDA = 0) then
                    SELECT SUM(MVCL_MONTO), SUM(MVCL_RTEFTE), SUM(MVCL_RTEIVA), SUM(MVCL_RTEICA) FROM movimiento_clientes WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI
                        AND MVCL_FECHA < :FECFIN AND MVCL_DEBITO = 'N'  AND MVCL_ABONO = 'N' AND COBR_COD = :codcobr AND ((:SUCURSAL = 0) or (SUCU_ID = :SUCURSAL))
                        INTO :CREDITO, :RTFTE, :RTIVA, :RTICA;
                ELSE
                    SELECT SUM(MVCL_MONTO/MVCL_TRM), SUM(MVCL_RTEFTE/MVCL_TRM), SUM(MVCL_RTEIVA/MVCL_TRM), SUM(MVCL_RTEICA/MVCL_TRM)
                        FROM movimiento_clientes WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND ((:MONEDA = 0) or (MVCL_TRM <> 1)) 
                        AND MVCL_FECHA < :FECFIN AND MVCL_DEBITO = 'N'  AND MVCL_ABONO = 'N' AND COBR_COD = :codcobr AND ((:SUCURSAL = 0) or (SUCU_ID = :SUCURSAL))
                        INTO :CREDITO, :RTFTE, :RTIVA, :RTICA;
                if (CREDITO IS NULL) then
                    CREDITO = 0;
                if (rtfte IS NULL) then
                    rtfte = 0;
                if (rtiva IS NULL) then
                    rtiva = 0;
                if (rtica IS NULL) then
                    rtica = 0;
                IF (RETES = 'SI') then
                    CREDITO = CREDITO - RTFTE - RTIVA - RTICA;
                CARGOS1 = DEBITO - CREDITO;
                if (MONEDA = 0) then
                    SELECT SUM(MVCL_MONTO), SUM(MVCL_RTEFTE), SUM(MVCL_RTEIVA), SUM(MVCL_RTEICA) FROM movimiento_clientes WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI
                        AND MVCL_FECHA < :FECFIN AND MVCL_DEBITO = 'N'  AND MVCL_ABONO = 'S' AND COBR_COD = :codcobr AND ((:SUCURSAL = 0) or (SUCU_ID = :SUCURSAL))
                        INTO :CREDITO, :RTFTE, :RTIVA, :RTICA;
                ELSE
                    SELECT SUM(MVCL_MONTO/MVCL_TRM), SUM(MVCL_RTEFTE/MVCL_TRM), SUM(MVCL_RTEIVA/MVCL_TRM), SUM(MVCL_RTEICA/MVCL_TRM)
                        FROM movimiento_clientes WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND ((:MONEDA = 0) or (MVCL_TRM <> 1)) 
                        AND MVCL_FECHA < :FECFIN AND MVCL_DEBITO = 'N'  AND MVCL_ABONO = 'S' AND COBR_COD = :codcobr AND ((:SUCURSAL = 0) or (SUCU_ID = :SUCURSAL))
                        INTO :CREDITO, :RTFTE, :RTIVA, :RTICA;
                if (CREDITO IS NULL) then
                    CREDITO = 0;
                if (rtfte IS NULL) then
                    rtfte = 0;
                if (rtiva IS NULL) then
                    rtiva = 0;
                if (rtica IS NULL) then
                    rtica = 0;
                IF (RETES = 'NO') then
                    CREDITO = CREDITO + RTFTE + RTIVA + RTICA;
                ABONOS1 = CREDITO;
                FINAL = INICIAL + CARGOS3 + CARGOS2 + CARGOS1 - ABONOS3 - ABONOS2 - ABONOS1;
                SUSPEND;
                END
            END
        END
    END
SUSPEND;
 $$IBE$$*/ SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE REGISTRA_RECIBOS_CONTADO(
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    PREFAC VARCHAR(4),
    MONTO NUMERIC(18,2))
AS
declare variable id integer;
declare variable idr integer;
declare variable NIT VARCHAR(20);
declare variable punto integer;
declare variable caja integer;
declare variable vend integer;
begin /*$$IBE$$ 
for select fact_id, f.pref_pre, fact_numero, fact_fecha, vend_cod, terc_nit, a.auto_prefrdc, ptvt_id from facturas f, autorizaciones a
    where f.pref_pre = a.pref_pre and a.auto_contado = 'S' and fact_fecha >= :fecini and fact_fecha <= :fecfin
    into :id, :prefac, :numero, :fecha, :vend, :NIT, :PREF, :punto
    do
    begin
    select caja_id from punto_venta where ptvt_id = :punto into :caja;
    execute procedure saldo_doc_cartera(31, :id, cast('now' as date), 0) returning_values (:monto);
    if (monto <> 0) then
        begin
        idr = gen_id(id_recicaja, 1);
        insert into recibos_caja (reca_id, caja_id, tido_cod, pref_pre, reca_numero, reca_fecha, reca_conc, reca_monto,
            reca_rtftemonto, reca_rtivamonto, reca_rticamonto, reca_dtof, reca_obs, terc_nit, reca_nomterc, reca_anulado,
            reca_transmit, cobr_cod, numok)
            values (:idr, :caja, 61, :pref, :numero, :fecha, 'CANCELA FACTURA CONTADO No. ' || :prefac || :numero,  :MONTO,
            0, 0, 0, 0, NULL, :NIT, 'VENTAS CONTADO', 'N', 'N', :vend, 'N');
        insert into recibos_caja_detalle (reca_id, rcde_item, rcde_tipodoc, rcde_iddoc, rcde_prefijo, rcde_numero, rcde_abono,
            rcde_rtfte, rcde_rtiva, rcde_rtica, rcde_dtof, rcde_anulado, rcde_transmit, rcde_comip, rcde_sucursal)
            values (:idr, 1, 31, :id, :prefac, :numero, :monto, 0, 0, 0, 0, 'N', 'N', '', '01');
        insert into recibos_caja_pago (reca_id, rcpa_item, fopa_id, rcpa_banco, rcpa_cuenta, rcpa_numero, rcpa_fecha, rcpa_monto,
            rcpa_anulado, rcpa_transmit, rcpa_ivamonto)
            values (:idr, 1, 1, null, null, null, :fecha, :monto, 'N', 'N', 0);
        suspend;
        end
    end
SUSPEND;
 $$IBE$$*/ SUSPEND;
end
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE REP_ANALISIS_CARTERA(
    DESDE VARCHAR(20),
    HASTA VARCHAR(20),
    GRPINI VARCHAR(5),
    GRPFIN VARCHAR(5),
    FECHA DATE,
    DETALLE CHAR(1),
    ORDEN CHAR(1),
    AGRUPA CHAR(1),
    DIASR INTEGER,
    SUBEMPRESA INTEGER,
    GRUPCART INTEGER,
    EXTENDIDA CHAR(1),
    MONEDA INTEGER)
RETURNS (
    NIT VARCHAR(20),
    NOMBRE VARCHAR(60),
    TELEFONO VARCHAR(40),
    CIUDAD VARCHAR(40),
    CONTACTO VARCHAR(60),
    EMAIL VARCHAR(100),
    FAX VARCHAR(25),
    CEL VARCHAR(25),
    CODCLI VARCHAR(20),
    CODZONA VARCHAR(2),
    NOMZONA VARCHAR(60),
    CODCOBR INTEGER,
    NOMCOBR VARCHAR(60),
    DV CHAR(1),
    CODCIUD CHAR(5),
    NOMCIUD VARCHAR(60),
    SUCURSAL VARCHAR(10),
    NOMSUC VARCHAR(60),
    TIPO INTEGER,
    ID INTEGER,
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(6),
    DIAS INTEGER,
    SALDO NUMERIC(18,2),
    CORRIENTE NUMERIC(18,2),
    CERO NUMERIC(18,2),
    TREINTA NUMERIC(18,2),
    SESENTA NUMERIC(18,2),
    NOVENTA NUMERIC(18,2),
    CIENTOCHENTA NUMERIC(18,2),
    DOSSETENTA NUMERIC(18,2),
    TRESSESENTA NUMERIC(18,2),
    PROVISIONAL NUMERIC(18,2),
    TIPONOM VARCHAR(8),
    FECDOC DATE,
    VENCE DATE,
    CUPO NUMERIC(18,2),
    DISPONIBLE NUMERIC(18,2),
    OBS BLOB SUB_TYPE 0 SEGMENT SIZE 80,
    GRUPCOD INTEGER,
    DIA_CAR INTEGER,
    GRUPNOM VARCHAR(30))
AS
DECLARE VARIABLE NITINI VARCHAR(20);
DECLARE VARIABLE NITFIN VARCHAR(20);
DECLARE VARIABLE NOMINI VARCHAR(20);
DECLARE VARIABLE NOMFIN VARCHAR(20);
DECLARE VARIABLE RTFTE NUMERIC(18,2);
DECLARE VARIABLE RTIVA NUMERIC(18,2);
DECLARE VARIABLE RTICA NUMERIC(18,2);
DECLARE VARIABLE VENCIMIENTO VARCHAR(12);
DECLARE VARIABLE OK CHAR(1);
declare variable AUTORET VARCHAR(10);
declare variable FAUTORET DATE;
declare variable INCLANTI CHAR(2);
declare variable descnt_prov char(2);
declare variable MAXDIAS INTEGER;
DECLARE VARIABLE TRM NUMERIC(18,2);
BEGIN /*$$IBE$$ 
if (ORDEN = 'C') then
    BEGIN
    NITINI = DESDE;
    NITFIN = HASTA;
    NOMINI = '';
    NOMFIN = 'zz';
    END
ELSE
    BEGIN
    NOMINI = DESDE;
    NOMFIN = HASTA;
    NITINI = '';
    NITFIN = 'zz';
    END
 $$IBE$$*/ /* Ubique el NIT */ /*$$IBE$$ 
EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'FECHA AUTORETENEDOR NO DESCONTAR RETENCIONES DEL SALDO PERO SI CONTABILIZARLAS') returning_values (AUTORET);
if (AUTORET <> '') then
    FAUTORET = CAST(AUTORET AS DATE);
else
    FAUTORET = '9999/12/31';
EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'ANALISIS DE CARTERA CON FECHA FACTURA O VENCIMIENTO') returning_values (VENCIMIENTO);
EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'INCLUIR ANTICIPOS DE CLIENTES EN REPORTES Y CONSULTAS DE CARTERA') returning_values (INCLANTI);
EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'DESCONTAR RECIBOS PROVISIONALES EN INFORMES DE CARTERA') RETURNING_VALUES (:descnt_prov);

FOR select T.TERC_NIT, TERC_NOM, TERC_DV, CLSU_TEL, CLSU_CIUDAD, S.COBR_COD, S.ZONA_COD, T.CIUD_COD, CLIE_CUPO, CLIE_DIAS, CLCU_COD, CLSU_NOMBRE, t.terc_obs, C.GRCA_COD, TERC_CONTACTO, TERC_EMAIL, TERC_FAX, TERC_CEL, CLIE_COD
    from terceros T, CLIENTES C, CLIENTE_SUCURSALES S
    where C.TERC_NIT = T.TERC_NIT AND TERC_CLIE = 'S' AND S.TERC_NIT = C.TERC_NIT and T.TERC_NIT >= :NITINI AND T.TERC_NIT <= :NITFIN AND
        T.TERC_NOM >= :NOMINI AND T.TERC_NOM <= :NOMFIN AND ((:GRUPCART = 0) or (C.GRCA_COD = :GRUPCART))
    INTO :NIT, :NOMBRE, :DV, :TELEFONO, :CIUDAD, :CODCOBR, :CODZONA, :CODCIUD, :CUPO, :DIA_CAR,  :SUCURSAL, :NOMSUC, :obs, :GRUPCOD, :CONTACTO, :EMAIL, :FAX, :CEL, :CODCLI
    DO  
    BEGIN
    SELECT COBR_NOM FROM COBRADORES CB WHERE COBR_COD = :CODCOBR INTO :NOMCOBR;
    SELECT ZONA_NOM FROM ZONAS Z WHERE ZONA_COD = :CODZONA INTO :NOMZONA;
    SELECT CIUD_NOM FROM CIUDADES WHERE CIUD_COD = :CODCIUD INTO :NOMCIUD;
    SELECT GRCA_NOMBRE FROM GRUPO_CARTERA WHERE GRCA_COD = :GRUPCOD INTO :GRUPNOM;
    provisional = 0;
    MAXDIAS = 0;
    OK = 'N';
    if (AGRUPA = 'Z') then
        BEGIN
        if (GRPINI = '') then
            BEGIN
            if ((CODZONA IS NULL) or (CODZONA >= :GRPINI AND CODZONA <= :GRPFIN)) then
                OK = 'S';
            END
        ELSE
            if (CODZONA >= :GRPINI AND CODZONA <= :GRPFIN) then
                OK = 'S';
        END
    if (AGRUPA = 'I') then
        BEGIN
        if (GRPINI = '') then
            BEGIN
            if ((CODCIUD IS NULL) or (CODCIUD >= :GRPINI AND CODCIUD <= :GRPFIN)) then
                OK = 'S';
            END
        ELSE
            if (CODCIUD >= :GRPINI AND CODCIUD <= :GRPFIN) then
                OK = 'S';
        END
    if (AGRUPA = 'N') then
        OK = 'S';
    if (OK = 'S') then
        BEGIN
        DISPONIBLE = CUPO;
        CORRIENTE = 0;
        CERO = 0;
        TREINTA = 0;
        SESENTA = 0;
        NOVENTA = 0;
        CIENTOCHENTA = 0;
        DOSSETENTA = 0;
        TRESSESENTA = 0;
         $$IBE$$*/ /* BUSQUE EN SALDOS_DOC_CARTERA LOS QUE TENGAN SALDO > 0 */ /*$$IBE$$ 
        FOR SELECT MVCL_TIPOREF, MVCL_IDREF, MVCL_PREFREF, MVCL_NUMREF, MVCL_FECHA, MVCL_VENCE
            FROM MOVIMIENTO_CLIENTES
            WHERE TERC_NIT = :NIT AND MVCL_SUCURSAL = :SUCURSAL AND MVCL_FECHA <= :FECHA
                AND MVCL_ABONO = 'N' AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA)) AND
                ((:MONEDA = 0) or (MVCL_TRM <> 1))
            INTO :TIPO, :ID, :PREFIJO, :NUMERO, :FECDOC, :VENCE
            DO
            BEGIN
            if ((inclanti = 'SI') or (TIPO <> 45)) then
                BEGIN
                EXECUTE PROCEDURE saldo_doc_cartera(TIPO, ID, FECHA, MONEDA) returning_values (SALDO);
                if (SALDO <> 0) then
                    BEGIN
                    DISPONIBLE = DISPONIBLE - SALDO;
                    SELECT TIDO_NOMCORTO FROM TIPO_DOCUMENTO WHERE TIDO_COD = :TIPO INTO :TIPONOM;

                    if (MONEDA = 0) then
                        SELECT SUM(SDCA_RTFTE - SDCA_ABRTFTE), SUM(SDCA_RTIVA - SDCA_ABRTIVA), SUM(SDCA_RTICA - SDCA_ABRTICA)
                            FROM SALDOS_DOC_CARTERA WHERE SDCA_TIPOREF = :TIPO AND SDCA_IDREF = :ID
                            INTO :RTFTE, :RTIVA, :RTICA;
                    ELSE
                        SELECT SUM((SDCA_RTFTE - SDCA_ABRTFTE)/SDCA_TRM), SUM((SDCA_RTIVA - SDCA_ABRTIVA)/SDCA_TRM), SUM((SDCA_RTICA - SDCA_ABRTICA)/SDCA_TRM)
                            FROM SALDOS_DOC_CARTERA WHERE SDCA_TIPOREF = :TIPO AND SDCA_IDREF = :ID
                            INTO :RTFTE, :RTIVA, :RTICA;
                    if (RTFTE IS NULL) then
                        RTFTE = 0;
                    if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) THEN
                        BEGIN
                        if (RTFTE > 0) then
                            RTFTE = 0;
                        END
                    ELSE
                        BEGIN
                        if (RTFTE < 0) then
                            RTFTE = 0;
                        END
                    if (FAUTORET <= FECDOC) then
                        RTFTE = 0;
                    if (RTIVA IS NULL) then
                        RTIVA = 0;
                    if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) THEN
                        BEGIN
                        if (RTIVA > 0) then
                            RTIVA = 0;
                        END
                    ELSE
                        BEGIN
                        if (RTIVA < 0) then
                            RTIVA = 0;
                        END
                    if (RTICA IS NULL) then
                        RTICA = 0;
                    if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) THEN
                        BEGIN
                        if (RTICA > 0) then
                            RTICA = 0;
                        END
                    ELSE
                        BEGIN
                        if (RTICA < 0) then
                            RTICA = 0;
                        END
                     $$IBE$$*/ /* AHORA CLASIFIQUE LOS DIAS */ /*$$IBE$$ 
                    if (VENCIMIENTO = 'FECHA') then
                        DIAS = FECHA - FECDOC;
                    ELSE
                        DIAS = FECHA - VENCE;
                    if (MAXDIAS < DIAS) then
                        MAXDIAS = DIAS;
                    if (DETALLE = 'S') then
                        BEGIN
                        CORRIENTE = 0;
                        CERO = 0;
                        TREINTA = 0;
                        SESENTA = 0;
                        NOVENTA = 0;
                        CIENTOCHENTA = 0;
                        DOSSETENTA = 0;
                        tressesenta = 0;
                        END
                    if (DIAS < 0) then
                        CORRIENTE = CORRIENTE + SALDO;
                    ELSE
                        if (DIAS < DIASR) then
                            CERO = CERO + SALDO;
                        ELSE
                            if (DIAS < (DIASR * 2)) then
                                TREINTA = TREINTA + SALDO;
                            ELSE
                                if (DIAS < (DIASR * 3)) then
                                    SESENTA = SESENTA + SALDO;
                                ELSE
                                    BEGIN
                                    if (EXTENDIDA = 'N') then
                                        NOVENTA = NOVENTA + SALDO;
                                    else    
                                        BEGIN
                                        if (DIAS < (DIASR * 3) * 2) then
                                            NOVENTA = NOVENTA + SALDO;
                                        ELSE
                                            if (DIAS < (DIASR * 3) * 3) then
                                                CIENTOCHENTA = CIENTOCHENTA + SALDO;
                                            ELSE
                                                if (DIAS < (DIASR * 3) * 4) then
                                                    dossetenta = dossetenta + SALDO;
                                            ELSE
                                                tressesenta = tressesenta + SALDO;
                                        END
                                    END
                    if (DETALLE = 'S') then
                        SUSPEND;
                    END   $$IBE$$*/ /* SALDO */ /*$$IBE$$ 
                END   $$IBE$$*/ /* NO ANTICIPO */ /*$$IBE$$ 
            END   $$IBE$$*/ /* FOR MOV_CLI */
        /* AGREGUE LOS RECIBOS PROVISIONALES CON SIGNO NEGATIVO */ /*$$IBE$$ 
        FOR SELECT 65, MAX(P.RCPR_ID), MAX(PREF_PRE), MAX(RCPR_NUMERO), MAX(RCPR_FECHA), SUM(RPDE_ABONO* -1), SUM(RPDE_RTFTE*-1), SUM(RPDE_RTIVA*-1), SUM(RPDE_RTICA*-1), MAX(RCPR_TRM)
            FROM RECIBO_PROVISIONAL P, recibo_provisional_detalle D
            WHERE P.rcpr_id = D.rcpr_id AND P.TERC_NIT = :NIT AND D.RPDE_SUCURSAL = :SUCURSAL AND P.RCPR_FECHA <= :FECHA AND P.RCPR_ANULADO = 'N' AND
            ((RCPR_FECCRUCE IS NULL) or (RCPR_FECCRUCE > :FECHA)) AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA)) AND ((:MONEDA = 0) or (RCPR_TRM <> 1))
            GROUP BY P.rcpr_id
            INTO :TIPO, :ID, :PREFIJO, :NUMERO, :FECDOC, :PROVISIONAL, :rtfte,  :RTIVA, :RTICA, :TRM
            DO
            BEGIN
            if ((MONEDA <> 0) AND (TRM <> 0)) then
                BEGIN
                PROVISIONAL = PROVISIONAL / TRM;
                RTFTE = RTFTE / TRM;
                RTIVA = RTIVA / TRM;
                RTICA = RTICA / TRM;
                END
            if (:descnt_prov = 'NO') then
              SALDO = 0;
            else
              SALDO = :PROVISIONAL;
            SELECT TIDO_NOMCORTO FROM TIPO_DOCUMENTO WHERE TIDO_COD = :TIPO INTO :TIPONOM;
             $$IBE$$*/ /* CALCULE EL VENCIMIENTO DEL ULTIMO DOCUMENTO POSFECHADO */ /*$$IBE$$ 
            SELECT MAX(RPPA_FECHA) FROM recibo_provisional_pago WHERE RCPR_ID = :ID INTO :VENCE;
            DIAS = VENCE - FECHA;
            if (DETALLE = 'S') then
                BEGIN
                CORRIENTE = 0;
                CERO = 0;
                TREINTA = 0;
                SESENTA = 0;
                NOVENTA = 0;
                CIENTOCHENTA = 0;
                DOSSETENTA = 0;
                tressesenta = 0;
                END
            if (DIAS < 0) then
                CORRIENTE = CORRIENTE + SALDO;
            ELSE
                if (DIAS < DIASR) then
                    CERO = CERO + SALDO;
                ELSE
                    if (DIAS < (DIASR * 2)) then
                        TREINTA = TREINTA + SALDO;
                    ELSE
                        if (DIAS < (DIASR * 3)) then
                            SESENTA = SESENTA + SALDO;
                        ELSE
                            BEGIN
                            if (EXTENDIDA = 'N') then
                                NOVENTA = NOVENTA + SALDO;
                            else
                                BEGIN
                                if (DIAS < (DIASR * 3) * 2) then
                                    CIENTOCHENTA = CIENTOCHENTA + SALDO;
                                ELSE
                                    if (DIAS < (DIASR * 3) * 3) then
                                        DOSSETENTA = DOSSETENTA + SALDO;
                                    ELSE
                                        TRESSESENTA = TRESSESENTA + SALDO;
                                END
                            END
            if (DETALLE = 'S') then
                SUSPEND;
            END
        if (DETALLE = 'N') then
            begin
            SALDO = CORRIENTE + CERO + TREINTA + SESENTA + NOVENTA;
            DIAS = MAXDIAS;
            SUSPEND;
            end
        END
    if (AGRUPA = 'C') then
        BEGIN
        FOR SELECT DISTINCT COBR_COD FROM MOVIMIENTO_CLIENTES
            WHERE TERC_NIT = :NIT AND MVCL_SUCURSAL = :SUCURSAL AND MVCL_FECHA <= :FECHA
                AND MVCL_ABONO = 'N' AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA)) AND
                ((:MONEDA = 0) or (MVCL_TRM <> 1))
            INTO :codcobr
            DO
            BEGIN
            OK = 'N';
            if (GRPINI = '') then
                BEGIN
                if ((CODCOBR IS NULL) or (CODCOBR >= :GRPINI AND CODCOBR <= :GRPFIN)) then
                    OK = 'S';
                END
            ELSE
                if (CODCOBR >= :GRPINI AND CODCOBR <= :GRPFIN) then
                    OK = 'S';
            if (OK = 'S') then
                BEGIN
                DISPONIBLE = CUPO;
                CORRIENTE = 0;
                CERO = 0;
                TREINTA = 0;
                SESENTA = 0;
                NOVENTA = 0;
                CIENTOCHENTA = 0;
                DOSSETENTA = 0;
                tressesenta = 0;
                SELECT COBR_NOM FROM COBRADORES WHERE COBR_COD = :codcobr INTO :nomcobr;
                 $$IBE$$*/ /* BUSQUE EN SALDOS_DOC_CARTERA LOS QUE TENGAN SALDO > 0 */ /*$$IBE$$ 
                FOR SELECT MVCL_TIPOREF, MVCL_IDREF, MVCL_PREFREF, MVCL_NUMREF, MVCL_FECHA, MVCL_VENCE
                    FROM MOVIMIENTO_CLIENTES
                    WHERE TERC_NIT = :NIT AND COBR_COD = :CODCOBR AND MVCL_SUCURSAL = :SUCURSAL AND MVCL_FECHA <= :FECHA
                        AND MVCL_ABONO = 'N' AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA))
                    INTO :TIPO, :ID, :PREFIJO, :NUMERO, :FECDOC, :VENCE
                    DO
                    BEGIN
                    if ((inclanti = 'SI') or (TIPO <> 45)) then
                        BEGIN
                        EXECUTE PROCEDURE saldo_doc_cartera(TIPO, ID, FECHA, MONEDA) returning_values (SALDO);
                        if (SALDO <> 0) then
                            BEGIN
                            DISPONIBLE = DISPONIBLE - SALDO;
                            SELECT TIDO_NOMCORTO FROM TIPO_DOCUMENTO WHERE TIDO_COD = :TIPO INTO :TIPONOM;
                            if (MONEDA = 0) then
                                SELECT SUM(SDCA_RTFTE - SDCA_ABRTFTE), SUM(SDCA_RTIVA - SDCA_ABRTIVA), SUM(SDCA_RTICA - SDCA_ABRTICA)
                                    FROM SALDOS_DOC_CARTERA WHERE SDCA_TIPOREF = :TIPO AND SDCA_IDREF = :ID
                                    INTO :RTFTE, :RTIVA, :RTICA;
                            ELSE
                                SELECT SUM((SDCA_RTFTE - SDCA_ABRTFTE)/SDCA_TRM), SUM((SDCA_RTIVA - SDCA_ABRTIVA)/SDCA_TRM), SUM((SDCA_RTICA - SDCA_ABRTICA)/SDCA_TRM)
                                    FROM SALDOS_DOC_CARTERA WHERE SDCA_TIPOREF = :TIPO AND SDCA_IDREF = :ID
                                    INTO :RTFTE, :RTIVA, :RTICA;
                            if (RTFTE IS NULL) then
                                RTFTE = 0;
                            if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) THEN
                                BEGIN
                                if (RTFTE > 0) then
                                    RTFTE = 0;
                                END
                            ELSE
                                BEGIN
                                if (RTFTE < 0) then
                                    RTFTE = 0;
                                END
                            if (FAUTORET <= FECDOC) then
                                RTFTE = 0;
                            if (RTIVA IS NULL) then
                                RTIVA = 0;
                            if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) THEN
                                BEGIN
                                if (RTIVA > 0) then
                                    RTIVA = 0;
                                END
                            ELSE
                                BEGIN
                                if (RTIVA < 0) then
                                    RTIVA = 0;
                                END
                            if (RTICA IS NULL) then
                                RTICA = 0;
                            if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) THEN
                                BEGIN
                                if (RTICA > 0) then
                                    RTICA = 0;
                                END
                            ELSE
                                BEGIN
                                if (RTICA < 0) then
                                    RTICA = 0;
                                END
                             $$IBE$$*/ /* AHORA CLASIFIQUE LOS DIAS */ /*$$IBE$$ 
                            if (VENCIMIENTO = 'FECHA') then
                                DIAS = FECHA - FECDOC;
                            ELSE
                                DIAS = FECHA - VENCE;
                            if (MAXDIAS < DIAS) then
                                MAXDIAS = DIAS;
                            if (DETALLE = 'S') then
                                BEGIN
                                CORRIENTE = 0;
                                CERO = 0;
                                TREINTA = 0;
                                SESENTA = 0;
                                NOVENTA = 0;
                                CIENTOCHENTA = 0;
                                DOSSETENTA = 0;
                                tressesenta = 0;
                                END
                            if (DIAS < 0) then
                                CORRIENTE = CORRIENTE + SALDO;
                            ELSE
                                if (DIAS < DIASR) then
                                    CERO = CERO + SALDO;
                                ELSE
                                    if (DIAS < (DIASR * 2)) then
                                        TREINTA = TREINTA + SALDO;
                                    ELSE
                                        if (DIAS < (DIASR * 3)) then
                                            SESENTA = SESENTA + SALDO;
                                        ELSE
                                            BEGIN
                                            if (EXTENDIDA = 'N') then
                                                NOVENTA = NOVENTA + SALDO;
                                            else    
                                                BEGIN
                                                if (DIAS < (DIASR * 3) * 2) then
                                                    CIENTOCHENTA = CIENTOCHENTA + SALDO;
                                                ELSE
                                                    if (DIAS < (DIASR * 3) * 3) then
                                                        DOSSETENTA = DOSSETENTA + SALDO;
                                                    ELSE
                                                        TRESSESENTA = TRESSESENTA + SALDO;
                                                END
                                            END
                            if (DETALLE = 'S') then
                                SUSPEND;
                            END   $$IBE$$*/ /* SALDO <>  0 */ /*$$IBE$$ 
                        END   $$IBE$$*/ /* NO ANTICIPO */ /*$$IBE$$ 
                    END   $$IBE$$*/ /* FOR MOV_CLI */
                /* AGREGUE LOS RECIBOS PROVISIONALES CON SIGNO NEGATIVO */ /*$$IBE$$ 
                FOR SELECT 65, MAX(P.RCPR_ID), MAX(PREF_PRE), MAX(RCPR_NUMERO), MAX(RCPR_FECHA), SUM(RPDE_ABONO * -1), SUM(RPDE_RTFTE*-1), SUM(RPDE_RTIVA*-1), SUM(RPDE_RTICA*-1), MAX(RCPR_TRM)
                    FROM RECIBO_PROVISIONAL P, recibo_provisional_detalle D
                    WHERE P.rcpr_id = D.rcpr_id AND P.TERC_NIT = :NIT AND RPDE_SUCURSAL = :SUCURSAL AND P.VEND_COD = :CODCOBR AND P.RCPR_FECHA <= :FECHA AND P.RCPR_ANULADO = 'N' AND
                    ((RCPR_FECCRUCE IS NULL) or (RCPR_FECCRUCE > :FECHA)) AND ((SUCU_ID = :SUBEMPRESA) OR (:SUBEMPRESA = 0)) AND ((:MONEDA = 0) or (RCPR_TRM <> 1))
                    GROUP BY P.rcpr_id
                    INTO :TIPO, :ID, :PREFIJO, :NUMERO, :FECDOC, :PROVISIONAL, :rtfte,  :RTIVA, :RTICA, :TRM
                    DO
                    BEGIN
                    if ((MONEDA <> 0) AND (TRM <> 0)) then
                        BEGIN
                        PROVISIONAL = PROVISIONAL / TRM;
                        RTFTE = RTFTE / TRM;
                        RTIVA = RTIVA / TRM;
                        RTICA = RTICA / TRM;
                        END
                    if (:descnt_prov = 'NO') then
                      SALDO = 0;
                    else
                      SALDO = :PROVISIONAL;
                    SELECT TIDO_NOMCORTO FROM TIPO_DOCUMENTO WHERE TIDO_COD = :TIPO INTO :TIPONOM;
                     $$IBE$$*/ /* CALCULE EL VENCIMIENTO DEL ULTIMO DOCUMENTO POSFECHADO */ /*$$IBE$$ 
                    SELECT MAX(RPPA_FECHA) FROM recibo_provisional_pago WHERE RCPR_ID = :ID INTO :VENCE;
                    DIAS = VENCE - FECHA;
                    if (DETALLE = 'S') then
                        BEGIN
                        CORRIENTE = 0;
                        CERO = 0;
                        TREINTA = 0;
                        SESENTA = 0;
                        NOVENTA = 0;
                        CIENTOCHENTA = 0;
                        DOSSETENTA = 0;
                        tressesenta = 0;
                        END
                    if (DIAS < 0) then
                        CORRIENTE = CORRIENTE + SALDO;
                    ELSE
                        if (DIAS < DIASR) then
                            CERO = CERO + SALDO;
                        ELSE
                            if (DIAS < (DIASR * 2)) then
                                TREINTA = TREINTA + SALDO;
                            ELSE
                                if (DIAS < (DIASR * 3)) then
                                    SESENTA = SESENTA + SALDO;
                                ELSE
                                    BEGIN
                                    if (EXTENDIDA = 'N') then
                                        NOVENTA = NOVENTA + SALDO;
                                    else    
                                        BEGIN
                                        if (DIAS < (DIASR * 3) * 2) then
                                            CIENTOCHENTA = CIENTOCHENTA + SALDO;
                                        ELSE
                                            if (DIAS < (DIASR * 3) * 3) then
                                                DOSSETENTA = DOSSETENTA + SALDO;
                                            ELSE
                                                TRESSESENTA = TRESSESENTA + SALDO;
                                        END
                                    END
                    if (DETALLE = 'S') then
                        SUSPEND;
                    END
                if (DETALLE = 'N') then
                    begin
                    SALDO = CORRIENTE + CERO + TREINTA + SESENTA + NOVENTA;
                    DIAS = MAXDIAS;
                    SUSPEND;
                    end
                END
            END   $$IBE$$*/ /* FOR COBRADOR */ /*$$IBE$$ 
        END
    END   $$IBE$$*/ /* FOR NIT */ /*$$IBE$$ 
SUSPEND;
 $$IBE$$*/ SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE REP_CARTERA_CLIENTES(
    DESDE VARCHAR(20),
    HASTA VARCHAR(20),
    GRPINI VARCHAR(5),
    GRPFIN VARCHAR(5),
    FECHA DATE,
    ORDEN CHAR(1),
    AGRUPA CHAR(1),
    SUBEMPRESA INTEGER,
    GRUPCART INTEGER,
    MONEDA INTEGER)
RETURNS (
    NIT VARCHAR(20),
    NOMBRE VARCHAR(60),
    DIR VARCHAR(60),
    TELEFONO VARCHAR(40),
    CIUDAD VARCHAR(40),
    CONTACTO VARCHAR(60),
    EMAIL VARCHAR(100),
    FAX VARCHAR(25),
    CEL VARCHAR(25),
    CODCLI VARCHAR(20),
    CODZONA VARCHAR(2),
    NOMZONA VARCHAR(60),
    CODCOBR INTEGER,
    NOMCOBR VARCHAR(60),
    SUCURSAL VARCHAR(10),
    NOMSUC VARCHAR(60),
    DV CHAR(1),
    CODCIUD CHAR(5),
    NOMCIUD VARCHAR(60),
    TIPO INTEGER,
    ID INTEGER,
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(6),
    CONCEPTO VARCHAR(60),
    SALDO NUMERIC(18,2),
    PROVISIONAL NUMERIC(18,2),
    RTFTE NUMERIC(18,2),
    RTIVA NUMERIC(18,2),
    RTICA NUMERIC(18,2),
    DTOF NUMERIC(18,2),
    TIPONOM VARCHAR(8),
    FECDOC DATE,
    VENCE DATE,
    DIAS INTEGER,
    CUPO NUMERIC(18,2),
    DISPONIBLE NUMERIC(18,2),
    NOTA VARCHAR(256),
    OBS BLOB SUB_TYPE 0 SEGMENT SIZE 80,
    GRUPCOD INTEGER,
    GRUPNOM VARCHAR(30))
AS
DECLARE VARIABLE NITINI VARCHAR(20);
DECLARE VARIABLE NITFIN VARCHAR(20);
DECLARE VARIABLE NOMINI VARCHAR(20);
DECLARE VARIABLE NOMFIN VARCHAR(20);
DECLARE VARIABLE OK CHAR(1);
DECLARE VARIABLE FOV CHAR(11);
DECLARE VARIABLE DTOAPL NUMERIC(18,2);
DECLARE VARIABLE FECDTO DATE;
DECLARE VARIABLE FECNOTA VARCHAR(10);
DECLARE VARIABLE AUXNOTA VARCHAR(256);
DECLARE VARIABLE IDNOTA INTEGER;
declare variable descnt_prov char(2);
declare variable AUTORET VARCHAR(10);
declare variable FAUTORET DATE;
declare variable INCLANTI CHAR(2);
DECLARE VARIABLE TRM NUMERIC(18,2);
BEGIN /*$$IBE$$ 
if (ORDEN = 'C') then
    BEGIN
    NITINI = DESDE;
    NITFIN = HASTA;
    NOMINI = '';
    NOMFIN = 'zz';
    END
ELSE
    BEGIN
    NOMINI = DESDE;
    NOMFIN = HASTA;
    NITINI = '';
    NITFIN = 'zz';
    END
  EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'DESCONTAR RECIBOS PROVISIONALES EN INFORMES DE CARTERA') RETURNING_VALUES (:descnt_prov);
  EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'INCLUIR ANTICIPOS DE CLIENTES EN REPORTES Y CONSULTAS DE CARTERA') returning_values (INCLANTI);
  EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'FECHA AUTORETENEDOR NO DESCONTAR RETENCIONES DEL SALDO PERO SI CONTABILIZARLAS') returning_values (AUTORET);
  if (AUTORET <> '') then
    FAUTORET = CAST(AUTORET AS DATE);
  else
    FAUTORET = '9999/12/31';
   $$IBE$$*/ /* Ubique el NIT */ /*$$IBE$$ 
  FOR select C.TERC_NIT, TERC_NOM, TERC_DV, CLSU_DIR, CLSU_TEL, CLSU_CIUDAD, S.COBR_COD, S.ZONA_COD, T.CIUD_COD, CLIE_CUPO, CLCU_COD, CLSU_NOMBRE, t.terc_obs, C.GRCA_COD, TERC_CONTACTO, TERC_EMAIL, TERC_FAX, TERC_CEL, CLIE_COD
    from terceros T, CLIENTES C, CLIENTE_SUCURSALES S
    where C.TERC_NIT = T.TERC_NIT AND TERC_CLIE = 'S' AND S.TERC_NIT = C.TERC_NIT AND C.TERC_NIT >= :NITINI AND C.TERC_NIT <= :NITFIN AND
        TERC_NOM >= :NOMINI AND TERC_NOM <= :NOMFIN AND ((:GRUPCART = 0) or (C.GRCA_COD = :GRUPCART))
    INTO :NIT, :NOMBRE, :DV, :DIR, :TELEFONO, :CIUDAD, :CODCOBR, :CODZONA, :CODCIUD, :CUPO, :SUCURSAL, :NOMSUC, :obs, :GRUPCOD, :CONTACTO, :EMAIL, :FAX, :CEL, :CODCLI
    DO  
    BEGIN
    if (CODCOBR IS NOT NULL) then
        SELECT COBR_NOM FROM COBRADORES  WHERE COBR_COD = :CODCOBR INTO :NOMCOBR;
    if (CODZONA IS NOT NULL) then
        SELECT ZONA_NOM FROM ZONAS WHERE ZONA_COD = :CODZONA INTO :NOMZONA;
    if (CODCIUD IS NOT NULL) then
        SELECT CIUD_NOM FROM CIUDADES  WHERE CIUD_COD = :CODCIUD INTO :NOMCIUD;
    SELECT GRCA_NOMBRE FROM GRUPO_CARTERA WHERE GRCA_COD = :GRUPCOD INTO :GRUPNOM;
    DISPONIBLE = CUPO;
    OK = 'N';
    if (AGRUPA = 'Z') then
        BEGIN
        if (GRPINI = '') then
            BEGIN
            if ((CODZONA IS NULL) or (CODZONA >= :GRPINI AND CODZONA <= :GRPFIN)) then
                OK = 'S';
            END
        ELSE
            if (CODZONA >= :GRPINI AND CODZONA <= :GRPFIN) then
                OK = 'S';
        END
    if (AGRUPA = 'I') then
        BEGIN
        if (GRPINI = '') then
            BEGIN
            if ((CODCIUD IS NULL) or (CODCIUD >= :GRPINI AND CODCIUD <= :GRPFIN)) then
                OK = 'S';
            END
        ELSE
            if (CODCIUD >= :GRPINI AND CODCIUD <= :GRPFIN) then
                OK = 'S';
        END
    if (AGRUPA = 'N') then
        OK = 'S';
        
    if (OK = 'S') then
        BEGIN
         $$IBE$$*/ /* BUSQUE EN SALDOS_DOC_CARTERA LOS QUE TENGAN SALDO > 0 */ /*$$IBE$$ 
        FOR SELECT MVCL_TIPOREF, MVCL_IDREF, MVCL_PREFREF, MVCL_NUMREF, MVCL_FECHA, MVCL_VENCE, MVCL_CONC
            FROM MOVIMIENTO_CLIENTES WHERE TERC_NIT = :NIT AND MVCL_SUCURSAL = :SUCURSAL AND MVCL_FECHA <= :FECHA AND
            MVCL_ABONO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) AND ((:MONEDA = 0) or (MVCL_TRM <> 1))
            INTO :TIPO, :ID, :PREFIJO, :NUMERO, :FECDOC, :VENCE, :CONCEPTO
            DO
            BEGIN
            if ((inclanti = 'SI') or (TIPO <> 45)) then
                BEGIN
                EXECUTE PROCEDURE saldo_doc_cartera(TIPO, ID, FECHA, MONEDA) returning_values (SALDO);
                if (SALDO <> 0) then
                    BEGIN
                    PROVISIONAL = 0;
                    EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'ANALISIS DE CARTERA CON FECHA FACTURA O VENCIMIENTO') RETURNING_VALUES (FOV);
                    if (FOV = 'FECHA') then
                       DIAS = FECHA - FECDOC;
                    ELSE
                      DIAS = FECHA - VENCE;
                    DISPONIBLE = DISPONIBLE - SALDO;
                    SELECT TIDO_NOMCORTO FROM TIPO_DOCUMENTO WHERE TIDO_COD = :TIPO INTO :TIPONOM;
                    if (TIPO = 41) then
                        SELECT NDCL_DTOFMONTO, NDCL_FECHADTO, NDCL_TRM FROM NOTAS_DEBITO_CLIENTES
                            WHERE NDCL_ID = :ID INTO :DTOF, :FECDTO, :TRM;
                    if (TIPO = 42) then
                        SELECT 0, :FECDOC, 1 FROM NOTAS_CREDITO_CLIENTES
                            WHERE NCCL_ID = :ID INTO :DTOF, :FECDTO, :TRM;
                    if (TIPO = 45) then
                        SELECT ANCL_DTOFMONTO, ANCL_DTOFECHA, ANCL_TRM FROM ANTICIPOS_CLIENTE
                            WHERE ANCL_ID = :ID INTO :DTOF, :FECDTO, :TRM;
                    if (TIPO = 31) then
                        SELECT FACT_DTOFMONTO, FACT_DTOFFECHA, FACT_TRM FROM FACTURAS
                            WHERE FACT_ID = :ID INTO :DTOF, :FECDTO, :TRM;
                    if (TIPO = 33) then
                        SELECT 0, :FECDOC, 1 FROM devoluciones_ventas
                            WHERE DEVT_ID = :ID INTO :DTOF, :FECDTO, :TRM;
                    if ((MONEDA <> 0) AND (TRM <> 0)) then
                        DTOF = DTOF / TRM;
                    if (DTOF IS NULL) then
                        DTOF = 0;
                    if (DTOF <> 0) then
                        BEGIN
                        SELECT SUM(RCDE_DTOF), MAX(RECA_TRM) FROM RECIBOS_CAJA_DETALLE D, RECIBOS_CAJA R
                            WHERE R.reca_id = D.reca_id AND RCDE_IDDOC = :ID AND RCDE_TIPODOC = :TIPO
                            INTO :DTOAPL, :TRM;
                        if (DTOAPL IS NULL) then
                            DTOAPL = 0;
                        if ((MONEDA <> 0) AND (TRM <> 1)) then
                            DTOAPL = DTOAPL / TRM;
                        DTOF = DTOF - DTOAPL;
                         $$IBE$$*/ /* SI YA SE VENCIO DEJELO EN CERO */ /*$$IBE$$ 
                        if (FECDTO < FECHA) then
                            DTOF = 0;
                        END
                    if (MONEDA = 0) then
                        SELECT SUM(SDCA_RTFTE - SDCA_ABRTFTE), SUM(SDCA_RTIVA - SDCA_ABRTIVA), SUM(SDCA_RTICA - SDCA_ABRTICA)
                            FROM SALDOS_DOC_CARTERA WHERE SDCA_TIPOREF = :TIPO AND SDCA_IDREF = :ID
                            INTO :RTFTE, :RTIVA, :RTICA;
                    ELSE
                        SELECT SUM((SDCA_RTFTE - SDCA_ABRTFTE)/SDCA_TRM), SUM((SDCA_RTIVA - SDCA_ABRTIVA)/SDCA_TRM), SUM((SDCA_RTICA - SDCA_ABRTICA)/SDCA_TRM)
                            FROM SALDOS_DOC_CARTERA WHERE SDCA_TIPOREF = :TIPO AND SDCA_IDREF = :ID
                            INTO :RTFTE, :RTIVA, :RTICA;
                    if (RTFTE IS NULL) then
                        RTFTE = 0;
                    if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) THEN
                        BEGIN
                        if (RTFTE > 0) then
                            RTFTE = 0;
                        END
                    ELSE
                        BEGIN
                        if (RTFTE < 0) then
                            RTFTE = 0;
                        END
                    if (RTIVA IS NULL) then
                        RTIVA = 0;
                    if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) THEN
                        BEGIN
                        if (RTIVA > 0) then
                            RTIVA = 0;
                        END
                    ELSE
                        BEGIN
                        if (RTIVA < 0) then
                            RTIVA = 0;
                        END
                    if (RTICA IS NULL) then
                        RTICA = 0;
                    if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) THEN
                        BEGIN
                        if (RTICA > 0) then
                            RTICA = 0;
                        END
                    ELSE
                        BEGIN
                        if (RTICA < 0) then
                            RTICA = 0;
                        END
                    if (FAUTORET <= FECDOC) then
                        RTFTE = 0;
                     $$IBE$$*/ /* SI TIENE NOTA AGREGUELA */ /*$$IBE$$ 
                    SELECT MAX(NOCL_ID) FROM NOTAS_CLIENTES WHERE TERC_NIT = :NIT AND CLSU_COD = :SUCURSAL AND NOCL_TIPODOC = :TIPO AND NOCL_IDDOC = :ID INTO :IDNOTA;
                    if (IDNOTA IS NOT NULL) then
                        BEGIN
                        SELECT cast(NOCL_FECHA as char(10)), NOCL_TEXTO FROM NOTAS_CLIENTES
                            WHERE NOCL_ID = :IDNOTA INTO :FECNOTA, :AUXNOTA;
                        if (STRLEN(AUXNOTA) < 244) then
                            NOTA = FECNOTA || ':' || AUXNOTA;
                        ELSE
                            NOTA = AUXNOTA;
                        END
                    else
                        NOTA = '';
                    SUSPEND;
                    END   $$IBE$$*/ /* SALDO <> 0 */ /*$$IBE$$ 
                END   $$IBE$$*/ /* NO ANTICIPO */ /*$$IBE$$ 
            END   $$IBE$$*/ /* FOR */
        /* AGREGUE LOS RECIBOS PROVISIONALES CON SIGNO NEGATIVO */ /*$$IBE$$ 
        FOR SELECT 65, MAX(P.RCPR_ID), MAX(PREF_PRE), MAX(RCPR_NUMERO), MAX(RCPR_FECHA), MAX(RCPR_CONC), SUM(RPDE_ABONO * -1), SUM(RPDE_RTFTE*-1), SUM(RPDE_RTIVA*-1), SUM(RPDE_RTICA*-1), MAX(RCPR_TRM)
            FROM RECIBO_PROVISIONAL P, recibo_provisional_detalle D
            WHERE P.rcpr_id = D.rcpr_id AND P.TERC_NIT = :NIT AND RCPR_FECHA <= :FECHA AND RCPR_ANULADO = 'N' AND
            ((RCPR_FECCRUCE IS NULL) or (RCPR_FECCRUCE > :FECHA)) AND RPDE_SUCURSAL = :SUCURSAL AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY P.rcpr_id
            INTO :TIPO, :ID, :PREFIJO, :NUMERO, :FECDOC, :CONCEPTO, :PROVISIONAL, :rtfte,  :RTIVA, :RTICA, :TRM
            DO
            BEGIN
            if ((MONEDA <> 0) AND (TRM <> 0)) then
                PROVISIONAL = PROVISIONAL / TRM;
            if (:descnt_prov = 'NO') then
              SALDO = 0;
            else
              SALDO = :PROVISIONAL;
            SELECT TIDO_NOMCORTO FROM TIPO_DOCUMENTO WHERE TIDO_COD = :TIPO INTO :TIPONOM;
             $$IBE$$*/ /* CALCULE EL VENCIMIENTO DEL ULTIMO DOCUMENTO POSFECHADO */ /*$$IBE$$ 
            SELECT MAX(RPPA_FECHA) FROM recibo_provisional_pago WHERE RCPR_ID = :ID INTO :VENCE;
            DIAS = VENCE - FECHA;
            SUSPEND;
            END
        END
    if (AGRUPA = 'C') then
        BEGIN
        FOR SELECT DISTINCT COBR_COD FROM MOVIMIENTO_CLIENTES
            WHERE TERC_NIT = :NIT AND MVCL_SUCURSAL = :SUCURSAL AND MVCL_FECHA <= :FECHA AND
            MVCL_ABONO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            INTO :codcobr
            DO
            BEGIN
            OK = 'N';
            if (GRPINI = '') then
                BEGIN
                if ((CODCOBR IS NULL) or (CODCOBR >= :GRPINI AND CODCOBR <= :GRPFIN)) then
                    OK = 'S';
                END
            ELSE
                if (CODCOBR >= :GRPINI AND CODCOBR <= :GRPFIN) then
                    OK = 'S';
            if (OK = 'S') then
                BEGIN
                SELECT COBR_NOM FROM COBRADORES  WHERE COBR_COD = :CODCOBR INTO :NOMCOBR;
                 $$IBE$$*/ /* BUSQUE EN SALDOS_DOC_CARTERA LOS QUE TENGAN SALDO > 0 */ /*$$IBE$$ 
                FOR SELECT MVCL_TIPOREF, MVCL_IDREF, MVCL_PREFREF, MVCL_NUMREF, MVCL_FECHA, MVCL_VENCE, MVCL_CONC
                    FROM MOVIMIENTO_CLIENTES WHERE TERC_NIT = :NIT AND MVCL_SUCURSAL = :SUCURSAL AND MVCL_FECHA <= :FECHA AND
                    MVCL_ABONO = 'N' AND COBR_COD = :codcobr AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) AND
                    ((:MONEDA = 0) or (MVCL_TRM <> 1))
                    INTO :TIPO, :ID, :PREFIJO, :NUMERO, :FECDOC, :VENCE, :CONCEPTO
                    DO
                    BEGIN
                    if ((inclanti = 'SI') or (TIPO <> 45)) then
                        BEGIN
                        EXECUTE PROCEDURE saldo_doc_cartera(TIPO, ID, FECHA, MONEDA) returning_values (SALDO);
                        if (SALDO <> 0) then
                            BEGIN
                            PROVISIONAL = 0;
                            EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'ANALISIS DE CARTERA CON FECHA FACTURA O VENCIMIENTO') RETURNING_VALUES (FOV);
                            if (FOV = 'FECHA') then
                               DIAS = FECHA - FECDOC;
                            ELSE
                              DIAS = FECHA - VENCE;
                            DISPONIBLE = DISPONIBLE - SALDO;
                            SELECT TIDO_NOMCORTO FROM TIPO_DOCUMENTO WHERE TIDO_COD = :TIPO INTO :TIPONOM;
                            if (TIPO = 41) then
                                SELECT NDCL_DTOFMONTO, NDCL_FECHADTO, NDCL_TRM FROM NOTAS_DEBITO_CLIENTES
                                    WHERE NDCL_ID = :ID INTO :DTOF, :FECDTO, :TRM;
                            if (TIPO = 42) then
                                SELECT 0, :FECDOC, 1 FROM NOTAS_CREDITO_CLIENTES
                                    WHERE NCCL_ID = :ID INTO :DTOF, :FECDTO, :TRM;
                            if (TIPO = 45) then
                                SELECT ANCL_DTOFMONTO, ANCL_DTOFECHA, ANCL_TRM FROM ANTICIPOS_CLIENTE
                                    WHERE ANCL_ID = :ID INTO :DTOF, :FECDTO, :TRM;
                            if (TIPO = 31) then
                                SELECT FACT_DTOFMONTO, FACT_DTOFFECHA, FACT_TRM FROM FACTURAS
                                    WHERE FACT_ID = :ID INTO :DTOF, :FECDTO, :TRM;
                            if (TIPO = 33) then
                                SELECT 0, :FECDOC, 1 FROM devoluciones_ventas
                                    WHERE DEVT_ID = :ID INTO :DTOF, :FECDTO, :TRM;
                            if (DTOF IS NULL) then
                                DTOF = 0;
                            if ((MONEDA <> 0) AND (TRM <> 0)) then
                                DTOF = DTOF / TRM;
                            if (DTOF <> 0) then
                                BEGIN
                                SELECT SUM(RCDE_DTOF) FROM RECIBOS_CAJA_DETALLE WHERE RCDE_IDDOC = :ID AND RCDE_TIPODOC = :TIPO INTO :DTOAPL;
                                if (DTOAPL IS NULL) then
                                    DTOAPL = 0;
                                DTOF = DTOF - DTOAPL;
                                 $$IBE$$*/ /* SI YA SE VENCIO DEJELO EN CERO */ /*$$IBE$$ 
                                if (FECDTO < FECHA) then
                                    DTOF = 0;
                                END
                            SELECT SUM(SDCA_RTFTE - SDCA_ABRTFTE), SUM(SDCA_RTIVA - SDCA_ABRTIVA), SUM(SDCA_RTICA - SDCA_ABRTICA)
                                FROM SALDOS_DOC_CARTERA WHERE SDCA_TIPOREF = :TIPO AND SDCA_IDREF = :ID INTO :RTFTE, :RTIVA, :RTICA;
                            if (RTFTE IS NULL) then
                                RTFTE = 0;
                            if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) THEN
                                BEGIN
                                if (RTFTE > 0) then
                                    RTFTE = 0;
                                END
                            ELSE
                                BEGIN
                                if (RTFTE < 0) then
                                    RTFTE = 0;
                                END
                            if (FAUTORET <= FECDOC) then
                                RTFTE = 0;
                            if (RTIVA IS NULL) then
                                RTIVA = 0;
                            if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) THEN
                                BEGIN
                                if (RTIVA > 0) then
                                    RTIVA = 0;
                                END
                            ELSE
                                BEGIN
                                if (RTIVA < 0) then
                                    RTIVA = 0;
                                END
                            if (RTICA IS NULL) then
                                RTICA = 0;
                            if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) THEN
                                BEGIN
                                if (RTICA > 0) then
                                    RTICA = 0;
                                END
                            ELSE
                                BEGIN
                                if (RTICA < 0) then
                                    RTICA = 0;
                                END
                             $$IBE$$*/ /* SI TIENE NOTA AGREGUELA */ /*$$IBE$$ 
                            SELECT MAX(NOCL_FECHA) FROM NOTAS_CLIENTES WHERE TERC_NIT = :NIT AND CLSU_COD = :SUCURSAL AND NOCL_TIPODOC = :TIPO AND NOCL_IDDOC = :ID INTO :FECDTO;
                            if (FECDTO IS NOT NULL) then
                                BEGIN
                                SELECT cast(NOCL_FECHA as char(10)), NOCL_TEXTO FROM NOTAS_CLIENTES
                                    WHERE NOCL_ID = :IDNOTA INTO :FECNOTA, :AUXNOTA;
                                if (STRLEN(AUXNOTA) < 244) then
                                    NOTA = FECNOTA || ':' || AUXNOTA;
                                ELSE
                                    NOTA = AUXNOTA;
                                END
                            else
                                NOTA = '';
                            SUSPEND;
                            END   $$IBE$$*/ /* SALDO <> 0 */ /*$$IBE$$ 
                        END   $$IBE$$*/ /* NO ANTICIPO */ /*$$IBE$$ 
                    END   $$IBE$$*/ /* FOR */
                /* AGREGUE LOS RECIBOS PROVISIONALES CON SIGNO NEGATIVO */ /*$$IBE$$ 
                FOR SELECT 65, MAX(P.RCPR_ID), MAX(PREF_PRE), MAX(RCPR_NUMERO), MAX(RCPR_FECHA), MAX(RCPR_CONC), SUM(RPDE_ABONO * -1), SUM(RPDE_RTFTE*-1), SUM(RPDE_RTIVA*-1), SUM(RPDE_RTICA*-1), MAX(RCPR_TRM)
                    FROM RECIBO_PROVISIONAL P, recibo_provisional_detalle D
                    WHERE P.rcpr_id = D.rcpr_id AND P.TERC_NIT = :NIT AND P.VEND_COD = :codcobr AND RCPR_FECHA <= :FECHA AND RCPR_ANULADO = 'N' AND
                    ((RCPR_FECCRUCE IS NULL) or (RCPR_FECCRUCE > :FECHA)) AND RPDE_SUCURSAL = :SUCURSAL AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                    GROUP BY P.rcpr_id
                    INTO :TIPO, :ID, :PREFIJO, :NUMERO, :FECDOC, :CONCEPTO, :PROVISIONAL, :rtfte,  :RTIVA, :RTICA, :TRM
                    DO
                    BEGIN
                    if ((MONEDA <> 0) AND (TRM <> 0)) then
                        PROVISIONAL = PROVISIONAL / TRM;
                    if (:descnt_prov = 'NO') then
                      SALDO = 0;
                    else
                      SALDO = :PROVISIONAL;
                    SELECT TIDO_NOMCORTO FROM TIPO_DOCUMENTO WHERE TIDO_COD = :TIPO INTO :TIPONOM;
                     $$IBE$$*/ /* CALCULE EL VENCIMIENTO DEL ULTIMO DOCUMENTO POSFECHADO */ /*$$IBE$$ 
                    SELECT MAX(RPPA_FECHA) FROM recibo_provisional_pago WHERE RCPR_ID = :ID INTO :VENCE;
                    DIAS = VENCE - FECHA;
                    SUSPEND;
                    END
                END  $$IBE$$*/ /* ok */ /*$$IBE$$ 
            END   $$IBE$$*/ /* FOR COBR */ /*$$IBE$$ 
        END   $$IBE$$*/ /* AGRUPA = C */ /*$$IBE$$ 
    END   $$IBE$$*/ /* FOR NIT */ /*$$IBE$$ 
SUSPEND;
 $$IBE$$*/ SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE REP_CARTERA_CONSOLIDADA(
    DESDE VARCHAR(20),
    HASTA VARCHAR(20),
    GRPINI VARCHAR(5),
    GRPFIN VARCHAR(5),
    FECHA DATE,
    ORDEN CHAR(1),
    AGRUPA CHAR(1),
    SUBEMPRESA INTEGER,
    GRUPCART INTEGER,
    MONEDA INTEGER)
RETURNS (
    NIT VARCHAR(20),
    NOMBRE VARCHAR(60),
    TELEFONO VARCHAR(40),
    CIUDAD VARCHAR(40),
    EMAIL VARCHAR(100),
    FAX VARCHAR(25),
    CEL VARCHAR(25),
    CODCLI VARCHAR(20),
    CODZONA VARCHAR(2),
    NOMZONA VARCHAR(60),
    CODCOBR INTEGER,
    NOMCOBR VARCHAR(60),
    SUCURSAL VARCHAR(10),
    DV CHAR(1),
    CODCIUD CHAR(5),
    NOMCIUD VARCHAR(60),
    SALDO NUMERIC(18,2),
    RTFTE NUMERIC(18,2),
    RTIVA NUMERIC(18,2),
    RTICA NUMERIC(18,2),
    DTOF NUMERIC(18,2),
    CUPO NUMERIC(18,2),
    DISPONIBLE NUMERIC(18,2),
    PROVISIONAL NUMERIC(18,2),
    CONTACTO VARCHAR(60),
    ESTADO CHAR(1),
    GRUPCOD INTEGER,
    GRUPNOM VARCHAR(30))
AS
declare variable NITINI VARCHAR(20);
declare variable NITFIN VARCHAR(20);
declare variable NOMINI VARCHAR(20);
declare variable NOMFIN VARCHAR(20);
declare variable OK CHAR(1);
declare variable PSALDO NUMERIC(18,2);
declare variable PRTFTE NUMERIC(18,2);
declare variable PRTIVA NUMERIC(18,2);
declare variable PRTICA NUMERIC(18,2);
declare variable PDTOF NUMERIC(18,2);
declare variable TIPO INTEGER;
declare variable ID INTEGER;
declare variable DTOAPL NUMERIC(18,2);
declare variable FECDTO DATE;
declare variable descnt_prov char(2);
declare variable AUTORET VARCHAR(10);
declare variable FAUTORET DATE;
declare variable FECDOC DATE;
declare variable INCLANTI CHAR(2);
declare variable TRM NUMERIC(18,2);
BEGIN /*$$IBE$$ 
if (ORDEN = 'C') then
    BEGIN
    NITINI = DESDE;
    NITFIN = HASTA;
    NOMINI = '';
    NOMFIN = 'zz';
    END
ELSE
    BEGIN
    NOMINI = DESDE;
    NOMFIN = HASTA;
    NITINI = '';
    NITFIN = 'zz';
    END
  EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'DESCONTAR RECIBOS PROVISIONALES EN INFORMES DE CARTERA') RETURNING_VALUES (:descnt_prov);
  EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'INCLUIR ANTICIPOS DE CLIENTES EN REPORTES Y CONSULTAS DE CARTERA') returning_values (INCLANTI);
  EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'FECHA AUTORETENEDOR NO DESCONTAR RETENCIONES DEL SALDO PERO SI CONTABILIZARLAS') returning_values (AUTORET);
  if (AUTORET <> '') then
    FAUTORET = CAST(AUTORET AS DATE);
  else
    FAUTORET = '9999/12/31';
   $$IBE$$*/ /* Ubique el NIT */ /*$$IBE$$ 
  FOR select C.TERC_NIT, CLSU_NOMBRE, TERC_DV, CLSU_TEL, CLSU_CIUDAD, TERC_CONTACTO, S.COBR_COD, S.ZONA_COD, T.CIUD_COD, CLIE_CUPO, CLIE_ESTADO, CLCU_COD, C.GRCA_COD, TERC_EMAIL, TERC_FAX, TERC_CEL, CLIE_COD
    from terceros T, CLIENTES C, CLIENTE_SUCURSALES S
    where C.TERC_NIT = T.TERC_NIT AND TERC_CLIE = 'S' AND S.TERC_NIT = C.TERC_NIT AND C.TERC_NIT >= :NITINI AND C.TERC_NIT <= :NITFIN AND
        TERC_NOM >= :NOMINI AND TERC_NOM <= :NOMFIN AND ((:GRUPCART = 0) or (C.GRCA_COD = :GRUPCART))
    INTO :NIT, :NOMBRE, :DV, :TELEFONO, :CIUDAD, :CONTACTO, :CODCOBR, :CODZONA, :CODCIUD, :CUPO, :ESTADO, :SUCURSAL, :GRUPCOD, :EMAIL, :FAX, :CEL, :CODCLI
    DO  
    BEGIN
    SELECT GRCA_NOMBRE FROM GRUPO_CARTERA WHERE GRCA_COD = :GRUPCOD INTO :GRUPNOM;
    OK = 'N';
    if (AGRUPA = 'Z') then
        BEGIN
        if (GRPINI = '') then
            BEGIN
            if ((CODZONA IS NULL) or (CODZONA >= :GRPINI AND CODZONA <= :GRPFIN)) then
                OK = 'S';
            END
        ELSE
            if (CODZONA >= :GRPINI AND CODZONA <= :GRPFIN) then
                OK = 'S';
        END
    if (AGRUPA = 'I') then
        BEGIN
        if (GRPINI = '') then
            BEGIN
            if ((CODCIUD IS NULL) or (CODCIUD >= :GRPINI AND CODCIUD <= :GRPFIN)) then
                OK = 'S';
            END
        ELSE
            if (CODCIUD >= :GRPINI AND CODCIUD <= :GRPFIN) then
                OK = 'S';
        END
    if (AGRUPA = 'N') then
        OK = 'S';
        
    if (OK = 'S') then
        BEGIN
        if (CODCOBR IS NOT NULL) then
            SELECT COBR_NOM FROM COBRADORES  WHERE COBR_COD = :CODCOBR INTO :NOMCOBR;
        if (CODZONA IS NOT NULL) then
            SELECT ZONA_NOM FROM ZONAS WHERE ZONA_COD = :CODZONA INTO :NOMZONA;
        if (CODCIUD IS NOT NULL) then
            SELECT CIUD_NOM FROM CIUDADES  WHERE CIUD_COD = :CODCIUD INTO :NOMCIUD;
    
        SALDO = 0;
        RTFTE = 0;
        RTIVA = 0;
        RTICA = 0;
        DTOF = 0;
         $$IBE$$*/ /* BUSQUE EN SALDOS_DOC_CARTERA LOS QUE TENGAN SALDO > 0 */ /*$$IBE$$ 
        FOR SELECT MVCL_TIPOREF, MVCL_IDREF, MVCL_FECHA
          FROM MOVIMIENTO_CLIENTES WHERE TERC_NIT = :NIT AND MVCL_SUCURSAL = :SUCURSAL AND MVCL_FECHA <= :FECHA AND
          MVCL_ABONO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) AND ((:MONEDA = 0) or (MVCL_TRM <> 1))
          INTO :TIPO, :ID, :FECDOC
          DO
            BEGIN
            if ((inclanti = 'SI') or (TIPO <> 45)) then
                BEGIN
                EXECUTE PROCEDURE saldo_doc_cartera(TIPO, ID, FECHA, MONEDA) returning_values (PSALDO);
                if (PSALDO <> 0) then
                    BEGIN
                    if (TIPO = 41) then
                        SELECT NDCL_DTOFMONTO, NDCL_FECHADTO, NDCL_TRM FROM NOTAS_DEBITO_CLIENTES
                            WHERE NDCL_ID = :ID INTO :PDTOF, :FECDTO, :TRM;
                    if (TIPO = 42) then
                        SELECT 0, NCCL_FECHA, 1 FROM NOTAS_CREDITO_CLIENTES
                            WHERE NCCL_ID = :ID INTO :PDTOF, :FECDTO, :TRM;
                    if (TIPO = 45) then
                        SELECT ANCL_DTOFMONTO, ANCL_DTOFECHA, ANCL_TRM FROM ANTICIPOS_CLIENTE
                            WHERE ANCL_ID = :ID INTO :PDTOF, :FECDTO, :TRM;
                    if (TIPO = 31) then
                        SELECT FACT_DTOFMONTO, FACT_DTOFFECHA, FACT_TRM FROM FACTURAS
                            WHERE FACT_ID = :ID INTO :PDTOF, :FECDTO, :TRM;
                    if (TIPO = 33) then
                        SELECT 0, DEVT_FECHA, 1 FROM devoluciones_ventas
                            WHERE DEVT_ID = :ID INTO :PDTOF, :FECDTO, :TRM;
                    if (PDTOF IS NULL) then
                        PDTOF = 0;
                    if ((MONEDA <> 0) AND (TRM <> 0)) then
                        PDTOF = PDTOF / TRM;
                    if (PDTOF <> 0) then
                        BEGIN
                        SELECT SUM(RCDE_DTOF), MAX(RECA_TRM) FROM RECIBOS_CAJA_DETALLE D, recibos_caja R
                            WHERE R.reca_id = D.reca_id AND RCDE_IDDOC = :ID AND RCDE_TIPODOC = :TIPO INTO :DTOAPL, :TRM;
                        if (DTOAPL IS NULL) then
                            DTOAPL = 0;
                        if ((MONEDA <> 0) AND (TRM <> 0)) then
                           DTOAPL = DTOAPL / TRM;
                        PDTOF = PDTOF - DTOAPL;
                         $$IBE$$*/ /* SI YA SE VENCIO DEJELO EN CERO */ /*$$IBE$$ 
                        if (FECDTO < FECHA) then
                            PDTOF = 0;
                        END
                    if (MONEDA = 0) then
                        SELECT SUM(SDCA_RTFTE - SDCA_ABRTFTE), SUM(SDCA_RTIVA - SDCA_ABRTIVA), SUM(SDCA_RTICA - SDCA_ABRTICA)
                            FROM SALDOS_DOC_CARTERA WHERE SDCA_TIPOREF = :TIPO AND SDCA_IDREF = :ID
                            INTO :PRTFTE, :PRTIVA, :PRTICA;
                    ELSE
                        SELECT SUM((SDCA_RTFTE - SDCA_ABRTFTE)/SDCA_TRM), SUM((SDCA_RTIVA - SDCA_ABRTIVA)/SDCA_TRM), SUM((SDCA_RTICA - SDCA_ABRTICA)/SDCA_TRM)
                            FROM SALDOS_DOC_CARTERA WHERE SDCA_TIPOREF = :TIPO AND SDCA_IDREF = :ID
                            INTO :PRTFTE, :PRTIVA, :PRTICA;
                    if (PRTFTE IS NULL) then
                        PRTFTE = 0;
                    if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) THEN
                        BEGIN
                        if (PRTFTE > 0) then
                            PRTFTE = 0;
                        END
                    ELSE    
                        BEGIN
                        if (PRTFTE < 0) then
                            PRTFTE = 0;
                        END
                    if (PRTIVA IS NULL) then
                        PRTIVA = 0;
                    if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) THEN
                        BEGIN
                        if (PRTIVA > 0) then
                            PRTIVA = 0;
                        END
                    ELSE
                        BEGIN
                        if (PRTIVA < 0) then
                            PRTIVA = 0;
                        END
                    if (PRTICA IS NULL) then
                        PRTICA = 0;
                    if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) THEN
                        BEGIN
                        if (PRTICA > 0) then
                            PRTICA = 0;
                        END
                    ELSE
                        BEGIN
                        if (PRTICA < 0) then
                            PRTICA = 0;
                        END

                    if (FAUTORET <= FECDOC) then
                        PRTFTE = 0;

                    SALDO = SALDO + PSALDO;
                    RTFTE = RTFTE + PRTFTE;
                    RTIVA = RTIVA + PRTIVA;
                    RTICA = RTICA + PRTICA;
                    DTOF = DTOF + PDTOF;
                    END  $$IBE$$*/ /* SALDO <> 0 */ /*$$IBE$$ 
                END   $$IBE$$*/ /* NO ANTICIPO */ /*$$IBE$$ 
            END
        DISPONIBLE = CUPO - SALDO;
         $$IBE$$*/ /* LOS RECIBOS PROVISIONALES */ /*$$IBE$$ 
        SELECT SUM(RPDE_ABONO), MAX(RCPR_TRM) FROM recibo_provisional P, recibo_provisional_detalle D
            WHERE P.rcpr_id = D.rcpr_id AND TERC_NIT = :NIT AND RPDE_SUCURSAL = :SUCURSAL AND ((:MONEDA = 0) or (RCPR_TRM <> 1)) AND
            RCPR_FECHA <= :FECHA AND RCPR_ANULADO = 'N' AND ((RCPR_FECCRUCE IS NULL) or (RCPR_FECCRUCE > :FECHA)) AND
            ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            INTO :provisional, :TRM;
        if ((MONEDA <> 0) AND (TRM <> 0)) then
            PROVISIONAL = PROVISIONAL / TRM;
           if (:descnt_prov = 'SI') then
             if (NOT :provisional is NULL) then
              SALDO = :saldo - :PROVISIONAL;
        SUSPEND;
        END
    if (AGRUPA = 'C') then
        BEGIN
        if (CODZONA IS NOT NULL) then
            SELECT ZONA_NOM FROM ZONAS WHERE ZONA_COD = :CODZONA INTO :NOMZONA;
        if (CODCIUD IS NOT NULL) then
            SELECT CIUD_NOM FROM CIUDADES  WHERE CIUD_COD = :CODCIUD INTO :NOMCIUD;
        FOR SELECT DISTINCT COBR_COD FROM MOVIMIENTO_CLIENTES WHERE TERC_NIT = :NIT AND
            MVCL_SUCURSAL = :SUCURSAL AND MVCL_FECHA <= :FECHA AND
            MVCL_ABONO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            INTO :codcobr
            DO
            begin
            OK = 'N';
            if (GRPINI = '') then
                BEGIN
                if ((CODCOBR IS NULL) or (CODCOBR >= :GRPINI AND CODCOBR <= :GRPFIN)) then
                    OK = 'S';
                END
            ELSE
                if (CODCOBR >= :GRPINI AND CODCOBR <= :GRPFIN) then
                    OK = 'S';
            if (OK = 'S') then
                BEGIN
                SELECT COBR_NOM FROM COBRADORES  WHERE COBR_COD = :CODCOBR INTO :NOMCOBR;

                SALDO = 0;
                RTFTE = 0;
                RTIVA = 0;
                RTICA = 0;
                DTOF = 0;
                 $$IBE$$*/ /* BUSQUE EN SALDOS_DOC_CARTERA LOS QUE TENGAN SALDO > 0 */ /*$$IBE$$ 
                FOR SELECT MVCL_TIPOREF, MVCL_IDREF, MVCL_FECHA
                  FROM MOVIMIENTO_CLIENTES WHERE TERC_NIT = :NIT AND MVCL_SUCURSAL = :SUCURSAL AND ((:moneda = 0) or (mvcl_trm <> 1)) AND
                  MVCL_FECHA <= :FECHA AND COBR_COD = :codcobr AND MVCL_ABONO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                  INTO :TIPO, :ID, :FECDOC
                  DO
                    BEGIN
                    if ((inclanti = 'SI') or (TIPO <> 45)) then
                        BEGIN
                        EXECUTE PROCEDURE saldo_doc_cartera(TIPO, ID, FECHA, MONEDA) returning_values (PSALDO);
                        if (PSALDO <> 0) then
                            BEGIN
                            if (TIPO = 41) then
                                SELECT NDCL_DTOFMONTO, NDCL_FECHADTO, NDCL_TRM FROM NOTAS_DEBITO_CLIENTES
                                    WHERE NDCL_ID = :ID INTO :PDTOF, :FECDTO, :TRM;
                            if (TIPO = 42) then
                                SELECT 0, NCCL_FECHA, 1 FROM NOTAS_CREDITO_CLIENTES
                                    WHERE NCCL_ID = :ID INTO :PDTOF, :FECDTO, :TRM;
                            if (TIPO = 45) then
                                SELECT ANCL_DTOFMONTO, ANCL_DTOFECHA, ANCL_TRM FROM ANTICIPOS_CLIENTE
                                    WHERE ANCL_ID = :ID INTO :PDTOF, :FECDTO, :TRM;
                            if (TIPO = 31) then
                                SELECT FACT_DTOFMONTO, FACT_DTOFFECHA, FACT_TRM FROM FACTURAS
                                    WHERE FACT_ID = :ID INTO :PDTOF, :FECDTO, :TRM;
                            if (TIPO = 33) then
                                SELECT 0, DEVT_FECHA, 1 FROM devoluciones_ventas
                                    WHERE DEVT_ID = :ID INTO :PDTOF, :FECDTO, :TRM;
                            if (PDTOF IS NULL) then
                                PDTOF = 0;
                            if ((MONEDA <> 0) AND (TRM <> 0)) then
                                PDTOF = PDTOF / TRM;
                            if (PDTOF <> 0) then
                                BEGIN
                                SELECT SUM(RCDE_DTOF), MAX(RECA_TRM) FROM RECIBOS_CAJA_DETALLE D, RECIBOS_CAJA R
                                    WHERE R.reca_id = D.reca_id AND RCDE_IDDOC = :ID AND RCDE_TIPODOC = :TIPO INTO :DTOAPL, :TRM;
                                if (DTOAPL IS NULL) then
                                    DTOAPL = 0;
                                if ((MONEDA <> 0) AND (TRM <> 0)) then
                                   DTOAPL = DTOAPL / TRM;
                                PDTOF = PDTOF - DTOAPL;
                                 $$IBE$$*/ /* SI YA SE VENCIO DEJELO EN CERO */ /*$$IBE$$ 
                                if (FECDTO < FECHA) then
                                    PDTOF = 0;
                                END
                            if (MONEDA = 0) then
                                SELECT SUM(SDCA_RTFTE - SDCA_ABRTFTE), SUM(SDCA_RTIVA - SDCA_ABRTIVA), SUM(SDCA_RTICA - SDCA_ABRTICA)
                                    FROM SALDOS_DOC_CARTERA WHERE SDCA_TIPOREF = :TIPO AND SDCA_IDREF = :ID
                                    INTO :PRTFTE, :PRTIVA, :PRTICA;
                            ELSE
                                SELECT SUM((SDCA_RTFTE - SDCA_ABRTFTE)/SDCA_TRM), SUM((SDCA_RTIVA - SDCA_ABRTIVA)/SDCA_TRM), SUM((SDCA_RTICA - SDCA_ABRTICA)/SDCA_TRM)
                                    FROM SALDOS_DOC_CARTERA WHERE SDCA_TIPOREF = :TIPO AND SDCA_IDREF = :ID
                                    INTO :PRTFTE, :PRTIVA, :PRTICA;
                            if (PRTFTE IS NULL) then
                                PRTFTE = 0;
                            if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) THEN
                                BEGIN
                                if (PRTFTE > 0) then
                                    PRTFTE = 0;
                                END
                            ELSE
                                BEGIN
                                if (PRTFTE < 0) then
                                    PRTFTE = 0;
                                END
                            if (PRTIVA IS NULL) then
                                PRTIVA = 0;
                            if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) THEN
                                BEGIN
                                if (PRTIVA > 0) then
                                    PRTIVA = 0;
                                END
                            ELSE
                                BEGIN
                                if (PRTIVA < 0) then
                                    PRTIVA = 0;
                                END
                            if (PRTICA IS NULL) then
                                PRTICA = 0;
                            if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) THEN
                                BEGIN
                                if (PRTICA > 0) then
                                    PRTICA = 0;
                                END
                            ELSE
                                BEGIN
                                if (PRTICA < 0) then
                                    PRTICA = 0;
                                END
                            if (FAUTORET <= FECDOC) then
                                PRTFTE = 0;
                            SALDO = SALDO + PSALDO;
                            RTFTE = RTFTE + PRTFTE;
                            RTIVA = RTIVA + PRTIVA;
                            RTICA = RTICA + PRTICA;
                            DTOF = DTOF + PDTOF;
                            END  $$IBE$$*/ /* SALDO <> 0 */ /*$$IBE$$ 
                        END   $$IBE$$*/ /* NO ANTICIPO */ /*$$IBE$$ 
                    END
                DISPONIBLE = CUPO - SALDO;
                 $$IBE$$*/ /* LOS RECIBOS PROVISIONALES */ /*$$IBE$$ 
                SELECT SUM(RPDE_ABONO), MAX(RCPR_TRM) FROM RECIBO_PROVISIONAL P, recibo_provisional_detalle D
                    WHERE P.rcpr_id = D.rcpr_id AND TERC_NIT = :NIT AND RPDE_SUCURSAL = :SUCURSAL AND ((:MONEDA = 0) or (RCPR_TRM <> 1)) AND
                    VEND_COD = :CODCOBR AND RCPR_FECHA <= :FECHA AND RCPR_ANULADO = 'N' AND ((RCPR_FECCRUCE IS NULL) or (RCPR_FECCRUCE > :FECHA)) AND 
                    ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                    INTO :provisional, :TRM;
                if ((MONEDA <> 0) AND (TRM <> 0)) then
                    PROVISIONAL = PROVISIONAL / TRM;
                if (:descnt_prov = 'SI') then
                   if (NOT :provisional IS NULL) then
                    SALDO = :saldo - :PROVISIONAL;
                if (AUTORET = 'SI') then
                    BEGIN
                    RTFTE = 0;
                    RTIVA = 0;
                    RTICA = 0;
                    END
                SUSPEND;
                END   $$IBE$$*/ /* OK = S */ /*$$IBE$$ 
            END   $$IBE$$*/ /* FOR COBRADOR */ /*$$IBE$$ 
        END   $$IBE$$*/ /* AGRUPA = C */ /*$$IBE$$ 
    END   $$IBE$$*/ /* FOR NIT */ /*$$IBE$$ 
SUSPEND;
 $$IBE$$*/ SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE REP_CARTERA_NOTAS(
    DESDE VARCHAR(20),
    HASTA VARCHAR(20),
    GRPINI VARCHAR(5),
    GRPFIN VARCHAR(5),
    FECHA DATE,
    ORDEN CHAR(1),
    AGRUPA CHAR(1),
    SUBEMPRESA INTEGER,
    VENCEINI DATE,
    VENCEFIN DATE,
    GRUPCART INTEGER,
    MONEDA INTEGER)
RETURNS (
    NIT VARCHAR(20),
    NOMBRE VARCHAR(60),
    TELEFONO VARCHAR(40),
    CIUDAD VARCHAR(40),
    CODZONA VARCHAR(2),
    NOMZONA VARCHAR(60),
    CODCOBR INTEGER,
    NOMCOBR VARCHAR(60),
    SUCURSAL VARCHAR(10),
    DV CHAR(1),
    CODCIUD CHAR(5),
    NOMCIUD VARCHAR(60),
    SALDO NUMERIC(18,2),
    NOTA1 VARCHAR(256),
    NOTA2 VARCHAR(256),
    CUPO NUMERIC(18,2),
    DISPONIBLE NUMERIC(18,2),
    PROVISIONAL NUMERIC(18,2),
    CONTACTO VARCHAR(60),
    ESTADO CHAR(1),
    GRUPCOD INTEGER,
    GRUPNOM VARCHAR(30))
AS
declare variable NITINI VARCHAR(20);
declare variable NITFIN VARCHAR(20);
declare variable NOMINI VARCHAR(20);
declare variable NOMFIN VARCHAR(20);
declare variable OK CHAR(1);
declare variable PSALDO NUMERIC(18,2);
declare variable TIPO INTEGER;
declare variable ID INTEGER;
declare variable NOTA VARCHAR(277);
declare variable TIPODOC VARCHAR(8);
declare variable NUMDOC VARCHAR(10);
declare variable FECNOTA VARCHAR(10);
declare variable I INTEGER;
declare variable INCLANTI CHAR(2);
declare variable TRM NUMERIC(18,2);
BEGIN /*$$IBE$$ 
if (ORDEN = 'C') then
    BEGIN
    NITINI = DESDE;
    NITFIN = HASTA;
    NOMINI = '';
    NOMFIN = 'zz';
    END
ELSE
    BEGIN
    NOMINI = DESDE;
    NOMFIN = HASTA;
    NITINI = '';
    NITFIN = 'zz';
    END
  EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'INCLUIR ANTICIPOS DE CLIENTES EN REPORTES Y CONSULTAS DE CARTERA') returning_values (INCLANTI);
   $$IBE$$*/ /* Ubique el NIT */ /*$$IBE$$ 
  FOR select T.TERC_NIT, CLSU_NOMBRE, TERC_DV, CLSU_TEL, CLSU_CIUDAD, TERC_CONTACTO, S.COBR_COD, S.ZONA_COD, CIUD_COD, CLIE_CUPO, CLIE_ESTADO, CLCU_COD, C.GRCA_COD
    from terceros T, CLIENTES C, CLIENTE_SUCURSALES S
    where C.TERC_NIT = T.TERC_NIT AND TERC_CLIE = 'S' AND S.TERC_NIT = C.TERC_NIT AND T.TERC_NIT >= :NITINI AND T.TERC_NIT <= :NITFIN AND
        TERC_NOM >= :NOMINI AND TERC_NOM <= :NOMFIN AND ((:GRUPCART = 0) or (C.GRCA_COD = :GRUPCART))
    INTO :NIT, :NOMBRE, :DV, :TELEFONO, :CIUDAD, :CONTACTO, :CODCOBR, :CODZONA, :CODCIUD, :CUPO, :ESTADO, :SUCURSAL, :GRUPCOD
    DO  
    BEGIN
    SELECT GRCA_NOMBRE FROM GRUPO_CARTERA WHERE GRCA_COD = :GRUPCOD INTO :GRUPNOM;
    OK = 'N';
    if (AGRUPA = 'Z') then
        BEGIN
        if (GRPINI = '') then
            BEGIN
            if ((CODZONA IS NULL) or (CODZONA >= :GRPINI AND CODZONA <= :GRPFIN)) then
                OK = 'S';
            END
        ELSE
            if (CODZONA >= :GRPINI AND CODZONA <= :GRPFIN) then
                OK = 'S';
        END
    if (AGRUPA = 'I') then
        BEGIN
        if (GRPINI = '') then
            BEGIN
            if ((CODCIUD IS NULL) or (CODCIUD >= :GRPINI AND CODCIUD <= :GRPFIN)) then
                OK = 'S';
            END
        ELSE
            if (CODCIUD >= :GRPINI AND CODCIUD <= :GRPFIN) then
                OK = 'S';
        END
    if (AGRUPA = 'N') then
        OK = 'S';
        
    if (OK = 'S') then
        BEGIN
        if (CODCOBR IS NOT NULL) then
            SELECT COBR_NOM FROM COBRADORES  WHERE COBR_COD = :CODCOBR INTO :NOMCOBR;
        if (CODZONA IS NOT NULL) then
            SELECT ZONA_NOM FROM ZONAS WHERE ZONA_COD = :CODZONA INTO :NOMZONA;
        if (CODCIUD IS NOT NULL) then
            SELECT CIUD_NOM FROM CIUDADES  WHERE CIUD_COD = :CODCIUD INTO :NOMCIUD;
    
        SALDO = 0;
         $$IBE$$*/ /* BUSQUE EN SALDOS_DOC_CARTERA LOS QUE TENGAN SALDO > 0 */ /*$$IBE$$ 
        FOR SELECT MVCL_TIPOREF, MVCL_IDREF
          FROM MOVIMIENTO_CLIENTES WHERE TERC_NIT = :NIT AND MVCL_SUCURSAL = :SUCURSAL AND MVCL_FECHA <= :FECHA AND
          MVCL_ABONO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) AND MVCL_VENCE >= :VENCEINI AND
          MVCL_VENCE <= :VENCEFIN AND ((:MONEDA = 0) or (MVCL_TRM <> 1))
          INTO :TIPO, :ID
          DO
            if ((inclanti = 'SI') or (TIPO <> 45)) then
                BEGIN
                EXECUTE PROCEDURE saldo_doc_cartera(TIPO, ID, FECHA, MONEDA) returning_values (PSALDO);
                if (PSALDO <> 0) then
                    SALDO = SALDO + PSALDO;
                END
        DISPONIBLE = CUPO - SALDO;
         $$IBE$$*/ /* LOS RECIBOS PROVISIONALES */ /*$$IBE$$ 
        SELECT SUM(RPDE_ABONO), MAX(RCPR_TRM) FROM RECIBO_PROVISIONAL P, recibo_provisional_detalle D
            WHERE P.rcpr_id = D.rcpr_id AND TERC_NIT = :NIT AND RPDE_SUCURSAL = :SUCURSAL AND ((:MONEDA = 0) or (RCPR_TRM <> 1)) AND
            RCPR_FECHA <= :FECHA AND RCPR_ANULADO = 'N' AND ((RCPR_FECCRUCE IS NULL) or (RCPR_FECCRUCE > :FECHA)) AND
            ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            INTO :provisional, :TRM;
        if ((MONEDA <> 0) AND (TRM <> 0)) then
            PROVISIONAL = PROVISIONAL / TRM;
         $$IBE$$*/ /* LAS NOTAS DE CLIENTES */ /*$$IBE$$ 
        I = 0;
        NOTA1 = '';
        NOTA2 = '';
        FOR SELECT CAST(NOCL_FECHA AS VARCHAR(10)), tido_nomcorto, NOCL_NUMDOC, NOCL_TEXTO
            FROM NOTAS_CLIENTES N, TIPO_DOCUMENTO T WHERE N.NOCL_TIPODOC = T.TIDO_COD AND TERC_NIT = :NIT
            AND N.TINO_COD = 3 AND N.CLSU_COD = :SUCURSAL
            ORDER BY NOCL_ID DESC INTO :FECNOTA, :TIPODOC, :NUMDOC, :NOTA
            DO
            BEGIN
            if (I = 0) then
                NOTA1 = NOTA;
            if (I = 1) then
                NOTA2 = NOTA;
            I = I + 1;
            END
        SUSPEND;
        END
    if (AGRUPA = 'C') then
        BEGIN
        if (CODZONA IS NOT NULL) then
            SELECT ZONA_NOM FROM ZONAS WHERE ZONA_COD = :CODZONA INTO :NOMZONA;
        if (CODCIUD IS NOT NULL) then
            SELECT CIUD_NOM FROM CIUDADES  WHERE CIUD_COD = :CODCIUD INTO :NOMCIUD;
        FOR SELECT DISTINCT COBR_COD FROM MOVIMIENTO_CLIENTES WHERE TERC_NIT = :NIT AND
            MVCL_SUCURSAL = :SUCURSAL AND MVCL_FECHA <= :FECHA AND
            MVCL_ABONO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) AND MVCL_VENCE >= :VENCEINI AND MVCL_VENCE <= :VENCEFIN
            INTO :codcobr
            DO
            begin
            OK = 'N';
            if (GRPINI = '') then
                BEGIN
                if ((CODCOBR IS NULL) or (CODCOBR >= :GRPINI AND CODCOBR <= :GRPFIN)) then
                    OK = 'S';
                END
            ELSE
                if (CODCOBR >= :GRPINI AND CODCOBR <= :GRPFIN) then
                    OK = 'S';
            if (OK = 'S') then
                BEGIN
                SELECT COBR_NOM FROM COBRADORES  WHERE COBR_COD = :CODCOBR INTO :NOMCOBR;

                SALDO = 0;
                 $$IBE$$*/ /* BUSQUE EN SALDOS_DOC_CARTERA LOS QUE TENGAN SALDO > 0 */ /*$$IBE$$ 
                FOR SELECT MVCL_TIPOREF, MVCL_IDREF
                  FROM MOVIMIENTO_CLIENTES WHERE TERC_NIT = :NIT AND MVCL_SUCURSAL = :SUCURSAL AND
                  MVCL_FECHA <= :FECHA AND COBR_COD = :codcobr AND MVCL_ABONO = 'N' AND
                  ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) AND MVCL_VENCE >= :VENCEINI AND
                  MVCL_VENCE <= :VENCEFIN AND ((:MONEDA = 0) or (MVCL_TRM <> 1))
                  INTO :TIPO, :ID
                  DO
                    if ((inclanti = 'SI') or (TIPO <> 45)) then
                        BEGIN
                        EXECUTE PROCEDURE saldo_doc_cartera(TIPO, ID, FECHA, MONEDA) returning_values (PSALDO);
                        if (PSALDO <> 0) then
                            BEGIN
                            SALDO = SALDO + PSALDO;
                            END
                        END
                DISPONIBLE = CUPO - SALDO;
                 $$IBE$$*/ /* LOS RECIBOS PROVISIONALES */ /*$$IBE$$ 
                SELECT SUM(RPDE_ABONO), MAX(RCPR_TRM) FROM RECIBO_PROVISIONAL P, recibo_provisional_detalle D
                    WHERE P.rcpr_id = D.rcpr_id AND TERC_NIT = :NIT AND RPDE_SUCURSAL = :SUCURSAL AND ((:MONEDA = 0) or (RCPR_TRM <> 1)) AND
                    VEND_COD = :CODCOBR AND RCPR_FECHA <= :FECHA AND RCPR_ANULADO = 'N' AND ((RCPR_FECCRUCE IS NULL) or (RCPR_FECCRUCE > :FECHA)) AND
                    ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                    INTO :provisional, :TRM;
                if ((MONEDA <> 0) AND (TRM <> 0)) then
                    PROVISIONAL = PROVISIONAL / TRM;
                 $$IBE$$*/ /* LAS NOTAS DE CLIENTES */ /*$$IBE$$ 
                I = 0;
                NOTA1 = '';
                NOTA2 = '';
                FOR SELECT CAST(NOCL_FECHA AS VARCHAR(10)), tido_nomcorto, NOCL_NUMDOC, NOCL_TEXTO
                    FROM NOTAS_CLIENTES N, TIPO_DOCUMENTO T WHERE N.NOCL_TIPODOC = T.TIDO_COD AND TERC_NIT = :NIT
                    AND N.TINO_COD = 3 AND N.CLSU_COD = :SUCURSAL
                    ORDER BY NOCL_FECHA DESC INTO :FECNOTA, :TIPODOC, :NUMDOC, :NOTA
                    DO
                    BEGIN
                    if (I = 0) then
                        NOTA1 = NOTA;
                    if (I = 1) then
                        NOTA2 = NOTA;
                    I = I + 1;
                    END
                SUSPEND;
                END   $$IBE$$*/ /* OK = S */ /*$$IBE$$ 
            END   $$IBE$$*/ /* FOR COBRADOR */ /*$$IBE$$ 
        END   $$IBE$$*/ /* AGRUPA = C */ /*$$IBE$$ 
    END   $$IBE$$*/ /* FOR NIT */ /*$$IBE$$ 
SUSPEND;
 $$IBE$$*/ SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

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

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE VENCIDO_CLIENTE(
    NIT VARCHAR(20),
    FECHA DATE,
    SUCURSAL VARCHAR(10),
    BLOQ CHAR(1))
RETURNS (
    TIPO INTEGER,
    ID INTEGER,
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(6),
    SALDO NUMERIC(18,2),
    RTFTE NUMERIC(18,2),
    RTIVA NUMERIC(18,2),
    RTICA NUMERIC(18,2),
    DTOF NUMERIC(18,2),
    TIPONOM VARCHAR(8))
AS
DECLARE VARIABLE FEC DATE;
declare variable DB CHAR(1);
declare variable VENCE DATE;
declare variable AUTORET VARCHAR(10);
declare variable FAUTORET DATE;
declare variable FECDOC DATE;
declare variable DIAS INTEGER;
declare variable DIASBLOQ INTEGER;
BEGIN /*$$IBE$$ 
EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'FECHA AUTORETENEDOR NO DESCONTAR RETENCIONES DEL SALDO PERO SI CONTABILIZARLAS') returning_values (AUTORET);
if (AUTORET <> '') then
    FAUTORET = CAST(AUTORET AS DATE);
else
    FAUTORET = '9999/12/31';
 $$IBE$$*/ /* BUSQUE EN SALDOS_DOC_CARTERA LOS QUE TENGAN SALDO > 0 */ /*$$IBE$$ 
FOR SELECT MVCL_TIPOREF, MVCL_IDREF, MVCL_DEBITO, MVCL_PREFREF, MVCL_NUMREF, MVCL_VENCE, MVCL_FECHA
    FROM MOVIMIENTO_CLIENTES
    WHERE TERC_NIT = :NIT AND ((MVCL_SUCURSAL = :SUCURSAL) or (:SUCURSAL = 0)) AND MVCL_FECHA <= :FECHA AND MVCL_ABONO = 'N'
    INTO :TIPO, :ID, :DB, :PREFIJO, :NUMERO, :VENCE, :FECDOC
    DO
    BEGIN
    EXECUTE PROCEDURE saldo_doc_cartera(TIPO, ID, FECHA, 0) returning_values (SALDO);
    if ((SALDO <> 0) AND (VENCE < FECHA)) then
        BEGIN
        DIAS = fecha - vence;
        SELECT CLIE_DIASBLOQ FROM CLIENTES WHERE TERC_NIT = :NIT INTO :DIASBLOQ;
        if (diasbloq IS NULL) then
            diasbloq = 0;
        if ((BLOQ <> 'S') OR (DIAS > DIASBLOQ)) then
            BEGIN
            SELECT TIDO_NOMCORTO FROM TIPO_DOCUMENTO WHERE TIDO_COD = :TIPO INTO :TIPONOM;
            if (TIPO = 41) then
                SELECT NDCL_DTOFMONTO, NDCL_FECHADTO FROM NOTAS_DEBITO_CLIENTES WHERE NDCL_ID = :ID INTO :DTOF, :FEC;
            if (TIPO = 42) then
                SELECT 0, NCCL_FECHA FROM NOTAS_CREDITO_CLIENTES WHERE NCCL_ID = :ID INTO :DTOF, :FEC;
            if (TIPO = 45) then
                SELECT ANCL_DTOFMONTO, ANCL_DTOFECHA FROM ANTICIPOS_CLIENTE WHERE ANCL_ID = :ID INTO :DTOF, :FEC;
            if (TIPO = 31) then
                SELECT 0, :FECHA FROM FACTURAS WHERE FACT_ID = :ID INTO :DTOF, :FEC;
            if (TIPO = 33) then
                SELECT 0, :FECHA FROM devoluciones_ventas WHERE DEVT_ID = :ID INTO :DTOF, :FEC;
            if (FECHA > FEC) then
                DTOF = 0;
            if (DTOF IS NULL) then
                DTOF = 0;
            if (FAUTORET <= FECDOC) then
                BEGIN
                RTFTE = 0;
                RTIVA = 0;
                RTICA = 0;
                END
            ELSE
                BEGIN
                SELECT SUM(SDCA_RTFTE - SDCA_ABRTFTE), SUM(SDCA_RTIVA - SDCA_ABRTIVA), SUM(SDCA_RTICA - SDCA_ABRTICA)
                    FROM SALDOS_DOC_CARTERA WHERE SDCA_TIPOREF = :TIPO AND SDCA_IDREF = :ID INTO :RTFTE, :RTIVA, :RTICA;
                if (RTFTE IS NULL) then
                    RTFTE = 0;
                if (RTIVA IS NULL) then
                    RTIVA = 0;
                if (RTICA IS NULL) then
                    RTICA = 0;
                END
            SUSPEND;
            END
        END
    END
SUSPEND;
 $$IBE$$*/ SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE CUPO_DISPONIBLE(
    NIT VARCHAR(20),
    FECHA DATE,
    SUCURSAL VARCHAR(10))
RETURNS (
    DISPONIBLE NUMERIC(18,2))
AS
declare variable SALDO NUMERIC(18,2);
begin /*$$IBE$$ 
SELECT CLIE_CUPO FROM CLIENTES WHERE TERC_NIT = :NIT INTO :DISPONIBLE;
if (DISPONIBLE IS NULL) then
    DISPONIBLE = 0;
SELECT SUM(SALDO) FROM VENCIDO_CLIENTE (:NIT, :FECHA, :SUCURSAL, 'N') INTO :SALDO;
if (SALDO IS NULL) then
    SALDO = 0;
DISPONIBLE = DISPONIBLE - SALDO;
suspend;
SUSPEND;
 $$IBE$$*/ SUSPEND;
end
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE BUSCAR_DEVOLCHEQ(
    CUENTA INTEGER)
RETURNS (
    ID INTEGER,
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    NOMTERC VARCHAR(60),
    MONTO NUMERIC(18,2),
    CODCTA VARCHAR(30),
    CHNUMERO VARCHAR(20),
    CHCUENTA VARCHAR(20),
    CHBANCO VARCHAR(2),
    ANULAR CHAR(1),
    SALDO NUMERIC(18,2))
AS
begin
for select dvch_id, prba_pref, dvch_numdoc, dvch_fecha, dvch_nomterc, dvch_monto, cuba_codcta,
    dvch_nroch, dvch_cuenta, dvch_banco, dvch_anulado
    from devolucion_cheques ch, cuentas_banco c where ch.cuba_cod = c.cuba_cod and ch.cuba_cod = :CUENTA
    INTO :ID, :prefijo, :numero, :fecha, :nomterc, :monto, :codcta, :chnumero, :chcuenta, :chbanco, :anular
    do
    begin
    execute procedure saldo_doc_cartera(77, :id,  '2099-12-31', 0) returning_values (:SALDO);
    suspend;
    end
SUSPEND;
end

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE BUSCA_ID_DOC_CARTERA(
    TIPO INTEGER,
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(6),
    NIT VARCHAR(20),
    FECHA DATE,
    MONEDA INTEGER)
RETURNS (
    ID INTEGER,
    SALDO NUMERIC(18,2),
    RTFTE NUMERIC(18,2),
    RTIVA NUMERIC(18,2),
    RTICA NUMERIC(18,2),
    DTOF NUMERIC(18,2),
    ERROR INTEGER)
AS
declare variable vernit varchar(20);
declare variable fec date;
declare variable fecdto date;
declare variable desc_rtes char(2);
declare variable dtoapl numeric(18,2);
declare variable AUTORET VARCHAR(10);
declare variable FAUTORET DATE;
declare variable FECDOC DATE;
declare variable TRM numeric(18,2);
BEGIN
ID = 0;
ERROR = 0;
EXECUTE PROCEDURE COMPLETA_CEROS(NUMERO) returning_values (NUMERO);
if (TIPO = 41) then
    SELECT NDCL_ID, TERC_NIT, NDCL_FECHA, NDCL_DTOFMONTO, NDCL_FECHADTO, NDCL_TRM
        FROM NOTAS_DEBITO_CLIENTES WHERE PREF_PRE = :PREFIJO AND NDCL_NUMERO = :NUMERO
        INTO :ID, :VERNIT, :FEC, :DTOF, :FECDTO, :TRM;
if (TIPO = 42) then
    SELECT NCCL_ID, TERC_NIT, NCCL_FECHA, 0, NCCL_FECHA, 1
        FROM NOTAS_CREDITO_CLIENTES WHERE PREF_PRE = :PREFIJO AND NCCL_NUMERO = :NUMERO
        INTO :ID, :VERNIT, :FEC, :DTOF, :FECDTO, :TRM;
if (TIPO = 45) then
    SELECT ANCL_ID, TERC_NIT, ANCL_FECHA, ANCL_DTOFMONTO, ANCL_DTOFECHA, ANCL_TRM
        FROM ANTICIPOS_CLIENTE WHERE PREF_PRE = :PREFIJO AND ANCL_NUMERO = :NUMERO
        INTO :ID, :VERNIT, :FEC, :DTOF, :FECDTO, :TRM;
if (TIPO = 31) then
    SELECT FACT_ID, TERC_NIT, FACT_FECHA, FACT_DTOFMONTO, FACT_DTOFFECHA, FACT_TRM
        FROM FACTURAS WHERE PREF_PRE = :PREFIJO AND FACT_NUMERO = :NUMERO
        INTO :ID, :VERNIT, :FEC, :DTOF, :FECDTO, :TRM;
if (TIPO = 33) then
    SELECT DEVT_ID, TERC_NIT, DEVT_FECHA, 0, DEVT_FECHA, 1 FROM devoluciones_ventas
        WHERE PREF_PRE = :PREFIJO AND DEVT_NUMERO = :NUMERO INTO :ID, :VERNIT, :FEC, :DTOF, :FECDTO, :TRM;
if (TIPO = 77) then
    SELECT DVCH_ID, TERC_NIT, DVCH_FECHA, 0, DVCH_FECHA, 1 FROM devolucion_cheques
        WHERE PRBA_PREf = :PREFIJO AND DVCH_NUMDOC = :NUMERO INTO :ID, :VERNIT, :FEC, :DTOF, :FECDTO, :TRM;
if (FECHA > FECDTO) then
    DTOF = 0;
if (DTOF IS NULL) then
    DTOF = 0;
if (DTOF <> 0) then
    BEGIN
    if ((MONEDA <> 0) AND (TRM <> 0)) then
        DTOF = DTOF / TRM;
    if (MONEDA = 0) then
        SELECT SUM(RCDE_DTOF) FROM RECIBOS_CAJA_DETALLE WHERE RCDE_IDDOC = :ID AND RCDE_TIPODOC = :TIPO INTO :DTOAPL;
    else
        SELECT SUM(RCDE_DTOF/RECA_TRM) FROM RECIBOS_CAJA_DETALLE D, RECIBOS_CAJA R
            WHERE R.reca_id = D.reca_id AND RCDE_IDDOC = :ID AND RCDE_TIPODOC = :TIPO INTO :DTOAPL;
    if (DTOAPL IS NULL) then
        DTOAPL = 0;
    DTOF = DTOF - DTOAPL;
    END
IF (ID = 0) then
    ERROR = 1;
ELSE
  BEGIN
  if (VERNIT <> NIT) then
    ERROR = 2;
  else
    BEGIN
    /* VERIFIQUE QUE LA FECHA DEL ABONO SEA POSTERIOR O IGUAL AL DOC */
    if (FEC > FECHA) then
        ERROR = 3;
    else
        begin
        /* CALCULE LOS SALDOS */
        if (MONEDA = 0) then
          SELECT SUM(SDCA_MONTO - SDCA_ABONO), SUM(SDCA_RTFTE - SDCA_ABRTFTE), SUM(SDCA_RTIVA - SDCA_ABRTIVA), SUM(SDCA_RTICA - SDCA_ABRTICA)
            FROM SALDOS_DOC_CARTERA WHERE SDCA_TIPOREF = :TIPO AND SDCA_IDREF = :ID
            INTO :SALDO, :RTFTE, :RTIVA, :RTICA;
        else
          SELECT SUM((SDCA_MONTO - SDCA_ABONO)/SDCA_TRM), SUM((SDCA_RTFTE - SDCA_ABRTFTE)/SDCA_TRM), SUM((SDCA_RTIVA - SDCA_ABRTIVA)/SDCA_TRM), SUM((SDCA_RTICA - SDCA_ABRTICA)/SDCA_TRM)
            FROM SALDOS_DOC_CARTERA WHERE SDCA_TIPOREF = :TIPO AND SDCA_IDREF = :ID
            INTO :SALDO, :RTFTE, :RTIVA, :RTICA;
        if ((TIPO = 31) or (TIPO = 41) or (TIPO = 77)) then
            begin
            if ((RTFTE IS NULL) or (RTFTE < 0))  then
                RTFTE = 0;
            if ((RTIVA IS NULL) or (RTIVA < 0 ))  then
                RTIVA = 0;
            if ((RTICA IS NULL) or (RTICA < 0))  then
                RTICA = 0;
            end
        if ((TIPO = 33) or (TIPO = 42) or (TIPO = 45)) then
            begin
            if ((RTFTE IS NULL) or (RTFTE > 0))  then
                RTFTE = 0;
            if ((RTIVA IS NULL) or (RTIVA > 0 ))  then
                RTIVA = 0;
            if ((RTICA IS NULL) or (RTICA > 0))  then
                RTICA = 0;
            end
        /* TRAIGA EL SALDO NETO */
        EXECUTE PROCEDURE SALDO_DOC_CARTERA(TIPO, ID, FECHA, MONEDA) returning_values (SALDO);
        if (SALDO = 0) then
            ERROR = 4;
        ELSE
            BEGIN
            EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'FECHA AUTORETENEDOR NO DESCONTAR RETENCIONES DEL SALDO PERO SI CONTABILIZARLAS') returning_values (AUTORET);
            if (AUTORET <> '') then
                FAUTORET = CAST(AUTORET AS DATE);
            else
                FAUTORET = '9999/12/31';
            /* BUSQUE LA FECHA DEL DOCUMENTO */
            SELECT MIN(SDCA_FECHA) FROM SALDOS_DOC_CARTERA WHERE (SDCA_TIPOREF = :TIPO) AND (SDCA_IDREF = :ID) AND (SDCA_MONTO <> 0) INTO :FECDOC;
            if (FAUTORET <= FECDOC) then
                BEGIN
                RTFTE = 0;
                RTIVA = 0;
                RTICA = 0;
                END
            /* RESTE LAS RETENCIONES YA QUE SE SUGERIRAN */
            EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'DESCONTAR RETENCIONES POR CAUSACION') returning_values (DESC_RTES);
            if (DESC_RTES = 'NO') then
                SALDO = SALDO - RTFTE - RTIVA - RTICA;
            SALDO = SALDO - DTOF;
            END
        end
    END
  end
SUSPEND;
END

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE CHEQUEO_SALDOS_DOC_CARTERA(
    CLIINI VARCHAR(20),
    CLIFIN VARCHAR(20))
RETURNS (
    ERROR VARCHAR(60),
    TIPO INTEGER,
    ID INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(6))
AS
declare variable FECHA DATE;
declare variable NIT VARCHAR(20);
declare variable RTFTE NUMERIC(18, 2);
declare variable RTIVA NUMERIC(18, 2);
declare variable RTICA NUMERIC(18, 2);
declare variable MONTO NUMERIC(18, 2);
declare variable EXISTE CHAR(1);
declare variable IDR INTEGER;
declare variable RECAID INTEGER;
declare variable TRM NUMERIC(18, 2);
BEGIN
DELETE FROM SALDOS_DOC_CARTERA WHERE TERC_NIT >= :CLIINI AND TERC_NIT <= :CLIFIN;
DELETE FROM ANTICIPOS_CLIENTE WHERE RECA_ID = 0;

FOR SELECT FACT_ID, FACT_FECHA, TERC_NIT, FACT_RTFTEMONTO, FACT_rtivamonto, FACT_rticamonto, FACT_TOTAL, FACT_TRM
    FROM FACTURAS WHERE FACT_ID <> 0 and fact_anulado = 'N' AND TERC_NIT >= :CLIINI AND TERC_NIT <= :CLIFIN
    ORDER BY FACT_FECHA
    INTO :ID, :FECHA, :nit,  :RTFTE, :RTIVA, :RTICA, :MONTO, :TRM
    DO
    INSERT INTO SALDOS_DOC_CARTERA (SDCA_TIPOREF, SDCA_IDREF, SDCA_FECHA, TERC_NIT, SDCA_RTFTE, SDCA_RTIVA, SDCA_RTICA, SDCA_ABONO, SDCA_ABRTFTE, SDCA_ABRTIVA, SDCA_ABRTICA, SDCA_DEBITO, SDCA_MONTO, SDCA_TRM)
        VALUES (31, :ID, :fecha, :nit, :rtfte, :rtiva, :rtica, 0, 0, 0, 0, 'S', :MONTO, :TRM);

FOR SELECT NDCL_ID, NDCL_FECHA, TERC_NIT, NDCL_RTFTEMONTO, NDCL_rtivamonto, NDCL_rticamonto, ndcl_monto+ndcl_ivamonto, NDCL_TRM
    FROM NOTAS_DEBITO_CLIENTES WHERE NDCL_ID <> 0 and NDCL_anulado = 'N'  AND TERC_NIT >= :CLIINI AND TERC_NIT <= :CLIFIN
    ORDER BY NDCL_FECHA
    INTO :ID, :FECHA, :nit,  :RTFTE, :RTIVA, :RTICA, :MONTO, :TRM
    DO
    INSERT INTO SALDOS_DOC_CARTERA (SDCA_TIPOREF, SDCA_IDREF, SDCA_FECHA, TERC_NIT, SDCA_RTFTE, SDCA_RTIVA, SDCA_RTICA, SDCA_ABONO, SDCA_ABRTFTE, SDCA_ABRTIVA, SDCA_ABRTICA, SDCA_DEBITO, SDCA_MONTO, SDCA_TRM)
        VALUES (41, :ID, :fecha, :nit, :rtfte, :rtiva, :rtica, 0, 0, 0, 0, 'S', :MONTO, :TRM);

FOR SELECT DVCH_ID, DVCH_FECHA, TERC_NIT, 0, 0, 0, DVCH_MONTO
    FROM devolucion_cheques WHERE DVCH_ID <> 0 and DVCH_anulado = 'N' AND DVCH_CARTERA = 'S'  AND TERC_NIT >= :CLIINI AND TERC_NIT <= :CLIFIN
    ORDER BY DVCH_FECHA
    INTO :ID, :FECHA, :nit,  :RTFTE, :RTIVA, :RTICA, :MONTO
    DO
    INSERT INTO SALDOS_DOC_CARTERA (SDCA_TIPOREF, SDCA_IDREF, SDCA_FECHA, TERC_NIT, SDCA_RTFTE, SDCA_RTIVA, SDCA_RTICA, SDCA_ABONO, SDCA_ABRTFTE, SDCA_ABRTIVA, SDCA_ABRTICA, SDCA_DEBITO, SDCA_MONTO, SDCA_TRM)
        VALUES (77, :ID, :fecha, :nit, :rtfte, :rtiva, :rtica, 0, 0, 0, 0, 'S', :MONTO, 1);

FOR SELECT DEVT_ID, DEVT_FECHA, TERC_NIT, DEVT_RTFTEMONTO, DEVT_rtivamonto, DEVT_rticamonto, devt_total, DEVT_TRM
    FROM DEVOLUCIONES_VENTAS WHERE DEVT_ID <> 0 and DEVT_anulado = 'N' AND TERC_NIT >= :CLIINI AND TERC_NIT <= :CLIFIN
    ORDER BY DEVT_FECHA
    INTO :ID, :FECHA, :nit,  :RTFTE, :RTIVA, :RTICA, :MONTO, :TRM
    DO
    INSERT INTO SALDOS_DOC_CARTERA (SDCA_TIPOREF, SDCA_IDREF, SDCA_FECHA, TERC_NIT, SDCA_RTFTE, SDCA_RTIVA, SDCA_RTICA, SDCA_ABONO, SDCA_ABRTFTE, SDCA_ABRTIVA, SDCA_ABRTICA, SDCA_DEBITO, SDCA_MONTO, SDCA_TRM)
        VALUES (33, :ID, :fecha, :nit, :rtfte*-1, :rtiva*-1, :rtica*-1, 0, 0, 0, 0, 'N', :MONTO * -1, :TRM);

FOR SELECT NCCL_ID, NCCL_FECHA, TERC_NIT, NCCL_RTFTEMONTO, NCCL_rtivamonto, NCCL_rticamonto, nccl_monto+nccl_ivamonto, NCCL_TRM
    FROM NOTAS_CREDITO_CLIENTES WHERE NCCL_ID <> 0 and NCCL_anulado = 'N' AND TERC_NIT >= :CLIINI AND TERC_NIT <= :CLIFIN
    ORDER BY NCCL_FECHA
    INTO :ID, :FECHA, :nit,  :RTFTE, :RTIVA, :RTICA, :MONTO, :TRM
    DO
    INSERT INTO SALDOS_DOC_CARTERA (SDCA_TIPOREF, SDCA_IDREF, SDCA_FECHA, TERC_NIT, SDCA_RTFTE, SDCA_RTIVA, SDCA_RTICA, SDCA_ABONO, SDCA_ABRTFTE, SDCA_ABRTIVA, SDCA_ABRTICA, SDCA_DEBITO, SDCA_MONTO, SDCA_TRM)
        VALUES (42, :ID, :fecha, :nit, :rtfte*-1, :rtiva*-1, :rtica*-1, 0, 0, 0, 0, 'N', :MONTO * -1, :TRM);

FOR SELECT ANCL_ID, ANCL_FECHA, TERC_NIT, ANCL_RTFTEMONTO, ANCL_rtivamonto, ANCL_rticamonto, ancl_base+ancl_ivamonto, ANCL_TRM
    FROM ANTICIPOS_CLIENTE WHERE ANCL_ID <> 0 and ANCL_anulado = 'N' AND TERC_NIT >= :CLIINI AND TERC_NIT <= :CLIFIN
    ORDER BY ANCL_FECHA
    INTO :ID, :FECHA, :nit,  :RTFTE, :RTIVA, :RTICA, :MONTO, :TRM
    DO
    INSERT INTO SALDOS_DOC_CARTERA (SDCA_TIPOREF, SDCA_IDREF, SDCA_FECHA, TERC_NIT, SDCA_RTFTE, SDCA_RTIVA, SDCA_RTICA, SDCA_ABONO, SDCA_ABRTFTE, SDCA_ABRTIVA, SDCA_ABRTICA, SDCA_DEBITO, SDCA_MONTO, SDCA_TRM)
        VALUES (45, :ID, :fecha, :nit, :rtfte*-1, :rtiva*-1, :rtica*-1, 0, 0, 0, 0, 'N', :MONTO * -1, :TRM);

FOR SELECT ACDE_TIPODOC, ACDE_IDDOC, APCL_FECHA, TERC_NIT, ACDE_APLICADO, ACDE_RTFTE, ACDE_RTIVA, ACDE_RTICA, A.apcl_trm
    FROM APLICACION_CLIENTE_DETALLE D, APLICACION_CLIENTE A
    WHERE A.APCL_ID = D.apcl_id AND A.APCL_ID <> 0 AND APCL_ANULADO = 'N' AND TERC_NIT >= :CLIINI AND TERC_NIT <= :CLIFIN
    ORDER BY APCL_FECHA
    INTO :TIPO, :ID, :FECHA, :NIT, :MONTO, :RTFTE, :RTIVA, :RTICA, :TRM
    DO
    BEGIN
    EXISTE = 'N';
    select 'S' from saldos_doc_cartera where sdca_tiporef = :TIPO and sdca_idref = :ID and sdca_fecha = :fecha into :EXISTE;
    if (Existe = 'S') then
        begin
        /* actualice el saldo del dia */
        UPDATE saldos_doc_cartera
            SET SDCA_ABONO = SDCA_ABONO + :MONTO,
                SDCA_ABRTFTE = SDCA_ABRTFTE + :RTFTE,
                SDCA_ABRTIVA = SDCA_ABRTIVA + :RTIVA,
                SDCA_ABRTICA = SDCA_ABRTICA + :RTICA,
                SDCA_TRM = :TRM
            WHERE SDCA_TIPOREF = :TIPO AND SDCA_IDREF = :ID AND SDCA_FECHA = :fecha;
        END
    ELSE
        BEGIN
        /* Inserte un nuevo saldo diario */
        INSERT INTO SALDOS_DOC_CARTERA (SDCA_TIPOREF, SDCA_IDREF, SDCA_FECHA, TERC_NIT, SDCA_RTFTE, SDCA_RTIVA, SDCA_RTICA, SDCA_ABONO, SDCA_ABRTFTE, SDCA_ABRTIVA, SDCA_ABRTICA, SDCA_DEBITO, SDCA_MONTO, SDCA_TRM)
            VALUES (:TIPO, :ID, :fecha, :NIT, 0, 0, 0, :MONTO, :rtfte, :rtiva, :rtica, 'N', 0, :TRM);
        END
    END

FOR SELECT R.RECA_ID, RCDE_TIPODOC, RCDE_IDDOC, RECA_FECHA, TERC_NIT, RCDE_ABONO+RCDE_DTOF, RCDE_RTFTE, RCDE_RTIVA, RCDE_RTICA, RECA_TRM
    FROM RECIBOS_CAJA_DETALLE D, RECIBOS_CAJA R
    WHERE R.RECA_ID = D.RECA_id AND R.RECA_ID <> 0 AND RECA_ANULADO = 'N' AND TERC_NIT >= :CLIINI AND TERC_NIT <= :CLIFIN
    ORDER BY RECA_FECHA
    INTO :IDR, :TIPO, :ID, :FECHA, :NIT, :MONTO, :RTFTE, :RTIVA, :RTICA, :TRM
    DO
    BEGIN
    EXISTE = 'N';
    if (TIPO = 45) then
        BEGIN
        SELECT RECA_ID FROM ANTICIPOS_CLIENTE WHERE ANCL_ID = :ID INTO :RECAID;
        if (RECAID = IDR) then
            EXISTE = 'S';
        END
    if (EXISTE = 'N') then
        BEGIN
        select 'S' from saldos_doc_cartera where sdca_tiporef = :TIPO and sdca_idref = :ID and sdca_fecha = :fecha into :EXISTE;
        if (Existe = 'S') then
            begin
            /* actualice el saldo del dia */
            UPDATE saldos_doc_cartera
                SET SDCA_ABONO = SDCA_ABONO + :MONTO,
                    SDCA_ABRTFTE = SDCA_ABRTFTE + :RTFTE,
                    SDCA_ABRTIVA = SDCA_ABRTIVA + :RTIVA,
                    SDCA_ABRTICA = SDCA_ABRTICA + :RTICA,
                    SDCA_TRM = :TRM
                WHERE SDCA_TIPOREF = :TIPO AND SDCA_IDREF = :ID AND SDCA_FECHA = :fecha;
            END
        ELSE
            BEGIN
            /* Inserte un nuevo saldo diario */
            INSERT INTO SALDOS_DOC_CARTERA (SDCA_TIPOREF, SDCA_IDREF, SDCA_FECHA, TERC_NIT, SDCA_RTFTE, SDCA_RTIVA, SDCA_RTICA, SDCA_ABONO, SDCA_ABRTFTE, SDCA_ABRTIVA, SDCA_ABRTICA, SDCA_DEBITO, SDCA_MONTO, SDCA_TRM)
                VALUES (:TIPO, :ID, :fecha, :NIT, 0, 0, 0, :MONTO, :rtfte, :rtiva, :rtica, 'N', 0, :TRM);
            END
        END
    END

FOR SELECT E.egre_id, EGCC_TIPODOC, EGCC_IDDOC, EGRE_FECHA, TERC_NIT, EGCC_ABONO+EGCC_DTOF, EGCC_RTFTE, EGCC_RTIVA, EGCC_RTICA, EGRE_TRM
    FROM EGRESOS_CRUCEC C, EGRESOS E
    WHERE E.egre_id = C.egre_id AND EGRE_ANULADO = 'N' AND TERC_NIT >= :CLIINI AND TERC_NIT <= :CLIFIN
    ORDER BY EGRE_FECHA
    INTO :IDR, :TIPO, :ID, :FECHA, :NIT, :MONTO, :RTFTE, :RTIVA, :RTICA, :TRM
    DO
    BEGIN
    select 'S' from saldos_doc_cartera where sdca_tiporef = :TIPO and sdca_idref = :ID and sdca_fecha = :fecha into :EXISTE;
    if (Existe = 'S') then
        begin
        /* actualice el saldo del dia */
        UPDATE saldos_doc_cartera
            SET SDCA_ABONO = SDCA_ABONO + :MONTO,
            SDCA_ABRTFTE = SDCA_ABRTFTE + :RTFTE,
            SDCA_ABRTIVA = SDCA_ABRTIVA + :RTIVA,
            SDCA_ABRTICA = SDCA_ABRTICA + :RTICA,
            SDCA_TRM = :TRM
            WHERE SDCA_TIPOREF = :TIPO AND SDCA_IDREF = :ID AND SDCA_FECHA = :fecha;
        END
    ELSE
        BEGIN
        /* Inserte un nuevo saldo diario */
        INSERT INTO SALDOS_DOC_CARTERA (SDCA_TIPOREF, SDCA_IDREF, SDCA_FECHA, TERC_NIT, SDCA_RTFTE, SDCA_RTIVA, SDCA_RTICA, SDCA_ABONO, SDCA_ABRTFTE, SDCA_ABRTIVA, SDCA_ABRTICA, SDCA_DEBITO, SDCA_MONTO, SDCA_TRM)
            VALUES (:TIPO, :ID, :fecha, :NIT, 0, 0, 0, :MONTO, :rtfte, :rtiva, :rtica, 'N', 0, :TRM);
        END
    END

for select ancl_id, ancl_base+ancl_ivamonto, PREF_PRE, ANCL_NUMERO, ANCL_TRM from anticipos_cliente
    where ANCL_ANULADO = 'N' and reca_id not in (select reca_id from recibos_caja where reca_anulado = 'N')
    into :ID, :MONTO, :PREF, :NUMERO, :TRM
    do
    begin
    FECHA = cast('now' as date);
    execute procedure saldo_doc_cartera(45, :id, :FECHA, 0) returning_values (:RTFTE);
    if ((MONTO = RTFTE) or (RTFTE IS NULL)) then
        DELETE FROM ANTICIPOS_CLIENTE WHERE ANCL_ID = :ID;
    ELSE
        BEGIN
        TIPO = 45;
        ERROR = 'DOCUMENTO ANULADO CON ABONOS';
        SUSPEND;
        END
    end
SUSPEND;
END

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE COMISIONES_COBRO(
    DESDE INTEGER,
    HASTA INTEGER,
    FECINI DATE,
    FECFIN DATE,
    DETALLE CHAR(1))
RETURNS (
    CODVEND INTEGER,
    NOMVEND VARCHAR(60),
    NIT VARCHAR(20),
    CLIENTE VARCHAR(60),
    NOMTIPO VARCHAR(8),
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(6),
    FECDOC DATE,
    PREFREC VARCHAR(4),
    NUMREC VARCHAR(6),
    FECREC DATE,
    DIAS INTEGER,
    ABONO NUMERIC(18,2),
    BASE NUMERIC(18,2),
    COMIMONTO NUMERIC(18,2),
    COMIPORC NUMERIC(9,2),
    ARTICULO VARCHAR(20),
    CODGRP VARCHAR(2),
    CANT NUMERIC(18,4))
AS
DECLARE VARIABLE TIPO INTEGER;
DECLARE VARIABLE ID INTEGER;
DECLARE VARIABLE IVAMONTO NUMERIC(18,2);
DECLARE VARIABLE TOTAL NUMERIC(18,2);
DECLARE VARIABLE SITOT CHAR(2);
DECLARE VARIABLE VENTA CHAR(2);
DECLARE VARIABLE COMIV NUMERIC(18,2);
DECLARE VARIABLE PORCV NUMERIC(18,2);
DECLARE VARIABLE CONSUMO NUMERIC(18,2);
declare variable ALFINAL CHAR(2);
declare variable SALDO NUMERIC(18,2);
declare variable COMISION VARCHAR(10);
declare variable porcaux NUMERIC(9,2);
declare variable BASEAUX DOUBLE PRECISION;
declare variable SUCURSAL VARCHAR(20);
BEGIN
EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION', 'VENDEDORES', 'COMISIONES EN VENTA INCLUYENDO IMPUESTOS') returning_values (:SITOT);
EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA','COMISIONES','COMISION POR COBRO PAGADERA SOLO EN EL COBRO TOTAL') returning_values (:ALFINAL);
execute procedure lee_configuracion('CARTERA','COMISIONES','COMISION POR COBRO COMO PORCENTAJE DE LA COMISION VENTA') returning_values (:venta);
EXECUTE PROCEDURE lee_configuracion('CARTERA', 'COMISIONES', 'LIQUIDAR COMISION COBRO CON COBRADOR DEL DOCUMENTO O DEL RECIBO') returning_values (:COMISION);
FOR SELECT RCDE_TIPODOC, RCDE_IDDOC, RCDE_PREFIJO, RCDE_NUMERO, R.TERC_NIT, TERC_NOM, RECA_FECHA, (RCDE_ABONO+RCDE_RTFTE+RCDE_RTIVA+RCDE_RTICA), PREF_PRE, RECA_NUMERO, COBR_COD
    FROM RECIBOS_CAJA R, RECIBOS_CAJA_DETALLE RD, TERCEROS T
    WHERE R.RECA_ID = RD.RECA_ID AND RECA_FECHA >= :FECINI AND RECA_FECHA <= :FECFIN AND R.TERC_NIT = T.TERC_NIT AND RECA_ANULADO = 'N'
    ORDER BY TERC_NIT, RECA_FECHA
    INTO :TIPO, :ID, :PREFIJO, :NUMERO, :NIT, :CLIENTE, :FECREC, :ABONO, :PREFREC, :NUMREC, :codvend
    DO
    BEGIN
    SELECT TIDO_NOMCORTO FROM TIPO_DOCUMENTO WHERE TIDO_COD = :TIPO INTO :NOMTIPO;
    if (COMISION = 'DOCUMENTO') then
        SELECT MVCL_FECHA, COBR_COD FROM MOVIMIENTO_CLIENTES WHERE MVCL_TIPOREF = :TIPO AND MVCL_IDREF = :ID
            INTO :FECDOC, :codvend;
    else
        SELECT MVCL_FECHA FROM MOVIMIENTO_CLIENTES WHERE MVCL_TIPOREF = :TIPO AND MVCL_IDREF = :ID
            INTO :FECDOC;
    if (FECDOC IS NOT NULL) then
        DIAS = FECREC - FECDOC;
    ELSE
        DIAS = 999;
    if ((codvend >= :DESDE) AND (codvend <= :hasta)) then
        BEGIN
        /* TRAIGA EL PORCENTAJE DE ACUERDO A LOS DIAS */
        COMIPORC = 0;
        SELECT CMCB_PORC FROM COMISION_COBRO WHERE CMCB_DIASINI <= :dias AND CMCB_DIASFIN >= :DIAS AND COBR_COD = :CODVEND INTO :COMIPORC;
        if (COMIPORC IS NULL) THEN
            COMIPORC = 0;
        if (VENTA = 'NO') then
            BEGIN
            if (TIPO = 31) then
                BEGIN
                if (DETALLE = 'N') then
                    SELECT MAX(FACT_TOTAL), MAX(FACT_IVAMONTO), SUM(FADE_CONSUMO) FROM FACTURAS F, FACTURAS_DETALLE D
                        WHERE F.FACT_ID = D.FACT_ID AND F.FACT_ID = :ID INTO :TOTAL, :IVAMONTO, :CONSUMO;
                ELSE
                    FOR SELECT D.ARTI_COD, FADE_CANT, FADE_TOTAL, FADE_IVAMONTO, FADE_CONSUMO, GRUP_COD
                        FROM FACTURAS F, FACTURAS_DETALLE D, ARTICULO A
                        WHERE F.FACT_ID = D.FACT_ID AND D.arti_cod = A.arti_cod AND F.FACT_ID = :ID
                        INTO :ARTICULO, :CANT, :TOTAL, :IVAMONTO, :CONSUMO, :CODGRP
                        DO
                        BEGIN
                        if (SITOT = 'SI') then
                            BASEAUX = TOTAL;
                        ELSE
                            BASEAUX = (TOTAL - IVAMONTO - CONSUMO);
                        BASE = BASEAUX;
                        COMIMONTO = BASE / 100 * COMIPORC;
                        SUSPEND;
                        END
                END
            if (TIPO = 33) then
                if (DETALLE = 'N') then
                    SELECT MAX(DEVT_TOTAL*-1), MAX(DEVT_IVAMONTO*-1), SUM(DVDE_CONSUMO) FROM DEVOLUCIONES_VENTAS V, DEVOLUCIONES_VENTAS_DETALLE D
                        WHERE V.DEVT_ID = D.DEVT_ID AND V.DEVT_ID = :ID INTO :TOTAL, :IVAMONTO, :CONSUMO;
                ELSE
                    FOR SELECT D.ARTI_COD, DVDE_CANT, DVDE_TOTAL*-1, DVDE_IVAMONTO*-1, DVDE_CONSUMO*-1, GRUP_COD
                        FROM DEVOLUCIONES_VENTAS V, DEVOLUCIONES_VENTAS_DETALLE D, ARTICULO A
                        WHERE V.DEVT_ID = D.DEVT_ID AND D.arti_cod = A.arti_cod AND V.DEVT_ID = :ID
                        INTO :ARTICULO, :CANT, :TOTAL, :IVAMONTO, :CONSUMO, :codgrp
                        DO
                        BEGIN
                        if (SITOT = 'SI') then
                            BASEAUX = TOTAL;
                        ELSE
                            BASEAUX = TOTAL - IVAMONTO - CONSUMO;
                        BASE = BASEAUX;
                        COMIMONTO = BASE / 100 * COMIPORC;
                        SUSPEND;
                        END
            if (TIPO = 41) then
                SELECT NDCL_MONTO, NDCL_IVAMONTO, 0 FROM NOTAS_DEBITO_CLIENTES WHERE NDCL_ID = :ID INTO :TOTAL, :IVAMONTO, :CONSUMO;
            if (TIPO = 42) then
                SELECT NCCL_MONTO*-1, NCCL_IVAMONTO*-1, 0 FROM NOTAS_CREDITO_CLIENTES WHERE NCCL_ID = :ID INTO :TOTAL, :IVAMONTO, :CONSUMO;
            if (TIPO = 77) then
                SELECT DVCH_MONTO, 0, 0 FROM DEVOLUCION_CHEQUES WHERE DVCH_ID = :ID INTO :TOTAL, :IVAMONTO, :CONSUMO;
            if (SITOT = 'SI') then
                BASEAUX = ABONO;
            ELSE
                if ((TOTAL - IVAMONTO - CONSUMO) <> 0) then
                    BASEAUX = (ABONO / TOTAL) * (TOTAL - IVAMONTO - CONSUMO);
                ELSE
                    BASEAUX = 0;
            BASE = BASEAUX;
            COMIMONTO = BASE / 100 * COMIPORC;
            END
        ELSE
            BEGIN
            if (TIPO = 31) then
                if (DETALLE = 'N') then
                    SELECT MAX(FACT_TOTAL), MAX(FACT_IVAMONTO), MAX(FACT_COMIPORC), SUM(FADE_CONSUMO)
                        FROM FACTURAS F, FACTURAS_DETALLE D WHERE F.FACT_ID = D.FACT_ID AND F.FACT_ID = :ID
                        INTO :TOTAL, :IVAMONTO, :PORCV, :CONSUMO;
                ELSE
                    FOR SELECT D.ARTI_COD, FADE_CANT, FADE_TOTAL, FADE_IVAMONTO, FADE_CONSUMO, FACT_COMIPORC, GRUP_COD
                        FROM FACTURAS F, FACTURAS_DETALLE D, ARTICULO A
                        WHERE F.FACT_ID = D.FACT_ID AND D.arti_cod = A.arti_cod AND F.FACT_ID = :ID
                        INTO :ARTICULO, :CANT, :TOTAL, :IVAMONTO, :CONSUMO, :porcv, :codgrp
                        DO
                        BEGIN
                        if (SITOT = 'SI') then
                            BASEAUX = TOTAL;
                        ELSE
                            BASEAUX = (TOTAL - IVAMONTO - CONSUMO);
                        COMIV = PORCV / 100 * BASEAUX;
                        COMIMONTO = COMIV / 100 * COMIPORC;
                        porcaux = comiporc;
                        comiporc = PORCV / 100 * COMIPORC;
                        BASE = BASEAUX;
                        SUSPEND;
                        END
            if (TIPO = 33) then
                if (DETALLE = 'N') then
                    SELECT MAX(DEVT_TOTAL), MAX(DEVT_IVAMONTO), MAX(DEVT_COMIPORC), SUM(DVDE_CONSUMO)
                        FROM DEVOLUCIONES_VENTAS V, DEVOLUCIONES_VENTAS_DETALLE D WHERE V.DEVT_ID = D.DEVT_ID AND D.DEVT_ID = :ID
                        INTO :TOTAL, :IVAMONTO, :PORCV, :CONSUMO;
                ELSE
                    FOR SELECT D.ARTI_COD, DVDE_CANT, DVDE_TOTAL*-1, DVDE_IVAMONTO*-1, DVDE_CONSUMO*-1, DEVT_COMIPORC, GRUP_COD
                        FROM DEVOLUCIONES_VENTAS V, DEVOLUCIONES_VENTAS_DETALLE D, ARTICULO A
                        WHERE V.DEVT_ID = D.DEVT_ID AND D.arti_cod = A.arti_cod AND V.DEVT_ID = :ID
                        INTO :ARTICULO, :CANT, :TOTAL, :IVAMONTO, :CONSUMO, :porcv, :codgrp
                        DO
                        BEGIN
                        if (SITOT = 'SI') then
                            BASEAUX = TOTAL;
                        ELSE
                            BASEAUX = (TOTAL - IVAMONTO - CONSUMO);
                        COMIV = PORCV / 100 * BASEAUX;
                        COMIMONTO = COMIV / 100 * COMIPORC;
                        porcaux = comiporc;
                        comiporc = PORCV / 100 * COMIPORC;
                        BASE = BASEAUX;
                        SUSPEND;
                        END
            if (TIPO = 41) then
                SELECT NDCL_MONTO, NDCL_IVAMONTO, NDCL_COMIPORC, 0 FROM NOTAS_DEBITO_CLIENTES
                    WHERE NDCL_ID = :ID INTO :TOTAL, :IVAMONTO, :PORCV, :CONSUMO;
            if (TIPO = 42) then
                SELECT NCCL_MONTO, NCCL_IVAMONTO, NCCL_COMIPORC, 0  FROM NOTAS_CREDITO_CLIENTES
                    WHERE NCCL_ID = :ID INTO :TOTAL, :IVAMONTO, :PORCV, :CONSUMO;
            if (TIPO = 77) then
                SELECT DVCH_MONTO, 0, 0, 0 FROM DEVOLUCION_CHEQUES WHERE DVCH_ID = :ID INTO :TOTAL, :IVAMONTO, :PORCV, :CONSUMO;
            if (SITOT = 'SI') then
                BASEAUX = ABONO;
            ELSE
                if ((total <> 0) AND (ABONO <> 0)) then
                    BASEAUX = (TOTAL - IVAMONTO - CONSUMO) / TOTAL * ABONO;
                ELSE
                    BASEAUX = 0;
            COMIV = PORCV / 100 * BASEAUX;
            COMIMONTO = COMIV / 100 * COMIPORC;
            porcaux = comiporc;
            comiporc = PORCV / 100 * COMIPORC;
            BASE = BASEAUX;
            END
        select COBR_NOM from COBRADORES where COBR_COD = :codvend INTO :nomvend;
        if (DETALLE = 'N') then
            if (ALFINAL = 'SI') then
                BEGIN
                /* VERIFIQUE EL SALDO DEL DOCUMENTO, SI ES CERO LIQUIDE COMISION SOBRE EL TOTAL */
                EXECUTE PROCEDURE saldo_doc_cartera(:tipo, :ID, :FECREC, 0) returning_values (:SALDO);
                if (SALDO = 0) then
                    BEGIN
                    if (VENTA = 'NO') then
                        begin
                        if (SITOT = 'SI') then
                            BASEAUX = TOTAL;
                        ELSE
                            BASEAUX = TOTAL - IVAMONTO - CONSUMO;
                        COMIMONTO = BASEAUX * COMIPORC / 100;
                        end
                    ELSE
                        BEGIN
                        if (SITOT = 'SI') then
                            BASEAUX = TOTAL;
                        ELSE
                            BASEAUX = TOTAL - IVAMONTO - CONSUMO;
                        COMIV = PORCV * BASEAUX / 100;
                        COMIMONTO = COMIV / 100 * porcaux;
                        comiporc = PORCV / 100 * porcaux;
                        END
                    BASE = BASEAUX;
                    SUSPEND;
                    END
                END
            ELSE
                SUSPEND;
        ELSE
            if ((TIPO <> 31) AND (TIPO <> 33)) then
                SUSPEND;
        END
    END
FOR SELECT EGCC_TIPODOC, EGCC_IDDOC, EGCC_PREFIJO, EGCC_NUMERO, E.TERC_NIT, TERC_NOM, EGRE_FECHA, (EGCC_ABONO+EGCC_RTFTE+EGCC_RTIVA+EGCC_RTICA), PREF_PRE, EGRE_NUMERO, EGCC_SUCURSAL
    FROM EGRESOS E, EGRESOS_CRUCEC C, TERCEROS T
    WHERE E.EGRE_ID = C.EGRE_ID AND EGRE_FECHA >= :FECINI AND EGRE_FECHA <= :FECFIN AND E.TERC_NIT = T.TERC_NIT AND EGRE_ANULADO = 'N'
    ORDER BY TERC_NIT, EGRE_FECHA
    INTO :TIPO, :ID, :PREFIJO, :NUMERO, :NIT, :CLIENTE, :FECREC, :ABONO, :PREFREC, :NUMREC, :SUCURSAL
    DO
    BEGIN
    SELECT COBR_COD FROM cliente_sucursales WHERE TERC_NIT = :NIT AND CLCU_COD = :sucursal INTO :codvend;
    SELECT TIDO_NOMCORTO FROM TIPO_DOCUMENTO WHERE TIDO_COD = :TIPO INTO :NOMTIPO;
    if (COMISION = 'DOCUMENTO') then
        SELECT MVCL_FECHA, COBR_COD FROM MOVIMIENTO_CLIENTES WHERE MVCL_TIPOREF = :TIPO AND MVCL_IDREF = :ID
            INTO :FECDOC, :codvend;
    else
        SELECT MVCL_FECHA FROM MOVIMIENTO_CLIENTES WHERE MVCL_TIPOREF = :TIPO AND MVCL_IDREF = :ID
            INTO :FECDOC;
    if (FECDOC IS NOT NULL) then
        DIAS = FECREC - FECDOC;
    ELSE
        DIAS = 999;
    if ((codvend >= :DESDE) AND (codvend <= :hasta)) then
        BEGIN
        /* TRAIGA EL PORCENTAJE DE ACUERDO A LOS DIAS */
        COMIPORC = 0;
        SELECT CMCB_PORC FROM COMISION_COBRO WHERE CMCB_DIASINI <= :dias AND CMCB_DIASFIN >= :DIAS AND COBR_COD = :CODVEND INTO :COMIPORC;
        if (COMIPORC IS NULL) THEN
            COMIPORC = 0;
        if (VENTA = 'NO') then
            BEGIN
            if (TIPO = 31) then
                BEGIN
                if (DETALLE = 'N') then
                    SELECT MAX(FACT_TOTAL), MAX(FACT_IVAMONTO), SUM(FADE_CONSUMO) FROM FACTURAS F, FACTURAS_DETALLE D
                        WHERE F.FACT_ID = D.FACT_ID AND F.FACT_ID = :ID INTO :TOTAL, :IVAMONTO, :CONSUMO;
                ELSE
                    FOR SELECT D.ARTI_COD, FADE_CANT, FADE_TOTAL, FADE_IVAMONTO, FADE_CONSUMO, GRUP_COD
                        FROM FACTURAS F, FACTURAS_DETALLE D, ARTICULO A
                        WHERE F.FACT_ID = D.FACT_ID AND D.arti_cod = A.arti_cod AND F.FACT_ID = :ID
                        INTO :ARTICULO, :CANT, :TOTAL, :IVAMONTO, :CONSUMO, :CODGRP
                        DO
                        BEGIN
                        if (SITOT = 'SI') then
                            BASEAUX = TOTAL;
                        ELSE
                            BASEAUX = (TOTAL - IVAMONTO - CONSUMO);
                        BASE = BASEAUX;
                        COMIMONTO = BASE / 100 * COMIPORC;
                        SUSPEND;
                        END
                END
            if (TIPO = 33) then
                if (DETALLE = 'N') then
                    SELECT MAX(DEVT_TOTAL*-1), MAX(DEVT_IVAMONTO*-1), SUM(DVDE_CONSUMO) FROM DEVOLUCIONES_VENTAS V, DEVOLUCIONES_VENTAS_DETALLE D
                        WHERE V.DEVT_ID = D.DEVT_ID AND V.DEVT_ID = :ID INTO :TOTAL, :IVAMONTO, :CONSUMO;
                ELSE
                    FOR SELECT D.ARTI_COD, DVDE_CANT, DVDE_TOTAL*-1, DVDE_IVAMONTO*-1, DVDE_CONSUMO*-1, GRUP_COD
                        FROM DEVOLUCIONES_VENTAS V, DEVOLUCIONES_VENTAS_DETALLE D, ARTICULO A
                        WHERE V.DEVT_ID = D.DEVT_ID AND D.arti_cod = A.arti_cod AND V.DEVT_ID = :ID
                        INTO :ARTICULO, :CANT, :TOTAL, :IVAMONTO, :CONSUMO, :codgrp
                        DO
                        BEGIN
                        if (SITOT = 'SI') then
                            BASEAUX = TOTAL;
                        ELSE
                            BASEAUX = TOTAL - IVAMONTO - CONSUMO;
                        BASE = BASEAUX;
                        COMIMONTO = BASE / 100 * COMIPORC;
                        SUSPEND;
                        END
            if (TIPO = 41) then
                SELECT NDCL_MONTO, NDCL_IVAMONTO, 0 FROM NOTAS_DEBITO_CLIENTES WHERE NDCL_ID = :ID INTO :TOTAL, :IVAMONTO, :CONSUMO;
            if (TIPO = 42) then
                SELECT NCCL_MONTO*-1, NCCL_IVAMONTO*-1, 0 FROM NOTAS_CREDITO_CLIENTES WHERE NCCL_ID = :ID INTO :TOTAL, :IVAMONTO, :CONSUMO;
            if (TIPO = 77) then
                SELECT DVCH_MONTO, 0, 0 FROM DEVOLUCION_CHEQUES WHERE DVCH_ID = :ID INTO :TOTAL, :IVAMONTO, :CONSUMO;
            if (SITOT = 'SI') then
                BASEAUX = ABONO;
            ELSE
                if ((TOTAL - IVAMONTO - CONSUMO) <> 0) then
                    BASEAUX = (ABONO / TOTAL) * (TOTAL - IVAMONTO - CONSUMO);
                ELSE
                    BASEAUX = 0;
            BASE = BASEAUX;
            COMIMONTO = BASE / 100 * COMIPORC;
            END
        ELSE
            BEGIN
            if (TIPO = 31) then
                if (DETALLE = 'N') then
                    SELECT MAX(FACT_TOTAL), MAX(FACT_IVAMONTO), MAX(FACT_COMIPORC), SUM(FADE_CONSUMO)
                        FROM FACTURAS F, FACTURAS_DETALLE D WHERE F.FACT_ID = D.FACT_ID AND F.FACT_ID = :ID
                        INTO :TOTAL, :IVAMONTO, :PORCV, :CONSUMO;
                ELSE
                    FOR SELECT D.ARTI_COD, FADE_CANT, FADE_TOTAL, FADE_IVAMONTO, FADE_CONSUMO, FACT_COMIPORC, GRUP_COD
                        FROM FACTURAS F, FACTURAS_DETALLE D, ARTICULO A
                        WHERE F.FACT_ID = D.FACT_ID AND D.arti_cod = A.arti_cod AND F.FACT_ID = :ID
                        INTO :ARTICULO, :CANT, :TOTAL, :IVAMONTO, :CONSUMO, :porcv, :codgrp
                        DO
                        BEGIN
                        if (SITOT = 'SI') then
                            BASEAUX = TOTAL;
                        ELSE
                            BASEAUX = (TOTAL - IVAMONTO - CONSUMO);
                        COMIV = PORCV / 100 * BASEAUX;
                        COMIMONTO = COMIV / 100 * COMIPORC;
                        porcaux = comiporc;
                        comiporc = PORCV / 100 * COMIPORC;
                        BASE = BASEAUX;
                        SUSPEND;
                        END
            if (TIPO = 33) then
                if (DETALLE = 'N') then
                    SELECT MAX(DEVT_TOTAL), MAX(DEVT_IVAMONTO), MAX(DEVT_COMIPORC), SUM(DVDE_CONSUMO)
                        FROM DEVOLUCIONES_VENTAS V, DEVOLUCIONES_VENTAS_DETALLE D WHERE V.DEVT_ID = D.DEVT_ID AND D.DEVT_ID = :ID
                        INTO :TOTAL, :IVAMONTO, :PORCV, :CONSUMO;
                ELSE
                    FOR SELECT D.ARTI_COD, DVDE_CANT, DVDE_TOTAL*-1, DVDE_IVAMONTO*-1, DVDE_CONSUMO*-1, DEVT_COMIPORC, GRUP_COD
                        FROM DEVOLUCIONES_VENTAS V, DEVOLUCIONES_VENTAS_DETALLE D, ARTICULO A
                        WHERE V.DEVT_ID = D.DEVT_ID AND D.arti_cod = A.arti_cod AND V.DEVT_ID = :ID
                        INTO :ARTICULO, :CANT, :TOTAL, :IVAMONTO, :CONSUMO, :porcv, :codgrp
                        DO
                        BEGIN
                        if (SITOT = 'SI') then
                            BASEAUX = TOTAL;
                        ELSE
                            BASEAUX = (TOTAL - IVAMONTO - CONSUMO);
                        COMIV = PORCV / 100 * BASEAUX;
                        COMIMONTO = COMIV / 100 * COMIPORC;
                        porcaux = comiporc;
                        comiporc = PORCV / 100 * COMIPORC;
                        BASE = BASEAUX;
                        SUSPEND;
                        END
            if (TIPO = 41) then
                SELECT NDCL_MONTO, NDCL_IVAMONTO, NDCL_COMIPORC, 0 FROM NOTAS_DEBITO_CLIENTES
                    WHERE NDCL_ID = :ID INTO :TOTAL, :IVAMONTO, :PORCV, :CONSUMO;
            if (TIPO = 42) then
                SELECT NCCL_MONTO, NCCL_IVAMONTO, NCCL_COMIPORC, 0  FROM NOTAS_CREDITO_CLIENTES
                    WHERE NCCL_ID = :ID INTO :TOTAL, :IVAMONTO, :PORCV, :CONSUMO;
            if (TIPO = 77) then
                SELECT DVCH_MONTO, 0, 0, 0 FROM DEVOLUCION_CHEQUES WHERE DVCH_ID = :ID INTO :TOTAL, :IVAMONTO, :PORCV, :CONSUMO;
            if (SITOT = 'SI') then
                BASEAUX = ABONO;
            ELSE
                if ((total <> 0) AND (ABONO <> 0)) then
                    BASEAUX = (TOTAL - IVAMONTO - CONSUMO) / TOTAL * ABONO;
                ELSE
                    BASEAUX = 0;
            COMIV = PORCV / 100 * BASEAUX;
            COMIMONTO = COMIV / 100 * COMIPORC;
            porcaux = comiporc;
            comiporc = PORCV / 100 * COMIPORC;
            BASE = BASEAUX;
            END
        select COBR_NOM from COBRADORES where COBR_COD = :codvend INTO :nomvend;
        if (DETALLE = 'N') then
            if (ALFINAL = 'SI') then
                BEGIN
                /* VERIFIQUE EL SALDO DEL DOCUMENTO, SI ES CERO LIQUIDE COMISION SOBRE EL TOTAL */
                EXECUTE PROCEDURE saldo_doc_cartera(:tipo, :ID, :FECREC, 0) returning_values (:SALDO);
                if (SALDO = 0) then
                    BEGIN
                    if (VENTA = 'NO') then
                        begin
                        if (SITOT = 'SI') then
                            BASEAUX = TOTAL;
                        ELSE
                            BASEAUX = TOTAL - IVAMONTO - CONSUMO;
                        COMIMONTO = BASEAUX * COMIPORC / 100;
                        end
                    ELSE
                        BEGIN
                        if (SITOT = 'SI') then
                            BASEAUX = TOTAL;
                        ELSE
                            BASEAUX = TOTAL - IVAMONTO - CONSUMO;
                        COMIV = PORCV * BASEAUX / 100;
                        COMIMONTO = COMIV / 100 * porcaux;
                        comiporc = PORCV / 100 * porcaux;
                        END
                    BASE = BASEAUX;
                    SUSPEND;
                    END
                END
            ELSE
                SUSPEND;
        ELSE
            if ((TIPO <> 31) AND (TIPO <> 33)) then
                SUSPEND;
        END
    END
FOR SELECT 'DEVOCHEQ', DVCH_MONTO*-1, DVCH_FECHA, PRBA_PREF, DVCH_NUMDOC, DVCH_FECHA, D.TERC_NIT, DVCH_NOMTERC, '', '', D.COBR_COD
    FROM DEVOLUCION_CHEQUES D, CLIENTES C
    WHERE DVCH_FECHA >= :FECINI AND DVCH_FECHA <= :FECFIN AND D.TERC_NIT = C.TERC_NIT AND D.COBR_COD = :CODVEND
    INTO :NOMTIPO, :BASE, :FECDOC, :PREFIJO, :NUMERO, :FECREC, :NIT, :CLIENTE, :PREFREC, :NUMREC, :codvend
    DO
    BEGIN
    COMIPORC = 0;
    COMIMONTO = 0;
    if ((codvend >= :DESDE) AND (codvend <= :hasta)) then
        BEGIN
        select COBR_NOM from COBRADORES where COBR_COD = :codvend INTO :nomvend;
        /* SELECT CMCB_PORC FROM COMISION_COBRO WHERE CMCB_DIASINI <= 1 AND CMCB_DIASFIN >= 1 AND COBR_COD = :CODVEND INTO :COMIPORC;
        if (COMIPORC IS NULL) THEN
            COMIPORC = 0;
        COMIMONTO = BASE * COMIPORC / 100; */
        SUSPEND;
        END
    END
SUSPEND;
END

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE CONCILIA_CARTERA(
    FECINI DATE,
    FECFIN DATE,
    CTACART VARCHAR(20),
    SUBEMPRESA INTEGER,
    ANTERIOR CHAR(1))
RETURNS (
    NIT VARCHAR(20),
    NOMBRE VARCHAR(60),
    INICIAL NUMERIC(18,2),
    INICIALC NUMERIC(18,2),
    DEBITOS NUMERIC(18,2),
    DEBITOSC NUMERIC(18,2),
    CREDITOS NUMERIC(18,2),
    CREDITOSC NUMERIC(18,2),
    SALDO NUMERIC(18,2),
    SALDOC NUMERIC(18,2),
    DIFERENCIA NUMERIC(18,2))
AS
declare variable ANO CHAR(4);
declare variable MES INTEGER;
declare variable NUMROWS INTEGER;
declare variable ABONOS NUMERIC(18,2);
declare variable TIPODOC INTEGER;
declare variable IDDOC INTEGER;
declare variable RETES CHAR(2);
begin
ano = EXTRACT(YEAR FROM FECFIN);
mes = EXTRACT(MONTH FROM FECFIN);

for select TERC_NIT, TERC_NOM from TERCEROS WHERE TERC_CLIE = 'S' into :NIT, :NOMBRE
    DO
    BEGIN
    /* OMITE LOS CLIENTES DE CONTADO */
    SELECT COUNT(*) FROM AUTORIZACIONES WHERE AUTO_NITCONTADO = :NIT INTO :numrows;
    IF (numrows = 0) THEN
        BEGIN
        FECINI = FECINI - 1;
        INICIAL = 0;
        FOR SELECT MVCL_TIPOREF, MVCL_IDREF FROM MOVIMIENTO_CLIENTES
            WHERE TERC_NIT = :NIT AND MVCL_FECHA <= :FECINI AND
            MVCL_ABONO = 'N' AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA))
            INTO :TIPODOC, :IDDOC
            DO
            BEGIN
            EXECUTE PROCEDURE saldo_doc_cartera(TIPODOC, IDDOC, FECINI, 0) returning_values (SALDO);
            INICIAL = INICIAL + SALDO;
            END
        EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'DESCONTAR RETENCIONES POR CAUSACION') returning_values(:RETES);
        FECINI = FECINI + 1;
        if (RETES = 'SI') then
            BEGIN
            SELECT SUM(MVCL_MONTO-MVCL_RTEFTE-MVCL_RTEIVA-MVCL_RTEICA) FROM movimiento_clientes
                WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND MVCL_FECHA < :FECFIN
                AND MVCL_DEBITO = 'S' AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA))
                INTO :DEBITOS;
            SELECT SUM(MVCL_MONTO-MVCL_RTEFTE-MVCL_RTEIVA-MVCL_RTEICA) FROM movimiento_clientes
                WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND MVCL_FECHA < :FECFIN
                AND MVCL_DEBITO = 'N' AND MVCL_ABONO = 'N' and MVCL_TIPOREF <> 45 AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA))
                INTO :CREDITOS;
            SELECT SUM(MVCL_MONTO) FROM movimiento_clientes
                WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND MVCL_FECHA < :FECFIN
                AND MVCL_ABONO = 'S' AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA))
                INTO :ABONOS;
            END
        ELSE
            BEGIN
            SELECT SUM(MVCL_MONTO) FROM movimiento_clientes
                WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND MVCL_FECHA < :FECFIN
                AND MVCL_DEBITO = 'S' AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA))
                INTO :DEBITOS;
            SELECT SUM(MVCL_MONTO) FROM movimiento_clientes
                WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND MVCL_FECHA < :FECFIN
                AND MVCL_DEBITO = 'N' AND MVCL_ABONO = 'N' and MVCL_TIPOREF <> 45 AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA))
                INTO :CREDITOS;
            SELECT SUM(MVCL_MONTO+MVCL_RTEFTE+MVCL_RTEIVA+MVCL_RTEICA) FROM movimiento_clientes
                WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND MVCL_FECHA < :FECFIN
                AND MVCL_ABONO = 'S' AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA))
                INTO :ABONOS;
            END
        if (DEBITOS IS NULL) then
            DEBITOS = 0;
        if (CREDITOS IS NULL) then
            CREDITOS = 0;
        if (ABONOS IS NULL) then
            ABONOS = 0;
        CREDITOS = CREDITOS + ABONOS;
        SALDO = INICIAL + DEBITOS - CREDITOS;

        /* LO CONTABLE */
        EXECUTE PROCEDURE SALDO_TERCERO_MES(ctacart, NIT, ANO, MES, 'S') RETURNING_VALUES (INICIALC);
        EXECUTE PROCEDURE MOVIMIENTO_TERCERO_MES(ctacart, NIT, ANO, MES, 'S') RETURNING_VALUES(DEBITOSC);
        EXECUTE PROCEDURE MOVIMIENTO_TERCERO_MES(ctacart, NIT, ANO, MES, 'N') RETURNING_VALUES(CREDITOSC);
        SALDOC = INICIALC + DEBITOSC - CREDITOSC;
        diferencia = SALDO - SALDOC;
        if (DIFERENCIA <> 0) then
            BEGIN
            if (ANTERIOR <> 'S') then
                SUSPEND;
            ELSE
                BEGIN
                if (DIFERENCIA <> (INICIAL - INICIALC)) then
                    SUSPEND;
                END
            END
        END
    END
SUSPEND;
end

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE IMPR_APLICLIE(
    ID INTEGER)
RETURNS (
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    CONCEPTO VARCHAR(60),
    NIT VARCHAR(20),
    NOMBRE VARCHAR(60),
    DIR VARCHAR(60),
    CIU VARCHAR(40),
    TEL VARCHAR(40),
    CONTACTO VARCHAR(60),
    FAX VARCHAR(25),
    CEL VARCHAR(25),
    EMAIL VARCHAR(100),
    ITEM INTEGER,
    TIPODOC VARCHAR(8),
    PREFDOC VARCHAR(4),
    NUMDOC VARCHAR(6),
    ABONO NUMERIC(18,2),
    RTFTEMONTO NUMERIC(18,2),
    RTIVAMONTO NUMERIC(18,2),
    RTICAMONTO NUMERIC(18,2),
    SALDODOC NUMERIC(18,2),
    ANTERDOC NUMERIC(18,2),
    OBS BLOB SUB_TYPE 1 SEGMENT SIZE 80,
    CLIE_COD VARCHAR(15),
    COBR_COD INTEGER,
    COBR_NOM VARCHAR(60))
AS
declare variable TIPO INTEGER;
declare variable IDDOC INTEGER;
BEGIN
  FOR SELECT PREF_PRE, APCL_NUMERO, APCL_FECHA, APCL_CONCEPTO, P.TERC_NIT, TERC_NOM, TERC_DIR, TERC_CIU, TERC_TEL, TERC_CONTACTO, TERC_FAX, TERC_CEL, TERC_EMAIL,
    ACDE_ITEM, ACDE_TIPODOC, ACDE_IDDOC, TIDO_NOMCORTO, ACDE_PREFIJO, ACDE_NUMERO, ACDE_APLICADO,
    ACDE_RTFTE, ACDE_RTIVA, ACDE_RTICA, APCL_OBS, CLIE_COD, P.COBR_COD, COBR_NOM
    FROM APLICACION_CLIENTE P, APLICACION_CLIENTE_DETALLE PD, TERCEROS T, CLIENTES C, TIPO_DOCUMENTO TD, COBRADORES CO
    WHERE P.TERC_NIT = T.TERC_NIT AND T.TERC_NIT = C.TERC_NIT AND P.APCL_ID = PD.APCL_ID AND P.APCL_ID = :ID AND ACDE_TIPODOC = TD.TIDO_COD AND P.COBR_COD = CO.COBR_COD
    ORDER BY ACDE_ITEM
    INTO :PREFIJO, :NUMERO, :FECHA, :CONCEPTO, :NIT, :NOMBRE, :DIR, :CIU, :TEL, :CONTACTO, :FAX, :CEL, :EMAIL, :ITEM, :TIPO, :IDDOC, :TIPODOC, :PREFDOC, :NUMDOC, :ABONO, :RTFTEMONTO, :RTIVAMONTO, :RTICAMONTO, :OBS, :CLIE_COD, :COBR_COD, :COBR_NOM
    DO
        begin
        EXECUTE PROCEDURE SALDO_DOC_CARTERA(:TIPO, :IDDOC, :FECHA, 0) returning_values (:SALDODOC);
        if (SALDODOC IS NULL) then
            SALDODOC = 0;
        ANTERDOC = SALDODOC + rtftemonto + rtivamonto + rticamonto + abono;
        if (anterdoc IS NULL) then
            ANTERDOC = 0;
        SUSPEND;
        end
SUSPEND;
END

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE IMPR_RECICAJA(
    ID INTEGER)
RETURNS (
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    NOMCAJA VARCHAR(60),
    CODCOBR INTEGER,
    NOMCOBR VARCHAR(60),
    NIT VARCHAR(20),
    NOMBRE VARCHAR(60),
    DIR VARCHAR(60),
    CIU VARCHAR(40),
    TEL VARCHAR(40),
    CONCEPTO VARCHAR(60),
    MONTO NUMERIC(18,2),
    RTFTE NUMERIC(18,2),
    RTIVA NUMERIC(18,2),
    RTICA NUMERIC(18,2),
    DSCTO NUMERIC(18,2),
    OBS BLOB SUB_TYPE 1 SEGMENT SIZE 80,
    ITEMDOC INTEGER,
    TIPODOC VARCHAR(8),
    PREFDOC VARCHAR(4),
    NUMDOC VARCHAR(6),
    SUCURSAL VARCHAR(10),
    ABONODOC NUMERIC(18,2),
    RTFTEDOC NUMERIC(18,2),
    RTIVADOC NUMERIC(18,2),
    RTICADOC NUMERIC(18,2),
    DSCTODOC NUMERIC(18,2),
    SALDODOC NUMERIC(18,2),
    ANTERDOC NUMERIC(18,2))
AS
declare variable NUMROWS INTEGER;
declare variable TIPO integer;
declare variable IDDOC INTEGER;
BEGIN
  SELECT PREF_PRE, RECA_NUMERO, RECA_FECHA, CAJA_NOMBRE, RECA_CONC, R.COBR_COD,
        R.TERC_NIT, RECA_NOMTERC, TERC_DIR, TERC_CIU, TERC_TEL,
        RECA_MONTO, RECA_RTFTEMONTO, RECA_RTIVAMONTO, RECA_RTICAMONTO, RECA_DTOF,
        RECA_OBS
  FROM RECIBOS_CAJA R, TERCEROS T, CAJAS C
  WHERE R.TERC_NIT = T.TERC_NIT AND R.CAJA_ID = C.CAJA_ID AND
        R.RECA_ID = :ID
  INTO :PREFIJO, :NUMERO, :FECHA, :NOMCAJA, :CONCEPTO, :CODCOBR,
        :NIT, :NOMBRE, :DIR, :CIU, :TEL,
        :MONTO, :RTFTE, :RTIVA, :RTICA, :DSCTO,
        :OBS;
  SELECT COBR_NOM FROM COBRADORES WHERE COBR_COD = :CODCOBR INTO :NOMCOBR;
  SELECT COUNT(RCDE_ITEM) FROM RECIBOS_CAJA_DETALLE
    WHERE RECA_ID = :ID INTO :NUMROWS;
  if (NUMROWS > 0) then
    FOR SELECT RCDE_ITEM, RCDE_TIPODOC, RCDE_IDDOC, TIDO_NOMCORTO, RCDE_PREFIJO, RCDE_NUMERO,
        RCDE_ABONO, RCDE_RTFTE, RCDE_RTIVA, RCDE_RTICA, RCDE_DTOF, RCDE_SUCURSAL
        FROM RECIBOS_CAJA_DETALLE D, TIPO_DOCUMENTO TD
        WHERE D.RECA_ID = :ID AND TD.TIDO_COD = D.RCDE_TIPODOC
        ORDER BY RCDE_ITEM
        INTO :ITEMDOC, :TIPO, :IDDOC, :TIPODOC, :PREFDOC, :NUMDOC, :ABONODOC, :RTFTEDOC, :RTIVADOC, :RTICADOC, :DSCTODOC, :sucursal
        DO
            BEGIN
            EXECUTE PROCEDURE SALDO_DOC_CARTERA(:TIPO, :IDDOC, :FECHA, 0) returning_values (:SALDODOC);
            ANTERDOC = SALDODOC + RTFTEDOC + RTIVADOC + RTICADOC + ABONODOC + DSCTODOC;
            SUSPEND;
            END
  ELSE
    SUSPEND;
SUSPEND;
END

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE IMPR_RECIPROV(
    ID INTEGER)
RETURNS (
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    NOMCAJA VARCHAR(60),
    CODCOBR INTEGER,
    NOMCOBR VARCHAR(60),
    NIT VARCHAR(20),
    NOMBRE VARCHAR(60),
    DIR VARCHAR(60),
    CIU VARCHAR(40),
    TEL VARCHAR(40),
    CONCEPTO VARCHAR(60),
    MONTO NUMERIC(18,2),
    RTFTE NUMERIC(18,2),
    RTIVA NUMERIC(18,2),
    RTICA NUMERIC(18,2),
    DSCTO NUMERIC(18,2),
    OBS BLOB SUB_TYPE 1 SEGMENT SIZE 80,
    PREPAGC VARCHAR(4),
    NUMPAGC VARCHAR(6),
    ITEMDOC INTEGER,
    TIPODOC VARCHAR(8),
    PREFDOC VARCHAR(4),
    NUMDOC VARCHAR(6),
    ABONODOC NUMERIC(18,2),
    RTFTEDOC NUMERIC(18,2),
    RTIVADOC NUMERIC(18,2),
    RTICADOC NUMERIC(18,2),
    DSCTODOC NUMERIC(18,2),
    SALDODOC NUMERIC(18,2),
    ANTERDOC NUMERIC(18,2))
AS
declare variable NUMROWS INTEGER;
declare variable TIPO integer;
declare variable IDDOC INTEGER;
BEGIN
  SELECT PREF_PRE, RCPR_NUMERO, RCPR_FECHA, CAJA_NOMBRE, RCPR_CONC, R.VEND_COD,
        R.TERC_NIT, RCPR_NOMTERC, TERC_DIR, TERC_CIU, TERC_TEL,
        RCPR_MONTO, RCPR_RTFTE, RCPR_RTIVA, RCPR_RTICA, RCPR_DTOF,
        RCPR_OBS
  FROM RECIBO_PROVISIONAL R, TERCEROS T, CAJAS C
  WHERE R.TERC_NIT = T.TERC_NIT AND R.CAJA_ID = C.CAJA_ID AND
        R.RCPR_ID = :ID
  INTO :PREFIJO, :NUMERO, :FECHA, :NOMCAJA, :CONCEPTO, :CODCOBR,
        :NIT, :NOMBRE, :DIR, :CIU, :TEL,
        :MONTO, :RTFTE, :RTIVA, :RTICA, :DSCTO,
        :OBS;
  SELECT COBR_NOM FROM COBRADORES WHERE COBR_COD = :CODCOBR INTO :NOMCOBR;
  SELECT COUNT(RPDE_ITEM) FROM RECIBO_PROVISIONAL_DETALLE
    WHERE RCPR_ID = :ID INTO :NUMROWS;
  if (NUMROWS > 0) then
    FOR SELECT RPDE_ITEM, RPDE_TIPODOC, RPDE_IDDOC, TIDO_NOMCORTO, RPDE_PREFDOC, RPDE_NUMDOC,
        RPDE_ABONO, RPDE_RTFTE, RPDE_RTIVA, RPDE_RTICA, RPDE_DTOF
        FROM RECIBO_PROVISIONAL_DETALLE D, TIPO_DOCUMENTO TD
        WHERE D.RCPR_ID = :ID AND TD.TIDO_COD = D.RPDE_TIPODOC
        ORDER BY RPDE_ITEM
        INTO :ITEMDOC, :TIPO, :IDDOC, :TIPODOC, :PREFDOC, :NUMDOC, :ABONODOC, :RTFTEDOC, :RTIVADOC, :RTICADOC, :DSCTODOC
        DO
            BEGIN
            EXECUTE PROCEDURE SALDO_DOC_CARTERA(:TIPO, :ID, :FECHA, 0) returning_values (:SALDODOC);
            ANTERDOC = SALDODOC + RTFTEDOC + RTIVADOC + RTICADOC + ABONODOC + DSCTODOC;
            SUSPEND;
            END
  ELSE
    SUSPEND;
SUSPEND;
END

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE MOVIMIENTO_CARTERA_DESDE_HASTA(
    NIT VARCHAR(20),
    DESDE DATE,
    HASTA DATE,
    EMPSUCURSAL INTEGER,
    MONEDA INTEGER)
RETURNS (
    INICIAL NUMERIC(18,2),
    TIPODOC VARCHAR(8),
    IDDOC INTEGER,
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    CONCEPTO VARCHAR(60),
    DEBITO NUMERIC(18,2),
    CREDITO NUMERIC(18,2),
    SALDO NUMERIC(18,2),
    NOMBRE VARCHAR(60),
    RTFTE NUMERIC(18,2),
    RTIVA NUMERIC(18,2),
    RTICA NUMERIC(18,2),
    SUCURSAL VARCHAR(10),
    RECPROV_ID INTEGER,
    RECIPROV CHAR(1))
AS
declare variable DB CHAR(1);
declare variable AB CHAR(1);
declare variable RETES CHAR(2);
declare variable tipo integer;
declare variable TRM NUMERIC(18,2);
BEGIN
  /* Ubique el NIT */
  select terc_nom from terceros where terc_nit = :NIT INTO :NOMBRE;
  DESDE = DESDE - 1;
  INICIAL = 0;
  FOR SELECT MVCL_TIPOREF, MVCL_IDREF FROM MOVIMIENTO_CLIENTES
    WHERE TERC_NIT = :NIT AND MVCL_FECHA <= :DESDE AND MVCL_ABONO = 'N' AND
    ((:empsucursal = 0) or (SUCU_ID = :empsucursal)) AND ((:MONEDA = 0) or (MVCL_TRM <> 1))
    INTO :TIPODOC, :IDDOC
    DO
    BEGIN
    EXECUTE PROCEDURE saldo_doc_cartera(TIPODOC, IDDOC, DESDE, MONEDA) returning_values (SALDO);
    if (SALDO <> 0) then
        INICIAL = INICIAL + SALDO;
    END
  DESDE = DESDE + 1;
  SALDO = INICIAL;
  EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'DESCONTAR RETENCIONES POR CAUSACION') returning_values(:RETES);
  FOR select tido_nomcorto, MVCL_TIPOREF, mvcl_idref, mvcl_prefref, mvcl_numref, mvcl_fecha, mvcl_conc, mvcl_monto, mvcl_debito, mvcl_rtefte, mvcl_rteiva, mvcl_rteica, mvcl_abono, mvcl_sucursal, MVCL_TRM
    from movimiento_clientes m, tipo_documento t
    where m.mvcl_tiporef = t.tido_cod and terc_nit = :NIT and mvcl_fecha >= :DESDE and mvcl_fecha <= :HASTA and mvcl_tiporef <> 45 AND
    ((SUCU_ID = :EMPSUCURSAL) or (:EMPSUCURSAL = 0)) AND ((:MONEDA = 0) or (MVCL_TRM <> 1))
    order by mvcl_fecha, mvcl_tiporef
    into :TIPODOC,:tipo,  :IDDOC, :PREFIJO, :NUMERO, :FECHA, :CONCEPTO, :DEBITO, :DB, :RTFTE, :RTIVA, :RTICA, :AB, :SUCURSAL, :TRM
    DO
    BEGIN
    if (DB = 'N') then
        BEGIN
        if (AB = 'S') then
            if (RETES = 'SI') then
                CREDITO = DEBITO;
            ELSE
                CREDITO = DEBITO + RTFTE + RTIVA + RTICA;
        ELSE
            if (RETES = 'SI') then
                CREDITO = DEBITO - RTFTE - RTIVA - RTICA;
            ELSE
                CREDITO = DEBITO;
        DEBITO = 0;
        END
    ELSE
        BEGIN
        if (RETES = 'SI') then
            DEBITO = DEBITO - RTFTE - RTIVA - RTICA;
        CREDITO = 0;
        END
    if ((MONEDA <> 0) AND (TRM <> 0)) then
        BEGIN
        DEBITO = DEBITO / TRM;
        CREDITO = CREDITO / TRM;
        RTFTE = RTFTE / TRM;
        RTIVA = RTIVA / TRM;
        RTICA = RTICA / TRM;
        END
    SALDO = SALDO + DEBITO - CREDITO;
    /* IDENTIFICAR SI EL DOCUMENTO TIENE RECIBO PROVISIONAL*/
    recprov_id = 0;
    SELECT max(RCPR_ID) FROM recibo_provisional_detalle WHERE RPDE_IDDOC = :iddoc  AND RPDE_TIPODOC = :TIPO and RPDE_ANULADO = 'N' INTO :recprov_id;
    if (recprov_id is null) then
      BEGIN
       reciprov = 'N';
      end
    ELSE
      begin
       reciprov = 'S';
      END
    SUSPEND;
    END
SUSPEND;
END

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE MOVIMIENTO_CARTERA_MES(
    FECINI DATE,
    FECFIN DATE,
    SUBEMPRESA INTEGER,
    CONTADO CHAR(1),
    MONEDA INTEGER)
RETURNS (
    NIT VARCHAR(20),
    NOMBRE VARCHAR(60),
    CONTACTO VARCHAR(60),
    DIASMAX INTEGER,
    TELEFONO VARCHAR(40),
    INICIAL NUMERIC(18,2),
    DEBITOS NUMERIC(18,2),
    CREDITOS NUMERIC(18,2),
    ABONOS NUMERIC(18,2),
    FINAL NUMERIC(18,2))
AS
declare variable RETES CHAR(2);
declare variable TIPODOC INTEGER;
declare variable IDDOC INTEGER;
declare variable SALDO NUMERIC(18,2);
declare variable NUMROWS INTEGER;
declare variable DIASF INTEGER;
declare variable DIAS INTEGER;
DECLARE VARIABLE FOV CHAR(11);
BEGIN
EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'ANALISIS DE CARTERA CON FECHA FACTURA O VENCIMIENTO') RETURNING_VALUES (FOV);
for select TERC_NIT, TERC_NOM, TERC_CONTACTO, TERC_TEL from TERCEROS WHERE TERC_CLIE = 'S' into :NIT, :NOMBRE, :CONTACTO, :TELEFONO
  DO
    BEGIN
    diasmax = 0;
    SELECT COUNT(*) FROM AUTORIZACIONES WHERE AUTO_NITCONTADO = :NIT INTO :numrows;
    IF ((CONTADO = 'S') or (numrows = 0)) THEN
        BEGIN
        FECINI = FECINI - 1;
        INICIAL = 0;
        FOR SELECT MVCL_TIPOREF, MVCL_IDREF, (:FECFIN-MVCL_FECHA), (:FECFIN-MVCL_VENCE) FROM MOVIMIENTO_CLIENTES
            WHERE TERC_NIT = :NIT AND MVCL_FECHA <= :FECINI AND
            MVCL_ABONO = 'N' AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA)) AND
            ((:moneda = 0) or (MVCL_TRM <> 1))
            INTO :TIPODOC, :IDDOC, :DIASF, DIAS
            DO
            BEGIN
            EXECUTE PROCEDURE saldo_doc_cartera(TIPODOC, IDDOC, FECINI, MONEDA) returning_values (SALDO);
            if (SALDO <> 0) then
                BEGIN
                INICIAL = INICIAL + SALDO;
                if (FOV = 'FECHA') then
                    BEGIN
                    if ((SALDO > 0) AND (DIASMAX < DIASF)) then
                        DIASMAX = DIASF;
                    END
                ELSE
                    BEGIN
                    if ((SALDO > 0) AND (DIASMAX < DIAS)) then
                        DIASMAX = DIAS;
                    END
                END
            END
        EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'DESCONTAR RETENCIONES POR CAUSACION') returning_values(:RETES);
        FECINI = FECINI + 1;
        if (RETES = 'SI') then
            BEGIN
            if (MONEDA = 0) then
                BEGIN
                SELECT SUM(MVCL_MONTO-MVCL_RTEFTE-MVCL_RTEIVA-MVCL_RTEICA), MAX(:FECFIN-MVCL_FECHA), MAX(:FECFIN-MVCL_VENCE) FROM movimiento_clientes
                    WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND MVCL_FECHA < :FECFIN
                    AND MVCL_DEBITO = 'S' AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA))
                    INTO :DEBITOS, :diasf, :dias;
                SELECT SUM(MVCL_MONTO-MVCL_RTEFTE-MVCL_RTEIVA-MVCL_RTEICA) FROM movimiento_clientes
                    WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND MVCL_FECHA < :FECFIN
                    AND MVCL_DEBITO = 'N' AND MVCL_ABONO = 'N' and MVCL_TIPOREF <> 45 AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA))
                    INTO :CREDITOS;
                SELECT SUM(MVCL_MONTO) FROM movimiento_clientes
                    WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND MVCL_FECHA < :FECFIN
                    AND MVCL_ABONO = 'S' AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA))
                    INTO :ABONOS;
                END
            ELSE
                BEGIN
                SELECT SUM((MVCL_MONTO-MVCL_RTEFTE-MVCL_RTEIVA-MVCL_RTEICA)/MVCL_TRM), MAX(:FECFIN-MVCL_FECHA), MAX(:FECFIN-MVCL_VENCE) FROM movimiento_clientes
                    WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND MVCL_FECHA < :FECFIN
                    AND MVCL_DEBITO = 'S' AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA))
                    INTO :DEBITOS, :diasf, :dias;
                SELECT SUM((MVCL_MONTO-MVCL_RTEFTE-MVCL_RTEIVA-MVCL_RTEICA)/MVCL_TRM) FROM movimiento_clientes
                    WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND MVCL_FECHA < :FECFIN
                    AND MVCL_DEBITO = 'N' AND MVCL_ABONO = 'N' and MVCL_TIPOREF <> 45 AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA))
                    INTO :CREDITOS;
                SELECT SUM(MVCL_MONTO/MVCL_TRM) FROM movimiento_clientes
                    WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND MVCL_FECHA < :FECFIN
                    AND MVCL_ABONO = 'S' AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA))
                    INTO :ABONOS;
                END
            END
        ELSE
            BEGIN
            if (MONEDA = 0) then
                BEGIN
                SELECT SUM(MVCL_MONTO), MAX(:FECFIN-MVCL_FECHA), MAX(:FECFIN-MVCL_VENCE) FROM movimiento_clientes
                    WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND MVCL_FECHA < :FECFIN
                    AND MVCL_DEBITO = 'S' AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA))
                    INTO :DEBITOS, :diasf, :dias;
                SELECT SUM(MVCL_MONTO) FROM movimiento_clientes
                    WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND MVCL_FECHA < :FECFIN
                    AND MVCL_DEBITO = 'N' AND MVCL_ABONO = 'N' and MVCL_TIPOREF <> 45 AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA))
                    INTO :CREDITOS;
                SELECT SUM(MVCL_MONTO+MVCL_RTEFTE+MVCL_RTEIVA+MVCL_RTEICA) FROM movimiento_clientes
                    WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND MVCL_FECHA < :FECFIN
                    AND MVCL_ABONO = 'S' AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA))
                    INTO :ABONOS;
                END
            ELSE
                BEGIN
                SELECT SUM(MVCL_MONTO/MVCL_TRM), MAX(:FECFIN-MVCL_FECHA), MAX(:FECFIN-MVCL_VENCE) FROM movimiento_clientes
                    WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND MVCL_FECHA < :FECFIN
                    AND MVCL_DEBITO = 'S' AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA))
                    INTO :DEBITOS, :diasf, :dias;
                SELECT SUM(MVCL_MONTO/MVCL_TRM) FROM movimiento_clientes
                    WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND MVCL_FECHA < :FECFIN
                    AND MVCL_DEBITO = 'N' AND MVCL_ABONO = 'N' and MVCL_TIPOREF <> 45 AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA))
                    INTO :CREDITOS;
                SELECT SUM((MVCL_MONTO+MVCL_RTEFTE+MVCL_RTEIVA+MVCL_RTEICA)/MVCL_TRM) FROM movimiento_clientes
                    WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND MVCL_FECHA < :FECFIN
                    AND MVCL_ABONO = 'S' AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA))
                    INTO :ABONOS;
                END
            END
        if (FOV = 'FECHA') then
            BEGIN
            if ((DIASMAX < DIASF) AND (DIASF IS NOT NULL)) then
                DIASMAX = DIASF;
            END
        ELSE
            BEGIN
            if ((DIASMAX < DIAS) AND (DIAS IS NOT NULL)) then
                DIASMAX = DIAS;
            END
        if (DEBITOS IS NULL) then
            DEBITOS = 0;
        if (CREDITOS IS NULL) then
            CREDITOS = 0;
        if (ABONOS IS NULL) then
            ABONOS = 0;
        FINAL = INICIAL + DEBITOS - CREDITOS - ABONOS;
        SUSPEND;
        END
    END
SUSPEND;
END

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE RECUPERACION_CARTERA(
    DESDE VARCHAR(20),
    HASTA VARCHAR(20),
    GRPINI VARCHAR(5),
    GRPFIN VARCHAR(5),
    FECHA DATE,
    ORDEN CHAR(1),
    AGRUPA CHAR(1),
    SUCURSAL INTEGER,
    MONEDA INTEGER)
RETURNS (
    NIT VARCHAR(20),
    NOMBRE VARCHAR(60),
    TELEFONO VARCHAR(40),
    CIUDAD VARCHAR(60),
    CODZONA VARCHAR(2),
    NOMZONA VARCHAR(60),
    CODCOBR INTEGER,
    NOMCOBR VARCHAR(60),
    DV CHAR(1),
    CODCIUD CHAR(5),
    NOMCIUD VARCHAR(60),
    INICIAL NUMERIC(18,2),
    CARGOS1 NUMERIC(18,2),
    ABONOS1 NUMERIC(18,2),
    CARGOS2 NUMERIC(18,2),
    ABONOS2 NUMERIC(18,2),
    CARGOS3 NUMERIC(18,2),
    ABONOS3 NUMERIC(18,2),
    FINAL NUMERIC(18,2))
AS
declare variable NITINI VARCHAR(20);
declare variable NITFIN VARCHAR(20);
declare variable NOMINI VARCHAR(60);
declare variable NOMFIN VARCHAR(60);
declare variable OK CHAR(1);
declare variable FECINI DATE;
declare variable FECFIN DATE;
declare variable DEBITO NUMERIC(18,2);
declare variable CREDITO NUMERIC(18,2);
declare variable TIPODOC INTEGER;
declare variable IDDOC INTEGER;
declare variable SALDO NUMERIC(18,2);
declare variable RTFTE NUMERIC(18,2);
declare variable RTIVA NUMERIC(18,2);
declare variable RTICA NUMERIC(18,2);
declare variable RETES CHAR(2);
BEGIN
EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'DESCONTAR RETENCIONES POR CAUSACION') returning_values (:RETES);
if (ORDEN = 'C') then
    BEGIN
    NITINI = DESDE;
    NITFIN = HASTA;
    NOMINI = '';
    NOMFIN = 'zz';
    END
ELSE
    BEGIN
    NOMINI = DESDE;
    NOMFIN = HASTA;
    NITINI = '';
    NITFIN = 'zz';
    END
  /* Ubique el NIT */
  FOR select T.TERC_NIT, TERC_NOM, TERC_DV, TERC_TEL, TERC_CIU, S.COBR_COD, C.ZONA_COD, T.CIUD_COD
    from terceros T, CLIENTES C, CLIENTE_SUCURSALES S
    where S.TERC_NIT = T.TERC_NIT AND C.TERC_NIT = T.TERC_NIT AND TERC_CLIE = 'S' AND T.TERC_NIT >= :NITINI AND T.TERC_NIT <= :NITFIN AND
        TERC_NOM >= :NOMINI AND TERC_NOM <= :NOMFIN
    INTO :NIT, :NOMBRE, :DV, :TELEFONO, :CIUDAD, :CODCOBR, :CODZONA, :CODCIUD
    DO  
    BEGIN
    FECINI = FECHA - 90;
    OK = 'N';
    if (AGRUPA = 'Z') then
        BEGIN
        if (GRPINI = '') then
            BEGIN
            if ((CODZONA IS NULL) or (CODZONA >= :GRPINI AND CODZONA <= :GRPFIN)) then
                OK = 'S';
            END
        ELSE
            if (CODZONA >= :GRPINI AND CODZONA <= :GRPFIN) then
                OK = 'S';
        END
    if (AGRUPA = 'I') then
        BEGIN
        if (GRPINI = '') then
            BEGIN
            if ((CODCIUD IS NULL) or (CODCIUD >= :GRPINI AND CODCIUD <= :GRPFIN)) then
                OK = 'S';
            END
        ELSE
            if (CODCIUD >= :GRPINI AND CODCIUD <= :GRPFIN) then
                OK = 'S';
        END
    if (AGRUPA = 'N') then
        OK = 'S';
        
    if (OK = 'S') then
        BEGIN
        SELECT COBR_NOM FROM COBRADORES CB WHERE COBR_COD = :CODCOBR INTO :NOMCOBR;
        SELECT ZONA_NOM FROM ZONAS WHERE ZONA_COD = :CODZONA INTO :NOMZONA;
        SELECT CIUD_NOM FROM CIUDADES WHERE CIUD_COD = :CODCIUD INTO :NOMCIUD;
        CARGOS1 = 0;
        ABONOS1 = 0;
        CARGOS2 = 0;
        ABONOS2 = 0;
        CARGOS3 = 0;
        ABONOS3 = 0;
        INICIAL = 0;
        FOR SELECT MVCL_TIPOREF, MVCL_IDREF FROM MOVIMIENTO_CLIENTES
            WHERE TERC_NIT = :NIT AND MVCL_FECHA <= :FECINI AND ((:MONEDA = 0) or (MVCL_TRM <> 1)) AND
            MVCL_ABONO = 'N' AND ((:SUCURSAL = 0) or (SUCU_ID = :SUCURSAL))
            INTO :TIPODOC, :IDDOC
            DO
            BEGIN
            EXECUTE PROCEDURE saldo_doc_cartera(TIPODOC, IDDOC, FECINI, MONEDA) returning_values (SALDO);
            INICIAL = INICIAL + SALDO;
            END
        FECFIN = FECINI + 30;
        if (MONEDA = 0) then
            SELECT SUM(MVCL_MONTO), SUM(MVCL_RTEFTE), SUM(MVCL_RTEIVA), SUM(MVCL_RTEICA) FROM movimiento_clientes WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND
                MVCL_FECHA < :FECFIN AND MVCL_DEBITO = 'S' AND MVCL_ABONO = 'N' AND ((:SUCURSAL = 0) or (SUCU_ID = :SUCURSAL))
                INTO :DEBITO, :RTFTE, :RTIVA, :RTICA;
        ELSE
            SELECT SUM(MVCL_MONTO/MVCL_TRM), SUM(MVCL_RTEFTE/MVCL_TRM), SUM(MVCL_RTEIVA/MVCL_TRM), SUM(MVCL_RTEICA/MVCL_TRM)
                FROM movimiento_clientes WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND ((:MONEDA = 0) or (MVCL_TRM <> 1)) AND
                MVCL_FECHA < :FECFIN AND MVCL_DEBITO = 'S' AND MVCL_ABONO = 'N' AND ((:SUCURSAL = 0) or (SUCU_ID = :SUCURSAL))
                INTO :DEBITO, :RTFTE, :RTIVA, :RTICA;
        if (DEBITO IS NULL) then
            DEBITO = 0;
        if (rtfte IS NULL) then
            rtfte = 0;
        if (rtiva IS NULL) then
            rtiva = 0;
        if (rtica IS NULL) then
            rtica = 0;
        IF (RETES = 'SI') then
            DEBITO = DEBITO - RTFTE - RTIVA - RTICA;

        if (MONEDA = 0) then
            SELECT SUM(MVCL_MONTO), SUM(MVCL_RTEFTE), SUM(MVCL_RTEIVA), SUM(MVCL_RTEICA)  FROM movimiento_clientes WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI
                AND MVCL_FECHA < :FECFIN AND MVCL_DEBITO = 'N'  AND MVCL_ABONO = 'N' AND ((:SUCURSAL = 0) or (SUCU_ID = :SUCURSAL))
                INTO :CREDITO, :RTFTE, :RTIVA, :RTICA;
        ELSE
            SELECT SUM(MVCL_MONTO/MVCL_TRM), SUM(MVCL_RTEFTE/MVCL_TRM), SUM(MVCL_RTEIVA/MVCL_TRM), SUM(MVCL_RTEICA/MVCL_TRM)
                FROM movimiento_clientes WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND ((:MONEDA = 0) or (MVCL_TRM <> 1))
                AND MVCL_FECHA < :FECFIN AND MVCL_DEBITO = 'N'  AND MVCL_ABONO = 'N' AND ((:SUCURSAL = 0) or (SUCU_ID = :SUCURSAL))
                INTO :CREDITO, :RTFTE, :RTIVA, :RTICA;
        if (CREDITO IS NULL) then
            CREDITO = 0;
        if (rtfte IS NULL) then
            rtfte = 0;
        if (rtiva IS NULL) then
            rtiva = 0;
        if (rtica IS NULL) then
            rtica = 0;
        IF (RETES = 'SI') then
            CREDITO = CREDITO - RTFTE - RTIVA - RTICA;
        CARGOS3 = DEBITO - CREDITO;
        if (MONEDA = 0) then
            SELECT SUM(MVCL_MONTO), SUM(MVCL_RTEFTE), SUM(MVCL_RTEIVA), SUM(MVCL_RTEICA)  FROM movimiento_clientes WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI
                AND MVCL_FECHA < :FECFIN AND MVCL_DEBITO = 'N' AND MVCL_ABONO = 'S' AND ((:SUCURSAL = 0) or (SUCU_ID = :SUCURSAL))
                INTO :CREDITO, :RTFTE, :RTIVA, :RTICA;
        ELSE
            SELECT SUM(MVCL_MONTO/MVCL_TRM), SUM(MVCL_RTEFTE/MVCL_TRM), SUM(MVCL_RTEIVA/MVCL_TRM), SUM(MVCL_RTEICA/MVCL_TRM)
                FROM movimiento_clientes WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND ((:MONEDA = 0) or (MVCL_TRM <> 1))
                AND MVCL_FECHA < :FECFIN AND MVCL_DEBITO = 'N' AND MVCL_ABONO = 'S' AND ((:SUCURSAL = 0) or (SUCU_ID = :SUCURSAL))
                INTO :CREDITO, :RTFTE, :RTIVA, :RTICA;
        if (CREDITO IS NULL) then
            CREDITO = 0;
        if (rtfte IS NULL) then
            rtfte = 0;
        if (rtiva IS NULL) then
            rtiva = 0;
        if (rtica IS NULL) then
            rtica = 0;
        IF (RETES = 'NO') then
            CREDITO = CREDITO + RTFTE + RTIVA + RTICA;
        ABONOS3 = CREDITO;
        FECINI = FECFIN;
        FECFIN = FECINI + 30;
        if (MONEDA = 0) then
            SELECT SUM(MVCL_MONTO), SUM(MVCL_RTEFTE), SUM(MVCL_RTEIVA), SUM(MVCL_RTEICA)  FROM movimiento_clientes WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI
                AND MVCL_FECHA < :FECFIN AND MVCL_DEBITO = 'S' AND MVCL_ABONO = 'N' AND ((:SUCURSAL = 0) or (SUCU_ID = :SUCURSAL))
                INTO :DEBITO, :RTFTE, :RTIVA, :RTICA;
        ELSE
            SELECT SUM(MVCL_MONTO/MVCL_TRM), SUM(MVCL_RTEFTE/MVCL_TRM), SUM(MVCL_RTEIVA/MVCL_TRM), SUM(MVCL_RTEICA/MVCL_TRM)
                FROM movimiento_clientes WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND ((:MONEDA = 0) or (MVCL_TRM <> 1))
                AND MVCL_FECHA < :FECFIN AND MVCL_DEBITO = 'S' AND MVCL_ABONO = 'N' AND ((:SUCURSAL = 0) or (SUCU_ID = :SUCURSAL))
                INTO :DEBITO, :RTFTE, :RTIVA, :RTICA;
        if (DEBITO IS NULL) then
            DEBITO = 0;
        if (rtfte IS NULL) then
            rtfte = 0;
        if (rtiva IS NULL) then
            rtiva = 0;
        if (rtica IS NULL) then
            rtica = 0;
        IF (RETES = 'SI') then
            DEBITO = DEBITO - RTFTE - RTIVA - RTICA;
        if (MONEDA = 0) then
            SELECT SUM(MVCL_MONTO), SUM(MVCL_RTEFTE), SUM(MVCL_RTEIVA), SUM(MVCL_RTEICA)  FROM movimiento_clientes WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI
                AND MVCL_FECHA < :FECFIN AND MVCL_DEBITO = 'N'  AND MVCL_ABONO = 'N' AND ((:SUCURSAL = 0) or (SUCU_ID = :SUCURSAL))
                INTO :CREDITO, :RTFTE, :RTIVA, :RTICA;
        ELSE
            SELECT SUM(MVCL_MONTO/MVCL_TRM), SUM(MVCL_RTEFTE/MVCL_TRM), SUM(MVCL_RTEIVA/MVCL_TRM), SUM(MVCL_RTEICA/MVCL_TRM)
                FROM movimiento_clientes WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND ((:MONEDA = 0) or (MVCL_TRM <> 1))
                AND MVCL_FECHA < :FECFIN AND MVCL_DEBITO = 'N'  AND MVCL_ABONO = 'N' AND ((:SUCURSAL = 0) or (SUCU_ID = :SUCURSAL))
                INTO :CREDITO, :RTFTE, :RTIVA, :RTICA;
        if (CREDITO IS NULL) then
            CREDITO = 0;
        if (rtfte IS NULL) then
            rtfte = 0;
        if (rtiva IS NULL) then
            rtiva = 0;
        if (rtica IS NULL) then
            rtica = 0;
        IF (RETES = 'SI') then
            CREDITO = CREDITO - RTFTE - RTIVA - RTICA;
        CARGOS2 = DEBITO - CREDITO;
        if (MONEDA = 0) then
            SELECT SUM(MVCL_MONTO), SUM(MVCL_RTEFTE), SUM(MVCL_RTEIVA), SUM(MVCL_RTEICA)  FROM movimiento_clientes WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI
                AND MVCL_FECHA < :FECFIN AND MVCL_DEBITO = 'N'  AND MVCL_ABONO = 'S' AND ((:SUCURSAL = 0) or (SUCU_ID = :SUCURSAL))
                INTO :CREDITO, :RTFTE, :RTIVA, :RTICA;
        ELSE
            SELECT SUM(MVCL_MONTO/MVCL_TRM), SUM(MVCL_RTEFTE/MVCL_TRM), SUM(MVCL_RTEIVA/MVCL_TRM), SUM(MVCL_RTEICA/MVCL_TRM)
                FROM movimiento_clientes WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND ((:MONEDA = 0) or (MVCL_TRM <> 1))
                AND MVCL_FECHA < :FECFIN AND MVCL_DEBITO = 'N'  AND MVCL_ABONO = 'S' AND ((:SUCURSAL = 0) or (SUCU_ID = :SUCURSAL))
                INTO :CREDITO, :RTFTE, :RTIVA, :RTICA;
        if (CREDITO IS NULL) then
            CREDITO = 0;
        if (rtfte IS NULL) then
            rtfte = 0;
        if (rtiva IS NULL) then
            rtiva = 0;
        if (rtica IS NULL) then
            rtica = 0;
        IF (RETES = 'NO') then
            CREDITO = CREDITO + RTFTE + RTIVA + RTICA;
        ABONOS2 = CREDITO;
        FECINI = FECFIN;
        FECFIN = FECINI + 30;
        if (MONEDA = 0) then
            SELECT SUM(MVCL_MONTO), SUM(MVCL_RTEFTE), SUM(MVCL_RTEIVA), SUM(MVCL_RTEICA)  FROM movimiento_clientes WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI
                AND MVCL_FECHA < :FECFIN AND MVCL_DEBITO = 'S' AND MVCL_ABONO = 'N' AND ((:SUCURSAL = 0) or (SUCU_ID = :SUCURSAL))
                INTO :DEBITO, :RTFTE, :RTIVA, :RTICA;
        ELSE
            SELECT SUM(MVCL_MONTO/MVCL_TRM), SUM(MVCL_RTEFTE/MVCL_TRM), SUM(MVCL_RTEIVA/MVCL_TRM), SUM(MVCL_RTEICA/MVCL_TRM)
                FROM movimiento_clientes WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND ((:MONEDA = 0) or (MVCL_TRM <> 1))
                AND MVCL_FECHA < :FECFIN AND MVCL_DEBITO = 'S' AND MVCL_ABONO = 'N' AND ((:SUCURSAL = 0) or (SUCU_ID = :SUCURSAL))
                INTO :DEBITO, :RTFTE, :RTIVA, :RTICA;
        if (DEBITO IS NULL) then
            DEBITO = 0;
        if (rtfte IS NULL) then
            rtfte = 0;
        if (rtiva IS NULL) then
            rtiva = 0;
        if (rtica IS NULL) then
            rtica = 0;
        IF (RETES = 'SI') then
            DEBITO = DEBITO - RTFTE - RTIVA - RTICA;
        if (MONEDA = 0) then
            SELECT SUM(MVCL_MONTO), SUM(MVCL_RTEFTE), SUM(MVCL_RTEIVA), SUM(MVCL_RTEICA)  FROM movimiento_clientes WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI
                AND MVCL_FECHA < :FECFIN AND MVCL_DEBITO = 'N'  AND MVCL_ABONO = 'N' AND ((:SUCURSAL = 0) or (SUCU_ID = :SUCURSAL))
                INTO :CREDITO, :RTFTE, :RTIVA, :RTICA;
        ELSE
            SELECT SUM(MVCL_MONTO/MVCL_TRM), SUM(MVCL_RTEFTE/MVCL_TRM), SUM(MVCL_RTEIVA/MVCL_TRM), SUM(MVCL_RTEICA/MVCL_TRM)
                FROM movimiento_clientes WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND ((:MONEDA = 0) or (MVCL_TRM <> 1))
                AND MVCL_FECHA < :FECFIN AND MVCL_DEBITO = 'N'  AND MVCL_ABONO = 'N' AND ((:SUCURSAL = 0) or (SUCU_ID = :SUCURSAL))
                INTO :CREDITO, :RTFTE, :RTIVA, :RTICA;
        if (CREDITO IS NULL) then
            CREDITO = 0;
        if (rtfte IS NULL) then
            rtfte = 0;
        if (rtiva IS NULL) then
            rtiva = 0;
        if (rtica IS NULL) then
            rtica = 0;
        IF (RETES = 'SI') then
            CREDITO = CREDITO - RTFTE - RTIVA - RTICA;
        CARGOS1 = DEBITO - CREDITO;
        if (MONEDA = 0) then
            SELECT SUM(MVCL_MONTO), SUM(MVCL_RTEFTE), SUM(MVCL_RTEIVA), SUM(MVCL_RTEICA)  FROM movimiento_clientes WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI
                AND MVCL_FECHA < :FECFIN AND MVCL_DEBITO = 'N'  AND MVCL_ABONO = 'S' AND ((:SUCURSAL = 0) or (SUCU_ID = :SUCURSAL))
                INTO :CREDITO, :RTFTE, :RTIVA, :RTICA;
        ELSE
            SELECT SUM(MVCL_MONTO/MVCL_TRM), SUM(MVCL_RTEFTE/MVCL_TRM), SUM(MVCL_RTEIVA/MVCL_TRM), SUM(MVCL_RTEICA/MVCL_TRM)
                FROM movimiento_clientes WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND ((:MONEDA = 0) or (MVCL_TRM <> 1))
                AND MVCL_FECHA < :FECFIN AND MVCL_DEBITO = 'N'  AND MVCL_ABONO = 'S' AND ((:SUCURSAL = 0) or (SUCU_ID = :SUCURSAL))
                INTO :CREDITO, :RTFTE, :RTIVA, :RTICA;
        if (CREDITO IS NULL) then
            CREDITO = 0;
        if (rtfte IS NULL) then
            rtfte = 0;
        if (rtiva IS NULL) then
            rtiva = 0;
        if (rtica IS NULL) then
            rtica = 0;
        IF (RETES = 'NO') then
            CREDITO = CREDITO + RTFTE + RTIVA + RTICA;
        ABONOS1 = CREDITO;
        FINAL = INICIAL + CARGOS3 + CARGOS2 + CARGOS1 + ABONOS3 + ABONOS2 + ABONOS1;
        SUSPEND;
        END

    if (AGRUPA = 'C') then
        BEGIN
        CARGOS1 = 0;
        ABONOS1 = 0;
        CARGOS2 = 0;
        ABONOS2 = 0;
        CARGOS3 = 0;
        ABONOS3 = 0;
        INICIAL = 0;
        for select distinct cobr_cod from movimiento_clientes
            WHERE TERC_NIT = :NIT AND MVCL_FECHA <= :FECINI AND
            MVCL_ABONO = 'N' AND ((:SUCURSAL = 0) or (SUCU_ID = :SUCURSAL))
            into :codcobr
            do
            BEGIN
            OK = 'N';
            if (GRPINI = '') then
                BEGIN
                if ((CODCOBR IS NULL) or (CODCOBR >= :GRPINI AND CODCOBR <= :GRPFIN)) then
                    OK = 'S';
                END
            ELSE
                if (CODCOBR >= :GRPINI AND CODCOBR <= :GRPFIN) then
                    OK = 'S';
            if (OK = 'S') then
                begin
                SELECT COBR_NOM FROM COBRADORES WHERE COBR_COD = :codcobr INTO :nomcobr;
                FOR SELECT MVCL_TIPOREF, MVCL_IDREF FROM MOVIMIENTO_CLIENTES
                    WHERE TERC_NIT = :NIT AND MVCL_FECHA <= :FECINI AND COBR_COD = :codcobr AND
                    MVCL_ABONO = 'N' AND ((:SUCURSAL = 0) or (SUCU_ID = :SUCURSAL))
                    INTO :TIPODOC, :IDDOC
                    DO
                    BEGIN
                    EXECUTE PROCEDURE saldo_doc_cartera(TIPODOC, IDDOC, FECINI, 0) returning_values (SALDO);
                    INICIAL = INICIAL + SALDO;
                    END
                FECFIN = FECINI + 30;
                if (MONEDA = 0) then
                    SELECT SUM(MVCL_MONTO), SUM(MVCL_RTEFTE), SUM(MVCL_RTEIVA), SUM(MVCL_RTEICA) FROM movimiento_clientes WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND
                        MVCL_FECHA < :FECFIN AND MVCL_DEBITO = 'S' AND MVCL_ABONO = 'N' AND COBR_COD = :codcobr AND ((:SUCURSAL = 0) or (SUCU_ID = :SUCURSAL))
                        INTO :DEBITO, :RTFTE, :RTIVA, :RTICA;
                ELSE
                    SELECT SUM(MVCL_MONTO/MVCL_TRM), SUM(MVCL_RTEFTE/MVCL_TRM), SUM(MVCL_RTEIVA/MVCL_TRM), SUM(MVCL_RTEICA/MVCL_TRM)
                        FROM movimiento_clientes WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND ((:MONEDA = 0) or (MVCL_TRM <> 1)) AND
                        MVCL_FECHA < :FECFIN AND MVCL_DEBITO = 'S' AND MVCL_ABONO = 'N' AND COBR_COD = :codcobr AND ((:SUCURSAL = 0) or (SUCU_ID = :SUCURSAL))
                        INTO :DEBITO, :RTFTE, :RTIVA, :RTICA;
                if (DEBITO IS NULL) then
                    DEBITO = 0;
                if (rtfte IS NULL) then
                    rtfte = 0;
                if (rtiva IS NULL) then
                    rtiva = 0;
                if (rtica IS NULL) then
                    rtica = 0;
                IF (RETES = 'SI') then
                    DEBITO = DEBITO - RTFTE - RTIVA - RTICA;
                if (MONEDA = 0) then
                    SELECT SUM(MVCL_MONTO), SUM(MVCL_RTEFTE), SUM(MVCL_RTEIVA), SUM(MVCL_RTEICA) FROM movimiento_clientes WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI
                        AND MVCL_FECHA < :FECFIN AND MVCL_DEBITO = 'N'  AND MVCL_ABONO = 'N' AND COBR_COD = :codcobr AND ((:SUCURSAL = 0) or (SUCU_ID = :SUCURSAL))
                        INTO :CREDITO, :RTFTE, :RTIVA, :RTICA;
                ELSE
                    SELECT SUM(MVCL_MONTO/MVCL_TRM), SUM(MVCL_RTEFTE/MVCL_TRM), SUM(MVCL_RTEIVA/MVCL_TRM), SUM(MVCL_RTEICA/MVCL_TRM)
                        FROM movimiento_clientes WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND ((:MONEDA = 0) or (MVCL_TRM <> 1)) 
                        AND MVCL_FECHA < :FECFIN AND MVCL_DEBITO = 'N'  AND MVCL_ABONO = 'N' AND COBR_COD = :codcobr AND ((:SUCURSAL = 0) or (SUCU_ID = :SUCURSAL))
                        INTO :CREDITO, :RTFTE, :RTIVA, :RTICA;
                if (CREDITO IS NULL) then
                    CREDITO = 0;
                if (rtfte IS NULL) then
                    rtfte = 0;
                if (rtiva IS NULL) then
                    rtiva = 0;
                if (rtica IS NULL) then
                    rtica = 0;
                IF (RETES = 'SI') then
                    CREDITO = CREDITO - RTFTE - RTIVA - RTICA;
                CARGOS3 = DEBITO - CREDITO;
                if (MONEDA = 0) then
                    SELECT SUM(MVCL_MONTO), SUM(MVCL_RTEFTE), SUM(MVCL_RTEIVA), SUM(MVCL_RTEICA) FROM movimiento_clientes WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI
                        AND MVCL_FECHA < :FECFIN AND MVCL_DEBITO = 'N' AND MVCL_ABONO = 'S' AND COBR_COD = :codcobr AND ((:SUCURSAL = 0) or (SUCU_ID = :SUCURSAL))
                        INTO :CREDITO, :RTFTE, :RTIVA, :RTICA;
                ELSE
                    SELECT SUM(MVCL_MONTO/MVCL_TRM), SUM(MVCL_RTEFTE/MVCL_TRM), SUM(MVCL_RTEIVA/MVCL_TRM), SUM(MVCL_RTEICA/MVCL_TRM)
                        FROM movimiento_clientes WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND ((:MONEDA = 0) or (MVCL_TRM <> 1)) 
                        AND MVCL_FECHA < :FECFIN AND MVCL_DEBITO = 'N' AND MVCL_ABONO = 'S' AND COBR_COD = :codcobr AND ((:SUCURSAL = 0) or (SUCU_ID = :SUCURSAL))
                        INTO :CREDITO, :RTFTE, :RTIVA, :RTICA;
                if (CREDITO IS NULL) then
                    CREDITO = 0;
                if (rtfte IS NULL) then
                    rtfte = 0;
                if (rtiva IS NULL) then
                    rtiva = 0;
                if (rtica IS NULL) then
                    rtica = 0;
                IF (RETES = 'NO') then
                    CREDITO = CREDITO + RTFTE + RTIVA + RTICA;
                ABONOS3 = CREDITO;
                FECINI = FECFIN;
                FECFIN = FECINI + 30;
                if (MONEDA = 0) then
                    SELECT SUM(MVCL_MONTO), SUM(MVCL_RTEFTE), SUM(MVCL_RTEIVA), SUM(MVCL_RTEICA) FROM movimiento_clientes WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI
                        AND MVCL_FECHA < :FECFIN AND MVCL_DEBITO = 'S' AND MVCL_ABONO = 'N' AND COBR_COD = :codcobr AND ((:SUCURSAL = 0) or (SUCU_ID = :SUCURSAL))
                        INTO :DEBITO, :RTFTE, :RTIVA, :RTICA;
                ELSE
                    SELECT SUM(MVCL_MONTO/MVCL_TRM), SUM(MVCL_RTEFTE/MVCL_TRM), SUM(MVCL_RTEIVA/MVCL_TRM), SUM(MVCL_RTEICA/MVCL_TRM)
                        FROM movimiento_clientes WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND ((:MONEDA = 0) or (MVCL_TRM <> 1)) 
                        AND MVCL_FECHA < :FECFIN AND MVCL_DEBITO = 'S' AND MVCL_ABONO = 'N' AND COBR_COD = :codcobr AND ((:SUCURSAL = 0) or (SUCU_ID = :SUCURSAL))
                        INTO :DEBITO, :RTFTE, :RTIVA, :RTICA;
                if (DEBITO IS NULL) then
                    DEBITO = 0;
                if (rtfte IS NULL) then
                    rtfte = 0;
                if (rtiva IS NULL) then
                    rtiva = 0;
                if (rtica IS NULL) then
                    rtica = 0;
                IF (RETES = 'SI') then
                    DEBITO = DEBITO - RTFTE - RTIVA - RTICA;
                if (MONEDA = 0) then
                    SELECT SUM(MVCL_MONTO), SUM(MVCL_RTEFTE), SUM(MVCL_RTEIVA), SUM(MVCL_RTEICA) FROM movimiento_clientes WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI
                        AND MVCL_FECHA < :FECFIN AND MVCL_DEBITO = 'N'  AND MVCL_ABONO = 'N' AND COBR_COD = :codcobr AND ((:SUCURSAL = 0) or (SUCU_ID = :SUCURSAL))
                        INTO :CREDITO, :RTFTE, :RTIVA, :RTICA;
                ELSE
                    SELECT SUM(MVCL_MONTO/MVCL_TRM), SUM(MVCL_RTEFTE/MVCL_TRM), SUM(MVCL_RTEIVA/MVCL_TRM), SUM(MVCL_RTEICA/MVCL_TRM)
                        FROM movimiento_clientes WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND ((:MONEDA = 0) or (MVCL_TRM <> 1)) 
                        AND MVCL_FECHA < :FECFIN AND MVCL_DEBITO = 'N'  AND MVCL_ABONO = 'N' AND COBR_COD = :codcobr AND ((:SUCURSAL = 0) or (SUCU_ID = :SUCURSAL))
                        INTO :CREDITO, :RTFTE, :RTIVA, :RTICA;
                if (CREDITO IS NULL) then
                    CREDITO = 0;
                if (rtfte IS NULL) then
                    rtfte = 0;
                if (rtiva IS NULL) then
                    rtiva = 0;
                if (rtica IS NULL) then
                    rtica = 0;
                IF (RETES = 'SI') then
                    CREDITO = CREDITO - RTFTE - RTIVA - RTICA;
                CARGOS2 = DEBITO - CREDITO;
                if (MONEDA = 0) then
                    SELECT SUM(MVCL_MONTO), SUM(MVCL_RTEFTE), SUM(MVCL_RTEIVA), SUM(MVCL_RTEICA) FROM movimiento_clientes WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI
                        AND MVCL_FECHA < :FECFIN AND MVCL_DEBITO = 'N'  AND MVCL_ABONO = 'S' AND COBR_COD = :codcobr AND ((:SUCURSAL = 0) or (SUCU_ID = :SUCURSAL))
                        INTO :CREDITO, :RTFTE, :RTIVA, :RTICA;
                ELSE
                    SELECT SUM(MVCL_MONTO/MVCL_TRM), SUM(MVCL_RTEFTE/MVCL_TRM), SUM(MVCL_RTEIVA/MVCL_TRM), SUM(MVCL_RTEICA/MVCL_TRM)
                        FROM movimiento_clientes WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND ((:MONEDA = 0) or (MVCL_TRM <> 1)) 
                        AND MVCL_FECHA < :FECFIN AND MVCL_DEBITO = 'N'  AND MVCL_ABONO = 'S' AND COBR_COD = :codcobr AND ((:SUCURSAL = 0) or (SUCU_ID = :SUCURSAL))
                        INTO :CREDITO, :RTFTE, :RTIVA, :RTICA;
                if (CREDITO IS NULL) then
                    CREDITO = 0;
                if (rtfte IS NULL) then
                    rtfte = 0;
                if (rtiva IS NULL) then
                    rtiva = 0;
                if (rtica IS NULL) then
                    rtica = 0;
                IF (RETES = 'NO') then
                    CREDITO = CREDITO + RTFTE + RTIVA + RTICA;
                ABONOS2 = CREDITO;
                FECINI = FECFIN;
                FECFIN = FECINI + 30;
                if (MONEDA = 0) then
                    SELECT SUM(MVCL_MONTO), SUM(MVCL_RTEFTE), SUM(MVCL_RTEIVA), SUM(MVCL_RTEICA) FROM movimiento_clientes WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI
                        AND MVCL_FECHA < :FECFIN AND MVCL_DEBITO = 'S' AND MVCL_ABONO = 'N' AND COBR_COD = :codcobr AND ((:SUCURSAL = 0) or (SUCU_ID = :SUCURSAL))
                        INTO :DEBITO, :RTFTE, :RTIVA, :RTICA;
                ELSE
                    SELECT SUM(MVCL_MONTO/MVCL_TRM), SUM(MVCL_RTEFTE/MVCL_TRM), SUM(MVCL_RTEIVA/MVCL_TRM), SUM(MVCL_RTEICA/MVCL_TRM)
                        FROM movimiento_clientes WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND ((:MONEDA = 0) or (MVCL_TRM <> 1)) 
                        AND MVCL_FECHA < :FECFIN AND MVCL_DEBITO = 'S' AND MVCL_ABONO = 'N' AND COBR_COD = :codcobr AND ((:SUCURSAL = 0) or (SUCU_ID = :SUCURSAL))
                        INTO :DEBITO, :RTFTE, :RTIVA, :RTICA;
                if (DEBITO IS NULL) then
                    DEBITO = 0;
                if (rtfte IS NULL) then
                    rtfte = 0;
                if (rtiva IS NULL) then
                    rtiva = 0;
                if (rtica IS NULL) then
                    rtica = 0;
                IF (RETES = 'SI') then
                    DEBITO = DEBITO - RTFTE - RTIVA - RTICA;
                if (MONEDA = 0) then
                    SELECT SUM(MVCL_MONTO), SUM(MVCL_RTEFTE), SUM(MVCL_RTEIVA), SUM(MVCL_RTEICA) FROM movimiento_clientes WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI
                        AND MVCL_FECHA < :FECFIN AND MVCL_DEBITO = 'N'  AND MVCL_ABONO = 'N' AND COBR_COD = :codcobr AND ((:SUCURSAL = 0) or (SUCU_ID = :SUCURSAL))
                        INTO :CREDITO, :RTFTE, :RTIVA, :RTICA;
                ELSE
                    SELECT SUM(MVCL_MONTO/MVCL_TRM), SUM(MVCL_RTEFTE/MVCL_TRM), SUM(MVCL_RTEIVA/MVCL_TRM), SUM(MVCL_RTEICA/MVCL_TRM)
                        FROM movimiento_clientes WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND ((:MONEDA = 0) or (MVCL_TRM <> 1)) 
                        AND MVCL_FECHA < :FECFIN AND MVCL_DEBITO = 'N'  AND MVCL_ABONO = 'N' AND COBR_COD = :codcobr AND ((:SUCURSAL = 0) or (SUCU_ID = :SUCURSAL))
                        INTO :CREDITO, :RTFTE, :RTIVA, :RTICA;
                if (CREDITO IS NULL) then
                    CREDITO = 0;
                if (rtfte IS NULL) then
                    rtfte = 0;
                if (rtiva IS NULL) then
                    rtiva = 0;
                if (rtica IS NULL) then
                    rtica = 0;
                IF (RETES = 'SI') then
                    CREDITO = CREDITO - RTFTE - RTIVA - RTICA;
                CARGOS1 = DEBITO - CREDITO;
                if (MONEDA = 0) then
                    SELECT SUM(MVCL_MONTO), SUM(MVCL_RTEFTE), SUM(MVCL_RTEIVA), SUM(MVCL_RTEICA) FROM movimiento_clientes WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI
                        AND MVCL_FECHA < :FECFIN AND MVCL_DEBITO = 'N'  AND MVCL_ABONO = 'S' AND COBR_COD = :codcobr AND ((:SUCURSAL = 0) or (SUCU_ID = :SUCURSAL))
                        INTO :CREDITO, :RTFTE, :RTIVA, :RTICA;
                ELSE
                    SELECT SUM(MVCL_MONTO/MVCL_TRM), SUM(MVCL_RTEFTE/MVCL_TRM), SUM(MVCL_RTEIVA/MVCL_TRM), SUM(MVCL_RTEICA/MVCL_TRM)
                        FROM movimiento_clientes WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND ((:MONEDA = 0) or (MVCL_TRM <> 1)) 
                        AND MVCL_FECHA < :FECFIN AND MVCL_DEBITO = 'N'  AND MVCL_ABONO = 'S' AND COBR_COD = :codcobr AND ((:SUCURSAL = 0) or (SUCU_ID = :SUCURSAL))
                        INTO :CREDITO, :RTFTE, :RTIVA, :RTICA;
                if (CREDITO IS NULL) then
                    CREDITO = 0;
                if (rtfte IS NULL) then
                    rtfte = 0;
                if (rtiva IS NULL) then
                    rtiva = 0;
                if (rtica IS NULL) then
                    rtica = 0;
                IF (RETES = 'NO') then
                    CREDITO = CREDITO + RTFTE + RTIVA + RTICA;
                ABONOS1 = CREDITO;
                FINAL = INICIAL + CARGOS3 + CARGOS2 + CARGOS1 - ABONOS3 - ABONOS2 - ABONOS1;
                SUSPEND;
                END
            END
        END
    END
SUSPEND;
END

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE REGISTRA_RECIBOS_CONTADO(
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    PREFAC VARCHAR(4),
    MONTO NUMERIC(18,2))
AS
declare variable id integer;
declare variable idr integer;
declare variable NIT VARCHAR(20);
declare variable punto integer;
declare variable caja integer;
declare variable vend integer;
begin
for select fact_id, f.pref_pre, fact_numero, fact_fecha, vend_cod, terc_nit, a.auto_prefrdc, ptvt_id from facturas f, autorizaciones a
    where f.pref_pre = a.pref_pre and a.auto_contado = 'S' and fact_fecha >= :fecini and fact_fecha <= :fecfin
    into :id, :prefac, :numero, :fecha, :vend, :NIT, :PREF, :punto
    do
    begin
    select caja_id from punto_venta where ptvt_id = :punto into :caja;
    execute procedure saldo_doc_cartera(31, :id, cast('now' as date), 0) returning_values (:monto);
    if (monto <> 0) then
        begin
        idr = gen_id(id_recicaja, 1);
        insert into recibos_caja (reca_id, caja_id, tido_cod, pref_pre, reca_numero, reca_fecha, reca_conc, reca_monto,
            reca_rtftemonto, reca_rtivamonto, reca_rticamonto, reca_dtof, reca_obs, terc_nit, reca_nomterc, reca_anulado,
            reca_transmit, cobr_cod, numok)
            values (:idr, :caja, 61, :pref, :numero, :fecha, 'CANCELA FACTURA CONTADO No. ' || :prefac || :numero,  :MONTO,
            0, 0, 0, 0, NULL, :NIT, 'VENTAS CONTADO', 'N', 'N', :vend, 'N');
        insert into recibos_caja_detalle (reca_id, rcde_item, rcde_tipodoc, rcde_iddoc, rcde_prefijo, rcde_numero, rcde_abono,
            rcde_rtfte, rcde_rtiva, rcde_rtica, rcde_dtof, rcde_anulado, rcde_transmit, rcde_comip, rcde_sucursal)
            values (:idr, 1, 31, :id, :prefac, :numero, :monto, 0, 0, 0, 0, 'N', 'N', '', '01');
        insert into recibos_caja_pago (reca_id, rcpa_item, fopa_id, rcpa_banco, rcpa_cuenta, rcpa_numero, rcpa_fecha, rcpa_monto,
            rcpa_anulado, rcpa_transmit, rcpa_ivamonto)
            values (:idr, 1, 1, null, null, null, :fecha, :monto, 'N', 'N', 0);
        suspend;
        end
    end
SUSPEND;
end

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE REP_ANALISIS_CARTERA(
    DESDE VARCHAR(20),
    HASTA VARCHAR(20),
    GRPINI VARCHAR(5),
    GRPFIN VARCHAR(5),
    FECHA DATE,
    DETALLE CHAR(1),
    ORDEN CHAR(1),
    AGRUPA CHAR(1),
    DIASR INTEGER,
    SUBEMPRESA INTEGER,
    GRUPCART INTEGER,
    EXTENDIDA CHAR(1),
    MONEDA INTEGER)
RETURNS (
    NIT VARCHAR(20),
    NOMBRE VARCHAR(60),
    TELEFONO VARCHAR(40),
    CIUDAD VARCHAR(40),
    CONTACTO VARCHAR(60),
    EMAIL VARCHAR(100),
    FAX VARCHAR(25),
    CEL VARCHAR(25),
    CODCLI VARCHAR(20),
    CODZONA VARCHAR(2),
    NOMZONA VARCHAR(60),
    CODCOBR INTEGER,
    NOMCOBR VARCHAR(60),
    DV CHAR(1),
    CODCIUD CHAR(5),
    NOMCIUD VARCHAR(60),
    SUCURSAL VARCHAR(10),
    NOMSUC VARCHAR(60),
    TIPO INTEGER,
    ID INTEGER,
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(6),
    DIAS INTEGER,
    SALDO NUMERIC(18,2),
    CORRIENTE NUMERIC(18,2),
    CERO NUMERIC(18,2),
    TREINTA NUMERIC(18,2),
    SESENTA NUMERIC(18,2),
    NOVENTA NUMERIC(18,2),
    CIENTOCHENTA NUMERIC(18,2),
    DOSSETENTA NUMERIC(18,2),
    TRESSESENTA NUMERIC(18,2),
    PROVISIONAL NUMERIC(18,2),
    TIPONOM VARCHAR(8),
    FECDOC DATE,
    VENCE DATE,
    CUPO NUMERIC(18,2),
    DISPONIBLE NUMERIC(18,2),
    OBS BLOB SUB_TYPE 0 SEGMENT SIZE 80,
    GRUPCOD INTEGER,
    DIA_CAR INTEGER,
    GRUPNOM VARCHAR(30))
AS
DECLARE VARIABLE NITINI VARCHAR(20);
DECLARE VARIABLE NITFIN VARCHAR(20);
DECLARE VARIABLE NOMINI VARCHAR(20);
DECLARE VARIABLE NOMFIN VARCHAR(20);
DECLARE VARIABLE RTFTE NUMERIC(18,2);
DECLARE VARIABLE RTIVA NUMERIC(18,2);
DECLARE VARIABLE RTICA NUMERIC(18,2);
DECLARE VARIABLE VENCIMIENTO VARCHAR(12);
DECLARE VARIABLE OK CHAR(1);
declare variable AUTORET VARCHAR(10);
declare variable FAUTORET DATE;
declare variable INCLANTI CHAR(2);
declare variable descnt_prov char(2);
declare variable MAXDIAS INTEGER;
DECLARE VARIABLE TRM NUMERIC(18,2);
BEGIN
if (ORDEN = 'C') then
    BEGIN
    NITINI = DESDE;
    NITFIN = HASTA;
    NOMINI = '';
    NOMFIN = 'zz';
    END
ELSE
    BEGIN
    NOMINI = DESDE;
    NOMFIN = HASTA;
    NITINI = '';
    NITFIN = 'zz';
    END
/* Ubique el NIT */
EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'FECHA AUTORETENEDOR NO DESCONTAR RETENCIONES DEL SALDO PERO SI CONTABILIZARLAS') returning_values (AUTORET);
if (AUTORET <> '') then
    FAUTORET = CAST(AUTORET AS DATE);
else
    FAUTORET = '9999/12/31';
EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'ANALISIS DE CARTERA CON FECHA FACTURA O VENCIMIENTO') returning_values (VENCIMIENTO);
EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'INCLUIR ANTICIPOS DE CLIENTES EN REPORTES Y CONSULTAS DE CARTERA') returning_values (INCLANTI);
EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'DESCONTAR RECIBOS PROVISIONALES EN INFORMES DE CARTERA') RETURNING_VALUES (:descnt_prov);

FOR select T.TERC_NIT, TERC_NOM, TERC_DV, CLSU_TEL, CLSU_CIUDAD, S.COBR_COD, S.ZONA_COD, T.CIUD_COD, CLIE_CUPO, CLIE_DIAS, CLCU_COD, CLSU_NOMBRE, t.terc_obs, C.GRCA_COD, TERC_CONTACTO, TERC_EMAIL, TERC_FAX, TERC_CEL, CLIE_COD
    from terceros T, CLIENTES C, CLIENTE_SUCURSALES S
    where C.TERC_NIT = T.TERC_NIT AND TERC_CLIE = 'S' AND S.TERC_NIT = C.TERC_NIT and T.TERC_NIT >= :NITINI AND T.TERC_NIT <= :NITFIN AND
        T.TERC_NOM >= :NOMINI AND T.TERC_NOM <= :NOMFIN AND ((:GRUPCART = 0) or (C.GRCA_COD = :GRUPCART))
    INTO :NIT, :NOMBRE, :DV, :TELEFONO, :CIUDAD, :CODCOBR, :CODZONA, :CODCIUD, :CUPO, :DIA_CAR,  :SUCURSAL, :NOMSUC, :obs, :GRUPCOD, :CONTACTO, :EMAIL, :FAX, :CEL, :CODCLI
    DO  
    BEGIN
    SELECT COBR_NOM FROM COBRADORES CB WHERE COBR_COD = :CODCOBR INTO :NOMCOBR;
    SELECT ZONA_NOM FROM ZONAS Z WHERE ZONA_COD = :CODZONA INTO :NOMZONA;
    SELECT CIUD_NOM FROM CIUDADES WHERE CIUD_COD = :CODCIUD INTO :NOMCIUD;
    SELECT GRCA_NOMBRE FROM GRUPO_CARTERA WHERE GRCA_COD = :GRUPCOD INTO :GRUPNOM;
    provisional = 0;
    MAXDIAS = 0;
    OK = 'N';
    if (AGRUPA = 'Z') then
        BEGIN
        if (GRPINI = '') then
            BEGIN
            if ((CODZONA IS NULL) or (CODZONA >= :GRPINI AND CODZONA <= :GRPFIN)) then
                OK = 'S';
            END
        ELSE
            if (CODZONA >= :GRPINI AND CODZONA <= :GRPFIN) then
                OK = 'S';
        END
    if (AGRUPA = 'I') then
        BEGIN
        if (GRPINI = '') then
            BEGIN
            if ((CODCIUD IS NULL) or (CODCIUD >= :GRPINI AND CODCIUD <= :GRPFIN)) then
                OK = 'S';
            END
        ELSE
            if (CODCIUD >= :GRPINI AND CODCIUD <= :GRPFIN) then
                OK = 'S';
        END
    if (AGRUPA = 'N') then
        OK = 'S';
    if (OK = 'S') then
        BEGIN
        DISPONIBLE = CUPO;
        CORRIENTE = 0;
        CERO = 0;
        TREINTA = 0;
        SESENTA = 0;
        NOVENTA = 0;
        CIENTOCHENTA = 0;
        DOSSETENTA = 0;
        TRESSESENTA = 0;
        /* BUSQUE EN SALDOS_DOC_CARTERA LOS QUE TENGAN SALDO > 0 */
        FOR SELECT MVCL_TIPOREF, MVCL_IDREF, MVCL_PREFREF, MVCL_NUMREF, MVCL_FECHA, MVCL_VENCE
            FROM MOVIMIENTO_CLIENTES
            WHERE TERC_NIT = :NIT AND MVCL_SUCURSAL = :SUCURSAL AND MVCL_FECHA <= :FECHA
                AND MVCL_ABONO = 'N' AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA)) AND
                ((:MONEDA = 0) or (MVCL_TRM <> 1))
            INTO :TIPO, :ID, :PREFIJO, :NUMERO, :FECDOC, :VENCE
            DO
            BEGIN
            if ((inclanti = 'SI') or (TIPO <> 45)) then
                BEGIN
                EXECUTE PROCEDURE saldo_doc_cartera(TIPO, ID, FECHA, MONEDA) returning_values (SALDO);
                if (SALDO <> 0) then
                    BEGIN
                    DISPONIBLE = DISPONIBLE - SALDO;
                    SELECT TIDO_NOMCORTO FROM TIPO_DOCUMENTO WHERE TIDO_COD = :TIPO INTO :TIPONOM;

                    if (MONEDA = 0) then
                        SELECT SUM(SDCA_RTFTE - SDCA_ABRTFTE), SUM(SDCA_RTIVA - SDCA_ABRTIVA), SUM(SDCA_RTICA - SDCA_ABRTICA)
                            FROM SALDOS_DOC_CARTERA WHERE SDCA_TIPOREF = :TIPO AND SDCA_IDREF = :ID
                            INTO :RTFTE, :RTIVA, :RTICA;
                    ELSE
                        SELECT SUM((SDCA_RTFTE - SDCA_ABRTFTE)/SDCA_TRM), SUM((SDCA_RTIVA - SDCA_ABRTIVA)/SDCA_TRM), SUM((SDCA_RTICA - SDCA_ABRTICA)/SDCA_TRM)
                            FROM SALDOS_DOC_CARTERA WHERE SDCA_TIPOREF = :TIPO AND SDCA_IDREF = :ID
                            INTO :RTFTE, :RTIVA, :RTICA;
                    if (RTFTE IS NULL) then
                        RTFTE = 0;
                    if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) THEN
                        BEGIN
                        if (RTFTE > 0) then
                            RTFTE = 0;
                        END
                    ELSE
                        BEGIN
                        if (RTFTE < 0) then
                            RTFTE = 0;
                        END
                    if (FAUTORET <= FECDOC) then
                        RTFTE = 0;
                    if (RTIVA IS NULL) then
                        RTIVA = 0;
                    if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) THEN
                        BEGIN
                        if (RTIVA > 0) then
                            RTIVA = 0;
                        END
                    ELSE
                        BEGIN
                        if (RTIVA < 0) then
                            RTIVA = 0;
                        END
                    if (RTICA IS NULL) then
                        RTICA = 0;
                    if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) THEN
                        BEGIN
                        if (RTICA > 0) then
                            RTICA = 0;
                        END
                    ELSE
                        BEGIN
                        if (RTICA < 0) then
                            RTICA = 0;
                        END
                    /* AHORA CLASIFIQUE LOS DIAS */
                    if (VENCIMIENTO = 'FECHA') then
                        DIAS = FECHA - FECDOC;
                    ELSE
                        DIAS = FECHA - VENCE;
                    if (MAXDIAS < DIAS) then
                        MAXDIAS = DIAS;
                    if (DETALLE = 'S') then
                        BEGIN
                        CORRIENTE = 0;
                        CERO = 0;
                        TREINTA = 0;
                        SESENTA = 0;
                        NOVENTA = 0;
                        CIENTOCHENTA = 0;
                        DOSSETENTA = 0;
                        tressesenta = 0;
                        END
                    if (DIAS < 0) then
                        CORRIENTE = CORRIENTE + SALDO;
                    ELSE
                        if (DIAS < DIASR) then
                            CERO = CERO + SALDO;
                        ELSE
                            if (DIAS < (DIASR * 2)) then
                                TREINTA = TREINTA + SALDO;
                            ELSE
                                if (DIAS < (DIASR * 3)) then
                                    SESENTA = SESENTA + SALDO;
                                ELSE
                                    BEGIN
                                    if (EXTENDIDA = 'N') then
                                        NOVENTA = NOVENTA + SALDO;
                                    else    
                                        BEGIN
                                        if (DIAS < (DIASR * 3) * 2) then
                                            NOVENTA = NOVENTA + SALDO;
                                        ELSE
                                            if (DIAS < (DIASR * 3) * 3) then
                                                CIENTOCHENTA = CIENTOCHENTA + SALDO;
                                            ELSE
                                                if (DIAS < (DIASR * 3) * 4) then
                                                    dossetenta = dossetenta + SALDO;
                                            ELSE
                                                tressesenta = tressesenta + SALDO;
                                        END
                                    END
                    if (DETALLE = 'S') then
                        SUSPEND;
                    END  /* SALDO */
                END  /* NO ANTICIPO */
            END  /* FOR MOV_CLI */
        /* AGREGUE LOS RECIBOS PROVISIONALES CON SIGNO NEGATIVO */
        FOR SELECT 65, MAX(P.RCPR_ID), MAX(PREF_PRE), MAX(RCPR_NUMERO), MAX(RCPR_FECHA), SUM(RPDE_ABONO* -1), SUM(RPDE_RTFTE*-1), SUM(RPDE_RTIVA*-1), SUM(RPDE_RTICA*-1), MAX(RCPR_TRM)
            FROM RECIBO_PROVISIONAL P, recibo_provisional_detalle D
            WHERE P.rcpr_id = D.rcpr_id AND P.TERC_NIT = :NIT AND D.RPDE_SUCURSAL = :SUCURSAL AND P.RCPR_FECHA <= :FECHA AND P.RCPR_ANULADO = 'N' AND
            ((RCPR_FECCRUCE IS NULL) or (RCPR_FECCRUCE > :FECHA)) AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA)) AND ((:MONEDA = 0) or (RCPR_TRM <> 1))
            GROUP BY P.rcpr_id
            INTO :TIPO, :ID, :PREFIJO, :NUMERO, :FECDOC, :PROVISIONAL, :rtfte,  :RTIVA, :RTICA, :TRM
            DO
            BEGIN
            if ((MONEDA <> 0) AND (TRM <> 0)) then
                BEGIN
                PROVISIONAL = PROVISIONAL / TRM;
                RTFTE = RTFTE / TRM;
                RTIVA = RTIVA / TRM;
                RTICA = RTICA / TRM;
                END
            if (:descnt_prov = 'NO') then
              SALDO = 0;
            else
              SALDO = :PROVISIONAL;
            SELECT TIDO_NOMCORTO FROM TIPO_DOCUMENTO WHERE TIDO_COD = :TIPO INTO :TIPONOM;
            /* CALCULE EL VENCIMIENTO DEL ULTIMO DOCUMENTO POSFECHADO */
            SELECT MAX(RPPA_FECHA) FROM recibo_provisional_pago WHERE RCPR_ID = :ID INTO :VENCE;
            DIAS = VENCE - FECHA;
            if (DETALLE = 'S') then
                BEGIN
                CORRIENTE = 0;
                CERO = 0;
                TREINTA = 0;
                SESENTA = 0;
                NOVENTA = 0;
                CIENTOCHENTA = 0;
                DOSSETENTA = 0;
                tressesenta = 0;
                END
            if (DIAS < 0) then
                CORRIENTE = CORRIENTE + SALDO;
            ELSE
                if (DIAS < DIASR) then
                    CERO = CERO + SALDO;
                ELSE
                    if (DIAS < (DIASR * 2)) then
                        TREINTA = TREINTA + SALDO;
                    ELSE
                        if (DIAS < (DIASR * 3)) then
                            SESENTA = SESENTA + SALDO;
                        ELSE
                            BEGIN
                            if (EXTENDIDA = 'N') then
                                NOVENTA = NOVENTA + SALDO;
                            else
                                BEGIN
                                if (DIAS < (DIASR * 3) * 2) then
                                    CIENTOCHENTA = CIENTOCHENTA + SALDO;
                                ELSE
                                    if (DIAS < (DIASR * 3) * 3) then
                                        DOSSETENTA = DOSSETENTA + SALDO;
                                    ELSE
                                        TRESSESENTA = TRESSESENTA + SALDO;
                                END
                            END
            if (DETALLE = 'S') then
                SUSPEND;
            END
        if (DETALLE = 'N') then
            begin
            SALDO = CORRIENTE + CERO + TREINTA + SESENTA + NOVENTA;
            DIAS = MAXDIAS;
            SUSPEND;
            end
        END
    if (AGRUPA = 'C') then
        BEGIN
        FOR SELECT DISTINCT COBR_COD FROM MOVIMIENTO_CLIENTES
            WHERE TERC_NIT = :NIT AND MVCL_SUCURSAL = :SUCURSAL AND MVCL_FECHA <= :FECHA
                AND MVCL_ABONO = 'N' AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA)) AND
                ((:MONEDA = 0) or (MVCL_TRM <> 1))
            INTO :codcobr
            DO
            BEGIN
            OK = 'N';
            if (GRPINI = '') then
                BEGIN
                if ((CODCOBR IS NULL) or (CODCOBR >= :GRPINI AND CODCOBR <= :GRPFIN)) then
                    OK = 'S';
                END
            ELSE
                if (CODCOBR >= :GRPINI AND CODCOBR <= :GRPFIN) then
                    OK = 'S';
            if (OK = 'S') then
                BEGIN
                DISPONIBLE = CUPO;
                CORRIENTE = 0;
                CERO = 0;
                TREINTA = 0;
                SESENTA = 0;
                NOVENTA = 0;
                CIENTOCHENTA = 0;
                DOSSETENTA = 0;
                tressesenta = 0;
                SELECT COBR_NOM FROM COBRADORES WHERE COBR_COD = :codcobr INTO :nomcobr;
                /* BUSQUE EN SALDOS_DOC_CARTERA LOS QUE TENGAN SALDO > 0 */
                FOR SELECT MVCL_TIPOREF, MVCL_IDREF, MVCL_PREFREF, MVCL_NUMREF, MVCL_FECHA, MVCL_VENCE
                    FROM MOVIMIENTO_CLIENTES
                    WHERE TERC_NIT = :NIT AND COBR_COD = :CODCOBR AND MVCL_SUCURSAL = :SUCURSAL AND MVCL_FECHA <= :FECHA
                        AND MVCL_ABONO = 'N' AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA))
                    INTO :TIPO, :ID, :PREFIJO, :NUMERO, :FECDOC, :VENCE
                    DO
                    BEGIN
                    if ((inclanti = 'SI') or (TIPO <> 45)) then
                        BEGIN
                        EXECUTE PROCEDURE saldo_doc_cartera(TIPO, ID, FECHA, MONEDA) returning_values (SALDO);
                        if (SALDO <> 0) then
                            BEGIN
                            DISPONIBLE = DISPONIBLE - SALDO;
                            SELECT TIDO_NOMCORTO FROM TIPO_DOCUMENTO WHERE TIDO_COD = :TIPO INTO :TIPONOM;
                            if (MONEDA = 0) then
                                SELECT SUM(SDCA_RTFTE - SDCA_ABRTFTE), SUM(SDCA_RTIVA - SDCA_ABRTIVA), SUM(SDCA_RTICA - SDCA_ABRTICA)
                                    FROM SALDOS_DOC_CARTERA WHERE SDCA_TIPOREF = :TIPO AND SDCA_IDREF = :ID
                                    INTO :RTFTE, :RTIVA, :RTICA;
                            ELSE
                                SELECT SUM((SDCA_RTFTE - SDCA_ABRTFTE)/SDCA_TRM), SUM((SDCA_RTIVA - SDCA_ABRTIVA)/SDCA_TRM), SUM((SDCA_RTICA - SDCA_ABRTICA)/SDCA_TRM)
                                    FROM SALDOS_DOC_CARTERA WHERE SDCA_TIPOREF = :TIPO AND SDCA_IDREF = :ID
                                    INTO :RTFTE, :RTIVA, :RTICA;
                            if (RTFTE IS NULL) then
                                RTFTE = 0;
                            if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) THEN
                                BEGIN
                                if (RTFTE > 0) then
                                    RTFTE = 0;
                                END
                            ELSE
                                BEGIN
                                if (RTFTE < 0) then
                                    RTFTE = 0;
                                END
                            if (FAUTORET <= FECDOC) then
                                RTFTE = 0;
                            if (RTIVA IS NULL) then
                                RTIVA = 0;
                            if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) THEN
                                BEGIN
                                if (RTIVA > 0) then
                                    RTIVA = 0;
                                END
                            ELSE
                                BEGIN
                                if (RTIVA < 0) then
                                    RTIVA = 0;
                                END
                            if (RTICA IS NULL) then
                                RTICA = 0;
                            if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) THEN
                                BEGIN
                                if (RTICA > 0) then
                                    RTICA = 0;
                                END
                            ELSE
                                BEGIN
                                if (RTICA < 0) then
                                    RTICA = 0;
                                END
                            /* AHORA CLASIFIQUE LOS DIAS */
                            if (VENCIMIENTO = 'FECHA') then
                                DIAS = FECHA - FECDOC;
                            ELSE
                                DIAS = FECHA - VENCE;
                            if (MAXDIAS < DIAS) then
                                MAXDIAS = DIAS;
                            if (DETALLE = 'S') then
                                BEGIN
                                CORRIENTE = 0;
                                CERO = 0;
                                TREINTA = 0;
                                SESENTA = 0;
                                NOVENTA = 0;
                                CIENTOCHENTA = 0;
                                DOSSETENTA = 0;
                                tressesenta = 0;
                                END
                            if (DIAS < 0) then
                                CORRIENTE = CORRIENTE + SALDO;
                            ELSE
                                if (DIAS < DIASR) then
                                    CERO = CERO + SALDO;
                                ELSE
                                    if (DIAS < (DIASR * 2)) then
                                        TREINTA = TREINTA + SALDO;
                                    ELSE
                                        if (DIAS < (DIASR * 3)) then
                                            SESENTA = SESENTA + SALDO;
                                        ELSE
                                            BEGIN
                                            if (EXTENDIDA = 'N') then
                                                NOVENTA = NOVENTA + SALDO;
                                            else    
                                                BEGIN
                                                if (DIAS < (DIASR * 3) * 2) then
                                                    CIENTOCHENTA = CIENTOCHENTA + SALDO;
                                                ELSE
                                                    if (DIAS < (DIASR * 3) * 3) then
                                                        DOSSETENTA = DOSSETENTA + SALDO;
                                                    ELSE
                                                        TRESSESENTA = TRESSESENTA + SALDO;
                                                END
                                            END
                            if (DETALLE = 'S') then
                                SUSPEND;
                            END  /* SALDO <>  0 */
                        END  /* NO ANTICIPO */
                    END  /* FOR MOV_CLI */
                /* AGREGUE LOS RECIBOS PROVISIONALES CON SIGNO NEGATIVO */
                FOR SELECT 65, MAX(P.RCPR_ID), MAX(PREF_PRE), MAX(RCPR_NUMERO), MAX(RCPR_FECHA), SUM(RPDE_ABONO * -1), SUM(RPDE_RTFTE*-1), SUM(RPDE_RTIVA*-1), SUM(RPDE_RTICA*-1), MAX(RCPR_TRM)
                    FROM RECIBO_PROVISIONAL P, recibo_provisional_detalle D
                    WHERE P.rcpr_id = D.rcpr_id AND P.TERC_NIT = :NIT AND RPDE_SUCURSAL = :SUCURSAL AND P.VEND_COD = :CODCOBR AND P.RCPR_FECHA <= :FECHA AND P.RCPR_ANULADO = 'N' AND
                    ((RCPR_FECCRUCE IS NULL) or (RCPR_FECCRUCE > :FECHA)) AND ((SUCU_ID = :SUBEMPRESA) OR (:SUBEMPRESA = 0)) AND ((:MONEDA = 0) or (RCPR_TRM <> 1))
                    GROUP BY P.rcpr_id
                    INTO :TIPO, :ID, :PREFIJO, :NUMERO, :FECDOC, :PROVISIONAL, :rtfte,  :RTIVA, :RTICA, :TRM
                    DO
                    BEGIN
                    if ((MONEDA <> 0) AND (TRM <> 0)) then
                        BEGIN
                        PROVISIONAL = PROVISIONAL / TRM;
                        RTFTE = RTFTE / TRM;
                        RTIVA = RTIVA / TRM;
                        RTICA = RTICA / TRM;
                        END
                    if (:descnt_prov = 'NO') then
                      SALDO = 0;
                    else
                      SALDO = :PROVISIONAL;
                    SELECT TIDO_NOMCORTO FROM TIPO_DOCUMENTO WHERE TIDO_COD = :TIPO INTO :TIPONOM;
                    /* CALCULE EL VENCIMIENTO DEL ULTIMO DOCUMENTO POSFECHADO */
                    SELECT MAX(RPPA_FECHA) FROM recibo_provisional_pago WHERE RCPR_ID = :ID INTO :VENCE;
                    DIAS = VENCE - FECHA;
                    if (DETALLE = 'S') then
                        BEGIN
                        CORRIENTE = 0;
                        CERO = 0;
                        TREINTA = 0;
                        SESENTA = 0;
                        NOVENTA = 0;
                        CIENTOCHENTA = 0;
                        DOSSETENTA = 0;
                        tressesenta = 0;
                        END
                    if (DIAS < 0) then
                        CORRIENTE = CORRIENTE + SALDO;
                    ELSE
                        if (DIAS < DIASR) then
                            CERO = CERO + SALDO;
                        ELSE
                            if (DIAS < (DIASR * 2)) then
                                TREINTA = TREINTA + SALDO;
                            ELSE
                                if (DIAS < (DIASR * 3)) then
                                    SESENTA = SESENTA + SALDO;
                                ELSE
                                    BEGIN
                                    if (EXTENDIDA = 'N') then
                                        NOVENTA = NOVENTA + SALDO;
                                    else    
                                        BEGIN
                                        if (DIAS < (DIASR * 3) * 2) then
                                            CIENTOCHENTA = CIENTOCHENTA + SALDO;
                                        ELSE
                                            if (DIAS < (DIASR * 3) * 3) then
                                                DOSSETENTA = DOSSETENTA + SALDO;
                                            ELSE
                                                TRESSESENTA = TRESSESENTA + SALDO;
                                        END
                                    END
                    if (DETALLE = 'S') then
                        SUSPEND;
                    END
                if (DETALLE = 'N') then
                    begin
                    SALDO = CORRIENTE + CERO + TREINTA + SESENTA + NOVENTA;
                    DIAS = MAXDIAS;
                    SUSPEND;
                    end
                END
            END  /* FOR COBRADOR */
        END
    END  /* FOR NIT */
SUSPEND;
END

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE REP_CARTERA_CLIENTES(
    DESDE VARCHAR(20),
    HASTA VARCHAR(20),
    GRPINI VARCHAR(5),
    GRPFIN VARCHAR(5),
    FECHA DATE,
    ORDEN CHAR(1),
    AGRUPA CHAR(1),
    SUBEMPRESA INTEGER,
    GRUPCART INTEGER,
    MONEDA INTEGER)
RETURNS (
    NIT VARCHAR(20),
    NOMBRE VARCHAR(60),
    DIR VARCHAR(60),
    TELEFONO VARCHAR(40),
    CIUDAD VARCHAR(40),
    CONTACTO VARCHAR(60),
    EMAIL VARCHAR(100),
    FAX VARCHAR(25),
    CEL VARCHAR(25),
    CODCLI VARCHAR(20),
    CODZONA VARCHAR(2),
    NOMZONA VARCHAR(60),
    CODCOBR INTEGER,
    NOMCOBR VARCHAR(60),
    SUCURSAL VARCHAR(10),
    NOMSUC VARCHAR(60),
    DV CHAR(1),
    CODCIUD CHAR(5),
    NOMCIUD VARCHAR(60),
    TIPO INTEGER,
    ID INTEGER,
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(6),
    CONCEPTO VARCHAR(60),
    SALDO NUMERIC(18,2),
    PROVISIONAL NUMERIC(18,2),
    RTFTE NUMERIC(18,2),
    RTIVA NUMERIC(18,2),
    RTICA NUMERIC(18,2),
    DTOF NUMERIC(18,2),
    TIPONOM VARCHAR(8),
    FECDOC DATE,
    VENCE DATE,
    DIAS INTEGER,
    CUPO NUMERIC(18,2),
    DISPONIBLE NUMERIC(18,2),
    NOTA VARCHAR(256),
    OBS BLOB SUB_TYPE 0 SEGMENT SIZE 80,
    GRUPCOD INTEGER,
    GRUPNOM VARCHAR(30))
AS
DECLARE VARIABLE NITINI VARCHAR(20);
DECLARE VARIABLE NITFIN VARCHAR(20);
DECLARE VARIABLE NOMINI VARCHAR(20);
DECLARE VARIABLE NOMFIN VARCHAR(20);
DECLARE VARIABLE OK CHAR(1);
DECLARE VARIABLE FOV CHAR(11);
DECLARE VARIABLE DTOAPL NUMERIC(18,2);
DECLARE VARIABLE FECDTO DATE;
DECLARE VARIABLE FECNOTA VARCHAR(10);
DECLARE VARIABLE AUXNOTA VARCHAR(256);
DECLARE VARIABLE IDNOTA INTEGER;
declare variable descnt_prov char(2);
declare variable AUTORET VARCHAR(10);
declare variable FAUTORET DATE;
declare variable INCLANTI CHAR(2);
DECLARE VARIABLE TRM NUMERIC(18,2);
BEGIN
if (ORDEN = 'C') then
    BEGIN
    NITINI = DESDE;
    NITFIN = HASTA;
    NOMINI = '';
    NOMFIN = 'zz';
    END
ELSE
    BEGIN
    NOMINI = DESDE;
    NOMFIN = HASTA;
    NITINI = '';
    NITFIN = 'zz';
    END
  EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'DESCONTAR RECIBOS PROVISIONALES EN INFORMES DE CARTERA') RETURNING_VALUES (:descnt_prov);
  EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'INCLUIR ANTICIPOS DE CLIENTES EN REPORTES Y CONSULTAS DE CARTERA') returning_values (INCLANTI);
  EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'FECHA AUTORETENEDOR NO DESCONTAR RETENCIONES DEL SALDO PERO SI CONTABILIZARLAS') returning_values (AUTORET);
  if (AUTORET <> '') then
    FAUTORET = CAST(AUTORET AS DATE);
  else
    FAUTORET = '9999/12/31';
  /* Ubique el NIT */
  FOR select C.TERC_NIT, TERC_NOM, TERC_DV, CLSU_DIR, CLSU_TEL, CLSU_CIUDAD, S.COBR_COD, S.ZONA_COD, T.CIUD_COD, CLIE_CUPO, CLCU_COD, CLSU_NOMBRE, t.terc_obs, C.GRCA_COD, TERC_CONTACTO, TERC_EMAIL, TERC_FAX, TERC_CEL, CLIE_COD
    from terceros T, CLIENTES C, CLIENTE_SUCURSALES S
    where C.TERC_NIT = T.TERC_NIT AND TERC_CLIE = 'S' AND S.TERC_NIT = C.TERC_NIT AND C.TERC_NIT >= :NITINI AND C.TERC_NIT <= :NITFIN AND
        TERC_NOM >= :NOMINI AND TERC_NOM <= :NOMFIN AND ((:GRUPCART = 0) or (C.GRCA_COD = :GRUPCART))
    INTO :NIT, :NOMBRE, :DV, :DIR, :TELEFONO, :CIUDAD, :CODCOBR, :CODZONA, :CODCIUD, :CUPO, :SUCURSAL, :NOMSUC, :obs, :GRUPCOD, :CONTACTO, :EMAIL, :FAX, :CEL, :CODCLI
    DO  
    BEGIN
    if (CODCOBR IS NOT NULL) then
        SELECT COBR_NOM FROM COBRADORES  WHERE COBR_COD = :CODCOBR INTO :NOMCOBR;
    if (CODZONA IS NOT NULL) then
        SELECT ZONA_NOM FROM ZONAS WHERE ZONA_COD = :CODZONA INTO :NOMZONA;
    if (CODCIUD IS NOT NULL) then
        SELECT CIUD_NOM FROM CIUDADES  WHERE CIUD_COD = :CODCIUD INTO :NOMCIUD;
    SELECT GRCA_NOMBRE FROM GRUPO_CARTERA WHERE GRCA_COD = :GRUPCOD INTO :GRUPNOM;
    DISPONIBLE = CUPO;
    OK = 'N';
    if (AGRUPA = 'Z') then
        BEGIN
        if (GRPINI = '') then
            BEGIN
            if ((CODZONA IS NULL) or (CODZONA >= :GRPINI AND CODZONA <= :GRPFIN)) then
                OK = 'S';
            END
        ELSE
            if (CODZONA >= :GRPINI AND CODZONA <= :GRPFIN) then
                OK = 'S';
        END
    if (AGRUPA = 'I') then
        BEGIN
        if (GRPINI = '') then
            BEGIN
            if ((CODCIUD IS NULL) or (CODCIUD >= :GRPINI AND CODCIUD <= :GRPFIN)) then
                OK = 'S';
            END
        ELSE
            if (CODCIUD >= :GRPINI AND CODCIUD <= :GRPFIN) then
                OK = 'S';
        END
    if (AGRUPA = 'N') then
        OK = 'S';
        
    if (OK = 'S') then
        BEGIN
        /* BUSQUE EN SALDOS_DOC_CARTERA LOS QUE TENGAN SALDO > 0 */
        FOR SELECT MVCL_TIPOREF, MVCL_IDREF, MVCL_PREFREF, MVCL_NUMREF, MVCL_FECHA, MVCL_VENCE, MVCL_CONC
            FROM MOVIMIENTO_CLIENTES WHERE TERC_NIT = :NIT AND MVCL_SUCURSAL = :SUCURSAL AND MVCL_FECHA <= :FECHA AND
            MVCL_ABONO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) AND ((:MONEDA = 0) or (MVCL_TRM <> 1))
            INTO :TIPO, :ID, :PREFIJO, :NUMERO, :FECDOC, :VENCE, :CONCEPTO
            DO
            BEGIN
            if ((inclanti = 'SI') or (TIPO <> 45)) then
                BEGIN
                EXECUTE PROCEDURE saldo_doc_cartera(TIPO, ID, FECHA, MONEDA) returning_values (SALDO);
                if (SALDO <> 0) then
                    BEGIN
                    PROVISIONAL = 0;
                    EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'ANALISIS DE CARTERA CON FECHA FACTURA O VENCIMIENTO') RETURNING_VALUES (FOV);
                    if (FOV = 'FECHA') then
                       DIAS = FECHA - FECDOC;
                    ELSE
                      DIAS = FECHA - VENCE;
                    DISPONIBLE = DISPONIBLE - SALDO;
                    SELECT TIDO_NOMCORTO FROM TIPO_DOCUMENTO WHERE TIDO_COD = :TIPO INTO :TIPONOM;
                    if (TIPO = 41) then
                        SELECT NDCL_DTOFMONTO, NDCL_FECHADTO, NDCL_TRM FROM NOTAS_DEBITO_CLIENTES
                            WHERE NDCL_ID = :ID INTO :DTOF, :FECDTO, :TRM;
                    if (TIPO = 42) then
                        SELECT 0, :FECDOC, 1 FROM NOTAS_CREDITO_CLIENTES
                            WHERE NCCL_ID = :ID INTO :DTOF, :FECDTO, :TRM;
                    if (TIPO = 45) then
                        SELECT ANCL_DTOFMONTO, ANCL_DTOFECHA, ANCL_TRM FROM ANTICIPOS_CLIENTE
                            WHERE ANCL_ID = :ID INTO :DTOF, :FECDTO, :TRM;
                    if (TIPO = 31) then
                        SELECT FACT_DTOFMONTO, FACT_DTOFFECHA, FACT_TRM FROM FACTURAS
                            WHERE FACT_ID = :ID INTO :DTOF, :FECDTO, :TRM;
                    if (TIPO = 33) then
                        SELECT 0, :FECDOC, 1 FROM devoluciones_ventas
                            WHERE DEVT_ID = :ID INTO :DTOF, :FECDTO, :TRM;
                    if ((MONEDA <> 0) AND (TRM <> 0)) then
                        DTOF = DTOF / TRM;
                    if (DTOF IS NULL) then
                        DTOF = 0;
                    if (DTOF <> 0) then
                        BEGIN
                        SELECT SUM(RCDE_DTOF), MAX(RECA_TRM) FROM RECIBOS_CAJA_DETALLE D, RECIBOS_CAJA R
                            WHERE R.reca_id = D.reca_id AND RCDE_IDDOC = :ID AND RCDE_TIPODOC = :TIPO
                            INTO :DTOAPL, :TRM;
                        if (DTOAPL IS NULL) then
                            DTOAPL = 0;
                        if ((MONEDA <> 0) AND (TRM <> 1)) then
                            DTOAPL = DTOAPL / TRM;
                        DTOF = DTOF - DTOAPL;
                        /* SI YA SE VENCIO DEJELO EN CERO */
                        if (FECDTO < FECHA) then
                            DTOF = 0;
                        END
                    if (MONEDA = 0) then
                        SELECT SUM(SDCA_RTFTE - SDCA_ABRTFTE), SUM(SDCA_RTIVA - SDCA_ABRTIVA), SUM(SDCA_RTICA - SDCA_ABRTICA)
                            FROM SALDOS_DOC_CARTERA WHERE SDCA_TIPOREF = :TIPO AND SDCA_IDREF = :ID
                            INTO :RTFTE, :RTIVA, :RTICA;
                    ELSE
                        SELECT SUM((SDCA_RTFTE - SDCA_ABRTFTE)/SDCA_TRM), SUM((SDCA_RTIVA - SDCA_ABRTIVA)/SDCA_TRM), SUM((SDCA_RTICA - SDCA_ABRTICA)/SDCA_TRM)
                            FROM SALDOS_DOC_CARTERA WHERE SDCA_TIPOREF = :TIPO AND SDCA_IDREF = :ID
                            INTO :RTFTE, :RTIVA, :RTICA;
                    if (RTFTE IS NULL) then
                        RTFTE = 0;
                    if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) THEN
                        BEGIN
                        if (RTFTE > 0) then
                            RTFTE = 0;
                        END
                    ELSE
                        BEGIN
                        if (RTFTE < 0) then
                            RTFTE = 0;
                        END
                    if (RTIVA IS NULL) then
                        RTIVA = 0;
                    if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) THEN
                        BEGIN
                        if (RTIVA > 0) then
                            RTIVA = 0;
                        END
                    ELSE
                        BEGIN
                        if (RTIVA < 0) then
                            RTIVA = 0;
                        END
                    if (RTICA IS NULL) then
                        RTICA = 0;
                    if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) THEN
                        BEGIN
                        if (RTICA > 0) then
                            RTICA = 0;
                        END
                    ELSE
                        BEGIN
                        if (RTICA < 0) then
                            RTICA = 0;
                        END
                    if (FAUTORET <= FECDOC) then
                        RTFTE = 0;
                    /* SI TIENE NOTA AGREGUELA */
                    SELECT MAX(NOCL_ID) FROM NOTAS_CLIENTES WHERE TERC_NIT = :NIT AND CLSU_COD = :SUCURSAL AND NOCL_TIPODOC = :TIPO AND NOCL_IDDOC = :ID INTO :IDNOTA;
                    if (IDNOTA IS NOT NULL) then
                        BEGIN
                        SELECT cast(NOCL_FECHA as char(10)), NOCL_TEXTO FROM NOTAS_CLIENTES
                            WHERE NOCL_ID = :IDNOTA INTO :FECNOTA, :AUXNOTA;
                        if (STRLEN(AUXNOTA) < 244) then
                            NOTA = FECNOTA || ':' || AUXNOTA;
                        ELSE
                            NOTA = AUXNOTA;
                        END
                    else
                        NOTA = '';
                    SUSPEND;
                    END  /* SALDO <> 0 */
                END  /* NO ANTICIPO */
            END  /* FOR */
        /* AGREGUE LOS RECIBOS PROVISIONALES CON SIGNO NEGATIVO */
        FOR SELECT 65, MAX(P.RCPR_ID), MAX(PREF_PRE), MAX(RCPR_NUMERO), MAX(RCPR_FECHA), MAX(RCPR_CONC), SUM(RPDE_ABONO * -1), SUM(RPDE_RTFTE*-1), SUM(RPDE_RTIVA*-1), SUM(RPDE_RTICA*-1), MAX(RCPR_TRM)
            FROM RECIBO_PROVISIONAL P, recibo_provisional_detalle D
            WHERE P.rcpr_id = D.rcpr_id AND P.TERC_NIT = :NIT AND RCPR_FECHA <= :FECHA AND RCPR_ANULADO = 'N' AND
            ((RCPR_FECCRUCE IS NULL) or (RCPR_FECCRUCE > :FECHA)) AND RPDE_SUCURSAL = :SUCURSAL AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY P.rcpr_id
            INTO :TIPO, :ID, :PREFIJO, :NUMERO, :FECDOC, :CONCEPTO, :PROVISIONAL, :rtfte,  :RTIVA, :RTICA, :TRM
            DO
            BEGIN
            if ((MONEDA <> 0) AND (TRM <> 0)) then
                PROVISIONAL = PROVISIONAL / TRM;
            if (:descnt_prov = 'NO') then
              SALDO = 0;
            else
              SALDO = :PROVISIONAL;
            SELECT TIDO_NOMCORTO FROM TIPO_DOCUMENTO WHERE TIDO_COD = :TIPO INTO :TIPONOM;
            /* CALCULE EL VENCIMIENTO DEL ULTIMO DOCUMENTO POSFECHADO */
            SELECT MAX(RPPA_FECHA) FROM recibo_provisional_pago WHERE RCPR_ID = :ID INTO :VENCE;
            DIAS = VENCE - FECHA;
            SUSPEND;
            END
        END
    if (AGRUPA = 'C') then
        BEGIN
        FOR SELECT DISTINCT COBR_COD FROM MOVIMIENTO_CLIENTES
            WHERE TERC_NIT = :NIT AND MVCL_SUCURSAL = :SUCURSAL AND MVCL_FECHA <= :FECHA AND
            MVCL_ABONO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            INTO :codcobr
            DO
            BEGIN
            OK = 'N';
            if (GRPINI = '') then
                BEGIN
                if ((CODCOBR IS NULL) or (CODCOBR >= :GRPINI AND CODCOBR <= :GRPFIN)) then
                    OK = 'S';
                END
            ELSE
                if (CODCOBR >= :GRPINI AND CODCOBR <= :GRPFIN) then
                    OK = 'S';
            if (OK = 'S') then
                BEGIN
                SELECT COBR_NOM FROM COBRADORES  WHERE COBR_COD = :CODCOBR INTO :NOMCOBR;
                /* BUSQUE EN SALDOS_DOC_CARTERA LOS QUE TENGAN SALDO > 0 */
                FOR SELECT MVCL_TIPOREF, MVCL_IDREF, MVCL_PREFREF, MVCL_NUMREF, MVCL_FECHA, MVCL_VENCE, MVCL_CONC
                    FROM MOVIMIENTO_CLIENTES WHERE TERC_NIT = :NIT AND MVCL_SUCURSAL = :SUCURSAL AND MVCL_FECHA <= :FECHA AND
                    MVCL_ABONO = 'N' AND COBR_COD = :codcobr AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) AND
                    ((:MONEDA = 0) or (MVCL_TRM <> 1))
                    INTO :TIPO, :ID, :PREFIJO, :NUMERO, :FECDOC, :VENCE, :CONCEPTO
                    DO
                    BEGIN
                    if ((inclanti = 'SI') or (TIPO <> 45)) then
                        BEGIN
                        EXECUTE PROCEDURE saldo_doc_cartera(TIPO, ID, FECHA, MONEDA) returning_values (SALDO);
                        if (SALDO <> 0) then
                            BEGIN
                            PROVISIONAL = 0;
                            EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'ANALISIS DE CARTERA CON FECHA FACTURA O VENCIMIENTO') RETURNING_VALUES (FOV);
                            if (FOV = 'FECHA') then
                               DIAS = FECHA - FECDOC;
                            ELSE
                              DIAS = FECHA - VENCE;
                            DISPONIBLE = DISPONIBLE - SALDO;
                            SELECT TIDO_NOMCORTO FROM TIPO_DOCUMENTO WHERE TIDO_COD = :TIPO INTO :TIPONOM;
                            if (TIPO = 41) then
                                SELECT NDCL_DTOFMONTO, NDCL_FECHADTO, NDCL_TRM FROM NOTAS_DEBITO_CLIENTES
                                    WHERE NDCL_ID = :ID INTO :DTOF, :FECDTO, :TRM;
                            if (TIPO = 42) then
                                SELECT 0, :FECDOC, 1 FROM NOTAS_CREDITO_CLIENTES
                                    WHERE NCCL_ID = :ID INTO :DTOF, :FECDTO, :TRM;
                            if (TIPO = 45) then
                                SELECT ANCL_DTOFMONTO, ANCL_DTOFECHA, ANCL_TRM FROM ANTICIPOS_CLIENTE
                                    WHERE ANCL_ID = :ID INTO :DTOF, :FECDTO, :TRM;
                            if (TIPO = 31) then
                                SELECT FACT_DTOFMONTO, FACT_DTOFFECHA, FACT_TRM FROM FACTURAS
                                    WHERE FACT_ID = :ID INTO :DTOF, :FECDTO, :TRM;
                            if (TIPO = 33) then
                                SELECT 0, :FECDOC, 1 FROM devoluciones_ventas
                                    WHERE DEVT_ID = :ID INTO :DTOF, :FECDTO, :TRM;
                            if (DTOF IS NULL) then
                                DTOF = 0;
                            if ((MONEDA <> 0) AND (TRM <> 0)) then
                                DTOF = DTOF / TRM;
                            if (DTOF <> 0) then
                                BEGIN
                                SELECT SUM(RCDE_DTOF) FROM RECIBOS_CAJA_DETALLE WHERE RCDE_IDDOC = :ID AND RCDE_TIPODOC = :TIPO INTO :DTOAPL;
                                if (DTOAPL IS NULL) then
                                    DTOAPL = 0;
                                DTOF = DTOF - DTOAPL;
                                /* SI YA SE VENCIO DEJELO EN CERO */
                                if (FECDTO < FECHA) then
                                    DTOF = 0;
                                END
                            SELECT SUM(SDCA_RTFTE - SDCA_ABRTFTE), SUM(SDCA_RTIVA - SDCA_ABRTIVA), SUM(SDCA_RTICA - SDCA_ABRTICA)
                                FROM SALDOS_DOC_CARTERA WHERE SDCA_TIPOREF = :TIPO AND SDCA_IDREF = :ID INTO :RTFTE, :RTIVA, :RTICA;
                            if (RTFTE IS NULL) then
                                RTFTE = 0;
                            if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) THEN
                                BEGIN
                                if (RTFTE > 0) then
                                    RTFTE = 0;
                                END
                            ELSE
                                BEGIN
                                if (RTFTE < 0) then
                                    RTFTE = 0;
                                END
                            if (FAUTORET <= FECDOC) then
                                RTFTE = 0;
                            if (RTIVA IS NULL) then
                                RTIVA = 0;
                            if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) THEN
                                BEGIN
                                if (RTIVA > 0) then
                                    RTIVA = 0;
                                END
                            ELSE
                                BEGIN
                                if (RTIVA < 0) then
                                    RTIVA = 0;
                                END
                            if (RTICA IS NULL) then
                                RTICA = 0;
                            if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) THEN
                                BEGIN
                                if (RTICA > 0) then
                                    RTICA = 0;
                                END
                            ELSE
                                BEGIN
                                if (RTICA < 0) then
                                    RTICA = 0;
                                END
                            /* SI TIENE NOTA AGREGUELA */
                            SELECT MAX(NOCL_FECHA) FROM NOTAS_CLIENTES WHERE TERC_NIT = :NIT AND CLSU_COD = :SUCURSAL AND NOCL_TIPODOC = :TIPO AND NOCL_IDDOC = :ID INTO :FECDTO;
                            if (FECDTO IS NOT NULL) then
                                BEGIN
                                SELECT cast(NOCL_FECHA as char(10)), NOCL_TEXTO FROM NOTAS_CLIENTES
                                    WHERE NOCL_ID = :IDNOTA INTO :FECNOTA, :AUXNOTA;
                                if (STRLEN(AUXNOTA) < 244) then
                                    NOTA = FECNOTA || ':' || AUXNOTA;
                                ELSE
                                    NOTA = AUXNOTA;
                                END
                            else
                                NOTA = '';
                            SUSPEND;
                            END  /* SALDO <> 0 */
                        END  /* NO ANTICIPO */
                    END  /* FOR */
                /* AGREGUE LOS RECIBOS PROVISIONALES CON SIGNO NEGATIVO */
                FOR SELECT 65, MAX(P.RCPR_ID), MAX(PREF_PRE), MAX(RCPR_NUMERO), MAX(RCPR_FECHA), MAX(RCPR_CONC), SUM(RPDE_ABONO * -1), SUM(RPDE_RTFTE*-1), SUM(RPDE_RTIVA*-1), SUM(RPDE_RTICA*-1), MAX(RCPR_TRM)
                    FROM RECIBO_PROVISIONAL P, recibo_provisional_detalle D
                    WHERE P.rcpr_id = D.rcpr_id AND P.TERC_NIT = :NIT AND P.VEND_COD = :codcobr AND RCPR_FECHA <= :FECHA AND RCPR_ANULADO = 'N' AND
                    ((RCPR_FECCRUCE IS NULL) or (RCPR_FECCRUCE > :FECHA)) AND RPDE_SUCURSAL = :SUCURSAL AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                    GROUP BY P.rcpr_id
                    INTO :TIPO, :ID, :PREFIJO, :NUMERO, :FECDOC, :CONCEPTO, :PROVISIONAL, :rtfte,  :RTIVA, :RTICA, :TRM
                    DO
                    BEGIN
                    if ((MONEDA <> 0) AND (TRM <> 0)) then
                        PROVISIONAL = PROVISIONAL / TRM;
                    if (:descnt_prov = 'NO') then
                      SALDO = 0;
                    else
                      SALDO = :PROVISIONAL;
                    SELECT TIDO_NOMCORTO FROM TIPO_DOCUMENTO WHERE TIDO_COD = :TIPO INTO :TIPONOM;
                    /* CALCULE EL VENCIMIENTO DEL ULTIMO DOCUMENTO POSFECHADO */
                    SELECT MAX(RPPA_FECHA) FROM recibo_provisional_pago WHERE RCPR_ID = :ID INTO :VENCE;
                    DIAS = VENCE - FECHA;
                    SUSPEND;
                    END
                END /* ok */
            END  /* FOR COBR */
        END  /* AGRUPA = C */
    END  /* FOR NIT */
SUSPEND;
END

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE REP_CARTERA_CONSOLIDADA(
    DESDE VARCHAR(20),
    HASTA VARCHAR(20),
    GRPINI VARCHAR(5),
    GRPFIN VARCHAR(5),
    FECHA DATE,
    ORDEN CHAR(1),
    AGRUPA CHAR(1),
    SUBEMPRESA INTEGER,
    GRUPCART INTEGER,
    MONEDA INTEGER)
RETURNS (
    NIT VARCHAR(20),
    NOMBRE VARCHAR(60),
    TELEFONO VARCHAR(40),
    CIUDAD VARCHAR(40),
    EMAIL VARCHAR(100),
    FAX VARCHAR(25),
    CEL VARCHAR(25),
    CODCLI VARCHAR(20),
    CODZONA VARCHAR(2),
    NOMZONA VARCHAR(60),
    CODCOBR INTEGER,
    NOMCOBR VARCHAR(60),
    SUCURSAL VARCHAR(10),
    DV CHAR(1),
    CODCIUD CHAR(5),
    NOMCIUD VARCHAR(60),
    SALDO NUMERIC(18,2),
    RTFTE NUMERIC(18,2),
    RTIVA NUMERIC(18,2),
    RTICA NUMERIC(18,2),
    DTOF NUMERIC(18,2),
    CUPO NUMERIC(18,2),
    DISPONIBLE NUMERIC(18,2),
    PROVISIONAL NUMERIC(18,2),
    CONTACTO VARCHAR(60),
    ESTADO CHAR(1),
    GRUPCOD INTEGER,
    GRUPNOM VARCHAR(30))
AS
declare variable NITINI VARCHAR(20);
declare variable NITFIN VARCHAR(20);
declare variable NOMINI VARCHAR(20);
declare variable NOMFIN VARCHAR(20);
declare variable OK CHAR(1);
declare variable PSALDO NUMERIC(18,2);
declare variable PRTFTE NUMERIC(18,2);
declare variable PRTIVA NUMERIC(18,2);
declare variable PRTICA NUMERIC(18,2);
declare variable PDTOF NUMERIC(18,2);
declare variable TIPO INTEGER;
declare variable ID INTEGER;
declare variable DTOAPL NUMERIC(18,2);
declare variable FECDTO DATE;
declare variable descnt_prov char(2);
declare variable AUTORET VARCHAR(10);
declare variable FAUTORET DATE;
declare variable FECDOC DATE;
declare variable INCLANTI CHAR(2);
declare variable TRM NUMERIC(18,2);
BEGIN
if (ORDEN = 'C') then
    BEGIN
    NITINI = DESDE;
    NITFIN = HASTA;
    NOMINI = '';
    NOMFIN = 'zz';
    END
ELSE
    BEGIN
    NOMINI = DESDE;
    NOMFIN = HASTA;
    NITINI = '';
    NITFIN = 'zz';
    END
  EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'DESCONTAR RECIBOS PROVISIONALES EN INFORMES DE CARTERA') RETURNING_VALUES (:descnt_prov);
  EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'INCLUIR ANTICIPOS DE CLIENTES EN REPORTES Y CONSULTAS DE CARTERA') returning_values (INCLANTI);
  EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'FECHA AUTORETENEDOR NO DESCONTAR RETENCIONES DEL SALDO PERO SI CONTABILIZARLAS') returning_values (AUTORET);
  if (AUTORET <> '') then
    FAUTORET = CAST(AUTORET AS DATE);
  else
    FAUTORET = '9999/12/31';
  /* Ubique el NIT */
  FOR select C.TERC_NIT, CLSU_NOMBRE, TERC_DV, CLSU_TEL, CLSU_CIUDAD, TERC_CONTACTO, S.COBR_COD, S.ZONA_COD, T.CIUD_COD, CLIE_CUPO, CLIE_ESTADO, CLCU_COD, C.GRCA_COD, TERC_EMAIL, TERC_FAX, TERC_CEL, CLIE_COD
    from terceros T, CLIENTES C, CLIENTE_SUCURSALES S
    where C.TERC_NIT = T.TERC_NIT AND TERC_CLIE = 'S' AND S.TERC_NIT = C.TERC_NIT AND C.TERC_NIT >= :NITINI AND C.TERC_NIT <= :NITFIN AND
        TERC_NOM >= :NOMINI AND TERC_NOM <= :NOMFIN AND ((:GRUPCART = 0) or (C.GRCA_COD = :GRUPCART))
    INTO :NIT, :NOMBRE, :DV, :TELEFONO, :CIUDAD, :CONTACTO, :CODCOBR, :CODZONA, :CODCIUD, :CUPO, :ESTADO, :SUCURSAL, :GRUPCOD, :EMAIL, :FAX, :CEL, :CODCLI
    DO  
    BEGIN
    SELECT GRCA_NOMBRE FROM GRUPO_CARTERA WHERE GRCA_COD = :GRUPCOD INTO :GRUPNOM;
    OK = 'N';
    if (AGRUPA = 'Z') then
        BEGIN
        if (GRPINI = '') then
            BEGIN
            if ((CODZONA IS NULL) or (CODZONA >= :GRPINI AND CODZONA <= :GRPFIN)) then
                OK = 'S';
            END
        ELSE
            if (CODZONA >= :GRPINI AND CODZONA <= :GRPFIN) then
                OK = 'S';
        END
    if (AGRUPA = 'I') then
        BEGIN
        if (GRPINI = '') then
            BEGIN
            if ((CODCIUD IS NULL) or (CODCIUD >= :GRPINI AND CODCIUD <= :GRPFIN)) then
                OK = 'S';
            END
        ELSE
            if (CODCIUD >= :GRPINI AND CODCIUD <= :GRPFIN) then
                OK = 'S';
        END
    if (AGRUPA = 'N') then
        OK = 'S';
        
    if (OK = 'S') then
        BEGIN
        if (CODCOBR IS NOT NULL) then
            SELECT COBR_NOM FROM COBRADORES  WHERE COBR_COD = :CODCOBR INTO :NOMCOBR;
        if (CODZONA IS NOT NULL) then
            SELECT ZONA_NOM FROM ZONAS WHERE ZONA_COD = :CODZONA INTO :NOMZONA;
        if (CODCIUD IS NOT NULL) then
            SELECT CIUD_NOM FROM CIUDADES  WHERE CIUD_COD = :CODCIUD INTO :NOMCIUD;
    
        SALDO = 0;
        RTFTE = 0;
        RTIVA = 0;
        RTICA = 0;
        DTOF = 0;
        /* BUSQUE EN SALDOS_DOC_CARTERA LOS QUE TENGAN SALDO > 0 */
        FOR SELECT MVCL_TIPOREF, MVCL_IDREF, MVCL_FECHA
          FROM MOVIMIENTO_CLIENTES WHERE TERC_NIT = :NIT AND MVCL_SUCURSAL = :SUCURSAL AND MVCL_FECHA <= :FECHA AND
          MVCL_ABONO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) AND ((:MONEDA = 0) or (MVCL_TRM <> 1))
          INTO :TIPO, :ID, :FECDOC
          DO
            BEGIN
            if ((inclanti = 'SI') or (TIPO <> 45)) then
                BEGIN
                EXECUTE PROCEDURE saldo_doc_cartera(TIPO, ID, FECHA, MONEDA) returning_values (PSALDO);
                if (PSALDO <> 0) then
                    BEGIN
                    if (TIPO = 41) then
                        SELECT NDCL_DTOFMONTO, NDCL_FECHADTO, NDCL_TRM FROM NOTAS_DEBITO_CLIENTES
                            WHERE NDCL_ID = :ID INTO :PDTOF, :FECDTO, :TRM;
                    if (TIPO = 42) then
                        SELECT 0, NCCL_FECHA, 1 FROM NOTAS_CREDITO_CLIENTES
                            WHERE NCCL_ID = :ID INTO :PDTOF, :FECDTO, :TRM;
                    if (TIPO = 45) then
                        SELECT ANCL_DTOFMONTO, ANCL_DTOFECHA, ANCL_TRM FROM ANTICIPOS_CLIENTE
                            WHERE ANCL_ID = :ID INTO :PDTOF, :FECDTO, :TRM;
                    if (TIPO = 31) then
                        SELECT FACT_DTOFMONTO, FACT_DTOFFECHA, FACT_TRM FROM FACTURAS
                            WHERE FACT_ID = :ID INTO :PDTOF, :FECDTO, :TRM;
                    if (TIPO = 33) then
                        SELECT 0, DEVT_FECHA, 1 FROM devoluciones_ventas
                            WHERE DEVT_ID = :ID INTO :PDTOF, :FECDTO, :TRM;
                    if (PDTOF IS NULL) then
                        PDTOF = 0;
                    if ((MONEDA <> 0) AND (TRM <> 0)) then
                        PDTOF = PDTOF / TRM;
                    if (PDTOF <> 0) then
                        BEGIN
                        SELECT SUM(RCDE_DTOF), MAX(RECA_TRM) FROM RECIBOS_CAJA_DETALLE D, recibos_caja R
                            WHERE R.reca_id = D.reca_id AND RCDE_IDDOC = :ID AND RCDE_TIPODOC = :TIPO INTO :DTOAPL, :TRM;
                        if (DTOAPL IS NULL) then
                            DTOAPL = 0;
                        if ((MONEDA <> 0) AND (TRM <> 0)) then
                           DTOAPL = DTOAPL / TRM;
                        PDTOF = PDTOF - DTOAPL;
                        /* SI YA SE VENCIO DEJELO EN CERO */
                        if (FECDTO < FECHA) then
                            PDTOF = 0;
                        END
                    if (MONEDA = 0) then
                        SELECT SUM(SDCA_RTFTE - SDCA_ABRTFTE), SUM(SDCA_RTIVA - SDCA_ABRTIVA), SUM(SDCA_RTICA - SDCA_ABRTICA)
                            FROM SALDOS_DOC_CARTERA WHERE SDCA_TIPOREF = :TIPO AND SDCA_IDREF = :ID
                            INTO :PRTFTE, :PRTIVA, :PRTICA;
                    ELSE
                        SELECT SUM((SDCA_RTFTE - SDCA_ABRTFTE)/SDCA_TRM), SUM((SDCA_RTIVA - SDCA_ABRTIVA)/SDCA_TRM), SUM((SDCA_RTICA - SDCA_ABRTICA)/SDCA_TRM)
                            FROM SALDOS_DOC_CARTERA WHERE SDCA_TIPOREF = :TIPO AND SDCA_IDREF = :ID
                            INTO :PRTFTE, :PRTIVA, :PRTICA;
                    if (PRTFTE IS NULL) then
                        PRTFTE = 0;
                    if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) THEN
                        BEGIN
                        if (PRTFTE > 0) then
                            PRTFTE = 0;
                        END
                    ELSE    
                        BEGIN
                        if (PRTFTE < 0) then
                            PRTFTE = 0;
                        END
                    if (PRTIVA IS NULL) then
                        PRTIVA = 0;
                    if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) THEN
                        BEGIN
                        if (PRTIVA > 0) then
                            PRTIVA = 0;
                        END
                    ELSE
                        BEGIN
                        if (PRTIVA < 0) then
                            PRTIVA = 0;
                        END
                    if (PRTICA IS NULL) then
                        PRTICA = 0;
                    if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) THEN
                        BEGIN
                        if (PRTICA > 0) then
                            PRTICA = 0;
                        END
                    ELSE
                        BEGIN
                        if (PRTICA < 0) then
                            PRTICA = 0;
                        END

                    if (FAUTORET <= FECDOC) then
                        PRTFTE = 0;

                    SALDO = SALDO + PSALDO;
                    RTFTE = RTFTE + PRTFTE;
                    RTIVA = RTIVA + PRTIVA;
                    RTICA = RTICA + PRTICA;
                    DTOF = DTOF + PDTOF;
                    END /* SALDO <> 0 */
                END  /* NO ANTICIPO */
            END
        DISPONIBLE = CUPO - SALDO;
        /* LOS RECIBOS PROVISIONALES */
        SELECT SUM(RPDE_ABONO), MAX(RCPR_TRM) FROM recibo_provisional P, recibo_provisional_detalle D
            WHERE P.rcpr_id = D.rcpr_id AND TERC_NIT = :NIT AND RPDE_SUCURSAL = :SUCURSAL AND ((:MONEDA = 0) or (RCPR_TRM <> 1)) AND
            RCPR_FECHA <= :FECHA AND RCPR_ANULADO = 'N' AND ((RCPR_FECCRUCE IS NULL) or (RCPR_FECCRUCE > :FECHA)) AND
            ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            INTO :provisional, :TRM;
        if ((MONEDA <> 0) AND (TRM <> 0)) then
            PROVISIONAL = PROVISIONAL / TRM;
           if (:descnt_prov = 'SI') then
             if (NOT :provisional is NULL) then
              SALDO = :saldo - :PROVISIONAL;
        SUSPEND;
        END
    if (AGRUPA = 'C') then
        BEGIN
        if (CODZONA IS NOT NULL) then
            SELECT ZONA_NOM FROM ZONAS WHERE ZONA_COD = :CODZONA INTO :NOMZONA;
        if (CODCIUD IS NOT NULL) then
            SELECT CIUD_NOM FROM CIUDADES  WHERE CIUD_COD = :CODCIUD INTO :NOMCIUD;
        FOR SELECT DISTINCT COBR_COD FROM MOVIMIENTO_CLIENTES WHERE TERC_NIT = :NIT AND
            MVCL_SUCURSAL = :SUCURSAL AND MVCL_FECHA <= :FECHA AND
            MVCL_ABONO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            INTO :codcobr
            DO
            begin
            OK = 'N';
            if (GRPINI = '') then
                BEGIN
                if ((CODCOBR IS NULL) or (CODCOBR >= :GRPINI AND CODCOBR <= :GRPFIN)) then
                    OK = 'S';
                END
            ELSE
                if (CODCOBR >= :GRPINI AND CODCOBR <= :GRPFIN) then
                    OK = 'S';
            if (OK = 'S') then
                BEGIN
                SELECT COBR_NOM FROM COBRADORES  WHERE COBR_COD = :CODCOBR INTO :NOMCOBR;

                SALDO = 0;
                RTFTE = 0;
                RTIVA = 0;
                RTICA = 0;
                DTOF = 0;
                /* BUSQUE EN SALDOS_DOC_CARTERA LOS QUE TENGAN SALDO > 0 */
                FOR SELECT MVCL_TIPOREF, MVCL_IDREF, MVCL_FECHA
                  FROM MOVIMIENTO_CLIENTES WHERE TERC_NIT = :NIT AND MVCL_SUCURSAL = :SUCURSAL AND ((:moneda = 0) or (mvcl_trm <> 1)) AND
                  MVCL_FECHA <= :FECHA AND COBR_COD = :codcobr AND MVCL_ABONO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                  INTO :TIPO, :ID, :FECDOC
                  DO
                    BEGIN
                    if ((inclanti = 'SI') or (TIPO <> 45)) then
                        BEGIN
                        EXECUTE PROCEDURE saldo_doc_cartera(TIPO, ID, FECHA, MONEDA) returning_values (PSALDO);
                        if (PSALDO <> 0) then
                            BEGIN
                            if (TIPO = 41) then
                                SELECT NDCL_DTOFMONTO, NDCL_FECHADTO, NDCL_TRM FROM NOTAS_DEBITO_CLIENTES
                                    WHERE NDCL_ID = :ID INTO :PDTOF, :FECDTO, :TRM;
                            if (TIPO = 42) then
                                SELECT 0, NCCL_FECHA, 1 FROM NOTAS_CREDITO_CLIENTES
                                    WHERE NCCL_ID = :ID INTO :PDTOF, :FECDTO, :TRM;
                            if (TIPO = 45) then
                                SELECT ANCL_DTOFMONTO, ANCL_DTOFECHA, ANCL_TRM FROM ANTICIPOS_CLIENTE
                                    WHERE ANCL_ID = :ID INTO :PDTOF, :FECDTO, :TRM;
                            if (TIPO = 31) then
                                SELECT FACT_DTOFMONTO, FACT_DTOFFECHA, FACT_TRM FROM FACTURAS
                                    WHERE FACT_ID = :ID INTO :PDTOF, :FECDTO, :TRM;
                            if (TIPO = 33) then
                                SELECT 0, DEVT_FECHA, 1 FROM devoluciones_ventas
                                    WHERE DEVT_ID = :ID INTO :PDTOF, :FECDTO, :TRM;
                            if (PDTOF IS NULL) then
                                PDTOF = 0;
                            if ((MONEDA <> 0) AND (TRM <> 0)) then
                                PDTOF = PDTOF / TRM;
                            if (PDTOF <> 0) then
                                BEGIN
                                SELECT SUM(RCDE_DTOF), MAX(RECA_TRM) FROM RECIBOS_CAJA_DETALLE D, RECIBOS_CAJA R
                                    WHERE R.reca_id = D.reca_id AND RCDE_IDDOC = :ID AND RCDE_TIPODOC = :TIPO INTO :DTOAPL, :TRM;
                                if (DTOAPL IS NULL) then
                                    DTOAPL = 0;
                                if ((MONEDA <> 0) AND (TRM <> 0)) then
                                   DTOAPL = DTOAPL / TRM;
                                PDTOF = PDTOF - DTOAPL;
                                /* SI YA SE VENCIO DEJELO EN CERO */
                                if (FECDTO < FECHA) then
                                    PDTOF = 0;
                                END
                            if (MONEDA = 0) then
                                SELECT SUM(SDCA_RTFTE - SDCA_ABRTFTE), SUM(SDCA_RTIVA - SDCA_ABRTIVA), SUM(SDCA_RTICA - SDCA_ABRTICA)
                                    FROM SALDOS_DOC_CARTERA WHERE SDCA_TIPOREF = :TIPO AND SDCA_IDREF = :ID
                                    INTO :PRTFTE, :PRTIVA, :PRTICA;
                            ELSE
                                SELECT SUM((SDCA_RTFTE - SDCA_ABRTFTE)/SDCA_TRM), SUM((SDCA_RTIVA - SDCA_ABRTIVA)/SDCA_TRM), SUM((SDCA_RTICA - SDCA_ABRTICA)/SDCA_TRM)
                                    FROM SALDOS_DOC_CARTERA WHERE SDCA_TIPOREF = :TIPO AND SDCA_IDREF = :ID
                                    INTO :PRTFTE, :PRTIVA, :PRTICA;
                            if (PRTFTE IS NULL) then
                                PRTFTE = 0;
                            if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) THEN
                                BEGIN
                                if (PRTFTE > 0) then
                                    PRTFTE = 0;
                                END
                            ELSE
                                BEGIN
                                if (PRTFTE < 0) then
                                    PRTFTE = 0;
                                END
                            if (PRTIVA IS NULL) then
                                PRTIVA = 0;
                            if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) THEN
                                BEGIN
                                if (PRTIVA > 0) then
                                    PRTIVA = 0;
                                END
                            ELSE
                                BEGIN
                                if (PRTIVA < 0) then
                                    PRTIVA = 0;
                                END
                            if (PRTICA IS NULL) then
                                PRTICA = 0;
                            if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) THEN
                                BEGIN
                                if (PRTICA > 0) then
                                    PRTICA = 0;
                                END
                            ELSE
                                BEGIN
                                if (PRTICA < 0) then
                                    PRTICA = 0;
                                END
                            if (FAUTORET <= FECDOC) then
                                PRTFTE = 0;
                            SALDO = SALDO + PSALDO;
                            RTFTE = RTFTE + PRTFTE;
                            RTIVA = RTIVA + PRTIVA;
                            RTICA = RTICA + PRTICA;
                            DTOF = DTOF + PDTOF;
                            END /* SALDO <> 0 */
                        END  /* NO ANTICIPO */
                    END
                DISPONIBLE = CUPO - SALDO;
                /* LOS RECIBOS PROVISIONALES */
                SELECT SUM(RPDE_ABONO), MAX(RCPR_TRM) FROM RECIBO_PROVISIONAL P, recibo_provisional_detalle D
                    WHERE P.rcpr_id = D.rcpr_id AND TERC_NIT = :NIT AND RPDE_SUCURSAL = :SUCURSAL AND ((:MONEDA = 0) or (RCPR_TRM <> 1)) AND
                    VEND_COD = :CODCOBR AND RCPR_FECHA <= :FECHA AND RCPR_ANULADO = 'N' AND ((RCPR_FECCRUCE IS NULL) or (RCPR_FECCRUCE > :FECHA)) AND 
                    ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                    INTO :provisional, :TRM;
                if ((MONEDA <> 0) AND (TRM <> 0)) then
                    PROVISIONAL = PROVISIONAL / TRM;
                if (:descnt_prov = 'SI') then
                   if (NOT :provisional IS NULL) then
                    SALDO = :saldo - :PROVISIONAL;
                if (AUTORET = 'SI') then
                    BEGIN
                    RTFTE = 0;
                    RTIVA = 0;
                    RTICA = 0;
                    END
                SUSPEND;
                END  /* OK = S */
            END  /* FOR COBRADOR */
        END  /* AGRUPA = C */
    END  /* FOR NIT */
SUSPEND;
END

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE REP_CARTERA_NOTAS(
    DESDE VARCHAR(20),
    HASTA VARCHAR(20),
    GRPINI VARCHAR(5),
    GRPFIN VARCHAR(5),
    FECHA DATE,
    ORDEN CHAR(1),
    AGRUPA CHAR(1),
    SUBEMPRESA INTEGER,
    VENCEINI DATE,
    VENCEFIN DATE,
    GRUPCART INTEGER,
    MONEDA INTEGER)
RETURNS (
    NIT VARCHAR(20),
    NOMBRE VARCHAR(60),
    TELEFONO VARCHAR(40),
    CIUDAD VARCHAR(40),
    CODZONA VARCHAR(2),
    NOMZONA VARCHAR(60),
    CODCOBR INTEGER,
    NOMCOBR VARCHAR(60),
    SUCURSAL VARCHAR(10),
    DV CHAR(1),
    CODCIUD CHAR(5),
    NOMCIUD VARCHAR(60),
    SALDO NUMERIC(18,2),
    NOTA1 VARCHAR(256),
    NOTA2 VARCHAR(256),
    CUPO NUMERIC(18,2),
    DISPONIBLE NUMERIC(18,2),
    PROVISIONAL NUMERIC(18,2),
    CONTACTO VARCHAR(60),
    ESTADO CHAR(1),
    GRUPCOD INTEGER,
    GRUPNOM VARCHAR(30))
AS
declare variable NITINI VARCHAR(20);
declare variable NITFIN VARCHAR(20);
declare variable NOMINI VARCHAR(20);
declare variable NOMFIN VARCHAR(20);
declare variable OK CHAR(1);
declare variable PSALDO NUMERIC(18,2);
declare variable TIPO INTEGER;
declare variable ID INTEGER;
declare variable NOTA VARCHAR(277);
declare variable TIPODOC VARCHAR(8);
declare variable NUMDOC VARCHAR(10);
declare variable FECNOTA VARCHAR(10);
declare variable I INTEGER;
declare variable INCLANTI CHAR(2);
declare variable TRM NUMERIC(18,2);
BEGIN
if (ORDEN = 'C') then
    BEGIN
    NITINI = DESDE;
    NITFIN = HASTA;
    NOMINI = '';
    NOMFIN = 'zz';
    END
ELSE
    BEGIN
    NOMINI = DESDE;
    NOMFIN = HASTA;
    NITINI = '';
    NITFIN = 'zz';
    END
  EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'INCLUIR ANTICIPOS DE CLIENTES EN REPORTES Y CONSULTAS DE CARTERA') returning_values (INCLANTI);
  /* Ubique el NIT */
  FOR select T.TERC_NIT, CLSU_NOMBRE, TERC_DV, CLSU_TEL, CLSU_CIUDAD, TERC_CONTACTO, S.COBR_COD, S.ZONA_COD, CIUD_COD, CLIE_CUPO, CLIE_ESTADO, CLCU_COD, C.GRCA_COD
    from terceros T, CLIENTES C, CLIENTE_SUCURSALES S
    where C.TERC_NIT = T.TERC_NIT AND TERC_CLIE = 'S' AND S.TERC_NIT = C.TERC_NIT AND T.TERC_NIT >= :NITINI AND T.TERC_NIT <= :NITFIN AND
        TERC_NOM >= :NOMINI AND TERC_NOM <= :NOMFIN AND ((:GRUPCART = 0) or (C.GRCA_COD = :GRUPCART))
    INTO :NIT, :NOMBRE, :DV, :TELEFONO, :CIUDAD, :CONTACTO, :CODCOBR, :CODZONA, :CODCIUD, :CUPO, :ESTADO, :SUCURSAL, :GRUPCOD
    DO  
    BEGIN
    SELECT GRCA_NOMBRE FROM GRUPO_CARTERA WHERE GRCA_COD = :GRUPCOD INTO :GRUPNOM;
    OK = 'N';
    if (AGRUPA = 'Z') then
        BEGIN
        if (GRPINI = '') then
            BEGIN
            if ((CODZONA IS NULL) or (CODZONA >= :GRPINI AND CODZONA <= :GRPFIN)) then
                OK = 'S';
            END
        ELSE
            if (CODZONA >= :GRPINI AND CODZONA <= :GRPFIN) then
                OK = 'S';
        END
    if (AGRUPA = 'I') then
        BEGIN
        if (GRPINI = '') then
            BEGIN
            if ((CODCIUD IS NULL) or (CODCIUD >= :GRPINI AND CODCIUD <= :GRPFIN)) then
                OK = 'S';
            END
        ELSE
            if (CODCIUD >= :GRPINI AND CODCIUD <= :GRPFIN) then
                OK = 'S';
        END
    if (AGRUPA = 'N') then
        OK = 'S';
        
    if (OK = 'S') then
        BEGIN
        if (CODCOBR IS NOT NULL) then
            SELECT COBR_NOM FROM COBRADORES  WHERE COBR_COD = :CODCOBR INTO :NOMCOBR;
        if (CODZONA IS NOT NULL) then
            SELECT ZONA_NOM FROM ZONAS WHERE ZONA_COD = :CODZONA INTO :NOMZONA;
        if (CODCIUD IS NOT NULL) then
            SELECT CIUD_NOM FROM CIUDADES  WHERE CIUD_COD = :CODCIUD INTO :NOMCIUD;
    
        SALDO = 0;
        /* BUSQUE EN SALDOS_DOC_CARTERA LOS QUE TENGAN SALDO > 0 */
        FOR SELECT MVCL_TIPOREF, MVCL_IDREF
          FROM MOVIMIENTO_CLIENTES WHERE TERC_NIT = :NIT AND MVCL_SUCURSAL = :SUCURSAL AND MVCL_FECHA <= :FECHA AND
          MVCL_ABONO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) AND MVCL_VENCE >= :VENCEINI AND
          MVCL_VENCE <= :VENCEFIN AND ((:MONEDA = 0) or (MVCL_TRM <> 1))
          INTO :TIPO, :ID
          DO
            if ((inclanti = 'SI') or (TIPO <> 45)) then
                BEGIN
                EXECUTE PROCEDURE saldo_doc_cartera(TIPO, ID, FECHA, MONEDA) returning_values (PSALDO);
                if (PSALDO <> 0) then
                    SALDO = SALDO + PSALDO;
                END
        DISPONIBLE = CUPO - SALDO;
        /* LOS RECIBOS PROVISIONALES */
        SELECT SUM(RPDE_ABONO), MAX(RCPR_TRM) FROM RECIBO_PROVISIONAL P, recibo_provisional_detalle D
            WHERE P.rcpr_id = D.rcpr_id AND TERC_NIT = :NIT AND RPDE_SUCURSAL = :SUCURSAL AND ((:MONEDA = 0) or (RCPR_TRM <> 1)) AND
            RCPR_FECHA <= :FECHA AND RCPR_ANULADO = 'N' AND ((RCPR_FECCRUCE IS NULL) or (RCPR_FECCRUCE > :FECHA)) AND
            ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            INTO :provisional, :TRM;
        if ((MONEDA <> 0) AND (TRM <> 0)) then
            PROVISIONAL = PROVISIONAL / TRM;
        /* LAS NOTAS DE CLIENTES */
        I = 0;
        NOTA1 = '';
        NOTA2 = '';
        FOR SELECT CAST(NOCL_FECHA AS VARCHAR(10)), tido_nomcorto, NOCL_NUMDOC, NOCL_TEXTO
            FROM NOTAS_CLIENTES N, TIPO_DOCUMENTO T WHERE N.NOCL_TIPODOC = T.TIDO_COD AND TERC_NIT = :NIT
            AND N.TINO_COD = 3 AND N.CLSU_COD = :SUCURSAL
            ORDER BY NOCL_ID DESC INTO :FECNOTA, :TIPODOC, :NUMDOC, :NOTA
            DO
            BEGIN
            if (I = 0) then
                NOTA1 = NOTA;
            if (I = 1) then
                NOTA2 = NOTA;
            I = I + 1;
            END
        SUSPEND;
        END
    if (AGRUPA = 'C') then
        BEGIN
        if (CODZONA IS NOT NULL) then
            SELECT ZONA_NOM FROM ZONAS WHERE ZONA_COD = :CODZONA INTO :NOMZONA;
        if (CODCIUD IS NOT NULL) then
            SELECT CIUD_NOM FROM CIUDADES  WHERE CIUD_COD = :CODCIUD INTO :NOMCIUD;
        FOR SELECT DISTINCT COBR_COD FROM MOVIMIENTO_CLIENTES WHERE TERC_NIT = :NIT AND
            MVCL_SUCURSAL = :SUCURSAL AND MVCL_FECHA <= :FECHA AND
            MVCL_ABONO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) AND MVCL_VENCE >= :VENCEINI AND MVCL_VENCE <= :VENCEFIN
            INTO :codcobr
            DO
            begin
            OK = 'N';
            if (GRPINI = '') then
                BEGIN
                if ((CODCOBR IS NULL) or (CODCOBR >= :GRPINI AND CODCOBR <= :GRPFIN)) then
                    OK = 'S';
                END
            ELSE
                if (CODCOBR >= :GRPINI AND CODCOBR <= :GRPFIN) then
                    OK = 'S';
            if (OK = 'S') then
                BEGIN
                SELECT COBR_NOM FROM COBRADORES  WHERE COBR_COD = :CODCOBR INTO :NOMCOBR;

                SALDO = 0;
                /* BUSQUE EN SALDOS_DOC_CARTERA LOS QUE TENGAN SALDO > 0 */
                FOR SELECT MVCL_TIPOREF, MVCL_IDREF
                  FROM MOVIMIENTO_CLIENTES WHERE TERC_NIT = :NIT AND MVCL_SUCURSAL = :SUCURSAL AND
                  MVCL_FECHA <= :FECHA AND COBR_COD = :codcobr AND MVCL_ABONO = 'N' AND
                  ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) AND MVCL_VENCE >= :VENCEINI AND
                  MVCL_VENCE <= :VENCEFIN AND ((:MONEDA = 0) or (MVCL_TRM <> 1))
                  INTO :TIPO, :ID
                  DO
                    if ((inclanti = 'SI') or (TIPO <> 45)) then
                        BEGIN
                        EXECUTE PROCEDURE saldo_doc_cartera(TIPO, ID, FECHA, MONEDA) returning_values (PSALDO);
                        if (PSALDO <> 0) then
                            BEGIN
                            SALDO = SALDO + PSALDO;
                            END
                        END
                DISPONIBLE = CUPO - SALDO;
                /* LOS RECIBOS PROVISIONALES */
                SELECT SUM(RPDE_ABONO), MAX(RCPR_TRM) FROM RECIBO_PROVISIONAL P, recibo_provisional_detalle D
                    WHERE P.rcpr_id = D.rcpr_id AND TERC_NIT = :NIT AND RPDE_SUCURSAL = :SUCURSAL AND ((:MONEDA = 0) or (RCPR_TRM <> 1)) AND
                    VEND_COD = :CODCOBR AND RCPR_FECHA <= :FECHA AND RCPR_ANULADO = 'N' AND ((RCPR_FECCRUCE IS NULL) or (RCPR_FECCRUCE > :FECHA)) AND
                    ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                    INTO :provisional, :TRM;
                if ((MONEDA <> 0) AND (TRM <> 0)) then
                    PROVISIONAL = PROVISIONAL / TRM;
                /* LAS NOTAS DE CLIENTES */
                I = 0;
                NOTA1 = '';
                NOTA2 = '';
                FOR SELECT CAST(NOCL_FECHA AS VARCHAR(10)), tido_nomcorto, NOCL_NUMDOC, NOCL_TEXTO
                    FROM NOTAS_CLIENTES N, TIPO_DOCUMENTO T WHERE N.NOCL_TIPODOC = T.TIDO_COD AND TERC_NIT = :NIT
                    AND N.TINO_COD = 3 AND N.CLSU_COD = :SUCURSAL
                    ORDER BY NOCL_FECHA DESC INTO :FECNOTA, :TIPODOC, :NUMDOC, :NOTA
                    DO
                    BEGIN
                    if (I = 0) then
                        NOTA1 = NOTA;
                    if (I = 1) then
                        NOTA2 = NOTA;
                    I = I + 1;
                    END
                SUSPEND;
                END  /* OK = S */
            END  /* FOR COBRADOR */
        END  /* AGRUPA = C */
    END  /* FOR NIT */
SUSPEND;
END

^

SET TERM ; ^

SET TERM ^ ;

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

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE VENCIDO_CLIENTE(
    NIT VARCHAR(20),
    FECHA DATE,
    SUCURSAL VARCHAR(10),
    BLOQ CHAR(1))
RETURNS (
    TIPO INTEGER,
    ID INTEGER,
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(6),
    SALDO NUMERIC(18,2),
    RTFTE NUMERIC(18,2),
    RTIVA NUMERIC(18,2),
    RTICA NUMERIC(18,2),
    DTOF NUMERIC(18,2),
    TIPONOM VARCHAR(8))
AS
DECLARE VARIABLE FEC DATE;
declare variable DB CHAR(1);
declare variable VENCE DATE;
declare variable AUTORET VARCHAR(10);
declare variable FAUTORET DATE;
declare variable FECDOC DATE;
declare variable DIAS INTEGER;
declare variable DIASBLOQ INTEGER;
BEGIN
EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'FECHA AUTORETENEDOR NO DESCONTAR RETENCIONES DEL SALDO PERO SI CONTABILIZARLAS') returning_values (AUTORET);
if (AUTORET <> '') then
    FAUTORET = CAST(AUTORET AS DATE);
else
    FAUTORET = '9999/12/31';
/* BUSQUE EN SALDOS_DOC_CARTERA LOS QUE TENGAN SALDO > 0 */
FOR SELECT MVCL_TIPOREF, MVCL_IDREF, MVCL_DEBITO, MVCL_PREFREF, MVCL_NUMREF, MVCL_VENCE, MVCL_FECHA
    FROM MOVIMIENTO_CLIENTES
    WHERE TERC_NIT = :NIT AND ((MVCL_SUCURSAL = :SUCURSAL) or (:SUCURSAL = 0)) AND MVCL_FECHA <= :FECHA AND MVCL_ABONO = 'N'
    INTO :TIPO, :ID, :DB, :PREFIJO, :NUMERO, :VENCE, :FECDOC
    DO
    BEGIN
    EXECUTE PROCEDURE saldo_doc_cartera(TIPO, ID, FECHA, 0) returning_values (SALDO);
    if ((SALDO <> 0) AND (VENCE < FECHA)) then
        BEGIN
        DIAS = fecha - vence;
        SELECT CLIE_DIASBLOQ FROM CLIENTES WHERE TERC_NIT = :NIT INTO :DIASBLOQ;
        if (diasbloq IS NULL) then
            diasbloq = 0;
        if ((BLOQ <> 'S') OR (DIAS > DIASBLOQ)) then
            BEGIN
            SELECT TIDO_NOMCORTO FROM TIPO_DOCUMENTO WHERE TIDO_COD = :TIPO INTO :TIPONOM;
            if (TIPO = 41) then
                SELECT NDCL_DTOFMONTO, NDCL_FECHADTO FROM NOTAS_DEBITO_CLIENTES WHERE NDCL_ID = :ID INTO :DTOF, :FEC;
            if (TIPO = 42) then
                SELECT 0, NCCL_FECHA FROM NOTAS_CREDITO_CLIENTES WHERE NCCL_ID = :ID INTO :DTOF, :FEC;
            if (TIPO = 45) then
                SELECT ANCL_DTOFMONTO, ANCL_DTOFECHA FROM ANTICIPOS_CLIENTE WHERE ANCL_ID = :ID INTO :DTOF, :FEC;
            if (TIPO = 31) then
                SELECT 0, :FECHA FROM FACTURAS WHERE FACT_ID = :ID INTO :DTOF, :FEC;
            if (TIPO = 33) then
                SELECT 0, :FECHA FROM devoluciones_ventas WHERE DEVT_ID = :ID INTO :DTOF, :FEC;
            if (FECHA > FEC) then
                DTOF = 0;
            if (DTOF IS NULL) then
                DTOF = 0;
            if (FAUTORET <= FECDOC) then
                BEGIN
                RTFTE = 0;
                RTIVA = 0;
                RTICA = 0;
                END
            ELSE
                BEGIN
                SELECT SUM(SDCA_RTFTE - SDCA_ABRTFTE), SUM(SDCA_RTIVA - SDCA_ABRTIVA), SUM(SDCA_RTICA - SDCA_ABRTICA)
                    FROM SALDOS_DOC_CARTERA WHERE SDCA_TIPOREF = :TIPO AND SDCA_IDREF = :ID INTO :RTFTE, :RTIVA, :RTICA;
                if (RTFTE IS NULL) then
                    RTFTE = 0;
                if (RTIVA IS NULL) then
                    RTIVA = 0;
                if (RTICA IS NULL) then
                    RTICA = 0;
                END
            SUSPEND;
            END
        END
    END
SUSPEND;
END

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE CUPO_DISPONIBLE(
    NIT VARCHAR(20),
    FECHA DATE,
    SUCURSAL VARCHAR(10))
RETURNS (
    DISPONIBLE NUMERIC(18,2))
AS
declare variable SALDO NUMERIC(18,2);
begin
SELECT CLIE_CUPO FROM CLIENTES WHERE TERC_NIT = :NIT INTO :DISPONIBLE;
if (DISPONIBLE IS NULL) then
    DISPONIBLE = 0;
SELECT SUM(SALDO) FROM VENCIDO_CLIENTE (:NIT, :FECHA, :SUCURSAL, 'N') INTO :SALDO;
if (SALDO IS NULL) then
    SALDO = 0;
DISPONIBLE = DISPONIBLE - SALDO;
suspend;
SUSPEND;
end

^

SET TERM ; ^

SET TERM ^ ;

ALTER TRIGGER APLICACION_CLIENTE_DETALLE_AI
AS
declare variable EXISTE CHAR(1);
declare variable FEC DATE;
declare variable NIT VARCHAR(20);
declare variable CONCEPTO VARCHAR(60);
declare variable PREFIJO VARCHAR(4);
declare variable NUMERO VARCHAR(6);
declare variable SALDO NUMERIC(18,2);
declare variable RETES CHAR(2);
declare variable SUCURSAL VARCHAR(10);
declare variable COBR INTEGER;
declare variable TRM NUMERIC(18,2);
BEGIN
if ((NEW.APCL_ID <> 0) and (new.acde_anulado = 'N')) then
    BEGIN
    /* Abone el documento referenciado */
    select PREF_PRE, APCL_NUMERO, apcl_fecha, APCL_CONCEPTO, TERC_NIT, APCL_SUCURSAL, COBR_COD, APCL_TRM
        from aplicacion_cliente where apcl_id = new.apcl_id
        into :PREFIJO, :NUMERO, :FEC, :CONCEPTO, :NIT, :SUCURSAL, :COBR, :TRM;
    /* valide que no se pase del saldo */
    execute procedure saldo_doc_cartera(new.acde_tipodoc, new.acde_iddoc, '9999/12/31', 0) returning_values(saldo);
    execute procedure lee_configuracion('CARTERA', 'SALDOS', 'DESCONTAR RETENCIONES POR CAUSACION') returning_values (RETES);
    if (SALDO < 0) then
        BEGIN
        if (RETES = 'SI') then
            begin
            if (saldo > NEW.acde_aplicado) then
                EXCEPTION DOCUMENTO_ABONO_MAYOR 'EL SALDO DEL DOCUMENTO ' || NEW.acde_prefijo || NEW.acde_numero || ' ES INSUFICIENTE.';
            end
        ELSE
            begin
            if (saldo > (NEW.acde_aplicado + NEW.acde_rtfte + NEW.acde_rtiva + NEW.acde_rtica)) then
                EXCEPTION DOCUMENTO_ABONO_MAYOR 'EL SALDO DEL DOCUMENTO ' || NEW.acde_prefijo || NEW.acde_numero || ' ES INSUFICIENTE.';
            end
        END
    else
        BEGIN
        if (RETES = 'SI') then
            begin
            if (saldo < NEW.acde_aplicado) then
                EXCEPTION DOCUMENTO_ABONO_MAYOR 'EL SALDO DEL DOCUMENTO ' || NEW.acde_prefijo || NEW.acde_numero || ' ES INSUFICIENTE.';
            end
        ELSE
            begin
            if (saldo < (NEW.acde_aplicado + NEW.acde_rtfte + NEW.acde_rtiva + NEW.acde_rtica)) then
                EXCEPTION DOCUMENTO_ABONO_MAYOR 'EL SALDO DEL DOCUMENTO ' || NEW.acde_prefijo || NEW.acde_numero || ' ES INSUFICIENTE.';
            end
        END
    select 'S' from saldos_doc_cartera where sdca_tiporef = new.acde_tipodoc and sdca_idref = new.acde_iddoc and sdca_fecha = :FEC into :EXISTE;
    if (Existe = 'S') then
        begin
        /* actualice el saldo del dia */
        UPDATE saldos_doc_cartera
            SET SDCA_ABONO = SDCA_ABONO + NEW.acde_aplicado,
                SDCA_ABRTFTE = SDCA_ABRTFTE + NEW.acde_RTFTE,
                SDCA_ABRTIVA = SDCA_ABRTIVA + NEW.acde_RTIVA,
                SDCA_ABRTICA = SDCA_ABRTICA + NEW.acde_RTICA,
                SDCA_TRM = :TRM
            WHERE SDCA_TIPOREF = NEW.ACDE_TIPODOC AND SDCA_IDREF = NEW.acde_IDDOC AND SDCA_FECHA = :FEC;
        END
    ELSE
        BEGIN
        /* Inserte un nuevo saldo diario */
        INSERT INTO SALDOS_DOC_CARTERA (SDCA_TIPOREF, SDCA_IDREF, SDCA_FECHA, TERC_NIT, SDCA_RTFTE, SDCA_RTIVA, SDCA_RTICA, SDCA_ABONO, SDCA_ABRTFTE, SDCA_ABRTIVA, SDCA_ABRTICA, SDCA_DEBITO, SDCA_MONTO, SDCA_TRM)
            VALUES (NEW.ACDE_TIPODOC, NEW.ACDE_IDDOC, :FEC, :NIT, 0, 0, 0, NEW.acde_aplicado, NEW.acde_rtfte, NEW.acde_rtiva, NEW.acde_rtica, 'N', 0, :TRM);
        END
    /* actualice el registro en mov_cliente (por si son varios items) */
    EXISTE = 'N';
    SELECT 'S' FROM MOVIMIENTO_CLIENTES WHERE MVCL_TIPOREF = 43 AND MVCL_IDREF = NEW.APCL_ID INTO :EXISTE;
    if (EXISTE = 'S') then
        begin
        UPDATE movimiento_clientes
            SET MVCL_MONTO = MVCL_MONTO + NEW.acde_aplicado,
                MVCL_RTEFTE = MVCL_RTEFTE + NEW.acde_rtfte,
                MVCL_RTEIVA = MVCL_RTEIVA + NEW.acde_rtiva,
                MVCL_RTEICA = MVCL_RTEICA + NEW.acde_rtica,
                MVCL_TRM = :TRM
            WHERE MVCL_TIPOREF = 43 AND MVCL_IDREF = NEW.APCL_ID;
        end
    ELSE
        INSERT INTO MOVIMIENTO_CLIENTES (MVCL_ID, TERC_NIT, MVCL_TIPOREF, MVCL_IDREF, MVCL_FECHA, MVCL_VENCE, MVCL_CONC, MVCL_MONTO, MVCL_RTEFTE, MVCL_RTEIVA, MVCL_RTEICA, MVCL_DEBITO, MVCL_ABONO, MVCL_PREFREF, MVCL_NUMREF, MVCL_SUCURSAL, COBR_COD, MVCL_TRM)
            VALUES (GEN_ID(ID_MOVCLI, 1), :NIT, 43, NEW.APCL_ID, :FEC, :FEC, :CONCEPTO, NEW.ACDE_APLICADO, NEW.ACDE_RTFTE, NEW.ACDE_RTIVA, NEW.ACDE_RTICA, 'N', 'S', :PREFIJO, :NUMERO, :SUCURSAL, :COBR, :TRM);
    end
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER TRIGGER APLICACION_CLIENTE_DETALLE_AU
AS
declare variable EXISTE CHAR(1);
declare variable FEC DATE;
declare variable NIT VARCHAR(20);
declare variable CONCEPTO VARCHAR(60);
declare variable PREFIJO VARCHAR(4);
declare variable NUMERO VARCHAR(6);
declare variable SALDO NUMERIC(18,2);
declare variable RETES CHAR(2);
declare variable SUCURSAL VARCHAR(10);
declare variable COBR INTEGER;
declare variable TRM NUMERIC(18,2);
BEGIN
if ((old.apcl_id <> 0) and (old.acde_anulado = 'N')) then
    begin
    select apcl_fecha, apcl_trm from aplicacion_CLIENTE
        where apcl_id = old.apcl_id into :FEC, :TRM;
    UPDATE saldos_doc_cartera
        SET SDCA_ABONO = SDCA_ABONO - old.acde_aplicado,
        SDCA_ABRTFTE = SDCA_ABRTFTE - old.acde_RTFTE,
        SDCA_ABRTIVA = SDCA_ABRTIVA - old.acde_RTIVA,
        SDCA_ABRTICA = SDCA_ABRTICA - old.acde_RTICA
        WHERE SDCA_TIPOREF = OLD.ACDE_TIPODOC AND SDCA_IDREF = OLD.acde_IDDOC AND SDCA_FECHA = :FEC;
                    
    UPDATE movimiento_clientes
        SET MVCL_MONTO = MVCL_MONTO - OLD.acde_aplicado,
        MVCL_RTEFTE = MVCL_RTEFTE - OLD.acde_rtfte,
        MVCL_RTEIVA = MVCL_RTEIVA - OLD.acde_rtiva,
        MVCL_RTEICA = MVCL_RTEICA - OLD.acde_rtica
        WHERE MVCL_TIPOREF = 43 AND MVCL_IDREF = NEW.APCL_ID;
    end
if ((NEW.acde_anulado = 'N') AND (NEW.APCL_ID <> 0)) then
    BEGIN
    select PREF_PRE, APCL_NUMERO, apcl_fecha, APCL_CONCEPTO, TERC_NIT, APCL_SUCURSAL, COBR_COD, APCL_TRM
        from aplicacion_CLIENTE
        where apcl_id = new.apcl_id
        into :PREFIJO, :NUMERO, :FEC, :CONCEPTO, :NIT, :SUCURSAL, :COBR, :TRM;
    /* valide que no se pase del saldo */
    execute procedure saldo_doc_cartera(new.acde_tipodoc, new.acde_iddoc, '9999/12/31', 0) returning_values(saldo);
    execute procedure lee_configuracion('CARTERA', 'SALDOS', 'DESCONTAR RETENCIONES POR CAUSACION') returning_values (RETES);
    if (SALDO < 0) then
        BEGIN
        if (RETES = 'SI') then
            begin
            if (saldo > NEW.acde_aplicado) then
                EXCEPTION DOCUMENTO_ABONO_MAYOR;
            end
        ELSE
            begin
            if (saldo > (NEW.acde_aplicado + NEW.acde_rtfte + NEW.acde_rtiva + NEW.acde_rtica)) then
                EXCEPTION DOCUMENTO_ABONO_MAYOR;
            end
        END
    else
        BEGIN
        if (RETES = 'SI') then
            begin
            if (saldo < NEW.acde_aplicado) then
                EXCEPTION DOCUMENTO_ABONO_MAYOR;
            end
        ELSE
            begin
            if (saldo < (NEW.acde_aplicado + NEW.acde_rtfte + NEW.acde_rtiva + NEW.acde_rtica)) then
                EXCEPTION DOCUMENTO_ABONO_MAYOR;
            end
        END
        
    /* Abone el documento referenciado  */
    select 'S' from saldos_doc_cartera where sdca_tiporef = new.acde_tipodoc and sdca_idref = new.acde_iddoc and sdca_fecha = :FEC into :EXISTE;
    if (Existe = 'S') then
        /* actualice el saldo del dia */
        UPDATE saldos_doc_cartera
            SET SDCA_ABONO = SDCA_ABONO + NEW.acde_aplicado,
            SDCA_ABRTFTE = SDCA_ABRTFTE + NEW.acde_RTFTE,
            SDCA_ABRTIVA = SDCA_ABRTIVA + NEW.acde_RTIVA,
            SDCA_ABRTICA = SDCA_ABRTICA + NEW.acde_RTICA,
            SDCA_TRM = :TRM
        WHERE SDCA_TIPOREF = NEW.ACDE_TIPODOC AND SDCA_IDREF = NEW.acde_IDDOC AND SDCA_FECHA = :FEC;
    ELSE
        /* Inserte un nuevo saldo diario */
        INSERT INTO SALDOS_DOC_CARTERA (SDCA_TIPOREF, SDCA_IDREF, SDCA_FECHA, TERC_NIT, SDCA_RTFTE, SDCA_RTIVA, SDCA_RTICA, SDCA_ABONO, SDCA_ABRTFTE, SDCA_ABRTIVA, SDCA_ABRTICA, SDCA_DEBITO, SDCA_MONTO, SDCA_TRM)
            VALUES (NEW.ACDE_TIPODOC, NEW.ACDE_IDDOC, :FEC, :NIT, 0, 0, 0, NEW.acde_aplicado, NEW.acde_rtfte, NEW.acde_rtiva, NEW.acde_rtica, 'N', 0, :TRM);
            
    /* Registre o actualice el registro en movimiento */
    EXISTE = 'N';
    SELECT 'S' FROM MOVIMIENTO_CLIENTES WHERE MVCL_TIPOREF = 43 AND MVCL_IDREF = NEW.APCL_ID INTO :EXISTE;
    if (EXISTE = 'S') then
        begin
        UPDATE movimiento_clientes
            SET MVCL_MONTO = MVCL_MONTO + NEW.acde_aplicado,
            MVCL_RTEFTE = MVCL_RTEFTE + NEW.acde_rtfte,
            MVCL_RTEIVA = MVCL_RTEIVA + NEW.acde_rtiva,
            MVCL_RTEICA = MVCL_RTEICA + NEW.acde_rtica,
            MVCL_TRM = :TRM
        WHERE MVCL_TIPOREF = 43 AND MVCL_IDREF = NEW.APCL_ID;
        end
    ELSE
        INSERT INTO MOVIMIENTO_CLIENTES (MVCL_ID, TERC_NIT, MVCL_TIPOREF, MVCL_IDREF, MVCL_FECHA, MVCL_VENCE, MVCL_CONC, MVCL_MONTO, MVCL_RTEFTE, MVCL_RTEIVA, MVCL_RTEICA, MVCL_DEBITO, MVCL_ABONO, MVCL_PREFref, MVCL_NUMREF, MVCL_SUCURSAL, COBR_COD, MVCL_TRM)
            VALUES (GEN_ID(ID_MOVCLI, 1), :NIT, 43, NEW.APCL_ID, :FEC, :FEC, :CONCEPTO, NEW.ACDE_APLICADO, NEW.ACDE_RTFTE, NEW.ACDE_RTIVA, NEW.ACDE_RTICA, 'N', 'S', :PREFIJO, :NUMERO, :SUCURSAL, :COBR, :TRM);
    end
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER TRIGGER APLICACION_CLIENTE_DETALLE_BI
as
declare variable PREGTASA CHAR(2);
declare variable TRM NUMERIC(18,2);
declare variable SALDO NUMERIC(18,2);
declare variable SALDOM NUMERIC(18,2);
declare variable RETES CHAR(2);
begin
/* SI TRM <> 1 CONVIERTA A PESOS LOS VALORES */
EXECUTE PROCEDURE LEE_CONFIGURACION('GENERAL', 'GENERAL', 'PREGUNTAR TASA DE CAMBIO EN DOCUMENTOS DE CARTERA') returning_values (:pregtasa);
if (PREGTASA = 'SI') then
    BEGIN
    SELECT APCL_TRM FROM aplicacion_cliente WHERE APCL_ID = NEW.apcl_id INTO :TRM;
    NEW.acde_aplicado = NEW.acde_aplicado * :trm;
    NEW.acde_rtfte = NEW.acde_rtfte * :trm;
    NEW.acde_rtiva = NEW.acde_rtiva * :trm;
    NEW.acde_rtica = NEW.acde_rtica * :trm;
    /* VERIFIQUE LOS SALDOS SI LLEVE LA DIFERENCIA COMO DIF EN CAMBIO */
    execute procedure lee_configuracion('CARTERA', 'SALDOS', 'DESCONTAR RETENCIONES POR CAUSACION') returning_values (RETES);
    execute procedure saldo_doc_cartera(new.acde_tipodoc, new.acde_iddoc, '9999/12/31', 0) returning_values(saldo);
    if (SALDO < 0) then
        BEGIN
        if (RETES = 'SI') then
            begin
            if (saldo > NEW.acde_aplicado) then
                BEGIN
                execute procedure saldo_doc_cartera(new.acde_tipodoc, new.acde_iddoc, '9999/12/31', 1) returning_values(saldoM);
                if (saldoM > (NEW.acde_aplicado/:TRM)) then
                    EXCEPTION DOCUMENTO_ABONO_MAYOR 'EL SALDO DEL DOCUMENTO ' || NEW.acde_prefijo || NEW.acde_numero || ' ES INSUFICIENTE.';
                else
                    BEGIN
                    NEW.acde_difcambio = :SALDO - NEW.acde_aplicado;
                    NEW.acde_aplicado = NEW.acde_aplicado - NEW.acde_difcambio;
                    END
                END
            end
        ELSE
            begin
            if (saldo > (NEW.acde_aplicado + NEW.acde_rtfte + NEW.acde_rtiva + NEW.acde_rtica)) then
                begin
                execute procedure saldo_doc_cartera(new.acde_tipodoc, new.acde_iddoc, '9999/12/31', 1) returning_values(saldoM);
                if (saldoM > ((NEW.acde_aplicado+NEW.acde_rtfte+NEW.acde_rtiva+NEW.acde_rtica)/:TRM)) then
                    EXCEPTION DOCUMENTO_ABONO_MAYOR 'EL SALDO DEL DOCUMENTO ' || NEW.acde_prefijo || NEW.acde_numero || ' ES INSUFICIENTE.';
                else
                    BEGIN
                    NEW.acde_difcambio = :SALDO - (NEW.acde_aplicado+NEW.acde_rtfte+NEW.acde_rtiva+NEW.acde_rtica);
                    NEW.acde_aplicado = NEW.acde_aplicado - NEW.acde_difcambio;
                    END
                end
            end
        END
    else
        BEGIN
        if (RETES = 'SI') then
            begin
            if (saldo < NEW.acde_aplicado) then
                BEGIN
                execute procedure saldo_doc_cartera(new.acde_tipodoc, new.acde_iddoc, '9999/12/31', 1) returning_values(saldoM);
                if (saldoM < (NEW.acde_aplicado/:TRM)) then
                    EXCEPTION DOCUMENTO_ABONO_MAYOR 'EL SALDO DEL DOCUMENTO ' || NEW.acde_prefijo || NEW.acde_numero || ' ES INSUFICIENTE.';
                else
                    BEGIN
                    NEW.acde_difcambio = :SALDO - NEW.acde_aplicado;
                    NEW.acde_aplicado = NEW.acde_aplicado - NEW.acde_difcambio;
                    END
                END
            end
        ELSE
            begin
            if (saldo < (NEW.acde_aplicado + NEW.acde_rtfte + NEW.acde_rtiva + NEW.acde_rtica)) then
                begin
                execute procedure saldo_doc_cartera(new.acde_tipodoc, new.acde_iddoc, '9999/12/31', 1) returning_values(saldoM);
                if (saldoM < ((NEW.acde_aplicado+NEW.acde_rtfte+NEW.acde_rtiva+NEW.acde_rtica)/:TRM)) then
                    EXCEPTION DOCUMENTO_ABONO_MAYOR 'EL SALDO DEL DOCUMENTO ' || NEW.acde_prefijo || NEW.acde_numero || ' ES INSUFICIENTE.';
                else
                    BEGIN
                    NEW.acde_difcambio = :SALDO - (NEW.acde_aplicado+NEW.acde_rtfte+NEW.acde_rtiva+NEW.acde_rtica);
                    NEW.acde_aplicado = NEW.acde_aplicado - NEW.acde_difcambio;
                    END
                end
            end
        END
    end
end
^

SET TERM ; ^

SET TERM ^ ;

ALTER TRIGGER EGRESOS_CRUCEC_AI
AS
declare variable EXISTE CHAR(1);
declare variable FEC DATE;
declare variable NIT VARCHAR(20);
declare variable CONCEPTO VARCHAR(60);
declare variable PREFIJO VARCHAR(4);
declare variable NUMERO VARCHAR(6);
declare variable SALDO NUMERIC(18,2);
declare variable RETES CHAR(2);
declare variable COBR INTEGER;
declare variable TRM NUMERIC(18,2);
BEGIN
if ((NEW.egre_id <> 0) and (new.egcc_anulado = 'N')) then
    BEGIN
    /* Abone el documento referenciado */
    select PREF_PRE, EGRE_NUMERO, EGRE_fecha, EGRE_CONC, TERC_NIT, EGRE_TRM from EGRESOS
        where EGRE_id = new.egre_id into :PREFIJO, :NUMERO, :FEC, :CONCEPTO, :NIT, :TRM;
    SELECT COBR_COD FROM cliente_sucursales WHERE TERC_NIT = :NIT AND CLCU_COD = NEW.egcc_sucursal INTO :COBR;
    /* valide que no se pase del saldo */
    execute procedure saldo_doc_cartera(new.egcc_tipodoc, new.egcc_iddoc, '9999/12/31',0) returning_values(saldo);
    execute procedure lee_configuracion('CARTERA', 'SALDOS', 'DESCONTAR RETENCIONES POR CAUSACION') returning_values (RETES);
    if (SALDO < 0) then
        BEGIN
        if (RETES = 'SI') then
            begin
            if (saldo > (NEW.egcc_abono + NEW.egcc_dtof)) then
                EXCEPTION DOCUMENTO_ABONO_MAYOR;
            end
        ELSE
            begin
            if (saldo > (NEW.egcc_abono + NEW.egcc_rtfte + NEW.egcc_rtiva + NEW.egcc_rtica + NEW.egcc_dtof)) then
                EXCEPTION DOCUMENTO_ABONO_MAYOR;
            end
        END
    else
        BEGIN
        if (RETES = 'SI') then
            begin
            if (saldo < (NEW.egcc_abono + NEW.egcc_dtof)) then
                EXCEPTION DOCUMENTO_ABONO_MAYOR;
            end
        ELSE
            begin
            if (saldo < (NEW.egcc_abono + NEW.egcc_rtfte + NEW.egcc_rtiva + NEW.egcc_rtica + NEW.egcc_dtof)) then
                EXCEPTION DOCUMENTO_ABONO_MAYOR;
            end
        END
    EXISTE = 'N';
    select 'S' from saldos_doc_cartera where sdca_tiporef = new.egcc_tipodoc and sdca_idref = new.egcc_iddoc and sdca_fecha = :FEC into :EXISTE;
    if (Existe = 'S') then
        begin
        /* actualice el saldo del dia */
        UPDATE saldos_doc_cartera
            SET SDCA_ABONO = SDCA_ABONO + NEW.egcc_abono + new.egcc_dtof,
                SDCA_ABRTFTE = SDCA_ABRTFTE + NEW.egcc_rtfte,
                SDCA_ABRTIVA = SDCA_ABRTIVA + NEW.egcc_rtiva,
                SDCA_ABRTICA = SDCA_ABRTICA + NEW.egcc_rtica,
                SDCA_TRM = :TRM
                WHERE SDCA_TIPOREF = NEW.egcc_tipodoc AND SDCA_IDREF = NEW.egcc_iddoc AND SDCA_FECHA = :FEC;
        END
    ELSE
        BEGIN
        /* Inserte un nuevo saldo diario */
        INSERT INTO SALDOS_DOC_CARTERA (SDCA_TIPOREF, SDCA_IDREF, SDCA_FECHA, TERC_NIT, SDCA_RTFTE, SDCA_RTIVA, SDCA_RTICA, SDCA_ABONO, SDCA_ABRTFTE, SDCA_ABRTIVA, SDCA_ABRTICA, SDCA_DEBITO, SDCA_MONTO, SDCA_TRM)
            VALUES (NEW.egcc_tipodoc, NEW.egcc_iddoc, :FEC, :NIT, 0, 0, 0, (NEW.egcc_abono+NEW.egcc_dtof), NEW.egcc_rtfte, NEW.egcc_rtiva, NEW.egcc_rtica, 'N', 0, :TRM);
        END
    /* actualice el registro en mov_cliente (por si son varios items) */
    EXISTE = 'N';
    SELECT 'S' FROM MOVIMIENTO_CLIENTES WHERE MVCL_TIPOREF = 62 AND MVCL_IDREF = NEW.egre_id AND MVCL_SUCURSAL = NEW.egcc_sucursal INTO :EXISTE;
    if (EXISTE = 'S') then
        begin
        UPDATE movimiento_clientes
            SET MVCL_MONTO = MVCL_MONTO + NEW.egcc_abono + NEW.egcc_dtof,
                MVCL_RTEFTE = MVCL_RTEFTE + NEW.egcc_rtfte,
                MVCL_RTEIVA = MVCL_RTEIVA + NEW.egcc_rtiva,
                MVCL_RTEICA = MVCL_RTEICA + NEW.egcc_rtica,
                MVCL_TRM = :TRM
            WHERE MVCL_TIPOREF = 62 AND MVCL_IDREF = NEW.egre_id;
        end
    ELSE
        INSERT INTO MOVIMIENTO_CLIENTES (MVCL_ID, TERC_NIT, MVCL_TIPOREF, MVCL_IDREF, MVCL_FECHA, MVCL_VENCE, MVCL_CONC, MVCL_MONTO, MVCL_RTEFTE, MVCL_RTEIVA, MVCL_RTEICA, MVCL_DEBITO, MVCL_ABONO, MVCL_PREFREF, MVCL_NUMREF, MVCL_SUCURSAL, COBR_COD, MVCL_TRM)
            VALUES (GEN_ID(ID_MOVCLI, 1), :NIT, 62, NEW.egre_id, :FEC, :FEC, :CONCEPTO, (NEW.egcc_abono+NEW.egcc_dtof), NEW.egcc_rtfte, NEW.egcc_rtiva, NEW.egcc_rtica, 'N', 'S', :PREFIJO, :NUMERO, NEW.egcc_sucursal, :COBR, :TRM);
    end
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER TRIGGER EGRESOS_CRUCEC_AU
AS
declare variable EXISTE CHAR(1);
declare variable FEC DATE;
declare variable NIT VARCHAR(20);
declare variable CONCEPTO VARCHAR(60);
declare variable PREFIJO VARCHAR(4);
declare variable NUMERO VARCHAR(6);
declare variable SALDO NUMERIC(18,2);
declare variable RETES char(2);
declare variable COBR INTEGER;
declare variable TRM NUMERIC(18,2);
BEGIN
select PREF_PRE, EGRE_NUMERO, EGRE_fecha, EGRE_CONC, TERC_NIT, EGRE_TRM
    from egresos where egre_id = new.egre_id
    into :PREFIJO, :NUMERO, :FEC, :CONCEPTO, :NIT, :TRM;
/* Borre el viejo */
if ((old.egre_id <> 0) AND (OLD.egcc_anulado = 'N')) then
    BEGIN
    UPDATE saldos_doc_cartera
        SET SDCA_ABONO = SDCA_ABONO - old.egcc_abono - OLD.egcc_dtof,
        SDCA_ABRTFTE = SDCA_ABRTFTE - old.egcc_rtfte,
        SDCA_ABRTIVA = SDCA_ABRTIVA - old.egcc_rtiva,
        SDCA_ABRTICA = SDCA_ABRTICA - old.egcc_rtica
        WHERE SDCA_TIPOREF = old.egcc_tipodoc AND SDCA_IDREF = old.egcc_iddoc AND SDCA_FECHA = :FEC;
    UPDATE movimiento_clientes
        SET MVCL_MONTO = MVCL_MONTO - OLD.egcc_abono - OLD.egcc_dtof,
        MVCL_RTEFTE = MVCL_RTEFTE - OLD.egcc_rtfte,
        MVCL_RTEIVA = MVCL_RTEIVA - OLD.egcc_rtiva,
        MVCL_RTEICA = MVCL_RTEICA - OLD.egcc_rtica
        WHERE MVCL_TIPOREF = 62 AND MVCL_IDREF = OLD.egre_id AND MVCL_SUCURSAL = old.egcc_sucursal;
    END
if ((NEW.egre_id <> 0) and (NEW.egcc_anulado = 'N')) then
    BEGIN
    SELECT COBR_COD FROM cliente_sucursales WHERE TERC_NIT = :NIT AND CLCU_COD = NEW.egcc_sucursal INTO :COBR;
    /* valide que no se pase del saldo */
    execute procedure saldo_doc_cartera(new.egcc_tipodoc, new.egcc_iddoc, '9999/12/31',0) returning_values(saldo);
    execute procedure lee_configuracion('CARTERA', 'SALDOS', 'DESCONTAR RETENCIONES POR CAUSACION') returning_values (RETES);
    if (SALDO < 0) then
        BEGIN
        if (RETES = 'SI') then
            begin
            if (saldo > (NEW.egcc_abono + NEW.egcc_dtof)) then
                EXCEPTION DOCUMENTO_ABONO_MAYOR;
            end
        ELSE
            begin
            if (saldo > (NEW.egcc_abono + NEW.egcc_rtfte + NEW.egcc_rtiva + NEW.egcc_rtica + NEW.egcc_dtof)) then
                EXCEPTION DOCUMENTO_ABONO_MAYOR;
            end
        END
    else
        BEGIN
        if (RETES = 'SI') then
            begin
            if (saldo < (NEW.egcc_abono + NEW.egcc_dtof)) then
                EXCEPTION DOCUMENTO_ABONO_MAYOR;
            end
        ELSE
            begin
            if (saldo < (NEW.egcc_abono + NEW.egcc_rtfte + NEW.egcc_rtiva + NEW.egcc_rtica + NEW.egcc_dtof)) then
                EXCEPTION DOCUMENTO_ABONO_MAYOR;
            end
        END
    select 'S' from saldos_doc_cartera where sdca_tiporef = new.egcc_tipodoc and sdca_idref = new.egcc_iddoc and sdca_fecha = :FEC into :EXISTE;
    if (Existe = 'S') then
        /* actualice el saldo del dia */
        UPDATE saldos_doc_cartera
            SET SDCA_ABONO = SDCA_ABONO + NEW.egcc_abono + NEW.egcc_dtof,
            SDCA_ABRTFTE = SDCA_ABRTFTE + NEW.egcc_rtfte,
            SDCA_ABRTIVA = SDCA_ABRTIVA + NEW.egcc_rtiva,
            SDCA_ABRTICA = SDCA_ABRTICA + NEW.egcc_rtica,
            SDCA_TRM = :TRM
            WHERE SDCA_TIPOREF = NEW.egcc_tipodoc AND SDCA_IDREF = NEW.egcc_iddoc AND SDCA_FECHA = :FEC;
    ELSE
        /* Inserte un nuevo saldo diario */
        INSERT INTO SALDOS_DOC_CARTERA (SDCA_TIPOREF, SDCA_IDREF, SDCA_FECHA, TERC_NIT, SDCA_RTFTE, SDCA_RTIVA, SDCA_RTICA, SDCA_ABONO, SDCA_ABRTFTE, SDCA_ABRTIVA, SDCA_ABRTICA, SDCA_DEBITO, SDCA_MONTO, SDCA_TRM)
            VALUES (NEW.egcc_tipodoc, NEW.egcc_iddoc, :FEC, :NIT, 0, 0, 0, (NEW.egcc_abono+NEW.egcc_dtof), NEW.egcc_rtfte, NEW.egcc_rtiva, NEW.egcc_rtica, 'N', 0, :TRM);
    /* Registre o actualice el registro en movimiento_cliente */
    EXISTE = 'N';
    SELECT 'S' FROM MOVIMIENTO_CLIENTES WHERE MVCL_TIPOREF = 62 AND MVCL_IDREF = NEW.egre_id and mvcl_sucursal = new.egcc_sucursal INTO :EXISTE;
    if (EXISTE = 'S') then
        begin
        /* Deshaga el viejo */
        if (old.egre_id <> 0) then
            UPDATE movimiento_clientes
                SET MVCL_MONTO = MVCL_MONTO - OLD.egcc_abono - OLD.egcc_dtof,
                    MVCL_RTEFTE = MVCL_RTEFTE - OLD.egcc_rtfte,
                    MVCL_RTEIVA = MVCL_RTEIVA - OLD.egcc_rtiva,
                    MVCL_RTEICA = MVCL_RTEICA - OLD.egcc_rtica
                WHERE MVCL_TIPOREF = 62 AND MVCL_IDREF = NEW.egre_id AND MVCL_SUCURSAL = NEW.egcc_sucursal;
        /* Actualice el nuevo */
        UPDATE movimiento_clientes
            SET MVCL_MONTO = MVCL_MONTO + NEW.egcc_abono + NEW.egcc_dtof,
                MVCL_RTEFTE = MVCL_RTEFTE + NEW.egcc_rtfte,
                MVCL_RTEIVA = MVCL_RTEIVA + NEW.egcc_rtiva,
                MVCL_RTEICA = MVCL_RTEICA + NEW.egcc_rtica,
                MVCL_TRM = :TRM
            WHERE MVCL_TIPOREF = 62 AND MVCL_IDREF = NEW.egre_id AND MVCL_SUCURSAL = NEW.egcc_sucursal;
        end
    ELSE
        INSERT INTO MOVIMIENTO_CLIENTES (MVCL_ID, TERC_NIT, MVCL_TIPOREF, MVCL_IDREF, MVCL_FECHA, MVCL_VENCE, MVCL_CONC, MVCL_MONTO, MVCL_RTEFTE, MVCL_RTEIVA, MVCL_RTEICA, MVCL_DEBITO, MVCL_ABONO, MVCL_PREFREF, MVCL_NUMREF, MVCL_SUCURSAL, COBR_COD, MVCL_TRM)
            VALUES (GEN_ID(ID_MOVCLI, 1), :NIT, 62, NEW.egre_id, :FEC, :FEC, :CONCEPTO, (NEW.egcc_abono+NEW.egcc_dtof), NEW.egcc_rtfte, NEW.egcc_rtiva, NEW.egcc_rtica, 'N', 'S', :PREFIJO, :NUMERO, NEW.egcc_sucursal, :COBR, :TRM);
    END
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER TRIGGER RECIBOS_CAJA_DETALLE_AI
AS
declare variable EXISTE CHAR(1);
declare variable FEC DATE;
declare variable NIT VARCHAR(20);
declare variable CONCEPTO VARCHAR(60);
declare variable PREFIJO VARCHAR(4);
declare variable NUMERO VARCHAR(6);
declare variable SALDO NUMERIC(18,2);
declare variable RETES CHAR(2);
declare variable OK CHAR(1);
declare variable RCANTI INTEGER;
declare variable COBR INTEGER;
declare variable ACUMULA CHAR(2);
declare variable DIASMAX INTEGER;
declare variable FACTOR NUMERIC(9,4);
declare variable FACTORD NUMERIC(9,4);
declare variable DIAS INTEGER;
declare variable FECDOC DATE;
declare variable TRM NUMERIC(18,2);
BEGIN
if ((NEW.RECA_ID <> 0) and (new.rcde_anulado = 'N')) then
    BEGIN
    /* Abone el documento referenciado */
    select PREF_PRE, RECA_NUMERO, RECA_fecha, RECA_CONC, TERC_NIT, COBR_COD, RECA_TRM from RECIBOS_CAJA
        where RECA_id = new.RECA_id into :PREFIJO, :NUMERO, :FEC, :CONCEPTO, :NIT, :COBR, :TRM;
    OK = 'N';
    if (new.RCDE_TIPODOC = 45) then
        BEGIN
        /* BUSQUE SI TIENE RECA_ID, SI NO LO ACTUALIZA */
        SELECT RECA_ID FROM ANTICIPOS_CLIENTE WHERE ANCL_ID = NEW.RCDE_IDDOC INTO :RCANTI;
        if (RCANTI = 0) then
            BEGIN
            OK = 'S';
            UPDATE ANTICIPOS_CLIENTE SET RECA_ID = NEW.RECA_ID WHERE ANCL_ID = NEW.RCDE_IDDOC;
            END
        END
    if (OK = 'N') then
        BEGIN
        /* valide que no se pase del saldo */
        execute procedure saldo_doc_cartera(new.rcde_tipodoc, new.rcde_iddoc, '9999/12/31', 0) returning_values(saldo);
        execute procedure lee_configuracion('CARTERA', 'SALDOS', 'DESCONTAR RETENCIONES POR CAUSACION') returning_values (RETES);
        if (SALDO < 0) then
            BEGIN
            if (RETES = 'SI') then
                begin
                if (saldo > (NEW.rcde_abono + NEW.rcde_dtof)) then
                    EXCEPTION DOCUMENTO_ABONO_MAYOR 'EL SALDO DEL DOCUMENTO ' || NEW.rcde_prefijo || NEW.rcde_numero || ' ES INSUFICIENTE.';
                end
            ELSE
                begin
                if (saldo > (NEW.rcde_abono + NEW.rcde_rtfte + NEW.rcde_rtiva + NEW.rcde_rtica + NEW.rcde_dtof)) then
                    EXCEPTION DOCUMENTO_ABONO_MAYOR 'EL SALDO DEL DOCUMENTO ' || NEW.rcde_prefijo || NEW.rcde_numero || ' ES INSUFICIENTE.';
                end
            END
        else
            BEGIN
            if (RETES = 'SI') then
                begin
                if (saldo < (NEW.rcde_abono + NEW.rcde_dtof)) then
                    EXCEPTION DOCUMENTO_ABONO_MAYOR 'EL SALDO DEL DOCUMENTO ' || NEW.rcde_prefijo || NEW.rcde_numero || ' ES INSUFICIENTE.';
                end
            ELSE
                begin
                if (saldo < (NEW.rcde_abono + NEW.rcde_rtfte + NEW.rcde_rtiva + NEW.rcde_rtica + NEW.rcde_dtof)) then
                    EXCEPTION DOCUMENTO_ABONO_MAYOR 'EL SALDO DEL DOCUMENTO ' || NEW.rcde_prefijo || NEW.rcde_numero || ' ES INSUFICIENTE.';
                end
            END
        EXISTE = 'N';
        select 'S' from saldos_doc_cartera where sdca_tiporef = new.rcde_tipodoc and sdca_idref = new.rcde_iddoc and sdca_fecha = :FEC into :EXISTE;
        if (Existe = 'S') then
            begin
            /* actualice el saldo del dia */
            UPDATE saldos_doc_cartera
                SET SDCA_ABONO = SDCA_ABONO + NEW.rcde_abono + new.rcde_dtof,
                SDCA_ABRTFTE = SDCA_ABRTFTE + NEW.rcde_RTFTE,
                SDCA_ABRTIVA = SDCA_ABRTIVA + NEW.rcde_RTIVA,
                SDCA_ABRTICA = SDCA_ABRTICA + NEW.rcde_RTICA,
                SDCA_TRM = :TRM
                WHERE SDCA_TIPOREF = NEW.RCDE_TIPODOC AND SDCA_IDREF = NEW.rcde_IDDOC AND SDCA_FECHA = :FEC;
            END
        ELSE
            BEGIN
            /* Inserte un nuevo saldo diario */
            INSERT INTO SALDOS_DOC_CARTERA (SDCA_TIPOREF, SDCA_IDREF, SDCA_FECHA, TERC_NIT, SDCA_RTFTE, SDCA_RTIVA, SDCA_RTICA, SDCA_ABONO, SDCA_ABRTFTE, SDCA_ABRTIVA, SDCA_ABRTICA, SDCA_DEBITO, SDCA_MONTO, SDCA_TRM)
                VALUES (NEW.RCDE_TIPODOC, NEW.RCDE_IDDOC, :FEC, :NIT, 0, 0, 0, (NEW.rcde_abono+NEW.rcde_dtof), NEW.rcde_rtfte, NEW.rcde_rtiva, NEW.rcde_rtica, 'N', 0, :TRM);
            END
        END
    /* actualice el registro en mov_cliente (por si son varios items) */
    EXISTE = 'N';
    SELECT 'S' FROM MOVIMIENTO_CLIENTES WHERE MVCL_TIPOREF = 61 AND MVCL_IDREF = NEW.RECA_ID AND MVCL_SUCURSAL = NEW.rcde_sucursal INTO :EXISTE;
    if (EXISTE = 'S') then
        begin
        UPDATE movimiento_clientes
            SET MVCL_MONTO = MVCL_MONTO + NEW.rcde_abono + NEW.rcde_dtof,
                MVCL_RTEFTE = MVCL_RTEFTE + NEW.rcde_rtfte,
                MVCL_RTEIVA = MVCL_RTEIVA + NEW.rcde_rtiva,
                MVCL_RTEICA = MVCL_RTEICA + NEW.rcde_rtica,
                MVCL_TRM = :TRM
            WHERE MVCL_TIPOREF = 61 AND MVCL_IDREF = NEW.RECA_ID AND MVCL_SUCURSAL = NEW.rcde_sucursal;
        end
    ELSE
        INSERT INTO MOVIMIENTO_CLIENTES (MVCL_ID, TERC_NIT, MVCL_TIPOREF, MVCL_IDREF, MVCL_FECHA, MVCL_VENCE, MVCL_CONC, MVCL_MONTO, MVCL_RTEFTE, MVCL_RTEIVA, MVCL_RTEICA, MVCL_DEBITO, MVCL_ABONO, MVCL_PREFREF, MVCL_NUMREF, MVCL_SUCURSAL, COBR_COD, MVCL_TRM)
            VALUES (GEN_ID(ID_MOVCLI, 1), :NIT, 61, NEW.RECA_ID, :FEC, :FEC, :CONCEPTO, (NEW.RCDE_ABONO+NEW.RCDE_DTOF), NEW.RCDE_RTFTE, NEW.RCDE_RTIVA, NEW.RCDE_RTICA, 'N', 'S', :PREFIJO, :NUMERO, NEW.rcde_sucursal, :COBR, :TRM);

    /* acumule los puntos del vendedor */
    SELECT MVCL_FECHA FROM MOVIMIENTO_CLIENTES WHERE MVCL_TIPOREF = new.rcde_tipodoc AND MVCL_IDREF = new.rcde_iddoc
        INTO :FECDOC;
    if (FECDOC IS NOT NULL) then
        DIAS = FEC - FECDOC;
    else
        DIAS = 999;
    execute procedure lee_configuracion('FACTURACION', 'FACTURAS', 'ACUMULAR PUNTOS DE VENTAS POR VENDEDOR') returning_values (ACUMULA);
    execute procedure lee_configuracion('FACTURACION', 'FACTURAS', 'DIAS DE RECAUDO MAXIMO PARA ACUMULAR PUNTOS AL VENDEDOR') returning_values (DIASMAX);
    if ((acumula = 'SI') and (diasmax >= dias)) then
        begin
        SELECT COPU_FACTOR FROM comisiones_puntos WHERE COPU_COD = NEW.rcde_comip INTO :FACTOR;
        if ((NEW.rcde_tipodoc = 31) or (NEW.rcde_tipodoc = 41)) then
            begin
            /* recorra la factura acumulando los puntos */
            if (new.rcde_tipodoc = 31) then
                select (fact_total-fact_ivamonto)/fact_total from facturas where fact_id = new.rcde_iddoc into :factord;
            if (new.rcde_tipodoc = 41) then
                select ndcl_monto/(ndcl_monto+ndcl_ivamonto) from notas_debito_clientes where ndcl_id = new.rcde_iddoc into :factord;
            /* inserte el registro de puntos */
            insert into puntos_vendedor (vend_cod, ptvt_fecha, ptvt_tipodoc, ptvt_iddoc, ptvt_db, ptvt_cr)
                values (:cobr, :fec, new.rcde_tipodoc, new.rcde_iddoc, (new.rcde_abono*:factord*:factor), 0);
            end
        if ((new.rcde_tipodoc = 33) or (new.rcde_tipodoc = 42)) then
            begin
            if (new.rcde_tipodoc = 33) then
                select (devt_total-devt_ivamonto)/devt_total from devoluciones_ventas where devt_id = new.rcde_iddoc into :factord;
            if (new.rcde_tipodoc = 42) then
                select nccl_monto/(nccl_monto+nccl_ivamonto) from notas_credito_clientes where nccl_id = new.rcde_iddoc into :factord;
            /* inserte el registro de puntos */
            insert into puntos_vendedor (vend_cod, ptvt_fecha, ptvt_tipodoc, ptvt_iddoc, ptvt_db, ptvt_cr)
                values (:cobr, :fec, new.rcde_tipodoc, new.rcde_iddoc, 0, (new.rcde_abono*:factord*:factor));
            end
        end
    end
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER TRIGGER RECIBOS_CAJA_DETALLE_AU
AS
declare variable EXISTE CHAR(1);
declare variable FEC DATE;
declare variable NIT VARCHAR(20);
declare variable CONCEPTO VARCHAR(60);
declare variable PREFIJO VARCHAR(4);
declare variable NUMERO VARCHAR(6);
declare variable SALDO NUMERIC(18,2);
declare variable RETES char(2);
declare variable OK CHAR(1);
declare variable RCANTI INTEGER;
declare variable COBR INTEGER;
declare variable ACUMULA CHAR(2);
declare variable DIASMAX INTEGER;
declare variable FACTOR NUMERIC(9,4);
declare variable FACTORD NUMERIC(9,4);
declare variable DIAS INTEGER;
declare variable FECDOC DATE;
declare variable TRM NUMERIC(18,2);
BEGIN
execute procedure lee_configuracion('FACTURACION', 'FACTURAS', 'ACUMULAR PUNTOS DE VENTAS POR VENDEDOR') returning_values (ACUMULA);
select PREF_PRE, RECA_NUMERO, reca_fecha, RECA_CONC, TERC_NIT, COBR_COD, RECA_TRM
    from recibos_caja where reca_id = new.reca_id
    into :PREFIJO, :NUMERO, :FEC, :CONCEPTO, :NIT, :COBR, :TRM;
/* Borre el viejo */
if ((old.RECA_ID <> 0) AND (OLD.rcde_anulado = 'N')) then
    BEGIN
    OK = 'N';
    if (OLD.RCDE_TIPODOC = 45) then
        BEGIN
        SELECT RECA_ID FROM ANTICIPOS_CLIENTE WHERE ANCL_ID = OLD.RCDE_IDDOC INTO :RCANTI;
        if (RCANTI = OLD.RECA_ID) then
            begin
            OK = 'S';
            if (NEW.rcde_anulado = 'N') then
                delete from anticipos_cliente where ANCL_ID = OLD.RCDE_IDDOC;
            else
                UPDATE anticipos_cliente SET ANCL_ANULADO = 'S' where ANCL_ID = OLD.RCDE_IDDOC;
            end
        END
    if (OK = 'N') then
        BEGIN
        UPDATE saldos_doc_cartera
            SET SDCA_ABONO = SDCA_ABONO - old.rcde_abono - OLD.RCDE_DTOF,
            SDCA_ABRTFTE = SDCA_ABRTFTE - old.rcde_RTFTE,
            SDCA_ABRTIVA = SDCA_ABRTIVA - old.rcde_RTIVA,
            SDCA_ABRTICA = SDCA_ABRTICA - old.rcde_RTICA
            WHERE SDCA_TIPOREF = old.RCDE_TIPODOC AND SDCA_IDREF = old.rcde_IDDOC AND SDCA_FECHA = :FEC;
        END
    UPDATE movimiento_clientes
        SET MVCL_MONTO = MVCL_MONTO - OLD.rcde_abono - OLD.RCDE_DTOF,
        MVCL_RTEFTE = MVCL_RTEFTE - OLD.rcde_rtfte,
        MVCL_RTEIVA = MVCL_RTEIVA - OLD.rcde_rtiva,
        MVCL_RTEICA = MVCL_RTEICA - OLD.rcde_rtica
        WHERE MVCL_TIPOREF = 61 AND MVCL_IDREF = OLD.RECA_ID;

    /* DESHAGA LOS PUNTOS DEL VENDEDOR */
    if (acumula = 'SI') then
        delete from puntos_vendedor where vend_cod = :cobr and ptvt_tipodoc = old.rcde_tipodoc and ptvt_iddoc = old.rcde_iddoc and ptvt_fecha = :fec;
    END
if ((NEW.RECA_ID <> 0) and (NEW.rcde_anulado = 'N')) then
    BEGIN
    OK = 'N';
    if (new.RCDE_TIPODOC = 45) then
        BEGIN
        /* BUSQUE SI TIENE RECA_ID, SI NO LO ACTUALIZA */
        SELECT RECA_ID FROM ANTICIPOS_CLIENTE WHERE ANCL_ID = NEW.RCDE_IDDOC INTO :RCANTI;
        if (RCANTI = 0) then
            BEGIN
            OK = 'S';
            UPDATE ANTICIPOS_CLIENTE SET RECA_ID = NEW.RECA_ID WHERE ANCL_ID = NEW.RCDE_IDDOC;
            END
        END
    if (OK = 'N') then
        BEGIN
        /* valide que no se pase del saldo */
        execute procedure saldo_doc_cartera(new.rcde_tipodoc, new.rcde_iddoc, '9999/12/31', 0) returning_values(saldo);
        execute procedure lee_configuracion('CARTERA', 'SALDOS', 'DESCONTAR RETENCIONES POR CAUSACION') returning_values (RETES);
        if (SALDO < 0) then
            BEGIN
            if (RETES = 'SI') then
                begin
                if (saldo > (NEW.rcde_abono + NEW.rcde_dtof)) then
                    EXCEPTION DOCUMENTO_ABONO_MAYOR;
                end
            ELSE
                begin
                if (saldo > (NEW.rcde_abono + NEW.rcde_rtfte + NEW.rcde_rtiva + NEW.rcde_rtica + NEW.rcde_dtof)) then
                    EXCEPTION DOCUMENTO_ABONO_MAYOR;
                end
            END
        else
            BEGIN
            if (RETES = 'SI') then
                begin
                if (saldo < (NEW.rcde_abono + NEW.rcde_dtof)) then
                    EXCEPTION DOCUMENTO_ABONO_MAYOR;
                end
            ELSE
                begin
                if (saldo < (NEW.rcde_abono + NEW.rcde_rtfte + NEW.rcde_rtiva + NEW.rcde_rtica + NEW.rcde_dtof)) then
                    EXCEPTION DOCUMENTO_ABONO_MAYOR;
                end
            END
        select 'S' from saldos_doc_cartera where sdca_tiporef = new.rcde_tipodoc and sdca_idref = new.rcde_iddoc and sdca_fecha = :FEC into :EXISTE;
        if (Existe = 'S') then
            /* actualice el saldo del dia */
            UPDATE saldos_doc_cartera
                SET SDCA_ABONO = SDCA_ABONO + NEW.rcde_abono + NEW.RCDE_DTOF,
                    SDCA_ABRTFTE = SDCA_ABRTFTE + NEW.rcde_RTFTE,
                    SDCA_ABRTIVA = SDCA_ABRTIVA + NEW.rcde_RTIVA,
                    SDCA_ABRTICA = SDCA_ABRTICA + NEW.rcde_RTICA,
                    SDCA_TRM = :TRM
                WHERE SDCA_TIPOREF = NEW.RCDE_TIPODOC AND SDCA_IDREF = NEW.rcde_IDDOC AND SDCA_FECHA = :FEC;
        ELSE
            /* Inserte un nuevo saldo diario */
            INSERT INTO SALDOS_DOC_CARTERA (SDCA_TIPOREF, SDCA_IDREF, SDCA_FECHA, TERC_NIT, SDCA_RTFTE, SDCA_RTIVA, SDCA_RTICA, SDCA_ABONO, SDCA_ABRTFTE, SDCA_ABRTIVA, SDCA_ABRTICA, SDCA_DEBITO, SDCA_MONTO, SDCA_TRM)
                VALUES (NEW.RCDE_TIPODOC, NEW.RCDE_IDDOC, :FEC, :NIT, 0, 0, 0, (NEW.rcde_abono+NEW.RCDE_DTOF), NEW.rcde_rtfte, NEW.rcde_rtiva, NEW.rcde_rtica, 'N', 0, :TRM);
        END /* OK = N */
    /* Registre o actualice el registro en movimiento_cliente */
    EXISTE = 'N';
    SELECT 'S' FROM MOVIMIENTO_CLIENTES WHERE MVCL_TIPOREF = 61 AND MVCL_IDREF = NEW.RECA_ID and mvcl_sucursal = new.rcde_sucursal INTO :EXISTE;
    if (EXISTE = 'S') then
        begin
        /* Deshaga el viejo */
        if (old.RECA_ID <> 0) then
            UPDATE movimiento_clientes
                SET MVCL_MONTO = MVCL_MONTO - OLD.rcde_abono - OLD.rcde_dtof,
                    MVCL_RTEFTE = MVCL_RTEFTE - OLD.rcde_rtfte,
                    MVCL_RTEIVA = MVCL_RTEIVA - OLD.rcde_rtiva,
                    MVCL_RTEICA = MVCL_RTEICA - OLD.rcde_rtica
                WHERE MVCL_TIPOREF = 61 AND MVCL_IDREF = NEW.RECA_ID AND MVCL_SUCURSAL = NEW.rcde_sucursal;
        /* Actualice el nuevo */
        UPDATE movimiento_clientes
            SET MVCL_MONTO = MVCL_MONTO + NEW.rcde_abono + NEW.rcde_dtof,
                MVCL_RTEFTE = MVCL_RTEFTE + NEW.rcde_rtfte,
                MVCL_RTEIVA = MVCL_RTEIVA + NEW.rcde_rtiva,
                MVCL_RTEICA = MVCL_RTEICA + NEW.rcde_rtica,
                MVCL_TRM = :TRM
            WHERE MVCL_TIPOREF = 61 AND MVCL_IDREF = NEW.RECA_ID AND MVCL_SUCURSAL = NEW.rcde_sucursal;
        end
    ELSE
        INSERT INTO MOVIMIENTO_CLIENTES (MVCL_ID, TERC_NIT, MVCL_TIPOREF, MVCL_IDREF, MVCL_FECHA, MVCL_VENCE, MVCL_CONC, MVCL_MONTO, MVCL_RTEFTE, MVCL_RTEIVA, MVCL_RTEICA, MVCL_DEBITO, MVCL_ABONO, MVCL_PREFREF, MVCL_NUMREF, MVCL_SUCURSAL, COBR_COD, MVCL_TRM)
            VALUES (GEN_ID(ID_MOVCLI, 1), :NIT, 61, NEW.RECA_ID, :FEC, :FEC, :CONCEPTO, (NEW.RCDE_ABONO+NEW.RCDE_DTOF), NEW.RCDE_RTFTE, NEW.RCDE_RTIVA, NEW.RCDE_RTICA, 'N', 'S', :PREFIJO, :NUMERO, NEW.rcde_sucursal, :COBR, :TRM);

    /* acumule los puntos del vendedor */
    SELECT MVCL_FECHA FROM MOVIMIENTO_CLIENTES WHERE MVCL_TIPOREF = new.rcde_tipodoc AND MVCL_IDREF = new.rcde_iddoc
        INTO :FECDOC;
    if (FECDOC IS NOT NULL) then
        DIAS = FEC - FECDOC;
    else
        DIAS = 999;
    execute procedure lee_configuracion('FACTURACION', 'FACTURAS', 'DIAS DE RECAUDO MAXIMO PARA ACUMULAR PUNTOS AL VENDEDOR') returning_values (DIASMAX);
    if ((acumula = 'SI') and (diasmax >= dias)) then
        begin
        SELECT COPU_FACTOR FROM comisiones_puntos WHERE COPU_COD = NEW.rcde_comip INTO :FACTOR;
        if ((NEW.rcde_tipodoc = 31) or (NEW.rcde_tipodoc = 41)) then
            begin
            /* recorra la factura acumulando los puntos */
            if (new.rcde_tipodoc = 31) then
                select (fact_total-fact_ivamonto)/fact_total from facturas where fact_id = new.rcde_iddoc into :factord;
            if (new.rcde_tipodoc = 41) then
                select ndcl_monto/(ndcl_monto+ndcl_ivamonto) from notas_debito_clientes where ndcl_id = new.rcde_iddoc into :factord;
            /* inserte el registro de puntos */
            insert into puntos_vendedor (vend_cod, ptvt_fecha, ptvt_tipodoc, ptvt_iddoc, ptvt_db, ptvt_cr)
                values (:cobr, :fec, new.rcde_tipodoc, new.rcde_iddoc, (new.rcde_abono*:factord*:factor), 0);
            end
        if ((new.rcde_tipodoc = 33) or (new.rcde_tipodoc = 42)) then
            begin
            if (new.rcde_tipodoc = 33) then
                select (devt_total-devt_ivamonto)/devt_total from devoluciones_ventas where devt_id = new.rcde_iddoc into :factord;
            if (new.rcde_tipodoc = 42) then
                select nccl_monto/(nccl_monto+nccl_ivamonto) from notas_credito_clientes where nccl_id = new.rcde_iddoc into :factord;
            /* inserte el registro de puntos */
            insert into puntos_vendedor (vend_cod, ptvt_fecha, ptvt_tipodoc, ptvt_iddoc, ptvt_db, ptvt_cr)
                values (:cobr, :fec, new.rcde_tipodoc, new.rcde_iddoc, 0, (new.rcde_abono*:factord*:factor));
            end
        end
    END /* NUEVO */
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER TRIGGER RECIBOS_CAJA_DETALLE_BI
AS
DECLARE VARIABLE NUMROWS INTEGER;
declare variable PREGTASA CHAR(2);
declare variable TRM NUMERIC(18,2);
declare variable SALDO NUMERIC(18,2);
declare variable SALDOM NUMERIC(18,2);
declare variable RETES CHAR(2);
begin
IF (NEW.RECA_ID IS NOT NULL) THEN
    BEGIN
       SELECT COUNT(*)
       FROM   RECIBOS_CAJA
       WHERE  RECIBOS_CAJA.RECA_ID = NEW.RECA_ID
       INTO   :NUMROWS;
       IF (NUMROWS = 0) THEN
       BEGIN
          EXCEPTION recibo_no_existe;
       END
    END
if (NEW.rcde_sucursal IS NULL) then
    NEW.rcde_sucursal = '01';
/* SI TRM <> 1 CONVIERTA A PESOS LOS VALORES */
EXECUTE PROCEDURE LEE_CONFIGURACION('GENERAL', 'GENERAL', 'PREGUNTAR TASA DE CAMBIO EN DOCUMENTOS DE CARTERA') returning_values (:pregtasa);
if (PREGTASA = 'SI') then
    BEGIN
    SELECT RECA_TRM FROM recibos_caja WHERE RECA_ID = NEW.reca_id INTO :TRM;
    NEW.rcde_abono = NEW.rcde_abono * :trm;
    NEW.rcde_rtfte = NEW.rcde_rtfte * :trm;
    NEW.rcde_rtiva = NEW.rcde_rtiva * :trm;
    NEW.rcde_rtica = NEW.rcde_rtica * :trm;
    NEW.rcde_dtof = NEW.rcde_dtof * :trm;
    /* VERIFIQUE LOS SALDOS Y LLEVE LA DIFERENCIA COMO DIF EN CAMBIO */
    execute procedure lee_configuracion('CARTERA', 'SALDOS', 'DESCONTAR RETENCIONES POR CAUSACION') returning_values (RETES);
    execute procedure saldo_doc_cartera(new.rcde_tipodoc, new.rcde_iddoc, '9999/12/31', 0) returning_values(saldo);
    if (SALDO < 0) then
        BEGIN
        if (RETES = 'SI') then
            begin
            if (saldo > (NEW.rcde_abono + NEW.rcde_dtof)) then
                BEGIN
                execute procedure saldo_doc_cartera(new.rcde_tipodoc, new.rcde_iddoc, '9999/12/31', 1) returning_values(saldoM);
                if (saldoM > ((NEW.rcde_abono + NEW.rcde_dtof)/:TRM)) then
                    EXCEPTION DOCUMENTO_ABONO_MAYOR 'EL SALDO DEL DOCUMENTO ' || NEW.rcde_prefijo || NEW.rcde_numero || ' ES INSUFICIENTE.';
                else
                    BEGIN
                    NEW.rcde_difcambio = :SALDO - (NEW.rcde_abono + NEW.rcde_dtof);
                    NEW.rcde_abono = NEW.rcde_abono - NEW.rcde_difcambio;
                    END
                END
            end
        ELSE
            begin
            if (saldo > (NEW.rcde_abono + NEW.rcde_dtof + NEW.rcde_rtfte + NEW.rcde_rtiva + NEW.rcde_rtica)) then
                begin
                execute procedure saldo_doc_cartera(new.rcde_tipodoc, new.rcde_iddoc, '9999/12/31', 1) returning_values(saldoM);
                if (saldoM > ((NEW.rcde_abono+NEW.rcde_dtof+NEW.rcde_rtfte+NEW.rcde_rtiva+NEW.rcde_rtica)/:TRM)) then
                    EXCEPTION DOCUMENTO_ABONO_MAYOR 'EL SALDO DEL DOCUMENTO ' || NEW.rcde_prefijo || NEW.rcde_numero || ' ES INSUFICIENTE.';
                else
                    BEGIN
                    NEW.rcde_difcambio = :SALDO - (NEW.rcde_abono+NEW.rcde_dtof+NEW.rcde_rtfte+NEW.rcde_rtiva+NEW.rcde_rtica);
                    NEW.rcde_abono = NEW.rcde_abono - NEW.rcde_difcambio;
                    END
                end
            end
        END
    else
        BEGIN
        if (RETES = 'SI') then
            begin
            if (saldo < (NEW.rcde_abono + NEW.rcde_dtof)) then
                BEGIN
                execute procedure saldo_doc_cartera(new.rcde_tipodoc, new.rcde_iddoc, '9999/12/31', 1) returning_values(saldoM);
                if (saldoM < ((NEW.rcde_abono + NEW.rcde_dtof)/:TRM)) then
                    EXCEPTION DOCUMENTO_ABONO_MAYOR 'EL SALDO DEL DOCUMENTO ' || NEW.rcde_prefijo || NEW.rcde_numero || ' ES INSUFICIENTE.';
                else
                    BEGIN
                    NEW.rcde_difcambio = :SALDO - (NEW.rcde_abono + NEW.rcde_dtof);
                    NEW.rcde_abono = NEW.rcde_abono - NEW.rcde_difcambio;
                    END
                END
            end
        ELSE
            begin
            if (saldo < (NEW.rcde_abono + NEW.rcde_dtof + NEW.rcde_rtfte + NEW.rcde_rtiva + NEW.rcde_rtica)) then
                begin
                execute procedure saldo_doc_cartera(new.rcde_tipodoc, new.rcde_iddoc, '9999/12/31', 1) returning_values(saldoM);
                if (saldoM < ((NEW.rcde_abono+NEW.rcde_dtof+NEW.rcde_rtfte+NEW.rcde_rtiva+NEW.rcde_rtica)/:TRM)) then
                    EXCEPTION DOCUMENTO_ABONO_MAYOR 'EL SALDO DEL DOCUMENTO ' || NEW.rcde_prefijo || NEW.rcde_numero || ' ES INSUFICIENTE.';
                else
                    BEGIN
                    NEW.rcde_difcambio = :SALDO - (NEW.rcde_abono + NEW.rcde_dtof+NEW.rcde_rtfte+NEW.rcde_rtiva+NEW.rcde_rtica);
                    NEW.rcde_abono = NEW.rcde_abono - NEW.rcde_difcambio;
                    END
                end
            end
        END
    end
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER TRIGGER FACTURAS_BI
AS
declare variable NUMERO VARCHAR(6);
declare variable AUTOM CHAR(1);
declare variable EXISTE CHAR(1);
DECLARE VARIABLE VALCUPO CHAR(10);
declare variable DISPONIBLE NUMERIC(18,2);
declare variable OK CHAR(1);
declare variable SITOT CHAR(2);
declare variable CODCOBR INTEGER;
declare variable CODVEND INTEGER;
declare variable contado char(1);
declare variable BLOQAUTO CHAR(2);
declare variable FECCONTA VARCHAR(8);
declare variable FECBLO VARCHAR(8);
declare variable FECSERVER CHAR(2);
declare variable PREGTASA CHAR(2);
BEGIN
EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION', 'DOCUMENTOS', 'INHABILITAR FECHA EN DOCUMENTOS') returning_values (:fecserver);
if (FECSERVER = 'SI') then
    NEW.fact_fecha = CAST ('NOW' AS DATE);
/* doble moneda */
if ((NEW.fact_trm IS NULL) OR (NEW.FACT_TRM = 0)) then
    NEW.fact_trm = 1;
EXECUTE PROCEDURE LEE_CONFIGURACION('GENERAL', 'GENERAL', 'PREGUNTAR TASA DE CAMBIO EN DOCUMENTOS DE CARTERA') returning_values (:pregtasa);
if (PREGTASA = 'SI') then
    BEGIN
    NEW.fact_dtomonto = NEW.fact_dtomonto * NEW.fact_trm;
    NEW.fact_comimonto = NEW.fact_comimonto * NEW.fact_trm;
    NEW.fact_adicional = NEW.fact_adicional * NEW.fact_trm;
    NEW.fact_ivamonto = NEW.fact_ivamonto * NEW.fact_trm;
    NEW.fact_rtftemonto = NEW.fact_rtftemonto * NEW.fact_trm;
    NEW.fact_rtivamonto = NEW.fact_rtivamonto * NEW.fact_trm;
    NEW.fact_rticamonto = NEW.fact_rticamonto * NEW.fact_trm;
    NEW.fact_extra = NEW.fact_extra * NEW.fact_trm;
    NEW.fact_dtofmonto = NEW.fact_dtofmonto * NEW.fact_trm;
    NEW.fact_total = NEW.fact_total * NEW.fact_trm;
    NEW.fact_dtoit1 = NEW.fact_dtoit1 * NEW.fact_trm;
    NEW.fact_dtoit2 = NEW.fact_dtoit2 * NEW.fact_trm;
    NEW.fact_dtoit3 = NEW.fact_dtoit3 * NEW.fact_trm;
    END
EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION', 'POS', 'CAMBIAR FECHA DE BLOQUEO AUTOMATICAMENTE AL CAMBIAR FECHA DE LA FACTURA') RETURNING_VALUES (:bloqauto);
if (bloqauto = 'SI') then
    BEGIN
    EXECUTE PROCEDURE LEE_CONFIGURACION ('CONTABILIDAD', 'GENERAL', 'FECHA DE BLOQUEO') RETURNING_VALUES (:FECBLO);
    EXECUTE PROCEDURE fecha_a_conta (NEW.fact_fecha) returning_values (:FECCONTA);
    if (FECBLO > FECCONTA) then
        EXCEPTION CONTABILIDAD_BLOQUEADA;
    if (FECBLO < FECCONTA) then
        UPDATE CONFIGURACION
            SET CONF_VALOR = :FECCONTA
            WHERE (CONF_MODULO = 'CONTABILIDAD') AND (CONF_CATEGORIA = 'GENERAL') AND (CONF_PROPIEDAD = 'FECHA DE BLOQUEO');
    END
OK = 'S';
EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'ACCION A TOMAR SI EL CUPO DE CREDITO ES INSUFICIENTE') RETURNING_VALUES (:VALCUPO);
select auto_contado from autorizaciones where pref_pre = new.pref_pre and tido_cod = 31 into :contado;
if (contado='N') then
BEGIN
  IF (VALCUPO = 'PROHIBIR') THEN
  BEGIN
  OK = 'N';
  /* VERIFIQUE EL CUPO DE CREDITO */
  execute procedure cupo_disponible(new.TERC_NIT, NEW.fact_fecha, NEW.fact_sucursal) returning_values (:DISPONIBLE);
  if (DISPONIBLE >= NEW.FACT_TOTAL) then
    OK = 'S';
  END
END
IF (OK = 'S') THEN
  begin
  /* calcule la comision */
  EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION', 'VENDEDORES', 'COMISIONES EN VENTA INCLUYENDO IMPUESTOS') returning_values (:SITOT);
  if ((NEW.fact_comiporc IS NULL) or (NEW.fact_comiporc = 0)) THEN
    BEGIN
    if (SITOT = 'SI') then
      SELECT MAX(COMI_PORC) FROM comisiones WHERE VEND_COD = NEW.vend_cod AND
        COMI_INICIAL <= NEW.fact_total AND COMI_FINAL >= NEW.fact_total
        INTO NEW.fact_comiporc;
    else
      SELECT MAX(COMI_PORC) FROM comisiones WHERE VEND_COD = NEW.vend_cod AND
        COMI_INICIAL <= (NEW.fact_total -NEW.fact_ivamonto) AND COMI_FINAL >= (NEW.fact_total -NEW.fact_ivamonto)
        INTO NEW.fact_comiporc;
    if (NEW.fact_comiporc IS NULL) then
        NEW.fact_comiporc = 0;
    END
  if (SITOT = 'SI') then
      NEW.fact_comimonto = NEW.fact_total * NEW.fact_comiporc / 100;
  ELSE
      NEW.fact_comimonto = (NEW.fact_total -NEW.fact_ivamonto) * NEW.fact_comiporc / 100;

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

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

select auto_numero from autorizaciones where auto_inicial <= new.fact_numero and auto_final >= new.fact_numero and auto_fecha <= new.fact_fecha and auto_vence >= new.fact_fecha and pref_pre = new.pref_pre into new.auto_numero;
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER TRIGGER PEDIDOS_BI
AS
declare variable NUMERO VARCHAR(6);
declare variable AUTOM CHAR(1);
declare variable EXISTE CHAR(1);
/*DECLARE VARIABLE VALCUPO CHAR(10);*/
declare variable CUPOPED CHAR(10);
declare variable DISPONIBLE NUMERIC(18,2);
declare variable OK CHAR(1);
declare variable FECSERVER CHAR(2);
BEGIN
EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION', 'DOCUMENTOS', 'INHABILITAR FECHA EN DOCUMENTOS') returning_values (:fecserver);
if (FECSERVER = 'SI') then
    NEW.pedi_fecha = CAST ('NOW' AS DATE);
OK = 'S';
/*EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'ACCION A TOMAR SI EL CUPO DE CREDITO ES INSUFICIENTE') RETURNING_VALUES (:VALCUPO);*/
EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION','PEDIDOS','VALIDAR CUPO DE CREDITO EN EL PEDIDO') RETURNING_VALUES (:CUPOPED);
IF (CUPOPED = 'PROHIBIR') THEN /*AND (CUPOPED = 'SI')) THEN*/
  BEGIN
  OK = 'N';
  /* VERIFIQUE EL CUPO DE CREDITO */
  execute procedure cupo_disponible(new.TERC_NIT, NEW.pedi_fecha, NEW.pedi_sucursal) returning_values (:DISPONIBLE);
  if (DISPONIBLE >= NEW.pedi_total) then
    OK = 'S';
  END
IF (OK = 'S') THEN
  begin
  if (NEW.NUMOK = 'N') then
    BEGIN
    /* Actualice el contador del prefijo */
    SELECT PREF_ACTUAL, PREF_AUTO FROM PREFIJOS WHERE TIDO_COD = 34 AND PREF_PRE = NEW.PREF_PRE INTO :NUMERO, :AUTOM;
    /* ACTUALICE EL NUMERO EN COMPROBANTE_ENCABEZADO  */
    if (AUTOM = 'S') then
        BEGIN
        NEW.PEDI_NUMERO = NUMERO;
        NUMERO = CAST((CAST(NUMERO AS INTEGER) + 1) AS CHAR(6));
        UPDATE PREFIJOS
          SET PREF_ACTUAL = :NUMERO
          WHERE TIDO_COD = 34 AND PREF_PRE = NEW.PREF_PRE;
        END
    ELSE
        BEGIN
        if (CAST(NUMERO AS INTEGER) = CAST(NEW.PEDI_NUMERO AS INTEGER)) then
            UPDATE PREFIJOS
                SET PREF_ACTUAL = CAST((CAST(PREF_ACTUAL AS INTEGER) + 1) AS CHAR(6))
                WHERE TIDO_COD = 34 AND PREF_PRE = NEW.PREF_PRE;
        END
    EXECUTE PROCEDURE COMPLETA_CEROS (NEW.PEDI_numero) returning_values (NEW.PEDI_numero);
    NEW.NUMOK = 'S';
    END
  /* Verifique que el numero no existe previamente */
  EXISTE = 'N';
  SELECT 'S' FROM PEDIDOS WHERE PREF_PRE = NEW.PREF_PRE AND PEDI_NUMERO = NEW.PEDI_NUMERO INTO :EXISTE;
  if (EXISTE = 'S') then
    EXCEPTION DOCUMENTO_REGISTRADO;
  END
else
  begin
  EXCEPTION CUPO_INSUFICIENTE;
  end
if ((new.PEDI_TOTAL-new.PEDI_IVAMONTO+new.PEDI_DTOMONTO-new.PEDI_ADICIONAL) = 0) then
    NEW.PEDI_FACTOR = 1;
else
    NEW.PEDI_FACTOR = (new.PEDI_TOTAL-new.PEDI_IVAMONTO)/(new.PEDI_TOTAL-new.PEDI_IVAMONTO+new.PEDI_DTOMONTO-new.PEDI_ADICIONAL);
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER RECIBOS_CAJA_DETALLE_BI FOR RECIBOS_CAJA_DETALLE
ACTIVE BEFORE INSERT POSITION 0
AS
DECLARE VARIABLE NUMROWS INTEGER;
declare variable PREGTASA CHAR(2);
declare variable TRM NUMERIC(18,2);
declare variable TRMDOC NUMERIC(18,2);
begin
IF (NEW.RECA_ID IS NOT NULL) THEN
    BEGIN
       SELECT COUNT(*)
       FROM   RECIBOS_CAJA
       WHERE  RECIBOS_CAJA.RECA_ID = NEW.RECA_ID
       INTO   :NUMROWS;
       IF (NUMROWS = 0) THEN
       BEGIN
          EXCEPTION recibo_no_existe;
       END
    END
if (NEW.rcde_sucursal IS NULL) then
    NEW.rcde_sucursal = '01';
/* SI TRM <> 1 CONVIERTA A PESOS LOS VALORES */
EXECUTE PROCEDURE LEE_CONFIGURACION('GENERAL', 'GENERAL', 'PREGUNTAR TASA DE CAMBIO EN DOCUMENTOS DE CARTERA') returning_values (:pregtasa);
if (PREGTASA = 'SI') then
    BEGIN
    SELECT RECA_TRM FROM recibos_caja WHERE RECA_ID = NEW.reca_id INTO :TRM;
    SELECT MVCL_TRM FROM movimiento_clientes M WHERE M.mvcl_tiporef = NEW.rcde_tipodoc AND M.mvcl_idref = NEW.rcde_iddoc INTO :TRMDOC;
    NEW.rcde_difcambio = (NEW.rcde_abono + NEW.rcde_dtof) * (TRM - TRMDOC);
    NEW.rcde_abono = NEW.rcde_abono * :trmdoc;
    NEW.rcde_rtfte = NEW.rcde_rtfte * :trmdoc;
    NEW.rcde_rtiva = NEW.rcde_rtiva * :trmdoc;
    NEW.rcde_rtica = NEW.rcde_rtica * :trmdoc;
    NEW.rcde_dtof = NEW.rcde_dtof * :trmdoc;
    end
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER RECIBOS_CAJA_PAGO_BI FOR RECIBOS_CAJA_PAGO
ACTIVE BEFORE INSERT POSITION 0
as
declare variable CAJA INTEGER;
declare variable NUMROWS INTEGER;
declare variable PREGTASA CHAR(2);
declare variable TRM NUMERIC(18,2);
begin
/* SI TRM <> 1 CONVIERTA A PESOS LOS VALORES */
EXECUTE PROCEDURE LEE_CONFIGURACION('GENERAL', 'GENERAL', 'PREGUNTAR TASA DE CAMBIO EN DOCUMENTOS DE CUENTAS POR PAGAR') returning_values (:pregtasa);
if (PREGTASA = 'SI') then
    BEGIN
    SELECT RECA_TRM FROM recibos_caja WHERE RECA_ID = NEW.reca_id INTO :TRM;
    NEW.rcpa_monto = NEW.rcpa_monto * :trm;
    END
/* NO PERMITA UNA FORMA DE PAGO REPETIDA */
if (NEW.fopa_id <> 1) then
    BEGIN
    SELECT CAJA_ID FROM recibos_caja WHERE RECA_ID = NEW.reca_id INTO :CAJA;
    SELECT COUNT(*) FROM documentos_pago_caja WHERE caja_id = :CAJA AND fopa_id = new.fopa_id and dpca_banco = NEW.rcpa_banco AND
        dpca_cuenta = NEW.rcpa_cuenta AND dpca_numero = NEW.rcpa_numero AND dpca_tiposal = 0 and dpca_idsal = 0
        INTO :NUMROWS;
    if (numrows > 0) then
        exception documento_pago_salido;
    END
end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER RECIBOS_CAJA_CRUCEC_BI FOR RECIBOS_CAJA_CRUCEC
ACTIVE BEFORE INSERT POSITION 0
as
declare variable PREGTASA CHAR(2);
declare variable TRM NUMERIC(18,2);
declare variable TRMDOC NUMERIC(18,2);
begin
/* SI TRM <> 1 CONVIERTA A PESOS LOS VALORES */
EXECUTE PROCEDURE LEE_CONFIGURACION('GENERAL', 'GENERAL', 'PREGUNTAR TASA DE CAMBIO EN DOCUMENTOS DE CUENTAS POR PAGAR') returning_values (:pregtasa);
if (PREGTASA = 'SI') then
    BEGIN
    SELECT RECA_TRM FROM recibos_caja WHERE RECA_ID = NEW.reca_id INTO :TRM;
    SELECT MVPR_TRM FROM MOVIMIENTO_PROVEEDOR M WHERE M.mvpr_tiporef = NEW.rccr_tipodoc AND M.mvpr_idref = NEW.rccr_iddoc INTO :TRMDOC;
    NEW.rccr_difcambio = (NEW.rccr_abono + NEW.rccr_dtof) * (TRM - TRMDOC);
    NEW.rccr_abono = NEW.rccr_abono * :trmdoc;
    NEW.rccr_rtfte = NEW.rccr_rtfte * :trmdoc;
    NEW.rccr_rtiva = NEW.rccr_rtiva * :trmdoc;
    NEW.rccr_rtica = NEW.rccr_rtica * :trmdoc;
    NEW.rccr_dtof = NEW.rccr_dtof * :trmdoc;
    end
end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER PROCEDURE SALDO_DOC_CXPAGAR(
    TIPO INTEGER,
    ID INTEGER,
    FECHA DATE,
    MONEDA INTEGER)
RETURNS (
    SALDO NUMERIC(18,2))
AS
declare variable DESC_RTES CHAR(2);
declare variable TRM NUMERIC(18,2);
BEGIN
EXECUTE PROCEDURE LEE_CONFIGURACION('CXPAGAR', 'SALDOS', 'DESCONTAR RETENCIONES POR CAUSACION') returning_values (DESC_RTES);
if (DESC_RTES = 'SI') then
    SELECT SUM(SDCP_MONTO-SDCP_ABONO-SDCP_RTEFTE-SDCP_RTIVA-SDCP_RTICA) FROM saldos_doc_cxpagar
        WHERE (SDCP_TIPOREF = :TIPO) AND (SDCP_IDREF = :ID) AND (SDCP_FECHA <= :FECHA) INTO :SALDO;
ELSE
    SELECT SUM(SDCP_MONTO-SDCP_ABONO-SDCP_ABRTFTE-SDCP_ABRTIVA-SDCP_ABRTICA) FROM saldos_doc_cxpagar
        WHERE (SDCP_TIPOREF = :TIPO) AND (SDCP_IDREF = :ID) AND (SDCP_FECHA <= :FECHA) INTO :SALDO;
if (SALDO IS NULL) THEN
    SALDO = 0;
if (MONEDA <> 0) then
    begin
    SELECT MVPR_TRM FROM MOVIMIENTO_PROVEEDOR M WHERE M.mvpr_tiporef = :tipo AND M.mvpr_idref = :id INTO :TRM;
    if (TRM <> 0) then
        SALDO = SALDO / TRM;
    end
SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE BUSCA_ID_DOC_CXPAGAR(
    TIPO INTEGER,
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(6),
    NIT VARCHAR(20),
    FECHA DATE,
    MONEDA INTEGER)
RETURNS (
    ID INTEGER,
    SALDO NUMERIC(18,2),
    RTFTE NUMERIC(18,2),
    RTIVA NUMERIC(18,2),
    RTICA NUMERIC(18,2),
    DTOF NUMERIC(18,2),
    ERROR INTEGER)
AS
declare variable VERNIT VARCHAR(20);
declare variable FEC DATE;
declare variable DTOAPL NUMERIC(18,2);
declare variable FECDTO DATE;
declare variable DESC_RTES CHAR(2);
declare variable TRM NUMERIC(18,2);
BEGIN /*$$IBE$$ 
ERROR = 0;
ID = 0;
EXECUTE PROCEDURE COMPLETA_CEROS(NUMERO) returning_values (NUMERO);
if (TIPO = 51) then
    SELECT NDPR_ID, TERC_NIT, NDPR_FECHA, NDPR_DTOFMONTO, NDPR_DTOFECHA, NDPR_TRM
        FROM NOTAS_DEBITO_PROVEEDOR WHERE PREF_PRE = :PREFIJO AND NDPR_NUMERO = :NUMERO
        INTO :ID, :VERNIT, :FEC, :DTOF, :FECDTO, :TRM;
if (TIPO = 52) then
    SELECT NCPR_ID, TERC_NIT, NCPR_FECHA, NCPR_DTOFMONTO, NCPR_DTOFECHA, NCPR_TRM
        FROM NOTAS_CREDITO_PROVEEDOR WHERE PREF_PRE = :PREFIJO AND NCPR_NUMERO = :NUMERO
        INTO :ID, :VERNIT, :FEC, :DTOF, :FECDTO, :TRM;
if (TIPO = 55) then
    SELECT ANPR_ID, TERC_NIT, ANPR_FECHA, ANPR_DTOFMONTO, ANPR_DTOFECHA, ANPR_TRM
        FROM ANTICIPOS_PROVEEDOR WHERE PREF_PRE = :PREFIJO AND ANPR_NUMERO = :NUMERO
        INTO :ID, :VERNIT, :FEC, :DTOF, :FECDTO, :TRM;
if (TIPO = 21) then
    SELECT FACO_ID, TERC_NIT, FACO_FECHA, FACO_DTOFMONTO, FACO_DTOFFECHA, FACO_TRM
        FROM FACTURAS_COMPRA WHERE PREF_PRE = :PREFIJO AND FACO_NUMERO = :NUMERO
        INTO :ID, :VERNIT, :FEC, :DTOF, :FECDTO, :TRM;
if (TIPO = 24) then
    SELECT DVCO_ID, TERC_NIT, DVCO_FECHA, 0, DVCO_FECHA, DVCO_TRM
        FROM devoluciones_compras WHERE PREF_PRE = :PREFIJO AND DVCO_NUMERO = :NUMERO
        INTO :ID, :VERNIT, :FEC, :DTOF, :FECDTO, :TRM;
if (fecha > FECDTO) then
    DTOF = 0;
if (DTOF IS NULL) then
    DTOF = 0;
if (DTOF <> 0) then
    BEGIN
    if ((MONEDA <> 0) AND (TRM <> 0)) then
        DTOF = DTOF / TRM;
    if (MONEDA = 0) then
        SELECT SUM(EGDE_DTOF) FROM EGRESOS_DETALLE WHERE EGDE_IDDOC = :ID AND EGDE_TIPODOC = :TIPO INTO :DTOAPL;
    ELSE
        SELECT SUM(EGDE_DTOF/EGRE_TRM) FROM EGRESOS_DETALLE D, EGRESOS E
            WHERE E.egre_id = D.egre_id AND EGDE_IDDOC = :ID AND EGDE_TIPODOC = :TIPO INTO :DTOAPL;
    if (DTOAPL IS NULL) then
        DTOAPL = 0;
    DTOF = DTOF - DTOAPL;
    END
if (ID = 0) then
  ERROR = 1;
ELSE
  BEGIN
   $$IBE$$*/ /* VERIFIQUE EL NIT */ /*$$IBE$$ 
  if (VERNIT <> NIT) then
    ERROR = 2;
  else
    BEGIN
     $$IBE$$*/ /* VERIFIQUE QUE LA FECHA DEL ABONO SEA POSTERIOR O IGUAL AL DOC */ /*$$IBE$$ 
    if (FEC > FECHA) then
        ERROR = 3;
    ELSE
        BEGIN
         $$IBE$$*/ /* CALCULE LOS SALDOS */ /*$$IBE$$ 
        if (MONEDA = 0) then
            SELECT SUM(SDCP_MONTO - SDCP_ABONO), SUM(SDCP_RTEFTE - SDCP_ABRTFTE), SUM(SDCP_RTIVA - SDCP_ABRTIVA), SUM(SDCP_RTICA - SDCP_ABRTICA)
                FROM SALDOS_DOC_CXPAGAR WHERE SDCP_TIPOREF = :TIPO AND SDCP_IDREF = :ID
                INTO :SALDO, :RTFTE, :RTIVA, :RTICA;
        ELSE
            SELECT SUM((SDCP_MONTO-SDCP_ABONO)/SDCP_TRM), SUM((SDCP_RTEFTE-SDCP_ABRTFTE)/SDCP_TRM), SUM((SDCP_RTIVA-SDCP_ABRTIVA)/SDCP_TRM), SUM((SDCP_RTICA-SDCP_ABRTICA)/SDCP_TRM)
                FROM SALDOS_DOC_CXPAGAR WHERE SDCP_TIPOREF = :TIPO AND SDCP_IDREF = :ID
                INTO :SALDO, :RTFTE, :RTIVA, :RTICA;
        if (RTFTE IS NULL) then
            RTFTE = 0;
        if (RTIVA IS NULL) then
            RTIVA = 0;
        if (RTICA IS NULL) then
            RTICA = 0;
         $$IBE$$*/ /* TRAIGA EL SALDO NETO */ /*$$IBE$$ 
        EXECUTE PROCEDURE SALDO_DOC_CXPAGAR(TIPO, ID, FECHA,MONEDA) returning_values (SALDO);
        if (SALDO = 0) then
            ERROR = 4;
        ELSE
            BEGIN
             $$IBE$$*/ /* RESTE LAS RETENCIONES YA QUE SE SUGERIRAN */ /*$$IBE$$ 
            EXECUTE PROCEDURE LEE_CONFIGURACION('CXPAGAR', 'SALDOS', 'DESCONTAR RETENCIONES POR CAUSACION') returning_values (DESC_RTES);
            if (DESC_RTES = 'NO') then
                SALDO = SALDO - RTFTE - RTIVA - RTICA;
            SALDO = SALDO - DTOF;
            END
        END
    END
  END
SUSPEND;
 $$IBE$$*/ SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE CXPAGAR_PROVEEDOR(
    NIT VARCHAR(20),
    FECHA DATE,
    MONEDA INTEGER)
RETURNS (
    TIPO INTEGER,
    ID INTEGER,
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(6),
    FECDOC DATE,
    VENCE DATE,
    DIAS INTEGER,
    REFERENCIA VARCHAR(20),
    SALDO NUMERIC(18,2),
    RTFTE NUMERIC(18,2),
    RTIVA NUMERIC(18,2),
    RTICA NUMERIC(18,2),
    DTOF NUMERIC(18,2),
    TIPONOM VARCHAR(8),
    NOMBRE VARCHAR(60),
    CONCEPTO VARCHAR(60),
    TRMDOC NUMERIC(18,2))
AS
declare variable FEC DATE;
declare variable DESC_RTES CHAR(2);
declare variable DTOAPL NUMERIC(18,2);
declare variable VENCIMIENTO VARCHAR(12);
BEGIN /*$$IBE$$ 
  SELECT TERC_NOM FROM TERCEROS WHERE TERC_NIT = :NIT INTO :NOMBRE;
   $$IBE$$*/ /* BUSQUE EN SALDOS_DOC_CXPAGAR LOS QUE TENGAN SALDO > 0 */ /*$$IBE$$ 
  FOR SELECT MVPR_TIPOREF, MVPR_IDREF, MVPR_PREFIJO, MVPR_NUMERO, MVPR_CONC, MVPR_FECHA, MVPR_VENCE
    FROM MOVIMIENTO_PROVEEDOR
    WHERE TERC_NIT = :NIT AND MVPR_FECHA <= :FECHA AND MVPR_ABONO = 'N' and ((:moneda = 0) or (mvpr_trm <> 1))
    ORDER BY MVPR_FECHA
    INTO :TIPO, :ID, :PREFIJO, :NUMERO, :CONCEPTO, :FECDOC, :VENCE
    DO
    BEGIN
    EXECUTE PROCEDURE LEE_CONFIGURACION('CXPAGAR', 'SALDOS', 'ANALISIS DE CXPAGAR CON FECHA FACTURA O VENCIMIENTO') returning_values (VENCIMIENTO);
    if (VENCIMIENTO = 'FECHA') then
        DIAS = FECHA - FECDOC;
    ELSE
        DIAS = FECHA - VENCE;
    REFERENCIA = '';
    EXECUTE PROCEDURE saldo_doc_cxpagar(TIPO, ID, FECHA, MONEDA) returning_values (SALDO);
    if (SALDO <> 0) then
        BEGIN
        SELECT TIDO_NOMCORTO FROM TIPO_DOCUMENTO WHERE TIDO_COD = :TIPO INTO :TIPONOM;
        if (TIPO = 51) then
            SELECT NDPR_DTOFMONTO, NDPR_DTOFECHA, NDPR_NUMPROV, NDPR_TRM
                FROM NOTAS_DEBITO_PROVEEDOR WHERE NDPR_ID = :ID INTO :DTOF, :FEC, :REFERENCIA, :TRMDOC;
        if (TIPO = 52) then
            SELECT NCPR_DTOFMONTO, NCPR_DTOFECHA, NCPR_TRM FROM NOTAS_CREDITO_PROVEEDOR
                WHERE NCPR_ID = :ID INTO :DTOF, :FEC, :TRMDOC;
        if (TIPO = 55) then
            SELECT ANPR_DTOFMONTO, ANPR_DTOFECHA, ANPR_TRM FROM ANTICIPOS_PROVEEDOR
                WHERE ANPR_ID = :ID INTO :DTOF, :FEC, :TRMDOC;
        if (TIPO = 21) then
            SELECT FACO_DTOFMONTO, FACO_DTOFFECHA, FACO_NUMPROV, FACO_TRM FROM FACTURAS_COMPRA
                WHERE FACO_ID = :ID INTO :DTOF, :FEC, :REFERENCIA, :TRMDOC;
        if (TIPO = 24) then
            SELECT 0, :FECHA FROM devoluciones_compras WHERE DVCO_ID = :ID INTO :DTOF, :FEC;
        if (FECHA > FEC) then
            DTOF = 0;
        if (DTOF IS NULL) then
            DTOF = 0;
        if (DTOF <> 0) then
            BEGIN
            if ((moneda <> 0) and (TRMDOC <> 0)) then
                DTOF = DTOF / :TRMDOC;
            if (MONEDA = 0) then
                SELECT SUM(EGDE_DTOF) FROM EGRESOS_DETALLE D, EGRESOS E
                    WHERE E.egre_id = D.egre_id AND EGDE_IDDOC = :ID AND EGDE_TIPODOC = :TIPO INTO :DTOAPL;
            else
                SELECT SUM(EGDE_DTOF/EGRE_TRM) FROM EGRESOS_DETALLE D, EGRESOS E
                    WHERE E.egre_id = D.egre_id AND EGDE_IDDOC = :ID AND EGDE_TIPODOC = :TIPO INTO :DTOAPL;
            if (DTOAPL IS NULL) then
                DTOAPL = 0;
            DTOF = DTOF - DTOAPL;
            END
        if (MONEDA = 0) then
            SELECT SUM(SDCP_RTEFTE - SDCP_ABRTFTE), SUM(SDCP_RTIVA - SDCP_ABRTIVA), SUM(SDCP_RTICA - SDCP_ABRTICA) FROM SALDOS_DOC_CXPAGAR WHERE SDCP_TIPOREF = :TIPO AND SDCP_IDREF = :ID INTO :RTFTE, :RTIVA, :RTICA;
        ELSE
            SELECT SUM((SDCP_RTEFTE-SDCP_ABRTFTE)/SDCP_TRM), SUM((SDCP_RTIVA-SDCP_ABRTIVA)/SDCP_TRM), SUM((SDCP_RTICA-SDCP_ABRTICA)/SDCP_TRM)
                FROM SALDOS_DOC_CXPAGAR WHERE SDCP_TIPOREF = :TIPO AND SDCP_IDREF = :ID INTO :RTFTE, :RTIVA, :RTICA;
        if (RTFTE IS NULL) then
            RTFTE = 0;
        if ((TIPO = 52) or (TIPO = 55) or (TIPO = 24)) THEN
            BEGIN
            if (RTFTE > 0) then
                RTFTE = 0;
            END
        ELSE
            BEGIN
            if (RTFTE < 0) then
                RTFTE = 0;
            END

        if (RTIVA IS NULL) then
            RTIVA = 0;
        if ((TIPO = 52) or (TIPO = 55) or (TIPO = 24)) THEN
            BEGIN
            if (RTIVA > 0) then
                RTIVA = 0;
            END
        ELSE
            BEGIN
            if (RTIVA < 0) then
                RTIVA = 0;
            END

        if (RTICA IS NULL) then
            RTICA = 0;
        if ((TIPO = 52) or (TIPO = 55) or (TIPO = 24)) THEN
            BEGIN
            if (RTICA > 0) then
                RTICA = 0;
            END
        ELSE
            BEGIN
            if (RTICA < 0) then
                RTICA = 0;
            END
         $$IBE$$*/ /* RESTE LAS RETENCIONES YA QUE SE SUGERIRAN */ /*$$IBE$$ 
        EXECUTE PROCEDURE LEE_CONFIGURACION('CXPAGAR', 'SALDOS', 'DESCONTAR RETENCIONES POR CAUSACION') returning_values (DESC_RTES);
        if (DESC_RTES = 'NO') then
            SALDO = SALDO - RTFTE - RTIVA - RTICA;
        SUSPEND;
        END
    END
 $$IBE$$*/ SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE IMPR_APLIPROV(
    ID INTEGER)
RETURNS (
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    CONCEPTO VARCHAR(60),
    NIT VARCHAR(20),
    NOMBRE VARCHAR(60),
    DIR VARCHAR(60),
    CIU VARCHAR(40),
    TEL VARCHAR(40),
    CONTACTO VARCHAR(60),
    FAX VARCHAR(25),
    CEL VARCHAR(25),
    EMAIL VARCHAR(100),
    ITEM INTEGER,
    TIPODOC VARCHAR(8),
    PREFDOC VARCHAR(4),
    NUMDOC VARCHAR(6),
    ABONO NUMERIC(18,2),
    RTFTEMONTO NUMERIC(18,2),
    RTIVAMONTO NUMERIC(18,2),
    RTICAMONTO NUMERIC(18,2),
    SALDODOC NUMERIC(18,2),
    ANTERDOC NUMERIC(18,2),
    OBS BLOB SUB_TYPE 1 SEGMENT SIZE 80,
    PROV_COD VARCHAR(15),
    PROV_CARTERA VARCHAR(60),
    PROV_CODIGOINT VARCHAR(15))
AS
declare variable TIPO INTEGER;
declare variable IDDOC INTEGER;
BEGIN /*$$IBE$$ 
  FOR SELECT PREF_PRE, APPR_NUMERO, APPR_FECHA, APPR_CONC, P.TERC_NIT, TERC_NOM, TERC_DIR, TERC_CIU, TERC_TEL, TERC_CONTACTO, TERC_FAX, TERC_CEL, TERC_EMAIL,
    APPD_ITEM, APPD_TIPODOC, APPD_IDDOC, TIDO_NOMCORTO, APPD_PREFIJO, APPD_NUMERO, APPD_APLICADO,
    APPD_RTFTE, APPD_RTIVA, APPD_RTICA, APPR_OBS, PROV_COD, PROV_CARTERA, PROV_CODIGOINT
    FROM APLICACION_PROVEDOR P, APLICACION_PROVEEDOR_DETALLE PD, TERCEROS T, PROVEEDORES PR, TIPO_DOCUMENTO TD
    WHERE P.TERC_NIT = T.TERC_NIT AND T.TERC_NIT = PR.TERC_NIT AND P.APPR_ID = PD.APPR_ID AND P.APPR_ID = :ID AND APPD_TIPODOC = TD.TIDO_COD
    ORDER BY APPD_ITEM
    INTO :PREFIJO, :NUMERO, :FECHA, :CONCEPTO, :NIT, :NOMBRE, :DIR, :CIU, :TEL, :CONTACTO, :FAX, :CEL, :EMAIL, :ITEM, :TIPO, :IDDOC, :TIPODOC, :PREFDOC, :NUMDOC, :ABONO, :RTFTEMONTO, :RTIVAMONTO, :RTICAMONTO, :OBS, :PROV_COD, :PROV_CARTERA, :PROV_CODIGOINT
    DO
        begin
        EXECUTE PROCEDURE saldo_doc_cxpagar(:TIPO, :IDDOC, :FECHA, 0) returning_values (:SALDODOC);
        if (saldodoc IS NULL) then
            SALDODOC = 0;
        ANTERDOC = SALDODOC + rtftemonto + rtivamonto + rticamonto + abono;
        if (anterdoc IS NULL) then
            ANTERDOC = 0;
        SUSPEND;
        end
SUSPEND;
 $$IBE$$*/ SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE IMPR_EGRESO(
    ID INTEGER)
RETURNS (
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    NIT VARCHAR(20),
    NOMBRE VARCHAR(60),
    DIR VARCHAR(60),
    CIU VARCHAR(40),
    TEL VARCHAR(40),
    CONCEPTO VARCHAR(60),
    MONTO NUMERIC(18,2),
    RTFTE NUMERIC(18,2),
    RTIVA NUMERIC(18,2),
    RTICA NUMERIC(18,2),
    DSCTO NUMERIC(18,2),
    OBS BLOB SUB_TYPE 1 SEGMENT SIZE 80,
    ITEMDOC INTEGER,
    TIPODOC VARCHAR(8),
    PREFDOC VARCHAR(4),
    NUMDOC VARCHAR(6),
    NUMPRV VARCHAR(10),
    ABONODOC NUMERIC(18,2),
    RTFTEDOC NUMERIC(18,2),
    RTIVADOC NUMERIC(18,2),
    RTICADOC NUMERIC(18,2),
    DSCTODOC NUMERIC(18,2),
    SALDODOC NUMERIC(18,2),
    SALDOPROV NUMERIC(18,2),
    ANTERDOC NUMERIC(18,2))
AS
declare variable NUMROWS INTEGER;
declare variable TIPO integer;
declare variable IDDOC INTEGER;
BEGIN /*$$IBE$$ 
  SELECT PREF_PRE, EGRE_NUMERO, EGRE_FECHA, EGRE_CONC,
        E.TERC_NIT, EGRE_NOMTERC, TERC_DIR, TERC_CIU, TERC_TEL,
        EGRE_MONTO, EGRE_RTFTEMONTO, EGRE_RTIVAMONTO, EGRE_RTICAMONTO, EGRE_DTOF,
        EGRE_OBS
    FROM EGRESOS E, TERCEROS T
    WHERE E.TERC_NIT = T.TERC_NIT AND E.EGRE_ID = :ID
    INTO :PREFIJO, :NUMERO, :FECHA, :CONCEPTO, 
        :NIT, :NOMBRE, :DIR, :CIU, :TEL,
        :MONTO, :RTFTE, :RTIVA, :RTICA, :DSCTO,
        :OBS;
  select SALDO from saldo_proveedor(:NIT, :FECHA+1, 0) into :SALDOPROV;
  SELECT COUNT(EGDE_ITEM) FROM EGRESOS_DETALLE
    WHERE EGRE_ID = :ID INTO :NUMROWS;
  if (NUMROWS > 0) then
    FOR SELECT EGDE_ITEM, EGDE_TIPODOC, TIDO_NOMCORTO, EGDE_IDDOC, EGDE_PREFIJO, EGDE_NUMERO, EGDE_ABONO, EGDE_RTFTE, EGDE_RTIVA, EGDE_RTICA, EGDE_DTOF
        FROM EGRESOS_DETALLE ED, TIPO_DOCUMENTO TD
        WHERE TD.TIDO_COD = ED.EGDE_TIPODOC AND ED.EGRE_ID = :ID
        order by egde_item
        INTO :ITEMDOC, :TIPO, :TIPODOC, :IDDOC, :PREFDOC, :NUMDOC, :ABONODOC, :RTFTEDOC, :RTIVADOC, :RTICADOC, :DSCTODOC
        DO
            BEGIN
            if (TIPO = 21) then
                SELECT FACO_NUMPROV FROM FACTURAS_COMPRA WHERE FACO_ID = :iddoc INTO :numprv;
            ELSE
                if (TIPO = 51) then
                    SELECT NDPR_NUMPROV FROM NOTAS_DEBITO_PROVEEDOR WHERE NDPR_ID = :iddoc INTO :numprv;
                ELSE
                    numprv = numdoc;
            EXECUTE PROCEDURE saldo_doc_cxpagar(:TIPO, :IDDOC, :FECHA, 0) returning_values (:SALDODOC);
            ANTERDOC = SALDODOC + RTFTEDOC + RTIVADOC + RTICADOC + ABONODOC + DSCTODOC;
            SUSPEND;
            END
  else
    BEGIN
    SALDOPROV = 0;
    ANTERDOC = 0;
    SALDODOC = 0;
    RTFTEDOC = 0;
    RTIVADOC = 0;
    RTICADOC = 0;
    ABONODOC = 0;
    DSCTODOC = 0;
    numprv = '';
    SUSPEND;
    END
 $$IBE$$*/ SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE REP_ANALISIS_CXPAGAR(
    DESDE VARCHAR(20),
    HASTA VARCHAR(20),
    GRPINI VARCHAR(5),
    GRPFIN VARCHAR(5),
    FECHA DATE,
    DETALLE CHAR(1),
    ORDEN CHAR(1),
    AGRUPA CHAR(1),
    DIASR INTEGER,
    MONEDA INTEGER)
RETURNS (
    NIT VARCHAR(20),
    NOMBRE VARCHAR(60),
    TELEFONO VARCHAR(40),
    CIUDAD VARCHAR(40),
    GRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(60),
    TIPO INTEGER,
    ID INTEGER,
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(6),
    DIAS INTEGER,
    SALDO NUMERIC(18,2),
    CORRIENTE NUMERIC(18,2),
    CERO NUMERIC(18,2),
    TREINTA NUMERIC(18,2),
    SESENTA NUMERIC(18,2),
    NOVENTA NUMERIC(18,2),
    TIPONOM VARCHAR(8),
    FECDOC DATE,
    VENCE DATE,
    NUMPROV VARCHAR(20))
AS
declare variable NITINI VARCHAR(20);
declare variable NITFIN VARCHAR(20);
declare variable NOMINI VARCHAR(20);
declare variable NOMFIN VARCHAR(20);
declare variable OK CHAR(1);
declare variable RTFTE NUMERIC(18,2);
declare variable RTIVA NUMERIC(18,2);
declare variable RTICA NUMERIC(18,2);
declare variable VENCIMIENTO VARCHAR(12);
BEGIN /*$$IBE$$ 
if (ORDEN = 'C') then
    BEGIN
    NITINI = DESDE;
    NITFIN = HASTA;
    NOMINI = '';
    NOMFIN = 'zz';
    END
ELSE
    BEGIN
    NOMINI = DESDE;
    NOMFIN = HASTA;
    NITINI = '';
    NITFIN = 'zz';
    END
 $$IBE$$*/ /* Ubique el NIT */ /*$$IBE$$ 
FOR select T.TERC_NIT, TERC_NOM,  TERC_TEL, TERC_CIU, GRPR_COD
    from terceros T, PROVEEDORES P
    where P.TERC_NIT = T.TERC_NIT AND TERC_PROV = 'S' AND T.TERC_NIT >= :NITINI AND T.TERC_NIT <= :NITFIN AND
        TERC_NOM >= :NOMINI AND TERC_NOM <= :NOMFIN
    INTO :NIT, :NOMBRE, :TELEFONO, :CIUDAD, :GRUPO
    DO  
    BEGIN
    SELECT GRPR_NOM FROM GRUPOS_PROVEEDORES WHERE GRPR_COD = :GRUPO INTO :NOMGRUPO;
    OK = 'N';
    if (AGRUPA = 'G') then
        BEGIN
        if (GRPINI = '') then
            BEGIN
            if ((GRUPO IS NULL) or (GRUPO >= :GRPINI AND GRUPO <= :GRPFIN)) then
                OK = 'S';
            END
        ELSE
            if (GRUPO >= :GRPINI AND GRUPO <= :GRPFIN) then
                OK = 'S';
        END
    if (AGRUPA = 'N') then
        OK = 'S';
    if (OK = 'S') then
        BEGIN
        CORRIENTE = 0;
        CERO = 0;
        TREINTA = 0;
        SESENTA = 0;
        NOVENTA = 0;
         $$IBE$$*/ /* BUSQUE EN SALDOS_DOC_CXPAGAR LOS QUE TENGAN SALDO > 0 */ /*$$IBE$$ 
        FOR SELECT MVPR_TIPOREF, MVPR_IDREF, MVPR_PREFIJO, MVPR_NUMERO, MVPR_FECHA, MVPR_VENCE
            FROM MOVIMIENTO_PROVEEDOR
            WHERE TERC_NIT = :NIT AND MVPR_FECHA <= :FECHA AND MVPR_ABONO = 'N' AND ((:MONEDA = 0) or (MVPR_TRM <> 1))
            INTO :TIPO, :ID, :PREFIJO, :NUMERO, :FECDOC, :VENCE
            DO
            BEGIN
            EXECUTE PROCEDURE saldo_doc_cxpagar(TIPO, ID, FECHA, MONEDA) returning_values (SALDO);
            if (SALDO <> 0) then
                BEGIN
                SELECT TIDO_NOMCORTO FROM TIPO_DOCUMENTO WHERE TIDO_COD = :TIPO INTO :TIPONOM;
                if (MONEDA = 0) then
                    SELECT SUM(SDCP_RTEFTE - SDCP_ABRTFTE), SUM(SDCP_RTIVA - SDCP_ABRTIVA), SUM(SDCP_RTICA - SDCP_ABRTICA)
                        FROM SALDOS_DOC_CXPAGAR WHERE SDCP_TIPOREF = :TIPO AND SDCP_IDREF = :ID
                        INTO :RTFTE, :RTIVA, :RTICA;
                else
                    SELECT SUM((SDCP_RTEFTE-SDCP_ABRTFTE)/SDCP_TRM), SUM((SDCP_RTIVA-SDCP_ABRTIVA)/SDCP_TRM), SUM((SDCP_RTICA-SDCP_ABRTICA)/SDCP_TRM)
                        FROM SALDOS_DOC_CXPAGAR WHERE SDCP_TIPOREF = :TIPO AND SDCP_IDREF = :ID
                        INTO :RTFTE, :RTIVA, :RTICA;
                if (RTFTE IS NULL) then
                    RTFTE = 0;
                if ((TIPO = 52) or (TIPO = 55) or (TIPO = 24)) THEN
                    BEGIN
                    if (RTFTE > 0) then
                        RTFTE = 0;
                    END
                ELSE
                    BEGIN
                    if (RTFTE < 0) then
                        RTFTE = 0;
                    END

                if (RTIVA IS NULL) then
                    RTIVA = 0;
                if ((TIPO = 52) or (TIPO = 55) or (TIPO = 24)) THEN
                    BEGIN
                    if (RTIVA > 0) then
                        RTIVA = 0;
                    END
                ELSE
                    BEGIN
                    if (RTIVA < 0) then
                        RTIVA = 0;
                    END

                if (RTICA IS NULL) then
                    RTICA = 0;
                if ((TIPO = 52) or (TIPO = 55) or (TIPO = 24)) THEN
                    BEGIN
                    if (RTICA > 0) then
                        RTICA = 0;
                    END
                ELSE
                    BEGIN
                    if (RTICA < 0) then
                        RTICA = 0;
                    END
                 $$IBE$$*/ /* AHORA CLASIFIQUE LOS DIAS */ /*$$IBE$$ 
                if (DETALLE = 'S') then
                    BEGIN
                    CORRIENTE = 0;
                    CERO = 0;
                    TREINTA = 0;
                    SESENTA = 0;
                    NOVENTA = 0;
                    END
                EXECUTE PROCEDURE LEE_CONFIGURACION('CXPAGAR', 'SALDOS', 'ANALISIS DE CXPAGAR CON FECHA FACTURA O VENCIMIENTO') returning_values (VENCIMIENTO);
                if (VENCIMIENTO = 'FECHA') then
                    DIAS = FECHA - FECDOC;
                ELSE
                    DIAS = FECHA - VENCE;
                if (DIAS < 0) then
                    CORRIENTE = CORRIENTE + SALDO;
                ELSE
                    if (DIAS < DIASR) then
                        CERO = CERO + SALDO;
                    ELSE
                        if (DIAS < (DIASR * 2)) then
                            TREINTA = TREINTA + SALDO;
                        ELSE
                            if (DIAS < (DIASR * 3)) then
                                SESENTA = SESENTA + SALDO;
                            ELSE
                                NOVENTA = NOVENTA + SALDO;
                if (DETALLE = 'S') then
                    BEGIN
                    if (TIPO = 51) then
                        SELECT NDPR_NUMPROV FROM NOTAS_DEBITO_PROVEEDOR WHERE NDPR_ID = :ID INTO :NUMPROV;
                    ELSE
                        if (TIPO = 21) then
                            SELECT FACO_NUMPROV FROM FACTURAS_COMPRA WHERE FACO_ID = :ID INTO :NUMPROV;
                        ELSE
                            NUMPROV = '';
                    SUSPEND;
                    END
                END  $$IBE$$*/ /* SALDO <> 0 */ /*$$IBE$$ 
            END  $$IBE$$*/ /* FOR MVPR */ /*$$IBE$$ 
        if (DETALLE = 'N') then
            begin
            SALDO = CORRIENTE + CERO + TREINTA + SESENTA + NOVENTA;
            SUSPEND;
            end
        END  $$IBE$$*/ /* OK */ /*$$IBE$$ 
    END  $$IBE$$*/ /* FOR NIT */
SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE REP_CXPAGAR_CONSOLIDADAS(
    DESDE VARCHAR(20),
    HASTA VARCHAR(20),
    GRPINI VARCHAR(5),
    GRPFIN VARCHAR(5),
    FECHA DATE,
    ORDEN CHAR(1),
    AGRUPA CHAR(1),
    MONEDA INTEGER)
RETURNS (
    NIT VARCHAR(20),
    NOMBRE VARCHAR(60),
    TELEFONO VARCHAR(40),
    CIUDAD VARCHAR(40),
    CODZONA VARCHAR(2),
    NOMZONA VARCHAR(60),
    DV CHAR(1),
    CODCIUD CHAR(5),
    NOMCIUD VARCHAR(60),
    SALDO NUMERIC(18,2),
    RTFTE NUMERIC(18,2),
    RTIVA NUMERIC(18,2),
    RTICA NUMERIC(18,2),
    DTOF NUMERIC(18,2))
AS
declare variable NITINI VARCHAR(20);
declare variable NITFIN VARCHAR(20);
declare variable NOMINI VARCHAR(20);
declare variable NOMFIN VARCHAR(20);
declare variable OK CHAR(1);
declare variable PSALDO NUMERIC(18,2);
declare variable PRTFTE NUMERIC(18,2);
declare variable PRTIVA NUMERIC(18,2);
declare variable PRTICA NUMERIC(18,2);
declare variable PDTOF NUMERIC(18,2);
declare variable TIPO INTEGER;
declare variable ID INTEGER;
declare variable DTOAPL NUMERIC(18,2);
declare variable TRM NUMERIC(18,2);
BEGIN /*$$IBE$$ 
if (ORDEN = 'C') then
    BEGIN
    NITINI = DESDE;
    NITFIN = HASTA;
    NOMINI = '';
    NOMFIN = 'zz';
    END
ELSE
    BEGIN
    NOMINI = DESDE;
    NOMFIN = HASTA;
    NITINI = '';
    NITFIN = 'zz';
    END
   $$IBE$$*/ /* Ubique el NIT */ /*$$IBE$$ 
  FOR select T.TERC_NIT, TERC_NOM, TERC_DV, TERC_TEL, TERC_CIU, GRPR_COD, CIUD_COD
    from terceros T, PROVEEDORES P
    where P.TERC_NIT = T.TERC_NIT AND TERC_PROV = 'S' AND T.TERC_NIT >= :NITINI AND T.TERC_NIT <= :NITFIN AND
        TERC_NOM >= :NOMINI AND TERC_NOM <= :NOMFIN
    INTO :NIT, :NOMBRE, :DV, :TELEFONO, :CIUDAD, :CODZONA, :CODCIUD
    DO  
    BEGIN
    OK = 'N';
    if (AGRUPA = 'G') then
        BEGIN
        if (GRPINI = '') then
            BEGIN
            if ((CODZONA IS NULL) or (CODZONA >= :GRPINI AND CODZONA <= :GRPFIN)) then
                OK = 'S';
            END
        ELSE
            if (CODZONA >= :GRPINI AND CODZONA <= :GRPFIN) then
                OK = 'S';
        END
    if (AGRUPA = 'N') then
        OK = 'S';
        
    if (OK = 'S') then
        BEGIN
        SELECT GRPR_NOM FROM GRUPOS_PROVEEDORES WHERE GRPR_COD = :CODZONA INTO :NOMZONA;
        SELECT CIUD_NOM FROM CIUDADES WHERE CIUD_COD = :CODCIUD INTO :NOMCIUD;
        SALDO = 0;
        RTFTE = 0;
        RTIVA = 0;
        RTICA = 0;
        DTOF = 0;
         $$IBE$$*/ /* BUSQUE EN SALDOS_DOC_CXPAGAR LOS QUE TENGAN SALDO > 0 */ /*$$IBE$$ 
        FOR SELECT MVPR_TIPOREF, MVPR_IDREF
          FROM MOVIMIENTO_PROVEEDOR
          WHERE TERC_NIT = :NIT AND MVPR_FECHA <= :FECHA AND MVPR_ABONO = 'N' AND ((:MONEDA = 0) or (MVPR_TRM <> 1))
          INTO :TIPO, :ID
          DO
            BEGIN
            EXECUTE PROCEDURE saldo_doc_cxpagar(TIPO, ID, FECHA, MONEDA) returning_values (PSALDO);
            if (PSALDO <> 0) then
                BEGIN
                if (TIPO = 51) then
                    SELECT NDPR_DTOFMONTO, NDPR_TRM FROM NOTAS_DEBITO_PROVEEDOR
                        WHERE NDPR_ID = :ID INTO :PDTOF, :TRM;
                if (TIPO = 52) then
                    SELECT 0, 1 FROM NOTAS_CREDITO_PROVEEDOR WHERE NCPR_ID = :ID INTO :PDTOF, :TRM;
                if (TIPO = 55) then
                    SELECT ANPR_DTOFMONTO, ANPR_TRM FROM ANTICIPOS_PROVEEDOR WHERE ANPR_ID = :ID INTO :PDTOF, :TRM;
                if (TIPO = 21) then
                    SELECT 0, 1 FROM FACTURAS_COMPRA WHERE FACO_ID = :ID INTO :PDTOF, :TRM;
                if (TIPO = 24) then
                    SELECT 0, 1 FROM devoluciones_compras WHERE DVCO_ID = :ID INTO :PDTOF, :TRM;
                if (DTOF IS NULL) then
                    DTOF = 0;
                if (DTOF <> 0) then
                    BEGIN
                    if ((MONEDA <> 0) AND (TRM <> 0)) then
                        DTOF = DTOF / TRM;
                    if (MONEDA = 0) then
                        SELECT SUM(EGDE_DTOF) FROM EGRESOS_DETALLE WHERE EGDE_IDDOC = :ID AND EGDE_TIPODOC = :TIPO INTO :DTOAPL;
                    else
                        SELECT SUM(EGDE_DTOF/EGRE_TRM) FROM EGRESOS_DETALLE D, EGRESOS E
                            WHERE E.egre_id = D.egre_id AND EGDE_IDDOC = :ID AND EGDE_TIPODOC = :TIPO INTO :DTOAPL;
                    if (DTOAPL IS NULL) then
                        DTOAPL = 0;
                    DTOF = DTOF - DTOAPL;
                    END
                if (MONEDA = 0) then
                    SELECT SUM(SDCP_RTEFTE - SDCP_ABRTFTE), SUM(SDCP_RTIVA - SDCP_ABRTIVA), SUM(SDCP_RTICA - SDCP_ABRTICA)
                        FROM SALDOS_DOC_CXPAGAR WHERE SDCP_TIPOREF = :TIPO AND SDCP_IDREF = :ID INTO :PRTFTE, :PRTIVA, :PRTICA;
                else
                    SELECT SUM((SDCP_RTEFTE-SDCP_ABRTFTE)/SDCP_TRM), SUM((SDCP_RTIVA-SDCP_ABRTIVA)/SDCP_TRM), SUM((SDCP_RTICA-SDCP_ABRTICA)/SDCP_TRM)
                        FROM SALDOS_DOC_CXPAGAR WHERE SDCP_TIPOREF = :TIPO AND SDCP_IDREF = :ID INTO :PRTFTE, :PRTIVA, :PRTICA;
                if (PRTFTE IS NULL) then
                    PRTFTE = 0;
                if ((TIPO = 52) or (TIPO = 55) or (TIPO = 24)) THEN
                    BEGIN
                    if (RTFTE > 0) then
                        RTFTE = 0;
                    END
                ELSE
                    BEGIN
                    if (RTFTE < 0) then
                        RTFTE = 0;
                    END
                if (PRTIVA IS NULL) then
                    PRTIVA = 0;
                if ((TIPO = 52) or (TIPO = 55) or (TIPO = 24)) THEN
                    BEGIN
                    if (RTIVA > 0) then
                        RTIVA = 0;
                    END
                ELSE
                    BEGIN
                    if (RTIVA < 0) then
                        RTIVA = 0;
                    END
                if (PRTICA IS NULL) then
                    PRTICA = 0;
                if ((TIPO = 52) or (TIPO = 55) or (TIPO = 24)) THEN
                    BEGIN
                    if (PRTICA > 0) then
                        PRTICA = 0;
                    END
                ELSE
                    BEGIN
                    if (PRTICA < 0) then
                        PRTICA = 0;
                    END
                SALDO = SALDO + PSALDO;
                RTFTE = RTFTE + PRTFTE;
                RTIVA = RTIVA + PRTIVA;
                RTICA = RTICA + PRTICA;
                DTOF = DTOF + PDTOF;
                END
            END
        SUSPEND;
        END
    END
 $$IBE$$*/ SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE REP_CXPAGAR_PROVEEDOR(
    DESDE VARCHAR(20),
    HASTA VARCHAR(20),
    GRPINI VARCHAR(5),
    GRPFIN VARCHAR(5),
    FECHA DATE,
    ORDEN CHAR(1),
    AGRUPA CHAR(1),
    MONEDA INTEGER)
RETURNS (
    NIT VARCHAR(20),
    NOMBRE VARCHAR(60),
    TELEFONO VARCHAR(40),
    CIUDAD VARCHAR(40),
    CODZONA VARCHAR(2),
    NOMZONA VARCHAR(60),
    DV CHAR(1),
    CODCIUD CHAR(5),
    NOMCIUD VARCHAR(60),
    TIPO INTEGER,
    ID INTEGER,
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(6),
    CONCEPTO VARCHAR(60),
    SALDO NUMERIC(18,2),
    RTFTE NUMERIC(18,2),
    RTIVA NUMERIC(18,2),
    RTICA NUMERIC(18,2),
    DTOF NUMERIC(18,2),
    TIPONOM VARCHAR(8),
    FECDOC DATE,
    VENCE DATE,
    DIAS INTEGER,
    NUMPROV VARCHAR(20))
AS
declare variable NITINI VARCHAR(20);
declare variable NITFIN VARCHAR(20);
declare variable NOMINI VARCHAR(20);
declare variable NOMFIN VARCHAR(20);
declare variable OK CHAR(1);
declare variable DTOAPL NUMERIC(18,2);
declare variable FOV CHAR(12);
declare variable TRM NUMERIC(18,2);
BEGIN /*$$IBE$$ 
if (ORDEN = 'C') then
    BEGIN
    NITINI = DESDE;
    NITFIN = HASTA;
    NOMINI = '';
    NOMFIN = 'zz';
    END
ELSE
    BEGIN
    NOMINI = DESDE;
    NOMFIN = HASTA;
    NITINI = '';
    NITFIN = 'zz';
    END
   $$IBE$$*/ /* Ubique el NIT */ /*$$IBE$$ 
  FOR select T.TERC_NIT, TERC_NOM, TERC_DV, TERC_TEL, TERC_CIU, P.GRPR_COD, T.CIUD_COD
    from terceros T, PROVEEDORES P 
    where P.TERC_NIT = T.TERC_NIT AND TERC_PROV = 'S' AND T.TERC_NIT >= :NITINI AND T.TERC_NIT <= :NITFIN AND
        TERC_NOM >= :NOMINI AND TERC_NOM <= :NOMFIN
    INTO :NIT, :NOMBRE, :DV, :TELEFONO, :CIUDAD, :CODZONA, :CODCIUD
    DO  
    BEGIN
    select GRPR_NOM from GRUPOS_PROVEEDORES where GRPR_COD = :codzona into :NOMZONA;
    select CIUD_NOM from CIUDADES where CIUD_COD = :codciud into :NOMCIUD;
    OK = 'N';
    if (AGRUPA = 'G') then
        BEGIN
        if (GRPINI = '') then
            BEGIN
            if ((CODZONA IS NULL) or (CODZONA >= :GRPINI AND CODZONA <= :GRPFIN)) then
                OK = 'S';
            END
        ELSE
            if (CODZONA >= :GRPINI AND CODZONA <= :GRPFIN) then
                OK = 'S';
        END
    if (AGRUPA = 'C') then
        BEGIN
        if (GRPINI = '') then
            BEGIN
            if ((CODCIUD IS NULL) or (CODCIUD >= :GRPINI AND CODCIUD <= :GRPFIN)) then
                OK = 'S';
            END
        ELSE
            if (CODCIUD >= :GRPINI AND CODCIUD <= :GRPFIN) then
                OK = 'S';
        END
    if (AGRUPA = 'N') then
        OK = 'S';
        
    if (OK = 'S') then
        BEGIN
         $$IBE$$*/ /* BUSQUE EN SALDOS_DOC_CXPAGAR LOS QUE TENGAN SALDO > 0 */ /*$$IBE$$ 
        FOR SELECT MVPR_TIPOREF, MVPR_IDREF, MVPR_PREFIJO, MVPR_NUMERO, MVPR_FECHA, MVPR_VENCE, MVPR_CONC
            FROM MOVIMIENTO_PROVEEDOR
            WHERE TERC_NIT = :NIT AND MVPR_FECHA <= :FECHA AND MVPR_ABONO = 'N' AND ((:MONEDA = 0) or (MVPR_TRM <> 1))
            INTO :TIPO, :ID, :PREFIJO, :NUMERO, :FECDOC, :VENCE, :CONCEPTO
            DO
            BEGIN
            EXECUTE PROCEDURE LEE_CONFIGURACION('CXPAGAR', 'SALDOS', 'ANALISIS DE CXPAGAR CON FECHA FACTURA O VENCIMIENTO') RETURNING_VALUES (FOV);
            if (FOV = 'FECHA') then
                DIAS = FECHA - FECDOC;
            ELSE
                DIAS = FECHA - VENCE;
            EXECUTE PROCEDURE saldo_doc_cxpagar(TIPO, ID, FECHA, MONEDA) returning_values (SALDO);
            if (SALDO <> 0) then
                BEGIN
                SELECT TIDO_NOMCORTO FROM TIPO_DOCUMENTO WHERE TIDO_COD = :TIPO INTO :TIPONOM;
                if (TIPO = 51) then
                    SELECT NDPR_DTOFMONTO, NDPR_NUMPROV, NDPR_TRM FROM NOTAS_DEBITO_PROVEEDOR
                        WHERE NDPR_ID = :ID INTO :DTOF, :NUMPROV, :TRM;
                if (TIPO = 52) then
                    SELECT 0, '', 1 FROM NOTAS_CREDITO_PROVEEDOR WHERE NCPR_ID = :ID INTO :DTOF, :NUMPROV, :TRM;
                if (TIPO = 55) then
                    SELECT ANPR_DTOFMONTO, '', ANPR_TRM FROM ANTICIPOS_PROVEEDOR WHERE ANPR_ID = :ID INTO :DTOF, :NUMPROV, :TRM;
                if (TIPO = 21) then
                    SELECT FACO_DTOFMONTO, FACO_NUMPROV, FACO_TRM FROM FACTURAS_COMPRA WHERE FACO_ID = :ID INTO :DTOF, :NUMPROV, :TRM;
                if (TIPO = 24) then
                    SELECT 0, '', 1 FROM devoluciones_compras WHERE DVCO_ID = :ID INTO :DTOF, :NUMPROV, :TRM;
                if (DTOF IS NULL) then
                    DTOF = 0;
                if (DTOF <> 0) then
                    BEGIN
                    if ((MONEDA <> 0) AND (TRM <> 0)) then
                        DTOF = DTOF / TRM;
                    if (MONEDA = 0) then
                        SELECT SUM(EGDE_DTOF) FROM EGRESOS_DETALLE WHERE EGDE_IDDOC = :ID AND EGDE_TIPODOC = :TIPO INTO :DTOAPL;
                    else
                        SELECT SUM(EGDE_DTOF/EGRE_TRM) FROM EGRESOS_DETALLE D, EGRESOS E
                            WHERE E.egre_id = D.egre_id AND EGDE_IDDOC = :ID AND EGDE_TIPODOC = :TIPO INTO :DTOAPL;

                    if (DTOAPL IS NULL) then
                        DTOAPL = 0;
                    DTOF = DTOF - DTOAPL;
                    END
                if (MONEDA = 0) then
                    SELECT SUM(SDCP_RTEFTE-SDCP_ABRTFTE), SUM(SDCP_RTIVA-SDCP_ABRTIVA), SUM(SDCP_RTICA-SDCP_ABRTICA)
                        FROM SALDOS_DOC_CXPAGAR WHERE SDCP_TIPOREF = :TIPO AND SDCP_IDREF = :ID INTO :RTFTE, :RTIVA, :RTICA;
                else
                    SELECT SUM((SDCP_RTEFTE-SDCP_ABRTFTE)/SDCP_TRM), SUM((SDCP_RTIVA-SDCP_ABRTIVA)/SDCP_TRM), SUM((SDCP_RTICA-SDCP_ABRTICA)/SDCP_TRM)
                        FROM SALDOS_DOC_CXPAGAR WHERE SDCP_TIPOREF = :TIPO AND SDCP_IDREF = :ID INTO :RTFTE, :RTIVA, :RTICA;
                if (RTFTE IS NULL) then
                    RTFTE = 0;
                if ((TIPO = 52) or (TIPO = 55) or (TIPO = 24)) THEN
                    BEGIN
                    if (RTFTE > 0) then
                        RTFTE = 0;
                    END
                ELSE
                    BEGIN
                    if (RTFTE < 0) then
                        RTFTE = 0;
                    END

                if (RTIVA IS NULL) then
                    RTIVA = 0;
                if ((TIPO = 52) or (TIPO = 55) or (TIPO = 24)) THEN
                    BEGIN
                    if (RTIVA > 0) then
                        RTIVA = 0;
                    END
                ELSE
                    BEGIN
                    if (RTIVA < 0) then
                        RTIVA = 0;
                    END

                if (RTICA IS NULL) then
                    RTICA = 0;
                if ((TIPO = 52) or (TIPO = 55) or (TIPO = 24)) THEN
                    BEGIN
                    if (RTICA > 0) then
                        RTICA = 0;
                    END
                ELSE
                    BEGIN
                    if (RTICA < 0) then
                        RTICA = 0;
                    END
                SUSPEND;
                END
            END
        END
    END
 $$IBE$$*/ SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE SALDO_PROVEEDOR(
    NIT VARCHAR(20),
    FECHA DATE,
    MONEDA INTEGER)
RETURNS (
    SALDO NUMERIC(18,2))
AS
DECLARE VARIABLE sal numeric(18,2);
declare variable TIPODOC INTEGER;
declare variable IDDOC INTEGER;
BEGIN /*$$IBE$$ 
fecha = fecha - 1;
saldo = 0;
FOR SELECT MVPR_TIPOREF, MVPR_IDREF FROM movimiento_proveedor
    WHERE TERC_NIT = :NIT AND MVPR_FECHA <= :FECHA AND MVPR_ABONO = 'N'
    INTO :TIPODOC, :IDDOC
    DO
    BEGIN
    EXECUTE PROCEDURE saldo_doc_cxpagar(TIPODOC, IDDOC, FECHA, MONEDA) returning_values (SAL);
    if (SAL <> 0) then
        SALDO = SALDO + SAL;
    END
SUSPEND;
 $$IBE$$*/ SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE CONCILIA_CXPAGAR(
    FECINI DATE,
    FECFIN DATE,
    CTACART VARCHAR(20),
    SUBEMPRESA INTEGER,
    ANTERIOR CHAR(1))
RETURNS (
    NIT VARCHAR(20),
    NOMBRE VARCHAR(60),
    INICIAL NUMERIC(18,2),
    INICIALC NUMERIC(18,2),
    DEBITOS NUMERIC(18,2),
    DEBITOSC NUMERIC(18,2),
    CREDITOS NUMERIC(18,2),
    CREDITOSC NUMERIC(18,2),
    SALDO NUMERIC(18,2),
    SALDOC NUMERIC(18,2),
    DIFERENCIA NUMERIC(18,2))
AS
declare variable ANO CHAR(4);
declare variable MES INTEGER;
declare variable ABONOS NUMERIC(18,2);
declare variable RETES CHAR(2);
begin /*$$IBE$$ 
ano = EXTRACT(YEAR FROM FECFIN);
mes = EXTRACT(MONTH FROM FECFIN);

for select TERC_NIT, TERC_NOM from TERCEROS WHERE TERC_PROV = 'S' into :NIT, :NOMBRE
    DO
    BEGIN
    EXECUTE PROCEDURE saldo_proveedor (NIT, FECINI, 0) returning_values (INICIAL);
    EXECUTE PROCEDURE LEE_CONFIGURACION('CXPAGAR', 'SALDOS', 'DESCONTAR RETENCIONES POR CAUSACION') returning_values(:RETES);
    if (RETES = 'SI') then
        BEGIN
        SELECT SUM(MVPR_MONTO-MVPR_RTFTE-MVPR_RTIVA-MVPR_RTICA)
            FROM movimiento_proveedor
            WHERE TERC_NIT = :NIT AND MVPR_FECHA >= :FECINI AND MVPR_FECHA < :FECFIN AND MVPR_DEBITO = 'S'
            INTO :DEBITOS;
        SELECT SUM(MVPR_MONTO-MVPR_RTFTE-MVPR_RTIVA-MVPR_RTICA)
            FROM movimiento_proveedor
            WHERE TERC_NIT = :NIT AND MVPR_FECHA >= :FECINI AND MVPR_FECHA < :FECFIN AND MVPR_DEBITO = 'N' AND MVPR_ABONO = 'N' and MVPR_TIPOREF <> 55
            INTO :CREDITOS;
        SELECT SUM(MVPR_MONTO) FROM movimiento_proveedor
            WHERE TERC_NIT = :NIT AND MVPR_FECHA >= :FECINI AND MVPR_FECHA < :FECFIN AND MVPR_ABONO = 'S'
            INTO :ABONOS;
        END
    ELSE
        BEGIN
        SELECT SUM(MVPR_MONTO)
            FROM movimiento_proveedor
            WHERE TERC_NIT = :NIT AND MVPR_FECHA >= :FECINI AND MVPR_FECHA < :FECFIN AND MVPR_DEBITO = 'S'
            INTO :DEBITOS;
        SELECT SUM(MVPR_MONTO)
            FROM movimiento_proveedor
            WHERE TERC_NIT = :NIT AND MVPR_FECHA >= :FECINI AND MVPR_FECHA < :FECFIN AND MVPR_DEBITO = 'N' AND MVPR_ABONO = 'N' AND MVPR_TIPOREF <> 55
            INTO :CREDITOS;
        SELECT SUM(MVPR_MONTO+MVPR_RTFTE+MVPR_RTIVA+MVPR_RTICA)
            FROM movimiento_proveedor
            WHERE TERC_NIT = :NIT AND MVPR_FECHA >= :FECINI AND MVPR_FECHA < :FECFIN AND MVPR_ABONO = 'S'
            INTO :ABONOS;
        END
    if (DEBITOS IS NULL) then
        DEBITOS = 0;
    if (CREDITOS IS NULL) then
        CREDITOS = 0;
    if (ABONOS IS NULL) then
        ABONOS = 0;
    CREDITOS = CREDITOS + ABONOS;
    SALDO = INICIAL + DEBITOS - CREDITOS;

     $$IBE$$*/ /* LO CONTABLE */ /*$$IBE$$ 
    EXECUTE PROCEDURE SALDO_TERCERO_MES(ctacart, NIT, ANO, MES, 'S') RETURNING_VALUES (INICIALC);
    EXECUTE PROCEDURE MOVIMIENTO_TERCERO_MES(ctacart, NIT, ANO, MES, 'S') RETURNING_VALUES(DEBITOSC);
    EXECUTE PROCEDURE MOVIMIENTO_TERCERO_MES(ctacart, NIT, ANO, MES, 'N') RETURNING_VALUES(CREDITOSC);
    SALDOC = INICIALC + DEBITOSC - CREDITOSC;
    diferencia = SALDO + SALDOC;
    if (DIFERENCIA <> 0) then
        BEGIN
        if (ANTERIOR <> 'S') then
            SUSPEND;
        ELSE
            BEGIN
            if (DIFERENCIA <> (INICIAL + INICIALC)) then
                SUSPEND;
            END
        END
    END
 $$IBE$$*/ SUSPEND;
end
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE MOVIMIENTO_CXPAGAR_DESDE_HASTA(
    NIT VARCHAR(20),
    DESDE DATE,
    HASTA DATE,
    MONEDA INTEGER)
RETURNS (
    INICIAL NUMERIC(18,2),
    TIPODOC VARCHAR(8),
    IDDOC INTEGER,
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    CONCEPTO VARCHAR(60),
    DEBITO NUMERIC(18,2),
    CREDITO NUMERIC(18,2),
    SALDO NUMERIC(18,2),
    NOMBRE VARCHAR(60),
    RTFTE NUMERIC(18,2),
    RTIVA NUMERIC(18,2),
    RTICA NUMERIC(18,2),
    NUMPROV VARCHAR(20))
AS
declare variable DB CHAR(1);
declare variable AB CHAR(1);
declare variable RETES CHAR(2);
declare variable TRM NUMERIC(18,2);
BEGIN
  /* Ubique el NIT */ /*$$IBE$$ 
  select terc_nom from terceros where terc_nit = :NIT INTO :NOMBRE;
  execute procedure saldo_proveedor (NIT, DESDE, MONEDA) returning_values (INICIAL);
  if (INICIAL is null) then
    INICIAL = 0;
  SALDO = INICIAL;
  EXECUTE PROCEDURE LEE_CONFIGURACION('CXPAGAR', 'SALDOS', 'DESCONTAR RETENCIONES POR CAUSACION') returning_values(:RETES);
  FOR select tido_nomcorto, mvpr_idref, mvpr_prefijo, mvpr_numero, mvpr_fecha, mvpr_conc, mvpr_monto, mvpr_debito, mvpr_rtfte, mvpr_rtiva, mvpr_rtica, mvpr_abono, MVPR_TRM
    from movimiento_proveedor m, tipo_documento t
    where m.mvpr_tiporef = t.tido_cod and terc_nit = :NIT and mvpr_fecha >= :DESDE and mvpr_fecha <= :HASTA AND mvpr_tiporef <> 55 AND ((:MONEDA = 0) or (MVPR_TRM <> 1))
    order by mvpr_fecha, mvpr_tiporef
    into :TIPODOC, :IDDOC, :PREFIJO, :NUMERO, :FECHA, :CONCEPTO, :DEBITO, :DB, :RTFTE, :RTIVA, :RTICA, :AB, :TRM
    DO
    BEGIN
    if (DB = 'N') then
        BEGIN
        if (AB = 'S') then
            if (RETES = 'SI') then
                CREDITO = DEBITO;
            ELSE
                CREDITO = DEBITO + RTFTE + RTIVA + RTICA;
        ELSE
            if (RETES = 'SI') then
                CREDITO = DEBITO - RTFTE - RTIVA - RTICA;
            ELSE
                CREDITO = DEBITO;
        DEBITO = 0;
        END
    ELSE
        BEGIN
        if (RETES = 'SI') then
            DEBITO = DEBITO - RTFTE - RTIVA - RTICA;
        CREDITO = 0;
        END
    if ((MONEDA <> 0) AND (TRM <> 0)) then
        BEGIN
        DEBITO = DEBITO / TRM;
        CREDITO = CREDITO / TRM;
        RTFTE = RTFTE / TRM;
        RTIVA = RTIVA / TRM;
        RTICA = RTICA / TRM;
        END
    SALDO = SALDO + DEBITO - CREDITO;
    NUMPROV = '';
    if (TIPODOC = 'CARGOACR') then
        SELECT NDPR_NUMPROV FROM NOTAS_DEBITO_PROVEEDOR WHERE NDPR_ID = :IDDOC INTO :NUMPROV;
    if (TIPODOC = 'FACTCOMP') then
        SELECT FACO_NUMPROV FROM FACTURAS_COMPRA WHERE FACO_ID = :IDDOC INTO :NUMPROV;
    SUSPEND;
    END
 $$IBE$$*/ SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE MOVIMIENTO_CXPAGAR_MES(
    FECINI DATE,
    FECFIN DATE,
    MONEDA INTEGER)
RETURNS (
    NIT VARCHAR(20),
    NOMBRE VARCHAR(60),
    INICIAL NUMERIC(18,4),
    DEBITOS NUMERIC(18,4),
    CREDITOS NUMERIC(18,4),
    ABONOS NUMERIC(18,4),
    FINAL NUMERIC(18,4))
AS
declare variable RETES CHAR(2);
BEGIN /*$$IBE$$ 
  for select TERC_NIT, TERC_NOM from TERCEROS WHERE TERC_PROV = 'S' into :NIT, :NOMBRE
  DO
    BEGIN
    EXECUTE PROCEDURE saldo_proveedor (NIT, FECINI, MONEDA) returning_values (INICIAL);
    EXECUTE PROCEDURE LEE_CONFIGURACION('CXPAGAR', 'SALDOS', 'DESCONTAR RETENCIONES POR CAUSACION') returning_values(:RETES);
    if (RETES = 'SI') then
        BEGIN
        SELECT SUM((MVPR_MONTO-MVPR_RTFTE-MVPR_RTIVA-MVPR_RTICA)/MVPR_TRM)
            FROM movimiento_proveedor
            WHERE TERC_NIT = :NIT AND MVPR_FECHA >= :FECINI AND MVPR_FECHA < :FECFIN AND MVPR_DEBITO = 'S' AND ((:MONEDA = 0) or (MVPR_TRM <> 1))
            INTO :DEBITOS;
        SELECT SUM((MVPR_MONTO-MVPR_RTFTE-MVPR_RTIVA-MVPR_RTICA)/MVPR_TRM)
            FROM movimiento_proveedor
            WHERE TERC_NIT = :NIT AND MVPR_FECHA >= :FECINI AND MVPR_FECHA < :FECFIN AND MVPR_DEBITO = 'N' AND MVPR_ABONO = 'N' and MVPR_TIPOREF <> 55 AND ((:MONEDA = 0) or (MVPR_TRM <> 1))
            INTO :CREDITOS;
        SELECT SUM(MVPR_MONTO/MVPR_TRM) FROM movimiento_proveedor
            WHERE TERC_NIT = :NIT AND MVPR_FECHA >= :FECINI AND MVPR_FECHA < :FECFIN AND MVPR_ABONO = 'S' AND ((:MONEDA = 0) or (MVPR_TRM <> 1))
            INTO :ABONOS;
        END
    ELSE
        BEGIN
        SELECT SUM(MVPR_MONTO/MVPR_TRM)
            FROM movimiento_proveedor
            WHERE TERC_NIT = :NIT AND MVPR_FECHA >= :FECINI AND MVPR_FECHA < :FECFIN AND MVPR_DEBITO = 'S' AND ((:MONEDA = 0) or (MVPR_TRM <> 1))
            INTO :DEBITOS;
        SELECT SUM(MVPR_MONTO/MVPR_TRM)
            FROM movimiento_proveedor
            WHERE TERC_NIT = :NIT AND MVPR_FECHA >= :FECINI AND MVPR_FECHA < :FECFIN AND MVPR_DEBITO = 'N' AND MVPR_ABONO = 'N' AND MVPR_TIPOREF <> 55 AND ((:MONEDA = 0) or (MVPR_TRM <> 1))
            INTO :CREDITOS;
        SELECT SUM((MVPR_MONTO+MVPR_RTFTE+MVPR_RTIVA+MVPR_RTICA)/MVPR_TRM)
            FROM movimiento_proveedor
            WHERE TERC_NIT = :NIT AND MVPR_FECHA >= :FECINI AND MVPR_FECHA < :FECFIN AND MVPR_ABONO = 'S' AND ((:MONEDA = 0) or (MVPR_TRM <> 1))
            INTO :ABONOS;
        END
    if (DEBITOS IS NULL) then
        DEBITOS = 0;
    if (CREDITOS IS NULL) then
        CREDITOS = 0;
    if (ABONOS IS NULL) then
        ABONOS = 0;
    FINAL = INICIAL + DEBITOS - CREDITOS - ABONOS;
    SUSPEND;
    END
 $$IBE$$*/ SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE REP_MOVIMIENTO_PROVEEDOR(
    DESDE VARCHAR(20),
    HASTA VARCHAR(20),
    GRPINI VARCHAR(5),
    GRPFIN VARCHAR(5),
    FECINI DATE,
    FECFIN DATE,
    DETALLE CHAR(1),
    ORDEN CHAR(1),
    AGRUPA CHAR(1),
    MONEDA INTEGER)
RETURNS (
    NIT VARCHAR(20),
    NOMBRE VARCHAR(60),
    TELEFONO VARCHAR(40),
    CIUDAD VARCHAR(40),
    CODZONA VARCHAR(2),
    NOMZONA VARCHAR(60),
    DV CHAR(1),
    CODCIUD CHAR(5),
    NOMCIUD VARCHAR(60),
    INICIAL NUMERIC(18,2),
    TIPODOC VARCHAR(8),
    IDDOC INTEGER,
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    CONCEPTO VARCHAR(60),
    DEBITO NUMERIC(18,2),
    CREDITO NUMERIC(18,2),
    ABONO NUMERIC(18,2),
    SALDO NUMERIC(18,2),
    RTFTE NUMERIC(18,2),
    RTIVA NUMERIC(18,2),
    RTICA NUMERIC(18,2),
    ARTFTE NUMERIC(18,2),
    ARTIVA NUMERIC(18,2),
    ARTICA NUMERIC(18,2))
AS
declare variable NITINI VARCHAR(20);
declare variable NITFIN VARCHAR(20);
declare variable NOMINI VARCHAR(20);
declare variable NOMFIN VARCHAR(20);
declare variable OK CHAR(1);
declare variable DB CHAR(1);
declare variable AB CHAR(1);
declare variable DESCRETE CHAR(2);
declare variable TRM NUMERIC(18,2);
BEGIN /*$$IBE$$ 
if (ORDEN = 'C') then
    BEGIN
    NITINI = DESDE;
    NITFIN = HASTA;
    NOMINI = '';
    NOMFIN = 'zz';
    END
ELSE
    BEGIN
    NOMINI = DESDE;
    NOMFIN = HASTA;
    NITINI = '';
    NITFIN = 'zz';
    END
EXECUTE PROCEDURE LEE_CONFIGURACION('CXPAGAR', 'SALDOS', 'DESCONTAR RETENCIONES POR CAUSACION') returning_values (DESCRETE);
 $$IBE$$*/ /* Ubique el NIT */ /*$$IBE$$ 
FOR select T.TERC_NIT, TERC_NOM, TERC_DV, TERC_TEL, TERC_CIU, P.GRPR_COD, T.CIUD_COD
    from terceros T, PROVEEDORES P
    where P.TERC_NIT = T.TERC_NIT AND TERC_PROV = 'S' AND T.TERC_NIT >= :NITINI AND T.TERC_NIT <= :NITFIN AND
        TERC_NOM >= :NOMINI AND TERC_NOM <= :NOMFIN
    INTO :NIT, :NOMBRE, :DV, :TELEFONO, :CIUDAD, :CODZONA, :CODCIUD
    DO  
    BEGIN

    SELECT GRPR_NOM FROM GRUPOS_PROVEEDORES WHERE GRPR_COD = :CODZONA INTO :NOMZONA;
    SELECT CIUD_NOM FROM CIUDADES WHERE CIUD_COD = :CODCIUD INTO :NOMCIUD;
    OK = 'N';
    if (AGRUPA = 'Z') then
        BEGIN
        if (GRPINI = '') then
            BEGIN
            if ((CODZONA IS NULL) or (CODZONA >= :GRPINI AND CODZONA <= :GRPFIN)) then
                OK = 'S';
            END
        ELSE
            if (CODZONA >= :GRPINI AND CODZONA <= :GRPFIN) then
                OK = 'S';
        END
    if (AGRUPA = 'C') then
        BEGIN
        if (GRPINI = '') then
            BEGIN
            if ((CODCIUD IS NULL) or (CODCIUD >= :GRPINI AND CODCIUD <= :GRPFIN)) then
                OK = 'S';
            END
        ELSE
            if (CODCIUD >= :GRPINI AND CODCIUD <= :GRPFIN) then
                OK = 'S';
        END
    if (AGRUPA = 'N') then
        OK = 'S';
        
    if (OK = 'S') then
        BEGIN
        execute procedure saldo_proveedor (NIT, FECINI, MONEDA) returning_values (INICIAL);
        if (INICIAL is null) then
            INICIAL = 0;
        SALDO = INICIAL;
        if (DETALLE = 'S') then
          BEGIN
          FOR select tido_nomcorto, mvpr_idref, mvpr_prefijo, mvpr_numero, mvpr_fecha, mvpr_conc, mvpr_monto, mvpr_debito, mvpr_rtfte, mvpr_rtiva, mvpr_rtica, mvpr_abono, MVPR_TRM
            from movimiento_proveedor m, tipo_documento t
            where m.mvpr_tiporef = t.tido_cod and terc_nit = :NIT and mvpr_fecha >= :FECINI and mvpr_fecha <= :FECFIN AND MVPR_TIPOREF <> 55 AND ((:MONEDA = 0) or (MVPR_TRM <> 1))
            order by mvpr_fecha, mvpr_tiporef
            into :TIPODOC, :IDDOC, :PREFIJO, :NUMERO, :FECHA, :CONCEPTO, :DEBITO, :DB, :RTFTE, :RTIVA, :RTICA, :AB, :TRM
            DO
            BEGIN
            if (RTFTE IS NULL) then
                RTFTE = 0;
            if (RTIVA IS NULL) then
                RTIVA = 0;
            if (RTICA IS NULL) then
                RTICA = 0;
            if (DB = 'N') then
                BEGIN
                CREDITO = DEBITO;
                DEBITO = 0;
                RTFTE = RTFTE * -1;
                RTIVA = RTIVA * -1;
                RTICA = RTICA * -1;
                END
            ELSE
                CREDITO = 0;
            if ((MONEDA <> 0) AND (TRM <> 0)) then
                BEGIN
                DEBITO = DEBITO / TRM;
                CREDITO = CREDITO / TRM;
                RTFTE = RTFTE / TRM;
                RTIVA = RTIVA / TRM;
                RTICA = RTICA / TRM;
                END
            SALDO = SALDO + DEBITO - CREDITO;
            if (AB = 'N') then
                BEGIN
                if (DESCRETE = 'SI') then
                    SALDO = SALDO - RTFTE - RTIVA - RTICA;
                ABONO = 0;
                END
            ELSE
                BEGIN
                ABONO = CREDITO;
                CREDITO = 0;
                if (DESCRETE <> 'SI') then
                    SALDO = SALDO + RTFTE + RTIVA + RTICA;
                END
            SUSPEND;
            END
          END
        ELSE
            BEGIN
            if (MONEDA = 0) then
                SELECT SUM(MVPR_MONTO), sum(mvpr_rtfte), sum(mvpr_rtiva), sum(mvpr_rtica)
                    FROM movimiento_proveedor WHERE TERC_NIT = :NIT AND MVPR_FECHA >= :FECINI AND MVPR_FECHA <= :FECFIN AND MVPR_DEBITO = 'S' and MVPR_ABONO = 'N'
                    INTO :DEBITO, :RTFTE, :RTIVA, :RTICA;
            else
                SELECT SUM(MVPR_MONTO/MVPR_TRM), sum(mvpr_rtfte/MVPR_TRM), sum(mvpr_rtiva/MVPR_TRM), sum(mvpr_rtica/MVPR_TRM)
                    FROM movimiento_proveedor WHERE TERC_NIT = :NIT AND MVPR_FECHA >= :FECINI AND MVPR_FECHA <= :FECFIN AND MVPR_DEBITO = 'S' and MVPR_ABONO = 'N' AND ((:MONEDA = 0) or (MVPR_TRM <> 1))
                    INTO :DEBITO, :RTFTE, :RTIVA, :RTICA;
            if (DEBITO IS NULL) then
                DEBITO = 0;
            if (RTFTE IS NULL) then
                RTFTE = 0;
            if (RTIVA IS NULL) then
                RTIVA = 0;
            if (RTICA IS NULL) then
                RTICA = 0;
            if (DESCRETE = 'SI') then
                DEBITO = DEBITO - RTFTE - RTIVA - RTICA;
            if (MONEDA = 0) then
                SELECT SUM(MVPR_MONTO), sum(mvpr_rtfte), sum(mvpr_rtiva), sum(mvpr_rtica) FROM movimiento_proveedor
                    WHERE TERC_NIT = :NIT AND MVPR_FECHA >= :FECINI AND MVPR_FECHA <= :FECFIN AND MVPR_DEBITO = 'N' AND MVPR_TIPOREF <> 55 AND MVPR_ABONO = 'N' INTO :CREDITO, :ARTFTE, :ARTIVA, :ARTICA;
            else
                SELECT SUM(MVPR_MONTO/MVPR_TRM), sum(mvpr_rtfte/MVPR_TRM), sum(mvpr_rtiva/MVPR_TRM), sum(mvpr_rtica/MVPR_TRM) FROM movimiento_proveedor
                    WHERE TERC_NIT = :NIT AND MVPR_FECHA >= :FECINI AND MVPR_FECHA <= :FECFIN AND MVPR_DEBITO = 'N' AND MVPR_TIPOREF <> 55 AND MVPR_ABONO = 'N' INTO :CREDITO, :ARTFTE, :ARTIVA, :ARTICA;
            if (CREDITO IS NULL) then
                CREDITO = 0;
            if (ARTFTE IS NULL) then
                ARTFTE = 0;
            if (ARTIVA IS NULL) then
                ARTIVA = 0;
            if (ARTICA IS NULL) then
                ARTICA = 0;
            if (DESCRETE = 'SI') then
                CREDITO = CREDITO - ARTFTE - ARTIVA - ARTICA;
            RTFTE = RTFTE - ARTFTE;
            RTIVA = RTIVA - ARTIVA;
            RTICA = RTICA - ARTICA;
            if (MONEDA = 0) then
                SELECT SUM(MVPR_MONTO), sum(mvpr_rtfte), sum(mvpr_rtiva), sum(mvpr_rtica) FROM movimiento_proveedor
                    WHERE TERC_NIT = :NIT AND MVPR_FECHA >= :FECINI AND MVPR_FECHA <= :FECFIN AND MVPR_ABONO = 'S'
                    INTO :ABONO, :ARTFTE, :ARTIVA, :ARTICA;
            else
                SELECT SUM(MVPR_MONTO/MVPR_TRM), sum(mvpr_rtfte/MVPR_TRM), sum(mvpr_rtiva/MVPR_TRM), sum(mvpr_rtica/MVPR_TRM)
                    FROM movimiento_proveedor
                    WHERE TERC_NIT = :NIT AND MVPR_FECHA >= :FECINI AND MVPR_FECHA <= :FECFIN AND MVPR_ABONO = 'S' AND ((:MONEDA = 0) or (MVPR_TRM <> 1))
                    INTO :ABONO, :ARTFTE, :ARTIVA, :ARTICA;
            if (ABONO IS NULL) then
                ABONO = 0;
            if (ARTFTE IS NULL) then
                ARTFTE = 0;
            if (ARTIVA IS NULL) then
                ARTIVA = 0;
            if (ARTICA IS NULL) then
                ARTICA = 0;
            if (DESCRETE <> 'SI') then
                ABONO = ABONO + ARTFTE + ARTIVA + ARTICA;
            SALDO = INICIAL + DEBITO - CREDITO - ABONO;
            SUSPEND;
            END
        END
    END
 $$IBE$$*/ SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE BUSCA_ID_DOC_CXPAGAR(
    TIPO INTEGER,
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(6),
    NIT VARCHAR(20),
    FECHA DATE,
    MONEDA INTEGER)
RETURNS (
    ID INTEGER,
    SALDO NUMERIC(18,2),
    RTFTE NUMERIC(18,2),
    RTIVA NUMERIC(18,2),
    RTICA NUMERIC(18,2),
    DTOF NUMERIC(18,2),
    ERROR INTEGER)
AS
declare variable VERNIT VARCHAR(20);
declare variable FEC DATE;
declare variable DTOAPL NUMERIC(18,2);
declare variable FECDTO DATE;
declare variable DESC_RTES CHAR(2);
declare variable TRM NUMERIC(18,2);
BEGIN
ERROR = 0;
ID = 0;
EXECUTE PROCEDURE COMPLETA_CEROS(NUMERO) returning_values (NUMERO);
if (TIPO = 51) then
    SELECT NDPR_ID, TERC_NIT, NDPR_FECHA, NDPR_DTOFMONTO, NDPR_DTOFECHA, NDPR_TRM
        FROM NOTAS_DEBITO_PROVEEDOR WHERE PREF_PRE = :PREFIJO AND NDPR_NUMERO = :NUMERO
        INTO :ID, :VERNIT, :FEC, :DTOF, :FECDTO, :TRM;
if (TIPO = 52) then
    SELECT NCPR_ID, TERC_NIT, NCPR_FECHA, NCPR_DTOFMONTO, NCPR_DTOFECHA, NCPR_TRM
        FROM NOTAS_CREDITO_PROVEEDOR WHERE PREF_PRE = :PREFIJO AND NCPR_NUMERO = :NUMERO
        INTO :ID, :VERNIT, :FEC, :DTOF, :FECDTO, :TRM;
if (TIPO = 55) then
    SELECT ANPR_ID, TERC_NIT, ANPR_FECHA, ANPR_DTOFMONTO, ANPR_DTOFECHA, ANPR_TRM
        FROM ANTICIPOS_PROVEEDOR WHERE PREF_PRE = :PREFIJO AND ANPR_NUMERO = :NUMERO
        INTO :ID, :VERNIT, :FEC, :DTOF, :FECDTO, :TRM;
if (TIPO = 21) then
    SELECT FACO_ID, TERC_NIT, FACO_FECHA, FACO_DTOFMONTO, FACO_DTOFFECHA, FACO_TRM
        FROM FACTURAS_COMPRA WHERE PREF_PRE = :PREFIJO AND FACO_NUMERO = :NUMERO
        INTO :ID, :VERNIT, :FEC, :DTOF, :FECDTO, :TRM;
if (TIPO = 24) then
    SELECT DVCO_ID, TERC_NIT, DVCO_FECHA, 0, DVCO_FECHA, DVCO_TRM
        FROM devoluciones_compras WHERE PREF_PRE = :PREFIJO AND DVCO_NUMERO = :NUMERO
        INTO :ID, :VERNIT, :FEC, :DTOF, :FECDTO, :TRM;
if (fecha > FECDTO) then
    DTOF = 0;
if (DTOF IS NULL) then
    DTOF = 0;
if (DTOF <> 0) then
    BEGIN
    if ((MONEDA <> 0) AND (TRM <> 0)) then
        DTOF = DTOF / TRM;
    if (MONEDA = 0) then
        SELECT SUM(EGDE_DTOF) FROM EGRESOS_DETALLE WHERE EGDE_IDDOC = :ID AND EGDE_TIPODOC = :TIPO INTO :DTOAPL;
    ELSE
        SELECT SUM(EGDE_DTOF/EGRE_TRM) FROM EGRESOS_DETALLE D, EGRESOS E
            WHERE E.egre_id = D.egre_id AND EGDE_IDDOC = :ID AND EGDE_TIPODOC = :TIPO INTO :DTOAPL;
    if (DTOAPL IS NULL) then
        DTOAPL = 0;
    DTOF = DTOF - DTOAPL;
    END
if (ID = 0) then
  ERROR = 1;
ELSE
  BEGIN
  /* VERIFIQUE EL NIT */
  if (VERNIT <> NIT) then
    ERROR = 2;
  else
    BEGIN
    /* VERIFIQUE QUE LA FECHA DEL ABONO SEA POSTERIOR O IGUAL AL DOC */
    if (FEC > FECHA) then
        ERROR = 3;
    ELSE
        BEGIN
        /* CALCULE LOS SALDOS */
        if (MONEDA = 0) then
            SELECT SUM(SDCP_MONTO - SDCP_ABONO), SUM(SDCP_RTEFTE - SDCP_ABRTFTE), SUM(SDCP_RTIVA - SDCP_ABRTIVA), SUM(SDCP_RTICA - SDCP_ABRTICA)
                FROM SALDOS_DOC_CXPAGAR WHERE SDCP_TIPOREF = :TIPO AND SDCP_IDREF = :ID
                INTO :SALDO, :RTFTE, :RTIVA, :RTICA;
        ELSE
            SELECT SUM((SDCP_MONTO-SDCP_ABONO)/SDCP_TRM), SUM((SDCP_RTEFTE-SDCP_ABRTFTE)/SDCP_TRM), SUM((SDCP_RTIVA-SDCP_ABRTIVA)/SDCP_TRM), SUM((SDCP_RTICA-SDCP_ABRTICA)/SDCP_TRM)
                FROM SALDOS_DOC_CXPAGAR WHERE SDCP_TIPOREF = :TIPO AND SDCP_IDREF = :ID
                INTO :SALDO, :RTFTE, :RTIVA, :RTICA;
        if (RTFTE IS NULL) then
            RTFTE = 0;
        if (RTIVA IS NULL) then
            RTIVA = 0;
        if (RTICA IS NULL) then
            RTICA = 0;
        /* TRAIGA EL SALDO NETO */
        EXECUTE PROCEDURE SALDO_DOC_CXPAGAR(TIPO, ID, FECHA,MONEDA) returning_values (SALDO);
        if (SALDO = 0) then
            ERROR = 4;
        ELSE
            BEGIN
            /* RESTE LAS RETENCIONES YA QUE SE SUGERIRAN */
            EXECUTE PROCEDURE LEE_CONFIGURACION('CXPAGAR', 'SALDOS', 'DESCONTAR RETENCIONES POR CAUSACION') returning_values (DESC_RTES);
            if (DESC_RTES = 'NO') then
                SALDO = SALDO - RTFTE - RTIVA - RTICA;
            SALDO = SALDO - DTOF;
            END
        END
    END
  END
SUSPEND;
END

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE CXPAGAR_PROVEEDOR(
    NIT VARCHAR(20),
    FECHA DATE,
    MONEDA INTEGER)
RETURNS (
    TIPO INTEGER,
    ID INTEGER,
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(6),
    FECDOC DATE,
    VENCE DATE,
    DIAS INTEGER,
    REFERENCIA VARCHAR(20),
    SALDO NUMERIC(18,2),
    RTFTE NUMERIC(18,2),
    RTIVA NUMERIC(18,2),
    RTICA NUMERIC(18,2),
    DTOF NUMERIC(18,2),
    TIPONOM VARCHAR(8),
    NOMBRE VARCHAR(60),
    CONCEPTO VARCHAR(60),
    TRMDOC NUMERIC(18,2))
AS
declare variable FEC DATE;
declare variable DESC_RTES CHAR(2);
declare variable DTOAPL NUMERIC(18,2);
declare variable VENCIMIENTO VARCHAR(12);
BEGIN
  SELECT TERC_NOM FROM TERCEROS WHERE TERC_NIT = :NIT INTO :NOMBRE;
  /* BUSQUE EN SALDOS_DOC_CXPAGAR LOS QUE TENGAN SALDO > 0 */
  FOR SELECT MVPR_TIPOREF, MVPR_IDREF, MVPR_PREFIJO, MVPR_NUMERO, MVPR_CONC, MVPR_FECHA, MVPR_VENCE
    FROM MOVIMIENTO_PROVEEDOR
    WHERE TERC_NIT = :NIT AND MVPR_FECHA <= :FECHA AND MVPR_ABONO = 'N' and ((:moneda = 0) or (mvpr_trm <> 1))
    ORDER BY MVPR_FECHA
    INTO :TIPO, :ID, :PREFIJO, :NUMERO, :CONCEPTO, :FECDOC, :VENCE
    DO
    BEGIN
    EXECUTE PROCEDURE LEE_CONFIGURACION('CXPAGAR', 'SALDOS', 'ANALISIS DE CXPAGAR CON FECHA FACTURA O VENCIMIENTO') returning_values (VENCIMIENTO);
    if (VENCIMIENTO = 'FECHA') then
        DIAS = FECHA - FECDOC;
    ELSE
        DIAS = FECHA - VENCE;
    REFERENCIA = '';
    EXECUTE PROCEDURE saldo_doc_cxpagar(TIPO, ID, FECHA, MONEDA) returning_values (SALDO);
    if (SALDO <> 0) then
        BEGIN
        SELECT TIDO_NOMCORTO FROM TIPO_DOCUMENTO WHERE TIDO_COD = :TIPO INTO :TIPONOM;
        if (TIPO = 51) then
            SELECT NDPR_DTOFMONTO, NDPR_DTOFECHA, NDPR_NUMPROV, NDPR_TRM
                FROM NOTAS_DEBITO_PROVEEDOR WHERE NDPR_ID = :ID INTO :DTOF, :FEC, :REFERENCIA, :TRMDOC;
        if (TIPO = 52) then
            SELECT NCPR_DTOFMONTO, NCPR_DTOFECHA, NCPR_TRM FROM NOTAS_CREDITO_PROVEEDOR
                WHERE NCPR_ID = :ID INTO :DTOF, :FEC, :TRMDOC;
        if (TIPO = 55) then
            SELECT ANPR_DTOFMONTO, ANPR_DTOFECHA, ANPR_TRM FROM ANTICIPOS_PROVEEDOR
                WHERE ANPR_ID = :ID INTO :DTOF, :FEC, :TRMDOC;
        if (TIPO = 21) then
            SELECT FACO_DTOFMONTO, FACO_DTOFFECHA, FACO_NUMPROV, FACO_TRM FROM FACTURAS_COMPRA
                WHERE FACO_ID = :ID INTO :DTOF, :FEC, :REFERENCIA, :TRMDOC;
        if (TIPO = 24) then
            SELECT 0, :FECHA FROM devoluciones_compras WHERE DVCO_ID = :ID INTO :DTOF, :FEC;
        if (FECHA > FEC) then
            DTOF = 0;
        if (DTOF IS NULL) then
            DTOF = 0;
        if (DTOF <> 0) then
            BEGIN
            if ((moneda <> 0) and (TRMDOC <> 0)) then
                DTOF = DTOF / :TRMDOC;
            if (MONEDA = 0) then
                SELECT SUM(EGDE_DTOF) FROM EGRESOS_DETALLE D, EGRESOS E
                    WHERE E.egre_id = D.egre_id AND EGDE_IDDOC = :ID AND EGDE_TIPODOC = :TIPO INTO :DTOAPL;
            else
                SELECT SUM(EGDE_DTOF/EGRE_TRM) FROM EGRESOS_DETALLE D, EGRESOS E
                    WHERE E.egre_id = D.egre_id AND EGDE_IDDOC = :ID AND EGDE_TIPODOC = :TIPO INTO :DTOAPL;
            if (DTOAPL IS NULL) then
                DTOAPL = 0;
            DTOF = DTOF - DTOAPL;
            END
        if (MONEDA = 0) then
            SELECT SUM(SDCP_RTEFTE - SDCP_ABRTFTE), SUM(SDCP_RTIVA - SDCP_ABRTIVA), SUM(SDCP_RTICA - SDCP_ABRTICA) FROM SALDOS_DOC_CXPAGAR WHERE SDCP_TIPOREF = :TIPO AND SDCP_IDREF = :ID INTO :RTFTE, :RTIVA, :RTICA;
        ELSE
            SELECT SUM((SDCP_RTEFTE-SDCP_ABRTFTE)/SDCP_TRM), SUM((SDCP_RTIVA-SDCP_ABRTIVA)/SDCP_TRM), SUM((SDCP_RTICA-SDCP_ABRTICA)/SDCP_TRM)
                FROM SALDOS_DOC_CXPAGAR WHERE SDCP_TIPOREF = :TIPO AND SDCP_IDREF = :ID INTO :RTFTE, :RTIVA, :RTICA;
        if (RTFTE IS NULL) then
            RTFTE = 0;
        if ((TIPO = 52) or (TIPO = 55) or (TIPO = 24)) THEN
            BEGIN
            if (RTFTE > 0) then
                RTFTE = 0;
            END
        ELSE
            BEGIN
            if (RTFTE < 0) then
                RTFTE = 0;
            END

        if (RTIVA IS NULL) then
            RTIVA = 0;
        if ((TIPO = 52) or (TIPO = 55) or (TIPO = 24)) THEN
            BEGIN
            if (RTIVA > 0) then
                RTIVA = 0;
            END
        ELSE
            BEGIN
            if (RTIVA < 0) then
                RTIVA = 0;
            END

        if (RTICA IS NULL) then
            RTICA = 0;
        if ((TIPO = 52) or (TIPO = 55) or (TIPO = 24)) THEN
            BEGIN
            if (RTICA > 0) then
                RTICA = 0;
            END
        ELSE
            BEGIN
            if (RTICA < 0) then
                RTICA = 0;
            END
        /* RESTE LAS RETENCIONES YA QUE SE SUGERIRAN */
        EXECUTE PROCEDURE LEE_CONFIGURACION('CXPAGAR', 'SALDOS', 'DESCONTAR RETENCIONES POR CAUSACION') returning_values (DESC_RTES);
        if (DESC_RTES = 'NO') then
            SALDO = SALDO - RTFTE - RTIVA - RTICA;
        SUSPEND;
        END
    END
END

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE IMPR_APLIPROV(
    ID INTEGER)
RETURNS (
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    CONCEPTO VARCHAR(60),
    NIT VARCHAR(20),
    NOMBRE VARCHAR(60),
    DIR VARCHAR(60),
    CIU VARCHAR(40),
    TEL VARCHAR(40),
    CONTACTO VARCHAR(60),
    FAX VARCHAR(25),
    CEL VARCHAR(25),
    EMAIL VARCHAR(100),
    ITEM INTEGER,
    TIPODOC VARCHAR(8),
    PREFDOC VARCHAR(4),
    NUMDOC VARCHAR(6),
    ABONO NUMERIC(18,2),
    RTFTEMONTO NUMERIC(18,2),
    RTIVAMONTO NUMERIC(18,2),
    RTICAMONTO NUMERIC(18,2),
    SALDODOC NUMERIC(18,2),
    ANTERDOC NUMERIC(18,2),
    OBS BLOB SUB_TYPE 1 SEGMENT SIZE 80,
    PROV_COD VARCHAR(15),
    PROV_CARTERA VARCHAR(60),
    PROV_CODIGOINT VARCHAR(15))
AS
declare variable TIPO INTEGER;
declare variable IDDOC INTEGER;
BEGIN
  FOR SELECT PREF_PRE, APPR_NUMERO, APPR_FECHA, APPR_CONC, P.TERC_NIT, TERC_NOM, TERC_DIR, TERC_CIU, TERC_TEL, TERC_CONTACTO, TERC_FAX, TERC_CEL, TERC_EMAIL,
    APPD_ITEM, APPD_TIPODOC, APPD_IDDOC, TIDO_NOMCORTO, APPD_PREFIJO, APPD_NUMERO, APPD_APLICADO,
    APPD_RTFTE, APPD_RTIVA, APPD_RTICA, APPR_OBS, PROV_COD, PROV_CARTERA, PROV_CODIGOINT
    FROM APLICACION_PROVEDOR P, APLICACION_PROVEEDOR_DETALLE PD, TERCEROS T, PROVEEDORES PR, TIPO_DOCUMENTO TD
    WHERE P.TERC_NIT = T.TERC_NIT AND T.TERC_NIT = PR.TERC_NIT AND P.APPR_ID = PD.APPR_ID AND P.APPR_ID = :ID AND APPD_TIPODOC = TD.TIDO_COD
    ORDER BY APPD_ITEM
    INTO :PREFIJO, :NUMERO, :FECHA, :CONCEPTO, :NIT, :NOMBRE, :DIR, :CIU, :TEL, :CONTACTO, :FAX, :CEL, :EMAIL, :ITEM, :TIPO, :IDDOC, :TIPODOC, :PREFDOC, :NUMDOC, :ABONO, :RTFTEMONTO, :RTIVAMONTO, :RTICAMONTO, :OBS, :PROV_COD, :PROV_CARTERA, :PROV_CODIGOINT
    DO
        begin
        EXECUTE PROCEDURE saldo_doc_cxpagar(:TIPO, :IDDOC, :FECHA, 0) returning_values (:SALDODOC);
        if (saldodoc IS NULL) then
            SALDODOC = 0;
        ANTERDOC = SALDODOC + rtftemonto + rtivamonto + rticamonto + abono;
        if (anterdoc IS NULL) then
            ANTERDOC = 0;
        SUSPEND;
        end
SUSPEND;
END

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE IMPR_EGRESO(
    ID INTEGER)
RETURNS (
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    NIT VARCHAR(20),
    NOMBRE VARCHAR(60),
    DIR VARCHAR(60),
    CIU VARCHAR(40),
    TEL VARCHAR(40),
    CONCEPTO VARCHAR(60),
    MONTO NUMERIC(18,2),
    RTFTE NUMERIC(18,2),
    RTIVA NUMERIC(18,2),
    RTICA NUMERIC(18,2),
    DSCTO NUMERIC(18,2),
    OBS BLOB SUB_TYPE 1 SEGMENT SIZE 80,
    ITEMDOC INTEGER,
    TIPODOC VARCHAR(8),
    PREFDOC VARCHAR(4),
    NUMDOC VARCHAR(6),
    NUMPRV VARCHAR(10),
    ABONODOC NUMERIC(18,2),
    RTFTEDOC NUMERIC(18,2),
    RTIVADOC NUMERIC(18,2),
    RTICADOC NUMERIC(18,2),
    DSCTODOC NUMERIC(18,2),
    SALDODOC NUMERIC(18,2),
    SALDOPROV NUMERIC(18,2),
    ANTERDOC NUMERIC(18,2))
AS
declare variable NUMROWS INTEGER;
declare variable TIPO integer;
declare variable IDDOC INTEGER;
BEGIN
  SELECT PREF_PRE, EGRE_NUMERO, EGRE_FECHA, EGRE_CONC,
        E.TERC_NIT, EGRE_NOMTERC, TERC_DIR, TERC_CIU, TERC_TEL,
        EGRE_MONTO, EGRE_RTFTEMONTO, EGRE_RTIVAMONTO, EGRE_RTICAMONTO, EGRE_DTOF,
        EGRE_OBS
    FROM EGRESOS E, TERCEROS T
    WHERE E.TERC_NIT = T.TERC_NIT AND E.EGRE_ID = :ID
    INTO :PREFIJO, :NUMERO, :FECHA, :CONCEPTO, 
        :NIT, :NOMBRE, :DIR, :CIU, :TEL,
        :MONTO, :RTFTE, :RTIVA, :RTICA, :DSCTO,
        :OBS;
  select SALDO from saldo_proveedor(:NIT, :FECHA+1, 0) into :SALDOPROV;
  SELECT COUNT(EGDE_ITEM) FROM EGRESOS_DETALLE
    WHERE EGRE_ID = :ID INTO :NUMROWS;
  if (NUMROWS > 0) then
    FOR SELECT EGDE_ITEM, EGDE_TIPODOC, TIDO_NOMCORTO, EGDE_IDDOC, EGDE_PREFIJO, EGDE_NUMERO, EGDE_ABONO, EGDE_RTFTE, EGDE_RTIVA, EGDE_RTICA, EGDE_DTOF
        FROM EGRESOS_DETALLE ED, TIPO_DOCUMENTO TD
        WHERE TD.TIDO_COD = ED.EGDE_TIPODOC AND ED.EGRE_ID = :ID
        order by egde_item
        INTO :ITEMDOC, :TIPO, :TIPODOC, :IDDOC, :PREFDOC, :NUMDOC, :ABONODOC, :RTFTEDOC, :RTIVADOC, :RTICADOC, :DSCTODOC
        DO
            BEGIN
            if (TIPO = 21) then
                SELECT FACO_NUMPROV FROM FACTURAS_COMPRA WHERE FACO_ID = :iddoc INTO :numprv;
            ELSE
                if (TIPO = 51) then
                    SELECT NDPR_NUMPROV FROM NOTAS_DEBITO_PROVEEDOR WHERE NDPR_ID = :iddoc INTO :numprv;
                ELSE
                    numprv = numdoc;
            EXECUTE PROCEDURE saldo_doc_cxpagar(:TIPO, :IDDOC, :FECHA, 0) returning_values (:SALDODOC);
            ANTERDOC = SALDODOC + RTFTEDOC + RTIVADOC + RTICADOC + ABONODOC + DSCTODOC;
            SUSPEND;
            END
  else
    BEGIN
    SALDOPROV = 0;
    ANTERDOC = 0;
    SALDODOC = 0;
    RTFTEDOC = 0;
    RTIVADOC = 0;
    RTICADOC = 0;
    ABONODOC = 0;
    DSCTODOC = 0;
    numprv = '';
    SUSPEND;
    END
END

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE REP_ANALISIS_CXPAGAR(
    DESDE VARCHAR(20),
    HASTA VARCHAR(20),
    GRPINI VARCHAR(5),
    GRPFIN VARCHAR(5),
    FECHA DATE,
    DETALLE CHAR(1),
    ORDEN CHAR(1),
    AGRUPA CHAR(1),
    DIASR INTEGER,
    MONEDA INTEGER)
RETURNS (
    NIT VARCHAR(20),
    NOMBRE VARCHAR(60),
    TELEFONO VARCHAR(40),
    CIUDAD VARCHAR(40),
    GRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(60),
    TIPO INTEGER,
    ID INTEGER,
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(6),
    DIAS INTEGER,
    SALDO NUMERIC(18,2),
    CORRIENTE NUMERIC(18,2),
    CERO NUMERIC(18,2),
    TREINTA NUMERIC(18,2),
    SESENTA NUMERIC(18,2),
    NOVENTA NUMERIC(18,2),
    TIPONOM VARCHAR(8),
    FECDOC DATE,
    VENCE DATE,
    NUMPROV VARCHAR(20))
AS
declare variable NITINI VARCHAR(20);
declare variable NITFIN VARCHAR(20);
declare variable NOMINI VARCHAR(20);
declare variable NOMFIN VARCHAR(20);
declare variable OK CHAR(1);
declare variable RTFTE NUMERIC(18,2);
declare variable RTIVA NUMERIC(18,2);
declare variable RTICA NUMERIC(18,2);
declare variable VENCIMIENTO VARCHAR(12);
BEGIN
if (ORDEN = 'C') then
    BEGIN
    NITINI = DESDE;
    NITFIN = HASTA;
    NOMINI = '';
    NOMFIN = 'zz';
    END
ELSE
    BEGIN
    NOMINI = DESDE;
    NOMFIN = HASTA;
    NITINI = '';
    NITFIN = 'zz';
    END
/* Ubique el NIT */
FOR select T.TERC_NIT, TERC_NOM,  TERC_TEL, TERC_CIU, GRPR_COD
    from terceros T, PROVEEDORES P
    where P.TERC_NIT = T.TERC_NIT AND TERC_PROV = 'S' AND T.TERC_NIT >= :NITINI AND T.TERC_NIT <= :NITFIN AND
        TERC_NOM >= :NOMINI AND TERC_NOM <= :NOMFIN
    INTO :NIT, :NOMBRE, :TELEFONO, :CIUDAD, :GRUPO
    DO  
    BEGIN
    SELECT GRPR_NOM FROM GRUPOS_PROVEEDORES WHERE GRPR_COD = :GRUPO INTO :NOMGRUPO;
    OK = 'N';
    if (AGRUPA = 'G') then
        BEGIN
        if (GRPINI = '') then
            BEGIN
            if ((GRUPO IS NULL) or (GRUPO >= :GRPINI AND GRUPO <= :GRPFIN)) then
                OK = 'S';
            END
        ELSE
            if (GRUPO >= :GRPINI AND GRUPO <= :GRPFIN) then
                OK = 'S';
        END
    if (AGRUPA = 'N') then
        OK = 'S';
    if (OK = 'S') then
        BEGIN
        CORRIENTE = 0;
        CERO = 0;
        TREINTA = 0;
        SESENTA = 0;
        NOVENTA = 0;
        /* BUSQUE EN SALDOS_DOC_CXPAGAR LOS QUE TENGAN SALDO > 0 */
        FOR SELECT MVPR_TIPOREF, MVPR_IDREF, MVPR_PREFIJO, MVPR_NUMERO, MVPR_FECHA, MVPR_VENCE
            FROM MOVIMIENTO_PROVEEDOR
            WHERE TERC_NIT = :NIT AND MVPR_FECHA <= :FECHA AND MVPR_ABONO = 'N' AND ((:MONEDA = 0) or (MVPR_TRM <> 1))
            INTO :TIPO, :ID, :PREFIJO, :NUMERO, :FECDOC, :VENCE
            DO
            BEGIN
            EXECUTE PROCEDURE saldo_doc_cxpagar(TIPO, ID, FECHA, MONEDA) returning_values (SALDO);
            if (SALDO <> 0) then
                BEGIN
                SELECT TIDO_NOMCORTO FROM TIPO_DOCUMENTO WHERE TIDO_COD = :TIPO INTO :TIPONOM;
                if (MONEDA = 0) then
                    SELECT SUM(SDCP_RTEFTE - SDCP_ABRTFTE), SUM(SDCP_RTIVA - SDCP_ABRTIVA), SUM(SDCP_RTICA - SDCP_ABRTICA)
                        FROM SALDOS_DOC_CXPAGAR WHERE SDCP_TIPOREF = :TIPO AND SDCP_IDREF = :ID
                        INTO :RTFTE, :RTIVA, :RTICA;
                else
                    SELECT SUM((SDCP_RTEFTE-SDCP_ABRTFTE)/SDCP_TRM), SUM((SDCP_RTIVA-SDCP_ABRTIVA)/SDCP_TRM), SUM((SDCP_RTICA-SDCP_ABRTICA)/SDCP_TRM)
                        FROM SALDOS_DOC_CXPAGAR WHERE SDCP_TIPOREF = :TIPO AND SDCP_IDREF = :ID
                        INTO :RTFTE, :RTIVA, :RTICA;
                if (RTFTE IS NULL) then
                    RTFTE = 0;
                if ((TIPO = 52) or (TIPO = 55) or (TIPO = 24)) THEN
                    BEGIN
                    if (RTFTE > 0) then
                        RTFTE = 0;
                    END
                ELSE
                    BEGIN
                    if (RTFTE < 0) then
                        RTFTE = 0;
                    END

                if (RTIVA IS NULL) then
                    RTIVA = 0;
                if ((TIPO = 52) or (TIPO = 55) or (TIPO = 24)) THEN
                    BEGIN
                    if (RTIVA > 0) then
                        RTIVA = 0;
                    END
                ELSE
                    BEGIN
                    if (RTIVA < 0) then
                        RTIVA = 0;
                    END

                if (RTICA IS NULL) then
                    RTICA = 0;
                if ((TIPO = 52) or (TIPO = 55) or (TIPO = 24)) THEN
                    BEGIN
                    if (RTICA > 0) then
                        RTICA = 0;
                    END
                ELSE
                    BEGIN
                    if (RTICA < 0) then
                        RTICA = 0;
                    END
                /* AHORA CLASIFIQUE LOS DIAS */
                if (DETALLE = 'S') then
                    BEGIN
                    CORRIENTE = 0;
                    CERO = 0;
                    TREINTA = 0;
                    SESENTA = 0;
                    NOVENTA = 0;
                    END
                EXECUTE PROCEDURE LEE_CONFIGURACION('CXPAGAR', 'SALDOS', 'ANALISIS DE CXPAGAR CON FECHA FACTURA O VENCIMIENTO') returning_values (VENCIMIENTO);
                if (VENCIMIENTO = 'FECHA') then
                    DIAS = FECHA - FECDOC;
                ELSE
                    DIAS = FECHA - VENCE;
                if (DIAS < 0) then
                    CORRIENTE = CORRIENTE + SALDO;
                ELSE
                    if (DIAS < DIASR) then
                        CERO = CERO + SALDO;
                    ELSE
                        if (DIAS < (DIASR * 2)) then
                            TREINTA = TREINTA + SALDO;
                        ELSE
                            if (DIAS < (DIASR * 3)) then
                                SESENTA = SESENTA + SALDO;
                            ELSE
                                NOVENTA = NOVENTA + SALDO;
                if (DETALLE = 'S') then
                    BEGIN
                    if (TIPO = 51) then
                        SELECT NDPR_NUMPROV FROM NOTAS_DEBITO_PROVEEDOR WHERE NDPR_ID = :ID INTO :NUMPROV;
                    ELSE
                        if (TIPO = 21) then
                            SELECT FACO_NUMPROV FROM FACTURAS_COMPRA WHERE FACO_ID = :ID INTO :NUMPROV;
                        ELSE
                            NUMPROV = '';
                    SUSPEND;
                    END
                END /* SALDO <> 0 */
            END /* FOR MVPR */
        if (DETALLE = 'N') then
            begin
            SALDO = CORRIENTE + CERO + TREINTA + SESENTA + NOVENTA;
            SUSPEND;
            end
        END /* OK */
    END /* FOR NIT */
END

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE REP_CXPAGAR_CONSOLIDADAS(
    DESDE VARCHAR(20),
    HASTA VARCHAR(20),
    GRPINI VARCHAR(5),
    GRPFIN VARCHAR(5),
    FECHA DATE,
    ORDEN CHAR(1),
    AGRUPA CHAR(1),
    MONEDA INTEGER)
RETURNS (
    NIT VARCHAR(20),
    NOMBRE VARCHAR(60),
    TELEFONO VARCHAR(40),
    CIUDAD VARCHAR(40),
    CODZONA VARCHAR(2),
    NOMZONA VARCHAR(60),
    DV CHAR(1),
    CODCIUD CHAR(5),
    NOMCIUD VARCHAR(60),
    SALDO NUMERIC(18,2),
    RTFTE NUMERIC(18,2),
    RTIVA NUMERIC(18,2),
    RTICA NUMERIC(18,2),
    DTOF NUMERIC(18,2))
AS
declare variable NITINI VARCHAR(20);
declare variable NITFIN VARCHAR(20);
declare variable NOMINI VARCHAR(20);
declare variable NOMFIN VARCHAR(20);
declare variable OK CHAR(1);
declare variable PSALDO NUMERIC(18,2);
declare variable PRTFTE NUMERIC(18,2);
declare variable PRTIVA NUMERIC(18,2);
declare variable PRTICA NUMERIC(18,2);
declare variable PDTOF NUMERIC(18,2);
declare variable TIPO INTEGER;
declare variable ID INTEGER;
declare variable DTOAPL NUMERIC(18,2);
declare variable TRM NUMERIC(18,2);
BEGIN
if (ORDEN = 'C') then
    BEGIN
    NITINI = DESDE;
    NITFIN = HASTA;
    NOMINI = '';
    NOMFIN = 'zz';
    END
ELSE
    BEGIN
    NOMINI = DESDE;
    NOMFIN = HASTA;
    NITINI = '';
    NITFIN = 'zz';
    END
  /* Ubique el NIT */
  FOR select T.TERC_NIT, TERC_NOM, TERC_DV, TERC_TEL, TERC_CIU, GRPR_COD, CIUD_COD
    from terceros T, PROVEEDORES P
    where P.TERC_NIT = T.TERC_NIT AND TERC_PROV = 'S' AND T.TERC_NIT >= :NITINI AND T.TERC_NIT <= :NITFIN AND
        TERC_NOM >= :NOMINI AND TERC_NOM <= :NOMFIN
    INTO :NIT, :NOMBRE, :DV, :TELEFONO, :CIUDAD, :CODZONA, :CODCIUD
    DO  
    BEGIN
    OK = 'N';
    if (AGRUPA = 'G') then
        BEGIN
        if (GRPINI = '') then
            BEGIN
            if ((CODZONA IS NULL) or (CODZONA >= :GRPINI AND CODZONA <= :GRPFIN)) then
                OK = 'S';
            END
        ELSE
            if (CODZONA >= :GRPINI AND CODZONA <= :GRPFIN) then
                OK = 'S';
        END
    if (AGRUPA = 'N') then
        OK = 'S';
        
    if (OK = 'S') then
        BEGIN
        SELECT GRPR_NOM FROM GRUPOS_PROVEEDORES WHERE GRPR_COD = :CODZONA INTO :NOMZONA;
        SELECT CIUD_NOM FROM CIUDADES WHERE CIUD_COD = :CODCIUD INTO :NOMCIUD;
        SALDO = 0;
        RTFTE = 0;
        RTIVA = 0;
        RTICA = 0;
        DTOF = 0;
        /* BUSQUE EN SALDOS_DOC_CXPAGAR LOS QUE TENGAN SALDO > 0 */
        FOR SELECT MVPR_TIPOREF, MVPR_IDREF
          FROM MOVIMIENTO_PROVEEDOR
          WHERE TERC_NIT = :NIT AND MVPR_FECHA <= :FECHA AND MVPR_ABONO = 'N' AND ((:MONEDA = 0) or (MVPR_TRM <> 1))
          INTO :TIPO, :ID
          DO
            BEGIN
            EXECUTE PROCEDURE saldo_doc_cxpagar(TIPO, ID, FECHA, MONEDA) returning_values (PSALDO);
            if (PSALDO <> 0) then
                BEGIN
                if (TIPO = 51) then
                    SELECT NDPR_DTOFMONTO, NDPR_TRM FROM NOTAS_DEBITO_PROVEEDOR
                        WHERE NDPR_ID = :ID INTO :PDTOF, :TRM;
                if (TIPO = 52) then
                    SELECT 0, 1 FROM NOTAS_CREDITO_PROVEEDOR WHERE NCPR_ID = :ID INTO :PDTOF, :TRM;
                if (TIPO = 55) then
                    SELECT ANPR_DTOFMONTO, ANPR_TRM FROM ANTICIPOS_PROVEEDOR WHERE ANPR_ID = :ID INTO :PDTOF, :TRM;
                if (TIPO = 21) then
                    SELECT 0, 1 FROM FACTURAS_COMPRA WHERE FACO_ID = :ID INTO :PDTOF, :TRM;
                if (TIPO = 24) then
                    SELECT 0, 1 FROM devoluciones_compras WHERE DVCO_ID = :ID INTO :PDTOF, :TRM;
                if (DTOF IS NULL) then
                    DTOF = 0;
                if (DTOF <> 0) then
                    BEGIN
                    if ((MONEDA <> 0) AND (TRM <> 0)) then
                        DTOF = DTOF / TRM;
                    if (MONEDA = 0) then
                        SELECT SUM(EGDE_DTOF) FROM EGRESOS_DETALLE WHERE EGDE_IDDOC = :ID AND EGDE_TIPODOC = :TIPO INTO :DTOAPL;
                    else
                        SELECT SUM(EGDE_DTOF/EGRE_TRM) FROM EGRESOS_DETALLE D, EGRESOS E
                            WHERE E.egre_id = D.egre_id AND EGDE_IDDOC = :ID AND EGDE_TIPODOC = :TIPO INTO :DTOAPL;
                    if (DTOAPL IS NULL) then
                        DTOAPL = 0;
                    DTOF = DTOF - DTOAPL;
                    END
                if (MONEDA = 0) then
                    SELECT SUM(SDCP_RTEFTE - SDCP_ABRTFTE), SUM(SDCP_RTIVA - SDCP_ABRTIVA), SUM(SDCP_RTICA - SDCP_ABRTICA)
                        FROM SALDOS_DOC_CXPAGAR WHERE SDCP_TIPOREF = :TIPO AND SDCP_IDREF = :ID INTO :PRTFTE, :PRTIVA, :PRTICA;
                else
                    SELECT SUM((SDCP_RTEFTE-SDCP_ABRTFTE)/SDCP_TRM), SUM((SDCP_RTIVA-SDCP_ABRTIVA)/SDCP_TRM), SUM((SDCP_RTICA-SDCP_ABRTICA)/SDCP_TRM)
                        FROM SALDOS_DOC_CXPAGAR WHERE SDCP_TIPOREF = :TIPO AND SDCP_IDREF = :ID INTO :PRTFTE, :PRTIVA, :PRTICA;
                if (PRTFTE IS NULL) then
                    PRTFTE = 0;
                if ((TIPO = 52) or (TIPO = 55) or (TIPO = 24)) THEN
                    BEGIN
                    if (RTFTE > 0) then
                        RTFTE = 0;
                    END
                ELSE
                    BEGIN
                    if (RTFTE < 0) then
                        RTFTE = 0;
                    END
                if (PRTIVA IS NULL) then
                    PRTIVA = 0;
                if ((TIPO = 52) or (TIPO = 55) or (TIPO = 24)) THEN
                    BEGIN
                    if (RTIVA > 0) then
                        RTIVA = 0;
                    END
                ELSE
                    BEGIN
                    if (RTIVA < 0) then
                        RTIVA = 0;
                    END
                if (PRTICA IS NULL) then
                    PRTICA = 0;
                if ((TIPO = 52) or (TIPO = 55) or (TIPO = 24)) THEN
                    BEGIN
                    if (PRTICA > 0) then
                        PRTICA = 0;
                    END
                ELSE
                    BEGIN
                    if (PRTICA < 0) then
                        PRTICA = 0;
                    END
                SALDO = SALDO + PSALDO;
                RTFTE = RTFTE + PRTFTE;
                RTIVA = RTIVA + PRTIVA;
                RTICA = RTICA + PRTICA;
                DTOF = DTOF + PDTOF;
                END
            END
        SUSPEND;
        END
    END
END

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE REP_CXPAGAR_PROVEEDOR(
    DESDE VARCHAR(20),
    HASTA VARCHAR(20),
    GRPINI VARCHAR(5),
    GRPFIN VARCHAR(5),
    FECHA DATE,
    ORDEN CHAR(1),
    AGRUPA CHAR(1),
    MONEDA INTEGER)
RETURNS (
    NIT VARCHAR(20),
    NOMBRE VARCHAR(60),
    TELEFONO VARCHAR(40),
    CIUDAD VARCHAR(40),
    CODZONA VARCHAR(2),
    NOMZONA VARCHAR(60),
    DV CHAR(1),
    CODCIUD CHAR(5),
    NOMCIUD VARCHAR(60),
    TIPO INTEGER,
    ID INTEGER,
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(6),
    CONCEPTO VARCHAR(60),
    SALDO NUMERIC(18,2),
    RTFTE NUMERIC(18,2),
    RTIVA NUMERIC(18,2),
    RTICA NUMERIC(18,2),
    DTOF NUMERIC(18,2),
    TIPONOM VARCHAR(8),
    FECDOC DATE,
    VENCE DATE,
    DIAS INTEGER,
    NUMPROV VARCHAR(20))
AS
declare variable NITINI VARCHAR(20);
declare variable NITFIN VARCHAR(20);
declare variable NOMINI VARCHAR(20);
declare variable NOMFIN VARCHAR(20);
declare variable OK CHAR(1);
declare variable DTOAPL NUMERIC(18,2);
declare variable FOV CHAR(12);
declare variable TRM NUMERIC(18,2);
BEGIN
if (ORDEN = 'C') then
    BEGIN
    NITINI = DESDE;
    NITFIN = HASTA;
    NOMINI = '';
    NOMFIN = 'zz';
    END
ELSE
    BEGIN
    NOMINI = DESDE;
    NOMFIN = HASTA;
    NITINI = '';
    NITFIN = 'zz';
    END
  /* Ubique el NIT */
  FOR select T.TERC_NIT, TERC_NOM, TERC_DV, TERC_TEL, TERC_CIU, P.GRPR_COD, T.CIUD_COD
    from terceros T, PROVEEDORES P 
    where P.TERC_NIT = T.TERC_NIT AND TERC_PROV = 'S' AND T.TERC_NIT >= :NITINI AND T.TERC_NIT <= :NITFIN AND
        TERC_NOM >= :NOMINI AND TERC_NOM <= :NOMFIN
    INTO :NIT, :NOMBRE, :DV, :TELEFONO, :CIUDAD, :CODZONA, :CODCIUD
    DO  
    BEGIN
    select GRPR_NOM from GRUPOS_PROVEEDORES where GRPR_COD = :codzona into :NOMZONA;
    select CIUD_NOM from CIUDADES where CIUD_COD = :codciud into :NOMCIUD;
    OK = 'N';
    if (AGRUPA = 'G') then
        BEGIN
        if (GRPINI = '') then
            BEGIN
            if ((CODZONA IS NULL) or (CODZONA >= :GRPINI AND CODZONA <= :GRPFIN)) then
                OK = 'S';
            END
        ELSE
            if (CODZONA >= :GRPINI AND CODZONA <= :GRPFIN) then
                OK = 'S';
        END
    if (AGRUPA = 'C') then
        BEGIN
        if (GRPINI = '') then
            BEGIN
            if ((CODCIUD IS NULL) or (CODCIUD >= :GRPINI AND CODCIUD <= :GRPFIN)) then
                OK = 'S';
            END
        ELSE
            if (CODCIUD >= :GRPINI AND CODCIUD <= :GRPFIN) then
                OK = 'S';
        END
    if (AGRUPA = 'N') then
        OK = 'S';
        
    if (OK = 'S') then
        BEGIN
        /* BUSQUE EN SALDOS_DOC_CXPAGAR LOS QUE TENGAN SALDO > 0 */
        FOR SELECT MVPR_TIPOREF, MVPR_IDREF, MVPR_PREFIJO, MVPR_NUMERO, MVPR_FECHA, MVPR_VENCE, MVPR_CONC
            FROM MOVIMIENTO_PROVEEDOR
            WHERE TERC_NIT = :NIT AND MVPR_FECHA <= :FECHA AND MVPR_ABONO = 'N' AND ((:MONEDA = 0) or (MVPR_TRM <> 1))
            INTO :TIPO, :ID, :PREFIJO, :NUMERO, :FECDOC, :VENCE, :CONCEPTO
            DO
            BEGIN
            EXECUTE PROCEDURE LEE_CONFIGURACION('CXPAGAR', 'SALDOS', 'ANALISIS DE CXPAGAR CON FECHA FACTURA O VENCIMIENTO') RETURNING_VALUES (FOV);
            if (FOV = 'FECHA') then
                DIAS = FECHA - FECDOC;
            ELSE
                DIAS = FECHA - VENCE;
            EXECUTE PROCEDURE saldo_doc_cxpagar(TIPO, ID, FECHA, MONEDA) returning_values (SALDO);
            if (SALDO <> 0) then
                BEGIN
                SELECT TIDO_NOMCORTO FROM TIPO_DOCUMENTO WHERE TIDO_COD = :TIPO INTO :TIPONOM;
                if (TIPO = 51) then
                    SELECT NDPR_DTOFMONTO, NDPR_NUMPROV, NDPR_TRM FROM NOTAS_DEBITO_PROVEEDOR
                        WHERE NDPR_ID = :ID INTO :DTOF, :NUMPROV, :TRM;
                if (TIPO = 52) then
                    SELECT 0, '', 1 FROM NOTAS_CREDITO_PROVEEDOR WHERE NCPR_ID = :ID INTO :DTOF, :NUMPROV, :TRM;
                if (TIPO = 55) then
                    SELECT ANPR_DTOFMONTO, '', ANPR_TRM FROM ANTICIPOS_PROVEEDOR WHERE ANPR_ID = :ID INTO :DTOF, :NUMPROV, :TRM;
                if (TIPO = 21) then
                    SELECT FACO_DTOFMONTO, FACO_NUMPROV, FACO_TRM FROM FACTURAS_COMPRA WHERE FACO_ID = :ID INTO :DTOF, :NUMPROV, :TRM;
                if (TIPO = 24) then
                    SELECT 0, '', 1 FROM devoluciones_compras WHERE DVCO_ID = :ID INTO :DTOF, :NUMPROV, :TRM;
                if (DTOF IS NULL) then
                    DTOF = 0;
                if (DTOF <> 0) then
                    BEGIN
                    if ((MONEDA <> 0) AND (TRM <> 0)) then
                        DTOF = DTOF / TRM;
                    if (MONEDA = 0) then
                        SELECT SUM(EGDE_DTOF) FROM EGRESOS_DETALLE WHERE EGDE_IDDOC = :ID AND EGDE_TIPODOC = :TIPO INTO :DTOAPL;
                    else
                        SELECT SUM(EGDE_DTOF/EGRE_TRM) FROM EGRESOS_DETALLE D, EGRESOS E
                            WHERE E.egre_id = D.egre_id AND EGDE_IDDOC = :ID AND EGDE_TIPODOC = :TIPO INTO :DTOAPL;

                    if (DTOAPL IS NULL) then
                        DTOAPL = 0;
                    DTOF = DTOF - DTOAPL;
                    END
                if (MONEDA = 0) then
                    SELECT SUM(SDCP_RTEFTE-SDCP_ABRTFTE), SUM(SDCP_RTIVA-SDCP_ABRTIVA), SUM(SDCP_RTICA-SDCP_ABRTICA)
                        FROM SALDOS_DOC_CXPAGAR WHERE SDCP_TIPOREF = :TIPO AND SDCP_IDREF = :ID INTO :RTFTE, :RTIVA, :RTICA;
                else
                    SELECT SUM((SDCP_RTEFTE-SDCP_ABRTFTE)/SDCP_TRM), SUM((SDCP_RTIVA-SDCP_ABRTIVA)/SDCP_TRM), SUM((SDCP_RTICA-SDCP_ABRTICA)/SDCP_TRM)
                        FROM SALDOS_DOC_CXPAGAR WHERE SDCP_TIPOREF = :TIPO AND SDCP_IDREF = :ID INTO :RTFTE, :RTIVA, :RTICA;
                if (RTFTE IS NULL) then
                    RTFTE = 0;
                if ((TIPO = 52) or (TIPO = 55) or (TIPO = 24)) THEN
                    BEGIN
                    if (RTFTE > 0) then
                        RTFTE = 0;
                    END
                ELSE
                    BEGIN
                    if (RTFTE < 0) then
                        RTFTE = 0;
                    END

                if (RTIVA IS NULL) then
                    RTIVA = 0;
                if ((TIPO = 52) or (TIPO = 55) or (TIPO = 24)) THEN
                    BEGIN
                    if (RTIVA > 0) then
                        RTIVA = 0;
                    END
                ELSE
                    BEGIN
                    if (RTIVA < 0) then
                        RTIVA = 0;
                    END

                if (RTICA IS NULL) then
                    RTICA = 0;
                if ((TIPO = 52) or (TIPO = 55) or (TIPO = 24)) THEN
                    BEGIN
                    if (RTICA > 0) then
                        RTICA = 0;
                    END
                ELSE
                    BEGIN
                    if (RTICA < 0) then
                        RTICA = 0;
                    END
                SUSPEND;
                END
            END
        END
    END
END

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE SALDO_PROVEEDOR(
    NIT VARCHAR(20),
    FECHA DATE,
    MONEDA INTEGER)
RETURNS (
    SALDO NUMERIC(18,2))
AS
DECLARE VARIABLE sal numeric(18,2);
declare variable TIPODOC INTEGER;
declare variable IDDOC INTEGER;
BEGIN
fecha = fecha - 1;
saldo = 0;
FOR SELECT MVPR_TIPOREF, MVPR_IDREF FROM movimiento_proveedor
    WHERE TERC_NIT = :NIT AND MVPR_FECHA <= :FECHA AND MVPR_ABONO = 'N'
    INTO :TIPODOC, :IDDOC
    DO
    BEGIN
    EXECUTE PROCEDURE saldo_doc_cxpagar(TIPODOC, IDDOC, FECHA, MONEDA) returning_values (SAL);
    if (SAL <> 0) then
        SALDO = SALDO + SAL;
    END
SUSPEND;
END

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE CONCILIA_CXPAGAR(
    FECINI DATE,
    FECFIN DATE,
    CTACART VARCHAR(20),
    SUBEMPRESA INTEGER,
    ANTERIOR CHAR(1))
RETURNS (
    NIT VARCHAR(20),
    NOMBRE VARCHAR(60),
    INICIAL NUMERIC(18,2),
    INICIALC NUMERIC(18,2),
    DEBITOS NUMERIC(18,2),
    DEBITOSC NUMERIC(18,2),
    CREDITOS NUMERIC(18,2),
    CREDITOSC NUMERIC(18,2),
    SALDO NUMERIC(18,2),
    SALDOC NUMERIC(18,2),
    DIFERENCIA NUMERIC(18,2))
AS
declare variable ANO CHAR(4);
declare variable MES INTEGER;
declare variable ABONOS NUMERIC(18,2);
declare variable RETES CHAR(2);
begin
ano = EXTRACT(YEAR FROM FECFIN);
mes = EXTRACT(MONTH FROM FECFIN);

for select TERC_NIT, TERC_NOM from TERCEROS WHERE TERC_PROV = 'S' into :NIT, :NOMBRE
    DO
    BEGIN
    EXECUTE PROCEDURE saldo_proveedor (NIT, FECINI, 0) returning_values (INICIAL);
    EXECUTE PROCEDURE LEE_CONFIGURACION('CXPAGAR', 'SALDOS', 'DESCONTAR RETENCIONES POR CAUSACION') returning_values(:RETES);
    if (RETES = 'SI') then
        BEGIN
        SELECT SUM(MVPR_MONTO-MVPR_RTFTE-MVPR_RTIVA-MVPR_RTICA)
            FROM movimiento_proveedor
            WHERE TERC_NIT = :NIT AND MVPR_FECHA >= :FECINI AND MVPR_FECHA < :FECFIN AND MVPR_DEBITO = 'S'
            INTO :DEBITOS;
        SELECT SUM(MVPR_MONTO-MVPR_RTFTE-MVPR_RTIVA-MVPR_RTICA)
            FROM movimiento_proveedor
            WHERE TERC_NIT = :NIT AND MVPR_FECHA >= :FECINI AND MVPR_FECHA < :FECFIN AND MVPR_DEBITO = 'N' AND MVPR_ABONO = 'N' and MVPR_TIPOREF <> 55
            INTO :CREDITOS;
        SELECT SUM(MVPR_MONTO) FROM movimiento_proveedor
            WHERE TERC_NIT = :NIT AND MVPR_FECHA >= :FECINI AND MVPR_FECHA < :FECFIN AND MVPR_ABONO = 'S'
            INTO :ABONOS;
        END
    ELSE
        BEGIN
        SELECT SUM(MVPR_MONTO)
            FROM movimiento_proveedor
            WHERE TERC_NIT = :NIT AND MVPR_FECHA >= :FECINI AND MVPR_FECHA < :FECFIN AND MVPR_DEBITO = 'S'
            INTO :DEBITOS;
        SELECT SUM(MVPR_MONTO)
            FROM movimiento_proveedor
            WHERE TERC_NIT = :NIT AND MVPR_FECHA >= :FECINI AND MVPR_FECHA < :FECFIN AND MVPR_DEBITO = 'N' AND MVPR_ABONO = 'N' AND MVPR_TIPOREF <> 55
            INTO :CREDITOS;
        SELECT SUM(MVPR_MONTO+MVPR_RTFTE+MVPR_RTIVA+MVPR_RTICA)
            FROM movimiento_proveedor
            WHERE TERC_NIT = :NIT AND MVPR_FECHA >= :FECINI AND MVPR_FECHA < :FECFIN AND MVPR_ABONO = 'S'
            INTO :ABONOS;
        END
    if (DEBITOS IS NULL) then
        DEBITOS = 0;
    if (CREDITOS IS NULL) then
        CREDITOS = 0;
    if (ABONOS IS NULL) then
        ABONOS = 0;
    CREDITOS = CREDITOS + ABONOS;
    SALDO = INICIAL + DEBITOS - CREDITOS;

    /* LO CONTABLE */
    EXECUTE PROCEDURE SALDO_TERCERO_MES(ctacart, NIT, ANO, MES, 'S') RETURNING_VALUES (INICIALC);
    EXECUTE PROCEDURE MOVIMIENTO_TERCERO_MES(ctacart, NIT, ANO, MES, 'S') RETURNING_VALUES(DEBITOSC);
    EXECUTE PROCEDURE MOVIMIENTO_TERCERO_MES(ctacart, NIT, ANO, MES, 'N') RETURNING_VALUES(CREDITOSC);
    SALDOC = INICIALC + DEBITOSC - CREDITOSC;
    diferencia = SALDO + SALDOC;
    if (DIFERENCIA <> 0) then
        BEGIN
        if (ANTERIOR <> 'S') then
            SUSPEND;
        ELSE
            BEGIN
            if (DIFERENCIA <> (INICIAL + INICIALC)) then
                SUSPEND;
            END
        END
    END
end

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE MOVIMIENTO_CXPAGAR_DESDE_HASTA(
    NIT VARCHAR(20),
    DESDE DATE,
    HASTA DATE,
    MONEDA INTEGER)
RETURNS (
    INICIAL NUMERIC(18,2),
    TIPODOC VARCHAR(8),
    IDDOC INTEGER,
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    CONCEPTO VARCHAR(60),
    DEBITO NUMERIC(18,2),
    CREDITO NUMERIC(18,2),
    SALDO NUMERIC(18,2),
    NOMBRE VARCHAR(60),
    RTFTE NUMERIC(18,2),
    RTIVA NUMERIC(18,2),
    RTICA NUMERIC(18,2),
    NUMPROV VARCHAR(20))
AS
declare variable DB CHAR(1);
declare variable AB CHAR(1);
declare variable RETES CHAR(2);
declare variable TRM NUMERIC(18,2);
BEGIN
  /* Ubique el NIT */
  select terc_nom from terceros where terc_nit = :NIT INTO :NOMBRE;
  execute procedure saldo_proveedor (NIT, DESDE, MONEDA) returning_values (INICIAL);
  if (INICIAL is null) then
    INICIAL = 0;
  SALDO = INICIAL;
  EXECUTE PROCEDURE LEE_CONFIGURACION('CXPAGAR', 'SALDOS', 'DESCONTAR RETENCIONES POR CAUSACION') returning_values(:RETES);
  FOR select tido_nomcorto, mvpr_idref, mvpr_prefijo, mvpr_numero, mvpr_fecha, mvpr_conc, mvpr_monto, mvpr_debito, mvpr_rtfte, mvpr_rtiva, mvpr_rtica, mvpr_abono, MVPR_TRM
    from movimiento_proveedor m, tipo_documento t
    where m.mvpr_tiporef = t.tido_cod and terc_nit = :NIT and mvpr_fecha >= :DESDE and mvpr_fecha <= :HASTA AND mvpr_tiporef <> 55 AND ((:MONEDA = 0) or (MVPR_TRM <> 1))
    order by mvpr_fecha, mvpr_tiporef
    into :TIPODOC, :IDDOC, :PREFIJO, :NUMERO, :FECHA, :CONCEPTO, :DEBITO, :DB, :RTFTE, :RTIVA, :RTICA, :AB, :TRM
    DO
    BEGIN
    if (DB = 'N') then
        BEGIN
        if (AB = 'S') then
            if (RETES = 'SI') then
                CREDITO = DEBITO;
            ELSE
                CREDITO = DEBITO + RTFTE + RTIVA + RTICA;
        ELSE
            if (RETES = 'SI') then
                CREDITO = DEBITO - RTFTE - RTIVA - RTICA;
            ELSE
                CREDITO = DEBITO;
        DEBITO = 0;
        END
    ELSE
        BEGIN
        if (RETES = 'SI') then
            DEBITO = DEBITO - RTFTE - RTIVA - RTICA;
        CREDITO = 0;
        END
    if ((MONEDA <> 0) AND (TRM <> 0)) then
        BEGIN
        DEBITO = DEBITO / TRM;
        CREDITO = CREDITO / TRM;
        RTFTE = RTFTE / TRM;
        RTIVA = RTIVA / TRM;
        RTICA = RTICA / TRM;
        END
    SALDO = SALDO + DEBITO - CREDITO;
    NUMPROV = '';
    if (TIPODOC = 'CARGOACR') then
        SELECT NDPR_NUMPROV FROM NOTAS_DEBITO_PROVEEDOR WHERE NDPR_ID = :IDDOC INTO :NUMPROV;
    if (TIPODOC = 'FACTCOMP') then
        SELECT FACO_NUMPROV FROM FACTURAS_COMPRA WHERE FACO_ID = :IDDOC INTO :NUMPROV;
    SUSPEND;
    END
END

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE MOVIMIENTO_CXPAGAR_MES(
    FECINI DATE,
    FECFIN DATE,
    MONEDA INTEGER)
RETURNS (
    NIT VARCHAR(20),
    NOMBRE VARCHAR(60),
    INICIAL NUMERIC(18,4),
    DEBITOS NUMERIC(18,4),
    CREDITOS NUMERIC(18,4),
    ABONOS NUMERIC(18,4),
    FINAL NUMERIC(18,4))
AS
declare variable RETES CHAR(2);
BEGIN
  for select TERC_NIT, TERC_NOM from TERCEROS WHERE TERC_PROV = 'S' into :NIT, :NOMBRE
  DO
    BEGIN
    EXECUTE PROCEDURE saldo_proveedor (NIT, FECINI, MONEDA) returning_values (INICIAL);
    EXECUTE PROCEDURE LEE_CONFIGURACION('CXPAGAR', 'SALDOS', 'DESCONTAR RETENCIONES POR CAUSACION') returning_values(:RETES);
    if (RETES = 'SI') then
        BEGIN
        SELECT SUM((MVPR_MONTO-MVPR_RTFTE-MVPR_RTIVA-MVPR_RTICA)/MVPR_TRM)
            FROM movimiento_proveedor
            WHERE TERC_NIT = :NIT AND MVPR_FECHA >= :FECINI AND MVPR_FECHA < :FECFIN AND MVPR_DEBITO = 'S' AND ((:MONEDA = 0) or (MVPR_TRM <> 1))
            INTO :DEBITOS;
        SELECT SUM((MVPR_MONTO-MVPR_RTFTE-MVPR_RTIVA-MVPR_RTICA)/MVPR_TRM)
            FROM movimiento_proveedor
            WHERE TERC_NIT = :NIT AND MVPR_FECHA >= :FECINI AND MVPR_FECHA < :FECFIN AND MVPR_DEBITO = 'N' AND MVPR_ABONO = 'N' and MVPR_TIPOREF <> 55 AND ((:MONEDA = 0) or (MVPR_TRM <> 1))
            INTO :CREDITOS;
        SELECT SUM(MVPR_MONTO/MVPR_TRM) FROM movimiento_proveedor
            WHERE TERC_NIT = :NIT AND MVPR_FECHA >= :FECINI AND MVPR_FECHA < :FECFIN AND MVPR_ABONO = 'S' AND ((:MONEDA = 0) or (MVPR_TRM <> 1))
            INTO :ABONOS;
        END
    ELSE
        BEGIN
        SELECT SUM(MVPR_MONTO/MVPR_TRM)
            FROM movimiento_proveedor
            WHERE TERC_NIT = :NIT AND MVPR_FECHA >= :FECINI AND MVPR_FECHA < :FECFIN AND MVPR_DEBITO = 'S' AND ((:MONEDA = 0) or (MVPR_TRM <> 1))
            INTO :DEBITOS;
        SELECT SUM(MVPR_MONTO/MVPR_TRM)
            FROM movimiento_proveedor
            WHERE TERC_NIT = :NIT AND MVPR_FECHA >= :FECINI AND MVPR_FECHA < :FECFIN AND MVPR_DEBITO = 'N' AND MVPR_ABONO = 'N' AND MVPR_TIPOREF <> 55 AND ((:MONEDA = 0) or (MVPR_TRM <> 1))
            INTO :CREDITOS;
        SELECT SUM((MVPR_MONTO+MVPR_RTFTE+MVPR_RTIVA+MVPR_RTICA)/MVPR_TRM)
            FROM movimiento_proveedor
            WHERE TERC_NIT = :NIT AND MVPR_FECHA >= :FECINI AND MVPR_FECHA < :FECFIN AND MVPR_ABONO = 'S' AND ((:MONEDA = 0) or (MVPR_TRM <> 1))
            INTO :ABONOS;
        END
    if (DEBITOS IS NULL) then
        DEBITOS = 0;
    if (CREDITOS IS NULL) then
        CREDITOS = 0;
    if (ABONOS IS NULL) then
        ABONOS = 0;
    FINAL = INICIAL + DEBITOS - CREDITOS - ABONOS;
    SUSPEND;
    END
END

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE REP_MOVIMIENTO_PROVEEDOR(
    DESDE VARCHAR(20),
    HASTA VARCHAR(20),
    GRPINI VARCHAR(5),
    GRPFIN VARCHAR(5),
    FECINI DATE,
    FECFIN DATE,
    DETALLE CHAR(1),
    ORDEN CHAR(1),
    AGRUPA CHAR(1),
    MONEDA INTEGER)
RETURNS (
    NIT VARCHAR(20),
    NOMBRE VARCHAR(60),
    TELEFONO VARCHAR(40),
    CIUDAD VARCHAR(40),
    CODZONA VARCHAR(2),
    NOMZONA VARCHAR(60),
    DV CHAR(1),
    CODCIUD CHAR(5),
    NOMCIUD VARCHAR(60),
    INICIAL NUMERIC(18,2),
    TIPODOC VARCHAR(8),
    IDDOC INTEGER,
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    CONCEPTO VARCHAR(60),
    DEBITO NUMERIC(18,2),
    CREDITO NUMERIC(18,2),
    ABONO NUMERIC(18,2),
    SALDO NUMERIC(18,2),
    RTFTE NUMERIC(18,2),
    RTIVA NUMERIC(18,2),
    RTICA NUMERIC(18,2),
    ARTFTE NUMERIC(18,2),
    ARTIVA NUMERIC(18,2),
    ARTICA NUMERIC(18,2))
AS
declare variable NITINI VARCHAR(20);
declare variable NITFIN VARCHAR(20);
declare variable NOMINI VARCHAR(20);
declare variable NOMFIN VARCHAR(20);
declare variable OK CHAR(1);
declare variable DB CHAR(1);
declare variable AB CHAR(1);
declare variable DESCRETE CHAR(2);
declare variable TRM NUMERIC(18,2);
BEGIN
if (ORDEN = 'C') then
    BEGIN
    NITINI = DESDE;
    NITFIN = HASTA;
    NOMINI = '';
    NOMFIN = 'zz';
    END
ELSE
    BEGIN
    NOMINI = DESDE;
    NOMFIN = HASTA;
    NITINI = '';
    NITFIN = 'zz';
    END
EXECUTE PROCEDURE LEE_CONFIGURACION('CXPAGAR', 'SALDOS', 'DESCONTAR RETENCIONES POR CAUSACION') returning_values (DESCRETE);
/* Ubique el NIT */
FOR select T.TERC_NIT, TERC_NOM, TERC_DV, TERC_TEL, TERC_CIU, P.GRPR_COD, T.CIUD_COD
    from terceros T, PROVEEDORES P
    where P.TERC_NIT = T.TERC_NIT AND TERC_PROV = 'S' AND T.TERC_NIT >= :NITINI AND T.TERC_NIT <= :NITFIN AND
        TERC_NOM >= :NOMINI AND TERC_NOM <= :NOMFIN
    INTO :NIT, :NOMBRE, :DV, :TELEFONO, :CIUDAD, :CODZONA, :CODCIUD
    DO  
    BEGIN

    SELECT GRPR_NOM FROM GRUPOS_PROVEEDORES WHERE GRPR_COD = :CODZONA INTO :NOMZONA;
    SELECT CIUD_NOM FROM CIUDADES WHERE CIUD_COD = :CODCIUD INTO :NOMCIUD;
    OK = 'N';
    if (AGRUPA = 'Z') then
        BEGIN
        if (GRPINI = '') then
            BEGIN
            if ((CODZONA IS NULL) or (CODZONA >= :GRPINI AND CODZONA <= :GRPFIN)) then
                OK = 'S';
            END
        ELSE
            if (CODZONA >= :GRPINI AND CODZONA <= :GRPFIN) then
                OK = 'S';
        END
    if (AGRUPA = 'C') then
        BEGIN
        if (GRPINI = '') then
            BEGIN
            if ((CODCIUD IS NULL) or (CODCIUD >= :GRPINI AND CODCIUD <= :GRPFIN)) then
                OK = 'S';
            END
        ELSE
            if (CODCIUD >= :GRPINI AND CODCIUD <= :GRPFIN) then
                OK = 'S';
        END
    if (AGRUPA = 'N') then
        OK = 'S';
        
    if (OK = 'S') then
        BEGIN
        execute procedure saldo_proveedor (NIT, FECINI, MONEDA) returning_values (INICIAL);
        if (INICIAL is null) then
            INICIAL = 0;
        SALDO = INICIAL;
        if (DETALLE = 'S') then
          BEGIN
          FOR select tido_nomcorto, mvpr_idref, mvpr_prefijo, mvpr_numero, mvpr_fecha, mvpr_conc, mvpr_monto, mvpr_debito, mvpr_rtfte, mvpr_rtiva, mvpr_rtica, mvpr_abono, MVPR_TRM
            from movimiento_proveedor m, tipo_documento t
            where m.mvpr_tiporef = t.tido_cod and terc_nit = :NIT and mvpr_fecha >= :FECINI and mvpr_fecha <= :FECFIN AND MVPR_TIPOREF <> 55 AND ((:MONEDA = 0) or (MVPR_TRM <> 1))
            order by mvpr_fecha, mvpr_tiporef
            into :TIPODOC, :IDDOC, :PREFIJO, :NUMERO, :FECHA, :CONCEPTO, :DEBITO, :DB, :RTFTE, :RTIVA, :RTICA, :AB, :TRM
            DO
            BEGIN
            if (RTFTE IS NULL) then
                RTFTE = 0;
            if (RTIVA IS NULL) then
                RTIVA = 0;
            if (RTICA IS NULL) then
                RTICA = 0;
            if (DB = 'N') then
                BEGIN
                CREDITO = DEBITO;
                DEBITO = 0;
                RTFTE = RTFTE * -1;
                RTIVA = RTIVA * -1;
                RTICA = RTICA * -1;
                END
            ELSE
                CREDITO = 0;
            if ((MONEDA <> 0) AND (TRM <> 0)) then
                BEGIN
                DEBITO = DEBITO / TRM;
                CREDITO = CREDITO / TRM;
                RTFTE = RTFTE / TRM;
                RTIVA = RTIVA / TRM;
                RTICA = RTICA / TRM;
                END
            SALDO = SALDO + DEBITO - CREDITO;
            if (AB = 'N') then
                BEGIN
                if (DESCRETE = 'SI') then
                    SALDO = SALDO - RTFTE - RTIVA - RTICA;
                ABONO = 0;
                END
            ELSE
                BEGIN
                ABONO = CREDITO;
                CREDITO = 0;
                if (DESCRETE <> 'SI') then
                    SALDO = SALDO + RTFTE + RTIVA + RTICA;
                END
            SUSPEND;
            END
          END
        ELSE
            BEGIN
            if (MONEDA = 0) then
                SELECT SUM(MVPR_MONTO), sum(mvpr_rtfte), sum(mvpr_rtiva), sum(mvpr_rtica)
                    FROM movimiento_proveedor WHERE TERC_NIT = :NIT AND MVPR_FECHA >= :FECINI AND MVPR_FECHA <= :FECFIN AND MVPR_DEBITO = 'S' and MVPR_ABONO = 'N'
                    INTO :DEBITO, :RTFTE, :RTIVA, :RTICA;
            else
                SELECT SUM(MVPR_MONTO/MVPR_TRM), sum(mvpr_rtfte/MVPR_TRM), sum(mvpr_rtiva/MVPR_TRM), sum(mvpr_rtica/MVPR_TRM)
                    FROM movimiento_proveedor WHERE TERC_NIT = :NIT AND MVPR_FECHA >= :FECINI AND MVPR_FECHA <= :FECFIN AND MVPR_DEBITO = 'S' and MVPR_ABONO = 'N' AND ((:MONEDA = 0) or (MVPR_TRM <> 1))
                    INTO :DEBITO, :RTFTE, :RTIVA, :RTICA;
            if (DEBITO IS NULL) then
                DEBITO = 0;
            if (RTFTE IS NULL) then
                RTFTE = 0;
            if (RTIVA IS NULL) then
                RTIVA = 0;
            if (RTICA IS NULL) then
                RTICA = 0;
            if (DESCRETE = 'SI') then
                DEBITO = DEBITO - RTFTE - RTIVA - RTICA;
            if (MONEDA = 0) then
                SELECT SUM(MVPR_MONTO), sum(mvpr_rtfte), sum(mvpr_rtiva), sum(mvpr_rtica) FROM movimiento_proveedor
                    WHERE TERC_NIT = :NIT AND MVPR_FECHA >= :FECINI AND MVPR_FECHA <= :FECFIN AND MVPR_DEBITO = 'N' AND MVPR_TIPOREF <> 55 AND MVPR_ABONO = 'N' INTO :CREDITO, :ARTFTE, :ARTIVA, :ARTICA;
            else
                SELECT SUM(MVPR_MONTO/MVPR_TRM), sum(mvpr_rtfte/MVPR_TRM), sum(mvpr_rtiva/MVPR_TRM), sum(mvpr_rtica/MVPR_TRM) FROM movimiento_proveedor
                    WHERE TERC_NIT = :NIT AND MVPR_FECHA >= :FECINI AND MVPR_FECHA <= :FECFIN AND MVPR_DEBITO = 'N' AND MVPR_TIPOREF <> 55 AND MVPR_ABONO = 'N' INTO :CREDITO, :ARTFTE, :ARTIVA, :ARTICA;
            if (CREDITO IS NULL) then
                CREDITO = 0;
            if (ARTFTE IS NULL) then
                ARTFTE = 0;
            if (ARTIVA IS NULL) then
                ARTIVA = 0;
            if (ARTICA IS NULL) then
                ARTICA = 0;
            if (DESCRETE = 'SI') then
                CREDITO = CREDITO - ARTFTE - ARTIVA - ARTICA;
            RTFTE = RTFTE - ARTFTE;
            RTIVA = RTIVA - ARTIVA;
            RTICA = RTICA - ARTICA;
            if (MONEDA = 0) then
                SELECT SUM(MVPR_MONTO), sum(mvpr_rtfte), sum(mvpr_rtiva), sum(mvpr_rtica) FROM movimiento_proveedor
                    WHERE TERC_NIT = :NIT AND MVPR_FECHA >= :FECINI AND MVPR_FECHA <= :FECFIN AND MVPR_ABONO = 'S'
                    INTO :ABONO, :ARTFTE, :ARTIVA, :ARTICA;
            else
                SELECT SUM(MVPR_MONTO/MVPR_TRM), sum(mvpr_rtfte/MVPR_TRM), sum(mvpr_rtiva/MVPR_TRM), sum(mvpr_rtica/MVPR_TRM)
                    FROM movimiento_proveedor
                    WHERE TERC_NIT = :NIT AND MVPR_FECHA >= :FECINI AND MVPR_FECHA <= :FECFIN AND MVPR_ABONO = 'S' AND ((:MONEDA = 0) or (MVPR_TRM <> 1))
                    INTO :ABONO, :ARTFTE, :ARTIVA, :ARTICA;
            if (ABONO IS NULL) then
                ABONO = 0;
            if (ARTFTE IS NULL) then
                ARTFTE = 0;
            if (ARTIVA IS NULL) then
                ARTIVA = 0;
            if (ARTICA IS NULL) then
                ARTICA = 0;
            if (DESCRETE <> 'SI') then
                ABONO = ABONO + ARTFTE + ARTIVA + ARTICA;
            SALDO = INICIAL + DEBITO - CREDITO - ABONO;
            SUSPEND;
            END
        END
    END
END

^

SET TERM ; ^

SET TERM ^ ;

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

SET TERM ; ^

SET TERM ^ ;

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

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

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

SET TERM ; ^

SET TERM ^ ;

ALTER TRIGGER APLICACION_PROVEEDOR_DETALLE_BI
as
declare variable PREGTASA CHAR(2);
declare variable TRM NUMERIC(18,2);
declare variable SALDO NUMERIC(18,2);
declare variable SALDOM NUMERIC(18,2);
declare variable RETES CHAR(2);
begin
/* SI TRM <> 1 CONVIERTA A PESOS LOS VALORES */
EXECUTE PROCEDURE LEE_CONFIGURACION('GENERAL', 'GENERAL', 'PREGUNTAR TASA DE CAMBIO EN DOCUMENTOS DE CUENTAS POR PAGAR') returning_values (:pregtasa);
if (PREGTASA = 'SI') then
    BEGIN
    SELECT APPR_TRM FROM aplicacion_provedor WHERE APPR_ID = NEW.appr_id INTO :TRM;
    NEW.appd_aplicado = NEW.appd_aplicado * :trm;
    NEW.appd_rtfte = NEW.appd_rtfte * :trm;
    NEW.appd_rtiva = NEW.appd_rtiva * :trm;
    NEW.appd_rtica = NEW.appd_rtica * :trm;
    /* VERIFIQUE LOS SALDOS SI LLEVE LA DIFERENCIA COMO DIF EN CAMBIO */
    execute procedure lee_configuracion('CXPAGAR', 'SALDOS', 'DESCONTAR RETENCIONES POR CAUSACION') returning_values (RETES);
    execute procedure saldo_doc_cxpagar(new.appd_tipodoc, new.appd_iddoc, '9999/12/31', 0) returning_values(saldo);
    if (SALDO < 0) then
        BEGIN
        if (RETES = 'SI') then
            begin
            if (saldo > NEW.appd_aplicado) then
                BEGIN
                execute procedure saldo_doc_cxpagar(new.appd_tipodoc, new.appd_iddoc, '9999/12/31', 1) returning_values(saldoM);
                if (saldoM > (NEW.appd_aplicado/:TRM)) then
                    EXCEPTION DOCUMENTO_ABONO_MAYOR 'EL SALDO DEL DOCUMENTO ' || NEW.appd_prefijo || NEW.appd_numero || ' ES INSUFICIENTE.';
                else
                    BEGIN
                    NEW.appd_difcambio = :SALDO - NEW.appd_aplicado;
                    NEW.appd_aplicado = NEW.appd_aplicado - NEW.appd_difcambio;
                    END
                END
            end
        ELSE
            begin
            if (saldo > (NEW.appd_aplicado + NEW.appd_rtfte + NEW.appd_rtiva + NEW.appd_rtica)) then
                begin
                execute procedure saldo_doc_cxpagar(new.appd_tipodoc, new.appd_iddoc, '9999/12/31', 1) returning_values(saldoM);
                if (saldoM > ((NEW.appd_aplicado+NEW.appd_rtfte+NEW.appd_rtiva+NEW.appd_rtica)/:TRM)) then
                    EXCEPTION DOCUMENTO_ABONO_MAYOR 'EL SALDO DEL DOCUMENTO ' || NEW.appd_prefijo || NEW.appd_numero || ' ES INSUFICIENTE.';
                else
                    BEGIN
                    NEW.appd_difcambio = :SALDO - (NEW.appd_aplicado+NEW.appd_rtfte+NEW.appd_rtiva+NEW.appd_rtica);
                    NEW.appd_aplicado = NEW.appd_aplicado - NEW.appd_difcambio;
                    END
                end
            end
        END
    else
        BEGIN
        if (RETES = 'SI') then
            begin
            if (saldo < NEW.appd_aplicado) then
                BEGIN
                execute procedure saldo_doc_cxpagar(new.appd_tipodoc, new.appd_iddoc, '9999/12/31', 1) returning_values(saldoM);
                if (saldoM < (NEW.appd_aplicado/:TRM)) then
                    EXCEPTION DOCUMENTO_ABONO_MAYOR 'EL SALDO DEL DOCUMENTO ' || NEW.appd_prefijo || NEW.appd_numero || ' ES INSUFICIENTE.';
                else
                    BEGIN
                    NEW.appd_difcambio = :SALDO - NEW.appd_aplicado;
                    NEW.appd_aplicado = NEW.appd_aplicado - NEW.appd_difcambio;
                    END
                END
            end
        ELSE
            begin
            if (saldo < (NEW.appd_aplicado + NEW.appd_rtfte + NEW.appd_rtiva + NEW.appd_rtica)) then
                begin
                execute procedure saldo_doc_cxpagar(new.appd_tipodoc, new.appd_iddoc, '9999/12/31', 1) returning_values(saldoM);
                if (saldoM < ((NEW.appd_aplicado+NEW.appd_rtfte+NEW.appd_rtiva+NEW.appd_rtica)/:TRM)) then
                    EXCEPTION DOCUMENTO_ABONO_MAYOR 'EL SALDO DEL DOCUMENTO ' || NEW.appd_prefijo || NEW.appd_numero || ' ES INSUFICIENTE.';
                else
                    BEGIN
                    NEW.appd_difcambio = :SALDO - (NEW.appd_aplicado+NEW.appd_rtfte+NEW.appd_rtiva+NEW.appd_rtica);
                    NEW.appd_aplicado = NEW.appd_aplicado - NEW.appd_difcambio;
                    END
                end
            end
        END
    end
end
^

SET TERM ; ^

SET TERM ^ ;

ALTER TRIGGER EGRESOS_DETALLE_AI
AS
declare variable EXISTE CHAR(1);
declare variable FEC DATE;
declare variable CONC VARCHAR(60);
declare variable NIT VARCHAR(20);
declare variable CONCEPTO VARCHAR(60);
declare variable PREFIJO VARCHAR(4);
declare variable NUMERO VARCHAR(6);
declare variable OK CHAR(1);
declare variable EGANTI INTEGER;
declare variable RETES CHAR(2);
declare variable SALDO NUMERIC(18,2);
declare variable TRM NUMERIC(18,2);
BEGIN
/* Abone el documento referenciado en EGRESOS_DETALLE */
select PREF_PRE, EGRE_NUMERO, EGRE_FECHA, EGRE_CONC, TERC_NIT, EGRE_TRM
    from EGRESOS where EGRE_ID = new.EGRE_ID into :PREFIJO, :NUMERO, :FEC, :CONCEPTO, :NIT, :TRM;
if ((NEW.EGRE_ID <> 0) and (new.egde_anulado = 'N')) then
    BEGIN
    OK = 'N';
    if (new.EGDE_TIPODOC = 55) then
        BEGIN
        /* BUSQUE SI TIENE EGRE_ID, SI NO LO ACTUALIZA */
        SELECT EGRE_ID FROM ANTICIPOS_PROVEEDOR WHERE ANPR_ID = NEW.EGDE_IDDOC INTO :EGANTI;
        if (EGANTI = 0) then
            BEGIN
            OK = 'S';
            UPDATE ANTICIPOS_PROVEEDOR SET EGRE_ID = NEW.EGRE_ID WHERE ANPR_ID = NEW.EGDE_IDDOC;
            END
        END
    /* valide que no se pase del saldo */
    execute procedure saldo_doc_cxpagar(new.egde_tipodoc, new.egde_iddoc, '9999/12/31', 0) returning_values(saldo);
    execute procedure lee_configuracion('CXPAGAR', 'SALDOS', 'DESCONTAR RETENCIONES POR CAUSACION') returning_values (RETES);
    if (SALDO < 0) then
        BEGIN
        if (RETES = 'SI') then
            begin
            if (saldo > NEW.egde_abono) then
                EXCEPTION DOCUMENTO_ABONO_MAYOR 'EL SALDO DEL DOCUMENTO ' || NEW.egde_prefijo || NEW.egde_numero || ' ES INSUFICIENTE.';
            end
        ELSE
            begin
            if (saldo > (NEW.egde_abono + NEW.egde_rtfte + NEW.egde_rtiva + NEW.egde_rtica + new.egde_dtof)) then
                EXCEPTION DOCUMENTO_ABONO_MAYOR 'EL SALDO DEL DOCUMENTO ' || NEW.egde_prefijo || NEW.egde_numero || ' ES INSUFICIENTE.';
            end
        END
    else
        BEGIN
        if (RETES = 'SI') then
            begin
            if (saldo < NEW.egde_abono) then
                EXCEPTION DOCUMENTO_ABONO_MAYOR 'EL SALDO DEL DOCUMENTO ' || NEW.egde_prefijo || NEW.egde_numero || ' ES INSUFICIENTE.';
            end
        ELSE
            begin
            if (saldo < (NEW.egde_abono + NEW.egde_rtfte + NEW.egde_rtiva + NEW.egde_rtica + NEW.egde_dtof)) then
                EXCEPTION DOCUMENTO_ABONO_MAYOR 'EL SALDO DEL DOCUMENTO ' || NEW.egde_prefijo || NEW.egde_numero || ' ES INSUFICIENTE.';
            end
        END
    if (OK = 'N') then
        BEGIN
        select 'S' from saldos_doc_cxpagar where sdcp_tiporef = new.egde_tipodoc and
            sdcp_idref = new.egde_iddoc and sdcp_fecha = :FEC into :EXISTE;
        if (Existe = 'S') then
            begin
            /* actualice el saldo del dia */
            UPDATE saldos_doc_cxpagar
                SET SDCP_ABONO = SDCP_ABONO + (NEW.egde_abono + NEW.egde_dtof),
                    SDCP_ABRTFTE = SDCP_ABRTFTE + NEW.egde_RTFTE,
                    SDCP_ABRTIVA = SDCP_ABRTIVA + NEW.egde_RTIVA,
                    SDCP_ABRTICA = SDCP_ABRTICA + NEW.egde_RTICA,
                    SDCP_TRM = :TRM
                WHERE SDCP_TIPOREF = NEW.EGDE_TIPODOC AND SDCP_IDREF = NEW.egde_IDDOC AND SDCP_FECHA = :FEC;
            END
        ELSE
            BEGIN
            /* Inserte un nuevo saldo diario */
            INSERT INTO SALDOS_DOC_CXPAGAR (SDCP_TIPOREF, SDCP_IDREF, SDCP_FECHA, TERC_NIT, SDCP_RTEFTE, SDCP_RTIVA, SDCP_RTICA, SDCP_ABONO, SDCP_ABRTFTE, SDCP_ABRTIVA, SDCP_ABRTICA, SDCP_DEBITO, SDCP_MONTO, SDCP_TRM)
                VALUES (NEW.EGDE_TIPODOC, NEW.EGDE_IDDOC, :FEC, :NIT, 0, 0, 0, (NEW.egde_abono+NEW.egde_dtof), NEW.egde_rtfte, NEW.egde_rtiva, NEW.egde_rtica, 'N', 0, :TRM);
            END
        END
    /* actualice el registro en mov_proveedor (por si son varios items) */
    EXISTE = 'N';
    SELECT 'S' FROM MOVIMIENTO_PROVEEDOR WHERE MVPR_TIPOREF = 62 AND MVPR_IDREF = NEW.EGRE_ID INTO :EXISTE;
    if (EXISTE = 'S') then
        begin
        UPDATE movimiento_proveedor
            SET MVPR_MONTO = MVPR_MONTO + (NEW.egde_abono + NEW.egde_dtof),
                MVPR_RTFTE = MVPR_RTFTE + NEW.egde_rtfte,
                MVPR_RTIVA = MVPR_RTIVA + NEW.egde_rtiva,
                MVPR_RTICA = MVPR_RTICA + NEW.egde_rtica,
                MVPR_TRM = :TRM
            WHERE MVPR_TIPOREF = 62 AND MVPR_IDREF = NEW.EGRE_ID;
        end
    ELSE
        INSERT INTO MOVIMIENTO_PROVEEDOR (MVPR_ID, TERC_NIT, MVPR_TIPOREF, MVPR_IDREF, MVPR_FECHA, MVPR_VENCE, MVPR_CONC, MVPR_MONTO, MVPR_RTFTE, MVPR_RTIVA, MVPR_RTICA, MVPR_DEBITO, MVPR_ABONO, MVPR_PREFIJO, MVPR_NUMERO, MVPR_TRM)
            VALUES (GEN_ID(ID_MOVPROV, 1), :NIT, 62, NEW.EGRE_ID, :FEC, :FEC, :CONCEPTO, (NEW.EGDE_ABONO+NEW.egde_dtof), NEW.EGDE_RTFTE, NEW.EGDE_RTIVA, NEW.EGDE_RTICA, 'N', 'S', :PREFIJO, :NUMERO, :TRM);
    END
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER TRIGGER EGRESOS_DETALLE_AU
AS
declare variable EXISTE CHAR(1);
declare variable FEC DATE;
declare variable NIT VARCHAR(20);
declare variable CONCEPTO VARCHAR(60);
declare variable PREFIJO VARCHAR(4);
declare variable NUMERO VARCHAR(6);
declare variable OK CHAR(1);
declare variable EGANTI INTEGER;
declare variable RETES CHAR(2);
declare variable SALDO NUMERIC(18,2);
declare variable TRM NUMERIC(18,2);
BEGIN
select PREF_PRE, EGRE_NUMERO, EGRE_FECHA, EGRE_CONC, TERC_NIT, EGRE_TRM from EGRESOS
    where egre_id = new.egre_id into :PREFIJO, :NUMERO, :FEC, :CONCEPTO, :NIT, :TRM;
if ((OLD.EGRE_ID <> 0) and (old.egde_anulado = 'N')) then
    BEGIN
    /* BORRE EL ANTICIPO SI FUE EL QUIEN LO CREO */
    OK = 'N';
    if (OLD.EGDE_TIPODOC = 55) then
        BEGIN
        SELECT EGRE_ID FROM ANTICIPOS_PROVEEDOR WHERE ANPR_ID = OLD.EGDE_IDDOC INTO :EGANTI;
        if (EGANTI = old.egre_id) then
            begin
            OK = 'S';
            UPDATE anticipos_proveedor SET ANPR_ANULADO = 'S' where ANPR_ID = OLD.EGDE_IDDOC;
            end
        END
    if (OK = 'N') then
        BEGIN
        EXISTE = 'N';
        select 'S' from saldos_doc_cxpagar where sdcp_tiporef = old.egde_tipodoc and
            sdcp_idref = old.egde_iddoc and sdcp_fecha = :FEC into :EXISTE;
        if (Existe = 'S') then
            begin
            /* Borre el viejo */
            if (old.EGRE_ID <> 0) then
                UPDATE saldos_doc_cxpagar
                    SET SDCP_ABONO = SDCP_ABONO - (old.egde_abono + OLD.egde_dtof),
                    SDCP_ABRTFTE = SDCP_ABRTFTE - old.egde_RTFTE,
                    SDCP_ABRTIVA = SDCP_ABRTIVA - old.egde_RTIVA,
                    SDCP_ABRTICA = SDCP_ABRTICA - old.egde_RTICA
                    WHERE SDCP_TIPOREF = OLD.EGDE_TIPODOC AND SDCP_IDREF = OLD.egde_IDDOC AND SDCP_FECHA = :FEC;
            end
        END
    EXISTE = 'N';
    SELECT 'S' FROM MOVIMIENTO_PROVEEDOR WHERE MVPR_TIPOREF = 62 AND MVPR_IDREF = OLD.EGRE_ID INTO :EXISTE;
    if (EXISTE = 'S') then
        begin
        /* Deshaga el viejo */
        UPDATE movimiento_proveedor
            SET MVPR_MONTO = MVPR_MONTO - (OLD.egde_abono + OLD.egde_dtof),
            MVPR_RTFTE = MVPR_RTFTE - OLD.egde_rtfte,
            MVPR_RTIVA = MVPR_RTIVA - OLD.egde_rtiva,
            MVPR_RTICA = MVPR_RTICA - OLD.egde_rtica
            WHERE MVPR_TIPOREF = 62 AND MVPR_IDREF = OLD.EGRE_ID;
        end
    END /* OLD.EGRE_ID <> 0 */
if ((NEW.EGRE_ID <> 0) and (NEW.egde_anulado = 'N')) then
    BEGIN
    /* valide que no se pase del saldo */
    execute procedure saldo_doc_cxpagar(new.egde_tipodoc, new.egde_iddoc, '9999/12/31', 0) returning_values(saldo);
    execute procedure lee_configuracion('CXPAGAR', 'SALDOS', 'DESCONTAR RETENCIONES POR CAUSACION') returning_values (RETES);
    if (SALDO < 0) then
        BEGIN
        if (RETES = 'SI') then
            begin
            if (saldo > NEW.egde_abono) then
                EXCEPTION DOCUMENTO_ABONO_MAYOR;
            end
        ELSE
            begin
            if (saldo > (NEW.egde_abono + NEW.egde_rtfte + NEW.egde_rtiva + NEW.egde_rtica + new.egde_dtof)) then
                EXCEPTION DOCUMENTO_ABONO_MAYOR;
            end
        END
    else
        BEGIN
        if (RETES = 'SI') then
            begin
            if (saldo < NEW.egde_abono) then
                EXCEPTION DOCUMENTO_ABONO_MAYOR;
            end
        ELSE
            begin
            if (saldo < (NEW.egde_abono + NEW.egde_rtfte + NEW.egde_rtiva + NEW.egde_rtica + NEW.egde_dtof)) then
                EXCEPTION DOCUMENTO_ABONO_MAYOR;
            end
        END
    /* AHORA REGISTRE LO NUEVO */
    OK = 'N';
    if (new.EGDE_TIPODOC = 55) then
        BEGIN
        /* BUSQUE SI TIENE EGRE_ID, SI NO LO ACTUALIZA */
        SELECT EGRE_ID FROM ANTICIPOS_PROVEEDOR WHERE ANPR_ID = NEW.EGDE_IDDOC INTO :EGANTI;
        if (EGANTI = 0) then
            BEGIN
            OK = 'S';
            UPDATE ANTICIPOS_PROVEEDOR SET EGRE_ID = NEW.EGRE_ID WHERE ANPR_ID = NEW.EGDE_IDDOC;
            END
        END
    if (OK = 'N') then
        BEGIN
        EXISTE = 'N';
        select 'S' from saldos_doc_cxpagar where sdcp_tiporef = new.egde_tipodoc and
            sdcp_idref = new.egde_iddoc and sdcp_fecha = :FEC into :EXISTE;
        if (Existe = 'S') then
            /* actualice el saldo del dia */
            UPDATE saldos_doc_cxpagar
                SET SDCP_ABONO = SDCP_ABONO + (NEW.egde_abono + NEW.egde_dtof),
                SDCP_ABRTFTE = SDCP_ABRTFTE + NEW.egde_RTFTE,
                SDCP_ABRTIVA = SDCP_ABRTIVA + NEW.egde_RTIVA,
                SDCP_ABRTICA = SDCP_ABRTICA + NEW.egde_RTICA,
                SDCP_TRM = :TRM
                WHERE SDCP_TIPOREF = NEW.EGDE_TIPODOC AND SDCP_IDREF = NEW.egde_IDDOC AND SDCP_FECHA = :FEC;
        else
            /* Inserte un nuevo saldo diario */
            INSERT INTO SALDOS_DOC_CXPAGAR (SDCP_TIPOREF, SDCP_IDREF, SDCP_FECHA, TERC_NIT, SDCP_RTEFTE, SDCP_RTIVA, SDCP_RTICA, SDCP_ABONO, SDCP_ABRTFTE, SDCP_ABRTIVA, SDCP_ABRTICA, SDCP_DEBITO, SDCP_MONTO, SDCP_TRM)
                VALUES (NEW.EGDE_TIPODOC, NEW.EGDE_IDDOC, :FEC, :NIT, 0, 0, 0, (NEW.egde_abono + NEW.egde_dtof), NEW.egde_rtfte, NEW.egde_rtiva, NEW.egde_rtica, 'N', 0, :TRM);
        END /* ok = n */
    /* Registre o actualice el registro en movimiento_proveedor */
    EXISTE = 'N';
    SELECT 'S' FROM MOVIMIENTO_PROVEEDOR WHERE MVPR_TIPOREF = 62 AND MVPR_IDREF = NEW.EGRE_ID INTO :EXISTE;
    if (EXISTE = 'S') then
        /* Actualice el nuevo */
        UPDATE movimiento_proveedor
            SET MVPR_MONTO = MVPR_MONTO + (NEW.egde_abono + NEW.egde_dtof),
                MVPR_RTFTE = MVPR_RTFTE + NEW.egde_rtfte,
                MVPR_RTIVA = MVPR_RTIVA + NEW.egde_rtiva,
                MVPR_RTICA = MVPR_RTICA + NEW.egde_rtica,
                MVPR_TRM = :TRM
            WHERE MVPR_TIPOREF = 62 AND MVPR_IDREF = NEW.EGRE_ID;
    ELSE
        INSERT INTO MOVIMIENTO_PROVEEDOR (MVPR_ID, TERC_NIT, MVPR_TIPOREF, MVPR_IDREF, MVPR_FECHA, MVPR_VENCE, MVPR_CONC, MVPR_MONTO, MVPR_RTFTE, MVPR_RTIVA, MVPR_RTICA, MVPR_DEBITO, MVPR_ABONO, MVPR_PREFIJO, MVPR_NUMERO, MVPR_TRM)
            VALUES (GEN_ID(ID_MOVPROV, 1), :NIT, 62, NEW.EGRE_ID, :FEC, :FEC, :CONCEPTO, (NEW.EGDE_ABONO + NEW.egde_dtof), NEW.EGDE_RTFTE, NEW.EGDE_RTIVA, NEW.EGDE_RTICA, 'N', 'S', :PREFIJO, :NUMERO, :TRM);
    end
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER TRIGGER RECIBOS_CAJA_CRUCEC_AI
AS
declare variable EXISTE CHAR(1);
declare variable FEC DATE;
declare variable NIT VARCHAR(20);
declare variable CONCEPTO VARCHAR(60);
declare variable PREFIJO VARCHAR(4);
declare variable NUMERO VARCHAR(6);
declare variable OK CHAR(1);
declare variable RETES CHAR(2);
declare variable SALDO NUMERIC(18,2);
declare variable TRM NUMERIC(18,2);
BEGIN
/* Abone el documento referenciado  */
select PREF_PRE, RECA_NUMERO, RECA_FECHA, RECA_CONC, TERC_NIT, RECA_TRM
    from RECIBOS_CAJA where RECA_ID = new.reca_id into :PREFIJO, :NUMERO, :FEC, :CONCEPTO, :NIT, :TRM;
if ((NEW.RECA_ID <> 0) and (new.rccr_anulado = 'N')) then
    BEGIN
    OK = 'N';
    /* valide que no se pase del saldo */
    execute procedure saldo_doc_cxpagar(new.rccr_tipodoc, new.rccr_iddoc, '9999/12/31', 0) returning_values(saldo);
    execute procedure lee_configuracion('CXPAGAR', 'SALDOS', 'DESCONTAR RETENCIONES POR CAUSACION') returning_values (RETES);
    if (SALDO < 0) then
        BEGIN
        if (RETES = 'SI') then
            begin
            if (saldo > NEW.rccr_abono) then
                EXCEPTION DOCUMENTO_ABONO_MAYOR;
            end
        ELSE
            begin
            if (saldo > (NEW.rccr_abono + NEW.rccr_rtfte + NEW.rccr_rtiva + NEW.rccr_rtica + new.rccr_dtof)) then
                EXCEPTION DOCUMENTO_ABONO_MAYOR;
            end
        END
    else
        BEGIN
        if (RETES = 'SI') then
            begin
            if (saldo < NEW.rccr_abono) then
                EXCEPTION DOCUMENTO_ABONO_MAYOR;
            end
        ELSE
            begin
            if (saldo < (NEW.rccr_abono + NEW.rccr_rtfte + NEW.rccr_rtiva + NEW.rccr_rtica + NEW.rccr_dtof)) then
                EXCEPTION DOCUMENTO_ABONO_MAYOR;
            end
        END
    if (OK = 'N') then
        BEGIN
        select 'S' from saldos_doc_cxpagar where sdcp_tiporef = new.rccr_tipodoc and
            sdcp_idref = new.rccr_iddoc and sdcp_fecha = :FEC into :EXISTE;
        if (Existe = 'S') then
            begin
            /* actualice el saldo del dia */
            UPDATE saldos_doc_cxpagar
                SET SDCP_ABONO = SDCP_ABONO + (NEW.rccr_abono + NEW.rccr_dtof),
                    SDCP_ABRTFTE = SDCP_ABRTFTE + NEW.rccr_rtfte,
                    SDCP_ABRTIVA = SDCP_ABRTIVA + NEW.rccr_rtiva,
                    SDCP_ABRTICA = SDCP_ABRTICA + NEW.rccr_rtica,
                    SDCP_TRM = :TRM
                WHERE SDCP_TIPOREF = NEW.rccr_tipodoc AND SDCP_IDREF = NEW.rccr_iddoc AND SDCP_FECHA = :FEC;
            END
        ELSE
            BEGIN
            /* Inserte un nuevo saldo diario */
            INSERT INTO SALDOS_DOC_CXPAGAR (SDCP_TIPOREF, SDCP_IDREF, SDCP_FECHA, TERC_NIT, SDCP_RTEFTE, SDCP_RTIVA, SDCP_RTICA, SDCP_ABONO, SDCP_ABRTFTE, SDCP_ABRTIVA, SDCP_ABRTICA, SDCP_DEBITO, SDCP_MONTO, SDCP_TRM)
                VALUES (NEW.rccr_tipodoc, NEW.rccr_iddoc, :FEC, :NIT, 0, 0, 0, (NEW.rccr_abono+NEW.rccr_dtof), NEW.rccr_rtfte, NEW.rccr_rtiva, NEW.rccr_rtica, 'N', 0, :TRM);
            END
        END
    /* actualice el registro en mov_proveedor (por si son varios items) */
    EXISTE = 'N';
    SELECT 'S' FROM MOVIMIENTO_PROVEEDOR WHERE MVPR_TIPOREF = 61 AND MVPR_IDREF = NEW.reca_id INTO :EXISTE;
    if (EXISTE = 'S') then
        begin
        UPDATE movimiento_proveedor
            SET MVPR_MONTO = MVPR_MONTO + (NEW.rccr_abono + NEW.rccr_dtof),
                MVPR_RTFTE = MVPR_RTFTE + NEW.rccr_rtfte,
                MVPR_RTIVA = MVPR_RTIVA + NEW.rccr_rtiva,
                MVPR_RTICA = MVPR_RTICA + NEW.rccr_rtica,
                MVPR_TRM = :TRM
            WHERE MVPR_TIPOREF = 61 AND MVPR_IDREF = NEW.reca_id;
        end
    ELSE
        INSERT INTO MOVIMIENTO_PROVEEDOR (MVPR_ID, TERC_NIT, MVPR_TIPOREF, MVPR_IDREF, MVPR_FECHA, MVPR_VENCE, MVPR_CONC, MVPR_MONTO, MVPR_RTFTE, MVPR_RTIVA, MVPR_RTICA, MVPR_DEBITO, MVPR_ABONO, MVPR_PREFIJO, MVPR_NUMERO, MVPR_TRM)
            VALUES (GEN_ID(ID_MOVPROV, 1), :NIT, 61, NEW.reca_id, :FEC, :FEC, :CONCEPTO, (NEW.rccr_abono+NEW.rccr_dtof), NEW.rccr_rtfte, NEW.rccr_rtiva, NEW.rccr_rtica, 'N', 'S', :PREFIJO, :NUMERO, :TRM);
    END
END
^

SET TERM ; ^


INSERT INTO CONFIGURACION (CONF_MODULO, CONF_CATEGORIA, CONF_PROPIEDAD, CONF_VALOR, CONF_POSIBLES, CONF_AYUDA) VALUES ('GENERAL', 'GENERAL', 'CUENTA DE GASTO POR DIFERENCIA EN CAMBIO PARA OPERACIONES EN OTRA MONEDA', '530525', '', 'Indique la cuenta contable donde se acumularán las diferencias en cambio por transacciones en otra moneda');
INSERT INTO CONFIGURACION (CONF_MODULO, CONF_CATEGORIA, CONF_PROPIEDAD, CONF_VALOR, CONF_POSIBLES, CONF_AYUDA) VALUES ('GENERAL', 'GENERAL', 'CUENTA DE INGRESO POR DIFERENCIA EN CAMBIO PARA OPERACIONES EN OTRA MONEDA', '421020', '', 'Indique la cuenta contable donde se acumularán las diferencias en cambio por transacciones en otra moneda');
COMMIT WORK;

SET TERM ^ ;

CREATE OR ALTER PROCEDURE CONTABIL_RECICAJA(
    IDDOC INTEGER,
    IDINTER INTEGER)
RETURNS (
    ERROR INTEGER,
    VER CHAR(1),
    IDC INTEGER)
AS
declare variable PREF VARCHAR(4);
declare variable NUM VARCHAR(6);
declare variable FECAUX DATE;
declare variable FECHA CHAR(8);
declare variable CONC CHAR(120);
declare variable VRDTO NUMERIC(18, 2);
declare variable VRRTFTE NUMERIC(18, 2);
declare variable VRRTIVA NUMERIC(18, 2);
declare variable VRRTICA NUMERIC(18, 2);
declare variable VRTOTAL NUMERIC(18, 2);
declare variable TIPOCOMP VARCHAR(3);
declare variable PREFCONT VARCHAR(4);
declare variable BASE CHAR(1);
declare variable CTABASE VARCHAR(20);
declare variable CAJA CHAR(1);
declare variable CTACAJA VARCHAR(20);
declare variable RTFTE CHAR(1);
declare variable CTARTFTE VARCHAR(20);
declare variable RTIVA CHAR(1);
declare variable CTARTIVA VARCHAR(20);
declare variable RTICA CHAR(1);
declare variable CTARTICA VARCHAR(20);
declare variable DTO CHAR(1);
declare variable CTADTO VARCHAR(20);
declare variable EXISTE CHAR(1);
declare variable CUENTA VARCHAR(20);
declare variable MONTO NUMERIC(18,2);
declare variable ES_RETENCION CHAR(1);
declare variable TIPOCUEN CHAR(1);
declare variable NIT VARCHAR(20);
declare variable PROY VARCHAR(4);
declare variable CENTRO VARCHAR(4);
declare variable DEBITO NUMERIC(18,2);
declare variable CREDITO NUMERIC(18,2);
declare variable NROI INTEGER;
declare variable SUMA NUMERIC(18,2);
declare variable TCTACLIEN VARCHAR(20);
declare variable TCTARTFTE VARCHAR(20);
declare variable TCTARTIVA VARCHAR(20);
declare variable TCTARTICA VARCHAR(20);
declare variable TIPOIT INTEGER;
declare variable PREFIT VARCHAR(4);
declare variable NUMIT VARCHAR(6);
declare variable NUMEROIT VARCHAR(10);
declare variable ABONOIT NUMERIC(18,2);
declare variable CTADIC VARCHAR(20);
declare variable BASEADIC VARCHAR(20);
declare variable PORCADIC NUMERIC(5,2);
declare variable VALORADIC NUMERIC(18,2);
declare variable DBADIC CHAR(1);
declare variable ANULADO CHAR(1);
declare variable VRBASE NUMERIC(18,2);
declare variable PORC numeric(9,2);
declare variable OK INTEGER;
declare variable CRUCES NUMERIC(18,2);
declare variable VRCAJA NUMERIC(18,2);
declare variable DIFCAMBIO NUMERIC(18,2);
declare variable CTADIF VARCHAR(20);
BEGIN
ERROR = 0;
/* BUSQUE LA INTERFACE */
EXISTE = 'N';
SELECT 'S', TICO_COD, PRCO_PRE, INCJ_BASE, INCJ_DTOPP, INCJ_RTFTE, INCJ_RTIVA, INCJ_RTICA, INCJ_CAJA, INCJ_CTABASE, INCJ_CTADTO, INCJ_CTARTFTE, INCJ_CTARTIVA, INCJ_CTARTICA, INCJ_CTACAJA, INCJ_CONFIRMAR
    FROM INTERFAZ_CAJA
    WHERE INCJ_ID = :IDINTER
    INTO :EXISTE, :TIPOCOMP, :PREFCONT, :BASE, :DTO, :RTFTE, :RTIVA, :RTICA, :CAJA, :CTABASE, :CTADTO, :CTARTFTE, :CTARTIVA, :CTARTICA, :CTACAJA, :VER;
if (EXISTE = 'S') then
  BEGIN
  /* BORRE LA CONTABILIZACION ANTERIOR */
  OK = 0;
  FOR SELECT CNTB_ID FROM CONTABILIZACION WHERE CNTB_TIPOREF = 61 AND CNTB_IDREF = :IDDOC INTO :OK DO
    BEGIN
    DELETE FROM CONTABILIZACION_DET WHERE CNTB_ID = :OK;
    DELETE FROM CONTABILIZACION WHERE CNTB_ID = :OK;
    END
  /* TRAIGA EL ENCABEZADO DEL RECIBO */
  SELECT PREF_PRE, RECA_NUMERO, RECA_FECHA, R.TERC_NIT, RECA_CONC, RECA_DTOF, RECA_MONTO, RECA_RTFTEMONTO, RECA_RTIVAMONTO, RECA_RTICAMONTO, TERC_CTARTFTE, TERC_CTARTIVA, TERC_CTARTICA, TERC_CTACLIENTE, RECA_ANULADO
    FROM RECIBOS_CAJA R, TERCEROS T
    WHERE RECA_ID = :IDDOC AND R.TERC_NIT = T.TERC_NIT
    INTO :PREF, :NUM, :FECAUX, :NIT, :CONC, :VRDTO, :VRTOTAL, :VRRTFTE, :VRRTIVA, :VRRTICA, :TCTARTFTE, TCTARTIVA, TCTARTICA, TCTACLIEN, :ANULADO;
  if (ANULADO = 'N') then
    BEGIN
    SELECT PREF_CENTRO, PREF_PROY FROM PREFIJOS
        WHERE PREF_PRE = :PREF AND TIDO_COD = 61 INTO :CENTRO, :PROY;
    EXECUTE PROCEDURE FECHA_A_CONTA(:FECAUX) returning_values (:FECHA);
    /* REGISTRE EL ENCABEZADO CONTABLE */
    IDC = GEN_ID(ID_CONTABILIZA, 1);
    INSERT INTO CONTABILIZACION (CNTB_ID, CNTB_TIPOCOMP, CNTB_PREFCNT, CNTB_NUMERO, CNTB_FECHA, CNTB_CONCEPTO, CNTB_REF, CNTB_TIPOREF, CNTB_IDREF, CNTB_PREFREF, CNTB_NUMREF, CNTB_PROCESADO)
        VALUES (:IDC, :TIPOCOMP, :PREFCONT, :NUM, :FECHA, :CONC, '', 61, :IDDOC, :PREF, :NUM, 'N');
    NROI = 0;
    SUMA = 0;
    /* SUME LOS CRUCES PARA LLEVARLOS A LA CUENTA X PAGAR Y RESTAR DE LA CAJA */
    SELECT SUM(RCCR_ABONO) FROM RECIBOS_CAJA_CRUCEC WHERE RECA_ID = :iddoc INTO :CRUCES;
    if (CRUCES IS NULL) then
        CRUCES = 0;
    VRCAJA = VRTOTAL - CRUCES;
    IF ((CAJA = 'K')) THEN
        BEGIN
        if (VRCAJA <> 0) then
            BEGIN
            CUENTA = NULL;
            EXECUTE PROCEDURE VALIDE_CUENTA_C (CTACAJA) RETURNING_VALUES (:OK);
            IF (OK = 0) THEN
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :CTACAJA INTO :CUENTA, :TIPOCUEN;
            ELSE
                begin
                EXECUTE PROCEDURE ERROR (61, :IDDOC, :CTACAJA, 2);
                CUENTA = CTACAJA;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERROR (61, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                EXECUTE PROCEDURE ERROR (61, :IDDOC, :CUENTA, 4);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                IF (VRCAJA > 0) THEN
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRCAJA, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    SUMA = SUMA + VRCAJA;
                    END
                ELSE   
                    BEGIN                     
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                       VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, ABS(:VRCAJA), 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    SUMA = SUMA + VRCAJA;
                    END
                NROI = NROI + 1;
                END
            END /* VRCAJA <> 0 */
        END /* CAJA CONSTANTE */
    IF ((CAJA = 'F')) THEN
        BEGIN
        /* AGRUPE LAS CUENTAS DE LAS FORMAS DE PAGO */
        FOR SELECT MAX(FOPA_CTACONTA), SUM(RCPA_MONTO)
            FROM formas_pago F, recibos_caja_pago R
            WHERE R.RECA_ID = :IDDOC AND R.FOPA_ID = F.FOPA_ID
            GROUP BY FOPA_CTACONTA
            INTO :CTACAJA, :MONTO
        DO
            BEGIN
            if (MONTO <> 0) then
                BEGIN
                CUENTA = NULL;
                EXECUTE PROCEDURE VALIDE_CUENTA_C (CTACAJA) RETURNING_VALUES (:OK);
                IF (OK = 0) THEN
                    SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                        WHERE CUEN_COD = :CTACAJA INTO :CUENTA, :TIPOCUEN;
                ELSE
                    begin
                    EXECUTE PROCEDURE ERROR (61, :IDDOC, :CTACAJA, 2);
                    CUENTA = CTACAJA;
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (61, :IDDOC, :CUENTA, 3);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (61, :IDDOC, :CUENTA, 4);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    IF (MONTO > 0) THEN
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        SUMA = SUMA + MONTO;
                        END
                    ELSE
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, abs(:MONTO), 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        SUMA = SUMA + MONTO;
                        END
                    NROI = NROI + 1;
                    END
                END /* MONTO <> 0 */
            END /* DO FORMA_PAGO */
        END /* CAJA = F */
    if (DTO = 'K') then /* DTO EN CTA CONSTANTE */
        BEGIN
        if (VRDTO <> 0) then
            BEGIN
            CUENTA = NULL;
            EXECUTE PROCEDURE VALIDE_CUENTA_C (CTADTO) RETURNING_VALUES (:OK);
            IF (OK = 0) THEN
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :CTADTO INTO :CUENTA, :TIPOCUEN;
            ELSE
                begin
                EXECUTE PROCEDURE ERROR (61, :IDDOC, :CTADTO, 2);
                CUENTA = CTADTO;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERROR (61, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                EXECUTE PROCEDURE ERROR (61, :IDDOC, :CUENTA, 4);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRDTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA + VRDTO;
                END
            END /* VRDTO <> 0 */
        END /* DTO EN CTA CONSTANTE */

    /* LA DIFERENCIA EN CAMBIO */
    SELECT SUM(RCDE_DIFCAMBIO) FROM recibos_caja_detalle WHERE RECA_ID = :iddoc INTO :DIFCAMBIO;
    IF ((DIFCAMBIO IS NOT NULL) AND (DIFCAMBIO <> 0)) THEN
        BEGIN
        if (DIFCAMBIO > 0) then
            execute procedure lee_configuracion('GENERAL','GENERAL','CUENTA DE INGRESO POR DIFERENCIA EN CAMBIO PARA OPERACIONES EN OTRA MONEDA') returning_values (:ctadif);
        else
            execute procedure lee_configuracion('GENERAL','GENERAL','CUENTA DE GASTO POR DIFERENCIA EN CAMBIO PARA OPERACIONES EN OTRA MONEDA') returning_values (:ctadif);
        CUENTA = NULL;
        EXECUTE PROCEDURE VALIDE_CUENTA_C (ctadif) RETURNING_VALUES (:OK);
        IF (OK = 0) THEN
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :ctadif INTO :CUENTA, :TIPOCUEN;
        ELSE
            begin
            EXECUTE PROCEDURE ERROR (61, :IDDOC, :ctadif, 2);
            CUENTA = ctadif;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERROR (61, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERROR (61, :IDDOC, :CUENTA, 4);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            if (DIFCAMBIO > 0) then
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :difcambio, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            else
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', ABS(:difcambio), 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA - difcambio;
            END
        END
    /* RETENCION FUENTE */
    if ((RTFTE = 'T') or (RTFTE = 'K')) then
      if (VRRTFTE <> 0) then
        BEGIN
        if (RTFTE = 'T') then
            CTARTFTE = TCTARTFTE;
        CUENTA = NULL;
        EXECUTE PROCEDURE VALIDE_CUENTA_C (CTARTFTE) RETURNING_VALUES (:OK);
        IF (OK = 0) THEN
            SELECT CUEN_COD, CUEN_RETENCION, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTARTFTE INTO :CUENTA, :ES_RETENCION, :TIPOCUEN;
        ELSE
            begin
            EXECUTE PROCEDURE ERROR (61, :IDDOC, :CTARTFTE, 2);
            CUENTA = CTARTFTE;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERROR (61, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERROR (61, :IDDOC, :CUENTA, 4);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            if (ES_RETENCION = 'S') then
                BEGIN
                VRBASE = VRTOTAL + VRDTO + vrrtfte + vrrtiva + vrrtica;
                SELECT CLIE_rtefte from clientes where terc_nit = :NIT INTO :PORC;
                END
            ELSE
                BEGIN
                VRBASE = 0;
                PORC = 0;
                END
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :VRBASE, :PORC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTFTE;
            END
        END /* RTFTE */
    /* RETENCION IVA */
    if ((RTIVA = 'T') or (RTIVA = 'K')) then
      if (VRRTIVA <> 0) then
        BEGIN
        if (RTIVA = 'T') then
            CTARTIVA = TCTARTIVA;
        CUENTA = NULL;
        EXECUTE PROCEDURE VALIDE_CUENTA_C (CTARTIVA) RETURNING_VALUES (:OK);
        IF (OK = 0) THEN
            SELECT CUEN_COD, CUEN_RETENCION, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTARTIVA INTO :CUENTA, :ES_RETENCION, :TIPOCUEN;
        ELSE
            begin
            EXECUTE PROCEDURE ERROR (61, :IDDOC, :CTARTIVA, 2);
            CUENTA = CTARTIVA;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERROR (61, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERROR (61, :IDDOC, :CUENTA, 4);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            if (ES_RETENCION = 'S') then
                BEGIN
                VRBASE = VRTOTAL + VRDTO + vrrtfte + vrrtiva + vrrtica;
                SELECT CLIE_RTEIVA from clientes where terc_nit = :NIT INTO :PORC;
                END
            ELSE
                BEGIN
                VRBASE = 0;
                PORC = 0;
                END
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTIVA, 0, :VRBASE, :PORC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTIVA;
            END
        END /* RTIVA */
    /* RETENCION DE ICA */
    if ((RTICA = 'T') or (RTICA = 'K')) then
      if (VRRTICA <> 0) then
        BEGIN
        if (RTICA = 'T') then
            CTARTICA = TCTARTICA;
        CUENTA = NULL;
        EXECUTE PROCEDURE VALIDE_CUENTA_C (CTARTICA) RETURNING_VALUES (:OK);
        IF (OK = 0) THEN
            SELECT CUEN_COD, CUEN_RETENCION, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTARTICA INTO :CUENTA, :ES_RETENCION, :TIPOCUEN;
        ELSE
            begin
            EXECUTE PROCEDURE ERROR (61, :IDDOC, :CTARTICA, 2);
            CUENTA = CTARTICA;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERROR (61, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERROR (61, :IDDOC, :CUENTA, 4);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            if (ES_RETENCION = 'S') then
                BEGIN
                VRBASE = VRTOTAL + VRDTO + vrrtfte + vrrtiva + vrrtica;
                SELECT CLIE_RTEICA from clientes where terc_nit = :NIT INTO :PORC;
                END
            ELSE
                BEGIN
                VRBASE = 0;
                PORC = 0;
                END
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTICA, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTICA;
            END
        END /* RTICA */
    /* CRUCES CON CXP */
    if (CRUCES <> 0) then
        BEGIN
        SELECT PROV_CARTERA FROM PROVEEDORES WHERE TERC_NIT = :nit INTO :ctabase;
        if (CTABASE IS NULL) then
            ctabase = tctaclien;
        CUENTA = NULL;
        EXECUTE PROCEDURE VALIDE_CUENTA_C (CTABASE) RETURNING_VALUES (:OK);
        IF (OK = 0) THEN
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTABASE INTO :CUENTA, :TIPOCUEN;
        ELSE
            begin
            EXECUTE PROCEDURE ERROR (61, :IDDOC, :CTABASE, 2);
            CUENTA = CTABASE;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERROR (61, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            /* DEBERIA RECORRER DOCUMENTO POR DOCUMENTO */
            FOR SELECT RCCR_TIPODOC, RCCR_PREFIJO, RCCR_NUMERO, RCCR_ABONO+RCCR_RTFTE+RCCR_RTIVA+RCCR_RTICA+RCCR_DTOF
                FROM recibos_caja_crucec WHERE RECA_ID = :IDDOC
                INTO :TIPOIT, PREFIT, NUMIT, ABONOIT
                DO
                BEGIN
                NUMEROIT = PREFIT || NUMIT;
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :ABONOIT, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, :NUMEROIT, NULL, NULL, :TIPOIT, 0);
                SUMA = SUMA + ABONOIT;
                NROI = NROI + 1;
                END
            END
        if (TIPOCUEN = 'N') then
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :CRUCES, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
        SUMA = SUMA + CRUCES;
        NROI = NROI - 1;

        /* LA DIFERENCIA EN CAMBIO */
        SELECT SUM(RCCR_DIFCAMBIO) FROM recibos_caja_crucec WHERE RECA_ID = :iddoc INTO :DIFCAMBIO;
        IF ((DIFCAMBIO IS NOT NULL) AND (DIFCAMBIO <> 0)) THEN
            BEGIN
            if (DIFCAMBIO > 0) then
                execute procedure lee_configuracion('GENERAL','GENERAL','CUENTA DE GASTO POR DIFERENCIA EN CAMBIO PARA OPERACIONES EN OTRA MONEDA') returning_values (:ctadif);
            else
                execute procedure lee_configuracion('GENERAL','GENERAL','CUENTA DE INGRESO POR DIFERENCIA EN CAMBIO PARA OPERACIONES EN OTRA MONEDA') returning_values (:ctadif);
            CUENTA = NULL;
            EXECUTE PROCEDURE VALIDE_CUENTA_C (ctadif) RETURNING_VALUES (:OK);
            IF (OK = 0) THEN
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :ctadif INTO :CUENTA, :TIPOCUEN;
            ELSE
                begin
                EXECUTE PROCEDURE ERROR (61, :IDDOC, :ctadif, 2);
                CUENTA = ctadif;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERROR (61, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                EXECUTE PROCEDURE ERROR (61, :IDDOC, :CUENTA, 4);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                if (DIFCAMBIO > 0) then
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :difcambio, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                else
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, ABS(:difcambio), 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA + difcambio;
                END
            END
        END /* cruces */
    /* CIERRE EL COMPROBANTE CONTRA LA CUENTA DEL TERCERO O LA BASE CONSTANTE */
    if ((SUMA <> 0) and ((BASE = 'T') or (BASE = 'K'))) then
        BEGIN
        if (SUMA < 0) then
            BEGIN
            DEBITO = SUMA * -1;
            CREDITO = 0;
            END
        ELSE
            BEGIN
            DEBITO = 0;
            CREDITO = SUMA;
            END
        if (BASE = 'T') then
            CTABASE = TCTACLIEN;
        CUENTA = NULL;
        EXECUTE PROCEDURE VALIDE_CUENTA_C (CTABASE) RETURNING_VALUES (:OK);
        IF (OK = 0) THEN
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTABASE INTO :CUENTA, :TIPOCUEN;
        ELSE
            begin
            EXECUTE PROCEDURE ERROR (61, :IDDOC, :CTABASE, 2);
            CUENTA = CTABASE;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERROR (61, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            /* DEBERIA RECORRER DOCUMENTO POR DOCUMENTO */
            FOR SELECT RCDE_TIPODOC, RCDE_PREFIJO, RCDE_NUMERO, RCDE_ABONO+RCDE_RTFTE+RCDE_RTIVA+RCDE_RTICA+RCDE_DTOF
                FROM RECIBOS_CAJA_DETALLE WHERE RECA_ID = :IDDOC
                INTO :TIPOIT, PREFIT, NUMIT, ABONOIT
                DO
                BEGIN
                NUMEROIT = PREFIT || NUMIT;
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :ABONOIT, 0, 0, :NIT, :PROY, :CENTRO, NULL, :NUMEROIT, NULL, NULL, :TIPOIT, 0);
                NROI = NROI + 1;
                END
            END
        if (TIPOCUEN = 'N') then
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :DEBITO, :CREDITO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
        NROI = NROI + 1;
        END /* SUMA EN CARTERA */
    /* recorra las cuentas adicionales */
    FOR SELECT INJC_CUENTA, INJC_BASE, INJC_PORC, INJC_VALOR, INJC_DB
        FROM INTERFAZ_CAJA_CTAS
        WHERE INCJ_ID = :IDINTER
        INTO :CTADIC, :BASEADIC, :PORCADIC, :VALORADIC, :DBADIC
        DO
        BEGIN
        if (:BASEADIC = 'TOTAL') then
            VALORADIC = VRTOTAL;
        if (:BASEADIC = 'DESCUENTO') then
            VALORADIC = VRDTO;
        if (:BASEADIC = 'RTFTE') then
            VALORADIC = VRRTFTE;
        if (:BASEADIC = 'RTIVA') then
            VALORADIC = VRRTIVA;
        if (:BASEADIC = 'RTICA') then
            VALORADIC = VRRTICA;
        MONTO = VALORADIC * PORCADIC;
        CUENTA = NULL;
        EXECUTE PROCEDURE VALIDE_CUENTA_C (CTADIC) RETURNING_VALUES (:OK);
        IF (OK = 0) THEN
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTADIC INTO :CUENTA, :TIPOCUEN;
        ELSE
            begin
            EXECUTE PROCEDURE ERROR (61, :IDDOC, :CTADIC, 2);
            CUENTA = CTADIC;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERROR (61, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERROR (61, :IDDOC, :CUENTA, 4);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            if (DBADIC = 'S') then
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTADIC, :CONC, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            ELSE
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTADIC, :CONC, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            END
        NROI = NROI + 1;
        END
    if (ERROR > 0) then
        VER = 'S';
    SUSPEND;
    END /* NO ANULADO */
  END /* EXISTE LA INTERFAZ */
ELSE
    BEGIN
    EXECUTE PROCEDURE ERROR (61, :IDDOC, :PREF, 1);
    ERROR = ERROR + 1;
    VER = 'S';
    SUSPEND;
    END
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE RECIBOS_SIN_CONTABILIDAD(
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    ID INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    ESTADO VARCHAR(20),
    IDI INTEGER,
    IDC INTEGER,
    ERROR INTEGER)
AS
DECLARE VARIABLE VER CHAR(2);
declare variable FECICNT VARCHAR(10);
declare variable FECFCNT VARCHAR(10);
declare variable idref INTEGER;
BEGIN /*$$IBE$$ 
EXECUTE PROCEDURE fecha_a_conta(FECINI) returning_values (FECICNT);
EXECUTE PROCEDURE fecha_a_conta(FECFIN) returning_values (FECFCNT);
FOR SELECT RECA_ID, PREF_PRE, RECA_NUMERO FROM RECIBOS_CAJA WHERE RECA_ANULADO = 'N' AND
    RECA_FECHA >= :FECINI AND RECA_FECHA <= :FECFIN and PREF_PRE NOT IN (SELECT AUTO_PREFRDC FROM AUTORIZACIONES) ORDER BY RECA_ID
    INTO :ID, :PREF, :NUMERO
DO
  BEGIN
  idref = null;
  SELECT ENCO_IDREF FROM COMPROBANTE_ENCABEZADO WHERE ENCO_TIPOREF = 61 AND ENCO_FECHA >= :FECICNT AND ENCO_FECHA <= :FECFCNT and ENCO_IDREF = :id into :idref;
  if (idref IS NULL) then
  begin
   ESTADO = 'PROCESANDO';
   SUSPEND;
   SELECT MAX(INCJ_ID) FROM INTERFAZ_CAJA WHERE PREF_PRE = :PREF AND TIDO_COD = 61 INTO :IDI;
   EXECUTE PROCEDURE CONTABIL_RECICAJA (:ID, :IDI) RETURNING_VALUES (:ERROR, :VER, :IDC);
   if (ERROR = 0) then
    BEGIN
    EXECUTE PROCEDURE CONTABILIZA_PENDIENTE (:IDC);
    ESTADO = 'OK';
    END
   ELSE
    ESTADO = 'ERROR';
   suspend;
  end
  END
 $$IBE$$*/ SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE RECIBOS_SIN_CONTABILIDAD(
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    ID INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    ESTADO VARCHAR(20),
    IDI INTEGER,
    IDC INTEGER,
    ERROR INTEGER)
AS
DECLARE VARIABLE VER CHAR(2);
declare variable FECICNT VARCHAR(10);
declare variable FECFCNT VARCHAR(10);
declare variable idref INTEGER;
BEGIN
EXECUTE PROCEDURE fecha_a_conta(FECINI) returning_values (FECICNT);
EXECUTE PROCEDURE fecha_a_conta(FECFIN) returning_values (FECFCNT);
FOR SELECT RECA_ID, PREF_PRE, RECA_NUMERO FROM RECIBOS_CAJA WHERE RECA_ANULADO = 'N' AND
    RECA_FECHA >= :FECINI AND RECA_FECHA <= :FECFIN and PREF_PRE NOT IN (SELECT AUTO_PREFRDC FROM AUTORIZACIONES) ORDER BY RECA_ID
    INTO :ID, :PREF, :NUMERO
DO
  BEGIN
  idref = null;
  SELECT ENCO_IDREF FROM COMPROBANTE_ENCABEZADO WHERE ENCO_TIPOREF = 61 AND ENCO_FECHA >= :FECICNT AND ENCO_FECHA <= :FECFCNT and ENCO_IDREF = :id into :idref;
  if (idref IS NULL) then
  begin
   ESTADO = 'PROCESANDO';
   SUSPEND;
   SELECT MAX(INCJ_ID) FROM INTERFAZ_CAJA WHERE PREF_PRE = :PREF AND TIDO_COD = 61 INTO :IDI;
   EXECUTE PROCEDURE CONTABIL_RECICAJA (:ID, :IDI) RETURNING_VALUES (:ERROR, :VER, :IDC);
   if (ERROR = 0) then
    BEGIN
    EXECUTE PROCEDURE CONTABILIZA_PENDIENTE (:IDC);
    ESTADO = 'OK';
    END
   ELSE
    ESTADO = 'ERROR';
   suspend;
  end
  END
END

^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER PROCEDURE CONTABIL_EGRESO(
    IDDOC INTEGER,
    IDINTER INTEGER)
RETURNS (
    ERROR INTEGER,
    VER CHAR(1),
    IDC INTEGER)
AS
declare variable PREF VARCHAR(4);
declare variable NUM VARCHAR(6);
declare variable FECAUX DATE;
declare variable FECHA CHAR(8);
declare variable CONC CHAR(120);
declare variable VRDTO NUMERIC(18, 2);
declare variable VRRTFTE NUMERIC(18, 2);
declare variable VRRTIVA NUMERIC(18, 2);
declare variable VRRTICA NUMERIC(18, 2);
declare variable VRTOTAL NUMERIC(18, 2);
declare variable TIPOCOMP VARCHAR(3);
declare variable PREFCONT VARCHAR(4);
declare variable BASE CHAR(1);
declare variable CTABASE VARCHAR(20);
declare variable CAJA CHAR(1);
declare variable CTACAJA VARCHAR(20);
declare variable RTFTE CHAR(1);
declare variable CTARTFTE VARCHAR(20);
declare variable RTIVA CHAR(1);
declare variable CTARTIVA VARCHAR(20);
declare variable RTICA CHAR(1);
declare variable CTARTICA VARCHAR(20);
declare variable DTO CHAR(1);
declare variable CTADTO VARCHAR(20);
declare variable EXISTE CHAR(1);
declare variable CUENTA VARCHAR(20);
declare variable MONTO NUMERIC(18,2);
declare variable ES_RETENCION CHAR(1);
declare variable TIPOCUEN CHAR(1);
declare variable NIT VARCHAR(20);
declare variable PROY VARCHAR(4);
declare variable CENTRO VARCHAR(4);
declare variable MONTOBASE NUMERIC(18,2);
declare variable PORC NUMERIC(9,2);
declare variable DEBITO NUMERIC(18,2);
declare variable CREDITO NUMERIC(18,2);
declare variable NROI INTEGER;
declare variable SUMA NUMERIC(18,2);
declare variable TCTACLIEN VARCHAR(20);
declare variable TCTARTFTE VARCHAR(20);
declare variable TCTARTIVA VARCHAR(20);
declare variable TCTARTICA VARCHAR(20);
declare variable TIPOIT INTEGER;
declare variable PREFIT VARCHAR(4);
declare variable NUMIT VARCHAR(6);
declare variable NUMEROIT VARCHAR(10);
declare variable ABONOIT NUMERIC(18,2);
declare variable CTADIC VARCHAR(20);
declare variable BASEADIC VARCHAR(20);
declare variable PORCADIC NUMERIC(5,2);
declare variable VALORADIC NUMERIC(18,2);
declare variable DBADIC CHAR(1);
declare variable VRBASE NUMERIC(18,2);
declare variable GMF CHAR(1);
declare variable CODBCO INTEGER;
declare variable NUMCHEQ VARCHAR(20);
declare variable CRUCES NUMERIC(18,2);
declare variable VRCAJA NUMERIC(18,2);
declare variable OK INTEGER;
declare variable DIFCAMBIO NUMERIC(18,2);
declare variable CTADIF VARCHAR(20);
BEGIN
/* BUSQUE LA INTERFACE */
EXISTE = 'N';
SELECT 'S', TICO_COD, PRCO_PRE, INCJ_BASE, INCJ_DTOPP, INCJ_RTFTE, INCJ_RTIVA, INCJ_RTICA, INCJ_CAJA, INCJ_CTABASE, INCJ_CTADTO, INCJ_CTARTFTE, INCJ_CTARTIVA, INCJ_CTARTICA, INCJ_CTACAJA, INCJ_CONFIRMAR
    FROM INTERFAZ_CAJA
    WHERE INCJ_ID = :IDINTER
    INTO :EXISTE, :TIPOCOMP, :PREFCONT, :BASE, :DTO, :RTFTE, :RTIVA, :RTICA, :CAJA, :CTABASE, :CTADTO, :CTARTFTE, :CTARTIVA, :CTARTICA, :CTACAJA, :VER;
if (EXISTE = 'S') then
    BEGIN
    OK = 0;
    FOR SELECT CNTB_ID FROM CONTABILIZACION WHERE CNTB_TIPOREF = 62 AND CNTB_IDREF = :IDDOC INTO :OK DO
        BEGIN
        DELETE FROM CONTABILIZACION_DET WHERE CNTB_ID = :OK;
        DELETE FROM CONTABILIZACION WHERE CNTB_ID = :OK;
        END

    /* TRAIGA EL ENCABEZADO DEL EGRESO */
    SELECT PREF_PRE, EGRE_NUMERO, EGRE_FECHA, E.TERC_NIT, EGRE_CONC, EGRE_DTOF, EGRE_MONTO, EGRE_RTFTEMONTO, EGRE_RTIVAMONTO, EGRE_RTICAMONTO, TERC_CTARTFTE, TERC_CTARTIVA, TERC_CTARTICA, TERC_CTACLIENTE
        FROM EGRESOS E, TERCEROS T
        WHERE EGRE_ID = :IDDOC AND E.TERC_NIT = T.TERC_NIT
        INTO :PREF, :NUM, :FECAUX, :NIT, :CONC, :VRDTO, :VRTOTAL, :VRRTFTE, :VRRTIVA, :VRRTICA, :TCTARTFTE, TCTARTIVA, TCTARTICA, TCTACLIEN;
    /* SI ES PROVEEDOR, SOBREESCIBE LAS CUENTAS  */
    SELECT PROV_CTAPAGAR, PROV_CTARTFTE, PROV_CTARTIVA, PROV_CTARTICA
        FROM PROVEEDORES WHERE TERC_NIT = :NIT
        INTO TCTACLIEN, TCTARTFTE, TCTARTIVA, TCTARTICA;
    SELECT PREF_CENTRO, PREF_PROY FROM PREFIJOS
        WHERE PREF_PRE = :PREF AND TIDO_COD = 62 INTO :CENTRO, :PROY;
    EXECUTE PROCEDURE FECHA_A_CONTA(:FECAUX) returning_values (:FECHA);
    /* REGISTRE EL ENCABEZADO CONTABLE */
    IDC = GEN_ID(ID_CONTABILIZA, 1);
    INSERT INTO CONTABILIZACION (CNTB_ID, CNTB_TIPOCOMP, CNTB_PREFCNT, CNTB_NUMERO, CNTB_FECHA, CNTB_CONCEPTO, CNTB_REF, CNTB_TIPOREF, CNTB_IDREF, CNTB_PREFREF, CNTB_NUMREF, CNTB_PROCESADO)
        VALUES (:IDC, :TIPOCOMP, :PREFCONT, :NUM, :FECHA, :CONC, '', 62, :IDDOC, :PREF, :NUM, 'N');
    /* SUME LOS CRUCES PARA LLEVARLOS A LA CUENTA X PAGAR Y RESTAR DE LA CAJA */
    SELECT SUM(EGCC_ABONO) FROM EGRESOS_CRUCEC WHERE EGRE_ID = :iddoc INTO :CRUCES;
    if (CRUCES IS NULL) then
        CRUCES = 0;
    VRCAJA = VRTOTAL - CRUCES;
    NROI = 0;
    SUMA = 0;
    ERROR = 0;
    /* EL CREDITO EN LA CAJA O EL BANCO */
    IF ((CAJA = 'K')) THEN
        BEGIN
        if (VRCAJA <> 0) then
            BEGIN
            CUENTA = NULL;
            EXECUTE PROCEDURE VALIDE_CUENTA_C (CTACAJA) RETURNING_VALUES (:OK);
            IF (OK = 0) THEN
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :CTACAJA INTO :CUENTA, :TIPOCUEN;
            ELSE
                begin
                EXECUTE PROCEDURE ERROR (62, :IDDOC, :CTACAJA, 2);
                CUENTA = CTACAJA;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 4);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRCAJA, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - VRTOTAL;
                END
            END /* VRCAJA <> 0 */
        END /* CAJA CONSTANTE */
    IF ((CAJA = 'F')) THEN
        BEGIN
        /* mueva la cuenta de la caja o el banco o ambas */
        /* PRIMERO LA CAJA */
        FOR SELECT CAJA_CUENTA, EGCA_MONTO FROM EGRESOS_CAJA E, CAJAS C
            WHERE C.CAJA_ID = E.CAJA_ID AND EGRE_ID = :IDDOC
            INTO :CTACAJA, :MONTO
            DO
            BEGIN
            if (MONTO <> 0) then
                BEGIN
                CUENTA = NULL;
                EXECUTE PROCEDURE VALIDE_CUENTA_C (CTACAJA) RETURNING_VALUES (:OK);
                IF (OK = 0) THEN
                    SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                        WHERE CUEN_COD = :CTACAJA INTO :CUENTA, :TIPOCUEN;
                ELSE
                    begin
                    EXECUTE PROCEDURE ERROR (62, :IDDOC, :CTACAJA, 2);
                    CUENTA = CTACAJA;
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 4);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA - MONTO;
                    END
                END /* MONTO <> 0 */
            END /* DO CAJA */
        /* AHORA EL BANCO */
        MONTO = 0;
        SELECT CUBA_CTACONTA, EGBC_MONTO, EGBC_GMF, E.CUBA_COD, CUBA_GMFPOR, EGBC_NUMERO
            FROM EGRESOS_BANCO E, CUENTAS_BANCO C
            WHERE E.CUBA_COD = C.CUBA_COD AND EGRE_ID = :IDDOC
            INTO :CTACAJA, :MONTO, :GMF, :CODBCO, :PORC, :NUMCHEQ;
        if (MONTO <> 0) then
            BEGIN
            if (MONTO <> 0) then
                BEGIN
                CUENTA = NULL;
                EXECUTE PROCEDURE VALIDE_CUENTA_C (CTACAJA) RETURNING_VALUES (:OK);
                IF (OK = 0) THEN
                    SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                        WHERE CUEN_COD = :CTACAJA INTO :CUENTA, :TIPOCUEN;
                ELSE
                    begin
                    EXECUTE PROCEDURE ERROR (62, :IDDOC, :CTACAJA, 2);
                    CUENTA = CTACAJA;
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 4);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, :NUMCHEQ, 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA - MONTO;
                    END
                /* EL GMF */
                if ((GMF = 'S') AND (PORC <> 0)) then
                    BEGIN
                    EXECUTE procedure REDONDEE(:MONTO * :PORC / 1000, 0) returning_values (MONTO);
                    /* REGISTRE EL GMF EN LA MISMA CUENTA DEL BANCO COMO CREDITO */
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, :NUMCHEQ, 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA - MONTO;

                    /* AHORA LA CUENTA DEL GASTO */
                    SELECT CUBA_CTAGMF FROM CUENTAS_BANCO
                        where CUBA_COD = :CODBCO INTO :CTACAJA;
                    EXECUTE PROCEDURE VALIDE_CUENTA_C (CTACAJA) RETURNING_VALUES (:OK);
                    IF (OK = 0) THEN
                        SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                            WHERE CUEN_COD = :CTACAJA INTO :CUENTA, :TIPOCUEN;
                    ELSE
                        begin
                        EXECUTE PROCEDURE ERROR (62, :IDDOC, :CTACAJA, 2);
                        CUENTA = CTACAJA;
                        TIPOCUEN = 'N';
                        ERROR = ERROR + 1;
                        end
                    if (TIPOCUEN = 'I') then
                        BEGIN
                        EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
                        TIPOCUEN = 'N';
                        ERROR = ERROR + 1;
                        END
                    if (TIPOCUEN = 'C') then
                        BEGIN
                        EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 4);
                        TIPOCUEN = 'N';
                        ERROR = ERROR + 1;
                        END
                    if (TIPOCUEN = 'N') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, :NUMCHEQ, :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NROI = NROI + 1;
                        SUMA = SUMA + MONTO;
                        END
                    END /* GMF */
                END /* MONTO <> 0 */
            END /* EGRESO_BANCO */
        END /* CAJA = F */

    /* LOS CRUCES CON CUENTAS X COBRAR */
    if (CRUCES <> 0) then
        BEGIN
        SELECT TERC_CTACLIENTE FROM TERCEROS WHERE TERC_NIT = :nit INTO :ctabase;
        if (CTABASE IS NULL) then
            ctabase = tctaclien;
        CUENTA = NULL;
        EXECUTE PROCEDURE VALIDE_CUENTA_C (CTABASE) RETURNING_VALUES (:OK);
        IF (OK = 0) THEN
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTABASE INTO :CUENTA, :TIPOCUEN;
        ELSE
            begin
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :CTABASE, 2);
            CUENTA = CTABASE;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            /* DEBERIA RECORRER DOCUMENTO POR DOCUMENTO */
            FOR SELECT EGCC_TIPODOC, EGCC_PREFIJO, EGCC_NUMERO, EGCC_ABONO+EGCC_RTFTE+EGCC_RTIVA+EGCC_RTICA+EGCC_DTOF
                FROM egresos_crucec WHERE EGRE_ID = :IDDOC
                INTO :TIPOIT, PREFIT, NUMIT, ABONOIT
                DO
                BEGIN
                NUMEROIT = PREFIT || NUMIT;
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :ABONOIT, 0, 0, :NIT, :PROY, :CENTRO, NULL, :NUMEROIT, NULL, NULL, :TIPOIT, 0);
                SUMA = SUMA - ABONOIT;
                NROI = NROI + 1;
                END
            END
        if (TIPOCUEN = 'N') then
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :CRUCES, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
        SUMA = SUMA - CRUCES;
        NROI = NROI + 1;
        /* LA DIFERENCIA EN CAMBIO */
        SELECT SUM(EGCC_DIFCAMBIO) FROM egresos_crucec WHERE EGRE_ID = :iddoc INTO :DIFCAMBIO;
        IF ((DIFCAMBIO IS NOT NULL) AND (DIFCAMBIO <> 0)) THEN
            BEGIN
            if (DIFCAMBIO > 0) then
                execute procedure lee_configuracion('GENERAL','GENERAL','CUENTA DE INGRESO POR DIFERENCIA EN CAMBIO PARA OPERACIONES EN OTRA MONEDA') returning_values (:ctadif);
            else
                execute procedure lee_configuracion('GENERAL','GENERAL','CUENTA DE GASTO POR DIFERENCIA EN CAMBIO PARA OPERACIONES EN OTRA MONEDA') returning_values (:ctadif);
            CUENTA = NULL;
            EXECUTE PROCEDURE VALIDE_CUENTA_C (ctadif) RETURNING_VALUES (:OK);
            IF (OK = 0) THEN
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :ctadif INTO :CUENTA, :TIPOCUEN;
            ELSE
                begin
                EXECUTE PROCEDURE ERROR (62, :IDDOC, :ctadif, 2);
                CUENTA = ctadif;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 4);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                if (DIFCAMBIO > 0) then
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :difcambio, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                else
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', ABS(:difcambio), 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - difcambio;
                END
            END
        END /* cruces */

    if (DTO = 'K') then /* DTO EN CTA CONSTANTE */
        BEGIN
        if (VRDTO <> 0) then
            BEGIN
            CUENTA = NULL;
            EXECUTE PROCEDURE VALIDE_CUENTA_C (CTADTO) RETURNING_VALUES (:OK);
            IF (OK = 0) THEN
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :CTADTO INTO :CUENTA, :TIPOCUEN;
            ELSE
                begin
                EXECUTE PROCEDURE ERROR (62, :IDDOC, :CTADTO, 2);
                CUENTA = CTADTO;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 4);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRDTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - VRDTO;
                END
            END /* VRDTO <> 0 */
        END /* DTO EN CTA CONSTANTE */

    /* LA DIFERENCIA EN CAMBIO */
    SELECT SUM(EGDE_DIFCAMBIO) FROM egresos_detalle WHERE EGRE_ID = :iddoc INTO :DIFCAMBIO;
    IF ((DIFCAMBIO IS NOT NULL) AND (DIFCAMBIO <> 0)) THEN
        BEGIN
        if (DIFCAMBIO > 0) then
            execute procedure lee_configuracion('GENERAL','GENERAL','CUENTA DE GASTO POR DIFERENCIA EN CAMBIO PARA OPERACIONES EN OTRA MONEDA') returning_values (:ctadif);
        else
            execute procedure lee_configuracion('GENERAL','GENERAL','CUENTA DE INGRESO POR DIFERENCIA EN CAMBIO PARA OPERACIONES EN OTRA MONEDA') returning_values (:ctadif);
        CUENTA = NULL;
        EXECUTE PROCEDURE VALIDE_CUENTA_C (ctadif) RETURNING_VALUES (:OK);
        IF (OK = 0) THEN
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :ctadif INTO :CUENTA, :TIPOCUEN;
        ELSE
            begin
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :ctadif, 2);
            CUENTA = ctadif;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 4);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            if (DIFCAMBIO > 0) then
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :difcambio, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            else
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, ABS(:difcambio), 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA + difcambio;
            END
        END
    /* RETENCION FUENTE */
    if ((RTFTE = 'T') or (RTFTE = 'K')) then
      if (VRRTFTE <> 0) then
        BEGIN
        if (RTFTE = 'T') then
            CTARTFTE = TCTARTFTE;
        CUENTA = NULL;
        EXECUTE PROCEDURE VALIDE_CUENTA_C (CTARTFTE) RETURNING_VALUES (:OK);
        IF (OK = 0) THEN
            SELECT CUEN_COD, CUEN_RETENCION, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTARTFTE INTO :CUENTA, :ES_RETENCION, :TIPOCUEN;
        ELSE
            begin
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :CTARTFTE, 2);
            CUENTA = CTARTFTE;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 4);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            if (ES_RETENCION = 'S') then
                BEGIN
                VRBASE = VRTOTAL;
                SELECT PROV_RETEFTE from proveedores where terc_nit = :NIT INTO :PORC;
                END
            ELSE
                BEGIN
                VRBASE = 0;
                PORC = 0;
                END
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, :VRBASE, :PORC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA - VRRTFTE;
            END
        END /* RTFTE */
    /* RETENCION IVA */
    if ((RTIVA = 'T') or (RTIVA = 'K')) then
      if (VRRTIVA <> 0) then
        BEGIN
        if (RTIVA = 'T') then
            CTARTIVA = TCTARTIVA;
        CUENTA = NULL;
        EXECUTE PROCEDURE VALIDE_CUENTA_C (CTARTIVA) RETURNING_VALUES (:OK);
        IF (OK = 0) THEN
            SELECT CUEN_COD, CUEN_RETENCION, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTARTIVA INTO :CUENTA, :ES_RETENCION, :TIPOCUEN;
        ELSE
            begin
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :CTARTIVA, 2);
            CUENTA = CTARTIVA;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 4);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            if (ES_RETENCION = 'S') then
                BEGIN
                VRBASE = VRTOTAL;
                SELECT PROV_RTEIVA from proveedores where terc_nit = :NIT INTO :PORC;
                END
            ELSE
                BEGIN
                VRBASE = 0;
                PORC = 0;
                END
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTIVA, :VRBASE, :PORC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA - VRRTIVA;
            END
        END /* RTIVA */
    /* RETENCION DE ICA */
    if ((RTICA = 'T') or (RTICA = 'K')) then
      if (VRRTICA <> 0) then
        BEGIN
        if (RTICA = 'T') then
            CTARTICA = TCTARTICA;
        CUENTA = NULL;
        EXECUTE PROCEDURE VALIDE_CUENTA_C (CTARTICA) RETURNING_VALUES (:OK);
        IF (OK = 0) THEN
            SELECT CUEN_COD, CUEN_RETENCION, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTARTICA INTO :CUENTA, :ES_RETENCION, :TIPOCUEN;
        ELSE
            begin
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :CTARTICA, 2);
            CUENTA = CTARTICA;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 4);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            if (ES_RETENCION = 'S') then
                BEGIN
                VRBASE = VRTOTAL;
                SELECT PROV_RTEICA from proveedores where terc_nit = :NIT INTO :PORC;
                END
            ELSE
                BEGIN
                VRBASE = 0;
                PORC = 0;
                END
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTICA, :VRBASE, :PORC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA - VRRTICA;
            END
        END /* RTICA */
    /* RECORRA LAS CUENTAS DE EGRESOS_CONTABILIDAD */
    FOR SELECT CUEN_COD, EGCO_NIT, EGCO_PROY, EGCO_CENTRO, EGCO_CONC, EGCO_DEBITOS, EGCO_CREDITOS, EGCO_BASEM, EGCO_PORC
        FROM EGRESOS_CONTABILIDAD WHERE EGRE_ID = :IDDOC ORDER BY EGCO_ITEM
        INTO :CTABASE, :NIT, :PROY, :CENTRO, :CONC, :DEBITO, :CREDITO, :MONTOBASE, :PORC
        DO
        BEGIN
        CUENTA = NULL;
        EXECUTE PROCEDURE VALIDE_CUENTA_C (CTABASE) RETURNING_VALUES (:OK);
        IF (OK = 0) THEN
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTABASE INTO :CUENTA, :TIPOCUEN;
        ELSE
            begin
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :CTABASE, 2);
            CUENTA = CTABASE;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 4);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'N') then
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :DEBITO, :CREDITO, :MONTOBASE, :PORC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
        SUMA = SUMA + DEBITO - CREDITO;
        NROI = NROI + 1;
        END
    /* CIERRE EL COMPROBANTE CONTRA LA CUENTA DEL TERCERO O LA BASE CONSTANTE */
    if ((SUMA <> 0) and (BASE = 'F') or (BASE = 'T') or (BASE = 'K')) then
        BEGIN
        if (SUMA < 0) then
            BEGIN
            DEBITO = SUMA * -1;
            CREDITO = 0;
            END
        ELSE
            BEGIN
            DEBITO = 0;
            CREDITO = SUMA;
            END
        if (BASE = 'T') then
            CTABASE = TCTACLIEN;
        if (BASE = 'F') then
            BEGIN
            SELECT CAJA_CUENTA FROM EGRESOS E, CAJAS C
                WHERE C.CAJA_ID = E.CAJA_ID AND EGRE_ID = :IDDOC INTO :CTABASE;
            END
        CUENTA = NULL;
        EXECUTE PROCEDURE VALIDE_CUENTA_C (CTABASE) RETURNING_VALUES (:OK);
        IF (OK = 0) THEN
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTABASE INTO :CUENTA, :TIPOCUEN;
        ELSE
            begin
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :CTABASE, 2);
            CUENTA = CTABASE;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            /* DEBERIA RECORRER DOCUMENTO POR DOCUMENTO */
            FOR SELECT RCDE_TIPODOC, RCDE_PREFIJO, RCDE_NUMERO, RCDE_ABONO+RCDE_RTFTE+RCDE_RTIVA+RCDE_RTICA+RCDE_DTOF
                FROM RECIBOS_CAJA_DETALLE WHERE RECA_ID = :IDDOC
                INTO :TIPOIT, PREFIT, NUMIT, ABONOIT
                DO
                BEGIN
                NUMEROIT = PREFIT || NUMIT;
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :ABONOIT, 0, 0, :NIT, :PROY, :CENTRO, NULL, :NUMEROIT, NULL, NULL, :TIPOIT, 0);
                NROI = NROI + 1;
                END
            END
        if (TIPOCUEN = 'N') then
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :DEBITO, :CREDITO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
        NROI = NROI + 1;
        END /* SUMA EN CARTERA */
    /* recorra las cuentas adicionales */
    FOR SELECT INJC_CUENTA, INJC_BASE, INJC_PORC, INJC_VALOR, INJC_DB
        FROM INTERFAZ_CAJA_CTAS
        WHERE INCJ_ID = :IDINTER
        INTO :CTADIC, :BASEADIC, :PORCADIC, :VALORADIC, :DBADIC
        DO
        BEGIN
        if (:BASEADIC = 'TOTAL') then
            VALORADIC = VRTOTAL;
        if (:BASEADIC = 'DESCUENTO') then
            VALORADIC = VRDTO;
        if (:BASEADIC = 'RTFTE') then
            VALORADIC = VRRTFTE;
        if (:BASEADIC = 'RTIVA') then
            VALORADIC = VRRTIVA;
        if (:BASEADIC = 'RTICA') then
            VALORADIC = VRRTICA;
        MONTO = VALORADIC * PORCADIC;
        CUENTA = NULL;
        EXECUTE PROCEDURE VALIDE_CUENTA_C (CTADIC) RETURNING_VALUES (:OK);
        IF (OK = 0) THEN
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTADIC INTO :CUENTA, :TIPOCUEN;
        ELSE
            begin
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :CTADIC, 2);
            CUENTA = CTADIC;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 4);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            if (DBADIC = 'S') then
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTADIC, :CONC, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            ELSE
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTADIC, :CONC, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            END
        NROI = NROI + 1;
        END
    if (ERROR > 0) then
        VER = 'S';
    SUSPEND;
    END /* EXISTE LA INTERFAZ */
  ELSE
    BEGIN
    EXECUTE PROCEDURE ERROR (62, :IDDOC, :PREF, 1);
    ERROR = ERROR + 1;
    VER = 'S';
    SUSPEND;
    END
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE EGRESOS_SIN_CONTABILIDAD(
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    ID INTEGER,
    IDI INTEGER,
    IDC INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    ESTADO VARCHAR(20),
    ERROR INTEGER)
AS
DECLARE VARIABLE VER CHAR(2);
declare variable FECICNT VARCHAR(10);
declare variable FECFCNT VARCHAR(10);
declare variable idref INTEGER;
BEGIN /*$$IBE$$ 
EXECUTE PROCEDURE fecha_a_conta(FECINI) returning_values (FECICNT);
EXECUTE PROCEDURE fecha_a_conta(FECFIN) returning_values (FECFCNT);
FOR SELECT EGRE_ID, PREF_PRE, egre_numero FROM EGRESOS WHERE EGRE_ANULADO = 'N' AND PREF_PRE <> 'R004' AND
    EGRE_FECHA >= :FECINI AND EGRE_FECHA <= :FECFIN ORDER BY EGRE_ID INTO :ID, :PREF, :NUMERO
DO
  BEGIN
  idref = null;
  SELECT ENCO_IDREF FROM COMPROBANTE_ENCABEZADO WHERE ENCO_TIPOREF = 62 AND ENCO_FECHA >= :FECICNT AND ENCO_FECHA <= :FECFCNT and ENCO_IDREF = :ID into :idref;
  if (idref IS NULL) then
  begin
   ESTADO = 'PROCESANDO';
   SUSPEND;
   SELECT MAX(INCJ_ID) FROM INTERFAZ_CAJA WHERE PREF_PRE = :PREF AND TIDO_COD = 62 INTO :IDI;
   EXECUTE PROCEDURE CONTABIL_EGRESO (:ID, :IDI) RETURNING_VALUES (:ERROR, :VER, :IDC);
   IF (ERROR = 0) THEN
      BEGIN
      EXECUTE PROCEDURE CONTABILIZA_PENDIENTE (:IDC);
      ESTADO = 'OK';
      END
   ELSE
    ESTADO = 'ERROR';
   suspend;
  end
  END
 $$IBE$$*/ SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE EGRESOS_SIN_CONTABILIDAD(
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    ID INTEGER,
    IDI INTEGER,
    IDC INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    ESTADO VARCHAR(20),
    ERROR INTEGER)
AS
DECLARE VARIABLE VER CHAR(2);
declare variable FECICNT VARCHAR(10);
declare variable FECFCNT VARCHAR(10);
declare variable idref INTEGER;
BEGIN
EXECUTE PROCEDURE fecha_a_conta(FECINI) returning_values (FECICNT);
EXECUTE PROCEDURE fecha_a_conta(FECFIN) returning_values (FECFCNT);
FOR SELECT EGRE_ID, PREF_PRE, egre_numero FROM EGRESOS WHERE EGRE_ANULADO = 'N' AND PREF_PRE <> 'R004' AND
    EGRE_FECHA >= :FECINI AND EGRE_FECHA <= :FECFIN ORDER BY EGRE_ID INTO :ID, :PREF, :NUMERO
DO
  BEGIN
  idref = null;
  SELECT ENCO_IDREF FROM COMPROBANTE_ENCABEZADO WHERE ENCO_TIPOREF = 62 AND ENCO_FECHA >= :FECICNT AND ENCO_FECHA <= :FECFCNT and ENCO_IDREF = :ID into :idref;
  if (idref IS NULL) then
  begin
   ESTADO = 'PROCESANDO';
   SUSPEND;
   SELECT MAX(INCJ_ID) FROM INTERFAZ_CAJA WHERE PREF_PRE = :PREF AND TIDO_COD = 62 INTO :IDI;
   EXECUTE PROCEDURE CONTABIL_EGRESO (:ID, :IDI) RETURNING_VALUES (:ERROR, :VER, :IDC);
   IF (ERROR = 0) THEN
      BEGIN
      EXECUTE PROCEDURE CONTABILIZA_PENDIENTE (:IDC);
      ESTADO = 'OK';
      END
   ELSE
    ESTADO = 'ERROR';
   suspend;
  end
  END
END

^

SET TERM ; ^



INSERT INTO TIPOS_MONEDA (TIMO_COD, TIMO_NOMBRE) VALUES (0, 'PESOS');
INSERT INTO TIPOS_MONEDA (TIMO_COD, TIMO_NOMBRE) VALUES (1, 'DOLARES');
INSERT INTO TIPOS_MONEDA (TIMO_COD, TIMO_NOMBRE) VALUES (2, 'BOLIVARES');
INSERT INTO TIPOS_MONEDA (TIMO_COD, TIMO_NOMBRE) VALUES (3, 'EUROS');
COMMIT WORK;


INSERT INTO CONFIGURACION (CONF_MODULO, CONF_CATEGORIA, CONF_PROPIEDAD, CONF_VALOR, CONF_POSIBLES, CONF_AYUDA) VALUES ('GENERAL', 'GENERAL', 'MONEDA PREDETERMINADA EN OPERACIONES CON EL EXTERIOR', '1', '0,1,2,3', '0: Pesos, 1: Dólares, 2: Bolívares, 3: Euros');
commit work;

ALTER TABLE COTIZACIONES
ADD COTI_TRM T_MONTO;
ALTER TABLE PEDIDOS
ADD PEDI_TRM T_MONTO;
ALTER TABLE REMISIONES_VENTA
ADD REVT_TRM T_MONTO;

SET TERM ^ ;

CREATE OR ALTER PROCEDURE MOVIMIENTO_CARTERA_DESDE_HASTA(
    NIT VARCHAR(20),
    DESDE DATE,
    HASTA DATE,
    EMPSUCURSAL INTEGER,
    MONEDA INTEGER)
RETURNS (
    INICIAL NUMERIC(18,2),
    TIPODOC VARCHAR(8),
    IDDOC INTEGER,
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    CONCEPTO VARCHAR(60),
    DEBITO NUMERIC(18,2),
    CREDITO NUMERIC(18,2),
    SALDO NUMERIC(18,2),
    NOMBRE VARCHAR(60),
    RTFTE NUMERIC(18,2),
    RTIVA NUMERIC(18,2),
    RTICA NUMERIC(18,2),
    SUCURSAL VARCHAR(10),
    RECPROV_ID INTEGER,
    RECIPROV CHAR(1))
AS
declare variable DB CHAR(1);
declare variable AB CHAR(1);
declare variable RETES CHAR(2);
declare variable tipo integer;
declare variable TRM NUMERIC(18,2);
declare variable i integer;
BEGIN
  /* Ubique el NIT */
  select terc_nom from terceros where terc_nit = :NIT INTO :NOMBRE;
  DESDE = DESDE - 1;
  INICIAL = 0;
  i = 0;
  FOR SELECT MVCL_TIPOREF, MVCL_IDREF FROM MOVIMIENTO_CLIENTES
    WHERE TERC_NIT = :NIT AND MVCL_FECHA <= :DESDE AND MVCL_ABONO = 'N' AND
    ((:empsucursal = 0) or (SUCU_ID = :empsucursal)) AND ((:MONEDA = 0) or (MVCL_TRM <> 1))
    INTO :TIPODOC, :IDDOC
    DO
    BEGIN
    EXECUTE PROCEDURE saldo_doc_cartera(TIPODOC, IDDOC, DESDE, MONEDA) returning_values (SALDO);
    if (SALDO <> 0) then
        INICIAL = INICIAL + SALDO;
    END
  DESDE = DESDE + 1;
  SALDO = INICIAL;
  EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'DESCONTAR RETENCIONES POR CAUSACION') returning_values(:RETES);
  FOR select tido_nomcorto, MVCL_TIPOREF, mvcl_idref, mvcl_prefref, mvcl_numref, mvcl_fecha, mvcl_conc, mvcl_monto, mvcl_debito, mvcl_rtefte, mvcl_rteiva, mvcl_rteica, mvcl_abono, mvcl_sucursal, MVCL_TRM
    from movimiento_clientes m, tipo_documento t
    where m.mvcl_tiporef = t.tido_cod and terc_nit = :NIT and mvcl_fecha >= :DESDE and mvcl_fecha <= :HASTA and mvcl_tiporef <> 45 AND
    ((SUCU_ID = :EMPSUCURSAL) or (:EMPSUCURSAL = 0)) AND ((:MONEDA = 0) or (MVCL_TRM <> 1))
    order by mvcl_fecha, mvcl_tiporef
    into :TIPODOC,:tipo,  :IDDOC, :PREFIJO, :NUMERO, :FECHA, :CONCEPTO, :DEBITO, :DB, :RTFTE, :RTIVA, :RTICA, :AB, :SUCURSAL, :TRM
    DO
    BEGIN
    i = i + 1;
    if (DB = 'N') then
        BEGIN
        if (AB = 'S') then
            if (RETES = 'SI') then
                CREDITO = DEBITO;
            ELSE
                CREDITO = DEBITO + RTFTE + RTIVA + RTICA;
        ELSE
            if (RETES = 'SI') then
                CREDITO = DEBITO - RTFTE - RTIVA - RTICA;
            ELSE
                CREDITO = DEBITO;
        DEBITO = 0;
        END
    ELSE
        BEGIN
        if (RETES = 'SI') then
            DEBITO = DEBITO - RTFTE - RTIVA - RTICA;
        CREDITO = 0;
        END
    if ((MONEDA <> 0) AND (TRM <> 0)) then
        BEGIN
        DEBITO = DEBITO / TRM;
        CREDITO = CREDITO / TRM;
        RTFTE = RTFTE / TRM;
        RTIVA = RTIVA / TRM;
        RTICA = RTICA / TRM;
        END
    SALDO = SALDO + DEBITO - CREDITO;
    /* IDENTIFICAR SI EL DOCUMENTO TIENE RECIBO PROVISIONAL*/
    recprov_id = 0;
    SELECT max(RCPR_ID) FROM recibo_provisional_detalle WHERE RPDE_IDDOC = :iddoc  AND RPDE_TIPODOC = :TIPO and RPDE_ANULADO = 'N' INTO :recprov_id;
    if (recprov_id is null) then
      BEGIN
       reciprov = 'N';
      end
    ELSE
      begin
       reciprov = 'S';
      END
    SUSPEND;
    END
if (i = 0) then
    SUSPEND;
END
^

SET TERM ; ^

CREATE SEQUENCE ID_TASACAMBIO;

SET TERM ^ ;

create trigger TASA_CAMBIO_MONEDA_BI for TASA_CAMBIO_MONEDA
active BEFORE INSERT position 0
as
begin
NEW.taca_id = gen_id(id_tasacambio, 1);
if (NEW.taca_valor IS NULL) then
    NEW.taca_valor = 1;
end
^

SET TERM ; ^


ALTER TABLE FACTURA_CONCEPTO_ITEMS
ADD FACI_DESC T_CONCEPTO;
ALTER TABLE FACTURA_CONCEPTO_ITEMS
ADD FACI_IVAMONTO T_MONTO;
ALTER TABLE FACTURA_CONCEPTO_ITEMS
ADD FACI_TOTAL T_MONTO;

CREATE SEQUENCE ID_FACTPER;

SET TERM ^ ;

create trigger FACTURA_CONCEPTO_BI for FACTURA_CONCEPTO
active BEFORE INSERT position 0
as
begin
NEW.facc_id = GEN_ID(id_factper, 1);
IF (NEW.facc_dias IS NULL) THEN
    NEW.facc_dias = 0;
end
^

SET TERM ; ^

SET TERM ^ ;

create procedure FACTURAR_CONCEPTOS (
    ID INTEGER,
    NITINI VARCHAR(20),
    NITFIN VARCHAR(20),
    AGRINI VARCHAR(20),
    AGRFIN VARCHAR(20),
    AGRUPA INTEGER,
    FECHA DATE)
returns (
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(6),
    NIT VARCHAR(20),
    NOMBRE VARCHAR(60),
    TOTAL NUMERIC(18,2))
as
declare variable IDF INTEGER;
declare variable VEND INTEGER;
declare variable PTVT INTEGER;
declare variable VENDINI INTEGER;
declare variable VENDFIN INTEGER;
declare variable ZONINI CHAR(2);
declare variable ZONFIN CHAR(2);
declare variable grpini INTEGER;
declare variable grpfin INTEGER;
declare variable DIAS INTEGER;
declare variable OBS VARCHAR(255);
declare variable IVAINC CHAR(1);
declare variable ITEM INTEGER;
declare variable ARTICULO VARCHAR(20);
declare variable DESCR VARCHAR(60);
declare variable CANT NUMERIC(18,2);
declare variable PRUNIT NUMERIC(18,2);
declare variable IVAP NUMERIC(18,2);
declare variable IVAM NUMERIC(18,2);
declare variable BASE NUMERIC(18,2);
declare variable RTFTE NUMERIC(9,2);
declare variable RTIVA NUMERIC(9,2);
declare variable RTICA NUMERIC(9,2);
declare variable RTFTEM NUMERIC(18,2);
declare variable RTIVAM NUMERIC(18,2);
declare variable RTICAM NUMERIC(18,2);
declare variable UNIDAD VARCHAR(8);
declare variable BOD VARCHAR(2);
begin
if (agrupa = 0) then
    BEGIN
    VENDINI = 0;
    VENDFIN = 999999;
    GRPINI = 0;
    GRPFIN = 999999;
    ZONINI = '';
    ZONFIN = 'zz';
    END
if (agrupa = 1) then
    BEGIN
    VENDINI = 0;
    VENDFIN = 999999;
    ZONINI = '';
    ZONFIN = 'zz';
    GRPINI = AGRINI;
    GRPFIN = AGRFIN;
    END
if (agrupa = 2) then
    BEGIN
    GRPINI = 0;
    GRPFIN = 999999;
    ZONINI = '';
    ZONFIN = 'zz';
    VENDINI = AGRINI;
    VENDFIN = AGRFIN;
    END
if (agrupa = 3) then
    BEGIN
    VENDINI = 0;
    VENDFIN = 999999;
    GRPINI = 0;
    GRPFIN = 999999;
    ZONINI = AGRINI;
    ZONFIN = AGRFIN;
    END
SELECT FACC_PREF, FACC_VEND, FACC_DIAS, FACC_PTVT, FACC_OBS FROM factura_concepto WHERE FACC_ID = :ID
    INTO :prefijo, :vend, :dias, :ptvt, :obs;
SELECT BODE_COD FROM punto_venta WHERE PTVT_ID = :PTVT INTO :BOD;
FOR SELECT T.TERC_NIT, TERC_NOM, C.vend_cod, C.clie_rtefte, C.clie_rteiva, C.clie_rteica, C.clie_rtftebase
    FROM TERCEROS T, CLIENTES C
    WHERE T.terc_nit = C.terc_nit AND T.TERC_NIT >= :NITINI AND T.TERC_NIT <= :NITFIN AND
        C.vend_cod >= :vendini AND C.vend_cod <= :vendfin AND C.grca_cod >= :grpini AND C.grca_cod <= :grpfin AND
        C.zona_cod >= :zonini AND C.zona_cod <= :zonfin
    INTO :NIT, :NOMBRE, :VEND, :RTFTE, :RTIVA, :RTICA, :RTFTEM
    DO
    BEGIN
    SELECT PREF_ACTUAL, PREF_IVAINC FROM PREFIJOS WHERE TIDO_COD = 31 AND PREF_PRE = :prefijo
        INTO :NUMERO, :IVAINC;
    /* CALCULE EL TOTAL DE LA FACTURA XA EFECTOS DE IMPUESTOS */
    SELECT SUM(FACI_CANT * FACI_PRUNIT * TAIV_PORC / 100), SUM(FACI_CANT * FACI_PRUNIT), SUM(FACI_CANT * FACI_PRUNIT / (100 + TAIV_PORC) * TAIV_PORC / 100)
        FROM factura_concepto_items F, ARTICULO A, TARIFA_IVA I
        WHERE F.arti_cod = A.arti_cod AND A.taiv_cod = I.taiv_cod AND FACC_ID = :ID
        INTO :IVAM, :TOTAL, IVAP;

    if (IVAINC = 'S') then
        BEGIN
        IVAM = IVAP;
        BASE = TOTAL - IVAM;
        END
    ELSE
        BASE = TOTAL;
    if (BASE >= RTFTEM) then
        BEGIN
        RTFTEM = BASE * RTFTE / 100;
        RTICAM = BASE * RTICA / 1000;
        RTIVAM = IVAM * RTIVA / 100;
        END
    ELSE
        BEGIN
        RTFTEM = 0;
        RTICAM = 0;
        RTIVAM = 0;
        END

    IDF = GEN_ID(id_factura, 1);
    INSERT INTO FACTURAS (FACT_ID, PTVT_ID, VEND_COD, TERC_NIT, AUTO_NUMERO, FACT_NUMERO, FACT_FECHA, FACT_DESPACHO,
        FACT_VENCE, FACT_IVAINC, FACT_COMIPORC, FACT_COMIMONTO, FACT_DTOPOR, FACT_DTOMONTO, FACT_ADICIONAL,
        FACT_IVAMONTO, FACT_RTFTEPOR, FACT_RTFTEMONTO, FACT_RTIVAPOR, FACT_RTIVAMONTO, FACT_RTICAPOR, FACT_RTICAMONTO,
        FACT_EXTRA, FACT_DTOFPOR, FACT_DTOFMONTO, FACT_DTOFFECHA, PREF_PRE, FACT_TRANSP, FACT_NOMCLIENTE, FACT_COTIZACI,
        FACT_PEDIDO, FACT_REMISION, FACT_ANULADO, FACT_TRANSMIT, FACT_TOTAL, BODE_COD, FACT_OBS, VEHI_COD, FACT_CONSOLIDA,
        FACT_RECIBIDO, FACT_USUARIO, FACT_SUCURSAL, NUMOK, COBR_COD, FACT_FACTOR, FACT_DETCLI, FACT_DETCLINOM,
        FACT_DTOIT1, FACT_DTOIT2, FACT_DTOIT3, FACT_TRM)
        VALUES (:IDF, :PTVT, :VEND, :NIT, NULL, :NUMERO, :FECHA, NULL, (:FECHA + :DIAS), :IVAINC,
        0, 0, 0, 0, 0, :IVAM, :RTFTE, :RTFTEM, :RTIVA, :RTIVAM, :RTICA, :RTICAM, 0, 0, 0, :FECHA, :PREFIJO, NULL,
        :NOMBRE, NULL, NULL, NULL, 'N', 'N', :TOTAL, :BOD, :OBS, NULL, NULL, 0, USER, '01', 'S', :VEND, 1, NULL,
        NULL, NULL, NULL, NULL, 1);

    FOR SELECT FACI_ITEM, FC.ARTI_COD, FACI_CANT, FACI_PRUNIT, ARTI_UNIDAD, TAIV_PORC, FACI_DESC
        FROM factura_concepto_items FC, ARTICULO A, TARIFA_IVA I
        WHERE FC.arti_cod = A.arti_cod AND A.taiv_cod = I.taiv_cod AND FC.facc_id = :ID
        INTO :item, :articulo, :CANT, :prunit, :unidad, :ivap, :descr
        DO
        BEGIN
        if (IVAINC = 'S') then
            BEGIN
            IVAM = :CANT * :PRUNIT / (100 + :IVAP) * :IVAP / 100;
            BASE = :CANT * :PRUNIT;
            END
        ELSE
            BEGIN
            IVAM = :CANT * :PRUNIT * IVAP / 100;
            BASE = :CANT * :PRUNIT + IVAM;
            END
        INSERT INTO FACTURAS_DETALLE (FACT_ID, FADE_ITEM, BODE_COD, ARTI_COD, FADE_CANT, FADE_UNIDAD, FADE_LOTE,
            FADE_PRUNIT, FADE_DTOPORC, FADE_DTOMONTO, FADE_IVAPORC, FADE_IVAMONTO, FADE_CONSUMO, FADE_FACTOR,
            FADE_DESC, FADE_OBS, FADE_CODBAR, FADE_REMISIONADO, FADE_DEVUELTO, FADE_TOTAL, LIPR_COD, FADE_REFERENCIA,
            FADE_ANULADO, FADE_TRANSMIT, FADE_FACTORLISTA, FADE_DTO1, FADE_DTO2, FADE_DTO3, FADE_DTOM1, FADE_DTOM2,
            FADE_DTOM3, FADE_CAJAS)
            VALUES (:IDF, :ITEM, :BOD, :articulo, :CANT, :UNIDAD, NULL, :prunit, 0, 0, :IVAP, :ivam, 0, 1,
            :descr, NULL, :articulo, 0, 0, :BASE, 1, NULL, 'N', 'N', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
        END
    suspend;
    END
end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER PROCEDURE CAMBIE_ID_FACTPER
RETURNS (
    ID INTEGER)
AS
declare variable NUMROWS INTEGER;
BEGIN
/* TRAE EL ID NUEVO Y LO ACTUALIZA */
NUMROWS = 1;
while (NUMROWS > 0) DO
    BEGIN
    ID = GEN_ID(id_factper, 1);
    /* VERIFIQUE SI YA EXISTE */
    SELECT COUNT(*) FROM factura_concepto WHERE FACC_ID = :ID INTO :NUMROWS;
    END
SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER FACTURA_CONCEPTO_BI FOR FACTURA_CONCEPTO
ACTIVE BEFORE INSERT POSITION 0
as
begin
IF (NEW.facc_dias IS NULL) THEN
    NEW.facc_dias = 0;
end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER PROCEDURE FACTURAR_CONCEPTOS(
    ID INTEGER,
    NITINI VARCHAR(20),
    NITFIN VARCHAR(20),
    AGRINI VARCHAR(20),
    AGRFIN VARCHAR(20),
    AGRUPA INTEGER,
    FECHA DATE)
RETURNS (
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(6),
    NIT VARCHAR(20),
    NOMBRE VARCHAR(60),
    TOTAL NUMERIC(18,2))
AS
declare variable IDF INTEGER;
declare variable VEND INTEGER;
declare variable PTVT INTEGER;
declare variable VENDINI INTEGER;
declare variable VENDFIN INTEGER;
declare variable ZONINI CHAR(2);
declare variable ZONFIN CHAR(2);
declare variable grpini INTEGER;
declare variable grpfin INTEGER;
declare variable DIAS INTEGER;
declare variable OBS VARCHAR(255);
declare variable IVAINC CHAR(1);
declare variable ITEM INTEGER;
declare variable ARTICULO VARCHAR(20);
declare variable DESCR VARCHAR(60);
declare variable CANT NUMERIC(18,2);
declare variable PRUNIT NUMERIC(18,2);
declare variable IVAP NUMERIC(18,2);
declare variable IVAM NUMERIC(18,2);
declare variable BASE NUMERIC(18,2);
declare variable RTFTE NUMERIC(9,2);
declare variable RTIVA NUMERIC(9,2);
declare variable RTICA NUMERIC(9,2);
declare variable RTFTEM NUMERIC(18,2);
declare variable RTIVAM NUMERIC(18,2);
declare variable RTICAM NUMERIC(18,2);
declare variable UNIDAD VARCHAR(8);
declare variable BOD VARCHAR(2);
begin
if (agrupa = 0) then
    BEGIN
    VENDINI = 0;
    VENDFIN = 999999;
    GRPINI = 0;
    GRPFIN = 999999;
    ZONINI = '';
    ZONFIN = 'zz';
    END
if (agrupa = 1) then
    BEGIN
    VENDINI = 0;
    VENDFIN = 999999;
    ZONINI = '';
    ZONFIN = 'zz';
    GRPINI = AGRINI;
    GRPFIN = AGRFIN;
    END
if (agrupa = 2) then
    BEGIN
    GRPINI = 0;
    GRPFIN = 999999;
    ZONINI = '';
    ZONFIN = 'zz';
    VENDINI = AGRINI;
    VENDFIN = AGRFIN;
    END
if (agrupa = 3) then
    BEGIN
    VENDINI = 0;
    VENDFIN = 999999;
    GRPINI = 0;
    GRPFIN = 999999;
    ZONINI = AGRINI;
    ZONFIN = AGRFIN;
    END
SELECT FACC_PREF, FACC_VEND, FACC_DIAS, FACC_PTVT, FACC_OBS FROM factura_concepto WHERE FACC_ID = :ID
    INTO :prefijo, :vend, :dias, :ptvt, :obs;
SELECT BODE_COD FROM punto_venta WHERE PTVT_ID = :PTVT INTO :BOD;
FOR SELECT T.TERC_NIT, TERC_NOM, C.vend_cod, C.clie_rtefte, C.clie_rteiva, C.clie_rteica, C.clie_rtftebase
    FROM TERCEROS T, CLIENTES C
    WHERE T.terc_nit = C.terc_nit AND T.TERC_NIT >= :NITINI AND T.TERC_NIT <= :NITFIN AND
        C.vend_cod >= :vendini AND C.vend_cod <= :vendfin AND ((c.grca_cod is null and :grpini = 0 ) or (C.grca_cod >= :grpini AND C.grca_cod <= :grpfin)) AND
        ((c.zona_cod is null and :zonini = '') or (C.zona_cod >= :zonini AND C.zona_cod <= :zonfin))
    INTO :NIT, :NOMBRE, :VEND, :RTFTE, :RTIVA, :RTICA, :RTFTEM
    DO
    BEGIN
    SELECT PREF_ACTUAL, PREF_IVAINC FROM PREFIJOS WHERE TIDO_COD = 31 AND PREF_PRE = :prefijo
        INTO :NUMERO, :IVAINC;
    /* CALCULE EL TOTAL DE LA FACTURA XA EFECTOS DE IMPUESTOS */
    SELECT SUM(FACI_CANT * FACI_PRUNIT * TAIV_PORC / 100), SUM(FACI_CANT * FACI_PRUNIT), SUM(FACI_CANT * FACI_PRUNIT / (100 + TAIV_PORC) * TAIV_PORC / 100)
        FROM factura_concepto_items F, ARTICULO A, TARIFA_IVA I
        WHERE F.arti_cod = A.arti_cod AND A.taiv_cod = I.taiv_cod AND FACC_ID = :ID
        INTO :IVAM, :TOTAL, IVAP;

    if (IVAINC = 'S') then
        BEGIN
        IVAM = IVAP;
        BASE = TOTAL - IVAM;
        END
    ELSE
        BASE = TOTAL;
    if (BASE >= RTFTEM) then
        BEGIN
        RTFTEM = BASE * RTFTE / 100;
        RTICAM = BASE * RTICA / 1000;
        RTIVAM = IVAM * RTIVA / 100;
        END
    ELSE
        BEGIN
        RTFTEM = 0;
        RTICAM = 0;
        RTIVAM = 0;
        END

    IDF = GEN_ID(id_factura, 1);
    INSERT INTO FACTURAS (FACT_ID, PTVT_ID, VEND_COD, TERC_NIT, AUTO_NUMERO, FACT_NUMERO, FACT_FECHA, FACT_DESPACHO,
        FACT_VENCE, FACT_IVAINC, FACT_COMIPORC, FACT_COMIMONTO, FACT_DTOPOR, FACT_DTOMONTO, FACT_ADICIONAL,
        FACT_IVAMONTO, FACT_RTFTEPOR, FACT_RTFTEMONTO, FACT_RTIVAPOR, FACT_RTIVAMONTO, FACT_RTICAPOR, FACT_RTICAMONTO,
        FACT_EXTRA, FACT_DTOFPOR, FACT_DTOFMONTO, FACT_DTOFFECHA, PREF_PRE, FACT_TRANSP, FACT_NOMCLIENTE, FACT_COTIZACI,
        FACT_PEDIDO, FACT_REMISION, FACT_ANULADO, FACT_TRANSMIT, FACT_TOTAL, BODE_COD, FACT_OBS, VEHI_COD, FACT_CONSOLIDA,
        FACT_RECIBIDO, FACT_USUARIO, FACT_SUCURSAL, NUMOK, COBR_COD, FACT_FACTOR, FACT_DETCLI, FACT_DETCLINOM,
        FACT_DTOIT1, FACT_DTOIT2, FACT_DTOIT3, FACT_TRM)
        VALUES (:IDF, :PTVT, :VEND, :NIT, NULL, :NUMERO, :FECHA, NULL, (:FECHA + :DIAS), :IVAINC,
        0, 0, 0, 0, 0, :IVAM, :RTFTE, :RTFTEM, :RTIVA, :RTIVAM, :RTICA, :RTICAM, 0, 0, 0, :FECHA, :PREFIJO, NULL,
        :NOMBRE, NULL, NULL, NULL, 'N', 'N', :TOTAL, :BOD, :OBS, NULL, NULL, 0, USER, '01', 'N', :VEND, 1, NULL,
        NULL, NULL, NULL, NULL, 1);

    FOR SELECT FACI_ITEM, FC.ARTI_COD, FACI_CANT, FACI_PRUNIT, ARTI_UNIDAD, TAIV_PORC, FACI_DESC
        FROM factura_concepto_items FC, ARTICULO A, TARIFA_IVA I
        WHERE FC.arti_cod = A.arti_cod AND A.taiv_cod = I.taiv_cod AND FC.facc_id = :ID
        INTO :item, :articulo, :CANT, :prunit, :unidad, :ivap, :descr
        DO
        BEGIN
        if (IVAINC = 'S') then
            BEGIN
            IVAM = :CANT * :PRUNIT / (100 + :IVAP) * :IVAP / 100;
            BASE = :CANT * :PRUNIT;
            END
        ELSE
            BEGIN
            IVAM = :CANT * :PRUNIT * IVAP / 100;
            BASE = :CANT * :PRUNIT + IVAM;
            END
        INSERT INTO FACTURAS_DETALLE (FACT_ID, FADE_ITEM, BODE_COD, ARTI_COD, FADE_CANT, FADE_UNIDAD, FADE_LOTE,
            FADE_PRUNIT, FADE_DTOPORC, FADE_DTOMONTO, FADE_IVAPORC, FADE_IVAMONTO, FADE_CONSUMO, FADE_FACTOR,
            FADE_DESC, FADE_OBS, FADE_CODBAR, FADE_REMISIONADO, FADE_DEVUELTO, FADE_TOTAL, LIPR_COD, FADE_REFERENCIA,
            FADE_ANULADO, FADE_TRANSMIT, FADE_FACTORLISTA, FADE_DTO1, FADE_DTO2, FADE_DTO3, FADE_DTOM1, FADE_DTOM2,
            FADE_DTOM3, FADE_CAJAS)
            VALUES (:IDF, :ITEM, :BOD, :articulo, :CANT, :UNIDAD, NULL, :prunit, 0, 0, :IVAP, :ivam, 0, 1,
            :descr, NULL, :articulo, 0, 0, :BASE, 1, NULL, 'N', 'N', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
        END
    suspend;
    END
end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER FACTURAS_DETALLE_BI FOR FACTURAS_DETALLE
ACTIVE BEFORE INSERT POSITION 0
AS
declare variable TRM numeric(18,2);
BEGIN
if (new.fade_cant is null) then
    new.fade_cant = 0;
if (new.fade_prunit is null) then
    new.fade_prunit = 0;
if (new.fade_dtoporc is null) then
    new.fade_dtoporc = 0;
if (new.fade_ivaporc is null) then
    new.fade_ivaporc = 0;
if (new.fade_ivamonto is null) then
    new.fade_ivamonto = 0;
if (new.fade_consumo is null) then
    new.fade_consumo = 0;
/* CALCULE EL MONTO DEL DESCUENTO */
NEW.FADE_DTOMONTO = NEW.fade_prunit * NEW.fade_dtoporc / 100;
/* si estaba en otra moneda convierta a pesos */
select fact_trm from facturas where fact_id = new.fact_id into :trm;
if (trm <> 1) then
    begin
    new.fade_prunit = new.fade_prunit * trm;
    new.fade_dtomonto = new.fade_dtomonto * trm;
    new.fade_ivamonto = new.fade_ivamonto * trm;
    new.fade_consumo = new.fade_consumo * trm;
    new.fade_dtom1 = new.fade_dtom1 * trm;
    new.fade_dtom2 = new.fade_dtom2 * trm;
    new.fade_dtom3 = new.fade_dtom3 * trm;
    new.fade_total = new.fade_total * trm;
    end
END
^

SET TERM ; ^

/* 20081101 */

SET TERM ^ ;

CREATE OR ALTER TRIGGER FACTURAS_COMPRA_BI FOR FACTURAS_COMPRA
ACTIVE BEFORE INSERT POSITION 0
AS
declare variable NUMERO VARCHAR(6);
declare variable AUTOM CHAR(1);
declare variable EXISTE CHAR(1);
declare variable PREGTASA CHAR(2);
BEGIN
if (NEW.FACO_SIMPLIFICADO IS NULL) then
    NEW.faco_simplificado = 'N';
/* doble moneda */
if ((NEW.faco_trm IS NULL) OR (NEW.FACO_TRM = 0)) then
    NEW.faco_trm = 1;
EXECUTE PROCEDURE LEE_CONFIGURACION('GENERAL', 'GENERAL', 'PREGUNTAR TASA DE CAMBIO EN DOCUMENTOS DE CUENTAS POR PAGAR') returning_values (:pregtasa);
if (PREGTASA = 'SI') then
    BEGIN
    NEW.faco_dtomonto = NEW.faco_dtomonto * NEW.faco_trm;
    NEW.faco_adicional = NEW.faco_adicional * NEW.faco_trm;
    NEW.faco_extra = NEW.faco_extra * NEW.faco_trm;
    NEW.faco_rtivamonto = NEW.faco_rtivamonto * NEW.faco_trm;
    NEW.faco_rticamonto = NEW.faco_rticamonto * NEW.faco_trm;
    NEW.faco_rtftemonto = NEW.faco_rtftemonto * NEW.faco_trm;
    NEW.faco_ivamonto = NEW.faco_ivamonto * NEW.faco_trm;
    NEW.faco_dtofmonto = NEW.faco_dtofmonto * NEW.faco_trm;
    NEW.faco_total = NEW.faco_total * NEW.faco_trm;
    END
if (NEW.numok = 'N') then
  BEGIN
  /* Actualice el contador del prefijo */
  SELECT PREF_ACTUAL, PREF_AUTO FROM PREFIJOS WHERE TIDO_COD = 21 AND PREF_PRE = NEW.PREF_PRE INTO :NUMERO, :AUTOM;
  /* ACTUALICE EL NUMERO EN COMPROBANTE_ENCABEZADO  */
  if (AUTOM = 'S') then
    BEGIN
    NEW.faco_numero = NUMERO;
    NUMERO = CAST((CAST(NUMERO AS INTEGER) + 1) AS CHAR(6));
    UPDATE PREFIJOS
      SET PREF_ACTUAL = :NUMERO
    WHERE TIDO_COD = 21 AND PREF_PRE = NEW.PREF_PRE;
    END
  ELSE
    BEGIN
    if (CAST(NUMERO AS INTEGER) = CAST(NEW.FACO_NUMERO AS INTEGER)) then
        UPDATE PREFIJOS
          SET PREF_ACTUAL = CAST((CAST(PREF_ACTUAL AS INTEGER) + 1) AS CHAR(6))
        WHERE TIDO_COD = 21 AND PREF_PRE = NEW.PREF_PRE;
    END
  EXECUTE PROCEDURE COMPLETA_CEROS (NEW.FACO_numero) returning_values (NEW.FACO_numero);
  NEW.numok = 'S';
  END
/* Verifique que el numero no existe previamente */
EXISTE = 'N';
SELECT 'S' FROM FACTURAS_COMPRA WHERE PREF_PRE = NEW.PREF_PRE AND FACO_NUMERO = NEW.FACO_NUMERO INTO :EXISTE;
if (EXISTE = 'S') then
    EXCEPTION DOCUMENTO_REGISTRADO;
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER FACTURAS_COMPRA_AI FOR FACTURAS_COMPRA
ACTIVE AFTER INSERT POSITION 0
AS
declare variable CONC VARCHAR(60);
BEGIN
if ((NEW.FACO_ID <> 0) and (new.faco_anulado = 'N')) then
    BEGIN
    /* Registre el nuevo saldo del documento */
    INSERT INTO saldos_doc_cxpagar(SDCP_TIPOREF, SDCP_IDREF, SDCP_FECHA, TERC_NIT, SDCP_RTEFTE, SDCP_RTIVA, SDCP_RTICA, SDCP_ABONO, SDCP_ABRTFTE, SDCP_ABRTIVA, SDCP_ABRTICA, SDCP_DEBITO, SDCP_MONTO, SDCP_TRM)
        VALUES (21, NEW.FACO_ID, NEW.FACO_fecha, NEW.terc_nit, NEW.FACO_rtftemonto, NEW.FACO_rtivamonto, NEW.FACO_rticamonto, 0, 0, 0, 0, 'S', NEW.FACO_TOTAL, NEW.faco_trm);
    /* Registre el movimiento del cliente */
    CONC = 'FACTURA DE COMPRA No.' || NEW.PREF_PRE || NEW.FACO_NUMERO || ' - ' || NEW.FACO_NUMPROV;
    INSERT INTO movimiento_proveedor(MVPR_ID, TERC_NIT, MVPR_TIPOREF, MVPR_IDREF, MVPR_FECHA, MVPR_VENCE, MVPR_CONC, MVPR_MONTO, MVPR_RTFTE, MVPR_RTIVA, MVPR_RTICA, MVPR_DEBITO, MVPR_ABONO, MVPR_PREFIJO, MVPR_NUMERO, MVPR_TRM)
      VALUES (GEN_ID(ID_MOVPROV, 1), NEW.TERC_NIT, 21, NEW.FACO_ID, NEW.FACO_FECHA, NEW.FACO_VENCE, :CONC, NEW.FACO_TOTAL, NEW.FACO_RTFTEMONTO, NEW.FACO_RTIVAMONTO, NEW.FACO_RTICAMONTO, 'S', 'N', NEW.pref_pre, NEW.FACO_numero, NEW.faco_trm);
    INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
        VALUES (USER, 21, NEW.faco_id, 'I', NEW.pref_pre || NEW.faco_numero);
    END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER FACTURAS_COMPRA_AU FOR FACTURAS_COMPRA
ACTIVE AFTER UPDATE POSITION 0
AS
declare variable ABONOS integer;
declare variable CONC VARCHAR(60);
declare variable consec INTEGER;
BEGIN
/* borre la contabilización */
if (NEW.faco_anulado = 'S') then
    BEGIN
    select enco_consec from comprobante_encabezado where enco_tiporef = 21 and enco_idref = old.faco_id into :consec;
    if (NOT consec is null) then
      delete from comprobante_detalle where enco_consec = :consec;
    delete from comprobante_encabezado where enco_tiporef = 21 and enco_idref = old.faco_id;
    INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
        VALUES (USER, 21, NEW.faco_id, 'A', NEW.pref_pre || NEW.faco_numero);
    END
/* DESHAGA LO VIEJO Y GRABE LO NUEVO */
if ((old.FACO_id <> 0) AND (OLD.FACO_anulado = 'N')) then
    begin
    /* VERIFIQUE QUE NO HAY DEVOLUCIONES */
    SELECT COUNT(*) FROM devoluciones_compras WHERE DVCO_FACTID = OLD.faco_id AND DVCO_ANULADO = 'N' INTO :abonos;
    if (abonos > 0) then
        exception documento_devuelto;

    /* Verifique si habia abonos a la nota */
    ABONOS = 0;
    select COUNT(*) FROM saldos_doc_cxpagar WHERE SDCP_TIPOREF = 21 AND SDCP_IDREF = OLD.FACO_ID AND SDCP_ABONO <> 0 INTO :ABONOS;
    if (ABONOS = 0) then
        BEGIN
        /* BORRE EL REGISTRO PREVIO */
        delete from saldos_doc_cxpagar where sdcp_tiporef = 21 and sdcp_idref = old.faco_id;
        delete from movimiento_proveedor where (mvpr_tiporef = 21) and (mvpr_idref = old.faco_id);
        /* ACTUALICE LA CONSOLIDACION */
        if (OLD.FACO_CONSOLIDA <> 0) then
            UPDATE consolidado_faltantes SET COFA_OK = 'N' WHERE COFA_ID = OLD.faco_consolida;
        END
    else
        exception DOCUMENTO_CON_ABONOS;
    end
if ((NEW.FACO_id <> 0) AND (NEW.FACO_anulado = 'N')) then
    begin
    /* Registre el nuevo saldo del documento */
    INSERT INTO saldos_doc_cxpagar (SDCP_TIPOREF, SDCP_IDREF, SDCP_FECHA, TERC_NIT, SDCP_RTEFTE, SDCP_RTIVA, SDCP_RTICA, SDCP_ABONO, SDCP_ABRTFTE, SDCP_ABRTIVA, SDCP_ABRTICA, SDCP_DEBITO, SDCP_MONTO, SDCP_TRM)
        VALUES (21, NEW.FACO_ID, NEW.FACO_fecha, NEW.terc_nit, NEW.FACO_rtftemonto, NEW.FACO_rtivamonto, NEW.FACO_rticamonto, 0, 0, 0, 0, 'N', NEW.FACO_TOTAL, NEW.faco_trm);
    /* Registre el movimiento del proveedor */
    CONC = 'FACTURA DE COMPRA No.' || NEW.PREF_PRE || NEW.FACO_NUMERO || ' - ' || NEW.faco_numprov;
    INSERT INTO movimiento_proveedor(MVPR_ID, TERC_NIT, MVPR_TIPOREF, MVPR_IDREF, MVPR_FECHA, MVPR_VENCE, MVPR_CONC, MVPR_MONTO, MVPR_RTFTE, MVPR_RTIVA, MVPR_RTICA, MVPR_DEBITO, MVPR_ABONO, MVPR_PREFIJO, MVPR_NUMERO, MVPR_TRM)
        VALUES (GEN_ID(ID_MOVPROV, 1), NEW.TERC_NIT, 21, NEW.FACO_ID, NEW.FACO_FECHA, NEW.faco_vence, :CONC, NEW.FACO_TOTAL, NEW.FACO_RTFTEMONTO, NEW.FACO_RTIVAMONTO, NEW.FACO_RTICAMONTO, 'S', 'N', NEW.pref_pre, NEW.FACO_numero, NEW.faco_trm);
    INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
        VALUES (USER, 21, NEW.faco_id, 'U', NEW.pref_pre || NEW.faco_numero);
    end
/* si cambia numero o fecha cambie los detalles */
if ((OLD.pref_pre <> NEW.pref_pre) or
    (OLD.faco_numero <> NEW.faco_numero) or
    (OLD.faco_fecha <> NEW.faco_fecha)) then
    UPDATE FACTURAS_COMPRAS_DETALLE SET FCDE_TRANSMIT = 'N' WHERE FACO_ID = NEW.FACO_ID;
/* ACTUALICE EL ANULADO EN LOS DETALLES */
if (OLD.FACO_anulado <> NEW.FACO_anulado) then
    UPDATE FACTURAS_COMPRAS_DETALLE SET FCDE_ANULADO = NEW.FACO_anulado WHERE FACO_ID = NEW.FACO_ID;
if (OLD.faco_transmit <> NEW.faco_transmit) then
    UPDATE FACTURAS_COMPRAS_DETALLE SET FCDE_TRANSMIT = NEW.faco_transmit WHERE FACO_ID = NEW.FACO_ID;
END
^

SET TERM ; ^

SET TERM ^ ;

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

SET TERM ; ^


/* 20081103 */
SET TERM ^ ;

CREATE OR ALTER PROCEDURE BUSCA_ID_DOC_CARTERA(
    TIPO INTEGER,
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(6),
    NIT VARCHAR(20),
    FECHA DATE)
RETURNS (
    ID INTEGER,
    SALDO NUMERIC(18,2),
    RTFTE NUMERIC(18,2),
    RTIVA NUMERIC(18,2),
    RTICA NUMERIC(18,2),
    DTOF NUMERIC(18,2),
    ERROR INTEGER)
AS
declare variable vernit varchar(20);
declare variable fec date;
declare variable fecdto date;
declare variable desc_rtes char(2);
declare variable dtoapl numeric(18,2);
declare variable AUTORET VARCHAR(10);
declare variable FAUTORET DATE;
declare variable FECDOC DATE;
declare variable TRM numeric(18,2);
declare variable MONEDA INTEGER;
BEGIN
ID = 0;
ERROR = 0;
EXECUTE PROCEDURE COMPLETA_CEROS(NUMERO) returning_values (NUMERO);
if (TIPO = 41) then
    SELECT NDCL_ID, TERC_NIT, NDCL_FECHA, NDCL_DTOFMONTO, NDCL_FECHADTO, NDCL_TRM
        FROM NOTAS_DEBITO_CLIENTES WHERE PREF_PRE = :PREFIJO AND NDCL_NUMERO = :NUMERO
        INTO :ID, :VERNIT, :FEC, :DTOF, :FECDTO, :TRM;
if (TIPO = 42) then
    SELECT NCCL_ID, TERC_NIT, NCCL_FECHA, 0, NCCL_FECHA, 1
        FROM NOTAS_CREDITO_CLIENTES WHERE PREF_PRE = :PREFIJO AND NCCL_NUMERO = :NUMERO
        INTO :ID, :VERNIT, :FEC, :DTOF, :FECDTO, :TRM;
if (TIPO = 45) then
    SELECT ANCL_ID, TERC_NIT, ANCL_FECHA, ANCL_DTOFMONTO, ANCL_DTOFECHA, ANCL_TRM
        FROM ANTICIPOS_CLIENTE WHERE PREF_PRE = :PREFIJO AND ANCL_NUMERO = :NUMERO
        INTO :ID, :VERNIT, :FEC, :DTOF, :FECDTO, :TRM;
if (TIPO = 31) then
    SELECT FACT_ID, TERC_NIT, FACT_FECHA, FACT_DTOFMONTO, FACT_DTOFFECHA, FACT_TRM
        FROM FACTURAS WHERE PREF_PRE = :PREFIJO AND FACT_NUMERO = :NUMERO
        INTO :ID, :VERNIT, :FEC, :DTOF, :FECDTO, :TRM;
if (TIPO = 33) then
    SELECT DEVT_ID, TERC_NIT, DEVT_FECHA, 0, DEVT_FECHA, 1 FROM devoluciones_ventas
        WHERE PREF_PRE = :PREFIJO AND DEVT_NUMERO = :NUMERO INTO :ID, :VERNIT, :FEC, :DTOF, :FECDTO, :TRM;
if (TIPO = 77) then
    SELECT DVCH_ID, TERC_NIT, DVCH_FECHA, 0, DVCH_FECHA, 1 FROM devolucion_cheques
        WHERE PRBA_PREf = :PREFIJO AND DVCH_NUMDOC = :NUMERO INTO :ID, :VERNIT, :FEC, :DTOF, :FECDTO, :TRM;
if (FECHA > FECDTO) then
    DTOF = 0;
if (DTOF IS NULL) then
    DTOF = 0;
if (DTOF <> 0) then
    BEGIN
    SELECT SUM(RCDE_DTOF) FROM RECIBOS_CAJA_DETALLE WHERE RCDE_IDDOC = :ID AND RCDE_TIPODOC = :TIPO INTO :DTOAPL;
    if (DTOAPL IS NULL) then
        DTOAPL = 0;
    DTOF = DTOF - DTOAPL;
    if ((TRM <> 1) AND (TRM <> 0)) then
        DTOF = DTOF / TRM;
    END
IF (ID = 0) then
    ERROR = 1;
ELSE
  BEGIN
  if (VERNIT <> NIT) then
    ERROR = 2;
  else
    BEGIN
    /* VERIFIQUE QUE LA FECHA DEL ABONO SEA POSTERIOR O IGUAL AL DOC */
    if (FEC > FECHA) then
        ERROR = 3;
    else
        begin
        /* CALCULE LOS SALDOS */
        SELECT SUM(SDCA_RTFTE - SDCA_ABRTFTE), SUM(SDCA_RTIVA - SDCA_ABRTIVA), SUM(SDCA_RTICA - SDCA_ABRTICA)
            FROM SALDOS_DOC_CARTERA WHERE SDCA_TIPOREF = :TIPO AND SDCA_IDREF = :ID
            INTO :RTFTE, :RTIVA, :RTICA;
        if ((TIPO = 31) or (TIPO = 41) or (TIPO = 77)) then
            begin
            if ((RTFTE IS NULL) or (RTFTE < 0))  then
                RTFTE = 0;
            if ((RTIVA IS NULL) or (RTIVA < 0 ))  then
                RTIVA = 0;
            if ((RTICA IS NULL) or (RTICA < 0))  then
                RTICA = 0;
            end
        if ((TIPO = 33) or (TIPO = 42) or (TIPO = 45)) then
            begin
            if ((RTFTE IS NULL) or (RTFTE > 0))  then
                RTFTE = 0;
            if ((RTIVA IS NULL) or (RTIVA > 0 ))  then
                RTIVA = 0;
            if ((RTICA IS NULL) or (RTICA > 0))  then
                RTICA = 0;
            end
        /* TRAIGA EL SALDO NETO */
        if (TRM <> 1) then
            execute procedure lee_configuracion ('GENERAL', 'GENERAL', 'MONEDA PREDETERMINADA EN OPERACIONES CON EL EXTERIOR') returning_values (:moneda);
        else    
            MONEDA = 0;
        EXECUTE PROCEDURE SALDO_DOC_CARTERA(TIPO, ID, FECHA, MONEDA) returning_values (SALDO);
        if (TRM <> 0) then
            BEGIN
            RTFTE = RTFTE / TRM;
            RTIVA = RTIVA / TRM;
            RTICA = RTICA / TRM;
            END
        if (SALDO = 0) then
            ERROR = 4;
        ELSE
            BEGIN
            EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'FECHA AUTORETENEDOR NO DESCONTAR RETENCIONES DEL SALDO PERO SI CONTABILIZARLAS') returning_values (AUTORET);
            if (AUTORET <> '') then
                FAUTORET = CAST(AUTORET AS DATE);
            else
                FAUTORET = '9999/12/31';
            /* BUSQUE LA FECHA DEL DOCUMENTO */
            SELECT MIN(SDCA_FECHA) FROM SALDOS_DOC_CARTERA WHERE (SDCA_TIPOREF = :TIPO) AND (SDCA_IDREF = :ID) AND (SDCA_MONTO <> 0) INTO :FECDOC;
            if (FAUTORET <= FECDOC) then
                BEGIN
                RTFTE = 0;
                RTIVA = 0;
                RTICA = 0;
                END
            /* RESTE LAS RETENCIONES YA QUE SE SUGERIRAN */
            EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'DESCONTAR RETENCIONES POR CAUSACION') returning_values (DESC_RTES);
            if (DESC_RTES = 'NO') then
                SALDO = SALDO - RTFTE - RTIVA - RTICA;
            SALDO = SALDO - DTOF;
            END
        end
    END
  end
SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER PROCEDURE BUSCA_ID_DOC_CXPAGAR(
    TIPO INTEGER,
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(6),
    NIT VARCHAR(20),
    FECHA DATE)
RETURNS (
    ID INTEGER,
    SALDO NUMERIC(18,2),
    RTFTE NUMERIC(18,2),
    RTIVA NUMERIC(18,2),
    RTICA NUMERIC(18,2),
    DTOF NUMERIC(18,2),
    ERROR INTEGER)
AS
declare variable VERNIT VARCHAR(20);
declare variable FEC DATE;
declare variable DTOAPL NUMERIC(18,2);
declare variable FECDTO DATE;
declare variable DESC_RTES CHAR(2);
declare variable TRM NUMERIC(18,2);
declare variable MONEDA INTEGER;
BEGIN
ERROR = 0;
ID = 0;
EXECUTE PROCEDURE COMPLETA_CEROS(NUMERO) returning_values (NUMERO);
if (TIPO = 51) then
    SELECT NDPR_ID, TERC_NIT, NDPR_FECHA, NDPR_DTOFMONTO, NDPR_DTOFECHA, NDPR_TRM
        FROM NOTAS_DEBITO_PROVEEDOR WHERE PREF_PRE = :PREFIJO AND NDPR_NUMERO = :NUMERO
        INTO :ID, :VERNIT, :FEC, :DTOF, :FECDTO, :TRM;
if (TIPO = 52) then
    SELECT NCPR_ID, TERC_NIT, NCPR_FECHA, NCPR_DTOFMONTO, NCPR_DTOFECHA, NCPR_TRM
        FROM NOTAS_CREDITO_PROVEEDOR WHERE PREF_PRE = :PREFIJO AND NCPR_NUMERO = :NUMERO
        INTO :ID, :VERNIT, :FEC, :DTOF, :FECDTO, :TRM;
if (TIPO = 55) then
    SELECT ANPR_ID, TERC_NIT, ANPR_FECHA, ANPR_DTOFMONTO, ANPR_DTOFECHA, ANPR_TRM
        FROM ANTICIPOS_PROVEEDOR WHERE PREF_PRE = :PREFIJO AND ANPR_NUMERO = :NUMERO
        INTO :ID, :VERNIT, :FEC, :DTOF, :FECDTO, :TRM;
if (TIPO = 21) then
    SELECT FACO_ID, TERC_NIT, FACO_FECHA, FACO_DTOFMONTO, FACO_DTOFFECHA, FACO_TRM
        FROM FACTURAS_COMPRA WHERE PREF_PRE = :PREFIJO AND FACO_NUMERO = :NUMERO
        INTO :ID, :VERNIT, :FEC, :DTOF, :FECDTO, :TRM;
if (TIPO = 24) then
    SELECT DVCO_ID, TERC_NIT, DVCO_FECHA, 0, DVCO_FECHA, DVCO_TRM
        FROM devoluciones_compras WHERE PREF_PRE = :PREFIJO AND DVCO_NUMERO = :NUMERO
        INTO :ID, :VERNIT, :FEC, :DTOF, :FECDTO, :TRM;
if (fecha > FECDTO) then
    DTOF = 0;
if (DTOF IS NULL) then
    DTOF = 0;
if (DTOF <> 0) then
    BEGIN
    SELECT SUM(EGDE_DTOF) FROM EGRESOS_DETALLE WHERE EGDE_IDDOC = :ID AND EGDE_TIPODOC = :TIPO INTO :DTOAPL;
    if (DTOAPL IS NULL) then
        DTOAPL = 0;
    DTOF = DTOF - DTOAPL;
    if ((TRM <> 1) AND (TRM <> 0)) then
        DTOF = DTOF / TRM;
    END
if (ID = 0) then
  ERROR = 1;
ELSE
  BEGIN
  /* VERIFIQUE EL NIT */
  if (VERNIT <> NIT) then
    ERROR = 2;
  else
    BEGIN
    /* VERIFIQUE QUE LA FECHA DEL ABONO SEA POSTERIOR O IGUAL AL DOC */
    if (FEC > FECHA) then
        ERROR = 3;
    ELSE
        BEGIN
        /* CALCULE LOS SALDOS */
        SELECT SUM(SDCP_RTEFTE - SDCP_ABRTFTE), SUM(SDCP_RTIVA - SDCP_ABRTIVA), SUM(SDCP_RTICA - SDCP_ABRTICA)
            FROM SALDOS_DOC_CXPAGAR WHERE SDCP_TIPOREF = :TIPO AND SDCP_IDREF = :ID
            INTO :RTFTE, :RTIVA, :RTICA;
        if (RTFTE IS NULL) then
            RTFTE = 0;
        if (RTIVA IS NULL) then
            RTIVA = 0;
        if (RTICA IS NULL) then
            RTICA = 0;
        /* TRAIGA EL SALDO NETO */
        if (TRM <> 1) then
            execute procedure lee_configuracion ('GENERAL', 'GENERAL', 'MONEDA PREDETERMINADA EN OPERACIONES CON EL EXTERIOR') returning_values (:moneda);
        else    
            MONEDA = 0;
        if (TRM <> 0) then
            BEGIN
            RTFTE = RTFTE / TRM;
            RTIVA = RTIVA / TRM;
            RTICA = RTICA / TRM;
            END
        EXECUTE PROCEDURE SALDO_DOC_CXPAGAR(TIPO, ID, FECHA,MONEDA) returning_values (SALDO);
        if (SALDO = 0) then
            ERROR = 4;
        ELSE
            BEGIN
            /* RESTE LAS RETENCIONES YA QUE SE SUGERIRAN */
            EXECUTE PROCEDURE LEE_CONFIGURACION('CXPAGAR', 'SALDOS', 'DESCONTAR RETENCIONES POR CAUSACION') returning_values (DESC_RTES);
            if (DESC_RTES = 'NO') then
                SALDO = SALDO - RTFTE - RTIVA - RTICA;
            SALDO = SALDO - DTOF;
            END
        END
    END
  END
SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER PROCEDURE SALDO_CLIENTE(
    NIT VARCHAR(20),
    FECHA DATE,
    MONEDA INTEGER)
RETURNS (
    SALDO NUMERIC(18,2))
AS
DECLARE VARIABLE sal numeric(18,2);
declare variable TIPODOC INTEGER;
declare variable IDDOC INTEGER;
BEGIN
fecha = fecha - 1;
saldo = 0;
FOR SELECT MVCL_TIPOREF, MVCL_IDREF FROM movimiento_clientes
    WHERE TERC_NIT = :NIT AND MVCL_FECHA <= :FECHA AND MVCL_ABONO = 'N'
    INTO :TIPODOC, :IDDOC
    DO
    BEGIN
    EXECUTE PROCEDURE saldo_doc_cartera(TIPODOC, IDDOC, FECHA, MONEDA) returning_values (SAL);
    if (SAL <> 0) then
        SALDO = SALDO + SAL;
    END
SUSPEND;
END
^

SET TERM ; ^


/* 20081104 */
SET TERM ^ ;

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

SET TERM ; ^


SET TERM ^ ;

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

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER DEVOLUCIONES_COMPRAS_BI FOR DEVOLUCIONES_COMPRAS
ACTIVE BEFORE INSERT POSITION 0
AS
declare variable NUMERO VARCHAR(6);
declare variable AUTOM CHAR(1);
declare variable EXISTE CHAR(1);
declare variable pregtasa CHAR(2);
BEGIN
if (NEW.DVCO_SIMPLIFICADO IS NULL) then
    NEW.dvco_simplificado = 'N';
if (NEW.numok = 'N') then
  BEGIN
  /* Actualice el contador del prefijo */
  SELECT PREF_ACTUAL, PREF_AUTO FROM PREFIJOS WHERE TIDO_COD = 24 AND PREF_PRE = NEW.PREF_PRE INTO :NUMERO, :AUTOM;
  /* ACTUALICE EL NUMERO EN COMPROBANTE_ENCABEZADO  */
  if (AUTOM = 'S') then
    BEGIN
    NEW.dvco_numero = NUMERO;
    NUMERO = CAST((CAST(NUMERO AS INTEGER) + 1) AS CHAR(6));
    UPDATE PREFIJOS
      SET PREF_ACTUAL = :NUMERO
    WHERE TIDO_COD = 24 AND PREF_PRE = NEW.PREF_PRE;
    END
  ELSE
    BEGIN
    if (CAST(NUMERO AS INTEGER) = CAST(NEW.DVCO_NUMERO AS INTEGER)) then
        UPDATE PREFIJOS
          SET PREF_ACTUAL = CAST((CAST(PREF_ACTUAL AS INTEGER) + 1) AS CHAR(6))
        WHERE TIDO_COD = 24 AND PREF_PRE = NEW.PREF_PRE;
    END
  EXECUTE PROCEDURE COMPLETA_CEROS (NEW.dvco_numero) returning_values (NEW.dvco_numero);
  NEW.numok = 'S';
  END
/* Verifique que el numero no existe previamente */
EXISTE = 'N';
SELECT 'S' FROM DEVOLUCIONES_COMPRAS WHERE PREF_PRE = NEW.PREF_PRE AND DVCO_NUMERO = NEW.DVCO_NUMERO INTO :EXISTE;
if (EXISTE = 'S') then
    EXCEPTION DOCUMENTO_REGISTRADO;
if ((NEW.dvco_trm IS NULL) OR (NEW.DVCO_TRM = 0)) then
    NEW.dvco_trm = 1;
EXECUTE PROCEDURE LEE_CONFIGURACION('GENERAL', 'GENERAL', 'PREGUNTAR TASA DE CAMBIO EN DOCUMENTOS DE CUENTAS POR PAGAR') returning_values (:pregtasa);
if (PREGTASA = 'SI') then
    BEGIN
    NEW.dvco_dtomonto = NEW.dvco_dtomonto * NEW.dvco_trm;
    NEW.dvco_adicional = NEW.dvco_adicional * NEW.dvco_trm;
    NEW.dvco_ivamonto = NEW.dvco_ivamonto * NEW.dvco_trm;
    NEW.dvco_extra = NEW.dvco_extra * NEW.dvco_trm;
    NEW.dvco_rtftemonto = NEW.dvco_rtftemonto * NEW.dvco_trm;
    NEW.dvco_rtivamonto = NEW.dvco_rtivamonto * NEW.dvco_trm;
    NEW.dvco_rticamonto = NEW.dvco_rticamonto * NEW.dvco_trm;
    NEW.dvco_total = NEW.dvco_total * NEW.dvco_trm;
    END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER DEVOLUCIONES_COMPRAS_DET_BI FOR DEVOLUCIONES_COMPRAS_DET
ACTIVE BEFORE INSERT POSITION 0
AS
declare variable trm numeric(18,2);
BEGIN
if (new.dvcd_dtoporc is null) then
    new.dvcd_dtoporc = 0;
/* CALCULE EL MONTO DEL DESCUENTO */
NEW.DVCD_DTOMONTO = NEW.dvcd_prunit * NEW.dvcd_dtoporc / 100;
/* si estaba en otra moneda convierta a pesos */
select dvco_trm from devoluciones_compras where dvco_id = new.dvco_id into :trm;
if (trm <> 1) then
    begin
    new.dvcd_prunit = new.dvcd_prunit * trm;
    new.dvcd_dtomonto = new.dvcd_dtomonto * trm;
    new.dvcd_ivamonto = new.dvcd_ivamonto * trm;
    new.dvcd_consumo = new.dvcd_consumo * trm;
    new.dvcd_total = new.dvcd_total * trm;
    end
END
^

SET TERM ; ^

ALTER TRIGGER NOTAS_DEBITO_PROVEEDOR_AU INACTIVE;
update notas_debito_proveedor set ndpr_trm = 1 where (ndpr_trm is null) OR (NDPR_TRM = 0);
commit work;
ALTER TRIGGER NOTAS_DEBITO_PROVEEDOR_AU ACTIVE;

ALTER TRIGGER FACTURAS_COMPRA_AU INACTIVE;
update facturas_compra set faco_trm = 1 where (faco_trm is null) OR (FACO_TRM = 0);
COMMIT WORK;
ALTER TRIGGER FACTURAS_COMPRA_AU ACTIVE;

ALTER TRIGGER NOTAS_CREDITO_PROVEEDOR_AU INACTIVE;
update notas_credito_proveedor set ncpr_trm = 1 where (ncpr_trm is null) OR (NCPR_TRM = 0);
commit work;
ALTER TRIGGER NOTAS_CREDITO_PROVEEDOR_AU ACTIVE;

ALTER TRIGGER NOTAS_CREDITO_CLIENTES_AU INACTIVE;
update notas_credito_clientes set nccl_trm = 1 where (nccl_trm is null) OR (NCCL_TRM = 0);
commit work;
ALTER TRIGGER NOTAS_CREDITO_CLIENTES_AU ACTIVE;

ALTER TRIGGER notas_debito_clientes_au INACTIVE;
update notas_debito_clientes set ndcl_trm = 1 where (ndcl_trm is null) OR (NDCL_TRM = 0);
commit work;
ALTER TRIGGER NOTAS_DEBITO_CLIENTES_AU ACTIVE;

ALTER TRIGGER FACTURAS_AU INACTIVE;
update facturas set fact_trm = 1 where (fact_trm is null) or (FACT_TRM = 0);
COMMIT WORK;
ALTER TRIGGER FACTURAS_AU ACTIVE;

ALTER TRIGGER DEVOLUCIONES_VENTAS_AU INACTIVE;
update devoluciones_ventas set devt_trm = 1 where (devt_trm is null) or (DEVT_TRM = 0);
COMMIT WORK;
ALTER TRIGGER DEVOLUCIONES_VENTAS_AU ACTIVE;

ALTER TRIGGER devoluciones_compras_au INACTIVE;
update devoluciones_compras set dvco_trm = 1 where (dvco_trm is null) or (DVCO_TRM = 0);
COMMIT WORK;
ALTER TRIGGER devoluciones_compras_au ACTIVE;

ALTER TRIGGER RECIBOS_CAJA_AU INACTIVE;
update RECIBOS_CAJA set RECA_trm = 1 where (RECA_trm is null) or (RECA_TRM = 0);
COMMIT WORK;
ALTER TRIGGER RECIBOS_CAJA_AU ACTIVE;

ALTER TRIGGER egresos_AU INACTIVE;
update EGRESOS set EGRE_trm = 1 where (EGRE_trm is null) or (EGRE_TRM = 0);
COMMIT WORK;
ALTER TRIGGER EGRESOS_AU ACTIVE;

ALTER TRIGGER movimiento_clientes_au INACTIVE;
update movimiento_clientes set mvcl_trm = 1 where (mvcl_trm is null) or (MVCL_TRM = 0);
COMMIT WORK;
ALTER TRIGGER movimiento_clientes_au ACTIVE;

ALTER TRIGGER movimiento_proveedor_au INACTIVE;
update movimiento_proveedor set mvpr_trm = 1 where (mvpr_trm is null) or (MVPR_TRM = 0);
COMMIT WORK;
ALTER TRIGGER movimiento_proveedor_au ACTIVE;

SET TERM ^ ;

CREATE OR ALTER TRIGGER NOTAS_DEBITO_PROVEEDOR_AU FOR NOTAS_DEBITO_PROVEEDOR
ACTIVE AFTER UPDATE POSITION 0
AS
declare variable ABONOS char(1);
declare variable consec INTEGER;
BEGIN
if (new.ndpr_anulado = 'S') then
    begin
    select enco_consec from comprobante_encabezado where enco_tiporef = 51 and enco_idref = old.ndpr_id into :consec;
    if (NOT consec is null) then
      delete from comprobante_detalle where enco_consec = :consec;
    delete from comprobante_encabezado where enco_tiporef = 51 and enco_idref = old.ndpr_id;
    INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
        VALUES (USER, 51, NEW.ndpr_id, 'A', NEW.pref_pre || NEW.ndpr_numero);
    end

/* BORRE EL REGISTRO PREVIO */
if ((old.ndpr_id <> 0) and (old.ndpr_anulado = 'N')) then
    begin
    /* Verifique si habia abonos a la nota */
    ABONOS = 'N';
    select 'S' FROM SALDOS_DOC_CXPAGAR WHERE SDCP_TIPOREF = 51 AND SDCP_IDREF = OLD.NDPR_ID AND SDCP_ABONO <> 0 INTO :ABONOS;
    if (ABONOS = 'N') then
        BEGIN
        /* BORRE EL REGISTRO PREVIO */
        delete from saldos_doc_cxpagar where sdcp_tiporef = 51 and sdcp_idref = old.ndpr_id;
        delete from movimiento_PROVEEDOR where (mvpr_tiporef = 51) and (mvpr_idref = old.ndpr_id);
        END
    else
        exception DOCUMENTO_CON_ABONOS;
    end
if ((new.ndpr_id <> 0) and (new.ndpr_anulado = 'N')) then
    begin
    /* Registre el nuevo saldo del documento */
    INSERT INTO SALDOS_DOC_CXPAGAR (SDCP_TIPOREF, SDCP_IDREF, SDCP_FECHA, TERC_NIT, SDCP_RTEFTE, SDCP_RTIVA, SDCP_RTICA, SDCP_ABONO, SDCP_ABRTFTE, SDCP_ABRTIVA, SDCP_ABRTICA, SDCP_DEBITO, SDCP_MONTO, SDCP_TRM)
        VALUES (51, NEW.NDPR_ID, NEW.ndpr_fecha, NEW.terc_nit, NEW.ndpr_rtftemonto, NEW.ndpr_rtivamonto, NEW.ndpr_rticamonto, 0, 0, 0, 0, 'N', NEW.ndpr_monto+NEW.ndpr_ivamonto, NEW.ndpr_trm);
    /* Registre el movimiento del proveedor */
    INSERT INTO MOVIMIENTO_PROVEEDOR (MVPR_ID, TERC_NIT, MVPR_TIPOREF, MVPR_IDREF, MVPR_FECHA, MVPR_VENCE, MVPR_CONC, MVPR_MONTO, MVPR_RTFTE, MVPR_RTIVA, MVPR_RTICA, MVPR_DEBITO, MVPR_ABONO, MVPR_PREFIJO, MVPR_NUMERO, MVPR_TRM)
        VALUES (GEN_ID(ID_MOVPROV, 1), NEW.TERC_NIT, 51, NEW.NDPR_ID, NEW.NDPR_FECHA, NEW.ndpr_vence, NEW.NDPR_CONC, NEW.NDPR_MONTO+NEW.ndpr_ivamonto, NEW.NDPR_RTFTEMONTO, NEW.NDPR_RTIVAMONTO, NEW.NDPR_RTICAMONTO, 'S', 'N', NEW.pref_pre, NEW.ndpr_numero, NEW.ndpr_trm);
    INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
        VALUES (USER, 51, NEW.ndpr_id, 'U', NEW.pref_pre || NEW.ndpr_numero);
    end
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER NOTAS_DEBITO_PROVEEDOR_AI FOR NOTAS_DEBITO_PROVEEDOR
ACTIVE AFTER INSERT POSITION 0
AS
BEGIN
  if ((NEW.NDPR_ID <> 0) and (new.ndpr_anulado = 'N')) then
    BEGIN
    INSERT INTO SALDOS_DOC_CXPAGAR (SDCP_TIPOREF, SDCP_IDREF, SDCP_FECHA, TERC_NIT, SDCP_RTEFTE, SDCP_RTIVA, SDCP_RTICA, SDCP_ABONO, SDCP_ABRTFTE, SDCP_ABRTIVA, SDCP_ABRTICA, SDCP_DEBITO, SDCP_MONTO, SDCP_TRM)
        VALUES (51, NEW.NDPR_ID, NEW.ndpr_fecha, NEW.terc_nit, NEW.ndpr_rtftemonto, NEW.ndpr_rtivamonto, NEW.ndpr_rticamonto, 0, 0, 0, 0, 'S', NEW.ndpr_monto+NEW.ndpr_ivamonto, NEW.ndpr_trm);
    /* Registre el movimiento del proveedor */
    INSERT INTO MOVIMIENTO_PROVEEDOR (MVPR_ID, TERC_NIT, MVPR_TIPOREF, MVPR_IDREF, MVPR_FECHA, MVPR_VENCE, MVPR_CONC, MVPR_MONTO, MVPR_RTFTE, MVPR_RTIVA, MVPR_RTICA, MVPR_DEBITO, MVPR_ABONO, MVPR_PREFIJO, MVPR_NUMERO, MVPR_TRM)
      VALUES (GEN_ID(ID_MOVPROV, 1), NEW.TERC_NIT, 51, NEW.NDPR_ID, NEW.NDPR_FECHA, NEW.NDPR_VENCE, NEW.NDPR_CONC, NEW.NDPR_MONTO+NEW.ndpr_Ivamonto, NEW.NDPR_RTFTEMONTO, NEW.NDPR_RTIVAMONTO, NEW.NDPR_RTICAMONTO, 'S', 'N', NEW.pref_pre, NEW.ndpr_numero, NEW.ndpr_trm);
    INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
        VALUES (USER, 51, NEW.ndpr_id, 'I', NEW.pref_pre || NEW.ndpr_numero);
    END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER NOTAS_CREDITO_PROVEEDOR_AI FOR NOTAS_CREDITO_PROVEEDOR
ACTIVE AFTER INSERT POSITION 0
AS
declare variable COSTO NUMERIC(18,2);
declare variable EXISTENCIA NUMERIC(18,4);
declare variable CODBOD VARCHAR(3);
BEGIN
if ((NEW.NCPR_ID <> 0) and (new.ncpr_anulado = 'N')) then
    BEGIN
    /* Registre el nuevo saldo del documento */
    INSERT INTO SALDOS_DOC_CXPAGAR (SDCP_TIPOREF, SDCP_IDREF, SDCP_FECHA, TERC_NIT, SDCP_RTEFTE, SDCP_RTIVA, SDCP_RTICA, SDCP_ABONO, SDCP_ABRTFTE, SDCP_ABRTIVA, SDCP_ABRTICA, SDCP_DEBITO, SDCP_MONTO, SDCP_TRM)
        VALUES (52, NEW.NCPR_ID, NEW.ncpr_fecha, NEW.terc_nit, (NEW.ncpr_rtftemonto * -1), (NEW.ncpr_rtivamonto * -1), (NEW.ncpr_rticamonto * -1), 0, 0, 0, 0, 'N', (NEW.ncpr_monto+NEW.ncpr_ivamonto)*-1, NEW.ncpr_trm);
    /* Registre el movimiento del proveedor */
    INSERT INTO MOVIMIENTO_PROVEEDOR (MVPR_ID, TERC_NIT, MVPR_TIPOREF, MVPR_IDREF, MVPR_FECHA, MVPR_VENCE, MVPR_CONC, MVPR_MONTO, MVPR_RTFTE, MVPR_RTIVA, MVPR_RTICA, MVPR_DEBITO, MVPR_ABONO, MVPR_PREFIJO, MVPR_NUMERO, MVPR_TRM)
      VALUES (GEN_ID(ID_MOVPROV, 1), NEW.TERC_NIT, 52, NEW.NCPR_ID, NEW.NCPR_FECHA, NEW.NCPR_FECHA, NEW.NCPR_CONC, NEW.NCPR_MONTO+NEW.NCPR_IVAMONTO, NEW.NCPR_RTFTEMONTO, NEW.NCPR_RTIVAMONTO, NEW.NCPR_RTICAMONTO, 'N', 'N', NEW.pref_pre, NEW.ncpr_numero, NEW.ncpr_trm);
    /* afecte el articulo */
    if (new.arti_cod <> '') then
        begin
        /* CALCULE EL NUEVO COSTO */
        execute procedure costo_promedio (new.arti_cod, new.ncpr_fecha) returning_values (:COSTO);
        execute procedure saldo_total_inventario (new.arti_cod, new.ncpr_fecha) returning_values (:EXISTENCIA);
        COSTO = (COSTO * EXISTENCIA - (NEW.ncpr_monto - NEW.ncpr_ivamonto)) / EXISTENCIA;
        FOR SELECT DISTINCT BODE_COD FROM EXISTENCIA WHERE ARTI_COD = NEW.ARTI_COD INTO :CODBOD do
            BEGIN
            execute procedure saldo_inventario (new.arti_cod, :CODBOD, new.ncpr_fecha) returning_values (:EXISTENCIA);
            /* SAQUE TODO LO QUE TENGA */
            INSERT INTO MOVIMIENTO_ARTICULO
              (ARTI_COD, MVAR_CONS, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM, TERC_NIT)
              VALUES(NEW.ARTI_COD, GEN_ID(ID_MOVARTI,1), :CODBOD, new.ncpr_fecha, 52, NEW.ncpr_id,
              new.ncpr_conc, :EXISTENCIA, 0, 'N', '', new.pref_pre, new.ncpr_numero, 1, new.terc_nit);
            /* META TODO CON EL NUEVO COSTO */
            INSERT INTO MOVIMIENTO_ARTICULO
              (ARTI_COD, MVAR_CONS, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM, TERC_NIT)
              VALUES(NEW.ARTI_COD, GEN_ID(ID_MOVARTI,1), :CODBOD, new.ncpr_fecha, 52, NEW.ncpr_id,
              new.ncpr_conc, :EXISTENCIA, :COSTO, 'S', '', new.pref_pre, new.ncpr_numero, 1, new.terc_nit);
            END
        /* RECORRA LAS LISTAS DE PRECIOS Y CAMBIE EL PRECIO */
        EXECUTE PROCEDURE CALCULA_PRECIOS(NEW.ARTI_COD, new.ncpr_fecha);
        end
    INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
        VALUES (USER, 52, NEW.ncpr_id, 'I', NEW.pref_pre || NEW.ncpr_numero);
    END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER NOTAS_CREDITO_PROVEEDOR_AU FOR NOTAS_CREDITO_PROVEEDOR
ACTIVE AFTER UPDATE POSITION 0
AS
declare variable ABONOS char(1);
declare variable consec INTEGER;
declare variable COSTO NUMERIC(18,2);
declare variable EXISTENCIA NUMERIC(18,4);
declare variable CODBOD VARCHAR(3);
BEGIN
if (new.ncpr_anulado = 'S') then
    begin
    select enco_consec from comprobante_encabezado where enco_tiporef = 52 and enco_idref = old.ncpr_id into :consec;
    if (NOT consec is null) then
      delete from comprobante_detalle where enco_consec = :consec;
    delete from comprobante_encabezado where enco_tiporef = 52 and enco_idref = old.ncpr_id;
    INSERT INTO AUDITORIA (AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
        VALUES (USER, 52, new.ncpr_id, 'A', NEW.pref_pre || NEW.ncpr_numero);
    end

/* BORRE EL REGISTRO PREVIO */
if ((old.ncpr_id <> 0) and (old.ncpr_anulado = 'N')) then
    begin
    /* Verifique si habia abonos a la nota */
    ABONOS = 'N';
    select 'S' FROM SALDOS_DOC_CXPAGAR WHERE SDCP_TIPOREF = 52 AND SDCP_IDREF = OLD.NCPR_ID AND SDCP_ABONO <> 0 INTO :ABONOS;
    if (ABONOS = 'N') then
        BEGIN
        /* BORRE EL REGISTRO PREVIO */
        delete from saldos_doc_cxpagar where sdcp_tiporef = 52 and sdcp_idref = old.ncpr_id;
        delete from movimiento_PROVEEDOR where (mvpr_tiporef = 52) and (mvpr_idref = old.ncpr_id);
        delete from movimiento_articulo where  (mvar_tipodoc = 52) and (mvar_idref = old.ncpr_id);
        END
    else
        exception DOCUMENTO_CON_ABONOS;
    end
if ((new.ncpr_id <> 0) and (new.ncpr_anulado = 'N')) then
    begin
    /* Registre el nuevo saldo del documento */
    INSERT INTO SALDOS_DOC_CXPAGAR (SDCP_TIPOREF, SDCP_IDREF, SDCP_FECHA, TERC_NIT, SDCP_RTEFTE, SDCP_RTIVA, SDCP_RTICA, SDCP_ABONO, SDCP_ABRTFTE, SDCP_ABRTIVA, SDCP_ABRTICA, SDCP_DEBITO, SDCP_MONTO, SDCP_TRM)
        VALUES (52, NEW.NCPR_ID, NEW.ncpr_fecha, NEW.terc_nit, (NEW.ncpr_rtftemonto * -1), (NEW.ncpr_rtivamonto * -1), (NEW.ncpr_rticamonto * -1), 0, 0, 0, 0, 'N', (NEW.ncpr_monto+NEW.ncpr_ivamonto)*-1, NEW.ncpr_trm);
    /* Registre el movimiento del proveedor */
    INSERT INTO MOVIMIENTO_PROVEEDOR (MVPR_ID, TERC_NIT, MVPR_TIPOREF, MVPR_IDREF, MVPR_FECHA, MVPR_VENCE, MVPR_CONC, MVPR_MONTO, MVPR_RTFTE, MVPR_RTIVA, MVPR_RTICA, MVPR_DEBITO, MVPR_ABONO, MVPR_PREFIJO, MVPR_NUMERO, MVPR_TRM)
        VALUES (GEN_ID(ID_MOVPROV, 1), NEW.TERC_NIT, 52, NEW.NCPR_ID, NEW.NCPR_FECHA, NEW.NCPR_FECHA, NEW.NCPR_CONC, NEW.NCPR_MONTO+NEW.ncpr_ivamonto, NEW.NCPR_RTFTEMONTO, NEW.NCPR_RTIVAMONTO, NEW.NCPR_RTICAMONTO, 'N', 'N', NEW.pref_pre, NEW.ncpr_numero, NEW.ncpr_trm);
    /* afecte el articulo */
    if (new.arti_cod <> '') then
        begin
        /* CALCULE EL NUEVO COSTO */
        execute procedure costo_promedio (new.arti_cod, new.ncpr_fecha) returning_values (:COSTO);
        execute procedure saldo_total_inventario (new.arti_cod, new.ncpr_fecha) returning_values (:EXISTENCIA);
        COSTO = (COSTO * EXISTENCIA - (NEW.ncpr_monto - NEW.ncpr_ivamonto)) / EXISTENCIA;
        FOR SELECT DISTINCT BODE_COD FROM EXISTENCIA WHERE ARTI_COD = NEW.ARTI_COD INTO :CODBOD do
            BEGIN
            execute procedure saldo_inventario (new.arti_cod, :CODBOD, new.ncpr_fecha) returning_values (:EXISTENCIA);
            /* SAQUE TODO LO QUE TENGA */
            INSERT INTO MOVIMIENTO_ARTICULO
                (ARTI_COD, MVAR_CONS, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM, TERC_NIT)
                VALUES(NEW.ARTI_COD, GEN_ID(ID_MOVARTI,1), :CODBOD, new.ncpr_fecha, 52, NEW.ncpr_id,
                new.ncpr_conc, :EXISTENCIA, 0, 'N', '', new.pref_pre, new.ncpr_numero, 1, new.terc_nit);
            /* META TODO CON EL NUEVO COSTO */
            INSERT INTO MOVIMIENTO_ARTICULO
                (ARTI_COD, MVAR_CONS, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM, TERC_NIT)
                VALUES(NEW.ARTI_COD, GEN_ID(ID_MOVARTI,1), :CODBOD, new.ncpr_fecha, 52, NEW.ncpr_id,
                new.ncpr_conc, :EXISTENCIA, :COSTO, 'S', '', new.pref_pre, new.ncpr_numero, 1, new.terc_nit);
            END
        /* RECORRA LAS LISTAS DE PRECIOS Y CAMBIE EL PRECIO */
        EXECUTE PROCEDURE CALCULA_PRECIOS(NEW.ARTI_COD, new.ncpr_fecha);
        end
    INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
        VALUES (USER, 52, NEW.ncpr_id, 'U', NEW.pref_pre || NEW.ncpr_numero);
    end
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER DEVOLUCIONES_COMPRAS_AI FOR DEVOLUCIONES_COMPRAS
ACTIVE AFTER INSERT POSITION 0
AS
declare variable CONC VARCHAR(60);
BEGIN
if ((NEW.DVCO_ID <> 0) and (new.dvco_anulado = 'N')) then
    BEGIN
    /* Registre el nuevo saldo del documento */
    INSERT INTO saldos_doc_cxpagar (SDCP_TIPOREF, SDCP_IDREF, SDCP_FECHA, TERC_NIT, SDCP_RTEFTE, SDCP_RTIVA, SDCP_RTICA, SDCP_ABONO, SDCP_ABRTFTE, SDCP_ABRTIVA, SDCP_ABRTICA, SDCP_DEBITO, SDCP_MONTO, SDCP_TRM)
        VALUES (24, NEW.DVCO_ID, NEW.DVCO_fecha, NEW.terc_nit, (NEW.DVCO_rtftemonto*-1), (NEW.DVCO_rtivamonto*-1), (NEW.DVCO_rticamonto*-1), 0, 0, 0, 0, 'N', (NEW.DVCO_TOTAL*-1), NEW.dvco_trm);
    /* Registre el movimiento del cliente */
    CONC = 'DEVOLUCION COMPRA No.' || NEW.PREF_PRE || NEW.DVCO_NUMERO;
    INSERT INTO movimiento_proveedor (MVPR_ID, TERC_NIT, MVPR_TIPOREF, MVPR_IDREF, MVPR_FECHA, MVPR_VENCE, MVPR_CONC, MVPR_MONTO, MVPR_RTFTE, MVPR_RTIVA, MVPR_RTICA, MVPR_DEBITO, MVPR_ABONO, MVPR_PREFIJO, MVPR_NUMERO, MVPR_TRM)
      VALUES (GEN_ID(ID_MOVPROV, 1), NEW.TERC_NIT, 24, NEW.DVCO_ID, NEW.DVCO_FECHA, NEW.DVCO_FECHA, :CONC, NEW.DVCO_TOTAL, NEW.DVCO_RTFTEMONTO, NEW.DVCO_RTIVAMONTO, NEW.DVCO_RTICAMONTO, 'N', 'N', NEW.pref_pre, NEW.DVCO_numero, NEW.dvco_trm);
    /* ACTUALICE LA CONSOLIDACION */
    if (NEW.DVCO_CONSOLIDA <> 0) then
        UPDATE consolidado_faltantes SET COFA_IDDES = NEW.dvco_id, COFA_OK = 'S' WHERE COFA_ID = NEW.dvco_consolida;
    INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
        VALUES (USER, 24, NEW.dvco_id, 'I', NEW.pref_pre || NEW.dvco_numero);
    END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER DEVOLUCIONES_COMPRAS_AU FOR DEVOLUCIONES_COMPRAS
ACTIVE AFTER UPDATE POSITION 0
AS
declare variable ABONOS integer;
declare variable CONC VARCHAR(60);
declare variable consec INTEGER;
BEGIN
/* BORRE LA CONTABILIZACION */
if (new.dvco_anulado = 'S') then
    begin
    select enco_consec from comprobante_encabezado where enco_tiporef = 24 and enco_idref = old.dvco_id into :consec;
    if (NOT consec is null) then
      delete from comprobante_detalle where enco_consec = :consec;
    delete from comprobante_encabezado where enco_tiporef = 24 and enco_idref = old.dvco_id;
    INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
        VALUES (USER, 24, NEW.dvco_id, 'A', NEW.pref_pre || NEW.dvco_numero);
    end

/* deshaga lo viejo y gabe lo nuevo*/
if ((old.DVCO_id <> 0) and (old.dvco_anulado = 'N')) then
    begin
    /* Verifique si habia abonos a la nota */
    ABONOS = 0;
    select COUNT(*) FROM saldos_doc_cxpagar WHERE SDCP_TIPOREF = 24 AND SDCP_IDREF = OLD.DVCO_ID AND SDCP_ABONO <> 0 INTO :ABONOS;
    if (ABONOS = 0) then
        BEGIN
        /* BORRE EL REGISTRO PREVIO */
        delete from saldos_doc_cxpagar where sdcp_tiporef = 24 and sdcp_idref = old.dvco_id;
        delete from movimiento_proveedor where (mvpr_tiporef = 24) and (mvpr_idref = old.dvco_id);
        /* ACTUALICE LA CONSOLIDACION */
        if (OLD.DVCO_CONSOLIDA <> 0) then
            UPDATE consolidado_faltantes SET COFA_OK = 'N' WHERE COFA_ID = OLD.dvco_consolida;
        END
    else
        exception DOCUMENTO_CON_ABONOS;
    END
/* registre lo nuevo */
if ((new.DVCO_id <> 0) and (new.dvco_anulado = 'N')) then
    begin
    /* Registre el nuevo saldo del documento */
    INSERT INTO saldos_doc_cxpagar (SDCP_TIPOREF, SDCP_IDREF, SDCP_FECHA, TERC_NIT, SDCP_RTEFTE, SDCP_RTIVA, SDCP_RTICA, SDCP_ABONO, SDCP_ABRTFTE, SDCP_ABRTIVA, SDCP_ABRTICA, SDCP_DEBITO, SDCP_MONTO, SDCP_TRM)
        VALUES (24, NEW.DVCO_ID, NEW.DVCO_fecha, NEW.terc_nit, (NEW.DVCO_rtftemonto*-1), (NEW.DVCO_rtivamonto*-1), (NEW.DVCO_rticamonto*-1), 0, 0, 0, 0, 'N', (NEW.DVCO_TOTAL*-1), NEW.dvco_trm);
    /* Registre el movimiento del cliente */
    CONC = 'DEVOLUCION COMPRA No.' || NEW.PREF_PRE || NEW.DVCO_NUMERO;
    INSERT INTO MOVIMIENTO_PROVEEDOR (MVPR_ID, TERC_NIT, MVPR_TIPOREF, MVPR_IDREF, MVPR_FECHA, MVPR_VENCE, MVPR_CONC, MVPR_MONTO, MVPR_RTFTE, MVPR_RTIVA, MVPR_RTICA, MVPR_DEBITO, MVPR_ABONO, MVPR_PREFIJO, MVPR_NUMERO, MVPR_TRM)
        VALUES (GEN_ID(ID_MOVPROV, 1), NEW.TERC_NIT, 24, NEW.DVCO_ID, NEW.DVCO_FECHA, NEW.DVCO_FECHA, :CONC, NEW.DVCO_TOTAL, NEW.DVCO_RTFTEMONTO, NEW.DVCO_RTIVAMONTO, NEW.DVCO_RTICAMONTO, 'N', 'N', NEW.pref_pre, NEW.DVCO_numero, NEW.dvco_trm);
    /* ACTUALICE LA CONSOLIDACION */
    if (NEW.DVCO_CONSOLIDA <> 0) then
        UPDATE consolidado_faltantes SET COFA_IDDES = NEW.dvco_id, COFA_OK = 'S' WHERE COFA_ID = NEW.dvco_consolida;
    INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
        VALUES (USER, 24, NEW.dvco_id, 'U', NEW.pref_pre || NEW.dvco_numero);
    END
/* si cambio un dato critico actualice el detalle */
if ((OLD.dvco_fecha <> NEW.dvco_fecha) or
    (OLD.dvco_numero <> NEW.dvco_numero) or
    (OLD.pref_pre <> NEW.pref_pre) ) then
    UPDATE devoluciones_compras_det SET DVCD_TRANSMIT = 'N'
      WHERE DVCO_ID = OLD.dvco_id;
/* ACTUALICE EL ANULADO EN LOS DETALLES */
if (OLD.DVCO_anulado <> NEW.DVCO_anulado) then
    UPDATE devoluciones_compras_det SET DVCD_ANULADO = NEW.DVCO_anulado
        WHERE DVCO_ID = NEW.DVCO_ID;
if (OLD.dvco_transmit <> NEW.dvco_transmit) then
    UPDATE devoluciones_compras_det SET DVCD_TRANSMIT = NEW.dvco_transmit
        WHERE DVCO_ID = NEW.DVCO_ID;
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER ANTICIPOS_PROVEEDOR_BI FOR ANTICIPOS_PROVEEDOR
ACTIVE BEFORE INSERT POSITION 0
AS
declare variable NUMERO VARCHAR(6);
declare variable AUTOM CHAR(1);
declare variable EXISTE CHAR(1);
declare variable pregtasa CHAR(2);
BEGIN
if (NEW.numok = 'N') then
  BEGIN
  /* Actualice el contador del prefijo */
  SELECT PREF_ACTUAL, PREF_AUTO FROM PREFIJOS WHERE TIDO_COD = NEW.TIDO_COD AND PREF_PRE = NEW.PREF_PRE INTO :NUMERO, :AUTOM;
  /* ACTUALICE EL NUMERO EN COMPROBANTE_ENCABEZADO  */
  if (AUTOM = 'S') then
    BEGIN
    NEW.ANPR_NUMERO = NUMERO;
    NUMERO = CAST((CAST(NUMERO AS INTEGER) + 1) AS CHAR(6));
    UPDATE PREFIJOS
      SET PREF_ACTUAL = :NUMERO
    WHERE TIDO_COD = NEW.TIDO_COD AND PREF_PRE = NEW.PREF_PRE;
    END
  ELSE
    BEGIN
    if (CAST(NUMERO AS INTEGER) = CAST(NEW.ANPR_NUMERO AS INTEGER)) then
        UPDATE PREFIJOS
          SET PREF_ACTUAL = CAST((CAST(PREF_ACTUAL AS INTEGER) + 1) AS CHAR(6))
        WHERE TIDO_COD = NEW.TIDO_COD AND PREF_PRE = NEW.PREF_PRE;
    END
  EXECUTE PROCEDURE completa_ceros(NEW.ANPR_numero) returning_values (NEW.ANPR_numero);
  NEW.numok = 'S';
  END
/* Verifique que el numero no existe previamente */
EXISTE = 'N';
SELECT 'S' FROM ANTICIPOS_PROVEEDOR WHERE PREF_PRE = NEW.PREF_PRE AND ANPR_NUMERO = NEW.ANPR_NUMERO INTO :EXISTE;
if (EXISTE = 'S') then
    EXCEPTION DOCUMENTO_REGISTRADO;
/* Complete con ceros los campos nulos */
if (NEW.ANPR_BASE IS NULL) then
    NEW.ANPR_BASE = 0;
if (NEW.ANPR_RTFTEPORC IS NULL) then
    NEW.ANPR_RTFTEPORC = 0;
if (NEW.ANPR_RTIVAPORC IS NULL) then
    NEW.ANPR_RTIVAPORC = 0;
if (NEW.ANPR_RTICAPORC IS NULL) then
    NEW.ANPR_RTICAPORC = 0;
if (NEW.ANPR_RTFTEMONTO IS NULL) then
    NEW.ANPR_RTFTEMONTO = 0;
if (NEW.ANPR_RTIVAMONTO IS NULL) then
    NEW.ANPR_RTIVAMONTO = 0;
if (NEW.ANPR_RTICAMONTO IS NULL) then
    NEW.ANPR_RTICAMONTO = 0;
if (NEW.ANPR_DTOFPORC IS NULL) then
    NEW.ANPR_DTOFPORC = 0;
if (NEW.ANPR_DTOFMONTO IS NULL) then
    NEW.ANPR_DTOFMONTO = 0;
if ((NEW.anpr_trm IS NULL) AND (NEW.ANPR_TRM = 0)) then
    NEW.anpr_trm = 1;
EXECUTE PROCEDURE LEE_CONFIGURACION('GENERAL', 'GENERAL', 'PREGUNTAR TASA DE CAMBIO EN DOCUMENTOS DE CUENTAS POR PAGAR') returning_values (:pregtasa);
if (PREGTASA = 'SI') then
    BEGIN
    NEW.anpr_base = NEW.anpr_base * NEW.anpr_trm;
    NEW.anpr_ivamonto = NEW.anpr_ivamonto * NEW.anpr_trm;
    NEW.anpr_rtftemonto = NEW.anpr_rtftemonto * NEW.anpr_trm;
    NEW.anpr_rtivamonto = NEW.anpr_rtivamonto * NEW.anpr_trm;
    NEW.anpr_rticamonto = NEW.anpr_rticamonto * NEW.anpr_trm;
    NEW.anpr_dtofmonto = NEW.anpr_dtofmonto * NEW.anpr_trm;
    END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER ANTICIPOS_PROVEEDOR_AI FOR ANTICIPOS_PROVEEDOR
ACTIVE AFTER INSERT POSITION 0
AS
BEGIN
  if ((NEW.ANPR_ID <> 0) and (new.anpr_anulado = 'N')) then
    BEGIN
    INSERT INTO SALDOS_DOC_CXPAGAR (SDCP_TIPOREF, SDCP_IDREF, SDCP_FECHA, TERC_NIT, SDCP_RTEFTE, SDCP_RTIVA, SDCP_RTICA, SDCP_ABONO, SDCP_ABRTFTE, SDCP_ABRTIVA, SDCP_ABRTICA, SDCP_DEBITO, SDCP_MONTO, SDCP_TRM)
        VALUES (55, NEW.ANPR_ID, NEW.anpr_fecha, NEW.terc_nit, (NEW.anpr_rtftemonto*-1), (NEW.anpr_rtivamonto*-1), (NEW.anpr_rticamonto*-1), 0, 0, 0, 0, 'N', (NEW.anpr_base+NEW.anpr_ivamonto)*-1, NEW.anpr_trm);
    /* Registre el movimiento del proveedor */
    INSERT INTO MOVIMIENTO_PROVEEDOR (MVPR_ID, TERC_NIT, MVPR_TIPOREF, MVPR_IDREF, MVPR_FECHA, MVPR_VENCE, MVPR_CONC, MVPR_MONTO, MVPR_RTFTE, MVPR_RTIVA, MVPR_RTICA, MVPR_DEBITO, MVPR_ABONO, MVPR_PREFIJO, MVPR_NUMERO, MVPR_TRM)
      VALUES (GEN_ID(ID_MOVPROV, 1), NEW.TERC_NIT, 55, NEW.ANPR_ID, NEW.ANPR_FECHA, NEW.ANPR_FECHA, NEW.ANPR_CONC, NEW.ANPR_BASE+NEW.anpr_ivamonto, NEW.ANPR_RTFTEMONTO, NEW.ANPR_RTIVAMONTO, NEW.ANPR_RTICAMONTO, 'N', 'N', NEW.pref_pre, NEW.anpr_numero, NEW.anpr_trm);
    INSERT INTO AUDITORIA (AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
        VALUES (USER, 55, NEW.anpr_id, 'I', NEW.pref_pre || NEW.anpr_numero);
    END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER ANTICIPOS_PROVEEDOR_AU FOR ANTICIPOS_PROVEEDOR
ACTIVE AFTER UPDATE POSITION 0
AS
declare variable ABONOS char(1);
declare variable consec INTEGER;
BEGIN
/* borre lo viejo y guarde lo nuevo */
if ((old.anpr_id <> 0) and (old.anpr_anulado = 'N')) then
    begin
    /* Verifique si habia abonos a la nota */
    ABONOS = 'N';
    select 'S' FROM SALDOS_DOC_CXPAGAR WHERE SDCP_TIPOREF = 55 AND SDCP_IDREF = OLD.ANPR_ID AND SDCP_ABONO <> 0 INTO :ABONOS;
    if (ABONOS = 'N') then
        BEGIN
        /* BORRE EL REGISTRO PREVIO */
        delete from saldos_doc_cxpagar where sdcp_tiporef = 55 and sdcp_idref = old.anpr_id;
        delete from movimiento_PROVEEDOR where (mvpr_tiporef = 55) and (mvpr_idref = old.anpr_id);
        /* borre la contabilizacion */
        if (new.anpr_anulado = 'S') then
            begin
            select enco_consec from comprobante_encabezado where enco_tiporef = 55 and enco_idref = old.anpr_id into :consec;
            if (NOT consec is null) then
              delete from comprobante_detalle where enco_consec = :consec;
            delete from comprobante_encabezado where enco_tiporef = 55 and enco_idref = old.anpr_id;
            INSERT INTO AUDITORIA (AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
                VALUES (USER, 55, NEW.anpr_id, 'A', NEW.pref_pre || NEW.anpr_numero);
            end
        END
    else
        exception DOCUMENTO_CON_ABONOS;
    END
if ((new.anpr_id <> 0) and (new.anpr_anulado = 'N')) then
    begin
    /* Registre el nuevo saldo del documento */
    INSERT INTO SALDOS_DOC_CXPAGAR (SDCP_TIPOREF, SDCP_IDREF, SDCP_FECHA, TERC_NIT, SDCP_RTEFTE, SDCP_RTIVA, SDCP_RTICA, SDCP_ABONO, SDCP_ABRTFTE, SDCP_ABRTIVA, SDCP_ABRTICA, SDCP_DEBITO, SDCP_MONTO, SDCP_TRM)
        VALUES (55, NEW.ANPR_ID, NEW.anpr_fecha, NEW.terc_nit, (NEW.anpr_rtftemonto*-1), (NEW.anpr_rtivamonto*-1), (NEW.anpr_rticamonto*-1), 0, 0, 0, 0, 'N', (NEW.anpr_BASE+NEW.anpr_ivamonto)*-1, NEW.anpr_trm);
    /* Registre el movimiento del proveedor */
    INSERT INTO MOVIMIENTO_PROVEEDOR (MVPR_ID, TERC_NIT, MVPR_TIPOREF, MVPR_IDREF, MVPR_FECHA, MVPR_VENCE, MVPR_CONC, MVPR_MONTO, MVPR_RTFTE, MVPR_RTIVA, MVPR_RTICA, MVPR_DEBITO, MVPR_ABONO, MVPR_PREFIJO, MVPR_NUMERO, MVPR_TRM)
        VALUES (GEN_ID(ID_MOVPROV, 1), NEW.TERC_NIT, 55, NEW.ANPR_ID, NEW.ANPR_FECHA, NEW.ANPR_FECHA, NEW.ANPR_CONC, NEW.ANPR_BASE+NEW.anpr_ivamonto, NEW.ANPR_RTFTEMONTO, NEW.ANPR_RTIVAMONTO, NEW.ANPR_RTICAMONTO, 'N', 'N', NEW.pref_pre, NEW.anpr_numero, NEW.anpr_trm);
    INSERT INTO AUDITORIA (AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
        VALUES (USER, 55, NEW.anpr_id, 'U', NEW.pref_pre || NEW.anpr_numero);
    end
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER PROCEDURE FACTURAR_CONCEPTOS(
    ID INTEGER,
    NITINI VARCHAR(20),
    NITFIN VARCHAR(20),
    AGRINI VARCHAR(20),
    AGRFIN VARCHAR(20),
    AGRUPA INTEGER,
    FECHA DATE)
RETURNS (
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(6),
    NIT VARCHAR(20),
    NOMBRE VARCHAR(60),
    TOTAL NUMERIC(18,2))
AS
declare variable IDF INTEGER;
declare variable IDC INTEGER;
declare variable VEND INTEGER;
declare variable PTVT INTEGER;
declare variable VENDINI INTEGER;
declare variable VENDFIN INTEGER;
declare variable ZONINI CHAR(2);
declare variable ZONFIN CHAR(2);
declare variable grpini INTEGER;
declare variable grpfin INTEGER;
declare variable DIAS INTEGER;
declare variable OBS VARCHAR(255);
declare variable IVAINC CHAR(1);
declare variable ITEM INTEGER;
declare variable ARTICULO VARCHAR(20);
declare variable DESCR VARCHAR(60);
declare variable CANT NUMERIC(18,2);
declare variable PRUNIT NUMERIC(18,2);
declare variable IVAP NUMERIC(18,2);
declare variable IVAM NUMERIC(18,2);
declare variable BASE NUMERIC(18,2);
declare variable RTFTE NUMERIC(9,2);
declare variable RTIVA NUMERIC(9,2);
declare variable RTICA NUMERIC(9,2);
declare variable RTFTEM NUMERIC(18,2);
declare variable RTIVAM NUMERIC(18,2);
declare variable RTICAM NUMERIC(18,2);
declare variable UNIDAD VARCHAR(8);
declare variable BOD VARCHAR(2);
declare variable ERROR INTEGER;
declare variable VER CHAR(1);
begin
if (agrupa = 0) then
    BEGIN
    VENDINI = 0;
    VENDFIN = 999999;
    GRPINI = 0;
    GRPFIN = 999999;
    ZONINI = '';
    ZONFIN = 'zz';
    END
if (agrupa = 1) then
    BEGIN
    VENDINI = 0;
    VENDFIN = 999999;
    ZONINI = '';
    ZONFIN = 'zz';
    GRPINI = AGRINI;
    GRPFIN = AGRFIN;
    END
if (agrupa = 2) then
    BEGIN
    GRPINI = 0;
    GRPFIN = 999999;
    ZONINI = '';
    ZONFIN = 'zz';
    VENDINI = AGRINI;
    VENDFIN = AGRFIN;
    END
if (agrupa = 3) then
    BEGIN
    VENDINI = 0;
    VENDFIN = 999999;
    GRPINI = 0;
    GRPFIN = 999999;
    ZONINI = AGRINI;
    ZONFIN = AGRFIN;
    END
SELECT FACC_PREF, FACC_VEND, FACC_DIAS, FACC_PTVT, FACC_OBS FROM factura_concepto WHERE FACC_ID = :ID
    INTO :prefijo, :vend, :dias, :ptvt, :obs;
SELECT BODE_COD FROM punto_venta WHERE PTVT_ID = :PTVT INTO :BOD;
FOR SELECT T.TERC_NIT, TERC_NOM, C.vend_cod, C.clie_rtefte, C.clie_rteiva, C.clie_rteica, C.clie_rtftebase
    FROM TERCEROS T, CLIENTES C
    WHERE T.terc_nit = C.terc_nit AND T.TERC_NIT >= :NITINI AND T.TERC_NIT <= :NITFIN AND
        C.vend_cod >= :vendini AND C.vend_cod <= :vendfin AND ((c.grca_cod is null and :grpini = 0 ) or (C.grca_cod >= :grpini AND C.grca_cod <= :grpfin)) AND
        ((c.zona_cod is null and :zonini = '') or (C.zona_cod >= :zonini AND C.zona_cod <= :zonfin))
    INTO :NIT, :NOMBRE, :VEND, :RTFTE, :RTIVA, :RTICA, :RTFTEM
    DO
    BEGIN
    SELECT PREF_ACTUAL, PREF_IVAINC FROM PREFIJOS WHERE TIDO_COD = 31 AND PREF_PRE = :prefijo
        INTO :NUMERO, :IVAINC;
    select max(INVE_ID) FROM interfaz_ventas WHERE PREF_PRE = :prefijo AND TIDO_COD = 31 INTO :IDC;

    /* CALCULE EL TOTAL DE LA FACTURA XA EFECTOS DE IMPUESTOS */
    SELECT SUM(FACI_CANT * FACI_PRUNIT * TAIV_PORC / 100), SUM(FACI_CANT * FACI_PRUNIT), SUM(FACI_CANT * FACI_PRUNIT / (100 + TAIV_PORC) * TAIV_PORC / 100)
        FROM factura_concepto_items F, ARTICULO A, TARIFA_IVA I
        WHERE F.arti_cod = A.arti_cod AND A.taiv_cod = I.taiv_cod AND FACC_ID = :ID
        INTO :IVAM, :TOTAL, IVAP;

    if (IVAINC = 'S') then
        BEGIN
        IVAM = IVAP;
        BASE = TOTAL - IVAM;
        END
    ELSE
        BASE = TOTAL;
    if (BASE >= RTFTEM) then
        BEGIN
        RTFTEM = BASE * RTFTE / 100;
        RTICAM = BASE * RTICA / 1000;
        RTIVAM = IVAM * RTIVA / 100;
        END
    ELSE
        BEGIN
        RTFTEM = 0;
        RTICAM = 0;
        RTIVAM = 0;
        END

    IDF = GEN_ID(id_factura, 1);
    INSERT INTO FACTURAS (FACT_ID, PTVT_ID, VEND_COD, TERC_NIT, AUTO_NUMERO, FACT_NUMERO, FACT_FECHA, FACT_DESPACHO,
        FACT_VENCE, FACT_IVAINC, FACT_COMIPORC, FACT_COMIMONTO, FACT_DTOPOR, FACT_DTOMONTO, FACT_ADICIONAL,
        FACT_IVAMONTO, FACT_RTFTEPOR, FACT_RTFTEMONTO, FACT_RTIVAPOR, FACT_RTIVAMONTO, FACT_RTICAPOR, FACT_RTICAMONTO,
        FACT_EXTRA, FACT_DTOFPOR, FACT_DTOFMONTO, FACT_DTOFFECHA, PREF_PRE, FACT_TRANSP, FACT_NOMCLIENTE, FACT_COTIZACI,
        FACT_PEDIDO, FACT_REMISION, FACT_ANULADO, FACT_TRANSMIT, FACT_TOTAL, BODE_COD, FACT_OBS, VEHI_COD, FACT_CONSOLIDA,
        FACT_RECIBIDO, FACT_USUARIO, FACT_SUCURSAL, NUMOK, COBR_COD, FACT_FACTOR, FACT_DETCLI, FACT_DETCLINOM,
        FACT_DTOIT1, FACT_DTOIT2, FACT_DTOIT3, FACT_TRM)
        VALUES (:IDF, :PTVT, :VEND, :NIT, NULL, :NUMERO, :FECHA, NULL, (:FECHA + :DIAS), :IVAINC,
        0, 0, 0, 0, 0, :IVAM, :RTFTE, :RTFTEM, :RTIVA, :RTIVAM, :RTICA, :RTICAM, 0, 0, 0, :FECHA, :PREFIJO, NULL,
        :NOMBRE, NULL, NULL, NULL, 'N', 'N', :TOTAL, :BOD, :OBS, NULL, NULL, 0, USER, '01', 'N', :VEND, 1, NULL,
        NULL, NULL, NULL, NULL, 1);

    FOR SELECT FACI_ITEM, FC.ARTI_COD, FACI_CANT, FACI_PRUNIT, ARTI_UNIDAD, TAIV_PORC, FACI_DESC
        FROM factura_concepto_items FC, ARTICULO A, TARIFA_IVA I
        WHERE FC.arti_cod = A.arti_cod AND A.taiv_cod = I.taiv_cod AND FC.facc_id = :ID
        INTO :item, :articulo, :CANT, :prunit, :unidad, :ivap, :descr
        DO
        BEGIN
        if (IVAINC = 'S') then
            BEGIN
            IVAM = :CANT * :PRUNIT / (100 + :IVAP) * :IVAP / 100;
            BASE = :CANT * :PRUNIT;
            END
        ELSE
            BEGIN
            IVAM = :CANT * :PRUNIT * IVAP / 100;
            BASE = :CANT * :PRUNIT + IVAM;
            END
        INSERT INTO FACTURAS_DETALLE (FACT_ID, FADE_ITEM, BODE_COD, ARTI_COD, FADE_CANT, FADE_UNIDAD, FADE_LOTE,
            FADE_PRUNIT, FADE_DTOPORC, FADE_DTOMONTO, FADE_IVAPORC, FADE_IVAMONTO, FADE_CONSUMO, FADE_FACTOR,
            FADE_DESC, FADE_OBS, FADE_CODBAR, FADE_REMISIONADO, FADE_DEVUELTO, FADE_TOTAL, LIPR_COD, FADE_REFERENCIA,
            FADE_ANULADO, FADE_TRANSMIT, FADE_FACTORLISTA, FADE_DTO1, FADE_DTO2, FADE_DTO3, FADE_DTOM1, FADE_DTOM2,
            FADE_DTOM3, FADE_CAJAS)
            VALUES (:IDF, :ITEM, :BOD, :articulo, :CANT, :UNIDAD, NULL, :prunit, 0, 0, :IVAP, :ivam, 0, 1,
            :descr, NULL, :articulo, 0, 0, :BASE, 1, NULL, 'N', 'N', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
        END
    /* contabilice */
    execute procedure CONTABIL_FACTURA(:idf,  :IDC) returning_values (:ERROR, :VER, :IDC);
    EXECUTE procedure contabiliza_pendiente (:IDC);
    suspend;
    END
end
^

SET TERM ; ^


/* 20081105 */
SET TERM ^ ;

CREATE OR ALTER TRIGGER RECIBOS_CAJA_DETALLE_AI FOR RECIBOS_CAJA_DETALLE
ACTIVE AFTER INSERT POSITION 0
AS
declare variable EXISTE CHAR(1);
declare variable FEC DATE;
declare variable NIT VARCHAR(20);
declare variable CONCEPTO VARCHAR(60);
declare variable PREFIJO VARCHAR(4);
declare variable NUMERO VARCHAR(6);
declare variable SALDO NUMERIC(18,2);
declare variable RETES CHAR(2);
declare variable OK CHAR(1);
declare variable RCANTI INTEGER;
declare variable COBR INTEGER;
declare variable ACUMULA CHAR(2);
declare variable DIASMAX INTEGER;
declare variable FACTOR NUMERIC(9,4);
declare variable FACTORD NUMERIC(9,4);
declare variable DIAS INTEGER;
declare variable FECDOC DATE;
declare variable TRM NUMERIC(18,2);
BEGIN
if ((NEW.RECA_ID <> 0) and (new.rcde_anulado = 'N')) then
    BEGIN
    /* Abone el documento referenciado */
    select PREF_PRE, RECA_NUMERO, RECA_fecha, RECA_CONC, TERC_NIT, COBR_COD, RECA_TRM from RECIBOS_CAJA
        where RECA_id = new.RECA_id into :PREFIJO, :NUMERO, :FEC, :CONCEPTO, :NIT, :COBR, :TRM;
    OK = 'N';
    if (new.RCDE_TIPODOC = 45) then
        BEGIN
        /* BUSQUE SI TIENE RECA_ID, SI NO LO ACTUALIZA */
        SELECT RECA_ID FROM ANTICIPOS_CLIENTE WHERE ANCL_ID = NEW.RCDE_IDDOC INTO :RCANTI;
        if (RCANTI = 0) then
            BEGIN
            OK = 'S';
            UPDATE ANTICIPOS_CLIENTE SET RECA_ID = NEW.RECA_ID WHERE ANCL_ID = NEW.RCDE_IDDOC;
            END
        END
    if (OK = 'N') then
        BEGIN
        /* valide que no se pase del saldo */
        execute procedure saldo_doc_cartera(new.rcde_tipodoc, new.rcde_iddoc, '9999/12/31', 0) returning_values(saldo);
        execute procedure lee_configuracion('CARTERA', 'SALDOS', 'DESCONTAR RETENCIONES POR CAUSACION') returning_values (RETES);
        if (SALDO < 0) then
            BEGIN
            if (RETES = 'SI') then
                begin
                if (saldo > (NEW.rcde_abono + NEW.rcde_dtof + NEW.rcde_difcambio)) then
                    EXCEPTION DOCUMENTO_ABONO_MAYOR 'EL SALDO DEL DOCUMENTO ' || NEW.rcde_prefijo || NEW.rcde_numero || ' ES INSUFICIENTE.';
                end
            ELSE
                begin
                if (saldo > (NEW.rcde_abono + NEW.rcde_rtfte + NEW.rcde_rtiva + NEW.rcde_rtica + NEW.rcde_dtof + NEW.rcde_difcambio)) then
                    EXCEPTION DOCUMENTO_ABONO_MAYOR 'EL SALDO DEL DOCUMENTO ' || NEW.rcde_prefijo || NEW.rcde_numero || ' ES INSUFICIENTE.';
                end
            END
        else
            BEGIN
            if (RETES = 'SI') then
                begin
                if (saldo < (NEW.rcde_abono + NEW.rcde_dtof + NEW.rcde_difcambio)) then
                    EXCEPTION DOCUMENTO_ABONO_MAYOR 'EL SALDO DEL DOCUMENTO ' || NEW.rcde_prefijo || NEW.rcde_numero || ' ES INSUFICIENTE.';
                end
            ELSE
                begin
                if (saldo < (NEW.rcde_abono + NEW.rcde_rtfte + NEW.rcde_rtiva + NEW.rcde_rtica + NEW.rcde_dtof + NEW.rcde_difcambio)) then
                    EXCEPTION DOCUMENTO_ABONO_MAYOR 'EL SALDO DEL DOCUMENTO ' || NEW.rcde_prefijo || NEW.rcde_numero || ' ES INSUFICIENTE.';
                end
            END
        EXISTE = 'N';
        select 'S' from saldos_doc_cartera where sdca_tiporef = new.rcde_tipodoc and sdca_idref = new.rcde_iddoc and sdca_fecha = :FEC into :EXISTE;
        if (Existe = 'S') then
            begin
            /* actualice el saldo del dia */
            UPDATE saldos_doc_cartera
                SET SDCA_ABONO = SDCA_ABONO + NEW.rcde_abono + new.rcde_dtof + NEW.rcde_difcambio,
                SDCA_ABRTFTE = SDCA_ABRTFTE + NEW.rcde_RTFTE,
                SDCA_ABRTIVA = SDCA_ABRTIVA + NEW.rcde_RTIVA,
                SDCA_ABRTICA = SDCA_ABRTICA + NEW.rcde_RTICA,
                SDCA_TRM = :TRM
                WHERE SDCA_TIPOREF = NEW.RCDE_TIPODOC AND SDCA_IDREF = NEW.rcde_IDDOC AND SDCA_FECHA = :FEC;
            END
        ELSE
            BEGIN
            /* Inserte un nuevo saldo diario */
            INSERT INTO SALDOS_DOC_CARTERA (SDCA_TIPOREF, SDCA_IDREF, SDCA_FECHA, TERC_NIT, SDCA_RTFTE, SDCA_RTIVA, SDCA_RTICA, SDCA_ABONO, SDCA_ABRTFTE, SDCA_ABRTIVA, SDCA_ABRTICA, SDCA_DEBITO, SDCA_MONTO, SDCA_TRM)
                VALUES (NEW.RCDE_TIPODOC, NEW.RCDE_IDDOC, :FEC, :NIT, 0, 0, 0, (NEW.rcde_abono+NEW.rcde_dtof+NEW.rcde_difcambio), NEW.rcde_rtfte, NEW.rcde_rtiva, NEW.rcde_rtica, 'N', 0, :TRM);
            END
        END
    /* actualice el registro en mov_cliente (por si son varios items) */
    EXISTE = 'N';
    SELECT 'S' FROM MOVIMIENTO_CLIENTES WHERE MVCL_TIPOREF = 61 AND MVCL_IDREF = NEW.RECA_ID AND MVCL_SUCURSAL = NEW.rcde_sucursal INTO :EXISTE;
    if (EXISTE = 'S') then
        begin
        UPDATE movimiento_clientes
            SET MVCL_MONTO = MVCL_MONTO + NEW.rcde_abono + NEW.rcde_dtof + NEW.rcde_difcambio,
                MVCL_RTEFTE = MVCL_RTEFTE + NEW.rcde_rtfte,
                MVCL_RTEIVA = MVCL_RTEIVA + NEW.rcde_rtiva,
                MVCL_RTEICA = MVCL_RTEICA + NEW.rcde_rtica,
                MVCL_TRM = :TRM
            WHERE MVCL_TIPOREF = 61 AND MVCL_IDREF = NEW.RECA_ID AND MVCL_SUCURSAL = NEW.rcde_sucursal;
        end
    ELSE
        INSERT INTO MOVIMIENTO_CLIENTES (MVCL_ID, TERC_NIT, MVCL_TIPOREF, MVCL_IDREF, MVCL_FECHA, MVCL_VENCE, MVCL_CONC, MVCL_MONTO, MVCL_RTEFTE, MVCL_RTEIVA, MVCL_RTEICA, MVCL_DEBITO, MVCL_ABONO, MVCL_PREFREF, MVCL_NUMREF, MVCL_SUCURSAL, COBR_COD, MVCL_TRM)
            VALUES (GEN_ID(ID_MOVCLI, 1), :NIT, 61, NEW.RECA_ID, :FEC, :FEC, :CONCEPTO, (NEW.RCDE_ABONO+NEW.RCDE_DTOF+NEW.rcde_difcambio), NEW.RCDE_RTFTE, NEW.RCDE_RTIVA, NEW.RCDE_RTICA, 'N', 'S', :PREFIJO, :NUMERO, NEW.rcde_sucursal, :COBR, :TRM);

    /* acumule los puntos del vendedor */
    SELECT MVCL_FECHA FROM MOVIMIENTO_CLIENTES WHERE MVCL_TIPOREF = new.rcde_tipodoc AND MVCL_IDREF = new.rcde_iddoc
        INTO :FECDOC;
    if (FECDOC IS NOT NULL) then
        DIAS = FEC - FECDOC;
    else
        DIAS = 999;
    execute procedure lee_configuracion('FACTURACION', 'FACTURAS', 'ACUMULAR PUNTOS DE VENTAS POR VENDEDOR') returning_values (ACUMULA);
    execute procedure lee_configuracion('FACTURACION', 'FACTURAS', 'DIAS DE RECAUDO MAXIMO PARA ACUMULAR PUNTOS AL VENDEDOR') returning_values (DIASMAX);
    if ((acumula = 'SI') and (diasmax >= dias)) then
        begin
        SELECT COPU_FACTOR FROM comisiones_puntos WHERE COPU_COD = NEW.rcde_comip INTO :FACTOR;
        if ((NEW.rcde_tipodoc = 31) or (NEW.rcde_tipodoc = 41)) then
            begin
            /* recorra la factura acumulando los puntos */
            if (new.rcde_tipodoc = 31) then
                select (fact_total-fact_ivamonto)/fact_total from facturas where fact_id = new.rcde_iddoc into :factord;
            if (new.rcde_tipodoc = 41) then
                select ndcl_monto/(ndcl_monto+ndcl_ivamonto) from notas_debito_clientes where ndcl_id = new.rcde_iddoc into :factord;
            /* inserte el registro de puntos */
            insert into puntos_vendedor (vend_cod, ptvt_fecha, ptvt_tipodoc, ptvt_iddoc, ptvt_db, ptvt_cr)
                values (:cobr, :fec, new.rcde_tipodoc, new.rcde_iddoc, (new.rcde_abono*:factord*:factor), 0);
            end
        if ((new.rcde_tipodoc = 33) or (new.rcde_tipodoc = 42)) then
            begin
            if (new.rcde_tipodoc = 33) then
                select (devt_total-devt_ivamonto)/devt_total from devoluciones_ventas where devt_id = new.rcde_iddoc into :factord;
            if (new.rcde_tipodoc = 42) then
                select nccl_monto/(nccl_monto+nccl_ivamonto) from notas_credito_clientes where nccl_id = new.rcde_iddoc into :factord;
            /* inserte el registro de puntos */
            insert into puntos_vendedor (vend_cod, ptvt_fecha, ptvt_tipodoc, ptvt_iddoc, ptvt_db, ptvt_cr)
                values (:cobr, :fec, new.rcde_tipodoc, new.rcde_iddoc, 0, (new.rcde_abono*:factord*:factor));
            end
        end
    end
END
^

SET TERM ; ^


SET TERM ^ ;

CREATE OR ALTER TRIGGER RECIBOS_CAJA_DETALLE_AU FOR RECIBOS_CAJA_DETALLE
ACTIVE AFTER UPDATE POSITION 0
AS
declare variable EXISTE CHAR(1);
declare variable FEC DATE;
declare variable NIT VARCHAR(20);
declare variable CONCEPTO VARCHAR(60);
declare variable PREFIJO VARCHAR(4);
declare variable NUMERO VARCHAR(6);
declare variable SALDO NUMERIC(18,2);
declare variable RETES char(2);
declare variable OK CHAR(1);
declare variable RCANTI INTEGER;
declare variable COBR INTEGER;
declare variable ACUMULA CHAR(2);
declare variable DIASMAX INTEGER;
declare variable FACTOR NUMERIC(9,4);
declare variable FACTORD NUMERIC(9,4);
declare variable DIAS INTEGER;
declare variable FECDOC DATE;
declare variable TRM NUMERIC(18,2);
BEGIN
execute procedure lee_configuracion('FACTURACION', 'FACTURAS', 'ACUMULAR PUNTOS DE VENTAS POR VENDEDOR') returning_values (ACUMULA);
select PREF_PRE, RECA_NUMERO, reca_fecha, RECA_CONC, TERC_NIT, COBR_COD, RECA_TRM
    from recibos_caja where reca_id = new.reca_id
    into :PREFIJO, :NUMERO, :FEC, :CONCEPTO, :NIT, :COBR, :TRM;
/* Borre el viejo */
if ((old.RECA_ID <> 0) AND (OLD.rcde_anulado = 'N')) then
    BEGIN
    OK = 'N';
    if (OLD.RCDE_TIPODOC = 45) then
        BEGIN
        SELECT RECA_ID FROM ANTICIPOS_CLIENTE WHERE ANCL_ID = OLD.RCDE_IDDOC INTO :RCANTI;
        if (RCANTI = OLD.RECA_ID) then
            begin
            OK = 'S';
            if (NEW.rcde_anulado = 'N') then
                delete from anticipos_cliente where ANCL_ID = OLD.RCDE_IDDOC;
            else
                UPDATE anticipos_cliente SET ANCL_ANULADO = 'S' where ANCL_ID = OLD.RCDE_IDDOC;
            end
        END
    if (OK = 'N') then
        BEGIN
        UPDATE saldos_doc_cartera
            SET SDCA_ABONO = SDCA_ABONO - old.rcde_abono - OLD.RCDE_DTOF - OLD.rcde_difcambio,
            SDCA_ABRTFTE = SDCA_ABRTFTE - old.rcde_RTFTE,
            SDCA_ABRTIVA = SDCA_ABRTIVA - old.rcde_RTIVA,
            SDCA_ABRTICA = SDCA_ABRTICA - old.rcde_RTICA
            WHERE SDCA_TIPOREF = old.RCDE_TIPODOC AND SDCA_IDREF = old.rcde_IDDOC AND SDCA_FECHA = :FEC;
        END
    UPDATE movimiento_clientes
        SET MVCL_MONTO = MVCL_MONTO - OLD.rcde_abono - OLD.RCDE_DTOF - OLD.rcde_difcambio,
        MVCL_RTEFTE = MVCL_RTEFTE - OLD.rcde_rtfte,
        MVCL_RTEIVA = MVCL_RTEIVA - OLD.rcde_rtiva,
        MVCL_RTEICA = MVCL_RTEICA - OLD.rcde_rtica
        WHERE MVCL_TIPOREF = 61 AND MVCL_IDREF = OLD.RECA_ID;

    /* DESHAGA LOS PUNTOS DEL VENDEDOR */
    if (acumula = 'SI') then
        delete from puntos_vendedor where vend_cod = :cobr and ptvt_tipodoc = old.rcde_tipodoc and ptvt_iddoc = old.rcde_iddoc and ptvt_fecha = :fec;
    END
if ((NEW.RECA_ID <> 0) and (NEW.rcde_anulado = 'N')) then
    BEGIN
    OK = 'N';
    if (new.RCDE_TIPODOC = 45) then
        BEGIN
        /* BUSQUE SI TIENE RECA_ID, SI NO LO ACTUALIZA */
        SELECT RECA_ID FROM ANTICIPOS_CLIENTE WHERE ANCL_ID = NEW.RCDE_IDDOC INTO :RCANTI;
        if (RCANTI = 0) then
            BEGIN
            OK = 'S';
            UPDATE ANTICIPOS_CLIENTE SET RECA_ID = NEW.RECA_ID WHERE ANCL_ID = NEW.RCDE_IDDOC;
            END
        END
    if (OK = 'N') then
        BEGIN
        /* valide que no se pase del saldo */
        execute procedure saldo_doc_cartera(new.rcde_tipodoc, new.rcde_iddoc, '9999/12/31', 0) returning_values(saldo);
        execute procedure lee_configuracion('CARTERA', 'SALDOS', 'DESCONTAR RETENCIONES POR CAUSACION') returning_values (RETES);
        if (SALDO < 0) then
            BEGIN
            if (RETES = 'SI') then
                begin
                if (saldo > (NEW.rcde_abono + NEW.rcde_dtof + NEW.rcde_difcambio)) then
                    EXCEPTION DOCUMENTO_ABONO_MAYOR;
                end
            ELSE
                begin
                if (saldo > (NEW.rcde_abono + NEW.rcde_rtfte + NEW.rcde_rtiva + NEW.rcde_rtica + NEW.rcde_dtof + NEW.rcde_difcambio)) then
                    EXCEPTION DOCUMENTO_ABONO_MAYOR;
                end
            END
        else
            BEGIN
            if (RETES = 'SI') then
                begin
                if (saldo < (NEW.rcde_abono + NEW.rcde_dtof + NEW.rcde_difcambio)) then
                    EXCEPTION DOCUMENTO_ABONO_MAYOR;
                end
            ELSE
                begin
                if (saldo < (NEW.rcde_abono + NEW.rcde_rtfte + NEW.rcde_rtiva + NEW.rcde_rtica + NEW.rcde_dtof + NEW.rcde_difcambio)) then
                    EXCEPTION DOCUMENTO_ABONO_MAYOR;
                end
            END
        select 'S' from saldos_doc_cartera where sdca_tiporef = new.rcde_tipodoc and sdca_idref = new.rcde_iddoc and sdca_fecha = :FEC into :EXISTE;
        if (Existe = 'S') then
            /* actualice el saldo del dia */
            UPDATE saldos_doc_cartera
                SET SDCA_ABONO = SDCA_ABONO + NEW.rcde_abono + NEW.RCDE_DTOF + NEW.rcde_difcambio,
                    SDCA_ABRTFTE = SDCA_ABRTFTE + NEW.rcde_RTFTE,
                    SDCA_ABRTIVA = SDCA_ABRTIVA + NEW.rcde_RTIVA,
                    SDCA_ABRTICA = SDCA_ABRTICA + NEW.rcde_RTICA,
                    SDCA_TRM = :TRM
                WHERE SDCA_TIPOREF = NEW.RCDE_TIPODOC AND SDCA_IDREF = NEW.rcde_IDDOC AND SDCA_FECHA = :FEC;
        ELSE
            /* Inserte un nuevo saldo diario */
            INSERT INTO SALDOS_DOC_CARTERA (SDCA_TIPOREF, SDCA_IDREF, SDCA_FECHA, TERC_NIT, SDCA_RTFTE, SDCA_RTIVA, SDCA_RTICA, SDCA_ABONO, SDCA_ABRTFTE, SDCA_ABRTIVA, SDCA_ABRTICA, SDCA_DEBITO, SDCA_MONTO, SDCA_TRM)
                VALUES (NEW.RCDE_TIPODOC, NEW.RCDE_IDDOC, :FEC, :NIT, 0, 0, 0, (NEW.rcde_abono+NEW.RCDE_DTOF+NEW.rcde_difcambio), NEW.rcde_rtfte, NEW.rcde_rtiva, NEW.rcde_rtica, 'N', 0, :TRM);
        END /* OK = N */
    /* Registre o actualice el registro en movimiento_cliente */
    EXISTE = 'N';
    SELECT 'S' FROM MOVIMIENTO_CLIENTES WHERE MVCL_TIPOREF = 61 AND MVCL_IDREF = NEW.RECA_ID and mvcl_sucursal = new.rcde_sucursal INTO :EXISTE;
    if (EXISTE = 'S') then
        begin
        /* Actualice el nuevo */
        UPDATE movimiento_clientes
            SET MVCL_MONTO = MVCL_MONTO + NEW.rcde_abono + NEW.rcde_dtof + NEW.rcde_difcambio,
                MVCL_RTEFTE = MVCL_RTEFTE + NEW.rcde_rtfte,
                MVCL_RTEIVA = MVCL_RTEIVA + NEW.rcde_rtiva,
                MVCL_RTEICA = MVCL_RTEICA + NEW.rcde_rtica,
                MVCL_TRM = :TRM
            WHERE MVCL_TIPOREF = 61 AND MVCL_IDREF = NEW.RECA_ID AND MVCL_SUCURSAL = NEW.rcde_sucursal;
        end
    ELSE
        INSERT INTO MOVIMIENTO_CLIENTES (MVCL_ID, TERC_NIT, MVCL_TIPOREF, MVCL_IDREF, MVCL_FECHA, MVCL_VENCE, MVCL_CONC, MVCL_MONTO, MVCL_RTEFTE, MVCL_RTEIVA, MVCL_RTEICA, MVCL_DEBITO, MVCL_ABONO, MVCL_PREFREF, MVCL_NUMREF, MVCL_SUCURSAL, COBR_COD, MVCL_TRM)
            VALUES (GEN_ID(ID_MOVCLI, 1), :NIT, 61, NEW.RECA_ID, :FEC, :FEC, :CONCEPTO, (NEW.RCDE_ABONO+NEW.RCDE_DTOF+NEW.rcde_difcambio), NEW.RCDE_RTFTE, NEW.RCDE_RTIVA, NEW.RCDE_RTICA, 'N', 'S', :PREFIJO, :NUMERO, NEW.rcde_sucursal, :COBR, :TRM);

    /* acumule los puntos del vendedor */
    SELECT MVCL_FECHA FROM MOVIMIENTO_CLIENTES WHERE MVCL_TIPOREF = new.rcde_tipodoc AND MVCL_IDREF = new.rcde_iddoc
        INTO :FECDOC;
    if (FECDOC IS NOT NULL) then
        DIAS = FEC - FECDOC;
    else
        DIAS = 999;
    execute procedure lee_configuracion('FACTURACION', 'FACTURAS', 'DIAS DE RECAUDO MAXIMO PARA ACUMULAR PUNTOS AL VENDEDOR') returning_values (DIASMAX);
    if ((acumula = 'SI') and (diasmax >= dias)) then
        begin
        SELECT COPU_FACTOR FROM comisiones_puntos WHERE COPU_COD = NEW.rcde_comip INTO :FACTOR;
        if ((NEW.rcde_tipodoc = 31) or (NEW.rcde_tipodoc = 41)) then
            begin
            /* recorra la factura acumulando los puntos */
            if (new.rcde_tipodoc = 31) then
                select (fact_total-fact_ivamonto)/fact_total from facturas where fact_id = new.rcde_iddoc into :factord;
            if (new.rcde_tipodoc = 41) then
                select ndcl_monto/(ndcl_monto+ndcl_ivamonto) from notas_debito_clientes where ndcl_id = new.rcde_iddoc into :factord;
            /* inserte el registro de puntos */
            insert into puntos_vendedor (vend_cod, ptvt_fecha, ptvt_tipodoc, ptvt_iddoc, ptvt_db, ptvt_cr)
                values (:cobr, :fec, new.rcde_tipodoc, new.rcde_iddoc, (new.rcde_abono*:factord*:factor), 0);
            end
        if ((new.rcde_tipodoc = 33) or (new.rcde_tipodoc = 42)) then
            begin
            if (new.rcde_tipodoc = 33) then
                select (devt_total-devt_ivamonto)/devt_total from devoluciones_ventas where devt_id = new.rcde_iddoc into :factord;
            if (new.rcde_tipodoc = 42) then
                select nccl_monto/(nccl_monto+nccl_ivamonto) from notas_credito_clientes where nccl_id = new.rcde_iddoc into :factord;
            /* inserte el registro de puntos */
            insert into puntos_vendedor (vend_cod, ptvt_fecha, ptvt_tipodoc, ptvt_iddoc, ptvt_db, ptvt_cr)
                values (:cobr, :fec, new.rcde_tipodoc, new.rcde_iddoc, 0, (new.rcde_abono*:factord*:factor));
            end
        end
    END /* NUEVO */
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER APLICACION_CLIENTE_DETALLE_AI FOR APLICACION_CLIENTE_DETALLE
ACTIVE AFTER INSERT POSITION 0
AS
declare variable EXISTE CHAR(1);
declare variable FEC DATE;
declare variable NIT VARCHAR(20);
declare variable CONCEPTO VARCHAR(60);
declare variable PREFIJO VARCHAR(4);
declare variable NUMERO VARCHAR(6);
declare variable SALDO NUMERIC(18,2);
declare variable RETES CHAR(2);
declare variable SUCURSAL VARCHAR(10);
declare variable COBR INTEGER;
declare variable TRM NUMERIC(18,2);
BEGIN
if ((NEW.APCL_ID <> 0) and (new.acde_anulado = 'N')) then
    BEGIN
    /* Abone el documento referenciado */
    select PREF_PRE, APCL_NUMERO, apcl_fecha, APCL_CONCEPTO, TERC_NIT, APCL_SUCURSAL, COBR_COD, APCL_TRM
        from aplicacion_cliente where apcl_id = new.apcl_id
        into :PREFIJO, :NUMERO, :FEC, :CONCEPTO, :NIT, :SUCURSAL, :COBR, :TRM;
    /* valide que no se pase del saldo */
    execute procedure saldo_doc_cartera(new.acde_tipodoc, new.acde_iddoc, '9999/12/31', 0) returning_values(saldo);
    execute procedure lee_configuracion('CARTERA', 'SALDOS', 'DESCONTAR RETENCIONES POR CAUSACION') returning_values (RETES);
    if (SALDO < 0) then
        BEGIN
        if (RETES = 'SI') then
            begin
            if (saldo > (NEW.acde_aplicado + NEW.acde_difcambio)) then
                EXCEPTION DOCUMENTO_ABONO_MAYOR 'EL SALDO DEL DOCUMENTO ' || NEW.acde_prefijo || NEW.acde_numero || ' ES INSUFICIENTE.';
            end
        ELSE
            begin
            if (saldo > (NEW.acde_aplicado + NEW.acde_rtfte + NEW.acde_rtiva + NEW.acde_rtica + NEW.acde_difcambio)) then
                EXCEPTION DOCUMENTO_ABONO_MAYOR 'EL SALDO DEL DOCUMENTO ' || NEW.acde_prefijo || NEW.acde_numero || ' ES INSUFICIENTE.';
            end
        END
    else
        BEGIN
        if (RETES = 'SI') then
            begin
            if (saldo < (NEW.acde_aplicado + NEW.acde_difcambio)) then
                EXCEPTION DOCUMENTO_ABONO_MAYOR 'EL SALDO DEL DOCUMENTO ' || NEW.acde_prefijo || NEW.acde_numero || ' ES INSUFICIENTE.';
            end
        ELSE
            begin
            if (saldo < (NEW.acde_aplicado + NEW.acde_rtfte + NEW.acde_rtiva + NEW.acde_rtica + NEW.acde_difcambio)) then
                EXCEPTION DOCUMENTO_ABONO_MAYOR 'EL SALDO DEL DOCUMENTO ' || NEW.acde_prefijo || NEW.acde_numero || ' ES INSUFICIENTE.';
            end
        END
    select 'S' from saldos_doc_cartera where sdca_tiporef = new.acde_tipodoc and sdca_idref = new.acde_iddoc and sdca_fecha = :FEC into :EXISTE;
    if (Existe = 'S') then
        begin
        /* actualice el saldo del dia */
        UPDATE saldos_doc_cartera
            SET SDCA_ABONO = SDCA_ABONO + NEW.acde_aplicado + NEW.acde_difcambio,
                SDCA_ABRTFTE = SDCA_ABRTFTE + NEW.acde_RTFTE,
                SDCA_ABRTIVA = SDCA_ABRTIVA + NEW.acde_RTIVA,
                SDCA_ABRTICA = SDCA_ABRTICA + NEW.acde_RTICA,
                SDCA_TRM = :TRM
            WHERE SDCA_TIPOREF = NEW.ACDE_TIPODOC AND SDCA_IDREF = NEW.acde_IDDOC AND SDCA_FECHA = :FEC;
        END
    ELSE
        BEGIN
        /* Inserte un nuevo saldo diario */
        INSERT INTO SALDOS_DOC_CARTERA (SDCA_TIPOREF, SDCA_IDREF, SDCA_FECHA, TERC_NIT, SDCA_RTFTE, SDCA_RTIVA, SDCA_RTICA, SDCA_ABONO, SDCA_ABRTFTE, SDCA_ABRTIVA, SDCA_ABRTICA, SDCA_DEBITO, SDCA_MONTO, SDCA_TRM)
            VALUES (NEW.ACDE_TIPODOC, NEW.ACDE_IDDOC, :FEC, :NIT, 0, 0, 0, (NEW.acde_aplicado + NEW.acde_difcambio), NEW.acde_rtfte, NEW.acde_rtiva, NEW.acde_rtica, 'N', 0, :TRM);
        END
    /* actualice el registro en mov_cliente (por si son varios items) */
    EXISTE = 'N';
    SELECT 'S' FROM MOVIMIENTO_CLIENTES WHERE MVCL_TIPOREF = 43 AND MVCL_IDREF = NEW.APCL_ID INTO :EXISTE;
    if (EXISTE = 'S') then
        begin
        UPDATE movimiento_clientes
            SET MVCL_MONTO = MVCL_MONTO + NEW.acde_aplicado + NEW.acde_difcambio,
                MVCL_RTEFTE = MVCL_RTEFTE + NEW.acde_rtfte,
                MVCL_RTEIVA = MVCL_RTEIVA + NEW.acde_rtiva,
                MVCL_RTEICA = MVCL_RTEICA + NEW.acde_rtica,
                MVCL_TRM = :TRM
            WHERE MVCL_TIPOREF = 43 AND MVCL_IDREF = NEW.APCL_ID;
        end
    ELSE
        INSERT INTO MOVIMIENTO_CLIENTES (MVCL_ID, TERC_NIT, MVCL_TIPOREF, MVCL_IDREF, MVCL_FECHA, MVCL_VENCE, MVCL_CONC, MVCL_MONTO, MVCL_RTEFTE, MVCL_RTEIVA, MVCL_RTEICA, MVCL_DEBITO, MVCL_ABONO, MVCL_PREFREF, MVCL_NUMREF, MVCL_SUCURSAL, COBR_COD, MVCL_TRM)
            VALUES (GEN_ID(ID_MOVCLI, 1), :NIT, 43, NEW.APCL_ID, :FEC, :FEC, :CONCEPTO, (NEW.ACDE_APLICADO + NEW.acde_difcambio), NEW.ACDE_RTFTE, NEW.ACDE_RTIVA, NEW.ACDE_RTICA, 'N', 'S', :PREFIJO, :NUMERO, :SUCURSAL, :COBR, :TRM);
    end
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER APLICACION_CLIENTE_DETALLE_AU FOR APLICACION_CLIENTE_DETALLE
ACTIVE AFTER UPDATE POSITION 0
AS
declare variable EXISTE CHAR(1);
declare variable FEC DATE;
declare variable NIT VARCHAR(20);
declare variable CONCEPTO VARCHAR(60);
declare variable PREFIJO VARCHAR(4);
declare variable NUMERO VARCHAR(6);
declare variable SALDO NUMERIC(18,2);
declare variable RETES CHAR(2);
declare variable SUCURSAL VARCHAR(10);
declare variable COBR INTEGER;
declare variable TRM NUMERIC(18,2);
BEGIN
if ((old.apcl_id <> 0) and (old.acde_anulado = 'N')) then
    begin
    select apcl_fecha, apcl_trm from aplicacion_CLIENTE
        where apcl_id = old.apcl_id into :FEC, :TRM;
    UPDATE saldos_doc_cartera
        SET SDCA_ABONO = SDCA_ABONO - old.acde_aplicado - OLD.acde_difcambio,
        SDCA_ABRTFTE = SDCA_ABRTFTE - old.acde_RTFTE,
        SDCA_ABRTIVA = SDCA_ABRTIVA - old.acde_RTIVA,
        SDCA_ABRTICA = SDCA_ABRTICA - old.acde_RTICA
        WHERE SDCA_TIPOREF = OLD.ACDE_TIPODOC AND SDCA_IDREF = OLD.acde_IDDOC AND SDCA_FECHA = :FEC;
                    
    UPDATE movimiento_clientes
        SET MVCL_MONTO = MVCL_MONTO - OLD.acde_aplicado - OLD.acde_difcambio,
        MVCL_RTEFTE = MVCL_RTEFTE - OLD.acde_rtfte,
        MVCL_RTEIVA = MVCL_RTEIVA - OLD.acde_rtiva,
        MVCL_RTEICA = MVCL_RTEICA - OLD.acde_rtica
        WHERE MVCL_TIPOREF = 43 AND MVCL_IDREF = NEW.APCL_ID;
    end
if ((NEW.acde_anulado = 'N') AND (NEW.APCL_ID <> 0)) then
    BEGIN
    select PREF_PRE, APCL_NUMERO, apcl_fecha, APCL_CONCEPTO, TERC_NIT, APCL_SUCURSAL, COBR_COD, APCL_TRM
        from aplicacion_CLIENTE
        where apcl_id = new.apcl_id
        into :PREFIJO, :NUMERO, :FEC, :CONCEPTO, :NIT, :SUCURSAL, :COBR, :TRM;
    /* valide que no se pase del saldo */
    execute procedure saldo_doc_cartera(new.acde_tipodoc, new.acde_iddoc, '9999/12/31', 0) returning_values(saldo);
    execute procedure lee_configuracion('CARTERA', 'SALDOS', 'DESCONTAR RETENCIONES POR CAUSACION') returning_values (RETES);
    if (SALDO < 0) then
        BEGIN
        if (RETES = 'SI') then
            begin
            if (saldo > (NEW.acde_aplicado+NEW.acde_difcambio)) then
                EXCEPTION DOCUMENTO_ABONO_MAYOR;
            end
        ELSE
            begin
            if (saldo > (NEW.acde_aplicado + NEW.acde_rtfte + NEW.acde_rtiva + NEW.acde_rtica + NEW.acde_difcambio)) then
                EXCEPTION DOCUMENTO_ABONO_MAYOR;
            end
        END
    else
        BEGIN
        if (RETES = 'SI') then
            begin
            if (saldo < (NEW.acde_aplicado+NEW.acde_difcambio)) then
                EXCEPTION DOCUMENTO_ABONO_MAYOR;
            end
        ELSE
            begin
            if (saldo < (NEW.acde_aplicado + NEW.acde_rtfte + NEW.acde_rtiva + NEW.acde_rtica + NEW.acde_difcambio)) then
                EXCEPTION DOCUMENTO_ABONO_MAYOR;
            end
        END
        
    /* Abone el documento referenciado  */
    select 'S' from saldos_doc_cartera where sdca_tiporef = new.acde_tipodoc and sdca_idref = new.acde_iddoc and sdca_fecha = :FEC into :EXISTE;
    if (Existe = 'S') then
        /* actualice el saldo del dia */
        UPDATE saldos_doc_cartera
            SET SDCA_ABONO = SDCA_ABONO + NEW.acde_aplicado+NEW.acde_difcambio,
            SDCA_ABRTFTE = SDCA_ABRTFTE + NEW.acde_RTFTE,
            SDCA_ABRTIVA = SDCA_ABRTIVA + NEW.acde_RTIVA,
            SDCA_ABRTICA = SDCA_ABRTICA + NEW.acde_RTICA,
            SDCA_TRM = :TRM
        WHERE SDCA_TIPOREF = NEW.ACDE_TIPODOC AND SDCA_IDREF = NEW.acde_IDDOC AND SDCA_FECHA = :FEC;
    ELSE
        /* Inserte un nuevo saldo diario */
        INSERT INTO SALDOS_DOC_CARTERA (SDCA_TIPOREF, SDCA_IDREF, SDCA_FECHA, TERC_NIT, SDCA_RTFTE, SDCA_RTIVA, SDCA_RTICA, SDCA_ABONO, SDCA_ABRTFTE, SDCA_ABRTIVA, SDCA_ABRTICA, SDCA_DEBITO, SDCA_MONTO, SDCA_TRM)
            VALUES (NEW.ACDE_TIPODOC, NEW.ACDE_IDDOC, :FEC, :NIT, 0, 0, 0, (NEW.acde_aplicado+NEW.acde_difcambio), NEW.acde_rtfte, NEW.acde_rtiva, NEW.acde_rtica, 'N', 0, :TRM);
            
    /* Registre o actualice el registro en movimiento */
    EXISTE = 'N';
    SELECT 'S' FROM MOVIMIENTO_CLIENTES WHERE MVCL_TIPOREF = 43 AND MVCL_IDREF = NEW.APCL_ID INTO :EXISTE;
    if (EXISTE = 'S') then
        begin
        UPDATE movimiento_clientes
            SET MVCL_MONTO = MVCL_MONTO + NEW.acde_aplicado+NEW.acde_difcambio,
            MVCL_RTEFTE = MVCL_RTEFTE + NEW.acde_rtfte,
            MVCL_RTEIVA = MVCL_RTEIVA + NEW.acde_rtiva,
            MVCL_RTEICA = MVCL_RTEICA + NEW.acde_rtica,
            MVCL_TRM = :TRM
        WHERE MVCL_TIPOREF = 43 AND MVCL_IDREF = NEW.APCL_ID;
        end
    ELSE
        INSERT INTO MOVIMIENTO_CLIENTES (MVCL_ID, TERC_NIT, MVCL_TIPOREF, MVCL_IDREF, MVCL_FECHA, MVCL_VENCE, MVCL_CONC, MVCL_MONTO, MVCL_RTEFTE, MVCL_RTEIVA, MVCL_RTEICA, MVCL_DEBITO, MVCL_ABONO, MVCL_PREFref, MVCL_NUMREF, MVCL_SUCURSAL, COBR_COD, MVCL_TRM)
            VALUES (GEN_ID(ID_MOVCLI, 1), :NIT, 43, NEW.APCL_ID, :FEC, :FEC, :CONCEPTO, (NEW.ACDE_APLICADO+NEW.acde_difcambio), NEW.ACDE_RTFTE, NEW.ACDE_RTIVA, NEW.ACDE_RTICA, 'N', 'S', :PREFIJO, :NUMERO, :SUCURSAL, :COBR, :TRM);
    end
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER APLICACION_CLIENTE_DETALLE_AD FOR APLICACION_CLIENTE_DETALLE
ACTIVE AFTER DELETE POSITION 0
AS
declare variable FEC DATE;
BEGIN
  if ((OLD.APCL_ID <> 0) AND (OLD.acde_anulado = 'N')) then
    BEGIN
    /* Abone el documento referenciado en APLICACION_PROVEEDOR_DETALLE */
    select apcl_fecha from aplicacion_cliente where apcl_id = OLD.apcl_id into :FEC;
    UPDATE saldos_doc_cartera
        SET SDCA_ABONO = SDCA_ABONO - old.acde_aplicado-OLD.acde_difcambio,
            SDCA_ABRTFTE = SDCA_ABRTFTE - old.acde_RTFTE,
            SDCA_ABRTIVA = SDCA_ABRTIVA - old.acde_RTIVA,
            SDCA_ABRTICA = SDCA_ABRTICA - old.acde_RTICA
        WHERE SDCA_TIPOREF = OLD.ACDE_TIPODOC AND SDCA_IDREF = OLD.acde_IDDOC AND SDCA_FECHA = :FEC;
    UPDATE movimiento_clientes
        SET MVCL_MONTO = MVCL_MONTO - OLD.acde_aplicado-OLD.acde_difcambio,
            MVCL_RTEFTE = MVCL_RTEFTE - OLD.acde_rtfte,
            MVCL_RTEIVA = MVCL_RTEIVA - OLD.acde_rtiva,
            MVCL_RTEICA = MVCL_RTEICA - OLD.acde_rtica
        WHERE MVCL_TIPOREF = 43 AND MVCL_IDREF = OLD.APCL_ID;
    end
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER RECIBOS_CAJA_DETALLE_AD FOR RECIBOS_CAJA_DETALLE
ACTIVE AFTER DELETE POSITION 0
AS
declare variable FEC DATE;
declare variable OK CHAR(1);
declare variable RCANTI INTEGER;
declare variable ACUMULA CHAR(2);
declare variable COBR INTEGER;
BEGIN
if (old.RECA_ID <> 0) then
    BEGIN
    execute procedure lee_configuracion('FACTURACION', 'FACTURAS', 'ACUMULAR PUNTOS DE VENTAS POR VENDEDOR') returning_values (ACUMULA);
    select reca_fecha, COBR_COD from recibos_caja where reca_id = OLD.reca_id into :FEC, :COBR;
    OK = 'N';
    if (OLD.RCDE_TIPODOC = 45) then
        BEGIN
        SELECT RECA_ID FROM ANTICIPOS_CLIENTE WHERE ANCL_ID = OLD.RCDE_IDDOC INTO :RCANTI;
        if (RCANTI = OLD.RECA_ID) then
            begin
            OK = 'S';
            delete from anticipos_cliente where ANCL_ID = OLD.RCDE_IDDOC;
            end
        END
    if (OLD.rcde_anulado = 'N') then
     begin
       if (OK = 'N') then
        BEGIN
        UPDATE saldos_doc_cartera
            SET SDCA_ABONO = SDCA_ABONO - old.rcde_abono - OLD.RCDE_DTOF - OLD.rcde_difcambio,
            SDCA_ABRTFTE = SDCA_ABRTFTE - old.rcde_RTFTE,
            SDCA_ABRTIVA = SDCA_ABRTIVA - old.rcde_RTIVA,
            SDCA_ABRTICA = SDCA_ABRTICA - old.rcde_RTICA
            WHERE SDCA_TIPOREF = old.RCDE_TIPODOC AND SDCA_IDREF = old.rcde_IDDOC AND SDCA_FECHA = :FEC;
        END
       UPDATE movimiento_clientes
        SET MVCL_MONTO = MVCL_MONTO - OLD.rcde_abono - OLD.RCDE_DTOF - OLD.rcde_difcambio,
        MVCL_RTEFTE = MVCL_RTEFTE - OLD.rcde_rtfte,
        MVCL_RTEIVA = MVCL_RTEIVA - OLD.rcde_rtiva,
        MVCL_RTEICA = MVCL_RTEICA - OLD.rcde_rtica
        WHERE MVCL_TIPOREF = 61 AND MVCL_IDREF = OLD.RECA_ID and MVCL_SUCURSAL = OLD.rcde_sucursal;
     end
    /* DESHAGA LOS PUNTOS DEL VENDEDOR */
    if (acumula = 'SI') then
        delete from puntos_vendedor where vend_cod = :cobr and ptvt_tipodoc = old.rcde_tipodoc and ptvt_iddoc = old.rcde_iddoc and ptvt_fecha = :fec;
    END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER EGRESOS_CRUCEC_AI FOR EGRESOS_CRUCEC
ACTIVE AFTER INSERT POSITION 0
AS
declare variable EXISTE CHAR(1);
declare variable FEC DATE;
declare variable NIT VARCHAR(20);
declare variable CONCEPTO VARCHAR(60);
declare variable PREFIJO VARCHAR(4);
declare variable NUMERO VARCHAR(6);
declare variable SALDO NUMERIC(18,2);
declare variable RETES CHAR(2);
declare variable COBR INTEGER;
declare variable TRM NUMERIC(18,2);
BEGIN
if ((NEW.egre_id <> 0) and (new.egcc_anulado = 'N')) then
    BEGIN
    /* Abone el documento referenciado */
    select PREF_PRE, EGRE_NUMERO, EGRE_fecha, EGRE_CONC, TERC_NIT, EGRE_TRM from EGRESOS
        where EGRE_id = new.egre_id into :PREFIJO, :NUMERO, :FEC, :CONCEPTO, :NIT, :TRM;
    SELECT COBR_COD FROM cliente_sucursales WHERE TERC_NIT = :NIT AND CLCU_COD = NEW.egcc_sucursal INTO :COBR;
    /* valide que no se pase del saldo */
    execute procedure saldo_doc_cartera(new.egcc_tipodoc, new.egcc_iddoc, '9999/12/31',0) returning_values(saldo);
    execute procedure lee_configuracion('CARTERA', 'SALDOS', 'DESCONTAR RETENCIONES POR CAUSACION') returning_values (RETES);
    if (SALDO < 0) then
        BEGIN
        if (RETES = 'SI') then
            begin
            if (saldo > (NEW.egcc_abono + NEW.egcc_dtof + NEW.egcc_difcambio)) then
                EXCEPTION DOCUMENTO_ABONO_MAYOR;
            end
        ELSE
            begin
            if (saldo > (NEW.egcc_abono + NEW.egcc_rtfte + NEW.egcc_rtiva + NEW.egcc_rtica + NEW.egcc_dtof + NEW.egcc_difcambio)) then
                EXCEPTION DOCUMENTO_ABONO_MAYOR;
            end
        END
    else
        BEGIN
        if (RETES = 'SI') then
            begin
            if (saldo < (NEW.egcc_abono + NEW.egcc_dtof + NEW.egcc_difcambio)) then
                EXCEPTION DOCUMENTO_ABONO_MAYOR;
            end
        ELSE
            begin
            if (saldo < (NEW.egcc_abono + NEW.egcc_rtfte + NEW.egcc_rtiva + NEW.egcc_rtica + NEW.egcc_dtof + NEW.egcc_difcambio)) then
                EXCEPTION DOCUMENTO_ABONO_MAYOR;
            end
        END
    EXISTE = 'N';
    select 'S' from saldos_doc_cartera where sdca_tiporef = new.egcc_tipodoc and sdca_idref = new.egcc_iddoc and sdca_fecha = :FEC into :EXISTE;
    if (Existe = 'S') then
        begin
        /* actualice el saldo del dia */
        UPDATE saldos_doc_cartera
            SET SDCA_ABONO = SDCA_ABONO + NEW.egcc_abono + new.egcc_dtof + NEW.egcc_difcambio,
                SDCA_ABRTFTE = SDCA_ABRTFTE + NEW.egcc_rtfte,
                SDCA_ABRTIVA = SDCA_ABRTIVA + NEW.egcc_rtiva,
                SDCA_ABRTICA = SDCA_ABRTICA + NEW.egcc_rtica,
                SDCA_TRM = :TRM
                WHERE SDCA_TIPOREF = NEW.egcc_tipodoc AND SDCA_IDREF = NEW.egcc_iddoc AND SDCA_FECHA = :FEC;
        END
    ELSE
        BEGIN
        /* Inserte un nuevo saldo diario */
        INSERT INTO SALDOS_DOC_CARTERA (SDCA_TIPOREF, SDCA_IDREF, SDCA_FECHA, TERC_NIT, SDCA_RTFTE, SDCA_RTIVA, SDCA_RTICA, SDCA_ABONO, SDCA_ABRTFTE, SDCA_ABRTIVA, SDCA_ABRTICA, SDCA_DEBITO, SDCA_MONTO, SDCA_TRM)
            VALUES (NEW.egcc_tipodoc, NEW.egcc_iddoc, :FEC, :NIT, 0, 0, 0, (NEW.egcc_abono+NEW.egcc_dtof+NEW.egcc_difcambio), NEW.egcc_rtfte, NEW.egcc_rtiva, NEW.egcc_rtica, 'N', 0, :TRM);
        END
    /* actualice el registro en mov_cliente (por si son varios items) */
    EXISTE = 'N';
    SELECT 'S' FROM MOVIMIENTO_CLIENTES WHERE MVCL_TIPOREF = 62 AND MVCL_IDREF = NEW.egre_id AND MVCL_SUCURSAL = NEW.egcc_sucursal INTO :EXISTE;
    if (EXISTE = 'S') then
        begin
        UPDATE movimiento_clientes
            SET MVCL_MONTO = MVCL_MONTO + NEW.egcc_abono + NEW.egcc_dtof + NEW.egcc_difcambio,
                MVCL_RTEFTE = MVCL_RTEFTE + NEW.egcc_rtfte,
                MVCL_RTEIVA = MVCL_RTEIVA + NEW.egcc_rtiva,
                MVCL_RTEICA = MVCL_RTEICA + NEW.egcc_rtica,
                MVCL_TRM = :TRM
            WHERE MVCL_TIPOREF = 62 AND MVCL_IDREF = NEW.egre_id;
        end
    ELSE
        INSERT INTO MOVIMIENTO_CLIENTES (MVCL_ID, TERC_NIT, MVCL_TIPOREF, MVCL_IDREF, MVCL_FECHA, MVCL_VENCE, MVCL_CONC, MVCL_MONTO, MVCL_RTEFTE, MVCL_RTEIVA, MVCL_RTEICA, MVCL_DEBITO, MVCL_ABONO, MVCL_PREFREF, MVCL_NUMREF, MVCL_SUCURSAL, COBR_COD, MVCL_TRM)
            VALUES (GEN_ID(ID_MOVCLI, 1), :NIT, 62, NEW.egre_id, :FEC, :FEC, :CONCEPTO, (NEW.egcc_abono+NEW.egcc_dtof+NEW.egcc_difcambio), NEW.egcc_rtfte, NEW.egcc_rtiva, NEW.egcc_rtica, 'N', 'S', :PREFIJO, :NUMERO, NEW.egcc_sucursal, :COBR, :TRM);
    end
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER EGRESOS_CRUCEC_AU FOR EGRESOS_CRUCEC
ACTIVE AFTER UPDATE POSITION 0
AS
declare variable EXISTE CHAR(1);
declare variable FEC DATE;
declare variable NIT VARCHAR(20);
declare variable CONCEPTO VARCHAR(60);
declare variable PREFIJO VARCHAR(4);
declare variable NUMERO VARCHAR(6);
declare variable SALDO NUMERIC(18,2);
declare variable RETES char(2);
declare variable COBR INTEGER;
declare variable TRM NUMERIC(18,2);
BEGIN
select PREF_PRE, EGRE_NUMERO, EGRE_fecha, EGRE_CONC, TERC_NIT, EGRE_TRM
    from egresos where egre_id = new.egre_id
    into :PREFIJO, :NUMERO, :FEC, :CONCEPTO, :NIT, :TRM;
/* Borre el viejo */
if ((old.egre_id <> 0) AND (OLD.egcc_anulado = 'N')) then
    BEGIN
    UPDATE saldos_doc_cartera
        SET SDCA_ABONO = SDCA_ABONO - old.egcc_abono - OLD.egcc_dtof - OLD.egcc_difcambio,
        SDCA_ABRTFTE = SDCA_ABRTFTE - old.egcc_rtfte,
        SDCA_ABRTIVA = SDCA_ABRTIVA - old.egcc_rtiva,
        SDCA_ABRTICA = SDCA_ABRTICA - old.egcc_rtica
        WHERE SDCA_TIPOREF = old.egcc_tipodoc AND SDCA_IDREF = old.egcc_iddoc AND SDCA_FECHA = :FEC;
    UPDATE movimiento_clientes
        SET MVCL_MONTO = MVCL_MONTO - OLD.egcc_abono - OLD.egcc_dtof - OLD.egcc_difcambio,
        MVCL_RTEFTE = MVCL_RTEFTE - OLD.egcc_rtfte,
        MVCL_RTEIVA = MVCL_RTEIVA - OLD.egcc_rtiva,
        MVCL_RTEICA = MVCL_RTEICA - OLD.egcc_rtica
        WHERE MVCL_TIPOREF = 62 AND MVCL_IDREF = OLD.egre_id AND MVCL_SUCURSAL = old.egcc_sucursal;
    END
if ((NEW.egre_id <> 0) and (NEW.egcc_anulado = 'N')) then
    BEGIN
    SELECT COBR_COD FROM cliente_sucursales WHERE TERC_NIT = :NIT AND CLCU_COD = NEW.egcc_sucursal INTO :COBR;
    /* valide que no se pase del saldo */
    execute procedure saldo_doc_cartera(new.egcc_tipodoc, new.egcc_iddoc, '9999/12/31',0) returning_values(saldo);
    execute procedure lee_configuracion('CARTERA', 'SALDOS', 'DESCONTAR RETENCIONES POR CAUSACION') returning_values (RETES);
    if (SALDO < 0) then
        BEGIN
        if (RETES = 'SI') then
            begin
            if (saldo > (NEW.egcc_abono + NEW.egcc_dtof + NEW.egcc_difcambio)) then
                EXCEPTION DOCUMENTO_ABONO_MAYOR;
            end
        ELSE
            begin
            if (saldo > (NEW.egcc_abono + NEW.egcc_rtfte + NEW.egcc_rtiva + NEW.egcc_rtica + NEW.egcc_dtof + NEW.egcc_difcambio)) then
                EXCEPTION DOCUMENTO_ABONO_MAYOR;
            end
        END
    else
        BEGIN
        if (RETES = 'SI') then
            begin
            if (saldo < (NEW.egcc_abono + NEW.egcc_dtof + NEW.egcc_difcambio)) then
                EXCEPTION DOCUMENTO_ABONO_MAYOR;
            end
        ELSE
            begin
            if (saldo < (NEW.egcc_abono + NEW.egcc_rtfte + NEW.egcc_rtiva + NEW.egcc_rtica + NEW.egcc_dtof + NEW.egcc_difcambio)) then
                EXCEPTION DOCUMENTO_ABONO_MAYOR;
            end
        END
    select 'S' from saldos_doc_cartera where sdca_tiporef = new.egcc_tipodoc and sdca_idref = new.egcc_iddoc and sdca_fecha = :FEC into :EXISTE;
    if (Existe = 'S') then
        /* actualice el saldo del dia */
        UPDATE saldos_doc_cartera
            SET SDCA_ABONO = SDCA_ABONO + NEW.egcc_abono + NEW.egcc_dtof + NEW.egcc_difcambio,
            SDCA_ABRTFTE = SDCA_ABRTFTE + NEW.egcc_rtfte,
            SDCA_ABRTIVA = SDCA_ABRTIVA + NEW.egcc_rtiva,
            SDCA_ABRTICA = SDCA_ABRTICA + NEW.egcc_rtica,
            SDCA_TRM = :TRM
            WHERE SDCA_TIPOREF = NEW.egcc_tipodoc AND SDCA_IDREF = NEW.egcc_iddoc AND SDCA_FECHA = :FEC;
    ELSE
        /* Inserte un nuevo saldo diario */
        INSERT INTO SALDOS_DOC_CARTERA (SDCA_TIPOREF, SDCA_IDREF, SDCA_FECHA, TERC_NIT, SDCA_RTFTE, SDCA_RTIVA, SDCA_RTICA, SDCA_ABONO, SDCA_ABRTFTE, SDCA_ABRTIVA, SDCA_ABRTICA, SDCA_DEBITO, SDCA_MONTO, SDCA_TRM)
            VALUES (NEW.egcc_tipodoc, NEW.egcc_iddoc, :FEC, :NIT, 0, 0, 0, (NEW.egcc_abono+NEW.egcc_dtof+NEW.egcc_difcambio), NEW.egcc_rtfte, NEW.egcc_rtiva, NEW.egcc_rtica, 'N', 0, :TRM);
    /* Registre o actualice el registro en movimiento_cliente */
    EXISTE = 'N';
    SELECT 'S' FROM MOVIMIENTO_CLIENTES WHERE MVCL_TIPOREF = 62 AND MVCL_IDREF = NEW.egre_id and mvcl_sucursal = new.egcc_sucursal INTO :EXISTE;
    if (EXISTE = 'S') then
        begin
        /* Actualice el nuevo */
        UPDATE movimiento_clientes
            SET MVCL_MONTO = MVCL_MONTO + NEW.egcc_abono + NEW.egcc_dtof + NEW.egcc_difcambio,
                MVCL_RTEFTE = MVCL_RTEFTE + NEW.egcc_rtfte,
                MVCL_RTEIVA = MVCL_RTEIVA + NEW.egcc_rtiva,
                MVCL_RTEICA = MVCL_RTEICA + NEW.egcc_rtica,
                MVCL_TRM = :TRM
            WHERE MVCL_TIPOREF = 62 AND MVCL_IDREF = NEW.egre_id AND MVCL_SUCURSAL = NEW.egcc_sucursal;
        end
    ELSE
        INSERT INTO MOVIMIENTO_CLIENTES (MVCL_ID, TERC_NIT, MVCL_TIPOREF, MVCL_IDREF, MVCL_FECHA, MVCL_VENCE, MVCL_CONC, MVCL_MONTO, MVCL_RTEFTE, MVCL_RTEIVA, MVCL_RTEICA, MVCL_DEBITO, MVCL_ABONO, MVCL_PREFREF, MVCL_NUMREF, MVCL_SUCURSAL, COBR_COD, MVCL_TRM)
            VALUES (GEN_ID(ID_MOVCLI, 1), :NIT, 62, NEW.egre_id, :FEC, :FEC, :CONCEPTO, (NEW.egcc_abono+NEW.egcc_dtof+NEW.egcc_difcambio), NEW.egcc_rtfte, NEW.egcc_rtiva, NEW.egcc_rtica, 'N', 'S', :PREFIJO, :NUMERO, NEW.egcc_sucursal, :COBR, :TRM);
    END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER EGRESOS_CRUCEC_AD FOR EGRESOS_CRUCEC
ACTIVE AFTER DELETE POSITION 0
as
declare variable FEC DATE;
BEGIN
if (old.egre_id <> 0) then
    BEGIN
    select egre_fecha from egresos where egre_id = OLD.egre_id into :FEC;
    if (OLD.egcc_anulado = 'N') then
        begin
        UPDATE saldos_doc_cartera
            SET SDCA_ABONO = SDCA_ABONO - old.egcc_abono - OLD.egcc_dtof - OLD.egcc_difcambio,
            SDCA_ABRTFTE = SDCA_ABRTFTE - old.egcc_rtfte,
            SDCA_ABRTIVA = SDCA_ABRTIVA - old.egcc_rtiva,
            SDCA_ABRTICA = SDCA_ABRTICA - old.egcc_rtica
            WHERE SDCA_TIPOREF = old.egcc_tipodoc AND SDCA_IDREF = old.egcc_iddoc AND SDCA_FECHA = :FEC;
        UPDATE movimiento_clientes
            SET MVCL_MONTO = MVCL_MONTO - OLD.egcc_abono - OLD.egcc_dtof - OLD.egcc_difcambio,
            MVCL_RTEFTE = MVCL_RTEFTE - OLD.egcc_rtfte,
            MVCL_RTEIVA = MVCL_RTEIVA - OLD.egcc_rtiva,
            MVCL_RTEICA = MVCL_RTEICA - OLD.egcc_rtica
            WHERE MVCL_TIPOREF = 62 AND MVCL_IDREF = OLD.egre_id and MVCL_SUCURSAL = OLD.egcc_sucursal;
        end
    END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER EGRESOS_DETALLE_AI FOR EGRESOS_DETALLE
ACTIVE AFTER INSERT POSITION 0
AS
declare variable EXISTE CHAR(1);
declare variable FEC DATE;
declare variable CONC VARCHAR(60);
declare variable NIT VARCHAR(20);
declare variable CONCEPTO VARCHAR(60);
declare variable PREFIJO VARCHAR(4);
declare variable NUMERO VARCHAR(6);
declare variable OK CHAR(1);
declare variable EGANTI INTEGER;
declare variable RETES CHAR(2);
declare variable SALDO NUMERIC(18,2);
declare variable TRM NUMERIC(18,2);
BEGIN
/* Abone el documento referenciado en EGRESOS_DETALLE */
select PREF_PRE, EGRE_NUMERO, EGRE_FECHA, EGRE_CONC, TERC_NIT, EGRE_TRM
    from EGRESOS where EGRE_ID = new.EGRE_ID into :PREFIJO, :NUMERO, :FEC, :CONCEPTO, :NIT, :TRM;
if ((NEW.EGRE_ID <> 0) and (new.egde_anulado = 'N')) then
    BEGIN
    OK = 'N';
    if (new.EGDE_TIPODOC = 55) then
        BEGIN
        /* BUSQUE SI TIENE EGRE_ID, SI NO LO ACTUALIZA */
        SELECT EGRE_ID FROM ANTICIPOS_PROVEEDOR WHERE ANPR_ID = NEW.EGDE_IDDOC INTO :EGANTI;
        if (EGANTI = 0) then
            BEGIN
            OK = 'S';
            UPDATE ANTICIPOS_PROVEEDOR SET EGRE_ID = NEW.EGRE_ID WHERE ANPR_ID = NEW.EGDE_IDDOC;
            END
        END
    /* valide que no se pase del saldo */
    execute procedure saldo_doc_cxpagar(new.egde_tipodoc, new.egde_iddoc, '9999/12/31', 0) returning_values(saldo);
    execute procedure lee_configuracion('CXPAGAR', 'SALDOS', 'DESCONTAR RETENCIONES POR CAUSACION') returning_values (RETES);
    if (SALDO < 0) then
        BEGIN
        if (RETES = 'SI') then
            begin
            if (saldo > (NEW.egde_abono+NEW.egde_dtof+NEW.egde_difcambio)) then
                EXCEPTION DOCUMENTO_ABONO_MAYOR 'EL SALDO DEL DOCUMENTO ' || NEW.egde_prefijo || NEW.egde_numero || ' ES INSUFICIENTE.';
            end
        ELSE
            begin
            if (saldo > (NEW.egde_abono + NEW.egde_rtfte + NEW.egde_rtiva + NEW.egde_rtica + new.egde_dtof + NEW.egde_difcambio)) then
                EXCEPTION DOCUMENTO_ABONO_MAYOR 'EL SALDO DEL DOCUMENTO ' || NEW.egde_prefijo || NEW.egde_numero || ' ES INSUFICIENTE.';
            end
        END
    else
        BEGIN
        if (RETES = 'SI') then
            begin
            if (saldo < (NEW.egde_abono + NEW.egde_dtof + NEW.egde_difcambio)) then
                EXCEPTION DOCUMENTO_ABONO_MAYOR 'EL SALDO DEL DOCUMENTO ' || NEW.egde_prefijo || NEW.egde_numero || ' ES INSUFICIENTE.';
            end
        ELSE
            begin
            if (saldo < (NEW.egde_abono + NEW.egde_rtfte + NEW.egde_rtiva + NEW.egde_rtica + NEW.egde_dtof + NEW.egde_difcambio)) then
                EXCEPTION DOCUMENTO_ABONO_MAYOR 'EL SALDO DEL DOCUMENTO ' || NEW.egde_prefijo || NEW.egde_numero || ' ES INSUFICIENTE.';
            end
        END
    if (OK = 'N') then
        BEGIN
        select 'S' from saldos_doc_cxpagar where sdcp_tiporef = new.egde_tipodoc and
            sdcp_idref = new.egde_iddoc and sdcp_fecha = :FEC into :EXISTE;
        if (Existe = 'S') then
            begin
            /* actualice el saldo del dia */
            UPDATE saldos_doc_cxpagar
                SET SDCP_ABONO = SDCP_ABONO + (NEW.egde_abono + NEW.egde_dtof + NEW.egde_difcambio),
                    SDCP_ABRTFTE = SDCP_ABRTFTE + NEW.egde_RTFTE,
                    SDCP_ABRTIVA = SDCP_ABRTIVA + NEW.egde_RTIVA,
                    SDCP_ABRTICA = SDCP_ABRTICA + NEW.egde_RTICA,
                    SDCP_TRM = :TRM
                WHERE SDCP_TIPOREF = NEW.EGDE_TIPODOC AND SDCP_IDREF = NEW.egde_IDDOC AND SDCP_FECHA = :FEC;
            END
        ELSE
            BEGIN
            /* Inserte un nuevo saldo diario */
            INSERT INTO SALDOS_DOC_CXPAGAR (SDCP_TIPOREF, SDCP_IDREF, SDCP_FECHA, TERC_NIT, SDCP_RTEFTE, SDCP_RTIVA, SDCP_RTICA, SDCP_ABONO, SDCP_ABRTFTE, SDCP_ABRTIVA, SDCP_ABRTICA, SDCP_DEBITO, SDCP_MONTO, SDCP_TRM)
                VALUES (NEW.EGDE_TIPODOC, NEW.EGDE_IDDOC, :FEC, :NIT, 0, 0, 0, (NEW.egde_abono+NEW.egde_dtof+NEW.egde_difcambio), NEW.egde_rtfte, NEW.egde_rtiva, NEW.egde_rtica, 'N', 0, :TRM);
            END
        END
    /* actualice el registro en mov_proveedor (por si son varios items) */
    EXISTE = 'N';
    SELECT 'S' FROM MOVIMIENTO_PROVEEDOR WHERE MVPR_TIPOREF = 62 AND MVPR_IDREF = NEW.EGRE_ID INTO :EXISTE;
    if (EXISTE = 'S') then
        begin
        UPDATE movimiento_proveedor
            SET MVPR_MONTO = MVPR_MONTO + (NEW.egde_abono + NEW.egde_dtof + NEW.egde_difcambio),
                MVPR_RTFTE = MVPR_RTFTE + NEW.egde_rtfte,
                MVPR_RTIVA = MVPR_RTIVA + NEW.egde_rtiva,
                MVPR_RTICA = MVPR_RTICA + NEW.egde_rtica,
                MVPR_TRM = :TRM
            WHERE MVPR_TIPOREF = 62 AND MVPR_IDREF = NEW.EGRE_ID;
        end
    ELSE
        INSERT INTO MOVIMIENTO_PROVEEDOR (MVPR_ID, TERC_NIT, MVPR_TIPOREF, MVPR_IDREF, MVPR_FECHA, MVPR_VENCE, MVPR_CONC, MVPR_MONTO, MVPR_RTFTE, MVPR_RTIVA, MVPR_RTICA, MVPR_DEBITO, MVPR_ABONO, MVPR_PREFIJO, MVPR_NUMERO, MVPR_TRM)
            VALUES (GEN_ID(ID_MOVPROV, 1), :NIT, 62, NEW.EGRE_ID, :FEC, :FEC, :CONCEPTO, (NEW.EGDE_ABONO+NEW.egde_dtof+NEW.egde_difcambio), NEW.EGDE_RTFTE, NEW.EGDE_RTIVA, NEW.EGDE_RTICA, 'N', 'S', :PREFIJO, :NUMERO, :TRM);
    END
END
^

SET TERM ; ^

SET TERM ^ ;

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

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER EGRESOS_DETALLE_AU FOR EGRESOS_DETALLE
ACTIVE AFTER UPDATE POSITION 0
AS
declare variable EXISTE CHAR(1);
declare variable FEC DATE;
declare variable NIT VARCHAR(20);
declare variable CONCEPTO VARCHAR(60);
declare variable PREFIJO VARCHAR(4);
declare variable NUMERO VARCHAR(6);
declare variable OK CHAR(1);
declare variable EGANTI INTEGER;
declare variable RETES CHAR(2);
declare variable SALDO NUMERIC(18,2);
declare variable TRM NUMERIC(18,2);
BEGIN
select PREF_PRE, EGRE_NUMERO, EGRE_FECHA, EGRE_CONC, TERC_NIT, EGRE_TRM from EGRESOS
    where egre_id = new.egre_id into :PREFIJO, :NUMERO, :FEC, :CONCEPTO, :NIT, :TRM;
if ((OLD.EGRE_ID <> 0) and (old.egde_anulado = 'N')) then
    BEGIN
    /* BORRE EL ANTICIPO SI FUE EL QUIEN LO CREO */
    OK = 'N';
    if (OLD.EGDE_TIPODOC = 55) then
        BEGIN
        SELECT EGRE_ID FROM ANTICIPOS_PROVEEDOR WHERE ANPR_ID = OLD.EGDE_IDDOC INTO :EGANTI;
        if (EGANTI = old.egre_id) then
            begin
            OK = 'S';
            UPDATE anticipos_proveedor SET ANPR_ANULADO = 'S' where ANPR_ID = OLD.EGDE_IDDOC;
            end
        END
    if (OK = 'N') then
        BEGIN
        EXISTE = 'N';
        select 'S' from saldos_doc_cxpagar where sdcp_tiporef = old.egde_tipodoc and
            sdcp_idref = old.egde_iddoc and sdcp_fecha = :FEC into :EXISTE;
        if (Existe = 'S') then
            begin
            /* Borre el viejo */
            if (old.EGRE_ID <> 0) then
                UPDATE saldos_doc_cxpagar
                    SET SDCP_ABONO = SDCP_ABONO - (old.egde_abono + OLD.egde_dtof + OLD.egde_difcambio),
                    SDCP_ABRTFTE = SDCP_ABRTFTE - old.egde_RTFTE,
                    SDCP_ABRTIVA = SDCP_ABRTIVA - old.egde_RTIVA,
                    SDCP_ABRTICA = SDCP_ABRTICA - old.egde_RTICA
                    WHERE SDCP_TIPOREF = OLD.EGDE_TIPODOC AND SDCP_IDREF = OLD.egde_IDDOC AND SDCP_FECHA = :FEC;
            end
        END
    EXISTE = 'N';
    SELECT 'S' FROM MOVIMIENTO_PROVEEDOR WHERE MVPR_TIPOREF = 62 AND MVPR_IDREF = OLD.EGRE_ID INTO :EXISTE;
    if (EXISTE = 'S') then
        begin
        /* Deshaga el viejo */
        UPDATE movimiento_proveedor
            SET MVPR_MONTO = MVPR_MONTO - (OLD.egde_abono + OLD.egde_dtof + OLD.egde_difcambio),
            MVPR_RTFTE = MVPR_RTFTE - OLD.egde_rtfte,
            MVPR_RTIVA = MVPR_RTIVA - OLD.egde_rtiva,
            MVPR_RTICA = MVPR_RTICA - OLD.egde_rtica
            WHERE MVPR_TIPOREF = 62 AND MVPR_IDREF = OLD.EGRE_ID;
        end
    END /* OLD.EGRE_ID <> 0 */
if ((NEW.EGRE_ID <> 0) and (NEW.egde_anulado = 'N')) then
    BEGIN
    /* valide que no se pase del saldo */
    execute procedure saldo_doc_cxpagar(new.egde_tipodoc, new.egde_iddoc, '9999/12/31', 0) returning_values(saldo);
    execute procedure lee_configuracion('CXPAGAR', 'SALDOS', 'DESCONTAR RETENCIONES POR CAUSACION') returning_values (RETES);
    if (SALDO < 0) then
        BEGIN
        if (RETES = 'SI') then
            begin
            if (saldo > (NEW.egde_abono + NEW.egde_dtof + NEW.egde_difcambio)) then
                EXCEPTION DOCUMENTO_ABONO_MAYOR;
            end
        ELSE
            begin
            if (saldo > (NEW.egde_abono + NEW.egde_rtfte + NEW.egde_rtiva + NEW.egde_rtica + new.egde_dtof + NEW.egde_difcambio)) then
                EXCEPTION DOCUMENTO_ABONO_MAYOR;
            end
        END
    else
        BEGIN
        if (RETES = 'SI') then
            begin
            if (saldo < (NEW.egde_abono + NEW.egde_dtof + NEW.egde_difcambio)) then
                EXCEPTION DOCUMENTO_ABONO_MAYOR;
            end
        ELSE
            begin
            if (saldo < (NEW.egde_abono + NEW.egde_rtfte + NEW.egde_rtiva + NEW.egde_rtica + NEW.egde_dtof + NEW.egde_difcambio)) then
                EXCEPTION DOCUMENTO_ABONO_MAYOR;
            end
        END
    /* AHORA REGISTRE LO NUEVO */
    OK = 'N';
    if (new.EGDE_TIPODOC = 55) then
        BEGIN
        /* BUSQUE SI TIENE EGRE_ID, SI NO LO ACTUALIZA */
        SELECT EGRE_ID FROM ANTICIPOS_PROVEEDOR WHERE ANPR_ID = NEW.EGDE_IDDOC INTO :EGANTI;
        if (EGANTI = 0) then
            BEGIN
            OK = 'S';
            UPDATE ANTICIPOS_PROVEEDOR SET EGRE_ID = NEW.EGRE_ID WHERE ANPR_ID = NEW.EGDE_IDDOC;
            END
        END
    if (OK = 'N') then
        BEGIN
        EXISTE = 'N';
        select 'S' from saldos_doc_cxpagar where sdcp_tiporef = new.egde_tipodoc and
            sdcp_idref = new.egde_iddoc and sdcp_fecha = :FEC into :EXISTE;
        if (Existe = 'S') then
            /* actualice el saldo del dia */
            UPDATE saldos_doc_cxpagar
                SET SDCP_ABONO = SDCP_ABONO + (NEW.egde_abono + NEW.egde_dtof + NEW.egde_difcambio),
                SDCP_ABRTFTE = SDCP_ABRTFTE + NEW.egde_RTFTE,
                SDCP_ABRTIVA = SDCP_ABRTIVA + NEW.egde_RTIVA,
                SDCP_ABRTICA = SDCP_ABRTICA + NEW.egde_RTICA,
                SDCP_TRM = :TRM
                WHERE SDCP_TIPOREF = NEW.EGDE_TIPODOC AND SDCP_IDREF = NEW.egde_IDDOC AND SDCP_FECHA = :FEC;
        else
            /* Inserte un nuevo saldo diario */
            INSERT INTO SALDOS_DOC_CXPAGAR (SDCP_TIPOREF, SDCP_IDREF, SDCP_FECHA, TERC_NIT, SDCP_RTEFTE, SDCP_RTIVA, SDCP_RTICA, SDCP_ABONO, SDCP_ABRTFTE, SDCP_ABRTIVA, SDCP_ABRTICA, SDCP_DEBITO, SDCP_MONTO, SDCP_TRM)
                VALUES (NEW.EGDE_TIPODOC, NEW.EGDE_IDDOC, :FEC, :NIT, 0, 0, 0, (NEW.egde_abono + NEW.egde_dtof + NEW.egde_difcambio), NEW.egde_rtfte, NEW.egde_rtiva, NEW.egde_rtica, 'N', 0, :TRM);
        END /* ok = n */
    /* Registre o actualice el registro en movimiento_proveedor */
    EXISTE = 'N';
    SELECT 'S' FROM MOVIMIENTO_PROVEEDOR WHERE MVPR_TIPOREF = 62 AND MVPR_IDREF = NEW.EGRE_ID INTO :EXISTE;
    if (EXISTE = 'S') then
        /* Actualice el nuevo */
        UPDATE movimiento_proveedor
            SET MVPR_MONTO = MVPR_MONTO + (NEW.egde_abono + NEW.egde_dtof + NEW.egde_difcambio),
                MVPR_RTFTE = MVPR_RTFTE + NEW.egde_rtfte,
                MVPR_RTIVA = MVPR_RTIVA + NEW.egde_rtiva,
                MVPR_RTICA = MVPR_RTICA + NEW.egde_rtica,
                MVPR_TRM = :TRM
            WHERE MVPR_TIPOREF = 62 AND MVPR_IDREF = NEW.EGRE_ID;
    ELSE
        INSERT INTO MOVIMIENTO_PROVEEDOR (MVPR_ID, TERC_NIT, MVPR_TIPOREF, MVPR_IDREF, MVPR_FECHA, MVPR_VENCE, MVPR_CONC, MVPR_MONTO, MVPR_RTFTE, MVPR_RTIVA, MVPR_RTICA, MVPR_DEBITO, MVPR_ABONO, MVPR_PREFIJO, MVPR_NUMERO, MVPR_TRM)
            VALUES (GEN_ID(ID_MOVPROV, 1), :NIT, 62, NEW.EGRE_ID, :FEC, :FEC, :CONCEPTO, (NEW.EGDE_ABONO + NEW.egde_dtof + NEW.egde_difcambio), NEW.EGDE_RTFTE, NEW.EGDE_RTIVA, NEW.EGDE_RTICA, 'N', 'S', :PREFIJO, :NUMERO, :TRM);
    end
END
^

SET TERM ; ^

SET TERM ^ ;

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

SET TERM ; ^

SET TERM ^ ;

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

SET TERM ; ^

SET TERM ^ ;

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

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

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

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER RECIBOS_CAJA_CRUCEC_AI FOR RECIBOS_CAJA_CRUCEC
ACTIVE AFTER INSERT POSITION 0
AS
declare variable EXISTE CHAR(1);
declare variable FEC DATE;
declare variable NIT VARCHAR(20);
declare variable CONCEPTO VARCHAR(60);
declare variable PREFIJO VARCHAR(4);
declare variable NUMERO VARCHAR(6);
declare variable OK CHAR(1);
declare variable RETES CHAR(2);
declare variable SALDO NUMERIC(18,2);
declare variable TRM NUMERIC(18,2);
BEGIN
/* Abone el documento referenciado  */
select PREF_PRE, RECA_NUMERO, RECA_FECHA, RECA_CONC, TERC_NIT, RECA_TRM
    from RECIBOS_CAJA where RECA_ID = new.reca_id into :PREFIJO, :NUMERO, :FEC, :CONCEPTO, :NIT, :TRM;
if ((NEW.RECA_ID <> 0) and (new.rccr_anulado = 'N')) then
    BEGIN
    OK = 'N';
    /* valide que no se pase del saldo */
    execute procedure saldo_doc_cxpagar(new.rccr_tipodoc, new.rccr_iddoc, '9999/12/31', 0) returning_values(saldo);
    execute procedure lee_configuracion('CXPAGAR', 'SALDOS', 'DESCONTAR RETENCIONES POR CAUSACION') returning_values (RETES);
    if (SALDO < 0) then
        BEGIN
        if (RETES = 'SI') then
            begin
            if (saldo > (NEW.rccr_abono+NEW.rccr_difcambio+NEW.rccr_dtof)) then
                EXCEPTION DOCUMENTO_ABONO_MAYOR;
            end
        ELSE
            begin
            if (saldo > (NEW.rccr_abono + NEW.rccr_rtfte + NEW.rccr_rtiva + NEW.rccr_rtica + new.rccr_dtof + NEW.rccr_difcambio)) then
                EXCEPTION DOCUMENTO_ABONO_MAYOR;
            end
        END
    else
        BEGIN
        if (RETES = 'SI') then
            begin
            if (saldo < (NEW.rccr_abono+NEW.rccr_dtof+NEW.rccr_difcambio)) then
                EXCEPTION DOCUMENTO_ABONO_MAYOR;
            end
        ELSE
            begin
            if (saldo < (NEW.rccr_abono + NEW.rccr_rtfte + NEW.rccr_rtiva + NEW.rccr_rtica + NEW.rccr_dtof + NEW.rccr_difcambio)) then
                EXCEPTION DOCUMENTO_ABONO_MAYOR;
            end
        END
    if (OK = 'N') then
        BEGIN
        select 'S' from saldos_doc_cxpagar where sdcp_tiporef = new.rccr_tipodoc and
            sdcp_idref = new.rccr_iddoc and sdcp_fecha = :FEC into :EXISTE;
        if (Existe = 'S') then
            begin
            /* actualice el saldo del dia */
            UPDATE saldos_doc_cxpagar
                SET SDCP_ABONO = SDCP_ABONO + (NEW.rccr_abono + NEW.rccr_dtof + NEW.rccr_difcambio),
                    SDCP_ABRTFTE = SDCP_ABRTFTE + NEW.rccr_rtfte,
                    SDCP_ABRTIVA = SDCP_ABRTIVA + NEW.rccr_rtiva,
                    SDCP_ABRTICA = SDCP_ABRTICA + NEW.rccr_rtica,
                    SDCP_TRM = :TRM
                WHERE SDCP_TIPOREF = NEW.rccr_tipodoc AND SDCP_IDREF = NEW.rccr_iddoc AND SDCP_FECHA = :FEC;
            END
        ELSE
            BEGIN
            /* Inserte un nuevo saldo diario */
            INSERT INTO SALDOS_DOC_CXPAGAR (SDCP_TIPOREF, SDCP_IDREF, SDCP_FECHA, TERC_NIT, SDCP_RTEFTE, SDCP_RTIVA, SDCP_RTICA, SDCP_ABONO, SDCP_ABRTFTE, SDCP_ABRTIVA, SDCP_ABRTICA, SDCP_DEBITO, SDCP_MONTO, SDCP_TRM)
                VALUES (NEW.rccr_tipodoc, NEW.rccr_iddoc, :FEC, :NIT, 0, 0, 0, (NEW.rccr_abono+NEW.rccr_dtof+NEW.rccr_difcambio), NEW.rccr_rtfte, NEW.rccr_rtiva, NEW.rccr_rtica, 'N', 0, :TRM);
            END
        END
    /* actualice el registro en mov_proveedor (por si son varios items) */
    EXISTE = 'N';
    SELECT 'S' FROM MOVIMIENTO_PROVEEDOR WHERE MVPR_TIPOREF = 61 AND MVPR_IDREF = NEW.reca_id INTO :EXISTE;
    if (EXISTE = 'S') then
        begin
        UPDATE movimiento_proveedor
            SET MVPR_MONTO = MVPR_MONTO + (NEW.rccr_abono + NEW.rccr_dtof+NEW.rccr_difcambio),
                MVPR_RTFTE = MVPR_RTFTE + NEW.rccr_rtfte,
                MVPR_RTIVA = MVPR_RTIVA + NEW.rccr_rtiva,
                MVPR_RTICA = MVPR_RTICA + NEW.rccr_rtica,
                MVPR_TRM = :TRM
            WHERE MVPR_TIPOREF = 61 AND MVPR_IDREF = NEW.reca_id;
        end
    ELSE
        INSERT INTO MOVIMIENTO_PROVEEDOR (MVPR_ID, TERC_NIT, MVPR_TIPOREF, MVPR_IDREF, MVPR_FECHA, MVPR_VENCE, MVPR_CONC, MVPR_MONTO, MVPR_RTFTE, MVPR_RTIVA, MVPR_RTICA, MVPR_DEBITO, MVPR_ABONO, MVPR_PREFIJO, MVPR_NUMERO, MVPR_TRM)
            VALUES (GEN_ID(ID_MOVPROV, 1), :NIT, 61, NEW.reca_id, :FEC, :FEC, :CONCEPTO, (NEW.rccr_abono+NEW.rccr_dtof+NEW.rccr_difcambio), NEW.rccr_rtfte, NEW.rccr_rtiva, NEW.rccr_rtica, 'N', 'S', :PREFIJO, :NUMERO, :TRM);
    END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER RECIBOS_CAJA_CRUCEC_AD FOR RECIBOS_CAJA_CRUCEC
ACTIVE AFTER DELETE POSITION 0
as
declare variable FEC DATE;
BEGIN
if (OLD.reca_id <> 0) then
    BEGIN
    SELECT RECA_FECHA FROM RECIBOS_CAJA WHERE RECA_ID = OLD.reca_id INTO :FEC;
    if (old.rccr_anulado = 'N') then
      begin
      UPDATE saldos_doc_cxpagar
        SET SDCP_ABONO = SDCP_ABONO - (old.rccr_abono+old.rccr_dtof+OLD.rccr_difcambio),
        SDCP_ABRTFTE = SDCP_ABRTFTE - old.rccr_rtfte,
        SDCP_ABRTIVA = SDCP_ABRTIVA - old.rccr_rtiva,
        SDCP_ABRTICA = SDCP_ABRTICA - old.rccr_rtica
        WHERE SDCP_TIPOREF = OLD.rccr_tipodoc AND SDCP_IDREF = OLD.rccr_iddoc AND SDCP_FECHA = :FEC;
      /* Deshaga el viejo */
      UPDATE movimiento_proveedor
        SET MVPR_MONTO = MVPR_MONTO - (OLD.rccr_abono+old.rccr_dtof+OLD.rccr_difcambio),
        MVPR_RTFTE = MVPR_RTFTE - OLD.rccr_rtfte,
        MVPR_RTIVA = MVPR_RTIVA - OLD.rccr_rtiva,
        MVPR_RTICA = MVPR_RTICA - OLD.rccr_rtica
        WHERE MVPR_TIPOREF = 61 AND MVPR_IDREF = OLD.reca_id;
      end
    END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER RECIBOS_CAJA_CRUCEC_AU FOR RECIBOS_CAJA_CRUCEC
ACTIVE AFTER UPDATE POSITION 0
as
declare variable EXISTE CHAR(1);
declare variable FEC DATE;
declare variable NIT VARCHAR(20);
declare variable CONCEPTO VARCHAR(60);
declare variable PREFIJO VARCHAR(4);
declare variable NUMERO VARCHAR(6);
declare variable RETES CHAR(2);
declare variable SALDO NUMERIC(18,2);
declare variable TRM NUMERIC(18,2);
BEGIN
select PREF_PRE, RECA_NUMERO, RECA_FECHA, RECA_CONC, TERC_NIT, RECA_TRM from RECIBOS_CAJA
    where reca_id = new.reca_id into :PREFIJO, :NUMERO, :FEC, :CONCEPTO, :NIT, :TRM;
if ((OLD.reca_id <> 0) and (old.rccr_anulado = 'N')) then
    BEGIN
    EXISTE = 'N';
    select 'S' from saldos_doc_cxpagar where sdcp_tiporef = old.rccr_tipodoc and
        sdcp_idref = old.rccr_iddoc and sdcp_fecha = :FEC into :EXISTE;
    if (Existe = 'S') then
        UPDATE saldos_doc_cxpagar
            SET SDCP_ABONO = SDCP_ABONO - (old.rccr_abono + OLD.rccr_dtof+OLD.rccr_difcambio),
            SDCP_ABRTFTE = SDCP_ABRTFTE - old.rccr_rtfte,
            SDCP_ABRTIVA = SDCP_ABRTIVA - old.rccr_rtiva,
            SDCP_ABRTICA = SDCP_ABRTICA - old.rccr_rtica
            WHERE SDCP_TIPOREF = OLD.rccr_tipodoc AND SDCP_IDREF = OLD.rccr_iddoc AND SDCP_FECHA = :FEC;
    EXISTE = 'N';
    SELECT 'S' FROM MOVIMIENTO_PROVEEDOR WHERE MVPR_TIPOREF = 61 AND MVPR_IDREF = OLD.reca_id INTO :EXISTE;
    if (EXISTE = 'S') then
        UPDATE movimiento_proveedor
            SET MVPR_MONTO = MVPR_MONTO - (OLD.rccr_abono + OLD.rccr_dtof+OLD.rccr_difcambio),
            MVPR_RTFTE = MVPR_RTFTE - OLD.rccr_rtfte,
            MVPR_RTIVA = MVPR_RTIVA - OLD.rccr_rtiva,
            MVPR_RTICA = MVPR_RTICA - OLD.rccr_rtica
            WHERE MVPR_TIPOREF = 61 AND MVPR_IDREF = OLD.reca_id;
    END
if ((NEW.reca_id <> 0) and (NEW.rccr_anulado = 'N')) then
    BEGIN
    /* valide que no se pase del saldo */
/*    execute procedure saldo_doc_cxpagar(new.rccr_tipodoc, new.rccr_iddoc, '9999/12/31') returning_values(saldo);*/
    execute procedure lee_configuracion('CXPAGAR', 'SALDOS', 'DESCONTAR RETENCIONES POR CAUSACION') returning_values (RETES);
    if (SALDO < 0) then
        BEGIN
        if (RETES = 'SI') then
            begin
            if (saldo > (NEW.rccr_abono+NEW.rccr_dtof+NEW.rccr_difcambio)) then
                EXCEPTION DOCUMENTO_ABONO_MAYOR;
            end
        ELSE
            begin
            if (saldo > (NEW.rccr_abono + NEW.rccr_rtfte + NEW.rccr_rtiva + NEW.rccr_rtica + new.rccr_dtof+NEW.rccr_difcambio)) then
                EXCEPTION DOCUMENTO_ABONO_MAYOR;
            end
        END
    else
        BEGIN
        if (RETES = 'SI') then
            begin
            if (saldo < (NEW.rccr_abono+NEW.rccr_dtof+NEW.rccr_difcambio)) then
                EXCEPTION DOCUMENTO_ABONO_MAYOR;
            end
        ELSE
            begin
            if (saldo < (NEW.rccr_abono + NEW.rccr_rtfte + NEW.rccr_rtiva + NEW.rccr_rtica + NEW.rccr_dtof+NEW.rccr_difcambio)) then
                EXCEPTION DOCUMENTO_ABONO_MAYOR;
            end
        END
    /* AHORA REGISTRE LO NUEVO */
    EXISTE = 'N';
    select 'S' from saldos_doc_cxpagar where sdcp_tiporef = new.rccr_tipodoc and
        sdcp_idref = new.rccr_iddoc and sdcp_fecha = :FEC into :EXISTE;
    if (Existe = 'S') then
        UPDATE saldos_doc_cxpagar
            SET SDCP_ABONO = SDCP_ABONO + (NEW.rccr_abono + NEW.rccr_dtof + NEW.rccr_difcambio),
            SDCP_ABRTFTE = SDCP_ABRTFTE + NEW.rccr_rtfte,
            SDCP_ABRTIVA = SDCP_ABRTIVA + NEW.rccr_rtiva,
            SDCP_ABRTICA = SDCP_ABRTICA + NEW.rccr_rtica,
            SDCP_TRM = :TRM
            WHERE SDCP_TIPOREF = NEW.rccr_tipodoc AND SDCP_IDREF = NEW.rccr_iddoc AND SDCP_FECHA = :FEC;
    else
        INSERT INTO SALDOS_DOC_CXPAGAR (SDCP_TIPOREF, SDCP_IDREF, SDCP_FECHA, TERC_NIT, SDCP_RTEFTE, SDCP_RTIVA, SDCP_RTICA, SDCP_ABONO, SDCP_ABRTFTE, SDCP_ABRTIVA, SDCP_ABRTICA, SDCP_DEBITO, SDCP_MONTO, SDCP_TRM)
            VALUES (NEW.rccr_tipodoc, NEW.rccr_iddoc, :FEC, :NIT, 0, 0, 0, (NEW.rccr_abono + NEW.rccr_dtof + NEW.rccr_difcambio), NEW.rccr_rtfte, NEW.rccr_rtiva, NEW.rccr_rtica, 'N', 0, :TRM);
    /* Registre o actualice el registro en movimiento_proveedor */
    EXISTE = 'N';
    SELECT 'S' FROM MOVIMIENTO_PROVEEDOR WHERE MVPR_TIPOREF = 61 AND MVPR_IDREF = NEW.reca_id INTO :EXISTE;
    if (EXISTE = 'S') then
        /* Actualice el nuevo */
        UPDATE movimiento_proveedor
            SET MVPR_MONTO = MVPR_MONTO + (NEW.rccr_abono + NEW.rccr_dtof + NEW.rccr_difcambio),
                MVPR_RTFTE = MVPR_RTFTE + NEW.rccr_rtfte,
                MVPR_RTIVA = MVPR_RTIVA + NEW.rccr_rtiva,
                MVPR_RTICA = MVPR_RTICA + NEW.rccr_rtica,
                MVPR_TRM = :TRM
            WHERE MVPR_TIPOREF = 61 AND MVPR_IDREF = NEW.reca_id;
    ELSE
        INSERT INTO MOVIMIENTO_PROVEEDOR (MVPR_ID, TERC_NIT, MVPR_TIPOREF, MVPR_IDREF, MVPR_FECHA, MVPR_VENCE, MVPR_CONC, MVPR_MONTO, MVPR_RTFTE, MVPR_RTIVA, MVPR_RTICA, MVPR_DEBITO, MVPR_ABONO, MVPR_PREFIJO, MVPR_NUMERO, MVPR_TRM)
            VALUES (GEN_ID(ID_MOVPROV, 1), :NIT, 61, NEW.reca_id, :FEC, :FEC, :CONCEPTO, (NEW.rccr_abono + NEW.rccr_dtof + NEW.rccr_difcambio), NEW.rccr_rtfte, NEW.rccr_rtiva, NEW.rccr_rtica, 'N', 'S', :PREFIJO, :NUMERO, :TRM);
    end
END
^

SET TERM ; ^


/* 20081106 */
/* CARTERA SOLO EN PESOS */
SET TERM ^ ;

CREATE OR ALTER PROCEDURE CARTERA_CLIENTE(
    NIT VARCHAR(20),
    FECHA DATE,
    SUCURSAL VARCHAR(10),
    MONEDA INTEGER,
    SOLOPESOS CHAR(1))
RETURNS (
    TIPO INTEGER,
    ID INTEGER,
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(6),
    CONCEPTO VARCHAR(60),
    SALDO NUMERIC(18,2),
    RTFTE NUMERIC(18,2),
    RTIVA NUMERIC(18,2),
    RTICA NUMERIC(18,2),
    DTOF NUMERIC(18,2),
    TIPONOM VARCHAR(8),
    VENCE DATE,
    FECDOC DATE,
    DIAS INTEGER,
    RECPROV_ID INTEGER,
    RECIPROV CHAR(1),
    NOTA VARCHAR(256),
    TRMDOC NUMERIC(18,2))
AS
declare variable FEC DATE;
declare variable DESC_RTES CHAR(2);
declare variable DTOAPL NUMERIC(18,2);
declare variable IDNOTA INTEGER;
declare variable AUTORET VARCHAR(10);
declare variable FAUTORET DATE;
BEGIN
EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'DESCONTAR RETENCIONES POR CAUSACION') returning_values (DESC_RTES);
EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'FECHA AUTORETENEDOR NO DESCONTAR RETENCIONES DEL SALDO PERO SI CONTABILIZARLAS') returning_values (AUTORET);
if (AUTORET <> '') then
    FAUTORET = CAST(AUTORET AS DATE);
else
    FAUTORET = '9999/12/31';
/* LAS DE ANTES DE LA AUTORETENCION */
if (MONEDA = 0) then
  BEGIN
  if (DESC_RTES = 'SI') then
    BEGIN
    FOR SELECT MAX(SDCA_TIPOREF), MAX(SDCA_IDREF), sum(SDCA_MONTO-SDCA_ABONO-SDCA_RTFTE-SDCA_RTIVA-SDCA_RTICA), SUM(SDCA_RTFTE - SDCA_ABRTFTE), SUM(SDCA_RTIVA - SDCA_ABRTIVA), SUM(SDCA_RTICA - SDCA_ABRTICA)
        FROM saldos_doc_cartera WHERE TERC_NIT = :nit AND (SDCA_FECHA <= :FECHA) AND (SDCA_FECHA < :FAUTORET)
        group by sdca_tiporef, sdca_idref INTO :TIPO, :ID, :SALDO, :RTFTE, :RTIVA, :RTICA
        DO
        begin
        if (SALDO <> 0) then
            BEGIN
            SELECT MVCL_FECHA, MVCL_VENCE, MVCL_PREFREF, MVCL_NUMREF, MVCL_CONC, MVCL_TRM
              FROM MOVIMIENTO_CLIENTES WHERE TERC_NIT = :NIT AND mvcl_sucursal = :sucursal and MVCL_FECHA <= :FECHA AND MVCL_ABONO = 'N' and mvcl_tiporef = :tipo and mvcl_idref = :id
              INTO :FECDOC, :VENCE, :PREFIJO, :NUMERO, :CONCEPTO, :TRMDOC;
            DIAS = (FECHA -VENCE );
            SELECT TIDO_NOMCORTO FROM TIPO_DOCUMENTO WHERE TIDO_COD = :TIPO INTO :TIPONOM;
            if (TIPO = 41) then
                SELECT NDCL_DTOFMONTO, NDCL_FECHADTO FROM NOTAS_DEBITO_CLIENTES WHERE NDCL_ID = :ID INTO :DTOF, :FEC;
            if (TIPO = 42) then
                SELECT 0, NCCL_FECHA FROM NOTAS_CREDITO_CLIENTES WHERE NCCL_ID = :ID INTO :DTOF, :FEC;
            if (TIPO = 45) then
                SELECT ANCL_DTOFMONTO, ANCL_DTOFECHA FROM ANTICIPOS_CLIENTE WHERE ANCL_ID = :ID INTO :DTOF, :FEC;
            if (TIPO = 31) then
                SELECT FACT_DTOFMONTO, FACT_DTOFFECHA FROM FACTURAS WHERE FACT_ID = :ID INTO :DTOF, :FEC;
            if (TIPO = 33) then
                SELECT 0, :FECHA FROM devoluciones_ventas WHERE DEVT_ID = :ID INTO :DTOF, :FEC;

            recprov_id = 0;
            SELECT max(RCPR_ID) FROM recibo_provisional_detalle WHERE RPDE_IDDOC = :ID AND RPDE_TIPODOC = :TIPO and RPDE_ANULADO = 'N' INTO :recprov_id;
            if (recprov_id is null) then
                reciprov = 'N';
            ELSE
                reciprov = 'S';
            if (FECHA > FEC) then
                DTOF = 0;
            if (DTOF IS NULL) then
                DTOF = 0;
            if (DTOF <> 0) then
                BEGIN
                SELECT SUM(RCDE_DTOF) FROM RECIBOS_CAJA_DETALLE WHERE RCDE_IDDOC = :ID AND RCDE_TIPODOC = :TIPO INTO :DTOAPL;
                if (DTOAPL IS NULL) then
                    DTOAPL = 0;
                DTOF = DTOF - DTOAPL;
                END
            if (RTFTE IS NULL) then
                RTFTE = 0;
            if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) THEN
                BEGIN
                if (RTFTE > 0) then
                    RTFTE = 0;
                END
            ELSE
                BEGIN
                if (RTFTE < 0) then
                    RTFTE = 0;
                END

            if (RTIVA IS NULL) then
                RTIVA = 0;
            if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) THEN
                BEGIN
                if (RTIVA > 0) then
                    RTIVA = 0;
                END
            ELSE
                BEGIN
                if (RTIVA < 0) then
                    RTIVA = 0;
                END

            if (RTICA IS NULL) then
                RTICA = 0;
            if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) THEN
                BEGIN
                if (RTICA > 0) then
                    RTICA = 0;
                END
            ELSE
                BEGIN
                if (RTICA < 0) then
                    RTICA = 0;
                END

            /* SI TIENE NOTA AGREGUELA */
            SELECT MAX(NOCL_ID) FROM NOTAS_CLIENTES WHERE TERC_NIT = :NIT AND CLSU_COD = :SUCURSAL AND NOCL_TIPODOC = :TIPO AND NOCL_IDDOC = :ID INTO :IDNOTA;
            if (IDNOTA IS NOT NULL) then
                SELECT NOCL_TEXTO FROM NOTAS_CLIENTES WHERE NOCL_ID = :IDNOTA INTO :NOTA;
            else
                NOTA = '';
            if ((SOLOPESOS = 'N') or (TRMDOC = 1)) then
                SUSPEND;
            END
        end
    /* LAS DE DESPUES DE LA AUTORETENCION */
    FOR SELECT MAX(SDCA_TIPOREF), MAX(SDCA_IDREF), sum(SDCA_MONTO-SDCA_ABONO-SDCA_RTIVA-SDCA_RTICA), 0, SUM(SDCA_RTIVA - SDCA_ABRTIVA), SUM(SDCA_RTICA - SDCA_ABRTICA)
        FROM saldos_doc_cartera WHERE (TERC_NIT = :nit) AND (SDCA_FECHA <= :FECHA) AND (SDCA_FECHA >= :FAUTORET) group by sdca_tiporef, sdca_idref
        INTO :TIPO, :ID, :SALDO, :RTFTE, :RTIVA, :RTICA
        DO
        begin
        if (SALDO <> 0) then
            BEGIN
            SELECT MVCL_FECHA, MVCL_VENCE, MVCL_PREFREF, MVCL_NUMREF, MVCL_CONC, MVCL_TRM
              FROM MOVIMIENTO_CLIENTES WHERE TERC_NIT = :NIT AND mvcl_sucursal = :sucursal and MVCL_FECHA <= :FECHA AND MVCL_ABONO = 'N' and mvcl_tiporef = :tipo and mvcl_idref = :id
              INTO :FECDOC, :VENCE, :PREFIJO, :NUMERO, :CONCEPTO, :TRMDOC;
            DIAS = (FECHA -VENCE );
            SELECT TIDO_NOMCORTO FROM TIPO_DOCUMENTO WHERE TIDO_COD = :TIPO INTO :TIPONOM;
            if (TIPO = 41) then
                SELECT NDCL_DTOFMONTO, NDCL_FECHADTO FROM NOTAS_DEBITO_CLIENTES WHERE NDCL_ID = :ID INTO :DTOF, :FEC;
            if (TIPO = 42) then
                SELECT 0, NCCL_FECHA FROM NOTAS_CREDITO_CLIENTES WHERE NCCL_ID = :ID INTO :DTOF, :FEC;
            if (TIPO = 45) then
                SELECT ANCL_DTOFMONTO, ANCL_DTOFECHA FROM ANTICIPOS_CLIENTE WHERE ANCL_ID = :ID INTO :DTOF, :FEC;
            if (TIPO = 31) then
                SELECT FACT_DTOFMONTO, FACT_DTOFFECHA FROM FACTURAS WHERE FACT_ID = :ID INTO :DTOF, :FEC;
            if (TIPO = 33) then
                SELECT 0, :FECHA FROM devoluciones_ventas WHERE DEVT_ID = :ID INTO :DTOF, :FEC;

            recprov_id = 0;
            SELECT max(RCPR_ID) FROM recibo_provisional_detalle WHERE RPDE_IDDOC = :ID AND RPDE_TIPODOC = :TIPO and RPDE_ANULADO = 'N' INTO :recprov_id;
            if (recprov_id is null) then
                reciprov = 'N';
            ELSE
                reciprov = 'S';
            if (FECHA > FEC) then
                DTOF = 0;
            if (DTOF IS NULL) then
                DTOF = 0;
            if (DTOF <> 0) then
                BEGIN
                SELECT SUM(RCDE_DTOF) FROM RECIBOS_CAJA_DETALLE WHERE RCDE_IDDOC = :ID AND RCDE_TIPODOC = :TIPO INTO :DTOAPL;
                if (DTOAPL IS NULL) then
                    DTOAPL = 0;
                DTOF = DTOF - DTOAPL;
                END

            if (RTIVA IS NULL) then
                RTIVA = 0;
            if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) THEN
                BEGIN
                if (RTIVA > 0) then
                    RTIVA = 0;
                END
            ELSE
                BEGIN
                if (RTIVA < 0) then
                    RTIVA = 0;
                END

            if (RTICA IS NULL) then
                RTICA = 0;
            if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) THEN
                BEGIN
                if (RTICA > 0) then
                    RTICA = 0;
                END
            ELSE
                BEGIN
                if (RTICA < 0) then
                    RTICA = 0;
                END

            /* SI TIENE NOTA AGREGUELA */
            SELECT MAX(NOCL_ID) FROM NOTAS_CLIENTES WHERE TERC_NIT = :NIT AND CLSU_COD = :SUCURSAL AND NOCL_TIPODOC = :TIPO AND NOCL_IDDOC = :ID INTO :IDNOTA;
            if (IDNOTA IS NOT NULL) then
                SELECT NOCL_TEXTO FROM NOTAS_CLIENTES WHERE NOCL_ID = :IDNOTA INTO :NOTA;
            else
                NOTA = '';
            if ((SOLOPESOS = 'N') or (TRMDOC = 1)) then
                SUSPEND;
            END
        end
    END
  ELSE
    BEGIN
    FOR SELECT MAX(SDCA_TIPOREF), MAX(SDCA_IDREF), sum(SDCA_MONTO-SDCA_ABONO-SDCA_ABRTFTE-SDCA_ABRTIVA-SDCA_ABRTICA), SUM(SDCA_RTFTE - SDCA_ABRTFTE), SUM(SDCA_RTIVA - SDCA_ABRTIVA), SUM(SDCA_RTICA - SDCA_ABRTICA)
        FROM saldos_doc_cartera WHERE (TERC_NIT = :nit) AND (SDCA_FECHA <= :FECHA) AND (SDCA_FECHA < :FAUTORET) group by sdca_tiporef, sdca_idref
        INTO :TIPO, :ID, :SALDO, :RTFTE, :RTIVA, :RTICA
        DO
        begin
        if (SALDO <> 0) then
            BEGIN
            SELECT MVCL_FECHA, MVCL_VENCE, MVCL_PREFREF, MVCL_NUMREF, MVCL_CONC, MVCL_TRM
              FROM MOVIMIENTO_CLIENTES WHERE TERC_NIT = :NIT AND mvcl_sucursal = :sucursal and MVCL_FECHA <= :FECHA AND MVCL_ABONO = 'N' and mvcl_tiporef = :tipo and mvcl_idref = :id
              INTO :FECDOC, :VENCE, :PREFIJO, :NUMERO, :CONCEPTO, :TRMDOC;
            DIAS = (FECHA -VENCE );
            SELECT TIDO_NOMCORTO FROM TIPO_DOCUMENTO WHERE TIDO_COD = :TIPO INTO :TIPONOM;
            if (TIPO = 41) then
                SELECT NDCL_DTOFMONTO, NDCL_FECHADTO FROM NOTAS_DEBITO_CLIENTES WHERE NDCL_ID = :ID INTO :DTOF, :FEC;
            if (TIPO = 42) then
                SELECT 0, NCCL_FECHA FROM NOTAS_CREDITO_CLIENTES WHERE NCCL_ID = :ID INTO :DTOF, :FEC;
            if (TIPO = 45) then
                SELECT ANCL_DTOFMONTO, ANCL_DTOFECHA FROM ANTICIPOS_CLIENTE WHERE ANCL_ID = :ID INTO :DTOF, :FEC;
            if (TIPO = 31) then
                SELECT FACT_DTOFMONTO, FACT_DTOFFECHA FROM FACTURAS WHERE FACT_ID = :ID INTO :DTOF, :FEC;
            if (TIPO = 33) then
                SELECT 0, :FECHA FROM devoluciones_ventas WHERE DEVT_ID = :ID INTO :DTOF, :FEC;

            recprov_id = 0;
            SELECT max(RCPR_ID) FROM recibo_provisional_detalle WHERE RPDE_IDDOC = :ID AND RPDE_TIPODOC = :TIPO and RPDE_ANULADO = 'N' INTO :recprov_id;
            if (recprov_id is null) then
                reciprov = 'N';
            ELSE
                reciprov = 'S';
            if (FECHA > FEC) then
                DTOF = 0;
            if (DTOF IS NULL) then
                DTOF = 0;
            if (DTOF <> 0) then
                BEGIN
                SELECT SUM(RCDE_DTOF) FROM RECIBOS_CAJA_DETALLE WHERE RCDE_IDDOC = :ID AND RCDE_TIPODOC = :TIPO INTO :DTOAPL;
                if (DTOAPL IS NULL) then
                    DTOAPL = 0;
                DTOF = DTOF - DTOAPL;
                END
            if (RTFTE IS NULL) then
                RTFTE = 0;
            if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) THEN
                BEGIN
                if (RTFTE > 0) then
                    RTFTE = 0;
                END
            ELSE
                BEGIN
                if (RTFTE < 0) then
                    RTFTE = 0;
                END

            if (RTIVA IS NULL) then
                RTIVA = 0;
            if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) THEN
                BEGIN
                if (RTIVA > 0) then
                    RTIVA = 0;
                END
            ELSE
                BEGIN
                if (RTIVA < 0) then
                    RTIVA = 0;
                END

            if (RTICA IS NULL) then
                RTICA = 0;
            if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) THEN
                BEGIN
                if (RTICA > 0) then
                    RTICA = 0;
                END
            ELSE
                BEGIN
                if (RTICA < 0) then
                    RTICA = 0;
                END

            /* SI TIENE NOTA AGREGUELA */
            SELECT MAX(NOCL_ID) FROM NOTAS_CLIENTES WHERE TERC_NIT = :NIT AND CLSU_COD = :SUCURSAL AND NOCL_TIPODOC = :TIPO AND NOCL_IDDOC = :ID INTO :IDNOTA;
            if (IDNOTA IS NOT NULL) then
                SELECT NOCL_TEXTO FROM NOTAS_CLIENTES WHERE NOCL_ID = :IDNOTA INTO :NOTA;
            else
                NOTA = '';
            if ((SOLOPESOS = 'N') or (TRMDOC = 1)) then
                SUSPEND;
            END
        end
    /* DESPUES DE LA AUTORETENCION */
    FOR SELECT MAX(SDCA_TIPOREF), MAX(SDCA_IDREF), sum(SDCA_MONTO-SDCA_ABONO-SDCA_ABRTIVA-SDCA_ABRTICA), SUM(SDCA_RTFTE - SDCA_ABRTFTE), SUM(SDCA_RTIVA - SDCA_ABRTIVA), SUM(SDCA_RTICA - SDCA_ABRTICA)
        FROM saldos_doc_cartera WHERE (TERC_NIT = :nit) AND (SDCA_FECHA <= :FECHA) AND (SDCA_FECHA >= :FAUTORET) group by sdca_tiporef, sdca_idref
        INTO :TIPO, :ID, :SALDO, :RTFTE, :RTIVA, :RTICA
        DO
        begin
        if (SALDO <> 0) then
            BEGIN
            SELECT MVCL_FECHA, MVCL_VENCE, MVCL_PREFREF, MVCL_NUMREF, MVCL_CONC, MVCL_TRM
              FROM MOVIMIENTO_CLIENTES WHERE TERC_NIT = :NIT AND mvcl_sucursal = :sucursal and MVCL_FECHA <= :FECHA AND MVCL_ABONO = 'N' and mvcl_tiporef = :tipo and mvcl_idref = :id
              INTO :FECDOC, :VENCE, :PREFIJO, :NUMERO, :CONCEPTO, :TRMDOC;
            DIAS = (FECHA -VENCE );
            SELECT TIDO_NOMCORTO FROM TIPO_DOCUMENTO WHERE TIDO_COD = :TIPO INTO :TIPONOM;
            if (TIPO = 41) then
                SELECT NDCL_DTOFMONTO, NDCL_FECHADTO FROM NOTAS_DEBITO_CLIENTES WHERE NDCL_ID = :ID INTO :DTOF, :FEC;
            if (TIPO = 42) then
                SELECT 0, NCCL_FECHA FROM NOTAS_CREDITO_CLIENTES WHERE NCCL_ID = :ID INTO :DTOF, :FEC;
            if (TIPO = 45) then
                SELECT ANCL_DTOFMONTO, ANCL_DTOFECHA FROM ANTICIPOS_CLIENTE WHERE ANCL_ID = :ID INTO :DTOF, :FEC;
            if (TIPO = 31) then
                SELECT FACT_DTOFMONTO, FACT_DTOFFECHA FROM FACTURAS WHERE FACT_ID = :ID INTO :DTOF, :FEC;
            if (TIPO = 33) then
                SELECT 0, :FECHA FROM devoluciones_ventas WHERE DEVT_ID = :ID INTO :DTOF, :FEC;

            recprov_id = 0;
            SELECT max(RCPR_ID) FROM recibo_provisional_detalle WHERE RPDE_IDDOC = :ID AND RPDE_TIPODOC = :TIPO and RPDE_ANULADO = 'N' INTO :recprov_id;
            if (recprov_id is null) then
                reciprov = 'N';
            ELSE
                reciprov = 'S';
            if (FECHA > FEC) then
                DTOF = 0;
            if (DTOF IS NULL) then
                DTOF = 0;
            if (DTOF <> 0) then
                BEGIN
                SELECT SUM(RCDE_DTOF) FROM RECIBOS_CAJA_DETALLE WHERE RCDE_IDDOC = :ID AND RCDE_TIPODOC = :TIPO INTO :DTOAPL;
                if (DTOAPL IS NULL) then
                    DTOAPL = 0;
                DTOF = DTOF - DTOAPL;
                END

            if (RTIVA IS NULL) then
                RTIVA = 0;
            if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) THEN
                BEGIN
                if (RTIVA > 0) then
                    RTIVA = 0;
                END
            ELSE
                BEGIN
                if (RTIVA < 0) then
                    RTIVA = 0;
                END

            if (RTICA IS NULL) then
                RTICA = 0;
            if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) THEN
                BEGIN
                if (RTICA > 0) then
                    RTICA = 0;
                END
            ELSE
                BEGIN
                if (RTICA < 0) then
                    RTICA = 0;
                END

            /* SI TIENE NOTA AGREGUELA */
            SELECT MAX(NOCL_ID) FROM NOTAS_CLIENTES WHERE TERC_NIT = :NIT AND CLSU_COD = :SUCURSAL AND NOCL_TIPODOC = :TIPO AND NOCL_IDDOC = :ID INTO :IDNOTA;
            if (IDNOTA IS NOT NULL) then
                SELECT NOCL_TEXTO FROM NOTAS_CLIENTES WHERE NOCL_ID = :IDNOTA INTO :NOTA;
            else
                NOTA = '';
            if ((SOLOPESOS = 'N') or (TRMDOC = 1)) then
                SUSPEND;
            END
        end
    END
  END
ELSE
  BEGIN
  if (DESC_RTES = 'SI') then
    BEGIN
    FOR SELECT MAX(SDCA_TIPOREF), MAX(SDCA_IDREF), sum((SDCA_MONTO-SDCA_ABONO-SDCA_RTFTE-SDCA_RTIVA-SDCA_RTICA)/SDCA_TRM), SUM((SDCA_RTFTE-SDCA_ABRTFTE)/SDCA_TRM), SUM((SDCA_RTIVA-SDCA_ABRTIVA)/SDCA_TRM), SUM((SDCA_RTICA-SDCA_ABRTICA)/SDCA_TRM)
        FROM saldos_doc_cartera WHERE TERC_NIT = :nit AND (SDCA_FECHA <= :FECHA) AND (SDCA_FECHA < :FAUTORET) AND SDCA_TRM <> 1
        group by sdca_tiporef, sdca_idref INTO :TIPO, :ID, :SALDO, :RTFTE, :RTIVA, :RTICA
        DO
        begin
        if (SALDO <> 0) then
            BEGIN
            SELECT MVCL_FECHA, MVCL_VENCE, MVCL_PREFREF, MVCL_NUMREF, MVCL_CONC, MVCL_TRM
              FROM MOVIMIENTO_CLIENTES WHERE TERC_NIT = :NIT AND mvcl_sucursal = :sucursal and MVCL_FECHA <= :FECHA AND MVCL_ABONO = 'N' and mvcl_tiporef = :tipo and mvcl_idref = :id
              INTO :FECDOC, :VENCE, :PREFIJO, :NUMERO, :CONCEPTO, :TRMDOC;
            DIAS = (FECHA -VENCE );
            SELECT TIDO_NOMCORTO FROM TIPO_DOCUMENTO WHERE TIDO_COD = :TIPO INTO :TIPONOM;
            if (TIPO = 41) then
                SELECT NDCL_DTOFMONTO/NDCL_TRM, NDCL_FECHADTO FROM NOTAS_DEBITO_CLIENTES WHERE NDCL_ID = :ID INTO :DTOF, :FEC;
            if (TIPO = 42) then
                SELECT 0, NCCL_FECHA FROM NOTAS_CREDITO_CLIENTES WHERE NCCL_ID = :ID INTO :DTOF, :FEC;
            if (TIPO = 45) then
                SELECT ANCL_DTOFMONTO/ANCL_TRM, ANCL_DTOFECHA FROM ANTICIPOS_CLIENTE WHERE ANCL_ID = :ID INTO :DTOF, :FEC;
            if (TIPO = 31) then
                SELECT FACT_DTOFMONTO/FACT_TRM, FACT_DTOFFECHA FROM FACTURAS WHERE FACT_ID = :ID INTO :DTOF, :FEC;
            if (TIPO = 33) then
                SELECT 0, :FECHA FROM devoluciones_ventas WHERE DEVT_ID = :ID INTO :DTOF, :FEC;

            recprov_id = 0;
            SELECT max(RCPR_ID) FROM recibo_provisional_detalle WHERE RPDE_IDDOC = :ID AND RPDE_TIPODOC = :TIPO and RPDE_ANULADO = 'N' INTO :recprov_id;
            if (recprov_id is null) then
                reciprov = 'N';
            ELSE
                reciprov = 'S';
            if (FECHA > FEC) then
                DTOF = 0;
            if (DTOF IS NULL) then
                DTOF = 0;
            if (DTOF <> 0) then
                BEGIN
                SELECT SUM(RCDE_DTOF/RECA_TRM) FROM RECIBOS_CAJA_DETALLE D, recibos_caja R
                    WHERE R.reca_id = D.reca_id AND RCDE_IDDOC = :ID AND RCDE_TIPODOC = :TIPO INTO :DTOAPL;
                if (DTOAPL IS NULL) then
                    DTOAPL = 0;
                DTOF = DTOF - DTOAPL;
                END
            if (RTFTE IS NULL) then
                RTFTE = 0;
            if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) THEN
                BEGIN
                if (RTFTE > 0) then
                    RTFTE = 0;
                END
            ELSE
                BEGIN
                if (RTFTE < 0) then
                    RTFTE = 0;
                END

            if (RTIVA IS NULL) then
                RTIVA = 0;
            if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) THEN
                BEGIN
                if (RTIVA > 0) then
                    RTIVA = 0;
                END
            ELSE
                BEGIN
                if (RTIVA < 0) then
                    RTIVA = 0;
                END

            if (RTICA IS NULL) then
                RTICA = 0;
            if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) THEN
                BEGIN
                if (RTICA > 0) then
                    RTICA = 0;
                END
            ELSE
                BEGIN
                if (RTICA < 0) then
                    RTICA = 0;
                END

            /* SI TIENE NOTA AGREGUELA */
            SELECT MAX(NOCL_ID) FROM NOTAS_CLIENTES WHERE TERC_NIT = :NIT AND CLSU_COD = :SUCURSAL AND NOCL_TIPODOC = :TIPO AND NOCL_IDDOC = :ID INTO :IDNOTA;
            if (IDNOTA IS NOT NULL) then
                SELECT NOCL_TEXTO FROM NOTAS_CLIENTES WHERE NOCL_ID = :IDNOTA INTO :NOTA;
            else
                NOTA = '';
            SUSPEND;
            END
        end
    /* LAS DE DESPUES DE LA AUTORETENCION */
    FOR SELECT MAX(SDCA_TIPOREF), MAX(SDCA_IDREF), sum((SDCA_MONTO-SDCA_ABONO-SDCA_RTIVA-SDCA_RTICA)/SDCA_TRM), 0, SUM((SDCA_RTIVA-SDCA_ABRTIVA)/SDCA_TRM), SUM((SDCA_RTICA-SDCA_ABRTICA)/SDCA_TRM)
        FROM saldos_doc_cartera WHERE (TERC_NIT = :nit) AND (SDCA_FECHA <= :FECHA) AND (SDCA_FECHA >= :FAUTORET) group by sdca_tiporef, sdca_idref
        INTO :TIPO, :ID, :SALDO, :RTFTE, :RTIVA, :RTICA
        DO
        begin
        if (SALDO <> 0) then
            BEGIN
            SELECT MVCL_FECHA, MVCL_VENCE, MVCL_PREFREF, MVCL_NUMREF, MVCL_CONC
              FROM MOVIMIENTO_CLIENTES WHERE TERC_NIT = :NIT AND mvcl_sucursal = :sucursal and MVCL_FECHA <= :FECHA AND MVCL_ABONO = 'N' and mvcl_tiporef = :tipo and mvcl_idref = :id
              INTO :FECDOC, :VENCE, :PREFIJO, :NUMERO, :CONCEPTO;
            DIAS = (FECHA -VENCE );
            SELECT TIDO_NOMCORTO FROM TIPO_DOCUMENTO WHERE TIDO_COD = :TIPO INTO :TIPONOM;
            if (TIPO = 41) then
                SELECT NDCL_DTOFMONTO/NDCL_TRM, NDCL_FECHADTO FROM NOTAS_DEBITO_CLIENTES WHERE NDCL_ID = :ID INTO :DTOF, :FEC;
            if (TIPO = 42) then
                SELECT 0, NCCL_FECHA FROM NOTAS_CREDITO_CLIENTES WHERE NCCL_ID = :ID INTO :DTOF, :FEC;
            if (TIPO = 45) then
                SELECT ANCL_DTOFMONTO/ANCL_TRM, ANCL_DTOFECHA FROM ANTICIPOS_CLIENTE WHERE ANCL_ID = :ID INTO :DTOF, :FEC;
            if (TIPO = 31) then
                SELECT FACT_DTOFMONTO/FACT_TRM, FACT_DTOFFECHA FROM FACTURAS WHERE FACT_ID = :ID INTO :DTOF, :FEC;
            if (TIPO = 33) then
                SELECT 0, :FECHA FROM devoluciones_ventas WHERE DEVT_ID = :ID INTO :DTOF, :FEC;

            recprov_id = 0;
            SELECT max(RCPR_ID) FROM recibo_provisional_detalle WHERE RPDE_IDDOC = :ID AND RPDE_TIPODOC = :TIPO and RPDE_ANULADO = 'N' INTO :recprov_id;
            if (recprov_id is null) then
                reciprov = 'N';
            ELSE
                reciprov = 'S';
            if (FECHA > FEC) then
                DTOF = 0;
            if (DTOF IS NULL) then
                DTOF = 0;
            if (DTOF <> 0) then
                BEGIN
                SELECT SUM(RCDE_DTOF/RECA_TRM) FROM RECIBOS_CAJA_DETALLE D, RECIBOS_CAJA R
                    WHERE R.reca_id = D.reca_id AND RCDE_IDDOC = :ID AND RCDE_TIPODOC = :TIPO INTO :DTOAPL;
                if (DTOAPL IS NULL) then
                    DTOAPL = 0;
                DTOF = DTOF - DTOAPL;
                END

            if (RTIVA IS NULL) then
                RTIVA = 0;
            if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) THEN
                BEGIN
                if (RTIVA > 0) then
                    RTIVA = 0;
                END
            ELSE
                BEGIN
                if (RTIVA < 0) then
                    RTIVA = 0;
                END

            if (RTICA IS NULL) then
                RTICA = 0;
            if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) THEN
                BEGIN
                if (RTICA > 0) then
                    RTICA = 0;
                END
            ELSE
                BEGIN
                if (RTICA < 0) then
                    RTICA = 0;
                END

            /* SI TIENE NOTA AGREGUELA */
            SELECT MAX(NOCL_ID) FROM NOTAS_CLIENTES WHERE TERC_NIT = :NIT AND CLSU_COD = :SUCURSAL AND NOCL_TIPODOC = :TIPO AND NOCL_IDDOC = :ID INTO :IDNOTA;
            if (IDNOTA IS NOT NULL) then
                SELECT NOCL_TEXTO FROM NOTAS_CLIENTES WHERE NOCL_ID = :IDNOTA INTO :NOTA;
            else
                NOTA = '';
            SUSPEND;
            END
        end
    END
  ELSE
    BEGIN
    FOR SELECT MAX(SDCA_TIPOREF), MAX(SDCA_IDREF), sum((SDCA_MONTO-SDCA_ABONO-SDCA_ABRTFTE-SDCA_ABRTIVA-SDCA_ABRTICA)/SDCA_TRM), SUM((SDCA_RTFTE-SDCA_ABRTFTE)/SDCA_TRM), SUM((SDCA_RTIVA-SDCA_ABRTIVA)/SDCA_TRM), SUM((SDCA_RTICA-SDCA_ABRTICA)/SDCA_TRM)
        FROM saldos_doc_cartera WHERE (TERC_NIT = :nit) AND (SDCA_FECHA <= :FECHA) AND (SDCA_FECHA < :FAUTORET) group by sdca_tiporef, sdca_idref
        INTO :TIPO, :ID, :SALDO, :RTFTE, :RTIVA, :RTICA
        DO
        begin
        if (SALDO <> 0) then
            BEGIN
            SELECT MVCL_FECHA, MVCL_VENCE, MVCL_PREFREF, MVCL_NUMREF, MVCL_CONC
              FROM MOVIMIENTO_CLIENTES WHERE TERC_NIT = :NIT AND mvcl_sucursal = :sucursal and MVCL_FECHA <= :FECHA AND MVCL_ABONO = 'N' and mvcl_tiporef = :tipo and mvcl_idref = :id
              INTO :FECDOC, :VENCE, :PREFIJO, :NUMERO, :CONCEPTO;
            DIAS = (FECHA -VENCE );
            SELECT TIDO_NOMCORTO FROM TIPO_DOCUMENTO WHERE TIDO_COD = :TIPO INTO :TIPONOM;
            if (TIPO = 41) then
                SELECT NDCL_DTOFMONTO/NDCL_TRM, NDCL_FECHADTO FROM NOTAS_DEBITO_CLIENTES WHERE NDCL_ID = :ID INTO :DTOF, :FEC;
            if (TIPO = 42) then
                SELECT 0, NCCL_FECHA FROM NOTAS_CREDITO_CLIENTES WHERE NCCL_ID = :ID INTO :DTOF, :FEC;
            if (TIPO = 45) then
                SELECT ANCL_DTOFMONTO/ANCL_TRM, ANCL_DTOFECHA FROM ANTICIPOS_CLIENTE WHERE ANCL_ID = :ID INTO :DTOF, :FEC;
            if (TIPO = 31) then
                SELECT FACT_DTOFMONTO/FACT_TRM, FACT_DTOFFECHA FROM FACTURAS WHERE FACT_ID = :ID INTO :DTOF, :FEC;
            if (TIPO = 33) then
                SELECT 0, :FECHA FROM devoluciones_ventas WHERE DEVT_ID = :ID INTO :DTOF, :FEC;

            recprov_id = 0;
            SELECT max(RCPR_ID) FROM recibo_provisional_detalle WHERE RPDE_IDDOC = :ID AND RPDE_TIPODOC = :TIPO and RPDE_ANULADO = 'N' INTO :recprov_id;
            if (recprov_id is null) then
                reciprov = 'N';
            ELSE
                reciprov = 'S';
            if (FECHA > FEC) then
                DTOF = 0;
            if (DTOF IS NULL) then
                DTOF = 0;
            if (DTOF <> 0) then
                BEGIN
                SELECT SUM(RCDE_DTOF/RECA_TRM) FROM RECIBOS_CAJA_DETALLE D, RECIBOS_CAJA R
                    WHERE R.reca_id = D.reca_id AND RCDE_IDDOC = :ID AND RCDE_TIPODOC = :TIPO INTO :DTOAPL;
                if (DTOAPL IS NULL) then
                    DTOAPL = 0;
                DTOF = DTOF - DTOAPL;
                END
            if (RTFTE IS NULL) then
                RTFTE = 0;
            if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) THEN
                BEGIN
                if (RTFTE > 0) then
                    RTFTE = 0;
                END
            ELSE
                BEGIN
                if (RTFTE < 0) then
                    RTFTE = 0;
                END

            if (RTIVA IS NULL) then
                RTIVA = 0;
            if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) THEN
                BEGIN
                if (RTIVA > 0) then
                    RTIVA = 0;
                END
            ELSE
                BEGIN
                if (RTIVA < 0) then
                    RTIVA = 0;
                END

            if (RTICA IS NULL) then
                RTICA = 0;
            if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) THEN
                BEGIN
                if (RTICA > 0) then
                    RTICA = 0;
                END
            ELSE
                BEGIN
                if (RTICA < 0) then
                    RTICA = 0;
                END

            /* SI TIENE NOTA AGREGUELA */
            SELECT MAX(NOCL_ID) FROM NOTAS_CLIENTES WHERE TERC_NIT = :NIT AND CLSU_COD = :SUCURSAL AND NOCL_TIPODOC = :TIPO AND NOCL_IDDOC = :ID INTO :IDNOTA;
            if (IDNOTA IS NOT NULL) then
                SELECT NOCL_TEXTO FROM NOTAS_CLIENTES WHERE NOCL_ID = :IDNOTA INTO :NOTA;
            else
                NOTA = '';
            SUSPEND;
            END
        end
    /* DESPUES DE LA AUTORETENCION */
    FOR SELECT MAX(SDCA_TIPOREF), MAX(SDCA_IDREF), sum((SDCA_MONTO-SDCA_ABONO-SDCA_ABRTIVA-SDCA_ABRTICA)/SDCA_TRM), SUM((SDCA_RTFTE-SDCA_ABRTFTE)/SDCA_TRM), SUM((SDCA_RTIVA-SDCA_ABRTIVA)/SDCA_TRM), SUM((SDCA_RTICA-SDCA_ABRTICA)/SDCA_TRM)
        FROM saldos_doc_cartera WHERE (TERC_NIT = :nit) AND (SDCA_FECHA <= :FECHA) AND (SDCA_FECHA >= :FAUTORET) group by sdca_tiporef, sdca_idref
        INTO :TIPO, :ID, :SALDO, :RTFTE, :RTIVA, :RTICA
        DO
        begin
        if (SALDO <> 0) then
            BEGIN
            SELECT MVCL_FECHA, MVCL_VENCE, MVCL_PREFREF, MVCL_NUMREF, MVCL_CONC
              FROM MOVIMIENTO_CLIENTES WHERE TERC_NIT = :NIT AND mvcl_sucursal = :sucursal and MVCL_FECHA <= :FECHA AND MVCL_ABONO = 'N' and mvcl_tiporef = :tipo and mvcl_idref = :id
              INTO :FECDOC, :VENCE, :PREFIJO, :NUMERO, :CONCEPTO;
            DIAS = (FECHA -VENCE );
            SELECT TIDO_NOMCORTO FROM TIPO_DOCUMENTO WHERE TIDO_COD = :TIPO INTO :TIPONOM;
            if (TIPO = 41) then
                SELECT NDCL_DTOFMONTO/NDCL_TRM, NDCL_FECHADTO FROM NOTAS_DEBITO_CLIENTES WHERE NDCL_ID = :ID INTO :DTOF, :FEC;
            if (TIPO = 42) then
                SELECT 0, NCCL_FECHA FROM NOTAS_CREDITO_CLIENTES WHERE NCCL_ID = :ID INTO :DTOF, :FEC;
            if (TIPO = 45) then
                SELECT ANCL_DTOFMONTO/ANCL_TRM, ANCL_DTOFECHA FROM ANTICIPOS_CLIENTE WHERE ANCL_ID = :ID INTO :DTOF, :FEC;
            if (TIPO = 31) then
                SELECT FACT_DTOFMONTO/FACT_TRM, FACT_DTOFFECHA FROM FACTURAS WHERE FACT_ID = :ID INTO :DTOF, :FEC;
            if (TIPO = 33) then
                SELECT 0, :FECHA FROM devoluciones_ventas WHERE DEVT_ID = :ID INTO :DTOF, :FEC;

            recprov_id = 0;
            SELECT max(RCPR_ID) FROM recibo_provisional_detalle WHERE RPDE_IDDOC = :ID AND RPDE_TIPODOC = :TIPO and RPDE_ANULADO = 'N' INTO :recprov_id;
            if (recprov_id is null) then
                reciprov = 'N';
            ELSE
                reciprov = 'S';
            if (FECHA > FEC) then
                DTOF = 0;
            if (DTOF IS NULL) then
                DTOF = 0;
            if (DTOF <> 0) then
                BEGIN
                SELECT SUM(RCDE_DTOF/RECA_TRM) FROM RECIBOS_CAJA_DETALLE D, RECIBOS_CAJA R
                    WHERE R.reca_id = D.reca_id AND RCDE_IDDOC = :ID AND RCDE_TIPODOC = :TIPO INTO :DTOAPL;
                if (DTOAPL IS NULL) then
                    DTOAPL = 0;
                DTOF = DTOF - DTOAPL;
                END

            if (RTIVA IS NULL) then
                RTIVA = 0;
            if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) THEN
                BEGIN
                if (RTIVA > 0) then
                    RTIVA = 0;
                END
            ELSE
                BEGIN
                if (RTIVA < 0) then
                    RTIVA = 0;
                END

            if (RTICA IS NULL) then
                RTICA = 0;
            if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) THEN
                BEGIN
                if (RTICA > 0) then
                    RTICA = 0;
                END
            ELSE
                BEGIN
                if (RTICA < 0) then
                    RTICA = 0;
                END

            /* SI TIENE NOTA AGREGUELA */
            SELECT MAX(NOCL_ID) FROM NOTAS_CLIENTES WHERE TERC_NIT = :NIT AND CLSU_COD = :SUCURSAL AND NOCL_TIPODOC = :TIPO AND NOCL_IDDOC = :ID INTO :IDNOTA;
            if (IDNOTA IS NOT NULL) then
                SELECT NOCL_TEXTO FROM NOTAS_CLIENTES WHERE NOCL_ID = :IDNOTA INTO :NOTA;
            else
                NOTA = '';
            SUSPEND;
            END
        end
    END
  END
END
^

SET TERM ; ^



/* 20081107 NO IMPRIMIA EL NOMBRE DEL ORIGINAL, ESTABA EN BASE 0 */
SET TERM ^ ;

CREATE OR ALTER PROCEDURE NRO_COPIA(
    TIPO INTEGER,
    ID INTEGER)
RETURNS (
    COPIA VARCHAR(30))
AS
declare variable nrocopia INTEGER;
begin
NROCOPIA = 0;
SELECT NUCO_COPIA + 1 FROM NUMERO_COPIA WHERE TIDO_COD = :TIPO AND NUCO_ID = :ID INTO :NROCOPIA;
COPIA = '';
SELECT NOCO_NOMBRE FROM NOMBRES_COPIAS WHERE NOCO_ID = :NROCOPIA INTO :COPIA;
if (COPIA = '') then
    COPIA = 'COPIA ' || NROCOPIA;
suspend;
end
^

SET TERM ; ^



/* 20081110 MAL ORDENAMIENTO ESTABA POR NIT */
SET TERM ^ ;

CREATE OR ALTER PROCEDURE AUXILIAR_CENTRO_DESDE_HASTA(
    CUENTAINI VARCHAR(20),
    CUENTAFIN VARCHAR(20),
    PROYINI VARCHAR(4),
    PROYFIN VARCHAR(4),
    CENTINI VARCHAR(4),
    CENTFIN VARCHAR(4),
    DESDE CHAR(8),
    HASTA CHAR(8))
RETURNS (
    ID INTEGER,
    CUENTA VARCHAR(20),
    TIPOCOMP VARCHAR(3),
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA CHAR(8),
    CONCEPTO VARCHAR(60),
    NIT VARCHAR(15),
    TERCERO VARCHAR(60),
    REF VARCHAR(20),
    BASE NUMERIC(18,2),
    PORC NUMERIC(9,4),
    DEBITO NUMERIC(18,2),
    CREDITO NUMERIC(18,2),
    SALDO NUMERIC(18,2),
    PROYECTO VARCHAR(4),
    CENTRO VARCHAR(4),
    TIPOREF INTEGER,
    IDREF INTEGER,
    NOMCUENTA VARCHAR(60),
    NOMPROY VARCHAR(60),
    NOMCENT VARCHAR(60),
    CTAPROY VARCHAR(24),
    CTAPROYCENT VARCHAR(28))
AS
DECLARE VARIABLE FEC CHAR(8);
BEGIN
  /* TRAE LOS MOV. DE LA CUENTA Y TERCERO DADOS */
  FOR SELECT E.ENCO_CONSEC, TICO_COD, PRCO_PREF, ENCO_NUMERO, ENCO_FECHA, D.CUEN_COD, CODE_CONCEPTO, D.TERC_NIT,TERC_NOM, CODE_REFER, CODE_BASE, CODE_PORC, CODE_DEBITO, CODE_CREDITO, D.PROY_COD, D.CENT_COD, ENCO_TIPOREF, ENCO_IDREF, CUEN_NOM, PROY_NOM, CENT_NOM
    FROM COMPROBANTE_ENCABEZADO E, COMPROBANTE_DETALLE D, CUENTAS C, PROYECTOS P, CENTROS CE, terceros T
    WHERE E.ENCO_CONSEC = D.ENCO_CONSEC AND D.CUEN_COD = C.CUEN_COD AND D.PROY_COD = P.PROY_COD AND D.CENT_COD = CE.CENT_COD AND D.terc_nit=T.terc_nit AND D.CUEN_COD >= :CUENTAINI AND D.CUEN_COD <= :CUENTAFIN AND ENCO_FECHA >= :DESDE AND ENCO_FECHA <= :HASTA AND D.PROY_COD >= :PROYINI AND D.PROY_COD <= :PROYFIN AND D.CENT_COD >= :CENTINI AND D.CENT_COD <= :CENTFIN AND P.proy_cod = CE.proy_cod
    ORDER BY D.CUEN_COD, D.proy_cod, D.cent_cod, ENCO_FECHA
    INTO :ID, :TIPOCOMP, :PREFIJO, :NUMERO, :FECHA, :CUENTA, :CONCEPTO, :NIT, :TERCERO, :REF, :BASE, :PORC, :DEBITO, :CREDITO, :PROYECTO, :centro, :TIPOREF, :IDREF, :NOMCUENTA, :NOMPROY, :NOMCENT
    DO
        BEGIN
        /* Busca la fecha del último movimiento de la cuenta-CENTRO antes de la fecha */
        SELECT  MAX(SACU_FECHA) FROM SALDOS_CENTROS
            WHERE (CUEN_COD = :CUENTA) AND (PROY_COD = :PROYECTO) AND (CENT_COD = :CENTRO) AND (SACU_FECHA <= :FECHA) INTO :FEC;
        IF (FEC IS NULL) THEN
          SALDO = 0;
        ELSE
          /* Con la fecha máxima calcule el nuevo saldo */
          if (FEC = FECHA) then
            SELECT SACE_SALDO FROM SALDOS_CENTROS
                WHERE (CUEN_COD = :CUENTA) AND (PROY_COD = :PROYECTO) AND (CENT_COD = :CENTRO) AND (SACU_FECHA = :FEC) INTO :SALDO;
          ELSE
            SELECT SACE_SALDO + SACE_DEBITO - SACE_CREDITO FROM SALDOS_CENTROS
                WHERE (CUEN_COD = :CUENTA) AND (PROY_COD = :PROYECTO) AND (CENT_COD = :CENTRO) AND (SACU_FECHA = :FEC) INTO :SALDO;
        CTAPROY = CUENTA || PROYECTO;
        CTAPROYCENT = CUENTA || PROYECTO || CENTRO;
        SUSPEND;
        END
END
^

SET TERM ; ^



/* 20081108 */
/* no permita vencimiento anterior a la factura */
SET TERM ^ ;

CREATE OR ALTER TRIGGER FACTURAS_BI FOR FACTURAS
ACTIVE BEFORE INSERT POSITION 0
AS
declare variable NUMERO VARCHAR(6);
declare variable AUTOM CHAR(1);
declare variable EXISTE CHAR(1);
DECLARE VARIABLE VALCUPO CHAR(10);
declare variable DISPONIBLE NUMERIC(18,2);
declare variable OK CHAR(1);
declare variable SITOT CHAR(2);
declare variable CODCOBR INTEGER;
declare variable CODVEND INTEGER;
declare variable contado char(1);
declare variable BLOQAUTO CHAR(2);
declare variable FECCONTA VARCHAR(8);
declare variable FECBLO VARCHAR(8);
declare variable FECSERVER CHAR(2);
declare variable PREGTASA CHAR(2);
BEGIN
EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION', 'DOCUMENTOS', 'INHABILITAR FECHA EN DOCUMENTOS') returning_values (:fecserver);
if (FECSERVER = 'SI') then
    NEW.fact_fecha = CAST ('NOW' AS DATE);
/* doble moneda */
if ((NEW.fact_trm IS NULL) OR (NEW.FACT_TRM = 0)) then
    NEW.fact_trm = 1;
EXECUTE PROCEDURE LEE_CONFIGURACION('GENERAL', 'GENERAL', 'PREGUNTAR TASA DE CAMBIO EN DOCUMENTOS DE CARTERA') returning_values (:pregtasa);
if (PREGTASA = 'SI') then
    BEGIN
    NEW.fact_dtomonto = NEW.fact_dtomonto * NEW.fact_trm;
    NEW.fact_comimonto = NEW.fact_comimonto * NEW.fact_trm;
    NEW.fact_adicional = NEW.fact_adicional * NEW.fact_trm;
    NEW.fact_ivamonto = NEW.fact_ivamonto * NEW.fact_trm;
    NEW.fact_rtftemonto = NEW.fact_rtftemonto * NEW.fact_trm;
    NEW.fact_rtivamonto = NEW.fact_rtivamonto * NEW.fact_trm;
    NEW.fact_rticamonto = NEW.fact_rticamonto * NEW.fact_trm;
    NEW.fact_extra = NEW.fact_extra * NEW.fact_trm;
    NEW.fact_dtofmonto = NEW.fact_dtofmonto * NEW.fact_trm;
    NEW.fact_total = NEW.fact_total * NEW.fact_trm;
    NEW.fact_dtoit1 = NEW.fact_dtoit1 * NEW.fact_trm;
    NEW.fact_dtoit2 = NEW.fact_dtoit2 * NEW.fact_trm;
    NEW.fact_dtoit3 = NEW.fact_dtoit3 * NEW.fact_trm;
    END
EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION', 'POS', 'CAMBIAR FECHA DE BLOQUEO AUTOMATICAMENTE AL CAMBIAR FECHA DE LA FACTURA') RETURNING_VALUES (:bloqauto);
if (bloqauto = 'SI') then
    BEGIN
    EXECUTE PROCEDURE LEE_CONFIGURACION ('CONTABILIDAD', 'GENERAL', 'FECHA DE BLOQUEO') RETURNING_VALUES (:FECBLO);
    EXECUTE PROCEDURE fecha_a_conta (NEW.fact_fecha) returning_values (:FECCONTA);
    if (FECBLO > FECCONTA) then
        EXCEPTION CONTABILIDAD_BLOQUEADA;
    if (FECBLO < FECCONTA) then
        UPDATE CONFIGURACION
            SET CONF_VALOR = :FECCONTA
            WHERE (CONF_MODULO = 'CONTABILIDAD') AND (CONF_CATEGORIA = 'GENERAL') AND (CONF_PROPIEDAD = 'FECHA DE BLOQUEO');
    END
OK = 'S';
EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'ACCION A TOMAR SI EL CUPO DE CREDITO ES INSUFICIENTE') RETURNING_VALUES (:VALCUPO);
select auto_contado from autorizaciones where pref_pre = new.pref_pre and tido_cod = 31 into :contado;
if (contado='N') then
BEGIN
  IF (VALCUPO = 'PROHIBIR') THEN
  BEGIN
  OK = 'N';
  /* VERIFIQUE EL CUPO DE CREDITO */
  execute procedure cupo_disponible(new.TERC_NIT, NEW.fact_fecha, NEW.fact_sucursal) returning_values (:DISPONIBLE);
  if (DISPONIBLE >= NEW.FACT_TOTAL) then
    OK = 'S';
  END
END
IF (OK = 'S') THEN
  begin
  /* calcule la comision */
  EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION', 'VENDEDORES', 'COMISIONES EN VENTA INCLUYENDO IMPUESTOS') returning_values (:SITOT);
  if ((NEW.fact_comiporc IS NULL) or (NEW.fact_comiporc = 0)) THEN
    BEGIN
    if (SITOT = 'SI') then
      SELECT MAX(COMI_PORC) FROM comisiones WHERE VEND_COD = NEW.vend_cod AND
        COMI_INICIAL <= NEW.fact_total AND COMI_FINAL >= NEW.fact_total
        INTO NEW.fact_comiporc;
    else
      SELECT MAX(COMI_PORC) FROM comisiones WHERE VEND_COD = NEW.vend_cod AND
        COMI_INICIAL <= (NEW.fact_total -NEW.fact_ivamonto) AND COMI_FINAL >= (NEW.fact_total -NEW.fact_ivamonto)
        INTO NEW.fact_comiporc;
    if (NEW.fact_comiporc IS NULL) then
        NEW.fact_comiporc = 0;
    END
  if (SITOT = 'SI') then
      NEW.fact_comimonto = NEW.fact_total * NEW.fact_comiporc / 100;
  ELSE
      NEW.fact_comimonto = (NEW.fact_total -NEW.fact_ivamonto) * NEW.fact_comiporc / 100;

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

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

SET TERM ; ^


SET TERM ^ ;

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

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

EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION', 'VENDEDORES', 'COMISIONES EN VENTA INCLUYENDO IMPUESTOS') returning_values (:SITOT);
if (SITOT <> 'SI') then
    NEW.ndcl_comimonto = NEW.ndcl_monto * NEW.ndcl_comiporc / 100;
ELSE
    NEW.ndcl_comimonto = (NEW.ndcl_monto + NEW.ndcl_ivamonto) * NEW.ndcl_comiporc / 100;
if (NEW.numok = 'N') then
  BEGIN
  /* Actualice el contador del prefijo */
  SELECT PREF_ACTUAL, PREF_AUTO FROM PREFIJOS WHERE TIDO_COD = NEW.TIDO_COD AND PREF_PRE = NEW.PREF_PRE INTO :NUMERO, :AUTOM;
  /* ACTUALICE EL NUMERO EN COMPROBANTE_ENCABEZADO  */
  if (AUTOM = 'S') then
    BEGIN
    NEW.NDCL_NUMERO = NUMERO;
    NUMERO = CAST((CAST(NUMERO AS INTEGER) + 1) AS CHAR(6));
    UPDATE PREFIJOS
      SET PREF_ACTUAL = :NUMERO
    WHERE TIDO_COD = NEW.TIDO_COD AND PREF_PRE = NEW.PREF_PRE;
    END
  ELSE
    BEGIN
    if (CAST(NUMERO AS INTEGER) = CAST(NEW.NDCL_NUMERO AS INTEGER)) then
        UPDATE PREFIJOS
          SET PREF_ACTUAL = CAST((CAST(PREF_ACTUAL AS INTEGER) + 1) AS CHAR(6))
        WHERE TIDO_COD = NEW.TIDO_COD AND PREF_PRE = NEW.PREF_PRE;
    END
  EXECUTE PROCEDURE COMPLETA_CEROS (NEW.NDCL_numero) returning_values (NEW.NDCL_numero);
  NEW.numok = 'S';
  END
/* Verifique que el numero no existe previamente */
EXISTE = 'N';
SELECT 'S' FROM NOTAS_DEBITO_CLIENTES WHERE PREF_PRE = NEW.PREF_PRE AND NDCL_NUMERO = NEW.NDCL_NUMERO INTO :EXISTE;
if (EXISTE = 'S') then
    EXCEPTION DOCUMENTO_REGISTRADO;
END
^

SET TERM ; ^


/* 20081111 */
/* AGREGAR CLIENTE */
SET TERM ^ ;

CREATE OR ALTER PROCEDURE DETALLE_VENTAS_VENDEDOR(
    VEND INTEGER,
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    TIPO VARCHAR(8),
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(6),
    ID INTEGER,
    FECDOC DATE,
    CLIENTE VARCHAR(60),
    SUBTOTAL NUMERIC(18,2),
    IVA NUMERIC(18,2),
    CONSUMO NUMERIC(18,2),
    TOTAL NUMERIC(18,2))
AS
BEGIN
  TIPO = 'FACTVENT';
  FOR SELECT FACT_ID, PREF_PRE, FACT_NUMERO, FACT_FECHA, FACT_NOMCLIENTE
    FROM FACTURAS
    WHERE VEND_COD = :VEND AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN  AND FACT_ANULADO = 'N'
    INTO :ID, :PREFIJO, :NUMERO, :FECDOC, :CLIENTE DO
    BEGIN
    EXECUTE PROCEDURE TOTAL_DOC_VENTAS(31, ID) returning_values (SUBTOTAL, IVA, CONSUMO);
    TOTAL = SUBTOTAL + IVA + CONSUMO;
    SUSPEND;
    END
    
  TIPO = 'DEVOLCLI';
  FOR SELECT DEVT_ID, PREF_PRE, DEVT_NUMERO, DEVT_FECHA, DEVT_NOMTERC
    FROM DEVOLUCIONES_VENTAS
    WHERE VEND_COD = :VEND AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND DEVT_ANULADO = 'N' AND ((DEVT_REMID IS NULL) or (DEVT_REMID = 0))
    INTO :ID, :PREFIJO, :NUMERO, :FECDOC, :CLIENTE DO
    BEGIN
    EXECUTE PROCEDURE TOTAL_DOC_VENTAS(33, ID) returning_values (SUBTOTAL, IVA, CONSUMO);
    TOTAL = SUBTOTAL + IVA + CONSUMO;
    SUBTOTAL = SUBTOTAL * -1;
    IVA = IVA * -1;
    CONSUMO = CONSUMO * -1;
    TOTAL = TOTAL * -1;
    SUSPEND;
    END
END
^

SET TERM ; ^



/* 20081113 CAMBIO EN PUNTOS CLIENTE CONSOLIDADOS */
SET TERM ^ ;

CREATE OR ALTER PROCEDURE IMPR_FACTURA(
    ID INTEGER)
RETURNS (
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    VENCE DATE,
    DIASVENCE INTEGER,
    CONTCRED CHAR(17),
    NIT VARCHAR(20),
    NOMTERCERO VARCHAR(60),
    NOMCLIENTE VARCHAR(60),
    VENDEDOR INTEGER,
    NOMVENDEDOR VARCHAR(60),
    PUNTOVTA INTEGER,
    NOMPUNTOVTA VARCHAR(30),
    CODBODEGA VARCHAR(2),
    NOMBODEGA VARCHAR(30),
    AUTORIZACION VARCHAR(20),
    DESPACHO VARCHAR(255),
    TRANSPORTADOR VARCHAR(60),
    COTIZACION VARCHAR(30),
    PEDIDO VARCHAR(30),
    REMISION VARCHAR(30),
    PACIENTE VARCHAR(20),
    NOMPACIENTE VARCHAR(60),
    COMIPORC NUMERIC(9,2),
    COMIMONTO NUMERIC(18,2),
    SUBTOTAL NUMERIC(18,2),
    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),
    EXTRA NUMERIC(18,2),
    DTOFPORC NUMERIC(9,2),
    DTOFMONTO NUMERIC(18,2),
    FECHADTO DATE,
    TOTALFAC NUMERIC(18,2),
    TOTALPAGAR NUMERIC(18,2),
    OBS BLOB SUB_TYPE 1 SEGMENT SIZE 80,
    ITEM INTEGER,
    ARTICULO VARCHAR(15),
    CODBAR VARCHAR(15),
    ARTIDES VARCHAR(60),
    CANT NUMERIC(18,4),
    LOTE VARCHAR(15),
    VLOTE DATE,
    UNIDAD VARCHAR(8),
    CAJAS NUMERIC(18,4),
    FACTOR INTEGER,
    LISTAPR INTEGER,
    REFITEM VARCHAR(60),
    BODITEM VARCHAR(2),
    PRUNIT NUMERIC(18,2),
    DTOITPORC NUMERIC(9,2),
    DTOITMONTO NUMERIC(18,2),
    PRNETO NUMERIC(18,2),
    IVAPORC NUMERIC(9,2),
    IVAITMONTO NUMERIC(18,2),
    CONSUMO NUMERIC(18,2),
    SUBTOTIT NUMERIC(18,2),
    SUBTOTITCON NUMERIC(18,2),
    DTOIT1 NUMERIC(9,2),
    DTOIT2 NUMERIC(9,2),
    DTOIT3 NUMERIC(9,2),
    TOTAL NUMERIC(18,2),
    CODIGOCL VARCHAR(20),
    ZONACOD VARCHAR(2),
    ZONANOM VARCHAR(60),
    DV CHAR(1),
    DIRECCION VARCHAR(60),
    CIUDAD VARCHAR(40),
    TELEFONO VARCHAR(40),
    CONTACTO VARCHAR(60),
    FAX VARCHAR(25),
    GRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    SUBGRUPO VARCHAR(3),
    NOMSUBG VARCHAR(30),
    MARCA VARCHAR(3),
    NOMMARCA VARCHAR(30),
    PESO NUMERIC(18,4),
    ANCHO NUMERIC(18,4),
    ALTO NUMERIC(18,4),
    LARGO NUMERIC(18,4),
    SUMA1 NUMERIC(18,2),
    SUMA2 NUMERIC(18,2),
    SUMA3 NUMERIC(18,2),
    IVA1 NUMERIC(18,2),
    IVA2 NUMERIC(18,2),
    IVA3 NUMERIC(18,2),
    SUMAEX NUMERIC(18,2),
    SUMAGR NUMERIC(18,2),
    TOTCONSUMO NUMERIC(18,2),
    DTOIT1M NUMERIC(18,2),
    DTOIT2M NUMERIC(18,2),
    DTOIT3M NUMERIC(18,2),
    TOTCAJAS NUMERIC(18,2),
    VEHICULO VARCHAR(8),
    RECIBIDO NUMERIC(18,2),
    CAMBIO NUMERIC(18,2),
    HORA TIME,
    FORMAPAGO1 VARCHAR(30),
    MONTOPAGO1 NUMERIC(18,2),
    FORMAPAGO2 VARCHAR(30),
    MONTOPAGO2 NUMERIC(18,2),
    FORMAPAGO3 VARCHAR(30),
    MONTOPAGO3 NUMERIC(18,2),
    PUNTOS INTEGER,
    PUNTOSACUM INTEGER,
    PUNTOSVENC INTEGER,
    OBSITEM BLOB SUB_TYPE 1 SEGMENT SIZE 80,
    SUCUR VARCHAR(10))
AS
DECLARE VARIABLE IMPTOS CHAR(1);
DECLARE VARIABLE TARIFA INTEGER;
declare variable DEVUELTO NUMERIC(18,2);
/*DECLARE VARIABLE NROCOPIA INTEGER;*/
declare variable ORDENCOD CHAR(2);
declare variable IMPRDEV CHAR(2);
declare variable IMPR CHAR(1);
declare variable ITEMFP INTEGER;
declare variable FORMAP VARCHAR(30);
declare variable MONTOP NUMERIC(18,2);
BEGIN
  SELECT F.PREF_PRE, FACT_NUMERO, FACT_FECHA, FACT_VENCE, F.BODE_COD, BODE_NOM, F.TERC_NIT, FACT_NOMCLIENTE, F.VEND_COD, VEND_NOMBRE, F.PTVT_ID, PTVT_NOM,
    AUTO_NUMERO, FACT_DESPACHO, FACT_TRANSP, FACT_COTIZACI, FACT_PEDIDO, FACT_REMISION, FACT_COMIPORC, FACT_COMIMONTO, FACT_IVAINC, 
    FACT_DTOPOR, FACT_DTOMONTO, FACT_ADICIONAL, FACT_IVAMONTO, FACT_RTFTEPOR, FACT_RTFTEMONTO, FACT_RTIVAPOR, FACT_RTIVAMONTO, FACT_RTICAPOR, FACT_RTICAMONTO, FACT_EXTRA, FACT_DTOFPOR, FACT_DTOFMONTO, FACT_DTOFFECHA, FACT_TOTAL,
    TERC_DIR, TERC_CIU, TERC_TEL, TERC_CONTACTO, TERC_FAX, TERC_DV, FACT_DTOIT1, FACT_DTOIT2, FACT_DTOIT3,
    FACT_OBS, VEHI_COD, /*FACT_NROCOPIA,*/ FACT_RECIBIDO, FACT_SUCURSAL, FACT_DETCLI, FACT_DETCLINOM, TERC_NOM
    FROM FACTURAS F, BODEGA B, VENDEDORES V, PUNTO_VENTA P, TERCEROS T
    WHERE F.BODE_COD = B.BODE_COD AND F.VEND_COD = V.VEND_COD AND F.PTVT_ID = P.PTVT_ID AND F.TERC_NIT = T.TERC_NIT AND F.FACT_ID = :ID
    into :PREF, :NUMERO, :FECHA, :VENCE, :CODBODEGA, :NOMBODEGA, :NIT, :NOMTERCERO, :VENDEDOR, :NOMVENDEDOR, :PUNTOVTA, :NOMPUNTOVTA,
    :AUTORIZACION, :DESPACHO, :TRANSPORTADOR, :COTIZACION, :PEDIDO, :REMISION, :COMIPORC, :COMIMONTO, :IMPTOS,
    :DTOPORC, :DTOMONTO, :ADICIONAL, :IVAMONTO, :RTEFTEPORC, :RTEFTEMONTO, :RTEIVAPORC, :RTEIVAMONTO, :RTEICAPORC, :RTEICAMONTO, :EXTRA, :DTOFPORC, :DTOFMONTO, :FECHADTO, :TOTALFAC,
    :DIRECCION, :CIUDAD, :TELEFONO, :CONTACTO, :FAX, :DV, :dtoit1m, :dtoit2m, :dtoit3m,
    :OBS, :VEHICULO,/* :NROCOPIA,*/ :RECIBIDO, :SUCUR, :paciente, :nompaciente, :nomcliente;

  /* ACUMULE LOS PUNTOS, SE HACE ACA POR SER POSTERIOR AL DETALLE */
  EXECUTE PROCEDURE acumula_puntos_cliente (31, :id, :nit, :fecha) returning_values (:PUNTOS);
/*  EXECUTE PROCEDURE consulta_puntos_cliente (:id, :nit, :fecha) returning_values (:puntos, :puntosacum, :puntosvenc); */

  SELECT CLIE_COD, C.ZONA_COD, ZONA_NOM
    FROM CLIENTES C, ZONAS Z
    WHERE TERC_NIT = :NIT AND C.ZONA_COD = Z.ZONA_COD
    INTO :CODIGOCL, :ZONACOD, :ZONANOM;
  /*SELECT NOCO_NOMBRE FROM NOMBRES_COPIAS where NOCO_ID = :NROCOPIA INTO :NOMCOPIA;*/
  SELECT CLSU_DIR, CLSU_CIUDAD, CLSU_TEL FROM CLIENTE_SUCURSALES WHERE TERC_NIT = :NIT AND CLCU_COD = :SUCUR
    INTO :DIRECCION, :CIUDAD, :TELEFONO;
  /*if (NOMCOPIA IS NULL) then
    NOMCOPIA = 'COPIA No. ' || NROCOPIA;**/
  DIASVENCE = VENCE - FECHA;
  if (DIASVENCE > 0) then
    CONTCRED = 'CREDITO ' || CAST(DIASVENCE AS VARCHAR(3)) || ' DIAS';
  ELSE
    CONTCRED = 'CONTADO';
  SUBTOTAL = TOTALFAC - EXTRA - IVAMONTO - ADICIONAL + DTOMONTO;
  TOTALPAGAR = TOTALFAC - RTEFTEMONTO - RTEIVAMONTO - RTEICAMONTO;
  if (RECIBIDO <> 0) then
      CAMBIO = RECIBIDO - totalpagar;
  ELSE
    CAMBIO = 0;
  SUMAEX = 0;
  SUMA1 = 0;
  SUMA2 = 0;
  SUMA3 = 0;
  IVA1 = 0;
  IVA2 = 0;
  IVA3 = 0;
  TOTCONSUMO = 0;
  MONTOPAGO1 = 0;
  SELECT MAX(AUDI_HORA) FROM AUDITORIA WHERE TIDO_COD = 31 AND AUDI_IDDOC = :ID AND AUDI_OPER = 'I' INTO :HORA;
  /* AHORA LAS FORMAS DE PAGO, BUSQUE EL ABONO DE HOY A LA FACTURA */
  ITEMFP = 1;
  MONTOPAGO1 = 0;
  MONTOPAGO2 = 0;
  MONTOPAGO3 = 0;
  FOR SELECT FOPA_NOM, RCPA_MONTO FROM RECIBOS_CAJA_PAGO P, FORMAS_PAGO F, RECIBOS_CAJA R, RECIBOS_CAJA_DETALLE D
    WHERE R.RECA_ID = P.RECA_ID AND R.RECA_ID = D.RECA_ID AND P.FOPA_ID = F.FOPA_ID AND RECA_FECHA = :FECHA AND RCDE_TIPODOC = 31 AND RCDE_IDDOC = :ID
    INTO :formap, :MONTOP
    DO
    BEGIN
    if (ITEMFP = 1) then
        BEGIN
        FORMAPAGO1 = FORMAP;
        MONTOPAGO1 = MONTOP;
        END
    if (ITEMFP = 2) then
        BEGIN
        FORMAPAGO2 = FORMAP;
        MONTOPAGO2 = MONTOP;
        END
    if (ITEMFP = 3) then
        BEGIN
        FORMAPAGO3 = FORMAP;
        MONTOPAGO3 = MONTOP;
        END
    ITEMFP = ITEMFP + 1;
    END
  EXECUTE PROCEDURE lee_configuracion ('FACTURACION','DOCUMENTOS','ORDENAR ITEMS POR CODIGO DE ARTICULO') returning_values (:ORDENCOD);
  EXECUTE PROCEDURE lee_configuracion ('FACTURACION','POS', 'IMPRIMIR DEVOLUCIONES DE ARTICULOS NEGATIVOS') returning_values (:imprdev);
  totcajas = 0;
  if (ORDENCOD = 'SI') then
    BEGIN
    FOR SELECT FADE_ITEM, D.ARTI_COD, FADE_CODBAR, SUBSTR(FADE_DESC,1,60), FADE_CANT, FADE_UNIDAD, FADE_FACTOR, BODE_COD, FADE_LOTE, LIPR_COD, FADE_PRUNIT, FADE_DTOPORC, FADE_DTOMONTO, FADE_IVAPORC, FADE_IVAMONTO, FADE_CONSUMO, FADE_TOTAL, FADE_REFERENCIA,
        GRUP_COD, SUBG_COD, MARC_COD, ARTI_PESO, ARTI_ANCHO, ARTI_ALTO, ARTI_LARGO, TAIV_COD, FADE_DEVUELTO, FADE_OBS, FADE_DTO1, FADE_DTO2, FADE_DTO3, FADE_CAJAS
        FROM FACTURAS_DETALLE D, ARTICULO A
        WHERE D.ARTI_COD = A.ARTI_COD AND D.FACT_ID = :ID
        ORDER BY D.ARTI_COD
        INTO :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :FACTOR, :BODITEM, :LOTE, :LISTAPR, :PRUNIT, :DTOITPORC, :DTOITMONTO, :IVAPORC, :IVAITMONTO, :CONSUMO, :TOTAL, :refitem,
        :GRUPO, :SUBGRUPO, :MARCA, :PESO, :ANCHO, :ALTO, :LARGO, :TARIFA, :devuelto, :obsitem, :dtoit1, :dtoit2, :dtoit3, :cajas
        DO
          BEGIN
          if (ARTICULO = CODBAR) then
            SELECT FIRST 1 COBA_COD FROM barras_articulo WHERE ARTI_COD = :articulo INTO :CODBAR;
          if (IMPRDEV <> 'SI') then
            BEGIN
            if ((CANT >= 0) AND (DEVUELTO = 0)) then
                IMPR = 'S';
            ELSE
                IMPR = 'N'; /* ES DEVOLUCION */
            END
          ELSE
            IMPR = 'S';
          if (IMPR = 'S') then
            BEGIN
            if (IMPTOS = 'S') then
                if (cant <> 0) then
                    PRNETO = PRUNIT - DTOITMONTO - ((IVAITMONTO+CONSUMO) / CANT);
                else
                    PRNETO = PRUNIT - DTOITMONTO;
            ELSE
                PRNETO = PRUNIT - DTOITMONTO;
            SUBTOTIT = TOTAL - IVAITMONTO - CONSUMO;
            SUBTOTITCON = TOTAL;
            TOTCONSUMO = TOTCONSUMO + CONSUMO;
            SELECT LOTE_VENCE FROM LOTES WHERE LOTE_NRO = :lote AND ARTI_COD = :ARTICULO AND BODE_COD = :boditem INTO :vlote;
            if (TARIFA = 0) then
                SUMAEX = SUMAEX + TOTAL;
            if (TARIFA = 1) then
                BEGIN
                SUMA1 = SUMA1 + TOTAL - IVAITMONTO;
                IVA1 = IVA1 + IVAITMONTO;
                END
            if (TARIFA = 2) then
                BEGIN
                SUMA2 = SUMA2 + TOTAL - IVAITMONTO;
                IVA2 = IVA2 + IVAITMONTO;
                END
            if (TARIFA = 3) then
                BEGIN
                SUMA3 = SUMA3 + TOTAL - IVAITMONTO;
                IVA3 = IVA3 + IVAITMONTO;
                END
            SUMAGR = SUMA1 + SUMA2 + SUMA3;
            if (IMPTOS = 'N') then
                TOTAL = TOTAL - IVAITMONTO - CONSUMO;
            if (ANCHO IS NULL) then
                ANCHO = 0;
            if (ALTO IS NULL) then
                ALTO = 0;
            if (LARGO IS NULL) then
                LARGO = 0;
            if (PESO IS NULL) then
                PESO = 0;
            PESO = PESO * CANT;
            totcajas = totcajas + cajas;
            SUSPEND;
            END
          END
    END
ELSE
    BEGIN
    FOR SELECT FADE_ITEM, D.ARTI_COD, FADE_CODBAR, SUBSTR(FADE_DESC,1,60), FADE_CANT, FADE_UNIDAD, FADE_FACTOR, BODE_COD, FADE_LOTE, LIPR_COD, FADE_PRUNIT, FADE_DTOPORC, FADE_DTOMONTO, FADE_IVAPORC, FADE_IVAMONTO, FADE_CONSUMO, FADE_TOTAL, FADE_REFERENCIA,
        GRUP_COD, SUBG_COD, MARC_COD, ARTI_PESO, ARTI_ANCHO, ARTI_ALTO, ARTI_LARGO, TAIV_COD, FADE_DEVUELTO, FADE_OBS, FADE_DTO1, FADE_DTO2, FADE_DTO3, FADE_CAJAS
        FROM FACTURAS_DETALLE D, ARTICULO A
        WHERE D.ARTI_COD = A.ARTI_COD AND D.FACT_ID = :ID
        ORDER BY FADE_ITEM
        INTO :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :FACTOR, :BODITEM, :LOTE, :LISTAPR, :PRUNIT, :DTOITPORC, :DTOITMONTO, :IVAPORC, :IVAITMONTO, :CONSUMO, :TOTAL, :refitem, 
        :GRUPO, :SUBGRUPO, :MARCA, :PESO, :ANCHO, :ALTO, :LARGO, :TARIFA, :devuelto, :obsitem, :dtoit1, :dtoit2, :dtoit3, :cajas
        DO
          BEGIN
          if (IMPRDEV <> 'SI') then
            BEGIN
            if ((CANT >= 0) AND (DEVUELTO = 0)) then
                IMPR = 'S';
            ELSE
                IMPR = 'N'; /* ES DEVOLUCION */
            END
          ELSE
            IMPR = 'S';
          if (IMPR = 'S') then
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :GRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :MARCA INTO NOMMARCA;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :SUBGRUPO AND GRUP_COD = :GRUPO INTO :NOMSUBG;
            if (IMPTOS = 'S') then
              PRNETO = PRUNIT - DTOITMONTO - ((IVAITMONTO+CONSUMO) / CANT);
            ELSE
              PRNETO = PRUNIT - DTOITMONTO;
            SUBTOTIT = TOTAL - IVAITMONTO - CONSUMO;
            SUBTOTITCON = TOTAL;
            TOTCONSUMO = TOTCONSUMO + CONSUMO;
            SELECT LOTE_VENCE FROM LOTES WHERE LOTE_NRO = :lote AND ARTI_COD = :ARTICULO AND BODE_COD = :boditem INTO :vlote;
            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;
            if (ANCHO IS NULL) then
                ANCHO = 0;
            if (ALTO IS NULL) then
                ALTO = 0;
            if (LARGO IS NULL) then
                LARGO = 0;
            if (PESO IS NULL) then
                PESO = 0;
            PESO = PESO * CANT;
            totcajas = totcajas + cajas;
            SUSPEND;
            END
          END
    END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER PROCEDURE IMPR_REDENCION(
    ID INTEGER)
RETURNS (
    NUMERO VARCHAR(6),
    FECHA DATE,
    NIT VARCHAR(20),
    NOMCLIENTE VARCHAR(60),
    DIR VARCHAR(60),
    TEL VARCHAR(60),
    PREMIO VARCHAR(15),
    NOMPREMIO VARCHAR(60),
    PUNTOS INTEGER,
    PUNTOSACUM INTEGER,
    PUNTOSVENC INTEGER)
AS
declare variable puntosaux INTEGER;
begin
SELECT PTRE_NUMERO, PTRE_FECHA, PTRE_NIT, TERC_NOM, TERC_DIR, TERC_TEL, R.PTPR_COD, PTPR_NOMBRE, PTRE_PUNTOS
    FROM PUNTOS_REDENCION R, puntos_premios P, TERCEROS T
    WHERE R.ptre_nit = T.terc_nit AND R.ptpr_cod = P.ptpr_cod AND R.ptre_id = :ID
    INTO :NUMERO, :FECHA, :NIT, :NOMCLIENTE, :DIR, :TEL, :PREMIO, :NOMPREMIO, :PUNTOS;
/*EXECUTE PROCEDURE consulta_puntos_cliente (0, :nit, :fecha) returning_values (:puntosaux, :puntosacum, :puntosvenc);*/
suspend;
end
^

SET TERM ; ^


INSERT INTO CONFIGURACION (CONF_MODULO, CONF_CATEGORIA, CONF_PROPIEDAD, CONF_VALOR, CONF_POSIBLES, CONF_AYUDA) VALUES ('FACTURACION', 'POS', 'MANEJAR TABLA DE PUNTOS DE CLIENTE ACUMULADOS PARA VARIAS AGENCIAS', 'NO', 'SI,NO', 'SI: Los saldos acumulados, por vencer y vencidos es leído de una tabla global actualizada por el envio y no de la tabla de puntos cliente. NO: El acumulado se actualiza localmente en cada operación');
commit work;

CREATE TABLE PUNTOS_CLIENTE_ACUMULADO (
    TERC_NIT T_NIT NOT NULL,
    PTCA_FECHA DATE NOT NULL,
    PTCA_ACUMULADO T_MONTO,
    PTCA_PORVENCER T_MONTO);
alter table PUNTOS_CLIENTE_ACUMULADO
add constraint PK_PUNTOS_CLIENTE_ACUMULADO
primary key (TERC_NIT,PTCA_FECHA);


SET TERM ^ ;

CREATE OR ALTER PROCEDURE CONSULTA_PUNTOS_CLIENTE(
    IDDOC INTEGER,
    CLIENTE VARCHAR(20),
    FECHA DATE)
RETURNS (
    PTDOC INTEGER,
    PTACUM INTEGER,
    PTVENCER INTEGER,
    FECPTOS DATE)
AS
declare variable numrows integer;
declare variable anos integer;
declare variable fecaux date;
declare variable fecaux2 date;
declare variable nitcontado varchar(20);
declare variable ok integer;
declare variable ptaux integer;
declare variable PTAGENCIA CHAR(2);
begin
ptdoc = 0;
ptacum = 0;
ptvencer = 0;
ok = 1;
if (IDDOC <> 0) then
    begin
    /* verifique que no sea cliente de contado de la autorización */
    select max(auto_nitcontado) from facturas f, autorizaciones a
        where f.pref_pre = a.pref_pre and fact_id = :iddoc into :nitcontado;
    if (cliente = nitcontado) then
        ok = 0;

    if (ok <> 0) then
        begin
        select count(ptcl_id) from puntos_cliente where ptcl_nit = :cliente and ptcl_tipodoc = 31 and ptcl_iddoc = :iddoc into :numrows;
        if (numrows <> 0) then
            begin
            select ptcl_db-ptcl_cr from puntos_cliente where ptcl_nit = :cliente and ptcl_tipodoc = 31 and ptcl_iddoc = :iddoc into :ptdoc;
            end
        end
    end
/* los puntos totales */
EXECUTE PROCEDURE lee_configuracion ('FACTURACION', 'POS', 'MANEJAR TABLA DE PUNTOS DE CLIENTE ACUMULADOS PARA VARIAS AGENCIAS') returning_values (ptagencia);
if (PTAGENCIA = 'SI') then
    BEGIN
    SELECT PTCA_ACUMULADO, PTCA_PORVENCER, PTCA_FECHA FROM puntos_cliente_acumulado WHERE TERC_NIT = :cliente
        INTO :ptacum, :ptvencer, :fecptos;
    SUSPEND;
    END
ELSE
    BEGIN
    numrows = 0;
    select max(ptcl_fecha) from puntos_cliente where ptcl_nit = :cliente and ptcl_fecha <= :fecha into :fecaux;
    if (fecaux is not null) then
        select max(ptcl_saldo), sum(ptcl_db - ptcl_cr) from puntos_cliente where ptcl_nit = :cliente and ptcl_fecha = :fecaux into :ptacum, :ptvencer;
    if (ptacum is null) then
        ptacum = 0;
    if (ptvencer is null) then
        ptvencer = 0;
    ptacum = ptacum + ptvencer;
    /* reste los vencidos */
    execute procedure lee_configuracion('FACTURACION', 'FACTURAS', 'VENCIMIENTO DE PUNTOS POR CLIENTE EN AÑOS') returning_values (:anos);
    fecaux = fecha - (anos * 365);
    select max(ptcl_fecha) from puntos_cliente where ptcl_nit = :cliente and ptcl_fecha <= :fecaux into :fecaux;
    if (fecaux is not null) then
        select max(ptcl_saldo), sum(ptcl_db - ptcl_cr) from puntos_cliente where ptcl_nit = :cliente and ptcl_fecha = :fecaux into :ptvencer, :ptaux;
    else
        begin
        ptvencer = 0;
        ptaux = 0;
        end
    if (ptvencer is null) then
        ptvencer = 0;
    if (ptaux is null) then
        ptaux = 0;
    ptacum = ptacum - ptvencer - ptaux;
    /* los por vencer */
    execute procedure lee_configuracion('FACTURACION', 'FACTURAS', 'VENCIMIENTO DE PUNTOS POR CLIENTE EN AÑOS') returning_values (:anos);
    fecaux = fecha - (anos * 365);
    fecaux2 = fecha - (anos * 365) + 30;
    select sum(ptcl_db - ptcl_cr) from puntos_cliente where ptcl_nit = :cliente and ptcl_fecha >= :fecaux and ptcl_fecha <= :fecaux2 into :ptvencer;
    if (ptvencer is null) then
        ptvencer = 0;
    fecptos = :fecha;
    suspend;
    END
end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER PROCEDURE IMPR_FACTURA(
    ID INTEGER)
RETURNS (
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    VENCE DATE,
    DIASVENCE INTEGER,
    CONTCRED CHAR(17),
    NIT VARCHAR(20),
    NOMTERCERO VARCHAR(60),
    NOMCLIENTE VARCHAR(60),
    VENDEDOR INTEGER,
    NOMVENDEDOR VARCHAR(60),
    PUNTOVTA INTEGER,
    NOMPUNTOVTA VARCHAR(30),
    CODBODEGA VARCHAR(2),
    NOMBODEGA VARCHAR(30),
    AUTORIZACION VARCHAR(20),
    DESPACHO VARCHAR(255),
    TRANSPORTADOR VARCHAR(60),
    COTIZACION VARCHAR(30),
    PEDIDO VARCHAR(30),
    REMISION VARCHAR(30),
    PACIENTE VARCHAR(20),
    NOMPACIENTE VARCHAR(60),
    COMIPORC NUMERIC(9,2),
    COMIMONTO NUMERIC(18,2),
    SUBTOTAL NUMERIC(18,2),
    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),
    EXTRA NUMERIC(18,2),
    DTOFPORC NUMERIC(9,2),
    DTOFMONTO NUMERIC(18,2),
    FECHADTO DATE,
    TOTALFAC NUMERIC(18,2),
    TOTALPAGAR NUMERIC(18,2),
    OBS BLOB SUB_TYPE 1 SEGMENT SIZE 80,
    ITEM INTEGER,
    ARTICULO VARCHAR(15),
    CODBAR VARCHAR(15),
    ARTIDES VARCHAR(60),
    CANT NUMERIC(18,4),
    LOTE VARCHAR(15),
    VLOTE DATE,
    UNIDAD VARCHAR(8),
    CAJAS NUMERIC(18,4),
    FACTOR INTEGER,
    LISTAPR INTEGER,
    REFITEM VARCHAR(60),
    BODITEM VARCHAR(2),
    PRUNIT NUMERIC(18,2),
    DTOITPORC NUMERIC(9,2),
    DTOITMONTO NUMERIC(18,2),
    PRNETO NUMERIC(18,2),
    IVAPORC NUMERIC(9,2),
    IVAITMONTO NUMERIC(18,2),
    CONSUMO NUMERIC(18,2),
    SUBTOTIT NUMERIC(18,2),
    SUBTOTITCON NUMERIC(18,2),
    DTOIT1 NUMERIC(9,2),
    DTOIT2 NUMERIC(9,2),
    DTOIT3 NUMERIC(9,2),
    TOTAL NUMERIC(18,2),
    CODIGOCL VARCHAR(20),
    ZONACOD VARCHAR(2),
    ZONANOM VARCHAR(60),
    DV CHAR(1),
    DIRECCION VARCHAR(60),
    CIUDAD VARCHAR(40),
    TELEFONO VARCHAR(40),
    CONTACTO VARCHAR(60),
    FAX VARCHAR(25),
    GRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    SUBGRUPO VARCHAR(3),
    NOMSUBG VARCHAR(30),
    MARCA VARCHAR(3),
    NOMMARCA VARCHAR(30),
    PESO NUMERIC(18,4),
    ANCHO NUMERIC(18,4),
    ALTO NUMERIC(18,4),
    LARGO NUMERIC(18,4),
    SUMA1 NUMERIC(18,2),
    SUMA2 NUMERIC(18,2),
    SUMA3 NUMERIC(18,2),
    IVA1 NUMERIC(18,2),
    IVA2 NUMERIC(18,2),
    IVA3 NUMERIC(18,2),
    SUMAEX NUMERIC(18,2),
    SUMAGR NUMERIC(18,2),
    TOTCONSUMO NUMERIC(18,2),
    DTOIT1M NUMERIC(18,2),
    DTOIT2M NUMERIC(18,2),
    DTOIT3M NUMERIC(18,2),
    TOTCAJAS NUMERIC(18,2),
    VEHICULO VARCHAR(8),
    RECIBIDO NUMERIC(18,2),
    CAMBIO NUMERIC(18,2),
    HORA TIME,
    FORMAPAGO1 VARCHAR(30),
    MONTOPAGO1 NUMERIC(18,2),
    FORMAPAGO2 VARCHAR(30),
    MONTOPAGO2 NUMERIC(18,2),
    FORMAPAGO3 VARCHAR(30),
    MONTOPAGO3 NUMERIC(18,2),
    PUNTOS INTEGER,
    PUNTOSACUM INTEGER,
    PUNTOSVENC INTEGER,
    FECPTOS DATE,
    OBSITEM BLOB SUB_TYPE 1 SEGMENT SIZE 80,
    SUCUR VARCHAR(10))
AS
DECLARE VARIABLE IMPTOS CHAR(1);
DECLARE VARIABLE TARIFA INTEGER;
declare variable DEVUELTO NUMERIC(18,2);
/*DECLARE VARIABLE NROCOPIA INTEGER;*/
declare variable ORDENCOD CHAR(2);
declare variable IMPRDEV CHAR(2);
declare variable IMPR CHAR(1);
declare variable ITEMFP INTEGER;
declare variable FORMAP VARCHAR(30);
declare variable MONTOP NUMERIC(18,2);
BEGIN
  SELECT F.PREF_PRE, FACT_NUMERO, FACT_FECHA, FACT_VENCE, F.BODE_COD, BODE_NOM, F.TERC_NIT, FACT_NOMCLIENTE, F.VEND_COD, VEND_NOMBRE, F.PTVT_ID, PTVT_NOM,
    AUTO_NUMERO, FACT_DESPACHO, FACT_TRANSP, FACT_COTIZACI, FACT_PEDIDO, FACT_REMISION, FACT_COMIPORC, FACT_COMIMONTO, FACT_IVAINC, 
    FACT_DTOPOR, FACT_DTOMONTO, FACT_ADICIONAL, FACT_IVAMONTO, FACT_RTFTEPOR, FACT_RTFTEMONTO, FACT_RTIVAPOR, FACT_RTIVAMONTO, FACT_RTICAPOR, FACT_RTICAMONTO, FACT_EXTRA, FACT_DTOFPOR, FACT_DTOFMONTO, FACT_DTOFFECHA, FACT_TOTAL,
    TERC_DIR, TERC_CIU, TERC_TEL, TERC_CONTACTO, TERC_FAX, TERC_DV, FACT_DTOIT1, FACT_DTOIT2, FACT_DTOIT3,
    FACT_OBS, VEHI_COD, /*FACT_NROCOPIA,*/ FACT_RECIBIDO, FACT_SUCURSAL, FACT_DETCLI, FACT_DETCLINOM, TERC_NOM
    FROM FACTURAS F, BODEGA B, VENDEDORES V, PUNTO_VENTA P, TERCEROS T
    WHERE F.BODE_COD = B.BODE_COD AND F.VEND_COD = V.VEND_COD AND F.PTVT_ID = P.PTVT_ID AND F.TERC_NIT = T.TERC_NIT AND F.FACT_ID = :ID
    into :PREF, :NUMERO, :FECHA, :VENCE, :CODBODEGA, :NOMBODEGA, :NIT, :NOMTERCERO, :VENDEDOR, :NOMVENDEDOR, :PUNTOVTA, :NOMPUNTOVTA,
    :AUTORIZACION, :DESPACHO, :TRANSPORTADOR, :COTIZACION, :PEDIDO, :REMISION, :COMIPORC, :COMIMONTO, :IMPTOS,
    :DTOPORC, :DTOMONTO, :ADICIONAL, :IVAMONTO, :RTEFTEPORC, :RTEFTEMONTO, :RTEIVAPORC, :RTEIVAMONTO, :RTEICAPORC, :RTEICAMONTO, :EXTRA, :DTOFPORC, :DTOFMONTO, :FECHADTO, :TOTALFAC,
    :DIRECCION, :CIUDAD, :TELEFONO, :CONTACTO, :FAX, :DV, :dtoit1m, :dtoit2m, :dtoit3m,
    :OBS, :VEHICULO,/* :NROCOPIA,*/ :RECIBIDO, :SUCUR, :paciente, :nompaciente, :nomcliente;

  /* ACUMULE LOS PUNTOS, SE HACE ACA POR SER POSTERIOR AL DETALLE */
  EXECUTE PROCEDURE acumula_puntos_cliente (31, :id, :nit, :fecha) returning_values (:PUNTOS);
  EXECUTE PROCEDURE consulta_puntos_cliente (:id, :nit, :fecha) returning_values (:puntos, :puntosacum, :puntosvenc, :fecptos);

  SELECT CLIE_COD, C.ZONA_COD, ZONA_NOM
    FROM CLIENTES C, ZONAS Z
    WHERE TERC_NIT = :NIT AND C.ZONA_COD = Z.ZONA_COD
    INTO :CODIGOCL, :ZONACOD, :ZONANOM;
  /*SELECT NOCO_NOMBRE FROM NOMBRES_COPIAS where NOCO_ID = :NROCOPIA INTO :NOMCOPIA;*/
  SELECT CLSU_DIR, CLSU_CIUDAD, CLSU_TEL FROM CLIENTE_SUCURSALES WHERE TERC_NIT = :NIT AND CLCU_COD = :SUCUR
    INTO :DIRECCION, :CIUDAD, :TELEFONO;
  /*if (NOMCOPIA IS NULL) then
    NOMCOPIA = 'COPIA No. ' || NROCOPIA;**/
  DIASVENCE = VENCE - FECHA;
  if (DIASVENCE > 0) then
    CONTCRED = 'CREDITO ' || CAST(DIASVENCE AS VARCHAR(3)) || ' DIAS';
  ELSE
    CONTCRED = 'CONTADO';
  SUBTOTAL = TOTALFAC - EXTRA - IVAMONTO - ADICIONAL + DTOMONTO;
  TOTALPAGAR = TOTALFAC - RTEFTEMONTO - RTEIVAMONTO - RTEICAMONTO;
  if (RECIBIDO <> 0) then
      CAMBIO = RECIBIDO - totalpagar;
  ELSE
    CAMBIO = 0;
  SUMAEX = 0;
  SUMA1 = 0;
  SUMA2 = 0;
  SUMA3 = 0;
  IVA1 = 0;
  IVA2 = 0;
  IVA3 = 0;
  TOTCONSUMO = 0;
  MONTOPAGO1 = 0;
  SELECT MAX(AUDI_HORA) FROM AUDITORIA WHERE TIDO_COD = 31 AND AUDI_IDDOC = :ID AND AUDI_OPER = 'I' INTO :HORA;
  /* AHORA LAS FORMAS DE PAGO, BUSQUE EL ABONO DE HOY A LA FACTURA */
  ITEMFP = 1;
  MONTOPAGO1 = 0;
  MONTOPAGO2 = 0;
  MONTOPAGO3 = 0;
  FOR SELECT FOPA_NOM, RCPA_MONTO FROM RECIBOS_CAJA_PAGO P, FORMAS_PAGO F, RECIBOS_CAJA R, RECIBOS_CAJA_DETALLE D
    WHERE R.RECA_ID = P.RECA_ID AND R.RECA_ID = D.RECA_ID AND P.FOPA_ID = F.FOPA_ID AND RECA_FECHA = :FECHA AND RCDE_TIPODOC = 31 AND RCDE_IDDOC = :ID
    INTO :formap, :MONTOP
    DO
    BEGIN
    if (ITEMFP = 1) then
        BEGIN
        FORMAPAGO1 = FORMAP;
        MONTOPAGO1 = MONTOP;
        END
    if (ITEMFP = 2) then
        BEGIN
        FORMAPAGO2 = FORMAP;
        MONTOPAGO2 = MONTOP;
        END
    if (ITEMFP = 3) then
        BEGIN
        FORMAPAGO3 = FORMAP;
        MONTOPAGO3 = MONTOP;
        END
    ITEMFP = ITEMFP + 1;
    END
  EXECUTE PROCEDURE lee_configuracion ('FACTURACION','DOCUMENTOS','ORDENAR ITEMS POR CODIGO DE ARTICULO') returning_values (:ORDENCOD);
  EXECUTE PROCEDURE lee_configuracion ('FACTURACION','POS', 'IMPRIMIR DEVOLUCIONES DE ARTICULOS NEGATIVOS') returning_values (:imprdev);
  totcajas = 0;
  if (ORDENCOD = 'SI') then
    BEGIN
    FOR SELECT FADE_ITEM, D.ARTI_COD, FADE_CODBAR, SUBSTR(FADE_DESC,1,60), FADE_CANT, FADE_UNIDAD, FADE_FACTOR, BODE_COD, FADE_LOTE, LIPR_COD, FADE_PRUNIT, FADE_DTOPORC, FADE_DTOMONTO, FADE_IVAPORC, FADE_IVAMONTO, FADE_CONSUMO, FADE_TOTAL, FADE_REFERENCIA,
        GRUP_COD, SUBG_COD, MARC_COD, ARTI_PESO, ARTI_ANCHO, ARTI_ALTO, ARTI_LARGO, TAIV_COD, FADE_DEVUELTO, FADE_OBS, FADE_DTO1, FADE_DTO2, FADE_DTO3, FADE_CAJAS
        FROM FACTURAS_DETALLE D, ARTICULO A
        WHERE D.ARTI_COD = A.ARTI_COD AND D.FACT_ID = :ID
        ORDER BY D.ARTI_COD
        INTO :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :FACTOR, :BODITEM, :LOTE, :LISTAPR, :PRUNIT, :DTOITPORC, :DTOITMONTO, :IVAPORC, :IVAITMONTO, :CONSUMO, :TOTAL, :refitem,
        :GRUPO, :SUBGRUPO, :MARCA, :PESO, :ANCHO, :ALTO, :LARGO, :TARIFA, :devuelto, :obsitem, :dtoit1, :dtoit2, :dtoit3, :cajas
        DO
          BEGIN
          if (ARTICULO = CODBAR) then
            SELECT FIRST 1 COBA_COD FROM barras_articulo WHERE ARTI_COD = :articulo INTO :CODBAR;
          if (IMPRDEV <> 'SI') then
            BEGIN
            if ((CANT >= 0) AND (DEVUELTO = 0)) then
                IMPR = 'S';
            ELSE
                IMPR = 'N'; /* ES DEVOLUCION */
            END
          ELSE
            IMPR = 'S';
          if (IMPR = 'S') then
            BEGIN
            if (IMPTOS = 'S') then
                if (cant <> 0) then
                    PRNETO = PRUNIT - DTOITMONTO - ((IVAITMONTO+CONSUMO) / CANT);
                else
                    PRNETO = PRUNIT - DTOITMONTO;
            ELSE
                PRNETO = PRUNIT - DTOITMONTO;
            SUBTOTIT = TOTAL - IVAITMONTO - CONSUMO;
            SUBTOTITCON = TOTAL;
            TOTCONSUMO = TOTCONSUMO + CONSUMO;
            SELECT LOTE_VENCE FROM LOTES WHERE LOTE_NRO = :lote AND ARTI_COD = :ARTICULO AND BODE_COD = :boditem INTO :vlote;
            if (TARIFA = 0) then
                SUMAEX = SUMAEX + TOTAL;
            if (TARIFA = 1) then
                BEGIN
                SUMA1 = SUMA1 + TOTAL - IVAITMONTO;
                IVA1 = IVA1 + IVAITMONTO;
                END
            if (TARIFA = 2) then
                BEGIN
                SUMA2 = SUMA2 + TOTAL - IVAITMONTO;
                IVA2 = IVA2 + IVAITMONTO;
                END
            if (TARIFA = 3) then
                BEGIN
                SUMA3 = SUMA3 + TOTAL - IVAITMONTO;
                IVA3 = IVA3 + IVAITMONTO;
                END
            SUMAGR = SUMA1 + SUMA2 + SUMA3;
            if (IMPTOS = 'N') then
                TOTAL = TOTAL - IVAITMONTO - CONSUMO;
            if (ANCHO IS NULL) then
                ANCHO = 0;
            if (ALTO IS NULL) then
                ALTO = 0;
            if (LARGO IS NULL) then
                LARGO = 0;
            if (PESO IS NULL) then
                PESO = 0;
            PESO = PESO * CANT;
            totcajas = totcajas + cajas;
            SUSPEND;
            END
          END
    END
ELSE
    BEGIN
    FOR SELECT FADE_ITEM, D.ARTI_COD, FADE_CODBAR, SUBSTR(FADE_DESC,1,60), FADE_CANT, FADE_UNIDAD, FADE_FACTOR, BODE_COD, FADE_LOTE, LIPR_COD, FADE_PRUNIT, FADE_DTOPORC, FADE_DTOMONTO, FADE_IVAPORC, FADE_IVAMONTO, FADE_CONSUMO, FADE_TOTAL, FADE_REFERENCIA,
        GRUP_COD, SUBG_COD, MARC_COD, ARTI_PESO, ARTI_ANCHO, ARTI_ALTO, ARTI_LARGO, TAIV_COD, FADE_DEVUELTO, FADE_OBS, FADE_DTO1, FADE_DTO2, FADE_DTO3, FADE_CAJAS
        FROM FACTURAS_DETALLE D, ARTICULO A
        WHERE D.ARTI_COD = A.ARTI_COD AND D.FACT_ID = :ID
        ORDER BY FADE_ITEM
        INTO :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :FACTOR, :BODITEM, :LOTE, :LISTAPR, :PRUNIT, :DTOITPORC, :DTOITMONTO, :IVAPORC, :IVAITMONTO, :CONSUMO, :TOTAL, :refitem, 
        :GRUPO, :SUBGRUPO, :MARCA, :PESO, :ANCHO, :ALTO, :LARGO, :TARIFA, :devuelto, :obsitem, :dtoit1, :dtoit2, :dtoit3, :cajas
        DO
          BEGIN
          if (IMPRDEV <> 'SI') then
            BEGIN
            if ((CANT >= 0) AND (DEVUELTO = 0)) then
                IMPR = 'S';
            ELSE
                IMPR = 'N'; /* ES DEVOLUCION */
            END
          ELSE
            IMPR = 'S';
          if (IMPR = 'S') then
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :GRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :MARCA INTO NOMMARCA;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :SUBGRUPO AND GRUP_COD = :GRUPO INTO :NOMSUBG;
            if (IMPTOS = 'S') then
              PRNETO = PRUNIT - DTOITMONTO - ((IVAITMONTO+CONSUMO) / CANT);
            ELSE
              PRNETO = PRUNIT - DTOITMONTO;
            SUBTOTIT = TOTAL - IVAITMONTO - CONSUMO;
            SUBTOTITCON = TOTAL;
            TOTCONSUMO = TOTCONSUMO + CONSUMO;
            SELECT LOTE_VENCE FROM LOTES WHERE LOTE_NRO = :lote AND ARTI_COD = :ARTICULO AND BODE_COD = :boditem INTO :vlote;
            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;
            if (ANCHO IS NULL) then
                ANCHO = 0;
            if (ALTO IS NULL) then
                ALTO = 0;
            if (LARGO IS NULL) then
                LARGO = 0;
            if (PESO IS NULL) then
                PESO = 0;
            PESO = PESO * CANT;
            totcajas = totcajas + cajas;
            SUSPEND;
            END
          END
    END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER PROCEDURE IMPR_REDENCION(
    ID INTEGER)
RETURNS (
    NUMERO VARCHAR(6),
    FECHA DATE,
    NIT VARCHAR(20),
    NOMCLIENTE VARCHAR(60),
    DIR VARCHAR(60),
    TEL VARCHAR(60),
    PREMIO VARCHAR(15),
    NOMPREMIO VARCHAR(60),
    PUNTOS INTEGER,
    PUNTOSACUM INTEGER,
    PUNTOSVENC INTEGER,
    FECPTOS DATE)
AS
declare variable puntosaux INTEGER;
begin
SELECT PTRE_NUMERO, PTRE_FECHA, PTRE_NIT, TERC_NOM, TERC_DIR, TERC_TEL, R.PTPR_COD, PTPR_NOMBRE, PTRE_PUNTOS
    FROM PUNTOS_REDENCION R, puntos_premios P, TERCEROS T
    WHERE R.ptre_nit = T.terc_nit AND R.ptpr_cod = P.ptpr_cod AND R.ptre_id = :ID
    INTO :NUMERO, :FECHA, :NIT, :NOMCLIENTE, :DIR, :TEL, :PREMIO, :NOMPREMIO, :PUNTOS;
EXECUTE PROCEDURE consulta_puntos_cliente (0, :nit, :fecha) returning_values (:puntosaux, :puntosacum, :puntosvenc, :fecptos);
suspend;
end
^

SET TERM ; ^

SET TERM ^ ;

create procedure RESUMEN_PUNTOS_TX (
    FECHA DATE)
returns (
    CLIENTE VARCHAR(20),
    PTOSDIA NUMERIC(18,2),
    PTOSXVEN NUMERIC(18,2),
    PTOSVENC NUMERIC(18,2))
as
declare variable ANOS INTEGER;
declare variable FECAUX DATE;
begin
FOR SELECT DISTINCT PTCL_NIT FROM PUNTOS_CLIENTE
    where PTCL_FECHA = :FECHA INTO :CLIENTE
    DO
    BEGIN
    ptosdia = 0;
    SELECT SUM(PTCL_DB-PTCL_CR) FROM PUNTOS_CLIENTE
        where PTCL_FECHA = :FECHA AND PTCL_NIT = :CLIENTE INTO :PTOSDIA;

    /* reste los vencidos */
    ptosvenc = 0;
    execute procedure lee_configuracion('FACTURACION', 'FACTURAS', 'VENCIMIENTO DE PUNTOS POR CLIENTE EN AÑOS') returning_values (:anos);
    fecaux = fecha - (anos * 365);
    SELECT SUM(PTCL_DB-PTCL_CR) FROM PUNTOS_CLIENTE
        where PTCL_FECHA = :fecaux AND PTCL_NIT = :CLIENTE INTO :ptosvenc;
    if ((ptosvenc < 0) or (ptosvenc is null)) then
        ptosvenc = 0;
    /* los X vencer */
    ptosxven = 0;
    fecaux = fecaux + 30;
    SELECT SUM(PTCL_DB-PTCL_CR) FROM PUNTOS_CLIENTE
        where PTCL_FECHA = :fecaux AND PTCL_NIT = :CLIENTE INTO :ptosxven;
    if ((ptosxven < 0) or (ptosxven is null))  then
        ptosxven = 0;
    suspend;
    end
end
^

SET TERM ; ^

SET TERM ^ ;

create procedure ACTUALIZA_PUNTOS_ACUMULADOS
    (CLIENTE VARCHAR(20),
    FECHA DATE,
    PTOSDIA NUMERIC(18,2),
    PTOSXVE NUMERIC(18,2),
    PTOSVEN NUMERIC(18,2))
as
declare variable NUMROWS INTEGER;
begin
SELECT COUNT(*) FROM puntos_cliente_acumulado WHERE TERC_NIT = :CLIENTE INTO NUMROWS;
if (NUMROWS = 0) then
    INSERT INTO puntos_cliente_acumulado (TERC_NIT, PTCA_FECHA, PTCA_ACUMULADO, PTCA_PORVENCER)
        VALUES (:CLIENTE, :FECHA, :ptosdia, 0);
ELSE
    UPDATE puntos_cliente_acumulado
        SET PTCA_FECHA = :FECHA,
        PTCA_ACUMULADO = PTCA_ACUMULADO + :ptosdia - :ptosven,
        PTCA_PORVENCER = PTCA_PORVENCER - :ptosven + :ptosxve
        WHERE TERC_NIT = :CLIENTE;
end
^

SET TERM ; ^


/* 20081115 */
/* AGENCIA QUE HACE FACTURA DIRECTAMENTE SIN PEDIDO AUTOMATICO */

ALTER TABLE AUTORIZACIONES
ADD AUTO_ESPOS T_BOOLEANO;

UPDATE AUTORIZACIONES SET AUTO_ESPOS = 'N';
COMMIT WORK;

SET TERM ^ ;

CREATE OR ALTER TRIGGER FACTURAS_DETALLE_AI FOR FACTURAS_DETALLE
ACTIVE AFTER INSERT POSITION 0
AS
declare variable fec date;
declare variable NOMCLI VARCHAR(60);
declare variable CONC VARCHAR(60);
declare variable Pref varchar(4);
declare variable Num varchar(6);
declare variable Nit varchar(20);
declare variable TIPO INTEGER;
declare variable INVFAC CHAR(2);
declare variable PEDAUTO CHAR(2);
declare variable CANTREL NUMERIC(18,4);
declare variable CONSO CHAR(2);
declare variable CONSOLIDA INTEGER;
declare variable ESPOS CHAR(1);
BEGIN
select fact_fecha, pref_pre, fact_numero, terc_nit, fact_nomcliente, fact_consolida
    from facturas where fact_id = new.fact_id
    into :fec, :Pref, :Num, :Nit, :Nomcli, :Consolida;
if ((NEW.fact_id <> 0) and (new.fade_anulado = 'N')) then
    BEGIN
    EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION','FACTURAS','GENERAR PEDIDO AUTOMATICAMENTE CON LA FACTURA') RETURNING_VALUES (PEDAUTO);
    SELECT MAX(CEFA_TIPOORI) FROM consolide_faltantes WHERE CEFA_ID = :CONSOLIDA INTO :TIPO;
    if (Tipo IS NULL) then
        Tipo = 0;
    execute procedure lee_configuracion('FACTURACION', 'FACTURAS', 'AFECTAR INVENTARIO CON LA FACTURA') returning_values (:INVFAC);
    SELECT MIN(AUTO_ESPOS) FROM AUTORIZACIONES WHERE PREF_PRE = :pref INTO :ESPOS;
    if (ESPOS = 'S') then
        BEGIN
        INVFAC = 'SI';
        PEDAUTO = 'NO';
        END
    /* si se hizo con base en una remisi¢n no afecte inventario */
    if ((Tipo <> 32) and (INVFAC = 'SI')) then
        begin
        if (STRLEN(NOMCLI) > 42) then
            CONC = 'FV No.' || :pref || :num || '-' || SUBSTR(NOMCLI, 1, 42);
        ELSE
            CONC = 'FV No.' || :pref || :NUM || '-' || NOMCLI;
        INSERT INTO MOVIMIENTO_ARTICULO
            (ARTI_COD, MVAR_CONS, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM, TERC_NIT)
            VALUES(NEW.ARTI_COD, GEN_ID(ID_MOVARTI,1), NEW.BODE_COD, :FEC, 31, NEW.fact_id,
            :CONC, new.fade_factor * new.fade_cant, 0, 'N', new.fade_lote, :Pref, :Num, new.fade_item, :Nit);
        end
    if (PEDAUTO = 'SI') then
        BEGIN
        INSERT INTO PEDIDOS_DETALLE (PEDI_ID, PEDE_ITEM, ARTI_COD, PEDE_CANT, PEDE_UNIDAD, PEDE_DTOPORC, PEDE_DTOMONTO, PEDE_IVAPORC, PEDE_IVAMONTO, PEDE_CONSUMO, PEDE_FACTOR, PEDE_DESC, PEDE_OBS, PEDE_CODBAR, PEDE_TOTAL, PEDE_ANULADO, PEDE_TRANSMIT, LIPR_COD, PEDE_REFERENCIA, PEDE_PRUNIT, PEDE_FACTURAD, PEDE_REMISIONAD, PEDE_RESERVA, BODE_COD)
            VALUES (GEN_ID(id_pedido,0), NEW.FADE_ITEM, NEW.ARTI_COD, NEW.FADE_CANT, NEW.FADE_UNIDAD, NEW.FADE_DTOPORC, NEW.FADE_DTOMONTO, NEW.FADE_IVAPORC, NEW.FADE_IVAMONTO, NEW.FADE_CONSUMO, NEW.FADE_FACTOR, NEW.FADE_DESC, NEW.FADE_OBS, NEW.FADE_CODBAR, NEW.FADE_TOTAL, 'N', 'N', NEW.LIPR_COD, NEW.FADE_REFERENCIA, NEW.FADE_PRUNIT, NEW.FADE_CANT * NEW.FADE_FACTOR, 0, NEW.FADE_CANT * NEW.FADE_FACTOR, NEW.bode_cod);
        END
    ELSE
        BEGIN
        if (CONSOLIDA <> 0) then
            BEGIN
            EXECUTE procedure LEE_CONFIGURACION ('FACTURACION','DOCUMENTOS','DEJAR PENDIENTES LOS ARTICULOS NO INCLUIDOS AL TRAER DOCUMENTOS RELACIONADOS') returning_values (CONSO);
            if (CONSO = 'NO') then
                UPDATE consolidado_faltantes SET COFA_IDDES = NEW.fact_id, COFA_OK = 'S' WHERE COFA_ID = :consolida;
            ELSE
                BEGIN
                UPDATE consolidado_faltantes SET COFA_IDDES = NEW.fact_id, COFA_OK = 'S' WHERE COFA_ID = :consolida AND COFA_ITEM = NEW.FADE_ITEM AND ARTI_COD = NEW.arti_cod;
                /* BUSQUE EL CONSOLIDADO EN EL MISMO ITEM Y SI ES DIFERENTE ACTUALICELO */
                select COFA_CANT * COFA_FACTOR FROM consolidado_faltantes WHERE COFA_ID = :consolida AND COFA_ITEM = NEW.FADE_ITEM AND ARTI_COD = NEW.arti_cod INTO :CANTREL;
                if (NEW.FADE_CANT * NEW.FADE_FACTOR < CANTREL) then
                    UPDATE consolidado_faltantes SET COFA_IDDES = NEW.fact_id, COFA_CANT = NEW.FADE_CANT, COFA_FACTOR = NEW.FADE_FACTOR
                        WHERE COFA_ID = :consolida AND COFA_ITEM = NEW.FADE_ITEM AND ARTI_COD = NEW.arti_cod;
                END
            END
        END
    END
END
^

SET TERM ; ^


SET TERM ^ ;

CREATE OR ALTER TRIGGER FACTURAS_DETALLE_AU FOR FACTURAS_DETALLE
ACTIVE AFTER UPDATE POSITION 0
as
declare variable fec date;
declare variable CONC VARCHAR(60);
declare variable NOMCLI varchar(60);
declare variable Pref varchar(4);
declare variable Num varchar(6);
declare variable Nit varchar(20);
declare variable factor numeric(18,4);
declare variable INVFAC CHAR(2);
declare variable TIPO INTEGER;
declare variable PEDAUTO CHAR(2);
declare variable CANTREL NUMERIC(18,4);
declare variable CONSO CHAR(2);
declare variable CONSOLIDA INTEGER;
declare variable consec INTEGER;
declare variable ESPOS CHAR(1);
BEGIN
EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION','FACTURAS','GENERAR PEDIDO AUTOMATICAMENTE CON LA FACTURA') RETURNING_VALUES (PEDAUTO);
if ((OLD.fact_id <> 0) AND (OLD.fade_anulado = 'N')) then
    BEGIN
      if ((OLD.FADE_CANT * OLD.FADE_FACTOR <> NEW.fade_cant * NEW.fade_factor) or (OLD.fade_prunit <> NEW.fade_prunit)) then
        begin
        DELETE FROM MOVIMIENTO_ARTICULO WHERE (mvar_tipodoc = 31) and (mvar_idref = OLD.fact_id) and (mvar_item = old.fade_item);

        if (PEDAUTO = 'SI') then
            BEGIN
            SELECT pref_pre, fact_numero from facturas where fact_id = OLD.fact_id
                into :Pref, :Num;
            SELECT PEDI_ID FROM PEDIDOS WHERE PREF_PRE = :pref AND PEDI_NUMERO = :num into :consec;
            if (consec is not null) then
              DELETE FROM PEDIDOS_DETALLE WHERE PEDE_ITEM = OLD.FADE_ITEM AND PEDI_ID = :consec;
            END
        ELSE
            BEGIN
            /* DESHAGA LOS PENDIENTES */
            SELECT fact_consolida from facturas where fact_id = OLD.fact_id into :Consolida;
            if (CONSOLIDA <> 0) then
                BEGIN
                UPDATE consolidado_faltantes SET COFA_OK = 'N' WHERE COFA_ID = :consolida AND COFA_ITEM = OLD.FADE_ITEM AND ARTI_COD = OLD.arti_cod;
                EXECUTE procedure LEE_CONFIGURACION ('FACTURACION','DOCUMENTOS','DEJAR PENDIENTES LOS ARTICULOS NO INCLUIDOS AL TRAER DOCUMENTOS RELACIONADOS') returning_values (CONSO);
                if (CONSO = 'NO') then
                    UPDATE consolidado_faltantes SET COFA_OK = 'N' WHERE COFA_ID = :consolida;
                END
            END
        end
    END
if (OLD.fade_anulado = NEW.fade_anulado ) then
  begin
  if ((OLD.fact_id = 0) OR (OLD.FADE_CANT * OLD.FADE_FACTOR <> NEW.fade_cant * NEW.fade_factor) or (OLD.fade_prunit <> NEW.fade_prunit)) then
    BEGIN
    if ((NEW.fact_id <> 0) and (new.fade_anulado = 'N')) then
      BEGIN
      select fact_fecha, pref_pre, fact_numero, terc_nit, fact_nomcliente, fact_consolida
            from facturas where fact_id = new.fact_id
            into :fec, :Pref, :Num, :Nit, :Nomcli, :Consolida;
      SELECT MAX(CEFA_TIPOORI) FROM consolide_faltantes WHERE CEFA_ID = :CONSOLIDA INTO :TIPO;
      if (Tipo IS NULL) then
        Tipo = 0;
      execute procedure lee_configuracion('FACTURACION', 'FACTURAS', 'AFECTAR INVENTARIO CON LA FACTURA') returning_values (:INVFAC);
      SELECT MIN(AUTO_ESPOS) FROM AUTORIZACIONES WHERE PREF_PRE = :pref INTO :ESPOS;
      if (ESPOS = 'S') then
        BEGIN
        INVFAC = 'SI';
        PEDAUTO = 'NO';
        END
       /* si se hizo con base en una remisi¢n no afecte inventario */
      if ((Tipo <> 32) and (INVFAC = 'SI')) then
        begin
        if (STRLEN(NOMCLI) > 29) then
            CONC = 'FACTURA DE VENTA No.' || PREF || NUM || '-' || SUBSTR(NOMCLI,1,29);
        ELSE
            CONC = 'FACTURA DE VENTA No.' || PREF || NUM || '-' || NOMCLI;
        DELETE FROM MOVIMIENTO_ARTICULO WHERE (mvar_tipodoc = 31) and (mvar_idref = OLD.fact_id) and (mvar_item = old.fade_item);
        execute procedure factor_unidad_cant(new.arti_cod, new.fade_unidad) returning_values(factor);
        INSERT INTO MOVIMIENTO_ARTICULO
            (ARTI_COD, MVAR_CONS, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM, TERC_NIT)
            VALUES(NEW.ARTI_COD, GEN_ID(ID_MOVARTI,1), NEW.BODE_COD, :FEC, 31, NEW.fact_id,
            :CONC, :factor * new.fade_cant, 0, 'N', new.fade_lote, :Pref, :Num, new.fade_item, :Nit);
        end
        if (PEDAUTO = 'SI') then
          BEGIN
          INSERT INTO PEDIDOS_DETALLE (PEDI_ID, PEDE_ITEM, ARTI_COD, PEDE_CANT, PEDE_UNIDAD, PEDE_DTOPORC, PEDE_DTOMONTO, PEDE_IVAPORC, PEDE_IVAMONTO, PEDE_CONSUMO, PEDE_FACTOR, PEDE_DESC, PEDE_OBS, PEDE_CODBAR, PEDE_TOTAL, PEDE_ANULADO, PEDE_TRANSMIT, LIPR_COD, PEDE_REFERENCIA, PEDE_PRUNIT, PEDE_FACTURAD, PEDE_REMISIONAD, PEDE_RESERVA, BODE_COD)
            VALUES (0, NEW.FADE_ITEM, NEW.ARTI_COD, NEW.FADE_CANT, NEW.FADE_UNIDAD, NEW.FADE_DTOPORC, NEW.FADE_DTOMONTO, NEW.FADE_IVAPORC, NEW.FADE_IVAMONTO, NEW.FADE_CONSUMO, NEW.FADE_FACTOR, NEW.FADE_DESC, NEW.FADE_OBS, NEW.FADE_CODBAR, NEW.FADE_TOTAL, 'N', 'N', NEW.LIPR_COD, NEW.FADE_REFERENCIA, NEW.FADE_PRUNIT, NEW.FADE_CANT * NEW.FADE_FACTOR, 0, NEW.FADE_CANT * NEW.FADE_FACTOR, NEW.bode_cod);
          END
        ELSE
          BEGIN
          if (CONSOLIDA <> 0) then
            BEGIN
            UPDATE consolidado_faltantes SET COFA_OK = 'S' WHERE COFA_ID = :consolida AND COFA_ITEM = NEW.FADE_ITEM AND ARTI_COD = NEW.arti_cod;
            EXECUTE procedure LEE_CONFIGURACION ('FACTURACION','DOCUMENTOS','DEJAR PENDIENTES LOS ARTICULOS NO INCLUIDOS AL TRAER DOCUMENTOS RELACIONADOS') returning_values (CONSO);
            if (CONSO = 'NO') then
                UPDATE consolidado_faltantes SET COFA_OK = 'S' WHERE COFA_ID = :consolida;
            ELSE
                BEGIN
                /* BUSQUE EL CONSOLIDADO EN EL MISMO ITEM Y SI ES DIFERENTE ACTUALICELO */
                select COFA_CANT * COFA_FACTOR FROM consolidado_faltantes WHERE COFA_ID = :consolida AND COFA_ITEM = NEW.FADE_ITEM AND ARTI_COD = NEW.arti_cod INTO :CANTREL;
                if (NEW.FADE_CANT * NEW.FADE_FACTOR < CANTREL) then
                    UPDATE consolidado_faltantes SET COFA_CANT = NEW.FADE_CANT, COFA_FACTOR = NEW.FADE_FACTOR
                        WHERE COFA_ID = :consolida AND COFA_ITEM = NEW.FADE_ITEM AND ARTI_COD = NEW.arti_cod;
                END
            END
          END
        END
    end
  end
else
  if (NEW.fade_anulado = 'S') then
        BEGIN
        DELETE FROM MOVIMIENTO_ARTICULO WHERE (mvar_tipodoc = 31) and (mvar_idref = new.fact_id) and (mvar_item = old.fade_item);
        if (PEDAUTO = 'SI') then
            BEGIN
            SELECT pref_pre, fact_numero from facturas where fact_id = OLD.fact_id
                into :Pref, :Num;
            SELECT PEDI_ID FROM PEDIDOS WHERE PREF_PRE = :pref AND PEDI_NUMERO = :num into :consec;
            if (consec is not null) then
              UPDATE PEDIDOS_DETALLE SET PEDE_ANULADO = 'S' WHERE PEDE_ITEM = OLD.FADE_ITEM AND PEDI_ID = :consec;
            END
        ELSE
            BEGIN
            /* DESHAGA LOS PENDIENTES */
            SELECT fact_consolida from facturas where fact_id = OLD.fact_id into :Consolida;
            if (CONSOLIDA <> 0) then
                BEGIN
                UPDATE consolidado_faltantes SET COFA_OK = 'N' WHERE COFA_ID = :consolida AND COFA_ITEM = OLD.FADE_ITEM AND ARTI_COD = OLD.arti_cod;
                EXECUTE procedure LEE_CONFIGURACION ('FACTURACION','DOCUMENTOS','DEJAR PENDIENTES LOS ARTICULOS NO INCLUIDOS AL TRAER DOCUMENTOS RELACIONADOS') returning_values (CONSO);
                if (CONSO = 'NO') then
                    UPDATE consolidado_faltantes SET COFA_OK = 'N' WHERE COFA_ID = :consolida;
                END
            END
        END
    ELSE
        BEGIN
        if (NEW.fact_id <> 0) then
          BEGIN
          select fact_fecha, pref_pre, fact_numero, terc_nit, fact_nomcliente, fact_consolida
            from facturas where fact_id = new.fact_id
            into :fec, :Pref, :Num, :Nit, :Nomcli, :Consolida;
          SELECT MAX(CEFA_TIPOORI) FROM consolide_faltantes WHERE CEFA_ID = :CONSOLIDA INTO :TIPO;
          if (Tipo IS NULL) then
               Tipo = 0;
          execute procedure lee_configuracion('FACTURACION', 'FACTURAS', 'AFECTAR INVENTARIO CON LA FACTURA') returning_values (:INVFAC);
          /* si se hizo con base en una remisi¢n no afecte inventario */
          if ((Tipo <> 32) and (INVFAC = 'SI')) then
            begin
            if (STRLEN(NOMCLI) > 29) then
               CONC = 'FACTURA DE VENTA No.' || PREF || NUM || '-' || SUBSTR(NOMCLI,1,29);
            ELSE
               CONC = 'FACTURA DE VENTA No.' || PREF || NUM || '-' || NOMCLI;
            execute procedure factor_unidad_cant(new.arti_cod, new.fade_unidad) returning_values(factor);
            INSERT INTO MOVIMIENTO_ARTICULO
                   (ARTI_COD, MVAR_CONS, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM, TERC_NIT)
               VALUES(NEW.ARTI_COD, GEN_ID(ID_MOVARTI,1), NEW.BODE_COD, :FEC, 31, NEW.fact_id,
                 :CONC, :factor * new.fade_cant, 0, 'N', new.fade_lote, :Pref, :Num, new.fade_item, :Nit);
            end
          if ((PEDAUTO = 'SI') and (old.fact_id = 0)) then
             BEGIN
              INSERT INTO PEDIDOS_DETALLE (PEDI_ID, PEDE_ITEM, ARTI_COD, PEDE_CANT, PEDE_UNIDAD, PEDE_DTOPORC, PEDE_DTOMONTO, PEDE_IVAPORC, PEDE_IVAMONTO, PEDE_CONSUMO, PEDE_FACTOR, PEDE_DESC, PEDE_OBS, PEDE_CODBAR, PEDE_TOTAL, PEDE_ANULADO, PEDE_TRANSMIT, LIPR_COD, PEDE_REFERENCIA, PEDE_PRUNIT, PEDE_FACTURAD, PEDE_REMISIONAD, PEDE_RESERVA, BODE_COD)
                VALUES (0, NEW.FADE_ITEM, NEW.ARTI_COD, NEW.FADE_CANT, NEW.FADE_UNIDAD, NEW.FADE_DTOPORC, NEW.FADE_DTOMONTO, NEW.FADE_IVAPORC, NEW.FADE_IVAMONTO, NEW.FADE_CONSUMO, NEW.FADE_FACTOR, NEW.FADE_DESC, NEW.FADE_OBS, NEW.FADE_CODBAR, NEW.FADE_TOTAL, 'N', 'N', NEW.LIPR_COD, NEW.FADE_REFERENCIA, NEW.FADE_PRUNIT, NEW.FADE_CANT * NEW.FADE_FACTOR, 0, NEW.FADE_CANT * NEW.FADE_FACTOR, NEW.bode_cod);
             END
          ELSE
             BEGIN
             if (CONSOLIDA <> 0) then
              BEGIN
              UPDATE consolidado_faltantes SET COFA_OK = 'S' WHERE COFA_ID = :consolida AND COFA_ITEM = NEW.FADE_ITEM AND ARTI_COD = NEW.arti_cod;
              EXECUTE procedure LEE_CONFIGURACION ('FACTURACION','DOCUMENTOS','DEJAR PENDIENTES LOS ARTICULOS NO INCLUIDOS AL TRAER DOCUMENTOS RELACIONADOS') returning_values (CONSO);
              if (CONSO = 'NO') then
                 UPDATE consolidado_faltantes SET COFA_OK = 'S' WHERE COFA_ID = :consolida;
              ELSE
                BEGIN
                /* BUSQUE EL CONSOLIDADO EN EL MISMO ITEM Y SI ES DIFERENTE ACTUALICELO */
                select COFA_CANT * COFA_FACTOR FROM consolidado_faltantes WHERE COFA_ID = :consolida AND COFA_ITEM = NEW.FADE_ITEM AND ARTI_COD = NEW.arti_cod INTO :CANTREL;
                if (NEW.FADE_CANT * NEW.FADE_FACTOR < CANTREL) then
                    UPDATE consolidado_faltantes SET COFA_CANT = NEW.FADE_CANT, COFA_FACTOR = NEW.FADE_FACTOR
                        WHERE COFA_ID = :consolida AND COFA_ITEM = NEW.FADE_ITEM AND ARTI_COD = NEW.arti_cod;
                END
              END
             END
          END
        end
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER FACTURAS_AI FOR FACTURAS
ACTIVE AFTER INSERT POSITION 0
AS
declare variable CONC VARCHAR(60);
declare variable PEDAUTO CHAR(2);
declare variable DIAS INTEGER;
declare variable NUMERO VARCHAR(6);
declare variable AUTOM CHAR(1);
declare variable NUMROWS INTEGER;
declare variable ESPOS CHAR(1);
BEGIN
if ((NEW.FACT_ID <> 0) and (new.fact_anulado = 'N')) then
    BEGIN
    /* actualice el prefijo si se pasaron de una hoja impresa */
    execute procedure lee_configuracion('FACTURACION','FACTURAS','INCREMENTAR NUMERACION AUTOMATICAMENTE EN FACTURAS DE VARIAS HOJAS') returning_values (:pedauto);
    SELECT MIN(AUTO_ESPOS) FROM AUTORIZACIONES WHERE PREF_PRE = NEW.pref_pre INTO :ESPOS;
    if (ESPOS = 'S') then
        PEDAUTO = 'NO';
    if (PEDAUTO = 'SI') then
        BEGIN
        select FORM_NROITEMS from FORMATOS where tido_cod = 31 and pref_pre = new.pref_pre into :dias;
        select count(*) from facturas_detalle where fact_id = new.fact_id into :numrows;
        if (numrows > dias) then
            begin
            SELECT PREF_ACTUAL, PREF_AUTO FROM PREFIJOS WHERE TIDO_COD = 31 AND PREF_PRE = NEW.PREF_PRE INTO :NUMERO, :AUTOM;
            if (AUTOM = 'S' or NUMERO = NEW.fact_numero) then
                BEGIN
                NUMROWS = CAST(NUMERO AS INTEGER) + DIV(numrows,dias);
                NUMERO = CAST(NUMROWS AS CHAR(6));
                update prefijos set pref_actual = :NUMERO WHERE TIDO_COD = 31 AND PREF_PRE = NEW.PREF_PRE;
                END
            end
        END
    /* Registre el nuevo saldo del documento */
    INSERT INTO SALDOS_DOC_CARTERA (SDCA_TIPOREF, SDCA_IDREF, SDCA_FECHA, TERC_NIT, SDCA_RTFTE, SDCA_RTIVA, SDCA_RTICA, SDCA_ABONO, SDCA_ABRTFTE, SDCA_ABRTIVA, SDCA_ABRTICA, SDCA_DEBITO, SDCA_MONTO, SDCA_TRM)
        VALUES (31, NEW.FACT_ID, NEW.FACT_fecha, NEW.terc_nit, NEW.FACT_rtftemonto, NEW.FACT_rtivamonto, NEW.FACT_rticamonto, 0, 0, 0, 0, 'S', NEW.FACT_TOTAL, NEW.fact_trm);
    /* Registre el movimiento del cliente */
    if (STRLEN(NEW.FACT_NOMCLIENTE) > 42) then
        CONC = 'FV No.' || NEW.PREF_PRE || NEW.FACT_NUMERO || '-' || SUBSTR(NEW.FACT_NOMCLIENTE, 1, 42);
    ELSE
        CONC = 'FV No.' || NEW.PREF_PRE || NEW.FACT_NUMERO || '-' || NEW.FACT_NOMCLIENTE;
    INSERT INTO MOVIMIENTO_CLIENTES (MVCL_ID, TERC_NIT, MVCL_TIPOREF, MVCL_IDREF, MVCL_FECHA, MVCL_VENCE, MVCL_CONC, MVCL_MONTO, MVCL_RTEFTE, MVCL_RTEIVA, MVCL_RTEICA, MVCL_DEBITO, MVCL_ABONO, MVCL_PREFREF, MVCL_NUMREF, mvcl_sucursal, COBR_COD, MVCL_TRM)
      VALUES (GEN_ID(ID_MOVCLI, 1), NEW.TERC_NIT, 31, NEW.FACT_ID, NEW.FACT_FECHA, NEW.FACT_VENCE, :CONC, NEW.FACT_TOTAL, NEW.FACT_RTFTEMONTO, NEW.FACT_RTIVAMONTO, NEW.FACT_RTICAMONTO, 'S', 'N', NEW.pref_pre, NEW.FACT_numero, new.fact_sucursal, NEW.cobr_cod, NEW.fact_trm);
    EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION','FACTURAS','GENERAR PEDIDO AUTOMATICAMENTE CON LA FACTURA') RETURNING_VALUES (PEDAUTO);
    if (PEDAUTO = 'SI') then
        BEGIN
        EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION','PEDIDOS','DIAS DE VALIDEZ') RETURNING_VALUES (DIAS);
        INSERT INTO PEDIDOS (PEDI_ID, TERC_NIT, VEND_COD, TIDO_COD, PREF_PRE, PEDI_NUMERO, PEDI_FECHA, PEDI_VALIDEZ, PEDI_DESPACHO, PEDI_OBS, PEDI_IVAINC, PEDI_NOMTERC, PEDI_DTOPOR, PEDI_DTOMONTO, PEDI_ADICIONAL, PEDI_IVAMONTO, PEDI_EXTRA, PEDI_TOTAL, PEDI_ANULADO, PEDI_TRANSMIT, PTVT_ID, PEDI_COTIZACI, PEDI_RTFTEPORC, PEDI_RTFTEMONTO, PEDI_RTIVAPORC, PEDI_RTIVAMONTO, PEDI_RTICAPORC, PEDI_RTICAMONTO, PEDI_SUCURSAL)
            VALUES (GEN_ID(ID_PEDIDO, 1), NEW.TERC_NIT, NEW.VEND_COD, 34, NEW.PREF_PRE, NEW.FACT_NUMERO, NEW.FACT_FECHA, :DIAS, NEW.FACT_DESPACHO, NEW.FACT_OBS, NEW.FACT_IVAINC, NEW.FACT_NOMCLIENTE, NEW.FACT_DTOPOR, NEW.FACT_DTOMONTO, NEW.FACT_ADICIONAL, NEW.FACT_IVAMONTO, NEW.FACT_EXTRA, NEW.FACT_TOTAL, 'N', 'N', NEW.PTVT_ID, NULL, NEW.FACT_RTFTEPOR, NEW.FACT_RTFTEMONTO, NEW.FACT_RTIVAPOR, NEW.FACT_RTIVAMONTO, NEW.FACT_RTICAPOR, NEW.FACT_RTICAMONTO, NEW.fact_sucursal);
        END
    INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
        VALUES (USER, 31, NEW.fact_id, 'I', NEW.pref_pre || NEW.fact_numero);
    END
END
^

SET TERM ; ^


/* 20081116 */
/* SE AGREGO NUMERO DEL EGRSO SI CHEQUES O RETIROS DETALLADO */
SET TERM ^ ;

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

SET TERM ; ^



/* 20081117 FACTOR UNIDAD EN COTIZACIONES */
SET TERM ^ ;

CREATE OR ALTER PROCEDURE IMPR_COTIZACION(
    ID INTEGER)
RETURNS (
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    VALIDEZ INTEGER,
    NIT VARCHAR(20),
    NOMTERCERO VARCHAR(60),
    VENDEDOR INTEGER,
    NOMVENDEDOR VARCHAR(60),
    PUNTOVTA INTEGER,
    NOMPUNTOVTA VARCHAR(30),
    SUBTOTAL NUMERIC(18,2),
    DTOPORC NUMERIC(9,2),
    DTOMONTO NUMERIC(18,2),
    ADICIONAL NUMERIC(18,2),
    IVAMONTO NUMERIC(18,2),
    EXTRA NUMERIC(18,2),
    TOTALFAC NUMERIC(18,2),
    OBS BLOB SUB_TYPE 1 SEGMENT SIZE 80,
    ITEM INTEGER,
    ARTICULO VARCHAR(15),
    CODBAR VARCHAR(15),
    ARTIDES VARCHAR(60),
    CANT NUMERIC(18,4),
    UNIDAD VARCHAR(8),
    FACTOR numeric(18,4),
    LISTAPR INTEGER,
    REFITEM VARCHAR(60),
    PRUNIT NUMERIC(18,2),
    DTOITPORC NUMERIC(9,2),
    DTOITMONTO NUMERIC(18,2),
    PRNETO NUMERIC(18,2),
    IVAPORC NUMERIC(9,2),
    IVAITMONTO NUMERIC(18,2),
    CONSUMO NUMERIC(18,2),
    TOTAL NUMERIC(18,2),
    CODIGOCL VARCHAR(20),
    ZONACOD VARCHAR(2),
    ZONANOM VARCHAR(60),
    DV CHAR(1),
    DIRECCION VARCHAR(60),
    CIUDAD VARCHAR(40),
    TELEFONO VARCHAR(40),
    CONTACTO VARCHAR(60),
    FAX VARCHAR(25),
    GRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    SUBGRUPO VARCHAR(3),
    NOMSUBG VARCHAR(30),
    MARCA VARCHAR(3),
    NOMMARCA VARCHAR(30),
    PESO NUMERIC(9,4),
    ANCHO NUMERIC(18,4),
    ALTO NUMERIC(18,4),
    LARGO NUMERIC(18,4),
    SUMA1 NUMERIC(18,2),
    SUMA2 NUMERIC(18,2),
    SUMA3 NUMERIC(18,2),
    IVA1 NUMERIC(18,2),
    IVA2 NUMERIC(18,2),
    IVA3 NUMERIC(18,2),
    SUMAEX NUMERIC(18,2),
    SUMAGR NUMERIC(18,2),
    OBSITEM BLOB SUB_TYPE 1 SEGMENT SIZE 80)
AS
DECLARE VARIABLE IMPTOS CHAR(1);
DECLARE VARIABLE TARIFA INTEGER;
declare variable ORDENCOD CHAR(2);
declare variable SUCUR VARCHAR(10);
BEGIN
  /*  */
  SELECT F.PREF_PRE, COTI_NUMERO, COTI_FECHA, COTI_VALIDEZ, F.TERC_NIT, COTI_NOMTERC, F.VEND_COD, VEND_NOMBRE, F.PTVT_ID, PTVT_NOM,
    COTI_IMPTOS, COTI_DTOPORC, COTI_DTOMONTO, COTI_ADICIONAL, COTI_IVAMONTO, COTI_EXTRA, COTI_TOTAL,
    TERC_CONTACTO, TERC_FAX, TERC_DV, COTI_OBS, COTI_SUCURSAL
    FROM COTIZACIONES F, VENDEDORES V, PUNTO_VENTA P, TERCEROS T
    WHERE F.VEND_COD = V.VEND_COD AND F.PTVT_ID = P.PTVT_ID AND F.TERC_NIT = T.TERC_NIT AND F.COTI_ID = :ID
    into :PREF, :NUMERO, :FECHA, :VALIDEZ, :NIT, :NOMTERCERO, :VENDEDOR, :NOMVENDEDOR, :PUNTOVTA, :NOMPUNTOVTA,
    :IMPTOS, :DTOPORC, :DTOMONTO, :ADICIONAL, :IVAMONTO, :EXTRA, :TOTALFAC,
    :CONTACTO, :FAX, :DV, :OBS, :SUCUR;
  SUBTOTAL = TOTALFAC - EXTRA - IVAMONTO - ADICIONAL + DTOMONTO;

  SELECT CLIE_COD, C.ZONA_COD, ZONA_NOM
    FROM CLIENTES C, ZONAS Z
    WHERE TERC_NIT = :NIT AND C.ZONA_COD = Z.ZONA_COD
    INTO :CODIGOCL, :ZONACOD, :ZONANOM;
  SELECT CLSU_DIR, CLSU_CIUDAD, CLSU_TEL FROM CLIENTE_SUCURSALES WHERE TERC_NIT = :NIT AND CLCU_COD = :SUCUR
    INTO :DIRECCION, :CIUDAD, :TELEFONO;
    
  SUMAEX = 0;
  SUMA1 = 0;
  SUMA2 = 0;
  SUMA3 = 0;
  IVA1 = 0;
  IVA2 = 0;
  IVA3 = 0;
  ITEM = 0;
  EXECUTE PROCEDURE lee_configuracion ('FACTURACION','DOCUMENTOS','ORDENAR ITEMS POR CODIGO DE ARTICULO') returning_values (:ORDENCOD);
  if (ORDENCOD = 'SI') then
    BEGIN
    FOR SELECT D.ARTI_COD, CTDE_CODBAR, SUBSTR(CTDE_DESC,1,60), CTDE_CANT, CTDE_UNIDAD, LIPR_COD, CTDE_PRUNIT, CTDE_DTOPORC, CTDE_DTOMONTO, CTDE_IVAPORC, CTDE_IVAMONTO, CTDE_CONSUMO, CTDE_TOTAL, CTDE_REFERENCIA,
        GRUP_COD, SUBG_COD, MARC_COD, ARTI_PESO, ARTI_ANCHO, ARTI_ALTO, ARTI_LARGO, TAIV_COD, CTDE_OBS, CTDE_FACTOR
        FROM COTIZACIONES_DETALLE D, ARTICULO A
        WHERE D.ARTI_COD = A.ARTI_COD AND D.COTI_ID = :ID
        ORDER BY CTDE_CODBAR
        INTO :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :LISTAPR, :PRUNIT, :DTOITPORC, :DTOITMONTO, :IVAPORC, :IVAITMONTO, :CONSUMO, :TOTAL, :refitem,
        :GRUPO, :SUBGRUPO, :MARCA, :PESO, :ANCHO, :ALTO, :LARGO, :TARIFA, :obsitem, :FACTOR
        DO
        BEGIN
        if (ARTICULO = CODBAR) then
            SELECT FIRST 1 COBA_COD FROM barras_articulo WHERE ARTI_COD = :articulo INTO :CODBAR;
        SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :GRUPO INTO NOMGRUPO;
        SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :MARCA INTO NOMMARCA;
        SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :SUBGRUPO AND GRUP_COD = :GRUPO INTO :NOMSUBG;
        ITEM = ITEM + 1;
        PRNETO = PRUNIT - DTOITMONTO;
        if (ivaporc = 0) then
            SUMAEX = SUMAEX + TOTAL;
        if (TARIFA = 1) then
            BEGIN
            SUMA1 = SUMA1 + TOTAL - IVAITMONTO;
            IVA1 = IVA1 + IVAITMONTO;
            END
        if (TARIFA = 2) then
            BEGIN
            SUMA2 = SUMA2 + TOTAL - IVAITMONTO;
            IVA2 = IVA2 + IVAITMONTO;
            END
        if (TARIFA = 3) then
            BEGIN
            SUMA3 = SUMA3 + TOTAL - IVAITMONTO;
            IVA3 = IVA3 + IVAITMONTO;
            END
        SUMAGR = SUMA1 + SUMA2 + SUMA3;
        if (IMPTOS = 'N') then
            TOTAL = TOTAL - IVAITMONTO;
        SUSPEND;
        END
    END
ELSE
    BEGIN
    FOR SELECT D.ARTI_COD, CTDE_CODBAR, SUBSTR(CTDE_DESC,1,60), CTDE_CANT, CTDE_UNIDAD, LIPR_COD, CTDE_PRUNIT, CTDE_DTOPORC, CTDE_DTOMONTO, CTDE_IVAPORC, CTDE_IVAMONTO, CTDE_CONSUMO, CTDE_TOTAL, CTDE_REFERENCIA,
        GRUP_COD, SUBG_COD, MARC_COD, ARTI_PESO, ARTI_ANCHO, ARTI_ALTO, ARTI_LARGO, TAIV_COD, CTDE_OBS, CTDE_FACTOR
        FROM COTIZACIONES_DETALLE D, ARTICULO A
        WHERE D.ARTI_COD = A.ARTI_COD AND D.COTI_ID = :ID
        ORDER BY CTDE_ITEM
        INTO :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :LISTAPR, :PRUNIT, :DTOITPORC, :DTOITMONTO, :IVAPORC, :IVAITMONTO, :CONSUMO, :TOTAL, :refitem,
        :GRUPO, :SUBGRUPO, :MARCA, :PESO, :ANCHO, :ALTO, :LARGO, :TARIFA, :obsitem, :FACTOR
        DO
        BEGIN
        SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :GRUPO INTO NOMGRUPO;
        SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :MARCA INTO NOMMARCA;
        SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :SUBGRUPO AND GRUP_COD = :GRUPO INTO :NOMSUBG;
        ITEM = ITEM + 1;
        PRNETO = PRUNIT - DTOITMONTO;
        if (ivaporc = 0) then
            SUMAEX = SUMAEX + TOTAL;
        if (TARIFA = 1) then
            BEGIN
            SUMA1 = SUMA1 + TOTAL - IVAITMONTO;
            IVA1 = IVA1 + IVAITMONTO;
            END
        if (TARIFA = 2) then
            BEGIN
            SUMA2 = SUMA2 + TOTAL - IVAITMONTO;
            IVA2 = IVA2 + IVAITMONTO;
            END
        if (TARIFA = 3) then
            BEGIN
            SUMA3 = SUMA3 + TOTAL - IVAITMONTO;
            IVA3 = IVA3 + IVAITMONTO;
            END
        SUMAGR = SUMA1 + SUMA2 + SUMA3;
        if (IMPTOS = 'N') then
            TOTAL = TOTAL - IVAITMONTO;
        SUSPEND;
        END
    END
END
^

SET TERM ; ^



/* 2008118 CUENTAS DE BANCO POR AGENCIA */

INSERT INTO CONFIGURACION (CONF_MODULO, CONF_CATEGORIA, CONF_PROPIEDAD, CONF_VALOR, CONF_POSIBLES, CONF_AYUDA) VALUES ('BANCOS', 'DOCUMENTOS', 'FILTRAR CUENTAS DE BANCOS POR AGENCIAS', 'NO', 'SI,NO', 'SI: Sólo permite a un usuario de la agencia usar los bancos asociados a esta agencia. NO: Permite a los usuarios usar cualquier banco sin importar la agencia del mismo');
commit work;

ALTER TABLE CUENTAS_BANCO
ADD SUCU_ID T_ID;


/* 20081119 NUMERO DEL PROVEEDOR EN EGRESOS */
ALTER TABLE EGRESOS_DETALLE
ADD EGDE_NUMPROV VARCHAR(8);

ALTER TABLE RECIBOS_CAJA_CRUCEC
ADD RCCR_NUMPROV VARCHAR(8);

SET TERM ^ ;

CREATE OR ALTER PROCEDURE BUSCA_ID_DOC_CXPAGAR(
    TIPO INTEGER,
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(6),
    NIT VARCHAR(20),
    FECHA DATE)
RETURNS (
    ID INTEGER,
    SALDO NUMERIC(18,2),
    RTFTE NUMERIC(18,2),
    RTIVA NUMERIC(18,2),
    RTICA NUMERIC(18,2),
    DTOF NUMERIC(18,2),
    ERROR INTEGER,
    NUMPROV VARCHAR(8))
AS
declare variable VERNIT VARCHAR(20);
declare variable FEC DATE;
declare variable DTOAPL NUMERIC(18,2);
declare variable FECDTO DATE;
declare variable DESC_RTES CHAR(2);
declare variable TRM NUMERIC(18,2);
declare variable MONEDA INTEGER;
BEGIN
ERROR = 0;
ID = 0;
EXECUTE PROCEDURE COMPLETA_CEROS(NUMERO) returning_values (NUMERO);
if (TIPO = 51) then
    SELECT NDPR_ID, TERC_NIT, NDPR_FECHA, NDPR_DTOFMONTO, NDPR_DTOFECHA, NDPR_TRM, NDPR_NUMPROV
        FROM NOTAS_DEBITO_PROVEEDOR WHERE PREF_PRE = :PREFIJO AND NDPR_NUMERO = :NUMERO
        INTO :ID, :VERNIT, :FEC, :DTOF, :FECDTO, :TRM, :numprov;
if (TIPO = 52) then
    SELECT NCPR_ID, TERC_NIT, NCPR_FECHA, NCPR_DTOFMONTO, NCPR_DTOFECHA, NCPR_TRM, ''
        FROM NOTAS_CREDITO_PROVEEDOR WHERE PREF_PRE = :PREFIJO AND NCPR_NUMERO = :NUMERO
        INTO :ID, :VERNIT, :FEC, :DTOF, :FECDTO, :TRM, :numprov;
if (TIPO = 55) then
    SELECT ANPR_ID, TERC_NIT, ANPR_FECHA, ANPR_DTOFMONTO, ANPR_DTOFECHA, ANPR_TRM, ''
        FROM ANTICIPOS_PROVEEDOR WHERE PREF_PRE = :PREFIJO AND ANPR_NUMERO = :NUMERO
        INTO :ID, :VERNIT, :FEC, :DTOF, :FECDTO, :TRM, :numprov;
if (TIPO = 21) then
    SELECT FACO_ID, TERC_NIT, FACO_FECHA, FACO_DTOFMONTO, FACO_DTOFFECHA, FACO_TRM, FACO_NUMPROV
        FROM FACTURAS_COMPRA WHERE PREF_PRE = :PREFIJO AND FACO_NUMERO = :NUMERO
        INTO :ID, :VERNIT, :FEC, :DTOF, :FECDTO, :TRM, :numprov;
if (TIPO = 24) then
    SELECT DVCO_ID, TERC_NIT, DVCO_FECHA, 0, DVCO_FECHA, DVCO_TRM, ''
        FROM devoluciones_compras WHERE PREF_PRE = :PREFIJO AND DVCO_NUMERO = :NUMERO
        INTO :ID, :VERNIT, :FEC, :DTOF, :FECDTO, :TRM, :numprov;
if (fecha > FECDTO) then
    DTOF = 0;
if (DTOF IS NULL) then
    DTOF = 0;
if (DTOF <> 0) then
    BEGIN
    SELECT SUM(EGDE_DTOF) FROM EGRESOS_DETALLE WHERE EGDE_IDDOC = :ID AND EGDE_TIPODOC = :TIPO INTO :DTOAPL;
    if (DTOAPL IS NULL) then
        DTOAPL = 0;
    DTOF = DTOF - DTOAPL;
    if ((TRM <> 1) AND (TRM <> 0)) then
        DTOF = DTOF / TRM;
    END
if (ID = 0) then
  ERROR = 1;
ELSE
  BEGIN
  /* VERIFIQUE EL NIT */
  if (VERNIT <> NIT) then
    ERROR = 2;
  else
    BEGIN
    /* VERIFIQUE QUE LA FECHA DEL ABONO SEA POSTERIOR O IGUAL AL DOC */
    if (FEC > FECHA) then
        ERROR = 3;
    ELSE
        BEGIN
        /* CALCULE LOS SALDOS */
        SELECT SUM(SDCP_RTEFTE - SDCP_ABRTFTE), SUM(SDCP_RTIVA - SDCP_ABRTIVA), SUM(SDCP_RTICA - SDCP_ABRTICA)
            FROM SALDOS_DOC_CXPAGAR WHERE SDCP_TIPOREF = :TIPO AND SDCP_IDREF = :ID
            INTO :RTFTE, :RTIVA, :RTICA;
        if (RTFTE IS NULL) then
            RTFTE = 0;
        if (RTIVA IS NULL) then
            RTIVA = 0;
        if (RTICA IS NULL) then
            RTICA = 0;
        /* TRAIGA EL SALDO NETO */
        if (TRM <> 1) then
            execute procedure lee_configuracion ('GENERAL', 'GENERAL', 'MONEDA PREDETERMINADA EN OPERACIONES CON EL EXTERIOR') returning_values (:moneda);
        else    
            MONEDA = 0;
        if (TRM <> 0) then
            BEGIN
            RTFTE = RTFTE / TRM;
            RTIVA = RTIVA / TRM;
            RTICA = RTICA / TRM;
            END
        EXECUTE PROCEDURE SALDO_DOC_CXPAGAR(TIPO, ID, FECHA,MONEDA) returning_values (SALDO);
        if (SALDO = 0) then
            ERROR = 4;
        ELSE
            BEGIN
            /* RESTE LAS RETENCIONES YA QUE SE SUGERIRAN */
            EXECUTE PROCEDURE LEE_CONFIGURACION('CXPAGAR', 'SALDOS', 'DESCONTAR RETENCIONES POR CAUSACION') returning_values (DESC_RTES);
            if (DESC_RTES = 'NO') then
                SALDO = SALDO - RTFTE - RTIVA - RTICA;
            SALDO = SALDO - DTOF;
            END
        END
    END
  END
SUSPEND;
END
^

SET TERM ; ^

grant select, delete, insert, update on puntos_cliente_acumulado to public;
grant select, delete, insert, update on tipos_moneda to public;
grant select, delete, insert, update on tasa_cambio_moneda to public;
grant execute on procedure saldo_cliente to public;
grant execute on procedure actualiza_puntos_acumulados to public;

/* 20081120 REEMPLZACE EL TAMANO YA QUE ANTES ERA 1, 1 */

UPDATE FORMATO_LINEAS SET FOLI_X = 175, FOLI_Y = 357 WHERE FOLI_TIPO = 'G';
COMMIT WORK;

/* ESPOS EN AUTORIZACIONES */

SET TERM ^ ;

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

    DELETE FROM puntos_cliente WHERE PTCL_TIPODOC = 31 AND PTCL_IDDOC = OLD.fact_id;

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

    /* Verifique si habia abonos a la nota */
    ABONOS = 0;
    select COUNT(*) FROM SALDOS_DOC_CARTERA WHERE SDCA_TIPOREF = 31 AND SDCA_IDREF = OLD.FACT_ID AND SDCA_ABONO <> 0 INTO :ABONOS;
    if (ABONOS = 0) then
        BEGIN
        /* BORRE EL REGISTRO PREVIO */
        delete from saldos_doc_cartera where sdca_tiporef = 31 and sdca_idref = old.fact_id;
        delete from movimiento_clientes where (mvcl_tiporef = 31) and (mvcl_idref = old.fact_id);
        if (PEDAUTO = 'SI') then
            BEGIN
            /* INTENTE ANULAR EL PEDIDO DEL MISMO NUMERO */
            UPDATE PEDIDOS SET PEDI_ANULADO = 'S' WHERE PREF_PRE = OLD.pref_pre AND PEDI_NUMERO = OLD.fact_numero;
            END
        /* ANULE LA CONSOLIDACION */
        if (OLD.FACT_CONSOLIDA <> 0) then
            BEGIN
            UPDATE consolidado_faltantes SET COFA_OK = 'N' WHERE COFA_ID = OLD.fact_consolida;
            END
        END
    else
        exception DOCUMENTO_CON_ABONOS;
    end
if ((NEW.FACT_ID <> 0) AND (new.fact_anulado = 'N')) then
    BEGIN
    if (OLD.fact_id = 0) then
        BEGIN
        /* actualice el prefijo si se pasaron de una hoja impresa */
        execute procedure lee_configuracion('FACTURACION','FACTURAS','INCREMENTAR NUMERACION AUTOMATICAMENTE EN FACTURAS DE VARIAS HOJAS') returning_values (:CONC);
        if (CONC = 'SI') then
            BEGIN
            select FORM_NROITEMS from FORMATOS where tido_cod = 31 and pref_pre = new.pref_pre into :dias;
            select count(*) from facturas_detalle where fact_id = old.fact_id into :numrows;
            if (numrows > dias) then
                begin
                SELECT PREF_ACTUAL, PREF_AUTO FROM PREFIJOS WHERE TIDO_COD = 31 AND PREF_PRE = NEW.PREF_PRE INTO :NUMERO, :AUTOM;
                if (AUTOM = 'S' or NUMERO = NEW.fact_numero) then
                    BEGIN
                    NUMROWS = CAST(NUMERO AS INTEGER) + DIV(numrows,dias);
                    NUMERO = CAST(NUMROWS AS CHAR(6));
                    update prefijos set pref_actual = :NUMERO WHERE TIDO_COD = 31 AND PREF_PRE = NEW.PREF_PRE;
                    END
                end
            END
        END
  
    /* Registre el nuevo saldo del documento */
    INSERT INTO SALDOS_DOC_CARTERA (SDCA_TIPOREF, SDCA_IDREF, SDCA_FECHA, TERC_NIT, SDCA_RTFTE, SDCA_RTIVA, SDCA_RTICA, SDCA_ABONO, SDCA_ABRTFTE, SDCA_ABRTIVA, SDCA_ABRTICA, SDCA_DEBITO, SDCA_MONTO, SDCA_TRM)
        VALUES (31, NEW.FACT_ID, NEW.FACT_fecha, NEW.terc_nit, NEW.FACT_rtftemonto, NEW.FACT_rtivamonto, NEW.FACT_rticamonto, 0, 0, 0, 0, 'S', NEW.FACT_TOTAL, NEW.fact_trm);
    AUX = 'FACTURA DE VENTA No.' || NEW.PREF_PRE || NEW.FACT_NUMERO || '-' || NEW.FACT_NOMCLIENTE;
    if (STRLEN(AUX) > 60) then
        CONC = SUBSTR(AUX, 1, 60);
    else
        CONC = AUX;
    INSERT INTO MOVIMIENTO_CLIENTES (MVCL_ID, TERC_NIT, MVCL_TIPOREF, MVCL_IDREF, MVCL_FECHA, MVCL_VENCE, MVCL_CONC, MVCL_MONTO, MVCL_RTEFTE, MVCL_RTEIVA, MVCL_RTEICA, MVCL_DEBITO, MVCL_ABONO, MVCL_PREFREF, MVCL_NUMREF, MVCL_SUCURSAL, COBR_COD, MVCL_TRM)
        VALUES (GEN_ID(ID_MOVCLI, 1), NEW.TERC_NIT, 31, NEW.FACT_ID, NEW.FACT_FECHA, NEW.fact_vence, :CONC, NEW.FACT_TOTAL, NEW.FACT_RTFTEMONTO, NEW.FACT_RTIVAMONTO, NEW.FACT_RTICAMONTO, 'S', 'N', NEW.pref_pre, NEW.FACT_numero, NEW.fact_sucursal, NEW.cobr_cod, NEW.fact_trm);
    if (PEDAUTO = 'SI') then
        BEGIN
        EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION','PEDIDOS','DIAS DE VALIDEZ') RETURNING_VALUES (DIAS);
        INSERT INTO PEDIDOS (PEDI_ID, TERC_NIT, VEND_COD, TIDO_COD, PREF_PRE, PEDI_NUMERO, PEDI_FECHA, PEDI_VALIDEZ, PEDI_DESPACHO, PEDI_OBS, PEDI_IVAINC, PEDI_NOMTERC, PEDI_DTOPOR, PEDI_DTOMONTO, PEDI_ADICIONAL, PEDI_IVAMONTO, PEDI_EXTRA, PEDI_TOTAL, PEDI_ANULADO, PEDI_TRANSMIT, PTVT_ID, PEDI_COTIZACI, PEDI_RTFTEPORC, PEDI_RTFTEMONTO, PEDI_RTIVAPORC, PEDI_RTIVAMONTO, PEDI_RTICAPORC, PEDI_RTICAMONTO, PEDI_SUCURSAL)
            VALUES (GEN_ID(ID_PEDIDO, 1), NEW.TERC_NIT, NEW.VEND_COD, 34, NEW.PREF_PRE, NEW.FACT_NUMERO, NEW.FACT_FECHA, :DIAS, NEW.FACT_DESPACHO, NEW.FACT_OBS, NEW.FACT_IVAINC, NEW.FACT_NOMCLIENTE, NEW.FACT_DTOPOR, NEW.FACT_DTOMONTO, NEW.FACT_ADICIONAL, NEW.FACT_IVAMONTO, NEW.FACT_EXTRA, NEW.FACT_TOTAL, 'N', 'N', NEW.PTVT_ID, NULL, NEW.FACT_RTFTEPOR, NEW.FACT_RTFTEMONTO, NEW.FACT_RTIVAPOR, NEW.FACT_RTIVAMONTO, NEW.FACT_RTICAPOR, NEW.FACT_RTICAMONTO, NEW.fact_sucursal);
        END
    INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
        VALUES (USER, 31, NEW.fact_id, 'U', NEW.pref_pre || NEW.fact_numero);
    end
/* SI CAMBIA EL NUEMRO O LA FECHA CAMBIE EL DETALLE */
if ((OLD.pref_pre <> NEW.pref_pre) or
    (OLD.fact_numero <> NEW.fact_numero) or
    (OLD.fact_fecha <> NEW.fact_fecha)) then
    UPDATE FACTURAS_DETALLE SET FADE_TRANSMIT = 'N' WHERE FACT_ID = NEW.FACT_ID;
/* ACTUALICE EL ANULADO EN LOS DETALLES */
if (OLD.FACT_anulado <> NEW.FACT_anulado) then
    UPDATE FACTURAS_DETALLE SET FADE_ANULADO = NEW.FACT_anulado WHERE FACT_ID = NEW.FACT_ID;
if (OLD.fact_transmit <> NEW.fact_transmit) then
    UPDATE FACTURAS_DETALLE SET FADE_TRANSMIT = NEW.fact_transmit WHERE FACT_ID = NEW.FACT_ID;
END
^

SET TERM ; ^

/* SI TRM NULL O CERO DEJELO EN 1 */

SET TERM ^ ;

ALTER TRIGGER EGRESOS_BI
ACTIVE BEFORE INSERT POSITION 0
AS
declare variable NUMERO VARCHAR(6);
declare variable AUTOM CHAR(1);
declare variable EXISTE CHAR(1);
BEGIN
if (NEW.numok = 'N') then
  BEGIN
  /* Actualice el contador del prefijo */
  SELECT PREF_ACTUAL, PREF_AUTO FROM PREFIJOS WHERE TIDO_COD = 62 AND PREF_PRE = NEW.PREF_PRE INTO :NUMERO, :AUTOM;
  /* ACTUALICE EL NUMERO EN COMPROBANTE_ENCABEZADO  */
  if (AUTOM = 'S') then
    BEGIN
    NEW.EGRE_NUMERO = NUMERO;
    NUMERO = CAST((CAST(NUMERO AS INTEGER) + 1) AS CHAR(6));
    UPDATE PREFIJOS
      SET PREF_ACTUAL = :NUMERO
    WHERE TIDO_COD = 62 AND PREF_PRE = NEW.PREF_PRE;
    END
  ELSE
    BEGIN
    if (CAST(NUMERO AS INTEGER) = CAST(NEW.EGRE_NUMERO AS INTEGER)) then
        UPDATE PREFIJOS
          SET PREF_ACTUAL = CAST((CAST(PREF_ACTUAL AS INTEGER) + 1) AS CHAR(6))
        WHERE TIDO_COD = 62 AND PREF_PRE = NEW.PREF_PRE;
    END
  EXECUTE PROCEDURE COMPLETA_CEROS (NEW.EGRE_numero) returning_values (NEW.EGRE_numero);
  NEW.numok = 'S';
  END
/* Verifique que el numero no existe previamente */
EXISTE = 'N';
SELECT 'S' FROM EGRESOS WHERE PREF_PRE = NEW.PREF_PRE AND EGRE_NUMERO = NEW.EGRE_NUMERO INTO :EXISTE;
if (EXISTE = 'S') then
    EXCEPTION DOCUMENTO_REGISTRADO;
if (new.cleg_id is null) then
    new.cleg_id = 0;
if ((new.egre_trm is null) or (new.egre_trm = 0)) then
    new.egre_trm = 1;
END
^

SET TERM ; ^


SET TERM ^ ;

ALTER TRIGGER RECIBOS_CAJA_BI
ACTIVE BEFORE INSERT POSITION 0
AS
declare variable NUMERO VARCHAR(6);
declare variable AUTOM CHAR(1);
declare variable EXISTE CHAR(1);
BEGIN
if (NEW.numok = 'N') then
  BEGIN
  /* Actualice el contador del prefijo */
  SELECT PREF_ACTUAL, PREF_AUTO FROM PREFIJOS WHERE TIDO_COD = 61 AND PREF_PRE = NEW.PREF_PRE INTO :NUMERO, :AUTOM;
  /* ACTUALICE EL NUMERO EN EL_ENCABEZADO  */
  if (AUTOM = 'S') then
    BEGIN
    NEW.RECA_NUMERO = NUMERO;
    NUMERO = CAST((CAST(NUMERO AS INTEGER) + 1) AS CHAR(6));
    UPDATE PREFIJOS
      SET PREF_ACTUAL = :NUMERO
    WHERE TIDO_COD = 61 AND PREF_PRE = NEW.PREF_PRE;
    END
  ELSE
    BEGIN
    if (CAST(NUMERO AS INTEGER) = CAST(NEW.RECA_NUMERO AS INTEGER)) then
        UPDATE PREFIJOS
          SET PREF_ACTUAL = CAST((CAST(PREF_ACTUAL AS INTEGER) + 1) AS CHAR(6))
        WHERE TIDO_COD = 61 AND PREF_PRE = NEW.PREF_PRE;
    END
  EXECUTE PROCEDURE COMPLETA_CEROS (NEW.RECA_numero) returning_values (NEW.RECA_numero);
  NEW.numok = 'S';
  END
/* Verifique que el numero no existe previamente */
EXISTE = 'N';
SELECT 'S' FROM RECIBOS_CAJA WHERE PREF_PRE = NEW.PREF_PRE AND RECA_NUMERO = NEW.RECA_NUMERO INTO :EXISTE;
if (EXISTE = 'S') then
    EXCEPTION DOCUMENTO_REGISTRADO;
if ((NEW.reca_trm IS NULL) or (NEW.reca_trm = 0))  then
    NEW.reca_trm = 1;
END
^

SET TERM ; ^


/* MAL EL IVA EN FACURA MASIVA */
SET TERM ^ ;

CREATE OR ALTER PROCEDURE FACTURAR_CONCEPTOS(
    ID INTEGER,
    NITINI VARCHAR(20),
    NITFIN VARCHAR(20),
    AGRINI VARCHAR(20),
    AGRFIN VARCHAR(20),
    AGRUPA INTEGER,
    FECHA DATE)
RETURNS (
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(6),
    NIT VARCHAR(20),
    NOMBRE VARCHAR(60),
    TOTAL NUMERIC(18,2))
AS
declare variable IDF INTEGER;
declare variable IDC INTEGER;
declare variable VEND INTEGER;
declare variable PTVT INTEGER;
declare variable VENDINI INTEGER;
declare variable VENDFIN INTEGER;
declare variable ZONINI CHAR(2);
declare variable ZONFIN CHAR(2);
declare variable grpini INTEGER;
declare variable grpfin INTEGER;
declare variable DIAS INTEGER;
declare variable OBS VARCHAR(255);
declare variable IVAINC CHAR(1);
declare variable ITEM INTEGER;
declare variable ARTICULO VARCHAR(20);
declare variable DESCR VARCHAR(60);
declare variable CANT NUMERIC(18,2);
declare variable PRUNIT NUMERIC(18,2);
declare variable IVAP NUMERIC(18,2);
declare variable IVAM NUMERIC(18,2);
declare variable BASE NUMERIC(18,2);
declare variable RTFTE NUMERIC(9,2);
declare variable RTIVA NUMERIC(9,2);
declare variable RTICA NUMERIC(9,2);
declare variable RTFTEM NUMERIC(18,2);
declare variable RTIVAM NUMERIC(18,2);
declare variable RTICAM NUMERIC(18,2);
declare variable UNIDAD VARCHAR(8);
declare variable BOD VARCHAR(2);
declare variable ERROR INTEGER;
declare variable VER CHAR(1);
begin
if (agrupa = 0) then
    BEGIN
    VENDINI = 0;
    VENDFIN = 999999;
    GRPINI = 0;
    GRPFIN = 999999;
    ZONINI = '';
    ZONFIN = 'zz';
    END
if (agrupa = 1) then
    BEGIN
    VENDINI = 0;
    VENDFIN = 999999;
    ZONINI = '';
    ZONFIN = 'zz';
    GRPINI = AGRINI;
    GRPFIN = AGRFIN;
    END
if (agrupa = 2) then
    BEGIN
    GRPINI = 0;
    GRPFIN = 999999;
    ZONINI = '';
    ZONFIN = 'zz';
    VENDINI = AGRINI;
    VENDFIN = AGRFIN;
    END
if (agrupa = 3) then
    BEGIN
    VENDINI = 0;
    VENDFIN = 999999;
    GRPINI = 0;
    GRPFIN = 999999;
    ZONINI = AGRINI;
    ZONFIN = AGRFIN;
    END
SELECT FACC_PREF, FACC_VEND, FACC_DIAS, FACC_PTVT, FACC_OBS FROM factura_concepto WHERE FACC_ID = :ID
    INTO :prefijo, :vend, :dias, :ptvt, :obs;
SELECT BODE_COD FROM punto_venta WHERE PTVT_ID = :PTVT INTO :BOD;
FOR SELECT T.TERC_NIT, TERC_NOM, C.vend_cod, C.clie_rtefte, C.clie_rteiva, C.clie_rteica, C.clie_rtftebase
    FROM TERCEROS T, CLIENTES C
    WHERE T.terc_nit = C.terc_nit AND T.TERC_NIT >= :NITINI AND T.TERC_NIT <= :NITFIN AND
        C.vend_cod >= :vendini AND C.vend_cod <= :vendfin AND ((c.grca_cod is null and :grpini = 0 ) or (C.grca_cod >= :grpini AND C.grca_cod <= :grpfin)) AND
        ((c.zona_cod is null and :zonini = '') or (C.zona_cod >= :zonini AND C.zona_cod <= :zonfin))
    INTO :NIT, :NOMBRE, :VEND, :RTFTE, :RTIVA, :RTICA, :RTFTEM
    DO
    BEGIN
    SELECT PREF_ACTUAL, PREF_IVAINC FROM PREFIJOS WHERE TIDO_COD = 31 AND PREF_PRE = :prefijo
        INTO :NUMERO, :IVAINC;
    select max(INVE_ID) FROM interfaz_ventas WHERE PREF_PRE = :prefijo AND TIDO_COD = 31 INTO :IDC;

    /* CALCULE EL TOTAL DE LA FACTURA XA EFECTOS DE IMPUESTOS */
    SELECT SUM(FACI_CANT * FACI_PRUNIT * TAIV_PORC / 100), SUM(FACI_CANT * FACI_PRUNIT), SUM(FACI_CANT * FACI_PRUNIT / (100 + TAIV_PORC) * TAIV_PORC)
        FROM factura_concepto_items F, ARTICULO A, TARIFA_IVA I
        WHERE F.arti_cod = A.arti_cod AND A.taiv_cod = I.taiv_cod AND FACC_ID = :ID
        INTO :IVAM, :TOTAL, IVAP;

    if (IVAINC = 'S') then
        BEGIN
        IVAM = IVAP;
        BASE = TOTAL - IVAM;
        END
    ELSE
        BASE = TOTAL;
    if (BASE >= RTFTEM) then
        BEGIN
        RTFTEM = BASE * RTFTE / 100;
        RTICAM = BASE * RTICA / 1000;
        RTIVAM = IVAM * RTIVA / 100;
        END
    ELSE
        BEGIN
        RTFTEM = 0;
        RTICAM = 0;
        RTIVAM = 0;
        END

    IDF = GEN_ID(id_factura, 1);
    INSERT INTO FACTURAS (FACT_ID, PTVT_ID, VEND_COD, TERC_NIT, AUTO_NUMERO, FACT_NUMERO, FACT_FECHA, FACT_DESPACHO,
        FACT_VENCE, FACT_IVAINC, FACT_COMIPORC, FACT_COMIMONTO, FACT_DTOPOR, FACT_DTOMONTO, FACT_ADICIONAL,
        FACT_IVAMONTO, FACT_RTFTEPOR, FACT_RTFTEMONTO, FACT_RTIVAPOR, FACT_RTIVAMONTO, FACT_RTICAPOR, FACT_RTICAMONTO,
        FACT_EXTRA, FACT_DTOFPOR, FACT_DTOFMONTO, FACT_DTOFFECHA, PREF_PRE, FACT_TRANSP, FACT_NOMCLIENTE, FACT_COTIZACI,
        FACT_PEDIDO, FACT_REMISION, FACT_ANULADO, FACT_TRANSMIT, FACT_TOTAL, BODE_COD, FACT_OBS, VEHI_COD, FACT_CONSOLIDA,
        FACT_RECIBIDO, FACT_USUARIO, FACT_SUCURSAL, NUMOK, COBR_COD, FACT_FACTOR, FACT_DETCLI, FACT_DETCLINOM,
        FACT_DTOIT1, FACT_DTOIT2, FACT_DTOIT3, FACT_TRM)
        VALUES (:IDF, :PTVT, :VEND, :NIT, NULL, :NUMERO, :FECHA, NULL, (:FECHA + :DIAS), :IVAINC,
        0, 0, 0, 0, 0, :IVAM, :RTFTE, :RTFTEM, :RTIVA, :RTIVAM, :RTICA, :RTICAM, 0, 0, 0, :FECHA, :PREFIJO, NULL,
        :NOMBRE, NULL, NULL, NULL, 'N', 'N', :TOTAL, :BOD, :OBS, NULL, NULL, 0, USER, '01', 'N', :VEND, 1, NULL,
        NULL, NULL, NULL, NULL, 1);

    FOR SELECT FACI_ITEM, FC.ARTI_COD, FACI_CANT, FACI_PRUNIT, ARTI_UNIDAD, TAIV_PORC, FACI_DESC
        FROM factura_concepto_items FC, ARTICULO A, TARIFA_IVA I
        WHERE FC.arti_cod = A.arti_cod AND A.taiv_cod = I.taiv_cod AND FC.facc_id = :ID
        INTO :item, :articulo, :CANT, :prunit, :unidad, :ivap, :descr
        DO
        BEGIN
        if (IVAINC = 'S') then
            BEGIN
            IVAM = :CANT * :PRUNIT / (100 + :IVAP) * :IVAP;
            BASE = :CANT * :PRUNIT;
            END
        ELSE
            BEGIN
            IVAM = :CANT * :PRUNIT * IVAP / 100;
            BASE = :CANT * :PRUNIT + IVAM;
            END
        INSERT INTO FACTURAS_DETALLE (FACT_ID, FADE_ITEM, BODE_COD, ARTI_COD, FADE_CANT, FADE_UNIDAD, FADE_LOTE,
            FADE_PRUNIT, FADE_DTOPORC, FADE_DTOMONTO, FADE_IVAPORC, FADE_IVAMONTO, FADE_CONSUMO, FADE_FACTOR,
            FADE_DESC, FADE_OBS, FADE_CODBAR, FADE_REMISIONADO, FADE_DEVUELTO, FADE_TOTAL, LIPR_COD, FADE_REFERENCIA,
            FADE_ANULADO, FADE_TRANSMIT, FADE_FACTORLISTA, FADE_DTO1, FADE_DTO2, FADE_DTO3, FADE_DTOM1, FADE_DTOM2,
            FADE_DTOM3, FADE_CAJAS)
            VALUES (:IDF, :ITEM, :BOD, :articulo, :CANT, :UNIDAD, NULL, :prunit, 0, 0, :IVAP, :ivam, 0, 1,
            :descr, NULL, :articulo, 0, 0, :BASE, 1, NULL, 'N', 'N', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
        END
    /* contabilice */
    execute procedure CONTABIL_FACTURA(:idf,  :IDC) returning_values (:ERROR, :VER, :IDC);
    EXECUTE procedure contabiliza_pendiente (:IDC);
    suspend;
    END
end
^

SET TERM ; ^


/* 20081122 : DESCRIPCION CORTA PARA AUTOSERVICIOS */
ALTER TABLE ARTICULO
ADD ARTI_DESCORTA VARCHAR(30);

SET TERM ^ ;

CREATE OR ALTER PROCEDURE IMPR_FACTURA(
    ID INTEGER)
RETURNS (
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    VENCE DATE,
    DIASVENCE INTEGER,
    CONTCRED CHAR(17),
    NIT VARCHAR(20),
    NOMTERCERO VARCHAR(60),
    NOMCLIENTE VARCHAR(60),
    VENDEDOR INTEGER,
    NOMVENDEDOR VARCHAR(60),
    PUNTOVTA INTEGER,
    NOMPUNTOVTA VARCHAR(30),
    CODBODEGA VARCHAR(2),
    NOMBODEGA VARCHAR(30),
    AUTORIZACION VARCHAR(20),
    DESPACHO VARCHAR(255),
    TRANSPORTADOR VARCHAR(60),
    COTIZACION VARCHAR(30),
    PEDIDO VARCHAR(30),
    REMISION VARCHAR(30),
    PACIENTE VARCHAR(20),
    NOMPACIENTE VARCHAR(60),
    COMIPORC NUMERIC(9,2),
    COMIMONTO NUMERIC(18,2),
    SUBTOTAL NUMERIC(18,2),
    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),
    EXTRA NUMERIC(18,2),
    DTOFPORC NUMERIC(9,2),
    DTOFMONTO NUMERIC(18,2),
    FECHADTO DATE,
    TOTALFAC NUMERIC(18,2),
    TOTALPAGAR NUMERIC(18,2),
    OBS BLOB SUB_TYPE 1 SEGMENT SIZE 80,
    ITEM INTEGER,
    ARTICULO VARCHAR(15),
    CODBAR VARCHAR(15),
    ARTIDES VARCHAR(60),
    DESCORTA VARCHAR(30),
    CANT NUMERIC(18,4),
    LOTE VARCHAR(15),
    VLOTE DATE,
    UNIDAD VARCHAR(8),
    CAJAS NUMERIC(18,4),
    FACTOR INTEGER,
    LISTAPR INTEGER,
    REFITEM VARCHAR(60),
    BODITEM VARCHAR(2),
    PRUNIT NUMERIC(18,2),
    DTOITPORC NUMERIC(9,2),
    DTOITMONTO NUMERIC(18,2),
    PRNETO NUMERIC(18,2),
    IVAPORC NUMERIC(9,2),
    IVAITMONTO NUMERIC(18,2),
    CONSUMO NUMERIC(18,2),
    SUBTOTIT NUMERIC(18,2),
    SUBTOTITCON NUMERIC(18,2),
    DTOIT1 NUMERIC(9,2),
    DTOIT2 NUMERIC(9,2),
    DTOIT3 NUMERIC(9,2),
    TOTAL NUMERIC(18,2),
    CODIGOCL VARCHAR(20),
    ZONACOD VARCHAR(2),
    ZONANOM VARCHAR(60),
    DV CHAR(1),
    DIRECCION VARCHAR(60),
    CIUDAD VARCHAR(40),
    TELEFONO VARCHAR(40),
    CONTACTO VARCHAR(60),
    FAX VARCHAR(25),
    GRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    SUBGRUPO VARCHAR(3),
    NOMSUBG VARCHAR(30),
    MARCA VARCHAR(3),
    NOMMARCA VARCHAR(30),
    PESO NUMERIC(18,4),
    ANCHO NUMERIC(18,4),
    ALTO NUMERIC(18,4),
    LARGO NUMERIC(18,4),
    SUMA1 NUMERIC(18,2),
    SUMA2 NUMERIC(18,2),
    SUMA3 NUMERIC(18,2),
    IVA1 NUMERIC(18,2),
    IVA2 NUMERIC(18,2),
    IVA3 NUMERIC(18,2),
    SUMAEX NUMERIC(18,2),
    SUMAGR NUMERIC(18,2),
    TOTCONSUMO NUMERIC(18,2),
    DTOIT1M NUMERIC(18,2),
    DTOIT2M NUMERIC(18,2),
    DTOIT3M NUMERIC(18,2),
    TOTCAJAS NUMERIC(18,2),
    VEHICULO VARCHAR(8),
    RECIBIDO NUMERIC(18,2),
    CAMBIO NUMERIC(18,2),
    HORA TIME,
    FORMAPAGO1 VARCHAR(30),
    MONTOPAGO1 NUMERIC(18,2),
    FORMAPAGO2 VARCHAR(30),
    MONTOPAGO2 NUMERIC(18,2),
    FORMAPAGO3 VARCHAR(30),
    MONTOPAGO3 NUMERIC(18,2),
    PUNTOS INTEGER,
    PUNTOSACUM INTEGER,
    PUNTOSVENC INTEGER,
    FECPTOS DATE,
    OBSITEM BLOB SUB_TYPE 1 SEGMENT SIZE 80,
    SUCUR VARCHAR(10))
AS
DECLARE VARIABLE IMPTOS CHAR(1);
DECLARE VARIABLE TARIFA INTEGER;
declare variable DEVUELTO NUMERIC(18,2);
/*DECLARE VARIABLE NROCOPIA INTEGER;*/
declare variable ORDENCOD CHAR(2);
declare variable IMPRDEV CHAR(2);
declare variable IMPR CHAR(1);
declare variable ITEMFP INTEGER;
declare variable FORMAP VARCHAR(30);
declare variable MONTOP NUMERIC(18,2);
BEGIN
  SELECT F.PREF_PRE, FACT_NUMERO, FACT_FECHA, FACT_VENCE, F.BODE_COD, BODE_NOM, F.TERC_NIT, FACT_NOMCLIENTE, F.VEND_COD, VEND_NOMBRE, F.PTVT_ID, PTVT_NOM,
    AUTO_NUMERO, FACT_DESPACHO, FACT_TRANSP, FACT_COTIZACI, FACT_PEDIDO, FACT_REMISION, FACT_COMIPORC, FACT_COMIMONTO, FACT_IVAINC, 
    FACT_DTOPOR, FACT_DTOMONTO, FACT_ADICIONAL, FACT_IVAMONTO, FACT_RTFTEPOR, FACT_RTFTEMONTO, FACT_RTIVAPOR, FACT_RTIVAMONTO, FACT_RTICAPOR, FACT_RTICAMONTO, FACT_EXTRA, FACT_DTOFPOR, FACT_DTOFMONTO, FACT_DTOFFECHA, FACT_TOTAL,
    TERC_DIR, TERC_CIU, TERC_TEL, TERC_CONTACTO, TERC_FAX, TERC_DV, FACT_DTOIT1, FACT_DTOIT2, FACT_DTOIT3,
    FACT_OBS, VEHI_COD, /*FACT_NROCOPIA,*/ FACT_RECIBIDO, FACT_SUCURSAL, FACT_DETCLI, FACT_DETCLINOM, TERC_NOM
    FROM FACTURAS F, BODEGA B, VENDEDORES V, PUNTO_VENTA P, TERCEROS T
    WHERE F.BODE_COD = B.BODE_COD AND F.VEND_COD = V.VEND_COD AND F.PTVT_ID = P.PTVT_ID AND F.TERC_NIT = T.TERC_NIT AND F.FACT_ID = :ID
    into :PREF, :NUMERO, :FECHA, :VENCE, :CODBODEGA, :NOMBODEGA, :NIT, :NOMTERCERO, :VENDEDOR, :NOMVENDEDOR, :PUNTOVTA, :NOMPUNTOVTA,
    :AUTORIZACION, :DESPACHO, :TRANSPORTADOR, :COTIZACION, :PEDIDO, :REMISION, :COMIPORC, :COMIMONTO, :IMPTOS,
    :DTOPORC, :DTOMONTO, :ADICIONAL, :IVAMONTO, :RTEFTEPORC, :RTEFTEMONTO, :RTEIVAPORC, :RTEIVAMONTO, :RTEICAPORC, :RTEICAMONTO, :EXTRA, :DTOFPORC, :DTOFMONTO, :FECHADTO, :TOTALFAC,
    :DIRECCION, :CIUDAD, :TELEFONO, :CONTACTO, :FAX, :DV, :dtoit1m, :dtoit2m, :dtoit3m,
    :OBS, :VEHICULO,/* :NROCOPIA,*/ :RECIBIDO, :SUCUR, :paciente, :nompaciente, :nomcliente;

  /* ACUMULE LOS PUNTOS, SE HACE ACA POR SER POSTERIOR AL DETALLE */
  EXECUTE PROCEDURE acumula_puntos_cliente (31, :id, :nit, :fecha) returning_values (:PUNTOS);
  EXECUTE PROCEDURE consulta_puntos_cliente (:id, :nit, :fecha) returning_values (:puntos, :puntosacum, :puntosvenc, :fecptos);

  SELECT CLIE_COD, C.ZONA_COD, ZONA_NOM
    FROM CLIENTES C, ZONAS Z
    WHERE TERC_NIT = :NIT AND C.ZONA_COD = Z.ZONA_COD
    INTO :CODIGOCL, :ZONACOD, :ZONANOM;
  /*SELECT NOCO_NOMBRE FROM NOMBRES_COPIAS where NOCO_ID = :NROCOPIA INTO :NOMCOPIA;*/
  SELECT CLSU_DIR, CLSU_CIUDAD, CLSU_TEL FROM CLIENTE_SUCURSALES WHERE TERC_NIT = :NIT AND CLCU_COD = :SUCUR
    INTO :DIRECCION, :CIUDAD, :TELEFONO;
  /*if (NOMCOPIA IS NULL) then
    NOMCOPIA = 'COPIA No. ' || NROCOPIA;**/
  DIASVENCE = VENCE - FECHA;
  if (DIASVENCE > 0) then
    CONTCRED = 'CREDITO ' || CAST(DIASVENCE AS VARCHAR(3)) || ' DIAS';
  ELSE
    CONTCRED = 'CONTADO';
  SUBTOTAL = TOTALFAC - EXTRA - IVAMONTO - ADICIONAL + DTOMONTO;
  TOTALPAGAR = TOTALFAC - RTEFTEMONTO - RTEIVAMONTO - RTEICAMONTO;
  if (RECIBIDO <> 0) then
      CAMBIO = RECIBIDO - totalpagar;
  ELSE
    CAMBIO = 0;
  SUMAEX = 0;
  SUMA1 = 0;
  SUMA2 = 0;
  SUMA3 = 0;
  IVA1 = 0;
  IVA2 = 0;
  IVA3 = 0;
  TOTCONSUMO = 0;
  MONTOPAGO1 = 0;
  SELECT MAX(AUDI_HORA) FROM AUDITORIA WHERE TIDO_COD = 31 AND AUDI_IDDOC = :ID AND AUDI_OPER = 'I' INTO :HORA;
  /* AHORA LAS FORMAS DE PAGO, BUSQUE EL ABONO DE HOY A LA FACTURA */
  ITEMFP = 1;
  MONTOPAGO1 = 0;
  MONTOPAGO2 = 0;
  MONTOPAGO3 = 0;
  FOR SELECT FOPA_NOM, RCPA_MONTO FROM RECIBOS_CAJA_PAGO P, FORMAS_PAGO F, RECIBOS_CAJA R, RECIBOS_CAJA_DETALLE D
    WHERE R.RECA_ID = P.RECA_ID AND R.RECA_ID = D.RECA_ID AND P.FOPA_ID = F.FOPA_ID AND RECA_FECHA = :FECHA AND RCDE_TIPODOC = 31 AND RCDE_IDDOC = :ID
    INTO :formap, :MONTOP
    DO
    BEGIN
    if (ITEMFP = 1) then
        BEGIN
        FORMAPAGO1 = FORMAP;
        MONTOPAGO1 = MONTOP;
        END
    if (ITEMFP = 2) then
        BEGIN
        FORMAPAGO2 = FORMAP;
        MONTOPAGO2 = MONTOP;
        END
    if (ITEMFP = 3) then
        BEGIN
        FORMAPAGO3 = FORMAP;
        MONTOPAGO3 = MONTOP;
        END
    ITEMFP = ITEMFP + 1;
    END
  EXECUTE PROCEDURE lee_configuracion ('FACTURACION','DOCUMENTOS','ORDENAR ITEMS POR CODIGO DE ARTICULO') returning_values (:ORDENCOD);
  EXECUTE PROCEDURE lee_configuracion ('FACTURACION','POS', 'IMPRIMIR DEVOLUCIONES DE ARTICULOS NEGATIVOS') returning_values (:imprdev);
  totcajas = 0;
  if (ORDENCOD = 'SI') then
    BEGIN
    FOR SELECT FADE_ITEM, D.ARTI_COD, FADE_CODBAR, SUBSTR(FADE_DESC,1,60), ARTI_DESCORTA, FADE_CANT, FADE_UNIDAD, FADE_FACTOR, BODE_COD, FADE_LOTE, LIPR_COD, FADE_PRUNIT, FADE_DTOPORC, FADE_DTOMONTO, FADE_IVAPORC, FADE_IVAMONTO, FADE_CONSUMO, FADE_TOTAL, FADE_REFERENCIA,
        GRUP_COD, SUBG_COD, MARC_COD, ARTI_PESO, ARTI_ANCHO, ARTI_ALTO, ARTI_LARGO, TAIV_COD, FADE_DEVUELTO, FADE_OBS, FADE_DTO1, FADE_DTO2, FADE_DTO3, FADE_CAJAS
        FROM FACTURAS_DETALLE D, ARTICULO A
        WHERE D.ARTI_COD = A.ARTI_COD AND D.FACT_ID = :ID
        ORDER BY D.ARTI_COD
        INTO :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :DESCORTA, :CANT, :UNIDAD, :FACTOR, :BODITEM, :LOTE, :LISTAPR, :PRUNIT, :DTOITPORC, :DTOITMONTO, :IVAPORC, :IVAITMONTO, :CONSUMO, :TOTAL, :refitem,
        :GRUPO, :SUBGRUPO, :MARCA, :PESO, :ANCHO, :ALTO, :LARGO, :TARIFA, :devuelto, :obsitem, :dtoit1, :dtoit2, :dtoit3, :cajas
        DO
          BEGIN
          if (ARTICULO = CODBAR) then
            SELECT FIRST 1 COBA_COD FROM barras_articulo WHERE ARTI_COD = :articulo INTO :CODBAR;
          if (IMPRDEV <> 'SI') then
            BEGIN
            if ((CANT >= 0) AND (DEVUELTO = 0)) then
                IMPR = 'S';
            ELSE
                IMPR = 'N'; /* ES DEVOLUCION */
            END
          ELSE
            IMPR = 'S';
          if (IMPR = 'S') then
            BEGIN
            if (IMPTOS = 'S') then
                if (cant <> 0) then
                    PRNETO = PRUNIT - DTOITMONTO - ((IVAITMONTO+CONSUMO) / CANT);
                else
                    PRNETO = PRUNIT - DTOITMONTO;
            ELSE
                PRNETO = PRUNIT - DTOITMONTO;
            SUBTOTIT = TOTAL - IVAITMONTO - CONSUMO;
            SUBTOTITCON = TOTAL;
            TOTCONSUMO = TOTCONSUMO + CONSUMO;
            SELECT LOTE_VENCE FROM LOTES WHERE LOTE_NRO = :lote AND ARTI_COD = :ARTICULO AND BODE_COD = :boditem INTO :vlote;
            if (TARIFA = 0) then
                SUMAEX = SUMAEX + TOTAL;
            if (TARIFA = 1) then
                BEGIN
                SUMA1 = SUMA1 + TOTAL - IVAITMONTO;
                IVA1 = IVA1 + IVAITMONTO;
                END
            if (TARIFA = 2) then
                BEGIN
                SUMA2 = SUMA2 + TOTAL - IVAITMONTO;
                IVA2 = IVA2 + IVAITMONTO;
                END
            if (TARIFA = 3) then
                BEGIN
                SUMA3 = SUMA3 + TOTAL - IVAITMONTO;
                IVA3 = IVA3 + IVAITMONTO;
                END
            SUMAGR = SUMA1 + SUMA2 + SUMA3;
            if (IMPTOS = 'N') then
                TOTAL = TOTAL - IVAITMONTO - CONSUMO;
            if (ANCHO IS NULL) then
                ANCHO = 0;
            if (ALTO IS NULL) then
                ALTO = 0;
            if (LARGO IS NULL) then
                LARGO = 0;
            if (PESO IS NULL) then
                PESO = 0;
            PESO = PESO * CANT;
            totcajas = totcajas + cajas;
            SUSPEND;
            END
          END
    END
ELSE
    BEGIN
    FOR SELECT FADE_ITEM, D.ARTI_COD, FADE_CODBAR, SUBSTR(FADE_DESC,1,60), ARTI_DESCORTA, FADE_CANT, FADE_UNIDAD, FADE_FACTOR, BODE_COD, FADE_LOTE, LIPR_COD, FADE_PRUNIT, FADE_DTOPORC, FADE_DTOMONTO, FADE_IVAPORC, FADE_IVAMONTO, FADE_CONSUMO, FADE_TOTAL, FADE_REFERENCIA,
        GRUP_COD, SUBG_COD, MARC_COD, ARTI_PESO, ARTI_ANCHO, ARTI_ALTO, ARTI_LARGO, TAIV_COD, FADE_DEVUELTO, FADE_OBS, FADE_DTO1, FADE_DTO2, FADE_DTO3, FADE_CAJAS
        FROM FACTURAS_DETALLE D, ARTICULO A
        WHERE D.ARTI_COD = A.ARTI_COD AND D.FACT_ID = :ID
        ORDER BY FADE_ITEM
        INTO :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :DESCORTA, :CANT, :UNIDAD, :FACTOR, :BODITEM, :LOTE, :LISTAPR, :PRUNIT, :DTOITPORC, :DTOITMONTO, :IVAPORC, :IVAITMONTO, :CONSUMO, :TOTAL, :refitem,
        :GRUPO, :SUBGRUPO, :MARCA, :PESO, :ANCHO, :ALTO, :LARGO, :TARIFA, :devuelto, :obsitem, :dtoit1, :dtoit2, :dtoit3, :cajas
        DO
          BEGIN
          if (IMPRDEV <> 'SI') then
            BEGIN
            if ((CANT >= 0) AND (DEVUELTO = 0)) then
                IMPR = 'S';
            ELSE
                IMPR = 'N'; /* ES DEVOLUCION */
            END
          ELSE
            IMPR = 'S';
          if (IMPR = 'S') then
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :GRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :MARCA INTO NOMMARCA;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :SUBGRUPO AND GRUP_COD = :GRUPO INTO :NOMSUBG;
            if (IMPTOS = 'S') then
              PRNETO = PRUNIT - DTOITMONTO - ((IVAITMONTO+CONSUMO) / CANT);
            ELSE
              PRNETO = PRUNIT - DTOITMONTO;
            SUBTOTIT = TOTAL - IVAITMONTO - CONSUMO;
            SUBTOTITCON = TOTAL;
            TOTCONSUMO = TOTCONSUMO + CONSUMO;
            SELECT LOTE_VENCE FROM LOTES WHERE LOTE_NRO = :lote AND ARTI_COD = :ARTICULO AND BODE_COD = :boditem INTO :vlote;
            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;
            if (ANCHO IS NULL) then
                ANCHO = 0;
            if (ALTO IS NULL) then
                ALTO = 0;
            if (LARGO IS NULL) then
                LARGO = 0;
            if (PESO IS NULL) then
                PESO = 0;
            PESO = PESO * CANT;
            totcajas = totcajas + cajas;
            SUSPEND;
            END
          END
    END
END
^

SET TERM ; ^

/* 20081122 : DESCUENTOS POR GRUPO Y LISTA DE PRECIOS */

ALTER TABLE GRUPO
ADD GRUP_DSCTO T_PORCENTAJE;
ALTER TABLE LISTA_PRECIOS
ADD LIPR_DSCTO T_PORCENTAJE;

INSERT INTO CONFIGURACION (CONF_MODULO, CONF_CATEGORIA, CONF_PROPIEDAD, CONF_VALOR, CONF_POSIBLES, CONF_AYUDA) VALUES ('FACTURACION', 'DOCUMENTOS', 'SUGERIR DESCUENTO POR ITEM CON BASE EN GRUPO DE MERCANCIA Y LISTA DE PRECIOS', 'NINGUNO', 'AMBOS,GRUPO,LISTA,NINGUNO', 'AMBOS: Trae el descuento del grupo de mercancia más el descuento de la lista de precios. GRUPO: Trae el descuento del grupo. LISTA: Trae el descuento de la lista. NINGUNO:  No sugiere ningún descuento');
COMMIT WORK;

ALTER TABLE GRUPO DROP GRUP_DTO;

/* 20081124 : INTERFACE DE APLICACIONES */
SET TERM ^ ;

CREATE OR ALTER PROCEDURE CONTABIL_APLICACL(
    IDDOC INTEGER,
    IDINTER INTEGER)
RETURNS (
    ERROR INTEGER,
    VER CHAR(1),
    IDC INTEGER)
AS
declare variable PREF VARCHAR(4);
declare variable NUM VARCHAR(6);
declare variable NUMERO VARCHAR(10);
declare variable NUMDOC VARCHAR(10);
declare variable FECAUX DATE;
declare variable FECHA CHAR(8);
declare variable CONC CHAR(120);
declare variable VENCE CHAR(8);
declare variable VRSUBT NUMERIC(18, 2);
declare variable TIPOCOMP VARCHAR(3);
declare variable PREFCONT VARCHAR(4);
declare variable BASE CHAR(1);
declare variable CTABASE VARCHAR(20);
declare variable CLIE CHAR(1);
declare variable CTACLIE VARCHAR(20);
declare variable EXISTE CHAR(1);
declare variable CUENTA VARCHAR(20);
declare variable TIPOCUEN CHAR(1);
declare variable NIT VARCHAR(20);
declare variable PROY VARCHAR(4);
declare variable CENTRO VARCHAR(4);
declare variable NROI INTEGER;
declare variable TCTACLIEN VARCHAR(20);
declare variable TCTABASE VARCHAR(20);
declare variable ANULADO CHAR(1);
declare variable TIPODOC INTEGER;
BEGIN
  /* BUSQUE LA INTERFACE */
  EXISTE = 'N';
  SELECT 'S', TICO_COD, PRCO_PRE, INCA_BASE, INCA_CLIE, INCA_CTABASE, INCA_CTACLIE, INCA_CONFIRMAR
    FROM INTERFAZ_CARTERA
    WHERE INCA_ID = :IDINTER
    INTO :EXISTE, :TIPOCOMP, :PREFCONT, :BASE, :CLIE, :CTABASE, :CTACLIE, :VER;
  if (EXISTE = 'S') then
    BEGIN
    /* BORRE CUALQUEIR CONTABILIZACION PREVIA */
    DELETE FROM CONTABILIZACION WHERE CNTB_TIPOREF = 43 AND CNTB_IDREF = :IDDOC;
    /* TRAIGA EL ENCABEZADO DE LA NOTA */
    FOR SELECT PREF_PRE, APCL_NUMERO, APCL_FECHA, N.TERC_NIT, APCL_CONCEPTO, TERC_CTAVENTA,
        TERC_CTACLIENTE, APCL_ANULADO, ACDE_APLICADO+ACDE_RTFTE+ACDE_RTIVA+ACDE_RTICA, ACDE_PREFIJO || ACDE_NUMERO, ACDE_TIPODOC
        FROM aplicacion_cliente N, aplicacion_cliente_detalle D, TERCEROS T
        WHERE N.APCL_ID = :IDDOC AND N.TERC_NIT = T.TERC_NIT AND N.apcl_id = D.apcl_id
        INTO :PREF, :NUM, :FECAUX, :NIT, :CONC, :TCTABASE, :TCTACLIEN, :ANULADO, :vrsubt, :numdoc, :tipodoc
        DO
        BEGIN
        if (ANULADO = 'N') then
          BEGIN
          SELECT PREF_CENTRO, PREF_PROY FROM PREFIJOS P, aplicacion_cliente N
            WHERE P.PREF_PRE = N.PREF_PRE AND P.TIDO_COD = 43 AND APCL_ID = :IDDOC INTO :CENTRO, :PROY;
          NUMERO = PREF || NUM;
          EXECUTE PROCEDURE FECHA_A_CONTA(:FECAUX) returning_values (:FECHA);
          VENCE = FECHA;
          /* REGISTRE EL ENCABEZADO CONTABLE */
          IDC = GEN_ID(ID_CONTABILIZA, 1);
          INSERT INTO CONTABILIZACION (CNTB_ID, CNTB_TIPOCOMP, CNTB_PREFCNT, CNTB_NUMERO, CNTB_FECHA, CNTB_CONCEPTO, CNTB_REF, CNTB_TIPOREF, CNTB_IDREF, CNTB_PREFREF, CNTB_NUMREF, CNTB_PROCESADO)
            VALUES (:IDC, :TIPOCOMP, :PREFCONT, :NUM, :FECHA, :CONC, '', 43, :IDDOC, :PREF, :NUM, 'N');
          NROI = 0;
          ERROR = 0;
          if (VRSUBT < 0) then
            BEGIN
            IF ((BASE = 'C') OR (BASE = 'K')) THEN
                BEGIN
                IF (BASE = 'C') THEN
                    CTABASE = TCTABASE;
                CUENTA = NULL;
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :CTABASE INTO :CUENTA, :TIPOCUEN;
                if (CUENTA IS NULL) then
                    begin
                    EXECUTE PROCEDURE ERROR (43, :IDDOC, :CTABASE, 2);
                    CUENTA = CTABASE;
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (43, :IDDOC, :CUENTA, 3);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', ABS(:VRSUBT), 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, :NUMDOC, :VENCE, NULL, :tipodoc, 43);
                    NROI = NROI + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', ABS(:VRSUBT), 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    END
                END
            END /* SUBT < 0 */
          if ((VRSUBT > 0) and ((CLIE = 'C') or (CLIE = 'K'))) then
            BEGIN
            if (CLIE = 'C') then
                CTACLIE = TCTACLIEN;
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTACLIE INTO :CUENTA, :TIPOCUEN;
            IF (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERROR (43, :IDDOC, :CTACLIE, 2);
                CUENTA = CTACLIE;
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERROR (43, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :vrsubt, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, :NUMDOC, :VENCE, NULL, :tipodoc, 42);
                NROI = NROI + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :vrsubt, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                END
            END /* CARTERA */
        END /* NO ANULADO */
      END /* FOR */
    if (ERROR > 0) then
        VER = 'S';
    SUSPEND;
    END
ELSE
    BEGIN
    EXECUTE PROCEDURE ERROR (43, :IDDOC, :PREF, 1);
    ERROR = ERROR + 1;
    VER = 'S';
    SUSPEND;
    END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER PROCEDURE CONTABIL_APLICAPR(
    IDDOC INTEGER,
    IDINTER INTEGER)
RETURNS (
    ERROR INTEGER,
    VER CHAR(1),
    IDC INTEGER)
AS
declare variable PREF VARCHAR(4);
declare variable NUM VARCHAR(6);
declare variable NUMERO VARCHAR(10);
declare variable NUMDOC VARCHAR(10);
declare variable FECAUX DATE;
declare variable FECHA CHAR(8);
declare variable CONC CHAR(120);
declare variable VRSUBT NUMERIC(18, 2);
declare variable TIPOCOMP VARCHAR(3);
declare variable PREFCONT VARCHAR(4);
declare variable BASE CHAR(1);
declare variable CTABASE VARCHAR(20);
declare variable CLIE CHAR(1);
declare variable CTACLIE VARCHAR(20);
declare variable EXISTE CHAR(1);
declare variable CUENTA VARCHAR(20);
declare variable TIPOCUEN CHAR(1);
declare variable NIT VARCHAR(20);
declare variable PROY VARCHAR(4);
declare variable CENTRO VARCHAR(4);
declare variable NROI INTEGER;
declare variable TCTACLIEN VARCHAR(20);
declare variable TCTABASE VARCHAR(20);
declare variable ANULADO CHAR(1);
declare variable TIPODOC INTEGER;
BEGIN
ERROR = 0;
/* BUSQUE LA INTERFACE */
EXISTE = 'N';
SELECT 'S', TICO_COD, PRCO_PRE, INCP_BASE, INCP_PROV, INCP_CTABASE, INCP_CTAPROV, INCP_CONFIRMAR
  FROM INTERFAZ_CXPAGAR
  WHERE INCP_ID = :IDINTER
  INTO :EXISTE, :TIPOCOMP, :PREFCONT, :BASE, :CLIE, :CTABASE, :CTACLIE, :VER;

if (EXISTE = 'S') then
  BEGIN
  /* BORRE CUALQUEIR CONTABILIZACION PREVIA */
  DELETE FROM CONTABILIZACION WHERE CNTB_TIPOREF = 53 AND CNTB_IDREF = :IDDOC;
  /* TRAIGA EL ENCABEZADO DE LA NOTA */
  FOR SELECT PREF_PRE, APPR_NUMERO, APPR_FECHA, N.TERC_NIT, APPR_CONC, TERC_CTAVENTA, TERC_CTACLIENTE,
      APPR_ANULADO, APPD_APLICADO+APPD_RTFTE+APPD_RTIVA+APPD_RTICA, APPD_PREFIJO || APPD_NUMERO, APPD_TIPODOC
    FROM aplicacion_provedor N, TERCEROS T, aplicacion_proveedor_detalle D
    WHERE N.APPR_ID = :IDDOC AND N.TERC_NIT = T.TERC_NIT AND N.appr_id = D.appr_id
    INTO :PREF, :NUM, :FECAUX, :NIT, :CONC, :TCTABASE, TCTACLIEN, ANULADO, :vrsubt, :numdoc, :tipodoc
    DO
    BEGIN
    if (ANULADO = 'N') then
        BEGIN
        SELECT PREF_CENTRO, PREF_PROY FROM PREFIJOS P, aplicacion_provedor N
            WHERE P.PREF_PRE = N.PREF_PRE AND P.TIDO_COD = 53 AND APPR_ID = :IDDOC INTO :CENTRO, :PROY;
        /* SI ES PROVEEDOR, SOBREESCIBE LAS CUENTAS  */
        SELECT PROV_CTAPAGAR, PROV_CTACAUSA
            FROM PROVEEDORES WHERE TERC_NIT = :NIT
            INTO TCTACLIEN, TCTABASE;
        
        NUMERO = PREF || NUM;

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

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

        IF ((VRSUBT < 0) AND ((BASE = 'T') OR (BASE = 'K'))) THEN
            BEGIN
            IF (BASE = 'T') THEN
                CTABASE = TCTABASE;
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTABASE INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERROR (53, :IDDOC, :CTABASE, 2);
                CUENTA = CTABASE;
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERROR (53, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', ABS(:VRSUBT), 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, :numdoc, :FECHA, NULL, :tipodoc, 43);
                NROI = NROI + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', ABS(:VRSUBT), 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                END
            END /* MONTO <> 0 */
        if ((VRSUBT > 0) and ((CLIE = 'T') or (CLIE = 'K'))) then
            BEGIN
            if (CLIE = 'T') then
                CTACLIE = TCTACLIEN;
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTACLIE INTO :CUENTA, :TIPOCUEN;
            IF (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERROR (53, :IDDOC, :CTACLIE, 2);
                CUENTA = CTACLIE;
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERROR (53, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :vrsubt, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, :numdoc, :FECHA, NULL, :tipodoc, 43);
            if (TIPOCUEN = 'N') then
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :vrsubt, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            END /* CARTERA */
        END
    END
  if (ERROR > 0) then
    VER = 'S';
  SUSPEND;
  END /* EXISTE LA INTERFAZ */
ELSE
    BEGIN
    EXECUTE PROCEDURE ERROR (53, :IDDOC, :PREF, 1);
    ERROR = ERROR + 1;
    VER = 'S';
    SUSPEND;
    END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER PROCEDURE CONTABIL_NOTACRPR(
    IDDOC INTEGER,
    IDINTER INTEGER)
RETURNS (
    ERROR INTEGER,
    VER CHAR(1),
    IDC INTEGER)
AS
declare variable PREF VARCHAR(4);
declare variable NUM VARCHAR(6);
declare variable NUMERO VARCHAR(10);
declare variable FECAUX DATE;
declare variable FECHA CHAR(8);
declare variable CONC CHAR(120);
declare variable VRSUBT NUMERIC(18, 2);
declare variable VRIVA NUMERIC(18, 2);
declare variable PRTFTE NUMERIC(9, 2);
declare variable VRRTFTE NUMERIC(18, 2);
declare variable VRRTIVA NUMERIC(18, 2);
declare variable PRTICA NUMERIC(9, 2);
declare variable VRRTICA NUMERIC(18, 2);
declare variable VRTOTAL NUMERIC(18, 2);
declare variable TIPOCOMP VARCHAR(3);
declare variable PREFCONT VARCHAR(4);
declare variable BASE CHAR(1);
declare variable CTABASE VARCHAR(20);
declare variable IVA CHAR(1);
declare variable CTAIVA VARCHAR(20);
declare variable CLIE CHAR(1);
declare variable CTACLIE VARCHAR(20);
declare variable RTFTE CHAR(1);
declare variable CTARTFTE VARCHAR(20);
declare variable RTIVA CHAR(1);
declare variable CTARTIVA VARCHAR(20);
declare variable RTICA CHAR(1);
declare variable CTARTICA VARCHAR(20);
declare variable EXISTE CHAR(1);
declare variable CUENTA VARCHAR(20);
declare variable MONTO NUMERIC(18,2);
declare variable ES_RETENCION CHAR(1);
declare variable TIPOCUEN CHAR(1);
declare variable NIT VARCHAR(20);
declare variable NOMBRE VARCHAR(60);
declare variable PROY VARCHAR(4);
declare variable CENTRO VARCHAR(4);
declare variable PORC NUMERIC(5,2);
declare variable DEBITO NUMERIC(18,2);
declare variable CREDITO NUMERIC(18,2);
declare variable NROI INTEGER;
declare variable SUMA NUMERIC(18,2);
declare variable TCTACLIEN VARCHAR(20);
declare variable TCTABASE VARCHAR(20);
declare variable TCTARTFTE VARCHAR(20);
declare variable TCTARTIVA VARCHAR(20);
declare variable TCTARTICA VARCHAR(20);
declare variable BASEADIC VARCHAR(20);
declare variable PORCADIC NUMERIC(5,2);
declare variable VALORADIC NUMERIC(18,2);
declare variable DBADIC CHAR(1);
declare variable CUENTAADIC VARCHAR(20);
declare variable ANULADO CHAR(1);
declare variable MONTOBASE NUMERIC(18,2);
BEGIN
ERROR = 0;
/* BUSQUE LA INTERFACE */
EXISTE = 'N';
SELECT 'S', TICO_COD, PRCO_PRE, INCP_BASE, INCP_IVA, INCP_RTFTE, INCP_RTIVA, INCP_RTICA, INCP_PROV, INCP_CTABASE, INCP_CTAIVA, INCP_CTARTFTE, INCP_CTARTIVA, INCP_CTARTICA, INCP_CTAPROV, INCP_CONFIRMAR
  FROM INTERFAZ_CXPAGAR
  WHERE INCP_ID = :IDINTER
  INTO :EXISTE, :TIPOCOMP, :PREFCONT, :BASE, :IVA, :RTFTE, :RTIVA, :RTICA, :CLIE, :CTABASE, :CTAIVA, :CTARTFTE, :CTARTIVA, :CTARTICA, :CTACLIE, :VER;

if (EXISTE = 'S') then
  BEGIN
  /* BORRE CUALQUEIR CONTABILIZACION PREVIA */
  DELETE FROM CONTABILIZACION WHERE CNTB_TIPOREF = 52 AND CNTB_IDREF = :IDDOC;
  /* TRAIGA EL ENCABEZADO DE LA NOTA */
  SELECT PREF_PRE, NCPR_NUMERO, NCPR_FECHA, N.TERC_NIT, NCPR_CONC, NCPR_IVAMONTO, NCPR_MONTO, NCPR_RTFTEPORC, NCPR_RTFTEMONTO, NCPR_RTIVAPORC, NCPR_RTIVAMONTO, NCPR_RTICAPORC, NCPR_RTICAMONTO, TERC_NOM, TERC_CTAVENTA, TERC_CTARTFTE, TERC_CTARTIVA, TERC_CTARTICA, TERC_CTACLIENTE, NCPR_ANULADO
    FROM NOTAS_CREDITO_PROVEEDOR N, TERCEROS T
    WHERE NCPR_ID = :IDDOC AND N.TERC_NIT = T.TERC_NIT
    INTO :PREF, :NUM, :FECAUX, :NIT, :CONC, :VRIVA, :VRTOTAL, :PRTFTE, :VRRTFTE, :PORC, :VRRTIVA, :PRTICA, :VRRTICA, :NOMBRE, TCTABASE, TCTARTFTE, TCTARTIVA, TCTARTICA, TCTACLIEN, ANULADO;
  if (ANULADO = 'N') then
    BEGIN
    SELECT PREF_CENTRO, PREF_PROY FROM PREFIJOS P, NOTAS_CREDITO_PROVEEDOR N
        WHERE P.PREF_PRE = N.PREF_PRE AND P.TIDO_COD = 52 AND NCPR_ID = :IDDOC INTO :CENTRO, :PROY;
    /* SI ES PROVEEDOR, SOBREESCIBE LAS CUENTAS  */
    SELECT PROV_CTAPAGAR, PROV_CTARTFTE, PROV_CTARTIVA, PROV_CTARTICA, PROV_CTACAUSA
        FROM PROVEEDORES WHERE TERC_NIT = :NIT
        INTO TCTACLIEN, TCTARTFTE, TCTARTIVA, TCTARTICA, TCTABASE;
        
    /* SI EL DOCUMENTO ESPECIFICA ALGUNAS SOBRESCRIBA LAS DEL PROVEEDOR */
    SELECT NCPR_CTAPAGAR, NCPR_CTACAUSA
        FROM NOTAS_CREDITO_PROVEEDOR N
        WHERE NCPR_ID = :IDDOC
        INTO :TCTACLIEN, TCTABASE;
    NUMERO = PREF || NUM;
    VRSUBT = VRTOTAL; /* BASE DE RETEFTE Y RETEICA */

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

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

    NROI = 0;
    SUMA = 0;

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

        if (VRSUBT <> 0) then
            BEGIN
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO, CUEN_RETENCION FROM CUENTAS
                WHERE CUEN_COD = :CTABASE INTO :CUENTA, :TIPOCUEN, :ES_RETENCION;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERROR (52, :IDDOC, :CTABASE, 2);
                CUENTA = CTABASE;
                ERROR = ERROR + 1;
                end
            if (ES_RETENCION = 'S') then
                if (PORC <> 0) then
                    montobase = FLOOR(VRSUBT / PORC * -1);
                else
                    montobase = VRSUBT * -1;
            else
                montobase = 0;
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERROR (52, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRSUBT, :MONTOBASE, :PORC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 52);
                NROI = NROI + 1;
                SUMA = SUMA - VRSUBT;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRSUBT, :MONTOBASE, :PORC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - VRSUBT;
                END
            END /* MONTO <> 0 */
        END /* BASE TERCERO O CONSTANTE */
        
    if (IVA = 'K') then /* IVA EN CTA CONSTANTE */
        BEGIN
        if (VRIVA <> 0) then
            BEGIN
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTAIVA INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERROR (52, :IDDOC, :CTAIVA, 2);
                CUENTA = CTAIVA;
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERROR (52, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', 0, :VRIVA, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 52);
                NROI = NROI + 1;
                SUMA = SUMA - VRIVA;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', 0, :VRIVA, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - VRIVA;
                END
            END /* VRIVA <> 0 */
        END /* IVA EN CTA CONSTANTE */
        
    /* RETENCION FUENTE */
    if ((RTFTE = 'T') or (RTFTE = 'K')) then
      if (VRRTFTE <> 0) then
        BEGIN
        if (RTFTE = 'T') then
            CTARTFTE = TCTARTFTE;
            
        CUENTA = NULL;
        SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
            WHERE CUEN_COD = :CTARTFTE INTO :CUENTA, :TIPOCUEN;
        if (CUENTA IS NULL) then
            begin
            EXECUTE PROCEDURE ERROR (52, :IDDOC, :CTARTFTE, 2);
            CUENTA = CTARTFTE;
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERROR (52, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :VRSUBT, :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 52);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTFTE;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :VRSUBT, :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTFTE;
            END
        END /* RTFTE */
        
    /* RETENCION IVA */
    if ((RTIVA = 'T') or (RTIVA = 'K')) then
      if (VRRTIVA <> 0) then
        BEGIN
        if (RTIVA = 'T') then
            CTARTIVA = TCTARTIVA;
            
        CUENTA = NULL;
        SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
            WHERE CUEN_COD = :CTARTIVA INTO :CUENTA, :TIPOCUEN;
        if (CUENTA IS NULL) then
            begin
            EXECUTE PROCEDURE ERROR (52, :IDDOC, :CTARTIVA, 2);
            CUENTA = CTARTIVA;
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERROR (52, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTIVA, 0, :VRIVA, :PORC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 52);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTIVA;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTIVA, 0, :VRIVA, :PORC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTIVA;
            END
        END /* RTIVA */
        
    /* RETENCION DE ICA */
    if ((RTICA = 'T') or (RTICA = 'K')) then
      if (VRRTICA <> 0) then
        BEGIN
        if (RTICA = 'T') then
            CTARTICA = TCTARTICA;
            
        CUENTA = NULL;
        SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
            WHERE CUEN_COD = :CTARTICA INTO :CUENTA, :TIPOCUEN;
        if (CUENTA IS NULL) then
            begin
            EXECUTE PROCEDURE ERROR (52, :IDDOC, :CTARTICA, 2);
            CUENTA = CTARTICA;
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERROR (52, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTICA, 0, :VRSUBT, :PRTICA, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 52);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTICA;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTICA, 0, :VRSUBT, :PRTICA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTICA;
            END
        END /* RTICA */
        
    /* recorra las cuentas adicionales */
    FOR SELECT INPC_CUENTA, INPC_BASE, INPC_PORC, INPC_VALOR, INPC_DB
        FROM INTERFAZ_CXPAGAR_CTAS
        WHERE INCP_ID = :IDINTER
        INTO :CUENTAADIC, :BASEADIC, :PORCADIC, :VALORADIC, :DBADIC
        DO
        BEGIN
        if (:BASEADIC = 'SUBTOTAL') then
            VALORADIC = VRTOTAL - VRIVA;
        if (:BASEADIC = 'IVA') then
            VALORADIC = VRIVA;
        if (:BASEADIC = 'TOTAL') then
            VALORADIC = VRTOTAL;
        MONTO = VALORADIC * PORCADIC;
        
        /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
        CUENTA = NULL;
        SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
            WHERE CUEN_COD = :CUENTAADIC INTO :CUENTA, :TIPOCUEN;
        IF (CUENTA IS NULL) THEN
            begin
            EXECUTE PROCEDURE ERROR (52, :IDDOC, :CUENTAADIC, 2);
            CUENTA = CUENTAADIC;
            ERROR = ERROR + 1;
            end
        /* DEPENDE DEL TIPO DE CUENTA */
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERROR (52, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            if (DBADIC = 'S') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTAADIC, :CONC, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 31);
                SUMA = SUMA + MONTO;
                END
            ELSE
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTAADIC, :CONC, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 31);
                SUMA = SUMA - MONTO;
                END
            NROI = NROI + 1;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            if (DBADIC = 'S') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTAADIC, :CONC, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                SUMA = SUMA + MONTO;
                END
            ELSE
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTAADIC, :CONC, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                SUMA = SUMA - MONTO;
                END
            NROI = NROI + 1;
            END
        
        NROI = NROI + 1;
        END
        
    /* CIERRE EL COMPROBANTE CONTRA LA CUENTA DEL TERCERO O LA CONSTANTE */
    if ((SUMA <> 0) and ((CLIE = 'T') or (CLIE = 'K'))) then
        BEGIN
        if (SUMA < 0) then
            BEGIN
            DEBITO = SUMA * -1;
            CREDITO = 0;
            END
        ELSE
            BEGIN
            DEBITO = 0;
            CREDITO = SUMA;
            END
        if (CLIE = 'T') then
            CTACLIE = TCTACLIEN;

        CUENTA = NULL;
        SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
            WHERE CUEN_COD = :CTACLIE INTO :CUENTA, :TIPOCUEN;
        IF (CUENTA IS NULL) then
            begin
            EXECUTE PROCEDURE ERROR (52, :IDDOC, :CTACLIE, 2);
            CUENTA = CTACLIE;
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERROR (52, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :DEBITO, :CREDITO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 52);
        if (TIPOCUEN = 'N') then
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :DEBITO, :CREDITO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
        NROI = NROI + 1;
        END /* SUMA EN CARTERA */
    if (ERROR > 0) then
        VER = 'S';
    SUSPEND;
    END /* NO ANULADO */
  END /* EXISTE LA INTERFAZ */
ELSE
    BEGIN
    EXECUTE PROCEDURE ERROR (52, :IDDOC, :PREF, 1);
    ERROR = ERROR + 1;
    VER = 'S';
    SUSPEND;
    END
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE NOTACRPR_SIN_CONTABILIDAD(
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    ID INTEGER,
    IDI INTEGER,
    IDC INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    ESTADO VARCHAR(20),
    ERROR INTEGER)
AS
DECLARE VARIABLE VER CHAR(2);
declare variable FECICNT VARCHAR(10);
declare variable FECFCNT VARCHAR(10);
declare variable idref INTEGER;
BEGIN /*$$IBE$$ 
EXECUTE PROCEDURE fecha_a_conta(FECINI) returning_values (FECICNT);
EXECUTE PROCEDURE fecha_a_conta(FECFIN) returning_values (FECFCNT);
FOR SELECT NCPR_ID, PREF_PRE, NCPR_NUMERO FROM NOTAS_CREDITO_PROVEEDOR WHERE NCPR_ANULADO = 'N' AND
    NCPR_FECHA >= :FECINI AND NCPR_FECHA <= :FECFIN
    ORDER BY NCPR_ID INTO :ID, :PREF, :NUMERO
DO
  BEGIN
  idref = null;
  SELECT ENCO_IDREF FROM COMPROBANTE_ENCABEZADO WHERE ENCO_TIPOREF = 52 AND ENCO_FECHA >= :FECICNT AND ENCO_FECHA <= :FECFCNT and ENCO_IDREF = :id into :idref;
  if (idref IS NULL) then
  begin
  ESTADO = 'PROCESANDO';
  SUSPEND;
  SELECT MAX(INCA_ID) FROM INTERFAZ_CARTERA WHERE PREF_PRE = :PREF AND TIDO_COD = 52 INTO :IDI;
  if (IDI IS NOT NULL) then
    BEGIN
    EXECUTE PROCEDURE CONTABIL_NOTACRPR (:ID, :IDI) RETURNING_VALUES (:ERROR, :VER, :IDC);
    if (ERROR = 0) then
      BEGIN
      EXECUTE PROCEDURE CONTABILIZA_PENDIENTE (:IDC);
      ESTADO = 'OK';
      END
    ELSE
      ESTADO = 'ERROR';
    suspend;
    END
  end
  END
 $$IBE$$*/ SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE NOTACRPR_SIN_CONTABILIDAD(
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    ID INTEGER,
    IDI INTEGER,
    IDC INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    ESTADO VARCHAR(20),
    ERROR INTEGER)
AS
DECLARE VARIABLE VER CHAR(2);
declare variable FECICNT VARCHAR(10);
declare variable FECFCNT VARCHAR(10);
declare variable idref INTEGER;
BEGIN
EXECUTE PROCEDURE fecha_a_conta(FECINI) returning_values (FECICNT);
EXECUTE PROCEDURE fecha_a_conta(FECFIN) returning_values (FECFCNT);
FOR SELECT NCPR_ID, PREF_PRE, NCPR_NUMERO FROM NOTAS_CREDITO_PROVEEDOR WHERE NCPR_ANULADO = 'N' AND
    NCPR_FECHA >= :FECINI AND NCPR_FECHA <= :FECFIN
    ORDER BY NCPR_ID INTO :ID, :PREF, :NUMERO
DO
  BEGIN
  idref = null;
  SELECT ENCO_IDREF FROM COMPROBANTE_ENCABEZADO WHERE ENCO_TIPOREF = 52 AND ENCO_FECHA >= :FECICNT AND ENCO_FECHA <= :FECFCNT and ENCO_IDREF = :id into :idref;
  if (idref IS NULL) then
  begin
  ESTADO = 'PROCESANDO';
  SUSPEND;
  SELECT MAX(INCA_ID) FROM INTERFAZ_CARTERA WHERE PREF_PRE = :PREF AND TIDO_COD = 52 INTO :IDI;
  if (IDI IS NOT NULL) then
    BEGIN
    EXECUTE PROCEDURE CONTABIL_NOTACRPR (:ID, :IDI) RETURNING_VALUES (:ERROR, :VER, :IDC);
    if (ERROR = 0) then
      BEGIN
      EXECUTE PROCEDURE CONTABILIZA_PENDIENTE (:IDC);
      ESTADO = 'OK';
      END
    ELSE
      ESTADO = 'ERROR';
    suspend;
    END
  end
  END
END

^

SET TERM ; ^


/* 20081125  SI LA CANTIDAD ES CERO PUEDE DAR UN REQUEST SYNCRONIZATION ERROR */
SET TERM ^ ;

CREATE OR ALTER PROCEDURE IMPR_FACTURA(
    ID INTEGER)
RETURNS (
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    VENCE DATE,
    DIASVENCE INTEGER,
    CONTCRED CHAR(17),
    NIT VARCHAR(20),
    NOMTERCERO VARCHAR(60),
    NOMCLIENTE VARCHAR(60),
    VENDEDOR INTEGER,
    NOMVENDEDOR VARCHAR(60),
    PUNTOVTA INTEGER,
    NOMPUNTOVTA VARCHAR(30),
    CODBODEGA VARCHAR(2),
    NOMBODEGA VARCHAR(30),
    AUTORIZACION VARCHAR(20),
    DESPACHO VARCHAR(255),
    TRANSPORTADOR VARCHAR(60),
    COTIZACION VARCHAR(30),
    PEDIDO VARCHAR(30),
    REMISION VARCHAR(30),
    PACIENTE VARCHAR(20),
    NOMPACIENTE VARCHAR(60),
    COMIPORC NUMERIC(9,2),
    COMIMONTO NUMERIC(18,2),
    SUBTOTAL NUMERIC(18,2),
    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),
    EXTRA NUMERIC(18,2),
    DTOFPORC NUMERIC(9,2),
    DTOFMONTO NUMERIC(18,2),
    FECHADTO DATE,
    TOTALFAC NUMERIC(18,2),
    TOTALPAGAR NUMERIC(18,2),
    OBS BLOB SUB_TYPE 1 SEGMENT SIZE 80,
    ITEM INTEGER,
    ARTICULO VARCHAR(15),
    CODBAR VARCHAR(15),
    ARTIDES VARCHAR(60),
    DESCORTA VARCHAR(30),
    CANT NUMERIC(18,4),
    LOTE VARCHAR(15),
    VLOTE DATE,
    UNIDAD VARCHAR(8),
    CAJAS NUMERIC(18,4),
    FACTOR INTEGER,
    LISTAPR INTEGER,
    REFITEM VARCHAR(60),
    BODITEM VARCHAR(2),
    PRUNIT NUMERIC(18,2),
    DTOITPORC NUMERIC(9,2),
    DTOITMONTO NUMERIC(18,2),
    PRNETO NUMERIC(18,2),
    IVAPORC NUMERIC(9,2),
    IVAITMONTO NUMERIC(18,2),
    CONSUMO NUMERIC(18,2),
    SUBTOTIT NUMERIC(18,2),
    SUBTOTITCON NUMERIC(18,2),
    DTOIT1 NUMERIC(9,2),
    DTOIT2 NUMERIC(9,2),
    DTOIT3 NUMERIC(9,2),
    TOTAL NUMERIC(18,2),
    CODIGOCL VARCHAR(20),
    ZONACOD VARCHAR(2),
    ZONANOM VARCHAR(60),
    DV CHAR(1),
    DIRECCION VARCHAR(60),
    CIUDAD VARCHAR(40),
    TELEFONO VARCHAR(40),
    CONTACTO VARCHAR(60),
    FAX VARCHAR(25),
    GRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    SUBGRUPO VARCHAR(3),
    NOMSUBG VARCHAR(30),
    MARCA VARCHAR(3),
    NOMMARCA VARCHAR(30),
    PESO NUMERIC(18,4),
    ANCHO NUMERIC(18,4),
    ALTO NUMERIC(18,4),
    LARGO NUMERIC(18,4),
    SUMA1 NUMERIC(18,2),
    SUMA2 NUMERIC(18,2),
    SUMA3 NUMERIC(18,2),
    IVA1 NUMERIC(18,2),
    IVA2 NUMERIC(18,2),
    IVA3 NUMERIC(18,2),
    SUMAEX NUMERIC(18,2),
    SUMAGR NUMERIC(18,2),
    TOTCONSUMO NUMERIC(18,2),
    DTOIT1M NUMERIC(18,2),
    DTOIT2M NUMERIC(18,2),
    DTOIT3M NUMERIC(18,2),
    TOTCAJAS NUMERIC(18,2),
    VEHICULO VARCHAR(8),
    RECIBIDO NUMERIC(18,2),
    CAMBIO NUMERIC(18,2),
    HORA TIME,
    FORMAPAGO1 VARCHAR(30),
    MONTOPAGO1 NUMERIC(18,2),
    FORMAPAGO2 VARCHAR(30),
    MONTOPAGO2 NUMERIC(18,2),
    FORMAPAGO3 VARCHAR(30),
    MONTOPAGO3 NUMERIC(18,2),
    PUNTOS INTEGER,
    PUNTOSACUM INTEGER,
    PUNTOSVENC INTEGER,
    FECPTOS DATE,
    OBSITEM BLOB SUB_TYPE 1 SEGMENT SIZE 80,
    SUCUR VARCHAR(10))
AS
DECLARE VARIABLE IMPTOS CHAR(1);
DECLARE VARIABLE TARIFA INTEGER;
declare variable DEVUELTO NUMERIC(18,2);
/*DECLARE VARIABLE NROCOPIA INTEGER;*/
declare variable ORDENCOD CHAR(2);
declare variable IMPRDEV CHAR(2);
declare variable IMPR CHAR(1);
declare variable ITEMFP INTEGER;
declare variable FORMAP VARCHAR(30);
declare variable MONTOP NUMERIC(18,2);
BEGIN
  SELECT F.PREF_PRE, FACT_NUMERO, FACT_FECHA, FACT_VENCE, F.BODE_COD, BODE_NOM, F.TERC_NIT, FACT_NOMCLIENTE, F.VEND_COD, VEND_NOMBRE, F.PTVT_ID, PTVT_NOM,
    AUTO_NUMERO, FACT_DESPACHO, FACT_TRANSP, FACT_COTIZACI, FACT_PEDIDO, FACT_REMISION, FACT_COMIPORC, FACT_COMIMONTO, FACT_IVAINC, 
    FACT_DTOPOR, FACT_DTOMONTO, FACT_ADICIONAL, FACT_IVAMONTO, FACT_RTFTEPOR, FACT_RTFTEMONTO, FACT_RTIVAPOR, FACT_RTIVAMONTO, FACT_RTICAPOR, FACT_RTICAMONTO, FACT_EXTRA, FACT_DTOFPOR, FACT_DTOFMONTO, FACT_DTOFFECHA, FACT_TOTAL,
    TERC_DIR, TERC_CIU, TERC_TEL, TERC_CONTACTO, TERC_FAX, TERC_DV, FACT_DTOIT1, FACT_DTOIT2, FACT_DTOIT3,
    FACT_OBS, VEHI_COD, /*FACT_NROCOPIA,*/ FACT_RECIBIDO, FACT_SUCURSAL, FACT_DETCLI, FACT_DETCLINOM, TERC_NOM
    FROM FACTURAS F, BODEGA B, VENDEDORES V, PUNTO_VENTA P, TERCEROS T
    WHERE F.BODE_COD = B.BODE_COD AND F.VEND_COD = V.VEND_COD AND F.PTVT_ID = P.PTVT_ID AND F.TERC_NIT = T.TERC_NIT AND F.FACT_ID = :ID
    into :PREF, :NUMERO, :FECHA, :VENCE, :CODBODEGA, :NOMBODEGA, :NIT, :NOMTERCERO, :VENDEDOR, :NOMVENDEDOR, :PUNTOVTA, :NOMPUNTOVTA,
    :AUTORIZACION, :DESPACHO, :TRANSPORTADOR, :COTIZACION, :PEDIDO, :REMISION, :COMIPORC, :COMIMONTO, :IMPTOS,
    :DTOPORC, :DTOMONTO, :ADICIONAL, :IVAMONTO, :RTEFTEPORC, :RTEFTEMONTO, :RTEIVAPORC, :RTEIVAMONTO, :RTEICAPORC, :RTEICAMONTO, :EXTRA, :DTOFPORC, :DTOFMONTO, :FECHADTO, :TOTALFAC,
    :DIRECCION, :CIUDAD, :TELEFONO, :CONTACTO, :FAX, :DV, :dtoit1m, :dtoit2m, :dtoit3m,
    :OBS, :VEHICULO,/* :NROCOPIA,*/ :RECIBIDO, :SUCUR, :paciente, :nompaciente, :nomcliente;

  /* ACUMULE LOS PUNTOS, SE HACE ACA POR SER POSTERIOR AL DETALLE */
  EXECUTE PROCEDURE acumula_puntos_cliente (31, :id, :nit, :fecha) returning_values (:PUNTOS);
  EXECUTE PROCEDURE consulta_puntos_cliente (:id, :nit, :fecha) returning_values (:puntos, :puntosacum, :puntosvenc, :fecptos);

  SELECT CLIE_COD, C.ZONA_COD, ZONA_NOM
    FROM CLIENTES C, ZONAS Z
    WHERE TERC_NIT = :NIT AND C.ZONA_COD = Z.ZONA_COD
    INTO :CODIGOCL, :ZONACOD, :ZONANOM;
  /*SELECT NOCO_NOMBRE FROM NOMBRES_COPIAS where NOCO_ID = :NROCOPIA INTO :NOMCOPIA;*/
  SELECT CLSU_DIR, CLSU_CIUDAD, CLSU_TEL FROM CLIENTE_SUCURSALES WHERE TERC_NIT = :NIT AND CLCU_COD = :SUCUR
    INTO :DIRECCION, :CIUDAD, :TELEFONO;
  /*if (NOMCOPIA IS NULL) then
    NOMCOPIA = 'COPIA No. ' || NROCOPIA;**/
  DIASVENCE = VENCE - FECHA;
  if (DIASVENCE > 0) then
    CONTCRED = 'CREDITO ' || CAST(DIASVENCE AS VARCHAR(3)) || ' DIAS';
  ELSE
    CONTCRED = 'CONTADO';
  SUBTOTAL = TOTALFAC - EXTRA - IVAMONTO - ADICIONAL + DTOMONTO;
  TOTALPAGAR = TOTALFAC - RTEFTEMONTO - RTEIVAMONTO - RTEICAMONTO;
  if (RECIBIDO <> 0) then
      CAMBIO = RECIBIDO - totalpagar;
  ELSE
    CAMBIO = 0;
  SUMAEX = 0;
  SUMA1 = 0;
  SUMA2 = 0;
  SUMA3 = 0;
  IVA1 = 0;
  IVA2 = 0;
  IVA3 = 0;
  TOTCONSUMO = 0;
  MONTOPAGO1 = 0;
  SELECT MAX(AUDI_HORA) FROM AUDITORIA WHERE TIDO_COD = 31 AND AUDI_IDDOC = :ID AND AUDI_OPER = 'I' INTO :HORA;
  /* AHORA LAS FORMAS DE PAGO, BUSQUE EL ABONO DE HOY A LA FACTURA */
  ITEMFP = 1;
  MONTOPAGO1 = 0;
  MONTOPAGO2 = 0;
  MONTOPAGO3 = 0;
  FOR SELECT FOPA_NOM, RCPA_MONTO FROM RECIBOS_CAJA_PAGO P, FORMAS_PAGO F, RECIBOS_CAJA R, RECIBOS_CAJA_DETALLE D
    WHERE R.RECA_ID = P.RECA_ID AND R.RECA_ID = D.RECA_ID AND P.FOPA_ID = F.FOPA_ID AND RECA_FECHA = :FECHA AND RCDE_TIPODOC = 31 AND RCDE_IDDOC = :ID
    INTO :formap, :MONTOP
    DO
    BEGIN
    if (ITEMFP = 1) then
        BEGIN
        FORMAPAGO1 = FORMAP;
        MONTOPAGO1 = MONTOP;
        END
    if (ITEMFP = 2) then
        BEGIN
        FORMAPAGO2 = FORMAP;
        MONTOPAGO2 = MONTOP;
        END
    if (ITEMFP = 3) then
        BEGIN
        FORMAPAGO3 = FORMAP;
        MONTOPAGO3 = MONTOP;
        END
    ITEMFP = ITEMFP + 1;
    END
  EXECUTE PROCEDURE lee_configuracion ('FACTURACION','DOCUMENTOS','ORDENAR ITEMS POR CODIGO DE ARTICULO') returning_values (:ORDENCOD);
  EXECUTE PROCEDURE lee_configuracion ('FACTURACION','POS', 'IMPRIMIR DEVOLUCIONES DE ARTICULOS NEGATIVOS') returning_values (:imprdev);
  totcajas = 0;
  if (ORDENCOD = 'SI') then
    BEGIN
    FOR SELECT FADE_ITEM, D.ARTI_COD, FADE_CODBAR, SUBSTR(FADE_DESC,1,60), ARTI_DESCORTA, FADE_CANT, FADE_UNIDAD, FADE_FACTOR, BODE_COD, FADE_LOTE, LIPR_COD, FADE_PRUNIT, FADE_DTOPORC, FADE_DTOMONTO, FADE_IVAPORC, FADE_IVAMONTO, FADE_CONSUMO, FADE_TOTAL, FADE_REFERENCIA,
        GRUP_COD, SUBG_COD, MARC_COD, ARTI_PESO, ARTI_ANCHO, ARTI_ALTO, ARTI_LARGO, TAIV_COD, FADE_DEVUELTO, FADE_OBS, FADE_DTO1, FADE_DTO2, FADE_DTO3, FADE_CAJAS
        FROM FACTURAS_DETALLE D, ARTICULO A
        WHERE D.ARTI_COD = A.ARTI_COD AND D.FACT_ID = :ID
        ORDER BY D.ARTI_COD
        INTO :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :DESCORTA, :CANT, :UNIDAD, :FACTOR, :BODITEM, :LOTE, :LISTAPR, :PRUNIT, :DTOITPORC, :DTOITMONTO, :IVAPORC, :IVAITMONTO, :CONSUMO, :TOTAL, :refitem,
        :GRUPO, :SUBGRUPO, :MARCA, :PESO, :ANCHO, :ALTO, :LARGO, :TARIFA, :devuelto, :obsitem, :dtoit1, :dtoit2, :dtoit3, :cajas
        DO
          BEGIN
          if (ARTICULO = CODBAR) then
            SELECT FIRST 1 COBA_COD FROM barras_articulo WHERE ARTI_COD = :articulo INTO :CODBAR;
          if (IMPRDEV <> 'SI') then
            BEGIN
            if ((CANT >= 0) AND (DEVUELTO = 0)) then
                IMPR = 'S';
            ELSE
                IMPR = 'N'; /* ES DEVOLUCION */
            END
          ELSE
            IMPR = 'S';
          if (IMPR = 'S') then
            BEGIN
            if (IMPTOS = 'S') then
                if (cant <> 0) then
                    PRNETO = PRUNIT - DTOITMONTO - ((IVAITMONTO+CONSUMO) / CANT);
                else
                    PRNETO = PRUNIT - DTOITMONTO;
            ELSE
                PRNETO = PRUNIT - DTOITMONTO;
            SUBTOTIT = TOTAL - IVAITMONTO - CONSUMO;
            SUBTOTITCON = TOTAL;
            TOTCONSUMO = TOTCONSUMO + CONSUMO;
            SELECT LOTE_VENCE FROM LOTES WHERE LOTE_NRO = :lote AND ARTI_COD = :ARTICULO AND BODE_COD = :boditem INTO :vlote;
            if (TARIFA = 0) then
                SUMAEX = SUMAEX + TOTAL;
            if (TARIFA = 1) then
                BEGIN
                SUMA1 = SUMA1 + TOTAL - IVAITMONTO;
                IVA1 = IVA1 + IVAITMONTO;
                END
            if (TARIFA = 2) then
                BEGIN
                SUMA2 = SUMA2 + TOTAL - IVAITMONTO;
                IVA2 = IVA2 + IVAITMONTO;
                END
            if (TARIFA = 3) then
                BEGIN
                SUMA3 = SUMA3 + TOTAL - IVAITMONTO;
                IVA3 = IVA3 + IVAITMONTO;
                END
            SUMAGR = SUMA1 + SUMA2 + SUMA3;
            if (IMPTOS = 'N') then
                TOTAL = TOTAL - IVAITMONTO - CONSUMO;
            if (ANCHO IS NULL) then
                ANCHO = 0;
            if (ALTO IS NULL) then
                ALTO = 0;
            if (LARGO IS NULL) then
                LARGO = 0;
            if (PESO IS NULL) then
                PESO = 0;
            PESO = PESO * CANT;
            totcajas = totcajas + cajas;
            SUSPEND;
            END
          END
    END
ELSE
    BEGIN
    FOR SELECT FADE_ITEM, D.ARTI_COD, FADE_CODBAR, SUBSTR(FADE_DESC,1,60), ARTI_DESCORTA, FADE_CANT, FADE_UNIDAD, FADE_FACTOR, BODE_COD, FADE_LOTE, LIPR_COD, FADE_PRUNIT, FADE_DTOPORC, FADE_DTOMONTO, FADE_IVAPORC, FADE_IVAMONTO, FADE_CONSUMO, FADE_TOTAL, FADE_REFERENCIA,
        GRUP_COD, SUBG_COD, MARC_COD, ARTI_PESO, ARTI_ANCHO, ARTI_ALTO, ARTI_LARGO, TAIV_COD, FADE_DEVUELTO, FADE_OBS, FADE_DTO1, FADE_DTO2, FADE_DTO3, FADE_CAJAS
        FROM FACTURAS_DETALLE D, ARTICULO A
        WHERE D.ARTI_COD = A.ARTI_COD AND D.FACT_ID = :ID
        ORDER BY FADE_ITEM
        INTO :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :DESCORTA, :CANT, :UNIDAD, :FACTOR, :BODITEM, :LOTE, :LISTAPR, :PRUNIT, :DTOITPORC, :DTOITMONTO, :IVAPORC, :IVAITMONTO, :CONSUMO, :TOTAL, :refitem,
        :GRUPO, :SUBGRUPO, :MARCA, :PESO, :ANCHO, :ALTO, :LARGO, :TARIFA, :devuelto, :obsitem, :dtoit1, :dtoit2, :dtoit3, :cajas
        DO
          BEGIN
          if (IMPRDEV <> 'SI') then
            BEGIN
            if ((CANT >= 0) AND (DEVUELTO = 0)) then
                IMPR = 'S';
            ELSE
                IMPR = 'N'; /* ES DEVOLUCION */
            END
          ELSE
            IMPR = 'S';
          if (IMPR = 'S') then
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :GRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :MARCA INTO NOMMARCA;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :SUBGRUPO AND GRUP_COD = :GRUPO INTO :NOMSUBG;
            if (IMPTOS = 'S') then
              if (CANT <> 0) then
                  PRNETO = PRUNIT - DTOITMONTO - ((IVAITMONTO+CONSUMO) / CANT);
            ELSE
              PRNETO = PRUNIT - DTOITMONTO;
            SUBTOTIT = TOTAL - IVAITMONTO - CONSUMO;
            SUBTOTITCON = TOTAL;
            TOTCONSUMO = TOTCONSUMO + CONSUMO;
            SELECT LOTE_VENCE FROM LOTES WHERE LOTE_NRO = :lote AND ARTI_COD = :ARTICULO AND BODE_COD = :boditem INTO :vlote;
            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;
            if (ANCHO IS NULL) then
                ANCHO = 0;
            if (ALTO IS NULL) then
                ALTO = 0;
            if (LARGO IS NULL) then
                LARGO = 0;
            if (PESO IS NULL) then
                PESO = 0;
            PESO = PESO * CANT;
            totcajas = totcajas + cajas;
            SUSPEND;
            END
          END
    END
END
^

SET TERM ; ^


/* 20081126  error al hacer ajustes con unidades alternativas */
SET TERM ^ ;

CREATE OR ALTER TRIGGER AJUSTES_DETALLE_AI FOR AJUSTES_DETALLE
ACTIVE AFTER INSERT POSITION 0
AS
declare variable fec date;
declare variable CONC VARCHAR(60);
declare variable Pref varchar(4);
declare variable Num varchar(6);
declare variable CANTAJ numeric(18,4);
declare variable COSTO NUMERIC(18,2);
declare variable factor numeric(18,4);
BEGIN
  if ((NEW.AJUS_ID <> 0) and (new.ajde_anulado = 'N')) then
    BEGIN
    execute procedure factor_unidad_cant(new.arti_cod, new.ajus_unidad) returning_values(factor);
    CANTAJ = NEW.ajus_exant - (NEW.ajus_exnue * :factor);
    /* CUANDO CAMBIA LA EXISTENCIA REGISTRE EL MOV. */
    select AJUS_fecha, AJUS_conc, AJUS_NUMERO, PREF_PRE from AJUSTES where AJUS_id = new.AJUS_id into :fec, :conc, :Num, :Pref;
    if (CANTAJ > 0) then
      BEGIN
      /* ES UNA SALIDA */
      INSERT INTO MOVIMIENTO_ARTICULO
        (ARTI_COD, MVAR_CONS, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM)
        VALUES(NEW.ARTI_COD, GEN_ID(ID_MOVARTI,1), NEW.BODE_COD, :FEC, 14, NEW.AJUS_id,
        :CONC, :cantaj, 0, 'N', NEW.ajus_lote, :Pref, :Num, NEW.ajus_item);
      END
    ELSE
      BEGIN
      /* ES UNA ENTRADA */
      EXECUTE PROCEDURE costo_promedio(NEW.arti_cod, :FEC) returning_values (:COSTO);
      INSERT INTO MOVIMIENTO_ARTICULO
        (ARTI_COD, MVAR_CONS, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM)
        VALUES(NEW.ARTI_COD, GEN_ID(ID_MOVARTI,1), NEW.BODE_COD, :FEC, 14, NEW.AJUS_id,
        :CONC, abs(:cantaj), :COSTO, 'S', NEW.ajus_lote, :Pref, :Num, NEW.ajus_item);
      END
    END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER AJUSTES_DETALLE_AU FOR AJUSTES_DETALLE
ACTIVE AFTER UPDATE POSITION 0
as
declare variable fec date;
declare variable CONC VARCHAR(60);
declare variable cantaj numeric(18,4);
declare variable Pref varchar(4);
declare variable Num varchar(6);
declare variable COSTO NUMERIC(18,2);
declare variable factor numeric(18,4);
BEGIN
if ((old.ajus_id <> 0) and (old.ajde_anulado = 'N')) then
    DELETE FROM MOVIMIENTO_ARTICULO WHERE (mvar_tipodoc = 14) and (mvar_idref = new.ajus_id) and (mvar_item = new.ajus_item);
if ((NEW.AJUS_id <> 0) and (NEW.ajde_anulado = 'N')) then
    begin
    execute procedure factor_unidad_cant(new.arti_cod, new.ajus_unidad) returning_values(factor);
    CANTAJ = NEW.ajus_exant - (NEW.ajus_exnue * :factor);
    /* CUANDO CAMBIA LA EXISTENCIA REGISTRE EL MOV. */
    select AJUS_fecha, AJUS_conc, AJUS_NUMERO, PREF_PRE from AJUSTES where AJUS_id = new.AJUS_id into :fec, :conc, :Num, :Pref;
    if (CANTAJ > 0) then
        BEGIN
        /* ES UNA SALIDA */
        INSERT INTO MOVIMIENTO_ARTICULO
            (ARTI_COD, MVAR_CONS, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM)
            VALUES(NEW.ARTI_COD, GEN_ID(ID_MOVARTI,1), NEW.BODE_COD, :FEC, 14, NEW.AJUS_id,
            :CONC, :cantaj, 0, 'N', NEW.ajus_lote, :Pref, :Num, new.ajus_item);
        END
    ELSE
        BEGIN
        /* ES UNA ENTRADA */
        EXECUTE PROCEDURE costo_promedio(NEW.arti_cod, :FEC) returning_values (:COSTO);
        INSERT INTO MOVIMIENTO_ARTICULO
            (ARTI_COD, MVAR_CONS, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM)
            VALUES(NEW.ARTI_COD, GEN_ID(ID_MOVARTI,1), NEW.BODE_COD, :FEC, 14, NEW.AJUS_id,
            :CONC, abs(:cantaj), :costo, 'S', NEW.ajus_lote, :Pref, :Num, new.ajus_item);
        END
    END
END
^

SET TERM ; ^


/* 20081127  REDONDEE EL PRECIO AUTOMATICO AL GRABAR */
SET TERM ^ ;

CREATE OR ALTER TRIGGER PRECIOS_ARTICULO_BI FOR PRECIOS_ARTICULO
ACTIVE BEFORE INSERT POSITION 1
AS
declare variable UNIDAD VARCHAR(8);
declare variable UOR VARCHAR(20);
declare variable COSTOP NUMERIC(18, 2);
declare variable COSTOU NUMERIC(18, 2);
declare variable COSTO NUMERIC(18, 2);
declare variable DIG INTEGER;
declare variable IVAINC CHAR(1);
declare variable IVAINC1 CHAR(1);
declare variable TARIVA NUMERIC(9,2);
declare variable BASE varchar(10);
declare variable CAMBIO CHAR(7);
declare variable LISTA INTEGER;
declare variable PRECIO NUMERIC(18, 4);
BEGIN
if (NEW.prar_util IS NULL) then
    NEW.prar_util = 0;
if (NEW.prar_margen IS NULL) then
    NEW.prar_margen = 0;
if (NEW.prar_cantmin IS NULL) then
    NEW.prar_cantmin = 0.01;
if (NEW.prar_auto = 'S') then
    BEGIN
    SELECT LIPR_MODIF FROM LISTA_PRECIOS L
        WHERE LIPR_COD = NEW.LIPR_COD INTO :IVAINC;
    
    SELECT ARTI_UNIDAD, TAIV_PORC FROM ARTICULO A, TARIFA_IVA T
        WHERE ARTI_COD = NEW.ARTI_COD AND A.taiv_cod = T.taiv_cod INTO :UNIDAD, :TARIVA;
    EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION', 'ARTICULOS', 'SUGERIR PRECIOS CON PORCENTAJE DE MARGEN O UTILIDAD') RETURNING_VALUES (:UOR);
    EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION', 'ARTICULOS', 'REDONDEO AL MULTIPLO DE DIEZ EN PRECIOS') RETURNING_VALUES (:DIG);
    EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION','ARTICULOS','CAMBIO DE PRECIOS AUTOMATICO AL CAMBIAR COSTO O PRECIO') returning_values (CAMBIO);
    if (CAMBIO <> 'PRECIO') then
        BEGIN
        EXECUTE PROCEDURE lee_configuracion('FACTURACION','ARTICULOS','COSTO BASE PARA CALCULO DE PRECIOS DE VENTA AUTOMATICOS') returning_values (:BASE);
        EXECUTE PROCEDURE COSTO_PROMEDIO (NEW.ARTI_COD, 'NOW') RETURNING_VALUES(:COSTOP);
        EXECUTE PROCEDURE ULTIMO_COSTO (NEW.ARTI_COD, 'NOW', :UNIDAD) RETURNING_VALUES(:COSTOU);
        if (base = 'ULTIMO') then
            BEGIN
            COSTO = COSTOU;
            END
        ELSE
            BEGIN
            COSTO = COSTOP;
            if (base = 'MAYOR') then
                if (COSTOP < COSTOU) then
                    COSTO = COSTOU;
            END
        if (IVAINC = 'S') then
            COSTO = COSTO * (1 + TARIVA/100);
        if (UOR = 'UTILIDAD') then
            NEW.PRAR_FIJO = (:COSTO * (1 + NEW.prar_util/100));
        ELSE
            NEW.PRAR_FIJO = (:COSTO / (1 - NEW.prar_margen/100));
        EXECUTE PROCEDURE REDONDEE (NEW.prar_fijo, DIG) returning_values (NEW.prar_fijo);
        END
    ELSE
        BEGIN
        /* PRECIO */
        EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION','ARTICULOS','CODIGO DE LA LISTA DE PRECIOS BASE PARA CAMBIO DE PRECIOS AUTOMATICO') returning_values (LISTA);
        if (NEW.lipr_cod <> :LISTA) then
            BEGIN
            SELECT PRAR_FIJO FROM PRECIOS_ARTICULO WHERE LIPR_COD = :LISTA AND ARTI_COD = NEW.arti_cod INTO :PRECIO;
            SELECT LIPR_MODIF FROM LISTA_PRECIOS L
                WHERE LIPR_COD = :lista INTO :IVAINC1;
            if (ivainc = 'S') then
                if (IVAINC1 = 'S') then
                    NEW.prar_fijo = precio;
                else
                    NEW.prar_fijo = precio * (1 + TARIVA/100);
            ELSE
                if (IVAINC1 = 'S') then
                    NEW.prar_fijo = precio / (1 + TARIVA/100);
                else
                    NEW.prar_fijo = precio;
            if (UOR = 'UTILIDAD') then
                NEW.prar_fijo = NEW.prar_fijo * (1 + NEW.prar_util/100);
            ELSE
                NEW.prar_fijo = NEW.prar_fijo / (1 - NEW.prar_margen/100);
            EXECUTE PROCEDURE REDONDEE (NEW.prar_fijo, DIG) returning_values (NEW.prar_fijo);
            END
        END
    END
END
^

SET TERM ; ^


/* PARA OBLIGAR A QUE SE REDONDEEN LOS PRECIOS YA GRABADOS */
UPDATE PRECIOS_ARTICULO SET PRAR_COMIMONTO = PRAR_COMIMONTO * 1 WHERE PRAR_AUTO = 'S';
COMMIT WORK;


/* 20081127B  SI TRM ES CERO DEBE SER 1 */
SET TERM ^ ;

CREATE OR ALTER TRIGGER ANTICIPOS_CLIENTE_BI FOR ANTICIPOS_CLIENTE
ACTIVE BEFORE INSERT POSITION 0
AS
declare variable NUMERO VARCHAR(6);
declare variable AUTOM CHAR(1);
declare variable EXISTE CHAR(1);
declare variable PREGTASA CHAR(2);
BEGIN
/* Complete con ceros los campos nulos */
if (NEW.ancl_base IS NULL) then
    NEW.ancl_base = 0;
if (NEW.ancl_rtfteporc IS NULL) then
    NEW.ancl_rtivaporc = 0;
if (NEW.ancl_rtivaporc IS NULL) then
    NEW.ancl_rtivaporc = 0;
if (NEW.ancl_rticaporc IS NULL) then
    NEW.ancl_rticaporc = 0;
if (NEW.ancl_rtftemonto IS NULL) then
    NEW.ancl_rtftemonto = 0;
if (NEW.ancl_rtivamonto IS NULL) then
    NEW.ancl_rtivamonto = 0;
if (NEW.ancl_rticamonto IS NULL) then
    NEW.ancl_rticamonto = 0;
if (NEW.ancl_dtofporc IS NULL) then
    NEW.ancl_dtofporc = 0;
if (NEW.ancl_dtofmonto IS NULL) then
    NEW.ancl_dtofmonto = 0;
if ((NEW.ancl_trm IS NULL) or (NEW.ancl_trm = 0)) then
    NEW.ancl_trm = 1;
EXECUTE PROCEDURE LEE_CONFIGURACION('GENERAL', 'GENERAL', 'PREGUNTAR TASA DE CAMBIO EN DOCUMENTOS DE CARTERA') returning_values (:pregtasa);
if (PREGTASA = 'SI') then
    BEGIN
    NEW.ancl_base = NEW.ancl_base * NEW.ancl_trm;
    NEW.ancl_ivamonto = NEW.ancl_ivamonto * NEW.ancl_trm;
    NEW.ancl_rtftemonto = NEW.ancl_rtftemonto * NEW.ancl_trm;
    NEW.ancl_rtivamonto = NEW.ancl_rtivamonto * NEW.ancl_trm;
    NEW.ancl_rticamonto = NEW.ancl_rticamonto * NEW.ancl_trm;
    NEW.ancl_dtofmonto = NEW.ancl_dtofmonto * NEW.ancl_trm;
    END
if (NEW.numok = 'N') then
  BEGIN
  /* Actualice el contador del prefijo */
  SELECT PREF_ACTUAL, PREF_AUTO FROM PREFIJOS
    WHERE TIDO_COD = NEW.TIDO_COD AND PREF_PRE = NEW.PREF_PRE INTO :NUMERO, :AUTOM;
  /* ACTUALICE EL NUMERO EN COMPROBANTE_ENCABEZADO  */
  if (AUTOM = 'S') then
    BEGIN
    NEW.ANCL_NUMERO = NUMERO;
    NUMERO = CAST((CAST(NUMERO AS INTEGER) + 1) AS CHAR(6));
    UPDATE PREFIJOS
      SET PREF_ACTUAL = :NUMERO
    WHERE TIDO_COD = NEW.TIDO_COD AND PREF_PRE = NEW.PREF_PRE;
    END
  ELSE
    BEGIN
    if (CAST(NUMERO AS INTEGER) = CAST(NEW.ANCL_NUMERO AS INTEGER)) then
        UPDATE PREFIJOS
          SET PREF_ACTUAL = CAST((CAST(PREF_ACTUAL AS INTEGER) + 1) AS CHAR(6))
        WHERE TIDO_COD = NEW.TIDO_COD AND PREF_PRE = NEW.PREF_PRE;
    END
  execute PROCEDURE COMPLETA_CEROS(NEW.ANCL_numero) returning_values (NEW.ANCL_numero);
  NEW.numok = 'S';
  END
/* Verifique que el numero no existe previamente */
EXISTE = 'N';
SELECT 'S' FROM ANTICIPOS_CLIENTE WHERE PREF_PRE = NEW.PREF_PRE AND ANCL_NUMERO = NEW.ANCL_NUMERO INTO :EXISTE;
if (EXISTE = 'S') then
    EXCEPTION DOCUMENTO_REGISTRADO;
END
^

SET TERM ; ^


SET TERM ^ ;

CREATE OR ALTER TRIGGER ANTICIPOS_PROVEEDOR_BI FOR ANTICIPOS_PROVEEDOR
ACTIVE BEFORE INSERT POSITION 0
AS
declare variable NUMERO VARCHAR(6);
declare variable AUTOM CHAR(1);
declare variable EXISTE CHAR(1);
declare variable pregtasa CHAR(2);
BEGIN
if (NEW.numok = 'N') then
  BEGIN
  /* Actualice el contador del prefijo */
  SELECT PREF_ACTUAL, PREF_AUTO FROM PREFIJOS WHERE TIDO_COD = NEW.TIDO_COD AND PREF_PRE = NEW.PREF_PRE INTO :NUMERO, :AUTOM;
  /* ACTUALICE EL NUMERO EN COMPROBANTE_ENCABEZADO  */
  if (AUTOM = 'S') then
    BEGIN
    NEW.ANPR_NUMERO = NUMERO;
    NUMERO = CAST((CAST(NUMERO AS INTEGER) + 1) AS CHAR(6));
    UPDATE PREFIJOS
      SET PREF_ACTUAL = :NUMERO
    WHERE TIDO_COD = NEW.TIDO_COD AND PREF_PRE = NEW.PREF_PRE;
    END
  ELSE
    BEGIN
    if (CAST(NUMERO AS INTEGER) = CAST(NEW.ANPR_NUMERO AS INTEGER)) then
        UPDATE PREFIJOS
          SET PREF_ACTUAL = CAST((CAST(PREF_ACTUAL AS INTEGER) + 1) AS CHAR(6))
        WHERE TIDO_COD = NEW.TIDO_COD AND PREF_PRE = NEW.PREF_PRE;
    END
  EXECUTE PROCEDURE completa_ceros(NEW.ANPR_numero) returning_values (NEW.ANPR_numero);
  NEW.numok = 'S';
  END
/* Verifique que el numero no existe previamente */
EXISTE = 'N';
SELECT 'S' FROM ANTICIPOS_PROVEEDOR WHERE PREF_PRE = NEW.PREF_PRE AND ANPR_NUMERO = NEW.ANPR_NUMERO INTO :EXISTE;
if (EXISTE = 'S') then
    EXCEPTION DOCUMENTO_REGISTRADO;
/* Complete con ceros los campos nulos */
if (NEW.ANPR_BASE IS NULL) then
    NEW.ANPR_BASE = 0;
if (NEW.ANPR_RTFTEPORC IS NULL) then
    NEW.ANPR_RTFTEPORC = 0;
if (NEW.ANPR_RTIVAPORC IS NULL) then
    NEW.ANPR_RTIVAPORC = 0;
if (NEW.ANPR_RTICAPORC IS NULL) then
    NEW.ANPR_RTICAPORC = 0;
if (NEW.ANPR_RTFTEMONTO IS NULL) then
    NEW.ANPR_RTFTEMONTO = 0;
if (NEW.ANPR_RTIVAMONTO IS NULL) then
    NEW.ANPR_RTIVAMONTO = 0;
if (NEW.ANPR_RTICAMONTO IS NULL) then
    NEW.ANPR_RTICAMONTO = 0;
if (NEW.ANPR_DTOFPORC IS NULL) then
    NEW.ANPR_DTOFPORC = 0;
if (NEW.ANPR_DTOFMONTO IS NULL) then
    NEW.ANPR_DTOFMONTO = 0;
if ((NEW.anpr_trm IS NULL) or (NEW.anpr_trm = 0)) then
    NEW.anpr_trm = 1;
EXECUTE PROCEDURE LEE_CONFIGURACION('GENERAL', 'GENERAL', 'PREGUNTAR TASA DE CAMBIO EN DOCUMENTOS DE CUENTAS POR PAGAR') returning_values (:pregtasa);
if (PREGTASA = 'SI') then
    BEGIN
    NEW.anpr_base = NEW.anpr_base * NEW.anpr_trm;
    NEW.anpr_ivamonto = NEW.anpr_ivamonto * NEW.anpr_trm;
    NEW.anpr_rtftemonto = NEW.anpr_rtftemonto * NEW.anpr_trm;
    NEW.anpr_rtivamonto = NEW.anpr_rtivamonto * NEW.anpr_trm;
    NEW.anpr_rticamonto = NEW.anpr_rticamonto * NEW.anpr_trm;
    NEW.anpr_dtofmonto = NEW.anpr_dtofmonto * NEW.anpr_trm;
    END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER APLICACION_CLIENTE_BI FOR APLICACION_CLIENTE
ACTIVE BEFORE INSERT POSITION 0
AS
declare variable NUMERO VARCHAR(6);
declare variable AUTOM CHAR(1);
declare variable EXISTE CHAR(1);
BEGIN
if (NEW.numok = 'N') then
  BEGIN
  /* Actualice el contador del prefijo */
  SELECT PREF_ACTUAL, PREF_AUTO FROM PREFIJOS WHERE TIDO_COD = NEW.TIDO_COD AND PREF_PRE = NEW.PREF_PRE INTO :NUMERO, :AUTOM;
  /* ACTUALICE EL NUMERO EN COMPROBANTE_ENCABEZADO  */
  if (AUTOM = 'S') then
    BEGIN
    NEW.APCL_NUMERO = NUMERO;
    NUMERO = CAST((CAST(NUMERO AS INTEGER) + 1) AS CHAR(6));
    UPDATE PREFIJOS
      SET PREF_ACTUAL = :NUMERO
    WHERE TIDO_COD = NEW.TIDO_COD AND PREF_PRE = NEW.PREF_PRE;
    END
  ELSE
    BEGIN
    if (CAST(NUMERO AS INTEGER) = CAST(NEW.APCL_NUMERO AS INTEGER)) then
        UPDATE PREFIJOS
          SET PREF_ACTUAL = CAST((CAST(PREF_ACTUAL AS INTEGER) + 1) AS CHAR(6))
        WHERE TIDO_COD = NEW.TIDO_COD AND PREF_PRE = NEW.PREF_PRE;
    END
  EXECUTE PROCEDURE completa_ceros (NEW.APCL_numero) returning_values (New.apcl_numero);
  NEW.numok = 'S';
  END
/* Verifique que el numero no existe previamente */
EXISTE = 'N';
SELECT 'S' FROM APLICACION_CLIENTE WHERE PREF_PRE = NEW.PREF_PRE AND APCL_NUMERO = NEW.APCL_NUMERO INTO :EXISTE;
if (EXISTE = 'S') then
    EXCEPTION DOCUMENTO_REGISTRADO;

if ((NEW.apcl_trm IS NULL) or (new.apcl_trm = 0))  then
    NEW.apcl_trm = 1;
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER APLICACION_PROVEDOR_BI FOR APLICACION_PROVEDOR
ACTIVE BEFORE INSERT POSITION 0
AS
declare variable NUMERO VARCHAR(6);
declare variable AUTOM CHAR(1);
declare variable EXISTE CHAR(1);
BEGIN
if (NEW.numok = 'N') then
  BEGIN
  /* Actualice el contador del prefijo */
  SELECT PREF_ACTUAL, PREF_AUTO FROM PREFIJOS WHERE TIDO_COD = NEW.TIDO_COD AND PREF_PRE = NEW.PREF_PRE INTO :NUMERO, :AUTOM;
  /* ACTUALICE EL NUMERO EN COMPROBANTE_ENCABEZADO  */
  if (AUTOM = 'S') then
    BEGIN
    NEW.APPR_NUMERO = NUMERO;
    NUMERO = CAST((CAST(NUMERO AS INTEGER) + 1) AS CHAR(6));
    UPDATE PREFIJOS
      SET PREF_ACTUAL = :NUMERO
    WHERE TIDO_COD = NEW.TIDO_COD AND PREF_PRE = NEW.PREF_PRE;
    END
  ELSE
    BEGIN
    if (CAST(NUMERO AS INTEGER) = CAST(NEW.APPR_NUMERO AS INTEGER)) then
        UPDATE PREFIJOS
          SET PREF_ACTUAL = CAST((CAST(PREF_ACTUAL AS INTEGER) + 1) AS CHAR(6))
        WHERE TIDO_COD = NEW.TIDO_COD AND PREF_PRE = NEW.PREF_PRE;
    END
  EXECUTE PROCEDURE completa_ceros (NEW.APPR_numero) returning_values (NEW.APPR_numero);
  NEW.numok = 'S';
  END
/* Verifique que el numero no existe previamente */
EXISTE = 'N';
SELECT 'S' FROM APLICACION_PROVEDOR WHERE PREF_PRE = NEW.PREF_PRE AND APPR_NUMERO = NEW.APPR_NUMERO INTO :EXISTE;
if (EXISTE = 'S') then
    EXCEPTION DOCUMENTO_REGISTRADO;
if ((NEW.appr_trm IS NULL) or (new.appr_trm = 0))  then
    NEW.appr_trm = 1;
END
^

SET TERM ; ^


/* 20081127C  tenia dos suspend por tanto repetia el ultimo registro */

SET TERM ^ ;

CREATE OR ALTER PROCEDURE BUSCAR_DEVOLCHEQ(
    CUENTA INTEGER)
RETURNS (
    ID INTEGER,
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    NOMTERC VARCHAR(60),
    MONTO NUMERIC(18,2),
    CODCTA VARCHAR(30),
    CHNUMERO VARCHAR(20),
    CHCUENTA VARCHAR(20),
    CHBANCO VARCHAR(2),
    ANULAR CHAR(1),
    SALDO NUMERIC(18,2))
AS
begin
for select dvch_id, prba_pref, dvch_numdoc, dvch_fecha, dvch_nomterc, dvch_monto, cuba_codcta,
    dvch_nroch, dvch_cuenta, dvch_banco, dvch_anulado
    from devolucion_cheques ch, cuentas_banco c where ch.cuba_cod = c.cuba_cod and ch.cuba_cod = :CUENTA
    INTO :ID, :prefijo, :numero, :fecha, :nomterc, :monto, :codcta, :chnumero, :chcuenta, :chbanco, :anular
    do
    begin
    execute procedure saldo_doc_cartera(77, :id,  '2099-12-31', 0) returning_values (:SALDO);
    suspend;
    end
end
^

SET TERM ; ^


/* 20081201  AUMENTE LOS DATOS DE LAS EXCEPCIONES */

SET TERM ^ ;

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

    DELETE FROM puntos_cliente WHERE PTCL_TIPODOC = 31 AND PTCL_IDDOC = OLD.fact_id;

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

    /* Verifique si habia abonos a la nota */
    ABONOS = 0;
    select COUNT(*) FROM SALDOS_DOC_CARTERA WHERE SDCA_TIPOREF = 31 AND SDCA_IDREF = OLD.FACT_ID AND SDCA_ABONO <> 0 INTO :ABONOS;
    if (ABONOS = 0) then
        BEGIN
        /* BORRE EL REGISTRO PREVIO */
        delete from saldos_doc_cartera where sdca_tiporef = 31 and sdca_idref = old.fact_id;
        delete from movimiento_clientes where (mvcl_tiporef = 31) and (mvcl_idref = old.fact_id);
        if (PEDAUTO = 'SI') then
            BEGIN
            /* INTENTE ANULAR EL PEDIDO DEL MISMO NUMERO */
            UPDATE PEDIDOS SET PEDI_ANULADO = 'S' WHERE PREF_PRE = OLD.pref_pre AND PEDI_NUMERO = OLD.fact_numero;
            END
        /* ANULE LA CONSOLIDACION */
        if (OLD.FACT_CONSOLIDA <> 0) then
            BEGIN
            UPDATE consolidado_faltantes SET COFA_OK = 'N' WHERE COFA_ID = OLD.fact_consolida;
            END
        END
    else
        exception DOCUMENTO_CON_ABONOS 'La factura ' || old.pref_pre || old.fact_numero || ' tiene abonos registrados.';
    end
if ((NEW.FACT_ID <> 0) AND (new.fact_anulado = 'N')) then
    BEGIN
    if (OLD.fact_id = 0) then
        BEGIN
        /* actualice el prefijo si se pasaron de una hoja impresa */
        execute procedure lee_configuracion('FACTURACION','FACTURAS','INCREMENTAR NUMERACION AUTOMATICAMENTE EN FACTURAS DE VARIAS HOJAS') returning_values (:CONC);
        if (CONC = 'SI') then
            BEGIN
            select FORM_NROITEMS from FORMATOS where tido_cod = 31 and pref_pre = new.pref_pre into :dias;
            select count(*) from facturas_detalle where fact_id = old.fact_id into :numrows;
            if (numrows > dias) then
                begin
                SELECT PREF_ACTUAL, PREF_AUTO FROM PREFIJOS WHERE TIDO_COD = 31 AND PREF_PRE = NEW.PREF_PRE INTO :NUMERO, :AUTOM;
                if (AUTOM = 'S' or NUMERO = NEW.fact_numero) then
                    BEGIN
                    NUMROWS = CAST(NUMERO AS INTEGER) + DIV(numrows,dias);
                    NUMERO = CAST(NUMROWS AS CHAR(6));
                    update prefijos set pref_actual = :NUMERO WHERE TIDO_COD = 31 AND PREF_PRE = NEW.PREF_PRE;
                    END
                end
            END
        END
  
    /* Registre el nuevo saldo del documento */
    INSERT INTO SALDOS_DOC_CARTERA (SDCA_TIPOREF, SDCA_IDREF, SDCA_FECHA, TERC_NIT, SDCA_RTFTE, SDCA_RTIVA, SDCA_RTICA, SDCA_ABONO, SDCA_ABRTFTE, SDCA_ABRTIVA, SDCA_ABRTICA, SDCA_DEBITO, SDCA_MONTO, SDCA_TRM)
        VALUES (31, NEW.FACT_ID, NEW.FACT_fecha, NEW.terc_nit, NEW.FACT_rtftemonto, NEW.FACT_rtivamonto, NEW.FACT_rticamonto, 0, 0, 0, 0, 'S', NEW.FACT_TOTAL, NEW.fact_trm);
    AUX = 'FACTURA DE VENTA No.' || NEW.PREF_PRE || NEW.FACT_NUMERO || '-' || NEW.FACT_NOMCLIENTE;
    if (STRLEN(AUX) > 60) then
        CONC = SUBSTR(AUX, 1, 60);
    else
        CONC = AUX;
    INSERT INTO MOVIMIENTO_CLIENTES (MVCL_ID, TERC_NIT, MVCL_TIPOREF, MVCL_IDREF, MVCL_FECHA, MVCL_VENCE, MVCL_CONC, MVCL_MONTO, MVCL_RTEFTE, MVCL_RTEIVA, MVCL_RTEICA, MVCL_DEBITO, MVCL_ABONO, MVCL_PREFREF, MVCL_NUMREF, MVCL_SUCURSAL, COBR_COD, MVCL_TRM)
        VALUES (GEN_ID(ID_MOVCLI, 1), NEW.TERC_NIT, 31, NEW.FACT_ID, NEW.FACT_FECHA, NEW.fact_vence, :CONC, NEW.FACT_TOTAL, NEW.FACT_RTFTEMONTO, NEW.FACT_RTIVAMONTO, NEW.FACT_RTICAMONTO, 'S', 'N', NEW.pref_pre, NEW.FACT_numero, NEW.fact_sucursal, NEW.cobr_cod, NEW.fact_trm);
    if (PEDAUTO = 'SI') then
        BEGIN
        EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION','PEDIDOS','DIAS DE VALIDEZ') RETURNING_VALUES (DIAS);
        INSERT INTO PEDIDOS (PEDI_ID, TERC_NIT, VEND_COD, TIDO_COD, PREF_PRE, PEDI_NUMERO, PEDI_FECHA, PEDI_VALIDEZ, PEDI_DESPACHO, PEDI_OBS, PEDI_IVAINC, PEDI_NOMTERC, PEDI_DTOPOR, PEDI_DTOMONTO, PEDI_ADICIONAL, PEDI_IVAMONTO, PEDI_EXTRA, PEDI_TOTAL, PEDI_ANULADO, PEDI_TRANSMIT, PTVT_ID, PEDI_COTIZACI, PEDI_RTFTEPORC, PEDI_RTFTEMONTO, PEDI_RTIVAPORC, PEDI_RTIVAMONTO, PEDI_RTICAPORC, PEDI_RTICAMONTO, PEDI_SUCURSAL)
            VALUES (GEN_ID(ID_PEDIDO, 1), NEW.TERC_NIT, NEW.VEND_COD, 34, NEW.PREF_PRE, NEW.FACT_NUMERO, NEW.FACT_FECHA, :DIAS, NEW.FACT_DESPACHO, NEW.FACT_OBS, NEW.FACT_IVAINC, NEW.FACT_NOMCLIENTE, NEW.FACT_DTOPOR, NEW.FACT_DTOMONTO, NEW.FACT_ADICIONAL, NEW.FACT_IVAMONTO, NEW.FACT_EXTRA, NEW.FACT_TOTAL, 'N', 'N', NEW.PTVT_ID, NULL, NEW.FACT_RTFTEPOR, NEW.FACT_RTFTEMONTO, NEW.FACT_RTIVAPOR, NEW.FACT_RTIVAMONTO, NEW.FACT_RTICAPOR, NEW.FACT_RTICAMONTO, NEW.fact_sucursal);
        END
    INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
        VALUES (USER, 31, NEW.fact_id, 'U', NEW.pref_pre || NEW.fact_numero);
    end
/* SI CAMBIA EL NUEMRO O LA FECHA CAMBIE EL DETALLE */
if ((OLD.pref_pre <> NEW.pref_pre) or
    (OLD.fact_numero <> NEW.fact_numero) or
    (OLD.fact_fecha <> NEW.fact_fecha)) then
    UPDATE FACTURAS_DETALLE SET FADE_TRANSMIT = 'N' WHERE FACT_ID = NEW.FACT_ID;
/* ACTUALICE EL ANULADO EN LOS DETALLES */
if (OLD.FACT_anulado <> NEW.FACT_anulado) then
    UPDATE FACTURAS_DETALLE SET FADE_ANULADO = NEW.FACT_anulado WHERE FACT_ID = NEW.FACT_ID;
if (OLD.fact_transmit <> NEW.fact_transmit) then
    UPDATE FACTURAS_DETALLE SET FADE_TRANSMIT = NEW.fact_transmit WHERE FACT_ID = NEW.FACT_ID;
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER FACTURAS_AD FOR FACTURAS
ACTIVE AFTER DELETE POSITION 0
AS
declare variable ABONOS INTEGER;
declare variable IDC INTEGER;
declare variable PEDAUTO CHAR(2);
declare variable consec INTEGER;
BEGIN
/* borre la contabilización */
select enco_consec from comprobante_encabezado where enco_tiporef = 31 and enco_idref = old.fact_id INTO :consec;
if (NOT consec is null) then
  delete from comprobante_detalle where enco_consec = :consec;
delete from comprobante_encabezado where enco_tiporef = 31 and enco_idref = old.fact_id;

DELETE FROM puntos_cliente WHERE PTCL_TIPODOC = 31 AND PTCL_IDDOC = OLD.fact_id;

INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
    VALUES (USER, 31, OLD.fact_id, 'D', OLD.pref_pre || OLD.fact_numero);

if ((OLD.fact_id <> 0) AND (OLD.fact_anulado = 'N')) then
    BEGIN
    /* VERIFIQUE QUE NO HAY DEVOLUCIONES */
    SELECT COUNT(*) FROM DEVOLUCIONES_VENTAS WHERE DEVT_FACTID = OLD.fact_id AND DEVT_ANULADO = 'N' INTO :abonos;
    if (abonos > 0) then
        exception documento_devuelto 'La factura ' || old.pref_pre || old.fact_numero || ' tiene devoluciones registradas.';

    /* Verifique si habia abonos a la nota */
    ABONOS = 0;
    select COUNT(*) FROM SALDOS_DOC_CARTERA WHERE SDCA_TIPOREF = 31 AND SDCA_IDREF = OLD.FACT_ID AND SDCA_ABONO <> 0 INTO :ABONOS;
    if (ABONOS = 0) then
        BEGIN
        /* BORRE EL REGISTRO PREVIO */
        delete from saldos_doc_cartera where sdca_tiporef = 31 and sdca_idref = old.fact_id;
        delete from movimiento_CLIENTES where (mvcl_tiporef = 31) and (mvcl_idref = old.fact_id);
        /* borre la contabilizaci¢n */
        select enco_consec from comprobante_encabezado where enco_tiporef = 31 and enco_idref = old.fact_id into :IDC;

        EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION','FACTURAS','GENERAR PEDIDO AUTOMATICAMENTE CON LA FACTURA') RETURNING_VALUES (PEDAUTO);
        if (PEDAUTO = 'SI') then
            BEGIN
            /* INTENTE BORRAR EL PEDIDO DEL MISMO NUMERO */
            DELETE FROM PEDIDOS WHERE PREF_PRE = OLD.pref_pre AND PEDI_NUMERO = OLD.fact_numero;
            END
        /* ACTUALICE LA CONSOLIDACION */
        if ((OLD.FACT_ID <> 0) AND (OLD.FACT_CONSOLIDA <> 0)) then
            UPDATE consolidado_faltantes SET COFA_OK = 'N' WHERE COFA_ID = OLD.fact_consolida;
        END
    else
        exception DOCUMENTO_CON_ABONOS 'La factura ' || old.pref_pre || old.fact_numero || ' tiene abonos registrados.';
    END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER AJUSTES_BI FOR AJUSTES
ACTIVE BEFORE INSERT POSITION 0
AS
declare variable NUMERO VARCHAR(8);
declare variable AUTOM CHAR(1);
declare variable EXISTE CHAR(1);
BEGIN
if (NEW.numok = 'N') then
  BEGIN
  /* Actualice el contador del prefijo */
  SELECT PREF_ACTUAL, PREF_AUTO FROM PREFIJOS WHERE TIDO_COD = NEW.TIDO_COD AND PREF_PRE = NEW.PREF_PRE INTO :NUMERO, :AUTOM;
  if (AUTOM = 'S') then
    BEGIN
    /* ACTUALICE EL NUMERO EN COMPROBANTE_ENCABEZADO  */
    NEW.AJUS_NUMERO = NUMERO;
    NUMERO = CAST((CAST(NUMERO AS INTEGER) + 1) AS CHAR(6));
    UPDATE PREFIJOS
      SET PREF_ACTUAL = :NUMERO
    WHERE TIDO_COD = NEW.TIDO_COD AND PREF_PRE = NEW.PREF_PRE;
    END
  ELSE
    begin
    if (CAST(NUMERO AS INTEGER) = CAST(NEW.AJUS_NUMERO AS INTEGER)) then
        UPDATE PREFIJOS
          SET PREF_ACTUAL = CAST((CAST(PREF_ACTUAL AS INTEGER) + 1) AS CHAR(6))
        WHERE TIDO_COD = NEW.TIDO_COD AND PREF_PRE = NEW.PREF_PRE;
    end
  EXECUTE PROCEDURE COMPLETA_CEROS(NEW.AJUS_numero) returning_values (NEW.AJUS_numero);
  /* Verifique que el numero no existe previamente */
  EXISTE = 'N';
  SELECT 'S' FROM AJUSTES WHERE PREF_PRE = NEW.PREF_PRE AND AJUS_NUMERO = NEW.AJUS_NUMERO INTO :EXISTE;
  if (EXISTE = 'S') then
    EXCEPTION DOCUMENTO_REGISTRADO 'Ya existe un ajuste con número ' || new.pref_pre || new.ajus_numero;
  NEW.numok = 'S';
  END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER ANTICIPOS_CLIENTE_AD FOR ANTICIPOS_CLIENTE
ACTIVE AFTER DELETE POSITION 0
AS
declare variable ABONOS char(1);
declare variable consec INTEGER;
BEGIN
select enco_consec from comprobante_encabezado where enco_tiporef = 45 and enco_idref = old.ancl_id into :consec;
if (NOT consec is null) then
  delete from comprobante_detalle where enco_consec = :consec;
delete from comprobante_encabezado where enco_tiporef = 45 and enco_idref = old.ancl_id;

if ((OLD.ANCL_anulado = 'N') and (old.ancl_id <> 0)) then
    begin
    /* Verifique si habia abonos a la nota */
    ABONOS = 'N';
    select 'S' FROM SALDOS_DOC_CARTERA WHERE SDCA_TIPOREF = 45 AND SDCA_IDREF = OLD.ANCL_ID AND SDCA_ABONO <> 0 INTO :ABONOS;
    if (ABONOS = 'N') then
        BEGIN
        /* BORRE EL REGISTRO PREVIO */
        delete from saldos_doc_cartera where sdca_tiporef = 45 and sdca_idref = old.ancl_id;
        delete from movimiento_CLIENTES where (mvcl_tiporef = 45) and (mvcl_idref = old.ancl_id);
        INSERT INTO AUDITORIA (AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
            VALUES (USER, 45, OLD.ancl_id, 'D', OLD.pref_pre || OLD.ancl_numero);
        END
    else
        exception DOCUMENTO_CON_ABONOS 'El anticipo ' || old.pref_pre || old.ancl_numero || ' ya tiene abonos.';
    end
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER ANTICIPOS_CLIENTE_AU FOR ANTICIPOS_CLIENTE
ACTIVE AFTER UPDATE POSITION 0
AS
declare variable ABONOS char(1);
declare variable consec INTEGER;
BEGIN
/* borre el viejo y grabe el nuevo */
if ((OLD.ANCL_anulado = 'N') and (old.ancl_id <> 0)) then
    begin
    /* Verifique si habia abonos a la nota */
    ABONOS = 'N';
    select 'S' FROM SALDOS_DOC_CARTERA WHERE SDCA_TIPOREF = 45 AND SDCA_IDREF = OLD.ANCL_ID AND SDCA_ABONO <> 0 INTO :ABONOS;
    if (ABONOS = 'N') then
        BEGIN
        /* BORRE EL REGISTRO PREVIO */
        delete from saldos_doc_cartera where sdca_tiporef = 45 and sdca_idref = old.ancl_id;
        delete from movimiento_CLIENTES where (mvcl_tiporef = 45) and (mvcl_idref = old.ancl_id);
        if (new.ancl_anulado = 'S') then
            begin
            select enco_consec from comprobante_encabezado where enco_tiporef = 45 and enco_idref = old.ancl_id into :consec;
            if (NOT consec is null) then
             delete from comprobante_detalle where enco_consec = :consec;
            delete from comprobante_encabezado where enco_tiporef = 45 and enco_idref = old.ancl_id;
            INSERT INTO AUDITORIA (AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
                VALUES (USER, 45, NEW.ancl_id, 'A', NEW.pref_pre || NEW.ancl_numero);
            end
        END
    else
        exception DOCUMENTO_CON_ABONOS 'El anticipo ' || old.pref_pre || old.ancl_numero || ' ya tiene abonos.';
    end
if ((new.ancl_anulado = 'N') and (new.ancl_id <> 0)) then
    begin
    /* Registre el nuevo saldo del documento */
    INSERT INTO SALDOS_DOC_CARTERA (SDCA_TIPOREF, SDCA_IDREF, SDCA_FECHA, TERC_NIT, SDCA_RTFTE, SDCA_RTIVA, SDCA_RTICA, SDCA_ABONO, SDCA_ABRTFTE, SDCA_ABRTIVA, SDCA_ABRTICA, SDCA_DEBITO, SDCA_MONTO, SDCA_TRM)
        VALUES (45, NEW.ANCL_ID, NEW.ancl_fecha, NEW.terc_nit, (NEW.ancl_rtftemonto*-1), (NEW.ancl_rtivamonto*-1), (NEW.ancl_rticamonto*-1), 0, 0, 0, 0, 'N', ((NEW.ancl_BASE+NEW.ancl_ivamonto)*-1), NEW.ancl_trm);
    /* Registre el movimiento del proveedor */
    INSERT INTO MOVIMIENTO_CLIENTES (MVCL_ID, TERC_NIT, MVCL_TIPOREF, MVCL_IDREF, MVCL_FECHA, MVCL_VENCE, MVCL_CONC, MVCL_MONTO, MVCL_RTEFTE, MVCL_RTEIVA, MVCL_RTEICA, MVCL_DEBITO, MVCL_ABONO, MVCL_PREFREF, MVCL_NUMREF, MVCL_SUCURSAL, COBR_COD, MVCL_TRM)
        VALUES (GEN_ID(ID_MOVCLI, 1), NEW.TERC_NIT, 45, NEW.ANCL_ID, NEW.ANCL_FECHA, NEW.ANCL_FECHA, NEW.ANCL_CONC, NEW.ANCL_BASE+NEW.ancl_ivamonto, NEW.ANCL_RTFTEMONTO, NEW.ANCL_RTIVAMONTO, NEW.ANCL_RTICAMONTO, 'N', 'N', NEW.pref_pre, NEW.ancl_numero, NEW.ancl_sucursal, NEW.cobr_cod, NEW.ancl_trm);
    INSERT INTO AUDITORIA (AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
        VALUES (USER, 45, NEW.ancl_id, 'U', NEW.pref_pre || NEW.ancl_numero);
    end
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER ANTICIPOS_CLIENTE_BI FOR ANTICIPOS_CLIENTE
ACTIVE BEFORE INSERT POSITION 0
AS
declare variable NUMERO VARCHAR(6);
declare variable AUTOM CHAR(1);
declare variable EXISTE CHAR(1);
declare variable PREGTASA CHAR(2);
BEGIN
/* Complete con ceros los campos nulos */
if (NEW.ancl_base IS NULL) then
    NEW.ancl_base = 0;
if (NEW.ancl_rtfteporc IS NULL) then
    NEW.ancl_rtivaporc = 0;
if (NEW.ancl_rtivaporc IS NULL) then
    NEW.ancl_rtivaporc = 0;
if (NEW.ancl_rticaporc IS NULL) then
    NEW.ancl_rticaporc = 0;
if (NEW.ancl_rtftemonto IS NULL) then
    NEW.ancl_rtftemonto = 0;
if (NEW.ancl_rtivamonto IS NULL) then
    NEW.ancl_rtivamonto = 0;
if (NEW.ancl_rticamonto IS NULL) then
    NEW.ancl_rticamonto = 0;
if (NEW.ancl_dtofporc IS NULL) then
    NEW.ancl_dtofporc = 0;
if (NEW.ancl_dtofmonto IS NULL) then
    NEW.ancl_dtofmonto = 0;
if ((NEW.ancl_trm IS NULL) or (NEW.ancl_trm = 0)) then
    NEW.ancl_trm = 1;
EXECUTE PROCEDURE LEE_CONFIGURACION('GENERAL', 'GENERAL', 'PREGUNTAR TASA DE CAMBIO EN DOCUMENTOS DE CARTERA') returning_values (:pregtasa);
if (PREGTASA = 'SI') then
    BEGIN
    NEW.ancl_base = NEW.ancl_base * NEW.ancl_trm;
    NEW.ancl_ivamonto = NEW.ancl_ivamonto * NEW.ancl_trm;
    NEW.ancl_rtftemonto = NEW.ancl_rtftemonto * NEW.ancl_trm;
    NEW.ancl_rtivamonto = NEW.ancl_rtivamonto * NEW.ancl_trm;
    NEW.ancl_rticamonto = NEW.ancl_rticamonto * NEW.ancl_trm;
    NEW.ancl_dtofmonto = NEW.ancl_dtofmonto * NEW.ancl_trm;
    END
if (NEW.numok = 'N') then
  BEGIN
  /* Actualice el contador del prefijo */
  SELECT PREF_ACTUAL, PREF_AUTO FROM PREFIJOS
    WHERE TIDO_COD = NEW.TIDO_COD AND PREF_PRE = NEW.PREF_PRE INTO :NUMERO, :AUTOM;
  /* ACTUALICE EL NUMERO EN COMPROBANTE_ENCABEZADO  */
  if (AUTOM = 'S') then
    BEGIN
    NEW.ANCL_NUMERO = NUMERO;
    NUMERO = CAST((CAST(NUMERO AS INTEGER) + 1) AS CHAR(6));
    UPDATE PREFIJOS
      SET PREF_ACTUAL = :NUMERO
    WHERE TIDO_COD = NEW.TIDO_COD AND PREF_PRE = NEW.PREF_PRE;
    END
  ELSE
    BEGIN
    if (CAST(NUMERO AS INTEGER) = CAST(NEW.ANCL_NUMERO AS INTEGER)) then
        UPDATE PREFIJOS
          SET PREF_ACTUAL = CAST((CAST(PREF_ACTUAL AS INTEGER) + 1) AS CHAR(6))
        WHERE TIDO_COD = NEW.TIDO_COD AND PREF_PRE = NEW.PREF_PRE;
    END
  execute PROCEDURE COMPLETA_CEROS(NEW.ANCL_numero) returning_values (NEW.ANCL_numero);
  NEW.numok = 'S';
  END
/* Verifique que el numero no existe previamente */
EXISTE = 'N';
SELECT 'S' FROM ANTICIPOS_CLIENTE WHERE PREF_PRE = NEW.PREF_PRE AND ANCL_NUMERO = NEW.ANCL_NUMERO INTO :EXISTE;
if (EXISTE = 'S') then
    EXCEPTION DOCUMENTO_REGISTRADO 'Ya existe un anticpo con el número ' || new.pref_pre || new.ancl_numero;
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER ANTICIPOS_PROVEEDOR_AD FOR ANTICIPOS_PROVEEDOR
ACTIVE AFTER DELETE POSITION 0
AS
declare variable ABONOS integer;
declare variable consec INTEGER;
BEGIN
select enco_consec from comprobante_encabezado where enco_tiporef = 55 and enco_idref = old.anpr_id into :consec;
if (NOT consec is null) then
  delete from comprobante_detalle where enco_consec = :consec;
delete from comprobante_encabezado where enco_tiporef = 55 and enco_idref = old.anpr_id;
if ((OLD.anpr_id <> 0) AND (OLD.anpr_anulado = 'N')) then
    BEGIN
    /* Verifique si habia abonos a la nota */
    ABONOS = 0;
    select COUNT(*) FROM SALDOS_DOC_CXPAGAR WHERE SDCP_TIPOREF = 55 AND SDCP_IDREF = OLD.ANPR_ID AND SDCP_ABONO <> 0 INTO :ABONOS;
    if (ABONOS = 0) then
        BEGIN
        /* BORRE EL REGISTRO PREVIO */
        delete from saldos_doc_cxpagar where sdcp_tiporef = 55 and sdcp_idref = old.anpr_id;
        delete from movimiento_PROVEEDOR where (mvpr_tiporef = 55) and (mvpr_idref = old.anpr_id);
        INSERT INTO AUDITORIA(audi_usuario, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
            VALUES (USER, 55, OLD.anpr_id, 'U', OLD.pref_pre || OLD.anpr_numero);
        END
    else
        exception DOCUMENTO_CON_ABONOS 'El anticipo ' || old.pref_pre || old.anpr_numero || ' tiene abonos registrados.';
    END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER ANTICIPOS_PROVEEDOR_AU FOR ANTICIPOS_PROVEEDOR
ACTIVE AFTER UPDATE POSITION 0
AS
declare variable ABONOS char(1);
declare variable consec INTEGER;
BEGIN
/* borre lo viejo y guarde lo nuevo */
if ((old.anpr_id <> 0) and (old.anpr_anulado = 'N')) then
    begin
    /* Verifique si habia abonos a la nota */
    ABONOS = 'N';
    select 'S' FROM SALDOS_DOC_CXPAGAR WHERE SDCP_TIPOREF = 55 AND SDCP_IDREF = OLD.ANPR_ID AND SDCP_ABONO <> 0 INTO :ABONOS;
    if (ABONOS = 'N') then
        BEGIN
        /* BORRE EL REGISTRO PREVIO */
        delete from saldos_doc_cxpagar where sdcp_tiporef = 55 and sdcp_idref = old.anpr_id;
        delete from movimiento_PROVEEDOR where (mvpr_tiporef = 55) and (mvpr_idref = old.anpr_id);
        /* borre la contabilizacion */
        if (new.anpr_anulado = 'S') then
            begin
            select enco_consec from comprobante_encabezado where enco_tiporef = 55 and enco_idref = old.anpr_id into :consec;
            if (NOT consec is null) then
              delete from comprobante_detalle where enco_consec = :consec;
            delete from comprobante_encabezado where enco_tiporef = 55 and enco_idref = old.anpr_id;
            INSERT INTO AUDITORIA (AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
                VALUES (USER, 55, NEW.anpr_id, 'A', NEW.pref_pre || NEW.anpr_numero);
            end
        END
    else
        exception DOCUMENTO_CON_ABONOS 'El anticipo ' || old.pref_pre || old.anpr_numero || ' tiene abonos registrados.';
    END
if ((new.anpr_id <> 0) and (new.anpr_anulado = 'N')) then
    begin
    /* Registre el nuevo saldo del documento */
    INSERT INTO SALDOS_DOC_CXPAGAR (SDCP_TIPOREF, SDCP_IDREF, SDCP_FECHA, TERC_NIT, SDCP_RTEFTE, SDCP_RTIVA, SDCP_RTICA, SDCP_ABONO, SDCP_ABRTFTE, SDCP_ABRTIVA, SDCP_ABRTICA, SDCP_DEBITO, SDCP_MONTO, SDCP_TRM)
        VALUES (55, NEW.ANPR_ID, NEW.anpr_fecha, NEW.terc_nit, (NEW.anpr_rtftemonto*-1), (NEW.anpr_rtivamonto*-1), (NEW.anpr_rticamonto*-1), 0, 0, 0, 0, 'N', (NEW.anpr_BASE+NEW.anpr_ivamonto)*-1, NEW.anpr_trm);
    /* Registre el movimiento del proveedor */
    INSERT INTO MOVIMIENTO_PROVEEDOR (MVPR_ID, TERC_NIT, MVPR_TIPOREF, MVPR_IDREF, MVPR_FECHA, MVPR_VENCE, MVPR_CONC, MVPR_MONTO, MVPR_RTFTE, MVPR_RTIVA, MVPR_RTICA, MVPR_DEBITO, MVPR_ABONO, MVPR_PREFIJO, MVPR_NUMERO, MVPR_TRM)
        VALUES (GEN_ID(ID_MOVPROV, 1), NEW.TERC_NIT, 55, NEW.ANPR_ID, NEW.ANPR_FECHA, NEW.ANPR_FECHA, NEW.ANPR_CONC, NEW.ANPR_BASE+NEW.anpr_ivamonto, NEW.ANPR_RTFTEMONTO, NEW.ANPR_RTIVAMONTO, NEW.ANPR_RTICAMONTO, 'N', 'N', NEW.pref_pre, NEW.anpr_numero, NEW.anpr_trm);
    INSERT INTO AUDITORIA (AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
        VALUES (USER, 55, NEW.anpr_id, 'U', NEW.pref_pre || NEW.anpr_numero);
    end
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER ANTICIPOS_PROVEEDOR_BI FOR ANTICIPOS_PROVEEDOR
ACTIVE BEFORE INSERT POSITION 0
AS
declare variable NUMERO VARCHAR(6);
declare variable AUTOM CHAR(1);
declare variable EXISTE CHAR(1);
declare variable pregtasa CHAR(2);
BEGIN
if (NEW.numok = 'N') then
  BEGIN
  /* Actualice el contador del prefijo */
  SELECT PREF_ACTUAL, PREF_AUTO FROM PREFIJOS WHERE TIDO_COD = NEW.TIDO_COD AND PREF_PRE = NEW.PREF_PRE INTO :NUMERO, :AUTOM;
  /* ACTUALICE EL NUMERO EN COMPROBANTE_ENCABEZADO  */
  if (AUTOM = 'S') then
    BEGIN
    NEW.ANPR_NUMERO = NUMERO;
    NUMERO = CAST((CAST(NUMERO AS INTEGER) + 1) AS CHAR(6));
    UPDATE PREFIJOS
      SET PREF_ACTUAL = :NUMERO
    WHERE TIDO_COD = NEW.TIDO_COD AND PREF_PRE = NEW.PREF_PRE;
    END
  ELSE
    BEGIN
    if (CAST(NUMERO AS INTEGER) = CAST(NEW.ANPR_NUMERO AS INTEGER)) then
        UPDATE PREFIJOS
          SET PREF_ACTUAL = CAST((CAST(PREF_ACTUAL AS INTEGER) + 1) AS CHAR(6))
        WHERE TIDO_COD = NEW.TIDO_COD AND PREF_PRE = NEW.PREF_PRE;
    END
  EXECUTE PROCEDURE completa_ceros(NEW.ANPR_numero) returning_values (NEW.ANPR_numero);
  NEW.numok = 'S';
  END
/* Verifique que el numero no existe previamente */
EXISTE = 'N';
SELECT 'S' FROM ANTICIPOS_PROVEEDOR WHERE PREF_PRE = NEW.PREF_PRE AND ANPR_NUMERO = NEW.ANPR_NUMERO INTO :EXISTE;
if (EXISTE = 'S') then
    EXCEPTION DOCUMENTO_REGISTRADO 'Ya existe un anticipo con el número ' || new.pref_pre || new.anpr_numero;
/* Complete con ceros los campos nulos */
if (NEW.ANPR_BASE IS NULL) then
    NEW.ANPR_BASE = 0;
if (NEW.ANPR_RTFTEPORC IS NULL) then
    NEW.ANPR_RTFTEPORC = 0;
if (NEW.ANPR_RTIVAPORC IS NULL) then
    NEW.ANPR_RTIVAPORC = 0;
if (NEW.ANPR_RTICAPORC IS NULL) then
    NEW.ANPR_RTICAPORC = 0;
if (NEW.ANPR_RTFTEMONTO IS NULL) then
    NEW.ANPR_RTFTEMONTO = 0;
if (NEW.ANPR_RTIVAMONTO IS NULL) then
    NEW.ANPR_RTIVAMONTO = 0;
if (NEW.ANPR_RTICAMONTO IS NULL) then
    NEW.ANPR_RTICAMONTO = 0;
if (NEW.ANPR_DTOFPORC IS NULL) then
    NEW.ANPR_DTOFPORC = 0;
if (NEW.ANPR_DTOFMONTO IS NULL) then
    NEW.ANPR_DTOFMONTO = 0;
if ((NEW.anpr_trm IS NULL) or (NEW.anpr_trm = 0)) then
    NEW.anpr_trm = 1;
EXECUTE PROCEDURE LEE_CONFIGURACION('GENERAL', 'GENERAL', 'PREGUNTAR TASA DE CAMBIO EN DOCUMENTOS DE CUENTAS POR PAGAR') returning_values (:pregtasa);
if (PREGTASA = 'SI') then
    BEGIN
    NEW.anpr_base = NEW.anpr_base * NEW.anpr_trm;
    NEW.anpr_ivamonto = NEW.anpr_ivamonto * NEW.anpr_trm;
    NEW.anpr_rtftemonto = NEW.anpr_rtftemonto * NEW.anpr_trm;
    NEW.anpr_rtivamonto = NEW.anpr_rtivamonto * NEW.anpr_trm;
    NEW.anpr_rticamonto = NEW.anpr_rticamonto * NEW.anpr_trm;
    NEW.anpr_dtofmonto = NEW.anpr_dtofmonto * NEW.anpr_trm;
    END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER APLICACION_CLIENTE_BI FOR APLICACION_CLIENTE
ACTIVE BEFORE INSERT POSITION 0
AS
declare variable NUMERO VARCHAR(6);
declare variable AUTOM CHAR(1);
declare variable EXISTE CHAR(1);
BEGIN
if (NEW.numok = 'N') then
  BEGIN
  /* Actualice el contador del prefijo */
  SELECT PREF_ACTUAL, PREF_AUTO FROM PREFIJOS WHERE TIDO_COD = NEW.TIDO_COD AND PREF_PRE = NEW.PREF_PRE INTO :NUMERO, :AUTOM;
  /* ACTUALICE EL NUMERO EN COMPROBANTE_ENCABEZADO  */
  if (AUTOM = 'S') then
    BEGIN
    NEW.APCL_NUMERO = NUMERO;
    NUMERO = CAST((CAST(NUMERO AS INTEGER) + 1) AS CHAR(6));
    UPDATE PREFIJOS
      SET PREF_ACTUAL = :NUMERO
    WHERE TIDO_COD = NEW.TIDO_COD AND PREF_PRE = NEW.PREF_PRE;
    END
  ELSE
    BEGIN
    if (CAST(NUMERO AS INTEGER) = CAST(NEW.APCL_NUMERO AS INTEGER)) then
        UPDATE PREFIJOS
          SET PREF_ACTUAL = CAST((CAST(PREF_ACTUAL AS INTEGER) + 1) AS CHAR(6))
        WHERE TIDO_COD = NEW.TIDO_COD AND PREF_PRE = NEW.PREF_PRE;
    END
  EXECUTE PROCEDURE completa_ceros (NEW.APCL_numero) returning_values (New.apcl_numero);
  NEW.numok = 'S';
  END
/* Verifique que el numero no existe previamente */
EXISTE = 'N';
SELECT 'S' FROM APLICACION_CLIENTE WHERE PREF_PRE = NEW.PREF_PRE AND APCL_NUMERO = NEW.APCL_NUMERO INTO :EXISTE;
if (EXISTE = 'S') then
    EXCEPTION DOCUMENTO_REGISTRADO 'Ya existe una aplicación con el número ' || new.pref_pre || new.apcl_numero;

if ((NEW.apcl_trm IS NULL) or (new.apcl_trm = 0))  then
    NEW.apcl_trm = 1;
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER APLICACION_CLIENTE_DETALLE_AU FOR APLICACION_CLIENTE_DETALLE
ACTIVE AFTER UPDATE POSITION 0
AS
declare variable EXISTE CHAR(1);
declare variable FEC DATE;
declare variable NIT VARCHAR(20);
declare variable CONCEPTO VARCHAR(60);
declare variable PREFIJO VARCHAR(4);
declare variable NUMERO VARCHAR(6);
declare variable SALDO NUMERIC(18,2);
declare variable RETES CHAR(2);
declare variable SUCURSAL VARCHAR(10);
declare variable COBR INTEGER;
declare variable TRM NUMERIC(18,2);
BEGIN
if ((old.apcl_id <> 0) and (old.acde_anulado = 'N')) then
    begin
    select apcl_fecha, apcl_trm from aplicacion_CLIENTE
        where apcl_id = old.apcl_id into :FEC, :TRM;
    UPDATE saldos_doc_cartera
        SET SDCA_ABONO = SDCA_ABONO - old.acde_aplicado - OLD.acde_difcambio,
        SDCA_ABRTFTE = SDCA_ABRTFTE - old.acde_RTFTE,
        SDCA_ABRTIVA = SDCA_ABRTIVA - old.acde_RTIVA,
        SDCA_ABRTICA = SDCA_ABRTICA - old.acde_RTICA
        WHERE SDCA_TIPOREF = OLD.ACDE_TIPODOC AND SDCA_IDREF = OLD.acde_IDDOC AND SDCA_FECHA = :FEC;
                    
    UPDATE movimiento_clientes
        SET MVCL_MONTO = MVCL_MONTO - OLD.acde_aplicado - OLD.acde_difcambio,
        MVCL_RTEFTE = MVCL_RTEFTE - OLD.acde_rtfte,
        MVCL_RTEIVA = MVCL_RTEIVA - OLD.acde_rtiva,
        MVCL_RTEICA = MVCL_RTEICA - OLD.acde_rtica
        WHERE MVCL_TIPOREF = 43 AND MVCL_IDREF = NEW.APCL_ID;
    end
if ((NEW.acde_anulado = 'N') AND (NEW.APCL_ID <> 0)) then
    BEGIN
    select PREF_PRE, APCL_NUMERO, apcl_fecha, APCL_CONCEPTO, TERC_NIT, APCL_SUCURSAL, COBR_COD, APCL_TRM
        from aplicacion_CLIENTE
        where apcl_id = new.apcl_id
        into :PREFIJO, :NUMERO, :FEC, :CONCEPTO, :NIT, :SUCURSAL, :COBR, :TRM;
    /* valide que no se pase del saldo */
    execute procedure saldo_doc_cartera(new.acde_tipodoc, new.acde_iddoc, '9999/12/31', 0) returning_values(saldo);
    execute procedure lee_configuracion('CARTERA', 'SALDOS', 'DESCONTAR RETENCIONES POR CAUSACION') returning_values (RETES);
    if (SALDO < 0) then
        BEGIN
        if (RETES = 'SI') then
            begin
            if (saldo > (NEW.acde_aplicado+NEW.acde_difcambio)) then
                EXCEPTION DOCUMENTO_ABONO_MAYOR 'EL SALDO DEL DOCUMENTO ' || NEW.acde_prefijo || NEW.acde_numero || ' ES INSUFICIENTE.';
            end
        ELSE
            begin
            if (saldo > (NEW.acde_aplicado + NEW.acde_rtfte + NEW.acde_rtiva + NEW.acde_rtica + NEW.acde_difcambio)) then
                EXCEPTION DOCUMENTO_ABONO_MAYOR 'EL SALDO DEL DOCUMENTO ' || NEW.acde_prefijo || NEW.acde_numero || ' ES INSUFICIENTE.';
            end
        END
    else
        BEGIN
        if (RETES = 'SI') then
            begin
            if (saldo < (NEW.acde_aplicado+NEW.acde_difcambio)) then
                EXCEPTION DOCUMENTO_ABONO_MAYOR 'EL SALDO DEL DOCUMENTO ' || NEW.acde_prefijo || NEW.acde_numero || ' ES INSUFICIENTE.';
            end
        ELSE
            begin
            if (saldo < (NEW.acde_aplicado + NEW.acde_rtfte + NEW.acde_rtiva + NEW.acde_rtica + NEW.acde_difcambio)) then
                EXCEPTION DOCUMENTO_ABONO_MAYOR 'EL SALDO DEL DOCUMENTO ' || NEW.acde_prefijo || NEW.acde_numero || ' ES INSUFICIENTE.';
            end
        END
        
    /* Abone el documento referenciado  */
    select 'S' from saldos_doc_cartera where sdca_tiporef = new.acde_tipodoc and sdca_idref = new.acde_iddoc and sdca_fecha = :FEC into :EXISTE;
    if (Existe = 'S') then
        /* actualice el saldo del dia */
        UPDATE saldos_doc_cartera
            SET SDCA_ABONO = SDCA_ABONO + NEW.acde_aplicado+NEW.acde_difcambio,
            SDCA_ABRTFTE = SDCA_ABRTFTE + NEW.acde_RTFTE,
            SDCA_ABRTIVA = SDCA_ABRTIVA + NEW.acde_RTIVA,
            SDCA_ABRTICA = SDCA_ABRTICA + NEW.acde_RTICA,
            SDCA_TRM = :TRM
        WHERE SDCA_TIPOREF = NEW.ACDE_TIPODOC AND SDCA_IDREF = NEW.acde_IDDOC AND SDCA_FECHA = :FEC;
    ELSE
        /* Inserte un nuevo saldo diario */
        INSERT INTO SALDOS_DOC_CARTERA (SDCA_TIPOREF, SDCA_IDREF, SDCA_FECHA, TERC_NIT, SDCA_RTFTE, SDCA_RTIVA, SDCA_RTICA, SDCA_ABONO, SDCA_ABRTFTE, SDCA_ABRTIVA, SDCA_ABRTICA, SDCA_DEBITO, SDCA_MONTO, SDCA_TRM)
            VALUES (NEW.ACDE_TIPODOC, NEW.ACDE_IDDOC, :FEC, :NIT, 0, 0, 0, (NEW.acde_aplicado+NEW.acde_difcambio), NEW.acde_rtfte, NEW.acde_rtiva, NEW.acde_rtica, 'N', 0, :TRM);
            
    /* Registre o actualice el registro en movimiento */
    EXISTE = 'N';
    SELECT 'S' FROM MOVIMIENTO_CLIENTES WHERE MVCL_TIPOREF = 43 AND MVCL_IDREF = NEW.APCL_ID INTO :EXISTE;
    if (EXISTE = 'S') then
        begin
        UPDATE movimiento_clientes
            SET MVCL_MONTO = MVCL_MONTO + NEW.acde_aplicado+NEW.acde_difcambio,
            MVCL_RTEFTE = MVCL_RTEFTE + NEW.acde_rtfte,
            MVCL_RTEIVA = MVCL_RTEIVA + NEW.acde_rtiva,
            MVCL_RTEICA = MVCL_RTEICA + NEW.acde_rtica,
            MVCL_TRM = :TRM
        WHERE MVCL_TIPOREF = 43 AND MVCL_IDREF = NEW.APCL_ID;
        end
    ELSE
        INSERT INTO MOVIMIENTO_CLIENTES (MVCL_ID, TERC_NIT, MVCL_TIPOREF, MVCL_IDREF, MVCL_FECHA, MVCL_VENCE, MVCL_CONC, MVCL_MONTO, MVCL_RTEFTE, MVCL_RTEIVA, MVCL_RTEICA, MVCL_DEBITO, MVCL_ABONO, MVCL_PREFref, MVCL_NUMREF, MVCL_SUCURSAL, COBR_COD, MVCL_TRM)
            VALUES (GEN_ID(ID_MOVCLI, 1), :NIT, 43, NEW.APCL_ID, :FEC, :FEC, :CONCEPTO, (NEW.ACDE_APLICADO+NEW.acde_difcambio), NEW.ACDE_RTFTE, NEW.ACDE_RTIVA, NEW.ACDE_RTICA, 'N', 'S', :PREFIJO, :NUMERO, :SUCURSAL, :COBR, :TRM);
    end
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER APLICACION_PROVEDOR_BI FOR APLICACION_PROVEDOR
ACTIVE BEFORE INSERT POSITION 0
AS
declare variable NUMERO VARCHAR(6);
declare variable AUTOM CHAR(1);
declare variable EXISTE CHAR(1);
BEGIN
if (NEW.numok = 'N') then
  BEGIN
  /* Actualice el contador del prefijo */
  SELECT PREF_ACTUAL, PREF_AUTO FROM PREFIJOS WHERE TIDO_COD = NEW.TIDO_COD AND PREF_PRE = NEW.PREF_PRE INTO :NUMERO, :AUTOM;
  /* ACTUALICE EL NUMERO EN COMPROBANTE_ENCABEZADO  */
  if (AUTOM = 'S') then
    BEGIN
    NEW.APPR_NUMERO = NUMERO;
    NUMERO = CAST((CAST(NUMERO AS INTEGER) + 1) AS CHAR(6));
    UPDATE PREFIJOS
      SET PREF_ACTUAL = :NUMERO
    WHERE TIDO_COD = NEW.TIDO_COD AND PREF_PRE = NEW.PREF_PRE;
    END
  ELSE
    BEGIN
    if (CAST(NUMERO AS INTEGER) = CAST(NEW.APPR_NUMERO AS INTEGER)) then
        UPDATE PREFIJOS
          SET PREF_ACTUAL = CAST((CAST(PREF_ACTUAL AS INTEGER) + 1) AS CHAR(6))
        WHERE TIDO_COD = NEW.TIDO_COD AND PREF_PRE = NEW.PREF_PRE;
    END
  EXECUTE PROCEDURE completa_ceros (NEW.APPR_numero) returning_values (NEW.APPR_numero);
  NEW.numok = 'S';
  END
/* Verifique que el numero no existe previamente */
EXISTE = 'N';
SELECT 'S' FROM APLICACION_PROVEDOR WHERE PREF_PRE = NEW.PREF_PRE AND APPR_NUMERO = NEW.APPR_NUMERO INTO :EXISTE;
if (EXISTE = 'S') then
    EXCEPTION DOCUMENTO_REGISTRADO 'Ya existe una aplicación con el número ' || new.pref_pre || new.appr_numero;
if ((NEW.appr_trm IS NULL) or (new.appr_trm = 0))  then
    NEW.appr_trm = 1;
END
^

SET TERM ; ^

SET TERM ^ ;

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

SET TERM ; ^

SET TERM ^ ;

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

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

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

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER ARTICULO_BD FOR ARTICULO
ACTIVE BEFORE DELETE POSITION 0
AS
declare variable existe integer;
BEGIN
  /* Verifique que no tenga movimiento */
  existe = 0;
  select count(arti_cod) from movimiento_articulo where arti_cod = old.arti_cod into :existe;
  if (existe > 0) then
    exception articulo_con_movimientos 'El artículo ' || old.arti_cod || ' tiene movimientos registrados.';
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER ARTICULO_BI FOR ARTICULO
ACTIVE BEFORE INSERT POSITION 0
AS
declare variable existe char(1);
BEGIN
new.arti_fecha = cast('now' as DATE);
/* Verifique que el codigo no se repita */
existe = 'N';
select 'S' from articulo where arti_cod = new.arti_cod into :existe;
if (existe = 'S') then
    exception ARTICULO_REGISTRADO 'Ya existe un artículo con el código ' || new.arti_cod;
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER ARTICULO_BU FOR ARTICULO
ACTIVE BEFORE UPDATE POSITION 0
AS
declare variable numrows integer;
BEGIN
new.arti_fecha = cast('now' as DATE);
  /* que no cambie el tipo de existencias si existen movimientos */
  if (new.arti_exist <> old.arti_exist) then
    begin
    select count(arti_cod) from movimiento_articulo where arti_cod = new.arti_cod into :numrows;
    if (numrows > 0) then
        exception articulo_con_movimientos 'El artículo ' || new.arti_cod || ' tiene movimientos registrados.';
    end
  /* si tiene mov. no permita cambiarla */
  if ((new.arti_unidad <> old.arti_unidad)) then
    begin
    select count(arpr_item) from articulos_producto where arpr_comp = new.arti_cod and arpr_unidad = old.arti_unidad into :numrows;
    if (numrows > 0) then
        exception unidad_con_mov 'La unidad ' || new.arti_unidad || ' del artículo ' || new.arti_cod || ' fue usada en la composición de un producto.' ;
    select count(ende_item) from entradas_detalle where arti_cod = new.arti_cod and ende_unidad = old.arti_unidad into :numrows;
    if (numrows > 0) then
        exception unidad_con_mov 'La unidad ' || new.arti_unidad || ' del artículo ' || new.arti_cod || ' fue usada en una entrada.' ;
    select count(sade_item) from salidas_detalle where arti_cod = new.arti_cod and sade_unidad = old.arti_unidad into :numrows;
    if (numrows > 0) then
        exception unidad_con_mov 'La unidad ' || new.arti_unidad || ' del artículo ' || new.arti_cod || ' fue usada en una salida.' ;
    select count(tras_item) from trasferencias_detalle where arti_cod = new.arti_cod and tras_unidad = old.arti_unidad into :numrows;
    if (numrows > 0) then
        exception unidad_con_mov 'La unidad ' || new.arti_unidad || ' del artículo ' || new.arti_cod || ' fue usada en un traslado.' ;
    select count(ajus_item) from ajustes_detalle where arti_cod = new.arti_cod and ajus_unidad = old.arti_unidad into :numrows;
    if (numrows > 0) then
        exception unidad_con_mov 'La unidad ' || new.arti_unidad || ' del artículo ' || new.arti_cod || ' fue usada en un ajuste.' ;
    select count(esde_item) from ensambles_detalle where arti_cod = new.arti_cod and esde_unidad = old.arti_unidad into :numrows;
    if (numrows > 0) then
        exception unidad_con_mov 'La unidad ' || new.arti_unidad || ' del artículo ' || new.arti_cod || ' fue usada en un ensamble.' ;
    select count(dese_item) from desensambles_detalle where arti_cod = new.arti_cod and dede_unidad = old.arti_unidad into :numrows;
    if (numrows > 0) then
        exception unidad_con_mov 'La unidad ' || new.arti_unidad || ' del artículo ' || new.arti_cod || ' fue usada en un desensamble.' ;
    select count(rsde_item) from reservas_detalle where arti_cod = new.arti_cod and rsde_unidad = old.arti_unidad into :numrows;
    if (numrows > 0) then
        exception unidad_con_mov 'La unidad ' || new.arti_unidad || ' del artículo ' || new.arti_cod || ' fue usada en una reserva.' ;
    select count(orid_item) from ordeninventario_detalle where arti_cod = new.arti_cod and orid_unidad = old.arti_unidad into :numrows;
    if (numrows > 0) then
        exception unidad_con_mov 'La unidad ' || new.arti_unidad || ' del artículo ' || new.arti_cod || ' fue usada en una orden.' ;
    select count(fcde_item) from facturas_compras_detalle where arti_cod = new.arti_cod and fcde_unidad = old.arti_unidad into :numrows;
    if (numrows > 0) then
        exception unidad_con_mov 'La unidad ' || new.arti_unidad || ' del artículo ' || new.arti_cod || ' fue usada en una factura de compra.' ;
    select count(rpvd_item) from remision_proveedor_det where arti_cod = new.arti_cod and rpvd_unidad = old.arti_unidad into :numrows;
    if (numrows > 0) then
        exception unidad_con_mov 'La unidad ' || new.arti_unidad || ' del artículo ' || new.arti_cod || ' fue usada en una remisión de proveedor.' ;
    select count(dvcd_item) from devoluciones_compras_det where arti_cod = new.arti_cod and dvcd_unidad = old.arti_unidad into :numrows;
    if (numrows > 0) then
        exception unidad_con_mov 'La unidad ' || new.arti_unidad || ' del artículo ' || new.arti_cod || ' fue usada en una devolución en compras.' ;
    select count(fade_item) from facturas_detalle where arti_cod = new.arti_cod and fade_unidad = old.arti_unidad into :numrows;
    if (numrows > 0) then
        exception unidad_con_mov 'La unidad ' || new.arti_unidad || ' del artículo ' || new.arti_cod || ' fue usada en una factura.' ;
    select count(rvde_item) from remisiones_venta_detalle where arti_cod = new.arti_cod and rvde_unidad = old.arti_unidad into :numrows;
    if (numrows > 0) then
        exception unidad_con_mov 'La unidad ' || new.arti_unidad || ' del artículo ' || new.arti_cod || ' fue usada en una remisión a cliente.' ;
    select count(dvde_item) from devoluciones_ventas_detalle where arti_cod = new.arti_cod and dvde_unidad = old.arti_unidad into :numrows;
    if (numrows > 0) then
        exception unidad_con_mov 'La unidad ' || new.arti_unidad || ' del artículo ' || new.arti_cod || ' fue usada una devolución en ventas.' ;
    end
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER CAMBIODOC_ENTRADAS_AI FOR CAMBIODOC_ENTRADAS
ACTIVE AFTER INSERT POSITION 0
AS
declare variable PREF VARCHAR(4);
declare variable NUMERO VARCHAR(6);
declare variable CAJA INTEGER;
declare variable FEC DATE;
declare variable CONC VARCHAR(60);
declare variable EXISTE CHAR(1);
declare variable VALFP char(2);
BEGIN
if ((NEW.CADO_ID <> 0) AND (NEW.CDEN_ANULADO = 'N')) then
    BEGIN
    EXECUTE PROCEDURE LEE_CONFIGURACION('BANCOS','CONSIGNACIONES','VALIDAR FORMAS DE PAGO EN CAJA') RETURNING_VALUES (VALFP);
    SELECT PREF_PRE, CADO_NUMERO, CADO_FECHA, CADO_CONC, CAJA_ID
        FROM CAMBIO_DOCUMENTOS WHERE CADO_ID = NEW.CADO_ID INTO :PREF, :numero, :FEC, :CONC, :CAJA;
    select 'S' from movimiento_caja where moca_tiporef = 63 and moca_idref = new.cado_id and caja_id = :CAJA into :Existe;
    if (Existe = 'S') then
        begin
        update movimiento_caja
            set moca_creditos = moca_creditos + new.cden_monto
            where moca_tiporef = 63 and moca_idref = new.cado_id and caja_id = :CAJA;
        end
    else
        INSERT INTO MOVIMIENTO_CAJA
            (MOCA_ID, CAJA_ID, MOCA_TIPOREF, MOCA_PREFREF, MOCA_NUMREF, MOCA_FECHA, MOCA_CONC, MOCA_DEBITOS, MOCA_CREDITOS, MOCA_DB, MOCA_IDREF)
            VALUES(GEN_ID(ID_MOVCAJA,1), :CAJA, 63, :Pref, :Numero, :Fec, :Conc, 0, NEW.cden_monto, 'N', new.cado_id);
        
    /* ACTUALICE LA SALIDA DEL DOCUMENTO */
    if (NEW.FOPA_ID <> 1) then
      BEGIN
      EXISTE = 'N';
      SELECT 'S' FROM DOCUMENTOS_PAGO_CAJA WHERE FOPA_ID = NEW.FOPA_ID AND DPCA_BANCO = NEW.CDEN_BANCO AND DPCA_CUENTA = NEW.CDEN_CUENTA AND
            DPCA_NUMERO = NEW.CDEN_NUMERO AND DPCA_TIPOSAL = 0 AND DPCA_IDSAL = 0 INTO :EXISTE;
      if (EXISTE = 'S') then
        UPDATE DOCUMENTOS_PAGO_CAJA
            SET DPCA_TIPOSAL = 63, DPCA_IDSAL = NEW.cado_id
            WHERE FOPA_ID = NEW.FOPA_ID AND DPCA_BANCO = NEW.CDEN_BANCO AND DPCA_CUENTA = NEW.CDEN_CUENTA AND
            DPCA_NUMERO = NEW.CDEN_NUMERO AND DPCA_TIPOSAL = 0 AND DPCA_IDSAL = 0 AND DPCA_MONTO = NEW.cden_monto;
      ELSE
        IF (VALFP = 'SI') THEN
          EXCEPTION documento_pago_salido 'La forma de pago ' || new.cden_banco || ' ' || new.cden_cuenta || ' ' || new.cden_numero || ' no se encuentra en la caja.';
      END
    ELSE
        EXECUTE PROCEDURE RESTE_SALDO_EFECTIVO(:CAJA, :FEC, NEW.CDEN_MONTO, 'N');
    END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER CAMBIODOC_SALIDAS_BI FOR CAMBIODOC_SALIDAS
ACTIVE BEFORE INSERT POSITION 0
as
declare variable CAJA INTEGER;
declare variable NUMROWS INTEGER;
begin
/* NO PERMITA UNA FORMA DE PAGO REPETIDA */
if (NEW.fopa_id <> 1) then
    BEGIN
    SELECT CAJA_ID FROM cambio_documentos WHERE cado_id = NEW.cado_id INTO :CAJA;
    SELECT COUNT(*) FROM documentos_pago_caja WHERE caja_id = :CAJA AND fopa_id = new.fopa_id and dpca_banco = NEW.cdsa_banco AND
        dpca_cuenta = NEW.cdsa_cuenta AND dpca_numero = NEW.cdsa_numero AND dpca_tiposal = 0 and dpca_idsal = 0
        INTO :NUMROWS;
    if (numrows > 0) then
        exception documento_pago_salido 'La forma de pago ' || new.cdsa_banco || ' ' || new.cdsa_cuenta || ' ' || new.cdsa_numero || ' ya existe en la caja.';
    END
end
^

SET TERM ; ^

SET TERM ^ ;

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

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER CENTROS_BD FOR CENTROS
ACTIVE BEFORE DELETE POSITION 0
as
declare variable NUMROWS INTEGER;
begin
SELECT COUNT(ENCO_CONSEC) FROM COMPROBANTE_DETALLE WHERE PROY_COD = OLD.proy_cod AND CENT_COD = OLD.cent_cod INTO :NUMROWS;
if (NUMROWS > 0) then
    exception centro_con_movimiento 'El centro de costos ' || old.proy_cod || '-' || old.cent_cod || ' tiene movimientos registrados.';
end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER CHEQUES_BI FOR CHEQUES
ACTIVE BEFORE INSERT POSITION 0
AS
declare variable NUMERO VARCHAR(8);
declare variable AUTOM CHAR(1);
declare variable EXISTE CHAR(1);
BEGIN
if (NEW.NUMOK = 'N') then
  BEGIN
  /* Actualice el contador del prefijo */
  SELECT PRBA_NUMERO, PRBA_AUTO FROM PREFIJOS_BANCOS WHERE TIDO_COD = 72 AND cuba_cod = new.cuba_cod and PRBA_PREF = NEW.PRBA_PREF INTO :NUMERO, :AUTOM;
  /* ACTUALICE EL NUMERO EN COMPROBANTE_ENCABEZADO */
  if (AUTOM = 'S') then
    BEGIN
    NEW.CHEQ_NUMERO = NUMERO;
    NUMERO = CAST((CAST(NUMERO AS INTEGER) + 1) AS CHAR(6));
    UPDATE PREFIJOS_BANCOS
      SET PRBA_NUMERO = :NUMERO
    WHERE TIDO_COD = 72 AND cuba_cod = new.cuba_cod and PRBA_PREF = NEW.PRBA_PREF;
    END
  ELSE
    BEGIN
    if (CAST(NUMERO AS INTEGER) = CAST(NEW.CHEQ_NUMERO AS INTEGER)) then
        UPDATE PREFIJOS_BANCOS
          SET PRBA_NUMERO = CAST((CAST(PRBA_NUMERO AS INTEGER) + 1) AS CHAR(6))
        WHERE TIDO_COD = 72 AND cuba_cod = new.cuba_cod and PRBA_PREF = NEW.PRBA_PREF;
    END
  EXECUTE PROCEDURE COMPLETA_CEROS(NEW.CHEQ_numero) returning_values (NEW.CHEQ_numero);
  NEW.NUMOK = 'S';
  END
/* Verifique que el numero no existe previamente */
EXISTE = 'N';
SELECT 'S' FROM CHEQUES WHERE PRBA_PREF = NEW.PRBA_PREF AND cuba_cod = new.cuba_cod and CHEQ_NUMERO = NEW.CHEQ_NUMERO INTO :EXISTE;
if (EXISTE = 'S') then
    EXCEPTION DOCUMENTO_REGISTRADO 'Ya existe un cheque con el número ' || new.prba_pref || new.cheq_numero;
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER CLIENTES_BD FOR CLIENTES
ACTIVE BEFORE DELETE POSITION 0
AS
declare variable numrec integer;
BEGIN
  /* Verifique que no tenga movimientos */
  select count(*) from movimiento_clientes where terc_nit = old.terc_nit into :numrec;
  if (numrec > 0) then
    Exception cliente_con_movimiento 'El cliente ' || old.terc_nit || ' tiene movimientos registrados.';
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER COBRADORES_BD FOR COBRADORES
ACTIVE BEFORE DELETE POSITION 0
as
declare variable NUMROWS INTEGER;
begin
SELECT COUNT(*) FROM recibos_caja WHERE COBR_COD = OLD.cobr_cod INTO :NUMROWS;
if (NUMROWS = 0) then
    SELECT COUNT(*) FROM notas_debito_clientes WHERE COBR_COD = OLD.cobr_cod INTO :NUMROWS;
if (NUMROWS = 0) then
    SELECT COUNT(*) FROM notas_credito_clientes WHERE COBR_COD = OLD.cobr_cod INTO :NUMROWS;
if (NUMROWS > 0) then
    EXCEPTION cobrador_movimiento 'El cobrador ' || old.cobr_cod || ' tiene movimientos registrados.';
end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER COMPROBANTE_ENCABEZADO_BD FOR COMPROBANTE_ENCABEZADO
ACTIVE BEFORE DELETE POSITION 0
as
declare variable fecblo varchar(8);
begin
EXECUTE PROCEDURE LEE_CONFIGURACION ('CONTABILIDAD', 'GENERAL', 'FECHA DE BLOQUEO') RETURNING_VALUES (:FECBLO); 
IF (old.ENCO_FECHA < FECBLO) THEN
    EXCEPTION CONTABILIDAD_BLOQUEADA 'La contabilidad esta bloqueada a ' || :FECBLO;
end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER COMPROBANTE_ENCABEZADO_BI FOR COMPROBANTE_ENCABEZADO
ACTIVE BEFORE INSERT POSITION 0
AS
DECLARE VARIABLE FECBLO CHAR(8);
declare variable ANO INTEGER;
declare variable mes INTEGER;
declare variable dia INTEGER;
declare variable DIASMAX INTEGER;
declare variable EXISTE INTEGER;
declare variable NUMERO CHAR(8);
declare variable AUTOM CHAR(1);
declare variable ANOINI CHAR(4);
declare variable MESINI CHAR(2);
declare variable VALFECHA CHAR(1);
BEGIN
/* VERIFIQUE QUE LA FECHA SEA VALIDA (POSTERIOR AL BLOQUEO) */
EXECUTE PROCEDURE LEE_CONFIGURACION ('CONTABILIDAD', 'GENERAL', 'FECHA DE BLOQUEO') RETURNING_VALUES (:FECBLO); 
IF (NEW.ENCO_FECHA < FECBLO) THEN
    EXCEPTION CONTABILIDAD_BLOQUEADA 'La contabilidad esta bloqueada a ' || :fecblo;
ELSE
    BEGIN
    /* VERIFIQUE QUE SEA UN DIA VALIDO (P.E. RECHACE FEBRERO 30) */
    ANO = CAST(SUBSTR(NEW.ENCO_FECHA,  1, 4) AS INTEGER);
    MES = CAST(SUBSTR(NEW.ENCO_FECHA,  5, 6) AS INTEGER);
    DIA = CAST(SUBSTR(NEW.ENCO_FECHA,  7, 8) AS INTEGER);
    execute procedure dias_mes(MES, ANO) returning_values (DIASMAX);
    if (DIA > DIASMAX) then
        EXCEPTION FECHA_NO_VALIDA 'La fecha ' || new.enco_fecha || ' no es una fecha valida.';
    ELSE
        BEGIN
        /* VALIDE QUE NO SE ANTERIOR AL INICIO DE LA COMPANIA */
        VALFECHA = 'N';
        EXECUTE PROCEDURE LEE_CONFIGURACION ('CONTABILIDAD', 'GENERAL', 'AÑO DE INICIO') RETURNING_VALUES (:ANOINI);
        if (CAST(ANOINI AS INTEGER) < ANO) then
            VALFECHA = 'S';
        else
            if (CAST(ANOINI AS INTEGER) = ANO) then
                BEGIN
                EXECUTE PROCEDURE LEE_CONFIGURACION ('CONTABILIDAD', 'GENERAL', 'MES DE INICIO') RETURNING_VALUES (:MESINI);
                if (CAST(MESINI AS INTEGER) <= MES) then
                    VALFECHA = 'S';
                END
        if (VALFECHA = 'N') then
            EXCEPTION fecha_anterior_inicio;

        /* ACTUALICE EL PREFIJO */
        SELECT PREF_NUMERO, PRCO_AUTO FROM PREFIJOS_CONTA WHERE TICO_COD = NEW.TICO_COD AND PRCO_PREF = NEW.PRCO_PREF INTO :NUMERO, :AUTOM;
        if ((AUTOM = 'S') or (CAST(NUMERO AS INTEGER) = CAST(NEW.ENCO_NUMERO AS INTEGER))) then
            BEGIN
            NEW.ENCO_NUMERO = :NUMERO;
            NUMERO = CAST((CAST(NUMERO AS INTEGER) + 1) AS CHAR(6));
            EXECUTE PROCEDURE COMPLETA_CEROS (NUMERO) returning_values(NUMERO);
            UPDATE PREFIJOS_CONTA
                SET PREF_NUMERO = :NUMERO
                WHERE TICO_COD = NEW.TICO_COD AND PRCO_PREF = NEW.PRCO_PREF;
            END
        /* Verifique que el numero no existe previamente */
        SELECT COUNT(*) FROM comprobante_encabezado WHERE TICO_COD = NEW.tico_cod AND PRCO_PREF = NEW.prco_pref AND ENCO_NUMERO = NEW.enco_numero INTO :EXISTE;
        if (EXISTE > 0) then
            EXCEPTION COMPROBANTE_REGISTRADO 'Ya existe un comprobante contable con el número ' || new.tico_cod || ' ' || new.prco_pref || new.enco_numero;
        END
    END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER CONCILIACION_ENCABEZADO_BI FOR CONCILIACION_ENCABEZADO
ACTIVE BEFORE INSERT POSITION 0
as
declare variable NUMERO VARCHAR(6);
declare variable AUTOM CHAR(1);
declare variable EXISTE CHAR(1);
BEGIN
/* Actualice el contador del prefijo */
SELECT PRBA_NUMERO, PRBA_AUTO FROM PREFIJOS_BANCOS
    WHERE TIDO_COD = 80 AND CUBA_COD = NEW.CUBA_COD AND PRBA_PREF = NEW.cobn_prefijo INTO :NUMERO, :AUTOM;
/* ACTUALICE EL NUMERO EN COMPROBANTE_ENCABEZADO */
if (AUTOM = 'S') then
    BEGIN
    NEW.cobn_numero = NUMERO;
    NUMERO = CAST((CAST(NUMERO AS INTEGER) + 1) AS CHAR(6));
    UPDATE PREFIJOS_BANCOS
      SET PRBA_NUMERO = :NUMERO
    WHERE TIDO_COD = 80 AND CUBA_COD = NEW.CUBA_COD AND PRBA_PREF = NEW.cobn_prefijo;
    END
ELSE
    BEGIN
    if (CAST(NUMERO AS INTEGER) = CAST(NEW.cobn_numero AS INTEGER)) then
        UPDATE PREFIJOS_BANCOS
          SET PRBA_NUMERO = CAST((CAST(PRBA_NUMERO AS INTEGER) + 1) AS CHAR(6))
        WHERE TIDO_COD = 80 AND CUBA_COD = NEW.CUBA_COD AND PRBA_PREF = NEW.cobn_prefijo;
    END
EXECUTE PROCEDURE COMPLETA_CEROS (NEW.cobn_numero) returning_values (NEW.cobn_numero);
/* Verifique que el numero no existe previamente */
EXISTE = 'N';
SELECT 'S' FROM conciliacion_encabezado
    WHERE CUBA_COD = NEW.CUBA_COD AND COBN_PREFIJO = NEW.cobn_prefijo AND COBN_NUMERO = NEW.cobn_numero INTO :EXISTE;
if (EXISTE = 'S') then
    EXCEPTION DOCUMENTO_REGISTRADO 'Ya existe una conciliación con el número ' || new.cobn_prefijo || new.cobn_numero;
end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER CONSIGNA_BI FOR CONSIGNA
ACTIVE BEFORE INSERT POSITION 0
AS
declare variable NUMERO VARCHAR(6);
declare variable AUTOM CHAR(1);
declare variable EXISTE CHAR(1);
BEGIN
if (NEW.numok = 'N') then
  BEGIN
  /* Actualice el contador del prefijo */
  SELECT PRBA_NUMERO, PRBA_AUTO FROM PREFIJOS_BANCOS WHERE TIDO_COD = 71 AND CUBA_COD = NEW.cuba_cod AND PRBA_PREF = NEW.PRBA_PREF INTO :NUMERO, :AUTOM;
  /* ACTUALICE EL NUMERO EN COMPROBANTE_ENCABEZADO */
  if (AUTOM = 'S') then
    BEGIN
    NEW.CONS_NUMERO = NUMERO;
    NUMERO = CAST((CAST(NUMERO AS INTEGER) + 1) AS CHAR(6));
    UPDATE PREFIJOS_BANCOS
      SET PRBA_NUMERO = :NUMERO
    WHERE TIDO_COD = 71 AND CUBA_COD = NEW.CUBA_COD AND PRBA_PREF = NEW.PRBA_PREF;
    END
  ELSE
    BEGIN
    if (CAST(NUMERO AS INTEGER) = CAST(NEW.CONS_NUMERO AS INTEGER)) then
        UPDATE PREFIJOS_BANCOS
          SET PRBA_NUMERO = CAST((CAST(PRBA_NUMERO AS INTEGER) + 1) AS CHAR(6))
        WHERE TIDO_COD = 71 AND CUBA_COD = NEW.CUBA_COD AND PRBA_PREF = NEW.PRBA_PREF;
    END
  EXECUTE PROCEDURE COMPLETA_CEROS (NEW.CONS_numero) returning_values (NEW.CONS_numero);
  NEW.numok = 'S';
  END
/* Verifique que el numero no existe previamente */
EXISTE = 'N';
SELECT 'S' FROM CONSIGNA
    WHERE PRBA_PREF = NEW.PRBA_PREF AND CUBA_COD = NEW.CUBA_COD AND CONS_NUMERO = NEW.CONS_NUMERO INTO :EXISTE;
if (EXISTE = 'S') then
    EXCEPTION DOCUMENTO_REGISTRADO 'Ya existe una consignación con el número ' || new.prba_pref || new.cons_numero;
END
^

SET TERM ; ^

SET TERM ^ ;

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

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

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER CONSIGNA_TARJETAS_BI FOR CONSIGNA_TARJETAS
ACTIVE BEFORE INSERT POSITION 0
AS
declare variable NUMERO VARCHAR(6);
declare variable AUTOM CHAR(1);
declare variable EXISTE CHAR(1);
BEGIN
if (NEW.numok = 'N') then
  BEGIN
  /* Actualice el contador del prefijo */
  SELECT PREF_ACTUAL, PREF_AUTO FROM PREFIJOS WHERE TIDO_COD = 64 AND PREF_PRE = NEW.PREF_PRE INTO :NUMERO, :AUTOM;
  /* ACTUALICE EL NUMERO EN COMPROBANTE_ENCABEZADO  */
  if (AUTOM = 'S') then
    BEGIN
    NEW.COTJ_NUMERO = NUMERO;
    NUMERO = CAST((CAST(NUMERO AS INTEGER) + 1) AS CHAR(6));
    UPDATE PREFIJOS
      SET PREF_ACTUAL = :NUMERO
    WHERE TIDO_COD = 64 AND PREF_PRE = NEW.PREF_PRE;
    END
  ELSE
    BEGIN
    if (CAST(NUMERO AS INTEGER) = CAST(NEW.COTJ_NUMERO AS INTEGER)) then
        UPDATE PREFIJOS
          SET PREF_ACTUAL = CAST((CAST(PREF_ACTUAL AS INTEGER) + 1) AS CHAR(6))
        WHERE TIDO_COD = 64 AND PREF_PRE = NEW.PREF_PRE;
    END
  EXECUTE PROCEDURE COMPLETA_CEROS (NEW.COTJ_numero) returning_values (NEW.COTJ_numero);
  NEW.numok = 'S';
  END
/* Verifique que el numero no existe previamente */
EXISTE = 'N';
SELECT 'S' FROM CONSIGNA_TARJETAS WHERE PREF_PRE = NEW.PREF_PRE AND COTJ_NUMERO = NEW.COTJ_NUMERO INTO :EXISTE;
if (EXISTE = 'S') then
    EXCEPTION DOCUMENTO_REGISTRADO 'Ya existe una consignación con el número ' || new.pref_pre || new.cotj_numero;
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER CONSUMOS_BI FOR CONSUMOS
ACTIVE BEFORE INSERT POSITION 0
AS
declare variable NUMERO VARCHAR(6);
declare variable AUTOM CHAR(1);
declare variable EXISTE CHAR(1);
BEGIN
if (NEW.numok = 'N') then
  BEGIN
  /* Actualice el contador del prefijo */
  SELECT PREF_ACTUAL, PREF_AUTO FROM PREFIJOS WHERE TIDO_COD = 32 AND PREF_PRE = NEW.PREF_PRE INTO :NUMERO, :AUTOM;
  /* ACTUALICE EL NUMERO EN COMPROBANTE_ENCABEZADO  */
  if (AUTOM = 'S') then
    BEGIN
    NEW.CONS_NUMERO = NUMERO;
    NUMERO = CAST((CAST(NUMERO AS INTEGER) + 1) AS CHAR(6));
    UPDATE PREFIJOS
      SET PREF_ACTUAL = :NUMERO
    WHERE TIDO_COD = 32 AND PREF_PRE = NEW.PREF_PRE;
    END
  ELSE
    BEGIN
    if (CAST(NUMERO AS INTEGER) = CAST(NEW.CONS_NUMERO AS INTEGER)) then
        UPDATE PREFIJOS
          SET PREF_ACTUAL = CAST((CAST(PREF_ACTUAL AS INTEGER) + 1) AS CHAR(6))
        WHERE TIDO_COD = 32 AND PREF_PRE = NEW.PREF_PRE;
    END
  EXECUTE PROCEDURE COMPLETA_CEROS (NEW.CONS_numero) returning_values (NEW.CONS_numero);
  NEW.numok = 'S';
  END
/* Verifique que el numero no existe previamente */
EXISTE = 'N';
SELECT 'S' FROM CONSUMOS WHERE PREF_PRE = NEW.PREF_PRE AND CONS_NUMERO = NEW.CONS_NUMERO INTO :EXISTE;
if (EXISTE = 'S') then
    EXCEPTION DOCUMENTO_REGISTRADO 'Ya existe un consumo con el número ' || new.pref_pre || new.cons_numero;
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER COTIZACIONES_BI FOR COTIZACIONES
ACTIVE BEFORE INSERT POSITION 0
AS
declare variable NUMERO VARCHAR(6);
declare variable AUTOM CHAR(1);
declare variable EXISTE CHAR(1);
declare variable FECSERVER CHAR(2);
BEGIN
EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION', 'DOCUMENTOS', 'INHABILITAR FECHA EN DOCUMENTOS') returning_values (:fecserver);
if (FECSERVER = 'SI') then
    NEW.coti_fecha = CAST ('NOW' AS DATE);
if (NEW.numok = 'N') then
  BEGIN
  /* Actualice el contador del prefijo */
  SELECT PREF_ACTUAL, PREF_AUTO FROM PREFIJOS WHERE TIDO_COD = 35 AND PREF_PRE = NEW.PREF_PRE INTO :NUMERO, :AUTOM;
  /* ACTUALICE EL NUMERO EN COMPROBANTE_ENCABEZADO  */
  if (AUTOM = 'S') then
    BEGIN
    NEW.COTI_NUMERO = NUMERO;
    NUMERO = CAST((CAST(NUMERO AS INTEGER) + 1) AS CHAR(6));
    UPDATE PREFIJOS
      SET PREF_ACTUAL = :NUMERO
    WHERE TIDO_COD = 35 AND PREF_PRE = NEW.PREF_PRE;
    END
  ELSE
    BEGIN
    if (CAST(NUMERO AS INTEGER) = CAST(NEW.COTI_NUMERO AS INTEGER)) then
        UPDATE PREFIJOS
          SET PREF_ACTUAL = CAST((CAST(PREF_ACTUAL AS INTEGER) + 1) AS CHAR(6))
        WHERE TIDO_COD = 35 AND PREF_PRE = NEW.PREF_PRE;
    END
  EXECUTE procedure completa_ceros (NEW.COTI_numero) returning_values (NEW.COTI_numero);
  NEW.numok = 'S';
  END
/* Verifique que el numero no existe previamente */
EXISTE = 'N';
SELECT 'S' FROM COTIZACIONES WHERE PREF_PRE = NEW.PREF_PRE AND COTI_NUMERO = NEW.COTI_NUMERO INTO :EXISTE;
if (EXISTE = 'S') then
    EXCEPTION DOCUMENTO_REGISTRADO 'Ya existe una cotización con el número ' || new.pref_pre || new.coti_numero;
if ((new.COTI_TOTAL-new.COTI_IVAMONTO+new.COTI_DTOMONTO-new.COTI_ADICIONAL) = 0) then
    NEW.COTI_FACTOR = 1;
else
    NEW.COTI_FACTOR = (new.COTI_TOTAL-new.COTI_IVAMONTO)/(new.COTI_TOTAL-new.COTI_IVAMONTO+new.COTI_DTOMONTO-new.COTI_ADICIONAL);
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER COTIZACION_PROVEEDOR_BI FOR COTIZACION_PROVEEDOR
ACTIVE BEFORE INSERT POSITION 0
AS
declare variable NUMERO VARCHAR(6);
declare variable AUTOM CHAR(1);
declare variable EXISTE CHAR(1);
BEGIN
if (NEW.numok = 'N') then
  BEGIN
  /* Actualice el contador del prefijo */
  SELECT PREF_ACTUAL, PREF_AUTO FROM PREFIJOS WHERE TIDO_COD = 25 AND PREF_PRE = NEW.PREF_PRE INTO :NUMERO, :AUTOM;
  /* ACTUALICE EL NUMERO EN COMPROBANTE_ENCABEZADO  */
  if (AUTOM = 'S') then
    BEGIN
    NEW.COPR_NUMERO = NUMERO;
    NUMERO = CAST((CAST(NUMERO AS INTEGER) + 1) AS CHAR(6));
    UPDATE PREFIJOS
      SET PREF_ACTUAL = :NUMERO
    WHERE TIDO_COD = 25 AND PREF_PRE = NEW.PREF_PRE;
    END
  ELSE
    BEGIN
    if (CAST(NUMERO AS INTEGER) = CAST(NEW.COPR_NUMERO AS INTEGER)) then
        UPDATE PREFIJOS
          SET PREF_ACTUAL = CAST((CAST(PREF_ACTUAL AS INTEGER) + 1) AS CHAR(6))
        WHERE TIDO_COD = 25 AND PREF_PRE = NEW.PREF_PRE;
    END
  EXECUTE procedure COMPLETA_CEROS (NEW.COPR_numero) returning_values (NEW.COPR_numero);
  NEW.numok = 'S';
  END
/* Verifique que el numero no existe previamente */
EXISTE = 'N';
SELECT 'S' FROM COTIZACION_PROVEEDOR WHERE PREF_PRE = NEW.PREF_PRE AND COPR_NUMERO = NEW.COPR_NUMERO INTO :EXISTE;
if (EXISTE = 'S') then
    EXCEPTION DOCUMENTO_REGISTRADO 'Ya existe una cotización con el número ' || new.pref_pre || new.copr_numero;
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER DESENSAMBLES_BI FOR DESENSAMBLES
ACTIVE BEFORE INSERT POSITION 0
AS
declare variable NUMERO VARCHAR(8);
declare variable AUTOM CHAR(1);
declare variable EXISTE CHAR(1);
BEGIN
if (NEW.numok = 'N') then
  BEGIN
  /* Actualice el contador del prefijo */
  SELECT PREF_ACTUAL, PREF_AUTO FROM PREFIJOS WHERE TIDO_COD = NEW.TIDO_COD AND PREF_PRE = NEW.PREF_PRE INTO :NUMERO, :AUTOM;
  if (AUTOM = 'S') then
    BEGIN
    /* ACTUALICE EL NUMERO EN COMPROBANTE_ENCABEZADO  */
    NEW.DESE_NUMERO = NUMERO;
    NUMERO = CAST((CAST(NUMERO AS INTEGER) + 1) AS CHAR(6));
    UPDATE PREFIJOS
      SET PREF_ACTUAL = :NUMERO
    WHERE TIDO_COD = NEW.TIDO_COD AND PREF_PRE = NEW.PREF_PRE;
    END
  ELSE
    begin
    if (CAST(NUMERO AS INTEGER) = CAST(NEW.DESE_NUMERO AS INTEGER)) then
        UPDATE PREFIJOS
          SET PREF_ACTUAL = CAST((CAST(PREF_ACTUAL AS INTEGER) + 1) AS CHAR(6))
        WHERE TIDO_COD = NEW.TIDO_COD AND PREF_PRE = NEW.PREF_PRE;
    end
  EXECUTE PROCEDURE COMPLETA_CEROS (NEW.DESE_numero) returning_values (NEW.DESE_numero);
  NEW.numok = 'S';
  END
/* Verifique que el numero no existe previamente */
EXISTE = 'N';
SELECT 'S' FROM DESENSAMBLES WHERE PREF_PRE = NEW.PREF_PRE AND DESE_NUMERO = NEW.DESE_NUMERO INTO :EXISTE;
if (EXISTE = 'S') then
    EXCEPTION DOCUMENTO_REGISTRADO 'Ya existe un desensamble con el número ' || new.pref_pre || new.dese_numero;
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER DEVOLUCIONES_COMPRAS_AD FOR DEVOLUCIONES_COMPRAS
ACTIVE AFTER DELETE POSITION 0
AS
declare variable ABONOS INTEGER;
declare variable consec INTEGER;
BEGIN
select enco_consec from comprobante_encabezado where enco_tiporef = 24 and enco_idref = old.dvco_id into :consec;
if (NOT consec is null) then
  delete from comprobante_detalle where enco_consec = :consec;
delete from comprobante_encabezado where enco_tiporef = 24 and enco_idref = old.dvco_id;
INSERT INTO AUDITORIA(audi_usuario, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
    VALUES (USER, 24, OLD.dvco_id, 'D', OLD.pref_pre || OLD.dvco_numero);

if ((OLD.dvco_id <> 0) AND (OLD.dvco_anulado = 'N')) then
    BEGIN
    /* Verifique si habia abonos a la nota */
    ABONOS = 0;
    select COUNT(*) FROM saldos_doc_cxpagar WHERE SDCP_TIPOREF = 24 AND SDCP_IDREF = OLD.DVCO_ID AND SDCP_ABONO <> 0 INTO :ABONOS;
    if (ABONOS = 0) then
        BEGIN
        /* BORRE EL REGISTRO PREVIO */
        delete from saldos_doc_cxpagar where sdcp_tiporef = 24 and sdcp_idref = old.dvco_id;
        delete from movimiento_proveedor where (mvpr_tiporef = 24) and (mvpr_idref = old.dvco_id);
        /* ACTUALICE LA CONSOLIDACION */
        if (OLD.DVCO_CONSOLIDA <> 0) then
            UPDATE consolidado_faltantes SET COFA_OK = 'N' WHERE COFA_ID = OLD.dvco_consolida;
        END
    else
        exception DOCUMENTO_CON_ABONOS 'La devolución ' || old.pref_pre || old.dvco_numero || ' tiene abonos registrados.';
    END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER DEVOLUCIONES_COMPRAS_AU FOR DEVOLUCIONES_COMPRAS
ACTIVE AFTER UPDATE POSITION 0
AS
declare variable ABONOS integer;
declare variable CONC VARCHAR(60);
declare variable consec INTEGER;
BEGIN
/* BORRE LA CONTABILIZACION */
if (new.dvco_anulado = 'S') then
    begin
    select enco_consec from comprobante_encabezado where enco_tiporef = 24 and enco_idref = old.dvco_id into :consec;
    if (NOT consec is null) then
      delete from comprobante_detalle where enco_consec = :consec;
    delete from comprobante_encabezado where enco_tiporef = 24 and enco_idref = old.dvco_id;
    INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
        VALUES (USER, 24, NEW.dvco_id, 'A', NEW.pref_pre || NEW.dvco_numero);
    end

/* deshaga lo viejo y gabe lo nuevo*/
if ((old.DVCO_id <> 0) and (old.dvco_anulado = 'N')) then
    begin
    /* Verifique si habia abonos a la nota */
    ABONOS = 0;
    select COUNT(*) FROM saldos_doc_cxpagar WHERE SDCP_TIPOREF = 24 AND SDCP_IDREF = OLD.DVCO_ID AND SDCP_ABONO <> 0 INTO :ABONOS;
    if (ABONOS = 0) then
        BEGIN
        /* BORRE EL REGISTRO PREVIO */
        delete from saldos_doc_cxpagar where sdcp_tiporef = 24 and sdcp_idref = old.dvco_id;
        delete from movimiento_proveedor where (mvpr_tiporef = 24) and (mvpr_idref = old.dvco_id);
        /* ACTUALICE LA CONSOLIDACION */
        if (OLD.DVCO_CONSOLIDA <> 0) then
            UPDATE consolidado_faltantes SET COFA_OK = 'N' WHERE COFA_ID = OLD.dvco_consolida;
        END
    else
        exception DOCUMENTO_CON_ABONOS 'La devolución ' || old.pref_pre || old.dvco_numero || 'tiene abonos registrados.';
    END
/* registre lo nuevo */
if ((new.DVCO_id <> 0) and (new.dvco_anulado = 'N')) then
    begin
    /* Registre el nuevo saldo del documento */
    INSERT INTO saldos_doc_cxpagar (SDCP_TIPOREF, SDCP_IDREF, SDCP_FECHA, TERC_NIT, SDCP_RTEFTE, SDCP_RTIVA, SDCP_RTICA, SDCP_ABONO, SDCP_ABRTFTE, SDCP_ABRTIVA, SDCP_ABRTICA, SDCP_DEBITO, SDCP_MONTO, SDCP_TRM)
        VALUES (24, NEW.DVCO_ID, NEW.DVCO_fecha, NEW.terc_nit, (NEW.DVCO_rtftemonto*-1), (NEW.DVCO_rtivamonto*-1), (NEW.DVCO_rticamonto*-1), 0, 0, 0, 0, 'N', (NEW.DVCO_TOTAL*-1), NEW.dvco_trm);
    /* Registre el movimiento del cliente */
    CONC = 'DEVOLUCION COMPRA No.' || NEW.PREF_PRE || NEW.DVCO_NUMERO;
    INSERT INTO MOVIMIENTO_PROVEEDOR (MVPR_ID, TERC_NIT, MVPR_TIPOREF, MVPR_IDREF, MVPR_FECHA, MVPR_VENCE, MVPR_CONC, MVPR_MONTO, MVPR_RTFTE, MVPR_RTIVA, MVPR_RTICA, MVPR_DEBITO, MVPR_ABONO, MVPR_PREFIJO, MVPR_NUMERO, MVPR_TRM)
        VALUES (GEN_ID(ID_MOVPROV, 1), NEW.TERC_NIT, 24, NEW.DVCO_ID, NEW.DVCO_FECHA, NEW.DVCO_FECHA, :CONC, NEW.DVCO_TOTAL, NEW.DVCO_RTFTEMONTO, NEW.DVCO_RTIVAMONTO, NEW.DVCO_RTICAMONTO, 'N', 'N', NEW.pref_pre, NEW.DVCO_numero, NEW.dvco_trm);
    /* ACTUALICE LA CONSOLIDACION */
    if (NEW.DVCO_CONSOLIDA <> 0) then
        UPDATE consolidado_faltantes SET COFA_IDDES = NEW.dvco_id, COFA_OK = 'S' WHERE COFA_ID = NEW.dvco_consolida;
    INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
        VALUES (USER, 24, NEW.dvco_id, 'U', NEW.pref_pre || NEW.dvco_numero);
    END
/* si cambio un dato critico actualice el detalle */
if ((OLD.dvco_fecha <> NEW.dvco_fecha) or
    (OLD.dvco_numero <> NEW.dvco_numero) or
    (OLD.pref_pre <> NEW.pref_pre) ) then
    UPDATE devoluciones_compras_det SET DVCD_TRANSMIT = 'N'
      WHERE DVCO_ID = OLD.dvco_id;
/* ACTUALICE EL ANULADO EN LOS DETALLES */
if (OLD.DVCO_anulado <> NEW.DVCO_anulado) then
    UPDATE devoluciones_compras_det SET DVCD_ANULADO = NEW.DVCO_anulado
        WHERE DVCO_ID = NEW.DVCO_ID;
if (OLD.dvco_transmit <> NEW.dvco_transmit) then
    UPDATE devoluciones_compras_det SET DVCD_TRANSMIT = NEW.dvco_transmit
        WHERE DVCO_ID = NEW.DVCO_ID;
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER DEVOLUCIONES_COMPRAS_BI FOR DEVOLUCIONES_COMPRAS
ACTIVE BEFORE INSERT POSITION 0
AS
declare variable NUMERO VARCHAR(6);
declare variable AUTOM CHAR(1);
declare variable EXISTE CHAR(1);
declare variable pregtasa CHAR(2);
BEGIN
if (NEW.DVCO_SIMPLIFICADO IS NULL) then
    NEW.dvco_simplificado = 'N';
if (NEW.numok = 'N') then
  BEGIN
  /* Actualice el contador del prefijo */
  SELECT PREF_ACTUAL, PREF_AUTO FROM PREFIJOS WHERE TIDO_COD = 24 AND PREF_PRE = NEW.PREF_PRE INTO :NUMERO, :AUTOM;
  /* ACTUALICE EL NUMERO EN COMPROBANTE_ENCABEZADO  */
  if (AUTOM = 'S') then
    BEGIN
    NEW.dvco_numero = NUMERO;
    NUMERO = CAST((CAST(NUMERO AS INTEGER) + 1) AS CHAR(6));
    UPDATE PREFIJOS
      SET PREF_ACTUAL = :NUMERO
    WHERE TIDO_COD = 24 AND PREF_PRE = NEW.PREF_PRE;
    END
  ELSE
    BEGIN
    if (CAST(NUMERO AS INTEGER) = CAST(NEW.DVCO_NUMERO AS INTEGER)) then
        UPDATE PREFIJOS
          SET PREF_ACTUAL = CAST((CAST(PREF_ACTUAL AS INTEGER) + 1) AS CHAR(6))
        WHERE TIDO_COD = 24 AND PREF_PRE = NEW.PREF_PRE;
    END
  EXECUTE PROCEDURE COMPLETA_CEROS (NEW.dvco_numero) returning_values (NEW.dvco_numero);
  NEW.numok = 'S';
  END
/* Verifique que el numero no existe previamente */
EXISTE = 'N';
SELECT 'S' FROM DEVOLUCIONES_COMPRAS WHERE PREF_PRE = NEW.PREF_PRE AND DVCO_NUMERO = NEW.DVCO_NUMERO INTO :EXISTE;
if (EXISTE = 'S') then
    EXCEPTION DOCUMENTO_REGISTRADO 'Ya existe una devolución con el número ' || new.pref_pre || new.dvco_numero;
if (NEW.dvco_trm IS NULL) then
    NEW.dvco_trm = 1;
EXECUTE PROCEDURE LEE_CONFIGURACION('GENERAL', 'GENERAL', 'PREGUNTAR TASA DE CAMBIO EN DOCUMENTOS DE CUENTAS POR PAGAR') returning_values (:pregtasa);
if (PREGTASA = 'SI') then
    BEGIN
    NEW.dvco_dtomonto = NEW.dvco_dtomonto * NEW.dvco_trm;
    NEW.dvco_adicional = NEW.dvco_adicional * NEW.dvco_trm;
    NEW.dvco_ivamonto = NEW.dvco_ivamonto * NEW.dvco_trm;
    NEW.dvco_extra = NEW.dvco_extra * NEW.dvco_trm;
    NEW.dvco_rtftemonto = NEW.dvco_rtftemonto * NEW.dvco_trm;
    NEW.dvco_rtivamonto = NEW.dvco_rtivamonto * NEW.dvco_trm;
    NEW.dvco_rticamonto = NEW.dvco_rticamonto * NEW.dvco_trm;
    NEW.dvco_total = NEW.dvco_total * NEW.dvco_trm;
    END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER DEVOLUCIONES_VENTAS_AD FOR DEVOLUCIONES_VENTAS
ACTIVE AFTER DELETE POSITION 0
as
declare variable ABONOS INTEGER;
declare variable consec INTEGER;
begin
select enco_consec from comprobante_encabezado where enco_tiporef = 33 and enco_idref = old.devt_id into :consec;
if (NOT consec is null) then
 delete from comprobante_detalle where enco_consec = :consec;
delete from comprobante_encabezado where enco_tiporef = 33 and enco_idref = old.devt_id;

DELETE FROM puntos_cliente WHERE PTCL_TIPODOC = 33 AND PTCL_IDDOC = OLD.devt_id;

INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
    VALUES (USER, 33, OLD.devt_id, 'D', OLD.pref_pre || OLD.devt_numero);
if ((OLD.DEVT_anulado = 'N') AND (OLD.DEVT_ID <> 0)) then
    begin
    /* Verifique si habia abonos */
    ABONOS = 0;
    select COUNT(*) FROM SALDOS_DOC_CARTERA WHERE SDCA_TIPOREF = 33 AND SDCA_IDREF = OLD.DEVT_ID AND SDCA_ABONO <> 0 INTO :ABONOS;
    if (ABONOS = 0) then
        BEGIN
        /* BORRE EL REGISTRO PREVIO */
        delete from saldos_doc_cartera where sdca_tiporef = 33 and sdca_idref = old.devt_id;
        delete from movimiento_clientes where (mvcl_tiporef = 33) and (mvcl_idref = old.devt_id);
        END
    else
        exception DOCUMENTO_CON_ABONOS 'La devolución ' || old.pref_pre || old.devt_numero || ' tiene abonos registrados.';
    END
end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER DEVOLUCIONES_VENTAS_AU FOR DEVOLUCIONES_VENTAS
ACTIVE AFTER UPDATE POSITION 0
AS
declare variable ABONOS integer;
declare variable CONC VARCHAR(60);
declare variable consec INTEGER;
BEGIN
if (new.devt_anulado = 'S') then
    begin
    select enco_consec from comprobante_encabezado where enco_tiporef = 33 and enco_idref = old.devt_id into :consec;
    if (NOT consec is null) then
      delete from comprobante_detalle where enco_consec = :consec;
    delete from comprobante_encabezado where enco_tiporef = 33 and enco_idref = old.devt_id;

    DELETE FROM puntos_cliente WHERE PTCL_TIPODOC = 33 AND PTCL_IDDOC = OLD.devt_id;

    INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
        VALUES (USER, 33, NEW.devt_id, 'A', NEW.pref_pre || NEW.devt_numero);
    end
if ((old.DEVT_id <> 0) and (old.devt_anulado = 'N')) then
    begin
    /* Verifique si habia abonos a la nota */
    ABONOS = 0;
    select COUNT(*) FROM SALDOS_DOC_CARTERA WHERE SDCA_TIPOREF = 33 AND SDCA_IDREF = OLD.DEVT_ID AND SDCA_ABONO <> 0 INTO :ABONOS;
    if (ABONOS = 0) then
        BEGIN
        /* BORRE EL REGISTRO PREVIO */
        delete from saldos_doc_cartera where sdca_tiporef = 33 and sdca_idref = old.devt_id;
        delete from movimiento_clientes where (mvcl_tiporef = 33) and (mvcl_idref = old.devt_id);
        /* ACTUALICE LA CONSOLIDACION */
        if (OLD.DEVT_CONSOLIDA <> 0) then
            UPDATE consolidado_faltantes SET COFA_OK = 'N' WHERE COFA_ID = old.devt_consolida;
        END
    else
        exception DOCUMENTO_CON_ABONOS 'La devolución ' || old.pref_pre || old.devt_numero || ' tiene abonos registrados.';
    END
if ((new.DEVT_id <> 0) and (new.devt_anulado = 'N')) then
    BEGIN
    /* Registre el nuevo saldo del documento */
    INSERT INTO SALDOS_DOC_CARTERA (SDCA_TIPOREF, SDCA_IDREF, SDCA_FECHA, TERC_NIT, SDCA_RTFTE, SDCA_RTIVA, SDCA_RTICA, SDCA_ABONO, SDCA_ABRTFTE, SDCA_ABRTIVA, SDCA_ABRTICA, SDCA_DEBITO, SDCA_MONTO, SDCA_TRM)
        VALUES (33, NEW.DEVT_ID, NEW.DEVT_fecha, NEW.terc_nit, (NEW.DEVT_rtftemonto*-1), (NEW.DEVT_rtivamonto*-1), (NEW.DEVT_rticamonto*-1), 0, 0, 0, 0, 'N', (NEW.DEVT_TOTAL*-1), NEW.devt_trm);
    /* Registre el movimiento del cliente */
    CONC = 'DEVOLUCION VENTA No.' || NEW.PREF_PRE || NEW.DEVT_NUMERO || ' EN FACTURA ' || NEW.devt_factura;
    INSERT INTO MOVIMIENTO_CLIENTES (MVCL_ID, TERC_NIT, MVCL_TIPOREF, MVCL_IDREF, MVCL_FECHA, MVCL_VENCE, MVCL_CONC, MVCL_MONTO, MVCL_RTEFTE, MVCL_RTEIVA, MVCL_RTEICA, MVCL_DEBITO, MVCL_ABONO, MVCL_PREFREF, MVCL_NUMREF, MVCL_SUCURSAL, COBR_COD, MVCL_TRM)
        VALUES (GEN_ID(ID_MOVCLI, 1), NEW.TERC_NIT, 33, NEW.DEVT_ID, NEW.DEVT_FECHA, NEW.DEVT_FECHA, :CONC, NEW.DEVT_TOTAL, NEW.DEVT_RTFTEMONTO, NEW.DEVT_RTIVAMONTO, NEW.DEVT_RTICAMONTO, 'N', 'N', NEW.pref_pre, NEW.DEVT_numero, NEW.devt_sucursal, NEW.cobr_cod, NEW.devt_trm);
    /* ACTUALICE LA CONSOLIDACION */
    if (NEW.DEVT_CONSOLIDA <> 0) then
        UPDATE consolidado_faltantes SET COFA_IDDES = NEW.devt_id, COFA_OK = 'S' WHERE COFA_ID = NEW.devt_consolida;
    INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
        VALUES (USER, 33, NEW.devt_id, 'U', NEW.pref_pre || NEW.devt_numero);
    END
/* si cambio un dato critico actualice el detalle */
if ((OLD.devt_fecha <> NEW.devt_fecha) or
    (OLD.devt_numero <> NEW.devt_numero) or
    (OLD.pref_pre <> NEW.pref_pre) or
    (OLD.devt_factid <> NEW.devt_factid)) then
    UPDATE DEVOLUCIONES_VENTAS_DETALLE
        SET DVDE_TRANSMIT = 'N'
        WHERE DEVT_ID = NEW.DEVT_ID;
/* ACTUALICE EL ANULADO EN LOS DETALLES */
if (OLD.DEVT_anulado <> NEW.DEVT_anulado) then
    UPDATE DEVOLUCIONES_VENTAS_DETALLE
        SET DVDE_ANULADO = NEW.DEVT_anulado
        WHERE DEVT_ID = NEW.DEVT_ID;
if (OLD.devt_transmit <> NEW.devt_transmit) then
    UPDATE DEVOLUCIONES_VENTAS_DETALLE
        SET DVDE_TRANSMIT = NEW.devt_transmit
        WHERE DEVT_ID = NEW.DEVT_ID;
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER DEVOLUCIONES_VENTAS_BI FOR DEVOLUCIONES_VENTAS
ACTIVE BEFORE INSERT POSITION 0
AS
declare variable NUMERO VARCHAR(6);
declare variable AUTOM CHAR(1);
declare variable EXISTE CHAR(1);
declare variable SITOT CHAR(2);
declare variable CODCOBR INTEGER;
declare variable CODVEND INTEGER;
declare variable FECSERVER CHAR(2);
declare variable PREGTASA CHAR(2);
BEGIN
if (NEW.devt_trm IS NULL) then
    NEW.devt_trm = 1;
EXECUTE PROCEDURE LEE_CONFIGURACION('GENERAL', 'GENERAL', 'PREGUNTAR TASA DE CAMBIO EN DOCUMENTOS DE CARTERA') returning_values (:pregtasa);
if (PREGTASA = 'SI') then
    BEGIN
    NEW.devt_adicional = NEW.devt_adicional * NEW.devt_trm;
    NEW.devt_ivamonto = NEW.devt_ivamonto * NEW.devt_trm;
    NEW.devt_extra = NEW.devt_extra * NEW.devt_trm;
    NEW.devt_rtftemonto = NEW.devt_rtftemonto * NEW.devt_trm;
    NEW.devt_rtivamonto = NEW.devt_rtivamonto * NEW.devt_trm;
    NEW.devt_rticamonto = NEW.devt_rticamonto * NEW.devt_trm;
    NEW.devt_dtomonto = NEW.devt_dtomonto * NEW.devt_trm;
    END
EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION', 'DOCUMENTOS', 'INHABILITAR FECHA EN DOCUMENTOS') returning_values (:fecserver);
if (FECSERVER = 'SI') then
    NEW.devt_fecha = CAST ('NOW' AS DATE);
if (new.devt_remid is null) then
    NEW.devt_remid = 0;
execute procedure LEE_CONFIGURACION ('FACTURACION','DEVOLUCIONES','PERMITIR DEVOLVER ITEMS NO FACTURADOS') returning_values (:SITOT);
if ((SITOT = 'NO') AND (NEW.devt_factid = 0)) then
    exception factura_no_existe;
/* CALCULE LA COMISION CON BASE EN LA FACTURA */
EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION', 'VENDEDORES', 'COMISIONES EN VENTA INCLUYENDO IMPUESTOS') returning_values (:SITOT);
SELECT FACT_COMIPORC FROM FACTURAS WHERE FACT_ID = NEW.devt_factid INTO NEW.devt_comiporc;
if (NEW.devt_comiporc IS NULL) then
    NEW.devt_comiporc = 0;

if (SITOT = 'SI') then
    NEW.devt_comimonto = NEW.devt_total * NEW.devt_comiporc / 100;
ELSE
    NEW.devt_comimonto = (NEW.devt_total - NEW.devt_ivamonto) * NEW.devt_comiporc / 100;

if (NEW.numok = 'N') then
  BEGIN
  /* Actualice el contador del prefijo */
  SELECT PREF_ACTUAL, PREF_AUTO FROM PREFIJOS WHERE TIDO_COD = 33 AND PREF_PRE = NEW.PREF_PRE INTO :NUMERO, :AUTOM;
  /* ACTUALICE EL NUMERO EN COMPROBANTE_ENCABEZADO  */
  if (AUTOM = 'S') then
    BEGIN
    NEW.DEVT_NUMERO = NUMERO;
    NUMERO = CAST((CAST(NUMERO AS INTEGER) + 1) AS CHAR(6));
    UPDATE PREFIJOS
      SET PREF_ACTUAL = :NUMERO
    WHERE TIDO_COD = 33 AND PREF_PRE = NEW.PREF_PRE;
    END
  ELSE
    BEGIN
    if (CAST(NUMERO AS INTEGER) = CAST(NEW.DEVT_NUMERO AS INTEGER)) then
        UPDATE PREFIJOS
          SET PREF_ACTUAL = CAST((CAST(PREF_ACTUAL AS INTEGER) + 1) AS CHAR(6))
        WHERE TIDO_COD = 33 AND PREF_PRE = NEW.PREF_PRE;
    END
  EXECUTE PROCEDURE COMPLETA_CEROS (NEW.DEVT_numero) returning_values (NEW.DEVT_numero);
  NEW.numok = 'S';
  END
/* Verifique que el numero no existe previamente */
EXISTE = 'N';
SELECT 'S' FROM DEVOLUCIONES_VENTAS WHERE PREF_PRE = NEW.PREF_PRE AND DEVT_NUMERO = NEW.DEVT_NUMERO INTO :EXISTE;
if (EXISTE = 'S') then
    EXCEPTION DOCUMENTO_REGISTRADO 'Ya existe una devolución con el número ' || new.pref_pre || new.devt_numero;
select COBR_COD, VEND_COD FROM CLIENTES WHERE TERC_NIT = NEW.terc_nit INTO :CODCOBR, CODVEND;
if (NEW.cobr_cod IS NULL) then
    NEW.cobr_cod = :CODCOBR;
if (NEW.vend_cod IS NULL) then
    NEW.vend_cod = :CODVEND;
if ((new.DEVT_TOTAL-new.DEVT_IVAMONTO+new.DEVT_DTOMONTO-new.DEVT_ADICIONAL) = 0) then
    NEW.DEVT_FACTOR = 1;
else
    NEW.DEVT_FACTOR = (new.DEVT_TOTAL-new.DEVT_IVAMONTO)/(new.DEVT_TOTAL-new.DEVT_IVAMONTO+new.DEVT_DTOMONTO-new.DEVT_ADICIONAL);
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER DEVOLUCION_CHEQUES_BI FOR DEVOLUCION_CHEQUES
ACTIVE BEFORE INSERT POSITION 0
AS
declare variable NUMERO VARCHAR(6);
declare variable AUTOM CHAR(1);
declare variable EXISTE CHAR(1);
declare variable POR_CTA CHAR(2);
declare variable CODCOBR INTEGER;
declare variable CODVEND INTEGER;
declare variable NUMROWS INTEGER;
declare variable PREGTASA CHAR(2);
BEGIN
if (NEW.dvch_trm IS NULL) then
    NEW.dvch_trm = 1;
EXECUTE PROCEDURE LEE_CONFIGURACION('GENERAL', 'GENERAL', 'PREGUNTAR TASA DE CAMBIO EN DOCUMENTOS DE CARTERA') returning_values (:pregtasa);
if (PREGTASA = 'SI') then
    NEW.dvch_monto = NEW.dvch_monto * NEW.dvch_trm;

if (NEW.numok = 'N') then
  BEGIN
  /* Actualice el contador del prefijo */
  EXECUTE PROCEDURE LEE_configuracion('BANCOS', 'DEVOLUCIONES', 'CONSECUTIVOS POR CUENTA') returning_values(:POR_CTA);
  if (por_cta = 'SI') then
    BEGIN
    SELECT PRBA_NUMERO, PRBA_AUTO FROM PREFIJOS_BANCOS
        WHERE TIDO_COD = 77 AND CUBA_COD = NEW.CUBA_COD AND PRBA_PREF = NEW.PRBA_PREF INTO :NUMERO, :AUTOM;
    if (AUTOM = 'S') then
        BEGIN
        NEW.DVCH_NUMDOC = NUMERO;
        NUMERO = CAST((CAST(NUMERO AS INTEGER) + 1) AS CHAR(6));
        UPDATE PREFIJOS_BANCOS
            SET PRBA_NUMERO = :NUMERO
            WHERE TIDO_COD = 77 AND CUBA_COD = NEW.CUBA_COD AND PRBA_PREF = NEW.PRBA_PREF;
        END
    ELSE
        BEGIN
        if (CAST(NUMERO AS INTEGER) = CAST(NEW.DVCH_NUMDOC AS INTEGER)) then
            UPDATE PREFIJOS_BANCOS
                SET PRBA_NUMERO = CAST((CAST(PRBA_NUMERO AS INTEGER) + 1) AS CHAR(6))
                WHERE TIDO_COD = 77 AND CUBA_COD = NEW.CUBA_COD AND PRBA_PREF = NEW.PRBA_PREF;
        END
    END
  ELSE
    BEGIN
    SELECT PREF_ACTUAL, PREF_AUTO FROM PREFIJOS
        WHERE TIDO_COD = 77 AND PREF_PRE = NEW.PRBA_PREF INTO :NUMERO, :AUTOM;
    if (AUTOM = 'S') then
        BEGIN
        NEW.DVCH_NUMDOC = NUMERO;
        NUMERO = CAST((CAST(NUMERO AS INTEGER) + 1) AS CHAR(6));
        UPDATE PREFIJOS
            SET PREF_ACTUAL = :NUMERO
            WHERE TIDO_COD = 77 AND PREF_PRE = NEW.PRBA_PREF;
        END
    ELSE
        BEGIN
        if (CAST(NUMERO AS INTEGER) = CAST(NEW.DVCH_NUMDOC AS INTEGER)) then
            UPDATE PREFIJOS
                SET PREF_ACTUAL = CAST((CAST(PREF_ACTUAL AS INTEGER) + 1) AS CHAR(6))
                WHERE TIDO_COD = 77 AND PREF_PRE = NEW.PRBA_PREF;
        END
    END
  /* ACTUALICE EL NUMERO EN COMPROBANTE_ENCABEZADO */
  EXECUTE PROCEDURE COMPLETA_CEROS (NEW.DVCH_NUMDOC) returning_values (NEW.DVCH_NUMDOC);
  NEW.numok = 'S';
  END
/* Verifique que el numero no existe previamente */
EXISTE = 'N';
if (POR_CTA = 'SI') then
    SELECT 'S' FROM DEVOLUCION_CHEQUES
        WHERE CUBA_COD = NEW.CUBA_COD AND PRBA_PREF = NEW.PRBA_PREF AND DVCH_NUMDOC = NEW.DVCH_NUMDOC INTO :EXISTE;
else
    SELECT 'S' FROM DEVOLUCION_CHEQUES
        WHERE PRBA_PREF = NEW.PRBA_PREF AND DVCH_NUMDOC = NEW.DVCH_NUMDOC INTO :EXISTE;
if (EXISTE = 'S') then
    EXCEPTION DOCUMENTO_REGISTRADO 'Ya existe una devolución de cheques con el número ' || new.prba_pref || new.dvch_numdoc;
/* SI ES A CARTERA AGREGE LOS DATOS DE VEND Y COBR */
if (NEW.dvch_cartera = 'S') then
    BEGIN
    select COBR_COD, VEND_COD FROM CLIENTES WHERE TERC_NIT = NEW.terc_nit INTO :CODCOBR, CODVEND;
    if (NEW.cobr_cod IS NULL) then
        NEW.cobr_cod = :CODCOBR;
    if (NEW.vend_cod IS NULL) then
        NEW.vend_cod = :CODVEND;
    END
/* NO PERMITA UNA FORMA DE PAGO REPETIDA */
SELECT COUNT(*) FROM documentos_pago_caja WHERE caja_id = NEW.caja_id AND fopa_id = 2 AND dpca_banco = NEW.dvch_banco AND
    dpca_cuenta = NEW.dvch_cuenta AND dpca_numero = NEW.dvch_nroch AND dpca_tiposal = 0 and dpca_idsal = 0
    INTO :NUMROWS;
if (numrows > 0) then
    exception documento_pago_salido 'No se encontró la forma de pago ' || new.dvch_banco || ' ' || new.dvch_cuenta || ' ' || new.dvch_nroch || ' en caja.';
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER DOCUMENTOS_PAGO_CAJA_BD FOR DOCUMENTOS_PAGO_CAJA
ACTIVE BEFORE DELETE POSITION 0
as
begin
/* No deje borrar un documento que ya haya salido */
if (old.dpca_idsal <> 0) then
    exception documento_pago_salido 'La forma de pago ' || old.dpca_banco || ' ' || old.dpca_cuenta || ' ' || old.dpca_numero || ' ya fue utilizada.';
end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER EGRESOS_BI FOR EGRESOS
ACTIVE BEFORE INSERT POSITION 0
AS
declare variable NUMERO VARCHAR(6);
declare variable AUTOM CHAR(1);
declare variable EXISTE CHAR(1);
BEGIN
if (NEW.numok = 'N') then
  BEGIN
  /* Actualice el contador del prefijo */
  SELECT PREF_ACTUAL, PREF_AUTO FROM PREFIJOS WHERE TIDO_COD = 62 AND PREF_PRE = NEW.PREF_PRE INTO :NUMERO, :AUTOM;
  /* ACTUALICE EL NUMERO EN COMPROBANTE_ENCABEZADO  */
  if (AUTOM = 'S') then
    BEGIN
    NEW.EGRE_NUMERO = NUMERO;
    NUMERO = CAST((CAST(NUMERO AS INTEGER) + 1) AS CHAR(6));
    UPDATE PREFIJOS
      SET PREF_ACTUAL = :NUMERO
    WHERE TIDO_COD = 62 AND PREF_PRE = NEW.PREF_PRE;
    END
  ELSE
    BEGIN
    if (CAST(NUMERO AS INTEGER) = CAST(NEW.EGRE_NUMERO AS INTEGER)) then
        UPDATE PREFIJOS
          SET PREF_ACTUAL = CAST((CAST(PREF_ACTUAL AS INTEGER) + 1) AS CHAR(6))
        WHERE TIDO_COD = 62 AND PREF_PRE = NEW.PREF_PRE;
    END
  EXECUTE PROCEDURE COMPLETA_CEROS (NEW.EGRE_numero) returning_values (NEW.EGRE_numero);
  NEW.numok = 'S';
  END
/* Verifique que el numero no existe previamente */
EXISTE = 'N';
SELECT 'S' FROM EGRESOS WHERE PREF_PRE = NEW.PREF_PRE AND EGRE_NUMERO = NEW.EGRE_NUMERO INTO :EXISTE;
if (EXISTE = 'S') then
    EXCEPTION DOCUMENTO_REGISTRADO 'Ya existe un egreso con el número ' || new.pref_pre || new.egre_numero;
if (new.cleg_id is null) then
    new.cleg_id = 0;
END
^

SET TERM ; ^

SET TERM ^ ;

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

SET TERM ; ^

SET TERM ^ ;

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

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER EGRESOS_CRUCEC_AI FOR EGRESOS_CRUCEC
ACTIVE AFTER INSERT POSITION 0
AS
declare variable EXISTE CHAR(1);
declare variable FEC DATE;
declare variable NIT VARCHAR(20);
declare variable CONCEPTO VARCHAR(60);
declare variable PREFIJO VARCHAR(4);
declare variable NUMERO VARCHAR(6);
declare variable SALDO NUMERIC(18,2);
declare variable RETES CHAR(2);
declare variable COBR INTEGER;
declare variable TRM NUMERIC(18,2);
BEGIN
if ((NEW.egre_id <> 0) and (new.egcc_anulado = 'N')) then
    BEGIN
    /* Abone el documento referenciado */
    select PREF_PRE, EGRE_NUMERO, EGRE_fecha, EGRE_CONC, TERC_NIT, EGRE_TRM from EGRESOS
        where EGRE_id = new.egre_id into :PREFIJO, :NUMERO, :FEC, :CONCEPTO, :NIT, :TRM;
    SELECT COBR_COD FROM cliente_sucursales WHERE TERC_NIT = :NIT AND CLCU_COD = NEW.egcc_sucursal INTO :COBR;
    /* valide que no se pase del saldo */
    execute procedure saldo_doc_cartera(new.egcc_tipodoc, new.egcc_iddoc, '9999/12/31',0) returning_values(saldo);
    execute procedure lee_configuracion('CARTERA', 'SALDOS', 'DESCONTAR RETENCIONES POR CAUSACION') returning_values (RETES);
    if (SALDO < 0) then
        BEGIN
        if (RETES = 'SI') then
            begin
            if (saldo > (NEW.egcc_abono + NEW.egcc_dtof + NEW.egcc_difcambio)) then
                EXCEPTION DOCUMENTO_ABONO_MAYOR 'EL SALDO DEL DOCUMENTO ' || NEW.egcc_prefijo || NEW.egcc_numero || ' ES INSUFICIENTE.';
            end
        ELSE
            begin
            if (saldo > (NEW.egcc_abono + NEW.egcc_rtfte + NEW.egcc_rtiva + NEW.egcc_rtica + NEW.egcc_dtof + NEW.egcc_difcambio)) then
                EXCEPTION DOCUMENTO_ABONO_MAYOR 'EL SALDO DEL DOCUMENTO ' || NEW.egcc_prefijo || NEW.egcc_numero || ' ES INSUFICIENTE.';
            end
        END
    else
        BEGIN
        if (RETES = 'SI') then
            begin
            if (saldo < (NEW.egcc_abono + NEW.egcc_dtof + NEW.egcc_difcambio)) then
                EXCEPTION DOCUMENTO_ABONO_MAYOR 'EL SALDO DEL DOCUMENTO ' || NEW.egcc_prefijo || NEW.egcc_numero || ' ES INSUFICIENTE.';
            end
        ELSE
            begin
            if (saldo < (NEW.egcc_abono + NEW.egcc_rtfte + NEW.egcc_rtiva + NEW.egcc_rtica + NEW.egcc_dtof + NEW.egcc_difcambio)) then
                EXCEPTION DOCUMENTO_ABONO_MAYOR 'EL SALDO DEL DOCUMENTO ' || NEW.egcc_prefijo || NEW.egcc_numero || ' ES INSUFICIENTE.';
            end
        END
    EXISTE = 'N';
    select 'S' from saldos_doc_cartera where sdca_tiporef = new.egcc_tipodoc and sdca_idref = new.egcc_iddoc and sdca_fecha = :FEC into :EXISTE;
    if (Existe = 'S') then
        begin
        /* actualice el saldo del dia */
        UPDATE saldos_doc_cartera
            SET SDCA_ABONO = SDCA_ABONO + NEW.egcc_abono + new.egcc_dtof + NEW.egcc_difcambio,
                SDCA_ABRTFTE = SDCA_ABRTFTE + NEW.egcc_rtfte,
                SDCA_ABRTIVA = SDCA_ABRTIVA + NEW.egcc_rtiva,
                SDCA_ABRTICA = SDCA_ABRTICA + NEW.egcc_rtica,
                SDCA_TRM = :TRM
                WHERE SDCA_TIPOREF = NEW.egcc_tipodoc AND SDCA_IDREF = NEW.egcc_iddoc AND SDCA_FECHA = :FEC;
        END
    ELSE
        BEGIN
        /* Inserte un nuevo saldo diario */
        INSERT INTO SALDOS_DOC_CARTERA (SDCA_TIPOREF, SDCA_IDREF, SDCA_FECHA, TERC_NIT, SDCA_RTFTE, SDCA_RTIVA, SDCA_RTICA, SDCA_ABONO, SDCA_ABRTFTE, SDCA_ABRTIVA, SDCA_ABRTICA, SDCA_DEBITO, SDCA_MONTO, SDCA_TRM)
            VALUES (NEW.egcc_tipodoc, NEW.egcc_iddoc, :FEC, :NIT, 0, 0, 0, (NEW.egcc_abono+NEW.egcc_dtof+NEW.egcc_difcambio), NEW.egcc_rtfte, NEW.egcc_rtiva, NEW.egcc_rtica, 'N', 0, :TRM);
        END
    /* actualice el registro en mov_cliente (por si son varios items) */
    EXISTE = 'N';
    SELECT 'S' FROM MOVIMIENTO_CLIENTES WHERE MVCL_TIPOREF = 62 AND MVCL_IDREF = NEW.egre_id AND MVCL_SUCURSAL = NEW.egcc_sucursal INTO :EXISTE;
    if (EXISTE = 'S') then
        begin
        UPDATE movimiento_clientes
            SET MVCL_MONTO = MVCL_MONTO + NEW.egcc_abono + NEW.egcc_dtof + NEW.egcc_difcambio,
                MVCL_RTEFTE = MVCL_RTEFTE + NEW.egcc_rtfte,
                MVCL_RTEIVA = MVCL_RTEIVA + NEW.egcc_rtiva,
                MVCL_RTEICA = MVCL_RTEICA + NEW.egcc_rtica,
                MVCL_TRM = :TRM
            WHERE MVCL_TIPOREF = 62 AND MVCL_IDREF = NEW.egre_id;
        end
    ELSE
        INSERT INTO MOVIMIENTO_CLIENTES (MVCL_ID, TERC_NIT, MVCL_TIPOREF, MVCL_IDREF, MVCL_FECHA, MVCL_VENCE, MVCL_CONC, MVCL_MONTO, MVCL_RTEFTE, MVCL_RTEIVA, MVCL_RTEICA, MVCL_DEBITO, MVCL_ABONO, MVCL_PREFREF, MVCL_NUMREF, MVCL_SUCURSAL, COBR_COD, MVCL_TRM)
            VALUES (GEN_ID(ID_MOVCLI, 1), :NIT, 62, NEW.egre_id, :FEC, :FEC, :CONCEPTO, (NEW.egcc_abono+NEW.egcc_dtof+NEW.egcc_difcambio), NEW.egcc_rtfte, NEW.egcc_rtiva, NEW.egcc_rtica, 'N', 'S', :PREFIJO, :NUMERO, NEW.egcc_sucursal, :COBR, :TRM);
    end
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER EGRESOS_CRUCEC_AU FOR EGRESOS_CRUCEC
ACTIVE AFTER UPDATE POSITION 0
AS
declare variable EXISTE CHAR(1);
declare variable FEC DATE;
declare variable NIT VARCHAR(20);
declare variable CONCEPTO VARCHAR(60);
declare variable PREFIJO VARCHAR(4);
declare variable NUMERO VARCHAR(6);
declare variable SALDO NUMERIC(18,2);
declare variable RETES char(2);
declare variable COBR INTEGER;
declare variable TRM NUMERIC(18,2);
BEGIN
select PREF_PRE, EGRE_NUMERO, EGRE_fecha, EGRE_CONC, TERC_NIT, EGRE_TRM
    from egresos where egre_id = new.egre_id
    into :PREFIJO, :NUMERO, :FEC, :CONCEPTO, :NIT, :TRM;
/* Borre el viejo */
if ((old.egre_id <> 0) AND (OLD.egcc_anulado = 'N')) then
    BEGIN
    UPDATE saldos_doc_cartera
        SET SDCA_ABONO = SDCA_ABONO - old.egcc_abono - OLD.egcc_dtof - OLD.egcc_difcambio,
        SDCA_ABRTFTE = SDCA_ABRTFTE - old.egcc_rtfte,
        SDCA_ABRTIVA = SDCA_ABRTIVA - old.egcc_rtiva,
        SDCA_ABRTICA = SDCA_ABRTICA - old.egcc_rtica
        WHERE SDCA_TIPOREF = old.egcc_tipodoc AND SDCA_IDREF = old.egcc_iddoc AND SDCA_FECHA = :FEC;
    UPDATE movimiento_clientes
        SET MVCL_MONTO = MVCL_MONTO - OLD.egcc_abono - OLD.egcc_dtof - OLD.egcc_difcambio,
        MVCL_RTEFTE = MVCL_RTEFTE - OLD.egcc_rtfte,
        MVCL_RTEIVA = MVCL_RTEIVA - OLD.egcc_rtiva,
        MVCL_RTEICA = MVCL_RTEICA - OLD.egcc_rtica
        WHERE MVCL_TIPOREF = 62 AND MVCL_IDREF = OLD.egre_id AND MVCL_SUCURSAL = old.egcc_sucursal;
    END
if ((NEW.egre_id <> 0) and (NEW.egcc_anulado = 'N')) then
    BEGIN
    SELECT COBR_COD FROM cliente_sucursales WHERE TERC_NIT = :NIT AND CLCU_COD = NEW.egcc_sucursal INTO :COBR;
    /* valide que no se pase del saldo */
    execute procedure saldo_doc_cartera(new.egcc_tipodoc, new.egcc_iddoc, '9999/12/31',0) returning_values(saldo);
    execute procedure lee_configuracion('CARTERA', 'SALDOS', 'DESCONTAR RETENCIONES POR CAUSACION') returning_values (RETES);
    if (SALDO < 0) then
        BEGIN
        if (RETES = 'SI') then
            begin
            if (saldo > (NEW.egcc_abono + NEW.egcc_dtof + NEW.egcc_difcambio)) then
                EXCEPTION DOCUMENTO_ABONO_MAYOR 'EL SALDO DEL DOCUMENTO ' || NEW.egcc_prefijo || NEW.egcc_numero || ' ES INSUFICIENTE.';
            end
        ELSE
            begin
            if (saldo > (NEW.egcc_abono + NEW.egcc_rtfte + NEW.egcc_rtiva + NEW.egcc_rtica + NEW.egcc_dtof + NEW.egcc_difcambio)) then
                EXCEPTION DOCUMENTO_ABONO_MAYOR 'EL SALDO DEL DOCUMENTO ' || NEW.egcc_prefijo || NEW.egcc_numero || ' ES INSUFICIENTE.';
            end
        END
    else
        BEGIN
        if (RETES = 'SI') then
            begin
            if (saldo < (NEW.egcc_abono + NEW.egcc_dtof + NEW.egcc_difcambio)) then
                EXCEPTION DOCUMENTO_ABONO_MAYOR 'EL SALDO DEL DOCUMENTO ' || NEW.egcc_prefijo || NEW.egcc_numero || ' ES INSUFICIENTE.';
            end
        ELSE
            begin
            if (saldo < (NEW.egcc_abono + NEW.egcc_rtfte + NEW.egcc_rtiva + NEW.egcc_rtica + NEW.egcc_dtof + NEW.egcc_difcambio)) then
                EXCEPTION DOCUMENTO_ABONO_MAYOR 'EL SALDO DEL DOCUMENTO ' || NEW.egcc_prefijo || NEW.egcc_numero || ' ES INSUFICIENTE.';
            end
        END
    select 'S' from saldos_doc_cartera where sdca_tiporef = new.egcc_tipodoc and sdca_idref = new.egcc_iddoc and sdca_fecha = :FEC into :EXISTE;
    if (Existe = 'S') then
        /* actualice el saldo del dia */
        UPDATE saldos_doc_cartera
            SET SDCA_ABONO = SDCA_ABONO + NEW.egcc_abono + NEW.egcc_dtof + NEW.egcc_difcambio,
            SDCA_ABRTFTE = SDCA_ABRTFTE + NEW.egcc_rtfte,
            SDCA_ABRTIVA = SDCA_ABRTIVA + NEW.egcc_rtiva,
            SDCA_ABRTICA = SDCA_ABRTICA + NEW.egcc_rtica,
            SDCA_TRM = :TRM
            WHERE SDCA_TIPOREF = NEW.egcc_tipodoc AND SDCA_IDREF = NEW.egcc_iddoc AND SDCA_FECHA = :FEC;
    ELSE
        /* Inserte un nuevo saldo diario */
        INSERT INTO SALDOS_DOC_CARTERA (SDCA_TIPOREF, SDCA_IDREF, SDCA_FECHA, TERC_NIT, SDCA_RTFTE, SDCA_RTIVA, SDCA_RTICA, SDCA_ABONO, SDCA_ABRTFTE, SDCA_ABRTIVA, SDCA_ABRTICA, SDCA_DEBITO, SDCA_MONTO, SDCA_TRM)
            VALUES (NEW.egcc_tipodoc, NEW.egcc_iddoc, :FEC, :NIT, 0, 0, 0, (NEW.egcc_abono+NEW.egcc_dtof+NEW.egcc_difcambio), NEW.egcc_rtfte, NEW.egcc_rtiva, NEW.egcc_rtica, 'N', 0, :TRM);
    /* Registre o actualice el registro en movimiento_cliente */
    EXISTE = 'N';
    SELECT 'S' FROM MOVIMIENTO_CLIENTES WHERE MVCL_TIPOREF = 62 AND MVCL_IDREF = NEW.egre_id and mvcl_sucursal = new.egcc_sucursal INTO :EXISTE;
    if (EXISTE = 'S') then
        begin
        /* Actualice el nuevo */
        UPDATE movimiento_clientes
            SET MVCL_MONTO = MVCL_MONTO + NEW.egcc_abono + NEW.egcc_dtof + NEW.egcc_difcambio,
                MVCL_RTEFTE = MVCL_RTEFTE + NEW.egcc_rtfte,
                MVCL_RTEIVA = MVCL_RTEIVA + NEW.egcc_rtiva,
                MVCL_RTEICA = MVCL_RTEICA + NEW.egcc_rtica,
                MVCL_TRM = :TRM
            WHERE MVCL_TIPOREF = 62 AND MVCL_IDREF = NEW.egre_id AND MVCL_SUCURSAL = NEW.egcc_sucursal;
        end
    ELSE
        INSERT INTO MOVIMIENTO_CLIENTES (MVCL_ID, TERC_NIT, MVCL_TIPOREF, MVCL_IDREF, MVCL_FECHA, MVCL_VENCE, MVCL_CONC, MVCL_MONTO, MVCL_RTEFTE, MVCL_RTEIVA, MVCL_RTEICA, MVCL_DEBITO, MVCL_ABONO, MVCL_PREFREF, MVCL_NUMREF, MVCL_SUCURSAL, COBR_COD, MVCL_TRM)
            VALUES (GEN_ID(ID_MOVCLI, 1), :NIT, 62, NEW.egre_id, :FEC, :FEC, :CONCEPTO, (NEW.egcc_abono+NEW.egcc_dtof+NEW.egcc_difcambio), NEW.egcc_rtfte, NEW.egcc_rtiva, NEW.egcc_rtica, 'N', 'S', :PREFIJO, :NUMERO, NEW.egcc_sucursal, :COBR, :TRM);
    END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER EGRESOS_DETALLE_AU FOR EGRESOS_DETALLE
ACTIVE AFTER UPDATE POSITION 0
AS
declare variable EXISTE CHAR(1);
declare variable FEC DATE;
declare variable NIT VARCHAR(20);
declare variable CONCEPTO VARCHAR(60);
declare variable PREFIJO VARCHAR(4);
declare variable NUMERO VARCHAR(6);
declare variable OK CHAR(1);
declare variable EGANTI INTEGER;
declare variable RETES CHAR(2);
declare variable SALDO NUMERIC(18,2);
declare variable TRM NUMERIC(18,2);
BEGIN
select PREF_PRE, EGRE_NUMERO, EGRE_FECHA, EGRE_CONC, TERC_NIT, EGRE_TRM from EGRESOS
    where egre_id = new.egre_id into :PREFIJO, :NUMERO, :FEC, :CONCEPTO, :NIT, :TRM;
if ((OLD.EGRE_ID <> 0) and (old.egde_anulado = 'N')) then
    BEGIN
    /* BORRE EL ANTICIPO SI FUE EL QUIEN LO CREO */
    OK = 'N';
    if (OLD.EGDE_TIPODOC = 55) then
        BEGIN
        SELECT EGRE_ID FROM ANTICIPOS_PROVEEDOR WHERE ANPR_ID = OLD.EGDE_IDDOC INTO :EGANTI;
        if (EGANTI = old.egre_id) then
            begin
            OK = 'S';
            UPDATE anticipos_proveedor SET ANPR_ANULADO = 'S' where ANPR_ID = OLD.EGDE_IDDOC;
            end
        END
    if (OK = 'N') then
        BEGIN
        EXISTE = 'N';
        select 'S' from saldos_doc_cxpagar where sdcp_tiporef = old.egde_tipodoc and
            sdcp_idref = old.egde_iddoc and sdcp_fecha = :FEC into :EXISTE;
        if (Existe = 'S') then
            begin
            /* Borre el viejo */
            if (old.EGRE_ID <> 0) then
                UPDATE saldos_doc_cxpagar
                    SET SDCP_ABONO = SDCP_ABONO - (old.egde_abono + OLD.egde_dtof + OLD.egde_difcambio),
                    SDCP_ABRTFTE = SDCP_ABRTFTE - old.egde_RTFTE,
                    SDCP_ABRTIVA = SDCP_ABRTIVA - old.egde_RTIVA,
                    SDCP_ABRTICA = SDCP_ABRTICA - old.egde_RTICA
                    WHERE SDCP_TIPOREF = OLD.EGDE_TIPODOC AND SDCP_IDREF = OLD.egde_IDDOC AND SDCP_FECHA = :FEC;
            end
        END
    EXISTE = 'N';
    SELECT 'S' FROM MOVIMIENTO_PROVEEDOR WHERE MVPR_TIPOREF = 62 AND MVPR_IDREF = OLD.EGRE_ID INTO :EXISTE;
    if (EXISTE = 'S') then
        begin
        /* Deshaga el viejo */
        UPDATE movimiento_proveedor
            SET MVPR_MONTO = MVPR_MONTO - (OLD.egde_abono + OLD.egde_dtof + OLD.egde_difcambio),
            MVPR_RTFTE = MVPR_RTFTE - OLD.egde_rtfte,
            MVPR_RTIVA = MVPR_RTIVA - OLD.egde_rtiva,
            MVPR_RTICA = MVPR_RTICA - OLD.egde_rtica
            WHERE MVPR_TIPOREF = 62 AND MVPR_IDREF = OLD.EGRE_ID;
        end
    END /* OLD.EGRE_ID <> 0 */
if ((NEW.EGRE_ID <> 0) and (NEW.egde_anulado = 'N')) then
    BEGIN
    /* valide que no se pase del saldo */
    execute procedure saldo_doc_cxpagar(new.egde_tipodoc, new.egde_iddoc, '9999/12/31', 0) returning_values(saldo);
    execute procedure lee_configuracion('CXPAGAR', 'SALDOS', 'DESCONTAR RETENCIONES POR CAUSACION') returning_values (RETES);
    if (SALDO < 0) then
        BEGIN
        if (RETES = 'SI') then
            begin
            if (saldo > (NEW.egde_abono + NEW.egde_dtof + NEW.egde_difcambio)) then
                EXCEPTION DOCUMENTO_ABONO_MAYOR 'EL SALDO DEL DOCUMENTO ' || NEW.egde_prefijo || NEW.egde_numero || ' ES INSUFICIENTE.';
            end
        ELSE
            begin
            if (saldo > (NEW.egde_abono + NEW.egde_rtfte + NEW.egde_rtiva + NEW.egde_rtica + new.egde_dtof + NEW.egde_difcambio)) then
                EXCEPTION DOCUMENTO_ABONO_MAYOR 'EL SALDO DEL DOCUMENTO ' || NEW.egde_prefijo || NEW.egde_numero || ' ES INSUFICIENTE.';
            end
        END
    else
        BEGIN
        if (RETES = 'SI') then
            begin
            if (saldo < (NEW.egde_abono + NEW.egde_dtof + NEW.egde_difcambio)) then
                EXCEPTION DOCUMENTO_ABONO_MAYOR 'EL SALDO DEL DOCUMENTO ' || NEW.egde_prefijo || NEW.egde_numero || ' ES INSUFICIENTE.';
            end
        ELSE
            begin
            if (saldo < (NEW.egde_abono + NEW.egde_rtfte + NEW.egde_rtiva + NEW.egde_rtica + NEW.egde_dtof + NEW.egde_difcambio)) then
                EXCEPTION DOCUMENTO_ABONO_MAYOR 'EL SALDO DEL DOCUMENTO ' || NEW.egde_prefijo || NEW.egde_numero || ' ES INSUFICIENTE.';
            end
        END
    /* AHORA REGISTRE LO NUEVO */
    OK = 'N';
    if (new.EGDE_TIPODOC = 55) then
        BEGIN
        /* BUSQUE SI TIENE EGRE_ID, SI NO LO ACTUALIZA */
        SELECT EGRE_ID FROM ANTICIPOS_PROVEEDOR WHERE ANPR_ID = NEW.EGDE_IDDOC INTO :EGANTI;
        if (EGANTI = 0) then
            BEGIN
            OK = 'S';
            UPDATE ANTICIPOS_PROVEEDOR SET EGRE_ID = NEW.EGRE_ID WHERE ANPR_ID = NEW.EGDE_IDDOC;
            END
        END
    if (OK = 'N') then
        BEGIN
        EXISTE = 'N';
        select 'S' from saldos_doc_cxpagar where sdcp_tiporef = new.egde_tipodoc and
            sdcp_idref = new.egde_iddoc and sdcp_fecha = :FEC into :EXISTE;
        if (Existe = 'S') then
            /* actualice el saldo del dia */
            UPDATE saldos_doc_cxpagar
                SET SDCP_ABONO = SDCP_ABONO + (NEW.egde_abono + NEW.egde_dtof + NEW.egde_difcambio),
                SDCP_ABRTFTE = SDCP_ABRTFTE + NEW.egde_RTFTE,
                SDCP_ABRTIVA = SDCP_ABRTIVA + NEW.egde_RTIVA,
                SDCP_ABRTICA = SDCP_ABRTICA + NEW.egde_RTICA,
                SDCP_TRM = :TRM
                WHERE SDCP_TIPOREF = NEW.EGDE_TIPODOC AND SDCP_IDREF = NEW.egde_IDDOC AND SDCP_FECHA = :FEC;
        else
            /* Inserte un nuevo saldo diario */
            INSERT INTO SALDOS_DOC_CXPAGAR (SDCP_TIPOREF, SDCP_IDREF, SDCP_FECHA, TERC_NIT, SDCP_RTEFTE, SDCP_RTIVA, SDCP_RTICA, SDCP_ABONO, SDCP_ABRTFTE, SDCP_ABRTIVA, SDCP_ABRTICA, SDCP_DEBITO, SDCP_MONTO, SDCP_TRM)
                VALUES (NEW.EGDE_TIPODOC, NEW.EGDE_IDDOC, :FEC, :NIT, 0, 0, 0, (NEW.egde_abono + NEW.egde_dtof + NEW.egde_difcambio), NEW.egde_rtfte, NEW.egde_rtiva, NEW.egde_rtica, 'N', 0, :TRM);
        END /* ok = n */
    /* Registre o actualice el registro en movimiento_proveedor */
    EXISTE = 'N';
    SELECT 'S' FROM MOVIMIENTO_PROVEEDOR WHERE MVPR_TIPOREF = 62 AND MVPR_IDREF = NEW.EGRE_ID INTO :EXISTE;
    if (EXISTE = 'S') then
        /* Actualice el nuevo */
        UPDATE movimiento_proveedor
            SET MVPR_MONTO = MVPR_MONTO + (NEW.egde_abono + NEW.egde_dtof + NEW.egde_difcambio),
                MVPR_RTFTE = MVPR_RTFTE + NEW.egde_rtfte,
                MVPR_RTIVA = MVPR_RTIVA + NEW.egde_rtiva,
                MVPR_RTICA = MVPR_RTICA + NEW.egde_rtica,
                MVPR_TRM = :TRM
            WHERE MVPR_TIPOREF = 62 AND MVPR_IDREF = NEW.EGRE_ID;
    ELSE
        INSERT INTO MOVIMIENTO_PROVEEDOR (MVPR_ID, TERC_NIT, MVPR_TIPOREF, MVPR_IDREF, MVPR_FECHA, MVPR_VENCE, MVPR_CONC, MVPR_MONTO, MVPR_RTFTE, MVPR_RTIVA, MVPR_RTICA, MVPR_DEBITO, MVPR_ABONO, MVPR_PREFIJO, MVPR_NUMERO, MVPR_TRM)
            VALUES (GEN_ID(ID_MOVPROV, 1), :NIT, 62, NEW.EGRE_ID, :FEC, :FEC, :CONCEPTO, (NEW.EGDE_ABONO + NEW.egde_dtof + NEW.egde_difcambio), NEW.EGDE_RTFTE, NEW.EGDE_RTIVA, NEW.EGDE_RTICA, 'N', 'S', :PREFIJO, :NUMERO, :TRM);
    end
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER ENSAMBLES_BI FOR ENSAMBLES
ACTIVE BEFORE INSERT POSITION 0
AS
declare variable NUMERO VARCHAR(8);
declare variable AUTOM CHAR(1);
declare variable EXISTE CHAR(1);
BEGIN
if (NEW.numok = 'N') then
  BEGIN
  /* Actualice el contador del prefijo */
  SELECT PREF_ACTUAL, PREF_AUTO FROM PREFIJOS WHERE TIDO_COD = NEW.TIDO_COD AND PREF_PRE = NEW.PREF_PRE INTO :NUMERO, :AUTOM;
  if (AUTOM = 'S') then
    BEGIN
    /* ACTUALICE EL NUMERO EN COMPROBANTE_ENCABEZADO  */
    NEW.ENSA_NUMERO = NUMERO;
    NUMERO = CAST((CAST(NUMERO AS INTEGER) + 1) AS CHAR(6));
    UPDATE PREFIJOS
      SET PREF_ACTUAL = :NUMERO
    WHERE TIDO_COD = NEW.TIDO_COD AND PREF_PRE = NEW.PREF_PRE;
    END
  ELSE
    begin
    if (CAST(NUMERO AS INTEGER) = CAST(NEW.ENSA_NUMERO AS INTEGER)) then
        UPDATE PREFIJOS
          SET PREF_ACTUAL = CAST((CAST(PREF_ACTUAL AS INTEGER) + 1) AS CHAR(6))
        WHERE TIDO_COD = NEW.TIDO_COD AND PREF_PRE = NEW.PREF_PRE;
    end
  EXECUTE PROCEDURE COMPLETA_CEROS (NEW.ENSA_numero) returning_values (NEW.ENSA_numero);
  NEW.numok = 'S';
  END
/* Verifique que el numero no existe previamente */
EXISTE = 'N';
SELECT 'S' FROM ensambles WHERE PREF_PRE = NEW.PREF_PRE AND ENSA_NUMERO = NEW.ENSA_NUMERO INTO :EXISTE;
if (EXISTE = 'S') then
    EXCEPTION DOCUMENTO_REGISTRADO 'Ya existe un ensamble con el número ' || new.pref_pre || new.ensa_numero;
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER ENTRADAS_BI FOR ENTRADAS
ACTIVE BEFORE INSERT POSITION 1
AS
declare variable NUMERO VARCHAR(6);
declare variable AUTOM CHAR(1);
declare variable EXISTE CHAR(1);
BEGIN
if (NEW.numok = 'N') then
  BEGIN
  /* Actualice el contador del prefijo */
  SELECT PREF_ACTUAL, PREF_AUTO FROM PREFIJOS WHERE TIDO_COD = NEW.TIDO_COD AND PREF_PRE = NEW.PREF_PRE INTO :NUMERO, :AUTOM;
  /* ACTUALICE EL NUMERO EN COMPROBANTE_ENCABEZADO  */
  if (AUTOM = 'S') then
    BEGIN
    NEW.ENTR_NUMERO = NUMERO;
    NUMERO = CAST((CAST(NUMERO AS INTEGER) + 1) AS CHAR(6));
    UPDATE PREFIJOS
      SET PREF_ACTUAL = :NUMERO
    WHERE TIDO_COD = NEW.TIDO_COD AND PREF_PRE = NEW.PREF_PRE;
    END
  ELSE
    BEGIN
    if (CAST(NUMERO AS INTEGER) = CAST(NEW.ENTR_NUMERO AS INTEGER)) then
        UPDATE PREFIJOS
          SET PREF_ACTUAL = CAST((CAST(PREF_ACTUAL AS INTEGER) + 1) AS CHAR(6))
        WHERE TIDO_COD = NEW.TIDO_COD AND PREF_PRE = NEW.PREF_PRE;
    END
  EXECUTE PROCEDURE COMPLETA_CEROS (NEW.entr_numero) returning_values (NEW.entr_numero);
  NEW.numok = 'S';
  END
/* Verifique que el numero no existe previamente */
EXISTE = 'N';
SELECT 'S' FROM ENTRADAS WHERE PREF_PRE = NEW.PREF_PRE AND ENTR_NUMERO = NEW.ENTR_NUMERO INTO :EXISTE;
if (EXISTE = 'S') then
    EXCEPTION DOCUMENTO_REGISTRADO 'Ya existe una entrada con el número ' || new.pref_pre || new.entr_numero;
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER FACTURAS_BI FOR FACTURAS
ACTIVE BEFORE INSERT POSITION 0
AS
declare variable NUMERO VARCHAR(6);
declare variable AUTOM CHAR(1);
declare variable EXISTE CHAR(1);
DECLARE VARIABLE VALCUPO CHAR(10);
declare variable DISPONIBLE NUMERIC(18,2);
declare variable OK CHAR(1);
declare variable SITOT CHAR(2);
declare variable CODCOBR INTEGER;
declare variable CODVEND INTEGER;
declare variable contado char(1);
declare variable BLOQAUTO CHAR(2);
declare variable FECCONTA VARCHAR(8);
declare variable FECBLO VARCHAR(8);
declare variable FECSERVER CHAR(2);
declare variable PREGTASA CHAR(2);
BEGIN
EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION', 'DOCUMENTOS', 'INHABILITAR FECHA EN DOCUMENTOS') returning_values (:fecserver);
if (FECSERVER = 'SI') then
    NEW.fact_fecha = CAST ('NOW' AS DATE);
/* doble moneda */
if (NEW.fact_trm IS NULL) then
    NEW.fact_trm = 1;
EXECUTE PROCEDURE LEE_CONFIGURACION('GENERAL', 'GENERAL', 'PREGUNTAR TASA DE CAMBIO EN DOCUMENTOS DE CARTERA') returning_values (:pregtasa);
if (PREGTASA = 'SI') then
    BEGIN
    NEW.fact_dtomonto = NEW.fact_dtomonto * NEW.fact_trm;
    NEW.fact_comimonto = NEW.fact_comimonto * NEW.fact_trm;
    NEW.fact_adicional = NEW.fact_adicional * NEW.fact_trm;
    NEW.fact_ivamonto = NEW.fact_ivamonto * NEW.fact_trm;
    NEW.fact_rtftemonto = NEW.fact_rtftemonto * NEW.fact_trm;
    NEW.fact_rtivamonto = NEW.fact_rtivamonto * NEW.fact_trm;
    NEW.fact_rticamonto = NEW.fact_rticamonto * NEW.fact_trm;
    NEW.fact_extra = NEW.fact_extra * NEW.fact_trm;
    NEW.fact_dtofmonto = NEW.fact_dtofmonto * NEW.fact_trm;
    NEW.fact_total = NEW.fact_total * NEW.fact_trm;
    NEW.fact_dtoit1 = NEW.fact_dtoit1 * NEW.fact_trm;
    NEW.fact_dtoit2 = NEW.fact_dtoit2 * NEW.fact_trm;
    NEW.fact_dtoit3 = NEW.fact_dtoit3 * NEW.fact_trm;
    END
EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION', 'POS', 'CAMBIAR FECHA DE BLOQUEO AUTOMATICAMENTE AL CAMBIAR FECHA DE LA FACTURA') RETURNING_VALUES (:bloqauto);
if (bloqauto = 'SI') then
    BEGIN
    EXECUTE PROCEDURE LEE_CONFIGURACION ('CONTABILIDAD', 'GENERAL', 'FECHA DE BLOQUEO') RETURNING_VALUES (:FECBLO);
    EXECUTE PROCEDURE fecha_a_conta (NEW.fact_fecha) returning_values (:FECCONTA);
    if (FECBLO > FECCONTA) then
        EXCEPTION CONTABILIDAD_BLOQUEADA 'La contabilidad esta bloqueada a ' || :fecblo;
    if (FECBLO < FECCONTA) then
        UPDATE CONFIGURACION
            SET CONF_VALOR = :FECCONTA
            WHERE (CONF_MODULO = 'CONTABILIDAD') AND (CONF_CATEGORIA = 'GENERAL') AND (CONF_PROPIEDAD = 'FECHA DE BLOQUEO');
    END
OK = 'S';
EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'ACCION A TOMAR SI EL CUPO DE CREDITO ES INSUFICIENTE') RETURNING_VALUES (:VALCUPO);
select auto_contado from autorizaciones where pref_pre = new.pref_pre and tido_cod = 31 into :contado;
if (contado='N') then
BEGIN
  IF (VALCUPO = 'PROHIBIR') THEN
  BEGIN
  OK = 'N';
  /* VERIFIQUE EL CUPO DE CREDITO */
  execute procedure cupo_disponible(new.TERC_NIT, NEW.fact_fecha, NEW.fact_sucursal) returning_values (:DISPONIBLE);
  if (DISPONIBLE >= NEW.FACT_TOTAL) then
    OK = 'S';
  END
END
IF (OK = 'S') THEN
  begin
  /* calcule la comision */
  EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION', 'VENDEDORES', 'COMISIONES EN VENTA INCLUYENDO IMPUESTOS') returning_values (:SITOT);
  if ((NEW.fact_comiporc IS NULL) or (NEW.fact_comiporc = 0)) THEN
    BEGIN
    if (SITOT = 'SI') then
      SELECT MAX(COMI_PORC) FROM comisiones WHERE VEND_COD = NEW.vend_cod AND
        COMI_INICIAL <= NEW.fact_total AND COMI_FINAL >= NEW.fact_total
        INTO NEW.fact_comiporc;
    else
      SELECT MAX(COMI_PORC) FROM comisiones WHERE VEND_COD = NEW.vend_cod AND
        COMI_INICIAL <= (NEW.fact_total -NEW.fact_ivamonto) AND COMI_FINAL >= (NEW.fact_total -NEW.fact_ivamonto)
        INTO NEW.fact_comiporc;
    if (NEW.fact_comiporc IS NULL) then
        NEW.fact_comiporc = 0;
    END
  if (SITOT = 'SI') then
      NEW.fact_comimonto = NEW.fact_total * NEW.fact_comiporc / 100;
  ELSE
      NEW.fact_comimonto = (NEW.fact_total -NEW.fact_ivamonto) * NEW.fact_comiporc / 100;

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

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

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER FACTURAS_COMPRA_AD FOR FACTURAS_COMPRA
ACTIVE AFTER DELETE POSITION 0
AS
declare variable ABONOS INTEGER;
declare variable consec INTEGER;
BEGIN
/* borre la contabilización */
select enco_consec from comprobante_encabezado where enco_tiporef = 21 and enco_idref = old.faco_id into :consec;
if (NOT consec is null) then
  delete from comprobante_detalle where enco_consec = :consec;
delete from comprobante_encabezado where enco_tiporef = 21 and enco_idref = old.faco_id;
INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
    VALUES (USER, 21, OLD.faco_id, 'D', old.pref_pre || old.faco_numero);

if ((OLD.faco_id <> 0) AND (OLD.faco_anulado = 'N')) then
    BEGIN
    /* VERIFIQUE QUE NO HAY DEVOLUCIONES */
    SELECT COUNT(*) FROM devoluciones_compras WHERE DVCO_FACTID = OLD.faco_id INTO :abonos;
    if (abonos > 0) then
        exception documento_devuelto 'La factura de compra ' || old.pref_pre || old.faco_numero || ' tiene devoluciones registradas.';
    /* Verifique si habia abonos a la nota */
    ABONOS = 0;
    select COUNT(*) FROM saldos_doc_cxpagar WHERE SDCP_TIPOREF = 21 AND SDCP_IDREF = OLD.FACO_ID AND SDCP_ABONO <> 0 INTO :ABONOS;
    if (ABONOS = 0) then
        BEGIN
        /* BORRE EL REGISTRO PREVIO */
        delete from saldos_doc_cxpagar where sdcp_tiporef = 21 and sdcp_idref = old.faco_id;
        delete from movimiento_proveedor where (mvpr_tiporef = 21) and (mvpr_idref = old.faco_id);
        /* ACTUALICE LA CONSOLIDACION */
        if (OLD.FACO_CONSOLIDA <> 0) then
            UPDATE consolidado_faltantes SET COFA_OK = 'N' WHERE COFA_ID = OLD.faco_consolida;
        END
    else
        exception DOCUMENTO_CON_ABONOS 'La factura de compra ' || old.pref_pre || old.faco_numero || ' tiene abonos registrados.';
    END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER FACTURAS_COMPRA_AU FOR FACTURAS_COMPRA
ACTIVE AFTER UPDATE POSITION 0
AS
declare variable ABONOS integer;
declare variable CONC VARCHAR(60);
declare variable consec INTEGER;
BEGIN
/* borre la contabilización */
if (NEW.faco_anulado = 'S') then
    BEGIN
    select enco_consec from comprobante_encabezado where enco_tiporef = 21 and enco_idref = old.faco_id into :consec;
    if (NOT consec is null) then
      delete from comprobante_detalle where enco_consec = :consec;
    delete from comprobante_encabezado where enco_tiporef = 21 and enco_idref = old.faco_id;
    INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
        VALUES (USER, 21, NEW.faco_id, 'A', NEW.pref_pre || NEW.faco_numero);
    END
/* DESHAGA LO VIEJO Y GRABE LO NUEVO */
if ((old.FACO_id <> 0) AND (OLD.FACO_anulado = 'N')) then
    begin
    /* VERIFIQUE QUE NO HAY DEVOLUCIONES */
    SELECT COUNT(*) FROM devoluciones_compras WHERE DVCO_FACTID = OLD.faco_id AND DVCO_ANULADO = 'N' INTO :abonos;
    if (abonos > 0) then
        exception documento_devuelto 'La factura de compra ' || old.pref_pre || old.faco_numero || ' tiene devoluciones registradas.';

    /* Verifique si habia abonos a la nota */
    ABONOS = 0;
    select COUNT(*) FROM saldos_doc_cxpagar WHERE SDCP_TIPOREF = 21 AND SDCP_IDREF = OLD.FACO_ID AND SDCP_ABONO <> 0 INTO :ABONOS;
    if (ABONOS = 0) then
        BEGIN
        /* BORRE EL REGISTRO PREVIO */
        delete from saldos_doc_cxpagar where sdcp_tiporef = 21 and sdcp_idref = old.faco_id;
        delete from movimiento_proveedor where (mvpr_tiporef = 21) and (mvpr_idref = old.faco_id);
        /* ACTUALICE LA CONSOLIDACION */
        if (OLD.FACO_CONSOLIDA <> 0) then
            UPDATE consolidado_faltantes SET COFA_OK = 'N' WHERE COFA_ID = OLD.faco_consolida;
        END
    else
        exception DOCUMENTO_CON_ABONOS 'La factura de compra ' || old.pref_pre || old.faco_numero || ' tiene abonos registrados.';
    end
if ((NEW.FACO_id <> 0) AND (NEW.FACO_anulado = 'N')) then
    begin
    /* Registre el nuevo saldo del documento */
    INSERT INTO saldos_doc_cxpagar (SDCP_TIPOREF, SDCP_IDREF, SDCP_FECHA, TERC_NIT, SDCP_RTEFTE, SDCP_RTIVA, SDCP_RTICA, SDCP_ABONO, SDCP_ABRTFTE, SDCP_ABRTIVA, SDCP_ABRTICA, SDCP_DEBITO, SDCP_MONTO, SDCP_TRM)
        VALUES (21, NEW.FACO_ID, NEW.FACO_fecha, NEW.terc_nit, NEW.FACO_rtftemonto, NEW.FACO_rtivamonto, NEW.FACO_rticamonto, 0, 0, 0, 0, 'N', NEW.FACO_TOTAL, NEW.faco_trm);
    /* Registre el movimiento del proveedor */
    CONC = 'FACTURA DE COMPRA No.' || NEW.PREF_PRE || NEW.FACO_NUMERO || ' - ' || NEW.faco_numprov;
    INSERT INTO movimiento_proveedor(MVPR_ID, TERC_NIT, MVPR_TIPOREF, MVPR_IDREF, MVPR_FECHA, MVPR_VENCE, MVPR_CONC, MVPR_MONTO, MVPR_RTFTE, MVPR_RTIVA, MVPR_RTICA, MVPR_DEBITO, MVPR_ABONO, MVPR_PREFIJO, MVPR_NUMERO, MVPR_TRM)
        VALUES (GEN_ID(ID_MOVPROV, 1), NEW.TERC_NIT, 21, NEW.FACO_ID, NEW.FACO_FECHA, NEW.faco_vence, :CONC, NEW.FACO_TOTAL, NEW.FACO_RTFTEMONTO, NEW.FACO_RTIVAMONTO, NEW.FACO_RTICAMONTO, 'S', 'N', NEW.pref_pre, NEW.FACO_numero, NEW.faco_trm);
    INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
        VALUES (USER, 21, NEW.faco_id, 'U', NEW.pref_pre || NEW.faco_numero);
    end
/* si cambia numero o fecha cambie los detalles */
if ((OLD.pref_pre <> NEW.pref_pre) or
    (OLD.faco_numero <> NEW.faco_numero) or
    (OLD.faco_fecha <> NEW.faco_fecha)) then
    UPDATE FACTURAS_COMPRAS_DETALLE SET FCDE_TRANSMIT = 'N' WHERE FACO_ID = NEW.FACO_ID;
/* ACTUALICE EL ANULADO EN LOS DETALLES */
if (OLD.FACO_anulado <> NEW.FACO_anulado) then
    UPDATE FACTURAS_COMPRAS_DETALLE SET FCDE_ANULADO = NEW.FACO_anulado WHERE FACO_ID = NEW.FACO_ID;
if (OLD.faco_transmit <> NEW.faco_transmit) then
    UPDATE FACTURAS_COMPRAS_DETALLE SET FCDE_TRANSMIT = NEW.faco_transmit WHERE FACO_ID = NEW.FACO_ID;
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER FACTURAS_COMPRA_BI FOR FACTURAS_COMPRA
ACTIVE BEFORE INSERT POSITION 0
AS
declare variable NUMERO VARCHAR(6);
declare variable AUTOM CHAR(1);
declare variable EXISTE CHAR(1);
declare variable PREGTASA CHAR(2);
BEGIN
if (NEW.FACO_SIMPLIFICADO IS NULL) then
    NEW.faco_simplificado = 'N';
/* doble moneda */
if ((NEW.faco_trm IS NULL) OR (NEW.FACO_TRM = 0)) then
    NEW.faco_trm = 1;
EXECUTE PROCEDURE LEE_CONFIGURACION('GENERAL', 'GENERAL', 'PREGUNTAR TASA DE CAMBIO EN DOCUMENTOS DE CUENTAS POR PAGAR') returning_values (:pregtasa);
if (PREGTASA = 'SI') then
    BEGIN
    NEW.faco_dtomonto = NEW.faco_dtomonto * NEW.faco_trm;
    NEW.faco_adicional = NEW.faco_adicional * NEW.faco_trm;
    NEW.faco_extra = NEW.faco_extra * NEW.faco_trm;
    NEW.faco_rtivamonto = NEW.faco_rtivamonto * NEW.faco_trm;
    NEW.faco_rticamonto = NEW.faco_rticamonto * NEW.faco_trm;
    NEW.faco_rtftemonto = NEW.faco_rtftemonto * NEW.faco_trm;
    NEW.faco_ivamonto = NEW.faco_ivamonto * NEW.faco_trm;
    NEW.faco_dtofmonto = NEW.faco_dtofmonto * NEW.faco_trm;
    NEW.faco_total = NEW.faco_total * NEW.faco_trm;
    END
if (NEW.numok = 'N') then
  BEGIN
  /* Actualice el contador del prefijo */
  SELECT PREF_ACTUAL, PREF_AUTO FROM PREFIJOS WHERE TIDO_COD = 21 AND PREF_PRE = NEW.PREF_PRE INTO :NUMERO, :AUTOM;
  /* ACTUALICE EL NUMERO EN COMPROBANTE_ENCABEZADO  */
  if (AUTOM = 'S') then
    BEGIN
    NEW.faco_numero = NUMERO;
    NUMERO = CAST((CAST(NUMERO AS INTEGER) + 1) AS CHAR(6));
    UPDATE PREFIJOS
      SET PREF_ACTUAL = :NUMERO
    WHERE TIDO_COD = 21 AND PREF_PRE = NEW.PREF_PRE;
    END
  ELSE
    BEGIN
    if (CAST(NUMERO AS INTEGER) = CAST(NEW.FACO_NUMERO AS INTEGER)) then
        UPDATE PREFIJOS
          SET PREF_ACTUAL = CAST((CAST(PREF_ACTUAL AS INTEGER) + 1) AS CHAR(6))
        WHERE TIDO_COD = 21 AND PREF_PRE = NEW.PREF_PRE;
    END
  EXECUTE PROCEDURE COMPLETA_CEROS (NEW.FACO_numero) returning_values (NEW.FACO_numero);
  NEW.numok = 'S';
  END
/* Verifique que el numero no existe previamente */
EXISTE = 'N';
SELECT 'S' FROM FACTURAS_COMPRA WHERE PREF_PRE = NEW.PREF_PRE AND FACO_NUMERO = NEW.FACO_NUMERO INTO :EXISTE;
if (EXISTE = 'S') then
    EXCEPTION DOCUMENTO_REGISTRADO 'Ya existe una factura de compra con el número ' || new.pref_pre || new.faco_numero;
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER NOTAS_CREDITO_BI FOR NOTAS_CREDITO
ACTIVE BEFORE INSERT POSITION 0
AS
declare variable NUMERO VARCHAR(6);
declare variable AUTOM CHAR(1);
declare variable EXISTE CHAR(1);
BEGIN
if (NEW.numok = 'N') then
  BEGIN
  /* Actualice el contador del prefijo */
  SELECT PRBA_NUMERO, PRBA_AUTO FROM PREFIJOS_BANCOS
    WHERE TIDO_COD = 75 AND CUBA_COD = NEW.CUBA_COD AND PRBA_PREF = NEW.PRBA_PREF INTO :NUMERO, :AUTOM;
  /* ACTUALICE EL NUMERO EN COMPROBANTE_ENCABEZADO */
  if (AUTOM = 'S') then
    BEGIN
    NEW.NCBC_NUMERO = NUMERO;
    NUMERO = CAST((CAST(NUMERO AS INTEGER) + 1) AS CHAR(6));
    UPDATE PREFIJOS_BANCOS
      SET PRBA_NUMERO = :NUMERO
    WHERE TIDO_COD = 75 AND CUBA_COD = NEW.CUBA_COD AND PRBA_PREF = NEW.PRBA_PREF;
    END
  ELSE
    BEGIN
    if (CAST(NUMERO AS INTEGER) = CAST(NEW.NCBC_NUMERO AS INTEGER)) then
        UPDATE PREFIJOS_BANCOS
          SET PRBA_NUMERO = CAST((CAST(PRBA_NUMERO AS INTEGER) + 1) AS CHAR(6))
        WHERE TIDO_COD = 75 AND CUBA_COD = NEW.CUBA_COD AND PRBA_PREF = NEW.PRBA_PREF;
    END
  EXECUTE PROCEDURE COMPLETA_CEROS (NEW.NCBC_numero) returning_values (NEW.NCBC_numero);
  NEW.numok = 'S';
  END
/* Verifique que el numero no existe previamente */
EXISTE = 'N';
SELECT 'S' FROM NOTAS_CREDITO
    WHERE CUBA_COD = NEW.CUBA_COD AND PRBA_PREF = NEW.PRBA_PREF AND NCBC_NUMERO = NEW.NCBC_NUMERO INTO :EXISTE;
if (EXISTE = 'S') then
    EXCEPTION DOCUMENTO_REGISTRADO 'Ya existe una nota crédito con el número ' || new.prba_pref || new.ncbc_numero;
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER NOTAS_CREDITO_CLIENTES_AD FOR NOTAS_CREDITO_CLIENTES
ACTIVE AFTER DELETE POSITION 0
AS
declare variable consec INTEGER;
declare variable ABONOS integer;
BEGIN
select enco_consec from comprobante_encabezado where enco_tiporef = 42 and enco_idref = old.nccl_id into :consec;
if (NOT consec is null) then
 delete from comprobante_detalle where enco_consec = :consec;
delete from comprobante_encabezado where enco_tiporef = 42 and enco_idref = old.nccl_id;
/* BORRE EL REGISTRO PREVIO */
if ((old.nccl_id <> 0) and (old.nccl_anulado = 'N')) then
    begin
    /* Verifique si habia abonos a la nota */
    ABONOS = 0;
    select COUNT(*) FROM SALDOS_DOC_CARTERA WHERE SDCA_TIPOREF = 42 AND SDCA_IDREF = OLD.NCCL_ID AND SDCA_ABONO <> 0 INTO :ABONOS;
    if (ABONOS = 0) then
        BEGIN
        /* BORRE EL REGISTRO PREVIO */
        delete from saldos_doc_cartera where sdca_tiporef = 42 and sdca_idref = old.nccl_id;
        delete from movimiento_CLIENTES where (mvcl_tiporef = 42) and (mvcl_idref = old.nccl_id);
        END
    else
        exception DOCUMENTO_CON_ABONOS 'La nota crédito ' || old.pref_pre || old.nccl_numero || ' ya tiene abonos registrados.';
    end
INSERT INTO AUDITORIA (AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
    VALUES (USER, 42, old.nccl_id, 'D', old.pref_pre || old.nccl_numero);
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER NOTAS_CREDITO_CLIENTES_AU FOR NOTAS_CREDITO_CLIENTES
ACTIVE AFTER UPDATE POSITION 0
AS
declare variable consec INTEGER;
declare variable ABONOS char(1);
BEGIN
if (new.nccl_anulado = 'S') then
    begin
    select enco_consec from comprobante_encabezado where enco_tiporef = 42 and enco_idref = old.nccl_id into :consec;
    if (NOT consec is null) then
     delete from comprobante_detalle where enco_consec = :consec;
    delete from comprobante_encabezado where enco_tiporef = 42 and enco_idref = old.nccl_id;
    INSERT INTO AUDITORIA (AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
        VALUES (USER, 42, new.nccl_id, 'A', NEW.pref_pre || NEW.nccl_numero);
    end

/* BORRE EL REGISTRO PREVIO */
if ((old.nccl_id <> 0) and (old.nccl_anulado = 'N')) then
    begin
    /* Verifique si habia abonos a la nota */
    ABONOS = 'N';
    select 'S' FROM SALDOS_DOC_CARTERA WHERE SDCA_TIPOREF = 42 AND SDCA_IDREF = OLD.NCCL_ID AND SDCA_ABONO <> 0 INTO :ABONOS;
    if (ABONOS = 'N') then
        BEGIN
        /* BORRE EL REGISTRO PREVIO */
        delete from saldos_doc_cartera where sdca_tiporef = 42 and sdca_idref = old.nccl_id;
        delete from movimiento_clientes where (mvcl_tiporef = 42) and (mvcl_idref = old.nccl_id);
        END
    else
        exception DOCUMENTO_CON_ABONOS 'La nota crédito ' || new.pref_pre || new.nccl_numero || ' tiene abonos registrados.';
    end
if ((new.nccl_id <> 0) and (new.nccl_anulado = 'N')) then
    begin
    /* Registre el nuevo saldo del documento */
    INSERT INTO SALDOS_DOC_CARTERA (SDCA_TIPOREF, SDCA_IDREF, SDCA_FECHA, TERC_NIT, SDCA_RTFTE, SDCA_RTIVA, SDCA_RTICA, SDCA_ABONO, SDCA_ABRTFTE, SDCA_ABRTIVA, SDCA_ABRTICA, SDCA_DEBITO, SDCA_MONTO, SDCA_TRM)
        VALUES (42, NEW.NCCL_ID, NEW.nccl_fecha, NEW.terc_nit, (NEW.nccl_rtftemonto*-1), (NEW.nccl_rtivamonto*-1), (NEW.nccl_rticamonto*-1), 0, 0, 0, 0, 'N', ((NEW.nccl_monto+NEW.nccl_ivamonto)*-1), NEW.nccl_trm);
    /* Registre el movimiento del proveedor */
    INSERT INTO MOVIMIENTO_CLIENTES (MVCL_ID, TERC_NIT, MVCL_TIPOREF, MVCL_IDREF, MVCL_FECHA, MVCL_VENCE, MVCL_CONC, MVCL_MONTO, MVCL_RTEFTE, MVCL_RTEIVA, MVCL_RTEICA, MVCL_DEBITO, MVCL_ABONO, MVCL_PREFREF, MVCL_NUMREF, MVCL_SUCURSAL, COBR_COD, MVCL_TRM)
        VALUES (GEN_ID(ID_MOVCLI, 1), NEW.TERC_NIT, 42, NEW.NCCL_ID, NEW.NCCL_FECHA, NEW.NCCL_FECHA, NEW.NCCL_CONC, NEW.NCCL_MONTO+NEW.nccl_ivamonto, NEW.NCCL_RTFTEMONTO, NEW.NCCL_RTIVAMONTO, NEW.NCCL_RTICAMONTO, 'N', 'N', NEW.pref_pre, NEW.nccl_numero, NEW.nccl_sucursal, NEW.cobr_cod, NEW.nccl_trm);
    INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
        VALUES (USER, 42, NEW.nccl_id, 'U', NEW.pref_pre || NEW.nccl_numero);
    end
END
^

SET TERM ; ^

SET TERM ^ ;

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

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER NOTAS_CREDITO_PROVEEDOR_AD FOR NOTAS_CREDITO_PROVEEDOR
ACTIVE AFTER DELETE POSITION 0
AS
declare variable consec INTEGER;
declare variable ABONOS integer;
BEGIN
select enco_consec from comprobante_encabezado where enco_tiporef = 52 and enco_idref = old.ncpr_id into :consec;
if (NOT consec is null) then
 delete from comprobante_detalle where enco_consec = :consec;
delete from comprobante_encabezado where enco_tiporef = 52 and enco_idref = old.ncpr_id;

if ((old.ncpr_id <> 0) and (old.ncpr_anulado = 'N')) then
    begin
    /* Verifique si habia abonos a la nota */
    ABONOS = 0;
    select COUNT(*) FROM SALDOS_DOC_CXPAGAR WHERE SDCP_TIPOREF = 52 AND SDCP_IDREF = OLD.NCPR_ID AND SDCP_ABONO <> 0 INTO :ABONOS;
    if (ABONOS = 0) then
        BEGIN
        /* BORRE EL REGISTRO PREVIO */
        delete from saldos_doc_cxpagar where sdcp_tiporef = 52 and sdcp_idref = old.ncpr_id;
        delete from movimiento_PROVEEDOR where (mvpr_tiporef = 52) and (mvpr_idref = old.ncpr_id);
        delete from movimiento_articulo where  (mvar_tipodoc = 52) and (mvar_idref = old.ncpr_id);
        END
    else
        exception DOCUMENTO_CON_ABONOS 'El descuento de proveedor ' || old.pref_pre || old.ncpr_numero || ' tiene abonos registrados.';
    INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
        VALUES (USER, 52, OLD.ncpr_id, 'D', OLD.pref_pre || OLD.ncpr_numero);
    end
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER NOTAS_CREDITO_PROVEEDOR_AU FOR NOTAS_CREDITO_PROVEEDOR
ACTIVE AFTER UPDATE POSITION 0
AS
declare variable ABONOS char(1);
declare variable consec INTEGER;
declare variable COSTO NUMERIC(18,2);
declare variable EXISTENCIA NUMERIC(18,4);
declare variable CODBOD VARCHAR(3);
BEGIN
if (new.ncpr_anulado = 'S') then
    begin
    select enco_consec from comprobante_encabezado where enco_tiporef = 52 and enco_idref = old.ncpr_id into :consec;
    if (NOT consec is null) then
      delete from comprobante_detalle where enco_consec = :consec;
    delete from comprobante_encabezado where enco_tiporef = 52 and enco_idref = old.ncpr_id;
    INSERT INTO AUDITORIA (AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
        VALUES (USER, 52, new.ncpr_id, 'A', NEW.pref_pre || NEW.ncpr_numero);
    end

/* BORRE EL REGISTRO PREVIO */
if ((old.ncpr_id <> 0) and (old.ncpr_anulado = 'N')) then
    begin
    /* Verifique si habia abonos a la nota */
    ABONOS = 'N';
    select 'S' FROM SALDOS_DOC_CXPAGAR WHERE SDCP_TIPOREF = 52 AND SDCP_IDREF = OLD.NCPR_ID AND SDCP_ABONO <> 0 INTO :ABONOS;
    if (ABONOS = 'N') then
        BEGIN
        /* BORRE EL REGISTRO PREVIO */
        delete from saldos_doc_cxpagar where sdcp_tiporef = 52 and sdcp_idref = old.ncpr_id;
        delete from movimiento_PROVEEDOR where (mvpr_tiporef = 52) and (mvpr_idref = old.ncpr_id);
        delete from movimiento_articulo where  (mvar_tipodoc = 52) and (mvar_idref = old.ncpr_id);
        END
    else
        exception DOCUMENTO_CON_ABONOS 'El descuento de proveedor ' || old.pref_pre || old.ncpr_numero || ' tiene abonos registrados.';
    end
if ((new.ncpr_id <> 0) and (new.ncpr_anulado = 'N')) then
    begin
    /* Registre el nuevo saldo del documento */
    INSERT INTO SALDOS_DOC_CXPAGAR (SDCP_TIPOREF, SDCP_IDREF, SDCP_FECHA, TERC_NIT, SDCP_RTEFTE, SDCP_RTIVA, SDCP_RTICA, SDCP_ABONO, SDCP_ABRTFTE, SDCP_ABRTIVA, SDCP_ABRTICA, SDCP_DEBITO, SDCP_MONTO, SDCP_TRM)
        VALUES (52, NEW.NCPR_ID, NEW.ncpr_fecha, NEW.terc_nit, (NEW.ncpr_rtftemonto * -1), (NEW.ncpr_rtivamonto * -1), (NEW.ncpr_rticamonto * -1), 0, 0, 0, 0, 'N', (NEW.ncpr_monto+NEW.ncpr_ivamonto)*-1, NEW.ncpr_trm);
    /* Registre el movimiento del proveedor */
    INSERT INTO MOVIMIENTO_PROVEEDOR (MVPR_ID, TERC_NIT, MVPR_TIPOREF, MVPR_IDREF, MVPR_FECHA, MVPR_VENCE, MVPR_CONC, MVPR_MONTO, MVPR_RTFTE, MVPR_RTIVA, MVPR_RTICA, MVPR_DEBITO, MVPR_ABONO, MVPR_PREFIJO, MVPR_NUMERO, MVPR_TRM)
        VALUES (GEN_ID(ID_MOVPROV, 1), NEW.TERC_NIT, 52, NEW.NCPR_ID, NEW.NCPR_FECHA, NEW.NCPR_FECHA, NEW.NCPR_CONC, NEW.NCPR_MONTO+NEW.ncpr_ivamonto, NEW.NCPR_RTFTEMONTO, NEW.NCPR_RTIVAMONTO, NEW.NCPR_RTICAMONTO, 'N', 'N', NEW.pref_pre, NEW.ncpr_numero, NEW.ncpr_trm);
    /* afecte el articulo */
    if (new.arti_cod <> '') then
        begin
        /* CALCULE EL NUEVO COSTO */
        execute procedure costo_promedio (new.arti_cod, new.ncpr_fecha) returning_values (:COSTO);
        execute procedure saldo_total_inventario (new.arti_cod, new.ncpr_fecha) returning_values (:EXISTENCIA);
        COSTO = (COSTO * EXISTENCIA - (NEW.ncpr_monto - NEW.ncpr_ivamonto)) / EXISTENCIA;
        FOR SELECT DISTINCT BODE_COD FROM EXISTENCIA WHERE ARTI_COD = NEW.ARTI_COD INTO :CODBOD do
            BEGIN
            execute procedure saldo_inventario (new.arti_cod, :CODBOD, new.ncpr_fecha) returning_values (:EXISTENCIA);
            /* SAQUE TODO LO QUE TENGA */
            INSERT INTO MOVIMIENTO_ARTICULO
                (ARTI_COD, MVAR_CONS, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM, TERC_NIT)
                VALUES(NEW.ARTI_COD, GEN_ID(ID_MOVARTI,1), :CODBOD, new.ncpr_fecha, 52, NEW.ncpr_id,
                new.ncpr_conc, :EXISTENCIA, 0, 'N', '', new.pref_pre, new.ncpr_numero, 1, new.terc_nit);
            /* META TODO CON EL NUEVO COSTO */
            INSERT INTO MOVIMIENTO_ARTICULO
                (ARTI_COD, MVAR_CONS, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM, TERC_NIT)
                VALUES(NEW.ARTI_COD, GEN_ID(ID_MOVARTI,1), :CODBOD, new.ncpr_fecha, 52, NEW.ncpr_id,
                new.ncpr_conc, :EXISTENCIA, :COSTO, 'S', '', new.pref_pre, new.ncpr_numero, 1, new.terc_nit);
            END
        /* RECORRA LAS LISTAS DE PRECIOS Y CAMBIE EL PRECIO */
        EXECUTE PROCEDURE CALCULA_PRECIOS(NEW.ARTI_COD, new.ncpr_fecha);
        end
    INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
        VALUES (USER, 52, NEW.ncpr_id, 'U', NEW.pref_pre || NEW.ncpr_numero);
    end
END
^

SET TERM ; ^

SET TERM ^ ;

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

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER NOTAS_DEBITO_BI FOR NOTAS_DEBITO
ACTIVE BEFORE INSERT POSITION 0
AS
declare variable NUMERO VARCHAR(6);
declare variable AUTOM CHAR(1);
declare variable EXISTE CHAR(1);
BEGIN
if (NEW.numok = 'N') then
  BEGIN
  /* Actualice el contador del prefijo */
  SELECT PRBA_NUMERO, PRBA_AUTO FROM PREFIJOS_BANCOS
    WHERE TIDO_COD = 74 AND CUBA_COD = NEW.CUBA_COD AND PRBA_PREF = NEW.PRBA_PREF INTO :NUMERO, :AUTOM;
  /* ACTUALICE EL NUMERO EN COMPROBANTE_ENCABEZADO */
  if (AUTOM = 'S') then
    BEGIN
    NEW.NDBC_NUMERO = NUMERO;
    NUMERO = CAST((CAST(NUMERO AS INTEGER) + 1) AS CHAR(6));
    UPDATE PREFIJOS_BANCOS
      SET PRBA_NUMERO = :NUMERO
    WHERE TIDO_COD = 74 AND CUBA_COD = NEW.CUBA_COD AND PRBA_PREF = NEW.PRBA_PREF;
    END
  ELSE
    BEGIN
    if (CAST(NUMERO AS INTEGER) = CAST(NEW.NDBC_NUMERO AS INTEGER)) then
        UPDATE PREFIJOS_BANCOS
          SET PRBA_NUMERO = CAST((CAST(PRBA_NUMERO AS INTEGER) + 1) AS CHAR(6))
        WHERE TIDO_COD = 74 AND CUBA_COD = NEW.CUBA_COD AND PRBA_PREF = NEW.PRBA_PREF;
    END
  EXECUTE PROCEDURE COMPLETA_CEROS (NEW.NDBC_numero) returning_values (NEW.NDBC_numero);
  NEW.numok = 'S';
  END
/* Verifique que el numero no existe previamente */
EXISTE = 'N';
SELECT 'S' FROM NOTAS_DEBITO
    WHERE CUBA_COD = NEW.CUBA_COD AND PRBA_PREF = NEW.PRBA_PREF AND NDBC_NUMERO = NEW.NDBC_NUMERO INTO :EXISTE;
if (EXISTE = 'S') then
    EXCEPTION DOCUMENTO_REGISTRADO 'Ya existe una nota debito con el número ' || new.prba_pref || new.ndbc_numero;
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER NOTAS_DEBITO_CLIENTES_AD FOR NOTAS_DEBITO_CLIENTES
ACTIVE AFTER DELETE POSITION 0
AS
declare variable ABONOS integer;
declare variable consec INTEGER;
BEGIN
if (old.ndcl_anulado = 'S') then
    begin
    select enco_consec from comprobante_encabezado where enco_tiporef = 41 and enco_idref = old.ndcl_id into :consec;
    if (NOT consec is null) then
       delete from comprobante_detalle where enco_consec = :consec;
    delete from comprobante_encabezado where enco_tiporef = 41 and enco_idref = old.ndcl_id;
    end

/* BORRE EL REGISTRO PREVIO */
if ((old.ndcl_id <> 0) and (old.ndcl_anulado = 'N')) then
    begin
    /* Verifique si habia abonos a la nota */
    ABONOS = 0;
    select COUNT(*) FROM SALDOS_DOC_CARTERA WHERE SDCA_TIPOREF = 41 AND SDCA_IDREF = OLD.NDCL_ID AND SDCA_ABONO <> 0 INTO :ABONOS;
    if (ABONOS = 0) then
        BEGIN
        /* BORRE EL REGISTRO PREVIO */
        delete from saldos_doc_cartera where sdca_tiporef = 41 and sdca_idref = old.ndcl_id;
        delete from movimiento_CLIENTES where (mvcl_tiporef = 41) and (mvcl_idref = old.ndcl_id);
        END
    else
        exception DOCUMENTO_CON_ABONOS 'La nota débito del cliente ' || OLD.pref_pre || OLD.ndcl_numero || ' tiene abonos registrados.';
    INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
        VALUES (USER, 41, OLD.ndcl_id, 'D', OLD.pref_pre || OLD.ndcl_numero);
    end
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER NOTAS_DEBITO_CLIENTES_AU FOR NOTAS_DEBITO_CLIENTES
ACTIVE AFTER UPDATE POSITION 0
AS
declare variable ABONOS INTEGER;
declare variable consec INTEGER;
BEGIN
/* borre la contabilizacion */
if (new.ndcl_anulado = 'S') then
    begin
    select enco_consec from comprobante_encabezado where enco_tiporef = 41 and enco_idref = old.ndcl_id into :consec;
    if (NOT consec is null) then
      delete from comprobante_detalle where enco_consec = :consec;
    delete from comprobante_encabezado where enco_tiporef = 41 and enco_idref = old.ndcl_id;
    INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
        VALUES (USER, 41, NEW.ndcl_id, 'A', NEW.pref_pre || NEW.ndcl_numero);
    end

/* BORRE EL REGISTRO PREVIO */
if ((old.ndcl_id <> 0) and (old.ndcl_anulado = 'N')) then
    begin
    /* Verifique si habia abonos a la nota */
    ABONOS = 0;
    select COUNT(*) FROM SALDOS_DOC_CARTERA WHERE SDCA_TIPOREF = 41 AND SDCA_IDREF = OLD.NDCL_ID AND SDCA_ABONO <> 0 INTO :ABONOS;
    if (ABONOS = 0) then
        BEGIN
        /* BORRE EL REGISTRO PREVIO */
        delete from saldos_doc_cartera where sdca_tiporef = 41 and sdca_idref = old.ndcl_id;
        delete from movimiento_clientes where (mvcl_tiporef = 41) and (mvcl_idref = old.ndcl_id);
        END
    else
        exception DOCUMENTO_CON_ABONOS 'La nota débito del cliente ' || OLD.pref_pre || OLD.ndcl_numero || ' tiene abonos registrados.';
    end
if ((new.ndcl_id <> 0) and (new.ndcl_anulado = 'N')) then
    begin
    /* Registre el nuevo saldo del documento */
    INSERT INTO SALDOS_DOC_CARTERA (SDCA_TIPOREF, SDCA_IDREF, SDCA_FECHA, TERC_NIT, SDCA_RTFTE, SDCA_RTIVA, SDCA_RTICA, SDCA_ABONO, SDCA_ABRTFTE, SDCA_ABRTIVA, SDCA_ABRTICA, SDCA_DEBITO, SDCA_MONTO, SDCA_TRM)
        VALUES (41, NEW.NDCL_ID, NEW.ndcl_fecha, NEW.terc_nit, NEW.ndcl_rtftemonto, NEW.ndcl_rtivamonto, NEW.ndcl_rticamonto, 0, 0, 0, 0, 'N', NEW.ndcl_monto+NEW.ndcl_ivamonto, NEW.ndcl_trm);
    /* Registre el movimiento del proveedor */
    INSERT INTO MOVIMIENTO_CLIENTES (MVCL_ID, TERC_NIT, MVCL_TIPOREF, MVCL_IDREF, MVCL_FECHA, MVCL_VENCE, MVCL_CONC, MVCL_MONTO, MVCL_RTEFTE, MVCL_RTEIVA, MVCL_RTEICA, MVCL_DEBITO, MVCL_ABONO, MVCL_PREFREF, MVCL_NUMREF, MVCL_SUCURSAL, COBR_COD, MVCL_TRM)
        VALUES (GEN_ID(ID_MOVCLI, 1), NEW.TERC_NIT, 41, NEW.NDCL_ID, NEW.NDCL_FECHA, NEW.NDCL_VENCE, NEW.NDCL_CONC, NEW.NDCL_MONTO+NEW.ndcl_ivamonto, NEW.NDCL_RTFTEMONTO, NEW.NDCL_RTIVAMONTO, NEW.NDCL_RTICAMONTO, 'S', 'N', NEW.pref_pre, NEW.ndcl_numero, NEW.ndcl_sucursal, NEW.cobr_cod, NEW.ndcl_trm);
    INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
        VALUES (NEW.ndcl_usuario, 41, NEW.ndcl_id, 'U', NEW.pref_pre || NEW.ndcl_numero);
    end
END
^

SET TERM ; ^

SET TERM ^ ;

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

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

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

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER NOTAS_DEBITO_PROVEEDOR_AD FOR NOTAS_DEBITO_PROVEEDOR
ACTIVE AFTER DELETE POSITION 0
AS
declare variable ABONOS integer;
declare variable consec INTEGER;
BEGIN
select enco_consec from comprobante_encabezado where enco_tiporef = 51 and enco_idref = old.ndpr_id into :consec;
if (NOT consec is null) then
  delete from comprobante_detalle where enco_consec = :consec;
delete from comprobante_encabezado where enco_tiporef = 51 and enco_idref = old.ndpr_id;
/* BORRE EL REGISTRO PREVIO */
if ((old.ndpr_id <> 0) and (old.ndpr_anulado = 'N')) then
    begin
    /* Verifique si habia abonos a la nota */
    ABONOS = 0;
    select COUNT(*) FROM SALDOS_DOC_CXPAGAR WHERE SDCP_TIPOREF = 51 AND SDCP_IDREF = OLD.NDPR_ID AND SDCP_ABONO <> 0 INTO :ABONOS;
    if (ABONOS = 0) then
        BEGIN
        /* BORRE EL REGISTRO PREVIO */
        delete from saldos_doc_cxpagar where sdcp_tiporef = 51 and sdcp_idref = old.ndpr_id;
        delete from movimiento_PROVEEDOR where (mvpr_tiporef = 51) and (mvpr_idref = old.ndpr_id);
        END
    else
        exception DOCUMENTO_CON_ABONOS 'El cargo de proveedor ' || old.pref_pre || old.ndpr_numero || ' tiene abonos registrados.';
    INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
        VALUES (USER, 51, OLD.ndpr_id, 'D', OLD.pref_pre || OLD.ndpr_numero);
    end
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER NOTAS_DEBITO_PROVEEDOR_AU FOR NOTAS_DEBITO_PROVEEDOR
ACTIVE AFTER UPDATE POSITION 0
AS
declare variable ABONOS char(1);
declare variable consec INTEGER;
BEGIN
if (new.ndpr_anulado = 'S') then
    begin
    select enco_consec from comprobante_encabezado where enco_tiporef = 51 and enco_idref = old.ndpr_id into :consec;
    if (NOT consec is null) then
      delete from comprobante_detalle where enco_consec = :consec;
    delete from comprobante_encabezado where enco_tiporef = 51 and enco_idref = old.ndpr_id;
    INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
        VALUES (USER, 51, NEW.ndpr_id, 'A', NEW.pref_pre || NEW.ndpr_numero);
    end

/* BORRE EL REGISTRO PREVIO */
if ((old.ndpr_id <> 0) and (old.ndpr_anulado = 'N')) then
    begin
    /* Verifique si habia abonos a la nota */
    ABONOS = 'N';
    select 'S' FROM SALDOS_DOC_CXPAGAR WHERE SDCP_TIPOREF = 51 AND SDCP_IDREF = OLD.NDPR_ID AND SDCP_ABONO <> 0 INTO :ABONOS;
    if (ABONOS = 'N') then
        BEGIN
        /* BORRE EL REGISTRO PREVIO */
        delete from saldos_doc_cxpagar where sdcp_tiporef = 51 and sdcp_idref = old.ndpr_id;
        delete from movimiento_PROVEEDOR where (mvpr_tiporef = 51) and (mvpr_idref = old.ndpr_id);
        END
    else
        exception DOCUMENTO_CON_ABONOS 'El cargo de proveedor ' || old.pref_pre || old.ndpr_numero || ' tiene abonos registrados.';
    end
if ((new.ndpr_id <> 0) and (new.ndpr_anulado = 'N')) then
    begin
    /* Registre el nuevo saldo del documento */
    INSERT INTO SALDOS_DOC_CXPAGAR (SDCP_TIPOREF, SDCP_IDREF, SDCP_FECHA, TERC_NIT, SDCP_RTEFTE, SDCP_RTIVA, SDCP_RTICA, SDCP_ABONO, SDCP_ABRTFTE, SDCP_ABRTIVA, SDCP_ABRTICA, SDCP_DEBITO, SDCP_MONTO, SDCP_TRM)
        VALUES (51, NEW.NDPR_ID, NEW.ndpr_fecha, NEW.terc_nit, NEW.ndpr_rtftemonto, NEW.ndpr_rtivamonto, NEW.ndpr_rticamonto, 0, 0, 0, 0, 'N', NEW.ndpr_monto+NEW.ndpr_ivamonto, NEW.ndpr_trm);
    /* Registre el movimiento del proveedor */
    INSERT INTO MOVIMIENTO_PROVEEDOR (MVPR_ID, TERC_NIT, MVPR_TIPOREF, MVPR_IDREF, MVPR_FECHA, MVPR_VENCE, MVPR_CONC, MVPR_MONTO, MVPR_RTFTE, MVPR_RTIVA, MVPR_RTICA, MVPR_DEBITO, MVPR_ABONO, MVPR_PREFIJO, MVPR_NUMERO, MVPR_TRM)
        VALUES (GEN_ID(ID_MOVPROV, 1), NEW.TERC_NIT, 51, NEW.NDPR_ID, NEW.NDPR_FECHA, NEW.ndpr_vence, NEW.NDPR_CONC, NEW.NDPR_MONTO+NEW.ndpr_ivamonto, NEW.NDPR_RTFTEMONTO, NEW.NDPR_RTIVAMONTO, NEW.NDPR_RTICAMONTO, 'S', 'N', NEW.pref_pre, NEW.ndpr_numero, NEW.ndpr_trm);
    INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
        VALUES (USER, 51, NEW.ndpr_id, 'U', NEW.pref_pre || NEW.ndpr_numero);
    end
END
^

SET TERM ; ^

SET TERM ^ ;

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

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER ORDENES_COMPRA_BI FOR ORDENES_COMPRA
ACTIVE BEFORE INSERT POSITION 0
AS
declare variable NUMERO VARCHAR(6);
declare variable AUTOM CHAR(1);
declare variable EXISTE CHAR(1);
BEGIN
if (NEW.numok = 'N') then
    BEGIN
    /* Actualice el contador del prefijo */
    SELECT PREF_ACTUAL, PREF_AUTO FROM PREFIJOS WHERE TIDO_COD = 23 AND PREF_PRE = NEW.PREF_PRE INTO :NUMERO, :AUTOM;
    /* ACTUALICE EL NUMERO EN COMPROBANTE_ENCABEZADO  */
    if (AUTOM = 'S') then
        BEGIN
        NEW.ORDC_numero = NUMERO;
        NUMERO = CAST((CAST(NUMERO AS INTEGER) + 1) AS CHAR(6));
        UPDATE PREFIJOS
          SET PREF_ACTUAL = :NUMERO
        WHERE TIDO_COD = 23 AND PREF_PRE = NEW.PREF_PRE;
        END
    ELSE
        BEGIN
        if (CAST(NUMERO AS INTEGER) = CAST(NEW.ORDC_NUMERO AS INTEGER)) then
            UPDATE PREFIJOS
              SET PREF_ACTUAL = CAST((CAST(PREF_ACTUAL AS INTEGER) + 1) AS CHAR(6))
            WHERE TIDO_COD = 23 AND PREF_PRE = NEW.PREF_PRE;
        END
      EXECUTE PROCEDURE COMPLETA_CEROS (NEW.ORDC_numero) returning_values (NEW.ORDC_numero);
  NEW.numok = 'S';
  END
/* Verifique que el numero no existe previamente */
EXISTE = 'N';
SELECT 'S' FROM ORDENES_COMPRA WHERE PREF_PRE = NEW.PREF_PRE AND ORDC_NUMERO = NEW.ORDC_NUMERO INTO :EXISTE;
if (EXISTE = 'S') then
    EXCEPTION DOCUMENTO_REGISTRADO 'Ya existe una orden de compra con el número ' || new.pref_pre || new.ordc_numero;
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER ORDENES_INVENTARIO_BI FOR ORDENES_INVENTARIO
ACTIVE BEFORE INSERT POSITION 0
AS
declare variable NUMERO VARCHAR(6);
declare variable AUTOM CHAR(1);
declare variable EXISTE CHAR(1);
BEGIN
if (NEW.numok = 'N') then
  BEGIN
  /* Actualice el contador del prefijo */
  SELECT PREF_ACTUAL, PREF_AUTO FROM PREFIJOS WHERE TIDO_COD = NEW.TIDO_COD AND PREF_PRE = NEW.PREF_PRE INTO :NUMERO, :AUTOM;
  /* ACTUALICE EL NUMERO EN COMPROBANTE_ENCABEZADO  */
  if (AUTOM = 'S') then
    BEGIN
    NEW.ORIN_NUMERO = NUMERO;
    NUMERO = CAST((CAST(NUMERO AS INTEGER) + 1) AS CHAR(6));
    UPDATE PREFIJOS
      SET PREF_ACTUAL = :NUMERO
    WHERE TIDO_COD = NEW.TIDO_COD AND PREF_PRE = NEW.PREF_PRE;
    END
  ELSE
    BEGIN
    if (CAST(NUMERO AS INTEGER) = CAST(NEW.ORIN_NUMERO AS INTEGER)) then
        UPDATE PREFIJOS
          SET PREF_ACTUAL = CAST((CAST(PREF_ACTUAL AS INTEGER) + 1) AS CHAR(6))
        WHERE TIDO_COD = NEW.TIDO_COD AND PREF_PRE = NEW.PREF_PRE;
    END
  EXECUTE PROCEDURE COMPLETA_CEROS (NEW.orin_numero) returning_values (NEW.orin_numero);
  NEW.numok = 'S';
  END
/* Verifique que el numero no existe previamente */
EXISTE = 'N';
SELECT 'S' FROM ORDENES_INVENTARIO WHERE PREF_PRE = NEW.PREF_PRE AND ORIN_NUMERO = NEW.ORIN_NUMERO INTO :EXISTE;
if (EXISTE = 'S') then
    EXCEPTION DOCUMENTO_REGISTRADO 'Ya existe una orden de inventario con el número ' || new.pref_pre || new.orin_numero;
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER PEDIDOS_BI FOR PEDIDOS
ACTIVE BEFORE INSERT POSITION 0
AS
declare variable NUMERO VARCHAR(6);
declare variable AUTOM CHAR(1);
declare variable EXISTE CHAR(1);
/*DECLARE VARIABLE VALCUPO CHAR(10);*/
declare variable CUPOPED CHAR(10);
declare variable DISPONIBLE NUMERIC(18,2);
declare variable OK CHAR(1);
declare variable FECSERVER CHAR(2);
BEGIN
EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION', 'DOCUMENTOS', 'INHABILITAR FECHA EN DOCUMENTOS') returning_values (:fecserver);
if (FECSERVER = 'SI') then
    NEW.pedi_fecha = CAST ('NOW' AS DATE);
OK = 'S';
/*EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'ACCION A TOMAR SI EL CUPO DE CREDITO ES INSUFICIENTE') RETURNING_VALUES (:VALCUPO);*/
EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION','PEDIDOS','VALIDAR CUPO DE CREDITO EN EL PEDIDO') RETURNING_VALUES (:CUPOPED);
IF (CUPOPED = 'PROHIBIR') THEN /*AND (CUPOPED = 'SI')) THEN*/
  BEGIN
  OK = 'N';
  /* VERIFIQUE EL CUPO DE CREDITO */
  execute procedure cupo_disponible(new.TERC_NIT, NEW.pedi_fecha, NEW.pedi_sucursal) returning_values (:DISPONIBLE);
  if (DISPONIBLE >= NEW.pedi_total) then
    OK = 'S';
  END
IF (OK = 'S') THEN
  begin
  if (NEW.NUMOK = 'N') then
    BEGIN
    /* Actualice el contador del prefijo */
    SELECT PREF_ACTUAL, PREF_AUTO FROM PREFIJOS WHERE TIDO_COD = 34 AND PREF_PRE = NEW.PREF_PRE INTO :NUMERO, :AUTOM;
    /* ACTUALICE EL NUMERO EN COMPROBANTE_ENCABEZADO  */
    if (AUTOM = 'S') then
        BEGIN
        NEW.PEDI_NUMERO = NUMERO;
        NUMERO = CAST((CAST(NUMERO AS INTEGER) + 1) AS CHAR(6));
        UPDATE PREFIJOS
          SET PREF_ACTUAL = :NUMERO
          WHERE TIDO_COD = 34 AND PREF_PRE = NEW.PREF_PRE;
        END
    ELSE
        BEGIN
        if (CAST(NUMERO AS INTEGER) = CAST(NEW.PEDI_NUMERO AS INTEGER)) then
            UPDATE PREFIJOS
                SET PREF_ACTUAL = CAST((CAST(PREF_ACTUAL AS INTEGER) + 1) AS CHAR(6))
                WHERE TIDO_COD = 34 AND PREF_PRE = NEW.PREF_PRE;
        END
    EXECUTE PROCEDURE COMPLETA_CEROS (NEW.PEDI_numero) returning_values (NEW.PEDI_numero);
    NEW.NUMOK = 'S';
    END
  /* Verifique que el numero no existe previamente */
  EXISTE = 'N';
  SELECT 'S' FROM PEDIDOS WHERE PREF_PRE = NEW.PREF_PRE AND PEDI_NUMERO = NEW.PEDI_NUMERO INTO :EXISTE;
  if (EXISTE = 'S') then
    EXCEPTION DOCUMENTO_REGISTRADO 'Ya existe un pedido con el número ' || new.pref_pre || new.pedi_numero;
  END
else
  begin
  EXCEPTION CUPO_INSUFICIENTE;
  end
if ((new.PEDI_TOTAL-new.PEDI_IVAMONTO+new.PEDI_DTOMONTO-new.PEDI_ADICIONAL) = 0) then
    NEW.PEDI_FACTOR = 1;
else
    NEW.PEDI_FACTOR = (new.PEDI_TOTAL-new.PEDI_IVAMONTO)/(new.PEDI_TOTAL-new.PEDI_IVAMONTO+new.PEDI_DTOMONTO-new.PEDI_ADICIONAL);
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER PROVEEDORES_BD FOR PROVEEDORES
ACTIVE BEFORE DELETE POSITION 0
AS
declare variable numrec integer;
BEGIN
  /* verifique que no tenga movimientos */
  select count(*) from movimiento_proveedor where terc_nit = old.terc_nit into :numrec;
  if (numrec > 0) then
    Exception proveedor_con_movimiento 'El proveedor ' || old.terc_nit || ' tiene movimientos registrados.';
  else
    delete from proveedor_articulo where terc_nit = old.terc_nit;
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER PUNTOS_REDENCION_BI FOR PUNTOS_REDENCION
ACTIVE BEFORE INSERT POSITION 0
as
declare variable NUMERO VARCHAR(6);
declare variable AUTOM CHAR(1);
declare variable EXISTE CHAR(1);
begin
/* Actualice el contador del prefijo */
SELECT PREF_ACTUAL, PREF_AUTO FROM PREFIJOS WHERE TIDO_COD = 81 AND PREF_PRE = '0000' INTO :NUMERO, :AUTOM;
/* ACTUALICE EL NUMERO EN ENCABEZADO  */
if (AUTOM = 'S') then
    BEGIN
    NEW.ptre_numero = NUMERO;
    NUMERO = CAST((CAST(NUMERO AS INTEGER) + 1) AS CHAR(6));
    UPDATE PREFIJOS
        SET PREF_ACTUAL = :NUMERO
        WHERE TIDO_COD = 81 AND PREF_PRE = '0000';
    END
ELSE
    BEGIN
    if (CAST(NUMERO AS INTEGER) = CAST(NEW.ptre_numero AS INTEGER)) then
        UPDATE PREFIJOS
            SET PREF_ACTUAL = CAST((CAST(PREF_ACTUAL AS INTEGER) + 1) AS CHAR(6))
            WHERE TIDO_COD = 81 AND PREF_PRE = '0000';
    END
EXECUTE PROCEDURE COMPLETA_CEROS (NEW.ptre_numero) returning_values (NEW.ptre_numero);

/* Verifique que el numero no existe previamente */
EXISTE = 'N';
SELECT 'S' FROM puntos_redencion WHERE PTRE_NUMERO = NEW.ptre_numero INTO :EXISTE;
if (EXISTE = 'S') then
    EXCEPTION DOCUMENTO_REGISTRADO 'Ya existe una redención de puntos con el número ' || new.ptre_numero;
end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER RECIBOS_CAJA_BI FOR RECIBOS_CAJA
ACTIVE BEFORE INSERT POSITION 0
AS
declare variable NUMERO VARCHAR(6);
declare variable AUTOM CHAR(1);
declare variable EXISTE CHAR(1);
BEGIN
if (NEW.reca_trm IS NULL) then
    NEW.reca_trm = 1;
if (NEW.numok = 'N') then
  BEGIN
  /* Actualice el contador del prefijo */
  SELECT PREF_ACTUAL, PREF_AUTO FROM PREFIJOS WHERE TIDO_COD = 61 AND PREF_PRE = NEW.PREF_PRE INTO :NUMERO, :AUTOM;
  /* ACTUALICE EL NUMERO EN EL_ENCABEZADO  */
  if (AUTOM = 'S') then
    BEGIN
    NEW.RECA_NUMERO = NUMERO;
    NUMERO = CAST((CAST(NUMERO AS INTEGER) + 1) AS CHAR(6));
    UPDATE PREFIJOS
      SET PREF_ACTUAL = :NUMERO
    WHERE TIDO_COD = 61 AND PREF_PRE = NEW.PREF_PRE;
    END
  ELSE
    BEGIN
    if (CAST(NUMERO AS INTEGER) = CAST(NEW.RECA_NUMERO AS INTEGER)) then
        UPDATE PREFIJOS
          SET PREF_ACTUAL = CAST((CAST(PREF_ACTUAL AS INTEGER) + 1) AS CHAR(6))
        WHERE TIDO_COD = 61 AND PREF_PRE = NEW.PREF_PRE;
    END
  EXECUTE PROCEDURE COMPLETA_CEROS (NEW.RECA_numero) returning_values (NEW.RECA_numero);
  NEW.numok = 'S';
  END
/* Verifique que el numero no existe previamente */
EXISTE = 'N';
SELECT 'S' FROM RECIBOS_CAJA WHERE PREF_PRE = NEW.PREF_PRE AND RECA_NUMERO = NEW.RECA_NUMERO INTO :EXISTE;
if (EXISTE = 'S') then
    EXCEPTION DOCUMENTO_REGISTRADO 'Ya existe un recibo de caja con el número ' || new.pref_pre || new.reca_numero;
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER RECIBOS_CAJA_CRUCEC_AI FOR RECIBOS_CAJA_CRUCEC
ACTIVE AFTER INSERT POSITION 0
AS
declare variable EXISTE CHAR(1);
declare variable FEC DATE;
declare variable NIT VARCHAR(20);
declare variable CONCEPTO VARCHAR(60);
declare variable PREFIJO VARCHAR(4);
declare variable NUMERO VARCHAR(6);
declare variable OK CHAR(1);
declare variable RETES CHAR(2);
declare variable SALDO NUMERIC(18,2);
declare variable TRM NUMERIC(18,2);
BEGIN
/* Abone el documento referenciado  */
select PREF_PRE, RECA_NUMERO, RECA_FECHA, RECA_CONC, TERC_NIT, RECA_TRM
    from RECIBOS_CAJA where RECA_ID = new.reca_id into :PREFIJO, :NUMERO, :FEC, :CONCEPTO, :NIT, :TRM;
if ((NEW.RECA_ID <> 0) and (new.rccr_anulado = 'N')) then
    BEGIN
    OK = 'N';
    /* valide que no se pase del saldo */
    execute procedure saldo_doc_cxpagar(new.rccr_tipodoc, new.rccr_iddoc, '9999/12/31', 0) returning_values(saldo);
    execute procedure lee_configuracion('CXPAGAR', 'SALDOS', 'DESCONTAR RETENCIONES POR CAUSACION') returning_values (RETES);
    if (SALDO < 0) then
        BEGIN
        if (RETES = 'SI') then
            begin
            if (saldo > (NEW.rccr_abono+NEW.rccr_difcambio+NEW.rccr_dtof)) then
                EXCEPTION DOCUMENTO_ABONO_MAYOR 'El saldo del documento ' || new.rccr_prefijo || new.rccr_numero || ' es insuficiente.';
            end
        ELSE
            begin
            if (saldo > (NEW.rccr_abono + NEW.rccr_rtfte + NEW.rccr_rtiva + NEW.rccr_rtica + new.rccr_dtof + NEW.rccr_difcambio)) then
                EXCEPTION DOCUMENTO_ABONO_MAYOR 'El saldo del documento ' || new.rccr_prefijo || new.rccr_numero || ' es insuficiente.';
            end
        END
    else
        BEGIN
        if (RETES = 'SI') then
            begin
            if (saldo < (NEW.rccr_abono+NEW.rccr_dtof+NEW.rccr_difcambio)) then
                EXCEPTION DOCUMENTO_ABONO_MAYOR 'El saldo del documento ' || new.rccr_prefijo || new.rccr_numero || ' es insuficiente.';
            end
        ELSE
            begin
            if (saldo < (NEW.rccr_abono + NEW.rccr_rtfte + NEW.rccr_rtiva + NEW.rccr_rtica + NEW.rccr_dtof + NEW.rccr_difcambio)) then
                EXCEPTION DOCUMENTO_ABONO_MAYOR 'El saldo del documento ' || new.rccr_prefijo || new.rccr_numero || ' es insuficiente.';
            end
        END
    if (OK = 'N') then
        BEGIN
        select 'S' from saldos_doc_cxpagar where sdcp_tiporef = new.rccr_tipodoc and
            sdcp_idref = new.rccr_iddoc and sdcp_fecha = :FEC into :EXISTE;
        if (Existe = 'S') then
            begin
            /* actualice el saldo del dia */
            UPDATE saldos_doc_cxpagar
                SET SDCP_ABONO = SDCP_ABONO + (NEW.rccr_abono + NEW.rccr_dtof + NEW.rccr_difcambio),
                    SDCP_ABRTFTE = SDCP_ABRTFTE + NEW.rccr_rtfte,
                    SDCP_ABRTIVA = SDCP_ABRTIVA + NEW.rccr_rtiva,
                    SDCP_ABRTICA = SDCP_ABRTICA + NEW.rccr_rtica,
                    SDCP_TRM = :TRM
                WHERE SDCP_TIPOREF = NEW.rccr_tipodoc AND SDCP_IDREF = NEW.rccr_iddoc AND SDCP_FECHA = :FEC;
            END
        ELSE
            BEGIN
            /* Inserte un nuevo saldo diario */
            INSERT INTO SALDOS_DOC_CXPAGAR (SDCP_TIPOREF, SDCP_IDREF, SDCP_FECHA, TERC_NIT, SDCP_RTEFTE, SDCP_RTIVA, SDCP_RTICA, SDCP_ABONO, SDCP_ABRTFTE, SDCP_ABRTIVA, SDCP_ABRTICA, SDCP_DEBITO, SDCP_MONTO, SDCP_TRM)
                VALUES (NEW.rccr_tipodoc, NEW.rccr_iddoc, :FEC, :NIT, 0, 0, 0, (NEW.rccr_abono+NEW.rccr_dtof+NEW.rccr_difcambio), NEW.rccr_rtfte, NEW.rccr_rtiva, NEW.rccr_rtica, 'N', 0, :TRM);
            END
        END
    /* actualice el registro en mov_proveedor (por si son varios items) */
    EXISTE = 'N';
    SELECT 'S' FROM MOVIMIENTO_PROVEEDOR WHERE MVPR_TIPOREF = 61 AND MVPR_IDREF = NEW.reca_id INTO :EXISTE;
    if (EXISTE = 'S') then
        begin
        UPDATE movimiento_proveedor
            SET MVPR_MONTO = MVPR_MONTO + (NEW.rccr_abono + NEW.rccr_dtof+NEW.rccr_difcambio),
                MVPR_RTFTE = MVPR_RTFTE + NEW.rccr_rtfte,
                MVPR_RTIVA = MVPR_RTIVA + NEW.rccr_rtiva,
                MVPR_RTICA = MVPR_RTICA + NEW.rccr_rtica,
                MVPR_TRM = :TRM
            WHERE MVPR_TIPOREF = 61 AND MVPR_IDREF = NEW.reca_id;
        end
    ELSE
        INSERT INTO MOVIMIENTO_PROVEEDOR (MVPR_ID, TERC_NIT, MVPR_TIPOREF, MVPR_IDREF, MVPR_FECHA, MVPR_VENCE, MVPR_CONC, MVPR_MONTO, MVPR_RTFTE, MVPR_RTIVA, MVPR_RTICA, MVPR_DEBITO, MVPR_ABONO, MVPR_PREFIJO, MVPR_NUMERO, MVPR_TRM)
            VALUES (GEN_ID(ID_MOVPROV, 1), :NIT, 61, NEW.reca_id, :FEC, :FEC, :CONCEPTO, (NEW.rccr_abono+NEW.rccr_dtof+NEW.rccr_difcambio), NEW.rccr_rtfte, NEW.rccr_rtiva, NEW.rccr_rtica, 'N', 'S', :PREFIJO, :NUMERO, :TRM);
    END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER RECIBOS_CAJA_CRUCEC_AU FOR RECIBOS_CAJA_CRUCEC
ACTIVE AFTER UPDATE POSITION 0
as
declare variable EXISTE CHAR(1);
declare variable FEC DATE;
declare variable NIT VARCHAR(20);
declare variable CONCEPTO VARCHAR(60);
declare variable PREFIJO VARCHAR(4);
declare variable NUMERO VARCHAR(6);
declare variable RETES CHAR(2);
declare variable SALDO NUMERIC(18,2);
declare variable TRM NUMERIC(18,2);
BEGIN
select PREF_PRE, RECA_NUMERO, RECA_FECHA, RECA_CONC, TERC_NIT, RECA_TRM from RECIBOS_CAJA
    where reca_id = new.reca_id into :PREFIJO, :NUMERO, :FEC, :CONCEPTO, :NIT, :TRM;
if ((OLD.reca_id <> 0) and (old.rccr_anulado = 'N')) then
    BEGIN
    EXISTE = 'N';
    select 'S' from saldos_doc_cxpagar where sdcp_tiporef = old.rccr_tipodoc and
        sdcp_idref = old.rccr_iddoc and sdcp_fecha = :FEC into :EXISTE;
    if (Existe = 'S') then
        UPDATE saldos_doc_cxpagar
            SET SDCP_ABONO = SDCP_ABONO - (old.rccr_abono + OLD.rccr_dtof+OLD.rccr_difcambio),
            SDCP_ABRTFTE = SDCP_ABRTFTE - old.rccr_rtfte,
            SDCP_ABRTIVA = SDCP_ABRTIVA - old.rccr_rtiva,
            SDCP_ABRTICA = SDCP_ABRTICA - old.rccr_rtica
            WHERE SDCP_TIPOREF = OLD.rccr_tipodoc AND SDCP_IDREF = OLD.rccr_iddoc AND SDCP_FECHA = :FEC;
    EXISTE = 'N';
    SELECT 'S' FROM MOVIMIENTO_PROVEEDOR WHERE MVPR_TIPOREF = 61 AND MVPR_IDREF = OLD.reca_id INTO :EXISTE;
    if (EXISTE = 'S') then
        UPDATE movimiento_proveedor
            SET MVPR_MONTO = MVPR_MONTO - (OLD.rccr_abono + OLD.rccr_dtof+OLD.rccr_difcambio),
            MVPR_RTFTE = MVPR_RTFTE - OLD.rccr_rtfte,
            MVPR_RTIVA = MVPR_RTIVA - OLD.rccr_rtiva,
            MVPR_RTICA = MVPR_RTICA - OLD.rccr_rtica
            WHERE MVPR_TIPOREF = 61 AND MVPR_IDREF = OLD.reca_id;
    END
if ((NEW.reca_id <> 0) and (NEW.rccr_anulado = 'N')) then
    BEGIN
    /* valide que no se pase del saldo */
/*    execute procedure saldo_doc_cxpagar(new.rccr_tipodoc, new.rccr_iddoc, '9999/12/31') returning_values(saldo);*/
    execute procedure lee_configuracion('CXPAGAR', 'SALDOS', 'DESCONTAR RETENCIONES POR CAUSACION') returning_values (RETES);
    if (SALDO < 0) then
        BEGIN
        if (RETES = 'SI') then
            begin
            if (saldo > (NEW.rccr_abono+NEW.rccr_dtof+NEW.rccr_difcambio)) then
                EXCEPTION DOCUMENTO_ABONO_MAYOR 'El saldo del documento ' || new.rccr_prefijo || new.rccr_numero || ' es insuficiente.';
            end
        ELSE
            begin
            if (saldo > (NEW.rccr_abono + NEW.rccr_rtfte + NEW.rccr_rtiva + NEW.rccr_rtica + new.rccr_dtof+NEW.rccr_difcambio)) then
                EXCEPTION DOCUMENTO_ABONO_MAYOR 'El saldo del documento ' || new.rccr_prefijo || new.rccr_numero || ' es insuficiente.';
            end
        END
    else
        BEGIN
        if (RETES = 'SI') then
            begin
            if (saldo < (NEW.rccr_abono+NEW.rccr_dtof+NEW.rccr_difcambio)) then
                EXCEPTION DOCUMENTO_ABONO_MAYOR 'El saldo del documento ' || new.rccr_prefijo || new.rccr_numero || ' es insuficiente.';
            end
        ELSE
            begin
            if (saldo < (NEW.rccr_abono + NEW.rccr_rtfte + NEW.rccr_rtiva + NEW.rccr_rtica + NEW.rccr_dtof+NEW.rccr_difcambio)) then
                EXCEPTION DOCUMENTO_ABONO_MAYOR 'El saldo del documento ' || new.rccr_prefijo || new.rccr_numero || ' es insuficiente.';
            end
        END
    /* AHORA REGISTRE LO NUEVO */
    EXISTE = 'N';
    select 'S' from saldos_doc_cxpagar where sdcp_tiporef = new.rccr_tipodoc and
        sdcp_idref = new.rccr_iddoc and sdcp_fecha = :FEC into :EXISTE;
    if (Existe = 'S') then
        UPDATE saldos_doc_cxpagar
            SET SDCP_ABONO = SDCP_ABONO + (NEW.rccr_abono + NEW.rccr_dtof + NEW.rccr_difcambio),
            SDCP_ABRTFTE = SDCP_ABRTFTE + NEW.rccr_rtfte,
            SDCP_ABRTIVA = SDCP_ABRTIVA + NEW.rccr_rtiva,
            SDCP_ABRTICA = SDCP_ABRTICA + NEW.rccr_rtica,
            SDCP_TRM = :TRM
            WHERE SDCP_TIPOREF = NEW.rccr_tipodoc AND SDCP_IDREF = NEW.rccr_iddoc AND SDCP_FECHA = :FEC;
    else
        INSERT INTO SALDOS_DOC_CXPAGAR (SDCP_TIPOREF, SDCP_IDREF, SDCP_FECHA, TERC_NIT, SDCP_RTEFTE, SDCP_RTIVA, SDCP_RTICA, SDCP_ABONO, SDCP_ABRTFTE, SDCP_ABRTIVA, SDCP_ABRTICA, SDCP_DEBITO, SDCP_MONTO, SDCP_TRM)
            VALUES (NEW.rccr_tipodoc, NEW.rccr_iddoc, :FEC, :NIT, 0, 0, 0, (NEW.rccr_abono + NEW.rccr_dtof + NEW.rccr_difcambio), NEW.rccr_rtfte, NEW.rccr_rtiva, NEW.rccr_rtica, 'N', 0, :TRM);
    /* Registre o actualice el registro en movimiento_proveedor */
    EXISTE = 'N';
    SELECT 'S' FROM MOVIMIENTO_PROVEEDOR WHERE MVPR_TIPOREF = 61 AND MVPR_IDREF = NEW.reca_id INTO :EXISTE;
    if (EXISTE = 'S') then
        /* Actualice el nuevo */
        UPDATE movimiento_proveedor
            SET MVPR_MONTO = MVPR_MONTO + (NEW.rccr_abono + NEW.rccr_dtof + NEW.rccr_difcambio),
                MVPR_RTFTE = MVPR_RTFTE + NEW.rccr_rtfte,
                MVPR_RTIVA = MVPR_RTIVA + NEW.rccr_rtiva,
                MVPR_RTICA = MVPR_RTICA + NEW.rccr_rtica,
                MVPR_TRM = :TRM
            WHERE MVPR_TIPOREF = 61 AND MVPR_IDREF = NEW.reca_id;
    ELSE
        INSERT INTO MOVIMIENTO_PROVEEDOR (MVPR_ID, TERC_NIT, MVPR_TIPOREF, MVPR_IDREF, MVPR_FECHA, MVPR_VENCE, MVPR_CONC, MVPR_MONTO, MVPR_RTFTE, MVPR_RTIVA, MVPR_RTICA, MVPR_DEBITO, MVPR_ABONO, MVPR_PREFIJO, MVPR_NUMERO, MVPR_TRM)
            VALUES (GEN_ID(ID_MOVPROV, 1), :NIT, 61, NEW.reca_id, :FEC, :FEC, :CONCEPTO, (NEW.rccr_abono + NEW.rccr_dtof + NEW.rccr_difcambio), NEW.rccr_rtfte, NEW.rccr_rtiva, NEW.rccr_rtica, 'N', 'S', :PREFIJO, :NUMERO, :TRM);
    end
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER RECIBOS_CAJA_DETALLE_AU FOR RECIBOS_CAJA_DETALLE
ACTIVE AFTER UPDATE POSITION 0
AS
declare variable EXISTE CHAR(1);
declare variable FEC DATE;
declare variable NIT VARCHAR(20);
declare variable CONCEPTO VARCHAR(60);
declare variable PREFIJO VARCHAR(4);
declare variable NUMERO VARCHAR(6);
declare variable SALDO NUMERIC(18,2);
declare variable RETES char(2);
declare variable OK CHAR(1);
declare variable RCANTI INTEGER;
declare variable COBR INTEGER;
declare variable ACUMULA CHAR(2);
declare variable DIASMAX INTEGER;
declare variable FACTOR NUMERIC(9,4);
declare variable FACTORD NUMERIC(9,4);
declare variable DIAS INTEGER;
declare variable FECDOC DATE;
declare variable TRM NUMERIC(18,2);
BEGIN
execute procedure lee_configuracion('FACTURACION', 'FACTURAS', 'ACUMULAR PUNTOS DE VENTAS POR VENDEDOR') returning_values (ACUMULA);
select PREF_PRE, RECA_NUMERO, reca_fecha, RECA_CONC, TERC_NIT, COBR_COD, RECA_TRM
    from recibos_caja where reca_id = new.reca_id
    into :PREFIJO, :NUMERO, :FEC, :CONCEPTO, :NIT, :COBR, :TRM;
/* Borre el viejo */
if ((old.RECA_ID <> 0) AND (OLD.rcde_anulado = 'N')) then
    BEGIN
    OK = 'N';
    if (OLD.RCDE_TIPODOC = 45) then
        BEGIN
        SELECT RECA_ID FROM ANTICIPOS_CLIENTE WHERE ANCL_ID = OLD.RCDE_IDDOC INTO :RCANTI;
        if (RCANTI = OLD.RECA_ID) then
            begin
            OK = 'S';
            if (NEW.rcde_anulado = 'N') then
                delete from anticipos_cliente where ANCL_ID = OLD.RCDE_IDDOC;
            else
                UPDATE anticipos_cliente SET ANCL_ANULADO = 'S' where ANCL_ID = OLD.RCDE_IDDOC;
            end
        END
    if (OK = 'N') then
        BEGIN
        UPDATE saldos_doc_cartera
            SET SDCA_ABONO = SDCA_ABONO - old.rcde_abono - OLD.RCDE_DTOF - OLD.rcde_difcambio,
            SDCA_ABRTFTE = SDCA_ABRTFTE - old.rcde_RTFTE,
            SDCA_ABRTIVA = SDCA_ABRTIVA - old.rcde_RTIVA,
            SDCA_ABRTICA = SDCA_ABRTICA - old.rcde_RTICA
            WHERE SDCA_TIPOREF = old.RCDE_TIPODOC AND SDCA_IDREF = old.rcde_IDDOC AND SDCA_FECHA = :FEC;
        END
    UPDATE movimiento_clientes
        SET MVCL_MONTO = MVCL_MONTO - OLD.rcde_abono - OLD.RCDE_DTOF - OLD.rcde_difcambio,
        MVCL_RTEFTE = MVCL_RTEFTE - OLD.rcde_rtfte,
        MVCL_RTEIVA = MVCL_RTEIVA - OLD.rcde_rtiva,
        MVCL_RTEICA = MVCL_RTEICA - OLD.rcde_rtica
        WHERE MVCL_TIPOREF = 61 AND MVCL_IDREF = OLD.RECA_ID;

    /* DESHAGA LOS PUNTOS DEL VENDEDOR */
    if (acumula = 'SI') then
        delete from puntos_vendedor where vend_cod = :cobr and ptvt_tipodoc = old.rcde_tipodoc and ptvt_iddoc = old.rcde_iddoc and ptvt_fecha = :fec;
    END
if ((NEW.RECA_ID <> 0) and (NEW.rcde_anulado = 'N')) then
    BEGIN
    OK = 'N';
    if (new.RCDE_TIPODOC = 45) then
        BEGIN
        /* BUSQUE SI TIENE RECA_ID, SI NO LO ACTUALIZA */
        SELECT RECA_ID FROM ANTICIPOS_CLIENTE WHERE ANCL_ID = NEW.RCDE_IDDOC INTO :RCANTI;
        if (RCANTI = 0) then
            BEGIN
            OK = 'S';
            UPDATE ANTICIPOS_CLIENTE SET RECA_ID = NEW.RECA_ID WHERE ANCL_ID = NEW.RCDE_IDDOC;
            END
        END
    if (OK = 'N') then
        BEGIN
        /* valide que no se pase del saldo */
        execute procedure saldo_doc_cartera(new.rcde_tipodoc, new.rcde_iddoc, '9999/12/31', 0) returning_values(saldo);
        execute procedure lee_configuracion('CARTERA', 'SALDOS', 'DESCONTAR RETENCIONES POR CAUSACION') returning_values (RETES);
        if (SALDO < 0) then
            BEGIN
            if (RETES = 'SI') then
                begin
                if (saldo > (NEW.rcde_abono + NEW.rcde_dtof + NEW.rcde_difcambio)) then
                    EXCEPTION DOCUMENTO_ABONO_MAYOR 'EL SALDO DEL DOCUMENTO ' || NEW.rcde_prefijo || NEW.rcde_numero || ' ES INSUFICIENTE.';
                end
            ELSE
                begin
                if (saldo > (NEW.rcde_abono + NEW.rcde_rtfte + NEW.rcde_rtiva + NEW.rcde_rtica + NEW.rcde_dtof + NEW.rcde_difcambio)) then
                    EXCEPTION DOCUMENTO_ABONO_MAYOR 'EL SALDO DEL DOCUMENTO ' || NEW.rcde_prefijo || NEW.rcde_numero || ' ES INSUFICIENTE.';
                end
            END
        else
            BEGIN
            if (RETES = 'SI') then
                begin
                if (saldo < (NEW.rcde_abono + NEW.rcde_dtof + NEW.rcde_difcambio)) then
                    EXCEPTION DOCUMENTO_ABONO_MAYOR 'EL SALDO DEL DOCUMENTO ' || NEW.rcde_prefijo || NEW.rcde_numero || ' ES INSUFICIENTE.';
                end
            ELSE
                begin
                if (saldo < (NEW.rcde_abono + NEW.rcde_rtfte + NEW.rcde_rtiva + NEW.rcde_rtica + NEW.rcde_dtof + NEW.rcde_difcambio)) then
                    EXCEPTION DOCUMENTO_ABONO_MAYOR 'EL SALDO DEL DOCUMENTO ' || NEW.rcde_prefijo || NEW.rcde_numero || ' ES INSUFICIENTE.';
                end
            END
        select 'S' from saldos_doc_cartera where sdca_tiporef = new.rcde_tipodoc and sdca_idref = new.rcde_iddoc and sdca_fecha = :FEC into :EXISTE;
        if (Existe = 'S') then
            /* actualice el saldo del dia */
            UPDATE saldos_doc_cartera
                SET SDCA_ABONO = SDCA_ABONO + NEW.rcde_abono + NEW.RCDE_DTOF + NEW.rcde_difcambio,
                    SDCA_ABRTFTE = SDCA_ABRTFTE + NEW.rcde_RTFTE,
                    SDCA_ABRTIVA = SDCA_ABRTIVA + NEW.rcde_RTIVA,
                    SDCA_ABRTICA = SDCA_ABRTICA + NEW.rcde_RTICA,
                    SDCA_TRM = :TRM
                WHERE SDCA_TIPOREF = NEW.RCDE_TIPODOC AND SDCA_IDREF = NEW.rcde_IDDOC AND SDCA_FECHA = :FEC;
        ELSE
            /* Inserte un nuevo saldo diario */
            INSERT INTO SALDOS_DOC_CARTERA (SDCA_TIPOREF, SDCA_IDREF, SDCA_FECHA, TERC_NIT, SDCA_RTFTE, SDCA_RTIVA, SDCA_RTICA, SDCA_ABONO, SDCA_ABRTFTE, SDCA_ABRTIVA, SDCA_ABRTICA, SDCA_DEBITO, SDCA_MONTO, SDCA_TRM)
                VALUES (NEW.RCDE_TIPODOC, NEW.RCDE_IDDOC, :FEC, :NIT, 0, 0, 0, (NEW.rcde_abono+NEW.RCDE_DTOF+NEW.rcde_difcambio), NEW.rcde_rtfte, NEW.rcde_rtiva, NEW.rcde_rtica, 'N', 0, :TRM);
        END /* OK = N */
    /* Registre o actualice el registro en movimiento_cliente */
    EXISTE = 'N';
    SELECT 'S' FROM MOVIMIENTO_CLIENTES WHERE MVCL_TIPOREF = 61 AND MVCL_IDREF = NEW.RECA_ID and mvcl_sucursal = new.rcde_sucursal INTO :EXISTE;
    if (EXISTE = 'S') then
        begin
        /* Actualice el nuevo */
        UPDATE movimiento_clientes
            SET MVCL_MONTO = MVCL_MONTO + NEW.rcde_abono + NEW.rcde_dtof + NEW.rcde_difcambio,
                MVCL_RTEFTE = MVCL_RTEFTE + NEW.rcde_rtfte,
                MVCL_RTEIVA = MVCL_RTEIVA + NEW.rcde_rtiva,
                MVCL_RTEICA = MVCL_RTEICA + NEW.rcde_rtica,
                MVCL_TRM = :TRM
            WHERE MVCL_TIPOREF = 61 AND MVCL_IDREF = NEW.RECA_ID AND MVCL_SUCURSAL = NEW.rcde_sucursal;
        end
    ELSE
        INSERT INTO MOVIMIENTO_CLIENTES (MVCL_ID, TERC_NIT, MVCL_TIPOREF, MVCL_IDREF, MVCL_FECHA, MVCL_VENCE, MVCL_CONC, MVCL_MONTO, MVCL_RTEFTE, MVCL_RTEIVA, MVCL_RTEICA, MVCL_DEBITO, MVCL_ABONO, MVCL_PREFREF, MVCL_NUMREF, MVCL_SUCURSAL, COBR_COD, MVCL_TRM)
            VALUES (GEN_ID(ID_MOVCLI, 1), :NIT, 61, NEW.RECA_ID, :FEC, :FEC, :CONCEPTO, (NEW.RCDE_ABONO+NEW.RCDE_DTOF+NEW.rcde_difcambio), NEW.RCDE_RTFTE, NEW.RCDE_RTIVA, NEW.RCDE_RTICA, 'N', 'S', :PREFIJO, :NUMERO, NEW.rcde_sucursal, :COBR, :TRM);

    /* acumule los puntos del vendedor */
    SELECT MVCL_FECHA FROM MOVIMIENTO_CLIENTES WHERE MVCL_TIPOREF = new.rcde_tipodoc AND MVCL_IDREF = new.rcde_iddoc
        INTO :FECDOC;
    if (FECDOC IS NOT NULL) then
        DIAS = FEC - FECDOC;
    else
        DIAS = 999;
    execute procedure lee_configuracion('FACTURACION', 'FACTURAS', 'DIAS DE RECAUDO MAXIMO PARA ACUMULAR PUNTOS AL VENDEDOR') returning_values (DIASMAX);
    if ((acumula = 'SI') and (diasmax >= dias)) then
        begin
        SELECT COPU_FACTOR FROM comisiones_puntos WHERE COPU_COD = NEW.rcde_comip INTO :FACTOR;
        if ((NEW.rcde_tipodoc = 31) or (NEW.rcde_tipodoc = 41)) then
            begin
            /* recorra la factura acumulando los puntos */
            if (new.rcde_tipodoc = 31) then
                select (fact_total-fact_ivamonto)/fact_total from facturas where fact_id = new.rcde_iddoc into :factord;
            if (new.rcde_tipodoc = 41) then
                select ndcl_monto/(ndcl_monto+ndcl_ivamonto) from notas_debito_clientes where ndcl_id = new.rcde_iddoc into :factord;
            /* inserte el registro de puntos */
            insert into puntos_vendedor (vend_cod, ptvt_fecha, ptvt_tipodoc, ptvt_iddoc, ptvt_db, ptvt_cr)
                values (:cobr, :fec, new.rcde_tipodoc, new.rcde_iddoc, (new.rcde_abono*:factord*:factor), 0);
            end
        if ((new.rcde_tipodoc = 33) or (new.rcde_tipodoc = 42)) then
            begin
            if (new.rcde_tipodoc = 33) then
                select (devt_total-devt_ivamonto)/devt_total from devoluciones_ventas where devt_id = new.rcde_iddoc into :factord;
            if (new.rcde_tipodoc = 42) then
                select nccl_monto/(nccl_monto+nccl_ivamonto) from notas_credito_clientes where nccl_id = new.rcde_iddoc into :factord;
            /* inserte el registro de puntos */
            insert into puntos_vendedor (vend_cod, ptvt_fecha, ptvt_tipodoc, ptvt_iddoc, ptvt_db, ptvt_cr)
                values (:cobr, :fec, new.rcde_tipodoc, new.rcde_iddoc, 0, (new.rcde_abono*:factord*:factor));
            end
        end
    END /* NUEVO */
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER RECIBOS_CAJA_PAGO_BI FOR RECIBOS_CAJA_PAGO
ACTIVE BEFORE INSERT POSITION 0
as
declare variable CAJA INTEGER;
declare variable NUMROWS INTEGER;
declare variable PREGTASA CHAR(2);
declare variable TRM NUMERIC(18,2);
begin
/* SI TRM <> 1 CONVIERTA A PESOS LOS VALORES */
EXECUTE PROCEDURE LEE_CONFIGURACION('GENERAL', 'GENERAL', 'PREGUNTAR TASA DE CAMBIO EN DOCUMENTOS DE CUENTAS POR PAGAR') returning_values (:pregtasa);
if (PREGTASA = 'SI') then
    BEGIN
    SELECT RECA_TRM FROM recibos_caja WHERE RECA_ID = NEW.reca_id INTO :TRM;
    NEW.rcpa_monto = NEW.rcpa_monto * :trm;
    END
/* NO PERMITA UNA FORMA DE PAGO REPETIDA */
if (NEW.fopa_id <> 1) then
    BEGIN
    SELECT CAJA_ID FROM recibos_caja WHERE RECA_ID = NEW.reca_id INTO :CAJA;
    SELECT COUNT(*) FROM documentos_pago_caja WHERE caja_id = :CAJA AND fopa_id = new.fopa_id and dpca_banco = NEW.rcpa_banco AND
        dpca_cuenta = NEW.rcpa_cuenta AND dpca_numero = NEW.rcpa_numero AND dpca_tiposal = 0 and dpca_idsal = 0
        INTO :NUMROWS;
    if (numrows > 0) then
        exception documento_pago_salido 'La forma de pago ' || new.rcpa_banco || ' ' || new.rcpa_cuenta || ' ' || new.rcpa_numero || ' ya existe en la caja.';
    END
end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER RECIBO_PROVISIONAL_BI FOR RECIBO_PROVISIONAL
ACTIVE BEFORE INSERT POSITION 0
AS
declare variable NUMERO VARCHAR(6);
declare variable AUTOM CHAR(1);
declare variable EXISTE CHAR(1);
BEGIN
if (new.rcpr_idcruce is null) then
    new.rcpr_idcruce = 0;
if (NEW.numok = 'N') then
  BEGIN
  /* Actualice el contador del prefijo */
  SELECT PREF_ACTUAL, PREF_AUTO FROM PREFIJOS WHERE TIDO_COD = 65 AND PREF_PRE = NEW.PREF_PRE INTO :NUMERO, :AUTOM;
  /* ACTUALICE EL NUMERO EN COMPROBANTE_ENCABEZADO  */
  if (AUTOM = 'S') then
    BEGIN
    NEW.RCPR_NUMERO = NUMERO;
    NUMERO = CAST((CAST(NUMERO AS INTEGER) + 1) AS CHAR(6));
    UPDATE PREFIJOS
      SET PREF_ACTUAL = :NUMERO
    WHERE TIDO_COD = 65 AND PREF_PRE = NEW.PREF_PRE;
    END
  ELSE
    BEGIN
    if (CAST(NUMERO AS INTEGER) = CAST(NEW.RCPR_NUMERO AS INTEGER)) then
        UPDATE PREFIJOS
          SET PREF_ACTUAL = CAST((CAST(PREF_ACTUAL AS INTEGER) + 1) AS CHAR(6))
        WHERE TIDO_COD = 65 AND PREF_PRE = NEW.PREF_PRE;
    END
  EXECUTE PROCEDURE COMPLETA_CEROS (NEW.RCPR_numero) returning_values (NEW.RCPR_numero);
  NEW.numok = 'S';
  END
/* Verifique que el numero no existe previamente */
EXISTE = 'N';
SELECT 'S' FROM RECIBO_PROVISIONAL WHERE PREF_PRE = NEW.PREF_PRE AND RCPR_NUMERO = NEW.RCPR_NUMERO INTO :EXISTE;
if (EXISTE = 'S') then
    EXCEPTION DOCUMENTO_REGISTRADO 'Ya existe un recibo provisional con el número ' || new.pref_pre || new.rcpr_numero;
END
^

SET TERM ; ^

SET TERM ^ ;

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

/* si hay pedido automatico saque una copia de la consolidacion */
EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION', 'FACTURAS', 'GENERAR PEDIDO AUTOMATICAMENTE CON LA FACTURA') returning_values (pedauto);
if (PEDAUTO = 'SI') then
    begin
    IDC = gen_id(id_cons,1);
    for select cefa_item, cefa_idori from consolide_faltantes where cefa_id = new.revt_consolida
        into :item, :idf
        do
        begin
        SELECT PEDI_ID FROM PEDIDOS P, FACTURAS F WHERE P.PREF_PRE = F.pref_pre AND P.pedi_numero = F.fact_numero AND F.fact_id = :IDF INTO :IDP;
        insert into consolide_faltantes (cefa_id, cefa_item, cefa_tipodes, cefa_tipoori, cefa_idori)
            VALUES(:IDC, :item, 32, 34, :IDP);
        end
    EXECUTE PROCEDURE consolide_pendientes (:IDC);
    NEW.lipr_cod = :IDC;
    end
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER REMISION_PROVEEDOR_BI FOR REMISION_PROVEEDOR
ACTIVE BEFORE INSERT POSITION 0
AS
declare variable NUMERO VARCHAR(6);
declare variable AUTOM CHAR(1);
declare variable EXISTE CHAR(1);
BEGIN
if (NEW.numok = 'N') then
  BEGIN
  /* Actualice el contador del prefijo */
  SELECT PREF_ACTUAL, PREF_AUTO FROM PREFIJOS WHERE TIDO_COD = 22 AND PREF_PRE = NEW.PREF_PRE INTO :NUMERO, :AUTOM;
  /* ACTUALICE EL NUMERO EN COMPROBANTE_ENCABEZADO  */
  if (AUTOM = 'S') then
    BEGIN
    NEW.REPR_NUMERO = NUMERO;
    NUMERO = CAST((CAST(NUMERO AS INTEGER) + 1) AS CHAR(6));
    UPDATE PREFIJOS
      SET PREF_ACTUAL = :NUMERO
    WHERE TIDO_COD = 22 AND PREF_PRE = NEW.PREF_PRE;
    END
  ELSE
    BEGIN
    if (CAST(NUMERO AS INTEGER) = CAST(NEW.REPR_NUMERO AS INTEGER)) then
        UPDATE PREFIJOS
          SET PREF_ACTUAL = CAST((CAST(PREF_ACTUAL AS INTEGER) + 1) AS CHAR(6))
        WHERE TIDO_COD = 22 AND PREF_PRE = NEW.PREF_PRE;
    END
  EXECUTE PROCEDURE COMPLETA_CEROS (NEW.REPR_numero) returning_values (NEW.REPR_numero);
  NEW.numok = 'S';
  END
/* Verifique que el numero no existe previamente */
EXISTE = 'N';
SELECT 'S' FROM REMISION_PROVEEDOR WHERE PREF_PRE = NEW.PREF_PRE AND REPR_NUMERO = NEW.REPR_NUMERO INTO :EXISTE;
if (EXISTE = 'S') then
    EXCEPTION DOCUMENTO_REGISTRADO 'Ya existe una remisión de proveedor con el número ' || new.pref_pre || new.repr_numero;
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER RESERVAS_BI FOR RESERVAS
ACTIVE BEFORE INSERT POSITION 0
AS
declare variable NUMERO VARCHAR(6);
declare variable AUTOM CHAR(1);
declare variable EXISTE CHAR(1);
BEGIN
if (NEW.numok = 'N') then
  BEGIN
  /* Actualice el contador del prefijo */
  SELECT PREF_ACTUAL, PREF_AUTO FROM PREFIJOS WHERE TIDO_COD = NEW.TIDO_COD AND PREF_PRE = NEW.PREF_PRE INTO :NUMERO, :AUTOM;
  if (AUTOM = 'S') then
    BEGIN
    /* ACTUALICE EL NUMERO EN COMPROBANTE_ENCABEZADO  */
    NEW.RESE_NUMERO = NUMERO;
    NUMERO = CAST((CAST(NUMERO AS INTEGER) + 1) AS CHAR(6));
    UPDATE PREFIJOS
      SET PREF_ACTUAL = :NUMERO
    WHERE TIDO_COD = NEW.TIDO_COD AND PREF_PRE = NEW.PREF_PRE;
    END
  ELSE
    begin
    if (CAST(NUMERO AS INTEGER) = CAST(NEW.RESE_NUMERO AS INTEGER)) then
        UPDATE PREFIJOS
          SET PREF_ACTUAL = CAST((CAST(PREF_ACTUAL AS INTEGER) + 1) AS CHAR(6))
        WHERE TIDO_COD = NEW.TIDO_COD AND PREF_PRE = NEW.PREF_PRE;
    end
  EXECUTE PROCEDURE COMPLETA_CEROS (NEW.RESE_numero) returning_values (NEW.RESE_numero);
  NEW.numok = 'S';
  END
/* Verifique que el numero no existe previamente */
EXISTE = 'N';
SELECT 'S' FROM RESERVAS WHERE PREF_PRE = NEW.PREF_PRE AND RESE_NUMERO = NEW.RESE_NUMERO INTO :EXISTE;
if (EXISTE = 'S') then
    EXCEPTION DOCUMENTO_REGISTRADO 'Ya existe una reserva de mercancía con el número ' || new.pref_pre || new.rese_numero;
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER RETIROS_BI FOR RETIROS
ACTIVE BEFORE INSERT POSITION 0
AS
declare variable NUMERO VARCHAR(6);
declare variable AUTOM CHAR(1);
declare variable EXISTE CHAR(1);
BEGIN
if (NEW.numok = 'N') then
  BEGIN
  /* Actualice el contador del prefijo */
  SELECT PRBA_NUMERO, PRBA_AUTO FROM PREFIJOS_BANCOS
    WHERE TIDO_COD = 73 AND CUBA_COD = NEW.CUBA_COD AND PRBA_PREF = NEW.PRBA_PREF
    INTO :NUMERO, :AUTOM;
  /* ACTUALICE EL NUMERO EN COMPROBANTE_ENCABEZADO */
  if (AUTOM = 'S') then
    BEGIN
    NEW.RETI_NUMERO = NUMERO;
    NUMERO = CAST((CAST(NUMERO AS INTEGER) + 1) AS CHAR(6));
    UPDATE PREFIJOS_BANCOS
      SET PRBA_NUMERO = :NUMERO
    WHERE TIDO_COD = 73 AND CUBA_COD = NEW.CUBA_COD AND PRBA_PREF = NEW.PRBA_PREF;
    END
  ELSE
    BEGIN
    if (CAST(NUMERO AS INTEGER) = CAST(NEW.RETI_NUMERO AS INTEGER)) then
        UPDATE PREFIJOS_BANCOS
          SET PRBA_NUMERO = CAST((CAST(PRBA_NUMERO AS INTEGER) + 1) AS CHAR(6))
        WHERE TIDO_COD = 73 AND CUBA_COD = NEW.CUBA_COD AND PRBA_PREF = NEW.PRBA_PREF;
    END
  EXECUTE PROCEDURE COMPLETA_CEROS (NEW.RETI_numero) returning_values (NEW.RETI_numero);
  NEW.numok = 'S';
  END
/* Verifique que el numero no existe previamente */
EXISTE = 'N';
SELECT 'S' FROM RETIROS
    WHERE CUBA_COD = NEW.CUBA_COD AND PRBA_PREF = NEW.PRBA_PREF AND RETI_NUMERO = NEW.RETI_NUMERO INTO :EXISTE;
if (EXISTE = 'S') then
    EXCEPTION DOCUMENTO_REGISTRADO 'Ya existe uncommitted retiro con el número ' || new.prba_pref || new.reti_numero;
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER SALDO_EFECTIVO_BI FOR SALDO_EFECTIVO
ACTIVE BEFORE INSERT POSITION 0
as
declare variable valef CHAR(2);
begin
EXECUTE PROCEDURE lee_configuracion('CAJA','EGRESOS','VALIDAR EFECTIVO EN CAJA') returning_values (VALEF);
if (VALEF = 'SI') then
    if (NEW.saef_saldo + NEW.saef_debitos - NEW.saef_creditos < 0) then
        exception efectivo_insuficiente 'EL SALDO DE EFECTIVO EN LA CAJA ' || NEW.caja_id || ' ES INSUFICIENTE EN LA FECHA ' || NEW.saef_fecha;
end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER SALDO_EFECTIVO_BU FOR SALDO_EFECTIVO
ACTIVE BEFORE UPDATE POSITION 0
as
declare variable valef CHAR(2);
begin
EXECUTE PROCEDURE lee_configuracion('CAJA','EGRESOS','VALIDAR EFECTIVO EN CAJA') returning_values (VALEF);
if (VALEF = 'SI') then
    if (NEW.saef_saldo + NEW.saef_debitos - NEW.saef_creditos < 0) then
        exception efectivo_insuficiente 'EL SALDO DE EFECTIVO EN LA CAJA ' || NEW.caja_id || ' ES INSUFICIENTE EN LA FECHA ' || NEW.saef_fecha;
end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER SALIDAS_BI FOR SALIDAS
ACTIVE BEFORE INSERT POSITION 0
AS
declare variable NUMERO VARCHAR(8);
declare variable AUTOM CHAR(1);
declare variable EXISTE CHAR(1);
BEGIN
if (NEW.numok = 'N') then
  BEGIN
  /* Actualice el contador del prefijo */
  SELECT PREF_ACTUAL, PREF_AUTO FROM PREFIJOS WHERE TIDO_COD = NEW.TIDO_COD AND PREF_PRE = NEW.PREF_PRE INTO :NUMERO, :AUTOM;
  if (AUTOM = 'S') then
    BEGIN
    /* ACTUALICE EL NUMERO EN COMPROBANTE_ENCABEZADO  */
    NEW.SALI_NUMERO = NUMERO;
    NUMERO = CAST((CAST(NUMERO AS INTEGER) + 1) AS CHAR(6));
    UPDATE PREFIJOS
      SET PREF_ACTUAL = :NUMERO
    WHERE TIDO_COD = NEW.TIDO_COD AND PREF_PRE = NEW.PREF_PRE;
    END
  ELSE
    begin
    if (CAST(NUMERO AS INTEGER) = CAST(NEW.SALI_NUMERO AS INTEGER)) then
        UPDATE PREFIJOS
          SET PREF_ACTUAL = CAST((CAST(PREF_ACTUAL AS INTEGER) + 1) AS CHAR(6))
        WHERE TIDO_COD = NEW.TIDO_COD AND PREF_PRE = NEW.PREF_PRE;
    end
  EXECUTE PROCEDURE COMPLETA_CEROS (NEW.SALI_numero) returning_values (NEW.SALI_numero);
  NEW.numok = 'S';
  END
/* Verifique que el numero no existe previamente */
EXISTE = 'N';
SELECT 'S' FROM SALIDAS WHERE PREF_PRE = NEW.PREF_PRE AND SALI_NUMERO = NEW.SALI_NUMERO INTO :EXISTE;
if (EXISTE = 'S') then
    EXCEPTION DOCUMENTO_REGISTRADO 'Ya existe una salida regstrada con número ' || new.pref_pre || new.sali_numero;
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER TERCEROS_BD FOR TERCEROS
ACTIVE BEFORE DELETE POSITION 0
as
declare variable NUMROWS INTEGER;
begin
SELECT COUNT(*) FROM MOVIMIENTO_CLIENTES WHERE TERC_NIT = OLD.TERC_NIT INTO :NUMROWS;
if (NUMROWS > 0) then
    exception cliente_con_mov 'El cliente ' || old.terc_nit || ' tiene movimientos registrados.';
SELECT COUNT(*) FROM movimiento_proveedor WHERE TERC_NIT = OLD.TERC_NIT INTO :NUMROWS;
if (NUMROWS > 0) then
    exception proveedor_con_mov 'El proveedor ' || old.terc_nit || ' tiene movimientos registrados.';
/* VALIDE QUE NO TENGA MOVIMIENTOS CONTABLES */
select count(terc_nit) from comprobante_detalle where terc_nit = old.terc_nit into :NUMROWS;
if (numrows <> 0) then
    exception tercero_con_mov 'El tercero ' || old.terc_nit || ' tiene movimientos contables registrados.';
select count(terc_nit) from saldos_iniciales where terc_nit = old.terc_nit into :NUMROWS;
if (numrows <> 0) then
    exception tercero_con_saldo 'El tercero ' || old.terc_nit || ' tiene saldo inicial registrado.';
end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER TERCEROS_BU FOR TERCEROS
ACTIVE BEFORE UPDATE POSITION 0
as
declare variable NUMROWS INTEGER;
begin
  /* VALIDE QUE NO CAMBIE LA CONDICION DE CLIENTE O PROVEEDOR SI HAY MOVIMIENTOS */
  if ((NEW.terc_clie <> OLD.terc_clie) and (NEW.terc_clie = 'N')) then
    BEGIN
    SELECT COUNT(*) FROM MOVIMIENTO_CLIENTES WHERE TERC_NIT = OLD.TERC_NIT INTO :NUMROWS;
    if (NUMROWS > 0) then
        exception cliente_con_mov 'El cliente ' || new.terc_nit || ' tiene movimientos registrados.';
    END
  if ((NEW.terc_prov <> OLD.terc_prov) and (NEW.terc_prov = 'N')) then
    BEGIN
    SELECT COUNT(*) FROM movimiento_proveedor WHERE TERC_NIT = OLD.TERC_NIT INTO :NUMROWS;
    if (NUMROWS > 0) then
        exception proveedor_con_mov 'El proveedor ' || new.terc_nit || ' tiene movimientos registrados.';
    END
if (NEW.ciud_cod <> OLD.ciud_cod) then
    SELECT SUBSTR(CIUD_NOM,1,40) FROM CIUDADES WHERE CIUD_COD = NEW.ciud_cod INTO NEW.terc_ciu;
end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER TRASFERENCIAS_BI FOR TRASFERENCIAS
ACTIVE BEFORE INSERT POSITION 0
AS
declare variable NUMERO VARCHAR(8);
declare variable AUTOM CHAR(1);
declare variable EXISTE CHAR(1);
BEGIN
if (NEW.numok = 'N') then
  BEGIN
  /* Actualice el contador del prefijo */
  SELECT PREF_ACTUAL, PREF_AUTO FROM PREFIJOS WHERE TIDO_COD = NEW.TIDO_COD AND PREF_PRE = NEW.PREF_PRE INTO :NUMERO, :AUTOM;
  if (AUTOM = 'S') then
    BEGIN
    /* ACTUALICE EL NUMERO EN COMPROBANTE_ENCABEZADO  */
    NEW.TRAN_NUMERO = NUMERO;
    NUMERO = CAST((CAST(NUMERO AS INTEGER) + 1) AS CHAR(6));
    UPDATE PREFIJOS
      SET PREF_ACTUAL = :NUMERO
    WHERE TIDO_COD = NEW.TIDO_COD AND PREF_PRE = NEW.PREF_PRE;
    END
  ELSE
    begin
    if (CAST(NUMERO AS INTEGER) = CAST(NEW.TRAN_NUMERO AS INTEGER)) then
        UPDATE PREFIJOS
          SET PREF_ACTUAL = CAST((CAST(PREF_ACTUAL AS INTEGER) + 1) AS CHAR(6))
        WHERE TIDO_COD = NEW.TIDO_COD AND PREF_PRE = NEW.PREF_PRE;
    end
  EXECUTE PROCEDURE COMPLETA_CEROS (NEW.TRAN_numero) returning_values (NEW.TRAN_numero);
  NEW.numok = 'S';
  END
/* Verifique que el numero no existe previamente */
EXISTE = 'N';
SELECT 'S' FROM TRASFERENCIAS WHERE PREF_PRE = NEW.PREF_PRE AND TRAN_NUMERO = NEW.TRAN_NUMERO INTO :EXISTE;
if (EXISTE = 'S') then
    EXCEPTION DOCUMENTO_REGISTRADO 'Ya existe una trasferencia registrada con el número ' || new.pref_pre || new.tran_numero;
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER TRASLADOS_BI FOR TRASLADOS
ACTIVE BEFORE INSERT POSITION 0
AS
declare variable NUMERO VARCHAR(6);
declare variable AUTOM CHAR(1);
declare variable EXISTE CHAR(1);
BEGIN
if (NEW.numok = 'N') then
  BEGIN
  /* Actualice el contador del prefijo */
  SELECT PRBA_NUMERO, PRBA_AUTO
    FROM PREFIJOS_BANCOS WHERE TIDO_COD = 76 AND CUBA_COD = NEW.CUBA_COD AND PRBA_PREF = NEW.PRBA_PREF INTO :NUMERO, :AUTOM;
  /* ACTUALICE EL NUMERO EN COMPROBANTE_ENCABEZADO */
  if (AUTOM = 'S') then
    BEGIN
    NEW.TRAS_NUMERO = NUMERO;
    NUMERO = CAST((CAST(NUMERO AS INTEGER) + 1) AS CHAR(6));
    UPDATE PREFIJOS_BANCOS
      SET PRBA_NUMERO = :NUMERO
    WHERE TIDO_COD = 76 AND CUBA_COD = NEW.CUBA_COD AND PRBA_PREF = NEW.PRBA_PREF;
    END
  ELSE
    BEGIN
    if (CAST(NUMERO AS INTEGER) = CAST(NEW.TRAS_NUMERO AS INTEGER)) then
        UPDATE PREFIJOS_BANCOS
          SET PRBA_NUMERO = CAST((CAST(PRBA_NUMERO AS INTEGER) + 1) AS CHAR(6))
        WHERE TIDO_COD = 76 AND CUBA_COD = NEW.CUBA_COD AND PRBA_PREF = NEW.PRBA_PREF;
    END
  EXECUTE PROCEDURE COMPLETA_CEROS (NEW.TRAS_numero) returning_values (NEW.TRAS_numero);
  NEW.numok = 'S';
  END
/* Verifique que el numero no existe previamente */
EXISTE = 'N';
SELECT 'S' FROM TRASLADOS
    WHERE CUBA_COD = NEW.CUBA_COD AND PRBA_PREF = NEW.PRBA_PREF AND TRAS_NUMERO = NEW.TRAS_NUMERO INTO :EXISTE;
if (EXISTE = 'S') then
    EXCEPTION DOCUMENTO_REGISTRADO 'Ya existe un traslado registrado con el número ' || new.prba_pref || new.tras_numero;
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER TRASLADOS_CAJA_BI FOR TRASLADOS_CAJA
ACTIVE BEFORE INSERT POSITION 0
AS
declare variable NUMERO VARCHAR(6);
declare variable AUTOM CHAR(1);
declare variable EXISTE CHAR(1);
BEGIN
if (NEW.numok = 'N') then
  BEGIN
  /* Actualice el contador del prefijo */
  SELECT PREF_ACTUAL, PREF_AUTO FROM PREFIJOS WHERE TIDO_COD = 66 AND PREF_PRE = NEW.PREF_PRE INTO :NUMERO, :AUTOM;
  /* ACTUALICE EL NUMERO EN COMPROBANTE_ENCABEZADO  */
  if (AUTOM = 'S') then
    BEGIN
    NEW.TRCJ_NUMERO = NUMERO;
    NUMERO = CAST((CAST(NUMERO AS INTEGER) + 1) AS CHAR(6));
    UPDATE PREFIJOS
      SET PREF_ACTUAL = :NUMERO
    WHERE TIDO_COD = 66 AND PREF_PRE = NEW.PREF_PRE;
    END
  ELSE
    BEGIN
    if (CAST(NUMERO AS INTEGER) = CAST(NEW.TRCJ_NUMERO AS INTEGER)) then
        UPDATE PREFIJOS
          SET PREF_ACTUAL = CAST((CAST(PREF_ACTUAL AS INTEGER) + 1) AS CHAR(6))
        WHERE TIDO_COD = 66 AND PREF_PRE = NEW.PREF_PRE;
    END
  EXECUTE PROCEDURE COMPLETA_CEROS (NEW.TRCJ_numero) returning_values (NEW.TRCJ_numero);
  NEW.numok = 'S';
  END
/* Verifique que el numero no existe previamente */
EXISTE = 'N';
SELECT 'S' FROM TRASLADOS_CAJA WHERE PREF_PRE = NEW.PREF_PRE AND TRCJ_NUMERO = NEW.TRCJ_NUMERO INTO :EXISTE;
if (EXISTE = 'S') then
    EXCEPTION DOCUMENTO_REGISTRADO 'Ya existe un traslado a caja registrado con el número ' || new.pref_pre || new.trcj_numero;
END
^

SET TERM ; ^

SET TERM ^ ;

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

SET TERM ; ^

SET TERM ^ ;

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

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER TRASLADOS_CAJA_DET_BI FOR TRASLADOS_CAJA_DET
ACTIVE BEFORE INSERT POSITION 0
as
declare variable Des integer;
declare variable NUMROWS integer;
begin
if (new.fopa_id <> 1) then
    begin
    select trcj_destino from traslados_caja where trcj_id = new.trcj_id
    into :Des;
    SELECT COUNT(*) FROM documentos_pago_caja WHERE caja_id = :Des AND fopa_id = new.fopa_id and dpca_banco = NEW.trcd_banco AND
        dpca_cuenta = NEW.trcd_cuenta AND dpca_numero = NEW.trcd_numero AND dpca_tiposal = 0 and dpca_idsal = 0
        INTO :NUMROWS;
    if (numrows > 0) then
        exception documento_pago_salido 'La forma de pago ' || NEW.trcd_banco || ' ' || NEW.trcd_cuenta || ' ' || NEW.trcd_numero || ' ya existe en la caja.';
    end
end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER UNIDAD_ARTICULO_BU FOR UNIDAD_ARTICULO
ACTIVE BEFORE UPDATE POSITION 0
as
declare variable numrows integer;
begin
/* si tiene mov. no permita cambiarla */
if ((new.unar_unidad <> old.unar_unidad) or (new.unar_faccan <> old.unar_faccan)) then
    begin
    select count(ende_item) from entradas_detalle where arti_cod = new.arti_cod and ende_unidad = old.unar_unidad into :numrows;
    if (numrows > 0) then
        exception unidad_con_mov 'La unidad ' || new.unar_unidad || ' del artículo ' || new.arti_cod || ' fue usada en una entrada.' ;
    select count(sade_item) from salidas_detalle where arti_cod = new.arti_cod and sade_unidad = old.unar_unidad into :numrows;
    if (numrows > 0) then
        exception unidad_con_mov 'La unidad ' || new.unar_unidad || ' del artículo ' || new.arti_cod || ' fue usada en una salida.' ;
    select count(tras_item) from trasferencias_detalle where arti_cod = new.arti_cod and tras_unidad = old.unar_unidad into :numrows;
    if (numrows > 0) then
        exception unidad_con_mov 'La unidad ' || new.unar_unidad || ' del artículo ' || new.arti_cod || ' fue usada en una trasferencia.' ;
    select count(ajus_item) from ajustes_detalle where arti_cod = new.arti_cod and ajus_unidad = old.unar_unidad into :numrows;
    if (numrows > 0) then
        exception unidad_con_mov 'La unidad ' || new.unar_unidad || ' del artículo ' || new.arti_cod || ' fue usada en un ajuste.' ;
    select count(esde_item) from ensambles_detalle where arti_cod = new.arti_cod and esde_unidad = old.unar_unidad into :numrows;
    if (numrows > 0) then
        exception unidad_con_mov 'La unidad ' || new.unar_unidad || ' del artículo ' || new.arti_cod || ' fue usada en un ensamble.' ;
    select count(dese_item) from desensambles_detalle where arti_cod = new.arti_cod and dede_unidad = old.unar_unidad into :numrows;
    if (numrows > 0) then
        exception unidad_con_mov 'La unidad ' || new.unar_unidad || ' del artículo ' || new.arti_cod || ' fue usada en un desensamble.' ;
    select count(rsde_item) from reservas_detalle where arti_cod = new.arti_cod and rsde_unidad = old.unar_unidad into :numrows;
    if (numrows > 0) then
        exception unidad_con_mov 'La unidad ' || new.unar_unidad || ' del artículo ' || new.arti_cod || ' fue usada en una reserva.' ;
    select count(orid_item) from ordeninventario_detalle where arti_cod = new.arti_cod and orid_unidad = old.unar_unidad into :numrows;
    if (numrows > 0) then
        exception unidad_con_mov 'La unidad ' || new.unar_unidad || ' del artículo ' || new.arti_cod || ' fue usada en una orden.' ;
    select count(fcde_item) from facturas_compras_detalle where arti_cod = new.arti_cod and fcde_unidad = old.unar_unidad into :numrows;
    if (numrows > 0) then
        exception unidad_con_mov 'La unidad ' || new.unar_unidad || ' del artículo ' || new.arti_cod || ' fue usada en una factura de compra.' ;
    select count(rpvd_item) from remision_proveedor_det where arti_cod = new.arti_cod and rpvd_unidad = old.unar_unidad into :numrows;
    if (numrows > 0) then
        exception unidad_con_mov 'La unidad ' || new.unar_unidad || ' del artículo ' || new.arti_cod || ' fue usada en una remisión de proveedor.' ;
    select count(dvcd_item) from devoluciones_compras_det where arti_cod = new.arti_cod and dvcd_unidad = old.unar_unidad into :numrows;
    if (numrows > 0) then
        exception unidad_con_mov 'La unidad ' || new.unar_unidad || ' del artículo ' || new.arti_cod || ' fue usada en una devolución de compra.' ;
    select count(fade_item) from facturas_detalle where arti_cod = new.arti_cod and fade_unidad = old.unar_unidad into :numrows;
    if (numrows > 0) then
        exception unidad_con_mov 'La unidad ' || new.unar_unidad || ' del artículo ' || new.arti_cod || ' fue usada en una factura.' ;
    select count(rvde_item) from remisiones_venta_detalle where arti_cod = new.arti_cod and rvde_unidad = old.unar_unidad into :numrows;
    if (numrows > 0) then
        exception unidad_con_mov 'La unidad ' || new.unar_unidad || ' del artículo ' || new.arti_cod || ' fue usada en una remisión.' ;
    select count(dvde_item) from devoluciones_ventas_detalle where arti_cod = new.arti_cod and dvde_unidad = old.unar_unidad into :numrows;
    if (numrows > 0) then
        exception unidad_con_mov 'La unidad ' || new.unar_unidad || ' del artículo ' || new.arti_cod || ' fue usada en una devolución.' ;
    end
end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER VENDEDORES_BD FOR VENDEDORES
ACTIVE BEFORE DELETE POSITION 0
as
declare variable NUMROWS INTEGER;
begin
SELECT COUNT(*) FROM FACTURAS WHERE VEND_COD = OLD.vend_cod INTO :NUMROWS;
if (NUMROWS = 0) then
    SELECT COUNT(*) FROM devoluciones_ventas WHERE VEND_COD = OLD.vend_cod INTO :NUMROWS;
if (NUMROWS > 0) then
    EXCEPTION vendedor_movimiento 'El vendedor ' || old.vend_cod || ' tiene movimientos registrados.';
end
^

SET TERM ; ^


/* 20081201B ERROR COMIIVA VACIO */

SET TERM ^ ;

create trigger CONSIGNA_TARJETAS_DET_BI for CONSIGNA_TARJETAS_DET
active BEFORE INSERT position 0
as
begin
if (NEW.ctjd_comiiva IS NULL) then
    NEW.ctjd_comiiva = 'N';
end
^

SET TERM ; ^


/* 20081201C DESORDEN POR FECHA AL IMPRIMIR EL REPORTE, SE QUITO ORDER DEL CLIENTE Y SE AGREGO AL PROCEDIMIENTO */

SET TERM ^ ;

CREATE OR ALTER PROCEDURE REP_VENTAS_VENDEDOR(
    TIPO INTEGER,
    DESDE VARCHAR(20),
    HASTA VARCHAR(20),
    FECINI DATE,
    FECFIN DATE,
    DETALLE CHAR(1),
    CEROS CHAR(1),
    SUBEMPRESA INTEGER)
RETURNS (
    CODVEND INTEGER,
    NOMVEND VARCHAR(60),
    NOMTIPO VARCHAR(50),
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(6),
    NIT VARCHAR(20),
    NOMBRE VARCHAR(60),
    ID INTEGER,
    FECDOC DATE,
    CANTIDAD INTEGER,
    SUBTOTAL NUMERIC(18,2),
    DTO NUMERIC(18,2),
    ADICIONAL NUMERIC(18,2),
    CONSUMO NUMERIC(18,2),
    IVA NUMERIC(18,2),
    EXTRA NUMERIC(18,2),
    TOTAL NUMERIC(18,2),
    RTFTE NUMERIC(18,2),
    RTIVA NUMERIC(18,2),
    RTICA NUMERIC(18,2),
    NETO NUMERIC(18,2))
AS
BEGIN
if (DETALLE = 'N') then
    BEGIN
    NIT = '';
    NOMBRE = '';
    if (BIN_AND(TIPO, 1) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 31 INTO :NOMTIPO;
        FOR SELECT MAX(F.VEND_COD), MAX(VEND_NOMBRE), COUNT(*), SUM(FACT_DTOMONTO), SUM(FACT_ADICIONAL), SUM(FACT_IVAMONTO), SUM(FACT_EXTRA), SUM(FACT_RTFTEMONTO), SUM(FACT_RTIVAMONTO), SUM(FACT_RTICAMONTO), SUM(FACT_TOTAL)
            FROM FACTURAS F, PREFIJOS P, VENDEDORES V
            WHERE F.VEND_COD >= :DESDE AND F.VEND_COD <= :HASTA AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND FACT_ANULADO = 'N'
             AND F.vend_cod = V.vend_cod AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND ((P.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY F.VEND_COD
            INTO :CODVEND, :NOMVEND, :CANTIDAD, :DTO, :ADICIONAL, :IVA, :EXTRA, :RTFTE, :RTIVA, :RTICA, :TOTAL
            DO
            BEGIN
            SELECT SUM(FADE_CONSUMO) FROM FACTURAS_DETALLE D, FACTURAS F WHERE F.FACT_ID = D.FACT_ID AND
                VEND_COD = :CODVEND AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND FACT_ANULADO = 'N'
                INTO :CONSUMO;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (DTO IS NULL) then
                DTO = 0;
            if (ADICIONAL IS NULL) then
                ADICIONAL = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (EXTRA IS NULL) then
                EXTRA = 0;
            if (RTFTE IS NULL) then
                RTFTE = 0;
            if (RTIVA IS NULL) then
                RTIVA = 0;
            if (RTICA IS NULL) then
                RTICA = 0;
            SUBTOTAL = TOTAL - EXTRA - IVA - ADICIONAL + DTO - CONSUMO;
            NETO = TOTAL - RTFTE - RTIVA - RTICA;
            if (CEROS = 'S') then
              SUSPEND;
            ELSE
              if (CANTIDAD > 0) then
                SUSPEND;
            END
        END
    if (BIN_AND(TIPO, 2) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 32 INTO :NOMTIPO;
        FOR SELECT MAX(R.VEND_COD), MAX(VEND_NOMBRE), COUNT(*), 0, 0, SUM(REVT_IVAMONTO), 0, 0, 0, 0, SUM(REVT_TOTAL)
            FROM REMISIONES_VENTA R, PREFIJOS P, VENDEDORES V
            WHERE R.VEND_COD >= :DESDE AND R.VEND_COD <= :HASTA
             AND R.vend_cod = V.vend_cod AND REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN AND REVT_ANULADO = 'N'
             AND P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = 32 AND ((P.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY R.VEND_COD
            INTO :CODVEND, :NOMVEND, :CANTIDAD, :DTO, :ADICIONAL, :IVA, :EXTRA, :RTFTE, :RTIVA, :RTICA, :TOTAL
            DO
            BEGIN
            SELECT SUM(RVDE_CONSUMO) FROM REMISIONES_VENTA R, REMISIONES_VENTA_DETALLE D WHERE R.REVT_ID = D.REVT_ID AND
                VEND_COD = :CODVEND AND REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN AND REVT_ANULADO = 'N'
                INTO :CONSUMO;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (DTO IS NULL) then
                DTO = 0;
            if (ADICIONAL IS NULL) then
                ADICIONAL = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (EXTRA IS NULL) then
                EXTRA = 0;
            if (RTFTE IS NULL) then
                RTFTE = 0;
            if (RTIVA IS NULL) then
                RTIVA = 0;
            if (RTICA IS NULL) then
                RTICA = 0;
            SUBTOTAL = TOTAL - EXTRA - IVA - ADICIONAL + DTO - CONSUMO;
            NETO = TOTAL - RTFTE - RTIVA - RTICA;
            if (CEROS = 'S') then
              SUSPEND;
            ELSE
              if (CANTIDAD > 0) then
                SUSPEND;
            END
        END
    if (BIN_AND(TIPO, 4) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 33 INTO :NOMTIPO;
        FOR SELECT MAX(D.VEND_COD), MAX(VEND_NOMBRE), COUNT(*), SUM(DEVT_DTOMONTO), SUM(DEVT_ADICIONAL), SUM(DEVT_IVAMONTO), SUM(DEVT_EXTRA), SUM(DEVT_RTFTEMONTO), SUM(DEVT_RTIVAMONTO), SUM(DEVT_RTICAMONTO), SUM(DEVT_TOTAL)
            FROM DEVOLUCIONES_VENTAS D, PREFIJOS P, VENDEDORES V
            WHERE D.VEND_COD >= :DESDE AND D.VEND_COD <= :HASTA
             AND D.vend_cod = V.vend_cod AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND DEVT_ANULADO = 'N'
             AND P.PREF_PRE = D.PREF_PRE AND P.TIDO_COD = 33 AND ((P.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) AND ((DEVT_REMID = 0) or (DEVT_REMID IS NULL))
            GROUP BY D.VEND_COD
            INTO :CODVEND, :NOMVEND, :CANTIDAD, :DTO, :ADICIONAL, :IVA, :EXTRA, :RTFTE, :RTIVA, :RTICA, :TOTAL
            DO
            BEGIN
            SELECT SUM(DVDE_CONSUMO) FROM DEVOLUCIONES_VENTAS V, DEVOLUCIONES_VENTAS_DETALLE D WHERE V.DEVT_ID = D.DEVT_ID AND
                VEND_COD = :CODVEND AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND DEVT_ANULADO = 'N'
                INTO :CONSUMO;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (DTO IS NULL) then
                DTO = 0;
            if (ADICIONAL IS NULL) then
                ADICIONAL = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (EXTRA IS NULL) then
                EXTRA = 0;
            if (RTFTE IS NULL) then
                RTFTE = 0;
            if (RTIVA IS NULL) then
                RTIVA = 0;
            if (RTICA IS NULL) then
                RTICA = 0;
            SUBTOTAL = TOTAL - EXTRA - IVA - ADICIONAL + DTO - CONSUMO;
            NETO = TOTAL - RTFTE - RTIVA - RTICA;
            CANTIDAD = CANTIDAD * -1;
            SUBTOTAL = SUBTOTAL * -1;
            TOTAL = TOTAL * -1;
            IVA = IVA * -1;
            EXTRA = EXTRA * -1;
            DTO = DTO * -1;
            ADICIONAL = ADICIONAL * -1;
            RTFTE = RTFTE * -1;
            RTIVA = RTIVA * -1;
            RTICA = RTICA * -1;
            if (CEROS = 'S') then
              SUSPEND;
            ELSE
              if (CANTIDAD > 0) then
                SUSPEND;
            END
        END
    if (BIN_AND(TIPO, 8) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 34 INTO :NOMTIPO;
        FOR SELECT MAX(P.VEND_COD), MAX(VEND_NOMBRE), COUNT(*), SUM(PEDI_DTOMONTO), SUM(PEDI_ADICIONAL), SUM(PEDI_IVAMONTO), SUM(PEDI_EXTRA), 0, 0, 0, SUM(PEDI_TOTAL)
            FROM PEDIDOS P, PREFIJOS PR, VENDEDORES V
            WHERE V.VEND_COD >= :DESDE AND V.VEND_COD <= :HASTA
             AND P.vend_cod = V.vend_cod AND PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND PEDI_ANULADO = 'N'
             AND P.PREF_PRE = PR.PREF_PRE AND PR.TIDO_COD = 34 AND ((PR.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY P.VEND_COD
            INTO :CODVEND, :NOMVEND, :CANTIDAD, :DTO, :ADICIONAL, :IVA, :EXTRA, :RTFTE, :RTIVA, :RTICA, :TOTAL
            DO
            BEGIN
            SELECT SUM(PEDE_CONSUMO) FROM PEDIDOS P, PEDIDOS_DETALLE D WHERE P.PEDI_ID = D.PEDI_ID AND
                VEND_COD = :CODVEND AND PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND PEDI_ANULADO = 'N'
                INTO :CONSUMO;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (DTO IS NULL) then
                DTO = 0;
            if (ADICIONAL IS NULL) then
                ADICIONAL = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (EXTRA IS NULL) then
                EXTRA = 0;
            if (RTFTE IS NULL) then
                RTFTE = 0;
            if (RTIVA IS NULL) then
                RTIVA = 0;
            if (RTICA IS NULL) then
                RTICA = 0;
            SUBTOTAL = TOTAL - EXTRA - IVA - ADICIONAL + DTO - CONSUMO;
            NETO = TOTAL - RTFTE - RTIVA - RTICA;
            if (CEROS = 'S') then
              SUSPEND;
            ELSE
              if (CANTIDAD > 0) then
                SUSPEND;
            END
        END
    if (BIN_AND(TIPO, 16) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 35 INTO :NOMTIPO;
        FOR SELECT MAX(C.VEND_COD), MAX(VEND_NOMBRE), COUNT(*), SUM(COTI_DTOMONTO), SUM(COTI_ADICIONAL), SUM(COTI_IVAMONTO), SUM(COTI_EXTRA), 0, 0, 0, SUM(COTI_TOTAL)
            FROM COTIZACIONES C, PREFIJOS P, VENDEDORES V
            WHERE V.VEND_COD >= :DESDE AND V.VEND_COD <= :HASTA
             AND C.vend_cod = V.vend_cod AND COTI_FECHA >= :FECINI AND COTI_FECHA <= :FECFIN AND COTI_ANULADO = 'N'
             AND P.PREF_PRE = C.PREF_PRE AND P.TIDO_COD = 35 AND ((P.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY C.VEND_COD
            INTO :CODVEND, :NOMVEND, :CANTIDAD, :DTO, :ADICIONAL, :IVA, :EXTRA, :RTFTE, :RTIVA, :RTICA, :TOTAL
            DO
            BEGIN
            SELECT SUM(CTDE_CONSUMO) FROM COTIZACIONES C, COTIZACIONES_DETALLE D WHERE C.COTI_ID = D.COTI_ID AND
                VEND_COD = :CODVEND AND COTI_FECHA >= :FECINI AND COTI_FECHA <= :FECFIN AND COTI_ANULADO = 'N'
                INTO :CONSUMO;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (DTO IS NULL) then
                DTO = 0;
            if (ADICIONAL IS NULL) then
                ADICIONAL = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (EXTRA IS NULL) then
                EXTRA = 0;
            if (RTFTE IS NULL) then
                RTFTE = 0;
            if (RTIVA IS NULL) then
                RTIVA = 0;
            if (RTICA IS NULL) then
                RTICA = 0;
            SUBTOTAL = TOTAL - EXTRA - IVA - ADICIONAL + DTO - CONSUMO;
            NETO = TOTAL - RTFTE - RTIVA - RTICA;
            if (CEROS = 'S') then
              SUSPEND;
            ELSE
              if (CANTIDAD > 0) then
                SUSPEND;
            END
        END
    END
ELSE
    BEGIN
    if (BIN_AND(TIPO, 1) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 31 INTO :NOMTIPO;
        FOR SELECT F.VEND_COD, VEND_NOMBRE, F.FACT_ID, F.PREF_PRE, FACT_NUMERO, FACT_FECHA, FACT_DTOMONTO, FACT_ADICIONAL, FACT_IVAMONTO, FACT_EXTRA, FACT_TOTAL, FACT_RTFTEMONTO, FACT_RTIVAMONTO, FACT_RTICAMONTO, TERC_NIT, FACT_NOMCLIENTE
            FROM FACTURAS F, PREFIJOS P, VENDEDORES V WHERE F.vend_cod = V.vend_cod AND F.VEND_COD >= :DESDE AND F.VEND_COD <= :HASTA AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND FACT_ANULADO = 'N'
             AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND ((P.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            ORDER BY V.VEND_COD, FACT_FECHA, FACT_ID
            INTO :CODVEND, :NOMVEND, :ID, :PREFIJO, :NUMERO, :FECDOC, :DTO, :ADICIONAL, :IVA, :EXTRA, :TOTAL, :RTFTE, :RTIVA, :RTICA, :NIT, :NOMBRE
            DO
            BEGIN
            SELECT SUM(FADE_CONSUMO) FROM FACTURAS_DETALLE WHERE FACT_ID = :ID
                INTO :CONSUMO;
            SUBTOTAL = TOTAL - EXTRA - IVA - ADICIONAL + DTO - CONSUMO;
            NETO = TOTAL - RTFTE - RTIVA - RTICA;
            SUSPEND;
            END
         END
    if (BIN_AND(TIPO, 2) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 32 INTO :NOMTIPO;
        FOR SELECT R.VEND_COD, VEND_NOMBRE, REVT_ID, R.PREF_PRE, REVT_NUMERO, REVT_FECHA, 0, 0, REVT_IVAMONTO, 0, REVT_TOTAL, 0, 0, 0, TERC_NIT, REVT_NOMTERC
            FROM REMISIONES_VENTA R, PREFIJOS P, VENDEDORES V WHERE R.vend_cod = V.vend_cod AND R.VEND_COD >= :DESDE AND R.VEND_COD <= :HASTA AND REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN AND REVT_ANULADO = 'N'
             AND P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = 32 AND ((P.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            ORDER BY V.VEND_COD, REVT_FECHA, REVT_ID
            INTO :CODVEND, :NOMVEND, :ID, :PREFIJO, :NUMERO, :FECDOC, :DTO, :ADICIONAL, :IVA, :EXTRA, :TOTAL, :RTFTE, :RTIVA, :RTICA, :NIT, :NOMBRE
            DO
            BEGIN
            SELECT SUM(RVDE_CONSUMO) FROM REMISIONES_VENTA_DETALLE WHERE REVT_ID = :ID
                INTO :CONSUMO;
            SUBTOTAL = TOTAL - EXTRA - IVA - ADICIONAL + DTO - CONSUMO;
            NETO = TOTAL - RTFTE - RTIVA - RTICA;
            SUSPEND;
            END
         END
    if (BIN_AND(TIPO, 4) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 33 INTO :NOMTIPO;
        FOR SELECT V.VEND_COD, VEND_NOMBRE, DEVT_ID, D.PREF_PRE, DEVT_NUMERO, DEVT_FECHA, DEVT_DTOMONTO, DEVT_ADICIONAL, DEVT_IVAMONTO, DEVT_EXTRA, DEVT_TOTAL, DEVT_RTFTEMONTO, DEVT_RTIVAMONTO, DEVT_RTICAMONTO, TERC_NIT, DEVT_NOMTERC
            FROM DEVOLUCIONES_VENTAS D, PREFIJOS P, VENDEDORES V WHERE D.vend_cod = V.vend_cod AND V.VEND_COD >= :DESDE AND V.VEND_COD <= :HASTA AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND DEVT_ANULADO = 'N'
             AND P.PREF_PRE = D.PREF_PRE AND P.TIDO_COD = 33 AND ((P.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) AND ((DEVT_REMID = 0) or (DEVT_REMID IS NULL))
            ORDER BY V.VEND_COD, DEVT_FECHA, DEVT_ID
            INTO :CODVEND, :NOMVEND, :ID, :PREFIJO, :NUMERO, :FECDOC, :DTO, :ADICIONAL, :IVA, :EXTRA, :TOTAL, :RTFTE, :RTIVA, :RTICA, :NIT, :NOMBRE
            DO
            BEGIN
            SELECT SUM(DVDE_CONSUMO) FROM DEVOLUCIONES_VENTAS_DETALLE WHERE DEVT_ID = :ID
                INTO :CONSUMO;
            SUBTOTAL = TOTAL - EXTRA - IVA - ADICIONAL + DTO - CONSUMO;
            NETO = TOTAL - RTFTE - RTIVA - RTICA;
            TOTAL = TOTAL * -1;
            IVA = IVA * -1;
            EXTRA = EXTRA * -1;
            DTO = DTO * -1;
            ADICIONAL = ADICIONAL * -1;
            RTFTE = RTFTE * -1;
            RTIVA = RTIVA * -1;
            RTICA = RTICA * -1;
            SUSPEND;
            END
         END
    if (BIN_AND(TIPO, 8) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 34 INTO :NOMTIPO;
        FOR SELECT P.VEND_COD, VEND_NOMBRE, PEDI_ID, P.PREF_PRE, PEDI_NUMERO, PEDI_FECHA, PEDI_DTOMONTO, PEDI_ADICIONAL, PEDI_IVAMONTO, PEDI_EXTRA, PEDI_TOTAL, 0, 0, 0, TERC_NIT, PEDI_NOMTERC
            FROM PEDIDOS P, PREFIJOS PR, VENDEDORES V WHERE P.vend_cod = V.vend_cod AND P.VEND_COD >= :DESDE AND P.VEND_COD <= :HASTA AND PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND PEDI_ANULADO = 'N'
             AND P.PREF_PRE = PR.PREF_PRE AND PR.TIDO_COD = 34 AND ((PR.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            ORDER BY V.VEND_COD, PEDI_FECHA, PEDI_ID
            INTO :CODVEND, :NOMVEND, :ID, :PREFIJO, :NUMERO, :FECDOC, :DTO, :ADICIONAL, :IVA, :EXTRA, :TOTAL, :RTFTE, :RTIVA, :RTICA, :NIT, :NOMBRE
            DO
            BEGIN
            SELECT SUM(PEDE_CONSUMO) FROM PEDIDOS_DETALLE WHERE PEDI_ID = :ID
                INTO :CONSUMO;
            SUBTOTAL = TOTAL - EXTRA - IVA - ADICIONAL + DTO - CONSUMO;
            NETO = TOTAL - RTFTE - RTIVA - RTICA;
            SUSPEND;
            END
         END
    if (BIN_AND(TIPO, 16) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 35 INTO :NOMTIPO;
        FOR SELECT C.VEND_COD, VEND_NOMBRE, COTI_ID, C.PREF_PRE, COTI_NUMERO, COTI_FECHA, COTI_DTOMONTO, COTI_ADICIONAL, COTI_IVAMONTO, COTI_EXTRA, COTI_TOTAL, 0, 0, 0, TERC_NIT, COTI_NOMTERC
            FROM COTIZACIONES C, PREFIJOS P, VENDEDORES V WHERE C.vend_cod = V.vend_cod AND C.VEND_COD >= :DESDE AND C.VEND_COD <= :HASTA AND COTI_FECHA >= :FECINI AND COTI_FECHA <= :FECFIN AND COTI_ANULADO = 'N'
             AND P.PREF_PRE = C.PREF_PRE AND P.TIDO_COD = 35 AND ((P.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            ORDER BY V.VEND_COD, COTI_FECHA, COTI_ID
            INTO :CODVEND, :NOMVEND, :ID, :PREFIJO, :NUMERO, :FECDOC, :DTO, :ADICIONAL, :IVA, :EXTRA, :TOTAL, :RTFTE, :RTIVA, :RTICA, :NIT, :NOMBRE
            DO
            BEGIN
            SELECT SUM(CTDE_CONSUMO) FROM COTIZACIONES_DETALLE WHERE COTI_ID = :ID
                INTO :CONSUMO;
            SUBTOTAL = TOTAL - EXTRA - IVA - ADICIONAL + DTO - CONSUMO;
            NETO = TOTAL - RTFTE - RTIVA - RTICA;
            SUSPEND;
            END
        END
    END
END
^

SET TERM ; ^



update revision set revi_FECHA = '2008/12/01';
COMMIT WORK;


/* 2081202: MAL BASE DE IVA DEBE SER LA PARTE GRABADA TOMABA EL SUBTOTAL DE LA FACTURA */

SET TERM ^ ;

CREATE OR ALTER PROCEDURE CONTABIL_FACTCOMP(
    IDDOC INTEGER,
    IDINTER INTEGER)
RETURNS (
    ERROR INTEGER,
    VER CHAR(1),
    IDC INTEGER)
AS
DECLARE VARIABLE PREFIJO VARCHAR(4);
DECLARE VARIABLE NUM VARCHAR(6);
DECLARE VARIABLE NUMERO VARCHAR(10);
DECLARE VARIABLE FECAUX DATE;
DECLARE VARIABLE FECHA CHAR(8);
DECLARE VARIABLE CONCEPTO CHAR(60);
DECLARE VARIABLE VENCEAUX DATE;
DECLARE VARIABLE VENCE CHAR(8);
DECLARE VARIABLE VRDTO NUMERIC(18,2);
DECLARE VARIABLE VRADIC NUMERIC(18,2);
DECLARE VARIABLE VRSUBT NUMERIC(18,2);
DECLARE VARIABLE VRIVA NUMERIC(18,2);
DECLARE VARIABLE PRTFTE NUMERIC(9,2);
DECLARE VARIABLE VRRTFTE NUMERIC(18,2);
DECLARE VARIABLE VRRTIVA NUMERIC(18,2);
DECLARE VARIABLE PRTICA NUMERIC(9,2);
DECLARE VARIABLE VRRTICA NUMERIC(18,2);
DECLARE VARIABLE VRTOTAL NUMERIC(18,2);
DECLARE VARIABLE VREXTRA NUMERIC(18,2);
DECLARE VARIABLE TIPOCOMP VARCHAR(3);
DECLARE VARIABLE PREFCONT VARCHAR(4);
DECLARE VARIABLE INVEN CHAR(1);
DECLARE VARIABLE CTAINVEN VARCHAR(20);
DECLARE VARIABLE IVA CHAR(1);
DECLARE VARIABLE CTAIVA VARCHAR(20);
DECLARE VARIABLE CONSUMO CHAR(1);
DECLARE VARIABLE CTACONSUMO VARCHAR(20);
DECLARE VARIABLE CXP CHAR(1);
DECLARE VARIABLE CTACXP VARCHAR(20);
DECLARE VARIABLE RTFTE CHAR(1);
DECLARE VARIABLE CTARTFTE VARCHAR(20);
DECLARE VARIABLE RTIVA CHAR(1);
DECLARE VARIABLE CTARTIVA VARCHAR(20);
DECLARE VARIABLE RTICA CHAR(1);
DECLARE VARIABLE CTARTICA VARCHAR(20);
DECLARE VARIABLE CTADTO VARCHAR(20);
DECLARE VARIABLE CTAADIC VARCHAR(20);
DECLARE VARIABLE CTAEXTRA VARCHAR(20);
DECLARE VARIABLE EXISTE CHAR(1);
DECLARE VARIABLE CUENTA VARCHAR(20);
DECLARE VARIABLE MONTO NUMERIC(18,2);
DECLARE VARIABLE TIPOCUEN CHAR(1);
DECLARE VARIABLE NIT VARCHAR(20);
DECLARE VARIABLE NOMBRE VARCHAR(60);
DECLARE VARIABLE PROY VARCHAR(4);
DECLARE VARIABLE CENTRO VARCHAR(4);
DECLARE VARIABLE PROYDET VARCHAR(4);
DECLARE VARIABLE CENTRODET VARCHAR(4);
DECLARE VARIABLE PORC NUMERIC(5,2);
DECLARE VARIABLE NUMITEMS INTEGER;
DECLARE VARIABLE ARTICULO VARCHAR(15);
DECLARE VARIABLE IMPINC CHAR(1);
DECLARE VARIABLE IMPTOS NUMERIC(18,2);
DECLARE VARIABLE SUMA NUMERIC(18,2);
DECLARE VARIABLE PORCIVA NUMERIC(9,2);
DECLARE VARIABLE TCTAPROV VARCHAR(20);
DECLARE VARIABLE TCTARTFTE VARCHAR(20);
DECLARE VARIABLE TCTARTIVA VARCHAR(20);
DECLARE VARIABLE TCTARTICA VARCHAR(20);
DECLARE VARIABLE CUENTAADIC VARCHAR(20);
DECLARE VARIABLE BASEADIC VARCHAR(20);
DECLARE VARIABLE PORCADIC NUMERIC(5,2);
DECLARE VARIABLE VALORADIC NUMERIC(18,2);
DECLARE VARIABLE DBADIC CHAR(1);
DECLARE VARIABLE FOMENTO CHAR(2);
DECLARE VARIABLE BODE_DET CHAR(2);
DECLARE VARIABLE NUMPROV VARCHAR(10);
DECLARE VARIABLE MERCANCIA NUMERIC(18,2);
declare variable FACTOR DOUBLE PRECISION;
DECLARE VARIABLE MENORV CHAR(2);
declare variable DIG INTEGER;
declare variable NETO NUMERIC(18,2);
declare variable CENT CHAR(1);
declare variable ANULADO CHAR(1);
declare variable ERRORC INTEGER;
BEGIN
  /* INTERFACE */
  EXISTE = 'N';
  SELECT 'S', TICO_COD, PRCO_PRE, INCO_INVEN, INCO_IVA, INCO_CONSUMO, INCO_CXP, INCO_RTFTE, INCO_RTIVA, INCO_RTICA, INCO_CTAINVEN, INCO_CTAIVA, INCO_CTACONSUMO, INCO_CTADTO, INCO_CTAADIC, INCO_CTAEXTRA, INCO_CTACXP, INCO_CTARTFTE, INCO_CTARTIVA, INCO_CTARTICA, INCO_CONFIRMAR, INCO_CENTRO
    FROM INTERFAZ_COMPRAS WHERE INCO_ID = :IDINTER INTO :EXISTE, :TIPOCOMP, :PREFCONT, :INVEN, :IVA, :CONSUMO, :CXP, :RTFTE, :RTIVA, :RTICA, :CTAINVEN, :CTAIVA, :CTACONSUMO, :CTADTO, :CTAADIC, :CTAEXTRA, :CTACXP, :CTARTFTE, :CTARTIVA, :CTARTICA, :VER, :CENT;
  if (EXISTE = 'S') then
    BEGIN
    /* BORRE CONTABILIZACION PREVIA */
    DELETE FROM CONTABILIZACION WHERE CNTB_TIPOREF = 21 AND CNTB_IDREF = :IDDOC;
    /* ENCABEZADO DE LA FACTURA */
    SELECT PREF_PRE, FACO_NUMERO, FACO_FECHA, F.TERC_NIT, FACO_IMPTOS, FACO_VENCE, FACO_DTOMONTO, FACO_ADICIONAL, FACO_IVAMONTO, FACO_EXTRA, FACO_TOTAL, FACO_RTFTEPORC, FACO_RTFTEMONTO, FACO_RTIVAPOR, FACO_RTIVAMONTO, FACO_RTICAPOR, FACO_RTICAMONTO, TERC_NOM, PROV_CTARTFTE, PROV_CTARTIVA, PROV_CTARTICA, PROV_CTAPAGAR, FACO_NUMPROV, FACO_ANULADO
        FROM FACTURAS_COMPRA F, TERCEROS T, PROVEEDORES P WHERE FACO_ID = :IDDOC AND F.TERC_NIT = T.TERC_NIT AND T.TERC_NIT = P.TERC_NIT
        INTO :PREFIJO, :NUM, :FECAUX, :NIT, :IMPINC, :VENCEAUX, :VRDTO, :VRADIC, :VRIVA, :VREXTRA, :VRTOTAL, :PRTFTE, :VRRTFTE, :PORC, :VRRTIVA, :PRTICA, :VRRTICA, :NOMBRE, TCTARTFTE, TCTARTIVA, TCTARTICA, TCTAPROV, :NUMPROV, :ANULADO;
    /* CENTRO DE LA BODEGA */
    IF (CENT = 'B') THEN
        SELECT BODE_CENTRO, BODE_PROY FROM BODEGA B, FACTURAS_COMPRA F WHERE B.BODE_COD = F.BODE_COD AND F.FACO_ID = :IDDOC INTO :CENTRO, :PROY;
    ELSE
        SELECT PREF_CENTRO,PREF_PROY  FROM PREFIJOS P, FACTURAS_COMPRA F WHERE P.PREF_PRE = F.PREF_PRE AND F.FACO_ID = :IDDOC AND P.TIDO_COD = 21 INTO :CENTRO, :PROY;
    if (ANULADO = 'N') then
        BEGIN
        NUMERO = PREFIJO || NUM;
        VRSUBT = VRTOTAL - VREXTRA - VRIVA;
        MERCANCIA = VRSUBT - VRADIC + VRDTO;
        EXECUTE PROCEDURE FECHA_A_CONTA(:FECAUX) returning_values (:FECHA);
        EXECUTE PROCEDURE FECHA_A_CONTA(:VENCEAUX) returning_values (:VENCE);
        if (NUMPROV IS NULL) then
            NUMPROV = NUMERO;
        CONCEPTO = 'FC No.' || NUMERO || '-' || SUBSTR(NOMBRE,1,26) || '-NPROV.' || NUMPROV;
        IDC = GEN_ID(ID_CONTABILIZA, 1);
        INSERT INTO CONTABILIZACION (CNTB_ID, CNTB_TIPOCOMP, CNTB_PREFCNT, CNTB_NUMERO, CNTB_FECHA, CNTB_CONCEPTO, CNTB_REF, CNTB_TIPOREF, CNTB_IDREF, CNTB_PREFREF, CNTB_NUMREF, CNTB_PROCESADO)
            VALUES (:IDC, :TIPOCOMP, :PREFCONT, :NUM, :FECHA, :CONCEPTO, '', 21, :IDDOC, :PREFIJO, :NUM, 'N');
        NUMITEMS = 0;
        SUMA = 0;
        NETO = 0;
        ERROR = 0;
        EXECUTE PROCEDURE LEE_CONFIGURACION('COMPRAS', 'FACTURAS', 'USAR IMPOCONSUMO COMO PORCENTAJE DE FOMENTO') RETURNING_VALUES (FOMENTO);
        EXECUTE PROCEDURE lee_configuracion('COMPRAS','FACTURAS','DESCUENTO Y VALOR ADICIONAL DEL DOCUMENTO COMO MENOR VALOR DEL COSTO') returning_values (:MENORV);
        SELECT SUM(FCDE_consumo) from facturas_compras_detalle where faco_id = :IDDOC into :valoradic;
        if (MENORV = 'SI') then
            if (MERCANCIA <> 0) then
                FACTOR = (CAST(VRSUBT AS DOUBLE PRECISION) - VALORADIC) / (CAST(MERCANCIA AS DOUBLE PRECISION) - VALORADIC);
            ELSE
                FACTOR = 1;
        ELSE
           FACTOR = 1;
        SELECT CAST(CONF_VALOR AS INTEGER) FROM CONFIGURACION WHERE CONF_MODULO = 'COMPRAS' AND CONF_CATEGORIA = 'GENERAL' AND CONF_PROPIEDAD = 'REDONDEO AL MULTIPLO DE DIEZ EN TOTALES' INTO :DIG;
        if (INVEN = 'A') then
            BEGIN
            FOR SELECT MAX(COAR_CTAINV), SUM(CAST(FCDE_CANT AS DOUBLE PRECISION) * (FCDE_PRUNIT-FCDE_DTOMONTO)), SUM(FCDE_IVAMONTO), SUM(FCDE_CONSUMO), MAX(F.BODE_COD)
                FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_COMPRAS_DETALLE F WHERE F.FACO_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD
                GROUP BY COAR_CTAINV, F.BODE_COD INTO :CTAINVEN, :MONTO, :IMPTOS, :VALORADIC, :BODE_DET DO
                BEGIN
                IF (CENT = 'B') THEN
                  SELECT BODE_CENTRO, BODE_PROY FROM BODEGA WHERE BODE_COD = :BODE_DET INTO :CENTRODET, :PROYDET;
                if (IMPINC = 'S') then
                    BEGIN
                    MONTO = MONTO - IMPTOS;
                    if (FOMENTO <> 'SI' ) then
                        MONTO = MONTO - VALORADIC;
                    END
                MONTO = MONTO * FACTOR;
                execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                EXECUTE PROCEDURE CUENTA_INTERFAZ(21, :IDDOC, :CTAINVEN, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    FOR SELECT F.ARTI_COD, (FCDE_CANT * (FCDE_PRUNIT-FCDE_DTOMONTO)), FCDE_IVAMONTO, FCDE_CONSUMO
                        FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_COMPRAS_DETALLE F WHERE F.FACO_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTAINV = :CUENTA
                        INTO :ARTICULO, :MONTO, :IMPTOS, :VALORADIC DO
                        BEGIN
                        if (IMPINC = 'S') then
                            BEGIN
                            MONTO = MONTO - IMPTOS;
                            if (FOMENTO <> 'SI' ) then
                                MONTO = MONTO - VALORADIC;
                            END
                        MONTO = MONTO * FACTOR;
                        execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                        IF (CENT = 'B') THEN
                           INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                               VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROYDET, :CENTRODET, NULL, NULL, NULL, :ARTICULO, 0, 0);
                        ELSE
                           INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                               VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                        NUMITEMS = NUMITEMS + 1;
                        NETO = NETO + MONTO;
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    IF (CENT = 'B') THEN
                       INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                           VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROYDET, :CENTRODET, :NUMERO, NULL, :VENCE, NULL, 0, 21);
                    ELSE
                       INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                           VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 21);
                    NUMITEMS = NUMITEMS + 1;
                    NETO = NETO + MONTO;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    IF (CENT = 'B') THEN
                       INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                           VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROYDET, :CENTRODET, NULL, NULL, NULL, NULL, 0, 0);
                    ELSE
                       INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                           VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NUMITEMS = NUMITEMS + 1;
                    NETO = NETO + MONTO;
                    END
                END
            END
        if (INVEN = 'K') then
            BEGIN
            FOR SELECT SUM(CAST(FCDE_CANT AS DOUBLE PRECISION) * (FCDE_PRUNIT-FCDE_DTOMONTO)), SUM(FCDE_IVAMONTO), SUM(FCDE_CONSUMO), MAX(BODE_COD)
                FROM FACTURAS_COMPRAS_DETALLE WHERE FACO_ID = :IDDOC GROUP BY BODE_COD INTO :MONTO, :IMPTOS, :VALORADIC, :BODE_DET Do
                BEGIN
                  IF (CENT = 'B') THEN
                    SELECT BODE_CENTRO, BODE_PROY FROM BODEGA WHERE BODE_COD = :BODE_DET INTO :CENTRODET, :PROYDET;
                  if (IMPINC = 'S') then
                   BEGIN
                    MONTO = MONTO - IMPTOS;
                    if (FOMENTO <> 'SI' ) then
                      MONTO = MONTO - VALORADIC;
                   END
                  MONTO = MONTO * FACTOR;
                  execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                  execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                  EXECUTE PROCEDURE CUENTA_INTERFAZ(21, :IDDOC, :CTAINVEN, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                  if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                  if (TIPOCUEN = 'I') then
                   BEGIN
                    FOR SELECT ARTI_COD, (FCDE_CANT * (FCDE_PRUNIT-FCDE_DTOMONTO)), FCDE_IVAMONTO, FCDE_CONSUMO
                      FROM FACTURAS_COMPRAS_DETALLE WHERE FACO_ID = :IDDOC INTO :ARTICULO, :MONTO, :IMPTOS, :VALORADIC DO
                       BEGIN
                       if (IMPINC = 'S') then
                        BEGIN
                         MONTO = MONTO - IMPTOS;
                         if (FOMENTO <> 'SI' ) then
                            MONTO = MONTO - VALORADIC;
                        END
                       MONTO = MONTO * FACTOR;
                       execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                       execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                       IF (CENT = 'B') THEN
                          INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                             VALUES (:IDC, :NUMITEMS, :CTAINVEN, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROYDET, :CENTRODET, NULL, NULL, NULL, :ARTICULO, 0, 0);
                       ELSE
                          INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                             VALUES (:IDC, :NUMITEMS, :CTAINVEN, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                       NUMITEMS = NUMITEMS + 1;
                       NETO = NETO + MONTO;
                       END
                   END
                  if (TIPOCUEN = 'C') then
                   BEGIN
                    IF (CENT = 'B') THEN
                       INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                         VALUES (:IDC, :NUMITEMS, :CTAINVEN, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROYDET, :CENTRODET, :NUMERO, NULL, :VENCE, NULL, 0, 21);
                    ELSE
                       INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                         VALUES (:IDC, :NUMITEMS, :CTAINVEN, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 21);
                    NUMITEMS = NUMITEMS + 1;
                    NETO = NETO + MONTO;
                   END
                  if (TIPOCUEN = 'N') then
                   BEGIN
                    IF (CENT = 'B') THEN
                       INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                          VALUES (:IDC, :NUMITEMS, :CTAINVEN, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROYDET, :CENTRODET, NULL, NULL, NULL, NULL, 0, 0);
                    ELSE
                       INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                          VALUES (:IDC, :NUMITEMS, :CTAINVEN, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NUMITEMS = NUMITEMS + 1;
                    NETO = NETO + MONTO;
                   END
                END
            END
        /* EL IVA */
        if (IVA = 'A') then
            BEGIN
            FOR SELECT MAX(COAR_CTAIVAC), SUM(FCDE_IVAMONTO), SUM(CAST(FCDE_CANT AS DOUBLE PRECISION) * (FCDE_PRUNIT-FCDE_DTOMONTO)), SUM(FCDE_CONSUMO)
                FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_COMPRAS_DETALLE F
                WHERE F.FACO_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND FCDE_IVAMONTO <> 0
                GROUP BY COAR_CTAIVAC
                INTO :CTAIVA, :IMPTOS, :MONTO, :VALORADIC DO
              if (IMPTOS <> 0) then
                BEGIN
                IMPTOS = CAST(IMPTOS AS DOUBLE PRECISION) * VRSUBT / MERCANCIA;
                if (IMPINC = 'S') then
                    BEGIN
                    MONTO = MONTO - IMPTOS;
                    if (FOMENTO <> 'SI' ) then
                        MONTO = MONTO - VALORADIC;
                    END
                MONTO = CAST(MONTO AS DOUBLE PRECISION) * VRSUBT / MERCANCIA;
                execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                EXECUTE PROCEDURE CUENTA_INTERFAZ(21, :IDDOC, :CTAIVA, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    FOR SELECT F.ARTI_COD, FCDE_IVAMONTO, (FCDE_CANT * (FCDE_PRUNIT-FCDE_DTOMONTO)), TAIV_PORC, FCDE_CONSUMO
                        FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_COMPRAS_DETALLE F, TARIFA_IVA T WHERE F.FACO_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTAIVAV = :CUENTA AND A.TAIV_COD = T.TAIV_COD
                        INTO :ARTICULO, :IMPTOS, :MONTO, :PORCIVA, :VALORADIC
                    DO
                        BEGIN
                        IMPTOS = CAST(IMPTOS AS DOUBLE PRECISION) * VRSUBT / MERCANCIA;
                        if (IMPINC = 'S') then
                            BEGIN
                            MONTO = MONTO - IMPTOS;
                            if (FOMENTO <> 'SI' ) then
                                MONTO = MONTO - VALORADIC;
                            END
                        MONTO = CAST(MONTO AS DOUBLE PRECISION) * VRSUBT / MERCANCIA;
                        execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :IMPTOS, 0, :MONTO, :PORCIVA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                        NUMITEMS = NUMITEMS + 1;
                        NETO = NETO + IMPTOS;
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :IMPTOS, 0, :MONTO, :IMPTOS*100/:MONTO, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 21);
                    NUMITEMS = NUMITEMS + 1;
                    NETO = NETO + IMPTOS;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :IMPTOS, 0, :MONTO, CAST(:IMPTOS AS DOUBLE PRECISION)*100/CAST(:MONTO AS DOUBLE PRECISION), :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NUMITEMS = NUMITEMS + 1;
                    NETO = NETO + IMPTOS;
                    END
                END
            END
        if (IVA = 'K') then /* IVA EN CTA CONSTANTE */
            BEGIN
            SELECT SUM(FCDE_IVAMONTO), SUM(CAST(FCDE_CANT AS DOUBLE PRECISION) * (FCDE_PRUNIT-FCDE_DTOMONTO)), SUM(FCDE_CONSUMO)
                FROM FACTURAS_COMPRAS_DETALLE F
                WHERE F.FACO_ID = :IDDOC  AND FCDE_IVAMONTO <> 0
                INTO :IMPTOS, :MONTO, :VALORADIC;
            if (IMPTOS <> 0) then
                BEGIN
                IMPTOS = CAST(IMPTOS AS DOUBLE PRECISION) * VRSUBT / MERCANCIA;
                if (IMPINC = 'S') then
                    BEGIN
                    MONTO = MONTO - IMPTOS;
                    if (FOMENTO <> 'SI' ) then
                        MONTO = MONTO - VALORADIC;
                    END
                MONTO = CAST(MONTO AS DOUBLE PRECISION) * VRSUBT / MERCANCIA;
                execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                EXECUTE PROCEDURE CUENTA_INTERFAZ(21, :IDDOC, :CTAIVA, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    FOR SELECT F.ARTI_COD, (FCDE_CANT * (FCDE_PRUNIT-FCDE_DTOMONTO)), FCDE_IVAMONTO, TAIV_PORC, FCDE_CONSUMO
                        FROM ARTICULO A, FACTURAS_COMPRAS_DETALLE F, TARIFA_IVA T WHERE F.FACO_ID = :IDDOC AND A.TAIV_COD = T.TAIV_COD
                        INTO :ARTICULO, :MONTO, :IMPTOS, :PORCIVA, :VALORADIC DO
                        BEGIN
                        IMPTOS = CAST(IMPTOS AS DOUBLE PRECISION) * VRSUBT / MERCANCIA;
                        if (IMPINC = 'S') then
                            BEGIN
                            MONTO = MONTO - IMPTOS;
                            if (FOMENTO <> 'SI' ) then
                                MONTO = MONTO - VALORADIC;
                            END
                        MONTO = CAST(MONTO AS DOUBLE PRECISION) * VRSUBT / MERCANCIA;
                        execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                        if (IMPTOS <> 0) then
                            BEGIN
                            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                VALUES (:IDC, :NUMITEMS, :CTAIVA, :CONCEPTO, '', :IMPTOS, 0, :MONTO, :PORCIVA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                            NUMITEMS = NUMITEMS + 1;
                            NETO = NETO + IMPTOS;
                            END
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NUMITEMS, :CTAIVA, :CONCEPTO, '', :IMPTOS, 0, :MONTO, :IMPTOS*100/:MONTO, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 21);
                    NUMITEMS = NUMITEMS + 1;
                    NETO = NETO + IMPTOS;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NUMITEMS, :CTAIVA, :CONCEPTO, '', :IMPTOS, 0, :MONTO, :IMPTOS*100/:MONTO, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NUMITEMS = NUMITEMS + 1;
                    NETO = NETO + IMPTOS;
                    END
                END
            END
        /* EL IMPOCONSUMO */
        if (CONSUMO = 'A') then
            BEGIN
            FOR SELECT MAX(COAR_CTACONS), SUM(FCDE_CONSUMO) FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_COMPRAS_DETALLE F
                WHERE F.FACO_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD GROUP BY COAR_CTACONS INTO :CTACONSUMO, :IMPTOS
            DO
              if (IMPTOS <> 0) then
                BEGIN
                execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                EXECUTE PROCEDURE CUENTA_INTERFAZ(21, :IDDOC, :CTACONSUMO, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (FOMENTO <> 'SI') then
                    BEGIN
                    if (TIPOCUEN = 'I') then
                        BEGIN
                        FOR SELECT F.ARTI_COD, FCDE_CONSUMO FROM ARTICULO A, FACTURAS_COMPRAS_DETALLE F WHERE F.FACO_ID = :IDDOC INTO :ARTICULO, :IMPTOS
                            DO
                            BEGIN
                            if (IMPTOS <> 0) then
                                BEGIN
                                execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                    VALUES (:IDC, :NUMITEMS, :CTACONSUMO, :CONCEPTO, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                                NUMITEMS = NUMITEMS + 1;
                                NETO = NETO + IMPTOS;
                                END
                            END
                        END
                    if (TIPOCUEN = 'C') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CTACONSUMO, :CONCEPTO, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                        NUMITEMS = NUMITEMS + 1;
                        NETO = NETO + IMPTOS;
                        END
                    if (TIPOCUEN = 'N') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CTACONSUMO, :CONCEPTO, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NUMITEMS = NUMITEMS + 1;
                        NETO = NETO + IMPTOS;
                        END
                    END
                ELSE
                    BEGIN
                    if (TIPOCUEN = 'I') then
                        BEGIN
                        FOR SELECT F.ARTI_COD, FCDE_CONSUMO FROM ARTICULO A, FACTURAS_COMPRAS_DETALLE F WHERE F.FACO_ID = :IDDOC INTO :ARTICULO, :IMPTOS
                            DO
                            BEGIN
                            if (IMPTOS <> 0) then
                                BEGIN
                                execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                    VALUES (:IDC, :NUMITEMS, :CTACONSUMO, :CONCEPTO, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                                NUMITEMS = NUMITEMS + 1;
                                NETO = NETO - IMPTOS;
                                END
                            END
                        END
                    if (TIPOCUEN = 'C') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CTACONSUMO, :CONCEPTO, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                        NUMITEMS = NUMITEMS + 1;
                        NETO = NETO - IMPTOS;
                        END
                    if (TIPOCUEN = 'N') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CTACONSUMO, :CONCEPTO, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NUMITEMS = NUMITEMS + 1;
                        NETO = NETO - IMPTOS;
                        END
                    END
                END
            END
        if (CONSUMO = 'K') then /* CONSUMO EN CTA CONSTANTE */
            BEGIN
            SELECT SUM(FCDE_CONSUMO) FROM FACTURAS_COMPRAS_DETALLE F WHERE F.FACO_ID = :IDDOC INTO :IMPTOS;
            if (IMPTOS <> 0) then
              BEGIN
              execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
              /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
              EXECUTE PROCEDURE CUENTA_INTERFAZ(21, :IDDOC, :CTACONSUMO, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
              if (ERRORC <> 0) then
                ERROR = ERROR + 1;
              if (FOMENTO <> 'SI') then
                BEGIN
                /* DEPENDE DEL TIPO DE CUENTA */
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT F.ARTI_COD, FCDE_CONSUMO FROM ARTICULO A, FACTURAS_COMPRAS_DETALLE F WHERE F.FACO_ID = :IDDOC INTO :ARTICULO, :IMPTOS
                        DO
                        BEGIN
                        if (IMPTOS <> 0) then
                            BEGIN
                            execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                VALUES (:IDC, :NUMITEMS, :CTACONSUMO, :CONCEPTO, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                            NUMITEMS = NUMITEMS + 1;
                            NETO = NETO + IMPTOS;
                            END
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    /* INSERTE EL REGISTRO DE LA BASE */
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NUMITEMS, :CTACONSUMO, :CONCEPTO, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    NUMITEMS = NUMITEMS + 1;
                    NETO = NETO + IMPTOS;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NUMITEMS, :CTACONSUMO, :CONCEPTO, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NUMITEMS = NUMITEMS + 1;
                    NETO = NETO + IMPTOS;
                    END
                END
              ELSE
                BEGIN
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT F.ARTI_COD, FCDE_CONSUMO FROM ARTICULO A, FACTURAS_COMPRAS_DETALLE F WHERE F.FACO_ID = :IDDOC INTO :ARTICULO, :IMPTOS
                        DO
                        BEGIN
                        if (IMPTOS <> 0) then
                            BEGIN
                           execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                           INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                VALUES (:IDC, :NUMITEMS, :CTACONSUMO, :CONCEPTO, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                            NUMITEMS = NUMITEMS + 1;
                            NETO = NETO - IMPTOS;
                            END
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    /* INSERTE EL REGISTRO DE LA BASE */
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NUMITEMS, :CTACONSUMO, :CONCEPTO, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    NUMITEMS = NUMITEMS + 1;
                    NETO = NETO - IMPTOS;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NUMITEMS, :CTACONSUMO, :CONCEPTO, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NUMITEMS = NUMITEMS + 1;
                    NETO = NETO - IMPTOS;
                    END
                END
              end
            END
        /* DESCUENTO */
        if ((CTADTO IS NOT NULL) AND
            (CTADTO <> '')) THEN
          BEGIN
          execute procedure redondee(VRDTO, DIG) returning_values (VRDTO);
          if (VRDTO <> 0) then
            begin
            /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
            EXECUTE PROCEDURE CUENTA_INTERFAZ(21, :IDDOC, :CTADTO, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :VRDTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 21);
                NUMITEMS = NUMITEMS + 1;
                NETO = NETO - VRDTO;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                /* INSERTE EL REGISTRO DE LA BASE */
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :VRDTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NUMITEMS = NUMITEMS + 1;
                NETO = NETO - VRDTO;
                END
            end
          END
        /* VALOR ADIC */
        if ((CTAADIC IS NOT NULL) AND
            (CTAADIC <> '')) THEN
          BEGIN
          execute procedure redondee(VRADIC, DIG) returning_values (VRADIC);
          if (VRADIC <> 0) then
            begin
            /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
            EXECUTE PROCEDURE CUENTA_INTERFAZ(21, :IDDOC, :CTAADIC, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :VRADIC, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 21);
                NUMITEMS = NUMITEMS + 1;
                NETO = NETO + VRADIC;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :VRADIC, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NUMITEMS = NUMITEMS + 1;
                NETO = NETO + VRADIC;
                END
            end
          END
        /* VALOR EXTRA */
        if ((CTAEXTRA IS NOT NULL) AND
            (CTAEXTRA <> '')) THEN
          BEGIN
          execute procedure redondee(VREXTRA, DIG) returning_values (VREXTRA);
          if (VREXTRA <> 0) then
            begin
            /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
            EXECUTE PROCEDURE CUENTA_INTERFAZ(21, :IDDOC, :CTAEXTRA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :VREXTRA, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 21);
                NUMITEMS = NUMITEMS + 1;
                NETO = NETO + VREXTRA;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :VREXTRA, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NUMITEMS = NUMITEMS + 1;
                NETO = NETO + VREXTRA;
                END
            end
          END

        /* DESCUENTE EL IMPOCONSUMO */
        SELECT SUM(FCDE_CONSUMO) FROM FACTURAS_COMPRAS_DETALLE F WHERE F.FACO_ID = :IDDOC INTO :IMPTOS;
        if (IMPTOS IS NULL) then
            IMPTOS = 0;
        vrsubt = vrsubt - IMPTOS;
        /* RETENCION FUENTE */
        if ((RTFTE = 'P') or (RTFTE = 'K')) then
          BEGIN
          execute procedure redondee(VRRTFTE, DIG) returning_values (VRRTFTE);
          if (VRRTFTE <> 0) then
            begin
            if (RTFTE = 'P') then
                CTARTFTE = TCTARTFTE;
            EXECUTE PROCEDURE CUENTA_INTERFAZ(21, :IDDOC, :CTARTFTE, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :VRRTFTE, (:VRSUBT*-1), :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NUMITEMS = NUMITEMS + 1;
                NETO = NETO - VRRTFTE;
                SUMA = VRRTFTE;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :VRRTFTE, (:VRSUBT*-1), :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NUMITEMS = NUMITEMS + 1;
                NETO = NETO - VRRTFTE;
                SUMA = VRRTFTE;
                END
            end
          END
        if (RTFTE = 'A') then
          BEGIN
          FOR SELECT MAX(COAR_CTARTFTE), MAX(COAR_RTFTE), MIN(COAR_RTBASE), SUM(FCDE_TOTAL-FCDE_IVAMONTO-FCDE_CONSUMO), SUM((FCDE_TOTAL-FCDE_IVAMONTO-FCDE_CONSUMO)*COAR_RTFTE)
            FROM CONTABIL_ARTICULO C, FACTURAS_COMPRAS_DETALLE F
            WHERE F.faco_id = :IDDOC AND F.ARTI_COD = C.ARTI_COD
            GROUP BY COAR_CTARTFTE
            INTO :CTARTFTE, :PRTFTE, :baseadic,  :MONTO, :VRRTFTE
            DO
            BEGIN
            MONTO = MONTO * FACTOR * -1;
            if (MONTO >= :baseadic) then
                BEGIN
                VRRTFTE = VRRTFTE * FACTOR / 100;
                execute procedure redondee(VRRTFTE, DIG) returning_values (VRRTFTE);
                execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                if (VRRTFTE <> 0) then
                    BEGIN
                    EXECUTE PROCEDURE CUENTA_INTERFAZ(21, :IDDOC, :CTARTFTE, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
                    if (ERRORC <> 0) then
                        ERROR = ERROR + 1;
                    if (TIPOCUEN = 'C') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :VRRTFTE, :VRSUBT, :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                        NUMITEMS = NUMITEMS + 1;
                        NETO = NETO - VRRTFTE;
                        SUMA = VRRTFTE;
                        END
                    if (TIPOCUEN = 'N') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :VRRTFTE, :VRSUBT, :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NUMITEMS = NUMITEMS + 1;
                        NETO = NETO - VRRTFTE;
                        SUMA = VRRTFTE;
                        END
                    end
                end
              END
          END
        /* RETENCION IVA */
        if ((RTIVA = 'P') or (RTIVA = 'K')) then
          BEGIN
          execute procedure redondee(VRRTIVA, DIG) returning_values (VRRTIVA);
          if (VRRTIVA <> 0) then
            begin
            if (RTIVA = 'P') then
                CTARTIVA = TCTARTIVA;
            EXECUTE PROCEDURE CUENTA_INTERFAZ(21, :IDDOC, :CTARTIVA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :VRRTIVA, (:VRIVA*-1), :PORC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 21);
                NUMITEMS = NUMITEMS + 1;
                NETO = NETO - VRRTIVA;
                SUMA = SUMA + VRRTIVA;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :VRRTIVA, (:VRIVA*-1), :PORC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NUMITEMS = NUMITEMS + 1;
                NETO = NETO - VRRTIVA;
                SUMA = SUMA + VRRTIVA;
                END
            end
          END
        /* RETENCION DE ICA */
        if ((RTICA = 'P') or (RTICA = 'K')) then
          BEGIN
          execute procedure redondee(VRRTICA, DIG) returning_values (VRRTICA);
          if (VRRTICA <> 0) then
            begin
            if (RTICA = 'P') then
                CTARTICA = TCTARTICA;
            EXECUTE PROCEDURE CUENTA_INTERFAZ(21, :IDDOC, :CTARTICA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :VRRTICA, (:VRSUBT*-1), :PRTICA, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 21);
                NUMITEMS = NUMITEMS + 1;
                NETO = NETO - VRRTICA;
                SUMA = SUMA + VRRTICA;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :VRRTICA, (:VRSUBT*-1), :PRTICA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NUMITEMS = NUMITEMS + 1;
                NETO = NETO - VRRTICA;
                SUMA = SUMA + VRRTICA;
                END
            end
          END
        /* CIERRE EL COMPROBANTE CONTRA LA CUENTA DEL TERCERO O LA CONSTANTE */
        if ((CXP = 'P') or (CXP = 'K')) then
            BEGIN
            SUMA = VRTOTAL - SUMA;
            execute procedure redondee(SUMA, DIG) returning_values (SUMA);
            if (CXP = 'P') then
                CTACXP = TCTAPROV;
            EXECUTE PROCEDURE CUENTA_INTERFAZ(21, :IDDOC, :CTACXP, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :SUMA, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 21);
            if (TIPOCUEN = 'N') then
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :SUMA, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NETO = NETO - SUMA;
            NUMITEMS = NUMITEMS + 1;
            END
        /* recorra las cuentas adicionales */
        FOR SELECT INCC_CUENTA, INCC_BASE, INCC_PORC, INCC_VALOR, INCC_DB FROM INTERFAZ_COMPRAS_CTAS
            WHERE INCO_ID = :IDINTER INTO :CUENTAADIC, :BASEADIC, :PORCADIC, :VALORADIC, :DBADIC
            DO
            BEGIN
            if (VALORADIC <> 0) then
                MONTO = VALORADIC;
            ELSE
                BEGIN
                if (:BASEADIC = 'SUBTOTAL') then
                    VALORADIC = VRTOTAL - VREXTRA - VRIVA - VRADIC + VRDTO;
                if (:BASEADIC = 'DESCUENTO') then
                    VALORADIC = VRDTO;
                if (:BASEADIC = 'IVA') then
                    VALORADIC = VRIVA;
                if (:BASEADIC = 'CONSUMO') then
                    SELECT SUM(FCDE_CONSUMO) FROM FACTURAS_COMPRAS_DETALLE F WHERE F.FACO_ID = :IDDOC INTO :VALORADIC;
                if (:BASEADIC = 'ADICIONAL') then
                    VALORADIC = VRADIC;
                if (:BASEADIC = 'EXTRA') then
                    VALORADIC = VREXTRA;
                if (:BASEADIC = 'TOTAL') then
                    VALORADIC = VRTOTAL;
                MONTO = CAST(VALORADIC AS DOUBLE PRECISION) * PORCADIC / 100;
                END
            if (MONTO <> 0) then
                BEGIN
                execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                EXECUTE PROCEDURE CUENTA_INTERFAZ(21, :IDDOC, :CUENTAADIC, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'C') then
                    BEGIN
                    if (DBADIC = 'S') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTAADIC, :CONCEPTO, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                        SUMA = SUMA + MONTO;
                        NETO = NETO + MONTO;
                        END
                    ELSE
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTAADIC, :CONCEPTO, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                        SUMA = SUMA - MONTO;
                        NETO = NETO - MONTO;
                        END
                    NUMITEMS = NUMITEMS + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    if (DBADIC = 'S') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTAADIC, :CONCEPTO, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        SUMA = SUMA + MONTO;
                        NETO = NETO + MONTO;
                        END
                    ELSE
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTAADIC, :CONCEPTO, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        SUMA = SUMA - MONTO;
                        NETO = NETO - MONTO;
                        END
                    NUMITEMS = NUMITEMS + 1;
                    END
                END
            END
        if (NETO <> 0) then
            BEGIN
            EXECUTE PROCEDURE lee_configuracion ('CONTABILIDAD','GENERAL','CUENTA PARA CUADRAR COMPROBANTES DESCUADRADOS DE INTERFAZ') returning_values (:ctaadic);
            if (ctaadic <> '') then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(21, :IDDOC, :CTAADIC, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'C') then
                    BEGIN
                    if (NETO < 0) then
                        BEGIN
                        NETO = NETO * -1;
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :NETO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                        END
                    ELSE
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :NETO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                        END
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    if (NETO < 0) then
                        BEGIN
                        NETO = NETO * -1;
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :NETO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        END
                    ELSE
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :NETO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        END
                    END
                END
            END
        END
    if (ERROR > 0) then
        VER = 'S';
    SUSPEND;
    END
ELSE
    BEGIN
    EXECUTE PROCEDURE ERROR (21, :IDDOC, :PREFIJO, 1);
    ERROR = ERROR + 1;
    VER = 'S';
    SUSPEND;
    END
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE CONTABILICE_COMP_SIMPLIFICADO(
    IDI INTEGER)
RETURNS (
    ID INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    ESTADO VARCHAR(20),
    IDC INTEGER)
AS
DECLARE VARIABLE VER CHAR(2);
declare variable ERROR INTEGER;
BEGIN /*$$IBE$$ 
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;
   $$IBE$$*/ /* 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; */ /*$$IBE$$ 
  EXECUTE PROCEDURE CONTABIL_FACTCOMP (:ID, :IDI) RETURNING_VALUES (:ERROR, VER, :IDC);
  if (ERROR = 0) then
    BEGIN
 $$IBE$$*/ /*    EXECUTE PROCEDURE CONTABILIZA_PENDIENTE (:IDC); */ /*$$IBE$$ 
    ESTADO = 'OK';
    END
  ELSE
    ESTADO = 'ERROR';
  suspend;
  END
 $$IBE$$*/ SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE FACTCOMP_SIN_CONTABILIDAD(
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    ID INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    ESTADO VARCHAR(20),
    IDI INTEGER,
    IDC INTEGER)
AS
DECLARE VARIABLE VER CHAR(2);
declare variable FECICNT VARCHAR(10);
declare variable FECFCNT VARCHAR(10);
declare variable ERROR INTEGER;
declare variable idref INTEGER;
BEGIN /*$$IBE$$ 
EXECUTE PROCEDURE fecha_a_conta(FECINI) returning_values (FECICNT);
EXECUTE PROCEDURE fecha_a_conta(FECFIN) returning_values (FECFCNT);
FOR SELECT FACO_ID, PREF_PRE, FACO_NUMERO FROM FACTURAS_COMPRA WHERE FACO_ANULADO = 'N' AND
    FACO_FECHA >= :FECINI AND FACO_FECHA <= :FECFIN ORDER BY FACO_ID
    INTO :ID, :PREF, :NUMERO
DO
  BEGIN
  idref = null;
  SELECT ENCO_IDREF FROM COMPROBANTE_ENCABEZADO WHERE ENCO_TIPOREF = 21 AND ENCO_FECHA >= :FECICNT AND ENCO_FECHA <= :FECFCNT and ENCO_IDREF = :id into :idref;
  if (idref IS NULL) then
  begin
   ESTADO = 'PROCESANDO';
   SUSPEND;
   SELECT MAX(INCO_ID) FROM INTERFAZ_COMPRAS WHERE PREF_PRE = :PREF AND TIDO_COD = 21 INTO :IDI;
   EXECUTE PROCEDURE CONTABIL_FACTCOMP (:ID, :IDI) RETURNING_VALUES (:ERROR, VER, :IDC);
   if (ERROR = 0) then
    BEGIN
    EXECUTE PROCEDURE CONTABILIZA_PENDIENTE (:IDC);
    ESTADO = 'OK';
    END
   ELSE
    ESTADO = 'ERROR';
   suspend;
  End
  END
 $$IBE$$*/ SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

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

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE FACTCOMP_SIN_CONTABILIDAD(
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    ID INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    ESTADO VARCHAR(20),
    IDI INTEGER,
    IDC INTEGER)
AS
DECLARE VARIABLE VER CHAR(2);
declare variable FECICNT VARCHAR(10);
declare variable FECFCNT VARCHAR(10);
declare variable ERROR INTEGER;
declare variable idref INTEGER;
BEGIN
EXECUTE PROCEDURE fecha_a_conta(FECINI) returning_values (FECICNT);
EXECUTE PROCEDURE fecha_a_conta(FECFIN) returning_values (FECFCNT);
FOR SELECT FACO_ID, PREF_PRE, FACO_NUMERO FROM FACTURAS_COMPRA WHERE FACO_ANULADO = 'N' AND
    FACO_FECHA >= :FECINI AND FACO_FECHA <= :FECFIN ORDER BY FACO_ID
    INTO :ID, :PREF, :NUMERO
DO
  BEGIN
  idref = null;
  SELECT ENCO_IDREF FROM COMPROBANTE_ENCABEZADO WHERE ENCO_TIPOREF = 21 AND ENCO_FECHA >= :FECICNT AND ENCO_FECHA <= :FECFCNT and ENCO_IDREF = :id into :idref;
  if (idref IS NULL) then
  begin
   ESTADO = 'PROCESANDO';
   SUSPEND;
   SELECT MAX(INCO_ID) FROM INTERFAZ_COMPRAS WHERE PREF_PRE = :PREF AND TIDO_COD = 21 INTO :IDI;
   EXECUTE PROCEDURE CONTABIL_FACTCOMP (:ID, :IDI) RETURNING_VALUES (:ERROR, VER, :IDC);
   if (ERROR = 0) then
    BEGIN
    EXECUTE PROCEDURE CONTABILIZA_PENDIENTE (:IDC);
    ESTADO = 'OK';
    END
   ELSE
    ESTADO = 'ERROR';
   suspend;
  End
  END
END

^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER PROCEDURE CONTABIL_DEVOLCOMP(
    IDDOC INTEGER,
    IDINTER INTEGER)
RETURNS (
    ERROR INTEGER,
    VER CHAR(1),
    IDC INTEGER)
AS
declare variable PREFIJO VARCHAR(4);
declare variable NUM VARCHAR(6);
declare variable NUMERO VARCHAR(10);
declare variable FECAUX DATE;
declare variable FECHA CHAR(8);
declare variable CONCEPTO CHAR(100);
declare variable NUMFAC VARCHAR(10);
declare variable VRDTO NUMERIC(18, 2);
declare variable VRADIC NUMERIC(18, 2);
declare variable VRSUBT NUMERIC(18, 2);
declare variable VRIVA NUMERIC(18, 2);
declare variable PRTFTE NUMERIC(9, 2);
declare variable VRRTFTE NUMERIC(18, 2);
declare variable VRRTIVA NUMERIC(18, 2);
declare variable PRTICA NUMERIC(9, 2);
declare variable VRRTICA NUMERIC(18, 2);
declare variable VRTOTAL NUMERIC(18, 2);
declare variable VREXTRA NUMERIC(18, 2);
declare variable TIPOCOMP VARCHAR(3);
declare variable PREFCONT VARCHAR(4);
declare variable INVEN CHAR(1);
declare variable CTAINVEN VARCHAR(20);
declare variable IVA CHAR(1);
declare variable CTAIVA VARCHAR(20);
declare variable CONSUMO CHAR(1);
declare variable CTACONSUMO VARCHAR(20);
declare variable CXP CHAR(1);
declare variable CTACXP VARCHAR(20);
declare variable RTFTE CHAR(1);
declare variable CTARTFTE VARCHAR(20);
declare variable RTIVA CHAR(1);
declare variable CTARTIVA VARCHAR(20);
declare variable RTICA CHAR(1);
declare variable CTARTICA VARCHAR(20);
declare variable CTADTO VARCHAR(20);
declare variable CTAADIC VARCHAR(20);
declare variable CTAEXTRA VARCHAR(20);
declare variable EXISTE CHAR(1);
declare variable CUENTA VARCHAR(20);
declare variable MONTO NUMERIC(18,2);
declare variable TIPOCUEN CHAR(1);
declare variable NIT VARCHAR(20);
declare variable PROY VARCHAR(4);
declare variable CENTRO VARCHAR(4);
declare variable PORC NUMERIC(5,2);
declare variable DEBITO NUMERIC(18,2);
declare variable CREDITO NUMERIC(18,2);
declare variable NUMITEMS INTEGER;
declare variable ARTICULO VARCHAR(15);
declare variable IMPINC CHAR(1);
declare variable IMPTOS NUMERIC(18, 2);
declare variable SUMA NUMERIC(18,2);
declare variable PORCIVA NUMERIC(9,2);
declare variable TCTAPROV VARCHAR(20);
declare variable TCTARTFTE VARCHAR(20);
declare variable TCTARTIVA VARCHAR(20);
declare variable TCTARTICA VARCHAR(20);
declare variable CUENTAADIC VARCHAR(20);
declare variable BASEADIC VARCHAR(20);
declare variable PORCADIC NUMERIC(5,2);
declare variable VALORADIC NUMERIC(18,2);
declare variable DBADIC CHAR(1);
declare variable FOMENTO CHAR(2);
declare variable ANULADO CHAR(1);
declare variable CENT CHAR(1);
declare variable ERRORC INTEGER;
DECLARE VARIABLE MENORV CHAR(2);
DECLARE VARIABLE MERCANCIA NUMERIC(18,2);
declare variable FACTOR DOUBLE PRECISION;
declare variable DIG INTEGER;
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_CTAINVEN, INCO_CTAIVA, INCO_CTACONSUMO, INCO_CTADTO, INCO_CTAADIC, INCO_CTAEXTRA, INCO_CTACXP, INCO_CTARTFTE, INCO_CTARTIVA, INCO_CTARTICA, INCO_CONFIRMAR, INCO_CENTRO
    FROM INTERFAZ_COMPRAS
    WHERE INCO_ID = :IDINTER
    INTO :EXISTE, :TIPOCOMP, :PREFCONT, :INVEN, :IVA, :CONSUMO, :CXP, :RTFTE, :RTIVA, :RTICA, :CTAINVEN, :CTAIVA, :CTACONSUMO, :CTADTO, :CTAADIC, :CTAEXTRA, :CTACXP, :CTARTFTE, :CTARTIVA, :CTARTICA, :VER, :CENT;
if (EXISTE = 'S') then
   BEGIN
    /* BORRE 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, PROV_CTARTFTE, PROV_CTARTIVA, PROV_CTARTICA, PROV_CTAPAGAR, DVCO_ANULADO
        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, :TCTARTFTE, TCTARTIVA, TCTARTICA, TCTAPROV, ANULADO;
   if (ANULADO = 'N') then
    BEGIN
    NUMERO = PREFIJO || NUM;
    VRSUBT = VRTOTAL - VREXTRA - VRIVA; /* BASE DE RETEFTE Y RETEICA */
    IF (CENT = 'B') THEN
        SELECT BODE_CENTRO, BODE_PROY FROM BODEGA B, DEVOLUCIONES_COMPRAS F
            WHERE B.BODE_COD = F.BODE_COD AND F.DVCO_ID = :IDDOC INTO :CENTRO, :PROY;
    ELSE
        SELECT PREF_CENTRO,PREF_PROY FROM PREFIJOS P, DEVOLUCIONES_COMPRAS F
            WHERE P.PREF_PRE = F.PREF_PRE AND F.DVCO_ID = :IDDOC AND P.TIDO_COD = 24 INTO :CENTRO, :PROY;
    /* CONVIERTA LA FECHA A CADENA */
    EXECUTE PROCEDURE FECHA_A_CONTA(:FECAUX) returning_values (:FECHA);
    EXECUTE PROCEDURE LEE_CONFIGURACION('COMPRAS', 'FACTURAS', 'USAR IMPOCONSUMO COMO PORCENTAJE DE FOMENTO') RETURNING_VALUES (FOMENTO);
    EXECUTE PROCEDURE lee_configuracion('COMPRAS','FACTURAS','DESCUENTO Y VALOR ADICIONAL DEL DOCUMENTO COMO MENOR VALOR DEL COSTO') returning_values (:MENORV);
    SELECT CAST(CONF_VALOR AS INTEGER) FROM CONFIGURACION WHERE CONF_MODULO = 'COMPRAS' AND CONF_CATEGORIA = 'GENERAL' AND CONF_PROPIEDAD = 'REDONDEO AL MULTIPLO DE DIEZ EN TOTALES' INTO :DIG;
    VRSUBT = VRTOTAL - VREXTRA - VRIVA;
    MERCANCIA = VRSUBT - VRADIC + VRDTO;
    SELECT SUM(DVCD_consumo) from devoluciones_compras_det where dvco_id = :IDDOC into :valoradic;
    if (MENORV = 'SI') then
        if (MERCANCIA <> 0) then
            FACTOR = (CAST(VRSUBT AS DOUBLE PRECISION) - VALORADIC) / (CAST(MERCANCIA AS DOUBLE PRECISION) - VALORADIC);
        ELSE
            FACTOR = 1;
    ELSE
        FACTOR = 1;

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

    NUMITEMS = 0;
    SUMA = 0;
    ERROR = 0;
    /* CUENTAS DE INVENTARIO */
    if (INVEN = 'A') then
        BEGIN
        /* SUME LAS BASES DE LOS ARTICULOS DEL DOCUMENTO */
        FOR SELECT MAX(COAR_CTACOMP), SUM(cast(DVCD_CANT as double precision) * (DVCD_PRUNIT-DVCD_DTOMONTO)), SUM(DVCD_IVAMONTO), SUM(DVCD_CONSUMO)
            FROM ARTICULO A, CONTABIL_ARTICULO C, DEVOLUCIONES_COMPRAS_DET F
            WHERE F.DVCO_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD
            GROUP BY COAR_CTAINV
            INTO :CTAINVEN, :MONTO, :IMPTOS, :VALORADIC
            DO
            BEGIN
            if (IMPINC = 'S') then
                BEGIN
                MONTO = MONTO - IMPTOS;
                if (FOMENTO <> 'SI') then
                    MONTO = MONTO - VALORADIC;
                END
            /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
            EXECUTE PROCEDURE CUENTA_INTERFAZ(24, :IDDOC, :CTAINVEN, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            /* DEPENDE DEL TIPO DE CUENTA */
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, REGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT F.ARTI_COD, (cast(DVCD_CANT as double precision) * (DVCD_PRUNIT-DVCD_DTOMONTO)), DVCD_IVAMONTO, DVCD_CONSUMO
                    FROM ARTICULO A, CONTABIL_ARTICULO C, DEVOLUCIONES_COMPRAS_DET F
                    WHERE F.DVCO_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTAINV = :CUENTA
                    INTO :ARTICULO, :MONTO, :IMPTOS, :VALORADIC
                DO
                    BEGIN
                    if (IMPINC = 'S') then
                        BEGIN
                        MONTO = MONTO - IMPTOS;
                        if (FOMENTO <> 'SI') then
                            MONTO = MONTO - VALORADIC;
                        END
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                    NUMITEMS = NUMITEMS + 1;
                    SUMA = SUMA - MONTO;
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                /* INSERTE EL REGISTRO DE LA BASE */
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 24);
                NUMITEMS = NUMITEMS + 1;
                SUMA = SUMA - MONTO;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                /* INSERTE EL REGISTRO DE LA BASE */
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NUMITEMS = NUMITEMS + 1;
                SUMA = SUMA - MONTO;
                END
            END /* FOR */
        END /* INVENTARIO X ARTICULO */

    if (INVEN = 'K') then
        BEGIN
        /* SUME LAS BASES DE LOS ARTICULOS DEL DOCUMENTO */
        SELECT SUM(cast(DVCD_CANT as double precision) * (DVCD_PRUNIT-DVCD_DTOMONTO)), SUM(DVCD_IVAMONTO), SUM(DVCD_CONSUMO)
            FROM DEVOLUCIONES_COMPRAS_DET WHERE DVCO_ID = :IDDOC
            INTO :MONTO, :IMPTOS, :VALORADIC;
        if (IMPINC = 'S') then
            BEGIN
            MONTO = MONTO - IMPTOS;
            if (FOMENTO <> 'SI') then
                MONTO = MONTO - VALORADIC;
            END
        /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
        EXECUTE PROCEDURE CUENTA_INTERFAZ(24, :IDDOC, :CTAINVEN, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        /* DEPENDE DEL TIPO DE CUENTA */
        if (TIPOCUEN = 'I') then
            BEGIN
            /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
            FOR SELECT ARTI_COD, (cast(DVCD_CANT as double precision) * (DVCD_PRUNIT-DVCD_DTOMONTO)), DVCD_IVAMONTO, DVCD_CONSUMO
                FROM DEVOLUCIONES_COMPRAS_DET
                WHERE DVCO_ID = :IDDOC
                INTO :ARTICULO, :MONTO, :IMPTOS, :VALORADIC
                DO
                BEGIN
                if (IMPINC = 'S') then
                    BEGIN
                    MONTO = MONTO - IMPTOS;
                    if (FOMENTO <> 'SI') then
                        MONTO = MONTO - VALORADIC;
                    END
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NUMITEMS, :CTAINVEN, :CONCEPTO, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                NUMITEMS = NUMITEMS + 1;
                SUMA = SUMA - MONTO;
                END
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NUMITEMS, :CTAINVEN, :CONCEPTO, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 24);
            NUMITEMS = NUMITEMS + 1;
            SUMA = SUMA - MONTO;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NUMITEMS, :CTAINVEN, :CONCEPTO, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NUMITEMS = NUMITEMS + 1;
            SUMA = SUMA - MONTO;
            END
        END /* INVEN = K */
        
    /* EL IVA */
    if (IVA = 'A') then
        BEGIN
        /* SUME LAS BASES DE LOS ARTICULOS DEL DOCUMENTO */
        FOR SELECT MAX(COAR_CTAIVAC), SUM(DVCD_IVAMONTO), SUM(cast(DVCD_CANT as double precision) * (DVCD_PRUNIT-DVCD_DTOMONTO)), SUM(DVCD_CONSUMO)
            FROM ARTICULO A, CONTABIL_ARTICULO C, DEVOLUCIONES_COMPRAS_DET F
            WHERE F.DVCO_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND DVCD_IVAMONTO <> 0
            GROUP BY COAR_CTAIVAC
            INTO :CTAIVA, :IMPTOS, :MONTO, :VALORADIC
        DO
          if (IMPTOS <> 0) then
            BEGIN
            if (IMPINC = 'S') then
                BEGIN
                MONTO = MONTO - IMPTOS;
                if (FOMENTO <> 'SI') then
                    MONTO = MONTO - VALORADIC;
                END

            /* TRAIGA LAS CARCATERISTICAS DE LA CUENTA */
            EXECUTE PROCEDURE CUENTA_INTERFAZ(24, :IDDOC, :CTAIVA, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            /* DEPENDE DEL TIPO DE CUENTA */
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT F.ARTI_COD, DVCD_IVAMONTO, (cast(DVCD_CANT as double precision) * (DVCD_PRUNIT-DVCD_DTOMONTO)), TAIV_PORC, DVCD_CONSUMO
                    FROM ARTICULO A, CONTABIL_ARTICULO C, DEVOLUCIONES_COMPRAS_DET F, TARIFA_IVA T
                    WHERE F.DVCO_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTAIVAV = :CUENTA AND A.TAIV_COD = T.TAIV_COD
                    INTO :ARTICULO, :IMPTOS, :MONTO, :PORCIVA, :VALORADIC
                DO
                    BEGIN
                    if (IMPINC = 'S') then
                        BEGIN
                        MONTO = MONTO - IMPTOS;
                        if (FOMENTO <> 'SI') then
                            MONTO = MONTO - VALORADIC;
                        END
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :IMPTOS, :MONTO, :PORCIVA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                    NUMITEMS = NUMITEMS + 1;
                    SUMA = SUMA - IMPTOS;
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :IMPTOS, :MONTO, :PORCIVA, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 24);
                NUMITEMS = NUMITEMS + 1;
                SUMA = SUMA - IMPTOS;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :IMPTOS, :MONTO, :PORCIVA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NUMITEMS = NUMITEMS + 1;
                SUMA = SUMA - IMPTOS;
                END
            END /* FOR */
        END /* IVA X ARTICULO */
        
    if (IVA = 'K') then /* IVA EN CTA CONSTANTE */
        BEGIN
        SELECT SUM(DVCD_IVAMONTO), SUM(cast(DVCD_CANT as double precision) * (DVCD_PRUNIT-DVCD_DTOMONTO)), SUM(DVCD_CONSUMO)
            FROM DEVOLUCIONES_COMPRAS_DET F
            WHERE F.DVCO_ID = :IDDOC  AND DVCD_IVAMONTO <> 0
            INTO :IMPTOS, :MONTO, :VALORADIC;
            
        if (IMPTOS <> 0) then
            BEGIN
            if (IMPINC = 'S') then
                BEGIN
                MONTO = MONTO - IMPTOS;
                if (FOMENTO <> 'SI') then
                    MONTO = MONTO - VALORADIC;
                END
            /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
            EXECUTE PROCEDURE CUENTA_INTERFAZ(24, :IDDOC, :CTAIVA, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            /* DEPENDE DEL TIPO DE CUENTA */
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT F.ARTI_COD, (cast(DVCD_CANT as double precision) * (DVCD_PRUNIT-DVCD_DTOMONTO)), DVCD_IVAMONTO, TAIV_PORC, DVCD_CONSUMO
                    FROM ARTICULO A, DEVOLUCIONES_COMPRAS_DET F, TARIFA_IVA T
                    WHERE F.DVCO_ID = :IDDOC AND A.TAIV_COD = T.TAIV_COD
                    INTO :ARTICULO, :MONTO, :IMPTOS, :PORCIVA, :VALORADIC
                    DO
                    BEGIN
                    if (IMPTOS <> 0) then
                        BEGIN
                        if (IMPINC = 'S') then
                            BEGIN
                            MONTO = MONTO - IMPTOS;
                            if (FOMENTO <> 'SI') then
                                MONTO = MONTO - VALORADIC;
                            END
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CTAIVA, :CONCEPTO, '', 0, :IMPTOS, :MONTO, :PORCIVA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                        NUMITEMS = NUMITEMS + 1;
                        SUMA = SUMA - IMPTOS;
                        END
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                /* INSERTE EL REGISTRO DE LA BASE */
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NUMITEMS, :CTAIVA, :CONCEPTO, '', 0, :IMPTOS, :MONTO, :PORCIVA, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 24);
                NUMITEMS = NUMITEMS + 1;
                SUMA = SUMA - IMPTOS;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                /* INSERTE EL REGISTRO DE LA BASE */
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NUMITEMS, :CTAIVA, :CONCEPTO, '', 0, :IMPTOS, :MONTO, :PORCIVA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NUMITEMS = NUMITEMS + 1;
                SUMA = SUMA - IMPTOS;
                END
            END /* <> 0 */
        END /* IVA EN CTA CONSTANTE */
        
    /* EL IMPOCONSUMO */
    if (CONSUMO = 'A') then
        BEGIN
        /* SUME LAS BASES DE LOS ARTICULOS DEL DOCUMENTO */
        FOR SELECT MAX(COAR_CTACONS), SUM(DVCD_CONSUMO)
            FROM ARTICULO A, CONTABIL_ARTICULO C, DEVOLUCIONES_COMPRAS_DET F
            WHERE F.DVCO_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD
            GROUP BY COAR_CTACONS
            INTO :CTACONSUMO, :IMPTOS
        DO
            BEGIN
            if (IMPTOS <> 0) then
                BEGIN
                /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
                EXECUTE PROCEDURE CUENTA_INTERFAZ(24, :IDDOC, :CTACONSUMO, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (FOMENTO <> 'SI') then
                    BEGIN
                    /* DEPENDE DEL TIPO DE CUENTA */
                    if (TIPOCUEN = 'I') then
                        BEGIN
                        /* ES UNA CUENTA DE INVENTARIO, REGISTRE UNO A UNO LOS ARTICULOS */
                        FOR SELECT F.ARTI_COD, DVCD_CONSUMO
                            FROM ARTICULO A, CONTABIL_ARTICULO C, DEVOLUCIONES_COMPRAS_DET F
                            WHERE F.DVCO_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTACONS = :CUENTA
                            INTO :ARTICULO, :IMPTOS
                            DO
                            BEGIN
                            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                            NUMITEMS = NUMITEMS + 1;
                            SUMA = SUMA - IMPTOS;
                            END
                        END
                    if (TIPOCUEN = 'C') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 24);
                        NUMITEMS = NUMITEMS + 1;
                        SUMA = SUMA - IMPTOS;
                        END
                    if (TIPOCUEN = 'N') then
                        BEGIN
                        /* INSERTE EL REGISTRO DE LA BASE */
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NUMITEMS = NUMITEMS + 1;
                        SUMA = SUMA - IMPTOS;
                        END
                    END
                ELSE
                    BEGIN
                    if (TIPOCUEN = 'I') then
                        BEGIN
                        /* ES UNA CUENTA DE INVENTARIO, REGISTRE UNO A UNO LOS ARTICULOS */
                        FOR SELECT F.ARTI_COD, DVCD_CONSUMO
                            FROM ARTICULO A, CONTABIL_ARTICULO C, DEVOLUCIONES_COMPRAS_DET F
                            WHERE F.DVCO_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTACONS = :CUENTA
                            INTO :ARTICULO, :IMPTOS
                            DO
                            BEGIN
                            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                VALUES (:IDC, :NUMITEMS, :CTACONSUMO, :CONCEPTO, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                            NUMITEMS = NUMITEMS + 1;
                            SUMA = SUMA + IMPTOS;
                            END
                        END
                    if (TIPOCUEN = 'C') then
                        BEGIN
                        /* INSERTE EL REGISTRO DE LA BASE */
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CTACONSUMO, :CONCEPTO, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 24);
                        NUMITEMS = NUMITEMS + 1;
                        SUMA = SUMA + IMPTOS;
                        END
                    if (TIPOCUEN = 'N') then
                        BEGIN
                        /* INSERTE EL REGISTRO DE LA BASE */
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CTACONSUMO, :CONCEPTO, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NUMITEMS = NUMITEMS + 1;
                        SUMA = SUMA + IMPTOS;
                        END
                    END
                END
            END /* FOR */
        END /* CONSUMO X ARTICULO */
        
    if (CONSUMO = 'K') then /* CONSUMO EN CTA CONSTANTE */
        BEGIN
        SELECT SUM(DVCD_CONSUMO)
            FROM DEVOLUCIONES_COMPRAS_DET F
            WHERE F.DVCO_ID = :IDDOC 
            INTO :IMPTOS;
            
        if (IMPTOS <> 0) then
            BEGIN
            /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
            EXECUTE PROCEDURE CUENTA_INTERFAZ(24, :IDDOC, :CTACONSUMO, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (FOMENTO <> 'SI') then
                BEGIN
                /* DEPENDE DEL TIPO DE CUENTA */
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT F.ARTI_COD, DVCD_CONSUMO
                        FROM ARTICULO A, DEVOLUCIONES_COMPRAS_DET F
                        WHERE F.DVCO_ID = :IDDOC
                        INTO :ARTICULO, :IMPTOS
                        DO
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CTACONSUMO, :CONCEPTO, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                        NUMITEMS = NUMITEMS + 1;
                        SUMA = SUMA - IMPTOS;
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    /* INSERTE EL REGISTRO DE LA BASE */
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NUMITEMS, :CTACONSUMO, :CONCEPTO, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 24);
                    NUMITEMS = NUMITEMS + 1;
                    SUMA = SUMA - IMPTOS;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    /* INSERTE EL REGISTRO DE LA BASE */
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NUMITEMS, :CTACONSUMO, :CONCEPTO, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NUMITEMS = NUMITEMS + 1;
                    SUMA = SUMA - IMPTOS;
                    END
                END
            ELSE
                BEGIN
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT F.ARTI_COD, DVCD_CONSUMO
                        FROM ARTICULO A, DEVOLUCIONES_COMPRAS_DET F
                        WHERE F.DVCO_ID = :IDDOC
                        INTO :ARTICULO, :IMPTOS
                        DO
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CTACONSUMO, :CONCEPTO, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                        NUMITEMS = NUMITEMS + 1;
                        SUMA = SUMA + IMPTOS;
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    /* INSERTE EL REGISTRO DE LA BASE */
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NUMITEMS, :CTACONSUMO, :CONCEPTO, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 24);
                    NUMITEMS = NUMITEMS + 1;
                    SUMA = SUMA + IMPTOS;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    /* INSERTE EL REGISTRO DE LA BASE */
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NUMITEMS, :CTACONSUMO, :CONCEPTO, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NUMITEMS = NUMITEMS + 1;
                    SUMA = SUMA + IMPTOS;
                    END
                END
            END
        END /* CONSUMO EN CTA CONSTANTE */
        
    /* DESCUENTO */
    if ((CTADTO IS NOT NULL) AND
        (CTADTO <> '') AND
        (VRDTO <> 0)) THEN
        BEGIN
        /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
        EXECUTE PROCEDURE CUENTA_INTERFAZ(24, :IDDOC, :CTADTO, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :VRDTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 24);
            NUMITEMS = NUMITEMS + 1;
            SUMA = SUMA + VRDTO;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            /* INSERTE EL REGISTRO DE LA BASE */
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :VRDTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NUMITEMS = NUMITEMS + 1;
            SUMA = SUMA + VRDTO;
            END
        END /* DESCUENTO */
        
    /* VALOR ADIC */
    if ((CTAADIC IS NOT NULL) AND
        (CTAADIC <> '') AND
        (VRADIC <> 0)) THEN
        BEGIN
        /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
        EXECUTE PROCEDURE CUENTA_INTERFAZ(24, :IDDOC, :CTAADIC, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :VRADIC, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 24);
            NUMITEMS = NUMITEMS + 1;
            SUMA = SUMA - VRADIC;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            /* INSERTE EL REGISTRO DE LA BASE */
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :VRADIC, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NUMITEMS = NUMITEMS + 1;
            SUMA = SUMA - VRADIC;
            END
        END /* VR. ADIC */
        
    /* VALOR EXTRA */
    if ((CTAEXTRA IS NOT NULL) AND
        (CTAEXTRA <> '') AND
        (VREXTRA <> 0)) THEN
        BEGIN
        /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
        EXECUTE PROCEDURE CUENTA_INTERFAZ(24, :IDDOC, :CTAEXTRA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :VREXTRA, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 24);
            NUMITEMS = NUMITEMS + 1;
            SUMA = SUMA + VREXTRA;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            /* INSERTE EL REGISTRO DE LA BASE */
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :VREXTRA, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NUMITEMS = NUMITEMS + 1;
            SUMA = SUMA + VREXTRA;
            END
        END /* VR. EXTRA */
        
    if (fomento <> 'SI') then
        BEGIN
        /* DESCUENTE EL IMPOCONSUMO */
        SELECT SUM(DVCD_CONSUMO)
            FROM devoluciones_compras_det WHERE DVCO_ID = :IDDOC INTO :IMPTOS;
        if (IMPTOS IS NULL) then
            IMPTOS = 0;
        vrsubt = vrsubt - IMPTOS;
        END
    /* RETENCION FUENTE */
    if ((RTFTE = 'P') or (RTFTE = 'K')) then
      if (VRRTFTE <> 0) then
        BEGIN
        if (RTFTE = 'P') then
            CTARTFTE = TCTARTFTE;
            
        /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
        EXECUTE PROCEDURE CUENTA_INTERFAZ(24, :IDDOC, :CTARTFTE, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :VRRTFTE, 0, :VRSUBT, :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 24);
            NUMITEMS = NUMITEMS + 1;
            SUMA = SUMA + VRRTFTE;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            /* INSERTE EL REGISTRO DE LA BASE */
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :VRRTFTE, 0, :VRSUBT, :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NUMITEMS = NUMITEMS + 1;
            SUMA = SUMA + VRRTFTE;
            END
        END /* RTFTE */
    if (RTFTE = 'A') then
        BEGIN
        FOR SELECT MAX(COAR_CTARTFTE), MAX(COAR_RTFTE), MIN(COAR_RTBASE), SUM(DVCD_TOTAL-DVCD_IVAMONTO-DVCD_CONSUMO), SUM((DVCD_TOTAL-DVCD_IVAMONTO-DVCD_CONSUMO)*COAR_RTFTE)
            FROM CONTABIL_ARTICULO C, DEVOLUCIONES_COMPRAS_DET F
            WHERE F.dvco_id = :IDDOC AND F.ARTI_COD = C.ARTI_COD
            GROUP BY COAR_CTARTFTE
            INTO :CTARTFTE, :PRTFTE, :baseadic, :MONTO, :VRRTFTE
            DO
            BEGIN
            MONTO = MONTO * FACTOR;
            if (MONTO >= BASEADIC) then
                BEGIN
                VRRTFTE = VRRTFTE * FACTOR / 100;
                execute procedure redondee(VRRTFTE, DIG) returning_values (VRRTFTE);
                execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                if (VRRTFTE <> 0) then
                    BEGIN
                    /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
                    EXECUTE PROCEDURE CUENTA_INTERFAZ(24, :IDDOC, :CTARTFTE, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
                    if (ERRORC <> 0) then
                        ERROR = ERROR + 1;
                    if (TIPOCUEN = 'C') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :VRRTFTE, 0, :VRSUBT, :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 24);
                        NUMITEMS = NUMITEMS + 1;
                        SUMA = SUMA + VRRTFTE;
                        END
                    if (TIPOCUEN = 'N') then
                        BEGIN
                        /* INSERTE EL REGISTRO DE LA BASE */
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :VRRTFTE, 0, :VRSUBT, :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NUMITEMS = NUMITEMS + 1;
                        SUMA = SUMA + VRRTFTE;
                        END
                    END
                END
            END
        END /* RTFTE */
    /* RETENCION IVA */
    if ((RTIVA = 'P') or (RTIVA = 'K')) then
      if (VRRTIVA <> 0) then
        BEGIN
        if (RTIVA = 'P') then
            CTARTIVA = TCTARTIVA;
            
        /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
        EXECUTE PROCEDURE CUENTA_INTERFAZ(24, :IDDOC, :CTARTIVA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :VRRTIVA, 0, :VRIVA, :PORC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 24);
            NUMITEMS = NUMITEMS + 1;
            SUMA = SUMA + VRRTIVA;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            /* INSERTE EL REGISTRO DE LA BASE */
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :VRRTIVA, 0, :VRIVA, :PORC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NUMITEMS = NUMITEMS + 1;
            SUMA = SUMA + VRRTIVA;
            END
        END /* RTIVA */
        
    /* RETENCION DE ICA */
    if ((RTICA = 'P') or (RTICA = 'K')) then
      if (VRRTICA <> 0) then
        BEGIN
        if (RTICA = 'P') then
            CTARTICA = TCTARTICA;
            
        /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
        EXECUTE PROCEDURE CUENTA_INTERFAZ(24, :IDDOC, :CTARTICA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :VRRTICA, 0, :VRSUBT, :PRTICA, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 24);
            NUMITEMS = NUMITEMS + 1;
            SUMA = SUMA + VRRTICA;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            /* INSERTE EL REGISTRO DE LA BASE */
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :VRRTICA, 0, :VRSUBT, :PRTICA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NUMITEMS = NUMITEMS + 1;
            SUMA = SUMA + VRRTICA;
            END
        END /* RTICA */
    /* recorra las cuentas adicionales */
    FOR SELECT INCC_CUENTA, INCC_BASE, INCC_PORC, INCC_VALOR, INCC_DB
        FROM INTERFAZ_COMPRAS_CTAS
        WHERE INCO_ID = :IDINTER
        INTO :CUENTAADIC, :BASEADIC, :PORCADIC, :VALORADIC, :DBADIC
        DO
        BEGIN
        if (VALORADIC <> 0) then
            MONTO = VALORADIC;
        ELSE
            BEGIN
            if (:BASEADIC = 'SUBTOTAL') then
                VALORADIC = VRTOTAL - VREXTRA - VRIVA - VRADIC + VRDTO;
            if (:BASEADIC = 'DESCUENTO') then
                VALORADIC = VRDTO;
            if (:BASEADIC = 'IVA') then
                VALORADIC = VRIVA;
            if (:BASEADIC = 'CONSUMO') then
                SELECT SUM(DVCD_CONSUMO)
                    FROM DEVOLUCIONES_COMPRAS_DET F
                    WHERE F.DVCO_ID = :IDDOC 
                    INTO :VALORADIC;
            if (:BASEADIC = 'ADICIONAL') then
                VALORADIC = VRADIC;
            if (:BASEADIC = 'EXTRA') then
                VALORADIC = VREXTRA;
            if (:BASEADIC = 'TOTAL') then
                VALORADIC = VRTOTAL;
            MONTO = VALORADIC * PORCADIC;
            END
        if (MONTO <> 0) then
            BEGIN
            /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
            EXECUTE PROCEDURE CUENTA_INTERFAZ(24, :IDDOC, :CUENTAADIC, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                if (DBADIC = 'S') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NUMITEMS, :CUENTAADIC, :CONCEPTO, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 24);
                    SUMA = SUMA + MONTO;
                    END
                ELSE
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NUMITEMS, :CUENTAADIC, :CONCEPTO, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 24);
                    SUMA = SUMA - MONTO;
                    END
                NUMITEMS = NUMITEMS + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                if (DBADIC = 'S') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NUMITEMS, :CUENTAADIC, :CONCEPTO, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    SUMA = SUMA + MONTO;
                    END
                ELSE
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NUMITEMS, :CUENTAADIC, :CONCEPTO, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    SUMA = SUMA - MONTO;
                    END
                NUMITEMS = NUMITEMS + 1;
                END
            NUMITEMS = NUMITEMS + 1;
            END
        END
    /* CIERRE EL COMPROBANTE CONTRA LA CUENTA DEL TERCERO O LA CONSTANTE */
    if ((SUMA <> 0) and ((CXP = 'P') or (CXP = 'K'))) then
        BEGIN
        if (SUMA < 0) then
            BEGIN
            DEBITO = SUMA * -1;
            CREDITO = 0;
            END
        ELSE
            BEGIN
            DEBITO = 0;
            CREDITO = SUMA;
            END
        if (CXP = 'P') then
            CTACXP = TCTAPROV;

        /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
        EXECUTE PROCEDURE CUENTA_INTERFAZ(24, :IDDOC, :CTACXP, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :DEBITO, :CREDITO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 24);
        if (TIPOCUEN = 'N') then
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :DEBITO, :CREDITO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
        END /* SUMA EN CXP */
     end
    if (ERROR > 0) then
        VER = 'S';
    SUSPEND;
    END /* EXISTE */
ELSE
    BEGIN
    EXECUTE PROCEDURE ERROR (24, :IDDOC, :PREFIJO, 1);
    ERROR = ERROR + 1;
    VER = 'S';
    SUSPEND;
    END
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE DEVCOMPRA_SIN_CONTABILIDAD(
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    ID INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    ESTADO VARCHAR(20),
    IDI INTEGER,
    IDC INTEGER)
AS
DECLARE VARIABLE VER CHAR(2);
declare variable FECICNT VARCHAR(10);
declare variable FECFCNT VARCHAR(10);
declare variable ERROR INTEGER;
declare variable idref INTEGER;
BEGIN /*$$IBE$$ 
EXECUTE PROCEDURE fecha_a_conta(FECINI) returning_values (FECICNT);
EXECUTE PROCEDURE fecha_a_conta(FECFIN) returning_values (FECFCNT);
FOR SELECT DVCO_ID, PREF_PRE, DVCO_NUMERO FROM DEVOLUCIONES_COMPRAS WHERE DVCO_ANULADO = 'N' AND
    DVCO_FECHA >= :FECINI AND DVCO_FECHA <= :FECFIN
    INTO :ID, :PREF, :NUMERO
DO
  BEGIN
  idref = null;
  SELECT ENCO_IDREF FROM COMPROBANTE_ENCABEZADO WHERE ENCO_TIPOREF = 24 AND ENCO_FECHA >= :FECICNT AND ENCO_FECHA <= :FECFCNT and ENCO_IDREF = :id into :idref;
  if (idref IS NULL) then
  begin
   ESTADO = 'PROCESANDO';
   SUSPEND;
   SELECT MAX(INCO_ID) FROM INTERFAZ_COMPRAS WHERE PREF_PRE = :PREF AND TIDO_COD = 24 INTO :IDI;
   EXECUTE PROCEDURE CONTABIL_DEVOLCOMP (:ID, :IDI) RETURNING_VALUES (:ERROR, :VER, :IDC);
   if (ERROR = 0) then
    BEGIN
      EXECUTE PROCEDURE CONTABILIZA_PENDIENTE (:IDC);
      ESTADO = 'OK';
    end
   ELSE
    ESTADO = 'ERROR';
   suspend;
  End
  END
 $$IBE$$*/ SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE DEVCOMPRA_SIN_CONTABILIDAD(
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    ID INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    ESTADO VARCHAR(20),
    IDI INTEGER,
    IDC INTEGER)
AS
DECLARE VARIABLE VER CHAR(2);
declare variable FECICNT VARCHAR(10);
declare variable FECFCNT VARCHAR(10);
declare variable ERROR INTEGER;
declare variable idref INTEGER;
BEGIN
EXECUTE PROCEDURE fecha_a_conta(FECINI) returning_values (FECICNT);
EXECUTE PROCEDURE fecha_a_conta(FECFIN) returning_values (FECFCNT);
FOR SELECT DVCO_ID, PREF_PRE, DVCO_NUMERO FROM DEVOLUCIONES_COMPRAS WHERE DVCO_ANULADO = 'N' AND
    DVCO_FECHA >= :FECINI AND DVCO_FECHA <= :FECFIN
    INTO :ID, :PREF, :NUMERO
DO
  BEGIN
  idref = null;
  SELECT ENCO_IDREF FROM COMPROBANTE_ENCABEZADO WHERE ENCO_TIPOREF = 24 AND ENCO_FECHA >= :FECICNT AND ENCO_FECHA <= :FECFCNT and ENCO_IDREF = :id into :idref;
  if (idref IS NULL) then
  begin
   ESTADO = 'PROCESANDO';
   SUSPEND;
   SELECT MAX(INCO_ID) FROM INTERFAZ_COMPRAS WHERE PREF_PRE = :PREF AND TIDO_COD = 24 INTO :IDI;
   EXECUTE PROCEDURE CONTABIL_DEVOLCOMP (:ID, :IDI) RETURNING_VALUES (:ERROR, :VER, :IDC);
   if (ERROR = 0) then
    BEGIN
      EXECUTE PROCEDURE CONTABILIZA_PENDIENTE (:IDC);
      ESTADO = 'OK';
    end
   ELSE
    ESTADO = 'ERROR';
   suspend;
  End
  END
END

^

SET TERM ; ^


/* 20081202B: VALIDE EN FACTURAS Y REMISIONES EL DOBLE CRUCE YA QUE A VECES VA 1o FACTURA Y AVECES 1o REMISION */
SET TERM ^ ;

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

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

SET TERM ; ^



/* 20081202C : CONCILIA TODAS LAS CUENTAS YA SEA POR TARIFA O POR GRUPO */

SET TERM ^ ;

CREATE OR ALTER PROCEDURE CONCILIA_VENTAS(
    FECINI DATE,
    FECFIN DATE,
    SOLODIF CHAR(1),
    NULO1 CHAR(1),
    NULO2 CHAR(2))
RETURNS (
    IDF INTEGER,
    IDC INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    COMPROBA VARCHAR(3),
    NUMCNT VARCHAR(6),
    CTAVENTAS VARCHAR(20),
    MONTO NUMERIC(18,2),
    MONTOC NUMERIC(18,2))
AS
declare variable dig integer;
declare variable mercancia numeric(18,2);
declare variable fomento varchar(2);
declare variable vrconsumo numeric(18,2);
declare variable factor double precision;
declare variable vrdto numeric(18,2);
declare variable vradic numeric(18,2);
declare variable vrsubt numeric(18,2);
declare variable vriva numeric(18,2);
declare variable vrtotal numeric(18,2);
declare variable vrextra numeric(18,2);
declare variable ventas char(1);
declare variable ctadto varchar(20);
begin
SELECT CAST(CONF_VALOR AS INTEGER) FROM CONFIGURACION WHERE CONF_MODULO = 'FACTURACION' AND
    CONF_CATEGORIA = 'GENERAL' AND CONF_PROPIEDAD = 'REDONDEO AL MULTIPLO DE DIEZ EN TOTALES' INTO :DIG;
EXECUTE PROCEDURE LEE_CONFIGURACION('COMPRAS', 'FACTURAS', 'USAR IMPOCONSUMO COMO PORCENTAJE DE FOMENTO') returning_values (FOMENTO);

for select fact_id, pref_pre, fact_numero, fact_fecha, FACT_DTOMONTO, FACT_ADICIONAL, FACT_IVAMONTO, FACT_EXTRA, FACT_TOTAL
    from facturas f
    where fact_fecha >= :fecini and fact_fecha <= :fecfin and fact_anulado = 'N'
    into :idf, :pref, :numero, :fecha, :VRDTO, :VRADIC, :VRIVA, :VREXTRA, :VRTOTAL
    do
    begin
    idc = 0;
    montoc = 0;
    numcnt = '';
    select enco_consec, TICO_COD, ENCO_NUMERO
    from comprobante_encabezado where enco_idref = :idf and enco_tiporef = 31
    into :idc, :comproba, :numcnt;

    SELECT SUM (FADE_CONSUMO) FROM FACTURAS_DETALLE WHERE FACT_ID = :idf INTO MERCANCIA;
    VRSUBT = VRTOTAL - VREXTRA - VRIVA - MERCANCIA; /* BASE DE RETEFTE Y RETEICA */
    MERCANCIA = VRSUBT - VRADIC + VRDTO;
    if (MERCANCIA <> 0) then
        FACTOR = CAST(VRSUBT AS DOUBLE PRECISION) / CAST(MERCANCIA AS DOUBLE PRECISION);
    ELSE
        FACTOR = 1;
    SELECT MAX(INVE_VENTAS), MAX(INVE_CTAVENTAS), MAX(INVE_CTADTO) FROM INTERFAZ_VENTAS WHERE TIDO_COD = 31 AND PREF_PRE = :pref
        INTO :VENTAS, :CTAVENTAS, :CTADTO;
    if (VENTAS = 'A') then
        BEGIN
        FOR SELECT MAX(COAR_CTAVNT), SUM(FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), SUM(FADE_CONSUMO)
            FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_DETALLE F
            WHERE F.FACT_ID = :idf AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD
            GROUP BY COAR_CTAVNT
            INTO :CTAVENTAS, :MONTO, :VRCONSUMO
            DO
            BEGIN
            if (FOMENTO = 'SI') then
                MONTO = MONTO + VRCONSUMO;
            if ((CTADTO IS NULL) OR (CTADTO = '')) then
                MONTO = MONTO * FACTOR;
            execute procedure redondee(MONTO, DIG) returning_values (MONTO);
            select SUM(code_credito - code_debito) from comprobante_detalle
                where enco_consec = :idc and cuen_cod = :ctaventas into MONTOC;
            if (montoc is null) then
                montoc = 0;
            if ((SOLODIF = 'N') or (MONTO <> MONTOC)) then
                SUSPEND;
            END
        END
    if (VENTAS = 'K') then
        BEGIN
        SELECT SUM(FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), SUM (FADE_CONSUMO)
            FROM FACTURAS_DETALLE F
            WHERE F.FACT_ID = :idf
            INTO :MONTO, :VRCONSUMO;
        if (FOMENTO = 'SI') then
            MONTO = MONTO + VRCONSUMO;
        if ((CTADTO IS NULL) OR (CTADTO = '')) then
            MONTO = MONTO * FACTOR;
        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
        select SUM(code_credito-code_debito) from comprobante_detalle
            where enco_consec = :idc and cuen_cod = :ctaventas into MONTOC;
        if (montoc is null) then
            montoc = 0;
        if ((SOLODIF = 'N') or (MONTO <> MONTOC)) then
            SUSPEND;
        END
    end
end
^

SET TERM ; ^



UPDATE PROCEDIMIENTOS_USUARIO
SET PRUS_PARAM1 = 'Sólo diferencias (S/N)',
    PRUS_PARAM2 = '',
    PRUS_PARAM3 = ''
WHERE (PRUS_COD = 1);
commit work;


/* 20081206 */
SET TERM ^ ;

CREATE OR ALTER PROCEDURE COMISIONES_COBRO(
    DESDE INTEGER,
    HASTA INTEGER,
    FECINI DATE,
    FECFIN DATE,
    DETALLE CHAR(1))
RETURNS (
    CODVEND INTEGER,
    NOMVEND VARCHAR(60),
    NIT VARCHAR(20),
    CLIENTE VARCHAR(60),
    NOMTIPO VARCHAR(8),
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(6),
    FECDOC DATE,
    PREFREC VARCHAR(4),
    NUMREC VARCHAR(6),
    FECREC DATE,
    DIAS INTEGER,
    ABONO NUMERIC(18,2),
    BASE NUMERIC(18,2),
    COMIMONTO NUMERIC(18,2),
    COMIPORC NUMERIC(9,2),
    ARTICULO VARCHAR(20),
    CODGRP VARCHAR(2),
    CANT NUMERIC(18,4),
    DTOFIN NUMERIC(18,2),
    VENCE DATE,
    RTFTE NUMERIC(18,2),
    RTIVA NUMERIC(18,2),
    RTICA NUMERIC(18,2))
AS
DECLARE VARIABLE TIPO INTEGER;
DECLARE VARIABLE ID INTEGER;
DECLARE VARIABLE IVAMONTO NUMERIC(18,2);
DECLARE VARIABLE TOTAL NUMERIC(18,2);
DECLARE VARIABLE SITOT CHAR(2);
DECLARE VARIABLE VENTA CHAR(2);
DECLARE VARIABLE COMIV NUMERIC(18,2);
DECLARE VARIABLE PORCV NUMERIC(18,2);
DECLARE VARIABLE CONSUMO NUMERIC(18,2);
declare variable ALFINAL CHAR(2);
declare variable SALDO NUMERIC(18,2);
declare variable COMISION VARCHAR(10);
declare variable porcaux NUMERIC(9,2);
declare variable BASEAUX DOUBLE PRECISION;
declare variable SUCURSAL VARCHAR(20);
BEGIN
EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION', 'VENDEDORES', 'COMISIONES EN VENTA INCLUYENDO IMPUESTOS') returning_values (:SITOT);
EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA','COMISIONES','COMISION POR COBRO PAGADERA SOLO EN EL COBRO TOTAL') returning_values (:ALFINAL);
execute procedure lee_configuracion('CARTERA','COMISIONES','COMISION POR COBRO COMO PORCENTAJE DE LA COMISION VENTA') returning_values (:venta);
EXECUTE PROCEDURE lee_configuracion('CARTERA', 'COMISIONES', 'LIQUIDAR COMISION COBRO CON COBRADOR DEL DOCUMENTO O DEL RECIBO') returning_values (:COMISION);
FOR SELECT RCDE_TIPODOC, RCDE_IDDOC, RCDE_PREFIJO, RCDE_NUMERO, R.TERC_NIT, TERC_NOM, RECA_FECHA, (RCDE_ABONO+RCDE_RTFTE+RCDE_RTIVA+RCDE_RTICA), PREF_PRE, RECA_NUMERO, COBR_COD, RCDE_DTOF, RCDE_RTFTE, RCDE_RTIVA, RCDE_RTICA
    FROM RECIBOS_CAJA R, RECIBOS_CAJA_DETALLE RD, TERCEROS T
    WHERE R.RECA_ID = RD.RECA_ID AND RECA_FECHA >= :FECINI AND RECA_FECHA <= :FECFIN AND R.TERC_NIT = T.TERC_NIT AND RECA_ANULADO = 'N'
    ORDER BY TERC_NIT, RECA_FECHA
    INTO :TIPO, :ID, :PREFIJO, :NUMERO, :NIT, :CLIENTE, :FECREC, :ABONO, :PREFREC, :NUMREC, :codvend, :DTOFIN, :rtfte, :RTIVA, :RTICA
    DO
    BEGIN
    SELECT TIDO_NOMCORTO FROM TIPO_DOCUMENTO WHERE TIDO_COD = :TIPO INTO :NOMTIPO;
    if (COMISION = 'DOCUMENTO') then
        SELECT MVCL_FECHA, COBR_COD, MVCL_VENCE FROM MOVIMIENTO_CLIENTES WHERE MVCL_TIPOREF = :TIPO AND MVCL_IDREF = :ID
            INTO :FECDOC, :codvend, :VENCE;
    else
        SELECT MVCL_FECHA, MVCL_VENCE FROM MOVIMIENTO_CLIENTES WHERE MVCL_TIPOREF = :TIPO AND MVCL_IDREF = :ID
            INTO :FECDOC, :VENCE;
    if (FECDOC IS NOT NULL) then
        DIAS = FECREC - FECDOC;
    ELSE
        DIAS = 999;
    if ((codvend >= :DESDE) AND (codvend <= :hasta)) then
        BEGIN
        /* TRAIGA EL PORCENTAJE DE ACUERDO A LOS DIAS */
        COMIPORC = 0;
        SELECT CMCB_PORC FROM COMISION_COBRO WHERE CMCB_DIASINI <= :dias AND CMCB_DIASFIN >= :DIAS AND COBR_COD = :CODVEND INTO :COMIPORC;
        if (COMIPORC IS NULL) THEN
            COMIPORC = 0;
        if (VENTA = 'NO') then
            BEGIN
            if (TIPO = 31) then
                BEGIN
                if (DETALLE = 'N') then
                    SELECT MAX(FACT_TOTAL), MAX(FACT_IVAMONTO), SUM(FADE_CONSUMO) FROM FACTURAS F, FACTURAS_DETALLE D
                        WHERE F.FACT_ID = D.FACT_ID AND F.FACT_ID = :ID INTO :TOTAL, :IVAMONTO, :CONSUMO;
                ELSE
                    FOR SELECT D.ARTI_COD, FADE_CANT, FADE_TOTAL, FADE_IVAMONTO, FADE_CONSUMO, GRUP_COD
                        FROM FACTURAS F, FACTURAS_DETALLE D, ARTICULO A
                        WHERE F.FACT_ID = D.FACT_ID AND D.arti_cod = A.arti_cod AND F.FACT_ID = :ID
                        INTO :ARTICULO, :CANT, :TOTAL, :IVAMONTO, :CONSUMO, :CODGRP
                        DO
                        BEGIN
                        if (SITOT = 'SI') then
                            BASEAUX = TOTAL;
                        ELSE
                            BASEAUX = (TOTAL - IVAMONTO - CONSUMO);
                        BASE = BASEAUX;
                        COMIMONTO = BASE / 100 * COMIPORC;
                        SUSPEND;
                        END
                END
            if (TIPO = 33) then
                if (DETALLE = 'N') then
                    SELECT MAX(DEVT_TOTAL*-1), MAX(DEVT_IVAMONTO*-1), SUM(DVDE_CONSUMO) FROM DEVOLUCIONES_VENTAS V, DEVOLUCIONES_VENTAS_DETALLE D
                        WHERE V.DEVT_ID = D.DEVT_ID AND V.DEVT_ID = :ID INTO :TOTAL, :IVAMONTO, :CONSUMO;
                ELSE
                    FOR SELECT D.ARTI_COD, DVDE_CANT, DVDE_TOTAL*-1, DVDE_IVAMONTO*-1, DVDE_CONSUMO*-1, GRUP_COD
                        FROM DEVOLUCIONES_VENTAS V, DEVOLUCIONES_VENTAS_DETALLE D, ARTICULO A
                        WHERE V.DEVT_ID = D.DEVT_ID AND D.arti_cod = A.arti_cod AND V.DEVT_ID = :ID
                        INTO :ARTICULO, :CANT, :TOTAL, :IVAMONTO, :CONSUMO, :codgrp
                        DO
                        BEGIN
                        if (SITOT = 'SI') then
                            BASEAUX = TOTAL;
                        ELSE
                            BASEAUX = TOTAL - IVAMONTO - CONSUMO;
                        BASE = BASEAUX;
                        COMIMONTO = BASE / 100 * COMIPORC;
                        SUSPEND;
                        END
            if (TIPO = 41) then
                SELECT NDCL_MONTO, NDCL_IVAMONTO, 0 FROM NOTAS_DEBITO_CLIENTES WHERE NDCL_ID = :ID INTO :TOTAL, :IVAMONTO, :CONSUMO;
            if (TIPO = 42) then
                SELECT NCCL_MONTO*-1, NCCL_IVAMONTO*-1, 0 FROM NOTAS_CREDITO_CLIENTES WHERE NCCL_ID = :ID INTO :TOTAL, :IVAMONTO, :CONSUMO;
            if (TIPO = 77) then
                SELECT DVCH_MONTO, 0, 0 FROM DEVOLUCION_CHEQUES WHERE DVCH_ID = :ID INTO :TOTAL, :IVAMONTO, :CONSUMO;
            if (SITOT = 'SI') then
                BASEAUX = ABONO;
            ELSE
                if ((TOTAL - IVAMONTO - CONSUMO) <> 0) then
                    BASEAUX = (ABONO / TOTAL) * (TOTAL - IVAMONTO - CONSUMO);
                ELSE
                    BASEAUX = 0;
            BASE = BASEAUX;
            COMIMONTO = BASE / 100 * COMIPORC;
            END
        ELSE
            BEGIN
            if (TIPO = 31) then
                if (DETALLE = 'N') then
                    SELECT MAX(FACT_TOTAL), MAX(FACT_IVAMONTO), MAX(FACT_COMIPORC), SUM(FADE_CONSUMO)
                        FROM FACTURAS F, FACTURAS_DETALLE D WHERE F.FACT_ID = D.FACT_ID AND F.FACT_ID = :ID
                        INTO :TOTAL, :IVAMONTO, :PORCV, :CONSUMO;
                ELSE
                    FOR SELECT D.ARTI_COD, FADE_CANT, FADE_TOTAL, FADE_IVAMONTO, FADE_CONSUMO, FACT_COMIPORC, GRUP_COD
                        FROM FACTURAS F, FACTURAS_DETALLE D, ARTICULO A
                        WHERE F.FACT_ID = D.FACT_ID AND D.arti_cod = A.arti_cod AND F.FACT_ID = :ID
                        INTO :ARTICULO, :CANT, :TOTAL, :IVAMONTO, :CONSUMO, :porcv, :codgrp
                        DO
                        BEGIN
                        if (SITOT = 'SI') then
                            BASEAUX = TOTAL;
                        ELSE
                            BASEAUX = (TOTAL - IVAMONTO - CONSUMO);
                        COMIV = PORCV / 100 * BASEAUX;
                        COMIMONTO = COMIV / 100 * COMIPORC;
                        porcaux = comiporc;
                        comiporc = PORCV / 100 * COMIPORC;
                        BASE = BASEAUX;
                        SUSPEND;
                        END
            if (TIPO = 33) then
                if (DETALLE = 'N') then
                    SELECT MAX(DEVT_TOTAL), MAX(DEVT_IVAMONTO), MAX(DEVT_COMIPORC), SUM(DVDE_CONSUMO)
                        FROM DEVOLUCIONES_VENTAS V, DEVOLUCIONES_VENTAS_DETALLE D WHERE V.DEVT_ID = D.DEVT_ID AND D.DEVT_ID = :ID
                        INTO :TOTAL, :IVAMONTO, :PORCV, :CONSUMO;
                ELSE
                    FOR SELECT D.ARTI_COD, DVDE_CANT, DVDE_TOTAL*-1, DVDE_IVAMONTO*-1, DVDE_CONSUMO*-1, DEVT_COMIPORC, GRUP_COD
                        FROM DEVOLUCIONES_VENTAS V, DEVOLUCIONES_VENTAS_DETALLE D, ARTICULO A
                        WHERE V.DEVT_ID = D.DEVT_ID AND D.arti_cod = A.arti_cod AND V.DEVT_ID = :ID
                        INTO :ARTICULO, :CANT, :TOTAL, :IVAMONTO, :CONSUMO, :porcv, :codgrp
                        DO
                        BEGIN
                        if (SITOT = 'SI') then
                            BASEAUX = TOTAL;
                        ELSE
                            BASEAUX = (TOTAL - IVAMONTO - CONSUMO);
                        COMIV = PORCV / 100 * BASEAUX;
                        COMIMONTO = COMIV / 100 * COMIPORC;
                        porcaux = comiporc;
                        comiporc = PORCV / 100 * COMIPORC;
                        BASE = BASEAUX;
                        SUSPEND;
                        END
            if (TIPO = 41) then
                SELECT NDCL_MONTO, NDCL_IVAMONTO, NDCL_COMIPORC, 0 FROM NOTAS_DEBITO_CLIENTES
                    WHERE NDCL_ID = :ID INTO :TOTAL, :IVAMONTO, :PORCV, :CONSUMO;
            if (TIPO = 42) then
                SELECT NCCL_MONTO, NCCL_IVAMONTO, NCCL_COMIPORC, 0  FROM NOTAS_CREDITO_CLIENTES
                    WHERE NCCL_ID = :ID INTO :TOTAL, :IVAMONTO, :PORCV, :CONSUMO;
            if (TIPO = 77) then
                SELECT DVCH_MONTO, 0, 0, 0 FROM DEVOLUCION_CHEQUES WHERE DVCH_ID = :ID INTO :TOTAL, :IVAMONTO, :PORCV, :CONSUMO;
            if (SITOT = 'SI') then
                BASEAUX = ABONO;
            ELSE
                if ((total <> 0) AND (ABONO <> 0)) then
                    BASEAUX = (TOTAL - IVAMONTO - CONSUMO) / TOTAL * ABONO;
                ELSE
                    BASEAUX = 0;
            COMIV = PORCV / 100 * BASEAUX;
            COMIMONTO = COMIV / 100 * COMIPORC;
            porcaux = comiporc;
            comiporc = PORCV / 100 * COMIPORC;
            BASE = BASEAUX;
            END
        select COBR_NOM from COBRADORES where COBR_COD = :codvend INTO :nomvend;
        if (DETALLE = 'N') then
            if (ALFINAL = 'SI') then
                BEGIN
                /* VERIFIQUE EL SALDO DEL DOCUMENTO, SI ES CERO LIQUIDE COMISION SOBRE EL TOTAL */
                EXECUTE PROCEDURE saldo_doc_cartera(:tipo, :ID, :FECREC, 0) returning_values (:SALDO);
                if (SALDO = 0) then
                    BEGIN
                    if (VENTA = 'NO') then
                        begin
                        if (SITOT = 'SI') then
                            BASEAUX = TOTAL;
                        ELSE
                            BASEAUX = TOTAL - IVAMONTO - CONSUMO;
                        COMIMONTO = BASEAUX * COMIPORC / 100;
                        end
                    ELSE
                        BEGIN
                        if (SITOT = 'SI') then
                            BASEAUX = TOTAL;
                        ELSE
                            BASEAUX = TOTAL - IVAMONTO - CONSUMO;
                        COMIV = PORCV * BASEAUX / 100;
                        COMIMONTO = COMIV / 100 * porcaux;
                        comiporc = PORCV / 100 * porcaux;
                        END
                    BASE = BASEAUX;
                    SUSPEND;
                    END
                END
            ELSE
                SUSPEND;
        ELSE
            if ((TIPO <> 31) AND (TIPO <> 33)) then
                SUSPEND;
        END
    END
FOR SELECT EGCC_TIPODOC, EGCC_IDDOC, EGCC_PREFIJO, EGCC_NUMERO, E.TERC_NIT, TERC_NOM, EGRE_FECHA, (EGCC_ABONO+EGCC_RTFTE+EGCC_RTIVA+EGCC_RTICA), PREF_PRE, EGRE_NUMERO, EGCC_SUCURSAL
    FROM EGRESOS E, EGRESOS_CRUCEC C, TERCEROS T
    WHERE E.EGRE_ID = C.EGRE_ID AND EGRE_FECHA >= :FECINI AND EGRE_FECHA <= :FECFIN AND E.TERC_NIT = T.TERC_NIT AND EGRE_ANULADO = 'N'
    ORDER BY TERC_NIT, EGRE_FECHA
    INTO :TIPO, :ID, :PREFIJO, :NUMERO, :NIT, :CLIENTE, :FECREC, :ABONO, :PREFREC, :NUMREC, :SUCURSAL
    DO
    BEGIN
    SELECT COBR_COD FROM cliente_sucursales WHERE TERC_NIT = :NIT AND CLCU_COD = :sucursal INTO :codvend;
    SELECT TIDO_NOMCORTO FROM TIPO_DOCUMENTO WHERE TIDO_COD = :TIPO INTO :NOMTIPO;
    if (COMISION = 'DOCUMENTO') then
        SELECT MVCL_FECHA, COBR_COD FROM MOVIMIENTO_CLIENTES WHERE MVCL_TIPOREF = :TIPO AND MVCL_IDREF = :ID
            INTO :FECDOC, :codvend;
    else
        SELECT MVCL_FECHA FROM MOVIMIENTO_CLIENTES WHERE MVCL_TIPOREF = :TIPO AND MVCL_IDREF = :ID
            INTO :FECDOC;
    if (FECDOC IS NOT NULL) then
        DIAS = FECREC - FECDOC;
    ELSE
        DIAS = 999;
    if ((codvend >= :DESDE) AND (codvend <= :hasta)) then
        BEGIN
        /* TRAIGA EL PORCENTAJE DE ACUERDO A LOS DIAS */
        COMIPORC = 0;
        SELECT CMCB_PORC FROM COMISION_COBRO WHERE CMCB_DIASINI <= :dias AND CMCB_DIASFIN >= :DIAS AND COBR_COD = :CODVEND INTO :COMIPORC;
        if (COMIPORC IS NULL) THEN
            COMIPORC = 0;
        if (VENTA = 'NO') then
            BEGIN
            if (TIPO = 31) then
                BEGIN
                if (DETALLE = 'N') then
                    SELECT MAX(FACT_TOTAL), MAX(FACT_IVAMONTO), SUM(FADE_CONSUMO) FROM FACTURAS F, FACTURAS_DETALLE D
                        WHERE F.FACT_ID = D.FACT_ID AND F.FACT_ID = :ID INTO :TOTAL, :IVAMONTO, :CONSUMO;
                ELSE
                    FOR SELECT D.ARTI_COD, FADE_CANT, FADE_TOTAL, FADE_IVAMONTO, FADE_CONSUMO, GRUP_COD
                        FROM FACTURAS F, FACTURAS_DETALLE D, ARTICULO A
                        WHERE F.FACT_ID = D.FACT_ID AND D.arti_cod = A.arti_cod AND F.FACT_ID = :ID
                        INTO :ARTICULO, :CANT, :TOTAL, :IVAMONTO, :CONSUMO, :CODGRP
                        DO
                        BEGIN
                        if (SITOT = 'SI') then
                            BASEAUX = TOTAL;
                        ELSE
                            BASEAUX = (TOTAL - IVAMONTO - CONSUMO);
                        BASE = BASEAUX;
                        COMIMONTO = BASE / 100 * COMIPORC;
                        SUSPEND;
                        END
                END
            if (TIPO = 33) then
                if (DETALLE = 'N') then
                    SELECT MAX(DEVT_TOTAL*-1), MAX(DEVT_IVAMONTO*-1), SUM(DVDE_CONSUMO) FROM DEVOLUCIONES_VENTAS V, DEVOLUCIONES_VENTAS_DETALLE D
                        WHERE V.DEVT_ID = D.DEVT_ID AND V.DEVT_ID = :ID INTO :TOTAL, :IVAMONTO, :CONSUMO;
                ELSE
                    FOR SELECT D.ARTI_COD, DVDE_CANT, DVDE_TOTAL*-1, DVDE_IVAMONTO*-1, DVDE_CONSUMO*-1, GRUP_COD
                        FROM DEVOLUCIONES_VENTAS V, DEVOLUCIONES_VENTAS_DETALLE D, ARTICULO A
                        WHERE V.DEVT_ID = D.DEVT_ID AND D.arti_cod = A.arti_cod AND V.DEVT_ID = :ID
                        INTO :ARTICULO, :CANT, :TOTAL, :IVAMONTO, :CONSUMO, :codgrp
                        DO
                        BEGIN
                        if (SITOT = 'SI') then
                            BASEAUX = TOTAL;
                        ELSE
                            BASEAUX = TOTAL - IVAMONTO - CONSUMO;
                        BASE = BASEAUX;
                        COMIMONTO = BASE / 100 * COMIPORC;
                        SUSPEND;
                        END
            if (TIPO = 41) then
                SELECT NDCL_MONTO, NDCL_IVAMONTO, 0 FROM NOTAS_DEBITO_CLIENTES WHERE NDCL_ID = :ID INTO :TOTAL, :IVAMONTO, :CONSUMO;
            if (TIPO = 42) then
                SELECT NCCL_MONTO*-1, NCCL_IVAMONTO*-1, 0 FROM NOTAS_CREDITO_CLIENTES WHERE NCCL_ID = :ID INTO :TOTAL, :IVAMONTO, :CONSUMO;
            if (TIPO = 77) then
                SELECT DVCH_MONTO, 0, 0 FROM DEVOLUCION_CHEQUES WHERE DVCH_ID = :ID INTO :TOTAL, :IVAMONTO, :CONSUMO;
            if (SITOT = 'SI') then
                BASEAUX = ABONO;
            ELSE
                if ((TOTAL - IVAMONTO - CONSUMO) <> 0) then
                    BASEAUX = (ABONO / TOTAL) * (TOTAL - IVAMONTO - CONSUMO);
                ELSE
                    BASEAUX = 0;
            BASE = BASEAUX;
            COMIMONTO = BASE / 100 * COMIPORC;
            END
        ELSE
            BEGIN
            if (TIPO = 31) then
                if (DETALLE = 'N') then
                    SELECT MAX(FACT_TOTAL), MAX(FACT_IVAMONTO), MAX(FACT_COMIPORC), SUM(FADE_CONSUMO)
                        FROM FACTURAS F, FACTURAS_DETALLE D WHERE F.FACT_ID = D.FACT_ID AND F.FACT_ID = :ID
                        INTO :TOTAL, :IVAMONTO, :PORCV, :CONSUMO;
                ELSE
                    FOR SELECT D.ARTI_COD, FADE_CANT, FADE_TOTAL, FADE_IVAMONTO, FADE_CONSUMO, FACT_COMIPORC, GRUP_COD
                        FROM FACTURAS F, FACTURAS_DETALLE D, ARTICULO A
                        WHERE F.FACT_ID = D.FACT_ID AND D.arti_cod = A.arti_cod AND F.FACT_ID = :ID
                        INTO :ARTICULO, :CANT, :TOTAL, :IVAMONTO, :CONSUMO, :porcv, :codgrp
                        DO
                        BEGIN
                        if (SITOT = 'SI') then
                            BASEAUX = TOTAL;
                        ELSE
                            BASEAUX = (TOTAL - IVAMONTO - CONSUMO);
                        COMIV = PORCV / 100 * BASEAUX;
                        COMIMONTO = COMIV / 100 * COMIPORC;
                        porcaux = comiporc;
                        comiporc = PORCV / 100 * COMIPORC;
                        BASE = BASEAUX;
                        SUSPEND;
                        END
            if (TIPO = 33) then
                if (DETALLE = 'N') then
                    SELECT MAX(DEVT_TOTAL), MAX(DEVT_IVAMONTO), MAX(DEVT_COMIPORC), SUM(DVDE_CONSUMO)
                        FROM DEVOLUCIONES_VENTAS V, DEVOLUCIONES_VENTAS_DETALLE D WHERE V.DEVT_ID = D.DEVT_ID AND D.DEVT_ID = :ID
                        INTO :TOTAL, :IVAMONTO, :PORCV, :CONSUMO;
                ELSE
                    FOR SELECT D.ARTI_COD, DVDE_CANT, DVDE_TOTAL*-1, DVDE_IVAMONTO*-1, DVDE_CONSUMO*-1, DEVT_COMIPORC, GRUP_COD
                        FROM DEVOLUCIONES_VENTAS V, DEVOLUCIONES_VENTAS_DETALLE D, ARTICULO A
                        WHERE V.DEVT_ID = D.DEVT_ID AND D.arti_cod = A.arti_cod AND V.DEVT_ID = :ID
                        INTO :ARTICULO, :CANT, :TOTAL, :IVAMONTO, :CONSUMO, :porcv, :codgrp
                        DO
                        BEGIN
                        if (SITOT = 'SI') then
                            BASEAUX = TOTAL;
                        ELSE
                            BASEAUX = (TOTAL - IVAMONTO - CONSUMO);
                        COMIV = PORCV / 100 * BASEAUX;
                        COMIMONTO = COMIV / 100 * COMIPORC;
                        porcaux = comiporc;
                        comiporc = PORCV / 100 * COMIPORC;
                        BASE = BASEAUX;
                        SUSPEND;
                        END
            if (TIPO = 41) then
                SELECT NDCL_MONTO, NDCL_IVAMONTO, NDCL_COMIPORC, 0 FROM NOTAS_DEBITO_CLIENTES
                    WHERE NDCL_ID = :ID INTO :TOTAL, :IVAMONTO, :PORCV, :CONSUMO;
            if (TIPO = 42) then
                SELECT NCCL_MONTO, NCCL_IVAMONTO, NCCL_COMIPORC, 0  FROM NOTAS_CREDITO_CLIENTES
                    WHERE NCCL_ID = :ID INTO :TOTAL, :IVAMONTO, :PORCV, :CONSUMO;
            if (TIPO = 77) then
                SELECT DVCH_MONTO, 0, 0, 0 FROM DEVOLUCION_CHEQUES WHERE DVCH_ID = :ID INTO :TOTAL, :IVAMONTO, :PORCV, :CONSUMO;
            if (SITOT = 'SI') then
                BASEAUX = ABONO;
            ELSE
                if ((total <> 0) AND (ABONO <> 0)) then
                    BASEAUX = (TOTAL - IVAMONTO - CONSUMO) / TOTAL * ABONO;
                ELSE
                    BASEAUX = 0;
            COMIV = PORCV / 100 * BASEAUX;
            COMIMONTO = COMIV / 100 * COMIPORC;
            porcaux = comiporc;
            comiporc = PORCV / 100 * COMIPORC;
            BASE = BASEAUX;
            END
        select COBR_NOM from COBRADORES where COBR_COD = :codvend INTO :nomvend;
        if (DETALLE = 'N') then
            if (ALFINAL = 'SI') then
                BEGIN
                /* VERIFIQUE EL SALDO DEL DOCUMENTO, SI ES CERO LIQUIDE COMISION SOBRE EL TOTAL */
                EXECUTE PROCEDURE saldo_doc_cartera(:tipo, :ID, :FECREC, 0) returning_values (:SALDO);
                if (SALDO = 0) then
                    BEGIN
                    if (VENTA = 'NO') then
                        begin
                        if (SITOT = 'SI') then
                            BASEAUX = TOTAL;
                        ELSE
                            BASEAUX = TOTAL - IVAMONTO - CONSUMO;
                        COMIMONTO = BASEAUX * COMIPORC / 100;
                        end
                    ELSE
                        BEGIN
                        if (SITOT = 'SI') then
                            BASEAUX = TOTAL;
                        ELSE
                            BASEAUX = TOTAL - IVAMONTO - CONSUMO;
                        COMIV = PORCV * BASEAUX / 100;
                        COMIMONTO = COMIV / 100 * porcaux;
                        comiporc = PORCV / 100 * porcaux;
                        END
                    BASE = BASEAUX;
                    SUSPEND;
                    END
                END
            ELSE
                SUSPEND;
        ELSE
            if ((TIPO <> 31) AND (TIPO <> 33)) then
                SUSPEND;
        END
    END
FOR SELECT 'DEVOCHEQ', DVCH_MONTO*-1, DVCH_FECHA, PRBA_PREF, DVCH_NUMDOC, DVCH_FECHA, D.TERC_NIT, DVCH_NOMTERC, '', '', D.COBR_COD
    FROM DEVOLUCION_CHEQUES D, CLIENTES C
    WHERE DVCH_FECHA >= :FECINI AND DVCH_FECHA <= :FECFIN AND D.TERC_NIT = C.TERC_NIT AND D.COBR_COD = :CODVEND
    INTO :NOMTIPO, :BASE, :FECDOC, :PREFIJO, :NUMERO, :FECREC, :NIT, :CLIENTE, :PREFREC, :NUMREC, :codvend
    DO
    BEGIN
    COMIPORC = 0;
    COMIMONTO = 0;
    VENCE = fecdoc;
    RTFTE = 0;
    RTIVA = 0;
    RTICA = 0;
    DTOFIN = 0;
    if ((codvend >= :DESDE) AND (codvend <= :hasta)) then
        BEGIN
        select COBR_NOM from COBRADORES where COBR_COD = :codvend INTO :nomvend;
        /* SELECT CMCB_PORC FROM COMISION_COBRO WHERE CMCB_DIASINI <= 1 AND CMCB_DIASFIN >= 1 AND COBR_COD = :CODVEND INTO :COMIPORC;
        if (COMIPORC IS NULL) THEN
            COMIPORC = 0;
        COMIMONTO = BASE * COMIPORC / 100; */
        SUSPEND;
        END
    END
SUSPEND;
END
^

SET TERM ; ^



/* 20081207 NO INCLUYA LOS .T EN LOS REPORTES POR ARTICULO, ANCHETAS CON DETALLE POR TARIFA */

SET TERM ^ ;

CREATE OR ALTER TRIGGER FACTURAS_DETALLE_BI FOR FACTURAS_DETALLE
ACTIVE BEFORE INSERT POSITION 0
AS
declare variable TRM numeric(18,2);
declare variable IVAINC CHAR(1);
BEGIN
if (new.fade_cant is null) then
    new.fade_cant = 0;
if (new.fade_prunit is null) then
    new.fade_prunit = 0;
if (new.fade_dtoporc is null) then
    new.fade_dtoporc = 0;
if (new.fade_ivaporc is null) then
    new.fade_ivaporc = 0;
if (new.fade_ivamonto is null) then
    new.fade_ivamonto = 0;
if (new.fade_consumo is null) then
    new.fade_consumo = 0;
/* CALCULE EL MONTO DEL DESCUENTO */
NEW.FADE_DTOMONTO = NEW.fade_prunit * NEW.fade_dtoporc / 100;
/* si estaba en otra moneda convierta a pesos */
select fact_trm, fact_ivainc from facturas where fact_id = new.fact_id into :trm, :ivainc;
if ((NEW.FADE_TOTAL IS NULL) or (NEW.fade_total = 0)) then
    BEGIN
    NEW.FADE_TOTAL = NEW.FADE_CANT * NEW.FADE_PRUNIT - NEW.FADE_DTOMONTO;
    if (IVAINC = 'N') then
        NEW.FADE_TOTAL = NEW.fade_total + NEW.fade_ivamonto + NEW.fade_consumo;
    END
if (trm <> 1) then
    begin
    new.fade_prunit = new.fade_prunit * trm;
    new.fade_dtomonto = new.fade_dtomonto * trm;
    new.fade_ivamonto = new.fade_ivamonto * trm;
    new.fade_consumo = new.fade_consumo * trm;
    new.fade_dtom1 = new.fade_dtom1 * trm;
    new.fade_dtom2 = new.fade_dtom2 * trm;
    new.fade_dtom3 = new.fade_dtom3 * trm;
    new.fade_total = new.fade_total * trm;
    end
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER PROCEDURE REP_VENTAS_ARTICULO(
    TIPO INTEGER,
    ARTINI VARCHAR(20),
    ARTFIN VARCHAR(20),
    DETALLE CHAR(1),
    FECINI DATE,
    FECFIN DATE,
    GRPINI VARCHAR(3),
    GRPFIN VARCHAR(3),
    PTOINI INTEGER,
    PTOFIN INTEGER,
    ORDEN CHAR(1),
    AGRUPA CHAR(1),
    CEROS CHAR(1),
    SUBEMPRESA INTEGER)
RETURNS (
    ARTICULO VARCHAR(15),
    DESCRIPCION VARCHAR(60),
    CODGRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    CODSUBG VARCHAR(3),
    NOMSUBG VARCHAR(30),
    CODMARC VARCHAR(3),
    NOMMARC VARCHAR(30),
    UNIDAD VARCHAR(8),
    CANTIDAD NUMERIC(18,4),
    BASE NUMERIC(18,2),
    IVA NUMERIC(18,2),
    CONSUMO NUMERIC(18,2),
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    DTO NUMERIC(9,2),
    TRANSP VARCHAR(60),
    NOMTIPO VARCHAR(50))
AS
DECLARE VARIABLE CODINI VARCHAR(20);
DECLARE VARIABLE CODFIN VARCHAR(20);
DECLARE VARIABLE DESINI VARCHAR(20);
DECLARE VARIABLE DESFIN VARCHAR(20);
declare variable MARINI VARCHAR(3);
declare variable MARFIN VARCHAR(3);
declare variable NUMROWS INTEGER;
BEGIN
if (ORDEN = 'C') then
    BEGIN
    CODINI = ARTINI;
    CODFIN = ARTFIN;
    DESINI = '';
    DESFIN = 'zz';
    END
ELSE
    BEGIN
    DESINI = ARTINI;
    DESFIN = ARTFIN;
    CODINI = '0';
    CODFIN = 'zz';
    END
if (AGRUPA = 'G') then
    BEGIN
    MARINI = '';
    MARFIN = 'zz';
    END
ELSE
    if (AGRUPA = 'M') then
        BEGIN
        MARINI = GRPINI;
        MARFIN = GRPFIN;
        GRPINI = '';
        GRPFIN = 'zz';
        END
    ELSE
        BEGIN
        MARINI = '';
        MARFIN = 'zz';
        END
/* BORRA LA TABLA AUXILIAR */
DELETE FROM reportes_aux WHERE REPA_ID = 1 AND REPA_USER = USER;

if (DETALLE = 'N') then
    BEGIN
    if (BIN_AND(TIPO, 1) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 31 INTO :NOMTIPO;
        /* BORRA LA TABLA AUXILIAR */
        DELETE FROM reportes_aux WHERE REPA_ID = 1 AND REPA_USER = USER;

        FOR SELECT MAX(D.ARTI_COD), SUM(FADE_CANT * FADE_FACTOR), SUM(FACT_FACTOR*(FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO)),
            SUM(FACT_FACTOR*FADE_IVAMONTO), SUM(FADE_CONSUMO), MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD)
            FROM FACTURAS_DETALLE D, FACTURAS F, PREFIJOS P, ARTICULO A WHERE F.PTVT_ID >= :PTOINI AND F.PTVT_ID <= :PTOFIN AND
            F.FACT_ID = D.FACT_ID AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND D.ARTI_COD = A.arti_cod AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            FACT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) and substring(a.arti_cod from 1 FOR 2) <> '.t'
            GROUP BY D.ARTI_COD
            INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,
            :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
            DO
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            if (CEROS = 'S') then
                INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (1, USER, :ARTICULO);
            SUSPEND;
            END
        if (CEROS = 'S') then
            BEGIN
            /* agregue los articulos sin factura */
            FOR SELECT ARTI_COD, 0, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND
                    A.ARTI_DES <= :DESFIN AND A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND
                    (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN)))
                INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,:DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                DO
                BEGIN
                SELECT COUNT(REPA_ARTICULO) FROM REPORTES_AUX WHERE REPA_ID = 1 AND REPA_USER = USER AND REPA_ARTICULO = :articulo INTO :numrows;
                if (numrows = 0) then
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        END

    if (BIN_AND(TIPO, 2) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 32 INTO :NOMTIPO;
        /* BORRA LA TABLA AUXILIAR */
        DELETE FROM reportes_aux WHERE REPA_ID = 1 AND REPA_USER = USER;

        FOR SELECT MAX(D.ARTI_COD), SUM(RVDE_CANT * RVDE_FACTOR), SUM((RVDE_TOTAL-RVDE_IVAMONTO-RVDE_CONSUMO)), SUM(RVDE_IVAMONTO),
            SUM(RVDE_CONSUMO), MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD)
            FROM REMISIONES_VENTA_DETALLE D, REMISIONES_VENTA R, PREFIJOS P, ARTICULO A WHERE R.PTVT_ID >= :PTOINI AND R.PTVT_ID <= :PTOFIN AND
            R.REVT_ID = D.REVT_ID AND P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = 32 AND D.ARTI_COD = A.arti_cod AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            REVT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY D.ARTI_COD
            INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,
            :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
            DO
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            if (CEROS = 'S') then
                INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (1, USER, :ARTICULO);
            SUSPEND;
            END
        if (CEROS = 'S') then
            BEGIN
            /* agregue los articulos sin factura */
            FOR SELECT ARTI_COD, 0, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND
                    A.ARTI_DES <= :DESFIN AND A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND
                    (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN)))
                INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,:DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                DO
                BEGIN
                SELECT COUNT(REPA_ARTICULO) FROM REPORTES_AUX WHERE REPA_ID = 1 AND REPA_USER = USER AND REPA_ARTICULO = :articulo INTO :numrows;
                if (numrows = 0) then
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        END

    if (BIN_AND(TIPO, 4) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 33 INTO :NOMTIPO;
        /* BORRA LA TABLA AUXILIAR */
        DELETE FROM reportes_aux WHERE REPA_ID = 1 AND REPA_USER = USER;

        FOR SELECT MAX(D.ARTI_COD), SUM(DVDE_CANT * DVDE_FACTOR), SUM(DEVT_FACTOR*(DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO)),
            SUM(DEVT_FACTOR*DVDE_IVAMONTO), SUM(DVDE_CONSUMO), MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD)
            FROM devoluciones_ventas_detalle D, DEVOLUCIONES_VENTAS V, PREFIJOS P, ARTICULO A WHERE V.PTVT_ID >= :PTOINI AND V.PTVT_ID <= :PTOFIN AND
            V.DEVT_ID = D.DEVT_ID AND P.PREF_PRE = V.PREF_PRE AND P.TIDO_COD = 33 AND D.ARTI_COD = A.arti_cod AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            DEVT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) AND ((DEVT_REMID = 0) or (DEVT_REMID IS NULL))
            GROUP BY D.ARTI_COD
            INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,
            :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
            DO
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            CANTIDAD = CANTIDAD * -1;
            BASE = BASE * -1;
            IVA = IVA * -1;
            CONSUMO = CONSUMO * -1;
            if (CEROS = 'S') then
                INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (1, USER, :ARTICULO);
            SUSPEND;
            END
        if (CEROS = 'S') then
            BEGIN
            /* agregue los articulos sin factura */
            FOR SELECT ARTI_COD, 0, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND
                    A.ARTI_DES <= :DESFIN AND A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND
                    (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN)))
                INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,:DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                DO
                BEGIN
                SELECT COUNT(REPA_ARTICULO) FROM REPORTES_AUX WHERE REPA_ID = 1 AND REPA_USER = USER AND REPA_ARTICULO = :articulo INTO :numrows;
                if (numrows = 0) then
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        END
    if (BIN_AND(TIPO, 8) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 34 INTO :NOMTIPO;
        /* BORRA LA TABLA AUXILIAR */
        DELETE FROM reportes_aux WHERE REPA_ID = 1 AND REPA_USER = USER;

        FOR SELECT MAX(D.ARTI_COD), SUM(PEDE_CANT * PEDE_FACTOR), SUM(PEDI_FACTOR*(PEDE_TOTAL-PEDE_IVAMONTO-PEDE_CONSUMO)),
            SUM(PEDI_FACTOR*PEDE_IVAMONTO), SUM(PEDE_CONSUMO),
            MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD)
            FROM PEDIDOS_DETALLE D, PEDIDOS P, PREFIJOS R, ARTICULO A WHERE P.PTVT_ID >= :PTOINI AND P.PTVT_ID <= :PTOFIN AND
            P.PEDI_ID = D.PEDI_ID AND P.PREF_PRE = R.PREF_PRE AND R.TIDO_COD = 34 AND D.ARTI_COD = A.arti_cod AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            PEDI_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY D.ARTI_COD
            INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,
            :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
            DO
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            if (CEROS = 'S') then
                INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (1, USER, :ARTICULO);
            SUSPEND;
            END
        if (CEROS = 'S') then
            BEGIN
            /* agregue los articulos sin factura */
            FOR SELECT ARTI_COD, 0, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND
                    A.ARTI_DES <= :DESFIN AND A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND
                    (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN)))
                INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,:DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                DO
                BEGIN
                SELECT COUNT(REPA_ARTICULO) FROM REPORTES_AUX WHERE REPA_ID = 1 AND REPA_USER = USER AND REPA_ARTICULO = :articulo INTO :numrows;
                if (numrows = 0) then
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        END
    if (BIN_AND(TIPO, 16) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 35 INTO :NOMTIPO;
        /* BORRA LA TABLA AUXILIAR */
        DELETE FROM reportes_aux WHERE REPA_ID = 1 AND REPA_USER = USER;

        FOR SELECT MAX(D.ARTI_COD), SUM(CTDE_CANT * CTDE_FACTOR), SUM(COTI_FACTOR*(CTDE_TOTAL-CTDE_IVAMONTO-CTDE_CONSUMO)),
            SUM(COTI_FACTOR*CTDE_IVAMONTO), SUM(CTDE_CONSUMO),
            MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD)
            FROM COTIZACIONES_DETALLE D, COTIZACIONES C, PREFIJOS P, ARTICULO A WHERE C.PTVT_ID >= :PTOINI AND C.PTVT_ID <= :PTOFIN AND
            C.COTI_ID = D.COTI_ID AND P.PREF_PRE = C.PREF_PRE AND P.TIDO_COD = 35 AND D.ARTI_COD = A.arti_cod AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND COTI_FECHA >= :FECINI AND COTI_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            COTI_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY D.ARTI_COD
            INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,
            :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
            DO
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            if (CEROS = 'S') then
                INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (1, USER, :ARTICULO);
            SUSPEND;
            END
        if (CEROS = 'S') then
            BEGIN
            /* agregue los articulos sin factura */
            FOR SELECT ARTI_COD, 0, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND
                    A.ARTI_DES <= :DESFIN AND A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND
                    (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN)))
                INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,:DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                DO
                BEGIN
                SELECT COUNT(REPA_ARTICULO) FROM REPORTES_AUX WHERE REPA_ID = 1 AND REPA_USER = USER AND REPA_ARTICULO = :articulo INTO :numrows;
                if (numrows = 0) then
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        END
    END
ELSE
  if (DETALLE = 'S') then
    BEGIN
    if (BIN_AND(TIPO, 1) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 31 INTO :NOMTIPO;
        FOR SELECT F.PREF_PRE, FACT_NUMERO, FACT_FECHA, D.ARTI_COD, FADE_CANT * FADE_FACTOR, (FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO)*FACT_FACTOR,
        FADE_IVAMONTO*FACT_FACTOR, FADE_CONSUMO, FADE_DTOPORC,
            ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD, FACT_TRANSP
            FROM FACTURAS F, FACTURAS_DETALLE D, PREFIJOS P, ARTICULO A WHERE F.PTVT_ID >= :PTOINI AND F.PTVT_ID <= :PTOFIN AND
                F.FACT_ID = D.FACT_ID AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND D.ARTI_COD = A.arti_cod AND
                A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
                A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND FACT_FECHA >= :FECINI AND
                (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
                FACT_FECHA <= :FECFIN AND FACT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) and substring(a.arti_cod from 1 FOR 2) <> '.t'
            /*ORDER BY D.ARTI_COD, FACT_FECHA, FACT_ID, FADE_ITEM*/
            INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO, :DTO,
                :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :transp
            DO
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            SUSPEND;
            END
        END
    if (BIN_AND(TIPO, 2) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 32 INTO :NOMTIPO;
        FOR SELECT R.PREF_PRE, REVT_NUMERO, REVT_FECHA, D.ARTI_COD, RVDE_CANT * RVDE_FACTOR, (RVDE_TOTAL-RVDE_IVAMONTO-RVDE_CONSUMO), RVDE_IVAMONTO, RVDE_CONSUMO, RVDE_DTOPORC,
            ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD, REVT_TRANSP
            FROM REMISIONES_VENTA R, REMISIONES_VENTA_DETALLE D, PREFIJOS P, ARTICULO A
            WHERE R.REVT_ID = D.REVT_ID AND P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = 32 AND D.ARTI_COD = A.arti_cod AND
                A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
                A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN AND
                (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
                REVT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO, :DTO,
                :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :transp
            DO
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            SUSPEND;
            END
        END
    if (BIN_AND(TIPO, 4) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 33 INTO :NOMTIPO;
        FOR SELECT V.PREF_PRE, DEVT_NUMERO, DEVT_FECHA, D.ARTI_COD, DVDE_CANT * DVDE_FACTOR, (DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO)*DEVT_FACTOR,
            DVDE_IVAMONTO*DEVT_FACTOR, DVDE_CONSUMO, DVDE_DTOPORC,
            ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD 
            FROM DEVOLUCIONES_VENTAS V, DEVOLUCIONES_VENTAS_DETALLE D, PREFIJOS P, ARTICULO A WHERE V.PTVT_ID >= :PTOINI AND V.PTVT_ID <= :PTOFIN AND
                V.DEVT_ID = D.DEVT_ID AND P.PREF_PRE = V.PREF_PRE AND P.TIDO_COD = 33 AND D.ARTI_COD = A.arti_cod AND
                A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
                A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND
                (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
                DEVT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) AND ((DEVT_REMID = 0) or (DEVT_REMID IS NULL))
            /*ORDER BY D.ARTI_COD, DEVT_FECHA, DEVT_ID, DVDE_ITEM*/
            INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO, :DTO,
                :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
            DO
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            CANTIDAD = CANTIDAD * -1;
            BASE = BASE * -1;
            IVA = IVA * -1;
            CONSUMO = CONSUMO * -1;
            SUSPEND;
            END
        END
    if (BIN_AND(TIPO, 8) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 34 INTO :NOMTIPO;
        FOR SELECT P.PREF_PRE, PEDI_NUMERO, PEDI_FECHA, D.ARTI_COD, PEDE_CANT * PEDE_FACTOR, (PEDE_TOTAL-PEDE_IVAMONTO-PEDE_CONSUMO)*PEDI_FACTOR,
                PEDE_IVAMONTO*PEDI_FACTOR, PEDE_CONSUMO, PEDE_DTOPORC,
            ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD 
            FROM PEDIDOS P, PEDIDOS_DETALLE D, PREFIJOS R, ARTICULO A WHERE P.PTVT_ID >= :PTOINI AND P.PTVT_ID <= :PTOFIN AND
                P.PEDI_ID = D.PEDI_ID AND P.PREF_PRE = R.PREF_PRE AND R.TIDO_COD = 34 AND D.ARTI_COD = A.arti_cod AND
                A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
                A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND
                (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
                PEDI_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            /*ORDER BY D.ARTI_COD, PEDI_FECHA, PEDI_ID, PEDE_ITEM*/
            INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO, :DTO,
                :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
            DO
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            SUSPEND;
            END
        END
    if (BIN_AND(TIPO, 16) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 35 INTO :NOMTIPO;
        FOR SELECT C.PREF_PRE, COTI_NUMERO, COTI_FECHA, D.ARTI_COD, CTDE_CANT * CTDE_FACTOR, (CTDE_TOTAL-CTDE_IVAMONTO-CTDE_CONSUMO)*COTI_FACTOR,
                CTDE_IVAMONTO*COTI_FACTOR, CTDE_CONSUMO, CTDE_DTOPORC,
            ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD 
            FROM COTIZACIONES C, COTIZACIONES_DETALLE D, PREFIJOS P, ARTICULO A WHERE C.PTVT_ID >= :PTOINI AND C.PTVT_ID <= :PTOFIN AND
                C.COTI_ID = D.COTI_ID AND P.PREF_PRE = C.PREF_PRE AND P.TIDO_COD = 35 AND D.ARTI_COD = A.arti_cod AND
                A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
                A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND COTI_FECHA >= :FECINI AND COTI_FECHA <= :FECFIN AND
                (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
                COTI_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            /*ORDER BY D.ARTI_COD, COTI_FECHA, COTI_ID, CTDE_ITEM*/
            INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO, :DTO,
                :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
            DO
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            SUSPEND;
            END
        END
    END
  ELSE
    BEGIN
    if (BIN_AND(TIPO, 1) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 31 INTO :NOMTIPO;
        FOR SELECT MAX(D.ARTI_COD), SUM(FADE_CANT * FADE_FACTOR), SUM((FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO)*FACT_FACTOR),
            SUM(FACT_FACTOR*FADE_IVAMONTO), SUM(FADE_CONSUMO), MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD), MAX(FACT_TRANSP)
            FROM FACTURAS_DETALLE D, FACTURAS F, PREFIJOS P, ARTICULO A WHERE F.PTVT_ID >= :PTOINI AND F.PTVT_ID <= :PTOFIN AND
            F.FACT_ID = D.FACT_ID AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND D.ARTI_COD = A.arti_cod AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            FACT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) and substring(a.arti_cod from 1 FOR 2) <> '.t'
            GROUP BY FACT_TRANSP, D.ARTI_COD
            INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,
            :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :transp
            DO
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            if (CEROS = 'S') then
                SUSPEND;
            ELSE
                if ((BASE <> 0) AND (CANTIDAD <> 0)) then
                    SUSPEND;
            END
        END

    if (BIN_AND(TIPO, 2) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 32 INTO :NOMTIPO;
        FOR SELECT MAX(D.ARTI_COD), SUM(RVDE_CANT * RVDE_FACTOR), SUM((RVDE_TOTAL-RVDE_IVAMONTO-RVDE_CONSUMO)), SUM(RVDE_IVAMONTO),
            SUM(RVDE_CONSUMO), MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD), MAX(REVT_TRANSP)
            FROM REMISIONES_VENTA_DETALLE D, REMISIONES_VENTA R, PREFIJOS P, ARTICULO A WHERE R.PTVT_ID >= :PTOINI AND R.PTVT_ID <= :PTOFIN AND
            R.REVT_ID = D.REVT_ID AND P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = 32 AND D.ARTI_COD = A.arti_cod AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            REVT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY REVT_TRANSP, D.ARTI_COD
            INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,
            :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :transp
            DO
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            if (CEROS = 'S') then
                SUSPEND;
            ELSE
                if ((BASE <> 0) AND (CANTIDAD <> 0)) then
                    SUSPEND;
            END
        END
    END
END
^

SET TERM ; ^


SET TERM ^ ;

CREATE OR ALTER PROCEDURE REP_UTILIDAD_VENTAS(
    TIPO INTEGER,
    DETALLE CHAR(1),
    FECINI DATE,
    FECFIN DATE,
    ARTINI VARCHAR(15),
    ARTFIN VARCHAR(15),
    GRPINI VARCHAR(3),
    GRPFIN VARCHAR(3),
    ORDEN CHAR(1),
    AGRUPA CHAR(1),
    CEROS CHAR(1),
    SUBEMPRESA INTEGER)
RETURNS (
    ARTICULO VARCHAR(15),
    DESCRIPCION VARCHAR(60),
    CODGRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    CODSUBG VARCHAR(3),
    NOMSUBG VARCHAR(30),
    CODMARC VARCHAR(3),
    NOMMARC VARCHAR(30),
    UNIDAD VARCHAR(8),
    CANTIDAD NUMERIC(18,4),
    BASE NUMERIC(18,4),
    COSTO NUMERIC(18,4),
    UTILIDAD NUMERIC(18,4),
    PORC NUMERIC(9,2),
    IVA NUMERIC(18,4),
    CONSUMO NUMERIC(18,4),
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    TIPODOC INTEGER)
AS
DECLARE VARIABLE COSTOUNIT NUMERIC(18,4);
declare variable CODINI VARCHAR(15);
declare variable CODFIN VARCHAR(15);
declare variable DESINI VARCHAR(15);
declare variable DESFIN VARCHAR(15);
declare variable MARINI VARCHAR(3);
declare variable MARFIN VARCHAR(3);
declare variable UOM VARCHAR(20);
declare variable NUMROWS INTEGER;
BEGIN
if (ORDEN = 'C') then
    BEGIN
    CODINI = ARTINI;
    CODFIN = ARTFIN;
    DESINI = '';
    DESFIN = 'zz';
    END
ELSE
    BEGIN
    DESINI = ARTINI;
    DESFIN = ARTFIN;
    CODINI = '';
    CODFIN = 'zz';
    END
if (AGRUPA = 'G') then
    BEGIN
    MARINI = '';
    MARFIN = 'zz';
    END
ELSE
    if (AGRUPA = 'M') then
        BEGIN
        MARINI = GRPINI;
        MARFIN = GRPFIN;
        GRPINI = '';
        GRPFIN = 'zz';
        END
    ELSE
        BEGIN
        MARINI = '';
        MARFIN = 'zz';
        GRPINI = '';
        GRPFIN = 'zz';
        END
EXECUTE PROCEDURE lee_configuracion ('FACTURACION', 'ARTICULOS', 'SUGERIR PRECIOS CON PORCENTAJE DE MARGEN O UTILIDAD') returning_values (:UOM);
if (DETALLE = 'N') then
    BEGIN
    if (BIN_AND(TIPO, 1) <> 0) then
        BEGIN
        TIPODOC = 31;
        /* BORRA LA TABLA AUXILIAR */
        DELETE FROM reportes_aux WHERE REPA_ID = 2 AND REPA_USER = USER;

        FOR SELECT MAX(D.ARTI_COD), SUM(FADE_CANT * FADE_FACTOR), SUM((FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO)*FACT_FACTOR), SUM(FADE_IVAMONTO*FACT_FACTOR), SUM(FADE_CONSUMO),
            MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD), SUM(COST_SALP)
            FROM FACTURAS_DETALLE D, FACTURAS F, PREFIJOS P, ARTICULO A, movimiento_articulo m, costos c
            WHERE F.FACT_ID = D.FACT_ID AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND D.ARTI_COD = A.arti_cod AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            F.fact_id = M.mvar_idref AND M.mvar_tipodoc = 31 AND M.mvar_item = D.fade_item AND M.mvar_cons = C.cost_idmov AND
            FACT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) and substring(a.arti_cod from 1 FOR 2) <> '.t'
            GROUP BY D.ARTI_COD
            INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,
            :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :COSTO
            DO
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
/*            EXECUTE PROCEDURE costo_promedio (:ARTICULO, :FECFIN) RETURNING_VALUES (:COSTOUNIT);*/
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
/*            COSTO = cantidad * COSTOUNIT;*/
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                if (COSTO > 0) then
                    PORC = UTILIDAD * 100 / COSTO;
                ELSE
                    PORC = 100;
            else
                if (BASE > 0) then
                    PORC = UTILIDAD * 100 / BASE;
                ELSE
                    PORC = 0;
            if (CEROS = 'S') then
                INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (2, USER, :ARTICULO);
            SUSPEND;
            END /* FOR */
        if (CEROS = 'S') then
            BEGIN
            COSTO = 0;
            UTILIDAD = 0;
            PORC = 0;
            /* agregue los articulos sin factura */
            FOR SELECT ARTI_COD, 0, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND
                    A.ARTI_DES <= :DESFIN AND A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND
                    (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN)))
                INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,:DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                DO
                BEGIN
                SELECT COUNT(REPA_ARTICULO) FROM REPORTES_AUX WHERE REPA_ID = 2 AND REPA_USER = USER AND REPA_ARTICULO = :articulo INTO :numrows;
                if (numrows = 0) then
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        END
    if (BIN_AND(TIPO, 2) <> 0) then
        BEGIN
        TIPODOC = 32;
        /* BORRA LA TABLA AUXILIAR */
        DELETE FROM reportes_aux WHERE REPA_ID = 2 AND REPA_USER = USER;

        FOR SELECT MAX(D.ARTI_COD), SUM(RVDE_CANT * RVDE_FACTOR), SUM(RVDE_TOTAL-RVDE_IVAMONTO-RVDE_CONSUMO), SUM(RVDE_IVAMONTO), SUM(RVDE_CONSUMO),
            MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD), SUM(COST_SALP)
            FROM REMISIONES_VENTA_DETALLE D, REMISIONES_VENTA R, PREFIJOS P, ARTICULO A, movimiento_articulo m, costos c
            WHERE R.REVT_ID = D.REVT_ID AND P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = 32 AND D.ARTI_COD = A.arti_cod AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            R.revt_id = M.mvar_idref AND M.mvar_tipodoc = 32 AND M.mvar_item = D.rvde_item AND M.mvar_cons = C.cost_idmov AND
            REVT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY D.ARTI_COD
            INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,
            :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :COSTO
            DO
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
/*            EXECUTE PROCEDURE costo_promedio (:ARTICULO, :FECFIN) RETURNING_VALUES (:COSTOUNIT); */
/*            COSTO = cantidad * COSTOUNIT;*/
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                if (COSTO > 0) then
                    PORC = UTILIDAD * 100 / COSTO;
                ELSE
                    PORC = 100;
            else
                if (BASE > 0) then
                    PORC = UTILIDAD * 100 / BASE;
                ELSE
                    PORC = 0;
            if (CEROS = 'S') then
                INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (2, USER, :ARTICULO);
            SUSPEND;
            END /* FOR */
        if (CEROS = 'S') then
            BEGIN
            COSTO = 0;
            UTILIDAD = 0;
            PORC = 0;
            /* agregue los articulos sin factura */
            FOR SELECT ARTI_COD, 0, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND
                    A.ARTI_DES <= :DESFIN AND A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND
                    (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN)))
                INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,:DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                DO
                BEGIN
                SELECT COUNT(REPA_ARTICULO) FROM REPORTES_AUX WHERE REPA_ID = 2 AND REPA_USER = USER AND REPA_ARTICULO = :articulo INTO :numrows;
                if (numrows = 0) then
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        END
    if (BIN_AND(TIPO, 4) <> 0) then
        BEGIN
        TIPODOC = 33;
        /* BORRA LA TABLA AUXILIAR */
        DELETE FROM reportes_aux WHERE REPA_ID = 2 AND REPA_USER = USER;

        FOR SELECT MAX(D.ARTI_COD), SUM(DVDE_CANT * DVDE_FACTOR), SUM((DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO)*DEVT_FACTOR), SUM(DVDE_IVAMONTO*DEVT_FACTOR), SUM(DVDE_CONSUMO),
            MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD), SUM(COST_ENTP)
            FROM devoluciones_ventas_detalle D, DEVOLUCIONES_VENTAS V, PREFIJOS P, ARTICULO A, MOVIMIENTO_ARTICULO M, COSTOS C
            WHERE V.DEVT_ID = D.DEVT_ID AND P.PREF_PRE = V.PREF_PRE AND P.TIDO_COD = 33 AND D.ARTI_COD = A.arti_cod AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            V.devt_id = M.mvar_idref AND M.mvar_tipodoc = 33 AND M.mvar_item = D.dvde_item AND M.mvar_cons = C.cost_idmov AND
            DEVT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY D.ARTI_COD
            INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,
            :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :COSTO
            DO
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            else
                CANTIDAD = CANTIDAD * -1;
            if (BASE IS NULL) then
                BASE = 0;
            else
                BASE = BASE * -1;
            if (IVA IS NULL) then
                IVA = 0;
            else
                IVA = IVA * -1;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            else
                CONSUMO = CONSUMO * -1;
/*            EXECUTE PROCEDURE costo_promedio (:ARTICULO, :FECFIN) RETURNING_VALUES (:COSTOUNIT);*/
/*            COSTO = cantidad * COSTOUNIT;*/
            COSTO = costo * -1;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                if (COSTO > 0) then
                    PORC = UTILIDAD * 100 / COSTO;
                ELSE
                    PORC = 100;
            else
                if (BASE > 0) then
                    PORC = UTILIDAD * 100 / BASE;
                ELSE
                    PORC = 0;
            if (CEROS = 'S') then
                INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (2, USER, :ARTICULO);
            SUSPEND;
            END /* FOR */
        if (CEROS = 'S') then
            BEGIN
            COSTO = 0;
            UTILIDAD = 0;
            PORC = 0;
            /* agregue los articulos sin factura */
            FOR SELECT ARTI_COD, 0, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND
                    A.ARTI_DES <= :DESFIN AND A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND
                    (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN)))
                INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,:DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                DO
                BEGIN
                SELECT COUNT(REPA_ARTICULO) FROM REPORTES_AUX WHERE REPA_ID = 2 AND REPA_USER = USER AND REPA_ARTICULO = :articulo INTO :numrows;
                if (numrows = 0) then
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        END
    if (BIN_AND(TIPO, 8) <> 0) then
        BEGIN
        TIPODOC = 34;
        /* BORRA LA TABLA AUXILIAR */
        DELETE FROM reportes_aux WHERE REPA_ID = 2 AND REPA_USER = USER;

        FOR SELECT MAX(D.ARTI_COD), SUM(PEDE_CANT * PEDE_FACTOR), SUM((PEDE_TOTAL-PEDE_IVAMONTO-PEDE_CONSUMO)*PEDI_FACTOR), SUM(PEDE_IVAMONTO*PEDI_FACTOR), SUM(PEDE_CONSUMO),
            MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD)
            FROM PEDIDOS_DETALLE D, PEDIDOS P, PREFIJOS R, ARTICULO A
            WHERE P.PEDI_ID = D.PEDI_ID AND P.PREF_PRE = R.PREF_PRE AND R.TIDO_COD = 34 AND D.ARTI_COD = A.arti_cod AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            PEDI_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY D.ARTI_COD
            INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,
            :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
            DO
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            EXECUTE PROCEDURE costo_promedio (:ARTICULO, :FECFIN) RETURNING_VALUES (:COSTOUNIT);
            COSTO = cantidad * COSTOUNIT;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                if (COSTO > 0) then
                    PORC = UTILIDAD * 100 / COSTO;
                ELSE
                    PORC = 100;
            else
                if (BASE > 0) then
                    PORC = UTILIDAD * 100 / BASE;
                ELSE
                    PORC = 0;
            if (CEROS = 'S') then
                INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (2, USER, :ARTICULO);
            SUSPEND;
            END /* FOR */
        if (CEROS = 'S') then
            BEGIN
            COSTO = 0;
            UTILIDAD = 0;
            PORC = 0;
            /* agregue los articulos sin factura */
            FOR SELECT ARTI_COD, 0, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND
                    A.ARTI_DES <= :DESFIN AND A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND
                    (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN)))
                INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,:DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                DO
                BEGIN
                SELECT COUNT(REPA_ARTICULO) FROM REPORTES_AUX WHERE REPA_ID = 2 AND REPA_USER = USER AND REPA_ARTICULO = :articulo INTO :numrows;
                if (numrows = 0) then
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        END
    if (BIN_AND(TIPO, 16) <> 0) then
        BEGIN
        TIPODOC = 35;
        /* BORRA LA TABLA AUXILIAR */
        DELETE FROM reportes_aux WHERE REPA_ID = 2 AND REPA_USER = USER;

        FOR SELECT MAX(D.ARTI_COD), SUM(CTDE_CANT * CTDE_FACTOR), SUM((CTDE_TOTAL-CTDE_IVAMONTO-CTDE_CONSUMO)*COTI_FACTOR), SUM(CTDE_IVAMONTO), SUM(CTDE_CONSUMO),
            MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD)
            FROM COTIZACIONES_DETALLE D, COTIZACIONES C, PREFIJOS P, ARTICULO A
            WHERE C.COTI_ID = D.COTI_ID AND P.PREF_PRE = C.PREF_PRE AND P.TIDO_COD = 35 AND D.ARTI_COD = A.arti_cod AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND COTI_FECHA >= :FECINI AND COTI_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            COTI_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY D.ARTI_COD
            INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,
            :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
            DO
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            EXECUTE PROCEDURE costo_promedio (:ARTICULO, :FECFIN) RETURNING_VALUES (:COSTOUNIT);
            COSTO = cantidad * COSTOUNIT;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                if (COSTO > 0) then
                    PORC = UTILIDAD * 100 / COSTO;
                ELSE
                    PORC = 100;
            else
                if (BASE > 0) then
                    PORC = UTILIDAD * 100 / BASE;
                ELSE
                    PORC = 0;
            if (CEROS = 'S') then
                INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (2, USER, :ARTICULO);
            SUSPEND;
            END /* FOR */
        if (CEROS = 'S') then
            BEGIN
            COSTO = 0;
            UTILIDAD = 0;
            PORC = 0;
            /* agregue los articulos sin factura */
            FOR SELECT ARTI_COD, 0, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND
                    A.ARTI_DES <= :DESFIN AND A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND
                    (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN)))
                INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,:DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                DO
                BEGIN
                SELECT COUNT(REPA_ARTICULO) FROM REPORTES_AUX WHERE REPA_ID = 2 AND REPA_USER = USER AND REPA_ARTICULO = :articulo INTO :numrows;
                if (numrows = 0) then
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        END
    END
ELSE
    BEGIN
    if (BIN_AND(TIPO, 1) <> 0) then
        BEGIN
        TIPODOC = 31;
        FOR SELECT F.PREF_PRE, FACT_NUMERO, FACT_FECHA, D.ARTI_COD, FADE_CANT * FADE_FACTOR, (FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO)*FACT_FACTOR, FADE_IVAMONTO*FACT_FACTOR, FADE_CONSUMO,
            ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD, COST_SALP
            FROM FACTURAS F, FACTURAS_DETALLE D, PREFIJOS P, ARTICULO A, MOVIMIENTO_ARTICULO M, COSTOS C
            WHERE F.FACT_ID = D.FACT_ID AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND D.ARTI_COD = A.arti_cod AND
                A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
                A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND FACT_FECHA >= :FECINI AND
                (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
                F.fact_id = M.mvar_idref AND M.mvar_tipodoc = 31 AND M.mvar_item = D.fade_item AND M.mvar_cons = C.cost_idmov AND
                FACT_FECHA <= :FECFIN AND FACT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) and substring(a.arti_cod from 1 FOR 2) <> '.t'
            ORDER BY D.ARTI_COD, FACT_FECHA, F.FACT_ID, FADE_ITEM
            INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,
                :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :COSTO
            DO
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
/*            EXECUTE PROCEDURE costo_promedio (:ARTICULO, :FECHA) RETURNING_VALUES (:COSTOUNIT);*/
/*            COSTO = COSTOUNIT * CANTIDAD;*/
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                if (COSTO > 0) then
                    PORC = UTILIDAD * 100 / COSTO;
                ELSE
                    PORC = 100;
            else
                if (BASE > 0) then
                    PORC = UTILIDAD * 100 / BASE;
                ELSE
                    PORC = 0;
            SUSPEND;
            END
        END
    if (BIN_AND(TIPO, 2) <> 0) then
        BEGIN
        TIPODOC = 32;
        FOR SELECT R.PREF_PRE, REVT_NUMERO, REVT_FECHA, D.ARTI_COD, RVDE_CANT * RVDE_FACTOR, RVDE_TOTAL-RVDE_IVAMONTO-RVDE_CONSUMO, RVDE_IVAMONTO, RVDE_CONSUMO,
            ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD, COST_SALP
            FROM REMISIONES_VENTA R, REMISIONES_VENTA_DETALLE D, PREFIJOS P, ARTICULO A, MOVIMIENTO_ARTICULO M, COSTOS C
            WHERE R.REVT_ID = D.REVT_ID AND P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = 32 AND D.ARTI_COD = A.arti_cod AND
                A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
                A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN AND
                R.revt_id = M.mvar_idref AND M.mvar_tipodoc = 32 AND M.mvar_item = D.rvde_item AND M.mvar_cons = C.cost_idmov AND
                (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
                REVT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            ORDER BY D.ARTI_COD, REVT_FECHA, R.REVT_ID, RVDE_ITEM
            INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,
                :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :COSTO
            DO
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            EXECUTE PROCEDURE costo_promedio (:ARTICULO, :FECHA) RETURNING_VALUES (:COSTOUNIT);
            COSTO = COSTOUNIT * CANTIDAD;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                if (COSTO > 0) then
                    PORC = UTILIDAD * 100 / COSTO;
                ELSE
                    PORC = 100;
            else
                if (BASE > 0) then
                    PORC = UTILIDAD * 100 / BASE;
                ELSE
                    PORC = 0;
            SUSPEND;
            END
        END
    if (BIN_AND(TIPO, 4) <> 0) then
        BEGIN
        TIPODOC = 33;
        FOR SELECT V.PREF_PRE, DEVT_NUMERO, DEVT_FECHA, D.ARTI_COD, DVDE_CANT * DVDE_FACTOR, (DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO)*DEVT_FACTOR, DVDE_IVAMONTO*DEVT_FACTOR, DVDE_CONSUMO,
            ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD, COST_ENTP
            FROM DEVOLUCIONES_VENTAS V, DEVOLUCIONES_VENTAS_DETALLE D, PREFIJOS P, ARTICULO A, MOVIMIENTO_ARTICULO M, COSTOS C
            WHERE V.DEVT_ID = D.DEVT_ID AND P.PREF_PRE = V.PREF_PRE AND P.TIDO_COD = 33 AND D.ARTI_COD = A.arti_cod AND
                A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
                A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND
                (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
                V.devt_id = M.mvar_idref AND M.mvar_tipodoc = 33 AND M.mvar_item = D.dvde_item AND M.mvar_cons = C.cost_idmov AND
                DEVT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            ORDER BY D.ARTI_COD, DEVT_FECHA, V.DEVT_ID, DVDE_ITEM
            INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,
                :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :COSTO
            DO
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            EXECUTE PROCEDURE costo_promedio (:ARTICULO, :FECHA) RETURNING_VALUES (:COSTOUNIT);
            BASE = BASE * -1;
            CANTIDAD = CANTIDAD * -1;
            IVA = IVA * -1;
            CONSUMO = CONSUMO * -1;
            COSTO = COSTOUNIT * CANTIDAD;
            COSTO = COSTO * -1;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                if (COSTO > 0) then
                    PORC = UTILIDAD * 100 / COSTO;
                ELSE
                    PORC = 100;
            else
                if (BASE > 0) then
                    PORC = UTILIDAD * 100 / BASE;
                ELSE
                    PORC = 0;
            SUSPEND;
            END
        END
    if (BIN_AND(TIPO, 8) <> 0) then
        BEGIN
        TIPODOC = 34;
        FOR SELECT P.PREF_PRE, PEDI_NUMERO, PEDI_FECHA, D.ARTI_COD, PEDE_CANT * PEDE_FACTOR, (PEDE_TOTAL-PEDE_IVAMONTO-PEDE_CONSUMO)*PEDI_FACTOR, PEDE_IVAMONTO*PEDI_FACTOR, PEDE_CONSUMO,
            ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD 
            FROM PEDIDOS P, PEDIDOS_DETALLE D, PREFIJOS R, ARTICULO A
            WHERE P.PEDI_ID = D.PEDI_ID AND P.PREF_PRE = R.PREF_PRE AND R.TIDO_COD = 34 AND D.ARTI_COD = A.arti_cod AND
                A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
                A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND
                (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
                PEDI_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            ORDER BY D.ARTI_COD, PEDI_FECHA, P.PEDI_ID, PEDE_ITEM
            INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,
                :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
            DO
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            EXECUTE PROCEDURE costo_promedio (:ARTICULO, :FECHA) RETURNING_VALUES (:COSTOUNIT);
            COSTO = COSTOUNIT * CANTIDAD;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                if (COSTO > 0) then
                    PORC = UTILIDAD * 100 / COSTO;
                ELSE
                    PORC = 100;
            else
                if (BASE > 0) then
                    PORC = UTILIDAD * 100 / BASE;
                ELSE
                    PORC = 0;
            SUSPEND;
            END
        END
    if (BIN_AND(TIPO, 16) <> 0) then
        BEGIN
        TIPODOC = 35;
        FOR SELECT C.PREF_PRE, COTI_NUMERO, COTI_FECHA, D.ARTI_COD, CTDE_CANT * CTDE_FACTOR, (CTDE_TOTAL-CTDE_IVAMONTO-CTDE_CONSUMO)*COTI_FACTOR, CTDE_IVAMONTO*COTI_FACTOR, CTDE_CONSUMO,
            ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD 
            FROM COTIZACIONES C, COTIZACIONES_DETALLE D, PREFIJOS P, ARTICULO A
            WHERE C.COTI_ID = D.COTI_ID AND P.PREF_PRE = C.PREF_PRE AND P.TIDO_COD = 35 AND D.ARTI_COD = A.arti_cod AND
                A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
                A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND COTI_FECHA >= :FECINI AND COTI_FECHA <= :FECFIN AND
                (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
                COTI_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            ORDER BY D.ARTI_COD, COTI_FECHA, C.COTI_ID, CTDE_ITEM
            INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,
                :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
            DO
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            EXECUTE PROCEDURE costo_promedio (:ARTICULO, :FECHA) RETURNING_VALUES (:COSTOUNIT);
            COSTO = COSTOUNIT * CANTIDAD;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                if (COSTO > 0) then
                    PORC = UTILIDAD * 100 / COSTO;
                ELSE
                    PORC = 100;
            else
                if (BASE > 0) then
                    PORC = UTILIDAD * 100 / BASE;
                ELSE
                    PORC = 0;
            SUSPEND;
            END
        END
    END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER PROCEDURE REP_ARTICULOS_CLIENTE(
    TIPO INTEGER,
    DETALLE CHAR(1),
    TERINI VARCHAR(20),
    TERFIN VARCHAR(20),
    FECINI DATE,
    FECFIN DATE,
    ARTINI VARCHAR(15),
    ARTFIN VARCHAR(15),
    ORDEN CHAR(1),
    CEROS CHAR(1),
    SUBEMPRESA INTEGER)
RETURNS (
    NIT VARCHAR(20),
    NOMBRE VARCHAR(60),
    TELEFONO VARCHAR(40),
    CIUDAD VARCHAR(40),
    CODZONA VARCHAR(2),
    NOMZONA VARCHAR(30),
    NOMTIPO VARCHAR(50),
    ARTICULO VARCHAR(15),
    DESCRIPCION VARCHAR(60),
    CODGRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    CODSUBG VARCHAR(3),
    NOMSUBG VARCHAR(30),
    CODMARC VARCHAR(3),
    NOMMARC VARCHAR(30),
    UNIDAD VARCHAR(8),
    CANTIDAD NUMERIC(18,4),
    BASE NUMERIC(18,2),
    IVA NUMERIC(18,2),
    CONSUMO NUMERIC(18,2),
    TOTAL NUMERIC(18,2),
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    DTO NUMERIC(9,2),
    TIPODOC INTEGER)
AS
declare variable CODINI VARCHAR(15);
declare variable CODFIN VARCHAR(15);
declare variable DESINI VARCHAR(15);
declare variable DESFIN VARCHAR(15);
BEGIN
if (ORDEN = 'C') then
    BEGIN
    CODINI = ARTINI;
    CODFIN = ARTFIN;
    DESINI = '';
    DESFIN = 'zz';
    END
ELSE
    BEGIN
    DESINI = ARTINI;
    DESFIN = ARTFIN;
    CODINI = '';
    CODFIN = 'zz';
    END

SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = :TIPO INTO :NOMTIPO;
if (DETALLE = 'N') then
    BEGIN
    if (BIN_AND(TIPO, 1) <> 0) then
        BEGIN
        TIPODOC = 31;
        FOR SELECT SUM(FADE_CANT * FADE_FACTOR), SUM((FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO)*FACT_FACTOR), SUM(FADE_IVAMONTO*FACT_FACTOR), SUM(FADE_CONSUMO), SUM(FADE_TOTAL*FACT_FACTOR),
            max(D.ARTI_COD), MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD), MAX(TERC_NIT)
            FROM FACTURAS_DETALLE D, FACTURAS F, PREFIJOS P, ARTICULO A
            WHERE F.FACT_ID = D.FACT_ID AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND D.ARTI_COD = A.ARTI_COD AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            TERC_NIT >= :TERINI AND TERC_NIT <= :TERFIN AND FACT_ANULADO = 'N' AND
            FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) and substring(a.arti_cod from 1 FOR 2) <> '.t'
            GROUP BY TERC_NIT, D.ARTI_COD
            INTO :CANTIDAD, :BASE, :IVA, :CONSUMO, :TOTAL, :ARTICULO, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :NIT
            DO
            BEGIN
            select TERC_NOM, TERC_TEL, TERC_CIU, C.ZONA_COD from terceros T, CLIENTES C
                where C.TERC_NIT = T.TERC_NIT AND T.TERC_NIT = :NIT
                INTO :NOMBRE, :TELEFONO, :CIUDAD, :CODZONA;
            SELECT ZONA_NOM FROM ZONAS WHERE ZONA_COD = :CODZONA INTO :NOMZONA;
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            if (CEROS = 'S') then
                SUSPEND;
            ELSE
                if ((BASE <> 0) AND (CANTIDAD <> 0)) then
                    SUSPEND;
            END
        END
    if (BIN_AND(TIPO, 2) <> 0) then
        BEGIN
        TIPODOC = 32;
        FOR SELECT SUM(RVDE_CANT * RVDE_FACTOR), SUM(RVDE_TOTAL-RVDE_IVAMONTO-RVDE_CONSUMO), SUM(RVDE_IVAMONTO), SUM(RVDE_CONSUMO), SUM(RVDE_TOTAL),
            max(D.ARTI_COD), MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD), MAX(TERC_NIT)
            FROM REMISIONES_VENTA_DETALLE D, REMISIONES_VENTA R, PREFIJOS P, ARTICULO A
            WHERE R.REVT_ID = D.REVT_ID AND P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = 32 AND D.ARTI_COD = A.ARTI_COD AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            TERC_NIT >= :TERINI AND TERC_NIT <= :TERFIN AND REVT_FECHA >= :FECINI AND
            REVT_FECHA <= :FECFIN AND REVT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY TERC_NIT, D.ARTI_COD
            INTO :CANTIDAD, :BASE, :IVA, :CONSUMO, :TOTAL, :ARTICULO, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :NIT
            DO
            BEGIN
            select TERC_NOM, TERC_TEL, TERC_CIU, C.ZONA_COD from terceros T, CLIENTES C
                where C.TERC_NIT = T.TERC_NIT AND T.TERC_NIT = :NIT
                INTO :NOMBRE, :TELEFONO, :CIUDAD, :CODZONA;
            SELECT ZONA_NOM FROM ZONAS WHERE ZONA_COD = :CODZONA INTO :NOMZONA;
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            if (CEROS = 'S') then
                SUSPEND;
            ELSE
                if ((BASE <> 0) AND (CANTIDAD <> 0)) then
                    SUSPEND;
            END
        END
    if (BIN_AND(TIPO, 4) <> 0) then
        BEGIN
        TIPODOC = 33;
        FOR SELECT SUM(DVDE_CANT * DVDE_FACTOR), SUM((DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO)*DEVT_FACTOR), SUM(DVDE_IVAMONTO*DEVT_FACTOR), SUM(DVDE_CONSUMO), SUM(DVDE_TOTAL*DEVT_FACTOR),
            max(D.ARTI_COD), MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD), MAX(TERC_NIT)
            FROM devoluciones_ventas_detalle D, DEVOLUCIONES_VENTAS V, PREFIJOS P, ARTICULO A
            WHERE V.DEVT_ID = D.DEVT_ID AND P.PREF_PRE = V.PREF_PRE AND P.TIDO_COD = 33 AND D.ARTI_COD = A.ARTI_COD AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            TERC_NIT >= :TERINI AND TERC_NIT <= :TERFIN AND DEVT_FECHA >= :FECINI AND
            DEVT_FECHA <= :FECFIN AND DEVT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY TERC_NIT, D.ARTI_COD
            INTO :CANTIDAD, :BASE, :IVA, :CONSUMO, :TOTAL, :ARTICULO, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :NIT
            DO
            BEGIN
            select TERC_NOM, TERC_TEL, TERC_CIU, C.ZONA_COD from terceros T, CLIENTES C
                where C.TERC_NIT = T.TERC_NIT AND T.TERC_NIT = :NIT
                INTO :NOMBRE, :TELEFONO, :CIUDAD, :CODZONA;
            SELECT ZONA_NOM FROM ZONAS WHERE ZONA_COD = :CODZONA INTO :NOMZONA;
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            CANTIDAD = CANTIDAD * -1;
            BASE = BASE * -1;
            TOTAL = TOTAL * -1;
            IVA = IVA * -1;
            CONSUMO = CONSUMO * -1;
            if (CEROS = 'S') then
                SUSPEND;
            ELSE
                if ((BASE <> 0) AND (CANTIDAD <> 0)) then
                    SUSPEND;
            END
        END
    if (BIN_AND(TIPO, 8) <> 0) then
        BEGIN
        TIPODOC = 34;
        FOR SELECT SUM(PEDE_CANT * PEDE_FACTOR), SUM((PEDE_TOTAL-PEDE_IVAMONTO-PEDE_CONSUMO)*PEDI_FACTOR), SUM(PEDE_IVAMONTO*PEDI_FACTOR), SUM(PEDE_CONSUMO), SUM(PEDE_TOTAL*PEDI_FACTOR),
            max(D.ARTI_COD), MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD), MAX(TERC_NIT)
            FROM PEDIDOS_DETALLE D, PEDIDOS P, PREFIJOS R, ARTICULO A
            WHERE P.PEDI_ID = D.PEDI_ID AND R.PREF_PRE = P.PREF_PRE AND R.TIDO_COD = 34 AND D.ARTI_COD = A.ARTI_COD AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            TERC_NIT >= :TERINI AND TERC_NIT <= :TERFIN AND PEDI_FECHA >= :FECINI AND
            PEDI_FECHA <= :FECFIN AND PEDI_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY TERC_NIT, D.ARTI_COD
            INTO :CANTIDAD, :BASE, :IVA, :CONSUMO, :TOTAL, :ARTICULO, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :NIT
            DO
            BEGIN
            select TERC_NOM, TERC_TEL, TERC_CIU, C.ZONA_COD from terceros T, CLIENTES C
                where C.TERC_NIT = T.TERC_NIT AND T.TERC_NIT = :NIT
                INTO :NOMBRE, :TELEFONO, :CIUDAD, :CODZONA;
            SELECT ZONA_NOM FROM ZONAS WHERE ZONA_COD = :CODZONA INTO :NOMZONA;
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            if (CEROS = 'S') then
                SUSPEND;
            ELSE
                if ((BASE <> 0) AND (CANTIDAD <> 0)) then
                    SUSPEND;
            END
        END
    if (BIN_AND(TIPO, 16) <> 0) then
        BEGIN
        TIPODOC = 35;
        FOR SELECT SUM(CTDE_CANT * CTDE_FACTOR), SUM((CTDE_TOTAL-CTDE_IVAMONTO-CTDE_CONSUMO)*COTI_FACTOR), SUM(CTDE_IVAMONTO*COTI_FACTOR), SUM(CTDE_CONSUMO), SUM(CTDE_TOTAL*COTI_FACTOR),
            max(D.ARTI_COD), MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD), MAX(TERC_NIT)
            FROM COTIZACIONES_DETALLE D, COTIZACIONES C, PREFIJOS P, ARTICULO A
            WHERE C.COTI_ID = D.COTI_ID AND P.PREF_PRE = C.PREF_PRE AND P.TIDO_COD = 35 AND D.ARTI_COD = A.ARTI_COD AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            TERC_NIT >= :TERINI AND TERC_NIT <= :TERFIN AND COTI_FECHA >= :FECINI AND
            COTI_FECHA <= :FECFIN AND COTI_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY TERC_NIT, D.ARTI_COD
            INTO :CANTIDAD, :BASE, :IVA, :CONSUMO, :TOTAL, :ARTICULO, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :NIT
            DO
            BEGIN
            select TERC_NOM, TERC_TEL, TERC_CIU, C.ZONA_COD from terceros T, CLIENTES C
                where C.TERC_NIT = T.TERC_NIT AND T.TERC_NIT = :NIT
                INTO :NOMBRE, :TELEFONO, :CIUDAD, :CODZONA;
            SELECT ZONA_NOM FROM ZONAS WHERE ZONA_COD = :CODZONA INTO :NOMZONA;
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            if (CEROS = 'S') then
                SUSPEND;
            ELSE
                if ((BASE <> 0) AND (CANTIDAD <> 0)) then
                    SUSPEND;
            END
        END
    END
ELSE
    BEGIN
    if (BIN_AND(TIPO, 1) <> 0) then
        BEGIN
        TIPODOC = 31;
        FOR SELECT F.PREF_PRE, FACT_NUMERO, FACT_FECHA, FADE_CANT * FADE_FACTOR, FADE_PRUNIT/FADE_FACTOR*FACT_FACTOR, FADE_IVAMONTO*FACT_FACTOR, FADE_CONSUMO, FADE_DTOPORC, FADE_TOTAL*FACT_FACTOR,
            D.ARTI_COD, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD, TERC_NIT
            FROM FACTURAS F, FACTURAS_DETALLE D, PREFIJOS P, ARTICULO A
            WHERE F.FACT_ID = D.FACT_ID AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND D.ARTI_COD = A.ARTI_COD AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            TERC_NIT >= :TERINI AND TERC_NIT <= :TERFIN AND FACT_FECHA >= :FECINI AND
            FACT_FECHA <= :FECFIN AND FACT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) and substring(a.arti_cod from 1 FOR 2) <> '.t'
            ORDER BY TERC_NIT, ARTI_COD, FACT_FECHA
            INTO :PREFIJO, :NUMERO, :FECHA, CANTIDAD, :BASE, :IVA, :CONSUMO, :dto, :TOTAL, :ARTICULO, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :NIT
            DO
            BEGIN
            select TERC_NOM, TERC_TEL, TERC_CIU, C.ZONA_COD from terceros T, CLIENTES C
                where C.TERC_NIT = T.TERC_NIT AND T.TERC_NIT = :NIT
                INTO :NOMBRE, :TELEFONO, :CIUDAD, :CODZONA;
            SELECT ZONA_NOM FROM ZONAS WHERE ZONA_COD = :CODZONA INTO :NOMZONA;
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            SUSPEND;
            END
        END
    if (BIN_AND(TIPO, 2) <> 0) then
        BEGIN
        TIPODOC = 32;
        FOR SELECT R.PREF_PRE, REVT_NUMERO, REVT_FECHA, RVDE_CANT * RVDE_FACTOR, RVDE_PRUNIT / RVDE_FACTOR, RVDE_IVAMONTO, RVDE_CONSUMO, RVDE_DTOPORC, RVDE_TOTAL,
            D.ARTI_COD, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD, TERC_NIT
            FROM REMISIONES_VENTA R, REMISIONES_VENTA_DETALLE D, PREFIJOS P, ARTICULO A
            WHERE R.REVT_ID = D.REVT_ID AND P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = 32 AND D.ARTI_COD = A.ARTI_COD AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            TERC_NIT >= :TERINI AND TERC_NIT <= :TERFIN AND REVT_FECHA >= :FECINI AND
            REVT_FECHA <= :FECFIN AND REVT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            ORDER BY TERC_NIT, ARTI_COD, REVT_FECHA
            INTO :PREFIJO, :NUMERO, :FECHA, CANTIDAD, :BASE, :IVA, :CONSUMO, :dto, :TOTAL, :ARTICULO, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :NIT
            DO
            BEGIN
            select TERC_NOM, TERC_TEL, TERC_CIU, C.ZONA_COD from terceros T, CLIENTES C
                where C.TERC_NIT = T.TERC_NIT AND T.TERC_NIT = :NIT
                INTO :NOMBRE, :TELEFONO, :CIUDAD, :CODZONA;
            SELECT ZONA_NOM FROM ZONAS WHERE ZONA_COD = :CODZONA INTO :NOMZONA;
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            SUSPEND;
            END
        END
    if (BIN_AND(TIPO, 4) <> 0) then
        BEGIN
        TIPODOC = 33;
        FOR SELECT V.PREF_PRE, DEVT_NUMERO, DEVT_FECHA, DVDE_CANT * DVDE_FACTOR, DVDE_PRUNIT/DVDE_FACTOR*DEVT_FACTOR, DVDE_IVAMONTO*DEVT_FACTOR, DVDE_CONSUMO, DVDE_DTOPORC, DVDE_TOTAL*DEVT_FACTOR,
            D.ARTI_COD, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD, TERC_NIT
            FROM DEVOLUCIONES_VENTAS V, DEVOLUCIONES_VENTAS_DETALLE D, PREFIJOS P, ARTICULO A
            WHERE V.DEVT_ID = D.DEVT_ID AND P.PREF_PRE = V.PREF_PRE AND P.TIDO_COD = 33 AND D.ARTI_COD = A.ARTI_COD AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            TERC_NIT >= :TERINI AND TERC_NIT <= :TERFIN AND DEVT_FECHA >= :FECINI AND
            DEVT_FECHA <= :FECFIN AND DEVT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            ORDER BY TERC_NIT, ARTI_COD, DEVT_FECHA
            INTO :PREFIJO, :NUMERO, :FECHA, CANTIDAD, :BASE, :IVA, :CONSUMO, :dto, :TOTAL, :ARTICULO, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :NIT
            DO
            BEGIN
            select TERC_NOM, TERC_TEL, TERC_CIU, C.ZONA_COD from terceros T, CLIENTES C
                where C.TERC_NIT = T.TERC_NIT AND T.TERC_NIT = :NIT
                INTO :NOMBRE, :TELEFONO, :CIUDAD, :CODZONA;
            SELECT ZONA_NOM FROM ZONAS WHERE ZONA_COD = :CODZONA INTO :NOMZONA;
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            CANTIDAD = CANTIDAD * -1;
            BASE = BASE * -1;
            TOTAL = TOTAL * -1;
            IVA = IVA * -1;
            CONSUMO = CONSUMO * -1;
            SUSPEND;
            END
        END
    if (BIN_AND(TIPO, 8) <> 0) then
        BEGIN
        TIPODOC = 34;
        FOR SELECT P.PREF_PRE, PEDI_NUMERO, PEDI_FECHA, PEDE_CANT * PEDE_FACTOR, PEDE_PRUNIT/PEDE_FACTOR*PEDI_FACTOR, PEDE_IVAMONTO*PEDI_FACTOR, PEDE_CONSUMO, PEDE_DTOPORC, PEDE_TOTAL*PEDI_FACTOR,
            D.ARTI_COD, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD, TERC_NIT
            FROM PEDIDOS P, PEDIDOS_DETALLE D, PREFIJOS R, ARTICULO A
            WHERE P.PEDI_ID = D.PEDI_ID AND R.PREF_PRE = P.PREF_PRE AND R.TIDO_COD = 34 AND D.ARTI_COD = A.ARTI_COD AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            TERC_NIT >= :TERINI AND TERC_NIT <= :TERFIN AND PEDI_FECHA >= :FECINI AND
            PEDI_FECHA <= :FECFIN AND PEDI_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            ORDER BY TERC_NIT, ARTI_COD, PEDI_FECHA
            INTO :PREFIJO, :NUMERO, :FECHA, CANTIDAD, :BASE, :IVA, :CONSUMO, :dto, :TOTAL, :ARTICULO, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :NIT
            DO
            BEGIN
            select TERC_NOM, TERC_TEL, TERC_CIU, C.ZONA_COD from terceros T, CLIENTES C
                where C.TERC_NIT = T.TERC_NIT AND T.TERC_NIT = :NIT
                INTO :NOMBRE, :TELEFONO, :CIUDAD, :CODZONA;
            SELECT ZONA_NOM FROM ZONAS WHERE ZONA_COD = :CODZONA INTO :NOMZONA;
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            SUSPEND;
            END
        END
    if (BIN_AND(TIPO, 16) <> 0) then
        BEGIN
        TIPODOC = 35;
        FOR SELECT C.PREF_PRE, COTI_NUMERO, COTI_FECHA, CTDE_CANT * CTDE_FACTOR, CTDE_PRUNIT/CTDE_FACTOR*COTI_FACTOR, CTDE_IVAMONTO*COTI_FACTOR, CTDE_CONSUMO, CTDE_DTOPORC, CTDE_TOTAL*COTI_FACTOR,
            D.ARTI_COD, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD, TERC_NIT
            FROM COTIZACIONES C, COTIZACIONES_DETALLE D, PREFIJOS P, ARTICULO A
            WHERE C.COTI_ID = D.COTI_ID AND P.PREF_PRE = C.PREF_PRE AND P.TIDO_COD = 34 AND D.ARTI_COD = A.ARTI_COD AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            TERC_NIT >= :TERINI AND TERC_NIT <= :TERFIN AND COTI_FECHA >= :FECINI AND
            COTI_FECHA <= :FECFIN AND COTI_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            ORDER BY TERC_NIT, ARTI_COD, COTI_FECHA
            INTO :PREFIJO, :NUMERO, :FECHA, CANTIDAD, :BASE, :IVA, :CONSUMO, :dto, :TOTAL, :ARTICULO, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :NIT
            DO
            BEGIN
            select TERC_NOM, TERC_TEL, TERC_CIU, C.ZONA_COD from terceros T, CLIENTES C
                where C.TERC_NIT = T.TERC_NIT AND T.TERC_NIT = :NIT
                INTO :NOMBRE, :TELEFONO, :CIUDAD, :CODZONA;
            SELECT ZONA_NOM FROM ZONAS WHERE ZONA_COD = :CODZONA INTO :NOMZONA;
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            SUSPEND;
            END
        END
    END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER PROCEDURE REP_ARTICULOS_VENDEDOR(
    TIPO INTEGER,
    DETALLE CHAR(1),
    DESDE VARCHAR(20),
    HASTA VARCHAR(20),
    FECINI DATE,
    FECFIN DATE,
    ARTINI VARCHAR(15),
    ARTFIN VARCHAR(15),
    GRPINI VARCHAR(3),
    GRPFIN VARCHAR(3),
    ORDEN CHAR(1),
    AGRUPA CHAR(1),
    ZONA CHAR(1),
    CEROS CHAR(1),
    SUBEMPRESA INTEGER,
    ZONAINI CHAR(2),
    ZONAFIN CHAR(2))
RETURNS (
    CODVEND VARCHAR(20),
    NOMVEND VARCHAR(60),
    NOMTIPO VARCHAR(50),
    ARTICULO VARCHAR(15),
    DESCRIPCION VARCHAR(60),
    CODGRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    CODSUBG VARCHAR(3),
    NOMSUBG VARCHAR(30),
    CODMARC VARCHAR(3),
    NOMMARC VARCHAR(30),
    UNIDAD VARCHAR(8),
    CANTIDAD NUMERIC(18,4),
    BASE NUMERIC(18,2),
    IVA NUMERIC(18,2),
    CONSUMO NUMERIC(18,2),
    TOTAL NUMERIC(18,2),
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    DTO NUMERIC(9,2),
    NIT VARCHAR(20),
    NOMCLIENTE VARCHAR(60),
    CODZONA VARCHAR(2),
    NOMZONA VARCHAR(60))
AS
declare variable codini varchar(15);
declare variable codfin varchar(15);
declare variable desini varchar(15);
declare variable desfin varchar(15);
declare variable marini varchar(3);
declare variable marfin varchar(3);
BEGIN
if (ORDEN = 'C') then
    BEGIN
    CODINI = ARTINI;
    CODFIN = ARTFIN;
    DESINI = '';
    DESFIN = 'zz';
    END
ELSE
    BEGIN
    DESINI = ARTINI;
    DESFIN = ARTFIN;
    CODINI = '';
    CODFIN = 'zz';
    END
if (AGRUPA = 'G') then
    BEGIN
    MARINI = '';
    MARFIN = 'zz';
    END
ELSE
    if (AGRUPA = 'M') then
        BEGIN
        MARINI = GRPINI;
        MARFIN = GRPFIN;
        GRPINI = '';
        GRPFIN = 'zz';
        END
    ELSE
        BEGIN
        MARINI = '';
        MARFIN = 'zz';
        END
if (DETALLE = 'N') then
    BEGIN
    if (BIN_AND(TIPO, 1) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 31 INTO :NOMTIPO;
        FOR SELECT MAX(D.ARTI_COD), MAX(VEND_COD), SUM(FADE_CANT * FADE_FACTOR), SUM((FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO)*FACT_FACTOR), SUM(FADE_IVAMONTO*FACT_FACTOR), SUM(FADE_CONSUMO), SUM(FADE_TOTAL*FACT_FACTOR),
            MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD)
            FROM FACTURAS_DETALLE D, FACTURAS F, PREFIJOS P, ARTICULO A
            WHERE F.FACT_ID = D.FACT_ID AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND D.ARTI_COD = A.arti_cod AND
            VEND_COD >= :DESDE AND VEND_COD <= :HASTA AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            FACT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) and substring(a.arti_cod from 1 FOR 2) <> '.t'
            GROUP BY VEND_COD, D.ARTI_COD
            INTO :ARTICULO, :CODVEND, :CANTIDAD, :BASE, :IVA, :CONSUMO, :TOTAL,
            :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
            DO
            BEGIN
            select VEND_NOMBRE from VENDEDORES where VEND_COD = :CODVEND INTO :NOMVEND;
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            if (CEROS = 'S') then
                SUSPEND;
            ELSE
                if ((BASE <> 0) AND (CANTIDAD <> 0)) then
                    SUSPEND;
            END /* FOR */
        END
    if (BIN_AND(TIPO, 2) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 32 INTO :NOMTIPO;
        FOR SELECT MAX(D.ARTI_COD), MAX(VEND_COD), SUM(RVDE_CANT * RVDE_FACTOR), SUM(RVDE_TOTAL-RVDE_IVAMONTO-RVDE_CONSUMO), SUM(RVDE_IVAMONTO), SUM(RVDE_CONSUMO), SUM(RVDE_TOTAL),
            MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD)
            FROM REMISIONES_VENTA_DETALLE D, REMISIONES_VENTA R, PREFIJOS P, ARTICULO A
            WHERE R.REVT_ID = D.REVT_ID AND P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = 32 AND D.ARTI_COD = A.arti_cod AND
            VEND_COD >= :DESDE AND VEND_COD <= :HASTA AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            REVT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY R.vend_cod, D.ARTI_COD
            INTO :ARTICULO, :CODVEND, :CANTIDAD, :BASE, :IVA, :CONSUMO, :TOTAL,
            :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
            DO
            BEGIN
            select VEND_NOMBRE from VENDEDORES where VEND_COD = :CODVEND INTO :NOMVEND;
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            if (CEROS = 'S') then
                SUSPEND;
            ELSE
                if ((BASE <> 0) AND (CANTIDAD <> 0)) then
                    SUSPEND;
            END /* FOR */
        END
    if (BIN_AND(TIPO, 4) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 33 INTO :NOMTIPO;
        FOR SELECT MAX(D.ARTI_COD), MAX(VEND_COD), SUM(DVDE_CANT * DVDE_FACTOR), SUM((DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO)*DEVT_FACTOR), SUM(DVDE_IVAMONTO*DEVT_FACTOR), SUM(DVDE_CONSUMO), SUM(DVDE_TOTAL*DEVT_FACTOR),
            MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD)
            FROM devoluciones_ventas_detalle D, DEVOLUCIONES_VENTAS V, PREFIJOS P, ARTICULO A
            WHERE V.DEVT_ID = D.DEVT_ID AND P.PREF_PRE = V.PREF_PRE AND P.TIDO_COD = 33 AND D.ARTI_COD = A.arti_cod AND
            VEND_COD >= :DESDE AND VEND_COD <= :HASTA AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            DEVT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY V.vend_cod, D.ARTI_COD
            INTO :ARTICULO, :CODVEND, :CANTIDAD, :BASE, :IVA, :CONSUMO, :TOTAL,
            :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
            DO
            BEGIN
            select VEND_NOMBRE from VENDEDORES where VEND_COD = :CODVEND INTO :NOMVEND;
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            if (CEROS = 'S') then
                SUSPEND;
            ELSE
                if ((BASE <> 0) AND (CANTIDAD <> 0)) then
                    BEGIN
                    BASE = BASE * -1;
                    IVA = IVA * -1;
                    CANTIDAD = CANTIDAD * -1;
                    TOTAL = TOTAL * -1;
                    SUSPEND;
                    END
            END /* FOR */
        END
    if (BIN_AND(TIPO, 8) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 34 INTO :NOMTIPO;
        FOR SELECT MAX(D.ARTI_COD), MAX(VEND_COD), SUM(PEDE_CANT * PEDE_FACTOR), SUM((PEDE_TOTAL-PEDE_IVAMONTO-PEDE_CONSUMO)*PEDI_FACTOR), SUM(PEDE_IVAMONTO*PEDI_FACTOR), SUM(PEDE_CONSUMO), SUM(PEDE_TOTAL*PEDI_FACTOR),
            MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD)
            FROM PEDIDOS_DETALLE D, PEDIDOS P, PREFIJOS R, ARTICULO A
            WHERE P.PEDI_ID = D.PEDI_ID AND P.PREF_PRE = R.PREF_PRE AND R.TIDO_COD = 34 AND D.ARTI_COD = A.arti_cod AND
            VEND_COD >= :DESDE AND VEND_COD <= :HASTA AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            PEDI_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY P.vend_cod, D.ARTI_COD
            INTO :ARTICULO, :CODVEND, :CANTIDAD, :BASE, :IVA, :CONSUMO, :TOTAL,
            :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
            DO
            BEGIN
            select VEND_NOMBRE from VENDEDORES where VEND_COD = :CODVEND INTO :NOMVEND;
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            if (CEROS = 'S') then
                SUSPEND;
            ELSE
                if ((BASE <> 0) AND (CANTIDAD <> 0)) then
                    SUSPEND;
            END /* FOR */
        END
    if (BIN_AND(TIPO, 16) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 35 INTO :NOMTIPO;
        FOR SELECT MAX(D.ARTI_COD), MAX(VEND_COD), SUM(CTDE_CANT * CTDE_FACTOR), SUM((CTDE_TOTAL-CTDE_IVAMONTO-CTDE_CONSUMO)*COTI_FACTOR), SUM(CTDE_IVAMONTO*COTI_FACTOR), SUM(CTDE_CONSUMO), SUM(CTDE_TOTAL*COTI_FACTOR),
            MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD)
            FROM COTIZACIONES_DETALLE D, COTIZACIONES C, PREFIJOS P, ARTICULO A
            WHERE C.COTI_ID = D.COTI_ID AND P.PREF_PRE = C.PREF_PRE AND P.TIDO_COD = 35 AND D.ARTI_COD = A.arti_cod AND
            VEND_COD >= :DESDE AND VEND_COD <= :HASTA AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND COTI_FECHA >= :FECINI AND COTI_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            COTI_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY C.vend_cod, D.ARTI_COD
            INTO :ARTICULO, :CODVEND, :CANTIDAD, :BASE, :IVA, :CONSUMO, :TOTAL,
            :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
            DO
            BEGIN
            select VEND_NOMBRE from VENDEDORES where VEND_COD = :CODVEND INTO :NOMVEND;
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            if (CEROS = 'S') then
                SUSPEND;
            ELSE
                if ((BASE <> 0) AND (CANTIDAD <> 0)) then
                    SUSPEND;
            END /* FOR */
        END
    END
ELSE
  if (DETALLE = 'S') then
    BEGIN
    if (BIN_AND(TIPO, 1) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 31 INTO :NOMTIPO;
        FOR SELECT F.PREF_PRE, FACT_NUMERO, FACT_FECHA, VEND_COD, D.ARTI_COD, FADE_CANT * FADE_FACTOR, (FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO)*FACT_FACTOR, FADE_IVAMONTO*FACT_FACTOR, FADE_CONSUMO, FADE_DTOPORC, FADE_TOTAL*FACT_FACTOR,
            ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD , F.TERC_NIT, F.fact_nomcliente
            FROM FACTURAS F, FACTURAS_DETALLE D, PREFIJOS P, ARTICULO A
            WHERE F.FACT_ID = D.FACT_ID AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND D.ARTI_COD = A.arti_cod AND
                VEND_COD >= :DESDE AND VEND_COD <= :HASTA AND
                A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
                A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND FACT_FECHA >= :FECINI AND
                (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
                FACT_FECHA <= :FECFIN AND FACT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) and substring(a.arti_cod from 1 FOR 2) <> '.t'
            ORDER BY VEND_COD, D.ARTI_COD, FACT_FECHA, F.FACT_ID, FADE_ITEM
            INTO :PREFIJO, :NUMERO, :FECHA, :CODVEND, :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO, :DTO, :TOTAL,
                :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :NIT, :nomcliente
            DO
            BEGIN
            select VEND_NOMBRE from VENDEDORES where VEND_COD = :CODVEND INTO :NOMVEND;
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            SUSPEND;
            END
        END
    if (BIN_AND(TIPO, 2) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 32 INTO :NOMTIPO;
        FOR SELECT R.PREF_PRE, REVT_NUMERO, REVT_FECHA, VEND_COD, D.ARTI_COD, RVDE_CANT * RVDE_FACTOR, (RVDE_TOTAL-RVDE_IVAMONTO-RVDE_CONSUMO), RVDE_IVAMONTO, RVDE_CONSUMO, RVDE_DTOPORC, RVDE_TOTAL,
            ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD, R.terc_nit, R.revt_nomterc
            FROM REMISIONES_VENTA R, REMISIONES_VENTA_DETALLE D, PREFIJOS P, ARTICULO A
            WHERE R.REVT_ID = D.REVT_ID AND P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = 32 AND D.ARTI_COD = A.arti_cod AND
                VEND_COD >= :DESDE AND VEND_COD <= :HASTA AND
                A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
                A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN AND
                (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
                REVT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            ORDER BY VEND_COD, D.ARTI_COD, REVT_FECHA, R.REVT_ID, RVDE_ITEM
            INTO :PREFIJO, :NUMERO, :FECHA, :CODVEND, :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO, :DTO, :TOTAL,
                :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :NIT, :nomcliente
            DO
            BEGIN
            select VEND_NOMBRE from VENDEDORES where VEND_COD = :CODVEND INTO :NOMVEND;
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            SUSPEND;
            END
        END
    if (BIN_AND(TIPO, 4) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 33 INTO :NOMTIPO;
        FOR SELECT V.PREF_PRE, DEVT_NUMERO, DEVT_FECHA, VEND_COD, D.ARTI_COD, DVDE_CANT * DVDE_FACTOR, (DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO)*DEVT_FACTOR, DVDE_IVAMONTO*DEVT_FACTOR, DVDE_CONSUMO, DVDE_DTOPORC, DVDE_TOTAL*DEVT_FACTOR,
            ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD, V.terc_nit, V.devt_nomterc
            FROM DEVOLUCIONES_VENTAS V, DEVOLUCIONES_VENTAS_DETALLE D, PREFIJOS P, ARTICULO A
            WHERE V.DEVT_ID = D.DEVT_ID AND P.PREF_PRE = V.PREF_PRE AND P.TIDO_COD = 33 AND D.ARTI_COD = A.arti_cod AND
                VEND_COD >= :DESDE AND VEND_COD <= :HASTA AND
                A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
                A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND
                (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
                DEVT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            ORDER BY VEND_COD, D.ARTI_COD, DEVT_FECHA, V.DEVT_ID, DVDE_ITEM
            INTO :PREFIJO, :NUMERO, :FECHA, :CODVEND, :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO, :DTO, :TOTAL,
                :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :NIT, :nomcliente
            DO
            BEGIN
            select VEND_NOMBRE from VENDEDORES where VEND_COD = :CODVEND INTO :NOMVEND;
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            SUSPEND;
            END
        END
    if (BIN_AND(TIPO, 8) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 34 INTO :NOMTIPO;
        FOR SELECT P.PREF_PRE, PEDI_NUMERO, PEDI_FECHA, VEND_COD, D.ARTI_COD, PEDE_CANT * PEDE_FACTOR, (PEDE_TOTAL-PEDE_IVAMONTO-PEDE_CONSUMO)*PEDI_FACTOR, PEDE_IVAMONTO*PEDI_FACTOR, PEDE_CONSUMO, PEDE_DTOPORC, PEDE_TOTAL*PEDI_FACTOR,
            ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD, P.terc_nit, P.pedi_nomterc
            FROM PEDIDOS P, PEDIDOS_DETALLE D, PREFIJOS R, ARTICULO A
            WHERE P.PEDI_ID = D.PEDI_ID AND P.PREF_PRE = R.PREF_PRE AND R.TIDO_COD = 34 AND D.ARTI_COD = A.arti_cod AND
                VEND_COD >= :DESDE AND VEND_COD <= :HASTA AND
                A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
                A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND
                (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
                PEDI_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            ORDER BY VEND_COD, D.ARTI_COD, PEDI_FECHA, P.PEDI_ID, PEDE_ITEM
            INTO :PREFIJO, :NUMERO, :FECHA, :CODVEND, :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO, :DTO, :TOTAL,
                :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :NIT, :nomcliente
            DO
            BEGIN
            select VEND_NOMBRE from VENDEDORES where VEND_COD = :CODVEND INTO :NOMVEND;
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            SUSPEND;
            END
        END
    if (BIN_AND(TIPO, 16) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 35 INTO :NOMTIPO;
        FOR SELECT C.PREF_PRE, COTI_NUMERO, COTI_FECHA, VEND_COD, D.ARTI_COD, CTDE_CANT * CTDE_FACTOR, (CTDE_TOTAL-CTDE_IVAMONTO-CTDE_CONSUMO)*COTI_FACTOR, CTDE_IVAMONTO*COTI_FACTOR, CTDE_CONSUMO, CTDE_DTOPORC, CTDE_TOTAL*COTI_FACTOR,
            ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD, C.terc_nit, C.coti_nomterc
            FROM COTIZACIONES C, COTIZACIONES_DETALLE D, PREFIJOS P, ARTICULO A
            WHERE C.COTI_ID = D.COTI_ID AND P.PREF_PRE = C.PREF_PRE AND P.TIDO_COD = 35 AND D.ARTI_COD = A.arti_cod AND
                VEND_COD >= :DESDE AND VEND_COD <= :HASTA AND
                A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
                A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND COTI_FECHA >= :FECINI AND COTI_FECHA <= :FECFIN AND
                (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
                COTI_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            ORDER BY VEND_COD, D.ARTI_COD, COTI_FECHA, C.COTI_ID, CTDE_ITEM
            INTO :PREFIJO, :NUMERO, :FECHA, :CODVEND, :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO, :DTO, :TOTAL,
                :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :NIT, :nomcliente
            DO
            BEGIN
            select VEND_NOMBRE from VENDEDORES where VEND_COD = :CODVEND INTO :NOMVEND;
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            SUSPEND;
            END
        END
    END
  ELSE
if (DETALLE = 'C') then
    BEGIN
    if (BIN_AND(TIPO, 1) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 31 INTO :NOMTIPO;
        FOR SELECT MAX(D.ARTI_COD), MAX(VEND_COD), SUM(FADE_CANT * FADE_FACTOR), SUM((FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO)*FACT_FACTOR), SUM(FADE_IVAMONTO*FACT_FACTOR), SUM(FADE_CONSUMO), SUM(FADE_TOTAL*FACT_FACTOR),
            MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD), MAX(F.terc_nit), MAX(F.fact_nomcliente)
            FROM FACTURAS_DETALLE D, FACTURAS F, PREFIJOS P, ARTICULO A
            WHERE F.FACT_ID = D.FACT_ID AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND D.ARTI_COD = A.arti_cod AND
            VEND_COD >= :DESDE AND VEND_COD <= :HASTA AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            FACT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) and substring(a.arti_cod from 1 FOR 2) <> '.t'
            GROUP BY F.VEND_COD, F.TERC_NIT, D.ARTI_COD
            INTO :ARTICULO, :CODVEND, :CANTIDAD, :BASE, :IVA, :CONSUMO, :TOTAL,
            :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :nit, :nomcliente
            DO
            BEGIN
            select VEND_NOMBRE from VENDEDORES where VEND_COD = :CODVEND INTO :NOMVEND;
            SELECT C.ZONA_COD, ZONA_NOM FROM CLIENTES C, ZONAS Z WHERE C.zona_cod = Z.zona_cod AND C.terc_nit = :nit INTO :codzona, :nomzona;
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            if (CEROS = 'S') then
                SUSPEND;
            ELSE
                if ((BASE <> 0) AND (CANTIDAD <> 0)) then
                    SUSPEND;
            END /* FOR */
        END
    if (BIN_AND(TIPO, 2) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 32 INTO :NOMTIPO;
        FOR SELECT MAX(D.ARTI_COD), MAX(VEND_COD), SUM(RVDE_CANT * RVDE_FACTOR), SUM(RVDE_TOTAL-RVDE_IVAMONTO-RVDE_CONSUMO), SUM(RVDE_IVAMONTO), SUM(RVDE_CONSUMO), SUM(RVDE_TOTAL),
            MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD), MAX(R.terc_nit), MAX(R.revt_nomterc)
            FROM REMISIONES_VENTA_DETALLE D, REMISIONES_VENTA R, PREFIJOS P, ARTICULO A
            WHERE R.REVT_ID = D.REVT_ID AND P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = 32 AND D.ARTI_COD = A.arti_cod AND
            VEND_COD >= :DESDE AND VEND_COD <= :HASTA AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            REVT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY R.vend_cod, R.terc_nit, D.arti_cod
            INTO :ARTICULO, :CODVEND, :CANTIDAD, :BASE, :IVA, :CONSUMO, :TOTAL,
            :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :nit, :nomcliente
            DO
            BEGIN
            SELECT C.ZONA_COD, ZONA_NOM FROM CLIENTES C, ZONAS Z WHERE C.zona_cod = Z.zona_cod AND C.terc_nit = :nit INTO :codzona, :nomzona;
            select VEND_NOMBRE from VENDEDORES where VEND_COD = :CODVEND INTO :NOMVEND;
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            if (CEROS = 'S') then
                SUSPEND;
            ELSE
                if ((BASE <> 0) AND (CANTIDAD <> 0)) then
                    SUSPEND;
            END /* FOR */
        END
    if (BIN_AND(TIPO, 4) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 33 INTO :NOMTIPO;
        FOR SELECT MAX(D.ARTI_COD), MAX(VEND_COD), SUM(DVDE_CANT * DVDE_FACTOR), SUM((DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO)*DEVT_FACTOR), SUM(DVDE_IVAMONTO*DEVT_FACTOR), SUM(DVDE_CONSUMO), SUM(DVDE_TOTAL*DEVT_FACTOR),
            MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD), MAX(V.terc_nit), MAX(V.devt_nomterc)
            FROM devoluciones_ventas_detalle D, DEVOLUCIONES_VENTAS V, PREFIJOS P, ARTICULO A
            WHERE V.DEVT_ID = D.DEVT_ID AND P.PREF_PRE = V.PREF_PRE AND P.TIDO_COD = 33 AND D.ARTI_COD = A.arti_cod AND
            VEND_COD >= :DESDE AND VEND_COD <= :HASTA AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            DEVT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY V.vend_cod, V.terc_nit, D.arti_cod
            INTO :ARTICULO, :CODVEND, :CANTIDAD, :BASE, :IVA, :CONSUMO, :TOTAL,
            :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :nit, :nomcliente
            DO
            BEGIN
            SELECT C.ZONA_COD, ZONA_NOM FROM CLIENTES C, ZONAS Z WHERE C.zona_cod = Z.zona_cod AND C.terc_nit = :nit INTO :codzona, :nomzona;
            select VEND_NOMBRE from VENDEDORES where VEND_COD = :CODVEND INTO :NOMVEND;
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            if (CEROS = 'S') then
                SUSPEND;
            ELSE
                if ((BASE <> 0) AND (CANTIDAD <> 0)) then
                    SUSPEND;
            END /* FOR */
        END
    if (BIN_AND(TIPO, 8) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 34 INTO :NOMTIPO;
        FOR SELECT MAX(D.ARTI_COD), MAX(VEND_COD), SUM(PEDE_CANT * PEDE_FACTOR), SUM((PEDE_TOTAL-PEDE_IVAMONTO-PEDE_CONSUMO)*PEDI_FACTOR), SUM(PEDE_IVAMONTO*PEDI_FACTOR), SUM(PEDE_CONSUMO), SUM(PEDE_TOTAL*PEDI_FACTOR),
            MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD), MAX(P.terc_nit), MAX(P.pedi_nomterc)
            FROM PEDIDOS_DETALLE D, PEDIDOS P, PREFIJOS R, ARTICULO A
            WHERE P.PEDI_ID = D.PEDI_ID AND P.PREF_PRE = R.PREF_PRE AND R.TIDO_COD = 34 AND D.ARTI_COD = A.arti_cod AND
            VEND_COD >= :DESDE AND VEND_COD <= :HASTA AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            PEDI_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY P.vend_cod, P.terc_nit, D.arti_cod
            INTO :ARTICULO, :CODVEND, :CANTIDAD, :BASE, :IVA, :CONSUMO, :TOTAL,
            :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :nit, :nomcliente
            DO
            BEGIN
            SELECT C.ZONA_COD, ZONA_NOM FROM CLIENTES C, ZONAS Z WHERE C.zona_cod = Z.zona_cod AND C.terc_nit = :nit INTO :codzona, :nomzona;
            select VEND_NOMBRE from VENDEDORES where VEND_COD = :CODVEND INTO :NOMVEND;
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            if (CEROS = 'S') then
                SUSPEND;
            ELSE
                if ((BASE <> 0) AND (CANTIDAD <> 0)) then
                    SUSPEND;
            END /* FOR */
        END
    if (BIN_AND(TIPO, 16) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 35 INTO :NOMTIPO;
        FOR SELECT MAX(D.ARTI_COD), MAX(VEND_COD), SUM(CTDE_CANT * CTDE_FACTOR), SUM((CTDE_TOTAL-CTDE_IVAMONTO-CTDE_CONSUMO)*COTI_FACTOR), SUM(CTDE_IVAMONTO*COTI_FACTOR), SUM(CTDE_CONSUMO), SUM(CTDE_TOTAL*COTI_FACTOR),
            MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD), MAX(C.terc_nit), MAX(C.coti_nomterc)
            FROM COTIZACIONES_DETALLE D, COTIZACIONES C, PREFIJOS P, ARTICULO A
            WHERE C.COTI_ID = D.COTI_ID AND P.PREF_PRE = C.PREF_PRE AND P.TIDO_COD = 35 AND D.ARTI_COD = A.arti_cod AND
            VEND_COD >= :DESDE AND VEND_COD <= :HASTA AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND COTI_FECHA >= :FECINI AND COTI_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            COTI_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY C.vend_cod, C.terc_nit, D.arti_cod
            INTO :ARTICULO, :CODVEND, :CANTIDAD, :BASE, :IVA, :CONSUMO, :TOTAL,
            :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :nit, :nomcliente
            DO
            BEGIN
            SELECT C.ZONA_COD, ZONA_NOM FROM CLIENTES C, ZONAS Z WHERE C.zona_cod = Z.zona_cod AND C.terc_nit = :nit INTO :codzona, :nomzona;
            select VEND_NOMBRE from VENDEDORES where VEND_COD = :CODVEND INTO :NOMVEND;
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            if (CEROS = 'S') then
                SUSPEND;
            ELSE
                if ((BASE <> 0) AND (CANTIDAD <> 0)) then
                    SUSPEND;
            END /* FOR */
        END
    END
if (zona = 'S') then
    BEGIN
    if (BIN_AND(TIPO, 1) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 31 INTO :NOMTIPO;
        FOR SELECT MAX(D.ARTI_COD), MAX(F.VEND_COD), SUM(FADE_CANT * FADE_FACTOR), SUM((FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO)*FACT_FACTOR), SUM(FADE_IVAMONTO*FACT_FACTOR), SUM(FADE_CONSUMO), SUM(FADE_TOTAL*FACT_FACTOR),
            MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD), MAX(F.terc_nit), MAX(F.fact_nomcliente)
            FROM FACTURAS_DETALLE D, FACTURAS F, PREFIJOS P, ARTICULO A, clientes C, ZONAS Z
            WHERE F.FACT_ID = D.FACT_ID AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND D.ARTI_COD = A.arti_cod AND
            F.VEND_COD >= :DESDE AND F.VEND_COD <= :HASTA AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            FACT_ANULADO = 'N' AND ((P.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) AND F.terc_nit = C.terc_nit AND
            Z.zona_cod = C.zona_cod AND C.zona_cod >= :zonaini AND C.zona_cod <= :zonafin and substring(a.arti_cod from 1 FOR 2) <> '.t'
            GROUP BY F.VEND_COD, C.zona_cod ,D.ARTI_COD , C.terc_nit
            INTO :ARTICULO, :CODVEND, :CANTIDAD, :BASE, :IVA, :CONSUMO, :TOTAL,
            :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :nit, :nomcliente
            DO
            BEGIN
            select VEND_NOMBRE from VENDEDORES where VEND_COD = :CODVEND INTO :NOMVEND;
            SELECT C.ZONA_COD, ZONA_NOM FROM CLIENTES C, ZONAS Z WHERE C.zona_cod = Z.zona_cod AND C.terc_nit = :nit /*AND Z.zona_cod >= :zonaini AND Z.zona_cod >= :zonafin*/ INTO :codzona, :nomzona;
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            if (CEROS = 'S') then
                SUSPEND;
            ELSE
                if ((BASE <> 0) AND (CANTIDAD <> 0)) then
                    SUSPEND;
            END /* FOR */
        END
    if (BIN_AND(TIPO, 2) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 32 INTO :NOMTIPO;
        FOR SELECT MAX(D.ARTI_COD), MAX(R.VEND_COD), SUM(RVDE_CANT * RVDE_FACTOR), SUM(RVDE_TOTAL-RVDE_IVAMONTO-RVDE_CONSUMO), SUM(RVDE_IVAMONTO), SUM(RVDE_CONSUMO), SUM(RVDE_TOTAL),
            MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD), MAX(R.terc_nit), MAX(R.revt_nomterc)
            FROM REMISIONES_VENTA_DETALLE D, REMISIONES_VENTA R, PREFIJOS P, ARTICULO A, clientes C, ZONAS Z
            WHERE R.REVT_ID = D.REVT_ID AND P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = 32 AND D.ARTI_COD = A.arti_cod AND
            R.VEND_COD >= :DESDE AND R.VEND_COD <= :HASTA AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            REVT_ANULADO = 'N' AND ((P.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))AND R.terc_nit = C.terc_nit AND
            Z.zona_cod = C.zona_cod AND C.zona_cod >= :zonaini AND C.zona_cod <= :zonafin
            GROUP BY R.vend_cod, c.zona_cod, D.arti_cod , R.terc_nit
            INTO :ARTICULO, :CODVEND, :CANTIDAD, :BASE, :IVA, :CONSUMO, :TOTAL,
            :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :nit, :nomcliente
            DO
            BEGIN
            SELECT C.ZONA_COD, ZONA_NOM FROM CLIENTES C, ZONAS Z WHERE C.zona_cod = Z.zona_cod AND C.terc_nit = :nit INTO :codzona, :nomzona;
            select VEND_NOMBRE from VENDEDORES where VEND_COD = :CODVEND INTO :NOMVEND;
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            if (CEROS = 'S') then
                SUSPEND;
            ELSE
                if ((BASE <> 0) AND (CANTIDAD <> 0)) then
                    SUSPEND;
            END /* FOR */
        END
    if (BIN_AND(TIPO, 4) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 33 INTO :NOMTIPO;
        FOR SELECT MAX(D.ARTI_COD), MAX(V.VEND_COD), SUM(DVDE_CANT * DVDE_FACTOR), SUM((DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO)*DEVT_FACTOR), SUM(DVDE_IVAMONTO*DEVT_FACTOR), SUM(DVDE_CONSUMO), SUM(DVDE_TOTAL*DEVT_FACTOR),
            MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD), MAX(V.terc_nit), MAX(V.devt_nomterc)
            FROM devoluciones_ventas_detalle D, DEVOLUCIONES_VENTAS V, PREFIJOS P, ARTICULO A, clientes C, ZONAS Z
            WHERE V.DEVT_ID = D.DEVT_ID AND P.PREF_PRE = V.PREF_PRE AND P.TIDO_COD = 33 AND D.ARTI_COD = A.arti_cod AND
            V.VEND_COD >= :DESDE AND V.VEND_COD <= :HASTA AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            DEVT_ANULADO = 'N' AND ((P.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))AND V.terc_nit = C.terc_nit AND
            Z.zona_cod = C.zona_cod AND C.zona_cod >= :zonaini AND C.zona_cod <= :zonafin
            GROUP BY V.vend_cod, c.zona_cod, D.arti_cod , V.terc_nit
            INTO :ARTICULO, :CODVEND, :CANTIDAD, :BASE, :IVA, :CONSUMO, :TOTAL,
            :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :nit, :nomcliente
            DO
            BEGIN
            SELECT C.ZONA_COD, ZONA_NOM FROM CLIENTES C, ZONAS Z WHERE C.zona_cod = Z.zona_cod AND C.terc_nit = :nit INTO :codzona, :nomzona;
            select VEND_NOMBRE from VENDEDORES where VEND_COD = :CODVEND INTO :NOMVEND;
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            if (CEROS = 'S') then
                SUSPEND;
            ELSE
                if ((BASE <> 0) AND (CANTIDAD <> 0)) then
                    SUSPEND;
            END /* FOR */
        END
    if (BIN_AND(TIPO, 8) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 34 INTO :NOMTIPO;
        FOR SELECT MAX(D.ARTI_COD), MAX(P.VEND_COD), SUM(PEDE_CANT * PEDE_FACTOR), SUM((PEDE_TOTAL-PEDE_IVAMONTO-PEDE_CONSUMO)*PEDI_FACTOR), SUM(PEDE_IVAMONTO*PEDI_FACTOR), SUM(PEDE_CONSUMO), SUM(PEDE_TOTAL*PEDI_FACTOR),
            MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD), MAX(P.terc_nit), MAX(P.pedi_nomterc)
            FROM PEDIDOS_DETALLE D, PEDIDOS P, PREFIJOS R, ARTICULO A, clientes C, ZONAS Z
            WHERE P.PEDI_ID = D.PEDI_ID AND P.PREF_PRE = R.PREF_PRE AND R.TIDO_COD = 34 AND D.ARTI_COD = A.arti_cod AND
            P.VEND_COD >= :DESDE AND P.VEND_COD <= :HASTA AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            PEDI_ANULADO = 'N' AND ((R.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))AND P.terc_nit = C.terc_nit AND
            Z.zona_cod = C.zona_cod AND C.zona_cod >= :zonaini AND C.zona_cod <= :zonafin
            GROUP BY P.vend_cod, c.zona_cod, D.arti_cod , P.terc_nit
            INTO :ARTICULO, :CODVEND, :CANTIDAD, :BASE, :IVA, :CONSUMO, :TOTAL,
            :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :nit, :nomcliente
            DO
            BEGIN
            SELECT C.ZONA_COD, ZONA_NOM FROM CLIENTES C, ZONAS Z WHERE C.zona_cod = Z.zona_cod AND C.terc_nit = :nit INTO :codzona, :nomzona;
            select VEND_NOMBRE from VENDEDORES where VEND_COD = :CODVEND INTO :NOMVEND;
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            if (CEROS = 'S') then
                SUSPEND;
            ELSE
                if ((BASE <> 0) AND (CANTIDAD <> 0)) then
                    SUSPEND;
            END /* FOR */
        END
    if (BIN_AND(TIPO, 16) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 35 INTO :NOMTIPO;
        FOR SELECT MAX(D.ARTI_COD), MAX(C.VEND_COD), SUM(CTDE_CANT * CTDE_FACTOR), SUM((CTDE_TOTAL-CTDE_IVAMONTO-CTDE_CONSUMO)*COTI_FACTOR), SUM(CTDE_IVAMONTO*COTI_FACTOR), SUM(CTDE_CONSUMO), SUM(CTDE_TOTAL*COTI_FACTOR),
            MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD), MAX(C.terc_nit), MAX(C.coti_nomterc)
            FROM COTIZACIONES_DETALLE D, COTIZACIONES C, PREFIJOS P, ARTICULO A, clientes T, ZONAS Z
            WHERE C.COTI_ID = D.COTI_ID AND P.PREF_PRE = C.PREF_PRE AND P.TIDO_COD = 35 AND D.ARTI_COD = A.arti_cod AND
            C.VEND_COD >= :DESDE AND C.VEND_COD <= :HASTA AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND COTI_FECHA >= :FECINI AND COTI_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            COTI_ANULADO = 'N' AND ((P.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))AND C.terc_nit = T.terc_nit AND
            Z.zona_cod = T.zona_cod AND T.zona_cod >= :zonaini AND T.zona_cod <= :zonafin
            GROUP BY C.vend_cod, t.zona_cod, D.arti_cod , C.terc_nit
            INTO :ARTICULO, :CODVEND, :CANTIDAD, :BASE, :IVA, :CONSUMO, :TOTAL,
            :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :nit, :nomcliente
            DO
            BEGIN
            SELECT C.ZONA_COD, ZONA_NOM FROM CLIENTES C, ZONAS Z WHERE C.zona_cod = Z.zona_cod AND C.terc_nit = :nit INTO :codzona, :nomzona;
            select VEND_NOMBRE from VENDEDORES where VEND_COD = :CODVEND INTO :NOMVEND;
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            if (CEROS = 'S') then
                SUSPEND;
            ELSE
                if ((BASE <> 0) AND (CANTIDAD <> 0)) then
                    SUSPEND;
            END /* FOR */
        END
    END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER PROCEDURE VENTAS_ARTICULO_MES(
    FECINI DATE,
    FECFIN DATE,
    SUBEMPRESA INTEGER)
RETURNS (
    ARTICULO VARCHAR(15),
    DESCRIPCION VARCHAR(60),
    CODGRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    CODSUBG VARCHAR(3),
    NOMSUBG VARCHAR(30),
    CODMARC VARCHAR(3),
    NOMMARC VARCHAR(30),
    UNIDAD VARCHAR(8),
    CANTVTAS NUMERIC(18,4),
    BASEVTAS NUMERIC(18,2),
    IVAVTAS NUMERIC(18,2),
    CANTDEV NUMERIC(18,4),
    BASEDEV NUMERIC(18,2),
    IVADEV NUMERIC(18,2))
AS
BEGIN
FOR SELECT MAX(ARTI_COD), SUM(FADE_CANT * FADE_FACTOR), SUM((cast(FADE_TOTAL as double precision)-FADE_IVAMONTO-FADE_CONSUMO)*FACT_FACTOR),
    SUM(FADE_IVAMONTO*FACT_FACTOR)
    FROM FACTURAS_DETALLE D, FACTURAS F, PREFIJOS P
    WHERE F.FACT_ID = D.FACT_ID AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND FACT_ANULADO = 'N'
       AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) and substring(D.arti_cod from 1 FOR 2) <> '.t'
    GROUP BY ARTI_COD
    INTO :ARTICULO, :CANTVTAS, :BASEVTAS, :IVAVTAS
    DO
    BEGIN
    SELECT ARTI_DES, ARTI_UNIDAD, A.GRUP_COD, A.SUBG_COD, A.MARC_COD, GRUP_NOM 
        FROM ARTICULO A, GRUPO G WHERE A.ARTI_COD = :articulo AND A.GRUP_COD = G.grup_cod
        INTO :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :NOMGRUPO;
    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
    SELECT SUM(DVDE_CANT * DVDE_FACTOR), SUM((cast(DVDE_TOTAL as double precision)-DVDE_IVAMONTO-DVDE_CONSUMO)*DEVT_FACTOR),
        SUM(DVDE_IVAMONTO*DEVT_FACTOR)
        FROM DEVOLUCIONES_VENTAS F, devoluciones_ventas_DETALLE D, PREFIJOS P
        WHERE F.DEVT_ID = D.DEVT_ID AND ARTI_COD = :ARTICULO AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND DEVT_ANULADO = 'N' AND ((devt_remid is null) or (DEVT_REMID = 0))
        AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 33 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
        INTO :CANTDEV, :BASEDEV, :IVADEV;
    if (cantvtas IS NULL) then
        cantvtas = 0;
    if (cantdev IS NULL) then
        cantdev = 0;
    if (ivavtas IS NULL) then
        ivavtas = 0;
    if (IVADEV IS NULL) then
        IVADEV = 0;
    if (basevtas IS NULL) then
        basevtas = 0;
    if (basedev IS NULL) then
        basedev = 0;
    if ((CANTVTAS <> 0) or (CANTDEV <> 0)) then
        SUSPEND;
    END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER PROCEDURE VENTAS_ARTICULO_VENDEDOR(
    VEND INTEGER,
    FECINI DATE,
    FECFIN DATE,
    CEROS CHAR(1),
    SUBEMPRESA INTEGER)
RETURNS (
    ARTICULO VARCHAR(15),
    DESCRIPCION VARCHAR(60),
    CODGRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    CODSUBG VARCHAR(3),
    NOMSUBG VARCHAR(30),
    CODMARC VARCHAR(3),
    NOMMARC VARCHAR(30),
    UNIDAD VARCHAR(8),
    CANTVTAS NUMERIC(18,4),
    BASEVTAS NUMERIC(18,2),
    IVAVTAS NUMERIC(18,2),
    CANTDEV NUMERIC(18,4),
    BASEDEV NUMERIC(18,2),
    IVADEV NUMERIC(18,2))
AS
BEGIN
FOR SELECT MAX(ARTI_COD), SUM(FADE_CANT * FADE_FACTOR), SUM(FACT_FACTOR*(FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO)),
    SUM(FACT_FACTOR*FADE_IVAMONTO)
    FROM FACTURAS_DETALLE D, FACTURAS F, PREFIJOS P
    WHERE F.FACT_ID = D.FACT_ID AND FACT_FECHA >= :FECINI AND FACT_FECHA < :FECFIN AND VEND_COD = :VEND AND FACT_ANULADO = 'N'
    AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) and substring(D.arti_cod from 1 FOR 2) <> '.t'
    GROUP BY ARTI_COD ORDER BY ARTI_COD 
    INTO :ARTICULO, :CANTVTAS, :BASEVTAS, :IVAVTAS
    DO
    BEGIN
    SELECT ARTI_DES, ARTI_UNIDAD, A.GRUP_COD, A.SUBG_COD, A.MARC_COD FROM ARTICULO A WHERE ARTI_COD = :articulo
      INTO :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC;
    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
    SELECT SUM(DVDE_CANT * DVDE_FACTOR), SUM(DEVT_FACTOR*(DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO)),
        SUM(DEVT_FACTOR*DVDE_IVAMONTO)
        FROM DEVOLUCIONES_VENTAS F, devoluciones_ventas_DETALLE D, PREFIJOS P
        WHERE F.DEVT_ID = D.DEVT_ID AND ARTI_COD = :ARTICULO AND DEVT_FECHA >= :FECINI AND DEVT_FECHA < :FECFIN AND VEND_COD = :VEND AND DEVT_ANULADO = 'N'
         AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 33 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
        INTO :CANTDEV, :BASEDEV, :IVADEV;
    if (CANTVTAS IS NULL) then
        CANTVTAS = 0;
    if (CANTDEV IS NULL) then
        CANTDEV = 0;
    if (BASEVTAS IS NULL) then
        BASEVTAS = 0;
    if (BASEDEV IS NULL) then
        BASEDEV = 0;
    if (IVAVTAS IS NULL) then
        IVAVTAS = 0;
    if (IVADEV IS NULL) then
        IVADEV = 0;
    if ((CEROS = 'S') or (CANTVTAS > 0) OR (CANTDEV > 0)) then
        SUSPEND;
    END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER PROCEDURE VENTAS_ARTICULO_CLIENTE(
    NIT VARCHAR(20),
    FECINI DATE,
    FECFIN DATE,
    CEROS CHAR(1),
    SUBEMPRESA INTEGER)
RETURNS (
    ARTICULO VARCHAR(15),
    DESCRIPCION VARCHAR(60),
    CODGRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    CODSUBG VARCHAR(3),
    NOMSUBG VARCHAR(30),
    CODMARC VARCHAR(3),
    NOMMARC VARCHAR(30),
    UNIDAD VARCHAR(8),
    CANTVTAS NUMERIC(18,4),
    BASEVTAS NUMERIC(18,2),
    IVAVTAS NUMERIC(18,2),
    CANTDEV NUMERIC(18,4),
    BASEDEV NUMERIC(18,2),
    IVADEV NUMERIC(18,2))
AS
BEGIN
FOR SELECT MAX(ARTI_COD), SUM(FADE_CANT * FADE_FACTOR), SUM(FACT_FACTOR*(FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO)),
    SUM(FACT_FACTOR*FADE_IVAMONTO)
    FROM FACTURAS_DETALLE D, FACTURAS F, PREFIJOS P
    WHERE F.FACT_ID = D.FACT_ID AND FACT_FECHA >= :FECINI AND FACT_FECHA < :FECFIN AND TERC_NIT = :NIT AND FACT_ANULADO = 'N'
    AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) and substring(D.arti_cod from 1 FOR 2) <> '.t'
    GROUP BY ARTI_COD ORDER BY ARTI_COD 
    INTO :ARTICULO, :CANTVTAS, :BASEVTAS, :IVAVTAS
    DO
    BEGIN
    SELECT ARTI_DES, ARTI_UNIDAD, A.GRUP_COD, A.SUBG_COD, A.MARC_COD FROM ARTICULO A WHERE ARTI_COD = :articulo
      INTO :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC;
    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
    SELECT SUM(DVDE_CANT * DVDE_FACTOR), SUM(DEVT_FACTOR*(DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO)),
        SUM(DEVT_FACTOR*DVDE_IVAMONTO)
        FROM DEVOLUCIONES_VENTAS F, devoluciones_ventas_DETALLE D, PREFIJOS P
        WHERE F.DEVT_ID = D.DEVT_ID AND ARTI_COD = :ARTICULO AND DEVT_FECHA >= :FECINI AND DEVT_FECHA < :FECFIN AND TERC_NIT = :NIT AND DEVT_ANULADO = 'N'
         AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 33 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
        INTO :CANTDEV, :BASEDEV, :IVADEV;
    if (CANTVTAS IS NULL) then
        CANTVTAS = 0;
    if (CANTDEV IS NULL) then
        CANTDEV = 0;
    if (BASEVTAS IS NULL) then
        BASEVTAS = 0;
    if (BASEDEV IS NULL) then
        BASEDEV = 0;
    if (IVAVTAS IS NULL) then
        IVAVTAS = 0;
    if (IVADEV IS NULL) then
        IVADEV = 0;
    if ((CEROS = 'S') or (CANTVTAS > 0) OR (CANTDEV > 0)) then
        SUSPEND;
    END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER PROCEDURE ACUMULA_PUNTOS_CLIENTE(
    TIPO INTEGER,
    IDDOC INTEGER,
    CLIENTE VARCHAR(20),
    FECHA DATE)
RETURNS (
    PUNTOS INTEGER)
AS
declare variable numrows integer;
declare variable fecaux date;
declare variable IDP INTEGER;
declare variable ok integer;
declare variable ACUMULA CHAR(2);
declare variable FACTOR INTEGER;
declare variable ARTICULO VARCHAR(15);
declare variable FACTORART INTEGER;
declare variable ptos INTEGER;
declare variable HORA TIME;
declare variable HORINI TIME;
declare variable HORFIN TIME;
begin
ok = 1;
execute procedure lee_configuracion('FACTURACION', 'FACTURAS', 'ACUMULAR PUNTOS POR VENTAS A CLIENTE REGULARES') returning_values (ACUMULA);
if (acumula = 'SI') then
    begin
    execute procedure lee_configuracion('FACTURACION', 'FACTURAS', 'FACTOR DE CONVERSION DE PUNTOS') returning_values (FACTOR);
    if (IDDOC <> 0) then
        begin
        if (tipo = 31) then
            begin
            select count(ptcl_id) from puntos_cliente where ptcl_nit = :cliente and ptcl_tipodoc = 31 and ptcl_iddoc = :iddoc into :numrows;
            if (numrows = 0) then
                begin
                PUNTOS = 0;
                /* recorra la factura acumulando los puntos */
                for select arti_cod, CAST((fade_total-fade_ivamonto-fade_consumo)/:factor AS INTEGER) from facturas_detalle
                    where fact_id = :iddoc and substring(arti_cod from 1 FOR 2) <> '.t' into :articulo, :ptos
                    do
                    begin
                    factorart = 1;
                    select ptar_factor from puntos_articulos where PTAR_COD = :articulo into :factorart;
                    PUNTOS = PUNTOS + (ptos * factorart);
                    end
                /* SI ES UN DIA ESPECIAL APLIQUE EL FACTOR */
                SELECT FACT_FECHA FROM FACTURAS WHERE FACT_ID = :iddoc INTO :fecaux;
                FOR SELECT PTDE_ID FROM puntos_diasespecial WHERE PTDE_FECINI <= :fecaux AND PTDE_FECFIN >= :fecaux INTO :idp
                    DO
                    BEGIN
                    SELECT PTDE_HORINI, PTDE_HORFIN, PTDE_FACTOR FROM puntos_diasespecial
                        WHERE PTDE_ID = :IDP INTO :HORINI, :HORFIN, :factorart;
                    SELECT AUDI_HORA FROM AUDITORIA WHERE TIDO_COD = 31 AND AUDI_IDDOC = :iddoc INTO HORA;
                    if ((horini <= HORA) AND (horfin >= HORA)) then
                        PUNTOS = PUNTOS * factorart;
                    END
                /* inserte el registro de puntos */
                insert into puntos_cliente (ptcl_nit, ptcl_fecha, ptcl_tipodoc, ptcl_iddoc, ptcl_db, ptcl_cr)
                    values (:cliente, :fecha,  31, :iddoc, :puntos, 0);
                end
            end
        if (tipo = 33) then
            begin
            select count(ptcl_id) from puntos_cliente where ptcl_nit = :cliente and ptcl_tipodoc = 33 and ptcl_iddoc = :iddoc into :numrows;
            if (numrows = 0) then
                begin
                PUNTOS = 0;
                /* recorra la DEVOLUCION acumulando los puntos */
                for select arti_cod, CAST((dvde_total-dvde_ivamonto-dvde_consumo)/:factor AS INTEGER) from devoluciones_ventas_detalle
                    where devt_id = :iddoc and substring(arti_cod from 1 FOR 2) <> '.t' into :articulo, :ptos
                    do
                    begin
                    factorart = 1;
                    select ptar_factor from puntos_articulos where PTAR_COD = :articulo into :factorart;
                    PUNTOS = PUNTOS + (ptos * factorart);
                    end
                /* SI ES UN DIA ESPECIAL APLIQUE EL FACTOR */
                SELECT DEVT_FECHA FROM devoluciones_ventas WHERE DEVT_ID = :iddoc INTO :fecaux;
                FOR SELECT PTDE_ID FROM puntos_diasespecial WHERE PTDE_FECINI <= :fecaux AND PTDE_FECFIN >= :fecaux INTO :idp
                    DO
                    BEGIN
                    SELECT PTDE_HORINI, PTDE_HORFIN, PTDE_FACTOR FROM puntos_diasespecial
                        WHERE PTDE_ID = :IDP INTO :HORINI, :HORFIN, :factorart;
                    SELECT AUDI_HORA FROM AUDITORIA WHERE TIDO_COD = 33 AND AUDI_IDDOC = :iddoc INTO HORA;
                    if ((horini <= HORA) AND (horfin >= HORA)) then
                        PUNTOS = PUNTOS * factorart;
                    END
                /* inserte el registro de puntos */
                insert into puntos_cliente (ptcl_nit, ptcl_fecha, ptcl_tipodoc, ptcl_iddoc, ptcl_db, ptcl_cr)
                    values (:cliente, :fecha,  33, :iddoc, 0, :puntos);
                end
            end

        suspend;
        end
    end
end
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE IMPR_DEVOLUCION(
    ID INTEGER)
RETURNS (
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    NIT VARCHAR(20),
    NOMTERCERO VARCHAR(60),
    VENDEDOR INTEGER,
    NOMVENDEDOR VARCHAR(60),
    PUNTOVTA INTEGER,
    NOMPUNTOVTA VARCHAR(30),
    CODBODEGA VARCHAR(2),
    NOMBODEGA VARCHAR(30),
    FACTURA VARCHAR(30),
    REMISION VARCHAR(10),
    COMIPORC NUMERIC(9,2),
    COMIMONTO NUMERIC(18,2),
    SUBTOTAL NUMERIC(18,2),
    DTOPORC NUMERIC(9,2),
    DTOMONTO NUMERIC(18,2),
    ADICIONAL NUMERIC(18,2),
    IVAMONTO NUMERIC(18,2),
    RTEFTEPORC NUMERIC(9,2),
    RTEFTEMONTO NUMERIC(18,2),
    RTEIVAPORC NUMERIC(9,2),
    RTEIVAMONTO NUMERIC(18,2),
    RTEICAPORC NUMERIC(9,2),
    RTEICAMONTO NUMERIC(18,2),
    EXTRA NUMERIC(18,2),
    TOTALFAC NUMERIC(18,2),
    TOTALPAGAR NUMERIC(18,2),
    OBS BLOB SUB_TYPE 1 SEGMENT SIZE 80,
    ITEM INTEGER,
    ARTICULO VARCHAR(15),
    CODBAR VARCHAR(15),
    ARTIDES VARCHAR(60),
    CANT NUMERIC(18,4),
    LOTE VARCHAR(15),
    UNIDAD VARCHAR(8),
    REFITEM VARCHAR(60),
    BODITEM VARCHAR(2),
    PRUNIT NUMERIC(18,2),
    DTOITPORC NUMERIC(9,2),
    DTOITMONTO NUMERIC(18,2),
    PRNETO NUMERIC(18,2),
    IVAPORC NUMERIC(9,2),
    IVAITMONTO NUMERIC(18,2),
    CONSUMO NUMERIC(18,2),
    TOTAL NUMERIC(18,2),
    CODIGOCL VARCHAR(20),
    ZONACOD VARCHAR(2),
    ZONANOM VARCHAR(60),
    DV CHAR(1),
    DIRECCION VARCHAR(60),
    CIUDAD VARCHAR(40),
    TELEFONO VARCHAR(40),
    CONTACTO VARCHAR(60),
    FAX VARCHAR(25),
    GRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    SUBGRUPO VARCHAR(3),
    NOMSUBG VARCHAR(30),
    MARCA VARCHAR(3),
    NOMMARCA VARCHAR(30),
    PESO NUMERIC(9,4),
    ANCHO NUMERIC(18,4),
    ALTO NUMERIC(18,4),
    LARGO NUMERIC(18,4),
    SUMA1 NUMERIC(18,2),
    SUMA2 NUMERIC(18,2),
    SUMA3 NUMERIC(18,2),
    IVA1 NUMERIC(18,2),
    IVA2 NUMERIC(18,2),
    IVA3 NUMERIC(18,2),
    TOTCONSUMO NUMERIC(18,2),
    SUMAEX NUMERIC(18,2),
    SUMAGR NUMERIC(18,2),
    OBSITEM BLOB SUB_TYPE 1 SEGMENT SIZE 80)
AS
DECLARE VARIABLE IMPTOS CHAR(1);
DECLARE VARIABLE TARIFA INTEGER;
declare variable ORDENCOD CHAR(2);
declare variable SUCUR VARCHAR(10);
declare variable PUNTOS NUMERIC(18,4);
BEGIN
  /*  */ /*$$IBE$$ 
  SELECT F.PREF_PRE, DEVT_NUMERO, DEVT_FECHA, F.BODE_COD, BODE_NOM, F.TERC_NIT, DEVT_NOMTERC, F.VEND_COD, VEND_NOMBRE, F.PTVT_ID, PTVT_NOM,
    DEVT_FACTURA, DEVT_COMIPORC, DEVT_COMIMONTO, DEVT_IVAINC,
    DEVT_DTOPOR, DEVT_DTOMONTO, DEVT_ADICIONAL, DEVT_IVAMONTO, DEVT_RTFTEPORC, DEVT_RTFTEMONTO, DEVT_RTIVAPORC, DEVT_RTIVAMONTO, DEVT_RTICAPORC, DEVT_RTICAMONTO, DEVT_EXTRA, DEVT_TOTAL,
    TERC_CONTACTO, TERC_FAX, TERC_DV, DEVT_OBS, DEVT_SUCURSAL, DEVT_REMISION
    FROM DEVOLUCIONES_VENTAS F, BODEGA B, VENDEDORES V, PUNTO_VENTA P, TERCEROS T
    WHERE F.BODE_COD = B.BODE_COD AND F.VEND_COD = V.VEND_COD AND F.PTVT_ID = P.PTVT_ID AND F.TERC_NIT = T.TERC_NIT AND F.DEVT_ID = :ID
    into :PREF, :NUMERO, :FECHA, :CODBODEGA, :NOMBODEGA, :NIT, :NOMTERCERO, :VENDEDOR, :NOMVENDEDOR, :PUNTOVTA, :NOMPUNTOVTA,
    :FACTURA, :COMIPORC, :COMIMONTO, :IMPTOS,
    :DTOPORC, :DTOMONTO, :ADICIONAL, :IVAMONTO, :RTEFTEPORC, :RTEFTEMONTO, :RTEIVAPORC, :RTEIVAMONTO, :RTEICAPORC, :RTEICAMONTO, :EXTRA, :TOTALFAC,
    :CONTACTO, :FAX, :DV, :OBS, :SUCUR, :REMISION;
  SUBTOTAL = TOTALFAC - EXTRA - IVAMONTO - ADICIONAL + DTOMONTO;
  TOTALPAGAR = TOTALFAC - RTEFTEMONTO - RTEIVAMONTO - RTEICAMONTO;

  EXECUTE PROCEDURE acumula_puntos_cliente (33, :id, :nit, :fecha) returning_values (:PUNTOS);
  SELECT CLIE_COD, C.ZONA_COD, ZONA_NOM
    FROM CLIENTES C, ZONAS Z
    WHERE TERC_NIT = :NIT AND C.ZONA_COD = Z.ZONA_COD
    INTO :CODIGOCL, :ZONACOD, :ZONANOM;
  SELECT CLSU_DIR, CLSU_CIUDAD, CLSU_TEL FROM CLIENTE_SUCURSALES WHERE TERC_NIT = :NIT AND CLCU_COD = :SUCUR
    INTO :DIRECCION, :CIUDAD, :TELEFONO;
    
  SUMAEX = 0;
  SUMA1 = 0;
  SUMA2 = 0;
  SUMA3 = 0;
  IVA1 = 0;
  IVA2 = 0;
  IVA3 = 0;
  TOTCONSUMO = 0;
  ITEM = 0;
  EXECUTE PROCEDURE lee_configuracion ('FACTURACION','DOCUMENTOS','ORDENAR ITEMS POR CODIGO DE ARTICULO') returning_values (:ORDENCOD);
  if (ORDENCOD = 'SI') then
    BEGIN
    FOR SELECT D.ARTI_COD, DVDE_CODBAR, SUBSTR(DVDE_DESC,1,60), DVDE_CANT, DVDE_UNIDAD, BODE_COD, DVDE_LOTE, DVDE_PRUNIT, DVDE_DTOPORC, DVDE_DTOMONTO, DVDE_IVAPORC, DVDE_IVAMONTO, DVDE_CONSUMO, DVDE_TOTAL, DVDE_REFERENCIA,
        GRUP_COD, SUBG_COD, MARC_COD, ARTI_PESO, ARTI_ANCHO, ARTI_ALTO, ARTI_LARGO, TAIV_COD, DVDE_OBS
        FROM DEVOLUCIONES_VENTAS_DETALLE D, ARTICULO A
        WHERE D.ARTI_COD = A.ARTI_COD AND D.DEVT_ID = :ID
        ORDER BY DVDE_CODBAR
        INTO :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :BODITEM, :LOTE, :PRUNIT, :DTOITPORC, :DTOITMONTO, :IVAPORC, :IVAITMONTO, :CONSUMO, :TOTAL, :REFITEM,
        :GRUPO, :SUBGRUPO, :MARCA, :PESO, :ANCHO, :ALTO, :LARGO, :TARIFA, :obsitem
        DO
        BEGIN
        if (ARTICULO = CODBAR) then
            SELECT FIRST 1 COBA_COD FROM barras_articulo WHERE ARTI_COD = :articulo INTO :CODBAR;
        ITEM = ITEM + 1;
        PRNETO = PRUNIT - DTOITMONTO - ((IVAITMONTO+CONSUMO) / CANT);
        TOTCONSUMO = TOTCONSUMO + CONSUMO;
        PRNETO = PRUNIT - DTOITMONTO;
        if (TARIFA = 0) then
            SUMAEX = SUMAEX + TOTAL;
        if (TARIFA = 1) then
            BEGIN
            SUMA1 = SUMA1 + TOTAL - IVAITMONTO;
            IVA1 = IVA1 + IVAITMONTO;
            END
        if (TARIFA = 2) then
            BEGIN
            SUMA2 = SUMA2 + TOTAL - IVAITMONTO;
            IVA2 = IVA2 + IVAITMONTO;
            END
        if (TARIFA = 3) then
            BEGIN
            SUMA3 = SUMA3 + TOTAL - IVAITMONTO;
            IVA3 = IVA3 + IVAITMONTO;
            END
        SUMAGR = SUMA1 + SUMA2 + SUMA3;
        if (IMPTOS = 'N') then
            TOTAL = TOTAL - IVAITMONTO - CONSUMO;
        SUSPEND;
        END
    END
ELSE
    BEGIN
    FOR SELECT D.ARTI_COD, DVDE_CODBAR, SUBSTR(DVDE_DESC,1,60), DVDE_CANT, DVDE_UNIDAD, BODE_COD, DVDE_LOTE, DVDE_PRUNIT, DVDE_DTOPORC, DVDE_DTOMONTO, DVDE_IVAPORC, DVDE_IVAMONTO, DVDE_CONSUMO, DVDE_TOTAL, DVDE_REFERENCIA,
        GRUP_COD, SUBG_COD, MARC_COD, ARTI_PESO, ARTI_ANCHO, ARTI_ALTO, ARTI_LARGO, TAIV_COD, DVDE_OBS
        FROM DEVOLUCIONES_VENTAS_DETALLE D, ARTICULO A
        WHERE D.ARTI_COD = A.ARTI_COD AND D.DEVT_ID = :ID
        ORDER BY DVDE_ITEM
        INTO :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :BODITEM, :LOTE, :PRUNIT, :DTOITPORC, :DTOITMONTO, :IVAPORC, :IVAITMONTO, :CONSUMO, :TOTAL, :REFITEM,
        :GRUPO, :SUBGRUPO, :MARCA, :PESO, :ANCHO, :ALTO, :LARGO, :TARIFA, :obsitem
        DO
        BEGIN
        if (ARTICULO = CODBAR) then
            SELECT FIRST 1 COBA_COD FROM barras_articulo WHERE ARTI_COD = :articulo INTO :CODBAR;
        SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :GRUPO INTO NOMGRUPO;
        SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :MARCA INTO NOMMARCA;
        SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :SUBGRUPO AND GRUP_COD = :GRUPO INTO :NOMSUBG;
        ITEM = ITEM + 1;
        PRNETO = PRUNIT - DTOITMONTO - ((IVAITMONTO+CONSUMO) / CANT);
        TOTCONSUMO = TOTCONSUMO + CONSUMO;
        PRNETO = PRUNIT - DTOITMONTO;
        if (TARIFA = 0) then
            SUMAEX = SUMAEX + TOTAL;
        if (TARIFA = 1) then
            BEGIN
            SUMA1 = SUMA1 + TOTAL - IVAITMONTO;
            IVA1 = IVA1 + IVAITMONTO;
            END
        if (TARIFA = 2) then
            BEGIN
            SUMA2 = SUMA2 + TOTAL - IVAITMONTO;
            IVA2 = IVA2 + IVAITMONTO;
            END
        if (TARIFA = 3) then
            BEGIN
            SUMA3 = SUMA3 + TOTAL - IVAITMONTO;
            IVA3 = IVA3 + IVAITMONTO;
            END
        SUMAGR = SUMA1 + SUMA2 + SUMA3;
        if (IMPTOS = 'N') then
            TOTAL = TOTAL - IVAITMONTO - CONSUMO;
        SUSPEND;
        END
    END
 $$IBE$$*/ SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE IMPR_FACTURA(
    ID INTEGER)
RETURNS (
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    VENCE DATE,
    DIASVENCE INTEGER,
    CONTCRED CHAR(17),
    NIT VARCHAR(20),
    NOMTERCERO VARCHAR(60),
    NOMCLIENTE VARCHAR(60),
    VENDEDOR INTEGER,
    NOMVENDEDOR VARCHAR(60),
    PUNTOVTA INTEGER,
    NOMPUNTOVTA VARCHAR(30),
    CODBODEGA VARCHAR(2),
    NOMBODEGA VARCHAR(30),
    AUTORIZACION VARCHAR(20),
    DESPACHO VARCHAR(255),
    TRANSPORTADOR VARCHAR(60),
    COTIZACION VARCHAR(30),
    PEDIDO VARCHAR(30),
    REMISION VARCHAR(30),
    PACIENTE VARCHAR(20),
    NOMPACIENTE VARCHAR(60),
    COMIPORC NUMERIC(9,2),
    COMIMONTO NUMERIC(18,2),
    SUBTOTAL NUMERIC(18,2),
    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),
    EXTRA NUMERIC(18,2),
    DTOFPORC NUMERIC(9,2),
    DTOFMONTO NUMERIC(18,2),
    FECHADTO DATE,
    TOTALFAC NUMERIC(18,2),
    TOTALPAGAR NUMERIC(18,2),
    OBS BLOB SUB_TYPE 1 SEGMENT SIZE 80,
    ITEM INTEGER,
    ARTICULO VARCHAR(15),
    CODBAR VARCHAR(15),
    ARTIDES VARCHAR(60),
    DESCORTA VARCHAR(30),
    CANT NUMERIC(18,4),
    LOTE VARCHAR(15),
    VLOTE DATE,
    UNIDAD VARCHAR(8),
    CAJAS NUMERIC(18,4),
    FACTOR INTEGER,
    LISTAPR INTEGER,
    REFITEM VARCHAR(60),
    BODITEM VARCHAR(2),
    PRUNIT NUMERIC(18,2),
    DTOITPORC NUMERIC(9,2),
    DTOITMONTO NUMERIC(18,2),
    PRNETO NUMERIC(18,2),
    IVAPORC NUMERIC(9,2),
    IVAITMONTO NUMERIC(18,2),
    CONSUMO NUMERIC(18,2),
    SUBTOTIT NUMERIC(18,2),
    SUBTOTITCON NUMERIC(18,2),
    DTOIT1 NUMERIC(9,2),
    DTOIT2 NUMERIC(9,2),
    DTOIT3 NUMERIC(9,2),
    TOTAL NUMERIC(18,2),
    CODIGOCL VARCHAR(20),
    ZONACOD VARCHAR(2),
    ZONANOM VARCHAR(60),
    DV CHAR(1),
    DIRECCION VARCHAR(60),
    CIUDAD VARCHAR(40),
    TELEFONO VARCHAR(40),
    CONTACTO VARCHAR(60),
    FAX VARCHAR(25),
    GRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    SUBGRUPO VARCHAR(3),
    NOMSUBG VARCHAR(30),
    MARCA VARCHAR(3),
    NOMMARCA VARCHAR(30),
    PESO NUMERIC(18,4),
    ANCHO NUMERIC(18,4),
    ALTO NUMERIC(18,4),
    LARGO NUMERIC(18,4),
    SUMA1 NUMERIC(18,2),
    SUMA2 NUMERIC(18,2),
    SUMA3 NUMERIC(18,2),
    IVA1 NUMERIC(18,2),
    IVA2 NUMERIC(18,2),
    IVA3 NUMERIC(18,2),
    SUMAEX NUMERIC(18,2),
    SUMAGR NUMERIC(18,2),
    TOTCONSUMO NUMERIC(18,2),
    DTOIT1M NUMERIC(18,2),
    DTOIT2M NUMERIC(18,2),
    DTOIT3M NUMERIC(18,2),
    TOTCAJAS NUMERIC(18,2),
    VEHICULO VARCHAR(8),
    RECIBIDO NUMERIC(18,2),
    CAMBIO NUMERIC(18,2),
    HORA TIME,
    FORMAPAGO1 VARCHAR(30),
    MONTOPAGO1 NUMERIC(18,2),
    FORMAPAGO2 VARCHAR(30),
    MONTOPAGO2 NUMERIC(18,2),
    FORMAPAGO3 VARCHAR(30),
    MONTOPAGO3 NUMERIC(18,2),
    PUNTOS INTEGER,
    PUNTOSACUM INTEGER,
    PUNTOSVENC INTEGER,
    FECPTOS DATE,
    OBSITEM BLOB SUB_TYPE 1 SEGMENT SIZE 80,
    SUCUR VARCHAR(10))
AS
DECLARE VARIABLE IMPTOS CHAR(1);
DECLARE VARIABLE TARIFA INTEGER;
declare variable DEVUELTO NUMERIC(18,2);
/*DECLARE VARIABLE NROCOPIA INTEGER;*/
declare variable ORDENCOD CHAR(2);
declare variable IMPRDEV CHAR(2);
declare variable IMPR CHAR(1);
declare variable ITEMFP INTEGER;
declare variable FORMAP VARCHAR(30);
declare variable MONTOP NUMERIC(18,2);
BEGIN /*$$IBE$$ 
  SELECT F.PREF_PRE, FACT_NUMERO, FACT_FECHA, FACT_VENCE, F.BODE_COD, BODE_NOM, F.TERC_NIT, FACT_NOMCLIENTE, F.VEND_COD, VEND_NOMBRE, F.PTVT_ID, PTVT_NOM,
    AUTO_NUMERO, FACT_DESPACHO, FACT_TRANSP, FACT_COTIZACI, FACT_PEDIDO, FACT_REMISION, FACT_COMIPORC, FACT_COMIMONTO, FACT_IVAINC, 
    FACT_DTOPOR, FACT_DTOMONTO, FACT_ADICIONAL, FACT_IVAMONTO, FACT_RTFTEPOR, FACT_RTFTEMONTO, FACT_RTIVAPOR, FACT_RTIVAMONTO, FACT_RTICAPOR, FACT_RTICAMONTO, FACT_EXTRA, FACT_DTOFPOR, FACT_DTOFMONTO, FACT_DTOFFECHA, FACT_TOTAL,
    TERC_DIR, TERC_CIU, TERC_TEL, TERC_CONTACTO, TERC_FAX, TERC_DV, FACT_DTOIT1, FACT_DTOIT2, FACT_DTOIT3,
    FACT_OBS, VEHI_COD,  $$IBE$$*/ /*FACT_NROCOPIA,*/ /*$$IBE$$  FACT_RECIBIDO, FACT_SUCURSAL, FACT_DETCLI, FACT_DETCLINOM, TERC_NOM
    FROM FACTURAS F, BODEGA B, VENDEDORES V, PUNTO_VENTA P, TERCEROS T
    WHERE F.BODE_COD = B.BODE_COD AND F.VEND_COD = V.VEND_COD AND F.PTVT_ID = P.PTVT_ID AND F.TERC_NIT = T.TERC_NIT AND F.FACT_ID = :ID
    into :PREF, :NUMERO, :FECHA, :VENCE, :CODBODEGA, :NOMBODEGA, :NIT, :NOMTERCERO, :VENDEDOR, :NOMVENDEDOR, :PUNTOVTA, :NOMPUNTOVTA,
    :AUTORIZACION, :DESPACHO, :TRANSPORTADOR, :COTIZACION, :PEDIDO, :REMISION, :COMIPORC, :COMIMONTO, :IMPTOS,
    :DTOPORC, :DTOMONTO, :ADICIONAL, :IVAMONTO, :RTEFTEPORC, :RTEFTEMONTO, :RTEIVAPORC, :RTEIVAMONTO, :RTEICAPORC, :RTEICAMONTO, :EXTRA, :DTOFPORC, :DTOFMONTO, :FECHADTO, :TOTALFAC,
    :DIRECCION, :CIUDAD, :TELEFONO, :CONTACTO, :FAX, :DV, :dtoit1m, :dtoit2m, :dtoit3m,
    :OBS, :VEHICULO, $$IBE$$*/ /* :NROCOPIA,*/ /*$$IBE$$  :RECIBIDO, :SUCUR, :paciente, :nompaciente, :nomcliente;

   $$IBE$$*/ /* ACUMULE LOS PUNTOS, SE HACE ACA POR SER POSTERIOR AL DETALLE */ /*$$IBE$$ 
  EXECUTE PROCEDURE acumula_puntos_cliente (31, :id, :nit, :fecha) returning_values (:PUNTOS);
  EXECUTE PROCEDURE consulta_puntos_cliente (:id, :nit, :fecha) returning_values (:puntos, :puntosacum, :puntosvenc, :fecptos);

  SELECT CLIE_COD, C.ZONA_COD, ZONA_NOM
    FROM CLIENTES C, ZONAS Z
    WHERE TERC_NIT = :NIT AND C.ZONA_COD = Z.ZONA_COD
    INTO :CODIGOCL, :ZONACOD, :ZONANOM;
   $$IBE$$*/ /*SELECT NOCO_NOMBRE FROM NOMBRES_COPIAS where NOCO_ID = :NROCOPIA INTO :NOMCOPIA;*/ /*$$IBE$$ 
  SELECT CLSU_DIR, CLSU_CIUDAD, CLSU_TEL FROM CLIENTE_SUCURSALES WHERE TERC_NIT = :NIT AND CLCU_COD = :SUCUR
    INTO :DIRECCION, :CIUDAD, :TELEFONO;
   $$IBE$$*/ /*if (NOMCOPIA IS NULL) then
    NOMCOPIA = 'COPIA No. ' || NROCOPIA;**/ /*$$IBE$$ 
  DIASVENCE = VENCE - FECHA;
  if (DIASVENCE > 0) then
    CONTCRED = 'CREDITO ' || CAST(DIASVENCE AS VARCHAR(3)) || ' DIAS';
  ELSE
    CONTCRED = 'CONTADO';
  SUBTOTAL = TOTALFAC - EXTRA - IVAMONTO - ADICIONAL + DTOMONTO;
  TOTALPAGAR = TOTALFAC - RTEFTEMONTO - RTEIVAMONTO - RTEICAMONTO;
  if (RECIBIDO <> 0) then
      CAMBIO = RECIBIDO - totalpagar;
  ELSE
    CAMBIO = 0;
  SUMAEX = 0;
  SUMA1 = 0;
  SUMA2 = 0;
  SUMA3 = 0;
  IVA1 = 0;
  IVA2 = 0;
  IVA3 = 0;
  TOTCONSUMO = 0;
  MONTOPAGO1 = 0;
  SELECT MAX(AUDI_HORA) FROM AUDITORIA WHERE TIDO_COD = 31 AND AUDI_IDDOC = :ID AND AUDI_OPER = 'I' INTO :HORA;
   $$IBE$$*/ /* AHORA LAS FORMAS DE PAGO, BUSQUE EL ABONO DE HOY A LA FACTURA */ /*$$IBE$$ 
  ITEMFP = 1;
  MONTOPAGO1 = 0;
  MONTOPAGO2 = 0;
  MONTOPAGO3 = 0;
  FOR SELECT FOPA_NOM, RCPA_MONTO FROM RECIBOS_CAJA_PAGO P, FORMAS_PAGO F, RECIBOS_CAJA R, RECIBOS_CAJA_DETALLE D
    WHERE R.RECA_ID = P.RECA_ID AND R.RECA_ID = D.RECA_ID AND P.FOPA_ID = F.FOPA_ID AND RECA_FECHA = :FECHA AND RCDE_TIPODOC = 31 AND RCDE_IDDOC = :ID
    INTO :formap, :MONTOP
    DO
    BEGIN
    if (ITEMFP = 1) then
        BEGIN
        FORMAPAGO1 = FORMAP;
        MONTOPAGO1 = MONTOP;
        END
    if (ITEMFP = 2) then
        BEGIN
        FORMAPAGO2 = FORMAP;
        MONTOPAGO2 = MONTOP;
        END
    if (ITEMFP = 3) then
        BEGIN
        FORMAPAGO3 = FORMAP;
        MONTOPAGO3 = MONTOP;
        END
    ITEMFP = ITEMFP + 1;
    END
  EXECUTE PROCEDURE lee_configuracion ('FACTURACION','DOCUMENTOS','ORDENAR ITEMS POR CODIGO DE ARTICULO') returning_values (:ORDENCOD);
  EXECUTE PROCEDURE lee_configuracion ('FACTURACION','POS', 'IMPRIMIR DEVOLUCIONES DE ARTICULOS NEGATIVOS') returning_values (:imprdev);
  totcajas = 0;
  if (ORDENCOD = 'SI') then
    BEGIN
    FOR SELECT FADE_ITEM, D.ARTI_COD, FADE_CODBAR, SUBSTR(FADE_DESC,1,60), ARTI_DESCORTA, FADE_CANT, FADE_UNIDAD, FADE_FACTOR, BODE_COD, FADE_LOTE, LIPR_COD, FADE_PRUNIT, FADE_DTOPORC, FADE_DTOMONTO, FADE_IVAPORC, FADE_IVAMONTO, FADE_CONSUMO, FADE_TOTAL, FADE_REFERENCIA,
        GRUP_COD, SUBG_COD, MARC_COD, ARTI_PESO, ARTI_ANCHO, ARTI_ALTO, ARTI_LARGO, TAIV_COD, FADE_DEVUELTO, FADE_OBS, FADE_DTO1, FADE_DTO2, FADE_DTO3, FADE_CAJAS
        FROM FACTURAS_DETALLE D, ARTICULO A
        WHERE D.ARTI_COD = A.ARTI_COD AND D.FACT_ID = :ID
        ORDER BY D.ARTI_COD
        INTO :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :DESCORTA, :CANT, :UNIDAD, :FACTOR, :BODITEM, :LOTE, :LISTAPR, :PRUNIT, :DTOITPORC, :DTOITMONTO, :IVAPORC, :IVAITMONTO, :CONSUMO, :TOTAL, :refitem,
        :GRUPO, :SUBGRUPO, :MARCA, :PESO, :ANCHO, :ALTO, :LARGO, :TARIFA, :devuelto, :obsitem, :dtoit1, :dtoit2, :dtoit3, :cajas
        DO
          BEGIN
          if (ARTICULO = CODBAR) then
            SELECT FIRST 1 COBA_COD FROM barras_articulo WHERE ARTI_COD = :articulo INTO :CODBAR;
          if (IMPRDEV <> 'SI') then
            BEGIN
            if ((CANT >= 0) AND (DEVUELTO = 0)) then
                IMPR = 'S';
            ELSE
                IMPR = 'N';  $$IBE$$*/ /* ES DEVOLUCION */ /*$$IBE$$ 
            END
          ELSE
            IMPR = 'S';
          if (IMPR = 'S') then
            BEGIN
            if (IMPTOS = 'S') then
                if (cant <> 0) then
                    PRNETO = PRUNIT - DTOITMONTO - ((IVAITMONTO+CONSUMO) / CANT);
                else
                    PRNETO = PRUNIT - DTOITMONTO;
            ELSE
                PRNETO = PRUNIT - DTOITMONTO;
            SUBTOTIT = TOTAL - IVAITMONTO - CONSUMO;
            SUBTOTITCON = TOTAL;
            TOTCONSUMO = TOTCONSUMO + CONSUMO;
            SELECT LOTE_VENCE FROM LOTES WHERE LOTE_NRO = :lote AND ARTI_COD = :ARTICULO AND BODE_COD = :boditem INTO :vlote;
            if (TARIFA = 0) then
                SUMAEX = SUMAEX + TOTAL;
            if (TARIFA = 1) then
                BEGIN
                SUMA1 = SUMA1 + TOTAL - IVAITMONTO;
                IVA1 = IVA1 + IVAITMONTO;
                END
            if (TARIFA = 2) then
                BEGIN
                SUMA2 = SUMA2 + TOTAL - IVAITMONTO;
                IVA2 = IVA2 + IVAITMONTO;
                END
            if (TARIFA = 3) then
                BEGIN
                SUMA3 = SUMA3 + TOTAL - IVAITMONTO;
                IVA3 = IVA3 + IVAITMONTO;
                END
            SUMAGR = SUMA1 + SUMA2 + SUMA3;
            if (IMPTOS = 'N') then
                TOTAL = TOTAL - IVAITMONTO - CONSUMO;
            if (ANCHO IS NULL) then
                ANCHO = 0;
            if (ALTO IS NULL) then
                ALTO = 0;
            if (LARGO IS NULL) then
                LARGO = 0;
            if (PESO IS NULL) then
                PESO = 0;
            PESO = PESO * CANT;
            totcajas = totcajas + cajas;
            SUSPEND;
            END
          END
    END
ELSE
    BEGIN
    FOR SELECT FADE_ITEM, D.ARTI_COD, FADE_CODBAR, SUBSTR(FADE_DESC,1,60), ARTI_DESCORTA, FADE_CANT, FADE_UNIDAD, FADE_FACTOR, BODE_COD, FADE_LOTE, LIPR_COD, FADE_PRUNIT, FADE_DTOPORC, FADE_DTOMONTO, FADE_IVAPORC, FADE_IVAMONTO, FADE_CONSUMO, FADE_TOTAL, FADE_REFERENCIA,
        GRUP_COD, SUBG_COD, MARC_COD, ARTI_PESO, ARTI_ANCHO, ARTI_ALTO, ARTI_LARGO, TAIV_COD, FADE_DEVUELTO, FADE_OBS, FADE_DTO1, FADE_DTO2, FADE_DTO3, FADE_CAJAS
        FROM FACTURAS_DETALLE D, ARTICULO A
        WHERE D.ARTI_COD = A.ARTI_COD AND D.FACT_ID = :ID
        ORDER BY FADE_ITEM
        INTO :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :DESCORTA, :CANT, :UNIDAD, :FACTOR, :BODITEM, :LOTE, :LISTAPR, :PRUNIT, :DTOITPORC, :DTOITMONTO, :IVAPORC, :IVAITMONTO, :CONSUMO, :TOTAL, :refitem,
        :GRUPO, :SUBGRUPO, :MARCA, :PESO, :ANCHO, :ALTO, :LARGO, :TARIFA, :devuelto, :obsitem, :dtoit1, :dtoit2, :dtoit3, :cajas
        DO
          BEGIN
          if (IMPRDEV <> 'SI') then
            BEGIN
            if ((CANT >= 0) AND (DEVUELTO = 0)) then
                IMPR = 'S';
            ELSE
                IMPR = 'N';  $$IBE$$*/ /* ES DEVOLUCION */ /*$$IBE$$ 
            END
          ELSE
            IMPR = 'S';
          if (IMPR = 'S') then
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :GRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :MARCA INTO NOMMARCA;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :SUBGRUPO AND GRUP_COD = :GRUPO INTO :NOMSUBG;
            if (IMPTOS = 'S') then
              if (CANT <> 0) then
                  PRNETO = PRUNIT - DTOITMONTO - ((IVAITMONTO+CONSUMO) / CANT);
            ELSE
              PRNETO = PRUNIT - DTOITMONTO;
            SUBTOTIT = TOTAL - IVAITMONTO - CONSUMO;
            SUBTOTITCON = TOTAL;
            TOTCONSUMO = TOTCONSUMO + CONSUMO;
            SELECT LOTE_VENCE FROM LOTES WHERE LOTE_NRO = :lote AND ARTI_COD = :ARTICULO AND BODE_COD = :boditem INTO :vlote;
            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;
            if (ANCHO IS NULL) then
                ANCHO = 0;
            if (ALTO IS NULL) then
                ALTO = 0;
            if (LARGO IS NULL) then
                LARGO = 0;
            if (PESO IS NULL) then
                PESO = 0;
            PESO = PESO * CANT;
            totcajas = totcajas + cajas;
            SUSPEND;
            END
          END
    END
 $$IBE$$*/ SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE IMPR_DEVOLUCION(
    ID INTEGER)
RETURNS (
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    NIT VARCHAR(20),
    NOMTERCERO VARCHAR(60),
    VENDEDOR INTEGER,
    NOMVENDEDOR VARCHAR(60),
    PUNTOVTA INTEGER,
    NOMPUNTOVTA VARCHAR(30),
    CODBODEGA VARCHAR(2),
    NOMBODEGA VARCHAR(30),
    FACTURA VARCHAR(30),
    REMISION VARCHAR(10),
    COMIPORC NUMERIC(9,2),
    COMIMONTO NUMERIC(18,2),
    SUBTOTAL NUMERIC(18,2),
    DTOPORC NUMERIC(9,2),
    DTOMONTO NUMERIC(18,2),
    ADICIONAL NUMERIC(18,2),
    IVAMONTO NUMERIC(18,2),
    RTEFTEPORC NUMERIC(9,2),
    RTEFTEMONTO NUMERIC(18,2),
    RTEIVAPORC NUMERIC(9,2),
    RTEIVAMONTO NUMERIC(18,2),
    RTEICAPORC NUMERIC(9,2),
    RTEICAMONTO NUMERIC(18,2),
    EXTRA NUMERIC(18,2),
    TOTALFAC NUMERIC(18,2),
    TOTALPAGAR NUMERIC(18,2),
    OBS BLOB SUB_TYPE 1 SEGMENT SIZE 80,
    ITEM INTEGER,
    ARTICULO VARCHAR(15),
    CODBAR VARCHAR(15),
    ARTIDES VARCHAR(60),
    CANT NUMERIC(18,4),
    LOTE VARCHAR(15),
    UNIDAD VARCHAR(8),
    REFITEM VARCHAR(60),
    BODITEM VARCHAR(2),
    PRUNIT NUMERIC(18,2),
    DTOITPORC NUMERIC(9,2),
    DTOITMONTO NUMERIC(18,2),
    PRNETO NUMERIC(18,2),
    IVAPORC NUMERIC(9,2),
    IVAITMONTO NUMERIC(18,2),
    CONSUMO NUMERIC(18,2),
    TOTAL NUMERIC(18,2),
    CODIGOCL VARCHAR(20),
    ZONACOD VARCHAR(2),
    ZONANOM VARCHAR(60),
    DV CHAR(1),
    DIRECCION VARCHAR(60),
    CIUDAD VARCHAR(40),
    TELEFONO VARCHAR(40),
    CONTACTO VARCHAR(60),
    FAX VARCHAR(25),
    GRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    SUBGRUPO VARCHAR(3),
    NOMSUBG VARCHAR(30),
    MARCA VARCHAR(3),
    NOMMARCA VARCHAR(30),
    PESO NUMERIC(9,4),
    ANCHO NUMERIC(18,4),
    ALTO NUMERIC(18,4),
    LARGO NUMERIC(18,4),
    SUMA1 NUMERIC(18,2),
    SUMA2 NUMERIC(18,2),
    SUMA3 NUMERIC(18,2),
    IVA1 NUMERIC(18,2),
    IVA2 NUMERIC(18,2),
    IVA3 NUMERIC(18,2),
    TOTCONSUMO NUMERIC(18,2),
    SUMAEX NUMERIC(18,2),
    SUMAGR NUMERIC(18,2),
    OBSITEM BLOB SUB_TYPE 1 SEGMENT SIZE 80)
AS
DECLARE VARIABLE IMPTOS CHAR(1);
DECLARE VARIABLE TARIFA INTEGER;
declare variable ORDENCOD CHAR(2);
declare variable SUCUR VARCHAR(10);
declare variable PUNTOS NUMERIC(18,4);
BEGIN
  /*  */
  SELECT F.PREF_PRE, DEVT_NUMERO, DEVT_FECHA, F.BODE_COD, BODE_NOM, F.TERC_NIT, DEVT_NOMTERC, F.VEND_COD, VEND_NOMBRE, F.PTVT_ID, PTVT_NOM,
    DEVT_FACTURA, DEVT_COMIPORC, DEVT_COMIMONTO, DEVT_IVAINC,
    DEVT_DTOPOR, DEVT_DTOMONTO, DEVT_ADICIONAL, DEVT_IVAMONTO, DEVT_RTFTEPORC, DEVT_RTFTEMONTO, DEVT_RTIVAPORC, DEVT_RTIVAMONTO, DEVT_RTICAPORC, DEVT_RTICAMONTO, DEVT_EXTRA, DEVT_TOTAL,
    TERC_CONTACTO, TERC_FAX, TERC_DV, DEVT_OBS, DEVT_SUCURSAL, DEVT_REMISION
    FROM DEVOLUCIONES_VENTAS F, BODEGA B, VENDEDORES V, PUNTO_VENTA P, TERCEROS T
    WHERE F.BODE_COD = B.BODE_COD AND F.VEND_COD = V.VEND_COD AND F.PTVT_ID = P.PTVT_ID AND F.TERC_NIT = T.TERC_NIT AND F.DEVT_ID = :ID
    into :PREF, :NUMERO, :FECHA, :CODBODEGA, :NOMBODEGA, :NIT, :NOMTERCERO, :VENDEDOR, :NOMVENDEDOR, :PUNTOVTA, :NOMPUNTOVTA,
    :FACTURA, :COMIPORC, :COMIMONTO, :IMPTOS,
    :DTOPORC, :DTOMONTO, :ADICIONAL, :IVAMONTO, :RTEFTEPORC, :RTEFTEMONTO, :RTEIVAPORC, :RTEIVAMONTO, :RTEICAPORC, :RTEICAMONTO, :EXTRA, :TOTALFAC,
    :CONTACTO, :FAX, :DV, :OBS, :SUCUR, :REMISION;
  SUBTOTAL = TOTALFAC - EXTRA - IVAMONTO - ADICIONAL + DTOMONTO;
  TOTALPAGAR = TOTALFAC - RTEFTEMONTO - RTEIVAMONTO - RTEICAMONTO;

  EXECUTE PROCEDURE acumula_puntos_cliente (33, :id, :nit, :fecha) returning_values (:PUNTOS);
  SELECT CLIE_COD, C.ZONA_COD, ZONA_NOM
    FROM CLIENTES C, ZONAS Z
    WHERE TERC_NIT = :NIT AND C.ZONA_COD = Z.ZONA_COD
    INTO :CODIGOCL, :ZONACOD, :ZONANOM;
  SELECT CLSU_DIR, CLSU_CIUDAD, CLSU_TEL FROM CLIENTE_SUCURSALES WHERE TERC_NIT = :NIT AND CLCU_COD = :SUCUR
    INTO :DIRECCION, :CIUDAD, :TELEFONO;
    
  SUMAEX = 0;
  SUMA1 = 0;
  SUMA2 = 0;
  SUMA3 = 0;
  IVA1 = 0;
  IVA2 = 0;
  IVA3 = 0;
  TOTCONSUMO = 0;
  ITEM = 0;
  EXECUTE PROCEDURE lee_configuracion ('FACTURACION','DOCUMENTOS','ORDENAR ITEMS POR CODIGO DE ARTICULO') returning_values (:ORDENCOD);
  if (ORDENCOD = 'SI') then
    BEGIN
    FOR SELECT D.ARTI_COD, DVDE_CODBAR, SUBSTR(DVDE_DESC,1,60), DVDE_CANT, DVDE_UNIDAD, BODE_COD, DVDE_LOTE, DVDE_PRUNIT, DVDE_DTOPORC, DVDE_DTOMONTO, DVDE_IVAPORC, DVDE_IVAMONTO, DVDE_CONSUMO, DVDE_TOTAL, DVDE_REFERENCIA,
        GRUP_COD, SUBG_COD, MARC_COD, ARTI_PESO, ARTI_ANCHO, ARTI_ALTO, ARTI_LARGO, TAIV_COD, DVDE_OBS
        FROM DEVOLUCIONES_VENTAS_DETALLE D, ARTICULO A
        WHERE D.ARTI_COD = A.ARTI_COD AND D.DEVT_ID = :ID
        ORDER BY DVDE_CODBAR
        INTO :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :BODITEM, :LOTE, :PRUNIT, :DTOITPORC, :DTOITMONTO, :IVAPORC, :IVAITMONTO, :CONSUMO, :TOTAL, :REFITEM,
        :GRUPO, :SUBGRUPO, :MARCA, :PESO, :ANCHO, :ALTO, :LARGO, :TARIFA, :obsitem
        DO
        BEGIN
        if (ARTICULO = CODBAR) then
            SELECT FIRST 1 COBA_COD FROM barras_articulo WHERE ARTI_COD = :articulo INTO :CODBAR;
        ITEM = ITEM + 1;
        PRNETO = PRUNIT - DTOITMONTO - ((IVAITMONTO+CONSUMO) / CANT);
        TOTCONSUMO = TOTCONSUMO + CONSUMO;
        PRNETO = PRUNIT - DTOITMONTO;
        if (TARIFA = 0) then
            SUMAEX = SUMAEX + TOTAL;
        if (TARIFA = 1) then
            BEGIN
            SUMA1 = SUMA1 + TOTAL - IVAITMONTO;
            IVA1 = IVA1 + IVAITMONTO;
            END
        if (TARIFA = 2) then
            BEGIN
            SUMA2 = SUMA2 + TOTAL - IVAITMONTO;
            IVA2 = IVA2 + IVAITMONTO;
            END
        if (TARIFA = 3) then
            BEGIN
            SUMA3 = SUMA3 + TOTAL - IVAITMONTO;
            IVA3 = IVA3 + IVAITMONTO;
            END
        SUMAGR = SUMA1 + SUMA2 + SUMA3;
        if (IMPTOS = 'N') then
            TOTAL = TOTAL - IVAITMONTO - CONSUMO;
        SUSPEND;
        END
    END
ELSE
    BEGIN
    FOR SELECT D.ARTI_COD, DVDE_CODBAR, SUBSTR(DVDE_DESC,1,60), DVDE_CANT, DVDE_UNIDAD, BODE_COD, DVDE_LOTE, DVDE_PRUNIT, DVDE_DTOPORC, DVDE_DTOMONTO, DVDE_IVAPORC, DVDE_IVAMONTO, DVDE_CONSUMO, DVDE_TOTAL, DVDE_REFERENCIA,
        GRUP_COD, SUBG_COD, MARC_COD, ARTI_PESO, ARTI_ANCHO, ARTI_ALTO, ARTI_LARGO, TAIV_COD, DVDE_OBS
        FROM DEVOLUCIONES_VENTAS_DETALLE D, ARTICULO A
        WHERE D.ARTI_COD = A.ARTI_COD AND D.DEVT_ID = :ID
        ORDER BY DVDE_ITEM
        INTO :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :BODITEM, :LOTE, :PRUNIT, :DTOITPORC, :DTOITMONTO, :IVAPORC, :IVAITMONTO, :CONSUMO, :TOTAL, :REFITEM,
        :GRUPO, :SUBGRUPO, :MARCA, :PESO, :ANCHO, :ALTO, :LARGO, :TARIFA, :obsitem
        DO
        BEGIN
        if (ARTICULO = CODBAR) then
            SELECT FIRST 1 COBA_COD FROM barras_articulo WHERE ARTI_COD = :articulo INTO :CODBAR;
        SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :GRUPO INTO NOMGRUPO;
        SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :MARCA INTO NOMMARCA;
        SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :SUBGRUPO AND GRUP_COD = :GRUPO INTO :NOMSUBG;
        ITEM = ITEM + 1;
        PRNETO = PRUNIT - DTOITMONTO - ((IVAITMONTO+CONSUMO) / CANT);
        TOTCONSUMO = TOTCONSUMO + CONSUMO;
        PRNETO = PRUNIT - DTOITMONTO;
        if (TARIFA = 0) then
            SUMAEX = SUMAEX + TOTAL;
        if (TARIFA = 1) then
            BEGIN
            SUMA1 = SUMA1 + TOTAL - IVAITMONTO;
            IVA1 = IVA1 + IVAITMONTO;
            END
        if (TARIFA = 2) then
            BEGIN
            SUMA2 = SUMA2 + TOTAL - IVAITMONTO;
            IVA2 = IVA2 + IVAITMONTO;
            END
        if (TARIFA = 3) then
            BEGIN
            SUMA3 = SUMA3 + TOTAL - IVAITMONTO;
            IVA3 = IVA3 + IVAITMONTO;
            END
        SUMAGR = SUMA1 + SUMA2 + SUMA3;
        if (IMPTOS = 'N') then
            TOTAL = TOTAL - IVAITMONTO - CONSUMO;
        SUSPEND;
        END
    END
END

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE IMPR_FACTURA(
    ID INTEGER)
RETURNS (
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    VENCE DATE,
    DIASVENCE INTEGER,
    CONTCRED CHAR(17),
    NIT VARCHAR(20),
    NOMTERCERO VARCHAR(60),
    NOMCLIENTE VARCHAR(60),
    VENDEDOR INTEGER,
    NOMVENDEDOR VARCHAR(60),
    PUNTOVTA INTEGER,
    NOMPUNTOVTA VARCHAR(30),
    CODBODEGA VARCHAR(2),
    NOMBODEGA VARCHAR(30),
    AUTORIZACION VARCHAR(20),
    DESPACHO VARCHAR(255),
    TRANSPORTADOR VARCHAR(60),
    COTIZACION VARCHAR(30),
    PEDIDO VARCHAR(30),
    REMISION VARCHAR(30),
    PACIENTE VARCHAR(20),
    NOMPACIENTE VARCHAR(60),
    COMIPORC NUMERIC(9,2),
    COMIMONTO NUMERIC(18,2),
    SUBTOTAL NUMERIC(18,2),
    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),
    EXTRA NUMERIC(18,2),
    DTOFPORC NUMERIC(9,2),
    DTOFMONTO NUMERIC(18,2),
    FECHADTO DATE,
    TOTALFAC NUMERIC(18,2),
    TOTALPAGAR NUMERIC(18,2),
    OBS BLOB SUB_TYPE 1 SEGMENT SIZE 80,
    ITEM INTEGER,
    ARTICULO VARCHAR(15),
    CODBAR VARCHAR(15),
    ARTIDES VARCHAR(60),
    DESCORTA VARCHAR(30),
    CANT NUMERIC(18,4),
    LOTE VARCHAR(15),
    VLOTE DATE,
    UNIDAD VARCHAR(8),
    CAJAS NUMERIC(18,4),
    FACTOR INTEGER,
    LISTAPR INTEGER,
    REFITEM VARCHAR(60),
    BODITEM VARCHAR(2),
    PRUNIT NUMERIC(18,2),
    DTOITPORC NUMERIC(9,2),
    DTOITMONTO NUMERIC(18,2),
    PRNETO NUMERIC(18,2),
    IVAPORC NUMERIC(9,2),
    IVAITMONTO NUMERIC(18,2),
    CONSUMO NUMERIC(18,2),
    SUBTOTIT NUMERIC(18,2),
    SUBTOTITCON NUMERIC(18,2),
    DTOIT1 NUMERIC(9,2),
    DTOIT2 NUMERIC(9,2),
    DTOIT3 NUMERIC(9,2),
    TOTAL NUMERIC(18,2),
    CODIGOCL VARCHAR(20),
    ZONACOD VARCHAR(2),
    ZONANOM VARCHAR(60),
    DV CHAR(1),
    DIRECCION VARCHAR(60),
    CIUDAD VARCHAR(40),
    TELEFONO VARCHAR(40),
    CONTACTO VARCHAR(60),
    FAX VARCHAR(25),
    GRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    SUBGRUPO VARCHAR(3),
    NOMSUBG VARCHAR(30),
    MARCA VARCHAR(3),
    NOMMARCA VARCHAR(30),
    PESO NUMERIC(18,4),
    ANCHO NUMERIC(18,4),
    ALTO NUMERIC(18,4),
    LARGO NUMERIC(18,4),
    SUMA1 NUMERIC(18,2),
    SUMA2 NUMERIC(18,2),
    SUMA3 NUMERIC(18,2),
    IVA1 NUMERIC(18,2),
    IVA2 NUMERIC(18,2),
    IVA3 NUMERIC(18,2),
    SUMAEX NUMERIC(18,2),
    SUMAGR NUMERIC(18,2),
    TOTCONSUMO NUMERIC(18,2),
    DTOIT1M NUMERIC(18,2),
    DTOIT2M NUMERIC(18,2),
    DTOIT3M NUMERIC(18,2),
    TOTCAJAS NUMERIC(18,2),
    VEHICULO VARCHAR(8),
    RECIBIDO NUMERIC(18,2),
    CAMBIO NUMERIC(18,2),
    HORA TIME,
    FORMAPAGO1 VARCHAR(30),
    MONTOPAGO1 NUMERIC(18,2),
    FORMAPAGO2 VARCHAR(30),
    MONTOPAGO2 NUMERIC(18,2),
    FORMAPAGO3 VARCHAR(30),
    MONTOPAGO3 NUMERIC(18,2),
    PUNTOS INTEGER,
    PUNTOSACUM INTEGER,
    PUNTOSVENC INTEGER,
    FECPTOS DATE,
    OBSITEM BLOB SUB_TYPE 1 SEGMENT SIZE 80,
    SUCUR VARCHAR(10))
AS
DECLARE VARIABLE IMPTOS CHAR(1);
DECLARE VARIABLE TARIFA INTEGER;
declare variable DEVUELTO NUMERIC(18,2);
/*DECLARE VARIABLE NROCOPIA INTEGER;*/
declare variable ORDENCOD CHAR(2);
declare variable IMPRDEV CHAR(2);
declare variable IMPR CHAR(1);
declare variable ITEMFP INTEGER;
declare variable FORMAP VARCHAR(30);
declare variable MONTOP NUMERIC(18,2);
BEGIN
  SELECT F.PREF_PRE, FACT_NUMERO, FACT_FECHA, FACT_VENCE, F.BODE_COD, BODE_NOM, F.TERC_NIT, FACT_NOMCLIENTE, F.VEND_COD, VEND_NOMBRE, F.PTVT_ID, PTVT_NOM,
    AUTO_NUMERO, FACT_DESPACHO, FACT_TRANSP, FACT_COTIZACI, FACT_PEDIDO, FACT_REMISION, FACT_COMIPORC, FACT_COMIMONTO, FACT_IVAINC, 
    FACT_DTOPOR, FACT_DTOMONTO, FACT_ADICIONAL, FACT_IVAMONTO, FACT_RTFTEPOR, FACT_RTFTEMONTO, FACT_RTIVAPOR, FACT_RTIVAMONTO, FACT_RTICAPOR, FACT_RTICAMONTO, FACT_EXTRA, FACT_DTOFPOR, FACT_DTOFMONTO, FACT_DTOFFECHA, FACT_TOTAL,
    TERC_DIR, TERC_CIU, TERC_TEL, TERC_CONTACTO, TERC_FAX, TERC_DV, FACT_DTOIT1, FACT_DTOIT2, FACT_DTOIT3,
    FACT_OBS, VEHI_COD, /*FACT_NROCOPIA,*/ FACT_RECIBIDO, FACT_SUCURSAL, FACT_DETCLI, FACT_DETCLINOM, TERC_NOM
    FROM FACTURAS F, BODEGA B, VENDEDORES V, PUNTO_VENTA P, TERCEROS T
    WHERE F.BODE_COD = B.BODE_COD AND F.VEND_COD = V.VEND_COD AND F.PTVT_ID = P.PTVT_ID AND F.TERC_NIT = T.TERC_NIT AND F.FACT_ID = :ID
    into :PREF, :NUMERO, :FECHA, :VENCE, :CODBODEGA, :NOMBODEGA, :NIT, :NOMTERCERO, :VENDEDOR, :NOMVENDEDOR, :PUNTOVTA, :NOMPUNTOVTA,
    :AUTORIZACION, :DESPACHO, :TRANSPORTADOR, :COTIZACION, :PEDIDO, :REMISION, :COMIPORC, :COMIMONTO, :IMPTOS,
    :DTOPORC, :DTOMONTO, :ADICIONAL, :IVAMONTO, :RTEFTEPORC, :RTEFTEMONTO, :RTEIVAPORC, :RTEIVAMONTO, :RTEICAPORC, :RTEICAMONTO, :EXTRA, :DTOFPORC, :DTOFMONTO, :FECHADTO, :TOTALFAC,
    :DIRECCION, :CIUDAD, :TELEFONO, :CONTACTO, :FAX, :DV, :dtoit1m, :dtoit2m, :dtoit3m,
    :OBS, :VEHICULO,/* :NROCOPIA,*/ :RECIBIDO, :SUCUR, :paciente, :nompaciente, :nomcliente;

  /* ACUMULE LOS PUNTOS, SE HACE ACA POR SER POSTERIOR AL DETALLE */
  EXECUTE PROCEDURE acumula_puntos_cliente (31, :id, :nit, :fecha) returning_values (:PUNTOS);
  EXECUTE PROCEDURE consulta_puntos_cliente (:id, :nit, :fecha) returning_values (:puntos, :puntosacum, :puntosvenc, :fecptos);

  SELECT CLIE_COD, C.ZONA_COD, ZONA_NOM
    FROM CLIENTES C, ZONAS Z
    WHERE TERC_NIT = :NIT AND C.ZONA_COD = Z.ZONA_COD
    INTO :CODIGOCL, :ZONACOD, :ZONANOM;
  /*SELECT NOCO_NOMBRE FROM NOMBRES_COPIAS where NOCO_ID = :NROCOPIA INTO :NOMCOPIA;*/
  SELECT CLSU_DIR, CLSU_CIUDAD, CLSU_TEL FROM CLIENTE_SUCURSALES WHERE TERC_NIT = :NIT AND CLCU_COD = :SUCUR
    INTO :DIRECCION, :CIUDAD, :TELEFONO;
  /*if (NOMCOPIA IS NULL) then
    NOMCOPIA = 'COPIA No. ' || NROCOPIA;**/
  DIASVENCE = VENCE - FECHA;
  if (DIASVENCE > 0) then
    CONTCRED = 'CREDITO ' || CAST(DIASVENCE AS VARCHAR(3)) || ' DIAS';
  ELSE
    CONTCRED = 'CONTADO';
  SUBTOTAL = TOTALFAC - EXTRA - IVAMONTO - ADICIONAL + DTOMONTO;
  TOTALPAGAR = TOTALFAC - RTEFTEMONTO - RTEIVAMONTO - RTEICAMONTO;
  if (RECIBIDO <> 0) then
      CAMBIO = RECIBIDO - totalpagar;
  ELSE
    CAMBIO = 0;
  SUMAEX = 0;
  SUMA1 = 0;
  SUMA2 = 0;
  SUMA3 = 0;
  IVA1 = 0;
  IVA2 = 0;
  IVA3 = 0;
  TOTCONSUMO = 0;
  MONTOPAGO1 = 0;
  SELECT MAX(AUDI_HORA) FROM AUDITORIA WHERE TIDO_COD = 31 AND AUDI_IDDOC = :ID AND AUDI_OPER = 'I' INTO :HORA;
  /* AHORA LAS FORMAS DE PAGO, BUSQUE EL ABONO DE HOY A LA FACTURA */
  ITEMFP = 1;
  MONTOPAGO1 = 0;
  MONTOPAGO2 = 0;
  MONTOPAGO3 = 0;
  FOR SELECT FOPA_NOM, RCPA_MONTO FROM RECIBOS_CAJA_PAGO P, FORMAS_PAGO F, RECIBOS_CAJA R, RECIBOS_CAJA_DETALLE D
    WHERE R.RECA_ID = P.RECA_ID AND R.RECA_ID = D.RECA_ID AND P.FOPA_ID = F.FOPA_ID AND RECA_FECHA = :FECHA AND RCDE_TIPODOC = 31 AND RCDE_IDDOC = :ID
    INTO :formap, :MONTOP
    DO
    BEGIN
    if (ITEMFP = 1) then
        BEGIN
        FORMAPAGO1 = FORMAP;
        MONTOPAGO1 = MONTOP;
        END
    if (ITEMFP = 2) then
        BEGIN
        FORMAPAGO2 = FORMAP;
        MONTOPAGO2 = MONTOP;
        END
    if (ITEMFP = 3) then
        BEGIN
        FORMAPAGO3 = FORMAP;
        MONTOPAGO3 = MONTOP;
        END
    ITEMFP = ITEMFP + 1;
    END
  EXECUTE PROCEDURE lee_configuracion ('FACTURACION','DOCUMENTOS','ORDENAR ITEMS POR CODIGO DE ARTICULO') returning_values (:ORDENCOD);
  EXECUTE PROCEDURE lee_configuracion ('FACTURACION','POS', 'IMPRIMIR DEVOLUCIONES DE ARTICULOS NEGATIVOS') returning_values (:imprdev);
  totcajas = 0;
  if (ORDENCOD = 'SI') then
    BEGIN
    FOR SELECT FADE_ITEM, D.ARTI_COD, FADE_CODBAR, SUBSTR(FADE_DESC,1,60), ARTI_DESCORTA, FADE_CANT, FADE_UNIDAD, FADE_FACTOR, BODE_COD, FADE_LOTE, LIPR_COD, FADE_PRUNIT, FADE_DTOPORC, FADE_DTOMONTO, FADE_IVAPORC, FADE_IVAMONTO, FADE_CONSUMO, FADE_TOTAL, FADE_REFERENCIA,
        GRUP_COD, SUBG_COD, MARC_COD, ARTI_PESO, ARTI_ANCHO, ARTI_ALTO, ARTI_LARGO, TAIV_COD, FADE_DEVUELTO, FADE_OBS, FADE_DTO1, FADE_DTO2, FADE_DTO3, FADE_CAJAS
        FROM FACTURAS_DETALLE D, ARTICULO A
        WHERE D.ARTI_COD = A.ARTI_COD AND D.FACT_ID = :ID
        ORDER BY D.ARTI_COD
        INTO :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :DESCORTA, :CANT, :UNIDAD, :FACTOR, :BODITEM, :LOTE, :LISTAPR, :PRUNIT, :DTOITPORC, :DTOITMONTO, :IVAPORC, :IVAITMONTO, :CONSUMO, :TOTAL, :refitem,
        :GRUPO, :SUBGRUPO, :MARCA, :PESO, :ANCHO, :ALTO, :LARGO, :TARIFA, :devuelto, :obsitem, :dtoit1, :dtoit2, :dtoit3, :cajas
        DO
          BEGIN
          if (ARTICULO = CODBAR) then
            SELECT FIRST 1 COBA_COD FROM barras_articulo WHERE ARTI_COD = :articulo INTO :CODBAR;
          if (IMPRDEV <> 'SI') then
            BEGIN
            if ((CANT >= 0) AND (DEVUELTO = 0)) then
                IMPR = 'S';
            ELSE
                IMPR = 'N'; /* ES DEVOLUCION */
            END
          ELSE
            IMPR = 'S';
          if (IMPR = 'S') then
            BEGIN
            if (IMPTOS = 'S') then
                if (cant <> 0) then
                    PRNETO = PRUNIT - DTOITMONTO - ((IVAITMONTO+CONSUMO) / CANT);
                else
                    PRNETO = PRUNIT - DTOITMONTO;
            ELSE
                PRNETO = PRUNIT - DTOITMONTO;
            SUBTOTIT = TOTAL - IVAITMONTO - CONSUMO;
            SUBTOTITCON = TOTAL;
            TOTCONSUMO = TOTCONSUMO + CONSUMO;
            SELECT LOTE_VENCE FROM LOTES WHERE LOTE_NRO = :lote AND ARTI_COD = :ARTICULO AND BODE_COD = :boditem INTO :vlote;
            if (TARIFA = 0) then
                SUMAEX = SUMAEX + TOTAL;
            if (TARIFA = 1) then
                BEGIN
                SUMA1 = SUMA1 + TOTAL - IVAITMONTO;
                IVA1 = IVA1 + IVAITMONTO;
                END
            if (TARIFA = 2) then
                BEGIN
                SUMA2 = SUMA2 + TOTAL - IVAITMONTO;
                IVA2 = IVA2 + IVAITMONTO;
                END
            if (TARIFA = 3) then
                BEGIN
                SUMA3 = SUMA3 + TOTAL - IVAITMONTO;
                IVA3 = IVA3 + IVAITMONTO;
                END
            SUMAGR = SUMA1 + SUMA2 + SUMA3;
            if (IMPTOS = 'N') then
                TOTAL = TOTAL - IVAITMONTO - CONSUMO;
            if (ANCHO IS NULL) then
                ANCHO = 0;
            if (ALTO IS NULL) then
                ALTO = 0;
            if (LARGO IS NULL) then
                LARGO = 0;
            if (PESO IS NULL) then
                PESO = 0;
            PESO = PESO * CANT;
            totcajas = totcajas + cajas;
            SUSPEND;
            END
          END
    END
ELSE
    BEGIN
    FOR SELECT FADE_ITEM, D.ARTI_COD, FADE_CODBAR, SUBSTR(FADE_DESC,1,60), ARTI_DESCORTA, FADE_CANT, FADE_UNIDAD, FADE_FACTOR, BODE_COD, FADE_LOTE, LIPR_COD, FADE_PRUNIT, FADE_DTOPORC, FADE_DTOMONTO, FADE_IVAPORC, FADE_IVAMONTO, FADE_CONSUMO, FADE_TOTAL, FADE_REFERENCIA,
        GRUP_COD, SUBG_COD, MARC_COD, ARTI_PESO, ARTI_ANCHO, ARTI_ALTO, ARTI_LARGO, TAIV_COD, FADE_DEVUELTO, FADE_OBS, FADE_DTO1, FADE_DTO2, FADE_DTO3, FADE_CAJAS
        FROM FACTURAS_DETALLE D, ARTICULO A
        WHERE D.ARTI_COD = A.ARTI_COD AND D.FACT_ID = :ID
        ORDER BY FADE_ITEM
        INTO :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :DESCORTA, :CANT, :UNIDAD, :FACTOR, :BODITEM, :LOTE, :LISTAPR, :PRUNIT, :DTOITPORC, :DTOITMONTO, :IVAPORC, :IVAITMONTO, :CONSUMO, :TOTAL, :refitem,
        :GRUPO, :SUBGRUPO, :MARCA, :PESO, :ANCHO, :ALTO, :LARGO, :TARIFA, :devuelto, :obsitem, :dtoit1, :dtoit2, :dtoit3, :cajas
        DO
          BEGIN
          if (IMPRDEV <> 'SI') then
            BEGIN
            if ((CANT >= 0) AND (DEVUELTO = 0)) then
                IMPR = 'S';
            ELSE
                IMPR = 'N'; /* ES DEVOLUCION */
            END
          ELSE
            IMPR = 'S';
          if (IMPR = 'S') then
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :GRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :MARCA INTO NOMMARCA;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :SUBGRUPO AND GRUP_COD = :GRUPO INTO :NOMSUBG;
            if (IMPTOS = 'S') then
              if (CANT <> 0) then
                  PRNETO = PRUNIT - DTOITMONTO - ((IVAITMONTO+CONSUMO) / CANT);
            ELSE
              PRNETO = PRUNIT - DTOITMONTO;
            SUBTOTIT = TOTAL - IVAITMONTO - CONSUMO;
            SUBTOTITCON = TOTAL;
            TOTCONSUMO = TOTCONSUMO + CONSUMO;
            SELECT LOTE_VENCE FROM LOTES WHERE LOTE_NRO = :lote AND ARTI_COD = :ARTICULO AND BODE_COD = :boditem INTO :vlote;
            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;
            if (ANCHO IS NULL) then
                ANCHO = 0;
            if (ALTO IS NULL) then
                ALTO = 0;
            if (LARGO IS NULL) then
                LARGO = 0;
            if (PESO IS NULL) then
                PESO = 0;
            PESO = PESO * CANT;
            totcajas = totcajas + cajas;
            SUSPEND;
            END
          END
    END
END

^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER PROCEDURE ASIGNA_RUTERO_FAC(
    TIPO INTEGER,
    FECFIN DATE,
    SUBEMPRESA INTEGER)
RETURNS (
    ID INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    FECDOC DATE,
    VENDCOD INTEGER,
    NIT VARCHAR(20),
    NOMTERCERO VARCHAR(60),
    PEDIDO VARCHAR(30),
    REMISION VARCHAR(30),
    CANT NUMERIC(18,4),
    CAJAS NUMERIC(18,4),
    TOTAL NUMERIC(18,2),
    OK CHAR(1),
    ENTREGADO CHAR(1),
    RAZON INTEGER,
    EXPLICA VARCHAR(60))
AS
declare variable FECINI DATE;
declare variable DIAS INTEGER;
BEGIN
OK = 'N';
ENTREGADO = 'N';
RAZON = 0;
EXPLICA = '';
EXECUTE PROCEDURE lee_configuracion('FACTURACION', 'DOCUMENTOS', 'NUMERO DE DIAS MAXIMO PARA ASIGNAR DOCUMENTO A UNA RUTA') returning_values (DIAS);
FECINI = FECFIN - DIAS;
/* DETERMINE LA TABLA A EXAMINAR */
if (TIPO=31) then
    BEGIN
    FOR SELECT FACT_ID, F.PREF_PRE, FACT_NUMERO, FACT_FECHA, F.VEND_COD, F.TERC_NIT, FACT_NOMCLIENTE, FACT_PEDIDO, FACT_REMISION, FACT_TOTAL
        FROM FACTURAS F, PREFIJOS PR
        WHERE FACT_FECHA >= :fecini AND FACT_FECHA <= :fecfin AND PR.PREF_PRE = F.PREF_PRE AND PR.TIDO_COD = 31 AND ((PR.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            AND FACT_ANULADO = 'N' AND NOT EXISTS (SELECT RUTA_ID FROM RUTERO_FAC WHERE TIDO_COD = 31 AND RUTA_IDDOC = F.fact_id)
        ORDER BY FACT_FECHA, FACT_ID
        INTO :ID, :PREF, :NUMERO, :FECDOC, :VENDCOD, :NIT, :NOMTERCERO, :PEDIDO, :REMISION, :TOTAL
        DO
        BEGIN
        SELECT SUM(FADE_CANT), SUM(FADE_CAJAS) FROM FACTURAS_DETALLE WHERE FACT_ID = :ID and substring(arti_cod from 1 FOR 2) <> '.t' INTO :CANT, :CAJAS;
        SUSPEND;
        END
    END
if (TIPO=32) then
    BEGIN
    FOR SELECT REVT_ID, R.PREF_PRE, REVT_NUMERO, REVT_FECHA, R.VEND_COD, R.TERC_NIT, REVT_NOMTERC, REVT_PEDIDO, REVT_FACTURA, REVT_TOTAL
        FROM REMISIONES_VENTA R, PREFIJOS PR
        WHERE REVT_FECHA >= :fecini AND REVT_FECHA <= :fecfin AND PR.PREF_PRE = R.PREF_PRE AND PR.TIDO_COD = 32 AND ((PR.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
        AND REVT_ANULADO = 'N' AND NOT EXISTS (SELECT RUTA_ID FROM RUTERO_FAC WHERE TIDO_COD = 32 AND RUTA_IDDOC = R.revt_id)
        ORDER BY REVT_FECHA, REVT_ID
        INTO :ID, :PREF, :NUMERO, :FECDOC, :VENDCOD, :NIT, :NOMTERCERO, :PEDIDO, :REMISION, :TOTAL
        DO
        BEGIN
        SELECT SUM(RVDE_CANT), SUM(RVDE_CAJAS) FROM REMISIONES_VENTA_DETALLE WHERE REVT_ID = :ID INTO :CANT, :CAJAS;
        SUSPEND;
        END
    END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER PROCEDURE CIERRE_FACTURACION(
    FECHA DATE,
    PUNTO INTEGER,
    PREFIJO VARCHAR(4))
RETURNS (
    PREF VARCHAR(4),
    AUTORIZA VARCHAR(20),
    PUNTOVTA VARCHAR(60),
    NUMINI VARCHAR(6),
    NUMFIN VARCHAR(6),
    NROFAC INTEGER,
    HORAINI TIME,
    HORAFIN TIME,
    BASEFAC NUMERIC(18,2),
    IVAFAC NUMERIC(18,2),
    TOTALFAC NUMERIC(18,2),
    NROITE INTEGER,
    NRODEV INTEGER,
    BASEDEV NUMERIC(18,2),
    IVADEV NUMERIC(18,2),
    TOTALDEV NUMERIC(18,2),
    BASENETO NUMERIC(18,2),
    IVANETO NUMERIC(18,2),
    TOTALNETO NUMERIC(18,2),
    BASEF0 NUMERIC(18,2),
    IVAF0 NUMERIC(18,2),
    TOTALF0 NUMERIC(18,2),
    BASED0 NUMERIC(18,2),
    IVAD0 NUMERIC(18,2),
    TOTALD0 NUMERIC(18,2),
    BASEF1 NUMERIC(18,2),
    IVAF1 NUMERIC(18,2),
    TOTALF1 NUMERIC(18,2),
    BASED1 NUMERIC(18,2),
    IVAD1 NUMERIC(18,2),
    TOTALD1 NUMERIC(18,2),
    BASEF2 NUMERIC(18,2),
    IVAF2 NUMERIC(18,2),
    TOTALF2 NUMERIC(18,2),
    BASED2 NUMERIC(18,2),
    IVAD2 NUMERIC(18,2),
    TOTALD2 NUMERIC(18,2),
    BASEF3 NUMERIC(18,2),
    IVAF3 NUMERIC(18,2),
    TOTALF3 NUMERIC(18,2),
    BASED3 NUMERIC(18,2),
    IVAD3 NUMERIC(18,2),
    TOTALD3 NUMERIC(18,2),
    BASEF4 NUMERIC(18,2),
    IVAF4 NUMERIC(18,2),
    TOTALF4 NUMERIC(18,2),
    BASED4 NUMERIC(18,2),
    IVAD4 NUMERIC(18,2),
    TOTALD4 NUMERIC(18,2),
    FORMAP1 NUMERIC(18,2),
    FORMAP2 NUMERIC(18,2),
    FORMAP3 NUMERIC(18,2),
    FORMAP4 NUMERIC(18,2),
    FORMAP5 NUMERIC(18,2),
    CARTERA NUMERIC(18,2),
    VENDEDOR1 VARCHAR(60),
    VTAVEND1 NUMERIC(18,2),
    VENDEDOR2 VARCHAR(60),
    VTAVEND2 NUMERIC(18,2),
    VENDEDOR3 VARCHAR(60),
    VTAVEND3 NUMERIC(18,2),
    VENDEDOR4 VARCHAR(60),
    VTAVEND4 NUMERIC(18,2),
    VENDEDOR5 VARCHAR(60),
    VTAVEND5 NUMERIC(18,2),
    NROFACTANUL INTEGER,
    IVANUL NUMERIC(18,2),
    TOTALFACANUL NUMERIC(18,2))
AS
declare variable tarifa NUMERIC(9,2);
declare variable BASEF NUMERIC(18,2);
declare variable IVAF NUMERIC(18,2);
declare variable TOTALF NUMERIC(18,2);
declare variable BASEDv NUMERIC(18,2);
declare variable IVAD NUMERIC(18,2);
declare variable TOTALD NUMERIC(18,2);
declare variable I INTEGER;
declare variable CODVEN INTEGER;
declare variable VENDED VARCHAR(60);
declare variable R_IDDOC INTEGER;
declare variable F_ID INTEGER;
declare variable F_TOTAL NUMERIC(18,2);
begin
  SELECT PREF_PRE, AUTO_NUMERO FROM AUTORIZACIONES WHERE PREF_PRE = :PREFIJO INTO :PREF, :autoriza;
  SELECT PTVT_NOM FROM PUNTO_VENTA WHERE PTVT_ID = :punto INTO :puntovta;
  SELECT MIN(AUDI_HORA) FROM AUDITORIA WHERE TIDO_COD = 131 AND AUDI_FECHA = :FECHA INTO :HORAINI;
  HORAFIN = CAST('NOW' AS TIME);
  /* LAS VENTAS */
  SELECT MIN(FACT_NUMERO), MAX(FACT_NUMERO), COUNT(FACT_NUMERO), SUM(FACT_TOTAL - FACT_IVAMONTO), SUM(FACT_IVAMONTO), SUM(FACT_TOTAL)
    FROM FACTURAS WHERE FACT_FECHA = :FECHA AND PTVT_ID = :PUNTO AND PREF_PRE = :PREFIJO and FACT_ANULADO = 'N'
    INTO :NUMINI, :NUMFIN, :NROFAC, :BASENETO, :IVANETO, :TOTALNETO;
  SELECT COUNT(FADE_ITEM), SUM(FADE_TOTAL-FADE_IVAMONTO), SUM(FADE_IVAMONTO), SUM(FADE_TOTAL) FROM facturas_detalle D, FACTURAS F
    WHERE D.FACT_ID = F.FACT_ID AND FACT_FECHA = :FECHA AND PTVT_ID = :PUNTO AND PREF_PRE = :PREFIJO AND FADE_CANT > 0 and FACT_ANULADO = 'N' and substring(d.arti_cod from 1 FOR 2) <> '.t'
    INTO :nroite, :BASEFAC, :IVAFAC, :TOTALFAC;
  SELECT COUNT(FADE_ITEM), SUM(FADE_TOTAL-FADE_IVAMONTO), SUM(FADE_IVAMONTO), SUM(FADE_TOTAL) FROM facturas_detalle D, FACTURAS F
    WHERE D.FACT_ID = F.FACT_ID AND FACT_FECHA = :FECHA AND PTVT_ID = :PUNTO AND PREF_PRE = :PREFIJO AND FADE_CANT < 0 and FACT_ANULADO = 'N' and substring(d.arti_cod from 1 FOR 2) <> '.t'
    INTO :NRODEV, :BASEDEV, :IVADEV, :TOTALDEV;
  SELECT COUNT(DVDE_ITEM), SUM(DVDE_TOTAL-DVDE_IVAMONTO), SUM(DVDE_IVAMONTO), SUM(DVDE_TOTAL) FROM devoluciones_ventas_detalle D, devoluciones_ventas F
    WHERE D.DEVT_ID = F.DEVT_ID AND DEVT_FECHA = :FECHA AND PTVT_ID = :PUNTO AND PREF_PRE = :PREFIJO AND DEVT_ANULADO = 'N' and substring(d.arti_cod from 1 FOR 2) <> '.t'
    INTO :I, :BASEDV, :IVAD, :TOTALD;
  SELECT COUNT(FACT_NUMERO),SUM(FACT_TOTAL - FACT_IVAMONTO), SUM(FACT_IVAMONTO) FROM FACTURAS
    WHERE FACT_FECHA = :FECHA AND PTVT_ID = :PUNTO AND PREF_PRE = :PREFIJO and FACT_ANULADO = 'S'
    INTO :NROFACTANUL, :TOTALFACANUL, :IVANUL;
  if (nrofac is null) then
    nrofac = 0;
  if (NROFACTANUL is null) then
    NROFACTANUL = 0;
  if (TOTALFACANUL is null) then
    TOTALFACANUL = 0;
  if (IVANUL is null) then
    IVANUL = 0;
  if (baseneto is null) then
    baseneto = 0;
  if (ivaneto is null) then
    ivaneto = 0;
  if (totalneto is null) then
    totalneto = 0;
  if (nroite is null) then
    nroite = 0;
  if (basefac is null) then
    basefac = 0;
  if (ivafac is null) then
    ivafac = 0;
  if (totalfac is null) then
    totalfac = 0;
  if (nrodev is null) then
    nrodev = 0;
  if (basedev is null) then
    basedev = 0;
  if (ivadev is null) then
    ivadev = 0;
  if (totaldev is null) then
    totaldev = 0;
  if (I is null) then
    I = 0;
  if (basedv is null) then
    basedv = 0;
  if (ivad is null) then
    ivad = 0;
  if (totald is null) then
    totald = 0;
  NRODEV = NRODEV + I;
  BASEDEV = BASEDEV + BASEDV;
  IVADEV = IVADEV + IVAD;
  TOTALDEV = TOTALDEV + TOTALD;

  /* POR TARIFA DE IVA */
  I = 0;
  BASEF0 = 0;
  BASED0 = 0;
  IVAF0 = 0;
  IVAD0 = 0;
  TOTALF0 = 0;
  TOTALD0 = 0;
  BASEF1 = 0;
  BASED1 = 0;
  IVAF1 = 0;
  IVAD1 = 0;
  TOTALF1 = 0;
  TOTALD1 = 0;
  BASEF2 = 0;
  BASED2 = 0;
  IVAF2 = 0;
  IVAD2 = 0;
  TOTALF2 = 0;
  TOTALD2 = 0;
  BASEF3 = 0;
  BASED3 = 0;
  IVAF3 = 0;
  IVAD3 = 0;
  TOTALF3 = 0;
  TOTALD3 = 0;
  BASEF4 = 0;
  BASED4 = 0;
  IVAF4 = 0;
  IVAD4 = 0;
  TOTALF4 = 0;
  TOTALD4 = 0;
  vtavend1 = 0;
  vtavend2 = 0;
  vtavend3 = 0;
  vtavend4 = 0;
  vtavend5 = 0;
  FOR SELECT TAIV_PORC FROM TARIFA_IVA ORDER BY TAIV_PORC INTO :TARIFA DO
    BEGIN
    I = I + 1;
    SELECT SUM(FADE_TOTAL-FADE_IVAMONTO), SUM(FADE_IVAMONTO), SUM(FADE_TOTAL) FROM facturas_detalle D, FACTURAS F
        WHERE D.FACT_ID = F.FACT_ID AND FACT_FECHA = :FECHA AND PTVT_ID = :PUNTO AND PREF_PRE = :PREFIJO AND FADE_CANT > 0 AND FADE_IVAPORC = :TARIFA and FACT_ANULADO = 'N'
        INTO :BASEF, :IVAF, :TOTALF;
    SELECT SUM(FADE_TOTAL-FADE_IVAMONTO), SUM(FADE_IVAMONTO), SUM(FADE_TOTAL) FROM facturas_detalle D, FACTURAS F
        WHERE D.FACT_ID = F.FACT_ID AND FACT_FECHA = :FECHA AND PTVT_ID = :PUNTO AND PREF_PRE = :PREFIJO AND FADE_CANT < 0 AND FADE_IVAPORC = :TARIFA and FACT_ANULADO = 'N'
        INTO :BASEDV, :IVAD, :TOTALD;
    if (basef is null) then
        basef = 0;
    if (ivaf is null) then
        ivaf = 0;
    if (totalf is null) then
        totalf = 0;
    if (basedv is null) then
        basedv = 0;
    if (ivad is null) then
        ivad = 0;
    if (totald is null) then
        totald = 0;
    if (I = 1) then
        BEGIN
        BASEF0 = BASEF;
        BASED0 = :BASEDV;
        IVAF0 = IVAF;
        IVAD0 = IVAD;
        TOTALF0 = TOTALF;
        TOTALD0 = TOTALD;
        SELECT SUM(DVDE_TOTAL-DVDE_IVAMONTO), SUM(DVDE_IVAMONTO), SUM(DVDE_TOTAL) FROM devoluciones_ventas_detalle D, devoluciones_ventas F
            WHERE D.DEVT_ID = F.DEVT_ID AND DEVT_FECHA = :FECHA AND PTVT_ID = :PUNTO AND PREF_PRE = :PREFIJO AND DVDE_IVAPORC = :TARIFA and DEVT_ANULADO = 'N'
            INTO :BASEDV, :IVAD, :TOTALD;
        if (basedv is null) then
            basedv = 0;
        if (ivad is null) then
            ivad = 0;
        if (totald is null) then
            totald = 0;
        BASED0 = BASED0 + BASEDV;
        IVAD0 = IVAD0 + IVAD;
        TOTALD0 = TOTALD0 + TOTALD;
        END
    if (I = 2) then
        BEGIN
        BASEF1 = BASEF;
        BASED1 = :BASEDV;
        IVAF1 = IVAF;
        IVAD1 = IVAD;
        TOTALF1 = TOTALF;
        TOTALD1 = TOTALD;
        SELECT SUM(DVDE_TOTAL-DVDE_IVAMONTO), SUM(DVDE_IVAMONTO), SUM(DVDE_TOTAL) FROM devoluciones_ventas_detalle D, devoluciones_ventas F
            WHERE D.DEVT_ID = F.DEVT_ID AND DEVT_FECHA = :FECHA AND PTVT_ID = :PUNTO AND PREF_PRE = :PREFIJO AND DVDE_IVAPORC = :TARIFA and DEVT_ANULADO = 'N'
            INTO :BASEDV, :IVAD, :TOTALD;
        if (basedv is null) then
            basedv = 0;
        if (ivad is null) then
            ivad = 0;
        if (totald is null) then
            totald = 0;
        BASED1 = BASED1 + BASEDV;
        IVAD1 = IVAD1 + IVAD;
        TOTALD1 = TOTALD1 + TOTALD;
        END
    if (I = 3) then
        BEGIN
        BASEF2 = BASEF;
        BASED2 = :BASEDV;
        IVAF2 = IVAF;
        IVAD2 = IVAD;
        TOTALF2 = TOTALF;
        TOTALD2 = TOTALD;
        SELECT SUM(DVDE_TOTAL-DVDE_IVAMONTO), SUM(DVDE_IVAMONTO), SUM(DVDE_TOTAL) FROM devoluciones_ventas_detalle D, devoluciones_ventas F
            WHERE D.DEVT_ID = F.DEVT_ID AND DEVT_FECHA = :FECHA AND PTVT_ID = :PUNTO AND PREF_PRE = :PREFIJO AND DVDE_IVAPORC = :TARIFA and DEVT_ANULADO = 'N'
            INTO :BASEDV, :IVAD, :TOTALD;
        if (basedv is null) then
            basedv = 0;
        if (ivad is null) then
            ivad = 0;
        if (totald is null) then
            totald = 0;
        BASED2 = BASED2 + BASEDV;
        IVAD2 = IVAD2 + IVAD;
        TOTALD2 = TOTALD2 + TOTALD;
        END
    if (I = 4) then
        BEGIN
        BASEF3 = BASEF;
        BASED3 = :BASEDV;
        IVAF3 = IVAF;
        IVAD3 = IVAD;
        TOTALF3 = TOTALF;
        TOTALD3 = TOTALD;
        SELECT SUM(DVDE_TOTAL-DVDE_IVAMONTO), SUM(DVDE_IVAMONTO), SUM(DVDE_TOTAL) FROM devoluciones_ventas_detalle D, devoluciones_ventas F
            WHERE D.DEVT_ID = F.DEVT_ID AND DEVT_FECHA = :FECHA AND PTVT_ID = :PUNTO AND PREF_PRE = :PREFIJO AND DVDE_IVAPORC = :TARIFA and DEVT_ANULADO = 'N'
            INTO :BASEDV, :IVAD, :TOTALD;
        if (basedv is null) then
            basedv = 0;
        if (ivad is null) then
            ivad = 0;
        if (totald is null) then
            totald = 0;
        BASED3 = BASED3 + BASEDV;
        IVAD3 = IVAD3 + IVAD;
        TOTALD3 = TOTALD3 + TOTALD;
        END
    if (I = 5) then
        BEGIN
        BASEF4 = BASEF;
        BASED4 = :BASEDV;
        IVAF4 = IVAF;
        IVAD4 = IVAD;
        TOTALF4 = TOTALF;
        TOTALD4 = TOTALD;
        SELECT SUM(DVDE_TOTAL-DVDE_IVAMONTO), SUM(DVDE_IVAMONTO), SUM(DVDE_TOTAL) FROM devoluciones_ventas_detalle D, devoluciones_ventas F
            WHERE D.DEVT_ID = F.DEVT_ID AND DEVT_FECHA = :FECHA AND PTVT_ID = :PUNTO AND PREF_PRE = :PREFIJO AND DVDE_IVAPORC = :TARIFA and DEVT_ANULADO = 'N'
            INTO :BASEDV, :IVAD, :TOTALD;
        if (basedv is null) then
            basedv = 0;
        if (ivad is null) then
            ivad = 0;
        if (totald is null) then
            totald = 0;
        BASED4 = BASED4 + BASEDV;
        IVAD4 = IVAD4 + IVAD;
        TOTALD4 = TOTALD4 + TOTALD;
        END
    END
  /* POR FORMA DE PAGO */
  SELECT SUM(RCPA_MONTO) FROM RECIBOS_CAJA_PAGO P, RECIBOS_CAJA R, PUNTO_VENTA PT
    WHERE R.RECA_ID = P.RECA_ID AND PT.PTVT_ID = :punto AND RECA_FECHA = :FECHA AND PT.caja_id = R.caja_id AND PT.PREF_PRE = :PREFIJO AND FOPA_ID = 1 and RECA_ANULADO = 'N'
    INTO :FORMAP1;
  SELECT SUM(RCPA_MONTO) FROM RECIBOS_CAJA_PAGO P, RECIBOS_CAJA R, PUNTO_VENTA PT
    WHERE R.RECA_ID = P.RECA_ID AND PT.PTVT_ID = :punto AND RECA_FECHA = :FECHA AND PT.caja_id = R.caja_id AND PT.PREF_PRE = :PREFIJO AND FOPA_ID = 2 and RECA_ANULADO = 'N'
    INTO :FORMAP2;
  SELECT SUM(RCPA_MONTO) FROM RECIBOS_CAJA_PAGO P, RECIBOS_CAJA R, PUNTO_VENTA PT
    WHERE R.RECA_ID = P.RECA_ID AND PT.PTVT_ID = :punto AND RECA_FECHA = :FECHA AND PT.caja_id = R.caja_id AND PT.PREF_PRE = :PREFIJO AND FOPA_ID = 3 and RECA_ANULADO = 'N'
    INTO :FORMAP3;
  SELECT SUM(RCPA_MONTO) FROM RECIBOS_CAJA_PAGO P, RECIBOS_CAJA R, PUNTO_VENTA PT
    WHERE R.RECA_ID = P.RECA_ID AND PT.PTVT_ID = :punto AND RECA_FECHA = :FECHA AND PT.caja_id = R.caja_id AND PT.PREF_PRE = :PREFIJO AND FOPA_ID = 4 and RECA_ANULADO = 'N'
    INTO :FORMAP4;
  SELECT SUM(RCPA_MONTO) FROM RECIBOS_CAJA_PAGO P, RECIBOS_CAJA R, PUNTO_VENTA PT
    WHERE R.RECA_ID = P.RECA_ID AND PT.PTVT_ID = :punto AND RECA_FECHA = :FECHA AND PT.caja_id = R.caja_id AND PT.PREF_PRE = :PREFIJO AND FOPA_ID = 5 and RECA_ANULADO = 'N'
    INTO :FORMAP5;

  cartera = 0;
  for SELECT FACT_ID,FACT_TOTAL FROM FACTURAS WHERE FACT_FECHA = :FECHA AND PTVT_ID = :PUNTO AND PREF_PRE = :PREFIJO and FACT_ANULADO = 'N' into :f_id,:F_TOTAL
    do
    begin
     Select COUNT(D.RECA_ID) FROM recibos_caja_detalle D, RECIBOS_CAJA R where R.RECA_ID = D.RECA_ID AND R.RECA_FECHA = :FECHA AND RECA_ANULADO = 'N' and D.RCDE_tipodoc = 31 and D.RCDE_IDDOC = :f_id into :r_iddoc;
     if (r_iddoc = 0) then
       CARTERA = :cartera + :F_TOTAL;
    end
  if (formap1 is null) then
    formap1 = 0;
  if (formap2 is null) then
    formap2 = 0;
  if (formap3 is null) then
    formap3 = 0;
  if (formap4 is null) then
    formap4 = 0;
  if (formap5 is null) then
    formap5 = 0;
  if (cartera is null) then
    cartera = 0;
  I = 0;
  FOR SELECT MAX(F.VEND_COD), MAX(VEND_NOMBRE), SUM(FACT_TOTAL - FACT_IVAMONTO) FROM FACTURAS F, VENDEDORES V
    WHERE F.VEND_COD = V.VEND_COD AND FACT_FECHA = :FECHA AND F.PTVT_ID = :PUNTO AND PREF_PRE = :PREFIJO and FACT_ANULADO = 'N'
    GROUP BY F.VEND_COD ORDER BY F.VEND_COD
    INTO :CODVEN, :VENDED, :TOTALF
    DO
    BEGIN
    if (totalf IS NULL) then
        TOTALF = 0;
    SELECT SUM(DEVT_TOTAL - DEVT_IVAMONTO) FROM DEVOLUCIONES_VENTAS
        WHERE VEND_COD = :CODVEN AND DEVT_FECHA = :FECHA AND PTVT_ID = :PUNTO AND PREF_PRE = :PREFIJO and DEVT_ANULADO = 'N'
        INTO :totald;
    if (TOTALD IS NULL) then
        TOTALD = 0;
    if (I = 0) then
        BEGIN
        vendedor1 = VENDED;
        vtavend1 = TOTALF - TOTALD;
        END
    if (I = 1) then
        BEGIN
        vendedor2 = VENDED;
        vtavend2 = TOTALF - TOTALD;
        END
    if (I = 2) then
        BEGIN
        vendedor3 = VENDED;
        vtavend3 = TOTALF - TOTALD;
        END
    if (I = 3) then
        BEGIN
        vendedor4 = VENDED;
        vtavend4 = TOTALF - TOTALD;
        END
    if (I = 4) then
        BEGIN
        vendedor5 = VENDED;
        vtavend5 = TOTALF - TOTALD;
        END
    I = I + 1;
    END
  INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
    VALUES (USER, 123, :punto, 'I', (:formap1+:formap2+:formap3+:formap4+:formap5+:CARTERA));
  suspend;
end
^

SET TERM ; ^

SET TERM ^ ;

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

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER PROCEDURE COMISIONES_COBRO(
    DESDE INTEGER,
    HASTA INTEGER,
    FECINI DATE,
    FECFIN DATE,
    DETALLE CHAR(1))
RETURNS (
    CODVEND INTEGER,
    NOMVEND VARCHAR(60),
    NIT VARCHAR(20),
    CLIENTE VARCHAR(60),
    NOMTIPO VARCHAR(8),
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(6),
    FECDOC DATE,
    PREFREC VARCHAR(4),
    NUMREC VARCHAR(6),
    FECREC DATE,
    DIAS INTEGER,
    ABONO NUMERIC(18,2),
    BASE NUMERIC(18,2),
    COMIMONTO NUMERIC(18,2),
    COMIPORC NUMERIC(9,2),
    ARTICULO VARCHAR(20),
    CODGRP VARCHAR(2),
    CANT NUMERIC(18,4),
    DTOFIN NUMERIC(18,2),
    VENCE DATE,
    RTFTE NUMERIC(18,2),
    RTIVA NUMERIC(18,2),
    RTICA NUMERIC(18,2))
AS
DECLARE VARIABLE TIPO INTEGER;
DECLARE VARIABLE ID INTEGER;
DECLARE VARIABLE IVAMONTO NUMERIC(18,2);
DECLARE VARIABLE TOTAL NUMERIC(18,2);
DECLARE VARIABLE SITOT CHAR(2);
DECLARE VARIABLE VENTA CHAR(2);
DECLARE VARIABLE COMIV NUMERIC(18,2);
DECLARE VARIABLE PORCV NUMERIC(18,2);
DECLARE VARIABLE CONSUMO NUMERIC(18,2);
declare variable ALFINAL CHAR(2);
declare variable SALDO NUMERIC(18,2);
declare variable COMISION VARCHAR(10);
declare variable porcaux NUMERIC(9,2);
declare variable BASEAUX DOUBLE PRECISION;
declare variable SUCURSAL VARCHAR(20);
BEGIN
EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION', 'VENDEDORES', 'COMISIONES EN VENTA INCLUYENDO IMPUESTOS') returning_values (:SITOT);
EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA','COMISIONES','COMISION POR COBRO PAGADERA SOLO EN EL COBRO TOTAL') returning_values (:ALFINAL);
execute procedure lee_configuracion('CARTERA','COMISIONES','COMISION POR COBRO COMO PORCENTAJE DE LA COMISION VENTA') returning_values (:venta);
EXECUTE PROCEDURE lee_configuracion('CARTERA', 'COMISIONES', 'LIQUIDAR COMISION COBRO CON COBRADOR DEL DOCUMENTO O DEL RECIBO') returning_values (:COMISION);
FOR SELECT RCDE_TIPODOC, RCDE_IDDOC, RCDE_PREFIJO, RCDE_NUMERO, R.TERC_NIT, TERC_NOM, RECA_FECHA, (RCDE_ABONO+RCDE_RTFTE+RCDE_RTIVA+RCDE_RTICA), PREF_PRE, RECA_NUMERO, COBR_COD, RCDE_DTOF, RCDE_RTFTE, RCDE_RTIVA, RCDE_RTICA
    FROM RECIBOS_CAJA R, RECIBOS_CAJA_DETALLE RD, TERCEROS T
    WHERE R.RECA_ID = RD.RECA_ID AND RECA_FECHA >= :FECINI AND RECA_FECHA <= :FECFIN AND R.TERC_NIT = T.TERC_NIT AND RECA_ANULADO = 'N'
    ORDER BY TERC_NIT, RECA_FECHA
    INTO :TIPO, :ID, :PREFIJO, :NUMERO, :NIT, :CLIENTE, :FECREC, :ABONO, :PREFREC, :NUMREC, :codvend, :DTOFIN, :rtfte, :RTIVA, :RTICA
    DO
    BEGIN
    SELECT TIDO_NOMCORTO FROM TIPO_DOCUMENTO WHERE TIDO_COD = :TIPO INTO :NOMTIPO;
    if (COMISION = 'DOCUMENTO') then
        SELECT MVCL_FECHA, COBR_COD, MVCL_VENCE FROM MOVIMIENTO_CLIENTES WHERE MVCL_TIPOREF = :TIPO AND MVCL_IDREF = :ID
            INTO :FECDOC, :codvend, :VENCE;
    else
        SELECT MVCL_FECHA, MVCL_VENCE FROM MOVIMIENTO_CLIENTES WHERE MVCL_TIPOREF = :TIPO AND MVCL_IDREF = :ID
            INTO :FECDOC, :VENCE;
    if (FECDOC IS NOT NULL) then
        DIAS = FECREC - FECDOC;
    ELSE
        DIAS = 999;
    if ((codvend >= :DESDE) AND (codvend <= :hasta)) then
        BEGIN
        /* TRAIGA EL PORCENTAJE DE ACUERDO A LOS DIAS */
        COMIPORC = 0;
        SELECT CMCB_PORC FROM COMISION_COBRO WHERE CMCB_DIASINI <= :dias AND CMCB_DIASFIN >= :DIAS AND COBR_COD = :CODVEND INTO :COMIPORC;
        if (COMIPORC IS NULL) THEN
            COMIPORC = 0;
        if (VENTA = 'NO') then
            BEGIN
            if (TIPO = 31) then
                BEGIN
                if (DETALLE = 'N') then
                    SELECT MAX(FACT_TOTAL), MAX(FACT_IVAMONTO), SUM(FADE_CONSUMO) FROM FACTURAS F, FACTURAS_DETALLE D
                        WHERE F.FACT_ID = D.FACT_ID AND F.FACT_ID = :ID INTO :TOTAL, :IVAMONTO, :CONSUMO;
                ELSE
                    FOR SELECT D.ARTI_COD, FADE_CANT, FADE_TOTAL, FADE_IVAMONTO, FADE_CONSUMO, GRUP_COD
                        FROM FACTURAS F, FACTURAS_DETALLE D, ARTICULO A
                        WHERE F.FACT_ID = D.FACT_ID AND D.arti_cod = A.arti_cod AND F.FACT_ID = :ID and substring(a.arti_cod from 1 FOR 2) <> '.t'
                        INTO :ARTICULO, :CANT, :TOTAL, :IVAMONTO, :CONSUMO, :CODGRP
                        DO
                        BEGIN
                        if (SITOT = 'SI') then
                            BASEAUX = TOTAL;
                        ELSE
                            BASEAUX = (TOTAL - IVAMONTO - CONSUMO);
                        BASE = BASEAUX;
                        COMIMONTO = BASE / 100 * COMIPORC;
                        SUSPEND;
                        END
                END
            if (TIPO = 33) then
                if (DETALLE = 'N') then
                    SELECT MAX(DEVT_TOTAL*-1), MAX(DEVT_IVAMONTO*-1), SUM(DVDE_CONSUMO) FROM DEVOLUCIONES_VENTAS V, DEVOLUCIONES_VENTAS_DETALLE D
                        WHERE V.DEVT_ID = D.DEVT_ID AND V.DEVT_ID = :ID INTO :TOTAL, :IVAMONTO, :CONSUMO;
                ELSE
                    FOR SELECT D.ARTI_COD, DVDE_CANT, DVDE_TOTAL*-1, DVDE_IVAMONTO*-1, DVDE_CONSUMO*-1, GRUP_COD
                        FROM DEVOLUCIONES_VENTAS V, DEVOLUCIONES_VENTAS_DETALLE D, ARTICULO A
                        WHERE V.DEVT_ID = D.DEVT_ID AND D.arti_cod = A.arti_cod AND V.DEVT_ID = :ID and substring(a.arti_cod from 1 FOR 2) <> '.t'
                        INTO :ARTICULO, :CANT, :TOTAL, :IVAMONTO, :CONSUMO, :codgrp
                        DO
                        BEGIN
                        if (SITOT = 'SI') then
                            BASEAUX = TOTAL;
                        ELSE
                            BASEAUX = TOTAL - IVAMONTO - CONSUMO;
                        BASE = BASEAUX;
                        COMIMONTO = BASE / 100 * COMIPORC;
                        SUSPEND;
                        END
            if (TIPO = 41) then
                SELECT NDCL_MONTO, NDCL_IVAMONTO, 0 FROM NOTAS_DEBITO_CLIENTES WHERE NDCL_ID = :ID INTO :TOTAL, :IVAMONTO, :CONSUMO;
            if (TIPO = 42) then
                SELECT NCCL_MONTO*-1, NCCL_IVAMONTO*-1, 0 FROM NOTAS_CREDITO_CLIENTES WHERE NCCL_ID = :ID INTO :TOTAL, :IVAMONTO, :CONSUMO;
            if (TIPO = 77) then
                SELECT DVCH_MONTO, 0, 0 FROM DEVOLUCION_CHEQUES WHERE DVCH_ID = :ID INTO :TOTAL, :IVAMONTO, :CONSUMO;
            if (SITOT = 'SI') then
                BASEAUX = ABONO;
            ELSE
                if ((TOTAL - IVAMONTO - CONSUMO) <> 0) then
                    BASEAUX = (ABONO / TOTAL) * (TOTAL - IVAMONTO - CONSUMO);
                ELSE
                    BASEAUX = 0;
            BASE = BASEAUX;
            COMIMONTO = BASE / 100 * COMIPORC;
            END
        ELSE
            BEGIN
            if (TIPO = 31) then
                if (DETALLE = 'N') then
                    SELECT MAX(FACT_TOTAL), MAX(FACT_IVAMONTO), MAX(FACT_COMIPORC), SUM(FADE_CONSUMO)
                        FROM FACTURAS F, FACTURAS_DETALLE D WHERE F.FACT_ID = D.FACT_ID AND F.FACT_ID = :ID
                        INTO :TOTAL, :IVAMONTO, :PORCV, :CONSUMO;
                ELSE
                    FOR SELECT D.ARTI_COD, FADE_CANT, FADE_TOTAL, FADE_IVAMONTO, FADE_CONSUMO, FACT_COMIPORC, GRUP_COD
                        FROM FACTURAS F, FACTURAS_DETALLE D, ARTICULO A
                        WHERE F.FACT_ID = D.FACT_ID AND D.arti_cod = A.arti_cod AND F.FACT_ID = :ID and substring(a.arti_cod from 1 FOR 2) <> '.t'
                        INTO :ARTICULO, :CANT, :TOTAL, :IVAMONTO, :CONSUMO, :porcv, :codgrp
                        DO
                        BEGIN
                        if (SITOT = 'SI') then
                            BASEAUX = TOTAL;
                        ELSE
                            BASEAUX = (TOTAL - IVAMONTO - CONSUMO);
                        COMIV = PORCV / 100 * BASEAUX;
                        COMIMONTO = COMIV / 100 * COMIPORC;
                        porcaux = comiporc;
                        comiporc = PORCV / 100 * COMIPORC;
                        BASE = BASEAUX;
                        SUSPEND;
                        END
            if (TIPO = 33) then
                if (DETALLE = 'N') then
                    SELECT MAX(DEVT_TOTAL), MAX(DEVT_IVAMONTO), MAX(DEVT_COMIPORC), SUM(DVDE_CONSUMO)
                        FROM DEVOLUCIONES_VENTAS V, DEVOLUCIONES_VENTAS_DETALLE D WHERE V.DEVT_ID = D.DEVT_ID AND D.DEVT_ID = :ID
                        INTO :TOTAL, :IVAMONTO, :PORCV, :CONSUMO;
                ELSE
                    FOR SELECT D.ARTI_COD, DVDE_CANT, DVDE_TOTAL*-1, DVDE_IVAMONTO*-1, DVDE_CONSUMO*-1, DEVT_COMIPORC, GRUP_COD
                        FROM DEVOLUCIONES_VENTAS V, DEVOLUCIONES_VENTAS_DETALLE D, ARTICULO A
                        WHERE V.DEVT_ID = D.DEVT_ID AND D.arti_cod = A.arti_cod AND V.DEVT_ID = :ID and substring(a.arti_cod from 1 FOR 2) <> '.t'
                        INTO :ARTICULO, :CANT, :TOTAL, :IVAMONTO, :CONSUMO, :porcv, :codgrp
                        DO
                        BEGIN
                        if (SITOT = 'SI') then
                            BASEAUX = TOTAL;
                        ELSE
                            BASEAUX = (TOTAL - IVAMONTO - CONSUMO);
                        COMIV = PORCV / 100 * BASEAUX;
                        COMIMONTO = COMIV / 100 * COMIPORC;
                        porcaux = comiporc;
                        comiporc = PORCV / 100 * COMIPORC;
                        BASE = BASEAUX;
                        SUSPEND;
                        END
            if (TIPO = 41) then
                SELECT NDCL_MONTO, NDCL_IVAMONTO, NDCL_COMIPORC, 0 FROM NOTAS_DEBITO_CLIENTES
                    WHERE NDCL_ID = :ID INTO :TOTAL, :IVAMONTO, :PORCV, :CONSUMO;
            if (TIPO = 42) then
                SELECT NCCL_MONTO, NCCL_IVAMONTO, NCCL_COMIPORC, 0  FROM NOTAS_CREDITO_CLIENTES
                    WHERE NCCL_ID = :ID INTO :TOTAL, :IVAMONTO, :PORCV, :CONSUMO;
            if (TIPO = 77) then
                SELECT DVCH_MONTO, 0, 0, 0 FROM DEVOLUCION_CHEQUES WHERE DVCH_ID = :ID INTO :TOTAL, :IVAMONTO, :PORCV, :CONSUMO;
            if (SITOT = 'SI') then
                BASEAUX = ABONO;
            ELSE
                if ((total <> 0) AND (ABONO <> 0)) then
                    BASEAUX = (TOTAL - IVAMONTO - CONSUMO) / TOTAL * ABONO;
                ELSE
                    BASEAUX = 0;
            COMIV = PORCV / 100 * BASEAUX;
            COMIMONTO = COMIV / 100 * COMIPORC;
            porcaux = comiporc;
            comiporc = PORCV / 100 * COMIPORC;
            BASE = BASEAUX;
            END
        select COBR_NOM from COBRADORES where COBR_COD = :codvend INTO :nomvend;
        if (DETALLE = 'N') then
            if (ALFINAL = 'SI') then
                BEGIN
                /* VERIFIQUE EL SALDO DEL DOCUMENTO, SI ES CERO LIQUIDE COMISION SOBRE EL TOTAL */
                EXECUTE PROCEDURE saldo_doc_cartera(:tipo, :ID, :FECREC, 0) returning_values (:SALDO);
                if (SALDO = 0) then
                    BEGIN
                    if (VENTA = 'NO') then
                        begin
                        if (SITOT = 'SI') then
                            BASEAUX = TOTAL;
                        ELSE
                            BASEAUX = TOTAL - IVAMONTO - CONSUMO;
                        COMIMONTO = BASEAUX * COMIPORC / 100;
                        end
                    ELSE
                        BEGIN
                        if (SITOT = 'SI') then
                            BASEAUX = TOTAL;
                        ELSE
                            BASEAUX = TOTAL - IVAMONTO - CONSUMO;
                        COMIV = PORCV * BASEAUX / 100;
                        COMIMONTO = COMIV / 100 * porcaux;
                        comiporc = PORCV / 100 * porcaux;
                        END
                    BASE = BASEAUX;
                    SUSPEND;
                    END
                END
            ELSE
                SUSPEND;
        ELSE
            if ((TIPO <> 31) AND (TIPO <> 33)) then
                SUSPEND;
        END
    END
FOR SELECT EGCC_TIPODOC, EGCC_IDDOC, EGCC_PREFIJO, EGCC_NUMERO, E.TERC_NIT, TERC_NOM, EGRE_FECHA, (EGCC_ABONO+EGCC_RTFTE+EGCC_RTIVA+EGCC_RTICA), PREF_PRE, EGRE_NUMERO, EGCC_SUCURSAL
    FROM EGRESOS E, EGRESOS_CRUCEC C, TERCEROS T
    WHERE E.EGRE_ID = C.EGRE_ID AND EGRE_FECHA >= :FECINI AND EGRE_FECHA <= :FECFIN AND E.TERC_NIT = T.TERC_NIT AND EGRE_ANULADO = 'N'
    ORDER BY TERC_NIT, EGRE_FECHA
    INTO :TIPO, :ID, :PREFIJO, :NUMERO, :NIT, :CLIENTE, :FECREC, :ABONO, :PREFREC, :NUMREC, :SUCURSAL
    DO
    BEGIN
    SELECT COBR_COD FROM cliente_sucursales WHERE TERC_NIT = :NIT AND CLCU_COD = :sucursal INTO :codvend;
    SELECT TIDO_NOMCORTO FROM TIPO_DOCUMENTO WHERE TIDO_COD = :TIPO INTO :NOMTIPO;
    if (COMISION = 'DOCUMENTO') then
        SELECT MVCL_FECHA, COBR_COD FROM MOVIMIENTO_CLIENTES WHERE MVCL_TIPOREF = :TIPO AND MVCL_IDREF = :ID
            INTO :FECDOC, :codvend;
    else
        SELECT MVCL_FECHA FROM MOVIMIENTO_CLIENTES WHERE MVCL_TIPOREF = :TIPO AND MVCL_IDREF = :ID
            INTO :FECDOC;
    if (FECDOC IS NOT NULL) then
        DIAS = FECREC - FECDOC;
    ELSE
        DIAS = 999;
    if ((codvend >= :DESDE) AND (codvend <= :hasta)) then
        BEGIN
        /* TRAIGA EL PORCENTAJE DE ACUERDO A LOS DIAS */
        COMIPORC = 0;
        SELECT CMCB_PORC FROM COMISION_COBRO WHERE CMCB_DIASINI <= :dias AND CMCB_DIASFIN >= :DIAS AND COBR_COD = :CODVEND INTO :COMIPORC;
        if (COMIPORC IS NULL) THEN
            COMIPORC = 0;
        if (VENTA = 'NO') then
            BEGIN
            if (TIPO = 31) then
                BEGIN
                if (DETALLE = 'N') then
                    SELECT MAX(FACT_TOTAL), MAX(FACT_IVAMONTO), SUM(FADE_CONSUMO) FROM FACTURAS F, FACTURAS_DETALLE D
                        WHERE F.FACT_ID = D.FACT_ID AND F.FACT_ID = :ID INTO :TOTAL, :IVAMONTO, :CONSUMO;
                ELSE
                    FOR SELECT D.ARTI_COD, FADE_CANT, FADE_TOTAL, FADE_IVAMONTO, FADE_CONSUMO, GRUP_COD
                        FROM FACTURAS F, FACTURAS_DETALLE D, ARTICULO A
                        WHERE F.FACT_ID = D.FACT_ID AND D.arti_cod = A.arti_cod AND F.FACT_ID = :ID and substring(a.arti_cod from 1 FOR 2) <> '.t'
                        INTO :ARTICULO, :CANT, :TOTAL, :IVAMONTO, :CONSUMO, :CODGRP
                        DO
                        BEGIN
                        if (SITOT = 'SI') then
                            BASEAUX = TOTAL;
                        ELSE
                            BASEAUX = (TOTAL - IVAMONTO - CONSUMO);
                        BASE = BASEAUX;
                        COMIMONTO = BASE / 100 * COMIPORC;
                        SUSPEND;
                        END
                END
            if (TIPO = 33) then
                if (DETALLE = 'N') then
                    SELECT MAX(DEVT_TOTAL*-1), MAX(DEVT_IVAMONTO*-1), SUM(DVDE_CONSUMO) FROM DEVOLUCIONES_VENTAS V, DEVOLUCIONES_VENTAS_DETALLE D
                        WHERE V.DEVT_ID = D.DEVT_ID AND V.DEVT_ID = :ID INTO :TOTAL, :IVAMONTO, :CONSUMO;
                ELSE
                    FOR SELECT D.ARTI_COD, DVDE_CANT, DVDE_TOTAL*-1, DVDE_IVAMONTO*-1, DVDE_CONSUMO*-1, GRUP_COD
                        FROM DEVOLUCIONES_VENTAS V, DEVOLUCIONES_VENTAS_DETALLE D, ARTICULO A
                        WHERE V.DEVT_ID = D.DEVT_ID AND D.arti_cod = A.arti_cod AND V.DEVT_ID = :ID and substring(a.arti_cod from 1 FOR 2) <> '.t'
                        INTO :ARTICULO, :CANT, :TOTAL, :IVAMONTO, :CONSUMO, :codgrp
                        DO
                        BEGIN
                        if (SITOT = 'SI') then
                            BASEAUX = TOTAL;
                        ELSE
                            BASEAUX = TOTAL - IVAMONTO - CONSUMO;
                        BASE = BASEAUX;
                        COMIMONTO = BASE / 100 * COMIPORC;
                        SUSPEND;
                        END
            if (TIPO = 41) then
                SELECT NDCL_MONTO, NDCL_IVAMONTO, 0 FROM NOTAS_DEBITO_CLIENTES WHERE NDCL_ID = :ID INTO :TOTAL, :IVAMONTO, :CONSUMO;
            if (TIPO = 42) then
                SELECT NCCL_MONTO*-1, NCCL_IVAMONTO*-1, 0 FROM NOTAS_CREDITO_CLIENTES WHERE NCCL_ID = :ID INTO :TOTAL, :IVAMONTO, :CONSUMO;
            if (TIPO = 77) then
                SELECT DVCH_MONTO, 0, 0 FROM DEVOLUCION_CHEQUES WHERE DVCH_ID = :ID INTO :TOTAL, :IVAMONTO, :CONSUMO;
            if (SITOT = 'SI') then
                BASEAUX = ABONO;
            ELSE
                if ((TOTAL - IVAMONTO - CONSUMO) <> 0) then
                    BASEAUX = (ABONO / TOTAL) * (TOTAL - IVAMONTO - CONSUMO);
                ELSE
                    BASEAUX = 0;
            BASE = BASEAUX;
            COMIMONTO = BASE / 100 * COMIPORC;
            END
        ELSE
            BEGIN
            if (TIPO = 31) then
                if (DETALLE = 'N') then
                    SELECT MAX(FACT_TOTAL), MAX(FACT_IVAMONTO), MAX(FACT_COMIPORC), SUM(FADE_CONSUMO)
                        FROM FACTURAS F, FACTURAS_DETALLE D WHERE F.FACT_ID = D.FACT_ID AND F.FACT_ID = :ID
                        INTO :TOTAL, :IVAMONTO, :PORCV, :CONSUMO;
                ELSE
                    FOR SELECT D.ARTI_COD, FADE_CANT, FADE_TOTAL, FADE_IVAMONTO, FADE_CONSUMO, FACT_COMIPORC, GRUP_COD
                        FROM FACTURAS F, FACTURAS_DETALLE D, ARTICULO A
                        WHERE F.FACT_ID = D.FACT_ID AND D.arti_cod = A.arti_cod AND F.FACT_ID = :ID and substring(a.arti_cod from 1 FOR 2) <> '.t'
                        INTO :ARTICULO, :CANT, :TOTAL, :IVAMONTO, :CONSUMO, :porcv, :codgrp
                        DO
                        BEGIN
                        if (SITOT = 'SI') then
                            BASEAUX = TOTAL;
                        ELSE
                            BASEAUX = (TOTAL - IVAMONTO - CONSUMO);
                        COMIV = PORCV / 100 * BASEAUX;
                        COMIMONTO = COMIV / 100 * COMIPORC;
                        porcaux = comiporc;
                        comiporc = PORCV / 100 * COMIPORC;
                        BASE = BASEAUX;
                        SUSPEND;
                        END
            if (TIPO = 33) then
                if (DETALLE = 'N') then
                    SELECT MAX(DEVT_TOTAL), MAX(DEVT_IVAMONTO), MAX(DEVT_COMIPORC), SUM(DVDE_CONSUMO)
                        FROM DEVOLUCIONES_VENTAS V, DEVOLUCIONES_VENTAS_DETALLE D WHERE V.DEVT_ID = D.DEVT_ID AND D.DEVT_ID = :ID
                        INTO :TOTAL, :IVAMONTO, :PORCV, :CONSUMO;
                ELSE
                    FOR SELECT D.ARTI_COD, DVDE_CANT, DVDE_TOTAL*-1, DVDE_IVAMONTO*-1, DVDE_CONSUMO*-1, DEVT_COMIPORC, GRUP_COD
                        FROM DEVOLUCIONES_VENTAS V, DEVOLUCIONES_VENTAS_DETALLE D, ARTICULO A
                        WHERE V.DEVT_ID = D.DEVT_ID AND D.arti_cod = A.arti_cod AND V.DEVT_ID = :ID and substring(a.arti_cod from 1 FOR 2) <> '.t'
                        INTO :ARTICULO, :CANT, :TOTAL, :IVAMONTO, :CONSUMO, :porcv, :codgrp
                        DO
                        BEGIN
                        if (SITOT = 'SI') then
                            BASEAUX = TOTAL;
                        ELSE
                            BASEAUX = (TOTAL - IVAMONTO - CONSUMO);
                        COMIV = PORCV / 100 * BASEAUX;
                        COMIMONTO = COMIV / 100 * COMIPORC;
                        porcaux = comiporc;
                        comiporc = PORCV / 100 * COMIPORC;
                        BASE = BASEAUX;
                        SUSPEND;
                        END
            if (TIPO = 41) then
                SELECT NDCL_MONTO, NDCL_IVAMONTO, NDCL_COMIPORC, 0 FROM NOTAS_DEBITO_CLIENTES
                    WHERE NDCL_ID = :ID INTO :TOTAL, :IVAMONTO, :PORCV, :CONSUMO;
            if (TIPO = 42) then
                SELECT NCCL_MONTO, NCCL_IVAMONTO, NCCL_COMIPORC, 0  FROM NOTAS_CREDITO_CLIENTES
                    WHERE NCCL_ID = :ID INTO :TOTAL, :IVAMONTO, :PORCV, :CONSUMO;
            if (TIPO = 77) then
                SELECT DVCH_MONTO, 0, 0, 0 FROM DEVOLUCION_CHEQUES WHERE DVCH_ID = :ID INTO :TOTAL, :IVAMONTO, :PORCV, :CONSUMO;
            if (SITOT = 'SI') then
                BASEAUX = ABONO;
            ELSE
                if ((total <> 0) AND (ABONO <> 0)) then
                    BASEAUX = (TOTAL - IVAMONTO - CONSUMO) / TOTAL * ABONO;
                ELSE
                    BASEAUX = 0;
            COMIV = PORCV / 100 * BASEAUX;
            COMIMONTO = COMIV / 100 * COMIPORC;
            porcaux = comiporc;
            comiporc = PORCV / 100 * COMIPORC;
            BASE = BASEAUX;
            END
        select COBR_NOM from COBRADORES where COBR_COD = :codvend INTO :nomvend;
        if (DETALLE = 'N') then
            if (ALFINAL = 'SI') then
                BEGIN
                /* VERIFIQUE EL SALDO DEL DOCUMENTO, SI ES CERO LIQUIDE COMISION SOBRE EL TOTAL */
                EXECUTE PROCEDURE saldo_doc_cartera(:tipo, :ID, :FECREC, 0) returning_values (:SALDO);
                if (SALDO = 0) then
                    BEGIN
                    if (VENTA = 'NO') then
                        begin
                        if (SITOT = 'SI') then
                            BASEAUX = TOTAL;
                        ELSE
                            BASEAUX = TOTAL - IVAMONTO - CONSUMO;
                        COMIMONTO = BASEAUX * COMIPORC / 100;
                        end
                    ELSE
                        BEGIN
                        if (SITOT = 'SI') then
                            BASEAUX = TOTAL;
                        ELSE
                            BASEAUX = TOTAL - IVAMONTO - CONSUMO;
                        COMIV = PORCV * BASEAUX / 100;
                        COMIMONTO = COMIV / 100 * porcaux;
                        comiporc = PORCV / 100 * porcaux;
                        END
                    BASE = BASEAUX;
                    SUSPEND;
                    END
                END
            ELSE
                SUSPEND;
        ELSE
            if ((TIPO <> 31) AND (TIPO <> 33)) then
                SUSPEND;
        END
    END
FOR SELECT 'DEVOCHEQ', DVCH_MONTO*-1, DVCH_FECHA, PRBA_PREF, DVCH_NUMDOC, DVCH_FECHA, D.TERC_NIT, DVCH_NOMTERC, '', '', D.COBR_COD
    FROM DEVOLUCION_CHEQUES D, CLIENTES C
    WHERE DVCH_FECHA >= :FECINI AND DVCH_FECHA <= :FECFIN AND D.TERC_NIT = C.TERC_NIT AND D.COBR_COD = :CODVEND
    INTO :NOMTIPO, :BASE, :FECDOC, :PREFIJO, :NUMERO, :FECREC, :NIT, :CLIENTE, :PREFREC, :NUMREC, :codvend
    DO
    BEGIN
    COMIPORC = 0;
    COMIMONTO = 0;
    VENCE = fecdoc;
    RTFTE = 0;
    RTIVA = 0;
    RTICA = 0;
    DTOFIN = 0;
    if ((codvend >= :DESDE) AND (codvend <= :hasta)) then
        BEGIN
        select COBR_NOM from COBRADORES where COBR_COD = :codvend INTO :nomvend;
        /* SELECT CMCB_PORC FROM COMISION_COBRO WHERE CMCB_DIASINI <= 1 AND CMCB_DIASFIN >= 1 AND COBR_COD = :CODVEND INTO :COMIPORC;
        if (COMIPORC IS NULL) THEN
            COMIPORC = 0;
        COMIMONTO = BASE * COMIPORC / 100; */
        SUSPEND;
        END
    END
SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER PROCEDURE CONCILIA_VENTAS(
    FECINI DATE,
    FECFIN DATE,
    SOLODIF CHAR(1),
    NULO1 CHAR(1),
    NULO2 CHAR(2))
RETURNS (
    IDF INTEGER,
    IDC INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    COMPROBA VARCHAR(3),
    NUMCNT VARCHAR(6),
    CTAVENTAS VARCHAR(20),
    MONTO NUMERIC(18,2),
    MONTOC NUMERIC(18,2))
AS
declare variable dig integer;
declare variable mercancia numeric(18,2);
declare variable fomento varchar(2);
declare variable vrconsumo numeric(18,2);
declare variable factor double precision;
declare variable vrdto numeric(18,2);
declare variable vradic numeric(18,2);
declare variable vrsubt numeric(18,2);
declare variable vriva numeric(18,2);
declare variable vrtotal numeric(18,2);
declare variable vrextra numeric(18,2);
declare variable ventas char(1);
declare variable ctadto varchar(20);
begin
SELECT CAST(CONF_VALOR AS INTEGER) FROM CONFIGURACION WHERE CONF_MODULO = 'FACTURACION' AND
    CONF_CATEGORIA = 'GENERAL' AND CONF_PROPIEDAD = 'REDONDEO AL MULTIPLO DE DIEZ EN TOTALES' INTO :DIG;
EXECUTE PROCEDURE LEE_CONFIGURACION('COMPRAS', 'FACTURAS', 'USAR IMPOCONSUMO COMO PORCENTAJE DE FOMENTO') returning_values (FOMENTO);

for select fact_id, pref_pre, fact_numero, fact_fecha, FACT_DTOMONTO, FACT_ADICIONAL, FACT_IVAMONTO, FACT_EXTRA, FACT_TOTAL
    from facturas f
    where fact_fecha >= :fecini and fact_fecha <= :fecfin and fact_anulado = 'N'
    into :idf, :pref, :numero, :fecha, :VRDTO, :VRADIC, :VRIVA, :VREXTRA, :VRTOTAL
    do
    begin
    idc = 0;
    montoc = 0;
    numcnt = '';
    select enco_consec, TICO_COD, ENCO_NUMERO
    from comprobante_encabezado where enco_idref = :idf and enco_tiporef = 31
    into :idc, :comproba, :numcnt;

    SELECT SUM (FADE_CONSUMO) FROM FACTURAS_DETALLE WHERE FACT_ID = :idf INTO MERCANCIA;
    VRSUBT = VRTOTAL - VREXTRA - VRIVA - MERCANCIA; /* BASE DE RETEFTE Y RETEICA */
    MERCANCIA = VRSUBT - VRADIC + VRDTO;
    if (MERCANCIA <> 0) then
        FACTOR = CAST(VRSUBT AS DOUBLE PRECISION) / CAST(MERCANCIA AS DOUBLE PRECISION);
    ELSE
        FACTOR = 1;
    SELECT MAX(INVE_VENTAS), MAX(INVE_CTAVENTAS), MAX(INVE_CTADTO) FROM INTERFAZ_VENTAS WHERE TIDO_COD = 31 AND PREF_PRE = :pref
        INTO :VENTAS, :CTAVENTAS, :CTADTO;
    if (VENTAS = 'A') then
        BEGIN
        FOR SELECT MAX(COAR_CTAVNT), SUM(FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), SUM(FADE_CONSUMO)
            FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_DETALLE F
            WHERE F.FACT_ID = :idf AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND F.fade_referencia <> '.t'
            GROUP BY COAR_CTAVNT
            INTO :CTAVENTAS, :MONTO, :VRCONSUMO
            DO
            BEGIN
            if (FOMENTO = 'SI') then
                MONTO = MONTO + VRCONSUMO;
            if ((CTADTO IS NULL) OR (CTADTO = '')) then
                MONTO = MONTO * FACTOR;
            execute procedure redondee(MONTO, DIG) returning_values (MONTO);
            select SUM(code_credito - code_debito) from comprobante_detalle
                where enco_consec = :idc and cuen_cod = :ctaventas into MONTOC;
            if (montoc is null) then
                montoc = 0;
            if ((SOLODIF = 'N') or (MONTO <> MONTOC)) then
                SUSPEND;
            END
        END
    if (VENTAS = 'K') then
        BEGIN
        SELECT SUM(FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), SUM (FADE_CONSUMO)
            FROM FACTURAS_DETALLE F
            WHERE F.FACT_ID = :idf AND F.fade_referencia <> '.t'
            INTO :MONTO, :VRCONSUMO;
        if (FOMENTO = 'SI') then
            MONTO = MONTO + VRCONSUMO;
        if ((CTADTO IS NULL) OR (CTADTO = '')) then
            MONTO = MONTO * FACTOR;
        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
        select SUM(code_credito-code_debito) from comprobante_detalle
            where enco_consec = :idc and cuen_cod = :ctaventas into MONTOC;
        if (montoc is null) then
            montoc = 0;
        if ((SOLODIF = 'N') or (MONTO <> MONTOC)) then
            SUSPEND;
        END
    end
end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER PROCEDURE CIERRE_DIARIO(
    FECHA DATE,
    PTOVTA INTEGER)
RETURNS (
    VTACONTDIA NUMERIC(18,2),
    VTACONTMES NUMERIC(18,2),
    VTACREDDIA NUMERIC(18,2),
    VTACREDMES NUMERIC(18,2),
    VTATOTALDIA NUMERIC(18,2),
    VTATOTALMES NUMERIC(18,2),
    DEVOLDIA NUMERIC(18,2),
    DEVOLMES NUMERIC(18,2),
    VTANETADIA NUMERIC(18,2),
    VTANETAMES NUMERIC(18,2),
    VTAEXENTADIA NUMERIC(18,2),
    VTAGRAVA16DIA NUMERIC(18,2),
    VTAGRAVA10DIA NUMERIC(18,2),
    VTAEXENTAMES NUMERIC(18,2),
    VTAGRAVA16MES NUMERIC(18,2),
    VTAGRAVA10MES NUMERIC(18,2),
    IVA16DIA NUMERIC(18,2),
    IVA10DIA NUMERIC(18,2),
    IVA16MES NUMERIC(18,2),
    IVA10MES NUMERIC(18,2),
    FORMAP1 NUMERIC(18,2),
    FORMAP2 NUMERIC(18,2),
    FORMAP3 NUMERIC(18,2),
    FORMAP4 NUMERIC(18,2),
    FORMAP5 NUMERIC(18,2),
    CARTERA NUMERIC(18,2),
    FORMAP1MES NUMERIC(18,2),
    FORMAP2MES NUMERIC(18,2),
    FORMAP3MES NUMERIC(18,2),
    FORMAP4MES NUMERIC(18,2),
    FORMAP5MES NUMERIC(18,2),
    CARTERAMES NUMERIC(18,2),
    INICIAL NUMERIC(18,2),
    INGCARTERA NUMERIC(18,2),
    INGOTROS NUMERIC(18,2),
    INGTOTAL NUMERIC(18,2),
    DESCTOSDIA NUMERIC(18,2),
    DESCTOSMES NUMERIC(18,2),
    EGRTOTAL NUMERIC(18,2),
    EGRPROV NUMERIC(18,2),
    EGRCLASE1 NUMERIC(18,2),
    EGRCLASE2 NUMERIC(18,2),
    EGROTROS NUMERIC(18,2),
    TRASLADO NUMERIC(18,2),
    TRASLADOR NUMERIC(18,2),
    CONSIGNA NUMERIC(18,2))
AS
declare variable FECAUX VARCHAR(10);
declare variable FECINI DATE;
declare variable CAJA INTEGER;
begin
FECAUX = CAST (FECHA AS VARCHAR(10));
FECINI = SUBSTR(FECAUX, 1, 8) || '01';
/* ventas totales */
SELECT SUM(FACT_TOTAL) FROM FACTURAS WHERE FACT_FECHA = :FECHA AND PTVT_ID = :ptovta AND FACT_ANULADO = 'N' INTO :vtatotaldia;
if (vtatotaldia IS NULL) then
    vtatotaldia = 0;
SELECT SUM(FACT_TOTAL) FROM FACTURAS WHERE FACT_FECHA >= :fecini AND FACT_FECHA <= :FECHA AND PTVT_ID = :ptovta AND FACT_ANULADO = 'N' INTO :vtatotalmes;
if (vtatotalmes IS NULL) then
    vtatotalmes = 0;
SELECT SUM(DEVT_TOTAL) FROM DEVOLUCIONES_VENTAS WHERE DEVT_FECHA = :FECHA AND PTVT_ID = :ptovta AND DEVT_ANULADO = 'N' INTO :devoldia;
if (devoldia IS NULL) then
    devoldia = 0;
SELECT SUM(DEVT_TOTAL) FROM DEVOLUCIONES_VENTAS WHERE DEVT_FECHA >= :fecini AND DEVT_FECHA <= :FECHA AND PTVT_ID = :ptovta AND DEVT_ANULADO = 'N' INTO :devolmes;
if (devolmes IS NULL) then
    devolmes = 0;
/* ventas contado */
SELECT SUM(RCDE_ABONO), SUM(RCDE_DTOF) FROM RECIBOS_CAJA_DETALLE D, RECIBOS_CAJA R,  FACTURAS F
    WHERE FACT_FECHA = :FECHA AND PTVT_ID = :ptovta AND D.rcde_tipodoc = 31 AND D.rcde_iddoc = F.fact_id AND R.reca_id = D.reca_id AND RECA_FECHA = :FECHA AND RCDE_ANULADO = 'N'
    INTO :vtacontdia, :desctosdia;
if (vtacontdia IS NULL) then
    vtacontdia = 0;
if (desctosdia IS NULL) then
    desctosdia = 0;

SELECT SUM(RCDE_ABONO), SUM(RCDE_DTOF) FROM RECIBOS_CAJA_DETALLE D, RECIBOS_CAJA R,  FACTURAS F
    WHERE FACT_FECHA >= :fecini AND PTVT_ID = :ptovta AND FACT_FECHA <= :FECHA AND D.rcde_tipodoc = 31 AND D.rcde_iddoc = F.fact_id AND R.reca_id = D.reca_id AND RECA_FECHA = FACT_FECHA AND RCDE_ANULADO = 'N'
    INTO :vtacontmes, :desctosmes;
if (vtacontmes IS NULL) then
    vtacontmes = 0;
if (desctosmes IS NULL) then
    desctosmes = 0;

/* Ventas credito */
vtacreddia = vtatotaldia - vtacontdia;
vtacredmes = vtatotalmes - vtacontmes;

vtanetadia = vtatotaldia - devoldia;
vtanetames = vtatotalmes - devolmes;

SELECT SUM(FADE_TOTAL-FADE_IVAMONTO) FROM facturas_detalle D, FACTURAS F
    WHERE D.FACT_ID = F.FACT_ID AND FACT_FECHA = :FECHA AND PTVT_ID = :ptovta AND PTVT_ID = :ptovta AND FADE_IVAPORC = 0 and FACT_ANULADO = 'N' AND D.fade_referencia <> '.t'
    INTO :vtaexentadia;
if (vtaexentadia IS NULL) then
    vtaexentadia = 0;
SELECT SUM(FADE_TOTAL-FADE_IVAMONTO) FROM facturas_detalle D, FACTURAS F
    WHERE D.FACT_ID = F.FACT_ID AND FACT_FECHA >= :fecini AND FACT_FECHA <= :FECHA AND PTVT_ID = :ptovta AND FADE_IVAPORC = 0 and FACT_ANULADO = 'N'  AND D.fade_referencia <> '.t'
    INTO :vtaexentames;
if (vtaexentames IS NULL) then
    vtaexentames = 0;
SELECT SUM(FADE_TOTAL-FADE_IVAMONTO), SUM(FADE_IVAMONTO) FROM facturas_detalle D, FACTURAS F
    WHERE D.FACT_ID = F.FACT_ID AND FACT_FECHA = :FECHA AND PTVT_ID = :ptovta AND FADE_IVAPORC = 16 and FACT_ANULADO = 'N'  AND D.fade_referencia <> '.t'
    INTO :vtagrava16dia, :iva16dia;
if (vtagrava16dia IS NULL) then
    vtagrava16dia = 0;
if (iva16dia IS NULL) then
    iva16dia = 0;
SELECT SUM(FADE_TOTAL-FADE_IVAMONTO), SUM(FADE_IVAMONTO) FROM facturas_detalle D, FACTURAS F
    WHERE D.FACT_ID = F.FACT_ID AND FACT_FECHA >= :fecini AND FACT_FECHA <= :FECHA AND PTVT_ID = :ptovta AND FADE_IVAPORC = 16 and FACT_ANULADO = 'N'  AND D.fade_referencia <> '.t'
    INTO :vtagrava16mes, :iva16mes;
if (vtagrava16mes IS NULL) then
    vtagrava16mes = 0;
if (iva16mes IS NULL) then
    iva16mes = 0;
SELECT SUM(FADE_TOTAL-FADE_IVAMONTO), SUM(FADE_IVAMONTO) FROM facturas_detalle D, FACTURAS F
    WHERE D.FACT_ID = F.FACT_ID AND FACT_FECHA = :FECHA AND PTVT_ID = :ptovta AND FADE_IVAPORC = 10 and FACT_ANULADO = 'N'  AND D.fade_referencia <> '.t'
    INTO :vtagrava10dia, :iva10dia;
if (vtagrava10dia IS NULL) then
    vtagrava10dia = 0;
if (iva10dia IS NULL) then
    iva10dia = 0;
SELECT SUM(FADE_TOTAL-FADE_IVAMONTO), SUM(FADE_IVAMONTO) FROM facturas_detalle D, FACTURAS F
    WHERE D.FACT_ID = F.FACT_ID AND FACT_FECHA >= :fecini AND FACT_FECHA <= :FECHA AND PTVT_ID = :ptovta AND FADE_IVAPORC = 10 and FACT_ANULADO = 'N'  AND D.fade_referencia <> '.t'
    INTO :vtagrava10mes, :iva10mes;
if (vtagrava10mes IS NULL) then
    vtagrava10mes = 0;
if (iva10mes IS NULL) then
    iva10mes = 0;

/* POR FORMA DE PAGO */
SELECT SUM(RCPA_MONTO) FROM RECIBOS_CAJA_PAGO P, RECIBOS_CAJA R, PUNTO_VENTA PT
    WHERE R.RECA_ID = P.RECA_ID AND PT.PTVT_ID = :ptovta AND RECA_FECHA = :fecha AND PT.caja_id = R.caja_id AND FOPA_ID = 1 and RECA_ANULADO = 'N'
    INTO :FORMAP1;
SELECT SUM(RCPA_MONTO) FROM RECIBOS_CAJA_PAGO P, RECIBOS_CAJA R, PUNTO_VENTA PT
    WHERE R.RECA_ID = P.RECA_ID AND PT.PTVT_ID = :ptovta AND RECA_FECHA = :FECHA AND PT.caja_id = R.caja_id AND FOPA_ID = 2 and RECA_ANULADO = 'N'
    INTO :FORMAP2;
SELECT SUM(RCPA_MONTO) FROM RECIBOS_CAJA_PAGO P, RECIBOS_CAJA R, PUNTO_VENTA PT
    WHERE R.RECA_ID = P.RECA_ID AND PT.PTVT_ID = :ptovta AND RECA_FECHA = :FECHA AND PT.caja_id = R.caja_id AND FOPA_ID = 3 and RECA_ANULADO = 'N'
    INTO :FORMAP3;
SELECT SUM(RCPA_MONTO) FROM RECIBOS_CAJA_PAGO P, RECIBOS_CAJA R, PUNTO_VENTA PT
    WHERE R.RECA_ID = P.RECA_ID AND PT.PTVT_ID = :ptovta AND RECA_FECHA = :FECHA AND PT.caja_id = R.caja_id AND FOPA_ID = 4 and RECA_ANULADO = 'N'
    INTO :FORMAP4;
SELECT SUM(RCPA_MONTO) FROM RECIBOS_CAJA_PAGO P, RECIBOS_CAJA R, PUNTO_VENTA PT
    WHERE R.RECA_ID = P.RECA_ID AND PT.PTVT_ID = :ptovta AND RECA_FECHA = :FECHA AND PT.caja_id = R.caja_id AND FOPA_ID = 5 and RECA_ANULADO = 'N'
    INTO :FORMAP5;
SELECT SUM(FACT_TOTAL) FROM FACTURAS f WHERE FACT_FECHA = :fecha AND PTVT_ID = :ptovta AND FACT_ANULADO = 'N' AND
    FACT_ID NOT IN (SELECT RCDE_IDDOC FROM RECIBOS_CAJA R, RECIBOS_CAJA_DETALLE D WHERE R.reca_id = D.reca_id AND R.reca_fecha = F.fact_fecha AND D.rcde_tipodoc = 31)
    INTO :cartera;
if (formap1 is null) then
    formap1 = 0;
if (formap2 is null) then
    formap2 = 0;
if (formap3 is null) then
    formap3 = 0;
if (formap4 is null) then
    formap4 = 0;
if (formap5 is null) then
    formap5 = 0;
if (cartera is null) then
    cartera = 0;

/* EL MES X FORMA DE PAGO */
SELECT SUM(RCPA_MONTO) FROM RECIBOS_CAJA_PAGO P, RECIBOS_CAJA R, PUNTO_VENTA PT
    WHERE R.RECA_ID = P.RECA_ID AND PT.PTVT_ID = :ptovta AND RECA_FECHA >= :fecini AND RECA_FECHA <= :fecha AND PT.caja_id = R.caja_id AND FOPA_ID = 1 and RECA_ANULADO = 'N'
    INTO :FORMAP1MES;
SELECT SUM(RCPA_MONTO) FROM RECIBOS_CAJA_PAGO P, RECIBOS_CAJA R, PUNTO_VENTA PT
    WHERE R.RECA_ID = P.RECA_ID AND PT.PTVT_ID = :ptovta AND RECA_FECHA >= :fecini AND RECA_FECHA <= :fecha AND PT.caja_id = R.caja_id AND FOPA_ID = 2 and RECA_ANULADO = 'N'
    INTO :FORMAP2MES;
SELECT SUM(RCPA_MONTO) FROM RECIBOS_CAJA_PAGO P, RECIBOS_CAJA R, PUNTO_VENTA PT
    WHERE R.RECA_ID = P.RECA_ID AND PT.PTVT_ID = :ptovta AND RECA_FECHA >= :fecini AND RECA_FECHA <= :fecha AND PT.caja_id = R.caja_id AND FOPA_ID = 3 and RECA_ANULADO = 'N'
    INTO :FORMAP3MES;
SELECT SUM(RCPA_MONTO) FROM RECIBOS_CAJA_PAGO P, RECIBOS_CAJA R, PUNTO_VENTA PT
    WHERE R.RECA_ID = P.RECA_ID AND PT.PTVT_ID = :ptovta AND RECA_FECHA >= :fecini AND RECA_FECHA <= :fecha AND PT.caja_id = R.caja_id AND FOPA_ID = 4 and RECA_ANULADO = 'N'
    INTO :FORMAP4MES;
SELECT SUM(RCPA_MONTO) FROM RECIBOS_CAJA_PAGO P, RECIBOS_CAJA R, PUNTO_VENTA PT
    WHERE R.RECA_ID = P.RECA_ID AND PT.PTVT_ID = :ptovta AND RECA_FECHA >= :fecini AND RECA_FECHA <= :fecha AND PT.caja_id = R.caja_id AND FOPA_ID = 5 and RECA_ANULADO = 'N'
    INTO :FORMAP5MES;

SELECT SUM(FACT_TOTAL) FROM FACTURAS f WHERE FACT_FECHA >= :fecini AND FACT_FECHA <= :fecha AND PTVT_ID = :ptovta AND FACT_ANULADO = 'N' AND
    FACT_ID NOT IN (SELECT RCDE_IDDOC FROM RECIBOS_CAJA R, RECIBOS_CAJA_DETALLE D WHERE R.reca_id = D.reca_id AND R.reca_fecha = F.fact_fecha AND D.rcde_tipodoc = 31)
    INTO :carterames;
if (formap1mes is null) then
    formap1mes = 0;
if (formap2mes is null) then
    formap2mes = 0;
if (formap3mes is null) then
    formap3mes = 0;
if (formap4mes is null) then
    formap4mes = 0;
if (formap5mes is null) then
    formap5mes = 0;
if (carterames is null) then
    carterames = 0;

/* SALDO INICIAL */
SELECT CAJA_ID FROM punto_venta WHERE PTVT_ID = :ptovta INTO :CAJA;
EXECUTE PROCEDURE saldo_en_caja(:caja, :fecha) returning_values (:inicial);
/* recibos totales */
select sum(reca_monto) from recibos_caja where reca_fecha = :fecha AND RECA_ANULADO = 'N' and caja_id = :caja into :ingtotal;
if (ingtotal IS NULL) then
    ingtotal = 0;
/* recibos otros */
select sum(reca_monto) from recibos_caja r where reca_fecha = :fecha AND RECA_ANULADO = 'N' and caja_id = :caja and reca_id not in (select reca_id from recibos_caja_detalle) into :ingotros;
if (ingotros IS NULL) then
    ingotros = 0;
/* recibos cxc */
select sum(rcde_abono) from recibos_caja_detalle d, recibos_caja r,  movimiento_clientes m
    where mvcl_fecha <> :fecha and r.reca_id = d.reca_id and r.reca_fecha = :fecha and caja_id = :caja and d.rcde_tipodoc = m.mvcl_tiporef and d.rcde_iddoc = m.mvcl_idref AND RCDE_ANULADO = 'N'
    into :ingcartera;
if (ingcartera IS NULL) then
    ingcartera = 0;

/* EGRESOS totales */
select sum(egca_monto) from egresos_caja c, egresos e where e.egre_id = c.egre_id and c.CAJA_ID = :caja and e.egre_fecha = :fecha AND EGCA_ANULADO = 'N'
into :egrtotal;
if (egrtotal IS NULL) then
    egrtotal = 0;
/* EGRESOS PROVEEDORES */
select sum(egca_monto) from egresos_caja c, egresos e, egresos_detalle d
    where e.egre_id = c.egre_id and c.CAJA_ID = :caja and e.egre_fecha = :fecha AND EGCA_ANULADO = 'N' and
    e.egre_id = d.egre_id into :egrprov;
if (egrprov IS NULL) then
    egrprov = 0;
/* EGRESOS CLASE1 */
select sum(egca_monto) from egresos_caja c, egresos e
    where e.egre_id = c.egre_id and c.CAJA_ID = :caja and e.cleg_id = 1 and e.egre_fecha = :fecha AND EGCA_ANULADO = 'N' and
    e.egre_id = c.egre_id into :egrclase1;
if (egrclase1 IS NULL) then
    egrclase1 = 0;
/* EGRESOS CLASE2 */
select sum(egca_monto) from egresos_caja c, egresos e
    where e.egre_id = c.egre_id and c.CAJA_ID = :caja and e.cleg_id = 2 and e.egre_fecha = :fecha AND EGCA_ANULADO = 'N' and
    e.egre_id = c.egre_id into :egrclase2;
if (egrclase2 IS NULL) then
    egrclase2 = 0;
/* EGRESOS OTROS */
egrotros = egrtotal - egrprov - egrclase1 - egrclase2;

/* traslados caja */
select sum(trcd_monto) from traslados_caja t, traslados_caja_det d where t.trcj_id = d.trcj_id and t.caja_id = :caja and t.trcj_fecha = :fecha into :traslado;
if (traslado is null) then
    traslado = 0;
/* traslados caja recibidos */
select sum(trcd_monto) from traslados_caja t, traslados_caja_det d where t.trcj_id = d.trcj_id and t.trcj_destino = :caja and t.trcj_fecha = :fecha into :traslador;
if (traslador is null) then
    traslador = 0;
/* consignaciones */
select sum(code_monto) from consigna_detalle d, consigna c where c.cons_id = d.cons_id and cons_fecha = :fecha and d.caja_id = :caja into :consigna;
if (consigna is null) then
    consigna = 0;
suspend;
end
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE RESUMEN_DIA(
    FECHA DATE,
    PTOINI INTEGER,
    PTOFIN INTEGER,
    AGENCIA INTEGER)
RETURNS (
    PTOVTA INTEGER,
    PTOVTANOM VARCHAR(60),
    VTACONTDIA NUMERIC(18,2),
    VTACONTMES NUMERIC(18,2),
    VTACREDDIA NUMERIC(18,2),
    VTACREDMES NUMERIC(18,2),
    VTATOTALDIA NUMERIC(18,2),
    VTATOTALMES NUMERIC(18,2),
    DEVOLDIA NUMERIC(18,2),
    DEVOLMES NUMERIC(18,2),
    VTANETADIA NUMERIC(18,2),
    VTANETAMES NUMERIC(18,2),
    VTAEXENTADIA NUMERIC(18,2),
    VTAGRAVA16DIA NUMERIC(18,2),
    VTAGRAVA10DIA NUMERIC(18,2),
    VTAEXENTAMES NUMERIC(18,2),
    VTAGRAVA16MES NUMERIC(18,2),
    VTAGRAVA10MES NUMERIC(18,2),
    IVA16DIA NUMERIC(18,2),
    IVA10DIA NUMERIC(18,2),
    IVA16MES NUMERIC(18,2),
    IVA10MES NUMERIC(18,2),
    FORMAP1 NUMERIC(18,2),
    FORMAP2 NUMERIC(18,2),
    FORMAP3 NUMERIC(18,2),
    FORMAP4 NUMERIC(18,2),
    FORMAP5 NUMERIC(18,2),
    CARTERA NUMERIC(18,2),
    FORMAP1MES NUMERIC(18,2),
    FORMAP2MES NUMERIC(18,2),
    FORMAP3MES NUMERIC(18,2),
    FORMAP4MES NUMERIC(18,2),
    FORMAP5MES NUMERIC(18,2),
    CARTERAMES NUMERIC(18,2),
    INICIAL NUMERIC(18,2),
    INGCARTERA NUMERIC(18,2),
    INGOTROS NUMERIC(18,2),
    INGTOTAL NUMERIC(18,2),
    DESCTOSDIA NUMERIC(18,2),
    DESCTOSMES NUMERIC(18,2),
    EGRTOTAL NUMERIC(18,2),
    EGRPROV NUMERIC(18,2),
    EGRCLASE1 NUMERIC(18,2),
    EGRCLASE2 NUMERIC(18,2),
    EGROTROS NUMERIC(18,2),
    TRASLADO NUMERIC(18,2),
    TRASLADOR NUMERIC(18,2),
    CONSIGNA NUMERIC(18,2),
    FINAL NUMERIC(18,2),
    CMPEXENTADIA NUMERIC(18,2),
    CMPGRAVA16DIA NUMERIC(18,2),
    CMPGRAVA10DIA NUMERIC(18,2),
    CMPEXENTAMES NUMERIC(18,2),
    CMPGRAVA16MES NUMERIC(18,2),
    CMPGRAVA10MES NUMERIC(18,2),
    CMPTOTALDIA NUMERIC(18,2),
    CMPTOTALMES NUMERIC(18,2),
    CMPCONTADODIA NUMERIC(18,2),
    CMPCREDITODIA NUMERIC(18,2),
    CMPCONTADOMES NUMERIC(18,2),
    CMPCREDITOMES NUMERIC(18,2),
    DEVCMPDIA NUMERIC(18,2),
    DEVCMPMES NUMERIC(18,2),
    CMPNETADIA NUMERIC(18,2),
    CMPNETAMES NUMERIC(18,2),
    IVAC16DIA NUMERIC(18,2),
    IVAC10DIA NUMERIC(18,2),
    IVAC16MES NUMERIC(18,2),
    IVAC10MES NUMERIC(18,2))
AS
declare variable FECAUX VARCHAR(10);
declare variable FECINI DATE;
begin /*$$IBE$$ 
FECAUX = CAST (FECHA AS VARCHAR(10));
FECINI = SUBSTR(FECAUX, 1, 8) || '01';
SELECT SUM(FCDE_TOTAL-FCDE_IVAMONTO) FROM facturas_compras_detalle D, facturas_compra F, PREFIJOS P
    WHERE D.FACO_ID = F.FACO_ID AND FACO_FECHA = :FECHA AND FCDE_IVAPORC = 0 and FACO_ANULADO = 'N' AND
        P.pref_pre = F.pref_pre AND P.tido_cod = 21 AND ((:AGENCIA = 0) or (P.sucu_id = :AGENCIA))
    INTO :cmpexentadia;
if (cmpexentadia IS NULL) then
    cmpexentadia = 0;
SELECT SUM(FCDE_TOTAL-FCDE_IVAMONTO) FROM facturas_compras_detalle D, facturas_compra F, PREFIJOS P
    WHERE D.FACO_ID = F.FACO_ID AND FACO_FECHA >= :fecini AND FACO_FECHA <= :FECHA AND FCDE_IVAPORC = 0 and FACO_ANULADO = 'N' and
        P.pref_pre = F.pref_pre AND P.tido_cod = 21 AND ((:AGENCIA = 0) or (P.sucu_id = :AGENCIA))
    INTO :cmpexentames;
if (cmpexentames IS NULL) then
    cmpexentames = 0;
SELECT SUM(FCDE_TOTAL-FCDE_IVAMONTO), SUM(FCDE_IVAMONTO) from facturas_compras_detalle D, facturas_compra F, prefijos p
    WHERE D.FACO_ID = F.FACO_ID AND FACO_FECHA = :FECHA AND FCDE_IVAPORC = 16 and FACO_ANULADO = 'N' AND
        P.pref_pre = F.pref_pre AND P.tido_cod = 21 AND ((:AGENCIA = 0) or (P.sucu_id = :AGENCIA))
    INTO :cmpgrava16dia, :ivac16dia;
if (cmpgrava16dia IS NULL) then
    cmpgrava16dia = 0;
if (ivac16dia IS NULL) then
    ivac16dia = 0;
SELECT SUM(FCDE_TOTAL-FCDE_IVAMONTO), SUM(FCDE_IVAMONTO) from facturas_compras_detalle D, facturas_compra F, PREFIJOS P
    WHERE D.FACO_ID = F.FACO_ID AND FACO_FECHA >= :fecini AND FACO_FECHA <= :FECHA AND FCDE_IVAPORC = 16 and FACO_ANULADO = 'N' AND
        P.pref_pre = F.pref_pre AND P.tido_cod = 21 AND ((:AGENCIA = 0) or (P.sucu_id = :AGENCIA))
    INTO :cmpgrava16mes, :ivac16mes;
if (cmpgrava16mes IS NULL) then
    cmpgrava16mes = 0;
if (ivac16mes IS NULL) then
    ivac16mes = 0;
SELECT SUM(FCDE_TOTAL-FCDE_IVAMONTO), SUM(FCDE_IVAMONTO) FROM facturas_compras_detalle D, facturas_compra F, PREFIJOS P
    WHERE D.FACO_ID = F.FACO_ID AND FACO_FECHA = :FECHA AND FCDE_IVAPORC = 10 and FACO_ANULADO = 'N' AND
        P.pref_pre = F.pref_pre AND P.tido_cod = 21 AND ((:AGENCIA = 0) or (P.sucu_id = :AGENCIA))
    INTO :cmpgrava10dia, :ivac10dia;
if (cmpgrava10dia IS NULL) then
    cmpgrava10dia = 0;
if (ivac10dia IS NULL) then
    ivac10dia = 0;
SELECT SUM(FCDE_TOTAL-FCDE_IVAMONTO), SUM(FCDE_IVAMONTO) FROM facturas_compras_detalle D, facturas_compra F, PREFIJOS P
    WHERE D.FACO_ID = F.FACO_ID AND FACO_FECHA >= :fecini AND FACO_FECHA <= :FECHA AND FCDE_IVAPORC = 10 and FACO_ANULADO = 'N' AND
        P.pref_pre = F.pref_pre AND P.tido_cod = 21 AND ((:AGENCIA = 0) or (P.sucu_id = :AGENCIA))
    INTO :cmpgrava10mes, :ivac10mes;
if (cmpgrava10mes IS NULL) then
    cmpgrava10mes = 0;
if (ivac10mes IS NULL) then
    ivac10mes = 0;
SELECT SUM(FACO_TOTAL) FROM FACTURAS_COMPRA F, PREFIJOS P
    WHERE P.pref_pre = F.pref_pre AND P.tido_cod = 21 AND ((:AGENCIA = 0) or (P.sucu_id = :AGENCIA)) AND
    FACO_FECHA = :fecha AND FACO_ANULADO = 'N' INTO :cmptotaldia;
SELECT SUM(FACO_TOTAL) FROM FACTURAS_COMPRA F, PREFIJOS P
    WHERE P.pref_pre = F.pref_pre AND P.tido_cod = 21 AND ((:AGENCIA = 0) or (P.sucu_id = :AGENCIA)) AND
    FACO_FECHA >= :fecini AND FACO_FECHA <= :fecha AND FACO_ANULADO = 'N' INTO :cmptotalmes;
if (cmptotaldia IS NULL) then
    cmptotaldia = 0;
if (cmptotalmes IS NULL) then
    cmptotalmes = 0;
SELECT SUM(FACO_TOTAL) FROM FACTURAS_COMPRA F, PREFIJOS P, EGRESOS_DETALLE D, EGRESOS E
    WHERE P.pref_pre = F.pref_pre AND P.tido_cod = 21 AND ((:AGENCIA = 0) or (P.sucu_id = :AGENCIA)) AND
    D.egde_iddoc = F.faco_id AND D.egde_tipodoc = 21 AND E.egre_id = D.egre_id AND E.egre_fecha = :FECHA AND
    FACO_FECHA = :fecha AND FACO_ANULADO = 'N' INTO :cmpcontadodia;
SELECT SUM(FACO_TOTAL) FROM FACTURAS_COMPRA F, PREFIJOS P, EGRESOS_DETALLE D, EGRESOS E
    WHERE P.pref_pre = F.pref_pre AND P.tido_cod = 21 AND ((:AGENCIA = 0) or (P.sucu_id = :AGENCIA)) AND
    D.egde_iddoc = F.faco_id AND D.egde_tipodoc = 21 AND E.egre_id = D.egre_id AND E.egre_fecha = F.faco_fecha AND
    FACO_FECHA >= :fecini AND FACO_FECHA <= :fecha AND FACO_ANULADO = 'N' INTO :cmpcontadomes;
if (cmpcontadodia IS NULL) then
    cmpcontadodia = 0;
if (cmpcontadomes IS NULL) then
    cmpcontadomes = 0;
CMPCREDITODIA = cmptotaldia - cmpcontadodia;
cmpcreditomes = cmptotalmes - cmpcontadomes;
SELECT SUM(DVCO_TOTAL) FROM DEVOLUCIONES_COMPRAS
    WHERE DVCO_FECHA = :fecha AND DVCO_ANULADO = 'N' INTO :devcmpdia;
SELECT SUM(DVCO_TOTAL) FROM DEVOLUCIONES_COMPRAS
    WHERE DVCO_FECHA >= :fecini AND DVCO_FECHA <= :fecha AND DVCO_ANULADO = 'N' INTO :devcmpmes;
if (devcmpdia IS NULL) then
    devcmpdia = 0;
if (devcmpmes IS NULL) then
    devcmpmes = 0;
cmpnetadia = cmptotaldia - devcmpdia;
cmpnetames = cmptotalmes - devcmpmes;
FOR SELECT PTVT_ID, PTVT_NOM FROM PUNTO_VENTA WHERE PTVT_ID >= :ptoini AND PTVT_ID <= :ptofin AND ((SUCU_ID = :agencia) or (:AGENCIA = 0))
    INTO :ptovta, :ptovtanom
    DO
    BEGIN
    SELECT VTACONTDIA, VTACONTMES, VTACREDDIA, VTACREDMES, VTATOTALDIA, VTATOTALMES,
        DEVOLDIA, DEVOLMES, VTANETADIA, VTANETAMES, VTAEXENTADIA, VTAGRAVA16DIA, VTAGRAVA10DIA,
        VTAEXENTAMES, VTAGRAVA16MES, VTAGRAVA10MES, IVA16DIA, IVA10DIA, IVA16MES, IVA10MES,
        INICIAL, INGCARTERA, INGOTROS, INGTOTAL, DESCTOSDIA, DESCTOSMES,
        EGRTOTAL, EGRPROV, EGRCLASE1, EGRCLASE2, EGROTROS, TRASLADO, TRASLADOR, CONSIGNA,
        formap1,  FORMAP2, FORMAP3, fORMAP4,  FORMAP5, CARTERA,
        formap1mes,  FORMAP2MES, FORMAP3MES, fORMAP4MES,  FORMAP5MES, CARTERAMES
        FROM cierre_diario(:fecha, :ptovta)
        into :VTACONTDIA, :VTACONTMES, :VTACREDDIA, :VTACREDMES, :VTATOTALDIA, :VTATOTALMES,
        :DEVOLDIA, :DEVOLMES, :VTANETADIA, :VTANETAMES, :VTAEXENTADIA, :VTAGRAVA16DIA, :VTAGRAVA10DIA,
        :VTAEXENTAMES, :VTAGRAVA16MES, :VTAGRAVA10MES, :IVA16DIA, :IVA10DIA, :IVA16MES, :IVA10MES,
        :INICIAL, :INGCARTERA, :INGOTROS, :INGTOTAL, :DESCTOSDIA, :DESCTOSMES,
        :EGRTOTAL, :EGRPROV, :EGRCLASE1, :EGRCLASE2, :EGROTROS, :TRASLADO, :traslador, :CONSIGNA,
        :FORMAP1, :FORMAP2, :FORMAP3, :FORMAP4, :FORMAP5, :CARTERA,
        :FORMAP1MES, :FORMAP2MES, :FORMAP3MES, :FORMAP4MES, :FORMAP5MES, :CARTERAMES;
    FINAL = INICIAL + INGTOTAL - EGRTOTAL - TRASLADO + traslador - CONSIGNA;
    SUSPEND;
    END
 $$IBE$$*/ SUSPEND;
end
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE RESUMEN_DIA(
    FECHA DATE,
    PTOINI INTEGER,
    PTOFIN INTEGER,
    AGENCIA INTEGER)
RETURNS (
    PTOVTA INTEGER,
    PTOVTANOM VARCHAR(60),
    VTACONTDIA NUMERIC(18,2),
    VTACONTMES NUMERIC(18,2),
    VTACREDDIA NUMERIC(18,2),
    VTACREDMES NUMERIC(18,2),
    VTATOTALDIA NUMERIC(18,2),
    VTATOTALMES NUMERIC(18,2),
    DEVOLDIA NUMERIC(18,2),
    DEVOLMES NUMERIC(18,2),
    VTANETADIA NUMERIC(18,2),
    VTANETAMES NUMERIC(18,2),
    VTAEXENTADIA NUMERIC(18,2),
    VTAGRAVA16DIA NUMERIC(18,2),
    VTAGRAVA10DIA NUMERIC(18,2),
    VTAEXENTAMES NUMERIC(18,2),
    VTAGRAVA16MES NUMERIC(18,2),
    VTAGRAVA10MES NUMERIC(18,2),
    IVA16DIA NUMERIC(18,2),
    IVA10DIA NUMERIC(18,2),
    IVA16MES NUMERIC(18,2),
    IVA10MES NUMERIC(18,2),
    FORMAP1 NUMERIC(18,2),
    FORMAP2 NUMERIC(18,2),
    FORMAP3 NUMERIC(18,2),
    FORMAP4 NUMERIC(18,2),
    FORMAP5 NUMERIC(18,2),
    CARTERA NUMERIC(18,2),
    FORMAP1MES NUMERIC(18,2),
    FORMAP2MES NUMERIC(18,2),
    FORMAP3MES NUMERIC(18,2),
    FORMAP4MES NUMERIC(18,2),
    FORMAP5MES NUMERIC(18,2),
    CARTERAMES NUMERIC(18,2),
    INICIAL NUMERIC(18,2),
    INGCARTERA NUMERIC(18,2),
    INGOTROS NUMERIC(18,2),
    INGTOTAL NUMERIC(18,2),
    DESCTOSDIA NUMERIC(18,2),
    DESCTOSMES NUMERIC(18,2),
    EGRTOTAL NUMERIC(18,2),
    EGRPROV NUMERIC(18,2),
    EGRCLASE1 NUMERIC(18,2),
    EGRCLASE2 NUMERIC(18,2),
    EGROTROS NUMERIC(18,2),
    TRASLADO NUMERIC(18,2),
    TRASLADOR NUMERIC(18,2),
    CONSIGNA NUMERIC(18,2),
    FINAL NUMERIC(18,2),
    CMPEXENTADIA NUMERIC(18,2),
    CMPGRAVA16DIA NUMERIC(18,2),
    CMPGRAVA10DIA NUMERIC(18,2),
    CMPEXENTAMES NUMERIC(18,2),
    CMPGRAVA16MES NUMERIC(18,2),
    CMPGRAVA10MES NUMERIC(18,2),
    CMPTOTALDIA NUMERIC(18,2),
    CMPTOTALMES NUMERIC(18,2),
    CMPCONTADODIA NUMERIC(18,2),
    CMPCREDITODIA NUMERIC(18,2),
    CMPCONTADOMES NUMERIC(18,2),
    CMPCREDITOMES NUMERIC(18,2),
    DEVCMPDIA NUMERIC(18,2),
    DEVCMPMES NUMERIC(18,2),
    CMPNETADIA NUMERIC(18,2),
    CMPNETAMES NUMERIC(18,2),
    IVAC16DIA NUMERIC(18,2),
    IVAC10DIA NUMERIC(18,2),
    IVAC16MES NUMERIC(18,2),
    IVAC10MES NUMERIC(18,2))
AS
declare variable FECAUX VARCHAR(10);
declare variable FECINI DATE;
begin
FECAUX = CAST (FECHA AS VARCHAR(10));
FECINI = SUBSTR(FECAUX, 1, 8) || '01';
SELECT SUM(FCDE_TOTAL-FCDE_IVAMONTO) FROM facturas_compras_detalle D, facturas_compra F, PREFIJOS P
    WHERE D.FACO_ID = F.FACO_ID AND FACO_FECHA = :FECHA AND FCDE_IVAPORC = 0 and FACO_ANULADO = 'N' AND
        P.pref_pre = F.pref_pre AND P.tido_cod = 21 AND ((:AGENCIA = 0) or (P.sucu_id = :AGENCIA))
    INTO :cmpexentadia;
if (cmpexentadia IS NULL) then
    cmpexentadia = 0;
SELECT SUM(FCDE_TOTAL-FCDE_IVAMONTO) FROM facturas_compras_detalle D, facturas_compra F, PREFIJOS P
    WHERE D.FACO_ID = F.FACO_ID AND FACO_FECHA >= :fecini AND FACO_FECHA <= :FECHA AND FCDE_IVAPORC = 0 and FACO_ANULADO = 'N' and
        P.pref_pre = F.pref_pre AND P.tido_cod = 21 AND ((:AGENCIA = 0) or (P.sucu_id = :AGENCIA))
    INTO :cmpexentames;
if (cmpexentames IS NULL) then
    cmpexentames = 0;
SELECT SUM(FCDE_TOTAL-FCDE_IVAMONTO), SUM(FCDE_IVAMONTO) from facturas_compras_detalle D, facturas_compra F, prefijos p
    WHERE D.FACO_ID = F.FACO_ID AND FACO_FECHA = :FECHA AND FCDE_IVAPORC = 16 and FACO_ANULADO = 'N' AND
        P.pref_pre = F.pref_pre AND P.tido_cod = 21 AND ((:AGENCIA = 0) or (P.sucu_id = :AGENCIA))
    INTO :cmpgrava16dia, :ivac16dia;
if (cmpgrava16dia IS NULL) then
    cmpgrava16dia = 0;
if (ivac16dia IS NULL) then
    ivac16dia = 0;
SELECT SUM(FCDE_TOTAL-FCDE_IVAMONTO), SUM(FCDE_IVAMONTO) from facturas_compras_detalle D, facturas_compra F, PREFIJOS P
    WHERE D.FACO_ID = F.FACO_ID AND FACO_FECHA >= :fecini AND FACO_FECHA <= :FECHA AND FCDE_IVAPORC = 16 and FACO_ANULADO = 'N' AND
        P.pref_pre = F.pref_pre AND P.tido_cod = 21 AND ((:AGENCIA = 0) or (P.sucu_id = :AGENCIA))
    INTO :cmpgrava16mes, :ivac16mes;
if (cmpgrava16mes IS NULL) then
    cmpgrava16mes = 0;
if (ivac16mes IS NULL) then
    ivac16mes = 0;
SELECT SUM(FCDE_TOTAL-FCDE_IVAMONTO), SUM(FCDE_IVAMONTO) FROM facturas_compras_detalle D, facturas_compra F, PREFIJOS P
    WHERE D.FACO_ID = F.FACO_ID AND FACO_FECHA = :FECHA AND FCDE_IVAPORC = 10 and FACO_ANULADO = 'N' AND
        P.pref_pre = F.pref_pre AND P.tido_cod = 21 AND ((:AGENCIA = 0) or (P.sucu_id = :AGENCIA))
    INTO :cmpgrava10dia, :ivac10dia;
if (cmpgrava10dia IS NULL) then
    cmpgrava10dia = 0;
if (ivac10dia IS NULL) then
    ivac10dia = 0;
SELECT SUM(FCDE_TOTAL-FCDE_IVAMONTO), SUM(FCDE_IVAMONTO) FROM facturas_compras_detalle D, facturas_compra F, PREFIJOS P
    WHERE D.FACO_ID = F.FACO_ID AND FACO_FECHA >= :fecini AND FACO_FECHA <= :FECHA AND FCDE_IVAPORC = 10 and FACO_ANULADO = 'N' AND
        P.pref_pre = F.pref_pre AND P.tido_cod = 21 AND ((:AGENCIA = 0) or (P.sucu_id = :AGENCIA))
    INTO :cmpgrava10mes, :ivac10mes;
if (cmpgrava10mes IS NULL) then
    cmpgrava10mes = 0;
if (ivac10mes IS NULL) then
    ivac10mes = 0;
SELECT SUM(FACO_TOTAL) FROM FACTURAS_COMPRA F, PREFIJOS P
    WHERE P.pref_pre = F.pref_pre AND P.tido_cod = 21 AND ((:AGENCIA = 0) or (P.sucu_id = :AGENCIA)) AND
    FACO_FECHA = :fecha AND FACO_ANULADO = 'N' INTO :cmptotaldia;
SELECT SUM(FACO_TOTAL) FROM FACTURAS_COMPRA F, PREFIJOS P
    WHERE P.pref_pre = F.pref_pre AND P.tido_cod = 21 AND ((:AGENCIA = 0) or (P.sucu_id = :AGENCIA)) AND
    FACO_FECHA >= :fecini AND FACO_FECHA <= :fecha AND FACO_ANULADO = 'N' INTO :cmptotalmes;
if (cmptotaldia IS NULL) then
    cmptotaldia = 0;
if (cmptotalmes IS NULL) then
    cmptotalmes = 0;
SELECT SUM(FACO_TOTAL) FROM FACTURAS_COMPRA F, PREFIJOS P, EGRESOS_DETALLE D, EGRESOS E
    WHERE P.pref_pre = F.pref_pre AND P.tido_cod = 21 AND ((:AGENCIA = 0) or (P.sucu_id = :AGENCIA)) AND
    D.egde_iddoc = F.faco_id AND D.egde_tipodoc = 21 AND E.egre_id = D.egre_id AND E.egre_fecha = :FECHA AND
    FACO_FECHA = :fecha AND FACO_ANULADO = 'N' INTO :cmpcontadodia;
SELECT SUM(FACO_TOTAL) FROM FACTURAS_COMPRA F, PREFIJOS P, EGRESOS_DETALLE D, EGRESOS E
    WHERE P.pref_pre = F.pref_pre AND P.tido_cod = 21 AND ((:AGENCIA = 0) or (P.sucu_id = :AGENCIA)) AND
    D.egde_iddoc = F.faco_id AND D.egde_tipodoc = 21 AND E.egre_id = D.egre_id AND E.egre_fecha = F.faco_fecha AND
    FACO_FECHA >= :fecini AND FACO_FECHA <= :fecha AND FACO_ANULADO = 'N' INTO :cmpcontadomes;
if (cmpcontadodia IS NULL) then
    cmpcontadodia = 0;
if (cmpcontadomes IS NULL) then
    cmpcontadomes = 0;
CMPCREDITODIA = cmptotaldia - cmpcontadodia;
cmpcreditomes = cmptotalmes - cmpcontadomes;
SELECT SUM(DVCO_TOTAL) FROM DEVOLUCIONES_COMPRAS
    WHERE DVCO_FECHA = :fecha AND DVCO_ANULADO = 'N' INTO :devcmpdia;
SELECT SUM(DVCO_TOTAL) FROM DEVOLUCIONES_COMPRAS
    WHERE DVCO_FECHA >= :fecini AND DVCO_FECHA <= :fecha AND DVCO_ANULADO = 'N' INTO :devcmpmes;
if (devcmpdia IS NULL) then
    devcmpdia = 0;
if (devcmpmes IS NULL) then
    devcmpmes = 0;
cmpnetadia = cmptotaldia - devcmpdia;
cmpnetames = cmptotalmes - devcmpmes;
FOR SELECT PTVT_ID, PTVT_NOM FROM PUNTO_VENTA WHERE PTVT_ID >= :ptoini AND PTVT_ID <= :ptofin AND ((SUCU_ID = :agencia) or (:AGENCIA = 0))
    INTO :ptovta, :ptovtanom
    DO
    BEGIN
    SELECT VTACONTDIA, VTACONTMES, VTACREDDIA, VTACREDMES, VTATOTALDIA, VTATOTALMES,
        DEVOLDIA, DEVOLMES, VTANETADIA, VTANETAMES, VTAEXENTADIA, VTAGRAVA16DIA, VTAGRAVA10DIA,
        VTAEXENTAMES, VTAGRAVA16MES, VTAGRAVA10MES, IVA16DIA, IVA10DIA, IVA16MES, IVA10MES,
        INICIAL, INGCARTERA, INGOTROS, INGTOTAL, DESCTOSDIA, DESCTOSMES,
        EGRTOTAL, EGRPROV, EGRCLASE1, EGRCLASE2, EGROTROS, TRASLADO, TRASLADOR, CONSIGNA,
        formap1,  FORMAP2, FORMAP3, fORMAP4,  FORMAP5, CARTERA,
        formap1mes,  FORMAP2MES, FORMAP3MES, fORMAP4MES,  FORMAP5MES, CARTERAMES
        FROM cierre_diario(:fecha, :ptovta)
        into :VTACONTDIA, :VTACONTMES, :VTACREDDIA, :VTACREDMES, :VTATOTALDIA, :VTATOTALMES,
        :DEVOLDIA, :DEVOLMES, :VTANETADIA, :VTANETAMES, :VTAEXENTADIA, :VTAGRAVA16DIA, :VTAGRAVA10DIA,
        :VTAEXENTAMES, :VTAGRAVA16MES, :VTAGRAVA10MES, :IVA16DIA, :IVA10DIA, :IVA16MES, :IVA10MES,
        :INICIAL, :INGCARTERA, :INGOTROS, :INGTOTAL, :DESCTOSDIA, :DESCTOSMES,
        :EGRTOTAL, :EGRPROV, :EGRCLASE1, :EGRCLASE2, :EGROTROS, :TRASLADO, :traslador, :CONSIGNA,
        :FORMAP1, :FORMAP2, :FORMAP3, :FORMAP4, :FORMAP5, :CARTERA,
        :FORMAP1MES, :FORMAP2MES, :FORMAP3MES, :FORMAP4MES, :FORMAP5MES, :CARTERAMES;
    FINAL = INICIAL + INGTOTAL - EGRTOTAL - TRASLADO + traslador - CONSIGNA;
    SUSPEND;
    END
end

^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER PROCEDURE CONFIRMA_RUTERO_FAC(
    TIPO INTEGER,
    RUTA INTEGER,
    FECHA DATE)
RETURNS (
    ID INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    FECDOC DATE,
    VENDCOD INTEGER,
    NIT VARCHAR(20),
    NOMTERCERO VARCHAR(60),
    PEDIDO VARCHAR(30),
    REMISION VARCHAR(30),
    CANT NUMERIC(18,4),
    CAJAS NUMERIC(18,4),
    TOTAL NUMERIC(18,2),
    OK CHAR(1),
    ENTREGADO CHAR(1),
    RAZON INTEGER,
    EXPLICA VARCHAR(60))
AS
BEGIN
OK = 'S';
FOR SELECT FACT_ID, F.PREF_PRE, FACT_NUMERO, FACT_FECHA, F.VEND_COD, F.TERC_NIT, FACT_NOMCLIENTE, FACT_PEDIDO, FACT_REMISION, FACT_TOTAL, R.ruta_ok, R.ruta_razon, R.ruta_explica
    FROM FACTURAS F, rutero_fac R WHERE R.ruta_fecha = :FECHA AND R.ruta_id = :RUTA AND R.tido_cod = :tipo AND R.ruta_iddoc = F.fact_id AND FACT_ANULADO = 'N'
    ORDER BY F.pref_pre, FACT_NUMERO
    INTO :ID, :PREF, :NUMERO, :FECDOC, :VENDCOD, :NIT, :NOMTERCERO, :PEDIDO, :REMISION, :TOTAL, :entregado, :razon, :explica
    DO
    BEGIN
    SELECT SUM(FADE_CANT), SUM(FADE_CAJAS) FROM FACTURAS_DETALLE WHERE FACT_ID = :ID and substring(arti_cod from 1 FOR 2) <> '.t'
        INTO :CANT, :CAJAS;
    SUSPEND;
    END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER PROCEDURE CONTABIL_FACTURA(
    IDDOC INTEGER,
    IDINTER INTEGER)
RETURNS (
    ERROR INTEGER,
    VER CHAR(1),
    IDC INTEGER)
AS
declare variable pref varchar(4);
declare variable num varchar(6);
declare variable numero varchar(10);
declare variable fecaux date;
declare variable fecha char(8);
declare variable conc varchar(60);
declare variable venceaux date;
declare variable vence char(8);
declare variable vrdto numeric(18,2);
declare variable vradic numeric(18,2);
declare variable vrsubt numeric(18,2);
declare variable vriva numeric(18,2);
declare variable prtfte numeric(9,2);
declare variable vrrtfte numeric(18,2);
declare variable vrrtiva numeric(18,2);
declare variable prtica numeric(9,2);
declare variable vrrtica numeric(18,2);
declare variable vrtotal numeric(18,2);
declare variable vrextra numeric(18,2);
declare variable tipocomp varchar(3);
declare variable prefcont varchar(4);
declare variable ventas char(1);
declare variable ctaventas varchar(20);
declare variable iva char(1);
declare variable ctaiva varchar(20);
declare variable consumo char(1);
declare variable ctaconsumo varchar(20);
declare variable cartera char(1);
declare variable ctacartera varchar(20);
declare variable rtfte char(1);
declare variable ctartfte varchar(20);
declare variable rtiva char(1);
declare variable ctartiva varchar(20);
declare variable rtica char(1);
declare variable ctartica varchar(20);
declare variable inven char(1);
declare variable ctainven varchar(20);
declare variable costos char(1);
declare variable ctacostos varchar(20);
declare variable ctadto varchar(20);
declare variable ctaadic varchar(20);
declare variable ctaextra varchar(20);
declare variable existe char(1);
declare variable cuenta varchar(20);
declare variable monto numeric(18,2);
declare variable tipocuen char(1);
declare variable nit varchar(20);
declare variable nombre varchar(60);
declare variable proy varchar(4);
declare variable centro varchar(4);
declare variable porc numeric(5,2);
declare variable debito numeric(18,2);
declare variable credito numeric(18,2);
declare variable nroi integer;
declare variable art varchar(15);
declare variable imptos numeric(18,2);
declare variable suma numeric(18,2);
declare variable porciva numeric(9,2);
declare variable tctaclien varchar(20);
declare variable tctaventa varchar(20);
declare variable tctartfte varchar(20);
declare variable tctartiva varchar(20);
declare variable tctartica varchar(20);
declare variable ctadic varchar(20);
declare variable baseadic varchar(20);
declare variable porcadic numeric(5,2);
declare variable valoradic numeric(18,2);
declare variable dbadic char(1);
declare variable ptovta integer;
declare variable anulado char(1);
declare variable dig integer;
declare variable mercancia numeric(18,2);
declare variable fomento varchar(2);
declare variable DTOXIT varchar(2);
declare variable vrconsumo numeric(18,2);
declare variable factor double precision;
declare variable cent char(1);
declare variable AUTORET VARCHAR(10);
declare variable FAUTORET DATE;
declare variable ERRORC INTEGER;
BEGIN
EXECUTE PROCEDURE LEE_CONFIGURACION('COMPRAS', 'FACTURAS', 'USAR IMPOCONSUMO COMO PORCENTAJE DE FOMENTO') returning_values (FOMENTO);
EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'FECHA AUTORETENEDOR NO DESCONTAR RETENCIONES DEL SALDO PERO SI CONTABILIZARLAS') returning_values (AUTORET);
if (AUTORET <> '') then
    FAUTORET = CAST(AUTORET AS DATE);
else
    FAUTORET = '9999/12/31';
/* BUSQUE LA INTERFACE */
EXISTE = 'N';
SELECT 'S', TICO_COD, PRCO_PRE, INVE_VENTAS, INVE_IVA, INVE_CONSUMO, INVE_CARTERA, INVE_RTFTE, INVE_RTIVA, INVE_RTICA, INVE_COSTO, INVE_INVEN, INVE_CTAVENTAS, INVE_CTAIVA, INVE_CTACONSUMO, INVE_CTADTO, INVE_CTAADIC, INVE_CTAEXTRA, INVE_CTACARTERA, INVE_CTARTFTE, INVE_CTARTIVA, INVE_CTARTICA, INVE_CTAINVEN, INVE_CTACOSTOS, INVE_CONFIRMAR, INVE_CENTRO
    FROM INTERFAZ_VENTAS
    WHERE INVE_ID = :IDINTER
    INTO :EXISTE, :TIPOCOMP, :PREFCONT, :VENTAS, :IVA, :CONSUMO, :CARTERA, :RTFTE, :RTIVA, :RTICA, :COSTOS, :INVEN, :CTAVENTAS, :CTAIVA, :CTACONSUMO, :CTADTO, :CTAADIC, :CTAEXTRA, :CTACARTERA, :CTARTFTE, :CTARTIVA, :CTARTICA, :CTAINVEN, :CTACOSTOS, :VER, :CENT;
if (EXISTE = 'S') then
  BEGIN
    /* BORRE CUALQUEIR CONTABILIZACION PREVIA */
    DELETE FROM CONTABILIZACION WHERE CNTB_TIPOREF = 31 AND CNTB_IDREF = :IDDOC;

  /* TRAIGA EL ENCABEZADO DE LA FACTURA */
  SELECT PREF_PRE, FACT_NUMERO, FACT_FECHA, F.TERC_NIT, PTVT_ID, FACT_VENCE, FACT_DTOMONTO, FACT_ADICIONAL, FACT_IVAMONTO, FACT_EXTRA, FACT_TOTAL, FACT_RTFTEPOR, FACT_RTFTEMONTO, FACT_RTIVAPOR, FACT_RTIVAMONTO, FACT_RTICAPOR, FACT_RTICAMONTO, FACT_NOMCLIENTE, TERC_CTARTFTE, TERC_CTARTIVA, TERC_CTARTICA, TERC_CTAVENTA, TERC_CTACLIENTE, FACT_ANULADO
        FROM FACTURAS F, TERCEROS T
        WHERE FACT_ID = :IDDOC AND F.TERC_NIT = T.TERC_NIT
        INTO :PREF, :NUM, :FECAUX, :NIT, :PTOVTA, :VENCEAUX, :VRDTO, :VRADIC, :VRIVA, :VREXTRA, :VRTOTAL, :PRTFTE, :VRRTFTE, :PORC, :VRRTIVA, :PRTICA, :VRRTICA, :NOMBRE, TCTARTFTE, TCTARTIVA, TCTARTICA, TCTAVENTA, TCTACLIEN, ANULADO;
  if (ANULADO = 'N') then
    BEGIN
    /* BUSQUE EL CENTRO DEL PUNTO, LA BODEGA, O EL PREFIJO  */
    IF (CENT = 'B') THEN
        SELECT B.BODE_CENTRO, B.BODE_PROY FROM BODEGA B, FACTURAS F
            WHERE B.BODE_COD = F.BODE_COD AND F.FACT_ID = :IDDOC INTO :CENTRO, :PROY;
    IF (CENT = 'V') THEN
        SELECT V.CENT_COD, V.PROY_COD FROM VENDEDORES V, FACTURAS F
            WHERE V.VEND_COD = F.VEND_COD AND F.FACT_ID = :IDDOC INTO :CENTRO, :PROY;
    IF (CENT = 'P') THEN
        SELECT P.PREF_CENTRO,P.PREF_PROY  FROM PREFIJOS P, FACTURAS F
            WHERE P.PREF_PRE = F.PREF_PRE AND F.FACT_ID = :IDDOC AND P.TIDO_COD = 31 INTO :CENTRO, :PROY;
    NUMERO = PREF || NUM;
    SELECT SUM (FADE_CONSUMO) FROM FACTURAS_DETALLE WHERE FACT_ID = :IDDOC AND FADE_REFERENCIA <> '.t'
        INTO MERCANCIA;
    VRSUBT = VRTOTAL - VREXTRA - VRIVA - MERCANCIA; /* BASE DE RETEFTE Y RETEICA */

    EXECUTE PROCEDURE lee_configuracion ('FACTURACION', 'FACTURAS', 'DESCUENTO PIE FACTURA IGUAL A SUMA DE DESCUENTOS POR ITEM') returning_values (:DTOXIT);
    if (DTOXIT = 'SI') then
        VRDTO = 0;
    MERCANCIA = VRSUBT - VRADIC + VRDTO;
    EXECUTE PROCEDURE FECHA_A_CONTA(:FECAUX) returning_values (:FECHA);
    EXECUTE PROCEDURE FECHA_A_CONTA(:VENCEAUX) returning_values (:VENCE);
    /* REGISTRE EL ENCABEZADO CONTABLE */
    IDC = GEN_ID(ID_CONTABILIZA, 1);
    if (STRLEN(NOMBRE)> 43 ) then
      CONC = 'FV No.' || NUMERO || '-' || SUBSTR(NOMBRE,1,43);
    ELSE
      CONC = 'FV No.' || NUMERO || '-' || NOMBRE;
    INSERT INTO CONTABILIZACION (CNTB_ID, CNTB_TIPOCOMP, CNTB_PREFCNT, CNTB_NUMERO, CNTB_FECHA, CNTB_CONCEPTO, CNTB_REF, CNTB_TIPOREF, CNTB_IDREF, CNTB_PREFREF, CNTB_NUMREF, CNTB_PROCESADO)
        VALUES (:IDC, :TIPOCOMP, :PREFCONT, :NUM, :FECHA, :CONC, '', 31, :IDDOC, :PREF, :NUM, 'N');
    NROI = 0;
    SUMA = 0;
    ERROR = 0;
    /* SI NO HAY CUENTA DE DESCUENTO NI ADICIONAL CALCULE UN FACTOR PARA LAS VENTAS Y EL IVA */
    if (MERCANCIA <> 0) then
        FACTOR = CAST(VRSUBT AS DOUBLE PRECISION) / CAST(MERCANCIA AS DOUBLE PRECISION);
    ELSE
        FACTOR = 1;
    /* TRAIGA EL NUMERO DE DIGITOS PARA EL REDONDEO */
    SELECT CAST(CONF_VALOR AS INTEGER) FROM CONFIGURACION WHERE CONF_MODULO = 'FACTURACION' AND
        CONF_CATEGORIA = 'GENERAL' AND CONF_PROPIEDAD = 'REDONDEO AL MULTIPLO DE DIEZ EN TOTALES' INTO :DIG;
    /* CUENTAS DE VENTAS */
    if (VENTAS = 'A') then
        BEGIN
        FOR SELECT MAX(COAR_CTAVNT), SUM(FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), SUM(FADE_IVAMONTO), SUM(FADE_CONSUMO)
            FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_DETALLE F
            WHERE F.FACT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND FADE_REFERENCIA <> '.t'
            GROUP BY COAR_CTAVNT
            INTO :CTAVENTAS, :MONTO, :IMPTOS, :VRCONSUMO
            DO
            BEGIN
            if (FOMENTO = 'SI') then
                MONTO = MONTO + VRCONSUMO;
            if ((CTADTO IS NULL) OR (CTADTO = '')) then
                MONTO = MONTO * FACTOR;
            execute procedure redondee(MONTO, DIG) returning_values (MONTO);
            if (MONTO <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTAVENTAS, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT F.ARTI_COD, (FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), FADE_CONSUMO
                        FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_DETALLE F
                        WHERE F.FACT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTAINV = :CUENTA AND FADE_REFERENCIA <> '.t'
                        INTO :ART, :MONTO, :IMPTOS
                    DO
                        BEGIN
                        if (FOMENTO = 'SI') then
                            MONTO = MONTO + IMPTOS;
                        if ((CTADTO IS NULL) OR (CTADTO = '')) then
                            MONTO = MONTO * FACTOR;
                        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                        if (MONTO <> 0) then
                            BEGIN
                            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                            NROI = NROI + 1;
                            SUMA = SUMA - MONTO;
                            END
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    NROI = NROI + 1;
                    SUMA = SUMA - MONTO;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA - MONTO;
                    END
                END /* MONTO <> 0 */
            END /* FOR */
        END /* VENTAS X ARTICULO */
     IF ((VENTAS = 'C') OR (VENTAS = 'K')) THEN
        BEGIN
        IF (VENTAS = 'C') THEN
            CTAVENTAS = TCTAVENTA;
        SELECT SUM(FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), SUM(FADE_IVAMONTO), SUM (FADE_CONSUMO)
            FROM FACTURAS_DETALLE F
            WHERE F.FACT_ID = :IDDOC AND FADE_REFERENCIA <> '.t'
            INTO :MONTO, :IMPTOS, :VRCONSUMO;
        if (FOMENTO = 'SI') then
            MONTO = MONTO + VRCONSUMO;
        if ((CTADTO IS NULL) OR (CTADTO = '')) then
            MONTO = MONTO * FACTOR;
        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
        if (MONTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTAVENTAS, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT F.ARTI_COD, (FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), FADE_CONSUMO
                    FROM ARTICULO A, FACTURAS_DETALLE F
                    WHERE F.FACT_ID = :IDDOC  AND FADE_REFERENCIA <> '.t'
                    INTO :ART, :MONTO, :IMPTOS
                    DO
                    BEGIN
                    if (FOMENTO = 'SI') then
                        MONTO = MONTO + VRCONSUMO;
                    if ((CTADTO IS NULL) OR (CTADTO = '')) then
                        MONTO = MONTO * FACTOR;
                    execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                    if (MONTO <> 0) then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        SUMA = SUMA - MONTO;
                        END
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - MONTO;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - MONTO;
                END
            END /* MONTO <> 0 */
        END /* VENTAS DE CLIENTE O CONSTANTE */
    /* EL IVA EN VENTAS */
    if (IVA = 'A') then
        BEGIN
        FOR SELECT MAX(COAR_CTAIVAV), SUM(FADE_IVAMONTO), SUM(FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), sum(FADE_CONSUMO)
            FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_DETALLE F
            WHERE F.FACT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND FADE_REFERENCIA <> '.t'
            GROUP BY COAR_CTAIVAV
            INTO :CTAIVA, :IMPTOS, :MONTO, :VALORADIC
        DO
            BEGIN
            if (FOMENTO = 'SI') then
                MONTO = MONTO + VALORADIC;
            MONTO = MONTO * -1;
            MONTO = MONTO * FACTOR;
            IMPTOS = IMPTOS * FACTOR;
            execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
            execute procedure redondee(MONTO, DIG) returning_values (MONTO);
            if (IMPTOS <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTAIVA, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT F.ARTI_COD, FADE_IVAMONTO, (FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), TAIV_PORC, FADE_CONSUMO
                        FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_DETALLE F, TARIFA_IVA T
                        WHERE F.FACT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTAIVAV = :CUENTA AND A.TAIV_COD = T.TAIV_COD AND FADE_REFERENCIA <> '.t'
                        INTO :ART, :IMPTOS, :MONTO, :PORCIVA, :VALORADIC
                    DO
                        BEGIN
                        if (FOMENTO = 'SI') then
                            MONTO = MONTO + VALORADIC;
                        MONTO = MONTO * -1;
                        MONTO = MONTO * FACTOR;
                        IMPTOS = IMPTOS * FACTOR;
                        execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                        if (IMPTOS <> 0) then
                            BEGIN
                            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, :MONTO, :PORCIVA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                            NROI = NROI + 1;
                            SUMA = SUMA + DEBITO - CREDITO;
                            END
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, :MONTO, ABS(:IMPTOS*100/:MONTO), :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    NROI = NROI + 1;
                    SUMA = SUMA - IMPTOS;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, :MONTO, ABS(:IMPTOS*100/:MONTO), :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA - IMPTOS;
                    END
                END   /* IMPTOS <> 0 */
            END /* FOR */
        END /* IVA X ARTICULO */
    if (IVA = 'K') then /* IVA EN CTA CONSTANTE */
        BEGIN
        SELECT SUM(FADE_IVAMONTO), SUM(FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), SUM(FADE_CONSUMO)
            FROM FACTURAS_DETALLE F
            WHERE F.FACT_ID = :IDDOC and FADE_IVAMONTO <> 0 AND FADE_REFERENCIA <> '.t'
            INTO :IMPTOS, :MONTO, :valoradic;
        if (FOMENTO = 'SI') then
            MONTO = MONTO + VALORADIC;
        MONTO = MONTO * -1;
        MONTO = MONTO * FACTOR;
        IMPTOS = IMPTOS * FACTOR;
        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
        execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
        if (IMPTOS <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTAIVA, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT F.ARTI_COD, (FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), FADE_IVAMONTO, TAIV_PORC, FADE_CONSUMO
                    FROM ARTICULO A, FACTURAS_DETALLE F, TARIFA_IVA T
                    WHERE F.FACT_ID = :IDDOC AND A.TAIV_COD = T.TAIV_COD AND FADE_REFERENCIA <> '.t'
                    INTO :ART, :MONTO, :IMPTOS, :PORCIVA, :VALORADIC
                    DO
                    BEGIN
                    if (FOMENTO = 'SI') then
                        MONTO = MONTO + VALORADIC;
                    MONTO = MONTO * -1;
                    MONTO = MONTO * FACTOR;
                    IMPTOS = IMPTOS * FACTOR;
                    execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                    execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                    if (IMPTOS <> 0) then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', 0, :IMPTOS, :MONTO, :PORCIVA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        SUMA = SUMA - IMPTOS;
                        END
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', 0, :IMPTOS, :MONTO, ABS(:IMPTOS*100/:MONTO), :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - IMPTOS;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', 0, :IMPTOS, :MONTO, ABS(:IMPTOS*100/:MONTO), :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - IMPTOS;
                END
            END /* IMPTOS <> 0 */
        END /* IVA EN CTA CONSTANTE */
    /* EL IMPOCONSUMO */
    if ((CONSUMO = 'A') AND (FOMENTO <> 'SI')) then
        BEGIN
        FOR SELECT MAX(COAR_CTACONS), SUM(FADE_CONSUMO)
            FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_DETALLE F
            WHERE F.FACT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND FADE_REFERENCIA <> '.t'
            GROUP BY COAR_CTACONS
            INTO :CTACONSUMO, :IMPTOS
        DO
            BEGIN
            execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
            if (IMPTOS <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTACONSUMO, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, REGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT F.ARTI_COD, FADE_CONSUMO
                        FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_DETALLE F
                        WHERE F.FACT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTACONS = :CUENTA AND FADE_REFERENCIA <> '.t'
                        INTO :ART, :IMPTOS
                    DO
                        BEGIN
                        execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                        if (IMPTOS <> 0) then
                            BEGIN
                            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                            NROI = NROI + 1;
                            SUMA = SUMA - IMPTOS;
                            END
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    NROI = NROI + 1;
                    SUMA = SUMA - IMPTOS;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA - IMPTOS;
                    END
                END /* IMPTOS <> 0 */
            END /* FOR */
        END /* CONSUMO X ARTICULO */
    if ((CONSUMO = 'K') AND (FOMENTO <> 'SI')) then /* CONSUMO EN CTA CONSTANTE */
        BEGIN
        SELECT SUM(FADE_CONSUMO)
            FROM FACTURAS_DETALLE F
            WHERE F.FACT_ID = :IDDOC  AND FADE_REFERENCIA <> '.t'
            INTO :IMPTOS;
        execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
        if (IMPTOS <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTACONSUMO, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT F.ARTI_COD, FADE_CONSUMO
                    FROM ARTICULO A, FACTURAS_DETALLE F
                    WHERE F.FACT_ID = :IDDOC  AND FADE_REFERENCIA <> '.t'
                    INTO :ART, :IMPTOS
                    DO
                    BEGIN
                    execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                    if (IMPTOS <> 0) then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CTACONSUMO, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        SUMA = SUMA - IMPTOS;
                        END
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTACONSUMO, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - IMPTOS;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTACONSUMO, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - IMPTOS;
                END
            END /* IMPTOS <> 0 */
        END /* CONSUMO EN CTA CONSTANTE */
    /* DESCUENTO */
    if ((CTADTO IS NOT NULL) AND (CTADTO <> '')) then
        BEGIN
        execute procedure redondee(VRDTO, DIG) returning_values (VRDTO);
        if (VRDTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTADTO, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRDTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA + VRDTO;
                END
            if (TIPOCUEN = 'N') then
                    BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRDTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA + VRDTO;
                END
            END
        END /* DESCUENTO */
    /* VALOR ADIC */
    if ((CTAADIC IS NOT NULL) AND (CTAADIC <> '')) then
        BEGIN
        execute procedure redondee(VRADIC, DIG) returning_values (VRADIC);
        if (VRADIC <> 0) THEN
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTAADIC, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRADIC, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - VRADIC;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRADIC, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - VRADIC;
                END
            END
        END /* VR. ADIC */
    /* VALOR EXTRA */
    if ((CTAEXTRA IS NOT NULL) AND (CTAEXTRA <> '')) THEN
        BEGIN
        execute procedure redondee(VREXTRA, DIG) returning_values (VREXTRA);
        if (VREXTRA <> 0) THEN
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTAEXTRA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VREXTRA, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - VREXTRA;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VREXTRA, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - VREXTRA;
                END
            END
        END /* VR. EXTRA */
    /* DESCUENTE EL IMPOCONSUMO */
    SELECT SUM(FADE_CONSUMO)
        FROM FACTURAS_DETALLE F WHERE F.FACT_ID = :IDDOC AND FADE_REFERENCIA <> '.t' INTO :IMPTOS;
    vrsubt = vrsubt - IMPTOS;
    /* RETENCION FUENTE */
    if ((RTFTE = 'C') or (RTFTE = 'K')) then
      BEGIN
      execute procedure redondee(VRRTFTE, DIG) returning_values (VRRTFTE);
      if (VRRTFTE <> 0) then
        BEGIN
        if (RTFTE = 'C') then
            CTARTFTE = TCTARTFTE;
        EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTARTFTE, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :VRSUBT, :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTFTE;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :VRSUBT, :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTFTE;
            END
        /* AUTORETENCION */
        if (FAUTORET <= fecaux) then
            BEGIN
            EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'CUENTA DE AUTORETENCION EN LA FUENTE') returning_values (CTARTFTE);
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTARTFTE INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERROR (31, :IDDOC, :CTARTFTE, 2);
                CUENTA = CTARTFTE;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                begin
                EXECUTE PROCEDURE ERROR (31, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, (:VRSUBT*-1), :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - VRRTFTE;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, (:VRSUBT*-1), :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - VRRTFTE;
                END
            END
        END /* RTFTE */
      END
    if (RTFTE = 'A') then
      BEGIN
      FOR SELECT MAX(COAR_CTARTFTEV), MAX(COAR_RTFTE), MIN(COAR_RTBASE), SUM(FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), SUM((FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO)*COAR_RTFTE)
        FROM CONTABIL_ARTICULO C, FACTURAS_DETALLE F
        WHERE F.FACT_ID = :IDDOC AND F.ARTI_COD = C.ARTI_COD AND FADE_REFERENCIA <> '.t'
        GROUP BY COAR_CTARTFTEV
        INTO :CTARTFTE, :PRTFTE, :baseadic, :MONTO, :VRRTFTE
        DO
        BEGIN
        MONTO = MONTO * FACTOR;
        if (MONTO >= BASEADIC) then
            BEGIN
            VRRTFTE = VRRTFTE * FACTOR / 100;
            execute procedure redondee(VRRTFTE, DIG) returning_values (VRRTFTE);
            execute procedure redondee(MONTO, DIG) returning_values (MONTO);
            if (VRRTFTE <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTARTFTE, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :MONTO, :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    NROI = NROI + 1;
                    SUMA = SUMA + VRRTFTE;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :MONTO, :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA + VRRTFTE;
                    END
                /* AUTORETENCION */
                if (FAUTORET <= fecaux) then
                    BEGIN
                    EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'CUENTA DE AUTORETENCION EN LA FUENTE') returning_values (CTARTFTE);
                    EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTARTFTE, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
                    if (ERRORC <> 0) then
                        ERROR = ERROR + 1;
                    if (TIPOCUEN = 'C') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, (:MONTO*-1), :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                        NROI = NROI + 1;
                        SUMA = SUMA - VRRTFTE;
                        END
                    if (TIPOCUEN = 'N') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, (:MONTO*-1), :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NROI = NROI + 1;
                        SUMA = SUMA - VRRTFTE;
                        END
                    END
                END
            END
        END /* RTFTE */
      END
    /* RETENCION IVA */
    if ((RTIVA = 'C') or (RTIVA = 'K')) then
      BEGIN
      execute procedure redondee(VRRTIVA, DIG) returning_values (VRRTIVA);
      if (VRRTIVA <> 0) then
        BEGIN
        if (RTIVA = 'C') then
            CTARTIVA = TCTARTIVA;
        EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTARTIVA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTIVA, 0, :VRIVA, :PORC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTIVA;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTIVA, 0, :VRIVA, :PORC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTIVA;
            END
        END /* RTIVA */
      END
    /* RETENCION DE ICA */
    if ((RTICA = 'C') or (RTICA = 'K')) then
      BEGIN
      execute procedure redondee(VRRTICA, DIG) returning_values (VRRTICA);
      if (VRRTICA <> 0) then
        BEGIN
        if (RTICA = 'C') then
            CTARTICA = TCTARTICA;
        EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTARTICA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTICA, 0, :VRSUBT, :PRTICA, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTICA;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTICA, 0, :VRSUBT, :PRTICA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTICA;
            END
        END /* RTICA */
      END
    /* CIERRE EL COMPROBANTE CONTRA LA CUENTA DEL TERCERO O LA CONSTANTE */
    if ((SUMA <> 0) and ((CARTERA = 'C') or (CARTERA = 'K') or (CARTERA = 'J'))) then
        BEGIN
        if (SUMA < 0) then
            BEGIN
            DEBITO = SUMA * -1;
            CREDITO = 0;
            END
        ELSE
            BEGIN
            DEBITO = 0;
            CREDITO = SUMA;
            END
        if (CARTERA = 'C') then
            CTACARTERA = TCTACLIEN;
        if (CARTERA = 'J') then
            BEGIN
            /* BUSQUE LA CUENTA DE LA CAJA */
            SELECT CAJA_CUENTA FROM CAJAS C, PUNTO_VENTA P
                WHERE P.CAJA_ID = C.CAJA_ID AND PTVT_ID = :PTOVTA
                INTO :CTACARTERA;
            END
        EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTACARTERA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :DEBITO, :CREDITO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
        if (TIPOCUEN = 'N') then
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :DEBITO, :CREDITO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
        NROI = NROI + 1;
        END /* SUMA EN CARTERA */
    /* CALCULE COSTOS EN VENTAS */
    EXECUTE PROCEDURE COSTO_EN_VENTAS(31, :IDDOC);
    if (COSTOS = 'A') then
        BEGIN
        FOR SELECT MAX(CTACOS), SUM(CAST(CANT AS DOUBLE PRECISION) * COSTO)
            FROM COSTO_VENTAS
            GROUP BY CTACOS
            INTO :CTACOSTOS, :MONTO
        DO
            BEGIN
            if (MONTO <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTACOSTOS, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT ARTI_COD, CANT * COSTO
                        FROM COSTO_VENTAS
                        WHERE CTACOS = :CUENTA
                        INTO :ART, :MONTO
                    DO
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    NROI = NROI + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    END
                END /* MONTO <> 0 */
            END /* FOR */
        END /* COSTOS */
    if (COSTOS = 'K') then
        BEGIN
        SELECT SUM(CAST(CANT AS DOUBLE PRECISION) * COSTO)
            FROM COSTO_VENTAS
            INTO :MONTO;
        if (MONTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTACOSTOS, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, REGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT ARTI_COD, CANT * COSTO
                    FROM COSTO_VENTAS
                    INTO :ART, :MONTO
                DO
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTACOSTOS, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                    NROI = NROI + 1;
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTACOSTOS, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTACOSTOS, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                END
            END /* MONTO <> 0 */
        END /* COSTOS = K */
    if (INVEN = 'A') then
        BEGIN
        FOR SELECT MAX(CTAINV), SUM(CAST(CANT AS DOUBLE PRECISION) * COSTO)
            FROM COSTO_VENTAS
            GROUP BY CTAINV
            INTO :CTAINVEN, :MONTO
        DO
            BEGIN
            if (MONTO <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTAINVEN, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, REGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT ARTI_COD, CANT * COSTO
                        FROM COSTO_VENTAS
                        WHERE CTAINV = :CUENTA
                        INTO :ART, :MONTO
                    DO
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    NROI = NROI + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    END
                END /* MONTO <> 0 */
            END /* FOR */
        END /* INVEN = A */
    if (INVEN = 'K') then
        BEGIN
        SELECT SUM(CAST(CANT AS DOUBLE PRECISION) * COSTO)
            FROM COSTO_VENTAS
            INTO :MONTO;
        if (MONTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTAINVEN, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT ARTI_COD, CANT * COSTO
                    FROM COSTO_VENTAS
                    INTO :ART, :MONTO
                DO
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTAINVEN, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                    NROI = NROI + 1;
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAINVEN, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAINVEN, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                END
            END /* MONTO <> 0 */
        END /* INVEN = K */
    /* recorra las cuentas adicionales */
    FOR SELECT INVC_CUENTA, INVC_BASE, INVC_PORC, INVC_VALOR, INVC_DB
        FROM INTERFAZ_VENTAS_CTAS
        WHERE INVE_ID = :IDINTER
        INTO :CTADIC, :BASEADIC, :PORCADIC, :VALORADIC, :DBADIC
        DO
        BEGIN
        if (VALORADIC <> 0) then
            MONTO = VALORADIC;
        ELSE
            BEGIN
            if (:BASEADIC = 'SUBTOTAL') then
                VALORADIC = vrsubt;
            if (:BASEADIC = 'DESCUENTO') then
                VALORADIC = VRDTO;
            if (:BASEADIC = 'IVA') then
                VALORADIC = VRIVA;
            if (:BASEADIC = 'ADICIONAL') then
                VALORADIC = VRADIC;
            if (:BASEADIC = 'EXTRA') then
                VALORADIC = VREXTRA;
            if (:BASEADIC = 'TOTAL') then
                VALORADIC = VRTOTAL;
            MONTO = VALORADIC * PORCADIC / 100;
            END
        if (MONTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTADIC, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                if (DBADIC = 'S') then
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                ELSE
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                if (DBADIC = 'S') then
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                ELSE
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                END
            NROI = NROI + 1;
            END
        END
    if (ERROR > 0) then
        VER = 'S';
    SUSPEND;
    END /* NO ANULADO */
  END /* EXISTE LA INTERFAZ */
ELSE
    BEGIN
    EXECUTE PROCEDURE ERROR (31, :IDDOC, :PREF, 1);
    ERROR = ERROR + 1;
    VER = 'S';
    SUSPEND;
    END
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE FACTURAS_SIN_CONTABILIDAD(
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    ID INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    ESTADO VARCHAR(20),
    IDI INTEGER,
    IDC INTEGER)
AS
DECLARE VARIABLE VER CHAR(2);
declare variable FECICNT VARCHAR(10);
declare variable FECFCNT VARCHAR(10);
declare variable ERROR INTEGER;
declare variable idref INTEGER;
BEGIN /*$$IBE$$ 
EXECUTE PROCEDURE fecha_a_conta(FECINI) returning_values (FECICNT);
EXECUTE PROCEDURE fecha_a_conta(FECFIN) returning_values (FECFCNT);
FOR SELECT FACT_ID, PREF_PRE, FACT_NUMERO FROM FACTURAS WHERE FACT_ANULADO = 'N' AND
    FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN INTO :ID, :PREF, :NUMERO
DO
  BEGIN
  idref = null;
  SELECT ENCO_IDREF FROM COMPROBANTE_ENCABEZADO WHERE ENCO_TIPOREF = 31 AND ENCO_FECHA >= :FECICNT AND ENCO_FECHA <= :FECFCNT and ENCO_IDREF = :ID into :idref;
  if (idref IS NULL) then
  begin
   ESTADO = 'PROCESANDO';
   ERROR = NULL;
   SUSPEND;
   SELECT MAX(INVE_ID) FROM INTERFAZ_VENTAS WHERE PREF_PRE = :PREF AND TIDO_COD = 31 INTO :IDI;
   EXECUTE PROCEDURE CONTABIL_FACTURA (:ID, :IDI) RETURNING_VALUES (:ERROR, VER, :IDC);
   if ((ERROR = 0) or (error IS NULL)) then
    BEGIN
    EXECUTE PROCEDURE CONTABILIZA_PENDIENTE (:IDC);
    ESTADO = 'OK';
    END
   ELSE
    ESTADO = 'ERROR';
   suspend;
  end
  END
 $$IBE$$*/ SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE FACTURAS_SIN_CONTABILIDAD(
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    ID INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    ESTADO VARCHAR(20),
    IDI INTEGER,
    IDC INTEGER)
AS
DECLARE VARIABLE VER CHAR(2);
declare variable FECICNT VARCHAR(10);
declare variable FECFCNT VARCHAR(10);
declare variable ERROR INTEGER;
declare variable idref INTEGER;
BEGIN
EXECUTE PROCEDURE fecha_a_conta(FECINI) returning_values (FECICNT);
EXECUTE PROCEDURE fecha_a_conta(FECFIN) returning_values (FECFCNT);
FOR SELECT FACT_ID, PREF_PRE, FACT_NUMERO FROM FACTURAS WHERE FACT_ANULADO = 'N' AND
    FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN INTO :ID, :PREF, :NUMERO
DO
  BEGIN
  idref = null;
  SELECT ENCO_IDREF FROM COMPROBANTE_ENCABEZADO WHERE ENCO_TIPOREF = 31 AND ENCO_FECHA >= :FECICNT AND ENCO_FECHA <= :FECFCNT and ENCO_IDREF = :ID into :idref;
  if (idref IS NULL) then
  begin
   ESTADO = 'PROCESANDO';
   ERROR = NULL;
   SUSPEND;
   SELECT MAX(INVE_ID) FROM INTERFAZ_VENTAS WHERE PREF_PRE = :PREF AND TIDO_COD = 31 INTO :IDI;
   EXECUTE PROCEDURE CONTABIL_FACTURA (:ID, :IDI) RETURNING_VALUES (:ERROR, VER, :IDC);
   if ((ERROR = 0) or (error IS NULL)) then
    BEGIN
    EXECUTE PROCEDURE CONTABILIZA_PENDIENTE (:IDC);
    ESTADO = 'OK';
    END
   ELSE
    ESTADO = 'ERROR';
   suspend;
  end
  END
END

^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER PROCEDURE CONTABIL_FACTURAS_CONTADO(
    FECFAC DATE,
    NIT VARCHAR(20),
    PREF VARCHAR(4),
    PTVTA INTEGER,
    IDINTER INTEGER)
RETURNS (
    ERROR INTEGER,
    VER CHAR(1),
    IDC INTEGER)
AS
declare variable num varchar(8);
declare variable numero varchar(10);
declare variable fecha char(8);
declare variable conc char(120);
declare variable vence char(8);
declare variable vrdto numeric(18,2);
declare variable vradic numeric(18,2);
declare variable vrsubt numeric(18,2);
declare variable vriva numeric(18,2);
declare variable prtfte numeric(9,2);
declare variable vrrtfte numeric(18,2);
declare variable vrrtiva numeric(18,2);
declare variable prtica numeric(9,2);
declare variable vrrtica numeric(18,2);
declare variable vrtotal numeric(18,2);
declare variable vrextra numeric(18,2);
declare variable tipocomp varchar(3);
declare variable prefcont varchar(4);
declare variable ventas char(1);
declare variable ctaventas varchar(20);
declare variable iva char(1);
declare variable ctaiva varchar(20);
declare variable consumo char(1);
declare variable ctaconsumo varchar(20);
declare variable cartera char(1);
declare variable ctacartera varchar(20);
declare variable rtfte char(1);
declare variable ctartfte varchar(20);
declare variable rtiva char(1);
declare variable ctartiva varchar(20);
declare variable rtica char(1);
declare variable ctartica varchar(20);
declare variable inven char(1);
declare variable ctainven varchar(20);
declare variable costos char(1);
declare variable ctacostos varchar(20);
declare variable ctadto varchar(20);
declare variable ctaadic varchar(20);
declare variable ctaextra varchar(20);
declare variable existe char(1);
declare variable cuenta varchar(20);
declare variable monto numeric(18,2);
declare variable tipocuen char(1);
declare variable nombre varchar(60);
declare variable proy varchar(4);
declare variable centro varchar(4);
declare variable porc numeric(5,2);
declare variable debito numeric(18,2);
declare variable credito numeric(18,2);
declare variable nroi integer;
declare variable art varchar(15);
declare variable impinc char(1);
declare variable imptos numeric(18,2);
declare variable suma numeric(18,2);
declare variable porciva numeric(9,2);
declare variable tctaclien varchar(20);
declare variable tctaventa varchar(20);
declare variable tctartfte varchar(20);
declare variable tctartiva varchar(20);
declare variable tctartica varchar(20);
declare variable ctadic varchar(20);
declare variable baseadic varchar(20);
declare variable porcadic numeric(5,2);
declare variable valoradic numeric(18,2);
declare variable dbadic char(1);
declare variable ptovta integer;
declare variable dig integer;
declare variable mercancia numeric(18,2);
declare variable factor double precision;
declare variable cent char(1);
BEGIN
/* BUSQUE LA INTERFACE */
EXISTE = 'N';
SELECT 'S', TICO_COD, PRCO_PRE, INVE_VENTAS, INVE_IVA, INVE_CONSUMO, INVE_CARTERA, INVE_RTFTE, INVE_RTIVA, INVE_RTICA, INVE_COSTO, INVE_INVEN, INVE_CTAVENTAS, INVE_CTAIVA, INVE_CTACONSUMO, INVE_CTADTO, INVE_CTAADIC, INVE_CTAEXTRA, INVE_CTACARTERA, INVE_CTARTFTE, INVE_CTARTIVA, INVE_CTARTICA, INVE_CTAINVEN, INVE_CTACOSTOS, INVE_CONFIRMAR, INVE_CENTRO
    FROM INTERFAZ_VENTAS
    WHERE INVE_ID = :IDINTER
    INTO :EXISTE, :TIPOCOMP, :PREFCONT, :VENTAS, :IVA, :CONSUMO, :CARTERA, :RTFTE, :RTIVA, :RTICA, :COSTOS, :INVEN, :CTAVENTAS, :CTAIVA, :CTACONSUMO, :CTADTO, :CTAADIC, :CTAEXTRA, :CTACARTERA, :CTARTFTE, :CTARTIVA, :CTARTICA, :CTAINVEN, :CTACOSTOS, :VER, :CENT;
if (EXISTE = 'S') then
  BEGIN
  /* BORRE CUALQUEIR CONTABILIZACION PREVIA */
/*  DELETE FROM CONTABILIZACION WHERE CNTB_TIPOREF = 31 AND CNTB_IDREF = 0;
  /* BUSQUE EL CENTRO DEL PUNTO, LA BODEGA, O EL PREFIJO  */
  IF (CENT = 'B') THEN
    SELECT B.BODE_CENTRO, B.BODE_PROY FROM BODEGA B, PUNTO_VENTA P
        WHERE B.BODE_COD = P.BODE_COD AND P.ptvt_id = :ptvta INTO :CENTRO, :PROY;
  IF (CENT = 'V') THEN
    SELECT MAX(V.CENT_COD), MAX(V.PROY_COD) FROM VENDEDORES V
        WHERE V.PTVT_ID = :PTVTA INTO :CENTRO, :PROY;
  IF (CENT = 'P') THEN
    SELECT P.PREF_PROY, P.PREF_CENTRO FROM PREFIJOS P
        WHERE P.PREF_PRE = :PREF AND P.TIDO_COD = 31 INTO :CENTRO, :PROY;
  /* TRAIGA LOS DATOS DEL CLIENTE */
  SELECT TERC_NOM, TERC_CTARTFTE, TERC_CTARTIVA, TERC_CTARTICA, TERC_CTAVENTA, TERC_CTACLIENTE
        FROM TERCEROS T WHERE TERC_NIT = :NIT
        INTO :NOMBRE, TCTARTFTE, TCTARTIVA, TCTARTICA, TCTAVENTA, TCTACLIEN;
  SELECT SUM(FACT_DTOMONTO), SUM(FACT_ADICIONAL), SUM(FACT_IVAMONTO), SUM(FACT_EXTRA), SUM(FACT_TOTAL), SUM(FACT_RTFTEMONTO), SUM(FACT_RTIVAMONTO), SUM(FACT_RTICAMONTO), MAX(FACT_IVAINC)
        FROM FACTURAS F WHERE FACT_FECHA = :FECFAC AND FACT_ANULADO = 'N' AND PTVT_ID = :ptvta AND PREF_PRE = :PREF
        INTO :VRDTO, :VRADIC, :VRIVA, :VREXTRA, :VRTOTAL, :VRRTFTE, :VRRTIVA, :VRRTICA, :impinc;
  VRSUBT = VRTOTAL - VREXTRA - VRIVA; /* BASE DE RETEFTE Y RETEICA */
  MERCANCIA = VRSUBT - VRADIC + VRDTO;
  EXECUTE PROCEDURE FECHA_A_CONTA(:FECFAC) returning_values (:FECHA);
  VENCE = FECHA;
  /* REGISTRE EL ENCABEZADO CONTABLE */
  IDC = GEN_ID(ID_CONTABILIZA, 1);
  CONC = 'RESUMEN VENTAS ' || FECHA;
  NUM = SUBSTR(FECHA, 3, 8);
  INSERT INTO CONTABILIZACION (CNTB_ID, CNTB_TIPOCOMP, CNTB_PREFCNT, CNTB_NUMERO, CNTB_FECHA, CNTB_CONCEPTO, CNTB_REF, CNTB_TIPOREF, CNTB_IDREF, CNTB_PREFREF, CNTB_NUMREF, CNTB_PROCESADO)
        VALUES (:IDC, :TIPOCOMP, :PREFCONT, :NUM, :FECHA, :CONC, '', 0, 0, :PREF, :NUM, 'N');
  NROI = 0;
  SUMA = 0;
  ERROR = 0;
  /* SI NO HAY CUENTA DE DESCUENTO NI ADICIONAL CALCULE UN FACTOR PARA LAS VENTAS Y EL IVA */
  if (MERCANCIA <> 0) then
    FACTOR = CAST(VRSUBT AS DOUBLE PRECISION) / CAST(MERCANCIA AS DOUBLE PRECISION);
  ELSE
    FACTOR = 1;
  /* TRAIGA EL NUMERO DE DIGITOS PARA EL REDONDEO */
  SELECT CAST(CONF_VALOR AS INTEGER) FROM CONFIGURACION WHERE CONF_MODULO = 'FACTURACION' AND
        CONF_CATEGORIA = 'GENERAL' AND CONF_PROPIEDAD = 'REDONDEO AL MULTIPLO DE DIEZ EN TOTALES' INTO :DIG;
  /* CUENTAS DE VENTAS */
  if (VENTAS = 'A') then
        BEGIN
        FOR SELECT MAX(COAR_CTAVNT), SUM(CAST(FADE_CANT AS DOUBLE PRECISION) * (FADE_PRUNIT-FADE_DTOMONTO)), SUM(FADE_IVAMONTO+FADE_CONSUMO)
            FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_DETALLE FD, FACTURAS F
            WHERE F.FACT_ID = FD.FACT_ID AND FACT_FECHA = :FECFAC AND FD.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND F.PREF_PRE = :PREF AND F.PTVT_ID = :PTVTA AND FACT_ANULADO = 'N' AND FADE_REFERENCIA <> '.t'
            GROUP BY COAR_CTAVNT
            INTO :CTAVENTAS, :MONTO, :IMPTOS
            DO
            BEGIN
            if (IMPINC = 'S') then
                MONTO = MONTO - IMPTOS;
            if ((CTADTO IS NULL) OR (CTADTO = '')) then
                MONTO = MONTO * FACTOR;
            execute procedure redondee(MONTO, DIG) returning_values (MONTO);
            if (MONTO <> 0) then
                BEGIN
                CUENTA = NULL;
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :CTAVENTAS INTO :CUENTA, :TIPOCUEN;
                if (CUENTA IS NULL) then
                    begin
                    EXECUTE PROCEDURE ERROR (31, 0, :CTAVENTAS, 2);
                    CUENTA = CTAVENTAS;
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT FD.ARTI_COD, (CAST(FADE_CANT AS DOUBLE PRECISION) * (FADE_PRUNIT-FADE_DTOMONTO)), (FADE_IVAMONTO+FADE_CONSUMO)
                        FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_DETALLE FD, FACTURAS F
                        WHERE F.FACT_ID = FD.FACT_ID AND FACT_FECHA = :FECFAC AND F.PREF_PRE = :PREF AND F.PTVT_ID = :PTVTA AND FD.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTAINV = :CUENTA AND FACT_ANULADO = 'N' AND FADE_REFERENCIA <> '.t'
                        INTO :ART, :MONTO, :IMPTOS
                    DO
                        BEGIN
                        if (IMPINC = 'S') then
                            MONTO = MONTO - IMPTOS;
                        if ((CTADTO IS NULL) OR (CTADTO = '')) then
                            MONTO = MONTO * FACTOR;
                        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                        if (MONTO <> 0) then
                            BEGIN
                            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                            NROI = NROI + 1;
                            SUMA = SUMA - MONTO;
                            END
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    NROI = NROI + 1;
                    SUMA = SUMA - MONTO;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA - MONTO;
                    END
                END /* MONTO <> 0 */
            END /* FOR */
        END /* VENTAS X ARTICULO */
     IF ((VENTAS = 'C') OR (VENTAS = 'K')) THEN
        BEGIN
        IF (VENTAS = 'C') THEN
            CTAVENTAS = TCTAVENTA;
        SELECT SUM(CAST(FADE_CANT AS DOUBLE PRECISION) * (FADE_PRUNIT-FADE_DTOMONTO)), SUM(FADE_IVAMONTO+FADE_CONSUMO)
            FROM FACTURAS_DETALLE FD, FACTURAS F
            WHERE F.FACT_ID = FD.FACT_ID AND FACT_FECHA = :FECFAC AND F.PREF_PRE = :PREF AND F.PTVT_ID = :PTVTA AND FACT_ANULADO = 'N' AND FADE_REFERENCIA <> '.t'
            INTO :MONTO, :IMPTOS;
        if (IMPINC = 'S') then
            MONTO = MONTO - IMPTOS;
        if ((CTADTO IS NULL) OR (CTADTO = '')) then
            MONTO = MONTO * FACTOR;
        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
        if (MONTO <> 0) then
            BEGIN
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTAVENTAS INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERROR (31, 0, :CTAVENTAS, 2);
                CUENTA = CTAVENTAS;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT FD.ARTI_COD, (CAST(FADE_CANT AS DOUBLE PRECISION) * (FADE_PRUNIT-FADE_DTOMONTO)), (FADE_IVAMONTO+FADE_CONSUMO)
                    FROM /*ARTICULO A,*/ FACTURAS_DETALLE FD, FACTURAS F
                    WHERE F.FACT_ID = FD.FACT_ID AND FACT_FECHA = :FECFAC AND F.PREF_PRE = :PREF AND F.PTVT_ID = :PTVTA AND FACT_ANULADO = 'N' AND FADE_REFERENCIA <> '.t'
                    INTO :ART, :MONTO, :IMPTOS
                    DO
                    BEGIN
                    if (IMPINC = 'S') then
                        MONTO = MONTO - IMPTOS;
                    if ((CTADTO IS NULL) OR (CTADTO = '')) then
                        MONTO = MONTO * FACTOR;
                    execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                    if (MONTO <> 0) then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        SUMA = SUMA - MONTO;
                        END
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - MONTO;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - MONTO;
                END
            END /* MONTO <> 0 */
        END /* VENTAS DE CLIENTE O CONSTANTE */
    /* EL IVA EN VENTAS */
    if (IVA = 'A') then
        BEGIN
        FOR SELECT MAX(COAR_CTAIVAV), SUM(FADE_IVAMONTO), SUM(CAST(FADE_CANT AS DOUBLE PRECISION) * (FADE_PRUNIT-FADE_DTOMONTO)), sum(FADE_CONSUMO)
            FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_DETALLE FD, FACTURAS F
            WHERE F.FACT_ID = FD.FACT_ID AND FACT_FECHA = :FECFAC AND F.PREF_PRE = :PREF AND F.PTVT_ID = :PTVTA AND FD.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND FACT_ANULADO = 'N' AND FADE_REFERENCIA <> '.t'
            GROUP BY COAR_CTAIVAV
            INTO :CTAIVA, :IMPTOS, :MONTO, :VALORADIC
        DO
            BEGIN
            if (IMPINC = 'S') then
                MONTO = MONTO - IMPTOS - VALORADIC;
            MONTO = MONTO * -1;
            MONTO = MONTO * FACTOR;
            IMPTOS = IMPTOS * FACTOR;
            execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
            execute procedure redondee(MONTO, DIG) returning_values (MONTO);
            if (IMPTOS <> 0) then
                BEGIN
                CUENTA = NULL;
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :CTAIVA INTO :CUENTA, :TIPOCUEN;
                if (CUENTA IS NULL) then
                    begin
                    EXECUTE PROCEDURE ERROR (31, 0, :CTAIVA, 2);
                    CUENTA = CTAIVA;
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT FD.ARTI_COD, FADE_IVAMONTO, (CAST(FADE_CANT AS DOUBLE PRECISION) * (FADE_PRUNIT-FADE_DTOMONTO)), TAIV_PORC, FADE_CONSUMO
                        FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_DETALLE FD, FACTURAS F, TARIFA_IVA T
                        WHERE F.FACT_ID = FD.FACT_ID AND FACT_FECHA = :FECFAC AND F.PREF_PRE = :PREF AND F.PTVT_ID = :PTVTA AND FD.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTAIVAV = :CUENTA AND A.TAIV_COD = T.TAIV_COD AND FACT_ANULADO = 'N' AND FADE_REFERENCIA <> '.t'
                        INTO :ART, :IMPTOS, :MONTO, :PORCIVA, :VALORADIC
                    DO
                        BEGIN
                        if (IMPINC = 'S') then
                            MONTO = MONTO - IMPTOS - VALORADIC;
                        MONTO = MONTO * -1;
                        MONTO = MONTO * FACTOR;
                        IMPTOS = IMPTOS * FACTOR;
                        execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                        if (IMPTOS <> 0) then
                            BEGIN
                            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, :MONTO, :PORCIVA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                            NROI = NROI + 1;
                            SUMA = SUMA + DEBITO - CREDITO;
                            END
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, :MONTO, ABS(:IMPTOS*100/:MONTO), :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    NROI = NROI + 1;
                    SUMA = SUMA - IMPTOS;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, :MONTO, ABS(:IMPTOS*100/:MONTO), :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA - IMPTOS;
                    END
                END   /* IMPTOS <> 0 */
            END /* FOR */
        END /* IVA X ARTICULO */
    if (IVA = 'K') then /* IVA EN CTA CONSTANTE */
        BEGIN
        SELECT SUM(FADE_IVAMONTO), SUM(CAST(FADE_CANT AS DOUBLE PRECISION) * (FADE_PRUNIT-FADE_DTOMONTO)), SUM(FADE_CONSUMO)
            FROM FACTURAS_DETALLE FD, FACTURAS F
            WHERE F.FACT_ID = FD.FACT_ID AND FACT_FECHA = :FECFAC AND F.PREF_PRE = :PREF AND F.PTVT_ID = :PTVTA AND FACT_ANULADO = 'N' AND FADE_REFERENCIA <> '.t'
            INTO :IMPTOS, :MONTO, :valoradic;
        if (IMPINC = 'S') then
            MONTO = MONTO - IMPTOS - VALORADIC;
        MONTO = MONTO * -1;
        MONTO = MONTO * FACTOR;
        IMPTOS = IMPTOS * FACTOR;
        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
        execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
        if (IMPTOS <> 0) then
            BEGIN
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTAIVA INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERROR (31, 0, :CTAIVA, 2);
                CUENTA = CTAIVA;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT FD.ARTI_COD, (CAST(FADE_CANT AS DOUBLE PRECISION) * (FADE_PRUNIT-FADE_DTOMONTO)), FADE_IVAMONTO, TAIV_PORC, FADE_CONSUMO
                    FROM ARTICULO A, FACTURAS_DETALLE FD, FACTURAS F, TARIFA_IVA T
                    WHERE F.FACT_ID = FD.FACT_ID AND FACT_FECHA = :FECFAC AND F.PREF_PRE = :PREF AND F.PTVT_ID = :PTVTA AND FD.arti_cod = A.arti_cod AND T.TAIV_COD=A.TAIV_COD AND FACT_ANULADO = 'N' AND FADE_REFERENCIA <> '.t'
                    INTO :ART, :MONTO, :IMPTOS, :PORCIVA, :VALORADIC
                    DO
                    BEGIN
                    if (IMPINC = 'S') then
                        MONTO = MONTO - IMPTOS - VALORADIC;
                    MONTO = MONTO * -1;
                    MONTO = MONTO * FACTOR;
                    IMPTOS = IMPTOS * FACTOR;
                    execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                    execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                    if (IMPTOS <> 0) then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', 0, :IMPTOS, :MONTO, :PORCIVA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        SUMA = SUMA - IMPTOS;
                        END
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', 0, :IMPTOS, :MONTO, ABS(:IMPTOS*100/:MONTO), :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - IMPTOS;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', 0, :IMPTOS, :MONTO, ABS(:IMPTOS*100/:MONTO), :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - IMPTOS;
                END
            END /* IMPTOS <> 0 */
        END /* IVA EN CTA CONSTANTE */
    /* EL IMPOCONSUMO */
    if (CONSUMO = 'A') then
        BEGIN
        FOR SELECT MAX(COAR_CTACONS), SUM(FADE_CONSUMO)
            FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_DETALLE FD, FACTURAS F
            WHERE F.FACT_ID = FD.FACT_ID AND FACT_FECHA = :FECFAC AND F.PREF_PRE = :PREF AND F.PTVT_ID = :PTVTA AND FD.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND FACT_ANULADO = 'N' AND FADE_REFERENCIA <> '.t'
            GROUP BY COAR_CTACONS
            INTO :CTACONSUMO, :IMPTOS
        DO
            BEGIN
            execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
            if (IMPTOS <> 0) then
                BEGIN
                CUENTA = NULL;
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :CTACONSUMO INTO :CUENTA, :TIPOCUEN;
                if (CUENTA IS NULL) then
                    begin
                    EXECUTE PROCEDURE ERROR (31, 0, :CTACONSUMO, 2);
                    CUENTA = CTACONSUMO;
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, REGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT FD.ARTI_COD, FADE_CONSUMO
                        FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_DETALLE FD, FACTURAS F
                        WHERE F.FACT_ID = FD.FACT_ID AND FACT_FECHA = :FECFAC AND F.PREF_PRE = :PREF AND F.PTVT_ID = :PTVTA AND FD.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTACONS = :CUENTA AND FACT_ANULADO = 'N' AND FADE_REFERENCIA <> '.t'
                        INTO :ART, :IMPTOS
                    DO
                        BEGIN
                        execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                        if (IMPTOS <> 0) then
                            BEGIN
                            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                            NROI = NROI + 1;
                            SUMA = SUMA - IMPTOS;
                            END
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    NROI = NROI + 1;
                    SUMA = SUMA - IMPTOS;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA - CREDITO;
                    END
                END /* IMPTOS <> 0 */
            END /* FOR */
        END /* CONSUMO X ARTICULO */
    if (CONSUMO = 'K') then /* CONSUMO EN CTA CONSTANTE */
        BEGIN
        SELECT SUM(FADE_CONSUMO)
            FROM FACTURAS_DETALLE FD, FACTURAS F
            WHERE F.FACT_ID = FD.FACT_ID AND FACT_FECHA = :FECFAC AND F.PREF_PRE = :PREF AND F.PTVT_ID = :PTVTA AND FACT_ANULADO = 'N' AND FADE_REFERENCIA <> '.t'
            INTO :IMPTOS;
        execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
        if (IMPTOS <> 0) then
            BEGIN
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTACONSUMO INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERROR (31, 0, :CTACONSUMO, 2);
                CUENTA = CTACONSUMO;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT FD.ARTI_COD, FADE_CONSUMO
                    FROM /*ARTICULO A,*/ FACTURAS_DETALLE FD, FACTURAS F
                    WHERE F.FACT_ID = FD.FACT_ID AND FACT_FECHA = :FECFAC AND F.PREF_PRE = :PREF AND F.PTVT_ID = :PTVTA AND FACT_ANULADO = 'N' AND FADE_REFERENCIA <> '.t'
                    INTO :ART, :IMPTOS
                    DO
                    BEGIN
                    execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                    if (IMPTOS <> 0) then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CTACONSUMO, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        SUMA = SUMA - IMPTOS;
                        END
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTACONSUMO, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - IMPTOS;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTACONSUMO, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - IMPTOS;
                END
            END /* IMPTOS <> 0 */
        END /* CONSUMO EN CTA CONSTANTE */
    /* DESCUENTO */
    if ((CTADTO IS NOT NULL) AND (CTADTO <> '')) then
        BEGIN
        execute procedure redondee(VRDTO, DIG) returning_values (VRDTO);
        if (VRDTO <> 0) then
            BEGIN
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTADTO INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERROR (31, 0, :CTADTO, 2);
                CUENTA = CTADTO;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                begin
                EXECUTE PROCEDURE ERROR (31, 0, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRDTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA + VRDTO;
                END
            if (TIPOCUEN = 'N') then
                    BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRDTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA + VRDTO;
                END
            END
        END /* DESCUENTO */
    /* VALOR ADIC */
    if ((CTAADIC IS NOT NULL) AND (CTAADIC <> '')) then
        BEGIN
        execute procedure redondee(VRADIC, DIG) returning_values (VRADIC);
        if (VRADIC <> 0) THEN
            BEGIN
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTAADIC INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERROR (31, 0, :CTAADIC, 2);
                CUENTA = CTAADIC;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                begin
                EXECUTE PROCEDURE ERROR (31, 0, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRADIC, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - VRADIC;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRADIC, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - VRADIC;
                END
            END
        END /* VR. ADIC */
    /* VALOR EXTRA */
    if ((CTAEXTRA IS NOT NULL) AND (CTAEXTRA <> '')) THEN
        BEGIN
        execute procedure redondee(VREXTRA, DIG) returning_values (VREXTRA);
        if (VREXTRA <> 0) THEN
            BEGIN
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTAEXTRA INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERROR (31, 0, :CTAEXTRA, 2);
                CUENTA = CTAEXTRA;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                begin
                EXECUTE PROCEDURE ERROR (31, 0, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VREXTRA, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - VREXTRA;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VREXTRA, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - VREXTRA;
                END
            END
        END /* VR. EXTRA */
    /* RETENCION FUENTE */
    if ((RTFTE = 'C') or (RTFTE = 'K')) then
      BEGIN
      execute procedure redondee(VRRTFTE, DIG) returning_values (VRRTFTE);
      if (VRRTFTE <> 0) then
        BEGIN
        if (RTFTE = 'C') then
            CTARTFTE = TCTARTFTE;
        CUENTA = NULL;
        SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
            WHERE CUEN_COD = :CTARTFTE INTO :CUENTA, :TIPOCUEN;
        if (CUENTA IS NULL) then
            begin
            EXECUTE PROCEDURE ERROR (31, 0, :CTARTFTE, 2);
            CUENTA = CTARTFTE;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            begin
            EXECUTE PROCEDURE ERROR (31, 0, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :VRSUBT, :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTFTE;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :VRSUBT, :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTFTE;
            END
        END /* RTFTE */
      END
    /* RETENCION IVA */
    if ((RTIVA = 'C') or (RTIVA = 'K')) then
      BEGIN
      execute procedure redondee(VRRTIVA, DIG) returning_values (VRRTIVA);
      if (VRRTIVA <> 0) then
        BEGIN
        if (RTIVA = 'C') then
            CTARTIVA = TCTARTIVA;
        CUENTA = NULL;
        SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
            WHERE CUEN_COD = :CTARTIVA INTO :CUENTA, :TIPOCUEN;
        if (CUENTA IS NULL) then
            begin
            EXECUTE PROCEDURE ERROR (31, 0, :CTARTIVA, 2);
            CUENTA = CTARTIVA;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            begin
            EXECUTE PROCEDURE ERROR (31, 0, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTIVA, 0, :VRIVA, :PORC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTIVA;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTIVA, 0, :VRIVA, :PORC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTIVA;
            END
        END /* RTIVA */
      END
    /* RETENCION DE ICA */
    if ((RTICA = 'C') or (RTICA = 'K')) then
      BEGIN
      execute procedure redondee(VRRTICA, DIG) returning_values (VRRTICA);
      if (VRRTICA <> 0) then
        BEGIN
        if (RTICA = 'C') then
            CTARTICA = TCTARTICA;
        CUENTA = NULL;
        SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
            WHERE CUEN_COD = :CTARTICA INTO :CUENTA, :TIPOCUEN;
        if (CUENTA IS NULL) then
            begin
            EXECUTE PROCEDURE ERROR (31, 0, :CTARTICA, 2);
            CUENTA = CTARTICA;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            begin
            EXECUTE PROCEDURE ERROR (31, 0, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTICA, 0, :VRSUBT, :PRTICA, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTICA;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTICA, 0, :VRSUBT, :PRTICA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTICA;
            END
        END /* RTICA */
      END
    /* CIERRE EL COMPROBANTE CONTRA LA CUENTA DEL TERCERO O LA CONSTANTE */
    if ((SUMA <> 0) and ((CARTERA = 'C') or (CARTERA = 'K') or (CARTERA = 'J'))) then
        BEGIN
        if (SUMA < 0) then
            BEGIN
            DEBITO = SUMA * -1;
            CREDITO = 0;
            END
        ELSE
            BEGIN
            DEBITO = 0;
            CREDITO = SUMA;
            END
        if (CARTERA = 'C') then
            CTACARTERA = TCTACLIEN;
        if (CARTERA = 'J') then
            BEGIN
            /* BUSQUE LA CUENTA DE LA CAJA */
            SELECT CAJA_CUENTA FROM CAJAS C, PUNTO_VENTA P
                WHERE P.CAJA_ID = C.CAJA_ID AND PTVT_ID = :PTOVTA
                INTO :CTACARTERA;
            END
        CUENTA = NULL;
        SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
            WHERE CUEN_COD = :CTACARTERA INTO :CUENTA, :TIPOCUEN;
        if (CUENTA IS NULL) then
            begin
            EXECUTE PROCEDURE ERROR (31, 0, :CTACARTERA, 2);
            CUENTA = CTACARTERA;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            begin
            EXECUTE PROCEDURE ERROR (31, 0, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'C') then
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :DEBITO, :CREDITO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
        if (TIPOCUEN = 'N') then
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :DEBITO, :CREDITO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
        NROI = NROI + 1;
        END /* SUMA EN CARTERA */
    /* CALCULE LOS COSTOS */
    EXECUTE PROCEDURE costo_en_ventas_contado(:fecfac,  :pref, :ptvta);
    if (COSTOS = 'A') then
        BEGIN
        FOR SELECT MAX(CTACOS), SUM(COSTO)
            FROM COSTO_VENTAS
            GROUP BY CTACOS
            INTO :CTACOSTOS, :MONTO
        DO
            BEGIN
            if (MONTO <> 0) then
                BEGIN
                CUENTA = NULL;
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :CTACOSTOS INTO :CUENTA, :TIPOCUEN;
                IF (CUENTA IS NULL) THEN
                    begin
                    EXECUTE PROCEDURE ERROR (31, 0, :CTACOSTOS, 2);
                    CUENTA = CTARTFTE;
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT ARTI_COD, CANT * COSTO
                        FROM COSTO_VENTAS
                        WHERE CTACOS = :CUENTA
                        INTO :ART, :MONTO
                    DO
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    NROI = NROI + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    END
                END /* MONTO <> 0 */
            END /* FOR */
        END /* COSTOS */
    if (COSTOS = 'K') then
        BEGIN
        SELECT SUM(COSTO)
            FROM COSTO_VENTAS
            INTO :MONTO;
        if (MONTO <> 0) then
            BEGIN
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTACOSTOS INTO :CUENTA, :TIPOCUEN;
            IF (CUENTA IS NULL) THEN
                begin
                EXECUTE PROCEDURE ERROR (31, 0, :CTACOSTOS, 2);
                CUENTA = CTARTFTE;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, REGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT ARTI_COD, CANT * COSTO
                    FROM COSTO_VENTAS
                    INTO :ART, :MONTO
                DO
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTACOSTOS, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                    NROI = NROI + 1;
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTACOSTOS, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTACOSTOS, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                END
            END /* MONTO <> 0 */
        END /* COSTOS = K */
    if (INVEN = 'A') then
        BEGIN
        FOR SELECT MAX(CTAINV), SUM(COSTO)
            FROM COSTO_VENTAS
            GROUP BY CTAINV
            INTO :CTAINVEN, :MONTO
        DO
            BEGIN
            if (MONTO <> 0) then
                BEGIN
                CUENTA = NULL;
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :CTAINVEN INTO :CUENTA, :TIPOCUEN;
                IF (CUENTA IS NULL) THEN
                    begin
                    EXECUTE PROCEDURE ERROR (31, 0, :CTAINVEN, 2);
                    CUENTA = CTAINVEN;
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, REGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT ARTI_COD, CANT * COSTO
                        FROM COSTO_VENTAS
                        WHERE CTAINV = :CUENTA
                        INTO :ART, :MONTO
                    DO
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    NROI = NROI + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    END
                END /* MONTO <> 0 */
            END /* FOR */
        END /* INVEN = A */
    if (INVEN = 'K') then
        BEGIN
        SELECT SUM(COSTO)
            FROM COSTO_VENTAS
            INTO :MONTO;
        if (MONTO <> 0) then
            BEGIN
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTAINVEN INTO :CUENTA, :TIPOCUEN;
            IF (CUENTA IS NULL) THEN
                begin
                EXECUTE PROCEDURE ERROR (31, 0, :CTAINVEN, 2);
                CUENTA = CTAINVEN;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT ARTI_COD, CANT * COSTO
                    FROM COSTO_VENTAS
                    INTO :ART, :MONTO
                DO
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTAINVEN, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                    NROI = NROI + 1;
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAINVEN, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAINVEN, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                END
            END /* MONTO <> 0 */
        END /* INVEN = K */
    /* recorra las cuentas adicionales */
    FOR SELECT INVC_CUENTA, INVC_BASE, INVC_PORC, INVC_VALOR, INVC_DB
        FROM INTERFAZ_VENTAS_CTAS
        WHERE INVE_ID = :IDINTER
        INTO :CTADIC, :BASEADIC, :PORCADIC, :VALORADIC, :DBADIC
        DO
        BEGIN
        if (VALORADIC <> 0) then
            MONTO = VALORADIC;
        ELSE
            BEGIN
            if (:BASEADIC = 'SUBTOTAL') then
                VALORADIC = vrsubt;
            if (:BASEADIC = 'DESCUENTO') then
                VALORADIC = VRDTO;
            if (:BASEADIC = 'IVA') then
                VALORADIC = VRIVA;
            if (:BASEADIC = 'ADICIONAL') then
                VALORADIC = VRADIC;
            if (:BASEADIC = 'EXTRA') then
                VALORADIC = VREXTRA;
            if (:BASEADIC = 'TOTAL') then
                VALORADIC = VRTOTAL;
            MONTO = VALORADIC * PORCADIC / 100;
            END
        if (MONTO <> 0) then
            BEGIN
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTADIC INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERROR (31, 0, :CTADIC, 2);
                CUENTA = CTADIC;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                begin
                EXECUTE PROCEDURE ERROR (31, 0, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'C') then
                BEGIN
                if (DBADIC = 'S') then
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                ELSE
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                if (DBADIC = 'S') then
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                ELSE
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                END
            NROI = NROI + 1;
            END
        END
    if (ERROR > 0) then
        VER = 'S';
    SUSPEND;
    END /* EXISTE LA INTERFAZ */
ELSE
    BEGIN
    EXECUTE PROCEDURE ERROR (31, 0, :PREF, 1);
    ERROR = ERROR + 1;
    VER = 'S';
    SUSPEND;
    END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER PROCEDURE COSTO_EN_VENTAS(
    TIPO INTEGER,
    ID INTEGER)
AS
declare variable FECHA DATE;
declare variable ARTICULO VARCHAR(20);
declare variable CANTIDAD NUMERIC(18,4);
declare variable COSTO NUMERIC(18,2);
declare variable CTACOSTO VARCHAR(20);
declare variable CTAINVEN VARCHAR(20);
BEGIN
DELETE FROM COSTO_VENTAS;
if (TIPO = 31) then
    BEGIN
    /* FACTURA DE VENTA */
    FOR SELECT D.ARTI_COD, FADE_CANT * FADE_FACTOR, COAR_CTACOS, COAR_CTAINV, FACT_FECHA
        FROM ARTICULO A, FACTURAS F, FACTURAS_DETALLE D, CONTABIL_ARTICULO C
        WHERE F.FACT_ID = D.FACT_ID AND A.ARTI_COD = D.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND F.FACT_ID = :ID AND FACT_ANULADO = 'N' and substring(a.arti_cod from 1 FOR 2) <> '.t'
        INTO :ARTICULO, :CANTIDAD, :CTACOSTO, :CTAINVEN, :FECHA
        DO
        BEGIN
        EXECUTE PROCEDURE COSTO_PROMEDIO(:ARTICULO, :FECHA) returning_values (:COSTO);
        INSERT INTO COSTO_VENTAS VALUES (:ARTICULO, :CANTIDAD, :COSTO, :CTACOSTO, :CTAINVEN);
        END
    END
if (TIPO = 32) then
    BEGIN
    /* REMISION */
    FOR SELECT D.ARTI_COD, RVDE_CANT * RVDE_FACTOR, COAR_CTACOS, COAR_CTAINV, REVT_FECHA
        FROM ARTICULO A, REMISIONES_VENTA R, REMISIONES_VENTA_DETALLE D, CONTABIL_ARTICULO C
        WHERE R.REVT_ID = D.REVT_ID AND A.ARTI_COD = D.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND R.REVT_ID = :ID AND REVT_ANULADO = 'N'
        INTO :ARTICULO, :CANTIDAD, :CTACOSTO, :CTAINVEN, :FECHA
        DO
        BEGIN
        EXECUTE PROCEDURE COSTO_PROMEDIO(:ARTICULO, :FECHA) returning_values (:COSTO);
        INSERT INTO COSTO_VENTAS VALUES (:ARTICULO, :CANTIDAD, :COSTO, :CTACOSTO, :CTAINVEN);
        END
    END
if (TIPO = 33) then
    BEGIN
    /* DEVOLUCION */
    FOR SELECT D.ARTI_COD, DVDE_CANT * DVDE_FACTOR, COAR_CTACOS, COAR_CTAINV, DEVT_FECHA
        FROM ARTICULO A, DEVOLUCIONES_VENTAS DV, DEVOLUCIONES_VENTAS_DETALLE D, CONTABIL_ARTICULO C
        WHERE DV.DEVT_ID = D.DEVT_ID AND A.ARTI_COD = D.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND DV.DEVT_ID = :ID AND DEVT_ANULADO = 'N' and substring(a.arti_cod from 1 FOR 2) <> '.t'
        INTO :ARTICULO, :CANTIDAD, :CTACOSTO, :CTAINVEN, :FECHA
        DO
        BEGIN
        EXECUTE PROCEDURE COSTO_PROMEDIO(:ARTICULO, :FECHA) returning_values (:COSTO);
        INSERT INTO COSTO_VENTAS VALUES (:ARTICULO, :CANTIDAD, :COSTO, :CTACOSTO, :CTAINVEN);
        END
    END
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE CONTABILICE_COSTO_VENTAS(
    ID INTEGER,
    IDINTER INTEGER)
RETURNS (
    IDC INTEGER)
AS
declare variable PREF VARCHAR(4);
declare variable NUM VARCHAR(6);
declare variable NUMERO VARCHAR(10);
declare variable INVEN CHAR(1);
declare variable CTAINVEN VARCHAR(20);
declare variable COSTOS CHAR(1);
declare variable CTACOSTOS VARCHAR(20);
declare variable EXISTE CHAR(1);
declare variable CUENTA VARCHAR(20);
declare variable MONTO NUMERIC(18,2);
declare variable TIPOCUEN CHAR(1);
declare variable NIT VARCHAR(20);
declare variable PROY VARCHAR(4);
declare variable CENTRO VARCHAR(4);
declare variable ART VARCHAR(15);
declare variable ANULADO CHAR(1);
declare variable NROI INTEGER;
declare variable NUMROWS INTEGER;
declare variable CONC CHAR(120);
declare variable VENCEAUX DATE;
declare variable VENCE CHAR(8);
begin
/* TRAIGA EL ID DEL ENCABEZADO DEL COMPROBANTE CONTABLE */ /*$$IBE$$ 
SELECT ENCO_CONSEC FROM COMPROBANTE_ENCABEZADO WHERE ENCO_TIPOREF = 31 AND ENCO_IDREF = :ID INTO :IDC;
SELECT MAX(CODE_ITEM) FROM COMPROBANTE_DETALLE WHERE ENCO_CONSEC = :idc INTO :NROI;
NROI = NROI + 1;
 $$IBE$$*/ /* EJECUTE LA PARTE DE CONTABIL_FACTURA QUE CORRESPONDE A LOS COSTOS */ /*$$IBE$$ 
EXISTE = 'N';
SELECT 'S', INVE_COSTO, INVE_INVEN, INVE_CTAINVEN, INVE_CTACOSTOS
    FROM INTERFAZ_VENTAS
    WHERE INVE_ID = :IDINTER
    INTO :EXISTE, :COSTOS, :INVEN, :CTAINVEN, :CTACOSTOS;
if (EXISTE = 'S') then
  BEGIN
  SELECT FACT_ANULADO, PREF_PRE, FACT_NUMERO, FACT_VENCE, TERC_NIT FROM FACTURAS F
        WHERE FACT_ID = :ID INTO :ANULADO, :PREF, :NUMERO, :VENCEAUX, :NIT;
  NUMERO = PREF || NUM;
  CONC = 'COSTO EN VENTAS FACTURA ' || :NUMERO;
  EXECUTE PROCEDURE FECHA_A_CONTA(:VENCEAUX) returning_values (:VENCE);
  if (ANULADO = 'N') then
    BEGIN
    SELECT BODE_CENTRO, BODE_PROY FROM BODEGA B, FACTURAS F, PUNTO_VENTA P
        WHERE B.BODE_COD = P.BODE_COD AND P.PTVT_ID = F.PTVT_ID AND F.FACT_ID = :ID INTO :CENTRO, :PROY;
     $$IBE$$*/ /* SE ASUME QUE NO HAN CAMBIADO LAS CUENTAS DE COSTOS, POR ESO SE HACE UPDATE A LOS MOVIMIENTOS DE ESAS CUENTAS */ /*$$IBE$$ 
    EXECUTE PROCEDURE COSTO_EN_VENTAS(31, :ID);
    if (COSTOS = 'A') then
        BEGIN
        FOR SELECT MAX(CTACOS), SUM(CANT * COSTO)
            FROM COSTO_VENTAS
            GROUP BY CTACOS
            INTO :CTACOSTOS, :MONTO
        DO
            BEGIN
            if (MONTO <> 0) then
                BEGIN
                CUENTA = NULL;
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :CTACOSTOS INTO :CUENTA, :TIPOCUEN;
                IF (CUENTA IS NULL) THEN
                    begin
                    EXCEPTION CUENTA_NO_EXISTE 'La cuenta ' || :ctacostos || ' no existe.';
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                     $$IBE$$*/ /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */ /*$$IBE$$ 
                    FOR SELECT ARTI_COD, CANT * COSTO
                        FROM COSTO_VENTAS
                        WHERE CTACOS = :CUENTA
                        INTO :ART, :MONTO
                    DO
                        BEGIN
                        SELECT COUNT(*) FROM COMPROBANTE_DETALLE WHERE CUEN_COD = :CUENTA AND ENCO_CONSEC = :IDC AND ARTI_COD = :ART INTO :NUMROWS;
                        if (NUMROWS = 0) then
                            BEGIN
                            INSERT INTO comprobante_detalle (ENCO_CONSEC, CODE_ITEM, CUEN_COD, CODE_CONCEPTO, CODE_REFER, CODE_DEBITO, CODE_CREDITO, CODE_BASE, CODE_PORC, TERC_NIT, PROY_COD, CENT_COD, CNDE_DOCNUMERO, CNDE_DOCAPLICA, DOCO_VENCE, ARTI_COD, CODE_TIPOAPL, CODE_TIPONUE)
                                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                            NROI = NROI + 1;
                            END
                        ELSE
                            UPDATE COMPROBANTE_DETALLE
                                SET CODE_DEBITO = :MONTO
                            WHERE CUEN_COD = :CUENTA AND ENCO_CONSEC = :IDC AND ARTI_COD = :ART;
                        END
                    END
                ELSE
                    BEGIN
                    SELECT COUNT(*) FROM COMPROBANTE_DETALLE WHERE CUEN_COD = :CUENTA AND ENCO_CONSEC = :IDC INTO :NUMROWS;
                    if (NUMROWS = 0) then
                        BEGIN
                        if (TIPOCUEN = 'C') then
                            INSERT INTO comprobante_detalle (ENCO_CONSEC, CODE_ITEM, CUEN_COD, CODE_CONCEPTO, CODE_REFER, CODE_DEBITO, CODE_CREDITO, CODE_BASE, CODE_PORC, TERC_NIT, PROY_COD, CENT_COD, CNDE_DOCNUMERO, CNDE_DOCAPLICA, DOCO_VENCE, ARTI_COD, CODE_TIPOAPL, CODE_TIPONUE)
                                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                        ELSE
                            INSERT INTO comprobante_detalle (ENCO_CONSEC, CODE_ITEM, CUEN_COD, CODE_CONCEPTO, CODE_REFER, CODE_DEBITO, CODE_CREDITO, CODE_BASE, CODE_PORC, TERC_NIT, PROY_COD, CENT_COD, CNDE_DOCNUMERO, CNDE_DOCAPLICA, DOCO_VENCE, ARTI_COD, CODE_TIPOAPL, CODE_TIPONUE)
                                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NROI = NROI + 1;
                        END
                    ELSE
                        UPDATE COMPROBANTE_DETALLE
                            SET CODE_DEBITO = :MONTO
                        WHERE CUEN_COD = :CUENTA AND ENCO_CONSEC = :IDC;
                    END
                END  $$IBE$$*/ /* MONTO <> 0 */ /*$$IBE$$ 
            END  $$IBE$$*/ /* FOR */ /*$$IBE$$ 
        END  $$IBE$$*/ /* COSTOS */ /*$$IBE$$ 
    if (COSTOS = 'K') then
        BEGIN
        SELECT SUM(CANT * COSTO)
            FROM COSTO_VENTAS
            INTO :MONTO;
        if (MONTO <> 0) then
            BEGIN
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTACOSTOS INTO :CUENTA, :TIPOCUEN;
            IF (CUENTA IS NULL) THEN
                begin
                EXCEPTION CUENTA_NO_EXISTE 'La cuenta ' || :ctacostos || ' no existe.';
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                 $$IBE$$*/ /* ES UNA CUENTA DE INVENTARIO, REGISTRE UNO A UNO LOS ARTICULOS */ /*$$IBE$$ 
                FOR SELECT ARTI_COD, CANT * COSTO
                    FROM COSTO_VENTAS
                    INTO :ART, :MONTO
                DO
                    BEGIN
                    SELECT COUNT(*) FROM COMPROBANTE_DETALLE WHERE CUEN_COD = :CUENTA AND ENCO_CONSEC = :IDC AND ARTI_COD = :ART INTO :NUMROWS;
                    if (NUMROWS = 0) then
                        BEGIN
                            INSERT INTO comprobante_detalle (ENCO_CONSEC, CODE_ITEM, CUEN_COD, CODE_CONCEPTO, CODE_REFER, CODE_DEBITO, CODE_CREDITO, CODE_BASE, CODE_PORC, TERC_NIT, PROY_COD, CENT_COD, CNDE_DOCNUMERO, CNDE_DOCAPLICA, DOCO_VENCE, ARTI_COD, CODE_TIPOAPL, CODE_TIPONUE)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        END
                    ELSE
                        UPDATE COMPROBANTE_DETALLE
                            SET CODE_DEBITO = :MONTO
                        WHERE CUEN_COD = :CUENTA AND ENCO_CONSEC = :IDC AND ARTI_COD = :ART;
                    END
                END
            ELSE
                BEGIN
                SELECT COUNT(*) FROM COMPROBANTE_DETALLE WHERE CUEN_COD = :CUENTA AND ENCO_CONSEC = :IDC INTO :NUMROWS;
                if (NUMROWS = 0) then
                    BEGIN
                    if (TIPOCUEN = 'C') then
                        INSERT INTO comprobante_detalle (ENCO_CONSEC, CODE_ITEM, CUEN_COD, CODE_CONCEPTO, CODE_REFER, CODE_DEBITO, CODE_CREDITO, CODE_BASE, CODE_PORC, TERC_NIT, PROY_COD, CENT_COD, CNDE_DOCNUMERO, CNDE_DOCAPLICA, DOCO_VENCE, ARTI_COD, CODE_TIPOAPL, CODE_TIPONUE)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    ELSE
                        INSERT INTO comprobante_detalle (ENCO_CONSEC, CODE_ITEM, CUEN_COD, CODE_CONCEPTO, CODE_REFER, CODE_DEBITO, CODE_CREDITO, CODE_BASE, CODE_PORC, TERC_NIT, PROY_COD, CENT_COD, CNDE_DOCNUMERO, CNDE_DOCAPLICA, DOCO_VENCE, ARTI_COD, CODE_TIPOAPL, CODE_TIPONUE)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    END
                ELSE
                    UPDATE COMPROBANTE_DETALLE
                        SET CODE_DEBITO = :MONTO
                    WHERE CUEN_COD = :CUENTA AND ENCO_CONSEC = :IDC;
                END
            END  $$IBE$$*/ /* MONTO <> 0 */ /*$$IBE$$ 
        END  $$IBE$$*/ /* COSTOS = K */ /*$$IBE$$ 
    if (INVEN = 'A') then
        BEGIN
        FOR SELECT MAX(CTAINV), SUM(CANT * COSTO)
            FROM COSTO_VENTAS
            GROUP BY CTAINV
            INTO :CTAINVEN, :MONTO
        DO
            BEGIN
            if (MONTO <> 0) then
                BEGIN
                CUENTA = NULL;
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :CTAINVEN INTO :CUENTA, :TIPOCUEN;
                IF (CUENTA IS NULL) THEN
                    begin
                    EXCEPTION CUENTA_NO_EXISTE 'La cuenta ' || :ctainven || ' no existe.';
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                     $$IBE$$*/ /* ES UNA CUENTA DE INVENTARIO, REGISTRE UNO A UNO LOS ARTICULOS */ /*$$IBE$$ 
                    FOR SELECT ARTI_COD, CANT * COSTO
                        FROM COSTO_VENTAS
                        WHERE CTAINV = :CUENTA
                        INTO :ART, :MONTO
                    DO
                        BEGIN
                        SELECT COUNT(*) FROM COMPROBANTE_DETALLE WHERE CUEN_COD = :CUENTA AND ENCO_CONSEC = :IDC AND ARTI_COD = :ART INTO :NUMROWS;
                        if (NUMROWS = 0) then
                            BEGIN
                            INSERT INTO comprobante_detalle (ENCO_CONSEC, CODE_ITEM, CUEN_COD, CODE_CONCEPTO, CODE_REFER, CODE_DEBITO, CODE_CREDITO, CODE_BASE, CODE_PORC, TERC_NIT, PROY_COD, CENT_COD, CNDE_DOCNUMERO, CNDE_DOCAPLICA, DOCO_VENCE, ARTI_COD, CODE_TIPOAPL, CODE_TIPONUE)
                                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                            NROI = NROI + 1;
                            END
                        ELSE
                            UPDATE COMPROBANTE_DETALLE
                                SET CODE_CREDITO = :MONTO
                            WHERE CUEN_COD = :CUENTA AND ENCO_CONSEC = :IDC AND ARTI_COD = :ART;
                        END
                    END
                ELSE
                    BEGIN
                    SELECT COUNT(*) FROM COMPROBANTE_DETALLE WHERE CUEN_COD = :CUENTA AND ENCO_CONSEC = :IDC INTO :NUMROWS;
                    if (NUMROWS = 0) then
                        BEGIN
                        if (TIPOCUEN = 'C') then
                            INSERT INTO comprobante_detalle (ENCO_CONSEC, CODE_ITEM, CUEN_COD, CODE_CONCEPTO, CODE_REFER, CODE_DEBITO, CODE_CREDITO, CODE_BASE, CODE_PORC, TERC_NIT, PROY_COD, CENT_COD, CNDE_DOCNUMERO, CNDE_DOCAPLICA, DOCO_VENCE, ARTI_COD, CODE_TIPOAPL, CODE_TIPONUE)
                                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                        ELSE
                            INSERT INTO comprobante_detalle (ENCO_CONSEC, CODE_ITEM, CUEN_COD, CODE_CONCEPTO, CODE_REFER, CODE_DEBITO, CODE_CREDITO, CODE_BASE, CODE_PORC, TERC_NIT, PROY_COD, CENT_COD, CNDE_DOCNUMERO, CNDE_DOCAPLICA, DOCO_VENCE, ARTI_COD, CODE_TIPOAPL, CODE_TIPONUE)
                                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NROI = NROI + 1;
                        END
                    ELSE
                        UPDATE COMPROBANTE_DETALLE
                            SET CODE_CREDITO = :MONTO
                        WHERE CUEN_COD = :CUENTA AND ENCO_CONSEC = :IDC;
                    END
                END  $$IBE$$*/ /* MONTO <> 0 */ /*$$IBE$$ 
            END  $$IBE$$*/ /* FOR */ /*$$IBE$$ 
        END  $$IBE$$*/ /* INVEN = A */ /*$$IBE$$ 
    if (INVEN = 'K') then
        BEGIN
        SELECT SUM(CANT * COSTO)
            FROM COSTO_VENTAS
            INTO :MONTO;
        if (MONTO <> 0) then
            BEGIN
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTAINVEN INTO :CUENTA, :TIPOCUEN;
            IF (CUENTA IS NULL) THEN
                begin
                EXCEPTION CUENTA_NO_EXISTE 'La cuenta ' || :ctainven || ' no existe.';
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                 $$IBE$$*/ /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */ /*$$IBE$$ 
                FOR SELECT ARTI_COD, CANT * COSTO
                    FROM COSTO_VENTAS
                    INTO :ART, :MONTO
                DO
                    BEGIN
                    SELECT COUNT(*) FROM COMPROBANTE_DETALLE WHERE CUEN_COD = :CUENTA AND ENCO_CONSEC = :IDC AND ARTI_COD = :ART INTO :NUMROWS;
                    if (NUMROWS = 0) then
                        BEGIN
                        INSERT INTO comprobante_detalle (ENCO_CONSEC, CODE_ITEM, CUEN_COD, CODE_CONCEPTO, CODE_REFER, CODE_DEBITO, CODE_CREDITO, CODE_BASE, CODE_PORC, TERC_NIT, PROY_COD, CENT_COD, CNDE_DOCNUMERO, CNDE_DOCAPLICA, DOCO_VENCE, ARTI_COD, CODE_TIPOAPL, CODE_TIPONUE)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        END
                    ELSE
                        UPDATE COMPROBANTE_DETALLE
                            SET CODE_CREDITO = :MONTO
                        WHERE CUEN_COD = :CUENTA AND ENCO_CONSEC = :IDC AND ARTI_COD = :ART;
                    END
                END
            ELSE
                BEGIN
                SELECT COUNT(*) FROM COMPROBANTE_DETALLE WHERE CUEN_COD = :CUENTA AND ENCO_CONSEC = :IDC INTO :NUMROWS;
                if (NUMROWS = 0) then
                    BEGIN
                    if (TIPOCUEN = 'C') then
                        INSERT INTO comprobante_detalle (ENCO_CONSEC, CODE_ITEM, CUEN_COD, CODE_CONCEPTO, CODE_REFER, CODE_DEBITO, CODE_CREDITO, CODE_BASE, CODE_PORC, TERC_NIT, PROY_COD, CENT_COD, CNDE_DOCNUMERO, CNDE_DOCAPLICA, DOCO_VENCE, ARTI_COD, CODE_TIPOAPL, CODE_TIPONUE)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    ELSE
                        INSERT INTO comprobante_detalle (ENCO_CONSEC, CODE_ITEM, CUEN_COD, CODE_CONCEPTO, CODE_REFER, CODE_DEBITO, CODE_CREDITO, CODE_BASE, CODE_PORC, TERC_NIT, PROY_COD, CENT_COD, CNDE_DOCNUMERO, CNDE_DOCAPLICA, DOCO_VENCE, ARTI_COD, CODE_TIPOAPL, CODE_TIPONUE)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    END
                ELSE
                    UPDATE COMPROBANTE_DETALLE
                        SET CODE_CREDITO = :MONTO
                    WHERE CUEN_COD = :CUENTA AND ENCO_CONSEC = :IDC;
                END
            END  $$IBE$$*/ /* MONTO <> 0 */ /*$$IBE$$ 
        END  $$IBE$$*/ /* INVEN = K */ /*$$IBE$$ 
    END
  END
 $$IBE$$*/ SUSPEND;
end
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE CONTABIL_DEVOLCLI(
    IDDOC INTEGER,
    IDINTER INTEGER)
RETURNS (
    ERROR INTEGER,
    VER CHAR(1),
    IDC INTEGER)
AS
declare variable PREF VARCHAR(4);
declare variable NUM VARCHAR(6);
declare variable NUMERO VARCHAR(10);
declare variable FECAUX DATE;
declare variable FECHA CHAR(8);
declare variable CONC CHAR(120);
declare variable NUMFAC VARCHAR(10);
declare variable VRDTO NUMERIC(18, 2);
declare variable VRADIC NUMERIC(18, 2);
declare variable VRSUBT NUMERIC(18, 2);
declare variable VRIVA NUMERIC(18, 2);
declare variable PRTFTE NUMERIC(9, 2);
declare variable VRRTFTE NUMERIC(18, 2);
declare variable VRRTIVA NUMERIC(18, 2);
declare variable PRTICA NUMERIC(9, 2);
declare variable VRRTICA NUMERIC(18, 2);
declare variable VRTOTAL NUMERIC(18, 2);
declare variable VREXTRA NUMERIC(18, 2);
declare variable TIPOCOMP VARCHAR(3);
declare variable PREFCONT VARCHAR(4);
declare variable VENTAS CHAR(1);
declare variable CTAVENTAS VARCHAR(20);
declare variable IVA CHAR(1);
declare variable CTAIVA VARCHAR(20);
declare variable CONSUMO CHAR(1);
declare variable CTACONSUMO VARCHAR(20);
declare variable CARTERA CHAR(1);
declare variable CTACARTERA VARCHAR(20);
declare variable RTFTE CHAR(1);
declare variable CTARTFTE VARCHAR(20);
declare variable RTIVA CHAR(1);
declare variable CTARTIVA VARCHAR(20);
declare variable RTICA CHAR(1);
declare variable CTARTICA VARCHAR(20);
declare variable INVEN CHAR(1);
declare variable CTAINVEN VARCHAR(20);
declare variable COSTOS CHAR(1);
declare variable CTACOSTOS VARCHAR(20);
declare variable CTADTO VARCHAR(20);
declare variable CTAADIC VARCHAR(20);
declare variable CTAEXTRA VARCHAR(20);
declare variable EXISTE CHAR(1);
declare variable CUENTA VARCHAR(20);
declare variable MONTO NUMERIC(18,2);
declare variable TIPOCUEN CHAR(1);
declare variable NIT VARCHAR(20);
declare variable PROY VARCHAR(4);
declare variable CENTRO VARCHAR(4);
declare variable PORC NUMERIC(5,2);
declare variable DEBITO NUMERIC(18,2);
declare variable CREDITO NUMERIC(18,2);
declare variable NROI INTEGER;
declare variable ART VARCHAR(15);
declare variable IMPINC CHAR(1);
declare variable IMPTOS NUMERIC(18, 2);
declare variable SUMA NUMERIC(18,2);
declare variable PORCIVA NUMERIC(9,2);
declare variable TCTACLIEN VARCHAR(20);
declare variable TCTAVENTA VARCHAR(20);
declare variable TCTARTFTE VARCHAR(20);
declare variable TCTARTIVA VARCHAR(20);
declare variable TCTARTICA VARCHAR(20);
declare variable CTADIC VARCHAR(20);
declare variable BASEADIC VARCHAR(20);
declare variable PORCADIC NUMERIC(5,2);
declare variable VALORADIC NUMERIC(18,2);
declare variable DBADIC CHAR(1);
declare variable PTOVTA INTEGER;
declare variable ANULADO CHAR(1);
declare variable CENT CHAR(1);
DECLARE VARIABLE MERCANCIA NUMERIC(18,2);
declare variable FACTOR DOUBLE PRECISION;
declare variable DIG INTEGER;
DECLARE VARIABLE FOMENTO VARCHAR(2);
DECLARE VARIABLE VRCONSUMO NUMERIC(18,2);
declare variable AUTORET VARCHAR(10);
declare variable FAUTORET DATE;
declare variable IDREM INTEGER;
declare variable DTOXIT CHAR(2);
declare variable ERRORC INTEGER;
BEGIN /*$$IBE$$ 
EXECUTE PROCEDURE LEE_CONFIGURACION('COMPRAS', 'FACTURAS', 'USAR IMPOCONSUMO COMO PORCENTAJE DE FOMENTO') returning_values (FOMENTO);
EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'FECHA AUTORETENEDOR NO DESCONTAR RETENCIONES DEL SALDO PERO SI CONTABILIZARLAS') returning_values (AUTORET);
if (AUTORET <> '') then
    FAUTORET = CAST(AUTORET AS DATE);
else
    FAUTORET = '9999/12/31';
   $$IBE$$*/ /* BUSQUE LA INTERFACE */ /*$$IBE$$ 
  EXISTE = 'N';
  SELECT 'S', TICO_COD, PRCO_PRE, INVE_VENTAS, INVE_IVA, INVE_CONSUMO, INVE_CARTERA, INVE_RTFTE, INVE_RTIVA, INVE_RTICA, INVE_COSTO, INVE_INVEN, INVE_CTAVENTAS, INVE_CTAIVA, INVE_CTACONSUMO, INVE_CTADTO, INVE_CTAADIC, INVE_CTAEXTRA, INVE_CTACARTERA, INVE_CTARTFTE, INVE_CTARTIVA, INVE_CTARTICA, INVE_CTAINVEN, INVE_CTACOSTOS, INVE_CONFIRMAR, INVE_CENTRO
    FROM INTERFAZ_VENTAS
    WHERE INVE_ID = :IDINTER
    INTO :EXISTE, :TIPOCOMP, :PREFCONT, :VENTAS, :IVA, :CONSUMO, :CARTERA, :RTFTE, :RTIVA, :RTICA, :COSTOS, :INVEN, :CTAVENTAS, :CTAIVA, :CTACONSUMO, :CTADTO, :CTAADIC, :CTAEXTRA, :CTACARTERA, :CTARTFTE, :CTARTIVA, :CTARTICA, :CTAINVEN, :CTACOSTOS, :VER, :CENT;
  if (EXISTE = 'S') then
   BEGIN
     $$IBE$$*/ /* BORRE CUALQUEIR CONTABILIZACION PREVIA */ /*$$IBE$$ 
    DELETE FROM CONTABILIZACION WHERE CNTB_TIPOREF = 33 AND CNTB_IDREF = :IDDOC;
     $$IBE$$*/ /* TRAIGA EL ENCABEZADO DE LA DEVOLUCION */ /*$$IBE$$ 
   SELECT PREF_PRE, DEVT_NUMERO, DEVT_FECHA, F.TERC_NIT, DEVT_IVAINC, PTVT_ID, DEVT_FACTURA, DEVT_DTOMONTO, DEVT_ADICIONAL, DEVT_IVAMONTO, DEVT_EXTRA, DEVT_TOTAL, DEVT_RTFTEPORC, DEVT_RTFTEMONTO, DEVT_RTIVAPORC, DEVT_RTIVAMONTO, DEVT_RTICAPORC, DEVT_RTICAMONTO, TERC_CTARTFTE, TERC_CTARTIVA, TERC_CTARTICA, TERC_CTAVENTA, TERC_CTACLIENTE, DEVT_ANULADO, DEVT_REMID
        FROM DEVOLUCIONES_VENTAS F, TERCEROS T
        WHERE DEVT_ID = :IDDOC AND F.TERC_NIT = T.TERC_NIT
        INTO :PREF, :NUM, :FECAUX, :NIT, :IMPINC, :PTOVTA, :NUMFAC, :VRDTO, :VRADIC, :VRIVA, :VREXTRA, :VRTOTAL, :PRTFTE, :VRRTFTE, :PORC, :VRRTIVA, :PRTICA, :VRRTICA, :TCTARTFTE, TCTARTIVA, TCTARTICA, TCTAVENTA, TCTACLIEN, ANULADO, :IDREM;
   if (idrem is null) Then
    IDREM = 0;
   if ((ANULADO = 'N') AND (IDREM = 0)) then
    BEGIN
    NUMERO = PREF || NUM;
    SELECT SUM(DVDE_CONSUMO) FROM devoluciones_ventas_detalle WHERE DEVT_ID = :iddoc INTO :MERCANCIA;
    VRSUBT = VRTOTAL - VREXTRA - VRIVA - MERCANCIA;  $$IBE$$*/ /* BASE DE RETEFTE Y RETEICA */ /*$$IBE$$ 
    EXECUTE PROCEDURE lee_configuracion ('FACTURACION', 'DEVOLUCIONES', 'DESCUENTO PIE DEVOLUCION IGUAL A SUMA DE DESCUENTOS POR ITEM') returning_values (:DTOXIT);
    if (DTOXIT = 'SI') then
        VRDTO = 0;
    MERCANCIA = VRSUBT - VRADIC + VRDTO;
    IF (CENT = 'B') THEN
        SELECT B.BODE_CENTRO, B.BODE_PROY FROM BODEGA B, DEVOLUCIONES_VENTAS F
            WHERE B.BODE_COD = F.BODE_COD AND F.DEVT_ID = :IDDOC INTO :CENTRO, :PROY;
    IF (CENT = 'V') THEN
        SELECT V.CENT_COD, V.PROY_COD FROM VENDEDORES V, DEVOLUCIONES_VENTAS F
            WHERE V.VEND_COD = F.VEND_COD AND F.DEVT_ID = :IDDOC INTO :CENTRO, :PROY;
    IF (CENT = 'P') THEN
        SELECT P.PREF_CENTRO,P.PREF_PROY  FROM PREFIJOS P, DEVOLUCIONES_VENTAS F
            WHERE P.PREF_PRE = F.PREF_PRE AND F.DEVT_ID = :IDDOC AND P.TIDO_COD = 33 INTO :CENTRO, :PROY;
    EXECUTE PROCEDURE FECHA_A_CONTA(:FECAUX) returning_values (:FECHA);
     $$IBE$$*/ /* REGISTRE EL ENCABEZADO CONTABLE */ /*$$IBE$$ 
    IDC = GEN_ID(ID_CONTABILIZA, 1);
    CONC = 'DEVOLUCION VENTAS No. ' || NUMERO || ' EN FACTURA ' || NUMFAC;
    CONC = SUBSTR(CONC, 1, 60);
    INSERT INTO CONTABILIZACION (CNTB_ID, CNTB_TIPOCOMP, CNTB_PREFCNT, CNTB_NUMERO, CNTB_FECHA, CNTB_CONCEPTO, CNTB_REF, CNTB_TIPOREF, CNTB_IDREF, CNTB_PREFREF, CNTB_NUMREF, CNTB_PROCESADO)
        VALUES (:IDC, :TIPOCOMP, :PREFCONT, :NUM, :FECHA, :CONC, '', 33, :IDDOC, :PREF, :NUM, 'N');
    NROI = 0;
    SUMA = 0;
    ERROR = 0;
     $$IBE$$*/ /* SI NO HAY CUENTA DE DESCUENTO NI ADICIONAL CALCULE UN FACTOR PARA LAS VENTAS Y EL IVA */ /*$$IBE$$ 
    if (MERCANCIA <> 0) then
        FACTOR = CAST(VRSUBT AS DOUBLE PRECISION) / CAST(MERCANCIA AS DOUBLE PRECISION);
    ELSE
        FACTOR = 1;
     $$IBE$$*/ /* TRAIGA EL NUMERO DE DIGITOS PARA EL REDONDEO */ /*$$IBE$$ 
    SELECT CAST(CONF_VALOR AS INTEGER) FROM CONFIGURACION WHERE CONF_MODULO = 'FACTURACION' AND
        CONF_CATEGORIA = 'GENERAL' AND CONF_PROPIEDAD = 'REDONDEO AL MULTIPLO DE DIEZ EN TOTALES' INTO :DIG;
     $$IBE$$*/ /* CUENTAS DE VENTAS */ /*$$IBE$$ 
    if (VENTAS = 'A') then
        BEGIN
        FOR SELECT MAX(COAR_CTADEV), SUM(cast(DVDE_CANT as double precision) * (DVDE_PRUNIT-DVDE_DTOMONTO)), SUM(DVDE_IVAMONTO), SUM(DVDE_CONSUMO)
            FROM ARTICULO A, CONTABIL_ARTICULO C, DEVOLUCIONES_VENTAS_DETALLE F
            WHERE F.DEVT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD
            GROUP BY COAR_CTADEV
            INTO :CTAVENTAS, :MONTO, :IMPTOS, :VRCONSUMO
            DO
            BEGIN
            if (IMPINC = 'S') then
                if (FOMENTO = 'SI') then
                    MONTO = MONTO - IMPTOS;
                ELSE
                    MONTO = MONTO - IMPTOS - VRCONSUMO;
            ELSE
            if (FOMENTO = 'SI') then
            MONTO = MONTO + VRCONSUMO;
            if ((CTADTO IS NULL) OR (CTADTO = '')) then
                MONTO = MONTO * FACTOR;
            execute procedure redondee(MONTO, DIG) returning_values (MONTO);
            if (MONTO <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTAVENTAS, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                     $$IBE$$*/ /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */ /*$$IBE$$ 
                    FOR SELECT F.ARTI_COD, (cast(DVDE_CANT as double precision) * (DVDE_PRUNIT-DVDE_DTOMONTO)), (DVDE_IVAMONTO+DVDE_CONSUMO)
                        FROM ARTICULO A, CONTABIL_ARTICULO C, DEVOLUCIONES_VENTAS_DETALLE F
                        WHERE F.DEVT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTAINV = :CUENTA
                        INTO :ART, :MONTO, :IMPTOS
                    DO
                        BEGIN
                        if (IMPINC = 'S') then
                            MONTO = MONTO - IMPTOS;
                        if ((CTADTO IS NULL) OR (CTADTO = '')) then
                            MONTO = MONTO * FACTOR;
                        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        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, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                    NROI = NROI + 1;
                    SUMA = SUMA + MONTO;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA + MONTO;
                    END
                END  $$IBE$$*/ /* MONTO <> 0 */ /*$$IBE$$ 
            END  $$IBE$$*/ /* FOR */ /*$$IBE$$ 
        END  $$IBE$$*/ /* VENTAS X ARTICULO */ /*$$IBE$$ 
     IF ((VENTAS = 'C') OR (VENTAS = 'K')) THEN
        BEGIN
        IF (VENTAS = 'C') THEN
            CTAVENTAS = TCTAVENTA;
        SELECT SUM(cast(DVDE_CANT as double precision) * (DVDE_PRUNIT-DVDE_DTOMONTO)), SUM(DVDE_IVAMONTO), SUM(DVDE_CONSUMO)
            FROM DEVOLUCIONES_VENTAS_DETALLE F
            WHERE F.DEVT_ID = :IDDOC 
            INTO :MONTO, :IMPTOS, :VRCONSUMO;
        if (IMPINC = 'S') then
            if (FOMENTO = 'SI') then
               MONTO = MONTO - IMPTOS;
            ELSE
               MONTO = MONTO - IMPTOS - VRCONSUMO;
        ELSE
         if (FOMENTO = 'SI') then
          MONTO = MONTO + VRCONSUMO;
        if ((CTADTO IS NULL) OR (CTADTO = '')) then
            MONTO = MONTO * FACTOR;
        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
        if (MONTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTAVENTAS, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'I') then
                BEGIN
                 $$IBE$$*/ /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */ /*$$IBE$$ 
                FOR SELECT F.ARTI_COD, (cast(DVDE_CANT as double precision) * (DVDE_PRUNIT-DVDE_DTOMONTO)), (DVDE_IVAMONTO+DVDE_CONSUMO)
                    FROM ARTICULO A, DEVOLUCIONES_VENTAS_DETALLE F
                    WHERE F.DEVT_ID = :IDDOC
                    INTO :ART, :MONTO, :IMPTOS
                    DO
                    BEGIN
                    if (IMPINC = 'S') then
                        MONTO = MONTO - IMPTOS;
                    if ((CTADTO IS NULL) OR (CTADTO = '')) then
                        MONTO = MONTO * FACTOR;
                    execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                    NROI = NROI + 1;
                    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, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                NROI = NROI + 1;
                SUMA = SUMA + MONTO;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA + MONTO;
                END
            END  $$IBE$$*/ /* MONTO <> 0 */ /*$$IBE$$ 
        END  $$IBE$$*/ /* VENTAS DE CLIENTE O CONSTANTE */
    /* EL IVA EN VENTAS */ /*$$IBE$$ 
    if (IVA = 'A') then
        BEGIN
        FOR SELECT MAX(COAR_CTAIVAV), SUM(DVDE_IVAMONTO), SUM(DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO), SUM(DVDE_CONSUMO)
            FROM ARTICULO A, CONTABIL_ARTICULO C, DEVOLUCIONES_VENTAS_DETALLE F
            WHERE F.DEVT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD
            GROUP BY COAR_CTAIVAV
            INTO :CTAIVA, :IMPTOS, :MONTO, :VALORADIC
        DO
            BEGIN
            if (FOMENTO = 'SI') then
                MONTO = MONTO + VALORADIC;
            MONTO = MONTO * -1;
            MONTO = MONTO * FACTOR;
            IMPTOS = IMPTOS * FACTOR;
            execute procedure redondee(MONTO, DIG) returning_values (MONTO);
            execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
            if (IMPTOS <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTAIVA, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                     $$IBE$$*/ /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */ /*$$IBE$$ 
                    FOR SELECT F.ARTI_COD, DVDE_IVAMONTO, (cast(DVDE_CANT as double precision) * (DVDE_PRUNIT-DVDE_DTOMONTO)), TAIV_PORC, DVDE_CONSUMO
                        FROM ARTICULO A, CONTABIL_ARTICULO C, DEVOLUCIONES_VENTAS_DETALLE F, TARIFA_IVA T
                        WHERE F.DEVT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND A.TAIV_COD = T.TAIV_COD AND COAR_CTAIVAV = :CUENTA
                        INTO :ART, :IMPTOS, :MONTO, :PORCIVA, :VALORADIC
                    DO
                        BEGIN
                        if (IMPINC = 'S') then
                            MONTO = MONTO - IMPTOS - VALORADIC;
                        MONTO = MONTO * -1;
                        MONTO = MONTO * FACTOR;
                        IMPTOS = IMPTOS * FACTOR;
                        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                        execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                        if (IMPTOS <> 0) then
                            BEGIN
                            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :IMPTOS, 0, :MONTO, :PORCIVA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                            NROI = NROI + 1;
                            SUMA = SUMA + IMPTOS;
                            END
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                    NROI = NROI + 1;
                    SUMA = SUMA + IMPTOS;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA + IMPTOS;
                    END
                END    $$IBE$$*/ /* IMPTOS <> 0 */ /*$$IBE$$ 
            END  $$IBE$$*/ /* FOR */ /*$$IBE$$ 
        END  $$IBE$$*/ /* IVA X ARTICULO */ /*$$IBE$$ 
    if (IVA = 'K') then  $$IBE$$*/ /* IVA EN CTA CONSTANTE */ /*$$IBE$$ 
        BEGIN
        SELECT SUM(DVDE_IVAMONTO), SUM(DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO), SUM(DVDE_CONSUMO)
            FROM DEVOLUCIONES_VENTAS_DETALLE F
            WHERE F.DEVT_ID = :IDDOC 
            INTO :IMPTOS, :MONTO, :VALORADIC;
        if (FOMENTO = 'SI') then
            MONTO = MONTO + VALORADIC;
        MONTO = MONTO * -1;
        MONTO = MONTO * FACTOR;
        IMPTOS = IMPTOS * FACTOR;
        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
        execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
        if (IMPTOS <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTAIVA, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'I') then
                BEGIN
                 $$IBE$$*/ /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */ /*$$IBE$$ 
                FOR SELECT F.ARTI_COD, (cast(DVDE_CANT as double precision) * (DVDE_PRUNIT-DVDE_DTOMONTO)), DVDE_IVAMONTO, TAIV_PORC, DVDE_CONSUMO
                    FROM ARTICULO A, DEVOLUCIONES_VENTAS_DETALLE F, TARIFA_IVA T
                    WHERE F.DEVT_ID = :IDDOC AND A.TAIV_COD = T.TAIV_COD
                    INTO :ART, :MONTO, :IMPTOS, :PORCIVA, :VALORADIC
                    DO
                    BEGIN
                    if (IMPINC = 'S') then
                        MONTO = MONTO - IMPTOS - VALORADIC;
                    MONTO = MONTO * -1;
                    MONTO = MONTO * FACTOR;
                    IMPTOS = IMPTOS * FACTOR;
                    execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                    execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                    if (IMPTOS <> 0) then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', :IMPTOS, 0, :MONTO, :PORCIVA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        SUMA = SUMA + IMPTOS;
                        END
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                NROI = NROI + 1;
                SUMA = SUMA + IMPTOS;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA + IMPTOS;
                END
            END  $$IBE$$*/ /* IMPTOS <> 0 */ /*$$IBE$$ 
        END  $$IBE$$*/ /* IVA EN CTA CONSTANTE */
    /* EL IMPOCONSUMO */ /*$$IBE$$ 
    if ((CONSUMO = 'A') AND (FOMENTO <> 'SI')) then
        BEGIN
        FOR SELECT MAX(COAR_CTACONS), SUM(DVDE_CONSUMO)
            FROM ARTICULO A, CONTABIL_ARTICULO C, DEVOLUCIONES_VENTAS_DETALLE F
            WHERE F.DEVT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD
            GROUP BY COAR_CTACONS
            INTO :CTACONSUMO, :IMPTOS
        DO
            BEGIN
            if (IMPTOS <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTACONSUMO, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                     $$IBE$$*/ /* ES UNA CUENTA DE INVENTARIO, REGISTRE UNO A UNO LOS ARTICULOS */ /*$$IBE$$ 
                    FOR SELECT F.ARTI_COD, DVDE_CONSUMO
                        FROM ARTICULO A, CONTABIL_ARTICULO C, DEVOLUCIONES_VENTAS_DETALLE F
                        WHERE F.DEVT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTACONS = :CUENTA
                        INTO :ART, :IMPTOS
                    DO
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 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, :NROI, :CUENTA, :CONC, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                    NROI = NROI + 1;
                    SUMA = SUMA + IMPTOS;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA + IMPTOS;
                    END
                END  $$IBE$$*/ /* IMPTOS <> 0 */ /*$$IBE$$ 
            END  $$IBE$$*/ /* FOR */ /*$$IBE$$ 
        END  $$IBE$$*/ /* CONSUMO X ARTICULO */ /*$$IBE$$ 
    if ((CONSUMO = 'K') AND (FOMENTO <> 'SI')) then
        BEGIN
        SELECT SUM(DVDE_CONSUMO)
            FROM DEVOLUCIONES_VENTAS_DETALLE F
            WHERE F.DEVT_ID = :IDDOC 
            INTO :IMPTOS;
        if (IMPTOS <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTACONSUMO, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'I') then
                BEGIN
                 $$IBE$$*/ /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */ /*$$IBE$$ 
                FOR SELECT F.ARTI_COD, DVDE_CONSUMO
                    FROM ARTICULO A, DEVOLUCIONES_VENTAS_DETALLE F
                    WHERE F.DEVT_ID = :IDDOC 
                    INTO :ART, :IMPTOS
                    DO
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTACONSUMO, :CONC, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                    NROI = NROI + 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, :NROI, :CTACONSUMO, :CONC, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA + IMPTOS;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTACONSUMO, :CONC, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA + IMPTOS;
                END
            END  $$IBE$$*/ /* IMPTOS <> 0 */ /*$$IBE$$ 
        END  $$IBE$$*/ /* CONSUMO EN CTA CONSTANTE */
    /* DESCUENTO */ /*$$IBE$$ 
    if ((CTADTO IS NOT NULL) AND
        (CTADTO <> '') AND
        (VRDTO <> 0)) THEN
        BEGIN
        EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTADTO, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRDTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
            NROI = NROI + 1;
            SUMA = SUMA - VRDTO;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRDTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 33);
            NROI = NROI + 1;
            SUMA = SUMA - VRDTO;
            END
        END  $$IBE$$*/ /* DESCUENTO */
    /* VALOR ADIC */ /*$$IBE$$ 
    if ((CTAADIC IS NOT NULL) AND
        (CTAADIC <> '') AND
        (VRADIC <> 0)) THEN
        BEGIN
        EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTAADIC, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRADIC, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
            NROI = NROI + 1;
            SUMA = SUMA + VRADIC;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRADIC, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 33);
            NROI = NROI + 1;
            SUMA = SUMA + VRADIC;
            END
        END  $$IBE$$*/ /* VR. ADIC */
    /* VALOR EXTRA */ /*$$IBE$$ 
    if ((CTAEXTRA IS NOT NULL) AND
        (CTAEXTRA <> '') AND
        (VREXTRA <> 0)) THEN
        BEGIN
        EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTAEXTRA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VREXTRA, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
            NROI = NROI + 1;
            SUMA = SUMA + VREXTRA;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VREXTRA, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 33);
            NROI = NROI + 1;
            SUMA = SUMA + VREXTRA;
            END
        END  $$IBE$$*/ /* VR. EXTRA */
    /* RETENCION FUENTE */ /*$$IBE$$ 
    if ((RTFTE = 'C') or (RTFTE = 'K')) then
      if (VRRTFTE <> 0) then
        BEGIN
        if (RTFTE = 'C') then
            CTARTFTE = TCTARTFTE;
        EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTARTFTE, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, (:VRSUBT*-1), :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
            NROI = NROI + 1;
            SUMA = SUMA - VRRTFTE;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, (:VRSUBT*-1), :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA - VRRTFTE;
            END
         $$IBE$$*/ /* AUTORETENCION */ /*$$IBE$$ 
        if (FAUTORET <= fecaux) then
            BEGIN
            EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'CUENTA DE AUTORETENCION EN LA FUENTE') returning_values (CTARTFTE);
            EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTARTFTE, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :VRSUBT, :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                NROI = NROI + 1;
                SUMA = SUMA + VRRTFTE;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :VRSUBT, :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA + VRRTFTE;
                END
            END
        END  $$IBE$$*/ /* RTFTE */ /*$$IBE$$ 
    if (RTFTE = 'A') then
      BEGIN
      FOR SELECT MAX(COAR_CTARTFTEV), MAX(COAR_RTFTE), MIN(COAR_RTBASE), SUM(DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO), SUM((DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO)*COAR_RTFTE)
        FROM CONTABIL_ARTICULO C, devoluciones_ventas_detalle F
        WHERE F.devt_id = :IDDOC AND F.ARTI_COD = C.ARTI_COD
        GROUP BY COAR_CTARTFTEV
        INTO :CTARTFTE, :PRTFTE, :baseadic, :MONTO, :VRRTFTE
        DO
        BEGIN
        MONTO = MONTO * FACTOR;
        if (MONTO >= BASEADIC) then
            BEGIN
            VRRTFTE = VRRTFTE * FACTOR / 100;
            execute procedure redondee(VRRTFTE, DIG) returning_values (VRRTFTE);
            execute procedure redondee(MONTO, DIG) returning_values (MONTO);
            if (VRRTFTE <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTARTFTE, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, (:MONTO*-1), :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                    NROI = NROI + 1;
                    SUMA = SUMA - VRRTFTE;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, (:MONTO*-1), :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA - VRRTFTE;
                    END
                 $$IBE$$*/ /* AUTORETENCION */ /*$$IBE$$ 
                if (FAUTORET <= fecaux) then
                    BEGIN
                    EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'CUENTA DE AUTORETENCION EN LA FUENTE') returning_values (CTARTFTE);
                    EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTARTFTE, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
                    if (ERRORC <> 0) then
                        ERROR = ERROR + 1;
                    if (TIPOCUEN = 'C') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :MONTO, :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                        NROI = NROI + 1;
                        SUMA = SUMA + VRRTFTE;
                        END
                    if (TIPOCUEN = 'N') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :MONTO, :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NROI = NROI + 1;
                        SUMA = SUMA + VRRTFTE;
                        END
                    END
                END
            END
        END  $$IBE$$*/ /* RTFTE */ /*$$IBE$$ 
      END
     $$IBE$$*/ /* RETENCION IVA */ /*$$IBE$$ 
    if ((RTIVA = 'C') or (RTIVA = 'K')) then
      if (VRRTIVA <> 0) then
        BEGIN
        if (RTIVA = 'C') then
            CTARTIVA = TCTARTIVA;
        EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTARTIVA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTIVA, (:VRIVA*-1), :PORC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
            NROI = NROI + 1;
            SUMA = SUMA - VRRTIVA;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTIVA, (:VRIVA*-1), :PORC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA - VRRTIVA;
            END
        END  $$IBE$$*/ /* RTIVA */
    /* RETENCION DE ICA */ /*$$IBE$$ 
    if ((RTICA = 'C') or (RTICA = 'K')) then
      if (VRRTICA <> 0) then
        BEGIN
        if (RTICA = 'C') then
            CTARTICA = TCTARTICA;
        EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTARTICA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTICA, (:VRSUBT*-1), :PRTICA, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
            NROI = NROI + 1;
            SUMA = SUMA - VRRTICA;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTICA, (:VRSUBT*-1), :PRTICA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA - VRRTICA;
            END
        END  $$IBE$$*/ /* RTICA */
    /* CIERRE EL COMPROBANTE CONTRA LA CUENTA DEL TERCERO O LA CONSTANTE */ /*$$IBE$$ 
    if ((SUMA <> 0) and ((CARTERA = 'C') or (CARTERA = 'K') or (CARTERA = 'J'))) then
        BEGIN
        if (SUMA < 0) then
            BEGIN
            DEBITO = SUMA * -1;
            CREDITO = 0;
            END
        ELSE
            BEGIN
            DEBITO = 0;
            CREDITO = SUMA;
            END
        if (CARTERA = 'C') then
            CTACARTERA = TCTACLIEN;
        if (CARTERA = 'J') then
            BEGIN
             $$IBE$$*/ /* BUSQUE LA CUENTA DE LA CAJA */ /*$$IBE$$ 
            SELECT CAJA_CUENTA FROM CAJAS C, PUNTO_VENTA P
                WHERE P.CAJA_ID = C.CAJA_ID AND PTVT_ID = :PTOVTA
                INTO :CTACARTERA;
            END
        EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTACARTERA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :DEBITO, :CREDITO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
        if (TIPOCUEN = 'N') then
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :DEBITO, :CREDITO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
        NROI = NROI + 1;
        END  $$IBE$$*/ /* SUMA EN CARTERA */
    /* CALCULE COSTOS EN VENTAS */ /*$$IBE$$ 
    EXECUTE PROCEDURE COSTO_EN_VENTAS(33, :IDDOC);
    if (COSTOS = 'A') then
        BEGIN
        FOR SELECT MAX(CTACOS), SUM(cast(CANT as double precision) * COSTO)
            FROM COSTO_VENTAS
            GROUP BY CTACOS
            INTO :CTACOSTOS, :MONTO
        DO
            BEGIN
            if (MONTO <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTACOSTOS, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                     $$IBE$$*/ /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */ /*$$IBE$$ 
                    FOR SELECT ARTI_COD, cast(CANT as double precision) * COSTO
                        FROM COSTO_VENTAS
                        WHERE CTACOS = :CUENTA
                        INTO :ART, :MONTO
                    DO
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                    NROI = NROI + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    END
                END  $$IBE$$*/ /* MONTO <> 0 */ /*$$IBE$$ 
            END  $$IBE$$*/ /* FOR */ /*$$IBE$$ 
        END  $$IBE$$*/ /* COSTOS */ /*$$IBE$$ 
    if (COSTOS = 'K') then
        BEGIN
        SELECT SUM(cast(CANT as double precision) * COSTO)
            FROM COSTO_VENTAS
            INTO :MONTO;
        if (MONTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTACOSTOS, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'I') then
                BEGIN
                 $$IBE$$*/ /* ES UNA CUENTA DE INVENTARIO, REGISTRE UNO A UNO LOS ARTICULOS */ /*$$IBE$$ 
                FOR SELECT ARTI_COD, cast(CANT as double precision) * COSTO
                    FROM COSTO_VENTAS
                    INTO :ART, :MONTO
                DO
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTACOSTOS, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                    NROI = NROI + 1;
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTACOSTOS, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                NROI = NROI + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTACOSTOS, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                END
            END  $$IBE$$*/ /* MONTO <> 0 */ /*$$IBE$$ 
        END  $$IBE$$*/ /* COSTOS = K */ /*$$IBE$$ 
    if (INVEN = 'A') then
        BEGIN
        FOR SELECT MAX(CTAINV), SUM(cast(CANT as double precision) * COSTO)
            FROM COSTO_VENTAS
            GROUP BY CTAINV
            INTO :CTAINVEN, :MONTO
        DO
            BEGIN
            if (MONTO <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTAINVEN, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                     $$IBE$$*/ /* ES UNA CUENTA DE INVENTARIO, REGISTRE UNO A UNO LOS ARTICULOS */ /*$$IBE$$ 
                    FOR SELECT ARTI_COD, cast(CANT as double precision) * COSTO
                        FROM COSTO_VENTAS
                        WHERE CTAINV = :CUENTA
                        INTO :ART, :MONTO
                    DO
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                    NROI = NROI + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    END
                END  $$IBE$$*/ /* MONTO <> 0 */ /*$$IBE$$ 
            END  $$IBE$$*/ /* FOR */ /*$$IBE$$ 
        END  $$IBE$$*/ /* INVEN = A */ /*$$IBE$$ 
    if (INVEN = 'K') then
        BEGIN
        SELECT SUM(cast(CANT as double precision) * COSTO)
            FROM COSTO_VENTAS
            INTO :MONTO;
        if (MONTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTAINVEN, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'I') then
                BEGIN
                 $$IBE$$*/ /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */ /*$$IBE$$ 
                FOR SELECT ARTI_COD, cast(CANT as double precision) * COSTO
                    FROM COSTO_VENTAS
                    INTO :ART, :MONTO
                DO
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTAINVEN, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                    NROI = NROI + 1;
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAINVEN, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                NROI = NROI + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAINVEN, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                END
            END  $$IBE$$*/ /* MONTO <> 0 */ /*$$IBE$$ 
        END  $$IBE$$*/ /* INVEN = K */
    /* recorra las cuentas adicionales */ /*$$IBE$$ 
    FOR SELECT INVC_CUENTA, INVC_BASE, INVC_PORC, INVC_VALOR, INVC_DB
        FROM INTERFAZ_VENTAS_CTAS WHERE INVE_ID = :IDINTER
        INTO :CTADIC, :BASEADIC, :PORCADIC, :VALORADIC, :DBADIC
        DO
        BEGIN
        if (valoradic <> 0) then
            monto = valoradic;
        else
            BEGIN
            if (:BASEADIC = 'SUBTOTAL') then
                VALORADIC = vrsubt;
            if (:BASEADIC = 'DESCUENTO') then
                VALORADIC = VRDTO;
            if (:BASEADIC = 'IVA') then
                VALORADIC = VRIVA;
            if (:BASEADIC = 'ADICIONAL') then
                VALORADIC = VRADIC;
            if (:BASEADIC = 'EXTRA') then
                VALORADIC = VREXTRA;
            if (:BASEADIC = 'TOTAL') then
                VALORADIC = VRTOTAL;
            MONTO = VALORADIC * PORCADIC;
            END
        if (MONTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTADIC, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                if (DBADIC = 'S') then
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                ELSE
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                NROI = NROI + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                if (DBADIC = 'S') then
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                ELSE
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                END
            NROI = NROI + 1;
            END
        END
    if (error > 0) then
        ver = 'S';
    SUSPEND;
    END
   END  $$IBE$$*/ /* EXISTE LA INTERFAZ */ /*$$IBE$$ 
  ELSE
    BEGIN
    EXECUTE PROCEDURE ERROR (33, :IDDOC, :PREF, 1);
    ERROR = ERROR + 1;
    VER = 'S';
    SUSPEND;
    END
 $$IBE$$*/ SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE CONTABIL_FACTURA(
    IDDOC INTEGER,
    IDINTER INTEGER)
RETURNS (
    ERROR INTEGER,
    VER CHAR(1),
    IDC INTEGER)
AS
declare variable pref varchar(4);
declare variable num varchar(6);
declare variable numero varchar(10);
declare variable fecaux date;
declare variable fecha char(8);
declare variable conc varchar(60);
declare variable venceaux date;
declare variable vence char(8);
declare variable vrdto numeric(18,2);
declare variable vradic numeric(18,2);
declare variable vrsubt numeric(18,2);
declare variable vriva numeric(18,2);
declare variable prtfte numeric(9,2);
declare variable vrrtfte numeric(18,2);
declare variable vrrtiva numeric(18,2);
declare variable prtica numeric(9,2);
declare variable vrrtica numeric(18,2);
declare variable vrtotal numeric(18,2);
declare variable vrextra numeric(18,2);
declare variable tipocomp varchar(3);
declare variable prefcont varchar(4);
declare variable ventas char(1);
declare variable ctaventas varchar(20);
declare variable iva char(1);
declare variable ctaiva varchar(20);
declare variable consumo char(1);
declare variable ctaconsumo varchar(20);
declare variable cartera char(1);
declare variable ctacartera varchar(20);
declare variable rtfte char(1);
declare variable ctartfte varchar(20);
declare variable rtiva char(1);
declare variable ctartiva varchar(20);
declare variable rtica char(1);
declare variable ctartica varchar(20);
declare variable inven char(1);
declare variable ctainven varchar(20);
declare variable costos char(1);
declare variable ctacostos varchar(20);
declare variable ctadto varchar(20);
declare variable ctaadic varchar(20);
declare variable ctaextra varchar(20);
declare variable existe char(1);
declare variable cuenta varchar(20);
declare variable monto numeric(18,2);
declare variable tipocuen char(1);
declare variable nit varchar(20);
declare variable nombre varchar(60);
declare variable proy varchar(4);
declare variable centro varchar(4);
declare variable porc numeric(5,2);
declare variable debito numeric(18,2);
declare variable credito numeric(18,2);
declare variable nroi integer;
declare variable art varchar(15);
declare variable imptos numeric(18,2);
declare variable suma numeric(18,2);
declare variable porciva numeric(9,2);
declare variable tctaclien varchar(20);
declare variable tctaventa varchar(20);
declare variable tctartfte varchar(20);
declare variable tctartiva varchar(20);
declare variable tctartica varchar(20);
declare variable ctadic varchar(20);
declare variable baseadic varchar(20);
declare variable porcadic numeric(5,2);
declare variable valoradic numeric(18,2);
declare variable dbadic char(1);
declare variable ptovta integer;
declare variable anulado char(1);
declare variable dig integer;
declare variable mercancia numeric(18,2);
declare variable fomento varchar(2);
declare variable DTOXIT varchar(2);
declare variable vrconsumo numeric(18,2);
declare variable factor double precision;
declare variable cent char(1);
declare variable AUTORET VARCHAR(10);
declare variable FAUTORET DATE;
declare variable ERRORC INTEGER;
BEGIN /*$$IBE$$ 
EXECUTE PROCEDURE LEE_CONFIGURACION('COMPRAS', 'FACTURAS', 'USAR IMPOCONSUMO COMO PORCENTAJE DE FOMENTO') returning_values (FOMENTO);
EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'FECHA AUTORETENEDOR NO DESCONTAR RETENCIONES DEL SALDO PERO SI CONTABILIZARLAS') returning_values (AUTORET);
if (AUTORET <> '') then
    FAUTORET = CAST(AUTORET AS DATE);
else
    FAUTORET = '9999/12/31';
 $$IBE$$*/ /* BUSQUE LA INTERFACE */ /*$$IBE$$ 
EXISTE = 'N';
SELECT 'S', TICO_COD, PRCO_PRE, INVE_VENTAS, INVE_IVA, INVE_CONSUMO, INVE_CARTERA, INVE_RTFTE, INVE_RTIVA, INVE_RTICA, INVE_COSTO, INVE_INVEN, INVE_CTAVENTAS, INVE_CTAIVA, INVE_CTACONSUMO, INVE_CTADTO, INVE_CTAADIC, INVE_CTAEXTRA, INVE_CTACARTERA, INVE_CTARTFTE, INVE_CTARTIVA, INVE_CTARTICA, INVE_CTAINVEN, INVE_CTACOSTOS, INVE_CONFIRMAR, INVE_CENTRO
    FROM INTERFAZ_VENTAS
    WHERE INVE_ID = :IDINTER
    INTO :EXISTE, :TIPOCOMP, :PREFCONT, :VENTAS, :IVA, :CONSUMO, :CARTERA, :RTFTE, :RTIVA, :RTICA, :COSTOS, :INVEN, :CTAVENTAS, :CTAIVA, :CTACONSUMO, :CTADTO, :CTAADIC, :CTAEXTRA, :CTACARTERA, :CTARTFTE, :CTARTIVA, :CTARTICA, :CTAINVEN, :CTACOSTOS, :VER, :CENT;
if (EXISTE = 'S') then
  BEGIN
     $$IBE$$*/ /* BORRE CUALQUEIR CONTABILIZACION PREVIA */ /*$$IBE$$ 
    DELETE FROM CONTABILIZACION WHERE CNTB_TIPOREF = 31 AND CNTB_IDREF = :IDDOC;

   $$IBE$$*/ /* TRAIGA EL ENCABEZADO DE LA FACTURA */ /*$$IBE$$ 
  SELECT PREF_PRE, FACT_NUMERO, FACT_FECHA, F.TERC_NIT, PTVT_ID, FACT_VENCE, FACT_DTOMONTO, FACT_ADICIONAL, FACT_IVAMONTO, FACT_EXTRA, FACT_TOTAL, FACT_RTFTEPOR, FACT_RTFTEMONTO, FACT_RTIVAPOR, FACT_RTIVAMONTO, FACT_RTICAPOR, FACT_RTICAMONTO, FACT_NOMCLIENTE, TERC_CTARTFTE, TERC_CTARTIVA, TERC_CTARTICA, TERC_CTAVENTA, TERC_CTACLIENTE, FACT_ANULADO
        FROM FACTURAS F, TERCEROS T
        WHERE FACT_ID = :IDDOC AND F.TERC_NIT = T.TERC_NIT
        INTO :PREF, :NUM, :FECAUX, :NIT, :PTOVTA, :VENCEAUX, :VRDTO, :VRADIC, :VRIVA, :VREXTRA, :VRTOTAL, :PRTFTE, :VRRTFTE, :PORC, :VRRTIVA, :PRTICA, :VRRTICA, :NOMBRE, TCTARTFTE, TCTARTIVA, TCTARTICA, TCTAVENTA, TCTACLIEN, ANULADO;
  if (ANULADO = 'N') then
    BEGIN
     $$IBE$$*/ /* BUSQUE EL CENTRO DEL PUNTO, LA BODEGA, O EL PREFIJO  */ /*$$IBE$$ 
    IF (CENT = 'B') THEN
        SELECT B.BODE_CENTRO, B.BODE_PROY FROM BODEGA B, FACTURAS F
            WHERE B.BODE_COD = F.BODE_COD AND F.FACT_ID = :IDDOC INTO :CENTRO, :PROY;
    IF (CENT = 'V') THEN
        SELECT V.CENT_COD, V.PROY_COD FROM VENDEDORES V, FACTURAS F
            WHERE V.VEND_COD = F.VEND_COD AND F.FACT_ID = :IDDOC INTO :CENTRO, :PROY;
    IF (CENT = 'P') THEN
        SELECT P.PREF_CENTRO,P.PREF_PROY  FROM PREFIJOS P, FACTURAS F
            WHERE P.PREF_PRE = F.PREF_PRE AND F.FACT_ID = :IDDOC AND P.TIDO_COD = 31 INTO :CENTRO, :PROY;
    NUMERO = PREF || NUM;
    SELECT SUM (FADE_CONSUMO) FROM FACTURAS_DETALLE WHERE FACT_ID = :IDDOC AND FADE_REFERENCIA <> '.t'
        INTO MERCANCIA;
    VRSUBT = VRTOTAL - VREXTRA - VRIVA - MERCANCIA;  $$IBE$$*/ /* BASE DE RETEFTE Y RETEICA */ /*$$IBE$$ 

    EXECUTE PROCEDURE lee_configuracion ('FACTURACION', 'FACTURAS', 'DESCUENTO PIE FACTURA IGUAL A SUMA DE DESCUENTOS POR ITEM') returning_values (:DTOXIT);
    if (DTOXIT = 'SI') then
        VRDTO = 0;
    MERCANCIA = VRSUBT - VRADIC + VRDTO;
    EXECUTE PROCEDURE FECHA_A_CONTA(:FECAUX) returning_values (:FECHA);
    EXECUTE PROCEDURE FECHA_A_CONTA(:VENCEAUX) returning_values (:VENCE);
     $$IBE$$*/ /* REGISTRE EL ENCABEZADO CONTABLE */ /*$$IBE$$ 
    IDC = GEN_ID(ID_CONTABILIZA, 1);
    if (STRLEN(NOMBRE)> 43 ) then
      CONC = 'FV No.' || NUMERO || '-' || SUBSTR(NOMBRE,1,43);
    ELSE
      CONC = 'FV No.' || NUMERO || '-' || NOMBRE;
    INSERT INTO CONTABILIZACION (CNTB_ID, CNTB_TIPOCOMP, CNTB_PREFCNT, CNTB_NUMERO, CNTB_FECHA, CNTB_CONCEPTO, CNTB_REF, CNTB_TIPOREF, CNTB_IDREF, CNTB_PREFREF, CNTB_NUMREF, CNTB_PROCESADO)
        VALUES (:IDC, :TIPOCOMP, :PREFCONT, :NUM, :FECHA, :CONC, '', 31, :IDDOC, :PREF, :NUM, 'N');
    NROI = 0;
    SUMA = 0;
    ERROR = 0;
     $$IBE$$*/ /* SI NO HAY CUENTA DE DESCUENTO NI ADICIONAL CALCULE UN FACTOR PARA LAS VENTAS Y EL IVA */ /*$$IBE$$ 
    if (MERCANCIA <> 0) then
        FACTOR = CAST(VRSUBT AS DOUBLE PRECISION) / CAST(MERCANCIA AS DOUBLE PRECISION);
    ELSE
        FACTOR = 1;
     $$IBE$$*/ /* TRAIGA EL NUMERO DE DIGITOS PARA EL REDONDEO */ /*$$IBE$$ 
    SELECT CAST(CONF_VALOR AS INTEGER) FROM CONFIGURACION WHERE CONF_MODULO = 'FACTURACION' AND
        CONF_CATEGORIA = 'GENERAL' AND CONF_PROPIEDAD = 'REDONDEO AL MULTIPLO DE DIEZ EN TOTALES' INTO :DIG;
     $$IBE$$*/ /* CUENTAS DE VENTAS */ /*$$IBE$$ 
    if (VENTAS = 'A') then
        BEGIN
        FOR SELECT MAX(COAR_CTAVNT), SUM(FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), SUM(FADE_IVAMONTO), SUM(FADE_CONSUMO)
            FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_DETALLE F
            WHERE F.FACT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND FADE_REFERENCIA <> '.t'
            GROUP BY COAR_CTAVNT
            INTO :CTAVENTAS, :MONTO, :IMPTOS, :VRCONSUMO
            DO
            BEGIN
            if (FOMENTO = 'SI') then
                MONTO = MONTO + VRCONSUMO;
            if ((CTADTO IS NULL) OR (CTADTO = '')) then
                MONTO = MONTO * FACTOR;
            execute procedure redondee(MONTO, DIG) returning_values (MONTO);
            if (MONTO <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTAVENTAS, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                     $$IBE$$*/ /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */ /*$$IBE$$ 
                    FOR SELECT F.ARTI_COD, (FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), FADE_CONSUMO
                        FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_DETALLE F
                        WHERE F.FACT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTAINV = :CUENTA AND FADE_REFERENCIA <> '.t'
                        INTO :ART, :MONTO, :IMPTOS
                    DO
                        BEGIN
                        if (FOMENTO = 'SI') then
                            MONTO = MONTO + IMPTOS;
                        if ((CTADTO IS NULL) OR (CTADTO = '')) then
                            MONTO = MONTO * FACTOR;
                        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                        if (MONTO <> 0) then
                            BEGIN
                            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                            NROI = NROI + 1;
                            SUMA = SUMA - MONTO;
                            END
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    NROI = NROI + 1;
                    SUMA = SUMA - MONTO;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA - MONTO;
                    END
                END  $$IBE$$*/ /* MONTO <> 0 */ /*$$IBE$$ 
            END  $$IBE$$*/ /* FOR */ /*$$IBE$$ 
        END  $$IBE$$*/ /* VENTAS X ARTICULO */ /*$$IBE$$ 
     IF ((VENTAS = 'C') OR (VENTAS = 'K')) THEN
        BEGIN
        IF (VENTAS = 'C') THEN
            CTAVENTAS = TCTAVENTA;
        SELECT SUM(FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), SUM(FADE_IVAMONTO), SUM (FADE_CONSUMO)
            FROM FACTURAS_DETALLE F
            WHERE F.FACT_ID = :IDDOC AND FADE_REFERENCIA <> '.t'
            INTO :MONTO, :IMPTOS, :VRCONSUMO;
        if (FOMENTO = 'SI') then
            MONTO = MONTO + VRCONSUMO;
        if ((CTADTO IS NULL) OR (CTADTO = '')) then
            MONTO = MONTO * FACTOR;
        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
        if (MONTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTAVENTAS, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'I') then
                BEGIN
                 $$IBE$$*/ /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */ /*$$IBE$$ 
                FOR SELECT F.ARTI_COD, (FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), FADE_CONSUMO
                    FROM ARTICULO A, FACTURAS_DETALLE F
                    WHERE F.FACT_ID = :IDDOC  AND FADE_REFERENCIA <> '.t'
                    INTO :ART, :MONTO, :IMPTOS
                    DO
                    BEGIN
                    if (FOMENTO = 'SI') then
                        MONTO = MONTO + VRCONSUMO;
                    if ((CTADTO IS NULL) OR (CTADTO = '')) then
                        MONTO = MONTO * FACTOR;
                    execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                    if (MONTO <> 0) then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        SUMA = SUMA - MONTO;
                        END
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - MONTO;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - MONTO;
                END
            END  $$IBE$$*/ /* MONTO <> 0 */ /*$$IBE$$ 
        END  $$IBE$$*/ /* VENTAS DE CLIENTE O CONSTANTE */
    /* EL IVA EN VENTAS */ /*$$IBE$$ 
    if (IVA = 'A') then
        BEGIN
        FOR SELECT MAX(COAR_CTAIVAV), SUM(FADE_IVAMONTO), SUM(FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), sum(FADE_CONSUMO)
            FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_DETALLE F
            WHERE F.FACT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND FADE_REFERENCIA <> '.t'
            GROUP BY COAR_CTAIVAV
            INTO :CTAIVA, :IMPTOS, :MONTO, :VALORADIC
        DO
            BEGIN
            if (FOMENTO = 'SI') then
                MONTO = MONTO + VALORADIC;
            MONTO = MONTO * -1;
            MONTO = MONTO * FACTOR;
            IMPTOS = IMPTOS * FACTOR;
            execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
            execute procedure redondee(MONTO, DIG) returning_values (MONTO);
            if (IMPTOS <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTAIVA, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                     $$IBE$$*/ /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */ /*$$IBE$$ 
                    FOR SELECT F.ARTI_COD, FADE_IVAMONTO, (FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), TAIV_PORC, FADE_CONSUMO
                        FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_DETALLE F, TARIFA_IVA T
                        WHERE F.FACT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTAIVAV = :CUENTA AND A.TAIV_COD = T.TAIV_COD AND FADE_REFERENCIA <> '.t'
                        INTO :ART, :IMPTOS, :MONTO, :PORCIVA, :VALORADIC
                    DO
                        BEGIN
                        if (FOMENTO = 'SI') then
                            MONTO = MONTO + VALORADIC;
                        MONTO = MONTO * -1;
                        MONTO = MONTO * FACTOR;
                        IMPTOS = IMPTOS * FACTOR;
                        execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                        if (IMPTOS <> 0) then
                            BEGIN
                            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, :MONTO, :PORCIVA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                            NROI = NROI + 1;
                            SUMA = SUMA + DEBITO - CREDITO;
                            END
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, :MONTO, ABS(:IMPTOS*100/:MONTO), :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    NROI = NROI + 1;
                    SUMA = SUMA - IMPTOS;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, :MONTO, ABS(:IMPTOS*100/:MONTO), :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA - IMPTOS;
                    END
                END    $$IBE$$*/ /* IMPTOS <> 0 */ /*$$IBE$$ 
            END  $$IBE$$*/ /* FOR */ /*$$IBE$$ 
        END  $$IBE$$*/ /* IVA X ARTICULO */ /*$$IBE$$ 
    if (IVA = 'K') then  $$IBE$$*/ /* IVA EN CTA CONSTANTE */ /*$$IBE$$ 
        BEGIN
        SELECT SUM(FADE_IVAMONTO), SUM(FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), SUM(FADE_CONSUMO)
            FROM FACTURAS_DETALLE F
            WHERE F.FACT_ID = :IDDOC and FADE_IVAMONTO <> 0 AND FADE_REFERENCIA <> '.t'
            INTO :IMPTOS, :MONTO, :valoradic;
        if (FOMENTO = 'SI') then
            MONTO = MONTO + VALORADIC;
        MONTO = MONTO * -1;
        MONTO = MONTO * FACTOR;
        IMPTOS = IMPTOS * FACTOR;
        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
        execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
        if (IMPTOS <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTAIVA, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'I') then
                BEGIN
                 $$IBE$$*/ /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */ /*$$IBE$$ 
                FOR SELECT F.ARTI_COD, (FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), FADE_IVAMONTO, TAIV_PORC, FADE_CONSUMO
                    FROM ARTICULO A, FACTURAS_DETALLE F, TARIFA_IVA T
                    WHERE F.FACT_ID = :IDDOC AND A.TAIV_COD = T.TAIV_COD AND FADE_REFERENCIA <> '.t'
                    INTO :ART, :MONTO, :IMPTOS, :PORCIVA, :VALORADIC
                    DO
                    BEGIN
                    if (FOMENTO = 'SI') then
                        MONTO = MONTO + VALORADIC;
                    MONTO = MONTO * -1;
                    MONTO = MONTO * FACTOR;
                    IMPTOS = IMPTOS * FACTOR;
                    execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                    execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                    if (IMPTOS <> 0) then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', 0, :IMPTOS, :MONTO, :PORCIVA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        SUMA = SUMA - IMPTOS;
                        END
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', 0, :IMPTOS, :MONTO, ABS(:IMPTOS*100/:MONTO), :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - IMPTOS;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', 0, :IMPTOS, :MONTO, ABS(:IMPTOS*100/:MONTO), :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - IMPTOS;
                END
            END  $$IBE$$*/ /* IMPTOS <> 0 */ /*$$IBE$$ 
        END  $$IBE$$*/ /* IVA EN CTA CONSTANTE */
    /* EL IMPOCONSUMO */ /*$$IBE$$ 
    if ((CONSUMO = 'A') AND (FOMENTO <> 'SI')) then
        BEGIN
        FOR SELECT MAX(COAR_CTACONS), SUM(FADE_CONSUMO)
            FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_DETALLE F
            WHERE F.FACT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND FADE_REFERENCIA <> '.t'
            GROUP BY COAR_CTACONS
            INTO :CTACONSUMO, :IMPTOS
        DO
            BEGIN
            execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
            if (IMPTOS <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTACONSUMO, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                     $$IBE$$*/ /* ES UNA CUENTA DE INVENTARIO, REGISTRE UNO A UNO LOS ARTICULOS */ /*$$IBE$$ 
                    FOR SELECT F.ARTI_COD, FADE_CONSUMO
                        FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_DETALLE F
                        WHERE F.FACT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTACONS = :CUENTA AND FADE_REFERENCIA <> '.t'
                        INTO :ART, :IMPTOS
                    DO
                        BEGIN
                        execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                        if (IMPTOS <> 0) then
                            BEGIN
                            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                            NROI = NROI + 1;
                            SUMA = SUMA - IMPTOS;
                            END
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    NROI = NROI + 1;
                    SUMA = SUMA - IMPTOS;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA - IMPTOS;
                    END
                END  $$IBE$$*/ /* IMPTOS <> 0 */ /*$$IBE$$ 
            END  $$IBE$$*/ /* FOR */ /*$$IBE$$ 
        END  $$IBE$$*/ /* CONSUMO X ARTICULO */ /*$$IBE$$ 
    if ((CONSUMO = 'K') AND (FOMENTO <> 'SI')) then  $$IBE$$*/ /* CONSUMO EN CTA CONSTANTE */ /*$$IBE$$ 
        BEGIN
        SELECT SUM(FADE_CONSUMO)
            FROM FACTURAS_DETALLE F
            WHERE F.FACT_ID = :IDDOC  AND FADE_REFERENCIA <> '.t'
            INTO :IMPTOS;
        execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
        if (IMPTOS <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTACONSUMO, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'I') then
                BEGIN
                 $$IBE$$*/ /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */ /*$$IBE$$ 
                FOR SELECT F.ARTI_COD, FADE_CONSUMO
                    FROM ARTICULO A, FACTURAS_DETALLE F
                    WHERE F.FACT_ID = :IDDOC  AND FADE_REFERENCIA <> '.t'
                    INTO :ART, :IMPTOS
                    DO
                    BEGIN
                    execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                    if (IMPTOS <> 0) then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CTACONSUMO, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        SUMA = SUMA - IMPTOS;
                        END
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTACONSUMO, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - IMPTOS;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTACONSUMO, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - IMPTOS;
                END
            END  $$IBE$$*/ /* IMPTOS <> 0 */ /*$$IBE$$ 
        END  $$IBE$$*/ /* CONSUMO EN CTA CONSTANTE */
    /* DESCUENTO */ /*$$IBE$$ 
    if ((CTADTO IS NOT NULL) AND (CTADTO <> '')) then
        BEGIN
        execute procedure redondee(VRDTO, DIG) returning_values (VRDTO);
        if (VRDTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTADTO, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRDTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA + VRDTO;
                END
            if (TIPOCUEN = 'N') then
                    BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRDTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA + VRDTO;
                END
            END
        END  $$IBE$$*/ /* DESCUENTO */
    /* VALOR ADIC */ /*$$IBE$$ 
    if ((CTAADIC IS NOT NULL) AND (CTAADIC <> '')) then
        BEGIN
        execute procedure redondee(VRADIC, DIG) returning_values (VRADIC);
        if (VRADIC <> 0) THEN
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTAADIC, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRADIC, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - VRADIC;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRADIC, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - VRADIC;
                END
            END
        END  $$IBE$$*/ /* VR. ADIC */
    /* VALOR EXTRA */ /*$$IBE$$ 
    if ((CTAEXTRA IS NOT NULL) AND (CTAEXTRA <> '')) THEN
        BEGIN
        execute procedure redondee(VREXTRA, DIG) returning_values (VREXTRA);
        if (VREXTRA <> 0) THEN
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTAEXTRA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VREXTRA, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - VREXTRA;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VREXTRA, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - VREXTRA;
                END
            END
        END  $$IBE$$*/ /* VR. EXTRA */
    /* DESCUENTE EL IMPOCONSUMO */ /*$$IBE$$ 
    SELECT SUM(FADE_CONSUMO)
        FROM FACTURAS_DETALLE F WHERE F.FACT_ID = :IDDOC AND FADE_REFERENCIA <> '.t' INTO :IMPTOS;
    vrsubt = vrsubt - IMPTOS;
     $$IBE$$*/ /* RETENCION FUENTE */ /*$$IBE$$ 
    if ((RTFTE = 'C') or (RTFTE = 'K')) then
      BEGIN
      execute procedure redondee(VRRTFTE, DIG) returning_values (VRRTFTE);
      if (VRRTFTE <> 0) then
        BEGIN
        if (RTFTE = 'C') then
            CTARTFTE = TCTARTFTE;
        EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTARTFTE, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :VRSUBT, :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTFTE;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :VRSUBT, :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTFTE;
            END
         $$IBE$$*/ /* AUTORETENCION */ /*$$IBE$$ 
        if (FAUTORET <= fecaux) then
            BEGIN
            EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'CUENTA DE AUTORETENCION EN LA FUENTE') returning_values (CTARTFTE);
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTARTFTE INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERROR (31, :IDDOC, :CTARTFTE, 2);
                CUENTA = CTARTFTE;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                begin
                EXECUTE PROCEDURE ERROR (31, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, (:VRSUBT*-1), :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - VRRTFTE;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, (:VRSUBT*-1), :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - VRRTFTE;
                END
            END
        END  $$IBE$$*/ /* RTFTE */ /*$$IBE$$ 
      END
    if (RTFTE = 'A') then
      BEGIN
      FOR SELECT MAX(COAR_CTARTFTEV), MAX(COAR_RTFTE), MIN(COAR_RTBASE), SUM(FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), SUM((FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO)*COAR_RTFTE)
        FROM CONTABIL_ARTICULO C, FACTURAS_DETALLE F
        WHERE F.FACT_ID = :IDDOC AND F.ARTI_COD = C.ARTI_COD AND FADE_REFERENCIA <> '.t'
        GROUP BY COAR_CTARTFTEV
        INTO :CTARTFTE, :PRTFTE, :baseadic, :MONTO, :VRRTFTE
        DO
        BEGIN
        MONTO = MONTO * FACTOR;
        if (MONTO >= BASEADIC) then
            BEGIN
            VRRTFTE = VRRTFTE * FACTOR / 100;
            execute procedure redondee(VRRTFTE, DIG) returning_values (VRRTFTE);
            execute procedure redondee(MONTO, DIG) returning_values (MONTO);
            if (VRRTFTE <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTARTFTE, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :MONTO, :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    NROI = NROI + 1;
                    SUMA = SUMA + VRRTFTE;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :MONTO, :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA + VRRTFTE;
                    END
                 $$IBE$$*/ /* AUTORETENCION */ /*$$IBE$$ 
                if (FAUTORET <= fecaux) then
                    BEGIN
                    EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'CUENTA DE AUTORETENCION EN LA FUENTE') returning_values (CTARTFTE);
                    EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTARTFTE, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
                    if (ERRORC <> 0) then
                        ERROR = ERROR + 1;
                    if (TIPOCUEN = 'C') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, (:MONTO*-1), :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                        NROI = NROI + 1;
                        SUMA = SUMA - VRRTFTE;
                        END
                    if (TIPOCUEN = 'N') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, (:MONTO*-1), :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NROI = NROI + 1;
                        SUMA = SUMA - VRRTFTE;
                        END
                    END
                END
            END
        END  $$IBE$$*/ /* RTFTE */ /*$$IBE$$ 
      END
     $$IBE$$*/ /* RETENCION IVA */ /*$$IBE$$ 
    if ((RTIVA = 'C') or (RTIVA = 'K')) then
      BEGIN
      execute procedure redondee(VRRTIVA, DIG) returning_values (VRRTIVA);
      if (VRRTIVA <> 0) then
        BEGIN
        if (RTIVA = 'C') then
            CTARTIVA = TCTARTIVA;
        EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTARTIVA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTIVA, 0, :VRIVA, :PORC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTIVA;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTIVA, 0, :VRIVA, :PORC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTIVA;
            END
        END  $$IBE$$*/ /* RTIVA */ /*$$IBE$$ 
      END
     $$IBE$$*/ /* RETENCION DE ICA */ /*$$IBE$$ 
    if ((RTICA = 'C') or (RTICA = 'K')) then
      BEGIN
      execute procedure redondee(VRRTICA, DIG) returning_values (VRRTICA);
      if (VRRTICA <> 0) then
        BEGIN
        if (RTICA = 'C') then
            CTARTICA = TCTARTICA;
        EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTARTICA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTICA, 0, :VRSUBT, :PRTICA, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTICA;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTICA, 0, :VRSUBT, :PRTICA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTICA;
            END
        END  $$IBE$$*/ /* RTICA */ /*$$IBE$$ 
      END
     $$IBE$$*/ /* CIERRE EL COMPROBANTE CONTRA LA CUENTA DEL TERCERO O LA CONSTANTE */ /*$$IBE$$ 
    if ((SUMA <> 0) and ((CARTERA = 'C') or (CARTERA = 'K') or (CARTERA = 'J'))) then
        BEGIN
        if (SUMA < 0) then
            BEGIN
            DEBITO = SUMA * -1;
            CREDITO = 0;
            END
        ELSE
            BEGIN
            DEBITO = 0;
            CREDITO = SUMA;
            END
        if (CARTERA = 'C') then
            CTACARTERA = TCTACLIEN;
        if (CARTERA = 'J') then
            BEGIN
             $$IBE$$*/ /* BUSQUE LA CUENTA DE LA CAJA */ /*$$IBE$$ 
            SELECT CAJA_CUENTA FROM CAJAS C, PUNTO_VENTA P
                WHERE P.CAJA_ID = C.CAJA_ID AND PTVT_ID = :PTOVTA
                INTO :CTACARTERA;
            END
        EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTACARTERA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :DEBITO, :CREDITO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
        if (TIPOCUEN = 'N') then
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :DEBITO, :CREDITO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
        NROI = NROI + 1;
        END  $$IBE$$*/ /* SUMA EN CARTERA */
    /* CALCULE COSTOS EN VENTAS */ /*$$IBE$$ 
    EXECUTE PROCEDURE COSTO_EN_VENTAS(31, :IDDOC);
    if (COSTOS = 'A') then
        BEGIN
        FOR SELECT MAX(CTACOS), SUM(CAST(CANT AS DOUBLE PRECISION) * COSTO)
            FROM COSTO_VENTAS
            GROUP BY CTACOS
            INTO :CTACOSTOS, :MONTO
        DO
            BEGIN
            if (MONTO <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTACOSTOS, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                     $$IBE$$*/ /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */ /*$$IBE$$ 
                    FOR SELECT ARTI_COD, CANT * COSTO
                        FROM COSTO_VENTAS
                        WHERE CTACOS = :CUENTA
                        INTO :ART, :MONTO
                    DO
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    NROI = NROI + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    END
                END  $$IBE$$*/ /* MONTO <> 0 */ /*$$IBE$$ 
            END  $$IBE$$*/ /* FOR */ /*$$IBE$$ 
        END  $$IBE$$*/ /* COSTOS */ /*$$IBE$$ 
    if (COSTOS = 'K') then
        BEGIN
        SELECT SUM(CAST(CANT AS DOUBLE PRECISION) * COSTO)
            FROM COSTO_VENTAS
            INTO :MONTO;
        if (MONTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTACOSTOS, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'I') then
                BEGIN
                 $$IBE$$*/ /* ES UNA CUENTA DE INVENTARIO, REGISTRE UNO A UNO LOS ARTICULOS */ /*$$IBE$$ 
                FOR SELECT ARTI_COD, CANT * COSTO
                    FROM COSTO_VENTAS
                    INTO :ART, :MONTO
                DO
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTACOSTOS, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                    NROI = NROI + 1;
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTACOSTOS, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTACOSTOS, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                END
            END  $$IBE$$*/ /* MONTO <> 0 */ /*$$IBE$$ 
        END  $$IBE$$*/ /* COSTOS = K */ /*$$IBE$$ 
    if (INVEN = 'A') then
        BEGIN
        FOR SELECT MAX(CTAINV), SUM(CAST(CANT AS DOUBLE PRECISION) * COSTO)
            FROM COSTO_VENTAS
            GROUP BY CTAINV
            INTO :CTAINVEN, :MONTO
        DO
            BEGIN
            if (MONTO <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTAINVEN, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                     $$IBE$$*/ /* ES UNA CUENTA DE INVENTARIO, REGISTRE UNO A UNO LOS ARTICULOS */ /*$$IBE$$ 
                    FOR SELECT ARTI_COD, CANT * COSTO
                        FROM COSTO_VENTAS
                        WHERE CTAINV = :CUENTA
                        INTO :ART, :MONTO
                    DO
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    NROI = NROI + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    END
                END  $$IBE$$*/ /* MONTO <> 0 */ /*$$IBE$$ 
            END  $$IBE$$*/ /* FOR */ /*$$IBE$$ 
        END  $$IBE$$*/ /* INVEN = A */ /*$$IBE$$ 
    if (INVEN = 'K') then
        BEGIN
        SELECT SUM(CAST(CANT AS DOUBLE PRECISION) * COSTO)
            FROM COSTO_VENTAS
            INTO :MONTO;
        if (MONTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTAINVEN, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'I') then
                BEGIN
                 $$IBE$$*/ /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */ /*$$IBE$$ 
                FOR SELECT ARTI_COD, CANT * COSTO
                    FROM COSTO_VENTAS
                    INTO :ART, :MONTO
                DO
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTAINVEN, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                    NROI = NROI + 1;
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAINVEN, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAINVEN, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                END
            END  $$IBE$$*/ /* MONTO <> 0 */ /*$$IBE$$ 
        END  $$IBE$$*/ /* INVEN = K */
    /* recorra las cuentas adicionales */ /*$$IBE$$ 
    FOR SELECT INVC_CUENTA, INVC_BASE, INVC_PORC, INVC_VALOR, INVC_DB
        FROM INTERFAZ_VENTAS_CTAS
        WHERE INVE_ID = :IDINTER
        INTO :CTADIC, :BASEADIC, :PORCADIC, :VALORADIC, :DBADIC
        DO
        BEGIN
        if (VALORADIC <> 0) then
            MONTO = VALORADIC;
        ELSE
            BEGIN
            if (:BASEADIC = 'SUBTOTAL') then
                VALORADIC = vrsubt;
            if (:BASEADIC = 'DESCUENTO') then
                VALORADIC = VRDTO;
            if (:BASEADIC = 'IVA') then
                VALORADIC = VRIVA;
            if (:BASEADIC = 'ADICIONAL') then
                VALORADIC = VRADIC;
            if (:BASEADIC = 'EXTRA') then
                VALORADIC = VREXTRA;
            if (:BASEADIC = 'TOTAL') then
                VALORADIC = VRTOTAL;
            MONTO = VALORADIC * PORCADIC / 100;
            END
        if (MONTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTADIC, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                if (DBADIC = 'S') then
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                ELSE
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                if (DBADIC = 'S') then
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                ELSE
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                END
            NROI = NROI + 1;
            END
        END
    if (ERROR > 0) then
        VER = 'S';
    SUSPEND;
    END  $$IBE$$*/ /* NO ANULADO */ /*$$IBE$$ 
  END  $$IBE$$*/ /* EXISTE LA INTERFAZ */ /*$$IBE$$ 
ELSE
    BEGIN
    EXECUTE PROCEDURE ERROR (31, :IDDOC, :PREF, 1);
    ERROR = ERROR + 1;
    VER = 'S';
    SUSPEND;
    END
 $$IBE$$*/ SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

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

SET TERM ; ^

SET TERM ^ ;

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

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE DEVOLUCIONES_SIN_CONTABILIDAD(
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    ID INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    ESTADO VARCHAR(20),
    IDI INTEGER,
    IDC INTEGER)
AS
DECLARE VARIABLE VER CHAR(2);
declare variable FECICNT VARCHAR(10);
declare variable FECFCNT VARCHAR(10);
declare variable ERROR INTEGER;
declare variable idref INTEGER;
BEGIN /*$$IBE$$ 
EXECUTE PROCEDURE fecha_a_conta(FECINI) returning_values (FECICNT);
EXECUTE PROCEDURE fecha_a_conta(FECFIN) returning_values (FECFCNT);
FOR SELECT DEVT_ID, PREF_PRE, DEVT_NUMERO FROM devoluciones_ventas WHERE DEVT_ANULADO = 'N' AND
    DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN
    INTO :ID, :PREF, :NUMERO
DO
  BEGIN
  idref = null;
  SELECT ENCO_IDREF FROM COMPROBANTE_ENCABEZADO WHERE ENCO_TIPOREF = 33 AND ENCO_FECHA >= :FECICNT AND ENCO_FECHA <= :FECFCNT and ENCO_IDREF = :id into :idref;
  if (idref IS NULL) then
  begin
   ESTADO = 'PROCESANDO';
   SUSPEND;
   SELECT MAX(INVE_ID) FROM INTERFAZ_VENTAS WHERE PREF_PRE = :PREF AND TIDO_COD = 33 INTO :IDI;
   EXECUTE PROCEDURE contabil_devolcli (:ID, :IDI) RETURNING_VALUES (:ERROR, :VER, :IDC);
   if (ERROR = 0) then
    BEGIN
    EXECUTE PROCEDURE CONTABILIZA_PENDIENTE (:IDC);
    ESTADO = 'OK';
    END
   ELSE
    ESTADO = 'ERROR';
   suspend;
  End
  END
 $$IBE$$*/ SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE FACTURAS_SIN_CONTABILIDAD(
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    ID INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    ESTADO VARCHAR(20),
    IDI INTEGER,
    IDC INTEGER)
AS
DECLARE VARIABLE VER CHAR(2);
declare variable FECICNT VARCHAR(10);
declare variable FECFCNT VARCHAR(10);
declare variable ERROR INTEGER;
declare variable idref INTEGER;
BEGIN /*$$IBE$$ 
EXECUTE PROCEDURE fecha_a_conta(FECINI) returning_values (FECICNT);
EXECUTE PROCEDURE fecha_a_conta(FECFIN) returning_values (FECFCNT);
FOR SELECT FACT_ID, PREF_PRE, FACT_NUMERO FROM FACTURAS WHERE FACT_ANULADO = 'N' AND
    FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN INTO :ID, :PREF, :NUMERO
DO
  BEGIN
  idref = null;
  SELECT ENCO_IDREF FROM COMPROBANTE_ENCABEZADO WHERE ENCO_TIPOREF = 31 AND ENCO_FECHA >= :FECICNT AND ENCO_FECHA <= :FECFCNT and ENCO_IDREF = :ID into :idref;
  if (idref IS NULL) then
  begin
   ESTADO = 'PROCESANDO';
   ERROR = NULL;
   SUSPEND;
   SELECT MAX(INVE_ID) FROM INTERFAZ_VENTAS WHERE PREF_PRE = :PREF AND TIDO_COD = 31 INTO :IDI;
   EXECUTE PROCEDURE CONTABIL_FACTURA (:ID, :IDI) RETURNING_VALUES (:ERROR, VER, :IDC);
   if ((ERROR = 0) or (error IS NULL)) then
    BEGIN
    EXECUTE PROCEDURE CONTABILIZA_PENDIENTE (:IDC);
    ESTADO = 'OK';
    END
   ELSE
    ESTADO = 'ERROR';
   suspend;
  end
  END
 $$IBE$$*/ SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE CONTABILICE_COSTO_VENTAS(
    ID INTEGER,
    IDINTER INTEGER)
RETURNS (
    IDC INTEGER)
AS
declare variable PREF VARCHAR(4);
declare variable NUM VARCHAR(6);
declare variable NUMERO VARCHAR(10);
declare variable INVEN CHAR(1);
declare variable CTAINVEN VARCHAR(20);
declare variable COSTOS CHAR(1);
declare variable CTACOSTOS VARCHAR(20);
declare variable EXISTE CHAR(1);
declare variable CUENTA VARCHAR(20);
declare variable MONTO NUMERIC(18,2);
declare variable TIPOCUEN CHAR(1);
declare variable NIT VARCHAR(20);
declare variable PROY VARCHAR(4);
declare variable CENTRO VARCHAR(4);
declare variable ART VARCHAR(15);
declare variable ANULADO CHAR(1);
declare variable NROI INTEGER;
declare variable NUMROWS INTEGER;
declare variable CONC CHAR(120);
declare variable VENCEAUX DATE;
declare variable VENCE CHAR(8);
begin
/* TRAIGA EL ID DEL ENCABEZADO DEL COMPROBANTE CONTABLE */
SELECT ENCO_CONSEC FROM COMPROBANTE_ENCABEZADO WHERE ENCO_TIPOREF = 31 AND ENCO_IDREF = :ID INTO :IDC;
SELECT MAX(CODE_ITEM) FROM COMPROBANTE_DETALLE WHERE ENCO_CONSEC = :idc INTO :NROI;
NROI = NROI + 1;
/* EJECUTE LA PARTE DE CONTABIL_FACTURA QUE CORRESPONDE A LOS COSTOS */
EXISTE = 'N';
SELECT 'S', INVE_COSTO, INVE_INVEN, INVE_CTAINVEN, INVE_CTACOSTOS
    FROM INTERFAZ_VENTAS
    WHERE INVE_ID = :IDINTER
    INTO :EXISTE, :COSTOS, :INVEN, :CTAINVEN, :CTACOSTOS;
if (EXISTE = 'S') then
  BEGIN
  SELECT FACT_ANULADO, PREF_PRE, FACT_NUMERO, FACT_VENCE, TERC_NIT FROM FACTURAS F
        WHERE FACT_ID = :ID INTO :ANULADO, :PREF, :NUMERO, :VENCEAUX, :NIT;
  NUMERO = PREF || NUM;
  CONC = 'COSTO EN VENTAS FACTURA ' || :NUMERO;
  EXECUTE PROCEDURE FECHA_A_CONTA(:VENCEAUX) returning_values (:VENCE);
  if (ANULADO = 'N') then
    BEGIN
    SELECT BODE_CENTRO, BODE_PROY FROM BODEGA B, FACTURAS F, PUNTO_VENTA P
        WHERE B.BODE_COD = P.BODE_COD AND P.PTVT_ID = F.PTVT_ID AND F.FACT_ID = :ID INTO :CENTRO, :PROY;
    /* SE ASUME QUE NO HAN CAMBIADO LAS CUENTAS DE COSTOS, POR ESO SE HACE UPDATE A LOS MOVIMIENTOS DE ESAS CUENTAS */
    EXECUTE PROCEDURE COSTO_EN_VENTAS(31, :ID);
    if (COSTOS = 'A') then
        BEGIN
        FOR SELECT MAX(CTACOS), SUM(CANT * COSTO)
            FROM COSTO_VENTAS
            GROUP BY CTACOS
            INTO :CTACOSTOS, :MONTO
        DO
            BEGIN
            if (MONTO <> 0) then
                BEGIN
                CUENTA = NULL;
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :CTACOSTOS INTO :CUENTA, :TIPOCUEN;
                IF (CUENTA IS NULL) THEN
                    begin
                    EXCEPTION CUENTA_NO_EXISTE 'La cuenta ' || :ctacostos || ' no existe.';
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT ARTI_COD, CANT * COSTO
                        FROM COSTO_VENTAS
                        WHERE CTACOS = :CUENTA
                        INTO :ART, :MONTO
                    DO
                        BEGIN
                        SELECT COUNT(*) FROM COMPROBANTE_DETALLE WHERE CUEN_COD = :CUENTA AND ENCO_CONSEC = :IDC AND ARTI_COD = :ART INTO :NUMROWS;
                        if (NUMROWS = 0) then
                            BEGIN
                            INSERT INTO comprobante_detalle (ENCO_CONSEC, CODE_ITEM, CUEN_COD, CODE_CONCEPTO, CODE_REFER, CODE_DEBITO, CODE_CREDITO, CODE_BASE, CODE_PORC, TERC_NIT, PROY_COD, CENT_COD, CNDE_DOCNUMERO, CNDE_DOCAPLICA, DOCO_VENCE, ARTI_COD, CODE_TIPOAPL, CODE_TIPONUE)
                                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                            NROI = NROI + 1;
                            END
                        ELSE
                            UPDATE COMPROBANTE_DETALLE
                                SET CODE_DEBITO = :MONTO
                            WHERE CUEN_COD = :CUENTA AND ENCO_CONSEC = :IDC AND ARTI_COD = :ART;
                        END
                    END
                ELSE
                    BEGIN
                    SELECT COUNT(*) FROM COMPROBANTE_DETALLE WHERE CUEN_COD = :CUENTA AND ENCO_CONSEC = :IDC INTO :NUMROWS;
                    if (NUMROWS = 0) then
                        BEGIN
                        if (TIPOCUEN = 'C') then
                            INSERT INTO comprobante_detalle (ENCO_CONSEC, CODE_ITEM, CUEN_COD, CODE_CONCEPTO, CODE_REFER, CODE_DEBITO, CODE_CREDITO, CODE_BASE, CODE_PORC, TERC_NIT, PROY_COD, CENT_COD, CNDE_DOCNUMERO, CNDE_DOCAPLICA, DOCO_VENCE, ARTI_COD, CODE_TIPOAPL, CODE_TIPONUE)
                                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                        ELSE
                            INSERT INTO comprobante_detalle (ENCO_CONSEC, CODE_ITEM, CUEN_COD, CODE_CONCEPTO, CODE_REFER, CODE_DEBITO, CODE_CREDITO, CODE_BASE, CODE_PORC, TERC_NIT, PROY_COD, CENT_COD, CNDE_DOCNUMERO, CNDE_DOCAPLICA, DOCO_VENCE, ARTI_COD, CODE_TIPOAPL, CODE_TIPONUE)
                                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NROI = NROI + 1;
                        END
                    ELSE
                        UPDATE COMPROBANTE_DETALLE
                            SET CODE_DEBITO = :MONTO
                        WHERE CUEN_COD = :CUENTA AND ENCO_CONSEC = :IDC;
                    END
                END /* MONTO <> 0 */
            END /* FOR */
        END /* COSTOS */
    if (COSTOS = 'K') then
        BEGIN
        SELECT SUM(CANT * COSTO)
            FROM COSTO_VENTAS
            INTO :MONTO;
        if (MONTO <> 0) then
            BEGIN
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTACOSTOS INTO :CUENTA, :TIPOCUEN;
            IF (CUENTA IS NULL) THEN
                begin
                EXCEPTION CUENTA_NO_EXISTE 'La cuenta ' || :ctacostos || ' no existe.';
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, REGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT ARTI_COD, CANT * COSTO
                    FROM COSTO_VENTAS
                    INTO :ART, :MONTO
                DO
                    BEGIN
                    SELECT COUNT(*) FROM COMPROBANTE_DETALLE WHERE CUEN_COD = :CUENTA AND ENCO_CONSEC = :IDC AND ARTI_COD = :ART INTO :NUMROWS;
                    if (NUMROWS = 0) then
                        BEGIN
                            INSERT INTO comprobante_detalle (ENCO_CONSEC, CODE_ITEM, CUEN_COD, CODE_CONCEPTO, CODE_REFER, CODE_DEBITO, CODE_CREDITO, CODE_BASE, CODE_PORC, TERC_NIT, PROY_COD, CENT_COD, CNDE_DOCNUMERO, CNDE_DOCAPLICA, DOCO_VENCE, ARTI_COD, CODE_TIPOAPL, CODE_TIPONUE)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        END
                    ELSE
                        UPDATE COMPROBANTE_DETALLE
                            SET CODE_DEBITO = :MONTO
                        WHERE CUEN_COD = :CUENTA AND ENCO_CONSEC = :IDC AND ARTI_COD = :ART;
                    END
                END
            ELSE
                BEGIN
                SELECT COUNT(*) FROM COMPROBANTE_DETALLE WHERE CUEN_COD = :CUENTA AND ENCO_CONSEC = :IDC INTO :NUMROWS;
                if (NUMROWS = 0) then
                    BEGIN
                    if (TIPOCUEN = 'C') then
                        INSERT INTO comprobante_detalle (ENCO_CONSEC, CODE_ITEM, CUEN_COD, CODE_CONCEPTO, CODE_REFER, CODE_DEBITO, CODE_CREDITO, CODE_BASE, CODE_PORC, TERC_NIT, PROY_COD, CENT_COD, CNDE_DOCNUMERO, CNDE_DOCAPLICA, DOCO_VENCE, ARTI_COD, CODE_TIPOAPL, CODE_TIPONUE)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    ELSE
                        INSERT INTO comprobante_detalle (ENCO_CONSEC, CODE_ITEM, CUEN_COD, CODE_CONCEPTO, CODE_REFER, CODE_DEBITO, CODE_CREDITO, CODE_BASE, CODE_PORC, TERC_NIT, PROY_COD, CENT_COD, CNDE_DOCNUMERO, CNDE_DOCAPLICA, DOCO_VENCE, ARTI_COD, CODE_TIPOAPL, CODE_TIPONUE)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    END
                ELSE
                    UPDATE COMPROBANTE_DETALLE
                        SET CODE_DEBITO = :MONTO
                    WHERE CUEN_COD = :CUENTA AND ENCO_CONSEC = :IDC;
                END
            END /* MONTO <> 0 */
        END /* COSTOS = K */
    if (INVEN = 'A') then
        BEGIN
        FOR SELECT MAX(CTAINV), SUM(CANT * COSTO)
            FROM COSTO_VENTAS
            GROUP BY CTAINV
            INTO :CTAINVEN, :MONTO
        DO
            BEGIN
            if (MONTO <> 0) then
                BEGIN
                CUENTA = NULL;
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :CTAINVEN INTO :CUENTA, :TIPOCUEN;
                IF (CUENTA IS NULL) THEN
                    begin
                    EXCEPTION CUENTA_NO_EXISTE 'La cuenta ' || :ctainven || ' no existe.';
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, REGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT ARTI_COD, CANT * COSTO
                        FROM COSTO_VENTAS
                        WHERE CTAINV = :CUENTA
                        INTO :ART, :MONTO
                    DO
                        BEGIN
                        SELECT COUNT(*) FROM COMPROBANTE_DETALLE WHERE CUEN_COD = :CUENTA AND ENCO_CONSEC = :IDC AND ARTI_COD = :ART INTO :NUMROWS;
                        if (NUMROWS = 0) then
                            BEGIN
                            INSERT INTO comprobante_detalle (ENCO_CONSEC, CODE_ITEM, CUEN_COD, CODE_CONCEPTO, CODE_REFER, CODE_DEBITO, CODE_CREDITO, CODE_BASE, CODE_PORC, TERC_NIT, PROY_COD, CENT_COD, CNDE_DOCNUMERO, CNDE_DOCAPLICA, DOCO_VENCE, ARTI_COD, CODE_TIPOAPL, CODE_TIPONUE)
                                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                            NROI = NROI + 1;
                            END
                        ELSE
                            UPDATE COMPROBANTE_DETALLE
                                SET CODE_CREDITO = :MONTO
                            WHERE CUEN_COD = :CUENTA AND ENCO_CONSEC = :IDC AND ARTI_COD = :ART;
                        END
                    END
                ELSE
                    BEGIN
                    SELECT COUNT(*) FROM COMPROBANTE_DETALLE WHERE CUEN_COD = :CUENTA AND ENCO_CONSEC = :IDC INTO :NUMROWS;
                    if (NUMROWS = 0) then
                        BEGIN
                        if (TIPOCUEN = 'C') then
                            INSERT INTO comprobante_detalle (ENCO_CONSEC, CODE_ITEM, CUEN_COD, CODE_CONCEPTO, CODE_REFER, CODE_DEBITO, CODE_CREDITO, CODE_BASE, CODE_PORC, TERC_NIT, PROY_COD, CENT_COD, CNDE_DOCNUMERO, CNDE_DOCAPLICA, DOCO_VENCE, ARTI_COD, CODE_TIPOAPL, CODE_TIPONUE)
                                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                        ELSE
                            INSERT INTO comprobante_detalle (ENCO_CONSEC, CODE_ITEM, CUEN_COD, CODE_CONCEPTO, CODE_REFER, CODE_DEBITO, CODE_CREDITO, CODE_BASE, CODE_PORC, TERC_NIT, PROY_COD, CENT_COD, CNDE_DOCNUMERO, CNDE_DOCAPLICA, DOCO_VENCE, ARTI_COD, CODE_TIPOAPL, CODE_TIPONUE)
                                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NROI = NROI + 1;
                        END
                    ELSE
                        UPDATE COMPROBANTE_DETALLE
                            SET CODE_CREDITO = :MONTO
                        WHERE CUEN_COD = :CUENTA AND ENCO_CONSEC = :IDC;
                    END
                END /* MONTO <> 0 */
            END /* FOR */
        END /* INVEN = A */
    if (INVEN = 'K') then
        BEGIN
        SELECT SUM(CANT * COSTO)
            FROM COSTO_VENTAS
            INTO :MONTO;
        if (MONTO <> 0) then
            BEGIN
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTAINVEN INTO :CUENTA, :TIPOCUEN;
            IF (CUENTA IS NULL) THEN
                begin
                EXCEPTION CUENTA_NO_EXISTE 'La cuenta ' || :ctainven || ' no existe.';
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT ARTI_COD, CANT * COSTO
                    FROM COSTO_VENTAS
                    INTO :ART, :MONTO
                DO
                    BEGIN
                    SELECT COUNT(*) FROM COMPROBANTE_DETALLE WHERE CUEN_COD = :CUENTA AND ENCO_CONSEC = :IDC AND ARTI_COD = :ART INTO :NUMROWS;
                    if (NUMROWS = 0) then
                        BEGIN
                        INSERT INTO comprobante_detalle (ENCO_CONSEC, CODE_ITEM, CUEN_COD, CODE_CONCEPTO, CODE_REFER, CODE_DEBITO, CODE_CREDITO, CODE_BASE, CODE_PORC, TERC_NIT, PROY_COD, CENT_COD, CNDE_DOCNUMERO, CNDE_DOCAPLICA, DOCO_VENCE, ARTI_COD, CODE_TIPOAPL, CODE_TIPONUE)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        END
                    ELSE
                        UPDATE COMPROBANTE_DETALLE
                            SET CODE_CREDITO = :MONTO
                        WHERE CUEN_COD = :CUENTA AND ENCO_CONSEC = :IDC AND ARTI_COD = :ART;
                    END
                END
            ELSE
                BEGIN
                SELECT COUNT(*) FROM COMPROBANTE_DETALLE WHERE CUEN_COD = :CUENTA AND ENCO_CONSEC = :IDC INTO :NUMROWS;
                if (NUMROWS = 0) then
                    BEGIN
                    if (TIPOCUEN = 'C') then
                        INSERT INTO comprobante_detalle (ENCO_CONSEC, CODE_ITEM, CUEN_COD, CODE_CONCEPTO, CODE_REFER, CODE_DEBITO, CODE_CREDITO, CODE_BASE, CODE_PORC, TERC_NIT, PROY_COD, CENT_COD, CNDE_DOCNUMERO, CNDE_DOCAPLICA, DOCO_VENCE, ARTI_COD, CODE_TIPOAPL, CODE_TIPONUE)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    ELSE
                        INSERT INTO comprobante_detalle (ENCO_CONSEC, CODE_ITEM, CUEN_COD, CODE_CONCEPTO, CODE_REFER, CODE_DEBITO, CODE_CREDITO, CODE_BASE, CODE_PORC, TERC_NIT, PROY_COD, CENT_COD, CNDE_DOCNUMERO, CNDE_DOCAPLICA, DOCO_VENCE, ARTI_COD, CODE_TIPOAPL, CODE_TIPONUE)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    END
                ELSE
                    UPDATE COMPROBANTE_DETALLE
                        SET CODE_CREDITO = :MONTO
                    WHERE CUEN_COD = :CUENTA AND ENCO_CONSEC = :IDC;
                END
            END /* MONTO <> 0 */
        END /* INVEN = K */
    END
  END
end

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE CONTABIL_DEVOLCLI(
    IDDOC INTEGER,
    IDINTER INTEGER)
RETURNS (
    ERROR INTEGER,
    VER CHAR(1),
    IDC INTEGER)
AS
declare variable PREF VARCHAR(4);
declare variable NUM VARCHAR(6);
declare variable NUMERO VARCHAR(10);
declare variable FECAUX DATE;
declare variable FECHA CHAR(8);
declare variable CONC CHAR(120);
declare variable NUMFAC VARCHAR(10);
declare variable VRDTO NUMERIC(18, 2);
declare variable VRADIC NUMERIC(18, 2);
declare variable VRSUBT NUMERIC(18, 2);
declare variable VRIVA NUMERIC(18, 2);
declare variable PRTFTE NUMERIC(9, 2);
declare variable VRRTFTE NUMERIC(18, 2);
declare variable VRRTIVA NUMERIC(18, 2);
declare variable PRTICA NUMERIC(9, 2);
declare variable VRRTICA NUMERIC(18, 2);
declare variable VRTOTAL NUMERIC(18, 2);
declare variable VREXTRA NUMERIC(18, 2);
declare variable TIPOCOMP VARCHAR(3);
declare variable PREFCONT VARCHAR(4);
declare variable VENTAS CHAR(1);
declare variable CTAVENTAS VARCHAR(20);
declare variable IVA CHAR(1);
declare variable CTAIVA VARCHAR(20);
declare variable CONSUMO CHAR(1);
declare variable CTACONSUMO VARCHAR(20);
declare variable CARTERA CHAR(1);
declare variable CTACARTERA VARCHAR(20);
declare variable RTFTE CHAR(1);
declare variable CTARTFTE VARCHAR(20);
declare variable RTIVA CHAR(1);
declare variable CTARTIVA VARCHAR(20);
declare variable RTICA CHAR(1);
declare variable CTARTICA VARCHAR(20);
declare variable INVEN CHAR(1);
declare variable CTAINVEN VARCHAR(20);
declare variable COSTOS CHAR(1);
declare variable CTACOSTOS VARCHAR(20);
declare variable CTADTO VARCHAR(20);
declare variable CTAADIC VARCHAR(20);
declare variable CTAEXTRA VARCHAR(20);
declare variable EXISTE CHAR(1);
declare variable CUENTA VARCHAR(20);
declare variable MONTO NUMERIC(18,2);
declare variable TIPOCUEN CHAR(1);
declare variable NIT VARCHAR(20);
declare variable PROY VARCHAR(4);
declare variable CENTRO VARCHAR(4);
declare variable PORC NUMERIC(5,2);
declare variable DEBITO NUMERIC(18,2);
declare variable CREDITO NUMERIC(18,2);
declare variable NROI INTEGER;
declare variable ART VARCHAR(15);
declare variable IMPINC CHAR(1);
declare variable IMPTOS NUMERIC(18, 2);
declare variable SUMA NUMERIC(18,2);
declare variable PORCIVA NUMERIC(9,2);
declare variable TCTACLIEN VARCHAR(20);
declare variable TCTAVENTA VARCHAR(20);
declare variable TCTARTFTE VARCHAR(20);
declare variable TCTARTIVA VARCHAR(20);
declare variable TCTARTICA VARCHAR(20);
declare variable CTADIC VARCHAR(20);
declare variable BASEADIC VARCHAR(20);
declare variable PORCADIC NUMERIC(5,2);
declare variable VALORADIC NUMERIC(18,2);
declare variable DBADIC CHAR(1);
declare variable PTOVTA INTEGER;
declare variable ANULADO CHAR(1);
declare variable CENT CHAR(1);
DECLARE VARIABLE MERCANCIA NUMERIC(18,2);
declare variable FACTOR DOUBLE PRECISION;
declare variable DIG INTEGER;
DECLARE VARIABLE FOMENTO VARCHAR(2);
DECLARE VARIABLE VRCONSUMO NUMERIC(18,2);
declare variable AUTORET VARCHAR(10);
declare variable FAUTORET DATE;
declare variable IDREM INTEGER;
declare variable DTOXIT CHAR(2);
declare variable ERRORC INTEGER;
BEGIN
EXECUTE PROCEDURE LEE_CONFIGURACION('COMPRAS', 'FACTURAS', 'USAR IMPOCONSUMO COMO PORCENTAJE DE FOMENTO') returning_values (FOMENTO);
EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'FECHA AUTORETENEDOR NO DESCONTAR RETENCIONES DEL SALDO PERO SI CONTABILIZARLAS') returning_values (AUTORET);
if (AUTORET <> '') then
    FAUTORET = CAST(AUTORET AS DATE);
else
    FAUTORET = '9999/12/31';
  /* BUSQUE LA INTERFACE */
  EXISTE = 'N';
  SELECT 'S', TICO_COD, PRCO_PRE, INVE_VENTAS, INVE_IVA, INVE_CONSUMO, INVE_CARTERA, INVE_RTFTE, INVE_RTIVA, INVE_RTICA, INVE_COSTO, INVE_INVEN, INVE_CTAVENTAS, INVE_CTAIVA, INVE_CTACONSUMO, INVE_CTADTO, INVE_CTAADIC, INVE_CTAEXTRA, INVE_CTACARTERA, INVE_CTARTFTE, INVE_CTARTIVA, INVE_CTARTICA, INVE_CTAINVEN, INVE_CTACOSTOS, INVE_CONFIRMAR, INVE_CENTRO
    FROM INTERFAZ_VENTAS
    WHERE INVE_ID = :IDINTER
    INTO :EXISTE, :TIPOCOMP, :PREFCONT, :VENTAS, :IVA, :CONSUMO, :CARTERA, :RTFTE, :RTIVA, :RTICA, :COSTOS, :INVEN, :CTAVENTAS, :CTAIVA, :CTACONSUMO, :CTADTO, :CTAADIC, :CTAEXTRA, :CTACARTERA, :CTARTFTE, :CTARTIVA, :CTARTICA, :CTAINVEN, :CTACOSTOS, :VER, :CENT;
  if (EXISTE = 'S') then
   BEGIN
    /* BORRE CUALQUEIR CONTABILIZACION PREVIA */
    DELETE FROM CONTABILIZACION WHERE CNTB_TIPOREF = 33 AND CNTB_IDREF = :IDDOC;
    /* TRAIGA EL ENCABEZADO DE LA DEVOLUCION */
   SELECT PREF_PRE, DEVT_NUMERO, DEVT_FECHA, F.TERC_NIT, DEVT_IVAINC, PTVT_ID, DEVT_FACTURA, DEVT_DTOMONTO, DEVT_ADICIONAL, DEVT_IVAMONTO, DEVT_EXTRA, DEVT_TOTAL, DEVT_RTFTEPORC, DEVT_RTFTEMONTO, DEVT_RTIVAPORC, DEVT_RTIVAMONTO, DEVT_RTICAPORC, DEVT_RTICAMONTO, TERC_CTARTFTE, TERC_CTARTIVA, TERC_CTARTICA, TERC_CTAVENTA, TERC_CTACLIENTE, DEVT_ANULADO, DEVT_REMID
        FROM DEVOLUCIONES_VENTAS F, TERCEROS T
        WHERE DEVT_ID = :IDDOC AND F.TERC_NIT = T.TERC_NIT
        INTO :PREF, :NUM, :FECAUX, :NIT, :IMPINC, :PTOVTA, :NUMFAC, :VRDTO, :VRADIC, :VRIVA, :VREXTRA, :VRTOTAL, :PRTFTE, :VRRTFTE, :PORC, :VRRTIVA, :PRTICA, :VRRTICA, :TCTARTFTE, TCTARTIVA, TCTARTICA, TCTAVENTA, TCTACLIEN, ANULADO, :IDREM;
   if (idrem is null) Then
    IDREM = 0;
   if ((ANULADO = 'N') AND (IDREM = 0)) then
    BEGIN
    NUMERO = PREF || NUM;
    SELECT SUM(DVDE_CONSUMO) FROM devoluciones_ventas_detalle WHERE DEVT_ID = :iddoc INTO :MERCANCIA;
    VRSUBT = VRTOTAL - VREXTRA - VRIVA - MERCANCIA; /* BASE DE RETEFTE Y RETEICA */
    EXECUTE PROCEDURE lee_configuracion ('FACTURACION', 'DEVOLUCIONES', 'DESCUENTO PIE DEVOLUCION IGUAL A SUMA DE DESCUENTOS POR ITEM') returning_values (:DTOXIT);
    if (DTOXIT = 'SI') then
        VRDTO = 0;
    MERCANCIA = VRSUBT - VRADIC + VRDTO;
    IF (CENT = 'B') THEN
        SELECT B.BODE_CENTRO, B.BODE_PROY FROM BODEGA B, DEVOLUCIONES_VENTAS F
            WHERE B.BODE_COD = F.BODE_COD AND F.DEVT_ID = :IDDOC INTO :CENTRO, :PROY;
    IF (CENT = 'V') THEN
        SELECT V.CENT_COD, V.PROY_COD FROM VENDEDORES V, DEVOLUCIONES_VENTAS F
            WHERE V.VEND_COD = F.VEND_COD AND F.DEVT_ID = :IDDOC INTO :CENTRO, :PROY;
    IF (CENT = 'P') THEN
        SELECT P.PREF_CENTRO,P.PREF_PROY  FROM PREFIJOS P, DEVOLUCIONES_VENTAS F
            WHERE P.PREF_PRE = F.PREF_PRE AND F.DEVT_ID = :IDDOC AND P.TIDO_COD = 33 INTO :CENTRO, :PROY;
    EXECUTE PROCEDURE FECHA_A_CONTA(:FECAUX) returning_values (:FECHA);
    /* REGISTRE EL ENCABEZADO CONTABLE */
    IDC = GEN_ID(ID_CONTABILIZA, 1);
    CONC = 'DEVOLUCION VENTAS No. ' || NUMERO || ' EN FACTURA ' || NUMFAC;
    CONC = SUBSTR(CONC, 1, 60);
    INSERT INTO CONTABILIZACION (CNTB_ID, CNTB_TIPOCOMP, CNTB_PREFCNT, CNTB_NUMERO, CNTB_FECHA, CNTB_CONCEPTO, CNTB_REF, CNTB_TIPOREF, CNTB_IDREF, CNTB_PREFREF, CNTB_NUMREF, CNTB_PROCESADO)
        VALUES (:IDC, :TIPOCOMP, :PREFCONT, :NUM, :FECHA, :CONC, '', 33, :IDDOC, :PREF, :NUM, 'N');
    NROI = 0;
    SUMA = 0;
    ERROR = 0;
    /* SI NO HAY CUENTA DE DESCUENTO NI ADICIONAL CALCULE UN FACTOR PARA LAS VENTAS Y EL IVA */
    if (MERCANCIA <> 0) then
        FACTOR = CAST(VRSUBT AS DOUBLE PRECISION) / CAST(MERCANCIA AS DOUBLE PRECISION);
    ELSE
        FACTOR = 1;
    /* TRAIGA EL NUMERO DE DIGITOS PARA EL REDONDEO */
    SELECT CAST(CONF_VALOR AS INTEGER) FROM CONFIGURACION WHERE CONF_MODULO = 'FACTURACION' AND
        CONF_CATEGORIA = 'GENERAL' AND CONF_PROPIEDAD = 'REDONDEO AL MULTIPLO DE DIEZ EN TOTALES' INTO :DIG;
    /* CUENTAS DE VENTAS */
    if (VENTAS = 'A') then
        BEGIN
        FOR SELECT MAX(COAR_CTADEV), SUM(cast(DVDE_CANT as double precision) * (DVDE_PRUNIT-DVDE_DTOMONTO)), SUM(DVDE_IVAMONTO), SUM(DVDE_CONSUMO)
            FROM ARTICULO A, CONTABIL_ARTICULO C, DEVOLUCIONES_VENTAS_DETALLE F
            WHERE F.DEVT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD
            GROUP BY COAR_CTADEV
            INTO :CTAVENTAS, :MONTO, :IMPTOS, :VRCONSUMO
            DO
            BEGIN
            if (IMPINC = 'S') then
                if (FOMENTO = 'SI') then
                    MONTO = MONTO - IMPTOS;
                ELSE
                    MONTO = MONTO - IMPTOS - VRCONSUMO;
            ELSE
            if (FOMENTO = 'SI') then
            MONTO = MONTO + VRCONSUMO;
            if ((CTADTO IS NULL) OR (CTADTO = '')) then
                MONTO = MONTO * FACTOR;
            execute procedure redondee(MONTO, DIG) returning_values (MONTO);
            if (MONTO <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTAVENTAS, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT F.ARTI_COD, (cast(DVDE_CANT as double precision) * (DVDE_PRUNIT-DVDE_DTOMONTO)), (DVDE_IVAMONTO+DVDE_CONSUMO)
                        FROM ARTICULO A, CONTABIL_ARTICULO C, DEVOLUCIONES_VENTAS_DETALLE F
                        WHERE F.DEVT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTAINV = :CUENTA
                        INTO :ART, :MONTO, :IMPTOS
                    DO
                        BEGIN
                        if (IMPINC = 'S') then
                            MONTO = MONTO - IMPTOS;
                        if ((CTADTO IS NULL) OR (CTADTO = '')) then
                            MONTO = MONTO * FACTOR;
                        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        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, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                    NROI = NROI + 1;
                    SUMA = SUMA + MONTO;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA + MONTO;
                    END
                END /* MONTO <> 0 */
            END /* FOR */
        END /* VENTAS X ARTICULO */
     IF ((VENTAS = 'C') OR (VENTAS = 'K')) THEN
        BEGIN
        IF (VENTAS = 'C') THEN
            CTAVENTAS = TCTAVENTA;
        SELECT SUM(cast(DVDE_CANT as double precision) * (DVDE_PRUNIT-DVDE_DTOMONTO)), SUM(DVDE_IVAMONTO), SUM(DVDE_CONSUMO)
            FROM DEVOLUCIONES_VENTAS_DETALLE F
            WHERE F.DEVT_ID = :IDDOC 
            INTO :MONTO, :IMPTOS, :VRCONSUMO;
        if (IMPINC = 'S') then
            if (FOMENTO = 'SI') then
               MONTO = MONTO - IMPTOS;
            ELSE
               MONTO = MONTO - IMPTOS - VRCONSUMO;
        ELSE
         if (FOMENTO = 'SI') then
          MONTO = MONTO + VRCONSUMO;
        if ((CTADTO IS NULL) OR (CTADTO = '')) then
            MONTO = MONTO * FACTOR;
        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
        if (MONTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTAVENTAS, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT F.ARTI_COD, (cast(DVDE_CANT as double precision) * (DVDE_PRUNIT-DVDE_DTOMONTO)), (DVDE_IVAMONTO+DVDE_CONSUMO)
                    FROM ARTICULO A, DEVOLUCIONES_VENTAS_DETALLE F
                    WHERE F.DEVT_ID = :IDDOC
                    INTO :ART, :MONTO, :IMPTOS
                    DO
                    BEGIN
                    if (IMPINC = 'S') then
                        MONTO = MONTO - IMPTOS;
                    if ((CTADTO IS NULL) OR (CTADTO = '')) then
                        MONTO = MONTO * FACTOR;
                    execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                    NROI = NROI + 1;
                    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, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                NROI = NROI + 1;
                SUMA = SUMA + MONTO;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA + MONTO;
                END
            END /* MONTO <> 0 */
        END /* VENTAS DE CLIENTE O CONSTANTE */
    /* EL IVA EN VENTAS */
    if (IVA = 'A') then
        BEGIN
        FOR SELECT MAX(COAR_CTAIVAV), SUM(DVDE_IVAMONTO), SUM(DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO), SUM(DVDE_CONSUMO)
            FROM ARTICULO A, CONTABIL_ARTICULO C, DEVOLUCIONES_VENTAS_DETALLE F
            WHERE F.DEVT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD
            GROUP BY COAR_CTAIVAV
            INTO :CTAIVA, :IMPTOS, :MONTO, :VALORADIC
        DO
            BEGIN
            if (FOMENTO = 'SI') then
                MONTO = MONTO + VALORADIC;
            MONTO = MONTO * -1;
            MONTO = MONTO * FACTOR;
            IMPTOS = IMPTOS * FACTOR;
            execute procedure redondee(MONTO, DIG) returning_values (MONTO);
            execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
            if (IMPTOS <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTAIVA, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT F.ARTI_COD, DVDE_IVAMONTO, (cast(DVDE_CANT as double precision) * (DVDE_PRUNIT-DVDE_DTOMONTO)), TAIV_PORC, DVDE_CONSUMO
                        FROM ARTICULO A, CONTABIL_ARTICULO C, DEVOLUCIONES_VENTAS_DETALLE F, TARIFA_IVA T
                        WHERE F.DEVT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND A.TAIV_COD = T.TAIV_COD AND COAR_CTAIVAV = :CUENTA
                        INTO :ART, :IMPTOS, :MONTO, :PORCIVA, :VALORADIC
                    DO
                        BEGIN
                        if (IMPINC = 'S') then
                            MONTO = MONTO - IMPTOS - VALORADIC;
                        MONTO = MONTO * -1;
                        MONTO = MONTO * FACTOR;
                        IMPTOS = IMPTOS * FACTOR;
                        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                        execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                        if (IMPTOS <> 0) then
                            BEGIN
                            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :IMPTOS, 0, :MONTO, :PORCIVA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                            NROI = NROI + 1;
                            SUMA = SUMA + IMPTOS;
                            END
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                    NROI = NROI + 1;
                    SUMA = SUMA + IMPTOS;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA + IMPTOS;
                    END
                END   /* IMPTOS <> 0 */
            END /* FOR */
        END /* IVA X ARTICULO */
    if (IVA = 'K') then /* IVA EN CTA CONSTANTE */
        BEGIN
        SELECT SUM(DVDE_IVAMONTO), SUM(DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO), SUM(DVDE_CONSUMO)
            FROM DEVOLUCIONES_VENTAS_DETALLE F
            WHERE F.DEVT_ID = :IDDOC 
            INTO :IMPTOS, :MONTO, :VALORADIC;
        if (FOMENTO = 'SI') then
            MONTO = MONTO + VALORADIC;
        MONTO = MONTO * -1;
        MONTO = MONTO * FACTOR;
        IMPTOS = IMPTOS * FACTOR;
        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
        execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
        if (IMPTOS <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTAIVA, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT F.ARTI_COD, (cast(DVDE_CANT as double precision) * (DVDE_PRUNIT-DVDE_DTOMONTO)), DVDE_IVAMONTO, TAIV_PORC, DVDE_CONSUMO
                    FROM ARTICULO A, DEVOLUCIONES_VENTAS_DETALLE F, TARIFA_IVA T
                    WHERE F.DEVT_ID = :IDDOC AND A.TAIV_COD = T.TAIV_COD
                    INTO :ART, :MONTO, :IMPTOS, :PORCIVA, :VALORADIC
                    DO
                    BEGIN
                    if (IMPINC = 'S') then
                        MONTO = MONTO - IMPTOS - VALORADIC;
                    MONTO = MONTO * -1;
                    MONTO = MONTO * FACTOR;
                    IMPTOS = IMPTOS * FACTOR;
                    execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                    execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                    if (IMPTOS <> 0) then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', :IMPTOS, 0, :MONTO, :PORCIVA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        SUMA = SUMA + IMPTOS;
                        END
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                NROI = NROI + 1;
                SUMA = SUMA + IMPTOS;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA + IMPTOS;
                END
            END /* IMPTOS <> 0 */
        END /* IVA EN CTA CONSTANTE */
    /* EL IMPOCONSUMO */
    if ((CONSUMO = 'A') AND (FOMENTO <> 'SI')) then
        BEGIN
        FOR SELECT MAX(COAR_CTACONS), SUM(DVDE_CONSUMO)
            FROM ARTICULO A, CONTABIL_ARTICULO C, DEVOLUCIONES_VENTAS_DETALLE F
            WHERE F.DEVT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD
            GROUP BY COAR_CTACONS
            INTO :CTACONSUMO, :IMPTOS
        DO
            BEGIN
            if (IMPTOS <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTACONSUMO, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, REGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT F.ARTI_COD, DVDE_CONSUMO
                        FROM ARTICULO A, CONTABIL_ARTICULO C, DEVOLUCIONES_VENTAS_DETALLE F
                        WHERE F.DEVT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTACONS = :CUENTA
                        INTO :ART, :IMPTOS
                    DO
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 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, :NROI, :CUENTA, :CONC, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                    NROI = NROI + 1;
                    SUMA = SUMA + IMPTOS;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA + IMPTOS;
                    END
                END /* IMPTOS <> 0 */
            END /* FOR */
        END /* CONSUMO X ARTICULO */
    if ((CONSUMO = 'K') AND (FOMENTO <> 'SI')) then
        BEGIN
        SELECT SUM(DVDE_CONSUMO)
            FROM DEVOLUCIONES_VENTAS_DETALLE F
            WHERE F.DEVT_ID = :IDDOC 
            INTO :IMPTOS;
        if (IMPTOS <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTACONSUMO, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT F.ARTI_COD, DVDE_CONSUMO
                    FROM ARTICULO A, DEVOLUCIONES_VENTAS_DETALLE F
                    WHERE F.DEVT_ID = :IDDOC 
                    INTO :ART, :IMPTOS
                    DO
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTACONSUMO, :CONC, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                    NROI = NROI + 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, :NROI, :CTACONSUMO, :CONC, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA + IMPTOS;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTACONSUMO, :CONC, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA + IMPTOS;
                END
            END /* IMPTOS <> 0 */
        END /* CONSUMO EN CTA CONSTANTE */
    /* DESCUENTO */
    if ((CTADTO IS NOT NULL) AND
        (CTADTO <> '') AND
        (VRDTO <> 0)) THEN
        BEGIN
        EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTADTO, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRDTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
            NROI = NROI + 1;
            SUMA = SUMA - VRDTO;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRDTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 33);
            NROI = NROI + 1;
            SUMA = SUMA - VRDTO;
            END
        END /* DESCUENTO */
    /* VALOR ADIC */
    if ((CTAADIC IS NOT NULL) AND
        (CTAADIC <> '') AND
        (VRADIC <> 0)) THEN
        BEGIN
        EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTAADIC, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRADIC, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
            NROI = NROI + 1;
            SUMA = SUMA + VRADIC;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRADIC, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 33);
            NROI = NROI + 1;
            SUMA = SUMA + VRADIC;
            END
        END /* VR. ADIC */
    /* VALOR EXTRA */
    if ((CTAEXTRA IS NOT NULL) AND
        (CTAEXTRA <> '') AND
        (VREXTRA <> 0)) THEN
        BEGIN
        EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTAEXTRA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VREXTRA, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
            NROI = NROI + 1;
            SUMA = SUMA + VREXTRA;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VREXTRA, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 33);
            NROI = NROI + 1;
            SUMA = SUMA + VREXTRA;
            END
        END /* VR. EXTRA */
    /* RETENCION FUENTE */
    if ((RTFTE = 'C') or (RTFTE = 'K')) then
      if (VRRTFTE <> 0) then
        BEGIN
        if (RTFTE = 'C') then
            CTARTFTE = TCTARTFTE;
        EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTARTFTE, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, (:VRSUBT*-1), :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
            NROI = NROI + 1;
            SUMA = SUMA - VRRTFTE;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, (:VRSUBT*-1), :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA - VRRTFTE;
            END
        /* AUTORETENCION */
        if (FAUTORET <= fecaux) then
            BEGIN
            EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'CUENTA DE AUTORETENCION EN LA FUENTE') returning_values (CTARTFTE);
            EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTARTFTE, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :VRSUBT, :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                NROI = NROI + 1;
                SUMA = SUMA + VRRTFTE;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :VRSUBT, :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA + VRRTFTE;
                END
            END
        END /* RTFTE */
    if (RTFTE = 'A') then
      BEGIN
      FOR SELECT MAX(COAR_CTARTFTEV), MAX(COAR_RTFTE), MIN(COAR_RTBASE), SUM(DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO), SUM((DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO)*COAR_RTFTE)
        FROM CONTABIL_ARTICULO C, devoluciones_ventas_detalle F
        WHERE F.devt_id = :IDDOC AND F.ARTI_COD = C.ARTI_COD
        GROUP BY COAR_CTARTFTEV
        INTO :CTARTFTE, :PRTFTE, :baseadic, :MONTO, :VRRTFTE
        DO
        BEGIN
        MONTO = MONTO * FACTOR;
        if (MONTO >= BASEADIC) then
            BEGIN
            VRRTFTE = VRRTFTE * FACTOR / 100;
            execute procedure redondee(VRRTFTE, DIG) returning_values (VRRTFTE);
            execute procedure redondee(MONTO, DIG) returning_values (MONTO);
            if (VRRTFTE <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTARTFTE, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, (:MONTO*-1), :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                    NROI = NROI + 1;
                    SUMA = SUMA - VRRTFTE;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, (:MONTO*-1), :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA - VRRTFTE;
                    END
                /* AUTORETENCION */
                if (FAUTORET <= fecaux) then
                    BEGIN
                    EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'CUENTA DE AUTORETENCION EN LA FUENTE') returning_values (CTARTFTE);
                    EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTARTFTE, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
                    if (ERRORC <> 0) then
                        ERROR = ERROR + 1;
                    if (TIPOCUEN = 'C') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :MONTO, :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                        NROI = NROI + 1;
                        SUMA = SUMA + VRRTFTE;
                        END
                    if (TIPOCUEN = 'N') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :MONTO, :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NROI = NROI + 1;
                        SUMA = SUMA + VRRTFTE;
                        END
                    END
                END
            END
        END /* RTFTE */
      END
    /* RETENCION IVA */
    if ((RTIVA = 'C') or (RTIVA = 'K')) then
      if (VRRTIVA <> 0) then
        BEGIN
        if (RTIVA = 'C') then
            CTARTIVA = TCTARTIVA;
        EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTARTIVA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTIVA, (:VRIVA*-1), :PORC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
            NROI = NROI + 1;
            SUMA = SUMA - VRRTIVA;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTIVA, (:VRIVA*-1), :PORC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA - VRRTIVA;
            END
        END /* RTIVA */
    /* RETENCION DE ICA */
    if ((RTICA = 'C') or (RTICA = 'K')) then
      if (VRRTICA <> 0) then
        BEGIN
        if (RTICA = 'C') then
            CTARTICA = TCTARTICA;
        EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTARTICA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTICA, (:VRSUBT*-1), :PRTICA, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
            NROI = NROI + 1;
            SUMA = SUMA - VRRTICA;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTICA, (:VRSUBT*-1), :PRTICA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA - VRRTICA;
            END
        END /* RTICA */
    /* CIERRE EL COMPROBANTE CONTRA LA CUENTA DEL TERCERO O LA CONSTANTE */
    if ((SUMA <> 0) and ((CARTERA = 'C') or (CARTERA = 'K') or (CARTERA = 'J'))) then
        BEGIN
        if (SUMA < 0) then
            BEGIN
            DEBITO = SUMA * -1;
            CREDITO = 0;
            END
        ELSE
            BEGIN
            DEBITO = 0;
            CREDITO = SUMA;
            END
        if (CARTERA = 'C') then
            CTACARTERA = TCTACLIEN;
        if (CARTERA = 'J') then
            BEGIN
            /* BUSQUE LA CUENTA DE LA CAJA */
            SELECT CAJA_CUENTA FROM CAJAS C, PUNTO_VENTA P
                WHERE P.CAJA_ID = C.CAJA_ID AND PTVT_ID = :PTOVTA
                INTO :CTACARTERA;
            END
        EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTACARTERA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :DEBITO, :CREDITO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
        if (TIPOCUEN = 'N') then
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :DEBITO, :CREDITO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
        NROI = NROI + 1;
        END /* SUMA EN CARTERA */
    /* CALCULE COSTOS EN VENTAS */
    EXECUTE PROCEDURE COSTO_EN_VENTAS(33, :IDDOC);
    if (COSTOS = 'A') then
        BEGIN
        FOR SELECT MAX(CTACOS), SUM(cast(CANT as double precision) * COSTO)
            FROM COSTO_VENTAS
            GROUP BY CTACOS
            INTO :CTACOSTOS, :MONTO
        DO
            BEGIN
            if (MONTO <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTACOSTOS, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT ARTI_COD, cast(CANT as double precision) * COSTO
                        FROM COSTO_VENTAS
                        WHERE CTACOS = :CUENTA
                        INTO :ART, :MONTO
                    DO
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                    NROI = NROI + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    END
                END /* MONTO <> 0 */
            END /* FOR */
        END /* COSTOS */
    if (COSTOS = 'K') then
        BEGIN
        SELECT SUM(cast(CANT as double precision) * COSTO)
            FROM COSTO_VENTAS
            INTO :MONTO;
        if (MONTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTACOSTOS, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, REGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT ARTI_COD, cast(CANT as double precision) * COSTO
                    FROM COSTO_VENTAS
                    INTO :ART, :MONTO
                DO
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTACOSTOS, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                    NROI = NROI + 1;
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTACOSTOS, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                NROI = NROI + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTACOSTOS, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                END
            END /* MONTO <> 0 */
        END /* COSTOS = K */
    if (INVEN = 'A') then
        BEGIN
        FOR SELECT MAX(CTAINV), SUM(cast(CANT as double precision) * COSTO)
            FROM COSTO_VENTAS
            GROUP BY CTAINV
            INTO :CTAINVEN, :MONTO
        DO
            BEGIN
            if (MONTO <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTAINVEN, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, REGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT ARTI_COD, cast(CANT as double precision) * COSTO
                        FROM COSTO_VENTAS
                        WHERE CTAINV = :CUENTA
                        INTO :ART, :MONTO
                    DO
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                    NROI = NROI + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    END
                END /* MONTO <> 0 */
            END /* FOR */
        END /* INVEN = A */
    if (INVEN = 'K') then
        BEGIN
        SELECT SUM(cast(CANT as double precision) * COSTO)
            FROM COSTO_VENTAS
            INTO :MONTO;
        if (MONTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTAINVEN, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT ARTI_COD, cast(CANT as double precision) * COSTO
                    FROM COSTO_VENTAS
                    INTO :ART, :MONTO
                DO
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTAINVEN, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                    NROI = NROI + 1;
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAINVEN, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                NROI = NROI + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAINVEN, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                END
            END /* MONTO <> 0 */
        END /* INVEN = K */
    /* recorra las cuentas adicionales */
    FOR SELECT INVC_CUENTA, INVC_BASE, INVC_PORC, INVC_VALOR, INVC_DB
        FROM INTERFAZ_VENTAS_CTAS WHERE INVE_ID = :IDINTER
        INTO :CTADIC, :BASEADIC, :PORCADIC, :VALORADIC, :DBADIC
        DO
        BEGIN
        if (valoradic <> 0) then
            monto = valoradic;
        else
            BEGIN
            if (:BASEADIC = 'SUBTOTAL') then
                VALORADIC = vrsubt;
            if (:BASEADIC = 'DESCUENTO') then
                VALORADIC = VRDTO;
            if (:BASEADIC = 'IVA') then
                VALORADIC = VRIVA;
            if (:BASEADIC = 'ADICIONAL') then
                VALORADIC = VRADIC;
            if (:BASEADIC = 'EXTRA') then
                VALORADIC = VREXTRA;
            if (:BASEADIC = 'TOTAL') then
                VALORADIC = VRTOTAL;
            MONTO = VALORADIC * PORCADIC;
            END
        if (MONTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTADIC, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                if (DBADIC = 'S') then
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                ELSE
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                NROI = NROI + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                if (DBADIC = 'S') then
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                ELSE
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                END
            NROI = NROI + 1;
            END
        END
    if (error > 0) then
        ver = 'S';
    SUSPEND;
    END
   END /* EXISTE LA INTERFAZ */
  ELSE
    BEGIN
    EXECUTE PROCEDURE ERROR (33, :IDDOC, :PREF, 1);
    ERROR = ERROR + 1;
    VER = 'S';
    SUSPEND;
    END
END

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE CONTABIL_FACTURA(
    IDDOC INTEGER,
    IDINTER INTEGER)
RETURNS (
    ERROR INTEGER,
    VER CHAR(1),
    IDC INTEGER)
AS
declare variable pref varchar(4);
declare variable num varchar(6);
declare variable numero varchar(10);
declare variable fecaux date;
declare variable fecha char(8);
declare variable conc varchar(60);
declare variable venceaux date;
declare variable vence char(8);
declare variable vrdto numeric(18,2);
declare variable vradic numeric(18,2);
declare variable vrsubt numeric(18,2);
declare variable vriva numeric(18,2);
declare variable prtfte numeric(9,2);
declare variable vrrtfte numeric(18,2);
declare variable vrrtiva numeric(18,2);
declare variable prtica numeric(9,2);
declare variable vrrtica numeric(18,2);
declare variable vrtotal numeric(18,2);
declare variable vrextra numeric(18,2);
declare variable tipocomp varchar(3);
declare variable prefcont varchar(4);
declare variable ventas char(1);
declare variable ctaventas varchar(20);
declare variable iva char(1);
declare variable ctaiva varchar(20);
declare variable consumo char(1);
declare variable ctaconsumo varchar(20);
declare variable cartera char(1);
declare variable ctacartera varchar(20);
declare variable rtfte char(1);
declare variable ctartfte varchar(20);
declare variable rtiva char(1);
declare variable ctartiva varchar(20);
declare variable rtica char(1);
declare variable ctartica varchar(20);
declare variable inven char(1);
declare variable ctainven varchar(20);
declare variable costos char(1);
declare variable ctacostos varchar(20);
declare variable ctadto varchar(20);
declare variable ctaadic varchar(20);
declare variable ctaextra varchar(20);
declare variable existe char(1);
declare variable cuenta varchar(20);
declare variable monto numeric(18,2);
declare variable tipocuen char(1);
declare variable nit varchar(20);
declare variable nombre varchar(60);
declare variable proy varchar(4);
declare variable centro varchar(4);
declare variable porc numeric(5,2);
declare variable debito numeric(18,2);
declare variable credito numeric(18,2);
declare variable nroi integer;
declare variable art varchar(15);
declare variable imptos numeric(18,2);
declare variable suma numeric(18,2);
declare variable porciva numeric(9,2);
declare variable tctaclien varchar(20);
declare variable tctaventa varchar(20);
declare variable tctartfte varchar(20);
declare variable tctartiva varchar(20);
declare variable tctartica varchar(20);
declare variable ctadic varchar(20);
declare variable baseadic varchar(20);
declare variable porcadic numeric(5,2);
declare variable valoradic numeric(18,2);
declare variable dbadic char(1);
declare variable ptovta integer;
declare variable anulado char(1);
declare variable dig integer;
declare variable mercancia numeric(18,2);
declare variable fomento varchar(2);
declare variable DTOXIT varchar(2);
declare variable vrconsumo numeric(18,2);
declare variable factor double precision;
declare variable cent char(1);
declare variable AUTORET VARCHAR(10);
declare variable FAUTORET DATE;
declare variable ERRORC INTEGER;
BEGIN
EXECUTE PROCEDURE LEE_CONFIGURACION('COMPRAS', 'FACTURAS', 'USAR IMPOCONSUMO COMO PORCENTAJE DE FOMENTO') returning_values (FOMENTO);
EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'FECHA AUTORETENEDOR NO DESCONTAR RETENCIONES DEL SALDO PERO SI CONTABILIZARLAS') returning_values (AUTORET);
if (AUTORET <> '') then
    FAUTORET = CAST(AUTORET AS DATE);
else
    FAUTORET = '9999/12/31';
/* BUSQUE LA INTERFACE */
EXISTE = 'N';
SELECT 'S', TICO_COD, PRCO_PRE, INVE_VENTAS, INVE_IVA, INVE_CONSUMO, INVE_CARTERA, INVE_RTFTE, INVE_RTIVA, INVE_RTICA, INVE_COSTO, INVE_INVEN, INVE_CTAVENTAS, INVE_CTAIVA, INVE_CTACONSUMO, INVE_CTADTO, INVE_CTAADIC, INVE_CTAEXTRA, INVE_CTACARTERA, INVE_CTARTFTE, INVE_CTARTIVA, INVE_CTARTICA, INVE_CTAINVEN, INVE_CTACOSTOS, INVE_CONFIRMAR, INVE_CENTRO
    FROM INTERFAZ_VENTAS
    WHERE INVE_ID = :IDINTER
    INTO :EXISTE, :TIPOCOMP, :PREFCONT, :VENTAS, :IVA, :CONSUMO, :CARTERA, :RTFTE, :RTIVA, :RTICA, :COSTOS, :INVEN, :CTAVENTAS, :CTAIVA, :CTACONSUMO, :CTADTO, :CTAADIC, :CTAEXTRA, :CTACARTERA, :CTARTFTE, :CTARTIVA, :CTARTICA, :CTAINVEN, :CTACOSTOS, :VER, :CENT;
if (EXISTE = 'S') then
  BEGIN
    /* BORRE CUALQUEIR CONTABILIZACION PREVIA */
    DELETE FROM CONTABILIZACION WHERE CNTB_TIPOREF = 31 AND CNTB_IDREF = :IDDOC;

  /* TRAIGA EL ENCABEZADO DE LA FACTURA */
  SELECT PREF_PRE, FACT_NUMERO, FACT_FECHA, F.TERC_NIT, PTVT_ID, FACT_VENCE, FACT_DTOMONTO, FACT_ADICIONAL, FACT_IVAMONTO, FACT_EXTRA, FACT_TOTAL, FACT_RTFTEPOR, FACT_RTFTEMONTO, FACT_RTIVAPOR, FACT_RTIVAMONTO, FACT_RTICAPOR, FACT_RTICAMONTO, FACT_NOMCLIENTE, TERC_CTARTFTE, TERC_CTARTIVA, TERC_CTARTICA, TERC_CTAVENTA, TERC_CTACLIENTE, FACT_ANULADO
        FROM FACTURAS F, TERCEROS T
        WHERE FACT_ID = :IDDOC AND F.TERC_NIT = T.TERC_NIT
        INTO :PREF, :NUM, :FECAUX, :NIT, :PTOVTA, :VENCEAUX, :VRDTO, :VRADIC, :VRIVA, :VREXTRA, :VRTOTAL, :PRTFTE, :VRRTFTE, :PORC, :VRRTIVA, :PRTICA, :VRRTICA, :NOMBRE, TCTARTFTE, TCTARTIVA, TCTARTICA, TCTAVENTA, TCTACLIEN, ANULADO;
  if (ANULADO = 'N') then
    BEGIN
    /* BUSQUE EL CENTRO DEL PUNTO, LA BODEGA, O EL PREFIJO  */
    IF (CENT = 'B') THEN
        SELECT B.BODE_CENTRO, B.BODE_PROY FROM BODEGA B, FACTURAS F
            WHERE B.BODE_COD = F.BODE_COD AND F.FACT_ID = :IDDOC INTO :CENTRO, :PROY;
    IF (CENT = 'V') THEN
        SELECT V.CENT_COD, V.PROY_COD FROM VENDEDORES V, FACTURAS F
            WHERE V.VEND_COD = F.VEND_COD AND F.FACT_ID = :IDDOC INTO :CENTRO, :PROY;
    IF (CENT = 'P') THEN
        SELECT P.PREF_CENTRO,P.PREF_PROY  FROM PREFIJOS P, FACTURAS F
            WHERE P.PREF_PRE = F.PREF_PRE AND F.FACT_ID = :IDDOC AND P.TIDO_COD = 31 INTO :CENTRO, :PROY;
    NUMERO = PREF || NUM;
    SELECT SUM (FADE_CONSUMO) FROM FACTURAS_DETALLE WHERE FACT_ID = :IDDOC AND FADE_REFERENCIA <> '.t'
        INTO MERCANCIA;
    VRSUBT = VRTOTAL - VREXTRA - VRIVA - MERCANCIA; /* BASE DE RETEFTE Y RETEICA */

    EXECUTE PROCEDURE lee_configuracion ('FACTURACION', 'FACTURAS', 'DESCUENTO PIE FACTURA IGUAL A SUMA DE DESCUENTOS POR ITEM') returning_values (:DTOXIT);
    if (DTOXIT = 'SI') then
        VRDTO = 0;
    MERCANCIA = VRSUBT - VRADIC + VRDTO;
    EXECUTE PROCEDURE FECHA_A_CONTA(:FECAUX) returning_values (:FECHA);
    EXECUTE PROCEDURE FECHA_A_CONTA(:VENCEAUX) returning_values (:VENCE);
    /* REGISTRE EL ENCABEZADO CONTABLE */
    IDC = GEN_ID(ID_CONTABILIZA, 1);
    if (STRLEN(NOMBRE)> 43 ) then
      CONC = 'FV No.' || NUMERO || '-' || SUBSTR(NOMBRE,1,43);
    ELSE
      CONC = 'FV No.' || NUMERO || '-' || NOMBRE;
    INSERT INTO CONTABILIZACION (CNTB_ID, CNTB_TIPOCOMP, CNTB_PREFCNT, CNTB_NUMERO, CNTB_FECHA, CNTB_CONCEPTO, CNTB_REF, CNTB_TIPOREF, CNTB_IDREF, CNTB_PREFREF, CNTB_NUMREF, CNTB_PROCESADO)
        VALUES (:IDC, :TIPOCOMP, :PREFCONT, :NUM, :FECHA, :CONC, '', 31, :IDDOC, :PREF, :NUM, 'N');
    NROI = 0;
    SUMA = 0;
    ERROR = 0;
    /* SI NO HAY CUENTA DE DESCUENTO NI ADICIONAL CALCULE UN FACTOR PARA LAS VENTAS Y EL IVA */
    if (MERCANCIA <> 0) then
        FACTOR = CAST(VRSUBT AS DOUBLE PRECISION) / CAST(MERCANCIA AS DOUBLE PRECISION);
    ELSE
        FACTOR = 1;
    /* TRAIGA EL NUMERO DE DIGITOS PARA EL REDONDEO */
    SELECT CAST(CONF_VALOR AS INTEGER) FROM CONFIGURACION WHERE CONF_MODULO = 'FACTURACION' AND
        CONF_CATEGORIA = 'GENERAL' AND CONF_PROPIEDAD = 'REDONDEO AL MULTIPLO DE DIEZ EN TOTALES' INTO :DIG;
    /* CUENTAS DE VENTAS */
    if (VENTAS = 'A') then
        BEGIN
        FOR SELECT MAX(COAR_CTAVNT), SUM(FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), SUM(FADE_IVAMONTO), SUM(FADE_CONSUMO)
            FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_DETALLE F
            WHERE F.FACT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND FADE_REFERENCIA <> '.t'
            GROUP BY COAR_CTAVNT
            INTO :CTAVENTAS, :MONTO, :IMPTOS, :VRCONSUMO
            DO
            BEGIN
            if (FOMENTO = 'SI') then
                MONTO = MONTO + VRCONSUMO;
            if ((CTADTO IS NULL) OR (CTADTO = '')) then
                MONTO = MONTO * FACTOR;
            execute procedure redondee(MONTO, DIG) returning_values (MONTO);
            if (MONTO <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTAVENTAS, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT F.ARTI_COD, (FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), FADE_CONSUMO
                        FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_DETALLE F
                        WHERE F.FACT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTAINV = :CUENTA AND FADE_REFERENCIA <> '.t'
                        INTO :ART, :MONTO, :IMPTOS
                    DO
                        BEGIN
                        if (FOMENTO = 'SI') then
                            MONTO = MONTO + IMPTOS;
                        if ((CTADTO IS NULL) OR (CTADTO = '')) then
                            MONTO = MONTO * FACTOR;
                        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                        if (MONTO <> 0) then
                            BEGIN
                            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                            NROI = NROI + 1;
                            SUMA = SUMA - MONTO;
                            END
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    NROI = NROI + 1;
                    SUMA = SUMA - MONTO;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA - MONTO;
                    END
                END /* MONTO <> 0 */
            END /* FOR */
        END /* VENTAS X ARTICULO */
     IF ((VENTAS = 'C') OR (VENTAS = 'K')) THEN
        BEGIN
        IF (VENTAS = 'C') THEN
            CTAVENTAS = TCTAVENTA;
        SELECT SUM(FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), SUM(FADE_IVAMONTO), SUM (FADE_CONSUMO)
            FROM FACTURAS_DETALLE F
            WHERE F.FACT_ID = :IDDOC AND FADE_REFERENCIA <> '.t'
            INTO :MONTO, :IMPTOS, :VRCONSUMO;
        if (FOMENTO = 'SI') then
            MONTO = MONTO + VRCONSUMO;
        if ((CTADTO IS NULL) OR (CTADTO = '')) then
            MONTO = MONTO * FACTOR;
        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
        if (MONTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTAVENTAS, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT F.ARTI_COD, (FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), FADE_CONSUMO
                    FROM ARTICULO A, FACTURAS_DETALLE F
                    WHERE F.FACT_ID = :IDDOC  AND FADE_REFERENCIA <> '.t'
                    INTO :ART, :MONTO, :IMPTOS
                    DO
                    BEGIN
                    if (FOMENTO = 'SI') then
                        MONTO = MONTO + VRCONSUMO;
                    if ((CTADTO IS NULL) OR (CTADTO = '')) then
                        MONTO = MONTO * FACTOR;
                    execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                    if (MONTO <> 0) then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        SUMA = SUMA - MONTO;
                        END
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - MONTO;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - MONTO;
                END
            END /* MONTO <> 0 */
        END /* VENTAS DE CLIENTE O CONSTANTE */
    /* EL IVA EN VENTAS */
    if (IVA = 'A') then
        BEGIN
        FOR SELECT MAX(COAR_CTAIVAV), SUM(FADE_IVAMONTO), SUM(FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), sum(FADE_CONSUMO)
            FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_DETALLE F
            WHERE F.FACT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND FADE_REFERENCIA <> '.t'
            GROUP BY COAR_CTAIVAV
            INTO :CTAIVA, :IMPTOS, :MONTO, :VALORADIC
        DO
            BEGIN
            if (FOMENTO = 'SI') then
                MONTO = MONTO + VALORADIC;
            MONTO = MONTO * -1;
            MONTO = MONTO * FACTOR;
            IMPTOS = IMPTOS * FACTOR;
            execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
            execute procedure redondee(MONTO, DIG) returning_values (MONTO);
            if (IMPTOS <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTAIVA, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT F.ARTI_COD, FADE_IVAMONTO, (FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), TAIV_PORC, FADE_CONSUMO
                        FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_DETALLE F, TARIFA_IVA T
                        WHERE F.FACT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTAIVAV = :CUENTA AND A.TAIV_COD = T.TAIV_COD AND FADE_REFERENCIA <> '.t'
                        INTO :ART, :IMPTOS, :MONTO, :PORCIVA, :VALORADIC
                    DO
                        BEGIN
                        if (FOMENTO = 'SI') then
                            MONTO = MONTO + VALORADIC;
                        MONTO = MONTO * -1;
                        MONTO = MONTO * FACTOR;
                        IMPTOS = IMPTOS * FACTOR;
                        execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                        if (IMPTOS <> 0) then
                            BEGIN
                            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, :MONTO, :PORCIVA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                            NROI = NROI + 1;
                            SUMA = SUMA + DEBITO - CREDITO;
                            END
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, :MONTO, ABS(:IMPTOS*100/:MONTO), :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    NROI = NROI + 1;
                    SUMA = SUMA - IMPTOS;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, :MONTO, ABS(:IMPTOS*100/:MONTO), :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA - IMPTOS;
                    END
                END   /* IMPTOS <> 0 */
            END /* FOR */
        END /* IVA X ARTICULO */
    if (IVA = 'K') then /* IVA EN CTA CONSTANTE */
        BEGIN
        SELECT SUM(FADE_IVAMONTO), SUM(FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), SUM(FADE_CONSUMO)
            FROM FACTURAS_DETALLE F
            WHERE F.FACT_ID = :IDDOC and FADE_IVAMONTO <> 0 AND FADE_REFERENCIA <> '.t'
            INTO :IMPTOS, :MONTO, :valoradic;
        if (FOMENTO = 'SI') then
            MONTO = MONTO + VALORADIC;
        MONTO = MONTO * -1;
        MONTO = MONTO * FACTOR;
        IMPTOS = IMPTOS * FACTOR;
        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
        execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
        if (IMPTOS <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTAIVA, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT F.ARTI_COD, (FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), FADE_IVAMONTO, TAIV_PORC, FADE_CONSUMO
                    FROM ARTICULO A, FACTURAS_DETALLE F, TARIFA_IVA T
                    WHERE F.FACT_ID = :IDDOC AND A.TAIV_COD = T.TAIV_COD AND FADE_REFERENCIA <> '.t'
                    INTO :ART, :MONTO, :IMPTOS, :PORCIVA, :VALORADIC
                    DO
                    BEGIN
                    if (FOMENTO = 'SI') then
                        MONTO = MONTO + VALORADIC;
                    MONTO = MONTO * -1;
                    MONTO = MONTO * FACTOR;
                    IMPTOS = IMPTOS * FACTOR;
                    execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                    execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                    if (IMPTOS <> 0) then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', 0, :IMPTOS, :MONTO, :PORCIVA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        SUMA = SUMA - IMPTOS;
                        END
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', 0, :IMPTOS, :MONTO, ABS(:IMPTOS*100/:MONTO), :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - IMPTOS;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', 0, :IMPTOS, :MONTO, ABS(:IMPTOS*100/:MONTO), :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - IMPTOS;
                END
            END /* IMPTOS <> 0 */
        END /* IVA EN CTA CONSTANTE */
    /* EL IMPOCONSUMO */
    if ((CONSUMO = 'A') AND (FOMENTO <> 'SI')) then
        BEGIN
        FOR SELECT MAX(COAR_CTACONS), SUM(FADE_CONSUMO)
            FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_DETALLE F
            WHERE F.FACT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND FADE_REFERENCIA <> '.t'
            GROUP BY COAR_CTACONS
            INTO :CTACONSUMO, :IMPTOS
        DO
            BEGIN
            execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
            if (IMPTOS <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTACONSUMO, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, REGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT F.ARTI_COD, FADE_CONSUMO
                        FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_DETALLE F
                        WHERE F.FACT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTACONS = :CUENTA AND FADE_REFERENCIA <> '.t'
                        INTO :ART, :IMPTOS
                    DO
                        BEGIN
                        execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                        if (IMPTOS <> 0) then
                            BEGIN
                            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                            NROI = NROI + 1;
                            SUMA = SUMA - IMPTOS;
                            END
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    NROI = NROI + 1;
                    SUMA = SUMA - IMPTOS;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA - IMPTOS;
                    END
                END /* IMPTOS <> 0 */
            END /* FOR */
        END /* CONSUMO X ARTICULO */
    if ((CONSUMO = 'K') AND (FOMENTO <> 'SI')) then /* CONSUMO EN CTA CONSTANTE */
        BEGIN
        SELECT SUM(FADE_CONSUMO)
            FROM FACTURAS_DETALLE F
            WHERE F.FACT_ID = :IDDOC  AND FADE_REFERENCIA <> '.t'
            INTO :IMPTOS;
        execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
        if (IMPTOS <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTACONSUMO, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT F.ARTI_COD, FADE_CONSUMO
                    FROM ARTICULO A, FACTURAS_DETALLE F
                    WHERE F.FACT_ID = :IDDOC  AND FADE_REFERENCIA <> '.t'
                    INTO :ART, :IMPTOS
                    DO
                    BEGIN
                    execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                    if (IMPTOS <> 0) then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CTACONSUMO, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        SUMA = SUMA - IMPTOS;
                        END
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTACONSUMO, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - IMPTOS;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTACONSUMO, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - IMPTOS;
                END
            END /* IMPTOS <> 0 */
        END /* CONSUMO EN CTA CONSTANTE */
    /* DESCUENTO */
    if ((CTADTO IS NOT NULL) AND (CTADTO <> '')) then
        BEGIN
        execute procedure redondee(VRDTO, DIG) returning_values (VRDTO);
        if (VRDTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTADTO, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRDTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA + VRDTO;
                END
            if (TIPOCUEN = 'N') then
                    BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRDTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA + VRDTO;
                END
            END
        END /* DESCUENTO */
    /* VALOR ADIC */
    if ((CTAADIC IS NOT NULL) AND (CTAADIC <> '')) then
        BEGIN
        execute procedure redondee(VRADIC, DIG) returning_values (VRADIC);
        if (VRADIC <> 0) THEN
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTAADIC, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRADIC, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - VRADIC;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRADIC, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - VRADIC;
                END
            END
        END /* VR. ADIC */
    /* VALOR EXTRA */
    if ((CTAEXTRA IS NOT NULL) AND (CTAEXTRA <> '')) THEN
        BEGIN
        execute procedure redondee(VREXTRA, DIG) returning_values (VREXTRA);
        if (VREXTRA <> 0) THEN
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTAEXTRA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VREXTRA, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - VREXTRA;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VREXTRA, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - VREXTRA;
                END
            END
        END /* VR. EXTRA */
    /* DESCUENTE EL IMPOCONSUMO */
    SELECT SUM(FADE_CONSUMO)
        FROM FACTURAS_DETALLE F WHERE F.FACT_ID = :IDDOC AND FADE_REFERENCIA <> '.t' INTO :IMPTOS;
    vrsubt = vrsubt - IMPTOS;
    /* RETENCION FUENTE */
    if ((RTFTE = 'C') or (RTFTE = 'K')) then
      BEGIN
      execute procedure redondee(VRRTFTE, DIG) returning_values (VRRTFTE);
      if (VRRTFTE <> 0) then
        BEGIN
        if (RTFTE = 'C') then
            CTARTFTE = TCTARTFTE;
        EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTARTFTE, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :VRSUBT, :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTFTE;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :VRSUBT, :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTFTE;
            END
        /* AUTORETENCION */
        if (FAUTORET <= fecaux) then
            BEGIN
            EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'CUENTA DE AUTORETENCION EN LA FUENTE') returning_values (CTARTFTE);
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTARTFTE INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERROR (31, :IDDOC, :CTARTFTE, 2);
                CUENTA = CTARTFTE;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                begin
                EXECUTE PROCEDURE ERROR (31, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, (:VRSUBT*-1), :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - VRRTFTE;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, (:VRSUBT*-1), :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - VRRTFTE;
                END
            END
        END /* RTFTE */
      END
    if (RTFTE = 'A') then
      BEGIN
      FOR SELECT MAX(COAR_CTARTFTEV), MAX(COAR_RTFTE), MIN(COAR_RTBASE), SUM(FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), SUM((FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO)*COAR_RTFTE)
        FROM CONTABIL_ARTICULO C, FACTURAS_DETALLE F
        WHERE F.FACT_ID = :IDDOC AND F.ARTI_COD = C.ARTI_COD AND FADE_REFERENCIA <> '.t'
        GROUP BY COAR_CTARTFTEV
        INTO :CTARTFTE, :PRTFTE, :baseadic, :MONTO, :VRRTFTE
        DO
        BEGIN
        MONTO = MONTO * FACTOR;
        if (MONTO >= BASEADIC) then
            BEGIN
            VRRTFTE = VRRTFTE * FACTOR / 100;
            execute procedure redondee(VRRTFTE, DIG) returning_values (VRRTFTE);
            execute procedure redondee(MONTO, DIG) returning_values (MONTO);
            if (VRRTFTE <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTARTFTE, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :MONTO, :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    NROI = NROI + 1;
                    SUMA = SUMA + VRRTFTE;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :MONTO, :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA + VRRTFTE;
                    END
                /* AUTORETENCION */
                if (FAUTORET <= fecaux) then
                    BEGIN
                    EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'CUENTA DE AUTORETENCION EN LA FUENTE') returning_values (CTARTFTE);
                    EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTARTFTE, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
                    if (ERRORC <> 0) then
                        ERROR = ERROR + 1;
                    if (TIPOCUEN = 'C') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, (:MONTO*-1), :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                        NROI = NROI + 1;
                        SUMA = SUMA - VRRTFTE;
                        END
                    if (TIPOCUEN = 'N') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, (:MONTO*-1), :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NROI = NROI + 1;
                        SUMA = SUMA - VRRTFTE;
                        END
                    END
                END
            END
        END /* RTFTE */
      END
    /* RETENCION IVA */
    if ((RTIVA = 'C') or (RTIVA = 'K')) then
      BEGIN
      execute procedure redondee(VRRTIVA, DIG) returning_values (VRRTIVA);
      if (VRRTIVA <> 0) then
        BEGIN
        if (RTIVA = 'C') then
            CTARTIVA = TCTARTIVA;
        EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTARTIVA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTIVA, 0, :VRIVA, :PORC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTIVA;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTIVA, 0, :VRIVA, :PORC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTIVA;
            END
        END /* RTIVA */
      END
    /* RETENCION DE ICA */
    if ((RTICA = 'C') or (RTICA = 'K')) then
      BEGIN
      execute procedure redondee(VRRTICA, DIG) returning_values (VRRTICA);
      if (VRRTICA <> 0) then
        BEGIN
        if (RTICA = 'C') then
            CTARTICA = TCTARTICA;
        EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTARTICA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTICA, 0, :VRSUBT, :PRTICA, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTICA;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTICA, 0, :VRSUBT, :PRTICA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTICA;
            END
        END /* RTICA */
      END
    /* CIERRE EL COMPROBANTE CONTRA LA CUENTA DEL TERCERO O LA CONSTANTE */
    if ((SUMA <> 0) and ((CARTERA = 'C') or (CARTERA = 'K') or (CARTERA = 'J'))) then
        BEGIN
        if (SUMA < 0) then
            BEGIN
            DEBITO = SUMA * -1;
            CREDITO = 0;
            END
        ELSE
            BEGIN
            DEBITO = 0;
            CREDITO = SUMA;
            END
        if (CARTERA = 'C') then
            CTACARTERA = TCTACLIEN;
        if (CARTERA = 'J') then
            BEGIN
            /* BUSQUE LA CUENTA DE LA CAJA */
            SELECT CAJA_CUENTA FROM CAJAS C, PUNTO_VENTA P
                WHERE P.CAJA_ID = C.CAJA_ID AND PTVT_ID = :PTOVTA
                INTO :CTACARTERA;
            END
        EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTACARTERA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :DEBITO, :CREDITO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
        if (TIPOCUEN = 'N') then
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :DEBITO, :CREDITO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
        NROI = NROI + 1;
        END /* SUMA EN CARTERA */
    /* CALCULE COSTOS EN VENTAS */
    EXECUTE PROCEDURE COSTO_EN_VENTAS(31, :IDDOC);
    if (COSTOS = 'A') then
        BEGIN
        FOR SELECT MAX(CTACOS), SUM(CAST(CANT AS DOUBLE PRECISION) * COSTO)
            FROM COSTO_VENTAS
            GROUP BY CTACOS
            INTO :CTACOSTOS, :MONTO
        DO
            BEGIN
            if (MONTO <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTACOSTOS, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT ARTI_COD, CANT * COSTO
                        FROM COSTO_VENTAS
                        WHERE CTACOS = :CUENTA
                        INTO :ART, :MONTO
                    DO
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    NROI = NROI + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    END
                END /* MONTO <> 0 */
            END /* FOR */
        END /* COSTOS */
    if (COSTOS = 'K') then
        BEGIN
        SELECT SUM(CAST(CANT AS DOUBLE PRECISION) * COSTO)
            FROM COSTO_VENTAS
            INTO :MONTO;
        if (MONTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTACOSTOS, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, REGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT ARTI_COD, CANT * COSTO
                    FROM COSTO_VENTAS
                    INTO :ART, :MONTO
                DO
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTACOSTOS, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                    NROI = NROI + 1;
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTACOSTOS, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTACOSTOS, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                END
            END /* MONTO <> 0 */
        END /* COSTOS = K */
    if (INVEN = 'A') then
        BEGIN
        FOR SELECT MAX(CTAINV), SUM(CAST(CANT AS DOUBLE PRECISION) * COSTO)
            FROM COSTO_VENTAS
            GROUP BY CTAINV
            INTO :CTAINVEN, :MONTO
        DO
            BEGIN
            if (MONTO <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTAINVEN, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, REGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT ARTI_COD, CANT * COSTO
                        FROM COSTO_VENTAS
                        WHERE CTAINV = :CUENTA
                        INTO :ART, :MONTO
                    DO
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    NROI = NROI + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    END
                END /* MONTO <> 0 */
            END /* FOR */
        END /* INVEN = A */
    if (INVEN = 'K') then
        BEGIN
        SELECT SUM(CAST(CANT AS DOUBLE PRECISION) * COSTO)
            FROM COSTO_VENTAS
            INTO :MONTO;
        if (MONTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTAINVEN, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT ARTI_COD, CANT * COSTO
                    FROM COSTO_VENTAS
                    INTO :ART, :MONTO
                DO
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTAINVEN, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                    NROI = NROI + 1;
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAINVEN, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAINVEN, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                END
            END /* MONTO <> 0 */
        END /* INVEN = K */
    /* recorra las cuentas adicionales */
    FOR SELECT INVC_CUENTA, INVC_BASE, INVC_PORC, INVC_VALOR, INVC_DB
        FROM INTERFAZ_VENTAS_CTAS
        WHERE INVE_ID = :IDINTER
        INTO :CTADIC, :BASEADIC, :PORCADIC, :VALORADIC, :DBADIC
        DO
        BEGIN
        if (VALORADIC <> 0) then
            MONTO = VALORADIC;
        ELSE
            BEGIN
            if (:BASEADIC = 'SUBTOTAL') then
                VALORADIC = vrsubt;
            if (:BASEADIC = 'DESCUENTO') then
                VALORADIC = VRDTO;
            if (:BASEADIC = 'IVA') then
                VALORADIC = VRIVA;
            if (:BASEADIC = 'ADICIONAL') then
                VALORADIC = VRADIC;
            if (:BASEADIC = 'EXTRA') then
                VALORADIC = VREXTRA;
            if (:BASEADIC = 'TOTAL') then
                VALORADIC = VRTOTAL;
            MONTO = VALORADIC * PORCADIC / 100;
            END
        if (MONTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTADIC, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                if (DBADIC = 'S') then
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                ELSE
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                if (DBADIC = 'S') then
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                ELSE
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                END
            NROI = NROI + 1;
            END
        END
    if (ERROR > 0) then
        VER = 'S';
    SUSPEND;
    END /* NO ANULADO */
  END /* EXISTE LA INTERFAZ */
ELSE
    BEGIN
    EXECUTE PROCEDURE ERROR (31, :IDDOC, :PREF, 1);
    ERROR = ERROR + 1;
    VER = 'S';
    SUSPEND;
    END
END

^

SET TERM ; ^

SET TERM ^ ;

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

^

SET TERM ; ^

SET TERM ^ ;

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

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE DEVOLUCIONES_SIN_CONTABILIDAD(
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    ID INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    ESTADO VARCHAR(20),
    IDI INTEGER,
    IDC INTEGER)
AS
DECLARE VARIABLE VER CHAR(2);
declare variable FECICNT VARCHAR(10);
declare variable FECFCNT VARCHAR(10);
declare variable ERROR INTEGER;
declare variable idref INTEGER;
BEGIN
EXECUTE PROCEDURE fecha_a_conta(FECINI) returning_values (FECICNT);
EXECUTE PROCEDURE fecha_a_conta(FECFIN) returning_values (FECFCNT);
FOR SELECT DEVT_ID, PREF_PRE, DEVT_NUMERO FROM devoluciones_ventas WHERE DEVT_ANULADO = 'N' AND
    DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN
    INTO :ID, :PREF, :NUMERO
DO
  BEGIN
  idref = null;
  SELECT ENCO_IDREF FROM COMPROBANTE_ENCABEZADO WHERE ENCO_TIPOREF = 33 AND ENCO_FECHA >= :FECICNT AND ENCO_FECHA <= :FECFCNT and ENCO_IDREF = :id into :idref;
  if (idref IS NULL) then
  begin
   ESTADO = 'PROCESANDO';
   SUSPEND;
   SELECT MAX(INVE_ID) FROM INTERFAZ_VENTAS WHERE PREF_PRE = :PREF AND TIDO_COD = 33 INTO :IDI;
   EXECUTE PROCEDURE contabil_devolcli (:ID, :IDI) RETURNING_VALUES (:ERROR, :VER, :IDC);
   if (ERROR = 0) then
    BEGIN
    EXECUTE PROCEDURE CONTABILIZA_PENDIENTE (:IDC);
    ESTADO = 'OK';
    END
   ELSE
    ESTADO = 'ERROR';
   suspend;
  End
  END
END

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE FACTURAS_SIN_CONTABILIDAD(
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    ID INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    ESTADO VARCHAR(20),
    IDI INTEGER,
    IDC INTEGER)
AS
DECLARE VARIABLE VER CHAR(2);
declare variable FECICNT VARCHAR(10);
declare variable FECFCNT VARCHAR(10);
declare variable ERROR INTEGER;
declare variable idref INTEGER;
BEGIN
EXECUTE PROCEDURE fecha_a_conta(FECINI) returning_values (FECICNT);
EXECUTE PROCEDURE fecha_a_conta(FECFIN) returning_values (FECFCNT);
FOR SELECT FACT_ID, PREF_PRE, FACT_NUMERO FROM FACTURAS WHERE FACT_ANULADO = 'N' AND
    FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN INTO :ID, :PREF, :NUMERO
DO
  BEGIN
  idref = null;
  SELECT ENCO_IDREF FROM COMPROBANTE_ENCABEZADO WHERE ENCO_TIPOREF = 31 AND ENCO_FECHA >= :FECICNT AND ENCO_FECHA <= :FECFCNT and ENCO_IDREF = :ID into :idref;
  if (idref IS NULL) then
  begin
   ESTADO = 'PROCESANDO';
   ERROR = NULL;
   SUSPEND;
   SELECT MAX(INVE_ID) FROM INTERFAZ_VENTAS WHERE PREF_PRE = :PREF AND TIDO_COD = 31 INTO :IDI;
   EXECUTE PROCEDURE CONTABIL_FACTURA (:ID, :IDI) RETURNING_VALUES (:ERROR, VER, :IDC);
   if ((ERROR = 0) or (error IS NULL)) then
    BEGIN
    EXECUTE PROCEDURE CONTABILIZA_PENDIENTE (:IDC);
    ESTADO = 'OK';
    END
   ELSE
    ESTADO = 'ERROR';
   suspend;
  end
  END
END

^

SET TERM ; ^
SET TERM ^ ;

CREATE OR ALTER PROCEDURE COSTO_EN_VENTAS_CONTADO(
    FECFAC DATE,
    PREF VARCHAR(4),
    PTVTA INTEGER)
AS
declare variable ARTICULO VARCHAR(20);
declare variable CANTIDAD NUMERIC(18,4);
declare variable COSTO NUMERIC(18,2);
declare variable CTACOSTO VARCHAR(20);
declare variable CTAINVEN VARCHAR(20);
BEGIN
    DELETE FROM COSTO_VENTAS;
    /* FACTURA DE VENTA */
    FOR SELECT MAX(D.ARTI_COD), SUM(FADE_CANT * FADE_FACTOR), MAX(COAR_CTACOS), MAX(COAR_CTAINV)
        FROM ARTICULO A, FACTURAS F, FACTURAS_DETALLE D, CONTABIL_ARTICULO C
        WHERE F.FACT_ID = D.FACT_ID AND A.ARTI_COD = D.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND FACT_ANULADO = 'N' AND FACT_FECHA = :FECFAC AND F.PREF_PRE = :PREF AND F.PTVT_ID = :PTVTA and substring(a.arti_cod from 1 FOR 2) <> '.t'
        GROUP BY D.ARTI_COD
        INTO :ARTICULO, :CANTIDAD, :CTACOSTO, :CTAINVEN
        DO
        BEGIN
        EXECUTE PROCEDURE COSTO_PROMEDIO(:ARTICULO, :FECFAC) returning_values (:COSTO);
        INSERT INTO COSTO_VENTAS VALUES (:ARTICULO, :CANTIDAD, :COSTO * :CANTIDAD, :CTACOSTO, :CTAINVEN);
        END
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE CONTABIL_FACTURAS_CONTADO(
    FECFAC DATE,
    NIT VARCHAR(20),
    PREF VARCHAR(4),
    PTVTA INTEGER,
    IDINTER INTEGER)
RETURNS (
    ERROR INTEGER,
    VER CHAR(1),
    IDC INTEGER)
AS
declare variable num varchar(8);
declare variable numero varchar(10);
declare variable fecha char(8);
declare variable conc char(120);
declare variable vence char(8);
declare variable vrdto numeric(18,2);
declare variable vradic numeric(18,2);
declare variable vrsubt numeric(18,2);
declare variable vriva numeric(18,2);
declare variable prtfte numeric(9,2);
declare variable vrrtfte numeric(18,2);
declare variable vrrtiva numeric(18,2);
declare variable prtica numeric(9,2);
declare variable vrrtica numeric(18,2);
declare variable vrtotal numeric(18,2);
declare variable vrextra numeric(18,2);
declare variable tipocomp varchar(3);
declare variable prefcont varchar(4);
declare variable ventas char(1);
declare variable ctaventas varchar(20);
declare variable iva char(1);
declare variable ctaiva varchar(20);
declare variable consumo char(1);
declare variable ctaconsumo varchar(20);
declare variable cartera char(1);
declare variable ctacartera varchar(20);
declare variable rtfte char(1);
declare variable ctartfte varchar(20);
declare variable rtiva char(1);
declare variable ctartiva varchar(20);
declare variable rtica char(1);
declare variable ctartica varchar(20);
declare variable inven char(1);
declare variable ctainven varchar(20);
declare variable costos char(1);
declare variable ctacostos varchar(20);
declare variable ctadto varchar(20);
declare variable ctaadic varchar(20);
declare variable ctaextra varchar(20);
declare variable existe char(1);
declare variable cuenta varchar(20);
declare variable monto numeric(18,2);
declare variable tipocuen char(1);
declare variable nombre varchar(60);
declare variable proy varchar(4);
declare variable centro varchar(4);
declare variable porc numeric(5,2);
declare variable debito numeric(18,2);
declare variable credito numeric(18,2);
declare variable nroi integer;
declare variable art varchar(15);
declare variable impinc char(1);
declare variable imptos numeric(18,2);
declare variable suma numeric(18,2);
declare variable porciva numeric(9,2);
declare variable tctaclien varchar(20);
declare variable tctaventa varchar(20);
declare variable tctartfte varchar(20);
declare variable tctartiva varchar(20);
declare variable tctartica varchar(20);
declare variable ctadic varchar(20);
declare variable baseadic varchar(20);
declare variable porcadic numeric(5,2);
declare variable valoradic numeric(18,2);
declare variable dbadic char(1);
declare variable ptovta integer;
declare variable dig integer;
declare variable mercancia numeric(18,2);
declare variable factor double precision;
declare variable cent char(1);
BEGIN
/* BUSQUE LA INTERFACE */ /*$$IBE$$ 
EXISTE = 'N';
SELECT 'S', TICO_COD, PRCO_PRE, INVE_VENTAS, INVE_IVA, INVE_CONSUMO, INVE_CARTERA, INVE_RTFTE, INVE_RTIVA, INVE_RTICA, INVE_COSTO, INVE_INVEN, INVE_CTAVENTAS, INVE_CTAIVA, INVE_CTACONSUMO, INVE_CTADTO, INVE_CTAADIC, INVE_CTAEXTRA, INVE_CTACARTERA, INVE_CTARTFTE, INVE_CTARTIVA, INVE_CTARTICA, INVE_CTAINVEN, INVE_CTACOSTOS, INVE_CONFIRMAR, INVE_CENTRO
    FROM INTERFAZ_VENTAS
    WHERE INVE_ID = :IDINTER
    INTO :EXISTE, :TIPOCOMP, :PREFCONT, :VENTAS, :IVA, :CONSUMO, :CARTERA, :RTFTE, :RTIVA, :RTICA, :COSTOS, :INVEN, :CTAVENTAS, :CTAIVA, :CTACONSUMO, :CTADTO, :CTAADIC, :CTAEXTRA, :CTACARTERA, :CTARTFTE, :CTARTIVA, :CTARTICA, :CTAINVEN, :CTACOSTOS, :VER, :CENT;
if (EXISTE = 'S') then
  BEGIN
   $$IBE$$*/ /* BORRE CUALQUEIR CONTABILIZACION PREVIA */
/*  DELETE FROM CONTABILIZACION WHERE CNTB_TIPOREF = 31 AND CNTB_IDREF = 0;
  /* BUSQUE EL CENTRO DEL PUNTO, LA BODEGA, O EL PREFIJO  */ /*$$IBE$$ 
  IF (CENT = 'B') THEN
    SELECT B.BODE_CENTRO, B.BODE_PROY FROM BODEGA B, PUNTO_VENTA P
        WHERE B.BODE_COD = P.BODE_COD AND P.ptvt_id = :ptvta INTO :CENTRO, :PROY;
  IF (CENT = 'V') THEN
    SELECT MAX(V.CENT_COD), MAX(V.PROY_COD) FROM VENDEDORES V
        WHERE V.PTVT_ID = :PTVTA INTO :CENTRO, :PROY;
  IF (CENT = 'P') THEN
    SELECT P.PREF_PROY, P.PREF_CENTRO FROM PREFIJOS P
        WHERE P.PREF_PRE = :PREF AND P.TIDO_COD = 31 INTO :CENTRO, :PROY;
   $$IBE$$*/ /* TRAIGA LOS DATOS DEL CLIENTE */ /*$$IBE$$ 
  SELECT TERC_NOM, TERC_CTARTFTE, TERC_CTARTIVA, TERC_CTARTICA, TERC_CTAVENTA, TERC_CTACLIENTE
        FROM TERCEROS T WHERE TERC_NIT = :NIT
        INTO :NOMBRE, TCTARTFTE, TCTARTIVA, TCTARTICA, TCTAVENTA, TCTACLIEN;
  SELECT SUM(FACT_DTOMONTO), SUM(FACT_ADICIONAL), SUM(FACT_IVAMONTO), SUM(FACT_EXTRA), SUM(FACT_TOTAL), SUM(FACT_RTFTEMONTO), SUM(FACT_RTIVAMONTO), SUM(FACT_RTICAMONTO), MAX(FACT_IVAINC)
        FROM FACTURAS F WHERE FACT_FECHA = :FECFAC AND FACT_ANULADO = 'N' AND PTVT_ID = :ptvta AND PREF_PRE = :PREF
        INTO :VRDTO, :VRADIC, :VRIVA, :VREXTRA, :VRTOTAL, :VRRTFTE, :VRRTIVA, :VRRTICA, :impinc;
  VRSUBT = VRTOTAL - VREXTRA - VRIVA;  $$IBE$$*/ /* BASE DE RETEFTE Y RETEICA */ /*$$IBE$$ 
  MERCANCIA = VRSUBT - VRADIC + VRDTO;
  EXECUTE PROCEDURE FECHA_A_CONTA(:FECFAC) returning_values (:FECHA);
  VENCE = FECHA;
   $$IBE$$*/ /* REGISTRE EL ENCABEZADO CONTABLE */ /*$$IBE$$ 
  IDC = GEN_ID(ID_CONTABILIZA, 1);
  CONC = 'RESUMEN VENTAS ' || FECHA;
  NUM = SUBSTR(FECHA, 3, 8);
  INSERT INTO CONTABILIZACION (CNTB_ID, CNTB_TIPOCOMP, CNTB_PREFCNT, CNTB_NUMERO, CNTB_FECHA, CNTB_CONCEPTO, CNTB_REF, CNTB_TIPOREF, CNTB_IDREF, CNTB_PREFREF, CNTB_NUMREF, CNTB_PROCESADO)
        VALUES (:IDC, :TIPOCOMP, :PREFCONT, :NUM, :FECHA, :CONC, '', 0, 0, :PREF, :NUM, 'N');
  NROI = 0;
  SUMA = 0;
  ERROR = 0;
   $$IBE$$*/ /* SI NO HAY CUENTA DE DESCUENTO NI ADICIONAL CALCULE UN FACTOR PARA LAS VENTAS Y EL IVA */ /*$$IBE$$ 
  if (MERCANCIA <> 0) then
    FACTOR = CAST(VRSUBT AS DOUBLE PRECISION) / CAST(MERCANCIA AS DOUBLE PRECISION);
  ELSE
    FACTOR = 1;
   $$IBE$$*/ /* TRAIGA EL NUMERO DE DIGITOS PARA EL REDONDEO */ /*$$IBE$$ 
  SELECT CAST(CONF_VALOR AS INTEGER) FROM CONFIGURACION WHERE CONF_MODULO = 'FACTURACION' AND
        CONF_CATEGORIA = 'GENERAL' AND CONF_PROPIEDAD = 'REDONDEO AL MULTIPLO DE DIEZ EN TOTALES' INTO :DIG;
   $$IBE$$*/ /* CUENTAS DE VENTAS */ /*$$IBE$$ 
  if (VENTAS = 'A') then
        BEGIN
        FOR SELECT MAX(COAR_CTAVNT), SUM(CAST(FADE_CANT AS DOUBLE PRECISION) * (FADE_PRUNIT-FADE_DTOMONTO)), SUM(FADE_IVAMONTO+FADE_CONSUMO)
            FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_DETALLE FD, FACTURAS F
            WHERE F.FACT_ID = FD.FACT_ID AND FACT_FECHA = :FECFAC AND FD.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND F.PREF_PRE = :PREF AND F.PTVT_ID = :PTVTA AND FACT_ANULADO = 'N' AND FADE_REFERENCIA <> '.t'
            GROUP BY COAR_CTAVNT
            INTO :CTAVENTAS, :MONTO, :IMPTOS
            DO
            BEGIN
            if (IMPINC = 'S') then
                MONTO = MONTO - IMPTOS;
            if ((CTADTO IS NULL) OR (CTADTO = '')) then
                MONTO = MONTO * FACTOR;
            execute procedure redondee(MONTO, DIG) returning_values (MONTO);
            if (MONTO <> 0) then
                BEGIN
                CUENTA = NULL;
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :CTAVENTAS INTO :CUENTA, :TIPOCUEN;
                if (CUENTA IS NULL) then
                    begin
                    EXECUTE PROCEDURE ERROR (31, 0, :CTAVENTAS, 2);
                    CUENTA = CTAVENTAS;
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                     $$IBE$$*/ /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */ /*$$IBE$$ 
                    FOR SELECT FD.ARTI_COD, (CAST(FADE_CANT AS DOUBLE PRECISION) * (FADE_PRUNIT-FADE_DTOMONTO)), (FADE_IVAMONTO+FADE_CONSUMO)
                        FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_DETALLE FD, FACTURAS F
                        WHERE F.FACT_ID = FD.FACT_ID AND FACT_FECHA = :FECFAC AND F.PREF_PRE = :PREF AND F.PTVT_ID = :PTVTA AND FD.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTAINV = :CUENTA AND FACT_ANULADO = 'N' AND FADE_REFERENCIA <> '.t'
                        INTO :ART, :MONTO, :IMPTOS
                    DO
                        BEGIN
                        if (IMPINC = 'S') then
                            MONTO = MONTO - IMPTOS;
                        if ((CTADTO IS NULL) OR (CTADTO = '')) then
                            MONTO = MONTO * FACTOR;
                        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                        if (MONTO <> 0) then
                            BEGIN
                            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                            NROI = NROI + 1;
                            SUMA = SUMA - MONTO;
                            END
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    NROI = NROI + 1;
                    SUMA = SUMA - MONTO;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA - MONTO;
                    END
                END  $$IBE$$*/ /* MONTO <> 0 */ /*$$IBE$$ 
            END  $$IBE$$*/ /* FOR */ /*$$IBE$$ 
        END  $$IBE$$*/ /* VENTAS X ARTICULO */ /*$$IBE$$ 
     IF ((VENTAS = 'C') OR (VENTAS = 'K')) THEN
        BEGIN
        IF (VENTAS = 'C') THEN
            CTAVENTAS = TCTAVENTA;
        SELECT SUM(CAST(FADE_CANT AS DOUBLE PRECISION) * (FADE_PRUNIT-FADE_DTOMONTO)), SUM(FADE_IVAMONTO+FADE_CONSUMO)
            FROM FACTURAS_DETALLE FD, FACTURAS F
            WHERE F.FACT_ID = FD.FACT_ID AND FACT_FECHA = :FECFAC AND F.PREF_PRE = :PREF AND F.PTVT_ID = :PTVTA AND FACT_ANULADO = 'N' AND FADE_REFERENCIA <> '.t'
            INTO :MONTO, :IMPTOS;
        if (IMPINC = 'S') then
            MONTO = MONTO - IMPTOS;
        if ((CTADTO IS NULL) OR (CTADTO = '')) then
            MONTO = MONTO * FACTOR;
        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
        if (MONTO <> 0) then
            BEGIN
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTAVENTAS INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERROR (31, 0, :CTAVENTAS, 2);
                CUENTA = CTAVENTAS;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                 $$IBE$$*/ /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */ /*$$IBE$$ 
                FOR SELECT FD.ARTI_COD, (CAST(FADE_CANT AS DOUBLE PRECISION) * (FADE_PRUNIT-FADE_DTOMONTO)), (FADE_IVAMONTO+FADE_CONSUMO)
                    FROM  $$IBE$$*/ /*ARTICULO A,*/ /*$$IBE$$  FACTURAS_DETALLE FD, FACTURAS F
                    WHERE F.FACT_ID = FD.FACT_ID AND FACT_FECHA = :FECFAC AND F.PREF_PRE = :PREF AND F.PTVT_ID = :PTVTA AND FACT_ANULADO = 'N' AND FADE_REFERENCIA <> '.t'
                    INTO :ART, :MONTO, :IMPTOS
                    DO
                    BEGIN
                    if (IMPINC = 'S') then
                        MONTO = MONTO - IMPTOS;
                    if ((CTADTO IS NULL) OR (CTADTO = '')) then
                        MONTO = MONTO * FACTOR;
                    execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                    if (MONTO <> 0) then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        SUMA = SUMA - MONTO;
                        END
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - MONTO;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - MONTO;
                END
            END  $$IBE$$*/ /* MONTO <> 0 */ /*$$IBE$$ 
        END  $$IBE$$*/ /* VENTAS DE CLIENTE O CONSTANTE */
    /* EL IVA EN VENTAS */ /*$$IBE$$ 
    if (IVA = 'A') then
        BEGIN
        FOR SELECT MAX(COAR_CTAIVAV), SUM(FADE_IVAMONTO), SUM(CAST(FADE_CANT AS DOUBLE PRECISION) * (FADE_PRUNIT-FADE_DTOMONTO)), sum(FADE_CONSUMO)
            FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_DETALLE FD, FACTURAS F
            WHERE F.FACT_ID = FD.FACT_ID AND FACT_FECHA = :FECFAC AND F.PREF_PRE = :PREF AND F.PTVT_ID = :PTVTA AND FD.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND FACT_ANULADO = 'N' AND FADE_REFERENCIA <> '.t'
            GROUP BY COAR_CTAIVAV
            INTO :CTAIVA, :IMPTOS, :MONTO, :VALORADIC
        DO
            BEGIN
            if (IMPINC = 'S') then
                MONTO = MONTO - IMPTOS - VALORADIC;
            MONTO = MONTO * -1;
            MONTO = MONTO * FACTOR;
            IMPTOS = IMPTOS * FACTOR;
            execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
            execute procedure redondee(MONTO, DIG) returning_values (MONTO);
            if (IMPTOS <> 0) then
                BEGIN
                CUENTA = NULL;
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :CTAIVA INTO :CUENTA, :TIPOCUEN;
                if (CUENTA IS NULL) then
                    begin
                    EXECUTE PROCEDURE ERROR (31, 0, :CTAIVA, 2);
                    CUENTA = CTAIVA;
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                     $$IBE$$*/ /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */ /*$$IBE$$ 
                    FOR SELECT FD.ARTI_COD, FADE_IVAMONTO, (CAST(FADE_CANT AS DOUBLE PRECISION) * (FADE_PRUNIT-FADE_DTOMONTO)), TAIV_PORC, FADE_CONSUMO
                        FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_DETALLE FD, FACTURAS F, TARIFA_IVA T
                        WHERE F.FACT_ID = FD.FACT_ID AND FACT_FECHA = :FECFAC AND F.PREF_PRE = :PREF AND F.PTVT_ID = :PTVTA AND FD.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTAIVAV = :CUENTA AND A.TAIV_COD = T.TAIV_COD AND FACT_ANULADO = 'N' AND FADE_REFERENCIA <> '.t'
                        INTO :ART, :IMPTOS, :MONTO, :PORCIVA, :VALORADIC
                    DO
                        BEGIN
                        if (IMPINC = 'S') then
                            MONTO = MONTO - IMPTOS - VALORADIC;
                        MONTO = MONTO * -1;
                        MONTO = MONTO * FACTOR;
                        IMPTOS = IMPTOS * FACTOR;
                        execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                        if (IMPTOS <> 0) then
                            BEGIN
                            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, :MONTO, :PORCIVA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                            NROI = NROI + 1;
                            SUMA = SUMA + DEBITO - CREDITO;
                            END
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, :MONTO, ABS(:IMPTOS*100/:MONTO), :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    NROI = NROI + 1;
                    SUMA = SUMA - IMPTOS;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, :MONTO, ABS(:IMPTOS*100/:MONTO), :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA - IMPTOS;
                    END
                END    $$IBE$$*/ /* IMPTOS <> 0 */ /*$$IBE$$ 
            END  $$IBE$$*/ /* FOR */ /*$$IBE$$ 
        END  $$IBE$$*/ /* IVA X ARTICULO */ /*$$IBE$$ 
    if (IVA = 'K') then  $$IBE$$*/ /* IVA EN CTA CONSTANTE */ /*$$IBE$$ 
        BEGIN
        SELECT SUM(FADE_IVAMONTO), SUM(CAST(FADE_CANT AS DOUBLE PRECISION) * (FADE_PRUNIT-FADE_DTOMONTO)), SUM(FADE_CONSUMO)
            FROM FACTURAS_DETALLE FD, FACTURAS F
            WHERE F.FACT_ID = FD.FACT_ID AND FACT_FECHA = :FECFAC AND F.PREF_PRE = :PREF AND F.PTVT_ID = :PTVTA AND FACT_ANULADO = 'N' AND FADE_REFERENCIA <> '.t'
            INTO :IMPTOS, :MONTO, :valoradic;
        if (IMPINC = 'S') then
            MONTO = MONTO - IMPTOS - VALORADIC;
        MONTO = MONTO * -1;
        MONTO = MONTO * FACTOR;
        IMPTOS = IMPTOS * FACTOR;
        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
        execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
        if (IMPTOS <> 0) then
            BEGIN
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTAIVA INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERROR (31, 0, :CTAIVA, 2);
                CUENTA = CTAIVA;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                 $$IBE$$*/ /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */ /*$$IBE$$ 
                FOR SELECT FD.ARTI_COD, (CAST(FADE_CANT AS DOUBLE PRECISION) * (FADE_PRUNIT-FADE_DTOMONTO)), FADE_IVAMONTO, TAIV_PORC, FADE_CONSUMO
                    FROM ARTICULO A, FACTURAS_DETALLE FD, FACTURAS F, TARIFA_IVA T
                    WHERE F.FACT_ID = FD.FACT_ID AND FACT_FECHA = :FECFAC AND F.PREF_PRE = :PREF AND F.PTVT_ID = :PTVTA AND FD.arti_cod = A.arti_cod AND T.TAIV_COD=A.TAIV_COD AND FACT_ANULADO = 'N' AND FADE_REFERENCIA <> '.t'
                    INTO :ART, :MONTO, :IMPTOS, :PORCIVA, :VALORADIC
                    DO
                    BEGIN
                    if (IMPINC = 'S') then
                        MONTO = MONTO - IMPTOS - VALORADIC;
                    MONTO = MONTO * -1;
                    MONTO = MONTO * FACTOR;
                    IMPTOS = IMPTOS * FACTOR;
                    execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                    execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                    if (IMPTOS <> 0) then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', 0, :IMPTOS, :MONTO, :PORCIVA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        SUMA = SUMA - IMPTOS;
                        END
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', 0, :IMPTOS, :MONTO, ABS(:IMPTOS*100/:MONTO), :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - IMPTOS;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', 0, :IMPTOS, :MONTO, ABS(:IMPTOS*100/:MONTO), :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - IMPTOS;
                END
            END  $$IBE$$*/ /* IMPTOS <> 0 */ /*$$IBE$$ 
        END  $$IBE$$*/ /* IVA EN CTA CONSTANTE */
    /* EL IMPOCONSUMO */ /*$$IBE$$ 
    if (CONSUMO = 'A') then
        BEGIN
        FOR SELECT MAX(COAR_CTACONS), SUM(FADE_CONSUMO)
            FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_DETALLE FD, FACTURAS F
            WHERE F.FACT_ID = FD.FACT_ID AND FACT_FECHA = :FECFAC AND F.PREF_PRE = :PREF AND F.PTVT_ID = :PTVTA AND FD.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND FACT_ANULADO = 'N' AND FADE_REFERENCIA <> '.t'
            GROUP BY COAR_CTACONS
            INTO :CTACONSUMO, :IMPTOS
        DO
            BEGIN
            execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
            if (IMPTOS <> 0) then
                BEGIN
                CUENTA = NULL;
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :CTACONSUMO INTO :CUENTA, :TIPOCUEN;
                if (CUENTA IS NULL) then
                    begin
                    EXECUTE PROCEDURE ERROR (31, 0, :CTACONSUMO, 2);
                    CUENTA = CTACONSUMO;
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                     $$IBE$$*/ /* ES UNA CUENTA DE INVENTARIO, REGISTRE UNO A UNO LOS ARTICULOS */ /*$$IBE$$ 
                    FOR SELECT FD.ARTI_COD, FADE_CONSUMO
                        FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_DETALLE FD, FACTURAS F
                        WHERE F.FACT_ID = FD.FACT_ID AND FACT_FECHA = :FECFAC AND F.PREF_PRE = :PREF AND F.PTVT_ID = :PTVTA AND FD.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTACONS = :CUENTA AND FACT_ANULADO = 'N' AND FADE_REFERENCIA <> '.t'
                        INTO :ART, :IMPTOS
                    DO
                        BEGIN
                        execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                        if (IMPTOS <> 0) then
                            BEGIN
                            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                            NROI = NROI + 1;
                            SUMA = SUMA - IMPTOS;
                            END
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    NROI = NROI + 1;
                    SUMA = SUMA - IMPTOS;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA - CREDITO;
                    END
                END  $$IBE$$*/ /* IMPTOS <> 0 */ /*$$IBE$$ 
            END  $$IBE$$*/ /* FOR */ /*$$IBE$$ 
        END  $$IBE$$*/ /* CONSUMO X ARTICULO */ /*$$IBE$$ 
    if (CONSUMO = 'K') then  $$IBE$$*/ /* CONSUMO EN CTA CONSTANTE */ /*$$IBE$$ 
        BEGIN
        SELECT SUM(FADE_CONSUMO)
            FROM FACTURAS_DETALLE FD, FACTURAS F
            WHERE F.FACT_ID = FD.FACT_ID AND FACT_FECHA = :FECFAC AND F.PREF_PRE = :PREF AND F.PTVT_ID = :PTVTA AND FACT_ANULADO = 'N' AND FADE_REFERENCIA <> '.t'
            INTO :IMPTOS;
        execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
        if (IMPTOS <> 0) then
            BEGIN
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTACONSUMO INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERROR (31, 0, :CTACONSUMO, 2);
                CUENTA = CTACONSUMO;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                 $$IBE$$*/ /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */ /*$$IBE$$ 
                FOR SELECT FD.ARTI_COD, FADE_CONSUMO
                    FROM  $$IBE$$*/ /*ARTICULO A,*/ /*$$IBE$$  FACTURAS_DETALLE FD, FACTURAS F
                    WHERE F.FACT_ID = FD.FACT_ID AND FACT_FECHA = :FECFAC AND F.PREF_PRE = :PREF AND F.PTVT_ID = :PTVTA AND FACT_ANULADO = 'N' AND FADE_REFERENCIA <> '.t'
                    INTO :ART, :IMPTOS
                    DO
                    BEGIN
                    execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                    if (IMPTOS <> 0) then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CTACONSUMO, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        SUMA = SUMA - IMPTOS;
                        END
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTACONSUMO, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - IMPTOS;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTACONSUMO, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - IMPTOS;
                END
            END  $$IBE$$*/ /* IMPTOS <> 0 */ /*$$IBE$$ 
        END  $$IBE$$*/ /* CONSUMO EN CTA CONSTANTE */
    /* DESCUENTO */ /*$$IBE$$ 
    if ((CTADTO IS NOT NULL) AND (CTADTO <> '')) then
        BEGIN
        execute procedure redondee(VRDTO, DIG) returning_values (VRDTO);
        if (VRDTO <> 0) then
            BEGIN
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTADTO INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERROR (31, 0, :CTADTO, 2);
                CUENTA = CTADTO;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                begin
                EXECUTE PROCEDURE ERROR (31, 0, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRDTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA + VRDTO;
                END
            if (TIPOCUEN = 'N') then
                    BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRDTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA + VRDTO;
                END
            END
        END  $$IBE$$*/ /* DESCUENTO */
    /* VALOR ADIC */ /*$$IBE$$ 
    if ((CTAADIC IS NOT NULL) AND (CTAADIC <> '')) then
        BEGIN
        execute procedure redondee(VRADIC, DIG) returning_values (VRADIC);
        if (VRADIC <> 0) THEN
            BEGIN
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTAADIC INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERROR (31, 0, :CTAADIC, 2);
                CUENTA = CTAADIC;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                begin
                EXECUTE PROCEDURE ERROR (31, 0, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRADIC, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - VRADIC;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRADIC, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - VRADIC;
                END
            END
        END  $$IBE$$*/ /* VR. ADIC */
    /* VALOR EXTRA */ /*$$IBE$$ 
    if ((CTAEXTRA IS NOT NULL) AND (CTAEXTRA <> '')) THEN
        BEGIN
        execute procedure redondee(VREXTRA, DIG) returning_values (VREXTRA);
        if (VREXTRA <> 0) THEN
            BEGIN
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTAEXTRA INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERROR (31, 0, :CTAEXTRA, 2);
                CUENTA = CTAEXTRA;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                begin
                EXECUTE PROCEDURE ERROR (31, 0, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VREXTRA, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - VREXTRA;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VREXTRA, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - VREXTRA;
                END
            END
        END  $$IBE$$*/ /* VR. EXTRA */
    /* RETENCION FUENTE */ /*$$IBE$$ 
    if ((RTFTE = 'C') or (RTFTE = 'K')) then
      BEGIN
      execute procedure redondee(VRRTFTE, DIG) returning_values (VRRTFTE);
      if (VRRTFTE <> 0) then
        BEGIN
        if (RTFTE = 'C') then
            CTARTFTE = TCTARTFTE;
        CUENTA = NULL;
        SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
            WHERE CUEN_COD = :CTARTFTE INTO :CUENTA, :TIPOCUEN;
        if (CUENTA IS NULL) then
            begin
            EXECUTE PROCEDURE ERROR (31, 0, :CTARTFTE, 2);
            CUENTA = CTARTFTE;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            begin
            EXECUTE PROCEDURE ERROR (31, 0, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :VRSUBT, :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTFTE;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :VRSUBT, :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTFTE;
            END
        END  $$IBE$$*/ /* RTFTE */ /*$$IBE$$ 
      END
     $$IBE$$*/ /* RETENCION IVA */ /*$$IBE$$ 
    if ((RTIVA = 'C') or (RTIVA = 'K')) then
      BEGIN
      execute procedure redondee(VRRTIVA, DIG) returning_values (VRRTIVA);
      if (VRRTIVA <> 0) then
        BEGIN
        if (RTIVA = 'C') then
            CTARTIVA = TCTARTIVA;
        CUENTA = NULL;
        SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
            WHERE CUEN_COD = :CTARTIVA INTO :CUENTA, :TIPOCUEN;
        if (CUENTA IS NULL) then
            begin
            EXECUTE PROCEDURE ERROR (31, 0, :CTARTIVA, 2);
            CUENTA = CTARTIVA;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            begin
            EXECUTE PROCEDURE ERROR (31, 0, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTIVA, 0, :VRIVA, :PORC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTIVA;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTIVA, 0, :VRIVA, :PORC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTIVA;
            END
        END  $$IBE$$*/ /* RTIVA */ /*$$IBE$$ 
      END
     $$IBE$$*/ /* RETENCION DE ICA */ /*$$IBE$$ 
    if ((RTICA = 'C') or (RTICA = 'K')) then
      BEGIN
      execute procedure redondee(VRRTICA, DIG) returning_values (VRRTICA);
      if (VRRTICA <> 0) then
        BEGIN
        if (RTICA = 'C') then
            CTARTICA = TCTARTICA;
        CUENTA = NULL;
        SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
            WHERE CUEN_COD = :CTARTICA INTO :CUENTA, :TIPOCUEN;
        if (CUENTA IS NULL) then
            begin
            EXECUTE PROCEDURE ERROR (31, 0, :CTARTICA, 2);
            CUENTA = CTARTICA;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            begin
            EXECUTE PROCEDURE ERROR (31, 0, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTICA, 0, :VRSUBT, :PRTICA, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTICA;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTICA, 0, :VRSUBT, :PRTICA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTICA;
            END
        END  $$IBE$$*/ /* RTICA */ /*$$IBE$$ 
      END
     $$IBE$$*/ /* CIERRE EL COMPROBANTE CONTRA LA CUENTA DEL TERCERO O LA CONSTANTE */ /*$$IBE$$ 
    if ((SUMA <> 0) and ((CARTERA = 'C') or (CARTERA = 'K') or (CARTERA = 'J'))) then
        BEGIN
        if (SUMA < 0) then
            BEGIN
            DEBITO = SUMA * -1;
            CREDITO = 0;
            END
        ELSE
            BEGIN
            DEBITO = 0;
            CREDITO = SUMA;
            END
        if (CARTERA = 'C') then
            CTACARTERA = TCTACLIEN;
        if (CARTERA = 'J') then
            BEGIN
             $$IBE$$*/ /* BUSQUE LA CUENTA DE LA CAJA */ /*$$IBE$$ 
            SELECT CAJA_CUENTA FROM CAJAS C, PUNTO_VENTA P
                WHERE P.CAJA_ID = C.CAJA_ID AND PTVT_ID = :PTOVTA
                INTO :CTACARTERA;
            END
        CUENTA = NULL;
        SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
            WHERE CUEN_COD = :CTACARTERA INTO :CUENTA, :TIPOCUEN;
        if (CUENTA IS NULL) then
            begin
            EXECUTE PROCEDURE ERROR (31, 0, :CTACARTERA, 2);
            CUENTA = CTACARTERA;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            begin
            EXECUTE PROCEDURE ERROR (31, 0, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'C') then
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :DEBITO, :CREDITO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
        if (TIPOCUEN = 'N') then
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :DEBITO, :CREDITO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
        NROI = NROI + 1;
        END  $$IBE$$*/ /* SUMA EN CARTERA */
    /* CALCULE LOS COSTOS */ /*$$IBE$$ 
    EXECUTE PROCEDURE costo_en_ventas_contado(:fecfac,  :pref, :ptvta);
    if (COSTOS = 'A') then
        BEGIN
        FOR SELECT MAX(CTACOS), SUM(COSTO)
            FROM COSTO_VENTAS
            GROUP BY CTACOS
            INTO :CTACOSTOS, :MONTO
        DO
            BEGIN
            if (MONTO <> 0) then
                BEGIN
                CUENTA = NULL;
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :CTACOSTOS INTO :CUENTA, :TIPOCUEN;
                IF (CUENTA IS NULL) THEN
                    begin
                    EXECUTE PROCEDURE ERROR (31, 0, :CTACOSTOS, 2);
                    CUENTA = CTARTFTE;
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                     $$IBE$$*/ /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */ /*$$IBE$$ 
                    FOR SELECT ARTI_COD, CANT * COSTO
                        FROM COSTO_VENTAS
                        WHERE CTACOS = :CUENTA
                        INTO :ART, :MONTO
                    DO
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    NROI = NROI + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    END
                END  $$IBE$$*/ /* MONTO <> 0 */ /*$$IBE$$ 
            END  $$IBE$$*/ /* FOR */ /*$$IBE$$ 
        END  $$IBE$$*/ /* COSTOS */ /*$$IBE$$ 
    if (COSTOS = 'K') then
        BEGIN
        SELECT SUM(COSTO)
            FROM COSTO_VENTAS
            INTO :MONTO;
        if (MONTO <> 0) then
            BEGIN
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTACOSTOS INTO :CUENTA, :TIPOCUEN;
            IF (CUENTA IS NULL) THEN
                begin
                EXECUTE PROCEDURE ERROR (31, 0, :CTACOSTOS, 2);
                CUENTA = CTARTFTE;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                 $$IBE$$*/ /* ES UNA CUENTA DE INVENTARIO, REGISTRE UNO A UNO LOS ARTICULOS */ /*$$IBE$$ 
                FOR SELECT ARTI_COD, CANT * COSTO
                    FROM COSTO_VENTAS
                    INTO :ART, :MONTO
                DO
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTACOSTOS, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                    NROI = NROI + 1;
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTACOSTOS, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTACOSTOS, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                END
            END  $$IBE$$*/ /* MONTO <> 0 */ /*$$IBE$$ 
        END  $$IBE$$*/ /* COSTOS = K */ /*$$IBE$$ 
    if (INVEN = 'A') then
        BEGIN
        FOR SELECT MAX(CTAINV), SUM(COSTO)
            FROM COSTO_VENTAS
            GROUP BY CTAINV
            INTO :CTAINVEN, :MONTO
        DO
            BEGIN
            if (MONTO <> 0) then
                BEGIN
                CUENTA = NULL;
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :CTAINVEN INTO :CUENTA, :TIPOCUEN;
                IF (CUENTA IS NULL) THEN
                    begin
                    EXECUTE PROCEDURE ERROR (31, 0, :CTAINVEN, 2);
                    CUENTA = CTAINVEN;
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                     $$IBE$$*/ /* ES UNA CUENTA DE INVENTARIO, REGISTRE UNO A UNO LOS ARTICULOS */ /*$$IBE$$ 
                    FOR SELECT ARTI_COD, CANT * COSTO
                        FROM COSTO_VENTAS
                        WHERE CTAINV = :CUENTA
                        INTO :ART, :MONTO
                    DO
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    NROI = NROI + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    END
                END  $$IBE$$*/ /* MONTO <> 0 */ /*$$IBE$$ 
            END  $$IBE$$*/ /* FOR */ /*$$IBE$$ 
        END  $$IBE$$*/ /* INVEN = A */ /*$$IBE$$ 
    if (INVEN = 'K') then
        BEGIN
        SELECT SUM(COSTO)
            FROM COSTO_VENTAS
            INTO :MONTO;
        if (MONTO <> 0) then
            BEGIN
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTAINVEN INTO :CUENTA, :TIPOCUEN;
            IF (CUENTA IS NULL) THEN
                begin
                EXECUTE PROCEDURE ERROR (31, 0, :CTAINVEN, 2);
                CUENTA = CTAINVEN;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                 $$IBE$$*/ /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */ /*$$IBE$$ 
                FOR SELECT ARTI_COD, CANT * COSTO
                    FROM COSTO_VENTAS
                    INTO :ART, :MONTO
                DO
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTAINVEN, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                    NROI = NROI + 1;
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAINVEN, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAINVEN, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                END
            END  $$IBE$$*/ /* MONTO <> 0 */ /*$$IBE$$ 
        END  $$IBE$$*/ /* INVEN = K */
    /* recorra las cuentas adicionales */ /*$$IBE$$ 
    FOR SELECT INVC_CUENTA, INVC_BASE, INVC_PORC, INVC_VALOR, INVC_DB
        FROM INTERFAZ_VENTAS_CTAS
        WHERE INVE_ID = :IDINTER
        INTO :CTADIC, :BASEADIC, :PORCADIC, :VALORADIC, :DBADIC
        DO
        BEGIN
        if (VALORADIC <> 0) then
            MONTO = VALORADIC;
        ELSE
            BEGIN
            if (:BASEADIC = 'SUBTOTAL') then
                VALORADIC = vrsubt;
            if (:BASEADIC = 'DESCUENTO') then
                VALORADIC = VRDTO;
            if (:BASEADIC = 'IVA') then
                VALORADIC = VRIVA;
            if (:BASEADIC = 'ADICIONAL') then
                VALORADIC = VRADIC;
            if (:BASEADIC = 'EXTRA') then
                VALORADIC = VREXTRA;
            if (:BASEADIC = 'TOTAL') then
                VALORADIC = VRTOTAL;
            MONTO = VALORADIC * PORCADIC / 100;
            END
        if (MONTO <> 0) then
            BEGIN
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTADIC INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERROR (31, 0, :CTADIC, 2);
                CUENTA = CTADIC;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                begin
                EXECUTE PROCEDURE ERROR (31, 0, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'C') then
                BEGIN
                if (DBADIC = 'S') then
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                ELSE
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                if (DBADIC = 'S') then
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                ELSE
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                END
            NROI = NROI + 1;
            END
        END
    if (ERROR > 0) then
        VER = 'S';
    SUSPEND;
    END  $$IBE$$*/ /* EXISTE LA INTERFAZ */ /*$$IBE$$ 
ELSE
    BEGIN
    EXECUTE PROCEDURE ERROR (31, 0, :PREF, 1);
    ERROR = ERROR + 1;
    VER = 'S';
    SUSPEND;
    END
 $$IBE$$*/ SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE CONTABIL_FACTURAS_CONTADO(
    FECFAC DATE,
    NIT VARCHAR(20),
    PREF VARCHAR(4),
    PTVTA INTEGER,
    IDINTER INTEGER)
RETURNS (
    ERROR INTEGER,
    VER CHAR(1),
    IDC INTEGER)
AS
declare variable num varchar(8);
declare variable numero varchar(10);
declare variable fecha char(8);
declare variable conc char(120);
declare variable vence char(8);
declare variable vrdto numeric(18,2);
declare variable vradic numeric(18,2);
declare variable vrsubt numeric(18,2);
declare variable vriva numeric(18,2);
declare variable prtfte numeric(9,2);
declare variable vrrtfte numeric(18,2);
declare variable vrrtiva numeric(18,2);
declare variable prtica numeric(9,2);
declare variable vrrtica numeric(18,2);
declare variable vrtotal numeric(18,2);
declare variable vrextra numeric(18,2);
declare variable tipocomp varchar(3);
declare variable prefcont varchar(4);
declare variable ventas char(1);
declare variable ctaventas varchar(20);
declare variable iva char(1);
declare variable ctaiva varchar(20);
declare variable consumo char(1);
declare variable ctaconsumo varchar(20);
declare variable cartera char(1);
declare variable ctacartera varchar(20);
declare variable rtfte char(1);
declare variable ctartfte varchar(20);
declare variable rtiva char(1);
declare variable ctartiva varchar(20);
declare variable rtica char(1);
declare variable ctartica varchar(20);
declare variable inven char(1);
declare variable ctainven varchar(20);
declare variable costos char(1);
declare variable ctacostos varchar(20);
declare variable ctadto varchar(20);
declare variable ctaadic varchar(20);
declare variable ctaextra varchar(20);
declare variable existe char(1);
declare variable cuenta varchar(20);
declare variable monto numeric(18,2);
declare variable tipocuen char(1);
declare variable nombre varchar(60);
declare variable proy varchar(4);
declare variable centro varchar(4);
declare variable porc numeric(5,2);
declare variable debito numeric(18,2);
declare variable credito numeric(18,2);
declare variable nroi integer;
declare variable art varchar(15);
declare variable impinc char(1);
declare variable imptos numeric(18,2);
declare variable suma numeric(18,2);
declare variable porciva numeric(9,2);
declare variable tctaclien varchar(20);
declare variable tctaventa varchar(20);
declare variable tctartfte varchar(20);
declare variable tctartiva varchar(20);
declare variable tctartica varchar(20);
declare variable ctadic varchar(20);
declare variable baseadic varchar(20);
declare variable porcadic numeric(5,2);
declare variable valoradic numeric(18,2);
declare variable dbadic char(1);
declare variable ptovta integer;
declare variable dig integer;
declare variable mercancia numeric(18,2);
declare variable factor double precision;
declare variable cent char(1);
BEGIN
/* BUSQUE LA INTERFACE */
EXISTE = 'N';
SELECT 'S', TICO_COD, PRCO_PRE, INVE_VENTAS, INVE_IVA, INVE_CONSUMO, INVE_CARTERA, INVE_RTFTE, INVE_RTIVA, INVE_RTICA, INVE_COSTO, INVE_INVEN, INVE_CTAVENTAS, INVE_CTAIVA, INVE_CTACONSUMO, INVE_CTADTO, INVE_CTAADIC, INVE_CTAEXTRA, INVE_CTACARTERA, INVE_CTARTFTE, INVE_CTARTIVA, INVE_CTARTICA, INVE_CTAINVEN, INVE_CTACOSTOS, INVE_CONFIRMAR, INVE_CENTRO
    FROM INTERFAZ_VENTAS
    WHERE INVE_ID = :IDINTER
    INTO :EXISTE, :TIPOCOMP, :PREFCONT, :VENTAS, :IVA, :CONSUMO, :CARTERA, :RTFTE, :RTIVA, :RTICA, :COSTOS, :INVEN, :CTAVENTAS, :CTAIVA, :CTACONSUMO, :CTADTO, :CTAADIC, :CTAEXTRA, :CTACARTERA, :CTARTFTE, :CTARTIVA, :CTARTICA, :CTAINVEN, :CTACOSTOS, :VER, :CENT;
if (EXISTE = 'S') then
  BEGIN
  /* BORRE CUALQUEIR CONTABILIZACION PREVIA */
/*  DELETE FROM CONTABILIZACION WHERE CNTB_TIPOREF = 31 AND CNTB_IDREF = 0;
  /* BUSQUE EL CENTRO DEL PUNTO, LA BODEGA, O EL PREFIJO  */
  IF (CENT = 'B') THEN
    SELECT B.BODE_CENTRO, B.BODE_PROY FROM BODEGA B, PUNTO_VENTA P
        WHERE B.BODE_COD = P.BODE_COD AND P.ptvt_id = :ptvta INTO :CENTRO, :PROY;
  IF (CENT = 'V') THEN
    SELECT MAX(V.CENT_COD), MAX(V.PROY_COD) FROM VENDEDORES V
        WHERE V.PTVT_ID = :PTVTA INTO :CENTRO, :PROY;
  IF (CENT = 'P') THEN
    SELECT P.PREF_PROY, P.PREF_CENTRO FROM PREFIJOS P
        WHERE P.PREF_PRE = :PREF AND P.TIDO_COD = 31 INTO :CENTRO, :PROY;
  /* TRAIGA LOS DATOS DEL CLIENTE */
  SELECT TERC_NOM, TERC_CTARTFTE, TERC_CTARTIVA, TERC_CTARTICA, TERC_CTAVENTA, TERC_CTACLIENTE
        FROM TERCEROS T WHERE TERC_NIT = :NIT
        INTO :NOMBRE, TCTARTFTE, TCTARTIVA, TCTARTICA, TCTAVENTA, TCTACLIEN;
  SELECT SUM(FACT_DTOMONTO), SUM(FACT_ADICIONAL), SUM(FACT_IVAMONTO), SUM(FACT_EXTRA), SUM(FACT_TOTAL), SUM(FACT_RTFTEMONTO), SUM(FACT_RTIVAMONTO), SUM(FACT_RTICAMONTO), MAX(FACT_IVAINC)
        FROM FACTURAS F WHERE FACT_FECHA = :FECFAC AND FACT_ANULADO = 'N' AND PTVT_ID = :ptvta AND PREF_PRE = :PREF
        INTO :VRDTO, :VRADIC, :VRIVA, :VREXTRA, :VRTOTAL, :VRRTFTE, :VRRTIVA, :VRRTICA, :impinc;
  VRSUBT = VRTOTAL - VREXTRA - VRIVA; /* BASE DE RETEFTE Y RETEICA */
  MERCANCIA = VRSUBT - VRADIC + VRDTO;
  EXECUTE PROCEDURE FECHA_A_CONTA(:FECFAC) returning_values (:FECHA);
  VENCE = FECHA;
  /* REGISTRE EL ENCABEZADO CONTABLE */
  IDC = GEN_ID(ID_CONTABILIZA, 1);
  CONC = 'RESUMEN VENTAS ' || FECHA;
  NUM = SUBSTR(FECHA, 3, 8);
  INSERT INTO CONTABILIZACION (CNTB_ID, CNTB_TIPOCOMP, CNTB_PREFCNT, CNTB_NUMERO, CNTB_FECHA, CNTB_CONCEPTO, CNTB_REF, CNTB_TIPOREF, CNTB_IDREF, CNTB_PREFREF, CNTB_NUMREF, CNTB_PROCESADO)
        VALUES (:IDC, :TIPOCOMP, :PREFCONT, :NUM, :FECHA, :CONC, '', 0, 0, :PREF, :NUM, 'N');
  NROI = 0;
  SUMA = 0;
  ERROR = 0;
  /* SI NO HAY CUENTA DE DESCUENTO NI ADICIONAL CALCULE UN FACTOR PARA LAS VENTAS Y EL IVA */
  if (MERCANCIA <> 0) then
    FACTOR = CAST(VRSUBT AS DOUBLE PRECISION) / CAST(MERCANCIA AS DOUBLE PRECISION);
  ELSE
    FACTOR = 1;
  /* TRAIGA EL NUMERO DE DIGITOS PARA EL REDONDEO */
  SELECT CAST(CONF_VALOR AS INTEGER) FROM CONFIGURACION WHERE CONF_MODULO = 'FACTURACION' AND
        CONF_CATEGORIA = 'GENERAL' AND CONF_PROPIEDAD = 'REDONDEO AL MULTIPLO DE DIEZ EN TOTALES' INTO :DIG;
  /* CUENTAS DE VENTAS */
  if (VENTAS = 'A') then
        BEGIN
        FOR SELECT MAX(COAR_CTAVNT), SUM(CAST(FADE_CANT AS DOUBLE PRECISION) * (FADE_PRUNIT-FADE_DTOMONTO)), SUM(FADE_IVAMONTO+FADE_CONSUMO)
            FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_DETALLE FD, FACTURAS F
            WHERE F.FACT_ID = FD.FACT_ID AND FACT_FECHA = :FECFAC AND FD.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND F.PREF_PRE = :PREF AND F.PTVT_ID = :PTVTA AND FACT_ANULADO = 'N' AND FADE_REFERENCIA <> '.t'
            GROUP BY COAR_CTAVNT
            INTO :CTAVENTAS, :MONTO, :IMPTOS
            DO
            BEGIN
            if (IMPINC = 'S') then
                MONTO = MONTO - IMPTOS;
            if ((CTADTO IS NULL) OR (CTADTO = '')) then
                MONTO = MONTO * FACTOR;
            execute procedure redondee(MONTO, DIG) returning_values (MONTO);
            if (MONTO <> 0) then
                BEGIN
                CUENTA = NULL;
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :CTAVENTAS INTO :CUENTA, :TIPOCUEN;
                if (CUENTA IS NULL) then
                    begin
                    EXECUTE PROCEDURE ERROR (31, 0, :CTAVENTAS, 2);
                    CUENTA = CTAVENTAS;
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT FD.ARTI_COD, (CAST(FADE_CANT AS DOUBLE PRECISION) * (FADE_PRUNIT-FADE_DTOMONTO)), (FADE_IVAMONTO+FADE_CONSUMO)
                        FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_DETALLE FD, FACTURAS F
                        WHERE F.FACT_ID = FD.FACT_ID AND FACT_FECHA = :FECFAC AND F.PREF_PRE = :PREF AND F.PTVT_ID = :PTVTA AND FD.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTAINV = :CUENTA AND FACT_ANULADO = 'N' AND FADE_REFERENCIA <> '.t'
                        INTO :ART, :MONTO, :IMPTOS
                    DO
                        BEGIN
                        if (IMPINC = 'S') then
                            MONTO = MONTO - IMPTOS;
                        if ((CTADTO IS NULL) OR (CTADTO = '')) then
                            MONTO = MONTO * FACTOR;
                        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                        if (MONTO <> 0) then
                            BEGIN
                            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                            NROI = NROI + 1;
                            SUMA = SUMA - MONTO;
                            END
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    NROI = NROI + 1;
                    SUMA = SUMA - MONTO;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA - MONTO;
                    END
                END /* MONTO <> 0 */
            END /* FOR */
        END /* VENTAS X ARTICULO */
     IF ((VENTAS = 'C') OR (VENTAS = 'K')) THEN
        BEGIN
        IF (VENTAS = 'C') THEN
            CTAVENTAS = TCTAVENTA;
        SELECT SUM(CAST(FADE_CANT AS DOUBLE PRECISION) * (FADE_PRUNIT-FADE_DTOMONTO)), SUM(FADE_IVAMONTO+FADE_CONSUMO)
            FROM FACTURAS_DETALLE FD, FACTURAS F
            WHERE F.FACT_ID = FD.FACT_ID AND FACT_FECHA = :FECFAC AND F.PREF_PRE = :PREF AND F.PTVT_ID = :PTVTA AND FACT_ANULADO = 'N' AND FADE_REFERENCIA <> '.t'
            INTO :MONTO, :IMPTOS;
        if (IMPINC = 'S') then
            MONTO = MONTO - IMPTOS;
        if ((CTADTO IS NULL) OR (CTADTO = '')) then
            MONTO = MONTO * FACTOR;
        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
        if (MONTO <> 0) then
            BEGIN
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTAVENTAS INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERROR (31, 0, :CTAVENTAS, 2);
                CUENTA = CTAVENTAS;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT FD.ARTI_COD, (CAST(FADE_CANT AS DOUBLE PRECISION) * (FADE_PRUNIT-FADE_DTOMONTO)), (FADE_IVAMONTO+FADE_CONSUMO)
                    FROM /*ARTICULO A,*/ FACTURAS_DETALLE FD, FACTURAS F
                    WHERE F.FACT_ID = FD.FACT_ID AND FACT_FECHA = :FECFAC AND F.PREF_PRE = :PREF AND F.PTVT_ID = :PTVTA AND FACT_ANULADO = 'N' AND FADE_REFERENCIA <> '.t'
                    INTO :ART, :MONTO, :IMPTOS
                    DO
                    BEGIN
                    if (IMPINC = 'S') then
                        MONTO = MONTO - IMPTOS;
                    if ((CTADTO IS NULL) OR (CTADTO = '')) then
                        MONTO = MONTO * FACTOR;
                    execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                    if (MONTO <> 0) then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        SUMA = SUMA - MONTO;
                        END
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - MONTO;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - MONTO;
                END
            END /* MONTO <> 0 */
        END /* VENTAS DE CLIENTE O CONSTANTE */
    /* EL IVA EN VENTAS */
    if (IVA = 'A') then
        BEGIN
        FOR SELECT MAX(COAR_CTAIVAV), SUM(FADE_IVAMONTO), SUM(CAST(FADE_CANT AS DOUBLE PRECISION) * (FADE_PRUNIT-FADE_DTOMONTO)), sum(FADE_CONSUMO)
            FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_DETALLE FD, FACTURAS F
            WHERE F.FACT_ID = FD.FACT_ID AND FACT_FECHA = :FECFAC AND F.PREF_PRE = :PREF AND F.PTVT_ID = :PTVTA AND FD.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND FACT_ANULADO = 'N' AND FADE_REFERENCIA <> '.t'
            GROUP BY COAR_CTAIVAV
            INTO :CTAIVA, :IMPTOS, :MONTO, :VALORADIC
        DO
            BEGIN
            if (IMPINC = 'S') then
                MONTO = MONTO - IMPTOS - VALORADIC;
            MONTO = MONTO * -1;
            MONTO = MONTO * FACTOR;
            IMPTOS = IMPTOS * FACTOR;
            execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
            execute procedure redondee(MONTO, DIG) returning_values (MONTO);
            if (IMPTOS <> 0) then
                BEGIN
                CUENTA = NULL;
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :CTAIVA INTO :CUENTA, :TIPOCUEN;
                if (CUENTA IS NULL) then
                    begin
                    EXECUTE PROCEDURE ERROR (31, 0, :CTAIVA, 2);
                    CUENTA = CTAIVA;
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT FD.ARTI_COD, FADE_IVAMONTO, (CAST(FADE_CANT AS DOUBLE PRECISION) * (FADE_PRUNIT-FADE_DTOMONTO)), TAIV_PORC, FADE_CONSUMO
                        FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_DETALLE FD, FACTURAS F, TARIFA_IVA T
                        WHERE F.FACT_ID = FD.FACT_ID AND FACT_FECHA = :FECFAC AND F.PREF_PRE = :PREF AND F.PTVT_ID = :PTVTA AND FD.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTAIVAV = :CUENTA AND A.TAIV_COD = T.TAIV_COD AND FACT_ANULADO = 'N' AND FADE_REFERENCIA <> '.t'
                        INTO :ART, :IMPTOS, :MONTO, :PORCIVA, :VALORADIC
                    DO
                        BEGIN
                        if (IMPINC = 'S') then
                            MONTO = MONTO - IMPTOS - VALORADIC;
                        MONTO = MONTO * -1;
                        MONTO = MONTO * FACTOR;
                        IMPTOS = IMPTOS * FACTOR;
                        execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                        if (IMPTOS <> 0) then
                            BEGIN
                            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, :MONTO, :PORCIVA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                            NROI = NROI + 1;
                            SUMA = SUMA + DEBITO - CREDITO;
                            END
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, :MONTO, ABS(:IMPTOS*100/:MONTO), :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    NROI = NROI + 1;
                    SUMA = SUMA - IMPTOS;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, :MONTO, ABS(:IMPTOS*100/:MONTO), :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA - IMPTOS;
                    END
                END   /* IMPTOS <> 0 */
            END /* FOR */
        END /* IVA X ARTICULO */
    if (IVA = 'K') then /* IVA EN CTA CONSTANTE */
        BEGIN
        SELECT SUM(FADE_IVAMONTO), SUM(CAST(FADE_CANT AS DOUBLE PRECISION) * (FADE_PRUNIT-FADE_DTOMONTO)), SUM(FADE_CONSUMO)
            FROM FACTURAS_DETALLE FD, FACTURAS F
            WHERE F.FACT_ID = FD.FACT_ID AND FACT_FECHA = :FECFAC AND F.PREF_PRE = :PREF AND F.PTVT_ID = :PTVTA AND FACT_ANULADO = 'N' AND FADE_REFERENCIA <> '.t'
            INTO :IMPTOS, :MONTO, :valoradic;
        if (IMPINC = 'S') then
            MONTO = MONTO - IMPTOS - VALORADIC;
        MONTO = MONTO * -1;
        MONTO = MONTO * FACTOR;
        IMPTOS = IMPTOS * FACTOR;
        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
        execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
        if (IMPTOS <> 0) then
            BEGIN
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTAIVA INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERROR (31, 0, :CTAIVA, 2);
                CUENTA = CTAIVA;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT FD.ARTI_COD, (CAST(FADE_CANT AS DOUBLE PRECISION) * (FADE_PRUNIT-FADE_DTOMONTO)), FADE_IVAMONTO, TAIV_PORC, FADE_CONSUMO
                    FROM ARTICULO A, FACTURAS_DETALLE FD, FACTURAS F, TARIFA_IVA T
                    WHERE F.FACT_ID = FD.FACT_ID AND FACT_FECHA = :FECFAC AND F.PREF_PRE = :PREF AND F.PTVT_ID = :PTVTA AND FD.arti_cod = A.arti_cod AND T.TAIV_COD=A.TAIV_COD AND FACT_ANULADO = 'N' AND FADE_REFERENCIA <> '.t'
                    INTO :ART, :MONTO, :IMPTOS, :PORCIVA, :VALORADIC
                    DO
                    BEGIN
                    if (IMPINC = 'S') then
                        MONTO = MONTO - IMPTOS - VALORADIC;
                    MONTO = MONTO * -1;
                    MONTO = MONTO * FACTOR;
                    IMPTOS = IMPTOS * FACTOR;
                    execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                    execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                    if (IMPTOS <> 0) then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', 0, :IMPTOS, :MONTO, :PORCIVA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        SUMA = SUMA - IMPTOS;
                        END
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', 0, :IMPTOS, :MONTO, ABS(:IMPTOS*100/:MONTO), :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - IMPTOS;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', 0, :IMPTOS, :MONTO, ABS(:IMPTOS*100/:MONTO), :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - IMPTOS;
                END
            END /* IMPTOS <> 0 */
        END /* IVA EN CTA CONSTANTE */
    /* EL IMPOCONSUMO */
    if (CONSUMO = 'A') then
        BEGIN
        FOR SELECT MAX(COAR_CTACONS), SUM(FADE_CONSUMO)
            FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_DETALLE FD, FACTURAS F
            WHERE F.FACT_ID = FD.FACT_ID AND FACT_FECHA = :FECFAC AND F.PREF_PRE = :PREF AND F.PTVT_ID = :PTVTA AND FD.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND FACT_ANULADO = 'N' AND FADE_REFERENCIA <> '.t'
            GROUP BY COAR_CTACONS
            INTO :CTACONSUMO, :IMPTOS
        DO
            BEGIN
            execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
            if (IMPTOS <> 0) then
                BEGIN
                CUENTA = NULL;
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :CTACONSUMO INTO :CUENTA, :TIPOCUEN;
                if (CUENTA IS NULL) then
                    begin
                    EXECUTE PROCEDURE ERROR (31, 0, :CTACONSUMO, 2);
                    CUENTA = CTACONSUMO;
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, REGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT FD.ARTI_COD, FADE_CONSUMO
                        FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_DETALLE FD, FACTURAS F
                        WHERE F.FACT_ID = FD.FACT_ID AND FACT_FECHA = :FECFAC AND F.PREF_PRE = :PREF AND F.PTVT_ID = :PTVTA AND FD.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTACONS = :CUENTA AND FACT_ANULADO = 'N' AND FADE_REFERENCIA <> '.t'
                        INTO :ART, :IMPTOS
                    DO
                        BEGIN
                        execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                        if (IMPTOS <> 0) then
                            BEGIN
                            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                            NROI = NROI + 1;
                            SUMA = SUMA - IMPTOS;
                            END
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    NROI = NROI + 1;
                    SUMA = SUMA - IMPTOS;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA - CREDITO;
                    END
                END /* IMPTOS <> 0 */
            END /* FOR */
        END /* CONSUMO X ARTICULO */
    if (CONSUMO = 'K') then /* CONSUMO EN CTA CONSTANTE */
        BEGIN
        SELECT SUM(FADE_CONSUMO)
            FROM FACTURAS_DETALLE FD, FACTURAS F
            WHERE F.FACT_ID = FD.FACT_ID AND FACT_FECHA = :FECFAC AND F.PREF_PRE = :PREF AND F.PTVT_ID = :PTVTA AND FACT_ANULADO = 'N' AND FADE_REFERENCIA <> '.t'
            INTO :IMPTOS;
        execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
        if (IMPTOS <> 0) then
            BEGIN
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTACONSUMO INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERROR (31, 0, :CTACONSUMO, 2);
                CUENTA = CTACONSUMO;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT FD.ARTI_COD, FADE_CONSUMO
                    FROM /*ARTICULO A,*/ FACTURAS_DETALLE FD, FACTURAS F
                    WHERE F.FACT_ID = FD.FACT_ID AND FACT_FECHA = :FECFAC AND F.PREF_PRE = :PREF AND F.PTVT_ID = :PTVTA AND FACT_ANULADO = 'N' AND FADE_REFERENCIA <> '.t'
                    INTO :ART, :IMPTOS
                    DO
                    BEGIN
                    execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                    if (IMPTOS <> 0) then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CTACONSUMO, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        SUMA = SUMA - IMPTOS;
                        END
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTACONSUMO, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - IMPTOS;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTACONSUMO, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - IMPTOS;
                END
            END /* IMPTOS <> 0 */
        END /* CONSUMO EN CTA CONSTANTE */
    /* DESCUENTO */
    if ((CTADTO IS NOT NULL) AND (CTADTO <> '')) then
        BEGIN
        execute procedure redondee(VRDTO, DIG) returning_values (VRDTO);
        if (VRDTO <> 0) then
            BEGIN
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTADTO INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERROR (31, 0, :CTADTO, 2);
                CUENTA = CTADTO;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                begin
                EXECUTE PROCEDURE ERROR (31, 0, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRDTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA + VRDTO;
                END
            if (TIPOCUEN = 'N') then
                    BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRDTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA + VRDTO;
                END
            END
        END /* DESCUENTO */
    /* VALOR ADIC */
    if ((CTAADIC IS NOT NULL) AND (CTAADIC <> '')) then
        BEGIN
        execute procedure redondee(VRADIC, DIG) returning_values (VRADIC);
        if (VRADIC <> 0) THEN
            BEGIN
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTAADIC INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERROR (31, 0, :CTAADIC, 2);
                CUENTA = CTAADIC;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                begin
                EXECUTE PROCEDURE ERROR (31, 0, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRADIC, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - VRADIC;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRADIC, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - VRADIC;
                END
            END
        END /* VR. ADIC */
    /* VALOR EXTRA */
    if ((CTAEXTRA IS NOT NULL) AND (CTAEXTRA <> '')) THEN
        BEGIN
        execute procedure redondee(VREXTRA, DIG) returning_values (VREXTRA);
        if (VREXTRA <> 0) THEN
            BEGIN
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTAEXTRA INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERROR (31, 0, :CTAEXTRA, 2);
                CUENTA = CTAEXTRA;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                begin
                EXECUTE PROCEDURE ERROR (31, 0, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VREXTRA, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - VREXTRA;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VREXTRA, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - VREXTRA;
                END
            END
        END /* VR. EXTRA */
    /* RETENCION FUENTE */
    if ((RTFTE = 'C') or (RTFTE = 'K')) then
      BEGIN
      execute procedure redondee(VRRTFTE, DIG) returning_values (VRRTFTE);
      if (VRRTFTE <> 0) then
        BEGIN
        if (RTFTE = 'C') then
            CTARTFTE = TCTARTFTE;
        CUENTA = NULL;
        SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
            WHERE CUEN_COD = :CTARTFTE INTO :CUENTA, :TIPOCUEN;
        if (CUENTA IS NULL) then
            begin
            EXECUTE PROCEDURE ERROR (31, 0, :CTARTFTE, 2);
            CUENTA = CTARTFTE;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            begin
            EXECUTE PROCEDURE ERROR (31, 0, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :VRSUBT, :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTFTE;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :VRSUBT, :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTFTE;
            END
        END /* RTFTE */
      END
    /* RETENCION IVA */
    if ((RTIVA = 'C') or (RTIVA = 'K')) then
      BEGIN
      execute procedure redondee(VRRTIVA, DIG) returning_values (VRRTIVA);
      if (VRRTIVA <> 0) then
        BEGIN
        if (RTIVA = 'C') then
            CTARTIVA = TCTARTIVA;
        CUENTA = NULL;
        SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
            WHERE CUEN_COD = :CTARTIVA INTO :CUENTA, :TIPOCUEN;
        if (CUENTA IS NULL) then
            begin
            EXECUTE PROCEDURE ERROR (31, 0, :CTARTIVA, 2);
            CUENTA = CTARTIVA;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            begin
            EXECUTE PROCEDURE ERROR (31, 0, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTIVA, 0, :VRIVA, :PORC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTIVA;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTIVA, 0, :VRIVA, :PORC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTIVA;
            END
        END /* RTIVA */
      END
    /* RETENCION DE ICA */
    if ((RTICA = 'C') or (RTICA = 'K')) then
      BEGIN
      execute procedure redondee(VRRTICA, DIG) returning_values (VRRTICA);
      if (VRRTICA <> 0) then
        BEGIN
        if (RTICA = 'C') then
            CTARTICA = TCTARTICA;
        CUENTA = NULL;
        SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
            WHERE CUEN_COD = :CTARTICA INTO :CUENTA, :TIPOCUEN;
        if (CUENTA IS NULL) then
            begin
            EXECUTE PROCEDURE ERROR (31, 0, :CTARTICA, 2);
            CUENTA = CTARTICA;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            begin
            EXECUTE PROCEDURE ERROR (31, 0, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTICA, 0, :VRSUBT, :PRTICA, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTICA;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTICA, 0, :VRSUBT, :PRTICA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTICA;
            END
        END /* RTICA */
      END
    /* CIERRE EL COMPROBANTE CONTRA LA CUENTA DEL TERCERO O LA CONSTANTE */
    if ((SUMA <> 0) and ((CARTERA = 'C') or (CARTERA = 'K') or (CARTERA = 'J'))) then
        BEGIN
        if (SUMA < 0) then
            BEGIN
            DEBITO = SUMA * -1;
            CREDITO = 0;
            END
        ELSE
            BEGIN
            DEBITO = 0;
            CREDITO = SUMA;
            END
        if (CARTERA = 'C') then
            CTACARTERA = TCTACLIEN;
        if (CARTERA = 'J') then
            BEGIN
            /* BUSQUE LA CUENTA DE LA CAJA */
            SELECT CAJA_CUENTA FROM CAJAS C, PUNTO_VENTA P
                WHERE P.CAJA_ID = C.CAJA_ID AND PTVT_ID = :PTOVTA
                INTO :CTACARTERA;
            END
        CUENTA = NULL;
        SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
            WHERE CUEN_COD = :CTACARTERA INTO :CUENTA, :TIPOCUEN;
        if (CUENTA IS NULL) then
            begin
            EXECUTE PROCEDURE ERROR (31, 0, :CTACARTERA, 2);
            CUENTA = CTACARTERA;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            begin
            EXECUTE PROCEDURE ERROR (31, 0, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'C') then
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :DEBITO, :CREDITO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
        if (TIPOCUEN = 'N') then
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :DEBITO, :CREDITO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
        NROI = NROI + 1;
        END /* SUMA EN CARTERA */
    /* CALCULE LOS COSTOS */
    EXECUTE PROCEDURE costo_en_ventas_contado(:fecfac,  :pref, :ptvta);
    if (COSTOS = 'A') then
        BEGIN
        FOR SELECT MAX(CTACOS), SUM(COSTO)
            FROM COSTO_VENTAS
            GROUP BY CTACOS
            INTO :CTACOSTOS, :MONTO
        DO
            BEGIN
            if (MONTO <> 0) then
                BEGIN
                CUENTA = NULL;
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :CTACOSTOS INTO :CUENTA, :TIPOCUEN;
                IF (CUENTA IS NULL) THEN
                    begin
                    EXECUTE PROCEDURE ERROR (31, 0, :CTACOSTOS, 2);
                    CUENTA = CTARTFTE;
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT ARTI_COD, CANT * COSTO
                        FROM COSTO_VENTAS
                        WHERE CTACOS = :CUENTA
                        INTO :ART, :MONTO
                    DO
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    NROI = NROI + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    END
                END /* MONTO <> 0 */
            END /* FOR */
        END /* COSTOS */
    if (COSTOS = 'K') then
        BEGIN
        SELECT SUM(COSTO)
            FROM COSTO_VENTAS
            INTO :MONTO;
        if (MONTO <> 0) then
            BEGIN
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTACOSTOS INTO :CUENTA, :TIPOCUEN;
            IF (CUENTA IS NULL) THEN
                begin
                EXECUTE PROCEDURE ERROR (31, 0, :CTACOSTOS, 2);
                CUENTA = CTARTFTE;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, REGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT ARTI_COD, CANT * COSTO
                    FROM COSTO_VENTAS
                    INTO :ART, :MONTO
                DO
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTACOSTOS, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                    NROI = NROI + 1;
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTACOSTOS, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTACOSTOS, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                END
            END /* MONTO <> 0 */
        END /* COSTOS = K */
    if (INVEN = 'A') then
        BEGIN
        FOR SELECT MAX(CTAINV), SUM(COSTO)
            FROM COSTO_VENTAS
            GROUP BY CTAINV
            INTO :CTAINVEN, :MONTO
        DO
            BEGIN
            if (MONTO <> 0) then
                BEGIN
                CUENTA = NULL;
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :CTAINVEN INTO :CUENTA, :TIPOCUEN;
                IF (CUENTA IS NULL) THEN
                    begin
                    EXECUTE PROCEDURE ERROR (31, 0, :CTAINVEN, 2);
                    CUENTA = CTAINVEN;
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, REGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT ARTI_COD, CANT * COSTO
                        FROM COSTO_VENTAS
                        WHERE CTAINV = :CUENTA
                        INTO :ART, :MONTO
                    DO
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    NROI = NROI + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    END
                END /* MONTO <> 0 */
            END /* FOR */
        END /* INVEN = A */
    if (INVEN = 'K') then
        BEGIN
        SELECT SUM(COSTO)
            FROM COSTO_VENTAS
            INTO :MONTO;
        if (MONTO <> 0) then
            BEGIN
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTAINVEN INTO :CUENTA, :TIPOCUEN;
            IF (CUENTA IS NULL) THEN
                begin
                EXECUTE PROCEDURE ERROR (31, 0, :CTAINVEN, 2);
                CUENTA = CTAINVEN;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT ARTI_COD, CANT * COSTO
                    FROM COSTO_VENTAS
                    INTO :ART, :MONTO
                DO
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTAINVEN, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                    NROI = NROI + 1;
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAINVEN, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAINVEN, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                END
            END /* MONTO <> 0 */
        END /* INVEN = K */
    /* recorra las cuentas adicionales */
    FOR SELECT INVC_CUENTA, INVC_BASE, INVC_PORC, INVC_VALOR, INVC_DB
        FROM INTERFAZ_VENTAS_CTAS
        WHERE INVE_ID = :IDINTER
        INTO :CTADIC, :BASEADIC, :PORCADIC, :VALORADIC, :DBADIC
        DO
        BEGIN
        if (VALORADIC <> 0) then
            MONTO = VALORADIC;
        ELSE
            BEGIN
            if (:BASEADIC = 'SUBTOTAL') then
                VALORADIC = vrsubt;
            if (:BASEADIC = 'DESCUENTO') then
                VALORADIC = VRDTO;
            if (:BASEADIC = 'IVA') then
                VALORADIC = VRIVA;
            if (:BASEADIC = 'ADICIONAL') then
                VALORADIC = VRADIC;
            if (:BASEADIC = 'EXTRA') then
                VALORADIC = VREXTRA;
            if (:BASEADIC = 'TOTAL') then
                VALORADIC = VRTOTAL;
            MONTO = VALORADIC * PORCADIC / 100;
            END
        if (MONTO <> 0) then
            BEGIN
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTADIC INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERROR (31, 0, :CTADIC, 2);
                CUENTA = CTADIC;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                begin
                EXECUTE PROCEDURE ERROR (31, 0, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'C') then
                BEGIN
                if (DBADIC = 'S') then
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                ELSE
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                if (DBADIC = 'S') then
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                ELSE
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                END
            NROI = NROI + 1;
            END
        END
    if (ERROR > 0) then
        VER = 'S';
    SUSPEND;
    END /* EXISTE LA INTERFAZ */
ELSE
    BEGIN
    EXECUTE PROCEDURE ERROR (31, 0, :PREF, 1);
    ERROR = ERROR + 1;
    VER = 'S';
    SUSPEND;
    END
END

^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER PROCEDURE DETALLE_DEVOLUCIONES_POS(
    FECHA DATE,
    PUNTO INTEGER,
    VENDEDOR INTEGER,
    PREFIJO VARCHAR(4))
RETURNS (
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    ITEM INTEGER,
    ARTICULO VARCHAR(15),
    ARTIDES VARCHAR(60),
    CANT NUMERIC(18,4),
    UNIDAD VARCHAR(8),
    PRUNIT NUMERIC(18,2),
    IVAMONTO NUMERIC(18,2),
    TOTAL NUMERIC(18,2))
AS
begin
FOR SELECT PREF_PRE, FACT_NUMERO, FADE_ITEM, ARTI_COD, FADE_CANT, FADE_UNIDAD, FADE_PRUNIT, FADE_IVAMONTO, FADE_TOTAL
    FROM facturas_detalle D, FACTURAS F
    WHERE D.FACT_ID = F.FACT_ID AND FACT_FECHA = :FECHA AND PTVT_ID = :PUNTO AND VEND_COD = :VENDEDOR AND PREF_PRE = :PREFIJO AND FADE_CANT < 0 and FACT_ANULADO = 'N' and substring(D.arti_cod from 1 FOR 2) <> '.t'
    INTO :PREF, :NUMERO, :ITEM, :ARTICULO, :CANT, :UNIDAD, :PRUNIT, :ivamonto, :TOTAL
    DO
        BEGIN
        SELECT ARTI_DES FROM ARTICULO WHERE ARTI_COD = :ARTICULO INTO :ARTIDES;
        suspend;
        END
FOR SELECT PREF_PRE, DEVT_NUMERO, DVDE_ITEM, ARTI_COD, DVDE_CANT * -1, DVDE_UNIDAD, DVDE_PRUNIT, DVDE_IVAMONTO * -1, DVDE_TOTAL * -1
    FROM devoluciones_ventas_detalle D, devoluciones_ventas F
    WHERE D.DEVT_ID = F.DEVT_ID AND DEVT_FECHA = :FECHA AND PTVT_ID = :PUNTO AND VEND_COD = :VENDEDOR AND PREF_PRE = :PREFIJO AND DEVT_ANULADO = 'N' and substring(D.arti_cod from 1 FOR 2) <> '.t'
    INTO :PREF, :NUMERO, :ITEM, :ARTICULO, :CANT, :UNIDAD, :PRUNIT, :ivamonto, :TOTAL
    DO
        BEGIN
        SELECT ARTI_DES FROM ARTICULO WHERE ARTI_COD = :ARTICULO INTO :ARTIDES;
        suspend;
        END
end
^

SET TERM ; ^

SET TERM ^ ;

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

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

SET TERM ; ^

SET TERM ^ ;

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

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER PROCEDURE FALTANTES_VENTAS_ARTICULO(
    DESDE VARCHAR(20),
    HASTA VARCHAR(20),
    FECINI DATE,
    FECFIN DATE,
    DETALLE CHAR(1),
    TIPO INTEGER,
    DESTINO INTEGER,
    ORDEN CHAR(1),
    CEROS CHAR(1),
    SUCURSAL INTEGER)
RETURNS (
    ARTICULO VARCHAR(15),
    DESCRIPCION VARCHAR(60),
    CODGRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    CODSUBG VARCHAR(3),
    NOMSUBG VARCHAR(30),
    CODMARC VARCHAR(3),
    NOMMARC VARCHAR(30),
    CANTIDAD NUMERIC(18,4),
    UNIDAD VARCHAR(8),
    FALTANTE NUMERIC(18,4),
    BASE NUMERIC(18,2),
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    OBS VARCHAR(255))
AS
declare variable ID INTEGER;
declare variable ITEM INTEGER;
declare variable CANT NUMERIC(18,2);
declare variable CODINI VARCHAR(15);
declare variable CODFIN VARCHAR(15);
declare variable DESINI VARCHAR(15);
declare variable DESFIN VARCHAR(15);
declare variable MONTO NUMERIC(18,2);
declare variable FACTOR NUMERIC(18,4);
BEGIN
if (ORDEN = 'C') then
    BEGIN
    CODINI = DESDE;
    CODFIN = HASTA;
    DESINI = '';
    DESFIN = 'zz';
    END
ELSE
    BEGIN
    DESINI = DESDE;
    DESFIN = HASTA;
    CODINI = '';
    CODFIN = 'zz';
    END
  FOR SELECT ARTI_COD, ARTI_DES, ARTI_UNIDAD, A.GRUP_COD, A.SUBG_COD, A.MARC_COD FROM ARTICULO A
      WHERE ARTI_COD >= :CODINI AND ARTI_COD <= :CODFIN AND ARTI_DES >= :DESINI AND ARTI_DES <= :DESFIN
      INTO :ARTICULO, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
  DO
    BEGIN
    CANTIDAD = 0;
    faltante = 0;
    base = 0;
    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
    if (DETALLE = 'N') then
        BEGIN
        if (TIPO = 31) then
            BEGIN
            FOR SELECT F.FACT_ID, FADE_ITEM, FADE_CANT * FADE_FACTOR, (FADE_PRUNIT-FADE_DTOMONTO)
                FROM FACTURAS_DETALLE D, FACTURAS F, PREFIJOS P
                WHERE F.FACT_ID = D.FACT_ID AND ARTI_COD = :ARTICULO AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND FACT_ANULADO = 'N' AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND ((SUCU_ID = :SUCURSAL) or (:SUCURSAL = 0)) and substring(arti_cod from 1 FOR 2) <> '.t'
                ORDER BY F.FACT_ID, FADE_ITEM INTO :ID, :ITEM, :CANT, :MONTO
                DO
                BEGIN
                CANTIDAD = CANTIDAD + CANT;
                EXECUTE PROCEDURE FALTANTE(:TIPO, :DESTINO, :ID, :ITEM) returning_values (:CANT, :UNIDAD, :FACTOR);
                FALTANTE = FALTANTE + CANT;
                BASE = BASE + MONTO * CANT;
                END
            END
        if (TIPO = 32) then
            BEGIN
            FOR SELECT R.revt_id, rvde_item, RVDE_CANT * RVDE_FACTOR, (RVDE_PRUNIT-RVDE_DTOMONTO)
                FROM REMISIONES_VENTA_DETALLE D, REMISIONES_VENTA R, PREFIJOS P
                WHERE R.REVT_ID = D.REVT_ID AND ARTI_COD = :ARTICULO AND REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN AND REVT_ANULADO = 'N' AND P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = 32  AND ((SUCU_ID = :SUCURSAL) or (:SUCURSAL = 0))
                ORDER BY R.REVT_ID, RVDE_ITEM INTO :ID, :ITEM, :CANT, :MONTO
                DO
                BEGIN
                CANTIDAD = CANTIDAD + CANT;
                EXECUTE PROCEDURE FALTANTE(:TIPO, :DESTINO, :ID, :ITEM) returning_values (:CANT, :UNIDAD, :FACTOR);
                FALTANTE = FALTANTE + CANT;
                BASE = BASE + MONTO * CANT;
                END
            END
        if (TIPO = 34) then
            BEGIN
            FOR SELECT P.PEDI_ID, PEDE_ITEM, PEDE_CANT * PEDE_FACTOR, (PEDE_PRUNIT-PEDE_DTOMONTO)
                FROM PEDIDOS_DETALLE D, PEDIDOS P, PREFIJOS R
                WHERE P.PEDI_ID = D.PEDI_ID AND ARTI_COD = :ARTICULO AND PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND PEDI_ANULADO = 'N' AND P.PREF_PRE = R.PREF_PRE AND R.TIDO_COD = 34  AND ((SUCU_ID = :SUCURSAL) or (:SUCURSAL = 0))
                ORDER BY P.PEDI_ID, PEDE_ITEM INTO :ID, :ITEM, :CANT, :MONTO
                DO
                BEGIN
                CANTIDAD = CANTIDAD + CANT;
                EXECUTE PROCEDURE FALTANTE(:TIPO, :DESTINO, :ID, :ITEM) returning_values (:CANT, :UNIDAD, :FACTOR);
                FALTANTE = FALTANTE + CANT;
                BASE = BASE + MONTO * CANT;
                END
            END
        if (TIPO = 35) then
            BEGIN
            FOR SELECT C.COTI_ID, CTDE_ITEM, CTDE_CANT * CTDE_FACTOR, (CTDE_PRUNIT-CTDE_DTOMONTO)
                FROM COTIZACIONES_DETALLE D, COTIZACIONES C, PREFIJOS P
                WHERE C.COTI_ID = D.COTI_ID AND ARTI_COD = :ARTICULO AND COTI_FECHA >= :FECINI AND COTI_FECHA <= :FECFIN AND COTI_ANULADO = 'N' AND P.PREF_PRE = C.PREF_PRE AND P.TIDO_COD = 35  AND ((SUCU_ID = :SUCURSAL) or (:SUCURSAL = 0))
                ORDER BY C.COTI_ID, CTDE_ITEM INTO :ID, :ITEM, :CANT, :MONTO
                DO
                BEGIN
                CANTIDAD = CANTIDAD + CANT;
                EXECUTE PROCEDURE FALTANTE(:TIPO, :DESTINO, :ID, :ITEM) returning_values (:CANT, :UNIDAD, :FACTOR);
                FALTANTE = FALTANTE + CANT;
                BASE = BASE + MONTO * CANT;
                END
            END
        if (CANTIDAD IS NULL) then
            CANTIDAD = 0;
        if (BASE IS NULL) then
            BASE = 0;
        if (FALTANTE IS NULL) then
            FALTANTE = 0;
        if (CEROS = 'S') then
            SUSPEND;
        ELSE
            if (FALTANTE <> 0) then
                SUSPEND;
        END
    ELSE
        BEGIN
        if (TIPO = 31) then
            FOR SELECT F.FACT_ID, FADE_ITEM, F.PREF_PRE, FACT_NUMERO, FACT_FECHA, FADE_CANT * FADE_FACTOR, (FADE_PRUNIT-FADE_DTOMONTO), SUBSTRING(FACT_OBS FROM 1 FOR 255)
                FROM FACTURAS F, FACTURAS_DETALLE D, PREFIJOS P
                WHERE F.FACT_ID = D.FACT_ID AND ARTI_COD = :ARTICULO AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND FACT_ANULADO = 'N' AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND ((SUCU_ID = :SUCURSAL) or (:SUCURSAL = 0)) and substring(arti_cod from 1 FOR 2) <> '.t'
                ORDER BY F.FACT_ID, FADE_ITEM
                INTO :ID, :ITEM, :PREFIJO, :NUMERO, :FECHA, :CANTIDAD, :BASE, :OBS
                DO
                    BEGIN
                    EXECUTE PROCEDURE FALTANTE(:TIPO, :DESTINO, :ID, :ITEM) returning_values (:FALTANTE, :UNIDAD, :FACTOR);
                    if ((CEROS = 'S') or (FALTANTE <> 0)) then
                        SUSPEND;
                    END
        if (TIPO = 32) then
            FOR SELECT R.REVT_ID, RVDE_ITEM, R.PREF_PRE, REVT_NUMERO, REVT_FECHA, RVDE_CANT * RVDE_FACTOR, (RVDE_PRUNIT-RVDE_DTOMONTO), SUBSTRING(REVT_OBS FROM 1 FOR 255)
                FROM REMISIONES_VENTA R, REMISIONES_VENTA_DETALLE D, PREFIJOS P
                WHERE R.REVT_ID = D.REVT_ID AND ARTI_COD = :ARTICULO AND REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN AND REVT_ANULADO = 'N' AND P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = 32 AND ((SUCU_ID = :SUCURSAL) or (:SUCURSAL = 0))
                INTO :ID, :ITEM, :PREFIJO, :NUMERO, :FECHA, :CANTIDAD, :BASE, :OBS
                DO
                    BEGIN
                    EXECUTE PROCEDURE FALTANTE(:TIPO, :DESTINO, :ID, :ITEM) returning_values (:FALTANTE, :UNIDAD, :FACTOR);
                    if ((CEROS = 'S') or (FALTANTE <> 0)) then
                        SUSPEND;
                    END
        if (TIPO = 34) then
            FOR SELECT P.PEDI_ID, PEDE_ITEM, P.PREF_PRE, PEDI_NUMERO, PEDI_FECHA, PEDE_CANT * PEDE_FACTOR, (PEDE_PRUNIT-PEDE_DTOMONTO), SUBSTRING(PEDI_OBS FROM 1 FOR 255)
                FROM PEDIDOS P, PEDIDOS_DETALLE D, PREFIJOS R
                WHERE P.PEDI_ID = D.PEDI_ID AND ARTI_COD = :ARTICULO AND PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND PEDI_ANULADO = 'N' AND P.PREF_PRE = R.PREF_PRE AND R.TIDO_COD = 34 AND ((SUCU_ID = :SUCURSAL) or (:SUCURSAL = 0))
                INTO :ID, :ITEM, PREFIJO, :NUMERO, :FECHA, :CANTIDAD, :BASE, :OBS
                DO
                    BEGIN
                    EXECUTE PROCEDURE FALTANTE(:TIPO, :DESTINO, :ID, :ITEM) returning_values (:FALTANTE, :UNIDAD, :FACTOR);
                    if ((CEROS = 'S') or (FALTANTE <> 0)) then
                        SUSPEND;
                    END
        if (TIPO = 35) then
            FOR SELECT C.COTI_ID, CTDE_ITEM, C.PREF_PRE, COTI_NUMERO, COTI_FECHA, CTDE_CANT * CTDE_FACTOR, (CTDE_PRUNIT-CTDE_DTOMONTO), SUBSTRING(COTI_OBS FROM 1 FOR 255)
                FROM COTIZACIONES C, COTIZACIONES_DETALLE D, PREFIJOS P
                WHERE C.COTI_ID = D.COTI_ID AND ARTI_COD = :ARTICULO AND COTI_FECHA >= :FECINI AND COTI_FECHA <= :FECFIN AND COTI_ANULADO = 'N' AND P.PREF_PRE = C.PREF_PRE AND P.TIDO_COD = 35 AND ((SUCU_ID = :SUCURSAL) or (:SUCURSAL = 0))
                INTO :ID, :ITEM, PREFIJO, :NUMERO, :FECHA, :CANTIDAD, :BASE, :OBS
                DO
                    BEGIN
                    EXECUTE PROCEDURE FALTANTE(:TIPO, :DESTINO, :ID, :ITEM) returning_values (:FALTANTE, :UNIDAD, :FACTOR);
                    if ((CEROS = 'S') or (FALTANTE <> 0)) then
                        SUSPEND;
                    END
        END
    END
END
^

SET TERM ; ^

SET TERM ^ ;

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

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER PROCEDURE IMPUESTOS_VENTAS(
    FECINI DATE,
    FECFIN DATE,
    PREFIJO VARCHAR(4),
    PTOINI INTEGER,
    PTOFIN INTEGER,
    ANULADOS CHAR(1),
    SUBEMPRESA INTEGER)
RETURNS (
    TIPO INTEGER,
    NOMTIPO VARCHAR(30),
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    NIT VARCHAR(20),
    NOMTERCERO VARCHAR(60),
    SUBTOTAL NUMERIC(18,2),
    DTOMONTO NUMERIC(18,2),
    ADICIONAL NUMERIC(18,2),
    IVAMONTO NUMERIC(18,2),
    CONSUMO NUMERIC(18,2),
    EXENTOS NUMERIC(18,2),
    GRAVADOS1 NUMERIC(18,2),
    GRAVADOS2 NUMERIC(18,2),
    GRAVADOS3 NUMERIC(18,2),
    IVA1 NUMERIC(18,2),
    IVA2 NUMERIC(18,2),
    IVA3 NUMERIC(18,2),
    EXTRA NUMERIC(18,2),
    TOTAL NUMERIC(18,2),
    RTFTEMONTO NUMERIC(18,2),
    RTIVAMONTO NUMERIC(18,2),
    RTICAMONTO 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);
BEGIN
/* FACTURA */
TIPO = 31;
SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 31 INTO :NOMTIPO;

FOR SELECT FACT_ID, F.PREF_PRE, FACT_NUMERO, FACT_FECHA, TERC_NIT, FACT_NOMCLIENTE, FACT_ADICIONAL-FACT_DTOMONTO, FACT_IVAMONTO, FACT_RTFTEMONTO, FACT_RTIVAMONTO, FACT_RTICAMONTO, FACT_EXTRA, FACT_TOTAL, FACT_ANULADO
    FROM FACTURAS F, PREFIJOS PR WHERE PTVT_ID >= :PTOINI AND PTVT_ID <= :PTOFIN AND
    FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND ((:PREFIJO = '') or (:PREFIJO IS NULL) or (F.PREF_PRE = :PREFIJO))
    AND PR.PREF_PRE = F.PREF_PRE AND PR.TIDO_COD = 31 AND ((PR.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
    ORDER BY FACT_FECHA, F.PREF_PRE, FACT_NUMERO
    INTO :ID, :PREF, :NUMERO, :FECHA, :NIT, :NOMTERCERO, :DTOMONTO, :IVAMONTO, :RTFTEMONTO, :RTIVAMONTO, :RTICAMONTO, :EXTRA, :TOTAL, :ANULADO
    DO
    BEGIN
    SELECT TERC_EXENTO FROM TERCEROS WHERE TERC_NIT = :NIT INTO :TER_EXENTO;
    if ((ANULADOS = 'S') or (ANULADO = 'N')) then
        BEGIN
        if (ANULADO = 'S') then
            BEGIN
            EXENTOS = 0;
            GRAVADOS1 = 0;
            GRAVADOS2 = 0;
            GRAVADOS3 = 0;
            CONSUMO = 0;
            SUBTOTAL = 0;
            TOTAL = 0;
            EXTRA = 0;
            IVAMONTO = 0;
            DTOMONTO = 0;
            NETO = 0;
            RTFTEMONTO = 0;
            RTIVAMONTO = 0;
            RTICAMONTO = 0;
            END
        else
            BEGIN
            /* CALCULE LAS DIFERENTES TARIFAS */
            if (TER_EXENTO = 'S') then
                BEGIN
                SELECT SUM(FADE_TOTAL - FADE_IVAMONTO - FADE_CONSUMO) FROM FACTURAS_DETALLE D WHERE FACT_ID = :ID AND FADE_REFERENCIA <> '.t' INTO :EXENTOS;
                GRAVADOS1 = 0;
                GRAVADOS2 = 0;
                GRAVADOS3 = 0;
                end
            else
                begin
                SELECT SUM(FADE_TOTAL - FADE_IVAMONTO - FADE_CONSUMO) FROM FACTURAS_DETALLE D WHERE FACT_ID = :ID AND FADE_REFERENCIA <> '.t' AND FADE_IVAPORC = 0 INTO :EXENTOS;
                SELECT SUM(FADE_TOTAL - FADE_IVAMONTO - FADE_CONSUMO), SUM(FADE_IVAMONTO) FROM FACTURAS_DETALLE D, TARIFA_IVA T WHERE FACT_ID = :ID AND FADE_REFERENCIA <> '.t' AND FADE_IVAPORC = TAIV_PORC AND TAIV_COD = 1 INTO :GRAVADOS1, :IVA1;
                SELECT SUM(FADE_TOTAL - FADE_IVAMONTO - FADE_CONSUMO), SUM(FADE_IVAMONTO) FROM FACTURAS_DETALLE D, TARIFA_IVA T WHERE FACT_ID = :ID AND FADE_REFERENCIA <> '.t' AND FADE_IVAPORC = TAIV_PORC AND TAIV_COD = 2 INTO :GRAVADOS2, :IVA2;
                SELECT SUM(FADE_TOTAL - FADE_IVAMONTO - FADE_CONSUMO), SUM(FADE_IVAMONTO) FROM FACTURAS_DETALLE D, TARIFA_IVA T WHERE FACT_ID = :ID AND FADE_REFERENCIA <> '.t' AND FADE_IVAPORC = TAIV_PORC AND TAIV_COD = 3 INTO :GRAVADOS3, :IVA3;
                end
            SELECT SUM(FADE_CONSUMO) FROM FACTURAS_DETALLE WHERE FACT_ID = :ID AND FADE_REFERENCIA <> '.t' INTO :CONSUMO;
            SUBTOTAL = TOTAL - EXTRA - IVAMONTO - DTOMONTO;
            NETO = TOTAL - RTFTEMONTO - RTIVAMONTO - RTICAMONTO;
            END
        SUSPEND;
        END
    END
    
TIPO = 33;
SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 33 INTO :NOMTIPO;
/* DEVOLUCIONES */
FOR SELECT DEVT_ID, D.PREF_PRE, DEVT_NUMERO, DEVT_FECHA, TERC_NIT, DEVT_NOMTERC, DEVT_ADICIONAL-DEVT_DTOMONTO, DEVT_IVAMONTO, DEVT_RTFTEMONTO, DEVT_RTIVAMONTO, DEVT_RTICAMONTO, DEVT_EXTRA, DEVT_TOTAL, DEVT_ANULADO
    FROM DEVOLUCIONES_VENTAS D, PREFIJOS PR WHERE PTVT_ID >= :PTOINI AND PTVT_ID <= :PTOFIN AND
    DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND ((:PREFIJO = '') or (:PREFIJO IS NULL) or (D.PREF_PRE = :PREFIJO))
    AND PR.PREF_PRE = D.PREF_PRE AND PR.TIDO_COD = 33 AND ((PR.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) AND ((DEVT_REMID = 0) or (DEVT_REMID IS NULL))
    ORDER BY DEVT_FECHA, D.PREF_PRE, DEVT_NUMERO
    INTO :ID, :PREF, :NUMERO, :FECHA, :NIT, :NOMTERCERO, :DTOMONTO, :IVAMONTO, :RTFTEMONTO, :RTIVAMONTO, :RTICAMONTO, :EXTRA, :TOTAL, :ANULADO
    DO
    BEGIN
    SELECT TERC_EXENTO FROM TERCEROS WHERE TERC_NIT = :NIT INTO :TER_EXENTO;
    if ((ANULADOS = 'S') or (ANULADO = 'N')) then
        BEGIN
        if (ANULADO = 'S') then
            BEGIN
            EXENTOS = 0;
            GRAVADOS1 = 0;
            GRAVADOS2 = 0;
            GRAVADOS3 = 0;
            CONSUMO = 0;
            SUBTOTAL = 0;
            TOTAL = 0;
            EXTRA = 0;
            IVAMONTO = 0;
            DTOMONTO = 0;
            NETO = 0;
            RTFTEMONTO = 0;
            RTIVAMONTO = 0;
            RTICAMONTO = 0;
            END
        else
            BEGIN
            DTOMONTO = DTOMONTO * -1;
            ADICIONAL = ADICIONAL * -1;
            IVAMONTO = IVAMONTO * -1;
            EXTRA = EXTRA * -1;
            TOTAL = TOTAL * -1;
            RTFTEMONTO = RTFTEMONTO * -1;
            RTIVAMONTO = RTIVAMONTO * -1;
            RTICAMONTO = RTICAMONTO * -1;
            /* CALCULE LAS DIFERENTES TARIFAS */
            if (TER_EXENTO = 'S') then
             BEGIN
              SELECT SUM(DVDE_TOTAL - DVDE_IVAMONTO - DVDE_CONSUMO) FROM DEVOLUCIONES_VENTAS_DETALLE D WHERE DEVT_ID = :ID AND DVDE_REFERENCIA <> '.t' INTO :EXENTOS;
              GRAVADOS1 = 0;
              GRAVADOS2 = 0;
              GRAVADOS3 = 0;
             end
            else
             begin
              SELECT SUM(DVDE_TOTAL - DVDE_IVAMONTO - DVDE_CONSUMO) FROM DEVOLUCIONES_VENTAS_DETALLE D WHERE DEVT_ID = :ID AND DVDE_REFERENCIA <> '.t' AND DVDE_IVAPORC = 0 INTO :EXENTOS;
              SELECT SUM(DVDE_TOTAL - DVDE_IVAMONTO - DVDE_CONSUMO), SUM(DVDE_IVAMONTO) FROM DEVOLUCIONES_VENTAS_DETALLE D, TARIFA_IVA T WHERE DEVT_ID = :ID AND DVDE_REFERENCIA <> '.t' AND DVDE_IVAPORC = TAIV_PORC AND TAIV_COD = 1 INTO :GRAVADOS1, :IVA1;
              SELECT SUM(DVDE_TOTAL - DVDE_IVAMONTO - DVDE_CONSUMO), SUM(DVDE_IVAMONTO) FROM DEVOLUCIONES_VENTAS_DETALLE D, TARIFA_IVA T WHERE DEVT_ID = :ID AND DVDE_REFERENCIA <> '.t' AND DVDE_IVAPORC = TAIV_PORC AND TAIV_COD = 2 INTO :GRAVADOS2, :IVA2;
              SELECT SUM(DVDE_TOTAL - DVDE_IVAMONTO - DVDE_CONSUMO), SUM(DVDE_IVAMONTO) FROM DEVOLUCIONES_VENTAS_DETALLE D, TARIFA_IVA T WHERE DEVT_ID = :ID AND DVDE_REFERENCIA <> '.t' AND DVDE_IVAPORC = TAIV_PORC AND TAIV_COD = 3 INTO :GRAVADOS3, :IVA3;
             end
            SELECT SUM(DVDE_CONSUMO) FROM DEVOLUCIONES_VENTAS_DETALLE WHERE DEVT_ID = :ID AND DVDE_REFERENCIA <> '.t' INTO :CONSUMO;
            SUBTOTAL = TOTAL - EXTRA - IVAMONTO - DTOMONTO;
            NETO = TOTAL - RTFTEMONTO - RTIVAMONTO - RTICAMONTO;
            EXENTOS = EXENTOS * -1;
            GRAVADOS1 = GRAVADOS1 * -1;
            GRAVADOS2 = GRAVADOS2 * -1;
            GRAVADOS3 = GRAVADOS3 * -1;
            CONSUMO = CONSUMO * -1;
            END
        SUSPEND;
        END
    END
execute procedure lee_configuracion ('FACTURACION', 'DOCUMENTOS', 'INCLUIR NOTAS DE CARTERA EN REPORTE DE IMPUESTOS EN VENTAS') returning_values (:NOTAS);
if (NOTAS = 'SI') then
    BEGIN
    TIPO = 41;
    SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 41 INTO :NOMTIPO;
    FOR SELECT NDCL_ID, N.PREF_PRE, NDCL_NUMERO, NDCL_FECHA, N.TERC_NIT, TERC_NOM, 0, NDCL_IVAMONTO, NDCL_RTFTEMONTO, NDCL_RTIVAMONTO, NDCL_RTICAMONTO, 0, NDCL_MONTO+NDCL_IVAMONTO, NDCL_ANULADO
        FROM NOTAS_DEBITO_CLIENTES N, TERCEROS T, PREFIJOS PR WHERE N.TERC_NIT = T.TERC_NIT AND
        NDCL_FECHA >= :FECINI AND NDCL_FECHA <= :FECFIN AND ((:PREFIJO = '') or (:PREFIJO IS NULL) or (N.PREF_PRE = :PREFIJO))
        AND PR.PREF_PRE = N.PREF_PRE AND PR.TIDO_COD = 41 AND ((PR.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
        ORDER BY NDCL_FECHA, N.PREF_PRE, NDCL_NUMERO
        INTO :ID, :PREF, :NUMERO, :FECHA, :NIT, :NOMTERCERO, :DTOMONTO, :IVAMONTO, :RTFTEMONTO, :RTIVAMONTO, :RTICAMONTO, :EXTRA, :TOTAL, :ANULADO
        DO
        BEGIN
        GRAVADOS2 = 0;
        GRAVADOS3 = 0;
        IVA2 = 0;
        IVA3 = 0;
        CONSUMO = 0;
        if (ANULADO = 'S') then
            BEGIN
            EXENTOS = 0;
            GRAVADOS1 = 0;
            SUBTOTAL = 0;
            TOTAL = 0;
            EXTRA = 0;
            IVAMONTO = 0;
            DTOMONTO = 0;
            NETO = 0;
            RTFTEMONTO = 0;
            RTIVAMONTO = 0;
            RTICAMONTO = 0;
            END
        ELSE
            BEGIN
            if (IVAMONTO <> 0) then
                BEGIN
                GRAVADOS1 = TOTAL-IVAMONTO;
                IVA1 = IVAMONTO;
                exentos = 0;
                END
            ELSE
                BEGIN
                GRAVADOS1 = 0;
                IVA1 = 0;
                exentos = TOTAL;
                END
            SUBTOTAL = TOTAL - EXTRA - IVAMONTO - DTOMONTO;
            NETO = TOTAL - RTFTEMONTO - RTIVAMONTO - RTICAMONTO;
            END
        SUSPEND;
        END

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

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER PROCEDURE RECALCULA_FALTANTES_VENTAS(
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    IDF INTEGER,
    IDC INTEGER,
    ARTICULO VARCHAR(20),
    CANT NUMERIC(18,4),
    CANTREL NUMERIC(18,4),
    FACTOR NUMERIC(18,4))
AS
declare variable NUMROWS INTEGER;
declare variable ITEM INTEGER;
begin
FOR SELECT FACT_ID, FACT_CONSOLIDA FROM FACTURAS WHERE FACT_FECHA >= :FECINI AND FACT_FECHA <= :fecfin
    INTO :IDF, :idc
    DO
    BEGIN
    FOR SELECT ARTI_COD, FADE_CANT, FADE_FACTOR FROM facturas_detalle WHERE FACT_ID = :IDF and substring(arti_cod from 1 FOR 2) <> '.t' ORDER BY FADE_ITEM
        INTO :ARTICULO, :CANT, :FACTOR
        DO
        BEGIN
        SELECT COUNT(*) FROM CONSOLIDADO_FALTANTES WHERE COFA_ID = :IDC AND ARTI_COD = :articulo AND COFA_OK = 'N' INTO :NUMROWS;
        if (NUMROWS <> 0) then
            BEGIN
            FOR select COFA_CANT * COFA_FACTOR, COFA_ITEM FROM consolidado_faltantes WHERE COFA_ID = :IDC AND ARTI_COD = :articulo AND COFA_OK = 'N' 
                INTO :CANTREL, :ITEM
                DO
                BEGIN
                if (CANTREL <= (CANT * FACTOR)) then
                    UPDATE consolidado_faltantes SET COFA_OK = 'S'
                        WHERE COFA_ID = :IDC AND COFA_ITEM = :ITEM;
                else
                    UPDATE consolidado_faltantes SET COFA_CANT = :CANT, COFA_FACTOR = :FACTOR, COFA_OK = 'S'
                        WHERE COFA_ID = :IDC AND COFA_ITEM = :ITEM;
                suspend;
                END
            END
        END
    END
end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER PROCEDURE REPORTE_FAMILIA(
    FECHA DATE,
    DIAS INTEGER,
    FAMILIA VARCHAR(20))
RETURNS (
    NUMERO VARCHAR(10),
    FECDOC DATE,
    ARTICULO VARCHAR(20),
    INTERNO VARCHAR(20),
    DESCRIPCION VARCHAR(60),
    CANTIDAD NUMERIC(18,2),
    UNIDAD VARCHAR(8),
    PRECIO NUMERIC(18,2),
    DESCTO NUMERIC(18,2),
    TOTAL NUMERIC(18,2),
    COSTO NUMERIC(18,2),
    TIPOOPER INTEGER,
    NOMTIPO VARCHAR(30),
    NIT VARCHAR(20),
    CLIENTE VARCHAR(60),
    DIRECCION VARCHAR(60),
    TELEFONO VARCHAR(40),
    FECCLI DATE,
    ZONA VARCHAR(2),
    NOMZONA VARCHAR(30),
    CIUDAD VARCHAR(5),
    NOMCIUDAD VARCHAR(40),
    VENDEDOR INTEGER,
    NOMVENDEDOR VARCHAR(60),
    TELVENDEDOR VARCHAR(30),
    DIRVENDEDOR VARCHAR(60),
    ANULADO CHAR(1))
AS
declare variable FECINI DATE;
declare variable FACTOR NUMERIC(18,4);
begin
FECINI = FECHA - DIAS;
tipooper = 31;
NOMTIPO = 'FACTURA DE VENTA';
FOR SELECT PREF_PRE || FACT_NUMERO, FACT_FECHA, F.TERC_NIT, null, null, null, CIUD_COD, null, ZONA_COD, F.VEND_COD, V.vend_nombre, V.vend_direccion, V.vend_telefonos,
    D.ARTI_COD, FADE_DESC, FADE_CANT, FADE_UNIDAD, FADE_FACTOR, FADE_PRUNIT, FADE_DTOMONTO, FADE_TOTAL, COST_SALP, p.pvar_cod, FACT_ANULADO
    FROM FACTURAS F, FACTURAS_DETALLE D, movimiento_articulo m, costos c, TERCEROS T, clientes cl, proveedor_articulo p, VENDEDORES V
    WHERE F.fact_id = D.fact_id AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECHA AND F.vend_cod = V.vend_cod AND
    F.terc_nit = T.terc_nit AND T.terc_nit = CL.terc_nit AND d.arti_cod = p.arti_cod and p.terc_nit = :FAMILIA and
    F.fact_id = M.mvar_idref AND M.mvar_tipodoc = 31 AND M.mvar_item = D.fade_item AND M.mvar_cons = C.cost_idmov and substring(D.arti_cod from 1 FOR 2) <> '.t'
    INTO :NUMERO, :fecdoc, :NIT, :CLIENTE, :direccion, :telefono, :ciudad, :feccli, :zona, :vendedor, :nomvendedor, :dirvendedor, :telvendedor,
    :ARTICULO, :descripcion, :CANTIDAD, :UNIDAD, :FACTOR, :PRECIO, :DESCTO, :TOTAL, :costo, :interno, :ANULADO
    DO
    BEGIN
    if (FACTOR <> 1) then
        UNIDAD = 'UND';
    else
        UNIDAD = 'CJ';
    if (ZONA IS NOT NULL) then
        SELECT ZONA_NOM FROM ZONAS WHERE ZONA_COD = :zona INTO :nomzona;
    if (CIUDAD IS NOT NULL) then
        SELECT CIUD_NOM FROM CIUDADES WHERE CIUD_COD = :ciudad INTO :nomciudad;
    if (ANULADO = 'S') then
        ANULADO = '0';
    ELSE
        ANULADO = '1';
    suspend;
    END
tipooper = 33;
NOMTIPO = 'DEVOLUCION CLIENTE';
FOR SELECT PREF_PRE || DEVT_NUMERO, DEVT_FECHA, F.TERC_NIT, null, null, null, CIUD_COD, null, ZONA_COD, F.VEND_COD, V.vend_nombre, V.vend_direccion, V.vend_telefonos,
    D.ARTI_COD, DVDE_DESC, DVDE_CANT, DVDE_UNIDAD, DVDE_FACTOR, DVDE_PRUNIT, DVDE_DTOMONTO, DVDE_TOTAL, COST_SALP, p.pvar_cod, DEVT_ANULADO
    FROM DEVOLUCIONES_VENTAS F, DEVOLUCIONES_VENTAS_DETALLE D, movimiento_articulo m, costos c, TERCEROS T, clientes cl, proveedor_articulo p, VENDEDORES V
    WHERE F.devt_id = D.devt_id AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECHA AND F.vend_cod = V.vend_cod AND
    F.terc_nit = T.terc_nit AND T.terc_nit = CL.terc_nit AND d.arti_cod = p.arti_cod and p.terc_nit = :FAMILIA and
    F.devt_id = M.mvar_idref AND M.mvar_tipodoc = 33 AND M.mvar_item = D.dvde_item AND M.mvar_cons = C.cost_idmov and substring(D.arti_cod from 1 FOR 2) <> '.t'
    INTO :NUMERO, :fecdoc, :NIT, :CLIENTE, :direccion, :telefono, :ciudad, :feccli, :zona, :vendedor, :nomvendedor, :dirvendedor, :telvendedor,
    :ARTICULO, :descripcion, :CANTIDAD, :UNIDAD, :FACTOR, :PRECIO, :DESCTO, :TOTAL, :costo, :interno, :ANULADO
    DO
    BEGIN
    if (FACTOR <> 1) then
        UNIDAD = 'UND';
    else
        UNIDAD = 'CJ';
    if (ZONA IS NOT NULL) then
        SELECT ZONA_NOM FROM ZONAS WHERE ZONA_COD = :zona INTO :nomzona;
    if (CIUDAD IS NOT NULL) then
        SELECT CIUD_NOM FROM CIUDADES WHERE CIUD_COD = :ciudad INTO :nomciudad;
    if (ANULADO = 'S') then
        ANULADO = '0';
    ELSE
        ANULADO = '1';
    suspend;
    END
end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER PROCEDURE REPORTE_FAMILIA_CAB(
    FECINI DATE,
    FECFIN DATE,
    MARCA VARCHAR(3),
    GRUPO VARCHAR(2))
RETURNS (
    ARTICULO VARCHAR(20),
    BARRAS VARCHAR(20),
    DESCRIPCION VARCHAR(60),
    UNIDAD VARCHAR(8),
    CANTIDAD NUMERIC(18,2),
    VENTAS NUMERIC(18,2),
    PRECIO NUMERIC(18,2),
    MARGEN NUMERIC(9,2))
AS
declare variable CANTD NUMERIC(18,4);
declare variable DEV NUMERIC(18,2);
begin
FOR SELECT MAX(D.ARTI_COD), MAX(ARTI_DES), MAX(B.coba_cod), SUM(FADE_CANT * FADE_FACTOR), MAX(ARTI_UNIDAD), SUM(FADE_TOTAL-FADE_IVAMONTO), MAX(P.prar_fijo), MAX(P.prar_util)
    FROM FACTURAS F, FACTURAS_DETALLE D, ARTICULO A, BARRAS_ARTICULO B, PRECIOS_ARTICULO P
    WHERE F.fact_id = D.fact_id AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :fecfin AND D.arti_cod = A.arti_cod AND A.arti_cod = B.arti_cod AND A.arti_unidad = B.coba_unidad AND A.arti_cod = P.arti_cod AND P.lipr_cod = 1 AND
        ((A.grup_cod = :GRUPO) or (:GRUPO = '')) AND ((A.marc_cod = :MARCA) or (:MARCA = '')) AND FACT_ANULADO = 'N' and substring(a.arti_cod from 1 FOR 2) <> '.t'
    GROUP BY A.arti_cod
    INTO :ARTICULO, :descripcion, :BARRAS, :CANTIDAD, :UNIDAD, :VENTAS, :PRECIO, :MARGEN
    DO
    BEGIN
    SELECT SUM(DVDE_CANT * DVDE_FACTOR), SUM(DVDE_TOTAL - DVDE_IVAMONTO) FROM DEVOLUCIONES_VENTAS V, DEVOLUCIONES_VENTAS_DETALLE VD
        WHERE V.devt_id = VD.devt_id AND DEVT_FECHA >= :fecini AND DEVT_FECHA <= :fecfin AND VD.arti_cod = :ARTICULO AND DEVT_ANULADO = 'N'
        INTO :CANTD, :DEV;
    if (CANTD IS NULL) then
        CANTD = 0;
    if (DEV IS NULL) then
        DEV = 0;
    CANTIDAD = CANTIDAD - CANTD;
    VENTAS = VENTAS - DEV;
    suspend;
    END
end
^

SET TERM ; ^

SET TERM ^ ;

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

SET TERM ; ^

SET TERM ^ ;

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

SET TERM ; ^

SET TERM ^ ;

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

SET TERM ; ^

SET TERM ^ ;

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

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

SET TERM ; ^

SET TERM ^ ;

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

        FOR SELECT MAX(T.TERC_NIT), MAX(TERC_NOM), MAX(TERC_TEL), MAX(TERC_CIU), MAX(ZONA_COD), MAX(ARTI_COD), SUM(FADE_CANT * FADE_FACTOR), SUM(FACT_FACTOR*(FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO)),
            SUM(FACT_FACTOR*FADE_IVAMONTO), SUM(FACT_FACTOR*FADE_TOTAL)
            FROM FACTURAS_DETALLE D, FACTURAS F, PREFIJOS P, terceros T, CLIENTES C
            WHERE C.TERC_NIT = T.TERC_NIT AND TERC_CLIE = 'S' AND F.terc_nit = T.terc_nit AND T.TERC_NIT >= :TERINI AND T.TERC_NIT <= :TERFIN AND
            F.FACT_ID = D.FACT_ID AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND FACT_ANULADO = 'N'
            AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) and substring(D.arti_cod from 1 FOR 2) <> '.t'
            GROUP BY T.TERC_NIT, ARTI_COD
            INTO :NIT, :NOMBRE, :TELEFONO, :CIUDAD, :CODZONA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :TOTAL
            DO
            BEGIN
            SELECT ZONA_NOM FROM ZONAS WHERE ZONA_COD = :CODZONA INTO :NOMZONA;
            SELECT ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                FROM ARTICULO WHERE ARTI_COD = :ARTICULO
                INTO :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC;
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            EXECUTE PROCEDURE costo_promedio (:ARTICULO, :FECFIN) RETURNING_VALUES (:COSTOUNIT);
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            COSTO = CANTIDAD * COSTOUNIT;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            if (CEROS = 'S') then
                INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (3, USER, :ARTICULO);
            SUSPEND;
            END /* FOR */
        if (CEROS = 'S') then
            BEGIN
            COSTO = 0;
            UTILIDAD = 0;
            PORC = 0;
            /* agregue los articulos sin factura */
            FOR SELECT ARTI_COD, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN
                INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                DO
                BEGIN
                SELECT COUNT(REPA_ARTICULO) FROM REPORTES_AUX WHERE REPA_ID = 3 AND REPA_USER = USER AND REPA_ARTICULO = :articulo INTO :numrows;
                if (numrows = 0) then
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        END
    if (BIN_AND(TIPO, 2) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 32 INTO :NOMTIPO;
        /* BORRA LA TABLA AUXILIAR */
        DELETE FROM reportes_aux WHERE REPA_ID = 3 AND REPA_USER = USER;

        FOR SELECT MAX(T.TERC_NIT), MAX(TERC_NOM), MAX(TERC_TEL), MAX(TERC_CIU), MAX(ZONA_COD), MAX(ARTI_COD), SUM(RVDE_CANT * RVDE_FACTOR), SUM(RVDE_TOTAL-RVDE_IVAMONTO-RVDE_CONSUMO), SUM(RVDE_IVAMONTO), SUM(RVDE_TOTAL)
            FROM REMISIONES_VENTA_DETALLE D, REMISIONES_VENTA R, PREFIJOS P, terceros T, CLIENTES C
            WHERE C.TERC_NIT = T.TERC_NIT AND TERC_CLIE = 'S' AND R.terc_nit = T.terc_nit AND T.TERC_NIT >= :TERINI AND T.TERC_NIT <= :TERFIN AND
            R.REVT_ID = D.REVT_ID AND REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN AND REVT_ANULADO = 'N'
            AND P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = 32 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY T.TERC_NIT, ARTI_COD
            INTO :NIT, :NOMBRE, :TELEFONO, :CIUDAD, :CODZONA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :TOTAL
            DO
                BEGIN
                SELECT ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO WHERE ARTI_COD = :ARTICULO
                    INTO :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC;
                SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                EXECUTE PROCEDURE costo_promedio (:ARTICULO, :FECFIN) RETURNING_VALUES (:COSTOUNIT);
                if (CANTIDAD IS NULL) then
                    CANTIDAD = 0;
                if (BASE IS NULL) then
                    BASE = 0;
                if (IVA IS NULL) then
                    IVA = 0;
                COSTO = CANTIDAD * COSTOUNIT;
                UTILIDAD = BASE - COSTO;
                if (UOM = 'UTILIDAD') then
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                else
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            if (CEROS = 'S') then
                INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (3, USER, :ARTICULO);
            SUSPEND;
            END /* FOR */
        if (CEROS = 'S') then
            BEGIN
            COSTO = 0;
            UTILIDAD = 0;
            PORC = 0;
            /* agregue los articulos sin factura */
            FOR SELECT ARTI_COD, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN
                INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                DO
                BEGIN
                SELECT COUNT(REPA_ARTICULO) FROM REPORTES_AUX WHERE REPA_ID = 3 AND REPA_USER = USER AND REPA_ARTICULO = :articulo INTO :numrows;
                if (numrows = 0) then
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        END
    if (BIN_AND(TIPO, 4) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 33 INTO :NOMTIPO;
        /* BORRA LA TABLA AUXILIAR */
        DELETE FROM reportes_aux WHERE REPA_ID = 3 AND REPA_USER = USER;

        FOR SELECT MAX(T.TERC_NIT), MAX(TERC_NOM), MAX(TERC_TEL), MAX(TERC_CIU), MAX(ZONA_COD), MAX(ARTI_COD), SUM(DVDE_CANT * DVDE_FACTOR), SUM(DEVT_FACTOR*(DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO)),
            SUM(DEVT_FACTOR*DVDE_IVAMONTO), SUM(DEVT_FACTOR*DVDE_TOTAL)
            FROM devoluciones_ventas_detalle D, DEVOLUCIONES_VENTAS V, PREFIJOS P, terceros T, CLIENTES C
            WHERE C.TERC_NIT = T.TERC_NIT AND TERC_CLIE = 'S' AND V.terc_nit = T.terc_nit AND T.TERC_NIT >= :TERINI AND T.TERC_NIT <= :TERFIN AND
            V.DEVT_ID = D.DEVT_ID AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND DEVT_ANULADO = 'N'
            AND P.PREF_PRE = V.PREF_PRE AND P.TIDO_COD = 33 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) and substring(D.arti_cod from 1 FOR 2) <> '.t'
            GROUP BY T.TERC_NIT, ARTI_COD
            INTO :NIT, :NOMBRE, :TELEFONO, :CIUDAD, :CODZONA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :TOTAL
            DO
            BEGIN
            SELECT ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                FROM ARTICULO WHERE ARTI_COD = :ARTICULO
                INTO :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC;
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            EXECUTE PROCEDURE costo_promedio (:ARTICULO, :FECFIN) RETURNING_VALUES (:COSTOUNIT);
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            COSTO = CANTIDAD * COSTOUNIT;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            TOTAL = TOTAL * -1;
            IVA = IVA * -1;
            BASE = BASE * -1;
            CANTIDAD = CANTIDAD * -1;
            COSTO = COSTO * -1;
            UTILIDAD = UTILIDAD * -1;
            if (CEROS = 'S') then
                INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (3, USER, :ARTICULO);
            SUSPEND;
            END /* FOR */
        if (CEROS = 'S') then
            BEGIN
            COSTO = 0;
            UTILIDAD = 0;
            PORC = 0;
            /* agregue los articulos sin factura */
            FOR SELECT ARTI_COD, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN
                INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                DO
                BEGIN
                SELECT COUNT(REPA_ARTICULO) FROM REPORTES_AUX WHERE REPA_ID = 3 AND REPA_USER = USER AND REPA_ARTICULO = :articulo INTO :numrows;
                if (numrows = 0) then
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        END
    if (BIN_AND(TIPO, 8) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 34 INTO :NOMTIPO;
        /* BORRA LA TABLA AUXILIAR */
        DELETE FROM reportes_aux WHERE REPA_ID = 3 AND REPA_USER = USER;

        FOR SELECT MAX(T.TERC_NIT), MAX(TERC_NOM), MAX(TERC_TEL), MAX(TERC_CIU), MAX(ZONA_COD), MAX(ARTI_COD), SUM(PEDE_CANT * PEDE_FACTOR), SUM(PEDI_FACTOR*(PEDE_TOTAL-PEDE_IVAMONTO-PEDE_CONSUMO)),
            SUM(PEDI_FACTOR*PEDE_IVAMONTO), SUM(PEDI_FACTOR*PEDE_TOTAL)
            FROM PEDIDOS_DETALLE D, PEDIDOS P, PREFIJOS PR, terceros T, CLIENTES C
            WHERE C.TERC_NIT = T.TERC_NIT AND TERC_CLIE = 'S' AND P.terc_nit = T.terc_nit AND T.TERC_NIT >= :TERINI AND T.TERC_NIT <= :TERFIN AND
            P.PEDI_ID = D.PEDI_ID AND PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND PEDI_ANULADO = 'N'
            AND PR.PREF_PRE = P.PREF_PRE AND P.TIDO_COD = 34 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY T.TERC_NIT, ARTI_COD
            INTO :NIT, :NOMBRE, :TELEFONO, :CIUDAD, :CODZONA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :TOTAL
            DO
            BEGIN
            SELECT ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                FROM ARTICULO WHERE ARTI_COD = :ARTICULO
                INTO :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC;
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            EXECUTE PROCEDURE costo_promedio (:ARTICULO, :FECFIN) RETURNING_VALUES (:COSTOUNIT);
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            COSTO = CANTIDAD * COSTOUNIT;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            if (CEROS = 'S') then
                INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (3, USER, :ARTICULO);
            SUSPEND;
            END /* FOR */
        if (CEROS = 'S') then
            BEGIN
            COSTO = 0;
            UTILIDAD = 0;
            PORC = 0;
            /* agregue los articulos sin factura */
            FOR SELECT ARTI_COD, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN
                INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                DO
                BEGIN
                SELECT COUNT(REPA_ARTICULO) FROM REPORTES_AUX WHERE REPA_ID = 3 AND REPA_USER = USER AND REPA_ARTICULO = :articulo INTO :numrows;
                if (numrows = 0) then
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        END
    if (BIN_AND(TIPO, 16) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 35 INTO :NOMTIPO;
        /* BORRA LA TABLA AUXILIAR */
        DELETE FROM reportes_aux WHERE REPA_ID = 3 AND REPA_USER = USER;

        FOR SELECT MAX(T.TERC_NIT), MAX(TERC_NOM), MAX(TERC_TEL), MAX(TERC_CIU), MAX(ZONA_COD), MAX(ARTI_COD), SUM(CTDE_CANT * CTDE_FACTOR), SUM(COTI_FACTOR*(CTDE_TOTAL-CTDE_IVAMONTO-CTDE_CONSUMO)),
            SUM(COTI_FACTOR*CTDE_IVAMONTO), SUM(COTI_FACTOR*CTDE_TOTAL)
            FROM COTIZACIONES_DETALLE D, COTIZACIONES CT, PREFIJOS P, terceros T, CLIENTES C
            WHERE C.TERC_NIT = T.TERC_NIT AND TERC_CLIE = 'S' AND C.terc_nit = T.terc_nit AND T.TERC_NIT >= :TERINI AND T.TERC_NIT <= :TERFIN AND
            CT.COTI_ID = D.COTI_ID AND COTI_FECHA >= :FECINI AND COTI_FECHA <= :FECFIN AND COTI_ANULADO = 'N'
            AND P.PREF_PRE = CT.PREF_PRE AND P.TIDO_COD = 35 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY T.TERC_NIT, ARTI_COD
            INTO :NIT, :NOMBRE, :TELEFONO, :CIUDAD, :CODZONA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :TOTAL
            DO
            BEGIN
            SELECT ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                FROM ARTICULO WHERE ARTI_COD = :ARTICULO
                INTO :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC;
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            EXECUTE PROCEDURE costo_promedio (:ARTICULO, :FECFIN) RETURNING_VALUES (:COSTOUNIT);
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            COSTO = CANTIDAD * COSTOUNIT;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            if (CEROS = 'S') then
                INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (3, USER, :ARTICULO);
            SUSPEND;
            END /* FOR */
        if (CEROS = 'S') then
            BEGIN
            COSTO = 0;
            UTILIDAD = 0;
            PORC = 0;
            /* agregue los articulos sin factura */
            FOR SELECT ARTI_COD, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN
                INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                DO
                BEGIN
                SELECT COUNT(REPA_ARTICULO) FROM REPORTES_AUX WHERE REPA_ID = 3 AND REPA_USER = USER AND REPA_ARTICULO = :articulo INTO :numrows;
                if (numrows = 0) then
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        END
    END
ELSE
    BEGIN
    if (BIN_AND(TIPO, 1) <> 0) then
            BEGIN
            SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 31 INTO :NOMTIPO;
            FOR SELECT F.PREF_PRE, FACT_NUMERO, FACT_FECHA, ARTI_COD, FADE_CANT * FADE_FACTOR, (FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO)*FACT_FACTOR,
                FADE_IVAMONTO*FACT_FACTOR, FADE_DTOPORC, FADE_TOTAL*FACT_FACTOR, F.terc_nit, F.fact_nomcliente
                FROM FACTURAS F, FACTURAS_DETALLE D, PREFIJOS P
                WHERE F.FACT_ID = D.FACT_ID AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND F.TERC_NIT >= :TERINI AND F.TERC_NIT <= :TERFIN AND FACT_ANULADO = 'N'
                 AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) and substring(D.arti_cod from 1 FOR 2) <> '.t'
                ORDER BY f.terc_nit, ARTI_COD, FACT_FECHA, F.FACT_ID, FADE_ITEM
                INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :DTO, :TOTAL, :NIT, :nombre
                DO
                BEGIN
                SELECT ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO WHERE ARTI_COD = :ARTICULO
                    INTO :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC;
                SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                EXECUTE PROCEDURE costo_promedio (:ARTICULO, :FECHA) RETURNING_VALUES (:COSTOUNIT);
                COSTO = COSTOUNIT * CANTIDAD;
                UTILIDAD = BASE - COSTO;
                if (UOM = 'UTILIDAD') then
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                else
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
                SUSPEND;
                END
            END
    if (BIN_AND(TIPO, 2) <> 0) then
            BEGIN
            SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 32 INTO :NOMTIPO;
            FOR SELECT R.PREF_PRE, REVT_NUMERO, REVT_FECHA, ARTI_COD, RVDE_CANT * RVDE_FACTOR,
                (RVDE_TOTAL - RVDE_IVAMONTO), RVDE_IVAMONTO, RVDE_DTOPORC, RVDE_TOTAL, R.terc_nit, R.revt_nomterc
                FROM REMISIONES_VENTA R, REMISIONES_VENTA_DETALLE D, PREFIJOS P
                WHERE R.REVT_ID = D.REVT_ID AND REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN AND R.TERC_NIT >= :TERINI AND R.TERC_NIT <= :TERFIN AND REVT_ANULADO = 'N'
                 AND P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = 32 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                ORDER BY r.terc_nit, ARTI_COD, REVT_FECHA, R.REVT_ID, RVDE_ITEM
                INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :DTO, :TOTAL, :NIT, :nombre
                DO
                BEGIN
                SELECT ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO WHERE ARTI_COD = :ARTICULO
                    INTO :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC;
                SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                EXECUTE PROCEDURE costo_promedio (:ARTICULO, :FECHA) RETURNING_VALUES (:COSTOUNIT);
                COSTO = COSTOUNIT * CANTIDAD;
                UTILIDAD = BASE - COSTO;
                if (UOM = 'UTILIDAD') then
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                else
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
                SUSPEND;
                END
            END
    if (BIN_AND(TIPO, 4) <> 0) then
            BEGIN
            SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 33 INTO :NOMTIPO;
            FOR SELECT V.PREF_PRE, DEVT_NUMERO, DEVT_FECHA, ARTI_COD, DVDE_CANT * DVDE_FACTOR, (DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO)*DEVT_FACTOR,
                DVDE_IVAMONTO*DEVT_FACTOR, DVDE_DTOPORC, DVDE_TOTAL*DEVT_FACTOR, V.terc_nit, V.devt_nomterc
                FROM DEVOLUCIONES_VENTAS V, DEVOLUCIONES_VENTAS_DETALLE D, PREFIJOS P
                WHERE V.DEVT_ID = D.DEVT_ID AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND V.TERC_NIT >= :TERINI AND V.TERC_NIT <= :TERFIN AND DEVT_ANULADO = 'N'
                 AND P.PREF_PRE = V.PREF_PRE AND P.TIDO_COD = 33 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))  and substring(D.arti_cod from 1 FOR 2) <> '.t'
                ORDER BY v.terc_nit, ARTI_COD, DEVT_FECHA, D.DEVT_ID, DVDE_ITEM
                INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :DTO, :TOTAL, :NIT, :nombre
                DO
                BEGIN
                SELECT ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO WHERE ARTI_COD = :ARTICULO
                    INTO :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC;
                SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                EXECUTE PROCEDURE costo_promedio (:ARTICULO, :FECHA) RETURNING_VALUES (:COSTOUNIT);
                COSTO = COSTOUNIT * CANTIDAD;
                UTILIDAD = BASE - COSTO;
                if (UOM = 'UTILIDAD') then
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                else
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
                TOTAL = TOTAL * -1;
                IVA = IVA * -1;
                BASE = BASE * -1;
                CANTIDAD = CANTIDAD * -1;
                COSTO = COSTO * -1;
                UTILIDAD = UTILIDAD * -1;
                SUSPEND;
                END
            END
    if (BIN_AND(TIPO, 8) <> 0) then
            BEGIN
            SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 34 INTO :NOMTIPO;
            FOR SELECT P.PREF_PRE, PEDI_NUMERO, PEDI_FECHA, ARTI_COD, PEDE_CANT * PEDE_FACTOR, (PEDE_TOTAL-PEDE_IVAMONTO-PEDE_CONSUMO)*PEDI_FACTOR,
                PEDE_IVAMONTO*PEDI_FACTOR, PEDE_DTOPORC, PEDE_TOTAL*PEDI_FACTOR, P.terc_nit, P.pedi_nomterc
                FROM PEDIDOS P, PEDIDOS_DETALLE D, PREFIJOS PR
                WHERE P.PEDI_ID = D.PEDI_ID AND PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND P.TERC_NIT >= :TERINI AND P.TERC_NIT <= :TERFIN AND PEDI_ANULADO = 'N'
                 AND P.PREF_PRE = PR.PREF_PRE AND P.TIDO_COD = 34 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                ORDER BY p.terc_nit, ARTI_COD, PEDI_FECHA, P.PEDI_ID, PEDE_ITEM
                INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :DTO, :TOTAL, :NIT, :nombre
                DO
                BEGIN
                SELECT ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO WHERE ARTI_COD = :ARTICULO
                    INTO :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC;
                SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                EXECUTE PROCEDURE costo_promedio (:ARTICULO, :FECHA) RETURNING_VALUES (:COSTOUNIT);
                COSTO = COSTOUNIT * CANTIDAD;
                UTILIDAD = BASE - COSTO;
                if (UOM = 'UTILIDAD') then
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                else
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
                SUSPEND;
                END
            END
    if (BIN_AND(TIPO, 16) <> 0) then
            BEGIN
            SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 35 INTO :NOMTIPO;
            FOR SELECT C.PREF_PRE, COTI_NUMERO, COTI_FECHA, ARTI_COD, CTDE_CANT * CTDE_FACTOR, (CTDE_TOTAL-CTDE_IVAMONTO-CTDE_CONSUMO)*COTI_FACTOR,
                CTDE_IVAMONTO*COTI_FACTOR, CTDE_DTOPORC, CTDE_TOTAL*COTI_FACTOR, C.terc_nit, C.coti_nomterc
                FROM COTIZACIONES C, COTIZACIONES_DETALLE D, PREFIJOS P
                WHERE C.COTI_ID = D.COTI_ID AND ARTI_COD = :ARTICULO AND COTI_FECHA >= :FECINI AND COTI_FECHA <= :FECFIN AND C.TERC_NIT >= :TERINI AND C.TERC_NIT <= :TERFIN AND COTI_ANULADO = 'N'
                 AND P.PREF_PRE = C.PREF_PRE AND P.TIDO_COD = 35 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                ORDER BY c.terc_nit, COTI_FECHA, C.COTI_ID, CTDE_ITEM
                INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :DTO, :TOTAL, :NIT, :nombre
                DO
                BEGIN
                SELECT ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO WHERE ARTI_COD = :ARTICULO
                    INTO :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC;
                SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                EXECUTE PROCEDURE costo_promedio (:ARTICULO, :FECHA) RETURNING_VALUES (:COSTOUNIT);
                COSTO = COSTOUNIT * CANTIDAD;
                UTILIDAD = BASE - COSTO;
                if (UOM = 'UTILIDAD') then
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                else
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
                SUSPEND;
                END
            END
    END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER PROCEDURE REP_UTILIDAD_VENDEDOR(
    TIPO INTEGER,
    DETALLE CHAR(1),
    VENINI VARCHAR(20),
    VENFIN VARCHAR(20),
    FECINI DATE,
    FECFIN DATE,
    ARTINI VARCHAR(15),
    ARTFIN VARCHAR(15),
    ORDEN CHAR(1),
    CEROS CHAR(1),
    SUBEMPRESA INTEGER)
RETURNS (
    CODVEND VARCHAR(20),
    NOMVEND VARCHAR(60),
    NOMTIPO VARCHAR(50),
    ARTICULO VARCHAR(15),
    DESCRIPCION VARCHAR(60),
    CODGRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    CODSUBG VARCHAR(3),
    NOMSUBG VARCHAR(30),
    CODMARC VARCHAR(3),
    NOMMARC VARCHAR(30),
    UNIDAD VARCHAR(8),
    CANTIDAD NUMERIC(18,4),
    BASE NUMERIC(18,2),
    IVA NUMERIC(18,2),
    CONSUMO NUMERIC(18,2),
    COSTO NUMERIC(18,2),
    UTILIDAD NUMERIC(18,4),
    PORC NUMERIC(9,2),
    TOTAL NUMERIC(18,2),
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    DTO NUMERIC(9,2))
AS
DECLARE VARIABLE COSTOUNIT NUMERIC(18,4);
DECLARE VARIABLE CODINI VARCHAR(15);
DECLARE VARIABLE CODFIN VARCHAR(15);
DECLARE VARIABLE DESINI VARCHAR(15);
DECLARE VARIABLE DESFIN VARCHAR(15);
declare variable UOM VARCHAR(20);
BEGIN
if (ORDEN = 'C') then
    BEGIN
    CODINI = ARTINI;
    CODFIN = ARTFIN;
    DESINI = '';
    DESFIN = 'zz';
    END
ELSE
    BEGIN
    DESINI = ARTINI;
    DESFIN = ARTFIN;
    CODINI = '';
    CODFIN = 'zz';
    END
  EXECUTE PROCEDURE lee_configuracion ('FACTURACION', 'ARTICULOS', 'SUGERIR PRECIOS CON PORCENTAJE DE MARGEN O UTILIDAD') returning_values (:UOM);
  SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = :TIPO INTO :NOMTIPO;
  FOR select VEND_COD, VEND_NOMBRE
    from VENDEDORES
    where VEND_COD >= :VENINI AND VEND_COD <= :VENFIN
    INTO :CODVEND, :NOMVEND
    DO  
    BEGIN
    if (DETALLE = 'N') then
        BEGIN
        if (BIN_AND(TIPO, 1) <> 0) then
            BEGIN
            SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 31 INTO :NOMTIPO;
            /* BORRA LA TABLA AUXILIAR */
            DELETE FROM reportes_aux WHERE REPA_ID = 4 AND REPA_USER = USER;
            FOR SELECT MAX(ARTI_COD), SUM(FADE_CANT * FADE_FACTOR), SUM(FACT_FACTOR*(FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO)),
                SUM(FACT_FACTOR*FADE_IVAMONTO), SUM(FACT_FACTOR*FADE_TOTAL), SUM(FADE_CONSUMO)
                FROM FACTURAS_DETALLE D, FACTURAS F, PREFIJOS P
                WHERE F.FACT_ID = D.FACT_ID AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND VEND_COD = :CODVEND AND FACT_ANULADO = 'N'
                 AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) and substring(D.arti_cod from 1 FOR 2) <> '.t'
                GROUP BY ARTI_COD
                INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :TOTAL, :CONSUMO
                DO
                BEGIN
                SELECT ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO WHERE ARTI_COD = :ARTICULO
                    INTO :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC;
                SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                EXECUTE PROCEDURE costo_promedio (:ARTICULO, :FECFIN) RETURNING_VALUES (:COSTOUNIT);
                if (CANTIDAD IS NULL) then
                    CANTIDAD = 0;
                if (BASE IS NULL) then
                    BASE = 0;
                if (IVA IS NULL) then
                    IVA = 0;
                COSTO = CANTIDAD * COSTOUNIT;
                UTILIDAD = BASE - COSTO;
                if (UOM = 'UTILIDAD') then
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                else
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
                if (CEROS = 'S') then
                    begin
                    INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (4, USER, :ARTICULO);
                    SUSPEND;
                    end
                ELSE
                    if ((BASE <> 0) AND (CANTIDAD <> 0)) then
                        SUSPEND;
                END
            if (CEROS = 'S') then
                BEGIN
                COSTO = 0;
                UTILIDAD = 0;
                PORC = 0;
                /* agregue los articulos sin factura */
                FOR SELECT ARTI_COD, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN and
                    not exists (select REPA_ARTICULO FROM REPORTES_AUX WHERE REPA_ID = 4 AND REPA_USER = USER AND REPA_ARTICULO = a.arti_cod)
                    INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                    DO
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        if (BIN_AND(TIPO, 2) <> 0) then
            BEGIN
            SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 32 INTO :NOMTIPO;
            FOR SELECT MAX(ARTI_COD), SUM(RVDE_CANT * RVDE_FACTOR), SUM(RVDE_TOTAL-RVDE_IVAMONTO-RVDE_CONSUMO), SUM(RVDE_IVAMONTO), SUM(RVDE_TOTAL), SUM(RVDE_CONSUMO)
                FROM REMISIONES_VENTA_DETALLE D, REMISIONES_VENTA R, PREFIJOS P
                WHERE R.REVT_ID = D.REVT_ID AND REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN AND VEND_COD = :CODVEND AND REVT_ANULADO = 'N'
                 AND P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = 32 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                GROUP BY ARTI_COD
                INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :TOTAL, :CONSUMO
                DO
                BEGIN
                SELECT ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO WHERE ARTI_COD = :ARTICULO
                    INTO :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC;
                SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                EXECUTE PROCEDURE costo_promedio (:ARTICULO, :FECFIN) RETURNING_VALUES (:COSTOUNIT);
                if (CANTIDAD IS NULL) then
                    CANTIDAD = 0;
                if (BASE IS NULL) then
                    BASE = 0;
                if (IVA IS NULL) then
                    IVA = 0;
                COSTO = CANTIDAD * COSTOUNIT;
                UTILIDAD = BASE - COSTO;
                if (UOM = 'UTILIDAD') then
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                else
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
                if (CEROS = 'S') then
                    begin
                    INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (4, USER, :ARTICULO);
                    SUSPEND;
                    end
                ELSE
                    if ((BASE <> 0) AND (CANTIDAD <> 0)) then
                        SUSPEND;
                END
            if (CEROS = 'S') then
                BEGIN
                COSTO = 0;
                UTILIDAD = 0;
                PORC = 0;
                /* agregue los articulos sin factura */
                FOR SELECT ARTI_COD, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN and
                    not exists (select REPA_ARTICULO FROM REPORTES_AUX WHERE REPA_ID = 4 AND REPA_USER = USER AND REPA_ARTICULO = a.arti_cod)
                    INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                    DO
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        if (BIN_AND(TIPO, 4) <> 0) then
            BEGIN
            SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 33 INTO :NOMTIPO;
            FOR SELECT MAX(ARTI_COD), SUM(DVDE_CANT * DVDE_FACTOR), SUM(DEVT_FACTOR*(DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO)),
                SUM(DEVT_FACTOR*DVDE_IVAMONTO), SUM(DEVT_FACTOR*DVDE_TOTAL), SUM(DVDE_CONSUMO)
                FROM devoluciones_ventas_detalle D, DEVOLUCIONES_VENTAS V, PREFIJOS P
                WHERE V.DEVT_ID = D.DEVT_ID AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND VEND_COD = :CODVEND AND DEVT_ANULADO = 'N'
                 AND P.PREF_PRE = V.PREF_PRE AND P.TIDO_COD = 33 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) and substring(D.arti_cod from 1 FOR 2) <> '.t'
                GROUP BY ARTI_COD
                INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :TOTAL, :CONSUMO
                DO
                BEGIN
                SELECT ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO WHERE ARTI_COD = :ARTICULO
                    INTO :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC;
                SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                EXECUTE PROCEDURE costo_promedio (:ARTICULO, :FECFIN) RETURNING_VALUES (:COSTOUNIT);
                if (CANTIDAD IS NULL) then
                    CANTIDAD = 0;
                if (BASE IS NULL) then
                    BASE = 0;
                if (IVA IS NULL) then
                    IVA = 0;
                COSTO = CANTIDAD * COSTOUNIT;
                UTILIDAD = BASE - COSTO;
                if (UOM = 'UTILIDAD') then
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                else
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
                TOTAL = TOTAL * -1;
                IVA = IVA * -1;
                BASE = BASE * -1;
                CANTIDAD = CANTIDAD * -1;
                COSTO = COSTO * -1;
                UTILIDAD = UTILIDAD * -1;
                if (CEROS = 'S') then
                    begin
                    INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (4, USER, :ARTICULO);
                    SUSPEND;
                    end
                ELSE
                    if ((BASE <> 0) AND (CANTIDAD <> 0)) then
                        SUSPEND;
                END
            if (CEROS = 'S') then
                BEGIN
                COSTO = 0;
                UTILIDAD = 0;
                PORC = 0;
                /* agregue los articulos sin factura */
                FOR SELECT ARTI_COD, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN and
                    not exists (select REPA_ARTICULO FROM REPORTES_AUX WHERE REPA_ID = 4 AND REPA_USER = USER AND REPA_ARTICULO = a.arti_cod)
                    INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                    DO
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        if (BIN_AND(TIPO, 8) <> 0) then
            BEGIN
            SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 34 INTO :NOMTIPO;
            FOR SELECT MAX(ARTI_COD), SUM(PEDE_CANT * PEDE_FACTOR), SUM(PEDI_FACTOR*(PEDE_TOTAL-PEDE_IVAMONTO-PEDE_CONSUMO)),
                SUM(PEDI_FACTOR*PEDE_IVAMONTO), SUM(PEDI_FACTOR*PEDE_TOTAL), SUM(PEDE_CONSUMO)
                FROM PEDIDOS_DETALLE D, PEDIDOS P, PREFIJOS PR
                WHERE P.PEDI_ID = D.PEDI_ID AND PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND VEND_COD = :CODVEND AND PEDI_ANULADO = 'N'
                 AND PR.PREF_PRE = P.PREF_PRE AND P.TIDO_COD = 34 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                GROUP BY ARTI_COD
                INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :TOTAL, :CONSUMO
                DO
                BEGIN
                SELECT ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO WHERE ARTI_COD = :ARTICULO
                    INTO :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC;
                SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                EXECUTE PROCEDURE costo_promedio (:ARTICULO, :FECFIN) RETURNING_VALUES (:COSTOUNIT);
                if (CANTIDAD IS NULL) then
                    CANTIDAD = 0;
                if (BASE IS NULL) then
                    BASE = 0;
                if (IVA IS NULL) then
                    IVA = 0;
                COSTO = CANTIDAD * COSTOUNIT;
                UTILIDAD = BASE - COSTO;
                if (UOM = 'UTILIDAD') then
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                else
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
                if (CEROS = 'S') then
                    begin
                    INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (4, USER, :ARTICULO);
                    SUSPEND;
                    end
                ELSE
                    if ((BASE <> 0) AND (CANTIDAD <> 0)) then
                        SUSPEND;
                END
            if (CEROS = 'S') then
                BEGIN
                COSTO = 0;
                UTILIDAD = 0;
                PORC = 0;
                /* agregue los articulos sin factura */
                FOR SELECT ARTI_COD, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN and
                    not exists (select REPA_ARTICULO FROM REPORTES_AUX WHERE REPA_ID = 4 AND REPA_USER = USER AND REPA_ARTICULO = a.arti_cod)
                    INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                    DO
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        if (BIN_AND(TIPO, 16) <> 0) then
            BEGIN
            SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 35 INTO :NOMTIPO;
            FOR SELECT MAX(ARTI_COD), SUM(CTDE_CANT * CTDE_FACTOR), SUM(COTI_FACTOR*(CTDE_TOTAL-CTDE_IVAMONTO-CTDE_CONSUMO)),
                SUM(COTI_FACTOR*CTDE_IVAMONTO), SUM(COTI_FACTOR*CTDE_TOTAL), SUM(CTDE_CONSUMO)
                FROM COTIZACIONES_DETALLE D, COTIZACIONES C, PREFIJOS P
                WHERE C.COTI_ID = D.COTI_ID AND COTI_FECHA >= :FECINI AND COTI_FECHA <= :FECFIN AND VEND_COD = :CODVEND AND COTI_ANULADO = 'N'
                 AND P.PREF_PRE = C.PREF_PRE AND P.TIDO_COD = 35 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                GROUP BY ARTI_COD
                INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :TOTAL, :CONSUMO
                DO
                BEGIN
                SELECT ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO WHERE ARTI_COD = :ARTICULO
                    INTO :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC;
                SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                EXECUTE PROCEDURE costo_promedio (:ARTICULO, :FECFIN) RETURNING_VALUES (:COSTOUNIT);
                if (CANTIDAD IS NULL) then
                    CANTIDAD = 0;
                if (BASE IS NULL) then
                    BASE = 0;
                if (IVA IS NULL) then
                    IVA = 0;
                COSTO = CANTIDAD * COSTOUNIT;
                UTILIDAD = BASE - COSTO;
                if (UOM = 'UTILIDAD') then
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                else
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
                if (CEROS = 'S') then
                    begin
                    INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (4, USER, :ARTICULO);
                    SUSPEND;
                    end
                ELSE
                    if ((BASE <> 0) AND (CANTIDAD <> 0)) then
                        SUSPEND;
                END
            if (CEROS = 'S') then
                BEGIN
                COSTO = 0;
                UTILIDAD = 0;
                PORC = 0;
                /* agregue los articulos sin factura */
                FOR SELECT ARTI_COD, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN and
                    not exists (select REPA_ARTICULO FROM REPORTES_AUX WHERE REPA_ID = 4 AND REPA_USER = USER AND REPA_ARTICULO = a.arti_cod)
                    INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                    DO
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        END
    ELSE
        BEGIN
        if (BIN_AND(TIPO, 1) <> 0) then
            BEGIN
            SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 31 INTO :NOMTIPO;
            FOR SELECT F.PREF_PRE, FACT_NUMERO, FACT_FECHA, ARTI_COD, FADE_CANT * FADE_FACTOR, (FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO)*FACT_FACTOR,
                FADE_IVAMONTO*FACT_FACTOR, FADE_DTOPORC, FADE_TOTAL*FACT_FACTOR, FADE_CONSUMO
                FROM FACTURAS F, FACTURAS_DETALLE D, PREFIJOS P
                WHERE F.FACT_ID = D.FACT_ID AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND VEND_COD = :CODVEND AND FACT_ANULADO = 'N'
                 AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) and substring(D.arti_cod from 1 FOR 2) <> '.t'
                ORDER BY ARTI_COD, FACT_FECHA, F.FACT_ID, FADE_ITEM
                INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :DTO, :TOTAL, :CONSUMO
                DO
                BEGIN
                SELECT ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO WHERE ARTI_COD = :ARTICULO
                    INTO :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC;
                SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                EXECUTE PROCEDURE costo_promedio (:ARTICULO, :FECHA) RETURNING_VALUES (:COSTOUNIT);
                COSTO = COSTOUNIT * CANTIDAD;
                UTILIDAD = BASE - COSTO;
                if (UOM = 'UTILIDAD') then
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                else
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
                if (CEROS = 'S') then
                    INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (4, USER, :ARTICULO);
                SUSPEND;
                END
            if (CEROS = 'S') then
                BEGIN
                COSTO = 0;
                UTILIDAD = 0;
                PORC = 0;
                /* agregue los articulos sin factura */
                FOR SELECT ARTI_COD, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN and
                    not exists (select REPA_ARTICULO FROM REPORTES_AUX WHERE REPA_ID = 4 AND REPA_USER = USER AND REPA_ARTICULO = a.arti_cod)
                    INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                    DO
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        if (BIN_AND(TIPO, 2) <> 0) then
            BEGIN
            SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 32 INTO :NOMTIPO;
            FOR SELECT R.PREF_PRE, REVT_NUMERO, REVT_FECHA, ARTI_COD, RVDE_CANT * RVDE_FACTOR, (RVDE_TOTAL - RVDE_IVAMONTO), RVDE_IVAMONTO, RVDE_DTOPORC, RVDE_TOTAL, RVDE_CONSUMO
                FROM REMISIONES_VENTA R, REMISIONES_VENTA_DETALLE D, PREFIJOS P
                WHERE R.REVT_ID = D.REVT_ID AND REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN AND VEND_COD = :CODVEND AND REVT_ANULADO = 'N'
                 AND P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = 32 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) and substring(D.arti_cod from 1 FOR 2) <> '.t'
                ORDER BY ARTI_COD, REVT_FECHA, R.REVT_ID, RVDE_ITEM
                INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :DTO, :TOTAL, :CONSUMO
                DO
                BEGIN
                SELECT ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO WHERE ARTI_COD = :ARTICULO
                    INTO :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC;
                SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                EXECUTE PROCEDURE costo_promedio (:ARTICULO, :FECHA) RETURNING_VALUES (:COSTOUNIT);
                COSTO = COSTOUNIT * CANTIDAD;
                UTILIDAD = BASE - COSTO;
                if (UOM = 'UTILIDAD') then
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                else
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
                if (CEROS = 'S') then
                    INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (4, USER, :ARTICULO);
                SUSPEND;
                END
            if (CEROS = 'S') then
                BEGIN
                COSTO = 0;
                UTILIDAD = 0;
                PORC = 0;
                /* agregue los articulos sin factura */
                FOR SELECT ARTI_COD, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN and
                    not exists (select REPA_ARTICULO FROM REPORTES_AUX WHERE REPA_ID = 4 AND REPA_USER = USER AND REPA_ARTICULO = a.arti_cod)
                    INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                    DO
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        if (BIN_AND(TIPO, 4) <> 0) then
            BEGIN
            SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 33 INTO :NOMTIPO;
            FOR SELECT V.PREF_PRE, DEVT_NUMERO, DEVT_FECHA, ARTI_COD, DVDE_CANT * DVDE_FACTOR, (DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO)*DEVT_FACTOR,
                DVDE_IVAMONTO*DEVT_FACTOR, DVDE_DTOPORC, DVDE_TOTAL*DEVT_FACTOR, DVDE_CONSUMO
                FROM DEVOLUCIONES_VENTAS V, DEVOLUCIONES_VENTAS_DETALLE D, PREFIJOS P
                WHERE V.DEVT_ID = D.DEVT_ID AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND VEND_COD = :CODVEND AND DEVT_ANULADO = 'N'
                 AND P.PREF_PRE = V.PREF_PRE AND P.TIDO_COD = 33 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) and substring(D.arti_cod from 1 FOR 2) <> '.t'
                ORDER BY ARTI_COD, DEVT_FECHA, D.DEVT_ID, DVDE_ITEM
                INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :DTO, :TOTAL, :CONSUMO
                DO
                BEGIN
                SELECT ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO WHERE ARTI_COD = :ARTICULO
                    INTO :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC;
                SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                EXECUTE PROCEDURE costo_promedio (:ARTICULO, :FECHA) RETURNING_VALUES (:COSTOUNIT);
                COSTO = COSTOUNIT * CANTIDAD;
                UTILIDAD = BASE - COSTO;
                if (UOM = 'UTILIDAD') then
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                else
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
                TOTAL = TOTAL * -1;
                IVA = IVA * -1;
                BASE = BASE * -1;
                CANTIDAD = CANTIDAD * -1;
                COSTO = COSTO * -1;
                UTILIDAD = UTILIDAD * -1;
                if (CEROS = 'S') then
                    INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (4, USER, :ARTICULO);
                SUSPEND;
                END
            if (CEROS = 'S') then
                BEGIN
                COSTO = 0;
                UTILIDAD = 0;
                PORC = 0;
                /* agregue los articulos sin factura */
                FOR SELECT ARTI_COD, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN and
                    not exists (select REPA_ARTICULO FROM REPORTES_AUX WHERE REPA_ID = 4 AND REPA_USER = USER AND REPA_ARTICULO = a.arti_cod)
                    INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                    DO
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        if (BIN_AND(TIPO, 8) <> 0) then
            BEGIN
            SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 34 INTO :NOMTIPO;
            FOR SELECT P.PREF_PRE, PEDI_NUMERO, PEDI_FECHA, ARTI_COD, PEDE_CANT * PEDE_FACTOR, (PEDE_TOTAL-PEDE_IVAMONTO-PEDE_CONSUMO)*PEDI_FACTOR,
                PEDE_IVAMONTO*PEDI_FACTOR, PEDE_DTOPORC, PEDE_TOTAL*PEDI_FACTOR, PEDE_CONSUMO
                FROM PEDIDOS P, PEDIDOS_DETALLE D, PREFIJOS PR
                WHERE P.PEDI_ID = D.PEDI_ID AND PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND VEND_COD = :CODVEND AND PEDI_ANULADO = 'N'
                 AND P.PREF_PRE = PR.PREF_PRE AND P.TIDO_COD = 34 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                ORDER BY ARTI_COD, PEDI_FECHA, P.PEDI_ID, PEDE_ITEM
                INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :DTO, :TOTAL, :CONSUMO
                DO
                BEGIN
                SELECT ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO WHERE ARTI_COD = :ARTICULO
                    INTO :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC;
                SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                EXECUTE PROCEDURE costo_promedio (:ARTICULO, :FECHA) RETURNING_VALUES (:COSTOUNIT);
                COSTO = COSTOUNIT * CANTIDAD;
                UTILIDAD = BASE - COSTO;
                if (UOM = 'UTILIDAD') then
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                else
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
                if (CEROS = 'S') then
                    INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (4, USER, :ARTICULO);
                SUSPEND;
                END
            if (CEROS = 'S') then
                BEGIN
                COSTO = 0;
                UTILIDAD = 0;
                PORC = 0;
                /* agregue los articulos sin factura */
                FOR SELECT ARTI_COD, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN and
                    not exists (select REPA_ARTICULO FROM REPORTES_AUX WHERE REPA_ID = 4 AND REPA_USER = USER AND REPA_ARTICULO = a.arti_cod)
                    INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                    DO
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        if (BIN_AND(TIPO, 16) <> 0) then
            BEGIN
            SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 35 INTO :NOMTIPO;
            FOR SELECT C.PREF_PRE, COTI_NUMERO, COTI_FECHA, ARTI_COD, CTDE_CANT * CTDE_FACTOR, (CTDE_TOTAL-CTDE_IVAMONTO-CTDE_CONSUMO)*COTI_FACTOR,
                CTDE_IVAMONTO*COTI_FACTOR, CTDE_DTOPORC, CTDE_TOTAL*COTI_FACTOR, CTDE_CONSUMO
                FROM COTIZACIONES C, COTIZACIONES_DETALLE D, PREFIJOS P
                WHERE C.COTI_ID = D.COTI_ID AND ARTI_COD = :ARTICULO AND COTI_FECHA >= :FECINI AND COTI_FECHA <= :FECFIN AND VEND_COD = :CODVEND AND COTI_ANULADO = 'N'
                 AND P.PREF_PRE = C.PREF_PRE AND P.TIDO_COD = 35 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                ORDER BY COTI_FECHA, C.COTI_ID, CTDE_ITEM
                INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :DTO, :TOTAL, :CONSUMO
                DO
                BEGIN
                SELECT ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO WHERE ARTI_COD = :ARTICULO
                    INTO :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC;
                SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                EXECUTE PROCEDURE costo_promedio (:ARTICULO, :FECHA) RETURNING_VALUES (:COSTOUNIT);
                COSTO = COSTOUNIT * CANTIDAD;
                UTILIDAD = BASE - COSTO;
                if (UOM = 'UTILIDAD') then
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                else
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
                if (CEROS = 'S') then
                    INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (4, USER, :ARTICULO);
                SUSPEND;
                END
            if (CEROS = 'S') then
                BEGIN
                COSTO = 0;
                UTILIDAD = 0;
                PORC = 0;
                /* agregue los articulos sin factura */
                FOR SELECT ARTI_COD, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN and
                    not exists (select REPA_ARTICULO FROM REPORTES_AUX WHERE REPA_ID = 4 AND REPA_USER = USER AND REPA_ARTICULO = a.arti_cod)
                    INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                    DO
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        END
    END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER PROCEDURE REP_VENTAS_ANIVERSARIO(
    FECINI DATE,
    FECFIN DATE,
    SUBEMPRESA INTEGER)
RETURNS (
    ARTICULO VARCHAR(15),
    DESCRIPCION VARCHAR(60),
    CODGRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    CODSUBG VARCHAR(3),
    NOMSUBG VARCHAR(30),
    CODMARC VARCHAR(3),
    NOMMARC VARCHAR(30),
    UNIDAD VARCHAR(8),
    CANTIDAD NUMERIC(18,4),
    BASE NUMERIC(18,2),
    IVA NUMERIC(18,2),
    CONSUMO NUMERIC(18,2),
    DEVCNT NUMERIC(18,4),
    DEVMONTO NUMERIC(18,2),
    IVADEV NUMERIC(18,2),
    CONSUMODEV NUMERIC(18,2))
AS
BEGIN
/* BORRA LA TABLA AUXILIAR */
DELETE FROM reportes_aux WHERE REPA_ID = 1 AND REPA_USER = USER;

        /* BORRA LA TABLA AUXILIAR */
        DELETE FROM reportes_aux WHERE REPA_ID = 1 AND REPA_USER = USER;

        FOR SELECT MAX(D.ARTI_COD), SUM(FADE_CANT * FADE_FACTOR), SUM(FACT_FACTOR*(FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO)),
            SUM(FACT_FACTOR*FADE_IVAMONTO), SUM(FADE_CONSUMO), MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD)
            FROM FACTURAS_DETALLE D, FACTURAS F, PREFIJOS P, ARTICULO A, ARTICULOS_REPORTE AR
            WHERE A.arti_cod = AR.arti_cod AND
            F.FACT_ID = D.FACT_ID AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND D.ARTI_COD = A.arti_cod AND
            FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND
            FACT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) and substring(a.arti_cod from 1 FOR 2) <> '.t'
            GROUP BY D.ARTI_COD
            INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,
            :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
            DO
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;

            SELECT SUM(DVDE_CANT * DVDE_FACTOR), SUM(DEVT_FACTOR*(DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO)),
                SUM(DEVT_FACTOR*DVDE_IVAMONTO), SUM(DVDE_CONSUMO)
                FROM devoluciones_ventas_detalle D, DEVOLUCIONES_VENTAS V, PREFIJOS P
                WHERE V.DEVT_ID = D.DEVT_ID AND P.PREF_PRE = V.PREF_PRE AND P.TIDO_COD = 33 AND D.ARTI_COD = :articulo AND
                DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND
                DEVT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                INTO :devcnt, :devmonto, :ivadev, :consumodev;

            SUSPEND;
            END

END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER PROCEDURE REP_VENTAS_VENDEDOR(
    TIPO INTEGER,
    DESDE VARCHAR(20),
    HASTA VARCHAR(20),
    FECINI DATE,
    FECFIN DATE,
    DETALLE CHAR(1),
    CEROS CHAR(1),
    SUBEMPRESA INTEGER)
RETURNS (
    CODVEND INTEGER,
    NOMVEND VARCHAR(60),
    NOMTIPO VARCHAR(50),
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(6),
    NIT VARCHAR(20),
    NOMBRE VARCHAR(60),
    ID INTEGER,
    FECDOC DATE,
    CANTIDAD INTEGER,
    SUBTOTAL NUMERIC(18,2),
    DTO NUMERIC(18,2),
    ADICIONAL NUMERIC(18,2),
    CONSUMO NUMERIC(18,2),
    IVA NUMERIC(18,2),
    EXTRA NUMERIC(18,2),
    TOTAL NUMERIC(18,2),
    RTFTE NUMERIC(18,2),
    RTIVA NUMERIC(18,2),
    RTICA NUMERIC(18,2),
    NETO NUMERIC(18,2))
AS
BEGIN
if (DETALLE = 'N') then
    BEGIN
    NIT = '';
    NOMBRE = '';
    if (BIN_AND(TIPO, 1) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 31 INTO :NOMTIPO;
        FOR SELECT MAX(F.VEND_COD), MAX(VEND_NOMBRE), COUNT(*), SUM(FACT_DTOMONTO), SUM(FACT_ADICIONAL), SUM(FACT_IVAMONTO), SUM(FACT_EXTRA), SUM(FACT_RTFTEMONTO), SUM(FACT_RTIVAMONTO), SUM(FACT_RTICAMONTO), SUM(FACT_TOTAL)
            FROM FACTURAS F, PREFIJOS P, VENDEDORES V
            WHERE F.VEND_COD >= :DESDE AND F.VEND_COD <= :HASTA AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND FACT_ANULADO = 'N'
             AND F.vend_cod = V.vend_cod AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND ((P.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY F.VEND_COD
            INTO :CODVEND, :NOMVEND, :CANTIDAD, :DTO, :ADICIONAL, :IVA, :EXTRA, :RTFTE, :RTIVA, :RTICA, :TOTAL
            DO
            BEGIN
            SELECT SUM(FADE_CONSUMO) FROM FACTURAS_DETALLE D, FACTURAS F WHERE F.FACT_ID = D.FACT_ID AND
                VEND_COD = :CODVEND AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND FACT_ANULADO = 'N' and substring(D.arti_cod from 1 FOR 2) <> '.t'
                INTO :CONSUMO;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (DTO IS NULL) then
                DTO = 0;
            if (ADICIONAL IS NULL) then
                ADICIONAL = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (EXTRA IS NULL) then
                EXTRA = 0;
            if (RTFTE IS NULL) then
                RTFTE = 0;
            if (RTIVA IS NULL) then
                RTIVA = 0;
            if (RTICA IS NULL) then
                RTICA = 0;
            SUBTOTAL = TOTAL - EXTRA - IVA - ADICIONAL + DTO - CONSUMO;
            NETO = TOTAL - RTFTE - RTIVA - RTICA;
            if (CEROS = 'S') then
              SUSPEND;
            ELSE
              if (CANTIDAD > 0) then
                SUSPEND;
            END
        END
    if (BIN_AND(TIPO, 2) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 32 INTO :NOMTIPO;
        FOR SELECT MAX(R.VEND_COD), MAX(VEND_NOMBRE), COUNT(*), 0, 0, SUM(REVT_IVAMONTO), 0, 0, 0, 0, SUM(REVT_TOTAL)
            FROM REMISIONES_VENTA R, PREFIJOS P, VENDEDORES V
            WHERE R.VEND_COD >= :DESDE AND R.VEND_COD <= :HASTA
             AND R.vend_cod = V.vend_cod AND REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN AND REVT_ANULADO = 'N'
             AND P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = 32 AND ((P.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY R.VEND_COD
            INTO :CODVEND, :NOMVEND, :CANTIDAD, :DTO, :ADICIONAL, :IVA, :EXTRA, :RTFTE, :RTIVA, :RTICA, :TOTAL
            DO
            BEGIN
            SELECT SUM(RVDE_CONSUMO) FROM REMISIONES_VENTA R, REMISIONES_VENTA_DETALLE D WHERE R.REVT_ID = D.REVT_ID AND
                VEND_COD = :CODVEND AND REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN AND REVT_ANULADO = 'N'
                INTO :CONSUMO;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (DTO IS NULL) then
                DTO = 0;
            if (ADICIONAL IS NULL) then
                ADICIONAL = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (EXTRA IS NULL) then
                EXTRA = 0;
            if (RTFTE IS NULL) then
                RTFTE = 0;
            if (RTIVA IS NULL) then
                RTIVA = 0;
            if (RTICA IS NULL) then
                RTICA = 0;
            SUBTOTAL = TOTAL - EXTRA - IVA - ADICIONAL + DTO - CONSUMO;
            NETO = TOTAL - RTFTE - RTIVA - RTICA;
            if (CEROS = 'S') then
              SUSPEND;
            ELSE
              if (CANTIDAD > 0) then
                SUSPEND;
            END
        END
    if (BIN_AND(TIPO, 4) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 33 INTO :NOMTIPO;
        FOR SELECT MAX(D.VEND_COD), MAX(VEND_NOMBRE), COUNT(*), SUM(DEVT_DTOMONTO), SUM(DEVT_ADICIONAL), SUM(DEVT_IVAMONTO), SUM(DEVT_EXTRA), SUM(DEVT_RTFTEMONTO), SUM(DEVT_RTIVAMONTO), SUM(DEVT_RTICAMONTO), SUM(DEVT_TOTAL)
            FROM DEVOLUCIONES_VENTAS D, PREFIJOS P, VENDEDORES V
            WHERE D.VEND_COD >= :DESDE AND D.VEND_COD <= :HASTA
             AND D.vend_cod = V.vend_cod AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND DEVT_ANULADO = 'N'
             AND P.PREF_PRE = D.PREF_PRE AND P.TIDO_COD = 33 AND ((P.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) AND ((DEVT_REMID = 0) or (DEVT_REMID IS NULL))
            GROUP BY D.VEND_COD
            INTO :CODVEND, :NOMVEND, :CANTIDAD, :DTO, :ADICIONAL, :IVA, :EXTRA, :RTFTE, :RTIVA, :RTICA, :TOTAL
            DO
            BEGIN
            SELECT SUM(DVDE_CONSUMO) FROM DEVOLUCIONES_VENTAS V, DEVOLUCIONES_VENTAS_DETALLE D WHERE V.DEVT_ID = D.DEVT_ID AND
                VEND_COD = :CODVEND AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND DEVT_ANULADO = 'N' and substring(D.arti_cod from 1 FOR 2) <> '.t'
                INTO :CONSUMO;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (DTO IS NULL) then
                DTO = 0;
            if (ADICIONAL IS NULL) then
                ADICIONAL = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (EXTRA IS NULL) then
                EXTRA = 0;
            if (RTFTE IS NULL) then
                RTFTE = 0;
            if (RTIVA IS NULL) then
                RTIVA = 0;
            if (RTICA IS NULL) then
                RTICA = 0;
            SUBTOTAL = TOTAL - EXTRA - IVA - ADICIONAL + DTO - CONSUMO;
            NETO = TOTAL - RTFTE - RTIVA - RTICA;
            CANTIDAD = CANTIDAD * -1;
            SUBTOTAL = SUBTOTAL * -1;
            TOTAL = TOTAL * -1;
            IVA = IVA * -1;
            EXTRA = EXTRA * -1;
            DTO = DTO * -1;
            ADICIONAL = ADICIONAL * -1;
            RTFTE = RTFTE * -1;
            RTIVA = RTIVA * -1;
            RTICA = RTICA * -1;
            if (CEROS = 'S') then
              SUSPEND;
            ELSE
              if (CANTIDAD > 0) then
                SUSPEND;
            END
        END
    if (BIN_AND(TIPO, 8) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 34 INTO :NOMTIPO;
        FOR SELECT MAX(P.VEND_COD), MAX(VEND_NOMBRE), COUNT(*), SUM(PEDI_DTOMONTO), SUM(PEDI_ADICIONAL), SUM(PEDI_IVAMONTO), SUM(PEDI_EXTRA), 0, 0, 0, SUM(PEDI_TOTAL)
            FROM PEDIDOS P, PREFIJOS PR, VENDEDORES V
            WHERE V.VEND_COD >= :DESDE AND V.VEND_COD <= :HASTA
             AND P.vend_cod = V.vend_cod AND PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND PEDI_ANULADO = 'N'
             AND P.PREF_PRE = PR.PREF_PRE AND PR.TIDO_COD = 34 AND ((PR.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY P.VEND_COD
            INTO :CODVEND, :NOMVEND, :CANTIDAD, :DTO, :ADICIONAL, :IVA, :EXTRA, :RTFTE, :RTIVA, :RTICA, :TOTAL
            DO
            BEGIN
            SELECT SUM(PEDE_CONSUMO) FROM PEDIDOS P, PEDIDOS_DETALLE D WHERE P.PEDI_ID = D.PEDI_ID AND
                VEND_COD = :CODVEND AND PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND PEDI_ANULADO = 'N'
                INTO :CONSUMO;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (DTO IS NULL) then
                DTO = 0;
            if (ADICIONAL IS NULL) then
                ADICIONAL = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (EXTRA IS NULL) then
                EXTRA = 0;
            if (RTFTE IS NULL) then
                RTFTE = 0;
            if (RTIVA IS NULL) then
                RTIVA = 0;
            if (RTICA IS NULL) then
                RTICA = 0;
            SUBTOTAL = TOTAL - EXTRA - IVA - ADICIONAL + DTO - CONSUMO;
            NETO = TOTAL - RTFTE - RTIVA - RTICA;
            if (CEROS = 'S') then
              SUSPEND;
            ELSE
              if (CANTIDAD > 0) then
                SUSPEND;
            END
        END
    if (BIN_AND(TIPO, 16) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 35 INTO :NOMTIPO;
        FOR SELECT MAX(C.VEND_COD), MAX(VEND_NOMBRE), COUNT(*), SUM(COTI_DTOMONTO), SUM(COTI_ADICIONAL), SUM(COTI_IVAMONTO), SUM(COTI_EXTRA), 0, 0, 0, SUM(COTI_TOTAL)
            FROM COTIZACIONES C, PREFIJOS P, VENDEDORES V
            WHERE V.VEND_COD >= :DESDE AND V.VEND_COD <= :HASTA
             AND C.vend_cod = V.vend_cod AND COTI_FECHA >= :FECINI AND COTI_FECHA <= :FECFIN AND COTI_ANULADO = 'N'
             AND P.PREF_PRE = C.PREF_PRE AND P.TIDO_COD = 35 AND ((P.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY C.VEND_COD
            INTO :CODVEND, :NOMVEND, :CANTIDAD, :DTO, :ADICIONAL, :IVA, :EXTRA, :RTFTE, :RTIVA, :RTICA, :TOTAL
            DO
            BEGIN
            SELECT SUM(CTDE_CONSUMO) FROM COTIZACIONES C, COTIZACIONES_DETALLE D WHERE C.COTI_ID = D.COTI_ID AND
                VEND_COD = :CODVEND AND COTI_FECHA >= :FECINI AND COTI_FECHA <= :FECFIN AND COTI_ANULADO = 'N'
                INTO :CONSUMO;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (DTO IS NULL) then
                DTO = 0;
            if (ADICIONAL IS NULL) then
                ADICIONAL = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (EXTRA IS NULL) then
                EXTRA = 0;
            if (RTFTE IS NULL) then
                RTFTE = 0;
            if (RTIVA IS NULL) then
                RTIVA = 0;
            if (RTICA IS NULL) then
                RTICA = 0;
            SUBTOTAL = TOTAL - EXTRA - IVA - ADICIONAL + DTO - CONSUMO;
            NETO = TOTAL - RTFTE - RTIVA - RTICA;
            if (CEROS = 'S') then
              SUSPEND;
            ELSE
              if (CANTIDAD > 0) then
                SUSPEND;
            END
        END
    END
ELSE
    BEGIN
    if (BIN_AND(TIPO, 1) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 31 INTO :NOMTIPO;
        FOR SELECT F.VEND_COD, VEND_NOMBRE, F.FACT_ID, F.PREF_PRE, FACT_NUMERO, FACT_FECHA, FACT_DTOMONTO, FACT_ADICIONAL, FACT_IVAMONTO, FACT_EXTRA, FACT_TOTAL, FACT_RTFTEMONTO, FACT_RTIVAMONTO, FACT_RTICAMONTO, TERC_NIT, FACT_NOMCLIENTE
            FROM FACTURAS F, PREFIJOS P, VENDEDORES V WHERE F.vend_cod = V.vend_cod AND F.VEND_COD >= :DESDE AND F.VEND_COD <= :HASTA AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND FACT_ANULADO = 'N'
             AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND ((P.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            ORDER BY V.VEND_COD, FACT_FECHA, FACT_ID
            INTO :CODVEND, :NOMVEND, :ID, :PREFIJO, :NUMERO, :FECDOC, :DTO, :ADICIONAL, :IVA, :EXTRA, :TOTAL, :RTFTE, :RTIVA, :RTICA, :NIT, :NOMBRE
            DO
            BEGIN
            SELECT SUM(FADE_CONSUMO) FROM FACTURAS_DETALLE WHERE FACT_ID = :ID and substring(arti_cod from 1 FOR 2) <> '.t'
                INTO :CONSUMO;
            SUBTOTAL = TOTAL - EXTRA - IVA - ADICIONAL + DTO - CONSUMO;
            NETO = TOTAL - RTFTE - RTIVA - RTICA;
            SUSPEND;
            END
         END
    if (BIN_AND(TIPO, 2) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 32 INTO :NOMTIPO;
        FOR SELECT R.VEND_COD, VEND_NOMBRE, REVT_ID, R.PREF_PRE, REVT_NUMERO, REVT_FECHA, 0, 0, REVT_IVAMONTO, 0, REVT_TOTAL, 0, 0, 0, TERC_NIT, REVT_NOMTERC
            FROM REMISIONES_VENTA R, PREFIJOS P, VENDEDORES V WHERE R.vend_cod = V.vend_cod AND R.VEND_COD >= :DESDE AND R.VEND_COD <= :HASTA AND REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN AND REVT_ANULADO = 'N'
             AND P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = 32 AND ((P.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            ORDER BY V.VEND_COD, REVT_FECHA, REVT_ID
            INTO :CODVEND, :NOMVEND, :ID, :PREFIJO, :NUMERO, :FECDOC, :DTO, :ADICIONAL, :IVA, :EXTRA, :TOTAL, :RTFTE, :RTIVA, :RTICA, :NIT, :NOMBRE
            DO
            BEGIN
            SELECT SUM(RVDE_CONSUMO) FROM REMISIONES_VENTA_DETALLE WHERE REVT_ID = :ID
                INTO :CONSUMO;
            SUBTOTAL = TOTAL - EXTRA - IVA - ADICIONAL + DTO - CONSUMO;
            NETO = TOTAL - RTFTE - RTIVA - RTICA;
            SUSPEND;
            END
         END
    if (BIN_AND(TIPO, 4) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 33 INTO :NOMTIPO;
        FOR SELECT V.VEND_COD, VEND_NOMBRE, DEVT_ID, D.PREF_PRE, DEVT_NUMERO, DEVT_FECHA, DEVT_DTOMONTO, DEVT_ADICIONAL, DEVT_IVAMONTO, DEVT_EXTRA, DEVT_TOTAL, DEVT_RTFTEMONTO, DEVT_RTIVAMONTO, DEVT_RTICAMONTO, TERC_NIT, DEVT_NOMTERC
            FROM DEVOLUCIONES_VENTAS D, PREFIJOS P, VENDEDORES V WHERE D.vend_cod = V.vend_cod AND V.VEND_COD >= :DESDE AND V.VEND_COD <= :HASTA AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND DEVT_ANULADO = 'N'
             AND P.PREF_PRE = D.PREF_PRE AND P.TIDO_COD = 33 AND ((P.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) AND ((DEVT_REMID = 0) or (DEVT_REMID IS NULL))
            ORDER BY V.VEND_COD, DEVT_FECHA, DEVT_ID
            INTO :CODVEND, :NOMVEND, :ID, :PREFIJO, :NUMERO, :FECDOC, :DTO, :ADICIONAL, :IVA, :EXTRA, :TOTAL, :RTFTE, :RTIVA, :RTICA, :NIT, :NOMBRE
            DO
            BEGIN
            SELECT SUM(DVDE_CONSUMO) FROM DEVOLUCIONES_VENTAS_DETALLE WHERE DEVT_ID = :ID and substring(arti_cod from 1 FOR 2) <> '.t'
                INTO :CONSUMO;
            SUBTOTAL = TOTAL - EXTRA - IVA - ADICIONAL + DTO - CONSUMO;
            NETO = TOTAL - RTFTE - RTIVA - RTICA;
            TOTAL = TOTAL * -1;
            IVA = IVA * -1;
            EXTRA = EXTRA * -1;
            DTO = DTO * -1;
            ADICIONAL = ADICIONAL * -1;
            RTFTE = RTFTE * -1;
            RTIVA = RTIVA * -1;
            RTICA = RTICA * -1;
            SUSPEND;
            END
         END
    if (BIN_AND(TIPO, 8) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 34 INTO :NOMTIPO;
        FOR SELECT P.VEND_COD, VEND_NOMBRE, PEDI_ID, P.PREF_PRE, PEDI_NUMERO, PEDI_FECHA, PEDI_DTOMONTO, PEDI_ADICIONAL, PEDI_IVAMONTO, PEDI_EXTRA, PEDI_TOTAL, 0, 0, 0, TERC_NIT, PEDI_NOMTERC
            FROM PEDIDOS P, PREFIJOS PR, VENDEDORES V WHERE P.vend_cod = V.vend_cod AND P.VEND_COD >= :DESDE AND P.VEND_COD <= :HASTA AND PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND PEDI_ANULADO = 'N'
             AND P.PREF_PRE = PR.PREF_PRE AND PR.TIDO_COD = 34 AND ((PR.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            ORDER BY V.VEND_COD, PEDI_FECHA, PEDI_ID
            INTO :CODVEND, :NOMVEND, :ID, :PREFIJO, :NUMERO, :FECDOC, :DTO, :ADICIONAL, :IVA, :EXTRA, :TOTAL, :RTFTE, :RTIVA, :RTICA, :NIT, :NOMBRE
            DO
            BEGIN
            SELECT SUM(PEDE_CONSUMO) FROM PEDIDOS_DETALLE WHERE PEDI_ID = :ID
                INTO :CONSUMO;
            SUBTOTAL = TOTAL - EXTRA - IVA - ADICIONAL + DTO - CONSUMO;
            NETO = TOTAL - RTFTE - RTIVA - RTICA;
            SUSPEND;
            END
         END
    if (BIN_AND(TIPO, 16) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 35 INTO :NOMTIPO;
        FOR SELECT C.VEND_COD, VEND_NOMBRE, COTI_ID, C.PREF_PRE, COTI_NUMERO, COTI_FECHA, COTI_DTOMONTO, COTI_ADICIONAL, COTI_IVAMONTO, COTI_EXTRA, COTI_TOTAL, 0, 0, 0, TERC_NIT, COTI_NOMTERC
            FROM COTIZACIONES C, PREFIJOS P, VENDEDORES V WHERE C.vend_cod = V.vend_cod AND C.VEND_COD >= :DESDE AND C.VEND_COD <= :HASTA AND COTI_FECHA >= :FECINI AND COTI_FECHA <= :FECFIN AND COTI_ANULADO = 'N'
             AND P.PREF_PRE = C.PREF_PRE AND P.TIDO_COD = 35 AND ((P.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            ORDER BY V.VEND_COD, COTI_FECHA, COTI_ID
            INTO :CODVEND, :NOMVEND, :ID, :PREFIJO, :NUMERO, :FECDOC, :DTO, :ADICIONAL, :IVA, :EXTRA, :TOTAL, :RTFTE, :RTIVA, :RTICA, :NIT, :NOMBRE
            DO
            BEGIN
            SELECT SUM(CTDE_CONSUMO) FROM COTIZACIONES_DETALLE WHERE COTI_ID = :ID
                INTO :CONSUMO;
            SUBTOTAL = TOTAL - EXTRA - IVA - ADICIONAL + DTO - CONSUMO;
            NETO = TOTAL - RTFTE - RTIVA - RTICA;
            SUSPEND;
            END
        END
    END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER PROCEDURE RESUMEN_VENTAS_DIA(
    FECHA DATE,
    PUNTO INTEGER)
AS
begin
INSERT INTO RESUMEN_VENTAS(RESU_FECHA, PTVT_ID, ARTI_COD, RESU_CANT, RESU_IVA, RESU_CONSUMO, RESU_TOTAL)
    SELECT MAX(:FECHA), MAX(:PUNTO), MAX(ARTI_COD), SUM(FADE_CANT * FADE_FACTOR), SUM(FADE_IVAMONTO), SUM(FADE_CONSUMO), SUM(FADE_TOTAL)
    FROM FACTURAS_DETALLE D, FACTURAS F WHERE F.FACT_ID = D.FACT_ID AND FACT_FECHA = :FECHA AND PTVT_ID = :PUNTO AND FACT_ANULADO = 'N' and substring(arti_cod from 1 FOR 2) <> '.t'
    GROUP BY ARTI_COD;
end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER PROCEDURE RESUMEN_VENTAS_TX(
    FECHA DATE,
    PUNTO INTEGER)
RETURNS (
    PREFIJO VARCHAR(4),
    VENDEDOR INTEGER,
    ARTICULO VARCHAR(15),
    DESCRIPCION VARCHAR(60),
    UNIDAD VARCHAR(8),
    CANTIDAD NUMERIC(18,4),
    PRECIO NUMERIC(18,4),
    IVA NUMERIC(18,4),
    CONSUMO NUMERIC(18,4))
AS
BEGIN
FOR SELECT MAX(D.ARTI_COD), SUM(FADE_CANT * FADE_FACTOR), SUM((FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO)*FACT_FACTOR), SUM(FADE_IVAMONTO*FACT_FACTOR), SUM(FADE_CONSUMO),
    MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(F.PREF_PRE), max(f.vend_cod)
    FROM FACTURAS_DETALLE D, FACTURAS F, ARTICULO A
    WHERE F.FACT_ID = D.FACT_ID AND D.ARTI_COD = A.arti_cod AND FACT_FECHA = :FECHA AND FACT_ANULADO = 'N' AND F.ptvt_id = :PUNTO and substring(A.arti_cod from 1 FOR 2) <> '.t'
    GROUP BY f.vend_cod, D.ARTI_COD
    INTO :ARTICULO, :CANTIDAD, :PRECIO, :IVA, :CONSUMO, :DESCRIPCION, :UNIDAD, :PREFIJO, :vendedor
    DO
    BEGIN
    if (CANTIDAD IS NULL) then
        CANTIDAD = 0;
    if (PRECIO IS NULL) then
        PRECIO = 0;
    if (IVA IS NULL) then
        IVA = 0;
    if (CONSUMO IS NULL) then
        CONSUMO = 0;
    if (cantidad <> 0) then
        begin
        PRECIO = PRECIO / CANTIDAD;
        SUSPEND;
        end
    END /* FOR */
FOR SELECT MAX(D.ARTI_COD), SUM(DVDE_CANT * DVDE_FACTOR), SUM((DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO)*DEVT_FACTOR), SUM(DVDE_IVAMONTO*DEVT_FACTOR), SUM(DVDE_CONSUMO),
    MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(F.PREF_PRE), max(f.vend_cod)
    FROM DEVOLUCIONES_VENTAS_DETALLE D, DEVOLUCIONES_VENTAS F, ARTICULO A
    WHERE F.DEVT_ID = D.DEVT_ID AND D.ARTI_COD = A.arti_cod AND DEVT_FECHA = :FECHA AND DEVT_ANULADO = 'N' AND F.ptvt_id = :PUNTO and substring(a.arti_cod from 1 FOR 2) <> '.t'
    GROUP BY f.vend_cod, D.ARTI_COD
    INTO :ARTICULO, :CANTIDAD, :PRECIO, :IVA, :CONSUMO, :DESCRIPCION, :UNIDAD, :PREFIJO, :vendedor
    DO
    BEGIN
    if (CANTIDAD IS NULL) then
        CANTIDAD = 0;
    if (PRECIO IS NULL) then
        PRECIO = 0;
    if (IVA IS NULL) then
        IVA = 0;
    if (CONSUMO IS NULL) then
        CONSUMO = 0;
    if (cantidad <> 0) then
        begin
        PRECIO = PRECIO / CANTIDAD;
        CANTIDAD = CANTIDAD * -1;
        IVA = IVA * -1;
        CONSUMO = CONSUMO * -1;
        SUSPEND;
        end
    END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER PROCEDURE UTILIDAD_VENTAS(
    TIPO INTEGER,
    DETALLE CHAR(1),
    FECINI DATE,
    FECFIN DATE,
    PREFIJO VARCHAR(4),
    SUBEMPRESA INTEGER)
RETURNS (
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    PTVTID INTEGER,
    VENDCOD INTEGER,
    NIT VARCHAR(20),
    NOMTERCERO VARCHAR(60),
    ARTICULO VARCHAR(15),
    ARTIDES VARCHAR(60),
    CANT NUMERIC(18,4),
    UNIDAD VARCHAR(8),
    PRECIO NUMERIC(18,2),
    COSTO NUMERIC(18,2),
    UTILIDAD NUMERIC(18,2),
    PORC NUMERIC(9,2))
AS
declare variable IMPTOS CHAR(1);
declare variable ID INTEGER;
declare variable IVA NUMERIC(18,2);
declare variable COSTOT NUMERIC(18,2);
declare variable PRECIOT NUMERIC(18,2);
declare variable UOM VARCHAR(20);
BEGIN
EXECUTE PROCEDURE lee_configuracion ('FACTURACION', 'ARTICULOS', 'SUGERIR PRECIOS CON PORCENTAJE DE MARGEN O UTILIDAD') returning_values (:UOM);
/* DETERMINE LA TABLA A EXAMINAR */
if (TIPO = 31) then
    BEGIN
    /* FACTURA */
    FOR SELECT FACT_ID, F.PREF_PRE, FACT_NUMERO, FACT_FECHA, PTVT_ID, VEND_COD, TERC_NIT, FACT_NOMCLIENTE, FACT_IVAINC
        FROM FACTURAS F, PREFIJOS P
        WHERE FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND FACT_ANULADO = 'N'
         AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = :TIPO AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
        ORDER BY FACT_FECHA, F.PREF_PRE, FACT_NUMERO
        INTO :ID, :PREF, :NUMERO, :FECHA, :PTVTID, :VENDCOD, :NIT, :NOMTERCERO, :IMPTOS
        DO
        if ((PREFIJO = '') or (PREFIJO = PREF)) then
          BEGIN
          COSTOT = 0;
          PRECIOT = 0;
          FOR SELECT ARTI_COD, SUBSTR(FADE_DESC,1,60), FADE_CANT * FADE_FACTOR, FADE_UNIDAD, (FADE_PRUNIT - FADE_DTOMONTO) / FADE_FACTOR, FADE_IVAMONTO
            FROM FACTURAS_DETALLE
            WHERE FACT_ID = :ID and substring(arti_cod from 1 FOR 2) <> '.t'
            INTO :ARTICULO, :ARTIDES, :CANT, :UNIDAD, :PRECIO, :IVA
            DO
                BEGIN
                EXECUTE PROCEDURE COSTO_PROMEDIO(:ARTICULO, :FECHA) returning_values (:COSTO);
                COSTO = COSTO * CANT;
                PRECIO = PRECIO * CANT;
                if (IMPTOS = 'S') then
                    PRECIO = PRECIO - IVA;
                UTILIDAD = PRECIO - COSTO;
                if (DETALLE = 'S') then
                    BEGIN
                    if (UOM = 'UTILIDAD') then
                        EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                    else
                        EXECUTE PROCEDURE PORCENTAJE (utilidad,  PRECIO, 'S') returning_values (PORC);
                    SUSPEND;
                    END
                ELSE
                    BEGIN
                    COSTOT = COSTOT + COSTO;
                    PRECIOT = PRECIOT + PRECIO;
                    END
                END
          if (DETALLE <> 'S') then
            BEGIN
            COSTO = COSTOT;
            PRECIO = PRECIOT;
            UTILIDAD = PRECIO - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  PRECIO, 'S') returning_values (PORC);
            SUSPEND;
            END
          END
    END
  if (TIPO = 32) then
    BEGIN
    /* REMISION */
    FOR SELECT REVT_ID, R.PREF_PRE, REVT_NUMERO, REVT_FECHA, PTVT_ID, VEND_COD, TERC_NIT, REVT_NOMTERC, REVT_IVAINC
        FROM REMISIONES_VENTA R, PREFIJOS P
        WHERE REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN AND REVT_ANULADO = 'N'
         AND P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = :TIPO AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
        ORDER BY REVT_FECHA, R.PREF_PRE, REVT_NUMERO
        INTO :ID, :PREF, :NUMERO, :FECHA, :PTVTID, :VENDCOD, :NIT, :NOMTERCERO, :IMPTOS
        DO
        if ((PREFIJO = '') or (PREFIJO = PREF)) then
          BEGIN
          COSTOT = 0;
          PRECIOT = 0;
          FOR SELECT ARTI_COD, SUBSTR(RVDE_DESC,1,60), RVDE_CANT * RVDE_FACTOR, RVDE_UNIDAD, (RVDE_PRUNIT - RVDE_DTOMONTO) / RVDE_FACTOR, RVDE_IVAMONTO
            FROM REMISIONES_VENTA_DETALLE
            WHERE REVT_ID = :ID
            INTO :ARTICULO, :ARTIDES, :CANT, :UNIDAD, :PRECIO, :IVA
            DO
                BEGIN
                EXECUTE PROCEDURE COSTO_PROMEDIO(:ARTICULO, :FECHA) returning_values (:COSTO);
                COSTO = COSTO * CANT;
                PRECIO = PRECIO * CANT;
                if (IMPTOS = 'S') then
                    PRECIO = PRECIO - IVA;
                UTILIDAD = PRECIO - COSTO;
                if (DETALLE = 'S') then
                    BEGIN
                    if (UOM = 'UTILIDAD') then
                        EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                    else
                        EXECUTE PROCEDURE PORCENTAJE (utilidad,  PRECIO, 'S') returning_values (PORC);
                    SUSPEND;
                    END
                ELSE
                    BEGIN
                    COSTOT = COSTOT + COSTO;
                    PRECIOT = PRECIOT + PRECIO;
                    END
                END
          if (DETALLE <> 'S') then
            BEGIN
            COSTO = COSTOT;
            PRECIO = PRECIOT;
            UTILIDAD = PRECIO - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  PRECIO, 'S') returning_values (PORC);
            SUSPEND;
            END
          END
    END
  if (TIPO = 33) then
    BEGIN
    /* DEVOLUCION */
    FOR SELECT DEVT_ID, D.PREF_PRE, DEVT_NUMERO, DEVT_FECHA, PTVT_ID, VEND_COD, TERC_NIT, DEVT_NOMTERC, DEVT_IVAINC
        FROM DEVOLUCIONES_VENTAS D, PREFIJOS P
        WHERE DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND DEVT_ANULADO = 'N'
         AND P.PREF_PRE = D.PREF_PRE AND P.TIDO_COD = :TIPO AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
        ORDER BY DEVT_FECHA, D.PREF_PRE, DEVT_NUMERO
        INTO :ID, :PREF, :NUMERO, :FECHA, :PTVTID, :VENDCOD, :NIT, :NOMTERCERO, :IMPTOS
        DO
        if ((PREFIJO = '') or (PREFIJO = PREF)) then
          BEGIN
          COSTOT = 0;
          PRECIOT = 0;
          FOR SELECT ARTI_COD, SUBSTR(DVDE_DESC,1,60), DVDE_CANT * DVDE_FACTOR, DVDE_UNIDAD, (DVDE_PRUNIT - DVDE_DTOMONTO) / DVDE_FACTOR, DVDE_IVAMONTO
            FROM DEVOLUCIONES_VENTAS_DETALLE
            WHERE DEVT_ID = :ID and substring(arti_cod from 1 FOR 2) <> '.t'
            INTO :ARTICULO, :ARTIDES, :CANT, :UNIDAD, :PRECIO, :IVA
            DO
                BEGIN
                EXECUTE PROCEDURE COSTO_PROMEDIO(:ARTICULO, :FECHA) returning_values (:COSTO);
                COSTO = COSTO * CANT;
                PRECIO = PRECIO * CANT;
                if (IMPTOS = 'S') then
                    PRECIO = PRECIO - IVA;
                UTILIDAD = PRECIO - COSTO;
                if (DETALLE = 'S') then
                    BEGIN
                    if (UOM = 'UTILIDAD') then
                        EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                    else
                        EXECUTE PROCEDURE PORCENTAJE (utilidad,  PRECIO, 'S') returning_values (PORC);
                    SUSPEND;
                    END
                ELSE
                    BEGIN
                    COSTOT = COSTOT + COSTO;
                    PRECIOT = PRECIOT + PRECIO;
                    END
                END
        if (DETALLE <> 'S') then
            BEGIN
            COSTO = COSTOT;
            PRECIO = PRECIOT;
            UTILIDAD = PRECIO - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  PRECIO, 'S') returning_values (PORC);
            SUSPEND;
            END
        END
    END
  if (TIPO = 34) then
    BEGIN
    /* PEDIDO */
    FOR SELECT PEDI_ID, P.PREF_PRE, PEDI_NUMERO, PEDI_FECHA, PTVT_ID, VEND_COD, TERC_NIT, PEDI_NOMTERC, PEDI_IVAINC
        FROM PEDIDOS P, PREFIJOS R
        WHERE PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND PEDI_ANULADO = 'N'
         AND P.PREF_PRE = R.PREF_PRE AND R.TIDO_COD = :TIPO AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
        ORDER BY PEDI_FECHA, P.PREF_PRE, PEDI_NUMERO
        INTO :ID, :PREF, :NUMERO, :FECHA, :PTVTID, :VENDCOD, :NIT, :NOMTERCERO, :IMPTOS
        DO
        if ((PREFIJO = '') or (PREFIJO = PREF)) then
          BEGIN
          COSTOT = 0;
          PRECIOT = 0;
          FOR SELECT ARTI_COD, SUBSTR(PEDE_DESC,1,60), PEDE_CANT * PEDE_FACTOR, PEDE_UNIDAD, (PEDE_PRUNIT - PEDE_DTOMONTO) / PEDE_FACTOR, PEDE_IVAMONTO
            FROM PEDIDOS_DETALLE
            WHERE PEDI_ID = :ID
            INTO :ARTICULO, :ARTIDES, :CANT, :UNIDAD, :PRECIO, :IVA
            DO
                BEGIN
                EXECUTE PROCEDURE COSTO_PROMEDIO(:ARTICULO, :FECHA) returning_values (:COSTO);
                COSTO = COSTO * CANT;
                PRECIO = PRECIO * CANT;
                if (IMPTOS = 'S') then
                    PRECIO = PRECIO - IVA;
                UTILIDAD = PRECIO - COSTO;
                if (DETALLE = 'S') then
                    BEGIN
                    if (UOM = 'UTILIDAD') then
                        EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                    else
                        EXECUTE PROCEDURE PORCENTAJE (utilidad,  PRECIO, 'S') returning_values (PORC);
                    SUSPEND;
                    END
                ELSE
                    BEGIN
                    COSTOT = COSTOT + COSTO;
                    PRECIOT = PRECIOT + PRECIO;
                    END
                END
        if (DETALLE <> 'S') then
            BEGIN
            COSTO = COSTOT;
            PRECIO = PRECIOT;
            UTILIDAD = PRECIO - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  PRECIO, 'S') returning_values (PORC);
            SUSPEND;
            END
        END
    END
  if (TIPO = 35) then
    BEGIN
    /* COTIZACION */
    FOR SELECT COTI_ID, C.PREF_PRE, COTI_NUMERO, COTI_FECHA, PTVT_ID, VEND_COD, TERC_NIT, COTI_NOMTERC, COTI_IMPTOS
        FROM COTIZACIONES C, PREFIJOS P
        WHERE COTI_FECHA >= :FECINI AND COTI_FECHA <= :FECFIN AND COTI_ANULADO = 'N'
         AND P.PREF_PRE = C.PREF_PRE AND P.TIDO_COD = :TIPO AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
        ORDER BY COTI_FECHA, C.PREF_PRE, COTI_NUMERO
        INTO :ID, :PREF, :NUMERO, :FECHA, :PTVTID, :VENDCOD, :NIT, :NOMTERCERO, :IMPTOS
        DO
        if ((PREFIJO = '') or (PREFIJO = PREF)) then
          BEGIN
          COSTOT = 0;
          PRECIOT = 0;
          FOR SELECT ARTI_COD, SUBSTR(CTDE_DESC,1,60), CTDE_CANT * CTDE_FACTOR, CTDE_UNIDAD, (CTDE_PRUNIT - CTDE_DTOMONTO) / CTDE_FACTOR, CTDE_IVAMONTO
            FROM COTIZACIONES_DETALLE
            WHERE COTI_ID = :ID
            INTO :ARTICULO, :ARTIDES, :CANT, :UNIDAD, :PRECIO, :IVA
            DO
                BEGIN
                EXECUTE PROCEDURE COSTO_PROMEDIO(:ARTICULO, :FECHA) returning_values (:COSTO);
                COSTO = COSTO * CANT;
                PRECIO = PRECIO * CANT;
                if (IMPTOS = 'S') then
                    PRECIO = PRECIO - IVA;
                UTILIDAD = PRECIO - COSTO;
                if (DETALLE = 'S') then
                    BEGIN
                    if (UOM = 'UTILIDAD') then
                        EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                    else
                        EXECUTE PROCEDURE PORCENTAJE (utilidad,  PRECIO, 'S') returning_values (PORC);
                    SUSPEND;
                    END
                ELSE
                    BEGIN
                    COSTOT = COSTOT + COSTO;
                    PRECIOT = PRECIOT + PRECIO;
                    END
                END
        if (DETALLE <> 'S') then
            BEGIN
            COSTO = COSTOT;
            PRECIO = PRECIOT;
            UTILIDAD = PRECIO - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  PRECIO, 'S') returning_values (PORC);
            SUSPEND;
            END
        END
    END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER PROCEDURE TOTAL_DOC_VENTAS(
    TIPODOC INTEGER,
    ID INTEGER)
RETURNS (
    SUBTOTAL NUMERIC(18,2),
    IVA NUMERIC(18,2),
    CONSUMO NUMERIC(18,2))
AS
BEGIN
  if (TIPODOC = 31) then /* FACTURA */
    BEGIN
    SELECT SUM(FADE_TOTAL*FACT_FACTOR), SUM(FADE_IVAMONTO*FACT_FACTOR), SUM(FADE_CONSUMO*FACT_FACTOR)
        FROM FACTURAS_DETALLE D, FACTURAS F
        WHERE F.FACT_ID = :ID AND F.FACT_ID = D.FACT_ID AND FADE_REFERENCIA <> '.t'
        INTO :SUBTOTAL, :IVA, :CONSUMO;
    END
  if (TIPODOC = 32) then /* REMISION */
    BEGIN
    SELECT SUM(RVDE_TOTAL), SUM(RVDE_IVAMONTO), SUM(RVDE_CONSUMO)
        FROM remisiones_venta_detalle D, REMISIONES_VENTA R
        WHERE R.REVT_ID = :ID AND R.REVT_ID = D.REVT_ID
        INTO :SUBTOTAL, :IVA, :CONSUMO;
    END
  if (TIPODOC = 33) then /* DEVOLUCION */
    BEGIN
    SELECT SUM(DVDE_TOTAL*DEVT_FACTOR), SUM(DVDE_IVAMONTO*DEVT_FACTOR), SUM(DVDE_CONSUMO*DEVT_FACTOR)
        FROM devoluciones_ventas_detalle D, DEVOLUCIONES_VENTAS V
        WHERE V.DEVT_ID = :ID AND V.DEVT_ID = D.DEVT_ID AND DVDE_REFERENCIA <> '.t'
        INTO :SUBTOTAL, :IVA, :CONSUMO;
    END
  if (TIPODOC = 34) then /* PEDIDO */
    BEGIN
    SELECT SUM(PEDE_TOTAL*PEDI_FACTOR), SUM(PEDE_IVAMONTO*PEDI_FACTOR), SUM(PEDE_CONSUMO*PEDI_FACTOR)
        FROM pedidos_detalle D, pedidos P
        WHERE P.PEDI_ID = :ID AND P.pedi_id = D.pedi_id
        INTO :SUBTOTAL, :IVA, :CONSUMO;
    END
  if (TIPODOC = 35) then /* COTIZACION */
    BEGIN
    SELECT SUM(CTDE_TOTAL*COTI_FACTOR), SUM(CTDE_IVAMONTO*COTI_FACTOR), SUM(CTDE_CONSUMO*COTI_FACTOR)
        FROM cotizaciones_detalle D, COTIZACIONES C
        WHERE C.COTI_ID = :ID AND D.coti_id = C.coti_id
        INTO :SUBTOTAL, :IVA, :CONSUMO;
    END
  SUBTOTAL = SUBTOTAL - IVA - CONSUMO;
  SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE DETALLE_VENTAS_CLIENTE(
    NIT VARCHAR(20),
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    TIPO VARCHAR(8),
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(6),
    ID INTEGER,
    FECDOC DATE,
    SUBTOTAL NUMERIC(18,2),
    IVA NUMERIC(18,2),
    CONSUMO NUMERIC(18,2),
    TOTAL NUMERIC(18,2))
AS
BEGIN /*$$IBE$$ 
  TIPO = 'FACTVENT';
  FOR SELECT FACT_ID, PREF_PRE, FACT_NUMERO, FACT_FECHA
    FROM FACTURAS
    WHERE TERC_NIT = :NIT AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND FACT_ANULADO = 'N'
    INTO :ID, :PREFIJO, :NUMERO, :FECDOC DO
    BEGIN
    EXECUTE PROCEDURE TOTAL_DOC_VENTAS(31, ID) returning_values (SUBTOTAL, IVA, CONSUMO);
    TOTAL = SUBTOTAL + IVA + CONSUMO;
    SUSPEND;
    END
    
  TIPO = 'DEVOLCLI';
  FOR SELECT DEVT_ID, PREF_PRE, DEVT_NUMERO, DEVT_FECHA
    FROM DEVOLUCIONES_VENTAS
    WHERE TERC_NIT = :NIT AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND DEVT_ANULADO = 'N' AND ((DEVT_REMID IS NULL) or (DEVT_REMID = 0))
    INTO :ID, :PREFIJO, :NUMERO, :FECDOC DO
    BEGIN
    EXECUTE PROCEDURE TOTAL_DOC_VENTAS(33, ID) returning_values (SUBTOTAL, IVA, CONSUMO);
    TOTAL = SUBTOTAL + IVA + CONSUMO;
    SUBTOTAL = SUBTOTAL * -1;
    IVA = IVA * -1;
    CONSUMO = CONSUMO * -1;
    TOTAL = TOTAL * -1;
    SUSPEND;
    END
 $$IBE$$*/ SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE DETALLE_VENTAS_VENDEDOR(
    VEND INTEGER,
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    TIPO VARCHAR(8),
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(6),
    ID INTEGER,
    FECDOC DATE,
    CLIENTE VARCHAR(60),
    SUBTOTAL NUMERIC(18,2),
    IVA NUMERIC(18,2),
    CONSUMO NUMERIC(18,2),
    TOTAL NUMERIC(18,2))
AS
BEGIN /*$$IBE$$ 
  TIPO = 'FACTVENT';
  FOR SELECT FACT_ID, PREF_PRE, FACT_NUMERO, FACT_FECHA, FACT_NOMCLIENTE
    FROM FACTURAS
    WHERE VEND_COD = :VEND AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN  AND FACT_ANULADO = 'N'
    INTO :ID, :PREFIJO, :NUMERO, :FECDOC, :CLIENTE DO
    BEGIN
    EXECUTE PROCEDURE TOTAL_DOC_VENTAS(31, ID) returning_values (SUBTOTAL, IVA, CONSUMO);
    TOTAL = SUBTOTAL + IVA + CONSUMO;
    SUSPEND;
    END
    
  TIPO = 'DEVOLCLI';
  FOR SELECT DEVT_ID, PREF_PRE, DEVT_NUMERO, DEVT_FECHA, DEVT_NOMTERC
    FROM DEVOLUCIONES_VENTAS
    WHERE VEND_COD = :VEND AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND DEVT_ANULADO = 'N' AND ((DEVT_REMID IS NULL) or (DEVT_REMID = 0))
    INTO :ID, :PREFIJO, :NUMERO, :FECDOC, :CLIENTE DO
    BEGIN
    EXECUTE PROCEDURE TOTAL_DOC_VENTAS(33, ID) returning_values (SUBTOTAL, IVA, CONSUMO);
    TOTAL = SUBTOTAL + IVA + CONSUMO;
    SUBTOTAL = SUBTOTAL * -1;
    IVA = IVA * -1;
    CONSUMO = CONSUMO * -1;
    TOTAL = TOTAL * -1;
    SUSPEND;
    END
 $$IBE$$*/ SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

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

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

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE DETALLE_VENTAS_CLIENTE(
    NIT VARCHAR(20),
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    TIPO VARCHAR(8),
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(6),
    ID INTEGER,
    FECDOC DATE,
    SUBTOTAL NUMERIC(18,2),
    IVA NUMERIC(18,2),
    CONSUMO NUMERIC(18,2),
    TOTAL NUMERIC(18,2))
AS
BEGIN
  TIPO = 'FACTVENT';
  FOR SELECT FACT_ID, PREF_PRE, FACT_NUMERO, FACT_FECHA
    FROM FACTURAS
    WHERE TERC_NIT = :NIT AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND FACT_ANULADO = 'N'
    INTO :ID, :PREFIJO, :NUMERO, :FECDOC DO
    BEGIN
    EXECUTE PROCEDURE TOTAL_DOC_VENTAS(31, ID) returning_values (SUBTOTAL, IVA, CONSUMO);
    TOTAL = SUBTOTAL + IVA + CONSUMO;
    SUSPEND;
    END
    
  TIPO = 'DEVOLCLI';
  FOR SELECT DEVT_ID, PREF_PRE, DEVT_NUMERO, DEVT_FECHA
    FROM DEVOLUCIONES_VENTAS
    WHERE TERC_NIT = :NIT AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND DEVT_ANULADO = 'N' AND ((DEVT_REMID IS NULL) or (DEVT_REMID = 0))
    INTO :ID, :PREFIJO, :NUMERO, :FECDOC DO
    BEGIN
    EXECUTE PROCEDURE TOTAL_DOC_VENTAS(33, ID) returning_values (SUBTOTAL, IVA, CONSUMO);
    TOTAL = SUBTOTAL + IVA + CONSUMO;
    SUBTOTAL = SUBTOTAL * -1;
    IVA = IVA * -1;
    CONSUMO = CONSUMO * -1;
    TOTAL = TOTAL * -1;
    SUSPEND;
    END
END

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE DETALLE_VENTAS_VENDEDOR(
    VEND INTEGER,
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    TIPO VARCHAR(8),
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(6),
    ID INTEGER,
    FECDOC DATE,
    CLIENTE VARCHAR(60),
    SUBTOTAL NUMERIC(18,2),
    IVA NUMERIC(18,2),
    CONSUMO NUMERIC(18,2),
    TOTAL NUMERIC(18,2))
AS
BEGIN
  TIPO = 'FACTVENT';
  FOR SELECT FACT_ID, PREF_PRE, FACT_NUMERO, FACT_FECHA, FACT_NOMCLIENTE
    FROM FACTURAS
    WHERE VEND_COD = :VEND AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN  AND FACT_ANULADO = 'N'
    INTO :ID, :PREFIJO, :NUMERO, :FECDOC, :CLIENTE DO
    BEGIN
    EXECUTE PROCEDURE TOTAL_DOC_VENTAS(31, ID) returning_values (SUBTOTAL, IVA, CONSUMO);
    TOTAL = SUBTOTAL + IVA + CONSUMO;
    SUSPEND;
    END
    
  TIPO = 'DEVOLCLI';
  FOR SELECT DEVT_ID, PREF_PRE, DEVT_NUMERO, DEVT_FECHA, DEVT_NOMTERC
    FROM DEVOLUCIONES_VENTAS
    WHERE VEND_COD = :VEND AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND DEVT_ANULADO = 'N' AND ((DEVT_REMID IS NULL) or (DEVT_REMID = 0))
    INTO :ID, :PREFIJO, :NUMERO, :FECDOC, :CLIENTE DO
    BEGIN
    EXECUTE PROCEDURE TOTAL_DOC_VENTAS(33, ID) returning_values (SUBTOTAL, IVA, CONSUMO);
    TOTAL = SUBTOTAL + IVA + CONSUMO;
    SUBTOTAL = SUBTOTAL * -1;
    IVA = IVA * -1;
    CONSUMO = CONSUMO * -1;
    TOTAL = TOTAL * -1;
    SUSPEND;
    END
END

^

SET TERM ; ^

SET TERM ^ ;

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

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

^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER PROCEDURE VENTAS_CADENA(
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    NIT VARCHAR(20),
    NOMBRE VARCHAR(60),
    ARTICULO VARCHAR(16),
    DESCRIPCION VARCHAR(60),
    GRUPO VARCHAR(2),
    MARCA VARCHAR(3),
    CANT NUMERIC(18,2),
    MONTO NUMERIC(18,2))
AS
declare variable DEVCNT NUMERIC(18,2);
declare variable DEVMONTO NUMERIC(18,2);
begin
FOR SELECT T.TERC_NIT, TERC_NOM FROM TERCEROS T, CLIENTES C
    WHERE TERC_CLIE = 'S' AND T.TERC_NIT = C.TERC_NIT AND ZONA_COD = '01'
    INTO :NIT, :NOMBRE
    DO
    BEGIN
    FOR select ARTI_COD, ARTI_DES, GRUP_COD, MARC_COD
        FROM ARTICULO A WHERE ARTI_COD IN (SELECT ARTI_COD FROM PRECIOS_ARTICULO WHERE ((LIPR_COD = 3) or (LIPR_COD = 8) or (LIPR_COD = 9)) AND PRAR_FIJO <> 0)
         and substring(arti_cod from 1 FOR 2) <> '.t'
        ORDER BY MARC_COD, ARTI_COD
        INTO :ARTICULO, :DESCRIPCION, :GRUPO, :MARCA
        DO
        BEGIN
        SELECT SUM(FADE_CANT), SUM(FADE_TOTAL-FADE_CONSUMO) FROM FACTURAS F, FACTURAS_DETALLE D
            WHERE F.FACT_ID = D.FACT_ID AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND
                D.ARTI_COD = :ARTICULO AND TERC_NIT = :NIT AND FACT_ANULADO = 'N'
            INTO :CANT, :MONTO;
        if (CANT IS NULL) then
            CANT = 0;
        if (MONTO IS NULL) then
            MONTO = 0;
        SELECT SUM(DVDE_CANT), SUM(DVDE_TOTAL-DVDE_CONSUMO) FROM DEVOLUCIONES_VENTAS F, DEVOLUCIONES_VENTAS_DETALLE D
            WHERE F.DEVT_ID = D.DEVT_ID AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND
                D.ARTI_COD = :ARTICULO AND TERC_NIT = :NIT AND DEVT_ANULADO = 'N'
            INTO :DEVCNT, :DEVMONTO;    
        if (DEVCNT IS NULL) then
            DEVCNT = 0;
        if (DEVMONTO IS NULL) then
            DEVMONTO = 0;
        CANT = CANT - DEVCNT;
        MONTO = MONTO - DEVMONTO;
        SUSPEND;
        END
    END
NIT = '0';
NOMBRE = '_ OTROS CANALES _';
FOR select ARTI_COD, ARTI_DES, GRUP_COD, MARC_COD
    FROM ARTICULO A WHERE ARTI_COD IN (SELECT ARTI_COD FROM PRECIOS_ARTICULO WHERE ((LIPR_COD = 3) or (LIPR_COD = 8) or (LIPR_COD = 9)) AND PRAR_FIJO <> 0)
        and substring(arti_cod from 1 FOR 2) <> '.t'
    ORDER BY MARC_COD, ARTI_COD
    INTO :ARTICULO, :DESCRIPCION, :GRUPO, :MARCA
    DO
        BEGIN
        SELECT SUM(FADE_CANT), SUM(FADE_TOTAL-FADE_CONSUMO) FROM FACTURAS F, FACTURAS_DETALLE D, CLIENTES C
            WHERE F.FACT_ID = D.FACT_ID AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND
                D.ARTI_COD = :ARTICULO AND F.TERC_NIT = C.TERC_NIT AND C.ZONA_COD <> '01' AND FACT_ANULADO = 'N'
            INTO :CANT, :MONTO;
        if (CANT IS NULL) then
            CANT = 0;
        if (MONTO IS NULL) then
            MONTO = 0;
        SELECT SUM(DVDE_CANT), SUM(DVDE_TOTAL-DVDE_CONSUMO) FROM DEVOLUCIONES_VENTAS F, DEVOLUCIONES_VENTAS_DETALLE D, CLIENTES C
            WHERE F.DEVT_ID = D.DEVT_ID AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND
                D.ARTI_COD = :ARTICULO AND F.TERC_NIT = C.TERC_NIT AND C.ZONA_COD <> '01' AND devT_ANULADO = 'N'
            INTO :DEVCNT, :DEVMONTO;    
        if (DEVCNT IS NULL) then
            DEVCNT = 0;
        if (DEVMONTO IS NULL) then
            DEVMONTO = 0;
        CANT = CANT - DEVCNT;
        MONTO = MONTO - DEVMONTO;
        SUSPEND;
        END
end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER PROCEDURE VENTAS_CLIENTE(
    NIT VARCHAR(20),
    FECINI DATE,
    FECFIN DATE,
    SUBEMPRESA INTEGER)
RETURNS (
    FACTURAS INTEGER,
    MFACTURAS NUMERIC(18,2),
    DEVOLUCIONES INTEGER,
    MDEVOLUCIONES NUMERIC(18,2),
    IVAFACT NUMERIC(18,2),
    IVADEV NUMERIC(18,2),
    CONSUMOF NUMERIC(18,2),
    CONSUMOD NUMERIC(18,2))
AS
BEGIN
  SELECT COUNT(*), SUM(FACT_TOTAL-FACT_IVAMONTO), SUM(FACT_IVAMONTO)
    FROM FACTURAS F, PREFIJOS P
    WHERE TERC_NIT = :NIT AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND FACT_ANULADO = 'N'
     AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
    INTO :FACTURAS, :MFACTURAS, :IVAFACT;
  SELECT COUNT(*), SUM(DEVT_TOTAL-DEVT_IVAMONTO), SUM(DEVT_IVAMONTO)
    FROM devoluciones_ventas F, PREFIJOS P
    WHERE TERC_NIT = :NIT AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND DEVT_ANULADO = 'N'
     AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 33 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) and ((devt_remid is null) or (DEVT_REMID = 0))
    INTO :DEVOLUCIONES, :MDEVOLUCIONES, :IVADEV;
  if (MFACTURAS IS NULL) then
    MFACTURAS = 0;
  if (MDEVOLUCIONES IS NULL) then
    MDEVOLUCIONES = 0;
  if (IVAFACT IS NULL) then
    IVAFACT = 0;
  if (IVADEV IS NULL) then
    IVADEV = 0;
  select sum(fade_consumo) from facturas_detalle d, facturas f, PREFIJOS P
    where d.fact_id = f.fact_id and TERC_NIT = :NIT AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND FACT_ANULADO = 'N'
     AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) and substring(d.arti_cod from 1 FOR 2) <> '.t'
    into :consumof;
    if (consumof is null) then
        consumof = 0;
    mfacturas = mfacturas - consumof;
  select sum(dvde_consumo) from devoluciones_ventas_detalle d, devoluciones_ventas f, PREFIJOS P
    where d.devt_id = f.devt_id and TERC_NIT = :NIT AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND DEVT_ANULADO = 'N'
     AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 33 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) and  ((devt_remid is null) or (DEVT_REMID = 0)) and substring(d.arti_cod from 1 FOR 2) <> '.t'
    into :consumod;
    if (consumod is null) then
        consumod = 0;
    mdevoluciones = mdevoluciones - consumod;
  SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE VENTAS_CLIENTE_MES(
    FECINI DATE,
    FECFIN DATE,
    SUBEMPRESA INTEGER)
RETURNS (
    NIT VARCHAR(20),
    NOMBRE VARCHAR(60),
    FACTURAS INTEGER,
    MFACTURAS NUMERIC(18,2),
    DEVOLUCIONES INTEGER,
    MDEVOLUCIONES NUMERIC(18,2),
    IVAFACT NUMERIC(18,2),
    IVADEV NUMERIC(18,2),
    CONSUMOF NUMERIC(18,2),
    CONSUMOD NUMERIC(18,2))
AS
BEGIN /*$$IBE$$ 
  for select TERC_NIT, TERC_NOM from TERCEROS WHERE TERC_CLIE = 'S' into :NIT, :NOMBRE
  DO
    BEGIN
    EXECUTE PROCEDURE VENTAS_CLIENTE (NIT, FECINI, FECFIN, SUBEMPRESA) returning_values (FACTURAS, MFACTURAS, DEVOLUCIONES, MDEVOLUCIONES, IVAFACT, IVADEV, CONSUMOF, CONSUMOD);
    SUSPEND;
    END
 $$IBE$$*/ SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE VENTAS_CLIENTE_MES(
    FECINI DATE,
    FECFIN DATE,
    SUBEMPRESA INTEGER)
RETURNS (
    NIT VARCHAR(20),
    NOMBRE VARCHAR(60),
    FACTURAS INTEGER,
    MFACTURAS NUMERIC(18,2),
    DEVOLUCIONES INTEGER,
    MDEVOLUCIONES NUMERIC(18,2),
    IVAFACT NUMERIC(18,2),
    IVADEV NUMERIC(18,2),
    CONSUMOF NUMERIC(18,2),
    CONSUMOD NUMERIC(18,2))
AS
BEGIN
  for select TERC_NIT, TERC_NOM from TERCEROS WHERE TERC_CLIE = 'S' into :NIT, :NOMBRE
  DO
    BEGIN
    EXECUTE PROCEDURE VENTAS_CLIENTE (NIT, FECINI, FECFIN, SUBEMPRESA) returning_values (FACTURAS, MFACTURAS, DEVOLUCIONES, MDEVOLUCIONES, IVAFACT, IVADEV, CONSUMOF, CONSUMOD);
    SUSPEND;
    END
END

^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER PROCEDURE VENTAS_CLIENTE_VENDEDOR(
    CODVEND INTEGER,
    FECINI DATE,
    FECFIN DATE,
    SUBEMPRESA INTEGER)
RETURNS (
    NIT VARCHAR(20),
    NOMBRE VARCHAR(60),
    FACTURAS INTEGER,
    MFACTURAS NUMERIC(18,2),
    DEVOLUCIONES INTEGER,
    MDEVOLUCIONES NUMERIC(18,2),
    TFACTURAS NUMERIC(18,2),
    TDEVOLUCIONES NUMERIC(18,2))
AS
declare variable CONSUMOF NUMERIC(18,2);
declare variable CONSUMOD NUMERIC(18,2);
BEGIN
FOR SELECT MAX(TERC_NIT), MAX(FACT_NOMCLIENTE), COUNT(*), SUM(FACT_TOTAL-FACT_IVAMONTO), SUM(FACT_TOTAL)
    FROM FACTURAS F, PREFIJOS P WHERE VEND_COD = :CODVEND AND FACT_FECHA >= :FECINI AND FACT_FECHA < :FECFIN
    AND FACT_ANULADO = 'N' AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
    GROUP BY TERC_NIT ORDER BY TERC_NIT INTO :NIT, :NOMBRE, :FACTURAS, :MFACTURAS, :TFACTURAS
    do
    BEGIN
    SELECT COUNT(*), SUM(DEVT_TOTAL-DEVT_IVAMONTO), SUM(DEVT_TOTAL)
    FROM devoluciones_ventas F, PREFIJOS P WHERE VEND_COD = :CODVEND AND TERC_NIT = :NIT AND DEVT_FECHA >= :FECINI AND DEVT_FECHA < :FECFIN  AND DEVT_ANULADO = 'N'
       AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 33 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
      INTO :DEVOLUCIONES, :MDEVOLUCIONES, :TDEVOLUCIONES;
    if (MFACTURAS IS NULL) then
        MFACTURAS = 0;
    if (MDEVOLUCIONES IS NULL) then
        MDEVOLUCIONES = 0;
    if (TFACTURAS IS NULL) then
        TFACTURAS = 0;
    if (TDEVOLUCIONES IS NULL) then
        TDEVOLUCIONES = 0;
    select sum(fade_consumo) from facturas_detalle d, facturas f, PREFIJOS P
        where d.fact_id = f.fact_id and VEND_COD = :CODVEND AND TERC_NIT = :NIT AND FACT_FECHA >= :FECINI AND FACT_FECHA < :FECFIN AND FACT_ANULADO = 'N'
        AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) and substring(d.arti_cod from 1 FOR 2) <> '.t'
        into :consumof;
    if (consumof is null) then
        consumof = 0;
    mfacturas = mfacturas - consumof;
    select sum(dvde_consumo) from devoluciones_ventas_detalle d, devoluciones_ventas f, PREFIJOS P
        where d.devt_id = f.devt_id and VEND_COD = :CODVEND AND TERC_NIT = :NIT AND DEVT_FECHA >= :FECINI AND DEVT_FECHA < :FECFIN AND DEVT_ANULADO = 'N'
        AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 33 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) and substring(d.arti_cod from 1 FOR 2) <> '.t'
        into :consumod;
    if (consumod is null) then
        consumod = 0;
    mdevoluciones = mdevoluciones - consumod;
    SUSPEND;
    END
end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER PROCEDURE VENTAS_VENDEDOR(
    CODVEND INTEGER,
    FECINI DATE,
    FECFIN DATE,
    SUBEMPRESA INTEGER)
RETURNS (
    FACTURAS INTEGER,
    MFACTURAS NUMERIC(18,2),
    DEVOLUCIONES INTEGER,
    MDEVOLUCIONES NUMERIC(18,2),
    IVAFACT NUMERIC(18,2),
    IVADEV NUMERIC(18,2),
    CONSUMOF NUMERIC(18,2),
    CONSUMOD NUMERIC(18,2))
AS
BEGIN
  SELECT COUNT(*), SUM(FACT_TOTAL-FACT_IVAMONTO), SUM(FACT_IVAMONTO)
    FROM FACTURAS F, PREFIJOS P
      WHERE VEND_COD = :CODVEND AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND FACT_ANULADO = 'N'
       AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
      INTO :FACTURAS, :MFACTURAS, :IVAFACT;
  SELECT COUNT(*), SUM(DEVT_TOTAL-DEVT_IVAMONTO), SUM(DEVT_IVAMONTO)
    FROM devoluciones_ventas F, PREFIJOS P
      WHERE VEND_COD = :CODVEND AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN  AND DEVT_ANULADO = 'N'
       AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 33 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) and ((devt_remid is null) or (DEVT_REMID = 0))
      INTO :DEVOLUCIONES, :MDEVOLUCIONES, :IVADEV;
  if (MFACTURAS IS NULL) then
    MFACTURAS = 0;
  if (MDEVOLUCIONES IS NULL) then
    MDEVOLUCIONES = 0;
  if (IVAFACT IS NULL) then
    IVAFACT = 0;
  if (IVADEV IS NULL) then
    IVADEV = 0;
  select sum(fade_consumo) from facturas_detalle d, facturas f, PREFIJOS P
    where d.fact_id = f.fact_id and VEND_COD = :CODVEND AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND FACT_ANULADO = 'N'
     AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) and substring(d.arti_cod from 1 FOR 2) <> '.t'
    into :consumof;
    if (consumof is null) then
        consumof = 0;
    mfacturas = mfacturas - consumof;
  select sum(dvde_consumo) from devoluciones_ventas_detalle d, devoluciones_ventas f, PREFIJOS P
    where d.devt_id = f.devt_id and VEND_COD = :CODVEND AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND DEVT_ANULADO = 'N'
     AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 33 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) and ((devt_remid is null) or (DEVT_REMID = 0)) and substring(d.arti_cod from 1 FOR 2) <> '.t'
    into :consumod;
    if (consumod is null) then
        consumod = 0;
    mdevoluciones = mdevoluciones - consumod;
  SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE VENTAS_VENDEDOR_MES(
    FECINI DATE,
    FECFIN DATE,
    SUBEMPRESA INTEGER)
RETURNS (
    CODIGO INTEGER,
    NOMBRE VARCHAR(60),
    FACTURAS INTEGER,
    MFACTURAS NUMERIC(18,2),
    DEVOLUCIONES INTEGER,
    MDEVOLUCIONES NUMERIC(18,2),
    IVAFACT NUMERIC(18,2),
    IVADEV NUMERIC(18,2),
    CONSUMOF NUMERIC(18,2),
    CONSUMOD NUMERIC(18,2))
AS
BEGIN /*$$IBE$$ 
  for select VEND_COD, VEND_NOMBRE from VENDEDORES into :CODIGO, :NOMBRE
  DO
    BEGIN
    EXECUTE PROCEDURE VENTAS_VENDEDOR (CODIGO, FECINI, FECFIN, SUBEMPRESA) returning_values (FACTURAS, MFACTURAS, DEVOLUCIONES, MDEVOLUCIONES, IVAFACT, IVADEV, CONSUMOF, CONSUMOD);
    SUSPEND;
    END
 $$IBE$$*/ SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE VENTAS_VENDEDOR_MES(
    FECINI DATE,
    FECFIN DATE,
    SUBEMPRESA INTEGER)
RETURNS (
    CODIGO INTEGER,
    NOMBRE VARCHAR(60),
    FACTURAS INTEGER,
    MFACTURAS NUMERIC(18,2),
    DEVOLUCIONES INTEGER,
    MDEVOLUCIONES NUMERIC(18,2),
    IVAFACT NUMERIC(18,2),
    IVADEV NUMERIC(18,2),
    CONSUMOF NUMERIC(18,2),
    CONSUMOD NUMERIC(18,2))
AS
BEGIN
  for select VEND_COD, VEND_NOMBRE from VENDEDORES into :CODIGO, :NOMBRE
  DO
    BEGIN
    EXECUTE PROCEDURE VENTAS_VENDEDOR (CODIGO, FECINI, FECFIN, SUBEMPRESA) returning_values (FACTURAS, MFACTURAS, DEVOLUCIONES, MDEVOLUCIONES, IVAFACT, IVADEV, CONSUMOF, CONSUMOD);
    SUSPEND;
    END
END

^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER PROCEDURE IMPR_FACTURA(
    ID INTEGER)
RETURNS (
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    VENCE DATE,
    DIASVENCE INTEGER,
    CONTCRED CHAR(17),
    NIT VARCHAR(20),
    NOMTERCERO VARCHAR(60),
    NOMCLIENTE VARCHAR(60),
    VENDEDOR INTEGER,
    NOMVENDEDOR VARCHAR(60),
    PUNTOVTA INTEGER,
    NOMPUNTOVTA VARCHAR(30),
    CODBODEGA VARCHAR(2),
    NOMBODEGA VARCHAR(30),
    AUTORIZACION VARCHAR(20),
    DESPACHO VARCHAR(255),
    TRANSPORTADOR VARCHAR(60),
    COTIZACION VARCHAR(30),
    PEDIDO VARCHAR(30),
    REMISION VARCHAR(30),
    PACIENTE VARCHAR(20),
    NOMPACIENTE VARCHAR(60),
    COMIPORC NUMERIC(9,2),
    COMIMONTO NUMERIC(18,2),
    SUBTOTAL NUMERIC(18,2),
    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),
    EXTRA NUMERIC(18,2),
    DTOFPORC NUMERIC(9,2),
    DTOFMONTO NUMERIC(18,2),
    FECHADTO DATE,
    TOTALFAC NUMERIC(18,2),
    TOTALPAGAR NUMERIC(18,2),
    OBS BLOB SUB_TYPE 1 SEGMENT SIZE 80,
    ITEM INTEGER,
    ARTICULO VARCHAR(15),
    CODBAR VARCHAR(15),
    ARTIDES VARCHAR(60),
    DESCORTA VARCHAR(30),
    CANT NUMERIC(18,4),
    LOTE VARCHAR(15),
    VLOTE DATE,
    UNIDAD VARCHAR(8),
    CAJAS NUMERIC(18,4),
    FACTOR INTEGER,
    LISTAPR INTEGER,
    REFITEM VARCHAR(60),
    BODITEM VARCHAR(2),
    PRUNIT NUMERIC(18,2),
    DTOITPORC NUMERIC(9,2),
    DTOITMONTO NUMERIC(18,2),
    PRNETO NUMERIC(18,2),
    IVAPORC NUMERIC(9,2),
    IVAITMONTO NUMERIC(18,2),
    CONSUMO NUMERIC(18,2),
    SUBTOTIT NUMERIC(18,2),
    SUBTOTITCON NUMERIC(18,2),
    DTOIT1 NUMERIC(9,2),
    DTOIT2 NUMERIC(9,2),
    DTOIT3 NUMERIC(9,2),
    TOTAL NUMERIC(18,2),
    CODIGOCL VARCHAR(20),
    ZONACOD VARCHAR(2),
    ZONANOM VARCHAR(60),
    DV CHAR(1),
    DIRECCION VARCHAR(60),
    CIUDAD VARCHAR(40),
    TELEFONO VARCHAR(40),
    CONTACTO VARCHAR(60),
    FAX VARCHAR(25),
    GRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    SUBGRUPO VARCHAR(3),
    NOMSUBG VARCHAR(30),
    MARCA VARCHAR(3),
    NOMMARCA VARCHAR(30),
    PESO NUMERIC(18,4),
    ANCHO NUMERIC(18,4),
    ALTO NUMERIC(18,4),
    LARGO NUMERIC(18,4),
    SUMA1 NUMERIC(18,2),
    SUMA2 NUMERIC(18,2),
    SUMA3 NUMERIC(18,2),
    IVA1 NUMERIC(18,2),
    IVA2 NUMERIC(18,2),
    IVA3 NUMERIC(18,2),
    SUMAEX NUMERIC(18,2),
    SUMAGR NUMERIC(18,2),
    TOTCONSUMO NUMERIC(18,2),
    DTOIT1M NUMERIC(18,2),
    DTOIT2M NUMERIC(18,2),
    DTOIT3M NUMERIC(18,2),
    TOTCAJAS NUMERIC(18,2),
    VEHICULO VARCHAR(8),
    RECIBIDO NUMERIC(18,2),
    CAMBIO NUMERIC(18,2),
    HORA TIME,
    FORMAPAGO1 VARCHAR(30),
    MONTOPAGO1 NUMERIC(18,2),
    FORMAPAGO2 VARCHAR(30),
    MONTOPAGO2 NUMERIC(18,2),
    FORMAPAGO3 VARCHAR(30),
    MONTOPAGO3 NUMERIC(18,2),
    PUNTOS INTEGER,
    PUNTOSACUM INTEGER,
    PUNTOSVENC INTEGER,
    FECPTOS DATE,
    OBSITEM BLOB SUB_TYPE 1 SEGMENT SIZE 80,
    SUCUR VARCHAR(10))
AS
DECLARE VARIABLE IMPTOS CHAR(1);
DECLARE VARIABLE TARIFA INTEGER;
declare variable DEVUELTO NUMERIC(18,2);
/*DECLARE VARIABLE NROCOPIA INTEGER;*/
declare variable ORDENCOD CHAR(2);
declare variable IMPRDEV CHAR(2);
declare variable IMPR CHAR(1);
declare variable ITEMFP INTEGER;
declare variable FORMAP VARCHAR(30);
declare variable MONTOP NUMERIC(18,2);
BEGIN
  SELECT F.PREF_PRE, FACT_NUMERO, FACT_FECHA, FACT_VENCE, F.BODE_COD, BODE_NOM, F.TERC_NIT, FACT_NOMCLIENTE, F.VEND_COD, VEND_NOMBRE, F.PTVT_ID, PTVT_NOM,
    AUTO_NUMERO, FACT_DESPACHO, FACT_TRANSP, FACT_COTIZACI, FACT_PEDIDO, FACT_REMISION, FACT_COMIPORC, FACT_COMIMONTO, FACT_IVAINC, 
    FACT_DTOPOR, FACT_DTOMONTO, FACT_ADICIONAL, FACT_IVAMONTO, FACT_RTFTEPOR, FACT_RTFTEMONTO, FACT_RTIVAPOR, FACT_RTIVAMONTO, FACT_RTICAPOR, FACT_RTICAMONTO, FACT_EXTRA, FACT_DTOFPOR, FACT_DTOFMONTO, FACT_DTOFFECHA, FACT_TOTAL,
    TERC_DIR, TERC_CIU, TERC_TEL, TERC_CONTACTO, TERC_FAX, TERC_DV, FACT_DTOIT1, FACT_DTOIT2, FACT_DTOIT3,
    FACT_OBS, VEHI_COD, /*FACT_NROCOPIA,*/ FACT_RECIBIDO, FACT_SUCURSAL, FACT_DETCLI, FACT_DETCLINOM, TERC_NOM
    FROM FACTURAS F, BODEGA B, VENDEDORES V, PUNTO_VENTA P, TERCEROS T
    WHERE F.BODE_COD = B.BODE_COD AND F.VEND_COD = V.VEND_COD AND F.PTVT_ID = P.PTVT_ID AND F.TERC_NIT = T.TERC_NIT AND F.FACT_ID = :ID
    into :PREF, :NUMERO, :FECHA, :VENCE, :CODBODEGA, :NOMBODEGA, :NIT, :NOMTERCERO, :VENDEDOR, :NOMVENDEDOR, :PUNTOVTA, :NOMPUNTOVTA,
    :AUTORIZACION, :DESPACHO, :TRANSPORTADOR, :COTIZACION, :PEDIDO, :REMISION, :COMIPORC, :COMIMONTO, :IMPTOS,
    :DTOPORC, :DTOMONTO, :ADICIONAL, :IVAMONTO, :RTEFTEPORC, :RTEFTEMONTO, :RTEIVAPORC, :RTEIVAMONTO, :RTEICAPORC, :RTEICAMONTO, :EXTRA, :DTOFPORC, :DTOFMONTO, :FECHADTO, :TOTALFAC,
    :DIRECCION, :CIUDAD, :TELEFONO, :CONTACTO, :FAX, :DV, :dtoit1m, :dtoit2m, :dtoit3m,
    :OBS, :VEHICULO,/* :NROCOPIA,*/ :RECIBIDO, :SUCUR, :paciente, :nompaciente, :nomcliente;

  /* ACUMULE LOS PUNTOS, SE HACE ACA POR SER POSTERIOR AL DETALLE */
  EXECUTE PROCEDURE acumula_puntos_cliente (31, :id, :nit, :fecha) returning_values (:PUNTOS);
  EXECUTE PROCEDURE consulta_puntos_cliente (:id, :nit, :fecha) returning_values (:puntos, :puntosacum, :puntosvenc, :fecptos);

  SELECT CLIE_COD, C.ZONA_COD, ZONA_NOM
    FROM CLIENTES C, ZONAS Z
    WHERE TERC_NIT = :NIT AND C.ZONA_COD = Z.ZONA_COD
    INTO :CODIGOCL, :ZONACOD, :ZONANOM;
  /*SELECT NOCO_NOMBRE FROM NOMBRES_COPIAS where NOCO_ID = :NROCOPIA INTO :NOMCOPIA;*/
  SELECT CLSU_DIR, CLSU_CIUDAD, CLSU_TEL FROM CLIENTE_SUCURSALES WHERE TERC_NIT = :NIT AND CLCU_COD = :SUCUR
    INTO :DIRECCION, :CIUDAD, :TELEFONO;
  /*if (NOMCOPIA IS NULL) then
    NOMCOPIA = 'COPIA No. ' || NROCOPIA;**/
  DIASVENCE = VENCE - FECHA;
  if (DIASVENCE > 0) then
    CONTCRED = 'CREDITO ' || CAST(DIASVENCE AS VARCHAR(3)) || ' DIAS';
  ELSE
    CONTCRED = 'CONTADO';
  SUBTOTAL = TOTALFAC - EXTRA - IVAMONTO - ADICIONAL + DTOMONTO;
  TOTALPAGAR = TOTALFAC - RTEFTEMONTO - RTEIVAMONTO - RTEICAMONTO;
  if (RECIBIDO <> 0) then
      CAMBIO = RECIBIDO - totalpagar;
  ELSE
    CAMBIO = 0;
  SUMAEX = 0;
  SUMA1 = 0;
  SUMA2 = 0;
  SUMA3 = 0;
  IVA1 = 0;
  IVA2 = 0;
  IVA3 = 0;
  TOTCONSUMO = 0;
  MONTOPAGO1 = 0;
  SELECT MAX(AUDI_HORA) FROM AUDITORIA WHERE TIDO_COD = 31 AND AUDI_IDDOC = :ID AND AUDI_OPER = 'I' INTO :HORA;
  /* AHORA LAS FORMAS DE PAGO, BUSQUE EL ABONO DE HOY A LA FACTURA */
  ITEMFP = 1;
  MONTOPAGO1 = 0;
  MONTOPAGO2 = 0;
  MONTOPAGO3 = 0;
  FOR SELECT FOPA_NOM, RCPA_MONTO FROM RECIBOS_CAJA_PAGO P, FORMAS_PAGO F, RECIBOS_CAJA R, RECIBOS_CAJA_DETALLE D
    WHERE R.RECA_ID = P.RECA_ID AND R.RECA_ID = D.RECA_ID AND P.FOPA_ID = F.FOPA_ID AND RECA_FECHA = :FECHA AND RCDE_TIPODOC = 31 AND RCDE_IDDOC = :ID
    INTO :formap, :MONTOP
    DO
    BEGIN
    if (ITEMFP = 1) then
        BEGIN
        FORMAPAGO1 = FORMAP;
        MONTOPAGO1 = MONTOP;
        END
    if (ITEMFP = 2) then
        BEGIN
        FORMAPAGO2 = FORMAP;
        MONTOPAGO2 = MONTOP;
        END
    if (ITEMFP = 3) then
        BEGIN
        FORMAPAGO3 = FORMAP;
        MONTOPAGO3 = MONTOP;
        END
    ITEMFP = ITEMFP + 1;
    END
  EXECUTE PROCEDURE lee_configuracion ('FACTURACION','DOCUMENTOS','ORDENAR ITEMS POR CODIGO DE ARTICULO') returning_values (:ORDENCOD);
  EXECUTE PROCEDURE lee_configuracion ('FACTURACION','POS', 'IMPRIMIR DEVOLUCIONES DE ARTICULOS NEGATIVOS') returning_values (:imprdev);
  totcajas = 0;
  if (ORDENCOD = 'SI') then
    BEGIN
    FOR SELECT FADE_ITEM, D.ARTI_COD, FADE_CODBAR, SUBSTR(FADE_DESC,1,60), ARTI_DESCORTA, FADE_CANT, FADE_UNIDAD, FADE_FACTOR, BODE_COD, FADE_LOTE, LIPR_COD, FADE_PRUNIT, FADE_DTOPORC, FADE_DTOMONTO, FADE_IVAPORC, FADE_IVAMONTO, FADE_CONSUMO, FADE_TOTAL, FADE_REFERENCIA,
        GRUP_COD, SUBG_COD, MARC_COD, ARTI_PESO, ARTI_ANCHO, ARTI_ALTO, ARTI_LARGO, TAIV_COD, FADE_DEVUELTO, FADE_OBS, FADE_DTO1, FADE_DTO2, FADE_DTO3, FADE_CAJAS
        FROM FACTURAS_DETALLE D, ARTICULO A
        WHERE D.ARTI_COD = A.ARTI_COD AND D.FACT_ID = :ID
        ORDER BY D.ARTI_COD
        INTO :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :DESCORTA, :CANT, :UNIDAD, :FACTOR, :BODITEM, :LOTE, :LISTAPR, :PRUNIT, :DTOITPORC, :DTOITMONTO, :IVAPORC, :IVAITMONTO, :CONSUMO, :TOTAL, :refitem,
        :GRUPO, :SUBGRUPO, :MARCA, :PESO, :ANCHO, :ALTO, :LARGO, :TARIFA, :devuelto, :obsitem, :dtoit1, :dtoit2, :dtoit3, :cajas
        DO
          BEGIN
          if (ARTICULO = CODBAR) then
            SELECT FIRST 1 COBA_COD FROM barras_articulo WHERE ARTI_COD = :articulo INTO :CODBAR;
          if (IMPRDEV <> 'SI') then
            BEGIN
            if ((CANT >= 0) AND (DEVUELTO = 0)) then
                IMPR = 'S';
            ELSE
                IMPR = 'N'; /* ES DEVOLUCION */
            END
          ELSE
            IMPR = 'S';
          if (IMPR = 'S') then
            BEGIN
            if (IMPTOS = 'S') then
                if (cant <> 0) then
                    PRNETO = PRUNIT - DTOITMONTO - ((IVAITMONTO+CONSUMO) / CANT);
                else
                    PRNETO = PRUNIT - DTOITMONTO;
            ELSE
                PRNETO = PRUNIT - DTOITMONTO;
            SUBTOTIT = TOTAL - IVAITMONTO - CONSUMO;
            SUBTOTITCON = TOTAL;
            TOTCONSUMO = TOTCONSUMO + CONSUMO;
            SELECT LOTE_VENCE FROM LOTES WHERE LOTE_NRO = :lote AND ARTI_COD = :ARTICULO AND BODE_COD = :boditem INTO :vlote;
            if ((REFITEM <> '.t') or (REFITEM IS NULL)) then
                BEGIN
                /* NO SUME LOS ENSAMBLES */
                if (IVAPORC = 0) then
                    SUMAEX = SUMAEX + TOTAL;
                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;
                END
            if (IMPTOS = 'N') then
                TOTAL = TOTAL - IVAITMONTO - CONSUMO;
            if (ANCHO IS NULL) then
                ANCHO = 0;
            if (ALTO IS NULL) then
                ALTO = 0;
            if (LARGO IS NULL) then
                LARGO = 0;
            if (PESO IS NULL) then
                PESO = 0;
            PESO = PESO * CANT;
            totcajas = totcajas + cajas;
            if (substr(ARTICULO,1,2) = '.t') then
                BEGIN
                REFITEM = '';
                TOTAL = 0;
                SUBTOTIT = 0;
                SUBTOTITCON = 0;
                END
            SUSPEND;
            END
          END
    END
ELSE
    BEGIN
    FOR SELECT FADE_ITEM, D.ARTI_COD, FADE_CODBAR, SUBSTR(FADE_DESC,1,60), ARTI_DESCORTA, FADE_CANT, FADE_UNIDAD, FADE_FACTOR, BODE_COD, FADE_LOTE, LIPR_COD, FADE_PRUNIT, FADE_DTOPORC, FADE_DTOMONTO, FADE_IVAPORC, FADE_IVAMONTO, FADE_CONSUMO, FADE_TOTAL, FADE_REFERENCIA,
        GRUP_COD, SUBG_COD, MARC_COD, ARTI_PESO, ARTI_ANCHO, ARTI_ALTO, ARTI_LARGO, TAIV_COD, FADE_DEVUELTO, FADE_OBS, FADE_DTO1, FADE_DTO2, FADE_DTO3, FADE_CAJAS
        FROM FACTURAS_DETALLE D, ARTICULO A
        WHERE D.ARTI_COD = A.ARTI_COD AND D.FACT_ID = :ID
        ORDER BY FADE_ITEM
        INTO :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :DESCORTA, :CANT, :UNIDAD, :FACTOR, :BODITEM, :LOTE, :LISTAPR, :PRUNIT, :DTOITPORC, :DTOITMONTO, :IVAPORC, :IVAITMONTO, :CONSUMO, :TOTAL, :refitem,
        :GRUPO, :SUBGRUPO, :MARCA, :PESO, :ANCHO, :ALTO, :LARGO, :TARIFA, :devuelto, :obsitem, :dtoit1, :dtoit2, :dtoit3, :cajas
        DO
          BEGIN
          if (IMPRDEV <> 'SI') then
            BEGIN
            if ((CANT >= 0) AND (DEVUELTO = 0)) then
                IMPR = 'S';
            ELSE
                IMPR = 'N'; /* ES DEVOLUCION */
            END
          ELSE
            IMPR = 'S';
          if (IMPR = 'S') then
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :GRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :MARCA INTO NOMMARCA;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :SUBGRUPO AND GRUP_COD = :GRUPO INTO :NOMSUBG;
            if (IMPTOS = 'S') then
              if (CANT <> 0) then
                  PRNETO = PRUNIT - DTOITMONTO - ((IVAITMONTO+CONSUMO) / CANT);
            ELSE
              PRNETO = PRUNIT - DTOITMONTO;
            SUBTOTIT = TOTAL - IVAITMONTO - CONSUMO;
            SUBTOTITCON = TOTAL;
            TOTCONSUMO = TOTCONSUMO + CONSUMO;
            SELECT LOTE_VENCE FROM LOTES WHERE LOTE_NRO = :lote AND ARTI_COD = :ARTICULO AND BODE_COD = :boditem INTO :vlote;
            if ((REFITEM <> '.t') or (REFITEM IS NULL)) then
                BEGIN
                /* NO SUME LOS ENSAMBLES */
                if (IVAPORC = 0) then
                    SUMAEX = SUMAEX + TOTAL;
                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;
                END
            if (IMPTOS = 'N') then
                TOTAL = TOTAL - IVAITMONTO - CONSUMO;
            if (ANCHO IS NULL) then
                ANCHO = 0;
            if (ALTO IS NULL) then
                ALTO = 0;
            if (LARGO IS NULL) then
                LARGO = 0;
            if (PESO IS NULL) then
                PESO = 0;
            PESO = PESO * CANT;
            totcajas = totcajas + cajas;
            if (substr(ARTICULO,1,2) = '.t') then
                BEGIN
                REFITEM = '';
                TOTAL = 0;
                SUBTOTIT = 0;
                SUBTOTITCON = 0;
                END
            SUSPEND;
            END
          END
    END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER PROCEDURE CONTABIL_FACTURA(
    IDDOC INTEGER,
    IDINTER INTEGER)
RETURNS (
    ERROR INTEGER,
    VER CHAR(1),
    IDC INTEGER)
AS
declare variable pref varchar(4);
declare variable num varchar(6);
declare variable numero varchar(10);
declare variable fecaux date;
declare variable fecha char(8);
declare variable conc varchar(60);
declare variable venceaux date;
declare variable vence char(8);
declare variable vrdto numeric(18,2);
declare variable vradic numeric(18,2);
declare variable vrsubt numeric(18,2);
declare variable vriva numeric(18,2);
declare variable prtfte numeric(9,2);
declare variable vrrtfte numeric(18,2);
declare variable vrrtiva numeric(18,2);
declare variable prtica numeric(9,2);
declare variable vrrtica numeric(18,2);
declare variable vrtotal numeric(18,2);
declare variable vrextra numeric(18,2);
declare variable tipocomp varchar(3);
declare variable prefcont varchar(4);
declare variable ventas char(1);
declare variable ctaventas varchar(20);
declare variable iva char(1);
declare variable ctaiva varchar(20);
declare variable consumo char(1);
declare variable ctaconsumo varchar(20);
declare variable cartera char(1);
declare variable ctacartera varchar(20);
declare variable rtfte char(1);
declare variable ctartfte varchar(20);
declare variable rtiva char(1);
declare variable ctartiva varchar(20);
declare variable rtica char(1);
declare variable ctartica varchar(20);
declare variable inven char(1);
declare variable ctainven varchar(20);
declare variable costos char(1);
declare variable ctacostos varchar(20);
declare variable ctadto varchar(20);
declare variable ctaadic varchar(20);
declare variable ctaextra varchar(20);
declare variable existe char(1);
declare variable cuenta varchar(20);
declare variable monto numeric(18,2);
declare variable tipocuen char(1);
declare variable nit varchar(20);
declare variable nombre varchar(60);
declare variable proy varchar(4);
declare variable centro varchar(4);
declare variable porc numeric(5,2);
declare variable debito numeric(18,2);
declare variable credito numeric(18,2);
declare variable nroi integer;
declare variable art varchar(15);
declare variable imptos numeric(18,2);
declare variable suma numeric(18,2);
declare variable porciva numeric(9,2);
declare variable tctaclien varchar(20);
declare variable tctaventa varchar(20);
declare variable tctartfte varchar(20);
declare variable tctartiva varchar(20);
declare variable tctartica varchar(20);
declare variable ctadic varchar(20);
declare variable baseadic varchar(20);
declare variable porcadic numeric(5,2);
declare variable valoradic numeric(18,2);
declare variable dbadic char(1);
declare variable ptovta integer;
declare variable anulado char(1);
declare variable dig integer;
declare variable mercancia numeric(18,2);
declare variable fomento varchar(2);
declare variable DTOXIT varchar(2);
declare variable vrconsumo numeric(18,2);
declare variable factor double precision;
declare variable cent char(1);
declare variable AUTORET VARCHAR(10);
declare variable FAUTORET DATE;
declare variable ERRORC INTEGER;
BEGIN
EXECUTE PROCEDURE LEE_CONFIGURACION('COMPRAS', 'FACTURAS', 'USAR IMPOCONSUMO COMO PORCENTAJE DE FOMENTO') returning_values (FOMENTO);
EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'FECHA AUTORETENEDOR NO DESCONTAR RETENCIONES DEL SALDO PERO SI CONTABILIZARLAS') returning_values (AUTORET);
if (AUTORET <> '') then
    FAUTORET = CAST(AUTORET AS DATE);
else
    FAUTORET = '9999/12/31';
/* BUSQUE LA INTERFACE */
EXISTE = 'N';
SELECT 'S', TICO_COD, PRCO_PRE, INVE_VENTAS, INVE_IVA, INVE_CONSUMO, INVE_CARTERA, INVE_RTFTE, INVE_RTIVA, INVE_RTICA, INVE_COSTO, INVE_INVEN, INVE_CTAVENTAS, INVE_CTAIVA, INVE_CTACONSUMO, INVE_CTADTO, INVE_CTAADIC, INVE_CTAEXTRA, INVE_CTACARTERA, INVE_CTARTFTE, INVE_CTARTIVA, INVE_CTARTICA, INVE_CTAINVEN, INVE_CTACOSTOS, INVE_CONFIRMAR, INVE_CENTRO
    FROM INTERFAZ_VENTAS
    WHERE INVE_ID = :IDINTER
    INTO :EXISTE, :TIPOCOMP, :PREFCONT, :VENTAS, :IVA, :CONSUMO, :CARTERA, :RTFTE, :RTIVA, :RTICA, :COSTOS, :INVEN, :CTAVENTAS, :CTAIVA, :CTACONSUMO, :CTADTO, :CTAADIC, :CTAEXTRA, :CTACARTERA, :CTARTFTE, :CTARTIVA, :CTARTICA, :CTAINVEN, :CTACOSTOS, :VER, :CENT;
if (EXISTE = 'S') then
  BEGIN
    /* BORRE CUALQUEIR CONTABILIZACION PREVIA */
    DELETE FROM CONTABILIZACION WHERE CNTB_TIPOREF = 31 AND CNTB_IDREF = :IDDOC;

  /* TRAIGA EL ENCABEZADO DE LA FACTURA */
  SELECT PREF_PRE, FACT_NUMERO, FACT_FECHA, F.TERC_NIT, PTVT_ID, FACT_VENCE, FACT_DTOMONTO, FACT_ADICIONAL, FACT_IVAMONTO, FACT_EXTRA, FACT_TOTAL, FACT_RTFTEPOR, FACT_RTFTEMONTO, FACT_RTIVAPOR, FACT_RTIVAMONTO, FACT_RTICAPOR, FACT_RTICAMONTO, FACT_NOMCLIENTE, TERC_CTARTFTE, TERC_CTARTIVA, TERC_CTARTICA, TERC_CTAVENTA, TERC_CTACLIENTE, FACT_ANULADO
        FROM FACTURAS F, TERCEROS T
        WHERE FACT_ID = :IDDOC AND F.TERC_NIT = T.TERC_NIT
        INTO :PREF, :NUM, :FECAUX, :NIT, :PTOVTA, :VENCEAUX, :VRDTO, :VRADIC, :VRIVA, :VREXTRA, :VRTOTAL, :PRTFTE, :VRRTFTE, :PORC, :VRRTIVA, :PRTICA, :VRRTICA, :NOMBRE, TCTARTFTE, TCTARTIVA, TCTARTICA, TCTAVENTA, TCTACLIEN, ANULADO;
  if (ANULADO = 'N') then
    BEGIN
    /* BUSQUE EL CENTRO DEL PUNTO, LA BODEGA, O EL PREFIJO  */
    IF (CENT = 'B') THEN
        SELECT B.BODE_CENTRO, B.BODE_PROY FROM BODEGA B, FACTURAS F
            WHERE B.BODE_COD = F.BODE_COD AND F.FACT_ID = :IDDOC INTO :CENTRO, :PROY;
    IF (CENT = 'V') THEN
        SELECT V.CENT_COD, V.PROY_COD FROM VENDEDORES V, FACTURAS F
            WHERE V.VEND_COD = F.VEND_COD AND F.FACT_ID = :IDDOC INTO :CENTRO, :PROY;
    IF (CENT = 'P') THEN
        SELECT P.PREF_CENTRO,P.PREF_PROY  FROM PREFIJOS P, FACTURAS F
            WHERE P.PREF_PRE = F.PREF_PRE AND F.FACT_ID = :IDDOC AND P.TIDO_COD = 31 INTO :CENTRO, :PROY;
    NUMERO = PREF || NUM;
    SELECT SUM (FADE_CONSUMO) FROM FACTURAS_DETALLE WHERE FACT_ID = :IDDOC  AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
        INTO MERCANCIA;
    VRSUBT = VRTOTAL - VREXTRA - VRIVA - MERCANCIA; /* BASE DE RETEFTE Y RETEICA */

    EXECUTE PROCEDURE lee_configuracion ('FACTURACION', 'FACTURAS', 'DESCUENTO PIE FACTURA IGUAL A SUMA DE DESCUENTOS POR ITEM') returning_values (:DTOXIT);
    if (DTOXIT = 'SI') then
        VRDTO = 0;
    MERCANCIA = VRSUBT - VRADIC + VRDTO;
    EXECUTE PROCEDURE FECHA_A_CONTA(:FECAUX) returning_values (:FECHA);
    EXECUTE PROCEDURE FECHA_A_CONTA(:VENCEAUX) returning_values (:VENCE);
    /* REGISTRE EL ENCABEZADO CONTABLE */
    IDC = GEN_ID(ID_CONTABILIZA, 1);
    if (STRLEN(NOMBRE)> 43 ) then
      CONC = 'FV No.' || NUMERO || '-' || SUBSTR(NOMBRE,1,43);
    ELSE
      CONC = 'FV No.' || NUMERO || '-' || NOMBRE;
    INSERT INTO CONTABILIZACION (CNTB_ID, CNTB_TIPOCOMP, CNTB_PREFCNT, CNTB_NUMERO, CNTB_FECHA, CNTB_CONCEPTO, CNTB_REF, CNTB_TIPOREF, CNTB_IDREF, CNTB_PREFREF, CNTB_NUMREF, CNTB_PROCESADO)
        VALUES (:IDC, :TIPOCOMP, :PREFCONT, :NUM, :FECHA, :CONC, '', 31, :IDDOC, :PREF, :NUM, 'N');
    NROI = 0;
    SUMA = 0;
    ERROR = 0;
    /* SI NO HAY CUENTA DE DESCUENTO NI ADICIONAL CALCULE UN FACTOR PARA LAS VENTAS Y EL IVA */
    if (MERCANCIA <> 0) then
        FACTOR = CAST(VRSUBT AS DOUBLE PRECISION) / CAST(MERCANCIA AS DOUBLE PRECISION);
    ELSE
        FACTOR = 1;
    /* TRAIGA EL NUMERO DE DIGITOS PARA EL REDONDEO */
    SELECT CAST(CONF_VALOR AS INTEGER) FROM CONFIGURACION WHERE CONF_MODULO = 'FACTURACION' AND
        CONF_CATEGORIA = 'GENERAL' AND CONF_PROPIEDAD = 'REDONDEO AL MULTIPLO DE DIEZ EN TOTALES' INTO :DIG;
    /* CUENTAS DE VENTAS */
    if (VENTAS = 'A') then
        BEGIN
        FOR SELECT MAX(COAR_CTAVNT), SUM(FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), SUM(FADE_IVAMONTO), SUM(FADE_CONSUMO)
            FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_DETALLE F
            WHERE F.FACT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
            GROUP BY COAR_CTAVNT
            INTO :CTAVENTAS, :MONTO, :IMPTOS, :VRCONSUMO
            DO
            BEGIN
            if (FOMENTO = 'SI') then
                MONTO = MONTO + VRCONSUMO;
            if ((CTADTO IS NULL) OR (CTADTO = '')) then
                MONTO = MONTO * FACTOR;
            execute procedure redondee(MONTO, DIG) returning_values (MONTO);
            if (MONTO <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTAVENTAS, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT F.ARTI_COD, (FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), FADE_CONSUMO
                        FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_DETALLE F
                        WHERE F.FACT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTAINV = :CUENTA AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
                        INTO :ART, :MONTO, :IMPTOS
                    DO
                        BEGIN
                        if (FOMENTO = 'SI') then
                            MONTO = MONTO + IMPTOS;
                        if ((CTADTO IS NULL) OR (CTADTO = '')) then
                            MONTO = MONTO * FACTOR;
                        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                        if (MONTO <> 0) then
                            BEGIN
                            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                            NROI = NROI + 1;
                            SUMA = SUMA - MONTO;
                            END
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    NROI = NROI + 1;
                    SUMA = SUMA - MONTO;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA - MONTO;
                    END
                END /* MONTO <> 0 */
            END /* FOR */
        END /* VENTAS X ARTICULO */
     IF ((VENTAS = 'C') OR (VENTAS = 'K')) THEN
        BEGIN
        IF (VENTAS = 'C') THEN
            CTAVENTAS = TCTAVENTA;
        SELECT SUM(FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), SUM(FADE_IVAMONTO), SUM (FADE_CONSUMO)
            FROM FACTURAS_DETALLE F
            WHERE F.FACT_ID = :IDDOC AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
            INTO :MONTO, :IMPTOS, :VRCONSUMO;
        if (FOMENTO = 'SI') then
            MONTO = MONTO + VRCONSUMO;
        if ((CTADTO IS NULL) OR (CTADTO = '')) then
            MONTO = MONTO * FACTOR;
        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
        if (MONTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTAVENTAS, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT F.ARTI_COD, (FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), FADE_CONSUMO
                    FROM ARTICULO A, FACTURAS_DETALLE F
                    WHERE F.FACT_ID = :IDDOC AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
                    INTO :ART, :MONTO, :IMPTOS
                    DO
                    BEGIN
                    if (FOMENTO = 'SI') then
                        MONTO = MONTO + VRCONSUMO;
                    if ((CTADTO IS NULL) OR (CTADTO = '')) then
                        MONTO = MONTO * FACTOR;
                    execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                    if (MONTO <> 0) then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        SUMA = SUMA - MONTO;
                        END
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - MONTO;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - MONTO;
                END
            END /* MONTO <> 0 */
        END /* VENTAS DE CLIENTE O CONSTANTE */
    /* EL IVA EN VENTAS */
    if (IVA = 'A') then
        BEGIN
        FOR SELECT MAX(COAR_CTAIVAV), SUM(FADE_IVAMONTO), SUM(FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), sum(FADE_CONSUMO)
            FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_DETALLE F
            WHERE F.FACT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
            GROUP BY COAR_CTAIVAV
            INTO :CTAIVA, :IMPTOS, :MONTO, :VALORADIC
        DO
            BEGIN
            if (FOMENTO = 'SI') then
                MONTO = MONTO + VALORADIC;
            MONTO = MONTO * -1;
            MONTO = MONTO * FACTOR;
            IMPTOS = IMPTOS * FACTOR;
            execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
            execute procedure redondee(MONTO, DIG) returning_values (MONTO);
            if (IMPTOS <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTAIVA, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT F.ARTI_COD, FADE_IVAMONTO, (FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), TAIV_PORC, FADE_CONSUMO
                        FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_DETALLE F, TARIFA_IVA T
                        WHERE F.FACT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTAIVAV = :CUENTA AND A.TAIV_COD = T.TAIV_COD AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
                        INTO :ART, :IMPTOS, :MONTO, :PORCIVA, :VALORADIC
                    DO
                        BEGIN
                        if (FOMENTO = 'SI') then
                            MONTO = MONTO + VALORADIC;
                        MONTO = MONTO * -1;
                        MONTO = MONTO * FACTOR;
                        IMPTOS = IMPTOS * FACTOR;
                        execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                        if (IMPTOS <> 0) then
                            BEGIN
                            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, :MONTO, :PORCIVA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                            NROI = NROI + 1;
                            SUMA = SUMA + DEBITO - CREDITO;
                            END
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, :MONTO, ABS(:IMPTOS*100/:MONTO), :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    NROI = NROI + 1;
                    SUMA = SUMA - IMPTOS;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, :MONTO, ABS(:IMPTOS*100/:MONTO), :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA - IMPTOS;
                    END
                END   /* IMPTOS <> 0 */
            END /* FOR */
        END /* IVA X ARTICULO */
    if (IVA = 'K') then /* IVA EN CTA CONSTANTE */
        BEGIN
        SELECT SUM(FADE_IVAMONTO), SUM(FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), SUM(FADE_CONSUMO)
            FROM FACTURAS_DETALLE F
            WHERE F.FACT_ID = :IDDOC and FADE_IVAMONTO <> 0 AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
            INTO :IMPTOS, :MONTO, :valoradic;
        if (FOMENTO = 'SI') then
            MONTO = MONTO + VALORADIC;
        MONTO = MONTO * -1;
        MONTO = MONTO * FACTOR;
        IMPTOS = IMPTOS * FACTOR;
        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
        execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
        if (IMPTOS <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTAIVA, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT F.ARTI_COD, (FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), FADE_IVAMONTO, TAIV_PORC, FADE_CONSUMO
                    FROM ARTICULO A, FACTURAS_DETALLE F, TARIFA_IVA T
                    WHERE F.FACT_ID = :IDDOC AND A.TAIV_COD = T.TAIV_COD AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
                    INTO :ART, :MONTO, :IMPTOS, :PORCIVA, :VALORADIC
                    DO
                    BEGIN
                    if (FOMENTO = 'SI') then
                        MONTO = MONTO + VALORADIC;
                    MONTO = MONTO * -1;
                    MONTO = MONTO * FACTOR;
                    IMPTOS = IMPTOS * FACTOR;
                    execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                    execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                    if (IMPTOS <> 0) then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', 0, :IMPTOS, :MONTO, :PORCIVA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        SUMA = SUMA - IMPTOS;
                        END
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', 0, :IMPTOS, :MONTO, ABS(:IMPTOS*100/:MONTO), :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - IMPTOS;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', 0, :IMPTOS, :MONTO, ABS(:IMPTOS*100/:MONTO), :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - IMPTOS;
                END
            END /* IMPTOS <> 0 */
        END /* IVA EN CTA CONSTANTE */
    /* EL IMPOCONSUMO */
    if ((CONSUMO = 'A') AND (FOMENTO <> 'SI')) then
        BEGIN
        FOR SELECT MAX(COAR_CTACONS), SUM(FADE_CONSUMO)
            FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_DETALLE F
            WHERE F.FACT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
            GROUP BY COAR_CTACONS
            INTO :CTACONSUMO, :IMPTOS
        DO
            BEGIN
            execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
            if (IMPTOS <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTACONSUMO, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, REGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT F.ARTI_COD, FADE_CONSUMO
                        FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_DETALLE F
                        WHERE F.FACT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTACONS = :CUENTA AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
                        INTO :ART, :IMPTOS
                    DO
                        BEGIN
                        execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                        if (IMPTOS <> 0) then
                            BEGIN
                            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                            NROI = NROI + 1;
                            SUMA = SUMA - IMPTOS;
                            END
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    NROI = NROI + 1;
                    SUMA = SUMA - IMPTOS;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA - IMPTOS;
                    END
                END /* IMPTOS <> 0 */
            END /* FOR */
        END /* CONSUMO X ARTICULO */
    if ((CONSUMO = 'K') AND (FOMENTO <> 'SI')) then /* CONSUMO EN CTA CONSTANTE */
        BEGIN
        SELECT SUM(FADE_CONSUMO)
            FROM FACTURAS_DETALLE F
            WHERE F.FACT_ID = :IDDOC AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
            INTO :IMPTOS;
        execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
        if (IMPTOS <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTACONSUMO, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT F.ARTI_COD, FADE_CONSUMO
                    FROM ARTICULO A, FACTURAS_DETALLE F
                    WHERE F.FACT_ID = :IDDOC AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
                    INTO :ART, :IMPTOS
                    DO
                    BEGIN
                    execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                    if (IMPTOS <> 0) then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CTACONSUMO, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        SUMA = SUMA - IMPTOS;
                        END
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTACONSUMO, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - IMPTOS;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTACONSUMO, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - IMPTOS;
                END
            END /* IMPTOS <> 0 */
        END /* CONSUMO EN CTA CONSTANTE */
    /* DESCUENTO */
    if ((CTADTO IS NOT NULL) AND (CTADTO <> '')) then
        BEGIN
        execute procedure redondee(VRDTO, DIG) returning_values (VRDTO);
        if (VRDTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTADTO, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRDTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA + VRDTO;
                END
            if (TIPOCUEN = 'N') then
                    BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRDTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA + VRDTO;
                END
            END
        END /* DESCUENTO */
    /* VALOR ADIC */
    if ((CTAADIC IS NOT NULL) AND (CTAADIC <> '')) then
        BEGIN
        execute procedure redondee(VRADIC, DIG) returning_values (VRADIC);
        if (VRADIC <> 0) THEN
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTAADIC, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRADIC, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - VRADIC;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRADIC, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - VRADIC;
                END
            END
        END /* VR. ADIC */
    /* VALOR EXTRA */
    if ((CTAEXTRA IS NOT NULL) AND (CTAEXTRA <> '')) THEN
        BEGIN
        execute procedure redondee(VREXTRA, DIG) returning_values (VREXTRA);
        if (VREXTRA <> 0) THEN
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTAEXTRA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VREXTRA, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - VREXTRA;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VREXTRA, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - VREXTRA;
                END
            END
        END /* VR. EXTRA */
    /* DESCUENTE EL IMPOCONSUMO */
    SELECT SUM(FADE_CONSUMO)
        FROM FACTURAS_DETALLE F WHERE F.FACT_ID = :IDDOC AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL)) INTO :IMPTOS;
    vrsubt = vrsubt - IMPTOS;
    /* RETENCION FUENTE */
    if ((RTFTE = 'C') or (RTFTE = 'K')) then
      BEGIN
      execute procedure redondee(VRRTFTE, DIG) returning_values (VRRTFTE);
      if (VRRTFTE <> 0) then
        BEGIN
        if (RTFTE = 'C') then
            CTARTFTE = TCTARTFTE;
        EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTARTFTE, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :VRSUBT, :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTFTE;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :VRSUBT, :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTFTE;
            END
        /* AUTORETENCION */
        if (FAUTORET <= fecaux) then
            BEGIN
            EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'CUENTA DE AUTORETENCION EN LA FUENTE') returning_values (CTARTFTE);
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTARTFTE INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERROR (31, :IDDOC, :CTARTFTE, 2);
                CUENTA = CTARTFTE;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                begin
                EXECUTE PROCEDURE ERROR (31, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, (:VRSUBT*-1), :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - VRRTFTE;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, (:VRSUBT*-1), :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - VRRTFTE;
                END
            END
        END /* RTFTE */
      END
    if (RTFTE = 'A') then
      BEGIN
      FOR SELECT MAX(COAR_CTARTFTEV), MAX(COAR_RTFTE), MIN(COAR_RTBASE), SUM(FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), SUM((FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO)*COAR_RTFTE)
        FROM CONTABIL_ARTICULO C, FACTURAS_DETALLE F
        WHERE F.FACT_ID = :IDDOC AND F.ARTI_COD = C.ARTI_COD AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
        GROUP BY COAR_CTARTFTEV
        INTO :CTARTFTE, :PRTFTE, :baseadic, :MONTO, :VRRTFTE
        DO
        BEGIN
        MONTO = MONTO * FACTOR;
        if (MONTO >= BASEADIC) then
            BEGIN
            VRRTFTE = VRRTFTE * FACTOR / 100;
            execute procedure redondee(VRRTFTE, DIG) returning_values (VRRTFTE);
            execute procedure redondee(MONTO, DIG) returning_values (MONTO);
            if (VRRTFTE <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTARTFTE, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :MONTO, :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    NROI = NROI + 1;
                    SUMA = SUMA + VRRTFTE;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :MONTO, :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA + VRRTFTE;
                    END
                /* AUTORETENCION */
                if (FAUTORET <= fecaux) then
                    BEGIN
                    EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'CUENTA DE AUTORETENCION EN LA FUENTE') returning_values (CTARTFTE);
                    EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTARTFTE, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
                    if (ERRORC <> 0) then
                        ERROR = ERROR + 1;
                    if (TIPOCUEN = 'C') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, (:MONTO*-1), :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                        NROI = NROI + 1;
                        SUMA = SUMA - VRRTFTE;
                        END
                    if (TIPOCUEN = 'N') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, (:MONTO*-1), :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NROI = NROI + 1;
                        SUMA = SUMA - VRRTFTE;
                        END
                    END
                END
            END
        END /* RTFTE */
      END
    /* RETENCION IVA */
    if ((RTIVA = 'C') or (RTIVA = 'K')) then
      BEGIN
      execute procedure redondee(VRRTIVA, DIG) returning_values (VRRTIVA);
      if (VRRTIVA <> 0) then
        BEGIN
        if (RTIVA = 'C') then
            CTARTIVA = TCTARTIVA;
        EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTARTIVA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTIVA, 0, :VRIVA, :PORC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTIVA;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTIVA, 0, :VRIVA, :PORC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTIVA;
            END
        END /* RTIVA */
      END
    /* RETENCION DE ICA */
    if ((RTICA = 'C') or (RTICA = 'K')) then
      BEGIN
      execute procedure redondee(VRRTICA, DIG) returning_values (VRRTICA);
      if (VRRTICA <> 0) then
        BEGIN
        if (RTICA = 'C') then
            CTARTICA = TCTARTICA;
        EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTARTICA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTICA, 0, :VRSUBT, :PRTICA, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTICA;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTICA, 0, :VRSUBT, :PRTICA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTICA;
            END
        END /* RTICA */
      END
    /* CIERRE EL COMPROBANTE CONTRA LA CUENTA DEL TERCERO O LA CONSTANTE */
    if ((SUMA <> 0) and ((CARTERA = 'C') or (CARTERA = 'K') or (CARTERA = 'J'))) then
        BEGIN
        if (SUMA < 0) then
            BEGIN
            DEBITO = SUMA * -1;
            CREDITO = 0;
            END
        ELSE
            BEGIN
            DEBITO = 0;
            CREDITO = SUMA;
            END
        if (CARTERA = 'C') then
            CTACARTERA = TCTACLIEN;
        if (CARTERA = 'J') then
            BEGIN
            /* BUSQUE LA CUENTA DE LA CAJA */
            SELECT CAJA_CUENTA FROM CAJAS C, PUNTO_VENTA P
                WHERE P.CAJA_ID = C.CAJA_ID AND PTVT_ID = :PTOVTA
                INTO :CTACARTERA;
            END
        EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTACARTERA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :DEBITO, :CREDITO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
        if (TIPOCUEN = 'N') then
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :DEBITO, :CREDITO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
        NROI = NROI + 1;
        END /* SUMA EN CARTERA */
    /* CALCULE COSTOS EN VENTAS */
    EXECUTE PROCEDURE COSTO_EN_VENTAS(31, :IDDOC);
    if (COSTOS = 'A') then
        BEGIN
        FOR SELECT MAX(CTACOS), SUM(CAST(CANT AS DOUBLE PRECISION) * COSTO)
            FROM COSTO_VENTAS
            GROUP BY CTACOS
            INTO :CTACOSTOS, :MONTO
        DO
            BEGIN
            if (MONTO <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTACOSTOS, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT ARTI_COD, CANT * COSTO
                        FROM COSTO_VENTAS
                        WHERE CTACOS = :CUENTA
                        INTO :ART, :MONTO
                    DO
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    NROI = NROI + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    END
                END /* MONTO <> 0 */
            END /* FOR */
        END /* COSTOS */
    if (COSTOS = 'K') then
        BEGIN
        SELECT SUM(CAST(CANT AS DOUBLE PRECISION) * COSTO)
            FROM COSTO_VENTAS
            INTO :MONTO;
        if (MONTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTACOSTOS, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, REGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT ARTI_COD, CANT * COSTO
                    FROM COSTO_VENTAS
                    INTO :ART, :MONTO
                DO
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTACOSTOS, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                    NROI = NROI + 1;
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTACOSTOS, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTACOSTOS, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                END
            END /* MONTO <> 0 */
        END /* COSTOS = K */
    if (INVEN = 'A') then
        BEGIN
        FOR SELECT MAX(CTAINV), SUM(CAST(CANT AS DOUBLE PRECISION) * COSTO)
            FROM COSTO_VENTAS
            GROUP BY CTAINV
            INTO :CTAINVEN, :MONTO
        DO
            BEGIN
            if (MONTO <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTAINVEN, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, REGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT ARTI_COD, CANT * COSTO
                        FROM COSTO_VENTAS
                        WHERE CTAINV = :CUENTA
                        INTO :ART, :MONTO
                    DO
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    NROI = NROI + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    END
                END /* MONTO <> 0 */
            END /* FOR */
        END /* INVEN = A */
    if (INVEN = 'K') then
        BEGIN
        SELECT SUM(CAST(CANT AS DOUBLE PRECISION) * COSTO)
            FROM COSTO_VENTAS
            INTO :MONTO;
        if (MONTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTAINVEN, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT ARTI_COD, CANT * COSTO
                    FROM COSTO_VENTAS
                    INTO :ART, :MONTO
                DO
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTAINVEN, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                    NROI = NROI + 1;
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAINVEN, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAINVEN, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                END
            END /* MONTO <> 0 */
        END /* INVEN = K */
    /* recorra las cuentas adicionales */
    FOR SELECT INVC_CUENTA, INVC_BASE, INVC_PORC, INVC_VALOR, INVC_DB
        FROM INTERFAZ_VENTAS_CTAS
        WHERE INVE_ID = :IDINTER
        INTO :CTADIC, :BASEADIC, :PORCADIC, :VALORADIC, :DBADIC
        DO
        BEGIN
        if (VALORADIC <> 0) then
            MONTO = VALORADIC;
        ELSE
            BEGIN
            if (:BASEADIC = 'SUBTOTAL') then
                VALORADIC = vrsubt;
            if (:BASEADIC = 'DESCUENTO') then
                VALORADIC = VRDTO;
            if (:BASEADIC = 'IVA') then
                VALORADIC = VRIVA;
            if (:BASEADIC = 'ADICIONAL') then
                VALORADIC = VRADIC;
            if (:BASEADIC = 'EXTRA') then
                VALORADIC = VREXTRA;
            if (:BASEADIC = 'TOTAL') then
                VALORADIC = VRTOTAL;
            MONTO = VALORADIC * PORCADIC / 100;
            END
        if (MONTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTADIC, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                if (DBADIC = 'S') then
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                ELSE
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                if (DBADIC = 'S') then
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                ELSE
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                END
            NROI = NROI + 1;
            END
        END
    if (ERROR > 0) then
        VER = 'S';
    SUSPEND;
    END /* NO ANULADO */
  END /* EXISTE LA INTERFAZ */
ELSE
    BEGIN
    EXECUTE PROCEDURE ERROR (31, :IDDOC, :PREF, 1);
    ERROR = ERROR + 1;
    VER = 'S';
    SUSPEND;
    END
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE FACTURAS_SIN_CONTABILIDAD(
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    ID INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    ESTADO VARCHAR(20),
    IDI INTEGER,
    IDC INTEGER)
AS
DECLARE VARIABLE VER CHAR(2);
declare variable FECICNT VARCHAR(10);
declare variable FECFCNT VARCHAR(10);
declare variable ERROR INTEGER;
declare variable idref INTEGER;
BEGIN /*$$IBE$$ 
EXECUTE PROCEDURE fecha_a_conta(FECINI) returning_values (FECICNT);
EXECUTE PROCEDURE fecha_a_conta(FECFIN) returning_values (FECFCNT);
FOR SELECT FACT_ID, PREF_PRE, FACT_NUMERO FROM FACTURAS WHERE FACT_ANULADO = 'N' AND
    FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN INTO :ID, :PREF, :NUMERO
DO
  BEGIN
  idref = null;
  SELECT ENCO_IDREF FROM COMPROBANTE_ENCABEZADO WHERE ENCO_TIPOREF = 31 AND ENCO_FECHA >= :FECICNT AND ENCO_FECHA <= :FECFCNT and ENCO_IDREF = :ID into :idref;
  if (idref IS NULL) then
  begin
   ESTADO = 'PROCESANDO';
   ERROR = NULL;
   SUSPEND;
   SELECT MAX(INVE_ID) FROM INTERFAZ_VENTAS WHERE PREF_PRE = :PREF AND TIDO_COD = 31 INTO :IDI;
   EXECUTE PROCEDURE CONTABIL_FACTURA (:ID, :IDI) RETURNING_VALUES (:ERROR, VER, :IDC);
   if ((ERROR = 0) or (error IS NULL)) then
    BEGIN
    EXECUTE PROCEDURE CONTABILIZA_PENDIENTE (:IDC);
    ESTADO = 'OK';
    END
   ELSE
    ESTADO = 'ERROR';
   suspend;
  end
  END
 $$IBE$$*/ SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE FACTURAS_SIN_CONTABILIDAD(
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    ID INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    ESTADO VARCHAR(20),
    IDI INTEGER,
    IDC INTEGER)
AS
DECLARE VARIABLE VER CHAR(2);
declare variable FECICNT VARCHAR(10);
declare variable FECFCNT VARCHAR(10);
declare variable ERROR INTEGER;
declare variable idref INTEGER;
BEGIN
EXECUTE PROCEDURE fecha_a_conta(FECINI) returning_values (FECICNT);
EXECUTE PROCEDURE fecha_a_conta(FECFIN) returning_values (FECFCNT);
FOR SELECT FACT_ID, PREF_PRE, FACT_NUMERO FROM FACTURAS WHERE FACT_ANULADO = 'N' AND
    FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN INTO :ID, :PREF, :NUMERO
DO
  BEGIN
  idref = null;
  SELECT ENCO_IDREF FROM COMPROBANTE_ENCABEZADO WHERE ENCO_TIPOREF = 31 AND ENCO_FECHA >= :FECICNT AND ENCO_FECHA <= :FECFCNT and ENCO_IDREF = :ID into :idref;
  if (idref IS NULL) then
  begin
   ESTADO = 'PROCESANDO';
   ERROR = NULL;
   SUSPEND;
   SELECT MAX(INVE_ID) FROM INTERFAZ_VENTAS WHERE PREF_PRE = :PREF AND TIDO_COD = 31 INTO :IDI;
   EXECUTE PROCEDURE CONTABIL_FACTURA (:ID, :IDI) RETURNING_VALUES (:ERROR, VER, :IDC);
   if ((ERROR = 0) or (error IS NULL)) then
    BEGIN
    EXECUTE PROCEDURE CONTABILIZA_PENDIENTE (:IDC);
    ESTADO = 'OK';
    END
   ELSE
    ESTADO = 'ERROR';
   suspend;
  end
  END
END

^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER PROCEDURE CIERRE_DIARIO(
    FECHA DATE,
    PTOVTA INTEGER)
RETURNS (
    VTACONTDIA NUMERIC(18,2),
    VTACONTMES NUMERIC(18,2),
    VTACREDDIA NUMERIC(18,2),
    VTACREDMES NUMERIC(18,2),
    VTATOTALDIA NUMERIC(18,2),
    VTATOTALMES NUMERIC(18,2),
    DEVOLDIA NUMERIC(18,2),
    DEVOLMES NUMERIC(18,2),
    VTANETADIA NUMERIC(18,2),
    VTANETAMES NUMERIC(18,2),
    VTAEXENTADIA NUMERIC(18,2),
    VTAGRAVA16DIA NUMERIC(18,2),
    VTAGRAVA10DIA NUMERIC(18,2),
    VTAEXENTAMES NUMERIC(18,2),
    VTAGRAVA16MES NUMERIC(18,2),
    VTAGRAVA10MES NUMERIC(18,2),
    IVA16DIA NUMERIC(18,2),
    IVA10DIA NUMERIC(18,2),
    IVA16MES NUMERIC(18,2),
    IVA10MES NUMERIC(18,2),
    FORMAP1 NUMERIC(18,2),
    FORMAP2 NUMERIC(18,2),
    FORMAP3 NUMERIC(18,2),
    FORMAP4 NUMERIC(18,2),
    FORMAP5 NUMERIC(18,2),
    CARTERA NUMERIC(18,2),
    FORMAP1MES NUMERIC(18,2),
    FORMAP2MES NUMERIC(18,2),
    FORMAP3MES NUMERIC(18,2),
    FORMAP4MES NUMERIC(18,2),
    FORMAP5MES NUMERIC(18,2),
    CARTERAMES NUMERIC(18,2),
    INICIAL NUMERIC(18,2),
    INGCARTERA NUMERIC(18,2),
    INGOTROS NUMERIC(18,2),
    INGTOTAL NUMERIC(18,2),
    DESCTOSDIA NUMERIC(18,2),
    DESCTOSMES NUMERIC(18,2),
    EGRTOTAL NUMERIC(18,2),
    EGRPROV NUMERIC(18,2),
    EGRCLASE1 NUMERIC(18,2),
    EGRCLASE2 NUMERIC(18,2),
    EGROTROS NUMERIC(18,2),
    TRASLADO NUMERIC(18,2),
    TRASLADOR NUMERIC(18,2),
    CONSIGNA NUMERIC(18,2))
AS
declare variable FECAUX VARCHAR(10);
declare variable FECINI DATE;
declare variable CAJA INTEGER;
begin
FECAUX = CAST (FECHA AS VARCHAR(10));
FECINI = SUBSTR(FECAUX, 1, 8) || '01';
/* ventas totales */
SELECT SUM(FACT_TOTAL) FROM FACTURAS WHERE FACT_FECHA = :FECHA AND PTVT_ID = :ptovta AND FACT_ANULADO = 'N' INTO :vtatotaldia;
if (vtatotaldia IS NULL) then
    vtatotaldia = 0;
SELECT SUM(FACT_TOTAL) FROM FACTURAS WHERE FACT_FECHA >= :fecini AND FACT_FECHA <= :FECHA AND PTVT_ID = :ptovta AND FACT_ANULADO = 'N' INTO :vtatotalmes;
if (vtatotalmes IS NULL) then
    vtatotalmes = 0;
SELECT SUM(DEVT_TOTAL) FROM DEVOLUCIONES_VENTAS WHERE DEVT_FECHA = :FECHA AND PTVT_ID = :ptovta AND DEVT_ANULADO = 'N' INTO :devoldia;
if (devoldia IS NULL) then
    devoldia = 0;
SELECT SUM(DEVT_TOTAL) FROM DEVOLUCIONES_VENTAS WHERE DEVT_FECHA >= :fecini AND DEVT_FECHA <= :FECHA AND PTVT_ID = :ptovta AND DEVT_ANULADO = 'N' INTO :devolmes;
if (devolmes IS NULL) then
    devolmes = 0;
/* ventas contado */
SELECT SUM(RCDE_ABONO), SUM(RCDE_DTOF) FROM RECIBOS_CAJA_DETALLE D, RECIBOS_CAJA R,  FACTURAS F
    WHERE FACT_FECHA = :FECHA AND PTVT_ID = :ptovta AND D.rcde_tipodoc = 31 AND D.rcde_iddoc = F.fact_id AND R.reca_id = D.reca_id AND RECA_FECHA = :FECHA AND RCDE_ANULADO = 'N'
    INTO :vtacontdia, :desctosdia;
if (vtacontdia IS NULL) then
    vtacontdia = 0;
if (desctosdia IS NULL) then
    desctosdia = 0;

SELECT SUM(RCDE_ABONO), SUM(RCDE_DTOF) FROM RECIBOS_CAJA_DETALLE D, RECIBOS_CAJA R,  FACTURAS F
    WHERE FACT_FECHA >= :fecini AND PTVT_ID = :ptovta AND FACT_FECHA <= :FECHA AND D.rcde_tipodoc = 31 AND D.rcde_iddoc = F.fact_id AND R.reca_id = D.reca_id AND RECA_FECHA = FACT_FECHA AND RCDE_ANULADO = 'N'
    INTO :vtacontmes, :desctosmes;
if (vtacontmes IS NULL) then
    vtacontmes = 0;
if (desctosmes IS NULL) then
    desctosmes = 0;

/* Ventas credito */
vtacreddia = vtatotaldia - vtacontdia;
vtacredmes = vtatotalmes - vtacontmes;

vtanetadia = vtatotaldia - devoldia;
vtanetames = vtatotalmes - devolmes;

SELECT SUM(FADE_TOTAL-FADE_IVAMONTO) FROM facturas_detalle D, FACTURAS F
    WHERE D.FACT_ID = F.FACT_ID AND FACT_FECHA = :FECHA AND PTVT_ID = :ptovta AND PTVT_ID = :ptovta AND FADE_IVAPORC = 0 and FACT_ANULADO = 'N' AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
    INTO :vtaexentadia;
if (vtaexentadia IS NULL) then
    vtaexentadia = 0;
SELECT SUM(FADE_TOTAL-FADE_IVAMONTO) FROM facturas_detalle D, FACTURAS F
    WHERE D.FACT_ID = F.FACT_ID AND FACT_FECHA >= :fecini AND FACT_FECHA <= :FECHA AND PTVT_ID = :ptovta AND FADE_IVAPORC = 0 and FACT_ANULADO = 'N'  AND D.fade_referencia <> '.t'
    INTO :vtaexentames;
if (vtaexentames IS NULL) then
    vtaexentames = 0;
SELECT SUM(FADE_TOTAL-FADE_IVAMONTO), SUM(FADE_IVAMONTO) FROM facturas_detalle D, FACTURAS F
    WHERE D.FACT_ID = F.FACT_ID AND FACT_FECHA = :FECHA AND PTVT_ID = :ptovta AND FADE_IVAPORC = 16 and FACT_ANULADO = 'N'  AND D.fade_referencia <> '.t'
    INTO :vtagrava16dia, :iva16dia;
if (vtagrava16dia IS NULL) then
    vtagrava16dia = 0;
if (iva16dia IS NULL) then
    iva16dia = 0;
SELECT SUM(FADE_TOTAL-FADE_IVAMONTO), SUM(FADE_IVAMONTO) FROM facturas_detalle D, FACTURAS F
    WHERE D.FACT_ID = F.FACT_ID AND FACT_FECHA >= :fecini AND FACT_FECHA <= :FECHA AND PTVT_ID = :ptovta AND FADE_IVAPORC = 16 and FACT_ANULADO = 'N'  AND D.fade_referencia <> '.t'
    INTO :vtagrava16mes, :iva16mes;
if (vtagrava16mes IS NULL) then
    vtagrava16mes = 0;
if (iva16mes IS NULL) then
    iva16mes = 0;
SELECT SUM(FADE_TOTAL-FADE_IVAMONTO), SUM(FADE_IVAMONTO) FROM facturas_detalle D, FACTURAS F
    WHERE D.FACT_ID = F.FACT_ID AND FACT_FECHA = :FECHA AND PTVT_ID = :ptovta AND FADE_IVAPORC = 10 and FACT_ANULADO = 'N'  AND D.fade_referencia <> '.t'
    INTO :vtagrava10dia, :iva10dia;
if (vtagrava10dia IS NULL) then
    vtagrava10dia = 0;
if (iva10dia IS NULL) then
    iva10dia = 0;
SELECT SUM(FADE_TOTAL-FADE_IVAMONTO), SUM(FADE_IVAMONTO) FROM facturas_detalle D, FACTURAS F
    WHERE D.FACT_ID = F.FACT_ID AND FACT_FECHA >= :fecini AND FACT_FECHA <= :FECHA AND PTVT_ID = :ptovta AND FADE_IVAPORC = 10 and FACT_ANULADO = 'N'  AND D.fade_referencia <> '.t'
    INTO :vtagrava10mes, :iva10mes;
if (vtagrava10mes IS NULL) then
    vtagrava10mes = 0;
if (iva10mes IS NULL) then
    iva10mes = 0;

/* POR FORMA DE PAGO */
SELECT SUM(RCPA_MONTO) FROM RECIBOS_CAJA_PAGO P, RECIBOS_CAJA R, PUNTO_VENTA PT
    WHERE R.RECA_ID = P.RECA_ID AND PT.PTVT_ID = :ptovta AND RECA_FECHA = :fecha AND PT.caja_id = R.caja_id AND FOPA_ID = 1 and RECA_ANULADO = 'N'
    INTO :FORMAP1;
SELECT SUM(RCPA_MONTO) FROM RECIBOS_CAJA_PAGO P, RECIBOS_CAJA R, PUNTO_VENTA PT
    WHERE R.RECA_ID = P.RECA_ID AND PT.PTVT_ID = :ptovta AND RECA_FECHA = :FECHA AND PT.caja_id = R.caja_id AND FOPA_ID = 2 and RECA_ANULADO = 'N'
    INTO :FORMAP2;
SELECT SUM(RCPA_MONTO) FROM RECIBOS_CAJA_PAGO P, RECIBOS_CAJA R, PUNTO_VENTA PT
    WHERE R.RECA_ID = P.RECA_ID AND PT.PTVT_ID = :ptovta AND RECA_FECHA = :FECHA AND PT.caja_id = R.caja_id AND FOPA_ID = 3 and RECA_ANULADO = 'N'
    INTO :FORMAP3;
SELECT SUM(RCPA_MONTO) FROM RECIBOS_CAJA_PAGO P, RECIBOS_CAJA R, PUNTO_VENTA PT
    WHERE R.RECA_ID = P.RECA_ID AND PT.PTVT_ID = :ptovta AND RECA_FECHA = :FECHA AND PT.caja_id = R.caja_id AND FOPA_ID = 4 and RECA_ANULADO = 'N'
    INTO :FORMAP4;
SELECT SUM(RCPA_MONTO) FROM RECIBOS_CAJA_PAGO P, RECIBOS_CAJA R, PUNTO_VENTA PT
    WHERE R.RECA_ID = P.RECA_ID AND PT.PTVT_ID = :ptovta AND RECA_FECHA = :FECHA AND PT.caja_id = R.caja_id AND FOPA_ID = 5 and RECA_ANULADO = 'N'
    INTO :FORMAP5;
SELECT SUM(FACT_TOTAL) FROM FACTURAS f WHERE FACT_FECHA = :fecha AND PTVT_ID = :ptovta AND FACT_ANULADO = 'N' AND
    FACT_ID NOT IN (SELECT RCDE_IDDOC FROM RECIBOS_CAJA R, RECIBOS_CAJA_DETALLE D WHERE R.reca_id = D.reca_id AND R.reca_fecha = F.fact_fecha AND D.rcde_tipodoc = 31)
    INTO :cartera;
if (formap1 is null) then
    formap1 = 0;
if (formap2 is null) then
    formap2 = 0;
if (formap3 is null) then
    formap3 = 0;
if (formap4 is null) then
    formap4 = 0;
if (formap5 is null) then
    formap5 = 0;
if (cartera is null) then
    cartera = 0;

/* EL MES X FORMA DE PAGO */
SELECT SUM(RCPA_MONTO) FROM RECIBOS_CAJA_PAGO P, RECIBOS_CAJA R, PUNTO_VENTA PT
    WHERE R.RECA_ID = P.RECA_ID AND PT.PTVT_ID = :ptovta AND RECA_FECHA >= :fecini AND RECA_FECHA <= :fecha AND PT.caja_id = R.caja_id AND FOPA_ID = 1 and RECA_ANULADO = 'N'
    INTO :FORMAP1MES;
SELECT SUM(RCPA_MONTO) FROM RECIBOS_CAJA_PAGO P, RECIBOS_CAJA R, PUNTO_VENTA PT
    WHERE R.RECA_ID = P.RECA_ID AND PT.PTVT_ID = :ptovta AND RECA_FECHA >= :fecini AND RECA_FECHA <= :fecha AND PT.caja_id = R.caja_id AND FOPA_ID = 2 and RECA_ANULADO = 'N'
    INTO :FORMAP2MES;
SELECT SUM(RCPA_MONTO) FROM RECIBOS_CAJA_PAGO P, RECIBOS_CAJA R, PUNTO_VENTA PT
    WHERE R.RECA_ID = P.RECA_ID AND PT.PTVT_ID = :ptovta AND RECA_FECHA >= :fecini AND RECA_FECHA <= :fecha AND PT.caja_id = R.caja_id AND FOPA_ID = 3 and RECA_ANULADO = 'N'
    INTO :FORMAP3MES;
SELECT SUM(RCPA_MONTO) FROM RECIBOS_CAJA_PAGO P, RECIBOS_CAJA R, PUNTO_VENTA PT
    WHERE R.RECA_ID = P.RECA_ID AND PT.PTVT_ID = :ptovta AND RECA_FECHA >= :fecini AND RECA_FECHA <= :fecha AND PT.caja_id = R.caja_id AND FOPA_ID = 4 and RECA_ANULADO = 'N'
    INTO :FORMAP4MES;
SELECT SUM(RCPA_MONTO) FROM RECIBOS_CAJA_PAGO P, RECIBOS_CAJA R, PUNTO_VENTA PT
    WHERE R.RECA_ID = P.RECA_ID AND PT.PTVT_ID = :ptovta AND RECA_FECHA >= :fecini AND RECA_FECHA <= :fecha AND PT.caja_id = R.caja_id AND FOPA_ID = 5 and RECA_ANULADO = 'N'
    INTO :FORMAP5MES;

SELECT SUM(FACT_TOTAL) FROM FACTURAS f WHERE FACT_FECHA >= :fecini AND FACT_FECHA <= :fecha AND PTVT_ID = :ptovta AND FACT_ANULADO = 'N' AND
    FACT_ID NOT IN (SELECT RCDE_IDDOC FROM RECIBOS_CAJA R, RECIBOS_CAJA_DETALLE D WHERE R.reca_id = D.reca_id AND R.reca_fecha = F.fact_fecha AND D.rcde_tipodoc = 31)
    INTO :carterames;
if (formap1mes is null) then
    formap1mes = 0;
if (formap2mes is null) then
    formap2mes = 0;
if (formap3mes is null) then
    formap3mes = 0;
if (formap4mes is null) then
    formap4mes = 0;
if (formap5mes is null) then
    formap5mes = 0;
if (carterames is null) then
    carterames = 0;

/* SALDO INICIAL */
SELECT CAJA_ID FROM punto_venta WHERE PTVT_ID = :ptovta INTO :CAJA;
EXECUTE PROCEDURE saldo_en_caja(:caja, :fecha) returning_values (:inicial);
/* recibos totales */
select sum(reca_monto) from recibos_caja where reca_fecha = :fecha AND RECA_ANULADO = 'N' and caja_id = :caja into :ingtotal;
if (ingtotal IS NULL) then
    ingtotal = 0;
/* recibos otros */
select sum(reca_monto) from recibos_caja r where reca_fecha = :fecha AND RECA_ANULADO = 'N' and caja_id = :caja and reca_id not in (select reca_id from recibos_caja_detalle) into :ingotros;
if (ingotros IS NULL) then
    ingotros = 0;
/* recibos cxc */
select sum(rcde_abono) from recibos_caja_detalle d, recibos_caja r,  movimiento_clientes m
    where mvcl_fecha <> :fecha and r.reca_id = d.reca_id and r.reca_fecha = :fecha and caja_id = :caja and d.rcde_tipodoc = m.mvcl_tiporef and d.rcde_iddoc = m.mvcl_idref AND RCDE_ANULADO = 'N'
    into :ingcartera;
if (ingcartera IS NULL) then
    ingcartera = 0;

/* EGRESOS totales */
select sum(egca_monto) from egresos_caja c, egresos e where e.egre_id = c.egre_id and c.CAJA_ID = :caja and e.egre_fecha = :fecha AND EGCA_ANULADO = 'N'
into :egrtotal;
if (egrtotal IS NULL) then
    egrtotal = 0;
/* EGRESOS PROVEEDORES */
select sum(egca_monto) from egresos_caja c, egresos e, egresos_detalle d
    where e.egre_id = c.egre_id and c.CAJA_ID = :caja and e.egre_fecha = :fecha AND EGCA_ANULADO = 'N' and
    e.egre_id = d.egre_id into :egrprov;
if (egrprov IS NULL) then
    egrprov = 0;
/* EGRESOS CLASE1 */
select sum(egca_monto) from egresos_caja c, egresos e
    where e.egre_id = c.egre_id and c.CAJA_ID = :caja and e.cleg_id = 1 and e.egre_fecha = :fecha AND EGCA_ANULADO = 'N' and
    e.egre_id = c.egre_id into :egrclase1;
if (egrclase1 IS NULL) then
    egrclase1 = 0;
/* EGRESOS CLASE2 */
select sum(egca_monto) from egresos_caja c, egresos e
    where e.egre_id = c.egre_id and c.CAJA_ID = :caja and e.cleg_id = 2 and e.egre_fecha = :fecha AND EGCA_ANULADO = 'N' and
    e.egre_id = c.egre_id into :egrclase2;
if (egrclase2 IS NULL) then
    egrclase2 = 0;
/* EGRESOS OTROS */
egrotros = egrtotal - egrprov - egrclase1 - egrclase2;

/* traslados caja */
select sum(trcd_monto) from traslados_caja t, traslados_caja_det d where t.trcj_id = d.trcj_id and t.caja_id = :caja and t.trcj_fecha = :fecha into :traslado;
if (traslado is null) then
    traslado = 0;
/* traslados caja recibidos */
select sum(trcd_monto) from traslados_caja t, traslados_caja_det d where t.trcj_id = d.trcj_id and t.trcj_destino = :caja and t.trcj_fecha = :fecha into :traslador;
if (traslador is null) then
    traslador = 0;
/* consignaciones */
select sum(code_monto) from consigna_detalle d, consigna c where c.cons_id = d.cons_id and cons_fecha = :fecha and d.caja_id = :caja into :consigna;
if (consigna is null) then
    consigna = 0;
suspend;
end
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE RESUMEN_DIA(
    FECHA DATE,
    PTOINI INTEGER,
    PTOFIN INTEGER,
    AGENCIA INTEGER)
RETURNS (
    PTOVTA INTEGER,
    PTOVTANOM VARCHAR(60),
    VTACONTDIA NUMERIC(18,2),
    VTACONTMES NUMERIC(18,2),
    VTACREDDIA NUMERIC(18,2),
    VTACREDMES NUMERIC(18,2),
    VTATOTALDIA NUMERIC(18,2),
    VTATOTALMES NUMERIC(18,2),
    DEVOLDIA NUMERIC(18,2),
    DEVOLMES NUMERIC(18,2),
    VTANETADIA NUMERIC(18,2),
    VTANETAMES NUMERIC(18,2),
    VTAEXENTADIA NUMERIC(18,2),
    VTAGRAVA16DIA NUMERIC(18,2),
    VTAGRAVA10DIA NUMERIC(18,2),
    VTAEXENTAMES NUMERIC(18,2),
    VTAGRAVA16MES NUMERIC(18,2),
    VTAGRAVA10MES NUMERIC(18,2),
    IVA16DIA NUMERIC(18,2),
    IVA10DIA NUMERIC(18,2),
    IVA16MES NUMERIC(18,2),
    IVA10MES NUMERIC(18,2),
    FORMAP1 NUMERIC(18,2),
    FORMAP2 NUMERIC(18,2),
    FORMAP3 NUMERIC(18,2),
    FORMAP4 NUMERIC(18,2),
    FORMAP5 NUMERIC(18,2),
    CARTERA NUMERIC(18,2),
    FORMAP1MES NUMERIC(18,2),
    FORMAP2MES NUMERIC(18,2),
    FORMAP3MES NUMERIC(18,2),
    FORMAP4MES NUMERIC(18,2),
    FORMAP5MES NUMERIC(18,2),
    CARTERAMES NUMERIC(18,2),
    INICIAL NUMERIC(18,2),
    INGCARTERA NUMERIC(18,2),
    INGOTROS NUMERIC(18,2),
    INGTOTAL NUMERIC(18,2),
    DESCTOSDIA NUMERIC(18,2),
    DESCTOSMES NUMERIC(18,2),
    EGRTOTAL NUMERIC(18,2),
    EGRPROV NUMERIC(18,2),
    EGRCLASE1 NUMERIC(18,2),
    EGRCLASE2 NUMERIC(18,2),
    EGROTROS NUMERIC(18,2),
    TRASLADO NUMERIC(18,2),
    TRASLADOR NUMERIC(18,2),
    CONSIGNA NUMERIC(18,2),
    FINAL NUMERIC(18,2),
    CMPEXENTADIA NUMERIC(18,2),
    CMPGRAVA16DIA NUMERIC(18,2),
    CMPGRAVA10DIA NUMERIC(18,2),
    CMPEXENTAMES NUMERIC(18,2),
    CMPGRAVA16MES NUMERIC(18,2),
    CMPGRAVA10MES NUMERIC(18,2),
    CMPTOTALDIA NUMERIC(18,2),
    CMPTOTALMES NUMERIC(18,2),
    CMPCONTADODIA NUMERIC(18,2),
    CMPCREDITODIA NUMERIC(18,2),
    CMPCONTADOMES NUMERIC(18,2),
    CMPCREDITOMES NUMERIC(18,2),
    DEVCMPDIA NUMERIC(18,2),
    DEVCMPMES NUMERIC(18,2),
    CMPNETADIA NUMERIC(18,2),
    CMPNETAMES NUMERIC(18,2),
    IVAC16DIA NUMERIC(18,2),
    IVAC10DIA NUMERIC(18,2),
    IVAC16MES NUMERIC(18,2),
    IVAC10MES NUMERIC(18,2))
AS
declare variable FECAUX VARCHAR(10);
declare variable FECINI DATE;
begin /*$$IBE$$ 
FECAUX = CAST (FECHA AS VARCHAR(10));
FECINI = SUBSTR(FECAUX, 1, 8) || '01';
SELECT SUM(FCDE_TOTAL-FCDE_IVAMONTO) FROM facturas_compras_detalle D, facturas_compra F, PREFIJOS P
    WHERE D.FACO_ID = F.FACO_ID AND FACO_FECHA = :FECHA AND FCDE_IVAPORC = 0 and FACO_ANULADO = 'N' AND
        P.pref_pre = F.pref_pre AND P.tido_cod = 21 AND ((:AGENCIA = 0) or (P.sucu_id = :AGENCIA))
    INTO :cmpexentadia;
if (cmpexentadia IS NULL) then
    cmpexentadia = 0;
SELECT SUM(FCDE_TOTAL-FCDE_IVAMONTO) FROM facturas_compras_detalle D, facturas_compra F, PREFIJOS P
    WHERE D.FACO_ID = F.FACO_ID AND FACO_FECHA >= :fecini AND FACO_FECHA <= :FECHA AND FCDE_IVAPORC = 0 and FACO_ANULADO = 'N' and
        P.pref_pre = F.pref_pre AND P.tido_cod = 21 AND ((:AGENCIA = 0) or (P.sucu_id = :AGENCIA))
    INTO :cmpexentames;
if (cmpexentames IS NULL) then
    cmpexentames = 0;
SELECT SUM(FCDE_TOTAL-FCDE_IVAMONTO), SUM(FCDE_IVAMONTO) from facturas_compras_detalle D, facturas_compra F, prefijos p
    WHERE D.FACO_ID = F.FACO_ID AND FACO_FECHA = :FECHA AND FCDE_IVAPORC = 16 and FACO_ANULADO = 'N' AND
        P.pref_pre = F.pref_pre AND P.tido_cod = 21 AND ((:AGENCIA = 0) or (P.sucu_id = :AGENCIA))
    INTO :cmpgrava16dia, :ivac16dia;
if (cmpgrava16dia IS NULL) then
    cmpgrava16dia = 0;
if (ivac16dia IS NULL) then
    ivac16dia = 0;
SELECT SUM(FCDE_TOTAL-FCDE_IVAMONTO), SUM(FCDE_IVAMONTO) from facturas_compras_detalle D, facturas_compra F, PREFIJOS P
    WHERE D.FACO_ID = F.FACO_ID AND FACO_FECHA >= :fecini AND FACO_FECHA <= :FECHA AND FCDE_IVAPORC = 16 and FACO_ANULADO = 'N' AND
        P.pref_pre = F.pref_pre AND P.tido_cod = 21 AND ((:AGENCIA = 0) or (P.sucu_id = :AGENCIA))
    INTO :cmpgrava16mes, :ivac16mes;
if (cmpgrava16mes IS NULL) then
    cmpgrava16mes = 0;
if (ivac16mes IS NULL) then
    ivac16mes = 0;
SELECT SUM(FCDE_TOTAL-FCDE_IVAMONTO), SUM(FCDE_IVAMONTO) FROM facturas_compras_detalle D, facturas_compra F, PREFIJOS P
    WHERE D.FACO_ID = F.FACO_ID AND FACO_FECHA = :FECHA AND FCDE_IVAPORC = 10 and FACO_ANULADO = 'N' AND
        P.pref_pre = F.pref_pre AND P.tido_cod = 21 AND ((:AGENCIA = 0) or (P.sucu_id = :AGENCIA))
    INTO :cmpgrava10dia, :ivac10dia;
if (cmpgrava10dia IS NULL) then
    cmpgrava10dia = 0;
if (ivac10dia IS NULL) then
    ivac10dia = 0;
SELECT SUM(FCDE_TOTAL-FCDE_IVAMONTO), SUM(FCDE_IVAMONTO) FROM facturas_compras_detalle D, facturas_compra F, PREFIJOS P
    WHERE D.FACO_ID = F.FACO_ID AND FACO_FECHA >= :fecini AND FACO_FECHA <= :FECHA AND FCDE_IVAPORC = 10 and FACO_ANULADO = 'N' AND
        P.pref_pre = F.pref_pre AND P.tido_cod = 21 AND ((:AGENCIA = 0) or (P.sucu_id = :AGENCIA))
    INTO :cmpgrava10mes, :ivac10mes;
if (cmpgrava10mes IS NULL) then
    cmpgrava10mes = 0;
if (ivac10mes IS NULL) then
    ivac10mes = 0;
SELECT SUM(FACO_TOTAL) FROM FACTURAS_COMPRA F, PREFIJOS P
    WHERE P.pref_pre = F.pref_pre AND P.tido_cod = 21 AND ((:AGENCIA = 0) or (P.sucu_id = :AGENCIA)) AND
    FACO_FECHA = :fecha AND FACO_ANULADO = 'N' INTO :cmptotaldia;
SELECT SUM(FACO_TOTAL) FROM FACTURAS_COMPRA F, PREFIJOS P
    WHERE P.pref_pre = F.pref_pre AND P.tido_cod = 21 AND ((:AGENCIA = 0) or (P.sucu_id = :AGENCIA)) AND
    FACO_FECHA >= :fecini AND FACO_FECHA <= :fecha AND FACO_ANULADO = 'N' INTO :cmptotalmes;
if (cmptotaldia IS NULL) then
    cmptotaldia = 0;
if (cmptotalmes IS NULL) then
    cmptotalmes = 0;
SELECT SUM(FACO_TOTAL) FROM FACTURAS_COMPRA F, PREFIJOS P, EGRESOS_DETALLE D, EGRESOS E
    WHERE P.pref_pre = F.pref_pre AND P.tido_cod = 21 AND ((:AGENCIA = 0) or (P.sucu_id = :AGENCIA)) AND
    D.egde_iddoc = F.faco_id AND D.egde_tipodoc = 21 AND E.egre_id = D.egre_id AND E.egre_fecha = :FECHA AND
    FACO_FECHA = :fecha AND FACO_ANULADO = 'N' INTO :cmpcontadodia;
SELECT SUM(FACO_TOTAL) FROM FACTURAS_COMPRA F, PREFIJOS P, EGRESOS_DETALLE D, EGRESOS E
    WHERE P.pref_pre = F.pref_pre AND P.tido_cod = 21 AND ((:AGENCIA = 0) or (P.sucu_id = :AGENCIA)) AND
    D.egde_iddoc = F.faco_id AND D.egde_tipodoc = 21 AND E.egre_id = D.egre_id AND E.egre_fecha = F.faco_fecha AND
    FACO_FECHA >= :fecini AND FACO_FECHA <= :fecha AND FACO_ANULADO = 'N' INTO :cmpcontadomes;
if (cmpcontadodia IS NULL) then
    cmpcontadodia = 0;
if (cmpcontadomes IS NULL) then
    cmpcontadomes = 0;
CMPCREDITODIA = cmptotaldia - cmpcontadodia;
cmpcreditomes = cmptotalmes - cmpcontadomes;
SELECT SUM(DVCO_TOTAL) FROM DEVOLUCIONES_COMPRAS
    WHERE DVCO_FECHA = :fecha AND DVCO_ANULADO = 'N' INTO :devcmpdia;
SELECT SUM(DVCO_TOTAL) FROM DEVOLUCIONES_COMPRAS
    WHERE DVCO_FECHA >= :fecini AND DVCO_FECHA <= :fecha AND DVCO_ANULADO = 'N' INTO :devcmpmes;
if (devcmpdia IS NULL) then
    devcmpdia = 0;
if (devcmpmes IS NULL) then
    devcmpmes = 0;
cmpnetadia = cmptotaldia - devcmpdia;
cmpnetames = cmptotalmes - devcmpmes;
FOR SELECT PTVT_ID, PTVT_NOM FROM PUNTO_VENTA WHERE PTVT_ID >= :ptoini AND PTVT_ID <= :ptofin AND ((SUCU_ID = :agencia) or (:AGENCIA = 0))
    INTO :ptovta, :ptovtanom
    DO
    BEGIN
    SELECT VTACONTDIA, VTACONTMES, VTACREDDIA, VTACREDMES, VTATOTALDIA, VTATOTALMES,
        DEVOLDIA, DEVOLMES, VTANETADIA, VTANETAMES, VTAEXENTADIA, VTAGRAVA16DIA, VTAGRAVA10DIA,
        VTAEXENTAMES, VTAGRAVA16MES, VTAGRAVA10MES, IVA16DIA, IVA10DIA, IVA16MES, IVA10MES,
        INICIAL, INGCARTERA, INGOTROS, INGTOTAL, DESCTOSDIA, DESCTOSMES,
        EGRTOTAL, EGRPROV, EGRCLASE1, EGRCLASE2, EGROTROS, TRASLADO, TRASLADOR, CONSIGNA,
        formap1,  FORMAP2, FORMAP3, fORMAP4,  FORMAP5, CARTERA,
        formap1mes,  FORMAP2MES, FORMAP3MES, fORMAP4MES,  FORMAP5MES, CARTERAMES
        FROM cierre_diario(:fecha, :ptovta)
        into :VTACONTDIA, :VTACONTMES, :VTACREDDIA, :VTACREDMES, :VTATOTALDIA, :VTATOTALMES,
        :DEVOLDIA, :DEVOLMES, :VTANETADIA, :VTANETAMES, :VTAEXENTADIA, :VTAGRAVA16DIA, :VTAGRAVA10DIA,
        :VTAEXENTAMES, :VTAGRAVA16MES, :VTAGRAVA10MES, :IVA16DIA, :IVA10DIA, :IVA16MES, :IVA10MES,
        :INICIAL, :INGCARTERA, :INGOTROS, :INGTOTAL, :DESCTOSDIA, :DESCTOSMES,
        :EGRTOTAL, :EGRPROV, :EGRCLASE1, :EGRCLASE2, :EGROTROS, :TRASLADO, :traslador, :CONSIGNA,
        :FORMAP1, :FORMAP2, :FORMAP3, :FORMAP4, :FORMAP5, :CARTERA,
        :FORMAP1MES, :FORMAP2MES, :FORMAP3MES, :FORMAP4MES, :FORMAP5MES, :CARTERAMES;
    FINAL = INICIAL + INGTOTAL - EGRTOTAL - TRASLADO + traslador - CONSIGNA;
    SUSPEND;
    END
 $$IBE$$*/ SUSPEND;
end
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE RESUMEN_DIA(
    FECHA DATE,
    PTOINI INTEGER,
    PTOFIN INTEGER,
    AGENCIA INTEGER)
RETURNS (
    PTOVTA INTEGER,
    PTOVTANOM VARCHAR(60),
    VTACONTDIA NUMERIC(18,2),
    VTACONTMES NUMERIC(18,2),
    VTACREDDIA NUMERIC(18,2),
    VTACREDMES NUMERIC(18,2),
    VTATOTALDIA NUMERIC(18,2),
    VTATOTALMES NUMERIC(18,2),
    DEVOLDIA NUMERIC(18,2),
    DEVOLMES NUMERIC(18,2),
    VTANETADIA NUMERIC(18,2),
    VTANETAMES NUMERIC(18,2),
    VTAEXENTADIA NUMERIC(18,2),
    VTAGRAVA16DIA NUMERIC(18,2),
    VTAGRAVA10DIA NUMERIC(18,2),
    VTAEXENTAMES NUMERIC(18,2),
    VTAGRAVA16MES NUMERIC(18,2),
    VTAGRAVA10MES NUMERIC(18,2),
    IVA16DIA NUMERIC(18,2),
    IVA10DIA NUMERIC(18,2),
    IVA16MES NUMERIC(18,2),
    IVA10MES NUMERIC(18,2),
    FORMAP1 NUMERIC(18,2),
    FORMAP2 NUMERIC(18,2),
    FORMAP3 NUMERIC(18,2),
    FORMAP4 NUMERIC(18,2),
    FORMAP5 NUMERIC(18,2),
    CARTERA NUMERIC(18,2),
    FORMAP1MES NUMERIC(18,2),
    FORMAP2MES NUMERIC(18,2),
    FORMAP3MES NUMERIC(18,2),
    FORMAP4MES NUMERIC(18,2),
    FORMAP5MES NUMERIC(18,2),
    CARTERAMES NUMERIC(18,2),
    INICIAL NUMERIC(18,2),
    INGCARTERA NUMERIC(18,2),
    INGOTROS NUMERIC(18,2),
    INGTOTAL NUMERIC(18,2),
    DESCTOSDIA NUMERIC(18,2),
    DESCTOSMES NUMERIC(18,2),
    EGRTOTAL NUMERIC(18,2),
    EGRPROV NUMERIC(18,2),
    EGRCLASE1 NUMERIC(18,2),
    EGRCLASE2 NUMERIC(18,2),
    EGROTROS NUMERIC(18,2),
    TRASLADO NUMERIC(18,2),
    TRASLADOR NUMERIC(18,2),
    CONSIGNA NUMERIC(18,2),
    FINAL NUMERIC(18,2),
    CMPEXENTADIA NUMERIC(18,2),
    CMPGRAVA16DIA NUMERIC(18,2),
    CMPGRAVA10DIA NUMERIC(18,2),
    CMPEXENTAMES NUMERIC(18,2),
    CMPGRAVA16MES NUMERIC(18,2),
    CMPGRAVA10MES NUMERIC(18,2),
    CMPTOTALDIA NUMERIC(18,2),
    CMPTOTALMES NUMERIC(18,2),
    CMPCONTADODIA NUMERIC(18,2),
    CMPCREDITODIA NUMERIC(18,2),
    CMPCONTADOMES NUMERIC(18,2),
    CMPCREDITOMES NUMERIC(18,2),
    DEVCMPDIA NUMERIC(18,2),
    DEVCMPMES NUMERIC(18,2),
    CMPNETADIA NUMERIC(18,2),
    CMPNETAMES NUMERIC(18,2),
    IVAC16DIA NUMERIC(18,2),
    IVAC10DIA NUMERIC(18,2),
    IVAC16MES NUMERIC(18,2),
    IVAC10MES NUMERIC(18,2))
AS
declare variable FECAUX VARCHAR(10);
declare variable FECINI DATE;
begin
FECAUX = CAST (FECHA AS VARCHAR(10));
FECINI = SUBSTR(FECAUX, 1, 8) || '01';
SELECT SUM(FCDE_TOTAL-FCDE_IVAMONTO) FROM facturas_compras_detalle D, facturas_compra F, PREFIJOS P
    WHERE D.FACO_ID = F.FACO_ID AND FACO_FECHA = :FECHA AND FCDE_IVAPORC = 0 and FACO_ANULADO = 'N' AND
        P.pref_pre = F.pref_pre AND P.tido_cod = 21 AND ((:AGENCIA = 0) or (P.sucu_id = :AGENCIA))
    INTO :cmpexentadia;
if (cmpexentadia IS NULL) then
    cmpexentadia = 0;
SELECT SUM(FCDE_TOTAL-FCDE_IVAMONTO) FROM facturas_compras_detalle D, facturas_compra F, PREFIJOS P
    WHERE D.FACO_ID = F.FACO_ID AND FACO_FECHA >= :fecini AND FACO_FECHA <= :FECHA AND FCDE_IVAPORC = 0 and FACO_ANULADO = 'N' and
        P.pref_pre = F.pref_pre AND P.tido_cod = 21 AND ((:AGENCIA = 0) or (P.sucu_id = :AGENCIA))
    INTO :cmpexentames;
if (cmpexentames IS NULL) then
    cmpexentames = 0;
SELECT SUM(FCDE_TOTAL-FCDE_IVAMONTO), SUM(FCDE_IVAMONTO) from facturas_compras_detalle D, facturas_compra F, prefijos p
    WHERE D.FACO_ID = F.FACO_ID AND FACO_FECHA = :FECHA AND FCDE_IVAPORC = 16 and FACO_ANULADO = 'N' AND
        P.pref_pre = F.pref_pre AND P.tido_cod = 21 AND ((:AGENCIA = 0) or (P.sucu_id = :AGENCIA))
    INTO :cmpgrava16dia, :ivac16dia;
if (cmpgrava16dia IS NULL) then
    cmpgrava16dia = 0;
if (ivac16dia IS NULL) then
    ivac16dia = 0;
SELECT SUM(FCDE_TOTAL-FCDE_IVAMONTO), SUM(FCDE_IVAMONTO) from facturas_compras_detalle D, facturas_compra F, PREFIJOS P
    WHERE D.FACO_ID = F.FACO_ID AND FACO_FECHA >= :fecini AND FACO_FECHA <= :FECHA AND FCDE_IVAPORC = 16 and FACO_ANULADO = 'N' AND
        P.pref_pre = F.pref_pre AND P.tido_cod = 21 AND ((:AGENCIA = 0) or (P.sucu_id = :AGENCIA))
    INTO :cmpgrava16mes, :ivac16mes;
if (cmpgrava16mes IS NULL) then
    cmpgrava16mes = 0;
if (ivac16mes IS NULL) then
    ivac16mes = 0;
SELECT SUM(FCDE_TOTAL-FCDE_IVAMONTO), SUM(FCDE_IVAMONTO) FROM facturas_compras_detalle D, facturas_compra F, PREFIJOS P
    WHERE D.FACO_ID = F.FACO_ID AND FACO_FECHA = :FECHA AND FCDE_IVAPORC = 10 and FACO_ANULADO = 'N' AND
        P.pref_pre = F.pref_pre AND P.tido_cod = 21 AND ((:AGENCIA = 0) or (P.sucu_id = :AGENCIA))
    INTO :cmpgrava10dia, :ivac10dia;
if (cmpgrava10dia IS NULL) then
    cmpgrava10dia = 0;
if (ivac10dia IS NULL) then
    ivac10dia = 0;
SELECT SUM(FCDE_TOTAL-FCDE_IVAMONTO), SUM(FCDE_IVAMONTO) FROM facturas_compras_detalle D, facturas_compra F, PREFIJOS P
    WHERE D.FACO_ID = F.FACO_ID AND FACO_FECHA >= :fecini AND FACO_FECHA <= :FECHA AND FCDE_IVAPORC = 10 and FACO_ANULADO = 'N' AND
        P.pref_pre = F.pref_pre AND P.tido_cod = 21 AND ((:AGENCIA = 0) or (P.sucu_id = :AGENCIA))
    INTO :cmpgrava10mes, :ivac10mes;
if (cmpgrava10mes IS NULL) then
    cmpgrava10mes = 0;
if (ivac10mes IS NULL) then
    ivac10mes = 0;
SELECT SUM(FACO_TOTAL) FROM FACTURAS_COMPRA F, PREFIJOS P
    WHERE P.pref_pre = F.pref_pre AND P.tido_cod = 21 AND ((:AGENCIA = 0) or (P.sucu_id = :AGENCIA)) AND
    FACO_FECHA = :fecha AND FACO_ANULADO = 'N' INTO :cmptotaldia;
SELECT SUM(FACO_TOTAL) FROM FACTURAS_COMPRA F, PREFIJOS P
    WHERE P.pref_pre = F.pref_pre AND P.tido_cod = 21 AND ((:AGENCIA = 0) or (P.sucu_id = :AGENCIA)) AND
    FACO_FECHA >= :fecini AND FACO_FECHA <= :fecha AND FACO_ANULADO = 'N' INTO :cmptotalmes;
if (cmptotaldia IS NULL) then
    cmptotaldia = 0;
if (cmptotalmes IS NULL) then
    cmptotalmes = 0;
SELECT SUM(FACO_TOTAL) FROM FACTURAS_COMPRA F, PREFIJOS P, EGRESOS_DETALLE D, EGRESOS E
    WHERE P.pref_pre = F.pref_pre AND P.tido_cod = 21 AND ((:AGENCIA = 0) or (P.sucu_id = :AGENCIA)) AND
    D.egde_iddoc = F.faco_id AND D.egde_tipodoc = 21 AND E.egre_id = D.egre_id AND E.egre_fecha = :FECHA AND
    FACO_FECHA = :fecha AND FACO_ANULADO = 'N' INTO :cmpcontadodia;
SELECT SUM(FACO_TOTAL) FROM FACTURAS_COMPRA F, PREFIJOS P, EGRESOS_DETALLE D, EGRESOS E
    WHERE P.pref_pre = F.pref_pre AND P.tido_cod = 21 AND ((:AGENCIA = 0) or (P.sucu_id = :AGENCIA)) AND
    D.egde_iddoc = F.faco_id AND D.egde_tipodoc = 21 AND E.egre_id = D.egre_id AND E.egre_fecha = F.faco_fecha AND
    FACO_FECHA >= :fecini AND FACO_FECHA <= :fecha AND FACO_ANULADO = 'N' INTO :cmpcontadomes;
if (cmpcontadodia IS NULL) then
    cmpcontadodia = 0;
if (cmpcontadomes IS NULL) then
    cmpcontadomes = 0;
CMPCREDITODIA = cmptotaldia - cmpcontadodia;
cmpcreditomes = cmptotalmes - cmpcontadomes;
SELECT SUM(DVCO_TOTAL) FROM DEVOLUCIONES_COMPRAS
    WHERE DVCO_FECHA = :fecha AND DVCO_ANULADO = 'N' INTO :devcmpdia;
SELECT SUM(DVCO_TOTAL) FROM DEVOLUCIONES_COMPRAS
    WHERE DVCO_FECHA >= :fecini AND DVCO_FECHA <= :fecha AND DVCO_ANULADO = 'N' INTO :devcmpmes;
if (devcmpdia IS NULL) then
    devcmpdia = 0;
if (devcmpmes IS NULL) then
    devcmpmes = 0;
cmpnetadia = cmptotaldia - devcmpdia;
cmpnetames = cmptotalmes - devcmpmes;
FOR SELECT PTVT_ID, PTVT_NOM FROM PUNTO_VENTA WHERE PTVT_ID >= :ptoini AND PTVT_ID <= :ptofin AND ((SUCU_ID = :agencia) or (:AGENCIA = 0))
    INTO :ptovta, :ptovtanom
    DO
    BEGIN
    SELECT VTACONTDIA, VTACONTMES, VTACREDDIA, VTACREDMES, VTATOTALDIA, VTATOTALMES,
        DEVOLDIA, DEVOLMES, VTANETADIA, VTANETAMES, VTAEXENTADIA, VTAGRAVA16DIA, VTAGRAVA10DIA,
        VTAEXENTAMES, VTAGRAVA16MES, VTAGRAVA10MES, IVA16DIA, IVA10DIA, IVA16MES, IVA10MES,
        INICIAL, INGCARTERA, INGOTROS, INGTOTAL, DESCTOSDIA, DESCTOSMES,
        EGRTOTAL, EGRPROV, EGRCLASE1, EGRCLASE2, EGROTROS, TRASLADO, TRASLADOR, CONSIGNA,
        formap1,  FORMAP2, FORMAP3, fORMAP4,  FORMAP5, CARTERA,
        formap1mes,  FORMAP2MES, FORMAP3MES, fORMAP4MES,  FORMAP5MES, CARTERAMES
        FROM cierre_diario(:fecha, :ptovta)
        into :VTACONTDIA, :VTACONTMES, :VTACREDDIA, :VTACREDMES, :VTATOTALDIA, :VTATOTALMES,
        :DEVOLDIA, :DEVOLMES, :VTANETADIA, :VTANETAMES, :VTAEXENTADIA, :VTAGRAVA16DIA, :VTAGRAVA10DIA,
        :VTAEXENTAMES, :VTAGRAVA16MES, :VTAGRAVA10MES, :IVA16DIA, :IVA10DIA, :IVA16MES, :IVA10MES,
        :INICIAL, :INGCARTERA, :INGOTROS, :INGTOTAL, :DESCTOSDIA, :DESCTOSMES,
        :EGRTOTAL, :EGRPROV, :EGRCLASE1, :EGRCLASE2, :EGROTROS, :TRASLADO, :traslador, :CONSIGNA,
        :FORMAP1, :FORMAP2, :FORMAP3, :FORMAP4, :FORMAP5, :CARTERA,
        :FORMAP1MES, :FORMAP2MES, :FORMAP3MES, :FORMAP4MES, :FORMAP5MES, :CARTERAMES;
    FINAL = INICIAL + INGTOTAL - EGRTOTAL - TRASLADO + traslador - CONSIGNA;
    SUSPEND;
    END
end

^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER PROCEDURE CONCILIA_VENTAS(
    FECINI DATE,
    FECFIN DATE,
    SOLODIF CHAR(1),
    NULO1 CHAR(1),
    NULO2 CHAR(2))
RETURNS (
    IDF INTEGER,
    IDC INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    COMPROBA VARCHAR(3),
    NUMCNT VARCHAR(6),
    CTAVENTAS VARCHAR(20),
    MONTO NUMERIC(18,2),
    MONTOC NUMERIC(18,2))
AS
declare variable dig integer;
declare variable mercancia numeric(18,2);
declare variable fomento varchar(2);
declare variable vrconsumo numeric(18,2);
declare variable factor double precision;
declare variable vrdto numeric(18,2);
declare variable vradic numeric(18,2);
declare variable vrsubt numeric(18,2);
declare variable vriva numeric(18,2);
declare variable vrtotal numeric(18,2);
declare variable vrextra numeric(18,2);
declare variable ventas char(1);
declare variable ctadto varchar(20);
begin
SELECT CAST(CONF_VALOR AS INTEGER) FROM CONFIGURACION WHERE CONF_MODULO = 'FACTURACION' AND
    CONF_CATEGORIA = 'GENERAL' AND CONF_PROPIEDAD = 'REDONDEO AL MULTIPLO DE DIEZ EN TOTALES' INTO :DIG;
EXECUTE PROCEDURE LEE_CONFIGURACION('COMPRAS', 'FACTURAS', 'USAR IMPOCONSUMO COMO PORCENTAJE DE FOMENTO') returning_values (FOMENTO);

for select fact_id, pref_pre, fact_numero, fact_fecha, FACT_DTOMONTO, FACT_ADICIONAL, FACT_IVAMONTO, FACT_EXTRA, FACT_TOTAL
    from facturas f
    where fact_fecha >= :fecini and fact_fecha <= :fecfin and fact_anulado = 'N'
    into :idf, :pref, :numero, :fecha, :VRDTO, :VRADIC, :VRIVA, :VREXTRA, :VRTOTAL
    do
    begin
    idc = 0;
    montoc = 0;
    numcnt = '';
    select enco_consec, TICO_COD, ENCO_NUMERO
    from comprobante_encabezado where enco_idref = :idf and enco_tiporef = 31
    into :idc, :comproba, :numcnt;

    SELECT SUM (FADE_CONSUMO) FROM FACTURAS_DETALLE WHERE FACT_ID = :idf INTO MERCANCIA;
    VRSUBT = VRTOTAL - VREXTRA - VRIVA - MERCANCIA; /* BASE DE RETEFTE Y RETEICA */
    MERCANCIA = VRSUBT - VRADIC + VRDTO;
    if (MERCANCIA <> 0) then
        FACTOR = CAST(VRSUBT AS DOUBLE PRECISION) / CAST(MERCANCIA AS DOUBLE PRECISION);
    ELSE
        FACTOR = 1;
    SELECT MAX(INVE_VENTAS), MAX(INVE_CTAVENTAS), MAX(INVE_CTADTO) FROM INTERFAZ_VENTAS WHERE TIDO_COD = 31 AND PREF_PRE = :pref
        INTO :VENTAS, :CTAVENTAS, :CTADTO;
    if (VENTAS = 'A') then
        BEGIN
        FOR SELECT MAX(COAR_CTAVNT), SUM(FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), SUM(FADE_CONSUMO)
            FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_DETALLE F
            WHERE F.FACT_ID = :idf AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
            GROUP BY COAR_CTAVNT
            INTO :CTAVENTAS, :MONTO, :VRCONSUMO
            DO
            BEGIN
            if (FOMENTO = 'SI') then
                MONTO = MONTO + VRCONSUMO;
            if ((CTADTO IS NULL) OR (CTADTO = '')) then
                MONTO = MONTO * FACTOR;
            execute procedure redondee(MONTO, DIG) returning_values (MONTO);
            select SUM(code_credito - code_debito) from comprobante_detalle
                where enco_consec = :idc and cuen_cod = :ctaventas into MONTOC;
            if (montoc is null) then
                montoc = 0;
            if ((SOLODIF = 'N') or (MONTO <> MONTOC)) then
                SUSPEND;
            END
        END
    if (VENTAS = 'K') then
        BEGIN
        SELECT SUM(FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), SUM (FADE_CONSUMO)
            FROM FACTURAS_DETALLE F
            WHERE F.FACT_ID = :idf AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
            INTO :MONTO, :VRCONSUMO;
        if (FOMENTO = 'SI') then
            MONTO = MONTO + VRCONSUMO;
        if ((CTADTO IS NULL) OR (CTADTO = '')) then
            MONTO = MONTO * FACTOR;
        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
        select SUM(code_credito-code_debito) from comprobante_detalle
            where enco_consec = :idc and cuen_cod = :ctaventas into MONTOC;
        if (montoc is null) then
            montoc = 0;
        if ((SOLODIF = 'N') or (MONTO <> MONTOC)) then
            SUSPEND;
        END
    end
end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER PROCEDURE CONTABIL_FACTURAS_CONTADO(
    FECFAC DATE,
    NIT VARCHAR(20),
    PREF VARCHAR(4),
    PTVTA INTEGER,
    IDINTER INTEGER)
RETURNS (
    ERROR INTEGER,
    VER CHAR(1),
    IDC INTEGER)
AS
declare variable num varchar(8);
declare variable numero varchar(10);
declare variable fecha char(8);
declare variable conc char(120);
declare variable vence char(8);
declare variable vrdto numeric(18,2);
declare variable vradic numeric(18,2);
declare variable vrsubt numeric(18,2);
declare variable vriva numeric(18,2);
declare variable prtfte numeric(9,2);
declare variable vrrtfte numeric(18,2);
declare variable vrrtiva numeric(18,2);
declare variable prtica numeric(9,2);
declare variable vrrtica numeric(18,2);
declare variable vrtotal numeric(18,2);
declare variable vrextra numeric(18,2);
declare variable tipocomp varchar(3);
declare variable prefcont varchar(4);
declare variable ventas char(1);
declare variable ctaventas varchar(20);
declare variable iva char(1);
declare variable ctaiva varchar(20);
declare variable consumo char(1);
declare variable ctaconsumo varchar(20);
declare variable cartera char(1);
declare variable ctacartera varchar(20);
declare variable rtfte char(1);
declare variable ctartfte varchar(20);
declare variable rtiva char(1);
declare variable ctartiva varchar(20);
declare variable rtica char(1);
declare variable ctartica varchar(20);
declare variable inven char(1);
declare variable ctainven varchar(20);
declare variable costos char(1);
declare variable ctacostos varchar(20);
declare variable ctadto varchar(20);
declare variable ctaadic varchar(20);
declare variable ctaextra varchar(20);
declare variable existe char(1);
declare variable cuenta varchar(20);
declare variable monto numeric(18,2);
declare variable tipocuen char(1);
declare variable nombre varchar(60);
declare variable proy varchar(4);
declare variable centro varchar(4);
declare variable porc numeric(5,2);
declare variable debito numeric(18,2);
declare variable credito numeric(18,2);
declare variable nroi integer;
declare variable art varchar(15);
declare variable impinc char(1);
declare variable imptos numeric(18,2);
declare variable suma numeric(18,2);
declare variable porciva numeric(9,2);
declare variable tctaclien varchar(20);
declare variable tctaventa varchar(20);
declare variable tctartfte varchar(20);
declare variable tctartiva varchar(20);
declare variable tctartica varchar(20);
declare variable ctadic varchar(20);
declare variable baseadic varchar(20);
declare variable porcadic numeric(5,2);
declare variable valoradic numeric(18,2);
declare variable dbadic char(1);
declare variable ptovta integer;
declare variable dig integer;
declare variable mercancia numeric(18,2);
declare variable factor double precision;
declare variable cent char(1);
BEGIN
/* BUSQUE LA INTERFACE */
EXISTE = 'N';
SELECT 'S', TICO_COD, PRCO_PRE, INVE_VENTAS, INVE_IVA, INVE_CONSUMO, INVE_CARTERA, INVE_RTFTE, INVE_RTIVA, INVE_RTICA, INVE_COSTO, INVE_INVEN, INVE_CTAVENTAS, INVE_CTAIVA, INVE_CTACONSUMO, INVE_CTADTO, INVE_CTAADIC, INVE_CTAEXTRA, INVE_CTACARTERA, INVE_CTARTFTE, INVE_CTARTIVA, INVE_CTARTICA, INVE_CTAINVEN, INVE_CTACOSTOS, INVE_CONFIRMAR, INVE_CENTRO
    FROM INTERFAZ_VENTAS
    WHERE INVE_ID = :IDINTER
    INTO :EXISTE, :TIPOCOMP, :PREFCONT, :VENTAS, :IVA, :CONSUMO, :CARTERA, :RTFTE, :RTIVA, :RTICA, :COSTOS, :INVEN, :CTAVENTAS, :CTAIVA, :CTACONSUMO, :CTADTO, :CTAADIC, :CTAEXTRA, :CTACARTERA, :CTARTFTE, :CTARTIVA, :CTARTICA, :CTAINVEN, :CTACOSTOS, :VER, :CENT;
if (EXISTE = 'S') then
  BEGIN
  /* BORRE CUALQUEIR CONTABILIZACION PREVIA */
/*  DELETE FROM CONTABILIZACION WHERE CNTB_TIPOREF = 31 AND CNTB_IDREF = 0;
  /* BUSQUE EL CENTRO DEL PUNTO, LA BODEGA, O EL PREFIJO  */
  IF (CENT = 'B') THEN
    SELECT B.BODE_CENTRO, B.BODE_PROY FROM BODEGA B, PUNTO_VENTA P
        WHERE B.BODE_COD = P.BODE_COD AND P.ptvt_id = :ptvta INTO :CENTRO, :PROY;
  IF (CENT = 'V') THEN
    SELECT MAX(V.CENT_COD), MAX(V.PROY_COD) FROM VENDEDORES V
        WHERE V.PTVT_ID = :PTVTA INTO :CENTRO, :PROY;
  IF (CENT = 'P') THEN
    SELECT P.PREF_PROY, P.PREF_CENTRO FROM PREFIJOS P
        WHERE P.PREF_PRE = :PREF AND P.TIDO_COD = 31 INTO :CENTRO, :PROY;
  /* TRAIGA LOS DATOS DEL CLIENTE */
  SELECT TERC_NOM, TERC_CTARTFTE, TERC_CTARTIVA, TERC_CTARTICA, TERC_CTAVENTA, TERC_CTACLIENTE
        FROM TERCEROS T WHERE TERC_NIT = :NIT
        INTO :NOMBRE, TCTARTFTE, TCTARTIVA, TCTARTICA, TCTAVENTA, TCTACLIEN;
  SELECT SUM(FACT_DTOMONTO), SUM(FACT_ADICIONAL), SUM(FACT_IVAMONTO), SUM(FACT_EXTRA), SUM(FACT_TOTAL), SUM(FACT_RTFTEMONTO), SUM(FACT_RTIVAMONTO), SUM(FACT_RTICAMONTO), MAX(FACT_IVAINC)
        FROM FACTURAS F WHERE FACT_FECHA = :FECFAC AND FACT_ANULADO = 'N' AND PTVT_ID = :ptvta AND PREF_PRE = :PREF
        INTO :VRDTO, :VRADIC, :VRIVA, :VREXTRA, :VRTOTAL, :VRRTFTE, :VRRTIVA, :VRRTICA, :impinc;
  VRSUBT = VRTOTAL - VREXTRA - VRIVA; /* BASE DE RETEFTE Y RETEICA */
  MERCANCIA = VRSUBT - VRADIC + VRDTO;
  EXECUTE PROCEDURE FECHA_A_CONTA(:FECFAC) returning_values (:FECHA);
  VENCE = FECHA;
  /* REGISTRE EL ENCABEZADO CONTABLE */
  IDC = GEN_ID(ID_CONTABILIZA, 1);
  CONC = 'RESUMEN VENTAS ' || FECHA;
  NUM = SUBSTR(FECHA, 3, 8);
  INSERT INTO CONTABILIZACION (CNTB_ID, CNTB_TIPOCOMP, CNTB_PREFCNT, CNTB_NUMERO, CNTB_FECHA, CNTB_CONCEPTO, CNTB_REF, CNTB_TIPOREF, CNTB_IDREF, CNTB_PREFREF, CNTB_NUMREF, CNTB_PROCESADO)
        VALUES (:IDC, :TIPOCOMP, :PREFCONT, :NUM, :FECHA, :CONC, '', 0, 0, :PREF, :NUM, 'N');
  NROI = 0;
  SUMA = 0;
  ERROR = 0;
  /* SI NO HAY CUENTA DE DESCUENTO NI ADICIONAL CALCULE UN FACTOR PARA LAS VENTAS Y EL IVA */
  if (MERCANCIA <> 0) then
    FACTOR = CAST(VRSUBT AS DOUBLE PRECISION) / CAST(MERCANCIA AS DOUBLE PRECISION);
  ELSE
    FACTOR = 1;
  /* TRAIGA EL NUMERO DE DIGITOS PARA EL REDONDEO */
  SELECT CAST(CONF_VALOR AS INTEGER) FROM CONFIGURACION WHERE CONF_MODULO = 'FACTURACION' AND
        CONF_CATEGORIA = 'GENERAL' AND CONF_PROPIEDAD = 'REDONDEO AL MULTIPLO DE DIEZ EN TOTALES' INTO :DIG;
  /* CUENTAS DE VENTAS */
  if (VENTAS = 'A') then
        BEGIN
        FOR SELECT MAX(COAR_CTAVNT), SUM(CAST(FADE_CANT AS DOUBLE PRECISION) * (FADE_PRUNIT-FADE_DTOMONTO)), SUM(FADE_IVAMONTO+FADE_CONSUMO)
            FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_DETALLE FD, FACTURAS F
            WHERE F.FACT_ID = FD.FACT_ID AND FACT_FECHA = :FECFAC AND FD.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND F.PREF_PRE = :PREF AND F.PTVT_ID = :PTVTA AND FACT_ANULADO = 'N' AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
            GROUP BY COAR_CTAVNT
            INTO :CTAVENTAS, :MONTO, :IMPTOS
            DO
            BEGIN
            if (IMPINC = 'S') then
                MONTO = MONTO - IMPTOS;
            if ((CTADTO IS NULL) OR (CTADTO = '')) then
                MONTO = MONTO * FACTOR;
            execute procedure redondee(MONTO, DIG) returning_values (MONTO);
            if (MONTO <> 0) then
                BEGIN
                CUENTA = NULL;
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :CTAVENTAS INTO :CUENTA, :TIPOCUEN;
                if (CUENTA IS NULL) then
                    begin
                    EXECUTE PROCEDURE ERROR (31, 0, :CTAVENTAS, 2);
                    CUENTA = CTAVENTAS;
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT FD.ARTI_COD, (CAST(FADE_CANT AS DOUBLE PRECISION) * (FADE_PRUNIT-FADE_DTOMONTO)), (FADE_IVAMONTO+FADE_CONSUMO)
                        FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_DETALLE FD, FACTURAS F
                        WHERE F.FACT_ID = FD.FACT_ID AND FACT_FECHA = :FECFAC AND F.PREF_PRE = :PREF AND F.PTVT_ID = :PTVTA AND FD.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTAINV = :CUENTA AND FACT_ANULADO = 'N' AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
                        INTO :ART, :MONTO, :IMPTOS
                    DO
                        BEGIN
                        if (IMPINC = 'S') then
                            MONTO = MONTO - IMPTOS;
                        if ((CTADTO IS NULL) OR (CTADTO = '')) then
                            MONTO = MONTO * FACTOR;
                        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                        if (MONTO <> 0) then
                            BEGIN
                            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                            NROI = NROI + 1;
                            SUMA = SUMA - MONTO;
                            END
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    NROI = NROI + 1;
                    SUMA = SUMA - MONTO;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA - MONTO;
                    END
                END /* MONTO <> 0 */
            END /* FOR */
        END /* VENTAS X ARTICULO */
     IF ((VENTAS = 'C') OR (VENTAS = 'K')) THEN
        BEGIN
        IF (VENTAS = 'C') THEN
            CTAVENTAS = TCTAVENTA;
        SELECT SUM(CAST(FADE_CANT AS DOUBLE PRECISION) * (FADE_PRUNIT-FADE_DTOMONTO)), SUM(FADE_IVAMONTO+FADE_CONSUMO)
            FROM FACTURAS_DETALLE FD, FACTURAS F
            WHERE F.FACT_ID = FD.FACT_ID AND FACT_FECHA = :FECFAC AND F.PREF_PRE = :PREF AND F.PTVT_ID = :PTVTA AND FACT_ANULADO = 'N' AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
            INTO :MONTO, :IMPTOS;
        if (IMPINC = 'S') then
            MONTO = MONTO - IMPTOS;
        if ((CTADTO IS NULL) OR (CTADTO = '')) then
            MONTO = MONTO * FACTOR;
        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
        if (MONTO <> 0) then
            BEGIN
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTAVENTAS INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERROR (31, 0, :CTAVENTAS, 2);
                CUENTA = CTAVENTAS;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT FD.ARTI_COD, (CAST(FADE_CANT AS DOUBLE PRECISION) * (FADE_PRUNIT-FADE_DTOMONTO)), (FADE_IVAMONTO+FADE_CONSUMO)
                    FROM /*ARTICULO A,*/ FACTURAS_DETALLE FD, FACTURAS F
                    WHERE F.FACT_ID = FD.FACT_ID AND FACT_FECHA = :FECFAC AND F.PREF_PRE = :PREF AND F.PTVT_ID = :PTVTA AND FACT_ANULADO = 'N' AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
                    INTO :ART, :MONTO, :IMPTOS
                    DO
                    BEGIN
                    if (IMPINC = 'S') then
                        MONTO = MONTO - IMPTOS;
                    if ((CTADTO IS NULL) OR (CTADTO = '')) then
                        MONTO = MONTO * FACTOR;
                    execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                    if (MONTO <> 0) then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        SUMA = SUMA - MONTO;
                        END
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - MONTO;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - MONTO;
                END
            END /* MONTO <> 0 */
        END /* VENTAS DE CLIENTE O CONSTANTE */
    /* EL IVA EN VENTAS */
    if (IVA = 'A') then
        BEGIN
        FOR SELECT MAX(COAR_CTAIVAV), SUM(FADE_IVAMONTO), SUM(CAST(FADE_CANT AS DOUBLE PRECISION) * (FADE_PRUNIT-FADE_DTOMONTO)), sum(FADE_CONSUMO)
            FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_DETALLE FD, FACTURAS F
            WHERE F.FACT_ID = FD.FACT_ID AND FACT_FECHA = :FECFAC AND F.PREF_PRE = :PREF AND F.PTVT_ID = :PTVTA AND FD.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND FACT_ANULADO = 'N' AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
            GROUP BY COAR_CTAIVAV
            INTO :CTAIVA, :IMPTOS, :MONTO, :VALORADIC
        DO
            BEGIN
            if (IMPINC = 'S') then
                MONTO = MONTO - IMPTOS - VALORADIC;
            MONTO = MONTO * -1;
            MONTO = MONTO * FACTOR;
            IMPTOS = IMPTOS * FACTOR;
            execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
            execute procedure redondee(MONTO, DIG) returning_values (MONTO);
            if (IMPTOS <> 0) then
                BEGIN
                CUENTA = NULL;
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :CTAIVA INTO :CUENTA, :TIPOCUEN;
                if (CUENTA IS NULL) then
                    begin
                    EXECUTE PROCEDURE ERROR (31, 0, :CTAIVA, 2);
                    CUENTA = CTAIVA;
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT FD.ARTI_COD, FADE_IVAMONTO, (CAST(FADE_CANT AS DOUBLE PRECISION) * (FADE_PRUNIT-FADE_DTOMONTO)), TAIV_PORC, FADE_CONSUMO
                        FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_DETALLE FD, FACTURAS F, TARIFA_IVA T
                        WHERE F.FACT_ID = FD.FACT_ID AND FACT_FECHA = :FECFAC AND F.PREF_PRE = :PREF AND F.PTVT_ID = :PTVTA AND FD.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTAIVAV = :CUENTA AND A.TAIV_COD = T.TAIV_COD AND FACT_ANULADO = 'N' AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
                        INTO :ART, :IMPTOS, :MONTO, :PORCIVA, :VALORADIC
                    DO
                        BEGIN
                        if (IMPINC = 'S') then
                            MONTO = MONTO - IMPTOS - VALORADIC;
                        MONTO = MONTO * -1;
                        MONTO = MONTO * FACTOR;
                        IMPTOS = IMPTOS * FACTOR;
                        execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                        if (IMPTOS <> 0) then
                            BEGIN
                            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, :MONTO, :PORCIVA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                            NROI = NROI + 1;
                            SUMA = SUMA + DEBITO - CREDITO;
                            END
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, :MONTO, ABS(:IMPTOS*100/:MONTO), :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    NROI = NROI + 1;
                    SUMA = SUMA - IMPTOS;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, :MONTO, ABS(:IMPTOS*100/:MONTO), :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA - IMPTOS;
                    END
                END   /* IMPTOS <> 0 */
            END /* FOR */
        END /* IVA X ARTICULO */
    if (IVA = 'K') then /* IVA EN CTA CONSTANTE */
        BEGIN
        SELECT SUM(FADE_IVAMONTO), SUM(CAST(FADE_CANT AS DOUBLE PRECISION) * (FADE_PRUNIT-FADE_DTOMONTO)), SUM(FADE_CONSUMO)
            FROM FACTURAS_DETALLE FD, FACTURAS F
            WHERE F.FACT_ID = FD.FACT_ID AND FACT_FECHA = :FECFAC AND F.PREF_PRE = :PREF AND F.PTVT_ID = :PTVTA AND FACT_ANULADO = 'N' AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
            INTO :IMPTOS, :MONTO, :valoradic;
        if (IMPINC = 'S') then
            MONTO = MONTO - IMPTOS - VALORADIC;
        MONTO = MONTO * -1;
        MONTO = MONTO * FACTOR;
        IMPTOS = IMPTOS * FACTOR;
        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
        execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
        if (IMPTOS <> 0) then
            BEGIN
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTAIVA INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERROR (31, 0, :CTAIVA, 2);
                CUENTA = CTAIVA;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT FD.ARTI_COD, (CAST(FADE_CANT AS DOUBLE PRECISION) * (FADE_PRUNIT-FADE_DTOMONTO)), FADE_IVAMONTO, TAIV_PORC, FADE_CONSUMO
                    FROM ARTICULO A, FACTURAS_DETALLE FD, FACTURAS F, TARIFA_IVA T
                    WHERE F.FACT_ID = FD.FACT_ID AND FACT_FECHA = :FECFAC AND F.PREF_PRE = :PREF AND F.PTVT_ID = :PTVTA AND FD.arti_cod = A.arti_cod AND T.TAIV_COD=A.TAIV_COD AND FACT_ANULADO = 'N' AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
                    INTO :ART, :MONTO, :IMPTOS, :PORCIVA, :VALORADIC
                    DO
                    BEGIN
                    if (IMPINC = 'S') then
                        MONTO = MONTO - IMPTOS - VALORADIC;
                    MONTO = MONTO * -1;
                    MONTO = MONTO * FACTOR;
                    IMPTOS = IMPTOS * FACTOR;
                    execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                    execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                    if (IMPTOS <> 0) then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', 0, :IMPTOS, :MONTO, :PORCIVA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        SUMA = SUMA - IMPTOS;
                        END
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', 0, :IMPTOS, :MONTO, ABS(:IMPTOS*100/:MONTO), :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - IMPTOS;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', 0, :IMPTOS, :MONTO, ABS(:IMPTOS*100/:MONTO), :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - IMPTOS;
                END
            END /* IMPTOS <> 0 */
        END /* IVA EN CTA CONSTANTE */
    /* EL IMPOCONSUMO */
    if (CONSUMO = 'A') then
        BEGIN
        FOR SELECT MAX(COAR_CTACONS), SUM(FADE_CONSUMO)
            FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_DETALLE FD, FACTURAS F
            WHERE F.FACT_ID = FD.FACT_ID AND FACT_FECHA = :FECFAC AND F.PREF_PRE = :PREF AND F.PTVT_ID = :PTVTA AND FD.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND FACT_ANULADO = 'N' AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
            GROUP BY COAR_CTACONS
            INTO :CTACONSUMO, :IMPTOS
        DO
            BEGIN
            execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
            if (IMPTOS <> 0) then
                BEGIN
                CUENTA = NULL;
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :CTACONSUMO INTO :CUENTA, :TIPOCUEN;
                if (CUENTA IS NULL) then
                    begin
                    EXECUTE PROCEDURE ERROR (31, 0, :CTACONSUMO, 2);
                    CUENTA = CTACONSUMO;
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, REGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT FD.ARTI_COD, FADE_CONSUMO
                        FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_DETALLE FD, FACTURAS F
                        WHERE F.FACT_ID = FD.FACT_ID AND FACT_FECHA = :FECFAC AND F.PREF_PRE = :PREF AND F.PTVT_ID = :PTVTA AND FD.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTACONS = :CUENTA AND FACT_ANULADO = 'N' AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
                        INTO :ART, :IMPTOS
                    DO
                        BEGIN
                        execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                        if (IMPTOS <> 0) then
                            BEGIN
                            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                            NROI = NROI + 1;
                            SUMA = SUMA - IMPTOS;
                            END
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    NROI = NROI + 1;
                    SUMA = SUMA - IMPTOS;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA - CREDITO;
                    END
                END /* IMPTOS <> 0 */
            END /* FOR */
        END /* CONSUMO X ARTICULO */
    if (CONSUMO = 'K') then /* CONSUMO EN CTA CONSTANTE */
        BEGIN
        SELECT SUM(FADE_CONSUMO)
            FROM FACTURAS_DETALLE FD, FACTURAS F
            WHERE F.FACT_ID = FD.FACT_ID AND FACT_FECHA = :FECFAC AND F.PREF_PRE = :PREF AND F.PTVT_ID = :PTVTA AND FACT_ANULADO = 'N' AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
            INTO :IMPTOS;
        execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
        if (IMPTOS <> 0) then
            BEGIN
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTACONSUMO INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERROR (31, 0, :CTACONSUMO, 2);
                CUENTA = CTACONSUMO;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT FD.ARTI_COD, FADE_CONSUMO
                    FROM /*ARTICULO A,*/ FACTURAS_DETALLE FD, FACTURAS F
                    WHERE F.FACT_ID = FD.FACT_ID AND FACT_FECHA = :FECFAC AND F.PREF_PRE = :PREF AND F.PTVT_ID = :PTVTA AND FACT_ANULADO = 'N' AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
                    INTO :ART, :IMPTOS
                    DO
                    BEGIN
                    execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                    if (IMPTOS <> 0) then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CTACONSUMO, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        SUMA = SUMA - IMPTOS;
                        END
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTACONSUMO, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - IMPTOS;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTACONSUMO, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - IMPTOS;
                END
            END /* IMPTOS <> 0 */
        END /* CONSUMO EN CTA CONSTANTE */
    /* DESCUENTO */
    if ((CTADTO IS NOT NULL) AND (CTADTO <> '')) then
        BEGIN
        execute procedure redondee(VRDTO, DIG) returning_values (VRDTO);
        if (VRDTO <> 0) then
            BEGIN
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTADTO INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERROR (31, 0, :CTADTO, 2);
                CUENTA = CTADTO;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                begin
                EXECUTE PROCEDURE ERROR (31, 0, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRDTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA + VRDTO;
                END
            if (TIPOCUEN = 'N') then
                    BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRDTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA + VRDTO;
                END
            END
        END /* DESCUENTO */
    /* VALOR ADIC */
    if ((CTAADIC IS NOT NULL) AND (CTAADIC <> '')) then
        BEGIN
        execute procedure redondee(VRADIC, DIG) returning_values (VRADIC);
        if (VRADIC <> 0) THEN
            BEGIN
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTAADIC INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERROR (31, 0, :CTAADIC, 2);
                CUENTA = CTAADIC;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                begin
                EXECUTE PROCEDURE ERROR (31, 0, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRADIC, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - VRADIC;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRADIC, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - VRADIC;
                END
            END
        END /* VR. ADIC */
    /* VALOR EXTRA */
    if ((CTAEXTRA IS NOT NULL) AND (CTAEXTRA <> '')) THEN
        BEGIN
        execute procedure redondee(VREXTRA, DIG) returning_values (VREXTRA);
        if (VREXTRA <> 0) THEN
            BEGIN
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTAEXTRA INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERROR (31, 0, :CTAEXTRA, 2);
                CUENTA = CTAEXTRA;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                begin
                EXECUTE PROCEDURE ERROR (31, 0, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VREXTRA, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - VREXTRA;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VREXTRA, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - VREXTRA;
                END
            END
        END /* VR. EXTRA */
    /* RETENCION FUENTE */
    if ((RTFTE = 'C') or (RTFTE = 'K')) then
      BEGIN
      execute procedure redondee(VRRTFTE, DIG) returning_values (VRRTFTE);
      if (VRRTFTE <> 0) then
        BEGIN
        if (RTFTE = 'C') then
            CTARTFTE = TCTARTFTE;
        CUENTA = NULL;
        SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
            WHERE CUEN_COD = :CTARTFTE INTO :CUENTA, :TIPOCUEN;
        if (CUENTA IS NULL) then
            begin
            EXECUTE PROCEDURE ERROR (31, 0, :CTARTFTE, 2);
            CUENTA = CTARTFTE;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            begin
            EXECUTE PROCEDURE ERROR (31, 0, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :VRSUBT, :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTFTE;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :VRSUBT, :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTFTE;
            END
        END /* RTFTE */
      END
    /* RETENCION IVA */
    if ((RTIVA = 'C') or (RTIVA = 'K')) then
      BEGIN
      execute procedure redondee(VRRTIVA, DIG) returning_values (VRRTIVA);
      if (VRRTIVA <> 0) then
        BEGIN
        if (RTIVA = 'C') then
            CTARTIVA = TCTARTIVA;
        CUENTA = NULL;
        SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
            WHERE CUEN_COD = :CTARTIVA INTO :CUENTA, :TIPOCUEN;
        if (CUENTA IS NULL) then
            begin
            EXECUTE PROCEDURE ERROR (31, 0, :CTARTIVA, 2);
            CUENTA = CTARTIVA;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            begin
            EXECUTE PROCEDURE ERROR (31, 0, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTIVA, 0, :VRIVA, :PORC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTIVA;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTIVA, 0, :VRIVA, :PORC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTIVA;
            END
        END /* RTIVA */
      END
    /* RETENCION DE ICA */
    if ((RTICA = 'C') or (RTICA = 'K')) then
      BEGIN
      execute procedure redondee(VRRTICA, DIG) returning_values (VRRTICA);
      if (VRRTICA <> 0) then
        BEGIN
        if (RTICA = 'C') then
            CTARTICA = TCTARTICA;
        CUENTA = NULL;
        SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
            WHERE CUEN_COD = :CTARTICA INTO :CUENTA, :TIPOCUEN;
        if (CUENTA IS NULL) then
            begin
            EXECUTE PROCEDURE ERROR (31, 0, :CTARTICA, 2);
            CUENTA = CTARTICA;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            begin
            EXECUTE PROCEDURE ERROR (31, 0, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTICA, 0, :VRSUBT, :PRTICA, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTICA;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTICA, 0, :VRSUBT, :PRTICA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTICA;
            END
        END /* RTICA */
      END
    /* CIERRE EL COMPROBANTE CONTRA LA CUENTA DEL TERCERO O LA CONSTANTE */
    if ((SUMA <> 0) and ((CARTERA = 'C') or (CARTERA = 'K') or (CARTERA = 'J'))) then
        BEGIN
        if (SUMA < 0) then
            BEGIN
            DEBITO = SUMA * -1;
            CREDITO = 0;
            END
        ELSE
            BEGIN
            DEBITO = 0;
            CREDITO = SUMA;
            END
        if (CARTERA = 'C') then
            CTACARTERA = TCTACLIEN;
        if (CARTERA = 'J') then
            BEGIN
            /* BUSQUE LA CUENTA DE LA CAJA */
            SELECT CAJA_CUENTA FROM CAJAS C, PUNTO_VENTA P
                WHERE P.CAJA_ID = C.CAJA_ID AND PTVT_ID = :PTOVTA
                INTO :CTACARTERA;
            END
        CUENTA = NULL;
        SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
            WHERE CUEN_COD = :CTACARTERA INTO :CUENTA, :TIPOCUEN;
        if (CUENTA IS NULL) then
            begin
            EXECUTE PROCEDURE ERROR (31, 0, :CTACARTERA, 2);
            CUENTA = CTACARTERA;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            begin
            EXECUTE PROCEDURE ERROR (31, 0, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'C') then
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :DEBITO, :CREDITO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
        if (TIPOCUEN = 'N') then
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :DEBITO, :CREDITO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
        NROI = NROI + 1;
        END /* SUMA EN CARTERA */
    /* CALCULE LOS COSTOS */
    EXECUTE PROCEDURE costo_en_ventas_contado(:fecfac,  :pref, :ptvta);
    if (COSTOS = 'A') then
        BEGIN
        FOR SELECT MAX(CTACOS), SUM(COSTO)
            FROM COSTO_VENTAS
            GROUP BY CTACOS
            INTO :CTACOSTOS, :MONTO
        DO
            BEGIN
            if (MONTO <> 0) then
                BEGIN
                CUENTA = NULL;
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :CTACOSTOS INTO :CUENTA, :TIPOCUEN;
                IF (CUENTA IS NULL) THEN
                    begin
                    EXECUTE PROCEDURE ERROR (31, 0, :CTACOSTOS, 2);
                    CUENTA = CTARTFTE;
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT ARTI_COD, CANT * COSTO
                        FROM COSTO_VENTAS
                        WHERE CTACOS = :CUENTA
                        INTO :ART, :MONTO
                    DO
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    NROI = NROI + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    END
                END /* MONTO <> 0 */
            END /* FOR */
        END /* COSTOS */
    if (COSTOS = 'K') then
        BEGIN
        SELECT SUM(COSTO)
            FROM COSTO_VENTAS
            INTO :MONTO;
        if (MONTO <> 0) then
            BEGIN
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTACOSTOS INTO :CUENTA, :TIPOCUEN;
            IF (CUENTA IS NULL) THEN
                begin
                EXECUTE PROCEDURE ERROR (31, 0, :CTACOSTOS, 2);
                CUENTA = CTARTFTE;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, REGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT ARTI_COD, CANT * COSTO
                    FROM COSTO_VENTAS
                    INTO :ART, :MONTO
                DO
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTACOSTOS, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                    NROI = NROI + 1;
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTACOSTOS, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTACOSTOS, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                END
            END /* MONTO <> 0 */
        END /* COSTOS = K */
    if (INVEN = 'A') then
        BEGIN
        FOR SELECT MAX(CTAINV), SUM(COSTO)
            FROM COSTO_VENTAS
            GROUP BY CTAINV
            INTO :CTAINVEN, :MONTO
        DO
            BEGIN
            if (MONTO <> 0) then
                BEGIN
                CUENTA = NULL;
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :CTAINVEN INTO :CUENTA, :TIPOCUEN;
                IF (CUENTA IS NULL) THEN
                    begin
                    EXECUTE PROCEDURE ERROR (31, 0, :CTAINVEN, 2);
                    CUENTA = CTAINVEN;
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, REGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT ARTI_COD, CANT * COSTO
                        FROM COSTO_VENTAS
                        WHERE CTAINV = :CUENTA
                        INTO :ART, :MONTO
                    DO
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    NROI = NROI + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    END
                END /* MONTO <> 0 */
            END /* FOR */
        END /* INVEN = A */
    if (INVEN = 'K') then
        BEGIN
        SELECT SUM(COSTO)
            FROM COSTO_VENTAS
            INTO :MONTO;
        if (MONTO <> 0) then
            BEGIN
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTAINVEN INTO :CUENTA, :TIPOCUEN;
            IF (CUENTA IS NULL) THEN
                begin
                EXECUTE PROCEDURE ERROR (31, 0, :CTAINVEN, 2);
                CUENTA = CTAINVEN;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT ARTI_COD, CANT * COSTO
                    FROM COSTO_VENTAS
                    INTO :ART, :MONTO
                DO
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTAINVEN, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                    NROI = NROI + 1;
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAINVEN, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAINVEN, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                END
            END /* MONTO <> 0 */
        END /* INVEN = K */
    /* recorra las cuentas adicionales */
    FOR SELECT INVC_CUENTA, INVC_BASE, INVC_PORC, INVC_VALOR, INVC_DB
        FROM INTERFAZ_VENTAS_CTAS
        WHERE INVE_ID = :IDINTER
        INTO :CTADIC, :BASEADIC, :PORCADIC, :VALORADIC, :DBADIC
        DO
        BEGIN
        if (VALORADIC <> 0) then
            MONTO = VALORADIC;
        ELSE
            BEGIN
            if (:BASEADIC = 'SUBTOTAL') then
                VALORADIC = vrsubt;
            if (:BASEADIC = 'DESCUENTO') then
                VALORADIC = VRDTO;
            if (:BASEADIC = 'IVA') then
                VALORADIC = VRIVA;
            if (:BASEADIC = 'ADICIONAL') then
                VALORADIC = VRADIC;
            if (:BASEADIC = 'EXTRA') then
                VALORADIC = VREXTRA;
            if (:BASEADIC = 'TOTAL') then
                VALORADIC = VRTOTAL;
            MONTO = VALORADIC * PORCADIC / 100;
            END
        if (MONTO <> 0) then
            BEGIN
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTADIC INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERROR (31, 0, :CTADIC, 2);
                CUENTA = CTADIC;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                begin
                EXECUTE PROCEDURE ERROR (31, 0, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'C') then
                BEGIN
                if (DBADIC = 'S') then
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                ELSE
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                if (DBADIC = 'S') then
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                ELSE
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                END
            NROI = NROI + 1;
            END
        END
    if (ERROR > 0) then
        VER = 'S';
    SUSPEND;
    END /* EXISTE LA INTERFAZ */
ELSE
    BEGIN
    EXECUTE PROCEDURE ERROR (31, 0, :PREF, 1);
    ERROR = ERROR + 1;
    VER = 'S';
    SUSPEND;
    END
END
^

SET TERM ; ^

SET TERM ^ ;

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

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER PROCEDURE IMPUESTOS_VENTAS(
    FECINI DATE,
    FECFIN DATE,
    PREFIJO VARCHAR(4),
    PTOINI INTEGER,
    PTOFIN INTEGER,
    ANULADOS CHAR(1),
    SUBEMPRESA INTEGER)
RETURNS (
    TIPO INTEGER,
    NOMTIPO VARCHAR(30),
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    NIT VARCHAR(20),
    NOMTERCERO VARCHAR(60),
    SUBTOTAL NUMERIC(18,2),
    DTOMONTO NUMERIC(18,2),
    ADICIONAL NUMERIC(18,2),
    IVAMONTO NUMERIC(18,2),
    CONSUMO NUMERIC(18,2),
    EXENTOS NUMERIC(18,2),
    GRAVADOS1 NUMERIC(18,2),
    GRAVADOS2 NUMERIC(18,2),
    GRAVADOS3 NUMERIC(18,2),
    IVA1 NUMERIC(18,2),
    IVA2 NUMERIC(18,2),
    IVA3 NUMERIC(18,2),
    EXTRA NUMERIC(18,2),
    TOTAL NUMERIC(18,2),
    RTFTEMONTO NUMERIC(18,2),
    RTIVAMONTO NUMERIC(18,2),
    RTICAMONTO 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);
BEGIN
/* FACTURA */
TIPO = 31;
SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 31 INTO :NOMTIPO;

FOR SELECT FACT_ID, F.PREF_PRE, FACT_NUMERO, FACT_FECHA, TERC_NIT, FACT_NOMCLIENTE, FACT_ADICIONAL-FACT_DTOMONTO, FACT_IVAMONTO, FACT_RTFTEMONTO, FACT_RTIVAMONTO, FACT_RTICAMONTO, FACT_EXTRA, FACT_TOTAL, FACT_ANULADO
    FROM FACTURAS F, PREFIJOS PR WHERE PTVT_ID >= :PTOINI AND PTVT_ID <= :PTOFIN AND
    FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND ((:PREFIJO = '') or (:PREFIJO IS NULL) or (F.PREF_PRE = :PREFIJO))
    AND PR.PREF_PRE = F.PREF_PRE AND PR.TIDO_COD = 31 AND ((PR.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
    ORDER BY FACT_FECHA, F.PREF_PRE, FACT_NUMERO
    INTO :ID, :PREF, :NUMERO, :FECHA, :NIT, :NOMTERCERO, :DTOMONTO, :IVAMONTO, :RTFTEMONTO, :RTIVAMONTO, :RTICAMONTO, :EXTRA, :TOTAL, :ANULADO
    DO
    BEGIN
    SELECT TERC_EXENTO FROM TERCEROS WHERE TERC_NIT = :NIT INTO :TER_EXENTO;
    if ((ANULADOS = 'S') or (ANULADO = 'N')) then
        BEGIN
        if (ANULADO = 'S') then
            BEGIN
            EXENTOS = 0;
            GRAVADOS1 = 0;
            GRAVADOS2 = 0;
            GRAVADOS3 = 0;
            CONSUMO = 0;
            SUBTOTAL = 0;
            TOTAL = 0;
            EXTRA = 0;
            IVAMONTO = 0;
            DTOMONTO = 0;
            NETO = 0;
            RTFTEMONTO = 0;
            RTIVAMONTO = 0;
            RTICAMONTO = 0;
            END
        else
            BEGIN
            /* CALCULE LAS DIFERENTES TARIFAS */
            if (TER_EXENTO = 'S') then
                BEGIN
                SELECT SUM(FADE_TOTAL - FADE_IVAMONTO - FADE_CONSUMO) FROM FACTURAS_DETALLE D WHERE FACT_ID = :ID AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL)) INTO :EXENTOS;
                GRAVADOS1 = 0;
                GRAVADOS2 = 0;
                GRAVADOS3 = 0;
                end
            else
                begin
                SELECT SUM(FADE_TOTAL - FADE_IVAMONTO - FADE_CONSUMO) FROM FACTURAS_DETALLE D WHERE FACT_ID = :ID AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL)) AND FADE_IVAPORC = 0 INTO :EXENTOS;
                SELECT SUM(FADE_TOTAL - FADE_IVAMONTO - FADE_CONSUMO), SUM(FADE_IVAMONTO) FROM FACTURAS_DETALLE D, TARIFA_IVA T WHERE FACT_ID = :ID AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL)) AND FADE_IVAPORC = TAIV_PORC AND TAIV_COD = 1 INTO :GRAVADOS1, :IVA1;
                SELECT SUM(FADE_TOTAL - FADE_IVAMONTO - FADE_CONSUMO), SUM(FADE_IVAMONTO) FROM FACTURAS_DETALLE D, TARIFA_IVA T WHERE FACT_ID = :ID AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL)) AND FADE_IVAPORC = TAIV_PORC AND TAIV_COD = 2 INTO :GRAVADOS2, :IVA2;
                SELECT SUM(FADE_TOTAL - FADE_IVAMONTO - FADE_CONSUMO), SUM(FADE_IVAMONTO) FROM FACTURAS_DETALLE D, TARIFA_IVA T WHERE FACT_ID = :ID AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL)) AND FADE_IVAPORC = TAIV_PORC AND TAIV_COD = 3 INTO :GRAVADOS3, :IVA3;
                end
            SELECT SUM(FADE_CONSUMO) FROM FACTURAS_DETALLE WHERE FACT_ID = :ID AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL)) INTO :CONSUMO;
            SUBTOTAL = TOTAL - EXTRA - IVAMONTO - DTOMONTO;
            NETO = TOTAL - RTFTEMONTO - RTIVAMONTO - RTICAMONTO;
            END
        SUSPEND;
        END
    END
    
TIPO = 33;
SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 33 INTO :NOMTIPO;
/* DEVOLUCIONES */
FOR SELECT DEVT_ID, D.PREF_PRE, DEVT_NUMERO, DEVT_FECHA, TERC_NIT, DEVT_NOMTERC, DEVT_ADICIONAL-DEVT_DTOMONTO, DEVT_IVAMONTO, DEVT_RTFTEMONTO, DEVT_RTIVAMONTO, DEVT_RTICAMONTO, DEVT_EXTRA, DEVT_TOTAL, DEVT_ANULADO
    FROM DEVOLUCIONES_VENTAS D, PREFIJOS PR WHERE PTVT_ID >= :PTOINI AND PTVT_ID <= :PTOFIN AND
    DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND ((:PREFIJO = '') or (:PREFIJO IS NULL) or (D.PREF_PRE = :PREFIJO))
    AND PR.PREF_PRE = D.PREF_PRE AND PR.TIDO_COD = 33 AND ((PR.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) AND ((DEVT_REMID = 0) or (DEVT_REMID IS NULL))
    ORDER BY DEVT_FECHA, D.PREF_PRE, DEVT_NUMERO
    INTO :ID, :PREF, :NUMERO, :FECHA, :NIT, :NOMTERCERO, :DTOMONTO, :IVAMONTO, :RTFTEMONTO, :RTIVAMONTO, :RTICAMONTO, :EXTRA, :TOTAL, :ANULADO
    DO
    BEGIN
    SELECT TERC_EXENTO FROM TERCEROS WHERE TERC_NIT = :NIT INTO :TER_EXENTO;
    if ((ANULADOS = 'S') or (ANULADO = 'N')) then
        BEGIN
        if (ANULADO = 'S') then
            BEGIN
            EXENTOS = 0;
            GRAVADOS1 = 0;
            GRAVADOS2 = 0;
            GRAVADOS3 = 0;
            CONSUMO = 0;
            SUBTOTAL = 0;
            TOTAL = 0;
            EXTRA = 0;
            IVAMONTO = 0;
            DTOMONTO = 0;
            NETO = 0;
            RTFTEMONTO = 0;
            RTIVAMONTO = 0;
            RTICAMONTO = 0;
            END
        else
            BEGIN
            DTOMONTO = DTOMONTO * -1;
            ADICIONAL = ADICIONAL * -1;
            IVAMONTO = IVAMONTO * -1;
            EXTRA = EXTRA * -1;
            TOTAL = TOTAL * -1;
            RTFTEMONTO = RTFTEMONTO * -1;
            RTIVAMONTO = RTIVAMONTO * -1;
            RTICAMONTO = RTICAMONTO * -1;
            /* CALCULE LAS DIFERENTES TARIFAS */
            if (TER_EXENTO = 'S') then
             BEGIN
              SELECT SUM(DVDE_TOTAL - DVDE_IVAMONTO - DVDE_CONSUMO) FROM DEVOLUCIONES_VENTAS_DETALLE D WHERE DEVT_ID = :ID AND DVDE_REFERENCIA <> '.t' INTO :EXENTOS;
              GRAVADOS1 = 0;
              GRAVADOS2 = 0;
              GRAVADOS3 = 0;
             end
            else
             begin
              SELECT SUM(DVDE_TOTAL - DVDE_IVAMONTO - DVDE_CONSUMO) FROM DEVOLUCIONES_VENTAS_DETALLE D WHERE DEVT_ID = :ID AND DVDE_REFERENCIA <> '.t' AND DVDE_IVAPORC = 0 INTO :EXENTOS;
              SELECT SUM(DVDE_TOTAL - DVDE_IVAMONTO - DVDE_CONSUMO), SUM(DVDE_IVAMONTO) FROM DEVOLUCIONES_VENTAS_DETALLE D, TARIFA_IVA T WHERE DEVT_ID = :ID AND DVDE_REFERENCIA <> '.t' AND DVDE_IVAPORC = TAIV_PORC AND TAIV_COD = 1 INTO :GRAVADOS1, :IVA1;
              SELECT SUM(DVDE_TOTAL - DVDE_IVAMONTO - DVDE_CONSUMO), SUM(DVDE_IVAMONTO) FROM DEVOLUCIONES_VENTAS_DETALLE D, TARIFA_IVA T WHERE DEVT_ID = :ID AND DVDE_REFERENCIA <> '.t' AND DVDE_IVAPORC = TAIV_PORC AND TAIV_COD = 2 INTO :GRAVADOS2, :IVA2;
              SELECT SUM(DVDE_TOTAL - DVDE_IVAMONTO - DVDE_CONSUMO), SUM(DVDE_IVAMONTO) FROM DEVOLUCIONES_VENTAS_DETALLE D, TARIFA_IVA T WHERE DEVT_ID = :ID AND DVDE_REFERENCIA <> '.t' AND DVDE_IVAPORC = TAIV_PORC AND TAIV_COD = 3 INTO :GRAVADOS3, :IVA3;
             end
            SELECT SUM(DVDE_CONSUMO) FROM DEVOLUCIONES_VENTAS_DETALLE WHERE DEVT_ID = :ID AND DVDE_REFERENCIA <> '.t' INTO :CONSUMO;
            SUBTOTAL = TOTAL - EXTRA - IVAMONTO - DTOMONTO;
            NETO = TOTAL - RTFTEMONTO - RTIVAMONTO - RTICAMONTO;
            EXENTOS = EXENTOS * -1;
            GRAVADOS1 = GRAVADOS1 * -1;
            GRAVADOS2 = GRAVADOS2 * -1;
            GRAVADOS3 = GRAVADOS3 * -1;
            CONSUMO = CONSUMO * -1;
            END
        SUSPEND;
        END
    END
execute procedure lee_configuracion ('FACTURACION', 'DOCUMENTOS', 'INCLUIR NOTAS DE CARTERA EN REPORTE DE IMPUESTOS EN VENTAS') returning_values (:NOTAS);
if (NOTAS = 'SI') then
    BEGIN
    TIPO = 41;
    SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 41 INTO :NOMTIPO;
    FOR SELECT NDCL_ID, N.PREF_PRE, NDCL_NUMERO, NDCL_FECHA, N.TERC_NIT, TERC_NOM, 0, NDCL_IVAMONTO, NDCL_RTFTEMONTO, NDCL_RTIVAMONTO, NDCL_RTICAMONTO, 0, NDCL_MONTO+NDCL_IVAMONTO, NDCL_ANULADO
        FROM NOTAS_DEBITO_CLIENTES N, TERCEROS T, PREFIJOS PR WHERE N.TERC_NIT = T.TERC_NIT AND
        NDCL_FECHA >= :FECINI AND NDCL_FECHA <= :FECFIN AND ((:PREFIJO = '') or (:PREFIJO IS NULL) or (N.PREF_PRE = :PREFIJO))
        AND PR.PREF_PRE = N.PREF_PRE AND PR.TIDO_COD = 41 AND ((PR.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
        ORDER BY NDCL_FECHA, N.PREF_PRE, NDCL_NUMERO
        INTO :ID, :PREF, :NUMERO, :FECHA, :NIT, :NOMTERCERO, :DTOMONTO, :IVAMONTO, :RTFTEMONTO, :RTIVAMONTO, :RTICAMONTO, :EXTRA, :TOTAL, :ANULADO
        DO
        BEGIN
        GRAVADOS2 = 0;
        GRAVADOS3 = 0;
        IVA2 = 0;
        IVA3 = 0;
        CONSUMO = 0;
        if (ANULADO = 'S') then
            BEGIN
            EXENTOS = 0;
            GRAVADOS1 = 0;
            SUBTOTAL = 0;
            TOTAL = 0;
            EXTRA = 0;
            IVAMONTO = 0;
            DTOMONTO = 0;
            NETO = 0;
            RTFTEMONTO = 0;
            RTIVAMONTO = 0;
            RTICAMONTO = 0;
            END
        ELSE
            BEGIN
            if (IVAMONTO <> 0) then
                BEGIN
                GRAVADOS1 = TOTAL-IVAMONTO;
                IVA1 = IVAMONTO;
                exentos = 0;
                END
            ELSE
                BEGIN
                GRAVADOS1 = 0;
                IVA1 = 0;
                exentos = TOTAL;
                END
            SUBTOTAL = TOTAL - EXTRA - IVAMONTO - DTOMONTO;
            NETO = TOTAL - RTFTEMONTO - RTIVAMONTO - RTICAMONTO;
            END
        SUSPEND;
        END

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

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER PROCEDURE TOTAL_DOC_VENTAS(
    TIPODOC INTEGER,
    ID INTEGER)
RETURNS (
    SUBTOTAL NUMERIC(18,2),
    IVA NUMERIC(18,2),
    CONSUMO NUMERIC(18,2))
AS
BEGIN
  if (TIPODOC = 31) then /* FACTURA */
    BEGIN
    SELECT SUM(FADE_TOTAL*FACT_FACTOR), SUM(FADE_IVAMONTO*FACT_FACTOR), SUM(FADE_CONSUMO*FACT_FACTOR)
        FROM FACTURAS_DETALLE D, FACTURAS F
        WHERE F.FACT_ID = :ID AND F.FACT_ID = D.FACT_ID AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
        INTO :SUBTOTAL, :IVA, :CONSUMO;
    END
  if (TIPODOC = 32) then /* REMISION */
    BEGIN
    SELECT SUM(RVDE_TOTAL), SUM(RVDE_IVAMONTO), SUM(RVDE_CONSUMO)
        FROM remisiones_venta_detalle D, REMISIONES_VENTA R
        WHERE R.REVT_ID = :ID AND R.REVT_ID = D.REVT_ID
        INTO :SUBTOTAL, :IVA, :CONSUMO;
    END
  if (TIPODOC = 33) then /* DEVOLUCION */
    BEGIN
    SELECT SUM(DVDE_TOTAL*DEVT_FACTOR), SUM(DVDE_IVAMONTO*DEVT_FACTOR), SUM(DVDE_CONSUMO*DEVT_FACTOR)
        FROM devoluciones_ventas_detalle D, DEVOLUCIONES_VENTAS V
        WHERE V.DEVT_ID = :ID AND V.DEVT_ID = D.DEVT_ID AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
        INTO :SUBTOTAL, :IVA, :CONSUMO;
    END
  if (TIPODOC = 34) then /* PEDIDO */
    BEGIN
    SELECT SUM(PEDE_TOTAL*PEDI_FACTOR), SUM(PEDE_IVAMONTO*PEDI_FACTOR), SUM(PEDE_CONSUMO*PEDI_FACTOR)
        FROM pedidos_detalle D, pedidos P
        WHERE P.PEDI_ID = :ID AND P.pedi_id = D.pedi_id
        INTO :SUBTOTAL, :IVA, :CONSUMO;
    END
  if (TIPODOC = 35) then /* COTIZACION */
    BEGIN
    SELECT SUM(CTDE_TOTAL*COTI_FACTOR), SUM(CTDE_IVAMONTO*COTI_FACTOR), SUM(CTDE_CONSUMO*COTI_FACTOR)
        FROM cotizaciones_detalle D, COTIZACIONES C
        WHERE C.COTI_ID = :ID AND D.coti_id = C.coti_id
        INTO :SUBTOTAL, :IVA, :CONSUMO;
    END
  SUBTOTAL = SUBTOTAL - IVA - CONSUMO;
  SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE DETALLE_VENTAS_CLIENTE(
    NIT VARCHAR(20),
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    TIPO VARCHAR(8),
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(6),
    ID INTEGER,
    FECDOC DATE,
    SUBTOTAL NUMERIC(18,2),
    IVA NUMERIC(18,2),
    CONSUMO NUMERIC(18,2),
    TOTAL NUMERIC(18,2))
AS
BEGIN /*$$IBE$$ 
  TIPO = 'FACTVENT';
  FOR SELECT FACT_ID, PREF_PRE, FACT_NUMERO, FACT_FECHA
    FROM FACTURAS
    WHERE TERC_NIT = :NIT AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND FACT_ANULADO = 'N'
    INTO :ID, :PREFIJO, :NUMERO, :FECDOC DO
    BEGIN
    EXECUTE PROCEDURE TOTAL_DOC_VENTAS(31, ID) returning_values (SUBTOTAL, IVA, CONSUMO);
    TOTAL = SUBTOTAL + IVA + CONSUMO;
    SUSPEND;
    END
    
  TIPO = 'DEVOLCLI';
  FOR SELECT DEVT_ID, PREF_PRE, DEVT_NUMERO, DEVT_FECHA
    FROM DEVOLUCIONES_VENTAS
    WHERE TERC_NIT = :NIT AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND DEVT_ANULADO = 'N' AND ((DEVT_REMID IS NULL) or (DEVT_REMID = 0))
    INTO :ID, :PREFIJO, :NUMERO, :FECDOC DO
    BEGIN
    EXECUTE PROCEDURE TOTAL_DOC_VENTAS(33, ID) returning_values (SUBTOTAL, IVA, CONSUMO);
    TOTAL = SUBTOTAL + IVA + CONSUMO;
    SUBTOTAL = SUBTOTAL * -1;
    IVA = IVA * -1;
    CONSUMO = CONSUMO * -1;
    TOTAL = TOTAL * -1;
    SUSPEND;
    END
 $$IBE$$*/ SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE DETALLE_VENTAS_VENDEDOR(
    VEND INTEGER,
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    TIPO VARCHAR(8),
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(6),
    ID INTEGER,
    FECDOC DATE,
    CLIENTE VARCHAR(60),
    SUBTOTAL NUMERIC(18,2),
    IVA NUMERIC(18,2),
    CONSUMO NUMERIC(18,2),
    TOTAL NUMERIC(18,2))
AS
BEGIN /*$$IBE$$ 
  TIPO = 'FACTVENT';
  FOR SELECT FACT_ID, PREF_PRE, FACT_NUMERO, FACT_FECHA, FACT_NOMCLIENTE
    FROM FACTURAS
    WHERE VEND_COD = :VEND AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN  AND FACT_ANULADO = 'N'
    INTO :ID, :PREFIJO, :NUMERO, :FECDOC, :CLIENTE DO
    BEGIN
    EXECUTE PROCEDURE TOTAL_DOC_VENTAS(31, ID) returning_values (SUBTOTAL, IVA, CONSUMO);
    TOTAL = SUBTOTAL + IVA + CONSUMO;
    SUSPEND;
    END
    
  TIPO = 'DEVOLCLI';
  FOR SELECT DEVT_ID, PREF_PRE, DEVT_NUMERO, DEVT_FECHA, DEVT_NOMTERC
    FROM DEVOLUCIONES_VENTAS
    WHERE VEND_COD = :VEND AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND DEVT_ANULADO = 'N' AND ((DEVT_REMID IS NULL) or (DEVT_REMID = 0))
    INTO :ID, :PREFIJO, :NUMERO, :FECDOC, :CLIENTE DO
    BEGIN
    EXECUTE PROCEDURE TOTAL_DOC_VENTAS(33, ID) returning_values (SUBTOTAL, IVA, CONSUMO);
    TOTAL = SUBTOTAL + IVA + CONSUMO;
    SUBTOTAL = SUBTOTAL * -1;
    IVA = IVA * -1;
    CONSUMO = CONSUMO * -1;
    TOTAL = TOTAL * -1;
    SUSPEND;
    END
 $$IBE$$*/ SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

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

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

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE DETALLE_VENTAS_CLIENTE(
    NIT VARCHAR(20),
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    TIPO VARCHAR(8),
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(6),
    ID INTEGER,
    FECDOC DATE,
    SUBTOTAL NUMERIC(18,2),
    IVA NUMERIC(18,2),
    CONSUMO NUMERIC(18,2),
    TOTAL NUMERIC(18,2))
AS
BEGIN
  TIPO = 'FACTVENT';
  FOR SELECT FACT_ID, PREF_PRE, FACT_NUMERO, FACT_FECHA
    FROM FACTURAS
    WHERE TERC_NIT = :NIT AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND FACT_ANULADO = 'N'
    INTO :ID, :PREFIJO, :NUMERO, :FECDOC DO
    BEGIN
    EXECUTE PROCEDURE TOTAL_DOC_VENTAS(31, ID) returning_values (SUBTOTAL, IVA, CONSUMO);
    TOTAL = SUBTOTAL + IVA + CONSUMO;
    SUSPEND;
    END
    
  TIPO = 'DEVOLCLI';
  FOR SELECT DEVT_ID, PREF_PRE, DEVT_NUMERO, DEVT_FECHA
    FROM DEVOLUCIONES_VENTAS
    WHERE TERC_NIT = :NIT AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND DEVT_ANULADO = 'N' AND ((DEVT_REMID IS NULL) or (DEVT_REMID = 0))
    INTO :ID, :PREFIJO, :NUMERO, :FECDOC DO
    BEGIN
    EXECUTE PROCEDURE TOTAL_DOC_VENTAS(33, ID) returning_values (SUBTOTAL, IVA, CONSUMO);
    TOTAL = SUBTOTAL + IVA + CONSUMO;
    SUBTOTAL = SUBTOTAL * -1;
    IVA = IVA * -1;
    CONSUMO = CONSUMO * -1;
    TOTAL = TOTAL * -1;
    SUSPEND;
    END
END

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE DETALLE_VENTAS_VENDEDOR(
    VEND INTEGER,
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    TIPO VARCHAR(8),
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(6),
    ID INTEGER,
    FECDOC DATE,
    CLIENTE VARCHAR(60),
    SUBTOTAL NUMERIC(18,2),
    IVA NUMERIC(18,2),
    CONSUMO NUMERIC(18,2),
    TOTAL NUMERIC(18,2))
AS
BEGIN
  TIPO = 'FACTVENT';
  FOR SELECT FACT_ID, PREF_PRE, FACT_NUMERO, FACT_FECHA, FACT_NOMCLIENTE
    FROM FACTURAS
    WHERE VEND_COD = :VEND AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN  AND FACT_ANULADO = 'N'
    INTO :ID, :PREFIJO, :NUMERO, :FECDOC, :CLIENTE DO
    BEGIN
    EXECUTE PROCEDURE TOTAL_DOC_VENTAS(31, ID) returning_values (SUBTOTAL, IVA, CONSUMO);
    TOTAL = SUBTOTAL + IVA + CONSUMO;
    SUSPEND;
    END
    
  TIPO = 'DEVOLCLI';
  FOR SELECT DEVT_ID, PREF_PRE, DEVT_NUMERO, DEVT_FECHA, DEVT_NOMTERC
    FROM DEVOLUCIONES_VENTAS
    WHERE VEND_COD = :VEND AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND DEVT_ANULADO = 'N' AND ((DEVT_REMID IS NULL) or (DEVT_REMID = 0))
    INTO :ID, :PREFIJO, :NUMERO, :FECDOC, :CLIENTE DO
    BEGIN
    EXECUTE PROCEDURE TOTAL_DOC_VENTAS(33, ID) returning_values (SUBTOTAL, IVA, CONSUMO);
    TOTAL = SUBTOTAL + IVA + CONSUMO;
    SUBTOTAL = SUBTOTAL * -1;
    IVA = IVA * -1;
    CONSUMO = CONSUMO * -1;
    TOTAL = TOTAL * -1;
    SUSPEND;
    END
END

^

SET TERM ; ^

SET TERM ^ ;

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

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

^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER PROCEDURE IMPR_DEVOLUCION(
    ID INTEGER)
RETURNS (
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    NIT VARCHAR(20),
    NOMTERCERO VARCHAR(60),
    VENDEDOR INTEGER,
    NOMVENDEDOR VARCHAR(60),
    PUNTOVTA INTEGER,
    NOMPUNTOVTA VARCHAR(30),
    CODBODEGA VARCHAR(2),
    NOMBODEGA VARCHAR(30),
    FACTURA VARCHAR(30),
    REMISION VARCHAR(10),
    COMIPORC NUMERIC(9,2),
    COMIMONTO NUMERIC(18,2),
    SUBTOTAL NUMERIC(18,2),
    DTOPORC NUMERIC(9,2),
    DTOMONTO NUMERIC(18,2),
    ADICIONAL NUMERIC(18,2),
    IVAMONTO NUMERIC(18,2),
    RTEFTEPORC NUMERIC(9,2),
    RTEFTEMONTO NUMERIC(18,2),
    RTEIVAPORC NUMERIC(9,2),
    RTEIVAMONTO NUMERIC(18,2),
    RTEICAPORC NUMERIC(9,2),
    RTEICAMONTO NUMERIC(18,2),
    EXTRA NUMERIC(18,2),
    TOTALFAC NUMERIC(18,2),
    TOTALPAGAR NUMERIC(18,2),
    OBS BLOB SUB_TYPE 1 SEGMENT SIZE 80,
    ITEM INTEGER,
    ARTICULO VARCHAR(15),
    CODBAR VARCHAR(15),
    ARTIDES VARCHAR(60),
    CANT NUMERIC(18,4),
    LOTE VARCHAR(15),
    UNIDAD VARCHAR(8),
    REFITEM VARCHAR(60),
    BODITEM VARCHAR(2),
    PRUNIT NUMERIC(18,2),
    DTOITPORC NUMERIC(9,2),
    DTOITMONTO NUMERIC(18,2),
    PRNETO NUMERIC(18,2),
    IVAPORC NUMERIC(9,2),
    IVAITMONTO NUMERIC(18,2),
    CONSUMO NUMERIC(18,2),
    TOTAL NUMERIC(18,2),
    CODIGOCL VARCHAR(20),
    ZONACOD VARCHAR(2),
    ZONANOM VARCHAR(60),
    DV CHAR(1),
    DIRECCION VARCHAR(60),
    CIUDAD VARCHAR(40),
    TELEFONO VARCHAR(40),
    CONTACTO VARCHAR(60),
    FAX VARCHAR(25),
    GRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    SUBGRUPO VARCHAR(3),
    NOMSUBG VARCHAR(30),
    MARCA VARCHAR(3),
    NOMMARCA VARCHAR(30),
    PESO NUMERIC(9,4),
    ANCHO NUMERIC(18,4),
    ALTO NUMERIC(18,4),
    LARGO NUMERIC(18,4),
    SUMA1 NUMERIC(18,2),
    SUMA2 NUMERIC(18,2),
    SUMA3 NUMERIC(18,2),
    IVA1 NUMERIC(18,2),
    IVA2 NUMERIC(18,2),
    IVA3 NUMERIC(18,2),
    TOTCONSUMO NUMERIC(18,2),
    SUMAEX NUMERIC(18,2),
    SUMAGR NUMERIC(18,2),
    OBSITEM BLOB SUB_TYPE 1 SEGMENT SIZE 80)
AS
DECLARE VARIABLE IMPTOS CHAR(1);
DECLARE VARIABLE TARIFA INTEGER;
declare variable ORDENCOD CHAR(2);
declare variable SUCUR VARCHAR(10);
declare variable PUNTOS NUMERIC(18,4);
BEGIN
  /*  */
  SELECT F.PREF_PRE, DEVT_NUMERO, DEVT_FECHA, F.BODE_COD, BODE_NOM, F.TERC_NIT, DEVT_NOMTERC, F.VEND_COD, VEND_NOMBRE, F.PTVT_ID, PTVT_NOM,
    DEVT_FACTURA, DEVT_COMIPORC, DEVT_COMIMONTO, DEVT_IVAINC,
    DEVT_DTOPOR, DEVT_DTOMONTO, DEVT_ADICIONAL, DEVT_IVAMONTO, DEVT_RTFTEPORC, DEVT_RTFTEMONTO, DEVT_RTIVAPORC, DEVT_RTIVAMONTO, DEVT_RTICAPORC, DEVT_RTICAMONTO, DEVT_EXTRA, DEVT_TOTAL,
    TERC_CONTACTO, TERC_FAX, TERC_DV, DEVT_OBS, DEVT_SUCURSAL, DEVT_REMISION
    FROM DEVOLUCIONES_VENTAS F, BODEGA B, VENDEDORES V, PUNTO_VENTA P, TERCEROS T
    WHERE F.BODE_COD = B.BODE_COD AND F.VEND_COD = V.VEND_COD AND F.PTVT_ID = P.PTVT_ID AND F.TERC_NIT = T.TERC_NIT AND F.DEVT_ID = :ID
    into :PREF, :NUMERO, :FECHA, :CODBODEGA, :NOMBODEGA, :NIT, :NOMTERCERO, :VENDEDOR, :NOMVENDEDOR, :PUNTOVTA, :NOMPUNTOVTA,
    :FACTURA, :COMIPORC, :COMIMONTO, :IMPTOS,
    :DTOPORC, :DTOMONTO, :ADICIONAL, :IVAMONTO, :RTEFTEPORC, :RTEFTEMONTO, :RTEIVAPORC, :RTEIVAMONTO, :RTEICAPORC, :RTEICAMONTO, :EXTRA, :TOTALFAC,
    :CONTACTO, :FAX, :DV, :OBS, :SUCUR, :REMISION;
  SUBTOTAL = TOTALFAC - EXTRA - IVAMONTO - ADICIONAL + DTOMONTO;
  TOTALPAGAR = TOTALFAC - RTEFTEMONTO - RTEIVAMONTO - RTEICAMONTO;

  EXECUTE PROCEDURE acumula_puntos_cliente (33, :id, :nit, :fecha) returning_values (:PUNTOS);
  SELECT CLIE_COD, C.ZONA_COD, ZONA_NOM
    FROM CLIENTES C, ZONAS Z
    WHERE TERC_NIT = :NIT AND C.ZONA_COD = Z.ZONA_COD
    INTO :CODIGOCL, :ZONACOD, :ZONANOM;
  SELECT CLSU_DIR, CLSU_CIUDAD, CLSU_TEL FROM CLIENTE_SUCURSALES WHERE TERC_NIT = :NIT AND CLCU_COD = :SUCUR
    INTO :DIRECCION, :CIUDAD, :TELEFONO;
    
  SUMAEX = 0;
  SUMA1 = 0;
  SUMA2 = 0;
  SUMA3 = 0;
  IVA1 = 0;
  IVA2 = 0;
  IVA3 = 0;
  TOTCONSUMO = 0;
  ITEM = 0;
  EXECUTE PROCEDURE lee_configuracion ('FACTURACION','DOCUMENTOS','ORDENAR ITEMS POR CODIGO DE ARTICULO') returning_values (:ORDENCOD);
  if (ORDENCOD = 'SI') then
    BEGIN
    FOR SELECT D.ARTI_COD, DVDE_CODBAR, SUBSTR(DVDE_DESC,1,60), DVDE_CANT, DVDE_UNIDAD, BODE_COD, DVDE_LOTE, DVDE_PRUNIT, DVDE_DTOPORC, DVDE_DTOMONTO, DVDE_IVAPORC, DVDE_IVAMONTO, DVDE_CONSUMO, DVDE_TOTAL, DVDE_REFERENCIA,
        GRUP_COD, SUBG_COD, MARC_COD, ARTI_PESO, ARTI_ANCHO, ARTI_ALTO, ARTI_LARGO, TAIV_COD, DVDE_OBS
        FROM DEVOLUCIONES_VENTAS_DETALLE D, ARTICULO A
        WHERE D.ARTI_COD = A.ARTI_COD AND D.DEVT_ID = :ID
        ORDER BY DVDE_CODBAR
        INTO :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :BODITEM, :LOTE, :PRUNIT, :DTOITPORC, :DTOITMONTO, :IVAPORC, :IVAITMONTO, :CONSUMO, :TOTAL, :REFITEM,
        :GRUPO, :SUBGRUPO, :MARCA, :PESO, :ANCHO, :ALTO, :LARGO, :TARIFA, :obsitem
        DO
        BEGIN
        if (ARTICULO = CODBAR) then
            SELECT FIRST 1 COBA_COD FROM barras_articulo WHERE ARTI_COD = :articulo INTO :CODBAR;
        ITEM = ITEM + 1;
        PRNETO = PRUNIT - DTOITMONTO - ((IVAITMONTO+CONSUMO) / CANT);
        TOTCONSUMO = TOTCONSUMO + CONSUMO;
        PRNETO = PRUNIT - DTOITMONTO;
        if ((REFITEM <> '.t') or (REFITEM IS NULL)) then
            BEGIN
            /* NO SUME LOS ENSAMBLES */
            if (IVAPORC = 0) then
                SUMAEX = SUMAEX + TOTAL;
            if (TARIFA = 1) then
                BEGIN
                SUMA1 = SUMA1 + TOTAL - IVAITMONTO;
                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;
            END
        if (IMPTOS = 'N') then
            TOTAL = TOTAL - IVAITMONTO - CONSUMO;
        if (substr(ARTICULO,1,2) = '.t') then
            BEGIN
            REFITEM = '';
            TOTAL = 0;
            END
        SUSPEND;
        END
    END
ELSE
    BEGIN
    FOR SELECT D.ARTI_COD, DVDE_CODBAR, SUBSTR(DVDE_DESC,1,60), DVDE_CANT, DVDE_UNIDAD, BODE_COD, DVDE_LOTE, DVDE_PRUNIT, DVDE_DTOPORC, DVDE_DTOMONTO, DVDE_IVAPORC, DVDE_IVAMONTO, DVDE_CONSUMO, DVDE_TOTAL, DVDE_REFERENCIA,
        GRUP_COD, SUBG_COD, MARC_COD, ARTI_PESO, ARTI_ANCHO, ARTI_ALTO, ARTI_LARGO, TAIV_COD, DVDE_OBS
        FROM DEVOLUCIONES_VENTAS_DETALLE D, ARTICULO A
        WHERE D.ARTI_COD = A.ARTI_COD AND D.DEVT_ID = :ID
        ORDER BY DVDE_ITEM
        INTO :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :BODITEM, :LOTE, :PRUNIT, :DTOITPORC, :DTOITMONTO, :IVAPORC, :IVAITMONTO, :CONSUMO, :TOTAL, :REFITEM,
        :GRUPO, :SUBGRUPO, :MARCA, :PESO, :ANCHO, :ALTO, :LARGO, :TARIFA, :obsitem
        DO
        BEGIN
        if (ARTICULO = CODBAR) then
            SELECT FIRST 1 COBA_COD FROM barras_articulo WHERE ARTI_COD = :articulo INTO :CODBAR;
        SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :GRUPO INTO NOMGRUPO;
        SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :MARCA INTO NOMMARCA;
        SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :SUBGRUPO AND GRUP_COD = :GRUPO INTO :NOMSUBG;
        ITEM = ITEM + 1;
        PRNETO = PRUNIT - DTOITMONTO - ((IVAITMONTO+CONSUMO) / CANT);
        TOTCONSUMO = TOTCONSUMO + CONSUMO;
        PRNETO = PRUNIT - DTOITMONTO;
        if ((REFITEM <> '.t') or (REFITEM IS NULL)) then
            BEGIN
            /* NO SUME LOS ENSAMBLES */
            if (IVAPORC = 0) then
                SUMAEX = SUMAEX + TOTAL;
            if (TARIFA = 1) then
                BEGIN
                SUMA1 = SUMA1 + TOTAL - IVAITMONTO;
                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;
            END
        if (IMPTOS = 'N') then
            TOTAL = TOTAL - IVAITMONTO - CONSUMO;
        if (substr(ARTICULO,1,2) = '.t') then
            BEGIN
            REFITEM = '';
            TOTAL = 0;
            END
        SUSPEND;
        END
    END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER PROCEDURE CONTABIL_DEVOLCLI(
    IDDOC INTEGER,
    IDINTER INTEGER)
RETURNS (
    ERROR INTEGER,
    VER CHAR(1),
    IDC INTEGER)
AS
declare variable PREF VARCHAR(4);
declare variable NUM VARCHAR(6);
declare variable NUMERO VARCHAR(10);
declare variable FECAUX DATE;
declare variable FECHA CHAR(8);
declare variable CONC CHAR(120);
declare variable NUMFAC VARCHAR(10);
declare variable VRDTO NUMERIC(18, 2);
declare variable VRADIC NUMERIC(18, 2);
declare variable VRSUBT NUMERIC(18, 2);
declare variable VRIVA NUMERIC(18, 2);
declare variable PRTFTE NUMERIC(9, 2);
declare variable VRRTFTE NUMERIC(18, 2);
declare variable VRRTIVA NUMERIC(18, 2);
declare variable PRTICA NUMERIC(9, 2);
declare variable VRRTICA NUMERIC(18, 2);
declare variable VRTOTAL NUMERIC(18, 2);
declare variable VREXTRA NUMERIC(18, 2);
declare variable TIPOCOMP VARCHAR(3);
declare variable PREFCONT VARCHAR(4);
declare variable VENTAS CHAR(1);
declare variable CTAVENTAS VARCHAR(20);
declare variable IVA CHAR(1);
declare variable CTAIVA VARCHAR(20);
declare variable CONSUMO CHAR(1);
declare variable CTACONSUMO VARCHAR(20);
declare variable CARTERA CHAR(1);
declare variable CTACARTERA VARCHAR(20);
declare variable RTFTE CHAR(1);
declare variable CTARTFTE VARCHAR(20);
declare variable RTIVA CHAR(1);
declare variable CTARTIVA VARCHAR(20);
declare variable RTICA CHAR(1);
declare variable CTARTICA VARCHAR(20);
declare variable INVEN CHAR(1);
declare variable CTAINVEN VARCHAR(20);
declare variable COSTOS CHAR(1);
declare variable CTACOSTOS VARCHAR(20);
declare variable CTADTO VARCHAR(20);
declare variable CTAADIC VARCHAR(20);
declare variable CTAEXTRA VARCHAR(20);
declare variable EXISTE CHAR(1);
declare variable CUENTA VARCHAR(20);
declare variable MONTO NUMERIC(18,2);
declare variable TIPOCUEN CHAR(1);
declare variable NIT VARCHAR(20);
declare variable PROY VARCHAR(4);
declare variable CENTRO VARCHAR(4);
declare variable PORC NUMERIC(5,2);
declare variable DEBITO NUMERIC(18,2);
declare variable CREDITO NUMERIC(18,2);
declare variable NROI INTEGER;
declare variable ART VARCHAR(15);
declare variable IMPINC CHAR(1);
declare variable IMPTOS NUMERIC(18, 2);
declare variable SUMA NUMERIC(18,2);
declare variable PORCIVA NUMERIC(9,2);
declare variable TCTACLIEN VARCHAR(20);
declare variable TCTAVENTA VARCHAR(20);
declare variable TCTARTFTE VARCHAR(20);
declare variable TCTARTIVA VARCHAR(20);
declare variable TCTARTICA VARCHAR(20);
declare variable CTADIC VARCHAR(20);
declare variable BASEADIC VARCHAR(20);
declare variable PORCADIC NUMERIC(5,2);
declare variable VALORADIC NUMERIC(18,2);
declare variable DBADIC CHAR(1);
declare variable PTOVTA INTEGER;
declare variable ANULADO CHAR(1);
declare variable CENT CHAR(1);
DECLARE VARIABLE MERCANCIA NUMERIC(18,2);
declare variable FACTOR DOUBLE PRECISION;
declare variable DIG INTEGER;
DECLARE VARIABLE FOMENTO VARCHAR(2);
DECLARE VARIABLE VRCONSUMO NUMERIC(18,2);
declare variable AUTORET VARCHAR(10);
declare variable FAUTORET DATE;
declare variable IDREM INTEGER;
declare variable DTOXIT CHAR(2);
declare variable ERRORC INTEGER;
BEGIN
EXECUTE PROCEDURE LEE_CONFIGURACION('COMPRAS', 'FACTURAS', 'USAR IMPOCONSUMO COMO PORCENTAJE DE FOMENTO') returning_values (FOMENTO);
EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'FECHA AUTORETENEDOR NO DESCONTAR RETENCIONES DEL SALDO PERO SI CONTABILIZARLAS') returning_values (AUTORET);
if (AUTORET <> '') then
    FAUTORET = CAST(AUTORET AS DATE);
else
    FAUTORET = '9999/12/31';
  /* BUSQUE LA INTERFACE */
  EXISTE = 'N';
  SELECT 'S', TICO_COD, PRCO_PRE, INVE_VENTAS, INVE_IVA, INVE_CONSUMO, INVE_CARTERA, INVE_RTFTE, INVE_RTIVA, INVE_RTICA, INVE_COSTO, INVE_INVEN, INVE_CTAVENTAS, INVE_CTAIVA, INVE_CTACONSUMO, INVE_CTADTO, INVE_CTAADIC, INVE_CTAEXTRA, INVE_CTACARTERA, INVE_CTARTFTE, INVE_CTARTIVA, INVE_CTARTICA, INVE_CTAINVEN, INVE_CTACOSTOS, INVE_CONFIRMAR, INVE_CENTRO
    FROM INTERFAZ_VENTAS
    WHERE INVE_ID = :IDINTER
    INTO :EXISTE, :TIPOCOMP, :PREFCONT, :VENTAS, :IVA, :CONSUMO, :CARTERA, :RTFTE, :RTIVA, :RTICA, :COSTOS, :INVEN, :CTAVENTAS, :CTAIVA, :CTACONSUMO, :CTADTO, :CTAADIC, :CTAEXTRA, :CTACARTERA, :CTARTFTE, :CTARTIVA, :CTARTICA, :CTAINVEN, :CTACOSTOS, :VER, :CENT;
  if (EXISTE = 'S') then
   BEGIN
    /* BORRE CUALQUEIR CONTABILIZACION PREVIA */
    DELETE FROM CONTABILIZACION WHERE CNTB_TIPOREF = 33 AND CNTB_IDREF = :IDDOC;
    /* TRAIGA EL ENCABEZADO DE LA DEVOLUCION */
   SELECT PREF_PRE, DEVT_NUMERO, DEVT_FECHA, F.TERC_NIT, DEVT_IVAINC, PTVT_ID, DEVT_FACTURA, DEVT_DTOMONTO, DEVT_ADICIONAL, DEVT_IVAMONTO, DEVT_EXTRA, DEVT_TOTAL, DEVT_RTFTEPORC, DEVT_RTFTEMONTO, DEVT_RTIVAPORC, DEVT_RTIVAMONTO, DEVT_RTICAPORC, DEVT_RTICAMONTO, TERC_CTARTFTE, TERC_CTARTIVA, TERC_CTARTICA, TERC_CTAVENTA, TERC_CTACLIENTE, DEVT_ANULADO, DEVT_REMID
        FROM DEVOLUCIONES_VENTAS F, TERCEROS T
        WHERE DEVT_ID = :IDDOC AND F.TERC_NIT = T.TERC_NIT
        INTO :PREF, :NUM, :FECAUX, :NIT, :IMPINC, :PTOVTA, :NUMFAC, :VRDTO, :VRADIC, :VRIVA, :VREXTRA, :VRTOTAL, :PRTFTE, :VRRTFTE, :PORC, :VRRTIVA, :PRTICA, :VRRTICA, :TCTARTFTE, TCTARTIVA, TCTARTICA, TCTAVENTA, TCTACLIEN, ANULADO, :IDREM;
   if (idrem is null) Then
    IDREM = 0;
   if ((ANULADO = 'N') AND (IDREM = 0)) then
    BEGIN
    NUMERO = PREF || NUM;
    SELECT SUM(DVDE_CONSUMO) FROM devoluciones_ventas_detalle WHERE DEVT_ID = :iddoc AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL)) INTO :MERCANCIA;
    VRSUBT = VRTOTAL - VREXTRA - VRIVA - MERCANCIA; /* BASE DE RETEFTE Y RETEICA */
    EXECUTE PROCEDURE lee_configuracion ('FACTURACION', 'DEVOLUCIONES', 'DESCUENTO PIE DEVOLUCION IGUAL A SUMA DE DESCUENTOS POR ITEM') returning_values (:DTOXIT);
    if (DTOXIT = 'SI') then
        VRDTO = 0;
    MERCANCIA = VRSUBT - VRADIC + VRDTO;
    IF (CENT = 'B') THEN
        SELECT B.BODE_CENTRO, B.BODE_PROY FROM BODEGA B, DEVOLUCIONES_VENTAS F
            WHERE B.BODE_COD = F.BODE_COD AND F.DEVT_ID = :IDDOC INTO :CENTRO, :PROY;
    IF (CENT = 'V') THEN
        SELECT V.CENT_COD, V.PROY_COD FROM VENDEDORES V, DEVOLUCIONES_VENTAS F
            WHERE V.VEND_COD = F.VEND_COD AND F.DEVT_ID = :IDDOC INTO :CENTRO, :PROY;
    IF (CENT = 'P') THEN
        SELECT P.PREF_CENTRO,P.PREF_PROY  FROM PREFIJOS P, DEVOLUCIONES_VENTAS F
            WHERE P.PREF_PRE = F.PREF_PRE AND F.DEVT_ID = :IDDOC AND P.TIDO_COD = 33 INTO :CENTRO, :PROY;
    EXECUTE PROCEDURE FECHA_A_CONTA(:FECAUX) returning_values (:FECHA);
    /* REGISTRE EL ENCABEZADO CONTABLE */
    IDC = GEN_ID(ID_CONTABILIZA, 1);
    CONC = 'DEVOLUCION VENTAS No. ' || NUMERO || ' EN FACTURA ' || NUMFAC;
    CONC = SUBSTR(CONC, 1, 60);
    INSERT INTO CONTABILIZACION (CNTB_ID, CNTB_TIPOCOMP, CNTB_PREFCNT, CNTB_NUMERO, CNTB_FECHA, CNTB_CONCEPTO, CNTB_REF, CNTB_TIPOREF, CNTB_IDREF, CNTB_PREFREF, CNTB_NUMREF, CNTB_PROCESADO)
        VALUES (:IDC, :TIPOCOMP, :PREFCONT, :NUM, :FECHA, :CONC, '', 33, :IDDOC, :PREF, :NUM, 'N');
    NROI = 0;
    SUMA = 0;
    ERROR = 0;
    /* SI NO HAY CUENTA DE DESCUENTO NI ADICIONAL CALCULE UN FACTOR PARA LAS VENTAS Y EL IVA */
    if (MERCANCIA <> 0) then
        FACTOR = CAST(VRSUBT AS DOUBLE PRECISION) / CAST(MERCANCIA AS DOUBLE PRECISION);
    ELSE
        FACTOR = 1;
    /* TRAIGA EL NUMERO DE DIGITOS PARA EL REDONDEO */
    SELECT CAST(CONF_VALOR AS INTEGER) FROM CONFIGURACION WHERE CONF_MODULO = 'FACTURACION' AND
        CONF_CATEGORIA = 'GENERAL' AND CONF_PROPIEDAD = 'REDONDEO AL MULTIPLO DE DIEZ EN TOTALES' INTO :DIG;
    /* CUENTAS DE VENTAS */
    if (VENTAS = 'A') then
        BEGIN
        FOR SELECT MAX(COAR_CTADEV), SUM(cast(DVDE_CANT as double precision) * (DVDE_PRUNIT-DVDE_DTOMONTO)), SUM(DVDE_IVAMONTO), SUM(DVDE_CONSUMO)
            FROM ARTICULO A, CONTABIL_ARTICULO C, DEVOLUCIONES_VENTAS_DETALLE F
            WHERE F.DEVT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
            GROUP BY COAR_CTADEV
            INTO :CTAVENTAS, :MONTO, :IMPTOS, :VRCONSUMO
            DO
            BEGIN
            if (IMPINC = 'S') then
                if (FOMENTO = 'SI') then
                    MONTO = MONTO - IMPTOS;
                ELSE
                    MONTO = MONTO - IMPTOS - VRCONSUMO;
            ELSE
            if (FOMENTO = 'SI') then
            MONTO = MONTO + VRCONSUMO;
            if ((CTADTO IS NULL) OR (CTADTO = '')) then
                MONTO = MONTO * FACTOR;
            execute procedure redondee(MONTO, DIG) returning_values (MONTO);
            if (MONTO <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTAVENTAS, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT F.ARTI_COD, (cast(DVDE_CANT as double precision) * (DVDE_PRUNIT-DVDE_DTOMONTO)), (DVDE_IVAMONTO+DVDE_CONSUMO)
                        FROM ARTICULO A, CONTABIL_ARTICULO C, DEVOLUCIONES_VENTAS_DETALLE F
                        WHERE F.DEVT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTAINV = :CUENTA AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
                        INTO :ART, :MONTO, :IMPTOS
                    DO
                        BEGIN
                        if (IMPINC = 'S') then
                            MONTO = MONTO - IMPTOS;
                        if ((CTADTO IS NULL) OR (CTADTO = '')) then
                            MONTO = MONTO * FACTOR;
                        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        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, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                    NROI = NROI + 1;
                    SUMA = SUMA + MONTO;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA + MONTO;
                    END
                END /* MONTO <> 0 */
            END /* FOR */
        END /* VENTAS X ARTICULO */
     IF ((VENTAS = 'C') OR (VENTAS = 'K')) THEN
        BEGIN
        IF (VENTAS = 'C') THEN
            CTAVENTAS = TCTAVENTA;
        SELECT SUM(cast(DVDE_CANT as double precision) * (DVDE_PRUNIT-DVDE_DTOMONTO)), SUM(DVDE_IVAMONTO), SUM(DVDE_CONSUMO)
            FROM DEVOLUCIONES_VENTAS_DETALLE F
            WHERE F.DEVT_ID = :IDDOC  AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
            INTO :MONTO, :IMPTOS, :VRCONSUMO;
        if (IMPINC = 'S') then
            if (FOMENTO = 'SI') then
               MONTO = MONTO - IMPTOS;
            ELSE
               MONTO = MONTO - IMPTOS - VRCONSUMO;
        ELSE
         if (FOMENTO = 'SI') then
          MONTO = MONTO + VRCONSUMO;
        if ((CTADTO IS NULL) OR (CTADTO = '')) then
            MONTO = MONTO * FACTOR;
        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
        if (MONTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTAVENTAS, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT F.ARTI_COD, (cast(DVDE_CANT as double precision) * (DVDE_PRUNIT-DVDE_DTOMONTO)), (DVDE_IVAMONTO+DVDE_CONSUMO)
                    FROM ARTICULO A, DEVOLUCIONES_VENTAS_DETALLE F
                    WHERE F.DEVT_ID = :IDDOC AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
                    INTO :ART, :MONTO, :IMPTOS
                    DO
                    BEGIN
                    if (IMPINC = 'S') then
                        MONTO = MONTO - IMPTOS;
                    if ((CTADTO IS NULL) OR (CTADTO = '')) then
                        MONTO = MONTO * FACTOR;
                    execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                    NROI = NROI + 1;
                    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, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                NROI = NROI + 1;
                SUMA = SUMA + MONTO;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA + MONTO;
                END
            END /* MONTO <> 0 */
        END /* VENTAS DE CLIENTE O CONSTANTE */
    /* EL IVA EN VENTAS */
    if (IVA = 'A') then
        BEGIN
        FOR SELECT MAX(COAR_CTAIVAV), SUM(DVDE_IVAMONTO), SUM(DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO), SUM(DVDE_CONSUMO)
            FROM ARTICULO A, CONTABIL_ARTICULO C, DEVOLUCIONES_VENTAS_DETALLE F
            WHERE F.DEVT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
            GROUP BY COAR_CTAIVAV
            INTO :CTAIVA, :IMPTOS, :MONTO, :VALORADIC
        DO
            BEGIN
            if (FOMENTO = 'SI') then
                MONTO = MONTO + VALORADIC;
            MONTO = MONTO * -1;
            MONTO = MONTO * FACTOR;
            IMPTOS = IMPTOS * FACTOR;
            execute procedure redondee(MONTO, DIG) returning_values (MONTO);
            execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
            if (IMPTOS <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTAIVA, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT F.ARTI_COD, DVDE_IVAMONTO, (cast(DVDE_CANT as double precision) * (DVDE_PRUNIT-DVDE_DTOMONTO)), TAIV_PORC, DVDE_CONSUMO
                        FROM ARTICULO A, CONTABIL_ARTICULO C, DEVOLUCIONES_VENTAS_DETALLE F, TARIFA_IVA T
                        WHERE F.DEVT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND A.TAIV_COD = T.TAIV_COD AND COAR_CTAIVAV = :CUENTA AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
                        INTO :ART, :IMPTOS, :MONTO, :PORCIVA, :VALORADIC
                    DO
                        BEGIN
                        if (IMPINC = 'S') then
                            MONTO = MONTO - IMPTOS - VALORADIC;
                        MONTO = MONTO * -1;
                        MONTO = MONTO * FACTOR;
                        IMPTOS = IMPTOS * FACTOR;
                        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                        execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                        if (IMPTOS <> 0) then
                            BEGIN
                            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :IMPTOS, 0, :MONTO, :PORCIVA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                            NROI = NROI + 1;
                            SUMA = SUMA + IMPTOS;
                            END
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                    NROI = NROI + 1;
                    SUMA = SUMA + IMPTOS;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA + IMPTOS;
                    END
                END   /* IMPTOS <> 0 */
            END /* FOR */
        END /* IVA X ARTICULO */
    if (IVA = 'K') then /* IVA EN CTA CONSTANTE */
        BEGIN
        SELECT SUM(DVDE_IVAMONTO), SUM(DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO), SUM(DVDE_CONSUMO)
            FROM DEVOLUCIONES_VENTAS_DETALLE F
            WHERE F.DEVT_ID = :IDDOC  AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
            INTO :IMPTOS, :MONTO, :VALORADIC;
        if (FOMENTO = 'SI') then
            MONTO = MONTO + VALORADIC;
        MONTO = MONTO * -1;
        MONTO = MONTO * FACTOR;
        IMPTOS = IMPTOS * FACTOR;
        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
        execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
        if (IMPTOS <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTAIVA, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT F.ARTI_COD, (cast(DVDE_CANT as double precision) * (DVDE_PRUNIT-DVDE_DTOMONTO)), DVDE_IVAMONTO, TAIV_PORC, DVDE_CONSUMO
                    FROM ARTICULO A, DEVOLUCIONES_VENTAS_DETALLE F, TARIFA_IVA T
                    WHERE F.DEVT_ID = :IDDOC AND A.TAIV_COD = T.TAIV_COD AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
                    INTO :ART, :MONTO, :IMPTOS, :PORCIVA, :VALORADIC
                    DO
                    BEGIN
                    if (IMPINC = 'S') then
                        MONTO = MONTO - IMPTOS - VALORADIC;
                    MONTO = MONTO * -1;
                    MONTO = MONTO * FACTOR;
                    IMPTOS = IMPTOS * FACTOR;
                    execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                    execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                    if (IMPTOS <> 0) then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', :IMPTOS, 0, :MONTO, :PORCIVA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        SUMA = SUMA + IMPTOS;
                        END
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                NROI = NROI + 1;
                SUMA = SUMA + IMPTOS;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA + IMPTOS;
                END
            END /* IMPTOS <> 0 */
        END /* IVA EN CTA CONSTANTE */
    /* EL IMPOCONSUMO */
    if ((CONSUMO = 'A') AND (FOMENTO <> 'SI')) then
        BEGIN
        FOR SELECT MAX(COAR_CTACONS), SUM(DVDE_CONSUMO)
            FROM ARTICULO A, CONTABIL_ARTICULO C, DEVOLUCIONES_VENTAS_DETALLE F
            WHERE F.DEVT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
            GROUP BY COAR_CTACONS
            INTO :CTACONSUMO, :IMPTOS
        DO
            BEGIN
            if (IMPTOS <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTACONSUMO, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, REGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT F.ARTI_COD, DVDE_CONSUMO
                        FROM ARTICULO A, CONTABIL_ARTICULO C, DEVOLUCIONES_VENTAS_DETALLE F
                        WHERE F.DEVT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTACONS = :CUENTA AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
                        INTO :ART, :IMPTOS
                    DO
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 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, :NROI, :CUENTA, :CONC, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                    NROI = NROI + 1;
                    SUMA = SUMA + IMPTOS;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA + IMPTOS;
                    END
                END /* IMPTOS <> 0 */
            END /* FOR */
        END /* CONSUMO X ARTICULO */
    if ((CONSUMO = 'K') AND (FOMENTO <> 'SI')) then
        BEGIN
        SELECT SUM(DVDE_CONSUMO)
            FROM DEVOLUCIONES_VENTAS_DETALLE F
            WHERE F.DEVT_ID = :IDDOC AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
            INTO :IMPTOS;
        if (IMPTOS <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTACONSUMO, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT F.ARTI_COD, DVDE_CONSUMO
                    FROM ARTICULO A, DEVOLUCIONES_VENTAS_DETALLE F
                    WHERE F.DEVT_ID = :IDDOC  AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
                    INTO :ART, :IMPTOS
                    DO
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTACONSUMO, :CONC, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                    NROI = NROI + 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, :NROI, :CTACONSUMO, :CONC, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA + IMPTOS;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTACONSUMO, :CONC, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA + IMPTOS;
                END
            END /* IMPTOS <> 0 */
        END /* CONSUMO EN CTA CONSTANTE */
    /* DESCUENTO */
    if ((CTADTO IS NOT NULL) AND
        (CTADTO <> '') AND
        (VRDTO <> 0)) THEN
        BEGIN
        EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTADTO, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRDTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
            NROI = NROI + 1;
            SUMA = SUMA - VRDTO;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRDTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 33);
            NROI = NROI + 1;
            SUMA = SUMA - VRDTO;
            END
        END /* DESCUENTO */
    /* VALOR ADIC */
    if ((CTAADIC IS NOT NULL) AND
        (CTAADIC <> '') AND
        (VRADIC <> 0)) THEN
        BEGIN
        EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTAADIC, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRADIC, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
            NROI = NROI + 1;
            SUMA = SUMA + VRADIC;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRADIC, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 33);
            NROI = NROI + 1;
            SUMA = SUMA + VRADIC;
            END
        END /* VR. ADIC */
    /* VALOR EXTRA */
    if ((CTAEXTRA IS NOT NULL) AND
        (CTAEXTRA <> '') AND
        (VREXTRA <> 0)) THEN
        BEGIN
        EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTAEXTRA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VREXTRA, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
            NROI = NROI + 1;
            SUMA = SUMA + VREXTRA;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VREXTRA, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 33);
            NROI = NROI + 1;
            SUMA = SUMA + VREXTRA;
            END
        END /* VR. EXTRA */
    /* RETENCION FUENTE */
    if ((RTFTE = 'C') or (RTFTE = 'K')) then
      if (VRRTFTE <> 0) then
        BEGIN
        if (RTFTE = 'C') then
            CTARTFTE = TCTARTFTE;
        EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTARTFTE, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, (:VRSUBT*-1), :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
            NROI = NROI + 1;
            SUMA = SUMA - VRRTFTE;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, (:VRSUBT*-1), :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA - VRRTFTE;
            END
        /* AUTORETENCION */
        if (FAUTORET <= fecaux) then
            BEGIN
            EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'CUENTA DE AUTORETENCION EN LA FUENTE') returning_values (CTARTFTE);
            EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTARTFTE, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :VRSUBT, :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                NROI = NROI + 1;
                SUMA = SUMA + VRRTFTE;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :VRSUBT, :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA + VRRTFTE;
                END
            END
        END /* RTFTE */
    if (RTFTE = 'A') then
      BEGIN
      FOR SELECT MAX(COAR_CTARTFTEV), MAX(COAR_RTFTE), MIN(COAR_RTBASE), SUM(DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO), SUM((DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO)*COAR_RTFTE)
        FROM CONTABIL_ARTICULO C, devoluciones_ventas_detalle F
        WHERE F.devt_id = :IDDOC AND F.ARTI_COD = C.ARTI_COD AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
        GROUP BY COAR_CTARTFTEV
        INTO :CTARTFTE, :PRTFTE, :baseadic, :MONTO, :VRRTFTE
        DO
        BEGIN
        MONTO = MONTO * FACTOR;
        if (MONTO >= BASEADIC) then
            BEGIN
            VRRTFTE = VRRTFTE * FACTOR / 100;
            execute procedure redondee(VRRTFTE, DIG) returning_values (VRRTFTE);
            execute procedure redondee(MONTO, DIG) returning_values (MONTO);
            if (VRRTFTE <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTARTFTE, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, (:MONTO*-1), :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                    NROI = NROI + 1;
                    SUMA = SUMA - VRRTFTE;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, (:MONTO*-1), :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA - VRRTFTE;
                    END
                /* AUTORETENCION */
                if (FAUTORET <= fecaux) then
                    BEGIN
                    EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'CUENTA DE AUTORETENCION EN LA FUENTE') returning_values (CTARTFTE);
                    EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTARTFTE, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
                    if (ERRORC <> 0) then
                        ERROR = ERROR + 1;
                    if (TIPOCUEN = 'C') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :MONTO, :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                        NROI = NROI + 1;
                        SUMA = SUMA + VRRTFTE;
                        END
                    if (TIPOCUEN = 'N') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :MONTO, :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NROI = NROI + 1;
                        SUMA = SUMA + VRRTFTE;
                        END
                    END
                END
            END
        END /* RTFTE */
      END
    /* RETENCION IVA */
    if ((RTIVA = 'C') or (RTIVA = 'K')) then
      if (VRRTIVA <> 0) then
        BEGIN
        if (RTIVA = 'C') then
            CTARTIVA = TCTARTIVA;
        EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTARTIVA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTIVA, (:VRIVA*-1), :PORC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
            NROI = NROI + 1;
            SUMA = SUMA - VRRTIVA;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTIVA, (:VRIVA*-1), :PORC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA - VRRTIVA;
            END
        END /* RTIVA */
    /* RETENCION DE ICA */
    if ((RTICA = 'C') or (RTICA = 'K')) then
      if (VRRTICA <> 0) then
        BEGIN
        if (RTICA = 'C') then
            CTARTICA = TCTARTICA;
        EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTARTICA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTICA, (:VRSUBT*-1), :PRTICA, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
            NROI = NROI + 1;
            SUMA = SUMA - VRRTICA;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTICA, (:VRSUBT*-1), :PRTICA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA - VRRTICA;
            END
        END /* RTICA */
    /* CIERRE EL COMPROBANTE CONTRA LA CUENTA DEL TERCERO O LA CONSTANTE */
    if ((SUMA <> 0) and ((CARTERA = 'C') or (CARTERA = 'K') or (CARTERA = 'J'))) then
        BEGIN
        if (SUMA < 0) then
            BEGIN
            DEBITO = SUMA * -1;
            CREDITO = 0;
            END
        ELSE
            BEGIN
            DEBITO = 0;
            CREDITO = SUMA;
            END
        if (CARTERA = 'C') then
            CTACARTERA = TCTACLIEN;
        if (CARTERA = 'J') then
            BEGIN
            /* BUSQUE LA CUENTA DE LA CAJA */
            SELECT CAJA_CUENTA FROM CAJAS C, PUNTO_VENTA P
                WHERE P.CAJA_ID = C.CAJA_ID AND PTVT_ID = :PTOVTA
                INTO :CTACARTERA;
            END
        EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTACARTERA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :DEBITO, :CREDITO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
        if (TIPOCUEN = 'N') then
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :DEBITO, :CREDITO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
        NROI = NROI + 1;
        END /* SUMA EN CARTERA */
    /* CALCULE COSTOS EN VENTAS */
    EXECUTE PROCEDURE COSTO_EN_VENTAS(33, :IDDOC);
    if (COSTOS = 'A') then
        BEGIN
        FOR SELECT MAX(CTACOS), SUM(cast(CANT as double precision) * COSTO)
            FROM COSTO_VENTAS
            GROUP BY CTACOS
            INTO :CTACOSTOS, :MONTO
        DO
            BEGIN
            if (MONTO <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTACOSTOS, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT ARTI_COD, cast(CANT as double precision) * COSTO
                        FROM COSTO_VENTAS
                        WHERE CTACOS = :CUENTA
                        INTO :ART, :MONTO
                    DO
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                    NROI = NROI + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    END
                END /* MONTO <> 0 */
            END /* FOR */
        END /* COSTOS */
    if (COSTOS = 'K') then
        BEGIN
        SELECT SUM(cast(CANT as double precision) * COSTO)
            FROM COSTO_VENTAS
            INTO :MONTO;
        if (MONTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTACOSTOS, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, REGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT ARTI_COD, cast(CANT as double precision) * COSTO
                    FROM COSTO_VENTAS
                    INTO :ART, :MONTO
                DO
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTACOSTOS, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                    NROI = NROI + 1;
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTACOSTOS, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                NROI = NROI + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTACOSTOS, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                END
            END /* MONTO <> 0 */
        END /* COSTOS = K */
    if (INVEN = 'A') then
        BEGIN
        FOR SELECT MAX(CTAINV), SUM(cast(CANT as double precision) * COSTO)
            FROM COSTO_VENTAS
            GROUP BY CTAINV
            INTO :CTAINVEN, :MONTO
        DO
            BEGIN
            if (MONTO <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTAINVEN, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, REGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT ARTI_COD, cast(CANT as double precision) * COSTO
                        FROM COSTO_VENTAS
                        WHERE CTAINV = :CUENTA
                        INTO :ART, :MONTO
                    DO
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                    NROI = NROI + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    END
                END /* MONTO <> 0 */
            END /* FOR */
        END /* INVEN = A */
    if (INVEN = 'K') then
        BEGIN
        SELECT SUM(cast(CANT as double precision) * COSTO)
            FROM COSTO_VENTAS
            INTO :MONTO;
        if (MONTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTAINVEN, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT ARTI_COD, cast(CANT as double precision) * COSTO
                    FROM COSTO_VENTAS
                    INTO :ART, :MONTO
                DO
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTAINVEN, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                    NROI = NROI + 1;
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAINVEN, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                NROI = NROI + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAINVEN, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                END
            END /* MONTO <> 0 */
        END /* INVEN = K */
    /* recorra las cuentas adicionales */
    FOR SELECT INVC_CUENTA, INVC_BASE, INVC_PORC, INVC_VALOR, INVC_DB
        FROM INTERFAZ_VENTAS_CTAS WHERE INVE_ID = :IDINTER
        INTO :CTADIC, :BASEADIC, :PORCADIC, :VALORADIC, :DBADIC
        DO
        BEGIN
        if (valoradic <> 0) then
            monto = valoradic;
        else
            BEGIN
            if (:BASEADIC = 'SUBTOTAL') then
                VALORADIC = vrsubt;
            if (:BASEADIC = 'DESCUENTO') then
                VALORADIC = VRDTO;
            if (:BASEADIC = 'IVA') then
                VALORADIC = VRIVA;
            if (:BASEADIC = 'ADICIONAL') then
                VALORADIC = VRADIC;
            if (:BASEADIC = 'EXTRA') then
                VALORADIC = VREXTRA;
            if (:BASEADIC = 'TOTAL') then
                VALORADIC = VRTOTAL;
            MONTO = VALORADIC * PORCADIC;
            END
        if (MONTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTADIC, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                if (DBADIC = 'S') then
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                ELSE
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                NROI = NROI + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                if (DBADIC = 'S') then
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                ELSE
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                END
            NROI = NROI + 1;
            END
        END
    if (error > 0) then
        ver = 'S';
    SUSPEND;
    END
   END /* EXISTE LA INTERFAZ */
  ELSE
    BEGIN
    EXECUTE PROCEDURE ERROR (33, :IDDOC, :PREF, 1);
    ERROR = ERROR + 1;
    VER = 'S';
    SUSPEND;
    END
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE DEVOLUCIONES_SIN_CONTABILIDAD(
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    ID INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    ESTADO VARCHAR(20),
    IDI INTEGER,
    IDC INTEGER)
AS
DECLARE VARIABLE VER CHAR(2);
declare variable FECICNT VARCHAR(10);
declare variable FECFCNT VARCHAR(10);
declare variable ERROR INTEGER;
declare variable idref INTEGER;
BEGIN /*$$IBE$$ 
EXECUTE PROCEDURE fecha_a_conta(FECINI) returning_values (FECICNT);
EXECUTE PROCEDURE fecha_a_conta(FECFIN) returning_values (FECFCNT);
FOR SELECT DEVT_ID, PREF_PRE, DEVT_NUMERO FROM devoluciones_ventas WHERE DEVT_ANULADO = 'N' AND
    DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN
    INTO :ID, :PREF, :NUMERO
DO
  BEGIN
  idref = null;
  SELECT ENCO_IDREF FROM COMPROBANTE_ENCABEZADO WHERE ENCO_TIPOREF = 33 AND ENCO_FECHA >= :FECICNT AND ENCO_FECHA <= :FECFCNT and ENCO_IDREF = :id into :idref;
  if (idref IS NULL) then
  begin
   ESTADO = 'PROCESANDO';
   SUSPEND;
   SELECT MAX(INVE_ID) FROM INTERFAZ_VENTAS WHERE PREF_PRE = :PREF AND TIDO_COD = 33 INTO :IDI;
   EXECUTE PROCEDURE contabil_devolcli (:ID, :IDI) RETURNING_VALUES (:ERROR, :VER, :IDC);
   if (ERROR = 0) then
    BEGIN
    EXECUTE PROCEDURE CONTABILIZA_PENDIENTE (:IDC);
    ESTADO = 'OK';
    END
   ELSE
    ESTADO = 'ERROR';
   suspend;
  End
  END
 $$IBE$$*/ SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE DEVOLUCIONES_SIN_CONTABILIDAD(
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    ID INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    ESTADO VARCHAR(20),
    IDI INTEGER,
    IDC INTEGER)
AS
DECLARE VARIABLE VER CHAR(2);
declare variable FECICNT VARCHAR(10);
declare variable FECFCNT VARCHAR(10);
declare variable ERROR INTEGER;
declare variable idref INTEGER;
BEGIN
EXECUTE PROCEDURE fecha_a_conta(FECINI) returning_values (FECICNT);
EXECUTE PROCEDURE fecha_a_conta(FECFIN) returning_values (FECFCNT);
FOR SELECT DEVT_ID, PREF_PRE, DEVT_NUMERO FROM devoluciones_ventas WHERE DEVT_ANULADO = 'N' AND
    DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN
    INTO :ID, :PREF, :NUMERO
DO
  BEGIN
  idref = null;
  SELECT ENCO_IDREF FROM COMPROBANTE_ENCABEZADO WHERE ENCO_TIPOREF = 33 AND ENCO_FECHA >= :FECICNT AND ENCO_FECHA <= :FECFCNT and ENCO_IDREF = :id into :idref;
  if (idref IS NULL) then
  begin
   ESTADO = 'PROCESANDO';
   SUSPEND;
   SELECT MAX(INVE_ID) FROM INTERFAZ_VENTAS WHERE PREF_PRE = :PREF AND TIDO_COD = 33 INTO :IDI;
   EXECUTE PROCEDURE contabil_devolcli (:ID, :IDI) RETURNING_VALUES (:ERROR, :VER, :IDC);
   if (ERROR = 0) then
    BEGIN
    EXECUTE PROCEDURE CONTABILIZA_PENDIENTE (:IDC);
    ESTADO = 'OK';
    END
   ELSE
    ESTADO = 'ERROR';
   suspend;
  End
  END
END

^

SET TERM ; ^

SET TERM ^ ;

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

SET TERM ; ^


/* 20081210 SALDO TOTAL EN CONSULTA VENTAS Y DEMAS POR TABLA DE COSTOS Y NO POR EXISTENCIAS */

SET TERM ^ ;

CREATE OR ALTER PROCEDURE SALDO_TOTAL_INVENTARIO(
    ARTICULO VARCHAR(15),
    FECHA DATE)
RETURNS (
    SALDO NUMERIC(18,4))
AS
DECLARE VARIABLE SALDO_BOD NUMERIC(15,4);
DECLARE VARIABLE BOD VARCHAR(2);
BEGIN
/*
  SALDO = 0;
  FOR
    SELECT BODE_COD FROM BODEGA WHERE BODE_ACTIVA = 'S' INTO :BOD
  DO
    BEGIN
    EXECUTE PROCEDURE SALDO_INVENTARIO(:ARTICULO, :BOD, :FECHA) RETURNING_VALUES :SALDO_BOD;
    SALDO = SALDO + SALDO_BOD;
    END*/
SELECT FIRST 1 COST_SALDOC+COST_ENTC-COST_SALC
    FROM COSTOS WHERE ARTI_COD = :ARTICULO AND COST_FECHA <= :FECHA
    ORDER BY COST_FECHA DESC,COST_ITEM DESC
    INTO :SALDO;
if (SALDO IS NULL) then
    SALDO = 0;
  SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE CONSULTA_ARTICULOS_VTAS(
    FECHA DATE,
    INACTIVOS CHAR(1),
    MODULO VARCHAR(20))
RETURNS (
    CODIGO VARCHAR(20),
    DES VARCHAR(60),
    REF VARCHAR(20),
    GRUPO VARCHAR(30),
    MARCA VARCHAR(30),
    UNIDAD VARCHAR(8),
    ESTADO VARCHAR(30),
    IVA NUMERIC(9,2),
    EXISTEN NUMERIC(18,4),
    PRECIO NUMERIC(18,2),
    CLASE CHAR(1),
    OBS VARCHAR(255))
AS
DECLARE VARIABLE LISTA INTEGER;
DECLARE VARIABLE EXIST CHAR(2);
DECLARE VARIABLE SINEXIST CHAR(2);
declare variable DIG INTEGER;
BEGIN /*$$IBE$$ 
EXISTEN = 0;
EXECUTE PROCEDURE lee_configuracion ('FACTURACION','ARTICULOS', 'VER EXISTENCIA EN CONSULTA ARTICULOS') returning_values (:EXIST);
EXECUTE PROCEDURE lee_configuracion ('FACTURACION','FACTURAS', 'CODIGO DE LA LISTA DE PRECIOS A MOSTRAR EN ARTICULOS') returning_values (:LISTA);
if (modulo = 'FACTURACION') then
  EXECUTE PROCEDURE lee_configuracion ('FACTURACION','ARTICULOS','VER ARTICULOS SIN EXISTENCIA EN CONSULTA DE ARTICULOS') returning_values (:sinexist);
else
  sinexist = 'SI';
EXECUTE PROCEDURE LEE_CONFIGURACION ('FACTURACION', 'ARTICULOS', 'REDONDEO AL MULTIPLO DE DIEZ EN PRECIOS') returning_values (DIG);
if (LISTA > 0) then
    BEGIN
    FOR select a.arti_cod, arti_des, grup_cod, arti_unidad, esar_cod, taiv_porc, marc_cod,arti_clase, SUBSTRING(ARTI_OBS FROM 1 FOR 255)
        from articulo a, tarifa_iva t
        where a.taiv_cod = t.taiv_cod and substring(a.arti_cod from 1 FOR 2) <> '.t' and
        ((:INACTIVOS = 'S') or (esar_cod = 'A') or ((:INACTIVOS = 'C') AND (esar_cod = 'N')))
        INTO :CODIGO, :DES, :GRUPO, :UNIDAD, :ESTADO, :IVA, :MARCA, :CLASE, :OBS
        do
        begin
        PRECIO = 0;
        SELECT prar_fijo PRECIO FROM precios_articulo WHERE arti_cod = :CODIGO and lipr_cod = :LISTA INTO :PRECIO;
        EXECUTE PROCEDURE redondee(PRECIO, DIG) returning_values (PRECIO);
        if (EXIST = 'SI') then
            BEGIN
            EXECUTE PROCEDURE saldo_total_inventario (:CODIGO, :FECHA) returning_values (:EXISTEN);
            if ((SINEXIST = 'SI')  or (existen <> 0)) then
                SUSPEND;
            END
        ELSE
            SUSPEND;
        select first 1 coba_cod from barras_articulo where arti_cod = :codigo into :ref;
        end
    END
ELSE
    FOR select arti_cod, arti_des, grup_cod, arti_unidad, esar_cod, taiv_porc, arti_precio, marc_cod, arti_clase, SUBSTRING(ARTI_OBS FROM 1 FOR 255)
        from articulo a, tarifa_iva t
        where a.taiv_cod = t.taiv_cod and substring(a.arti_cod from 1 FOR 2) <> '.t' and
        ((:INACTIVOS = 'S') or (esar_cod = 'A') or ((:INACTIVOS = 'C') AND (esar_cod = 'N')))
        INTO :CODIGO, :DES, :GRUPO, :UNIDAD, :ESTADO, :IVA, :PRECIO, :MARCA, :CLASE, :OBS
        do
        begin
        if (EXIST = 'SI') then
            BEGIN
            EXECUTE PROCEDURE saldo_total_inventario (:CODIGO, :FECHA) returning_values (:EXISTEN);
            if ((SINEXIST = 'SI') or (existen <> 0)) then
                SUSPEND;
            END
        ELSE
            SUSPEND;
        select first 1 coba_cod from barras_articulo where arti_cod = :codigo into :ref;
        end
 $$IBE$$*/ SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE DISPONIBILIDAD_TOTAL_ARTICULO(
    ARTICULO VARCHAR(15),
    FECHA DATE)
RETURNS (
    DISPONIBILIDAD INTEGER,
    EXIST NUMERIC(18,4),
    PROMEDIO NUMERIC(18,4),
    SALIDAS NUMERIC(18,4))
AS
BEGIN /*$$IBE$$ 
  EXECUTE PROCEDURE saldo_total_inventario (ARTICULO, FECHA) returning_values (:EXIST);
  EXECUTE PROCEDURE PROMEDIO_TOTAL_ARTICULO(:ARTICULO, :FECHA) returning_values (:PROMEDIO, :SALIDAS);
  if (PROMEDIO > 0) then
    DISPONIBILIDAD = EXIST / PROMEDIO;
  ELSE
    DISPONIBILIDAD = 0;
  SUSPEND;
 $$IBE$$*/ SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE IMPR_ARTICULO(
    CODINI VARCHAR(20),
    CODFIN VARCHAR(20),
    CANT INTEGER)
RETURNS (
    ARTICULO VARCHAR(15),
    DESCRIPCION VARCHAR(60),
    PRECIO NUMERIC(18,2),
    CODGRP VARCHAR(2),
    NOMGRP VARCHAR(30),
    COSUBG VARCHAR(3),
    NOMSUBG VARCHAR(30),
    CODMARC VARCHAR(3),
    NOMMARC VARCHAR(30),
    PESO NUMERIC(18,4),
    PUM NUMERIC(18,2),
    LISTA INTEGER,
    NOMLISTA VARCHAR(30),
    FECHA DATE)
AS
declare variable I INTEGER;
begin /*$$IBE$$ 
EXECUTE PROCEDURE lee_configuracion('FACTURACION', 'FACTURAS', 'CODIGO DE LA LISTA DE PRECIOS A MOSTRAR EN ARTICULOS') returning_values (LISTA);
for select a.arti_cod, arti_des, a.grup_cod, a.subg_cod, a.marc_cod, arti_peso, p.lipr_cod, p.prar_fijo, grup_nom, lipr_nom
    from articulo a, precios_articulo p, grupo g, lista_precios l
    where a.arti_cod = p.arti_cod and a.grup_cod = g.grup_cod and l.lipr_cod = p.lipr_cod AND a.arti_cod >= :codini AND a.arti_cod <= :codfin AND P.lipr_cod = :LISTA
    into :articulo, :descripcion, :codgrp, :cosubg, :codmarc, :peso, :lista, :precio, :nomgrp, :nomlista
    do
    begin
    if (cosubg <> '') then
        select subg_nom from subgrupo where grup_cod = :codgrp and subg_cod = :cosubg into :nomsubg;
    if (codmarc <> '') then
        select marc_nom from marcas where marc_cod = :codmarc into :nommarc;
    if ((PESO <> 0) AND (PESO IS NOT NULL)) then
        PUM = PRECIO / PESO;
    ELSE
        PUM = 0;
    SELECT MAX(AUDI_FECHA) FROM AUDITORIA WHERE TIDO_COD = 126 AND AUDI_COD = :articulo AND AUDI_OPER <> 'D' INTO :fecha;
    if (cant = 0) then
        execute procedure saldo_total_inventario(:articulo, cast('now' as DATE)) returning_values (CANT);
    I = 1;
    WHILE (I < CANT) DO
        BEGIN
        SUSPEND;
        I = I + 1;
        END
    end
 $$IBE$$*/ SUSPEND;
end
^

SET TERM ; ^

SET TERM ^ ;

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

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE REP_ABC_INVENTARIO(
    FECHA DATE,
    ARTINI VARCHAR(20),
    ARTFIN VARCHAR(20),
    GRPINI VARCHAR(2),
    GRPFIN VARCHAR(2),
    ORDEN CHAR(1),
    DIAS INTEGER)
RETURNS (
    CODIGO VARCHAR(15),
    NOMBRE VARCHAR(60),
    UNIDAD VARCHAR(8),
    CODGRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    CODSUBG VARCHAR(3),
    NOMSUBG VARCHAR(30),
    CODMARC VARCHAR(3),
    NOMMARC VARCHAR(30),
    COSTO NUMERIC(18,2),
    SALIDAT NUMERIC(18,4),
    VPROMEDIO NUMERIC(18,4),
    PORC NUMERIC(9,2),
    CLASE CHAR(1))
AS
DECLARE VARIABLE CODINI VARCHAR(20);
DECLARE VARIABLE CODFIN VARCHAR(20);
DECLARE VARIABLE DESINI VARCHAR(20);
DECLARE VARIABLE DESFIN VARCHAR(20);
declare variable ACUMULADO NUMERIC(18,2);
declare variable EXIST NUMERIC(18,2);
declare variable ACUMPORC NUMERIC(9,2);
declare variable FECINI DATE;
declare variable A NUMERIC(9,2);
declare variable B NUMERIC(9,2);
declare variable C NUMERIC(9,2);
BEGIN /*$$IBE$$ 
if (ORDEN = 'C') then
    BEGIN
    CODINI = ARTINI;
    CODFIN = ARTFIN;
    DESINI = '';
    DESFIN = 'zz';
    END
ELSE
    BEGIN
    DESINI = ARTINI;
    DESFIN = ARTFIN;
    CODINI = '';
    CODFIN = 'zz';
    END
DELETE FROM analisis_abcinven;
acumporc = 0;
FECINI = FECHA - DIAS;
 $$IBE$$*/ /* CALCULE LA VENTA PROMEDIO DE CADA ARTICULO */ /*$$IBE$$ 
EXECUTE PROCEDURE LEE_CONFIGURACION ('INVENTARIO', 'EXISTENCIAS', 'PORCENTAJE MINIMO PARA ARTICULO CLASE "A"') returning_values (A);
EXECUTE PROCEDURE LEE_CONFIGURACION ('INVENTARIO', 'EXISTENCIAS', 'PORCENTAJE MINIMO PARA ARTICULO CLASE "B"') returning_values (B);
EXECUTE PROCEDURE LEE_CONFIGURACION ('INVENTARIO', 'EXISTENCIAS', 'PORCENTAJE MINIMO PARA ARTICULO CLASE "C"') returning_values (C);
FOR SELECT ARTI_COD, ARTI_UNIDAD FROM ARTICULO A
      WHERE ARTI_COD >= :CODINI AND ARTI_COD <= :CODFIN AND A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :GRPFIN AND ARTI_DES >= :DESINI AND ARTI_DES <= :DESFIN AND A.ESAR_COD <> 'I'
      INTO :CODIGO, :UNIDAD
      DO
      BEGIN
      EXECUTE PROCEDURE ultimo_costo(:CODIGO, :FECHA, :UNIDAD) returning_values (:COSTO);
      SELECT SUM(MVAR_CANT) FROM MOVIMIENTO_ARTICULO
        WHERE ARTI_COD = :codigo AND MVAR_FECHA >= :FECINI AND MVAR_FECHA <= :FECHA AND MVAR_ENTRADA = 'N' AND MVAR_TIPODOC <> 13 INTO :SALIDAT;
      if (SALIDAT IS NULL) then
        SALIDAT = 0;
      VPROMEDIO = SALIDAT * COSTO;
      insert into analisis_abcinven (ABCI_COD, ABCI_VENTA) VALUES (:codigo, :vpromedio);
      END
SELECT SUM(ABCI_VENTA) FROM analisis_abcinven INTO :acumulado;
FOR SELECT ARTI_COD, ARTI_DES, ARTI_UNIDAD, ARTI_DIAS, A.GRUP_COD, GRUP_NOM, A.SUBG_COD, A.MARC_COD, ABCI_VENTA
      FROM ARTICULO A, GRUPO G, analisis_abcinven N
      WHERE A.ARTI_COD = N.abci_cod AND G.GRUP_COD = A.GRUP_COD
      ORDER BY ABCI_VENTA DESC
      INTO :CODIGO, :NOMBRE, :UNIDAD, :DIAS, :CODGRUPO, :NOMGRUPO, :CODSUBG, :CODMARC, :vpromedio
      DO
        BEGIN
        NOMMARC = '';
        NOMSUBG = '';
        SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO :NOMMARC;
        SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
        EXECUTE PROCEDURE ultimo_costo(:CODIGO, :FECHA, :UNIDAD) returning_values (:COSTO);
        EXECUTE PROCEDURE saldo_total_inventario (:codigo, FECHA) returning_values (:EXIST);
        costo = costo * exist;
        SELECT SUM(MVAR_CANT) FROM MOVIMIENTO_ARTICULO
          WHERE ARTI_COD = :codigo AND MVAR_FECHA >= :FECINI AND MVAR_FECHA <= :FECHA AND MVAR_ENTRADA = 'N' AND MVAR_TIPODOC <> 13 INTO :SALIDAT;
        if (SALIDAT IS NULL) then
          SALIDAT = 0;
        if (acumulado <> 0) then
            PORC = vpromedio / acumulado * 100;
        ELSE
            PORC = 0;
        acumporc = acumporc + porc;
        if (acumporc < A) then
            CLASE = 'A';
        else
            if (acumporc < B) then
                CLASE = 'B';
            else
                if (acumporc < c) then
                    CLASE = 'C';
                else
                    CLASE = 'D';
        SUSPEND;
        END
 $$IBE$$*/ SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

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

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE REP_DISPONIBILIDAD(
    FECHA DATE,
    ARTINI VARCHAR(20),
    ARTFIN VARCHAR(20),
    GRPINI VARCHAR(2),
    GRPFIN VARCHAR(2),
    ORDEN CHAR(1),
    CEROS CHAR(1),
    DETALLE CHAR(1),
    SUCURSAL INTEGER)
RETURNS (
    CODIGO VARCHAR(15),
    NOMBRE VARCHAR(60),
    UNIDAD VARCHAR(8),
    CODGRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    CODSUBG VARCHAR(3),
    NOMSUBG VARCHAR(30),
    CODMARC VARCHAR(3),
    NOMMARC VARCHAR(30),
    CODBOD VARCHAR(2),
    NOMBOD VARCHAR(30),
    EXIST NUMERIC(18,4),
    PROMEDIO NUMERIC(18,4),
    SALIDAS NUMERIC(18,4),
    DISPONIBILIDAD INTEGER,
    DIAS INTEGER,
    PROMEDIADO INTEGER,
    COSTO NUMERIC(18,2),
    COSTOPRO NUMERIC(18,2),
    SUGERIDO NUMERIC(18,4),
    FECCOMPRA DATE)
AS
DECLARE VARIABLE CODINI VARCHAR(20);
DECLARE VARIABLE CODFIN VARCHAR(20);
DECLARE VARIABLE DESINI VARCHAR(20);
declare variable FECINI DATE;
declare variable DIASC VARCHAR(255);
DECLARE VARIABLE DESFIN VARCHAR(20);
declare variable DIA_ART VARCHAR(2) CHARACTER SET NONE;
BEGIN /*$$IBE$$ 
if (ORDEN = 'C') then
    BEGIN
    CODINI = ARTINI;
    CODFIN = ARTFIN;
    DESINI = '';
    DESFIN = 'zz';
    END
ELSE
    BEGIN
    DESINI = ARTINI;
    DESFIN = ARTFIN;
    CODINI = '';
    CODFIN = 'zz';
    END
if (DETALLE = 'S') then
  BEGIN
  FOR SELECT ARTI_COD, ARTI_DES, ARTI_UNIDAD, ARTI_DIAS, A.GRUP_COD, GRUP_NOM, A.SUBG_COD, A.MARC_COD, BODE_COD, BODE_NOM, ARTI_DIANALIS
      FROM ARTICULO A, GRUPO G, BODEGA B
      WHERE ARTI_COD >= :CODINI AND ARTI_COD <= :CODFIN AND A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :GRPFIN AND ARTI_DES >= :DESINI AND ARTI_DES <= :DESFIN AND
      G.GRUP_COD = A.GRUP_COD AND A.ESAR_COD <> 'I' AND ((SUCU_ID = :SUCURSAL) or (:SUCURSAL = 0))
      INTO :CODIGO, :NOMBRE, :UNIDAD, :DIAS, :CODGRUPO, :NOMGRUPO, :CODSUBG, :CODMARC, :CODBOD, :NOMBOD, :PROMEDIADO
      DO
        BEGIN
        NOMMARC = '';
        NOMSUBG = '';
        SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO :NOMMARC;
        SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
        EXECUTE PROCEDURE ultimo_costo(:CODIGO, :FECHA, :UNIDAD) returning_values (:COSTO);
        EXECUTE PROCEDURE costo_promedio(:CODIGO, :FECHA) RETURNING_VALUES :costopro;
        EXECUTE PROCEDURE DISPONIBILIDAD_ARTICULO(CODIGO, FECHA, :CODBOD) returning_values (:DISPONIBILIDAD, :EXIST, :PROMEDIO, :SALIDAS);
         $$IBE$$*/ /*ESTABLECER CUAL ES EL VALOR DE DIAS PARA PROMEDIO*/ /*$$IBE$$ 
        EXECUTE PROCEDURE lee_configuracion ('INVENTARIO', 'EXISTENCIAS', 'PROMEDIAR LAS SALIDAS DEL INVENTARIO CON EL NUMERO DE DIAS ASIGNADO A CADA ARTICULO') returning_values (:DIA_ART);
        if (DIA_ART = 'NO') then
          BEGIN
            EXECUTE PROCEDURE lee_configuracion ('INVENTARIO', 'EXISTENCIAS', 'NUMERO DE DIAS PARA PROMEDIO DE SALIDAS POR ARTICULO') returning_values (DIASC);
            PROMEDIADO = CAST(DIASC AS INTEGER);
          END
        FECINI = :FECHA - :PROMEDIADO;
        if ((DISPONIBILIDAD < DIAS) and (PROMEDIO > 0))then
            SUGERIDO = (DIAS * PROMEDIO) - EXIST;
        ELSE
            SUGERIDO = 0;
        SELECT MAX(FACO_FECHA) FROM FACTURAS_COMPRA F, FACTURAS_COMPRAS_DETALLE D
            WHERE F.FACO_ID = D.faco_id AND D.ARTI_COD = :CODIGO AND FACO_FECHA <= :FECHA AND D.bode_cod = :codbod
            INTO :FECCOMPRA;
        if ((PROMEDIO > 0) or (EXIST <> 0) or (CEROS = 'S')) then
            SUSPEND;
        END
  END
ELSE
  BEGIN
  FOR SELECT ARTI_COD, ARTI_DES, ARTI_UNIDAD, ARTI_DIAS, A.GRUP_COD, GRUP_NOM, A.SUBG_COD, A.MARC_COD, ARTI_DIANALIS
      FROM ARTICULO A, GRUPO G
      WHERE ARTI_COD >= :CODINI AND ARTI_COD <= :CODFIN AND A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :GRPFIN AND ARTI_DES >= :DESINI AND ARTI_DES <= :DESFIN AND G.GRUP_COD = A.GRUP_COD AND A.ESAR_COD <> 'I'
      INTO :CODIGO, :NOMBRE, :UNIDAD, :DIAS, :CODGRUPO, :NOMGRUPO, :CODSUBG, :CODMARC, :PROMEDIADO
      DO
        BEGIN
        NOMMARC = '';
        NOMSUBG = '';
        SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO :NOMMARC;
        SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
        EXECUTE PROCEDURE costo_promedio(:CODIGO, :FECHA) RETURNING_VALUES :costopro;
        EXECUTE PROCEDURE ultimo_costo(:CODIGO, :FECHA, :UNIDAD) returning_values (:COSTO);
        EXECUTE PROCEDURE DISPONIBILIDAD_TOTAL_ARTICULO(CODIGO, FECHA) returning_values (:DISPONIBILIDAD, :EXIST, :PROMEDIO, :SALIDAS);
         $$IBE$$*/ /*ESTABLECER CUAL ES EL VALOR DE DIAS PARA PROMEDIO*/ /*$$IBE$$ 
        EXECUTE PROCEDURE lee_configuracion ('INVENTARIO', 'EXISTENCIAS', 'PROMEDIAR LAS SALIDAS DEL INVENTARIO CON EL NUMERO DE DIAS ASIGNADO A CADA ARTICULO') returning_values (:DIA_ART);
        if (DIA_ART = 'NO') then
          BEGIN
            EXECUTE PROCEDURE lee_configuracion ('INVENTARIO', 'EXISTENCIAS', 'NUMERO DE DIAS PARA PROMEDIO DE SALIDAS POR ARTICULO') returning_values (DIASC);
            PROMEDIADO = CAST(DIASC AS INTEGER);
          END
        FECINI = :FECHA - :PROMEDIADO;
        if ((DISPONIBILIDAD < DIAS) and (PROMEDIO > 0))then
            SUGERIDO = (DIAS * PROMEDIO) - EXIST;
        ELSE
            SUGERIDO = 0;
        SELECT MAX(FACO_FECHA) FROM FACTURAS_COMPRA F, FACTURAS_COMPRAS_DETALLE D
            WHERE F.FACO_ID = D.faco_id AND D.ARTI_COD = :CODIGO AND FACO_FECHA <= :FECHA
            INTO :FECCOMPRA;
        if ((PROMEDIO > 0) or (EXIST <> 0) or (CEROS = 'S')) then
            SUSPEND;
        END
  END
 $$IBE$$*/ SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE CONSULTA_ARTICULOS_VTAS(
    FECHA DATE,
    INACTIVOS CHAR(1),
    MODULO VARCHAR(20))
RETURNS (
    CODIGO VARCHAR(20),
    DES VARCHAR(60),
    REF VARCHAR(20),
    GRUPO VARCHAR(30),
    MARCA VARCHAR(30),
    UNIDAD VARCHAR(8),
    ESTADO VARCHAR(30),
    IVA NUMERIC(9,2),
    EXISTEN NUMERIC(18,4),
    PRECIO NUMERIC(18,2),
    CLASE CHAR(1),
    OBS VARCHAR(255))
AS
DECLARE VARIABLE LISTA INTEGER;
DECLARE VARIABLE EXIST CHAR(2);
DECLARE VARIABLE SINEXIST CHAR(2);
declare variable DIG INTEGER;
BEGIN
EXISTEN = 0;
EXECUTE PROCEDURE lee_configuracion ('FACTURACION','ARTICULOS', 'VER EXISTENCIA EN CONSULTA ARTICULOS') returning_values (:EXIST);
EXECUTE PROCEDURE lee_configuracion ('FACTURACION','FACTURAS', 'CODIGO DE LA LISTA DE PRECIOS A MOSTRAR EN ARTICULOS') returning_values (:LISTA);
if (modulo = 'FACTURACION') then
  EXECUTE PROCEDURE lee_configuracion ('FACTURACION','ARTICULOS','VER ARTICULOS SIN EXISTENCIA EN CONSULTA DE ARTICULOS') returning_values (:sinexist);
else
  sinexist = 'SI';
EXECUTE PROCEDURE LEE_CONFIGURACION ('FACTURACION', 'ARTICULOS', 'REDONDEO AL MULTIPLO DE DIEZ EN PRECIOS') returning_values (DIG);
if (LISTA > 0) then
    BEGIN
    FOR select a.arti_cod, arti_des, grup_cod, arti_unidad, esar_cod, taiv_porc, marc_cod,arti_clase, SUBSTRING(ARTI_OBS FROM 1 FOR 255)
        from articulo a, tarifa_iva t
        where a.taiv_cod = t.taiv_cod and substring(a.arti_cod from 1 FOR 2) <> '.t' and
        ((:INACTIVOS = 'S') or (esar_cod = 'A') or ((:INACTIVOS = 'C') AND (esar_cod = 'N')))
        INTO :CODIGO, :DES, :GRUPO, :UNIDAD, :ESTADO, :IVA, :MARCA, :CLASE, :OBS
        do
        begin
        PRECIO = 0;
        SELECT prar_fijo PRECIO FROM precios_articulo WHERE arti_cod = :CODIGO and lipr_cod = :LISTA INTO :PRECIO;
        EXECUTE PROCEDURE redondee(PRECIO, DIG) returning_values (PRECIO);
        if (EXIST = 'SI') then
            BEGIN
            EXECUTE PROCEDURE saldo_total_inventario (:CODIGO, :FECHA) returning_values (:EXISTEN);
            if ((SINEXIST = 'SI')  or (existen <> 0)) then
                SUSPEND;
            END
        ELSE
            SUSPEND;
        select first 1 coba_cod from barras_articulo where arti_cod = :codigo into :ref;
        end
    END
ELSE
    FOR select arti_cod, arti_des, grup_cod, arti_unidad, esar_cod, taiv_porc, arti_precio, marc_cod, arti_clase, SUBSTRING(ARTI_OBS FROM 1 FOR 255)
        from articulo a, tarifa_iva t
        where a.taiv_cod = t.taiv_cod and substring(a.arti_cod from 1 FOR 2) <> '.t' and
        ((:INACTIVOS = 'S') or (esar_cod = 'A') or ((:INACTIVOS = 'C') AND (esar_cod = 'N')))
        INTO :CODIGO, :DES, :GRUPO, :UNIDAD, :ESTADO, :IVA, :PRECIO, :MARCA, :CLASE, :OBS
        do
        begin
        if (EXIST = 'SI') then
            BEGIN
            EXECUTE PROCEDURE saldo_total_inventario (:CODIGO, :FECHA) returning_values (:EXISTEN);
            if ((SINEXIST = 'SI') or (existen <> 0)) then
                SUSPEND;
            END
        ELSE
            SUSPEND;
        select first 1 coba_cod from barras_articulo where arti_cod = :codigo into :ref;
        end
END

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE DISPONIBILIDAD_TOTAL_ARTICULO(
    ARTICULO VARCHAR(15),
    FECHA DATE)
RETURNS (
    DISPONIBILIDAD INTEGER,
    EXIST NUMERIC(18,4),
    PROMEDIO NUMERIC(18,4),
    SALIDAS NUMERIC(18,4))
AS
BEGIN
  EXECUTE PROCEDURE saldo_total_inventario (ARTICULO, FECHA) returning_values (:EXIST);
  EXECUTE PROCEDURE PROMEDIO_TOTAL_ARTICULO(:ARTICULO, :FECHA) returning_values (:PROMEDIO, :SALIDAS);
  if (PROMEDIO > 0) then
    DISPONIBILIDAD = EXIST / PROMEDIO;
  ELSE
    DISPONIBILIDAD = 0;
  SUSPEND;
END

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE IMPR_ARTICULO(
    CODINI VARCHAR(20),
    CODFIN VARCHAR(20),
    CANT INTEGER)
RETURNS (
    ARTICULO VARCHAR(15),
    DESCRIPCION VARCHAR(60),
    PRECIO NUMERIC(18,2),
    CODGRP VARCHAR(2),
    NOMGRP VARCHAR(30),
    COSUBG VARCHAR(3),
    NOMSUBG VARCHAR(30),
    CODMARC VARCHAR(3),
    NOMMARC VARCHAR(30),
    PESO NUMERIC(18,4),
    PUM NUMERIC(18,2),
    LISTA INTEGER,
    NOMLISTA VARCHAR(30),
    FECHA DATE)
AS
declare variable I INTEGER;
begin
EXECUTE PROCEDURE lee_configuracion('FACTURACION', 'FACTURAS', 'CODIGO DE LA LISTA DE PRECIOS A MOSTRAR EN ARTICULOS') returning_values (LISTA);
for select a.arti_cod, arti_des, a.grup_cod, a.subg_cod, a.marc_cod, arti_peso, p.lipr_cod, p.prar_fijo, grup_nom, lipr_nom
    from articulo a, precios_articulo p, grupo g, lista_precios l
    where a.arti_cod = p.arti_cod and a.grup_cod = g.grup_cod and l.lipr_cod = p.lipr_cod AND a.arti_cod >= :codini AND a.arti_cod <= :codfin AND P.lipr_cod = :LISTA
    into :articulo, :descripcion, :codgrp, :cosubg, :codmarc, :peso, :lista, :precio, :nomgrp, :nomlista
    do
    begin
    if (cosubg <> '') then
        select subg_nom from subgrupo where grup_cod = :codgrp and subg_cod = :cosubg into :nomsubg;
    if (codmarc <> '') then
        select marc_nom from marcas where marc_cod = :codmarc into :nommarc;
    if ((PESO <> 0) AND (PESO IS NOT NULL)) then
        PUM = PRECIO / PESO;
    ELSE
        PUM = 0;
    SELECT MAX(AUDI_FECHA) FROM AUDITORIA WHERE TIDO_COD = 126 AND AUDI_COD = :articulo AND AUDI_OPER <> 'D' INTO :fecha;
    if (cant = 0) then
        execute procedure saldo_total_inventario(:articulo, cast('now' as DATE)) returning_values (CANT);
    I = 1;
    WHILE (I < CANT) DO
        BEGIN
        SUSPEND;
        I = I + 1;
        END
    end
end

^

SET TERM ; ^

SET TERM ^ ;

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

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE REP_ABC_INVENTARIO(
    FECHA DATE,
    ARTINI VARCHAR(20),
    ARTFIN VARCHAR(20),
    GRPINI VARCHAR(2),
    GRPFIN VARCHAR(2),
    ORDEN CHAR(1),
    DIAS INTEGER)
RETURNS (
    CODIGO VARCHAR(15),
    NOMBRE VARCHAR(60),
    UNIDAD VARCHAR(8),
    CODGRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    CODSUBG VARCHAR(3),
    NOMSUBG VARCHAR(30),
    CODMARC VARCHAR(3),
    NOMMARC VARCHAR(30),
    COSTO NUMERIC(18,2),
    SALIDAT NUMERIC(18,4),
    VPROMEDIO NUMERIC(18,4),
    PORC NUMERIC(9,2),
    CLASE CHAR(1))
AS
DECLARE VARIABLE CODINI VARCHAR(20);
DECLARE VARIABLE CODFIN VARCHAR(20);
DECLARE VARIABLE DESINI VARCHAR(20);
DECLARE VARIABLE DESFIN VARCHAR(20);
declare variable ACUMULADO NUMERIC(18,2);
declare variable EXIST NUMERIC(18,2);
declare variable ACUMPORC NUMERIC(9,2);
declare variable FECINI DATE;
declare variable A NUMERIC(9,2);
declare variable B NUMERIC(9,2);
declare variable C NUMERIC(9,2);
BEGIN
if (ORDEN = 'C') then
    BEGIN
    CODINI = ARTINI;
    CODFIN = ARTFIN;
    DESINI = '';
    DESFIN = 'zz';
    END
ELSE
    BEGIN
    DESINI = ARTINI;
    DESFIN = ARTFIN;
    CODINI = '';
    CODFIN = 'zz';
    END
DELETE FROM analisis_abcinven;
acumporc = 0;
FECINI = FECHA - DIAS;
/* CALCULE LA VENTA PROMEDIO DE CADA ARTICULO */
EXECUTE PROCEDURE LEE_CONFIGURACION ('INVENTARIO', 'EXISTENCIAS', 'PORCENTAJE MINIMO PARA ARTICULO CLASE "A"') returning_values (A);
EXECUTE PROCEDURE LEE_CONFIGURACION ('INVENTARIO', 'EXISTENCIAS', 'PORCENTAJE MINIMO PARA ARTICULO CLASE "B"') returning_values (B);
EXECUTE PROCEDURE LEE_CONFIGURACION ('INVENTARIO', 'EXISTENCIAS', 'PORCENTAJE MINIMO PARA ARTICULO CLASE "C"') returning_values (C);
FOR SELECT ARTI_COD, ARTI_UNIDAD FROM ARTICULO A
      WHERE ARTI_COD >= :CODINI AND ARTI_COD <= :CODFIN AND A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :GRPFIN AND ARTI_DES >= :DESINI AND ARTI_DES <= :DESFIN AND A.ESAR_COD <> 'I'
      INTO :CODIGO, :UNIDAD
      DO
      BEGIN
      EXECUTE PROCEDURE ultimo_costo(:CODIGO, :FECHA, :UNIDAD) returning_values (:COSTO);
      SELECT SUM(MVAR_CANT) FROM MOVIMIENTO_ARTICULO
        WHERE ARTI_COD = :codigo AND MVAR_FECHA >= :FECINI AND MVAR_FECHA <= :FECHA AND MVAR_ENTRADA = 'N' AND MVAR_TIPODOC <> 13 INTO :SALIDAT;
      if (SALIDAT IS NULL) then
        SALIDAT = 0;
      VPROMEDIO = SALIDAT * COSTO;
      insert into analisis_abcinven (ABCI_COD, ABCI_VENTA) VALUES (:codigo, :vpromedio);
      END
SELECT SUM(ABCI_VENTA) FROM analisis_abcinven INTO :acumulado;
FOR SELECT ARTI_COD, ARTI_DES, ARTI_UNIDAD, ARTI_DIAS, A.GRUP_COD, GRUP_NOM, A.SUBG_COD, A.MARC_COD, ABCI_VENTA
      FROM ARTICULO A, GRUPO G, analisis_abcinven N
      WHERE A.ARTI_COD = N.abci_cod AND G.GRUP_COD = A.GRUP_COD
      ORDER BY ABCI_VENTA DESC
      INTO :CODIGO, :NOMBRE, :UNIDAD, :DIAS, :CODGRUPO, :NOMGRUPO, :CODSUBG, :CODMARC, :vpromedio
      DO
        BEGIN
        NOMMARC = '';
        NOMSUBG = '';
        SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO :NOMMARC;
        SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
        EXECUTE PROCEDURE ultimo_costo(:CODIGO, :FECHA, :UNIDAD) returning_values (:COSTO);
        EXECUTE PROCEDURE saldo_total_inventario (:codigo, FECHA) returning_values (:EXIST);
        costo = costo * exist;
        SELECT SUM(MVAR_CANT) FROM MOVIMIENTO_ARTICULO
          WHERE ARTI_COD = :codigo AND MVAR_FECHA >= :FECINI AND MVAR_FECHA <= :FECHA AND MVAR_ENTRADA = 'N' AND MVAR_TIPODOC <> 13 INTO :SALIDAT;
        if (SALIDAT IS NULL) then
          SALIDAT = 0;
        if (acumulado <> 0) then
            PORC = vpromedio / acumulado * 100;
        ELSE
            PORC = 0;
        acumporc = acumporc + porc;
        if (acumporc < A) then
            CLASE = 'A';
        else
            if (acumporc < B) then
                CLASE = 'B';
            else
                if (acumporc < c) then
                    CLASE = 'C';
                else
                    CLASE = 'D';
        SUSPEND;
        END
END

^

SET TERM ; ^

SET TERM ^ ;

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

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE REP_DISPONIBILIDAD(
    FECHA DATE,
    ARTINI VARCHAR(20),
    ARTFIN VARCHAR(20),
    GRPINI VARCHAR(2),
    GRPFIN VARCHAR(2),
    ORDEN CHAR(1),
    CEROS CHAR(1),
    DETALLE CHAR(1),
    SUCURSAL INTEGER)
RETURNS (
    CODIGO VARCHAR(15),
    NOMBRE VARCHAR(60),
    UNIDAD VARCHAR(8),
    CODGRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    CODSUBG VARCHAR(3),
    NOMSUBG VARCHAR(30),
    CODMARC VARCHAR(3),
    NOMMARC VARCHAR(30),
    CODBOD VARCHAR(2),
    NOMBOD VARCHAR(30),
    EXIST NUMERIC(18,4),
    PROMEDIO NUMERIC(18,4),
    SALIDAS NUMERIC(18,4),
    DISPONIBILIDAD INTEGER,
    DIAS INTEGER,
    PROMEDIADO INTEGER,
    COSTO NUMERIC(18,2),
    COSTOPRO NUMERIC(18,2),
    SUGERIDO NUMERIC(18,4),
    FECCOMPRA DATE)
AS
DECLARE VARIABLE CODINI VARCHAR(20);
DECLARE VARIABLE CODFIN VARCHAR(20);
DECLARE VARIABLE DESINI VARCHAR(20);
declare variable FECINI DATE;
declare variable DIASC VARCHAR(255);
DECLARE VARIABLE DESFIN VARCHAR(20);
declare variable DIA_ART VARCHAR(2) CHARACTER SET NONE;
BEGIN
if (ORDEN = 'C') then
    BEGIN
    CODINI = ARTINI;
    CODFIN = ARTFIN;
    DESINI = '';
    DESFIN = 'zz';
    END
ELSE
    BEGIN
    DESINI = ARTINI;
    DESFIN = ARTFIN;
    CODINI = '';
    CODFIN = 'zz';
    END
if (DETALLE = 'S') then
  BEGIN
  FOR SELECT ARTI_COD, ARTI_DES, ARTI_UNIDAD, ARTI_DIAS, A.GRUP_COD, GRUP_NOM, A.SUBG_COD, A.MARC_COD, BODE_COD, BODE_NOM, ARTI_DIANALIS
      FROM ARTICULO A, GRUPO G, BODEGA B
      WHERE ARTI_COD >= :CODINI AND ARTI_COD <= :CODFIN AND A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :GRPFIN AND ARTI_DES >= :DESINI AND ARTI_DES <= :DESFIN AND
      G.GRUP_COD = A.GRUP_COD AND A.ESAR_COD <> 'I' AND ((SUCU_ID = :SUCURSAL) or (:SUCURSAL = 0))
      INTO :CODIGO, :NOMBRE, :UNIDAD, :DIAS, :CODGRUPO, :NOMGRUPO, :CODSUBG, :CODMARC, :CODBOD, :NOMBOD, :PROMEDIADO
      DO
        BEGIN
        NOMMARC = '';
        NOMSUBG = '';
        SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO :NOMMARC;
        SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
        EXECUTE PROCEDURE ultimo_costo(:CODIGO, :FECHA, :UNIDAD) returning_values (:COSTO);
        EXECUTE PROCEDURE costo_promedio(:CODIGO, :FECHA) RETURNING_VALUES :costopro;
        EXECUTE PROCEDURE DISPONIBILIDAD_ARTICULO(CODIGO, FECHA, :CODBOD) returning_values (:DISPONIBILIDAD, :EXIST, :PROMEDIO, :SALIDAS);
        /*ESTABLECER CUAL ES EL VALOR DE DIAS PARA PROMEDIO*/
        EXECUTE PROCEDURE lee_configuracion ('INVENTARIO', 'EXISTENCIAS', 'PROMEDIAR LAS SALIDAS DEL INVENTARIO CON EL NUMERO DE DIAS ASIGNADO A CADA ARTICULO') returning_values (:DIA_ART);
        if (DIA_ART = 'NO') then
          BEGIN
            EXECUTE PROCEDURE lee_configuracion ('INVENTARIO', 'EXISTENCIAS', 'NUMERO DE DIAS PARA PROMEDIO DE SALIDAS POR ARTICULO') returning_values (DIASC);
            PROMEDIADO = CAST(DIASC AS INTEGER);
          END
        FECINI = :FECHA - :PROMEDIADO;
        if ((DISPONIBILIDAD < DIAS) and (PROMEDIO > 0))then
            SUGERIDO = (DIAS * PROMEDIO) - EXIST;
        ELSE
            SUGERIDO = 0;
        SELECT MAX(FACO_FECHA) FROM FACTURAS_COMPRA F, FACTURAS_COMPRAS_DETALLE D
            WHERE F.FACO_ID = D.faco_id AND D.ARTI_COD = :CODIGO AND FACO_FECHA <= :FECHA AND D.bode_cod = :codbod
            INTO :FECCOMPRA;
        if ((PROMEDIO > 0) or (EXIST <> 0) or (CEROS = 'S')) then
            SUSPEND;
        END
  END
ELSE
  BEGIN
  FOR SELECT ARTI_COD, ARTI_DES, ARTI_UNIDAD, ARTI_DIAS, A.GRUP_COD, GRUP_NOM, A.SUBG_COD, A.MARC_COD, ARTI_DIANALIS
      FROM ARTICULO A, GRUPO G
      WHERE ARTI_COD >= :CODINI AND ARTI_COD <= :CODFIN AND A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :GRPFIN AND ARTI_DES >= :DESINI AND ARTI_DES <= :DESFIN AND G.GRUP_COD = A.GRUP_COD AND A.ESAR_COD <> 'I'
      INTO :CODIGO, :NOMBRE, :UNIDAD, :DIAS, :CODGRUPO, :NOMGRUPO, :CODSUBG, :CODMARC, :PROMEDIADO
      DO
        BEGIN
        NOMMARC = '';
        NOMSUBG = '';
        SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO :NOMMARC;
        SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
        EXECUTE PROCEDURE costo_promedio(:CODIGO, :FECHA) RETURNING_VALUES :costopro;
        EXECUTE PROCEDURE ultimo_costo(:CODIGO, :FECHA, :UNIDAD) returning_values (:COSTO);
        EXECUTE PROCEDURE DISPONIBILIDAD_TOTAL_ARTICULO(CODIGO, FECHA) returning_values (:DISPONIBILIDAD, :EXIST, :PROMEDIO, :SALIDAS);
        /*ESTABLECER CUAL ES EL VALOR DE DIAS PARA PROMEDIO*/
        EXECUTE PROCEDURE lee_configuracion ('INVENTARIO', 'EXISTENCIAS', 'PROMEDIAR LAS SALIDAS DEL INVENTARIO CON EL NUMERO DE DIAS ASIGNADO A CADA ARTICULO') returning_values (:DIA_ART);
        if (DIA_ART = 'NO') then
          BEGIN
            EXECUTE PROCEDURE lee_configuracion ('INVENTARIO', 'EXISTENCIAS', 'NUMERO DE DIAS PARA PROMEDIO DE SALIDAS POR ARTICULO') returning_values (DIASC);
            PROMEDIADO = CAST(DIASC AS INTEGER);
          END
        FECINI = :FECHA - :PROMEDIADO;
        if ((DISPONIBILIDAD < DIAS) and (PROMEDIO > 0))then
            SUGERIDO = (DIAS * PROMEDIO) - EXIST;
        ELSE
            SUGERIDO = 0;
        SELECT MAX(FACO_FECHA) FROM FACTURAS_COMPRA F, FACTURAS_COMPRAS_DETALLE D
            WHERE F.FACO_ID = D.faco_id AND D.ARTI_COD = :CODIGO AND FACO_FECHA <= :FECHA
            INTO :FECCOMPRA;
        if ((PROMEDIO > 0) or (EXIST <> 0) or (CEROS = 'S')) then
            SUSPEND;
        END
  END
END

^

SET TERM ; ^

SET TERM ^ ;

ALTER TRIGGER NOTAS_CREDITO_PROVEEDOR_AI
AS
declare variable COSTO NUMERIC(18,2);
declare variable EXISTENCIA NUMERIC(18,4);
declare variable CODBOD VARCHAR(3);
BEGIN
if ((NEW.NCPR_ID <> 0) and (new.ncpr_anulado = 'N')) then
    BEGIN
    /* Registre el nuevo saldo del documento */
    INSERT INTO SALDOS_DOC_CXPAGAR (SDCP_TIPOREF, SDCP_IDREF, SDCP_FECHA, TERC_NIT, SDCP_RTEFTE, SDCP_RTIVA, SDCP_RTICA, SDCP_ABONO, SDCP_ABRTFTE, SDCP_ABRTIVA, SDCP_ABRTICA, SDCP_DEBITO, SDCP_MONTO, SDCP_TRM)
        VALUES (52, NEW.NCPR_ID, NEW.ncpr_fecha, NEW.terc_nit, (NEW.ncpr_rtftemonto * -1), (NEW.ncpr_rtivamonto * -1), (NEW.ncpr_rticamonto * -1), 0, 0, 0, 0, 'N', (NEW.ncpr_monto+NEW.ncpr_ivamonto)*-1, NEW.ncpr_trm);
    /* Registre el movimiento del proveedor */
    INSERT INTO MOVIMIENTO_PROVEEDOR (MVPR_ID, TERC_NIT, MVPR_TIPOREF, MVPR_IDREF, MVPR_FECHA, MVPR_VENCE, MVPR_CONC, MVPR_MONTO, MVPR_RTFTE, MVPR_RTIVA, MVPR_RTICA, MVPR_DEBITO, MVPR_ABONO, MVPR_PREFIJO, MVPR_NUMERO, MVPR_TRM)
      VALUES (GEN_ID(ID_MOVPROV, 1), NEW.TERC_NIT, 52, NEW.NCPR_ID, NEW.NCPR_FECHA, NEW.NCPR_FECHA, NEW.NCPR_CONC, NEW.NCPR_MONTO+NEW.NCPR_IVAMONTO, NEW.NCPR_RTFTEMONTO, NEW.NCPR_RTIVAMONTO, NEW.NCPR_RTICAMONTO, 'N', 'N', NEW.pref_pre, NEW.ncpr_numero, NEW.ncpr_trm);
    /* afecte el articulo */
    if (new.arti_cod <> '') then
        begin
        /* CALCULE EL NUEVO COSTO */
        execute procedure costo_promedio (new.arti_cod, new.ncpr_fecha) returning_values (:COSTO);
        execute procedure saldo_total_inventario (new.arti_cod, new.ncpr_fecha) returning_values (:EXISTENCIA);
        COSTO = (COSTO * EXISTENCIA - (NEW.ncpr_monto - NEW.ncpr_ivamonto)) / EXISTENCIA;
        FOR SELECT DISTINCT BODE_COD FROM EXISTENCIA WHERE ARTI_COD = NEW.ARTI_COD INTO :CODBOD do
            BEGIN
            execute procedure saldo_inventario (new.arti_cod, :CODBOD, new.ncpr_fecha) returning_values (:EXISTENCIA);
            /* SAQUE TODO LO QUE TENGA */
            INSERT INTO MOVIMIENTO_ARTICULO
              (ARTI_COD, MVAR_CONS, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM, TERC_NIT)
              VALUES(NEW.ARTI_COD, GEN_ID(ID_MOVARTI,1), :CODBOD, new.ncpr_fecha, 52, NEW.ncpr_id,
              new.ncpr_conc, :EXISTENCIA, 0, 'N', '', new.pref_pre, new.ncpr_numero, 1, new.terc_nit);
            /* META TODO CON EL NUEVO COSTO */
            INSERT INTO MOVIMIENTO_ARTICULO
              (ARTI_COD, MVAR_CONS, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM, TERC_NIT)
              VALUES(NEW.ARTI_COD, GEN_ID(ID_MOVARTI,1), :CODBOD, new.ncpr_fecha, 52, NEW.ncpr_id,
              new.ncpr_conc, :EXISTENCIA, :COSTO, 'S', '', new.pref_pre, new.ncpr_numero, 1, new.terc_nit);
            END
        /* RECORRA LAS LISTAS DE PRECIOS Y CAMBIE EL PRECIO */
        EXECUTE PROCEDURE CALCULA_PRECIOS(NEW.ARTI_COD, new.ncpr_fecha);
        end
    INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
        VALUES (USER, 52, NEW.ncpr_id, 'I', NEW.pref_pre || NEW.ncpr_numero);
    END
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER TRIGGER NOTAS_CREDITO_PROVEEDOR_AU
AS
declare variable ABONOS char(1);
declare variable consec INTEGER;
declare variable COSTO NUMERIC(18,2);
declare variable EXISTENCIA NUMERIC(18,4);
declare variable CODBOD VARCHAR(3);
BEGIN
if (new.ncpr_anulado = 'S') then
    begin
    select enco_consec from comprobante_encabezado where enco_tiporef = 52 and enco_idref = old.ncpr_id into :consec;
    if (NOT consec is null) then
      delete from comprobante_detalle where enco_consec = :consec;
    delete from comprobante_encabezado where enco_tiporef = 52 and enco_idref = old.ncpr_id;
    INSERT INTO AUDITORIA (AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
        VALUES (USER, 52, new.ncpr_id, 'A', NEW.pref_pre || NEW.ncpr_numero);
    end

/* BORRE EL REGISTRO PREVIO */
if ((old.ncpr_id <> 0) and (old.ncpr_anulado = 'N')) then
    begin
    /* Verifique si habia abonos a la nota */
    ABONOS = 'N';
    select 'S' FROM SALDOS_DOC_CXPAGAR WHERE SDCP_TIPOREF = 52 AND SDCP_IDREF = OLD.NCPR_ID AND SDCP_ABONO <> 0 INTO :ABONOS;
    if (ABONOS = 'N') then
        BEGIN
        /* BORRE EL REGISTRO PREVIO */
        delete from saldos_doc_cxpagar where sdcp_tiporef = 52 and sdcp_idref = old.ncpr_id;
        delete from movimiento_PROVEEDOR where (mvpr_tiporef = 52) and (mvpr_idref = old.ncpr_id);
        delete from movimiento_articulo where  (mvar_tipodoc = 52) and (mvar_idref = old.ncpr_id);
        END
    else
        exception DOCUMENTO_CON_ABONOS 'El descuento de proveedor ' || old.pref_pre || old.ncpr_numero || ' tiene abonos registrados.';
    end
if ((new.ncpr_id <> 0) and (new.ncpr_anulado = 'N')) then
    begin
    /* Registre el nuevo saldo del documento */
    INSERT INTO SALDOS_DOC_CXPAGAR (SDCP_TIPOREF, SDCP_IDREF, SDCP_FECHA, TERC_NIT, SDCP_RTEFTE, SDCP_RTIVA, SDCP_RTICA, SDCP_ABONO, SDCP_ABRTFTE, SDCP_ABRTIVA, SDCP_ABRTICA, SDCP_DEBITO, SDCP_MONTO, SDCP_TRM)
        VALUES (52, NEW.NCPR_ID, NEW.ncpr_fecha, NEW.terc_nit, (NEW.ncpr_rtftemonto * -1), (NEW.ncpr_rtivamonto * -1), (NEW.ncpr_rticamonto * -1), 0, 0, 0, 0, 'N', (NEW.ncpr_monto+NEW.ncpr_ivamonto)*-1, NEW.ncpr_trm);
    /* Registre el movimiento del proveedor */
    INSERT INTO MOVIMIENTO_PROVEEDOR (MVPR_ID, TERC_NIT, MVPR_TIPOREF, MVPR_IDREF, MVPR_FECHA, MVPR_VENCE, MVPR_CONC, MVPR_MONTO, MVPR_RTFTE, MVPR_RTIVA, MVPR_RTICA, MVPR_DEBITO, MVPR_ABONO, MVPR_PREFIJO, MVPR_NUMERO, MVPR_TRM)
        VALUES (GEN_ID(ID_MOVPROV, 1), NEW.TERC_NIT, 52, NEW.NCPR_ID, NEW.NCPR_FECHA, NEW.NCPR_FECHA, NEW.NCPR_CONC, NEW.NCPR_MONTO+NEW.ncpr_ivamonto, NEW.NCPR_RTFTEMONTO, NEW.NCPR_RTIVAMONTO, NEW.NCPR_RTICAMONTO, 'N', 'N', NEW.pref_pre, NEW.ncpr_numero, NEW.ncpr_trm);
    /* afecte el articulo */
    if (new.arti_cod <> '') then
        begin
        /* CALCULE EL NUEVO COSTO */
        execute procedure costo_promedio (new.arti_cod, new.ncpr_fecha) returning_values (:COSTO);
        execute procedure saldo_total_inventario (new.arti_cod, new.ncpr_fecha) returning_values (:EXISTENCIA);
        COSTO = (COSTO * EXISTENCIA - (NEW.ncpr_monto - NEW.ncpr_ivamonto)) / EXISTENCIA;
        FOR SELECT DISTINCT BODE_COD FROM EXISTENCIA WHERE ARTI_COD = NEW.ARTI_COD INTO :CODBOD do
            BEGIN
            execute procedure saldo_inventario (new.arti_cod, :CODBOD, new.ncpr_fecha) returning_values (:EXISTENCIA);
            /* SAQUE TODO LO QUE TENGA */
            INSERT INTO MOVIMIENTO_ARTICULO
                (ARTI_COD, MVAR_CONS, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM, TERC_NIT)
                VALUES(NEW.ARTI_COD, GEN_ID(ID_MOVARTI,1), :CODBOD, new.ncpr_fecha, 52, NEW.ncpr_id,
                new.ncpr_conc, :EXISTENCIA, 0, 'N', '', new.pref_pre, new.ncpr_numero, 1, new.terc_nit);
            /* META TODO CON EL NUEVO COSTO */
            INSERT INTO MOVIMIENTO_ARTICULO
                (ARTI_COD, MVAR_CONS, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM, TERC_NIT)
                VALUES(NEW.ARTI_COD, GEN_ID(ID_MOVARTI,1), :CODBOD, new.ncpr_fecha, 52, NEW.ncpr_id,
                new.ncpr_conc, :EXISTENCIA, :COSTO, 'S', '', new.pref_pre, new.ncpr_numero, 1, new.terc_nit);
            END
        /* RECORRA LAS LISTAS DE PRECIOS Y CAMBIE EL PRECIO */
        EXECUTE PROCEDURE CALCULA_PRECIOS(NEW.ARTI_COD, new.ncpr_fecha);
        end
    INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
        VALUES (USER, 52, NEW.ncpr_id, 'U', NEW.pref_pre || NEW.ncpr_numero);
    end
END
^

SET TERM ; ^



/* 20081211 EXISTS PARA OPTIMIZAR CHEQUEO */

SET TERM ^ ;

CREATE OR ALTER PROCEDURE ACTUALICE_SALDO_CUENTA(
    CUENTA VARCHAR(20),
    FECHA CHAR(8),
    DEBITO NUMERIC(18,2),
    CREDITO NUMERIC(18,2))
AS
    declare variable CUENTAUX VARCHAR(20);
     declare variable SALDOA NUMERIC(18,2);
begin
if (DEBITO is null) then
    DEBITO = 0;
IF (CREDITO IS NULL) THEN
    CREDITO = 0;
   
CUENTAUX = CUENTA;
WHILE (CUENTAUX <> '') DO
    BEGIN
    /* Busque en saldos_cuentas la cuenta y la fecha, si la encuentra actualice db y cr, si no inserte un registro */
    IF (EXISTS (SELECT * FROM SALDOS_CUENTAS WHERE (CUEN_COD = :CUENTAUX) AND (SACU_FECHA = :FECHA))) THEN
        BEGIN
        UPDATE SALDOS_CUENTAS
            SET SACU_DEBITO = SACU_DEBITO + :DEBITO,
                SACU_CREDITO = SACU_CREDITO + :CREDITO
        WHERE (CUEN_COD = :CUENTAUX) AND (SACU_FECHA = :FECHA);
        END
    ELSE
        BEGIN
        /*  traiga el saldo anterior y registre uno nuevo */
        EXECUTE PROCEDURE SALDO_CUENTA(:CUENTAUX, :FECHA) RETURNING_VALUES :SALDOA;
        INSERT INTO SALDOS_CUENTAS(CUEN_COD, SACU_FECHA, SACU_SALDO, SACU_DEBITO, SACU_CREDITO)
            VALUES (:CUENTAUX, :FECHA, :SALDOA, :DEBITO, :CREDITO);
        END

    /* Actualice los saldos de fechas posteriores */
    UPDATE SALDOS_CUENTAS
        SET SACU_SALDO = SACU_SALDO + :DEBITO - :CREDITO
        WHERE (CUEN_COD = :CUENTAUX) AND (SACU_FECHA > :FECHA);
          
    /* AHORA TRAIGA EL PADRE */
    EXECUTE PROCEDURE PADRE(:CUENTAUX) RETURNING_VALUES (:CUENTAUX);
    END
end
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE CHEQUEO_SALDOS_CONTA(
    FECINI CHAR(8),
    CTAINI VARCHAR(20),
    CTAFIN VARCHAR(20))
AS
declare variable CUENTA VARCHAR(20);
declare variable NIT VARCHAR(20);
declare variable PROY VARCHAR(4);
declare variable CENTRO VARCHAR(4);
declare variable ARTIC VARCHAR(15);
declare variable DEBITOS NUMERIC(15,2);
declare variable CREDITOS NUMERIC(15,2);
declare variable FECHA CHAR(8);
DECLARE VARIABLE ANO CHAR(4);
DECLARE VARIABLE MES CHAR(2);
DECLARE VARIABLE INICIAL CHAR(8);
DECLARE VARIABLE EXISTE CHAR(1);
declare variable CUENTAUX VARCHAR(20);
BEGIN /*$$IBE$$ 
DELETE FROM saldos_centros_TERCERO WHERE SACU_FECHA >= :FECINI AND CUEN_COD >= :CTAINI AND CUEN_COD <= :CTAFIN;
DELETE FROM saldos_centros WHERE SACU_FECHA >= :FECINI AND CUEN_COD >= :CTAINI AND CUEN_COD <= :CTAFIN;
DELETE FROM saldos_terceros WHERE SACU_FECHA >= :FECINI AND CUEN_COD >= :CTAINI AND CUEN_COD <= :CTAFIN;
DELETE FROM SALDOS_ARTICULO WHERE SAAR_FECHA >= :FECINI AND CUEN_COD >= :CTAINI AND CUEN_COD <= :CTAFIN;
DELETE FROM saldos_cuentas WHERE SACU_FECHA >= :FECINI AND CUEN_COD >= :CTAINI AND CUEN_COD <= :CTAFIN;
 $$IBE$$*/ /* BORRE LOS DB Y CR EN CERO */ /*$$IBE$$ 
UPDATE COMPROBANTE_DETALLE SET CODE_DEBITO = 0 WHERE CODE_DEBITO IS NULL;
UPDATE COMPROBANTE_DETALLE SET CODE_CREDITO = 0 WHERE CODE_CREDITO IS NULL;
 $$IBE$$*/ /* EMPIECE CON LOS SALDOS INICIALES */ /*$$IBE$$ 
EXECUTE PROCEDURE LEE_CONFIGURACION('CONTABILIDAD', 'GENERAL', 'AÑO DE INICIO') RETURNING_VALUES (ANO);
EXECUTE PROCEDURE LEE_CONFIGURACION('CONTABILIDAD', 'GENERAL', 'MES DE INICIO') RETURNING_VALUES (MES);
EXECUTE PROCEDURE compone_fecha_conta (ANO, MES, 1) returning_values (INICIAL);
if (FECINI <= INICIAL) then
    BEGIN
    FOR SELECT CUEN_COD, TERC_NIT, PROY_COD, CENT_COD, ARTI_COD, SAIN_DEBITO, SAIN_CREDITO FROM SALDOS_INICIALES INTO :CUENTA, :NIT, :PROY, :CENTRO, :ARTIC, :DEBITOS, :CREDITOS
        DO
        BEGIN
         $$IBE$$*/ /* Busque en saldos_cuentas la cuenta y la fecha, si la encuentra actualice INICIAL, si no inserte un registro */ /*$$IBE$$ 
        CUENTAUX = CUENTA;
        WHILE (CUENTAUX <> '') DO
            BEGIN
            EXISTE = 'N';
            SELECT 'S' FROM SALDOS_CUENTAS
                WHERE (CUEN_COD = :CUENTAUX) AND (SACU_FECHA = :INICIAL) INTO :EXISTE;
            IF (EXISTE = 'N') THEN
                BEGIN
                INSERT INTO SALDOS_CUENTAS(CUEN_COD, SACU_FECHA, SACU_SALDO, SACU_DEBITO, SACU_CREDITO)
                    VALUES (:CUENTAUX, :INICIAL, :DEBITOS-:CREDITOS, 0, 0);
                END
            ELSE
                BEGIN
                UPDATE SALDOS_CUENTAS
                    SET SACU_SALDO = SACU_SALDO + :DEBITOS - :CREDITOS
                    WHERE (CUEN_COD = :CUENTAUX) AND (SACU_FECHA = :INICIAL);
                END
            EXECUTE PROCEDURE PADRE(CUENTAUX) RETURNING_VALUES (CUENTAUX);
            END
    
         $$IBE$$*/ /* Busque en saldos_TERCEROS si la encuentra actualice INICIAL, si no inserte un registro */ /*$$IBE$$ 
        EXISTE = 'N';
        SELECT 'S' FROM SALDOS_TERCEROS
            WHERE (CUEN_COD = :CUENTA) AND (TERC_NIT = :NIT) AND (SACU_FECHA = :INICIAL) INTO :EXISTE;
        IF (EXISTE = 'N') THEN
            BEGIN
            INSERT INTO SALDOS_TERCEROS(CUEN_COD, TERC_NIT, SACU_FECHA, SATE_SALDO, SATE_DEBITO, SATE_CREDITO)
                VALUES (:CUENTA, :NIT, :INICIAL, :DEBITOS-:CREDITOS, 0, 0);
            END
        ELSE
            BEGIN
            UPDATE SALDOS_TERCEROS
                SET SATE_SALDO = SATE_SALDO + :DEBITOS - :CREDITOS
                WHERE (CUEN_COD = :CUENTA) AND (TERC_NIT = :NIT) AND (SACU_FECHA = :INICIAL);
            END
         $$IBE$$*/ /* Busque en saldos_CENTROS si la encuentra actualice INICIAL, si no inserte un registro */ /*$$IBE$$ 
        EXISTE = 'N';
        SELECT 'S' FROM SALDOS_CENTROS
            WHERE (CUEN_COD = :CUENTA) AND (PROY_COD = :PROY) AND (CENT_COD = :CENTRO) AND (SACU_FECHA = :INICIAL) INTO :EXISTE;
        IF (EXISTE = 'N') THEN
            BEGIN
            INSERT INTO SALDOS_CENTROS(CUEN_COD, PROY_COD, CENT_COD, SACU_FECHA, SACE_SALDO, SACE_DEBITO, SACE_CREDITO)
                VALUES (:CUENTA, :PROY, :CENTRO, :INICIAL, :DEBITOS-:CREDITOS, 0, 0);
            END
        ELSE
            BEGIN
            UPDATE SALDOS_CENTROS
                SET SACE_SALDO = SACE_SALDO + :DEBITOS - :CREDITOS
                WHERE (CUEN_COD = :CUENTA) AND (PROY_COD = :PROY) AND (CENT_COD = :CENTRO) AND (SACU_FECHA = :INICIAL);
            END
         $$IBE$$*/ /* Busque en saldos_CENTROS-TERCERO si la encuentra actualice INICIAL, si no inserte un registro */ /*$$IBE$$ 
        EXISTE = 'N';
        SELECT 'S' FROM SALDOS_CENTROS_TERCERO
            WHERE (CUEN_COD = :CUENTA) AND (PROY_COD = :PROY) AND (CENT_COD = :CENTRO) AND (TERC_NIT = :NIT) AND (SACU_FECHA = :INICIAL) INTO :EXISTE;
        IF (EXISTE = 'N') THEN
            BEGIN
            INSERT INTO SALDOS_CENTROS_TERCERO(CUEN_COD, PROY_COD, CENT_COD, TERC_NIT, SACU_FECHA, SACT_SALDO, SACT_DEBITO, SACT_CREDITO)
                VALUES (:CUENTA, :PROY, :CENTRO, :NIT, :INICIAL, :DEBITOS-:CREDITOS, 0, 0);
            END
        ELSE
            BEGIN
            UPDATE SALDOS_CENTROS_TERCERO
                SET SACT_SALDO = SACT_SALDO + :DEBITOS - :CREDITOS
                WHERE (CUEN_COD = :CUENTA) AND (PROY_COD = :PROY) AND (CENT_COD = :CENTRO) AND (TERC_NIT = :NIT) AND (SACU_FECHA = :INICIAL);
            END
         $$IBE$$*/ /* LOS DETALLADOS POR ARTICULO */ /*$$IBE$$ 
        if (ARTIC IS NOT NULL) then
            BEGIN
            EXISTE = 'N';
            SELECT 'S' FROM SALDOS_ARTICULO
                WHERE (CUEN_COD = :CUENTA) AND (ARTI_COD = :ARTIC) AND (SAAR_FECHA = :INICIAL) INTO :EXISTE;
            IF (EXISTE = 'N') THEN
                BEGIN
                INSERT INTO SALDOS_ARTICULO(CUEN_COD, ARTI_COD, SAAR_FECHA, SAAR_SALDO, SAAR_DEBITOS, SAAR_CREDITOS)
                    VALUES (:CUENTA, :ARTIC, :INICIAL, :DEBITOS-:CREDITOS, 0, 0);
                END
            ELSE
                BEGIN
                UPDATE SALDOS_ARTICULO
                    SET SAAR_SALDO = SAAR_SALDO + :DEBITOS - :CREDITOS
                    WHERE (CUEN_COD = :CUENTA) AND (ARTI_COD = :ARTIC) AND (SAAR_FECHA = :INICIAL);
                END
            END
        END
    END  $$IBE$$*/ /* SI DESDE EL INICIO */
/* AHORA LOS MOVIMIENTOS */ /*$$IBE$$ 
FOR SELECT CUEN_COD, TERC_NIT, PROY_COD, CENT_COD, ARTI_COD, CODE_DEBITO, CODE_CREDITO, ENCO_FECHA
    FROM COMPROBANTE_DETALLE d, COMPROBANTE_ENCABEZADO C WHERE C.ENCO_CONSEC = d.enco_consec AND ENCO_FECHA >= :FECINI
    ORDER BY ENCO_FECHA, CUEN_COD, TERC_NIT
    INTO :CUENTA, :NIT, :PROY, :CENTRO, :ARTIC, :DEBITOS, :CREDITOS, :FECHA
    DO
    BEGIN
    EXECUTE PROCEDURE ACTUALICE_SALDO_CUENTA(:CUENTA, FECHA, :DEBITOS, :CREDITOS);
    EXECUTE PROCEDURE ACTUALICE_SALDO_TERCERO(:CUENTA, :NIT, FECHA, :DEBITOS, :CREDITOS);
    EXECUTE PROCEDURE ACTUALICE_SALDO_CENTRO(:CUENTA, :PROY, :CENTRO, FECHA, :DEBITOS, :CREDITOS);
    EXECUTE PROCEDURE ACTUALICE_SALDO_CENTRO_TERCERO(:CUENTA, :PROY, :CENTRO, :NIT, FECHA, :DEBITOS, :CREDITOS);
    IF (ARTIC IS NOT NULL) THEN
        EXECUTE PROCEDURE ACTUALICE_SALDO_ARTICULO(:CUENTA, :ARTIC, :FECHA, :DEBITOS, :CREDITOS);
    END
 $$IBE$$*/ EXIT;
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE CHEQUEO_SALDOS_CONTA(
    FECINI CHAR(8),
    CTAINI VARCHAR(20),
    CTAFIN VARCHAR(20))
AS
declare variable CUENTA VARCHAR(20);
declare variable NIT VARCHAR(20);
declare variable PROY VARCHAR(4);
declare variable CENTRO VARCHAR(4);
declare variable ARTIC VARCHAR(15);
declare variable DEBITOS NUMERIC(15,2);
declare variable CREDITOS NUMERIC(15,2);
declare variable FECHA CHAR(8);
DECLARE VARIABLE ANO CHAR(4);
DECLARE VARIABLE MES CHAR(2);
DECLARE VARIABLE INICIAL CHAR(8);
DECLARE VARIABLE EXISTE CHAR(1);
declare variable CUENTAUX VARCHAR(20);
BEGIN
DELETE FROM saldos_centros_TERCERO WHERE SACU_FECHA >= :FECINI AND CUEN_COD >= :CTAINI AND CUEN_COD <= :CTAFIN;
DELETE FROM saldos_centros WHERE SACU_FECHA >= :FECINI AND CUEN_COD >= :CTAINI AND CUEN_COD <= :CTAFIN;
DELETE FROM saldos_terceros WHERE SACU_FECHA >= :FECINI AND CUEN_COD >= :CTAINI AND CUEN_COD <= :CTAFIN;
DELETE FROM SALDOS_ARTICULO WHERE SAAR_FECHA >= :FECINI AND CUEN_COD >= :CTAINI AND CUEN_COD <= :CTAFIN;
DELETE FROM saldos_cuentas WHERE SACU_FECHA >= :FECINI AND CUEN_COD >= :CTAINI AND CUEN_COD <= :CTAFIN;
/* BORRE LOS DB Y CR EN CERO */
UPDATE COMPROBANTE_DETALLE SET CODE_DEBITO = 0 WHERE CODE_DEBITO IS NULL;
UPDATE COMPROBANTE_DETALLE SET CODE_CREDITO = 0 WHERE CODE_CREDITO IS NULL;
/* EMPIECE CON LOS SALDOS INICIALES */
EXECUTE PROCEDURE LEE_CONFIGURACION('CONTABILIDAD', 'GENERAL', 'AÑO DE INICIO') RETURNING_VALUES (ANO);
EXECUTE PROCEDURE LEE_CONFIGURACION('CONTABILIDAD', 'GENERAL', 'MES DE INICIO') RETURNING_VALUES (MES);
EXECUTE PROCEDURE compone_fecha_conta (ANO, MES, 1) returning_values (INICIAL);
if (FECINI <= INICIAL) then
    BEGIN
    FOR SELECT CUEN_COD, TERC_NIT, PROY_COD, CENT_COD, ARTI_COD, SAIN_DEBITO, SAIN_CREDITO FROM SALDOS_INICIALES INTO :CUENTA, :NIT, :PROY, :CENTRO, :ARTIC, :DEBITOS, :CREDITOS
        DO
        BEGIN
        /* Busque en saldos_cuentas la cuenta y la fecha, si la encuentra actualice INICIAL, si no inserte un registro */
        CUENTAUX = CUENTA;
        WHILE (CUENTAUX <> '') DO
            BEGIN
            EXISTE = 'N';
            SELECT 'S' FROM SALDOS_CUENTAS
                WHERE (CUEN_COD = :CUENTAUX) AND (SACU_FECHA = :INICIAL) INTO :EXISTE;
            IF (EXISTE = 'N') THEN
                BEGIN
                INSERT INTO SALDOS_CUENTAS(CUEN_COD, SACU_FECHA, SACU_SALDO, SACU_DEBITO, SACU_CREDITO)
                    VALUES (:CUENTAUX, :INICIAL, :DEBITOS-:CREDITOS, 0, 0);
                END
            ELSE
                BEGIN
                UPDATE SALDOS_CUENTAS
                    SET SACU_SALDO = SACU_SALDO + :DEBITOS - :CREDITOS
                    WHERE (CUEN_COD = :CUENTAUX) AND (SACU_FECHA = :INICIAL);
                END
            EXECUTE PROCEDURE PADRE(CUENTAUX) RETURNING_VALUES (CUENTAUX);
            END
    
        /* Busque en saldos_TERCEROS si la encuentra actualice INICIAL, si no inserte un registro */
        EXISTE = 'N';
        SELECT 'S' FROM SALDOS_TERCEROS
            WHERE (CUEN_COD = :CUENTA) AND (TERC_NIT = :NIT) AND (SACU_FECHA = :INICIAL) INTO :EXISTE;
        IF (EXISTE = 'N') THEN
            BEGIN
            INSERT INTO SALDOS_TERCEROS(CUEN_COD, TERC_NIT, SACU_FECHA, SATE_SALDO, SATE_DEBITO, SATE_CREDITO)
                VALUES (:CUENTA, :NIT, :INICIAL, :DEBITOS-:CREDITOS, 0, 0);
            END
        ELSE
            BEGIN
            UPDATE SALDOS_TERCEROS
                SET SATE_SALDO = SATE_SALDO + :DEBITOS - :CREDITOS
                WHERE (CUEN_COD = :CUENTA) AND (TERC_NIT = :NIT) AND (SACU_FECHA = :INICIAL);
            END
        /* Busque en saldos_CENTROS si la encuentra actualice INICIAL, si no inserte un registro */
        EXISTE = 'N';
        SELECT 'S' FROM SALDOS_CENTROS
            WHERE (CUEN_COD = :CUENTA) AND (PROY_COD = :PROY) AND (CENT_COD = :CENTRO) AND (SACU_FECHA = :INICIAL) INTO :EXISTE;
        IF (EXISTE = 'N') THEN
            BEGIN
            INSERT INTO SALDOS_CENTROS(CUEN_COD, PROY_COD, CENT_COD, SACU_FECHA, SACE_SALDO, SACE_DEBITO, SACE_CREDITO)
                VALUES (:CUENTA, :PROY, :CENTRO, :INICIAL, :DEBITOS-:CREDITOS, 0, 0);
            END
        ELSE
            BEGIN
            UPDATE SALDOS_CENTROS
                SET SACE_SALDO = SACE_SALDO + :DEBITOS - :CREDITOS
                WHERE (CUEN_COD = :CUENTA) AND (PROY_COD = :PROY) AND (CENT_COD = :CENTRO) AND (SACU_FECHA = :INICIAL);
            END
        /* Busque en saldos_CENTROS-TERCERO si la encuentra actualice INICIAL, si no inserte un registro */
        EXISTE = 'N';
        SELECT 'S' FROM SALDOS_CENTROS_TERCERO
            WHERE (CUEN_COD = :CUENTA) AND (PROY_COD = :PROY) AND (CENT_COD = :CENTRO) AND (TERC_NIT = :NIT) AND (SACU_FECHA = :INICIAL) INTO :EXISTE;
        IF (EXISTE = 'N') THEN
            BEGIN
            INSERT INTO SALDOS_CENTROS_TERCERO(CUEN_COD, PROY_COD, CENT_COD, TERC_NIT, SACU_FECHA, SACT_SALDO, SACT_DEBITO, SACT_CREDITO)
                VALUES (:CUENTA, :PROY, :CENTRO, :NIT, :INICIAL, :DEBITOS-:CREDITOS, 0, 0);
            END
        ELSE
            BEGIN
            UPDATE SALDOS_CENTROS_TERCERO
                SET SACT_SALDO = SACT_SALDO + :DEBITOS - :CREDITOS
                WHERE (CUEN_COD = :CUENTA) AND (PROY_COD = :PROY) AND (CENT_COD = :CENTRO) AND (TERC_NIT = :NIT) AND (SACU_FECHA = :INICIAL);
            END
        /* LOS DETALLADOS POR ARTICULO */
        if (ARTIC IS NOT NULL) then
            BEGIN
            EXISTE = 'N';
            SELECT 'S' FROM SALDOS_ARTICULO
                WHERE (CUEN_COD = :CUENTA) AND (ARTI_COD = :ARTIC) AND (SAAR_FECHA = :INICIAL) INTO :EXISTE;
            IF (EXISTE = 'N') THEN
                BEGIN
                INSERT INTO SALDOS_ARTICULO(CUEN_COD, ARTI_COD, SAAR_FECHA, SAAR_SALDO, SAAR_DEBITOS, SAAR_CREDITOS)
                    VALUES (:CUENTA, :ARTIC, :INICIAL, :DEBITOS-:CREDITOS, 0, 0);
                END
            ELSE
                BEGIN
                UPDATE SALDOS_ARTICULO
                    SET SAAR_SALDO = SAAR_SALDO + :DEBITOS - :CREDITOS
                    WHERE (CUEN_COD = :CUENTA) AND (ARTI_COD = :ARTIC) AND (SAAR_FECHA = :INICIAL);
                END
            END
        END
    END /* SI DESDE EL INICIO */
/* AHORA LOS MOVIMIENTOS */
FOR SELECT CUEN_COD, TERC_NIT, PROY_COD, CENT_COD, ARTI_COD, CODE_DEBITO, CODE_CREDITO, ENCO_FECHA
    FROM COMPROBANTE_DETALLE d, COMPROBANTE_ENCABEZADO C WHERE C.ENCO_CONSEC = d.enco_consec AND ENCO_FECHA >= :FECINI
    ORDER BY ENCO_FECHA, CUEN_COD, TERC_NIT
    INTO :CUENTA, :NIT, :PROY, :CENTRO, :ARTIC, :DEBITOS, :CREDITOS, :FECHA
    DO
    BEGIN
    EXECUTE PROCEDURE ACTUALICE_SALDO_CUENTA(:CUENTA, FECHA, :DEBITOS, :CREDITOS);
    EXECUTE PROCEDURE ACTUALICE_SALDO_TERCERO(:CUENTA, :NIT, FECHA, :DEBITOS, :CREDITOS);
    EXECUTE PROCEDURE ACTUALICE_SALDO_CENTRO(:CUENTA, :PROY, :CENTRO, FECHA, :DEBITOS, :CREDITOS);
    EXECUTE PROCEDURE ACTUALICE_SALDO_CENTRO_TERCERO(:CUENTA, :PROY, :CENTRO, :NIT, FECHA, :DEBITOS, :CREDITOS);
    IF (ARTIC IS NOT NULL) THEN
        EXECUTE PROCEDURE ACTUALICE_SALDO_ARTICULO(:CUENTA, :ARTIC, :FECHA, :DEBITOS, :CREDITOS);
    END
END

^

SET TERM ; ^

SET TERM ^ ;

ALTER TRIGGER COMPROBANTE_DETALLE_AD
AS
DECLARE VARIABLE FECHA CHAR(8);
DECLARE VARIABLE DIF_DB NUMERIC(15,2);
DECLARE VARIABLE DIF_CR NUMERIC(15,2);
declare variable TIPO CHAR(1);
BEGIN
/* DESHAGA LO VIEJO */
SELECT ENCO_FECHA FROM COMPROBANTE_ENCABEZADO WHERE ENCO_CONSEC = OLD.ENCO_CONSEC INTO :FECHA;
DIF_DB = - OLD.CODE_DEBITO;
DIF_CR = - OLD.CODE_CREDITO;
EXECUTE PROCEDURE ACTUALICE_SALDO_CENTRO_TERCERO(OLD.CUEN_COD, OLD.PROY_COD, OLD.CENT_COD, OLD.TERC_NIT, FECHA, DIF_DB, DIF_CR);
EXECUTE PROCEDURE ACTUALICE_SALDO_CENTRO(OLD.CUEN_COD, OLD.PROY_COD, OLD.CENT_COD, FECHA, DIF_DB, DIF_CR);
EXECUTE PROCEDURE ACTUALICE_SALDO_TERCERO(OLD.CUEN_COD, OLD.TERC_NIT, FECHA, DIF_DB, DIF_CR);
EXECUTE PROCEDURE ACTUALICE_SALDO_CUENTA(OLD.CUEN_COD, FECHA, DIF_DB, DIF_CR);
if (OLD.ARTI_COD IS NOT NULL) then
  BEGIN
  SELECT CUEN_TIPO FROM CUENTAS WHERE CUEN_COD = OLD.CUEN_COD INTO :TIPO;
  if (TIPO = 'I') then
    EXECUTE PROCEDURE ACTUALICE_SALDO_ARTICULO(OLD.CUEN_COD, OLD.ARTI_COD, FECHA, DIF_DB, DIF_CR);
  ELSE
    EXECUTE PROCEDURE actualice_saldo_activo(OLD.CUEN_COD, OLD.ARTI_COD, FECHA, DIF_DB, DIF_CR);
  END
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER TRIGGER COMPROBANTE_DETALLE_AI
AS
DECLARE VARIABLE FECHA CHAR(8);
declare variable TIPO CHAR(1);
BEGIN
SELECT ENCO_FECHA FROM COMPROBANTE_ENCABEZADO WHERE ENCO_CONSEC = NEW.ENCO_CONSEC INTO :FECHA;
/* ACTUALICE LOS SALDOS */
EXECUTE PROCEDURE ACTUALICE_SALDO_CUENTA(NEW.CUEN_COD, FECHA, NEW.CODE_DEBITO, NEW.CODE_CREDITO);
EXECUTE PROCEDURE ACTUALICE_SALDO_TERCERO(NEW.CUEN_COD, NEW.TERC_NIT, FECHA, NEW.CODE_DEBITO, NEW.CODE_CREDITO);
if (NEW.ARTI_COD IS NOT NULL) then
  BEGIN
  SELECT CUEN_TIPO FROM CUENTAS WHERE CUEN_COD = NEW.CUEN_COD INTO :TIPO;
  if (TIPO = 'I') then
    EXECUTE PROCEDURE ACTUALICE_SALDO_ARTICULO(NEW.CUEN_COD, NEW.ARTI_COD, FECHA, NEW.CODE_DEBITO, NEW.CODE_CREDITO);
  else
    if (TIPO = 'A') then
      EXECUTE PROCEDURE actualice_saldo_activo(NEW.CUEN_COD, NEW.ARTI_COD, FECHA, NEW.CODE_DEBITO, NEW.CODE_CREDITO);
  END
EXECUTE PROCEDURE ACTUALICE_SALDO_CENTRO(NEW.CUEN_COD, NEW.PROY_COD, NEW.CENT_COD, FECHA, NEW.CODE_DEBITO, NEW.CODE_CREDITO);
EXECUTE PROCEDURE ACTUALICE_SALDO_CENTRO_TERCERO(NEW.CUEN_COD, NEW.PROY_COD, NEW.CENT_COD, NEW.TERC_NIT, FECHA, NEW.CODE_DEBITO, NEW.CODE_CREDITO);
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER TRIGGER COMPROBANTE_DETALLE_AU
AS
DECLARE VARIABLE FECHA CHAR(8);
DECLARE VARIABLE DIF_DB NUMERIC(15,2);
DECLARE VARIABLE DIF_CR NUMERIC(15,2);
declare variable TIPO CHAR(1);
BEGIN
/* DESHAGA LO VIEJO */
SELECT ENCO_FECHA FROM COMPROBANTE_ENCABEZADO WHERE ENCO_CONSEC = NEW.ENCO_CONSEC INTO :FECHA;
DIF_DB = - OLD.CODE_DEBITO;
DIF_CR = - OLD.CODE_CREDITO;
EXECUTE PROCEDURE ACTUALICE_SALDO_CENTRO_TERCERO(OLD.CUEN_COD, OLD.PROY_COD, OLD.CENT_COD, OLD.TERC_NIT, FECHA, DIF_DB, DIF_CR);
EXECUTE PROCEDURE ACTUALICE_SALDO_CENTRO(OLD.CUEN_COD, OLD.PROY_COD, OLD.CENT_COD, FECHA, DIF_DB, DIF_CR);
EXECUTE PROCEDURE ACTUALICE_SALDO_TERCERO(OLD.CUEN_COD, OLD.TERC_NIT, FECHA, DIF_DB, DIF_CR);
EXECUTE PROCEDURE ACTUALICE_SALDO_CUENTA(OLD.CUEN_COD, FECHA, DIF_DB, DIF_CR);
if (OLD.ARTI_COD IS NOT NULL) then
  BEGIN
  SELECT CUEN_TIPO FROM CUENTAS WHERE CUEN_COD = NEW.CUEN_COD INTO :TIPO;
  if (TIPO = 'I') then
    EXECUTE PROCEDURE ACTUALICE_SALDO_ARTICULO(OLD.CUEN_COD, OLD.ARTI_COD, FECHA, DIF_DB, DIF_CR);
  ELSE
    EXECUTE PROCEDURE actualice_saldo_activo(OLD.CUEN_COD, OLD.ARTI_COD, FECHA, DIF_DB, DIF_CR);
  END
/* GRABE LOS NUEVOS */
EXECUTE PROCEDURE ACTUALICE_SALDO_CUENTA(NEW.CUEN_COD, FECHA, NEW.CODE_DEBITO, NEW.CODE_CREDITO);
EXECUTE PROCEDURE ACTUALICE_SALDO_TERCERO(NEW.CUEN_COD, NEW.TERC_NIT, FECHA, NEW.CODE_DEBITO, NEW.CODE_CREDITO);
EXECUTE PROCEDURE ACTUALICE_SALDO_CENTRO(NEW.CUEN_COD, NEW.PROY_COD, NEW.CENT_COD, FECHA, NEW.CODE_DEBITO, NEW.CODE_CREDITO);
EXECUTE PROCEDURE ACTUALICE_SALDO_CENTRO_TERCERO(NEW.CUEN_COD, NEW.PROY_COD, NEW.CENT_COD, NEW.TERC_NIT, FECHA, NEW.CODE_DEBITO, NEW.CODE_CREDITO);
if (NEW.ARTI_COD IS NOT NULL) then
  BEGIN
  SELECT CUEN_TIPO FROM CUENTAS WHERE CUEN_COD = NEW.CUEN_COD INTO :TIPO;
  if (TIPO = 'I') then
    EXECUTE PROCEDURE ACTUALICE_SALDO_ARTICULO(NEW.CUEN_COD, NEW.ARTI_COD, FECHA, NEW.code_debito, NEW.code_credito);
  ELSE
    EXECUTE PROCEDURE actualice_saldo_activo(NEW.CUEN_COD, NEW.ARTI_COD, FECHA, NEW.code_debito, NEW.code_credito);
  END
END
^

SET TERM ; ^


SET TERM ^ ;

CREATE OR ALTER PROCEDURE ACTUALICE_SALDO_TERCERO(
    CUENTA VARCHAR(20),
    NIT VARCHAR(20),
    FECHA CHAR(8),
    DEBITO NUMERIC(18,2),
    CREDITO NUMERIC(18,2))
AS
DECLARE VARIABLE SALDOA NUMERIC(18,2);
BEGIN
IF (:NIT <> '') THEN
    BEGIN
    /* Busque en saldos_terceros la cuenta-NIT y la fecha, si la encuentra actualice db y cr, si no inserte un registro */
    IF (EXISTS (SELECT * FROM SALDOS_TERCEROS
        WHERE (CUEN_COD = :CUENTA) AND (TERC_NIT = :NIT) AND (SACU_FECHA = :FECHA))) THEN
        BEGIN
        UPDATE SALDOS_TERCEROS
          SET SATE_DEBITO = SATE_DEBITO + :DEBITO,
             SATE_CREDITO = SATE_CREDITO + :CREDITO
          WHERE (CUEN_COD = :CUENTA) AND (TERC_NIT = :NIT) AND (SACU_FECHA = :FECHA);
        END
    ELSE
      BEGIN
      /*  traiga el saldo anterior y registre uno nuevo */
      EXECUTE PROCEDURE SALDO_TERCERO(:CUENTA, :NIT, :FECHA) RETURNING_VALUES :SALDOA;
      INSERT INTO SALDOS_TERCEROS(CUEN_COD, TERC_NIT, SACU_FECHA, SATE_SALDO, SATE_DEBITO, SATE_CREDITO)
        VALUES (:CUENTA, :NIT, :FECHA, :SALDOA, :DEBITO, :CREDITO);
      END
    /* Actualice los saldos de fechas posteriores */
    UPDATE SALDOS_TERCEROS
        SET SATE_SALDO = SATE_SALDO + :DEBITO - :CREDITO
        WHERE (CUEN_COD = :CUENTA) AND (TERC_NIT = :NIT) AND (SACU_FECHA > :FECHA);
    END
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE CHEQUEO_SALDOS_CONTA(
    FECINI CHAR(8),
    CTAINI VARCHAR(20),
    CTAFIN VARCHAR(20))
AS
declare variable CUENTA VARCHAR(20);
declare variable NIT VARCHAR(20);
declare variable PROY VARCHAR(4);
declare variable CENTRO VARCHAR(4);
declare variable ARTIC VARCHAR(15);
declare variable DEBITOS NUMERIC(15,2);
declare variable CREDITOS NUMERIC(15,2);
declare variable FECHA CHAR(8);
DECLARE VARIABLE ANO CHAR(4);
DECLARE VARIABLE MES CHAR(2);
DECLARE VARIABLE INICIAL CHAR(8);
DECLARE VARIABLE EXISTE CHAR(1);
declare variable CUENTAUX VARCHAR(20);
BEGIN /*$$IBE$$ 
DELETE FROM saldos_centros_TERCERO WHERE SACU_FECHA >= :FECINI AND CUEN_COD >= :CTAINI AND CUEN_COD <= :CTAFIN;
DELETE FROM saldos_centros WHERE SACU_FECHA >= :FECINI AND CUEN_COD >= :CTAINI AND CUEN_COD <= :CTAFIN;
DELETE FROM saldos_terceros WHERE SACU_FECHA >= :FECINI AND CUEN_COD >= :CTAINI AND CUEN_COD <= :CTAFIN;
DELETE FROM SALDOS_ARTICULO WHERE SAAR_FECHA >= :FECINI AND CUEN_COD >= :CTAINI AND CUEN_COD <= :CTAFIN;
DELETE FROM saldos_cuentas WHERE SACU_FECHA >= :FECINI AND CUEN_COD >= :CTAINI AND CUEN_COD <= :CTAFIN;
 $$IBE$$*/ /* BORRE LOS DB Y CR EN CERO */ /*$$IBE$$ 
UPDATE COMPROBANTE_DETALLE SET CODE_DEBITO = 0 WHERE CODE_DEBITO IS NULL;
UPDATE COMPROBANTE_DETALLE SET CODE_CREDITO = 0 WHERE CODE_CREDITO IS NULL;
 $$IBE$$*/ /* EMPIECE CON LOS SALDOS INICIALES */ /*$$IBE$$ 
EXECUTE PROCEDURE LEE_CONFIGURACION('CONTABILIDAD', 'GENERAL', 'AÑO DE INICIO') RETURNING_VALUES (ANO);
EXECUTE PROCEDURE LEE_CONFIGURACION('CONTABILIDAD', 'GENERAL', 'MES DE INICIO') RETURNING_VALUES (MES);
EXECUTE PROCEDURE compone_fecha_conta (ANO, MES, 1) returning_values (INICIAL);
if (FECINI <= INICIAL) then
    BEGIN
    FOR SELECT CUEN_COD, TERC_NIT, PROY_COD, CENT_COD, ARTI_COD, SAIN_DEBITO, SAIN_CREDITO FROM SALDOS_INICIALES INTO :CUENTA, :NIT, :PROY, :CENTRO, :ARTIC, :DEBITOS, :CREDITOS
        DO
        BEGIN
         $$IBE$$*/ /* Busque en saldos_cuentas la cuenta y la fecha, si la encuentra actualice INICIAL, si no inserte un registro */ /*$$IBE$$ 
        CUENTAUX = CUENTA;
        WHILE (CUENTAUX <> '') DO
            BEGIN
            EXISTE = 'N';
            SELECT 'S' FROM SALDOS_CUENTAS
                WHERE (CUEN_COD = :CUENTAUX) AND (SACU_FECHA = :INICIAL) INTO :EXISTE;
            IF (EXISTE = 'N') THEN
                BEGIN
                INSERT INTO SALDOS_CUENTAS(CUEN_COD, SACU_FECHA, SACU_SALDO, SACU_DEBITO, SACU_CREDITO)
                    VALUES (:CUENTAUX, :INICIAL, :DEBITOS-:CREDITOS, 0, 0);
                END
            ELSE
                BEGIN
                UPDATE SALDOS_CUENTAS
                    SET SACU_SALDO = SACU_SALDO + :DEBITOS - :CREDITOS
                    WHERE (CUEN_COD = :CUENTAUX) AND (SACU_FECHA = :INICIAL);
                END
            EXECUTE PROCEDURE PADRE(CUENTAUX) RETURNING_VALUES (CUENTAUX);
            END
    
         $$IBE$$*/ /* Busque en saldos_TERCEROS si la encuentra actualice INICIAL, si no inserte un registro */ /*$$IBE$$ 
        EXISTE = 'N';
        SELECT 'S' FROM SALDOS_TERCEROS
            WHERE (CUEN_COD = :CUENTA) AND (TERC_NIT = :NIT) AND (SACU_FECHA = :INICIAL) INTO :EXISTE;
        IF (EXISTE = 'N') THEN
            BEGIN
            INSERT INTO SALDOS_TERCEROS(CUEN_COD, TERC_NIT, SACU_FECHA, SATE_SALDO, SATE_DEBITO, SATE_CREDITO)
                VALUES (:CUENTA, :NIT, :INICIAL, :DEBITOS-:CREDITOS, 0, 0);
            END
        ELSE
            BEGIN
            UPDATE SALDOS_TERCEROS
                SET SATE_SALDO = SATE_SALDO + :DEBITOS - :CREDITOS
                WHERE (CUEN_COD = :CUENTA) AND (TERC_NIT = :NIT) AND (SACU_FECHA = :INICIAL);
            END
         $$IBE$$*/ /* Busque en saldos_CENTROS si la encuentra actualice INICIAL, si no inserte un registro */ /*$$IBE$$ 
        EXISTE = 'N';
        SELECT 'S' FROM SALDOS_CENTROS
            WHERE (CUEN_COD = :CUENTA) AND (PROY_COD = :PROY) AND (CENT_COD = :CENTRO) AND (SACU_FECHA = :INICIAL) INTO :EXISTE;
        IF (EXISTE = 'N') THEN
            BEGIN
            INSERT INTO SALDOS_CENTROS(CUEN_COD, PROY_COD, CENT_COD, SACU_FECHA, SACE_SALDO, SACE_DEBITO, SACE_CREDITO)
                VALUES (:CUENTA, :PROY, :CENTRO, :INICIAL, :DEBITOS-:CREDITOS, 0, 0);
            END
        ELSE
            BEGIN
            UPDATE SALDOS_CENTROS
                SET SACE_SALDO = SACE_SALDO + :DEBITOS - :CREDITOS
                WHERE (CUEN_COD = :CUENTA) AND (PROY_COD = :PROY) AND (CENT_COD = :CENTRO) AND (SACU_FECHA = :INICIAL);
            END
         $$IBE$$*/ /* Busque en saldos_CENTROS-TERCERO si la encuentra actualice INICIAL, si no inserte un registro */ /*$$IBE$$ 
        EXISTE = 'N';
        SELECT 'S' FROM SALDOS_CENTROS_TERCERO
            WHERE (CUEN_COD = :CUENTA) AND (PROY_COD = :PROY) AND (CENT_COD = :CENTRO) AND (TERC_NIT = :NIT) AND (SACU_FECHA = :INICIAL) INTO :EXISTE;
        IF (EXISTE = 'N') THEN
            BEGIN
            INSERT INTO SALDOS_CENTROS_TERCERO(CUEN_COD, PROY_COD, CENT_COD, TERC_NIT, SACU_FECHA, SACT_SALDO, SACT_DEBITO, SACT_CREDITO)
                VALUES (:CUENTA, :PROY, :CENTRO, :NIT, :INICIAL, :DEBITOS-:CREDITOS, 0, 0);
            END
        ELSE
            BEGIN
            UPDATE SALDOS_CENTROS_TERCERO
                SET SACT_SALDO = SACT_SALDO + :DEBITOS - :CREDITOS
                WHERE (CUEN_COD = :CUENTA) AND (PROY_COD = :PROY) AND (CENT_COD = :CENTRO) AND (TERC_NIT = :NIT) AND (SACU_FECHA = :INICIAL);
            END
         $$IBE$$*/ /* LOS DETALLADOS POR ARTICULO */ /*$$IBE$$ 
        if (ARTIC IS NOT NULL) then
            BEGIN
            EXISTE = 'N';
            SELECT 'S' FROM SALDOS_ARTICULO
                WHERE (CUEN_COD = :CUENTA) AND (ARTI_COD = :ARTIC) AND (SAAR_FECHA = :INICIAL) INTO :EXISTE;
            IF (EXISTE = 'N') THEN
                BEGIN
                INSERT INTO SALDOS_ARTICULO(CUEN_COD, ARTI_COD, SAAR_FECHA, SAAR_SALDO, SAAR_DEBITOS, SAAR_CREDITOS)
                    VALUES (:CUENTA, :ARTIC, :INICIAL, :DEBITOS-:CREDITOS, 0, 0);
                END
            ELSE
                BEGIN
                UPDATE SALDOS_ARTICULO
                    SET SAAR_SALDO = SAAR_SALDO + :DEBITOS - :CREDITOS
                    WHERE (CUEN_COD = :CUENTA) AND (ARTI_COD = :ARTIC) AND (SAAR_FECHA = :INICIAL);
                END
            END
        END
    END  $$IBE$$*/ /* SI DESDE EL INICIO */
/* AHORA LOS MOVIMIENTOS */ /*$$IBE$$ 
FOR SELECT CUEN_COD, TERC_NIT, PROY_COD, CENT_COD, ARTI_COD, CODE_DEBITO, CODE_CREDITO, ENCO_FECHA
    FROM COMPROBANTE_DETALLE d, COMPROBANTE_ENCABEZADO C WHERE C.ENCO_CONSEC = d.enco_consec AND ENCO_FECHA >= :FECINI
    ORDER BY ENCO_FECHA, CUEN_COD, TERC_NIT
    INTO :CUENTA, :NIT, :PROY, :CENTRO, :ARTIC, :DEBITOS, :CREDITOS, :FECHA
    DO
    BEGIN
    EXECUTE PROCEDURE ACTUALICE_SALDO_CUENTA(:CUENTA, FECHA, :DEBITOS, :CREDITOS);
    EXECUTE PROCEDURE ACTUALICE_SALDO_TERCERO(:CUENTA, :NIT, FECHA, :DEBITOS, :CREDITOS);
    EXECUTE PROCEDURE ACTUALICE_SALDO_CENTRO(:CUENTA, :PROY, :CENTRO, FECHA, :DEBITOS, :CREDITOS);
    EXECUTE PROCEDURE ACTUALICE_SALDO_CENTRO_TERCERO(:CUENTA, :PROY, :CENTRO, :NIT, FECHA, :DEBITOS, :CREDITOS);
    IF (ARTIC IS NOT NULL) THEN
        EXECUTE PROCEDURE ACTUALICE_SALDO_ARTICULO(:CUENTA, :ARTIC, :FECHA, :DEBITOS, :CREDITOS);
    END
 $$IBE$$*/ EXIT;
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE CHEQUEO_SALDOS_CONTA(
    FECINI CHAR(8),
    CTAINI VARCHAR(20),
    CTAFIN VARCHAR(20))
AS
declare variable CUENTA VARCHAR(20);
declare variable NIT VARCHAR(20);
declare variable PROY VARCHAR(4);
declare variable CENTRO VARCHAR(4);
declare variable ARTIC VARCHAR(15);
declare variable DEBITOS NUMERIC(15,2);
declare variable CREDITOS NUMERIC(15,2);
declare variable FECHA CHAR(8);
DECLARE VARIABLE ANO CHAR(4);
DECLARE VARIABLE MES CHAR(2);
DECLARE VARIABLE INICIAL CHAR(8);
DECLARE VARIABLE EXISTE CHAR(1);
declare variable CUENTAUX VARCHAR(20);
BEGIN
DELETE FROM saldos_centros_TERCERO WHERE SACU_FECHA >= :FECINI AND CUEN_COD >= :CTAINI AND CUEN_COD <= :CTAFIN;
DELETE FROM saldos_centros WHERE SACU_FECHA >= :FECINI AND CUEN_COD >= :CTAINI AND CUEN_COD <= :CTAFIN;
DELETE FROM saldos_terceros WHERE SACU_FECHA >= :FECINI AND CUEN_COD >= :CTAINI AND CUEN_COD <= :CTAFIN;
DELETE FROM SALDOS_ARTICULO WHERE SAAR_FECHA >= :FECINI AND CUEN_COD >= :CTAINI AND CUEN_COD <= :CTAFIN;
DELETE FROM saldos_cuentas WHERE SACU_FECHA >= :FECINI AND CUEN_COD >= :CTAINI AND CUEN_COD <= :CTAFIN;
/* BORRE LOS DB Y CR EN CERO */
UPDATE COMPROBANTE_DETALLE SET CODE_DEBITO = 0 WHERE CODE_DEBITO IS NULL;
UPDATE COMPROBANTE_DETALLE SET CODE_CREDITO = 0 WHERE CODE_CREDITO IS NULL;
/* EMPIECE CON LOS SALDOS INICIALES */
EXECUTE PROCEDURE LEE_CONFIGURACION('CONTABILIDAD', 'GENERAL', 'AÑO DE INICIO') RETURNING_VALUES (ANO);
EXECUTE PROCEDURE LEE_CONFIGURACION('CONTABILIDAD', 'GENERAL', 'MES DE INICIO') RETURNING_VALUES (MES);
EXECUTE PROCEDURE compone_fecha_conta (ANO, MES, 1) returning_values (INICIAL);
if (FECINI <= INICIAL) then
    BEGIN
    FOR SELECT CUEN_COD, TERC_NIT, PROY_COD, CENT_COD, ARTI_COD, SAIN_DEBITO, SAIN_CREDITO FROM SALDOS_INICIALES INTO :CUENTA, :NIT, :PROY, :CENTRO, :ARTIC, :DEBITOS, :CREDITOS
        DO
        BEGIN
        /* Busque en saldos_cuentas la cuenta y la fecha, si la encuentra actualice INICIAL, si no inserte un registro */
        CUENTAUX = CUENTA;
        WHILE (CUENTAUX <> '') DO
            BEGIN
            EXISTE = 'N';
            SELECT 'S' FROM SALDOS_CUENTAS
                WHERE (CUEN_COD = :CUENTAUX) AND (SACU_FECHA = :INICIAL) INTO :EXISTE;
            IF (EXISTE = 'N') THEN
                BEGIN
                INSERT INTO SALDOS_CUENTAS(CUEN_COD, SACU_FECHA, SACU_SALDO, SACU_DEBITO, SACU_CREDITO)
                    VALUES (:CUENTAUX, :INICIAL, :DEBITOS-:CREDITOS, 0, 0);
                END
            ELSE
                BEGIN
                UPDATE SALDOS_CUENTAS
                    SET SACU_SALDO = SACU_SALDO + :DEBITOS - :CREDITOS
                    WHERE (CUEN_COD = :CUENTAUX) AND (SACU_FECHA = :INICIAL);
                END
            EXECUTE PROCEDURE PADRE(CUENTAUX) RETURNING_VALUES (CUENTAUX);
            END
    
        /* Busque en saldos_TERCEROS si la encuentra actualice INICIAL, si no inserte un registro */
        EXISTE = 'N';
        SELECT 'S' FROM SALDOS_TERCEROS
            WHERE (CUEN_COD = :CUENTA) AND (TERC_NIT = :NIT) AND (SACU_FECHA = :INICIAL) INTO :EXISTE;
        IF (EXISTE = 'N') THEN
            BEGIN
            INSERT INTO SALDOS_TERCEROS(CUEN_COD, TERC_NIT, SACU_FECHA, SATE_SALDO, SATE_DEBITO, SATE_CREDITO)
                VALUES (:CUENTA, :NIT, :INICIAL, :DEBITOS-:CREDITOS, 0, 0);
            END
        ELSE
            BEGIN
            UPDATE SALDOS_TERCEROS
                SET SATE_SALDO = SATE_SALDO + :DEBITOS - :CREDITOS
                WHERE (CUEN_COD = :CUENTA) AND (TERC_NIT = :NIT) AND (SACU_FECHA = :INICIAL);
            END
        /* Busque en saldos_CENTROS si la encuentra actualice INICIAL, si no inserte un registro */
        EXISTE = 'N';
        SELECT 'S' FROM SALDOS_CENTROS
            WHERE (CUEN_COD = :CUENTA) AND (PROY_COD = :PROY) AND (CENT_COD = :CENTRO) AND (SACU_FECHA = :INICIAL) INTO :EXISTE;
        IF (EXISTE = 'N') THEN
            BEGIN
            INSERT INTO SALDOS_CENTROS(CUEN_COD, PROY_COD, CENT_COD, SACU_FECHA, SACE_SALDO, SACE_DEBITO, SACE_CREDITO)
                VALUES (:CUENTA, :PROY, :CENTRO, :INICIAL, :DEBITOS-:CREDITOS, 0, 0);
            END
        ELSE
            BEGIN
            UPDATE SALDOS_CENTROS
                SET SACE_SALDO = SACE_SALDO + :DEBITOS - :CREDITOS
                WHERE (CUEN_COD = :CUENTA) AND (PROY_COD = :PROY) AND (CENT_COD = :CENTRO) AND (SACU_FECHA = :INICIAL);
            END
        /* Busque en saldos_CENTROS-TERCERO si la encuentra actualice INICIAL, si no inserte un registro */
        EXISTE = 'N';
        SELECT 'S' FROM SALDOS_CENTROS_TERCERO
            WHERE (CUEN_COD = :CUENTA) AND (PROY_COD = :PROY) AND (CENT_COD = :CENTRO) AND (TERC_NIT = :NIT) AND (SACU_FECHA = :INICIAL) INTO :EXISTE;
        IF (EXISTE = 'N') THEN
            BEGIN
            INSERT INTO SALDOS_CENTROS_TERCERO(CUEN_COD, PROY_COD, CENT_COD, TERC_NIT, SACU_FECHA, SACT_SALDO, SACT_DEBITO, SACT_CREDITO)
                VALUES (:CUENTA, :PROY, :CENTRO, :NIT, :INICIAL, :DEBITOS-:CREDITOS, 0, 0);
            END
        ELSE
            BEGIN
            UPDATE SALDOS_CENTROS_TERCERO
                SET SACT_SALDO = SACT_SALDO + :DEBITOS - :CREDITOS
                WHERE (CUEN_COD = :CUENTA) AND (PROY_COD = :PROY) AND (CENT_COD = :CENTRO) AND (TERC_NIT = :NIT) AND (SACU_FECHA = :INICIAL);
            END
        /* LOS DETALLADOS POR ARTICULO */
        if (ARTIC IS NOT NULL) then
            BEGIN
            EXISTE = 'N';
            SELECT 'S' FROM SALDOS_ARTICULO
                WHERE (CUEN_COD = :CUENTA) AND (ARTI_COD = :ARTIC) AND (SAAR_FECHA = :INICIAL) INTO :EXISTE;
            IF (EXISTE = 'N') THEN
                BEGIN
                INSERT INTO SALDOS_ARTICULO(CUEN_COD, ARTI_COD, SAAR_FECHA, SAAR_SALDO, SAAR_DEBITOS, SAAR_CREDITOS)
                    VALUES (:CUENTA, :ARTIC, :INICIAL, :DEBITOS-:CREDITOS, 0, 0);
                END
            ELSE
                BEGIN
                UPDATE SALDOS_ARTICULO
                    SET SAAR_SALDO = SAAR_SALDO + :DEBITOS - :CREDITOS
                    WHERE (CUEN_COD = :CUENTA) AND (ARTI_COD = :ARTIC) AND (SAAR_FECHA = :INICIAL);
                END
            END
        END
    END /* SI DESDE EL INICIO */
/* AHORA LOS MOVIMIENTOS */
FOR SELECT CUEN_COD, TERC_NIT, PROY_COD, CENT_COD, ARTI_COD, CODE_DEBITO, CODE_CREDITO, ENCO_FECHA
    FROM COMPROBANTE_DETALLE d, COMPROBANTE_ENCABEZADO C WHERE C.ENCO_CONSEC = d.enco_consec AND ENCO_FECHA >= :FECINI
    ORDER BY ENCO_FECHA, CUEN_COD, TERC_NIT
    INTO :CUENTA, :NIT, :PROY, :CENTRO, :ARTIC, :DEBITOS, :CREDITOS, :FECHA
    DO
    BEGIN
    EXECUTE PROCEDURE ACTUALICE_SALDO_CUENTA(:CUENTA, FECHA, :DEBITOS, :CREDITOS);
    EXECUTE PROCEDURE ACTUALICE_SALDO_TERCERO(:CUENTA, :NIT, FECHA, :DEBITOS, :CREDITOS);
    EXECUTE PROCEDURE ACTUALICE_SALDO_CENTRO(:CUENTA, :PROY, :CENTRO, FECHA, :DEBITOS, :CREDITOS);
    EXECUTE PROCEDURE ACTUALICE_SALDO_CENTRO_TERCERO(:CUENTA, :PROY, :CENTRO, :NIT, FECHA, :DEBITOS, :CREDITOS);
    IF (ARTIC IS NOT NULL) THEN
        EXECUTE PROCEDURE ACTUALICE_SALDO_ARTICULO(:CUENTA, :ARTIC, :FECHA, :DEBITOS, :CREDITOS);
    END
END

^

SET TERM ; ^

SET TERM ^ ;

ALTER TRIGGER COMPROBANTE_DETALLE_AD
AS
DECLARE VARIABLE FECHA CHAR(8);
DECLARE VARIABLE DIF_DB NUMERIC(15,2);
DECLARE VARIABLE DIF_CR NUMERIC(15,2);
declare variable TIPO CHAR(1);
BEGIN
/* DESHAGA LO VIEJO */
SELECT ENCO_FECHA FROM COMPROBANTE_ENCABEZADO WHERE ENCO_CONSEC = OLD.ENCO_CONSEC INTO :FECHA;
DIF_DB = - OLD.CODE_DEBITO;
DIF_CR = - OLD.CODE_CREDITO;
EXECUTE PROCEDURE ACTUALICE_SALDO_CENTRO_TERCERO(OLD.CUEN_COD, OLD.PROY_COD, OLD.CENT_COD, OLD.TERC_NIT, FECHA, DIF_DB, DIF_CR);
EXECUTE PROCEDURE ACTUALICE_SALDO_CENTRO(OLD.CUEN_COD, OLD.PROY_COD, OLD.CENT_COD, FECHA, DIF_DB, DIF_CR);
EXECUTE PROCEDURE ACTUALICE_SALDO_TERCERO(OLD.CUEN_COD, OLD.TERC_NIT, FECHA, DIF_DB, DIF_CR);
EXECUTE PROCEDURE ACTUALICE_SALDO_CUENTA(OLD.CUEN_COD, FECHA, DIF_DB, DIF_CR);
if (OLD.ARTI_COD IS NOT NULL) then
  BEGIN
  SELECT CUEN_TIPO FROM CUENTAS WHERE CUEN_COD = OLD.CUEN_COD INTO :TIPO;
  if (TIPO = 'I') then
    EXECUTE PROCEDURE ACTUALICE_SALDO_ARTICULO(OLD.CUEN_COD, OLD.ARTI_COD, FECHA, DIF_DB, DIF_CR);
  ELSE
    EXECUTE PROCEDURE actualice_saldo_activo(OLD.CUEN_COD, OLD.ARTI_COD, FECHA, DIF_DB, DIF_CR);
  END
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER TRIGGER COMPROBANTE_DETALLE_AI
AS
DECLARE VARIABLE FECHA CHAR(8);
declare variable TIPO CHAR(1);
BEGIN
SELECT ENCO_FECHA FROM COMPROBANTE_ENCABEZADO WHERE ENCO_CONSEC = NEW.ENCO_CONSEC INTO :FECHA;
/* ACTUALICE LOS SALDOS */
EXECUTE PROCEDURE ACTUALICE_SALDO_CUENTA(NEW.CUEN_COD, FECHA, NEW.CODE_DEBITO, NEW.CODE_CREDITO);
EXECUTE PROCEDURE ACTUALICE_SALDO_TERCERO(NEW.CUEN_COD, NEW.TERC_NIT, FECHA, NEW.CODE_DEBITO, NEW.CODE_CREDITO);
if (NEW.ARTI_COD IS NOT NULL) then
  BEGIN
  SELECT CUEN_TIPO FROM CUENTAS WHERE CUEN_COD = NEW.CUEN_COD INTO :TIPO;
  if (TIPO = 'I') then
    EXECUTE PROCEDURE ACTUALICE_SALDO_ARTICULO(NEW.CUEN_COD, NEW.ARTI_COD, FECHA, NEW.CODE_DEBITO, NEW.CODE_CREDITO);
  else
    if (TIPO = 'A') then
      EXECUTE PROCEDURE actualice_saldo_activo(NEW.CUEN_COD, NEW.ARTI_COD, FECHA, NEW.CODE_DEBITO, NEW.CODE_CREDITO);
  END
EXECUTE PROCEDURE ACTUALICE_SALDO_CENTRO(NEW.CUEN_COD, NEW.PROY_COD, NEW.CENT_COD, FECHA, NEW.CODE_DEBITO, NEW.CODE_CREDITO);
EXECUTE PROCEDURE ACTUALICE_SALDO_CENTRO_TERCERO(NEW.CUEN_COD, NEW.PROY_COD, NEW.CENT_COD, NEW.TERC_NIT, FECHA, NEW.CODE_DEBITO, NEW.CODE_CREDITO);
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER TRIGGER COMPROBANTE_DETALLE_AU
AS
DECLARE VARIABLE FECHA CHAR(8);
DECLARE VARIABLE DIF_DB NUMERIC(15,2);
DECLARE VARIABLE DIF_CR NUMERIC(15,2);
declare variable TIPO CHAR(1);
BEGIN
/* DESHAGA LO VIEJO */
SELECT ENCO_FECHA FROM COMPROBANTE_ENCABEZADO WHERE ENCO_CONSEC = NEW.ENCO_CONSEC INTO :FECHA;
DIF_DB = - OLD.CODE_DEBITO;
DIF_CR = - OLD.CODE_CREDITO;
EXECUTE PROCEDURE ACTUALICE_SALDO_CENTRO_TERCERO(OLD.CUEN_COD, OLD.PROY_COD, OLD.CENT_COD, OLD.TERC_NIT, FECHA, DIF_DB, DIF_CR);
EXECUTE PROCEDURE ACTUALICE_SALDO_CENTRO(OLD.CUEN_COD, OLD.PROY_COD, OLD.CENT_COD, FECHA, DIF_DB, DIF_CR);
EXECUTE PROCEDURE ACTUALICE_SALDO_TERCERO(OLD.CUEN_COD, OLD.TERC_NIT, FECHA, DIF_DB, DIF_CR);
EXECUTE PROCEDURE ACTUALICE_SALDO_CUENTA(OLD.CUEN_COD, FECHA, DIF_DB, DIF_CR);
if (OLD.ARTI_COD IS NOT NULL) then
  BEGIN
  SELECT CUEN_TIPO FROM CUENTAS WHERE CUEN_COD = NEW.CUEN_COD INTO :TIPO;
  if (TIPO = 'I') then
    EXECUTE PROCEDURE ACTUALICE_SALDO_ARTICULO(OLD.CUEN_COD, OLD.ARTI_COD, FECHA, DIF_DB, DIF_CR);
  ELSE
    EXECUTE PROCEDURE actualice_saldo_activo(OLD.CUEN_COD, OLD.ARTI_COD, FECHA, DIF_DB, DIF_CR);
  END
/* GRABE LOS NUEVOS */
EXECUTE PROCEDURE ACTUALICE_SALDO_CUENTA(NEW.CUEN_COD, FECHA, NEW.CODE_DEBITO, NEW.CODE_CREDITO);
EXECUTE PROCEDURE ACTUALICE_SALDO_TERCERO(NEW.CUEN_COD, NEW.TERC_NIT, FECHA, NEW.CODE_DEBITO, NEW.CODE_CREDITO);
EXECUTE PROCEDURE ACTUALICE_SALDO_CENTRO(NEW.CUEN_COD, NEW.PROY_COD, NEW.CENT_COD, FECHA, NEW.CODE_DEBITO, NEW.CODE_CREDITO);
EXECUTE PROCEDURE ACTUALICE_SALDO_CENTRO_TERCERO(NEW.CUEN_COD, NEW.PROY_COD, NEW.CENT_COD, NEW.TERC_NIT, FECHA, NEW.CODE_DEBITO, NEW.CODE_CREDITO);
if (NEW.ARTI_COD IS NOT NULL) then
  BEGIN
  SELECT CUEN_TIPO FROM CUENTAS WHERE CUEN_COD = NEW.CUEN_COD INTO :TIPO;
  if (TIPO = 'I') then
    EXECUTE PROCEDURE ACTUALICE_SALDO_ARTICULO(NEW.CUEN_COD, NEW.ARTI_COD, FECHA, NEW.code_debito, NEW.code_credito);
  ELSE
    EXECUTE PROCEDURE actualice_saldo_activo(NEW.CUEN_COD, NEW.ARTI_COD, FECHA, NEW.code_debito, NEW.code_credito);
  END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER PROCEDURE ACTUALICE_SALDO_CENTRO(
    CUENTA VARCHAR(20),
    PROY VARCHAR(4),
    CENTRO VARCHAR(4),
    FECHA CHAR(8),
    DEBITO NUMERIC(18,2),
    CREDITO NUMERIC(18,2))
AS
DECLARE VARIABLE SALDOA NUMERIC(18,2);
BEGIN
IF (:CENTRO <> '') THEN
    BEGIN
    /* Busque en saldos_centros la cuenta-centro y la fecha, si la encuentra actualice db y cr, si no inserte un registro */
    IF (EXISTS (SELECT * FROM SALDOS_CENTROS
        WHERE (CUEN_COD = :CUENTA) AND (PROY_COD = :PROY) AND (CENT_COD = :CENTRO) AND (SACU_FECHA = :FECHA))) THEN
      BEGIN
      UPDATE SALDOS_CENTROS
          SET SACE_DEBITO = SACE_DEBITO + :DEBITO,
            SACE_CREDITO = SACE_CREDITO + :CREDITO
          WHERE (CUEN_COD = :CUENTA) AND (PROY_COD = :PROY) AND (CENT_COD = :CENTRO) AND (SACU_FECHA = :FECHA);
      END
    ELSE
      BEGIN
        /*  traiga el saldo anterior y registre uno nuevo */
      EXECUTE PROCEDURE SALDO_CENTRO(:CUENTA, :PROY, :CENTRO, :FECHA) RETURNING_VALUES :SALDOA;
      INSERT INTO SALDOS_CENTROS(CUEN_COD, PROY_COD, CENT_COD, SACU_FECHA, SACE_SALDO, SACE_DEBITO, SACE_CREDITO)
        VALUES (:CUENTA, :PROY, :CENTRO, :FECHA, :SALDOA, :DEBITO, :CREDITO);
      END
    /* Actualice los saldos de fechas posteriores */
    UPDATE SALDOS_CENTROS
        SET SACE_SALDO = SACE_SALDO + :DEBITO - :CREDITO
        WHERE (CUEN_COD = :CUENTA) AND (PROY_COD = :PROY) AND (CENT_COD = :CENTRO) AND (SACU_FECHA > :FECHA);
    END
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE CHEQUEO_SALDOS_CONTA(
    FECINI CHAR(8),
    CTAINI VARCHAR(20),
    CTAFIN VARCHAR(20))
AS
declare variable CUENTA VARCHAR(20);
declare variable NIT VARCHAR(20);
declare variable PROY VARCHAR(4);
declare variable CENTRO VARCHAR(4);
declare variable ARTIC VARCHAR(15);
declare variable DEBITOS NUMERIC(15,2);
declare variable CREDITOS NUMERIC(15,2);
declare variable FECHA CHAR(8);
DECLARE VARIABLE ANO CHAR(4);
DECLARE VARIABLE MES CHAR(2);
DECLARE VARIABLE INICIAL CHAR(8);
DECLARE VARIABLE EXISTE CHAR(1);
declare variable CUENTAUX VARCHAR(20);
BEGIN /*$$IBE$$ 
DELETE FROM saldos_centros_TERCERO WHERE SACU_FECHA >= :FECINI AND CUEN_COD >= :CTAINI AND CUEN_COD <= :CTAFIN;
DELETE FROM saldos_centros WHERE SACU_FECHA >= :FECINI AND CUEN_COD >= :CTAINI AND CUEN_COD <= :CTAFIN;
DELETE FROM saldos_terceros WHERE SACU_FECHA >= :FECINI AND CUEN_COD >= :CTAINI AND CUEN_COD <= :CTAFIN;
DELETE FROM SALDOS_ARTICULO WHERE SAAR_FECHA >= :FECINI AND CUEN_COD >= :CTAINI AND CUEN_COD <= :CTAFIN;
DELETE FROM saldos_cuentas WHERE SACU_FECHA >= :FECINI AND CUEN_COD >= :CTAINI AND CUEN_COD <= :CTAFIN;
 $$IBE$$*/ /* BORRE LOS DB Y CR EN CERO */ /*$$IBE$$ 
UPDATE COMPROBANTE_DETALLE SET CODE_DEBITO = 0 WHERE CODE_DEBITO IS NULL;
UPDATE COMPROBANTE_DETALLE SET CODE_CREDITO = 0 WHERE CODE_CREDITO IS NULL;
 $$IBE$$*/ /* EMPIECE CON LOS SALDOS INICIALES */ /*$$IBE$$ 
EXECUTE PROCEDURE LEE_CONFIGURACION('CONTABILIDAD', 'GENERAL', 'AÑO DE INICIO') RETURNING_VALUES (ANO);
EXECUTE PROCEDURE LEE_CONFIGURACION('CONTABILIDAD', 'GENERAL', 'MES DE INICIO') RETURNING_VALUES (MES);
EXECUTE PROCEDURE compone_fecha_conta (ANO, MES, 1) returning_values (INICIAL);
if (FECINI <= INICIAL) then
    BEGIN
    FOR SELECT CUEN_COD, TERC_NIT, PROY_COD, CENT_COD, ARTI_COD, SAIN_DEBITO, SAIN_CREDITO FROM SALDOS_INICIALES INTO :CUENTA, :NIT, :PROY, :CENTRO, :ARTIC, :DEBITOS, :CREDITOS
        DO
        BEGIN
         $$IBE$$*/ /* Busque en saldos_cuentas la cuenta y la fecha, si la encuentra actualice INICIAL, si no inserte un registro */ /*$$IBE$$ 
        CUENTAUX = CUENTA;
        WHILE (CUENTAUX <> '') DO
            BEGIN
            EXISTE = 'N';
            SELECT 'S' FROM SALDOS_CUENTAS
                WHERE (CUEN_COD = :CUENTAUX) AND (SACU_FECHA = :INICIAL) INTO :EXISTE;
            IF (EXISTE = 'N') THEN
                BEGIN
                INSERT INTO SALDOS_CUENTAS(CUEN_COD, SACU_FECHA, SACU_SALDO, SACU_DEBITO, SACU_CREDITO)
                    VALUES (:CUENTAUX, :INICIAL, :DEBITOS-:CREDITOS, 0, 0);
                END
            ELSE
                BEGIN
                UPDATE SALDOS_CUENTAS
                    SET SACU_SALDO = SACU_SALDO + :DEBITOS - :CREDITOS
                    WHERE (CUEN_COD = :CUENTAUX) AND (SACU_FECHA = :INICIAL);
                END
            EXECUTE PROCEDURE PADRE(CUENTAUX) RETURNING_VALUES (CUENTAUX);
            END
    
         $$IBE$$*/ /* Busque en saldos_TERCEROS si la encuentra actualice INICIAL, si no inserte un registro */ /*$$IBE$$ 
        EXISTE = 'N';
        SELECT 'S' FROM SALDOS_TERCEROS
            WHERE (CUEN_COD = :CUENTA) AND (TERC_NIT = :NIT) AND (SACU_FECHA = :INICIAL) INTO :EXISTE;
        IF (EXISTE = 'N') THEN
            BEGIN
            INSERT INTO SALDOS_TERCEROS(CUEN_COD, TERC_NIT, SACU_FECHA, SATE_SALDO, SATE_DEBITO, SATE_CREDITO)
                VALUES (:CUENTA, :NIT, :INICIAL, :DEBITOS-:CREDITOS, 0, 0);
            END
        ELSE
            BEGIN
            UPDATE SALDOS_TERCEROS
                SET SATE_SALDO = SATE_SALDO + :DEBITOS - :CREDITOS
                WHERE (CUEN_COD = :CUENTA) AND (TERC_NIT = :NIT) AND (SACU_FECHA = :INICIAL);
            END
         $$IBE$$*/ /* Busque en saldos_CENTROS si la encuentra actualice INICIAL, si no inserte un registro */ /*$$IBE$$ 
        EXISTE = 'N';
        SELECT 'S' FROM SALDOS_CENTROS
            WHERE (CUEN_COD = :CUENTA) AND (PROY_COD = :PROY) AND (CENT_COD = :CENTRO) AND (SACU_FECHA = :INICIAL) INTO :EXISTE;
        IF (EXISTE = 'N') THEN
            BEGIN
            INSERT INTO SALDOS_CENTROS(CUEN_COD, PROY_COD, CENT_COD, SACU_FECHA, SACE_SALDO, SACE_DEBITO, SACE_CREDITO)
                VALUES (:CUENTA, :PROY, :CENTRO, :INICIAL, :DEBITOS-:CREDITOS, 0, 0);
            END
        ELSE
            BEGIN
            UPDATE SALDOS_CENTROS
                SET SACE_SALDO = SACE_SALDO + :DEBITOS - :CREDITOS
                WHERE (CUEN_COD = :CUENTA) AND (PROY_COD = :PROY) AND (CENT_COD = :CENTRO) AND (SACU_FECHA = :INICIAL);
            END
         $$IBE$$*/ /* Busque en saldos_CENTROS-TERCERO si la encuentra actualice INICIAL, si no inserte un registro */ /*$$IBE$$ 
        EXISTE = 'N';
        SELECT 'S' FROM SALDOS_CENTROS_TERCERO
            WHERE (CUEN_COD = :CUENTA) AND (PROY_COD = :PROY) AND (CENT_COD = :CENTRO) AND (TERC_NIT = :NIT) AND (SACU_FECHA = :INICIAL) INTO :EXISTE;
        IF (EXISTE = 'N') THEN
            BEGIN
            INSERT INTO SALDOS_CENTROS_TERCERO(CUEN_COD, PROY_COD, CENT_COD, TERC_NIT, SACU_FECHA, SACT_SALDO, SACT_DEBITO, SACT_CREDITO)
                VALUES (:CUENTA, :PROY, :CENTRO, :NIT, :INICIAL, :DEBITOS-:CREDITOS, 0, 0);
            END
        ELSE
            BEGIN
            UPDATE SALDOS_CENTROS_TERCERO
                SET SACT_SALDO = SACT_SALDO + :DEBITOS - :CREDITOS
                WHERE (CUEN_COD = :CUENTA) AND (PROY_COD = :PROY) AND (CENT_COD = :CENTRO) AND (TERC_NIT = :NIT) AND (SACU_FECHA = :INICIAL);
            END
         $$IBE$$*/ /* LOS DETALLADOS POR ARTICULO */ /*$$IBE$$ 
        if (ARTIC IS NOT NULL) then
            BEGIN
            EXISTE = 'N';
            SELECT 'S' FROM SALDOS_ARTICULO
                WHERE (CUEN_COD = :CUENTA) AND (ARTI_COD = :ARTIC) AND (SAAR_FECHA = :INICIAL) INTO :EXISTE;
            IF (EXISTE = 'N') THEN
                BEGIN
                INSERT INTO SALDOS_ARTICULO(CUEN_COD, ARTI_COD, SAAR_FECHA, SAAR_SALDO, SAAR_DEBITOS, SAAR_CREDITOS)
                    VALUES (:CUENTA, :ARTIC, :INICIAL, :DEBITOS-:CREDITOS, 0, 0);
                END
            ELSE
                BEGIN
                UPDATE SALDOS_ARTICULO
                    SET SAAR_SALDO = SAAR_SALDO + :DEBITOS - :CREDITOS
                    WHERE (CUEN_COD = :CUENTA) AND (ARTI_COD = :ARTIC) AND (SAAR_FECHA = :INICIAL);
                END
            END
        END
    END  $$IBE$$*/ /* SI DESDE EL INICIO */
/* AHORA LOS MOVIMIENTOS */ /*$$IBE$$ 
FOR SELECT CUEN_COD, TERC_NIT, PROY_COD, CENT_COD, ARTI_COD, CODE_DEBITO, CODE_CREDITO, ENCO_FECHA
    FROM COMPROBANTE_DETALLE d, COMPROBANTE_ENCABEZADO C WHERE C.ENCO_CONSEC = d.enco_consec AND ENCO_FECHA >= :FECINI
    ORDER BY ENCO_FECHA, CUEN_COD, TERC_NIT
    INTO :CUENTA, :NIT, :PROY, :CENTRO, :ARTIC, :DEBITOS, :CREDITOS, :FECHA
    DO
    BEGIN
    EXECUTE PROCEDURE ACTUALICE_SALDO_CUENTA(:CUENTA, FECHA, :DEBITOS, :CREDITOS);
    EXECUTE PROCEDURE ACTUALICE_SALDO_TERCERO(:CUENTA, :NIT, FECHA, :DEBITOS, :CREDITOS);
    EXECUTE PROCEDURE ACTUALICE_SALDO_CENTRO(:CUENTA, :PROY, :CENTRO, FECHA, :DEBITOS, :CREDITOS);
    EXECUTE PROCEDURE ACTUALICE_SALDO_CENTRO_TERCERO(:CUENTA, :PROY, :CENTRO, :NIT, FECHA, :DEBITOS, :CREDITOS);
    IF (ARTIC IS NOT NULL) THEN
        EXECUTE PROCEDURE ACTUALICE_SALDO_ARTICULO(:CUENTA, :ARTIC, :FECHA, :DEBITOS, :CREDITOS);
    END
 $$IBE$$*/ EXIT;
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE CHEQUEO_SALDOS_CONTA(
    FECINI CHAR(8),
    CTAINI VARCHAR(20),
    CTAFIN VARCHAR(20))
AS
declare variable CUENTA VARCHAR(20);
declare variable NIT VARCHAR(20);
declare variable PROY VARCHAR(4);
declare variable CENTRO VARCHAR(4);
declare variable ARTIC VARCHAR(15);
declare variable DEBITOS NUMERIC(15,2);
declare variable CREDITOS NUMERIC(15,2);
declare variable FECHA CHAR(8);
DECLARE VARIABLE ANO CHAR(4);
DECLARE VARIABLE MES CHAR(2);
DECLARE VARIABLE INICIAL CHAR(8);
DECLARE VARIABLE EXISTE CHAR(1);
declare variable CUENTAUX VARCHAR(20);
BEGIN
DELETE FROM saldos_centros_TERCERO WHERE SACU_FECHA >= :FECINI AND CUEN_COD >= :CTAINI AND CUEN_COD <= :CTAFIN;
DELETE FROM saldos_centros WHERE SACU_FECHA >= :FECINI AND CUEN_COD >= :CTAINI AND CUEN_COD <= :CTAFIN;
DELETE FROM saldos_terceros WHERE SACU_FECHA >= :FECINI AND CUEN_COD >= :CTAINI AND CUEN_COD <= :CTAFIN;
DELETE FROM SALDOS_ARTICULO WHERE SAAR_FECHA >= :FECINI AND CUEN_COD >= :CTAINI AND CUEN_COD <= :CTAFIN;
DELETE FROM saldos_cuentas WHERE SACU_FECHA >= :FECINI AND CUEN_COD >= :CTAINI AND CUEN_COD <= :CTAFIN;
/* BORRE LOS DB Y CR EN CERO */
UPDATE COMPROBANTE_DETALLE SET CODE_DEBITO = 0 WHERE CODE_DEBITO IS NULL;
UPDATE COMPROBANTE_DETALLE SET CODE_CREDITO = 0 WHERE CODE_CREDITO IS NULL;
/* EMPIECE CON LOS SALDOS INICIALES */
EXECUTE PROCEDURE LEE_CONFIGURACION('CONTABILIDAD', 'GENERAL', 'AÑO DE INICIO') RETURNING_VALUES (ANO);
EXECUTE PROCEDURE LEE_CONFIGURACION('CONTABILIDAD', 'GENERAL', 'MES DE INICIO') RETURNING_VALUES (MES);
EXECUTE PROCEDURE compone_fecha_conta (ANO, MES, 1) returning_values (INICIAL);
if (FECINI <= INICIAL) then
    BEGIN
    FOR SELECT CUEN_COD, TERC_NIT, PROY_COD, CENT_COD, ARTI_COD, SAIN_DEBITO, SAIN_CREDITO FROM SALDOS_INICIALES INTO :CUENTA, :NIT, :PROY, :CENTRO, :ARTIC, :DEBITOS, :CREDITOS
        DO
        BEGIN
        /* Busque en saldos_cuentas la cuenta y la fecha, si la encuentra actualice INICIAL, si no inserte un registro */
        CUENTAUX = CUENTA;
        WHILE (CUENTAUX <> '') DO
            BEGIN
            EXISTE = 'N';
            SELECT 'S' FROM SALDOS_CUENTAS
                WHERE (CUEN_COD = :CUENTAUX) AND (SACU_FECHA = :INICIAL) INTO :EXISTE;
            IF (EXISTE = 'N') THEN
                BEGIN
                INSERT INTO SALDOS_CUENTAS(CUEN_COD, SACU_FECHA, SACU_SALDO, SACU_DEBITO, SACU_CREDITO)
                    VALUES (:CUENTAUX, :INICIAL, :DEBITOS-:CREDITOS, 0, 0);
                END
            ELSE
                BEGIN
                UPDATE SALDOS_CUENTAS
                    SET SACU_SALDO = SACU_SALDO + :DEBITOS - :CREDITOS
                    WHERE (CUEN_COD = :CUENTAUX) AND (SACU_FECHA = :INICIAL);
                END
            EXECUTE PROCEDURE PADRE(CUENTAUX) RETURNING_VALUES (CUENTAUX);
            END
    
        /* Busque en saldos_TERCEROS si la encuentra actualice INICIAL, si no inserte un registro */
        EXISTE = 'N';
        SELECT 'S' FROM SALDOS_TERCEROS
            WHERE (CUEN_COD = :CUENTA) AND (TERC_NIT = :NIT) AND (SACU_FECHA = :INICIAL) INTO :EXISTE;
        IF (EXISTE = 'N') THEN
            BEGIN
            INSERT INTO SALDOS_TERCEROS(CUEN_COD, TERC_NIT, SACU_FECHA, SATE_SALDO, SATE_DEBITO, SATE_CREDITO)
                VALUES (:CUENTA, :NIT, :INICIAL, :DEBITOS-:CREDITOS, 0, 0);
            END
        ELSE
            BEGIN
            UPDATE SALDOS_TERCEROS
                SET SATE_SALDO = SATE_SALDO + :DEBITOS - :CREDITOS
                WHERE (CUEN_COD = :CUENTA) AND (TERC_NIT = :NIT) AND (SACU_FECHA = :INICIAL);
            END
        /* Busque en saldos_CENTROS si la encuentra actualice INICIAL, si no inserte un registro */
        EXISTE = 'N';
        SELECT 'S' FROM SALDOS_CENTROS
            WHERE (CUEN_COD = :CUENTA) AND (PROY_COD = :PROY) AND (CENT_COD = :CENTRO) AND (SACU_FECHA = :INICIAL) INTO :EXISTE;
        IF (EXISTE = 'N') THEN
            BEGIN
            INSERT INTO SALDOS_CENTROS(CUEN_COD, PROY_COD, CENT_COD, SACU_FECHA, SACE_SALDO, SACE_DEBITO, SACE_CREDITO)
                VALUES (:CUENTA, :PROY, :CENTRO, :INICIAL, :DEBITOS-:CREDITOS, 0, 0);
            END
        ELSE
            BEGIN
            UPDATE SALDOS_CENTROS
                SET SACE_SALDO = SACE_SALDO + :DEBITOS - :CREDITOS
                WHERE (CUEN_COD = :CUENTA) AND (PROY_COD = :PROY) AND (CENT_COD = :CENTRO) AND (SACU_FECHA = :INICIAL);
            END
        /* Busque en saldos_CENTROS-TERCERO si la encuentra actualice INICIAL, si no inserte un registro */
        EXISTE = 'N';
        SELECT 'S' FROM SALDOS_CENTROS_TERCERO
            WHERE (CUEN_COD = :CUENTA) AND (PROY_COD = :PROY) AND (CENT_COD = :CENTRO) AND (TERC_NIT = :NIT) AND (SACU_FECHA = :INICIAL) INTO :EXISTE;
        IF (EXISTE = 'N') THEN
            BEGIN
            INSERT INTO SALDOS_CENTROS_TERCERO(CUEN_COD, PROY_COD, CENT_COD, TERC_NIT, SACU_FECHA, SACT_SALDO, SACT_DEBITO, SACT_CREDITO)
                VALUES (:CUENTA, :PROY, :CENTRO, :NIT, :INICIAL, :DEBITOS-:CREDITOS, 0, 0);
            END
        ELSE
            BEGIN
            UPDATE SALDOS_CENTROS_TERCERO
                SET SACT_SALDO = SACT_SALDO + :DEBITOS - :CREDITOS
                WHERE (CUEN_COD = :CUENTA) AND (PROY_COD = :PROY) AND (CENT_COD = :CENTRO) AND (TERC_NIT = :NIT) AND (SACU_FECHA = :INICIAL);
            END
        /* LOS DETALLADOS POR ARTICULO */
        if (ARTIC IS NOT NULL) then
            BEGIN
            EXISTE = 'N';
            SELECT 'S' FROM SALDOS_ARTICULO
                WHERE (CUEN_COD = :CUENTA) AND (ARTI_COD = :ARTIC) AND (SAAR_FECHA = :INICIAL) INTO :EXISTE;
            IF (EXISTE = 'N') THEN
                BEGIN
                INSERT INTO SALDOS_ARTICULO(CUEN_COD, ARTI_COD, SAAR_FECHA, SAAR_SALDO, SAAR_DEBITOS, SAAR_CREDITOS)
                    VALUES (:CUENTA, :ARTIC, :INICIAL, :DEBITOS-:CREDITOS, 0, 0);
                END
            ELSE
                BEGIN
                UPDATE SALDOS_ARTICULO
                    SET SAAR_SALDO = SAAR_SALDO + :DEBITOS - :CREDITOS
                    WHERE (CUEN_COD = :CUENTA) AND (ARTI_COD = :ARTIC) AND (SAAR_FECHA = :INICIAL);
                END
            END
        END
    END /* SI DESDE EL INICIO */
/* AHORA LOS MOVIMIENTOS */
FOR SELECT CUEN_COD, TERC_NIT, PROY_COD, CENT_COD, ARTI_COD, CODE_DEBITO, CODE_CREDITO, ENCO_FECHA
    FROM COMPROBANTE_DETALLE d, COMPROBANTE_ENCABEZADO C WHERE C.ENCO_CONSEC = d.enco_consec AND ENCO_FECHA >= :FECINI
    ORDER BY ENCO_FECHA, CUEN_COD, TERC_NIT
    INTO :CUENTA, :NIT, :PROY, :CENTRO, :ARTIC, :DEBITOS, :CREDITOS, :FECHA
    DO
    BEGIN
    EXECUTE PROCEDURE ACTUALICE_SALDO_CUENTA(:CUENTA, FECHA, :DEBITOS, :CREDITOS);
    EXECUTE PROCEDURE ACTUALICE_SALDO_TERCERO(:CUENTA, :NIT, FECHA, :DEBITOS, :CREDITOS);
    EXECUTE PROCEDURE ACTUALICE_SALDO_CENTRO(:CUENTA, :PROY, :CENTRO, FECHA, :DEBITOS, :CREDITOS);
    EXECUTE PROCEDURE ACTUALICE_SALDO_CENTRO_TERCERO(:CUENTA, :PROY, :CENTRO, :NIT, FECHA, :DEBITOS, :CREDITOS);
    IF (ARTIC IS NOT NULL) THEN
        EXECUTE PROCEDURE ACTUALICE_SALDO_ARTICULO(:CUENTA, :ARTIC, :FECHA, :DEBITOS, :CREDITOS);
    END
END

^

SET TERM ; ^

SET TERM ^ ;

ALTER TRIGGER COMPROBANTE_DETALLE_AD
AS
DECLARE VARIABLE FECHA CHAR(8);
DECLARE VARIABLE DIF_DB NUMERIC(15,2);
DECLARE VARIABLE DIF_CR NUMERIC(15,2);
declare variable TIPO CHAR(1);
BEGIN
/* DESHAGA LO VIEJO */
SELECT ENCO_FECHA FROM COMPROBANTE_ENCABEZADO WHERE ENCO_CONSEC = OLD.ENCO_CONSEC INTO :FECHA;
DIF_DB = - OLD.CODE_DEBITO;
DIF_CR = - OLD.CODE_CREDITO;
EXECUTE PROCEDURE ACTUALICE_SALDO_CENTRO_TERCERO(OLD.CUEN_COD, OLD.PROY_COD, OLD.CENT_COD, OLD.TERC_NIT, FECHA, DIF_DB, DIF_CR);
EXECUTE PROCEDURE ACTUALICE_SALDO_CENTRO(OLD.CUEN_COD, OLD.PROY_COD, OLD.CENT_COD, FECHA, DIF_DB, DIF_CR);
EXECUTE PROCEDURE ACTUALICE_SALDO_TERCERO(OLD.CUEN_COD, OLD.TERC_NIT, FECHA, DIF_DB, DIF_CR);
EXECUTE PROCEDURE ACTUALICE_SALDO_CUENTA(OLD.CUEN_COD, FECHA, DIF_DB, DIF_CR);
if (OLD.ARTI_COD IS NOT NULL) then
  BEGIN
  SELECT CUEN_TIPO FROM CUENTAS WHERE CUEN_COD = OLD.CUEN_COD INTO :TIPO;
  if (TIPO = 'I') then
    EXECUTE PROCEDURE ACTUALICE_SALDO_ARTICULO(OLD.CUEN_COD, OLD.ARTI_COD, FECHA, DIF_DB, DIF_CR);
  ELSE
    EXECUTE PROCEDURE actualice_saldo_activo(OLD.CUEN_COD, OLD.ARTI_COD, FECHA, DIF_DB, DIF_CR);
  END
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER TRIGGER COMPROBANTE_DETALLE_AI
AS
DECLARE VARIABLE FECHA CHAR(8);
declare variable TIPO CHAR(1);
BEGIN
SELECT ENCO_FECHA FROM COMPROBANTE_ENCABEZADO WHERE ENCO_CONSEC = NEW.ENCO_CONSEC INTO :FECHA;
/* ACTUALICE LOS SALDOS */
EXECUTE PROCEDURE ACTUALICE_SALDO_CUENTA(NEW.CUEN_COD, FECHA, NEW.CODE_DEBITO, NEW.CODE_CREDITO);
EXECUTE PROCEDURE ACTUALICE_SALDO_TERCERO(NEW.CUEN_COD, NEW.TERC_NIT, FECHA, NEW.CODE_DEBITO, NEW.CODE_CREDITO);
if (NEW.ARTI_COD IS NOT NULL) then
  BEGIN
  SELECT CUEN_TIPO FROM CUENTAS WHERE CUEN_COD = NEW.CUEN_COD INTO :TIPO;
  if (TIPO = 'I') then
    EXECUTE PROCEDURE ACTUALICE_SALDO_ARTICULO(NEW.CUEN_COD, NEW.ARTI_COD, FECHA, NEW.CODE_DEBITO, NEW.CODE_CREDITO);
  else
    if (TIPO = 'A') then
      EXECUTE PROCEDURE actualice_saldo_activo(NEW.CUEN_COD, NEW.ARTI_COD, FECHA, NEW.CODE_DEBITO, NEW.CODE_CREDITO);
  END
EXECUTE PROCEDURE ACTUALICE_SALDO_CENTRO(NEW.CUEN_COD, NEW.PROY_COD, NEW.CENT_COD, FECHA, NEW.CODE_DEBITO, NEW.CODE_CREDITO);
EXECUTE PROCEDURE ACTUALICE_SALDO_CENTRO_TERCERO(NEW.CUEN_COD, NEW.PROY_COD, NEW.CENT_COD, NEW.TERC_NIT, FECHA, NEW.CODE_DEBITO, NEW.CODE_CREDITO);
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER TRIGGER COMPROBANTE_DETALLE_AU
AS
DECLARE VARIABLE FECHA CHAR(8);
DECLARE VARIABLE DIF_DB NUMERIC(15,2);
DECLARE VARIABLE DIF_CR NUMERIC(15,2);
declare variable TIPO CHAR(1);
BEGIN
/* DESHAGA LO VIEJO */
SELECT ENCO_FECHA FROM COMPROBANTE_ENCABEZADO WHERE ENCO_CONSEC = NEW.ENCO_CONSEC INTO :FECHA;
DIF_DB = - OLD.CODE_DEBITO;
DIF_CR = - OLD.CODE_CREDITO;
EXECUTE PROCEDURE ACTUALICE_SALDO_CENTRO_TERCERO(OLD.CUEN_COD, OLD.PROY_COD, OLD.CENT_COD, OLD.TERC_NIT, FECHA, DIF_DB, DIF_CR);
EXECUTE PROCEDURE ACTUALICE_SALDO_CENTRO(OLD.CUEN_COD, OLD.PROY_COD, OLD.CENT_COD, FECHA, DIF_DB, DIF_CR);
EXECUTE PROCEDURE ACTUALICE_SALDO_TERCERO(OLD.CUEN_COD, OLD.TERC_NIT, FECHA, DIF_DB, DIF_CR);
EXECUTE PROCEDURE ACTUALICE_SALDO_CUENTA(OLD.CUEN_COD, FECHA, DIF_DB, DIF_CR);
if (OLD.ARTI_COD IS NOT NULL) then
  BEGIN
  SELECT CUEN_TIPO FROM CUENTAS WHERE CUEN_COD = NEW.CUEN_COD INTO :TIPO;
  if (TIPO = 'I') then
    EXECUTE PROCEDURE ACTUALICE_SALDO_ARTICULO(OLD.CUEN_COD, OLD.ARTI_COD, FECHA, DIF_DB, DIF_CR);
  ELSE
    EXECUTE PROCEDURE actualice_saldo_activo(OLD.CUEN_COD, OLD.ARTI_COD, FECHA, DIF_DB, DIF_CR);
  END
/* GRABE LOS NUEVOS */
EXECUTE PROCEDURE ACTUALICE_SALDO_CUENTA(NEW.CUEN_COD, FECHA, NEW.CODE_DEBITO, NEW.CODE_CREDITO);
EXECUTE PROCEDURE ACTUALICE_SALDO_TERCERO(NEW.CUEN_COD, NEW.TERC_NIT, FECHA, NEW.CODE_DEBITO, NEW.CODE_CREDITO);
EXECUTE PROCEDURE ACTUALICE_SALDO_CENTRO(NEW.CUEN_COD, NEW.PROY_COD, NEW.CENT_COD, FECHA, NEW.CODE_DEBITO, NEW.CODE_CREDITO);
EXECUTE PROCEDURE ACTUALICE_SALDO_CENTRO_TERCERO(NEW.CUEN_COD, NEW.PROY_COD, NEW.CENT_COD, NEW.TERC_NIT, FECHA, NEW.CODE_DEBITO, NEW.CODE_CREDITO);
if (NEW.ARTI_COD IS NOT NULL) then
  BEGIN
  SELECT CUEN_TIPO FROM CUENTAS WHERE CUEN_COD = NEW.CUEN_COD INTO :TIPO;
  if (TIPO = 'I') then
    EXECUTE PROCEDURE ACTUALICE_SALDO_ARTICULO(NEW.CUEN_COD, NEW.ARTI_COD, FECHA, NEW.code_debito, NEW.code_credito);
  ELSE
    EXECUTE PROCEDURE actualice_saldo_activo(NEW.CUEN_COD, NEW.ARTI_COD, FECHA, NEW.code_debito, NEW.code_credito);
  END
END
^

SET TERM ; ^

SET TERM ^ ;

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

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE CHEQUEO_SALDOS_CONTA(
    FECINI CHAR(8),
    CTAINI VARCHAR(20),
    CTAFIN VARCHAR(20))
AS
declare variable CUENTA VARCHAR(20);
declare variable NIT VARCHAR(20);
declare variable PROY VARCHAR(4);
declare variable CENTRO VARCHAR(4);
declare variable ARTIC VARCHAR(15);
declare variable DEBITOS NUMERIC(15,2);
declare variable CREDITOS NUMERIC(15,2);
declare variable FECHA CHAR(8);
DECLARE VARIABLE ANO CHAR(4);
DECLARE VARIABLE MES CHAR(2);
DECLARE VARIABLE INICIAL CHAR(8);
DECLARE VARIABLE EXISTE CHAR(1);
declare variable CUENTAUX VARCHAR(20);
BEGIN /*$$IBE$$ 
DELETE FROM saldos_centros_TERCERO WHERE SACU_FECHA >= :FECINI AND CUEN_COD >= :CTAINI AND CUEN_COD <= :CTAFIN;
DELETE FROM saldos_centros WHERE SACU_FECHA >= :FECINI AND CUEN_COD >= :CTAINI AND CUEN_COD <= :CTAFIN;
DELETE FROM saldos_terceros WHERE SACU_FECHA >= :FECINI AND CUEN_COD >= :CTAINI AND CUEN_COD <= :CTAFIN;
DELETE FROM SALDOS_ARTICULO WHERE SAAR_FECHA >= :FECINI AND CUEN_COD >= :CTAINI AND CUEN_COD <= :CTAFIN;
DELETE FROM saldos_cuentas WHERE SACU_FECHA >= :FECINI AND CUEN_COD >= :CTAINI AND CUEN_COD <= :CTAFIN;
 $$IBE$$*/ /* BORRE LOS DB Y CR EN CERO */ /*$$IBE$$ 
UPDATE COMPROBANTE_DETALLE SET CODE_DEBITO = 0 WHERE CODE_DEBITO IS NULL;
UPDATE COMPROBANTE_DETALLE SET CODE_CREDITO = 0 WHERE CODE_CREDITO IS NULL;
 $$IBE$$*/ /* EMPIECE CON LOS SALDOS INICIALES */ /*$$IBE$$ 
EXECUTE PROCEDURE LEE_CONFIGURACION('CONTABILIDAD', 'GENERAL', 'AÑO DE INICIO') RETURNING_VALUES (ANO);
EXECUTE PROCEDURE LEE_CONFIGURACION('CONTABILIDAD', 'GENERAL', 'MES DE INICIO') RETURNING_VALUES (MES);
EXECUTE PROCEDURE compone_fecha_conta (ANO, MES, 1) returning_values (INICIAL);
if (FECINI <= INICIAL) then
    BEGIN
    FOR SELECT CUEN_COD, TERC_NIT, PROY_COD, CENT_COD, ARTI_COD, SAIN_DEBITO, SAIN_CREDITO FROM SALDOS_INICIALES INTO :CUENTA, :NIT, :PROY, :CENTRO, :ARTIC, :DEBITOS, :CREDITOS
        DO
        BEGIN
         $$IBE$$*/ /* Busque en saldos_cuentas la cuenta y la fecha, si la encuentra actualice INICIAL, si no inserte un registro */ /*$$IBE$$ 
        CUENTAUX = CUENTA;
        WHILE (CUENTAUX <> '') DO
            BEGIN
            EXISTE = 'N';
            SELECT 'S' FROM SALDOS_CUENTAS
                WHERE (CUEN_COD = :CUENTAUX) AND (SACU_FECHA = :INICIAL) INTO :EXISTE;
            IF (EXISTE = 'N') THEN
                BEGIN
                INSERT INTO SALDOS_CUENTAS(CUEN_COD, SACU_FECHA, SACU_SALDO, SACU_DEBITO, SACU_CREDITO)
                    VALUES (:CUENTAUX, :INICIAL, :DEBITOS-:CREDITOS, 0, 0);
                END
            ELSE
                BEGIN
                UPDATE SALDOS_CUENTAS
                    SET SACU_SALDO = SACU_SALDO + :DEBITOS - :CREDITOS
                    WHERE (CUEN_COD = :CUENTAUX) AND (SACU_FECHA = :INICIAL);
                END
            EXECUTE PROCEDURE PADRE(CUENTAUX) RETURNING_VALUES (CUENTAUX);
            END
    
         $$IBE$$*/ /* Busque en saldos_TERCEROS si la encuentra actualice INICIAL, si no inserte un registro */ /*$$IBE$$ 
        EXISTE = 'N';
        SELECT 'S' FROM SALDOS_TERCEROS
            WHERE (CUEN_COD = :CUENTA) AND (TERC_NIT = :NIT) AND (SACU_FECHA = :INICIAL) INTO :EXISTE;
        IF (EXISTE = 'N') THEN
            BEGIN
            INSERT INTO SALDOS_TERCEROS(CUEN_COD, TERC_NIT, SACU_FECHA, SATE_SALDO, SATE_DEBITO, SATE_CREDITO)
                VALUES (:CUENTA, :NIT, :INICIAL, :DEBITOS-:CREDITOS, 0, 0);
            END
        ELSE
            BEGIN
            UPDATE SALDOS_TERCEROS
                SET SATE_SALDO = SATE_SALDO + :DEBITOS - :CREDITOS
                WHERE (CUEN_COD = :CUENTA) AND (TERC_NIT = :NIT) AND (SACU_FECHA = :INICIAL);
            END
         $$IBE$$*/ /* Busque en saldos_CENTROS si la encuentra actualice INICIAL, si no inserte un registro */ /*$$IBE$$ 
        EXISTE = 'N';
        SELECT 'S' FROM SALDOS_CENTROS
            WHERE (CUEN_COD = :CUENTA) AND (PROY_COD = :PROY) AND (CENT_COD = :CENTRO) AND (SACU_FECHA = :INICIAL) INTO :EXISTE;
        IF (EXISTE = 'N') THEN
            BEGIN
            INSERT INTO SALDOS_CENTROS(CUEN_COD, PROY_COD, CENT_COD, SACU_FECHA, SACE_SALDO, SACE_DEBITO, SACE_CREDITO)
                VALUES (:CUENTA, :PROY, :CENTRO, :INICIAL, :DEBITOS-:CREDITOS, 0, 0);
            END
        ELSE
            BEGIN
            UPDATE SALDOS_CENTROS
                SET SACE_SALDO = SACE_SALDO + :DEBITOS - :CREDITOS
                WHERE (CUEN_COD = :CUENTA) AND (PROY_COD = :PROY) AND (CENT_COD = :CENTRO) AND (SACU_FECHA = :INICIAL);
            END
         $$IBE$$*/ /* Busque en saldos_CENTROS-TERCERO si la encuentra actualice INICIAL, si no inserte un registro */ /*$$IBE$$ 
        EXISTE = 'N';
        SELECT 'S' FROM SALDOS_CENTROS_TERCERO
            WHERE (CUEN_COD = :CUENTA) AND (PROY_COD = :PROY) AND (CENT_COD = :CENTRO) AND (TERC_NIT = :NIT) AND (SACU_FECHA = :INICIAL) INTO :EXISTE;
        IF (EXISTE = 'N') THEN
            BEGIN
            INSERT INTO SALDOS_CENTROS_TERCERO(CUEN_COD, PROY_COD, CENT_COD, TERC_NIT, SACU_FECHA, SACT_SALDO, SACT_DEBITO, SACT_CREDITO)
                VALUES (:CUENTA, :PROY, :CENTRO, :NIT, :INICIAL, :DEBITOS-:CREDITOS, 0, 0);
            END
        ELSE
            BEGIN
            UPDATE SALDOS_CENTROS_TERCERO
                SET SACT_SALDO = SACT_SALDO + :DEBITOS - :CREDITOS
                WHERE (CUEN_COD = :CUENTA) AND (PROY_COD = :PROY) AND (CENT_COD = :CENTRO) AND (TERC_NIT = :NIT) AND (SACU_FECHA = :INICIAL);
            END
         $$IBE$$*/ /* LOS DETALLADOS POR ARTICULO */ /*$$IBE$$ 
        if (ARTIC IS NOT NULL) then
            BEGIN
            EXISTE = 'N';
            SELECT 'S' FROM SALDOS_ARTICULO
                WHERE (CUEN_COD = :CUENTA) AND (ARTI_COD = :ARTIC) AND (SAAR_FECHA = :INICIAL) INTO :EXISTE;
            IF (EXISTE = 'N') THEN
                BEGIN
                INSERT INTO SALDOS_ARTICULO(CUEN_COD, ARTI_COD, SAAR_FECHA, SAAR_SALDO, SAAR_DEBITOS, SAAR_CREDITOS)
                    VALUES (:CUENTA, :ARTIC, :INICIAL, :DEBITOS-:CREDITOS, 0, 0);
                END
            ELSE
                BEGIN
                UPDATE SALDOS_ARTICULO
                    SET SAAR_SALDO = SAAR_SALDO + :DEBITOS - :CREDITOS
                    WHERE (CUEN_COD = :CUENTA) AND (ARTI_COD = :ARTIC) AND (SAAR_FECHA = :INICIAL);
                END
            END
        END
    END  $$IBE$$*/ /* SI DESDE EL INICIO */
/* AHORA LOS MOVIMIENTOS */ /*$$IBE$$ 
FOR SELECT CUEN_COD, TERC_NIT, PROY_COD, CENT_COD, ARTI_COD, CODE_DEBITO, CODE_CREDITO, ENCO_FECHA
    FROM COMPROBANTE_DETALLE d, COMPROBANTE_ENCABEZADO C WHERE C.ENCO_CONSEC = d.enco_consec AND ENCO_FECHA >= :FECINI
    ORDER BY ENCO_FECHA, CUEN_COD, TERC_NIT
    INTO :CUENTA, :NIT, :PROY, :CENTRO, :ARTIC, :DEBITOS, :CREDITOS, :FECHA
    DO
    BEGIN
    EXECUTE PROCEDURE ACTUALICE_SALDO_CUENTA(:CUENTA, FECHA, :DEBITOS, :CREDITOS);
    EXECUTE PROCEDURE ACTUALICE_SALDO_TERCERO(:CUENTA, :NIT, FECHA, :DEBITOS, :CREDITOS);
    EXECUTE PROCEDURE ACTUALICE_SALDO_CENTRO(:CUENTA, :PROY, :CENTRO, FECHA, :DEBITOS, :CREDITOS);
    EXECUTE PROCEDURE ACTUALICE_SALDO_CENTRO_TERCERO(:CUENTA, :PROY, :CENTRO, :NIT, FECHA, :DEBITOS, :CREDITOS);
    IF (ARTIC IS NOT NULL) THEN
        EXECUTE PROCEDURE ACTUALICE_SALDO_ARTICULO(:CUENTA, :ARTIC, :FECHA, :DEBITOS, :CREDITOS);
    END
 $$IBE$$*/ EXIT;
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE CHEQUEO_SALDOS_CONTA(
    FECINI CHAR(8),
    CTAINI VARCHAR(20),
    CTAFIN VARCHAR(20))
AS
declare variable CUENTA VARCHAR(20);
declare variable NIT VARCHAR(20);
declare variable PROY VARCHAR(4);
declare variable CENTRO VARCHAR(4);
declare variable ARTIC VARCHAR(15);
declare variable DEBITOS NUMERIC(15,2);
declare variable CREDITOS NUMERIC(15,2);
declare variable FECHA CHAR(8);
DECLARE VARIABLE ANO CHAR(4);
DECLARE VARIABLE MES CHAR(2);
DECLARE VARIABLE INICIAL CHAR(8);
DECLARE VARIABLE EXISTE CHAR(1);
declare variable CUENTAUX VARCHAR(20);
BEGIN
DELETE FROM saldos_centros_TERCERO WHERE SACU_FECHA >= :FECINI AND CUEN_COD >= :CTAINI AND CUEN_COD <= :CTAFIN;
DELETE FROM saldos_centros WHERE SACU_FECHA >= :FECINI AND CUEN_COD >= :CTAINI AND CUEN_COD <= :CTAFIN;
DELETE FROM saldos_terceros WHERE SACU_FECHA >= :FECINI AND CUEN_COD >= :CTAINI AND CUEN_COD <= :CTAFIN;
DELETE FROM SALDOS_ARTICULO WHERE SAAR_FECHA >= :FECINI AND CUEN_COD >= :CTAINI AND CUEN_COD <= :CTAFIN;
DELETE FROM saldos_cuentas WHERE SACU_FECHA >= :FECINI AND CUEN_COD >= :CTAINI AND CUEN_COD <= :CTAFIN;
/* BORRE LOS DB Y CR EN CERO */
UPDATE COMPROBANTE_DETALLE SET CODE_DEBITO = 0 WHERE CODE_DEBITO IS NULL;
UPDATE COMPROBANTE_DETALLE SET CODE_CREDITO = 0 WHERE CODE_CREDITO IS NULL;
/* EMPIECE CON LOS SALDOS INICIALES */
EXECUTE PROCEDURE LEE_CONFIGURACION('CONTABILIDAD', 'GENERAL', 'AÑO DE INICIO') RETURNING_VALUES (ANO);
EXECUTE PROCEDURE LEE_CONFIGURACION('CONTABILIDAD', 'GENERAL', 'MES DE INICIO') RETURNING_VALUES (MES);
EXECUTE PROCEDURE compone_fecha_conta (ANO, MES, 1) returning_values (INICIAL);
if (FECINI <= INICIAL) then
    BEGIN
    FOR SELECT CUEN_COD, TERC_NIT, PROY_COD, CENT_COD, ARTI_COD, SAIN_DEBITO, SAIN_CREDITO FROM SALDOS_INICIALES INTO :CUENTA, :NIT, :PROY, :CENTRO, :ARTIC, :DEBITOS, :CREDITOS
        DO
        BEGIN
        /* Busque en saldos_cuentas la cuenta y la fecha, si la encuentra actualice INICIAL, si no inserte un registro */
        CUENTAUX = CUENTA;
        WHILE (CUENTAUX <> '') DO
            BEGIN
            EXISTE = 'N';
            SELECT 'S' FROM SALDOS_CUENTAS
                WHERE (CUEN_COD = :CUENTAUX) AND (SACU_FECHA = :INICIAL) INTO :EXISTE;
            IF (EXISTE = 'N') THEN
                BEGIN
                INSERT INTO SALDOS_CUENTAS(CUEN_COD, SACU_FECHA, SACU_SALDO, SACU_DEBITO, SACU_CREDITO)
                    VALUES (:CUENTAUX, :INICIAL, :DEBITOS-:CREDITOS, 0, 0);
                END
            ELSE
                BEGIN
                UPDATE SALDOS_CUENTAS
                    SET SACU_SALDO = SACU_SALDO + :DEBITOS - :CREDITOS
                    WHERE (CUEN_COD = :CUENTAUX) AND (SACU_FECHA = :INICIAL);
                END
            EXECUTE PROCEDURE PADRE(CUENTAUX) RETURNING_VALUES (CUENTAUX);
            END
    
        /* Busque en saldos_TERCEROS si la encuentra actualice INICIAL, si no inserte un registro */
        EXISTE = 'N';
        SELECT 'S' FROM SALDOS_TERCEROS
            WHERE (CUEN_COD = :CUENTA) AND (TERC_NIT = :NIT) AND (SACU_FECHA = :INICIAL) INTO :EXISTE;
        IF (EXISTE = 'N') THEN
            BEGIN
            INSERT INTO SALDOS_TERCEROS(CUEN_COD, TERC_NIT, SACU_FECHA, SATE_SALDO, SATE_DEBITO, SATE_CREDITO)
                VALUES (:CUENTA, :NIT, :INICIAL, :DEBITOS-:CREDITOS, 0, 0);
            END
        ELSE
            BEGIN
            UPDATE SALDOS_TERCEROS
                SET SATE_SALDO = SATE_SALDO + :DEBITOS - :CREDITOS
                WHERE (CUEN_COD = :CUENTA) AND (TERC_NIT = :NIT) AND (SACU_FECHA = :INICIAL);
            END
        /* Busque en saldos_CENTROS si la encuentra actualice INICIAL, si no inserte un registro */
        EXISTE = 'N';
        SELECT 'S' FROM SALDOS_CENTROS
            WHERE (CUEN_COD = :CUENTA) AND (PROY_COD = :PROY) AND (CENT_COD = :CENTRO) AND (SACU_FECHA = :INICIAL) INTO :EXISTE;
        IF (EXISTE = 'N') THEN
            BEGIN
            INSERT INTO SALDOS_CENTROS(CUEN_COD, PROY_COD, CENT_COD, SACU_FECHA, SACE_SALDO, SACE_DEBITO, SACE_CREDITO)
                VALUES (:CUENTA, :PROY, :CENTRO, :INICIAL, :DEBITOS-:CREDITOS, 0, 0);
            END
        ELSE
            BEGIN
            UPDATE SALDOS_CENTROS
                SET SACE_SALDO = SACE_SALDO + :DEBITOS - :CREDITOS
                WHERE (CUEN_COD = :CUENTA) AND (PROY_COD = :PROY) AND (CENT_COD = :CENTRO) AND (SACU_FECHA = :INICIAL);
            END
        /* Busque en saldos_CENTROS-TERCERO si la encuentra actualice INICIAL, si no inserte un registro */
        EXISTE = 'N';
        SELECT 'S' FROM SALDOS_CENTROS_TERCERO
            WHERE (CUEN_COD = :CUENTA) AND (PROY_COD = :PROY) AND (CENT_COD = :CENTRO) AND (TERC_NIT = :NIT) AND (SACU_FECHA = :INICIAL) INTO :EXISTE;
        IF (EXISTE = 'N') THEN
            BEGIN
            INSERT INTO SALDOS_CENTROS_TERCERO(CUEN_COD, PROY_COD, CENT_COD, TERC_NIT, SACU_FECHA, SACT_SALDO, SACT_DEBITO, SACT_CREDITO)
                VALUES (:CUENTA, :PROY, :CENTRO, :NIT, :INICIAL, :DEBITOS-:CREDITOS, 0, 0);
            END
        ELSE
            BEGIN
            UPDATE SALDOS_CENTROS_TERCERO
                SET SACT_SALDO = SACT_SALDO + :DEBITOS - :CREDITOS
                WHERE (CUEN_COD = :CUENTA) AND (PROY_COD = :PROY) AND (CENT_COD = :CENTRO) AND (TERC_NIT = :NIT) AND (SACU_FECHA = :INICIAL);
            END
        /* LOS DETALLADOS POR ARTICULO */
        if (ARTIC IS NOT NULL) then
            BEGIN
            EXISTE = 'N';
            SELECT 'S' FROM SALDOS_ARTICULO
                WHERE (CUEN_COD = :CUENTA) AND (ARTI_COD = :ARTIC) AND (SAAR_FECHA = :INICIAL) INTO :EXISTE;
            IF (EXISTE = 'N') THEN
                BEGIN
                INSERT INTO SALDOS_ARTICULO(CUEN_COD, ARTI_COD, SAAR_FECHA, SAAR_SALDO, SAAR_DEBITOS, SAAR_CREDITOS)
                    VALUES (:CUENTA, :ARTIC, :INICIAL, :DEBITOS-:CREDITOS, 0, 0);
                END
            ELSE
                BEGIN
                UPDATE SALDOS_ARTICULO
                    SET SAAR_SALDO = SAAR_SALDO + :DEBITOS - :CREDITOS
                    WHERE (CUEN_COD = :CUENTA) AND (ARTI_COD = :ARTIC) AND (SAAR_FECHA = :INICIAL);
                END
            END
        END
    END /* SI DESDE EL INICIO */
/* AHORA LOS MOVIMIENTOS */
FOR SELECT CUEN_COD, TERC_NIT, PROY_COD, CENT_COD, ARTI_COD, CODE_DEBITO, CODE_CREDITO, ENCO_FECHA
    FROM COMPROBANTE_DETALLE d, COMPROBANTE_ENCABEZADO C WHERE C.ENCO_CONSEC = d.enco_consec AND ENCO_FECHA >= :FECINI
    ORDER BY ENCO_FECHA, CUEN_COD, TERC_NIT
    INTO :CUENTA, :NIT, :PROY, :CENTRO, :ARTIC, :DEBITOS, :CREDITOS, :FECHA
    DO
    BEGIN
    EXECUTE PROCEDURE ACTUALICE_SALDO_CUENTA(:CUENTA, FECHA, :DEBITOS, :CREDITOS);
    EXECUTE PROCEDURE ACTUALICE_SALDO_TERCERO(:CUENTA, :NIT, FECHA, :DEBITOS, :CREDITOS);
    EXECUTE PROCEDURE ACTUALICE_SALDO_CENTRO(:CUENTA, :PROY, :CENTRO, FECHA, :DEBITOS, :CREDITOS);
    EXECUTE PROCEDURE ACTUALICE_SALDO_CENTRO_TERCERO(:CUENTA, :PROY, :CENTRO, :NIT, FECHA, :DEBITOS, :CREDITOS);
    IF (ARTIC IS NOT NULL) THEN
        EXECUTE PROCEDURE ACTUALICE_SALDO_ARTICULO(:CUENTA, :ARTIC, :FECHA, :DEBITOS, :CREDITOS);
    END
END

^

SET TERM ; ^

SET TERM ^ ;

ALTER TRIGGER COMPROBANTE_DETALLE_AD
AS
DECLARE VARIABLE FECHA CHAR(8);
DECLARE VARIABLE DIF_DB NUMERIC(15,2);
DECLARE VARIABLE DIF_CR NUMERIC(15,2);
declare variable TIPO CHAR(1);
BEGIN
/* DESHAGA LO VIEJO */
SELECT ENCO_FECHA FROM COMPROBANTE_ENCABEZADO WHERE ENCO_CONSEC = OLD.ENCO_CONSEC INTO :FECHA;
DIF_DB = - OLD.CODE_DEBITO;
DIF_CR = - OLD.CODE_CREDITO;
EXECUTE PROCEDURE ACTUALICE_SALDO_CENTRO_TERCERO(OLD.CUEN_COD, OLD.PROY_COD, OLD.CENT_COD, OLD.TERC_NIT, FECHA, DIF_DB, DIF_CR);
EXECUTE PROCEDURE ACTUALICE_SALDO_CENTRO(OLD.CUEN_COD, OLD.PROY_COD, OLD.CENT_COD, FECHA, DIF_DB, DIF_CR);
EXECUTE PROCEDURE ACTUALICE_SALDO_TERCERO(OLD.CUEN_COD, OLD.TERC_NIT, FECHA, DIF_DB, DIF_CR);
EXECUTE PROCEDURE ACTUALICE_SALDO_CUENTA(OLD.CUEN_COD, FECHA, DIF_DB, DIF_CR);
if (OLD.ARTI_COD IS NOT NULL) then
  BEGIN
  SELECT CUEN_TIPO FROM CUENTAS WHERE CUEN_COD = OLD.CUEN_COD INTO :TIPO;
  if (TIPO = 'I') then
    EXECUTE PROCEDURE ACTUALICE_SALDO_ARTICULO(OLD.CUEN_COD, OLD.ARTI_COD, FECHA, DIF_DB, DIF_CR);
  ELSE
    EXECUTE PROCEDURE actualice_saldo_activo(OLD.CUEN_COD, OLD.ARTI_COD, FECHA, DIF_DB, DIF_CR);
  END
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER TRIGGER COMPROBANTE_DETALLE_AI
AS
DECLARE VARIABLE FECHA CHAR(8);
declare variable TIPO CHAR(1);
BEGIN
SELECT ENCO_FECHA FROM COMPROBANTE_ENCABEZADO WHERE ENCO_CONSEC = NEW.ENCO_CONSEC INTO :FECHA;
/* ACTUALICE LOS SALDOS */
EXECUTE PROCEDURE ACTUALICE_SALDO_CUENTA(NEW.CUEN_COD, FECHA, NEW.CODE_DEBITO, NEW.CODE_CREDITO);
EXECUTE PROCEDURE ACTUALICE_SALDO_TERCERO(NEW.CUEN_COD, NEW.TERC_NIT, FECHA, NEW.CODE_DEBITO, NEW.CODE_CREDITO);
if (NEW.ARTI_COD IS NOT NULL) then
  BEGIN
  SELECT CUEN_TIPO FROM CUENTAS WHERE CUEN_COD = NEW.CUEN_COD INTO :TIPO;
  if (TIPO = 'I') then
    EXECUTE PROCEDURE ACTUALICE_SALDO_ARTICULO(NEW.CUEN_COD, NEW.ARTI_COD, FECHA, NEW.CODE_DEBITO, NEW.CODE_CREDITO);
  else
    if (TIPO = 'A') then
      EXECUTE PROCEDURE actualice_saldo_activo(NEW.CUEN_COD, NEW.ARTI_COD, FECHA, NEW.CODE_DEBITO, NEW.CODE_CREDITO);
  END
EXECUTE PROCEDURE ACTUALICE_SALDO_CENTRO(NEW.CUEN_COD, NEW.PROY_COD, NEW.CENT_COD, FECHA, NEW.CODE_DEBITO, NEW.CODE_CREDITO);
EXECUTE PROCEDURE ACTUALICE_SALDO_CENTRO_TERCERO(NEW.CUEN_COD, NEW.PROY_COD, NEW.CENT_COD, NEW.TERC_NIT, FECHA, NEW.CODE_DEBITO, NEW.CODE_CREDITO);
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER TRIGGER COMPROBANTE_DETALLE_AU
AS
DECLARE VARIABLE FECHA CHAR(8);
DECLARE VARIABLE DIF_DB NUMERIC(15,2);
DECLARE VARIABLE DIF_CR NUMERIC(15,2);
declare variable TIPO CHAR(1);
BEGIN
/* DESHAGA LO VIEJO */
SELECT ENCO_FECHA FROM COMPROBANTE_ENCABEZADO WHERE ENCO_CONSEC = NEW.ENCO_CONSEC INTO :FECHA;
DIF_DB = - OLD.CODE_DEBITO;
DIF_CR = - OLD.CODE_CREDITO;
EXECUTE PROCEDURE ACTUALICE_SALDO_CENTRO_TERCERO(OLD.CUEN_COD, OLD.PROY_COD, OLD.CENT_COD, OLD.TERC_NIT, FECHA, DIF_DB, DIF_CR);
EXECUTE PROCEDURE ACTUALICE_SALDO_CENTRO(OLD.CUEN_COD, OLD.PROY_COD, OLD.CENT_COD, FECHA, DIF_DB, DIF_CR);
EXECUTE PROCEDURE ACTUALICE_SALDO_TERCERO(OLD.CUEN_COD, OLD.TERC_NIT, FECHA, DIF_DB, DIF_CR);
EXECUTE PROCEDURE ACTUALICE_SALDO_CUENTA(OLD.CUEN_COD, FECHA, DIF_DB, DIF_CR);
if (OLD.ARTI_COD IS NOT NULL) then
  BEGIN
  SELECT CUEN_TIPO FROM CUENTAS WHERE CUEN_COD = NEW.CUEN_COD INTO :TIPO;
  if (TIPO = 'I') then
    EXECUTE PROCEDURE ACTUALICE_SALDO_ARTICULO(OLD.CUEN_COD, OLD.ARTI_COD, FECHA, DIF_DB, DIF_CR);
  ELSE
    EXECUTE PROCEDURE actualice_saldo_activo(OLD.CUEN_COD, OLD.ARTI_COD, FECHA, DIF_DB, DIF_CR);
  END
/* GRABE LOS NUEVOS */
EXECUTE PROCEDURE ACTUALICE_SALDO_CUENTA(NEW.CUEN_COD, FECHA, NEW.CODE_DEBITO, NEW.CODE_CREDITO);
EXECUTE PROCEDURE ACTUALICE_SALDO_TERCERO(NEW.CUEN_COD, NEW.TERC_NIT, FECHA, NEW.CODE_DEBITO, NEW.CODE_CREDITO);
EXECUTE PROCEDURE ACTUALICE_SALDO_CENTRO(NEW.CUEN_COD, NEW.PROY_COD, NEW.CENT_COD, FECHA, NEW.CODE_DEBITO, NEW.CODE_CREDITO);
EXECUTE PROCEDURE ACTUALICE_SALDO_CENTRO_TERCERO(NEW.CUEN_COD, NEW.PROY_COD, NEW.CENT_COD, NEW.TERC_NIT, FECHA, NEW.CODE_DEBITO, NEW.CODE_CREDITO);
if (NEW.ARTI_COD IS NOT NULL) then
  BEGIN
  SELECT CUEN_TIPO FROM CUENTAS WHERE CUEN_COD = NEW.CUEN_COD INTO :TIPO;
  if (TIPO = 'I') then
    EXECUTE PROCEDURE ACTUALICE_SALDO_ARTICULO(NEW.CUEN_COD, NEW.ARTI_COD, FECHA, NEW.code_debito, NEW.code_credito);
  ELSE
    EXECUTE PROCEDURE actualice_saldo_activo(NEW.CUEN_COD, NEW.ARTI_COD, FECHA, NEW.code_debito, NEW.code_credito);
  END
END
^

SET TERM ; ^


/* 20081211B UTILIDAD LEYENDO TABLA DE COSTOS Y NO CON COSTO_PROMEDIO AL FINAL O INICIO DEL RANGO DE FECHAS */

SET TERM ^ ;

CREATE OR ALTER PROCEDURE REP_UTILIDAD_VENDEDOR(
    TIPO INTEGER,
    DETALLE CHAR(1),
    VENINI VARCHAR(20),
    VENFIN VARCHAR(20),
    FECINI DATE,
    FECFIN DATE,
    ARTINI VARCHAR(15),
    ARTFIN VARCHAR(15),
    ORDEN CHAR(1),
    CEROS CHAR(1),
    SUBEMPRESA INTEGER)
RETURNS (
    CODVEND VARCHAR(20),
    NOMVEND VARCHAR(60),
    NOMTIPO VARCHAR(50),
    ARTICULO VARCHAR(15),
    DESCRIPCION VARCHAR(60),
    CODGRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    CODSUBG VARCHAR(3),
    NOMSUBG VARCHAR(30),
    CODMARC VARCHAR(3),
    NOMMARC VARCHAR(30),
    UNIDAD VARCHAR(8),
    CANTIDAD NUMERIC(18,4),
    BASE NUMERIC(18,2),
    IVA NUMERIC(18,2),
    CONSUMO NUMERIC(18,2),
    COSTO NUMERIC(18,2),
    UTILIDAD NUMERIC(18,4),
    PORC NUMERIC(9,2),
    TOTAL NUMERIC(18,2),
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    DTO NUMERIC(9,2))
AS
DECLARE VARIABLE COSTOUNIT NUMERIC(18,4);
DECLARE VARIABLE CODINI VARCHAR(15);
DECLARE VARIABLE CODFIN VARCHAR(15);
DECLARE VARIABLE DESINI VARCHAR(15);
DECLARE VARIABLE DESFIN VARCHAR(15);
declare variable UOM VARCHAR(20);
BEGIN
if (ORDEN = 'C') then
    BEGIN
    CODINI = ARTINI;
    CODFIN = ARTFIN;
    DESINI = '';
    DESFIN = 'zz';
    END
ELSE
    BEGIN
    DESINI = ARTINI;
    DESFIN = ARTFIN;
    CODINI = '';
    CODFIN = 'zz';
    END
  EXECUTE PROCEDURE lee_configuracion ('FACTURACION', 'ARTICULOS', 'SUGERIR PRECIOS CON PORCENTAJE DE MARGEN O UTILIDAD') returning_values (:UOM);
  SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = :TIPO INTO :NOMTIPO;
  FOR select VEND_COD, VEND_NOMBRE
    from VENDEDORES
    where VEND_COD >= :VENINI AND VEND_COD <= :VENFIN
    INTO :CODVEND, :NOMVEND
    DO  
    BEGIN
    if (DETALLE = 'N') then
        BEGIN
        if (BIN_AND(TIPO, 1) <> 0) then
            BEGIN
            SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 31 INTO :NOMTIPO;
            /* BORRA LA TABLA AUXILIAR */
            DELETE FROM reportes_aux WHERE REPA_ID = 4 AND REPA_USER = USER;
            FOR SELECT MAX(D.ARTI_COD), SUM(FADE_CANT * FADE_FACTOR), SUM(FACT_FACTOR*(FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO)),
                SUM(FACT_FACTOR*FADE_IVAMONTO), SUM(FACT_FACTOR*FADE_TOTAL), SUM(FADE_CONSUMO),
                MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD), SUM(COST_SALP)
                FROM FACTURAS_DETALLE D, FACTURAS F, PREFIJOS P, ARTICULO A, movimiento_articulo m, costos c
                WHERE F.FACT_ID = D.FACT_ID AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND VEND_COD = :CODVEND AND FACT_ANULADO = 'N'
                 AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) and substring(D.arti_cod from 1 FOR 2) <> '.t'
                 AND D.ARTI_COD = A.arti_cod AND A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN
                 AND F.fact_id = M.mvar_idref AND M.mvar_tipodoc = 31 AND M.mvar_item = D.fade_item AND M.mvar_cons = C.cost_idmov
                GROUP BY D.ARTI_COD
                INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :TOTAL, :CONSUMO,
                    :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :COSTO
                DO
                BEGIN
                SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                if (CANTIDAD IS NULL) then
                    CANTIDAD = 0;
                if (BASE IS NULL) then
                    BASE = 0;
                if (IVA IS NULL) then
                    IVA = 0;
                UTILIDAD = BASE - COSTO;
                if (UOM = 'UTILIDAD') then
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                else
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
                if (CEROS = 'S') then
                    begin
                    INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (4, USER, :ARTICULO);
                    SUSPEND;
                    end
                ELSE
                    if ((BASE <> 0) AND (CANTIDAD <> 0)) then
                        SUSPEND;
                END
            if (CEROS = 'S') then
                BEGIN
                COSTO = 0;
                UTILIDAD = 0;
                PORC = 0;
                /* agregue los articulos sin factura */
                FOR SELECT ARTI_COD, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN and
                    not exists (select REPA_ARTICULO FROM REPORTES_AUX WHERE REPA_ID = 4 AND REPA_USER = USER AND REPA_ARTICULO = a.arti_cod)
                    INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                    DO
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        if (BIN_AND(TIPO, 2) <> 0) then
            BEGIN
            SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 32 INTO :NOMTIPO;
            FOR SELECT MAX(D.ARTI_COD), SUM(RVDE_CANT * RVDE_FACTOR), SUM(RVDE_TOTAL-RVDE_IVAMONTO-RVDE_CONSUMO), SUM(RVDE_IVAMONTO), SUM(RVDE_TOTAL), SUM(RVDE_CONSUMO),
                MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD), SUM(COST_SALP)
                FROM REMISIONES_VENTA_DETALLE D, REMISIONES_VENTA R, PREFIJOS P, ARTICULO A, movimiento_articulo m, costos c
                WHERE R.REVT_ID = D.REVT_ID AND REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN AND VEND_COD = :CODVEND AND REVT_ANULADO = 'N'
                 AND P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = 32 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                 AND D.ARTI_COD = A.arti_cod AND A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN
                 AND r.revt_id = M.mvar_idref AND M.mvar_tipodoc = 32 AND M.mvar_item = D.rvde_item AND M.mvar_cons = C.cost_idmov
                GROUP BY D.ARTI_COD
                INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :TOTAL, :CONSUMO,
                    :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :COSTO
                DO
                BEGIN
                SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                if (CANTIDAD IS NULL) then
                    CANTIDAD = 0;
                if (BASE IS NULL) then
                    BASE = 0;
                if (IVA IS NULL) then
                    IVA = 0;
                UTILIDAD = BASE - COSTO;
                if (UOM = 'UTILIDAD') then
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                else
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
                if (CEROS = 'S') then
                    begin
                    INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (4, USER, :ARTICULO);
                    SUSPEND;
                    end
                ELSE
                    if ((BASE <> 0) AND (CANTIDAD <> 0)) then
                        SUSPEND;
                END
            if (CEROS = 'S') then
                BEGIN
                COSTO = 0;
                UTILIDAD = 0;
                PORC = 0;
                /* agregue los articulos sin factura */
                FOR SELECT ARTI_COD, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN and
                    not exists (select REPA_ARTICULO FROM REPORTES_AUX WHERE REPA_ID = 4 AND REPA_USER = USER AND REPA_ARTICULO = a.arti_cod)
                    INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                    DO
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        if (BIN_AND(TIPO, 4) <> 0) then
            BEGIN
            SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 33 INTO :NOMTIPO;
            FOR SELECT MAX(D.ARTI_COD), SUM(DVDE_CANT * DVDE_FACTOR), SUM(DEVT_FACTOR*(DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO)),
                SUM(DEVT_FACTOR*DVDE_IVAMONTO), SUM(DEVT_FACTOR*DVDE_TOTAL), SUM(DVDE_CONSUMO),
                MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD), SUM(COST_ENTP)
                FROM devoluciones_ventas_detalle D, DEVOLUCIONES_VENTAS V, PREFIJOS P, ARTICULO A, MOVIMIENTO_ARTICULO M, COSTOS C
                WHERE V.DEVT_ID = D.DEVT_ID AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND VEND_COD = :CODVEND AND DEVT_ANULADO = 'N'
                 AND P.PREF_PRE = V.PREF_PRE AND P.TIDO_COD = 33 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) and substring(D.arti_cod from 1 FOR 2) <> '.t'
                 AND D.ARTI_COD = A.arti_cod AND A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN
                 AND V.devt_id = M.mvar_idref AND M.mvar_tipodoc = 33 AND M.mvar_item = D.dvde_item AND M.mvar_cons = C.cost_idmov
                GROUP BY D.ARTI_COD
                INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :TOTAL, :CONSUMO,
                    :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :COSTO
                DO
                BEGIN
                SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                if (CANTIDAD IS NULL) then
                    CANTIDAD = 0;
                if (BASE IS NULL) then
                    BASE = 0;
                if (IVA IS NULL) then
                    IVA = 0;
                UTILIDAD = BASE - COSTO;
                if (UOM = 'UTILIDAD') then
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                else
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
                TOTAL = TOTAL * -1;
                IVA = IVA * -1;
                BASE = BASE * -1;
                CANTIDAD = CANTIDAD * -1;
                COSTO = COSTO * -1;
                UTILIDAD = UTILIDAD * -1;
                if (CEROS = 'S') then
                    begin
                    INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (4, USER, :ARTICULO);
                    SUSPEND;
                    end
                ELSE
                    if ((BASE <> 0) AND (CANTIDAD <> 0)) then
                        SUSPEND;
                END
            if (CEROS = 'S') then
                BEGIN
                COSTO = 0;
                UTILIDAD = 0;
                PORC = 0;
                /* agregue los articulos sin factura */
                FOR SELECT ARTI_COD, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN and
                    not exists (select REPA_ARTICULO FROM REPORTES_AUX WHERE REPA_ID = 4 AND REPA_USER = USER AND REPA_ARTICULO = a.arti_cod)
                    INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                    DO
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        if (BIN_AND(TIPO, 8) <> 0) then
            BEGIN
            SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 34 INTO :NOMTIPO;
            FOR SELECT MAX(ARTI_COD), SUM(PEDE_CANT * PEDE_FACTOR), SUM(PEDI_FACTOR*(PEDE_TOTAL-PEDE_IVAMONTO-PEDE_CONSUMO)),
                SUM(PEDI_FACTOR*PEDE_IVAMONTO), SUM(PEDI_FACTOR*PEDE_TOTAL), SUM(PEDE_CONSUMO)
                FROM PEDIDOS_DETALLE D, PEDIDOS P, PREFIJOS PR
                WHERE P.PEDI_ID = D.PEDI_ID AND PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND VEND_COD = :CODVEND AND PEDI_ANULADO = 'N'
                 AND PR.PREF_PRE = P.PREF_PRE AND P.TIDO_COD = 34 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                GROUP BY ARTI_COD
                INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :TOTAL, :CONSUMO
                DO
                BEGIN
                SELECT ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO WHERE ARTI_COD = :ARTICULO
                    INTO :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC;
                SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                EXECUTE PROCEDURE costo_promedio (:ARTICULO, :FECFIN) RETURNING_VALUES (:COSTOUNIT);
                if (CANTIDAD IS NULL) then
                    CANTIDAD = 0;
                if (BASE IS NULL) then
                    BASE = 0;
                if (IVA IS NULL) then
                    IVA = 0;
                COSTO = CANTIDAD * COSTOUNIT;
                UTILIDAD = BASE - COSTO;
                if (UOM = 'UTILIDAD') then
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                else
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
                if (CEROS = 'S') then
                    begin
                    INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (4, USER, :ARTICULO);
                    SUSPEND;
                    end
                ELSE
                    if ((BASE <> 0) AND (CANTIDAD <> 0)) then
                        SUSPEND;
                END
            if (CEROS = 'S') then
                BEGIN
                COSTO = 0;
                UTILIDAD = 0;
                PORC = 0;
                /* agregue los articulos sin factura */
                FOR SELECT ARTI_COD, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN and
                    not exists (select REPA_ARTICULO FROM REPORTES_AUX WHERE REPA_ID = 4 AND REPA_USER = USER AND REPA_ARTICULO = a.arti_cod)
                    INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                    DO
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        if (BIN_AND(TIPO, 16) <> 0) then
            BEGIN
            SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 35 INTO :NOMTIPO;
            FOR SELECT MAX(ARTI_COD), SUM(CTDE_CANT * CTDE_FACTOR), SUM(COTI_FACTOR*(CTDE_TOTAL-CTDE_IVAMONTO-CTDE_CONSUMO)),
                SUM(COTI_FACTOR*CTDE_IVAMONTO), SUM(COTI_FACTOR*CTDE_TOTAL), SUM(CTDE_CONSUMO)
                FROM COTIZACIONES_DETALLE D, COTIZACIONES C, PREFIJOS P
                WHERE C.COTI_ID = D.COTI_ID AND COTI_FECHA >= :FECINI AND COTI_FECHA <= :FECFIN AND VEND_COD = :CODVEND AND COTI_ANULADO = 'N'
                 AND P.PREF_PRE = C.PREF_PRE AND P.TIDO_COD = 35 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                GROUP BY ARTI_COD
                INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :TOTAL, :CONSUMO
                DO
                BEGIN
                SELECT ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO WHERE ARTI_COD = :ARTICULO
                    INTO :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC;
                SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                EXECUTE PROCEDURE costo_promedio (:ARTICULO, :FECFIN) RETURNING_VALUES (:COSTOUNIT);
                if (CANTIDAD IS NULL) then
                    CANTIDAD = 0;
                if (BASE IS NULL) then
                    BASE = 0;
                if (IVA IS NULL) then
                    IVA = 0;
                COSTO = CANTIDAD * COSTOUNIT;
                UTILIDAD = BASE - COSTO;
                if (UOM = 'UTILIDAD') then
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                else
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
                if (CEROS = 'S') then
                    begin
                    INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (4, USER, :ARTICULO);
                    SUSPEND;
                    end
                ELSE
                    if ((BASE <> 0) AND (CANTIDAD <> 0)) then
                        SUSPEND;
                END
            if (CEROS = 'S') then
                BEGIN
                COSTO = 0;
                UTILIDAD = 0;
                PORC = 0;
                /* agregue los articulos sin factura */
                FOR SELECT ARTI_COD, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN and
                    not exists (select REPA_ARTICULO FROM REPORTES_AUX WHERE REPA_ID = 4 AND REPA_USER = USER AND REPA_ARTICULO = a.arti_cod)
                    INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                    DO
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        END
    ELSE
        BEGIN
        if (BIN_AND(TIPO, 1) <> 0) then
            BEGIN
            SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 31 INTO :NOMTIPO;
            FOR SELECT F.PREF_PRE, FACT_NUMERO, FACT_FECHA, ARTI_COD, FADE_CANT * FADE_FACTOR, (FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO)*FACT_FACTOR,
                FADE_IVAMONTO*FACT_FACTOR, FADE_DTOPORC, FADE_TOTAL*FACT_FACTOR, FADE_CONSUMO
                FROM FACTURAS F, FACTURAS_DETALLE D, PREFIJOS P
                WHERE F.FACT_ID = D.FACT_ID AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND VEND_COD = :CODVEND AND FACT_ANULADO = 'N'
                 AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) and substring(D.arti_cod from 1 FOR 2) <> '.t'
                ORDER BY ARTI_COD, FACT_FECHA, F.FACT_ID, FADE_ITEM
                INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :DTO, :TOTAL, :CONSUMO
                DO
                BEGIN
                SELECT ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO WHERE ARTI_COD = :ARTICULO
                    INTO :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC;
                SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                EXECUTE PROCEDURE costo_promedio (:ARTICULO, :FECHA) RETURNING_VALUES (:COSTOUNIT);
                COSTO = COSTOUNIT * CANTIDAD;
                UTILIDAD = BASE - COSTO;
                if (UOM = 'UTILIDAD') then
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                else
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
                if (CEROS = 'S') then
                    INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (4, USER, :ARTICULO);
                SUSPEND;
                END
            if (CEROS = 'S') then
                BEGIN
                COSTO = 0;
                UTILIDAD = 0;
                PORC = 0;
                /* agregue los articulos sin factura */
                FOR SELECT ARTI_COD, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN and
                    not exists (select REPA_ARTICULO FROM REPORTES_AUX WHERE REPA_ID = 4 AND REPA_USER = USER AND REPA_ARTICULO = a.arti_cod)
                    INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                    DO
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        if (BIN_AND(TIPO, 2) <> 0) then
            BEGIN
            SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 32 INTO :NOMTIPO;
            FOR SELECT R.PREF_PRE, REVT_NUMERO, REVT_FECHA, ARTI_COD, RVDE_CANT * RVDE_FACTOR, (RVDE_TOTAL - RVDE_IVAMONTO), RVDE_IVAMONTO, RVDE_DTOPORC, RVDE_TOTAL, RVDE_CONSUMO
                FROM REMISIONES_VENTA R, REMISIONES_VENTA_DETALLE D, PREFIJOS P
                WHERE R.REVT_ID = D.REVT_ID AND REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN AND VEND_COD = :CODVEND AND REVT_ANULADO = 'N'
                 AND P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = 32 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) and substring(D.arti_cod from 1 FOR 2) <> '.t'
                ORDER BY ARTI_COD, REVT_FECHA, R.REVT_ID, RVDE_ITEM
                INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :DTO, :TOTAL, :CONSUMO
                DO
                BEGIN
                SELECT ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO WHERE ARTI_COD = :ARTICULO
                    INTO :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC;
                SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                EXECUTE PROCEDURE costo_promedio (:ARTICULO, :FECHA) RETURNING_VALUES (:COSTOUNIT);
                COSTO = COSTOUNIT * CANTIDAD;
                UTILIDAD = BASE - COSTO;
                if (UOM = 'UTILIDAD') then
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                else
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
                if (CEROS = 'S') then
                    INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (4, USER, :ARTICULO);
                SUSPEND;
                END
            if (CEROS = 'S') then
                BEGIN
                COSTO = 0;
                UTILIDAD = 0;
                PORC = 0;
                /* agregue los articulos sin factura */
                FOR SELECT ARTI_COD, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN and
                    not exists (select REPA_ARTICULO FROM REPORTES_AUX WHERE REPA_ID = 4 AND REPA_USER = USER AND REPA_ARTICULO = a.arti_cod)
                    INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                    DO
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        if (BIN_AND(TIPO, 4) <> 0) then
            BEGIN
            SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 33 INTO :NOMTIPO;
            FOR SELECT V.PREF_PRE, DEVT_NUMERO, DEVT_FECHA, ARTI_COD, DVDE_CANT * DVDE_FACTOR, (DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO)*DEVT_FACTOR,
                DVDE_IVAMONTO*DEVT_FACTOR, DVDE_DTOPORC, DVDE_TOTAL*DEVT_FACTOR, DVDE_CONSUMO
                FROM DEVOLUCIONES_VENTAS V, DEVOLUCIONES_VENTAS_DETALLE D, PREFIJOS P
                WHERE V.DEVT_ID = D.DEVT_ID AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND VEND_COD = :CODVEND AND DEVT_ANULADO = 'N'
                 AND P.PREF_PRE = V.PREF_PRE AND P.TIDO_COD = 33 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) and substring(D.arti_cod from 1 FOR 2) <> '.t'
                ORDER BY ARTI_COD, DEVT_FECHA, D.DEVT_ID, DVDE_ITEM
                INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :DTO, :TOTAL, :CONSUMO
                DO
                BEGIN
                SELECT ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO WHERE ARTI_COD = :ARTICULO
                    INTO :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC;
                SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                EXECUTE PROCEDURE costo_promedio (:ARTICULO, :FECHA) RETURNING_VALUES (:COSTOUNIT);
                COSTO = COSTOUNIT * CANTIDAD;
                UTILIDAD = BASE - COSTO;
                if (UOM = 'UTILIDAD') then
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                else
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
                TOTAL = TOTAL * -1;
                IVA = IVA * -1;
                BASE = BASE * -1;
                CANTIDAD = CANTIDAD * -1;
                COSTO = COSTO * -1;
                UTILIDAD = UTILIDAD * -1;
                if (CEROS = 'S') then
                    INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (4, USER, :ARTICULO);
                SUSPEND;
                END
            if (CEROS = 'S') then
                BEGIN
                COSTO = 0;
                UTILIDAD = 0;
                PORC = 0;
                /* agregue los articulos sin factura */
                FOR SELECT ARTI_COD, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN and
                    not exists (select REPA_ARTICULO FROM REPORTES_AUX WHERE REPA_ID = 4 AND REPA_USER = USER AND REPA_ARTICULO = a.arti_cod)
                    INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                    DO
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        if (BIN_AND(TIPO, 8) <> 0) then
            BEGIN
            SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 34 INTO :NOMTIPO;
            FOR SELECT P.PREF_PRE, PEDI_NUMERO, PEDI_FECHA, ARTI_COD, PEDE_CANT * PEDE_FACTOR, (PEDE_TOTAL-PEDE_IVAMONTO-PEDE_CONSUMO)*PEDI_FACTOR,
                PEDE_IVAMONTO*PEDI_FACTOR, PEDE_DTOPORC, PEDE_TOTAL*PEDI_FACTOR, PEDE_CONSUMO
                FROM PEDIDOS P, PEDIDOS_DETALLE D, PREFIJOS PR
                WHERE P.PEDI_ID = D.PEDI_ID AND PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND VEND_COD = :CODVEND AND PEDI_ANULADO = 'N'
                 AND P.PREF_PRE = PR.PREF_PRE AND P.TIDO_COD = 34 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                ORDER BY ARTI_COD, PEDI_FECHA, P.PEDI_ID, PEDE_ITEM
                INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :DTO, :TOTAL, :CONSUMO
                DO
                BEGIN
                SELECT ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO WHERE ARTI_COD = :ARTICULO
                    INTO :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC;
                SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                EXECUTE PROCEDURE costo_promedio (:ARTICULO, :FECHA) RETURNING_VALUES (:COSTOUNIT);
                COSTO = COSTOUNIT * CANTIDAD;
                UTILIDAD = BASE - COSTO;
                if (UOM = 'UTILIDAD') then
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                else
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
                if (CEROS = 'S') then
                    INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (4, USER, :ARTICULO);
                SUSPEND;
                END
            if (CEROS = 'S') then
                BEGIN
                COSTO = 0;
                UTILIDAD = 0;
                PORC = 0;
                /* agregue los articulos sin factura */
                FOR SELECT ARTI_COD, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN and
                    not exists (select REPA_ARTICULO FROM REPORTES_AUX WHERE REPA_ID = 4 AND REPA_USER = USER AND REPA_ARTICULO = a.arti_cod)
                    INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                    DO
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        if (BIN_AND(TIPO, 16) <> 0) then
            BEGIN
            SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 35 INTO :NOMTIPO;
            FOR SELECT C.PREF_PRE, COTI_NUMERO, COTI_FECHA, ARTI_COD, CTDE_CANT * CTDE_FACTOR, (CTDE_TOTAL-CTDE_IVAMONTO-CTDE_CONSUMO)*COTI_FACTOR,
                CTDE_IVAMONTO*COTI_FACTOR, CTDE_DTOPORC, CTDE_TOTAL*COTI_FACTOR, CTDE_CONSUMO
                FROM COTIZACIONES C, COTIZACIONES_DETALLE D, PREFIJOS P
                WHERE C.COTI_ID = D.COTI_ID AND ARTI_COD = :ARTICULO AND COTI_FECHA >= :FECINI AND COTI_FECHA <= :FECFIN AND VEND_COD = :CODVEND AND COTI_ANULADO = 'N'
                 AND P.PREF_PRE = C.PREF_PRE AND P.TIDO_COD = 35 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                ORDER BY COTI_FECHA, C.COTI_ID, CTDE_ITEM
                INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :DTO, :TOTAL, :CONSUMO
                DO
                BEGIN
                SELECT ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO WHERE ARTI_COD = :ARTICULO
                    INTO :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC;
                SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                EXECUTE PROCEDURE costo_promedio (:ARTICULO, :FECHA) RETURNING_VALUES (:COSTOUNIT);
                COSTO = COSTOUNIT * CANTIDAD;
                UTILIDAD = BASE - COSTO;
                if (UOM = 'UTILIDAD') then
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                else
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
                if (CEROS = 'S') then
                    INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (4, USER, :ARTICULO);
                SUSPEND;
                END
            if (CEROS = 'S') then
                BEGIN
                COSTO = 0;
                UTILIDAD = 0;
                PORC = 0;
                /* agregue los articulos sin factura */
                FOR SELECT ARTI_COD, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN and
                    not exists (select REPA_ARTICULO FROM REPORTES_AUX WHERE REPA_ID = 4 AND REPA_USER = USER AND REPA_ARTICULO = a.arti_cod)
                    INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                    DO
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        END
    END
END
^

SET TERM ; ^


SET TERM ^ ;

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

        FOR SELECT MAX(T.TERC_NIT), MAX(TERC_NOM), MAX(TERC_TEL), MAX(TERC_CIU), MAX(ZONA_COD), MAX(D.ARTI_COD), SUM(FADE_CANT * FADE_FACTOR), SUM(FACT_FACTOR*(FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO)),
            SUM(FACT_FACTOR*FADE_IVAMONTO), SUM(FACT_FACTOR*FADE_TOTAL),
            MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD), SUM(COST_SALP)
            FROM FACTURAS_DETALLE D, FACTURAS F, PREFIJOS P, terceros T, CLIENTES C, ARTICULO A, movimiento_articulo m, costos CO
            WHERE C.TERC_NIT = T.TERC_NIT AND TERC_CLIE = 'S' AND F.terc_nit = T.terc_nit AND T.TERC_NIT >= :TERINI AND T.TERC_NIT <= :TERFIN AND
            F.FACT_ID = D.FACT_ID AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND FACT_ANULADO = 'N'
            AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) and substring(D.arti_cod from 1 FOR 2) <> '.t'
            AND D.ARTI_COD = A.arti_cod AND A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN
            AND F.fact_id = M.mvar_idref AND M.mvar_tipodoc = 31 AND M.mvar_item = D.fade_item AND M.mvar_cons = CO.cost_idmov
            GROUP BY T.TERC_NIT, D.ARTI_COD
            INTO :NIT, :NOMBRE, :TELEFONO, :CIUDAD, :CODZONA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :TOTAL,
            :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :COSTO
            DO
            BEGIN
            SELECT ZONA_NOM FROM ZONAS WHERE ZONA_COD = :CODZONA INTO :NOMZONA;
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            if (CEROS = 'S') then
                INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (3, USER, :ARTICULO);
            SUSPEND;
            END /* FOR */
        if (CEROS = 'S') then
            BEGIN
            COSTO = 0;
            UTILIDAD = 0;
            PORC = 0;
            /* agregue los articulos sin factura */
            FOR SELECT ARTI_COD, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN
                INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                DO
                BEGIN
                SELECT COUNT(REPA_ARTICULO) FROM REPORTES_AUX WHERE REPA_ID = 3 AND REPA_USER = USER AND REPA_ARTICULO = :articulo INTO :numrows;
                if (numrows = 0) then
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        END
    if (BIN_AND(TIPO, 2) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 32 INTO :NOMTIPO;
        /* BORRA LA TABLA AUXILIAR */
        DELETE FROM reportes_aux WHERE REPA_ID = 3 AND REPA_USER = USER;

        FOR SELECT MAX(T.TERC_NIT), MAX(TERC_NOM), MAX(TERC_TEL), MAX(TERC_CIU), MAX(ZONA_COD), MAX(D.ARTI_COD), SUM(RVDE_CANT * RVDE_FACTOR), SUM(RVDE_TOTAL-RVDE_IVAMONTO-RVDE_CONSUMO), SUM(RVDE_IVAMONTO), SUM(RVDE_TOTAL),
            MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD), SUM(COST_SALP)
            FROM REMISIONES_VENTA_DETALLE D, REMISIONES_VENTA R, PREFIJOS P, terceros T, CLIENTES C, ARTICULO A, movimiento_articulo m, costos CO
            WHERE C.TERC_NIT = T.TERC_NIT AND TERC_CLIE = 'S' AND R.terc_nit = T.terc_nit AND T.TERC_NIT >= :TERINI AND T.TERC_NIT <= :TERFIN AND
            R.REVT_ID = D.REVT_ID AND REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN AND REVT_ANULADO = 'N'
            AND P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = 32 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            AND D.ARTI_COD = A.arti_cod AND A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN
            AND R.revt_id = M.mvar_idref AND M.mvar_tipodoc = 32 AND M.mvar_item = D.rvde_item AND M.mvar_cons = CO.cost_idmov
            GROUP BY T.TERC_NIT, D.ARTI_COD
            INTO :NIT, :NOMBRE, :TELEFONO, :CIUDAD, :CODZONA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :TOTAL,
                :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :COSTO
            DO
                BEGIN
                SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                if (CANTIDAD IS NULL) then
                    CANTIDAD = 0;
                if (BASE IS NULL) then
                    BASE = 0;
                if (IVA IS NULL) then
                    IVA = 0;
                UTILIDAD = BASE - COSTO;
                if (UOM = 'UTILIDAD') then
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                else
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            if (CEROS = 'S') then
                INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (3, USER, :ARTICULO);
            SUSPEND;
            END /* FOR */
        if (CEROS = 'S') then
            BEGIN
            COSTO = 0;
            UTILIDAD = 0;
            PORC = 0;
            /* agregue los articulos sin factura */
            FOR SELECT ARTI_COD, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN
                INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                DO
                BEGIN
                SELECT COUNT(REPA_ARTICULO) FROM REPORTES_AUX WHERE REPA_ID = 3 AND REPA_USER = USER AND REPA_ARTICULO = :articulo INTO :numrows;
                if (numrows = 0) then
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        END
    if (BIN_AND(TIPO, 4) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 33 INTO :NOMTIPO;
        /* BORRA LA TABLA AUXILIAR */
        DELETE FROM reportes_aux WHERE REPA_ID = 3 AND REPA_USER = USER;

        FOR SELECT MAX(T.TERC_NIT), MAX(TERC_NOM), MAX(TERC_TEL), MAX(TERC_CIU), MAX(ZONA_COD), MAX(D.ARTI_COD), SUM(DVDE_CANT * DVDE_FACTOR), SUM(DEVT_FACTOR*(DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO)),
            SUM(DEVT_FACTOR*DVDE_IVAMONTO), SUM(DEVT_FACTOR*DVDE_TOTAL),
            MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD), SUM(COST_ENTP)
            FROM devoluciones_ventas_detalle D, DEVOLUCIONES_VENTAS V, PREFIJOS P, terceros T, CLIENTES C, ARTICULO A, MOVIMIENTO_ARTICULO M, COSTOS CO
            WHERE C.TERC_NIT = T.TERC_NIT AND TERC_CLIE = 'S' AND V.terc_nit = T.terc_nit AND T.TERC_NIT >= :TERINI AND T.TERC_NIT <= :TERFIN AND
            V.DEVT_ID = D.DEVT_ID AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND DEVT_ANULADO = 'N'
            AND P.PREF_PRE = V.PREF_PRE AND P.TIDO_COD = 33 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) and substring(D.arti_cod from 1 FOR 2) <> '.t'
            AND D.ARTI_COD = A.arti_cod AND A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN
            AND V.devt_id = M.mvar_idref AND M.mvar_tipodoc = 33 AND M.mvar_item = D.dvde_item AND M.mvar_cons = CO.cost_idmov
            GROUP BY T.TERC_NIT, D.ARTI_COD
            INTO :NIT, :NOMBRE, :TELEFONO, :CIUDAD, :CODZONA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :TOTAL,
                :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :COSTO
            DO
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            TOTAL = TOTAL * -1;
            IVA = IVA * -1;
            BASE = BASE * -1;
            CANTIDAD = CANTIDAD * -1;
            COSTO = COSTO * -1;
            UTILIDAD = UTILIDAD * -1;
            if (CEROS = 'S') then
                INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (3, USER, :ARTICULO);
            SUSPEND;
            END /* FOR */
        if (CEROS = 'S') then
            BEGIN
            COSTO = 0;
            UTILIDAD = 0;
            PORC = 0;
            /* agregue los articulos sin factura */
            FOR SELECT ARTI_COD, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN
                INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                DO
                BEGIN
                SELECT COUNT(REPA_ARTICULO) FROM REPORTES_AUX WHERE REPA_ID = 3 AND REPA_USER = USER AND REPA_ARTICULO = :articulo INTO :numrows;
                if (numrows = 0) then
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        END
    if (BIN_AND(TIPO, 8) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 34 INTO :NOMTIPO;
        /* BORRA LA TABLA AUXILIAR */
        DELETE FROM reportes_aux WHERE REPA_ID = 3 AND REPA_USER = USER;

        FOR SELECT MAX(T.TERC_NIT), MAX(TERC_NOM), MAX(TERC_TEL), MAX(TERC_CIU), MAX(ZONA_COD), MAX(ARTI_COD), SUM(PEDE_CANT * PEDE_FACTOR), SUM(PEDI_FACTOR*(PEDE_TOTAL-PEDE_IVAMONTO-PEDE_CONSUMO)),
            SUM(PEDI_FACTOR*PEDE_IVAMONTO), SUM(PEDI_FACTOR*PEDE_TOTAL)
            FROM PEDIDOS_DETALLE D, PEDIDOS P, PREFIJOS PR, terceros T, CLIENTES C
            WHERE C.TERC_NIT = T.TERC_NIT AND TERC_CLIE = 'S' AND P.terc_nit = T.terc_nit AND T.TERC_NIT >= :TERINI AND T.TERC_NIT <= :TERFIN AND
            P.PEDI_ID = D.PEDI_ID AND PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND PEDI_ANULADO = 'N'
            AND PR.PREF_PRE = P.PREF_PRE AND P.TIDO_COD = 34 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY T.TERC_NIT, ARTI_COD
            INTO :NIT, :NOMBRE, :TELEFONO, :CIUDAD, :CODZONA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :TOTAL
            DO
            BEGIN
            SELECT ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                FROM ARTICULO WHERE ARTI_COD = :ARTICULO
                INTO :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC;
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            EXECUTE PROCEDURE costo_promedio (:ARTICULO, :FECFIN) RETURNING_VALUES (:COSTOUNIT);
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            COSTO = CANTIDAD * COSTOUNIT;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            if (CEROS = 'S') then
                INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (3, USER, :ARTICULO);
            SUSPEND;
            END /* FOR */
        if (CEROS = 'S') then
            BEGIN
            COSTO = 0;
            UTILIDAD = 0;
            PORC = 0;
            /* agregue los articulos sin factura */
            FOR SELECT ARTI_COD, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN
                INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                DO
                BEGIN
                SELECT COUNT(REPA_ARTICULO) FROM REPORTES_AUX WHERE REPA_ID = 3 AND REPA_USER = USER AND REPA_ARTICULO = :articulo INTO :numrows;
                if (numrows = 0) then
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        END
    if (BIN_AND(TIPO, 16) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 35 INTO :NOMTIPO;
        /* BORRA LA TABLA AUXILIAR */
        DELETE FROM reportes_aux WHERE REPA_ID = 3 AND REPA_USER = USER;

        FOR SELECT MAX(T.TERC_NIT), MAX(TERC_NOM), MAX(TERC_TEL), MAX(TERC_CIU), MAX(ZONA_COD), MAX(ARTI_COD), SUM(CTDE_CANT * CTDE_FACTOR), SUM(COTI_FACTOR*(CTDE_TOTAL-CTDE_IVAMONTO-CTDE_CONSUMO)),
            SUM(COTI_FACTOR*CTDE_IVAMONTO), SUM(COTI_FACTOR*CTDE_TOTAL)
            FROM COTIZACIONES_DETALLE D, COTIZACIONES CT, PREFIJOS P, terceros T, CLIENTES C
            WHERE C.TERC_NIT = T.TERC_NIT AND TERC_CLIE = 'S' AND C.terc_nit = T.terc_nit AND T.TERC_NIT >= :TERINI AND T.TERC_NIT <= :TERFIN AND
            CT.COTI_ID = D.COTI_ID AND COTI_FECHA >= :FECINI AND COTI_FECHA <= :FECFIN AND COTI_ANULADO = 'N'
            AND P.PREF_PRE = CT.PREF_PRE AND P.TIDO_COD = 35 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY T.TERC_NIT, ARTI_COD
            INTO :NIT, :NOMBRE, :TELEFONO, :CIUDAD, :CODZONA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :TOTAL
            DO
            BEGIN
            SELECT ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                FROM ARTICULO WHERE ARTI_COD = :ARTICULO
                INTO :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC;
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            EXECUTE PROCEDURE costo_promedio (:ARTICULO, :FECFIN) RETURNING_VALUES (:COSTOUNIT);
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            COSTO = CANTIDAD * COSTOUNIT;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            if (CEROS = 'S') then
                INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (3, USER, :ARTICULO);
            SUSPEND;
            END /* FOR */
        if (CEROS = 'S') then
            BEGIN
            COSTO = 0;
            UTILIDAD = 0;
            PORC = 0;
            /* agregue los articulos sin factura */
            FOR SELECT ARTI_COD, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN
                INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                DO
                BEGIN
                SELECT COUNT(REPA_ARTICULO) FROM REPORTES_AUX WHERE REPA_ID = 3 AND REPA_USER = USER AND REPA_ARTICULO = :articulo INTO :numrows;
                if (numrows = 0) then
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        END
    END
ELSE
    BEGIN
    if (BIN_AND(TIPO, 1) <> 0) then
            BEGIN
            SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 31 INTO :NOMTIPO;
            FOR SELECT F.PREF_PRE, FACT_NUMERO, FACT_FECHA, ARTI_COD, FADE_CANT * FADE_FACTOR, (FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO)*FACT_FACTOR,
                FADE_IVAMONTO*FACT_FACTOR, FADE_DTOPORC, FADE_TOTAL*FACT_FACTOR, F.terc_nit, F.fact_nomcliente
                FROM FACTURAS F, FACTURAS_DETALLE D, PREFIJOS P
                WHERE F.FACT_ID = D.FACT_ID AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND F.TERC_NIT >= :TERINI AND F.TERC_NIT <= :TERFIN AND FACT_ANULADO = 'N'
                 AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) and substring(D.arti_cod from 1 FOR 2) <> '.t'
                ORDER BY f.terc_nit, ARTI_COD, FACT_FECHA, F.FACT_ID, FADE_ITEM
                INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :DTO, :TOTAL, :NIT, :nombre
                DO
                BEGIN
                SELECT ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO WHERE ARTI_COD = :ARTICULO
                    INTO :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC;
                SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                EXECUTE PROCEDURE costo_promedio (:ARTICULO, :FECHA) RETURNING_VALUES (:COSTOUNIT);
                COSTO = COSTOUNIT * CANTIDAD;
                UTILIDAD = BASE - COSTO;
                if (UOM = 'UTILIDAD') then
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                else
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
                SUSPEND;
                END
            END
    if (BIN_AND(TIPO, 2) <> 0) then
            BEGIN
            SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 32 INTO :NOMTIPO;
            FOR SELECT R.PREF_PRE, REVT_NUMERO, REVT_FECHA, ARTI_COD, RVDE_CANT * RVDE_FACTOR,
                (RVDE_TOTAL - RVDE_IVAMONTO), RVDE_IVAMONTO, RVDE_DTOPORC, RVDE_TOTAL, R.terc_nit, R.revt_nomterc
                FROM REMISIONES_VENTA R, REMISIONES_VENTA_DETALLE D, PREFIJOS P
                WHERE R.REVT_ID = D.REVT_ID AND REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN AND R.TERC_NIT >= :TERINI AND R.TERC_NIT <= :TERFIN AND REVT_ANULADO = 'N'
                 AND P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = 32 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                ORDER BY r.terc_nit, ARTI_COD, REVT_FECHA, R.REVT_ID, RVDE_ITEM
                INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :DTO, :TOTAL, :NIT, :nombre
                DO
                BEGIN
                SELECT ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO WHERE ARTI_COD = :ARTICULO
                    INTO :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC;
                SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                EXECUTE PROCEDURE costo_promedio (:ARTICULO, :FECHA) RETURNING_VALUES (:COSTOUNIT);
                COSTO = COSTOUNIT * CANTIDAD;
                UTILIDAD = BASE - COSTO;
                if (UOM = 'UTILIDAD') then
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                else
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
                SUSPEND;
                END
            END
    if (BIN_AND(TIPO, 4) <> 0) then
            BEGIN
            SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 33 INTO :NOMTIPO;
            FOR SELECT V.PREF_PRE, DEVT_NUMERO, DEVT_FECHA, ARTI_COD, DVDE_CANT * DVDE_FACTOR, (DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO)*DEVT_FACTOR,
                DVDE_IVAMONTO*DEVT_FACTOR, DVDE_DTOPORC, DVDE_TOTAL*DEVT_FACTOR, V.terc_nit, V.devt_nomterc
                FROM DEVOLUCIONES_VENTAS V, DEVOLUCIONES_VENTAS_DETALLE D, PREFIJOS P
                WHERE V.DEVT_ID = D.DEVT_ID AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND V.TERC_NIT >= :TERINI AND V.TERC_NIT <= :TERFIN AND DEVT_ANULADO = 'N'
                 AND P.PREF_PRE = V.PREF_PRE AND P.TIDO_COD = 33 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))  and substring(D.arti_cod from 1 FOR 2) <> '.t'
                ORDER BY v.terc_nit, ARTI_COD, DEVT_FECHA, D.DEVT_ID, DVDE_ITEM
                INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :DTO, :TOTAL, :NIT, :nombre
                DO
                BEGIN
                SELECT ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO WHERE ARTI_COD = :ARTICULO
                    INTO :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC;
                SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                EXECUTE PROCEDURE costo_promedio (:ARTICULO, :FECHA) RETURNING_VALUES (:COSTOUNIT);
                COSTO = COSTOUNIT * CANTIDAD;
                UTILIDAD = BASE - COSTO;
                if (UOM = 'UTILIDAD') then
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                else
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
                TOTAL = TOTAL * -1;
                IVA = IVA * -1;
                BASE = BASE * -1;
                CANTIDAD = CANTIDAD * -1;
                COSTO = COSTO * -1;
                UTILIDAD = UTILIDAD * -1;
                SUSPEND;
                END
            END
    if (BIN_AND(TIPO, 8) <> 0) then
            BEGIN
            SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 34 INTO :NOMTIPO;
            FOR SELECT P.PREF_PRE, PEDI_NUMERO, PEDI_FECHA, ARTI_COD, PEDE_CANT * PEDE_FACTOR, (PEDE_TOTAL-PEDE_IVAMONTO-PEDE_CONSUMO)*PEDI_FACTOR,
                PEDE_IVAMONTO*PEDI_FACTOR, PEDE_DTOPORC, PEDE_TOTAL*PEDI_FACTOR, P.terc_nit, P.pedi_nomterc
                FROM PEDIDOS P, PEDIDOS_DETALLE D, PREFIJOS PR
                WHERE P.PEDI_ID = D.PEDI_ID AND PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND P.TERC_NIT >= :TERINI AND P.TERC_NIT <= :TERFIN AND PEDI_ANULADO = 'N'
                 AND P.PREF_PRE = PR.PREF_PRE AND P.TIDO_COD = 34 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                ORDER BY p.terc_nit, ARTI_COD, PEDI_FECHA, P.PEDI_ID, PEDE_ITEM
                INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :DTO, :TOTAL, :NIT, :nombre
                DO
                BEGIN
                SELECT ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO WHERE ARTI_COD = :ARTICULO
                    INTO :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC;
                SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                EXECUTE PROCEDURE costo_promedio (:ARTICULO, :FECHA) RETURNING_VALUES (:COSTOUNIT);
                COSTO = COSTOUNIT * CANTIDAD;
                UTILIDAD = BASE - COSTO;
                if (UOM = 'UTILIDAD') then
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                else
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
                SUSPEND;
                END
            END
    if (BIN_AND(TIPO, 16) <> 0) then
            BEGIN
            SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 35 INTO :NOMTIPO;
            FOR SELECT C.PREF_PRE, COTI_NUMERO, COTI_FECHA, ARTI_COD, CTDE_CANT * CTDE_FACTOR, (CTDE_TOTAL-CTDE_IVAMONTO-CTDE_CONSUMO)*COTI_FACTOR,
                CTDE_IVAMONTO*COTI_FACTOR, CTDE_DTOPORC, CTDE_TOTAL*COTI_FACTOR, C.terc_nit, C.coti_nomterc
                FROM COTIZACIONES C, COTIZACIONES_DETALLE D, PREFIJOS P
                WHERE C.COTI_ID = D.COTI_ID AND ARTI_COD = :ARTICULO AND COTI_FECHA >= :FECINI AND COTI_FECHA <= :FECFIN AND C.TERC_NIT >= :TERINI AND C.TERC_NIT <= :TERFIN AND COTI_ANULADO = 'N'
                 AND P.PREF_PRE = C.PREF_PRE AND P.TIDO_COD = 35 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                ORDER BY c.terc_nit, COTI_FECHA, C.COTI_ID, CTDE_ITEM
                INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :DTO, :TOTAL, :NIT, :nombre
                DO
                BEGIN
                SELECT ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO WHERE ARTI_COD = :ARTICULO
                    INTO :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC;
                SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                EXECUTE PROCEDURE costo_promedio (:ARTICULO, :FECHA) RETURNING_VALUES (:COSTOUNIT);
                COSTO = COSTOUNIT * CANTIDAD;
                UTILIDAD = BASE - COSTO;
                if (UOM = 'UTILIDAD') then
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                else
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
                SUSPEND;
                END
            END
    END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER PROCEDURE UTILIDAD_VENTAS(
    TIPO INTEGER,
    DETALLE CHAR(1),
    FECINI DATE,
    FECFIN DATE,
    PREFIJO VARCHAR(4),
    SUBEMPRESA INTEGER)
RETURNS (
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    PTVTID INTEGER,
    VENDCOD INTEGER,
    NIT VARCHAR(20),
    NOMTERCERO VARCHAR(60),
    ARTICULO VARCHAR(15),
    ARTIDES VARCHAR(60),
    CANT NUMERIC(18,4),
    UNIDAD VARCHAR(8),
    PRECIO NUMERIC(18,2),
    COSTO NUMERIC(18,2),
    UTILIDAD NUMERIC(18,2),
    PORC NUMERIC(9,2))
AS
declare variable IMPTOS CHAR(1);
declare variable ID INTEGER;
declare variable IVA NUMERIC(18,2);
declare variable COSTOT NUMERIC(18,2);
declare variable PRECIOT NUMERIC(18,2);
declare variable UOM VARCHAR(20);
BEGIN
EXECUTE PROCEDURE lee_configuracion ('FACTURACION', 'ARTICULOS', 'SUGERIR PRECIOS CON PORCENTAJE DE MARGEN O UTILIDAD') returning_values (:UOM);
/* DETERMINE LA TABLA A EXAMINAR */
if (TIPO = 31) then
    BEGIN
    /* FACTURA */
    FOR SELECT FACT_ID, F.PREF_PRE, FACT_NUMERO, FACT_FECHA, PTVT_ID, VEND_COD, TERC_NIT, FACT_NOMCLIENTE, FACT_IVAINC
        FROM FACTURAS F, PREFIJOS P
        WHERE FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND FACT_ANULADO = 'N'
         AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = :TIPO AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
        ORDER BY FACT_FECHA, F.PREF_PRE, FACT_NUMERO
        INTO :ID, :PREF, :NUMERO, :FECHA, :PTVTID, :VENDCOD, :NIT, :NOMTERCERO, :IMPTOS
        DO
        if ((PREFIJO = '') or (PREFIJO = PREF)) then
          BEGIN
          COSTOT = 0;
          PRECIOT = 0;
          FOR SELECT D.ARTI_COD, SUBSTR(FADE_DESC,1,60), FADE_CANT * FADE_FACTOR, FADE_UNIDAD, (FADE_PRUNIT - FADE_DTOMONTO) / FADE_FACTOR, FADE_IVAMONTO, COST_SALP
            FROM FACTURAS_DETALLE D, MOVIMIENTO_ARTICULO M, COSTOS C
            WHERE FACT_ID = :ID and substring(D.arti_cod from 1 FOR 2) <> '.t' AND D.fact_id = M.mvar_idref AND
                M.mvar_tipodoc = 31 AND M.mvar_item = D.fade_item AND M.mvar_cons = C.cost_idmov
            INTO :ARTICULO, :ARTIDES, :CANT, :UNIDAD, :PRECIO, :IVA, :COSTO
            DO
                BEGIN
                PRECIO = PRECIO * CANT;
                if (IMPTOS = 'S') then
                    PRECIO = PRECIO - IVA;
                UTILIDAD = PRECIO - COSTO;
                if (DETALLE = 'S') then
                    BEGIN
                    if (UOM = 'UTILIDAD') then
                        EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                    else
                        EXECUTE PROCEDURE PORCENTAJE (utilidad,  PRECIO, 'S') returning_values (PORC);
                    SUSPEND;
                    END
                ELSE
                    BEGIN
                    COSTOT = COSTOT + COSTO;
                    PRECIOT = PRECIOT + PRECIO;
                    END
                END
          if (DETALLE <> 'S') then
            BEGIN
            COSTO = COSTOT;
            PRECIO = PRECIOT;
            UTILIDAD = PRECIO - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  PRECIO, 'S') returning_values (PORC);
            SUSPEND;
            END
          END
    END
  if (TIPO = 32) then
    BEGIN
    /* REMISION */
    FOR SELECT REVT_ID, R.PREF_PRE, REVT_NUMERO, REVT_FECHA, PTVT_ID, VEND_COD, TERC_NIT, REVT_NOMTERC, REVT_IVAINC
        FROM REMISIONES_VENTA R, PREFIJOS P
        WHERE REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN AND REVT_ANULADO = 'N'
         AND P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = :TIPO AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
        ORDER BY REVT_FECHA, R.PREF_PRE, REVT_NUMERO
        INTO :ID, :PREF, :NUMERO, :FECHA, :PTVTID, :VENDCOD, :NIT, :NOMTERCERO, :IMPTOS
        DO
        if ((PREFIJO = '') or (PREFIJO = PREF)) then
          BEGIN
          COSTOT = 0;
          PRECIOT = 0;
          FOR SELECT D.ARTI_COD, SUBSTR(RVDE_DESC,1,60), RVDE_CANT * RVDE_FACTOR, RVDE_UNIDAD, (RVDE_PRUNIT - RVDE_DTOMONTO) / RVDE_FACTOR, RVDE_IVAMONTO, COST_SALP
            FROM REMISIONES_VENTA_DETALLE D, movimiento_articulo m, costos c
            WHERE REVT_ID = :ID and substring(D.arti_cod from 1 FOR 2) <> '.t' AND D.revt_id = M.mvar_idref AND
                M.mvar_tipodoc = 32 AND M.mvar_item = D.rvde_item AND M.mvar_cons = C.cost_idmov
            INTO :ARTICULO, :ARTIDES, :CANT, :UNIDAD, :PRECIO, :IVA, :COSTO
            DO
                BEGIN
                PRECIO = PRECIO * CANT;
                if (IMPTOS = 'S') then
                    PRECIO = PRECIO - IVA;
                UTILIDAD = PRECIO - COSTO;
                if (DETALLE = 'S') then
                    BEGIN
                    if (UOM = 'UTILIDAD') then
                        EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                    else
                        EXECUTE PROCEDURE PORCENTAJE (utilidad,  PRECIO, 'S') returning_values (PORC);
                    SUSPEND;
                    END
                ELSE
                    BEGIN
                    COSTOT = COSTOT + COSTO;
                    PRECIOT = PRECIOT + PRECIO;
                    END
                END
          if (DETALLE <> 'S') then
            BEGIN
            COSTO = COSTOT;
            PRECIO = PRECIOT;
            UTILIDAD = PRECIO - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  PRECIO, 'S') returning_values (PORC);
            SUSPEND;
            END
          END
    END
  if (TIPO = 33) then
    BEGIN
    /* DEVOLUCION */
    FOR SELECT DEVT_ID, D.PREF_PRE, DEVT_NUMERO, DEVT_FECHA, PTVT_ID, VEND_COD, TERC_NIT, DEVT_NOMTERC, DEVT_IVAINC
        FROM DEVOLUCIONES_VENTAS D, PREFIJOS P
        WHERE DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND DEVT_ANULADO = 'N'
         AND P.PREF_PRE = D.PREF_PRE AND P.TIDO_COD = :TIPO AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
        ORDER BY DEVT_FECHA, D.PREF_PRE, DEVT_NUMERO
        INTO :ID, :PREF, :NUMERO, :FECHA, :PTVTID, :VENDCOD, :NIT, :NOMTERCERO, :IMPTOS
        DO
        if ((PREFIJO = '') or (PREFIJO = PREF)) then
          BEGIN
          COSTOT = 0;
          PRECIOT = 0;
          FOR SELECT D.ARTI_COD, SUBSTR(DVDE_DESC,1,60), DVDE_CANT * DVDE_FACTOR, DVDE_UNIDAD, (DVDE_PRUNIT - DVDE_DTOMONTO) / DVDE_FACTOR, DVDE_IVAMONTO, COST_ENTP
            FROM DEVOLUCIONES_VENTAS_DETALLE D, MOVIMIENTO_ARTICULO M, COSTOS C
            WHERE DEVT_ID = :ID and substring(D.arti_cod from 1 FOR 2) <> '.t' AND D.devt_id = M.mvar_idref AND
                M.mvar_tipodoc = 33 AND M.mvar_item = D.dvde_item AND M.mvar_cons = C.cost_idmov
            INTO :ARTICULO, :ARTIDES, :CANT, :UNIDAD, :PRECIO, :IVA, :COSTO
            DO
                BEGIN
                PRECIO = PRECIO * CANT;
                if (IMPTOS = 'S') then
                    PRECIO = PRECIO - IVA;
                UTILIDAD = PRECIO - COSTO;
                if (DETALLE = 'S') then
                    BEGIN
                    if (UOM = 'UTILIDAD') then
                        EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                    else
                        EXECUTE PROCEDURE PORCENTAJE (utilidad,  PRECIO, 'S') returning_values (PORC);
                    SUSPEND;
                    END
                ELSE
                    BEGIN
                    COSTOT = COSTOT + COSTO;
                    PRECIOT = PRECIOT + PRECIO;
                    END
                END
        if (DETALLE <> 'S') then
            BEGIN
            COSTO = COSTOT;
            PRECIO = PRECIOT;
            UTILIDAD = PRECIO - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  PRECIO, 'S') returning_values (PORC);
            SUSPEND;
            END
        END
    END
  if (TIPO = 34) then
    BEGIN
    /* PEDIDO */
    FOR SELECT PEDI_ID, P.PREF_PRE, PEDI_NUMERO, PEDI_FECHA, PTVT_ID, VEND_COD, TERC_NIT, PEDI_NOMTERC, PEDI_IVAINC
        FROM PEDIDOS P, PREFIJOS R
        WHERE PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND PEDI_ANULADO = 'N'
         AND P.PREF_PRE = R.PREF_PRE AND R.TIDO_COD = :TIPO AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
        ORDER BY PEDI_FECHA, P.PREF_PRE, PEDI_NUMERO
        INTO :ID, :PREF, :NUMERO, :FECHA, :PTVTID, :VENDCOD, :NIT, :NOMTERCERO, :IMPTOS
        DO
        if ((PREFIJO = '') or (PREFIJO = PREF)) then
          BEGIN
          COSTOT = 0;
          PRECIOT = 0;
          FOR SELECT ARTI_COD, SUBSTR(PEDE_DESC,1,60), PEDE_CANT * PEDE_FACTOR, PEDE_UNIDAD, (PEDE_PRUNIT - PEDE_DTOMONTO) / PEDE_FACTOR, PEDE_IVAMONTO
            FROM PEDIDOS_DETALLE
            WHERE PEDI_ID = :ID
            INTO :ARTICULO, :ARTIDES, :CANT, :UNIDAD, :PRECIO, :IVA
            DO
                BEGIN
                EXECUTE PROCEDURE COSTO_PROMEDIO(:ARTICULO, :FECHA) returning_values (:COSTO);
                COSTO = COSTO * CANT;
                PRECIO = PRECIO * CANT;
                if (IMPTOS = 'S') then
                    PRECIO = PRECIO - IVA;
                UTILIDAD = PRECIO - COSTO;
                if (DETALLE = 'S') then
                    BEGIN
                    if (UOM = 'UTILIDAD') then
                        EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                    else
                        EXECUTE PROCEDURE PORCENTAJE (utilidad,  PRECIO, 'S') returning_values (PORC);
                    SUSPEND;
                    END
                ELSE
                    BEGIN
                    COSTOT = COSTOT + COSTO;
                    PRECIOT = PRECIOT + PRECIO;
                    END
                END
        if (DETALLE <> 'S') then
            BEGIN
            COSTO = COSTOT;
            PRECIO = PRECIOT;
            UTILIDAD = PRECIO - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  PRECIO, 'S') returning_values (PORC);
            SUSPEND;
            END
        END
    END
  if (TIPO = 35) then
    BEGIN
    /* COTIZACION */
    FOR SELECT COTI_ID, C.PREF_PRE, COTI_NUMERO, COTI_FECHA, PTVT_ID, VEND_COD, TERC_NIT, COTI_NOMTERC, COTI_IMPTOS
        FROM COTIZACIONES C, PREFIJOS P
        WHERE COTI_FECHA >= :FECINI AND COTI_FECHA <= :FECFIN AND COTI_ANULADO = 'N'
         AND P.PREF_PRE = C.PREF_PRE AND P.TIDO_COD = :TIPO AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
        ORDER BY COTI_FECHA, C.PREF_PRE, COTI_NUMERO
        INTO :ID, :PREF, :NUMERO, :FECHA, :PTVTID, :VENDCOD, :NIT, :NOMTERCERO, :IMPTOS
        DO
        if ((PREFIJO = '') or (PREFIJO = PREF)) then
          BEGIN
          COSTOT = 0;
          PRECIOT = 0;
          FOR SELECT ARTI_COD, SUBSTR(CTDE_DESC,1,60), CTDE_CANT * CTDE_FACTOR, CTDE_UNIDAD, (CTDE_PRUNIT - CTDE_DTOMONTO) / CTDE_FACTOR, CTDE_IVAMONTO
            FROM COTIZACIONES_DETALLE
            WHERE COTI_ID = :ID
            INTO :ARTICULO, :ARTIDES, :CANT, :UNIDAD, :PRECIO, :IVA
            DO
                BEGIN
                EXECUTE PROCEDURE COSTO_PROMEDIO(:ARTICULO, :FECHA) returning_values (:COSTO);
                COSTO = COSTO * CANT;
                PRECIO = PRECIO * CANT;
                if (IMPTOS = 'S') then
                    PRECIO = PRECIO - IVA;
                UTILIDAD = PRECIO - COSTO;
                if (DETALLE = 'S') then
                    BEGIN
                    if (UOM = 'UTILIDAD') then
                        EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                    else
                        EXECUTE PROCEDURE PORCENTAJE (utilidad,  PRECIO, 'S') returning_values (PORC);
                    SUSPEND;
                    END
                ELSE
                    BEGIN
                    COSTOT = COSTOT + COSTO;
                    PRECIOT = PRECIOT + PRECIO;
                    END
                END
        if (DETALLE <> 'S') then
            BEGIN
            COSTO = COSTOT;
            PRECIO = PRECIOT;
            UTILIDAD = PRECIO - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  PRECIO, 'S') returning_values (PORC);
            SUSPEND;
            END
        END
    END
END
^

SET TERM ; ^


/* 20081212 REPETIA EL ULTIMO REGISTRO */

SET TERM ^ ;

CREATE OR ALTER PROCEDURE REP_ANALISIS_CARTERA(
    DESDE VARCHAR(20),
    HASTA VARCHAR(20),
    GRPINI VARCHAR(5),
    GRPFIN VARCHAR(5),
    FECHA DATE,
    DETALLE CHAR(1),
    ORDEN CHAR(1),
    AGRUPA CHAR(1),
    DIASR INTEGER,
    SUBEMPRESA INTEGER,
    GRUPCART INTEGER,
    EXTENDIDA CHAR(1),
    MONEDA INTEGER)
RETURNS (
    NIT VARCHAR(20),
    NOMBRE VARCHAR(60),
    TELEFONO VARCHAR(40),
    CIUDAD VARCHAR(40),
    CONTACTO VARCHAR(60),
    EMAIL VARCHAR(100),
    FAX VARCHAR(25),
    CEL VARCHAR(25),
    CODCLI VARCHAR(20),
    CODZONA VARCHAR(2),
    NOMZONA VARCHAR(60),
    CODCOBR INTEGER,
    NOMCOBR VARCHAR(60),
    DV CHAR(1),
    CODCIUD CHAR(5),
    NOMCIUD VARCHAR(60),
    SUCURSAL VARCHAR(10),
    NOMSUC VARCHAR(60),
    TIPO INTEGER,
    ID INTEGER,
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(6),
    DIAS INTEGER,
    SALDO NUMERIC(18,2),
    CORRIENTE NUMERIC(18,2),
    CERO NUMERIC(18,2),
    TREINTA NUMERIC(18,2),
    SESENTA NUMERIC(18,2),
    NOVENTA NUMERIC(18,2),
    CIENTOCHENTA NUMERIC(18,2),
    DOSSETENTA NUMERIC(18,2),
    TRESSESENTA NUMERIC(18,2),
    PROVISIONAL NUMERIC(18,2),
    TIPONOM VARCHAR(8),
    FECDOC DATE,
    VENCE DATE,
    CUPO NUMERIC(18,2),
    DISPONIBLE NUMERIC(18,2),
    OBS BLOB SUB_TYPE 0 SEGMENT SIZE 80,
    GRUPCOD INTEGER,
    DIA_CAR INTEGER,
    GRUPNOM VARCHAR(30))
AS
DECLARE VARIABLE NITINI VARCHAR(20);
DECLARE VARIABLE NITFIN VARCHAR(20);
DECLARE VARIABLE NOMINI VARCHAR(20);
DECLARE VARIABLE NOMFIN VARCHAR(20);
DECLARE VARIABLE RTFTE NUMERIC(18,2);
DECLARE VARIABLE RTIVA NUMERIC(18,2);
DECLARE VARIABLE RTICA NUMERIC(18,2);
DECLARE VARIABLE VENCIMIENTO VARCHAR(12);
DECLARE VARIABLE OK CHAR(1);
declare variable AUTORET VARCHAR(10);
declare variable FAUTORET DATE;
declare variable INCLANTI CHAR(2);
declare variable descnt_prov char(2);
declare variable MAXDIAS INTEGER;
DECLARE VARIABLE TRM NUMERIC(18,2);
BEGIN
if (ORDEN = 'C') then
    BEGIN
    NITINI = DESDE;
    NITFIN = HASTA;
    NOMINI = '';
    NOMFIN = 'zz';
    END
ELSE
    BEGIN
    NOMINI = DESDE;
    NOMFIN = HASTA;
    NITINI = '';
    NITFIN = 'zz';
    END
/* Ubique el NIT */
EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'FECHA AUTORETENEDOR NO DESCONTAR RETENCIONES DEL SALDO PERO SI CONTABILIZARLAS') returning_values (AUTORET);
if (AUTORET <> '') then
    FAUTORET = CAST(AUTORET AS DATE);
else
    FAUTORET = '9999/12/31';
EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'ANALISIS DE CARTERA CON FECHA FACTURA O VENCIMIENTO') returning_values (VENCIMIENTO);
EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'INCLUIR ANTICIPOS DE CLIENTES EN REPORTES Y CONSULTAS DE CARTERA') returning_values (INCLANTI);
EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'DESCONTAR RECIBOS PROVISIONALES EN INFORMES DE CARTERA') RETURNING_VALUES (:descnt_prov);

FOR select T.TERC_NIT, TERC_NOM, TERC_DV, CLSU_TEL, CLSU_CIUDAD, S.COBR_COD, S.ZONA_COD, T.CIUD_COD, CLIE_CUPO, CLIE_DIAS, CLCU_COD, CLSU_NOMBRE, t.terc_obs, C.GRCA_COD, TERC_CONTACTO, TERC_EMAIL, TERC_FAX, TERC_CEL, CLIE_COD
    from terceros T, CLIENTES C, CLIENTE_SUCURSALES S
    where C.TERC_NIT = T.TERC_NIT AND TERC_CLIE = 'S' AND S.TERC_NIT = C.TERC_NIT and T.TERC_NIT >= :NITINI AND T.TERC_NIT <= :NITFIN AND
        T.TERC_NOM >= :NOMINI AND T.TERC_NOM <= :NOMFIN AND ((:GRUPCART = 0) or (C.GRCA_COD = :GRUPCART))
    INTO :NIT, :NOMBRE, :DV, :TELEFONO, :CIUDAD, :CODCOBR, :CODZONA, :CODCIUD, :CUPO, :DIA_CAR,  :SUCURSAL, :NOMSUC, :obs, :GRUPCOD, :CONTACTO, :EMAIL, :FAX, :CEL, :CODCLI
    DO  
    BEGIN
    SELECT COBR_NOM FROM COBRADORES CB WHERE COBR_COD = :CODCOBR INTO :NOMCOBR;
    SELECT ZONA_NOM FROM ZONAS Z WHERE ZONA_COD = :CODZONA INTO :NOMZONA;
    SELECT CIUD_NOM FROM CIUDADES WHERE CIUD_COD = :CODCIUD INTO :NOMCIUD;
    SELECT GRCA_NOMBRE FROM GRUPO_CARTERA WHERE GRCA_COD = :GRUPCOD INTO :GRUPNOM;
    provisional = 0;
    MAXDIAS = 0;
    OK = 'N';
    if (AGRUPA = 'Z') then
        BEGIN
        if (GRPINI = '') then
            BEGIN
            if ((CODZONA IS NULL) or (CODZONA >= :GRPINI AND CODZONA <= :GRPFIN)) then
                OK = 'S';
            END
        ELSE
            if (CODZONA >= :GRPINI AND CODZONA <= :GRPFIN) then
                OK = 'S';
        END
    if (AGRUPA = 'I') then
        BEGIN
        if (GRPINI = '') then
            BEGIN
            if ((CODCIUD IS NULL) or (CODCIUD >= :GRPINI AND CODCIUD <= :GRPFIN)) then
                OK = 'S';
            END
        ELSE
            if (CODCIUD >= :GRPINI AND CODCIUD <= :GRPFIN) then
                OK = 'S';
        END
    if (AGRUPA = 'N') then
        OK = 'S';
    if (OK = 'S') then
        BEGIN
        DISPONIBLE = CUPO;
        CORRIENTE = 0;
        CERO = 0;
        TREINTA = 0;
        SESENTA = 0;
        NOVENTA = 0;
        CIENTOCHENTA = 0;
        DOSSETENTA = 0;
        TRESSESENTA = 0;
        /* BUSQUE EN SALDOS_DOC_CARTERA LOS QUE TENGAN SALDO > 0 */
        FOR SELECT MVCL_TIPOREF, MVCL_IDREF, MVCL_PREFREF, MVCL_NUMREF, MVCL_FECHA, MVCL_VENCE
            FROM MOVIMIENTO_CLIENTES
            WHERE TERC_NIT = :NIT AND MVCL_SUCURSAL = :SUCURSAL AND MVCL_FECHA <= :FECHA
                AND MVCL_ABONO = 'N' AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA)) AND
                ((:MONEDA = 0) or (MVCL_TRM <> 1))
            INTO :TIPO, :ID, :PREFIJO, :NUMERO, :FECDOC, :VENCE
            DO
            BEGIN
            if ((inclanti = 'SI') or (TIPO <> 45)) then
                BEGIN
                EXECUTE PROCEDURE saldo_doc_cartera(TIPO, ID, FECHA, MONEDA) returning_values (SALDO);
                if (SALDO <> 0) then
                    BEGIN
                    DISPONIBLE = DISPONIBLE - SALDO;
                    SELECT TIDO_NOMCORTO FROM TIPO_DOCUMENTO WHERE TIDO_COD = :TIPO INTO :TIPONOM;

                    if (MONEDA = 0) then
                        SELECT SUM(SDCA_RTFTE - SDCA_ABRTFTE), SUM(SDCA_RTIVA - SDCA_ABRTIVA), SUM(SDCA_RTICA - SDCA_ABRTICA)
                            FROM SALDOS_DOC_CARTERA WHERE SDCA_TIPOREF = :TIPO AND SDCA_IDREF = :ID
                            INTO :RTFTE, :RTIVA, :RTICA;
                    ELSE
                        SELECT SUM((SDCA_RTFTE - SDCA_ABRTFTE)/SDCA_TRM), SUM((SDCA_RTIVA - SDCA_ABRTIVA)/SDCA_TRM), SUM((SDCA_RTICA - SDCA_ABRTICA)/SDCA_TRM)
                            FROM SALDOS_DOC_CARTERA WHERE SDCA_TIPOREF = :TIPO AND SDCA_IDREF = :ID
                            INTO :RTFTE, :RTIVA, :RTICA;
                    if (RTFTE IS NULL) then
                        RTFTE = 0;
                    if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) THEN
                        BEGIN
                        if (RTFTE > 0) then
                            RTFTE = 0;
                        END
                    ELSE
                        BEGIN
                        if (RTFTE < 0) then
                            RTFTE = 0;
                        END
                    if (FAUTORET <= FECDOC) then
                        RTFTE = 0;
                    if (RTIVA IS NULL) then
                        RTIVA = 0;
                    if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) THEN
                        BEGIN
                        if (RTIVA > 0) then
                            RTIVA = 0;
                        END
                    ELSE
                        BEGIN
                        if (RTIVA < 0) then
                            RTIVA = 0;
                        END
                    if (RTICA IS NULL) then
                        RTICA = 0;
                    if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) THEN
                        BEGIN
                        if (RTICA > 0) then
                            RTICA = 0;
                        END
                    ELSE
                        BEGIN
                        if (RTICA < 0) then
                            RTICA = 0;
                        END
                    /* AHORA CLASIFIQUE LOS DIAS */
                    if (VENCIMIENTO = 'FECHA') then
                        DIAS = FECHA - FECDOC;
                    ELSE
                        DIAS = FECHA - VENCE;
                    if (MAXDIAS < DIAS) then
                        MAXDIAS = DIAS;
                    if (DETALLE = 'S') then
                        BEGIN
                        CORRIENTE = 0;
                        CERO = 0;
                        TREINTA = 0;
                        SESENTA = 0;
                        NOVENTA = 0;
                        CIENTOCHENTA = 0;
                        DOSSETENTA = 0;
                        tressesenta = 0;
                        END
                    if (DIAS < 0) then
                        CORRIENTE = CORRIENTE + SALDO;
                    ELSE
                        if (DIAS < DIASR) then
                            CERO = CERO + SALDO;
                        ELSE
                            if (DIAS < (DIASR * 2)) then
                                TREINTA = TREINTA + SALDO;
                            ELSE
                                if (DIAS < (DIASR * 3)) then
                                    SESENTA = SESENTA + SALDO;
                                ELSE
                                    BEGIN
                                    if (EXTENDIDA = 'N') then
                                        NOVENTA = NOVENTA + SALDO;
                                    else    
                                        BEGIN
                                        if (DIAS < (DIASR * 3) * 2) then
                                            NOVENTA = NOVENTA + SALDO;
                                        ELSE
                                            if (DIAS < (DIASR * 3) * 3) then
                                                CIENTOCHENTA = CIENTOCHENTA + SALDO;
                                            ELSE
                                                if (DIAS < (DIASR * 3) * 4) then
                                                    dossetenta = dossetenta + SALDO;
                                            ELSE
                                                tressesenta = tressesenta + SALDO;
                                        END
                                    END
                    if (DETALLE = 'S') then
                        SUSPEND;
                    END  /* SALDO */
                END  /* NO ANTICIPO */
            END  /* FOR MOV_CLI */
        /* AGREGUE LOS RECIBOS PROVISIONALES CON SIGNO NEGATIVO */
        FOR SELECT 65, MAX(P.RCPR_ID), MAX(PREF_PRE), MAX(RCPR_NUMERO), MAX(RCPR_FECHA), SUM(RPDE_ABONO* -1), SUM(RPDE_RTFTE*-1), SUM(RPDE_RTIVA*-1), SUM(RPDE_RTICA*-1), MAX(RCPR_TRM)
            FROM RECIBO_PROVISIONAL P, recibo_provisional_detalle D
            WHERE P.rcpr_id = D.rcpr_id AND P.TERC_NIT = :NIT AND D.RPDE_SUCURSAL = :SUCURSAL AND P.RCPR_FECHA <= :FECHA AND P.RCPR_ANULADO = 'N' AND
            ((RCPR_FECCRUCE IS NULL) or (RCPR_FECCRUCE > :FECHA)) AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA)) AND ((:MONEDA = 0) or (RCPR_TRM <> 1))
            GROUP BY P.rcpr_id
            INTO :TIPO, :ID, :PREFIJO, :NUMERO, :FECDOC, :PROVISIONAL, :rtfte,  :RTIVA, :RTICA, :TRM
            DO
            BEGIN
            if ((MONEDA <> 0) AND (TRM <> 0)) then
                BEGIN
                PROVISIONAL = PROVISIONAL / TRM;
                RTFTE = RTFTE / TRM;
                RTIVA = RTIVA / TRM;
                RTICA = RTICA / TRM;
                END
            if (:descnt_prov = 'NO') then
              SALDO = 0;
            else
              SALDO = :PROVISIONAL;
            SELECT TIDO_NOMCORTO FROM TIPO_DOCUMENTO WHERE TIDO_COD = :TIPO INTO :TIPONOM;
            /* CALCULE EL VENCIMIENTO DEL ULTIMO DOCUMENTO POSFECHADO */
            SELECT MAX(RPPA_FECHA) FROM recibo_provisional_pago WHERE RCPR_ID = :ID INTO :VENCE;
            DIAS = VENCE - FECHA;
            if (DETALLE = 'S') then
                BEGIN
                CORRIENTE = 0;
                CERO = 0;
                TREINTA = 0;
                SESENTA = 0;
                NOVENTA = 0;
                CIENTOCHENTA = 0;
                DOSSETENTA = 0;
                tressesenta = 0;
                END
            if (DIAS < 0) then
                CORRIENTE = CORRIENTE + SALDO;
            ELSE
                if (DIAS < DIASR) then
                    CERO = CERO + SALDO;
                ELSE
                    if (DIAS < (DIASR * 2)) then
                        TREINTA = TREINTA + SALDO;
                    ELSE
                        if (DIAS < (DIASR * 3)) then
                            SESENTA = SESENTA + SALDO;
                        ELSE
                            BEGIN
                            if (EXTENDIDA = 'N') then
                                NOVENTA = NOVENTA + SALDO;
                            else
                                BEGIN
                                if (DIAS < (DIASR * 3) * 2) then
                                    CIENTOCHENTA = CIENTOCHENTA + SALDO;
                                ELSE
                                    if (DIAS < (DIASR * 3) * 3) then
                                        DOSSETENTA = DOSSETENTA + SALDO;
                                    ELSE
                                        TRESSESENTA = TRESSESENTA + SALDO;
                                END
                            END
            if (DETALLE = 'S') then
                SUSPEND;
            END
        if (DETALLE = 'N') then
            begin
            SALDO = CORRIENTE + CERO + TREINTA + SESENTA + NOVENTA;
            DIAS = MAXDIAS;
            SUSPEND;
            end
        END
    if (AGRUPA = 'C') then
        BEGIN
        FOR SELECT DISTINCT COBR_COD FROM MOVIMIENTO_CLIENTES
            WHERE TERC_NIT = :NIT AND MVCL_SUCURSAL = :SUCURSAL AND MVCL_FECHA <= :FECHA
                AND MVCL_ABONO = 'N' AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA)) AND
                ((:MONEDA = 0) or (MVCL_TRM <> 1))
            INTO :codcobr
            DO
            BEGIN
            OK = 'N';
            if (GRPINI = '') then
                BEGIN
                if ((CODCOBR IS NULL) or (CODCOBR >= :GRPINI AND CODCOBR <= :GRPFIN)) then
                    OK = 'S';
                END
            ELSE
                if (CODCOBR >= :GRPINI AND CODCOBR <= :GRPFIN) then
                    OK = 'S';
            if (OK = 'S') then
                BEGIN
                DISPONIBLE = CUPO;
                CORRIENTE = 0;
                CERO = 0;
                TREINTA = 0;
                SESENTA = 0;
                NOVENTA = 0;
                CIENTOCHENTA = 0;
                DOSSETENTA = 0;
                tressesenta = 0;
                SELECT COBR_NOM FROM COBRADORES WHERE COBR_COD = :codcobr INTO :nomcobr;
                /* BUSQUE EN SALDOS_DOC_CARTERA LOS QUE TENGAN SALDO > 0 */
                FOR SELECT MVCL_TIPOREF, MVCL_IDREF, MVCL_PREFREF, MVCL_NUMREF, MVCL_FECHA, MVCL_VENCE
                    FROM MOVIMIENTO_CLIENTES
                    WHERE TERC_NIT = :NIT AND COBR_COD = :CODCOBR AND MVCL_SUCURSAL = :SUCURSAL AND MVCL_FECHA <= :FECHA
                        AND MVCL_ABONO = 'N' AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA))
                    INTO :TIPO, :ID, :PREFIJO, :NUMERO, :FECDOC, :VENCE
                    DO
                    BEGIN
                    if ((inclanti = 'SI') or (TIPO <> 45)) then
                        BEGIN
                        EXECUTE PROCEDURE saldo_doc_cartera(TIPO, ID, FECHA, MONEDA) returning_values (SALDO);
                        if (SALDO <> 0) then
                            BEGIN
                            DISPONIBLE = DISPONIBLE - SALDO;
                            SELECT TIDO_NOMCORTO FROM TIPO_DOCUMENTO WHERE TIDO_COD = :TIPO INTO :TIPONOM;
                            if (MONEDA = 0) then
                                SELECT SUM(SDCA_RTFTE - SDCA_ABRTFTE), SUM(SDCA_RTIVA - SDCA_ABRTIVA), SUM(SDCA_RTICA - SDCA_ABRTICA)
                                    FROM SALDOS_DOC_CARTERA WHERE SDCA_TIPOREF = :TIPO AND SDCA_IDREF = :ID
                                    INTO :RTFTE, :RTIVA, :RTICA;
                            ELSE
                                SELECT SUM((SDCA_RTFTE - SDCA_ABRTFTE)/SDCA_TRM), SUM((SDCA_RTIVA - SDCA_ABRTIVA)/SDCA_TRM), SUM((SDCA_RTICA - SDCA_ABRTICA)/SDCA_TRM)
                                    FROM SALDOS_DOC_CARTERA WHERE SDCA_TIPOREF = :TIPO AND SDCA_IDREF = :ID
                                    INTO :RTFTE, :RTIVA, :RTICA;
                            if (RTFTE IS NULL) then
                                RTFTE = 0;
                            if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) THEN
                                BEGIN
                                if (RTFTE > 0) then
                                    RTFTE = 0;
                                END
                            ELSE
                                BEGIN
                                if (RTFTE < 0) then
                                    RTFTE = 0;
                                END
                            if (FAUTORET <= FECDOC) then
                                RTFTE = 0;
                            if (RTIVA IS NULL) then
                                RTIVA = 0;
                            if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) THEN
                                BEGIN
                                if (RTIVA > 0) then
                                    RTIVA = 0;
                                END
                            ELSE
                                BEGIN
                                if (RTIVA < 0) then
                                    RTIVA = 0;
                                END
                            if (RTICA IS NULL) then
                                RTICA = 0;
                            if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) THEN
                                BEGIN
                                if (RTICA > 0) then
                                    RTICA = 0;
                                END
                            ELSE
                                BEGIN
                                if (RTICA < 0) then
                                    RTICA = 0;
                                END
                            /* AHORA CLASIFIQUE LOS DIAS */
                            if (VENCIMIENTO = 'FECHA') then
                                DIAS = FECHA - FECDOC;
                            ELSE
                                DIAS = FECHA - VENCE;
                            if (MAXDIAS < DIAS) then
                                MAXDIAS = DIAS;
                            if (DETALLE = 'S') then
                                BEGIN
                                CORRIENTE = 0;
                                CERO = 0;
                                TREINTA = 0;
                                SESENTA = 0;
                                NOVENTA = 0;
                                CIENTOCHENTA = 0;
                                DOSSETENTA = 0;
                                tressesenta = 0;
                                END
                            if (DIAS < 0) then
                                CORRIENTE = CORRIENTE + SALDO;
                            ELSE
                                if (DIAS < DIASR) then
                                    CERO = CERO + SALDO;
                                ELSE
                                    if (DIAS < (DIASR * 2)) then
                                        TREINTA = TREINTA + SALDO;
                                    ELSE
                                        if (DIAS < (DIASR * 3)) then
                                            SESENTA = SESENTA + SALDO;
                                        ELSE
                                            BEGIN
                                            if (EXTENDIDA = 'N') then
                                                NOVENTA = NOVENTA + SALDO;
                                            else    
                                                BEGIN
                                                if (DIAS < (DIASR * 3) * 2) then
                                                    CIENTOCHENTA = CIENTOCHENTA + SALDO;
                                                ELSE
                                                    if (DIAS < (DIASR * 3) * 3) then
                                                        DOSSETENTA = DOSSETENTA + SALDO;
                                                    ELSE
                                                        TRESSESENTA = TRESSESENTA + SALDO;
                                                END
                                            END
                            if (DETALLE = 'S') then
                                SUSPEND;
                            END  /* SALDO <>  0 */
                        END  /* NO ANTICIPO */
                    END  /* FOR MOV_CLI */
                /* AGREGUE LOS RECIBOS PROVISIONALES CON SIGNO NEGATIVO */
                FOR SELECT 65, MAX(P.RCPR_ID), MAX(PREF_PRE), MAX(RCPR_NUMERO), MAX(RCPR_FECHA), SUM(RPDE_ABONO * -1), SUM(RPDE_RTFTE*-1), SUM(RPDE_RTIVA*-1), SUM(RPDE_RTICA*-1), MAX(RCPR_TRM)
                    FROM RECIBO_PROVISIONAL P, recibo_provisional_detalle D
                    WHERE P.rcpr_id = D.rcpr_id AND P.TERC_NIT = :NIT AND RPDE_SUCURSAL = :SUCURSAL AND P.VEND_COD = :CODCOBR AND P.RCPR_FECHA <= :FECHA AND P.RCPR_ANULADO = 'N' AND
                    ((RCPR_FECCRUCE IS NULL) or (RCPR_FECCRUCE > :FECHA)) AND ((SUCU_ID = :SUBEMPRESA) OR (:SUBEMPRESA = 0)) AND ((:MONEDA = 0) or (RCPR_TRM <> 1))
                    GROUP BY P.rcpr_id
                    INTO :TIPO, :ID, :PREFIJO, :NUMERO, :FECDOC, :PROVISIONAL, :rtfte,  :RTIVA, :RTICA, :TRM
                    DO
                    BEGIN
                    if ((MONEDA <> 0) AND (TRM <> 0)) then
                        BEGIN
                        PROVISIONAL = PROVISIONAL / TRM;
                        RTFTE = RTFTE / TRM;
                        RTIVA = RTIVA / TRM;
                        RTICA = RTICA / TRM;
                        END
                    if (:descnt_prov = 'NO') then
                      SALDO = 0;
                    else
                      SALDO = :PROVISIONAL;
                    SELECT TIDO_NOMCORTO FROM TIPO_DOCUMENTO WHERE TIDO_COD = :TIPO INTO :TIPONOM;
                    /* CALCULE EL VENCIMIENTO DEL ULTIMO DOCUMENTO POSFECHADO */
                    SELECT MAX(RPPA_FECHA) FROM recibo_provisional_pago WHERE RCPR_ID = :ID INTO :VENCE;
                    DIAS = VENCE - FECHA;
                    if (DETALLE = 'S') then
                        BEGIN
                        CORRIENTE = 0;
                        CERO = 0;
                        TREINTA = 0;
                        SESENTA = 0;
                        NOVENTA = 0;
                        CIENTOCHENTA = 0;
                        DOSSETENTA = 0;
                        tressesenta = 0;
                        END
                    if (DIAS < 0) then
                        CORRIENTE = CORRIENTE + SALDO;
                    ELSE
                        if (DIAS < DIASR) then
                            CERO = CERO + SALDO;
                        ELSE
                            if (DIAS < (DIASR * 2)) then
                                TREINTA = TREINTA + SALDO;
                            ELSE
                                if (DIAS < (DIASR * 3)) then
                                    SESENTA = SESENTA + SALDO;
                                ELSE
                                    BEGIN
                                    if (EXTENDIDA = 'N') then
                                        NOVENTA = NOVENTA + SALDO;
                                    else    
                                        BEGIN
                                        if (DIAS < (DIASR * 3) * 2) then
                                            CIENTOCHENTA = CIENTOCHENTA + SALDO;
                                        ELSE
                                            if (DIAS < (DIASR * 3) * 3) then
                                                DOSSETENTA = DOSSETENTA + SALDO;
                                            ELSE
                                                TRESSESENTA = TRESSESENTA + SALDO;
                                        END
                                    END
                    if (DETALLE = 'S') then
                        SUSPEND;
                    END
                if (DETALLE = 'N') then
                    begin
                    SALDO = CORRIENTE + CERO + TREINTA + SESENTA + NOVENTA;
                    DIAS = MAXDIAS;
                    SUSPEND;
                    end
                END
            END  /* FOR COBRADOR */
        END
    END  /* FOR NIT */
END
^

SET TERM ; ^


/* PERSISTIA EL ERROR DE SUMAR EN LUGAR DE RESTAR LOS ABONOS, ADEMAS REPETIA LOS CLIENTES CON SUCURSALES */
SET TERM ^ ;

CREATE OR ALTER PROCEDURE RECUPERACION_CARTERA(
    DESDE VARCHAR(20),
    HASTA VARCHAR(20),
    GRPINI VARCHAR(5),
    GRPFIN VARCHAR(5),
    FECHA DATE,
    ORDEN CHAR(1),
    AGRUPA CHAR(1),
    SUCURSAL INTEGER,
    MONEDA INTEGER)
RETURNS (
    NIT VARCHAR(20),
    NOMBRE VARCHAR(60),
    TELEFONO VARCHAR(40),
    CIUDAD VARCHAR(60),
    CODZONA VARCHAR(2),
    NOMZONA VARCHAR(60),
    CODCOBR INTEGER,
    NOMCOBR VARCHAR(60),
    DV CHAR(1),
    CODCIUD CHAR(5),
    NOMCIUD VARCHAR(60),
    INICIAL NUMERIC(18,2),
    CARGOS1 NUMERIC(18,2),
    ABONOS1 NUMERIC(18,2),
    CARGOS2 NUMERIC(18,2),
    ABONOS2 NUMERIC(18,2),
    CARGOS3 NUMERIC(18,2),
    ABONOS3 NUMERIC(18,2),
    FINAL NUMERIC(18,2))
AS
declare variable NITINI VARCHAR(20);
declare variable NITFIN VARCHAR(20);
declare variable NOMINI VARCHAR(60);
declare variable NOMFIN VARCHAR(60);
declare variable OK CHAR(1);
declare variable FECINI DATE;
declare variable FECFIN DATE;
declare variable DEBITO NUMERIC(18,2);
declare variable CREDITO NUMERIC(18,2);
declare variable TIPODOC INTEGER;
declare variable IDDOC INTEGER;
declare variable SALDO NUMERIC(18,2);
declare variable RTFTE NUMERIC(18,2);
declare variable RTIVA NUMERIC(18,2);
declare variable RTICA NUMERIC(18,2);
declare variable RETES CHAR(2);
BEGIN
EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'DESCONTAR RETENCIONES POR CAUSACION') returning_values (:RETES);
if (ORDEN = 'C') then
    BEGIN
    NITINI = DESDE;
    NITFIN = HASTA;
    NOMINI = '';
    NOMFIN = 'zz';
    END
ELSE
    BEGIN
    NOMINI = DESDE;
    NOMFIN = HASTA;
    NITINI = '';
    NITFIN = 'zz';
    END
  /* Ubique el NIT */
  FOR select T.TERC_NIT, TERC_NOM, TERC_DV, TERC_TEL, TERC_CIU, C.COBR_COD, C.ZONA_COD, T.CIUD_COD
    from terceros T, CLIENTES C
    where C.TERC_NIT = T.TERC_NIT AND TERC_CLIE = 'S' AND T.TERC_NIT >= :NITINI AND T.TERC_NIT <= :NITFIN AND
        TERC_NOM >= :NOMINI AND TERC_NOM <= :NOMFIN
    INTO :NIT, :NOMBRE, :DV, :TELEFONO, :CIUDAD, :CODCOBR, :CODZONA, :CODCIUD
    DO  
    BEGIN
    FECINI = FECHA - 90;
    OK = 'N';
    if (AGRUPA = 'Z') then
        BEGIN
        if (GRPINI = '') then
            BEGIN
            if ((CODZONA IS NULL) or (CODZONA >= :GRPINI AND CODZONA <= :GRPFIN)) then
                OK = 'S';
            END
        ELSE
            if (CODZONA >= :GRPINI AND CODZONA <= :GRPFIN) then
                OK = 'S';
        END
    if (AGRUPA = 'I') then
        BEGIN
        if (GRPINI = '') then
            BEGIN
            if ((CODCIUD IS NULL) or (CODCIUD >= :GRPINI AND CODCIUD <= :GRPFIN)) then
                OK = 'S';
            END
        ELSE
            if (CODCIUD >= :GRPINI AND CODCIUD <= :GRPFIN) then
                OK = 'S';
        END
    if (AGRUPA = 'N') then
        OK = 'S';
        
    if (OK = 'S') then
        BEGIN
        SELECT COBR_NOM FROM COBRADORES CB WHERE COBR_COD = :CODCOBR INTO :NOMCOBR;
        SELECT ZONA_NOM FROM ZONAS WHERE ZONA_COD = :CODZONA INTO :NOMZONA;
        SELECT CIUD_NOM FROM CIUDADES WHERE CIUD_COD = :CODCIUD INTO :NOMCIUD;
        CARGOS1 = 0;
        ABONOS1 = 0;
        CARGOS2 = 0;
        ABONOS2 = 0;
        CARGOS3 = 0;
        ABONOS3 = 0;
        INICIAL = 0;
        FOR SELECT MVCL_TIPOREF, MVCL_IDREF FROM MOVIMIENTO_CLIENTES
            WHERE TERC_NIT = :NIT AND MVCL_FECHA <= :FECINI AND ((:MONEDA = 0) or (MVCL_TRM <> 1)) AND
            MVCL_ABONO = 'N' AND ((:SUCURSAL = 0) or (SUCU_ID = :SUCURSAL))
            INTO :TIPODOC, :IDDOC
            DO
            BEGIN
            EXECUTE PROCEDURE saldo_doc_cartera(TIPODOC, IDDOC, FECINI, MONEDA) returning_values (SALDO);
            INICIAL = INICIAL + SALDO;
            END
        FECFIN = FECINI + 30;
        if (MONEDA = 0) then
            SELECT SUM(MVCL_MONTO), SUM(MVCL_RTEFTE), SUM(MVCL_RTEIVA), SUM(MVCL_RTEICA) FROM movimiento_clientes WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND
                MVCL_FECHA < :FECFIN AND MVCL_DEBITO = 'S' AND MVCL_ABONO = 'N' AND ((:SUCURSAL = 0) or (SUCU_ID = :SUCURSAL))
                INTO :DEBITO, :RTFTE, :RTIVA, :RTICA;
        ELSE
            SELECT SUM(MVCL_MONTO/MVCL_TRM), SUM(MVCL_RTEFTE/MVCL_TRM), SUM(MVCL_RTEIVA/MVCL_TRM), SUM(MVCL_RTEICA/MVCL_TRM)
                FROM movimiento_clientes WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND ((:MONEDA = 0) or (MVCL_TRM <> 1)) AND
                MVCL_FECHA < :FECFIN AND MVCL_DEBITO = 'S' AND MVCL_ABONO = 'N' AND ((:SUCURSAL = 0) or (SUCU_ID = :SUCURSAL))
                INTO :DEBITO, :RTFTE, :RTIVA, :RTICA;
        if (DEBITO IS NULL) then
            DEBITO = 0;
        if (rtfte IS NULL) then
            rtfte = 0;
        if (rtiva IS NULL) then
            rtiva = 0;
        if (rtica IS NULL) then
            rtica = 0;
        IF (RETES = 'SI') then
            DEBITO = DEBITO - RTFTE - RTIVA - RTICA;

        if (MONEDA = 0) then
            SELECT SUM(MVCL_MONTO), SUM(MVCL_RTEFTE), SUM(MVCL_RTEIVA), SUM(MVCL_RTEICA)  FROM movimiento_clientes WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI
                AND MVCL_FECHA < :FECFIN AND MVCL_DEBITO = 'N'  AND MVCL_ABONO = 'N' AND ((:SUCURSAL = 0) or (SUCU_ID = :SUCURSAL))
                INTO :CREDITO, :RTFTE, :RTIVA, :RTICA;
        ELSE
            SELECT SUM(MVCL_MONTO/MVCL_TRM), SUM(MVCL_RTEFTE/MVCL_TRM), SUM(MVCL_RTEIVA/MVCL_TRM), SUM(MVCL_RTEICA/MVCL_TRM)
                FROM movimiento_clientes WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND ((:MONEDA = 0) or (MVCL_TRM <> 1))
                AND MVCL_FECHA < :FECFIN AND MVCL_DEBITO = 'N'  AND MVCL_ABONO = 'N' AND ((:SUCURSAL = 0) or (SUCU_ID = :SUCURSAL))
                INTO :CREDITO, :RTFTE, :RTIVA, :RTICA;
        if (CREDITO IS NULL) then
            CREDITO = 0;
        if (rtfte IS NULL) then
            rtfte = 0;
        if (rtiva IS NULL) then
            rtiva = 0;
        if (rtica IS NULL) then
            rtica = 0;
        IF (RETES = 'SI') then
            CREDITO = CREDITO - RTFTE - RTIVA - RTICA;
        CARGOS3 = DEBITO - CREDITO;
        if (MONEDA = 0) then
            SELECT SUM(MVCL_MONTO), SUM(MVCL_RTEFTE), SUM(MVCL_RTEIVA), SUM(MVCL_RTEICA)  FROM movimiento_clientes WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI
                AND MVCL_FECHA < :FECFIN AND MVCL_DEBITO = 'N' AND MVCL_ABONO = 'S' AND ((:SUCURSAL = 0) or (SUCU_ID = :SUCURSAL))
                INTO :CREDITO, :RTFTE, :RTIVA, :RTICA;
        ELSE
            SELECT SUM(MVCL_MONTO/MVCL_TRM), SUM(MVCL_RTEFTE/MVCL_TRM), SUM(MVCL_RTEIVA/MVCL_TRM), SUM(MVCL_RTEICA/MVCL_TRM)
                FROM movimiento_clientes WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND ((:MONEDA = 0) or (MVCL_TRM <> 1))
                AND MVCL_FECHA < :FECFIN AND MVCL_DEBITO = 'N' AND MVCL_ABONO = 'S' AND ((:SUCURSAL = 0) or (SUCU_ID = :SUCURSAL))
                INTO :CREDITO, :RTFTE, :RTIVA, :RTICA;
        if (CREDITO IS NULL) then
            CREDITO = 0;
        if (rtfte IS NULL) then
            rtfte = 0;
        if (rtiva IS NULL) then
            rtiva = 0;
        if (rtica IS NULL) then
            rtica = 0;
        IF (RETES = 'NO') then
            CREDITO = CREDITO + RTFTE + RTIVA + RTICA;
        ABONOS3 = CREDITO;
        FECINI = FECFIN;
        FECFIN = FECINI + 30;
        if (MONEDA = 0) then
            SELECT SUM(MVCL_MONTO), SUM(MVCL_RTEFTE), SUM(MVCL_RTEIVA), SUM(MVCL_RTEICA)  FROM movimiento_clientes WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI
                AND MVCL_FECHA < :FECFIN AND MVCL_DEBITO = 'S' AND MVCL_ABONO = 'N' AND ((:SUCURSAL = 0) or (SUCU_ID = :SUCURSAL))
                INTO :DEBITO, :RTFTE, :RTIVA, :RTICA;
        ELSE
            SELECT SUM(MVCL_MONTO/MVCL_TRM), SUM(MVCL_RTEFTE/MVCL_TRM), SUM(MVCL_RTEIVA/MVCL_TRM), SUM(MVCL_RTEICA/MVCL_TRM)
                FROM movimiento_clientes WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND ((:MONEDA = 0) or (MVCL_TRM <> 1))
                AND MVCL_FECHA < :FECFIN AND MVCL_DEBITO = 'S' AND MVCL_ABONO = 'N' AND ((:SUCURSAL = 0) or (SUCU_ID = :SUCURSAL))
                INTO :DEBITO, :RTFTE, :RTIVA, :RTICA;
        if (DEBITO IS NULL) then
            DEBITO = 0;
        if (rtfte IS NULL) then
            rtfte = 0;
        if (rtiva IS NULL) then
            rtiva = 0;
        if (rtica IS NULL) then
            rtica = 0;
        IF (RETES = 'SI') then
            DEBITO = DEBITO - RTFTE - RTIVA - RTICA;
        if (MONEDA = 0) then
            SELECT SUM(MVCL_MONTO), SUM(MVCL_RTEFTE), SUM(MVCL_RTEIVA), SUM(MVCL_RTEICA)  FROM movimiento_clientes WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI
                AND MVCL_FECHA < :FECFIN AND MVCL_DEBITO = 'N'  AND MVCL_ABONO = 'N' AND ((:SUCURSAL = 0) or (SUCU_ID = :SUCURSAL))
                INTO :CREDITO, :RTFTE, :RTIVA, :RTICA;
        ELSE
            SELECT SUM(MVCL_MONTO/MVCL_TRM), SUM(MVCL_RTEFTE/MVCL_TRM), SUM(MVCL_RTEIVA/MVCL_TRM), SUM(MVCL_RTEICA/MVCL_TRM)
                FROM movimiento_clientes WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND ((:MONEDA = 0) or (MVCL_TRM <> 1))
                AND MVCL_FECHA < :FECFIN AND MVCL_DEBITO = 'N'  AND MVCL_ABONO = 'N' AND ((:SUCURSAL = 0) or (SUCU_ID = :SUCURSAL))
                INTO :CREDITO, :RTFTE, :RTIVA, :RTICA;
        if (CREDITO IS NULL) then
            CREDITO = 0;
        if (rtfte IS NULL) then
            rtfte = 0;
        if (rtiva IS NULL) then
            rtiva = 0;
        if (rtica IS NULL) then
            rtica = 0;
        IF (RETES = 'SI') then
            CREDITO = CREDITO - RTFTE - RTIVA - RTICA;
        CARGOS2 = DEBITO - CREDITO;
        if (MONEDA = 0) then
            SELECT SUM(MVCL_MONTO), SUM(MVCL_RTEFTE), SUM(MVCL_RTEIVA), SUM(MVCL_RTEICA)  FROM movimiento_clientes WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI
                AND MVCL_FECHA < :FECFIN AND MVCL_DEBITO = 'N'  AND MVCL_ABONO = 'S' AND ((:SUCURSAL = 0) or (SUCU_ID = :SUCURSAL))
                INTO :CREDITO, :RTFTE, :RTIVA, :RTICA;
        ELSE
            SELECT SUM(MVCL_MONTO/MVCL_TRM), SUM(MVCL_RTEFTE/MVCL_TRM), SUM(MVCL_RTEIVA/MVCL_TRM), SUM(MVCL_RTEICA/MVCL_TRM)
                FROM movimiento_clientes WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND ((:MONEDA = 0) or (MVCL_TRM <> 1))
                AND MVCL_FECHA < :FECFIN AND MVCL_DEBITO = 'N'  AND MVCL_ABONO = 'S' AND ((:SUCURSAL = 0) or (SUCU_ID = :SUCURSAL))
                INTO :CREDITO, :RTFTE, :RTIVA, :RTICA;
        if (CREDITO IS NULL) then
            CREDITO = 0;
        if (rtfte IS NULL) then
            rtfte = 0;
        if (rtiva IS NULL) then
            rtiva = 0;
        if (rtica IS NULL) then
            rtica = 0;
        IF (RETES = 'NO') then
            CREDITO = CREDITO + RTFTE + RTIVA + RTICA;
        ABONOS2 = CREDITO;
        FECINI = FECFIN;
        FECFIN = FECINI + 30;
        if (MONEDA = 0) then
            SELECT SUM(MVCL_MONTO), SUM(MVCL_RTEFTE), SUM(MVCL_RTEIVA), SUM(MVCL_RTEICA)  FROM movimiento_clientes WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI
                AND MVCL_FECHA < :FECFIN AND MVCL_DEBITO = 'S' AND MVCL_ABONO = 'N' AND ((:SUCURSAL = 0) or (SUCU_ID = :SUCURSAL))
                INTO :DEBITO, :RTFTE, :RTIVA, :RTICA;
        ELSE
            SELECT SUM(MVCL_MONTO/MVCL_TRM), SUM(MVCL_RTEFTE/MVCL_TRM), SUM(MVCL_RTEIVA/MVCL_TRM), SUM(MVCL_RTEICA/MVCL_TRM)
                FROM movimiento_clientes WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND ((:MONEDA = 0) or (MVCL_TRM <> 1))
                AND MVCL_FECHA < :FECFIN AND MVCL_DEBITO = 'S' AND MVCL_ABONO = 'N' AND ((:SUCURSAL = 0) or (SUCU_ID = :SUCURSAL))
                INTO :DEBITO, :RTFTE, :RTIVA, :RTICA;
        if (DEBITO IS NULL) then
            DEBITO = 0;
        if (rtfte IS NULL) then
            rtfte = 0;
        if (rtiva IS NULL) then
            rtiva = 0;
        if (rtica IS NULL) then
            rtica = 0;
        IF (RETES = 'SI') then
            DEBITO = DEBITO - RTFTE - RTIVA - RTICA;
        if (MONEDA = 0) then
            SELECT SUM(MVCL_MONTO), SUM(MVCL_RTEFTE), SUM(MVCL_RTEIVA), SUM(MVCL_RTEICA)  FROM movimiento_clientes WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI
                AND MVCL_FECHA < :FECFIN AND MVCL_DEBITO = 'N'  AND MVCL_ABONO = 'N' AND ((:SUCURSAL = 0) or (SUCU_ID = :SUCURSAL))
                INTO :CREDITO, :RTFTE, :RTIVA, :RTICA;
        ELSE
            SELECT SUM(MVCL_MONTO/MVCL_TRM), SUM(MVCL_RTEFTE/MVCL_TRM), SUM(MVCL_RTEIVA/MVCL_TRM), SUM(MVCL_RTEICA/MVCL_TRM)
                FROM movimiento_clientes WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND ((:MONEDA = 0) or (MVCL_TRM <> 1))
                AND MVCL_FECHA < :FECFIN AND MVCL_DEBITO = 'N'  AND MVCL_ABONO = 'N' AND ((:SUCURSAL = 0) or (SUCU_ID = :SUCURSAL))
                INTO :CREDITO, :RTFTE, :RTIVA, :RTICA;
        if (CREDITO IS NULL) then
            CREDITO = 0;
        if (rtfte IS NULL) then
            rtfte = 0;
        if (rtiva IS NULL) then
            rtiva = 0;
        if (rtica IS NULL) then
            rtica = 0;
        IF (RETES = 'SI') then
            CREDITO = CREDITO - RTFTE - RTIVA - RTICA;
        CARGOS1 = DEBITO - CREDITO;
        if (MONEDA = 0) then
            SELECT SUM(MVCL_MONTO), SUM(MVCL_RTEFTE), SUM(MVCL_RTEIVA), SUM(MVCL_RTEICA)  FROM movimiento_clientes WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI
                AND MVCL_FECHA < :FECFIN AND MVCL_DEBITO = 'N'  AND MVCL_ABONO = 'S' AND ((:SUCURSAL = 0) or (SUCU_ID = :SUCURSAL))
                INTO :CREDITO, :RTFTE, :RTIVA, :RTICA;
        ELSE
            SELECT SUM(MVCL_MONTO/MVCL_TRM), SUM(MVCL_RTEFTE/MVCL_TRM), SUM(MVCL_RTEIVA/MVCL_TRM), SUM(MVCL_RTEICA/MVCL_TRM)
                FROM movimiento_clientes WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND ((:MONEDA = 0) or (MVCL_TRM <> 1))
                AND MVCL_FECHA < :FECFIN AND MVCL_DEBITO = 'N'  AND MVCL_ABONO = 'S' AND ((:SUCURSAL = 0) or (SUCU_ID = :SUCURSAL))
                INTO :CREDITO, :RTFTE, :RTIVA, :RTICA;
        if (CREDITO IS NULL) then
            CREDITO = 0;
        if (rtfte IS NULL) then
            rtfte = 0;
        if (rtiva IS NULL) then
            rtiva = 0;
        if (rtica IS NULL) then
            rtica = 0;
        IF (RETES = 'NO') then
            CREDITO = CREDITO + RTFTE + RTIVA + RTICA;
        ABONOS1 = CREDITO;
        FINAL = INICIAL + CARGOS3 + CARGOS2 + CARGOS1 - ABONOS3 - ABONOS2 - ABONOS1;
        SUSPEND;
        END

    if (AGRUPA = 'C') then
        BEGIN
        CARGOS1 = 0;
        ABONOS1 = 0;
        CARGOS2 = 0;
        ABONOS2 = 0;
        CARGOS3 = 0;
        ABONOS3 = 0;
        INICIAL = 0;
        for select distinct cobr_cod from movimiento_clientes
            WHERE TERC_NIT = :NIT AND MVCL_FECHA <= :FECINI AND
            MVCL_ABONO = 'N' AND ((:SUCURSAL = 0) or (SUCU_ID = :SUCURSAL))
            into :codcobr
            do
            BEGIN
            OK = 'N';
            if (GRPINI = '') then
                BEGIN
                if ((CODCOBR IS NULL) or (CODCOBR >= :GRPINI AND CODCOBR <= :GRPFIN)) then
                    OK = 'S';
                END
            ELSE
                if (CODCOBR >= :GRPINI AND CODCOBR <= :GRPFIN) then
                    OK = 'S';
            if (OK = 'S') then
                begin
                SELECT COBR_NOM FROM COBRADORES WHERE COBR_COD = :codcobr INTO :nomcobr;
                FOR SELECT MVCL_TIPOREF, MVCL_IDREF FROM MOVIMIENTO_CLIENTES
                    WHERE TERC_NIT = :NIT AND MVCL_FECHA <= :FECINI AND COBR_COD = :codcobr AND
                    MVCL_ABONO = 'N' AND ((:SUCURSAL = 0) or (SUCU_ID = :SUCURSAL))
                    INTO :TIPODOC, :IDDOC
                    DO
                    BEGIN
                    EXECUTE PROCEDURE saldo_doc_cartera(TIPODOC, IDDOC, FECINI, 0) returning_values (SALDO);
                    INICIAL = INICIAL + SALDO;
                    END
                FECFIN = FECINI + 30;
                if (MONEDA = 0) then
                    SELECT SUM(MVCL_MONTO), SUM(MVCL_RTEFTE), SUM(MVCL_RTEIVA), SUM(MVCL_RTEICA) FROM movimiento_clientes WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND
                        MVCL_FECHA < :FECFIN AND MVCL_DEBITO = 'S' AND MVCL_ABONO = 'N' AND COBR_COD = :codcobr AND ((:SUCURSAL = 0) or (SUCU_ID = :SUCURSAL))
                        INTO :DEBITO, :RTFTE, :RTIVA, :RTICA;
                ELSE
                    SELECT SUM(MVCL_MONTO/MVCL_TRM), SUM(MVCL_RTEFTE/MVCL_TRM), SUM(MVCL_RTEIVA/MVCL_TRM), SUM(MVCL_RTEICA/MVCL_TRM)
                        FROM movimiento_clientes WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND ((:MONEDA = 0) or (MVCL_TRM <> 1)) AND
                        MVCL_FECHA < :FECFIN AND MVCL_DEBITO = 'S' AND MVCL_ABONO = 'N' AND COBR_COD = :codcobr AND ((:SUCURSAL = 0) or (SUCU_ID = :SUCURSAL))
                        INTO :DEBITO, :RTFTE, :RTIVA, :RTICA;
                if (DEBITO IS NULL) then
                    DEBITO = 0;
                if (rtfte IS NULL) then
                    rtfte = 0;
                if (rtiva IS NULL) then
                    rtiva = 0;
                if (rtica IS NULL) then
                    rtica = 0;
                IF (RETES = 'SI') then
                    DEBITO = DEBITO - RTFTE - RTIVA - RTICA;
                if (MONEDA = 0) then
                    SELECT SUM(MVCL_MONTO), SUM(MVCL_RTEFTE), SUM(MVCL_RTEIVA), SUM(MVCL_RTEICA) FROM movimiento_clientes WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI
                        AND MVCL_FECHA < :FECFIN AND MVCL_DEBITO = 'N'  AND MVCL_ABONO = 'N' AND COBR_COD = :codcobr AND ((:SUCURSAL = 0) or (SUCU_ID = :SUCURSAL))
                        INTO :CREDITO, :RTFTE, :RTIVA, :RTICA;
                ELSE
                    SELECT SUM(MVCL_MONTO/MVCL_TRM), SUM(MVCL_RTEFTE/MVCL_TRM), SUM(MVCL_RTEIVA/MVCL_TRM), SUM(MVCL_RTEICA/MVCL_TRM)
                        FROM movimiento_clientes WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND ((:MONEDA = 0) or (MVCL_TRM <> 1)) 
                        AND MVCL_FECHA < :FECFIN AND MVCL_DEBITO = 'N'  AND MVCL_ABONO = 'N' AND COBR_COD = :codcobr AND ((:SUCURSAL = 0) or (SUCU_ID = :SUCURSAL))
                        INTO :CREDITO, :RTFTE, :RTIVA, :RTICA;
                if (CREDITO IS NULL) then
                    CREDITO = 0;
                if (rtfte IS NULL) then
                    rtfte = 0;
                if (rtiva IS NULL) then
                    rtiva = 0;
                if (rtica IS NULL) then
                    rtica = 0;
                IF (RETES = 'SI') then
                    CREDITO = CREDITO - RTFTE - RTIVA - RTICA;
                CARGOS3 = DEBITO - CREDITO;
                if (MONEDA = 0) then
                    SELECT SUM(MVCL_MONTO), SUM(MVCL_RTEFTE), SUM(MVCL_RTEIVA), SUM(MVCL_RTEICA) FROM movimiento_clientes WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI
                        AND MVCL_FECHA < :FECFIN AND MVCL_DEBITO = 'N' AND MVCL_ABONO = 'S' AND COBR_COD = :codcobr AND ((:SUCURSAL = 0) or (SUCU_ID = :SUCURSAL))
                        INTO :CREDITO, :RTFTE, :RTIVA, :RTICA;
                ELSE
                    SELECT SUM(MVCL_MONTO/MVCL_TRM), SUM(MVCL_RTEFTE/MVCL_TRM), SUM(MVCL_RTEIVA/MVCL_TRM), SUM(MVCL_RTEICA/MVCL_TRM)
                        FROM movimiento_clientes WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND ((:MONEDA = 0) or (MVCL_TRM <> 1)) 
                        AND MVCL_FECHA < :FECFIN AND MVCL_DEBITO = 'N' AND MVCL_ABONO = 'S' AND COBR_COD = :codcobr AND ((:SUCURSAL = 0) or (SUCU_ID = :SUCURSAL))
                        INTO :CREDITO, :RTFTE, :RTIVA, :RTICA;
                if (CREDITO IS NULL) then
                    CREDITO = 0;
                if (rtfte IS NULL) then
                    rtfte = 0;
                if (rtiva IS NULL) then
                    rtiva = 0;
                if (rtica IS NULL) then
                    rtica = 0;
                IF (RETES = 'NO') then
                    CREDITO = CREDITO + RTFTE + RTIVA + RTICA;
                ABONOS3 = CREDITO;
                FECINI = FECFIN;
                FECFIN = FECINI + 30;
                if (MONEDA = 0) then
                    SELECT SUM(MVCL_MONTO), SUM(MVCL_RTEFTE), SUM(MVCL_RTEIVA), SUM(MVCL_RTEICA) FROM movimiento_clientes WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI
                        AND MVCL_FECHA < :FECFIN AND MVCL_DEBITO = 'S' AND MVCL_ABONO = 'N' AND COBR_COD = :codcobr AND ((:SUCURSAL = 0) or (SUCU_ID = :SUCURSAL))
                        INTO :DEBITO, :RTFTE, :RTIVA, :RTICA;
                ELSE
                    SELECT SUM(MVCL_MONTO/MVCL_TRM), SUM(MVCL_RTEFTE/MVCL_TRM), SUM(MVCL_RTEIVA/MVCL_TRM), SUM(MVCL_RTEICA/MVCL_TRM)
                        FROM movimiento_clientes WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND ((:MONEDA = 0) or (MVCL_TRM <> 1)) 
                        AND MVCL_FECHA < :FECFIN AND MVCL_DEBITO = 'S' AND MVCL_ABONO = 'N' AND COBR_COD = :codcobr AND ((:SUCURSAL = 0) or (SUCU_ID = :SUCURSAL))
                        INTO :DEBITO, :RTFTE, :RTIVA, :RTICA;
                if (DEBITO IS NULL) then
                    DEBITO = 0;
                if (rtfte IS NULL) then
                    rtfte = 0;
                if (rtiva IS NULL) then
                    rtiva = 0;
                if (rtica IS NULL) then
                    rtica = 0;
                IF (RETES = 'SI') then
                    DEBITO = DEBITO - RTFTE - RTIVA - RTICA;
                if (MONEDA = 0) then
                    SELECT SUM(MVCL_MONTO), SUM(MVCL_RTEFTE), SUM(MVCL_RTEIVA), SUM(MVCL_RTEICA) FROM movimiento_clientes WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI
                        AND MVCL_FECHA < :FECFIN AND MVCL_DEBITO = 'N'  AND MVCL_ABONO = 'N' AND COBR_COD = :codcobr AND ((:SUCURSAL = 0) or (SUCU_ID = :SUCURSAL))
                        INTO :CREDITO, :RTFTE, :RTIVA, :RTICA;
                ELSE
                    SELECT SUM(MVCL_MONTO/MVCL_TRM), SUM(MVCL_RTEFTE/MVCL_TRM), SUM(MVCL_RTEIVA/MVCL_TRM), SUM(MVCL_RTEICA/MVCL_TRM)
                        FROM movimiento_clientes WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND ((:MONEDA = 0) or (MVCL_TRM <> 1)) 
                        AND MVCL_FECHA < :FECFIN AND MVCL_DEBITO = 'N'  AND MVCL_ABONO = 'N' AND COBR_COD = :codcobr AND ((:SUCURSAL = 0) or (SUCU_ID = :SUCURSAL))
                        INTO :CREDITO, :RTFTE, :RTIVA, :RTICA;
                if (CREDITO IS NULL) then
                    CREDITO = 0;
                if (rtfte IS NULL) then
                    rtfte = 0;
                if (rtiva IS NULL) then
                    rtiva = 0;
                if (rtica IS NULL) then
                    rtica = 0;
                IF (RETES = 'SI') then
                    CREDITO = CREDITO - RTFTE - RTIVA - RTICA;
                CARGOS2 = DEBITO - CREDITO;
                if (MONEDA = 0) then
                    SELECT SUM(MVCL_MONTO), SUM(MVCL_RTEFTE), SUM(MVCL_RTEIVA), SUM(MVCL_RTEICA) FROM movimiento_clientes WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI
                        AND MVCL_FECHA < :FECFIN AND MVCL_DEBITO = 'N'  AND MVCL_ABONO = 'S' AND COBR_COD = :codcobr AND ((:SUCURSAL = 0) or (SUCU_ID = :SUCURSAL))
                        INTO :CREDITO, :RTFTE, :RTIVA, :RTICA;
                ELSE
                    SELECT SUM(MVCL_MONTO/MVCL_TRM), SUM(MVCL_RTEFTE/MVCL_TRM), SUM(MVCL_RTEIVA/MVCL_TRM), SUM(MVCL_RTEICA/MVCL_TRM)
                        FROM movimiento_clientes WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND ((:MONEDA = 0) or (MVCL_TRM <> 1)) 
                        AND MVCL_FECHA < :FECFIN AND MVCL_DEBITO = 'N'  AND MVCL_ABONO = 'S' AND COBR_COD = :codcobr AND ((:SUCURSAL = 0) or (SUCU_ID = :SUCURSAL))
                        INTO :CREDITO, :RTFTE, :RTIVA, :RTICA;
                if (CREDITO IS NULL) then
                    CREDITO = 0;
                if (rtfte IS NULL) then
                    rtfte = 0;
                if (rtiva IS NULL) then
                    rtiva = 0;
                if (rtica IS NULL) then
                    rtica = 0;
                IF (RETES = 'NO') then
                    CREDITO = CREDITO + RTFTE + RTIVA + RTICA;
                ABONOS2 = CREDITO;
                FECINI = FECFIN;
                FECFIN = FECINI + 30;
                if (MONEDA = 0) then
                    SELECT SUM(MVCL_MONTO), SUM(MVCL_RTEFTE), SUM(MVCL_RTEIVA), SUM(MVCL_RTEICA) FROM movimiento_clientes WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI
                        AND MVCL_FECHA < :FECFIN AND MVCL_DEBITO = 'S' AND MVCL_ABONO = 'N' AND COBR_COD = :codcobr AND ((:SUCURSAL = 0) or (SUCU_ID = :SUCURSAL))
                        INTO :DEBITO, :RTFTE, :RTIVA, :RTICA;
                ELSE
                    SELECT SUM(MVCL_MONTO/MVCL_TRM), SUM(MVCL_RTEFTE/MVCL_TRM), SUM(MVCL_RTEIVA/MVCL_TRM), SUM(MVCL_RTEICA/MVCL_TRM)
                        FROM movimiento_clientes WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND ((:MONEDA = 0) or (MVCL_TRM <> 1)) 
                        AND MVCL_FECHA < :FECFIN AND MVCL_DEBITO = 'S' AND MVCL_ABONO = 'N' AND COBR_COD = :codcobr AND ((:SUCURSAL = 0) or (SUCU_ID = :SUCURSAL))
                        INTO :DEBITO, :RTFTE, :RTIVA, :RTICA;
                if (DEBITO IS NULL) then
                    DEBITO = 0;
                if (rtfte IS NULL) then
                    rtfte = 0;
                if (rtiva IS NULL) then
                    rtiva = 0;
                if (rtica IS NULL) then
                    rtica = 0;
                IF (RETES = 'SI') then
                    DEBITO = DEBITO - RTFTE - RTIVA - RTICA;
                if (MONEDA = 0) then
                    SELECT SUM(MVCL_MONTO), SUM(MVCL_RTEFTE), SUM(MVCL_RTEIVA), SUM(MVCL_RTEICA) FROM movimiento_clientes WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI
                        AND MVCL_FECHA < :FECFIN AND MVCL_DEBITO = 'N'  AND MVCL_ABONO = 'N' AND COBR_COD = :codcobr AND ((:SUCURSAL = 0) or (SUCU_ID = :SUCURSAL))
                        INTO :CREDITO, :RTFTE, :RTIVA, :RTICA;
                ELSE
                    SELECT SUM(MVCL_MONTO/MVCL_TRM), SUM(MVCL_RTEFTE/MVCL_TRM), SUM(MVCL_RTEIVA/MVCL_TRM), SUM(MVCL_RTEICA/MVCL_TRM)
                        FROM movimiento_clientes WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND ((:MONEDA = 0) or (MVCL_TRM <> 1)) 
                        AND MVCL_FECHA < :FECFIN AND MVCL_DEBITO = 'N'  AND MVCL_ABONO = 'N' AND COBR_COD = :codcobr AND ((:SUCURSAL = 0) or (SUCU_ID = :SUCURSAL))
                        INTO :CREDITO, :RTFTE, :RTIVA, :RTICA;
                if (CREDITO IS NULL) then
                    CREDITO = 0;
                if (rtfte IS NULL) then
                    rtfte = 0;
                if (rtiva IS NULL) then
                    rtiva = 0;
                if (rtica IS NULL) then
                    rtica = 0;
                IF (RETES = 'SI') then
                    CREDITO = CREDITO - RTFTE - RTIVA - RTICA;
                CARGOS1 = DEBITO - CREDITO;
                if (MONEDA = 0) then
                    SELECT SUM(MVCL_MONTO), SUM(MVCL_RTEFTE), SUM(MVCL_RTEIVA), SUM(MVCL_RTEICA) FROM movimiento_clientes WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI
                        AND MVCL_FECHA < :FECFIN AND MVCL_DEBITO = 'N'  AND MVCL_ABONO = 'S' AND COBR_COD = :codcobr AND ((:SUCURSAL = 0) or (SUCU_ID = :SUCURSAL))
                        INTO :CREDITO, :RTFTE, :RTIVA, :RTICA;
                ELSE
                    SELECT SUM(MVCL_MONTO/MVCL_TRM), SUM(MVCL_RTEFTE/MVCL_TRM), SUM(MVCL_RTEIVA/MVCL_TRM), SUM(MVCL_RTEICA/MVCL_TRM)
                        FROM movimiento_clientes WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND ((:MONEDA = 0) or (MVCL_TRM <> 1)) 
                        AND MVCL_FECHA < :FECFIN AND MVCL_DEBITO = 'N'  AND MVCL_ABONO = 'S' AND COBR_COD = :codcobr AND ((:SUCURSAL = 0) or (SUCU_ID = :SUCURSAL))
                        INTO :CREDITO, :RTFTE, :RTIVA, :RTICA;
                if (CREDITO IS NULL) then
                    CREDITO = 0;
                if (rtfte IS NULL) then
                    rtfte = 0;
                if (rtiva IS NULL) then
                    rtiva = 0;
                if (rtica IS NULL) then
                    rtica = 0;
                IF (RETES = 'NO') then
                    CREDITO = CREDITO + RTFTE + RTIVA + RTICA;
                ABONOS1 = CREDITO;
                FINAL = INICIAL + CARGOS3 + CARGOS2 + CARGOS1 - ABONOS3 - ABONOS2 - ABONOS1;
                SUSPEND;
                END
            END
        END
    END
END
^

SET TERM ; ^


/* 20081215 RANGO DE MARCAS */

SET TERM ^ ;

CREATE OR ALTER PROCEDURE REP_DISPONIBILIDAD(
    FECHA DATE,
    ARTINI VARCHAR(20),
    ARTFIN VARCHAR(20),
    GRPINI VARCHAR(3),
    GRPFIN VARCHAR(3),
    ORDEN CHAR(1),
    CEROS CHAR(1),
    DETALLE CHAR(1),
    AGRUPA CHAR(1),
    SUCURSAL INTEGER)
RETURNS (
    CODIGO VARCHAR(15),
    NOMBRE VARCHAR(60),
    UNIDAD VARCHAR(8),
    CODGRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    CODSUBG VARCHAR(3),
    NOMSUBG VARCHAR(30),
    CODMARC VARCHAR(3),
    NOMMARC VARCHAR(30),
    CODBOD VARCHAR(2),
    NOMBOD VARCHAR(30),
    EXIST NUMERIC(18,4),
    PROMEDIO NUMERIC(18,4),
    SALIDAS NUMERIC(18,4),
    DISPONIBILIDAD INTEGER,
    DIAS INTEGER,
    PROMEDIADO INTEGER,
    COSTO NUMERIC(18,2),
    COSTOPRO NUMERIC(18,2),
    SUGERIDO NUMERIC(18,4),
    FECCOMPRA DATE)
AS
DECLARE VARIABLE CODINI VARCHAR(20);
DECLARE VARIABLE CODFIN VARCHAR(20);
DECLARE VARIABLE DESINI VARCHAR(20);
DECLARE VARIABLE DESFIN VARCHAR(20);
DECLARE VARIABLE MARINI VARCHAR(20);
DECLARE VARIABLE MARFIN VARCHAR(20);
declare variable DIASC VARCHAR(255);
declare variable DIA_ART VARCHAR(2) CHARACTER SET NONE;
BEGIN
if (ORDEN = 'C') then
    BEGIN
    CODINI = ARTINI;
    CODFIN = ARTFIN;
    DESINI = '';
    DESFIN = 'zz';
    END
ELSE
    BEGIN
    DESINI = ARTINI;
    DESFIN = ARTFIN;
    CODINI = '';
    CODFIN = 'zz';
    END
if (AGRUPA = 'G') then
    BEGIN
    MARINI = '';
    MARFIN = 'zz';
    END
ELSE
    if (AGRUPA = 'M') then
        BEGIN
        MARINI = GRPINI;
        MARFIN = GRPFIN;
        GRPINI = '';
        GRPFIN = 'zz';
        END
if (DETALLE = 'S') then
  BEGIN
  FOR SELECT ARTI_COD, ARTI_DES, ARTI_UNIDAD, ARTI_DIAS, A.GRUP_COD, GRUP_NOM, A.SUBG_COD, A.MARC_COD, BODE_COD, BODE_NOM, ARTI_DIANALIS
      FROM ARTICULO A, GRUPO G, BODEGA B
      WHERE ARTI_COD >= :CODINI AND ARTI_COD <= :CODFIN AND A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :GRPFIN AND ARTI_DES >= :DESINI AND ARTI_DES <= :DESFIN AND
      G.GRUP_COD = A.GRUP_COD AND A.ESAR_COD <> 'I' AND ((SUCU_ID = :SUCURSAL) or (:SUCURSAL = 0)) AND
      (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN)))
      INTO :CODIGO, :NOMBRE, :UNIDAD, :DIAS, :CODGRUPO, :NOMGRUPO, :CODSUBG, :CODMARC, :CODBOD, :NOMBOD, :PROMEDIADO
      DO
        BEGIN
        NOMMARC = '';
        NOMSUBG = '';
        SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO :NOMMARC;
        SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
        EXECUTE PROCEDURE ultimo_costo(:CODIGO, :FECHA, :UNIDAD) returning_values (:COSTO);
        EXECUTE PROCEDURE costo_promedio(:CODIGO, :FECHA) RETURNING_VALUES :costopro;
        EXECUTE PROCEDURE DISPONIBILIDAD_ARTICULO(CODIGO, FECHA, :CODBOD) returning_values (:DISPONIBILIDAD, :EXIST, :PROMEDIO, :SALIDAS);
        /*ESTABLECER CUAL ES EL VALOR DE DIAS PARA PROMEDIO*/
        EXECUTE PROCEDURE lee_configuracion ('INVENTARIO', 'EXISTENCIAS', 'PROMEDIAR LAS SALIDAS DEL INVENTARIO CON EL NUMERO DE DIAS ASIGNADO A CADA ARTICULO') returning_values (:DIA_ART);
        if (DIA_ART = 'NO') then
          BEGIN
            EXECUTE PROCEDURE lee_configuracion ('INVENTARIO', 'EXISTENCIAS', 'NUMERO DE DIAS PARA PROMEDIO DE SALIDAS POR ARTICULO') returning_values (DIASC);
            PROMEDIADO = CAST(DIASC AS INTEGER);
          END
        if ((DISPONIBILIDAD < DIAS) and (PROMEDIO > 0))then
            SUGERIDO = (DIAS * PROMEDIO) - EXIST;
        ELSE
            SUGERIDO = 0;
        SELECT MAX(FACO_FECHA) FROM FACTURAS_COMPRA F, FACTURAS_COMPRAS_DETALLE D
            WHERE F.FACO_ID = D.faco_id AND D.ARTI_COD = :CODIGO AND FACO_FECHA <= :FECHA AND D.bode_cod = :codbod
            INTO :FECCOMPRA;
        if ((PROMEDIO > 0) or (EXIST <> 0) or (CEROS = 'S')) then
            SUSPEND;
        END
  END
ELSE
  BEGIN
  FOR SELECT ARTI_COD, ARTI_DES, ARTI_UNIDAD, ARTI_DIAS, A.GRUP_COD, GRUP_NOM, A.SUBG_COD, A.MARC_COD, ARTI_DIANALIS
      FROM ARTICULO A, GRUPO G
      WHERE ARTI_COD >= :CODINI AND ARTI_COD <= :CODFIN AND A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :GRPFIN AND ARTI_DES >= :DESINI AND ARTI_DES <= :DESFIN AND G.GRUP_COD = A.GRUP_COD AND
      A.ESAR_COD <> 'I' AND (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN)))
      INTO :CODIGO, :NOMBRE, :UNIDAD, :DIAS, :CODGRUPO, :NOMGRUPO, :CODSUBG, :CODMARC, :PROMEDIADO
      DO
        BEGIN
        NOMMARC = '';
        NOMSUBG = '';
        SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO :NOMMARC;
        SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
        EXECUTE PROCEDURE costo_promedio(:CODIGO, :FECHA) RETURNING_VALUES :costopro;
        EXECUTE PROCEDURE ultimo_costo(:CODIGO, :FECHA, :UNIDAD) returning_values (:COSTO);
        EXECUTE PROCEDURE DISPONIBILIDAD_TOTAL_ARTICULO(CODIGO, FECHA) returning_values (:DISPONIBILIDAD, :EXIST, :PROMEDIO, :SALIDAS);
        /*ESTABLECER CUAL ES EL VALOR DE DIAS PARA PROMEDIO*/
        EXECUTE PROCEDURE lee_configuracion ('INVENTARIO', 'EXISTENCIAS', 'PROMEDIAR LAS SALIDAS DEL INVENTARIO CON EL NUMERO DE DIAS ASIGNADO A CADA ARTICULO') returning_values (:DIA_ART);
        if (DIA_ART = 'NO') then
          BEGIN
            EXECUTE PROCEDURE lee_configuracion ('INVENTARIO', 'EXISTENCIAS', 'NUMERO DE DIAS PARA PROMEDIO DE SALIDAS POR ARTICULO') returning_values (DIASC);
            PROMEDIADO = CAST(DIASC AS INTEGER);
          END
        if ((DISPONIBILIDAD < DIAS) and (PROMEDIO > 0))then
            SUGERIDO = (DIAS * PROMEDIO) - EXIST;
        ELSE
            SUGERIDO = 0;
        SELECT MAX(FACO_FECHA) FROM FACTURAS_COMPRA F, FACTURAS_COMPRAS_DETALLE D
            WHERE F.FACO_ID = D.faco_id AND D.ARTI_COD = :CODIGO AND FACO_FECHA <= :FECHA
            INTO :FECCOMPRA;
        if ((PROMEDIO > 0) or (EXIST <> 0) or (CEROS = 'S')) then
            SUSPEND;
        END
  END
END
^

SET TERM ; ^



/* 20081216 ZIMPLANT: PRECIOS COMUNES A TODAS LAS AGENCIAS */

INSERT INTO CONFIGURACION (CONF_MODULO, CONF_CATEGORIA, CONF_PROPIEDAD, CONF_VALOR, CONF_POSIBLES, CONF_AYUDA) VALUES ('FACTURACION', 'DOCUMENTOS', 'FILTRAR LISTAS DE PRECIOS POR AGENCIA', 'SI', 'SI,NO', 'SI: Una agencia solo podrá usar las listas de precios asignadas a ella. NO: Todas las listas de precios son comunes a todas las agencias');
commit work;

SET TERM ^ ;

CREATE OR ALTER PROCEDURE LISTAS_ARTICULO(
    ARTICULO VARCHAR(15),
    FECHA DATE,
    DIAS INTEGER,
    TODAS CHAR(1),
    HORA TIME,
    AGENCIA INTEGER)
RETURNS (
    NOMLISTA VARCHAR(30),
    CODLISTA INTEGER,
    IVAINC CHAR(1))
AS
declare variable FECINI DATE;
declare variable FECFIN DATE;
declare variable DIA smallint;
declare variable DIASEM smallint;
declare variable HORAINI time;
declare variable HORAFIN time;
declare variable SUCID INTEGER;
declare variable PORAGENCIA CHAR(2);
BEGIN
execute procedure lee_configuracion ('FACTURACION', 'DOCUMENTOS', 'FILTRAR LISTAS DE PRECIOS POR AGENCIA') returning_values (:poragencia);
if (TODAS = 'N') then
    begin
    DIA = EXTRACT(weekday FROM FECHA) + 1;
    /* Busque las listas validas hoy */
    FOR SELECT L.LIPR_COD, LIPR_NOM, LIPR_FECINI, LIPR_FECFIN, LIPR_MODIF, LIPR_DIASEM, LIPR_HORAINI, LIPR_HORAFIN, SUCU_ID
        FROM LISTA_PRECIOS L, PRECIOS_ARTICULO P
        WHERE L.LIPR_COD = P.LIPR_COD AND ARTI_COD = :ARTICULO AND
            ((LIPR_DIASMAX IS NULL) or (LIPR_DIASMAX >= :DIAS))
        INTO :CODLISTA, :NOMLISTA, :FECINI, :FECFIN, :IVAINC, :DIASEM, :HORAINI, :HORAFIN, :SUCID
        DO
          if (FECINI is null) then
            if ((PORAGENCIA = 'NO') OR ((:AGENCIA = 0) or (:SUCID = :AGENCIA))) THEN
              SUSPEND;
          else
            if ((FECINI <= :FECHA) AND (FECFIN >= :FECHA) AND (HORAINI <= HORA) AND (HORAFIN >= HORA) AND ((DIASEM = 0) or (DIA = DIASEM)))  Then
                if ((PORAGENCIA = 'NO') OR ((:AGENCIA = 0) or (:SUCID = :AGENCIA))) THEN
                    SUSPEND;
      end
  ELSE
      FOR SELECT L.LIPR_COD, LIPR_NOM, LIPR_MODIF, SUCU_ID
        FROM LISTA_PRECIOS L, PRECIOS_ARTICULO P
        WHERE L.LIPR_COD = P.LIPR_COD AND ARTI_COD = :ARTICULO
        INTO :CODLISTA, :NOMLISTA, :IVAINC, :SUCID
        DO
        if ((PORAGENCIA = 'NO') OR ((:AGENCIA = 0) or (:SUCID = :AGENCIA))) THEN
          SUSPEND;
END
^

SET TERM ; ^


/* 20081216B ENSAMBLES CON OPERARIO, MAQUINA Y ARTICULO SOBRANTE */

ALTER TABLE ARTICULO
ADD ARTI_PRODCANT T_BOOLEANO;
ALTER TABLE ENSAMBLES
ADD ENSA_CODRETAL T_COD_ARTICULO;
ALTER TABLE ENSAMBLES
ADD ENSA_CANTRETAL T_CANTIDAD;

CREATE TABLE ENSAMBLE_OPERARIO (
    ENOP_ID T_ID NOT NULL,
    ENOP_NOMBRE T_CONCEPTO);
alter table ENSAMBLE_OPERARIO
add constraint PK_ENSAMBLE_OPERARIO
primary key (ENOP_ID);
CREATE TABLE ENSAMBLE_MAQUINA (
    ENMA_ID T_ID NOT NULL,
    ENMA_NOMBRE T_CONCEPTO);
alter table ENSAMBLE_MAQUINA
add constraint PK_ENSAMBLE_MAQUINA
primary key (ENMA_ID);
ALTER TABLE ENSAMBLES
ADD ENSA_OPER T_ID;
ALTER TABLE ENSAMBLES
ADD ENSA_MAQUINA T_ID;
ALTER TABLE ENSAMBLES
ADD ENSA_PESO T_CANTIDAD;

UPDATE ARTICULO SET ARTI_PRODCANT = 'N';
COMMIT WORK;

SET TERM ^ ;

CREATE OR ALTER TRIGGER ENSAMBLES_AI FOR ENSAMBLES
ACTIVE AFTER INSERT POSITION 0
AS
declare variable COSTO NUMERIC(18,2);
BEGIN
if ((NEW.ENSA_id <> 0) and (new.ensa_anulado = 'N')) then
  begin
  COSTO = new.ensa_costo / NEW.ensa_factor;
  INSERT INTO MOVIMIENTO_ARTICULO
    (ARTI_COD, MVAR_CONS, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM)
    VALUES(NEW.ARTI_COD, GEN_ID(ID_MOVARTI,1), new.bode_cod, new.ensa_fecha, 15, NEW.ensa_id,
    new.ensa_conc, NEW.ensa_factor * new.ensa_cant, :COSTO, 'S', new.ensa_lote, new.pref_pre, new.ensa_numero, 0);

  /* RECORRA LAS LISTAS DE PRECIOS Y CAMBIE EL PRECIO */
  EXECUTE PROCEDURE CALCULA_PRECIOS(NEW.ARTI_COD, new.ensa_fecha);

  /* ingrese el retal */
  if ((new.ensa_codretal is not null) and (new.ensa_codretal <> '')) then
      INSERT INTO MOVIMIENTO_ARTICULO
        (ARTI_COD, MVAR_CONS, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM)
        VALUES(NEW.ensa_codretal, GEN_ID(ID_MOVARTI,1), new.bode_cod, new.ensa_fecha, 15, NEW.ensa_id,
        new.ensa_conc, new.ensa_cantretal, :COSTO, 'S', new.ensa_lote, new.pref_pre, new.ensa_numero, 999);

  INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
    VALUES (USER, 15, NEW.ensa_id, 'I', NEW.pref_pre || NEW.ensa_numero);
  end
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER ENSAMBLES_AD FOR ENSAMBLES
ACTIVE AFTER DELETE POSITION 0
AS
declare variable consec INTEGER;
BEGIN
delete from movimiento_articulo where (mvar_tipodoc = 15) and (mvar_idref = old.ensa_id) and (mvar_item = 0);
delete from movimiento_articulo where (mvar_tipodoc = 15) and (mvar_idref = old.ensa_id) and (mvar_item = 999);
select enco_consec from comprobante_encabezado where enco_tiporef = 15 and enco_idref = old.ensa_id into :consec;
if (NOT consec is null) then
 delete from comprobante_detalle where enco_consec = :consec;
delete from comprobante_encabezado where enco_tiporef = 15 and enco_idref = old.ensa_id;

INSERT INTO AUDITORIA (AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
    VALUES (USER, 15, old.ensa_id, 'D', old.pref_pre || old.ensa_numero);
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER ENSAMBLES_AU FOR ENSAMBLES
ACTIVE AFTER UPDATE POSITION 0
AS
declare variable COSTO NUMERIC(18,2);
declare variable consec INTEGER;
BEGIN
/* BORRE LA CONTABILIZACION */
if (NEW.ensa_anulado = 'S') then
    BEGIN
    select enco_consec from comprobante_encabezado where enco_tiporef = 15 and enco_idref = old.ensa_id into :consec;
    if (NOT consec is null) then
     delete from comprobante_detalle where enco_consec = :consec;
    delete from comprobante_encabezado where enco_tiporef = 15 and enco_idref = old.ensa_id;
    INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
        VALUES (USER, 15, NEW.ensa_id, 'A', NEW.pref_pre || NEW.ensa_numero);
    END

/* BORRE EL ANTERIOR Y GRABE EL NUEVO */
if ((OLD.ensa_id <> 0) AND (OLD.ensa_anulado = 'N')) then
    begin
    delete from movimiento_articulo where (mvar_tipodoc = 15) and (mvar_idref = old.ensa_id) and (mvar_item = 0);
    delete from movimiento_articulo where (mvar_tipodoc = 15) and (mvar_idref = old.ensa_id) and (mvar_item = 999);
    end
if ((new.ensa_id <> 0) AND (NEW.ensa_anulado = 'N')) then
    begin
    COSTO = new.ensa_costo / NEW.ensa_factor;
    INSERT INTO MOVIMIENTO_ARTICULO
        (ARTI_COD, MVAR_CONS, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM)
        VALUES(NEW.ARTI_COD, GEN_ID(ID_MOVARTI,1), new.bode_cod, new.ensa_fecha, 15, NEW.ensa_id,
        new.ensa_conc, NEW.ensa_factor * new.ensa_cant, :COSTO, 'S', new.ensa_lote, new.pref_pre, new.ensa_numero, 0);

    /* RECORRA LAS LISTAS DE PRECIOS Y CAMBIE EL PRECIO */
    EXECUTE PROCEDURE CALCULA_PRECIOS(NEW.ARTI_COD, new.ensa_fecha);

    /* ingrese el retal */
    if ((new.ensa_codretal is not null) and (new.ensa_codretal <> '')) then
      INSERT INTO MOVIMIENTO_ARTICULO
        (ARTI_COD, MVAR_CONS, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM)
        VALUES(NEW.ensa_codretal, GEN_ID(ID_MOVARTI,1), new.bode_cod, new.ensa_fecha, 15, NEW.ensa_id,
        new.ensa_conc, new.ensa_cantretal, :COSTO, 'S', new.ensa_lote, new.pref_pre, new.ensa_numero, 999);

    INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
        VALUES (USER, 15, NEW.ensa_id, 'U', NEW.pref_pre || NEW.ensa_numero);
    end
/* SI CAMBIO LA FECHA ACTUALICE LOS DETALLES */
if ((OLD.pref_pre <> NEW.pref_pre) or
    (OLD.ensa_numero <> NEW.ensa_numero) or
    (OLD.ensa_fecha <> NEW.ensa_fecha) ) then
    UPDATE ENSAMBLES_DETALLE SET ESDE_TRANSMIT = 'N' WHERE ENSA_ID = OLD.ENSA_ID;

if (OLD.ensa_anulado <> NEW.ensa_anulado) then
    UPDATE ENSAMBLES_DETALLE SET ESDE_ANULADO = NEW.ensa_anulado WHERE ENSA_ID = OLD.ENSA_ID;

if (OLD.ensa_transmit <> NEW.ensa_transmit) then
    UPDATE ENSAMBLES_DETALLE SET ESDE_TRANSMIT = NEW.ensa_transmit WHERE ENSA_ID = OLD.ENSA_ID;
END
^

SET TERM ; ^

grant ALL ON ENSAMBLE_MAQUINA TO PUBLIC ;
grant ALL ON ENSAMBLE_OPERARIO TO PUBLIC ;

/* 20081217  bases e ivas en nulo hacen que el total por fecha se pierda */

SET TERM ^ ;

CREATE OR ALTER PROCEDURE IMPUESTOS_VENTAS(
    FECINI DATE,
    FECFIN DATE,
    PREFIJO VARCHAR(4),
    PTOINI INTEGER,
    PTOFIN INTEGER,
    ANULADOS CHAR(1),
    SUBEMPRESA INTEGER)
RETURNS (
    TIPO INTEGER,
    NOMTIPO VARCHAR(30),
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    NIT VARCHAR(20),
    NOMTERCERO VARCHAR(60),
    SUBTOTAL NUMERIC(18,2),
    DTOMONTO NUMERIC(18,2),
    ADICIONAL NUMERIC(18,2),
    IVAMONTO NUMERIC(18,2),
    CONSUMO NUMERIC(18,2),
    EXENTOS NUMERIC(18,2),
    GRAVADOS1 NUMERIC(18,2),
    GRAVADOS2 NUMERIC(18,2),
    GRAVADOS3 NUMERIC(18,2),
    IVA1 NUMERIC(18,2),
    IVA2 NUMERIC(18,2),
    IVA3 NUMERIC(18,2),
    EXTRA NUMERIC(18,2),
    TOTAL NUMERIC(18,2),
    RTFTEMONTO NUMERIC(18,2),
    RTIVAMONTO NUMERIC(18,2),
    RTICAMONTO 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);
BEGIN
/* FACTURA */
TIPO = 31;
SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 31 INTO :NOMTIPO;

FOR SELECT FACT_ID, F.PREF_PRE, FACT_NUMERO, FACT_FECHA, TERC_NIT, FACT_NOMCLIENTE, FACT_ADICIONAL-FACT_DTOMONTO, FACT_IVAMONTO, FACT_RTFTEMONTO, FACT_RTIVAMONTO, FACT_RTICAMONTO, FACT_EXTRA, FACT_TOTAL, FACT_ANULADO
    FROM FACTURAS F, PREFIJOS PR WHERE PTVT_ID >= :PTOINI AND PTVT_ID <= :PTOFIN AND
    FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND ((:PREFIJO = '') or (:PREFIJO IS NULL) or (F.PREF_PRE = :PREFIJO))
    AND PR.PREF_PRE = F.PREF_PRE AND PR.TIDO_COD = 31 AND ((PR.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
    ORDER BY FACT_FECHA, F.PREF_PRE, FACT_NUMERO
    INTO :ID, :PREF, :NUMERO, :FECHA, :NIT, :NOMTERCERO, :DTOMONTO, :IVAMONTO, :RTFTEMONTO, :RTIVAMONTO, :RTICAMONTO, :EXTRA, :TOTAL, :ANULADO
    DO
    BEGIN
    SELECT TERC_EXENTO FROM TERCEROS WHERE TERC_NIT = :NIT INTO :TER_EXENTO;
    if ((ANULADOS = 'S') or (ANULADO = 'N')) then
        BEGIN
        if (ANULADO = 'S') then
            BEGIN
            EXENTOS = 0;
            GRAVADOS1 = 0;
            GRAVADOS2 = 0;
            GRAVADOS3 = 0;
            CONSUMO = 0;
            SUBTOTAL = 0;
            TOTAL = 0;
            EXTRA = 0;
            IVAMONTO = 0;
            DTOMONTO = 0;
            NETO = 0;
            RTFTEMONTO = 0;
            RTIVAMONTO = 0;
            RTICAMONTO = 0;
            END
        else
            BEGIN
            /* CALCULE LAS DIFERENTES TARIFAS */
            if (TER_EXENTO = 'S') then
                BEGIN
                SELECT SUM(FADE_TOTAL - FADE_IVAMONTO - FADE_CONSUMO) FROM FACTURAS_DETALLE D WHERE FACT_ID = :ID AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL)) INTO :EXENTOS;
                GRAVADOS1 = 0;
                GRAVADOS2 = 0;
                GRAVADOS3 = 0;
                end
            else
                begin
                SELECT SUM(FADE_TOTAL - FADE_IVAMONTO - FADE_CONSUMO) FROM FACTURAS_DETALLE D WHERE FACT_ID = :ID AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL)) AND FADE_IVAPORC = 0 INTO :EXENTOS;
                SELECT SUM(FADE_TOTAL - FADE_IVAMONTO - FADE_CONSUMO), SUM(FADE_IVAMONTO) FROM FACTURAS_DETALLE D, TARIFA_IVA T WHERE FACT_ID = :ID AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL)) AND FADE_IVAPORC = TAIV_PORC AND TAIV_COD = 1 INTO :GRAVADOS1, :IVA1;
                SELECT SUM(FADE_TOTAL - FADE_IVAMONTO - FADE_CONSUMO), SUM(FADE_IVAMONTO) FROM FACTURAS_DETALLE D, TARIFA_IVA T WHERE FACT_ID = :ID AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL)) AND FADE_IVAPORC = TAIV_PORC AND TAIV_COD = 2 INTO :GRAVADOS2, :IVA2;
                SELECT SUM(FADE_TOTAL - FADE_IVAMONTO - FADE_CONSUMO), SUM(FADE_IVAMONTO) FROM FACTURAS_DETALLE D, TARIFA_IVA T WHERE FACT_ID = :ID AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL)) AND FADE_IVAPORC = TAIV_PORC AND TAIV_COD = 3 INTO :GRAVADOS3, :IVA3;
                end
            SELECT SUM(FADE_CONSUMO) FROM FACTURAS_DETALLE WHERE FACT_ID = :ID AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL)) INTO :CONSUMO;
            SUBTOTAL = TOTAL - EXTRA - IVAMONTO - DTOMONTO;
            NETO = TOTAL - RTFTEMONTO - RTIVAMONTO - RTICAMONTO;
            END
        if (exentos is null) then
            exentos = 0;
        if (gravados1 is null) then
            gravados1 = 0;
        if (gravados2 is null) then
            gravados2 = 0;
        if (gravados3 is null) then
            gravados3 = 0;
        if (iva1 is null) then
            iva1 = 0;
        if (iva2 is null) then
            iva2 = 0;
        if (iva3 is null) then
            iva3 = 0;
        if (consumo is null) then
            consumo = 0;
        SUSPEND;
        END
    END
    
TIPO = 33;
SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 33 INTO :NOMTIPO;
/* DEVOLUCIONES */
FOR SELECT DEVT_ID, D.PREF_PRE, DEVT_NUMERO, DEVT_FECHA, TERC_NIT, DEVT_NOMTERC, DEVT_ADICIONAL-DEVT_DTOMONTO, DEVT_IVAMONTO, DEVT_RTFTEMONTO, DEVT_RTIVAMONTO, DEVT_RTICAMONTO, DEVT_EXTRA, DEVT_TOTAL, DEVT_ANULADO
    FROM DEVOLUCIONES_VENTAS D, PREFIJOS PR WHERE PTVT_ID >= :PTOINI AND PTVT_ID <= :PTOFIN AND
    DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND ((:PREFIJO = '') or (:PREFIJO IS NULL) or (D.PREF_PRE = :PREFIJO))
    AND PR.PREF_PRE = D.PREF_PRE AND PR.TIDO_COD = 33 AND ((PR.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) AND ((DEVT_REMID = 0) or (DEVT_REMID IS NULL))
    ORDER BY DEVT_FECHA, D.PREF_PRE, DEVT_NUMERO
    INTO :ID, :PREF, :NUMERO, :FECHA, :NIT, :NOMTERCERO, :DTOMONTO, :IVAMONTO, :RTFTEMONTO, :RTIVAMONTO, :RTICAMONTO, :EXTRA, :TOTAL, :ANULADO
    DO
    BEGIN
    SELECT TERC_EXENTO FROM TERCEROS WHERE TERC_NIT = :NIT INTO :TER_EXENTO;
    if ((ANULADOS = 'S') or (ANULADO = 'N')) then
        BEGIN
        if (ANULADO = 'S') then
            BEGIN
            EXENTOS = 0;
            GRAVADOS1 = 0;
            GRAVADOS2 = 0;
            GRAVADOS3 = 0;
            CONSUMO = 0;
            SUBTOTAL = 0;
            TOTAL = 0;
            EXTRA = 0;
            IVAMONTO = 0;
            DTOMONTO = 0;
            NETO = 0;
            RTFTEMONTO = 0;
            RTIVAMONTO = 0;
            RTICAMONTO = 0;
            END
        else
            BEGIN
            DTOMONTO = DTOMONTO * -1;
            ADICIONAL = ADICIONAL * -1;
            IVAMONTO = IVAMONTO * -1;
            EXTRA = EXTRA * -1;
            TOTAL = TOTAL * -1;
            RTFTEMONTO = RTFTEMONTO * -1;
            RTIVAMONTO = RTIVAMONTO * -1;
            RTICAMONTO = RTICAMONTO * -1;
            /* CALCULE LAS DIFERENTES TARIFAS */
            if (TER_EXENTO = 'S') then
             BEGIN
              SELECT SUM(DVDE_TOTAL - DVDE_IVAMONTO - DVDE_CONSUMO) FROM DEVOLUCIONES_VENTAS_DETALLE D WHERE DEVT_ID = :ID AND DVDE_REFERENCIA <> '.t' INTO :EXENTOS;
              GRAVADOS1 = 0;
              GRAVADOS2 = 0;
              GRAVADOS3 = 0;
             end
            else
             begin
              SELECT SUM(DVDE_TOTAL - DVDE_IVAMONTO - DVDE_CONSUMO) FROM DEVOLUCIONES_VENTAS_DETALLE D WHERE DEVT_ID = :ID AND DVDE_REFERENCIA <> '.t' AND DVDE_IVAPORC = 0 INTO :EXENTOS;
              SELECT SUM(DVDE_TOTAL - DVDE_IVAMONTO - DVDE_CONSUMO), SUM(DVDE_IVAMONTO) FROM DEVOLUCIONES_VENTAS_DETALLE D, TARIFA_IVA T WHERE DEVT_ID = :ID AND DVDE_REFERENCIA <> '.t' AND DVDE_IVAPORC = TAIV_PORC AND TAIV_COD = 1 INTO :GRAVADOS1, :IVA1;
              SELECT SUM(DVDE_TOTAL - DVDE_IVAMONTO - DVDE_CONSUMO), SUM(DVDE_IVAMONTO) FROM DEVOLUCIONES_VENTAS_DETALLE D, TARIFA_IVA T WHERE DEVT_ID = :ID AND DVDE_REFERENCIA <> '.t' AND DVDE_IVAPORC = TAIV_PORC AND TAIV_COD = 2 INTO :GRAVADOS2, :IVA2;
              SELECT SUM(DVDE_TOTAL - DVDE_IVAMONTO - DVDE_CONSUMO), SUM(DVDE_IVAMONTO) FROM DEVOLUCIONES_VENTAS_DETALLE D, TARIFA_IVA T WHERE DEVT_ID = :ID AND DVDE_REFERENCIA <> '.t' AND DVDE_IVAPORC = TAIV_PORC AND TAIV_COD = 3 INTO :GRAVADOS3, :IVA3;
             end
            SELECT SUM(DVDE_CONSUMO) FROM DEVOLUCIONES_VENTAS_DETALLE WHERE DEVT_ID = :ID AND DVDE_REFERENCIA <> '.t' INTO :CONSUMO;
            SUBTOTAL = TOTAL - EXTRA - IVAMONTO - DTOMONTO;
            NETO = TOTAL - RTFTEMONTO - RTIVAMONTO - RTICAMONTO;
            EXENTOS = EXENTOS * -1;
            GRAVADOS1 = GRAVADOS1 * -1;
            GRAVADOS2 = GRAVADOS2 * -1;
            GRAVADOS3 = GRAVADOS3 * -1;
            CONSUMO = CONSUMO * -1;
            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 (iva1 is null) then
            iva1 = 0;
        if (iva2 is null) then
            iva2 = 0;
        if (iva3 is null) then
            iva3 = 0;
        if (consumo is null) then
            consumo = 0;
        SUSPEND;
        END
    END
execute procedure lee_configuracion ('FACTURACION', 'DOCUMENTOS', 'INCLUIR NOTAS DE CARTERA EN REPORTE DE IMPUESTOS EN VENTAS') returning_values (:NOTAS);
if (NOTAS = 'SI') then
    BEGIN
    TIPO = 41;
    SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 41 INTO :NOMTIPO;
    FOR SELECT NDCL_ID, N.PREF_PRE, NDCL_NUMERO, NDCL_FECHA, N.TERC_NIT, TERC_NOM, 0, NDCL_IVAMONTO, NDCL_RTFTEMONTO, NDCL_RTIVAMONTO, NDCL_RTICAMONTO, 0, NDCL_MONTO+NDCL_IVAMONTO, NDCL_ANULADO
        FROM NOTAS_DEBITO_CLIENTES N, TERCEROS T, PREFIJOS PR WHERE N.TERC_NIT = T.TERC_NIT AND
        NDCL_FECHA >= :FECINI AND NDCL_FECHA <= :FECFIN AND ((:PREFIJO = '') or (:PREFIJO IS NULL) or (N.PREF_PRE = :PREFIJO))
        AND PR.PREF_PRE = N.PREF_PRE AND PR.TIDO_COD = 41 AND ((PR.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
        ORDER BY NDCL_FECHA, N.PREF_PRE, NDCL_NUMERO
        INTO :ID, :PREF, :NUMERO, :FECHA, :NIT, :NOMTERCERO, :DTOMONTO, :IVAMONTO, :RTFTEMONTO, :RTIVAMONTO, :RTICAMONTO, :EXTRA, :TOTAL, :ANULADO
        DO
        BEGIN
        GRAVADOS2 = 0;
        GRAVADOS3 = 0;
        IVA2 = 0;
        IVA3 = 0;
        CONSUMO = 0;
        if (ANULADO = 'S') then
            BEGIN
            EXENTOS = 0;
            GRAVADOS1 = 0;
            SUBTOTAL = 0;
            TOTAL = 0;
            EXTRA = 0;
            IVAMONTO = 0;
            DTOMONTO = 0;
            NETO = 0;
            RTFTEMONTO = 0;
            RTIVAMONTO = 0;
            RTICAMONTO = 0;
            END
        ELSE
            BEGIN
            if (IVAMONTO <> 0) then
                BEGIN
                GRAVADOS1 = TOTAL-IVAMONTO;
                IVA1 = IVAMONTO;
                exentos = 0;
                END
            ELSE
                BEGIN
                GRAVADOS1 = 0;
                IVA1 = 0;
                exentos = TOTAL;
                END
            SUBTOTAL = TOTAL - EXTRA - IVAMONTO - DTOMONTO;
            NETO = TOTAL - RTFTEMONTO - RTIVAMONTO - RTICAMONTO;
            END
        SUSPEND;
        END

    TIPO = 42;
    SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 42 INTO :NOMTIPO;
    FOR SELECT NCCL_ID, N.PREF_PRE, NCCL_NUMERO, NCCL_FECHA, N.TERC_NIT, TERC_NOM, 0, NCCL_IVAMONTO, NCCL_RTFTEMONTO, NCCL_RTIVAMONTO, NCCL_RTICAMONTO, 0, NCCL_MONTO+NCCL_IVAMONTO, NCCL_ANULADO
        FROM NOTAS_CREDITO_CLIENTES N, TERCEROS T, PREFIJOS PR WHERE N.TERC_NIT = T.TERC_NIT AND
        NCCL_FECHA >= :FECINI AND NCCL_FECHA <= :FECFIN AND ((:PREFIJO = '') or (:PREFIJO IS NULL) or (N.PREF_PRE = :PREFIJO))
        AND PR.PREF_PRE = N.PREF_PRE AND PR.TIDO_COD = 42 AND ((PR.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
        ORDER BY NCCL_FECHA, N.PREF_PRE, NCCL_NUMERO
        INTO :ID, :PREF, :NUMERO, :FECHA, :NIT, :NOMTERCERO, :DTOMONTO, :IVAMONTO, :RTFTEMONTO, :RTIVAMONTO, :RTICAMONTO, :EXTRA, :TOTAL, :ANULADO
        DO
        BEGIN
        GRAVADOS2 = 0;
        GRAVADOS3 = 0;
        CONSUMO = 0;
        if (ANULADO = 'S') then
            BEGIN
            EXENTOS = 0;
            GRAVADOS1 = 0;
            SUBTOTAL = 0;
            TOTAL = 0;
            EXTRA = 0;
            IVAMONTO = 0;
            DTOMONTO = 0;
            NETO = 0;
            RTFTEMONTO = 0;
            RTIVAMONTO = 0;
            RTICAMONTO = 0;
            END
        ELSE
            BEGIN
            DTOMONTO = DTOMONTO * -1;
            ADICIONAL = ADICIONAL * -1;
            IVAMONTO = IVAMONTO * -1;
            EXTRA = EXTRA * -1;
            TOTAL = TOTAL * -1;
            RTFTEMONTO = RTFTEMONTO * -1;
            RTIVAMONTO = RTIVAMONTO * -1;
            RTICAMONTO = RTICAMONTO * -1;
            if (IVAMONTO <> 0) then
                BEGIN
                GRAVADOS1 = TOTAL-IVAMONTO;
                IVA1 = IVAMONTO;
                exentos = 0;
                END
            ELSE
                BEGIN
                GRAVADOS1 = 0;
                IVA1 = 0;
                exentos = TOTAL;
                END
            SUBTOTAL = TOTAL - EXTRA - IVAMONTO - DTOMONTO;
            NETO = TOTAL - RTFTEMONTO - RTIVAMONTO - RTICAMONTO;
            END
        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(6),
    FECHA DATE,
    NIT VARCHAR(20),
    NUMPROV VARCHAR(10),
    NOMTERCERO VARCHAR(60),
    SUBTOTAL NUMERIC(18,2),
    DTOMONTO NUMERIC(18,2),
    ADICIONAL NUMERIC(18,2),
    IVAMONTO NUMERIC(18,2),
    CONSUMO NUMERIC(18,2),
    EXENTOS NUMERIC(18,2),
    IVA1 NUMERIC(18,2),
    IVA2 NUMERIC(18,2),
    IVA3 NUMERIC(18,2),
    GRAVADOS1 NUMERIC(18,2),
    GRAVADOS2 NUMERIC(18,2),
    GRAVADOS3 NUMERIC(18,2),
    EXTRA NUMERIC(18,2),
    TOTAL NUMERIC(18,2),
    RTFTEMONTO NUMERIC(18,2),
    RTIVAMONTO NUMERIC(18,2),
    RTICAMONTO 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);
BEGIN
/* FACTURA */
TIPO = 21;
SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 21 INTO :NOMTIPO;

FOR SELECT FACO_ID, PREF_PRE, FACO_NUMERO, FACO_FECHA, TERC_NIT, FACO_ADICIONAL-FACO_DTOMONTO, FACO_IVAMONTO, FACO_RTFTEMONTO, FACO_RTIVAMONTO, FACO_RTICAMONTO, FACO_EXTRA, FACO_TOTAL, FACO_ANULADO, FACO_NUMPROV
    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, :EXTRA, :TOTAL, :ANULADO, :numprov
    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
        if ((ANULADOS = 'S') or (ANULADO = 'N')) then
            BEGIN
            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;
              END
            ELSE
              BEGIN
              SELECT SUM(FCDE_TOTAL - FCDE_IVAMONTO - FCDE_CONSUMO) FROM FACTURAS_COMPRAS_DETALLE D WHERE FACO_ID = :ID AND FCDE_IVAPORC = 0 INTO :EXENTOS;
              SELECT SUM(FCDE_TOTAL - FCDE_IVAMONTO - FCDE_CONSUMO), SUM(FCDE_IVAMONTO) FROM FACTURAS_COMPRAS_DETALLE D, TARIFA_IVA T WHERE FACO_ID = :ID AND FCDE_IVAPORC = TAIV_PORC AND TAIV_COD = 1 INTO :GRAVADOS1, :IVA1;
              SELECT SUM(FCDE_TOTAL - FCDE_IVAMONTO - FCDE_CONSUMO), SUM(FCDE_IVAMONTO) FROM FACTURAS_COMPRAS_DETALLE D, TARIFA_IVA T WHERE FACO_ID = :ID AND FCDE_IVAPORC = TAIV_PORC AND TAIV_COD = 2 INTO :GRAVADOS2, :IVA2;
              SELECT SUM(FCDE_TOTAL - FCDE_IVAMONTO - FCDE_CONSUMO), SUM(FCDE_IVAMONTO) FROM FACTURAS_COMPRAS_DETALLE D, TARIFA_IVA T WHERE FACO_ID = :ID AND FCDE_IVAPORC = TAIV_PORC AND TAIV_COD = 3 INTO :GRAVADOS3, :IVA3;

              SELECT SUM(FCDE_CONSUMO) FROM FACTURAS_COMPRAS_DETALLE WHERE FACO_ID = :ID INTO :CONSUMO;
              SUBTOTAL = TOTAL - EXTRA - IVAMONTO - DTOMONTO;
              NETO = TOTAL - RTFTEMONTO - RTIVAMONTO - RTICAMONTO;
              END
            if (exentos is null) then
                exentos = 0;
            if (gravados1 is null) then
                gravados1 = 0;
            if (gravados2 is null) then
                gravados2 = 0;
            if (gravados3 is null) then
                gravados3 = 0;
            if (iva1 is null) then
                iva1 = 0;
            if (iva2 is null) then
                iva2 = 0;
            if (iva3 is null) then
                iva3 = 0;
            if (consumo is null) then
                consumo = 0;
            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, TERC_NIT, DVCO_ADICIONAL-DVCO_DTOMONTO, DVCO_IVAMONTO, DVCO_RTFTEMONTO, DVCO_RTIVAMONTO, DVCO_RTICAMONTO, DVCO_EXTRA, DVCO_TOTAL, DVCO_ANULADO, ''
    FROM DEVOLUCIONES_COMPRAS
    WHERE DVCO_FECHA >= :FECINI AND DVCO_FECHA <= :FECFIN ORDER BY DVCO_FECHA, PREF_PRE, DVCO_NUMERO
    INTO :ID, :PREF, :NUMERO, :FECHA, :NIT, :DTOMONTO, :IVAMONTO, :RTFTEMONTO, :RTIVAMONTO, :RTICAMONTO, :EXTRA, :TOTAL, :ANULADO, :numprov
    DO
    BEGIN
    if ((PREFIJO = '') or (PREFIJO IS NULL) or (PREF = PREFIJO)) then
        if ((ANULADOS = 'S') or (ANULADO = 'N')) then
            BEGIN
            SELECT TERC_NOM, TERC_EXENTO FROM TERCEROS WHERE TERC_NIT = :NIT INTO :NOMTERCERO, :TER_EXENTO;
            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;
             END
            ELSE
             BEGIN
              DTOMONTO = DTOMONTO * -1;
              ADICIONAL = ADICIONAL * -1;
              IVAMONTO = IVAMONTO * -1;
              EXTRA = EXTRA * -1;
              TOTAL = TOTAL * -1;
              RTFTEMONTO = RTFTEMONTO * -1;
              RTIVAMONTO = RTIVAMONTO * -1;
              RTICAMONTO = RTICAMONTO * -1;
              /* CALCULE LAS DIFERENTES TARIFAS */
               SELECT SUM(DVCD_TOTAL - DVCD_IVAMONTO - DVCD_CONSUMO) FROM DEVOLUCIONES_COMPRAS_DET D WHERE DVCO_ID = :ID AND DVCD_IVAPORC = 0 INTO :EXENTOS;
               SELECT SUM(DVCD_TOTAL - DVCD_IVAMONTO - DVCD_CONSUMO), SUM(DVCD_IVAMONTO) FROM DEVOLUCIONES_COMPRAS_DET D, TARIFA_IVA T WHERE DVCO_ID = :ID AND DVCD_IVAPORC = TAIV_PORC AND TAIV_COD = 1 INTO :GRAVADOS1, :IVA1;
               SELECT SUM(DVCD_TOTAL - DVCD_IVAMONTO - DVCD_CONSUMO), SUM(DVCD_IVAMONTO) FROM DEVOLUCIONES_COMPRAS_DET D, TARIFA_IVA T WHERE DVCO_ID = :ID AND DVCD_IVAPORC = TAIV_PORC AND TAIV_COD = 2 INTO :GRAVADOS2, :IVA2;
               SELECT SUM(DVCD_TOTAL - DVCD_IVAMONTO - DVCD_CONSUMO), SUM(DVCD_IVAMONTO) FROM DEVOLUCIONES_COMPRAS_DET D, TARIFA_IVA T WHERE DVCO_ID = :ID AND DVCD_IVAPORC = TAIV_PORC AND TAIV_COD = 3 INTO :GRAVADOS3, :IVA3;

              SELECT SUM(DVCD_CONSUMO) FROM DEVOLUCIONES_COMPRAS_DET WHERE DVCO_ID = :ID INTO :CONSUMO;
              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;
              SUBTOTAL = TOTAL - EXTRA - IVAMONTO - DTOMONTO;
              NETO = TOTAL - RTFTEMONTO - RTIVAMONTO - RTICAMONTO;
             END
            if (iva1 is null) then
                iva1 = 0;
            if (iva2 is null) then
                iva2 = 0;
            if (iva3 is null) then
                iva3 = 0;
            if (consumo is null) then
                consumo = 0;
            SUSPEND;
            END
    END

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, 0, NCPR_MONTO + NCPR_IVAMONTO, NCPR_ANULADO, ''
       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, :EXTRA, :TOTAL, :ANULADO, :numprov
       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
          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;
           END
          ELSE
           BEGIN
            GRAVADOS2 = 0;
            GRAVADOS3 = 0;
            CONSUMO = 0;
            if (IVAMONTO <> 0) then
                BEGIN
                GRAVADOS1 = TOTAL-IVAMONTO;
                IVA1 = IVAMONTO;
                exentos = 0;
                END
            ELSE
                BEGIN
                GRAVADOS1 = 0;
                exentos = TOTAL;
                END
            SUBTOTAL = TOTAL - EXTRA - IVAMONTO - DTOMONTO;
            NETO = TOTAL - RTFTEMONTO - RTIVAMONTO - RTICAMONTO;
           END
         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, 0, NDPR_MONTO + NDPR_IVAMONTO, NDPR_ANULADO, NDPR_NUMPROV 
       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, :EXTRA, :TOTAL, :ANULADO, :numprov
       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

          GRAVADOS2 = 0;
          GRAVADOS3 = 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;
           END
          ELSE
           BEGIN
            DTOMONTO = DTOMONTO * -1;
            ADICIONAL = ADICIONAL * -1;
            IVAMONTO = IVAMONTO * -1;
            EXTRA = EXTRA * -1;
            TOTAL = TOTAL * -1;
            RTFTEMONTO = RTFTEMONTO * -1;
            RTIVAMONTO = RTIVAMONTO * -1;
            RTICAMONTO = RTICAMONTO * -1;
            if (IVAMONTO <> 0) then
                BEGIN
                GRAVADOS1 = TOTAL-IVAMONTO;
                IVA1 = IVAMONTO;
                exentos = 0;
                END
            ELSE
                BEGIN
                GRAVADOS1 = 0;
                exentos = TOTAL;
                END
            SUBTOTAL = TOTAL - EXTRA - IVAMONTO - DTOMONTO;
            NETO = TOTAL - RTFTEMONTO - RTIVAMONTO - RTICAMONTO;
           END
         suspend;
         END
       END
    END
END
^

SET TERM ; ^


/* 20081218 AJUSTES CON CANTIDAD Y POSIBILIDAD DE IMPRIMIR ANTES DE AJUSTAR */

ALTER TABLE AJUSTES
ADD AJUS_NOAJUSTAR T_BOOLEANO;

update ajustes set ajus_noajustar = 'N';
commit work;

SET TERM ^ ;

CREATE OR ALTER TRIGGER AJUSTES_AU FOR AJUSTES
ACTIVE AFTER UPDATE POSITION 0
AS
declare variable consec INTEGER;
BEGIN
if ((new.ajus_anulado = 'S') AND (OLD.ajus_anulado = 'N')) THEN
    begin
    INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
        VALUES (USER, 14, NEW.ajus_id, 'A', NEW.pref_pre || NEW.ajus_numero);
    select enco_consec from comprobante_encabezado where enco_tiporef = 14 and enco_idref = old.ajus_id into :consec;
    if (NOT consec is null) then
       delete from comprobante_detalle where enco_consec = :consec;
    delete from comprobante_encabezado where enco_tiporef = 14 and enco_idref = old.ajus_id;
    end
ELSE
  INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
    VALUES (USER, 14, NEW.ajus_id, 'U', NEW.pref_pre || NEW.ajus_numero);
/* SI CAMBIO UN DATO CRITICO REPORCESE EL DETALLE */
if ((OLD.ajus_fecha <> NEW.ajus_fecha) or
    (OLD.ajus_numero <> NEW.ajus_numero) or
    (OLD.pref_pre <> NEW.pref_pre) or
    (old.ajus_noajustar <> new.ajus_noajustar)) then
    UPDATE AJUSTES_DETALLE
        SET AJDE_TRANSMIT = 'N'
        WHERE AJUS_ID = NEW.AJUS_ID;
/* SI SE ANULE ANULE EL DETALLE */
if (OLD.ajus_anulado <> NEW.ajus_anulado) then
    UPDATE AJUSTES_DETALLE
        SET AJDE_ANULADO = NEW.AJUS_ANULADO
        WHERE AJUS_ID = NEW.AJUS_ID;
if (OLD.ajus_transmit <> NEW.ajus_transmit) then
    UPDATE AJUSTES_DETALLE
        SET AJDE_TRANSMIT = NEW.AJUS_TRANSMIT
        WHERE AJUS_ID = NEW.AJUS_ID;
END
^

SET TERM ; ^


SET TERM ^ ;

CREATE OR ALTER TRIGGER AJUSTES_DETALLE_AI FOR AJUSTES_DETALLE
ACTIVE AFTER INSERT POSITION 0
AS
declare variable fec date;
declare variable CONC VARCHAR(60);
declare variable Pref varchar(4);
declare variable Num varchar(6);
declare variable CANTAJ numeric(18,4);
declare variable COSTO NUMERIC(18,2);
declare variable factor numeric(18,4);
declare variable NOAJUSTAR CHAR(1);
BEGIN
  if ((NEW.AJUS_ID <> 0) and (new.ajde_anulado = 'N')) then
    BEGIN
    select AJUS_fecha, AJUS_conc, AJUS_NUMERO, PREF_PRE, AJUS_NOAJUSTAR
        from AJUSTES where AJUS_id = new.AJUS_id into :fec, :conc, :Num, :Pref, :noajustar;
    if (noajustar = 'N') then
        begin
        execute procedure factor_unidad_cant(new.arti_cod, new.ajus_unidad) returning_values(factor);
        CANTAJ = NEW.ajus_exant - (NEW.ajus_exnue * :factor);
        /* CUANDO CAMBIA LA EXISTENCIA REGISTRE EL MOV. */

        if (CANTAJ > 0) then
          BEGIN
          /* ES UNA SALIDA */
          INSERT INTO MOVIMIENTO_ARTICULO
            (ARTI_COD, MVAR_CONS, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM)
            VALUES(NEW.ARTI_COD, GEN_ID(ID_MOVARTI,1), NEW.BODE_COD, :FEC, 14, NEW.AJUS_id,
            :CONC, :cantaj, 0, 'N', NEW.ajus_lote, :Pref, :Num, NEW.ajus_item);
          END
        ELSE
          BEGIN
          /* ES UNA ENTRADA */
          EXECUTE PROCEDURE costo_promedio(NEW.arti_cod, :FEC) returning_values (:COSTO);
          INSERT INTO MOVIMIENTO_ARTICULO
            (ARTI_COD, MVAR_CONS, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM)
            VALUES(NEW.ARTI_COD, GEN_ID(ID_MOVARTI,1), NEW.BODE_COD, :FEC, 14, NEW.AJUS_id,
            :CONC, abs(:cantaj), :COSTO, 'S', NEW.ajus_lote, :Pref, :Num, NEW.ajus_item);
          END
        end
    END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER AJUSTES_DETALLE_AU FOR AJUSTES_DETALLE
ACTIVE AFTER UPDATE POSITION 0
as
declare variable fec date;
declare variable CONC VARCHAR(60);
declare variable cantaj numeric(18,4);
declare variable Pref varchar(4);
declare variable Num varchar(6);
declare variable COSTO NUMERIC(18,2);
declare variable factor numeric(18,4);
declare variable NOAJUSTAR CHAR(1);
BEGIN
if ((old.ajus_id <> 0) and (old.ajde_anulado = 'N')) then
    DELETE FROM MOVIMIENTO_ARTICULO WHERE (mvar_tipodoc = 14) and (mvar_idref = new.ajus_id) and (mvar_item = new.ajus_item);
if ((NEW.AJUS_id <> 0) and (NEW.ajde_anulado = 'N')) then
    begin
    select AJUS_fecha, AJUS_conc, AJUS_NUMERO, PREF_PRE, AJUS_NOAJUSTAR
        from AJUSTES where AJUS_id = new.AJUS_id into :fec, :conc, :Num, :Pref, :NOAJUSTAR;
    if (NOAJUSTAR = 'N') then
        BEGIN
        execute procedure factor_unidad_cant(new.arti_cod, new.ajus_unidad) returning_values(factor);
        CANTAJ = NEW.ajus_exant - (NEW.ajus_exnue * :factor);
        /* CUANDO CAMBIA LA EXISTENCIA REGISTRE EL MOV. */
        if (CANTAJ > 0) then
            BEGIN
            /* ES UNA SALIDA */
            INSERT INTO MOVIMIENTO_ARTICULO
                (ARTI_COD, MVAR_CONS, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM)
                VALUES(NEW.ARTI_COD, GEN_ID(ID_MOVARTI,1), NEW.BODE_COD, :FEC, 14, NEW.AJUS_id,
                :CONC, :cantaj, 0, 'N', NEW.ajus_lote, :Pref, :Num, new.ajus_item);
            END
        ELSE
            BEGIN
            /* ES UNA ENTRADA */
            EXECUTE PROCEDURE costo_promedio(NEW.arti_cod, :FEC) returning_values (:COSTO);
            INSERT INTO MOVIMIENTO_ARTICULO
                (ARTI_COD, MVAR_CONS, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM)
                VALUES(NEW.ARTI_COD, GEN_ID(ID_MOVARTI,1), NEW.BODE_COD, :FEC, 14, NEW.AJUS_id,
                :CONC, abs(:cantaj), :costo, 'S', NEW.ajus_lote, :Pref, :Num, new.ajus_item);
            END
        END
    END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER PROCEDURE IMPR_AJUSTE(
    ID INTEGER)
RETURNS (
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    CONCEPTO VARCHAR(60),
    CODBODEGA VARCHAR(2),
    NOMBODEGA VARCHAR(30),
    OBS BLOB SUB_TYPE 1 SEGMENT SIZE 80,
    AJUSTAR CHAR(2),
    ITEM INTEGER,
    ARTICULO VARCHAR(15),
    CODBAR VARCHAR(15),
    ARTIDES VARCHAR(60),
    EXANT NUMERIC(18,4),
    EXNUE NUMERIC(18,4),
    CANT NUMERIC(18, 4),
    UNIDAD VARCHAR(8),
    BODITEM VARCHAR(2),
    LOTE VARCHAR(15),
    COSTO NUMERIC(18,2),
    TOTAL NUMERIC(18,2))
AS
BEGIN
  /*  */
  SELECT PREF_PRE, AJUS_NUMERO, AJUS_FECHA, AJUS_CONC, A.BODE_COD, BODE_NOM, AJUS_OBS, AJUS_NOAJUSTAR
    FROM AJUSTES A, BODEGA B WHERE A.BODE_COD = B.BODE_COD AND A.AJUS_ID = :ID into
    :PREF, :NUMERO, :FECHA, :CONCEPTO, :CODBODEGA, :NOMBODEGA, :OBS, :AJUSTAR;
  if (AJUSTAR = 'S') then
    AJUSTAR = 'NO';
  else
    AJUSTAR = 'SI';
  FOR SELECT AJUS_ITEM, A.ARTI_COD, AJUS_CODBAR, AJDE_DESC, AJUS_EXANT, AJUS_UNIDAD, BODE_COD, AJUS_EXNUE, AJUS_LOTE
    FROM AJUSTES_DETALLE D, ARTICULO A
    WHERE D.ARTI_COD = A.ARTI_COD AND D.AJUS_ID = :ID
    ORDER BY AJUS_ITEM
    INTO :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :EXANT, :UNIDAD, :BODITEM, :EXNUE, :LOTE
    DO
      BEGIN
      EXECUTE PROCEDURE COSTO_PROMEDIO(:ARTICULO, :FECHA) returning_values (:COSTO);
      CANT = EXNUE - EXANT;
      TOTAL = CANT * COSTO;
      SUSPEND;
      END
END
^

SET TERM ; ^

ALTER TABLE ENSAMBLES_DETALLE
ADD ESDE_PESO T_CANTIDAD;

SET TERM ^ ;

CREATE OR ALTER PROCEDURE IMPR_ENSAMBLE(
    ID INTEGER)
RETURNS (
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    CONCEPTO VARCHAR(60),
    REFER VARCHAR(60),
    CODBODEGA VARCHAR(2),
    NOMBODEGA VARCHAR(30),
    PRODARTI VARCHAR(15),
    PRODCODBAR VARCHAR(15),
    PRODDES VARCHAR(60),
    PRODCANT NUMERIC(18,4),
    PRODUNIDAD VARCHAR(8),
    PRODLOTE VARCHAR(15),
    OPERARIO VARCHAR(60),
    MAQUINA VARCHAR(60),
    CODRETAL VARCHAR(20),
    DESCRETAL VARCHAR(60),
    CANTRETAL NUMERIC(18,4),
    PESOTOTAL NUMERIC(18,4),
    OBS BLOB SUB_TYPE 1 SEGMENT SIZE 80,
    TOTENSAMBLE NUMERIC(18,2),
    ITEM INTEGER,
    ARTICULO VARCHAR(15),
    CODBAR VARCHAR(15),
    ARTIDES VARCHAR(60),
    CANT NUMERIC(18,4),
    UNIDAD VARCHAR(8),
    BODITEM VARCHAR(2),
    COSTO NUMERIC(18,2),
    IVAPORC NUMERIC(9,2),
    IVAMONTO NUMERIC(18,2),
    CONSUMO NUMERIC(18,2),
    PESO NUMERIC(18,4),
    TOTAL NUMERIC(18,2),
    LOTE VARCHAR(15))
AS
BEGIN
  /*  */
  SELECT PREF_PRE, ENSA_NUMERO, ENSA_FECHA, ENSA_CONC, ENSA_REFER, E.BODE_COD, BODE_NOM, ENSA_CODBAR, ARTI_COD,
    ENSA_DESC, ENSA_CANT, ENSA_UNIDAD, ENSA_LOTE, ENSA_OBS, ENSA_PESO, ENSA_CODRETAL, ENSA_CANTRETAL, ENSA_OPER, ENSA_MAQUINA
    FROM ENSAMBLES E, BODEGA B WHERE E.BODE_COD = B.BODE_COD AND E.ENSA_ID = :ID into
    :PREF, :NUMERO, :FECHA, :CONCEPTO, :REFER, :CODBODEGA, :NOMBODEGA, :PRODCODBAR, :PRODARTI,
    PRODDES, PRODCANT, PRODUNIDAD, PRODLOTE, :OBS, :PESOTOTAL, :CODRETAL, :CANTRETAL, :operario,  :MAQUINA;
  SELECT SUM(ESDE_TOTAL) FROM ensambles_detalle WHERE ENSA_ID = :ID INTO :TOTENSAMBLE;
  SELECT ENOP_NOMBRE FROM ENSAMBLE_OPERARIO WHERE ENOP_ID = :OPERARIO INTO :OPERARIO;
  SELECT ENMA_NOMBRE FROM ensamble_maquina WHERE ENMA_ID = :MAQUINA INTO :MAQUINA;
  SELECT ARTI_DES FROM ARTICULO WHERE ARTI_COD = :codretal INTO :descretal;
  FOR SELECT ESDE_ITEM, A.ARTI_COD, ESDE_CODBAR, ESDE_DESC, ESDE_CANT, ESDE_UNIDAD, BODE_COD, ESDE_COSTO, ESDE_IVAPORC, ESDE_IVAMONTO, ESDE_CONSUMO, ESDE_TOTAL, ESDE_LOTE, ESDE_PESO
    FROM ensambles_detalle D, ARTICULO A
    WHERE D.ARTI_COD = A.ARTI_COD AND D.ENSA_ID = :ID
    ORDER BY ESDE_ITEM
    INTO :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :BODITEM, :COSTO, :IVAPORC, :IVAMONTO, :CONSUMO, :TOTAL, :LOTE, :PESO
    DO
      BEGIN
      /*TOTAL = TOTAL - IVAMONTO - CONSUMO;*/
      SUSPEND;
      END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER PROCEDURE MOVARTI_CANTIDADES(
    ARTICULO VARCHAR(15),
    DESDE DATE,
    HASTA DATE,
    AGENCIA INTEGER)
RETURNS (
    TIPODOC VARCHAR(8),
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    CONCEPTO VARCHAR(60),
    CANTENT NUMERIC(18,4),
    CANTSAL NUMERIC(18,4),
    IDMOV INTEGER)
AS
declare variable Ent char(1);
declare variable Cant numeric(18,4);
BEGIN
  /* Retorna el mov. x articulo detallado desde hasta */
  for select tido_nomcorto, mvar_pref, mvar_numero, mvar_fecha, mvar_conc, mvar_entrada, mvar_cant, MVAR_IDREF
    from tipo_documento t, movimiento_articulo m, prefijos p
    where t.tido_cod = m.mvar_tipodoc and arti_cod = :articulo and mvar_fecha >= :desde and mvar_fecha <= :hasta and
    p.tido_cod = t.tido_cod and p.pref_pre = m.mvar_pref and ((:agencia = 0) or (p.sucu_id = :agencia))
    ORDER BY MVAR_FECHA, MVAR_CONS into :tipodoc, :prefijo, :numero, :fecha, :concepto, :Ent, :Cant, :IDMOV
    do
        begin
          if (:Ent = 'S') then
            begin
            CANTENT = Cant;
            CANTSAL = 0;
            end
          else
            begin
            CANTENT = 0;
            CANTSAL = Cant;
            end
          SUSPEND;
        end
END
^

SET TERM ; ^


/* 20081218B BUSQUEDAS POR OBSERVACION DESDE EL SERVIDOR Y NO EL CLIENTE */

SET TERM ^ ;

CREATE OR ALTER PROCEDURE CONSULTA_ARTICULOS_VTAS(
    FECHA DATE,
    INACTIVOS CHAR(1),
    MODULO VARCHAR(20),
    BUSCAR VARCHAR(100),
    COLUMNA INTEGER)
RETURNS (
    CODIGO VARCHAR(20),
    DES VARCHAR(60),
    REF VARCHAR(20),
    GRUPO VARCHAR(30),
    MARCA VARCHAR(30),
    UNIDAD VARCHAR(8),
    ESTADO VARCHAR(30),
    IVA NUMERIC(9,2),
    EXISTEN NUMERIC(18,4),
    PRECIO NUMERIC(18,2),
    CLASE CHAR(1))
AS
DECLARE VARIABLE LISTA INTEGER;
DECLARE VARIABLE EXIST CHAR(2);
DECLARE VARIABLE SINEXIST CHAR(2);
declare variable DIG INTEGER;
BEGIN
EXISTEN = 0;
EXECUTE PROCEDURE lee_configuracion ('FACTURACION','ARTICULOS', 'VER EXISTENCIA EN CONSULTA ARTICULOS') returning_values (:EXIST);
EXECUTE PROCEDURE lee_configuracion ('FACTURACION','FACTURAS', 'CODIGO DE LA LISTA DE PRECIOS A MOSTRAR EN ARTICULOS') returning_values (:LISTA);
if (modulo = 'FACTURACION') then
  EXECUTE PROCEDURE lee_configuracion ('FACTURACION','ARTICULOS','VER ARTICULOS SIN EXISTENCIA EN CONSULTA DE ARTICULOS') returning_values (:sinexist);
else
  sinexist = 'SI';
EXECUTE PROCEDURE LEE_CONFIGURACION ('FACTURACION', 'ARTICULOS', 'REDONDEO AL MULTIPLO DE DIEZ EN PRECIOS') returning_values (DIG);
if (LISTA > 0) then
    BEGIN
    FOR select a.arti_cod, arti_des, grup_cod, arti_unidad, esar_cod, taiv_porc, marc_cod,arti_clase
        from articulo a, tarifa_iva t
        where a.taiv_cod = t.taiv_cod and substring(a.arti_cod from 1 FOR 2) <> '.t' and
        ((:INACTIVOS = 'S') or (esar_cod = 'A') or ((:INACTIVOS = 'C') AND (esar_cod = 'N'))) AND
        ((:COLUMNA <> 0) or (:BUSCAR = '') or (upper(A.ARTI_COD) like upper(:buscar))) AND
        ((:columna <> 1) or (:BUSCAR = '') or (upper(A.ARTI_DES) like upper(:buscar))) AND
        ((:columna <> 2) or (:BUSCAR = '') or (upper(A.ARTI_OBS) like upper(:buscar)) or (upper(A.ARTI_DES) like upper(:buscar)))
        INTO :CODIGO, :DES, :GRUPO, :UNIDAD, :ESTADO, :IVA, :MARCA, :CLASE
        do
        begin
        select first 1 coba_cod from barras_articulo where arti_cod = :codigo into :ref;
        if ((COLUMNA <> 3) or (upper(REF) like upper(:buscar))) then
            BEGIN
            PRECIO = 0;
            SELECT prar_fijo PRECIO FROM precios_articulo WHERE arti_cod = :CODIGO and lipr_cod = :LISTA INTO :PRECIO;
            EXECUTE PROCEDURE redondee(PRECIO, DIG) returning_values (PRECIO);
            if (EXIST = 'SI') then
                BEGIN
                EXECUTE PROCEDURE saldo_total_inventario (:CODIGO, :FECHA) returning_values (:EXISTEN);
                if ((SINEXIST = 'SI')  or (existen <> 0)) then
                    SUSPEND;
                END
            ELSE
                SUSPEND;
            END
        end
    END
ELSE
    FOR select arti_cod, arti_des, grup_cod, arti_unidad, esar_cod, taiv_porc, arti_precio, marc_cod, arti_clase
        from articulo a, tarifa_iva t
        where a.taiv_cod = t.taiv_cod and substring(a.arti_cod from 1 FOR 2) <> '.t' and
        ((:INACTIVOS = 'S') or (esar_cod = 'A') or ((:INACTIVOS = 'C') AND (esar_cod = 'N'))) AND
        ((:COLUMNA <> 0) or (:BUSCAR = '') or (upper(A.ARTI_COD) like upper(:buscar))) AND
        ((:columna <> 1) or (:BUSCAR = '') or (upper(A.ARTI_DES) like upper(:buscar))) AND
        ((:columna <> 2) or (:BUSCAR = '') or (upper(A.ARTI_OBS) like upper(:buscar)) or (upper(A.ARTI_DES) like upper(:buscar)))
        INTO :CODIGO, :DES, :GRUPO, :UNIDAD, :ESTADO, :IVA, :PRECIO, :MARCA, :CLASE
        do
        begin
        select first 1 coba_cod from barras_articulo where arti_cod = :codigo into :ref;
        if ((COLUMNA <> 3) or (upper(REF) like upper(:buscar))) then
            BEGIN
            if (EXIST = 'SI') then
                BEGIN
                EXECUTE PROCEDURE saldo_total_inventario (:CODIGO, :FECHA) returning_values (:EXISTEN);
                if ((SINEXIST = 'SI') or (existen <> 0)) then
                    SUSPEND;
                END
            ELSE
                SUSPEND;
            END
        end
END
^

SET TERM ; ^


/* 20081218C NO AFECTAE CARTERA SI EL TRANSMIT = 'S' PARA POS MAS RAPIDO AL PASAR PRODUCTOS */

SET TERM ^ ;

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

    DELETE FROM puntos_cliente WHERE PTCL_TIPODOC = 31 AND PTCL_IDDOC = OLD.fact_id;

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

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

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

SET TERM ; ^


/* 20081219  RECIBO PROVISIONAL NO TENIA EL CAMPO SUCURSAL */

SET TERM ^ ;

CREATE OR ALTER PROCEDURE IMPR_RECIPROV(
    ID INTEGER)
RETURNS (
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    NOMCAJA VARCHAR(60),
    CODCOBR INTEGER,
    NOMCOBR VARCHAR(60),
    NIT VARCHAR(20),
    NOMBRE VARCHAR(60),
    DIR VARCHAR(60),
    CIU VARCHAR(40),
    TEL VARCHAR(40),
    CONCEPTO VARCHAR(60),
    MONTO NUMERIC(18,2),
    RTFTE NUMERIC(18,2),
    RTIVA NUMERIC(18,2),
    RTICA NUMERIC(18,2),
    DSCTO NUMERIC(18,2),
    OBS BLOB SUB_TYPE 1 SEGMENT SIZE 80,
    ITEMDOC INTEGER,
    TIPODOC VARCHAR(8),
    PREFDOC VARCHAR(4),
    NUMDOC VARCHAR(6),
    SUCURSAL VARCHAR(10),
    ABONODOC NUMERIC(18,2),
    RTFTEDOC NUMERIC(18,2),
    RTIVADOC NUMERIC(18,2),
    RTICADOC NUMERIC(18,2),
    DSCTODOC NUMERIC(18,2),
    SALDODOC NUMERIC(18,2),
    ANTERDOC NUMERIC(18,2))
AS
declare variable NUMROWS INTEGER;
declare variable TIPO integer;
BEGIN
  SELECT PREF_PRE, RCPR_NUMERO, RCPR_FECHA, CAJA_NOMBRE, RCPR_CONC, R.VEND_COD,
        R.TERC_NIT, RCPR_NOMTERC, TERC_DIR, TERC_CIU, TERC_TEL,
        RCPR_MONTO, RCPR_RTFTE, RCPR_RTIVA, RCPR_RTICA, RCPR_DTOF,
        RCPR_OBS
  FROM RECIBO_PROVISIONAL R, TERCEROS T, CAJAS C
  WHERE R.TERC_NIT = T.TERC_NIT AND R.CAJA_ID = C.CAJA_ID AND
        R.RCPR_ID = :ID
  INTO :PREFIJO, :NUMERO, :FECHA, :NOMCAJA, :CONCEPTO, :CODCOBR,
        :NIT, :NOMBRE, :DIR, :CIU, :TEL,
        :MONTO, :RTFTE, :RTIVA, :RTICA, :DSCTO,
        :OBS;
  SELECT COBR_NOM FROM COBRADORES WHERE COBR_COD = :CODCOBR INTO :NOMCOBR;
  SELECT COUNT(RPDE_ITEM) FROM RECIBO_PROVISIONAL_DETALLE
    WHERE RCPR_ID = :ID INTO :NUMROWS;
  if (NUMROWS > 0) then
    FOR SELECT RPDE_ITEM, RPDE_TIPODOC, TIDO_NOMCORTO, RPDE_PREFDOC, RPDE_NUMDOC,
        RPDE_ABONO, RPDE_RTFTE, RPDE_RTIVA, RPDE_RTICA, RPDE_DTOF, RPDE_SUCURSAL
        FROM RECIBO_PROVISIONAL_DETALLE D, TIPO_DOCUMENTO TD
        WHERE D.RCPR_ID = :ID AND TD.TIDO_COD = D.RPDE_TIPODOC
        ORDER BY RPDE_ITEM
        INTO :ITEMDOC, :TIPO, :TIPODOC, :PREFDOC, :NUMDOC, :ABONODOC, :RTFTEDOC, :RTIVADOC, :RTICADOC, :DSCTODOC, :SUCURSAL
        DO
            BEGIN
            EXECUTE PROCEDURE SALDO_DOC_CARTERA(:TIPO, :ID, :FECHA, 0) returning_values (:SALDODOC);
            ANTERDOC = SALDODOC + RTFTEDOC + RTIVADOC + RTICADOC + ABONODOC + DSCTODOC;
            SUSPEND;
            END
  ELSE
    SUSPEND;
SUSPEND;
END
^

SET TERM ; ^


/* 20081219B EL TRM QUEDA EN CERO AFECTANDO EL REGISTRO DEL DOCUMENTO */
SET TERM ^ ;

CREATE OR ALTER TRIGGER DEVOLUCIONES_VENTAS_BI FOR DEVOLUCIONES_VENTAS
ACTIVE BEFORE INSERT POSITION 0
AS
declare variable NUMERO VARCHAR(6);
declare variable AUTOM CHAR(1);
declare variable EXISTE CHAR(1);
declare variable SITOT CHAR(2);
declare variable CODCOBR INTEGER;
declare variable CODVEND INTEGER;
declare variable FECSERVER CHAR(2);
declare variable PREGTASA CHAR(2);
BEGIN
if ((NEW.devt_trm IS NULL) or (NEW.devt_trm = 0)) then
    NEW.devt_trm = 1;
EXECUTE PROCEDURE LEE_CONFIGURACION('GENERAL', 'GENERAL', 'PREGUNTAR TASA DE CAMBIO EN DOCUMENTOS DE CARTERA') returning_values (:pregtasa);
if (PREGTASA = 'SI') then
    BEGIN
    NEW.devt_adicional = NEW.devt_adicional * NEW.devt_trm;
    NEW.devt_ivamonto = NEW.devt_ivamonto * NEW.devt_trm;
    NEW.devt_extra = NEW.devt_extra * NEW.devt_trm;
    NEW.devt_rtftemonto = NEW.devt_rtftemonto * NEW.devt_trm;
    NEW.devt_rtivamonto = NEW.devt_rtivamonto * NEW.devt_trm;
    NEW.devt_rticamonto = NEW.devt_rticamonto * NEW.devt_trm;
    NEW.devt_dtomonto = NEW.devt_dtomonto * NEW.devt_trm;
    END
EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION', 'DOCUMENTOS', 'INHABILITAR FECHA EN DOCUMENTOS') returning_values (:fecserver);
if (FECSERVER = 'SI') then
    NEW.devt_fecha = CAST ('NOW' AS DATE);
if (new.devt_remid is null) then
    NEW.devt_remid = 0;
execute procedure LEE_CONFIGURACION ('FACTURACION','DEVOLUCIONES','PERMITIR DEVOLVER ITEMS NO FACTURADOS') returning_values (:SITOT);
if ((SITOT = 'NO') AND (NEW.devt_factid = 0)) then
    exception factura_no_existe;
/* CALCULE LA COMISION CON BASE EN LA FACTURA */
EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION', 'VENDEDORES', 'COMISIONES EN VENTA INCLUYENDO IMPUESTOS') returning_values (:SITOT);
SELECT FACT_COMIPORC FROM FACTURAS WHERE FACT_ID = NEW.devt_factid INTO NEW.devt_comiporc;
if (NEW.devt_comiporc IS NULL) then
    NEW.devt_comiporc = 0;

if (SITOT = 'SI') then
    NEW.devt_comimonto = NEW.devt_total * NEW.devt_comiporc / 100;
ELSE
    NEW.devt_comimonto = (NEW.devt_total - NEW.devt_ivamonto) * NEW.devt_comiporc / 100;

if (NEW.numok = 'N') then
  BEGIN
  /* Actualice el contador del prefijo */
  SELECT PREF_ACTUAL, PREF_AUTO FROM PREFIJOS WHERE TIDO_COD = 33 AND PREF_PRE = NEW.PREF_PRE INTO :NUMERO, :AUTOM;
  /* ACTUALICE EL NUMERO EN COMPROBANTE_ENCABEZADO  */
  if (AUTOM = 'S') then
    BEGIN
    NEW.DEVT_NUMERO = NUMERO;
    NUMERO = CAST((CAST(NUMERO AS INTEGER) + 1) AS CHAR(6));
    UPDATE PREFIJOS
      SET PREF_ACTUAL = :NUMERO
    WHERE TIDO_COD = 33 AND PREF_PRE = NEW.PREF_PRE;
    END
  ELSE
    BEGIN
    if (CAST(NUMERO AS INTEGER) = CAST(NEW.DEVT_NUMERO AS INTEGER)) then
        UPDATE PREFIJOS
          SET PREF_ACTUAL = CAST((CAST(PREF_ACTUAL AS INTEGER) + 1) AS CHAR(6))
        WHERE TIDO_COD = 33 AND PREF_PRE = NEW.PREF_PRE;
    END
  EXECUTE PROCEDURE COMPLETA_CEROS (NEW.DEVT_numero) returning_values (NEW.DEVT_numero);
  NEW.numok = 'S';
  END
/* Verifique que el numero no existe previamente */
EXISTE = 'N';
SELECT 'S' FROM DEVOLUCIONES_VENTAS WHERE PREF_PRE = NEW.PREF_PRE AND DEVT_NUMERO = NEW.DEVT_NUMERO INTO :EXISTE;
if (EXISTE = 'S') then
    EXCEPTION DOCUMENTO_REGISTRADO 'Ya existe una devolución con el número ' || new.pref_pre || new.devt_numero;
select COBR_COD, VEND_COD FROM CLIENTES WHERE TERC_NIT = NEW.terc_nit INTO :CODCOBR, CODVEND;
if (NEW.cobr_cod IS NULL) then
    NEW.cobr_cod = :CODCOBR;
if (NEW.vend_cod IS NULL) then
    NEW.vend_cod = :CODVEND;
if ((new.DEVT_TOTAL-new.DEVT_IVAMONTO+new.DEVT_DTOMONTO-new.DEVT_ADICIONAL) = 0) then
    NEW.DEVT_FACTOR = 1;
else
    NEW.DEVT_FACTOR = (new.DEVT_TOTAL-new.DEVT_IVAMONTO)/(new.DEVT_TOTAL-new.DEVT_IVAMONTO+new.DEVT_DTOMONTO-new.DEVT_ADICIONAL);
END
^

SET TERM ; ^


SET TERM ^ ;

CREATE OR ALTER TRIGGER FACTURAS_BI FOR FACTURAS
ACTIVE BEFORE INSERT POSITION 0
AS
declare variable NUMERO VARCHAR(6);
declare variable AUTOM CHAR(1);
declare variable EXISTE CHAR(1);
DECLARE VARIABLE VALCUPO CHAR(10);
declare variable DISPONIBLE NUMERIC(18,2);
declare variable OK CHAR(1);
declare variable SITOT CHAR(2);
declare variable CODCOBR INTEGER;
declare variable CODVEND INTEGER;
declare variable contado char(1);
declare variable BLOQAUTO CHAR(2);
declare variable FECCONTA VARCHAR(8);
declare variable FECBLO VARCHAR(8);
declare variable FECSERVER CHAR(2);
declare variable PREGTASA CHAR(2);
BEGIN
EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION', 'DOCUMENTOS', 'INHABILITAR FECHA EN DOCUMENTOS') returning_values (:fecserver);
if (FECSERVER = 'SI') then
    NEW.fact_fecha = CAST ('NOW' AS DATE);
/* doble moneda */
if ((NEW.fact_trm IS NULL) or (NEW.fact_trm = 0)) then
    NEW.fact_trm = 1;
EXECUTE PROCEDURE LEE_CONFIGURACION('GENERAL', 'GENERAL', 'PREGUNTAR TASA DE CAMBIO EN DOCUMENTOS DE CARTERA') returning_values (:pregtasa);
if (PREGTASA = 'SI') then
    BEGIN
    NEW.fact_dtomonto = NEW.fact_dtomonto * NEW.fact_trm;
    NEW.fact_comimonto = NEW.fact_comimonto * NEW.fact_trm;
    NEW.fact_adicional = NEW.fact_adicional * NEW.fact_trm;
    NEW.fact_ivamonto = NEW.fact_ivamonto * NEW.fact_trm;
    NEW.fact_rtftemonto = NEW.fact_rtftemonto * NEW.fact_trm;
    NEW.fact_rtivamonto = NEW.fact_rtivamonto * NEW.fact_trm;
    NEW.fact_rticamonto = NEW.fact_rticamonto * NEW.fact_trm;
    NEW.fact_extra = NEW.fact_extra * NEW.fact_trm;
    NEW.fact_dtofmonto = NEW.fact_dtofmonto * NEW.fact_trm;
    NEW.fact_total = NEW.fact_total * NEW.fact_trm;
    NEW.fact_dtoit1 = NEW.fact_dtoit1 * NEW.fact_trm;
    NEW.fact_dtoit2 = NEW.fact_dtoit2 * NEW.fact_trm;
    NEW.fact_dtoit3 = NEW.fact_dtoit3 * NEW.fact_trm;
    END
EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION', 'POS', 'CAMBIAR FECHA DE BLOQUEO AUTOMATICAMENTE AL CAMBIAR FECHA DE LA FACTURA') RETURNING_VALUES (:bloqauto);
if (bloqauto = 'SI') then
    BEGIN
    EXECUTE PROCEDURE LEE_CONFIGURACION ('CONTABILIDAD', 'GENERAL', 'FECHA DE BLOQUEO') RETURNING_VALUES (:FECBLO);
    EXECUTE PROCEDURE fecha_a_conta (NEW.fact_fecha) returning_values (:FECCONTA);
    if (FECBLO > FECCONTA) then
        EXCEPTION CONTABILIDAD_BLOQUEADA 'La contabilidad esta bloqueada a ' || :fecblo;
    if (FECBLO < FECCONTA) then
        UPDATE CONFIGURACION
            SET CONF_VALOR = :FECCONTA
            WHERE (CONF_MODULO = 'CONTABILIDAD') AND (CONF_CATEGORIA = 'GENERAL') AND (CONF_PROPIEDAD = 'FECHA DE BLOQUEO');
    END
OK = 'S';
EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'ACCION A TOMAR SI EL CUPO DE CREDITO ES INSUFICIENTE') RETURNING_VALUES (:VALCUPO);
select auto_contado from autorizaciones where pref_pre = new.pref_pre and tido_cod = 31 into :contado;
if (contado='N') then
BEGIN
  IF (VALCUPO = 'PROHIBIR') THEN
  BEGIN
  OK = 'N';
  /* VERIFIQUE EL CUPO DE CREDITO */
  execute procedure cupo_disponible(new.TERC_NIT, NEW.fact_fecha, NEW.fact_sucursal) returning_values (:DISPONIBLE);
  if (DISPONIBLE >= NEW.FACT_TOTAL) then
    OK = 'S';
  END
END
IF (OK = 'S') THEN
  begin
  /* calcule la comision */
  EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION', 'VENDEDORES', 'COMISIONES EN VENTA INCLUYENDO IMPUESTOS') returning_values (:SITOT);
  if ((NEW.fact_comiporc IS NULL) or (NEW.fact_comiporc = 0)) THEN
    BEGIN
    if (SITOT = 'SI') then
      SELECT MAX(COMI_PORC) FROM comisiones WHERE VEND_COD = NEW.vend_cod AND
        COMI_INICIAL <= NEW.fact_total AND COMI_FINAL >= NEW.fact_total
        INTO NEW.fact_comiporc;
    else
      SELECT MAX(COMI_PORC) FROM comisiones WHERE VEND_COD = NEW.vend_cod AND
        COMI_INICIAL <= (NEW.fact_total -NEW.fact_ivamonto) AND COMI_FINAL >= (NEW.fact_total -NEW.fact_ivamonto)
        INTO NEW.fact_comiporc;
    if (NEW.fact_comiporc IS NULL) then
        NEW.fact_comiporc = 0;
    END
  if (SITOT = 'SI') then
      NEW.fact_comimonto = NEW.fact_total * NEW.fact_comiporc / 100;
  ELSE
      NEW.fact_comimonto = (NEW.fact_total -NEW.fact_ivamonto) * NEW.fact_comiporc / 100;

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

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

SET TERM ; ^


/* 20081219C  MAL LA SUMA EN CASO DE CRUCE MAS CAJA */

SET TERM ^ ;

CREATE OR ALTER PROCEDURE CONTABIL_EGRESO(
    IDDOC INTEGER,
    IDINTER INTEGER)
RETURNS (
    ERROR INTEGER,
    VER CHAR(1),
    IDC INTEGER)
AS
declare variable PREF VARCHAR(4);
declare variable NUM VARCHAR(6);
declare variable FECAUX DATE;
declare variable FECHA CHAR(8);
declare variable CONC CHAR(120);
declare variable VRDTO NUMERIC(18, 2);
declare variable VRRTFTE NUMERIC(18, 2);
declare variable VRRTIVA NUMERIC(18, 2);
declare variable VRRTICA NUMERIC(18, 2);
declare variable VRTOTAL NUMERIC(18, 2);
declare variable TIPOCOMP VARCHAR(3);
declare variable PREFCONT VARCHAR(4);
declare variable BASE CHAR(1);
declare variable CTABASE VARCHAR(20);
declare variable CAJA CHAR(1);
declare variable CTACAJA VARCHAR(20);
declare variable RTFTE CHAR(1);
declare variable CTARTFTE VARCHAR(20);
declare variable RTIVA CHAR(1);
declare variable CTARTIVA VARCHAR(20);
declare variable RTICA CHAR(1);
declare variable CTARTICA VARCHAR(20);
declare variable DTO CHAR(1);
declare variable CTADTO VARCHAR(20);
declare variable EXISTE CHAR(1);
declare variable CUENTA VARCHAR(20);
declare variable MONTO NUMERIC(18,2);
declare variable ES_RETENCION CHAR(1);
declare variable TIPOCUEN CHAR(1);
declare variable NIT VARCHAR(20);
declare variable PROY VARCHAR(4);
declare variable CENTRO VARCHAR(4);
declare variable MONTOBASE NUMERIC(18,2);
declare variable PORC NUMERIC(9,2);
declare variable DEBITO NUMERIC(18,2);
declare variable CREDITO NUMERIC(18,2);
declare variable NROI INTEGER;
declare variable SUMA NUMERIC(18,2);
declare variable TCTACLIEN VARCHAR(20);
declare variable TCTARTFTE VARCHAR(20);
declare variable TCTARTIVA VARCHAR(20);
declare variable TCTARTICA VARCHAR(20);
declare variable TCTACART VARCHAR(20);
declare variable TIPOIT INTEGER;
declare variable PREFIT VARCHAR(4);
declare variable NUMIT VARCHAR(6);
declare variable NUMEROIT VARCHAR(10);
declare variable ABONOIT NUMERIC(18,2);
declare variable CTADIC VARCHAR(20);
declare variable BASEADIC VARCHAR(20);
declare variable PORCADIC NUMERIC(5,2);
declare variable VALORADIC NUMERIC(18,2);
declare variable DBADIC CHAR(1);
declare variable VRBASE NUMERIC(18,2);
declare variable GMF CHAR(1);
declare variable CODBCO INTEGER;
declare variable NUMCHEQ VARCHAR(20);
declare variable CRUCES NUMERIC(18,2);
declare variable VRCAJA NUMERIC(18,2);
declare variable OK INTEGER;
declare variable DIFCAMBIO NUMERIC(18,2);
declare variable CTADIF VARCHAR(20);
BEGIN
/* BUSQUE LA INTERFACE */
EXISTE = 'N';
SELECT 'S', TICO_COD, PRCO_PRE, INCJ_BASE, INCJ_DTOPP, INCJ_RTFTE, INCJ_RTIVA, INCJ_RTICA, INCJ_CAJA, INCJ_CTABASE, INCJ_CTADTO, INCJ_CTARTFTE, INCJ_CTARTIVA, INCJ_CTARTICA, INCJ_CTACAJA, INCJ_CONFIRMAR
    FROM INTERFAZ_CAJA
    WHERE INCJ_ID = :IDINTER
    INTO :EXISTE, :TIPOCOMP, :PREFCONT, :BASE, :DTO, :RTFTE, :RTIVA, :RTICA, :CAJA, :CTABASE, :CTADTO, :CTARTFTE, :CTARTIVA, :CTARTICA, :CTACAJA, :VER;
if (EXISTE = 'S') then
    BEGIN
    OK = 0;
    FOR SELECT CNTB_ID FROM CONTABILIZACION WHERE CNTB_TIPOREF = 62 AND CNTB_IDREF = :IDDOC INTO :OK DO
        BEGIN
        DELETE FROM CONTABILIZACION_DET WHERE CNTB_ID = :OK;
        DELETE FROM CONTABILIZACION WHERE CNTB_ID = :OK;
        END

    /* TRAIGA EL ENCABEZADO DEL EGRESO */
    SELECT PREF_PRE, EGRE_NUMERO, EGRE_FECHA, E.TERC_NIT, EGRE_CONC, EGRE_DTOF, EGRE_MONTO, EGRE_RTFTEMONTO, EGRE_RTIVAMONTO, EGRE_RTICAMONTO, TERC_CTARTFTE, TERC_CTARTIVA, TERC_CTARTICA, TERC_CTACLIENTE
        FROM EGRESOS E, TERCEROS T
        WHERE EGRE_ID = :IDDOC AND E.TERC_NIT = T.TERC_NIT
        INTO :PREF, :NUM, :FECAUX, :NIT, :CONC, :VRDTO, :VRTOTAL, :VRRTFTE, :VRRTIVA, :VRRTICA, :TCTARTFTE, TCTARTIVA, TCTARTICA, TCTACLIEN;
    /* SI ES PROVEEDOR, SOBREESCIBE LAS CUENTAS  */
    SELECT PROV_CTAPAGAR, PROV_CTARTFTE, PROV_CTARTIVA, PROV_CTARTICA
        FROM PROVEEDORES WHERE TERC_NIT = :NIT
        INTO TCTACLIEN, TCTARTFTE, TCTARTIVA, TCTARTICA;
    SELECT PREF_CENTRO, PREF_PROY FROM PREFIJOS
        WHERE PREF_PRE = :PREF AND TIDO_COD = 62 INTO :CENTRO, :PROY;
    EXECUTE PROCEDURE FECHA_A_CONTA(:FECAUX) returning_values (:FECHA);
    /* REGISTRE EL ENCABEZADO CONTABLE */
    IDC = GEN_ID(ID_CONTABILIZA, 1);
    INSERT INTO CONTABILIZACION (CNTB_ID, CNTB_TIPOCOMP, CNTB_PREFCNT, CNTB_NUMERO, CNTB_FECHA, CNTB_CONCEPTO, CNTB_REF, CNTB_TIPOREF, CNTB_IDREF, CNTB_PREFREF, CNTB_NUMREF, CNTB_PROCESADO)
        VALUES (:IDC, :TIPOCOMP, :PREFCONT, :NUM, :FECHA, :CONC, '', 62, :IDDOC, :PREF, :NUM, 'N');
    /* SUME LOS CRUCES PARA LLEVARLOS A LA CUENTA X PAGAR Y RESTAR DE LA CAJA */
    SELECT SUM(EGCC_ABONO) FROM EGRESOS_CRUCEC WHERE EGRE_ID = :iddoc INTO :CRUCES;
    if (CRUCES IS NULL) then
        CRUCES = 0;
    VRCAJA = VRTOTAL - CRUCES;
    NROI = 0;
    SUMA = 0;
    ERROR = 0;
    /* EL CREDITO EN LA CAJA O EL BANCO */
    IF ((CAJA = 'K')) THEN
        BEGIN
        if (VRCAJA <> 0) then
            BEGIN
            CUENTA = NULL;
            EXECUTE PROCEDURE VALIDE_CUENTA_C (CTACAJA) RETURNING_VALUES (:OK);
            IF (OK = 0) THEN
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :CTACAJA INTO :CUENTA, :TIPOCUEN;
            ELSE
                begin
                EXECUTE PROCEDURE ERROR (62, :IDDOC, :CTACAJA, 2);
                CUENTA = CTACAJA;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 4);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRCAJA, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - VRCAJA;
                END
            END /* VRCAJA <> 0 */
        END /* CAJA CONSTANTE */
    IF ((CAJA = 'F')) THEN
        BEGIN
        /* mueva la cuenta de la caja o el banco o ambas */
        /* PRIMERO LA CAJA */
        FOR SELECT CAJA_CUENTA, EGCA_MONTO FROM EGRESOS_CAJA E, CAJAS C
            WHERE C.CAJA_ID = E.CAJA_ID AND EGRE_ID = :IDDOC
            INTO :CTACAJA, :MONTO
            DO
            BEGIN
            if (MONTO <> 0) then
                BEGIN
                CUENTA = NULL;
                EXECUTE PROCEDURE VALIDE_CUENTA_C (CTACAJA) RETURNING_VALUES (:OK);
                IF (OK = 0) THEN
                    SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                        WHERE CUEN_COD = :CTACAJA INTO :CUENTA, :TIPOCUEN;
                ELSE
                    begin
                    EXECUTE PROCEDURE ERROR (62, :IDDOC, :CTACAJA, 2);
                    CUENTA = CTACAJA;
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 4);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA - MONTO;
                    END
                END /* MONTO <> 0 */
            END /* DO CAJA */
        /* AHORA EL BANCO */
        MONTO = 0;
        SELECT CUBA_CTACONTA, EGBC_MONTO, EGBC_GMF, E.CUBA_COD, CUBA_GMFPOR, EGBC_NUMERO
            FROM EGRESOS_BANCO E, CUENTAS_BANCO C
            WHERE E.CUBA_COD = C.CUBA_COD AND EGRE_ID = :IDDOC
            INTO :CTACAJA, :MONTO, :GMF, :CODBCO, :PORC, :NUMCHEQ;
        if (MONTO <> 0) then
            BEGIN
            if (MONTO <> 0) then
                BEGIN
                CUENTA = NULL;
                EXECUTE PROCEDURE VALIDE_CUENTA_C (CTACAJA) RETURNING_VALUES (:OK);
                IF (OK = 0) THEN
                    SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                        WHERE CUEN_COD = :CTACAJA INTO :CUENTA, :TIPOCUEN;
                ELSE
                    begin
                    EXECUTE PROCEDURE ERROR (62, :IDDOC, :CTACAJA, 2);
                    CUENTA = CTACAJA;
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 4);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, :NUMCHEQ, 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA - MONTO;
                    END
                /* EL GMF */
                if ((GMF = 'S') AND (PORC <> 0)) then
                    BEGIN
                    EXECUTE procedure REDONDEE(:MONTO * :PORC / 1000, 0) returning_values (MONTO);
                    /* REGISTRE EL GMF EN LA MISMA CUENTA DEL BANCO COMO CREDITO */
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, :NUMCHEQ, 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA - MONTO;

                    /* AHORA LA CUENTA DEL GASTO */
                    SELECT CUBA_CTAGMF FROM CUENTAS_BANCO
                        where CUBA_COD = :CODBCO INTO :CTACAJA;
                    EXECUTE PROCEDURE VALIDE_CUENTA_C (CTACAJA) RETURNING_VALUES (:OK);
                    IF (OK = 0) THEN
                        SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                            WHERE CUEN_COD = :CTACAJA INTO :CUENTA, :TIPOCUEN;
                    ELSE
                        begin
                        EXECUTE PROCEDURE ERROR (62, :IDDOC, :CTACAJA, 2);
                        CUENTA = CTACAJA;
                        TIPOCUEN = 'N';
                        ERROR = ERROR + 1;
                        end
                    if (TIPOCUEN = 'I') then
                        BEGIN
                        EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
                        TIPOCUEN = 'N';
                        ERROR = ERROR + 1;
                        END
                    if (TIPOCUEN = 'C') then
                        BEGIN
                        EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 4);
                        TIPOCUEN = 'N';
                        ERROR = ERROR + 1;
                        END
                    if (TIPOCUEN = 'N') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, :NUMCHEQ, :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NROI = NROI + 1;
                        SUMA = SUMA + MONTO;
                        END
                    END /* GMF */
                END /* MONTO <> 0 */
            END /* EGRESO_BANCO */
        END /* CAJA = F */

    /* LOS CRUCES CON CUENTAS X COBRAR */
    if (CRUCES <> 0) then
        BEGIN
        SELECT TERC_CTACLIENTE FROM TERCEROS WHERE TERC_NIT = :nit INTO :tctacart;
        if (tctacart IS NULL) then
            tctacart = tctaclien;
        CUENTA = NULL;
        EXECUTE PROCEDURE VALIDE_CUENTA_C (tctacart) RETURNING_VALUES (:OK);
        IF (OK = 0) THEN
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :tctacart INTO :CUENTA, :TIPOCUEN;
        ELSE
            begin
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :tctacart, 2);
            CUENTA = tctacart;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            /* DEBERIA RECORRER DOCUMENTO POR DOCUMENTO */
            FOR SELECT EGCC_TIPODOC, EGCC_PREFIJO, EGCC_NUMERO, EGCC_ABONO+EGCC_RTFTE+EGCC_RTIVA+EGCC_RTICA+EGCC_DTOF
                FROM egresos_crucec WHERE EGRE_ID = :IDDOC
                INTO :TIPOIT, PREFIT, NUMIT, ABONOIT
                DO
                BEGIN
                NUMEROIT = PREFIT || NUMIT;
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :ABONOIT, 0, 0, :NIT, :PROY, :CENTRO, NULL, :NUMEROIT, NULL, NULL, :TIPOIT, 0);
                SUMA = SUMA - ABONOIT;
                NROI = NROI + 1;
                END
            END
        if (TIPOCUEN = 'N') then
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :CRUCES, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
        SUMA = SUMA - CRUCES;
        NROI = NROI + 1;
        /* LA DIFERENCIA EN CAMBIO */
        SELECT SUM(EGCC_DIFCAMBIO) FROM egresos_crucec WHERE EGRE_ID = :iddoc INTO :DIFCAMBIO;
        IF ((DIFCAMBIO IS NOT NULL) AND (DIFCAMBIO <> 0)) THEN
            BEGIN
            if (DIFCAMBIO > 0) then
                execute procedure lee_configuracion('GENERAL','GENERAL','CUENTA DE INGRESO POR DIFERENCIA EN CAMBIO PARA OPERACIONES EN OTRA MONEDA') returning_values (:ctadif);
            else
                execute procedure lee_configuracion('GENERAL','GENERAL','CUENTA DE GASTO POR DIFERENCIA EN CAMBIO PARA OPERACIONES EN OTRA MONEDA') returning_values (:ctadif);
            CUENTA = NULL;
            EXECUTE PROCEDURE VALIDE_CUENTA_C (ctadif) RETURNING_VALUES (:OK);
            IF (OK = 0) THEN
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :ctadif INTO :CUENTA, :TIPOCUEN;
            ELSE
                begin
                EXECUTE PROCEDURE ERROR (62, :IDDOC, :ctadif, 2);
                CUENTA = ctadif;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 4);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                if (DIFCAMBIO > 0) then
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :difcambio, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                else
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', ABS(:difcambio), 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - difcambio;
                END
            END
        END /* cruces */

    if (DTO = 'K') then /* DTO EN CTA CONSTANTE */
        BEGIN
        if (VRDTO <> 0) then
            BEGIN
            CUENTA = NULL;
            EXECUTE PROCEDURE VALIDE_CUENTA_C (CTADTO) RETURNING_VALUES (:OK);
            IF (OK = 0) THEN
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :CTADTO INTO :CUENTA, :TIPOCUEN;
            ELSE
                begin
                EXECUTE PROCEDURE ERROR (62, :IDDOC, :CTADTO, 2);
                CUENTA = CTADTO;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 4);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRDTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - VRDTO;
                END
            END /* VRDTO <> 0 */
        END /* DTO EN CTA CONSTANTE */

    /* LA DIFERENCIA EN CAMBIO */
    SELECT SUM(EGDE_DIFCAMBIO) FROM egresos_detalle WHERE EGRE_ID = :iddoc INTO :DIFCAMBIO;
    IF ((DIFCAMBIO IS NOT NULL) AND (DIFCAMBIO <> 0)) THEN
        BEGIN
        if (DIFCAMBIO > 0) then
            execute procedure lee_configuracion('GENERAL','GENERAL','CUENTA DE GASTO POR DIFERENCIA EN CAMBIO PARA OPERACIONES EN OTRA MONEDA') returning_values (:ctadif);
        else
            execute procedure lee_configuracion('GENERAL','GENERAL','CUENTA DE INGRESO POR DIFERENCIA EN CAMBIO PARA OPERACIONES EN OTRA MONEDA') returning_values (:ctadif);
        CUENTA = NULL;
        EXECUTE PROCEDURE VALIDE_CUENTA_C (ctadif) RETURNING_VALUES (:OK);
        IF (OK = 0) THEN
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :ctadif INTO :CUENTA, :TIPOCUEN;
        ELSE
            begin
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :ctadif, 2);
            CUENTA = ctadif;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 4);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            if (DIFCAMBIO > 0) then
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :difcambio, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            else
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, ABS(:difcambio), 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA + difcambio;
            END
        END
    /* RETENCION FUENTE */
    if ((RTFTE = 'T') or (RTFTE = 'K')) then
      if (VRRTFTE <> 0) then
        BEGIN
        if (RTFTE = 'T') then
            CTARTFTE = TCTARTFTE;
        CUENTA = NULL;
        EXECUTE PROCEDURE VALIDE_CUENTA_C (CTARTFTE) RETURNING_VALUES (:OK);
        IF (OK = 0) THEN
            SELECT CUEN_COD, CUEN_RETENCION, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTARTFTE INTO :CUENTA, :ES_RETENCION, :TIPOCUEN;
        ELSE
            begin
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :CTARTFTE, 2);
            CUENTA = CTARTFTE;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 4);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            if (ES_RETENCION = 'S') then
                BEGIN
                VRBASE = VRTOTAL;
                SELECT PROV_RETEFTE from proveedores where terc_nit = :NIT INTO :PORC;
                END
            ELSE
                BEGIN
                VRBASE = 0;
                PORC = 0;
                END
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, :VRBASE, :PORC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA - VRRTFTE;
            END
        END /* RTFTE */
    /* RETENCION IVA */
    if ((RTIVA = 'T') or (RTIVA = 'K')) then
      if (VRRTIVA <> 0) then
        BEGIN
        if (RTIVA = 'T') then
            CTARTIVA = TCTARTIVA;
        CUENTA = NULL;
        EXECUTE PROCEDURE VALIDE_CUENTA_C (CTARTIVA) RETURNING_VALUES (:OK);
        IF (OK = 0) THEN
            SELECT CUEN_COD, CUEN_RETENCION, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTARTIVA INTO :CUENTA, :ES_RETENCION, :TIPOCUEN;
        ELSE
            begin
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :CTARTIVA, 2);
            CUENTA = CTARTIVA;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 4);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            if (ES_RETENCION = 'S') then
                BEGIN
                VRBASE = VRTOTAL;
                SELECT PROV_RTEIVA from proveedores where terc_nit = :NIT INTO :PORC;
                END
            ELSE
                BEGIN
                VRBASE = 0;
                PORC = 0;
                END
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTIVA, :VRBASE, :PORC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA - VRRTIVA;
            END
        END /* RTIVA */
    /* RETENCION DE ICA */
    if ((RTICA = 'T') or (RTICA = 'K')) then
      if (VRRTICA <> 0) then
        BEGIN
        if (RTICA = 'T') then
            CTARTICA = TCTARTICA;
        CUENTA = NULL;
        EXECUTE PROCEDURE VALIDE_CUENTA_C (CTARTICA) RETURNING_VALUES (:OK);
        IF (OK = 0) THEN
            SELECT CUEN_COD, CUEN_RETENCION, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTARTICA INTO :CUENTA, :ES_RETENCION, :TIPOCUEN;
        ELSE
            begin
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :CTARTICA, 2);
            CUENTA = CTARTICA;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 4);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            if (ES_RETENCION = 'S') then
                BEGIN
                VRBASE = VRTOTAL;
                SELECT PROV_RTEICA from proveedores where terc_nit = :NIT INTO :PORC;
                END
            ELSE
                BEGIN
                VRBASE = 0;
                PORC = 0;
                END
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTICA, :VRBASE, :PORC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA - VRRTICA;
            END
        END /* RTICA */
    /* RECORRA LAS CUENTAS DE EGRESOS_CONTABILIDAD */
    FOR SELECT CUEN_COD, EGCO_NIT, EGCO_PROY, EGCO_CENTRO, EGCO_CONC, EGCO_DEBITOS, EGCO_CREDITOS, EGCO_BASEM, EGCO_PORC
        FROM EGRESOS_CONTABILIDAD WHERE EGRE_ID = :IDDOC ORDER BY EGCO_ITEM
        INTO :CTABASE, :NIT, :PROY, :CENTRO, :CONC, :DEBITO, :CREDITO, :MONTOBASE, :PORC
        DO
        BEGIN
        CUENTA = NULL;
        EXECUTE PROCEDURE VALIDE_CUENTA_C (CTABASE) RETURNING_VALUES (:OK);
        IF (OK = 0) THEN
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTABASE INTO :CUENTA, :TIPOCUEN;
        ELSE
            begin
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :CTABASE, 2);
            CUENTA = CTABASE;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 4);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'N') then
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :DEBITO, :CREDITO, :MONTOBASE, :PORC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
        SUMA = SUMA + DEBITO - CREDITO;
        NROI = NROI + 1;
        END
    /* CIERRE EL COMPROBANTE CONTRA LA CUENTA DEL TERCERO O LA BASE CONSTANTE */
    if ((SUMA <> 0) and (BASE = 'F') or (BASE = 'T') or (BASE = 'K')) then
        BEGIN
        if (SUMA < 0) then
            BEGIN
            DEBITO = SUMA * -1;
            CREDITO = 0;
            END
        ELSE
            BEGIN
            DEBITO = 0;
            CREDITO = SUMA;
            END
        if (BASE = 'T') then
            CTABASE = TCTACLIEN;
        if (BASE = 'F') then
            BEGIN
            SELECT CAJA_CUENTA FROM EGRESOS E, CAJAS C
                WHERE C.CAJA_ID = E.CAJA_ID AND EGRE_ID = :IDDOC INTO :CTABASE;
            END
        CUENTA = NULL;
        EXECUTE PROCEDURE VALIDE_CUENTA_C (CTABASE) RETURNING_VALUES (:OK);
        IF (OK = 0) THEN
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTABASE INTO :CUENTA, :TIPOCUEN;
        ELSE
            begin
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :CTABASE, 2);
            CUENTA = CTABASE;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            /* DEBERIA RECORRER DOCUMENTO POR DOCUMENTO */
            FOR SELECT RCDE_TIPODOC, RCDE_PREFIJO, RCDE_NUMERO, RCDE_ABONO+RCDE_RTFTE+RCDE_RTIVA+RCDE_RTICA+RCDE_DTOF
                FROM RECIBOS_CAJA_DETALLE WHERE RECA_ID = :IDDOC
                INTO :TIPOIT, PREFIT, NUMIT, ABONOIT
                DO
                BEGIN
                NUMEROIT = PREFIT || NUMIT;
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :ABONOIT, 0, 0, :NIT, :PROY, :CENTRO, NULL, :NUMEROIT, NULL, NULL, :TIPOIT, 0);
                NROI = NROI + 1;
                END
            END
        if (TIPOCUEN = 'N') then
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :DEBITO, :CREDITO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
        NROI = NROI + 1;
        END /* SUMA EN CARTERA */
    /* recorra las cuentas adicionales */
    FOR SELECT INJC_CUENTA, INJC_BASE, INJC_PORC, INJC_VALOR, INJC_DB
        FROM INTERFAZ_CAJA_CTAS
        WHERE INCJ_ID = :IDINTER
        INTO :CTADIC, :BASEADIC, :PORCADIC, :VALORADIC, :DBADIC
        DO
        BEGIN
        if (:BASEADIC = 'TOTAL') then
            VALORADIC = VRTOTAL;
        if (:BASEADIC = 'DESCUENTO') then
            VALORADIC = VRDTO;
        if (:BASEADIC = 'RTFTE') then
            VALORADIC = VRRTFTE;
        if (:BASEADIC = 'RTIVA') then
            VALORADIC = VRRTIVA;
        if (:BASEADIC = 'RTICA') then
            VALORADIC = VRRTICA;
        MONTO = VALORADIC * PORCADIC;
        CUENTA = NULL;
        EXECUTE PROCEDURE VALIDE_CUENTA_C (CTADIC) RETURNING_VALUES (:OK);
        IF (OK = 0) THEN
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTADIC INTO :CUENTA, :TIPOCUEN;
        ELSE
            begin
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :CTADIC, 2);
            CUENTA = CTADIC;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 4);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            if (DBADIC = 'S') then
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTADIC, :CONC, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            ELSE
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTADIC, :CONC, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            END
        NROI = NROI + 1;
        END
    if (ERROR > 0) then
        VER = 'S';
    SUSPEND;
    END /* EXISTE LA INTERFAZ */
  ELSE
    BEGIN
    EXECUTE PROCEDURE ERROR (62, :IDDOC, :PREF, 1);
    ERROR = ERROR + 1;
    VER = 'S';
    SUSPEND;
    END
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE EGRESOS_SIN_CONTABILIDAD(
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    ID INTEGER,
    IDI INTEGER,
    IDC INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    ESTADO VARCHAR(20),
    ERROR INTEGER)
AS
DECLARE VARIABLE VER CHAR(2);
declare variable FECICNT VARCHAR(10);
declare variable FECFCNT VARCHAR(10);
declare variable idref INTEGER;
BEGIN /*$$IBE$$ 
EXECUTE PROCEDURE fecha_a_conta(FECINI) returning_values (FECICNT);
EXECUTE PROCEDURE fecha_a_conta(FECFIN) returning_values (FECFCNT);
FOR SELECT EGRE_ID, PREF_PRE, egre_numero FROM EGRESOS WHERE EGRE_ANULADO = 'N' AND PREF_PRE <> 'R004' AND
    EGRE_FECHA >= :FECINI AND EGRE_FECHA <= :FECFIN ORDER BY EGRE_ID INTO :ID, :PREF, :NUMERO
DO
  BEGIN
  idref = null;
  SELECT ENCO_IDREF FROM COMPROBANTE_ENCABEZADO WHERE ENCO_TIPOREF = 62 AND ENCO_FECHA >= :FECICNT AND ENCO_FECHA <= :FECFCNT and ENCO_IDREF = :ID into :idref;
  if (idref IS NULL) then
  begin
   ESTADO = 'PROCESANDO';
   SUSPEND;
   SELECT MAX(INCJ_ID) FROM INTERFAZ_CAJA WHERE PREF_PRE = :PREF AND TIDO_COD = 62 INTO :IDI;
   EXECUTE PROCEDURE CONTABIL_EGRESO (:ID, :IDI) RETURNING_VALUES (:ERROR, :VER, :IDC);
   IF (ERROR = 0) THEN
      BEGIN
      EXECUTE PROCEDURE CONTABILIZA_PENDIENTE (:IDC);
      ESTADO = 'OK';
      END
   ELSE
    ESTADO = 'ERROR';
   suspend;
  end
  END
 $$IBE$$*/ SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE EGRESOS_SIN_CONTABILIDAD(
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    ID INTEGER,
    IDI INTEGER,
    IDC INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    ESTADO VARCHAR(20),
    ERROR INTEGER)
AS
DECLARE VARIABLE VER CHAR(2);
declare variable FECICNT VARCHAR(10);
declare variable FECFCNT VARCHAR(10);
declare variable idref INTEGER;
BEGIN
EXECUTE PROCEDURE fecha_a_conta(FECINI) returning_values (FECICNT);
EXECUTE PROCEDURE fecha_a_conta(FECFIN) returning_values (FECFCNT);
FOR SELECT EGRE_ID, PREF_PRE, egre_numero FROM EGRESOS WHERE EGRE_ANULADO = 'N' AND PREF_PRE <> 'R004' AND
    EGRE_FECHA >= :FECINI AND EGRE_FECHA <= :FECFIN ORDER BY EGRE_ID INTO :ID, :PREF, :NUMERO
DO
  BEGIN
  idref = null;
  SELECT ENCO_IDREF FROM COMPROBANTE_ENCABEZADO WHERE ENCO_TIPOREF = 62 AND ENCO_FECHA >= :FECICNT AND ENCO_FECHA <= :FECFCNT and ENCO_IDREF = :ID into :idref;
  if (idref IS NULL) then
  begin
   ESTADO = 'PROCESANDO';
   SUSPEND;
   SELECT MAX(INCJ_ID) FROM INTERFAZ_CAJA WHERE PREF_PRE = :PREF AND TIDO_COD = 62 INTO :IDI;
   EXECUTE PROCEDURE CONTABIL_EGRESO (:ID, :IDI) RETURNING_VALUES (:ERROR, :VER, :IDC);
   IF (ERROR = 0) THEN
      BEGIN
      EXECUTE PROCEDURE CONTABILIZA_PENDIENTE (:IDC);
      ESTADO = 'OK';
      END
   ELSE
    ESTADO = 'ERROR';
   suspend;
  end
  END
END

^

SET TERM ; ^


/* 2081219D GRANTS PENDIENTES */

grant ALL on SALDOS_CUENTAS to PUBLIC;
grant ALL on SALDOS_CENTROS to PUBLIC;
grant ALL on PUNTOS_VENDEDOR to PUBLIC;
grant ALL on SALDOS_ARTICULO to PUBLIC;
grant ALL on SALDOS_TERCEROS to PUBLIC;
grant ALL on COMISIONES_PUNTOS to PUBLIC;
grant ALL on SALDOS_DOC_CARTERA to PUBLIC;
grant ALL on SALDOS_CENTROS_TERCERO to PUBLIC;
grant ALL on CONCILIACION_ENCABEZADO to PUBLIC;
grant execute on procedure cruces_documentos to public;


/* 20081220 REPORTE DE EXISTENCIAS CON PESO Y REPORTE DE ENSAMBLES */

SET TERM ^ ;

CREATE OR ALTER PROCEDURE EXISTENCIAS_DESDE_HASTA(
    FECHA DATE,
    ARTINI VARCHAR(20),
    ARTFIN VARCHAR(20),
    GRPINI VARCHAR(3),
    GRPFIN VARCHAR(3),
    BODINI VARCHAR(2),
    BODFIN VARCHAR(2),
    ORDEN CHAR(1),
    AGRUPA CHAR(1),
    DETALLE CHAR(1),
    RESERVA CHAR(1),
    ENPESO CHAR(1),
    SUCURSAL INTEGER)
RETURNS (
    CANT NUMERIC(18,4),
    COSTO NUMERIC(18,2),
    COSTO_LOTE NUMERIC(18,2),
    CODIGO VARCHAR(15),
    NOMBRE VARCHAR(60),
    UNIDAD VARCHAR(8),
    STAND VARCHAR(15),
    CODGRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    CODSUBG VARCHAR(3),
    NOMSUBG VARCHAR(30),
    CODMARC VARCHAR(3),
    NOMMARC VARCHAR(30),
    CODBOD VARCHAR(2),
    LOTE VARCHAR(15),
    NOMBOD VARCHAR(30),
    COSTOTOT NUMERIC(18,2),
    ULTCOSTO NUMERIC(18,2),
    FECHACOSTO DATE,
    CONSUMO NUMERIC(18,2),
    RESERVADO NUMERIC(18,4),
    ORDENADO NUMERIC(18,4),
    IVA NUMERIC(9,2),
    PESOUNIT NUMERIC(18,4),
    PESOTOTAL NUMERIC(18,4),
    CODBAR VARCHAR(20))
AS
declare variable exist char(1);
declare variable codini varchar(20);
declare variable codfin varchar(20);
declare variable desini varchar(20);
declare variable desfin varchar(20);
declare variable ordenc numeric(18,4);
declare variable pedido numeric(18,4);
declare variable ok char(1);
declare variable id integer;
declare variable item integer;
declare variable und varchar(8);
declare variable factor numeric(18,4);
declare variable cant2 numeric(18,4);
declare variable PEDAUTO CHAR(2);
BEGIN
if (ORDEN = 'C') then
    BEGIN
    CODINI = ARTINI;
    CODFIN = ARTFIN;
    DESINI = '';
    DESFIN = 'zz';
    END
ELSE
    BEGIN
    DESINI = ARTINI;
    DESFIN = ARTFIN;
    CODINI = '';
    CODFIN = 'zz';
    END
EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION', 'FACTURAS', 'GENERAR PEDIDO AUTOMATICAMENTE CON LA FACTURA') returning_values (pedauto);
if (DETALLE = 'B') then
  BEGIN
  FOR SELECT ARTI_COD, ARTI_DES, ARTI_UNIDAD, ARTI_EXIST, TAIV_PORC, A.GRUP_COD, A.SUBG_COD, A.MARC_COD, BODE_COD, BODE_NOM, ARTI_CONSUMO, ARTI_PESO/1000
      FROM ARTICULO A, BODEGA B, TARIFA_IVA T
      WHERE ARTI_COD >= :CODINI AND ARTI_COD <= :CODFIN AND ARTI_DES >= :DESINI AND ARTI_DES <= :DESFIN AND ESAR_COD <> 'I' AND BODE_COD >= :BODINI AND
      BODE_COD <= :BODFIN AND ((SUCU_ID = :SUCURSAL) or (:SUCURSAL = 0)) AND A.TAIV_COD = T.TAIV_COD
      INTO :CODIGO, :NOMBRE, :UNIDAD, :EXIST, :IVA, :CODGRUPO, :CODSUBG, :CODMARC, :CODBOD, :NOMBOD, :CONSUMO, :pesounit
      DO
        BEGIN
        OK = 'N';
        if (AGRUPA = 'G') then
            BEGIN
            if ((CODGRUPO >= GRPINI) AND (CODGRUPO <= GRPFIN)) then
                OK = 'S';
            end
        ELSE
            if (AGRUPA = 'M') then
                BEGIN
                if ((CODMARC >= GRPINI) AND (CODMARC <= GRPFIN)) then
                    OK = 'S';
                END
        if (OK = 'S') then
            BEGIN
            NOMGRUPO = '';
            NOMMARC = '';
            NOMSUBG = '';
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            SELECT MAX(COBA_COD) FROM BARRAS_ARTICULO WHERE ARTI_COD = :codigo AND COBA_UNIDAD = :unidad INTO :codbar;
            if (CODBAR IS NULL) then
                CODBAR = CODIGO;
            if (EXIST <> 'N') then
                BEGIN
                SELECT MAX(EXIS_STAND) FROM EXISTENCIA WHERE ARTI_COD = :CODIGO AND BODE_COD = :CODBOD INTO :STAND;
                EXECUTE PROCEDURE SALDO_INICIAL_INVENTARIO(CODIGO, FECHA, :CODBOD) returning_values (CANT);
                EXECUTE PROCEDURE COSTO_PROMEDIO_UNIDAD(CODIGO, FECHA, UNIDAD) returning_values (COSTO);
                EXECUTE PROCEDURE ULTIMO_COSTO(CODIGO, FECHA, UNIDAD) returning_values (ULTCOSTO);
                SELECT MAX(MVAR_FECHA) FROM MOVIMIENTO_ARTICULO WHERE ARTI_COD = :CODIGO AND MVAR_ENTRADA = 'S' AND MVAR_FECHA <= :FECHA INTO :FECHACOSTO;
                COSTOTOT = :CANT * :COSTO;
                CONSUMO = CONSUMO * CANT;
                if (RESERVA = 'S') then
                    BEGIN
                    SELECT SUM(ORID_ENTREGAR)
                        FROM ORDENINVENTARIO_DETALLE OD, ordenes_inventario O
                        WHERE O.ORIN_ID = OD.ORIN_ID AND ARTI_COD = :CODIGO AND ORIN_FECHA <= :FECHA AND ORIN_FECLLEGA >= :FECHA AND ORID_ANULADO = 'N' AND OD.BODE_COD = :CODBOD
                        INTO :ORDENADO;
                    if (ORDENADO IS NULL) then
                        ORDENADO = 0;
                    ORDENC = 0;
                    FOR SELECT O.ORDC_ID, OCDE_ITEM, OCDE_CANT * OCDE_FACTOR
                        FROM ORDENES_COMPRA O, ORDENES_COMPRA_DETALLE OD
                        WHERE O.ORDC_ID = OD.ORDC_ID AND OD.ARTI_COD = :CODIGO AND (ORDC_FECHA+ORDC_VALIDEZ) >= :FECHA AND ORDC_FECHA <= :FECHA AND OCDE_ANULADO = 'N' AND OD.BODE_COD = :CODBOD
                        INTO :ID, :ITEM, :CANT2
                        do
                        BEGIN
                        EXECUTE PROCEDURE FALTANTE(23, 21, ID, ITEM) returning_values (PEDIDO, UND, FACTOR);
                        if (PEDIDO * FACTOR = CANT2) then /* SI NO SE HA FACTURADO MIRE A VER SI SE REMISIONO */
                            EXECUTE PROCEDURE FALTANTE(23, 22, ID, ITEM) returning_values (PEDIDO, UND, FACTOR);
                        if (PEDIDO IS NULL) then
                            PEDIDO = 0;
                        ORDENC = ORDENC + PEDIDO * FACTOR;
                        END
                    ORDENADO = ORDENADO + ORDENC;
                    SELECT SUM(RSDE_LIBERAR)
                        FROM RESERVAS_DETALLE RD, RESERVAS R
                        WHERE R.RESE_ID = RD.RESE_ID AND ARTI_COD = :CODIGO AND RESE_FECHA <= :FECHA AND RESE_VENCE >= :FECHA AND RD.BODE_COD = :CODBOD AND RSDE_ANULADO = 'N'
                        INTO :RESERVADO;
                    if (RESERVADO IS NULL) then
                        RESERVADO = 0;
                    PEDIDO = 0;
                    FOR SELECT P.PEDI_ID, PEDE_ITEM, PEDE_CANT * PEDE_FACTOR
                        FROM PEDIDOS P, PEDIDOS_DETALLE PD
                        WHERE P.PEDI_ID = PD.PEDI_ID AND PD.ARTI_COD = :CODIGO AND (PEDI_FECHA+PEDI_VALIDEZ) >= :FECHA AND PEDI_FECHA <= :FECHA AND PEDE_ANULADO = 'N' AND BODE_COD = :CODBOD
                        INTO :ID, :ITEM, :CANT2
                        do
                        BEGIN
                        EXECUTE PROCEDURE FALTANTE(34, 31, ID, ITEM) returning_values (ORDENC, UND, FACTOR);
                        if ((ORDENC * FACTOR = CANT2) or (PEDAUTO = 'SI')) then /* SI NO SE HA FACTURADO MIRE A VER SI SE REMISIONO */
                            EXECUTE PROCEDURE FALTANTE(34, 32, ID, ITEM) returning_values (ORDENC, UND, FACTOR);
                        if (ORDENC IS NULL) then
                            ORDENC = 0;
                        PEDIDO = PEDIDO + ORDENC * FACTOR;
                        END
                    RESERVADO = RESERVADO + PEDIDO;
                    END
                ELSE
                    BEGIN
                    RESERVADO = 0;
                    ORDENADO = 0;
                    END
                if (ENPESO = 'S') then
                    BEGIN
                    if (pesounit IS NULL) then
                        pesounit = 0;
                    if (PESOUNIT <> 0) then
                        BEGIN
                        pesototal = PESOUNIT * cant;
                        SUSPEND;
                        END
                    END
                ELSE
                    SUSPEND;
                END
            END
        END
  END

if (DETALLE = 'L') then
  BEGIN
  FOR SELECT A.ARTI_COD, ARTI_DES, ARTI_UNIDAD, ARTI_EXIST, TAIV_PORC, A.GRUP_COD, A.SUBG_COD, A.MARC_COD, L.lote_nro, L.lote_nro||' - '||L.lote_vence, ARTI_CONSUMO,l.bode_cod, L.lote_saldo,l.lote_costo, ARTI_PESO/1000
      FROM ARTICULO A, LOTES l, TARIFA_IVA T
      WHERE A.ARTI_COD >= '0' AND A.ARTI_COD <= 'zz' AND ARTI_DES >= '' AND ARTI_DES <= 'zz' AND ESAR_COD <> 'I' AND A.TAIV_COD = T.TAIV_COD and a.arti_cod = l.arti_cod
      INTO :CODIGO, :NOMBRE, :UNIDAD, :EXIST, :IVA, :CODGRUPO, :CODSUBG, :CODMARC, :LOTE, :NOMBOD, :CONSUMO, :codbod, :cant, :costo_lote, :pesounit
      DO
        BEGIN
        OK = 'N';
        if (AGRUPA = 'G') then
            BEGIN
            if ((CODGRUPO >= GRPINI) AND (CODGRUPO <= GRPFIN)) then
                OK = 'S';
            end
        ELSE
            if (AGRUPA = 'M') then
                BEGIN
                if ((CODMARC >= GRPINI) AND (CODMARC <= GRPFIN)) then
                    OK = 'S';
                END
        if (OK = 'S') then
            BEGIN
            NOMGRUPO = '';
            NOMMARC = '';
            NOMSUBG = '';
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            SELECT MAX(COBA_COD) FROM BARRAS_ARTICULO WHERE ARTI_COD = :codigo AND COBA_UNIDAD = :unidad INTO :codbar;
            if (CODBAR IS NULL) then
                CODBAR = CODIGO;

            if (EXIST <> 'N') then
                BEGIN
                EXECUTE PROCEDURE COSTO_PROMEDIO_UNIDAD(CODIGO, FECHA, UNIDAD) returning_values (COSTO);
                EXECUTE PROCEDURE ULTIMO_COSTO(CODIGO, FECHA, UNIDAD) returning_values (ULTCOSTO);
                SELECT MAX(MVAR_FECHA) FROM MOVIMIENTO_ARTICULO WHERE ARTI_COD = :CODIGO AND MVAR_ENTRADA = 'S' AND MVAR_FECHA <= :FECHA INTO :FECHACOSTO;
                COSTOTOT = :CANT * :COSTO;
                CONSUMO = CONSUMO * CANT;
                if (RESERVA = 'S') then
                    BEGIN
                    SELECT SUM(ORID_ENTREGAR)
                        FROM ORDENINVENTARIO_DETALLE OD, ordenes_inventario O
                        WHERE O.ORIN_ID = OD.ORIN_ID AND ARTI_COD = :CODIGO AND ORIN_FECHA <= :FECHA AND ORIN_FECLLEGA >= :FECHA AND ORID_ANULADO = 'N'
                        INTO :ORDENADO;
                    if (ORDENADO IS NULL) then
                        ORDENADO = 0;
                    ORDENC = 0;
                    FOR SELECT O.ORDC_ID, OCDE_ITEM, OCDE_CANT * OCDE_FACTOR
                        FROM ORDENES_COMPRA O, ORDENES_COMPRA_DETALLE OD
                        WHERE O.ORDC_ID = OD.ORDC_ID AND OD.ARTI_COD = :CODIGO AND (ORDC_FECHA+ORDC_VALIDEZ) >= :FECHA AND ORDC_FECHA <= :FECHA AND OCDE_ANULADO = 'N'
                        INTO :ID, :ITEM, :CANT2
                        do
                        BEGIN
                        EXECUTE PROCEDURE FALTANTE(23, 21, ID, ITEM) returning_values (PEDIDO, UND, FACTOR);
                        if (PEDIDO * FACTOR = CANT2) then /* SI NO SE HA FACTURADO MIRE A VER SI SE REMISIONO */
                            EXECUTE PROCEDURE FALTANTE(23, 22, ID, ITEM) returning_values (PEDIDO, UND, FACTOR);
                        if (PEDIDO IS NULL) then
                            PEDIDO = 0;
                        ORDENC = ORDENC + PEDIDO * FACTOR;
                        END
                    ORDENADO = ORDENADO + ORDENC;
                    SELECT SUM(RSDE_LIBERAR)
                        FROM RESERVAS_DETALLE RD, RESERVAS R
                        WHERE R.RESE_ID = RD.RESE_ID AND ARTI_COD = :CODIGO AND RESE_FECHA <= :FECHA AND RESE_VENCE >= :FECHA AND RSDE_ANULADO = 'N'
                        INTO :RESERVADO;
                    if (RESERVADO IS NULL) then
                        RESERVADO = 0;
                    PEDIDO = 0;
                    FOR SELECT P.PEDI_ID, PEDE_ITEM, PEDE_CANT * PEDE_FACTOR
                        FROM PEDIDOS P, PEDIDOS_DETALLE PD
                        WHERE P.PEDI_ID = PD.PEDI_ID AND PD.ARTI_COD = :CODIGO AND (PEDI_FECHA+PEDI_VALIDEZ) >= :FECHA AND PEDI_FECHA <= :FECHA AND PEDE_ANULADO = 'N'
                        INTO :ID, :ITEM, :CANT2
                        do
                        BEGIN
                        EXECUTE PROCEDURE FALTANTE(34, 31, ID, ITEM) returning_values (ORDENC, UND, FACTOR);
                        if ((ORDENC * FACTOR = CANT2) or (PEDAUTO = 'SI')) then /* SI NO SE HA FACTURADO MIRE A VER SI SE REMISIONO */
                            EXECUTE PROCEDURE FALTANTE(34, 32, ID, ITEM) returning_values (ORDENC, UND, FACTOR);
                        if (ORDENC IS NULL) then
                            ORDENC = 0;
                        PEDIDO = PEDIDO + ORDENC * FACTOR;
                        END
                    RESERVADO = RESERVADO + PEDIDO;
                    END
                ELSE
                    BEGIN
                    RESERVADO = 0;
                    ORDENADO = 0;
                    END
                if (ENPESO = 'S') then
                    BEGIN
                    if (pesounit IS NULL) then
                        pesounit = 0;
                    if (PESOUNIT <> 0) then
                        BEGIN
                        pesototal = PESOUNIT * cant;
                        SUSPEND;
                        END
                    END
                ELSE
                    SUSPEND;
                END
            END
        END
  end
if (DETALLE = 'N') then
  BEGIN
  FOR SELECT ARTI_COD, ARTI_DES, ARTI_UNIDAD, ARTI_EXIST, TAIV_PORC, A.GRUP_COD, A.SUBG_COD, A.MARC_COD, ARTI_CONSUMO, ARTI_PESO/1000
      FROM ARTICULO A, TARIFA_IVA T
      WHERE ARTI_COD >= :CODINI AND ARTI_COD <= :CODFIN AND ARTI_DES >= :DESINI AND ARTI_DES <= :DESFIN AND ESAR_COD <> 'I' AND A.TAIV_COD = T.TAIV_COD
      INTO :CODIGO, :NOMBRE, :UNIDAD, :EXIST, :IVA, :CODGRUPO, :CODSUBG, :CODMARC, :CONSUMO, :pesounit
      DO
        BEGIN
        OK = 'N';
        if (AGRUPA = 'G') then
            BEGIN
            if ((GRPINI = '0') AND (GRPFIN = 'zz')) then
                OK = 'S';
            else
                if ((CODGRUPO >= GRPINI) AND (CODGRUPO <= GRPFIN)) then
                    OK = 'S';
            end
        ELSE
            if (AGRUPA = 'M') then
                BEGIN
                if ((GRPINI = '0') AND (GRPFIN = 'zzz')) then
                    OK = 'S';
                else
                    if ((CODMARC >= GRPINI) AND (CODMARC <= GRPFIN)) then
                        OK = 'S';
                END
        if (OK = 'S') then
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            SELECT MAX(COBA_COD) FROM BARRAS_ARTICULO WHERE ARTI_COD = :codigo AND COBA_UNIDAD = :unidad INTO :codbar;
            if (CODBAR IS NULL) then
                CODBAR = CODIGO;

            if (EXIST <> 'N') then
                BEGIN
                EXECUTE PROCEDURE SALDO_INICIAL_TOTAL_INV(CODIGO, FECHA) returning_values (CANT);
                EXECUTE PROCEDURE COSTO_PROMEDIO_UNIDAD(CODIGO, FECHA, UNIDAD) returning_values (COSTO);
                EXECUTE PROCEDURE ULTIMO_COSTO(CODIGO, FECHA, UNIDAD) returning_values (ULTCOSTO);
                SELECT MAX(MVAR_FECHA) FROM MOVIMIENTO_ARTICULO WHERE ARTI_COD = :CODIGO AND MVAR_ENTRADA = 'S' AND MVAR_FECHA <= :FECHA INTO :FECHACOSTO;
                COSTOTOT = :CANT * :COSTO;
                CONSUMO = CONSUMO * CANT;
                if (RESERVA = 'S') then
                    BEGIN
                    SELECT SUM(ORID_ENTREGAR)
                        FROM ORDENINVENTARIO_DETALLE OD, ordenes_inventario O
                        WHERE O.ORIN_ID = OD.ORIN_ID AND ARTI_COD = :CODIGO AND ORIN_FECHA <= :FECHA AND ORIN_FECLLEGA >= :FECHA AND ORID_ANULADO = 'N'
                        INTO :ORDENADO;
                        if (ORDENADO IS NULL) then
                            ORDENADO = 0;
                    ORDENC = 0;
                    FOR SELECT O.ORDC_ID, OCDE_ITEM, OCDE_CANT * OCDE_FACTOR
                        FROM ORDENES_COMPRA O, ORDENES_COMPRA_DETALLE OD
                        WHERE O.ORDC_ID = OD.ORDC_ID AND OD.ARTI_COD = :CODIGO AND (ORDC_FECHA+ORDC_VALIDEZ) >= :FECHA AND ORDC_FECHA <= :FECHA AND OCDE_ANULADO = 'N'
                        INTO :ID, :ITEM, :CANT2
                        do
                        BEGIN
                        EXECUTE PROCEDURE FALTANTE(23, 21, ID, ITEM) returning_values (PEDIDO, UND, FACTOR);
                        if (PEDIDO * FACTOR = CANT2) then /* SI NO SE HA FACTURADO MIRE A VER SI SE REMISIONO */
                            EXECUTE PROCEDURE FALTANTE(23, 22, ID, ITEM) returning_values (PEDIDO, UND, FACTOR);
                        if (PEDIDO IS NULL) then
                            PEDIDO = 0;
                        ORDENC = ORDENC + PEDIDO * FACTOR;
                        END
                    ORDENADO = ORDENADO + ORDENC;
                    SELECT SUM(RSDE_LIBERAR)
                        FROM RESERVAS_DETALLE RD, RESERVAS R
                        WHERE R.RESE_ID = RD.RESE_ID AND ARTI_COD = :CODIGO AND RESE_FECHA <= :FECHA AND RESE_VENCE >= :FECHA AND RSDE_ANULADO = 'N'
                        INTO :RESERVADO;
                    if (RESERVADO IS NULL) then
                        RESERVADO = 0;
                    PEDIDO = 0;
                    FOR SELECT P.PEDI_ID, PEDE_ITEM, PEDE_CANT * PEDE_FACTOR
                        FROM PEDIDOS P, PEDIDOS_DETALLE PD, PUNTO_VENTA PT
                        WHERE P.PEDI_ID = PD.PEDI_ID AND PD.ARTI_COD = :CODIGO AND PT.ptvt_id = P.PTVT_ID AND (PEDI_FECHA+PEDI_VALIDEZ) >= :FECHA AND PEDI_FECHA <= :FECHA AND PEDE_ANULADO = 'N'
                        INTO :ID, :ITEM, :CANT2
                        do
                        BEGIN
                        EXECUTE PROCEDURE FALTANTE(34, 31, ID, ITEM) returning_values (ORDENC, UND, FACTOR);
                        if ((ORDENC * FACTOR = CANT2) or (PEDAUTO = 'SI')) then /* SI NO SE HA FACTURADO MIRE A VER SI SE REMISIONO */
                            EXECUTE PROCEDURE FALTANTE(34, 32, ID, ITEM) returning_values (ORDENC, UND, FACTOR);
                        if (ORDENC IS NULL) then
                            ORDENC = 0;
                        PEDIDO = PEDIDO + ORDENC * FACTOR;
                        END
                    if (PEDIDO IS NULL) then
                        PEDIDO = 0;
                    RESERVADO = RESERVADO + PEDIDO;
                    END
                ELSE
                    BEGIN
                    RESERVADO = 0;
                    ORDENADO = 0;
                    END
                if (ENPESO = 'S') then
                    BEGIN
                    if (pesounit IS NULL) then
                        pesounit = 0;
                    if (PESOUNIT <> 0) then
                        BEGIN
                        pesototal = PESOUNIT * cant;
                        SUSPEND;
                        END
                    END
                ELSE
                    SUSPEND;
                END
            END
        END
  END
END
^

SET TERM ; ^


SET TERM ^ ;

create procedure REP_ENSAMBLES(
    FECINI DATE,
    FECFIN DATE,
    PREFINI VARCHAR(4),
    PREFFIN VARCHAR(4),
    OPER INTEGER,
    MAQUI integer,
    BODINI VARCHAR(2),
    BODFIN VARCHAR(2),
    DETALLE CHAR(1),
    SUBEMPRESA INTEGER)
returns (
    FECHA DATE,
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    OPERARIO VARCHAR(60),
    MAQUINA VARCHAR(60),
    BODEGA VARCHAR(2),
    NOMBODEGA VARCHAR(60),
    PRODUCTO VARCHAR(20),
    DESPROD VARCHAR(60),
    CANT NUMERIC(18,4),
    PESO NUMERIC(18, 4),
    RETAL VARCHAR(60),
    PESORETAL NUMERIC(18, 4),
    CONC VARCHAR(60),
    OBS VARCHAR(255),
    CODCOMP VARCHAR(20),
    DESCOMP VARCHAR(60),
    CANTCOMP NUMERIC(18,4),
    BODCOMP VARCHAR(2),
    PESOCOMP NUMERIC(18, 4))
as
declare variable cantretal NUMERIC(18,4);
declare variable ID INTEGER;
begin
FOR SELECT ENSA_ID, E.PREF_PRE, ENSA_NUMERO, ENSA_FECHA, ENSA_CONC, E.BODE_COD, BODE_NOM, ENSA_CODBAR, ENSA_DESC,
    ENSA_CANT, ENSA_PESO, ENSA_OBS, ENSA_CODRETAL, ENSA_CANTRETAL, ENSA_OPER, ENSA_MAQUINA
    FROM ENSAMBLES E, BODEGA B, PREFIJOS P
    WHERE E.BODE_COD = B.BODE_COD AND E.ENSA_FECHA >= :FECINI AND E.ENSA_FECHA <= :FECFIN AND E.PREF_PRE >= :prefini AND E.PREF_PRE <= :preffin
     AND P.PREF_PRE = E.PREF_PRE AND P.TIDO_COD = 15 AND ((P.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) AND ENSA_ANULADO = 'N'
     AND ((:OPER = 0) OR (ENSA_OPER = :OPER)) AND ((:MAQUI = 0) or (ENSA_MAQUINA = :MAQUI)) AND E.bode_cod >= :bodini AND E.bode_cod <= :bodfin
    ORDER BY ENSA_FECHA, ENSA_ID
    into :ID, :PREF, :NUMERO, :FECHA, :conc, :bodega, :nombodega, :producto, :desprod,
    :cant, :peso, :OBS, :retal, :cantretal, :operario, :maquina
    DO
    BEGIN
    SELECT ARTI_PESO FROM ARTICULO WHERE ARTI_COD = :retal INTO :pesoretal;
    pesoretal = pesoretal * cantretal;
    if (DETALLE = 'S') then
        FOR SELECT ESDE_CODBAR, ESDE_DESC, ESDE_CANT, BODE_COD, ESDE_PESO
            FROM ensambles_detalle D, ARTICULO A WHERE D.ARTI_COD = A.ARTI_COD AND D.ENSA_ID = :ID INTO
            :codcomp, :descomp, :cantcomp, :bodcomp, :pesocomp
            DO
            BEGIN
            SUSPEND;
            END
    else
        SUSPEND;
    END
end
^

SET TERM ; ^
SET TERM ^ ;

CREATE OR ALTER PROCEDURE REP_ENSAMBLES(
    FECINI DATE,
    FECFIN DATE,
    PREFINI VARCHAR(4),
    PREFFIN VARCHAR(4),
    OPER INTEGER,
    MAQUI INTEGER,
    BODINI VARCHAR(2),
    BODFIN VARCHAR(2),
    DETALLE CHAR(1),
    SUBEMPRESA INTEGER)
RETURNS (
    FECHA DATE,
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    OPERARIO VARCHAR(60),
    MAQUINA VARCHAR(60),
    BODEGA VARCHAR(2),
    NOMBODEGA VARCHAR(60),
    PRODUCTO VARCHAR(20),
    DESPROD VARCHAR(60),
    CANT NUMERIC(18,4),
    PESO NUMERIC(18,4),
    RETAL VARCHAR(60),
    PESORETAL NUMERIC(18,4),
    CONC VARCHAR(60),
    OBS VARCHAR(255),
    CODCOMP VARCHAR(20),
    DESCOMP VARCHAR(60),
    CANTCOMP NUMERIC(18,4),
    BODCOMP VARCHAR(2),
    PESOCOMP NUMERIC(18,4))
AS
declare variable cantretal NUMERIC(18,4);
declare variable ID INTEGER;
begin
FOR SELECT ENSA_ID, E.PREF_PRE, ENSA_NUMERO, ENSA_FECHA, ENSA_CONC, E.BODE_COD, BODE_NOM, ENSA_CODBAR, ENSA_DESC,
    ENSA_CANT, ENSA_PESO, ENSA_OBS, ENSA_CODRETAL, ENSA_CANTRETAL, ENSA_OPER, ENSA_MAQUINA
    FROM ENSAMBLES E, BODEGA B, PREFIJOS P
    WHERE E.BODE_COD = B.BODE_COD AND E.ENSA_FECHA >= :FECINI AND E.ENSA_FECHA <= :FECFIN AND E.PREF_PRE >= :prefini AND E.PREF_PRE <= :preffin
     AND P.PREF_PRE = E.PREF_PRE AND P.TIDO_COD = 15 AND ((P.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) AND ENSA_ANULADO = 'N'
     AND ((:OPER = 0) OR (ENSA_OPER = :OPER)) AND ((:MAQUI = 0) or (ENSA_MAQUINA = :MAQUI)) AND E.bode_cod >= :bodini AND E.bode_cod <= :bodfin
    ORDER BY ENSA_FECHA, ENSA_ID
    into :ID, :PREF, :NUMERO, :FECHA, :conc, :bodega, :nombodega, :producto, :desprod,
    :cant, :peso, :OBS, :retal, :cantretal, :operario, :maquina
    DO
    BEGIN
    SELECT ENOP_NOMBRE FROM ensamble_operario WHERE ENOP_ID = :operario INTO :operario;
    SELECT ENMA_NOMBRE FROM ensamble_maquina WHERE ENMA_ID = :maquina INTO :maquina;
    SELECT ARTI_PESO FROM ARTICULO WHERE ARTI_COD = :retal INTO :pesoretal;
    if (pesoretal IS NULL) then
        pesoretal = 0;
    pesoretal = pesoretal * cantretal;
    if (DETALLE = 'S') then
        FOR SELECT ESDE_CODBAR, ESDE_DESC, ESDE_CANT, BODE_COD, ESDE_PESO
            FROM ensambles_detalle D, ARTICULO A WHERE D.ARTI_COD = A.ARTI_COD AND D.ENSA_ID = :ID INTO
            :codcomp, :descomp, :cantcomp, :bodcomp, :pesocomp
            DO
            BEGIN
            SUSPEND;
            END
    else
        SUSPEND;
    END
end
^

SET TERM ; ^


/* 20081221  VIOLACION DE LLAVE PRIMARIA AL HACER CRUCES DE CXPAGAR */

SET TERM ^ ;

CREATE OR ALTER PROCEDURE CONTABIL_RECICAJA(
    IDDOC INTEGER,
    IDINTER INTEGER)
RETURNS (
    ERROR INTEGER,
    VER CHAR(1),
    IDC INTEGER)
AS
declare variable PREF VARCHAR(4);
declare variable NUM VARCHAR(6);
declare variable FECAUX DATE;
declare variable FECHA CHAR(8);
declare variable CONC CHAR(120);
declare variable VRDTO NUMERIC(18, 2);
declare variable VRRTFTE NUMERIC(18, 2);
declare variable VRRTIVA NUMERIC(18, 2);
declare variable VRRTICA NUMERIC(18, 2);
declare variable VRTOTAL NUMERIC(18, 2);
declare variable TIPOCOMP VARCHAR(3);
declare variable PREFCONT VARCHAR(4);
declare variable BASE CHAR(1);
declare variable CTABASE VARCHAR(20);
declare variable CAJA CHAR(1);
declare variable CTACAJA VARCHAR(20);
declare variable RTFTE CHAR(1);
declare variable CTARTFTE VARCHAR(20);
declare variable RTIVA CHAR(1);
declare variable CTARTIVA VARCHAR(20);
declare variable RTICA CHAR(1);
declare variable CTARTICA VARCHAR(20);
declare variable DTO CHAR(1);
declare variable CTADTO VARCHAR(20);
declare variable EXISTE CHAR(1);
declare variable CUENTA VARCHAR(20);
declare variable MONTO NUMERIC(18,2);
declare variable ES_RETENCION CHAR(1);
declare variable TIPOCUEN CHAR(1);
declare variable NIT VARCHAR(20);
declare variable PROY VARCHAR(4);
declare variable CENTRO VARCHAR(4);
declare variable DEBITO NUMERIC(18,2);
declare variable CREDITO NUMERIC(18,2);
declare variable NROI INTEGER;
declare variable SUMA NUMERIC(18,2);
declare variable TCTACLIEN VARCHAR(20);
declare variable TCTARTFTE VARCHAR(20);
declare variable TCTARTIVA VARCHAR(20);
declare variable TCTARTICA VARCHAR(20);
declare variable TIPOIT INTEGER;
declare variable PREFIT VARCHAR(4);
declare variable NUMIT VARCHAR(6);
declare variable NUMEROIT VARCHAR(10);
declare variable ABONOIT NUMERIC(18,2);
declare variable CTADIC VARCHAR(20);
declare variable BASEADIC VARCHAR(20);
declare variable PORCADIC NUMERIC(5,2);
declare variable VALORADIC NUMERIC(18,2);
declare variable DBADIC CHAR(1);
declare variable ANULADO CHAR(1);
declare variable VRBASE NUMERIC(18,2);
declare variable PORC numeric(9,2);
declare variable OK INTEGER;
declare variable CRUCES NUMERIC(18,2);
declare variable VRCAJA NUMERIC(18,2);
declare variable DIFCAMBIO NUMERIC(18,2);
declare variable CTADIF VARCHAR(20);
BEGIN
ERROR = 0;
/* BUSQUE LA INTERFACE */
EXISTE = 'N';
SELECT 'S', TICO_COD, PRCO_PRE, INCJ_BASE, INCJ_DTOPP, INCJ_RTFTE, INCJ_RTIVA, INCJ_RTICA, INCJ_CAJA, INCJ_CTABASE, INCJ_CTADTO, INCJ_CTARTFTE, INCJ_CTARTIVA, INCJ_CTARTICA, INCJ_CTACAJA, INCJ_CONFIRMAR
    FROM INTERFAZ_CAJA
    WHERE INCJ_ID = :IDINTER
    INTO :EXISTE, :TIPOCOMP, :PREFCONT, :BASE, :DTO, :RTFTE, :RTIVA, :RTICA, :CAJA, :CTABASE, :CTADTO, :CTARTFTE, :CTARTIVA, :CTARTICA, :CTACAJA, :VER;
if (EXISTE = 'S') then
  BEGIN
  /* BORRE LA CONTABILIZACION ANTERIOR */
  OK = 0;
  FOR SELECT CNTB_ID FROM CONTABILIZACION WHERE CNTB_TIPOREF = 61 AND CNTB_IDREF = :IDDOC INTO :OK DO
    BEGIN
    DELETE FROM CONTABILIZACION_DET WHERE CNTB_ID = :OK;
    DELETE FROM CONTABILIZACION WHERE CNTB_ID = :OK;
    END
  /* TRAIGA EL ENCABEZADO DEL RECIBO */
  SELECT PREF_PRE, RECA_NUMERO, RECA_FECHA, R.TERC_NIT, RECA_CONC, RECA_DTOF, RECA_MONTO, RECA_RTFTEMONTO, RECA_RTIVAMONTO, RECA_RTICAMONTO, TERC_CTARTFTE, TERC_CTARTIVA, TERC_CTARTICA, TERC_CTACLIENTE, RECA_ANULADO
    FROM RECIBOS_CAJA R, TERCEROS T
    WHERE RECA_ID = :IDDOC AND R.TERC_NIT = T.TERC_NIT
    INTO :PREF, :NUM, :FECAUX, :NIT, :CONC, :VRDTO, :VRTOTAL, :VRRTFTE, :VRRTIVA, :VRRTICA, :TCTARTFTE, TCTARTIVA, TCTARTICA, TCTACLIEN, :ANULADO;
  if (ANULADO = 'N') then
    BEGIN
    SELECT PREF_CENTRO, PREF_PROY FROM PREFIJOS
        WHERE PREF_PRE = :PREF AND TIDO_COD = 61 INTO :CENTRO, :PROY;
    EXECUTE PROCEDURE FECHA_A_CONTA(:FECAUX) returning_values (:FECHA);
    /* REGISTRE EL ENCABEZADO CONTABLE */
    IDC = GEN_ID(ID_CONTABILIZA, 1);
    INSERT INTO CONTABILIZACION (CNTB_ID, CNTB_TIPOCOMP, CNTB_PREFCNT, CNTB_NUMERO, CNTB_FECHA, CNTB_CONCEPTO, CNTB_REF, CNTB_TIPOREF, CNTB_IDREF, CNTB_PREFREF, CNTB_NUMREF, CNTB_PROCESADO)
        VALUES (:IDC, :TIPOCOMP, :PREFCONT, :NUM, :FECHA, :CONC, '', 61, :IDDOC, :PREF, :NUM, 'N');
    NROI = 0;
    SUMA = 0;
    /* SUME LOS CRUCES PARA LLEVARLOS A LA CUENTA X PAGAR Y RESTAR DE LA CAJA */
    SELECT SUM(RCCR_ABONO) FROM RECIBOS_CAJA_CRUCEC WHERE RECA_ID = :iddoc INTO :CRUCES;
    if (CRUCES IS NULL) then
        CRUCES = 0;
    VRCAJA = VRTOTAL - CRUCES;
    IF ((CAJA = 'K')) THEN
        BEGIN
        if (VRCAJA <> 0) then
            BEGIN
            CUENTA = NULL;
            EXECUTE PROCEDURE VALIDE_CUENTA_C (CTACAJA) RETURNING_VALUES (:OK);
            IF (OK = 0) THEN
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :CTACAJA INTO :CUENTA, :TIPOCUEN;
            ELSE
                begin
                EXECUTE PROCEDURE ERROR (61, :IDDOC, :CTACAJA, 2);
                CUENTA = CTACAJA;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERROR (61, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                EXECUTE PROCEDURE ERROR (61, :IDDOC, :CUENTA, 4);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                IF (VRCAJA > 0) THEN
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRCAJA, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    SUMA = SUMA + VRCAJA;
                    END
                ELSE   
                    BEGIN                     
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                       VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, ABS(:VRCAJA), 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    SUMA = SUMA + VRCAJA;
                    END
                NROI = NROI + 1;
                END
            END /* VRCAJA <> 0 */
        END /* CAJA CONSTANTE */
    IF ((CAJA = 'F')) THEN
        BEGIN
        /* AGRUPE LAS CUENTAS DE LAS FORMAS DE PAGO */
        FOR SELECT MAX(FOPA_CTACONTA), SUM(RCPA_MONTO)
            FROM formas_pago F, recibos_caja_pago R
            WHERE R.RECA_ID = :IDDOC AND R.FOPA_ID = F.FOPA_ID
            GROUP BY FOPA_CTACONTA
            INTO :CTACAJA, :MONTO
        DO
            BEGIN
            if (MONTO <> 0) then
                BEGIN
                CUENTA = NULL;
                EXECUTE PROCEDURE VALIDE_CUENTA_C (CTACAJA) RETURNING_VALUES (:OK);
                IF (OK = 0) THEN
                    SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                        WHERE CUEN_COD = :CTACAJA INTO :CUENTA, :TIPOCUEN;
                ELSE
                    begin
                    EXECUTE PROCEDURE ERROR (61, :IDDOC, :CTACAJA, 2);
                    CUENTA = CTACAJA;
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (61, :IDDOC, :CUENTA, 3);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (61, :IDDOC, :CUENTA, 4);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    IF (MONTO > 0) THEN
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        SUMA = SUMA + MONTO;
                        END
                    ELSE
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, abs(:MONTO), 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        SUMA = SUMA + MONTO;
                        END
                    NROI = NROI + 1;
                    END
                END /* MONTO <> 0 */
            END /* DO FORMA_PAGO */
        END /* CAJA = F */
    if (DTO = 'K') then /* DTO EN CTA CONSTANTE */
        BEGIN
        if (VRDTO <> 0) then
            BEGIN
            CUENTA = NULL;
            EXECUTE PROCEDURE VALIDE_CUENTA_C (CTADTO) RETURNING_VALUES (:OK);
            IF (OK = 0) THEN
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :CTADTO INTO :CUENTA, :TIPOCUEN;
            ELSE
                begin
                EXECUTE PROCEDURE ERROR (61, :IDDOC, :CTADTO, 2);
                CUENTA = CTADTO;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERROR (61, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                EXECUTE PROCEDURE ERROR (61, :IDDOC, :CUENTA, 4);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRDTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA + VRDTO;
                END
            END /* VRDTO <> 0 */
        END /* DTO EN CTA CONSTANTE */

    /* LA DIFERENCIA EN CAMBIO */
    SELECT SUM(RCDE_DIFCAMBIO) FROM recibos_caja_detalle WHERE RECA_ID = :iddoc INTO :DIFCAMBIO;
    IF ((DIFCAMBIO IS NOT NULL) AND (DIFCAMBIO <> 0)) THEN
        BEGIN
        if (DIFCAMBIO > 0) then
            execute procedure lee_configuracion('GENERAL','GENERAL','CUENTA DE INGRESO POR DIFERENCIA EN CAMBIO PARA OPERACIONES EN OTRA MONEDA') returning_values (:ctadif);
        else
            execute procedure lee_configuracion('GENERAL','GENERAL','CUENTA DE GASTO POR DIFERENCIA EN CAMBIO PARA OPERACIONES EN OTRA MONEDA') returning_values (:ctadif);
        CUENTA = NULL;
        EXECUTE PROCEDURE VALIDE_CUENTA_C (ctadif) RETURNING_VALUES (:OK);
        IF (OK = 0) THEN
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :ctadif INTO :CUENTA, :TIPOCUEN;
        ELSE
            begin
            EXECUTE PROCEDURE ERROR (61, :IDDOC, :ctadif, 2);
            CUENTA = ctadif;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERROR (61, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERROR (61, :IDDOC, :CUENTA, 4);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            if (DIFCAMBIO > 0) then
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :difcambio, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            else
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', ABS(:difcambio), 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA - difcambio;
            END
        END
    /* RETENCION FUENTE */
    if ((RTFTE = 'T') or (RTFTE = 'K')) then
      if (VRRTFTE <> 0) then
        BEGIN
        if (RTFTE = 'T') then
            CTARTFTE = TCTARTFTE;
        CUENTA = NULL;
        EXECUTE PROCEDURE VALIDE_CUENTA_C (CTARTFTE) RETURNING_VALUES (:OK);
        IF (OK = 0) THEN
            SELECT CUEN_COD, CUEN_RETENCION, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTARTFTE INTO :CUENTA, :ES_RETENCION, :TIPOCUEN;
        ELSE
            begin
            EXECUTE PROCEDURE ERROR (61, :IDDOC, :CTARTFTE, 2);
            CUENTA = CTARTFTE;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERROR (61, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERROR (61, :IDDOC, :CUENTA, 4);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            if (ES_RETENCION = 'S') then
                BEGIN
                VRBASE = VRTOTAL + VRDTO + vrrtfte + vrrtiva + vrrtica;
                SELECT CLIE_rtefte from clientes where terc_nit = :NIT INTO :PORC;
                END
            ELSE
                BEGIN
                VRBASE = 0;
                PORC = 0;
                END
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :VRBASE, :PORC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTFTE;
            END
        END /* RTFTE */
    /* RETENCION IVA */
    if ((RTIVA = 'T') or (RTIVA = 'K')) then
      if (VRRTIVA <> 0) then
        BEGIN
        if (RTIVA = 'T') then
            CTARTIVA = TCTARTIVA;
        CUENTA = NULL;
        EXECUTE PROCEDURE VALIDE_CUENTA_C (CTARTIVA) RETURNING_VALUES (:OK);
        IF (OK = 0) THEN
            SELECT CUEN_COD, CUEN_RETENCION, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTARTIVA INTO :CUENTA, :ES_RETENCION, :TIPOCUEN;
        ELSE
            begin
            EXECUTE PROCEDURE ERROR (61, :IDDOC, :CTARTIVA, 2);
            CUENTA = CTARTIVA;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERROR (61, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERROR (61, :IDDOC, :CUENTA, 4);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            if (ES_RETENCION = 'S') then
                BEGIN
                VRBASE = VRTOTAL + VRDTO + vrrtfte + vrrtiva + vrrtica;
                SELECT CLIE_RTEIVA from clientes where terc_nit = :NIT INTO :PORC;
                END
            ELSE
                BEGIN
                VRBASE = 0;
                PORC = 0;
                END
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTIVA, 0, :VRBASE, :PORC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTIVA;
            END
        END /* RTIVA */
    /* RETENCION DE ICA */
    if ((RTICA = 'T') or (RTICA = 'K')) then
      if (VRRTICA <> 0) then
        BEGIN
        if (RTICA = 'T') then
            CTARTICA = TCTARTICA;
        CUENTA = NULL;
        EXECUTE PROCEDURE VALIDE_CUENTA_C (CTARTICA) RETURNING_VALUES (:OK);
        IF (OK = 0) THEN
            SELECT CUEN_COD, CUEN_RETENCION, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTARTICA INTO :CUENTA, :ES_RETENCION, :TIPOCUEN;
        ELSE
            begin
            EXECUTE PROCEDURE ERROR (61, :IDDOC, :CTARTICA, 2);
            CUENTA = CTARTICA;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERROR (61, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERROR (61, :IDDOC, :CUENTA, 4);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            if (ES_RETENCION = 'S') then
                BEGIN
                VRBASE = VRTOTAL + VRDTO + vrrtfte + vrrtiva + vrrtica;
                SELECT CLIE_RTEICA from clientes where terc_nit = :NIT INTO :PORC;
                END
            ELSE
                BEGIN
                VRBASE = 0;
                PORC = 0;
                END
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTICA, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTICA;
            END
        END /* RTICA */
    /* CRUCES CON CXP */
    if (CRUCES <> 0) then
        BEGIN
        SELECT PROV_CARTERA FROM PROVEEDORES WHERE TERC_NIT = :nit INTO :ctabase;
        if (CTABASE IS NULL) then
            ctabase = tctaclien;
        CUENTA = NULL;
        EXECUTE PROCEDURE VALIDE_CUENTA_C (CTABASE) RETURNING_VALUES (:OK);
        IF (OK = 0) THEN
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTABASE INTO :CUENTA, :TIPOCUEN;
        ELSE
            begin
            EXECUTE PROCEDURE ERROR (61, :IDDOC, :CTABASE, 2);
            CUENTA = CTABASE;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERROR (61, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            /* DEBERIA RECORRER DOCUMENTO POR DOCUMENTO */
            FOR SELECT RCCR_TIPODOC, RCCR_PREFIJO, RCCR_NUMERO, RCCR_ABONO+RCCR_RTFTE+RCCR_RTIVA+RCCR_RTICA+RCCR_DTOF
                FROM recibos_caja_crucec WHERE RECA_ID = :IDDOC
                INTO :TIPOIT, PREFIT, NUMIT, ABONOIT
                DO
                BEGIN
                NUMEROIT = PREFIT || NUMIT;
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :ABONOIT, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, :NUMEROIT, NULL, NULL, :TIPOIT, 0);
                SUMA = SUMA + ABONOIT;
                NROI = NROI + 1;
                END
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :CRUCES, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            SUMA = SUMA + CRUCES;
            NROI = NROI + 1;
            END

        /* LA DIFERENCIA EN CAMBIO */
        SELECT SUM(RCCR_DIFCAMBIO) FROM recibos_caja_crucec WHERE RECA_ID = :iddoc INTO :DIFCAMBIO;
        IF ((DIFCAMBIO IS NOT NULL) AND (DIFCAMBIO <> 0)) THEN
            BEGIN
            if (DIFCAMBIO > 0) then
                execute procedure lee_configuracion('GENERAL','GENERAL','CUENTA DE GASTO POR DIFERENCIA EN CAMBIO PARA OPERACIONES EN OTRA MONEDA') returning_values (:ctadif);
            else
                execute procedure lee_configuracion('GENERAL','GENERAL','CUENTA DE INGRESO POR DIFERENCIA EN CAMBIO PARA OPERACIONES EN OTRA MONEDA') returning_values (:ctadif);
            CUENTA = NULL;
            EXECUTE PROCEDURE VALIDE_CUENTA_C (ctadif) RETURNING_VALUES (:OK);
            IF (OK = 0) THEN
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :ctadif INTO :CUENTA, :TIPOCUEN;
            ELSE
                begin
                EXECUTE PROCEDURE ERROR (61, :IDDOC, :ctadif, 2);
                CUENTA = ctadif;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERROR (61, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                EXECUTE PROCEDURE ERROR (61, :IDDOC, :CUENTA, 4);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                if (DIFCAMBIO > 0) then
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :difcambio, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                else
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, ABS(:difcambio), 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA + difcambio;
                END
            END
        END /* cruces */
    /* CIERRE EL COMPROBANTE CONTRA LA CUENTA DEL TERCERO O LA BASE CONSTANTE */
    if ((SUMA <> 0) and ((BASE = 'T') or (BASE = 'K'))) then
        BEGIN
        if (SUMA < 0) then
            BEGIN
            DEBITO = SUMA * -1;
            CREDITO = 0;
            END
        ELSE
            BEGIN
            DEBITO = 0;
            CREDITO = SUMA;
            END
        if (BASE = 'T') then
            CTABASE = TCTACLIEN;
        CUENTA = NULL;
        EXECUTE PROCEDURE VALIDE_CUENTA_C (CTABASE) RETURNING_VALUES (:OK);
        IF (OK = 0) THEN
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTABASE INTO :CUENTA, :TIPOCUEN;
        ELSE
            begin
            EXECUTE PROCEDURE ERROR (61, :IDDOC, :CTABASE, 2);
            CUENTA = CTABASE;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERROR (61, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            /* DEBERIA RECORRER DOCUMENTO POR DOCUMENTO */
            FOR SELECT RCDE_TIPODOC, RCDE_PREFIJO, RCDE_NUMERO, RCDE_ABONO+RCDE_RTFTE+RCDE_RTIVA+RCDE_RTICA+RCDE_DTOF
                FROM RECIBOS_CAJA_DETALLE WHERE RECA_ID = :IDDOC
                INTO :TIPOIT, PREFIT, NUMIT, ABONOIT
                DO
                BEGIN
                NUMEROIT = PREFIT || NUMIT;
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :ABONOIT, 0, 0, :NIT, :PROY, :CENTRO, NULL, :NUMEROIT, NULL, NULL, :TIPOIT, 0);
                NROI = NROI + 1;
                END
            END
        if (TIPOCUEN = 'N') then
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :DEBITO, :CREDITO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
        NROI = NROI + 1;
        END /* SUMA EN CARTERA */
    /* recorra las cuentas adicionales */
    FOR SELECT INJC_CUENTA, INJC_BASE, INJC_PORC, INJC_VALOR, INJC_DB
        FROM INTERFAZ_CAJA_CTAS
        WHERE INCJ_ID = :IDINTER
        INTO :CTADIC, :BASEADIC, :PORCADIC, :VALORADIC, :DBADIC
        DO
        BEGIN
        if (:BASEADIC = 'TOTAL') then
            VALORADIC = VRTOTAL;
        if (:BASEADIC = 'DESCUENTO') then
            VALORADIC = VRDTO;
        if (:BASEADIC = 'RTFTE') then
            VALORADIC = VRRTFTE;
        if (:BASEADIC = 'RTIVA') then
            VALORADIC = VRRTIVA;
        if (:BASEADIC = 'RTICA') then
            VALORADIC = VRRTICA;
        MONTO = VALORADIC * PORCADIC;
        CUENTA = NULL;
        EXECUTE PROCEDURE VALIDE_CUENTA_C (CTADIC) RETURNING_VALUES (:OK);
        IF (OK = 0) THEN
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTADIC INTO :CUENTA, :TIPOCUEN;
        ELSE
            begin
            EXECUTE PROCEDURE ERROR (61, :IDDOC, :CTADIC, 2);
            CUENTA = CTADIC;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERROR (61, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERROR (61, :IDDOC, :CUENTA, 4);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            if (DBADIC = 'S') then
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTADIC, :CONC, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            ELSE
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTADIC, :CONC, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            END
        NROI = NROI + 1;
        END
    if (ERROR > 0) then
        VER = 'S';
    SUSPEND;
    END /* NO ANULADO */
  END /* EXISTE LA INTERFAZ */
ELSE
    BEGIN
    EXECUTE PROCEDURE ERROR (61, :IDDOC, :PREF, 1);
    ERROR = ERROR + 1;
    VER = 'S';
    SUSPEND;
    END
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE RECIBOS_SIN_CONTABILIDAD(
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    ID INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    ESTADO VARCHAR(20),
    IDI INTEGER,
    IDC INTEGER,
    ERROR INTEGER)
AS
DECLARE VARIABLE VER CHAR(2);
declare variable FECICNT VARCHAR(10);
declare variable FECFCNT VARCHAR(10);
declare variable idref INTEGER;
BEGIN /*$$IBE$$ 
EXECUTE PROCEDURE fecha_a_conta(FECINI) returning_values (FECICNT);
EXECUTE PROCEDURE fecha_a_conta(FECFIN) returning_values (FECFCNT);
FOR SELECT RECA_ID, PREF_PRE, RECA_NUMERO FROM RECIBOS_CAJA WHERE RECA_ANULADO = 'N' AND
    RECA_FECHA >= :FECINI AND RECA_FECHA <= :FECFIN and PREF_PRE NOT IN (SELECT AUTO_PREFRDC FROM AUTORIZACIONES) ORDER BY RECA_ID
    INTO :ID, :PREF, :NUMERO
DO
  BEGIN
  idref = null;
  SELECT ENCO_IDREF FROM COMPROBANTE_ENCABEZADO WHERE ENCO_TIPOREF = 61 AND ENCO_FECHA >= :FECICNT AND ENCO_FECHA <= :FECFCNT and ENCO_IDREF = :id into :idref;
  if (idref IS NULL) then
  begin
   ESTADO = 'PROCESANDO';
   SUSPEND;
   SELECT MAX(INCJ_ID) FROM INTERFAZ_CAJA WHERE PREF_PRE = :PREF AND TIDO_COD = 61 INTO :IDI;
   EXECUTE PROCEDURE CONTABIL_RECICAJA (:ID, :IDI) RETURNING_VALUES (:ERROR, :VER, :IDC);
   if (ERROR = 0) then
    BEGIN
    EXECUTE PROCEDURE CONTABILIZA_PENDIENTE (:IDC);
    ESTADO = 'OK';
    END
   ELSE
    ESTADO = 'ERROR';
   suspend;
  end
  END
 $$IBE$$*/ SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE RECIBOS_SIN_CONTABILIDAD(
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    ID INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    ESTADO VARCHAR(20),
    IDI INTEGER,
    IDC INTEGER,
    ERROR INTEGER)
AS
DECLARE VARIABLE VER CHAR(2);
declare variable FECICNT VARCHAR(10);
declare variable FECFCNT VARCHAR(10);
declare variable idref INTEGER;
BEGIN
EXECUTE PROCEDURE fecha_a_conta(FECINI) returning_values (FECICNT);
EXECUTE PROCEDURE fecha_a_conta(FECFIN) returning_values (FECFCNT);
FOR SELECT RECA_ID, PREF_PRE, RECA_NUMERO FROM RECIBOS_CAJA WHERE RECA_ANULADO = 'N' AND
    RECA_FECHA >= :FECINI AND RECA_FECHA <= :FECFIN and PREF_PRE NOT IN (SELECT AUTO_PREFRDC FROM AUTORIZACIONES) ORDER BY RECA_ID
    INTO :ID, :PREF, :NUMERO
DO
  BEGIN
  idref = null;
  SELECT ENCO_IDREF FROM COMPROBANTE_ENCABEZADO WHERE ENCO_TIPOREF = 61 AND ENCO_FECHA >= :FECICNT AND ENCO_FECHA <= :FECFCNT and ENCO_IDREF = :id into :idref;
  if (idref IS NULL) then
  begin
   ESTADO = 'PROCESANDO';
   SUSPEND;
   SELECT MAX(INCJ_ID) FROM INTERFAZ_CAJA WHERE PREF_PRE = :PREF AND TIDO_COD = 61 INTO :IDI;
   EXECUTE PROCEDURE CONTABIL_RECICAJA (:ID, :IDI) RETURNING_VALUES (:ERROR, :VER, :IDC);
   if (ERROR = 0) then
    BEGIN
    EXECUTE PROCEDURE CONTABILIZA_PENDIENTE (:IDC);
    ESTADO = 'OK';
    END
   ELSE
    ESTADO = 'ERROR';
   suspend;
  end
  END
END

^

SET TERM ; ^


SET TERM ^ ;

CREATE OR ALTER PROCEDURE CONTABIL_EGRESO(
    IDDOC INTEGER,
    IDINTER INTEGER)
RETURNS (
    ERROR INTEGER,
    VER CHAR(1),
    IDC INTEGER)
AS
declare variable PREF VARCHAR(4);
declare variable NUM VARCHAR(6);
declare variable FECAUX DATE;
declare variable FECHA CHAR(8);
declare variable CONC CHAR(120);
declare variable VRDTO NUMERIC(18, 2);
declare variable VRRTFTE NUMERIC(18, 2);
declare variable VRRTIVA NUMERIC(18, 2);
declare variable VRRTICA NUMERIC(18, 2);
declare variable VRTOTAL NUMERIC(18, 2);
declare variable TIPOCOMP VARCHAR(3);
declare variable PREFCONT VARCHAR(4);
declare variable BASE CHAR(1);
declare variable CTABASE VARCHAR(20);
declare variable CAJA CHAR(1);
declare variable CTACAJA VARCHAR(20);
declare variable RTFTE CHAR(1);
declare variable CTARTFTE VARCHAR(20);
declare variable RTIVA CHAR(1);
declare variable CTARTIVA VARCHAR(20);
declare variable RTICA CHAR(1);
declare variable CTARTICA VARCHAR(20);
declare variable DTO CHAR(1);
declare variable CTADTO VARCHAR(20);
declare variable EXISTE CHAR(1);
declare variable CUENTA VARCHAR(20);
declare variable MONTO NUMERIC(18,2);
declare variable ES_RETENCION CHAR(1);
declare variable TIPOCUEN CHAR(1);
declare variable NIT VARCHAR(20);
declare variable PROY VARCHAR(4);
declare variable CENTRO VARCHAR(4);
declare variable MONTOBASE NUMERIC(18,2);
declare variable PORC NUMERIC(9,2);
declare variable DEBITO NUMERIC(18,2);
declare variable CREDITO NUMERIC(18,2);
declare variable NROI INTEGER;
declare variable SUMA NUMERIC(18,2);
declare variable TCTACLIEN VARCHAR(20);
declare variable TCTARTFTE VARCHAR(20);
declare variable TCTARTIVA VARCHAR(20);
declare variable TCTARTICA VARCHAR(20);
declare variable TCTACART VARCHAR(20);
declare variable TIPOIT INTEGER;
declare variable PREFIT VARCHAR(4);
declare variable NUMIT VARCHAR(6);
declare variable NUMEROIT VARCHAR(10);
declare variable ABONOIT NUMERIC(18,2);
declare variable CTADIC VARCHAR(20);
declare variable BASEADIC VARCHAR(20);
declare variable PORCADIC NUMERIC(5,2);
declare variable VALORADIC NUMERIC(18,2);
declare variable DBADIC CHAR(1);
declare variable VRBASE NUMERIC(18,2);
declare variable GMF CHAR(1);
declare variable CODBCO INTEGER;
declare variable NUMCHEQ VARCHAR(20);
declare variable CRUCES NUMERIC(18,2);
declare variable VRCAJA NUMERIC(18,2);
declare variable OK INTEGER;
declare variable DIFCAMBIO NUMERIC(18,2);
declare variable CTADIF VARCHAR(20);
BEGIN
/* BUSQUE LA INTERFACE */
EXISTE = 'N';
SELECT 'S', TICO_COD, PRCO_PRE, INCJ_BASE, INCJ_DTOPP, INCJ_RTFTE, INCJ_RTIVA, INCJ_RTICA, INCJ_CAJA, INCJ_CTABASE, INCJ_CTADTO, INCJ_CTARTFTE, INCJ_CTARTIVA, INCJ_CTARTICA, INCJ_CTACAJA, INCJ_CONFIRMAR
    FROM INTERFAZ_CAJA
    WHERE INCJ_ID = :IDINTER
    INTO :EXISTE, :TIPOCOMP, :PREFCONT, :BASE, :DTO, :RTFTE, :RTIVA, :RTICA, :CAJA, :CTABASE, :CTADTO, :CTARTFTE, :CTARTIVA, :CTARTICA, :CTACAJA, :VER;
if (EXISTE = 'S') then
    BEGIN
    OK = 0;
    FOR SELECT CNTB_ID FROM CONTABILIZACION WHERE CNTB_TIPOREF = 62 AND CNTB_IDREF = :IDDOC INTO :OK DO
        BEGIN
        DELETE FROM CONTABILIZACION_DET WHERE CNTB_ID = :OK;
        DELETE FROM CONTABILIZACION WHERE CNTB_ID = :OK;
        END

    /* TRAIGA EL ENCABEZADO DEL EGRESO */
    SELECT PREF_PRE, EGRE_NUMERO, EGRE_FECHA, E.TERC_NIT, EGRE_CONC, EGRE_DTOF, EGRE_MONTO, EGRE_RTFTEMONTO, EGRE_RTIVAMONTO, EGRE_RTICAMONTO, TERC_CTARTFTE, TERC_CTARTIVA, TERC_CTARTICA, TERC_CTACLIENTE
        FROM EGRESOS E, TERCEROS T
        WHERE EGRE_ID = :IDDOC AND E.TERC_NIT = T.TERC_NIT
        INTO :PREF, :NUM, :FECAUX, :NIT, :CONC, :VRDTO, :VRTOTAL, :VRRTFTE, :VRRTIVA, :VRRTICA, :TCTARTFTE, TCTARTIVA, TCTARTICA, TCTACLIEN;
    /* SI ES PROVEEDOR, SOBREESCIBE LAS CUENTAS  */
    SELECT PROV_CTAPAGAR, PROV_CTARTFTE, PROV_CTARTIVA, PROV_CTARTICA
        FROM PROVEEDORES WHERE TERC_NIT = :NIT
        INTO TCTACLIEN, TCTARTFTE, TCTARTIVA, TCTARTICA;
    SELECT PREF_CENTRO, PREF_PROY FROM PREFIJOS
        WHERE PREF_PRE = :PREF AND TIDO_COD = 62 INTO :CENTRO, :PROY;
    EXECUTE PROCEDURE FECHA_A_CONTA(:FECAUX) returning_values (:FECHA);
    /* REGISTRE EL ENCABEZADO CONTABLE */
    IDC = GEN_ID(ID_CONTABILIZA, 1);
    INSERT INTO CONTABILIZACION (CNTB_ID, CNTB_TIPOCOMP, CNTB_PREFCNT, CNTB_NUMERO, CNTB_FECHA, CNTB_CONCEPTO, CNTB_REF, CNTB_TIPOREF, CNTB_IDREF, CNTB_PREFREF, CNTB_NUMREF, CNTB_PROCESADO)
        VALUES (:IDC, :TIPOCOMP, :PREFCONT, :NUM, :FECHA, :CONC, '', 62, :IDDOC, :PREF, :NUM, 'N');
    /* SUME LOS CRUCES PARA LLEVARLOS A LA CUENTA X PAGAR Y RESTAR DE LA CAJA */
    SELECT SUM(EGCC_ABONO) FROM EGRESOS_CRUCEC WHERE EGRE_ID = :iddoc INTO :CRUCES;
    if (CRUCES IS NULL) then
        CRUCES = 0;
    VRCAJA = VRTOTAL - CRUCES;
    NROI = 0;
    SUMA = 0;
    ERROR = 0;
    /* EL CREDITO EN LA CAJA O EL BANCO */
    IF ((CAJA = 'K')) THEN
        BEGIN
        if (VRCAJA <> 0) then
            BEGIN
            CUENTA = NULL;
            EXECUTE PROCEDURE VALIDE_CUENTA_C (CTACAJA) RETURNING_VALUES (:OK);
            IF (OK = 0) THEN
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :CTACAJA INTO :CUENTA, :TIPOCUEN;
            ELSE
                begin
                EXECUTE PROCEDURE ERROR (62, :IDDOC, :CTACAJA, 2);
                CUENTA = CTACAJA;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 4);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRCAJA, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - VRCAJA;
                END
            END /* VRCAJA <> 0 */
        END /* CAJA CONSTANTE */
    IF ((CAJA = 'F')) THEN
        BEGIN
        /* mueva la cuenta de la caja o el banco o ambas */
        /* PRIMERO LA CAJA */
        FOR SELECT CAJA_CUENTA, EGCA_MONTO FROM EGRESOS_CAJA E, CAJAS C
            WHERE C.CAJA_ID = E.CAJA_ID AND EGRE_ID = :IDDOC
            INTO :CTACAJA, :MONTO
            DO
            BEGIN
            if (MONTO <> 0) then
                BEGIN
                CUENTA = NULL;
                EXECUTE PROCEDURE VALIDE_CUENTA_C (CTACAJA) RETURNING_VALUES (:OK);
                IF (OK = 0) THEN
                    SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                        WHERE CUEN_COD = :CTACAJA INTO :CUENTA, :TIPOCUEN;
                ELSE
                    begin
                    EXECUTE PROCEDURE ERROR (62, :IDDOC, :CTACAJA, 2);
                    CUENTA = CTACAJA;
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 4);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA - MONTO;
                    END
                END /* MONTO <> 0 */
            END /* DO CAJA */
        /* AHORA EL BANCO */
        MONTO = 0;
        SELECT CUBA_CTACONTA, EGBC_MONTO, EGBC_GMF, E.CUBA_COD, CUBA_GMFPOR, EGBC_NUMERO
            FROM EGRESOS_BANCO E, CUENTAS_BANCO C
            WHERE E.CUBA_COD = C.CUBA_COD AND EGRE_ID = :IDDOC
            INTO :CTACAJA, :MONTO, :GMF, :CODBCO, :PORC, :NUMCHEQ;
        if (MONTO <> 0) then
            BEGIN
            if (MONTO <> 0) then
                BEGIN
                CUENTA = NULL;
                EXECUTE PROCEDURE VALIDE_CUENTA_C (CTACAJA) RETURNING_VALUES (:OK);
                IF (OK = 0) THEN
                    SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                        WHERE CUEN_COD = :CTACAJA INTO :CUENTA, :TIPOCUEN;
                ELSE
                    begin
                    EXECUTE PROCEDURE ERROR (62, :IDDOC, :CTACAJA, 2);
                    CUENTA = CTACAJA;
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 4);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, :NUMCHEQ, 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA - MONTO;
                    END
                /* EL GMF */
                if ((GMF = 'S') AND (PORC <> 0)) then
                    BEGIN
                    EXECUTE procedure REDONDEE(:MONTO * :PORC / 1000, 0) returning_values (MONTO);
                    /* REGISTRE EL GMF EN LA MISMA CUENTA DEL BANCO COMO CREDITO */
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, :NUMCHEQ, 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA - MONTO;

                    /* AHORA LA CUENTA DEL GASTO */
                    SELECT CUBA_CTAGMF FROM CUENTAS_BANCO
                        where CUBA_COD = :CODBCO INTO :CTACAJA;
                    EXECUTE PROCEDURE VALIDE_CUENTA_C (CTACAJA) RETURNING_VALUES (:OK);
                    IF (OK = 0) THEN
                        SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                            WHERE CUEN_COD = :CTACAJA INTO :CUENTA, :TIPOCUEN;
                    ELSE
                        begin
                        EXECUTE PROCEDURE ERROR (62, :IDDOC, :CTACAJA, 2);
                        CUENTA = CTACAJA;
                        TIPOCUEN = 'N';
                        ERROR = ERROR + 1;
                        end
                    if (TIPOCUEN = 'I') then
                        BEGIN
                        EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
                        TIPOCUEN = 'N';
                        ERROR = ERROR + 1;
                        END
                    if (TIPOCUEN = 'C') then
                        BEGIN
                        EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 4);
                        TIPOCUEN = 'N';
                        ERROR = ERROR + 1;
                        END
                    if (TIPOCUEN = 'N') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, :NUMCHEQ, :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NROI = NROI + 1;
                        SUMA = SUMA + MONTO;
                        END
                    END /* GMF */
                END /* MONTO <> 0 */
            END /* EGRESO_BANCO */
        END /* CAJA = F */

    /* LOS CRUCES CON CUENTAS X COBRAR */
    if (CRUCES <> 0) then
        BEGIN
        SELECT TERC_CTACLIENTE FROM TERCEROS WHERE TERC_NIT = :nit INTO :tctacart;
        if (tctacart IS NULL) then
            tctacart = tctaclien;
        CUENTA = NULL;
        EXECUTE PROCEDURE VALIDE_CUENTA_C (tctacart) RETURNING_VALUES (:OK);
        IF (OK = 0) THEN
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :tctacart INTO :CUENTA, :TIPOCUEN;
        ELSE
            begin
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :tctacart, 2);
            CUENTA = tctacart;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            /* DEBERIA RECORRER DOCUMENTO POR DOCUMENTO */
            FOR SELECT EGCC_TIPODOC, EGCC_PREFIJO, EGCC_NUMERO, EGCC_ABONO+EGCC_RTFTE+EGCC_RTIVA+EGCC_RTICA+EGCC_DTOF
                FROM egresos_crucec WHERE EGRE_ID = :IDDOC
                INTO :TIPOIT, PREFIT, NUMIT, ABONOIT
                DO
                BEGIN
                NUMEROIT = PREFIT || NUMIT;
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :ABONOIT, 0, 0, :NIT, :PROY, :CENTRO, NULL, :NUMEROIT, NULL, NULL, :TIPOIT, 0);
                SUMA = SUMA - ABONOIT;
                NROI = NROI + 1;
                END
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :CRUCES, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            SUMA = SUMA - CRUCES;
            NROI = NROI + 1;
            END
        /* LA DIFERENCIA EN CAMBIO */
        SELECT SUM(EGCC_DIFCAMBIO) FROM egresos_crucec WHERE EGRE_ID = :iddoc INTO :DIFCAMBIO;
        IF ((DIFCAMBIO IS NOT NULL) AND (DIFCAMBIO <> 0)) THEN
            BEGIN
            if (DIFCAMBIO > 0) then
                execute procedure lee_configuracion('GENERAL','GENERAL','CUENTA DE INGRESO POR DIFERENCIA EN CAMBIO PARA OPERACIONES EN OTRA MONEDA') returning_values (:ctadif);
            else
                execute procedure lee_configuracion('GENERAL','GENERAL','CUENTA DE GASTO POR DIFERENCIA EN CAMBIO PARA OPERACIONES EN OTRA MONEDA') returning_values (:ctadif);
            CUENTA = NULL;
            EXECUTE PROCEDURE VALIDE_CUENTA_C (ctadif) RETURNING_VALUES (:OK);
            IF (OK = 0) THEN
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :ctadif INTO :CUENTA, :TIPOCUEN;
            ELSE
                begin
                EXECUTE PROCEDURE ERROR (62, :IDDOC, :ctadif, 2);
                CUENTA = ctadif;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 4);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                if (DIFCAMBIO > 0) then
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :difcambio, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                else
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', ABS(:difcambio), 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - difcambio;
                END
            END
        END /* cruces */

    if (DTO = 'K') then /* DTO EN CTA CONSTANTE */
        BEGIN
        if (VRDTO <> 0) then
            BEGIN
            CUENTA = NULL;
            EXECUTE PROCEDURE VALIDE_CUENTA_C (CTADTO) RETURNING_VALUES (:OK);
            IF (OK = 0) THEN
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :CTADTO INTO :CUENTA, :TIPOCUEN;
            ELSE
                begin
                EXECUTE PROCEDURE ERROR (62, :IDDOC, :CTADTO, 2);
                CUENTA = CTADTO;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 4);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRDTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - VRDTO;
                END
            END /* VRDTO <> 0 */
        END /* DTO EN CTA CONSTANTE */

    /* LA DIFERENCIA EN CAMBIO */
    SELECT SUM(EGDE_DIFCAMBIO) FROM egresos_detalle WHERE EGRE_ID = :iddoc INTO :DIFCAMBIO;
    IF ((DIFCAMBIO IS NOT NULL) AND (DIFCAMBIO <> 0)) THEN
        BEGIN
        if (DIFCAMBIO > 0) then
            execute procedure lee_configuracion('GENERAL','GENERAL','CUENTA DE GASTO POR DIFERENCIA EN CAMBIO PARA OPERACIONES EN OTRA MONEDA') returning_values (:ctadif);
        else
            execute procedure lee_configuracion('GENERAL','GENERAL','CUENTA DE INGRESO POR DIFERENCIA EN CAMBIO PARA OPERACIONES EN OTRA MONEDA') returning_values (:ctadif);
        CUENTA = NULL;
        EXECUTE PROCEDURE VALIDE_CUENTA_C (ctadif) RETURNING_VALUES (:OK);
        IF (OK = 0) THEN
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :ctadif INTO :CUENTA, :TIPOCUEN;
        ELSE
            begin
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :ctadif, 2);
            CUENTA = ctadif;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 4);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            if (DIFCAMBIO > 0) then
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :difcambio, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            else
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, ABS(:difcambio), 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA + difcambio;
            END
        END
    /* RETENCION FUENTE */
    if ((RTFTE = 'T') or (RTFTE = 'K')) then
      if (VRRTFTE <> 0) then
        BEGIN
        if (RTFTE = 'T') then
            CTARTFTE = TCTARTFTE;
        CUENTA = NULL;
        EXECUTE PROCEDURE VALIDE_CUENTA_C (CTARTFTE) RETURNING_VALUES (:OK);
        IF (OK = 0) THEN
            SELECT CUEN_COD, CUEN_RETENCION, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTARTFTE INTO :CUENTA, :ES_RETENCION, :TIPOCUEN;
        ELSE
            begin
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :CTARTFTE, 2);
            CUENTA = CTARTFTE;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 4);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            if (ES_RETENCION = 'S') then
                BEGIN
                VRBASE = VRTOTAL;
                SELECT PROV_RETEFTE from proveedores where terc_nit = :NIT INTO :PORC;
                END
            ELSE
                BEGIN
                VRBASE = 0;
                PORC = 0;
                END
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, :VRBASE, :PORC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA - VRRTFTE;
            END
        END /* RTFTE */
    /* RETENCION IVA */
    if ((RTIVA = 'T') or (RTIVA = 'K')) then
      if (VRRTIVA <> 0) then
        BEGIN
        if (RTIVA = 'T') then
            CTARTIVA = TCTARTIVA;
        CUENTA = NULL;
        EXECUTE PROCEDURE VALIDE_CUENTA_C (CTARTIVA) RETURNING_VALUES (:OK);
        IF (OK = 0) THEN
            SELECT CUEN_COD, CUEN_RETENCION, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTARTIVA INTO :CUENTA, :ES_RETENCION, :TIPOCUEN;
        ELSE
            begin
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :CTARTIVA, 2);
            CUENTA = CTARTIVA;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 4);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            if (ES_RETENCION = 'S') then
                BEGIN
                VRBASE = VRTOTAL;
                SELECT PROV_RTEIVA from proveedores where terc_nit = :NIT INTO :PORC;
                END
            ELSE
                BEGIN
                VRBASE = 0;
                PORC = 0;
                END
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTIVA, :VRBASE, :PORC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA - VRRTIVA;
            END
        END /* RTIVA */
    /* RETENCION DE ICA */
    if ((RTICA = 'T') or (RTICA = 'K')) then
      if (VRRTICA <> 0) then
        BEGIN
        if (RTICA = 'T') then
            CTARTICA = TCTARTICA;
        CUENTA = NULL;
        EXECUTE PROCEDURE VALIDE_CUENTA_C (CTARTICA) RETURNING_VALUES (:OK);
        IF (OK = 0) THEN
            SELECT CUEN_COD, CUEN_RETENCION, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTARTICA INTO :CUENTA, :ES_RETENCION, :TIPOCUEN;
        ELSE
            begin
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :CTARTICA, 2);
            CUENTA = CTARTICA;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 4);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            if (ES_RETENCION = 'S') then
                BEGIN
                VRBASE = VRTOTAL;
                SELECT PROV_RTEICA from proveedores where terc_nit = :NIT INTO :PORC;
                END
            ELSE
                BEGIN
                VRBASE = 0;
                PORC = 0;
                END
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTICA, :VRBASE, :PORC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA - VRRTICA;
            END
        END /* RTICA */
    /* RECORRA LAS CUENTAS DE EGRESOS_CONTABILIDAD */
    FOR SELECT CUEN_COD, EGCO_NIT, EGCO_PROY, EGCO_CENTRO, EGCO_CONC, EGCO_DEBITOS, EGCO_CREDITOS, EGCO_BASEM, EGCO_PORC
        FROM EGRESOS_CONTABILIDAD WHERE EGRE_ID = :IDDOC ORDER BY EGCO_ITEM
        INTO :CTABASE, :NIT, :PROY, :CENTRO, :CONC, :DEBITO, :CREDITO, :MONTOBASE, :PORC
        DO
        BEGIN
        CUENTA = NULL;
        EXECUTE PROCEDURE VALIDE_CUENTA_C (CTABASE) RETURNING_VALUES (:OK);
        IF (OK = 0) THEN
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTABASE INTO :CUENTA, :TIPOCUEN;
        ELSE
            begin
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :CTABASE, 2);
            CUENTA = CTABASE;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 4);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'N') then
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :DEBITO, :CREDITO, :MONTOBASE, :PORC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
        SUMA = SUMA + DEBITO - CREDITO;
        NROI = NROI + 1;
        END
    /* CIERRE EL COMPROBANTE CONTRA LA CUENTA DEL TERCERO O LA BASE CONSTANTE */
    if ((SUMA <> 0) and (BASE = 'F') or (BASE = 'T') or (BASE = 'K')) then
        BEGIN
        if (SUMA < 0) then
            BEGIN
            DEBITO = SUMA * -1;
            CREDITO = 0;
            END
        ELSE
            BEGIN
            DEBITO = 0;
            CREDITO = SUMA;
            END
        if (BASE = 'T') then
            CTABASE = TCTACLIEN;
        if (BASE = 'F') then
            BEGIN
            SELECT CAJA_CUENTA FROM EGRESOS E, CAJAS C
                WHERE C.CAJA_ID = E.CAJA_ID AND EGRE_ID = :IDDOC INTO :CTABASE;
            END
        CUENTA = NULL;
        EXECUTE PROCEDURE VALIDE_CUENTA_C (CTABASE) RETURNING_VALUES (:OK);
        IF (OK = 0) THEN
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTABASE INTO :CUENTA, :TIPOCUEN;
        ELSE
            begin
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :CTABASE, 2);
            CUENTA = CTABASE;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            /* DEBERIA RECORRER DOCUMENTO POR DOCUMENTO */
            FOR SELECT RCDE_TIPODOC, RCDE_PREFIJO, RCDE_NUMERO, RCDE_ABONO+RCDE_RTFTE+RCDE_RTIVA+RCDE_RTICA+RCDE_DTOF
                FROM RECIBOS_CAJA_DETALLE WHERE RECA_ID = :IDDOC
                INTO :TIPOIT, PREFIT, NUMIT, ABONOIT
                DO
                BEGIN
                NUMEROIT = PREFIT || NUMIT;
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :ABONOIT, 0, 0, :NIT, :PROY, :CENTRO, NULL, :NUMEROIT, NULL, NULL, :TIPOIT, 0);
                NROI = NROI + 1;
                END
            END
        if (TIPOCUEN = 'N') then
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :DEBITO, :CREDITO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
        NROI = NROI + 1;
        END /* SUMA EN CARTERA */
    /* recorra las cuentas adicionales */
    FOR SELECT INJC_CUENTA, INJC_BASE, INJC_PORC, INJC_VALOR, INJC_DB
        FROM INTERFAZ_CAJA_CTAS
        WHERE INCJ_ID = :IDINTER
        INTO :CTADIC, :BASEADIC, :PORCADIC, :VALORADIC, :DBADIC
        DO
        BEGIN
        if (:BASEADIC = 'TOTAL') then
            VALORADIC = VRTOTAL;
        if (:BASEADIC = 'DESCUENTO') then
            VALORADIC = VRDTO;
        if (:BASEADIC = 'RTFTE') then
            VALORADIC = VRRTFTE;
        if (:BASEADIC = 'RTIVA') then
            VALORADIC = VRRTIVA;
        if (:BASEADIC = 'RTICA') then
            VALORADIC = VRRTICA;
        MONTO = VALORADIC * PORCADIC;
        CUENTA = NULL;
        EXECUTE PROCEDURE VALIDE_CUENTA_C (CTADIC) RETURNING_VALUES (:OK);
        IF (OK = 0) THEN
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTADIC INTO :CUENTA, :TIPOCUEN;
        ELSE
            begin
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :CTADIC, 2);
            CUENTA = CTADIC;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 4);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            if (DBADIC = 'S') then
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTADIC, :CONC, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            ELSE
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTADIC, :CONC, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            END
        NROI = NROI + 1;
        END
    if (ERROR > 0) then
        VER = 'S';
    SUSPEND;
    END /* EXISTE LA INTERFAZ */
  ELSE
    BEGIN
    EXECUTE PROCEDURE ERROR (62, :IDDOC, :PREF, 1);
    ERROR = ERROR + 1;
    VER = 'S';
    SUSPEND;
    END
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE EGRESOS_SIN_CONTABILIDAD(
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    ID INTEGER,
    IDI INTEGER,
    IDC INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    ESTADO VARCHAR(20),
    ERROR INTEGER)
AS
DECLARE VARIABLE VER CHAR(2);
declare variable FECICNT VARCHAR(10);
declare variable FECFCNT VARCHAR(10);
declare variable idref INTEGER;
BEGIN /*$$IBE$$ 
EXECUTE PROCEDURE fecha_a_conta(FECINI) returning_values (FECICNT);
EXECUTE PROCEDURE fecha_a_conta(FECFIN) returning_values (FECFCNT);
FOR SELECT EGRE_ID, PREF_PRE, egre_numero FROM EGRESOS WHERE EGRE_ANULADO = 'N' AND PREF_PRE <> 'R004' AND
    EGRE_FECHA >= :FECINI AND EGRE_FECHA <= :FECFIN ORDER BY EGRE_ID INTO :ID, :PREF, :NUMERO
DO
  BEGIN
  idref = null;
  SELECT ENCO_IDREF FROM COMPROBANTE_ENCABEZADO WHERE ENCO_TIPOREF = 62 AND ENCO_FECHA >= :FECICNT AND ENCO_FECHA <= :FECFCNT and ENCO_IDREF = :ID into :idref;
  if (idref IS NULL) then
  begin
   ESTADO = 'PROCESANDO';
   SUSPEND;
   SELECT MAX(INCJ_ID) FROM INTERFAZ_CAJA WHERE PREF_PRE = :PREF AND TIDO_COD = 62 INTO :IDI;
   EXECUTE PROCEDURE CONTABIL_EGRESO (:ID, :IDI) RETURNING_VALUES (:ERROR, :VER, :IDC);
   IF (ERROR = 0) THEN
      BEGIN
      EXECUTE PROCEDURE CONTABILIZA_PENDIENTE (:IDC);
      ESTADO = 'OK';
      END
   ELSE
    ESTADO = 'ERROR';
   suspend;
  end
  END
 $$IBE$$*/ SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE EGRESOS_SIN_CONTABILIDAD(
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    ID INTEGER,
    IDI INTEGER,
    IDC INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    ESTADO VARCHAR(20),
    ERROR INTEGER)
AS
DECLARE VARIABLE VER CHAR(2);
declare variable FECICNT VARCHAR(10);
declare variable FECFCNT VARCHAR(10);
declare variable idref INTEGER;
BEGIN
EXECUTE PROCEDURE fecha_a_conta(FECINI) returning_values (FECICNT);
EXECUTE PROCEDURE fecha_a_conta(FECFIN) returning_values (FECFCNT);
FOR SELECT EGRE_ID, PREF_PRE, egre_numero FROM EGRESOS WHERE EGRE_ANULADO = 'N' AND PREF_PRE <> 'R004' AND
    EGRE_FECHA >= :FECINI AND EGRE_FECHA <= :FECFIN ORDER BY EGRE_ID INTO :ID, :PREF, :NUMERO
DO
  BEGIN
  idref = null;
  SELECT ENCO_IDREF FROM COMPROBANTE_ENCABEZADO WHERE ENCO_TIPOREF = 62 AND ENCO_FECHA >= :FECICNT AND ENCO_FECHA <= :FECFCNT and ENCO_IDREF = :ID into :idref;
  if (idref IS NULL) then
  begin
   ESTADO = 'PROCESANDO';
   SUSPEND;
   SELECT MAX(INCJ_ID) FROM INTERFAZ_CAJA WHERE PREF_PRE = :PREF AND TIDO_COD = 62 INTO :IDI;
   EXECUTE PROCEDURE CONTABIL_EGRESO (:ID, :IDI) RETURNING_VALUES (:ERROR, :VER, :IDC);
   IF (ERROR = 0) THEN
      BEGIN
      EXECUTE PROCEDURE CONTABILIZA_PENDIENTE (:IDC);
      ESTADO = 'OK';
      END
   ELSE
    ESTADO = 'ERROR';
   suspend;
  end
  END
END

^

SET TERM ; ^



update revision set revi_FECHA = '2008/12/21';
COMMIT WORK;


/* 20081222  stands en movimientos de entrada al inventario */

ALTER TABLE ENTRADAS_DETALLE
ADD ENDE_STAND T_LOTE;

SET TERM ^ ;

CREATE OR ALTER TRIGGER ENTRADAS_DETALLE_AI FOR ENTRADAS_DETALLE
ACTIVE AFTER INSERT POSITION 0
AS
declare variable fec date;
declare variable CONC VARCHAR(60);
declare variable factor numeric(18,4);
declare variable Pref varchar(4);
declare variable Num varchar(6);
declare variable Nit varchar(20);
declare variable IVAINC CHAR(2);
declare variable COSTO NUMERIC(18,2);
BEGIN
  if ((NEW.entr_id <> 0) and (new.ende_anulado = 'N')) then
    BEGIN
    select entr_fecha, entr_conc, pref_pre, entr_numero, terc_nit, entr_imptos
        from entradas where entr_id = new.entr_id
        into :fec, :conc, :Pref, :Num, :Nit, :ivainc;
    execute procedure factor_unidad_cant(new.arti_cod, new.ende_unidad) returning_values(factor);
    COSTO = ((new.ende_costo - NEW.ende_dtomonto) / :factor);
    if (IVAINC = 'S') then
        COSTO = COSTO / (1 + NEW.ende_ivaporc/100);
    INSERT INTO MOVIMIENTO_ARTICULO
      (ARTI_COD, MVAR_CONS, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM, TERC_NIT)
      VALUES(NEW.ARTI_COD, GEN_ID(ID_MOVARTI,1), NEW.BODE_COD, :FEC, 11, NEW.entr_id,
      :CONC, :factor * new.ende_cant, :costo, 'S', new.ende_lote, :Pref, :Num, new.ende_item, :Nit);
    /* RECORRA LAS LISTAS DE PRECIOS Y CAMBIE EL PRECIO */
    EXECUTE PROCEDURE CALCULA_PRECIOS(NEW.ARTI_COD, :FEC);
    /* ACTUALICE EL STAND */
    UPDATE or INSERT INTO stands (ARTI_COD, BODE_COD, STAND_COD) VALUES (NEW.arti_cod, NEW.bode_cod, NEW.ende_stand);
    END
END
^

SET TERM ; ^


SET TERM ^ ;

CREATE OR ALTER TRIGGER ENTRADAS_DETALLE_AU FOR ENTRADAS_DETALLE
ACTIVE AFTER UPDATE POSITION 0
as
declare variable fec date;
declare variable CONC VARCHAR(60);
declare variable Pref varchar(4);
declare variable Num varchar(6);
declare variable Nit varchar(20);
declare variable factor numeric(18,4);
declare variable IVAINC CHAR(2);
declare variable COSTO NUMERIC(18,2);
BEGIN
if ((OLD.entr_id <> 0) AND (OLD.ende_anulado = 'N')) then
    DELETE FROM MOVIMIENTO_ARTICULO WHERE (mvar_tipodoc = 11) and (mvar_idref = new.entr_id) and (mvar_item = old.ende_item);
if ((NEW.entr_id <> 0) AND (NEW.ende_anulado = 'N')) then
    begin
    select entr_fecha, entr_conc, pref_pre, entr_numero, terc_nit, entr_imptos
        from entradas where entr_id = new.entr_id
        into :fec, :conc, :Pref, :Num, :Nit, :ivainc;
    execute procedure factor_unidad_cant(new.arti_cod, new.ende_unidad) returning_values(factor);
    COSTO = ((new.ende_costo - NEW.ende_dtomonto) / :factor);
    if (IVAINC = 'S') then
        COSTO = COSTO / (1 + NEW.ende_ivaporc/100);
    INSERT INTO MOVIMIENTO_ARTICULO
        (ARTI_COD, MVAR_CONS, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM, TERC_NIT)
        VALUES(NEW.ARTI_COD, GEN_ID(ID_MOVARTI,1), NEW.BODE_COD, :FEC, 11, NEW.entr_id,
        :CONC, :factor * new.ende_cant, :COSTO, 'S', new.ende_lote, :Pref, :Num, new.ende_item, :Nit);
    /* RECORRA LAS LISTAS DE PRECIOS Y CAMBIE EL PRECIO */
    EXECUTE PROCEDURE CALCULA_PRECIOS(NEW.ARTI_COD, :FEC);
    /* ACTUALICE EL STAND */
    UPDATE or INSERT INTO stands (ARTI_COD, BODE_COD, STAND_COD) VALUES (NEW.arti_cod, NEW.bode_cod, NEW.ende_stand);
    END
END
^

SET TERM ; ^

ALTER TABLE REMISION_PROVEEDOR_DET
ADD RPVD_STAND T_LOTE;

SET TERM ^ ;

CREATE OR ALTER TRIGGER REMISION_PROVEEDOR_DET_AI FOR REMISION_PROVEEDOR_DET
ACTIVE AFTER INSERT POSITION 0
AS
declare variable fec date;
declare variable CONC VARCHAR(60);
declare variable factor numeric(18,4);
declare variable Pref varchar(4);
declare variable Num varchar(6);
declare variable EXISTE CHAR(1);
declare variable NIT VARCHAR(20);
declare variable NUMPROV VARCHAR(20);
declare variable Tipo Integer;
declare variable idfact integer;
declare variable numrows integer;
declare variable IVAINC CHAR(2);
declare variable COSTO NUMERIC(18,2);
declare variable CANTREL NUMERIC(18,4);
declare variable NUMPED VARCHAR(30);
declare variable CONSO CHAR(2);
declare variable CONSOLIDA INTEGER;
declare variable DTOPIE NUMERIC(18,2);
declare variable ADICIONAL NUMERIC(18,2);
declare variable TOTAL NUMERIC(18,2);
declare variable IVAMONTO NUMERIC(18,2);
declare variable EXTRA NUMERIC(18,2);
declare variable FACT NUMERIC(18,4);
declare variable MENORV CHAR(2);
BEGIN
  if ((NEW.repr_id <> 0) and (new.rpvd_anulado = 'N')) then
    BEGIN
    select max(rprd_tiporel), max(rprd_idrel) from remision_proveedor_docrela
        where repr_id = new.repr_id into :Tipo, :idfact;
    if (Tipo is null) then
        Tipo = 0;
    /* si se hizo con base en una factura que afecto el inventario no afecte inventario */
    numrows = 0;
    if (Tipo = 21) Then
        select count(*) from movimiento_articulo where mvar_tipodoc = 21 and mvar_idref = :idfact into :numrows;
    if (numrows is null) then
        numrows = 0;
    if (numrows = 0) then
        begin
        select repr_fecha, pref_pre, repr_numero, REPR_IMPTOS, terc_nit, REPR_NUMPROV, REPR_ORDEN, REPR_CONSOLIDA, repr_dtomonto, repr_adicional, repr_total, repr_ivamonto, repr_extra
            from remision_proveedor where repr_id = new.repr_id
            into :fec, :Pref, :Num, :IVAINC, :NIT, :NUMPROV, :numped, :CONSOLIDA, :dtopie, :adicional, :total, :ivamonto, :extra;
        execute procedure factor_unidad_cant(new.arti_cod, new.rpvd_unidad) returning_values(factor);
        CONC = 'REMISION PROVEEDOR No.' || PREF || NUM || '-' || NUMPROV;
        if (numped <> '') then
            conc = conc || '-ORDEN ' || NUMPED;
        COSTO = ((new.rpvd_prunit - NEW.rpvd_dtomonto) / :factor);
        if (IVAINC = 'S') then
            COSTO = COSTO / (1 + NEW.rpvd_ivaporc/100);
        EXECUTE PROCEDURE lee_configuracion('COMPRAS','FACTURAS','DESCUENTO Y VALOR ADICIONAL DEL DOCUMENTO COMO MENOR VALOR DEL COSTO') returning_values (:MENORV);
        if (MENORV = 'SI') then
            BEGIN
            FACT = (TOTAL - EXTRA - IVAMONTO);
            if ((FACT - ADICIONAL + DTOPIE) <> 0) then
                FACT = FACT / (FACT - ADICIONAL + DTOPIE);
            ELSE
                FACT = 1;
            COSTO = COSTO * FACT;
            END
        INSERT INTO MOVIMIENTO_ARTICULO
          (ARTI_COD, MVAR_CONS, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM, TERC_NIT)
          VALUES(NEW.ARTI_COD, GEN_ID(ID_MOVARTI,1), NEW.BODE_COD, :FEC, 22, NEW.repr_id,
          :CONC, :factor * new.rpvd_cant, :COSTO, 'S', new.rpvd_lote, :Pref, :Num, new.rpvd_item, :Nit);

        /* RECORRA LAS LISTAS DE PRECIOS Y CAMBIE EL PRECIO */
        EXECUTE PROCEDURE CALCULA_PRECIOS(NEW.ARTI_COD, :FEC);

        if (COSTO > 0 ) then
         BEGIN
          /* GRABE PROV X ARTICULO */
          EXISTE = 'N';
          SELECT 'S' FROM PROVEEDOR_ARTICULO WHERE TERC_NIT = :NIT AND ARTI_COD = NEW.ARTI_COD INTO :EXISTE;
          if (EXISTE = 'S') then
            UPDATE PROVEEDOR_ARTICULO 
                SET PVAR_FECHA = :FEC, PVAR_COSTO = :COSTO, PVAR_COD = NEW.rpvd_codprov
                WHERE TERC_NIT = :NIT AND ARTI_COD = NEW.ARTI_COD;
          ELSE
            INSERT INTO PROVEEDOR_ARTICULO (TERC_NIT, ARTI_COD, PVAR_COSTO, PVAR_FECHA, PVAR_COD,PVAR_DES)
                VALUES (:NIT, NEW.ARTI_COD, :COSTO, :FEC, NEW.rpvd_codprov,NEW.rpvd_desc);
         END
        end

    /* ACTUALICE EL PENDIENTE  */
    if (CONSOLIDA <> 0) then
        BEGIN
        EXECUTE PROCEDURE LEE_CONFIGURACION ('COMPRAS','DOCUMENTOS','SUMAR CANTIDADES PENDIENTES AL CONSOLIDAR DOCUMENTOS') returning_values (CONSO);
        SELECT MIN(CEFA_TIPOORI) FROM consolide_faltantes WHERE CEFA_ID = :CONSOLIDA INTO :NUMROWS;
        if (NUMROWS = 23) then
            BEGIN
            EXECUTE PROCEDURE LEE_CONFIGURACION('COMPRAS', 'REMISIONES', 'VERIFICAR CODIGOS DE LA ORDEN') returning_values (MENORV);
            if (MENORV = 'SI') then
                CONSO = 'NO';
            END
        SELECT COUNT(CEFA_ITEM) FROM consolide_faltantes WHERE CEFA_ID = :CONSOLIDA INTO :NUMROWS;
        if ((CONSO = 'SI') AND (NUMROWS > 1)) then
            UPDATE consolidado_faltantes SET COFA_OK = 'S' WHERE COFA_ID = :consolida;
        ELSE
            BEGIN
            /* BUSQUE EL CONSOLIDADO EN EL MISMO ITEM Y SI ES DIFERENTE ACTUALICELO */
            select COFA_CANT * COFA_FACTOR FROM consolidado_faltantes WHERE COFA_ID = :consolida AND COFA_ITEM = NEW.RPVD_ITEM AND ARTI_COD = NEW.arti_cod INTO :CANTREL;
            if (NEW.RPVD_CANT * NEW.RPVD_FACTOR < CANTREL) then
                UPDATE consolidado_faltantes SET COFA_IDDES = NEW.repr_id, COFA_CANT = NEW.RPVD_CANT, COFA_FACTOR = NEW.RPVD_FACTOR
                    WHERE COFA_ID = :consolida AND COFA_ITEM = NEW.RPVD_ITEM AND ARTI_COD = NEW.arti_cod;
            ELSE
                UPDATE consolidado_faltantes SET COFA_IDDES = NEW.repr_id, COFA_OK = 'S' WHERE COFA_ID = :consolida AND COFA_ITEM = NEW.RPVD_ITEM AND ARTI_COD = NEW.arti_cod;
            END
        END
    /* ACTUALICE EL STAND */
    UPDATE or INSERT INTO stands (ARTI_COD, BODE_COD, STAND_COD) VALUES (NEW.arti_cod, NEW.bode_cod, NEW.rpvd_stand);
    END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER REMISION_PROVEEDOR_DET_AU FOR REMISION_PROVEEDOR_DET
ACTIVE AFTER UPDATE POSITION 0
AS
declare variable fec date;
declare variable CONC VARCHAR(60);
declare variable Pref varchar(4);
declare variable Num varchar(6);
declare variable factor numeric(18,4);
declare variable EXISTE CHAR(1);
declare variable NIT VARCHAR(20);
declare variable NUMPROV VARCHAR(20);
declare variable Tipo integer;
declare variable idfact integer;
declare variable numrows integer;
declare variable IVAINC CHAR(2);
declare variable COSTO NUMERIC(18,2);
declare variable CANTREL NUMERIC(18,4);
declare variable NUMPED VARCHAR(30);
declare variable CONSO CHAR(2);
declare variable CONSOLIDA INTEGER;
declare variable DTOPIE NUMERIC(18,2);
declare variable ADICIONAL NUMERIC(18,2);
declare variable TOTAL NUMERIC(18,2);
declare variable IVAMONTO NUMERIC(18,2);
declare variable EXTRA NUMERIC(18,2);
declare variable FACT NUMERIC(18,4);
declare variable MENORV CHAR(2);
BEGIN
if ((OLD.repr_id <> 0) AND (OLD.rpvd_anulado = 'N')) then
    begin
    DELETE FROM MOVIMIENTO_ARTICULO WHERE (mvar_tipodoc = 22) and (mvar_idref = new.repr_id) and (mvar_item = old.rpvd_item);
    select REPR_CONSOLIDA from remision_proveedor where repr_id = old.repr_id into :CONSOLIDA;
    if (CONSOLIDA <> 0) then
        begin
        EXECUTE PROCEDURE LEE_CONFIGURACION ('COMPRAS','DOCUMENTOS','SUMAR CANTIDADES PENDIENTES AL CONSOLIDAR DOCUMENTOS') returning_values (CONSO);
        SELECT COUNT(CEFA_ITEM) FROM consolide_faltantes WHERE CEFA_ID = :CONSOLIDA INTO :NUMROWS;
        if ((NUMROWS = 1) OR (CONSO = 'NO')) then
            UPDATE consolidado_faltantes SET COFA_OK = 'N' WHERE COFA_ID = :consolida AND COFA_ITEM = old.RPVD_ITEM AND ARTI_COD = old.arti_cod;
        else
            UPDATE consolidado_faltantes SET COFA_OK = 'N' WHERE COFA_ID = :consolida;
        END
    end
/* Registre el nuevo */
if ((new.repr_id <> 0) AND (new.rpvd_anulado = 'N')) then
    begin
    select repr_fecha, pref_pre, repr_numero, repr_imptos, terc_nit, REPR_NUMPROV, REPR_ORDEN, REPR_CONSOLIDA, repr_dtomonto, repr_adicional, repr_total, repr_ivamonto, repr_extra
        from remision_proveedor where repr_id = new.repr_id
        into :fec, :Pref, :Num, :IVAINC, :NIT, :NUMPROV, :numped, :CONSOLIDA, :dtopie, :adicional, :total, :ivamonto, :extra;
    CONC = 'REMISION PROVEEDOR No.' || PREF || NUM || '-' || NUMPROV;
    if (numped <> '') then
        conc = conc || '-ORDEN ' || NUMPED;
    SELECT MAX(CEFA_TIPOORI) FROM consolide_faltantes WHERE CEFA_ID = :CONSOLIDA INTO :TIPO;
    if (Tipo is null) then
        Tipo = 0;
    select FACO_ID from FACTURAS_COMPRA WHERE FACO_CONSOLIDA = :consolida INTO :IDFACT;
    if (Idfact is null) then
        Idfact = 0;
    /* si se hizo con base en una factura que afecto el inventario no afecte inventario */
    numrows = 0;
    if (Tipo = 21) Then
        select count(*) from movimiento_articulo where mvar_tipodoc = 21 and mvar_idref = :idfact into :numrows;
    if (numrows is null) then
        numrows = 0;
    if (numrows = 0) then
        begin
        execute procedure factor_unidad_cant(new.arti_cod, new.rpvd_unidad) returning_values(factor);
        COSTO = ((new.rpvd_prunit - NEW.rpvd_dtomonto) / :factor);
        if (IVAINC = 'S') then
            COSTO = COSTO / (1 + NEW.rpvd_ivaporc/100);
        EXECUTE PROCEDURE lee_configuracion('COMPRAS','FACTURAS','DESCUENTO Y VALOR ADICIONAL DEL DOCUMENTO COMO MENOR VALOR DEL COSTO') returning_values (:MENORV);
        if (MENORV = 'SI') then
            BEGIN
            FACT = (TOTAL - EXTRA - IVAMONTO);
            if ((FACT - ADICIONAL + DTOPIE) <> 0) then
                FACT = FACT / (FACT - ADICIONAL + DTOPIE);
            ELSE
                FACT = 1;
            COSTO = COSTO * FACT;
            END
        INSERT INTO MOVIMIENTO_ARTICULO
            (ARTI_COD, MVAR_CONS, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM, TERC_NIT)
            VALUES(NEW.ARTI_COD, GEN_ID(ID_MOVARTI,1), NEW.BODE_COD, :FEC, 22, NEW.repr_id,
            :CONC, :factor * new.rpvd_cant, :COSTO, 'S', new.rpvd_lote, :Pref, :Num, new.rpvd_item, :Nit);
            
        /* RECORRA LAS LISTAS DE PRECIOS Y CAMBIE EL PRECIO */
        EXECUTE PROCEDURE CALCULA_PRECIOS(NEW.ARTI_COD, :FEC);
          
        if (COSTO > 0 ) then
         BEGIN
          /* GRABE PROV X ARTICULO */
          EXISTE = 'N';
          SELECT 'S' FROM PROVEEDOR_ARTICULO WHERE TERC_NIT = :NIT AND ARTI_COD = NEW.ARTI_COD INTO :EXISTE;
          if (EXISTE = 'S') then
            UPDATE PROVEEDOR_ARTICULO
                SET PVAR_FECHA = :FEC, PVAR_COSTO = :COSTO, PVAR_COD = NEW.rpvd_codprov
                WHERE TERC_NIT = :NIT AND ARTI_COD = NEW.ARTI_COD;
          ELSE
            INSERT INTO PROVEEDOR_ARTICULO (TERC_NIT, ARTI_COD, PVAR_COSTO, PVAR_FECHA, PVAR_COD,PVAR_DES)
                VALUES (:NIT, NEW.ARTI_COD, :COSTO, :FEC, NEW.rpvd_codprov,NEW.rpvd_desc);
         END
        end
    if (CONSOLIDA <> 0) then
        BEGIN
        EXECUTE PROCEDURE LEE_CONFIGURACION ('COMPRAS','DOCUMENTOS','SUMAR CANTIDADES PENDIENTES AL CONSOLIDAR DOCUMENTOS') returning_values (CONSO);
        /* IGNORE LA CONSOLIDACION SI SE VALIDAN CODIGOS DE LA ORDEN */
        SELECT MIN(CEFA_TIPOORI) FROM consolide_faltantes WHERE CEFA_ID = :CONSOLIDA INTO :NUMROWS;
        if (NUMROWS = 23) then
            BEGIN
            EXECUTE PROCEDURE LEE_CONFIGURACION('COMPRAS', 'REMISIONES', 'VERIFICAR CODIGOS DE LA ORDEN') returning_values (MENORV);
            if (MENORV = 'SI') then
                CONSO = 'NO';
            END
        SELECT COUNT(CEFA_ITEM) FROM consolide_faltantes WHERE CEFA_ID = :CONSOLIDA INTO :NUMROWS;
        if ((CONSO = 'SI') AND (NUMROWS > 1)) then
            UPDATE consolidado_faltantes SET COFA_IDDES = NEW.repr_id, COFA_OK = 'S' WHERE COFA_ID = :consolida;
        ELSE
            BEGIN
            /* BUSQUE EL CONSOLIDADO EN EL MISMO ITEM Y SI ES DIFERENTE ACTUALICELO */
            select COFA_CANT * COFA_FACTOR FROM consolidado_faltantes WHERE COFA_ID = :consolida AND COFA_ITEM = NEW.RPVD_ITEM AND ARTI_COD = NEW.arti_cod INTO :CANTREL;
            if (NEW.RPVD_CANT * NEW.RPVD_FACTOR < CANTREL) then
                UPDATE consolidado_faltantes SET COFA_IDDES = NEW.repr_id, COFA_CANT = NEW.RPVD_CANT, COFA_FACTOR = NEW.RPVD_FACTOR
                    WHERE COFA_ID = :consolida AND COFA_ITEM = NEW.RPVD_ITEM AND ARTI_COD = NEW.arti_cod;
            else
                UPDATE consolidado_faltantes SET COFA_IDDES = NEW.repr_id, COFA_OK = 'S' WHERE COFA_ID = :consolida AND COFA_ITEM = NEW.RPVD_ITEM AND ARTI_COD = NEW.arti_cod;
            END
        END
    /* ACTUALICE EL STAND */
    UPDATE or INSERT INTO stands (ARTI_COD, BODE_COD, STAND_COD) VALUES (NEW.arti_cod, NEW.bode_cod, NEW.rpvd_stand);
    END
END
^

SET TERM ; ^

ALTER TABLE FACTURAS_COMPRAS_DETALLE
ADD FCDE_STAND T_LOTE;

SET TERM ^ ;

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

        if (COSTO > 0 ) then
         BEGIN
          /* ACTUALICE EL COSTO POR PROVEEDOR */
          SELECT PVAR_FECHA FROM PROVEEDOR_ARTICULO
            WHERE TERC_NIT = :Nit AND ARTI_COD = NEW.ARTI_COD
            INTO :FECAUX;
          if (FECAUX IS NULL) then
            INSERT INTO PROVEEDOR_ARTICULO (TERC_NIT, ARTI_COD, PVAR_COSTO, PVAR_FECHA, PVAR_COD,PVAR_DES)
                VALUES (:Nit, NEW.ARTI_COD, :COSTO, :fec, NEW.fcde_codprov,NEW.fcde_desc);
          else
            UPDATE PROVEEDOR_ARTICULO
                SET PVAR_COSTO = :COSTO, PVAR_FECHA = :fec, PVAR_COD = NEW.fcde_codprov
                WHERE ARTI_COD = NEW.ARTI_COD AND TERC_NIT = :Nit;
         END
        /* RECORRA LAS LISTAS DE PRECIOS Y CAMBIE EL PRECIO */
        EXECUTE PROCEDURE CALCULA_PRECIOS(NEW.ARTI_COD, :FEC);
        END /* AFECTAR INV */
    EXECUTE PROCEDURE lee_configuracion('COMPRAS', 'FACTURAS', 'ACTUALIZAR COSTOS DE LA REMISION RELACIONADA AL GRABAR LA FACTURA') returning_values (:ACTREM);
    if ((ACTREM = 'SI') and (Tipo = 22)) then
        BEGIN
        numrows = 0;
        select mvar_cons, MVAR_ITEM, MVAR_FECHA, MVAR_IDREF, MVAR_CANT, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO
            from movimiento_articulo M, consolidado_faltantes C
            where C.cofa_id = :CONSOLIDA AND mvar_tipodoc = 22 and mvar_idref = C.cofa_idori AND C.cofa_tipoori = 22 and m.arti_cod = new.arti_cod
            into :numrows, :iterem, :fecrem, :idrem, :cantrem, :loterem, :prefrem, :numrem;
        
        if (numrows <> 0) then
            BEGIN
            DELETE FROM MOVIMIENTO_ARTICULO WHERE MVAR_CONS = :numrows;
            INSERT INTO MOVIMIENTO_ARTICULO
                (ARTI_COD, MVAR_CONS, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM, TERC_NIT)
                VALUES(NEW.ARTI_COD, GEN_ID(ID_MOVARTI,1), NEW.BODE_COD, :fecrem, 22, :idrem,
                :CONC, :cantrem, :costo, 'S', :loterem, :prefrem, :numrem, :iterem, :Nit);
        
            if (COSTO > 0 ) then
                BEGIN
                /* ACTUALICE EL COSTO POR PROVEEDOR */
                SELECT PVAR_FECHA FROM PROVEEDOR_ARTICULO
                    WHERE TERC_NIT = :Nit AND ARTI_COD = NEW.ARTI_COD
                    INTO :FECAUX;
                if (FECAUX IS NULL) then
                    INSERT INTO PROVEEDOR_ARTICULO (TERC_NIT, ARTI_COD, PVAR_COSTO, PVAR_FECHA, PVAR_COD,PVAR_DES)
                        VALUES (:Nit, NEW.ARTI_COD, :COSTO, :fec, NEW.fcde_codprov,NEW.fcde_desc);
                else
                    UPDATE PROVEEDOR_ARTICULO
                        SET PVAR_COSTO = :COSTO, PVAR_FECHA = :fec, PVAR_COD = NEW.fcde_codprov
                        WHERE ARTI_COD = NEW.ARTI_COD AND TERC_NIT = :Nit;
                END
            /* RECORRA LAS LISTAS DE PRECIOS Y CAMBIE EL PRECIO */
            EXECUTE PROCEDURE CALCULA_PRECIOS(NEW.ARTI_COD, :FEC);
            END
        END

    /* ACTUALICE EL PENDIENTE  */
    if (CONSOLIDA <> 0) then
        BEGIN
        UPDATE consolidado_faltantes SET COFA_OK = 'S' WHERE COFA_ID = :consolida AND COFA_ITEM = NEW.FCDE_ITEM AND ARTI_COD = NEW.arti_cod;
        EXECUTE procedure LEE_CONFIGURACION ('COMPRAS','DOCUMENTOS','SUMAR CANTIDADES PENDIENTES AL CONSOLIDAR DOCUMENTOS') returning_values (CONSO);
        /* IGNORE LA CONSOLIDACION SI SE VALIDAN CODIGOS DE LA ORDEN */
        SELECT MIN(CEFA_TIPOORI) FROM consolide_faltantes WHERE CEFA_ID = :CONSOLIDA INTO :NUMROWS;
        if (NUMROWS = 23) then
            BEGIN
            EXECUTE PROCEDURE LEE_CONFIGURACION('COMPRAS', 'FACTURAS', 'VERIFICAR CODIGOS DE LA ORDEN') returning_values (MENORV);
            if (MENORV = 'SI') then
                CONSO = 'NO';
            END
        SELECT COUNT(CEFA_ITEM) FROM consolide_faltantes WHERE CEFA_ID = :CONSOLIDA INTO :NUMROWS;
        if ((CONSO = 'SI') AND (NUMROWS > 1)) then
            UPDATE consolidado_faltantes SET COFA_IDDES = NEW.faco_id, COFA_OK = 'S' WHERE COFA_ID = :consolida;
        else
            BEGIN
            /* BUSQUE EL CONSOLIDADO EN EL MISMO ITEM Y SI ES DIFERENTE ACTUALICELO */
            select COFA_CANT * COFA_FACTOR FROM consolidado_faltantes WHERE COFA_ID = :consolida AND COFA_ITEM = NEW.FCDE_ITEM AND ARTI_COD = NEW.arti_cod INTO :CANTREL;
            if (NEW.FCDE_CANT * NEW.FCDE_FACTOR < CANTREL) then
                UPDATE consolidado_faltantes SET COFA_IDDES = NEW.faco_id, COFA_CANT = NEW.FCDE_CANT, COFA_FACTOR = NEW.FCDE_FACTOR
                    WHERE COFA_ID = :consolida AND COFA_ITEM = NEW.FCDE_ITEM AND ARTI_COD = NEW.arti_cod;
            END
        END
    /* ACTUALICE EL STAND */
    UPDATE or INSERT INTO stands (ARTI_COD, BODE_COD, STAND_COD) VALUES (NEW.arti_cod, NEW.bode_cod, NEW.fcde_stand);
    END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER FACTCOMP_DETALLE_AU FOR FACTURAS_COMPRAS_DETALLE
ACTIVE AFTER UPDATE POSITION 0
as
declare variable fec date;
declare variable fecaux date;
declare variable AUX varchar(90);
declare variable CONC VARCHAR(60);
declare variable Pref varchar(4);
declare variable Num varchar(6);
declare variable Nit varchar(20);
declare variable factor numeric(18,4);
declare variable TIPO INTEGER;
declare variable INVFAC CHAR(2);
declare variable IVAINC CHAR(2);
declare variable COSTO NUMERIC(18,2);
declare variable CANTREL NUMERIC(18,4);
declare variable NUMPROV VARCHAR(10);
declare variable NUMPED VARCHAR(30);
declare variable NUMREM VARCHAR(30);
declare variable CONSO VARCHAR(2);
declare variable CONSOLIDA INTEGER;
declare variable NUMROWS INTEGER;
declare variable DTOPIE NUMERIC(18,2);
declare variable ADICIONAL NUMERIC(18,2);
declare variable TOTAL NUMERIC(18,2);
declare variable IVAMONTO NUMERIC(18,2);
declare variable EXTRA NUMERIC(18,2);
declare variable FACT NUMERIC(18,4);
declare variable MENORV CHAR(2);
declare variable ACTREM CHAR(2);
declare variable FECREM date;
declare variable IDREM INTEGER;
declare variable ITEREM INTEGER;
declare variable CANTREM NUMERIC(18,4);
declare variable LOTEREM VARCHAR(15);
declare variable PREFREM CHAR(4);
BEGIN
if (old.fcde_devuelto = new.fcde_devuelto) then
    begin
    /* deshaga lo viejo */
    if ((old.fcde_anulado = 'N') and (OLD.faco_id <> 0)) then
        begin
        select faco_fecha, faco_consolida from facturas_compra where faco_id = old.faco_id into :fec, :consolida;
        DELETE FROM MOVIMIENTO_ARTICULO WHERE (mvar_tipodoc = 21) and (mvar_idref = old.faco_id) and (mvar_item = old.fcde_item);
        /* RECORRA LAS LISTAS DE PRECIOS Y CAMBIE EL PRECIO */
        EXECUTE PROCEDURE CALCULA_PRECIOS(old.ARTI_COD, :FEC);
        /* LOS PENDIENTES */
        if (CONSOLIDA <> 0) then
            BEGIN
            UPDATE consolidado_faltantes SET COFA_OK = 'N' WHERE COFA_ID = :consolida AND COFA_ITEM = old.FCDE_ITEM AND ARTI_COD = old.arti_cod;
            SELECT COUNT(CEFA_ITEM) FROM consolide_faltantes WHERE CEFA_ID = :CONSOLIDA INTO :NUMROWS;
            EXECUTE procedure LEE_CONFIGURACION ('COMPRAS','DOCUMENTOS','SUMAR CANTIDADES PENDIENTES AL CONSOLIDAR DOCUMENTOS') returning_values (CONSO);
            /* IGNORE LA CONSOLIDACION SI SE VALIDAN CODIGOS DE LA ORDEN */
            SELECT MIN(CEFA_TIPOORI) FROM consolide_faltantes WHERE CEFA_ID = :CONSOLIDA INTO :NUMROWS;
            if (NUMROWS = 23) then
                BEGIN
                EXECUTE PROCEDURE LEE_CONFIGURACION('COMPRAS', 'FACTURAS', 'VERIFICAR CODIGOS DE LA ORDEN') returning_values (MENORV);
                if (MENORV = 'SI') then
                    CONSO = 'NO';
                END
            if (CONSO = 'SI') then
                UPDATE consolidado_faltantes SET COFA_OK = 'N' WHERE COFA_ID = :consolida;
            END
        end
    /* Registre el nuevo */
    if ((new.fcde_anulado = 'N') and (new.faco_id <> 0)) then
        BEGIN
        select faco_fecha, pref_pre, faco_numero, terc_nit, faco_imptos, faco_numprov, faco_remision, faco_orden, faco_consolida, faco_dtomonto, faco_adicional, faco_total, faco_ivamonto, faco_extra
            from facturas_compra where faco_id = new.faco_id
            into :fec, :Pref, :Num, :Nit, :ivainc, :numprov, :numrem, :numped, :consolida, :dtopie, :adicional, :total, :ivamonto, :extra;
        conc = 'FACTURA DE COMPRA No.' || PREF || NUM || '-' || NUMPROV;
        if (NUMREM <> '') then
            BEGIN
            AUX = SUBSTR(NUMREM, 1, 15);
            conc = conc || '-REM:' || AUX;
            END
        else
            if (NUMPED <> '') then
                BEGIN
                AUX = SUBSTR(NUMPED, 1, 15);
                conc = conc || '-ORDEN ' || AUX;
                END
        SELECT MAX(CEFA_TIPOORI) FROM consolide_faltantes WHERE CEFA_ID = :CONSOLIDA INTO :TIPO;
        if (Tipo is null) then
            Tipo = 0;
        execute procedure lee_configuracion('COMPRAS', 'FACTURAS', 'AFECTAR INVENTARIO CON LA FACTURA') returning_values (:INVFAC);
        /* si se hizo con base en una remision no afecte inventario */
        if ((Tipo <> 22) and (INVFAC = 'SI')) then
            begin
            execute procedure factor_unidad_cant(new.arti_cod, new.fcde_unidad) returning_values(factor);
            COSTO = ((new.fcde_prunit - NEW.fcde_dtomonto) / :factor);
            if (IVAINC = 'S') then
                COSTO = COSTO / (1 + NEW.fcde_ivaporc/100);
            EXECUTE PROCEDURE lee_configuracion('COMPRAS','FACTURAS','DESCUENTO Y VALOR ADICIONAL DEL DOCUMENTO COMO MENOR VALOR DEL COSTO') returning_values (:MENORV);
            if (MENORV = 'SI') then
                BEGIN
                FACT = (TOTAL - EXTRA - IVAMONTO);
                if ((FACT - ADICIONAL + DTOPIE) <> 0) then
                    FACT = FACT / (FACT - ADICIONAL + DTOPIE);
                ELSE
                    FACT = 1;
                COSTO = COSTO * FACT;
                END
            INSERT INTO MOVIMIENTO_ARTICULO
                (ARTI_COD, MVAR_CONS, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM, TERC_NIT)
                VALUES(NEW.ARTI_COD, GEN_ID(ID_MOVARTI,1), NEW.BODE_COD, :FEC, 21, NEW.faco_id,
                :CONC, :factor * new.fcde_cant, :COSTO, 'S', new.fcde_lote, :Pref, :Num, NEW.fcde_item, :Nit);
            if (COSTO > 0 ) then
             BEGIN
              /* ACTUALICE EL COSTO POR PROVEEDOR */
              SELECT PVAR_FECHA FROM PROVEEDOR_ARTICULO
                WHERE TERC_NIT = :Nit AND ARTI_COD = NEW.ARTI_COD INTO :FECAUX;
              if (FECAUX IS NULL) then
                INSERT INTO PROVEEDOR_ARTICULO (TERC_NIT, ARTI_COD, PVAR_COSTO, PVAR_FECHA, PVAR_COD,PVAR_DES)
                    VALUES (:Nit, NEW.ARTI_COD, :COSTO, :fec, NEW.fcde_codprov,NEW.fcde_desc);
              else
                UPDATE PROVEEDOR_ARTICULO
                    SET PVAR_COSTO = :COSTO, PVAR_FECHA = :fec, PVAR_COD = NEW.fcde_codprov
                    WHERE ARTI_COD = NEW.ARTI_COD AND TERC_NIT = :Nit;
             END
            /* RECORRA LAS LISTAS DE PRECIOS Y CAMBIE EL PRECIO */
            EXECUTE PROCEDURE CALCULA_PRECIOS(NEW.ARTI_COD, :FEC);
            end
        EXECUTE PROCEDURE lee_configuracion('COMPRAS', 'FACTURAS', 'ACTUALIZAR COSTOS DE LA REMISION RELACIONADA AL GRABAR LA FACTURA') returning_values (:ACTREM);
        if ((ACTREM = 'SI') and (Tipo = 22)) then
            BEGIN
            numrows = 0;
            select mvar_cons, MVAR_ITEM, MVAR_FECHA, MVAR_IDREF, MVAR_CANT, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO
                from movimiento_articulo M, consolidado_faltantes C
                where C.cofa_id = :CONSOLIDA AND mvar_tipodoc = 22 and mvar_idref = C.cofa_idori AND C.cofa_tipoori = 22 and m.arti_cod = new.arti_cod
                into :numrows, :iterem, :fecrem, :idrem, :cantrem, :loterem, :prefrem, :numrem;
            
            if (numrows <> 0) then
                BEGIN
                DELETE FROM MOVIMIENTO_ARTICULO WHERE MVAR_CONS = :numrows;
                INSERT INTO MOVIMIENTO_ARTICULO
                    (ARTI_COD, MVAR_CONS, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM, TERC_NIT)
                    VALUES(NEW.ARTI_COD, GEN_ID(ID_MOVARTI,1), NEW.BODE_COD, :fecrem, 22, :idrem,
                    :CONC, :cantrem, :costo, 'S', :loterem, :prefrem, :numrem, :iterem, :Nit);
        
                if (COSTO > 0 ) then
                    BEGIN
                    /* ACTUALICE EL COSTO POR PROVEEDOR */
                    SELECT PVAR_FECHA FROM PROVEEDOR_ARTICULO
                        WHERE TERC_NIT = :Nit AND ARTI_COD = NEW.ARTI_COD
                        INTO :FECAUX;
                    if (FECAUX IS NULL) then
                        INSERT INTO PROVEEDOR_ARTICULO (TERC_NIT, ARTI_COD, PVAR_COSTO, PVAR_FECHA, PVAR_COD,PVAR_DES)
                            VALUES (:Nit, NEW.ARTI_COD, :COSTO, :fec, NEW.fcde_codprov,NEW.fcde_desc);
                    else
                        UPDATE PROVEEDOR_ARTICULO
                            SET PVAR_COSTO = :COSTO, PVAR_FECHA = :fec, PVAR_COD = NEW.fcde_codprov
                            WHERE ARTI_COD = NEW.ARTI_COD AND TERC_NIT = :Nit;
                    END
                /* RECORRA LAS LISTAS DE PRECIOS Y CAMBIE EL PRECIO */
                EXECUTE PROCEDURE CALCULA_PRECIOS(NEW.ARTI_COD, :FEC);
                END
            END

        if (CONSOLIDA <> 0) then
            begin
            UPDATE consolidado_faltantes SET COFA_OK = 'S' WHERE COFA_ID = :consolida AND COFA_ITEM = NEW.FCDE_ITEM AND ARTI_COD = NEW.arti_cod;
            EXECUTE procedure LEE_CONFIGURACION ('COMPRAS','DOCUMENTOS','SUMAR CANTIDADES PENDIENTES AL CONSOLIDAR DOCUMENTOS') returning_values (CONSO);
            /* IGNORE LA CONSOLIDACION SI SE VALIDAN CODIGOS DE LA ORDEN */
            SELECT MIN(CEFA_TIPOORI) FROM consolide_faltantes WHERE CEFA_ID = :CONSOLIDA INTO :NUMROWS;
            if (NUMROWS = 23) then
                BEGIN
                EXECUTE PROCEDURE LEE_CONFIGURACION('COMPRAS', 'FACTURAS', 'VERIFICAR CODIGOS DE LA ORDEN') returning_values (MENORV);
                if (MENORV = 'SI') then
                    CONSO = 'NO';
                END
            SELECT COUNT(CEFA_ITEM) FROM consolide_faltantes WHERE CEFA_ID = :CONSOLIDA INTO :NUMROWS;
            if ((CONSO = 'SI') AND (NUMROWS > 1)) then
                UPDATE consolidado_faltantes SET COFA_IDDES = NEW.faco_id, COFA_OK = 'S' WHERE COFA_ID = :consolida;
            else
                BEGIN
                /* BUSQUE EL CONSOLIDADO EN EL MISMO ITEM Y SI ES DIFERENTE ACTUALICELO */
                select COFA_CANT * COFA_FACTOR FROM consolidado_faltantes WHERE COFA_ID = :consolida AND COFA_ITEM = NEW.FCDE_ITEM AND ARTI_COD = NEW.arti_cod INTO :CANTREL;
                if (NEW.FCDE_CANT * NEW.FCDE_FACTOR < CANTREL) then
                    UPDATE consolidado_faltantes SET COFA_IDDES = NEW.faco_id, COFA_CANT = NEW.FCDE_CANT, COFA_FACTOR = NEW.FCDE_FACTOR
                        WHERE COFA_ID = :consolida AND COFA_ITEM = NEW.FCDE_ITEM AND ARTI_COD = NEW.arti_cod;
                END
            end
        /* ACTUALICE EL STAND */
        UPDATE or INSERT INTO stands (ARTI_COD, BODE_COD, STAND_COD) VALUES (NEW.arti_cod, NEW.bode_cod, NEW.fcde_stand);
        END
    end
END
^

SET TERM ; ^


INSERT INTO IMPORTACION_INVENTARIO (IMIN_TIPO, IMIN_DATO, IMIN_COLUMNA, IMIN_ANCHO) VALUES (3, 'ENDE_STAND', 9, 15);

INSERT INTO NOMBRES_CAMPOS (NOMBRE, DESCRIPCION) VALUES ('ENDE_STAND', 'Stand del inventario');
COMMIT WORK;

/* 20081222b */

SET TERM ^ ;

create trigger STANDS_BI for STANDS
active BEFORE INSERT position 0
as
begin
if ((new.stand_cod is null) or (new.stand_cod = ''))  then
    new.stand_cod = '0000';
end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER ENTRADAS_DETALLE_AI FOR ENTRADAS_DETALLE
ACTIVE AFTER INSERT POSITION 0
AS
declare variable fec date;
declare variable CONC VARCHAR(60);
declare variable factor numeric(18,4);
declare variable Pref varchar(4);
declare variable Num varchar(6);
declare variable Nit varchar(20);
declare variable IVAINC CHAR(2);
declare variable COSTO NUMERIC(18,2);
BEGIN
  if ((NEW.entr_id <> 0) and (new.ende_anulado = 'N')) then
    BEGIN
    select entr_fecha, entr_conc, pref_pre, entr_numero, terc_nit, entr_imptos
        from entradas where entr_id = new.entr_id
        into :fec, :conc, :Pref, :Num, :Nit, :ivainc;
    execute procedure factor_unidad_cant(new.arti_cod, new.ende_unidad) returning_values(factor);
    COSTO = ((new.ende_costo - NEW.ende_dtomonto) / :factor);
    if (IVAINC = 'S') then
        COSTO = COSTO / (1 + NEW.ende_ivaporc/100);
    INSERT INTO MOVIMIENTO_ARTICULO
      (ARTI_COD, MVAR_CONS, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM, TERC_NIT)
      VALUES(NEW.ARTI_COD, GEN_ID(ID_MOVARTI,1), NEW.BODE_COD, :FEC, 11, NEW.entr_id,
      :CONC, :factor * new.ende_cant, :costo, 'S', new.ende_lote, :Pref, :Num, new.ende_item, :Nit);
    /* RECORRA LAS LISTAS DE PRECIOS Y CAMBIE EL PRECIO */
    EXECUTE PROCEDURE CALCULA_PRECIOS(NEW.ARTI_COD, :FEC);
    /* ACTUALICE EL STAND */
    if (new.ende_stand is not null) then
        UPDATE or INSERT INTO stands (ARTI_COD, BODE_COD, STAND_COD) VALUES (NEW.arti_cod, NEW.bode_cod, NEW.ende_stand);
    END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER ENTRADAS_DETALLE_AU FOR ENTRADAS_DETALLE
ACTIVE AFTER UPDATE POSITION 0
as
declare variable fec date;
declare variable CONC VARCHAR(60);
declare variable Pref varchar(4);
declare variable Num varchar(6);
declare variable Nit varchar(20);
declare variable factor numeric(18,4);
declare variable IVAINC CHAR(2);
declare variable COSTO NUMERIC(18,2);
BEGIN
if ((OLD.entr_id <> 0) AND (OLD.ende_anulado = 'N')) then
    DELETE FROM MOVIMIENTO_ARTICULO WHERE (mvar_tipodoc = 11) and (mvar_idref = new.entr_id) and (mvar_item = old.ende_item);
if ((NEW.entr_id <> 0) AND (NEW.ende_anulado = 'N')) then
    begin
    select entr_fecha, entr_conc, pref_pre, entr_numero, terc_nit, entr_imptos
        from entradas where entr_id = new.entr_id
        into :fec, :conc, :Pref, :Num, :Nit, :ivainc;
    execute procedure factor_unidad_cant(new.arti_cod, new.ende_unidad) returning_values(factor);
    COSTO = ((new.ende_costo - NEW.ende_dtomonto) / :factor);
    if (IVAINC = 'S') then
        COSTO = COSTO / (1 + NEW.ende_ivaporc/100);
    INSERT INTO MOVIMIENTO_ARTICULO
        (ARTI_COD, MVAR_CONS, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM, TERC_NIT)
        VALUES(NEW.ARTI_COD, GEN_ID(ID_MOVARTI,1), NEW.BODE_COD, :FEC, 11, NEW.entr_id,
        :CONC, :factor * new.ende_cant, :COSTO, 'S', new.ende_lote, :Pref, :Num, new.ende_item, :Nit);
    /* RECORRA LAS LISTAS DE PRECIOS Y CAMBIE EL PRECIO */
    EXECUTE PROCEDURE CALCULA_PRECIOS(NEW.ARTI_COD, :FEC);
    /* ACTUALICE EL STAND */
    if (new.ende_stand is not null) then
        UPDATE or INSERT INTO stands (ARTI_COD, BODE_COD, STAND_COD) VALUES (NEW.arti_cod, NEW.bode_cod, NEW.ende_stand);
    END
END
^

SET TERM ; ^

SET TERM ^ ;

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

        if (COSTO > 0 ) then
         BEGIN
          /* ACTUALICE EL COSTO POR PROVEEDOR */
          SELECT PVAR_FECHA FROM PROVEEDOR_ARTICULO
            WHERE TERC_NIT = :Nit AND ARTI_COD = NEW.ARTI_COD
            INTO :FECAUX;
          if (FECAUX IS NULL) then
            INSERT INTO PROVEEDOR_ARTICULO (TERC_NIT, ARTI_COD, PVAR_COSTO, PVAR_FECHA, PVAR_COD,PVAR_DES)
                VALUES (:Nit, NEW.ARTI_COD, :COSTO, :fec, NEW.fcde_codprov,NEW.fcde_desc);
          else
            UPDATE PROVEEDOR_ARTICULO
                SET PVAR_COSTO = :COSTO, PVAR_FECHA = :fec, PVAR_COD = NEW.fcde_codprov
                WHERE ARTI_COD = NEW.ARTI_COD AND TERC_NIT = :Nit;
         END
        /* RECORRA LAS LISTAS DE PRECIOS Y CAMBIE EL PRECIO */
        EXECUTE PROCEDURE CALCULA_PRECIOS(NEW.ARTI_COD, :FEC);
        END /* AFECTAR INV */
    EXECUTE PROCEDURE lee_configuracion('COMPRAS', 'FACTURAS', 'ACTUALIZAR COSTOS DE LA REMISION RELACIONADA AL GRABAR LA FACTURA') returning_values (:ACTREM);
    if ((ACTREM = 'SI') and (Tipo = 22)) then
        BEGIN
        numrows = 0;
        select mvar_cons, MVAR_ITEM, MVAR_FECHA, MVAR_IDREF, MVAR_CANT, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO
            from movimiento_articulo M, consolidado_faltantes C
            where C.cofa_id = :CONSOLIDA AND mvar_tipodoc = 22 and mvar_idref = C.cofa_idori AND C.cofa_tipoori = 22 and m.arti_cod = new.arti_cod
            into :numrows, :iterem, :fecrem, :idrem, :cantrem, :loterem, :prefrem, :numrem;
        
        if (numrows <> 0) then
            BEGIN
            DELETE FROM MOVIMIENTO_ARTICULO WHERE MVAR_CONS = :numrows;
            INSERT INTO MOVIMIENTO_ARTICULO
                (ARTI_COD, MVAR_CONS, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM, TERC_NIT)
                VALUES(NEW.ARTI_COD, GEN_ID(ID_MOVARTI,1), NEW.BODE_COD, :fecrem, 22, :idrem,
                :CONC, :cantrem, :costo, 'S', :loterem, :prefrem, :numrem, :iterem, :Nit);
        
            if (COSTO > 0 ) then
                BEGIN
                /* ACTUALICE EL COSTO POR PROVEEDOR */
                SELECT PVAR_FECHA FROM PROVEEDOR_ARTICULO
                    WHERE TERC_NIT = :Nit AND ARTI_COD = NEW.ARTI_COD
                    INTO :FECAUX;
                if (FECAUX IS NULL) then
                    INSERT INTO PROVEEDOR_ARTICULO (TERC_NIT, ARTI_COD, PVAR_COSTO, PVAR_FECHA, PVAR_COD,PVAR_DES)
                        VALUES (:Nit, NEW.ARTI_COD, :COSTO, :fec, NEW.fcde_codprov,NEW.fcde_desc);
                else
                    UPDATE PROVEEDOR_ARTICULO
                        SET PVAR_COSTO = :COSTO, PVAR_FECHA = :fec, PVAR_COD = NEW.fcde_codprov
                        WHERE ARTI_COD = NEW.ARTI_COD AND TERC_NIT = :Nit;
                END
            /* RECORRA LAS LISTAS DE PRECIOS Y CAMBIE EL PRECIO */
            EXECUTE PROCEDURE CALCULA_PRECIOS(NEW.ARTI_COD, :FEC);
            END
        END

    /* ACTUALICE EL PENDIENTE  */
    if (CONSOLIDA <> 0) then
        BEGIN
        UPDATE consolidado_faltantes SET COFA_OK = 'S' WHERE COFA_ID = :consolida AND COFA_ITEM = NEW.FCDE_ITEM AND ARTI_COD = NEW.arti_cod;
        EXECUTE procedure LEE_CONFIGURACION ('COMPRAS','DOCUMENTOS','SUMAR CANTIDADES PENDIENTES AL CONSOLIDAR DOCUMENTOS') returning_values (CONSO);
        /* IGNORE LA CONSOLIDACION SI SE VALIDAN CODIGOS DE LA ORDEN */
        SELECT MIN(CEFA_TIPOORI) FROM consolide_faltantes WHERE CEFA_ID = :CONSOLIDA INTO :NUMROWS;
        if (NUMROWS = 23) then
            BEGIN
            EXECUTE PROCEDURE LEE_CONFIGURACION('COMPRAS', 'FACTURAS', 'VERIFICAR CODIGOS DE LA ORDEN') returning_values (MENORV);
            if (MENORV = 'SI') then
                CONSO = 'NO';
            END
        SELECT COUNT(CEFA_ITEM) FROM consolide_faltantes WHERE CEFA_ID = :CONSOLIDA INTO :NUMROWS;
        if ((CONSO = 'SI') AND (NUMROWS > 1)) then
            UPDATE consolidado_faltantes SET COFA_IDDES = NEW.faco_id, COFA_OK = 'S' WHERE COFA_ID = :consolida;
        else
            BEGIN
            /* BUSQUE EL CONSOLIDADO EN EL MISMO ITEM Y SI ES DIFERENTE ACTUALICELO */
            select COFA_CANT * COFA_FACTOR FROM consolidado_faltantes WHERE COFA_ID = :consolida AND COFA_ITEM = NEW.FCDE_ITEM AND ARTI_COD = NEW.arti_cod INTO :CANTREL;
            if (NEW.FCDE_CANT * NEW.FCDE_FACTOR < CANTREL) then
                UPDATE consolidado_faltantes SET COFA_IDDES = NEW.faco_id, COFA_CANT = NEW.FCDE_CANT, COFA_FACTOR = NEW.FCDE_FACTOR
                    WHERE COFA_ID = :consolida AND COFA_ITEM = NEW.FCDE_ITEM AND ARTI_COD = NEW.arti_cod;
            END
        END
    /* ACTUALICE EL STAND */
    if (new.fcde_stand is not null) then
        UPDATE or INSERT INTO stands (ARTI_COD, BODE_COD, STAND_COD) VALUES (NEW.arti_cod, NEW.bode_cod, NEW.fcde_stand);
    END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER FACTCOMP_DETALLE_AU FOR FACTURAS_COMPRAS_DETALLE
ACTIVE AFTER UPDATE POSITION 0
as
declare variable fec date;
declare variable fecaux date;
declare variable AUX varchar(90);
declare variable CONC VARCHAR(60);
declare variable Pref varchar(4);
declare variable Num varchar(6);
declare variable Nit varchar(20);
declare variable factor numeric(18,4);
declare variable TIPO INTEGER;
declare variable INVFAC CHAR(2);
declare variable IVAINC CHAR(2);
declare variable COSTO NUMERIC(18,2);
declare variable CANTREL NUMERIC(18,4);
declare variable NUMPROV VARCHAR(10);
declare variable NUMPED VARCHAR(30);
declare variable NUMREM VARCHAR(30);
declare variable CONSO VARCHAR(2);
declare variable CONSOLIDA INTEGER;
declare variable NUMROWS INTEGER;
declare variable DTOPIE NUMERIC(18,2);
declare variable ADICIONAL NUMERIC(18,2);
declare variable TOTAL NUMERIC(18,2);
declare variable IVAMONTO NUMERIC(18,2);
declare variable EXTRA NUMERIC(18,2);
declare variable FACT NUMERIC(18,4);
declare variable MENORV CHAR(2);
declare variable ACTREM CHAR(2);
declare variable FECREM date;
declare variable IDREM INTEGER;
declare variable ITEREM INTEGER;
declare variable CANTREM NUMERIC(18,4);
declare variable LOTEREM VARCHAR(15);
declare variable PREFREM CHAR(4);
BEGIN
if (old.fcde_devuelto = new.fcde_devuelto) then
    begin
    /* deshaga lo viejo */
    if ((old.fcde_anulado = 'N') and (OLD.faco_id <> 0)) then
        begin
        select faco_fecha, faco_consolida from facturas_compra where faco_id = old.faco_id into :fec, :consolida;
        DELETE FROM MOVIMIENTO_ARTICULO WHERE (mvar_tipodoc = 21) and (mvar_idref = old.faco_id) and (mvar_item = old.fcde_item);
        /* RECORRA LAS LISTAS DE PRECIOS Y CAMBIE EL PRECIO */
        EXECUTE PROCEDURE CALCULA_PRECIOS(old.ARTI_COD, :FEC);
        /* LOS PENDIENTES */
        if (CONSOLIDA <> 0) then
            BEGIN
            UPDATE consolidado_faltantes SET COFA_OK = 'N' WHERE COFA_ID = :consolida AND COFA_ITEM = old.FCDE_ITEM AND ARTI_COD = old.arti_cod;
            SELECT COUNT(CEFA_ITEM) FROM consolide_faltantes WHERE CEFA_ID = :CONSOLIDA INTO :NUMROWS;
            EXECUTE procedure LEE_CONFIGURACION ('COMPRAS','DOCUMENTOS','SUMAR CANTIDADES PENDIENTES AL CONSOLIDAR DOCUMENTOS') returning_values (CONSO);
            /* IGNORE LA CONSOLIDACION SI SE VALIDAN CODIGOS DE LA ORDEN */
            SELECT MIN(CEFA_TIPOORI) FROM consolide_faltantes WHERE CEFA_ID = :CONSOLIDA INTO :NUMROWS;
            if (NUMROWS = 23) then
                BEGIN
                EXECUTE PROCEDURE LEE_CONFIGURACION('COMPRAS', 'FACTURAS', 'VERIFICAR CODIGOS DE LA ORDEN') returning_values (MENORV);
                if (MENORV = 'SI') then
                    CONSO = 'NO';
                END
            if (CONSO = 'SI') then
                UPDATE consolidado_faltantes SET COFA_OK = 'N' WHERE COFA_ID = :consolida;
            END
        end
    /* Registre el nuevo */
    if ((new.fcde_anulado = 'N') and (new.faco_id <> 0)) then
        BEGIN
        select faco_fecha, pref_pre, faco_numero, terc_nit, faco_imptos, faco_numprov, faco_remision, faco_orden, faco_consolida, faco_dtomonto, faco_adicional, faco_total, faco_ivamonto, faco_extra
            from facturas_compra where faco_id = new.faco_id
            into :fec, :Pref, :Num, :Nit, :ivainc, :numprov, :numrem, :numped, :consolida, :dtopie, :adicional, :total, :ivamonto, :extra;
        conc = 'FACTURA DE COMPRA No.' || PREF || NUM || '-' || NUMPROV;
        if (NUMREM <> '') then
            BEGIN
            AUX = SUBSTR(NUMREM, 1, 15);
            conc = conc || '-REM:' || AUX;
            END
        else
            if (NUMPED <> '') then
                BEGIN
                AUX = SUBSTR(NUMPED, 1, 15);
                conc = conc || '-ORDEN ' || AUX;
                END
        SELECT MAX(CEFA_TIPOORI) FROM consolide_faltantes WHERE CEFA_ID = :CONSOLIDA INTO :TIPO;
        if (Tipo is null) then
            Tipo = 0;
        execute procedure lee_configuracion('COMPRAS', 'FACTURAS', 'AFECTAR INVENTARIO CON LA FACTURA') returning_values (:INVFAC);
        /* si se hizo con base en una remision no afecte inventario */
        if ((Tipo <> 22) and (INVFAC = 'SI')) then
            begin
            execute procedure factor_unidad_cant(new.arti_cod, new.fcde_unidad) returning_values(factor);
            COSTO = ((new.fcde_prunit - NEW.fcde_dtomonto) / :factor);
            if (IVAINC = 'S') then
                COSTO = COSTO / (1 + NEW.fcde_ivaporc/100);
            EXECUTE PROCEDURE lee_configuracion('COMPRAS','FACTURAS','DESCUENTO Y VALOR ADICIONAL DEL DOCUMENTO COMO MENOR VALOR DEL COSTO') returning_values (:MENORV);
            if (MENORV = 'SI') then
                BEGIN
                FACT = (TOTAL - EXTRA - IVAMONTO);
                if ((FACT - ADICIONAL + DTOPIE) <> 0) then
                    FACT = FACT / (FACT - ADICIONAL + DTOPIE);
                ELSE
                    FACT = 1;
                COSTO = COSTO * FACT;
                END
            INSERT INTO MOVIMIENTO_ARTICULO
                (ARTI_COD, MVAR_CONS, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM, TERC_NIT)
                VALUES(NEW.ARTI_COD, GEN_ID(ID_MOVARTI,1), NEW.BODE_COD, :FEC, 21, NEW.faco_id,
                :CONC, :factor * new.fcde_cant, :COSTO, 'S', new.fcde_lote, :Pref, :Num, NEW.fcde_item, :Nit);
            if (COSTO > 0 ) then
             BEGIN
              /* ACTUALICE EL COSTO POR PROVEEDOR */
              SELECT PVAR_FECHA FROM PROVEEDOR_ARTICULO
                WHERE TERC_NIT = :Nit AND ARTI_COD = NEW.ARTI_COD INTO :FECAUX;
              if (FECAUX IS NULL) then
                INSERT INTO PROVEEDOR_ARTICULO (TERC_NIT, ARTI_COD, PVAR_COSTO, PVAR_FECHA, PVAR_COD,PVAR_DES)
                    VALUES (:Nit, NEW.ARTI_COD, :COSTO, :fec, NEW.fcde_codprov,NEW.fcde_desc);
              else
                UPDATE PROVEEDOR_ARTICULO
                    SET PVAR_COSTO = :COSTO, PVAR_FECHA = :fec, PVAR_COD = NEW.fcde_codprov
                    WHERE ARTI_COD = NEW.ARTI_COD AND TERC_NIT = :Nit;
             END
            /* RECORRA LAS LISTAS DE PRECIOS Y CAMBIE EL PRECIO */
            EXECUTE PROCEDURE CALCULA_PRECIOS(NEW.ARTI_COD, :FEC);
            end
        EXECUTE PROCEDURE lee_configuracion('COMPRAS', 'FACTURAS', 'ACTUALIZAR COSTOS DE LA REMISION RELACIONADA AL GRABAR LA FACTURA') returning_values (:ACTREM);
        if ((ACTREM = 'SI') and (Tipo = 22)) then
            BEGIN
            numrows = 0;
            select mvar_cons, MVAR_ITEM, MVAR_FECHA, MVAR_IDREF, MVAR_CANT, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO
                from movimiento_articulo M, consolidado_faltantes C
                where C.cofa_id = :CONSOLIDA AND mvar_tipodoc = 22 and mvar_idref = C.cofa_idori AND C.cofa_tipoori = 22 and m.arti_cod = new.arti_cod
                into :numrows, :iterem, :fecrem, :idrem, :cantrem, :loterem, :prefrem, :numrem;
            
            if (numrows <> 0) then
                BEGIN
                DELETE FROM MOVIMIENTO_ARTICULO WHERE MVAR_CONS = :numrows;
                INSERT INTO MOVIMIENTO_ARTICULO
                    (ARTI_COD, MVAR_CONS, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM, TERC_NIT)
                    VALUES(NEW.ARTI_COD, GEN_ID(ID_MOVARTI,1), NEW.BODE_COD, :fecrem, 22, :idrem,
                    :CONC, :cantrem, :costo, 'S', :loterem, :prefrem, :numrem, :iterem, :Nit);
        
                if (COSTO > 0 ) then
                    BEGIN
                    /* ACTUALICE EL COSTO POR PROVEEDOR */
                    SELECT PVAR_FECHA FROM PROVEEDOR_ARTICULO
                        WHERE TERC_NIT = :Nit AND ARTI_COD = NEW.ARTI_COD
                        INTO :FECAUX;
                    if (FECAUX IS NULL) then
                        INSERT INTO PROVEEDOR_ARTICULO (TERC_NIT, ARTI_COD, PVAR_COSTO, PVAR_FECHA, PVAR_COD,PVAR_DES)
                            VALUES (:Nit, NEW.ARTI_COD, :COSTO, :fec, NEW.fcde_codprov,NEW.fcde_desc);
                    else
                        UPDATE PROVEEDOR_ARTICULO
                            SET PVAR_COSTO = :COSTO, PVAR_FECHA = :fec, PVAR_COD = NEW.fcde_codprov
                            WHERE ARTI_COD = NEW.ARTI_COD AND TERC_NIT = :Nit;
                    END
                /* RECORRA LAS LISTAS DE PRECIOS Y CAMBIE EL PRECIO */
                EXECUTE PROCEDURE CALCULA_PRECIOS(NEW.ARTI_COD, :FEC);
                END
            END

        if (CONSOLIDA <> 0) then
            begin
            UPDATE consolidado_faltantes SET COFA_OK = 'S' WHERE COFA_ID = :consolida AND COFA_ITEM = NEW.FCDE_ITEM AND ARTI_COD = NEW.arti_cod;
            EXECUTE procedure LEE_CONFIGURACION ('COMPRAS','DOCUMENTOS','SUMAR CANTIDADES PENDIENTES AL CONSOLIDAR DOCUMENTOS') returning_values (CONSO);
            /* IGNORE LA CONSOLIDACION SI SE VALIDAN CODIGOS DE LA ORDEN */
            SELECT MIN(CEFA_TIPOORI) FROM consolide_faltantes WHERE CEFA_ID = :CONSOLIDA INTO :NUMROWS;
            if (NUMROWS = 23) then
                BEGIN
                EXECUTE PROCEDURE LEE_CONFIGURACION('COMPRAS', 'FACTURAS', 'VERIFICAR CODIGOS DE LA ORDEN') returning_values (MENORV);
                if (MENORV = 'SI') then
                    CONSO = 'NO';
                END
            SELECT COUNT(CEFA_ITEM) FROM consolide_faltantes WHERE CEFA_ID = :CONSOLIDA INTO :NUMROWS;
            if ((CONSO = 'SI') AND (NUMROWS > 1)) then
                UPDATE consolidado_faltantes SET COFA_IDDES = NEW.faco_id, COFA_OK = 'S' WHERE COFA_ID = :consolida;
            else
                BEGIN
                /* BUSQUE EL CONSOLIDADO EN EL MISMO ITEM Y SI ES DIFERENTE ACTUALICELO */
                select COFA_CANT * COFA_FACTOR FROM consolidado_faltantes WHERE COFA_ID = :consolida AND COFA_ITEM = NEW.FCDE_ITEM AND ARTI_COD = NEW.arti_cod INTO :CANTREL;
                if (NEW.FCDE_CANT * NEW.FCDE_FACTOR < CANTREL) then
                    UPDATE consolidado_faltantes SET COFA_IDDES = NEW.faco_id, COFA_CANT = NEW.FCDE_CANT, COFA_FACTOR = NEW.FCDE_FACTOR
                        WHERE COFA_ID = :consolida AND COFA_ITEM = NEW.FCDE_ITEM AND ARTI_COD = NEW.arti_cod;
                END
            end
        /* ACTUALICE EL STAND */
        if (new.fcde_stand is not null) then
            UPDATE or INSERT INTO stands (ARTI_COD, BODE_COD, STAND_COD) VALUES (NEW.arti_cod, NEW.bode_cod, NEW.fcde_stand);
        END
    end
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER REMISION_PROVEEDOR_DET_AI FOR REMISION_PROVEEDOR_DET
ACTIVE AFTER INSERT POSITION 0
AS
declare variable fec date;
declare variable CONC VARCHAR(60);
declare variable factor numeric(18,4);
declare variable Pref varchar(4);
declare variable Num varchar(6);
declare variable EXISTE CHAR(1);
declare variable NIT VARCHAR(20);
declare variable NUMPROV VARCHAR(20);
declare variable Tipo Integer;
declare variable idfact integer;
declare variable numrows integer;
declare variable IVAINC CHAR(2);
declare variable COSTO NUMERIC(18,2);
declare variable CANTREL NUMERIC(18,4);
declare variable NUMPED VARCHAR(30);
declare variable CONSO CHAR(2);
declare variable CONSOLIDA INTEGER;
declare variable DTOPIE NUMERIC(18,2);
declare variable ADICIONAL NUMERIC(18,2);
declare variable TOTAL NUMERIC(18,2);
declare variable IVAMONTO NUMERIC(18,2);
declare variable EXTRA NUMERIC(18,2);
declare variable FACT NUMERIC(18,4);
declare variable MENORV CHAR(2);
BEGIN
  if ((NEW.repr_id <> 0) and (new.rpvd_anulado = 'N')) then
    BEGIN
    select max(rprd_tiporel), max(rprd_idrel) from remision_proveedor_docrela
        where repr_id = new.repr_id into :Tipo, :idfact;
    if (Tipo is null) then
        Tipo = 0;
    /* si se hizo con base en una factura que afecto el inventario no afecte inventario */
    numrows = 0;
    if (Tipo = 21) Then
        select count(*) from movimiento_articulo where mvar_tipodoc = 21 and mvar_idref = :idfact into :numrows;
    if (numrows is null) then
        numrows = 0;
    if (numrows = 0) then
        begin
        select repr_fecha, pref_pre, repr_numero, REPR_IMPTOS, terc_nit, REPR_NUMPROV, REPR_ORDEN, REPR_CONSOLIDA, repr_dtomonto, repr_adicional, repr_total, repr_ivamonto, repr_extra
            from remision_proveedor where repr_id = new.repr_id
            into :fec, :Pref, :Num, :IVAINC, :NIT, :NUMPROV, :numped, :CONSOLIDA, :dtopie, :adicional, :total, :ivamonto, :extra;
        execute procedure factor_unidad_cant(new.arti_cod, new.rpvd_unidad) returning_values(factor);
        CONC = 'REMISION PROVEEDOR No.' || PREF || NUM || '-' || NUMPROV;
        if (numped <> '') then
            conc = conc || '-ORDEN ' || NUMPED;
        COSTO = ((new.rpvd_prunit - NEW.rpvd_dtomonto) / :factor);
        if (IVAINC = 'S') then
            COSTO = COSTO / (1 + NEW.rpvd_ivaporc/100);
        EXECUTE PROCEDURE lee_configuracion('COMPRAS','FACTURAS','DESCUENTO Y VALOR ADICIONAL DEL DOCUMENTO COMO MENOR VALOR DEL COSTO') returning_values (:MENORV);
        if (MENORV = 'SI') then
            BEGIN
            FACT = (TOTAL - EXTRA - IVAMONTO);
            if ((FACT - ADICIONAL + DTOPIE) <> 0) then
                FACT = FACT / (FACT - ADICIONAL + DTOPIE);
            ELSE
                FACT = 1;
            COSTO = COSTO * FACT;
            END
        INSERT INTO MOVIMIENTO_ARTICULO
          (ARTI_COD, MVAR_CONS, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM, TERC_NIT)
          VALUES(NEW.ARTI_COD, GEN_ID(ID_MOVARTI,1), NEW.BODE_COD, :FEC, 22, NEW.repr_id,
          :CONC, :factor * new.rpvd_cant, :COSTO, 'S', new.rpvd_lote, :Pref, :Num, new.rpvd_item, :Nit);

        /* RECORRA LAS LISTAS DE PRECIOS Y CAMBIE EL PRECIO */
        EXECUTE PROCEDURE CALCULA_PRECIOS(NEW.ARTI_COD, :FEC);

        if (COSTO > 0 ) then
         BEGIN
          /* GRABE PROV X ARTICULO */
          EXISTE = 'N';
          SELECT 'S' FROM PROVEEDOR_ARTICULO WHERE TERC_NIT = :NIT AND ARTI_COD = NEW.ARTI_COD INTO :EXISTE;
          if (EXISTE = 'S') then
            UPDATE PROVEEDOR_ARTICULO 
                SET PVAR_FECHA = :FEC, PVAR_COSTO = :COSTO, PVAR_COD = NEW.rpvd_codprov
                WHERE TERC_NIT = :NIT AND ARTI_COD = NEW.ARTI_COD;
          ELSE
            INSERT INTO PROVEEDOR_ARTICULO (TERC_NIT, ARTI_COD, PVAR_COSTO, PVAR_FECHA, PVAR_COD,PVAR_DES)
                VALUES (:NIT, NEW.ARTI_COD, :COSTO, :FEC, NEW.rpvd_codprov,NEW.rpvd_desc);
         END
        end

    /* ACTUALICE EL PENDIENTE  */
    if (CONSOLIDA <> 0) then
        BEGIN
        EXECUTE PROCEDURE LEE_CONFIGURACION ('COMPRAS','DOCUMENTOS','SUMAR CANTIDADES PENDIENTES AL CONSOLIDAR DOCUMENTOS') returning_values (CONSO);
        SELECT MIN(CEFA_TIPOORI) FROM consolide_faltantes WHERE CEFA_ID = :CONSOLIDA INTO :NUMROWS;
        if (NUMROWS = 23) then
            BEGIN
            EXECUTE PROCEDURE LEE_CONFIGURACION('COMPRAS', 'REMISIONES', 'VERIFICAR CODIGOS DE LA ORDEN') returning_values (MENORV);
            if (MENORV = 'SI') then
                CONSO = 'NO';
            END
        SELECT COUNT(CEFA_ITEM) FROM consolide_faltantes WHERE CEFA_ID = :CONSOLIDA INTO :NUMROWS;
        if ((CONSO = 'SI') AND (NUMROWS > 1)) then
            UPDATE consolidado_faltantes SET COFA_OK = 'S' WHERE COFA_ID = :consolida;
        ELSE
            BEGIN
            /* BUSQUE EL CONSOLIDADO EN EL MISMO ITEM Y SI ES DIFERENTE ACTUALICELO */
            select COFA_CANT * COFA_FACTOR FROM consolidado_faltantes WHERE COFA_ID = :consolida AND COFA_ITEM = NEW.RPVD_ITEM AND ARTI_COD = NEW.arti_cod INTO :CANTREL;
            if (NEW.RPVD_CANT * NEW.RPVD_FACTOR < CANTREL) then
                UPDATE consolidado_faltantes SET COFA_IDDES = NEW.repr_id, COFA_CANT = NEW.RPVD_CANT, COFA_FACTOR = NEW.RPVD_FACTOR
                    WHERE COFA_ID = :consolida AND COFA_ITEM = NEW.RPVD_ITEM AND ARTI_COD = NEW.arti_cod;
            ELSE
                UPDATE consolidado_faltantes SET COFA_IDDES = NEW.repr_id, COFA_OK = 'S' WHERE COFA_ID = :consolida AND COFA_ITEM = NEW.RPVD_ITEM AND ARTI_COD = NEW.arti_cod;
            END
        END
    /* ACTUALICE EL STAND */
    if (new.rpvd_stand is not null) then
        UPDATE or INSERT INTO stands (ARTI_COD, BODE_COD, STAND_COD) VALUES (NEW.arti_cod, NEW.bode_cod, NEW.rpvd_stand);
    END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER REMISION_PROVEEDOR_DET_AU FOR REMISION_PROVEEDOR_DET
ACTIVE AFTER UPDATE POSITION 0
AS
declare variable fec date;
declare variable CONC VARCHAR(60);
declare variable Pref varchar(4);
declare variable Num varchar(6);
declare variable factor numeric(18,4);
declare variable EXISTE CHAR(1);
declare variable NIT VARCHAR(20);
declare variable NUMPROV VARCHAR(20);
declare variable Tipo integer;
declare variable idfact integer;
declare variable numrows integer;
declare variable IVAINC CHAR(2);
declare variable COSTO NUMERIC(18,2);
declare variable CANTREL NUMERIC(18,4);
declare variable NUMPED VARCHAR(30);
declare variable CONSO CHAR(2);
declare variable CONSOLIDA INTEGER;
declare variable DTOPIE NUMERIC(18,2);
declare variable ADICIONAL NUMERIC(18,2);
declare variable TOTAL NUMERIC(18,2);
declare variable IVAMONTO NUMERIC(18,2);
declare variable EXTRA NUMERIC(18,2);
declare variable FACT NUMERIC(18,4);
declare variable MENORV CHAR(2);
BEGIN
if ((OLD.repr_id <> 0) AND (OLD.rpvd_anulado = 'N')) then
    begin
    DELETE FROM MOVIMIENTO_ARTICULO WHERE (mvar_tipodoc = 22) and (mvar_idref = new.repr_id) and (mvar_item = old.rpvd_item);
    select REPR_CONSOLIDA from remision_proveedor where repr_id = old.repr_id into :CONSOLIDA;
    if (CONSOLIDA <> 0) then
        begin
        EXECUTE PROCEDURE LEE_CONFIGURACION ('COMPRAS','DOCUMENTOS','SUMAR CANTIDADES PENDIENTES AL CONSOLIDAR DOCUMENTOS') returning_values (CONSO);
        SELECT COUNT(CEFA_ITEM) FROM consolide_faltantes WHERE CEFA_ID = :CONSOLIDA INTO :NUMROWS;
        if ((NUMROWS = 1) OR (CONSO = 'NO')) then
            UPDATE consolidado_faltantes SET COFA_OK = 'N' WHERE COFA_ID = :consolida AND COFA_ITEM = old.RPVD_ITEM AND ARTI_COD = old.arti_cod;
        else
            UPDATE consolidado_faltantes SET COFA_OK = 'N' WHERE COFA_ID = :consolida;
        END
    end
/* Registre el nuevo */
if ((new.repr_id <> 0) AND (new.rpvd_anulado = 'N')) then
    begin
    select repr_fecha, pref_pre, repr_numero, repr_imptos, terc_nit, REPR_NUMPROV, REPR_ORDEN, REPR_CONSOLIDA, repr_dtomonto, repr_adicional, repr_total, repr_ivamonto, repr_extra
        from remision_proveedor where repr_id = new.repr_id
        into :fec, :Pref, :Num, :IVAINC, :NIT, :NUMPROV, :numped, :CONSOLIDA, :dtopie, :adicional, :total, :ivamonto, :extra;
    CONC = 'REMISION PROVEEDOR No.' || PREF || NUM || '-' || NUMPROV;
    if (numped <> '') then
        conc = conc || '-ORDEN ' || NUMPED;
    SELECT MAX(CEFA_TIPOORI) FROM consolide_faltantes WHERE CEFA_ID = :CONSOLIDA INTO :TIPO;
    if (Tipo is null) then
        Tipo = 0;
    select FACO_ID from FACTURAS_COMPRA WHERE FACO_CONSOLIDA = :consolida INTO :IDFACT;
    if (Idfact is null) then
        Idfact = 0;
    /* si se hizo con base en una factura que afecto el inventario no afecte inventario */
    numrows = 0;
    if (Tipo = 21) Then
        select count(*) from movimiento_articulo where mvar_tipodoc = 21 and mvar_idref = :idfact into :numrows;
    if (numrows is null) then
        numrows = 0;
    if (numrows = 0) then
        begin
        execute procedure factor_unidad_cant(new.arti_cod, new.rpvd_unidad) returning_values(factor);
        COSTO = ((new.rpvd_prunit - NEW.rpvd_dtomonto) / :factor);
        if (IVAINC = 'S') then
            COSTO = COSTO / (1 + NEW.rpvd_ivaporc/100);
        EXECUTE PROCEDURE lee_configuracion('COMPRAS','FACTURAS','DESCUENTO Y VALOR ADICIONAL DEL DOCUMENTO COMO MENOR VALOR DEL COSTO') returning_values (:MENORV);
        if (MENORV = 'SI') then
            BEGIN
            FACT = (TOTAL - EXTRA - IVAMONTO);
            if ((FACT - ADICIONAL + DTOPIE) <> 0) then
                FACT = FACT / (FACT - ADICIONAL + DTOPIE);
            ELSE
                FACT = 1;
            COSTO = COSTO * FACT;
            END
        INSERT INTO MOVIMIENTO_ARTICULO
            (ARTI_COD, MVAR_CONS, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM, TERC_NIT)
            VALUES(NEW.ARTI_COD, GEN_ID(ID_MOVARTI,1), NEW.BODE_COD, :FEC, 22, NEW.repr_id,
            :CONC, :factor * new.rpvd_cant, :COSTO, 'S', new.rpvd_lote, :Pref, :Num, new.rpvd_item, :Nit);
            
        /* RECORRA LAS LISTAS DE PRECIOS Y CAMBIE EL PRECIO */
        EXECUTE PROCEDURE CALCULA_PRECIOS(NEW.ARTI_COD, :FEC);
          
        if (COSTO > 0 ) then
         BEGIN
          /* GRABE PROV X ARTICULO */
          EXISTE = 'N';
          SELECT 'S' FROM PROVEEDOR_ARTICULO WHERE TERC_NIT = :NIT AND ARTI_COD = NEW.ARTI_COD INTO :EXISTE;
          if (EXISTE = 'S') then
            UPDATE PROVEEDOR_ARTICULO
                SET PVAR_FECHA = :FEC, PVAR_COSTO = :COSTO, PVAR_COD = NEW.rpvd_codprov
                WHERE TERC_NIT = :NIT AND ARTI_COD = NEW.ARTI_COD;
          ELSE
            INSERT INTO PROVEEDOR_ARTICULO (TERC_NIT, ARTI_COD, PVAR_COSTO, PVAR_FECHA, PVAR_COD,PVAR_DES)
                VALUES (:NIT, NEW.ARTI_COD, :COSTO, :FEC, NEW.rpvd_codprov,NEW.rpvd_desc);
         END
        end
    if (CONSOLIDA <> 0) then
        BEGIN
        EXECUTE PROCEDURE LEE_CONFIGURACION ('COMPRAS','DOCUMENTOS','SUMAR CANTIDADES PENDIENTES AL CONSOLIDAR DOCUMENTOS') returning_values (CONSO);
        /* IGNORE LA CONSOLIDACION SI SE VALIDAN CODIGOS DE LA ORDEN */
        SELECT MIN(CEFA_TIPOORI) FROM consolide_faltantes WHERE CEFA_ID = :CONSOLIDA INTO :NUMROWS;
        if (NUMROWS = 23) then
            BEGIN
            EXECUTE PROCEDURE LEE_CONFIGURACION('COMPRAS', 'REMISIONES', 'VERIFICAR CODIGOS DE LA ORDEN') returning_values (MENORV);
            if (MENORV = 'SI') then
                CONSO = 'NO';
            END
        SELECT COUNT(CEFA_ITEM) FROM consolide_faltantes WHERE CEFA_ID = :CONSOLIDA INTO :NUMROWS;
        if ((CONSO = 'SI') AND (NUMROWS > 1)) then
            UPDATE consolidado_faltantes SET COFA_IDDES = NEW.repr_id, COFA_OK = 'S' WHERE COFA_ID = :consolida;
        ELSE
            BEGIN
            /* BUSQUE EL CONSOLIDADO EN EL MISMO ITEM Y SI ES DIFERENTE ACTUALICELO */
            select COFA_CANT * COFA_FACTOR FROM consolidado_faltantes WHERE COFA_ID = :consolida AND COFA_ITEM = NEW.RPVD_ITEM AND ARTI_COD = NEW.arti_cod INTO :CANTREL;
            if (NEW.RPVD_CANT * NEW.RPVD_FACTOR < CANTREL) then
                UPDATE consolidado_faltantes SET COFA_IDDES = NEW.repr_id, COFA_CANT = NEW.RPVD_CANT, COFA_FACTOR = NEW.RPVD_FACTOR
                    WHERE COFA_ID = :consolida AND COFA_ITEM = NEW.RPVD_ITEM AND ARTI_COD = NEW.arti_cod;
            else
                UPDATE consolidado_faltantes SET COFA_IDDES = NEW.repr_id, COFA_OK = 'S' WHERE COFA_ID = :consolida AND COFA_ITEM = NEW.RPVD_ITEM AND ARTI_COD = NEW.arti_cod;
            END
        END
    /* ACTUALICE EL STAND */
    if (new.rpvd_stand is not null) then
        UPDATE or INSERT INTO stands (ARTI_COD, BODE_COD, STAND_COD) VALUES (NEW.arti_cod, NEW.bode_cod, NEW.rpvd_stand);
    END
END
^

SET TERM ; ^


/* 20081223 BUSQUEDAS DE ARTICULOS CON CAMPO BUSCAR DABA STRING TRUNCATION */

SET TERM ^ ;

CREATE OR ALTER PROCEDURE CONSULTA_ARTICULOS_VTAS(
    FECHA DATE,
    INACTIVOS CHAR(1),
    MODULO VARCHAR(20),
    BUSCAR VARCHAR(100),
    CUALQUIERA CHAR(1),
    COLUMNA INTEGER,
    BUSCAR2 VARCHAR(30),
    BUSCAR3 VARCHAR(30),
    BUSCAR4 VARCHAR(30),
    BUSCAR5 VARCHAR(30))
RETURNS (
    CODIGO VARCHAR(20),
    DES VARCHAR(60),
    REF VARCHAR(20),
    GRUPO VARCHAR(30),
    MARCA VARCHAR(30),
    UNIDAD VARCHAR(8),
    ESTADO VARCHAR(30),
    IVA NUMERIC(9,2),
    EXISTEN NUMERIC(18,4),
    PRECIO NUMERIC(18,2),
    CLASE CHAR(1))
AS
DECLARE VARIABLE LISTA INTEGER;
DECLARE VARIABLE EXIST CHAR(2);
DECLARE VARIABLE SINEXIST CHAR(2);
declare variable DIG INTEGER;
declare variable OK CHAR(1);
BEGIN
EXISTEN = 0;
EXECUTE PROCEDURE lee_configuracion ('FACTURACION','ARTICULOS', 'VER EXISTENCIA EN CONSULTA ARTICULOS') returning_values (:EXIST);
EXECUTE PROCEDURE lee_configuracion ('FACTURACION','FACTURAS', 'CODIGO DE LA LISTA DE PRECIOS A MOSTRAR EN ARTICULOS') returning_values (:LISTA);
if (modulo = 'FACTURACION') then
  EXECUTE PROCEDURE lee_configuracion ('FACTURACION','ARTICULOS','VER ARTICULOS SIN EXISTENCIA EN CONSULTA DE ARTICULOS') returning_values (:sinexist);
else
  sinexist = 'SI';
EXECUTE PROCEDURE LEE_CONFIGURACION ('FACTURACION', 'ARTICULOS', 'REDONDEO AL MULTIPLO DE DIEZ EN PRECIOS') returning_values (DIG);
if (LISTA > 0) then
    BEGIN
    if ((BUSCAR IS NOT NULL) AND (BUSCAR <> '')) then
        FOR select a.arti_cod, arti_des, grup_cod, arti_unidad, esar_cod, taiv_porc, marc_cod,arti_clase
            from articulo a, tarifa_iva t
            where a.taiv_cod = t.taiv_cod and substring(a.arti_cod from 1 FOR 2) <> '.t' and
            ((:INACTIVOS = 'S') or (esar_cod = 'A') or ((:INACTIVOS = 'C') AND (esar_cod = 'N'))) AND
            ((:COLUMNA <> 0) or (upper(A.ARTI_COD) like upper(:buscar))) AND
            ((:columna <> 1) or (upper(A.ARTI_DES) like upper(:buscar))) AND
            ((:columna <> 2) or (upper(A.ARTI_OBS) like upper(:buscar)) or (upper(A.ARTI_DES) like upper(:buscar)))
            INTO :CODIGO, :DES, :GRUPO, :UNIDAD, :ESTADO, :IVA, :MARCA, :CLASE
            do
            begin
            select first 1 coba_cod from barras_articulo where arti_cod = :codigo into :ref;
            if ((COLUMNA <> 3) or (upper(REF) like upper(:buscar))) then
                BEGIN
                OK = 'N';
                PRECIO = 0;
                SELECT prar_fijo PRECIO FROM precios_articulo WHERE arti_cod = :CODIGO and lipr_cod = :LISTA INTO :PRECIO;
                EXECUTE PROCEDURE redondee(PRECIO, DIG) returning_values (PRECIO);
                if (EXIST = 'SI') then
                    BEGIN
                    EXECUTE PROCEDURE saldo_total_inventario (:CODIGO, :FECHA) returning_values (:EXISTEN);
                    if ((SINEXIST = 'SI')  or (existen <> 0)) then
                        OK = 'S';
                    END
                ELSE
                    OK = 'S';
                if (ok = 'S') then
                    if (CUALQUIERA = 'S') then
                        SUSPEND;
                    ELSE
                        if (BUSCAR2 <> '') then
                            BEGIN
                            IF (NOT EXISTS (SELECT ARTI_COD FROM ARTICULO WHERE ARTI_COD = :CODIGO AND ((upper(ARTI_DES) like upper(:BUSCAR2)) or (UPPER(ARTI_OBS) LIKE UPPER(:BUSCAR2))))) THEN
                                OK = 'N';
                            if ((OK = 'S') AND (BUSCAR3 <> '')) then
                                IF (NOT EXISTS (SELECT ARTI_COD FROM ARTICULO WHERE ARTI_COD = :CODIGO AND ((upper(ARTI_DES) like upper(:BUSCAR3)) or (UPPER(ARTI_OBS) LIKE UPPER(:BUSCAR3))))) THEN
                                    OK = 'N';
                            if ((OK = 'S') AND (BUSCAR4 <> '')) then
                                IF (NOT EXISTS (SELECT ARTI_COD FROM ARTICULO WHERE ARTI_COD = :CODIGO AND ((upper(ARTI_DES) like upper(:BUSCAR4)) or (UPPER(ARTI_OBS) LIKE UPPER(:BUSCAR4))))) THEN
                                    OK = 'N';
                            if ((OK = 'S') AND (BUSCAR4 <> '')) then
                                IF (NOT EXISTS (SELECT ARTI_COD FROM ARTICULO WHERE ARTI_COD = :CODIGO AND ((upper(ARTI_DES) like upper(:BUSCAR4)) or (UPPER(ARTI_OBS) LIKE UPPER(:BUSCAR4))))) THEN
                                    OK = 'N';
                            if ((OK = 'S') AND (BUSCAR5 <> '')) then
                                IF (NOT EXISTS (SELECT ARTI_COD FROM ARTICULO WHERE ARTI_COD = :CODIGO AND ((upper(ARTI_DES) like upper(:BUSCAR5)) or (UPPER(ARTI_OBS) LIKE UPPER(:BUSCAR5))))) THEN
                                    OK = 'N';
                            if (OK = 'S') then
                                SUSPEND;
                            END
                        ELSE
                            SUSPEND;
                END
            end
    ELSE
        FOR select a.arti_cod, arti_des, grup_cod, arti_unidad, esar_cod, taiv_porc, marc_cod,arti_clase
            from articulo a, tarifa_iva t
            where a.taiv_cod = t.taiv_cod and substring(a.arti_cod from 1 FOR 2) <> '.t' and
            ((:INACTIVOS = 'S') or (esar_cod = 'A') or ((:INACTIVOS = 'C') AND (esar_cod = 'N')))
            INTO :CODIGO, :DES, :GRUPO, :UNIDAD, :ESTADO, :IVA, :MARCA, :CLASE
            do
            begin
            select first 1 coba_cod from barras_articulo where arti_cod = :codigo into :ref;
            PRECIO = 0;
            SELECT prar_fijo PRECIO FROM precios_articulo WHERE arti_cod = :CODIGO and lipr_cod = :LISTA INTO :PRECIO;
            EXECUTE PROCEDURE redondee(PRECIO, DIG) returning_values (PRECIO);
            if (EXIST = 'SI') then
                BEGIN
                EXECUTE PROCEDURE saldo_total_inventario (:CODIGO, :FECHA) returning_values (:EXISTEN);
                if ((SINEXIST = 'SI')  or (existen <> 0)) then
                    SUSPEND;
                END
            ELSE
                SUSPEND;
            END
    END
ELSE
    if ((BUSCAR IS NOT NULL) AND (BUSCAR <> '')) then
        FOR select arti_cod, arti_des, grup_cod, arti_unidad, esar_cod, taiv_porc, arti_precio, marc_cod, arti_clase
            from articulo a, tarifa_iva t
            where a.taiv_cod = t.taiv_cod and substring(a.arti_cod from 1 FOR 2) <> '.t' and
            ((:INACTIVOS = 'S') or (esar_cod = 'A') or ((:INACTIVOS = 'C') AND (esar_cod = 'N'))) AND
            ((:COLUMNA <> 0) or (upper(A.ARTI_COD) like upper(:buscar))) AND
            ((:columna <> 1) or (upper(A.ARTI_DES) like upper(:buscar))) AND
            ((:columna <> 2) or (upper(A.ARTI_OBS) like upper(:buscar)) or (upper(A.ARTI_DES) like upper(:buscar)))
            INTO :CODIGO, :DES, :GRUPO, :UNIDAD, :ESTADO, :IVA, :PRECIO, :MARCA, :CLASE
            do
            begin
            select first 1 coba_cod from barras_articulo where arti_cod = :codigo into :ref;
            if ((COLUMNA <> 3) or (upper(REF) like upper(:buscar))) then
                BEGIN
                if (EXIST = 'SI') then
                    BEGIN
                    EXECUTE PROCEDURE saldo_total_inventario (:CODIGO, :FECHA) returning_values (:EXISTEN);
                    if ((SINEXIST = 'SI') or (existen <> 0)) then
                        OK = 'S';
                    END
                ELSE
                    OK = 'S';
                if (ok = 'S') then
                    if (CUALQUIERA = 'S') then
                        SUSPEND;
                    ELSE
                        if (BUSCAR2 <> '') then
                            BEGIN
                            IF (NOT EXISTS (SELECT ARTI_COD FROM ARTICULO WHERE ARTI_COD = :CODIGO AND ((upper(ARTI_DES) like upper(:BUSCAR2)) or (UPPER(ARTI_OBS) LIKE UPPER(:BUSCAR2))))) THEN
                                OK = 'N';
                            if ((OK = 'S') AND (BUSCAR3 <> '')) then
                                IF (NOT EXISTS (SELECT ARTI_COD FROM ARTICULO WHERE ARTI_COD = :CODIGO AND ((upper(ARTI_DES) like upper(:BUSCAR3)) or (UPPER(ARTI_OBS) LIKE UPPER(:BUSCAR3))))) THEN
                                    OK = 'N';
                            if ((OK = 'S') AND (BUSCAR4 <> '')) then
                                IF (NOT EXISTS (SELECT ARTI_COD FROM ARTICULO WHERE ARTI_COD = :CODIGO AND ((upper(ARTI_DES) like upper(:BUSCAR4)) or (UPPER(ARTI_OBS) LIKE UPPER(:BUSCAR4))))) THEN
                                    OK = 'N';
                            if ((OK = 'S') AND (BUSCAR4 <> '')) then
                                IF (NOT EXISTS (SELECT ARTI_COD FROM ARTICULO WHERE ARTI_COD = :CODIGO AND ((upper(ARTI_DES) like upper(:BUSCAR4)) or (UPPER(ARTI_OBS) LIKE UPPER(:BUSCAR4))))) THEN
                                    OK = 'N';
                            if ((OK = 'S') AND (BUSCAR5 <> '')) then
                                IF (NOT EXISTS (SELECT ARTI_COD FROM ARTICULO WHERE ARTI_COD = :CODIGO AND ((upper(ARTI_DES) like upper(:BUSCAR5)) or (UPPER(ARTI_OBS) LIKE UPPER(:BUSCAR5))))) THEN
                                    OK = 'N';
                            if (OK = 'S') then
                                SUSPEND;
                            END
                        ELSE
                            SUSPEND;
                END
            end
    ELSE
        FOR select arti_cod, arti_des, grup_cod, arti_unidad, esar_cod, taiv_porc, arti_precio, marc_cod, arti_clase
            from articulo a, tarifa_iva t
            where a.taiv_cod = t.taiv_cod and substring(a.arti_cod from 1 FOR 2) <> '.t' and
            ((:INACTIVOS = 'S') or (esar_cod = 'A') or ((:INACTIVOS = 'C') AND (esar_cod = 'N')))
            INTO :CODIGO, :DES, :GRUPO, :UNIDAD, :ESTADO, :IVA, :PRECIO, :MARCA, :CLASE
            do
            begin
            select first 1 coba_cod from barras_articulo where arti_cod = :codigo into :ref;
            if (EXIST = 'SI') then
                BEGIN
                EXECUTE PROCEDURE saldo_total_inventario (:CODIGO, :FECHA) returning_values (:EXISTEN);
                if ((SINEXIST = 'SI') or (existen <> 0)) then
                    SUSPEND;
                END
            ELSE
                SUSPEND;
            end
END
^

SET TERM ; ^


delete from CONFIGURACION
WHERE (CONF_MODULO = 'INVENTARIO') AND (CONF_CATEGORIA = 'ARTICULOS') AND (CONF_PROPIEDAD = 'FORMA DE HACER LAS BUSQUEDAS DE ARTICULOS DE VARIAS PALABRAS');
commit work;



/* 20081224 CHEQUEO COSTOS ML EXISTENCIA CONSOLIDADA */
SET TERM ^ ;

CREATE OR ALTER PROCEDURE CHEQUEO_COSTOS(
    ARTICULO VARCHAR(20),
    FECHA DATE)
AS
DECLARE VARIABLE ID INTEGER;
DECLARE VARIABLE FECMV DATE;
DECLARE VARIABLE CANT NUMERIC(15,4);
DECLARE VARIABLE COSTO NUMERIC(18,2);
DECLARE VARIABLE ENTRADA CHAR(1);
DECLARE VARIABLE TIPO INTEGER;
begin
if (EXISTS (SELECT MVAR_CONS FROM MOVIMIENTO_ARTICULO WHERE ARTI_COD = :ARTICULO AND MVAR_FECHA >= :FECHA)) then
    BEGIN
    delete from costos where arti_cod = :ARTICULO AND COST_FECHA >= :FECHA;
    for select mvar_cons, mvar_fecha, mvar_cant, mvar_costo, mvar_entrada, mvar_tipodoc
        from movimiento_articulo WHERE ARTI_COD = :ARTICULO AND MVAR_FECHA >= :FECHA
        order by mvar_fecha, mvar_cons /* SE HACE ESTRICTAMENTE EN ORDEN DE FECHA Y REGISTRO, SI LO EDITAN CAMBIA EL ORDEN */
        into :id, :fecmv, :cant, :costo, :entrada, :tipo
        do
        if ((TIPO <> 13)) then
            EXECUTE PROCEDURE actualice_costo(:ARTICULO, :fecmv, :costo, :cant, :entrada, 'N', :id, :tipo);
    END
end
^

SET TERM ; ^

SET TERM ^ ;

ALTER TRIGGER MOVIMIENTO_ARTICULO_AD
AS
declare variable LOTE CHAR(1);
BEGIN
  /* INSERTE EL NUEVO LOTE */
  SELECT ARTI_EXIST
    FROM   ARTICULO
    WHERE  ARTICULO.ARTI_COD = OLD.ARTI_COD
    INTO :LOTE;
  /* BORRE LOS VIEJOS */
  if (old.mvar_tipodoc <> 13) then
      BEGIN
/*      EXECUTE PROCEDURE actualice_costo(old.arti_cod, old.mvar_fecha, old.mvar_costo, old.mvar_cant, old.mvar_entrada, 'S', OLD.mvar_cons, OLD.mvar_tipodoc);*/
      EXECUTE PROCEDURE chequeo_costos(old.arti_cod, old.mvar_fecha);
      END
  /* actualice existencias */
  if (old.mvar_entrada = 'S') then
    BEGIN
    execute procedure sume_existencia(old.arti_cod, old.bode_cod, old.mvar_fecha, old.mvar_cant, 'S');
    if (LOTE = 'L') then
        UPDATE LOTES
            set lote_saldo = lote_saldo - old.mvar_cant
            where (arti_cod = old.ARTI_COD) and (bode_cod = old.bode_cod) and (lote_nro = old.mvar_lote);
    END
  else
    BEGIN
    execute procedure reste_existencia(old.arti_cod, old.bode_cod, old.mvar_fecha, old.mvar_cant, 'S');
    if (LOTE = 'L') then
        UPDATE LOTES
            set lote_saldo = lote_saldo + old.mvar_cant
            where (arti_cod = old.ARTI_COD) and (bode_cod = old.bode_cod) and (lote_nro = old.mvar_lote);
    END
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER TRIGGER MOVIMIENTO_ARTICULO_AI
AS
declare variable EXISTE CHAR(1);
declare variable LOTE CHAR(1);
BEGIN
  /* INSERTE EL NUEVO LOTE */
  SELECT ARTI_EXIST FROM ARTICULO WHERE ARTICULO.ARTI_COD = NEW.ARTI_COD INTO :LOTE;
  /* ACTUALICE COSTOS cuando no es transferencia */
  if (new.mvar_tipodoc <> 13) then
      BEGIN
/*      EXECUTE PROCEDURE actualice_costo(new.arti_cod, new.mvar_fecha, new.mvar_costo, new.mvar_cant, new.mvar_entrada, 'N', new.mvar_cons, new.mvar_tipodoc);*/
      EXECUTE PROCEDURE chequeo_costos(NEW.arti_cod, NEW.mvar_fecha);
      END
  /* actualice existencias */
  if (new.mvar_entrada = 'S') then
    BEGIN
    execute procedure sume_existencia(new.arti_cod, new.bode_cod, new.mvar_fecha, new.mvar_cant, 'N');
    if (LOTE = 'L') then
        BEGIN
        if (NEW.MVAR_LOTE IS NULL) then
            EXCEPTION LOTE_OBLIGATORIO 'Debe especificar un número de lote para el articulo ' || new.arti_cod;
        ELSE
         BEGIN
         EXISTE = 'N';
         SELECT 'S' FROM LOTES WHERE ARTI_COD = NEW.ARTI_COD AND BODE_COD = NEW.bode_cod AND LOTE_NRO = new.mvar_lote INTO :EXISTE;
         if (EXISTE = 'S') then
            UPDATE LOTES
             set lote_saldo = lote_saldo + new.mvar_cant
              where (arti_cod = NEW.ARTI_COD) and (BODE_COD = NEW.bode_cod) and (lote_nro = new.mvar_lote);
         ELSE
            INSERT INTO LOTES (ARTI_COD, BODE_COD, LOTE_NRO, LOTE_FECHA, LOTE_CANT, LOTE_COSTO, LOTE_SALDO)
                VALUES (NEW.ARTI_COD, NEW.bode_cod, NEW.mvar_lote, NEW.mvar_fecha, NEW.mvar_cant, NEW.mvar_costo, NEW.mvar_cant);
         END
        END
    END
  else
    BEGIN
    execute procedure reste_existencia(new.arti_cod, new.bode_cod, new.mvar_fecha, new.mvar_cant, 'N');
    /* ACTUALICE LA EXISTENCIA DEL LOTE */
    if (LOTE = 'L') then
    if (NEW.mvar_lote IS NULL) then
        EXCEPTION LOTE_NEGATIVO 'Debe indicar un número de lote para el artículo ' || new.arti_cod;
    ELSE
        BEGIN
        /* Actualice el saldo historico del lote */
        EXISTE = 'N';
        SELECT 'S' FROM EXISTENCIA_LOTE WHERE LOTE_NRO = NEW.MVAR_LOTE AND EXLO_FECHA = NEW.MVAR_FECHA AND ARTI_COD = NEW.arti_cod AND BODE_COD = NEW.bode_cod INTO :EXISTE;
        if (EXISTE = 'S') then
            BEGIN
            UPDATE EXISTENCIA_LOTE
                SET EXLO_SAL = EXLO_SAL + NEW.mvar_cant
                WHERE LOTE_NRO = NEW.MVAR_LOTE AND EXLO_FECHA = NEW.MVAR_FECHA AND ARTI_COD = NEW.ARTI_COD AND BODE_COD = NEW.bode_cod;
            END
        ELSE
            BEGIN
            INSERT INTO EXISTENCIA_LOTE (ARTI_COD, BODE_COD, LOTE_NRO, EXLO_FECHA, EXLO_SAL)
                VALUES (NEW.ARTI_COD, NEW.bode_cod, NEW.MVAR_LOTE, NEW.MVAR_FECHA, NEW.MVAR_CANT);
            END
        UPDATE LOTES
            set lote_saldo = lote_saldo - new.mvar_cant
            where (arti_cod = NEW.ARTI_COD) and (BODE_COD = NEW.bode_cod) and (lote_nro = new.mvar_lote);
        END
    END
END
^

SET TERM ; ^

/* 20081224B STAND EN EXISTENCIAS */

SET TERM ^ ;

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

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER PROCEDURE EXISTENCIAS_DESDE_HASTA(
    FECHA DATE,
    ARTINI VARCHAR(20),
    ARTFIN VARCHAR(20),
    GRPINI VARCHAR(3),
    GRPFIN VARCHAR(3),
    BODINI VARCHAR(2),
    BODFIN VARCHAR(2),
    ORDEN CHAR(1),
    AGRUPA CHAR(1),
    DETALLE CHAR(1),
    RESERVA CHAR(1),
    ENPESO CHAR(1),
    SUCURSAL INTEGER)
RETURNS (
    CANT NUMERIC(18,4),
    COSTO NUMERIC(18,2),
    COSTO_LOTE NUMERIC(18,2),
    CODIGO VARCHAR(15),
    NOMBRE VARCHAR(60),
    UNIDAD VARCHAR(8),
    STAND VARCHAR(15),
    CODGRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    CODSUBG VARCHAR(3),
    NOMSUBG VARCHAR(30),
    CODMARC VARCHAR(3),
    NOMMARC VARCHAR(30),
    CODBOD VARCHAR(2),
    LOTE VARCHAR(15),
    NOMBOD VARCHAR(30),
    COSTOTOT NUMERIC(18,2),
    ULTCOSTO NUMERIC(18,2),
    FECHACOSTO DATE,
    CONSUMO NUMERIC(18,2),
    RESERVADO NUMERIC(18,4),
    ORDENADO NUMERIC(18,4),
    IVA NUMERIC(9,2),
    PESOUNIT NUMERIC(18,4),
    PESOTOTAL NUMERIC(18,4),
    CODBAR VARCHAR(20))
AS
declare variable exist char(1);
declare variable codini varchar(20);
declare variable codfin varchar(20);
declare variable desini varchar(20);
declare variable desfin varchar(20);
declare variable ordenc numeric(18,4);
declare variable pedido numeric(18,4);
declare variable ok char(1);
declare variable id integer;
declare variable item integer;
declare variable und varchar(8);
declare variable factor numeric(18,4);
declare variable cant2 numeric(18,4);
declare variable PEDAUTO CHAR(2);
BEGIN
if (ORDEN = 'C') then
    BEGIN
    CODINI = ARTINI;
    CODFIN = ARTFIN;
    DESINI = '';
    DESFIN = 'zz';
    END
ELSE
    BEGIN
    DESINI = ARTINI;
    DESFIN = ARTFIN;
    CODINI = '';
    CODFIN = 'zz';
    END
EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION', 'FACTURAS', 'GENERAR PEDIDO AUTOMATICAMENTE CON LA FACTURA') returning_values (pedauto);
if (DETALLE = 'B') then
  BEGIN
  FOR SELECT ARTI_COD, ARTI_DES, ARTI_UNIDAD, ARTI_EXIST, TAIV_PORC, A.GRUP_COD, A.SUBG_COD, A.MARC_COD, BODE_COD, BODE_NOM, ARTI_CONSUMO, ARTI_PESO/1000
      FROM ARTICULO A, BODEGA B, TARIFA_IVA T
      WHERE ARTI_COD >= :CODINI AND ARTI_COD <= :CODFIN AND ARTI_DES >= :DESINI AND ARTI_DES <= :DESFIN AND ESAR_COD <> 'I' AND BODE_COD >= :BODINI AND
      BODE_COD <= :BODFIN AND ((SUCU_ID = :SUCURSAL) or (:SUCURSAL = 0)) AND A.TAIV_COD = T.TAIV_COD
      INTO :CODIGO, :NOMBRE, :UNIDAD, :EXIST, :IVA, :CODGRUPO, :CODSUBG, :CODMARC, :CODBOD, :NOMBOD, :CONSUMO, :pesounit
      DO
        BEGIN
        OK = 'N';
        if (AGRUPA = 'G') then
            BEGIN
            if ((CODGRUPO >= GRPINI) AND (CODGRUPO <= GRPFIN)) then
                OK = 'S';
            end
        ELSE
            if (AGRUPA = 'M') then
                BEGIN
                if ((CODMARC >= GRPINI) AND (CODMARC <= GRPFIN)) then
                    OK = 'S';
                END
        if (OK = 'S') then
            BEGIN
            NOMGRUPO = '';
            NOMMARC = '';
            NOMSUBG = '';
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            SELECT MAX(COBA_COD) FROM BARRAS_ARTICULO WHERE ARTI_COD = :codigo AND COBA_UNIDAD = :unidad INTO :codbar;
            if (CODBAR IS NULL) then
                CODBAR = CODIGO;
            if (EXIST <> 'N') then
                BEGIN
                SELECT STAND_COD FROM STANDS WHERE ARTI_COD = :CODIGO AND BODE_COD = :CODBOD INTO :STAND;
                EXECUTE PROCEDURE SALDO_INICIAL_INVENTARIO(CODIGO, FECHA, :CODBOD) returning_values (CANT);
                EXECUTE PROCEDURE COSTO_PROMEDIO_UNIDAD(CODIGO, FECHA, UNIDAD) returning_values (COSTO);
                EXECUTE PROCEDURE ULTIMO_COSTO(CODIGO, FECHA, UNIDAD) returning_values (ULTCOSTO);
                SELECT MAX(MVAR_FECHA) FROM MOVIMIENTO_ARTICULO WHERE ARTI_COD = :CODIGO AND MVAR_ENTRADA = 'S' AND MVAR_FECHA <= :FECHA INTO :FECHACOSTO;
                COSTOTOT = :CANT * :COSTO;
                CONSUMO = CONSUMO * CANT;
                if (RESERVA = 'S') then
                    BEGIN
                    SELECT SUM(ORID_ENTREGAR)
                        FROM ORDENINVENTARIO_DETALLE OD, ordenes_inventario O
                        WHERE O.ORIN_ID = OD.ORIN_ID AND ARTI_COD = :CODIGO AND ORIN_FECHA <= :FECHA AND ORIN_FECLLEGA >= :FECHA AND ORID_ANULADO = 'N' AND OD.BODE_COD = :CODBOD
                        INTO :ORDENADO;
                    if (ORDENADO IS NULL) then
                        ORDENADO = 0;
                    ORDENC = 0;
                    FOR SELECT O.ORDC_ID, OCDE_ITEM, OCDE_CANT * OCDE_FACTOR
                        FROM ORDENES_COMPRA O, ORDENES_COMPRA_DETALLE OD
                        WHERE O.ORDC_ID = OD.ORDC_ID AND OD.ARTI_COD = :CODIGO AND (ORDC_FECHA+ORDC_VALIDEZ) >= :FECHA AND ORDC_FECHA <= :FECHA AND OCDE_ANULADO = 'N' AND OD.BODE_COD = :CODBOD
                        INTO :ID, :ITEM, :CANT2
                        do
                        BEGIN
                        EXECUTE PROCEDURE FALTANTE(23, 21, ID, ITEM) returning_values (PEDIDO, UND, FACTOR);
                        if (PEDIDO * FACTOR = CANT2) then /* SI NO SE HA FACTURADO MIRE A VER SI SE REMISIONO */
                            EXECUTE PROCEDURE FALTANTE(23, 22, ID, ITEM) returning_values (PEDIDO, UND, FACTOR);
                        if (PEDIDO IS NULL) then
                            PEDIDO = 0;
                        ORDENC = ORDENC + PEDIDO * FACTOR;
                        END
                    ORDENADO = ORDENADO + ORDENC;
                    SELECT SUM(RSDE_LIBERAR)
                        FROM RESERVAS_DETALLE RD, RESERVAS R
                        WHERE R.RESE_ID = RD.RESE_ID AND ARTI_COD = :CODIGO AND RESE_FECHA <= :FECHA AND RESE_VENCE >= :FECHA AND RD.BODE_COD = :CODBOD AND RSDE_ANULADO = 'N'
                        INTO :RESERVADO;
                    if (RESERVADO IS NULL) then
                        RESERVADO = 0;
                    PEDIDO = 0;
                    FOR SELECT P.PEDI_ID, PEDE_ITEM, PEDE_CANT * PEDE_FACTOR
                        FROM PEDIDOS P, PEDIDOS_DETALLE PD
                        WHERE P.PEDI_ID = PD.PEDI_ID AND PD.ARTI_COD = :CODIGO AND (PEDI_FECHA+PEDI_VALIDEZ) >= :FECHA AND PEDI_FECHA <= :FECHA AND PEDE_ANULADO = 'N' AND BODE_COD = :CODBOD
                        INTO :ID, :ITEM, :CANT2
                        do
                        BEGIN
                        EXECUTE PROCEDURE FALTANTE(34, 31, ID, ITEM) returning_values (ORDENC, UND, FACTOR);
                        if ((ORDENC * FACTOR = CANT2) or (PEDAUTO = 'SI')) then /* SI NO SE HA FACTURADO MIRE A VER SI SE REMISIONO */
                            EXECUTE PROCEDURE FALTANTE(34, 32, ID, ITEM) returning_values (ORDENC, UND, FACTOR);
                        if (ORDENC IS NULL) then
                            ORDENC = 0;
                        PEDIDO = PEDIDO + ORDENC * FACTOR;
                        END
                    RESERVADO = RESERVADO + PEDIDO;
                    END
                ELSE
                    BEGIN
                    RESERVADO = 0;
                    ORDENADO = 0;
                    END
                if (ENPESO = 'S') then
                    BEGIN
                    if (pesounit IS NULL) then
                        pesounit = 0;
                    if (PESOUNIT <> 0) then
                        BEGIN
                        pesototal = PESOUNIT * cant;
                        SUSPEND;
                        END
                    END
                ELSE
                    SUSPEND;
                END
            END
        END
  END

if (DETALLE = 'L') then
  BEGIN
  FOR SELECT A.ARTI_COD, ARTI_DES, ARTI_UNIDAD, ARTI_EXIST, TAIV_PORC, A.GRUP_COD, A.SUBG_COD, A.MARC_COD, L.lote_nro, L.lote_nro||' - '||L.lote_vence, ARTI_CONSUMO,l.bode_cod, L.lote_saldo,l.lote_costo, ARTI_PESO/1000
      FROM ARTICULO A, LOTES l, TARIFA_IVA T
      WHERE A.ARTI_COD >= '0' AND A.ARTI_COD <= 'zz' AND ARTI_DES >= '' AND ARTI_DES <= 'zz' AND ESAR_COD <> 'I' AND A.TAIV_COD = T.TAIV_COD and a.arti_cod = l.arti_cod
      INTO :CODIGO, :NOMBRE, :UNIDAD, :EXIST, :IVA, :CODGRUPO, :CODSUBG, :CODMARC, :LOTE, :NOMBOD, :CONSUMO, :codbod, :cant, :costo_lote, :pesounit
      DO
        BEGIN
        OK = 'N';
        if (AGRUPA = 'G') then
            BEGIN
            if ((CODGRUPO >= GRPINI) AND (CODGRUPO <= GRPFIN)) then
                OK = 'S';
            end
        ELSE
            if (AGRUPA = 'M') then
                BEGIN
                if ((CODMARC >= GRPINI) AND (CODMARC <= GRPFIN)) then
                    OK = 'S';
                END
        if (OK = 'S') then
            BEGIN
            NOMGRUPO = '';
            NOMMARC = '';
            NOMSUBG = '';
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            SELECT MAX(COBA_COD) FROM BARRAS_ARTICULO WHERE ARTI_COD = :codigo AND COBA_UNIDAD = :unidad INTO :codbar;
            if (CODBAR IS NULL) then
                CODBAR = CODIGO;

            if (EXIST <> 'N') then
                BEGIN
                EXECUTE PROCEDURE COSTO_PROMEDIO_UNIDAD(CODIGO, FECHA, UNIDAD) returning_values (COSTO);
                EXECUTE PROCEDURE ULTIMO_COSTO(CODIGO, FECHA, UNIDAD) returning_values (ULTCOSTO);
                SELECT MAX(MVAR_FECHA) FROM MOVIMIENTO_ARTICULO WHERE ARTI_COD = :CODIGO AND MVAR_ENTRADA = 'S' AND MVAR_FECHA <= :FECHA INTO :FECHACOSTO;
                COSTOTOT = :CANT * :COSTO;
                CONSUMO = CONSUMO * CANT;
                if (RESERVA = 'S') then
                    BEGIN
                    SELECT SUM(ORID_ENTREGAR)
                        FROM ORDENINVENTARIO_DETALLE OD, ordenes_inventario O
                        WHERE O.ORIN_ID = OD.ORIN_ID AND ARTI_COD = :CODIGO AND ORIN_FECHA <= :FECHA AND ORIN_FECLLEGA >= :FECHA AND ORID_ANULADO = 'N'
                        INTO :ORDENADO;
                    if (ORDENADO IS NULL) then
                        ORDENADO = 0;
                    ORDENC = 0;
                    FOR SELECT O.ORDC_ID, OCDE_ITEM, OCDE_CANT * OCDE_FACTOR
                        FROM ORDENES_COMPRA O, ORDENES_COMPRA_DETALLE OD
                        WHERE O.ORDC_ID = OD.ORDC_ID AND OD.ARTI_COD = :CODIGO AND (ORDC_FECHA+ORDC_VALIDEZ) >= :FECHA AND ORDC_FECHA <= :FECHA AND OCDE_ANULADO = 'N'
                        INTO :ID, :ITEM, :CANT2
                        do
                        BEGIN
                        EXECUTE PROCEDURE FALTANTE(23, 21, ID, ITEM) returning_values (PEDIDO, UND, FACTOR);
                        if (PEDIDO * FACTOR = CANT2) then /* SI NO SE HA FACTURADO MIRE A VER SI SE REMISIONO */
                            EXECUTE PROCEDURE FALTANTE(23, 22, ID, ITEM) returning_values (PEDIDO, UND, FACTOR);
                        if (PEDIDO IS NULL) then
                            PEDIDO = 0;
                        ORDENC = ORDENC + PEDIDO * FACTOR;
                        END
                    ORDENADO = ORDENADO + ORDENC;
                    SELECT SUM(RSDE_LIBERAR)
                        FROM RESERVAS_DETALLE RD, RESERVAS R
                        WHERE R.RESE_ID = RD.RESE_ID AND ARTI_COD = :CODIGO AND RESE_FECHA <= :FECHA AND RESE_VENCE >= :FECHA AND RSDE_ANULADO = 'N'
                        INTO :RESERVADO;
                    if (RESERVADO IS NULL) then
                        RESERVADO = 0;
                    PEDIDO = 0;
                    FOR SELECT P.PEDI_ID, PEDE_ITEM, PEDE_CANT * PEDE_FACTOR
                        FROM PEDIDOS P, PEDIDOS_DETALLE PD
                        WHERE P.PEDI_ID = PD.PEDI_ID AND PD.ARTI_COD = :CODIGO AND (PEDI_FECHA+PEDI_VALIDEZ) >= :FECHA AND PEDI_FECHA <= :FECHA AND PEDE_ANULADO = 'N'
                        INTO :ID, :ITEM, :CANT2
                        do
                        BEGIN
                        EXECUTE PROCEDURE FALTANTE(34, 31, ID, ITEM) returning_values (ORDENC, UND, FACTOR);
                        if ((ORDENC * FACTOR = CANT2) or (PEDAUTO = 'SI')) then /* SI NO SE HA FACTURADO MIRE A VER SI SE REMISIONO */
                            EXECUTE PROCEDURE FALTANTE(34, 32, ID, ITEM) returning_values (ORDENC, UND, FACTOR);
                        if (ORDENC IS NULL) then
                            ORDENC = 0;
                        PEDIDO = PEDIDO + ORDENC * FACTOR;
                        END
                    RESERVADO = RESERVADO + PEDIDO;
                    END
                ELSE
                    BEGIN
                    RESERVADO = 0;
                    ORDENADO = 0;
                    END
                if (ENPESO = 'S') then
                    BEGIN
                    if (pesounit IS NULL) then
                        pesounit = 0;
                    if (PESOUNIT <> 0) then
                        BEGIN
                        pesototal = PESOUNIT * cant;
                        SUSPEND;
                        END
                    END
                ELSE
                    SUSPEND;
                END
            END
        END
  end
if (DETALLE = 'N') then
  BEGIN
  FOR SELECT ARTI_COD, ARTI_DES, ARTI_UNIDAD, ARTI_EXIST, TAIV_PORC, A.GRUP_COD, A.SUBG_COD, A.MARC_COD, ARTI_CONSUMO, ARTI_PESO/1000
      FROM ARTICULO A, TARIFA_IVA T
      WHERE ARTI_COD >= :CODINI AND ARTI_COD <= :CODFIN AND ARTI_DES >= :DESINI AND ARTI_DES <= :DESFIN AND ESAR_COD <> 'I' AND A.TAIV_COD = T.TAIV_COD
      INTO :CODIGO, :NOMBRE, :UNIDAD, :EXIST, :IVA, :CODGRUPO, :CODSUBG, :CODMARC, :CONSUMO, :pesounit
      DO
        BEGIN
        OK = 'N';
        if (AGRUPA = 'G') then
            BEGIN
            if ((GRPINI = '0') AND (GRPFIN = 'zz')) then
                OK = 'S';
            else
                if ((CODGRUPO >= GRPINI) AND (CODGRUPO <= GRPFIN)) then
                    OK = 'S';
            end
        ELSE
            if (AGRUPA = 'M') then
                BEGIN
                if ((GRPINI = '0') AND (GRPFIN = 'zzz')) then
                    OK = 'S';
                else
                    if ((CODMARC >= GRPINI) AND (CODMARC <= GRPFIN)) then
                        OK = 'S';
                END
        if (OK = 'S') then
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            SELECT MAX(COBA_COD) FROM BARRAS_ARTICULO WHERE ARTI_COD = :codigo AND COBA_UNIDAD = :unidad INTO :codbar;
            if (CODBAR IS NULL) then
                CODBAR = CODIGO;

            if (EXIST <> 'N') then
                BEGIN
                EXECUTE PROCEDURE SALDO_INICIAL_TOTAL_INV(CODIGO, FECHA) returning_values (CANT);
                EXECUTE PROCEDURE COSTO_PROMEDIO_UNIDAD(CODIGO, FECHA, UNIDAD) returning_values (COSTO);
                EXECUTE PROCEDURE ULTIMO_COSTO(CODIGO, FECHA, UNIDAD) returning_values (ULTCOSTO);
                SELECT MAX(MVAR_FECHA) FROM MOVIMIENTO_ARTICULO WHERE ARTI_COD = :CODIGO AND MVAR_ENTRADA = 'S' AND MVAR_FECHA <= :FECHA INTO :FECHACOSTO;
                COSTOTOT = :CANT * :COSTO;
                CONSUMO = CONSUMO * CANT;
                if (RESERVA = 'S') then
                    BEGIN
                    SELECT SUM(ORID_ENTREGAR)
                        FROM ORDENINVENTARIO_DETALLE OD, ordenes_inventario O
                        WHERE O.ORIN_ID = OD.ORIN_ID AND ARTI_COD = :CODIGO AND ORIN_FECHA <= :FECHA AND ORIN_FECLLEGA >= :FECHA AND ORID_ANULADO = 'N'
                        INTO :ORDENADO;
                        if (ORDENADO IS NULL) then
                            ORDENADO = 0;
                    ORDENC = 0;
                    FOR SELECT O.ORDC_ID, OCDE_ITEM, OCDE_CANT * OCDE_FACTOR
                        FROM ORDENES_COMPRA O, ORDENES_COMPRA_DETALLE OD
                        WHERE O.ORDC_ID = OD.ORDC_ID AND OD.ARTI_COD = :CODIGO AND (ORDC_FECHA+ORDC_VALIDEZ) >= :FECHA AND ORDC_FECHA <= :FECHA AND OCDE_ANULADO = 'N'
                        INTO :ID, :ITEM, :CANT2
                        do
                        BEGIN
                        EXECUTE PROCEDURE FALTANTE(23, 21, ID, ITEM) returning_values (PEDIDO, UND, FACTOR);
                        if (PEDIDO * FACTOR = CANT2) then /* SI NO SE HA FACTURADO MIRE A VER SI SE REMISIONO */
                            EXECUTE PROCEDURE FALTANTE(23, 22, ID, ITEM) returning_values (PEDIDO, UND, FACTOR);
                        if (PEDIDO IS NULL) then
                            PEDIDO = 0;
                        ORDENC = ORDENC + PEDIDO * FACTOR;
                        END
                    ORDENADO = ORDENADO + ORDENC;
                    SELECT SUM(RSDE_LIBERAR)
                        FROM RESERVAS_DETALLE RD, RESERVAS R
                        WHERE R.RESE_ID = RD.RESE_ID AND ARTI_COD = :CODIGO AND RESE_FECHA <= :FECHA AND RESE_VENCE >= :FECHA AND RSDE_ANULADO = 'N'
                        INTO :RESERVADO;
                    if (RESERVADO IS NULL) then
                        RESERVADO = 0;
                    PEDIDO = 0;
                    FOR SELECT P.PEDI_ID, PEDE_ITEM, PEDE_CANT * PEDE_FACTOR
                        FROM PEDIDOS P, PEDIDOS_DETALLE PD, PUNTO_VENTA PT
                        WHERE P.PEDI_ID = PD.PEDI_ID AND PD.ARTI_COD = :CODIGO AND PT.ptvt_id = P.PTVT_ID AND (PEDI_FECHA+PEDI_VALIDEZ) >= :FECHA AND PEDI_FECHA <= :FECHA AND PEDE_ANULADO = 'N'
                        INTO :ID, :ITEM, :CANT2
                        do
                        BEGIN
                        EXECUTE PROCEDURE FALTANTE(34, 31, ID, ITEM) returning_values (ORDENC, UND, FACTOR);
                        if ((ORDENC * FACTOR = CANT2) or (PEDAUTO = 'SI')) then /* SI NO SE HA FACTURADO MIRE A VER SI SE REMISIONO */
                            EXECUTE PROCEDURE FALTANTE(34, 32, ID, ITEM) returning_values (ORDENC, UND, FACTOR);
                        if (ORDENC IS NULL) then
                            ORDENC = 0;
                        PEDIDO = PEDIDO + ORDENC * FACTOR;
                        END
                    if (PEDIDO IS NULL) then
                        PEDIDO = 0;
                    RESERVADO = RESERVADO + PEDIDO;
                    END
                ELSE
                    BEGIN
                    RESERVADO = 0;
                    ORDENADO = 0;
                    END
                if (ENPESO = 'S') then
                    BEGIN
                    if (pesounit IS NULL) then
                        pesounit = 0;
                    if (PESOUNIT <> 0) then
                        BEGIN
                        pesototal = PESOUNIT * cant;
                        SUSPEND;
                        END
                    END
                ELSE
                    SUSPEND;
                END
            END
        END
  END
END
^

SET TERM ; ^


/* 20081224C  repetia el ultimo registro */
SET TERM ^ ;

CREATE OR ALTER PROCEDURE IMPR_RECICAJA(
    ID INTEGER)
RETURNS (
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    NOMCAJA VARCHAR(60),
    CODCOBR INTEGER,
    NOMCOBR VARCHAR(60),
    NIT VARCHAR(20),
    NOMBRE VARCHAR(60),
    DIR VARCHAR(60),
    CIU VARCHAR(40),
    TEL VARCHAR(40),
    CONCEPTO VARCHAR(60),
    MONTO NUMERIC(18,2),
    RTFTE NUMERIC(18,2),
    RTIVA NUMERIC(18,2),
    RTICA NUMERIC(18,2),
    DSCTO NUMERIC(18,2),
    OBS BLOB SUB_TYPE 1 SEGMENT SIZE 80,
    ITEMDOC INTEGER,
    TIPODOC VARCHAR(8),
    PREFDOC VARCHAR(4),
    NUMDOC VARCHAR(6),
    SUCURSAL VARCHAR(10),
    ABONODOC NUMERIC(18,2),
    RTFTEDOC NUMERIC(18,2),
    RTIVADOC NUMERIC(18,2),
    RTICADOC NUMERIC(18,2),
    DSCTODOC NUMERIC(18,2),
    SALDODOC NUMERIC(18,2),
    ANTERDOC NUMERIC(18,2))
AS
declare variable NUMROWS INTEGER;
declare variable TIPO integer;
declare variable IDDOC INTEGER;
BEGIN
  SELECT PREF_PRE, RECA_NUMERO, RECA_FECHA, CAJA_NOMBRE, RECA_CONC, R.COBR_COD,
        R.TERC_NIT, RECA_NOMTERC, TERC_DIR, TERC_CIU, TERC_TEL,
        RECA_MONTO, RECA_RTFTEMONTO, RECA_RTIVAMONTO, RECA_RTICAMONTO, RECA_DTOF,
        RECA_OBS
  FROM RECIBOS_CAJA R, TERCEROS T, CAJAS C
  WHERE R.TERC_NIT = T.TERC_NIT AND R.CAJA_ID = C.CAJA_ID AND
        R.RECA_ID = :ID
  INTO :PREFIJO, :NUMERO, :FECHA, :NOMCAJA, :CONCEPTO, :CODCOBR,
        :NIT, :NOMBRE, :DIR, :CIU, :TEL,
        :MONTO, :RTFTE, :RTIVA, :RTICA, :DSCTO,
        :OBS;
  SELECT COBR_NOM FROM COBRADORES WHERE COBR_COD = :CODCOBR INTO :NOMCOBR;
  SELECT COUNT(RCDE_ITEM) FROM RECIBOS_CAJA_DETALLE
    WHERE RECA_ID = :ID INTO :NUMROWS;
  if (NUMROWS > 0) then
    FOR SELECT RCDE_ITEM, RCDE_TIPODOC, RCDE_IDDOC, TIDO_NOMCORTO, RCDE_PREFIJO, RCDE_NUMERO,
        RCDE_ABONO, RCDE_RTFTE, RCDE_RTIVA, RCDE_RTICA, RCDE_DTOF, RCDE_SUCURSAL
        FROM RECIBOS_CAJA_DETALLE D, TIPO_DOCUMENTO TD
        WHERE D.RECA_ID = :ID AND TD.TIDO_COD = D.RCDE_TIPODOC
        ORDER BY RCDE_ITEM
        INTO :ITEMDOC, :TIPO, :IDDOC, :TIPODOC, :PREFDOC, :NUMDOC, :ABONODOC, :RTFTEDOC, :RTIVADOC, :RTICADOC, :DSCTODOC, :sucursal
        DO
            BEGIN
            EXECUTE PROCEDURE SALDO_DOC_CARTERA(:TIPO, :IDDOC, :FECHA, 0) returning_values (:SALDODOC);
            ANTERDOC = SALDODOC + RTFTEDOC + RTIVADOC + RTICADOC + ABONODOC + DSCTODOC;
            SUSPEND;
            END
  ELSE
    SUSPEND;
END
^

SET TERM ; ^



/* 20081226 */
ALTER TABLE CAJAS
ADD CAJA_ACTIVA T_BOOLEANO;

update cajas set caja_Activa = 'S' where caja_activa is null;
commit work;

/* VALIDE EL CUPO SOBRE EL TOTAL MENOS LO RECIBIDO */
SET TERM ^ ;

CREATE OR ALTER TRIGGER FACTURAS_BI FOR FACTURAS
ACTIVE BEFORE INSERT POSITION 0
AS
declare variable NUMERO VARCHAR(6);
declare variable AUTOM CHAR(1);
declare variable EXISTE CHAR(1);
DECLARE VARIABLE VALCUPO CHAR(10);
declare variable DISPONIBLE NUMERIC(18,2);
declare variable OK CHAR(1);
declare variable SITOT CHAR(2);
declare variable CODCOBR INTEGER;
declare variable CODVEND INTEGER;
declare variable contado char(1);
declare variable BLOQAUTO CHAR(2);
declare variable FECCONTA VARCHAR(8);
declare variable FECBLO VARCHAR(8);
declare variable FECSERVER CHAR(2);
declare variable PREGTASA CHAR(2);
BEGIN
EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION', 'DOCUMENTOS', 'INHABILITAR FECHA EN DOCUMENTOS') returning_values (:fecserver);
if (FECSERVER = 'SI') then
    NEW.fact_fecha = CAST ('NOW' AS DATE);
/* doble moneda */
if ((NEW.fact_trm IS NULL) or (NEW.fact_trm = 0)) then
    NEW.fact_trm = 1;
EXECUTE PROCEDURE LEE_CONFIGURACION('GENERAL', 'GENERAL', 'PREGUNTAR TASA DE CAMBIO EN DOCUMENTOS DE CARTERA') returning_values (:pregtasa);
if (PREGTASA = 'SI') then
    BEGIN
    NEW.fact_dtomonto = NEW.fact_dtomonto * NEW.fact_trm;
    NEW.fact_comimonto = NEW.fact_comimonto * NEW.fact_trm;
    NEW.fact_adicional = NEW.fact_adicional * NEW.fact_trm;
    NEW.fact_ivamonto = NEW.fact_ivamonto * NEW.fact_trm;
    NEW.fact_rtftemonto = NEW.fact_rtftemonto * NEW.fact_trm;
    NEW.fact_rtivamonto = NEW.fact_rtivamonto * NEW.fact_trm;
    NEW.fact_rticamonto = NEW.fact_rticamonto * NEW.fact_trm;
    NEW.fact_extra = NEW.fact_extra * NEW.fact_trm;
    NEW.fact_dtofmonto = NEW.fact_dtofmonto * NEW.fact_trm;
    NEW.fact_total = NEW.fact_total * NEW.fact_trm;
    NEW.fact_dtoit1 = NEW.fact_dtoit1 * NEW.fact_trm;
    NEW.fact_dtoit2 = NEW.fact_dtoit2 * NEW.fact_trm;
    NEW.fact_dtoit3 = NEW.fact_dtoit3 * NEW.fact_trm;
    END
EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION', 'POS', 'CAMBIAR FECHA DE BLOQUEO AUTOMATICAMENTE AL CAMBIAR FECHA DE LA FACTURA') RETURNING_VALUES (:bloqauto);
if (bloqauto = 'SI') then
    BEGIN
    EXECUTE PROCEDURE LEE_CONFIGURACION ('CONTABILIDAD', 'GENERAL', 'FECHA DE BLOQUEO') RETURNING_VALUES (:FECBLO);
    EXECUTE PROCEDURE fecha_a_conta (NEW.fact_fecha) returning_values (:FECCONTA);
    if (FECBLO > FECCONTA) then
        EXCEPTION CONTABILIDAD_BLOQUEADA 'La contabilidad esta bloqueada a ' || :fecblo;
    if (FECBLO < FECCONTA) then
        UPDATE CONFIGURACION
            SET CONF_VALOR = :FECCONTA
            WHERE (CONF_MODULO = 'CONTABILIDAD') AND (CONF_CATEGORIA = 'GENERAL') AND (CONF_PROPIEDAD = 'FECHA DE BLOQUEO');
    END
OK = 'S';
EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'ACCION A TOMAR SI EL CUPO DE CREDITO ES INSUFICIENTE') RETURNING_VALUES (:VALCUPO);
select auto_contado from autorizaciones where pref_pre = new.pref_pre and tido_cod = 31 into :contado;
if (contado='N') then
BEGIN
  IF (VALCUPO = 'PROHIBIR') THEN
  BEGIN
  OK = 'N';
  /* VERIFIQUE EL CUPO DE CREDITO */
  execute procedure cupo_disponible(new.TERC_NIT, NEW.fact_fecha, NEW.fact_sucursal) returning_values (:DISPONIBLE);
  if (DISPONIBLE >= (NEW.FACT_TOTAL-NEW.fact_recibido)) then
    OK = 'S';
  END
END
IF (OK = 'S') THEN
  begin
  /* calcule la comision */
  EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION', 'VENDEDORES', 'COMISIONES EN VENTA INCLUYENDO IMPUESTOS') returning_values (:SITOT);
  if ((NEW.fact_comiporc IS NULL) or (NEW.fact_comiporc = 0)) THEN
    BEGIN
    if (SITOT = 'SI') then
      SELECT MAX(COMI_PORC) FROM comisiones WHERE VEND_COD = NEW.vend_cod AND
        COMI_INICIAL <= NEW.fact_total AND COMI_FINAL >= NEW.fact_total
        INTO NEW.fact_comiporc;
    else
      SELECT MAX(COMI_PORC) FROM comisiones WHERE VEND_COD = NEW.vend_cod AND
        COMI_INICIAL <= (NEW.fact_total -NEW.fact_ivamonto) AND COMI_FINAL >= (NEW.fact_total -NEW.fact_ivamonto)
        INTO NEW.fact_comiporc;
    if (NEW.fact_comiporc IS NULL) then
        NEW.fact_comiporc = 0;
    END
  if (SITOT = 'SI') then
      NEW.fact_comimonto = NEW.fact_total * NEW.fact_comiporc / 100;
  ELSE
      NEW.fact_comimonto = (NEW.fact_total -NEW.fact_ivamonto) * NEW.fact_comiporc / 100;

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

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

SET TERM ; ^

/* 20081227 REVISION DE TRM = 0 */

SET TERM ^ ;

CREATE OR ALTER TRIGGER RECIBOS_CAJA_BI FOR RECIBOS_CAJA
ACTIVE BEFORE INSERT POSITION 0
AS
declare variable NUMERO VARCHAR(6);
declare variable AUTOM CHAR(1);
declare variable EXISTE CHAR(1);
BEGIN
if ((NEW.reca_trm IS NULL) or (new.reca_trm = 0))  then
    NEW.reca_trm = 1;
if (NEW.numok = 'N') then
  BEGIN
  /* Actualice el contador del prefijo */
  SELECT PREF_ACTUAL, PREF_AUTO FROM PREFIJOS WHERE TIDO_COD = 61 AND PREF_PRE = NEW.PREF_PRE INTO :NUMERO, :AUTOM;
  /* ACTUALICE EL NUMERO EN EL_ENCABEZADO  */
  if (AUTOM = 'S') then
    BEGIN
    NEW.RECA_NUMERO = NUMERO;
    NUMERO = CAST((CAST(NUMERO AS INTEGER) + 1) AS CHAR(6));
    UPDATE PREFIJOS
      SET PREF_ACTUAL = :NUMERO
    WHERE TIDO_COD = 61 AND PREF_PRE = NEW.PREF_PRE;
    END
  ELSE
    BEGIN
    if (CAST(NUMERO AS INTEGER) = CAST(NEW.RECA_NUMERO AS INTEGER)) then
        UPDATE PREFIJOS
          SET PREF_ACTUAL = CAST((CAST(PREF_ACTUAL AS INTEGER) + 1) AS CHAR(6))
        WHERE TIDO_COD = 61 AND PREF_PRE = NEW.PREF_PRE;
    END
  EXECUTE PROCEDURE COMPLETA_CEROS (NEW.RECA_numero) returning_values (NEW.RECA_numero);
  NEW.numok = 'S';
  END
/* Verifique que el numero no existe previamente */
EXISTE = 'N';
SELECT 'S' FROM RECIBOS_CAJA WHERE PREF_PRE = NEW.PREF_PRE AND RECA_NUMERO = NEW.RECA_NUMERO INTO :EXISTE;
if (EXISTE = 'S') then
    EXCEPTION DOCUMENTO_REGISTRADO 'Ya existe un recibo de caja con el número ' || new.pref_pre || new.reca_numero;
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER RECIBO_PROVISIONAL_BI FOR RECIBO_PROVISIONAL
ACTIVE BEFORE INSERT POSITION 0
AS
declare variable NUMERO VARCHAR(6);
declare variable AUTOM CHAR(1);
declare variable EXISTE CHAR(1);
BEGIN
if (new.rcpr_idcruce is null) then
    new.rcpr_idcruce = 0;
if ((NEW.rcpr_trm IS NULL) or (new.rcpr_trm = 0))  then
    NEW.rcpr_trm = 1;
if (NEW.numok = 'N') then
  BEGIN
  /* Actualice el contador del prefijo */
  SELECT PREF_ACTUAL, PREF_AUTO FROM PREFIJOS WHERE TIDO_COD = 65 AND PREF_PRE = NEW.PREF_PRE INTO :NUMERO, :AUTOM;
  /* ACTUALICE EL NUMERO EN COMPROBANTE_ENCABEZADO  */
  if (AUTOM = 'S') then
    BEGIN
    NEW.RCPR_NUMERO = NUMERO;
    NUMERO = CAST((CAST(NUMERO AS INTEGER) + 1) AS CHAR(6));
    UPDATE PREFIJOS
      SET PREF_ACTUAL = :NUMERO
    WHERE TIDO_COD = 65 AND PREF_PRE = NEW.PREF_PRE;
    END
  ELSE
    BEGIN
    if (CAST(NUMERO AS INTEGER) = CAST(NEW.RCPR_NUMERO AS INTEGER)) then
        UPDATE PREFIJOS
          SET PREF_ACTUAL = CAST((CAST(PREF_ACTUAL AS INTEGER) + 1) AS CHAR(6))
        WHERE TIDO_COD = 65 AND PREF_PRE = NEW.PREF_PRE;
    END
  EXECUTE PROCEDURE COMPLETA_CEROS (NEW.RCPR_numero) returning_values (NEW.RCPR_numero);
  NEW.numok = 'S';
  END
/* Verifique que el numero no existe previamente */
EXISTE = 'N';
SELECT 'S' FROM RECIBO_PROVISIONAL WHERE PREF_PRE = NEW.PREF_PRE AND RCPR_NUMERO = NEW.RCPR_NUMERO INTO :EXISTE;
if (EXISTE = 'S') then
    EXCEPTION DOCUMENTO_REGISTRADO 'Ya existe un recibo provisional con el número ' || new.pref_pre || new.rcpr_numero;
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER EGRESOS_BI FOR EGRESOS
ACTIVE BEFORE INSERT POSITION 0
AS
declare variable NUMERO VARCHAR(6);
declare variable AUTOM CHAR(1);
declare variable EXISTE CHAR(1);
BEGIN
if ((new.egre_trm is null) or (new.egre_trm = 0)) then
    new.egre_trm = 1;
if (NEW.numok = 'N') then
  BEGIN
  /* Actualice el contador del prefijo */
  SELECT PREF_ACTUAL, PREF_AUTO FROM PREFIJOS WHERE TIDO_COD = 62 AND PREF_PRE = NEW.PREF_PRE INTO :NUMERO, :AUTOM;
  /* ACTUALICE EL NUMERO EN COMPROBANTE_ENCABEZADO  */
  if (AUTOM = 'S') then
    BEGIN
    NEW.EGRE_NUMERO = NUMERO;
    NUMERO = CAST((CAST(NUMERO AS INTEGER) + 1) AS CHAR(6));
    UPDATE PREFIJOS
      SET PREF_ACTUAL = :NUMERO
    WHERE TIDO_COD = 62 AND PREF_PRE = NEW.PREF_PRE;
    END
  ELSE
    BEGIN
    if (CAST(NUMERO AS INTEGER) = CAST(NEW.EGRE_NUMERO AS INTEGER)) then
        UPDATE PREFIJOS
          SET PREF_ACTUAL = CAST((CAST(PREF_ACTUAL AS INTEGER) + 1) AS CHAR(6))
        WHERE TIDO_COD = 62 AND PREF_PRE = NEW.PREF_PRE;
    END
  EXECUTE PROCEDURE COMPLETA_CEROS (NEW.EGRE_numero) returning_values (NEW.EGRE_numero);
  NEW.numok = 'S';
  END
/* Verifique que el numero no existe previamente */
EXISTE = 'N';
SELECT 'S' FROM EGRESOS WHERE PREF_PRE = NEW.PREF_PRE AND EGRE_NUMERO = NEW.EGRE_NUMERO INTO :EXISTE;
if (EXISTE = 'S') then
    EXCEPTION DOCUMENTO_REGISTRADO 'Ya existe un egreso con el número ' || new.pref_pre || new.egre_numero;
if (new.cleg_id is null) then
    new.cleg_id = 0;
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER DEVOLUCIONES_COMPRAS_BI FOR DEVOLUCIONES_COMPRAS
ACTIVE BEFORE INSERT POSITION 0
AS
declare variable NUMERO VARCHAR(6);
declare variable AUTOM CHAR(1);
declare variable EXISTE CHAR(1);
declare variable pregtasa CHAR(2);
BEGIN
if (NEW.DVCO_SIMPLIFICADO IS NULL) then
    NEW.dvco_simplificado = 'N';
if (NEW.numok = 'N') then
  BEGIN
  /* Actualice el contador del prefijo */
  SELECT PREF_ACTUAL, PREF_AUTO FROM PREFIJOS WHERE TIDO_COD = 24 AND PREF_PRE = NEW.PREF_PRE INTO :NUMERO, :AUTOM;
  /* ACTUALICE EL NUMERO EN COMPROBANTE_ENCABEZADO  */
  if (AUTOM = 'S') then
    BEGIN
    NEW.dvco_numero = NUMERO;
    NUMERO = CAST((CAST(NUMERO AS INTEGER) + 1) AS CHAR(6));
    UPDATE PREFIJOS
      SET PREF_ACTUAL = :NUMERO
    WHERE TIDO_COD = 24 AND PREF_PRE = NEW.PREF_PRE;
    END
  ELSE
    BEGIN
    if (CAST(NUMERO AS INTEGER) = CAST(NEW.DVCO_NUMERO AS INTEGER)) then
        UPDATE PREFIJOS
          SET PREF_ACTUAL = CAST((CAST(PREF_ACTUAL AS INTEGER) + 1) AS CHAR(6))
        WHERE TIDO_COD = 24 AND PREF_PRE = NEW.PREF_PRE;
    END
  EXECUTE PROCEDURE COMPLETA_CEROS (NEW.dvco_numero) returning_values (NEW.dvco_numero);
  NEW.numok = 'S';
  END
/* Verifique que el numero no existe previamente */
EXISTE = 'N';
SELECT 'S' FROM DEVOLUCIONES_COMPRAS WHERE PREF_PRE = NEW.PREF_PRE AND DVCO_NUMERO = NEW.DVCO_NUMERO INTO :EXISTE;
if (EXISTE = 'S') then
    EXCEPTION DOCUMENTO_REGISTRADO 'Ya existe una devolución con el número ' || new.pref_pre || new.dvco_numero;
if ((new.dvco_trm is null) or (new.dvco_trm = 0))  then
    NEW.dvco_trm = 1;
EXECUTE PROCEDURE LEE_CONFIGURACION('GENERAL', 'GENERAL', 'PREGUNTAR TASA DE CAMBIO EN DOCUMENTOS DE CUENTAS POR PAGAR') returning_values (:pregtasa);
if (PREGTASA = 'SI') then
    BEGIN
    NEW.dvco_dtomonto = NEW.dvco_dtomonto * NEW.dvco_trm;
    NEW.dvco_adicional = NEW.dvco_adicional * NEW.dvco_trm;
    NEW.dvco_ivamonto = NEW.dvco_ivamonto * NEW.dvco_trm;
    NEW.dvco_extra = NEW.dvco_extra * NEW.dvco_trm;
    NEW.dvco_rtftemonto = NEW.dvco_rtftemonto * NEW.dvco_trm;
    NEW.dvco_rtivamonto = NEW.dvco_rtivamonto * NEW.dvco_trm;
    NEW.dvco_rticamonto = NEW.dvco_rticamonto * NEW.dvco_trm;
    NEW.dvco_total = NEW.dvco_total * NEW.dvco_trm;
    END
END
^

SET TERM ; ^


SET TERM ^ ;

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

SET TERM ; ^

SET TERM ^ ;

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

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

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

SET TERM ; ^

SET TERM ^ ;

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

SET TERM ; ^

SET TERM ^ ;

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

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER DEVOLUCION_CHEQUES_BI FOR DEVOLUCION_CHEQUES
ACTIVE BEFORE INSERT POSITION 0
AS
declare variable NUMERO VARCHAR(6);
declare variable AUTOM CHAR(1);
declare variable EXISTE CHAR(1);
declare variable POR_CTA CHAR(2);
declare variable CODCOBR INTEGER;
declare variable CODVEND INTEGER;
declare variable NUMROWS INTEGER;
declare variable PREGTASA CHAR(2);
BEGIN
if ((NEW.dvch_trm IS NULL) or (new.dvch_trm = 0)) then
    NEW.dvch_trm = 1;
EXECUTE PROCEDURE LEE_CONFIGURACION('GENERAL', 'GENERAL', 'PREGUNTAR TASA DE CAMBIO EN DOCUMENTOS DE CARTERA') returning_values (:pregtasa);
if (PREGTASA = 'SI') then
    NEW.dvch_monto = NEW.dvch_monto * NEW.dvch_trm;

if (NEW.numok = 'N') then
  BEGIN
  /* Actualice el contador del prefijo */
  EXECUTE PROCEDURE LEE_configuracion('BANCOS', 'DEVOLUCIONES', 'CONSECUTIVOS POR CUENTA') returning_values(:POR_CTA);
  if (por_cta = 'SI') then
    BEGIN
    SELECT PRBA_NUMERO, PRBA_AUTO FROM PREFIJOS_BANCOS
        WHERE TIDO_COD = 77 AND CUBA_COD = NEW.CUBA_COD AND PRBA_PREF = NEW.PRBA_PREF INTO :NUMERO, :AUTOM;
    if (AUTOM = 'S') then
        BEGIN
        NEW.DVCH_NUMDOC = NUMERO;
        NUMERO = CAST((CAST(NUMERO AS INTEGER) + 1) AS CHAR(6));
        UPDATE PREFIJOS_BANCOS
            SET PRBA_NUMERO = :NUMERO
            WHERE TIDO_COD = 77 AND CUBA_COD = NEW.CUBA_COD AND PRBA_PREF = NEW.PRBA_PREF;
        END
    ELSE
        BEGIN
        if (CAST(NUMERO AS INTEGER) = CAST(NEW.DVCH_NUMDOC AS INTEGER)) then
            UPDATE PREFIJOS_BANCOS
                SET PRBA_NUMERO = CAST((CAST(PRBA_NUMERO AS INTEGER) + 1) AS CHAR(6))
                WHERE TIDO_COD = 77 AND CUBA_COD = NEW.CUBA_COD AND PRBA_PREF = NEW.PRBA_PREF;
        END
    END
  ELSE
    BEGIN
    SELECT PREF_ACTUAL, PREF_AUTO FROM PREFIJOS
        WHERE TIDO_COD = 77 AND PREF_PRE = NEW.PRBA_PREF INTO :NUMERO, :AUTOM;
    if (AUTOM = 'S') then
        BEGIN
        NEW.DVCH_NUMDOC = NUMERO;
        NUMERO = CAST((CAST(NUMERO AS INTEGER) + 1) AS CHAR(6));
        UPDATE PREFIJOS
            SET PREF_ACTUAL = :NUMERO
            WHERE TIDO_COD = 77 AND PREF_PRE = NEW.PRBA_PREF;
        END
    ELSE
        BEGIN
        if (CAST(NUMERO AS INTEGER) = CAST(NEW.DVCH_NUMDOC AS INTEGER)) then
            UPDATE PREFIJOS
                SET PREF_ACTUAL = CAST((CAST(PREF_ACTUAL AS INTEGER) + 1) AS CHAR(6))
                WHERE TIDO_COD = 77 AND PREF_PRE = NEW.PRBA_PREF;
        END
    END
  /* ACTUALICE EL NUMERO EN COMPROBANTE_ENCABEZADO */
  EXECUTE PROCEDURE COMPLETA_CEROS (NEW.DVCH_NUMDOC) returning_values (NEW.DVCH_NUMDOC);
  NEW.numok = 'S';
  END
/* Verifique que el numero no existe previamente */
EXISTE = 'N';
if (POR_CTA = 'SI') then
    SELECT 'S' FROM DEVOLUCION_CHEQUES
        WHERE CUBA_COD = NEW.CUBA_COD AND PRBA_PREF = NEW.PRBA_PREF AND DVCH_NUMDOC = NEW.DVCH_NUMDOC INTO :EXISTE;
else
    SELECT 'S' FROM DEVOLUCION_CHEQUES
        WHERE PRBA_PREF = NEW.PRBA_PREF AND DVCH_NUMDOC = NEW.DVCH_NUMDOC INTO :EXISTE;
if (EXISTE = 'S') then
    EXCEPTION DOCUMENTO_REGISTRADO 'Ya existe una devolución de cheques con el número ' || new.prba_pref || new.dvch_numdoc;
/* SI ES A CARTERA AGREGE LOS DATOS DE VEND Y COBR */
if (NEW.dvch_cartera = 'S') then
    BEGIN
    select COBR_COD, VEND_COD FROM CLIENTES WHERE TERC_NIT = NEW.terc_nit INTO :CODCOBR, CODVEND;
    if (NEW.cobr_cod IS NULL) then
        NEW.cobr_cod = :CODCOBR;
    if (NEW.vend_cod IS NULL) then
        NEW.vend_cod = :CODVEND;
    END
/* NO PERMITA UNA FORMA DE PAGO REPETIDA */
SELECT COUNT(*) FROM documentos_pago_caja WHERE caja_id = NEW.caja_id AND fopa_id = 2 AND dpca_banco = NEW.dvch_banco AND
    dpca_cuenta = NEW.dvch_cuenta AND dpca_numero = NEW.dvch_nroch AND dpca_tiposal = 0 and dpca_idsal = 0
    INTO :NUMROWS;
if (numrows > 0) then
    exception documento_pago_salido 'No se encontró la forma de pago ' || new.dvch_banco || ' ' || new.dvch_cuenta || ' ' || new.dvch_nroch || ' en caja.';
END
^

SET TERM ; ^


/* 20081228  correo electronico desde consultas y reportes */
CREATE DOMAIN T_TELEFONO AS
VARCHAR(40) CHARACTER SET NONE COLLATE NONE;

INSERT INTO CONFIGURACION (CONF_MODULO, CONF_CATEGORIA, CONF_PROPIEDAD, CONF_VALOR, CONF_POSIBLES, CONF_AYUDA) VALUES ('GENERAL', 'GENERAL', 'CORREO ELECTRONICO CONTRASEÑA DEL SERVIDOR DE CORREO SALIENTE SMTP', 'clave', '', 'Indique la contraseña del usuario empleado para conectarse al servidor de correo electrónico saliente SMTP');
INSERT INTO CONFIGURACION (CONF_MODULO, CONF_CATEGORIA, CONF_PROPIEDAD, CONF_VALOR, CONF_POSIBLES, CONF_AYUDA) VALUES ('GENERAL', 'GENERAL', 'CORREO ELECTRONICO NOMBRE DEL USUARIO DE CORREO SALIENTE SMTP', 'usuario', '', 'Indique el nombre de usuario empleado para conectarse al servidor de correo electronico saliente SMTP');
INSERT INTO CONFIGURACION (CONF_MODULO, CONF_CATEGORIA, CONF_PROPIEDAD, CONF_VALOR, CONF_POSIBLES, CONF_AYUDA) VALUES ('GENERAL', 'GENERAL', 'CORREO ELECTRONICO SERVIDOR DE CORREO SALIENTE (SMTP)', 'correo.etb.net.co', '', 'Indique la dirección completa del servidor de correo electrónico saliente SMTP');
COMMIT WORK;

ALTER TABLE USUARIO
ADD USER_EMAIL VARCHAR(100);

CREATE TABLE REPORTES_MENSAJE (
    REPM_ID INTEGER NOT NULL,
    REPM_MENSAJE BLOB SUB_TYPE 1 SEGMENT SIZE 80);
alter table REPORTES_MENSAJE
add constraint PK_REPORTES_MENSAJE
primary key (REPM_ID);

CREATE TABLE TERCEROS_CONTACTOS (
    TERC_NIT T_NIT NOT NULL,
    TECC_ITEM T_ID NOT NULL,
    TECC_NOMBRE T_CONCEPTO,
    TECC_CARGO T_CONCEPTO,
    TECC_TELEFONOS T_TELEFONO,
    TECC_EMAIL VARCHAR(100),
    TECC_FAX T_TELEFONO,
    TECC_CEL T_TELEFONO);
alter table TERCEROS_CONTACTOS
add constraint PK_TERCEROS_CONTACTOS
primary key (TERC_NIT,TECC_ITEM);

SET TERM ^ ;

create procedure CORREOS_TERCERO (NIT VARCHAR(20))
returns (EMAIL VARCHAR(100))
as
begin
SELECT TERC_EMAIL FROM TERCEROS WHERE TERC_NIT = :NIT INTO :EMAIL;
suspend;
FOR SELECT TECC_EMAIL FROM terceros_contactos WHERE TERC_NIT = :NIT INTO :email
    DO
    if ((EMAIL IS NOT NULL) AND (EMAIL <> '')) then
        SUSPEND;
end
^

SET TERM ; ^

grant select, delete, insert, update on terceros_contactos to PUBLIC;
grant select, delete, insert, update on reportes_mensaje to PUBLIC;
grant EXECUTE on PROCEDURE CORREOS_TERCERO to PUBLIC;

alter table TERCEROS_CONTACTOS
add constraint FK_TERCEROS_CONTACTOS_1
foreign key (TERC_NIT)
references TERCEROS(TERC_NIT)
on delete CASCADE
on update CASCADE;


/* 20081229  si no tenian agencia las listas no las traia a pesar del parametro de configuracion */
SET TERM ^ ;

CREATE OR ALTER PROCEDURE LISTAS_ARTICULO(
    ARTICULO VARCHAR(15),
    FECHA DATE,
    DIAS INTEGER,
    TODAS CHAR(1),
    HORA TIME,
    AGENCIA INTEGER)
RETURNS (
    NOMLISTA VARCHAR(30),
    CODLISTA INTEGER,
    IVAINC CHAR(1))
AS
declare variable FECINI DATE;
declare variable FECFIN DATE;
declare variable DIA smallint;
declare variable DIASEM smallint;
declare variable HORAINI time;
declare variable HORAFIN time;
declare variable SUCID INTEGER;
declare variable PORAGENCIA CHAR(2);
BEGIN
execute procedure lee_configuracion ('FACTURACION', 'DOCUMENTOS', 'FILTRAR LISTAS DE PRECIOS POR AGENCIA') returning_values (:poragencia);
if (TODAS = 'N') then
    begin
    DIA = EXTRACT(weekday FROM FECHA) + 1;
    /* Busque las listas validas hoy */
    FOR SELECT L.LIPR_COD, LIPR_NOM, LIPR_FECINI, LIPR_FECFIN, LIPR_MODIF, LIPR_DIASEM, LIPR_HORAINI, LIPR_HORAFIN, SUCU_ID
        FROM LISTA_PRECIOS L, PRECIOS_ARTICULO P
        WHERE L.LIPR_COD = P.LIPR_COD AND ARTI_COD = :ARTICULO AND
            ((LIPR_DIASMAX IS NULL) or (LIPR_DIASMAX >= :DIAS))
        INTO :CODLISTA, :NOMLISTA, :FECINI, :FECFIN, :IVAINC, :DIASEM, :HORAINI, :HORAFIN, :SUCID
        DO
          if (FECINI is null) then
            begin
            if ((PORAGENCIA = 'NO') OR ((:AGENCIA = 0) or (:SUCID = :AGENCIA))) THEN
              SUSPEND;
            end
          else
            begin
            if ((FECINI <= :FECHA) AND (FECFIN >= :FECHA) AND (HORAINI <= HORA) AND (HORAFIN >= HORA) AND ((DIASEM = 0) or (DIA = DIASEM)))  Then
                if ((PORAGENCIA = 'NO') OR ((:AGENCIA = 0) or (:SUCID = :AGENCIA))) THEN
                    SUSPEND;
            end
      end
  ELSE
      FOR SELECT L.LIPR_COD, LIPR_NOM, LIPR_MODIF, SUCU_ID
        FROM LISTA_PRECIOS L, PRECIOS_ARTICULO P
        WHERE L.LIPR_COD = P.LIPR_COD AND ARTI_COD = :ARTICULO
        INTO :CODLISTA, :NOMLISTA, :IVAINC, :SUCID
        DO
        if ((PORAGENCIA = 'NO') OR ((:AGENCIA = 0) or (:SUCID = :AGENCIA))) THEN
          SUSPEND;
END
^

SET TERM ; ^


/* 20081230 REPLICACION DE SALIDAS COMO ENTRADAS */

INSERT INTO CONFIGURACION (CONF_MODULO, CONF_CATEGORIA, CONF_PROPIEDAD, CONF_VALOR, CONF_POSIBLES, CONF_AYUDA) VALUES ('INVENTARIO', 'SALIDAS', 'REPLICAR COMO ENTRADA EN OTRA COMPAÑIA', 'NO', 'SI,NO', 'SI: Genera una entrada con idénticos items en la compañía indicada al momento de hacer el registro');
commit work;

/* 20081231 MAL DEFINIDO EL CAMPO BODEGA EN LA TABLA STANDS */

ALTER TABLE STANDS DROP CONSTRAINT PK_STANDS;
ALTER TABLE STANDS ADD STAND_BODEGA VARCHAR(2) NOT NULL ;

alter table STANDS add constraint PK_STANDS primary key (ARTI_COD,STAND_BODEGA);

SET TERM ^ ;

CREATE OR ALTER TRIGGER ENTRADAS_DETALLE_AI FOR ENTRADAS_DETALLE
ACTIVE AFTER INSERT POSITION 0
AS
declare variable fec date;
declare variable CONC VARCHAR(60);
declare variable factor numeric(18,4);
declare variable Pref varchar(4);
declare variable Num varchar(6);
declare variable Nit varchar(20);
declare variable IVAINC CHAR(2);
declare variable COSTO NUMERIC(18,2);
BEGIN
  if ((NEW.entr_id <> 0) and (new.ende_anulado = 'N')) then
    BEGIN
    select entr_fecha, entr_conc, pref_pre, entr_numero, terc_nit, entr_imptos
        from entradas where entr_id = new.entr_id
        into :fec, :conc, :Pref, :Num, :Nit, :ivainc;
    execute procedure factor_unidad_cant(new.arti_cod, new.ende_unidad) returning_values(factor);
    COSTO = ((new.ende_costo - NEW.ende_dtomonto) / :factor);
    if (IVAINC = 'S') then
        COSTO = COSTO / (1 + NEW.ende_ivaporc/100);
    INSERT INTO MOVIMIENTO_ARTICULO
      (ARTI_COD, MVAR_CONS, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM, TERC_NIT)
      VALUES(NEW.ARTI_COD, GEN_ID(ID_MOVARTI,1), NEW.BODE_COD, :FEC, 11, NEW.entr_id,
      :CONC, :factor * new.ende_cant, :costo, 'S', new.ende_lote, :Pref, :Num, new.ende_item, :Nit);
    /* RECORRA LAS LISTAS DE PRECIOS Y CAMBIE EL PRECIO */
    EXECUTE PROCEDURE CALCULA_PRECIOS(NEW.ARTI_COD, :FEC);
    /* ACTUALICE EL STAND */
    if (new.ende_stand is not null) then
        UPDATE or INSERT INTO stands (ARTI_COD, STAND_BODEGA, STAND_COD) VALUES (NEW.arti_cod, NEW.bode_cod, NEW.ende_stand);
    END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER ENTRADAS_DETALLE_AU FOR ENTRADAS_DETALLE
ACTIVE AFTER UPDATE POSITION 0
as
declare variable fec date;
declare variable CONC VARCHAR(60);
declare variable Pref varchar(4);
declare variable Num varchar(6);
declare variable Nit varchar(20);
declare variable factor numeric(18,4);
declare variable IVAINC CHAR(2);
declare variable COSTO NUMERIC(18,2);
BEGIN
if ((OLD.entr_id <> 0) AND (OLD.ende_anulado = 'N')) then
    DELETE FROM MOVIMIENTO_ARTICULO WHERE (mvar_tipodoc = 11) and (mvar_idref = new.entr_id) and (mvar_item = old.ende_item);
if ((NEW.entr_id <> 0) AND (NEW.ende_anulado = 'N')) then
    begin
    select entr_fecha, entr_conc, pref_pre, entr_numero, terc_nit, entr_imptos
        from entradas where entr_id = new.entr_id
        into :fec, :conc, :Pref, :Num, :Nit, :ivainc;
    execute procedure factor_unidad_cant(new.arti_cod, new.ende_unidad) returning_values(factor);
    COSTO = ((new.ende_costo - NEW.ende_dtomonto) / :factor);
    if (IVAINC = 'S') then
        COSTO = COSTO / (1 + NEW.ende_ivaporc/100);
    INSERT INTO MOVIMIENTO_ARTICULO
        (ARTI_COD, MVAR_CONS, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM, TERC_NIT)
        VALUES(NEW.ARTI_COD, GEN_ID(ID_MOVARTI,1), NEW.BODE_COD, :FEC, 11, NEW.entr_id,
        :CONC, :factor * new.ende_cant, :COSTO, 'S', new.ende_lote, :Pref, :Num, new.ende_item, :Nit);
    /* RECORRA LAS LISTAS DE PRECIOS Y CAMBIE EL PRECIO */
    EXECUTE PROCEDURE CALCULA_PRECIOS(NEW.ARTI_COD, :FEC);
    /* ACTUALICE EL STAND */
    if (new.ende_stand is not null) then
        UPDATE or INSERT INTO stands (ARTI_COD, STAND_BODEGA, STAND_COD) VALUES (NEW.arti_cod, NEW.bode_cod, NEW.ende_stand);
    END
END
^

SET TERM ; ^

SET TERM ^ ;

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

        if (COSTO > 0 ) then
         BEGIN
          /* ACTUALICE EL COSTO POR PROVEEDOR */
          SELECT PVAR_FECHA FROM PROVEEDOR_ARTICULO
            WHERE TERC_NIT = :Nit AND ARTI_COD = NEW.ARTI_COD
            INTO :FECAUX;
          if (FECAUX IS NULL) then
            INSERT INTO PROVEEDOR_ARTICULO (TERC_NIT, ARTI_COD, PVAR_COSTO, PVAR_FECHA, PVAR_COD,PVAR_DES)
                VALUES (:Nit, NEW.ARTI_COD, :COSTO, :fec, NEW.fcde_codprov,NEW.fcde_desc);
          else
            UPDATE PROVEEDOR_ARTICULO
                SET PVAR_COSTO = :COSTO, PVAR_FECHA = :fec, PVAR_COD = NEW.fcde_codprov
                WHERE ARTI_COD = NEW.ARTI_COD AND TERC_NIT = :Nit;
         END
        /* RECORRA LAS LISTAS DE PRECIOS Y CAMBIE EL PRECIO */
        EXECUTE PROCEDURE CALCULA_PRECIOS(NEW.ARTI_COD, :FEC);
        END /* AFECTAR INV */
    EXECUTE PROCEDURE lee_configuracion('COMPRAS', 'FACTURAS', 'ACTUALIZAR COSTOS DE LA REMISION RELACIONADA AL GRABAR LA FACTURA') returning_values (:ACTREM);
    if ((ACTREM = 'SI') and (Tipo = 22)) then
        BEGIN
        numrows = 0;
        select mvar_cons, MVAR_ITEM, MVAR_FECHA, MVAR_IDREF, MVAR_CANT, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO
            from movimiento_articulo M, consolidado_faltantes C
            where C.cofa_id = :CONSOLIDA AND mvar_tipodoc = 22 and mvar_idref = C.cofa_idori AND C.cofa_tipoori = 22 and m.arti_cod = new.arti_cod
            into :numrows, :iterem, :fecrem, :idrem, :cantrem, :loterem, :prefrem, :numrem;
        
        if (numrows <> 0) then
            BEGIN
            DELETE FROM MOVIMIENTO_ARTICULO WHERE MVAR_CONS = :numrows;
            INSERT INTO MOVIMIENTO_ARTICULO
                (ARTI_COD, MVAR_CONS, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM, TERC_NIT)
                VALUES(NEW.ARTI_COD, GEN_ID(ID_MOVARTI,1), NEW.BODE_COD, :fecrem, 22, :idrem,
                :CONC, :cantrem, :costo, 'S', :loterem, :prefrem, :numrem, :iterem, :Nit);
        
            if (COSTO > 0 ) then
                BEGIN
                /* ACTUALICE EL COSTO POR PROVEEDOR */
                SELECT PVAR_FECHA FROM PROVEEDOR_ARTICULO
                    WHERE TERC_NIT = :Nit AND ARTI_COD = NEW.ARTI_COD
                    INTO :FECAUX;
                if (FECAUX IS NULL) then
                    INSERT INTO PROVEEDOR_ARTICULO (TERC_NIT, ARTI_COD, PVAR_COSTO, PVAR_FECHA, PVAR_COD,PVAR_DES)
                        VALUES (:Nit, NEW.ARTI_COD, :COSTO, :fec, NEW.fcde_codprov,NEW.fcde_desc);
                else
                    UPDATE PROVEEDOR_ARTICULO
                        SET PVAR_COSTO = :COSTO, PVAR_FECHA = :fec, PVAR_COD = NEW.fcde_codprov
                        WHERE ARTI_COD = NEW.ARTI_COD AND TERC_NIT = :Nit;
                END
            /* RECORRA LAS LISTAS DE PRECIOS Y CAMBIE EL PRECIO */
            EXECUTE PROCEDURE CALCULA_PRECIOS(NEW.ARTI_COD, :FEC);
            END
        END

    /* ACTUALICE EL PENDIENTE  */
    if (CONSOLIDA <> 0) then
        BEGIN
        UPDATE consolidado_faltantes SET COFA_OK = 'S' WHERE COFA_ID = :consolida AND COFA_ITEM = NEW.FCDE_ITEM AND ARTI_COD = NEW.arti_cod;
        EXECUTE procedure LEE_CONFIGURACION ('COMPRAS','DOCUMENTOS','SUMAR CANTIDADES PENDIENTES AL CONSOLIDAR DOCUMENTOS') returning_values (CONSO);
        /* IGNORE LA CONSOLIDACION SI SE VALIDAN CODIGOS DE LA ORDEN */
        SELECT MIN(CEFA_TIPOORI) FROM consolide_faltantes WHERE CEFA_ID = :CONSOLIDA INTO :NUMROWS;
        if (NUMROWS = 23) then
            BEGIN
            EXECUTE PROCEDURE LEE_CONFIGURACION('COMPRAS', 'FACTURAS', 'VERIFICAR CODIGOS DE LA ORDEN') returning_values (MENORV);
            if (MENORV = 'SI') then
                CONSO = 'NO';
            END
        SELECT COUNT(CEFA_ITEM) FROM consolide_faltantes WHERE CEFA_ID = :CONSOLIDA INTO :NUMROWS;
        if ((CONSO = 'SI') AND (NUMROWS > 1)) then
            UPDATE consolidado_faltantes SET COFA_IDDES = NEW.faco_id, COFA_OK = 'S' WHERE COFA_ID = :consolida;
        else
            BEGIN
            /* BUSQUE EL CONSOLIDADO EN EL MISMO ITEM Y SI ES DIFERENTE ACTUALICELO */
            select COFA_CANT * COFA_FACTOR FROM consolidado_faltantes WHERE COFA_ID = :consolida AND COFA_ITEM = NEW.FCDE_ITEM AND ARTI_COD = NEW.arti_cod INTO :CANTREL;
            if (NEW.FCDE_CANT * NEW.FCDE_FACTOR < CANTREL) then
                UPDATE consolidado_faltantes SET COFA_IDDES = NEW.faco_id, COFA_CANT = NEW.FCDE_CANT, COFA_FACTOR = NEW.FCDE_FACTOR
                    WHERE COFA_ID = :consolida AND COFA_ITEM = NEW.FCDE_ITEM AND ARTI_COD = NEW.arti_cod;
            END
        END
    /* ACTUALICE EL STAND */
    if (new.fcde_stand is not null) then
        UPDATE or INSERT INTO stands (ARTI_COD, STAND_BODEGA, STAND_COD) VALUES (NEW.arti_cod, NEW.bode_cod, NEW.fcde_stand);
    END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER FACTCOMP_DETALLE_AU FOR FACTURAS_COMPRAS_DETALLE
ACTIVE AFTER UPDATE POSITION 0
as
declare variable fec date;
declare variable fecaux date;
declare variable AUX varchar(90);
declare variable CONC VARCHAR(60);
declare variable Pref varchar(4);
declare variable Num varchar(6);
declare variable Nit varchar(20);
declare variable factor numeric(18,4);
declare variable TIPO INTEGER;
declare variable INVFAC CHAR(2);
declare variable IVAINC CHAR(2);
declare variable COSTO NUMERIC(18,2);
declare variable CANTREL NUMERIC(18,4);
declare variable NUMPROV VARCHAR(10);
declare variable NUMPED VARCHAR(30);
declare variable NUMREM VARCHAR(30);
declare variable CONSO VARCHAR(2);
declare variable CONSOLIDA INTEGER;
declare variable NUMROWS INTEGER;
declare variable DTOPIE NUMERIC(18,2);
declare variable ADICIONAL NUMERIC(18,2);
declare variable TOTAL NUMERIC(18,2);
declare variable IVAMONTO NUMERIC(18,2);
declare variable EXTRA NUMERIC(18,2);
declare variable FACT NUMERIC(18,4);
declare variable MENORV CHAR(2);
declare variable ACTREM CHAR(2);
declare variable FECREM date;
declare variable IDREM INTEGER;
declare variable ITEREM INTEGER;
declare variable CANTREM NUMERIC(18,4);
declare variable LOTEREM VARCHAR(15);
declare variable PREFREM CHAR(4);
BEGIN
if (old.fcde_devuelto = new.fcde_devuelto) then
    begin
    /* deshaga lo viejo */
    if ((old.fcde_anulado = 'N') and (OLD.faco_id <> 0)) then
        begin
        select faco_fecha, faco_consolida from facturas_compra where faco_id = old.faco_id into :fec, :consolida;
        DELETE FROM MOVIMIENTO_ARTICULO WHERE (mvar_tipodoc = 21) and (mvar_idref = old.faco_id) and (mvar_item = old.fcde_item);
        /* RECORRA LAS LISTAS DE PRECIOS Y CAMBIE EL PRECIO */
        EXECUTE PROCEDURE CALCULA_PRECIOS(old.ARTI_COD, :FEC);
        /* LOS PENDIENTES */
        if (CONSOLIDA <> 0) then
            BEGIN
            UPDATE consolidado_faltantes SET COFA_OK = 'N' WHERE COFA_ID = :consolida AND COFA_ITEM = old.FCDE_ITEM AND ARTI_COD = old.arti_cod;
            SELECT COUNT(CEFA_ITEM) FROM consolide_faltantes WHERE CEFA_ID = :CONSOLIDA INTO :NUMROWS;
            EXECUTE procedure LEE_CONFIGURACION ('COMPRAS','DOCUMENTOS','SUMAR CANTIDADES PENDIENTES AL CONSOLIDAR DOCUMENTOS') returning_values (CONSO);
            /* IGNORE LA CONSOLIDACION SI SE VALIDAN CODIGOS DE LA ORDEN */
            SELECT MIN(CEFA_TIPOORI) FROM consolide_faltantes WHERE CEFA_ID = :CONSOLIDA INTO :NUMROWS;
            if (NUMROWS = 23) then
                BEGIN
                EXECUTE PROCEDURE LEE_CONFIGURACION('COMPRAS', 'FACTURAS', 'VERIFICAR CODIGOS DE LA ORDEN') returning_values (MENORV);
                if (MENORV = 'SI') then
                    CONSO = 'NO';
                END
            if (CONSO = 'SI') then
                UPDATE consolidado_faltantes SET COFA_OK = 'N' WHERE COFA_ID = :consolida;
            END
        end
    /* Registre el nuevo */
    if ((new.fcde_anulado = 'N') and (new.faco_id <> 0)) then
        BEGIN
        select faco_fecha, pref_pre, faco_numero, terc_nit, faco_imptos, faco_numprov, faco_remision, faco_orden, faco_consolida, faco_dtomonto, faco_adicional, faco_total, faco_ivamonto, faco_extra
            from facturas_compra where faco_id = new.faco_id
            into :fec, :Pref, :Num, :Nit, :ivainc, :numprov, :numrem, :numped, :consolida, :dtopie, :adicional, :total, :ivamonto, :extra;
        conc = 'FACTURA DE COMPRA No.' || PREF || NUM || '-' || NUMPROV;
        if (NUMREM <> '') then
            BEGIN
            AUX = SUBSTR(NUMREM, 1, 15);
            conc = conc || '-REM:' || AUX;
            END
        else
            if (NUMPED <> '') then
                BEGIN
                AUX = SUBSTR(NUMPED, 1, 15);
                conc = conc || '-ORDEN ' || AUX;
                END
        SELECT MAX(CEFA_TIPOORI) FROM consolide_faltantes WHERE CEFA_ID = :CONSOLIDA INTO :TIPO;
        if (Tipo is null) then
            Tipo = 0;
        execute procedure lee_configuracion('COMPRAS', 'FACTURAS', 'AFECTAR INVENTARIO CON LA FACTURA') returning_values (:INVFAC);
        /* si se hizo con base en una remision no afecte inventario */
        if ((Tipo <> 22) and (INVFAC = 'SI')) then
            begin
            execute procedure factor_unidad_cant(new.arti_cod, new.fcde_unidad) returning_values(factor);
            COSTO = ((new.fcde_prunit - NEW.fcde_dtomonto) / :factor);
            if (IVAINC = 'S') then
                COSTO = COSTO / (1 + NEW.fcde_ivaporc/100);
            EXECUTE PROCEDURE lee_configuracion('COMPRAS','FACTURAS','DESCUENTO Y VALOR ADICIONAL DEL DOCUMENTO COMO MENOR VALOR DEL COSTO') returning_values (:MENORV);
            if (MENORV = 'SI') then
                BEGIN
                FACT = (TOTAL - EXTRA - IVAMONTO);
                if ((FACT - ADICIONAL + DTOPIE) <> 0) then
                    FACT = FACT / (FACT - ADICIONAL + DTOPIE);
                ELSE
                    FACT = 1;
                COSTO = COSTO * FACT;
                END
            INSERT INTO MOVIMIENTO_ARTICULO
                (ARTI_COD, MVAR_CONS, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM, TERC_NIT)
                VALUES(NEW.ARTI_COD, GEN_ID(ID_MOVARTI,1), NEW.BODE_COD, :FEC, 21, NEW.faco_id,
                :CONC, :factor * new.fcde_cant, :COSTO, 'S', new.fcde_lote, :Pref, :Num, NEW.fcde_item, :Nit);
            if (COSTO > 0 ) then
             BEGIN
              /* ACTUALICE EL COSTO POR PROVEEDOR */
              SELECT PVAR_FECHA FROM PROVEEDOR_ARTICULO
                WHERE TERC_NIT = :Nit AND ARTI_COD = NEW.ARTI_COD INTO :FECAUX;
              if (FECAUX IS NULL) then
                INSERT INTO PROVEEDOR_ARTICULO (TERC_NIT, ARTI_COD, PVAR_COSTO, PVAR_FECHA, PVAR_COD,PVAR_DES)
                    VALUES (:Nit, NEW.ARTI_COD, :COSTO, :fec, NEW.fcde_codprov,NEW.fcde_desc);
              else
                UPDATE PROVEEDOR_ARTICULO
                    SET PVAR_COSTO = :COSTO, PVAR_FECHA = :fec, PVAR_COD = NEW.fcde_codprov
                    WHERE ARTI_COD = NEW.ARTI_COD AND TERC_NIT = :Nit;
             END
            /* RECORRA LAS LISTAS DE PRECIOS Y CAMBIE EL PRECIO */
            EXECUTE PROCEDURE CALCULA_PRECIOS(NEW.ARTI_COD, :FEC);
            end
        EXECUTE PROCEDURE lee_configuracion('COMPRAS', 'FACTURAS', 'ACTUALIZAR COSTOS DE LA REMISION RELACIONADA AL GRABAR LA FACTURA') returning_values (:ACTREM);
        if ((ACTREM = 'SI') and (Tipo = 22)) then
            BEGIN
            numrows = 0;
            select mvar_cons, MVAR_ITEM, MVAR_FECHA, MVAR_IDREF, MVAR_CANT, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO
                from movimiento_articulo M, consolidado_faltantes C
                where C.cofa_id = :CONSOLIDA AND mvar_tipodoc = 22 and mvar_idref = C.cofa_idori AND C.cofa_tipoori = 22 and m.arti_cod = new.arti_cod
                into :numrows, :iterem, :fecrem, :idrem, :cantrem, :loterem, :prefrem, :numrem;
            
            if (numrows <> 0) then
                BEGIN
                DELETE FROM MOVIMIENTO_ARTICULO WHERE MVAR_CONS = :numrows;
                INSERT INTO MOVIMIENTO_ARTICULO
                    (ARTI_COD, MVAR_CONS, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM, TERC_NIT)
                    VALUES(NEW.ARTI_COD, GEN_ID(ID_MOVARTI,1), NEW.BODE_COD, :fecrem, 22, :idrem,
                    :CONC, :cantrem, :costo, 'S', :loterem, :prefrem, :numrem, :iterem, :Nit);
        
                if (COSTO > 0 ) then
                    BEGIN
                    /* ACTUALICE EL COSTO POR PROVEEDOR */
                    SELECT PVAR_FECHA FROM PROVEEDOR_ARTICULO
                        WHERE TERC_NIT = :Nit AND ARTI_COD = NEW.ARTI_COD
                        INTO :FECAUX;
                    if (FECAUX IS NULL) then
                        INSERT INTO PROVEEDOR_ARTICULO (TERC_NIT, ARTI_COD, PVAR_COSTO, PVAR_FECHA, PVAR_COD,PVAR_DES)
                            VALUES (:Nit, NEW.ARTI_COD, :COSTO, :fec, NEW.fcde_codprov,NEW.fcde_desc);
                    else
                        UPDATE PROVEEDOR_ARTICULO
                            SET PVAR_COSTO = :COSTO, PVAR_FECHA = :fec, PVAR_COD = NEW.fcde_codprov
                            WHERE ARTI_COD = NEW.ARTI_COD AND TERC_NIT = :Nit;
                    END
                /* RECORRA LAS LISTAS DE PRECIOS Y CAMBIE EL PRECIO */
                EXECUTE PROCEDURE CALCULA_PRECIOS(NEW.ARTI_COD, :FEC);
                END
            END

        if (CONSOLIDA <> 0) then
            begin
            UPDATE consolidado_faltantes SET COFA_OK = 'S' WHERE COFA_ID = :consolida AND COFA_ITEM = NEW.FCDE_ITEM AND ARTI_COD = NEW.arti_cod;
            EXECUTE procedure LEE_CONFIGURACION ('COMPRAS','DOCUMENTOS','SUMAR CANTIDADES PENDIENTES AL CONSOLIDAR DOCUMENTOS') returning_values (CONSO);
            /* IGNORE LA CONSOLIDACION SI SE VALIDAN CODIGOS DE LA ORDEN */
            SELECT MIN(CEFA_TIPOORI) FROM consolide_faltantes WHERE CEFA_ID = :CONSOLIDA INTO :NUMROWS;
            if (NUMROWS = 23) then
                BEGIN
                EXECUTE PROCEDURE LEE_CONFIGURACION('COMPRAS', 'FACTURAS', 'VERIFICAR CODIGOS DE LA ORDEN') returning_values (MENORV);
                if (MENORV = 'SI') then
                    CONSO = 'NO';
                END
            SELECT COUNT(CEFA_ITEM) FROM consolide_faltantes WHERE CEFA_ID = :CONSOLIDA INTO :NUMROWS;
            if ((CONSO = 'SI') AND (NUMROWS > 1)) then
                UPDATE consolidado_faltantes SET COFA_IDDES = NEW.faco_id, COFA_OK = 'S' WHERE COFA_ID = :consolida;
            else
                BEGIN
                /* BUSQUE EL CONSOLIDADO EN EL MISMO ITEM Y SI ES DIFERENTE ACTUALICELO */
                select COFA_CANT * COFA_FACTOR FROM consolidado_faltantes WHERE COFA_ID = :consolida AND COFA_ITEM = NEW.FCDE_ITEM AND ARTI_COD = NEW.arti_cod INTO :CANTREL;
                if (NEW.FCDE_CANT * NEW.FCDE_FACTOR < CANTREL) then
                    UPDATE consolidado_faltantes SET COFA_IDDES = NEW.faco_id, COFA_CANT = NEW.FCDE_CANT, COFA_FACTOR = NEW.FCDE_FACTOR
                        WHERE COFA_ID = :consolida AND COFA_ITEM = NEW.FCDE_ITEM AND ARTI_COD = NEW.arti_cod;
                END
            end
        /* ACTUALICE EL STAND */
        if (new.fcde_stand is not null) then
            UPDATE or INSERT INTO stands (ARTI_COD, STAND_BODEGA, STAND_COD) VALUES (NEW.arti_cod, NEW.bode_cod, NEW.fcde_stand);
        END
    end
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER REMISION_PROVEEDOR_DET_AI FOR REMISION_PROVEEDOR_DET
ACTIVE AFTER INSERT POSITION 0
AS
declare variable fec date;
declare variable CONC VARCHAR(60);
declare variable factor numeric(18,4);
declare variable Pref varchar(4);
declare variable Num varchar(6);
declare variable EXISTE CHAR(1);
declare variable NIT VARCHAR(20);
declare variable NUMPROV VARCHAR(20);
declare variable Tipo Integer;
declare variable idfact integer;
declare variable numrows integer;
declare variable IVAINC CHAR(2);
declare variable COSTO NUMERIC(18,2);
declare variable CANTREL NUMERIC(18,4);
declare variable NUMPED VARCHAR(30);
declare variable CONSO CHAR(2);
declare variable CONSOLIDA INTEGER;
declare variable DTOPIE NUMERIC(18,2);
declare variable ADICIONAL NUMERIC(18,2);
declare variable TOTAL NUMERIC(18,2);
declare variable IVAMONTO NUMERIC(18,2);
declare variable EXTRA NUMERIC(18,2);
declare variable FACT NUMERIC(18,4);
declare variable MENORV CHAR(2);
BEGIN
  if ((NEW.repr_id <> 0) and (new.rpvd_anulado = 'N')) then
    BEGIN
    select max(rprd_tiporel), max(rprd_idrel) from remision_proveedor_docrela
        where repr_id = new.repr_id into :Tipo, :idfact;
    if (Tipo is null) then
        Tipo = 0;
    /* si se hizo con base en una factura que afecto el inventario no afecte inventario */
    numrows = 0;
    if (Tipo = 21) Then
        select count(*) from movimiento_articulo where mvar_tipodoc = 21 and mvar_idref = :idfact into :numrows;
    if (numrows is null) then
        numrows = 0;
    if (numrows = 0) then
        begin
        select repr_fecha, pref_pre, repr_numero, REPR_IMPTOS, terc_nit, REPR_NUMPROV, REPR_ORDEN, REPR_CONSOLIDA, repr_dtomonto, repr_adicional, repr_total, repr_ivamonto, repr_extra
            from remision_proveedor where repr_id = new.repr_id
            into :fec, :Pref, :Num, :IVAINC, :NIT, :NUMPROV, :numped, :CONSOLIDA, :dtopie, :adicional, :total, :ivamonto, :extra;
        execute procedure factor_unidad_cant(new.arti_cod, new.rpvd_unidad) returning_values(factor);
        CONC = 'REMISION PROVEEDOR No.' || PREF || NUM || '-' || NUMPROV;
        if (numped <> '') then
            conc = conc || '-ORDEN ' || NUMPED;
        COSTO = ((new.rpvd_prunit - NEW.rpvd_dtomonto) / :factor);
        if (IVAINC = 'S') then
            COSTO = COSTO / (1 + NEW.rpvd_ivaporc/100);
        EXECUTE PROCEDURE lee_configuracion('COMPRAS','FACTURAS','DESCUENTO Y VALOR ADICIONAL DEL DOCUMENTO COMO MENOR VALOR DEL COSTO') returning_values (:MENORV);
        if (MENORV = 'SI') then
            BEGIN
            FACT = (TOTAL - EXTRA - IVAMONTO);
            if ((FACT - ADICIONAL + DTOPIE) <> 0) then
                FACT = FACT / (FACT - ADICIONAL + DTOPIE);
            ELSE
                FACT = 1;
            COSTO = COSTO * FACT;
            END
        INSERT INTO MOVIMIENTO_ARTICULO
          (ARTI_COD, MVAR_CONS, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM, TERC_NIT)
          VALUES(NEW.ARTI_COD, GEN_ID(ID_MOVARTI,1), NEW.BODE_COD, :FEC, 22, NEW.repr_id,
          :CONC, :factor * new.rpvd_cant, :COSTO, 'S', new.rpvd_lote, :Pref, :Num, new.rpvd_item, :Nit);

        /* RECORRA LAS LISTAS DE PRECIOS Y CAMBIE EL PRECIO */
        EXECUTE PROCEDURE CALCULA_PRECIOS(NEW.ARTI_COD, :FEC);

        if (COSTO > 0 ) then
         BEGIN
          /* GRABE PROV X ARTICULO */
          EXISTE = 'N';
          SELECT 'S' FROM PROVEEDOR_ARTICULO WHERE TERC_NIT = :NIT AND ARTI_COD = NEW.ARTI_COD INTO :EXISTE;
          if (EXISTE = 'S') then
            UPDATE PROVEEDOR_ARTICULO 
                SET PVAR_FECHA = :FEC, PVAR_COSTO = :COSTO, PVAR_COD = NEW.rpvd_codprov
                WHERE TERC_NIT = :NIT AND ARTI_COD = NEW.ARTI_COD;
          ELSE
            INSERT INTO PROVEEDOR_ARTICULO (TERC_NIT, ARTI_COD, PVAR_COSTO, PVAR_FECHA, PVAR_COD,PVAR_DES)
                VALUES (:NIT, NEW.ARTI_COD, :COSTO, :FEC, NEW.rpvd_codprov,NEW.rpvd_desc);
         END
        end

    /* ACTUALICE EL PENDIENTE  */
    if (CONSOLIDA <> 0) then
        BEGIN
        EXECUTE PROCEDURE LEE_CONFIGURACION ('COMPRAS','DOCUMENTOS','SUMAR CANTIDADES PENDIENTES AL CONSOLIDAR DOCUMENTOS') returning_values (CONSO);
        SELECT MIN(CEFA_TIPOORI) FROM consolide_faltantes WHERE CEFA_ID = :CONSOLIDA INTO :NUMROWS;
        if (NUMROWS = 23) then
            BEGIN
            EXECUTE PROCEDURE LEE_CONFIGURACION('COMPRAS', 'REMISIONES', 'VERIFICAR CODIGOS DE LA ORDEN') returning_values (MENORV);
            if (MENORV = 'SI') then
                CONSO = 'NO';
            END
        SELECT COUNT(CEFA_ITEM) FROM consolide_faltantes WHERE CEFA_ID = :CONSOLIDA INTO :NUMROWS;
        if ((CONSO = 'SI') AND (NUMROWS > 1)) then
            UPDATE consolidado_faltantes SET COFA_OK = 'S' WHERE COFA_ID = :consolida;
        ELSE
            BEGIN
            /* BUSQUE EL CONSOLIDADO EN EL MISMO ITEM Y SI ES DIFERENTE ACTUALICELO */
            select COFA_CANT * COFA_FACTOR FROM consolidado_faltantes WHERE COFA_ID = :consolida AND COFA_ITEM = NEW.RPVD_ITEM AND ARTI_COD = NEW.arti_cod INTO :CANTREL;
            if (NEW.RPVD_CANT * NEW.RPVD_FACTOR < CANTREL) then
                UPDATE consolidado_faltantes SET COFA_IDDES = NEW.repr_id, COFA_CANT = NEW.RPVD_CANT, COFA_FACTOR = NEW.RPVD_FACTOR
                    WHERE COFA_ID = :consolida AND COFA_ITEM = NEW.RPVD_ITEM AND ARTI_COD = NEW.arti_cod;
            ELSE
                UPDATE consolidado_faltantes SET COFA_IDDES = NEW.repr_id, COFA_OK = 'S' WHERE COFA_ID = :consolida AND COFA_ITEM = NEW.RPVD_ITEM AND ARTI_COD = NEW.arti_cod;
            END
        END
    /* ACTUALICE EL STAND */
    if (new.rpvd_stand is not null) then
        UPDATE or INSERT INTO stands (ARTI_COD, STAND_BODEGA, STAND_COD) VALUES (NEW.arti_cod, NEW.bode_cod, NEW.rpvd_stand);
    END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER REMISION_PROVEEDOR_DET_AU FOR REMISION_PROVEEDOR_DET
ACTIVE AFTER UPDATE POSITION 0
AS
declare variable fec date;
declare variable CONC VARCHAR(60);
declare variable Pref varchar(4);
declare variable Num varchar(6);
declare variable factor numeric(18,4);
declare variable EXISTE CHAR(1);
declare variable NIT VARCHAR(20);
declare variable NUMPROV VARCHAR(20);
declare variable Tipo integer;
declare variable idfact integer;
declare variable numrows integer;
declare variable IVAINC CHAR(2);
declare variable COSTO NUMERIC(18,2);
declare variable CANTREL NUMERIC(18,4);
declare variable NUMPED VARCHAR(30);
declare variable CONSO CHAR(2);
declare variable CONSOLIDA INTEGER;
declare variable DTOPIE NUMERIC(18,2);
declare variable ADICIONAL NUMERIC(18,2);
declare variable TOTAL NUMERIC(18,2);
declare variable IVAMONTO NUMERIC(18,2);
declare variable EXTRA NUMERIC(18,2);
declare variable FACT NUMERIC(18,4);
declare variable MENORV CHAR(2);
BEGIN
if ((OLD.repr_id <> 0) AND (OLD.rpvd_anulado = 'N')) then
    begin
    DELETE FROM MOVIMIENTO_ARTICULO WHERE (mvar_tipodoc = 22) and (mvar_idref = new.repr_id) and (mvar_item = old.rpvd_item);
    select REPR_CONSOLIDA from remision_proveedor where repr_id = old.repr_id into :CONSOLIDA;
    if (CONSOLIDA <> 0) then
        begin
        EXECUTE PROCEDURE LEE_CONFIGURACION ('COMPRAS','DOCUMENTOS','SUMAR CANTIDADES PENDIENTES AL CONSOLIDAR DOCUMENTOS') returning_values (CONSO);
        SELECT COUNT(CEFA_ITEM) FROM consolide_faltantes WHERE CEFA_ID = :CONSOLIDA INTO :NUMROWS;
        if ((NUMROWS = 1) OR (CONSO = 'NO')) then
            UPDATE consolidado_faltantes SET COFA_OK = 'N' WHERE COFA_ID = :consolida AND COFA_ITEM = old.RPVD_ITEM AND ARTI_COD = old.arti_cod;
        else
            UPDATE consolidado_faltantes SET COFA_OK = 'N' WHERE COFA_ID = :consolida;
        END
    end
/* Registre el nuevo */
if ((new.repr_id <> 0) AND (new.rpvd_anulado = 'N')) then
    begin
    select repr_fecha, pref_pre, repr_numero, repr_imptos, terc_nit, REPR_NUMPROV, REPR_ORDEN, REPR_CONSOLIDA, repr_dtomonto, repr_adicional, repr_total, repr_ivamonto, repr_extra
        from remision_proveedor where repr_id = new.repr_id
        into :fec, :Pref, :Num, :IVAINC, :NIT, :NUMPROV, :numped, :CONSOLIDA, :dtopie, :adicional, :total, :ivamonto, :extra;
    CONC = 'REMISION PROVEEDOR No.' || PREF || NUM || '-' || NUMPROV;
    if (numped <> '') then
        conc = conc || '-ORDEN ' || NUMPED;
    SELECT MAX(CEFA_TIPOORI) FROM consolide_faltantes WHERE CEFA_ID = :CONSOLIDA INTO :TIPO;
    if (Tipo is null) then
        Tipo = 0;
    select FACO_ID from FACTURAS_COMPRA WHERE FACO_CONSOLIDA = :consolida INTO :IDFACT;
    if (Idfact is null) then
        Idfact = 0;
    /* si se hizo con base en una factura que afecto el inventario no afecte inventario */
    numrows = 0;
    if (Tipo = 21) Then
        select count(*) from movimiento_articulo where mvar_tipodoc = 21 and mvar_idref = :idfact into :numrows;
    if (numrows is null) then
        numrows = 0;
    if (numrows = 0) then
        begin
        execute procedure factor_unidad_cant(new.arti_cod, new.rpvd_unidad) returning_values(factor);
        COSTO = ((new.rpvd_prunit - NEW.rpvd_dtomonto) / :factor);
        if (IVAINC = 'S') then
            COSTO = COSTO / (1 + NEW.rpvd_ivaporc/100);
        EXECUTE PROCEDURE lee_configuracion('COMPRAS','FACTURAS','DESCUENTO Y VALOR ADICIONAL DEL DOCUMENTO COMO MENOR VALOR DEL COSTO') returning_values (:MENORV);
        if (MENORV = 'SI') then
            BEGIN
            FACT = (TOTAL - EXTRA - IVAMONTO);
            if ((FACT - ADICIONAL + DTOPIE) <> 0) then
                FACT = FACT / (FACT - ADICIONAL + DTOPIE);
            ELSE
                FACT = 1;
            COSTO = COSTO * FACT;
            END
        INSERT INTO MOVIMIENTO_ARTICULO
            (ARTI_COD, MVAR_CONS, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM, TERC_NIT)
            VALUES(NEW.ARTI_COD, GEN_ID(ID_MOVARTI,1), NEW.BODE_COD, :FEC, 22, NEW.repr_id,
            :CONC, :factor * new.rpvd_cant, :COSTO, 'S', new.rpvd_lote, :Pref, :Num, new.rpvd_item, :Nit);
            
        /* RECORRA LAS LISTAS DE PRECIOS Y CAMBIE EL PRECIO */
        EXECUTE PROCEDURE CALCULA_PRECIOS(NEW.ARTI_COD, :FEC);
          
        if (COSTO > 0 ) then
         BEGIN
          /* GRABE PROV X ARTICULO */
          EXISTE = 'N';
          SELECT 'S' FROM PROVEEDOR_ARTICULO WHERE TERC_NIT = :NIT AND ARTI_COD = NEW.ARTI_COD INTO :EXISTE;
          if (EXISTE = 'S') then
            UPDATE PROVEEDOR_ARTICULO
                SET PVAR_FECHA = :FEC, PVAR_COSTO = :COSTO, PVAR_COD = NEW.rpvd_codprov
                WHERE TERC_NIT = :NIT AND ARTI_COD = NEW.ARTI_COD;
          ELSE
            INSERT INTO PROVEEDOR_ARTICULO (TERC_NIT, ARTI_COD, PVAR_COSTO, PVAR_FECHA, PVAR_COD,PVAR_DES)
                VALUES (:NIT, NEW.ARTI_COD, :COSTO, :FEC, NEW.rpvd_codprov,NEW.rpvd_desc);
         END
        end
    if (CONSOLIDA <> 0) then
        BEGIN
        EXECUTE PROCEDURE LEE_CONFIGURACION ('COMPRAS','DOCUMENTOS','SUMAR CANTIDADES PENDIENTES AL CONSOLIDAR DOCUMENTOS') returning_values (CONSO);
        /* IGNORE LA CONSOLIDACION SI SE VALIDAN CODIGOS DE LA ORDEN */
        SELECT MIN(CEFA_TIPOORI) FROM consolide_faltantes WHERE CEFA_ID = :CONSOLIDA INTO :NUMROWS;
        if (NUMROWS = 23) then
            BEGIN
            EXECUTE PROCEDURE LEE_CONFIGURACION('COMPRAS', 'REMISIONES', 'VERIFICAR CODIGOS DE LA ORDEN') returning_values (MENORV);
            if (MENORV = 'SI') then
                CONSO = 'NO';
            END
        SELECT COUNT(CEFA_ITEM) FROM consolide_faltantes WHERE CEFA_ID = :CONSOLIDA INTO :NUMROWS;
        if ((CONSO = 'SI') AND (NUMROWS > 1)) then
            UPDATE consolidado_faltantes SET COFA_IDDES = NEW.repr_id, COFA_OK = 'S' WHERE COFA_ID = :consolida;
        ELSE
            BEGIN
            /* BUSQUE EL CONSOLIDADO EN EL MISMO ITEM Y SI ES DIFERENTE ACTUALICELO */
            select COFA_CANT * COFA_FACTOR FROM consolidado_faltantes WHERE COFA_ID = :consolida AND COFA_ITEM = NEW.RPVD_ITEM AND ARTI_COD = NEW.arti_cod INTO :CANTREL;
            if (NEW.RPVD_CANT * NEW.RPVD_FACTOR < CANTREL) then
                UPDATE consolidado_faltantes SET COFA_IDDES = NEW.repr_id, COFA_CANT = NEW.RPVD_CANT, COFA_FACTOR = NEW.RPVD_FACTOR
                    WHERE COFA_ID = :consolida AND COFA_ITEM = NEW.RPVD_ITEM AND ARTI_COD = NEW.arti_cod;
            else
                UPDATE consolidado_faltantes SET COFA_IDDES = NEW.repr_id, COFA_OK = 'S' WHERE COFA_ID = :consolida AND COFA_ITEM = NEW.RPVD_ITEM AND ARTI_COD = NEW.arti_cod;
            END
        END
    /* ACTUALICE EL STAND */
    if (new.rpvd_stand is not null) then
        UPDATE or INSERT INTO stands (ARTI_COD, STAND_BODEGA, STAND_COD) VALUES (NEW.arti_cod, NEW.bode_cod, NEW.rpvd_stand);
    END
END
^

SET TERM ; ^



SET TERM ^ ;

CREATE OR ALTER PROCEDURE EXISTENCIAS_DESDE_HASTA(
    FECHA DATE,
    ARTINI VARCHAR(20),
    ARTFIN VARCHAR(20),
    GRPINI VARCHAR(3),
    GRPFIN VARCHAR(3),
    BODINI VARCHAR(2),
    BODFIN VARCHAR(2),
    ORDEN CHAR(1),
    AGRUPA CHAR(1),
    DETALLE CHAR(1),
    RESERVA CHAR(1),
    ENPESO CHAR(1),
    SUCURSAL INTEGER)
RETURNS (
    CANT NUMERIC(18,4),
    COSTO NUMERIC(18,2),
    COSTO_LOTE NUMERIC(18,2),
    CODIGO VARCHAR(15),
    NOMBRE VARCHAR(60),
    UNIDAD VARCHAR(8),
    STAND VARCHAR(15),
    CODGRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    CODSUBG VARCHAR(3),
    NOMSUBG VARCHAR(30),
    CODMARC VARCHAR(3),
    NOMMARC VARCHAR(30),
    CODBOD VARCHAR(2),
    LOTE VARCHAR(15),
    NOMBOD VARCHAR(30),
    COSTOTOT NUMERIC(18,2),
    ULTCOSTO NUMERIC(18,2),
    FECHACOSTO DATE,
    CONSUMO NUMERIC(18,2),
    RESERVADO NUMERIC(18,4),
    ORDENADO NUMERIC(18,4),
    IVA NUMERIC(9,2),
    PESOUNIT NUMERIC(18,4),
    PESOTOTAL NUMERIC(18,4),
    CODBAR VARCHAR(20))
AS
declare variable exist char(1);
declare variable codini varchar(20);
declare variable codfin varchar(20);
declare variable desini varchar(20);
declare variable desfin varchar(20);
declare variable ordenc numeric(18,4);
declare variable pedido numeric(18,4);
declare variable ok char(1);
declare variable id integer;
declare variable item integer;
declare variable und varchar(8);
declare variable factor numeric(18,4);
declare variable cant2 numeric(18,4);
declare variable PEDAUTO CHAR(2);
BEGIN
if (ORDEN = 'C') then
    BEGIN
    CODINI = ARTINI;
    CODFIN = ARTFIN;
    DESINI = '';
    DESFIN = 'zz';
    END
ELSE
    BEGIN
    DESINI = ARTINI;
    DESFIN = ARTFIN;
    CODINI = '';
    CODFIN = 'zz';
    END
EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION', 'FACTURAS', 'GENERAR PEDIDO AUTOMATICAMENTE CON LA FACTURA') returning_values (pedauto);
if (DETALLE = 'B') then
  BEGIN
  FOR SELECT ARTI_COD, ARTI_DES, ARTI_UNIDAD, ARTI_EXIST, TAIV_PORC, A.GRUP_COD, A.SUBG_COD, A.MARC_COD, BODE_COD, BODE_NOM, ARTI_CONSUMO, ARTI_PESO/1000
      FROM ARTICULO A, BODEGA B, TARIFA_IVA T
      WHERE ARTI_COD >= :CODINI AND ARTI_COD <= :CODFIN AND ARTI_DES >= :DESINI AND ARTI_DES <= :DESFIN AND ESAR_COD <> 'I' AND BODE_COD >= :BODINI AND
      BODE_COD <= :BODFIN AND ((SUCU_ID = :SUCURSAL) or (:SUCURSAL = 0)) AND A.TAIV_COD = T.TAIV_COD
      INTO :CODIGO, :NOMBRE, :UNIDAD, :EXIST, :IVA, :CODGRUPO, :CODSUBG, :CODMARC, :CODBOD, :NOMBOD, :CONSUMO, :pesounit
      DO
        BEGIN
        OK = 'N';
        if (AGRUPA = 'G') then
            BEGIN
            if ((CODGRUPO >= GRPINI) AND (CODGRUPO <= GRPFIN)) then
                OK = 'S';
            end
        ELSE
            if (AGRUPA = 'M') then
                BEGIN
                if ((CODMARC >= GRPINI) AND (CODMARC <= GRPFIN)) then
                    OK = 'S';
                END
        if (OK = 'S') then
            BEGIN
            NOMGRUPO = '';
            NOMMARC = '';
            NOMSUBG = '';
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            SELECT MAX(COBA_COD) FROM BARRAS_ARTICULO WHERE ARTI_COD = :codigo AND COBA_UNIDAD = :unidad INTO :codbar;
            if (CODBAR IS NULL) then
                CODBAR = CODIGO;
            if (EXIST <> 'N') then
                BEGIN
                SELECT STAND_COD FROM STANDS WHERE ARTI_COD = :CODIGO AND STAND_BODEGA = :CODBOD INTO :STAND;
                EXECUTE PROCEDURE SALDO_INICIAL_INVENTARIO(CODIGO, FECHA, :CODBOD) returning_values (CANT);
                EXECUTE PROCEDURE COSTO_PROMEDIO_UNIDAD(CODIGO, FECHA, UNIDAD) returning_values (COSTO);
                EXECUTE PROCEDURE ULTIMO_COSTO(CODIGO, FECHA, UNIDAD) returning_values (ULTCOSTO);
                SELECT MAX(MVAR_FECHA) FROM MOVIMIENTO_ARTICULO WHERE ARTI_COD = :CODIGO AND MVAR_ENTRADA = 'S' AND MVAR_FECHA <= :FECHA INTO :FECHACOSTO;
                COSTOTOT = :CANT * :COSTO;
                CONSUMO = CONSUMO * CANT;
                if (RESERVA = 'S') then
                    BEGIN
                    SELECT SUM(ORID_ENTREGAR)
                        FROM ORDENINVENTARIO_DETALLE OD, ordenes_inventario O
                        WHERE O.ORIN_ID = OD.ORIN_ID AND ARTI_COD = :CODIGO AND ORIN_FECHA <= :FECHA AND ORIN_FECLLEGA >= :FECHA AND ORID_ANULADO = 'N' AND OD.BODE_COD = :CODBOD
                        INTO :ORDENADO;
                    if (ORDENADO IS NULL) then
                        ORDENADO = 0;
                    ORDENC = 0;
                    FOR SELECT O.ORDC_ID, OCDE_ITEM, OCDE_CANT * OCDE_FACTOR
                        FROM ORDENES_COMPRA O, ORDENES_COMPRA_DETALLE OD
                        WHERE O.ORDC_ID = OD.ORDC_ID AND OD.ARTI_COD = :CODIGO AND (ORDC_FECHA+ORDC_VALIDEZ) >= :FECHA AND ORDC_FECHA <= :FECHA AND OCDE_ANULADO = 'N' AND OD.BODE_COD = :CODBOD
                        INTO :ID, :ITEM, :CANT2
                        do
                        BEGIN
                        EXECUTE PROCEDURE FALTANTE(23, 21, ID, ITEM) returning_values (PEDIDO, UND, FACTOR);
                        if (PEDIDO * FACTOR = CANT2) then /* SI NO SE HA FACTURADO MIRE A VER SI SE REMISIONO */
                            EXECUTE PROCEDURE FALTANTE(23, 22, ID, ITEM) returning_values (PEDIDO, UND, FACTOR);
                        if (PEDIDO IS NULL) then
                            PEDIDO = 0;
                        ORDENC = ORDENC + PEDIDO * FACTOR;
                        END
                    ORDENADO = ORDENADO + ORDENC;
                    SELECT SUM(RSDE_LIBERAR)
                        FROM RESERVAS_DETALLE RD, RESERVAS R
                        WHERE R.RESE_ID = RD.RESE_ID AND ARTI_COD = :CODIGO AND RESE_FECHA <= :FECHA AND RESE_VENCE >= :FECHA AND RD.BODE_COD = :CODBOD AND RSDE_ANULADO = 'N'
                        INTO :RESERVADO;
                    if (RESERVADO IS NULL) then
                        RESERVADO = 0;
                    PEDIDO = 0;
                    FOR SELECT P.PEDI_ID, PEDE_ITEM, PEDE_CANT * PEDE_FACTOR
                        FROM PEDIDOS P, PEDIDOS_DETALLE PD
                        WHERE P.PEDI_ID = PD.PEDI_ID AND PD.ARTI_COD = :CODIGO AND (PEDI_FECHA+PEDI_VALIDEZ) >= :FECHA AND PEDI_FECHA <= :FECHA AND PEDE_ANULADO = 'N' AND BODE_COD = :CODBOD
                        INTO :ID, :ITEM, :CANT2
                        do
                        BEGIN
                        EXECUTE PROCEDURE FALTANTE(34, 31, ID, ITEM) returning_values (ORDENC, UND, FACTOR);
                        if ((ORDENC * FACTOR = CANT2) or (PEDAUTO = 'SI')) then /* SI NO SE HA FACTURADO MIRE A VER SI SE REMISIONO */
                            EXECUTE PROCEDURE FALTANTE(34, 32, ID, ITEM) returning_values (ORDENC, UND, FACTOR);
                        if (ORDENC IS NULL) then
                            ORDENC = 0;
                        PEDIDO = PEDIDO + ORDENC * FACTOR;
                        END
                    RESERVADO = RESERVADO + PEDIDO;
                    END
                ELSE
                    BEGIN
                    RESERVADO = 0;
                    ORDENADO = 0;
                    END
                if (ENPESO = 'S') then
                    BEGIN
                    if (pesounit IS NULL) then
                        pesounit = 0;
                    if (PESOUNIT <> 0) then
                        BEGIN
                        pesototal = PESOUNIT * cant;
                        SUSPEND;
                        END
                    END
                ELSE
                    SUSPEND;
                END
            END
        END
  END

if (DETALLE = 'L') then
  BEGIN
  FOR SELECT A.ARTI_COD, ARTI_DES, ARTI_UNIDAD, ARTI_EXIST, TAIV_PORC, A.GRUP_COD, A.SUBG_COD, A.MARC_COD, L.lote_nro, L.lote_nro||' - '||L.lote_vence, ARTI_CONSUMO,l.bode_cod, L.lote_saldo,l.lote_costo, ARTI_PESO/1000
      FROM ARTICULO A, LOTES l, TARIFA_IVA T
      WHERE A.ARTI_COD >= '0' AND A.ARTI_COD <= 'zz' AND ARTI_DES >= '' AND ARTI_DES <= 'zz' AND ESAR_COD <> 'I' AND A.TAIV_COD = T.TAIV_COD and a.arti_cod = l.arti_cod
      INTO :CODIGO, :NOMBRE, :UNIDAD, :EXIST, :IVA, :CODGRUPO, :CODSUBG, :CODMARC, :LOTE, :NOMBOD, :CONSUMO, :codbod, :cant, :costo_lote, :pesounit
      DO
        BEGIN
        OK = 'N';
        if (AGRUPA = 'G') then
            BEGIN
            if ((CODGRUPO >= GRPINI) AND (CODGRUPO <= GRPFIN)) then
                OK = 'S';
            end
        ELSE
            if (AGRUPA = 'M') then
                BEGIN
                if ((CODMARC >= GRPINI) AND (CODMARC <= GRPFIN)) then
                    OK = 'S';
                END
        if (OK = 'S') then
            BEGIN
            NOMGRUPO = '';
            NOMMARC = '';
            NOMSUBG = '';
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            SELECT MAX(COBA_COD) FROM BARRAS_ARTICULO WHERE ARTI_COD = :codigo AND COBA_UNIDAD = :unidad INTO :codbar;
            if (CODBAR IS NULL) then
                CODBAR = CODIGO;

            if (EXIST <> 'N') then
                BEGIN
                EXECUTE PROCEDURE COSTO_PROMEDIO_UNIDAD(CODIGO, FECHA, UNIDAD) returning_values (COSTO);
                EXECUTE PROCEDURE ULTIMO_COSTO(CODIGO, FECHA, UNIDAD) returning_values (ULTCOSTO);
                SELECT MAX(MVAR_FECHA) FROM MOVIMIENTO_ARTICULO WHERE ARTI_COD = :CODIGO AND MVAR_ENTRADA = 'S' AND MVAR_FECHA <= :FECHA INTO :FECHACOSTO;
                COSTOTOT = :CANT * :COSTO;
                CONSUMO = CONSUMO * CANT;
                if (RESERVA = 'S') then
                    BEGIN
                    SELECT SUM(ORID_ENTREGAR)
                        FROM ORDENINVENTARIO_DETALLE OD, ordenes_inventario O
                        WHERE O.ORIN_ID = OD.ORIN_ID AND ARTI_COD = :CODIGO AND ORIN_FECHA <= :FECHA AND ORIN_FECLLEGA >= :FECHA AND ORID_ANULADO = 'N'
                        INTO :ORDENADO;
                    if (ORDENADO IS NULL) then
                        ORDENADO = 0;
                    ORDENC = 0;
                    FOR SELECT O.ORDC_ID, OCDE_ITEM, OCDE_CANT * OCDE_FACTOR
                        FROM ORDENES_COMPRA O, ORDENES_COMPRA_DETALLE OD
                        WHERE O.ORDC_ID = OD.ORDC_ID AND OD.ARTI_COD = :CODIGO AND (ORDC_FECHA+ORDC_VALIDEZ) >= :FECHA AND ORDC_FECHA <= :FECHA AND OCDE_ANULADO = 'N'
                        INTO :ID, :ITEM, :CANT2
                        do
                        BEGIN
                        EXECUTE PROCEDURE FALTANTE(23, 21, ID, ITEM) returning_values (PEDIDO, UND, FACTOR);
                        if (PEDIDO * FACTOR = CANT2) then /* SI NO SE HA FACTURADO MIRE A VER SI SE REMISIONO */
                            EXECUTE PROCEDURE FALTANTE(23, 22, ID, ITEM) returning_values (PEDIDO, UND, FACTOR);
                        if (PEDIDO IS NULL) then
                            PEDIDO = 0;
                        ORDENC = ORDENC + PEDIDO * FACTOR;
                        END
                    ORDENADO = ORDENADO + ORDENC;
                    SELECT SUM(RSDE_LIBERAR)
                        FROM RESERVAS_DETALLE RD, RESERVAS R
                        WHERE R.RESE_ID = RD.RESE_ID AND ARTI_COD = :CODIGO AND RESE_FECHA <= :FECHA AND RESE_VENCE >= :FECHA AND RSDE_ANULADO = 'N'
                        INTO :RESERVADO;
                    if (RESERVADO IS NULL) then
                        RESERVADO = 0;
                    PEDIDO = 0;
                    FOR SELECT P.PEDI_ID, PEDE_ITEM, PEDE_CANT * PEDE_FACTOR
                        FROM PEDIDOS P, PEDIDOS_DETALLE PD
                        WHERE P.PEDI_ID = PD.PEDI_ID AND PD.ARTI_COD = :CODIGO AND (PEDI_FECHA+PEDI_VALIDEZ) >= :FECHA AND PEDI_FECHA <= :FECHA AND PEDE_ANULADO = 'N'
                        INTO :ID, :ITEM, :CANT2
                        do
                        BEGIN
                        EXECUTE PROCEDURE FALTANTE(34, 31, ID, ITEM) returning_values (ORDENC, UND, FACTOR);
                        if ((ORDENC * FACTOR = CANT2) or (PEDAUTO = 'SI')) then /* SI NO SE HA FACTURADO MIRE A VER SI SE REMISIONO */
                            EXECUTE PROCEDURE FALTANTE(34, 32, ID, ITEM) returning_values (ORDENC, UND, FACTOR);
                        if (ORDENC IS NULL) then
                            ORDENC = 0;
                        PEDIDO = PEDIDO + ORDENC * FACTOR;
                        END
                    RESERVADO = RESERVADO + PEDIDO;
                    END
                ELSE
                    BEGIN
                    RESERVADO = 0;
                    ORDENADO = 0;
                    END
                if (ENPESO = 'S') then
                    BEGIN
                    if (pesounit IS NULL) then
                        pesounit = 0;
                    if (PESOUNIT <> 0) then
                        BEGIN
                        pesototal = PESOUNIT * cant;
                        SUSPEND;
                        END
                    END
                ELSE
                    SUSPEND;
                END
            END
        END
  end
if (DETALLE = 'N') then
  BEGIN
  FOR SELECT ARTI_COD, ARTI_DES, ARTI_UNIDAD, ARTI_EXIST, TAIV_PORC, A.GRUP_COD, A.SUBG_COD, A.MARC_COD, ARTI_CONSUMO, ARTI_PESO/1000
      FROM ARTICULO A, TARIFA_IVA T
      WHERE ARTI_COD >= :CODINI AND ARTI_COD <= :CODFIN AND ARTI_DES >= :DESINI AND ARTI_DES <= :DESFIN AND ESAR_COD <> 'I' AND A.TAIV_COD = T.TAIV_COD
      INTO :CODIGO, :NOMBRE, :UNIDAD, :EXIST, :IVA, :CODGRUPO, :CODSUBG, :CODMARC, :CONSUMO, :pesounit
      DO
        BEGIN
        OK = 'N';
        if (AGRUPA = 'G') then
            BEGIN
            if ((GRPINI = '0') AND (GRPFIN = 'zz')) then
                OK = 'S';
            else
                if ((CODGRUPO >= GRPINI) AND (CODGRUPO <= GRPFIN)) then
                    OK = 'S';
            end
        ELSE
            if (AGRUPA = 'M') then
                BEGIN
                if ((GRPINI = '0') AND (GRPFIN = 'zzz')) then
                    OK = 'S';
                else
                    if ((CODMARC >= GRPINI) AND (CODMARC <= GRPFIN)) then
                        OK = 'S';
                END
        if (OK = 'S') then
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            SELECT MAX(COBA_COD) FROM BARRAS_ARTICULO WHERE ARTI_COD = :codigo AND COBA_UNIDAD = :unidad INTO :codbar;
            if (CODBAR IS NULL) then
                CODBAR = CODIGO;

            if (EXIST <> 'N') then
                BEGIN
                EXECUTE PROCEDURE SALDO_INICIAL_TOTAL_INV(CODIGO, FECHA) returning_values (CANT);
                EXECUTE PROCEDURE COSTO_PROMEDIO_UNIDAD(CODIGO, FECHA, UNIDAD) returning_values (COSTO);
                EXECUTE PROCEDURE ULTIMO_COSTO(CODIGO, FECHA, UNIDAD) returning_values (ULTCOSTO);
                SELECT MAX(MVAR_FECHA) FROM MOVIMIENTO_ARTICULO WHERE ARTI_COD = :CODIGO AND MVAR_ENTRADA = 'S' AND MVAR_FECHA <= :FECHA INTO :FECHACOSTO;
                COSTOTOT = :CANT * :COSTO;
                CONSUMO = CONSUMO * CANT;
                if (RESERVA = 'S') then
                    BEGIN
                    SELECT SUM(ORID_ENTREGAR)
                        FROM ORDENINVENTARIO_DETALLE OD, ordenes_inventario O
                        WHERE O.ORIN_ID = OD.ORIN_ID AND ARTI_COD = :CODIGO AND ORIN_FECHA <= :FECHA AND ORIN_FECLLEGA >= :FECHA AND ORID_ANULADO = 'N'
                        INTO :ORDENADO;
                        if (ORDENADO IS NULL) then
                            ORDENADO = 0;
                    ORDENC = 0;
                    FOR SELECT O.ORDC_ID, OCDE_ITEM, OCDE_CANT * OCDE_FACTOR
                        FROM ORDENES_COMPRA O, ORDENES_COMPRA_DETALLE OD
                        WHERE O.ORDC_ID = OD.ORDC_ID AND OD.ARTI_COD = :CODIGO AND (ORDC_FECHA+ORDC_VALIDEZ) >= :FECHA AND ORDC_FECHA <= :FECHA AND OCDE_ANULADO = 'N'
                        INTO :ID, :ITEM, :CANT2
                        do
                        BEGIN
                        EXECUTE PROCEDURE FALTANTE(23, 21, ID, ITEM) returning_values (PEDIDO, UND, FACTOR);
                        if (PEDIDO * FACTOR = CANT2) then /* SI NO SE HA FACTURADO MIRE A VER SI SE REMISIONO */
                            EXECUTE PROCEDURE FALTANTE(23, 22, ID, ITEM) returning_values (PEDIDO, UND, FACTOR);
                        if (PEDIDO IS NULL) then
                            PEDIDO = 0;
                        ORDENC = ORDENC + PEDIDO * FACTOR;
                        END
                    ORDENADO = ORDENADO + ORDENC;
                    SELECT SUM(RSDE_LIBERAR)
                        FROM RESERVAS_DETALLE RD, RESERVAS R
                        WHERE R.RESE_ID = RD.RESE_ID AND ARTI_COD = :CODIGO AND RESE_FECHA <= :FECHA AND RESE_VENCE >= :FECHA AND RSDE_ANULADO = 'N'
                        INTO :RESERVADO;
                    if (RESERVADO IS NULL) then
                        RESERVADO = 0;
                    PEDIDO = 0;
                    FOR SELECT P.PEDI_ID, PEDE_ITEM, PEDE_CANT * PEDE_FACTOR
                        FROM PEDIDOS P, PEDIDOS_DETALLE PD, PUNTO_VENTA PT
                        WHERE P.PEDI_ID = PD.PEDI_ID AND PD.ARTI_COD = :CODIGO AND PT.ptvt_id = P.PTVT_ID AND (PEDI_FECHA+PEDI_VALIDEZ) >= :FECHA AND PEDI_FECHA <= :FECHA AND PEDE_ANULADO = 'N'
                        INTO :ID, :ITEM, :CANT2
                        do
                        BEGIN
                        EXECUTE PROCEDURE FALTANTE(34, 31, ID, ITEM) returning_values (ORDENC, UND, FACTOR);
                        if ((ORDENC * FACTOR = CANT2) or (PEDAUTO = 'SI')) then /* SI NO SE HA FACTURADO MIRE A VER SI SE REMISIONO */
                            EXECUTE PROCEDURE FALTANTE(34, 32, ID, ITEM) returning_values (ORDENC, UND, FACTOR);
                        if (ORDENC IS NULL) then
                            ORDENC = 0;
                        PEDIDO = PEDIDO + ORDENC * FACTOR;
                        END
                    if (PEDIDO IS NULL) then
                        PEDIDO = 0;
                    RESERVADO = RESERVADO + PEDIDO;
                    END
                ELSE
                    BEGIN
                    RESERVADO = 0;
                    ORDENADO = 0;
                    END
                if (ENPESO = 'S') then
                    BEGIN
                    if (pesounit IS NULL) then
                        pesounit = 0;
                    if (PESOUNIT <> 0) then
                        BEGIN
                        pesototal = PESOUNIT * cant;
                        SUSPEND;
                        END
                    END
                ELSE
                    SUSPEND;
                END
            END
        END
  END
END
^

SET TERM ; ^

SET TERM ^ ;

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

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER PROCEDURE IMPR_ENTRADA(
    ID INTEGER)
RETURNS (
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    CONCEPTO VARCHAR(60),
    REFER VARCHAR(60),
    CODBODEGA VARCHAR(2),
    NOMBODEGA VARCHAR(30),
    NOMTERCERO VARCHAR(60),
    OBS BLOB SUB_TYPE 1 SEGMENT SIZE 80,
    ITEM INTEGER,
    ARTICULO VARCHAR(15),
    CODBAR VARCHAR(15),
    ARTIDES VARCHAR(60),
    CANT NUMERIC(18,4),
    UNIDAD VARCHAR(8),
    BODITEM VARCHAR(2),
    STAND VARCHAR(15),
    COSTO NUMERIC(18,2),
    DTOPORC NUMERIC(9,2),
    DTOMONTO NUMERIC(18,2),
    IVAPORC NUMERIC(9,2),
    IVAMONTO NUMERIC(18,2),
    CONSUMO NUMERIC(18,2),
    TOTAL NUMERIC(18,2),
    PRECIO NUMERIC(18,2),
    LOTE VARCHAR(15),
    PESOUNIT NUMERIC(18,4),
    PESOTOT NUMERIC(18,4),
    VOLUMUNIT NUMERIC(18,4),
    VOLUMTOT NUMERIC(18,4),
    TOTALDOC NUMERIC(18,2),
    CONSUMODOC NUMERIC(18,2),
    TOTALMASIMP NUMERIC(18,2))
AS
declare variable IMPTOS CHAR(1);
declare variable LARGO NUMERIC(18,4);
declare variable ANCHO NUMERIC(18,4);
declare variable ALTO NUMERIC(18,4);
declare variable LISTA CHAR(3);
BEGIN
  /*  */
  PESOTOT = 0;
  VOLUMTOT = 0;
  SELECT PREF_PRE, ENTR_NUMERO, ENTR_FECHA, ENTR_CONC, ENTR_REFER, E.BODE_COD, BODE_NOM, ENTR_NOMTERC, ENTR_IMPTOS, ENTR_OBS
    FROM ENTRADAS E, BODEGA B
    WHERE E.BODE_COD = B.BODE_COD AND E.ENTR_ID = :ID
    into :PREF, :NUMERO, :FECHA, :CONCEPTO, :REFER, :CODBODEGA, :NOMBODEGA, :NOMTERCERO, :IMPTOS, :OBS;
  SELECT SUM(ENDE_TOTAL), SUM(ENDE_IVAMONTO), SUM(ENDE_CONSUMO*ENDE_CANT*ENDE_FACTOR) FROM ENTRADAS_DETALLE
    WHERE ENTR_ID = :ID INTO :TOTALDOC, :IVAMONTO, :CONSUMODOC;
  TOTALMASIMP = TOTALDOC + CONSUMODOC;
  if (IMPTOS = 'N') then
    TOTALDOC = TOTALDOC - IVAMONTO;
    
  FOR SELECT ENDE_ITEM, A.ARTI_COD, ENDE_CODBAR, SUBSTR(ENDE_DESC,1,60), ENDE_CANT, ENDE_UNIDAD, BODE_COD, ENDE_COSTO, ENDE_DTOPORC, ENDE_DTOMONTO, ENDE_IVAPORC, ENDE_IVAMONTO, ENDE_CONSUMO, ENDE_TOTAL, ENDE_LOTE,
    (ARTI_PESO * ENDE_CANT * ENDE_FACTOR / 1000), (ARTI_LARGO * ENDE_FACTOR / 100), (ARTI_ANCHO * ENDE_FACTOR / 100), (ARTI_ALTO * ENDE_FACTOR / 100)
    FROM ENTRADAS_DETALLE D, ARTICULO A
    WHERE D.ARTI_COD = A.ARTI_COD AND D.ENTR_ID = :ID
    ORDER BY ENDE_ITEM
    INTO :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :BODITEM, :COSTO, :DTOPORC, :DTOMONTO, :IVAPORC, :IVAMONTO, :CONSUMO, :TOTAL, :LOTE, :PESOUNIT, :LARGO, :ANCHO, :ALTO
    DO
      BEGIN
      EXECUTE PROCEDURE LEE_CONFIGURACION('INVENTARIO','DOCUMENTOS','CODIGO DE LISTA DE PRECIOS A IMPRIMIR EN DOCUMENTOS') returning_values (:LISTA);
      if (NOT lista IS NULL) then
          SELECT PRAR_FIJO FROM PRECIOS_ARTICULO WHERE ARTI_COD = :articulo AND LIPR_COD = :LISTA INTO :PRECIO;
      if (PESOUNIT IS NULL) then
        PESOUNIT = 0;
      PESOTOT = PESOTOT + PESOUNIT;
      VOLUMUNIT = ANCHO * ALTO * LARGO;
      volumunit = VOLUMUNIT * CANT;
      if (VOLUMUNIT IS NULL) then
        VOLUMUNIT = 0;
      VOLUMTOT = VOLUMTOT + VOLUMUNIT;
      if (IMPTOS = 'N') then
        TOTAL = TOTAL - IVAMONTO;
      SELECT STAND_COD FROM STANDS WHERE ARTI_COD = :ARTICULO AND STAND_BODEGA = :boditem INTO :stand;
      SUSPEND;
      END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER PROCEDURE IMPR_FACTCOMP(
    ID INTEGER)
RETURNS (
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    VENCE DATE,
    DIASVENCE INTEGER,
    NIT VARCHAR(20),
    NOMTERCERO VARCHAR(60),
    SIMPLIFICADO VARCHAR(15),
    CODBODEGA VARCHAR(2),
    NOMBODEGA VARCHAR(30),
    NUMPROV VARCHAR(10),
    COTIZACION VARCHAR(30),
    PEDIDO VARCHAR(30),
    REMISION VARCHAR(30),
    SUBTOTAL NUMERIC(18,2),
    DTOPORC NUMERIC(9,2),
    DTOMONTO NUMERIC(18,2),
    ADICIONAL NUMERIC(18,2),
    IVAMONTO NUMERIC(18,2),
    RTEFTEPORC NUMERIC(9,2),
    RTEFTEMONTO NUMERIC(18,2),
    RTEIVAPORC NUMERIC(9,2),
    RTEIVAMONTO NUMERIC(18,2),
    RTEICAPORC NUMERIC(9,2),
    RTEICAMONTO NUMERIC(18,2),
    EXTRA NUMERIC(18,2),
    DTOFPORC NUMERIC(9,2),
    DTOFMONTO NUMERIC(18,2),
    FECHADTO DATE,
    TOTALFAC NUMERIC(18,2),
    TOTALPAGAR NUMERIC(18,2),
    OBS BLOB SUB_TYPE 1 SEGMENT SIZE 80,
    ITEM INTEGER,
    ARTICULO VARCHAR(15),
    CODBAR VARCHAR(15),
    ARTIDES VARCHAR(60),
    ARTIPROV VARCHAR(15),
    CANT NUMERIC(18,4),
    LOTE VARCHAR(15),
    UNIDAD VARCHAR(8),
    REFITEM VARCHAR(60),
    BODITEM VARCHAR(2),
    STAND VARCHAR(15),
    PRUNIT NUMERIC(18,2),
    DTOITPORC NUMERIC(9,2),
    DTOITMONTO NUMERIC(18,2),
    PRNETO NUMERIC(18,2),
    IVAPORC NUMERIC(9,2),
    IVAITMONTO NUMERIC(18,2),
    CONSUMO NUMERIC(18,2),
    SUBTOTIT NUMERIC(18,2),
    SUBTOTITCON NUMERIC(18,2),
    TOTAL NUMERIC(18,2),
    CODIGOPR VARCHAR(20),
    ZONACOD VARCHAR(2),
    ZONANOM VARCHAR(60),
    DV CHAR(1),
    DIRECCION VARCHAR(60),
    CIUDAD VARCHAR(40),
    TELEFONO VARCHAR(40),
    CONTACTO VARCHAR(60),
    FAX VARCHAR(25),
    GRUPO VARCHAR(2),
    SUBGRUPO VARCHAR(3),
    MARCA VARCHAR(3),
    PESO NUMERIC(9,4),
    ANCHO NUMERIC(18,4),
    ALTO NUMERIC(18,4),
    LARGO NUMERIC(18,4),
    SUMA1 NUMERIC(18,2),
    SUMA2 NUMERIC(18,2),
    SUMA3 NUMERIC(18,2),
    IVA1 NUMERIC(18,2),
    IVA2 NUMERIC(18,2),
    IVA3 NUMERIC(18,2),
    TOTCONSUMO NUMERIC(18,2),
    SUMAEX NUMERIC(18,2),
    SUMAGR NUMERIC(18,2))
AS
declare variable IMPTOS CHAR(1);
declare variable TARIFA INTEGER;
declare variable SIMPLIFICA CHAR(1);
declare variable orden char(2);
BEGIN
  SELECT PREF_PRE, FACO_NUMERO, FACO_FECHA, FACO_VENCE, F.BODE_COD, BODE_NOM, F.TERC_NIT, TERC_NOM, FACO_NUMPROV, FACO_COTIZACI, FACO_ORDEN, FACO_REMISION, FACO_IMPTOS,
    FACO_DTOPORC, FACO_DTOMONTO, FACO_ADICIONAL, FACO_IVAMONTO, FACO_RTFTEPORC, FACO_RTFTEMONTO, FACO_RTIVAPOR, FACO_RTIVAMONTO, FACO_RTICAPOR, FACO_RTICAMONTO,
    FACO_EXTRA, FACO_DTOFPOR, FACO_DTOFMONTO, FACO_DTOFFECHA, FACO_TOTAL, TERC_DIR, TERC_CIU, TERC_TEL, TERC_CONTACTO, TERC_FAX, TERC_DV,
    FACO_OBS, FACO_SIMPLIFICADO
    FROM FACTURAS_COMPRA F, BODEGA B, TERCEROS T
    WHERE F.BODE_COD = B.BODE_COD AND F.TERC_NIT = T.TERC_NIT AND F.FACO_ID = :ID
    into :PREF, :NUMERO, :FECHA, :VENCE, :CODBODEGA, :NOMBODEGA, :NIT, :NOMTERCERO, :NUMPROV, :COTIZACION, :PEDIDO, :REMISION, :IMPTOS,
    :DTOPORC, :DTOMONTO, :ADICIONAL, :IVAMONTO, :RTEFTEPORC, :RTEFTEMONTO, :RTEIVAPORC, :RTEIVAMONTO, :RTEICAPORC, :RTEICAMONTO, :EXTRA, :DTOFPORC, :DTOFMONTO, :FECHADTO, :TOTALFAC,
    :DIRECCION, :CIUDAD, :TELEFONO, :CONTACTO, :FAX, :DV, :OBS, :SIMPLIFICA;
    
    if (SIMPLIFICA = 'N') then
         SIMPLIFICADO = 'COMUN';
    ELSE
        SIMPLIFICADO = 'SIMPLIFICADO';

  SELECT PROV_COD, P.GRPR_COD, GRPR_NOM
    FROM PROVEEDORES P, GRUPOS_PROVEEDORES G
    WHERE TERC_NIT = :NIT AND G.GRPR_COD = P.GRPR_COD
    INTO :CODIGOPR, :ZONACOD, :ZONANOM;

  DIASVENCE = VENCE - FECHA;
  SUBTOTAL = TOTALFAC - EXTRA - IVAMONTO - ADICIONAL + DTOMONTO;
  TOTALPAGAR = TOTALFAC - RTEFTEMONTO - RTEIVAMONTO - RTEICAMONTO;
  SUMAEX = 0;
  SUMA1 = 0;
  SUMA2 = 0;
  SUMA3 = 0;
  IVA1 = 0;
  IVA2 = 0;
  IVA3 = 0;
  TOTCONSUMO = 0;

execute procedure lee_configuracion('COMPRAS', 'DOCUMENTOS', 'ORDENAR ITEMS POR BODEGA AL IMPRIMIR DOCUMENTOS') returning_values (:Orden);
if (orden = 'NO') then
  BEGIN
  FOR SELECT FCDE_ITEM, D.ARTI_COD, FCDE_CODBAR, SUBSTR(FCDE_DESC,1,60), FCDE_CANT, FCDE_UNIDAD, BODE_COD, FCDE_LOTE, FCDE_PRUNIT,
    FCDE_DTOPORC, FCDE_DTOMONTO, FCDE_IVAPORC, FCDE_IVAMONTO, FCDE_CONSUMO, FCDE_TOTAL,
    GRUP_COD, SUBG_COD, MARC_COD, ARTI_PESO, ARTI_ANCHO, ARTI_ALTO, ARTI_LARGO, TAIV_COD, FCDE_CODPROV, FCDE_REFERENCIA
    FROM FACTURAS_COMPRAS_DETALLE D, ARTICULO A
    WHERE D.ARTI_COD = A.ARTI_COD AND D.FACO_ID = :ID
    ORDER BY FCDE_ITEM
    INTO :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :BODITEM, :LOTE, :PRUNIT,
    :DTOITPORC, :DTOITMONTO, :IVAPORC, :IVAITMONTO, :CONSUMO, :TOTAL,
    :GRUPO, :SUBGRUPO, :MARCA, :PESO, :ANCHO, :ALTO, :LARGO, :TARIFA, :ARTIPROV, :REFITEM
    DO
      BEGIN
      PRNETO = PRUNIT - DTOITMONTO - ((IVAITMONTO+CONSUMO) / CANT);
      SUBTOTIT = TOTAL - IVAITMONTO - CONSUMO;
      SUBTOTITCON = TOTAL;
      TOTCONSUMO = TOTCONSUMO + CONSUMO;
      if (IVAPORC = 0) then
        SUMAEX = SUMAEX + TOTAL;
      if (TARIFA = 1) then
        BEGIN
        SUMA1 = SUMA1 + TOTAL - IVAITMONTO;
        IVA1 = IVA1 + IVAITMONTO;
        END
      if (TARIFA = 2) then
        BEGIN
        SUMA2 = SUMA2 + TOTAL - IVAITMONTO;
        IVA2 = IVA2 + IVAITMONTO;
        END
      if (TARIFA = 3) then
        BEGIN
        SUMA3 = SUMA3 + TOTAL - IVAITMONTO;
        IVA3 = IVA3 + IVAITMONTO;
        END
      SUMAGR = SUMA1 + SUMA2 + SUMA3;
      if (IMPTOS = 'N') then
        TOTAL = TOTAL - IVAITMONTO - CONSUMO;
      SELECT STAND_COD FROM STANDS WHERE ARTI_COD = :ARTICULO AND STAND_BODEGA = :boditem INTO :stand;
      SUSPEND;
      END
  END
ELSE
  BEGIN
  FOR SELECT FCDE_ITEM, D.ARTI_COD, FCDE_CODBAR, SUBSTR(FCDE_DESC,1,60), FCDE_CANT, FCDE_UNIDAD, BODE_COD, FCDE_LOTE, FCDE_PRUNIT,
    FCDE_DTOPORC, FCDE_DTOMONTO, FCDE_IVAPORC, FCDE_IVAMONTO, FCDE_CONSUMO, FCDE_TOTAL,
    GRUP_COD, SUBG_COD, MARC_COD, ARTI_PESO, ARTI_ANCHO, ARTI_ALTO, ARTI_LARGO, TAIV_COD, FCDE_CODPROV, FCDE_REFERENCIA
    FROM FACTURAS_COMPRAS_DETALLE D, ARTICULO A
    WHERE D.ARTI_COD = A.ARTI_COD AND D.FACO_ID = :ID
    ORDER BY D.bode_cod, FCDE_ITEM
    INTO :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :BODITEM, :LOTE, :PRUNIT,
    :DTOITPORC, :DTOITMONTO, :IVAPORC, :IVAITMONTO, :CONSUMO, :TOTAL,
    :GRUPO, :SUBGRUPO, :MARCA, :PESO, :ANCHO, :ALTO, :LARGO, :TARIFA, :ARTIPROV, :REFITEM
    DO
      BEGIN
      PRNETO = PRUNIT - DTOITMONTO - ((IVAITMONTO+CONSUMO) / CANT);
      SUBTOTIT = TOTAL - IVAITMONTO - CONSUMO;
      SUBTOTITCON = TOTAL;
      TOTCONSUMO = TOTCONSUMO + CONSUMO;
      if (IVAPORC = 0) then
        SUMAEX = SUMAEX + TOTAL;
      if (TARIFA = 1) then
        BEGIN
        SUMA1 = SUMA1 + TOTAL - IVAITMONTO;
        IVA1 = IVA1 + IVAITMONTO;
        END
      if (TARIFA = 2) then
        BEGIN
        SUMA2 = SUMA2 + TOTAL - IVAITMONTO;
        IVA2 = IVA2 + IVAITMONTO;
        END
      if (TARIFA = 3) then
        BEGIN
        SUMA3 = SUMA3 + TOTAL - IVAITMONTO;
        IVA3 = IVA3 + IVAITMONTO;
        END
      SUMAGR = SUMA1 + SUMA2 + SUMA3;
      if (IMPTOS = 'N') then
        TOTAL = TOTAL - IVAITMONTO - CONSUMO;
      SELECT STAND_COD FROM STANDS WHERE ARTI_COD = :ARTICULO AND STAND_BODEGA = :boditem INTO :stand;
      SUSPEND;
      END
  END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER PROCEDURE IMPR_FACTURA(
    ID INTEGER)
RETURNS (
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    VENCE DATE,
    DIASVENCE INTEGER,
    CONTCRED CHAR(17),
    NIT VARCHAR(20),
    NOMTERCERO VARCHAR(60),
    NOMCLIENTE VARCHAR(60),
    VENDEDOR INTEGER,
    NOMVENDEDOR VARCHAR(60),
    PUNTOVTA INTEGER,
    NOMPUNTOVTA VARCHAR(30),
    CODBODEGA VARCHAR(2),
    NOMBODEGA VARCHAR(30),
    AUTORIZACION VARCHAR(20),
    DESPACHO VARCHAR(255),
    TRANSPORTADOR VARCHAR(60),
    COTIZACION VARCHAR(30),
    PEDIDO VARCHAR(30),
    REMISION VARCHAR(30),
    PACIENTE VARCHAR(20),
    NOMPACIENTE VARCHAR(60),
    COMIPORC NUMERIC(9,2),
    COMIMONTO NUMERIC(18,2),
    SUBTOTAL NUMERIC(18,2),
    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),
    EXTRA NUMERIC(18,2),
    DTOFPORC NUMERIC(9,2),
    DTOFMONTO NUMERIC(18,2),
    FECHADTO DATE,
    TOTALFAC NUMERIC(18,2),
    TOTALPAGAR NUMERIC(18,2),
    OBS BLOB SUB_TYPE 1 SEGMENT SIZE 80,
    ITEM INTEGER,
    ARTICULO VARCHAR(15),
    CODBAR VARCHAR(15),
    ARTIDES VARCHAR(60),
    DESCORTA VARCHAR(30),
    CANT NUMERIC(18,4),
    LOTE VARCHAR(15),
    VLOTE DATE,
    UNIDAD VARCHAR(8),
    CAJAS NUMERIC(18,4),
    FACTOR INTEGER,
    LISTAPR INTEGER,
    REFITEM VARCHAR(60),
    BODITEM VARCHAR(2),
    STAND VARCHAR(15),
    PRUNIT NUMERIC(18,2),
    DTOITPORC NUMERIC(9,2),
    DTOITMONTO NUMERIC(18,2),
    PRNETO NUMERIC(18,2),
    IVAPORC NUMERIC(9,2),
    IVAITMONTO NUMERIC(18,2),
    CONSUMO NUMERIC(18,2),
    SUBTOTIT NUMERIC(18,2),
    SUBTOTITCON NUMERIC(18,2),
    DTOIT1 NUMERIC(9,2),
    DTOIT2 NUMERIC(9,2),
    DTOIT3 NUMERIC(9,2),
    TOTAL NUMERIC(18,2),
    CODIGOCL VARCHAR(20),
    ZONACOD VARCHAR(2),
    ZONANOM VARCHAR(60),
    DV CHAR(1),
    DIRECCION VARCHAR(60),
    CIUDAD VARCHAR(40),
    TELEFONO VARCHAR(40),
    CONTACTO VARCHAR(60),
    FAX VARCHAR(25),
    GRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    SUBGRUPO VARCHAR(3),
    NOMSUBG VARCHAR(30),
    MARCA VARCHAR(3),
    NOMMARCA VARCHAR(30),
    PESO NUMERIC(18,4),
    ANCHO NUMERIC(18,4),
    ALTO NUMERIC(18,4),
    LARGO NUMERIC(18,4),
    SUMA1 NUMERIC(18,2),
    SUMA2 NUMERIC(18,2),
    SUMA3 NUMERIC(18,2),
    IVA1 NUMERIC(18,2),
    IVA2 NUMERIC(18,2),
    IVA3 NUMERIC(18,2),
    SUMAEX NUMERIC(18,2),
    SUMAGR NUMERIC(18,2),
    TOTCONSUMO NUMERIC(18,2),
    DTOIT1M NUMERIC(18,2),
    DTOIT2M NUMERIC(18,2),
    DTOIT3M NUMERIC(18,2),
    TOTCAJAS NUMERIC(18,2),
    VEHICULO VARCHAR(8),
    RECIBIDO NUMERIC(18,2),
    CAMBIO NUMERIC(18,2),
    HORA TIME,
    FORMAPAGO1 VARCHAR(30),
    MONTOPAGO1 NUMERIC(18,2),
    FORMAPAGO2 VARCHAR(30),
    MONTOPAGO2 NUMERIC(18,2),
    FORMAPAGO3 VARCHAR(30),
    MONTOPAGO3 NUMERIC(18,2),
    PUNTOS INTEGER,
    PUNTOSACUM INTEGER,
    PUNTOSVENC INTEGER,
    FECPTOS DATE,
    OBSITEM BLOB SUB_TYPE 1 SEGMENT SIZE 80,
    SUCUR VARCHAR(10))
AS
DECLARE VARIABLE IMPTOS CHAR(1);
DECLARE VARIABLE TARIFA INTEGER;
declare variable DEVUELTO NUMERIC(18,2);
/*DECLARE VARIABLE NROCOPIA INTEGER;*/
declare variable ORDENCOD CHAR(2);
declare variable IMPRDEV CHAR(2);
declare variable IMPR CHAR(1);
declare variable ITEMFP INTEGER;
declare variable FORMAP VARCHAR(30);
declare variable MONTOP NUMERIC(18,2);
BEGIN
  SELECT F.PREF_PRE, FACT_NUMERO, FACT_FECHA, FACT_VENCE, F.BODE_COD, BODE_NOM, F.TERC_NIT, FACT_NOMCLIENTE, F.VEND_COD, VEND_NOMBRE, F.PTVT_ID, PTVT_NOM,
    AUTO_NUMERO, FACT_DESPACHO, FACT_TRANSP, FACT_COTIZACI, FACT_PEDIDO, FACT_REMISION, FACT_COMIPORC, FACT_COMIMONTO, FACT_IVAINC, 
    FACT_DTOPOR, FACT_DTOMONTO, FACT_ADICIONAL, FACT_IVAMONTO, FACT_RTFTEPOR, FACT_RTFTEMONTO, FACT_RTIVAPOR, FACT_RTIVAMONTO, FACT_RTICAPOR, FACT_RTICAMONTO, FACT_EXTRA, FACT_DTOFPOR, FACT_DTOFMONTO, FACT_DTOFFECHA, FACT_TOTAL,
    TERC_DIR, TERC_CIU, TERC_TEL, TERC_CONTACTO, TERC_FAX, TERC_DV, FACT_DTOIT1, FACT_DTOIT2, FACT_DTOIT3,
    FACT_OBS, VEHI_COD, /*FACT_NROCOPIA,*/ FACT_RECIBIDO, FACT_SUCURSAL, FACT_DETCLI, FACT_DETCLINOM, TERC_NOM
    FROM FACTURAS F, BODEGA B, VENDEDORES V, PUNTO_VENTA P, TERCEROS T
    WHERE F.BODE_COD = B.BODE_COD AND F.VEND_COD = V.VEND_COD AND F.PTVT_ID = P.PTVT_ID AND F.TERC_NIT = T.TERC_NIT AND F.FACT_ID = :ID
    into :PREF, :NUMERO, :FECHA, :VENCE, :CODBODEGA, :NOMBODEGA, :NIT, :NOMTERCERO, :VENDEDOR, :NOMVENDEDOR, :PUNTOVTA, :NOMPUNTOVTA,
    :AUTORIZACION, :DESPACHO, :TRANSPORTADOR, :COTIZACION, :PEDIDO, :REMISION, :COMIPORC, :COMIMONTO, :IMPTOS,
    :DTOPORC, :DTOMONTO, :ADICIONAL, :IVAMONTO, :RTEFTEPORC, :RTEFTEMONTO, :RTEIVAPORC, :RTEIVAMONTO, :RTEICAPORC, :RTEICAMONTO, :EXTRA, :DTOFPORC, :DTOFMONTO, :FECHADTO, :TOTALFAC,
    :DIRECCION, :CIUDAD, :TELEFONO, :CONTACTO, :FAX, :DV, :dtoit1m, :dtoit2m, :dtoit3m,
    :OBS, :VEHICULO,/* :NROCOPIA,*/ :RECIBIDO, :SUCUR, :paciente, :nompaciente, :nomcliente;

  /* ACUMULE LOS PUNTOS, SE HACE ACA POR SER POSTERIOR AL DETALLE */
  EXECUTE PROCEDURE acumula_puntos_cliente (31, :id, :nit, :fecha) returning_values (:PUNTOS);
  EXECUTE PROCEDURE consulta_puntos_cliente (:id, :nit, :fecha) returning_values (:puntos, :puntosacum, :puntosvenc, :fecptos);

  SELECT CLIE_COD, C.ZONA_COD, ZONA_NOM
    FROM CLIENTES C, ZONAS Z
    WHERE TERC_NIT = :NIT AND C.ZONA_COD = Z.ZONA_COD
    INTO :CODIGOCL, :ZONACOD, :ZONANOM;
  /*SELECT NOCO_NOMBRE FROM NOMBRES_COPIAS where NOCO_ID = :NROCOPIA INTO :NOMCOPIA;*/
  SELECT CLSU_DIR, CLSU_CIUDAD, CLSU_TEL FROM CLIENTE_SUCURSALES WHERE TERC_NIT = :NIT AND CLCU_COD = :SUCUR
    INTO :DIRECCION, :CIUDAD, :TELEFONO;
  /*if (NOMCOPIA IS NULL) then
    NOMCOPIA = 'COPIA No. ' || NROCOPIA;**/
  DIASVENCE = VENCE - FECHA;
  if (DIASVENCE > 0) then
    CONTCRED = 'CREDITO ' || CAST(DIASVENCE AS VARCHAR(3)) || ' DIAS';
  ELSE
    CONTCRED = 'CONTADO';
  SUBTOTAL = TOTALFAC - EXTRA - IVAMONTO - ADICIONAL + DTOMONTO;
  TOTALPAGAR = TOTALFAC - RTEFTEMONTO - RTEIVAMONTO - RTEICAMONTO;
  if (RECIBIDO <> 0) then
      CAMBIO = RECIBIDO - totalpagar;
  ELSE
    CAMBIO = 0;
  SUMAEX = 0;
  SUMA1 = 0;
  SUMA2 = 0;
  SUMA3 = 0;
  IVA1 = 0;
  IVA2 = 0;
  IVA3 = 0;
  TOTCONSUMO = 0;
  MONTOPAGO1 = 0;
  SELECT MAX(AUDI_HORA) FROM AUDITORIA WHERE TIDO_COD = 31 AND AUDI_IDDOC = :ID AND AUDI_OPER = 'I' INTO :HORA;
  /* AHORA LAS FORMAS DE PAGO, BUSQUE EL ABONO DE HOY A LA FACTURA */
  ITEMFP = 1;
  MONTOPAGO1 = 0;
  MONTOPAGO2 = 0;
  MONTOPAGO3 = 0;
  FOR SELECT FOPA_NOM, RCPA_MONTO FROM RECIBOS_CAJA_PAGO P, FORMAS_PAGO F, RECIBOS_CAJA R, RECIBOS_CAJA_DETALLE D
    WHERE R.RECA_ID = P.RECA_ID AND R.RECA_ID = D.RECA_ID AND P.FOPA_ID = F.FOPA_ID AND RECA_FECHA = :FECHA AND RCDE_TIPODOC = 31 AND RCDE_IDDOC = :ID
    INTO :formap, :MONTOP
    DO
    BEGIN
    if (ITEMFP = 1) then
        BEGIN
        FORMAPAGO1 = FORMAP;
        MONTOPAGO1 = MONTOP;
        END
    if (ITEMFP = 2) then
        BEGIN
        FORMAPAGO2 = FORMAP;
        MONTOPAGO2 = MONTOP;
        END
    if (ITEMFP = 3) then
        BEGIN
        FORMAPAGO3 = FORMAP;
        MONTOPAGO3 = MONTOP;
        END
    ITEMFP = ITEMFP + 1;
    END
  EXECUTE PROCEDURE lee_configuracion ('FACTURACION','DOCUMENTOS','ORDENAR ITEMS POR CODIGO DE ARTICULO') returning_values (:ORDENCOD);
  EXECUTE PROCEDURE lee_configuracion ('FACTURACION','POS', 'IMPRIMIR DEVOLUCIONES DE ARTICULOS NEGATIVOS') returning_values (:imprdev);
  totcajas = 0;
  if (ORDENCOD = 'SI') then
    BEGIN
    FOR SELECT FADE_ITEM, D.ARTI_COD, FADE_CODBAR, SUBSTR(FADE_DESC,1,60), ARTI_DESCORTA, FADE_CANT, FADE_UNIDAD, FADE_FACTOR, BODE_COD, FADE_LOTE, LIPR_COD, FADE_PRUNIT, FADE_DTOPORC, FADE_DTOMONTO, FADE_IVAPORC, FADE_IVAMONTO, FADE_CONSUMO, FADE_TOTAL, FADE_REFERENCIA,
        GRUP_COD, SUBG_COD, MARC_COD, ARTI_PESO, ARTI_ANCHO, ARTI_ALTO, ARTI_LARGO, TAIV_COD, FADE_DEVUELTO, FADE_OBS, FADE_DTO1, FADE_DTO2, FADE_DTO3, FADE_CAJAS
        FROM FACTURAS_DETALLE D, ARTICULO A
        WHERE D.ARTI_COD = A.ARTI_COD AND D.FACT_ID = :ID
        ORDER BY D.ARTI_COD
        INTO :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :DESCORTA, :CANT, :UNIDAD, :FACTOR, :BODITEM, :LOTE, :LISTAPR, :PRUNIT, :DTOITPORC, :DTOITMONTO, :IVAPORC, :IVAITMONTO, :CONSUMO, :TOTAL, :refitem,
        :GRUPO, :SUBGRUPO, :MARCA, :PESO, :ANCHO, :ALTO, :LARGO, :TARIFA, :devuelto, :obsitem, :dtoit1, :dtoit2, :dtoit3, :cajas
        DO
          BEGIN
          if (ARTICULO = CODBAR) then
            SELECT FIRST 1 COBA_COD FROM barras_articulo WHERE ARTI_COD = :articulo INTO :CODBAR;
          if (IMPRDEV <> 'SI') then
            BEGIN
            if ((CANT >= 0) AND (DEVUELTO = 0)) then
                IMPR = 'S';
            ELSE
                IMPR = 'N'; /* ES DEVOLUCION */
            END
          ELSE
            IMPR = 'S';
          if (IMPR = 'S') then
            BEGIN
            if (IMPTOS = 'S') then
                if (cant <> 0) then
                    PRNETO = PRUNIT - DTOITMONTO - ((IVAITMONTO+CONSUMO) / CANT);
                else
                    PRNETO = PRUNIT - DTOITMONTO;
            ELSE
                PRNETO = PRUNIT - DTOITMONTO;
            SUBTOTIT = TOTAL - IVAITMONTO - CONSUMO;
            SUBTOTITCON = TOTAL;
            TOTCONSUMO = TOTCONSUMO + CONSUMO;
            SELECT LOTE_VENCE FROM LOTES WHERE LOTE_NRO = :lote AND ARTI_COD = :ARTICULO AND BODE_COD = :boditem INTO :vlote;
            if ((REFITEM <> '.t') or (REFITEM IS NULL)) then
                BEGIN
                /* NO SUME LOS ENSAMBLES */
                if (IVAPORC = 0) then
                    SUMAEX = SUMAEX + TOTAL;
                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;
                END
            if (IMPTOS = 'N') then
                TOTAL = TOTAL - IVAITMONTO - CONSUMO;
            if (ANCHO IS NULL) then
                ANCHO = 0;
            if (ALTO IS NULL) then
                ALTO = 0;
            if (LARGO IS NULL) then
                LARGO = 0;
            if (PESO IS NULL) then
                PESO = 0;
            PESO = PESO * CANT;
            totcajas = totcajas + cajas;
            if (substr(ARTICULO,1,2) = '.t') then
                BEGIN
                REFITEM = '';
                TOTAL = 0;
                SUBTOTIT = 0;
                SUBTOTITCON = 0;
                END
            SELECT STAND_COD FROM STANDS WHERE ARTI_COD = :ARTICULO AND STAND_BODEGA = :boditem INTO :stand;
            SUSPEND;
            END
          END
    END
ELSE
    BEGIN
    FOR SELECT FADE_ITEM, D.ARTI_COD, FADE_CODBAR, SUBSTR(FADE_DESC,1,60), ARTI_DESCORTA, FADE_CANT, FADE_UNIDAD, FADE_FACTOR, BODE_COD, FADE_LOTE, LIPR_COD, FADE_PRUNIT, FADE_DTOPORC, FADE_DTOMONTO, FADE_IVAPORC, FADE_IVAMONTO, FADE_CONSUMO, FADE_TOTAL, FADE_REFERENCIA,
        GRUP_COD, SUBG_COD, MARC_COD, ARTI_PESO, ARTI_ANCHO, ARTI_ALTO, ARTI_LARGO, TAIV_COD, FADE_DEVUELTO, FADE_OBS, FADE_DTO1, FADE_DTO2, FADE_DTO3, FADE_CAJAS
        FROM FACTURAS_DETALLE D, ARTICULO A
        WHERE D.ARTI_COD = A.ARTI_COD AND D.FACT_ID = :ID
        ORDER BY FADE_ITEM
        INTO :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :DESCORTA, :CANT, :UNIDAD, :FACTOR, :BODITEM, :LOTE, :LISTAPR, :PRUNIT, :DTOITPORC, :DTOITMONTO, :IVAPORC, :IVAITMONTO, :CONSUMO, :TOTAL, :refitem,
        :GRUPO, :SUBGRUPO, :MARCA, :PESO, :ANCHO, :ALTO, :LARGO, :TARIFA, :devuelto, :obsitem, :dtoit1, :dtoit2, :dtoit3, :cajas
        DO
          BEGIN
          if (IMPRDEV <> 'SI') then
            BEGIN
            if ((CANT >= 0) AND (DEVUELTO = 0)) then
                IMPR = 'S';
            ELSE
                IMPR = 'N'; /* ES DEVOLUCION */
            END
          ELSE
            IMPR = 'S';
          if (IMPR = 'S') then
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :GRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :MARCA INTO NOMMARCA;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :SUBGRUPO AND GRUP_COD = :GRUPO INTO :NOMSUBG;
            if (IMPTOS = 'S') then
              if (CANT <> 0) then
                  PRNETO = PRUNIT - DTOITMONTO - ((IVAITMONTO+CONSUMO) / CANT);
            ELSE
              PRNETO = PRUNIT - DTOITMONTO;
            SUBTOTIT = TOTAL - IVAITMONTO - CONSUMO;
            SUBTOTITCON = TOTAL;
            TOTCONSUMO = TOTCONSUMO + CONSUMO;
            SELECT LOTE_VENCE FROM LOTES WHERE LOTE_NRO = :lote AND ARTI_COD = :ARTICULO AND BODE_COD = :boditem INTO :vlote;
            if ((REFITEM <> '.t') or (REFITEM IS NULL)) then
                BEGIN
                /* NO SUME LOS ENSAMBLES */
                if (IVAPORC = 0) then
                    SUMAEX = SUMAEX + TOTAL;
                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;
                END
            if (IMPTOS = 'N') then
                TOTAL = TOTAL - IVAITMONTO - CONSUMO;
            if (ANCHO IS NULL) then
                ANCHO = 0;
            if (ALTO IS NULL) then
                ALTO = 0;
            if (LARGO IS NULL) then
                LARGO = 0;
            if (PESO IS NULL) then
                PESO = 0;
            PESO = PESO * CANT;
            totcajas = totcajas + cajas;
            if (substr(ARTICULO,1,2) = '.t') then
                BEGIN
                REFITEM = '';
                TOTAL = 0;
                SUBTOTIT = 0;
                SUBTOTITCON = 0;
                END
            SELECT STAND_COD FROM STANDS WHERE ARTI_COD = :ARTICULO AND STAND_BODEGA = :boditem INTO :stand;
            SUSPEND;
            END
          END
    END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER PROCEDURE IMPR_REMIPROV(
    ID INTEGER)
RETURNS (
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    NIT VARCHAR(20),
    NOMTERCERO VARCHAR(60),
    CODBODEGA VARCHAR(2),
    NOMBODEGA VARCHAR(30),
    NUMPROV VARCHAR(10),
    COTIZACION VARCHAR(30),
    PEDIDO VARCHAR(30),
    SUBTOTAL NUMERIC(18,2),
    DTOPORC NUMERIC(9,2),
    DTOMONTO NUMERIC(18,2),
    ADICIONAL NUMERIC(18,2),
    IVAMONTO NUMERIC(18,2),
    EXTRA NUMERIC(18,2),
    TOTALFAC NUMERIC(18,2),
    OBS BLOB SUB_TYPE 1 SEGMENT SIZE 80,
    ITEM INTEGER,
    ARTICULO VARCHAR(15),
    CODBAR VARCHAR(15),
    ARTIDES VARCHAR(60),
    ARTIPROV VARCHAR(15),
    CANT NUMERIC(18,4),
    LOTE VARCHAR(15),
    UNIDAD VARCHAR(8),
    BODITEM VARCHAR(2),
    STAND VARCHAR(15),
    PRUNIT NUMERIC(18,2),
    DTOITPORC NUMERIC(9,2),
    DTOITMONTO NUMERIC(18,2),
    PRNETO NUMERIC(18,2),
    IVAPORC NUMERIC(9,2),
    IVAITMONTO NUMERIC(18,2),
    CONSUMO NUMERIC(18,2),
    TOTAL NUMERIC(18,2),
    CODIGOPR VARCHAR(20),
    ZONACOD VARCHAR(2),
    ZONANOM VARCHAR(30),
    DV CHAR(1),
    DIRECCION VARCHAR(60),
    CIUDAD VARCHAR(40),
    TELEFONO VARCHAR(40),
    CONTACTO VARCHAR(60),
    FAX VARCHAR(25),
    GRUPO VARCHAR(2),
    SUBGRUPO VARCHAR(3),
    MARCA VARCHAR(3),
    PESO NUMERIC(9,4),
    ANCHO NUMERIC(18,4),
    ALTO NUMERIC(18,4),
    LARGO NUMERIC(18,4),
    SUMA1 NUMERIC(18,2),
    SUMA2 NUMERIC(18,2),
    SUMA3 NUMERIC(18,2),
    IVA1 NUMERIC(18,2),
    IVA2 NUMERIC(18,2),
    IVA3 NUMERIC(18,2),
    SUMAEX NUMERIC(18,2),
    SUMAGR NUMERIC(18,2))
AS
declare variable IMPTOS CHAR(1);
declare variable TARIFA INTEGER;
declare variable orden char(2);
BEGIN
  SELECT PREF_PRE, REPR_NUMERO, REPR_FECHA, F.BODE_COD, BODE_NOM, REPR_NUMPROV, REPR_COTIZACI, REPR_ORDEN, REPR_IMPTOS, 
    REPR_DTOPORC, REPR_DTOMONTO, REPR_ADICIONAL, REPR_IVAMONTO, REPR_EXTRA, REPR_TOTAL,
    F.TERC_NIT, TERC_NOM, TERC_DIR, TERC_CIU, TERC_TEL, TERC_CONTACTO, TERC_FAX, TERC_DV,
    REPR_OBS
    FROM REMISION_PROVEEDOR F, BODEGA B, TERCEROS T
    WHERE F.BODE_COD = B.BODE_COD AND F.TERC_NIT = T.TERC_NIT AND F.REPR_ID = :ID
    into :PREF, :NUMERO, :FECHA, :CODBODEGA, :NOMBODEGA, :NUMPROV, :COTIZACION, :PEDIDO, :IMPTOS, 
    :DTOPORC, :DTOMONTO, :ADICIONAL, :IVAMONTO, :EXTRA, :TOTALFAC,
    :NIT, :NOMTERCERO, :DIRECCION, :CIUDAD, :TELEFONO, :CONTACTO, :FAX, :DV,
    :OBS;
    
  SELECT PROV_COD, P.GRPR_COD, GRPR_NOM
    FROM PROVEEDORES P, GRUPOS_PROVEEDORES G
    WHERE TERC_NIT = :NIT AND G.GRPR_COD = P.GRPR_COD
    INTO :CODIGOPR, :ZONACOD, :ZONANOM;
    
  SUBTOTAL = TOTALFAC - EXTRA - IVAMONTO - ADICIONAL + DTOMONTO;
  SUMAEX = 0;
  SUMA1 = 0;
  SUMA2 = 0;
  SUMA3 = 0;
  IVA1 = 0;
  IVA2 = 0;
  IVA3 = 0;

execute procedure lee_configuracion('COMPRAS', 'DOCUMENTOS', 'ORDENAR ITEMS POR BODEGA AL IMPRIMIR DOCUMENTOS') returning_values (:Orden);
if (orden = 'NO') then
  BEGIN
  FOR SELECT RPVD_ITEM, D.ARTI_COD, RPVD_CODBAR, SUBSTR(RPVD_DESC,1,60), RPVD_CANT, RPVD_UNIDAD, BODE_COD, RPVD_LOTE, RPVD_PRUNIT,
    RPVD_DTOPORC, RPVD_DTOMONTO, RPVD_IVAPORC, RPVD_IVAMONTO, RPVD_CONSUMO, RPVD_TOTAL,
    GRUP_COD, SUBG_COD, MARC_COD, ARTI_PESO, ARTI_ANCHO, ARTI_ALTO, ARTI_LARGO, TAIV_COD, RPVD_CODPROV
    FROM REMISION_PROVEEDOR_DET D, ARTICULO A
    WHERE D.ARTI_COD = A.ARTI_COD AND D.REPR_ID = :ID
    ORDER BY RPVD_ITEM
    INTO :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :BODITEM, :LOTE, :PRUNIT,
    :DTOITPORC, :DTOITMONTO, :IVAPORC, :IVAITMONTO, :CONSUMO, :TOTAL,
    :GRUPO, :SUBGRUPO, :MARCA, :PESO, :ANCHO, :ALTO, :LARGO, :TARIFA, :ARTIPROV
    DO
      BEGIN
      PRNETO = PRUNIT - DTOITMONTO;
      if (IVAPORC = 0) then
        SUMAEX = SUMAEX + TOTAL;
      if (TARIFA = 1) then
        BEGIN
        SUMA1 = SUMA1 + TOTAL - IVAITMONTO;
        IVA1 = IVA1 + IVAITMONTO;
        END
      if (TARIFA = 2) then
        BEGIN
        SUMA2 = SUMA2 + TOTAL - IVAITMONTO;
        IVA2 = IVA2 + IVAITMONTO;
        END
      if (TARIFA = 3) then
        BEGIN
        SUMA3 = SUMA3 + TOTAL - IVAITMONTO;
        IVA3 = IVA3 + IVAITMONTO;
        END
      SUMAGR = SUMA1 + SUMA2 + SUMA3;
      if (IMPTOS = 'N') then
        TOTAL = TOTAL - IVAITMONTO;
      SELECT STAND_COD FROM STANDS WHERE ARTI_COD = :ARTICULO AND STAND_BODEGA = :boditem INTO :stand;
      SUSPEND;
      END
  END
ELSE
  BEGIN
  FOR SELECT RPVD_ITEM, D.ARTI_COD, RPVD_CODBAR, SUBSTR(RPVD_DESC,1,60), RPVD_CANT, RPVD_UNIDAD, BODE_COD, RPVD_LOTE, RPVD_PRUNIT,
    RPVD_DTOPORC, RPVD_DTOMONTO, RPVD_IVAPORC, RPVD_IVAMONTO, RPVD_CONSUMO, RPVD_TOTAL,
    GRUP_COD, SUBG_COD, MARC_COD, ARTI_PESO, ARTI_ANCHO, ARTI_ALTO, ARTI_LARGO, TAIV_COD, RPVD_CODPROV
    FROM REMISION_PROVEEDOR_DET D, ARTICULO A
    WHERE D.ARTI_COD = A.ARTI_COD AND D.REPR_ID = :ID
    ORDER BY D.bode_cod, RPVD_ITEM
    INTO :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :BODITEM, :LOTE, :PRUNIT,
    :DTOITPORC, :DTOITMONTO, :IVAPORC, :IVAITMONTO, :CONSUMO, :TOTAL,
    :GRUPO, :SUBGRUPO, :MARCA, :PESO, :ANCHO, :ALTO, :LARGO, :TARIFA, :ARTIPROV
    DO
      BEGIN
      PRNETO = PRUNIT - DTOITMONTO;
      if (IVAPORC = 0) then
        SUMAEX = SUMAEX + TOTAL;
      if (TARIFA = 1) then
        BEGIN
        SUMA1 = SUMA1 + TOTAL - IVAITMONTO;
        IVA1 = IVA1 + IVAITMONTO;
        END
      if (TARIFA = 2) then
        BEGIN
        SUMA2 = SUMA2 + TOTAL - IVAITMONTO;
        IVA2 = IVA2 + IVAITMONTO;
        END
      if (TARIFA = 3) then
        BEGIN
        SUMA3 = SUMA3 + TOTAL - IVAITMONTO;
        IVA3 = IVA3 + IVAITMONTO;
        END
      SUMAGR = SUMA1 + SUMA2 + SUMA3;
      if (IMPTOS = 'N') then
        TOTAL = TOTAL - IVAITMONTO;
      SELECT STAND_COD FROM STANDS WHERE ARTI_COD = :ARTICULO AND STAND_BODEGA = :boditem INTO :stand;
      SUSPEND;
      END
  END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER PROCEDURE IMPR_REMISION(
    ID INTEGER)
RETURNS (
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    NIT VARCHAR(20),
    NOMTERCERO VARCHAR(60),
    VENDEDOR INTEGER,
    NOMVENDEDOR VARCHAR(60),
    PUNTOVTA INTEGER,
    NOMPUNTOVTA VARCHAR(30),
    CODBODEGA VARCHAR(2),
    NOMBODEGA VARCHAR(30),
    COTIZACION VARCHAR(30),
    PEDIDO VARCHAR(30),
    FACTURA VARCHAR(30),
    SUBTOTAL NUMERIC(18,2),
    IVAMONTO NUMERIC(18,2),
    TOTALFAC NUMERIC(18,2),
    DESPACHO VARCHAR(255),
    TRANSPORTADOR VARCHAR(60),
    OBS BLOB SUB_TYPE 1 SEGMENT SIZE 80,
    ITEM INTEGER,
    ARTICULO VARCHAR(15),
    CODBAR VARCHAR(15),
    ARTIDES VARCHAR(60),
    CANT NUMERIC(18,4),
    LOTE VARCHAR(15),
    VLOTE DATE,
    UNIDAD VARCHAR(8),
    CAJAS NUMERIC(18,4),
    DEVUELTO NUMERIC(18,4),
    LISTAPR INTEGER,
    REFITEM VARCHAR(60),
    BODITEM VARCHAR(2),
    STAND VARCHAR(15),
    PRUNIT NUMERIC(18,2),
    DTOITPORC NUMERIC(9,2),
    DTOITMONTO NUMERIC(18,2),
    SUBTOTALITEM NUMERIC(18,2),
    PRNETOSINIVA NUMERIC(18,2),
    PRNETO NUMERIC(18,2),
    IVAPORC NUMERIC(9,2),
    IVAITMONTO NUMERIC(18,2),
    CONSUMO NUMERIC(18,2),
    TOTAL NUMERIC(18,2),
    CODIGOCL VARCHAR(20),
    ZONACOD VARCHAR(2),
    ZONANOM VARCHAR(60),
    DV CHAR(1),
    DIRECCION VARCHAR(60),
    CIUDAD VARCHAR(40),
    TELEFONO VARCHAR(40),
    CONTACTO VARCHAR(60),
    FAX VARCHAR(25),
    GRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    SUBGRUPO VARCHAR(3),
    NOMSUBG VARCHAR(30),
    MARCA VARCHAR(3),
    NOMMARCA VARCHAR(30),
    PESO NUMERIC(9,4),
    ANCHO NUMERIC(18,4),
    ALTO NUMERIC(18,4),
    LARGO NUMERIC(18,4),
    SUMA1 NUMERIC(18,2),
    SUMA2 NUMERIC(18,2),
    SUMA3 NUMERIC(18,2),
    IVA1 NUMERIC(18,2),
    IVA2 NUMERIC(18,2),
    IVA3 NUMERIC(18,2),
    SUMAEX NUMERIC(18,2),
    SUMAGR NUMERIC(18,2),
    TOTCAJAS NUMERIC(18,2),
    OBSITEM BLOB SUB_TYPE 1 SEGMENT SIZE 80)
AS
DECLARE VARIABLE IMPTOS CHAR(1);
DECLARE VARIABLE TARIFA INTEGER;
declare variable ORDENCOD CHAR(2);
declare variable SUCUR VARCHAR(10);
BEGIN
  /*  */
  SELECT F.PREF_PRE, REVT_NUMERO, REVT_FECHA, F.BODE_COD, BODE_NOM, F.TERC_NIT, REVT_NOMTERC, F.VEND_COD, VEND_NOMBRE, F.PTVT_ID, PTVT_NOM,
    REVT_COTIZACI, REVT_PEDIDO, REVT_FACTURA, REVT_IVAINC,
    REVT_IVAMONTO, REVT_TOTAL, REVT_DESPACHO, REVT_TRANSP,
    TERC_CONTACTO, TERC_FAX, TERC_DV, REVT_OBS, REVT_SUCURSAL
    FROM REMISIONES_VENTA F, BODEGA B, VENDEDORES V, PUNTO_VENTA P, TERCEROS T
    WHERE F.BODE_COD = B.BODE_COD AND F.VEND_COD = V.VEND_COD AND F.PTVT_ID = P.PTVT_ID AND F.TERC_NIT = T.TERC_NIT AND F.REVT_ID = :ID
    into :PREF, :NUMERO, :FECHA, :CODBODEGA, :NOMBODEGA, :NIT, :NOMTERCERO, :VENDEDOR, :NOMVENDEDOR, :PUNTOVTA, :NOMPUNTOVTA,
    :COTIZACION, :PEDIDO, :FACTURA, :IMPTOS,
    :IVAMONTO, :TOTALFAC, :DESPACHO, :transportador, 
    :CONTACTO, :FAX, :DV, :OBS, :SUCUR;
  SUBTOTAL = TOTALFAC - IVAMONTO;

  SELECT CLIE_COD, C.ZONA_COD, ZONA_NOM
    FROM CLIENTES C, ZONAS Z
    WHERE TERC_NIT = :NIT AND C.ZONA_COD = Z.ZONA_COD
    INTO :CODIGOCL, :ZONACOD, :ZONANOM;
  SELECT CLSU_DIR, CLSU_CIUDAD, CLSU_TEL FROM CLIENTE_SUCURSALES WHERE TERC_NIT = :NIT AND CLCU_COD = :SUCUR
    INTO :DIRECCION, :CIUDAD, :TELEFONO;
    
  SUMAEX = 0;
  SUMA1 = 0;
  SUMA2 = 0;
  SUMA3 = 0;
  IVA1 = 0;
  IVA2 = 0;
  IVA3 = 0;
  ITEM = 0;
  totcajas = 0;
  EXECUTE PROCEDURE lee_configuracion ('FACTURACION','DOCUMENTOS','ORDENAR ITEMS POR CODIGO DE ARTICULO') returning_values (:ORDENCOD);
  if (ORDENCOD = 'SI') then
    BEGIN
    FOR SELECT D.ARTI_COD, RVDE_CODBAR, SUBSTR(RVDE_DESC,1,60), RVDE_CANT, RVDE_UNIDAD, BODE_COD, RVDE_LOTE, LIPR_COD, RVDE_PRUNIT, RVDE_DTOPORC, RVDE_DTOMONTO, RVDE_IVAPORC, RVDE_IVAMONTO, RVDE_CONSUMO, RVDE_TOTAL, RVDE_REFERENCIA,
        GRUP_COD, SUBG_COD, MARC_COD, ARTI_PESO, ARTI_ANCHO, ARTI_ALTO, ARTI_LARGO, TAIV_COD, RVDE_DEVUELTO, RVDE_OBS, RVDE_CAJAS
        FROM REMISIONES_VENTA_DETALLE D, ARTICULO A
        WHERE D.ARTI_COD = A.ARTI_COD AND D.REVT_ID = :ID
        ORDER BY RVDE_CODBAR
        INTO :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :BODITEM, :LOTE, :LISTAPR, :PRUNIT, :DTOITPORC, :DTOITMONTO, :IVAPORC, :IVAITMONTO, :CONSUMO, :TOTAL, :refitem,
            :GRUPO, :SUBGRUPO, :MARCA, :PESO, :ANCHO, :ALTO, :LARGO, :TARIFA, :DEVUELTO, :obsitem, :CAJAS
        DO
        BEGIN
        if (ARTICULO = CODBAR) then
            SELECT FIRST 1 COBA_COD FROM barras_articulo WHERE ARTI_COD = :articulo INTO :CODBAR;
        SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :GRUPO INTO NOMGRUPO;
        SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :MARCA INTO NOMMARCA;
        SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :SUBGRUPO AND GRUP_COD = :GRUPO INTO :NOMSUBG;
        SELECT LOTE_VENCE FROM LOTES WHERE LOTE_NRO = :lote AND ARTI_COD = :ARTICULO AND BODE_COD = :boditem INTO :vlote;
        ITEM = ITEM + 1;
        PRNETO = PRUNIT - DTOITMONTO;
        if (IVAPORC = 0) then
            SUMAEX = SUMAEX + TOTAL;
        if (TARIFA = 1) then
            BEGIN
            SUMA1 = SUMA1 + TOTAL - IVAITMONTO;
            IVA1 = IVA1 + IVAITMONTO;
            END
        if (TARIFA = 2) then
            BEGIN
            SUMA2 = SUMA2 + TOTAL - IVAITMONTO;
            IVA2 = IVA2 + IVAITMONTO;
            END
        if (TARIFA = 3) then
            BEGIN
            SUMA3 = SUMA3 + TOTAL - IVAITMONTO;
            IVA3 = IVA3 + IVAITMONTO;
            END
        SUMAGR = SUMA1 + SUMA2 + SUMA3;

        if (IMPTOS = 'N') then
            TOTAL = TOTAL - IVAITMONTO;
        ELSE
           BEGIN
           PRNETOSINIVA = PRUNIT / (1 + ivaporc/100);
           SUBTOTALITEM = PRNETOSINIVA * :CANT;
           END
        totcajas = totcajas + cajas;
        SELECT STAND_COD FROM STANDS WHERE ARTI_COD = :ARTICULO AND STAND_BODEGA = :boditem INTO :stand;
        SUSPEND;
        END
    END
ELSE
    BEGIN
    FOR SELECT RVDE_ITEM, D.ARTI_COD, RVDE_CODBAR, SUBSTR(RVDE_DESC,1,60), RVDE_CANT, RVDE_UNIDAD, BODE_COD, RVDE_LOTE, LIPR_COD, RVDE_PRUNIT, RVDE_DTOPORC, RVDE_DTOMONTO, RVDE_IVAPORC, RVDE_IVAMONTO, RVDE_CONSUMO, RVDE_TOTAL, RVDE_REFERENCIA,
        GRUP_COD, SUBG_COD, MARC_COD, ARTI_PESO, ARTI_ANCHO, ARTI_ALTO, ARTI_LARGO, TAIV_COD, RVDE_DEVUELTO, RVDE_OBS, RVDE_CAJAS
        FROM REMISIONES_VENTA_DETALLE D, ARTICULO A
        WHERE D.ARTI_COD = A.ARTI_COD AND D.REVT_ID = :ID
        ORDER BY RVDE_ITEM
        INTO :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :BODITEM, :LOTE, :LISTAPR, :PRUNIT, :DTOITPORC, :DTOITMONTO, :IVAPORC, :IVAITMONTO, :CONSUMO, :TOTAL, :refitem,
            :GRUPO, :SUBGRUPO, :MARCA, :PESO, :ANCHO, :ALTO, :LARGO, :TARIFA, :DEVUELTO, :obsitem, :CAJAS
        DO
        BEGIN
        SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :GRUPO INTO NOMGRUPO;
        SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :MARCA INTO NOMMARCA;
        SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :SUBGRUPO AND GRUP_COD = :GRUPO INTO :NOMSUBG;
        SELECT LOTE_VENCE FROM LOTES WHERE LOTE_NRO = :lote AND ARTI_COD = :ARTICULO AND BODE_COD = :boditem INTO :vlote;
        ITEM = ITEM + 1;
        PRNETO = PRUNIT - DTOITMONTO;
        if (IVAPORC = 0) then
            SUMAEX = SUMAEX + TOTAL;
        if (TARIFA = 1) then
            BEGIN
            SUMA1 = SUMA1 + TOTAL - IVAITMONTO;
            IVA1 = IVA1 + IVAITMONTO;
            END
        if (TARIFA = 2) then
            BEGIN
            SUMA2 = SUMA2 + TOTAL - IVAITMONTO;
            IVA2 = IVA2 + IVAITMONTO;
            END
        if (TARIFA = 3) then
            BEGIN
            SUMA3 = SUMA3 + TOTAL - IVAITMONTO;
            IVA3 = IVA3 + IVAITMONTO;
            END
        SUMAGR = SUMA1 + SUMA2 + SUMA3;
        SUBTOTALITEM = TOTAL - IVAITMONTO;
        if (IMPTOS = 'N') then
            TOTAL = TOTAL - IVAITMONTO;
        ELSE
           BEGIN
             PRNETOSINIVA = PRUNIT / (1 + ivaporc/100);
             SUBTOTALITEM = PRNETOSINIVA * :CANT;
           END
        totcajas = totcajas + cajas;
        SELECT STAND_COD FROM STANDS WHERE ARTI_COD = :ARTICULO AND STAND_BODEGA = :boditem INTO :stand;
        SUSPEND;
        END
    END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER PROCEDURE IMPR_SALIDA(
    ID INTEGER)
RETURNS (
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    CONCEPTO VARCHAR(60),
    REFER VARCHAR(60),
    CODBODEGA VARCHAR(2),
    NOMBODEGA VARCHAR(30),
    NOMTERCERO VARCHAR(60),
    OBS BLOB SUB_TYPE 0 SEGMENT SIZE 80,
    ITEM INTEGER,
    ARTICULO VARCHAR(15),
    CODBAR VARCHAR(15),
    ARTIDES VARCHAR(60),
    CANT NUMERIC(18,4),
    UNIDAD VARCHAR(8),
    BODITEM VARCHAR(2),
    STAND VARCHAR(15),
    COSTO NUMERIC(18,2),
    IVAPORC NUMERIC(9,2),
    IVAMONTO NUMERIC(18,2),
    CONSUMO NUMERIC(18,2),
    TOTAL NUMERIC(18,2),
    TOTALITEM NUMERIC(18,2),
    PRECIO NUMERIC(18,2),
    LOTE VARCHAR(15),
    PESOUNIT NUMERIC(18,4),
    PESOTOT NUMERIC(18,4),
    VOLUMUNIT NUMERIC(18,4),
    VOLUMTOT NUMERIC(18,4),
    TOTALDOC NUMERIC(18,2),
    ULTIMO NUMERIC(18,2),
    TOTALULT NUMERIC(18,2),
    CONSUMODOC NUMERIC(18,2),
    TOTALMASIMP NUMERIC(18,2))
AS
declare variable IMPTOS CHAR(1);
declare variable LARGO NUMERIC(18,4);
declare variable ANCHO NUMERIC(18,4);
declare variable ALTO NUMERIC(18,4);
declare variable LISTA CHAR(3);
BEGIN
  /*  */
  SELECT PREF_PRE, SALI_NUMERO, SALI_FECHA, SALI_CONC, SALI_REFER, S.BODE_COD, BODE_NOM, SALI_NOMTERC, SALI_IMPTOS, SALI_OBS
    FROM SALIDAS S, BODEGA B WHERE S.BODE_COD = B.BODE_COD AND S.SALI_ID = :ID into
    :PREF, :NUMERO, :FECHA, :CONCEPTO, :REFER, :CODBODEGA, :NOMBODEGA, :NOMTERCERO, :IMPTOS, :OBS;
  SELECT SUM(SADE_TOTAL), SUM(SADE_IVAMONTO), SUM(SADE_CONSUMO*SADE_CANT*SADE_FACTOR) FROM SALIDAS_DETALLE
    WHERE SALI_ID = :ID INTO :TOTALDOC, :IVAMONTO, :CONSUMODOC;
  TOTALMASIMP = TOTALDOC + CONSUMODOC;
  if (IMPTOS = 'N') then
    TOTALDOC = TOTALDOC - IVAMONTO;
  FOR SELECT SADE_ITEM, A.ARTI_COD, SADE_CODBAR, SADE_DESC, SADE_CANT, SADE_UNIDAD, BODE_COD, SADE_COSTO, SADE_IVAPORC, SADE_IVAMONTO, SADE_CONSUMO, SADE_TOTAL, SADE_LOTE,
    (ARTI_PESO * SADE_CANT * SADE_FACTOR / 1000), (ARTI_LARGO * SADE_FACTOR / 100), (ARTI_ANCHO * SADE_FACTOR / 100), (ARTI_ALTO * SADE_FACTOR / 100)
    FROM SALIDAS_DETALLE D, ARTICULO A
    WHERE D.ARTI_COD = A.ARTI_COD AND D.SALI_ID = :ID
    ORDER BY SADE_ITEM
    INTO :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :BODITEM, :COSTO, :IVAPORC, :IVAMONTO, :CONSUMO, :TOTAL, :LOTE, :PESOUNIT, :LARGO, :ANCHO, :ALTO
    DO
      BEGIN
      EXECUTE PROCEDURE LEE_CONFIGURACION('INVENTARIO','DOCUMENTOS','CODIGO DE LISTA DE PRECIOS A IMPRIMIR EN DOCUMENTOS') returning_values (:LISTA);
      if (NOT lista IS NULL) then
          SELECT PRAR_FIJO FROM PRECIOS_ARTICULO WHERE ARTI_COD = :articulo AND LIPR_COD = :LISTA INTO :PRECIO;
      EXECUTE PROCEDURE ultimo_costo(:articulo, :fecha,  :unidad) returning_values (:ultimo);
      TOTALULT = CANT * ULTIMO;
      TOTALITEM = COSTO + IVAMONTO + CONSUMO;
      if (IMPTOS = 'N') then
        TOTAL = TOTAL - IVAMONTO;
      if (PESOUNIT IS NULL) then
        PESOUNIT = 0;
      PESOTOT = PESOTOT + PESOUNIT;
      VOLUMUNIT = ANCHO * ALTO * LARGO;
      volumunit = VOLUMUNIT * CANT;
      if (VOLUMUNIT IS NULL) then
        VOLUMUNIT = 0;
      VOLUMTOT = VOLUMTOT + VOLUMUNIT;
      SELECT STAND_COD FROM STANDS WHERE ARTI_COD = :ARTICULO AND STAND_BODEGA = :boditem INTO :stand;
      SUSPEND;
      END
END
^

SET TERM ; ^

ALTER TABLE STANDS DROP BODE_COD;

/* 20090102 optimización del kardex en pantalla y reporte */

SET TERM ^ ;

CREATE OR ALTER PROCEDURE SALDO_INICIAL_TOTAL_INV(
    ARTICULO VARCHAR(15),
    FECHA DATE)
RETURNS (
    SALDO NUMERIC(18,4))
AS
BEGIN
SELECT FIRST 1 COST_SALDOC+COST_ENTC-COST_SALC
    FROM COSTOS WHERE ARTI_COD = :ARTICULO AND COST_FECHA < :FECHA
    ORDER BY COST_FECHA DESC,COST_ITEM DESC
    INTO :SALDO;
  SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE EXISTENCIAS_DESDE_HASTA(
    FECHA DATE,
    ARTINI VARCHAR(20),
    ARTFIN VARCHAR(20),
    GRPINI VARCHAR(3),
    GRPFIN VARCHAR(3),
    BODINI VARCHAR(2),
    BODFIN VARCHAR(2),
    ORDEN CHAR(1),
    AGRUPA CHAR(1),
    DETALLE CHAR(1),
    RESERVA CHAR(1),
    ENPESO CHAR(1),
    SUCURSAL INTEGER)
RETURNS (
    CANT NUMERIC(18,4),
    COSTO NUMERIC(18,2),
    COSTO_LOTE NUMERIC(18,2),
    CODIGO VARCHAR(15),
    NOMBRE VARCHAR(60),
    UNIDAD VARCHAR(8),
    STAND VARCHAR(15),
    CODGRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    CODSUBG VARCHAR(3),
    NOMSUBG VARCHAR(30),
    CODMARC VARCHAR(3),
    NOMMARC VARCHAR(30),
    CODBOD VARCHAR(2),
    LOTE VARCHAR(15),
    NOMBOD VARCHAR(30),
    COSTOTOT NUMERIC(18,2),
    ULTCOSTO NUMERIC(18,2),
    FECHACOSTO DATE,
    CONSUMO NUMERIC(18,2),
    RESERVADO NUMERIC(18,4),
    ORDENADO NUMERIC(18,4),
    IVA NUMERIC(9,2),
    PESOUNIT NUMERIC(18,4),
    PESOTOTAL NUMERIC(18,4),
    CODBAR VARCHAR(20))
AS
declare variable exist char(1);
declare variable codini varchar(20);
declare variable codfin varchar(20);
declare variable desini varchar(20);
declare variable desfin varchar(20);
declare variable ordenc numeric(18,4);
declare variable pedido numeric(18,4);
declare variable ok char(1);
declare variable id integer;
declare variable item integer;
declare variable und varchar(8);
declare variable factor numeric(18,4);
declare variable cant2 numeric(18,4);
declare variable PEDAUTO CHAR(2);
BEGIN /*$$IBE$$ 
if (ORDEN = 'C') then
    BEGIN
    CODINI = ARTINI;
    CODFIN = ARTFIN;
    DESINI = '';
    DESFIN = 'zz';
    END
ELSE
    BEGIN
    DESINI = ARTINI;
    DESFIN = ARTFIN;
    CODINI = '';
    CODFIN = 'zz';
    END
EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION', 'FACTURAS', 'GENERAR PEDIDO AUTOMATICAMENTE CON LA FACTURA') returning_values (pedauto);
if (DETALLE = 'B') then
  BEGIN
  FOR SELECT ARTI_COD, ARTI_DES, ARTI_UNIDAD, ARTI_EXIST, TAIV_PORC, A.GRUP_COD, A.SUBG_COD, A.MARC_COD, BODE_COD, BODE_NOM, ARTI_CONSUMO, ARTI_PESO/1000
      FROM ARTICULO A, BODEGA B, TARIFA_IVA T
      WHERE ARTI_COD >= :CODINI AND ARTI_COD <= :CODFIN AND ARTI_DES >= :DESINI AND ARTI_DES <= :DESFIN AND ESAR_COD <> 'I' AND BODE_COD >= :BODINI AND
      BODE_COD <= :BODFIN AND ((SUCU_ID = :SUCURSAL) or (:SUCURSAL = 0)) AND A.TAIV_COD = T.TAIV_COD
      INTO :CODIGO, :NOMBRE, :UNIDAD, :EXIST, :IVA, :CODGRUPO, :CODSUBG, :CODMARC, :CODBOD, :NOMBOD, :CONSUMO, :pesounit
      DO
        BEGIN
        OK = 'N';
        if (AGRUPA = 'G') then
            BEGIN
            if ((CODGRUPO >= GRPINI) AND (CODGRUPO <= GRPFIN)) then
                OK = 'S';
            end
        ELSE
            if (AGRUPA = 'M') then
                BEGIN
                if ((CODMARC >= GRPINI) AND (CODMARC <= GRPFIN)) then
                    OK = 'S';
                END
        if (OK = 'S') then
            BEGIN
            NOMGRUPO = '';
            NOMMARC = '';
            NOMSUBG = '';
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            SELECT MAX(COBA_COD) FROM BARRAS_ARTICULO WHERE ARTI_COD = :codigo AND COBA_UNIDAD = :unidad INTO :codbar;
            if (CODBAR IS NULL) then
                CODBAR = CODIGO;
            if (EXIST <> 'N') then
                BEGIN
                SELECT STAND_COD FROM STANDS WHERE ARTI_COD = :CODIGO AND STAND_BODEGA = :CODBOD INTO :STAND;
                EXECUTE PROCEDURE SALDO_INICIAL_INVENTARIO(CODIGO, FECHA, :CODBOD) returning_values (CANT);
                EXECUTE PROCEDURE COSTO_PROMEDIO_UNIDAD(CODIGO, FECHA, UNIDAD) returning_values (COSTO);
                EXECUTE PROCEDURE ULTIMO_COSTO(CODIGO, FECHA, UNIDAD) returning_values (ULTCOSTO);
                SELECT MAX(MVAR_FECHA) FROM MOVIMIENTO_ARTICULO WHERE ARTI_COD = :CODIGO AND MVAR_ENTRADA = 'S' AND MVAR_FECHA <= :FECHA INTO :FECHACOSTO;
                COSTOTOT = :CANT * :COSTO;
                CONSUMO = CONSUMO * CANT;
                if (RESERVA = 'S') then
                    BEGIN
                    SELECT SUM(ORID_ENTREGAR)
                        FROM ORDENINVENTARIO_DETALLE OD, ordenes_inventario O
                        WHERE O.ORIN_ID = OD.ORIN_ID AND ARTI_COD = :CODIGO AND ORIN_FECHA <= :FECHA AND ORIN_FECLLEGA >= :FECHA AND ORID_ANULADO = 'N' AND OD.BODE_COD = :CODBOD
                        INTO :ORDENADO;
                    if (ORDENADO IS NULL) then
                        ORDENADO = 0;
                    ORDENC = 0;
                    FOR SELECT O.ORDC_ID, OCDE_ITEM, OCDE_CANT * OCDE_FACTOR
                        FROM ORDENES_COMPRA O, ORDENES_COMPRA_DETALLE OD
                        WHERE O.ORDC_ID = OD.ORDC_ID AND OD.ARTI_COD = :CODIGO AND (ORDC_FECHA+ORDC_VALIDEZ) >= :FECHA AND ORDC_FECHA <= :FECHA AND OCDE_ANULADO = 'N' AND OD.BODE_COD = :CODBOD
                        INTO :ID, :ITEM, :CANT2
                        do
                        BEGIN
                        EXECUTE PROCEDURE FALTANTE(23, 21, ID, ITEM) returning_values (PEDIDO, UND, FACTOR);
                        if (PEDIDO * FACTOR = CANT2) then  $$IBE$$*/ /* SI NO SE HA FACTURADO MIRE A VER SI SE REMISIONO */ /*$$IBE$$ 
                            EXECUTE PROCEDURE FALTANTE(23, 22, ID, ITEM) returning_values (PEDIDO, UND, FACTOR);
                        if (PEDIDO IS NULL) then
                            PEDIDO = 0;
                        ORDENC = ORDENC + PEDIDO * FACTOR;
                        END
                    ORDENADO = ORDENADO + ORDENC;
                    SELECT SUM(RSDE_LIBERAR)
                        FROM RESERVAS_DETALLE RD, RESERVAS R
                        WHERE R.RESE_ID = RD.RESE_ID AND ARTI_COD = :CODIGO AND RESE_FECHA <= :FECHA AND RESE_VENCE >= :FECHA AND RD.BODE_COD = :CODBOD AND RSDE_ANULADO = 'N'
                        INTO :RESERVADO;
                    if (RESERVADO IS NULL) then
                        RESERVADO = 0;
                    PEDIDO = 0;
                    FOR SELECT P.PEDI_ID, PEDE_ITEM, PEDE_CANT * PEDE_FACTOR
                        FROM PEDIDOS P, PEDIDOS_DETALLE PD
                        WHERE P.PEDI_ID = PD.PEDI_ID AND PD.ARTI_COD = :CODIGO AND (PEDI_FECHA+PEDI_VALIDEZ) >= :FECHA AND PEDI_FECHA <= :FECHA AND PEDE_ANULADO = 'N' AND BODE_COD = :CODBOD
                        INTO :ID, :ITEM, :CANT2
                        do
                        BEGIN
                        EXECUTE PROCEDURE FALTANTE(34, 31, ID, ITEM) returning_values (ORDENC, UND, FACTOR);
                        if ((ORDENC * FACTOR = CANT2) or (PEDAUTO = 'SI')) then  $$IBE$$*/ /* SI NO SE HA FACTURADO MIRE A VER SI SE REMISIONO */ /*$$IBE$$ 
                            EXECUTE PROCEDURE FALTANTE(34, 32, ID, ITEM) returning_values (ORDENC, UND, FACTOR);
                        if (ORDENC IS NULL) then
                            ORDENC = 0;
                        PEDIDO = PEDIDO + ORDENC * FACTOR;
                        END
                    RESERVADO = RESERVADO + PEDIDO;
                    END
                ELSE
                    BEGIN
                    RESERVADO = 0;
                    ORDENADO = 0;
                    END
                if (ENPESO = 'S') then
                    BEGIN
                    if (pesounit IS NULL) then
                        pesounit = 0;
                    if (PESOUNIT <> 0) then
                        BEGIN
                        pesototal = PESOUNIT * cant;
                        SUSPEND;
                        END
                    END
                ELSE
                    SUSPEND;
                END
            END
        END
  END

if (DETALLE = 'L') then
  BEGIN
  FOR SELECT A.ARTI_COD, ARTI_DES, ARTI_UNIDAD, ARTI_EXIST, TAIV_PORC, A.GRUP_COD, A.SUBG_COD, A.MARC_COD, L.lote_nro, L.lote_nro||' - '||L.lote_vence, ARTI_CONSUMO,l.bode_cod, L.lote_saldo,l.lote_costo, ARTI_PESO/1000
      FROM ARTICULO A, LOTES l, TARIFA_IVA T
      WHERE A.ARTI_COD >= '0' AND A.ARTI_COD <= 'zz' AND ARTI_DES >= '' AND ARTI_DES <= 'zz' AND ESAR_COD <> 'I' AND A.TAIV_COD = T.TAIV_COD and a.arti_cod = l.arti_cod
      INTO :CODIGO, :NOMBRE, :UNIDAD, :EXIST, :IVA, :CODGRUPO, :CODSUBG, :CODMARC, :LOTE, :NOMBOD, :CONSUMO, :codbod, :cant, :costo_lote, :pesounit
      DO
        BEGIN
        OK = 'N';
        if (AGRUPA = 'G') then
            BEGIN
            if ((CODGRUPO >= GRPINI) AND (CODGRUPO <= GRPFIN)) then
                OK = 'S';
            end
        ELSE
            if (AGRUPA = 'M') then
                BEGIN
                if ((CODMARC >= GRPINI) AND (CODMARC <= GRPFIN)) then
                    OK = 'S';
                END
        if (OK = 'S') then
            BEGIN
            NOMGRUPO = '';
            NOMMARC = '';
            NOMSUBG = '';
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            SELECT MAX(COBA_COD) FROM BARRAS_ARTICULO WHERE ARTI_COD = :codigo AND COBA_UNIDAD = :unidad INTO :codbar;
            if (CODBAR IS NULL) then
                CODBAR = CODIGO;

            if (EXIST <> 'N') then
                BEGIN
                EXECUTE PROCEDURE COSTO_PROMEDIO_UNIDAD(CODIGO, FECHA, UNIDAD) returning_values (COSTO);
                EXECUTE PROCEDURE ULTIMO_COSTO(CODIGO, FECHA, UNIDAD) returning_values (ULTCOSTO);
                SELECT MAX(MVAR_FECHA) FROM MOVIMIENTO_ARTICULO WHERE ARTI_COD = :CODIGO AND MVAR_ENTRADA = 'S' AND MVAR_FECHA <= :FECHA INTO :FECHACOSTO;
                COSTOTOT = :CANT * :COSTO;
                CONSUMO = CONSUMO * CANT;
                if (RESERVA = 'S') then
                    BEGIN
                    SELECT SUM(ORID_ENTREGAR)
                        FROM ORDENINVENTARIO_DETALLE OD, ordenes_inventario O
                        WHERE O.ORIN_ID = OD.ORIN_ID AND ARTI_COD = :CODIGO AND ORIN_FECHA <= :FECHA AND ORIN_FECLLEGA >= :FECHA AND ORID_ANULADO = 'N'
                        INTO :ORDENADO;
                    if (ORDENADO IS NULL) then
                        ORDENADO = 0;
                    ORDENC = 0;
                    FOR SELECT O.ORDC_ID, OCDE_ITEM, OCDE_CANT * OCDE_FACTOR
                        FROM ORDENES_COMPRA O, ORDENES_COMPRA_DETALLE OD
                        WHERE O.ORDC_ID = OD.ORDC_ID AND OD.ARTI_COD = :CODIGO AND (ORDC_FECHA+ORDC_VALIDEZ) >= :FECHA AND ORDC_FECHA <= :FECHA AND OCDE_ANULADO = 'N'
                        INTO :ID, :ITEM, :CANT2
                        do
                        BEGIN
                        EXECUTE PROCEDURE FALTANTE(23, 21, ID, ITEM) returning_values (PEDIDO, UND, FACTOR);
                        if (PEDIDO * FACTOR = CANT2) then  $$IBE$$*/ /* SI NO SE HA FACTURADO MIRE A VER SI SE REMISIONO */ /*$$IBE$$ 
                            EXECUTE PROCEDURE FALTANTE(23, 22, ID, ITEM) returning_values (PEDIDO, UND, FACTOR);
                        if (PEDIDO IS NULL) then
                            PEDIDO = 0;
                        ORDENC = ORDENC + PEDIDO * FACTOR;
                        END
                    ORDENADO = ORDENADO + ORDENC;
                    SELECT SUM(RSDE_LIBERAR)
                        FROM RESERVAS_DETALLE RD, RESERVAS R
                        WHERE R.RESE_ID = RD.RESE_ID AND ARTI_COD = :CODIGO AND RESE_FECHA <= :FECHA AND RESE_VENCE >= :FECHA AND RSDE_ANULADO = 'N'
                        INTO :RESERVADO;
                    if (RESERVADO IS NULL) then
                        RESERVADO = 0;
                    PEDIDO = 0;
                    FOR SELECT P.PEDI_ID, PEDE_ITEM, PEDE_CANT * PEDE_FACTOR
                        FROM PEDIDOS P, PEDIDOS_DETALLE PD
                        WHERE P.PEDI_ID = PD.PEDI_ID AND PD.ARTI_COD = :CODIGO AND (PEDI_FECHA+PEDI_VALIDEZ) >= :FECHA AND PEDI_FECHA <= :FECHA AND PEDE_ANULADO = 'N'
                        INTO :ID, :ITEM, :CANT2
                        do
                        BEGIN
                        EXECUTE PROCEDURE FALTANTE(34, 31, ID, ITEM) returning_values (ORDENC, UND, FACTOR);
                        if ((ORDENC * FACTOR = CANT2) or (PEDAUTO = 'SI')) then  $$IBE$$*/ /* SI NO SE HA FACTURADO MIRE A VER SI SE REMISIONO */ /*$$IBE$$ 
                            EXECUTE PROCEDURE FALTANTE(34, 32, ID, ITEM) returning_values (ORDENC, UND, FACTOR);
                        if (ORDENC IS NULL) then
                            ORDENC = 0;
                        PEDIDO = PEDIDO + ORDENC * FACTOR;
                        END
                    RESERVADO = RESERVADO + PEDIDO;
                    END
                ELSE
                    BEGIN
                    RESERVADO = 0;
                    ORDENADO = 0;
                    END
                if (ENPESO = 'S') then
                    BEGIN
                    if (pesounit IS NULL) then
                        pesounit = 0;
                    if (PESOUNIT <> 0) then
                        BEGIN
                        pesototal = PESOUNIT * cant;
                        SUSPEND;
                        END
                    END
                ELSE
                    SUSPEND;
                END
            END
        END
  end
if (DETALLE = 'N') then
  BEGIN
  FOR SELECT ARTI_COD, ARTI_DES, ARTI_UNIDAD, ARTI_EXIST, TAIV_PORC, A.GRUP_COD, A.SUBG_COD, A.MARC_COD, ARTI_CONSUMO, ARTI_PESO/1000
      FROM ARTICULO A, TARIFA_IVA T
      WHERE ARTI_COD >= :CODINI AND ARTI_COD <= :CODFIN AND ARTI_DES >= :DESINI AND ARTI_DES <= :DESFIN AND ESAR_COD <> 'I' AND A.TAIV_COD = T.TAIV_COD
      INTO :CODIGO, :NOMBRE, :UNIDAD, :EXIST, :IVA, :CODGRUPO, :CODSUBG, :CODMARC, :CONSUMO, :pesounit
      DO
        BEGIN
        OK = 'N';
        if (AGRUPA = 'G') then
            BEGIN
            if ((GRPINI = '0') AND (GRPFIN = 'zz')) then
                OK = 'S';
            else
                if ((CODGRUPO >= GRPINI) AND (CODGRUPO <= GRPFIN)) then
                    OK = 'S';
            end
        ELSE
            if (AGRUPA = 'M') then
                BEGIN
                if ((GRPINI = '0') AND (GRPFIN = 'zzz')) then
                    OK = 'S';
                else
                    if ((CODMARC >= GRPINI) AND (CODMARC <= GRPFIN)) then
                        OK = 'S';
                END
        if (OK = 'S') then
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            SELECT MAX(COBA_COD) FROM BARRAS_ARTICULO WHERE ARTI_COD = :codigo AND COBA_UNIDAD = :unidad INTO :codbar;
            if (CODBAR IS NULL) then
                CODBAR = CODIGO;

            if (EXIST <> 'N') then
                BEGIN
                EXECUTE PROCEDURE SALDO_INICIAL_TOTAL_INV(CODIGO, FECHA) returning_values (CANT);
                EXECUTE PROCEDURE COSTO_PROMEDIO_UNIDAD(CODIGO, FECHA, UNIDAD) returning_values (COSTO);
                EXECUTE PROCEDURE ULTIMO_COSTO(CODIGO, FECHA, UNIDAD) returning_values (ULTCOSTO);
                SELECT MAX(MVAR_FECHA) FROM MOVIMIENTO_ARTICULO WHERE ARTI_COD = :CODIGO AND MVAR_ENTRADA = 'S' AND MVAR_FECHA <= :FECHA INTO :FECHACOSTO;
                COSTOTOT = :CANT * :COSTO;
                CONSUMO = CONSUMO * CANT;
                if (RESERVA = 'S') then
                    BEGIN
                    SELECT SUM(ORID_ENTREGAR)
                        FROM ORDENINVENTARIO_DETALLE OD, ordenes_inventario O
                        WHERE O.ORIN_ID = OD.ORIN_ID AND ARTI_COD = :CODIGO AND ORIN_FECHA <= :FECHA AND ORIN_FECLLEGA >= :FECHA AND ORID_ANULADO = 'N'
                        INTO :ORDENADO;
                        if (ORDENADO IS NULL) then
                            ORDENADO = 0;
                    ORDENC = 0;
                    FOR SELECT O.ORDC_ID, OCDE_ITEM, OCDE_CANT * OCDE_FACTOR
                        FROM ORDENES_COMPRA O, ORDENES_COMPRA_DETALLE OD
                        WHERE O.ORDC_ID = OD.ORDC_ID AND OD.ARTI_COD = :CODIGO AND (ORDC_FECHA+ORDC_VALIDEZ) >= :FECHA AND ORDC_FECHA <= :FECHA AND OCDE_ANULADO = 'N'
                        INTO :ID, :ITEM, :CANT2
                        do
                        BEGIN
                        EXECUTE PROCEDURE FALTANTE(23, 21, ID, ITEM) returning_values (PEDIDO, UND, FACTOR);
                        if (PEDIDO * FACTOR = CANT2) then  $$IBE$$*/ /* SI NO SE HA FACTURADO MIRE A VER SI SE REMISIONO */ /*$$IBE$$ 
                            EXECUTE PROCEDURE FALTANTE(23, 22, ID, ITEM) returning_values (PEDIDO, UND, FACTOR);
                        if (PEDIDO IS NULL) then
                            PEDIDO = 0;
                        ORDENC = ORDENC + PEDIDO * FACTOR;
                        END
                    ORDENADO = ORDENADO + ORDENC;
                    SELECT SUM(RSDE_LIBERAR)
                        FROM RESERVAS_DETALLE RD, RESERVAS R
                        WHERE R.RESE_ID = RD.RESE_ID AND ARTI_COD = :CODIGO AND RESE_FECHA <= :FECHA AND RESE_VENCE >= :FECHA AND RSDE_ANULADO = 'N'
                        INTO :RESERVADO;
                    if (RESERVADO IS NULL) then
                        RESERVADO = 0;
                    PEDIDO = 0;
                    FOR SELECT P.PEDI_ID, PEDE_ITEM, PEDE_CANT * PEDE_FACTOR
                        FROM PEDIDOS P, PEDIDOS_DETALLE PD, PUNTO_VENTA PT
                        WHERE P.PEDI_ID = PD.PEDI_ID AND PD.ARTI_COD = :CODIGO AND PT.ptvt_id = P.PTVT_ID AND (PEDI_FECHA+PEDI_VALIDEZ) >= :FECHA AND PEDI_FECHA <= :FECHA AND PEDE_ANULADO = 'N'
                        INTO :ID, :ITEM, :CANT2
                        do
                        BEGIN
                        EXECUTE PROCEDURE FALTANTE(34, 31, ID, ITEM) returning_values (ORDENC, UND, FACTOR);
                        if ((ORDENC * FACTOR = CANT2) or (PEDAUTO = 'SI')) then  $$IBE$$*/ /* SI NO SE HA FACTURADO MIRE A VER SI SE REMISIONO */ /*$$IBE$$ 
                            EXECUTE PROCEDURE FALTANTE(34, 32, ID, ITEM) returning_values (ORDENC, UND, FACTOR);
                        if (ORDENC IS NULL) then
                            ORDENC = 0;
                        PEDIDO = PEDIDO + ORDENC * FACTOR;
                        END
                    if (PEDIDO IS NULL) then
                        PEDIDO = 0;
                    RESERVADO = RESERVADO + PEDIDO;
                    END
                ELSE
                    BEGIN
                    RESERVADO = 0;
                    ORDENADO = 0;
                    END
                if (ENPESO = 'S') then
                    BEGIN
                    if (pesounit IS NULL) then
                        pesounit = 0;
                    if (PESOUNIT <> 0) then
                        BEGIN
                        pesototal = PESOUNIT * cant;
                        SUSPEND;
                        END
                    END
                ELSE
                    SUSPEND;
                END
            END
        END
  END
 $$IBE$$*/ SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE INVENTARIO_FAMILIA(
    FECHA DATE,
    FAMILIA VARCHAR(20))
RETURNS (
    ARTICULO VARCHAR(20),
    INTERNO VARCHAR(20),
    DESCRIPCION VARCHAR(60),
    CANTIDAD NUMERIC(18,2),
    UNIDAD VARCHAR(8),
    TOTAL NUMERIC(18,2))
AS
declare variable COSTO NUMERIC(18,4);
begin /*$$IBE$$ 
FOR SELECT A.ARTI_COD, ARTI_DES, ARTI_UNIDAD, p.pvar_cod FROM ARTICULO A, PROVEEDOR_ARTICULO P
    WHERE ESAR_COD <> 'I' AND A.arti_cod = P.arti_cod AND P.terc_nit = :FAMILIA
    INTO :ARTICULO, :descripcion, :UNIDAD, :INTERNO
    DO
    BEGIN
    EXECUTE PROCEDURE SALDO_INICIAL_TOTAL_INV(ARTICULO, FECHA) returning_values (cantidad);
    EXECUTE PROCEDURE COSTO_PROMEDIO_UNIDAD(ARTICULO, FECHA, UNIDAD) returning_values (COSTO);
    TOTAL = COSTO * CANTIDAD;
    suspend;
    END
 $$IBE$$*/ SUSPEND;
end
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE KARDEX_DESDE_HASTA(
    ARTICULO VARCHAR(15),
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    INICIAL_CANT NUMERIC(18,4),
    INICIAL_PESOS NUMERIC(18,2),
    ENT_CANT NUMERIC(18,4),
    ENT_PESOS NUMERIC(18,2),
    SAL_CANT NUMERIC(18,4),
    SAL_PESOS NUMERIC(18,2),
    FINAL_CANT NUMERIC(18,4),
    FINAL_PESOS NUMERIC(18,2))
AS
BEGIN /*$$IBE$$ 
  EXECUTE PROCEDURE SALDO_INICIAL_TOTAL_INV(ARTICULO, FECINI) returning_values (INICIAL_CANT);
  SELECT SUM(MVAR_CANT) FROM MOVIMIENTO_ARTICULO
    WHERE (MVAR_FECHA >= :FECINI) AND (MVAR_FECHA < :FECFIN) AND
          (ARTI_COD = :ARTICULO) AND (MVAR_ENTRADA = 'S') INTO :ENT_CANT;
  if (ENT_CANT IS NULL) then
    ENT_CANT = 0;
  SELECT SUM(MVAR_CANT) FROM MOVIMIENTO_ARTICULO
    WHERE (MVAR_FECHA >= :FECINI) AND (MVAR_FECHA < :FECFIN) AND
          (ARTI_COD = :ARTICULO) AND (MVAR_ENTRADA = 'N') INTO :SAL_CANT;
  if (SAL_CANT IS NULL) then
    SAL_CANT = 0;
  EXECUTE PROCEDURE VALOR_INICIAL_INVENTARIO(ARTICULO, FECINI) returning_values (INICIAL_PESOS);
  SELECT SUM(COST_ENTP) FROM COSTOS
    WHERE (COST_FECHA >= :FECINI) AND (COST_FECHA < :FECFIN) AND
          (ARTI_COD = :ARTICULO) INTO :ENT_PESOS;
  if (ENT_PESOS IS NULL) then
    ENT_PESOS = 0;
  SELECT SUM(COST_SALP) FROM COSTOS
    WHERE (COST_FECHA >= :FECINI) AND (COST_FECHA < :FECFIN) AND
          (ARTI_COD = :ARTICULO) INTO :SAL_PESOS;
  if (SAL_PESOS IS NULL) then
    SAL_PESOS = 0;
  FINAL_CANT = INICIAL_CANT + ENT_CANT - SAL_CANT;
  FINAL_PESOS = INICIAL_PESOS + ENT_PESOS - SAL_PESOS;
  SUSPEND;
 $$IBE$$*/ SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE REP_EXISTENCIAS_PRECIOS(
    ARTINI VARCHAR(20),
    ARTFIN VARCHAR(20),
    GRPINI VARCHAR(2),
    GRPFIN VARCHAR(2),
    ORDEN CHAR(1),
    LISTA INTEGER,
    FECHA DATE,
    BODINI VARCHAR(2),
    BODFIN VARCHAR(2),
    TODAS CHAR(1),
    IVAINC CHAR(1),
    SINBOD CHAR(1),
    SUBEMPRESA INTEGER)
RETURNS (
    CODIGO VARCHAR(15),
    NOMBRE VARCHAR(60),
    UNIDAD VARCHAR(8),
    CODGRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    CODSUBG VARCHAR(3),
    NOMSUBG VARCHAR(30),
    CODMARC VARCHAR(3),
    NOMMARC VARCHAR(30),
    NOMLISTA VARCHAR(30),
    PRECIO NUMERIC(18,2),
    MARGEN NUMERIC(9,2),
    IVA NUMERIC(9,2),
    CODBOD VARCHAR(2),
    NOMBOD VARCHAR(30),
    CANT NUMERIC(18,4),
    COSTOTOT NUMERIC(18,2))
AS
DECLARE VARIABLE EXIST CHAR(1);
DECLARE VARIABLE CODINI VARCHAR(20);
DECLARE VARIABLE CODFIN VARCHAR(20);
DECLARE VARIABLE DESINI VARCHAR(20);
DECLARE VARIABLE DESFIN VARCHAR(20);
DECLARE VARIABLE FECINI DATE;
DECLARE VARIABLE FECFIN DATE;
DECLARE VARIABLE UTIL NUMERIC(9,2);
DECLARE VARIABLE MOU CHAR(10);
DECLARE VARIABLE LISIVA CHAR(1);
BEGIN /*$$IBE$$ 
if (ORDEN = 'C') then
    BEGIN
    CODINI = ARTINI;
    CODFIN = ARTFIN;
    DESINI = '';
    DESFIN = 'zz';
    END
ELSE
    BEGIN
    DESINI = ARTINI;
    DESFIN = ARTFIN;
    CODINI = '';
    CODFIN = 'zz';
    END
    
EXECUTE PROCEDURE LEE_CONFIGURACION ('FACTURACION', 'ARTICULOS', 'SUGERIR PRECIOS CON PORCENTAJE DE MARGEN O UTILIDAD') returning_values (MOU);
    
FOR SELECT ARTI_COD, ARTI_DES, ARTI_UNIDAD, ARTI_EXIST, A.GRUP_COD, A.SUBG_COD, A.MARC_COD, TAIV_PORC
    FROM ARTICULO A, TARIFA_IVA T
    WHERE ARTI_COD >= :CODINI AND ARTI_COD <= :CODFIN AND A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :GRPFIN AND
    ARTI_DES >= :DESINI AND ARTI_DES <= :DESFIN AND ESAR_COD <> 'I' AND A.TAIV_COD = T.TAIV_COD
    INTO :CODIGO, :NOMBRE, :UNIDAD, :EXIST, :CODGRUPO, :CODSUBG, :CODMARC, :IVA
    DO
    BEGIN
    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
    if (EXIST <> 'N') then
        BEGIN
        if (LISTA = 255) then
            BEGIN
            if (TODAS = 'N') then
                begin
                 $$IBE$$*/ /* Busque las listas validas hoy */ /*$$IBE$$ 
                FOR SELECT LIPR_NOM, LIPR_FECINI, LIPR_FECFIN, PRAR_FIJO, PRAR_MARGEN, PRAR_UTIL, LIPR_MODIF
                    FROM LISTA_PRECIOS L, PRECIOS_ARTICULO P
                    WHERE L.LIPR_COD = P.LIPR_COD AND ARTI_COD = :CODIGO
                    INTO :NOMLISTA, :FECINI, :FECFIN, :PRECIO, :MARGEN, :UTIL, :LISIVA
                    DO
                      BEGIN
                      if (MOU = 'UTILIDAD') then
                        MARGEN = UTIL;
                      if (IVAINC = 'S') THEN
                        BEGIN
                        if (LISIVA = 'N') then
                            PRECIO = PRECIO * (1 + (IVA/100));
                        END
                      END
                end   
            ELSE
                FOR SELECT LIPR_NOM, PRAR_FIJO, PRAR_MARGEN, PRAR_UTIL, LIPR_MODIF
                    FROM LISTA_PRECIOS L, PRECIOS_ARTICULO P
                    WHERE L.LIPR_COD = P.LIPR_COD AND ARTI_COD = :CODIGO
                    INTO :NOMLISTA, :PRECIO, :MARGEN, :UTIL, :LISIVA
                    DO
                    BEGIN
                    EXECUTE PROCEDURE LEE_CONFIGURACION ('FACTURACION', 'ARTICULOS', 'SUGERIR PRECIOS CON PORCENTAJE DE MARGEN O UTILIDAD') returning_values (MOU);
                    if (MOU = 'UTILIDAD') then
                        MARGEN = UTIL;
                    if (IVAINC = 'S') THEN
                        BEGIN
                        if (LISIVA = 'N') then
                            PRECIO = PRECIO * (1 + (IVA/100));
                        END
                    END
            END  $$IBE$$*/ /* 255 */ /*$$IBE$$ 
        ELSE
            BEGIN
            if (TODAS = 'N') then
                begin
                 $$IBE$$*/ /* Busque las listas validas hoy */ /*$$IBE$$ 
                FOR SELECT LIPR_NOM, LIPR_FECINI, LIPR_FECFIN, PRAR_FIJO, PRAR_MARGEN, PRAR_UTIL, LIPR_MODIF
                    FROM LISTA_PRECIOS L, PRECIOS_ARTICULO P
                    WHERE L.LIPR_COD = P.LIPR_COD AND ARTI_COD = :CODIGO AND L.LIPR_COD = :LISTA
                    INTO :NOMLISTA, :FECINI, :FECFIN, :PRECIO, :MARGEN, :UTIL, :LISIVA
                    DO
                    BEGIN
                    if (MOU = 'UTILIDAD') then
                        MARGEN = UTIL;
                    if (IVAINC = 'S') THEN
                        BEGIN
                        if (LISIVA = 'N') then
                            PRECIO = PRECIO * (1 + (IVA/100));
                        END
                    END
                end
            ELSE
                FOR SELECT LIPR_NOM, PRAR_FIJO, PRAR_MARGEN, PRAR_UTIL
                    FROM LISTA_PRECIOS L, PRECIOS_ARTICULO P
                    WHERE L.LIPR_COD = P.LIPR_COD AND ARTI_COD = :CODIGO AND L.LIPR_COD = :LISTA
                    INTO :NOMLISTA, :PRECIO, :MARGEN, :UTIL
                    DO
                    BEGIN
                    if (MOU = 'UTILIDAD') then
                        MARGEN = UTIL;
                    if (IVAINC = 'S') THEN
                        BEGIN
                        if (LISIVA = 'NO') then
                            PRECIO = PRECIO * (1 + (IVA/100));
                        END
                    END
            END
                      
        if (SINBOD = 'S') then
            BEGIN
            EXECUTE PROCEDURE SALDO_INICIAL_TOTAL_INV(CODIGO, FECHA) returning_values (CANT);
            COSTOTOT = CANT * PRECIO;
            if (FECINI is null) then
                SUSPEND;
            else
                if ((FECINI <= :FECHA) AND (FECFIN >= :FECHA)) Then
                    SUSPEND;
            END
        ELSE
            BEGIN
            FOR SELECT BODE_COD, BODE_NOM FROM BODEGA B
                WHERE BODE_COD >= :BODINI AND BODE_COD <= :BODFIN AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                INTO :CODBOD, :NOMBOD
                DO
                BEGIN
                EXECUTE PROCEDURE SALDO_INICIAL_INVENTARIO(CODIGO, FECHA, :CODBOD) returning_values (CANT);
                        
                COSTOTOT = CANT * PRECIO;
                if (FECINI is null) then
                    SUSPEND;
                else
                    if ((FECINI <= :FECHA) AND (FECFIN >= :FECHA)) Then
                        SUSPEND;
                END
            END
        END
    END
 $$IBE$$*/ SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE REP_KARDEX_ARTICULO(
    DETALLE CHAR(1),
    FECINI DATE,
    FECFIN DATE,
    ARTINI VARCHAR(20),
    ARTFIN VARCHAR(20),
    GRPINI VARCHAR(2),
    GRPFIN VARCHAR(2),
    ORDEN CHAR(1),
    BODEGA VARCHAR(2))
RETURNS (
    CODIGO VARCHAR(15),
    NOMBRE VARCHAR(60),
    UNIDAD VARCHAR(8),
    CODGRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    CODSUBG VARCHAR(3),
    NOMSUBG VARCHAR(30),
    CODMARC VARCHAR(3),
    NOMMARC VARCHAR(30),
    CODBOD VARCHAR(2),
    SALDOINI NUMERIC(18,4),
    COSTOINI NUMERIC(18,2),
    ENTRADAS NUMERIC(18,4),
    COSTOENT NUMERIC(18,2),
    SALIDAS NUMERIC(18,4),
    COSTOSAL NUMERIC(18,2),
    SALDOFIN NUMERIC(18,4),
    COSTOFIN NUMERIC(18,2),
    TIPODOC VARCHAR(8),
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    CONCEPTO VARCHAR(60),
    NIT VARCHAR(20),
    CONS INTEGER,
    CANFINAL NUMERIC(18,4),
    COSFINAL NUMERIC(18,2))
AS
DECLARE VARIABLE ENTRADA CHAR(1);
DECLARE VARIABLE CANT NUMERIC(18,4);
DECLARE VARIABLE EXIST NUMERIC(18,4);
DECLARE VARIABLE COSTO NUMERIC(18,2);
DECLARE VARIABLE CODINI VARCHAR(20);
DECLARE VARIABLE CODFIN VARCHAR(20);
DECLARE VARIABLE DESINI VARCHAR(20);
DECLARE VARIABLE DESFIN VARCHAR(20);
declare variable TIPO INTEGER;
declare variable ID INTEGER;
BEGIN /*$$IBE$$ 
if (ORDEN = 'C') then
    BEGIN
    CODINI = ARTINI;
    CODFIN = ARTFIN;
    DESINI = '';
    DESFIN = 'zz';
    END
ELSE
    BEGIN
    DESINI = ARTINI;
    DESFIN = ARTFIN;
    CODINI = '';
    CODFIN = 'zz';
    END
  FOR
    SELECT ARTI_COD, ARTI_DES, ARTI_UNIDAD, A.GRUP_COD, A.SUBG_COD, A.MARC_COD
      FROM ARTICULO A
      WHERE ARTI_COD >= :CODINI AND ARTI_COD <= :CODFIN AND A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :GRPFIN AND ARTI_DES >= :DESINI AND ARTI_DES <= :DESFIN AND A.ESAR_COD <> 'I'
      INTO :CODIGO, :NOMBRE, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
      DO
        BEGIN
        NOMMARC = '';
        NOMSUBG = '';
        SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
        SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
        SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
        if (BODEGA = '') then
            BEGIN
            EXECUTE PROCEDURE SALDO_INICIAL_TOTAL_INV(CODIGO, FECINI) returning_values (:SALDOINI);
            EXECUTE PROCEDURE VALOR_INICIAL_INVENTARIO(CODIGO, FECINI) returning_values (COSTOINI);
            END
        ELSE
            BEGIN
            EXECUTE PROCEDURE SALDO_INICIAL_INVENTARIO(CODIGO, FECINI, :BODEGA) returning_values (SALDOINI);
            EXECUTE PROCEDURE COSTO_PROMEDIO(CODIGO, FECINI) returning_values (COSTOINI);
            COSTOINI = COSTOINI * saldoini;
            END
        if (DETALLE = 'N') then
            BEGIN
             $$IBE$$*/ /* SUME LAS ENTRADAS */ /*$$IBE$$ 
            if (BODEGA = '') then
                SELECT SUM(MVAR_CANT), SUM(MVAR_CANT * MVAR_COSTO) FROM MOVIMIENTO_ARTICULO
                  WHERE (MVAR_FECHA >= :FECINI) AND (MVAR_FECHA <= :FECFIN) AND (MVAR_TIPODOC <> 13) AND
                  (ARTI_COD = :CODIGO) AND (MVAR_ENTRADA = 'S') INTO :ENTRADAS, :COSTOENT;
            ELSE
                SELECT SUM(MVAR_CANT), SUM(MVAR_CANT * MVAR_COSTO) FROM MOVIMIENTO_ARTICULO
                  WHERE (MVAR_FECHA >= :FECINI) AND (MVAR_FECHA <= :FECFIN) AND (MVAR_TIPODOC <> 13) AND
                  (ARTI_COD = :CODIGO) AND (MVAR_ENTRADA = 'S') AND BODE_COD = :BODEGA
                  INTO :ENTRADAS, :COSTOENT;
                
            if (ENTRADAS IS NULL) then
              ENTRADAS = 0;
            if (COSTOENT IS NULL) then
              COSTOENT = 0;
             $$IBE$$*/ /* CALCULE LAS SALIDAS A COSTO PROMEDIO */ /*$$IBE$$ 
            SALIDAS = 0;
            COSTOSAL = 0;
            if (BODEGA = '') then
                FOR SELECT MVAR_CANT, MVAR_FECHA, MVAR_TIPODOC, MVAR_CONS
                    FROM MOVIMIENTO_ARTICULO
                    WHERE (MVAR_FECHA >= :FECINI) AND (MVAR_FECHA <= :FECFIN) AND (MVAR_TIPODOC <> 13) AND
                    (ARTI_COD = :CODIGO) AND (MVAR_ENTRADA = 'N')
                    INTO :CANT, :FECHA, :TIPO, :ID
                    DO
                    BEGIN
                    SELECT COST_SALDOP, COST_SALDOC FROM COSTOS WHERE COST_TIPO = :TIPO AND COST_IDMOV = :ID INTO :COSTO, :EXIST;
                    if (EXIST <> 0) then
                        COSTO = COSTO / EXIST;
                    ELSE
                        COSTO = 0;
                    COSTOSAL = COSTOSAL + (COSTO*CANT);
                    SALIDAS = SALIDAS + CANT;
                    END
            ELSE
                FOR SELECT MVAR_CANT, MVAR_FECHA, MVAR_TIPODOC, MVAR_CONS
                    FROM MOVIMIENTO_ARTICULO
                    WHERE (MVAR_FECHA >= :FECINI) AND (MVAR_FECHA <= :FECFIN) AND (MVAR_TIPODOC <> 13) AND
                    (ARTI_COD = :CODIGO) AND (MVAR_ENTRADA = 'N') AND BODE_COD = :BODEGA
                    INTO :CANT, :FECHA, :TIPO, :ID
                    DO
                    BEGIN
                    SELECT COST_SALDOP, COST_SALDOC FROM COSTOS WHERE COST_TIPO = :TIPO AND COST_IDMOV = :ID INTO :COSTO, :EXIST;
                    if (EXIST <> 0) then
                        COSTO = COSTO / EXIST;
                    ELSE
                        COSTO = 0;
                    COSTOSAL = COSTOSAL + (COSTO*CANT);
                    SALIDAS = SALIDAS + CANT;
                    END
            if (SALIDAS IS NULL) then
              SALIDAS = 0;
            if (COSTOSAL IS NULL) then
              COSTOSAL = 0;
            SALDOFIN = SALDOINI + ENTRADAS - SALIDAS;
            COSTOFIN = COSTOINI + COSTOENT - COSTOSAL;
            if (BODEGA = '') then
                BEGIN
                EXECUTE PROCEDURE SALDO_INICIAL_TOTAL_INV(CODIGO, fecfin+1) returning_values (canfinal);
                EXECUTE PROCEDURE VALOR_INICIAL_INVENTARIO(CODIGO, FECFIN+1) returning_values (cosfinal);
                END
            ELSE
                BEGIN
                EXECUTE PROCEDURE SALDO_INICIAL_INVENTARIO(CODIGO, FECFIN+1, :BODEGA) returning_values (CANFINAL);
                EXECUTE PROCEDURE COSTO_PROMEDIO(CODIGO, FECFIN+1) returning_values (COSFINAL);
                COSFINAL = COSFINAL * CANFINAL;
                END
            SUSPEND;
            END
        ELSE
            BEGIN
            SALDOFIN = SALDOINI;
            COSTOFIN = COSTOINI;
            COSTOENT = 0;
            COSTOSAL = 0;
            FOR SELECT TIDO_NOMCORTO, MVAR_ENTRADA, MVAR_PREF, MVAR_NUMERO, MVAR_CANT, MVAR_COSTO, MVAR_CONC, MVAR_FECHA, M.TERC_NIT, MVAR_CONS, BODE_COD
                FROM MOVIMIENTO_ARTICULO M, TIPO_DOCUMENTO TD
                WHERE TD.TIDO_COD = MVAR_TIPODOC AND (MVAR_FECHA >= :FECINI) AND (MVAR_FECHA <= :FECFIN) AND (MVAR_TIPODOC <> 13) AND (ARTI_COD = :CODIGO)
                ORDER BY MVAR_FECHA, MVAR_CONS
                INTO :TIPODOC, :ENTRADA, :PREFIJO, :NUMERO, :ENTRADAS, :COSTOENT, :CONCEPTO, :FECHA, :NIT, :CONS, :CODBOD
                DO
                    BEGIN
                    if (ENTRADA = 'S') then
                        BEGIN
                        SALIDAS = 0;
                        SALDOFIN = SALDOFIN + ENTRADAS;
                        COSTOFIN = COSTOFIN + (ENTRADAS * COSTOENT);
                        if (SALDOFIN > 0) then
                            COSTOSAL = COSTOFIN / SALDOFIN;
                        end
                    ELSE
                        BEGIN
                        SALIDAS = ENTRADAS;
                        ENTRADAS = 0;
                        if (SALDOFIN > 0) then
                            COSTOENT = COSTOFIN / SALDOFIN;
                        else
                            EXECUTE PROCEDURE COSTO_PROMEDIO(:CODIGO, :FECHA) returning_values (:COSTOENT);
                        SALDOFIN = SALDOFIN - SALIDAS;
                        COSTOFIN = COSTOFIN - (SALIDAS * COSTOENT);
                        if (SALDOFIN > 0) then
                            COSTOSAL = COSTOFIN / SALDOFIN;
                        END
                    SUSPEND;
                    END
            END
        END
 $$IBE$$*/ SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE EXISTENCIAS_DESDE_HASTA(
    FECHA DATE,
    ARTINI VARCHAR(20),
    ARTFIN VARCHAR(20),
    GRPINI VARCHAR(3),
    GRPFIN VARCHAR(3),
    BODINI VARCHAR(2),
    BODFIN VARCHAR(2),
    ORDEN CHAR(1),
    AGRUPA CHAR(1),
    DETALLE CHAR(1),
    RESERVA CHAR(1),
    ENPESO CHAR(1),
    SUCURSAL INTEGER)
RETURNS (
    CANT NUMERIC(18,4),
    COSTO NUMERIC(18,2),
    COSTO_LOTE NUMERIC(18,2),
    CODIGO VARCHAR(15),
    NOMBRE VARCHAR(60),
    UNIDAD VARCHAR(8),
    STAND VARCHAR(15),
    CODGRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    CODSUBG VARCHAR(3),
    NOMSUBG VARCHAR(30),
    CODMARC VARCHAR(3),
    NOMMARC VARCHAR(30),
    CODBOD VARCHAR(2),
    LOTE VARCHAR(15),
    NOMBOD VARCHAR(30),
    COSTOTOT NUMERIC(18,2),
    ULTCOSTO NUMERIC(18,2),
    FECHACOSTO DATE,
    CONSUMO NUMERIC(18,2),
    RESERVADO NUMERIC(18,4),
    ORDENADO NUMERIC(18,4),
    IVA NUMERIC(9,2),
    PESOUNIT NUMERIC(18,4),
    PESOTOTAL NUMERIC(18,4),
    CODBAR VARCHAR(20))
AS
declare variable exist char(1);
declare variable codini varchar(20);
declare variable codfin varchar(20);
declare variable desini varchar(20);
declare variable desfin varchar(20);
declare variable ordenc numeric(18,4);
declare variable pedido numeric(18,4);
declare variable ok char(1);
declare variable id integer;
declare variable item integer;
declare variable und varchar(8);
declare variable factor numeric(18,4);
declare variable cant2 numeric(18,4);
declare variable PEDAUTO CHAR(2);
BEGIN
if (ORDEN = 'C') then
    BEGIN
    CODINI = ARTINI;
    CODFIN = ARTFIN;
    DESINI = '';
    DESFIN = 'zz';
    END
ELSE
    BEGIN
    DESINI = ARTINI;
    DESFIN = ARTFIN;
    CODINI = '';
    CODFIN = 'zz';
    END
EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION', 'FACTURAS', 'GENERAR PEDIDO AUTOMATICAMENTE CON LA FACTURA') returning_values (pedauto);
if (DETALLE = 'B') then
  BEGIN
  FOR SELECT ARTI_COD, ARTI_DES, ARTI_UNIDAD, ARTI_EXIST, TAIV_PORC, A.GRUP_COD, A.SUBG_COD, A.MARC_COD, BODE_COD, BODE_NOM, ARTI_CONSUMO, ARTI_PESO/1000
      FROM ARTICULO A, BODEGA B, TARIFA_IVA T
      WHERE ARTI_COD >= :CODINI AND ARTI_COD <= :CODFIN AND ARTI_DES >= :DESINI AND ARTI_DES <= :DESFIN AND ESAR_COD <> 'I' AND BODE_COD >= :BODINI AND
      BODE_COD <= :BODFIN AND ((SUCU_ID = :SUCURSAL) or (:SUCURSAL = 0)) AND A.TAIV_COD = T.TAIV_COD
      INTO :CODIGO, :NOMBRE, :UNIDAD, :EXIST, :IVA, :CODGRUPO, :CODSUBG, :CODMARC, :CODBOD, :NOMBOD, :CONSUMO, :pesounit
      DO
        BEGIN
        OK = 'N';
        if (AGRUPA = 'G') then
            BEGIN
            if ((CODGRUPO >= GRPINI) AND (CODGRUPO <= GRPFIN)) then
                OK = 'S';
            end
        ELSE
            if (AGRUPA = 'M') then
                BEGIN
                if ((CODMARC >= GRPINI) AND (CODMARC <= GRPFIN)) then
                    OK = 'S';
                END
        if (OK = 'S') then
            BEGIN
            NOMGRUPO = '';
            NOMMARC = '';
            NOMSUBG = '';
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            SELECT MAX(COBA_COD) FROM BARRAS_ARTICULO WHERE ARTI_COD = :codigo AND COBA_UNIDAD = :unidad INTO :codbar;
            if (CODBAR IS NULL) then
                CODBAR = CODIGO;
            if (EXIST <> 'N') then
                BEGIN
                SELECT STAND_COD FROM STANDS WHERE ARTI_COD = :CODIGO AND STAND_BODEGA = :CODBOD INTO :STAND;
                EXECUTE PROCEDURE SALDO_INICIAL_INVENTARIO(CODIGO, FECHA, :CODBOD) returning_values (CANT);
                EXECUTE PROCEDURE COSTO_PROMEDIO_UNIDAD(CODIGO, FECHA, UNIDAD) returning_values (COSTO);
                EXECUTE PROCEDURE ULTIMO_COSTO(CODIGO, FECHA, UNIDAD) returning_values (ULTCOSTO);
                SELECT MAX(MVAR_FECHA) FROM MOVIMIENTO_ARTICULO WHERE ARTI_COD = :CODIGO AND MVAR_ENTRADA = 'S' AND MVAR_FECHA <= :FECHA INTO :FECHACOSTO;
                COSTOTOT = :CANT * :COSTO;
                CONSUMO = CONSUMO * CANT;
                if (RESERVA = 'S') then
                    BEGIN
                    SELECT SUM(ORID_ENTREGAR)
                        FROM ORDENINVENTARIO_DETALLE OD, ordenes_inventario O
                        WHERE O.ORIN_ID = OD.ORIN_ID AND ARTI_COD = :CODIGO AND ORIN_FECHA <= :FECHA AND ORIN_FECLLEGA >= :FECHA AND ORID_ANULADO = 'N' AND OD.BODE_COD = :CODBOD
                        INTO :ORDENADO;
                    if (ORDENADO IS NULL) then
                        ORDENADO = 0;
                    ORDENC = 0;
                    FOR SELECT O.ORDC_ID, OCDE_ITEM, OCDE_CANT * OCDE_FACTOR
                        FROM ORDENES_COMPRA O, ORDENES_COMPRA_DETALLE OD
                        WHERE O.ORDC_ID = OD.ORDC_ID AND OD.ARTI_COD = :CODIGO AND (ORDC_FECHA+ORDC_VALIDEZ) >= :FECHA AND ORDC_FECHA <= :FECHA AND OCDE_ANULADO = 'N' AND OD.BODE_COD = :CODBOD
                        INTO :ID, :ITEM, :CANT2
                        do
                        BEGIN
                        EXECUTE PROCEDURE FALTANTE(23, 21, ID, ITEM) returning_values (PEDIDO, UND, FACTOR);
                        if (PEDIDO * FACTOR = CANT2) then /* SI NO SE HA FACTURADO MIRE A VER SI SE REMISIONO */
                            EXECUTE PROCEDURE FALTANTE(23, 22, ID, ITEM) returning_values (PEDIDO, UND, FACTOR);
                        if (PEDIDO IS NULL) then
                            PEDIDO = 0;
                        ORDENC = ORDENC + PEDIDO * FACTOR;
                        END
                    ORDENADO = ORDENADO + ORDENC;
                    SELECT SUM(RSDE_LIBERAR)
                        FROM RESERVAS_DETALLE RD, RESERVAS R
                        WHERE R.RESE_ID = RD.RESE_ID AND ARTI_COD = :CODIGO AND RESE_FECHA <= :FECHA AND RESE_VENCE >= :FECHA AND RD.BODE_COD = :CODBOD AND RSDE_ANULADO = 'N'
                        INTO :RESERVADO;
                    if (RESERVADO IS NULL) then
                        RESERVADO = 0;
                    PEDIDO = 0;
                    FOR SELECT P.PEDI_ID, PEDE_ITEM, PEDE_CANT * PEDE_FACTOR
                        FROM PEDIDOS P, PEDIDOS_DETALLE PD
                        WHERE P.PEDI_ID = PD.PEDI_ID AND PD.ARTI_COD = :CODIGO AND (PEDI_FECHA+PEDI_VALIDEZ) >= :FECHA AND PEDI_FECHA <= :FECHA AND PEDE_ANULADO = 'N' AND BODE_COD = :CODBOD
                        INTO :ID, :ITEM, :CANT2
                        do
                        BEGIN
                        EXECUTE PROCEDURE FALTANTE(34, 31, ID, ITEM) returning_values (ORDENC, UND, FACTOR);
                        if ((ORDENC * FACTOR = CANT2) or (PEDAUTO = 'SI')) then /* SI NO SE HA FACTURADO MIRE A VER SI SE REMISIONO */
                            EXECUTE PROCEDURE FALTANTE(34, 32, ID, ITEM) returning_values (ORDENC, UND, FACTOR);
                        if (ORDENC IS NULL) then
                            ORDENC = 0;
                        PEDIDO = PEDIDO + ORDENC * FACTOR;
                        END
                    RESERVADO = RESERVADO + PEDIDO;
                    END
                ELSE
                    BEGIN
                    RESERVADO = 0;
                    ORDENADO = 0;
                    END
                if (ENPESO = 'S') then
                    BEGIN
                    if (pesounit IS NULL) then
                        pesounit = 0;
                    if (PESOUNIT <> 0) then
                        BEGIN
                        pesototal = PESOUNIT * cant;
                        SUSPEND;
                        END
                    END
                ELSE
                    SUSPEND;
                END
            END
        END
  END

if (DETALLE = 'L') then
  BEGIN
  FOR SELECT A.ARTI_COD, ARTI_DES, ARTI_UNIDAD, ARTI_EXIST, TAIV_PORC, A.GRUP_COD, A.SUBG_COD, A.MARC_COD, L.lote_nro, L.lote_nro||' - '||L.lote_vence, ARTI_CONSUMO,l.bode_cod, L.lote_saldo,l.lote_costo, ARTI_PESO/1000
      FROM ARTICULO A, LOTES l, TARIFA_IVA T
      WHERE A.ARTI_COD >= '0' AND A.ARTI_COD <= 'zz' AND ARTI_DES >= '' AND ARTI_DES <= 'zz' AND ESAR_COD <> 'I' AND A.TAIV_COD = T.TAIV_COD and a.arti_cod = l.arti_cod
      INTO :CODIGO, :NOMBRE, :UNIDAD, :EXIST, :IVA, :CODGRUPO, :CODSUBG, :CODMARC, :LOTE, :NOMBOD, :CONSUMO, :codbod, :cant, :costo_lote, :pesounit
      DO
        BEGIN
        OK = 'N';
        if (AGRUPA = 'G') then
            BEGIN
            if ((CODGRUPO >= GRPINI) AND (CODGRUPO <= GRPFIN)) then
                OK = 'S';
            end
        ELSE
            if (AGRUPA = 'M') then
                BEGIN
                if ((CODMARC >= GRPINI) AND (CODMARC <= GRPFIN)) then
                    OK = 'S';
                END
        if (OK = 'S') then
            BEGIN
            NOMGRUPO = '';
            NOMMARC = '';
            NOMSUBG = '';
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            SELECT MAX(COBA_COD) FROM BARRAS_ARTICULO WHERE ARTI_COD = :codigo AND COBA_UNIDAD = :unidad INTO :codbar;
            if (CODBAR IS NULL) then
                CODBAR = CODIGO;

            if (EXIST <> 'N') then
                BEGIN
                EXECUTE PROCEDURE COSTO_PROMEDIO_UNIDAD(CODIGO, FECHA, UNIDAD) returning_values (COSTO);
                EXECUTE PROCEDURE ULTIMO_COSTO(CODIGO, FECHA, UNIDAD) returning_values (ULTCOSTO);
                SELECT MAX(MVAR_FECHA) FROM MOVIMIENTO_ARTICULO WHERE ARTI_COD = :CODIGO AND MVAR_ENTRADA = 'S' AND MVAR_FECHA <= :FECHA INTO :FECHACOSTO;
                COSTOTOT = :CANT * :COSTO;
                CONSUMO = CONSUMO * CANT;
                if (RESERVA = 'S') then
                    BEGIN
                    SELECT SUM(ORID_ENTREGAR)
                        FROM ORDENINVENTARIO_DETALLE OD, ordenes_inventario O
                        WHERE O.ORIN_ID = OD.ORIN_ID AND ARTI_COD = :CODIGO AND ORIN_FECHA <= :FECHA AND ORIN_FECLLEGA >= :FECHA AND ORID_ANULADO = 'N'
                        INTO :ORDENADO;
                    if (ORDENADO IS NULL) then
                        ORDENADO = 0;
                    ORDENC = 0;
                    FOR SELECT O.ORDC_ID, OCDE_ITEM, OCDE_CANT * OCDE_FACTOR
                        FROM ORDENES_COMPRA O, ORDENES_COMPRA_DETALLE OD
                        WHERE O.ORDC_ID = OD.ORDC_ID AND OD.ARTI_COD = :CODIGO AND (ORDC_FECHA+ORDC_VALIDEZ) >= :FECHA AND ORDC_FECHA <= :FECHA AND OCDE_ANULADO = 'N'
                        INTO :ID, :ITEM, :CANT2
                        do
                        BEGIN
                        EXECUTE PROCEDURE FALTANTE(23, 21, ID, ITEM) returning_values (PEDIDO, UND, FACTOR);
                        if (PEDIDO * FACTOR = CANT2) then /* SI NO SE HA FACTURADO MIRE A VER SI SE REMISIONO */
                            EXECUTE PROCEDURE FALTANTE(23, 22, ID, ITEM) returning_values (PEDIDO, UND, FACTOR);
                        if (PEDIDO IS NULL) then
                            PEDIDO = 0;
                        ORDENC = ORDENC + PEDIDO * FACTOR;
                        END
                    ORDENADO = ORDENADO + ORDENC;
                    SELECT SUM(RSDE_LIBERAR)
                        FROM RESERVAS_DETALLE RD, RESERVAS R
                        WHERE R.RESE_ID = RD.RESE_ID AND ARTI_COD = :CODIGO AND RESE_FECHA <= :FECHA AND RESE_VENCE >= :FECHA AND RSDE_ANULADO = 'N'
                        INTO :RESERVADO;
                    if (RESERVADO IS NULL) then
                        RESERVADO = 0;
                    PEDIDO = 0;
                    FOR SELECT P.PEDI_ID, PEDE_ITEM, PEDE_CANT * PEDE_FACTOR
                        FROM PEDIDOS P, PEDIDOS_DETALLE PD
                        WHERE P.PEDI_ID = PD.PEDI_ID AND PD.ARTI_COD = :CODIGO AND (PEDI_FECHA+PEDI_VALIDEZ) >= :FECHA AND PEDI_FECHA <= :FECHA AND PEDE_ANULADO = 'N'
                        INTO :ID, :ITEM, :CANT2
                        do
                        BEGIN
                        EXECUTE PROCEDURE FALTANTE(34, 31, ID, ITEM) returning_values (ORDENC, UND, FACTOR);
                        if ((ORDENC * FACTOR = CANT2) or (PEDAUTO = 'SI')) then /* SI NO SE HA FACTURADO MIRE A VER SI SE REMISIONO */
                            EXECUTE PROCEDURE FALTANTE(34, 32, ID, ITEM) returning_values (ORDENC, UND, FACTOR);
                        if (ORDENC IS NULL) then
                            ORDENC = 0;
                        PEDIDO = PEDIDO + ORDENC * FACTOR;
                        END
                    RESERVADO = RESERVADO + PEDIDO;
                    END
                ELSE
                    BEGIN
                    RESERVADO = 0;
                    ORDENADO = 0;
                    END
                if (ENPESO = 'S') then
                    BEGIN
                    if (pesounit IS NULL) then
                        pesounit = 0;
                    if (PESOUNIT <> 0) then
                        BEGIN
                        pesototal = PESOUNIT * cant;
                        SUSPEND;
                        END
                    END
                ELSE
                    SUSPEND;
                END
            END
        END
  end
if (DETALLE = 'N') then
  BEGIN
  FOR SELECT ARTI_COD, ARTI_DES, ARTI_UNIDAD, ARTI_EXIST, TAIV_PORC, A.GRUP_COD, A.SUBG_COD, A.MARC_COD, ARTI_CONSUMO, ARTI_PESO/1000
      FROM ARTICULO A, TARIFA_IVA T
      WHERE ARTI_COD >= :CODINI AND ARTI_COD <= :CODFIN AND ARTI_DES >= :DESINI AND ARTI_DES <= :DESFIN AND ESAR_COD <> 'I' AND A.TAIV_COD = T.TAIV_COD
      INTO :CODIGO, :NOMBRE, :UNIDAD, :EXIST, :IVA, :CODGRUPO, :CODSUBG, :CODMARC, :CONSUMO, :pesounit
      DO
        BEGIN
        OK = 'N';
        if (AGRUPA = 'G') then
            BEGIN
            if ((GRPINI = '0') AND (GRPFIN = 'zz')) then
                OK = 'S';
            else
                if ((CODGRUPO >= GRPINI) AND (CODGRUPO <= GRPFIN)) then
                    OK = 'S';
            end
        ELSE
            if (AGRUPA = 'M') then
                BEGIN
                if ((GRPINI = '0') AND (GRPFIN = 'zzz')) then
                    OK = 'S';
                else
                    if ((CODMARC >= GRPINI) AND (CODMARC <= GRPFIN)) then
                        OK = 'S';
                END
        if (OK = 'S') then
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            SELECT MAX(COBA_COD) FROM BARRAS_ARTICULO WHERE ARTI_COD = :codigo AND COBA_UNIDAD = :unidad INTO :codbar;
            if (CODBAR IS NULL) then
                CODBAR = CODIGO;

            if (EXIST <> 'N') then
                BEGIN
                EXECUTE PROCEDURE SALDO_INICIAL_TOTAL_INV(CODIGO, FECHA) returning_values (CANT);
                EXECUTE PROCEDURE COSTO_PROMEDIO_UNIDAD(CODIGO, FECHA, UNIDAD) returning_values (COSTO);
                EXECUTE PROCEDURE ULTIMO_COSTO(CODIGO, FECHA, UNIDAD) returning_values (ULTCOSTO);
                SELECT MAX(MVAR_FECHA) FROM MOVIMIENTO_ARTICULO WHERE ARTI_COD = :CODIGO AND MVAR_ENTRADA = 'S' AND MVAR_FECHA <= :FECHA INTO :FECHACOSTO;
                COSTOTOT = :CANT * :COSTO;
                CONSUMO = CONSUMO * CANT;
                if (RESERVA = 'S') then
                    BEGIN
                    SELECT SUM(ORID_ENTREGAR)
                        FROM ORDENINVENTARIO_DETALLE OD, ordenes_inventario O
                        WHERE O.ORIN_ID = OD.ORIN_ID AND ARTI_COD = :CODIGO AND ORIN_FECHA <= :FECHA AND ORIN_FECLLEGA >= :FECHA AND ORID_ANULADO = 'N'
                        INTO :ORDENADO;
                        if (ORDENADO IS NULL) then
                            ORDENADO = 0;
                    ORDENC = 0;
                    FOR SELECT O.ORDC_ID, OCDE_ITEM, OCDE_CANT * OCDE_FACTOR
                        FROM ORDENES_COMPRA O, ORDENES_COMPRA_DETALLE OD
                        WHERE O.ORDC_ID = OD.ORDC_ID AND OD.ARTI_COD = :CODIGO AND (ORDC_FECHA+ORDC_VALIDEZ) >= :FECHA AND ORDC_FECHA <= :FECHA AND OCDE_ANULADO = 'N'
                        INTO :ID, :ITEM, :CANT2
                        do
                        BEGIN
                        EXECUTE PROCEDURE FALTANTE(23, 21, ID, ITEM) returning_values (PEDIDO, UND, FACTOR);
                        if (PEDIDO * FACTOR = CANT2) then /* SI NO SE HA FACTURADO MIRE A VER SI SE REMISIONO */
                            EXECUTE PROCEDURE FALTANTE(23, 22, ID, ITEM) returning_values (PEDIDO, UND, FACTOR);
                        if (PEDIDO IS NULL) then
                            PEDIDO = 0;
                        ORDENC = ORDENC + PEDIDO * FACTOR;
                        END
                    ORDENADO = ORDENADO + ORDENC;
                    SELECT SUM(RSDE_LIBERAR)
                        FROM RESERVAS_DETALLE RD, RESERVAS R
                        WHERE R.RESE_ID = RD.RESE_ID AND ARTI_COD = :CODIGO AND RESE_FECHA <= :FECHA AND RESE_VENCE >= :FECHA AND RSDE_ANULADO = 'N'
                        INTO :RESERVADO;
                    if (RESERVADO IS NULL) then
                        RESERVADO = 0;
                    PEDIDO = 0;
                    FOR SELECT P.PEDI_ID, PEDE_ITEM, PEDE_CANT * PEDE_FACTOR
                        FROM PEDIDOS P, PEDIDOS_DETALLE PD, PUNTO_VENTA PT
                        WHERE P.PEDI_ID = PD.PEDI_ID AND PD.ARTI_COD = :CODIGO AND PT.ptvt_id = P.PTVT_ID AND (PEDI_FECHA+PEDI_VALIDEZ) >= :FECHA AND PEDI_FECHA <= :FECHA AND PEDE_ANULADO = 'N'
                        INTO :ID, :ITEM, :CANT2
                        do
                        BEGIN
                        EXECUTE PROCEDURE FALTANTE(34, 31, ID, ITEM) returning_values (ORDENC, UND, FACTOR);
                        if ((ORDENC * FACTOR = CANT2) or (PEDAUTO = 'SI')) then /* SI NO SE HA FACTURADO MIRE A VER SI SE REMISIONO */
                            EXECUTE PROCEDURE FALTANTE(34, 32, ID, ITEM) returning_values (ORDENC, UND, FACTOR);
                        if (ORDENC IS NULL) then
                            ORDENC = 0;
                        PEDIDO = PEDIDO + ORDENC * FACTOR;
                        END
                    if (PEDIDO IS NULL) then
                        PEDIDO = 0;
                    RESERVADO = RESERVADO + PEDIDO;
                    END
                ELSE
                    BEGIN
                    RESERVADO = 0;
                    ORDENADO = 0;
                    END
                if (ENPESO = 'S') then
                    BEGIN
                    if (pesounit IS NULL) then
                        pesounit = 0;
                    if (PESOUNIT <> 0) then
                        BEGIN
                        pesototal = PESOUNIT * cant;
                        SUSPEND;
                        END
                    END
                ELSE
                    SUSPEND;
                END
            END
        END
  END
END

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE INVENTARIO_FAMILIA(
    FECHA DATE,
    FAMILIA VARCHAR(20))
RETURNS (
    ARTICULO VARCHAR(20),
    INTERNO VARCHAR(20),
    DESCRIPCION VARCHAR(60),
    CANTIDAD NUMERIC(18,2),
    UNIDAD VARCHAR(8),
    TOTAL NUMERIC(18,2))
AS
declare variable COSTO NUMERIC(18,4);
begin
FOR SELECT A.ARTI_COD, ARTI_DES, ARTI_UNIDAD, p.pvar_cod FROM ARTICULO A, PROVEEDOR_ARTICULO P
    WHERE ESAR_COD <> 'I' AND A.arti_cod = P.arti_cod AND P.terc_nit = :FAMILIA
    INTO :ARTICULO, :descripcion, :UNIDAD, :INTERNO
    DO
    BEGIN
    EXECUTE PROCEDURE SALDO_INICIAL_TOTAL_INV(ARTICULO, FECHA) returning_values (cantidad);
    EXECUTE PROCEDURE COSTO_PROMEDIO_UNIDAD(ARTICULO, FECHA, UNIDAD) returning_values (COSTO);
    TOTAL = COSTO * CANTIDAD;
    suspend;
    END
end

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE KARDEX_DESDE_HASTA(
    ARTICULO VARCHAR(15),
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    INICIAL_CANT NUMERIC(18,4),
    INICIAL_PESOS NUMERIC(18,2),
    ENT_CANT NUMERIC(18,4),
    ENT_PESOS NUMERIC(18,2),
    SAL_CANT NUMERIC(18,4),
    SAL_PESOS NUMERIC(18,2),
    FINAL_CANT NUMERIC(18,4),
    FINAL_PESOS NUMERIC(18,2))
AS
BEGIN
  EXECUTE PROCEDURE SALDO_INICIAL_TOTAL_INV(ARTICULO, FECINI) returning_values (INICIAL_CANT);
  SELECT SUM(MVAR_CANT) FROM MOVIMIENTO_ARTICULO
    WHERE (MVAR_FECHA >= :FECINI) AND (MVAR_FECHA < :FECFIN) AND
          (ARTI_COD = :ARTICULO) AND (MVAR_ENTRADA = 'S') INTO :ENT_CANT;
  if (ENT_CANT IS NULL) then
    ENT_CANT = 0;
  SELECT SUM(MVAR_CANT) FROM MOVIMIENTO_ARTICULO
    WHERE (MVAR_FECHA >= :FECINI) AND (MVAR_FECHA < :FECFIN) AND
          (ARTI_COD = :ARTICULO) AND (MVAR_ENTRADA = 'N') INTO :SAL_CANT;
  if (SAL_CANT IS NULL) then
    SAL_CANT = 0;
  EXECUTE PROCEDURE VALOR_INICIAL_INVENTARIO(ARTICULO, FECINI) returning_values (INICIAL_PESOS);
  SELECT SUM(COST_ENTP) FROM COSTOS
    WHERE (COST_FECHA >= :FECINI) AND (COST_FECHA < :FECFIN) AND
          (ARTI_COD = :ARTICULO) INTO :ENT_PESOS;
  if (ENT_PESOS IS NULL) then
    ENT_PESOS = 0;
  SELECT SUM(COST_SALP) FROM COSTOS
    WHERE (COST_FECHA >= :FECINI) AND (COST_FECHA < :FECFIN) AND
          (ARTI_COD = :ARTICULO) INTO :SAL_PESOS;
  if (SAL_PESOS IS NULL) then
    SAL_PESOS = 0;
  FINAL_CANT = INICIAL_CANT + ENT_CANT - SAL_CANT;
  FINAL_PESOS = INICIAL_PESOS + ENT_PESOS - SAL_PESOS;
  SUSPEND;
END

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE REP_EXISTENCIAS_PRECIOS(
    ARTINI VARCHAR(20),
    ARTFIN VARCHAR(20),
    GRPINI VARCHAR(2),
    GRPFIN VARCHAR(2),
    ORDEN CHAR(1),
    LISTA INTEGER,
    FECHA DATE,
    BODINI VARCHAR(2),
    BODFIN VARCHAR(2),
    TODAS CHAR(1),
    IVAINC CHAR(1),
    SINBOD CHAR(1),
    SUBEMPRESA INTEGER)
RETURNS (
    CODIGO VARCHAR(15),
    NOMBRE VARCHAR(60),
    UNIDAD VARCHAR(8),
    CODGRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    CODSUBG VARCHAR(3),
    NOMSUBG VARCHAR(30),
    CODMARC VARCHAR(3),
    NOMMARC VARCHAR(30),
    NOMLISTA VARCHAR(30),
    PRECIO NUMERIC(18,2),
    MARGEN NUMERIC(9,2),
    IVA NUMERIC(9,2),
    CODBOD VARCHAR(2),
    NOMBOD VARCHAR(30),
    CANT NUMERIC(18,4),
    COSTOTOT NUMERIC(18,2))
AS
DECLARE VARIABLE EXIST CHAR(1);
DECLARE VARIABLE CODINI VARCHAR(20);
DECLARE VARIABLE CODFIN VARCHAR(20);
DECLARE VARIABLE DESINI VARCHAR(20);
DECLARE VARIABLE DESFIN VARCHAR(20);
DECLARE VARIABLE FECINI DATE;
DECLARE VARIABLE FECFIN DATE;
DECLARE VARIABLE UTIL NUMERIC(9,2);
DECLARE VARIABLE MOU CHAR(10);
DECLARE VARIABLE LISIVA CHAR(1);
BEGIN
if (ORDEN = 'C') then
    BEGIN
    CODINI = ARTINI;
    CODFIN = ARTFIN;
    DESINI = '';
    DESFIN = 'zz';
    END
ELSE
    BEGIN
    DESINI = ARTINI;
    DESFIN = ARTFIN;
    CODINI = '';
    CODFIN = 'zz';
    END
    
EXECUTE PROCEDURE LEE_CONFIGURACION ('FACTURACION', 'ARTICULOS', 'SUGERIR PRECIOS CON PORCENTAJE DE MARGEN O UTILIDAD') returning_values (MOU);
    
FOR SELECT ARTI_COD, ARTI_DES, ARTI_UNIDAD, ARTI_EXIST, A.GRUP_COD, A.SUBG_COD, A.MARC_COD, TAIV_PORC
    FROM ARTICULO A, TARIFA_IVA T
    WHERE ARTI_COD >= :CODINI AND ARTI_COD <= :CODFIN AND A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :GRPFIN AND
    ARTI_DES >= :DESINI AND ARTI_DES <= :DESFIN AND ESAR_COD <> 'I' AND A.TAIV_COD = T.TAIV_COD
    INTO :CODIGO, :NOMBRE, :UNIDAD, :EXIST, :CODGRUPO, :CODSUBG, :CODMARC, :IVA
    DO
    BEGIN
    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
    if (EXIST <> 'N') then
        BEGIN
        if (LISTA = 255) then
            BEGIN
            if (TODAS = 'N') then
                begin
                /* Busque las listas validas hoy */
                FOR SELECT LIPR_NOM, LIPR_FECINI, LIPR_FECFIN, PRAR_FIJO, PRAR_MARGEN, PRAR_UTIL, LIPR_MODIF
                    FROM LISTA_PRECIOS L, PRECIOS_ARTICULO P
                    WHERE L.LIPR_COD = P.LIPR_COD AND ARTI_COD = :CODIGO
                    INTO :NOMLISTA, :FECINI, :FECFIN, :PRECIO, :MARGEN, :UTIL, :LISIVA
                    DO
                      BEGIN
                      if (MOU = 'UTILIDAD') then
                        MARGEN = UTIL;
                      if (IVAINC = 'S') THEN
                        BEGIN
                        if (LISIVA = 'N') then
                            PRECIO = PRECIO * (1 + (IVA/100));
                        END
                      END
                end   
            ELSE
                FOR SELECT LIPR_NOM, PRAR_FIJO, PRAR_MARGEN, PRAR_UTIL, LIPR_MODIF
                    FROM LISTA_PRECIOS L, PRECIOS_ARTICULO P
                    WHERE L.LIPR_COD = P.LIPR_COD AND ARTI_COD = :CODIGO
                    INTO :NOMLISTA, :PRECIO, :MARGEN, :UTIL, :LISIVA
                    DO
                    BEGIN
                    EXECUTE PROCEDURE LEE_CONFIGURACION ('FACTURACION', 'ARTICULOS', 'SUGERIR PRECIOS CON PORCENTAJE DE MARGEN O UTILIDAD') returning_values (MOU);
                    if (MOU = 'UTILIDAD') then
                        MARGEN = UTIL;
                    if (IVAINC = 'S') THEN
                        BEGIN
                        if (LISIVA = 'N') then
                            PRECIO = PRECIO * (1 + (IVA/100));
                        END
                    END
            END /* 255 */
        ELSE
            BEGIN
            if (TODAS = 'N') then
                begin
                /* Busque las listas validas hoy */
                FOR SELECT LIPR_NOM, LIPR_FECINI, LIPR_FECFIN, PRAR_FIJO, PRAR_MARGEN, PRAR_UTIL, LIPR_MODIF
                    FROM LISTA_PRECIOS L, PRECIOS_ARTICULO P
                    WHERE L.LIPR_COD = P.LIPR_COD AND ARTI_COD = :CODIGO AND L.LIPR_COD = :LISTA
                    INTO :NOMLISTA, :FECINI, :FECFIN, :PRECIO, :MARGEN, :UTIL, :LISIVA
                    DO
                    BEGIN
                    if (MOU = 'UTILIDAD') then
                        MARGEN = UTIL;
                    if (IVAINC = 'S') THEN
                        BEGIN
                        if (LISIVA = 'N') then
                            PRECIO = PRECIO * (1 + (IVA/100));
                        END
                    END
                end
            ELSE
                FOR SELECT LIPR_NOM, PRAR_FIJO, PRAR_MARGEN, PRAR_UTIL
                    FROM LISTA_PRECIOS L, PRECIOS_ARTICULO P
                    WHERE L.LIPR_COD = P.LIPR_COD AND ARTI_COD = :CODIGO AND L.LIPR_COD = :LISTA
                    INTO :NOMLISTA, :PRECIO, :MARGEN, :UTIL
                    DO
                    BEGIN
                    if (MOU = 'UTILIDAD') then
                        MARGEN = UTIL;
                    if (IVAINC = 'S') THEN
                        BEGIN
                        if (LISIVA = 'NO') then
                            PRECIO = PRECIO * (1 + (IVA/100));
                        END
                    END
            END
                      
        if (SINBOD = 'S') then
            BEGIN
            EXECUTE PROCEDURE SALDO_INICIAL_TOTAL_INV(CODIGO, FECHA) returning_values (CANT);
            COSTOTOT = CANT * PRECIO;
            if (FECINI is null) then
                SUSPEND;
            else
                if ((FECINI <= :FECHA) AND (FECFIN >= :FECHA)) Then
                    SUSPEND;
            END
        ELSE
            BEGIN
            FOR SELECT BODE_COD, BODE_NOM FROM BODEGA B
                WHERE BODE_COD >= :BODINI AND BODE_COD <= :BODFIN AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                INTO :CODBOD, :NOMBOD
                DO
                BEGIN
                EXECUTE PROCEDURE SALDO_INICIAL_INVENTARIO(CODIGO, FECHA, :CODBOD) returning_values (CANT);
                        
                COSTOTOT = CANT * PRECIO;
                if (FECINI is null) then
                    SUSPEND;
                else
                    if ((FECINI <= :FECHA) AND (FECFIN >= :FECHA)) Then
                        SUSPEND;
                END
            END
        END
    END
END

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE REP_KARDEX_ARTICULO(
    DETALLE CHAR(1),
    FECINI DATE,
    FECFIN DATE,
    ARTINI VARCHAR(20),
    ARTFIN VARCHAR(20),
    GRPINI VARCHAR(2),
    GRPFIN VARCHAR(2),
    ORDEN CHAR(1),
    BODEGA VARCHAR(2))
RETURNS (
    CODIGO VARCHAR(15),
    NOMBRE VARCHAR(60),
    UNIDAD VARCHAR(8),
    CODGRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    CODSUBG VARCHAR(3),
    NOMSUBG VARCHAR(30),
    CODMARC VARCHAR(3),
    NOMMARC VARCHAR(30),
    CODBOD VARCHAR(2),
    SALDOINI NUMERIC(18,4),
    COSTOINI NUMERIC(18,2),
    ENTRADAS NUMERIC(18,4),
    COSTOENT NUMERIC(18,2),
    SALIDAS NUMERIC(18,4),
    COSTOSAL NUMERIC(18,2),
    SALDOFIN NUMERIC(18,4),
    COSTOFIN NUMERIC(18,2),
    TIPODOC VARCHAR(8),
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    CONCEPTO VARCHAR(60),
    NIT VARCHAR(20),
    CONS INTEGER,
    CANFINAL NUMERIC(18,4),
    COSFINAL NUMERIC(18,2))
AS
DECLARE VARIABLE ENTRADA CHAR(1);
DECLARE VARIABLE CANT NUMERIC(18,4);
DECLARE VARIABLE EXIST NUMERIC(18,4);
DECLARE VARIABLE COSTO NUMERIC(18,2);
DECLARE VARIABLE CODINI VARCHAR(20);
DECLARE VARIABLE CODFIN VARCHAR(20);
DECLARE VARIABLE DESINI VARCHAR(20);
DECLARE VARIABLE DESFIN VARCHAR(20);
declare variable TIPO INTEGER;
declare variable ID INTEGER;
BEGIN
if (ORDEN = 'C') then
    BEGIN
    CODINI = ARTINI;
    CODFIN = ARTFIN;
    DESINI = '';
    DESFIN = 'zz';
    END
ELSE
    BEGIN
    DESINI = ARTINI;
    DESFIN = ARTFIN;
    CODINI = '';
    CODFIN = 'zz';
    END
  FOR
    SELECT ARTI_COD, ARTI_DES, ARTI_UNIDAD, A.GRUP_COD, A.SUBG_COD, A.MARC_COD
      FROM ARTICULO A
      WHERE ARTI_COD >= :CODINI AND ARTI_COD <= :CODFIN AND A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :GRPFIN AND ARTI_DES >= :DESINI AND ARTI_DES <= :DESFIN AND A.ESAR_COD <> 'I'
      INTO :CODIGO, :NOMBRE, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
      DO
        BEGIN
        NOMMARC = '';
        NOMSUBG = '';
        SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
        SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
        SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
        if (BODEGA = '') then
            BEGIN
            EXECUTE PROCEDURE SALDO_INICIAL_TOTAL_INV(CODIGO, FECINI) returning_values (:SALDOINI);
            EXECUTE PROCEDURE VALOR_INICIAL_INVENTARIO(CODIGO, FECINI) returning_values (COSTOINI);
            END
        ELSE
            BEGIN
            EXECUTE PROCEDURE SALDO_INICIAL_INVENTARIO(CODIGO, FECINI, :BODEGA) returning_values (SALDOINI);
            EXECUTE PROCEDURE COSTO_PROMEDIO(CODIGO, FECINI) returning_values (COSTOINI);
            COSTOINI = COSTOINI * saldoini;
            END
        if (DETALLE = 'N') then
            BEGIN
            /* SUME LAS ENTRADAS */
            if (BODEGA = '') then
                SELECT SUM(MVAR_CANT), SUM(MVAR_CANT * MVAR_COSTO) FROM MOVIMIENTO_ARTICULO
                  WHERE (MVAR_FECHA >= :FECINI) AND (MVAR_FECHA <= :FECFIN) AND (MVAR_TIPODOC <> 13) AND
                  (ARTI_COD = :CODIGO) AND (MVAR_ENTRADA = 'S') INTO :ENTRADAS, :COSTOENT;
            ELSE
                SELECT SUM(MVAR_CANT), SUM(MVAR_CANT * MVAR_COSTO) FROM MOVIMIENTO_ARTICULO
                  WHERE (MVAR_FECHA >= :FECINI) AND (MVAR_FECHA <= :FECFIN) AND (MVAR_TIPODOC <> 13) AND
                  (ARTI_COD = :CODIGO) AND (MVAR_ENTRADA = 'S') AND BODE_COD = :BODEGA
                  INTO :ENTRADAS, :COSTOENT;
                
            if (ENTRADAS IS NULL) then
              ENTRADAS = 0;
            if (COSTOENT IS NULL) then
              COSTOENT = 0;
            /* CALCULE LAS SALIDAS A COSTO PROMEDIO */
            SALIDAS = 0;
            COSTOSAL = 0;
            if (BODEGA = '') then
                FOR SELECT MVAR_CANT, MVAR_FECHA, MVAR_TIPODOC, MVAR_CONS
                    FROM MOVIMIENTO_ARTICULO
                    WHERE (MVAR_FECHA >= :FECINI) AND (MVAR_FECHA <= :FECFIN) AND (MVAR_TIPODOC <> 13) AND
                    (ARTI_COD = :CODIGO) AND (MVAR_ENTRADA = 'N')
                    INTO :CANT, :FECHA, :TIPO, :ID
                    DO
                    BEGIN
                    SELECT COST_SALDOP, COST_SALDOC FROM COSTOS WHERE COST_TIPO = :TIPO AND COST_IDMOV = :ID INTO :COSTO, :EXIST;
                    if (EXIST <> 0) then
                        COSTO = COSTO / EXIST;
                    ELSE
                        COSTO = 0;
                    COSTOSAL = COSTOSAL + (COSTO*CANT);
                    SALIDAS = SALIDAS + CANT;
                    END
            ELSE
                FOR SELECT MVAR_CANT, MVAR_FECHA, MVAR_TIPODOC, MVAR_CONS
                    FROM MOVIMIENTO_ARTICULO
                    WHERE (MVAR_FECHA >= :FECINI) AND (MVAR_FECHA <= :FECFIN) AND (MVAR_TIPODOC <> 13) AND
                    (ARTI_COD = :CODIGO) AND (MVAR_ENTRADA = 'N') AND BODE_COD = :BODEGA
                    INTO :CANT, :FECHA, :TIPO, :ID
                    DO
                    BEGIN
                    SELECT COST_SALDOP, COST_SALDOC FROM COSTOS WHERE COST_TIPO = :TIPO AND COST_IDMOV = :ID INTO :COSTO, :EXIST;
                    if (EXIST <> 0) then
                        COSTO = COSTO / EXIST;
                    ELSE
                        COSTO = 0;
                    COSTOSAL = COSTOSAL + (COSTO*CANT);
                    SALIDAS = SALIDAS + CANT;
                    END
            if (SALIDAS IS NULL) then
              SALIDAS = 0;
            if (COSTOSAL IS NULL) then
              COSTOSAL = 0;
            SALDOFIN = SALDOINI + ENTRADAS - SALIDAS;
            COSTOFIN = COSTOINI + COSTOENT - COSTOSAL;
            if (BODEGA = '') then
                BEGIN
                EXECUTE PROCEDURE SALDO_INICIAL_TOTAL_INV(CODIGO, fecfin+1) returning_values (canfinal);
                EXECUTE PROCEDURE VALOR_INICIAL_INVENTARIO(CODIGO, FECFIN+1) returning_values (cosfinal);
                END
            ELSE
                BEGIN
                EXECUTE PROCEDURE SALDO_INICIAL_INVENTARIO(CODIGO, FECFIN+1, :BODEGA) returning_values (CANFINAL);
                EXECUTE PROCEDURE COSTO_PROMEDIO(CODIGO, FECFIN+1) returning_values (COSFINAL);
                COSFINAL = COSFINAL * CANFINAL;
                END
            SUSPEND;
            END
        ELSE
            BEGIN
            SALDOFIN = SALDOINI;
            COSTOFIN = COSTOINI;
            COSTOENT = 0;
            COSTOSAL = 0;
            FOR SELECT TIDO_NOMCORTO, MVAR_ENTRADA, MVAR_PREF, MVAR_NUMERO, MVAR_CANT, MVAR_COSTO, MVAR_CONC, MVAR_FECHA, M.TERC_NIT, MVAR_CONS, BODE_COD
                FROM MOVIMIENTO_ARTICULO M, TIPO_DOCUMENTO TD
                WHERE TD.TIDO_COD = MVAR_TIPODOC AND (MVAR_FECHA >= :FECINI) AND (MVAR_FECHA <= :FECFIN) AND (MVAR_TIPODOC <> 13) AND (ARTI_COD = :CODIGO)
                ORDER BY MVAR_FECHA, MVAR_CONS
                INTO :TIPODOC, :ENTRADA, :PREFIJO, :NUMERO, :ENTRADAS, :COSTOENT, :CONCEPTO, :FECHA, :NIT, :CONS, :CODBOD
                DO
                    BEGIN
                    if (ENTRADA = 'S') then
                        BEGIN
                        SALIDAS = 0;
                        SALDOFIN = SALDOFIN + ENTRADAS;
                        COSTOFIN = COSTOFIN + (ENTRADAS * COSTOENT);
                        if (SALDOFIN > 0) then
                            COSTOSAL = COSTOFIN / SALDOFIN;
                        end
                    ELSE
                        BEGIN
                        SALIDAS = ENTRADAS;
                        ENTRADAS = 0;
                        if (SALDOFIN > 0) then
                            COSTOENT = COSTOFIN / SALDOFIN;
                        else
                            EXECUTE PROCEDURE COSTO_PROMEDIO(:CODIGO, :FECHA) returning_values (:COSTOENT);
                        SALDOFIN = SALDOFIN - SALIDAS;
                        COSTOFIN = COSTOFIN - (SALIDAS * COSTOENT);
                        if (SALDOFIN > 0) then
                            COSTOSAL = COSTOFIN / SALDOFIN;
                        END
                    SUSPEND;
                    END
            END
        END
END

^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER PROCEDURE KARDEX_DESDE_HASTA(
    ARTICULO VARCHAR(15),
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    INICIAL_CANT NUMERIC(18,4),
    INICIAL_PESOS NUMERIC(18,2),
    ENT_CANT NUMERIC(18,4),
    ENT_PESOS NUMERIC(18,2),
    SAL_CANT NUMERIC(18,4),
    SAL_PESOS NUMERIC(18,2),
    FINAL_CANT NUMERIC(18,4),
    FINAL_PESOS NUMERIC(18,2))
AS
BEGIN
  EXECUTE PROCEDURE SALDO_INICIAL_TOTAL_INV(ARTICULO, FECINI) returning_values (INICIAL_CANT);
  SELECT SUM(MVAR_CANT) FROM MOVIMIENTO_ARTICULO
    WHERE (MVAR_FECHA >= :FECINI) AND (MVAR_FECHA < :FECFIN) AND
          (ARTI_COD = :ARTICULO) AND (MVAR_ENTRADA = 'S') INTO :ENT_CANT;
  if (ENT_CANT IS NULL) then
    ENT_CANT = 0;
  SELECT SUM(MVAR_CANT) FROM MOVIMIENTO_ARTICULO
    WHERE (MVAR_FECHA >= :FECINI) AND (MVAR_FECHA < :FECFIN) AND
          (ARTI_COD = :ARTICULO) AND (MVAR_ENTRADA = 'N') INTO :SAL_CANT;
  if (SAL_CANT IS NULL) then
    SAL_CANT = 0;
  EXECUTE PROCEDURE VALOR_INICIAL_INVENTARIO(ARTICULO, FECINI) returning_values (INICIAL_PESOS);
  SELECT SUM(COST_ENTP), SUM(COST_SALP) FROM COSTOS
    WHERE (COST_FECHA >= :FECINI) AND (COST_FECHA < :FECFIN) AND
          (ARTI_COD = :ARTICULO) INTO :ENT_PESOS, :SAL_PESOS;
  if (ENT_PESOS IS NULL) then
    ENT_PESOS = 0;
  if (SAL_PESOS IS NULL) then
    SAL_PESOS = 0;
  FINAL_CANT = INICIAL_CANT + ENT_CANT - SAL_CANT;
  FINAL_PESOS = INICIAL_PESOS + ENT_PESOS - SAL_PESOS;
  SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER PROCEDURE VALOR_INICIAL_INVENTARIO(
    ARTICULO VARCHAR(15),
    FECHA DATE)
RETURNS (
    INICIAL NUMERIC(18,2))
AS
DECLARE VARIABLE FEC DATE;
BEGIN
  /* Busca la fecha del último movimiento del artículo antes de la fecha */
  SELECT  MAX(COST_FECHA) FROM COSTOS
  WHERE (ARTI_COD = :ARTICULO) AND (COST_FECHA <= :FECHA) INTO :FEC;
  IF (FEC IS NULL) THEN
    INICIAL = 0;
  ELSE
    /* Con la fecha máxima calcule el costo promedio */
    if (FEC = FECHA) then
        begin
        SELECT FIRST 1 COST_SALDOP FROM COSTOS
            WHERE (ARTI_COD = :ARTICULO) AND (COST_FECHA = :FEC)
            ORDER BY COST_ITEM
            INTO :INICIAL;
        end
    ELSE
        begin
        SELECT FIRST 1 COST_SALDOP+COST_ENTP-COST_SALP FROM COSTOS
            WHERE (ARTI_COD = :ARTICULO) AND (COST_FECHA = :FEC)
            ORDER BY COST_ITEM DESC
            INTO :INICIAL;
        end
  if (INICIAL IS NULL) then
    INICIAL = 0;
  SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE KARDEX_ARTICULO_MES(
    ARTICULO VARCHAR(15),
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    INICIAL NUMERIC(18,2),
    ENTRADA NUMERIC(18,2),
    SALIDA NUMERIC(18,2))
AS
BEGIN /*$$IBE$$ 
  EXECUTE PROCEDURE VALOR_INICIAL_INVENTARIO(ARTICULO, FECINI) returning_values (INICIAL);
  SELECT SUM(COST_ENTP) FROM COSTOS
    WHERE (COST_FECHA >= :FECINI) AND (COST_FECHA < :FECFIN) AND
          (ARTI_COD = :ARTICULO) INTO :ENTRADA;
  if (ENTRADA IS NULL) then
    ENTRADA = 0;
  SELECT SUM(COST_SALP) FROM COSTOS
    WHERE (COST_FECHA >= :FECINI) AND (COST_FECHA < :FECFIN) AND
          (ARTI_COD = :ARTICULO) INTO :SALIDA;
  if (SALIDA IS NULL) then
    SALIDA = 0;
  SUSPEND;
 $$IBE$$*/ SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE KARDEX_DESDE_HASTA(
    ARTICULO VARCHAR(15),
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    INICIAL_CANT NUMERIC(18,4),
    INICIAL_PESOS NUMERIC(18,2),
    ENT_CANT NUMERIC(18,4),
    ENT_PESOS NUMERIC(18,2),
    SAL_CANT NUMERIC(18,4),
    SAL_PESOS NUMERIC(18,2),
    FINAL_CANT NUMERIC(18,4),
    FINAL_PESOS NUMERIC(18,2))
AS
BEGIN /*$$IBE$$ 
  EXECUTE PROCEDURE SALDO_INICIAL_TOTAL_INV(ARTICULO, FECINI) returning_values (INICIAL_CANT);
  SELECT SUM(MVAR_CANT) FROM MOVIMIENTO_ARTICULO
    WHERE (MVAR_FECHA >= :FECINI) AND (MVAR_FECHA < :FECFIN) AND
          (ARTI_COD = :ARTICULO) AND (MVAR_ENTRADA = 'S') INTO :ENT_CANT;
  if (ENT_CANT IS NULL) then
    ENT_CANT = 0;
  SELECT SUM(MVAR_CANT) FROM MOVIMIENTO_ARTICULO
    WHERE (MVAR_FECHA >= :FECINI) AND (MVAR_FECHA < :FECFIN) AND
          (ARTI_COD = :ARTICULO) AND (MVAR_ENTRADA = 'N') INTO :SAL_CANT;
  if (SAL_CANT IS NULL) then
    SAL_CANT = 0;
  EXECUTE PROCEDURE VALOR_INICIAL_INVENTARIO(ARTICULO, FECINI) returning_values (INICIAL_PESOS);
  SELECT SUM(COST_ENTP), SUM(COST_SALP) FROM COSTOS
    WHERE (COST_FECHA >= :FECINI) AND (COST_FECHA < :FECFIN) AND
          (ARTI_COD = :ARTICULO) INTO :ENT_PESOS, :SAL_PESOS;
  if (ENT_PESOS IS NULL) then
    ENT_PESOS = 0;
  if (SAL_PESOS IS NULL) then
    SAL_PESOS = 0;
  FINAL_CANT = INICIAL_CANT + ENT_CANT - SAL_CANT;
  FINAL_PESOS = INICIAL_PESOS + ENT_PESOS - SAL_PESOS;
  SUSPEND;
 $$IBE$$*/ SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE REP_KARDEX_ARTICULO(
    DETALLE CHAR(1),
    FECINI DATE,
    FECFIN DATE,
    ARTINI VARCHAR(20),
    ARTFIN VARCHAR(20),
    GRPINI VARCHAR(2),
    GRPFIN VARCHAR(2),
    ORDEN CHAR(1),
    BODEGA VARCHAR(2))
RETURNS (
    CODIGO VARCHAR(15),
    NOMBRE VARCHAR(60),
    UNIDAD VARCHAR(8),
    CODGRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    CODSUBG VARCHAR(3),
    NOMSUBG VARCHAR(30),
    CODMARC VARCHAR(3),
    NOMMARC VARCHAR(30),
    CODBOD VARCHAR(2),
    SALDOINI NUMERIC(18,4),
    COSTOINI NUMERIC(18,2),
    ENTRADAS NUMERIC(18,4),
    COSTOENT NUMERIC(18,2),
    SALIDAS NUMERIC(18,4),
    COSTOSAL NUMERIC(18,2),
    SALDOFIN NUMERIC(18,4),
    COSTOFIN NUMERIC(18,2),
    TIPODOC VARCHAR(8),
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    CONCEPTO VARCHAR(60),
    NIT VARCHAR(20),
    CONS INTEGER,
    CANFINAL NUMERIC(18,4),
    COSFINAL NUMERIC(18,2))
AS
DECLARE VARIABLE ENTRADA CHAR(1);
DECLARE VARIABLE CANT NUMERIC(18,4);
DECLARE VARIABLE EXIST NUMERIC(18,4);
DECLARE VARIABLE COSTO NUMERIC(18,2);
DECLARE VARIABLE CODINI VARCHAR(20);
DECLARE VARIABLE CODFIN VARCHAR(20);
DECLARE VARIABLE DESINI VARCHAR(20);
DECLARE VARIABLE DESFIN VARCHAR(20);
declare variable TIPO INTEGER;
declare variable ID INTEGER;
BEGIN /*$$IBE$$ 
if (ORDEN = 'C') then
    BEGIN
    CODINI = ARTINI;
    CODFIN = ARTFIN;
    DESINI = '';
    DESFIN = 'zz';
    END
ELSE
    BEGIN
    DESINI = ARTINI;
    DESFIN = ARTFIN;
    CODINI = '';
    CODFIN = 'zz';
    END
  FOR
    SELECT ARTI_COD, ARTI_DES, ARTI_UNIDAD, A.GRUP_COD, A.SUBG_COD, A.MARC_COD
      FROM ARTICULO A
      WHERE ARTI_COD >= :CODINI AND ARTI_COD <= :CODFIN AND A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :GRPFIN AND ARTI_DES >= :DESINI AND ARTI_DES <= :DESFIN AND A.ESAR_COD <> 'I'
      INTO :CODIGO, :NOMBRE, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
      DO
        BEGIN
        NOMMARC = '';
        NOMSUBG = '';
        SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
        SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
        SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
        if (BODEGA = '') then
            BEGIN
            EXECUTE PROCEDURE SALDO_INICIAL_TOTAL_INV(CODIGO, FECINI) returning_values (:SALDOINI);
            EXECUTE PROCEDURE VALOR_INICIAL_INVENTARIO(CODIGO, FECINI) returning_values (COSTOINI);
            END
        ELSE
            BEGIN
            EXECUTE PROCEDURE SALDO_INICIAL_INVENTARIO(CODIGO, FECINI, :BODEGA) returning_values (SALDOINI);
            EXECUTE PROCEDURE COSTO_PROMEDIO(CODIGO, FECINI) returning_values (COSTOINI);
            COSTOINI = COSTOINI * saldoini;
            END
        if (DETALLE = 'N') then
            BEGIN
             $$IBE$$*/ /* SUME LAS ENTRADAS */ /*$$IBE$$ 
            if (BODEGA = '') then
                SELECT SUM(MVAR_CANT), SUM(MVAR_CANT * MVAR_COSTO) FROM MOVIMIENTO_ARTICULO
                  WHERE (MVAR_FECHA >= :FECINI) AND (MVAR_FECHA <= :FECFIN) AND (MVAR_TIPODOC <> 13) AND
                  (ARTI_COD = :CODIGO) AND (MVAR_ENTRADA = 'S') INTO :ENTRADAS, :COSTOENT;
            ELSE
                SELECT SUM(MVAR_CANT), SUM(MVAR_CANT * MVAR_COSTO) FROM MOVIMIENTO_ARTICULO
                  WHERE (MVAR_FECHA >= :FECINI) AND (MVAR_FECHA <= :FECFIN) AND (MVAR_TIPODOC <> 13) AND
                  (ARTI_COD = :CODIGO) AND (MVAR_ENTRADA = 'S') AND BODE_COD = :BODEGA
                  INTO :ENTRADAS, :COSTOENT;
                
            if (ENTRADAS IS NULL) then
              ENTRADAS = 0;
            if (COSTOENT IS NULL) then
              COSTOENT = 0;
             $$IBE$$*/ /* CALCULE LAS SALIDAS A COSTO PROMEDIO */ /*$$IBE$$ 
            SALIDAS = 0;
            COSTOSAL = 0;
            if (BODEGA = '') then
                FOR SELECT MVAR_CANT, MVAR_FECHA, MVAR_TIPODOC, MVAR_CONS
                    FROM MOVIMIENTO_ARTICULO
                    WHERE (MVAR_FECHA >= :FECINI) AND (MVAR_FECHA <= :FECFIN) AND (MVAR_TIPODOC <> 13) AND
                    (ARTI_COD = :CODIGO) AND (MVAR_ENTRADA = 'N')
                    INTO :CANT, :FECHA, :TIPO, :ID
                    DO
                    BEGIN
                    SELECT COST_SALDOP, COST_SALDOC FROM COSTOS WHERE COST_TIPO = :TIPO AND COST_IDMOV = :ID INTO :COSTO, :EXIST;
                    if (EXIST <> 0) then
                        COSTO = COSTO / EXIST;
                    ELSE
                        COSTO = 0;
                    COSTOSAL = COSTOSAL + (COSTO*CANT);
                    SALIDAS = SALIDAS + CANT;
                    END
            ELSE
                FOR SELECT MVAR_CANT, MVAR_FECHA, MVAR_TIPODOC, MVAR_CONS
                    FROM MOVIMIENTO_ARTICULO
                    WHERE (MVAR_FECHA >= :FECINI) AND (MVAR_FECHA <= :FECFIN) AND (MVAR_TIPODOC <> 13) AND
                    (ARTI_COD = :CODIGO) AND (MVAR_ENTRADA = 'N') AND BODE_COD = :BODEGA
                    INTO :CANT, :FECHA, :TIPO, :ID
                    DO
                    BEGIN
                    SELECT COST_SALDOP, COST_SALDOC FROM COSTOS WHERE COST_TIPO = :TIPO AND COST_IDMOV = :ID INTO :COSTO, :EXIST;
                    if (EXIST <> 0) then
                        COSTO = COSTO / EXIST;
                    ELSE
                        COSTO = 0;
                    COSTOSAL = COSTOSAL + (COSTO*CANT);
                    SALIDAS = SALIDAS + CANT;
                    END
            if (SALIDAS IS NULL) then
              SALIDAS = 0;
            if (COSTOSAL IS NULL) then
              COSTOSAL = 0;
            SALDOFIN = SALDOINI + ENTRADAS - SALIDAS;
            COSTOFIN = COSTOINI + COSTOENT - COSTOSAL;
            if (BODEGA = '') then
                BEGIN
                EXECUTE PROCEDURE SALDO_INICIAL_TOTAL_INV(CODIGO, fecfin+1) returning_values (canfinal);
                EXECUTE PROCEDURE VALOR_INICIAL_INVENTARIO(CODIGO, FECFIN+1) returning_values (cosfinal);
                END
            ELSE
                BEGIN
                EXECUTE PROCEDURE SALDO_INICIAL_INVENTARIO(CODIGO, FECFIN+1, :BODEGA) returning_values (CANFINAL);
                EXECUTE PROCEDURE COSTO_PROMEDIO(CODIGO, FECFIN+1) returning_values (COSFINAL);
                COSFINAL = COSFINAL * CANFINAL;
                END
            SUSPEND;
            END
        ELSE
            BEGIN
            SALDOFIN = SALDOINI;
            COSTOFIN = COSTOINI;
            COSTOENT = 0;
            COSTOSAL = 0;
            FOR SELECT TIDO_NOMCORTO, MVAR_ENTRADA, MVAR_PREF, MVAR_NUMERO, MVAR_CANT, MVAR_COSTO, MVAR_CONC, MVAR_FECHA, M.TERC_NIT, MVAR_CONS, BODE_COD
                FROM MOVIMIENTO_ARTICULO M, TIPO_DOCUMENTO TD
                WHERE TD.TIDO_COD = MVAR_TIPODOC AND (MVAR_FECHA >= :FECINI) AND (MVAR_FECHA <= :FECFIN) AND (MVAR_TIPODOC <> 13) AND (ARTI_COD = :CODIGO)
                ORDER BY MVAR_FECHA, MVAR_CONS
                INTO :TIPODOC, :ENTRADA, :PREFIJO, :NUMERO, :ENTRADAS, :COSTOENT, :CONCEPTO, :FECHA, :NIT, :CONS, :CODBOD
                DO
                    BEGIN
                    if (ENTRADA = 'S') then
                        BEGIN
                        SALIDAS = 0;
                        SALDOFIN = SALDOFIN + ENTRADAS;
                        COSTOFIN = COSTOFIN + (ENTRADAS * COSTOENT);
                        if (SALDOFIN > 0) then
                            COSTOSAL = COSTOFIN / SALDOFIN;
                        end
                    ELSE
                        BEGIN
                        SALIDAS = ENTRADAS;
                        ENTRADAS = 0;
                        if (SALDOFIN > 0) then
                            COSTOENT = COSTOFIN / SALDOFIN;
                        else
                            EXECUTE PROCEDURE COSTO_PROMEDIO(:CODIGO, :FECHA) returning_values (:COSTOENT);
                        SALDOFIN = SALDOFIN - SALIDAS;
                        COSTOFIN = COSTOFIN - (SALIDAS * COSTOENT);
                        if (SALDOFIN > 0) then
                            COSTOSAL = COSTOFIN / SALDOFIN;
                        END
                    SUSPEND;
                    END
            END
        END
 $$IBE$$*/ SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE KARDEX_INVENTARIO_MES(
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    CODIGO VARCHAR(15),
    DESCRIPCION VARCHAR(60),
    INICIAL NUMERIC(18,2),
    ENTRADA NUMERIC(18,2),
    SALIDA NUMERIC(18,2),
    FINAL NUMERIC(18,2))
AS
BEGIN /*$$IBE$$ 
  for select arti_cod, arti_des from articulo where substring(arti_cod from 1 FOR 2) <> '.t' into :CODIGO, :DESCRIPCION
  DO
    BEGIN
    EXECUTE PROCEDURE KARDEX_ARTICULO_MES(CODIGO, FECINI, FECFIN) returning_values (:INICIAL, :ENTRADA, :SALIDA);
    FINAL = INICIAL + ENTRADA - SALIDA;
    SUSPEND;
    END
 $$IBE$$*/ SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE KARDEX_ARTICULO_MES(
    ARTICULO VARCHAR(15),
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    INICIAL NUMERIC(18,2),
    ENTRADA NUMERIC(18,2),
    SALIDA NUMERIC(18,2))
AS
BEGIN
  EXECUTE PROCEDURE VALOR_INICIAL_INVENTARIO(ARTICULO, FECINI) returning_values (INICIAL);
  SELECT SUM(COST_ENTP) FROM COSTOS
    WHERE (COST_FECHA >= :FECINI) AND (COST_FECHA < :FECFIN) AND
          (ARTI_COD = :ARTICULO) INTO :ENTRADA;
  if (ENTRADA IS NULL) then
    ENTRADA = 0;
  SELECT SUM(COST_SALP) FROM COSTOS
    WHERE (COST_FECHA >= :FECINI) AND (COST_FECHA < :FECFIN) AND
          (ARTI_COD = :ARTICULO) INTO :SALIDA;
  if (SALIDA IS NULL) then
    SALIDA = 0;
  SUSPEND;
END

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE KARDEX_DESDE_HASTA(
    ARTICULO VARCHAR(15),
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    INICIAL_CANT NUMERIC(18,4),
    INICIAL_PESOS NUMERIC(18,2),
    ENT_CANT NUMERIC(18,4),
    ENT_PESOS NUMERIC(18,2),
    SAL_CANT NUMERIC(18,4),
    SAL_PESOS NUMERIC(18,2),
    FINAL_CANT NUMERIC(18,4),
    FINAL_PESOS NUMERIC(18,2))
AS
BEGIN
  EXECUTE PROCEDURE SALDO_INICIAL_TOTAL_INV(ARTICULO, FECINI) returning_values (INICIAL_CANT);
  SELECT SUM(MVAR_CANT) FROM MOVIMIENTO_ARTICULO
    WHERE (MVAR_FECHA >= :FECINI) AND (MVAR_FECHA < :FECFIN) AND
          (ARTI_COD = :ARTICULO) AND (MVAR_ENTRADA = 'S') INTO :ENT_CANT;
  if (ENT_CANT IS NULL) then
    ENT_CANT = 0;
  SELECT SUM(MVAR_CANT) FROM MOVIMIENTO_ARTICULO
    WHERE (MVAR_FECHA >= :FECINI) AND (MVAR_FECHA < :FECFIN) AND
          (ARTI_COD = :ARTICULO) AND (MVAR_ENTRADA = 'N') INTO :SAL_CANT;
  if (SAL_CANT IS NULL) then
    SAL_CANT = 0;
  EXECUTE PROCEDURE VALOR_INICIAL_INVENTARIO(ARTICULO, FECINI) returning_values (INICIAL_PESOS);
  SELECT SUM(COST_ENTP), SUM(COST_SALP) FROM COSTOS
    WHERE (COST_FECHA >= :FECINI) AND (COST_FECHA < :FECFIN) AND
          (ARTI_COD = :ARTICULO) INTO :ENT_PESOS, :SAL_PESOS;
  if (ENT_PESOS IS NULL) then
    ENT_PESOS = 0;
  if (SAL_PESOS IS NULL) then
    SAL_PESOS = 0;
  FINAL_CANT = INICIAL_CANT + ENT_CANT - SAL_CANT;
  FINAL_PESOS = INICIAL_PESOS + ENT_PESOS - SAL_PESOS;
  SUSPEND;
END

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE REP_KARDEX_ARTICULO(
    DETALLE CHAR(1),
    FECINI DATE,
    FECFIN DATE,
    ARTINI VARCHAR(20),
    ARTFIN VARCHAR(20),
    GRPINI VARCHAR(2),
    GRPFIN VARCHAR(2),
    ORDEN CHAR(1),
    BODEGA VARCHAR(2))
RETURNS (
    CODIGO VARCHAR(15),
    NOMBRE VARCHAR(60),
    UNIDAD VARCHAR(8),
    CODGRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    CODSUBG VARCHAR(3),
    NOMSUBG VARCHAR(30),
    CODMARC VARCHAR(3),
    NOMMARC VARCHAR(30),
    CODBOD VARCHAR(2),
    SALDOINI NUMERIC(18,4),
    COSTOINI NUMERIC(18,2),
    ENTRADAS NUMERIC(18,4),
    COSTOENT NUMERIC(18,2),
    SALIDAS NUMERIC(18,4),
    COSTOSAL NUMERIC(18,2),
    SALDOFIN NUMERIC(18,4),
    COSTOFIN NUMERIC(18,2),
    TIPODOC VARCHAR(8),
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    CONCEPTO VARCHAR(60),
    NIT VARCHAR(20),
    CONS INTEGER,
    CANFINAL NUMERIC(18,4),
    COSFINAL NUMERIC(18,2))
AS
DECLARE VARIABLE ENTRADA CHAR(1);
DECLARE VARIABLE CANT NUMERIC(18,4);
DECLARE VARIABLE EXIST NUMERIC(18,4);
DECLARE VARIABLE COSTO NUMERIC(18,2);
DECLARE VARIABLE CODINI VARCHAR(20);
DECLARE VARIABLE CODFIN VARCHAR(20);
DECLARE VARIABLE DESINI VARCHAR(20);
DECLARE VARIABLE DESFIN VARCHAR(20);
declare variable TIPO INTEGER;
declare variable ID INTEGER;
BEGIN
if (ORDEN = 'C') then
    BEGIN
    CODINI = ARTINI;
    CODFIN = ARTFIN;
    DESINI = '';
    DESFIN = 'zz';
    END
ELSE
    BEGIN
    DESINI = ARTINI;
    DESFIN = ARTFIN;
    CODINI = '';
    CODFIN = 'zz';
    END
  FOR
    SELECT ARTI_COD, ARTI_DES, ARTI_UNIDAD, A.GRUP_COD, A.SUBG_COD, A.MARC_COD
      FROM ARTICULO A
      WHERE ARTI_COD >= :CODINI AND ARTI_COD <= :CODFIN AND A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :GRPFIN AND ARTI_DES >= :DESINI AND ARTI_DES <= :DESFIN AND A.ESAR_COD <> 'I'
      INTO :CODIGO, :NOMBRE, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
      DO
        BEGIN
        NOMMARC = '';
        NOMSUBG = '';
        SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
        SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
        SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
        if (BODEGA = '') then
            BEGIN
            EXECUTE PROCEDURE SALDO_INICIAL_TOTAL_INV(CODIGO, FECINI) returning_values (:SALDOINI);
            EXECUTE PROCEDURE VALOR_INICIAL_INVENTARIO(CODIGO, FECINI) returning_values (COSTOINI);
            END
        ELSE
            BEGIN
            EXECUTE PROCEDURE SALDO_INICIAL_INVENTARIO(CODIGO, FECINI, :BODEGA) returning_values (SALDOINI);
            EXECUTE PROCEDURE COSTO_PROMEDIO(CODIGO, FECINI) returning_values (COSTOINI);
            COSTOINI = COSTOINI * saldoini;
            END
        if (DETALLE = 'N') then
            BEGIN
            /* SUME LAS ENTRADAS */
            if (BODEGA = '') then
                SELECT SUM(MVAR_CANT), SUM(MVAR_CANT * MVAR_COSTO) FROM MOVIMIENTO_ARTICULO
                  WHERE (MVAR_FECHA >= :FECINI) AND (MVAR_FECHA <= :FECFIN) AND (MVAR_TIPODOC <> 13) AND
                  (ARTI_COD = :CODIGO) AND (MVAR_ENTRADA = 'S') INTO :ENTRADAS, :COSTOENT;
            ELSE
                SELECT SUM(MVAR_CANT), SUM(MVAR_CANT * MVAR_COSTO) FROM MOVIMIENTO_ARTICULO
                  WHERE (MVAR_FECHA >= :FECINI) AND (MVAR_FECHA <= :FECFIN) AND (MVAR_TIPODOC <> 13) AND
                  (ARTI_COD = :CODIGO) AND (MVAR_ENTRADA = 'S') AND BODE_COD = :BODEGA
                  INTO :ENTRADAS, :COSTOENT;
                
            if (ENTRADAS IS NULL) then
              ENTRADAS = 0;
            if (COSTOENT IS NULL) then
              COSTOENT = 0;
            /* CALCULE LAS SALIDAS A COSTO PROMEDIO */
            SALIDAS = 0;
            COSTOSAL = 0;
            if (BODEGA = '') then
                FOR SELECT MVAR_CANT, MVAR_FECHA, MVAR_TIPODOC, MVAR_CONS
                    FROM MOVIMIENTO_ARTICULO
                    WHERE (MVAR_FECHA >= :FECINI) AND (MVAR_FECHA <= :FECFIN) AND (MVAR_TIPODOC <> 13) AND
                    (ARTI_COD = :CODIGO) AND (MVAR_ENTRADA = 'N')
                    INTO :CANT, :FECHA, :TIPO, :ID
                    DO
                    BEGIN
                    SELECT COST_SALDOP, COST_SALDOC FROM COSTOS WHERE COST_TIPO = :TIPO AND COST_IDMOV = :ID INTO :COSTO, :EXIST;
                    if (EXIST <> 0) then
                        COSTO = COSTO / EXIST;
                    ELSE
                        COSTO = 0;
                    COSTOSAL = COSTOSAL + (COSTO*CANT);
                    SALIDAS = SALIDAS + CANT;
                    END
            ELSE
                FOR SELECT MVAR_CANT, MVAR_FECHA, MVAR_TIPODOC, MVAR_CONS
                    FROM MOVIMIENTO_ARTICULO
                    WHERE (MVAR_FECHA >= :FECINI) AND (MVAR_FECHA <= :FECFIN) AND (MVAR_TIPODOC <> 13) AND
                    (ARTI_COD = :CODIGO) AND (MVAR_ENTRADA = 'N') AND BODE_COD = :BODEGA
                    INTO :CANT, :FECHA, :TIPO, :ID
                    DO
                    BEGIN
                    SELECT COST_SALDOP, COST_SALDOC FROM COSTOS WHERE COST_TIPO = :TIPO AND COST_IDMOV = :ID INTO :COSTO, :EXIST;
                    if (EXIST <> 0) then
                        COSTO = COSTO / EXIST;
                    ELSE
                        COSTO = 0;
                    COSTOSAL = COSTOSAL + (COSTO*CANT);
                    SALIDAS = SALIDAS + CANT;
                    END
            if (SALIDAS IS NULL) then
              SALIDAS = 0;
            if (COSTOSAL IS NULL) then
              COSTOSAL = 0;
            SALDOFIN = SALDOINI + ENTRADAS - SALIDAS;
            COSTOFIN = COSTOINI + COSTOENT - COSTOSAL;
            if (BODEGA = '') then
                BEGIN
                EXECUTE PROCEDURE SALDO_INICIAL_TOTAL_INV(CODIGO, fecfin+1) returning_values (canfinal);
                EXECUTE PROCEDURE VALOR_INICIAL_INVENTARIO(CODIGO, FECFIN+1) returning_values (cosfinal);
                END
            ELSE
                BEGIN
                EXECUTE PROCEDURE SALDO_INICIAL_INVENTARIO(CODIGO, FECFIN+1, :BODEGA) returning_values (CANFINAL);
                EXECUTE PROCEDURE COSTO_PROMEDIO(CODIGO, FECFIN+1) returning_values (COSFINAL);
                COSFINAL = COSFINAL * CANFINAL;
                END
            SUSPEND;
            END
        ELSE
            BEGIN
            SALDOFIN = SALDOINI;
            COSTOFIN = COSTOINI;
            COSTOENT = 0;
            COSTOSAL = 0;
            FOR SELECT TIDO_NOMCORTO, MVAR_ENTRADA, MVAR_PREF, MVAR_NUMERO, MVAR_CANT, MVAR_COSTO, MVAR_CONC, MVAR_FECHA, M.TERC_NIT, MVAR_CONS, BODE_COD
                FROM MOVIMIENTO_ARTICULO M, TIPO_DOCUMENTO TD
                WHERE TD.TIDO_COD = MVAR_TIPODOC AND (MVAR_FECHA >= :FECINI) AND (MVAR_FECHA <= :FECFIN) AND (MVAR_TIPODOC <> 13) AND (ARTI_COD = :CODIGO)
                ORDER BY MVAR_FECHA, MVAR_CONS
                INTO :TIPODOC, :ENTRADA, :PREFIJO, :NUMERO, :ENTRADAS, :COSTOENT, :CONCEPTO, :FECHA, :NIT, :CONS, :CODBOD
                DO
                    BEGIN
                    if (ENTRADA = 'S') then
                        BEGIN
                        SALIDAS = 0;
                        SALDOFIN = SALDOFIN + ENTRADAS;
                        COSTOFIN = COSTOFIN + (ENTRADAS * COSTOENT);
                        if (SALDOFIN > 0) then
                            COSTOSAL = COSTOFIN / SALDOFIN;
                        end
                    ELSE
                        BEGIN
                        SALIDAS = ENTRADAS;
                        ENTRADAS = 0;
                        if (SALDOFIN > 0) then
                            COSTOENT = COSTOFIN / SALDOFIN;
                        else
                            EXECUTE PROCEDURE COSTO_PROMEDIO(:CODIGO, :FECHA) returning_values (:COSTOENT);
                        SALDOFIN = SALDOFIN - SALIDAS;
                        COSTOFIN = COSTOFIN - (SALIDAS * COSTOENT);
                        if (SALDOFIN > 0) then
                            COSTOSAL = COSTOFIN / SALDOFIN;
                        END
                    SUSPEND;
                    END
            END
        END
END

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE KARDEX_INVENTARIO_MES(
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    CODIGO VARCHAR(15),
    DESCRIPCION VARCHAR(60),
    INICIAL NUMERIC(18,2),
    ENTRADA NUMERIC(18,2),
    SALIDA NUMERIC(18,2),
    FINAL NUMERIC(18,2))
AS
BEGIN
  for select arti_cod, arti_des from articulo where substring(arti_cod from 1 FOR 2) <> '.t' into :CODIGO, :DESCRIPCION
  DO
    BEGIN
    EXECUTE PROCEDURE KARDEX_ARTICULO_MES(CODIGO, FECINI, FECFIN) returning_values (:INICIAL, :ENTRADA, :SALIDA);
    FINAL = INICIAL + ENTRADA - SALIDA;
    SUSPEND;
    END
END

^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER PROCEDURE KARDEX_DESDE_HASTA(
    ARTICULO VARCHAR(15),
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    INICIAL_CANT NUMERIC(18,4),
    INICIAL_PESOS NUMERIC(18,2),
    ENT_CANT NUMERIC(18,4),
    ENT_PESOS NUMERIC(18,2),
    SAL_CANT NUMERIC(18,4),
    SAL_PESOS NUMERIC(18,2),
    FINAL_CANT NUMERIC(18,4),
    FINAL_PESOS NUMERIC(18,2))
AS
BEGIN
  EXECUTE PROCEDURE SALDO_INICIAL_TOTAL_INV(ARTICULO, FECINI) returning_values (INICIAL_CANT);
  EXECUTE PROCEDURE VALOR_INICIAL_INVENTARIO(ARTICULO, FECINI) returning_values (INICIAL_PESOS);
  SELECT SUM(COST_ENTC), SUM(COST_ENTP), SUM(COST_SALC), SUM(COST_SALP) FROM COSTOS
    WHERE (COST_FECHA >= :FECINI) AND (COST_FECHA <= :FECFIN) AND
          (ARTI_COD = :ARTICULO)
    INTO :ENT_CANT, :ENT_PESOS, :SAL_CANT, :SAL_PESOS;
  if (ENT_CANT IS NULL) then
    ENT_CANT = 0;
  if (ENT_PESOS IS NULL) then
    ENT_PESOS = 0;
  if (SAL_CANT IS NULL) then
    SAL_CANT = 0;
  if (SAL_PESOS IS NULL) then
    SAL_PESOS = 0;
  FINAL_CANT = INICIAL_CANT + ENT_CANT - SAL_CANT;
  FINAL_PESOS = INICIAL_PESOS + ENT_PESOS - SAL_PESOS;
  SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER PROCEDURE REP_KARDEX_ARTICULO(
    DETALLE CHAR(1),
    FECINI DATE,
    FECFIN DATE,
    ARTINI VARCHAR(20),
    ARTFIN VARCHAR(20),
    GRPINI VARCHAR(2),
    GRPFIN VARCHAR(2),
    ORDEN CHAR(1),
    BODEGA VARCHAR(2))
RETURNS (
    CODIGO VARCHAR(15),
    NOMBRE VARCHAR(60),
    UNIDAD VARCHAR(8),
    CODGRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    CODSUBG VARCHAR(3),
    NOMSUBG VARCHAR(30),
    CODMARC VARCHAR(3),
    NOMMARC VARCHAR(30),
    CODBOD VARCHAR(2),
    SALDOINI NUMERIC(18,4),
    COSTOINI NUMERIC(18,2),
    ENTRADAS NUMERIC(18,4),
    COSTOENT NUMERIC(18,2),
    SALIDAS NUMERIC(18,4),
    COSTOSAL NUMERIC(18,2),
    SALDOFIN NUMERIC(18,4),
    COSTOFIN NUMERIC(18,2),
    TIPODOC VARCHAR(8),
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    CONCEPTO VARCHAR(60),
    NIT VARCHAR(20),
    CONS INTEGER,
    CANFINAL NUMERIC(18,4),
    COSFINAL NUMERIC(18,2))
AS
DECLARE VARIABLE ENTRADA CHAR(1);
DECLARE VARIABLE CANT NUMERIC(18,4);
DECLARE VARIABLE COSTO NUMERIC(18,2);
DECLARE VARIABLE CODINI VARCHAR(20);
DECLARE VARIABLE CODFIN VARCHAR(20);
DECLARE VARIABLE DESINI VARCHAR(20);
DECLARE VARIABLE DESFIN VARCHAR(20);
BEGIN
if (ORDEN = 'C') then
    BEGIN
    CODINI = ARTINI;
    CODFIN = ARTFIN;
    DESINI = '';
    DESFIN = 'zz';
    END
ELSE
    BEGIN
    DESINI = ARTINI;
    DESFIN = ARTFIN;
    CODINI = '';
    CODFIN = 'zz';
    END
  FOR
    SELECT ARTI_COD, ARTI_DES, ARTI_UNIDAD, A.GRUP_COD, A.SUBG_COD, A.MARC_COD
      FROM ARTICULO A
      WHERE ARTI_COD >= :CODINI AND ARTI_COD <= :CODFIN AND A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :GRPFIN AND ARTI_DES >= :DESINI AND ARTI_DES <= :DESFIN AND A.ESAR_COD <> 'I'
      INTO :CODIGO, :NOMBRE, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
      DO
        BEGIN
        NOMMARC = '';
        NOMSUBG = '';
        SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
        SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
        SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
        if (BODEGA = '') then
            BEGIN
            EXECUTE PROCEDURE SALDO_INICIAL_TOTAL_INV(CODIGO, FECINI) returning_values (:SALDOINI);
            EXECUTE PROCEDURE VALOR_INICIAL_INVENTARIO(CODIGO, FECINI) returning_values (COSTOINI);
            END
        ELSE
            BEGIN
            EXECUTE PROCEDURE SALDO_INICIAL_INVENTARIO(CODIGO, FECINI, :BODEGA) returning_values (SALDOINI);
            EXECUTE PROCEDURE COSTO_PROMEDIO(CODIGO, FECINI-1) returning_values (COSTOINI);
            COSTOINI = COSTOINI * saldoini;
            END
        if (DETALLE = 'N') then
            BEGIN
            /* SUME LAS ENTRADAS */
            if (BODEGA = '') then
              SELECT SUM(COST_ENTC), SUM(COST_ENTP), SUM(COST_SALC), SUM(COST_SALP) FROM COSTOS
                WHERE (COST_FECHA >= :FECINI) AND (COST_FECHA <= :FECFIN) AND (ARTI_COD = :codigo)
                INTO :ENTRADAS, :COSTOENT, :SALIDAS, :COSTOSAL;
            ELSE
              SELECT SUM(COST_ENTC), SUM(COST_ENTP), SUM(COST_SALC), SUM(COST_SALP)
                FROM COSTOS C, MOVIMIENTO_ARTICULO M
                WHERE (COST_FECHA >= :FECINI) AND (COST_FECHA <= :FECFIN) AND (C.ARTI_COD = :codigo) AND C.cost_idmov = M.mvar_cons AND BODE_COD = :BODEGA
                INTO :ENTRADAS, :COSTOENT, :SALIDAS, :COSTOSAL;

            if (ENTRADAS IS NULL) then
              ENTRADAS = 0;
            if (COSTOENT IS NULL) then
              COSTOENT = 0;
            if (SALIDAS IS NULL) then
              SALIDAS = 0;
            if (COSTOSAL IS NULL) then
              COSTOSAL = 0;
            SALDOFIN = SALDOINI + ENTRADAS - SALIDAS;
            COSTOFIN = COSTOINI + COSTOENT - COSTOSAL;
            if (BODEGA = '') then
                BEGIN
                EXECUTE PROCEDURE SALDO_INICIAL_TOTAL_INV(CODIGO, fecfin+1) returning_values (canfinal);
                EXECUTE PROCEDURE VALOR_INICIAL_INVENTARIO(CODIGO, FECFIN+1) returning_values (cosfinal);
                END
            ELSE
                BEGIN
                EXECUTE PROCEDURE SALDO_INICIAL_INVENTARIO(CODIGO, FECFIN+1, :BODEGA) returning_values (CANFINAL);
                EXECUTE PROCEDURE COSTO_PROMEDIO(CODIGO, FECFIN+1) returning_values (COSFINAL);
                COSFINAL = COSFINAL * CANFINAL;
                END
            SUSPEND;
            END
        ELSE
            BEGIN
            SALDOFIN = SALDOINI;
            COSTOFIN = COSTOINI;
            COSTOENT = 0;
            COSTOSAL = 0;
            FOR SELECT TIDO_NOMCORTO, MVAR_ENTRADA, MVAR_PREF, MVAR_NUMERO, MVAR_CANT, MVAR_COSTO, MVAR_CONC, MVAR_FECHA, M.TERC_NIT, MVAR_CONS, BODE_COD, COST_SALDOP, COST_SALDOC
                FROM MOVIMIENTO_ARTICULO M, TIPO_DOCUMENTO TD, COSTOS C
                WHERE TD.TIDO_COD = MVAR_TIPODOC AND (MVAR_FECHA >= :FECINI) AND (MVAR_FECHA <= :FECFIN) AND (MVAR_TIPODOC <> 13) AND (m.ARTI_COD = :CODIGO) AND M.mvar_cons = C.cost_idmov
                ORDER BY MVAR_FECHA, MVAR_CONS
                INTO :TIPODOC, :ENTRADA, :PREFIJO, :NUMERO, :ENTRADAS, :COSTOENT, :CONCEPTO, :FECHA, :NIT, :CONS, :CODBOD, :costo, :cant
                DO
                    BEGIN
                    if (ENTRADA = 'S') then
                        BEGIN
                        SALIDAS = 0;
                        SALDOFIN = SALDOFIN + ENTRADAS;
                        COSTOFIN = COSTOFIN + (ENTRADAS * COSTOENT);
                        if (CANT > 0) then
                            COSTOSAL = COSTO / CANT;
                        else
                            COSTOSAL = 0;
                        end
                    ELSE
                        BEGIN
                        SALIDAS = ENTRADAS;
                        ENTRADAS = 0;
                        if (CANT > 0) then
                            COSTOSAL = COSTO / CANT;
                        else
                            COSTOSAL = 0;
                        SALDOFIN = SALDOFIN - SALIDAS;
                        COSTOFIN = COSTOFIN - (SALIDAS * costosal);
                        END
                    SUSPEND;
                    END
            END
        END
END
^

SET TERM ; ^


SET TERM ^ ;

CREATE OR ALTER PROCEDURE COSTO_PROMEDIO(
    ARTICULO VARCHAR(15),
    FECHA DATE)
RETURNS (
    COSTOP NUMERIC(18,2))
AS
declare variable saldop numeric(18,2);
declare variable saldoc numeric(15,4);
declare variable entp numeric(18,2);
declare variable entc numeric(15,4);
DECLARE VARIABLE FEC DATE;
BEGIN
  /* Busca la fecha del £ltimo movimiento del art¡culo antes de la fecha */
  SELECT  MAX(COST_FECHA) FROM COSTOS
  WHERE (ARTI_COD = :ARTICULO) AND (COST_FECHA <= :FECHA) INTO :FEC;
  IF (FEC IS NULL) THEN
    COSTOP = 0;
  ELSE
    begin
    /* Con la fecha m xima calcule el costo promedio */
    SELECT first 1 COST_SALDOP, COST_ENTP,COST_SALDOC, COST_ENTC, COST_ULTIMO FROM COSTOS
        WHERE (ARTI_COD = :ARTICULO) AND (COST_FECHA = :FEC)
        order by cost_item desc
        INTO :SALDOP, ENTP, :SALDOC, ENTC, :COSTOP;
    if ((SALDOC < 0) AND (SALDOC+ENTC > 0)) then
        COSTOP = ENTP/ENTC;
    else
        /* Cuando hay existencia calcule el promedio, de otra manera retorne el ultimo */
        if (SALDOC+ENTC > 0) then
            COSTOP = (SALDOP+ENTP) / (SALDOC+ENTC);
    end
  SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE ACTUALICE_COSTO(
    ARTICULO VARCHAR(15),
    FECHA DATE,
    COSTO NUMERIC(18,2),
    CANTIDAD NUMERIC(18,2),
    ENTRADA CHAR(1),
    ANULAR CHAR(1),
    IDMOV INTEGER,
    TIPO INTEGER)
AS
DECLARE VARIABLE saldo NUMERIC(18,2);
DECLARE VARIABLE COSTOP NUMERIC(18,2);
DECLARE VARIABLE exart CHAR(1);
DECLARE VARIABLE UCOSTO NUMERIC(18,2);
declare variable FECAUX DATE;
declare variable SALDOC NUMERIC(15,4);
declare variable ITEM INTEGER;
declare variable UNIDAD VARCHAR(8);
BEGIN
/* Verfique si el artículo tiene control de existencias */ /*$$IBE$$ 
SELECT arti_exist, ARTI_UNIDAD FROM articulo WHERE arti_COD = :articulo
    INTO :exart, :UNIDAD;
IF (exart <> 'N') THEN
    BEGIN
    if (ANULAR = 'S') then
        BEGIN
        select cost_saldoc, cost_saldop from costos
            WHERE (arti_cod = :articulo) AND (cost_fecha = :fecha) AND (cost_idmov = :IDMOV) AND (COST_TIPO = :TIPO)
            into :SALDOC, :SALDO;  $$IBE$$*/ /* para dejar inicializadas las 2 variables */ /*$$IBE$$ 
        DELETE FROM COSTOS WHERE (arti_cod = :articulo) AND (cost_fecha = :fecha) AND (cost_idmov = :IDMOV) AND (COST_TIPO = :TIPO);
         $$IBE$$*/ /* para inicializar el ultimo costo */ /*$$IBE$$ 
        SELECT MAX(COST_FECHA) FROM costos
            WHERE (arti_cod = :articulo) AND (cost_fecha <= :fecha) INTO :FECAUX;
        if (FECAUX IS NULL) then
            UCOSTO = 0;
        ELSE
            BEGIN
            SELECT MAX(COST_ITEM) FROM costos
                WHERE (arti_cod = :articulo) AND (cost_fecha = :fecaux) INTO :ITEM;
            SELECT COST_ULTIMO FROM costos
                WHERE (arti_cod = :articulo) AND (cost_fecha = :fecaux) AND (cost_item = :ITEM) INTO :UCOSTO;
            END
        END
    ELSE
        BEGIN
        select max(cost_fecha) from costos WHERE (arti_cod = :articulo) AND (cost_fecha <= :fecha) into :fecaux;
        select max(cost_item) from costos WHERE (arti_cod = :articulo) AND (cost_fecha = :fecaux) into :item;
        select (cost_saldoc + cost_entc - cost_salc) from costos WHERE (arti_cod = :articulo) AND (cost_fecha = :fecaux) AND (cost_item = :item) into :saldoc;
        if (saldoc is null) THEN
            SALDOC = 0;
        EXECUTE PROCEDURE costo_promedio(:articulo, :fecha) RETURNING_VALUES :costop;
        if (ENTRADA = 'S') then
            if (TIPO = 33) then
                BEGIN
                EXECUTE PROCEDURE ULTIMO_COSTO(ARTICULO, FECHA, UNIDAD) returning_values (UCOSTO);
                INSERT INTO COSTOS (arti_cod, cost_fecha,
                    cost_entc, cost_entp, cost_salc, cost_salp,
                    cost_saldoc, cost_saldop, cost_ultimo, cost_idmov, cost_tipo)
                    VALUES (:articulo, :fecha, :cantidad, :cantidad*:costop, 0, 0, :saldoc, :saldoc*:costop, :ucosto, :IDMOV, :TIPO);
                SALDO = (SALDOC * COSTOP) + (CANTIDAD * COSTOP);
                SALDOC = SALDOC + CANTIDAD;
                END
            ELSE
                BEGIN
                UCOSTO = :COSTO;
                INSERT INTO COSTOS (arti_cod, cost_fecha,
                    cost_entc, cost_entp, cost_salc, cost_salp,
                    cost_saldoc, cost_saldop, cost_ultimo, cost_idmov, cost_tipo)
                    VALUES (:articulo, :fecha, :cantidad, :cantidad*:costo, 0, 0, :saldoc, :saldoc*:costop, :costo, :IDMOV, :TIPO);
                SALDO = (SALDOC * COSTOP) + (CANTIDAD * COSTO);
                SALDOC = SALDOC + CANTIDAD;
                END
        ELSE
            BEGIN
            EXECUTE PROCEDURE ULTIMO_COSTO(ARTICULO, FECHA, UNIDAD) returning_values (UCOSTO);
            INSERT INTO COSTOS (arti_cod, cost_fecha,
                cost_entc, cost_entp, cost_salc, cost_salp,
                cost_saldoc, cost_saldop, cost_ultimo, cost_idmov, cost_tipo)
                VALUES (:articulo, :fecha, 0, 0, :cantidad, :cantidad*:costop, :saldoc, :saldoc*:costop, :UCOSTO, :IDMOV, :TIPO);
            SALDOC = SALDOC - CANTIDAD;
            SALDO = SALDOC * COSTOP;  $$IBE$$*/ /* YA ESTA RESTADA LA CANTIDAD */ /*$$IBE$$ 
            END
        END
    END
 $$IBE$$*/ EXIT;
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE CALCULA_PRECIOS(
    ARTICULO VARCHAR(20),
    FECHA DATE)
AS
declare variable LISTA INTEGER;
declare variable MARGEN NUMERIC(9, 4);
declare variable UTIL NUMERIC(9, 4);
declare variable UNIDAD VARCHAR(8);
declare variable UOR VARCHAR(20);
declare variable COSTOP NUMERIC(18, 2);
declare variable COSTOU NUMERIC(18, 2);
declare variable COSTO NUMERIC(18, 2);
declare variable DIG INTEGER;
declare variable IVAINC CHAR(1);
declare variable TARIVA NUMERIC(9,2);
declare variable AUTOM CHAR(1);
declare variable BASE varchar(10);
declare variable CAMBIO CHAR(7);
BEGIN /*$$IBE$$ 
EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION','ARTICULOS','CAMBIO DE PRECIOS AUTOMATICO AL CAMBIAR COSTO O PRECIO') returning_values (CAMBIO);
if (CAMBIO = 'COSTO') then
  BEGIN
  FOR SELECT P.LIPR_COD, PRAR_MARGEN, PRAR_UTIL, LIPR_MODIF, PRAR_AUTO
    FROM PRECIOS_ARTICULO P, LISTA_PRECIOS L
    WHERE P.LIPR_COD = L.LIPR_COD AND ARTI_COD = :articulo
    INTO :LISTA, :MARGEN, :UTIL, :IVAINC, :AUTOM
    DO
      if (AUTOM = 'S') then
        BEGIN
        if (UTIL IS NULL) then
            UTIL = 0;
        if (MARGEN IS NULL) then
            MARGEN = 0;
        SELECT ARTI_UNIDAD, TAIV_PORC FROM ARTICULO A, TARIFA_IVA T WHERE A.TAIV_COD = T.TAIV_COD AND ARTI_COD = :ARTICULO INTO :UNIDAD, :TARIVA;
        EXECUTE PROCEDURE lee_configuracion('FACTURACION','ARTICULOS','COSTO BASE PARA CALCULO DE PRECIOS DE VENTA AUTOMATICOS') returning_values (:BASE);
            EXECUTE PROCEDURE COSTO_PROMEDIO (:ARTICULO, :FECHA) RETURNING_VALUES(:COSTOP);
            EXECUTE PROCEDURE ULTIMO_COSTO (:ARTICULO, :FECHA, :UNIDAD) RETURNING_VALUES(:COSTOU);
        if (base = 'ULTIMO') then
            COSTO = COSTOU;
        ELSE
            BEGIN
            COSTO = COSTOP;
            if (base = 'MAYOR') then
                if (COSTOP < COSTOU) then
                    COSTO = COSTOU;
            END
        if (IVAINC = 'S') then
            COSTO = COSTO * (1 + TARIVA/100);
        EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION', 'ARTICULOS', 'SUGERIR PRECIOS CON PORCENTAJE DE MARGEN O UTILIDAD') RETURNING_VALUES (:UOR);
        EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION', 'ARTICULOS', 'REDONDEO AL MULTIPLO DE DIEZ EN PRECIOS') RETURNING_VALUES (:DIG);
        if (UOR = 'UTILIDAD') then
            BEGIN
            COSTO = COSTO * (1 + :UTIL/100);
            EXECUTE PROCEDURE REDONDEE (COSTO, DIG) returning_values (COSTO);
            UPDATE PRECIOS_ARTICULO
                SET PRAR_FIJO = :COSTO
                WHERE ARTI_COD = :ARTICULO AND LIPR_COD = :LISTA;
            END
        ELSE
            BEGIN
            COSTO = COSTO / (1 - :MARGEN/100);
            EXECUTE PROCEDURE REDONDEE (COSTO, DIG) returning_values (COSTO);
            UPDATE PRECIOS_ARTICULO
                SET PRAR_FIJO = :COSTO
                WHERE ARTI_COD = :ARTICULO AND LIPR_COD = :LISTA;
            END
        END
  END
 $$IBE$$*/ EXIT;
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE COSTO_EN_VENTAS(
    TIPO INTEGER,
    ID INTEGER)
AS
declare variable FECHA DATE;
declare variable ARTICULO VARCHAR(20);
declare variable CANTIDAD NUMERIC(18,4);
declare variable COSTO NUMERIC(18,2);
declare variable CTACOSTO VARCHAR(20);
declare variable CTAINVEN VARCHAR(20);
BEGIN /*$$IBE$$ 
DELETE FROM COSTO_VENTAS;
if (TIPO = 31) then
    BEGIN
     $$IBE$$*/ /* FACTURA DE VENTA */ /*$$IBE$$ 
    FOR SELECT D.ARTI_COD, FADE_CANT * FADE_FACTOR, COAR_CTACOS, COAR_CTAINV, FACT_FECHA
        FROM ARTICULO A, FACTURAS F, FACTURAS_DETALLE D, CONTABIL_ARTICULO C
        WHERE F.FACT_ID = D.FACT_ID AND A.ARTI_COD = D.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND F.FACT_ID = :ID AND FACT_ANULADO = 'N' and substring(a.arti_cod from 1 FOR 2) <> '.t'
        INTO :ARTICULO, :CANTIDAD, :CTACOSTO, :CTAINVEN, :FECHA
        DO
        BEGIN
        EXECUTE PROCEDURE COSTO_PROMEDIO(:ARTICULO, :FECHA) returning_values (:COSTO);
        INSERT INTO COSTO_VENTAS VALUES (:ARTICULO, :CANTIDAD, :COSTO, :CTACOSTO, :CTAINVEN);
        END
    END
if (TIPO = 32) then
    BEGIN
     $$IBE$$*/ /* REMISION */ /*$$IBE$$ 
    FOR SELECT D.ARTI_COD, RVDE_CANT * RVDE_FACTOR, COAR_CTACOS, COAR_CTAINV, REVT_FECHA
        FROM ARTICULO A, REMISIONES_VENTA R, REMISIONES_VENTA_DETALLE D, CONTABIL_ARTICULO C
        WHERE R.REVT_ID = D.REVT_ID AND A.ARTI_COD = D.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND R.REVT_ID = :ID AND REVT_ANULADO = 'N'
        INTO :ARTICULO, :CANTIDAD, :CTACOSTO, :CTAINVEN, :FECHA
        DO
        BEGIN
        EXECUTE PROCEDURE COSTO_PROMEDIO(:ARTICULO, :FECHA) returning_values (:COSTO);
        INSERT INTO COSTO_VENTAS VALUES (:ARTICULO, :CANTIDAD, :COSTO, :CTACOSTO, :CTAINVEN);
        END
    END
if (TIPO = 33) then
    BEGIN
     $$IBE$$*/ /* DEVOLUCION */ /*$$IBE$$ 
    FOR SELECT D.ARTI_COD, DVDE_CANT * DVDE_FACTOR, COAR_CTACOS, COAR_CTAINV, DEVT_FECHA
        FROM ARTICULO A, DEVOLUCIONES_VENTAS DV, DEVOLUCIONES_VENTAS_DETALLE D, CONTABIL_ARTICULO C
        WHERE DV.DEVT_ID = D.DEVT_ID AND A.ARTI_COD = D.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND DV.DEVT_ID = :ID AND DEVT_ANULADO = 'N' and substring(a.arti_cod from 1 FOR 2) <> '.t'
        INTO :ARTICULO, :CANTIDAD, :CTACOSTO, :CTAINVEN, :FECHA
        DO
        BEGIN
        EXECUTE PROCEDURE COSTO_PROMEDIO(:ARTICULO, :FECHA) returning_values (:COSTO);
        INSERT INTO COSTO_VENTAS VALUES (:ARTICULO, :CANTIDAD, :COSTO, :CTACOSTO, :CTAINVEN);
        END
    END
 $$IBE$$*/ EXIT;
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE COSTO_EN_VENTAS_CONTADO(
    FECFAC DATE,
    PREF VARCHAR(4),
    PTVTA INTEGER)
AS
declare variable ARTICULO VARCHAR(20);
declare variable CANTIDAD NUMERIC(18,4);
declare variable COSTO NUMERIC(18,2);
declare variable CTACOSTO VARCHAR(20);
declare variable CTAINVEN VARCHAR(20);
BEGIN /*$$IBE$$ 
    DELETE FROM COSTO_VENTAS;
     $$IBE$$*/ /* FACTURA DE VENTA */ /*$$IBE$$ 
    FOR SELECT MAX(D.ARTI_COD), SUM(FADE_CANT * FADE_FACTOR), MAX(COAR_CTACOS), MAX(COAR_CTAINV)
        FROM ARTICULO A, FACTURAS F, FACTURAS_DETALLE D, CONTABIL_ARTICULO C
        WHERE F.FACT_ID = D.FACT_ID AND A.ARTI_COD = D.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND FACT_ANULADO = 'N' AND FACT_FECHA = :FECFAC AND F.PREF_PRE = :PREF AND F.PTVT_ID = :PTVTA and substring(a.arti_cod from 1 FOR 2) <> '.t'
        GROUP BY D.ARTI_COD
        INTO :ARTICULO, :CANTIDAD, :CTACOSTO, :CTAINVEN
        DO
        BEGIN
        EXECUTE PROCEDURE COSTO_PROMEDIO(:ARTICULO, :FECFAC) returning_values (:COSTO);
        INSERT INTO COSTO_VENTAS VALUES (:ARTICULO, :CANTIDAD, :COSTO * :CANTIDAD, :CTACOSTO, :CTAINVEN);
        END
 $$IBE$$*/ EXIT;
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE COSTO_PROMEDIO_UNIDAD(
    ARTICULO VARCHAR(15),
    FECHA DATE,
    UNIDAD VARCHAR(8))
RETURNS (
    COSTO NUMERIC(18,2))
AS
declare variable FACTOR NUMERIC(15,4);
BEGIN /*$$IBE$$ 
  EXECUTE PROCEDURE COSTO_PROMEDIO(ARTICULO, FECHA) returning_values (COSTO);
  EXECUTE PROCEDURE FACTOR_UNIDAD_CANT(ARTICULO, UNIDAD) returning_values (FACTOR);
  COSTO = COSTO * FACTOR;
  SUSPEND;
 $$IBE$$*/ SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE IMPR_AJUSTE(
    ID INTEGER)
RETURNS (
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    CONCEPTO VARCHAR(60),
    CODBODEGA VARCHAR(2),
    NOMBODEGA VARCHAR(30),
    OBS BLOB SUB_TYPE 1 SEGMENT SIZE 80,
    AJUSTAR CHAR(2),
    ITEM INTEGER,
    ARTICULO VARCHAR(15),
    CODBAR VARCHAR(15),
    ARTIDES VARCHAR(60),
    EXANT NUMERIC(18,4),
    EXNUE NUMERIC(18,4),
    CANT NUMERIC(18,4),
    UNIDAD VARCHAR(8),
    BODITEM VARCHAR(2),
    LOTE VARCHAR(15),
    COSTO NUMERIC(18,2),
    TOTAL NUMERIC(18,2))
AS
BEGIN
  /*  */ /*$$IBE$$ 
  SELECT PREF_PRE, AJUS_NUMERO, AJUS_FECHA, AJUS_CONC, A.BODE_COD, BODE_NOM, AJUS_OBS, AJUS_NOAJUSTAR
    FROM AJUSTES A, BODEGA B WHERE A.BODE_COD = B.BODE_COD AND A.AJUS_ID = :ID into
    :PREF, :NUMERO, :FECHA, :CONCEPTO, :CODBODEGA, :NOMBODEGA, :OBS, :AJUSTAR;
  if (AJUSTAR = 'S') then
    AJUSTAR = 'NO';
  else
    AJUSTAR = 'SI';
  FOR SELECT AJUS_ITEM, A.ARTI_COD, AJUS_CODBAR, AJDE_DESC, AJUS_EXANT, AJUS_UNIDAD, BODE_COD, AJUS_EXNUE, AJUS_LOTE
    FROM AJUSTES_DETALLE D, ARTICULO A
    WHERE D.ARTI_COD = A.ARTI_COD AND D.AJUS_ID = :ID
    ORDER BY AJUS_ITEM
    INTO :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :EXANT, :UNIDAD, :BODITEM, :EXNUE, :LOTE
    DO
      BEGIN
      EXECUTE PROCEDURE COSTO_PROMEDIO(:ARTICULO, :FECHA) returning_values (:COSTO);
      CANT = EXNUE - EXANT;
      TOTAL = CANT * COSTO;
      SUSPEND;
      END
 $$IBE$$*/ SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

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

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE REP_COMPROBANTES_ARTICULO(
    TIPODOC INTEGER,
    DETALLE CHAR(1),
    FECINI DATE,
    FECFIN DATE,
    ARTINI VARCHAR(20),
    ARTFIN VARCHAR(20),
    GRPINI VARCHAR(2),
    GRPFIN VARCHAR(2),
    ORDEN CHAR(1),
    SUBEMPRESA INTEGER)
RETURNS (
    CODIGO VARCHAR(15),
    NOMBRE VARCHAR(60),
    UNIDAD VARCHAR(8),
    CODGRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    CODSUBG VARCHAR(3),
    NOMSUBG VARCHAR(30),
    CODMARC VARCHAR(3),
    NOMMARC VARCHAR(30),
    CODBOD VARCHAR(2),
    NOMTIPO VARCHAR(30),
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    CONCEPTO VARCHAR(60),
    NIT VARCHAR(20),
    NOMTERC VARCHAR(60),
    CONS INTEGER,
    CANT NUMERIC(18,4),
    COSTO NUMERIC(18,2),
    COSTOTOT NUMERIC(18,2))
AS
declare variable ENT CHAR(1);
declare variable ENTRADAS NUMERIC(18,4);
declare variable COSTOENT NUMERIC(18,2);
declare variable SALIDAS NUMERIC(18,4);
declare variable COSTOSAL NUMERIC(18,2);
declare variable CODINI VARCHAR(20);
declare variable CODFIN VARCHAR(20);
declare variable DESINI VARCHAR(20);
declare variable DESFIN VARCHAR(20);
BEGIN /*$$IBE$$ 
  SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = :TIPODOC INTO :NOMTIPO;
  if (ORDEN = 'C') then
    BEGIN
    CODINI = ARTINI;
    CODFIN = ARTFIN;
    DESINI = '';
    DESFIN = 'zz';
    END
  ELSE
    BEGIN
    DESINI = ARTINI;
    DESFIN = ARTFIN;
    CODINI = '';
    CODFIN = 'zz';
    END
  FOR
    SELECT ARTI_COD, ARTI_DES, ARTI_UNIDAD, A.GRUP_COD, A.SUBG_COD, A.MARC_COD
      FROM ARTICULO A
      WHERE ARTI_COD >= :CODINI AND ARTI_COD <= :CODFIN AND A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :GRPFIN AND ARTI_DES >= :DESINI AND ARTI_DES <= :DESFIN
      INTO :CODIGO, :NOMBRE, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
      DO
        BEGIN
        NOMMARC = '';
        NOMSUBG = '';
        SELECT GRUP_NOM FROM GRUPO WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
        SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
        SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
        if (DETALLE = 'N') then
            BEGIN
            CANT = 0;
            COSTOTOT = 0;
             $$IBE$$*/ /* SUME LAS ENTRADAS */ /*$$IBE$$ 
            SELECT SUM(MVAR_CANT), SUM(MVAR_CANT * MVAR_COSTO) FROM MOVIMIENTO_ARTICULO M, PREFIJOS P
              WHERE P.PREF_PRE = M.MVAR_PREF AND P.TIDO_COD = M.mvar_tipodoc AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA)) AND
              (MVAR_FECHA >= :FECINI) AND (MVAR_FECHA < :FECFIN) AND
              (ARTI_COD = :CODIGO) AND (MVAR_ENTRADA = 'S') AND (MVAR_TIPODOC = :TIPODOC)
              INTO :ENTRADAS, :COSTOENT;
            if (ENTRADAS IS NULL) then
              ENTRADAS = 0;
            if (COSTOENT IS NULL) then
              COSTOENT = 0;
             $$IBE$$*/ /* CALCULE LAS SALIDAS A COSTO PROMEDIO */ /*$$IBE$$ 
            SALIDAS = 0;
            COSTOSAL = 0;
            FOR SELECT MVAR_CANT, MVAR_FECHA
                FROM MOVIMIENTO_ARTICULO M, PREFIJOS P
                WHERE P.PREF_PRE = M.MVAR_PREF AND P.TIDO_COD = M.mvar_tipodoc AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA)) AND
                (MVAR_FECHA >= :FECINI) AND (MVAR_FECHA <= :FECFIN) AND
                (ARTI_COD = :CODIGO) AND (MVAR_ENTRADA = 'N') AND (MVAR_TIPODOC = :TIPODOC)
                INTO :CANT, :FECHA
                DO
                    BEGIN
                    EXECUTE PROCEDURE COSTO_PROMEDIO(:CODIGO, :FECHA) returning_values (:COSTO);
                    SALIDAS = SALIDAS + CANT;
                    COSTOSAL = COSTOSAL + (COSTO * CANT);
                    END
            if (SALIDAS IS NULL) then
              SALIDAS = 0;
            if (COSTOSAL IS NULL) then
              COSTOSAL = 0;
            if (ENTRADAS > 0) then
                CANT = ENTRADAS;
            if (SALIDAS > 0) then
                CANT = SALIDAS;
            if (COSTOENT > 0) then
                COSTOTOT = COSTOENT;
            if (COSTOSAL > 0) then
                COSTOTOT = COSTOSAL;
            if (CANT > 0) then
                COSTO = COSTOTOT / CANT;
            ELSE
                COSTO = 0;
            if (CANT <> 0) then
                SUSPEND;
            END
        ELSE
            BEGIN
            FOR SELECT MVAR_ENTRADA, MVAR_PREF, MVAR_NUMERO, MVAR_CANT, MVAR_COSTO, MVAR_CONC, MVAR_FECHA, M.TERC_NIT, TERC_NOM, MVAR_CONS, BODE_COD
                FROM MOVIMIENTO_ARTICULO M, TIPO_DOCUMENTO TD, PREFIJOS P
                LEFT OUTER JOIN TERCEROS T ON (M.TERC_NIT = T.TERC_NIT)
                WHERE TD.TIDO_COD = MVAR_TIPODOC AND P.PREF_PRE = M.MVAR_PREF AND P.TIDO_COD = M.mvar_tipodoc AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA)) AND
                (MVAR_FECHA >= :FECINI) AND (MVAR_FECHA < :FECFIN) AND (ARTI_COD = :CODIGO) AND (MVAR_TIPODOC = :TIPODOC)
                ORDER BY MVAR_FECHA, MVAR_CONS
                INTO :ENT, :PREFIJO, :NUMERO, :CANT, :COSTO, :CONCEPTO, :FECHA, :NIT, :NOMTERC, :CONS, :CODBOD
                DO
                    BEGIN
                    if (ENT = 'S') then
                        BEGIN
                        COSTOTOT = (CANT * COSTO);
                        end
                    ELSE
                        BEGIN
                        EXECUTE PROCEDURE COSTO_PROMEDIO(:CODIGO, :FECHA) returning_values (:COSTO);
                        COSTOTOT = (CANT * COSTO);
                        END
                    SUSPEND;
                    END
            END
        END
 $$IBE$$*/ SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE REP_COMPROBANTES_INV(
    TIPO INTEGER,
    DETALLE CHAR(1),
    FECINI DATE,
    FECFIN DATE,
    PREFIJO VARCHAR(4),
    ANULADOS CHAR(1),
    SUBEMPRESA INTEGER)
RETURNS (
    NOMTIPO VARCHAR(30),
    ID INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    VENCE DATE,
    CONCEPTO VARCHAR(60),
    REFER VARCHAR(60),
    CODBODORI VARCHAR(2),
    NOMBODORI VARCHAR(30),
    CODBODDES VARCHAR(2),
    NOMBODDES VARCHAR(30),
    NOMTERCERO VARCHAR(60),
    PRODCODBAR VARCHAR(15),
    PRODDES VARCHAR(60),
    PRODCANT NUMERIC(18,4),
    PRODUNIDAD VARCHAR(8),
    PRODLOTE VARCHAR(15),
    OBS BLOB SUB_TYPE 0 SEGMENT SIZE 80,
    ITEM INTEGER,
    ARTICULO VARCHAR(15),
    CODBAR VARCHAR(15),
    ARTIDES VARCHAR(60),
    CANT NUMERIC(18,4),
    EXANT NUMERIC(18,4),
    UNIDAD VARCHAR(8),
    BODITEM VARCHAR(2),
    COSTO NUMERIC(18,2),
    DTOPORC NUMERIC(9,2),
    DTOMONTO NUMERIC(18,2),
    IVAPORC NUMERIC(9,2),
    IVAMONTO NUMERIC(18,2),
    CONSUMO NUMERIC(18,2),
    SUBTOTAL NUMERIC(18,2),
    TOTAL NUMERIC(18,2),
    LOTE VARCHAR(15),
    ANULADO CHAR(1),
    OBSITEM BLOB SUB_TYPE 0 SEGMENT SIZE 80)
AS
BEGIN
  /* DETERMINE LA TABLA A EXAMINAR */ /*$$IBE$$ 
  if (BIN_AND(TIPO, 1) <> 0) then
    BEGIN
    SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 11 INTO :NOMTIPO;
    FOR SELECT ENTR_ID, E.PREF_PRE, ENTR_NUMERO, ENTR_FECHA, ENTR_CONC, ENTR_REFER, E.BODE_COD, BODE_NOM, ENTR_NOMTERC, ENTR_OBS, ENTR_ANULADO
    FROM ENTRADAS E, BODEGA B, PREFIJOS P
    WHERE E.BODE_COD = B.BODE_COD AND ENTR_FECHA >= :FECINI AND ENTR_FECHA <= :FECFIN
     AND P.PREF_PRE = E.PREF_PRE AND P.TIDO_COD = 11 AND ((P.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
    ORDER BY ENTR_FECHA, ENTR_ID
    INTO :ID, :PREF, :NUMERO, :FECHA, :CONCEPTO, :REFER, :CODBODORI, :NOMBODORI, :NOMTERCERO, :OBS, :ANULADO
    DO
        BEGIN
        if (((:PREFIJO = '') or (:PREF = :PREFIJO)) AND ((:ANULADOS = 'S') or (:ANULADO = 'N'))) then
            BEGIN
            if (anulado = 'S') then
             BEGIN
              ITEM = 0;
              ARTICULO = '';
              CODBAR = '';
              ARTIDES = '';
              CANT = 0;
              UNIDAD = '';
              BODITEM = '';
              lote = '';
              costo = 0;
              DTOPORC = 0;
              DTOMONTO = 0;
              IVAPORC = 0;
              IVAMONTO = 0;
              CONSUMO = 0;
              TOTAL = 0;
              OBSITEM = null;
              SUBTOTAL = 0;
              SUSPEND;
             END
            ELSE
             BEGIN
              if (DETALLE = 'S') then
                FOR SELECT ENDE_ITEM, A.ARTI_COD, ENDE_CODBAR, ENDE_DESC, ENDE_CANT, ENDE_UNIDAD, BODE_COD, ENDE_COSTO, ENDE_DTOPORC, ENDE_DTOMONTO, ENDE_IVAPORC, ENDE_IVAMONTO, ENDE_CONSUMO, ENDE_TOTAL, ENDE_LOTE, ENDE_OBS
                    FROM ENTRADAS_DETALLE D, ARTICULO A WHERE D.ARTI_COD = A.ARTI_COD AND D.ENTR_ID = :ID INTO
                    :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :BODITEM, :COSTO, :DTOPORC, :DTOMONTO, :IVAPORC, :IVAMONTO, :CONSUMO, :TOTAL, :LOTE, :OBSITEM
                    DO
                    BEGIN
                    SUBTOTAL = TOTAL - IVAMONTO - CONSUMO;
                    SUSPEND;
                    END
              ELSE
                BEGIN
                SELECT SUM(ENDE_IVAMONTO), SUM(ENDE_CONSUMO), SUM(ENDE_TOTAL)
                    FROM ENTRADAS_DETALLE D WHERE D.ENTR_ID = :ID INTO
                    :IVAMONTO, :CONSUMO, :TOTAL;
                SUBTOTAL = TOTAL - IVAMONTO - CONSUMO;
                SUSPEND;
                END
             END
            END
        END
    END
  if (BIN_AND(TIPO, 2) <> 0) then
    BEGIN
    SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 12 INTO :NOMTIPO;
    FOR SELECT SALI_ID, S.PREF_PRE, SALI_NUMERO, SALI_FECHA, SALI_CONC, SALI_REFER, S.BODE_COD, BODE_NOM, SALI_NOMTERC, SALI_OBS, SALI_ANULADO
    FROM SALIDAS S, BODEGA B, PREFIJOS P
    WHERE S.BODE_COD = B.BODE_COD AND SALI_FECHA >= :FECINI AND SALI_FECHA <= :FECFIN 
     AND P.PREF_PRE = S.PREF_PRE AND P.TIDO_COD = 12 AND ((P.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
    ORDER BY SALI_FECHA, SALI_ID
    into :ID, :PREF, :NUMERO, :FECHA, :CONCEPTO, :REFER, :CODBODORI, :NOMBODORI, :NOMTERCERO, :OBS, :ANULADO
    DO
        BEGIN
        if (((:PREFIJO = '') or (:PREF = :PREFIJO)) AND ((:ANULADOS = 'S') or (:ANULADO = 'N'))) then
            BEGIN
            if (anulado = 'S') then
             BEGIN
              ITEM = 0;
              ARTICULO = '';
              CODBAR = '';
              ARTIDES = '';
              CANT = 0;
              UNIDAD = '';
              BODITEM = '';
              lote = '';
              costo = 0;
              DTOPORC = 0;
              DTOMONTO = 0;
              IVAPORC = 0;
              IVAMONTO = 0;
              CONSUMO = 0;
              EXANT = 0;
              TOTAL = 0;
              OBSITEM = null;
              SUBTOTAL = 0;
              SUSPEND;
             END
            ELSE
             BEGIN
              if (DETALLE = 'S') then
                FOR SELECT SADE_ITEM, A.ARTI_COD, SADE_CODBAR, SADE_DESC, SADE_CANT, SADE_UNIDAD, BODE_COD, SADE_COSTO, SADE_IVAPORC, SADE_IVAMONTO, SADE_CONSUMO, SADE_TOTAL, SADE_LOTE, SADE_OBS
                    FROM SALIDAS_DETALLE D, ARTICULO A WHERE D.ARTI_COD = A.ARTI_COD AND D.SALI_ID = :ID INTO
                    :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :BODITEM, :COSTO, :IVAPORC, :IVAMONTO, :CONSUMO, :TOTAL, :LOTE, :OBSITEM
                    DO
                BEGIN
                SUBTOTAL = TOTAL - IVAMONTO - CONSUMO;
                SUSPEND;
                END
              ELSE
                BEGIN
                SELECT SUM(SADE_IVAMONTO), SUM(SADE_CONSUMO), SUM(SADE_TOTAL)
                    FROM SALIDAS_DETALLE D WHERE D.SALI_ID = :ID INTO
                    :IVAMONTO, :CONSUMO, :TOTAL;
                SUBTOTAL = TOTAL - IVAMONTO - CONSUMO;
                SUSPEND;
                END
             END
            END
        END
    END
  if (BIN_AND(TIPO, 4) <> 0) then
    BEGIN
    SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 13 INTO :NOMTIPO;
    FOR SELECT TRAN_ID, T.PREF_PRE, TRAN_NUMERO, TRAN_FECHA, TRAN_CONC, TRAN_REFER, T.BODE_COD, BO.BODE_NOM, TRAN_BODDES, BD.BODE_NOM, TRAN_OBS, TRAN_ANULADO
    FROM TRASFERENCIAS T, BODEGA BO, BODEGA BD, PREFIJOS P
    WHERE T.BODE_COD = BO.BODE_COD AND T.TRAN_BODDES = BD.BODE_COD AND TRAN_FECHA >= :FECINI AND TRAN_FECHA <= :FECFIN 
     AND P.PREF_PRE = T.PREF_PRE AND P.TIDO_COD = 13 AND ((P.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
    ORDER BY TRAN_FECHA, TRAN_ID
    into :ID, :PREF, :NUMERO, :FECHA, :CONCEPTO, :REFER, :CODBODORI, :NOMBODORI, :CODBODDES, :NOMBODDES, :OBS, :ANULADO
    DO
        BEGIN
        if (((:PREFIJO = '') or (:PREF = :PREFIJO)) AND ((:ANULADOS = 'S') or (:ANULADO = 'N'))) then
            BEGIN
            if (anulado = 'S') then
             BEGIN
              ITEM = 0;
              ARTICULO = '';
              CODBAR = '';
              ARTIDES = '';
              CANT = 0;
              UNIDAD = '';
              BODITEM = '';
              lote = '';
              costo = 0;
              DTOPORC = 0;
              DTOMONTO = 0;
              IVAPORC = 0;
              IVAMONTO = 0;
              CONSUMO = 0;
              EXANT = 0;
              TOTAL = 0;
              OBSITEM = null;
              SUBTOTAL = 0;
              SUSPEND;
             END
            ELSE
             BEGIN
              if (DETALLE = 'S') then
                FOR SELECT TRAS_ITEM, A.ARTI_COD, TRAS_CODBAR, TRAS_DESC, TRAS_CANT, TRAS_UNIDAD, TRAS_COSTO, TRAS_IVAPORC, TRAS_IVAMONTO, TRAS_CONSUMO, TRAS_TOTAL, TRAS_LOTE, TRAS_OBS
                    FROM TRASFERENCIAS_DETALLE D, ARTICULO A WHERE D.ARTI_COD = A.ARTI_COD AND D.TRAN_ID = :ID INTO
                    :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :COSTO, :IVAPORC, :IVAMONTO, :CONSUMO, :TOTAL, :LOTE, :OBSITEM
                    DO
                    BEGIN
                    SUBTOTAL = TOTAL - IVAMONTO - CONSUMO;
                    SUSPEND;
                    END
              ELSE
                BEGIN
                SELECT SUM(TRAS_IVAMONTO), SUM(TRAS_CONSUMO), SUM(TRAS_TOTAL) FROM trasferencias_detalle D
                    WHERE D.TRAN_ID = :ID INTO :IVAMONTO, :CONSUMO, :TOTAL;
                SUBTOTAL = TOTAL - IVAMONTO - CONSUMO;
                SUSPEND;
                END
             END
            END
        END
    END
  if (BIN_AND(TIPO, 8) <> 0) then
    BEGIN
    SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 14 INTO :NOMTIPO;
    FOR SELECT AJUS_ID, A.PREF_PRE, AJUS_NUMERO, AJUS_FECHA, AJUS_CONC, A.BODE_COD, BODE_NOM, AJUS_OBS, AJUS_ANULADO
    FROM AJUSTES A, BODEGA B, PREFIJOS P
    WHERE A.BODE_COD = B.BODE_COD AND AJUS_FECHA >= :FECINI AND AJUS_FECHA <= :FECFIN 
     AND P.PREF_PRE = A.PREF_PRE AND P.TIDO_COD = 14 AND ((P.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
    ORDER BY AJUS_FECHA, AJUS_ID
    into :ID, :PREF, :NUMERO, :FECHA, :CONCEPTO, :CODBODORI, :NOMBODORI, :OBS, :ANULADO
    DO
        BEGIN
        if (((:PREFIJO = '') or (:PREF = :PREFIJO)) AND ((:ANULADOS = 'S') or (:ANULADO = 'N'))) then
            BEGIN
            if (anulado = 'S') then
             BEGIN
              ITEM = 0;
              ARTICULO = '';
              CODBAR = '';
              ARTIDES = '';
              CANT = 0;
              UNIDAD = '';
              BODITEM = '';
              lote = '';
              costo = 0;
              DTOPORC = 0;
              DTOMONTO = 0;
              IVAPORC = 0;
              IVAMONTO = 0;
              CONSUMO = 0;
              EXANT = 0;
              TOTAL = 0;
              OBSITEM = null;
              SUBTOTAL = 0;
              SUSPEND;
             END
            ELSE
             BEGIN
              if (DETALLE = 'S') then
                FOR SELECT AJUS_ITEM, A.ARTI_COD, AJUS_CODBAR, AJDE_DESC, AJUS_EXANT, AJUS_UNIDAD, BODE_COD, AJUS_EXNUE, AJUS_LOTE, AJDE_OBS
                    FROM AJUSTES_DETALLE D, ARTICULO A WHERE D.ARTI_COD = A.ARTI_COD AND D.AJUS_ID = :ID INTO
                    :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :EXANT, :UNIDAD, :BODITEM, :CANT, :LOTE, :OBSITEM
                    DO
                      BEGIN
                      EXECUTE PROCEDURE COSTO_PROMEDIO(:ARTICULO, :FECHA) returning_values (:COSTO);
                      TOTAL = (CANT - EXANT) * COSTO;
                      SUBTOTAL = TOTAL;
                      SUSPEND;
                      END
              ELSE
                BEGIN
                TOTAL = 0;
                FOR SELECT ARTI_COD, AJUS_EXNUE, AJUS_EXANT FROM AJUSTES_DETALLE D WHERE D.AJUS_ID = :ID INTO
                    :ARTICULO, :CANT, :EXANT
                    DO
                      BEGIN
                      EXECUTE PROCEDURE COSTO_PROMEDIO(:ARTICULO, :FECHA) returning_values (:COSTO);
                      TOTAL = TOTAL + ((CANT - EXANT) * COSTO);
                      SUBTOTAL = TOTAL;
                      END
                SUSPEND;
                END
             END
            END
        END
    END
  if (BIN_AND(TIPO, 16) <> 0) then
    BEGIN
    SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 15 INTO :NOMTIPO;
    FOR SELECT ENSA_ID, E.PREF_PRE, ENSA_NUMERO, ENSA_FECHA, ENSA_CONC, ENSA_REFER, E.BODE_COD, BODE_NOM, ENSA_CODBAR, ENSA_DESC, ENSA_CANT, ENSA_UNIDAD, ENSA_LOTE, ENSA_OBS, ENSA_ANULADO
    FROM ENSAMBLES E, BODEGA B, PREFIJOS P
    WHERE E.BODE_COD = B.BODE_COD AND E.ENSA_FECHA >= :FECINI AND E.ENSA_FECHA <= :FECFIN
     AND P.PREF_PRE = E.PREF_PRE AND P.TIDO_COD = 15 AND ((P.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
    ORDER BY ENSA_FECHA, ENSA_ID
    into :ID, :PREF, :NUMERO, :FECHA, :CONCEPTO, :REFER, :CODBODORI, :NOMBODORI, :PRODCODBAR, :PRODDES, :PRODCANT, :PRODUNIDAD, :PRODLOTE, :OBS, :ANULADO
    DO
        BEGIN
        if (((:PREFIJO = '') or (:PREF = :PREFIJO)) AND ((:ANULADOS = 'S') or (:ANULADO = 'N'))) then
            BEGIN
            if (anulado = 'S') then
             BEGIN
              ITEM = 0;
              ARTICULO = '';
              CODBAR = '';
              ARTIDES = '';
              CANT = 0;
              UNIDAD = '';
              BODITEM = '';
              lote = '';
              costo = 0;
              DTOPORC = 0;
              DTOMONTO = 0;
              IVAPORC = 0;
              IVAMONTO = 0;
              CONSUMO = 0;
              EXANT = 0;
              TOTAL = 0;
              OBSITEM = null;
              SUBTOTAL = 0;
              SUSPEND;
             END
            ELSE
             BEGIN
              if (DETALLE = 'S') then
                FOR SELECT ESDE_ITEM, A.ARTI_COD, ESDE_CODBAR, ESDE_DESC, ESDE_CANT, ESDE_UNIDAD, BODE_COD, ESDE_COSTO, ESDE_IVAPORC, ESDE_IVAMONTO, ESDE_CONSUMO, ESDE_TOTAL, ESDE_LOTE, ESDE_OBS
                    FROM ensambles_detalle D, ARTICULO A WHERE D.ARTI_COD = A.ARTI_COD AND D.ENSA_ID = :ID INTO
                    :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :BODITEM, :COSTO, :IVAPORC, :IVAMONTO, :CONSUMO, :TOTAL, :LOTE, :OBSITEM
                    DO
                    BEGIN
                    SUBTOTAL = TOTAL - IVAMONTO - CONSUMO;
                    SUSPEND;
                    END
              ELSE
                BEGIN
                SELECT SUM(ESDE_IVAMONTO), SUM(ESDE_CONSUMO), SUM(ESDE_TOTAL) FROM ENSAMBLES_detalle D WHERE D.ENSA_ID = :ID INTO
                    :IVAMONTO, :CONSUMO, :TOTAL;
                SUBTOTAL = TOTAL - IVAMONTO - CONSUMO;
                SUSPEND;
                END
             END
            END
        END
    END
  if (BIN_AND(TIPO, 32) <> 0) then
    BEGIN
    SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 16 INTO :NOMTIPO;
    FOR SELECT DESE_ID, E.PREF_PRE, DESE_NUMERO, DESE_FECHA, DESE_CONC, DESE_REFER, E.BODE_COD, BODE_NOM, DESE_CODBAR, DESE_DESC, DESE_CANT, DESE_UNIDAD, DESE_LOTE, DESE_OBS, DESE_ANULADO
    FROM DESENSAMBLES E, BODEGA B, PREFIJOS P
    WHERE E.BODE_COD = B.BODE_COD AND DESE_FECHA >= :FECINI AND DESE_FECHA <= :FECFIN 
     AND P.PREF_PRE = E.PREF_PRE AND P.TIDO_COD = 16 AND ((P.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
    ORDER BY DESE_FECHA, DESE_ID
    into :ID, PREF, :NUMERO, :FECHA, :CONCEPTO, :REFER, :CODBODORI, :NOMBODORI, :PRODCODBAR, :PRODDES, :PRODCANT, :PRODUNIDAD, :PRODLOTE, :OBS, :ANULADO
    DO
        BEGIN
        if (((:PREFIJO = '') or (:PREF = :PREFIJO)) AND ((:ANULADOS = 'S') or (:ANULADO = 'N'))) then
            BEGIN
            if (anulado = 'S') then
             BEGIN
              ITEM = 0;
              ARTICULO = '';
              CODBAR = '';
              ARTIDES = '';
              CANT = 0;
              UNIDAD = '';
              BODITEM = '';
              lote = '';
              costo = 0;
              DTOPORC = 0;
              DTOMONTO = 0;
              IVAPORC = 0;
              IVAMONTO = 0;
              CONSUMO = 0;
              EXANT = 0;
              TOTAL = 0;
              OBSITEM = null;
              SUBTOTAL = 0;
              SUSPEND;
             END
            ELSE
             BEGIN
              if (DETALLE = 'S') then
                FOR SELECT DESE_ITEM, A.ARTI_COD, DEDE_CODBAR, DEDE_DESC, DEDE_CANT, DEDE_UNIDAD, BODE_COD, DEDE_COSTO, DEDE_IVAPORC, DEDE_IVAMONTO, DEDE_CONSUMO, DEDE_TOTAL, DEDE_LOTE, DEDE_OBS
                    FROM desensambles_detalle D, ARTICULO A WHERE D.ARTI_COD = A.ARTI_COD AND D.DESE_ID = :ID INTO
                    :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :BODITEM, :COSTO, :IVAPORC, :IVAMONTO, :CONSUMO, :TOTAL, :LOTE, :OBSITEM
                    DO
                    BEGIN
                    SUBTOTAL = TOTAL - IVAMONTO - CONSUMO;
                    SUSPEND;
                    END
              ELSE
                BEGIN
                SELECT SUM(DEDE_IVAMONTO), SUM(DEDE_CONSUMO), SUM(DEDE_TOTAL) FROM DESENSAMBLES_detalle D WHERE D.DESE_ID = :ID INTO
                    :IVAMONTO, :CONSUMO, :TOTAL;
                SUBTOTAL = TOTAL - IVAMONTO - CONSUMO;
                SUSPEND;
                END
             END
            END
        END
    END
  if (BIN_AND(TIPO, 64) <> 0) then
    BEGIN
    SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 17 INTO :NOMTIPO;
    FOR SELECT RESE_ID, R.PREF_PRE, RESE_NUMERO, RESE_FECHA, RESE_CONC, RESE_REFER, R.BODE_COD, BODE_NOM, RESE_NOMTERC, RESE_OBS, RESE_ANULADO
    FROM RESERVAS R, BODEGA B, PREFIJOS P
    WHERE R.BODE_COD = B.BODE_COD AND R.RESE_FECHA >= :FECINI AND R.RESE_FECHA <= :FECFIN 
     AND P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = 17 AND ((P.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
    ORDER BY RESE_FECHA, RESE_ID
    into :ID, :PREF, :NUMERO, :FECHA, :CONCEPTO, :REFER, :CODBODORI, :NOMBODORI, :NOMTERCERO, :OBS, :ANULADO
    DO
        BEGIN
        if (((:PREFIJO = '') or (:PREF = :PREFIJO)) AND ((:ANULADOS = 'S') or (:ANULADO = 'N'))) then
            BEGIN
            if (anulado = 'S') then
             BEGIN
              ITEM = 0;
              ARTICULO = '';
              CODBAR = '';
              ARTIDES = '';
              CANT = 0;
              UNIDAD = '';
              BODITEM = '';
              lote = '';
              costo = 0;
              DTOPORC = 0;
              DTOMONTO = 0;
              IVAPORC = 0;
              IVAMONTO = 0;
              CONSUMO = 0;
              EXANT = 0;
              TOTAL = 0;
              OBSITEM = null;
              SUBTOTAL = 0;
              SUSPEND;
             END
            ELSE
             BEGIN
              if (DETALLE = 'S') then
                FOR SELECT RSDE_ITEM, A.ARTI_COD, RSDE_CODBAR, RSDE_DESC, RDSE_CANT, RSDE_UNIDAD, BODE_COD, RSDE_OBS
                    FROM RESERVAS_DETALLE D, ARTICULO A WHERE D.ARTI_COD = A.ARTI_COD AND D.RESE_ID = :ID INTO
                    :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :BODITEM, :OBSITEM
                    DO
                    SUSPEND;
              ELSE
                BEGIN
                SELECT SUM(RDSE_CANT) FROM RESERVAS_detalle D WHERE D.RESE_ID = :ID INTO
                    :CANT;
                SUSPEND;
                END
             END
            END
        END
    END
  if (BIN_AND(TIPO, 128) <> 0) then
    BEGIN
    SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 18 INTO :NOMTIPO;
    FOR SELECT ORIN_ID, O.PREF_PRE, ORIN_NUMERO, ORIN_FECHA, ORIN_FECLLEGA, ORIN_CONC, ORIN_REFER, ORIN_NOMTERC, ORIN_OBS, ORIN_ANULADO
        FROM ORDENES_INVENTARIO O, PREFIJOS P
        WHERE ORIN_FECHA >= :FECINI AND ORIN_FECHA <= :FECFIN 
        AND P.PREF_PRE = O.PREF_PRE AND P.TIDO_COD = 18 AND ((P.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
        ORDER BY ORIN_FECHA, ORIN_ID
        into :ID, PREF, :NUMERO, :FECHA, :VENCE, :CONCEPTO, :REFER, :NOMTERCERO, :OBS, :ANULADO
        DO
        BEGIN
        if (((:PREFIJO = '') or (:PREF = :PREFIJO)) AND ((:ANULADOS = 'S') or (:ANULADO = 'N'))) then
            BEGIN
            if (anulado = 'S') then
             BEGIN
              ITEM = 0;
              ARTICULO = '';
              CODBAR = '';
              ARTIDES = '';
              CANT = 0;
              UNIDAD = '';
              BODITEM = '';
              lote = '';
              costo = 0;
              DTOPORC = 0;
              DTOMONTO = 0;
              IVAPORC = 0;
              IVAMONTO = 0;
              CONSUMO = 0;
              EXANT = 0;
              TOTAL = 0;
              OBSITEM = null;
              SUBTOTAL = 0;
              SUSPEND;
             END
            ELSE
             BEGIN
              if (DETALLE = 'S') then
                FOR SELECT ORID_ITEM, A.ARTI_COD, ORID_CODBAR, ORID_DESC, ORID_CANT, ORID_UNIDAD, ORIN_COSTO, ORID_DTOPORC, ORID_DTOMONTO, ORID_IVAPORC, ORID_IVAMONTO, ORID_CONSUMO, ORID_TOTAL, ORID_OBS, ORID_LOTE
                    FROM ORDENINVENTARIO_DETALLE D, ARTICULO A WHERE D.ARTI_COD = A.ARTI_COD AND D.ORIN_ID = :ID INTO
                    :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :COSTO, :DTOPORC, :DTOMONTO, :IVAPORC, :IVAMONTO, :CONSUMO, :TOTAL, :OBSITEM, :LOTE
                    DO
                    BEGIN
                    SUBTOTAL = TOTAL - IVAMONTO - CONSUMO;
                    SUSPEND;
                    END
              ELSE
                BEGIN
                SELECT SUM(ORID_IVAMONTO), SUM(ORID_CONSUMO), SUM(ORID_TOTAL) FROM ordeninventario_detalle D WHERE D.ORIN_ID = :ID INTO
                    :IVAMONTO, :CONSUMO, :TOTAL;
                SUBTOTAL = TOTAL - IVAMONTO - CONSUMO;
                SUSPEND;
                END
             END
            END
        END
    END
 $$IBE$$*/ SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE REP_CONSECUTIVOS_INV(
    TIPO INTEGER,
    DETALLE CHAR(1),
    PREINI VARCHAR(4),
    PREFIN VARCHAR(4),
    NUMINI VARCHAR(6),
    NUMFIN VARCHAR(6),
    ANULADOS CHAR(1),
    SUBEMPRESA INTEGER)
RETURNS (
    NOMTIPO VARCHAR(30),
    ID INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    VENCE DATE,
    CONCEPTO VARCHAR(60),
    REFER VARCHAR(60),
    CODBODORI VARCHAR(2),
    NOMBODORI VARCHAR(30),
    CODBODDES VARCHAR(2),
    NOMBODDES VARCHAR(30),
    NOMTERCERO VARCHAR(60),
    PRODCODBAR VARCHAR(15),
    PRODDES VARCHAR(60),
    PRODCANT NUMERIC(18,4),
    PRODUNIDAD VARCHAR(8),
    PRODLOTE VARCHAR(15),
    OBS BLOB SUB_TYPE 0 SEGMENT SIZE 80,
    ITEM INTEGER,
    ARTICULO VARCHAR(15),
    CODBAR VARCHAR(15),
    ARTIDES VARCHAR(60),
    CANT NUMERIC(18,4),
    EXANT NUMERIC(18,4),
    UNIDAD VARCHAR(8),
    BODITEM VARCHAR(2),
    COSTO NUMERIC(18,2),
    DTOPORC NUMERIC(9,2),
    DTOMONTO NUMERIC(18,2),
    IVAPORC NUMERIC(9,2),
    IVAMONTO NUMERIC(18,2),
    CONSUMO NUMERIC(18,2),
    SUBTOTAL NUMERIC(18,2),
    TOTAL NUMERIC(18,2),
    LOTE VARCHAR(15),
    ANULADO CHAR(1),
    OBSITEM BLOB SUB_TYPE 0 SEGMENT SIZE 80)
AS
BEGIN
  /* DETERMINE LA TABLA A EXAMINAR */ /*$$IBE$$ 
  if (BIN_AND(TIPO, 1) <> 0) then
    BEGIN
    SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 11 INTO :NOMTIPO;
    FOR SELECT ENTR_ID, E.PREF_PRE, ENTR_NUMERO, ENTR_FECHA, ENTR_CONC, ENTR_REFER, E.BODE_COD, BODE_NOM, ENTR_NOMTERC, ENTR_OBS, ENTR_ANULADO
    FROM ENTRADAS E, BODEGA B, PREFIJOS PR
    WHERE E.BODE_COD = B.BODE_COD AND E.PREF_PRE >= :PREINI AND E.PREF_PRE <= :PREFIN AND ENTR_NUMERO >= :NUMINI AND ENTR_NUMERO <= :NUMFIN
     AND PR.PREF_PRE = E.PREF_PRE AND PR.TIDO_COD = 11 AND ((PR.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
    ORDER BY E.PREF_PRE, ENTR_NUMERO
    INTO :ID, :PREF, :NUMERO, :FECHA, :CONCEPTO, :REFER, :CODBODORI, :NOMBODORI, :NOMTERCERO, :OBS, :ANULADO
    DO
        BEGIN
        if ((:ANULADOS = 'S') or (:ANULADO = 'N')) then
            BEGIN
            if (anulado = 'S') then
             BEGIN
              ITEM = 0;
              ARTICULO = '';
              CODBAR = '';
              ARTIDES = '';
              CANT = 0;
              UNIDAD = '';
              BODITEM = '';
              lote = '';
              costo = 0;
              DTOPORC = 0;
              DTOMONTO = 0;
              IVAPORC = 0;
              IVAMONTO = 0;
              CONSUMO = 0;
              TOTAL = 0;
              OBSITEM = null;
              SUBTOTAL = 0;
              SUSPEND;
             END
            ELSE
             BEGIN
              if (DETALLE = 'S') then
                FOR SELECT ENDE_ITEM, A.ARTI_COD, ENDE_CODBAR, ENDE_DESC, ENDE_CANT, ENDE_UNIDAD, BODE_COD, ENDE_COSTO, ENDE_DTOPORC, ENDE_DTOMONTO, ENDE_IVAPORC, ENDE_IVAMONTO, ENDE_CONSUMO, ENDE_TOTAL, ENDE_LOTE, ENDE_OBS
                    FROM ENTRADAS_DETALLE D, ARTICULO A
                    WHERE D.ARTI_COD = A.ARTI_COD AND D.ENTR_ID = :ID
                    ORDER BY ENDE_ITEM
                    INTO :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :BODITEM, :COSTO, :DTOPORC, :DTOMONTO, :IVAPORC, :IVAMONTO, :CONSUMO, :TOTAL, :LOTE, :OBSITEM
                    DO
                    BEGIN
                    SUBTOTAL = TOTAL - IVAMONTO - CONSUMO;
                    SUSPEND;
                    END
              ELSE
                BEGIN
                SELECT SUM(ENDE_IVAMONTO), SUM(ENDE_CONSUMO), SUM(ENDE_TOTAL) FROM ENTRADAS_DETALLE D WHERE D.ENTR_ID = :ID INTO
                    :IVAMONTO, :CONSUMO, :TOTAL;
                SUBTOTAL = TOTAL - IVAMONTO - CONSUMO;
                SUSPEND;
                END
             END
            END
        END
    END
  if (BIN_AND(TIPO, 2) <> 0) then
    BEGIN
    SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 12 INTO :NOMTIPO;
    FOR SELECT SALI_ID, S.PREF_PRE, SALI_NUMERO, SALI_FECHA, SALI_CONC, SALI_REFER, S.BODE_COD, BODE_NOM, SALI_NOMTERC, SALI_OBS, SALI_ANULADO
    FROM SALIDAS S, BODEGA B, PREFIJOS PR
    WHERE S.BODE_COD = B.BODE_COD AND S.PREF_PRE >= :PREINI AND S.PREF_PRE <= :PREFIN AND SALI_NUMERO >= :NUMINI AND SALI_NUMERO <= :NUMFIN
     AND PR.PREF_PRE = S.PREF_PRE AND PR.TIDO_COD = 12 AND ((PR.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
    ORDER BY S.PREF_PRE, SALI_NUMERO
    into :ID, :PREF, :NUMERO, :FECHA, :CONCEPTO, :REFER, :CODBODORI, :NOMBODORI, :NOMTERCERO, :OBS, :ANULADO
    DO
        BEGIN
        if ((:ANULADOS = 'S') or (:ANULADO = 'N')) then
            BEGIN
            if (anulado = 'S') then
             BEGIN
              ITEM = 0;
              ARTICULO = '';
              CODBAR = '';
              ARTIDES = '';
              CANT = 0;
              UNIDAD = '';
              BODITEM = '';
              lote = '';
              costo = 0;
              DTOPORC = 0;
              DTOMONTO = 0;
              IVAPORC = 0;
              IVAMONTO = 0;
              CONSUMO = 0;
              TOTAL = 0;
              OBSITEM = null;
              SUBTOTAL = 0;
              SUSPEND;
             END
            ELSE
             BEGIN
              if (DETALLE = 'S') then
                FOR SELECT SADE_ITEM, A.ARTI_COD, SADE_CODBAR, SADE_DESC, SADE_CANT, SADE_UNIDAD, BODE_COD, SADE_COSTO, SADE_IVAPORC, SADE_IVAMONTO, SADE_CONSUMO, SADE_TOTAL, SADE_LOTE, SADE_OBS
                FROM SALIDAS_DETALLE D, ARTICULO A
                WHERE D.ARTI_COD = A.ARTI_COD AND D.SALI_ID = :ID
                ORDER BY SADE_ITEM
                INTO :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :BODITEM, :COSTO, :IVAPORC, :IVAMONTO, :CONSUMO, :TOTAL, :LOTE, :OBSITEM
                    DO
                BEGIN
                SUBTOTAL = TOTAL - IVAMONTO - CONSUMO;
                SUSPEND;
                END
              ELSE
                BEGIN
                SELECT SUM(SADE_IVAMONTO), SUM(SADE_CONSUMO), SUM(SADE_TOTAL) FROM SALIDAS_DETALLE D WHERE D.SALI_ID = :ID INTO
                    :IVAMONTO, :CONSUMO, :TOTAL;
                SUBTOTAL = TOTAL - IVAMONTO - CONSUMO;
                SUSPEND;
                END
             END
            END
        END
    END
  if (BIN_AND(TIPO, 4) <> 0) then
    BEGIN
    SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 13 INTO :NOMTIPO;
    FOR SELECT TRAN_ID, T.PREF_PRE, TRAN_NUMERO, TRAN_FECHA, TRAN_CONC, TRAN_REFER, T.BODE_COD, BO.BODE_NOM, TRAN_BODDES, BD.BODE_NOM, TRAN_OBS, TRAN_ANULADO
    FROM TRASFERENCIAS T, BODEGA BO, BODEGA BD, PREFIJOS PR
    WHERE T.BODE_COD = BO.BODE_COD AND T.TRAN_BODDES = BD.BODE_COD AND T.PREF_PRE >= :PREINI AND T.PREF_PRE <= :PREFIN AND TRAN_NUMERO >= :NUMINI AND TRAN_NUMERO <= :NUMFIN
     AND PR.PREF_PRE = T.PREF_PRE AND PR.TIDO_COD = 13 AND ((PR.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
    ORDER BY T.PREF_PRE, TRAN_NUMERO
    into :ID, :PREF, :NUMERO, :FECHA, :CONCEPTO, :REFER, :CODBODORI, :NOMBODORI, :CODBODDES, :NOMBODDES, :OBS, :ANULADO
    DO
        BEGIN
        if ((:ANULADOS = 'S') or (:ANULADO = 'N')) then
            BEGIN
            if (anulado = 'S') then
             BEGIN
              ITEM = 0;
              ARTICULO = '';
              CODBAR = '';
              ARTIDES = '';
              CANT = 0;
              UNIDAD = '';
              BODITEM = '';
              lote = '';
              costo = 0;
              DTOPORC = 0;
              DTOMONTO = 0;
              IVAPORC = 0;
              IVAMONTO = 0;
              CONSUMO = 0;
              TOTAL = 0;
              OBSITEM = null;
              SUBTOTAL = 0;
              SUSPEND;
             END
            ELSE
             BEGIN
              if (DETALLE = 'S') then
                FOR SELECT TRAS_ITEM, A.ARTI_COD, TRAS_CODBAR, TRAS_DESC, TRAS_CANT, TRAS_UNIDAD, TRAS_COSTO, TRAS_IVAPORC, TRAS_IVAMONTO, TRAS_CONSUMO, TRAS_TOTAL, TRAS_LOTE, TRAS_OBS
                FROM TRASFERENCIAS_DETALLE D, ARTICULO A
                WHERE D.ARTI_COD = A.ARTI_COD AND D.TRAN_ID = :ID
                ORDER BY TRAS_ITEM
                INTO :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :COSTO, :IVAPORC, :IVAMONTO, :CONSUMO, :TOTAL, :LOTE, :OBSITEM
                    DO
                    BEGIN
                    SUBTOTAL = TOTAL - IVAMONTO - CONSUMO;
                    SUSPEND;
                    END
              ELSE
                BEGIN
                SELECT SUM(TRAS_IVAMONTO), SUM(TRAS_CONSUMO), SUM(TRAS_TOTAL) FROM trasferencias_detalle D WHERE D.TRAN_ID = :ID INTO
                    :IVAMONTO, :CONSUMO, :TOTAL;
                SUBTOTAL = TOTAL - IVAMONTO - CONSUMO;
                SUSPEND;
                END
             END
            END
        END
    END
  if (BIN_AND(TIPO, 8) <> 0) then
    BEGIN
    SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 14 INTO :NOMTIPO;
    FOR SELECT AJUS_ID, A.PREF_PRE, AJUS_NUMERO, AJUS_FECHA, AJUS_CONC, A.BODE_COD, BODE_NOM, AJUS_OBS, AJUS_ANULADO
    FROM AJUSTES A, BODEGA B, PREFIJOS PR
    WHERE A.BODE_COD = B.BODE_COD AND A.PREF_PRE >= :PREINI AND A.PREF_PRE <= :PREFIN AND AJUS_NUMERO >= :NUMINI AND AJUS_NUMERO <= :NUMFIN
     AND PR.PREF_PRE = A.PREF_PRE AND PR.TIDO_COD = 14 AND ((PR.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
    ORDER BY A.PREF_PRE, AJUS_NUMERO
    into :ID, :PREF, :NUMERO, :FECHA, :CONCEPTO, :CODBODORI, :NOMBODORI, :OBS, :ANULADO
    DO
        BEGIN
        if ((:ANULADOS = 'S') or (:ANULADO = 'N')) then
            BEGIN
            if (anulado = 'S') then
             BEGIN
              ITEM = 0;
              ARTICULO = '';
              CODBAR = '';
              ARTIDES = '';
              CANT = 0;
              UNIDAD = '';
              BODITEM = '';
              lote = '';
              costo = 0;
              DTOPORC = 0;
              DTOMONTO = 0;
              IVAPORC = 0;
              IVAMONTO = 0;
              CONSUMO = 0;
              EXANT = 0;
              TOTAL = 0;
              OBSITEM = null;
              SUBTOTAL = 0;
              SUSPEND;
             END
            ELSE
             BEGIN
              if (DETALLE = 'S') then
                FOR SELECT AJUS_ITEM, A.ARTI_COD, AJUS_CODBAR, AJDE_DESC, AJUS_EXANT, AJUS_UNIDAD, BODE_COD, AJUS_EXNUE, AJUS_LOTE, AJDE_OBS
                FROM AJUSTES_DETALLE D, ARTICULO A
                WHERE D.ARTI_COD = A.ARTI_COD AND D.AJUS_ID = :ID
                ORDER BY AJUS_ITEM
                INTO :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :EXANT, :UNIDAD, :BODITEM, :CANT, :LOTE, :OBSITEM
                    DO
                      BEGIN
                      TOTAL = (CANT - EXANT) * COSTO;
                      SUBTOTAL = TOTAL;
                      SUSPEND;
                      END
              ELSE
                BEGIN
                TOTAL = 0;
                FOR SELECT ARTI_COD, AJUS_EXNUE, AJUS_EXANT FROM AJUSTES_DETALLE D WHERE D.AJUS_ID = :ID INTO
                    :ARTICULO, :CANT, :EXANT
                    DO
                      BEGIN
                      EXECUTE PROCEDURE COSTO_PROMEDIO(:ARTICULO, :FECHA) returning_values (:COSTO);
                      TOTAL = TOTAL + ((CANT - EXANT) * COSTO);
                      SUBTOTAL = TOTAL;
                      END
                SUSPEND;
                END
             END
            END
        END
    END
  if (BIN_AND(TIPO, 16) <> 0) then
    BEGIN
    SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 15 INTO :NOMTIPO;
    FOR SELECT ENSA_ID, E.PREF_PRE, ENSA_NUMERO, ENSA_FECHA, ENSA_CONC, ENSA_REFER, E.BODE_COD, BODE_NOM, ENSA_CODBAR, ENSA_DESC, ENSA_CANT, ENSA_UNIDAD, ENSA_LOTE, ENSA_OBS, ENSA_ANULADO
    FROM ENSAMBLES E, BODEGA B, PREFIJOS PR
    WHERE E.BODE_COD = B.BODE_COD AND E.PREF_PRE >= :PREINI AND E.PREF_PRE <= :PREFIN AND ENSA_NUMERO >= :NUMINI AND ENSA_NUMERO <= :NUMFIN
     AND PR.PREF_PRE = E.PREF_PRE AND PR.TIDO_COD = 15 AND ((PR.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
    ORDER BY E.PREF_PRE, ENSA_NUMERO
    into :ID, :PREF, :NUMERO, :FECHA, :CONCEPTO, :REFER, :CODBODORI, :NOMBODORI, :PRODCODBAR, :PRODDES, :PRODCANT, :PRODUNIDAD, :PRODLOTE, :OBS, :ANULADO
    DO
        BEGIN
        if ((:ANULADOS = 'S') or (:ANULADO = 'N')) then
            BEGIN
            if (anulado = 'S') then
             BEGIN
              ITEM = 0;
              ARTICULO = '';
              CODBAR = '';
              ARTIDES = '';
              CANT = 0;
              UNIDAD = '';
              BODITEM = '';
              lote = '';
              costo = 0;
              DTOPORC = 0;
              DTOMONTO = 0;
              IVAPORC = 0;
              IVAMONTO = 0;
              CONSUMO = 0;
              TOTAL = 0;
              OBSITEM = null;
              SUBTOTAL = 0;
              SUSPEND;
             END
            ELSE
             BEGIN
              if (DETALLE = 'S') then
                FOR SELECT ESDE_ITEM, A.ARTI_COD, ESDE_CODBAR, ESDE_DESC, ESDE_CANT, ESDE_UNIDAD, BODE_COD, ESDE_COSTO, ESDE_IVAPORC, ESDE_IVAMONTO, ESDE_CONSUMO, ESDE_TOTAL, ESDE_LOTE, ESDE_OBS
                FROM ensambles_detalle D, ARTICULO A
                WHERE D.ARTI_COD = A.ARTI_COD AND D.ENSA_ID = :ID
                ORDER BY ESDE_ITEM
                INTO :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :BODITEM, :COSTO, :IVAPORC, :IVAMONTO, :CONSUMO, :TOTAL, :LOTE, :OBSITEM
                    DO
                    BEGIN
                    SUBTOTAL = TOTAL - IVAMONTO - CONSUMO;
                    SUSPEND;
                    END
              ELSE
                BEGIN
                SELECT SUM(ESDE_IVAMONTO), SUM(ESDE_CONSUMO), SUM(ESDE_TOTAL) FROM ENSAMBLES_detalle D WHERE D.ENSA_ID = :ID INTO
                    :IVAMONTO, :CONSUMO, :TOTAL;
                SUBTOTAL = TOTAL - IVAMONTO - CONSUMO;
                SUSPEND;
                END
             END
            END
        END
    END
  if (BIN_AND(TIPO, 32) <> 0) then
    BEGIN
    SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 16 INTO :NOMTIPO;
    FOR SELECT DESE_ID, E.PREF_PRE, DESE_NUMERO, DESE_FECHA, DESE_CONC, DESE_REFER, E.BODE_COD, BODE_NOM, DESE_CODBAR, DESE_DESC, DESE_CANT, DESE_UNIDAD, DESE_LOTE, DESE_OBS, DESE_ANULADO
    FROM DESENSAMBLES E, BODEGA B, PREFIJOS PR
    WHERE E.BODE_COD = B.BODE_COD AND E.PREF_PRE >= :PREINI AND E.PREF_PRE <= :PREFIN AND DESE_NUMERO >= :NUMINI AND DESE_NUMERO <= :NUMFIN
     AND PR.PREF_PRE = E.PREF_PRE AND PR.TIDO_COD = 16 AND ((PR.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
    ORDER BY E.PREF_PRE, DESE_NUMERO
    into :ID, :PREF, :NUMERO, :FECHA, :CONCEPTO, :REFER, :CODBODORI, :NOMBODORI, :PRODCODBAR, :PRODDES, :PRODCANT, :PRODUNIDAD, :PRODLOTE, :OBS, :ANULADO
    DO
        BEGIN
        if ((:ANULADOS = 'S') or (:ANULADO = 'N')) then
            BEGIN
            if (anulado = 'S') then
             BEGIN
              ITEM = 0;
              ARTICULO = '';
              CODBAR = '';
              ARTIDES = '';
              CANT = 0;
              UNIDAD = '';
              BODITEM = '';
              lote = '';
              costo = 0;
              DTOPORC = 0;
              DTOMONTO = 0;
              IVAPORC = 0;
              IVAMONTO = 0;
              CONSUMO = 0;
              TOTAL = 0;
              OBSITEM = null;
              SUBTOTAL = 0;
              SUSPEND;
             END
            ELSE
             BEGIN
              if (DETALLE = 'S') then
                FOR SELECT DESE_ITEM, A.ARTI_COD, DEDE_CODBAR, DEDE_DESC, DEDE_CANT, DEDE_UNIDAD, BODE_COD, DEDE_COSTO, DEDE_IVAPORC, DEDE_IVAMONTO, DEDE_CONSUMO, DEDE_TOTAL, DEDE_LOTE, DEDE_OBS
                FROM DESensambles_detalle D, ARTICULO A
                WHERE D.ARTI_COD = A.ARTI_COD AND D.DESE_ID = :ID
                ORDER BY DESE_ITEM
                INTO
                    :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :BODITEM, :COSTO, :IVAPORC, :IVAMONTO, :CONSUMO, :TOTAL, :LOTE, :OBSITEM
                    DO
                    BEGIN
                    SUBTOTAL = TOTAL - IVAMONTO - CONSUMO;
                    SUSPEND;
                    END
              ELSE
                BEGIN
                SELECT SUM(DEDE_IVAMONTO), SUM(DEDE_CONSUMO), SUM(DEDE_TOTAL) FROM DESENSAMBLES_detalle D WHERE D.DESE_ID = :ID INTO
                    :IVAMONTO, :CONSUMO, :TOTAL;
                SUBTOTAL = TOTAL - IVAMONTO - CONSUMO;
                SUSPEND;
                END
             END
            END
        END
    END
  if (BIN_AND(TIPO, 64) <> 0) then
    BEGIN
    SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 17 INTO :NOMTIPO;
    FOR SELECT RESE_ID, R.PREF_PRE, RESE_NUMERO, RESE_FECHA, RESE_CONC, RESE_REFER, R.BODE_COD, BODE_NOM, RESE_NOMTERC, RESE_OBS, RESE_ANULADO
    FROM RESERVAS R, BODEGA B, PREFIJOS PR
    WHERE R.BODE_COD = B.BODE_COD AND R.PREF_PRE >= :PREINI AND R.PREF_PRE <= :PREFIN AND RESE_NUMERO >= :NUMINI AND RESE_NUMERO <= :NUMFIN
     AND PR.PREF_PRE = R.PREF_PRE AND PR.TIDO_COD = 17 AND ((PR.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
    ORDER BY R.PREF_PRE, RESE_NUMERO
    into :ID, :PREF, :NUMERO, :FECHA, :CONCEPTO, :REFER, :CODBODORI, :NOMBODORI, :NOMTERCERO, :OBS, :ANULADO
    DO
        BEGIN
        if ((:ANULADOS = 'S') or (:ANULADO = 'N')) then
            BEGIN
            if (anulado = 'S') then
             BEGIN
              ITEM = 0;
              ARTICULO = '';
              CODBAR = '';
              ARTIDES = '';
              CANT = 0;
              UNIDAD = '';
              BODITEM = '';
              lote = '';
              costo = 0;
              DTOPORC = 0;
              DTOMONTO = 0;
              IVAPORC = 0;
              IVAMONTO = 0;
              CONSUMO = 0;
              EXANT = 0;
              TOTAL = 0;
              OBSITEM = null;
              SUBTOTAL = 0;
              SUSPEND;
             END
            ELSE
             BEGIN
              if (DETALLE = 'S') then
                FOR SELECT RSDE_ITEM, A.ARTI_COD, RSDE_CODBAR, RSDE_DESC, RDSE_CANT, RSDE_UNIDAD, BODE_COD, RSDE_OBS
                FROM RESERVAS_DETALLE D, ARTICULO A
                WHERE D.ARTI_COD = A.ARTI_COD AND D.RESE_ID = :ID
                ORDER BY RSDE_ITEM
                INTO :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :BODITEM, :OBSITEM
                    DO
                    SUSPEND;
              ELSE
                BEGIN
                SELECT SUM(RDSE_CANT) FROM RESERVAS_detalle D WHERE D.RESE_ID = :ID INTO
                    :CANT;
                SUSPEND;
                END
             END
            END
        END
    END
  if (BIN_AND(TIPO, 128) <> 0) then
    BEGIN
    SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 18 INTO :NOMTIPO;
    FOR SELECT ORIN_ID, O.PREF_PRE, ORIN_NUMERO, ORIN_FECHA, ORIN_FECLLEGA, ORIN_CONC, ORIN_REFER, ORIN_NOMTERC, ORIN_OBS, ORIN_ANULADO
    FROM ORDENES_INVENTARIO O, PREFIJOS PR
    WHERE O.PREF_PRE >= :PREINI AND O.PREF_PRE <= :PREFIN AND ORIN_NUMERO >= :NUMINI AND ORIN_NUMERO <= :NUMFIN
     AND PR.PREF_PRE = O.PREF_PRE AND PR.TIDO_COD = 18 AND ((PR.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
    ORDER BY O.PREF_PRE, ORIN_NUMERO
    into :ID, :PREF, :NUMERO, :FECHA, :VENCE, :CONCEPTO, :REFER, :NOMTERCERO, :OBS, :ANULADO
    DO
        BEGIN
        if ((:ANULADOS = 'S') or (:ANULADO = 'N')) then
            BEGIN
            if (anulado = 'S') then
             BEGIN
              ITEM = 0;
              ARTICULO = '';
              CODBAR = '';
              ARTIDES = '';
              CANT = 0;
              UNIDAD = '';
              BODITEM = '';
              lote = '';
              costo = 0;
              DTOPORC = 0;
              DTOMONTO = 0;
              IVAPORC = 0;
              IVAMONTO = 0;
              CONSUMO = 0;
              EXANT = 0;
              TOTAL = 0;
              OBSITEM = null;
              SUBTOTAL = 0;
              SUSPEND;
             END
            ELSE
             BEGIN
              if (DETALLE = 'S') then
                FOR SELECT ORID_ITEM, A.ARTI_COD, ORID_CODBAR, ORID_DESC, ORID_CANT, ORID_UNIDAD, ORIN_COSTO, ORID_DTOPORC, ORID_DTOMONTO, ORID_IVAPORC, ORID_IVAMONTO, ORID_CONSUMO, ORID_TOTAL, ORID_OBS, ORID_LOTE
                FROM ORDENINVENTARIO_DETALLE D, ARTICULO A
                WHERE D.ARTI_COD = A.ARTI_COD AND D.ORIN_ID = :ID
                ORDER BY ORID_ITEM
                INTO :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :COSTO, :DTOPORC, :DTOMONTO, :IVAPORC, :IVAMONTO, :CONSUMO, :TOTAL, :OBSITEM, :LOTE
                    DO
                    BEGIN
                    SUBTOTAL = TOTAL - IVAMONTO - CONSUMO;
                    SUSPEND;
                    END
              ELSE
                BEGIN
                SELECT SUM(ORID_IVAMONTO), SUM(ORID_CONSUMO), SUM(ORID_TOTAL) FROM ordeninventario_detalle D WHERE D.ORIN_ID = :ID INTO
                    :IVAMONTO, :CONSUMO, :TOTAL;
                SUBTOTAL = TOTAL - IVAMONTO - CONSUMO;
                SUSPEND;
                END
             END
            END
        END
    END
 $$IBE$$*/ SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE REP_DISPONIBILIDAD(
    FECHA DATE,
    ARTINI VARCHAR(20),
    ARTFIN VARCHAR(20),
    GRPINI VARCHAR(3),
    GRPFIN VARCHAR(3),
    ORDEN CHAR(1),
    CEROS CHAR(1),
    DETALLE CHAR(1),
    AGRUPA CHAR(1),
    SUCURSAL INTEGER)
RETURNS (
    CODIGO VARCHAR(15),
    NOMBRE VARCHAR(60),
    UNIDAD VARCHAR(8),
    CODGRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    CODSUBG VARCHAR(3),
    NOMSUBG VARCHAR(30),
    CODMARC VARCHAR(3),
    NOMMARC VARCHAR(30),
    CODBOD VARCHAR(2),
    NOMBOD VARCHAR(30),
    EXIST NUMERIC(18,4),
    PROMEDIO NUMERIC(18,4),
    SALIDAS NUMERIC(18,4),
    DISPONIBILIDAD INTEGER,
    DIAS INTEGER,
    PROMEDIADO INTEGER,
    COSTO NUMERIC(18,2),
    COSTOPRO NUMERIC(18,2),
    SUGERIDO NUMERIC(18,4),
    FECCOMPRA DATE)
AS
DECLARE VARIABLE CODINI VARCHAR(20);
DECLARE VARIABLE CODFIN VARCHAR(20);
DECLARE VARIABLE DESINI VARCHAR(20);
DECLARE VARIABLE DESFIN VARCHAR(20);
DECLARE VARIABLE MARINI VARCHAR(20);
DECLARE VARIABLE MARFIN VARCHAR(20);
declare variable DIASC VARCHAR(255);
declare variable DIA_ART VARCHAR(2) CHARACTER SET NONE;
BEGIN /*$$IBE$$ 
if (ORDEN = 'C') then
    BEGIN
    CODINI = ARTINI;
    CODFIN = ARTFIN;
    DESINI = '';
    DESFIN = 'zz';
    END
ELSE
    BEGIN
    DESINI = ARTINI;
    DESFIN = ARTFIN;
    CODINI = '';
    CODFIN = 'zz';
    END
if (AGRUPA = 'G') then
    BEGIN
    MARINI = '';
    MARFIN = 'zz';
    END
ELSE
    if (AGRUPA = 'M') then
        BEGIN
        MARINI = GRPINI;
        MARFIN = GRPFIN;
        GRPINI = '';
        GRPFIN = 'zz';
        END
if (DETALLE = 'S') then
  BEGIN
  FOR SELECT ARTI_COD, ARTI_DES, ARTI_UNIDAD, ARTI_DIAS, A.GRUP_COD, GRUP_NOM, A.SUBG_COD, A.MARC_COD, BODE_COD, BODE_NOM, ARTI_DIANALIS
      FROM ARTICULO A, GRUPO G, BODEGA B
      WHERE ARTI_COD >= :CODINI AND ARTI_COD <= :CODFIN AND A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :GRPFIN AND ARTI_DES >= :DESINI AND ARTI_DES <= :DESFIN AND
      G.GRUP_COD = A.GRUP_COD AND A.ESAR_COD <> 'I' AND ((SUCU_ID = :SUCURSAL) or (:SUCURSAL = 0)) AND
      (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN)))
      INTO :CODIGO, :NOMBRE, :UNIDAD, :DIAS, :CODGRUPO, :NOMGRUPO, :CODSUBG, :CODMARC, :CODBOD, :NOMBOD, :PROMEDIADO
      DO
        BEGIN
        NOMMARC = '';
        NOMSUBG = '';
        SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO :NOMMARC;
        SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
        EXECUTE PROCEDURE ultimo_costo(:CODIGO, :FECHA, :UNIDAD) returning_values (:COSTO);
        EXECUTE PROCEDURE costo_promedio(:CODIGO, :FECHA) RETURNING_VALUES :costopro;
        EXECUTE PROCEDURE DISPONIBILIDAD_ARTICULO(CODIGO, FECHA, :CODBOD) returning_values (:DISPONIBILIDAD, :EXIST, :PROMEDIO, :SALIDAS);
         $$IBE$$*/ /*ESTABLECER CUAL ES EL VALOR DE DIAS PARA PROMEDIO*/ /*$$IBE$$ 
        EXECUTE PROCEDURE lee_configuracion ('INVENTARIO', 'EXISTENCIAS', 'PROMEDIAR LAS SALIDAS DEL INVENTARIO CON EL NUMERO DE DIAS ASIGNADO A CADA ARTICULO') returning_values (:DIA_ART);
        if (DIA_ART = 'NO') then
          BEGIN
            EXECUTE PROCEDURE lee_configuracion ('INVENTARIO', 'EXISTENCIAS', 'NUMERO DE DIAS PARA PROMEDIO DE SALIDAS POR ARTICULO') returning_values (DIASC);
            PROMEDIADO = CAST(DIASC AS INTEGER);
          END
        if ((DISPONIBILIDAD < DIAS) and (PROMEDIO > 0))then
            SUGERIDO = (DIAS * PROMEDIO) - EXIST;
        ELSE
            SUGERIDO = 0;
        SELECT MAX(FACO_FECHA) FROM FACTURAS_COMPRA F, FACTURAS_COMPRAS_DETALLE D
            WHERE F.FACO_ID = D.faco_id AND D.ARTI_COD = :CODIGO AND FACO_FECHA <= :FECHA AND D.bode_cod = :codbod
            INTO :FECCOMPRA;
        if ((PROMEDIO > 0) or (EXIST <> 0) or (CEROS = 'S')) then
            SUSPEND;
        END
  END
ELSE
  BEGIN
  FOR SELECT ARTI_COD, ARTI_DES, ARTI_UNIDAD, ARTI_DIAS, A.GRUP_COD, GRUP_NOM, A.SUBG_COD, A.MARC_COD, ARTI_DIANALIS
      FROM ARTICULO A, GRUPO G
      WHERE ARTI_COD >= :CODINI AND ARTI_COD <= :CODFIN AND A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :GRPFIN AND ARTI_DES >= :DESINI AND ARTI_DES <= :DESFIN AND G.GRUP_COD = A.GRUP_COD AND
      A.ESAR_COD <> 'I' AND (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN)))
      INTO :CODIGO, :NOMBRE, :UNIDAD, :DIAS, :CODGRUPO, :NOMGRUPO, :CODSUBG, :CODMARC, :PROMEDIADO
      DO
        BEGIN
        NOMMARC = '';
        NOMSUBG = '';
        SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO :NOMMARC;
        SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
        EXECUTE PROCEDURE costo_promedio(:CODIGO, :FECHA) RETURNING_VALUES :costopro;
        EXECUTE PROCEDURE ultimo_costo(:CODIGO, :FECHA, :UNIDAD) returning_values (:COSTO);
        EXECUTE PROCEDURE DISPONIBILIDAD_TOTAL_ARTICULO(CODIGO, FECHA) returning_values (:DISPONIBILIDAD, :EXIST, :PROMEDIO, :SALIDAS);
         $$IBE$$*/ /*ESTABLECER CUAL ES EL VALOR DE DIAS PARA PROMEDIO*/ /*$$IBE$$ 
        EXECUTE PROCEDURE lee_configuracion ('INVENTARIO', 'EXISTENCIAS', 'PROMEDIAR LAS SALIDAS DEL INVENTARIO CON EL NUMERO DE DIAS ASIGNADO A CADA ARTICULO') returning_values (:DIA_ART);
        if (DIA_ART = 'NO') then
          BEGIN
            EXECUTE PROCEDURE lee_configuracion ('INVENTARIO', 'EXISTENCIAS', 'NUMERO DE DIAS PARA PROMEDIO DE SALIDAS POR ARTICULO') returning_values (DIASC);
            PROMEDIADO = CAST(DIASC AS INTEGER);
          END
        if ((DISPONIBILIDAD < DIAS) and (PROMEDIO > 0))then
            SUGERIDO = (DIAS * PROMEDIO) - EXIST;
        ELSE
            SUGERIDO = 0;
        SELECT MAX(FACO_FECHA) FROM FACTURAS_COMPRA F, FACTURAS_COMPRAS_DETALLE D
            WHERE F.FACO_ID = D.faco_id AND D.ARTI_COD = :CODIGO AND FACO_FECHA <= :FECHA
            INTO :FECCOMPRA;
        if ((PROMEDIO > 0) or (EXIST <> 0) or (CEROS = 'S')) then
            SUSPEND;
        END
  END
 $$IBE$$*/ SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE REP_KARDEX_ARTICULO(
    DETALLE CHAR(1),
    FECINI DATE,
    FECFIN DATE,
    ARTINI VARCHAR(20),
    ARTFIN VARCHAR(20),
    GRPINI VARCHAR(2),
    GRPFIN VARCHAR(2),
    ORDEN CHAR(1),
    BODEGA VARCHAR(2))
RETURNS (
    CODIGO VARCHAR(15),
    NOMBRE VARCHAR(60),
    UNIDAD VARCHAR(8),
    CODGRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    CODSUBG VARCHAR(3),
    NOMSUBG VARCHAR(30),
    CODMARC VARCHAR(3),
    NOMMARC VARCHAR(30),
    CODBOD VARCHAR(2),
    SALDOINI NUMERIC(18,4),
    COSTOINI NUMERIC(18,2),
    ENTRADAS NUMERIC(18,4),
    COSTOENT NUMERIC(18,2),
    SALIDAS NUMERIC(18,4),
    COSTOSAL NUMERIC(18,2),
    SALDOFIN NUMERIC(18,4),
    COSTOFIN NUMERIC(18,2),
    TIPODOC VARCHAR(8),
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    CONCEPTO VARCHAR(60),
    NIT VARCHAR(20),
    CONS INTEGER,
    CANFINAL NUMERIC(18,4),
    COSFINAL NUMERIC(18,2))
AS
DECLARE VARIABLE ENTRADA CHAR(1);
DECLARE VARIABLE CANT NUMERIC(18,4);
DECLARE VARIABLE COSTO NUMERIC(18,2);
DECLARE VARIABLE CODINI VARCHAR(20);
DECLARE VARIABLE CODFIN VARCHAR(20);
DECLARE VARIABLE DESINI VARCHAR(20);
DECLARE VARIABLE DESFIN VARCHAR(20);
BEGIN /*$$IBE$$ 
if (ORDEN = 'C') then
    BEGIN
    CODINI = ARTINI;
    CODFIN = ARTFIN;
    DESINI = '';
    DESFIN = 'zz';
    END
ELSE
    BEGIN
    DESINI = ARTINI;
    DESFIN = ARTFIN;
    CODINI = '';
    CODFIN = 'zz';
    END
  FOR
    SELECT ARTI_COD, ARTI_DES, ARTI_UNIDAD, A.GRUP_COD, A.SUBG_COD, A.MARC_COD
      FROM ARTICULO A
      WHERE ARTI_COD >= :CODINI AND ARTI_COD <= :CODFIN AND A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :GRPFIN AND ARTI_DES >= :DESINI AND ARTI_DES <= :DESFIN AND A.ESAR_COD <> 'I'
      INTO :CODIGO, :NOMBRE, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
      DO
        BEGIN
        NOMMARC = '';
        NOMSUBG = '';
        SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
        SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
        SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
        if (BODEGA = '') then
            BEGIN
            EXECUTE PROCEDURE SALDO_INICIAL_TOTAL_INV(CODIGO, FECINI) returning_values (:SALDOINI);
            EXECUTE PROCEDURE VALOR_INICIAL_INVENTARIO(CODIGO, FECINI) returning_values (COSTOINI);
            END
        ELSE
            BEGIN
            EXECUTE PROCEDURE SALDO_INICIAL_INVENTARIO(CODIGO, FECINI, :BODEGA) returning_values (SALDOINI);
            EXECUTE PROCEDURE COSTO_PROMEDIO(CODIGO, FECINI-1) returning_values (COSTOINI);
            COSTOINI = COSTOINI * saldoini;
            END
        if (DETALLE = 'N') then
            BEGIN
             $$IBE$$*/ /* SUME LAS ENTRADAS */ /*$$IBE$$ 
            if (BODEGA = '') then
              SELECT SUM(COST_ENTC), SUM(COST_ENTP), SUM(COST_SALC), SUM(COST_SALP) FROM COSTOS
                WHERE (COST_FECHA >= :FECINI) AND (COST_FECHA <= :FECFIN) AND (ARTI_COD = :codigo)
                INTO :ENTRADAS, :COSTOENT, :SALIDAS, :COSTOSAL;
            ELSE
              SELECT SUM(COST_ENTC), SUM(COST_ENTP), SUM(COST_SALC), SUM(COST_SALP)
                FROM COSTOS C, MOVIMIENTO_ARTICULO M
                WHERE (COST_FECHA >= :FECINI) AND (COST_FECHA <= :FECFIN) AND (C.ARTI_COD = :codigo) AND C.cost_idmov = M.mvar_cons AND BODE_COD = :BODEGA
                INTO :ENTRADAS, :COSTOENT, :SALIDAS, :COSTOSAL;

            if (ENTRADAS IS NULL) then
              ENTRADAS = 0;
            if (COSTOENT IS NULL) then
              COSTOENT = 0;
            if (SALIDAS IS NULL) then
              SALIDAS = 0;
            if (COSTOSAL IS NULL) then
              COSTOSAL = 0;
            SALDOFIN = SALDOINI + ENTRADAS - SALIDAS;
            COSTOFIN = COSTOINI + COSTOENT - COSTOSAL;
            if (BODEGA = '') then
                BEGIN
                EXECUTE PROCEDURE SALDO_INICIAL_TOTAL_INV(CODIGO, fecfin+1) returning_values (canfinal);
                EXECUTE PROCEDURE VALOR_INICIAL_INVENTARIO(CODIGO, FECFIN+1) returning_values (cosfinal);
                END
            ELSE
                BEGIN
                EXECUTE PROCEDURE SALDO_INICIAL_INVENTARIO(CODIGO, FECFIN+1, :BODEGA) returning_values (CANFINAL);
                EXECUTE PROCEDURE COSTO_PROMEDIO(CODIGO, FECFIN+1) returning_values (COSFINAL);
                COSFINAL = COSFINAL * CANFINAL;
                END
            SUSPEND;
            END
        ELSE
            BEGIN
            SALDOFIN = SALDOINI;
            COSTOFIN = COSTOINI;
            COSTOENT = 0;
            COSTOSAL = 0;
            FOR SELECT TIDO_NOMCORTO, MVAR_ENTRADA, MVAR_PREF, MVAR_NUMERO, MVAR_CANT, MVAR_COSTO, MVAR_CONC, MVAR_FECHA, M.TERC_NIT, MVAR_CONS, BODE_COD, COST_SALDOP, COST_SALDOC
                FROM MOVIMIENTO_ARTICULO M, TIPO_DOCUMENTO TD, COSTOS C
                WHERE TD.TIDO_COD = MVAR_TIPODOC AND (MVAR_FECHA >= :FECINI) AND (MVAR_FECHA <= :FECFIN) AND (MVAR_TIPODOC <> 13) AND (m.ARTI_COD = :CODIGO) AND M.mvar_cons = C.cost_idmov
                ORDER BY MVAR_FECHA, MVAR_CONS
                INTO :TIPODOC, :ENTRADA, :PREFIJO, :NUMERO, :ENTRADAS, :COSTOENT, :CONCEPTO, :FECHA, :NIT, :CONS, :CODBOD, :costo, :cant
                DO
                    BEGIN
                    if (ENTRADA = 'S') then
                        BEGIN
                        SALIDAS = 0;
                        SALDOFIN = SALDOFIN + ENTRADAS;
                        COSTOFIN = COSTOFIN + (ENTRADAS * COSTOENT);
                        if (CANT > 0) then
                            COSTOSAL = COSTO / CANT;
                        else
                            COSTOSAL = 0;
                        end
                    ELSE
                        BEGIN
                        SALIDAS = ENTRADAS;
                        ENTRADAS = 0;
                        if (CANT > 0) then
                            COSTOSAL = COSTO / CANT;
                        else
                            COSTOSAL = 0;
                        SALDOFIN = SALDOFIN - SALIDAS;
                        COSTOFIN = COSTOFIN - (SALIDAS * costosal);
                        END
                    SUSPEND;
                    END
            END
        END
 $$IBE$$*/ SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE REP_PRODUCTOS(
    ORDEN CHAR(1),
    DESDE VARCHAR(15),
    HASTA VARCHAR(15),
    FECHA DATE)
RETURNS (
    CODIGO VARCHAR(15),
    DESCR VARCHAR(60),
    GRUPCOD VARCHAR(2),
    GRUPNOM VARCHAR(30),
    SUBGCOD VARCHAR(3),
    SUBGNOM VARCHAR(30),
    MARCCOD VARCHAR(3),
    MARCNOM VARCHAR(30),
    ESTADO CHAR(1),
    UNIDAD VARCHAR(8),
    CODCOMP VARCHAR(15),
    DESCOMP VARCHAR(60),
    CANT NUMERIC(18,4),
    UNDCOMP VARCHAR(8),
    CODBARCOMP VARCHAR(15),
    COSTO NUMERIC(18,2),
    TOTAL NUMERIC(18,2))
AS
BEGIN /*$$IBE$$ 
  FOR SELECT ARTI_COD, ARTI_DES, ARTI_UNIDAD, A.GRUP_COD, GRUP_NOM, A.SUBG_COD, A.MARC_COD, A.esar_cod
  FROM ARTICULO A, GRUPO G, estado_articulo E
  WHERE A.GRUP_COD = G.GRUP_COD AND A.ESAR_COD = E.ESAR_COD AND ARTI_COD IN (SELECT DISTINCT ARTI_COD FROM ARTICULOS_PRODUCTO)
  INTO :CODIGO, :DESCR, :unidad, :GRUPCOD, :GRUPNOM, :SUBGCOD, :MARCCOD, :ESTADO
  DO
    if ((ORDEN = 'C' AND CODIGO >= :DESDE AND CODIGO <= :HASTA) OR
        (ORDEN = 'D' AND DESCR >= :DESDE AND DESCR <= :HASTA)) then
        BEGIN
        SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :MARCCOD INTO MARCNOM;
        SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :SUBGCOD AND GRUP_COD = :GRUPCOD INTO :SUBGNOM;
        FOR SELECT ARPR_COMP, ARTI_DES, ARPR_CODBAR, ARPR_CANT, ARPR_UNIDAD
        FROM ARTICULOS_PRODUCTO P, ARTICULO A
        WHERE P.ARTI_COD = :CODIGO AND P.ARPR_COMP = A.ARTI_COD
          INTO :CODCOMP, :DESCOMP, :CODBARCOMP, :CANT, :UNDCOMP
          DO
            begin
            EXECUTE PROCEDURE COSTO_PROMEDIO (:CODCOMP, :FECHA) returning_values (:COSTO);
            EXECUTE PROCEDURE CANTIDAD_POR_FACTOR (:CODCOMP, :CANT, :UNDCOMP) returning_values (:CANT);
            TOTAL = COSTO * CANT;
            SUSPEND;
            END
        END
 $$IBE$$*/ SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE REP_UTILIDAD_CLIENTE(
    TIPO INTEGER,
    DETALLE CHAR(1),
    TERINI VARCHAR(20),
    TERFIN VARCHAR(20),
    FECINI DATE,
    FECFIN DATE,
    ARTINI VARCHAR(15),
    ARTFIN VARCHAR(15),
    ORDEN CHAR(1),
    CEROS CHAR(1),
    SUBEMPRESA INTEGER)
RETURNS (
    NIT VARCHAR(20),
    NOMBRE VARCHAR(60),
    TELEFONO VARCHAR(40),
    CIUDAD VARCHAR(40),
    CODZONA VARCHAR(2),
    NOMZONA VARCHAR(30),
    NOMTIPO VARCHAR(50),
    ARTICULO VARCHAR(15),
    DESCRIPCION VARCHAR(60),
    CODGRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    CODSUBG VARCHAR(3),
    NOMSUBG VARCHAR(30),
    CODMARC VARCHAR(3),
    NOMMARC VARCHAR(30),
    UNIDAD VARCHAR(8),
    CANTIDAD NUMERIC(18,4),
    BASE NUMERIC(18,2),
    IVA NUMERIC(18,2),
    COSTO NUMERIC(18,2),
    UTILIDAD NUMERIC(18,4),
    PORC NUMERIC(9,2),
    TOTAL NUMERIC(18,2),
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    DTO NUMERIC(9,2))
AS
DECLARE VARIABLE COSTOUNIT NUMERIC(18,4);
DECLARE VARIABLE CODINI VARCHAR(15);
DECLARE VARIABLE CODFIN VARCHAR(15);
DECLARE VARIABLE DESINI VARCHAR(15);
DECLARE VARIABLE DESFIN VARCHAR(15);
declare variable UOM VARCHAR(20);
declare variable NUMROWS INTEGER;
BEGIN /*$$IBE$$ 
if (ORDEN = 'C') then
    BEGIN
    CODINI = ARTINI;
    CODFIN = ARTFIN;
    DESINI = '';
    DESFIN = 'zz';
    END
ELSE
    BEGIN
    DESINI = ARTINI;
    DESFIN = ARTFIN;
    CODINI = '';
    CODFIN = 'zz';
    END
EXECUTE PROCEDURE lee_configuracion ('FACTURACION', 'ARTICULOS', 'SUGERIR PRECIOS CON PORCENTAJE DE MARGEN O UTILIDAD') returning_values (:UOM);
SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = :TIPO INTO :NOMTIPO;
if (DETALLE = 'N') then
    BEGIN
    if (BIN_AND(TIPO, 1) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 31 INTO :NOMTIPO;
         $$IBE$$*/ /* BORRA LA TABLA AUXILIAR */ /*$$IBE$$ 
        DELETE FROM reportes_aux WHERE REPA_ID = 3 AND REPA_USER = USER;

        FOR SELECT MAX(T.TERC_NIT), MAX(TERC_NOM), MAX(TERC_TEL), MAX(TERC_CIU), MAX(ZONA_COD), MAX(D.ARTI_COD), SUM(FADE_CANT * FADE_FACTOR), SUM(FACT_FACTOR*(FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO)),
            SUM(FACT_FACTOR*FADE_IVAMONTO), SUM(FACT_FACTOR*FADE_TOTAL),
            MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD), SUM(COST_SALP)
            FROM FACTURAS_DETALLE D, FACTURAS F, PREFIJOS P, terceros T, CLIENTES C, ARTICULO A, movimiento_articulo m, costos CO
            WHERE C.TERC_NIT = T.TERC_NIT AND TERC_CLIE = 'S' AND F.terc_nit = T.terc_nit AND T.TERC_NIT >= :TERINI AND T.TERC_NIT <= :TERFIN AND
            F.FACT_ID = D.FACT_ID AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND FACT_ANULADO = 'N'
            AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) and substring(D.arti_cod from 1 FOR 2) <> '.t'
            AND D.ARTI_COD = A.arti_cod AND A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN
            AND F.fact_id = M.mvar_idref AND M.mvar_tipodoc = 31 AND M.mvar_item = D.fade_item AND M.mvar_cons = CO.cost_idmov
            GROUP BY T.TERC_NIT, D.ARTI_COD
            INTO :NIT, :NOMBRE, :TELEFONO, :CIUDAD, :CODZONA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :TOTAL,
            :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :COSTO
            DO
            BEGIN
            SELECT ZONA_NOM FROM ZONAS WHERE ZONA_COD = :CODZONA INTO :NOMZONA;
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            if (CEROS = 'S') then
                INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (3, USER, :ARTICULO);
            SUSPEND;
            END  $$IBE$$*/ /* FOR */ /*$$IBE$$ 
        if (CEROS = 'S') then
            BEGIN
            COSTO = 0;
            UTILIDAD = 0;
            PORC = 0;
             $$IBE$$*/ /* agregue los articulos sin factura */ /*$$IBE$$ 
            FOR SELECT ARTI_COD, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN
                INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                DO
                BEGIN
                SELECT COUNT(REPA_ARTICULO) FROM REPORTES_AUX WHERE REPA_ID = 3 AND REPA_USER = USER AND REPA_ARTICULO = :articulo INTO :numrows;
                if (numrows = 0) then
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        END
    if (BIN_AND(TIPO, 2) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 32 INTO :NOMTIPO;
         $$IBE$$*/ /* BORRA LA TABLA AUXILIAR */ /*$$IBE$$ 
        DELETE FROM reportes_aux WHERE REPA_ID = 3 AND REPA_USER = USER;

        FOR SELECT MAX(T.TERC_NIT), MAX(TERC_NOM), MAX(TERC_TEL), MAX(TERC_CIU), MAX(ZONA_COD), MAX(D.ARTI_COD), SUM(RVDE_CANT * RVDE_FACTOR), SUM(RVDE_TOTAL-RVDE_IVAMONTO-RVDE_CONSUMO), SUM(RVDE_IVAMONTO), SUM(RVDE_TOTAL),
            MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD), SUM(COST_SALP)
            FROM REMISIONES_VENTA_DETALLE D, REMISIONES_VENTA R, PREFIJOS P, terceros T, CLIENTES C, ARTICULO A, movimiento_articulo m, costos CO
            WHERE C.TERC_NIT = T.TERC_NIT AND TERC_CLIE = 'S' AND R.terc_nit = T.terc_nit AND T.TERC_NIT >= :TERINI AND T.TERC_NIT <= :TERFIN AND
            R.REVT_ID = D.REVT_ID AND REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN AND REVT_ANULADO = 'N'
            AND P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = 32 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            AND D.ARTI_COD = A.arti_cod AND A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN
            AND R.revt_id = M.mvar_idref AND M.mvar_tipodoc = 32 AND M.mvar_item = D.rvde_item AND M.mvar_cons = CO.cost_idmov
            GROUP BY T.TERC_NIT, D.ARTI_COD
            INTO :NIT, :NOMBRE, :TELEFONO, :CIUDAD, :CODZONA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :TOTAL,
                :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :COSTO
            DO
                BEGIN
                SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                if (CANTIDAD IS NULL) then
                    CANTIDAD = 0;
                if (BASE IS NULL) then
                    BASE = 0;
                if (IVA IS NULL) then
                    IVA = 0;
                UTILIDAD = BASE - COSTO;
                if (UOM = 'UTILIDAD') then
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                else
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            if (CEROS = 'S') then
                INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (3, USER, :ARTICULO);
            SUSPEND;
            END  $$IBE$$*/ /* FOR */ /*$$IBE$$ 
        if (CEROS = 'S') then
            BEGIN
            COSTO = 0;
            UTILIDAD = 0;
            PORC = 0;
             $$IBE$$*/ /* agregue los articulos sin factura */ /*$$IBE$$ 
            FOR SELECT ARTI_COD, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN
                INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                DO
                BEGIN
                SELECT COUNT(REPA_ARTICULO) FROM REPORTES_AUX WHERE REPA_ID = 3 AND REPA_USER = USER AND REPA_ARTICULO = :articulo INTO :numrows;
                if (numrows = 0) then
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        END
    if (BIN_AND(TIPO, 4) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 33 INTO :NOMTIPO;
         $$IBE$$*/ /* BORRA LA TABLA AUXILIAR */ /*$$IBE$$ 
        DELETE FROM reportes_aux WHERE REPA_ID = 3 AND REPA_USER = USER;

        FOR SELECT MAX(T.TERC_NIT), MAX(TERC_NOM), MAX(TERC_TEL), MAX(TERC_CIU), MAX(ZONA_COD), MAX(D.ARTI_COD), SUM(DVDE_CANT * DVDE_FACTOR), SUM(DEVT_FACTOR*(DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO)),
            SUM(DEVT_FACTOR*DVDE_IVAMONTO), SUM(DEVT_FACTOR*DVDE_TOTAL),
            MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD), SUM(COST_ENTP)
            FROM devoluciones_ventas_detalle D, DEVOLUCIONES_VENTAS V, PREFIJOS P, terceros T, CLIENTES C, ARTICULO A, MOVIMIENTO_ARTICULO M, COSTOS CO
            WHERE C.TERC_NIT = T.TERC_NIT AND TERC_CLIE = 'S' AND V.terc_nit = T.terc_nit AND T.TERC_NIT >= :TERINI AND T.TERC_NIT <= :TERFIN AND
            V.DEVT_ID = D.DEVT_ID AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND DEVT_ANULADO = 'N'
            AND P.PREF_PRE = V.PREF_PRE AND P.TIDO_COD = 33 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) and substring(D.arti_cod from 1 FOR 2) <> '.t'
            AND D.ARTI_COD = A.arti_cod AND A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN
            AND V.devt_id = M.mvar_idref AND M.mvar_tipodoc = 33 AND M.mvar_item = D.dvde_item AND M.mvar_cons = CO.cost_idmov
            GROUP BY T.TERC_NIT, D.ARTI_COD
            INTO :NIT, :NOMBRE, :TELEFONO, :CIUDAD, :CODZONA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :TOTAL,
                :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :COSTO
            DO
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            TOTAL = TOTAL * -1;
            IVA = IVA * -1;
            BASE = BASE * -1;
            CANTIDAD = CANTIDAD * -1;
            COSTO = COSTO * -1;
            UTILIDAD = UTILIDAD * -1;
            if (CEROS = 'S') then
                INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (3, USER, :ARTICULO);
            SUSPEND;
            END  $$IBE$$*/ /* FOR */ /*$$IBE$$ 
        if (CEROS = 'S') then
            BEGIN
            COSTO = 0;
            UTILIDAD = 0;
            PORC = 0;
             $$IBE$$*/ /* agregue los articulos sin factura */ /*$$IBE$$ 
            FOR SELECT ARTI_COD, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN
                INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                DO
                BEGIN
                SELECT COUNT(REPA_ARTICULO) FROM REPORTES_AUX WHERE REPA_ID = 3 AND REPA_USER = USER AND REPA_ARTICULO = :articulo INTO :numrows;
                if (numrows = 0) then
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        END
    if (BIN_AND(TIPO, 8) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 34 INTO :NOMTIPO;
         $$IBE$$*/ /* BORRA LA TABLA AUXILIAR */ /*$$IBE$$ 
        DELETE FROM reportes_aux WHERE REPA_ID = 3 AND REPA_USER = USER;

        FOR SELECT MAX(T.TERC_NIT), MAX(TERC_NOM), MAX(TERC_TEL), MAX(TERC_CIU), MAX(ZONA_COD), MAX(ARTI_COD), SUM(PEDE_CANT * PEDE_FACTOR), SUM(PEDI_FACTOR*(PEDE_TOTAL-PEDE_IVAMONTO-PEDE_CONSUMO)),
            SUM(PEDI_FACTOR*PEDE_IVAMONTO), SUM(PEDI_FACTOR*PEDE_TOTAL)
            FROM PEDIDOS_DETALLE D, PEDIDOS P, PREFIJOS PR, terceros T, CLIENTES C
            WHERE C.TERC_NIT = T.TERC_NIT AND TERC_CLIE = 'S' AND P.terc_nit = T.terc_nit AND T.TERC_NIT >= :TERINI AND T.TERC_NIT <= :TERFIN AND
            P.PEDI_ID = D.PEDI_ID AND PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND PEDI_ANULADO = 'N'
            AND PR.PREF_PRE = P.PREF_PRE AND P.TIDO_COD = 34 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY T.TERC_NIT, ARTI_COD
            INTO :NIT, :NOMBRE, :TELEFONO, :CIUDAD, :CODZONA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :TOTAL
            DO
            BEGIN
            SELECT ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                FROM ARTICULO WHERE ARTI_COD = :ARTICULO
                INTO :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC;
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            EXECUTE PROCEDURE costo_promedio (:ARTICULO, :FECFIN) RETURNING_VALUES (:COSTOUNIT);
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            COSTO = CANTIDAD * COSTOUNIT;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            if (CEROS = 'S') then
                INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (3, USER, :ARTICULO);
            SUSPEND;
            END  $$IBE$$*/ /* FOR */ /*$$IBE$$ 
        if (CEROS = 'S') then
            BEGIN
            COSTO = 0;
            UTILIDAD = 0;
            PORC = 0;
             $$IBE$$*/ /* agregue los articulos sin factura */ /*$$IBE$$ 
            FOR SELECT ARTI_COD, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN
                INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                DO
                BEGIN
                SELECT COUNT(REPA_ARTICULO) FROM REPORTES_AUX WHERE REPA_ID = 3 AND REPA_USER = USER AND REPA_ARTICULO = :articulo INTO :numrows;
                if (numrows = 0) then
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        END
    if (BIN_AND(TIPO, 16) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 35 INTO :NOMTIPO;
         $$IBE$$*/ /* BORRA LA TABLA AUXILIAR */ /*$$IBE$$ 
        DELETE FROM reportes_aux WHERE REPA_ID = 3 AND REPA_USER = USER;

        FOR SELECT MAX(T.TERC_NIT), MAX(TERC_NOM), MAX(TERC_TEL), MAX(TERC_CIU), MAX(ZONA_COD), MAX(ARTI_COD), SUM(CTDE_CANT * CTDE_FACTOR), SUM(COTI_FACTOR*(CTDE_TOTAL-CTDE_IVAMONTO-CTDE_CONSUMO)),
            SUM(COTI_FACTOR*CTDE_IVAMONTO), SUM(COTI_FACTOR*CTDE_TOTAL)
            FROM COTIZACIONES_DETALLE D, COTIZACIONES CT, PREFIJOS P, terceros T, CLIENTES C
            WHERE C.TERC_NIT = T.TERC_NIT AND TERC_CLIE = 'S' AND C.terc_nit = T.terc_nit AND T.TERC_NIT >= :TERINI AND T.TERC_NIT <= :TERFIN AND
            CT.COTI_ID = D.COTI_ID AND COTI_FECHA >= :FECINI AND COTI_FECHA <= :FECFIN AND COTI_ANULADO = 'N'
            AND P.PREF_PRE = CT.PREF_PRE AND P.TIDO_COD = 35 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY T.TERC_NIT, ARTI_COD
            INTO :NIT, :NOMBRE, :TELEFONO, :CIUDAD, :CODZONA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :TOTAL
            DO
            BEGIN
            SELECT ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                FROM ARTICULO WHERE ARTI_COD = :ARTICULO
                INTO :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC;
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            EXECUTE PROCEDURE costo_promedio (:ARTICULO, :FECFIN) RETURNING_VALUES (:COSTOUNIT);
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            COSTO = CANTIDAD * COSTOUNIT;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            if (CEROS = 'S') then
                INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (3, USER, :ARTICULO);
            SUSPEND;
            END  $$IBE$$*/ /* FOR */ /*$$IBE$$ 
        if (CEROS = 'S') then
            BEGIN
            COSTO = 0;
            UTILIDAD = 0;
            PORC = 0;
             $$IBE$$*/ /* agregue los articulos sin factura */ /*$$IBE$$ 
            FOR SELECT ARTI_COD, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN
                INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                DO
                BEGIN
                SELECT COUNT(REPA_ARTICULO) FROM REPORTES_AUX WHERE REPA_ID = 3 AND REPA_USER = USER AND REPA_ARTICULO = :articulo INTO :numrows;
                if (numrows = 0) then
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        END
    END
ELSE
    BEGIN
    if (BIN_AND(TIPO, 1) <> 0) then
            BEGIN
            SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 31 INTO :NOMTIPO;
            FOR SELECT F.PREF_PRE, FACT_NUMERO, FACT_FECHA, ARTI_COD, FADE_CANT * FADE_FACTOR, (FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO)*FACT_FACTOR,
                FADE_IVAMONTO*FACT_FACTOR, FADE_DTOPORC, FADE_TOTAL*FACT_FACTOR, F.terc_nit, F.fact_nomcliente
                FROM FACTURAS F, FACTURAS_DETALLE D, PREFIJOS P
                WHERE F.FACT_ID = D.FACT_ID AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND F.TERC_NIT >= :TERINI AND F.TERC_NIT <= :TERFIN AND FACT_ANULADO = 'N'
                 AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) and substring(D.arti_cod from 1 FOR 2) <> '.t'
                ORDER BY f.terc_nit, ARTI_COD, FACT_FECHA, F.FACT_ID, FADE_ITEM
                INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :DTO, :TOTAL, :NIT, :nombre
                DO
                BEGIN
                SELECT ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO WHERE ARTI_COD = :ARTICULO
                    INTO :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC;
                SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                EXECUTE PROCEDURE costo_promedio (:ARTICULO, :FECHA) RETURNING_VALUES (:COSTOUNIT);
                COSTO = COSTOUNIT * CANTIDAD;
                UTILIDAD = BASE - COSTO;
                if (UOM = 'UTILIDAD') then
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                else
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
                SUSPEND;
                END
            END
    if (BIN_AND(TIPO, 2) <> 0) then
            BEGIN
            SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 32 INTO :NOMTIPO;
            FOR SELECT R.PREF_PRE, REVT_NUMERO, REVT_FECHA, ARTI_COD, RVDE_CANT * RVDE_FACTOR,
                (RVDE_TOTAL - RVDE_IVAMONTO), RVDE_IVAMONTO, RVDE_DTOPORC, RVDE_TOTAL, R.terc_nit, R.revt_nomterc
                FROM REMISIONES_VENTA R, REMISIONES_VENTA_DETALLE D, PREFIJOS P
                WHERE R.REVT_ID = D.REVT_ID AND REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN AND R.TERC_NIT >= :TERINI AND R.TERC_NIT <= :TERFIN AND REVT_ANULADO = 'N'
                 AND P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = 32 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                ORDER BY r.terc_nit, ARTI_COD, REVT_FECHA, R.REVT_ID, RVDE_ITEM
                INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :DTO, :TOTAL, :NIT, :nombre
                DO
                BEGIN
                SELECT ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO WHERE ARTI_COD = :ARTICULO
                    INTO :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC;
                SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                EXECUTE PROCEDURE costo_promedio (:ARTICULO, :FECHA) RETURNING_VALUES (:COSTOUNIT);
                COSTO = COSTOUNIT * CANTIDAD;
                UTILIDAD = BASE - COSTO;
                if (UOM = 'UTILIDAD') then
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                else
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
                SUSPEND;
                END
            END
    if (BIN_AND(TIPO, 4) <> 0) then
            BEGIN
            SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 33 INTO :NOMTIPO;
            FOR SELECT V.PREF_PRE, DEVT_NUMERO, DEVT_FECHA, ARTI_COD, DVDE_CANT * DVDE_FACTOR, (DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO)*DEVT_FACTOR,
                DVDE_IVAMONTO*DEVT_FACTOR, DVDE_DTOPORC, DVDE_TOTAL*DEVT_FACTOR, V.terc_nit, V.devt_nomterc
                FROM DEVOLUCIONES_VENTAS V, DEVOLUCIONES_VENTAS_DETALLE D, PREFIJOS P
                WHERE V.DEVT_ID = D.DEVT_ID AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND V.TERC_NIT >= :TERINI AND V.TERC_NIT <= :TERFIN AND DEVT_ANULADO = 'N'
                 AND P.PREF_PRE = V.PREF_PRE AND P.TIDO_COD = 33 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))  and substring(D.arti_cod from 1 FOR 2) <> '.t'
                ORDER BY v.terc_nit, ARTI_COD, DEVT_FECHA, D.DEVT_ID, DVDE_ITEM
                INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :DTO, :TOTAL, :NIT, :nombre
                DO
                BEGIN
                SELECT ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO WHERE ARTI_COD = :ARTICULO
                    INTO :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC;
                SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                EXECUTE PROCEDURE costo_promedio (:ARTICULO, :FECHA) RETURNING_VALUES (:COSTOUNIT);
                COSTO = COSTOUNIT * CANTIDAD;
                UTILIDAD = BASE - COSTO;
                if (UOM = 'UTILIDAD') then
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                else
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
                TOTAL = TOTAL * -1;
                IVA = IVA * -1;
                BASE = BASE * -1;
                CANTIDAD = CANTIDAD * -1;
                COSTO = COSTO * -1;
                UTILIDAD = UTILIDAD * -1;
                SUSPEND;
                END
            END
    if (BIN_AND(TIPO, 8) <> 0) then
            BEGIN
            SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 34 INTO :NOMTIPO;
            FOR SELECT P.PREF_PRE, PEDI_NUMERO, PEDI_FECHA, ARTI_COD, PEDE_CANT * PEDE_FACTOR, (PEDE_TOTAL-PEDE_IVAMONTO-PEDE_CONSUMO)*PEDI_FACTOR,
                PEDE_IVAMONTO*PEDI_FACTOR, PEDE_DTOPORC, PEDE_TOTAL*PEDI_FACTOR, P.terc_nit, P.pedi_nomterc
                FROM PEDIDOS P, PEDIDOS_DETALLE D, PREFIJOS PR
                WHERE P.PEDI_ID = D.PEDI_ID AND PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND P.TERC_NIT >= :TERINI AND P.TERC_NIT <= :TERFIN AND PEDI_ANULADO = 'N'
                 AND P.PREF_PRE = PR.PREF_PRE AND P.TIDO_COD = 34 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                ORDER BY p.terc_nit, ARTI_COD, PEDI_FECHA, P.PEDI_ID, PEDE_ITEM
                INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :DTO, :TOTAL, :NIT, :nombre
                DO
                BEGIN
                SELECT ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO WHERE ARTI_COD = :ARTICULO
                    INTO :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC;
                SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                EXECUTE PROCEDURE costo_promedio (:ARTICULO, :FECHA) RETURNING_VALUES (:COSTOUNIT);
                COSTO = COSTOUNIT * CANTIDAD;
                UTILIDAD = BASE - COSTO;
                if (UOM = 'UTILIDAD') then
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                else
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
                SUSPEND;
                END
            END
    if (BIN_AND(TIPO, 16) <> 0) then
            BEGIN
            SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 35 INTO :NOMTIPO;
            FOR SELECT C.PREF_PRE, COTI_NUMERO, COTI_FECHA, ARTI_COD, CTDE_CANT * CTDE_FACTOR, (CTDE_TOTAL-CTDE_IVAMONTO-CTDE_CONSUMO)*COTI_FACTOR,
                CTDE_IVAMONTO*COTI_FACTOR, CTDE_DTOPORC, CTDE_TOTAL*COTI_FACTOR, C.terc_nit, C.coti_nomterc
                FROM COTIZACIONES C, COTIZACIONES_DETALLE D, PREFIJOS P
                WHERE C.COTI_ID = D.COTI_ID AND ARTI_COD = :ARTICULO AND COTI_FECHA >= :FECINI AND COTI_FECHA <= :FECFIN AND C.TERC_NIT >= :TERINI AND C.TERC_NIT <= :TERFIN AND COTI_ANULADO = 'N'
                 AND P.PREF_PRE = C.PREF_PRE AND P.TIDO_COD = 35 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                ORDER BY c.terc_nit, COTI_FECHA, C.COTI_ID, CTDE_ITEM
                INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :DTO, :TOTAL, :NIT, :nombre
                DO
                BEGIN
                SELECT ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO WHERE ARTI_COD = :ARTICULO
                    INTO :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC;
                SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                EXECUTE PROCEDURE costo_promedio (:ARTICULO, :FECHA) RETURNING_VALUES (:COSTOUNIT);
                COSTO = COSTOUNIT * CANTIDAD;
                UTILIDAD = BASE - COSTO;
                if (UOM = 'UTILIDAD') then
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                else
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
                SUSPEND;
                END
            END
    END
 $$IBE$$*/ SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE REP_UTILIDAD_VENDEDOR(
    TIPO INTEGER,
    DETALLE CHAR(1),
    VENINI VARCHAR(20),
    VENFIN VARCHAR(20),
    FECINI DATE,
    FECFIN DATE,
    ARTINI VARCHAR(15),
    ARTFIN VARCHAR(15),
    ORDEN CHAR(1),
    CEROS CHAR(1),
    SUBEMPRESA INTEGER)
RETURNS (
    CODVEND VARCHAR(20),
    NOMVEND VARCHAR(60),
    NOMTIPO VARCHAR(50),
    ARTICULO VARCHAR(15),
    DESCRIPCION VARCHAR(60),
    CODGRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    CODSUBG VARCHAR(3),
    NOMSUBG VARCHAR(30),
    CODMARC VARCHAR(3),
    NOMMARC VARCHAR(30),
    UNIDAD VARCHAR(8),
    CANTIDAD NUMERIC(18,4),
    BASE NUMERIC(18,2),
    IVA NUMERIC(18,2),
    CONSUMO NUMERIC(18,2),
    COSTO NUMERIC(18,2),
    UTILIDAD NUMERIC(18,4),
    PORC NUMERIC(9,2),
    TOTAL NUMERIC(18,2),
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    DTO NUMERIC(9,2))
AS
DECLARE VARIABLE COSTOUNIT NUMERIC(18,4);
DECLARE VARIABLE CODINI VARCHAR(15);
DECLARE VARIABLE CODFIN VARCHAR(15);
DECLARE VARIABLE DESINI VARCHAR(15);
DECLARE VARIABLE DESFIN VARCHAR(15);
declare variable UOM VARCHAR(20);
BEGIN /*$$IBE$$ 
if (ORDEN = 'C') then
    BEGIN
    CODINI = ARTINI;
    CODFIN = ARTFIN;
    DESINI = '';
    DESFIN = 'zz';
    END
ELSE
    BEGIN
    DESINI = ARTINI;
    DESFIN = ARTFIN;
    CODINI = '';
    CODFIN = 'zz';
    END
  EXECUTE PROCEDURE lee_configuracion ('FACTURACION', 'ARTICULOS', 'SUGERIR PRECIOS CON PORCENTAJE DE MARGEN O UTILIDAD') returning_values (:UOM);
  SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = :TIPO INTO :NOMTIPO;
  FOR select VEND_COD, VEND_NOMBRE
    from VENDEDORES
    where VEND_COD >= :VENINI AND VEND_COD <= :VENFIN
    INTO :CODVEND, :NOMVEND
    DO  
    BEGIN
    if (DETALLE = 'N') then
        BEGIN
        if (BIN_AND(TIPO, 1) <> 0) then
            BEGIN
            SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 31 INTO :NOMTIPO;
             $$IBE$$*/ /* BORRA LA TABLA AUXILIAR */ /*$$IBE$$ 
            DELETE FROM reportes_aux WHERE REPA_ID = 4 AND REPA_USER = USER;
            FOR SELECT MAX(D.ARTI_COD), SUM(FADE_CANT * FADE_FACTOR), SUM(FACT_FACTOR*(FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO)),
                SUM(FACT_FACTOR*FADE_IVAMONTO), SUM(FACT_FACTOR*FADE_TOTAL), SUM(FADE_CONSUMO),
                MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD), SUM(COST_SALP)
                FROM FACTURAS_DETALLE D, FACTURAS F, PREFIJOS P, ARTICULO A, movimiento_articulo m, costos c
                WHERE F.FACT_ID = D.FACT_ID AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND VEND_COD = :CODVEND AND FACT_ANULADO = 'N'
                 AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) and substring(D.arti_cod from 1 FOR 2) <> '.t'
                 AND D.ARTI_COD = A.arti_cod AND A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN
                 AND F.fact_id = M.mvar_idref AND M.mvar_tipodoc = 31 AND M.mvar_item = D.fade_item AND M.mvar_cons = C.cost_idmov
                GROUP BY D.ARTI_COD
                INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :TOTAL, :CONSUMO,
                    :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :COSTO
                DO
                BEGIN
                SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                if (CANTIDAD IS NULL) then
                    CANTIDAD = 0;
                if (BASE IS NULL) then
                    BASE = 0;
                if (IVA IS NULL) then
                    IVA = 0;
                UTILIDAD = BASE - COSTO;
                if (UOM = 'UTILIDAD') then
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                else
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
                if (CEROS = 'S') then
                    begin
                    INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (4, USER, :ARTICULO);
                    SUSPEND;
                    end
                ELSE
                    if ((BASE <> 0) AND (CANTIDAD <> 0)) then
                        SUSPEND;
                END
            if (CEROS = 'S') then
                BEGIN
                COSTO = 0;
                UTILIDAD = 0;
                PORC = 0;
                 $$IBE$$*/ /* agregue los articulos sin factura */ /*$$IBE$$ 
                FOR SELECT ARTI_COD, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN and
                    not exists (select REPA_ARTICULO FROM REPORTES_AUX WHERE REPA_ID = 4 AND REPA_USER = USER AND REPA_ARTICULO = a.arti_cod)
                    INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                    DO
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        if (BIN_AND(TIPO, 2) <> 0) then
            BEGIN
            SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 32 INTO :NOMTIPO;
            FOR SELECT MAX(D.ARTI_COD), SUM(RVDE_CANT * RVDE_FACTOR), SUM(RVDE_TOTAL-RVDE_IVAMONTO-RVDE_CONSUMO), SUM(RVDE_IVAMONTO), SUM(RVDE_TOTAL), SUM(RVDE_CONSUMO),
                MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD), SUM(COST_SALP)
                FROM REMISIONES_VENTA_DETALLE D, REMISIONES_VENTA R, PREFIJOS P, ARTICULO A, movimiento_articulo m, costos c
                WHERE R.REVT_ID = D.REVT_ID AND REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN AND VEND_COD = :CODVEND AND REVT_ANULADO = 'N'
                 AND P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = 32 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                 AND D.ARTI_COD = A.arti_cod AND A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN
                 AND r.revt_id = M.mvar_idref AND M.mvar_tipodoc = 32 AND M.mvar_item = D.rvde_item AND M.mvar_cons = C.cost_idmov
                GROUP BY D.ARTI_COD
                INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :TOTAL, :CONSUMO,
                    :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :COSTO
                DO
                BEGIN
                SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                if (CANTIDAD IS NULL) then
                    CANTIDAD = 0;
                if (BASE IS NULL) then
                    BASE = 0;
                if (IVA IS NULL) then
                    IVA = 0;
                UTILIDAD = BASE - COSTO;
                if (UOM = 'UTILIDAD') then
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                else
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
                if (CEROS = 'S') then
                    begin
                    INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (4, USER, :ARTICULO);
                    SUSPEND;
                    end
                ELSE
                    if ((BASE <> 0) AND (CANTIDAD <> 0)) then
                        SUSPEND;
                END
            if (CEROS = 'S') then
                BEGIN
                COSTO = 0;
                UTILIDAD = 0;
                PORC = 0;
                 $$IBE$$*/ /* agregue los articulos sin factura */ /*$$IBE$$ 
                FOR SELECT ARTI_COD, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN and
                    not exists (select REPA_ARTICULO FROM REPORTES_AUX WHERE REPA_ID = 4 AND REPA_USER = USER AND REPA_ARTICULO = a.arti_cod)
                    INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                    DO
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        if (BIN_AND(TIPO, 4) <> 0) then
            BEGIN
            SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 33 INTO :NOMTIPO;
            FOR SELECT MAX(D.ARTI_COD), SUM(DVDE_CANT * DVDE_FACTOR), SUM(DEVT_FACTOR*(DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO)),
                SUM(DEVT_FACTOR*DVDE_IVAMONTO), SUM(DEVT_FACTOR*DVDE_TOTAL), SUM(DVDE_CONSUMO),
                MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD), SUM(COST_ENTP)
                FROM devoluciones_ventas_detalle D, DEVOLUCIONES_VENTAS V, PREFIJOS P, ARTICULO A, MOVIMIENTO_ARTICULO M, COSTOS C
                WHERE V.DEVT_ID = D.DEVT_ID AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND VEND_COD = :CODVEND AND DEVT_ANULADO = 'N'
                 AND P.PREF_PRE = V.PREF_PRE AND P.TIDO_COD = 33 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) and substring(D.arti_cod from 1 FOR 2) <> '.t'
                 AND D.ARTI_COD = A.arti_cod AND A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN
                 AND V.devt_id = M.mvar_idref AND M.mvar_tipodoc = 33 AND M.mvar_item = D.dvde_item AND M.mvar_cons = C.cost_idmov
                GROUP BY D.ARTI_COD
                INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :TOTAL, :CONSUMO,
                    :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :COSTO
                DO
                BEGIN
                SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                if (CANTIDAD IS NULL) then
                    CANTIDAD = 0;
                if (BASE IS NULL) then
                    BASE = 0;
                if (IVA IS NULL) then
                    IVA = 0;
                UTILIDAD = BASE - COSTO;
                if (UOM = 'UTILIDAD') then
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                else
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
                TOTAL = TOTAL * -1;
                IVA = IVA * -1;
                BASE = BASE * -1;
                CANTIDAD = CANTIDAD * -1;
                COSTO = COSTO * -1;
                UTILIDAD = UTILIDAD * -1;
                if (CEROS = 'S') then
                    begin
                    INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (4, USER, :ARTICULO);
                    SUSPEND;
                    end
                ELSE
                    if ((BASE <> 0) AND (CANTIDAD <> 0)) then
                        SUSPEND;
                END
            if (CEROS = 'S') then
                BEGIN
                COSTO = 0;
                UTILIDAD = 0;
                PORC = 0;
                 $$IBE$$*/ /* agregue los articulos sin factura */ /*$$IBE$$ 
                FOR SELECT ARTI_COD, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN and
                    not exists (select REPA_ARTICULO FROM REPORTES_AUX WHERE REPA_ID = 4 AND REPA_USER = USER AND REPA_ARTICULO = a.arti_cod)
                    INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                    DO
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        if (BIN_AND(TIPO, 8) <> 0) then
            BEGIN
            SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 34 INTO :NOMTIPO;
            FOR SELECT MAX(ARTI_COD), SUM(PEDE_CANT * PEDE_FACTOR), SUM(PEDI_FACTOR*(PEDE_TOTAL-PEDE_IVAMONTO-PEDE_CONSUMO)),
                SUM(PEDI_FACTOR*PEDE_IVAMONTO), SUM(PEDI_FACTOR*PEDE_TOTAL), SUM(PEDE_CONSUMO)
                FROM PEDIDOS_DETALLE D, PEDIDOS P, PREFIJOS PR
                WHERE P.PEDI_ID = D.PEDI_ID AND PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND VEND_COD = :CODVEND AND PEDI_ANULADO = 'N'
                 AND PR.PREF_PRE = P.PREF_PRE AND P.TIDO_COD = 34 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                GROUP BY ARTI_COD
                INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :TOTAL, :CONSUMO
                DO
                BEGIN
                SELECT ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO WHERE ARTI_COD = :ARTICULO
                    INTO :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC;
                SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                EXECUTE PROCEDURE costo_promedio (:ARTICULO, :FECFIN) RETURNING_VALUES (:COSTOUNIT);
                if (CANTIDAD IS NULL) then
                    CANTIDAD = 0;
                if (BASE IS NULL) then
                    BASE = 0;
                if (IVA IS NULL) then
                    IVA = 0;
                COSTO = CANTIDAD * COSTOUNIT;
                UTILIDAD = BASE - COSTO;
                if (UOM = 'UTILIDAD') then
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                else
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
                if (CEROS = 'S') then
                    begin
                    INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (4, USER, :ARTICULO);
                    SUSPEND;
                    end
                ELSE
                    if ((BASE <> 0) AND (CANTIDAD <> 0)) then
                        SUSPEND;
                END
            if (CEROS = 'S') then
                BEGIN
                COSTO = 0;
                UTILIDAD = 0;
                PORC = 0;
                 $$IBE$$*/ /* agregue los articulos sin factura */ /*$$IBE$$ 
                FOR SELECT ARTI_COD, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN and
                    not exists (select REPA_ARTICULO FROM REPORTES_AUX WHERE REPA_ID = 4 AND REPA_USER = USER AND REPA_ARTICULO = a.arti_cod)
                    INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                    DO
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        if (BIN_AND(TIPO, 16) <> 0) then
            BEGIN
            SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 35 INTO :NOMTIPO;
            FOR SELECT MAX(ARTI_COD), SUM(CTDE_CANT * CTDE_FACTOR), SUM(COTI_FACTOR*(CTDE_TOTAL-CTDE_IVAMONTO-CTDE_CONSUMO)),
                SUM(COTI_FACTOR*CTDE_IVAMONTO), SUM(COTI_FACTOR*CTDE_TOTAL), SUM(CTDE_CONSUMO)
                FROM COTIZACIONES_DETALLE D, COTIZACIONES C, PREFIJOS P
                WHERE C.COTI_ID = D.COTI_ID AND COTI_FECHA >= :FECINI AND COTI_FECHA <= :FECFIN AND VEND_COD = :CODVEND AND COTI_ANULADO = 'N'
                 AND P.PREF_PRE = C.PREF_PRE AND P.TIDO_COD = 35 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                GROUP BY ARTI_COD
                INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :TOTAL, :CONSUMO
                DO
                BEGIN
                SELECT ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO WHERE ARTI_COD = :ARTICULO
                    INTO :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC;
                SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                EXECUTE PROCEDURE costo_promedio (:ARTICULO, :FECFIN) RETURNING_VALUES (:COSTOUNIT);
                if (CANTIDAD IS NULL) then
                    CANTIDAD = 0;
                if (BASE IS NULL) then
                    BASE = 0;
                if (IVA IS NULL) then
                    IVA = 0;
                COSTO = CANTIDAD * COSTOUNIT;
                UTILIDAD = BASE - COSTO;
                if (UOM = 'UTILIDAD') then
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                else
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
                if (CEROS = 'S') then
                    begin
                    INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (4, USER, :ARTICULO);
                    SUSPEND;
                    end
                ELSE
                    if ((BASE <> 0) AND (CANTIDAD <> 0)) then
                        SUSPEND;
                END
            if (CEROS = 'S') then
                BEGIN
                COSTO = 0;
                UTILIDAD = 0;
                PORC = 0;
                 $$IBE$$*/ /* agregue los articulos sin factura */ /*$$IBE$$ 
                FOR SELECT ARTI_COD, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN and
                    not exists (select REPA_ARTICULO FROM REPORTES_AUX WHERE REPA_ID = 4 AND REPA_USER = USER AND REPA_ARTICULO = a.arti_cod)
                    INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                    DO
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        END
    ELSE
        BEGIN
        if (BIN_AND(TIPO, 1) <> 0) then
            BEGIN
            SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 31 INTO :NOMTIPO;
            FOR SELECT F.PREF_PRE, FACT_NUMERO, FACT_FECHA, ARTI_COD, FADE_CANT * FADE_FACTOR, (FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO)*FACT_FACTOR,
                FADE_IVAMONTO*FACT_FACTOR, FADE_DTOPORC, FADE_TOTAL*FACT_FACTOR, FADE_CONSUMO
                FROM FACTURAS F, FACTURAS_DETALLE D, PREFIJOS P
                WHERE F.FACT_ID = D.FACT_ID AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND VEND_COD = :CODVEND AND FACT_ANULADO = 'N'
                 AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) and substring(D.arti_cod from 1 FOR 2) <> '.t'
                ORDER BY ARTI_COD, FACT_FECHA, F.FACT_ID, FADE_ITEM
                INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :DTO, :TOTAL, :CONSUMO
                DO
                BEGIN
                SELECT ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO WHERE ARTI_COD = :ARTICULO
                    INTO :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC;
                SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                EXECUTE PROCEDURE costo_promedio (:ARTICULO, :FECHA) RETURNING_VALUES (:COSTOUNIT);
                COSTO = COSTOUNIT * CANTIDAD;
                UTILIDAD = BASE - COSTO;
                if (UOM = 'UTILIDAD') then
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                else
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
                if (CEROS = 'S') then
                    INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (4, USER, :ARTICULO);
                SUSPEND;
                END
            if (CEROS = 'S') then
                BEGIN
                COSTO = 0;
                UTILIDAD = 0;
                PORC = 0;
                 $$IBE$$*/ /* agregue los articulos sin factura */ /*$$IBE$$ 
                FOR SELECT ARTI_COD, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN and
                    not exists (select REPA_ARTICULO FROM REPORTES_AUX WHERE REPA_ID = 4 AND REPA_USER = USER AND REPA_ARTICULO = a.arti_cod)
                    INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                    DO
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        if (BIN_AND(TIPO, 2) <> 0) then
            BEGIN
            SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 32 INTO :NOMTIPO;
            FOR SELECT R.PREF_PRE, REVT_NUMERO, REVT_FECHA, ARTI_COD, RVDE_CANT * RVDE_FACTOR, (RVDE_TOTAL - RVDE_IVAMONTO), RVDE_IVAMONTO, RVDE_DTOPORC, RVDE_TOTAL, RVDE_CONSUMO
                FROM REMISIONES_VENTA R, REMISIONES_VENTA_DETALLE D, PREFIJOS P
                WHERE R.REVT_ID = D.REVT_ID AND REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN AND VEND_COD = :CODVEND AND REVT_ANULADO = 'N'
                 AND P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = 32 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) and substring(D.arti_cod from 1 FOR 2) <> '.t'
                ORDER BY ARTI_COD, REVT_FECHA, R.REVT_ID, RVDE_ITEM
                INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :DTO, :TOTAL, :CONSUMO
                DO
                BEGIN
                SELECT ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO WHERE ARTI_COD = :ARTICULO
                    INTO :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC;
                SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                EXECUTE PROCEDURE costo_promedio (:ARTICULO, :FECHA) RETURNING_VALUES (:COSTOUNIT);
                COSTO = COSTOUNIT * CANTIDAD;
                UTILIDAD = BASE - COSTO;
                if (UOM = 'UTILIDAD') then
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                else
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
                if (CEROS = 'S') then
                    INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (4, USER, :ARTICULO);
                SUSPEND;
                END
            if (CEROS = 'S') then
                BEGIN
                COSTO = 0;
                UTILIDAD = 0;
                PORC = 0;
                 $$IBE$$*/ /* agregue los articulos sin factura */ /*$$IBE$$ 
                FOR SELECT ARTI_COD, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN and
                    not exists (select REPA_ARTICULO FROM REPORTES_AUX WHERE REPA_ID = 4 AND REPA_USER = USER AND REPA_ARTICULO = a.arti_cod)
                    INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                    DO
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        if (BIN_AND(TIPO, 4) <> 0) then
            BEGIN
            SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 33 INTO :NOMTIPO;
            FOR SELECT V.PREF_PRE, DEVT_NUMERO, DEVT_FECHA, ARTI_COD, DVDE_CANT * DVDE_FACTOR, (DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO)*DEVT_FACTOR,
                DVDE_IVAMONTO*DEVT_FACTOR, DVDE_DTOPORC, DVDE_TOTAL*DEVT_FACTOR, DVDE_CONSUMO
                FROM DEVOLUCIONES_VENTAS V, DEVOLUCIONES_VENTAS_DETALLE D, PREFIJOS P
                WHERE V.DEVT_ID = D.DEVT_ID AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND VEND_COD = :CODVEND AND DEVT_ANULADO = 'N'
                 AND P.PREF_PRE = V.PREF_PRE AND P.TIDO_COD = 33 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) and substring(D.arti_cod from 1 FOR 2) <> '.t'
                ORDER BY ARTI_COD, DEVT_FECHA, D.DEVT_ID, DVDE_ITEM
                INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :DTO, :TOTAL, :CONSUMO
                DO
                BEGIN
                SELECT ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO WHERE ARTI_COD = :ARTICULO
                    INTO :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC;
                SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                EXECUTE PROCEDURE costo_promedio (:ARTICULO, :FECHA) RETURNING_VALUES (:COSTOUNIT);
                COSTO = COSTOUNIT * CANTIDAD;
                UTILIDAD = BASE - COSTO;
                if (UOM = 'UTILIDAD') then
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                else
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
                TOTAL = TOTAL * -1;
                IVA = IVA * -1;
                BASE = BASE * -1;
                CANTIDAD = CANTIDAD * -1;
                COSTO = COSTO * -1;
                UTILIDAD = UTILIDAD * -1;
                if (CEROS = 'S') then
                    INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (4, USER, :ARTICULO);
                SUSPEND;
                END
            if (CEROS = 'S') then
                BEGIN
                COSTO = 0;
                UTILIDAD = 0;
                PORC = 0;
                 $$IBE$$*/ /* agregue los articulos sin factura */ /*$$IBE$$ 
                FOR SELECT ARTI_COD, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN and
                    not exists (select REPA_ARTICULO FROM REPORTES_AUX WHERE REPA_ID = 4 AND REPA_USER = USER AND REPA_ARTICULO = a.arti_cod)
                    INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                    DO
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        if (BIN_AND(TIPO, 8) <> 0) then
            BEGIN
            SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 34 INTO :NOMTIPO;
            FOR SELECT P.PREF_PRE, PEDI_NUMERO, PEDI_FECHA, ARTI_COD, PEDE_CANT * PEDE_FACTOR, (PEDE_TOTAL-PEDE_IVAMONTO-PEDE_CONSUMO)*PEDI_FACTOR,
                PEDE_IVAMONTO*PEDI_FACTOR, PEDE_DTOPORC, PEDE_TOTAL*PEDI_FACTOR, PEDE_CONSUMO
                FROM PEDIDOS P, PEDIDOS_DETALLE D, PREFIJOS PR
                WHERE P.PEDI_ID = D.PEDI_ID AND PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND VEND_COD = :CODVEND AND PEDI_ANULADO = 'N'
                 AND P.PREF_PRE = PR.PREF_PRE AND P.TIDO_COD = 34 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                ORDER BY ARTI_COD, PEDI_FECHA, P.PEDI_ID, PEDE_ITEM
                INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :DTO, :TOTAL, :CONSUMO
                DO
                BEGIN
                SELECT ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO WHERE ARTI_COD = :ARTICULO
                    INTO :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC;
                SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                EXECUTE PROCEDURE costo_promedio (:ARTICULO, :FECHA) RETURNING_VALUES (:COSTOUNIT);
                COSTO = COSTOUNIT * CANTIDAD;
                UTILIDAD = BASE - COSTO;
                if (UOM = 'UTILIDAD') then
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                else
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
                if (CEROS = 'S') then
                    INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (4, USER, :ARTICULO);
                SUSPEND;
                END
            if (CEROS = 'S') then
                BEGIN
                COSTO = 0;
                UTILIDAD = 0;
                PORC = 0;
                 $$IBE$$*/ /* agregue los articulos sin factura */ /*$$IBE$$ 
                FOR SELECT ARTI_COD, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN and
                    not exists (select REPA_ARTICULO FROM REPORTES_AUX WHERE REPA_ID = 4 AND REPA_USER = USER AND REPA_ARTICULO = a.arti_cod)
                    INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                    DO
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        if (BIN_AND(TIPO, 16) <> 0) then
            BEGIN
            SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 35 INTO :NOMTIPO;
            FOR SELECT C.PREF_PRE, COTI_NUMERO, COTI_FECHA, ARTI_COD, CTDE_CANT * CTDE_FACTOR, (CTDE_TOTAL-CTDE_IVAMONTO-CTDE_CONSUMO)*COTI_FACTOR,
                CTDE_IVAMONTO*COTI_FACTOR, CTDE_DTOPORC, CTDE_TOTAL*COTI_FACTOR, CTDE_CONSUMO
                FROM COTIZACIONES C, COTIZACIONES_DETALLE D, PREFIJOS P
                WHERE C.COTI_ID = D.COTI_ID AND ARTI_COD = :ARTICULO AND COTI_FECHA >= :FECINI AND COTI_FECHA <= :FECFIN AND VEND_COD = :CODVEND AND COTI_ANULADO = 'N'
                 AND P.PREF_PRE = C.PREF_PRE AND P.TIDO_COD = 35 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                ORDER BY COTI_FECHA, C.COTI_ID, CTDE_ITEM
                INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :DTO, :TOTAL, :CONSUMO
                DO
                BEGIN
                SELECT ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO WHERE ARTI_COD = :ARTICULO
                    INTO :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC;
                SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                EXECUTE PROCEDURE costo_promedio (:ARTICULO, :FECHA) RETURNING_VALUES (:COSTOUNIT);
                COSTO = COSTOUNIT * CANTIDAD;
                UTILIDAD = BASE - COSTO;
                if (UOM = 'UTILIDAD') then
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                else
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
                if (CEROS = 'S') then
                    INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (4, USER, :ARTICULO);
                SUSPEND;
                END
            if (CEROS = 'S') then
                BEGIN
                COSTO = 0;
                UTILIDAD = 0;
                PORC = 0;
                 $$IBE$$*/ /* agregue los articulos sin factura */ /*$$IBE$$ 
                FOR SELECT ARTI_COD, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN and
                    not exists (select REPA_ARTICULO FROM REPORTES_AUX WHERE REPA_ID = 4 AND REPA_USER = USER AND REPA_ARTICULO = a.arti_cod)
                    INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                    DO
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        END
    END
 $$IBE$$*/ SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE REP_UTILIDAD_VENTAS(
    TIPO INTEGER,
    DETALLE CHAR(1),
    FECINI DATE,
    FECFIN DATE,
    ARTINI VARCHAR(15),
    ARTFIN VARCHAR(15),
    GRPINI VARCHAR(3),
    GRPFIN VARCHAR(3),
    ORDEN CHAR(1),
    AGRUPA CHAR(1),
    CEROS CHAR(1),
    SUBEMPRESA INTEGER)
RETURNS (
    ARTICULO VARCHAR(15),
    DESCRIPCION VARCHAR(60),
    CODGRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    CODSUBG VARCHAR(3),
    NOMSUBG VARCHAR(30),
    CODMARC VARCHAR(3),
    NOMMARC VARCHAR(30),
    UNIDAD VARCHAR(8),
    CANTIDAD NUMERIC(18,4),
    BASE NUMERIC(18,4),
    COSTO NUMERIC(18,4),
    UTILIDAD NUMERIC(18,4),
    PORC NUMERIC(9,2),
    IVA NUMERIC(18,4),
    CONSUMO NUMERIC(18,4),
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    TIPODOC INTEGER)
AS
DECLARE VARIABLE COSTOUNIT NUMERIC(18,4);
declare variable CODINI VARCHAR(15);
declare variable CODFIN VARCHAR(15);
declare variable DESINI VARCHAR(15);
declare variable DESFIN VARCHAR(15);
declare variable MARINI VARCHAR(3);
declare variable MARFIN VARCHAR(3);
declare variable UOM VARCHAR(20);
declare variable NUMROWS INTEGER;
BEGIN /*$$IBE$$ 
if (ORDEN = 'C') then
    BEGIN
    CODINI = ARTINI;
    CODFIN = ARTFIN;
    DESINI = '';
    DESFIN = 'zz';
    END
ELSE
    BEGIN
    DESINI = ARTINI;
    DESFIN = ARTFIN;
    CODINI = '';
    CODFIN = 'zz';
    END
if (AGRUPA = 'G') then
    BEGIN
    MARINI = '';
    MARFIN = 'zz';
    END
ELSE
    if (AGRUPA = 'M') then
        BEGIN
        MARINI = GRPINI;
        MARFIN = GRPFIN;
        GRPINI = '';
        GRPFIN = 'zz';
        END
    ELSE
        BEGIN
        MARINI = '';
        MARFIN = 'zz';
        GRPINI = '';
        GRPFIN = 'zz';
        END
EXECUTE PROCEDURE lee_configuracion ('FACTURACION', 'ARTICULOS', 'SUGERIR PRECIOS CON PORCENTAJE DE MARGEN O UTILIDAD') returning_values (:UOM);
if (DETALLE = 'N') then
    BEGIN
    if (BIN_AND(TIPO, 1) <> 0) then
        BEGIN
        TIPODOC = 31;
         $$IBE$$*/ /* BORRA LA TABLA AUXILIAR */ /*$$IBE$$ 
        DELETE FROM reportes_aux WHERE REPA_ID = 2 AND REPA_USER = USER;

        FOR SELECT MAX(D.ARTI_COD), SUM(FADE_CANT * FADE_FACTOR), SUM((FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO)*FACT_FACTOR), SUM(FADE_IVAMONTO*FACT_FACTOR), SUM(FADE_CONSUMO),
            MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD), SUM(COST_SALP)
            FROM FACTURAS_DETALLE D, FACTURAS F, PREFIJOS P, ARTICULO A, movimiento_articulo m, costos c
            WHERE F.FACT_ID = D.FACT_ID AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND D.ARTI_COD = A.arti_cod AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            F.fact_id = M.mvar_idref AND M.mvar_tipodoc = 31 AND M.mvar_item = D.fade_item AND M.mvar_cons = C.cost_idmov AND
            FACT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) and substring(a.arti_cod from 1 FOR 2) <> '.t'
            GROUP BY D.ARTI_COD
            INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,
            :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :COSTO
            DO
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
 $$IBE$$*/ /*            EXECUTE PROCEDURE costo_promedio (:ARTICULO, :FECFIN) RETURNING_VALUES (:COSTOUNIT);*/ /*$$IBE$$ 
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
 $$IBE$$*/ /*            COSTO = cantidad * COSTOUNIT;*/ /*$$IBE$$ 
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                if (COSTO > 0) then
                    PORC = UTILIDAD * 100 / COSTO;
                ELSE
                    PORC = 100;
            else
                if (BASE > 0) then
                    PORC = UTILIDAD * 100 / BASE;
                ELSE
                    PORC = 0;
            if (CEROS = 'S') then
                INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (2, USER, :ARTICULO);
            SUSPEND;
            END  $$IBE$$*/ /* FOR */ /*$$IBE$$ 
        if (CEROS = 'S') then
            BEGIN
            COSTO = 0;
            UTILIDAD = 0;
            PORC = 0;
             $$IBE$$*/ /* agregue los articulos sin factura */ /*$$IBE$$ 
            FOR SELECT ARTI_COD, 0, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND
                    A.ARTI_DES <= :DESFIN AND A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND
                    (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN)))
                INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,:DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                DO
                BEGIN
                SELECT COUNT(REPA_ARTICULO) FROM REPORTES_AUX WHERE REPA_ID = 2 AND REPA_USER = USER AND REPA_ARTICULO = :articulo INTO :numrows;
                if (numrows = 0) then
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        END
    if (BIN_AND(TIPO, 2) <> 0) then
        BEGIN
        TIPODOC = 32;
         $$IBE$$*/ /* BORRA LA TABLA AUXILIAR */ /*$$IBE$$ 
        DELETE FROM reportes_aux WHERE REPA_ID = 2 AND REPA_USER = USER;

        FOR SELECT MAX(D.ARTI_COD), SUM(RVDE_CANT * RVDE_FACTOR), SUM(RVDE_TOTAL-RVDE_IVAMONTO-RVDE_CONSUMO), SUM(RVDE_IVAMONTO), SUM(RVDE_CONSUMO),
            MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD), SUM(COST_SALP)
            FROM REMISIONES_VENTA_DETALLE D, REMISIONES_VENTA R, PREFIJOS P, ARTICULO A, movimiento_articulo m, costos c
            WHERE R.REVT_ID = D.REVT_ID AND P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = 32 AND D.ARTI_COD = A.arti_cod AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            R.revt_id = M.mvar_idref AND M.mvar_tipodoc = 32 AND M.mvar_item = D.rvde_item AND M.mvar_cons = C.cost_idmov AND
            REVT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY D.ARTI_COD
            INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,
            :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :COSTO
            DO
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
 $$IBE$$*/ /*            EXECUTE PROCEDURE costo_promedio (:ARTICULO, :FECFIN) RETURNING_VALUES (:COSTOUNIT); */
/*            COSTO = cantidad * COSTOUNIT;*/ /*$$IBE$$ 
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                if (COSTO > 0) then
                    PORC = UTILIDAD * 100 / COSTO;
                ELSE
                    PORC = 100;
            else
                if (BASE > 0) then
                    PORC = UTILIDAD * 100 / BASE;
                ELSE
                    PORC = 0;
            if (CEROS = 'S') then
                INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (2, USER, :ARTICULO);
            SUSPEND;
            END  $$IBE$$*/ /* FOR */ /*$$IBE$$ 
        if (CEROS = 'S') then
            BEGIN
            COSTO = 0;
            UTILIDAD = 0;
            PORC = 0;
             $$IBE$$*/ /* agregue los articulos sin factura */ /*$$IBE$$ 
            FOR SELECT ARTI_COD, 0, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND
                    A.ARTI_DES <= :DESFIN AND A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND
                    (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN)))
                INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,:DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                DO
                BEGIN
                SELECT COUNT(REPA_ARTICULO) FROM REPORTES_AUX WHERE REPA_ID = 2 AND REPA_USER = USER AND REPA_ARTICULO = :articulo INTO :numrows;
                if (numrows = 0) then
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        END
    if (BIN_AND(TIPO, 4) <> 0) then
        BEGIN
        TIPODOC = 33;
         $$IBE$$*/ /* BORRA LA TABLA AUXILIAR */ /*$$IBE$$ 
        DELETE FROM reportes_aux WHERE REPA_ID = 2 AND REPA_USER = USER;

        FOR SELECT MAX(D.ARTI_COD), SUM(DVDE_CANT * DVDE_FACTOR), SUM((DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO)*DEVT_FACTOR), SUM(DVDE_IVAMONTO*DEVT_FACTOR), SUM(DVDE_CONSUMO),
            MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD), SUM(COST_ENTP)
            FROM devoluciones_ventas_detalle D, DEVOLUCIONES_VENTAS V, PREFIJOS P, ARTICULO A, MOVIMIENTO_ARTICULO M, COSTOS C
            WHERE V.DEVT_ID = D.DEVT_ID AND P.PREF_PRE = V.PREF_PRE AND P.TIDO_COD = 33 AND D.ARTI_COD = A.arti_cod AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            V.devt_id = M.mvar_idref AND M.mvar_tipodoc = 33 AND M.mvar_item = D.dvde_item AND M.mvar_cons = C.cost_idmov AND
            DEVT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY D.ARTI_COD
            INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,
            :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :COSTO
            DO
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            else
                CANTIDAD = CANTIDAD * -1;
            if (BASE IS NULL) then
                BASE = 0;
            else
                BASE = BASE * -1;
            if (IVA IS NULL) then
                IVA = 0;
            else
                IVA = IVA * -1;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            else
                CONSUMO = CONSUMO * -1;
 $$IBE$$*/ /*            EXECUTE PROCEDURE costo_promedio (:ARTICULO, :FECFIN) RETURNING_VALUES (:COSTOUNIT);*/
/*            COSTO = cantidad * COSTOUNIT;*/ /*$$IBE$$ 
            COSTO = costo * -1;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                if (COSTO > 0) then
                    PORC = UTILIDAD * 100 / COSTO;
                ELSE
                    PORC = 100;
            else
                if (BASE > 0) then
                    PORC = UTILIDAD * 100 / BASE;
                ELSE
                    PORC = 0;
            if (CEROS = 'S') then
                INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (2, USER, :ARTICULO);
            SUSPEND;
            END  $$IBE$$*/ /* FOR */ /*$$IBE$$ 
        if (CEROS = 'S') then
            BEGIN
            COSTO = 0;
            UTILIDAD = 0;
            PORC = 0;
             $$IBE$$*/ /* agregue los articulos sin factura */ /*$$IBE$$ 
            FOR SELECT ARTI_COD, 0, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND
                    A.ARTI_DES <= :DESFIN AND A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND
                    (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN)))
                INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,:DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                DO
                BEGIN
                SELECT COUNT(REPA_ARTICULO) FROM REPORTES_AUX WHERE REPA_ID = 2 AND REPA_USER = USER AND REPA_ARTICULO = :articulo INTO :numrows;
                if (numrows = 0) then
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        END
    if (BIN_AND(TIPO, 8) <> 0) then
        BEGIN
        TIPODOC = 34;
         $$IBE$$*/ /* BORRA LA TABLA AUXILIAR */ /*$$IBE$$ 
        DELETE FROM reportes_aux WHERE REPA_ID = 2 AND REPA_USER = USER;

        FOR SELECT MAX(D.ARTI_COD), SUM(PEDE_CANT * PEDE_FACTOR), SUM((PEDE_TOTAL-PEDE_IVAMONTO-PEDE_CONSUMO)*PEDI_FACTOR), SUM(PEDE_IVAMONTO*PEDI_FACTOR), SUM(PEDE_CONSUMO),
            MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD)
            FROM PEDIDOS_DETALLE D, PEDIDOS P, PREFIJOS R, ARTICULO A
            WHERE P.PEDI_ID = D.PEDI_ID AND P.PREF_PRE = R.PREF_PRE AND R.TIDO_COD = 34 AND D.ARTI_COD = A.arti_cod AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            PEDI_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY D.ARTI_COD
            INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,
            :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
            DO
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            EXECUTE PROCEDURE costo_promedio (:ARTICULO, :FECFIN) RETURNING_VALUES (:COSTOUNIT);
            COSTO = cantidad * COSTOUNIT;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                if (COSTO > 0) then
                    PORC = UTILIDAD * 100 / COSTO;
                ELSE
                    PORC = 100;
            else
                if (BASE > 0) then
                    PORC = UTILIDAD * 100 / BASE;
                ELSE
                    PORC = 0;
            if (CEROS = 'S') then
                INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (2, USER, :ARTICULO);
            SUSPEND;
            END  $$IBE$$*/ /* FOR */ /*$$IBE$$ 
        if (CEROS = 'S') then
            BEGIN
            COSTO = 0;
            UTILIDAD = 0;
            PORC = 0;
             $$IBE$$*/ /* agregue los articulos sin factura */ /*$$IBE$$ 
            FOR SELECT ARTI_COD, 0, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND
                    A.ARTI_DES <= :DESFIN AND A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND
                    (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN)))
                INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,:DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                DO
                BEGIN
                SELECT COUNT(REPA_ARTICULO) FROM REPORTES_AUX WHERE REPA_ID = 2 AND REPA_USER = USER AND REPA_ARTICULO = :articulo INTO :numrows;
                if (numrows = 0) then
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        END
    if (BIN_AND(TIPO, 16) <> 0) then
        BEGIN
        TIPODOC = 35;
         $$IBE$$*/ /* BORRA LA TABLA AUXILIAR */ /*$$IBE$$ 
        DELETE FROM reportes_aux WHERE REPA_ID = 2 AND REPA_USER = USER;

        FOR SELECT MAX(D.ARTI_COD), SUM(CTDE_CANT * CTDE_FACTOR), SUM((CTDE_TOTAL-CTDE_IVAMONTO-CTDE_CONSUMO)*COTI_FACTOR), SUM(CTDE_IVAMONTO), SUM(CTDE_CONSUMO),
            MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD)
            FROM COTIZACIONES_DETALLE D, COTIZACIONES C, PREFIJOS P, ARTICULO A
            WHERE C.COTI_ID = D.COTI_ID AND P.PREF_PRE = C.PREF_PRE AND P.TIDO_COD = 35 AND D.ARTI_COD = A.arti_cod AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND COTI_FECHA >= :FECINI AND COTI_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            COTI_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY D.ARTI_COD
            INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,
            :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
            DO
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            EXECUTE PROCEDURE costo_promedio (:ARTICULO, :FECFIN) RETURNING_VALUES (:COSTOUNIT);
            COSTO = cantidad * COSTOUNIT;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                if (COSTO > 0) then
                    PORC = UTILIDAD * 100 / COSTO;
                ELSE
                    PORC = 100;
            else
                if (BASE > 0) then
                    PORC = UTILIDAD * 100 / BASE;
                ELSE
                    PORC = 0;
            if (CEROS = 'S') then
                INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (2, USER, :ARTICULO);
            SUSPEND;
            END  $$IBE$$*/ /* FOR */ /*$$IBE$$ 
        if (CEROS = 'S') then
            BEGIN
            COSTO = 0;
            UTILIDAD = 0;
            PORC = 0;
             $$IBE$$*/ /* agregue los articulos sin factura */ /*$$IBE$$ 
            FOR SELECT ARTI_COD, 0, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND
                    A.ARTI_DES <= :DESFIN AND A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND
                    (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN)))
                INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,:DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                DO
                BEGIN
                SELECT COUNT(REPA_ARTICULO) FROM REPORTES_AUX WHERE REPA_ID = 2 AND REPA_USER = USER AND REPA_ARTICULO = :articulo INTO :numrows;
                if (numrows = 0) then
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        END
    END
ELSE
    BEGIN
    if (BIN_AND(TIPO, 1) <> 0) then
        BEGIN
        TIPODOC = 31;
        FOR SELECT F.PREF_PRE, FACT_NUMERO, FACT_FECHA, D.ARTI_COD, FADE_CANT * FADE_FACTOR, (FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO)*FACT_FACTOR, FADE_IVAMONTO*FACT_FACTOR, FADE_CONSUMO,
            ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD, COST_SALP
            FROM FACTURAS F, FACTURAS_DETALLE D, PREFIJOS P, ARTICULO A, MOVIMIENTO_ARTICULO M, COSTOS C
            WHERE F.FACT_ID = D.FACT_ID AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND D.ARTI_COD = A.arti_cod AND
                A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
                A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND FACT_FECHA >= :FECINI AND
                (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
                F.fact_id = M.mvar_idref AND M.mvar_tipodoc = 31 AND M.mvar_item = D.fade_item AND M.mvar_cons = C.cost_idmov AND
                FACT_FECHA <= :FECFIN AND FACT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) and substring(a.arti_cod from 1 FOR 2) <> '.t'
            ORDER BY D.ARTI_COD, FACT_FECHA, F.FACT_ID, FADE_ITEM
            INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,
                :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :COSTO
            DO
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
 $$IBE$$*/ /*            EXECUTE PROCEDURE costo_promedio (:ARTICULO, :FECHA) RETURNING_VALUES (:COSTOUNIT);*/
/*            COSTO = COSTOUNIT * CANTIDAD;*/ /*$$IBE$$ 
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                if (COSTO > 0) then
                    PORC = UTILIDAD * 100 / COSTO;
                ELSE
                    PORC = 100;
            else
                if (BASE > 0) then
                    PORC = UTILIDAD * 100 / BASE;
                ELSE
                    PORC = 0;
            SUSPEND;
            END
        END
    if (BIN_AND(TIPO, 2) <> 0) then
        BEGIN
        TIPODOC = 32;
        FOR SELECT R.PREF_PRE, REVT_NUMERO, REVT_FECHA, D.ARTI_COD, RVDE_CANT * RVDE_FACTOR, RVDE_TOTAL-RVDE_IVAMONTO-RVDE_CONSUMO, RVDE_IVAMONTO, RVDE_CONSUMO,
            ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD, COST_SALP
            FROM REMISIONES_VENTA R, REMISIONES_VENTA_DETALLE D, PREFIJOS P, ARTICULO A, MOVIMIENTO_ARTICULO M, COSTOS C
            WHERE R.REVT_ID = D.REVT_ID AND P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = 32 AND D.ARTI_COD = A.arti_cod AND
                A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
                A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN AND
                R.revt_id = M.mvar_idref AND M.mvar_tipodoc = 32 AND M.mvar_item = D.rvde_item AND M.mvar_cons = C.cost_idmov AND
                (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
                REVT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            ORDER BY D.ARTI_COD, REVT_FECHA, R.REVT_ID, RVDE_ITEM
            INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,
                :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :COSTO
            DO
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            EXECUTE PROCEDURE costo_promedio (:ARTICULO, :FECHA) RETURNING_VALUES (:COSTOUNIT);
            COSTO = COSTOUNIT * CANTIDAD;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                if (COSTO > 0) then
                    PORC = UTILIDAD * 100 / COSTO;
                ELSE
                    PORC = 100;
            else
                if (BASE > 0) then
                    PORC = UTILIDAD * 100 / BASE;
                ELSE
                    PORC = 0;
            SUSPEND;
            END
        END
    if (BIN_AND(TIPO, 4) <> 0) then
        BEGIN
        TIPODOC = 33;
        FOR SELECT V.PREF_PRE, DEVT_NUMERO, DEVT_FECHA, D.ARTI_COD, DVDE_CANT * DVDE_FACTOR, (DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO)*DEVT_FACTOR, DVDE_IVAMONTO*DEVT_FACTOR, DVDE_CONSUMO,
            ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD, COST_ENTP
            FROM DEVOLUCIONES_VENTAS V, DEVOLUCIONES_VENTAS_DETALLE D, PREFIJOS P, ARTICULO A, MOVIMIENTO_ARTICULO M, COSTOS C
            WHERE V.DEVT_ID = D.DEVT_ID AND P.PREF_PRE = V.PREF_PRE AND P.TIDO_COD = 33 AND D.ARTI_COD = A.arti_cod AND
                A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
                A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND
                (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
                V.devt_id = M.mvar_idref AND M.mvar_tipodoc = 33 AND M.mvar_item = D.dvde_item AND M.mvar_cons = C.cost_idmov AND
                DEVT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            ORDER BY D.ARTI_COD, DEVT_FECHA, V.DEVT_ID, DVDE_ITEM
            INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,
                :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :COSTO
            DO
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            EXECUTE PROCEDURE costo_promedio (:ARTICULO, :FECHA) RETURNING_VALUES (:COSTOUNIT);
            BASE = BASE * -1;
            CANTIDAD = CANTIDAD * -1;
            IVA = IVA * -1;
            CONSUMO = CONSUMO * -1;
            COSTO = COSTOUNIT * CANTIDAD;
            COSTO = COSTO * -1;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                if (COSTO > 0) then
                    PORC = UTILIDAD * 100 / COSTO;
                ELSE
                    PORC = 100;
            else
                if (BASE > 0) then
                    PORC = UTILIDAD * 100 / BASE;
                ELSE
                    PORC = 0;
            SUSPEND;
            END
        END
    if (BIN_AND(TIPO, 8) <> 0) then
        BEGIN
        TIPODOC = 34;
        FOR SELECT P.PREF_PRE, PEDI_NUMERO, PEDI_FECHA, D.ARTI_COD, PEDE_CANT * PEDE_FACTOR, (PEDE_TOTAL-PEDE_IVAMONTO-PEDE_CONSUMO)*PEDI_FACTOR, PEDE_IVAMONTO*PEDI_FACTOR, PEDE_CONSUMO,
            ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD 
            FROM PEDIDOS P, PEDIDOS_DETALLE D, PREFIJOS R, ARTICULO A
            WHERE P.PEDI_ID = D.PEDI_ID AND P.PREF_PRE = R.PREF_PRE AND R.TIDO_COD = 34 AND D.ARTI_COD = A.arti_cod AND
                A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
                A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND
                (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
                PEDI_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            ORDER BY D.ARTI_COD, PEDI_FECHA, P.PEDI_ID, PEDE_ITEM
            INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,
                :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
            DO
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            EXECUTE PROCEDURE costo_promedio (:ARTICULO, :FECHA) RETURNING_VALUES (:COSTOUNIT);
            COSTO = COSTOUNIT * CANTIDAD;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                if (COSTO > 0) then
                    PORC = UTILIDAD * 100 / COSTO;
                ELSE
                    PORC = 100;
            else
                if (BASE > 0) then
                    PORC = UTILIDAD * 100 / BASE;
                ELSE
                    PORC = 0;
            SUSPEND;
            END
        END
    if (BIN_AND(TIPO, 16) <> 0) then
        BEGIN
        TIPODOC = 35;
        FOR SELECT C.PREF_PRE, COTI_NUMERO, COTI_FECHA, D.ARTI_COD, CTDE_CANT * CTDE_FACTOR, (CTDE_TOTAL-CTDE_IVAMONTO-CTDE_CONSUMO)*COTI_FACTOR, CTDE_IVAMONTO*COTI_FACTOR, CTDE_CONSUMO,
            ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD 
            FROM COTIZACIONES C, COTIZACIONES_DETALLE D, PREFIJOS P, ARTICULO A
            WHERE C.COTI_ID = D.COTI_ID AND P.PREF_PRE = C.PREF_PRE AND P.TIDO_COD = 35 AND D.ARTI_COD = A.arti_cod AND
                A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
                A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND COTI_FECHA >= :FECINI AND COTI_FECHA <= :FECFIN AND
                (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
                COTI_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            ORDER BY D.ARTI_COD, COTI_FECHA, C.COTI_ID, CTDE_ITEM
            INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,
                :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
            DO
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            EXECUTE PROCEDURE costo_promedio (:ARTICULO, :FECHA) RETURNING_VALUES (:COSTOUNIT);
            COSTO = COSTOUNIT * CANTIDAD;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                if (COSTO > 0) then
                    PORC = UTILIDAD * 100 / COSTO;
                ELSE
                    PORC = 100;
            else
                if (BASE > 0) then
                    PORC = UTILIDAD * 100 / BASE;
                ELSE
                    PORC = 0;
            SUSPEND;
            END
        END
    END
 $$IBE$$*/ SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

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

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE REVISA_PRECIOS(
    LISTA INTEGER,
    FECHA DATE)
RETURNS (
    ARTICULO VARCHAR(20),
    DESCR VARCHAR(60),
    GRUPO VARCHAR(2),
    SUBGRUPO VARCHAR(3),
    MARCA VARCHAR(3),
    FIJO NUMERIC(18,2),
    UNIDAD VARCHAR(8),
    PORC NUMERIC(9,4),
    SUGERIDO NUMERIC(18,2),
    DIFER NUMERIC(18,2),
    NUEVO NUMERIC(18,2),
    OK CHAR(1))
AS
declare variable marg numeric(9,4);
declare variable UOM VARCHAR(10);
declare variable BASE VARCHAR(10);
declare variable CAMBIO VARCHAR(10);
declare variable COSTO numeric(18,2);
declare variable COSTOP numeric(18,2);
declare variable COSTOU numeric(18,2);
declare variable DIFMAX numeric(18,2);
declare variable DIG INTEGER;
declare variable TARIVA NUMERIC(9,4);
declare variable IVAINC CHAR(1);
declare variable LISTAREF INTEGER;
begin /*$$IBE$$ 
execute procedure lee_configuracion ('FACTURACION', 'ARTICULOS', 'SUGERIR PRECIOS CON PORCENTAJE DE MARGEN O UTILIDAD') returning_values (:UOM);
EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION', 'ARTICULOS', 'REDONDEO AL MULTIPLO DE DIEZ EN PRECIOS') RETURNING_VALUES (:DIG);
EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION','ARTICULOS','CAMBIO DE PRECIOS AUTOMATICO AL CAMBIAR COSTO O PRECIO') returning_values (CAMBIO);
EXECUTE PROCEDURE lee_configuracion('FACTURACION','ARTICULOS','COSTO BASE PARA CALCULO DE PRECIOS DE VENTA AUTOMATICOS') returning_values (:BASE);
EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION','ARTICULOS','CODIGO DE LA LISTA DE PRECIOS BASE PARA CAMBIO DE PRECIOS AUTOMATICO') returning_values (LISTAREF);
EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION','ARTICULOS','DIFERENCIA EN PESOS MAXIMA A PERMITIR PARA CAMBIAR PRECIOS') returning_values (DIFMAX);
for select A.arti_cod, A.arti_des, A.grup_cod, A.subg_cod, A.marc_cod, A.arti_unidad, prar_fijo, prar_margen, prar_util, TAIV_PORC
    from precios_articulo p, articulo a, tarifa_iva T
    where a.arti_cod = p.arti_cod and lipr_cod = :lista and a.taiv_cod = t.taiv_cod order by A.arti_cod
    into :articulo, descr, :grupo, :subgrupo, :marca, :unidad, :fijo, :marg, :porc, :tariva
    do
    begin
    if (UOM <> 'UTILIDAD') then
        PORC = MARG;
    if (CAMBIO = 'COSTO') then
        BEGIN
        EXECUTE PROCEDURE COSTO_PROMEDIO (:ARTICULO, :FECHA) RETURNING_VALUES(:COSTOP);
        EXECUTE PROCEDURE ULTIMO_COSTO (:ARTICULO, :FECHA, :UNIDAD) RETURNING_VALUES(:COSTOU);
        if (base = 'ULTIMO') then
            COSTO = COSTOU;
        ELSE
            BEGIN
            COSTO = COSTOP;
            if (base = 'MAYOR') then
                if (COSTOP < COSTOU) then
                    COSTO = COSTOU;
            END
        SELECT LIPR_MODIF FROM LISTA_PRECIOS WHERE LIPR_COD = :lista INTO :IVAINC;
        if (IVAINC = 'S') then
            COSTO = COSTO * (1 + TARIVA/100);
        if (UOM = 'UTILIDAD') then
            SUGERIDO = COSTO * (1 + :PORC/100);
        ELSE
            SUGERIDO = COSTO / (1 - :PORC/100);
        END
    ELSE
        if (LISTA <> LISTAREF) then
            BEGIN
            SELECT PRAR_FIJO FROM PRECIOS_ARTICULO WHERE ARTI_COD = :articulo AND LIPR_COD = :LISTAREF INTO :SUGERIDO;
            if (IVAINC = 'S') then
                SUGERIDO = SUGERIDO / (1 + TARIVA/100);
            if (UOM = 'UTILIDAD') then
                SUGERIDO = SUGERIDO * (1 + :PORC/100);
            ELSE
                SUGERIDO = SUGERIDO / (1 - :PORC/100);
            END
    EXECUTE PROCEDURE REDONDEE (SUGERIDO, DIG) returning_values (SUGERIDO);
    DIFER = SUGERIDO - FIJO;
    NUEVO = SUGERIDO;
    OK = 'S';
    if ((abs(DIFER) > DIFMAX) and (sugerido <> 0)) then
        suspend;
    end
 $$IBE$$*/ SUSPEND;
end
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE TARIFAS_ENSAMBLE(
    PRODUCTO VARCHAR(20),
    PRECIO NUMERIC(18,2),
    FECHA DATE)
RETURNS (
    T0 NUMERIC(18,2),
    T1 NUMERIC(18,2),
    T2 NUMERIC(18,2),
    T3 NUMERIC(18,2),
    T4 NUMERIC(18,2),
    TC NUMERIC(18,2))
AS
declare variable COSTO NUMERIC(18,2);
declare variable TOTAL NUMERIC(18,2);
declare variable TARIFA INTEGER;
declare variable COMPON VARCHAR(20);
declare variable CANT NUMERIC(18,4);
declare variable UNIDAD VARCHAR(8);
declare variable CONSUMO NUMERIC(18,2);
begin /*$$IBE$$ 
T0 = 0;
T1 = 0;
T2 = 0;
T3 = 0;
T4 = 0;
TC = 0;
TOTAL = 0;
FOR SELECT ARPR_COMP, ARPR_CANT, ARPR_UNIDAD, TAIV_COD, ARTI_CONSUMO
    FROM articulos_producto P, ARTICULO A WHERE P.ARTI_COD = :PRODUCTO AND P.arpr_comp = A.arti_cod
    INTO :COMPON, :CANT, :UNIDAD, :TARIFA, :CONSUMO
    DO
    BEGIN
    EXECUTE PROCEDURE cantidad_por_factor (:COMPON, :CANT, :UNIDAD) returning_values (:cant);
    EXECUTE PROCEDURE costo_promedio (:COMPON, :FECHA) returning_values (:COSTO);
    TOTAL = TOTAL + COSTO * CANT;
    TC = TC + CONSUMO * CANT;
    if (TARIFA = 0) then
        T0 = T0 + COSTO * CANT;
    if (TARIFA = 1) then
        T1 = T1 + COSTO * CANT;
    if (TARIFA = 2) then
        T2 = T2 + COSTO * CANT;
    if (TARIFA = 3) then
        T3 = T3 + COSTO * CANT;
    if (TARIFA = 4) then
        T4 = T4 + COSTO * CANT;
    END
if (TOTAL <> 0) then
    BEGIN
    T0 = T0 * PRECIO / TOTAL;
    T1 = T1 * PRECIO / TOTAL;
    T2 = T2 * PRECIO / TOTAL;
    T3 = T3 * PRECIO / TOTAL;
    T4 = T4 * PRECIO / TOTAL;
    END
ELSE
    BEGIN
    T0 = 0;
    T1 = 0;
    T2 = 0;
    T3 = 0;
    T4 = 0;
    END
suspend;
 $$IBE$$*/ SUSPEND;
end
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE UTILIDAD_VENTAS(
    TIPO INTEGER,
    DETALLE CHAR(1),
    FECINI DATE,
    FECFIN DATE,
    PREFIJO VARCHAR(4),
    SUBEMPRESA INTEGER)
RETURNS (
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    PTVTID INTEGER,
    VENDCOD INTEGER,
    NIT VARCHAR(20),
    NOMTERCERO VARCHAR(60),
    ARTICULO VARCHAR(15),
    ARTIDES VARCHAR(60),
    CANT NUMERIC(18,4),
    UNIDAD VARCHAR(8),
    PRECIO NUMERIC(18,2),
    COSTO NUMERIC(18,2),
    UTILIDAD NUMERIC(18,2),
    PORC NUMERIC(9,2))
AS
declare variable IMPTOS CHAR(1);
declare variable ID INTEGER;
declare variable IVA NUMERIC(18,2);
declare variable COSTOT NUMERIC(18,2);
declare variable PRECIOT NUMERIC(18,2);
declare variable UOM VARCHAR(20);
BEGIN /*$$IBE$$ 
EXECUTE PROCEDURE lee_configuracion ('FACTURACION', 'ARTICULOS', 'SUGERIR PRECIOS CON PORCENTAJE DE MARGEN O UTILIDAD') returning_values (:UOM);
 $$IBE$$*/ /* DETERMINE LA TABLA A EXAMINAR */ /*$$IBE$$ 
if (TIPO = 31) then
    BEGIN
     $$IBE$$*/ /* FACTURA */ /*$$IBE$$ 
    FOR SELECT FACT_ID, F.PREF_PRE, FACT_NUMERO, FACT_FECHA, PTVT_ID, VEND_COD, TERC_NIT, FACT_NOMCLIENTE, FACT_IVAINC
        FROM FACTURAS F, PREFIJOS P
        WHERE FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND FACT_ANULADO = 'N'
         AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = :TIPO AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
        ORDER BY FACT_FECHA, F.PREF_PRE, FACT_NUMERO
        INTO :ID, :PREF, :NUMERO, :FECHA, :PTVTID, :VENDCOD, :NIT, :NOMTERCERO, :IMPTOS
        DO
        if ((PREFIJO = '') or (PREFIJO = PREF)) then
          BEGIN
          COSTOT = 0;
          PRECIOT = 0;
          FOR SELECT D.ARTI_COD, SUBSTR(FADE_DESC,1,60), FADE_CANT * FADE_FACTOR, FADE_UNIDAD, (FADE_PRUNIT - FADE_DTOMONTO) / FADE_FACTOR, FADE_IVAMONTO, COST_SALP
            FROM FACTURAS_DETALLE D, MOVIMIENTO_ARTICULO M, COSTOS C
            WHERE FACT_ID = :ID and substring(D.arti_cod from 1 FOR 2) <> '.t' AND D.fact_id = M.mvar_idref AND
                M.mvar_tipodoc = 31 AND M.mvar_item = D.fade_item AND M.mvar_cons = C.cost_idmov
            INTO :ARTICULO, :ARTIDES, :CANT, :UNIDAD, :PRECIO, :IVA, :COSTO
            DO
                BEGIN
                PRECIO = PRECIO * CANT;
                if (IMPTOS = 'S') then
                    PRECIO = PRECIO - IVA;
                UTILIDAD = PRECIO - COSTO;
                if (DETALLE = 'S') then
                    BEGIN
                    if (UOM = 'UTILIDAD') then
                        EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                    else
                        EXECUTE PROCEDURE PORCENTAJE (utilidad,  PRECIO, 'S') returning_values (PORC);
                    SUSPEND;
                    END
                ELSE
                    BEGIN
                    COSTOT = COSTOT + COSTO;
                    PRECIOT = PRECIOT + PRECIO;
                    END
                END
          if (DETALLE <> 'S') then
            BEGIN
            COSTO = COSTOT;
            PRECIO = PRECIOT;
            UTILIDAD = PRECIO - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  PRECIO, 'S') returning_values (PORC);
            SUSPEND;
            END
          END
    END
  if (TIPO = 32) then
    BEGIN
     $$IBE$$*/ /* REMISION */ /*$$IBE$$ 
    FOR SELECT REVT_ID, R.PREF_PRE, REVT_NUMERO, REVT_FECHA, PTVT_ID, VEND_COD, TERC_NIT, REVT_NOMTERC, REVT_IVAINC
        FROM REMISIONES_VENTA R, PREFIJOS P
        WHERE REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN AND REVT_ANULADO = 'N'
         AND P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = :TIPO AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
        ORDER BY REVT_FECHA, R.PREF_PRE, REVT_NUMERO
        INTO :ID, :PREF, :NUMERO, :FECHA, :PTVTID, :VENDCOD, :NIT, :NOMTERCERO, :IMPTOS
        DO
        if ((PREFIJO = '') or (PREFIJO = PREF)) then
          BEGIN
          COSTOT = 0;
          PRECIOT = 0;
          FOR SELECT D.ARTI_COD, SUBSTR(RVDE_DESC,1,60), RVDE_CANT * RVDE_FACTOR, RVDE_UNIDAD, (RVDE_PRUNIT - RVDE_DTOMONTO) / RVDE_FACTOR, RVDE_IVAMONTO, COST_SALP
            FROM REMISIONES_VENTA_DETALLE D, movimiento_articulo m, costos c
            WHERE REVT_ID = :ID and substring(D.arti_cod from 1 FOR 2) <> '.t' AND D.revt_id = M.mvar_idref AND
                M.mvar_tipodoc = 32 AND M.mvar_item = D.rvde_item AND M.mvar_cons = C.cost_idmov
            INTO :ARTICULO, :ARTIDES, :CANT, :UNIDAD, :PRECIO, :IVA, :COSTO
            DO
                BEGIN
                PRECIO = PRECIO * CANT;
                if (IMPTOS = 'S') then
                    PRECIO = PRECIO - IVA;
                UTILIDAD = PRECIO - COSTO;
                if (DETALLE = 'S') then
                    BEGIN
                    if (UOM = 'UTILIDAD') then
                        EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                    else
                        EXECUTE PROCEDURE PORCENTAJE (utilidad,  PRECIO, 'S') returning_values (PORC);
                    SUSPEND;
                    END
                ELSE
                    BEGIN
                    COSTOT = COSTOT + COSTO;
                    PRECIOT = PRECIOT + PRECIO;
                    END
                END
          if (DETALLE <> 'S') then
            BEGIN
            COSTO = COSTOT;
            PRECIO = PRECIOT;
            UTILIDAD = PRECIO - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  PRECIO, 'S') returning_values (PORC);
            SUSPEND;
            END
          END
    END
  if (TIPO = 33) then
    BEGIN
     $$IBE$$*/ /* DEVOLUCION */ /*$$IBE$$ 
    FOR SELECT DEVT_ID, D.PREF_PRE, DEVT_NUMERO, DEVT_FECHA, PTVT_ID, VEND_COD, TERC_NIT, DEVT_NOMTERC, DEVT_IVAINC
        FROM DEVOLUCIONES_VENTAS D, PREFIJOS P
        WHERE DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND DEVT_ANULADO = 'N'
         AND P.PREF_PRE = D.PREF_PRE AND P.TIDO_COD = :TIPO AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
        ORDER BY DEVT_FECHA, D.PREF_PRE, DEVT_NUMERO
        INTO :ID, :PREF, :NUMERO, :FECHA, :PTVTID, :VENDCOD, :NIT, :NOMTERCERO, :IMPTOS
        DO
        if ((PREFIJO = '') or (PREFIJO = PREF)) then
          BEGIN
          COSTOT = 0;
          PRECIOT = 0;
          FOR SELECT D.ARTI_COD, SUBSTR(DVDE_DESC,1,60), DVDE_CANT * DVDE_FACTOR, DVDE_UNIDAD, (DVDE_PRUNIT - DVDE_DTOMONTO) / DVDE_FACTOR, DVDE_IVAMONTO, COST_ENTP
            FROM DEVOLUCIONES_VENTAS_DETALLE D, MOVIMIENTO_ARTICULO M, COSTOS C
            WHERE DEVT_ID = :ID and substring(D.arti_cod from 1 FOR 2) <> '.t' AND D.devt_id = M.mvar_idref AND
                M.mvar_tipodoc = 33 AND M.mvar_item = D.dvde_item AND M.mvar_cons = C.cost_idmov
            INTO :ARTICULO, :ARTIDES, :CANT, :UNIDAD, :PRECIO, :IVA, :COSTO
            DO
                BEGIN
                PRECIO = PRECIO * CANT;
                if (IMPTOS = 'S') then
                    PRECIO = PRECIO - IVA;
                UTILIDAD = PRECIO - COSTO;
                if (DETALLE = 'S') then
                    BEGIN
                    if (UOM = 'UTILIDAD') then
                        EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                    else
                        EXECUTE PROCEDURE PORCENTAJE (utilidad,  PRECIO, 'S') returning_values (PORC);
                    SUSPEND;
                    END
                ELSE
                    BEGIN
                    COSTOT = COSTOT + COSTO;
                    PRECIOT = PRECIOT + PRECIO;
                    END
                END
        if (DETALLE <> 'S') then
            BEGIN
            COSTO = COSTOT;
            PRECIO = PRECIOT;
            UTILIDAD = PRECIO - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  PRECIO, 'S') returning_values (PORC);
            SUSPEND;
            END
        END
    END
  if (TIPO = 34) then
    BEGIN
     $$IBE$$*/ /* PEDIDO */ /*$$IBE$$ 
    FOR SELECT PEDI_ID, P.PREF_PRE, PEDI_NUMERO, PEDI_FECHA, PTVT_ID, VEND_COD, TERC_NIT, PEDI_NOMTERC, PEDI_IVAINC
        FROM PEDIDOS P, PREFIJOS R
        WHERE PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND PEDI_ANULADO = 'N'
         AND P.PREF_PRE = R.PREF_PRE AND R.TIDO_COD = :TIPO AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
        ORDER BY PEDI_FECHA, P.PREF_PRE, PEDI_NUMERO
        INTO :ID, :PREF, :NUMERO, :FECHA, :PTVTID, :VENDCOD, :NIT, :NOMTERCERO, :IMPTOS
        DO
        if ((PREFIJO = '') or (PREFIJO = PREF)) then
          BEGIN
          COSTOT = 0;
          PRECIOT = 0;
          FOR SELECT ARTI_COD, SUBSTR(PEDE_DESC,1,60), PEDE_CANT * PEDE_FACTOR, PEDE_UNIDAD, (PEDE_PRUNIT - PEDE_DTOMONTO) / PEDE_FACTOR, PEDE_IVAMONTO
            FROM PEDIDOS_DETALLE
            WHERE PEDI_ID = :ID
            INTO :ARTICULO, :ARTIDES, :CANT, :UNIDAD, :PRECIO, :IVA
            DO
                BEGIN
                EXECUTE PROCEDURE COSTO_PROMEDIO(:ARTICULO, :FECHA) returning_values (:COSTO);
                COSTO = COSTO * CANT;
                PRECIO = PRECIO * CANT;
                if (IMPTOS = 'S') then
                    PRECIO = PRECIO - IVA;
                UTILIDAD = PRECIO - COSTO;
                if (DETALLE = 'S') then
                    BEGIN
                    if (UOM = 'UTILIDAD') then
                        EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                    else
                        EXECUTE PROCEDURE PORCENTAJE (utilidad,  PRECIO, 'S') returning_values (PORC);
                    SUSPEND;
                    END
                ELSE
                    BEGIN
                    COSTOT = COSTOT + COSTO;
                    PRECIOT = PRECIOT + PRECIO;
                    END
                END
        if (DETALLE <> 'S') then
            BEGIN
            COSTO = COSTOT;
            PRECIO = PRECIOT;
            UTILIDAD = PRECIO - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  PRECIO, 'S') returning_values (PORC);
            SUSPEND;
            END
        END
    END
  if (TIPO = 35) then
    BEGIN
     $$IBE$$*/ /* COTIZACION */ /*$$IBE$$ 
    FOR SELECT COTI_ID, C.PREF_PRE, COTI_NUMERO, COTI_FECHA, PTVT_ID, VEND_COD, TERC_NIT, COTI_NOMTERC, COTI_IMPTOS
        FROM COTIZACIONES C, PREFIJOS P
        WHERE COTI_FECHA >= :FECINI AND COTI_FECHA <= :FECFIN AND COTI_ANULADO = 'N'
         AND P.PREF_PRE = C.PREF_PRE AND P.TIDO_COD = :TIPO AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
        ORDER BY COTI_FECHA, C.PREF_PRE, COTI_NUMERO
        INTO :ID, :PREF, :NUMERO, :FECHA, :PTVTID, :VENDCOD, :NIT, :NOMTERCERO, :IMPTOS
        DO
        if ((PREFIJO = '') or (PREFIJO = PREF)) then
          BEGIN
          COSTOT = 0;
          PRECIOT = 0;
          FOR SELECT ARTI_COD, SUBSTR(CTDE_DESC,1,60), CTDE_CANT * CTDE_FACTOR, CTDE_UNIDAD, (CTDE_PRUNIT - CTDE_DTOMONTO) / CTDE_FACTOR, CTDE_IVAMONTO
            FROM COTIZACIONES_DETALLE
            WHERE COTI_ID = :ID
            INTO :ARTICULO, :ARTIDES, :CANT, :UNIDAD, :PRECIO, :IVA
            DO
                BEGIN
                EXECUTE PROCEDURE COSTO_PROMEDIO(:ARTICULO, :FECHA) returning_values (:COSTO);
                COSTO = COSTO * CANT;
                PRECIO = PRECIO * CANT;
                if (IMPTOS = 'S') then
                    PRECIO = PRECIO - IVA;
                UTILIDAD = PRECIO - COSTO;
                if (DETALLE = 'S') then
                    BEGIN
                    if (UOM = 'UTILIDAD') then
                        EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                    else
                        EXECUTE PROCEDURE PORCENTAJE (utilidad,  PRECIO, 'S') returning_values (PORC);
                    SUSPEND;
                    END
                ELSE
                    BEGIN
                    COSTOT = COSTOT + COSTO;
                    PRECIOT = PRECIOT + PRECIO;
                    END
                END
        if (DETALLE <> 'S') then
            BEGIN
            COSTO = COSTOT;
            PRECIO = PRECIOT;
            UTILIDAD = PRECIO - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  PRECIO, 'S') returning_values (PORC);
            SUSPEND;
            END
        END
    END
 $$IBE$$*/ SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE CHEQUEO_COSTOS(
    ARTICULO VARCHAR(20),
    FECHA DATE)
AS
declare variable NUMROWS INTEGER;
DECLARE VARIABLE ID INTEGER;
DECLARE VARIABLE FECMV DATE;
DECLARE VARIABLE CANT NUMERIC(15,4);
DECLARE VARIABLE COSTO NUMERIC(18,2);
DECLARE VARIABLE ENTRADA CHAR(1);
DECLARE VARIABLE TIPO INTEGER;
begin /*$$IBE$$ 
SELECT COUNT(*) FROM COSTOS WHERE ARTI_COD = :ARTICULO AND COST_FECHA > :FECHA INTO :NUMROWS;
if (NUMROWS > 0) then
    BEGIN
    delete from costos where arti_cod = :ARTICULO AND COST_FECHA > :FECHA;
    for select mvar_cons, mvar_fecha, mvar_cant, mvar_costo, mvar_entrada, mvar_tipodoc
        from movimiento_articulo WHERE ARTI_COD = :ARTICULO AND MVAR_FECHA > :FECHA
        order by mvar_fecha, mvar_cons  $$IBE$$*/ /* SE HACE ESTRICTAMENTE EN ORDEN DE FECHA Y REGISTRO, SI LO EDITAN CAMBIA EL ORDEN */ /*$$IBE$$ 
        into :id, :fecmv, :cant, :costo, :entrada, :tipo
        do
        if ((TIPO <> 13)) then
            EXECUTE PROCEDURE actualice_costo(:ARTICULO, :fecmv, :costo, :cant, :entrada, 'N', :id, :tipo);
    END
 $$IBE$$*/ EXIT;
end
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE CHEQUEO_INVENTARIO(
    ARTINI VARCHAR(20),
    ARTFIN VARCHAR(20))
AS
DECLARE VARIABLE FECHA DATE;
DECLARE VARIABLE CANT NUMERIC(15,4);
DECLARE VARIABLE COSTO NUMERIC(18,2);
DECLARE VARIABLE ENTRADA CHAR(1);
DECLARE VARIABLE BODEGA CHAR(2);
DECLARE VARIABLE ID INTEGER;
DECLARE VARIABLE TIPO INTEGER;
declare variable TIPOEX CHAR(1);
DECLARE VARIABLE LOTE VARCHAR(20);
DECLARE VARIABLE EXISTE CHAR(1);
declare variable ARTICULO VARCHAR(20);
declare variable IDL INTEGER;
BEGIN /*$$IBE$$ 
for select arti_cod from articulo where arti_cod >= :artini and arti_cod <= :artfin into :ARTICULO
  DO
  BEGIN
  DELETE FROM existencia_lote where arti_cod = :articulo;
  DELETE FROM lotes where arti_cod = :articulo;
  delete from costos where arti_cod = :ARTICULO;
  delete from existencia WHERE ARTI_COD = :ARTICULO;
  for select mvar_cons, mvar_fecha, mvar_cant, mvar_costo, mvar_entrada, bode_cod, mvar_tipodoc, mvar_lote
    from movimiento_articulo WHERE ARTI_COD = :ARTICULO
    order by mvar_fecha, mvar_cons
    into :id, :fecha, :cant, :costo, :entrada, :bodega, :tipo, :lote
  do
    begin
    SELECT ARTI_EXIST
        FROM   ARTICULO
        WHERE  ARTICULO.ARTI_COD = :ARTICULO
        INTO :TIPOEX;
    if ((TIPO <> 13)) then
        EXECUTE PROCEDURE actualice_costo(:ARTICULO, :fecha, :costo, :cant, :entrada, 'N', :id, :tipo);
     $$IBE$$*/ /* actualice existencias */ /*$$IBE$$ 
    if (:entrada = 'S') then
        begin
        execute procedure sume_existencia(:articulo, :bodega, :fecha, :cant, 'N');
        if (TIPOEX = 'L') then
            begin
            EXISTE = 'N';
            SELECT 'S' FROM LOTES WHERE ARTI_COD = :ARTICULO AND BODE_COD = :BODEGA AND LOTE_NRO = :lote INTO :EXISTE;
            if (EXISTE = 'S') then
                UPDATE LOTES
                    set lote_saldo = lote_saldo + :cant
                    where (arti_cod = :ARTICULO) and (BODE_COD = :BODEGA) AND (lote_nro = :lote);
            ELSE
                INSERT INTO LOTES (ARTI_COD, BODE_COD, LOTE_NRO, LOTE_FECHA, LOTE_CANT, LOTE_COSTO, LOTE_SALDO)
                    VALUES (:ARTICULO, :bodega, :lote, :fecha, :cant, :costo, :cant);
            end
        end
    else
        begin
        execute procedure reste_existencia(:articulo, :bodega, :fecha, :cant, 'N');
        if (TIPOEX = 'L') then
            begin
            EXISTE = 'N';
            SELECT 'S' FROM LOTES WHERE ARTI_COD = :ARTICULO AND BODE_COD = :BODEGA AND LOTE_NRO = :lote INTO :EXISTE;
            if (EXISTE = 'S') then
                UPDATE LOTES
                    set lote_saldo = lote_saldo - :cant
                    where (arti_cod = :ARTICULO) AND (BODE_COD = :BODEGA) and (lote_nro = :lote);
            ELSE
                BEGIN
                 $$IBE$$*/ /* ARREGLE EL LOTE YA QUE NO EXISTE */ /*$$IBE$$ 
                SELECT MIN(LOTE_ID) FROM LOTES WHERE ARTI_COD = :articulo AND BODE_COD = :BODEGA AND LOTE_CANT >= :cant INTO :IDL;
                SELECT LOTE_NRO FROM LOTES WHERE LOTE_ID = :IDL INTO :LOTE;
                UPDATE MOVIMIENTO_ARTICULO SET MVAR_LOTE = :LOTE WHERE MVAR_CONS = :ID;
                UPDATE LOTES
                    set lote_saldo = lote_saldo - :cant
                    where (arti_cod = :ARTICULO) and (BODE_COD = :BODEGA) AND (lote_nro = :lote);
                END
            EXISTE = 'N';
            SELECT 'S' FROM EXISTENCIA_LOTE
                WHERE LOTE_NRO = :LOTE AND EXLO_FECHA = :FECHA AND ARTI_COD = :ARTICULO AND BODE_COD = :bodega
                INTO :EXISTE;
            if (EXISTE = 'S') then
                UPDATE EXISTENCIA_LOTE
                       SET EXLO_SAL = EXLO_SAL + :cant
                    WHERE LOTE_NRO = :LOTE AND EXLO_FECHA = :FECHA AND ARTI_COD = :ARTICULO AND BODE_COD = :bodega;
            else
                INSERT INTO EXISTENCIA_LOTE (ARTI_COD, BODE_COD, LOTE_NRO, EXLO_FECHA, EXLO_SAL)
                    VALUES (:ARTICULO, :BODEGA, :LOTE, :FECHA, :CANT);
            end
        end
    END
  END
 $$IBE$$*/ EXIT;
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE CAMBIO_PRECIOS(
    FECHA DATE)
AS
declare variable ART VARCHAR(20);
BEGIN /*$$IBE$$ 
FOR SELECT ARTI_COD FROM ARTICULO INTO :ART DO
    EXECUTE PROCEDURE CALCULA_PRECIOS(:ART, :FECHA);
  SUSPEND;
 $$IBE$$*/ EXIT;
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE CONTABILICE_COSTO_VENTAS(
    ID INTEGER,
    IDINTER INTEGER)
RETURNS (
    IDC INTEGER)
AS
declare variable PREF VARCHAR(4);
declare variable NUM VARCHAR(6);
declare variable NUMERO VARCHAR(10);
declare variable INVEN CHAR(1);
declare variable CTAINVEN VARCHAR(20);
declare variable COSTOS CHAR(1);
declare variable CTACOSTOS VARCHAR(20);
declare variable EXISTE CHAR(1);
declare variable CUENTA VARCHAR(20);
declare variable MONTO NUMERIC(18,2);
declare variable TIPOCUEN CHAR(1);
declare variable NIT VARCHAR(20);
declare variable PROY VARCHAR(4);
declare variable CENTRO VARCHAR(4);
declare variable ART VARCHAR(15);
declare variable ANULADO CHAR(1);
declare variable NROI INTEGER;
declare variable NUMROWS INTEGER;
declare variable CONC CHAR(120);
declare variable VENCEAUX DATE;
declare variable VENCE CHAR(8);
begin
/* TRAIGA EL ID DEL ENCABEZADO DEL COMPROBANTE CONTABLE */ /*$$IBE$$ 
SELECT ENCO_CONSEC FROM COMPROBANTE_ENCABEZADO WHERE ENCO_TIPOREF = 31 AND ENCO_IDREF = :ID INTO :IDC;
SELECT MAX(CODE_ITEM) FROM COMPROBANTE_DETALLE WHERE ENCO_CONSEC = :idc INTO :NROI;
NROI = NROI + 1;
 $$IBE$$*/ /* EJECUTE LA PARTE DE CONTABIL_FACTURA QUE CORRESPONDE A LOS COSTOS */ /*$$IBE$$ 
EXISTE = 'N';
SELECT 'S', INVE_COSTO, INVE_INVEN, INVE_CTAINVEN, INVE_CTACOSTOS
    FROM INTERFAZ_VENTAS
    WHERE INVE_ID = :IDINTER
    INTO :EXISTE, :COSTOS, :INVEN, :CTAINVEN, :CTACOSTOS;
if (EXISTE = 'S') then
  BEGIN
  SELECT FACT_ANULADO, PREF_PRE, FACT_NUMERO, FACT_VENCE, TERC_NIT FROM FACTURAS F
        WHERE FACT_ID = :ID INTO :ANULADO, :PREF, :NUMERO, :VENCEAUX, :NIT;
  NUMERO = PREF || NUM;
  CONC = 'COSTO EN VENTAS FACTURA ' || :NUMERO;
  EXECUTE PROCEDURE FECHA_A_CONTA(:VENCEAUX) returning_values (:VENCE);
  if (ANULADO = 'N') then
    BEGIN
    SELECT BODE_CENTRO, BODE_PROY FROM BODEGA B, FACTURAS F, PUNTO_VENTA P
        WHERE B.BODE_COD = P.BODE_COD AND P.PTVT_ID = F.PTVT_ID AND F.FACT_ID = :ID INTO :CENTRO, :PROY;
     $$IBE$$*/ /* SE ASUME QUE NO HAN CAMBIADO LAS CUENTAS DE COSTOS, POR ESO SE HACE UPDATE A LOS MOVIMIENTOS DE ESAS CUENTAS */ /*$$IBE$$ 
    EXECUTE PROCEDURE COSTO_EN_VENTAS(31, :ID);
    if (COSTOS = 'A') then
        BEGIN
        FOR SELECT MAX(CTACOS), SUM(CANT * COSTO)
            FROM COSTO_VENTAS
            GROUP BY CTACOS
            INTO :CTACOSTOS, :MONTO
        DO
            BEGIN
            if (MONTO <> 0) then
                BEGIN
                CUENTA = NULL;
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :CTACOSTOS INTO :CUENTA, :TIPOCUEN;
                IF (CUENTA IS NULL) THEN
                    begin
                    EXCEPTION CUENTA_NO_EXISTE 'La cuenta ' || :ctacostos || ' no existe.';
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                     $$IBE$$*/ /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */ /*$$IBE$$ 
                    FOR SELECT ARTI_COD, CANT * COSTO
                        FROM COSTO_VENTAS
                        WHERE CTACOS = :CUENTA
                        INTO :ART, :MONTO
                    DO
                        BEGIN
                        SELECT COUNT(*) FROM COMPROBANTE_DETALLE WHERE CUEN_COD = :CUENTA AND ENCO_CONSEC = :IDC AND ARTI_COD = :ART INTO :NUMROWS;
                        if (NUMROWS = 0) then
                            BEGIN
                            INSERT INTO comprobante_detalle (ENCO_CONSEC, CODE_ITEM, CUEN_COD, CODE_CONCEPTO, CODE_REFER, CODE_DEBITO, CODE_CREDITO, CODE_BASE, CODE_PORC, TERC_NIT, PROY_COD, CENT_COD, CNDE_DOCNUMERO, CNDE_DOCAPLICA, DOCO_VENCE, ARTI_COD, CODE_TIPOAPL, CODE_TIPONUE)
                                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                            NROI = NROI + 1;
                            END
                        ELSE
                            UPDATE COMPROBANTE_DETALLE
                                SET CODE_DEBITO = :MONTO
                            WHERE CUEN_COD = :CUENTA AND ENCO_CONSEC = :IDC AND ARTI_COD = :ART;
                        END
                    END
                ELSE
                    BEGIN
                    SELECT COUNT(*) FROM COMPROBANTE_DETALLE WHERE CUEN_COD = :CUENTA AND ENCO_CONSEC = :IDC INTO :NUMROWS;
                    if (NUMROWS = 0) then
                        BEGIN
                        if (TIPOCUEN = 'C') then
                            INSERT INTO comprobante_detalle (ENCO_CONSEC, CODE_ITEM, CUEN_COD, CODE_CONCEPTO, CODE_REFER, CODE_DEBITO, CODE_CREDITO, CODE_BASE, CODE_PORC, TERC_NIT, PROY_COD, CENT_COD, CNDE_DOCNUMERO, CNDE_DOCAPLICA, DOCO_VENCE, ARTI_COD, CODE_TIPOAPL, CODE_TIPONUE)
                                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                        ELSE
                            INSERT INTO comprobante_detalle (ENCO_CONSEC, CODE_ITEM, CUEN_COD, CODE_CONCEPTO, CODE_REFER, CODE_DEBITO, CODE_CREDITO, CODE_BASE, CODE_PORC, TERC_NIT, PROY_COD, CENT_COD, CNDE_DOCNUMERO, CNDE_DOCAPLICA, DOCO_VENCE, ARTI_COD, CODE_TIPOAPL, CODE_TIPONUE)
                                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NROI = NROI + 1;
                        END
                    ELSE
                        UPDATE COMPROBANTE_DETALLE
                            SET CODE_DEBITO = :MONTO
                        WHERE CUEN_COD = :CUENTA AND ENCO_CONSEC = :IDC;
                    END
                END  $$IBE$$*/ /* MONTO <> 0 */ /*$$IBE$$ 
            END  $$IBE$$*/ /* FOR */ /*$$IBE$$ 
        END  $$IBE$$*/ /* COSTOS */ /*$$IBE$$ 
    if (COSTOS = 'K') then
        BEGIN
        SELECT SUM(CANT * COSTO)
            FROM COSTO_VENTAS
            INTO :MONTO;
        if (MONTO <> 0) then
            BEGIN
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTACOSTOS INTO :CUENTA, :TIPOCUEN;
            IF (CUENTA IS NULL) THEN
                begin
                EXCEPTION CUENTA_NO_EXISTE 'La cuenta ' || :ctacostos || ' no existe.';
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                 $$IBE$$*/ /* ES UNA CUENTA DE INVENTARIO, REGISTRE UNO A UNO LOS ARTICULOS */ /*$$IBE$$ 
                FOR SELECT ARTI_COD, CANT * COSTO
                    FROM COSTO_VENTAS
                    INTO :ART, :MONTO
                DO
                    BEGIN
                    SELECT COUNT(*) FROM COMPROBANTE_DETALLE WHERE CUEN_COD = :CUENTA AND ENCO_CONSEC = :IDC AND ARTI_COD = :ART INTO :NUMROWS;
                    if (NUMROWS = 0) then
                        BEGIN
                            INSERT INTO comprobante_detalle (ENCO_CONSEC, CODE_ITEM, CUEN_COD, CODE_CONCEPTO, CODE_REFER, CODE_DEBITO, CODE_CREDITO, CODE_BASE, CODE_PORC, TERC_NIT, PROY_COD, CENT_COD, CNDE_DOCNUMERO, CNDE_DOCAPLICA, DOCO_VENCE, ARTI_COD, CODE_TIPOAPL, CODE_TIPONUE)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        END
                    ELSE
                        UPDATE COMPROBANTE_DETALLE
                            SET CODE_DEBITO = :MONTO
                        WHERE CUEN_COD = :CUENTA AND ENCO_CONSEC = :IDC AND ARTI_COD = :ART;
                    END
                END
            ELSE
                BEGIN
                SELECT COUNT(*) FROM COMPROBANTE_DETALLE WHERE CUEN_COD = :CUENTA AND ENCO_CONSEC = :IDC INTO :NUMROWS;
                if (NUMROWS = 0) then
                    BEGIN
                    if (TIPOCUEN = 'C') then
                        INSERT INTO comprobante_detalle (ENCO_CONSEC, CODE_ITEM, CUEN_COD, CODE_CONCEPTO, CODE_REFER, CODE_DEBITO, CODE_CREDITO, CODE_BASE, CODE_PORC, TERC_NIT, PROY_COD, CENT_COD, CNDE_DOCNUMERO, CNDE_DOCAPLICA, DOCO_VENCE, ARTI_COD, CODE_TIPOAPL, CODE_TIPONUE)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    ELSE
                        INSERT INTO comprobante_detalle (ENCO_CONSEC, CODE_ITEM, CUEN_COD, CODE_CONCEPTO, CODE_REFER, CODE_DEBITO, CODE_CREDITO, CODE_BASE, CODE_PORC, TERC_NIT, PROY_COD, CENT_COD, CNDE_DOCNUMERO, CNDE_DOCAPLICA, DOCO_VENCE, ARTI_COD, CODE_TIPOAPL, CODE_TIPONUE)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    END
                ELSE
                    UPDATE COMPROBANTE_DETALLE
                        SET CODE_DEBITO = :MONTO
                    WHERE CUEN_COD = :CUENTA AND ENCO_CONSEC = :IDC;
                END
            END  $$IBE$$*/ /* MONTO <> 0 */ /*$$IBE$$ 
        END  $$IBE$$*/ /* COSTOS = K */ /*$$IBE$$ 
    if (INVEN = 'A') then
        BEGIN
        FOR SELECT MAX(CTAINV), SUM(CANT * COSTO)
            FROM COSTO_VENTAS
            GROUP BY CTAINV
            INTO :CTAINVEN, :MONTO
        DO
            BEGIN
            if (MONTO <> 0) then
                BEGIN
                CUENTA = NULL;
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :CTAINVEN INTO :CUENTA, :TIPOCUEN;
                IF (CUENTA IS NULL) THEN
                    begin
                    EXCEPTION CUENTA_NO_EXISTE 'La cuenta ' || :ctainven || ' no existe.';
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                     $$IBE$$*/ /* ES UNA CUENTA DE INVENTARIO, REGISTRE UNO A UNO LOS ARTICULOS */ /*$$IBE$$ 
                    FOR SELECT ARTI_COD, CANT * COSTO
                        FROM COSTO_VENTAS
                        WHERE CTAINV = :CUENTA
                        INTO :ART, :MONTO
                    DO
                        BEGIN
                        SELECT COUNT(*) FROM COMPROBANTE_DETALLE WHERE CUEN_COD = :CUENTA AND ENCO_CONSEC = :IDC AND ARTI_COD = :ART INTO :NUMROWS;
                        if (NUMROWS = 0) then
                            BEGIN
                            INSERT INTO comprobante_detalle (ENCO_CONSEC, CODE_ITEM, CUEN_COD, CODE_CONCEPTO, CODE_REFER, CODE_DEBITO, CODE_CREDITO, CODE_BASE, CODE_PORC, TERC_NIT, PROY_COD, CENT_COD, CNDE_DOCNUMERO, CNDE_DOCAPLICA, DOCO_VENCE, ARTI_COD, CODE_TIPOAPL, CODE_TIPONUE)
                                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                            NROI = NROI + 1;
                            END
                        ELSE
                            UPDATE COMPROBANTE_DETALLE
                                SET CODE_CREDITO = :MONTO
                            WHERE CUEN_COD = :CUENTA AND ENCO_CONSEC = :IDC AND ARTI_COD = :ART;
                        END
                    END
                ELSE
                    BEGIN
                    SELECT COUNT(*) FROM COMPROBANTE_DETALLE WHERE CUEN_COD = :CUENTA AND ENCO_CONSEC = :IDC INTO :NUMROWS;
                    if (NUMROWS = 0) then
                        BEGIN
                        if (TIPOCUEN = 'C') then
                            INSERT INTO comprobante_detalle (ENCO_CONSEC, CODE_ITEM, CUEN_COD, CODE_CONCEPTO, CODE_REFER, CODE_DEBITO, CODE_CREDITO, CODE_BASE, CODE_PORC, TERC_NIT, PROY_COD, CENT_COD, CNDE_DOCNUMERO, CNDE_DOCAPLICA, DOCO_VENCE, ARTI_COD, CODE_TIPOAPL, CODE_TIPONUE)
                                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                        ELSE
                            INSERT INTO comprobante_detalle (ENCO_CONSEC, CODE_ITEM, CUEN_COD, CODE_CONCEPTO, CODE_REFER, CODE_DEBITO, CODE_CREDITO, CODE_BASE, CODE_PORC, TERC_NIT, PROY_COD, CENT_COD, CNDE_DOCNUMERO, CNDE_DOCAPLICA, DOCO_VENCE, ARTI_COD, CODE_TIPOAPL, CODE_TIPONUE)
                                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NROI = NROI + 1;
                        END
                    ELSE
                        UPDATE COMPROBANTE_DETALLE
                            SET CODE_CREDITO = :MONTO
                        WHERE CUEN_COD = :CUENTA AND ENCO_CONSEC = :IDC;
                    END
                END  $$IBE$$*/ /* MONTO <> 0 */ /*$$IBE$$ 
            END  $$IBE$$*/ /* FOR */ /*$$IBE$$ 
        END  $$IBE$$*/ /* INVEN = A */ /*$$IBE$$ 
    if (INVEN = 'K') then
        BEGIN
        SELECT SUM(CANT * COSTO)
            FROM COSTO_VENTAS
            INTO :MONTO;
        if (MONTO <> 0) then
            BEGIN
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTAINVEN INTO :CUENTA, :TIPOCUEN;
            IF (CUENTA IS NULL) THEN
                begin
                EXCEPTION CUENTA_NO_EXISTE 'La cuenta ' || :ctainven || ' no existe.';
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                 $$IBE$$*/ /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */ /*$$IBE$$ 
                FOR SELECT ARTI_COD, CANT * COSTO
                    FROM COSTO_VENTAS
                    INTO :ART, :MONTO
                DO
                    BEGIN
                    SELECT COUNT(*) FROM COMPROBANTE_DETALLE WHERE CUEN_COD = :CUENTA AND ENCO_CONSEC = :IDC AND ARTI_COD = :ART INTO :NUMROWS;
                    if (NUMROWS = 0) then
                        BEGIN
                        INSERT INTO comprobante_detalle (ENCO_CONSEC, CODE_ITEM, CUEN_COD, CODE_CONCEPTO, CODE_REFER, CODE_DEBITO, CODE_CREDITO, CODE_BASE, CODE_PORC, TERC_NIT, PROY_COD, CENT_COD, CNDE_DOCNUMERO, CNDE_DOCAPLICA, DOCO_VENCE, ARTI_COD, CODE_TIPOAPL, CODE_TIPONUE)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        END
                    ELSE
                        UPDATE COMPROBANTE_DETALLE
                            SET CODE_CREDITO = :MONTO
                        WHERE CUEN_COD = :CUENTA AND ENCO_CONSEC = :IDC AND ARTI_COD = :ART;
                    END
                END
            ELSE
                BEGIN
                SELECT COUNT(*) FROM COMPROBANTE_DETALLE WHERE CUEN_COD = :CUENTA AND ENCO_CONSEC = :IDC INTO :NUMROWS;
                if (NUMROWS = 0) then
                    BEGIN
                    if (TIPOCUEN = 'C') then
                        INSERT INTO comprobante_detalle (ENCO_CONSEC, CODE_ITEM, CUEN_COD, CODE_CONCEPTO, CODE_REFER, CODE_DEBITO, CODE_CREDITO, CODE_BASE, CODE_PORC, TERC_NIT, PROY_COD, CENT_COD, CNDE_DOCNUMERO, CNDE_DOCAPLICA, DOCO_VENCE, ARTI_COD, CODE_TIPOAPL, CODE_TIPONUE)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    ELSE
                        INSERT INTO comprobante_detalle (ENCO_CONSEC, CODE_ITEM, CUEN_COD, CODE_CONCEPTO, CODE_REFER, CODE_DEBITO, CODE_CREDITO, CODE_BASE, CODE_PORC, TERC_NIT, PROY_COD, CENT_COD, CNDE_DOCNUMERO, CNDE_DOCAPLICA, DOCO_VENCE, ARTI_COD, CODE_TIPOAPL, CODE_TIPONUE)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    END
                ELSE
                    UPDATE COMPROBANTE_DETALLE
                        SET CODE_CREDITO = :MONTO
                    WHERE CUEN_COD = :CUENTA AND ENCO_CONSEC = :IDC;
                END
            END  $$IBE$$*/ /* MONTO <> 0 */ /*$$IBE$$ 
        END  $$IBE$$*/ /* INVEN = K */ /*$$IBE$$ 
    END
  END
 $$IBE$$*/ SUSPEND;
end
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE CONTABIL_DEVOLCLI(
    IDDOC INTEGER,
    IDINTER INTEGER)
RETURNS (
    ERROR INTEGER,
    VER CHAR(1),
    IDC INTEGER)
AS
declare variable PREF VARCHAR(4);
declare variable NUM VARCHAR(6);
declare variable NUMERO VARCHAR(10);
declare variable FECAUX DATE;
declare variable FECHA CHAR(8);
declare variable CONC CHAR(120);
declare variable NUMFAC VARCHAR(10);
declare variable VRDTO NUMERIC(18, 2);
declare variable VRADIC NUMERIC(18, 2);
declare variable VRSUBT NUMERIC(18, 2);
declare variable VRIVA NUMERIC(18, 2);
declare variable PRTFTE NUMERIC(9, 2);
declare variable VRRTFTE NUMERIC(18, 2);
declare variable VRRTIVA NUMERIC(18, 2);
declare variable PRTICA NUMERIC(9, 2);
declare variable VRRTICA NUMERIC(18, 2);
declare variable VRTOTAL NUMERIC(18, 2);
declare variable VREXTRA NUMERIC(18, 2);
declare variable TIPOCOMP VARCHAR(3);
declare variable PREFCONT VARCHAR(4);
declare variable VENTAS CHAR(1);
declare variable CTAVENTAS VARCHAR(20);
declare variable IVA CHAR(1);
declare variable CTAIVA VARCHAR(20);
declare variable CONSUMO CHAR(1);
declare variable CTACONSUMO VARCHAR(20);
declare variable CARTERA CHAR(1);
declare variable CTACARTERA VARCHAR(20);
declare variable RTFTE CHAR(1);
declare variable CTARTFTE VARCHAR(20);
declare variable RTIVA CHAR(1);
declare variable CTARTIVA VARCHAR(20);
declare variable RTICA CHAR(1);
declare variable CTARTICA VARCHAR(20);
declare variable INVEN CHAR(1);
declare variable CTAINVEN VARCHAR(20);
declare variable COSTOS CHAR(1);
declare variable CTACOSTOS VARCHAR(20);
declare variable CTADTO VARCHAR(20);
declare variable CTAADIC VARCHAR(20);
declare variable CTAEXTRA VARCHAR(20);
declare variable EXISTE CHAR(1);
declare variable CUENTA VARCHAR(20);
declare variable MONTO NUMERIC(18,2);
declare variable TIPOCUEN CHAR(1);
declare variable NIT VARCHAR(20);
declare variable PROY VARCHAR(4);
declare variable CENTRO VARCHAR(4);
declare variable PORC NUMERIC(5,2);
declare variable DEBITO NUMERIC(18,2);
declare variable CREDITO NUMERIC(18,2);
declare variable NROI INTEGER;
declare variable ART VARCHAR(15);
declare variable IMPINC CHAR(1);
declare variable IMPTOS NUMERIC(18, 2);
declare variable SUMA NUMERIC(18,2);
declare variable PORCIVA NUMERIC(9,2);
declare variable TCTACLIEN VARCHAR(20);
declare variable TCTAVENTA VARCHAR(20);
declare variable TCTARTFTE VARCHAR(20);
declare variable TCTARTIVA VARCHAR(20);
declare variable TCTARTICA VARCHAR(20);
declare variable CTADIC VARCHAR(20);
declare variable BASEADIC VARCHAR(20);
declare variable PORCADIC NUMERIC(5,2);
declare variable VALORADIC NUMERIC(18,2);
declare variable DBADIC CHAR(1);
declare variable PTOVTA INTEGER;
declare variable ANULADO CHAR(1);
declare variable CENT CHAR(1);
DECLARE VARIABLE MERCANCIA NUMERIC(18,2);
declare variable FACTOR DOUBLE PRECISION;
declare variable DIG INTEGER;
DECLARE VARIABLE FOMENTO VARCHAR(2);
DECLARE VARIABLE VRCONSUMO NUMERIC(18,2);
declare variable AUTORET VARCHAR(10);
declare variable FAUTORET DATE;
declare variable IDREM INTEGER;
declare variable DTOXIT CHAR(2);
declare variable ERRORC INTEGER;
BEGIN /*$$IBE$$ 
EXECUTE PROCEDURE LEE_CONFIGURACION('COMPRAS', 'FACTURAS', 'USAR IMPOCONSUMO COMO PORCENTAJE DE FOMENTO') returning_values (FOMENTO);
EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'FECHA AUTORETENEDOR NO DESCONTAR RETENCIONES DEL SALDO PERO SI CONTABILIZARLAS') returning_values (AUTORET);
if (AUTORET <> '') then
    FAUTORET = CAST(AUTORET AS DATE);
else
    FAUTORET = '9999/12/31';
   $$IBE$$*/ /* BUSQUE LA INTERFACE */ /*$$IBE$$ 
  EXISTE = 'N';
  SELECT 'S', TICO_COD, PRCO_PRE, INVE_VENTAS, INVE_IVA, INVE_CONSUMO, INVE_CARTERA, INVE_RTFTE, INVE_RTIVA, INVE_RTICA, INVE_COSTO, INVE_INVEN, INVE_CTAVENTAS, INVE_CTAIVA, INVE_CTACONSUMO, INVE_CTADTO, INVE_CTAADIC, INVE_CTAEXTRA, INVE_CTACARTERA, INVE_CTARTFTE, INVE_CTARTIVA, INVE_CTARTICA, INVE_CTAINVEN, INVE_CTACOSTOS, INVE_CONFIRMAR, INVE_CENTRO
    FROM INTERFAZ_VENTAS
    WHERE INVE_ID = :IDINTER
    INTO :EXISTE, :TIPOCOMP, :PREFCONT, :VENTAS, :IVA, :CONSUMO, :CARTERA, :RTFTE, :RTIVA, :RTICA, :COSTOS, :INVEN, :CTAVENTAS, :CTAIVA, :CTACONSUMO, :CTADTO, :CTAADIC, :CTAEXTRA, :CTACARTERA, :CTARTFTE, :CTARTIVA, :CTARTICA, :CTAINVEN, :CTACOSTOS, :VER, :CENT;
  if (EXISTE = 'S') then
   BEGIN
     $$IBE$$*/ /* BORRE CUALQUEIR CONTABILIZACION PREVIA */ /*$$IBE$$ 
    DELETE FROM CONTABILIZACION WHERE CNTB_TIPOREF = 33 AND CNTB_IDREF = :IDDOC;
     $$IBE$$*/ /* TRAIGA EL ENCABEZADO DE LA DEVOLUCION */ /*$$IBE$$ 
   SELECT PREF_PRE, DEVT_NUMERO, DEVT_FECHA, F.TERC_NIT, DEVT_IVAINC, PTVT_ID, DEVT_FACTURA, DEVT_DTOMONTO, DEVT_ADICIONAL, DEVT_IVAMONTO, DEVT_EXTRA, DEVT_TOTAL, DEVT_RTFTEPORC, DEVT_RTFTEMONTO, DEVT_RTIVAPORC, DEVT_RTIVAMONTO, DEVT_RTICAPORC, DEVT_RTICAMONTO, TERC_CTARTFTE, TERC_CTARTIVA, TERC_CTARTICA, TERC_CTAVENTA, TERC_CTACLIENTE, DEVT_ANULADO, DEVT_REMID
        FROM DEVOLUCIONES_VENTAS F, TERCEROS T
        WHERE DEVT_ID = :IDDOC AND F.TERC_NIT = T.TERC_NIT
        INTO :PREF, :NUM, :FECAUX, :NIT, :IMPINC, :PTOVTA, :NUMFAC, :VRDTO, :VRADIC, :VRIVA, :VREXTRA, :VRTOTAL, :PRTFTE, :VRRTFTE, :PORC, :VRRTIVA, :PRTICA, :VRRTICA, :TCTARTFTE, TCTARTIVA, TCTARTICA, TCTAVENTA, TCTACLIEN, ANULADO, :IDREM;
   if (idrem is null) Then
    IDREM = 0;
   if ((ANULADO = 'N') AND (IDREM = 0)) then
    BEGIN
    NUMERO = PREF || NUM;
    SELECT SUM(DVDE_CONSUMO) FROM devoluciones_ventas_detalle WHERE DEVT_ID = :iddoc AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL)) INTO :MERCANCIA;
    VRSUBT = VRTOTAL - VREXTRA - VRIVA - MERCANCIA;  $$IBE$$*/ /* BASE DE RETEFTE Y RETEICA */ /*$$IBE$$ 
    EXECUTE PROCEDURE lee_configuracion ('FACTURACION', 'DEVOLUCIONES', 'DESCUENTO PIE DEVOLUCION IGUAL A SUMA DE DESCUENTOS POR ITEM') returning_values (:DTOXIT);
    if (DTOXIT = 'SI') then
        VRDTO = 0;
    MERCANCIA = VRSUBT - VRADIC + VRDTO;
    IF (CENT = 'B') THEN
        SELECT B.BODE_CENTRO, B.BODE_PROY FROM BODEGA B, DEVOLUCIONES_VENTAS F
            WHERE B.BODE_COD = F.BODE_COD AND F.DEVT_ID = :IDDOC INTO :CENTRO, :PROY;
    IF (CENT = 'V') THEN
        SELECT V.CENT_COD, V.PROY_COD FROM VENDEDORES V, DEVOLUCIONES_VENTAS F
            WHERE V.VEND_COD = F.VEND_COD AND F.DEVT_ID = :IDDOC INTO :CENTRO, :PROY;
    IF (CENT = 'P') THEN
        SELECT P.PREF_CENTRO,P.PREF_PROY  FROM PREFIJOS P, DEVOLUCIONES_VENTAS F
            WHERE P.PREF_PRE = F.PREF_PRE AND F.DEVT_ID = :IDDOC AND P.TIDO_COD = 33 INTO :CENTRO, :PROY;
    EXECUTE PROCEDURE FECHA_A_CONTA(:FECAUX) returning_values (:FECHA);
     $$IBE$$*/ /* REGISTRE EL ENCABEZADO CONTABLE */ /*$$IBE$$ 
    IDC = GEN_ID(ID_CONTABILIZA, 1);
    CONC = 'DEVOLUCION VENTAS No. ' || NUMERO || ' EN FACTURA ' || NUMFAC;
    CONC = SUBSTR(CONC, 1, 60);
    INSERT INTO CONTABILIZACION (CNTB_ID, CNTB_TIPOCOMP, CNTB_PREFCNT, CNTB_NUMERO, CNTB_FECHA, CNTB_CONCEPTO, CNTB_REF, CNTB_TIPOREF, CNTB_IDREF, CNTB_PREFREF, CNTB_NUMREF, CNTB_PROCESADO)
        VALUES (:IDC, :TIPOCOMP, :PREFCONT, :NUM, :FECHA, :CONC, '', 33, :IDDOC, :PREF, :NUM, 'N');
    NROI = 0;
    SUMA = 0;
    ERROR = 0;
     $$IBE$$*/ /* SI NO HAY CUENTA DE DESCUENTO NI ADICIONAL CALCULE UN FACTOR PARA LAS VENTAS Y EL IVA */ /*$$IBE$$ 
    if (MERCANCIA <> 0) then
        FACTOR = CAST(VRSUBT AS DOUBLE PRECISION) / CAST(MERCANCIA AS DOUBLE PRECISION);
    ELSE
        FACTOR = 1;
     $$IBE$$*/ /* TRAIGA EL NUMERO DE DIGITOS PARA EL REDONDEO */ /*$$IBE$$ 
    SELECT CAST(CONF_VALOR AS INTEGER) FROM CONFIGURACION WHERE CONF_MODULO = 'FACTURACION' AND
        CONF_CATEGORIA = 'GENERAL' AND CONF_PROPIEDAD = 'REDONDEO AL MULTIPLO DE DIEZ EN TOTALES' INTO :DIG;
     $$IBE$$*/ /* CUENTAS DE VENTAS */ /*$$IBE$$ 
    if (VENTAS = 'A') then
        BEGIN
        FOR SELECT MAX(COAR_CTADEV), SUM(cast(DVDE_CANT as double precision) * (DVDE_PRUNIT-DVDE_DTOMONTO)), SUM(DVDE_IVAMONTO), SUM(DVDE_CONSUMO)
            FROM ARTICULO A, CONTABIL_ARTICULO C, DEVOLUCIONES_VENTAS_DETALLE F
            WHERE F.DEVT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
            GROUP BY COAR_CTADEV
            INTO :CTAVENTAS, :MONTO, :IMPTOS, :VRCONSUMO
            DO
            BEGIN
            if (IMPINC = 'S') then
                if (FOMENTO = 'SI') then
                    MONTO = MONTO - IMPTOS;
                ELSE
                    MONTO = MONTO - IMPTOS - VRCONSUMO;
            ELSE
            if (FOMENTO = 'SI') then
            MONTO = MONTO + VRCONSUMO;
            if ((CTADTO IS NULL) OR (CTADTO = '')) then
                MONTO = MONTO * FACTOR;
            execute procedure redondee(MONTO, DIG) returning_values (MONTO);
            if (MONTO <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTAVENTAS, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                     $$IBE$$*/ /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */ /*$$IBE$$ 
                    FOR SELECT F.ARTI_COD, (cast(DVDE_CANT as double precision) * (DVDE_PRUNIT-DVDE_DTOMONTO)), (DVDE_IVAMONTO+DVDE_CONSUMO)
                        FROM ARTICULO A, CONTABIL_ARTICULO C, DEVOLUCIONES_VENTAS_DETALLE F
                        WHERE F.DEVT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTAINV = :CUENTA AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
                        INTO :ART, :MONTO, :IMPTOS
                    DO
                        BEGIN
                        if (IMPINC = 'S') then
                            MONTO = MONTO - IMPTOS;
                        if ((CTADTO IS NULL) OR (CTADTO = '')) then
                            MONTO = MONTO * FACTOR;
                        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        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, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                    NROI = NROI + 1;
                    SUMA = SUMA + MONTO;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA + MONTO;
                    END
                END  $$IBE$$*/ /* MONTO <> 0 */ /*$$IBE$$ 
            END  $$IBE$$*/ /* FOR */ /*$$IBE$$ 
        END  $$IBE$$*/ /* VENTAS X ARTICULO */ /*$$IBE$$ 
     IF ((VENTAS = 'C') OR (VENTAS = 'K')) THEN
        BEGIN
        IF (VENTAS = 'C') THEN
            CTAVENTAS = TCTAVENTA;
        SELECT SUM(cast(DVDE_CANT as double precision) * (DVDE_PRUNIT-DVDE_DTOMONTO)), SUM(DVDE_IVAMONTO), SUM(DVDE_CONSUMO)
            FROM DEVOLUCIONES_VENTAS_DETALLE F
            WHERE F.DEVT_ID = :IDDOC  AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
            INTO :MONTO, :IMPTOS, :VRCONSUMO;
        if (IMPINC = 'S') then
            if (FOMENTO = 'SI') then
               MONTO = MONTO - IMPTOS;
            ELSE
               MONTO = MONTO - IMPTOS - VRCONSUMO;
        ELSE
         if (FOMENTO = 'SI') then
          MONTO = MONTO + VRCONSUMO;
        if ((CTADTO IS NULL) OR (CTADTO = '')) then
            MONTO = MONTO * FACTOR;
        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
        if (MONTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTAVENTAS, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'I') then
                BEGIN
                 $$IBE$$*/ /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */ /*$$IBE$$ 
                FOR SELECT F.ARTI_COD, (cast(DVDE_CANT as double precision) * (DVDE_PRUNIT-DVDE_DTOMONTO)), (DVDE_IVAMONTO+DVDE_CONSUMO)
                    FROM ARTICULO A, DEVOLUCIONES_VENTAS_DETALLE F
                    WHERE F.DEVT_ID = :IDDOC AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
                    INTO :ART, :MONTO, :IMPTOS
                    DO
                    BEGIN
                    if (IMPINC = 'S') then
                        MONTO = MONTO - IMPTOS;
                    if ((CTADTO IS NULL) OR (CTADTO = '')) then
                        MONTO = MONTO * FACTOR;
                    execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                    NROI = NROI + 1;
                    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, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                NROI = NROI + 1;
                SUMA = SUMA + MONTO;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA + MONTO;
                END
            END  $$IBE$$*/ /* MONTO <> 0 */ /*$$IBE$$ 
        END  $$IBE$$*/ /* VENTAS DE CLIENTE O CONSTANTE */
    /* EL IVA EN VENTAS */ /*$$IBE$$ 
    if (IVA = 'A') then
        BEGIN
        FOR SELECT MAX(COAR_CTAIVAV), SUM(DVDE_IVAMONTO), SUM(DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO), SUM(DVDE_CONSUMO)
            FROM ARTICULO A, CONTABIL_ARTICULO C, DEVOLUCIONES_VENTAS_DETALLE F
            WHERE F.DEVT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
            GROUP BY COAR_CTAIVAV
            INTO :CTAIVA, :IMPTOS, :MONTO, :VALORADIC
        DO
            BEGIN
            if (FOMENTO = 'SI') then
                MONTO = MONTO + VALORADIC;
            MONTO = MONTO * -1;
            MONTO = MONTO * FACTOR;
            IMPTOS = IMPTOS * FACTOR;
            execute procedure redondee(MONTO, DIG) returning_values (MONTO);
            execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
            if (IMPTOS <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTAIVA, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                     $$IBE$$*/ /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */ /*$$IBE$$ 
                    FOR SELECT F.ARTI_COD, DVDE_IVAMONTO, (cast(DVDE_CANT as double precision) * (DVDE_PRUNIT-DVDE_DTOMONTO)), TAIV_PORC, DVDE_CONSUMO
                        FROM ARTICULO A, CONTABIL_ARTICULO C, DEVOLUCIONES_VENTAS_DETALLE F, TARIFA_IVA T
                        WHERE F.DEVT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND A.TAIV_COD = T.TAIV_COD AND COAR_CTAIVAV = :CUENTA AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
                        INTO :ART, :IMPTOS, :MONTO, :PORCIVA, :VALORADIC
                    DO
                        BEGIN
                        if (IMPINC = 'S') then
                            MONTO = MONTO - IMPTOS - VALORADIC;
                        MONTO = MONTO * -1;
                        MONTO = MONTO * FACTOR;
                        IMPTOS = IMPTOS * FACTOR;
                        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                        execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                        if (IMPTOS <> 0) then
                            BEGIN
                            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :IMPTOS, 0, :MONTO, :PORCIVA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                            NROI = NROI + 1;
                            SUMA = SUMA + IMPTOS;
                            END
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                    NROI = NROI + 1;
                    SUMA = SUMA + IMPTOS;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA + IMPTOS;
                    END
                END    $$IBE$$*/ /* IMPTOS <> 0 */ /*$$IBE$$ 
            END  $$IBE$$*/ /* FOR */ /*$$IBE$$ 
        END  $$IBE$$*/ /* IVA X ARTICULO */ /*$$IBE$$ 
    if (IVA = 'K') then  $$IBE$$*/ /* IVA EN CTA CONSTANTE */ /*$$IBE$$ 
        BEGIN
        SELECT SUM(DVDE_IVAMONTO), SUM(DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO), SUM(DVDE_CONSUMO)
            FROM DEVOLUCIONES_VENTAS_DETALLE F
            WHERE F.DEVT_ID = :IDDOC  AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
            INTO :IMPTOS, :MONTO, :VALORADIC;
        if (FOMENTO = 'SI') then
            MONTO = MONTO + VALORADIC;
        MONTO = MONTO * -1;
        MONTO = MONTO * FACTOR;
        IMPTOS = IMPTOS * FACTOR;
        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
        execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
        if (IMPTOS <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTAIVA, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'I') then
                BEGIN
                 $$IBE$$*/ /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */ /*$$IBE$$ 
                FOR SELECT F.ARTI_COD, (cast(DVDE_CANT as double precision) * (DVDE_PRUNIT-DVDE_DTOMONTO)), DVDE_IVAMONTO, TAIV_PORC, DVDE_CONSUMO
                    FROM ARTICULO A, DEVOLUCIONES_VENTAS_DETALLE F, TARIFA_IVA T
                    WHERE F.DEVT_ID = :IDDOC AND A.TAIV_COD = T.TAIV_COD AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
                    INTO :ART, :MONTO, :IMPTOS, :PORCIVA, :VALORADIC
                    DO
                    BEGIN
                    if (IMPINC = 'S') then
                        MONTO = MONTO - IMPTOS - VALORADIC;
                    MONTO = MONTO * -1;
                    MONTO = MONTO * FACTOR;
                    IMPTOS = IMPTOS * FACTOR;
                    execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                    execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                    if (IMPTOS <> 0) then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', :IMPTOS, 0, :MONTO, :PORCIVA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        SUMA = SUMA + IMPTOS;
                        END
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                NROI = NROI + 1;
                SUMA = SUMA + IMPTOS;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA + IMPTOS;
                END
            END  $$IBE$$*/ /* IMPTOS <> 0 */ /*$$IBE$$ 
        END  $$IBE$$*/ /* IVA EN CTA CONSTANTE */
    /* EL IMPOCONSUMO */ /*$$IBE$$ 
    if ((CONSUMO = 'A') AND (FOMENTO <> 'SI')) then
        BEGIN
        FOR SELECT MAX(COAR_CTACONS), SUM(DVDE_CONSUMO)
            FROM ARTICULO A, CONTABIL_ARTICULO C, DEVOLUCIONES_VENTAS_DETALLE F
            WHERE F.DEVT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
            GROUP BY COAR_CTACONS
            INTO :CTACONSUMO, :IMPTOS
        DO
            BEGIN
            if (IMPTOS <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTACONSUMO, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                     $$IBE$$*/ /* ES UNA CUENTA DE INVENTARIO, REGISTRE UNO A UNO LOS ARTICULOS */ /*$$IBE$$ 
                    FOR SELECT F.ARTI_COD, DVDE_CONSUMO
                        FROM ARTICULO A, CONTABIL_ARTICULO C, DEVOLUCIONES_VENTAS_DETALLE F
                        WHERE F.DEVT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTACONS = :CUENTA AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
                        INTO :ART, :IMPTOS
                    DO
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 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, :NROI, :CUENTA, :CONC, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                    NROI = NROI + 1;
                    SUMA = SUMA + IMPTOS;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA + IMPTOS;
                    END
                END  $$IBE$$*/ /* IMPTOS <> 0 */ /*$$IBE$$ 
            END  $$IBE$$*/ /* FOR */ /*$$IBE$$ 
        END  $$IBE$$*/ /* CONSUMO X ARTICULO */ /*$$IBE$$ 
    if ((CONSUMO = 'K') AND (FOMENTO <> 'SI')) then
        BEGIN
        SELECT SUM(DVDE_CONSUMO)
            FROM DEVOLUCIONES_VENTAS_DETALLE F
            WHERE F.DEVT_ID = :IDDOC AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
            INTO :IMPTOS;
        if (IMPTOS <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTACONSUMO, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'I') then
                BEGIN
                 $$IBE$$*/ /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */ /*$$IBE$$ 
                FOR SELECT F.ARTI_COD, DVDE_CONSUMO
                    FROM ARTICULO A, DEVOLUCIONES_VENTAS_DETALLE F
                    WHERE F.DEVT_ID = :IDDOC  AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
                    INTO :ART, :IMPTOS
                    DO
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTACONSUMO, :CONC, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                    NROI = NROI + 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, :NROI, :CTACONSUMO, :CONC, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA + IMPTOS;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTACONSUMO, :CONC, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA + IMPTOS;
                END
            END  $$IBE$$*/ /* IMPTOS <> 0 */ /*$$IBE$$ 
        END  $$IBE$$*/ /* CONSUMO EN CTA CONSTANTE */
    /* DESCUENTO */ /*$$IBE$$ 
    if ((CTADTO IS NOT NULL) AND
        (CTADTO <> '') AND
        (VRDTO <> 0)) THEN
        BEGIN
        EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTADTO, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRDTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
            NROI = NROI + 1;
            SUMA = SUMA - VRDTO;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRDTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 33);
            NROI = NROI + 1;
            SUMA = SUMA - VRDTO;
            END
        END  $$IBE$$*/ /* DESCUENTO */
    /* VALOR ADIC */ /*$$IBE$$ 
    if ((CTAADIC IS NOT NULL) AND
        (CTAADIC <> '') AND
        (VRADIC <> 0)) THEN
        BEGIN
        EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTAADIC, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRADIC, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
            NROI = NROI + 1;
            SUMA = SUMA + VRADIC;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRADIC, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 33);
            NROI = NROI + 1;
            SUMA = SUMA + VRADIC;
            END
        END  $$IBE$$*/ /* VR. ADIC */
    /* VALOR EXTRA */ /*$$IBE$$ 
    if ((CTAEXTRA IS NOT NULL) AND
        (CTAEXTRA <> '') AND
        (VREXTRA <> 0)) THEN
        BEGIN
        EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTAEXTRA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VREXTRA, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
            NROI = NROI + 1;
            SUMA = SUMA + VREXTRA;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VREXTRA, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 33);
            NROI = NROI + 1;
            SUMA = SUMA + VREXTRA;
            END
        END  $$IBE$$*/ /* VR. EXTRA */
    /* RETENCION FUENTE */ /*$$IBE$$ 
    if ((RTFTE = 'C') or (RTFTE = 'K')) then
      if (VRRTFTE <> 0) then
        BEGIN
        if (RTFTE = 'C') then
            CTARTFTE = TCTARTFTE;
        EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTARTFTE, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, (:VRSUBT*-1), :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
            NROI = NROI + 1;
            SUMA = SUMA - VRRTFTE;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, (:VRSUBT*-1), :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA - VRRTFTE;
            END
         $$IBE$$*/ /* AUTORETENCION */ /*$$IBE$$ 
        if (FAUTORET <= fecaux) then
            BEGIN
            EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'CUENTA DE AUTORETENCION EN LA FUENTE') returning_values (CTARTFTE);
            EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTARTFTE, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :VRSUBT, :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                NROI = NROI + 1;
                SUMA = SUMA + VRRTFTE;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :VRSUBT, :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA + VRRTFTE;
                END
            END
        END  $$IBE$$*/ /* RTFTE */ /*$$IBE$$ 
    if (RTFTE = 'A') then
      BEGIN
      FOR SELECT MAX(COAR_CTARTFTEV), MAX(COAR_RTFTE), MIN(COAR_RTBASE), SUM(DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO), SUM((DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO)*COAR_RTFTE)
        FROM CONTABIL_ARTICULO C, devoluciones_ventas_detalle F
        WHERE F.devt_id = :IDDOC AND F.ARTI_COD = C.ARTI_COD AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
        GROUP BY COAR_CTARTFTEV
        INTO :CTARTFTE, :PRTFTE, :baseadic, :MONTO, :VRRTFTE
        DO
        BEGIN
        MONTO = MONTO * FACTOR;
        if (MONTO >= BASEADIC) then
            BEGIN
            VRRTFTE = VRRTFTE * FACTOR / 100;
            execute procedure redondee(VRRTFTE, DIG) returning_values (VRRTFTE);
            execute procedure redondee(MONTO, DIG) returning_values (MONTO);
            if (VRRTFTE <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTARTFTE, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, (:MONTO*-1), :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                    NROI = NROI + 1;
                    SUMA = SUMA - VRRTFTE;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, (:MONTO*-1), :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA - VRRTFTE;
                    END
                 $$IBE$$*/ /* AUTORETENCION */ /*$$IBE$$ 
                if (FAUTORET <= fecaux) then
                    BEGIN
                    EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'CUENTA DE AUTORETENCION EN LA FUENTE') returning_values (CTARTFTE);
                    EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTARTFTE, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
                    if (ERRORC <> 0) then
                        ERROR = ERROR + 1;
                    if (TIPOCUEN = 'C') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :MONTO, :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                        NROI = NROI + 1;
                        SUMA = SUMA + VRRTFTE;
                        END
                    if (TIPOCUEN = 'N') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :MONTO, :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NROI = NROI + 1;
                        SUMA = SUMA + VRRTFTE;
                        END
                    END
                END
            END
        END  $$IBE$$*/ /* RTFTE */ /*$$IBE$$ 
      END
     $$IBE$$*/ /* RETENCION IVA */ /*$$IBE$$ 
    if ((RTIVA = 'C') or (RTIVA = 'K')) then
      if (VRRTIVA <> 0) then
        BEGIN
        if (RTIVA = 'C') then
            CTARTIVA = TCTARTIVA;
        EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTARTIVA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTIVA, (:VRIVA*-1), :PORC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
            NROI = NROI + 1;
            SUMA = SUMA - VRRTIVA;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTIVA, (:VRIVA*-1), :PORC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA - VRRTIVA;
            END
        END  $$IBE$$*/ /* RTIVA */
    /* RETENCION DE ICA */ /*$$IBE$$ 
    if ((RTICA = 'C') or (RTICA = 'K')) then
      if (VRRTICA <> 0) then
        BEGIN
        if (RTICA = 'C') then
            CTARTICA = TCTARTICA;
        EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTARTICA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTICA, (:VRSUBT*-1), :PRTICA, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
            NROI = NROI + 1;
            SUMA = SUMA - VRRTICA;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTICA, (:VRSUBT*-1), :PRTICA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA - VRRTICA;
            END
        END  $$IBE$$*/ /* RTICA */
    /* CIERRE EL COMPROBANTE CONTRA LA CUENTA DEL TERCERO O LA CONSTANTE */ /*$$IBE$$ 
    if ((SUMA <> 0) and ((CARTERA = 'C') or (CARTERA = 'K') or (CARTERA = 'J'))) then
        BEGIN
        if (SUMA < 0) then
            BEGIN
            DEBITO = SUMA * -1;
            CREDITO = 0;
            END
        ELSE
            BEGIN
            DEBITO = 0;
            CREDITO = SUMA;
            END
        if (CARTERA = 'C') then
            CTACARTERA = TCTACLIEN;
        if (CARTERA = 'J') then
            BEGIN
             $$IBE$$*/ /* BUSQUE LA CUENTA DE LA CAJA */ /*$$IBE$$ 
            SELECT CAJA_CUENTA FROM CAJAS C, PUNTO_VENTA P
                WHERE P.CAJA_ID = C.CAJA_ID AND PTVT_ID = :PTOVTA
                INTO :CTACARTERA;
            END
        EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTACARTERA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :DEBITO, :CREDITO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
        if (TIPOCUEN = 'N') then
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :DEBITO, :CREDITO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
        NROI = NROI + 1;
        END  $$IBE$$*/ /* SUMA EN CARTERA */
    /* CALCULE COSTOS EN VENTAS */ /*$$IBE$$ 
    EXECUTE PROCEDURE COSTO_EN_VENTAS(33, :IDDOC);
    if (COSTOS = 'A') then
        BEGIN
        FOR SELECT MAX(CTACOS), SUM(cast(CANT as double precision) * COSTO)
            FROM COSTO_VENTAS
            GROUP BY CTACOS
            INTO :CTACOSTOS, :MONTO
        DO
            BEGIN
            if (MONTO <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTACOSTOS, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                     $$IBE$$*/ /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */ /*$$IBE$$ 
                    FOR SELECT ARTI_COD, cast(CANT as double precision) * COSTO
                        FROM COSTO_VENTAS
                        WHERE CTACOS = :CUENTA
                        INTO :ART, :MONTO
                    DO
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                    NROI = NROI + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    END
                END  $$IBE$$*/ /* MONTO <> 0 */ /*$$IBE$$ 
            END  $$IBE$$*/ /* FOR */ /*$$IBE$$ 
        END  $$IBE$$*/ /* COSTOS */ /*$$IBE$$ 
    if (COSTOS = 'K') then
        BEGIN
        SELECT SUM(cast(CANT as double precision) * COSTO)
            FROM COSTO_VENTAS
            INTO :MONTO;
        if (MONTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTACOSTOS, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'I') then
                BEGIN
                 $$IBE$$*/ /* ES UNA CUENTA DE INVENTARIO, REGISTRE UNO A UNO LOS ARTICULOS */ /*$$IBE$$ 
                FOR SELECT ARTI_COD, cast(CANT as double precision) * COSTO
                    FROM COSTO_VENTAS
                    INTO :ART, :MONTO
                DO
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTACOSTOS, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                    NROI = NROI + 1;
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTACOSTOS, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                NROI = NROI + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTACOSTOS, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                END
            END  $$IBE$$*/ /* MONTO <> 0 */ /*$$IBE$$ 
        END  $$IBE$$*/ /* COSTOS = K */ /*$$IBE$$ 
    if (INVEN = 'A') then
        BEGIN
        FOR SELECT MAX(CTAINV), SUM(cast(CANT as double precision) * COSTO)
            FROM COSTO_VENTAS
            GROUP BY CTAINV
            INTO :CTAINVEN, :MONTO
        DO
            BEGIN
            if (MONTO <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTAINVEN, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                     $$IBE$$*/ /* ES UNA CUENTA DE INVENTARIO, REGISTRE UNO A UNO LOS ARTICULOS */ /*$$IBE$$ 
                    FOR SELECT ARTI_COD, cast(CANT as double precision) * COSTO
                        FROM COSTO_VENTAS
                        WHERE CTAINV = :CUENTA
                        INTO :ART, :MONTO
                    DO
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                    NROI = NROI + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    END
                END  $$IBE$$*/ /* MONTO <> 0 */ /*$$IBE$$ 
            END  $$IBE$$*/ /* FOR */ /*$$IBE$$ 
        END  $$IBE$$*/ /* INVEN = A */ /*$$IBE$$ 
    if (INVEN = 'K') then
        BEGIN
        SELECT SUM(cast(CANT as double precision) * COSTO)
            FROM COSTO_VENTAS
            INTO :MONTO;
        if (MONTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTAINVEN, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'I') then
                BEGIN
                 $$IBE$$*/ /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */ /*$$IBE$$ 
                FOR SELECT ARTI_COD, cast(CANT as double precision) * COSTO
                    FROM COSTO_VENTAS
                    INTO :ART, :MONTO
                DO
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTAINVEN, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                    NROI = NROI + 1;
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAINVEN, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                NROI = NROI + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAINVEN, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                END
            END  $$IBE$$*/ /* MONTO <> 0 */ /*$$IBE$$ 
        END  $$IBE$$*/ /* INVEN = K */
    /* recorra las cuentas adicionales */ /*$$IBE$$ 
    FOR SELECT INVC_CUENTA, INVC_BASE, INVC_PORC, INVC_VALOR, INVC_DB
        FROM INTERFAZ_VENTAS_CTAS WHERE INVE_ID = :IDINTER
        INTO :CTADIC, :BASEADIC, :PORCADIC, :VALORADIC, :DBADIC
        DO
        BEGIN
        if (valoradic <> 0) then
            monto = valoradic;
        else
            BEGIN
            if (:BASEADIC = 'SUBTOTAL') then
                VALORADIC = vrsubt;
            if (:BASEADIC = 'DESCUENTO') then
                VALORADIC = VRDTO;
            if (:BASEADIC = 'IVA') then
                VALORADIC = VRIVA;
            if (:BASEADIC = 'ADICIONAL') then
                VALORADIC = VRADIC;
            if (:BASEADIC = 'EXTRA') then
                VALORADIC = VREXTRA;
            if (:BASEADIC = 'TOTAL') then
                VALORADIC = VRTOTAL;
            MONTO = VALORADIC * PORCADIC;
            END
        if (MONTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTADIC, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                if (DBADIC = 'S') then
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                ELSE
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                NROI = NROI + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                if (DBADIC = 'S') then
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                ELSE
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                END
            NROI = NROI + 1;
            END
        END
    if (error > 0) then
        ver = 'S';
    SUSPEND;
    END
   END  $$IBE$$*/ /* EXISTE LA INTERFAZ */ /*$$IBE$$ 
  ELSE
    BEGIN
    EXECUTE PROCEDURE ERROR (33, :IDDOC, :PREF, 1);
    ERROR = ERROR + 1;
    VER = 'S';
    SUSPEND;
    END
 $$IBE$$*/ SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE CONTABIL_FACTURA(
    IDDOC INTEGER,
    IDINTER INTEGER)
RETURNS (
    ERROR INTEGER,
    VER CHAR(1),
    IDC INTEGER)
AS
declare variable pref varchar(4);
declare variable num varchar(6);
declare variable numero varchar(10);
declare variable fecaux date;
declare variable fecha char(8);
declare variable conc varchar(60);
declare variable venceaux date;
declare variable vence char(8);
declare variable vrdto numeric(18,2);
declare variable vradic numeric(18,2);
declare variable vrsubt numeric(18,2);
declare variable vriva numeric(18,2);
declare variable prtfte numeric(9,2);
declare variable vrrtfte numeric(18,2);
declare variable vrrtiva numeric(18,2);
declare variable prtica numeric(9,2);
declare variable vrrtica numeric(18,2);
declare variable vrtotal numeric(18,2);
declare variable vrextra numeric(18,2);
declare variable tipocomp varchar(3);
declare variable prefcont varchar(4);
declare variable ventas char(1);
declare variable ctaventas varchar(20);
declare variable iva char(1);
declare variable ctaiva varchar(20);
declare variable consumo char(1);
declare variable ctaconsumo varchar(20);
declare variable cartera char(1);
declare variable ctacartera varchar(20);
declare variable rtfte char(1);
declare variable ctartfte varchar(20);
declare variable rtiva char(1);
declare variable ctartiva varchar(20);
declare variable rtica char(1);
declare variable ctartica varchar(20);
declare variable inven char(1);
declare variable ctainven varchar(20);
declare variable costos char(1);
declare variable ctacostos varchar(20);
declare variable ctadto varchar(20);
declare variable ctaadic varchar(20);
declare variable ctaextra varchar(20);
declare variable existe char(1);
declare variable cuenta varchar(20);
declare variable monto numeric(18,2);
declare variable tipocuen char(1);
declare variable nit varchar(20);
declare variable nombre varchar(60);
declare variable proy varchar(4);
declare variable centro varchar(4);
declare variable porc numeric(5,2);
declare variable debito numeric(18,2);
declare variable credito numeric(18,2);
declare variable nroi integer;
declare variable art varchar(15);
declare variable imptos numeric(18,2);
declare variable suma numeric(18,2);
declare variable porciva numeric(9,2);
declare variable tctaclien varchar(20);
declare variable tctaventa varchar(20);
declare variable tctartfte varchar(20);
declare variable tctartiva varchar(20);
declare variable tctartica varchar(20);
declare variable ctadic varchar(20);
declare variable baseadic varchar(20);
declare variable porcadic numeric(5,2);
declare variable valoradic numeric(18,2);
declare variable dbadic char(1);
declare variable ptovta integer;
declare variable anulado char(1);
declare variable dig integer;
declare variable mercancia numeric(18,2);
declare variable fomento varchar(2);
declare variable DTOXIT varchar(2);
declare variable vrconsumo numeric(18,2);
declare variable factor double precision;
declare variable cent char(1);
declare variable AUTORET VARCHAR(10);
declare variable FAUTORET DATE;
declare variable ERRORC INTEGER;
BEGIN /*$$IBE$$ 
EXECUTE PROCEDURE LEE_CONFIGURACION('COMPRAS', 'FACTURAS', 'USAR IMPOCONSUMO COMO PORCENTAJE DE FOMENTO') returning_values (FOMENTO);
EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'FECHA AUTORETENEDOR NO DESCONTAR RETENCIONES DEL SALDO PERO SI CONTABILIZARLAS') returning_values (AUTORET);
if (AUTORET <> '') then
    FAUTORET = CAST(AUTORET AS DATE);
else
    FAUTORET = '9999/12/31';
 $$IBE$$*/ /* BUSQUE LA INTERFACE */ /*$$IBE$$ 
EXISTE = 'N';
SELECT 'S', TICO_COD, PRCO_PRE, INVE_VENTAS, INVE_IVA, INVE_CONSUMO, INVE_CARTERA, INVE_RTFTE, INVE_RTIVA, INVE_RTICA, INVE_COSTO, INVE_INVEN, INVE_CTAVENTAS, INVE_CTAIVA, INVE_CTACONSUMO, INVE_CTADTO, INVE_CTAADIC, INVE_CTAEXTRA, INVE_CTACARTERA, INVE_CTARTFTE, INVE_CTARTIVA, INVE_CTARTICA, INVE_CTAINVEN, INVE_CTACOSTOS, INVE_CONFIRMAR, INVE_CENTRO
    FROM INTERFAZ_VENTAS
    WHERE INVE_ID = :IDINTER
    INTO :EXISTE, :TIPOCOMP, :PREFCONT, :VENTAS, :IVA, :CONSUMO, :CARTERA, :RTFTE, :RTIVA, :RTICA, :COSTOS, :INVEN, :CTAVENTAS, :CTAIVA, :CTACONSUMO, :CTADTO, :CTAADIC, :CTAEXTRA, :CTACARTERA, :CTARTFTE, :CTARTIVA, :CTARTICA, :CTAINVEN, :CTACOSTOS, :VER, :CENT;
if (EXISTE = 'S') then
  BEGIN
     $$IBE$$*/ /* BORRE CUALQUEIR CONTABILIZACION PREVIA */ /*$$IBE$$ 
    DELETE FROM CONTABILIZACION WHERE CNTB_TIPOREF = 31 AND CNTB_IDREF = :IDDOC;

   $$IBE$$*/ /* TRAIGA EL ENCABEZADO DE LA FACTURA */ /*$$IBE$$ 
  SELECT PREF_PRE, FACT_NUMERO, FACT_FECHA, F.TERC_NIT, PTVT_ID, FACT_VENCE, FACT_DTOMONTO, FACT_ADICIONAL, FACT_IVAMONTO, FACT_EXTRA, FACT_TOTAL, FACT_RTFTEPOR, FACT_RTFTEMONTO, FACT_RTIVAPOR, FACT_RTIVAMONTO, FACT_RTICAPOR, FACT_RTICAMONTO, FACT_NOMCLIENTE, TERC_CTARTFTE, TERC_CTARTIVA, TERC_CTARTICA, TERC_CTAVENTA, TERC_CTACLIENTE, FACT_ANULADO
        FROM FACTURAS F, TERCEROS T
        WHERE FACT_ID = :IDDOC AND F.TERC_NIT = T.TERC_NIT
        INTO :PREF, :NUM, :FECAUX, :NIT, :PTOVTA, :VENCEAUX, :VRDTO, :VRADIC, :VRIVA, :VREXTRA, :VRTOTAL, :PRTFTE, :VRRTFTE, :PORC, :VRRTIVA, :PRTICA, :VRRTICA, :NOMBRE, TCTARTFTE, TCTARTIVA, TCTARTICA, TCTAVENTA, TCTACLIEN, ANULADO;
  if (ANULADO = 'N') then
    BEGIN
     $$IBE$$*/ /* BUSQUE EL CENTRO DEL PUNTO, LA BODEGA, O EL PREFIJO  */ /*$$IBE$$ 
    IF (CENT = 'B') THEN
        SELECT B.BODE_CENTRO, B.BODE_PROY FROM BODEGA B, FACTURAS F
            WHERE B.BODE_COD = F.BODE_COD AND F.FACT_ID = :IDDOC INTO :CENTRO, :PROY;
    IF (CENT = 'V') THEN
        SELECT V.CENT_COD, V.PROY_COD FROM VENDEDORES V, FACTURAS F
            WHERE V.VEND_COD = F.VEND_COD AND F.FACT_ID = :IDDOC INTO :CENTRO, :PROY;
    IF (CENT = 'P') THEN
        SELECT P.PREF_CENTRO,P.PREF_PROY  FROM PREFIJOS P, FACTURAS F
            WHERE P.PREF_PRE = F.PREF_PRE AND F.FACT_ID = :IDDOC AND P.TIDO_COD = 31 INTO :CENTRO, :PROY;
    NUMERO = PREF || NUM;
    SELECT SUM (FADE_CONSUMO) FROM FACTURAS_DETALLE WHERE FACT_ID = :IDDOC  AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
        INTO MERCANCIA;
    VRSUBT = VRTOTAL - VREXTRA - VRIVA - MERCANCIA;  $$IBE$$*/ /* BASE DE RETEFTE Y RETEICA */ /*$$IBE$$ 

    EXECUTE PROCEDURE lee_configuracion ('FACTURACION', 'FACTURAS', 'DESCUENTO PIE FACTURA IGUAL A SUMA DE DESCUENTOS POR ITEM') returning_values (:DTOXIT);
    if (DTOXIT = 'SI') then
        VRDTO = 0;
    MERCANCIA = VRSUBT - VRADIC + VRDTO;
    EXECUTE PROCEDURE FECHA_A_CONTA(:FECAUX) returning_values (:FECHA);
    EXECUTE PROCEDURE FECHA_A_CONTA(:VENCEAUX) returning_values (:VENCE);
     $$IBE$$*/ /* REGISTRE EL ENCABEZADO CONTABLE */ /*$$IBE$$ 
    IDC = GEN_ID(ID_CONTABILIZA, 1);
    if (STRLEN(NOMBRE)> 43 ) then
      CONC = 'FV No.' || NUMERO || '-' || SUBSTR(NOMBRE,1,43);
    ELSE
      CONC = 'FV No.' || NUMERO || '-' || NOMBRE;
    INSERT INTO CONTABILIZACION (CNTB_ID, CNTB_TIPOCOMP, CNTB_PREFCNT, CNTB_NUMERO, CNTB_FECHA, CNTB_CONCEPTO, CNTB_REF, CNTB_TIPOREF, CNTB_IDREF, CNTB_PREFREF, CNTB_NUMREF, CNTB_PROCESADO)
        VALUES (:IDC, :TIPOCOMP, :PREFCONT, :NUM, :FECHA, :CONC, '', 31, :IDDOC, :PREF, :NUM, 'N');
    NROI = 0;
    SUMA = 0;
    ERROR = 0;
     $$IBE$$*/ /* SI NO HAY CUENTA DE DESCUENTO NI ADICIONAL CALCULE UN FACTOR PARA LAS VENTAS Y EL IVA */ /*$$IBE$$ 
    if (MERCANCIA <> 0) then
        FACTOR = CAST(VRSUBT AS DOUBLE PRECISION) / CAST(MERCANCIA AS DOUBLE PRECISION);
    ELSE
        FACTOR = 1;
     $$IBE$$*/ /* TRAIGA EL NUMERO DE DIGITOS PARA EL REDONDEO */ /*$$IBE$$ 
    SELECT CAST(CONF_VALOR AS INTEGER) FROM CONFIGURACION WHERE CONF_MODULO = 'FACTURACION' AND
        CONF_CATEGORIA = 'GENERAL' AND CONF_PROPIEDAD = 'REDONDEO AL MULTIPLO DE DIEZ EN TOTALES' INTO :DIG;
     $$IBE$$*/ /* CUENTAS DE VENTAS */ /*$$IBE$$ 
    if (VENTAS = 'A') then
        BEGIN
        FOR SELECT MAX(COAR_CTAVNT), SUM(FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), SUM(FADE_IVAMONTO), SUM(FADE_CONSUMO)
            FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_DETALLE F
            WHERE F.FACT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
            GROUP BY COAR_CTAVNT
            INTO :CTAVENTAS, :MONTO, :IMPTOS, :VRCONSUMO
            DO
            BEGIN
            if (FOMENTO = 'SI') then
                MONTO = MONTO + VRCONSUMO;
            if ((CTADTO IS NULL) OR (CTADTO = '')) then
                MONTO = MONTO * FACTOR;
            execute procedure redondee(MONTO, DIG) returning_values (MONTO);
            if (MONTO <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTAVENTAS, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                     $$IBE$$*/ /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */ /*$$IBE$$ 
                    FOR SELECT F.ARTI_COD, (FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), FADE_CONSUMO
                        FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_DETALLE F
                        WHERE F.FACT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTAINV = :CUENTA AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
                        INTO :ART, :MONTO, :IMPTOS
                    DO
                        BEGIN
                        if (FOMENTO = 'SI') then
                            MONTO = MONTO + IMPTOS;
                        if ((CTADTO IS NULL) OR (CTADTO = '')) then
                            MONTO = MONTO * FACTOR;
                        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                        if (MONTO <> 0) then
                            BEGIN
                            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                            NROI = NROI + 1;
                            SUMA = SUMA - MONTO;
                            END
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    NROI = NROI + 1;
                    SUMA = SUMA - MONTO;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA - MONTO;
                    END
                END  $$IBE$$*/ /* MONTO <> 0 */ /*$$IBE$$ 
            END  $$IBE$$*/ /* FOR */ /*$$IBE$$ 
        END  $$IBE$$*/ /* VENTAS X ARTICULO */ /*$$IBE$$ 
     IF ((VENTAS = 'C') OR (VENTAS = 'K')) THEN
        BEGIN
        IF (VENTAS = 'C') THEN
            CTAVENTAS = TCTAVENTA;
        SELECT SUM(FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), SUM(FADE_IVAMONTO), SUM (FADE_CONSUMO)
            FROM FACTURAS_DETALLE F
            WHERE F.FACT_ID = :IDDOC AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
            INTO :MONTO, :IMPTOS, :VRCONSUMO;
        if (FOMENTO = 'SI') then
            MONTO = MONTO + VRCONSUMO;
        if ((CTADTO IS NULL) OR (CTADTO = '')) then
            MONTO = MONTO * FACTOR;
        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
        if (MONTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTAVENTAS, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'I') then
                BEGIN
                 $$IBE$$*/ /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */ /*$$IBE$$ 
                FOR SELECT F.ARTI_COD, (FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), FADE_CONSUMO
                    FROM ARTICULO A, FACTURAS_DETALLE F
                    WHERE F.FACT_ID = :IDDOC AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
                    INTO :ART, :MONTO, :IMPTOS
                    DO
                    BEGIN
                    if (FOMENTO = 'SI') then
                        MONTO = MONTO + VRCONSUMO;
                    if ((CTADTO IS NULL) OR (CTADTO = '')) then
                        MONTO = MONTO * FACTOR;
                    execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                    if (MONTO <> 0) then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        SUMA = SUMA - MONTO;
                        END
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - MONTO;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - MONTO;
                END
            END  $$IBE$$*/ /* MONTO <> 0 */ /*$$IBE$$ 
        END  $$IBE$$*/ /* VENTAS DE CLIENTE O CONSTANTE */
    /* EL IVA EN VENTAS */ /*$$IBE$$ 
    if (IVA = 'A') then
        BEGIN
        FOR SELECT MAX(COAR_CTAIVAV), SUM(FADE_IVAMONTO), SUM(FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), sum(FADE_CONSUMO)
            FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_DETALLE F
            WHERE F.FACT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
            GROUP BY COAR_CTAIVAV
            INTO :CTAIVA, :IMPTOS, :MONTO, :VALORADIC
        DO
            BEGIN
            if (FOMENTO = 'SI') then
                MONTO = MONTO + VALORADIC;
            MONTO = MONTO * -1;
            MONTO = MONTO * FACTOR;
            IMPTOS = IMPTOS * FACTOR;
            execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
            execute procedure redondee(MONTO, DIG) returning_values (MONTO);
            if (IMPTOS <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTAIVA, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                     $$IBE$$*/ /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */ /*$$IBE$$ 
                    FOR SELECT F.ARTI_COD, FADE_IVAMONTO, (FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), TAIV_PORC, FADE_CONSUMO
                        FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_DETALLE F, TARIFA_IVA T
                        WHERE F.FACT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTAIVAV = :CUENTA AND A.TAIV_COD = T.TAIV_COD AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
                        INTO :ART, :IMPTOS, :MONTO, :PORCIVA, :VALORADIC
                    DO
                        BEGIN
                        if (FOMENTO = 'SI') then
                            MONTO = MONTO + VALORADIC;
                        MONTO = MONTO * -1;
                        MONTO = MONTO * FACTOR;
                        IMPTOS = IMPTOS * FACTOR;
                        execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                        if (IMPTOS <> 0) then
                            BEGIN
                            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, :MONTO, :PORCIVA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                            NROI = NROI + 1;
                            SUMA = SUMA + DEBITO - CREDITO;
                            END
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, :MONTO, ABS(:IMPTOS*100/:MONTO), :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    NROI = NROI + 1;
                    SUMA = SUMA - IMPTOS;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, :MONTO, ABS(:IMPTOS*100/:MONTO), :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA - IMPTOS;
                    END
                END    $$IBE$$*/ /* IMPTOS <> 0 */ /*$$IBE$$ 
            END  $$IBE$$*/ /* FOR */ /*$$IBE$$ 
        END  $$IBE$$*/ /* IVA X ARTICULO */ /*$$IBE$$ 
    if (IVA = 'K') then  $$IBE$$*/ /* IVA EN CTA CONSTANTE */ /*$$IBE$$ 
        BEGIN
        SELECT SUM(FADE_IVAMONTO), SUM(FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), SUM(FADE_CONSUMO)
            FROM FACTURAS_DETALLE F
            WHERE F.FACT_ID = :IDDOC and FADE_IVAMONTO <> 0 AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
            INTO :IMPTOS, :MONTO, :valoradic;
        if (FOMENTO = 'SI') then
            MONTO = MONTO + VALORADIC;
        MONTO = MONTO * -1;
        MONTO = MONTO * FACTOR;
        IMPTOS = IMPTOS * FACTOR;
        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
        execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
        if (IMPTOS <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTAIVA, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'I') then
                BEGIN
                 $$IBE$$*/ /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */ /*$$IBE$$ 
                FOR SELECT F.ARTI_COD, (FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), FADE_IVAMONTO, TAIV_PORC, FADE_CONSUMO
                    FROM ARTICULO A, FACTURAS_DETALLE F, TARIFA_IVA T
                    WHERE F.FACT_ID = :IDDOC AND A.TAIV_COD = T.TAIV_COD AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
                    INTO :ART, :MONTO, :IMPTOS, :PORCIVA, :VALORADIC
                    DO
                    BEGIN
                    if (FOMENTO = 'SI') then
                        MONTO = MONTO + VALORADIC;
                    MONTO = MONTO * -1;
                    MONTO = MONTO * FACTOR;
                    IMPTOS = IMPTOS * FACTOR;
                    execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                    execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                    if (IMPTOS <> 0) then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', 0, :IMPTOS, :MONTO, :PORCIVA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        SUMA = SUMA - IMPTOS;
                        END
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', 0, :IMPTOS, :MONTO, ABS(:IMPTOS*100/:MONTO), :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - IMPTOS;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', 0, :IMPTOS, :MONTO, ABS(:IMPTOS*100/:MONTO), :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - IMPTOS;
                END
            END  $$IBE$$*/ /* IMPTOS <> 0 */ /*$$IBE$$ 
        END  $$IBE$$*/ /* IVA EN CTA CONSTANTE */
    /* EL IMPOCONSUMO */ /*$$IBE$$ 
    if ((CONSUMO = 'A') AND (FOMENTO <> 'SI')) then
        BEGIN
        FOR SELECT MAX(COAR_CTACONS), SUM(FADE_CONSUMO)
            FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_DETALLE F
            WHERE F.FACT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
            GROUP BY COAR_CTACONS
            INTO :CTACONSUMO, :IMPTOS
        DO
            BEGIN
            execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
            if (IMPTOS <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTACONSUMO, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                     $$IBE$$*/ /* ES UNA CUENTA DE INVENTARIO, REGISTRE UNO A UNO LOS ARTICULOS */ /*$$IBE$$ 
                    FOR SELECT F.ARTI_COD, FADE_CONSUMO
                        FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_DETALLE F
                        WHERE F.FACT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTACONS = :CUENTA AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
                        INTO :ART, :IMPTOS
                    DO
                        BEGIN
                        execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                        if (IMPTOS <> 0) then
                            BEGIN
                            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                            NROI = NROI + 1;
                            SUMA = SUMA - IMPTOS;
                            END
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    NROI = NROI + 1;
                    SUMA = SUMA - IMPTOS;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA - IMPTOS;
                    END
                END  $$IBE$$*/ /* IMPTOS <> 0 */ /*$$IBE$$ 
            END  $$IBE$$*/ /* FOR */ /*$$IBE$$ 
        END  $$IBE$$*/ /* CONSUMO X ARTICULO */ /*$$IBE$$ 
    if ((CONSUMO = 'K') AND (FOMENTO <> 'SI')) then  $$IBE$$*/ /* CONSUMO EN CTA CONSTANTE */ /*$$IBE$$ 
        BEGIN
        SELECT SUM(FADE_CONSUMO)
            FROM FACTURAS_DETALLE F
            WHERE F.FACT_ID = :IDDOC AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
            INTO :IMPTOS;
        execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
        if (IMPTOS <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTACONSUMO, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'I') then
                BEGIN
                 $$IBE$$*/ /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */ /*$$IBE$$ 
                FOR SELECT F.ARTI_COD, FADE_CONSUMO
                    FROM ARTICULO A, FACTURAS_DETALLE F
                    WHERE F.FACT_ID = :IDDOC AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
                    INTO :ART, :IMPTOS
                    DO
                    BEGIN
                    execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                    if (IMPTOS <> 0) then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CTACONSUMO, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        SUMA = SUMA - IMPTOS;
                        END
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTACONSUMO, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - IMPTOS;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTACONSUMO, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - IMPTOS;
                END
            END  $$IBE$$*/ /* IMPTOS <> 0 */ /*$$IBE$$ 
        END  $$IBE$$*/ /* CONSUMO EN CTA CONSTANTE */
    /* DESCUENTO */ /*$$IBE$$ 
    if ((CTADTO IS NOT NULL) AND (CTADTO <> '')) then
        BEGIN
        execute procedure redondee(VRDTO, DIG) returning_values (VRDTO);
        if (VRDTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTADTO, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRDTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA + VRDTO;
                END
            if (TIPOCUEN = 'N') then
                    BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRDTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA + VRDTO;
                END
            END
        END  $$IBE$$*/ /* DESCUENTO */
    /* VALOR ADIC */ /*$$IBE$$ 
    if ((CTAADIC IS NOT NULL) AND (CTAADIC <> '')) then
        BEGIN
        execute procedure redondee(VRADIC, DIG) returning_values (VRADIC);
        if (VRADIC <> 0) THEN
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTAADIC, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRADIC, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - VRADIC;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRADIC, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - VRADIC;
                END
            END
        END  $$IBE$$*/ /* VR. ADIC */
    /* VALOR EXTRA */ /*$$IBE$$ 
    if ((CTAEXTRA IS NOT NULL) AND (CTAEXTRA <> '')) THEN
        BEGIN
        execute procedure redondee(VREXTRA, DIG) returning_values (VREXTRA);
        if (VREXTRA <> 0) THEN
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTAEXTRA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VREXTRA, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - VREXTRA;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VREXTRA, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - VREXTRA;
                END
            END
        END  $$IBE$$*/ /* VR. EXTRA */
    /* DESCUENTE EL IMPOCONSUMO */ /*$$IBE$$ 
    SELECT SUM(FADE_CONSUMO)
        FROM FACTURAS_DETALLE F WHERE F.FACT_ID = :IDDOC AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL)) INTO :IMPTOS;
    vrsubt = vrsubt - IMPTOS;
     $$IBE$$*/ /* RETENCION FUENTE */ /*$$IBE$$ 
    if ((RTFTE = 'C') or (RTFTE = 'K')) then
      BEGIN
      execute procedure redondee(VRRTFTE, DIG) returning_values (VRRTFTE);
      if (VRRTFTE <> 0) then
        BEGIN
        if (RTFTE = 'C') then
            CTARTFTE = TCTARTFTE;
        EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTARTFTE, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :VRSUBT, :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTFTE;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :VRSUBT, :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTFTE;
            END
         $$IBE$$*/ /* AUTORETENCION */ /*$$IBE$$ 
        if (FAUTORET <= fecaux) then
            BEGIN
            EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'CUENTA DE AUTORETENCION EN LA FUENTE') returning_values (CTARTFTE);
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTARTFTE INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERROR (31, :IDDOC, :CTARTFTE, 2);
                CUENTA = CTARTFTE;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                begin
                EXECUTE PROCEDURE ERROR (31, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, (:VRSUBT*-1), :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - VRRTFTE;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, (:VRSUBT*-1), :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - VRRTFTE;
                END
            END
        END  $$IBE$$*/ /* RTFTE */ /*$$IBE$$ 
      END
    if (RTFTE = 'A') then
      BEGIN
      FOR SELECT MAX(COAR_CTARTFTEV), MAX(COAR_RTFTE), MIN(COAR_RTBASE), SUM(FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), SUM((FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO)*COAR_RTFTE)
        FROM CONTABIL_ARTICULO C, FACTURAS_DETALLE F
        WHERE F.FACT_ID = :IDDOC AND F.ARTI_COD = C.ARTI_COD AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
        GROUP BY COAR_CTARTFTEV
        INTO :CTARTFTE, :PRTFTE, :baseadic, :MONTO, :VRRTFTE
        DO
        BEGIN
        MONTO = MONTO * FACTOR;
        if (MONTO >= BASEADIC) then
            BEGIN
            VRRTFTE = VRRTFTE * FACTOR / 100;
            execute procedure redondee(VRRTFTE, DIG) returning_values (VRRTFTE);
            execute procedure redondee(MONTO, DIG) returning_values (MONTO);
            if (VRRTFTE <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTARTFTE, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :MONTO, :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    NROI = NROI + 1;
                    SUMA = SUMA + VRRTFTE;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :MONTO, :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA + VRRTFTE;
                    END
                 $$IBE$$*/ /* AUTORETENCION */ /*$$IBE$$ 
                if (FAUTORET <= fecaux) then
                    BEGIN
                    EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'CUENTA DE AUTORETENCION EN LA FUENTE') returning_values (CTARTFTE);
                    EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTARTFTE, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
                    if (ERRORC <> 0) then
                        ERROR = ERROR + 1;
                    if (TIPOCUEN = 'C') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, (:MONTO*-1), :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                        NROI = NROI + 1;
                        SUMA = SUMA - VRRTFTE;
                        END
                    if (TIPOCUEN = 'N') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, (:MONTO*-1), :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NROI = NROI + 1;
                        SUMA = SUMA - VRRTFTE;
                        END
                    END
                END
            END
        END  $$IBE$$*/ /* RTFTE */ /*$$IBE$$ 
      END
     $$IBE$$*/ /* RETENCION IVA */ /*$$IBE$$ 
    if ((RTIVA = 'C') or (RTIVA = 'K')) then
      BEGIN
      execute procedure redondee(VRRTIVA, DIG) returning_values (VRRTIVA);
      if (VRRTIVA <> 0) then
        BEGIN
        if (RTIVA = 'C') then
            CTARTIVA = TCTARTIVA;
        EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTARTIVA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTIVA, 0, :VRIVA, :PORC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTIVA;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTIVA, 0, :VRIVA, :PORC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTIVA;
            END
        END  $$IBE$$*/ /* RTIVA */ /*$$IBE$$ 
      END
     $$IBE$$*/ /* RETENCION DE ICA */ /*$$IBE$$ 
    if ((RTICA = 'C') or (RTICA = 'K')) then
      BEGIN
      execute procedure redondee(VRRTICA, DIG) returning_values (VRRTICA);
      if (VRRTICA <> 0) then
        BEGIN
        if (RTICA = 'C') then
            CTARTICA = TCTARTICA;
        EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTARTICA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTICA, 0, :VRSUBT, :PRTICA, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTICA;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTICA, 0, :VRSUBT, :PRTICA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTICA;
            END
        END  $$IBE$$*/ /* RTICA */ /*$$IBE$$ 
      END
     $$IBE$$*/ /* CIERRE EL COMPROBANTE CONTRA LA CUENTA DEL TERCERO O LA CONSTANTE */ /*$$IBE$$ 
    if ((SUMA <> 0) and ((CARTERA = 'C') or (CARTERA = 'K') or (CARTERA = 'J'))) then
        BEGIN
        if (SUMA < 0) then
            BEGIN
            DEBITO = SUMA * -1;
            CREDITO = 0;
            END
        ELSE
            BEGIN
            DEBITO = 0;
            CREDITO = SUMA;
            END
        if (CARTERA = 'C') then
            CTACARTERA = TCTACLIEN;
        if (CARTERA = 'J') then
            BEGIN
             $$IBE$$*/ /* BUSQUE LA CUENTA DE LA CAJA */ /*$$IBE$$ 
            SELECT CAJA_CUENTA FROM CAJAS C, PUNTO_VENTA P
                WHERE P.CAJA_ID = C.CAJA_ID AND PTVT_ID = :PTOVTA
                INTO :CTACARTERA;
            END
        EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTACARTERA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :DEBITO, :CREDITO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
        if (TIPOCUEN = 'N') then
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :DEBITO, :CREDITO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
        NROI = NROI + 1;
        END  $$IBE$$*/ /* SUMA EN CARTERA */
    /* CALCULE COSTOS EN VENTAS */ /*$$IBE$$ 
    EXECUTE PROCEDURE COSTO_EN_VENTAS(31, :IDDOC);
    if (COSTOS = 'A') then
        BEGIN
        FOR SELECT MAX(CTACOS), SUM(CAST(CANT AS DOUBLE PRECISION) * COSTO)
            FROM COSTO_VENTAS
            GROUP BY CTACOS
            INTO :CTACOSTOS, :MONTO
        DO
            BEGIN
            if (MONTO <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTACOSTOS, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                     $$IBE$$*/ /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */ /*$$IBE$$ 
                    FOR SELECT ARTI_COD, CANT * COSTO
                        FROM COSTO_VENTAS
                        WHERE CTACOS = :CUENTA
                        INTO :ART, :MONTO
                    DO
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    NROI = NROI + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    END
                END  $$IBE$$*/ /* MONTO <> 0 */ /*$$IBE$$ 
            END  $$IBE$$*/ /* FOR */ /*$$IBE$$ 
        END  $$IBE$$*/ /* COSTOS */ /*$$IBE$$ 
    if (COSTOS = 'K') then
        BEGIN
        SELECT SUM(CAST(CANT AS DOUBLE PRECISION) * COSTO)
            FROM COSTO_VENTAS
            INTO :MONTO;
        if (MONTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTACOSTOS, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'I') then
                BEGIN
                 $$IBE$$*/ /* ES UNA CUENTA DE INVENTARIO, REGISTRE UNO A UNO LOS ARTICULOS */ /*$$IBE$$ 
                FOR SELECT ARTI_COD, CANT * COSTO
                    FROM COSTO_VENTAS
                    INTO :ART, :MONTO
                DO
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTACOSTOS, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                    NROI = NROI + 1;
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTACOSTOS, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTACOSTOS, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                END
            END  $$IBE$$*/ /* MONTO <> 0 */ /*$$IBE$$ 
        END  $$IBE$$*/ /* COSTOS = K */ /*$$IBE$$ 
    if (INVEN = 'A') then
        BEGIN
        FOR SELECT MAX(CTAINV), SUM(CAST(CANT AS DOUBLE PRECISION) * COSTO)
            FROM COSTO_VENTAS
            GROUP BY CTAINV
            INTO :CTAINVEN, :MONTO
        DO
            BEGIN
            if (MONTO <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTAINVEN, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                     $$IBE$$*/ /* ES UNA CUENTA DE INVENTARIO, REGISTRE UNO A UNO LOS ARTICULOS */ /*$$IBE$$ 
                    FOR SELECT ARTI_COD, CANT * COSTO
                        FROM COSTO_VENTAS
                        WHERE CTAINV = :CUENTA
                        INTO :ART, :MONTO
                    DO
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    NROI = NROI + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    END
                END  $$IBE$$*/ /* MONTO <> 0 */ /*$$IBE$$ 
            END  $$IBE$$*/ /* FOR */ /*$$IBE$$ 
        END  $$IBE$$*/ /* INVEN = A */ /*$$IBE$$ 
    if (INVEN = 'K') then
        BEGIN
        SELECT SUM(CAST(CANT AS DOUBLE PRECISION) * COSTO)
            FROM COSTO_VENTAS
            INTO :MONTO;
        if (MONTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTAINVEN, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'I') then
                BEGIN
                 $$IBE$$*/ /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */ /*$$IBE$$ 
                FOR SELECT ARTI_COD, CANT * COSTO
                    FROM COSTO_VENTAS
                    INTO :ART, :MONTO
                DO
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTAINVEN, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                    NROI = NROI + 1;
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAINVEN, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAINVEN, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                END
            END  $$IBE$$*/ /* MONTO <> 0 */ /*$$IBE$$ 
        END  $$IBE$$*/ /* INVEN = K */
    /* recorra las cuentas adicionales */ /*$$IBE$$ 
    FOR SELECT INVC_CUENTA, INVC_BASE, INVC_PORC, INVC_VALOR, INVC_DB
        FROM INTERFAZ_VENTAS_CTAS
        WHERE INVE_ID = :IDINTER
        INTO :CTADIC, :BASEADIC, :PORCADIC, :VALORADIC, :DBADIC
        DO
        BEGIN
        if (VALORADIC <> 0) then
            MONTO = VALORADIC;
        ELSE
            BEGIN
            if (:BASEADIC = 'SUBTOTAL') then
                VALORADIC = vrsubt;
            if (:BASEADIC = 'DESCUENTO') then
                VALORADIC = VRDTO;
            if (:BASEADIC = 'IVA') then
                VALORADIC = VRIVA;
            if (:BASEADIC = 'ADICIONAL') then
                VALORADIC = VRADIC;
            if (:BASEADIC = 'EXTRA') then
                VALORADIC = VREXTRA;
            if (:BASEADIC = 'TOTAL') then
                VALORADIC = VRTOTAL;
            MONTO = VALORADIC * PORCADIC / 100;
            END
        if (MONTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTADIC, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                if (DBADIC = 'S') then
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                ELSE
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                if (DBADIC = 'S') then
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                ELSE
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                END
            NROI = NROI + 1;
            END
        END
    if (ERROR > 0) then
        VER = 'S';
    SUSPEND;
    END  $$IBE$$*/ /* NO ANULADO */ /*$$IBE$$ 
  END  $$IBE$$*/ /* EXISTE LA INTERFAZ */ /*$$IBE$$ 
ELSE
    BEGIN
    EXECUTE PROCEDURE ERROR (31, :IDDOC, :PREF, 1);
    ERROR = ERROR + 1;
    VER = 'S';
    SUSPEND;
    END
 $$IBE$$*/ SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

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

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE CONTABIL_FACTURAS_CONTADO(
    FECFAC DATE,
    NIT VARCHAR(20),
    PREF VARCHAR(4),
    PTVTA INTEGER,
    IDINTER INTEGER)
RETURNS (
    ERROR INTEGER,
    VER CHAR(1),
    IDC INTEGER)
AS
declare variable num varchar(8);
declare variable numero varchar(10);
declare variable fecha char(8);
declare variable conc char(120);
declare variable vence char(8);
declare variable vrdto numeric(18,2);
declare variable vradic numeric(18,2);
declare variable vrsubt numeric(18,2);
declare variable vriva numeric(18,2);
declare variable prtfte numeric(9,2);
declare variable vrrtfte numeric(18,2);
declare variable vrrtiva numeric(18,2);
declare variable prtica numeric(9,2);
declare variable vrrtica numeric(18,2);
declare variable vrtotal numeric(18,2);
declare variable vrextra numeric(18,2);
declare variable tipocomp varchar(3);
declare variable prefcont varchar(4);
declare variable ventas char(1);
declare variable ctaventas varchar(20);
declare variable iva char(1);
declare variable ctaiva varchar(20);
declare variable consumo char(1);
declare variable ctaconsumo varchar(20);
declare variable cartera char(1);
declare variable ctacartera varchar(20);
declare variable rtfte char(1);
declare variable ctartfte varchar(20);
declare variable rtiva char(1);
declare variable ctartiva varchar(20);
declare variable rtica char(1);
declare variable ctartica varchar(20);
declare variable inven char(1);
declare variable ctainven varchar(20);
declare variable costos char(1);
declare variable ctacostos varchar(20);
declare variable ctadto varchar(20);
declare variable ctaadic varchar(20);
declare variable ctaextra varchar(20);
declare variable existe char(1);
declare variable cuenta varchar(20);
declare variable monto numeric(18,2);
declare variable tipocuen char(1);
declare variable nombre varchar(60);
declare variable proy varchar(4);
declare variable centro varchar(4);
declare variable porc numeric(5,2);
declare variable debito numeric(18,2);
declare variable credito numeric(18,2);
declare variable nroi integer;
declare variable art varchar(15);
declare variable impinc char(1);
declare variable imptos numeric(18,2);
declare variable suma numeric(18,2);
declare variable porciva numeric(9,2);
declare variable tctaclien varchar(20);
declare variable tctaventa varchar(20);
declare variable tctartfte varchar(20);
declare variable tctartiva varchar(20);
declare variable tctartica varchar(20);
declare variable ctadic varchar(20);
declare variable baseadic varchar(20);
declare variable porcadic numeric(5,2);
declare variable valoradic numeric(18,2);
declare variable dbadic char(1);
declare variable ptovta integer;
declare variable dig integer;
declare variable mercancia numeric(18,2);
declare variable factor double precision;
declare variable cent char(1);
BEGIN
/* BUSQUE LA INTERFACE */ /*$$IBE$$ 
EXISTE = 'N';
SELECT 'S', TICO_COD, PRCO_PRE, INVE_VENTAS, INVE_IVA, INVE_CONSUMO, INVE_CARTERA, INVE_RTFTE, INVE_RTIVA, INVE_RTICA, INVE_COSTO, INVE_INVEN, INVE_CTAVENTAS, INVE_CTAIVA, INVE_CTACONSUMO, INVE_CTADTO, INVE_CTAADIC, INVE_CTAEXTRA, INVE_CTACARTERA, INVE_CTARTFTE, INVE_CTARTIVA, INVE_CTARTICA, INVE_CTAINVEN, INVE_CTACOSTOS, INVE_CONFIRMAR, INVE_CENTRO
    FROM INTERFAZ_VENTAS
    WHERE INVE_ID = :IDINTER
    INTO :EXISTE, :TIPOCOMP, :PREFCONT, :VENTAS, :IVA, :CONSUMO, :CARTERA, :RTFTE, :RTIVA, :RTICA, :COSTOS, :INVEN, :CTAVENTAS, :CTAIVA, :CTACONSUMO, :CTADTO, :CTAADIC, :CTAEXTRA, :CTACARTERA, :CTARTFTE, :CTARTIVA, :CTARTICA, :CTAINVEN, :CTACOSTOS, :VER, :CENT;
if (EXISTE = 'S') then
  BEGIN
   $$IBE$$*/ /* BORRE CUALQUEIR CONTABILIZACION PREVIA */
/*  DELETE FROM CONTABILIZACION WHERE CNTB_TIPOREF = 31 AND CNTB_IDREF = 0;
  /* BUSQUE EL CENTRO DEL PUNTO, LA BODEGA, O EL PREFIJO  */ /*$$IBE$$ 
  IF (CENT = 'B') THEN
    SELECT B.BODE_CENTRO, B.BODE_PROY FROM BODEGA B, PUNTO_VENTA P
        WHERE B.BODE_COD = P.BODE_COD AND P.ptvt_id = :ptvta INTO :CENTRO, :PROY;
  IF (CENT = 'V') THEN
    SELECT MAX(V.CENT_COD), MAX(V.PROY_COD) FROM VENDEDORES V
        WHERE V.PTVT_ID = :PTVTA INTO :CENTRO, :PROY;
  IF (CENT = 'P') THEN
    SELECT P.PREF_PROY, P.PREF_CENTRO FROM PREFIJOS P
        WHERE P.PREF_PRE = :PREF AND P.TIDO_COD = 31 INTO :CENTRO, :PROY;
   $$IBE$$*/ /* TRAIGA LOS DATOS DEL CLIENTE */ /*$$IBE$$ 
  SELECT TERC_NOM, TERC_CTARTFTE, TERC_CTARTIVA, TERC_CTARTICA, TERC_CTAVENTA, TERC_CTACLIENTE
        FROM TERCEROS T WHERE TERC_NIT = :NIT
        INTO :NOMBRE, TCTARTFTE, TCTARTIVA, TCTARTICA, TCTAVENTA, TCTACLIEN;
  SELECT SUM(FACT_DTOMONTO), SUM(FACT_ADICIONAL), SUM(FACT_IVAMONTO), SUM(FACT_EXTRA), SUM(FACT_TOTAL), SUM(FACT_RTFTEMONTO), SUM(FACT_RTIVAMONTO), SUM(FACT_RTICAMONTO), MAX(FACT_IVAINC)
        FROM FACTURAS F WHERE FACT_FECHA = :FECFAC AND FACT_ANULADO = 'N' AND PTVT_ID = :ptvta AND PREF_PRE = :PREF
        INTO :VRDTO, :VRADIC, :VRIVA, :VREXTRA, :VRTOTAL, :VRRTFTE, :VRRTIVA, :VRRTICA, :impinc;
  VRSUBT = VRTOTAL - VREXTRA - VRIVA;  $$IBE$$*/ /* BASE DE RETEFTE Y RETEICA */ /*$$IBE$$ 
  MERCANCIA = VRSUBT - VRADIC + VRDTO;
  EXECUTE PROCEDURE FECHA_A_CONTA(:FECFAC) returning_values (:FECHA);
  VENCE = FECHA;
   $$IBE$$*/ /* REGISTRE EL ENCABEZADO CONTABLE */ /*$$IBE$$ 
  IDC = GEN_ID(ID_CONTABILIZA, 1);
  CONC = 'RESUMEN VENTAS ' || FECHA;
  NUM = SUBSTR(FECHA, 3, 8);
  INSERT INTO CONTABILIZACION (CNTB_ID, CNTB_TIPOCOMP, CNTB_PREFCNT, CNTB_NUMERO, CNTB_FECHA, CNTB_CONCEPTO, CNTB_REF, CNTB_TIPOREF, CNTB_IDREF, CNTB_PREFREF, CNTB_NUMREF, CNTB_PROCESADO)
        VALUES (:IDC, :TIPOCOMP, :PREFCONT, :NUM, :FECHA, :CONC, '', 0, 0, :PREF, :NUM, 'N');
  NROI = 0;
  SUMA = 0;
  ERROR = 0;
   $$IBE$$*/ /* SI NO HAY CUENTA DE DESCUENTO NI ADICIONAL CALCULE UN FACTOR PARA LAS VENTAS Y EL IVA */ /*$$IBE$$ 
  if (MERCANCIA <> 0) then
    FACTOR = CAST(VRSUBT AS DOUBLE PRECISION) / CAST(MERCANCIA AS DOUBLE PRECISION);
  ELSE
    FACTOR = 1;
   $$IBE$$*/ /* TRAIGA EL NUMERO DE DIGITOS PARA EL REDONDEO */ /*$$IBE$$ 
  SELECT CAST(CONF_VALOR AS INTEGER) FROM CONFIGURACION WHERE CONF_MODULO = 'FACTURACION' AND
        CONF_CATEGORIA = 'GENERAL' AND CONF_PROPIEDAD = 'REDONDEO AL MULTIPLO DE DIEZ EN TOTALES' INTO :DIG;
   $$IBE$$*/ /* CUENTAS DE VENTAS */ /*$$IBE$$ 
  if (VENTAS = 'A') then
        BEGIN
        FOR SELECT MAX(COAR_CTAVNT), SUM(CAST(FADE_CANT AS DOUBLE PRECISION) * (FADE_PRUNIT-FADE_DTOMONTO)), SUM(FADE_IVAMONTO+FADE_CONSUMO)
            FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_DETALLE FD, FACTURAS F
            WHERE F.FACT_ID = FD.FACT_ID AND FACT_FECHA = :FECFAC AND FD.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND F.PREF_PRE = :PREF AND F.PTVT_ID = :PTVTA AND FACT_ANULADO = 'N' AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
            GROUP BY COAR_CTAVNT
            INTO :CTAVENTAS, :MONTO, :IMPTOS
            DO
            BEGIN
            if (IMPINC = 'S') then
                MONTO = MONTO - IMPTOS;
            if ((CTADTO IS NULL) OR (CTADTO = '')) then
                MONTO = MONTO * FACTOR;
            execute procedure redondee(MONTO, DIG) returning_values (MONTO);
            if (MONTO <> 0) then
                BEGIN
                CUENTA = NULL;
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :CTAVENTAS INTO :CUENTA, :TIPOCUEN;
                if (CUENTA IS NULL) then
                    begin
                    EXECUTE PROCEDURE ERROR (31, 0, :CTAVENTAS, 2);
                    CUENTA = CTAVENTAS;
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                     $$IBE$$*/ /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */ /*$$IBE$$ 
                    FOR SELECT FD.ARTI_COD, (CAST(FADE_CANT AS DOUBLE PRECISION) * (FADE_PRUNIT-FADE_DTOMONTO)), (FADE_IVAMONTO+FADE_CONSUMO)
                        FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_DETALLE FD, FACTURAS F
                        WHERE F.FACT_ID = FD.FACT_ID AND FACT_FECHA = :FECFAC AND F.PREF_PRE = :PREF AND F.PTVT_ID = :PTVTA AND FD.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTAINV = :CUENTA AND FACT_ANULADO = 'N' AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
                        INTO :ART, :MONTO, :IMPTOS
                    DO
                        BEGIN
                        if (IMPINC = 'S') then
                            MONTO = MONTO - IMPTOS;
                        if ((CTADTO IS NULL) OR (CTADTO = '')) then
                            MONTO = MONTO * FACTOR;
                        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                        if (MONTO <> 0) then
                            BEGIN
                            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                            NROI = NROI + 1;
                            SUMA = SUMA - MONTO;
                            END
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    NROI = NROI + 1;
                    SUMA = SUMA - MONTO;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA - MONTO;
                    END
                END  $$IBE$$*/ /* MONTO <> 0 */ /*$$IBE$$ 
            END  $$IBE$$*/ /* FOR */ /*$$IBE$$ 
        END  $$IBE$$*/ /* VENTAS X ARTICULO */ /*$$IBE$$ 
     IF ((VENTAS = 'C') OR (VENTAS = 'K')) THEN
        BEGIN
        IF (VENTAS = 'C') THEN
            CTAVENTAS = TCTAVENTA;
        SELECT SUM(CAST(FADE_CANT AS DOUBLE PRECISION) * (FADE_PRUNIT-FADE_DTOMONTO)), SUM(FADE_IVAMONTO+FADE_CONSUMO)
            FROM FACTURAS_DETALLE FD, FACTURAS F
            WHERE F.FACT_ID = FD.FACT_ID AND FACT_FECHA = :FECFAC AND F.PREF_PRE = :PREF AND F.PTVT_ID = :PTVTA AND FACT_ANULADO = 'N' AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
            INTO :MONTO, :IMPTOS;
        if (IMPINC = 'S') then
            MONTO = MONTO - IMPTOS;
        if ((CTADTO IS NULL) OR (CTADTO = '')) then
            MONTO = MONTO * FACTOR;
        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
        if (MONTO <> 0) then
            BEGIN
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTAVENTAS INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERROR (31, 0, :CTAVENTAS, 2);
                CUENTA = CTAVENTAS;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                 $$IBE$$*/ /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */ /*$$IBE$$ 
                FOR SELECT FD.ARTI_COD, (CAST(FADE_CANT AS DOUBLE PRECISION) * (FADE_PRUNIT-FADE_DTOMONTO)), (FADE_IVAMONTO+FADE_CONSUMO)
                    FROM  $$IBE$$*/ /*ARTICULO A,*/ /*$$IBE$$  FACTURAS_DETALLE FD, FACTURAS F
                    WHERE F.FACT_ID = FD.FACT_ID AND FACT_FECHA = :FECFAC AND F.PREF_PRE = :PREF AND F.PTVT_ID = :PTVTA AND FACT_ANULADO = 'N' AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
                    INTO :ART, :MONTO, :IMPTOS
                    DO
                    BEGIN
                    if (IMPINC = 'S') then
                        MONTO = MONTO - IMPTOS;
                    if ((CTADTO IS NULL) OR (CTADTO = '')) then
                        MONTO = MONTO * FACTOR;
                    execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                    if (MONTO <> 0) then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        SUMA = SUMA - MONTO;
                        END
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - MONTO;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - MONTO;
                END
            END  $$IBE$$*/ /* MONTO <> 0 */ /*$$IBE$$ 
        END  $$IBE$$*/ /* VENTAS DE CLIENTE O CONSTANTE */
    /* EL IVA EN VENTAS */ /*$$IBE$$ 
    if (IVA = 'A') then
        BEGIN
        FOR SELECT MAX(COAR_CTAIVAV), SUM(FADE_IVAMONTO), SUM(CAST(FADE_CANT AS DOUBLE PRECISION) * (FADE_PRUNIT-FADE_DTOMONTO)), sum(FADE_CONSUMO)
            FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_DETALLE FD, FACTURAS F
            WHERE F.FACT_ID = FD.FACT_ID AND FACT_FECHA = :FECFAC AND F.PREF_PRE = :PREF AND F.PTVT_ID = :PTVTA AND FD.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND FACT_ANULADO = 'N' AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
            GROUP BY COAR_CTAIVAV
            INTO :CTAIVA, :IMPTOS, :MONTO, :VALORADIC
        DO
            BEGIN
            if (IMPINC = 'S') then
                MONTO = MONTO - IMPTOS - VALORADIC;
            MONTO = MONTO * -1;
            MONTO = MONTO * FACTOR;
            IMPTOS = IMPTOS * FACTOR;
            execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
            execute procedure redondee(MONTO, DIG) returning_values (MONTO);
            if (IMPTOS <> 0) then
                BEGIN
                CUENTA = NULL;
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :CTAIVA INTO :CUENTA, :TIPOCUEN;
                if (CUENTA IS NULL) then
                    begin
                    EXECUTE PROCEDURE ERROR (31, 0, :CTAIVA, 2);
                    CUENTA = CTAIVA;
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                     $$IBE$$*/ /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */ /*$$IBE$$ 
                    FOR SELECT FD.ARTI_COD, FADE_IVAMONTO, (CAST(FADE_CANT AS DOUBLE PRECISION) * (FADE_PRUNIT-FADE_DTOMONTO)), TAIV_PORC, FADE_CONSUMO
                        FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_DETALLE FD, FACTURAS F, TARIFA_IVA T
                        WHERE F.FACT_ID = FD.FACT_ID AND FACT_FECHA = :FECFAC AND F.PREF_PRE = :PREF AND F.PTVT_ID = :PTVTA AND FD.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTAIVAV = :CUENTA AND A.TAIV_COD = T.TAIV_COD AND FACT_ANULADO = 'N' AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
                        INTO :ART, :IMPTOS, :MONTO, :PORCIVA, :VALORADIC
                    DO
                        BEGIN
                        if (IMPINC = 'S') then
                            MONTO = MONTO - IMPTOS - VALORADIC;
                        MONTO = MONTO * -1;
                        MONTO = MONTO * FACTOR;
                        IMPTOS = IMPTOS * FACTOR;
                        execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                        if (IMPTOS <> 0) then
                            BEGIN
                            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, :MONTO, :PORCIVA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                            NROI = NROI + 1;
                            SUMA = SUMA + DEBITO - CREDITO;
                            END
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, :MONTO, ABS(:IMPTOS*100/:MONTO), :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    NROI = NROI + 1;
                    SUMA = SUMA - IMPTOS;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, :MONTO, ABS(:IMPTOS*100/:MONTO), :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA - IMPTOS;
                    END
                END    $$IBE$$*/ /* IMPTOS <> 0 */ /*$$IBE$$ 
            END  $$IBE$$*/ /* FOR */ /*$$IBE$$ 
        END  $$IBE$$*/ /* IVA X ARTICULO */ /*$$IBE$$ 
    if (IVA = 'K') then  $$IBE$$*/ /* IVA EN CTA CONSTANTE */ /*$$IBE$$ 
        BEGIN
        SELECT SUM(FADE_IVAMONTO), SUM(CAST(FADE_CANT AS DOUBLE PRECISION) * (FADE_PRUNIT-FADE_DTOMONTO)), SUM(FADE_CONSUMO)
            FROM FACTURAS_DETALLE FD, FACTURAS F
            WHERE F.FACT_ID = FD.FACT_ID AND FACT_FECHA = :FECFAC AND F.PREF_PRE = :PREF AND F.PTVT_ID = :PTVTA AND FACT_ANULADO = 'N' AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
            INTO :IMPTOS, :MONTO, :valoradic;
        if (IMPINC = 'S') then
            MONTO = MONTO - IMPTOS - VALORADIC;
        MONTO = MONTO * -1;
        MONTO = MONTO * FACTOR;
        IMPTOS = IMPTOS * FACTOR;
        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
        execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
        if (IMPTOS <> 0) then
            BEGIN
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTAIVA INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERROR (31, 0, :CTAIVA, 2);
                CUENTA = CTAIVA;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                 $$IBE$$*/ /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */ /*$$IBE$$ 
                FOR SELECT FD.ARTI_COD, (CAST(FADE_CANT AS DOUBLE PRECISION) * (FADE_PRUNIT-FADE_DTOMONTO)), FADE_IVAMONTO, TAIV_PORC, FADE_CONSUMO
                    FROM ARTICULO A, FACTURAS_DETALLE FD, FACTURAS F, TARIFA_IVA T
                    WHERE F.FACT_ID = FD.FACT_ID AND FACT_FECHA = :FECFAC AND F.PREF_PRE = :PREF AND F.PTVT_ID = :PTVTA AND FD.arti_cod = A.arti_cod AND T.TAIV_COD=A.TAIV_COD AND FACT_ANULADO = 'N' AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
                    INTO :ART, :MONTO, :IMPTOS, :PORCIVA, :VALORADIC
                    DO
                    BEGIN
                    if (IMPINC = 'S') then
                        MONTO = MONTO - IMPTOS - VALORADIC;
                    MONTO = MONTO * -1;
                    MONTO = MONTO * FACTOR;
                    IMPTOS = IMPTOS * FACTOR;
                    execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                    execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                    if (IMPTOS <> 0) then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', 0, :IMPTOS, :MONTO, :PORCIVA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        SUMA = SUMA - IMPTOS;
                        END
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', 0, :IMPTOS, :MONTO, ABS(:IMPTOS*100/:MONTO), :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - IMPTOS;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', 0, :IMPTOS, :MONTO, ABS(:IMPTOS*100/:MONTO), :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - IMPTOS;
                END
            END  $$IBE$$*/ /* IMPTOS <> 0 */ /*$$IBE$$ 
        END  $$IBE$$*/ /* IVA EN CTA CONSTANTE */
    /* EL IMPOCONSUMO */ /*$$IBE$$ 
    if (CONSUMO = 'A') then
        BEGIN
        FOR SELECT MAX(COAR_CTACONS), SUM(FADE_CONSUMO)
            FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_DETALLE FD, FACTURAS F
            WHERE F.FACT_ID = FD.FACT_ID AND FACT_FECHA = :FECFAC AND F.PREF_PRE = :PREF AND F.PTVT_ID = :PTVTA AND FD.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND FACT_ANULADO = 'N' AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
            GROUP BY COAR_CTACONS
            INTO :CTACONSUMO, :IMPTOS
        DO
            BEGIN
            execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
            if (IMPTOS <> 0) then
                BEGIN
                CUENTA = NULL;
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :CTACONSUMO INTO :CUENTA, :TIPOCUEN;
                if (CUENTA IS NULL) then
                    begin
                    EXECUTE PROCEDURE ERROR (31, 0, :CTACONSUMO, 2);
                    CUENTA = CTACONSUMO;
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                     $$IBE$$*/ /* ES UNA CUENTA DE INVENTARIO, REGISTRE UNO A UNO LOS ARTICULOS */ /*$$IBE$$ 
                    FOR SELECT FD.ARTI_COD, FADE_CONSUMO
                        FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_DETALLE FD, FACTURAS F
                        WHERE F.FACT_ID = FD.FACT_ID AND FACT_FECHA = :FECFAC AND F.PREF_PRE = :PREF AND F.PTVT_ID = :PTVTA AND FD.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTACONS = :CUENTA AND FACT_ANULADO = 'N' AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
                        INTO :ART, :IMPTOS
                    DO
                        BEGIN
                        execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                        if (IMPTOS <> 0) then
                            BEGIN
                            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                            NROI = NROI + 1;
                            SUMA = SUMA - IMPTOS;
                            END
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    NROI = NROI + 1;
                    SUMA = SUMA - IMPTOS;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA - CREDITO;
                    END
                END  $$IBE$$*/ /* IMPTOS <> 0 */ /*$$IBE$$ 
            END  $$IBE$$*/ /* FOR */ /*$$IBE$$ 
        END  $$IBE$$*/ /* CONSUMO X ARTICULO */ /*$$IBE$$ 
    if (CONSUMO = 'K') then  $$IBE$$*/ /* CONSUMO EN CTA CONSTANTE */ /*$$IBE$$ 
        BEGIN
        SELECT SUM(FADE_CONSUMO)
            FROM FACTURAS_DETALLE FD, FACTURAS F
            WHERE F.FACT_ID = FD.FACT_ID AND FACT_FECHA = :FECFAC AND F.PREF_PRE = :PREF AND F.PTVT_ID = :PTVTA AND FACT_ANULADO = 'N' AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
            INTO :IMPTOS;
        execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
        if (IMPTOS <> 0) then
            BEGIN
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTACONSUMO INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERROR (31, 0, :CTACONSUMO, 2);
                CUENTA = CTACONSUMO;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                 $$IBE$$*/ /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */ /*$$IBE$$ 
                FOR SELECT FD.ARTI_COD, FADE_CONSUMO
                    FROM  $$IBE$$*/ /*ARTICULO A,*/ /*$$IBE$$  FACTURAS_DETALLE FD, FACTURAS F
                    WHERE F.FACT_ID = FD.FACT_ID AND FACT_FECHA = :FECFAC AND F.PREF_PRE = :PREF AND F.PTVT_ID = :PTVTA AND FACT_ANULADO = 'N' AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
                    INTO :ART, :IMPTOS
                    DO
                    BEGIN
                    execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                    if (IMPTOS <> 0) then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CTACONSUMO, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        SUMA = SUMA - IMPTOS;
                        END
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTACONSUMO, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - IMPTOS;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTACONSUMO, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - IMPTOS;
                END
            END  $$IBE$$*/ /* IMPTOS <> 0 */ /*$$IBE$$ 
        END  $$IBE$$*/ /* CONSUMO EN CTA CONSTANTE */
    /* DESCUENTO */ /*$$IBE$$ 
    if ((CTADTO IS NOT NULL) AND (CTADTO <> '')) then
        BEGIN
        execute procedure redondee(VRDTO, DIG) returning_values (VRDTO);
        if (VRDTO <> 0) then
            BEGIN
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTADTO INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERROR (31, 0, :CTADTO, 2);
                CUENTA = CTADTO;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                begin
                EXECUTE PROCEDURE ERROR (31, 0, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRDTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA + VRDTO;
                END
            if (TIPOCUEN = 'N') then
                    BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRDTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA + VRDTO;
                END
            END
        END  $$IBE$$*/ /* DESCUENTO */
    /* VALOR ADIC */ /*$$IBE$$ 
    if ((CTAADIC IS NOT NULL) AND (CTAADIC <> '')) then
        BEGIN
        execute procedure redondee(VRADIC, DIG) returning_values (VRADIC);
        if (VRADIC <> 0) THEN
            BEGIN
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTAADIC INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERROR (31, 0, :CTAADIC, 2);
                CUENTA = CTAADIC;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                begin
                EXECUTE PROCEDURE ERROR (31, 0, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRADIC, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - VRADIC;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRADIC, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - VRADIC;
                END
            END
        END  $$IBE$$*/ /* VR. ADIC */
    /* VALOR EXTRA */ /*$$IBE$$ 
    if ((CTAEXTRA IS NOT NULL) AND (CTAEXTRA <> '')) THEN
        BEGIN
        execute procedure redondee(VREXTRA, DIG) returning_values (VREXTRA);
        if (VREXTRA <> 0) THEN
            BEGIN
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTAEXTRA INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERROR (31, 0, :CTAEXTRA, 2);
                CUENTA = CTAEXTRA;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                begin
                EXECUTE PROCEDURE ERROR (31, 0, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VREXTRA, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - VREXTRA;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VREXTRA, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - VREXTRA;
                END
            END
        END  $$IBE$$*/ /* VR. EXTRA */
    /* RETENCION FUENTE */ /*$$IBE$$ 
    if ((RTFTE = 'C') or (RTFTE = 'K')) then
      BEGIN
      execute procedure redondee(VRRTFTE, DIG) returning_values (VRRTFTE);
      if (VRRTFTE <> 0) then
        BEGIN
        if (RTFTE = 'C') then
            CTARTFTE = TCTARTFTE;
        CUENTA = NULL;
        SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
            WHERE CUEN_COD = :CTARTFTE INTO :CUENTA, :TIPOCUEN;
        if (CUENTA IS NULL) then
            begin
            EXECUTE PROCEDURE ERROR (31, 0, :CTARTFTE, 2);
            CUENTA = CTARTFTE;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            begin
            EXECUTE PROCEDURE ERROR (31, 0, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :VRSUBT, :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTFTE;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :VRSUBT, :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTFTE;
            END
        END  $$IBE$$*/ /* RTFTE */ /*$$IBE$$ 
      END
     $$IBE$$*/ /* RETENCION IVA */ /*$$IBE$$ 
    if ((RTIVA = 'C') or (RTIVA = 'K')) then
      BEGIN
      execute procedure redondee(VRRTIVA, DIG) returning_values (VRRTIVA);
      if (VRRTIVA <> 0) then
        BEGIN
        if (RTIVA = 'C') then
            CTARTIVA = TCTARTIVA;
        CUENTA = NULL;
        SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
            WHERE CUEN_COD = :CTARTIVA INTO :CUENTA, :TIPOCUEN;
        if (CUENTA IS NULL) then
            begin
            EXECUTE PROCEDURE ERROR (31, 0, :CTARTIVA, 2);
            CUENTA = CTARTIVA;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            begin
            EXECUTE PROCEDURE ERROR (31, 0, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTIVA, 0, :VRIVA, :PORC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTIVA;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTIVA, 0, :VRIVA, :PORC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTIVA;
            END
        END  $$IBE$$*/ /* RTIVA */ /*$$IBE$$ 
      END
     $$IBE$$*/ /* RETENCION DE ICA */ /*$$IBE$$ 
    if ((RTICA = 'C') or (RTICA = 'K')) then
      BEGIN
      execute procedure redondee(VRRTICA, DIG) returning_values (VRRTICA);
      if (VRRTICA <> 0) then
        BEGIN
        if (RTICA = 'C') then
            CTARTICA = TCTARTICA;
        CUENTA = NULL;
        SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
            WHERE CUEN_COD = :CTARTICA INTO :CUENTA, :TIPOCUEN;
        if (CUENTA IS NULL) then
            begin
            EXECUTE PROCEDURE ERROR (31, 0, :CTARTICA, 2);
            CUENTA = CTARTICA;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            begin
            EXECUTE PROCEDURE ERROR (31, 0, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTICA, 0, :VRSUBT, :PRTICA, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTICA;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTICA, 0, :VRSUBT, :PRTICA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTICA;
            END
        END  $$IBE$$*/ /* RTICA */ /*$$IBE$$ 
      END
     $$IBE$$*/ /* CIERRE EL COMPROBANTE CONTRA LA CUENTA DEL TERCERO O LA CONSTANTE */ /*$$IBE$$ 
    if ((SUMA <> 0) and ((CARTERA = 'C') or (CARTERA = 'K') or (CARTERA = 'J'))) then
        BEGIN
        if (SUMA < 0) then
            BEGIN
            DEBITO = SUMA * -1;
            CREDITO = 0;
            END
        ELSE
            BEGIN
            DEBITO = 0;
            CREDITO = SUMA;
            END
        if (CARTERA = 'C') then
            CTACARTERA = TCTACLIEN;
        if (CARTERA = 'J') then
            BEGIN
             $$IBE$$*/ /* BUSQUE LA CUENTA DE LA CAJA */ /*$$IBE$$ 
            SELECT CAJA_CUENTA FROM CAJAS C, PUNTO_VENTA P
                WHERE P.CAJA_ID = C.CAJA_ID AND PTVT_ID = :PTOVTA
                INTO :CTACARTERA;
            END
        CUENTA = NULL;
        SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
            WHERE CUEN_COD = :CTACARTERA INTO :CUENTA, :TIPOCUEN;
        if (CUENTA IS NULL) then
            begin
            EXECUTE PROCEDURE ERROR (31, 0, :CTACARTERA, 2);
            CUENTA = CTACARTERA;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            begin
            EXECUTE PROCEDURE ERROR (31, 0, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'C') then
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :DEBITO, :CREDITO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
        if (TIPOCUEN = 'N') then
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :DEBITO, :CREDITO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
        NROI = NROI + 1;
        END  $$IBE$$*/ /* SUMA EN CARTERA */
    /* CALCULE LOS COSTOS */ /*$$IBE$$ 
    EXECUTE PROCEDURE costo_en_ventas_contado(:fecfac,  :pref, :ptvta);
    if (COSTOS = 'A') then
        BEGIN
        FOR SELECT MAX(CTACOS), SUM(COSTO)
            FROM COSTO_VENTAS
            GROUP BY CTACOS
            INTO :CTACOSTOS, :MONTO
        DO
            BEGIN
            if (MONTO <> 0) then
                BEGIN
                CUENTA = NULL;
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :CTACOSTOS INTO :CUENTA, :TIPOCUEN;
                IF (CUENTA IS NULL) THEN
                    begin
                    EXECUTE PROCEDURE ERROR (31, 0, :CTACOSTOS, 2);
                    CUENTA = CTARTFTE;
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                     $$IBE$$*/ /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */ /*$$IBE$$ 
                    FOR SELECT ARTI_COD, CANT * COSTO
                        FROM COSTO_VENTAS
                        WHERE CTACOS = :CUENTA
                        INTO :ART, :MONTO
                    DO
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    NROI = NROI + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    END
                END  $$IBE$$*/ /* MONTO <> 0 */ /*$$IBE$$ 
            END  $$IBE$$*/ /* FOR */ /*$$IBE$$ 
        END  $$IBE$$*/ /* COSTOS */ /*$$IBE$$ 
    if (COSTOS = 'K') then
        BEGIN
        SELECT SUM(COSTO)
            FROM COSTO_VENTAS
            INTO :MONTO;
        if (MONTO <> 0) then
            BEGIN
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTACOSTOS INTO :CUENTA, :TIPOCUEN;
            IF (CUENTA IS NULL) THEN
                begin
                EXECUTE PROCEDURE ERROR (31, 0, :CTACOSTOS, 2);
                CUENTA = CTARTFTE;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                 $$IBE$$*/ /* ES UNA CUENTA DE INVENTARIO, REGISTRE UNO A UNO LOS ARTICULOS */ /*$$IBE$$ 
                FOR SELECT ARTI_COD, CANT * COSTO
                    FROM COSTO_VENTAS
                    INTO :ART, :MONTO
                DO
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTACOSTOS, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                    NROI = NROI + 1;
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTACOSTOS, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTACOSTOS, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                END
            END  $$IBE$$*/ /* MONTO <> 0 */ /*$$IBE$$ 
        END  $$IBE$$*/ /* COSTOS = K */ /*$$IBE$$ 
    if (INVEN = 'A') then
        BEGIN
        FOR SELECT MAX(CTAINV), SUM(COSTO)
            FROM COSTO_VENTAS
            GROUP BY CTAINV
            INTO :CTAINVEN, :MONTO
        DO
            BEGIN
            if (MONTO <> 0) then
                BEGIN
                CUENTA = NULL;
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :CTAINVEN INTO :CUENTA, :TIPOCUEN;
                IF (CUENTA IS NULL) THEN
                    begin
                    EXECUTE PROCEDURE ERROR (31, 0, :CTAINVEN, 2);
                    CUENTA = CTAINVEN;
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                     $$IBE$$*/ /* ES UNA CUENTA DE INVENTARIO, REGISTRE UNO A UNO LOS ARTICULOS */ /*$$IBE$$ 
                    FOR SELECT ARTI_COD, CANT * COSTO
                        FROM COSTO_VENTAS
                        WHERE CTAINV = :CUENTA
                        INTO :ART, :MONTO
                    DO
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    NROI = NROI + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    END
                END  $$IBE$$*/ /* MONTO <> 0 */ /*$$IBE$$ 
            END  $$IBE$$*/ /* FOR */ /*$$IBE$$ 
        END  $$IBE$$*/ /* INVEN = A */ /*$$IBE$$ 
    if (INVEN = 'K') then
        BEGIN
        SELECT SUM(COSTO)
            FROM COSTO_VENTAS
            INTO :MONTO;
        if (MONTO <> 0) then
            BEGIN
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTAINVEN INTO :CUENTA, :TIPOCUEN;
            IF (CUENTA IS NULL) THEN
                begin
                EXECUTE PROCEDURE ERROR (31, 0, :CTAINVEN, 2);
                CUENTA = CTAINVEN;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                 $$IBE$$*/ /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */ /*$$IBE$$ 
                FOR SELECT ARTI_COD, CANT * COSTO
                    FROM COSTO_VENTAS
                    INTO :ART, :MONTO
                DO
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTAINVEN, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                    NROI = NROI + 1;
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAINVEN, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAINVEN, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                END
            END  $$IBE$$*/ /* MONTO <> 0 */ /*$$IBE$$ 
        END  $$IBE$$*/ /* INVEN = K */
    /* recorra las cuentas adicionales */ /*$$IBE$$ 
    FOR SELECT INVC_CUENTA, INVC_BASE, INVC_PORC, INVC_VALOR, INVC_DB
        FROM INTERFAZ_VENTAS_CTAS
        WHERE INVE_ID = :IDINTER
        INTO :CTADIC, :BASEADIC, :PORCADIC, :VALORADIC, :DBADIC
        DO
        BEGIN
        if (VALORADIC <> 0) then
            MONTO = VALORADIC;
        ELSE
            BEGIN
            if (:BASEADIC = 'SUBTOTAL') then
                VALORADIC = vrsubt;
            if (:BASEADIC = 'DESCUENTO') then
                VALORADIC = VRDTO;
            if (:BASEADIC = 'IVA') then
                VALORADIC = VRIVA;
            if (:BASEADIC = 'ADICIONAL') then
                VALORADIC = VRADIC;
            if (:BASEADIC = 'EXTRA') then
                VALORADIC = VREXTRA;
            if (:BASEADIC = 'TOTAL') then
                VALORADIC = VRTOTAL;
            MONTO = VALORADIC * PORCADIC / 100;
            END
        if (MONTO <> 0) then
            BEGIN
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTADIC INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERROR (31, 0, :CTADIC, 2);
                CUENTA = CTADIC;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                begin
                EXECUTE PROCEDURE ERROR (31, 0, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'C') then
                BEGIN
                if (DBADIC = 'S') then
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                ELSE
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                if (DBADIC = 'S') then
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                ELSE
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                END
            NROI = NROI + 1;
            END
        END
    if (ERROR > 0) then
        VER = 'S';
    SUSPEND;
    END  $$IBE$$*/ /* EXISTE LA INTERFAZ */ /*$$IBE$$ 
ELSE
    BEGIN
    EXECUTE PROCEDURE ERROR (31, 0, :PREF, 1);
    ERROR = ERROR + 1;
    VER = 'S';
    SUSPEND;
    END
 $$IBE$$*/ SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE EXISTENCIAS_DESDE_HASTA(
    FECHA DATE,
    ARTINI VARCHAR(20),
    ARTFIN VARCHAR(20),
    GRPINI VARCHAR(3),
    GRPFIN VARCHAR(3),
    BODINI VARCHAR(2),
    BODFIN VARCHAR(2),
    ORDEN CHAR(1),
    AGRUPA CHAR(1),
    DETALLE CHAR(1),
    RESERVA CHAR(1),
    ENPESO CHAR(1),
    SUCURSAL INTEGER)
RETURNS (
    CANT NUMERIC(18,4),
    COSTO NUMERIC(18,2),
    COSTO_LOTE NUMERIC(18,2),
    CODIGO VARCHAR(15),
    NOMBRE VARCHAR(60),
    UNIDAD VARCHAR(8),
    STAND VARCHAR(15),
    CODGRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    CODSUBG VARCHAR(3),
    NOMSUBG VARCHAR(30),
    CODMARC VARCHAR(3),
    NOMMARC VARCHAR(30),
    CODBOD VARCHAR(2),
    LOTE VARCHAR(15),
    NOMBOD VARCHAR(30),
    COSTOTOT NUMERIC(18,2),
    ULTCOSTO NUMERIC(18,2),
    FECHACOSTO DATE,
    CONSUMO NUMERIC(18,2),
    RESERVADO NUMERIC(18,4),
    ORDENADO NUMERIC(18,4),
    IVA NUMERIC(9,2),
    PESOUNIT NUMERIC(18,4),
    PESOTOTAL NUMERIC(18,4),
    CODBAR VARCHAR(20))
AS
declare variable exist char(1);
declare variable codini varchar(20);
declare variable codfin varchar(20);
declare variable desini varchar(20);
declare variable desfin varchar(20);
declare variable ordenc numeric(18,4);
declare variable pedido numeric(18,4);
declare variable ok char(1);
declare variable id integer;
declare variable item integer;
declare variable und varchar(8);
declare variable factor numeric(18,4);
declare variable cant2 numeric(18,4);
declare variable PEDAUTO CHAR(2);
BEGIN /*$$IBE$$ 
if (ORDEN = 'C') then
    BEGIN
    CODINI = ARTINI;
    CODFIN = ARTFIN;
    DESINI = '';
    DESFIN = 'zz';
    END
ELSE
    BEGIN
    DESINI = ARTINI;
    DESFIN = ARTFIN;
    CODINI = '';
    CODFIN = 'zz';
    END
EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION', 'FACTURAS', 'GENERAR PEDIDO AUTOMATICAMENTE CON LA FACTURA') returning_values (pedauto);
if (DETALLE = 'B') then
  BEGIN
  FOR SELECT ARTI_COD, ARTI_DES, ARTI_UNIDAD, ARTI_EXIST, TAIV_PORC, A.GRUP_COD, A.SUBG_COD, A.MARC_COD, BODE_COD, BODE_NOM, ARTI_CONSUMO, ARTI_PESO/1000
      FROM ARTICULO A, BODEGA B, TARIFA_IVA T
      WHERE ARTI_COD >= :CODINI AND ARTI_COD <= :CODFIN AND ARTI_DES >= :DESINI AND ARTI_DES <= :DESFIN AND ESAR_COD <> 'I' AND BODE_COD >= :BODINI AND
      BODE_COD <= :BODFIN AND ((SUCU_ID = :SUCURSAL) or (:SUCURSAL = 0)) AND A.TAIV_COD = T.TAIV_COD
      INTO :CODIGO, :NOMBRE, :UNIDAD, :EXIST, :IVA, :CODGRUPO, :CODSUBG, :CODMARC, :CODBOD, :NOMBOD, :CONSUMO, :pesounit
      DO
        BEGIN
        OK = 'N';
        if (AGRUPA = 'G') then
            BEGIN
            if ((CODGRUPO >= GRPINI) AND (CODGRUPO <= GRPFIN)) then
                OK = 'S';
            end
        ELSE
            if (AGRUPA = 'M') then
                BEGIN
                if ((CODMARC >= GRPINI) AND (CODMARC <= GRPFIN)) then
                    OK = 'S';
                END
        if (OK = 'S') then
            BEGIN
            NOMGRUPO = '';
            NOMMARC = '';
            NOMSUBG = '';
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            SELECT MAX(COBA_COD) FROM BARRAS_ARTICULO WHERE ARTI_COD = :codigo AND COBA_UNIDAD = :unidad INTO :codbar;
            if (CODBAR IS NULL) then
                CODBAR = CODIGO;
            if (EXIST <> 'N') then
                BEGIN
                SELECT STAND_COD FROM STANDS WHERE ARTI_COD = :CODIGO AND STAND_BODEGA = :CODBOD INTO :STAND;
                EXECUTE PROCEDURE SALDO_INICIAL_INVENTARIO(CODIGO, FECHA, :CODBOD) returning_values (CANT);
                EXECUTE PROCEDURE COSTO_PROMEDIO_UNIDAD(CODIGO, FECHA, UNIDAD) returning_values (COSTO);
                EXECUTE PROCEDURE ULTIMO_COSTO(CODIGO, FECHA, UNIDAD) returning_values (ULTCOSTO);
                SELECT MAX(MVAR_FECHA) FROM MOVIMIENTO_ARTICULO WHERE ARTI_COD = :CODIGO AND MVAR_ENTRADA = 'S' AND MVAR_FECHA <= :FECHA INTO :FECHACOSTO;
                COSTOTOT = :CANT * :COSTO;
                CONSUMO = CONSUMO * CANT;
                if (RESERVA = 'S') then
                    BEGIN
                    SELECT SUM(ORID_ENTREGAR)
                        FROM ORDENINVENTARIO_DETALLE OD, ordenes_inventario O
                        WHERE O.ORIN_ID = OD.ORIN_ID AND ARTI_COD = :CODIGO AND ORIN_FECHA <= :FECHA AND ORIN_FECLLEGA >= :FECHA AND ORID_ANULADO = 'N' AND OD.BODE_COD = :CODBOD
                        INTO :ORDENADO;
                    if (ORDENADO IS NULL) then
                        ORDENADO = 0;
                    ORDENC = 0;
                    FOR SELECT O.ORDC_ID, OCDE_ITEM, OCDE_CANT * OCDE_FACTOR
                        FROM ORDENES_COMPRA O, ORDENES_COMPRA_DETALLE OD
                        WHERE O.ORDC_ID = OD.ORDC_ID AND OD.ARTI_COD = :CODIGO AND (ORDC_FECHA+ORDC_VALIDEZ) >= :FECHA AND ORDC_FECHA <= :FECHA AND OCDE_ANULADO = 'N' AND OD.BODE_COD = :CODBOD
                        INTO :ID, :ITEM, :CANT2
                        do
                        BEGIN
                        EXECUTE PROCEDURE FALTANTE(23, 21, ID, ITEM) returning_values (PEDIDO, UND, FACTOR);
                        if (PEDIDO * FACTOR = CANT2) then  $$IBE$$*/ /* SI NO SE HA FACTURADO MIRE A VER SI SE REMISIONO */ /*$$IBE$$ 
                            EXECUTE PROCEDURE FALTANTE(23, 22, ID, ITEM) returning_values (PEDIDO, UND, FACTOR);
                        if (PEDIDO IS NULL) then
                            PEDIDO = 0;
                        ORDENC = ORDENC + PEDIDO * FACTOR;
                        END
                    ORDENADO = ORDENADO + ORDENC;
                    SELECT SUM(RSDE_LIBERAR)
                        FROM RESERVAS_DETALLE RD, RESERVAS R
                        WHERE R.RESE_ID = RD.RESE_ID AND ARTI_COD = :CODIGO AND RESE_FECHA <= :FECHA AND RESE_VENCE >= :FECHA AND RD.BODE_COD = :CODBOD AND RSDE_ANULADO = 'N'
                        INTO :RESERVADO;
                    if (RESERVADO IS NULL) then
                        RESERVADO = 0;
                    PEDIDO = 0;
                    FOR SELECT P.PEDI_ID, PEDE_ITEM, PEDE_CANT * PEDE_FACTOR
                        FROM PEDIDOS P, PEDIDOS_DETALLE PD
                        WHERE P.PEDI_ID = PD.PEDI_ID AND PD.ARTI_COD = :CODIGO AND (PEDI_FECHA+PEDI_VALIDEZ) >= :FECHA AND PEDI_FECHA <= :FECHA AND PEDE_ANULADO = 'N' AND BODE_COD = :CODBOD
                        INTO :ID, :ITEM, :CANT2
                        do
                        BEGIN
                        EXECUTE PROCEDURE FALTANTE(34, 31, ID, ITEM) returning_values (ORDENC, UND, FACTOR);
                        if ((ORDENC * FACTOR = CANT2) or (PEDAUTO = 'SI')) then  $$IBE$$*/ /* SI NO SE HA FACTURADO MIRE A VER SI SE REMISIONO */ /*$$IBE$$ 
                            EXECUTE PROCEDURE FALTANTE(34, 32, ID, ITEM) returning_values (ORDENC, UND, FACTOR);
                        if (ORDENC IS NULL) then
                            ORDENC = 0;
                        PEDIDO = PEDIDO + ORDENC * FACTOR;
                        END
                    RESERVADO = RESERVADO + PEDIDO;
                    END
                ELSE
                    BEGIN
                    RESERVADO = 0;
                    ORDENADO = 0;
                    END
                if (ENPESO = 'S') then
                    BEGIN
                    if (pesounit IS NULL) then
                        pesounit = 0;
                    if (PESOUNIT <> 0) then
                        BEGIN
                        pesototal = PESOUNIT * cant;
                        SUSPEND;
                        END
                    END
                ELSE
                    SUSPEND;
                END
            END
        END
  END

if (DETALLE = 'L') then
  BEGIN
  FOR SELECT A.ARTI_COD, ARTI_DES, ARTI_UNIDAD, ARTI_EXIST, TAIV_PORC, A.GRUP_COD, A.SUBG_COD, A.MARC_COD, L.lote_nro, L.lote_nro||' - '||L.lote_vence, ARTI_CONSUMO,l.bode_cod, L.lote_saldo,l.lote_costo, ARTI_PESO/1000
      FROM ARTICULO A, LOTES l, TARIFA_IVA T
      WHERE A.ARTI_COD >= '0' AND A.ARTI_COD <= 'zz' AND ARTI_DES >= '' AND ARTI_DES <= 'zz' AND ESAR_COD <> 'I' AND A.TAIV_COD = T.TAIV_COD and a.arti_cod = l.arti_cod
      INTO :CODIGO, :NOMBRE, :UNIDAD, :EXIST, :IVA, :CODGRUPO, :CODSUBG, :CODMARC, :LOTE, :NOMBOD, :CONSUMO, :codbod, :cant, :costo_lote, :pesounit
      DO
        BEGIN
        OK = 'N';
        if (AGRUPA = 'G') then
            BEGIN
            if ((CODGRUPO >= GRPINI) AND (CODGRUPO <= GRPFIN)) then
                OK = 'S';
            end
        ELSE
            if (AGRUPA = 'M') then
                BEGIN
                if ((CODMARC >= GRPINI) AND (CODMARC <= GRPFIN)) then
                    OK = 'S';
                END
        if (OK = 'S') then
            BEGIN
            NOMGRUPO = '';
            NOMMARC = '';
            NOMSUBG = '';
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            SELECT MAX(COBA_COD) FROM BARRAS_ARTICULO WHERE ARTI_COD = :codigo AND COBA_UNIDAD = :unidad INTO :codbar;
            if (CODBAR IS NULL) then
                CODBAR = CODIGO;

            if (EXIST <> 'N') then
                BEGIN
                EXECUTE PROCEDURE COSTO_PROMEDIO_UNIDAD(CODIGO, FECHA, UNIDAD) returning_values (COSTO);
                EXECUTE PROCEDURE ULTIMO_COSTO(CODIGO, FECHA, UNIDAD) returning_values (ULTCOSTO);
                SELECT MAX(MVAR_FECHA) FROM MOVIMIENTO_ARTICULO WHERE ARTI_COD = :CODIGO AND MVAR_ENTRADA = 'S' AND MVAR_FECHA <= :FECHA INTO :FECHACOSTO;
                COSTOTOT = :CANT * :COSTO;
                CONSUMO = CONSUMO * CANT;
                if (RESERVA = 'S') then
                    BEGIN
                    SELECT SUM(ORID_ENTREGAR)
                        FROM ORDENINVENTARIO_DETALLE OD, ordenes_inventario O
                        WHERE O.ORIN_ID = OD.ORIN_ID AND ARTI_COD = :CODIGO AND ORIN_FECHA <= :FECHA AND ORIN_FECLLEGA >= :FECHA AND ORID_ANULADO = 'N'
                        INTO :ORDENADO;
                    if (ORDENADO IS NULL) then
                        ORDENADO = 0;
                    ORDENC = 0;
                    FOR SELECT O.ORDC_ID, OCDE_ITEM, OCDE_CANT * OCDE_FACTOR
                        FROM ORDENES_COMPRA O, ORDENES_COMPRA_DETALLE OD
                        WHERE O.ORDC_ID = OD.ORDC_ID AND OD.ARTI_COD = :CODIGO AND (ORDC_FECHA+ORDC_VALIDEZ) >= :FECHA AND ORDC_FECHA <= :FECHA AND OCDE_ANULADO = 'N'
                        INTO :ID, :ITEM, :CANT2
                        do
                        BEGIN
                        EXECUTE PROCEDURE FALTANTE(23, 21, ID, ITEM) returning_values (PEDIDO, UND, FACTOR);
                        if (PEDIDO * FACTOR = CANT2) then  $$IBE$$*/ /* SI NO SE HA FACTURADO MIRE A VER SI SE REMISIONO */ /*$$IBE$$ 
                            EXECUTE PROCEDURE FALTANTE(23, 22, ID, ITEM) returning_values (PEDIDO, UND, FACTOR);
                        if (PEDIDO IS NULL) then
                            PEDIDO = 0;
                        ORDENC = ORDENC + PEDIDO * FACTOR;
                        END
                    ORDENADO = ORDENADO + ORDENC;
                    SELECT SUM(RSDE_LIBERAR)
                        FROM RESERVAS_DETALLE RD, RESERVAS R
                        WHERE R.RESE_ID = RD.RESE_ID AND ARTI_COD = :CODIGO AND RESE_FECHA <= :FECHA AND RESE_VENCE >= :FECHA AND RSDE_ANULADO = 'N'
                        INTO :RESERVADO;
                    if (RESERVADO IS NULL) then
                        RESERVADO = 0;
                    PEDIDO = 0;
                    FOR SELECT P.PEDI_ID, PEDE_ITEM, PEDE_CANT * PEDE_FACTOR
                        FROM PEDIDOS P, PEDIDOS_DETALLE PD
                        WHERE P.PEDI_ID = PD.PEDI_ID AND PD.ARTI_COD = :CODIGO AND (PEDI_FECHA+PEDI_VALIDEZ) >= :FECHA AND PEDI_FECHA <= :FECHA AND PEDE_ANULADO = 'N'
                        INTO :ID, :ITEM, :CANT2
                        do
                        BEGIN
                        EXECUTE PROCEDURE FALTANTE(34, 31, ID, ITEM) returning_values (ORDENC, UND, FACTOR);
                        if ((ORDENC * FACTOR = CANT2) or (PEDAUTO = 'SI')) then  $$IBE$$*/ /* SI NO SE HA FACTURADO MIRE A VER SI SE REMISIONO */ /*$$IBE$$ 
                            EXECUTE PROCEDURE FALTANTE(34, 32, ID, ITEM) returning_values (ORDENC, UND, FACTOR);
                        if (ORDENC IS NULL) then
                            ORDENC = 0;
                        PEDIDO = PEDIDO + ORDENC * FACTOR;
                        END
                    RESERVADO = RESERVADO + PEDIDO;
                    END
                ELSE
                    BEGIN
                    RESERVADO = 0;
                    ORDENADO = 0;
                    END
                if (ENPESO = 'S') then
                    BEGIN
                    if (pesounit IS NULL) then
                        pesounit = 0;
                    if (PESOUNIT <> 0) then
                        BEGIN
                        pesototal = PESOUNIT * cant;
                        SUSPEND;
                        END
                    END
                ELSE
                    SUSPEND;
                END
            END
        END
  end
if (DETALLE = 'N') then
  BEGIN
  FOR SELECT ARTI_COD, ARTI_DES, ARTI_UNIDAD, ARTI_EXIST, TAIV_PORC, A.GRUP_COD, A.SUBG_COD, A.MARC_COD, ARTI_CONSUMO, ARTI_PESO/1000
      FROM ARTICULO A, TARIFA_IVA T
      WHERE ARTI_COD >= :CODINI AND ARTI_COD <= :CODFIN AND ARTI_DES >= :DESINI AND ARTI_DES <= :DESFIN AND ESAR_COD <> 'I' AND A.TAIV_COD = T.TAIV_COD
      INTO :CODIGO, :NOMBRE, :UNIDAD, :EXIST, :IVA, :CODGRUPO, :CODSUBG, :CODMARC, :CONSUMO, :pesounit
      DO
        BEGIN
        OK = 'N';
        if (AGRUPA = 'G') then
            BEGIN
            if ((GRPINI = '0') AND (GRPFIN = 'zz')) then
                OK = 'S';
            else
                if ((CODGRUPO >= GRPINI) AND (CODGRUPO <= GRPFIN)) then
                    OK = 'S';
            end
        ELSE
            if (AGRUPA = 'M') then
                BEGIN
                if ((GRPINI = '0') AND (GRPFIN = 'zzz')) then
                    OK = 'S';
                else
                    if ((CODMARC >= GRPINI) AND (CODMARC <= GRPFIN)) then
                        OK = 'S';
                END
        if (OK = 'S') then
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            SELECT MAX(COBA_COD) FROM BARRAS_ARTICULO WHERE ARTI_COD = :codigo AND COBA_UNIDAD = :unidad INTO :codbar;
            if (CODBAR IS NULL) then
                CODBAR = CODIGO;

            if (EXIST <> 'N') then
                BEGIN
                EXECUTE PROCEDURE SALDO_INICIAL_TOTAL_INV(CODIGO, FECHA) returning_values (CANT);
                EXECUTE PROCEDURE COSTO_PROMEDIO_UNIDAD(CODIGO, FECHA, UNIDAD) returning_values (COSTO);
                EXECUTE PROCEDURE ULTIMO_COSTO(CODIGO, FECHA, UNIDAD) returning_values (ULTCOSTO);
                SELECT MAX(MVAR_FECHA) FROM MOVIMIENTO_ARTICULO WHERE ARTI_COD = :CODIGO AND MVAR_ENTRADA = 'S' AND MVAR_FECHA <= :FECHA INTO :FECHACOSTO;
                COSTOTOT = :CANT * :COSTO;
                CONSUMO = CONSUMO * CANT;
                if (RESERVA = 'S') then
                    BEGIN
                    SELECT SUM(ORID_ENTREGAR)
                        FROM ORDENINVENTARIO_DETALLE OD, ordenes_inventario O
                        WHERE O.ORIN_ID = OD.ORIN_ID AND ARTI_COD = :CODIGO AND ORIN_FECHA <= :FECHA AND ORIN_FECLLEGA >= :FECHA AND ORID_ANULADO = 'N'
                        INTO :ORDENADO;
                        if (ORDENADO IS NULL) then
                            ORDENADO = 0;
                    ORDENC = 0;
                    FOR SELECT O.ORDC_ID, OCDE_ITEM, OCDE_CANT * OCDE_FACTOR
                        FROM ORDENES_COMPRA O, ORDENES_COMPRA_DETALLE OD
                        WHERE O.ORDC_ID = OD.ORDC_ID AND OD.ARTI_COD = :CODIGO AND (ORDC_FECHA+ORDC_VALIDEZ) >= :FECHA AND ORDC_FECHA <= :FECHA AND OCDE_ANULADO = 'N'
                        INTO :ID, :ITEM, :CANT2
                        do
                        BEGIN
                        EXECUTE PROCEDURE FALTANTE(23, 21, ID, ITEM) returning_values (PEDIDO, UND, FACTOR);
                        if (PEDIDO * FACTOR = CANT2) then  $$IBE$$*/ /* SI NO SE HA FACTURADO MIRE A VER SI SE REMISIONO */ /*$$IBE$$ 
                            EXECUTE PROCEDURE FALTANTE(23, 22, ID, ITEM) returning_values (PEDIDO, UND, FACTOR);
                        if (PEDIDO IS NULL) then
                            PEDIDO = 0;
                        ORDENC = ORDENC + PEDIDO * FACTOR;
                        END
                    ORDENADO = ORDENADO + ORDENC;
                    SELECT SUM(RSDE_LIBERAR)
                        FROM RESERVAS_DETALLE RD, RESERVAS R
                        WHERE R.RESE_ID = RD.RESE_ID AND ARTI_COD = :CODIGO AND RESE_FECHA <= :FECHA AND RESE_VENCE >= :FECHA AND RSDE_ANULADO = 'N'
                        INTO :RESERVADO;
                    if (RESERVADO IS NULL) then
                        RESERVADO = 0;
                    PEDIDO = 0;
                    FOR SELECT P.PEDI_ID, PEDE_ITEM, PEDE_CANT * PEDE_FACTOR
                        FROM PEDIDOS P, PEDIDOS_DETALLE PD, PUNTO_VENTA PT
                        WHERE P.PEDI_ID = PD.PEDI_ID AND PD.ARTI_COD = :CODIGO AND PT.ptvt_id = P.PTVT_ID AND (PEDI_FECHA+PEDI_VALIDEZ) >= :FECHA AND PEDI_FECHA <= :FECHA AND PEDE_ANULADO = 'N'
                        INTO :ID, :ITEM, :CANT2
                        do
                        BEGIN
                        EXECUTE PROCEDURE FALTANTE(34, 31, ID, ITEM) returning_values (ORDENC, UND, FACTOR);
                        if ((ORDENC * FACTOR = CANT2) or (PEDAUTO = 'SI')) then  $$IBE$$*/ /* SI NO SE HA FACTURADO MIRE A VER SI SE REMISIONO */ /*$$IBE$$ 
                            EXECUTE PROCEDURE FALTANTE(34, 32, ID, ITEM) returning_values (ORDENC, UND, FACTOR);
                        if (ORDENC IS NULL) then
                            ORDENC = 0;
                        PEDIDO = PEDIDO + ORDENC * FACTOR;
                        END
                    if (PEDIDO IS NULL) then
                        PEDIDO = 0;
                    RESERVADO = RESERVADO + PEDIDO;
                    END
                ELSE
                    BEGIN
                    RESERVADO = 0;
                    ORDENADO = 0;
                    END
                if (ENPESO = 'S') then
                    BEGIN
                    if (pesounit IS NULL) then
                        pesounit = 0;
                    if (PESOUNIT <> 0) then
                        BEGIN
                        pesototal = PESOUNIT * cant;
                        SUSPEND;
                        END
                    END
                ELSE
                    SUSPEND;
                END
            END
        END
  END
 $$IBE$$*/ SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE INVENTARIO_FAMILIA(
    FECHA DATE,
    FAMILIA VARCHAR(20))
RETURNS (
    ARTICULO VARCHAR(20),
    INTERNO VARCHAR(20),
    DESCRIPCION VARCHAR(60),
    CANTIDAD NUMERIC(18,2),
    UNIDAD VARCHAR(8),
    TOTAL NUMERIC(18,2))
AS
declare variable COSTO NUMERIC(18,4);
begin /*$$IBE$$ 
FOR SELECT A.ARTI_COD, ARTI_DES, ARTI_UNIDAD, p.pvar_cod FROM ARTICULO A, PROVEEDOR_ARTICULO P
    WHERE ESAR_COD <> 'I' AND A.arti_cod = P.arti_cod AND P.terc_nit = :FAMILIA
    INTO :ARTICULO, :descripcion, :UNIDAD, :INTERNO
    DO
    BEGIN
    EXECUTE PROCEDURE SALDO_INICIAL_TOTAL_INV(ARTICULO, FECHA) returning_values (cantidad);
    EXECUTE PROCEDURE COSTO_PROMEDIO_UNIDAD(ARTICULO, FECHA, UNIDAD) returning_values (COSTO);
    TOTAL = COSTO * CANTIDAD;
    suspend;
    END
 $$IBE$$*/ SUSPEND;
end
^

SET TERM ; ^

SET TERM ^ ;

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

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE DEVOLUCIONES_SIN_CONTABILIDAD(
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    ID INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    ESTADO VARCHAR(20),
    IDI INTEGER,
    IDC INTEGER)
AS
DECLARE VARIABLE VER CHAR(2);
declare variable FECICNT VARCHAR(10);
declare variable FECFCNT VARCHAR(10);
declare variable ERROR INTEGER;
declare variable idref INTEGER;
BEGIN /*$$IBE$$ 
EXECUTE PROCEDURE fecha_a_conta(FECINI) returning_values (FECICNT);
EXECUTE PROCEDURE fecha_a_conta(FECFIN) returning_values (FECFCNT);
FOR SELECT DEVT_ID, PREF_PRE, DEVT_NUMERO FROM devoluciones_ventas WHERE DEVT_ANULADO = 'N' AND
    DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN
    INTO :ID, :PREF, :NUMERO
DO
  BEGIN
  idref = null;
  SELECT ENCO_IDREF FROM COMPROBANTE_ENCABEZADO WHERE ENCO_TIPOREF = 33 AND ENCO_FECHA >= :FECICNT AND ENCO_FECHA <= :FECFCNT and ENCO_IDREF = :id into :idref;
  if (idref IS NULL) then
  begin
   ESTADO = 'PROCESANDO';
   SUSPEND;
   SELECT MAX(INVE_ID) FROM INTERFAZ_VENTAS WHERE PREF_PRE = :PREF AND TIDO_COD = 33 INTO :IDI;
   EXECUTE PROCEDURE contabil_devolcli (:ID, :IDI) RETURNING_VALUES (:ERROR, :VER, :IDC);
   if (ERROR = 0) then
    BEGIN
    EXECUTE PROCEDURE CONTABILIZA_PENDIENTE (:IDC);
    ESTADO = 'OK';
    END
   ELSE
    ESTADO = 'ERROR';
   suspend;
  End
  END
 $$IBE$$*/ SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE FACTURAS_SIN_CONTABILIDAD(
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    ID INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    ESTADO VARCHAR(20),
    IDI INTEGER,
    IDC INTEGER)
AS
DECLARE VARIABLE VER CHAR(2);
declare variable FECICNT VARCHAR(10);
declare variable FECFCNT VARCHAR(10);
declare variable ERROR INTEGER;
declare variable idref INTEGER;
BEGIN /*$$IBE$$ 
EXECUTE PROCEDURE fecha_a_conta(FECINI) returning_values (FECICNT);
EXECUTE PROCEDURE fecha_a_conta(FECFIN) returning_values (FECFCNT);
FOR SELECT FACT_ID, PREF_PRE, FACT_NUMERO FROM FACTURAS WHERE FACT_ANULADO = 'N' AND
    FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN INTO :ID, :PREF, :NUMERO
DO
  BEGIN
  idref = null;
  SELECT ENCO_IDREF FROM COMPROBANTE_ENCABEZADO WHERE ENCO_TIPOREF = 31 AND ENCO_FECHA >= :FECICNT AND ENCO_FECHA <= :FECFCNT and ENCO_IDREF = :ID into :idref;
  if (idref IS NULL) then
  begin
   ESTADO = 'PROCESANDO';
   ERROR = NULL;
   SUSPEND;
   SELECT MAX(INVE_ID) FROM INTERFAZ_VENTAS WHERE PREF_PRE = :PREF AND TIDO_COD = 31 INTO :IDI;
   EXECUTE PROCEDURE CONTABIL_FACTURA (:ID, :IDI) RETURNING_VALUES (:ERROR, VER, :IDC);
   if ((ERROR = 0) or (error IS NULL)) then
    BEGIN
    EXECUTE PROCEDURE CONTABILIZA_PENDIENTE (:IDC);
    ESTADO = 'OK';
    END
   ELSE
    ESTADO = 'ERROR';
   suspend;
  end
  END
 $$IBE$$*/ SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE ACTUALICE_COSTO(
    ARTICULO VARCHAR(15),
    FECHA DATE,
    COSTO NUMERIC(18,2),
    CANTIDAD NUMERIC(18,2),
    ENTRADA CHAR(1),
    ANULAR CHAR(1),
    IDMOV INTEGER,
    TIPO INTEGER)
AS
DECLARE VARIABLE saldo NUMERIC(18,2);
DECLARE VARIABLE COSTOP NUMERIC(18,2);
DECLARE VARIABLE exart CHAR(1);
DECLARE VARIABLE UCOSTO NUMERIC(18,2);
declare variable FECAUX DATE;
declare variable SALDOC NUMERIC(15,4);
declare variable ITEM INTEGER;
declare variable UNIDAD VARCHAR(8);
BEGIN
/* Verfique si el artículo tiene control de existencias */
SELECT arti_exist, ARTI_UNIDAD FROM articulo WHERE arti_COD = :articulo
    INTO :exart, :UNIDAD;
IF (exart <> 'N') THEN
    BEGIN
    if (ANULAR = 'S') then
        BEGIN
        select cost_saldoc, cost_saldop from costos
            WHERE (arti_cod = :articulo) AND (cost_fecha = :fecha) AND (cost_idmov = :IDMOV) AND (COST_TIPO = :TIPO)
            into :SALDOC, :SALDO; /* para dejar inicializadas las 2 variables */
        DELETE FROM COSTOS WHERE (arti_cod = :articulo) AND (cost_fecha = :fecha) AND (cost_idmov = :IDMOV) AND (COST_TIPO = :TIPO);
        /* para inicializar el ultimo costo */
        SELECT MAX(COST_FECHA) FROM costos
            WHERE (arti_cod = :articulo) AND (cost_fecha <= :fecha) INTO :FECAUX;
        if (FECAUX IS NULL) then
            UCOSTO = 0;
        ELSE
            BEGIN
            SELECT MAX(COST_ITEM) FROM costos
                WHERE (arti_cod = :articulo) AND (cost_fecha = :fecaux) INTO :ITEM;
            SELECT COST_ULTIMO FROM costos
                WHERE (arti_cod = :articulo) AND (cost_fecha = :fecaux) AND (cost_item = :ITEM) INTO :UCOSTO;
            END
        END
    ELSE
        BEGIN
        select max(cost_fecha) from costos WHERE (arti_cod = :articulo) AND (cost_fecha <= :fecha) into :fecaux;
        select max(cost_item) from costos WHERE (arti_cod = :articulo) AND (cost_fecha = :fecaux) into :item;
        select (cost_saldoc + cost_entc - cost_salc) from costos WHERE (arti_cod = :articulo) AND (cost_fecha = :fecaux) AND (cost_item = :item) into :saldoc;
        if (saldoc is null) THEN
            SALDOC = 0;
        EXECUTE PROCEDURE costo_promedio(:articulo, :fecha) RETURNING_VALUES :costop;
        if (ENTRADA = 'S') then
            if (TIPO = 33) then
                BEGIN
                EXECUTE PROCEDURE ULTIMO_COSTO(ARTICULO, FECHA, UNIDAD) returning_values (UCOSTO);
                INSERT INTO COSTOS (arti_cod, cost_fecha,
                    cost_entc, cost_entp, cost_salc, cost_salp,
                    cost_saldoc, cost_saldop, cost_ultimo, cost_idmov, cost_tipo)
                    VALUES (:articulo, :fecha, :cantidad, :cantidad*:costop, 0, 0, :saldoc, :saldoc*:costop, :ucosto, :IDMOV, :TIPO);
                SALDO = (SALDOC * COSTOP) + (CANTIDAD * COSTOP);
                SALDOC = SALDOC + CANTIDAD;
                END
            ELSE
                BEGIN
                UCOSTO = :COSTO;
                INSERT INTO COSTOS (arti_cod, cost_fecha,
                    cost_entc, cost_entp, cost_salc, cost_salp,
                    cost_saldoc, cost_saldop, cost_ultimo, cost_idmov, cost_tipo)
                    VALUES (:articulo, :fecha, :cantidad, :cantidad*:costo, 0, 0, :saldoc, :saldoc*:costop, :costo, :IDMOV, :TIPO);
                SALDO = (SALDOC * COSTOP) + (CANTIDAD * COSTO);
                SALDOC = SALDOC + CANTIDAD;
                END
        ELSE
            BEGIN
            EXECUTE PROCEDURE ULTIMO_COSTO(ARTICULO, FECHA, UNIDAD) returning_values (UCOSTO);
            INSERT INTO COSTOS (arti_cod, cost_fecha,
                cost_entc, cost_entp, cost_salc, cost_salp,
                cost_saldoc, cost_saldop, cost_ultimo, cost_idmov, cost_tipo)
                VALUES (:articulo, :fecha, 0, 0, :cantidad, :cantidad*:costop, :saldoc, :saldoc*:costop, :UCOSTO, :IDMOV, :TIPO);
            SALDOC = SALDOC - CANTIDAD;
            SALDO = SALDOC * COSTOP; /* YA ESTA RESTADA LA CANTIDAD */
            END
        END
    END
END

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE CALCULA_PRECIOS(
    ARTICULO VARCHAR(20),
    FECHA DATE)
AS
declare variable LISTA INTEGER;
declare variable MARGEN NUMERIC(9, 4);
declare variable UTIL NUMERIC(9, 4);
declare variable UNIDAD VARCHAR(8);
declare variable UOR VARCHAR(20);
declare variable COSTOP NUMERIC(18, 2);
declare variable COSTOU NUMERIC(18, 2);
declare variable COSTO NUMERIC(18, 2);
declare variable DIG INTEGER;
declare variable IVAINC CHAR(1);
declare variable TARIVA NUMERIC(9,2);
declare variable AUTOM CHAR(1);
declare variable BASE varchar(10);
declare variable CAMBIO CHAR(7);
BEGIN
EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION','ARTICULOS','CAMBIO DE PRECIOS AUTOMATICO AL CAMBIAR COSTO O PRECIO') returning_values (CAMBIO);
if (CAMBIO = 'COSTO') then
  BEGIN
  FOR SELECT P.LIPR_COD, PRAR_MARGEN, PRAR_UTIL, LIPR_MODIF, PRAR_AUTO
    FROM PRECIOS_ARTICULO P, LISTA_PRECIOS L
    WHERE P.LIPR_COD = L.LIPR_COD AND ARTI_COD = :articulo
    INTO :LISTA, :MARGEN, :UTIL, :IVAINC, :AUTOM
    DO
      if (AUTOM = 'S') then
        BEGIN
        if (UTIL IS NULL) then
            UTIL = 0;
        if (MARGEN IS NULL) then
            MARGEN = 0;
        SELECT ARTI_UNIDAD, TAIV_PORC FROM ARTICULO A, TARIFA_IVA T WHERE A.TAIV_COD = T.TAIV_COD AND ARTI_COD = :ARTICULO INTO :UNIDAD, :TARIVA;
        EXECUTE PROCEDURE lee_configuracion('FACTURACION','ARTICULOS','COSTO BASE PARA CALCULO DE PRECIOS DE VENTA AUTOMATICOS') returning_values (:BASE);
            EXECUTE PROCEDURE COSTO_PROMEDIO (:ARTICULO, :FECHA) RETURNING_VALUES(:COSTOP);
            EXECUTE PROCEDURE ULTIMO_COSTO (:ARTICULO, :FECHA, :UNIDAD) RETURNING_VALUES(:COSTOU);
        if (base = 'ULTIMO') then
            COSTO = COSTOU;
        ELSE
            BEGIN
            COSTO = COSTOP;
            if (base = 'MAYOR') then
                if (COSTOP < COSTOU) then
                    COSTO = COSTOU;
            END
        if (IVAINC = 'S') then
            COSTO = COSTO * (1 + TARIVA/100);
        EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION', 'ARTICULOS', 'SUGERIR PRECIOS CON PORCENTAJE DE MARGEN O UTILIDAD') RETURNING_VALUES (:UOR);
        EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION', 'ARTICULOS', 'REDONDEO AL MULTIPLO DE DIEZ EN PRECIOS') RETURNING_VALUES (:DIG);
        if (UOR = 'UTILIDAD') then
            BEGIN
            COSTO = COSTO * (1 + :UTIL/100);
            EXECUTE PROCEDURE REDONDEE (COSTO, DIG) returning_values (COSTO);
            UPDATE PRECIOS_ARTICULO
                SET PRAR_FIJO = :COSTO
                WHERE ARTI_COD = :ARTICULO AND LIPR_COD = :LISTA;
            END
        ELSE
            BEGIN
            COSTO = COSTO / (1 - :MARGEN/100);
            EXECUTE PROCEDURE REDONDEE (COSTO, DIG) returning_values (COSTO);
            UPDATE PRECIOS_ARTICULO
                SET PRAR_FIJO = :COSTO
                WHERE ARTI_COD = :ARTICULO AND LIPR_COD = :LISTA;
            END
        END
  END
END

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE COSTO_EN_VENTAS(
    TIPO INTEGER,
    ID INTEGER)
AS
declare variable FECHA DATE;
declare variable ARTICULO VARCHAR(20);
declare variable CANTIDAD NUMERIC(18,4);
declare variable COSTO NUMERIC(18,2);
declare variable CTACOSTO VARCHAR(20);
declare variable CTAINVEN VARCHAR(20);
BEGIN
DELETE FROM COSTO_VENTAS;
if (TIPO = 31) then
    BEGIN
    /* FACTURA DE VENTA */
    FOR SELECT D.ARTI_COD, FADE_CANT * FADE_FACTOR, COAR_CTACOS, COAR_CTAINV, FACT_FECHA
        FROM ARTICULO A, FACTURAS F, FACTURAS_DETALLE D, CONTABIL_ARTICULO C
        WHERE F.FACT_ID = D.FACT_ID AND A.ARTI_COD = D.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND F.FACT_ID = :ID AND FACT_ANULADO = 'N' and substring(a.arti_cod from 1 FOR 2) <> '.t'
        INTO :ARTICULO, :CANTIDAD, :CTACOSTO, :CTAINVEN, :FECHA
        DO
        BEGIN
        EXECUTE PROCEDURE COSTO_PROMEDIO(:ARTICULO, :FECHA) returning_values (:COSTO);
        INSERT INTO COSTO_VENTAS VALUES (:ARTICULO, :CANTIDAD, :COSTO, :CTACOSTO, :CTAINVEN);
        END
    END
if (TIPO = 32) then
    BEGIN
    /* REMISION */
    FOR SELECT D.ARTI_COD, RVDE_CANT * RVDE_FACTOR, COAR_CTACOS, COAR_CTAINV, REVT_FECHA
        FROM ARTICULO A, REMISIONES_VENTA R, REMISIONES_VENTA_DETALLE D, CONTABIL_ARTICULO C
        WHERE R.REVT_ID = D.REVT_ID AND A.ARTI_COD = D.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND R.REVT_ID = :ID AND REVT_ANULADO = 'N'
        INTO :ARTICULO, :CANTIDAD, :CTACOSTO, :CTAINVEN, :FECHA
        DO
        BEGIN
        EXECUTE PROCEDURE COSTO_PROMEDIO(:ARTICULO, :FECHA) returning_values (:COSTO);
        INSERT INTO COSTO_VENTAS VALUES (:ARTICULO, :CANTIDAD, :COSTO, :CTACOSTO, :CTAINVEN);
        END
    END
if (TIPO = 33) then
    BEGIN
    /* DEVOLUCION */
    FOR SELECT D.ARTI_COD, DVDE_CANT * DVDE_FACTOR, COAR_CTACOS, COAR_CTAINV, DEVT_FECHA
        FROM ARTICULO A, DEVOLUCIONES_VENTAS DV, DEVOLUCIONES_VENTAS_DETALLE D, CONTABIL_ARTICULO C
        WHERE DV.DEVT_ID = D.DEVT_ID AND A.ARTI_COD = D.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND DV.DEVT_ID = :ID AND DEVT_ANULADO = 'N' and substring(a.arti_cod from 1 FOR 2) <> '.t'
        INTO :ARTICULO, :CANTIDAD, :CTACOSTO, :CTAINVEN, :FECHA
        DO
        BEGIN
        EXECUTE PROCEDURE COSTO_PROMEDIO(:ARTICULO, :FECHA) returning_values (:COSTO);
        INSERT INTO COSTO_VENTAS VALUES (:ARTICULO, :CANTIDAD, :COSTO, :CTACOSTO, :CTAINVEN);
        END
    END
END

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE COSTO_EN_VENTAS_CONTADO(
    FECFAC DATE,
    PREF VARCHAR(4),
    PTVTA INTEGER)
AS
declare variable ARTICULO VARCHAR(20);
declare variable CANTIDAD NUMERIC(18,4);
declare variable COSTO NUMERIC(18,2);
declare variable CTACOSTO VARCHAR(20);
declare variable CTAINVEN VARCHAR(20);
BEGIN
    DELETE FROM COSTO_VENTAS;
    /* FACTURA DE VENTA */
    FOR SELECT MAX(D.ARTI_COD), SUM(FADE_CANT * FADE_FACTOR), MAX(COAR_CTACOS), MAX(COAR_CTAINV)
        FROM ARTICULO A, FACTURAS F, FACTURAS_DETALLE D, CONTABIL_ARTICULO C
        WHERE F.FACT_ID = D.FACT_ID AND A.ARTI_COD = D.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND FACT_ANULADO = 'N' AND FACT_FECHA = :FECFAC AND F.PREF_PRE = :PREF AND F.PTVT_ID = :PTVTA and substring(a.arti_cod from 1 FOR 2) <> '.t'
        GROUP BY D.ARTI_COD
        INTO :ARTICULO, :CANTIDAD, :CTACOSTO, :CTAINVEN
        DO
        BEGIN
        EXECUTE PROCEDURE COSTO_PROMEDIO(:ARTICULO, :FECFAC) returning_values (:COSTO);
        INSERT INTO COSTO_VENTAS VALUES (:ARTICULO, :CANTIDAD, :COSTO * :CANTIDAD, :CTACOSTO, :CTAINVEN);
        END
END

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE COSTO_PROMEDIO_UNIDAD(
    ARTICULO VARCHAR(15),
    FECHA DATE,
    UNIDAD VARCHAR(8))
RETURNS (
    COSTO NUMERIC(18,2))
AS
declare variable FACTOR NUMERIC(15,4);
BEGIN
  EXECUTE PROCEDURE COSTO_PROMEDIO(ARTICULO, FECHA) returning_values (COSTO);
  EXECUTE PROCEDURE FACTOR_UNIDAD_CANT(ARTICULO, UNIDAD) returning_values (FACTOR);
  COSTO = COSTO * FACTOR;
  SUSPEND;
END

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE IMPR_AJUSTE(
    ID INTEGER)
RETURNS (
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    CONCEPTO VARCHAR(60),
    CODBODEGA VARCHAR(2),
    NOMBODEGA VARCHAR(30),
    OBS BLOB SUB_TYPE 1 SEGMENT SIZE 80,
    AJUSTAR CHAR(2),
    ITEM INTEGER,
    ARTICULO VARCHAR(15),
    CODBAR VARCHAR(15),
    ARTIDES VARCHAR(60),
    EXANT NUMERIC(18,4),
    EXNUE NUMERIC(18,4),
    CANT NUMERIC(18,4),
    UNIDAD VARCHAR(8),
    BODITEM VARCHAR(2),
    LOTE VARCHAR(15),
    COSTO NUMERIC(18,2),
    TOTAL NUMERIC(18,2))
AS
BEGIN
  /*  */
  SELECT PREF_PRE, AJUS_NUMERO, AJUS_FECHA, AJUS_CONC, A.BODE_COD, BODE_NOM, AJUS_OBS, AJUS_NOAJUSTAR
    FROM AJUSTES A, BODEGA B WHERE A.BODE_COD = B.BODE_COD AND A.AJUS_ID = :ID into
    :PREF, :NUMERO, :FECHA, :CONCEPTO, :CODBODEGA, :NOMBODEGA, :OBS, :AJUSTAR;
  if (AJUSTAR = 'S') then
    AJUSTAR = 'NO';
  else
    AJUSTAR = 'SI';
  FOR SELECT AJUS_ITEM, A.ARTI_COD, AJUS_CODBAR, AJDE_DESC, AJUS_EXANT, AJUS_UNIDAD, BODE_COD, AJUS_EXNUE, AJUS_LOTE
    FROM AJUSTES_DETALLE D, ARTICULO A
    WHERE D.ARTI_COD = A.ARTI_COD AND D.AJUS_ID = :ID
    ORDER BY AJUS_ITEM
    INTO :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :EXANT, :UNIDAD, :BODITEM, :EXNUE, :LOTE
    DO
      BEGIN
      EXECUTE PROCEDURE COSTO_PROMEDIO(:ARTICULO, :FECHA) returning_values (:COSTO);
      CANT = EXNUE - EXANT;
      TOTAL = CANT * COSTO;
      SUSPEND;
      END
END

^

SET TERM ; ^

SET TERM ^ ;

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

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE REP_COMPROBANTES_ARTICULO(
    TIPODOC INTEGER,
    DETALLE CHAR(1),
    FECINI DATE,
    FECFIN DATE,
    ARTINI VARCHAR(20),
    ARTFIN VARCHAR(20),
    GRPINI VARCHAR(2),
    GRPFIN VARCHAR(2),
    ORDEN CHAR(1),
    SUBEMPRESA INTEGER)
RETURNS (
    CODIGO VARCHAR(15),
    NOMBRE VARCHAR(60),
    UNIDAD VARCHAR(8),
    CODGRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    CODSUBG VARCHAR(3),
    NOMSUBG VARCHAR(30),
    CODMARC VARCHAR(3),
    NOMMARC VARCHAR(30),
    CODBOD VARCHAR(2),
    NOMTIPO VARCHAR(30),
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    CONCEPTO VARCHAR(60),
    NIT VARCHAR(20),
    NOMTERC VARCHAR(60),
    CONS INTEGER,
    CANT NUMERIC(18,4),
    COSTO NUMERIC(18,2),
    COSTOTOT NUMERIC(18,2))
AS
declare variable ENT CHAR(1);
declare variable ENTRADAS NUMERIC(18,4);
declare variable COSTOENT NUMERIC(18,2);
declare variable SALIDAS NUMERIC(18,4);
declare variable COSTOSAL NUMERIC(18,2);
declare variable CODINI VARCHAR(20);
declare variable CODFIN VARCHAR(20);
declare variable DESINI VARCHAR(20);
declare variable DESFIN VARCHAR(20);
BEGIN
  SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = :TIPODOC INTO :NOMTIPO;
  if (ORDEN = 'C') then
    BEGIN
    CODINI = ARTINI;
    CODFIN = ARTFIN;
    DESINI = '';
    DESFIN = 'zz';
    END
  ELSE
    BEGIN
    DESINI = ARTINI;
    DESFIN = ARTFIN;
    CODINI = '';
    CODFIN = 'zz';
    END
  FOR
    SELECT ARTI_COD, ARTI_DES, ARTI_UNIDAD, A.GRUP_COD, A.SUBG_COD, A.MARC_COD
      FROM ARTICULO A
      WHERE ARTI_COD >= :CODINI AND ARTI_COD <= :CODFIN AND A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :GRPFIN AND ARTI_DES >= :DESINI AND ARTI_DES <= :DESFIN
      INTO :CODIGO, :NOMBRE, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
      DO
        BEGIN
        NOMMARC = '';
        NOMSUBG = '';
        SELECT GRUP_NOM FROM GRUPO WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
        SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
        SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
        if (DETALLE = 'N') then
            BEGIN
            CANT = 0;
            COSTOTOT = 0;
            /* SUME LAS ENTRADAS */
            SELECT SUM(MVAR_CANT), SUM(MVAR_CANT * MVAR_COSTO) FROM MOVIMIENTO_ARTICULO M, PREFIJOS P
              WHERE P.PREF_PRE = M.MVAR_PREF AND P.TIDO_COD = M.mvar_tipodoc AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA)) AND
              (MVAR_FECHA >= :FECINI) AND (MVAR_FECHA < :FECFIN) AND
              (ARTI_COD = :CODIGO) AND (MVAR_ENTRADA = 'S') AND (MVAR_TIPODOC = :TIPODOC)
              INTO :ENTRADAS, :COSTOENT;
            if (ENTRADAS IS NULL) then
              ENTRADAS = 0;
            if (COSTOENT IS NULL) then
              COSTOENT = 0;
            /* CALCULE LAS SALIDAS A COSTO PROMEDIO */
            SALIDAS = 0;
            COSTOSAL = 0;
            FOR SELECT MVAR_CANT, MVAR_FECHA
                FROM MOVIMIENTO_ARTICULO M, PREFIJOS P
                WHERE P.PREF_PRE = M.MVAR_PREF AND P.TIDO_COD = M.mvar_tipodoc AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA)) AND
                (MVAR_FECHA >= :FECINI) AND (MVAR_FECHA <= :FECFIN) AND
                (ARTI_COD = :CODIGO) AND (MVAR_ENTRADA = 'N') AND (MVAR_TIPODOC = :TIPODOC)
                INTO :CANT, :FECHA
                DO
                    BEGIN
                    EXECUTE PROCEDURE COSTO_PROMEDIO(:CODIGO, :FECHA) returning_values (:COSTO);
                    SALIDAS = SALIDAS + CANT;
                    COSTOSAL = COSTOSAL + (COSTO * CANT);
                    END
            if (SALIDAS IS NULL) then
              SALIDAS = 0;
            if (COSTOSAL IS NULL) then
              COSTOSAL = 0;
            if (ENTRADAS > 0) then
                CANT = ENTRADAS;
            if (SALIDAS > 0) then
                CANT = SALIDAS;
            if (COSTOENT > 0) then
                COSTOTOT = COSTOENT;
            if (COSTOSAL > 0) then
                COSTOTOT = COSTOSAL;
            if (CANT > 0) then
                COSTO = COSTOTOT / CANT;
            ELSE
                COSTO = 0;
            if (CANT <> 0) then
                SUSPEND;
            END
        ELSE
            BEGIN
            FOR SELECT MVAR_ENTRADA, MVAR_PREF, MVAR_NUMERO, MVAR_CANT, MVAR_COSTO, MVAR_CONC, MVAR_FECHA, M.TERC_NIT, TERC_NOM, MVAR_CONS, BODE_COD
                FROM MOVIMIENTO_ARTICULO M, TIPO_DOCUMENTO TD, PREFIJOS P
                LEFT OUTER JOIN TERCEROS T ON (M.TERC_NIT = T.TERC_NIT)
                WHERE TD.TIDO_COD = MVAR_TIPODOC AND P.PREF_PRE = M.MVAR_PREF AND P.TIDO_COD = M.mvar_tipodoc AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA)) AND
                (MVAR_FECHA >= :FECINI) AND (MVAR_FECHA < :FECFIN) AND (ARTI_COD = :CODIGO) AND (MVAR_TIPODOC = :TIPODOC)
                ORDER BY MVAR_FECHA, MVAR_CONS
                INTO :ENT, :PREFIJO, :NUMERO, :CANT, :COSTO, :CONCEPTO, :FECHA, :NIT, :NOMTERC, :CONS, :CODBOD
                DO
                    BEGIN
                    if (ENT = 'S') then
                        BEGIN
                        COSTOTOT = (CANT * COSTO);
                        end
                    ELSE
                        BEGIN
                        EXECUTE PROCEDURE COSTO_PROMEDIO(:CODIGO, :FECHA) returning_values (:COSTO);
                        COSTOTOT = (CANT * COSTO);
                        END
                    SUSPEND;
                    END
            END
        END
END

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE REP_COMPROBANTES_INV(
    TIPO INTEGER,
    DETALLE CHAR(1),
    FECINI DATE,
    FECFIN DATE,
    PREFIJO VARCHAR(4),
    ANULADOS CHAR(1),
    SUBEMPRESA INTEGER)
RETURNS (
    NOMTIPO VARCHAR(30),
    ID INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    VENCE DATE,
    CONCEPTO VARCHAR(60),
    REFER VARCHAR(60),
    CODBODORI VARCHAR(2),
    NOMBODORI VARCHAR(30),
    CODBODDES VARCHAR(2),
    NOMBODDES VARCHAR(30),
    NOMTERCERO VARCHAR(60),
    PRODCODBAR VARCHAR(15),
    PRODDES VARCHAR(60),
    PRODCANT NUMERIC(18,4),
    PRODUNIDAD VARCHAR(8),
    PRODLOTE VARCHAR(15),
    OBS BLOB SUB_TYPE 0 SEGMENT SIZE 80,
    ITEM INTEGER,
    ARTICULO VARCHAR(15),
    CODBAR VARCHAR(15),
    ARTIDES VARCHAR(60),
    CANT NUMERIC(18,4),
    EXANT NUMERIC(18,4),
    UNIDAD VARCHAR(8),
    BODITEM VARCHAR(2),
    COSTO NUMERIC(18,2),
    DTOPORC NUMERIC(9,2),
    DTOMONTO NUMERIC(18,2),
    IVAPORC NUMERIC(9,2),
    IVAMONTO NUMERIC(18,2),
    CONSUMO NUMERIC(18,2),
    SUBTOTAL NUMERIC(18,2),
    TOTAL NUMERIC(18,2),
    LOTE VARCHAR(15),
    ANULADO CHAR(1),
    OBSITEM BLOB SUB_TYPE 0 SEGMENT SIZE 80)
AS
BEGIN
  /* DETERMINE LA TABLA A EXAMINAR */
  if (BIN_AND(TIPO, 1) <> 0) then
    BEGIN
    SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 11 INTO :NOMTIPO;
    FOR SELECT ENTR_ID, E.PREF_PRE, ENTR_NUMERO, ENTR_FECHA, ENTR_CONC, ENTR_REFER, E.BODE_COD, BODE_NOM, ENTR_NOMTERC, ENTR_OBS, ENTR_ANULADO
    FROM ENTRADAS E, BODEGA B, PREFIJOS P
    WHERE E.BODE_COD = B.BODE_COD AND ENTR_FECHA >= :FECINI AND ENTR_FECHA <= :FECFIN
     AND P.PREF_PRE = E.PREF_PRE AND P.TIDO_COD = 11 AND ((P.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
    ORDER BY ENTR_FECHA, ENTR_ID
    INTO :ID, :PREF, :NUMERO, :FECHA, :CONCEPTO, :REFER, :CODBODORI, :NOMBODORI, :NOMTERCERO, :OBS, :ANULADO
    DO
        BEGIN
        if (((:PREFIJO = '') or (:PREF = :PREFIJO)) AND ((:ANULADOS = 'S') or (:ANULADO = 'N'))) then
            BEGIN
            if (anulado = 'S') then
             BEGIN
              ITEM = 0;
              ARTICULO = '';
              CODBAR = '';
              ARTIDES = '';
              CANT = 0;
              UNIDAD = '';
              BODITEM = '';
              lote = '';
              costo = 0;
              DTOPORC = 0;
              DTOMONTO = 0;
              IVAPORC = 0;
              IVAMONTO = 0;
              CONSUMO = 0;
              TOTAL = 0;
              OBSITEM = null;
              SUBTOTAL = 0;
              SUSPEND;
             END
            ELSE
             BEGIN
              if (DETALLE = 'S') then
                FOR SELECT ENDE_ITEM, A.ARTI_COD, ENDE_CODBAR, ENDE_DESC, ENDE_CANT, ENDE_UNIDAD, BODE_COD, ENDE_COSTO, ENDE_DTOPORC, ENDE_DTOMONTO, ENDE_IVAPORC, ENDE_IVAMONTO, ENDE_CONSUMO, ENDE_TOTAL, ENDE_LOTE, ENDE_OBS
                    FROM ENTRADAS_DETALLE D, ARTICULO A WHERE D.ARTI_COD = A.ARTI_COD AND D.ENTR_ID = :ID INTO
                    :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :BODITEM, :COSTO, :DTOPORC, :DTOMONTO, :IVAPORC, :IVAMONTO, :CONSUMO, :TOTAL, :LOTE, :OBSITEM
                    DO
                    BEGIN
                    SUBTOTAL = TOTAL - IVAMONTO - CONSUMO;
                    SUSPEND;
                    END
              ELSE
                BEGIN
                SELECT SUM(ENDE_IVAMONTO), SUM(ENDE_CONSUMO), SUM(ENDE_TOTAL)
                    FROM ENTRADAS_DETALLE D WHERE D.ENTR_ID = :ID INTO
                    :IVAMONTO, :CONSUMO, :TOTAL;
                SUBTOTAL = TOTAL - IVAMONTO - CONSUMO;
                SUSPEND;
                END
             END
            END
        END
    END
  if (BIN_AND(TIPO, 2) <> 0) then
    BEGIN
    SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 12 INTO :NOMTIPO;
    FOR SELECT SALI_ID, S.PREF_PRE, SALI_NUMERO, SALI_FECHA, SALI_CONC, SALI_REFER, S.BODE_COD, BODE_NOM, SALI_NOMTERC, SALI_OBS, SALI_ANULADO
    FROM SALIDAS S, BODEGA B, PREFIJOS P
    WHERE S.BODE_COD = B.BODE_COD AND SALI_FECHA >= :FECINI AND SALI_FECHA <= :FECFIN 
     AND P.PREF_PRE = S.PREF_PRE AND P.TIDO_COD = 12 AND ((P.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
    ORDER BY SALI_FECHA, SALI_ID
    into :ID, :PREF, :NUMERO, :FECHA, :CONCEPTO, :REFER, :CODBODORI, :NOMBODORI, :NOMTERCERO, :OBS, :ANULADO
    DO
        BEGIN
        if (((:PREFIJO = '') or (:PREF = :PREFIJO)) AND ((:ANULADOS = 'S') or (:ANULADO = 'N'))) then
            BEGIN
            if (anulado = 'S') then
             BEGIN
              ITEM = 0;
              ARTICULO = '';
              CODBAR = '';
              ARTIDES = '';
              CANT = 0;
              UNIDAD = '';
              BODITEM = '';
              lote = '';
              costo = 0;
              DTOPORC = 0;
              DTOMONTO = 0;
              IVAPORC = 0;
              IVAMONTO = 0;
              CONSUMO = 0;
              EXANT = 0;
              TOTAL = 0;
              OBSITEM = null;
              SUBTOTAL = 0;
              SUSPEND;
             END
            ELSE
             BEGIN
              if (DETALLE = 'S') then
                FOR SELECT SADE_ITEM, A.ARTI_COD, SADE_CODBAR, SADE_DESC, SADE_CANT, SADE_UNIDAD, BODE_COD, SADE_COSTO, SADE_IVAPORC, SADE_IVAMONTO, SADE_CONSUMO, SADE_TOTAL, SADE_LOTE, SADE_OBS
                    FROM SALIDAS_DETALLE D, ARTICULO A WHERE D.ARTI_COD = A.ARTI_COD AND D.SALI_ID = :ID INTO
                    :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :BODITEM, :COSTO, :IVAPORC, :IVAMONTO, :CONSUMO, :TOTAL, :LOTE, :OBSITEM
                    DO
                BEGIN
                SUBTOTAL = TOTAL - IVAMONTO - CONSUMO;
                SUSPEND;
                END
              ELSE
                BEGIN
                SELECT SUM(SADE_IVAMONTO), SUM(SADE_CONSUMO), SUM(SADE_TOTAL)
                    FROM SALIDAS_DETALLE D WHERE D.SALI_ID = :ID INTO
                    :IVAMONTO, :CONSUMO, :TOTAL;
                SUBTOTAL = TOTAL - IVAMONTO - CONSUMO;
                SUSPEND;
                END
             END
            END
        END
    END
  if (BIN_AND(TIPO, 4) <> 0) then
    BEGIN
    SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 13 INTO :NOMTIPO;
    FOR SELECT TRAN_ID, T.PREF_PRE, TRAN_NUMERO, TRAN_FECHA, TRAN_CONC, TRAN_REFER, T.BODE_COD, BO.BODE_NOM, TRAN_BODDES, BD.BODE_NOM, TRAN_OBS, TRAN_ANULADO
    FROM TRASFERENCIAS T, BODEGA BO, BODEGA BD, PREFIJOS P
    WHERE T.BODE_COD = BO.BODE_COD AND T.TRAN_BODDES = BD.BODE_COD AND TRAN_FECHA >= :FECINI AND TRAN_FECHA <= :FECFIN 
     AND P.PREF_PRE = T.PREF_PRE AND P.TIDO_COD = 13 AND ((P.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
    ORDER BY TRAN_FECHA, TRAN_ID
    into :ID, :PREF, :NUMERO, :FECHA, :CONCEPTO, :REFER, :CODBODORI, :NOMBODORI, :CODBODDES, :NOMBODDES, :OBS, :ANULADO
    DO
        BEGIN
        if (((:PREFIJO = '') or (:PREF = :PREFIJO)) AND ((:ANULADOS = 'S') or (:ANULADO = 'N'))) then
            BEGIN
            if (anulado = 'S') then
             BEGIN
              ITEM = 0;
              ARTICULO = '';
              CODBAR = '';
              ARTIDES = '';
              CANT = 0;
              UNIDAD = '';
              BODITEM = '';
              lote = '';
              costo = 0;
              DTOPORC = 0;
              DTOMONTO = 0;
              IVAPORC = 0;
              IVAMONTO = 0;
              CONSUMO = 0;
              EXANT = 0;
              TOTAL = 0;
              OBSITEM = null;
              SUBTOTAL = 0;
              SUSPEND;
             END
            ELSE
             BEGIN
              if (DETALLE = 'S') then
                FOR SELECT TRAS_ITEM, A.ARTI_COD, TRAS_CODBAR, TRAS_DESC, TRAS_CANT, TRAS_UNIDAD, TRAS_COSTO, TRAS_IVAPORC, TRAS_IVAMONTO, TRAS_CONSUMO, TRAS_TOTAL, TRAS_LOTE, TRAS_OBS
                    FROM TRASFERENCIAS_DETALLE D, ARTICULO A WHERE D.ARTI_COD = A.ARTI_COD AND D.TRAN_ID = :ID INTO
                    :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :COSTO, :IVAPORC, :IVAMONTO, :CONSUMO, :TOTAL, :LOTE, :OBSITEM
                    DO
                    BEGIN
                    SUBTOTAL = TOTAL - IVAMONTO - CONSUMO;
                    SUSPEND;
                    END
              ELSE
                BEGIN
                SELECT SUM(TRAS_IVAMONTO), SUM(TRAS_CONSUMO), SUM(TRAS_TOTAL) FROM trasferencias_detalle D
                    WHERE D.TRAN_ID = :ID INTO :IVAMONTO, :CONSUMO, :TOTAL;
                SUBTOTAL = TOTAL - IVAMONTO - CONSUMO;
                SUSPEND;
                END
             END
            END
        END
    END
  if (BIN_AND(TIPO, 8) <> 0) then
    BEGIN
    SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 14 INTO :NOMTIPO;
    FOR SELECT AJUS_ID, A.PREF_PRE, AJUS_NUMERO, AJUS_FECHA, AJUS_CONC, A.BODE_COD, BODE_NOM, AJUS_OBS, AJUS_ANULADO
    FROM AJUSTES A, BODEGA B, PREFIJOS P
    WHERE A.BODE_COD = B.BODE_COD AND AJUS_FECHA >= :FECINI AND AJUS_FECHA <= :FECFIN 
     AND P.PREF_PRE = A.PREF_PRE AND P.TIDO_COD = 14 AND ((P.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
    ORDER BY AJUS_FECHA, AJUS_ID
    into :ID, :PREF, :NUMERO, :FECHA, :CONCEPTO, :CODBODORI, :NOMBODORI, :OBS, :ANULADO
    DO
        BEGIN
        if (((:PREFIJO = '') or (:PREF = :PREFIJO)) AND ((:ANULADOS = 'S') or (:ANULADO = 'N'))) then
            BEGIN
            if (anulado = 'S') then
             BEGIN
              ITEM = 0;
              ARTICULO = '';
              CODBAR = '';
              ARTIDES = '';
              CANT = 0;
              UNIDAD = '';
              BODITEM = '';
              lote = '';
              costo = 0;
              DTOPORC = 0;
              DTOMONTO = 0;
              IVAPORC = 0;
              IVAMONTO = 0;
              CONSUMO = 0;
              EXANT = 0;
              TOTAL = 0;
              OBSITEM = null;
              SUBTOTAL = 0;
              SUSPEND;
             END
            ELSE
             BEGIN
              if (DETALLE = 'S') then
                FOR SELECT AJUS_ITEM, A.ARTI_COD, AJUS_CODBAR, AJDE_DESC, AJUS_EXANT, AJUS_UNIDAD, BODE_COD, AJUS_EXNUE, AJUS_LOTE, AJDE_OBS
                    FROM AJUSTES_DETALLE D, ARTICULO A WHERE D.ARTI_COD = A.ARTI_COD AND D.AJUS_ID = :ID INTO
                    :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :EXANT, :UNIDAD, :BODITEM, :CANT, :LOTE, :OBSITEM
                    DO
                      BEGIN
                      EXECUTE PROCEDURE COSTO_PROMEDIO(:ARTICULO, :FECHA) returning_values (:COSTO);
                      TOTAL = (CANT - EXANT) * COSTO;
                      SUBTOTAL = TOTAL;
                      SUSPEND;
                      END
              ELSE
                BEGIN
                TOTAL = 0;
                FOR SELECT ARTI_COD, AJUS_EXNUE, AJUS_EXANT FROM AJUSTES_DETALLE D WHERE D.AJUS_ID = :ID INTO
                    :ARTICULO, :CANT, :EXANT
                    DO
                      BEGIN
                      EXECUTE PROCEDURE COSTO_PROMEDIO(:ARTICULO, :FECHA) returning_values (:COSTO);
                      TOTAL = TOTAL + ((CANT - EXANT) * COSTO);
                      SUBTOTAL = TOTAL;
                      END
                SUSPEND;
                END
             END
            END
        END
    END
  if (BIN_AND(TIPO, 16) <> 0) then
    BEGIN
    SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 15 INTO :NOMTIPO;
    FOR SELECT ENSA_ID, E.PREF_PRE, ENSA_NUMERO, ENSA_FECHA, ENSA_CONC, ENSA_REFER, E.BODE_COD, BODE_NOM, ENSA_CODBAR, ENSA_DESC, ENSA_CANT, ENSA_UNIDAD, ENSA_LOTE, ENSA_OBS, ENSA_ANULADO
    FROM ENSAMBLES E, BODEGA B, PREFIJOS P
    WHERE E.BODE_COD = B.BODE_COD AND E.ENSA_FECHA >= :FECINI AND E.ENSA_FECHA <= :FECFIN
     AND P.PREF_PRE = E.PREF_PRE AND P.TIDO_COD = 15 AND ((P.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
    ORDER BY ENSA_FECHA, ENSA_ID
    into :ID, :PREF, :NUMERO, :FECHA, :CONCEPTO, :REFER, :CODBODORI, :NOMBODORI, :PRODCODBAR, :PRODDES, :PRODCANT, :PRODUNIDAD, :PRODLOTE, :OBS, :ANULADO
    DO
        BEGIN
        if (((:PREFIJO = '') or (:PREF = :PREFIJO)) AND ((:ANULADOS = 'S') or (:ANULADO = 'N'))) then
            BEGIN
            if (anulado = 'S') then
             BEGIN
              ITEM = 0;
              ARTICULO = '';
              CODBAR = '';
              ARTIDES = '';
              CANT = 0;
              UNIDAD = '';
              BODITEM = '';
              lote = '';
              costo = 0;
              DTOPORC = 0;
              DTOMONTO = 0;
              IVAPORC = 0;
              IVAMONTO = 0;
              CONSUMO = 0;
              EXANT = 0;
              TOTAL = 0;
              OBSITEM = null;
              SUBTOTAL = 0;
              SUSPEND;
             END
            ELSE
             BEGIN
              if (DETALLE = 'S') then
                FOR SELECT ESDE_ITEM, A.ARTI_COD, ESDE_CODBAR, ESDE_DESC, ESDE_CANT, ESDE_UNIDAD, BODE_COD, ESDE_COSTO, ESDE_IVAPORC, ESDE_IVAMONTO, ESDE_CONSUMO, ESDE_TOTAL, ESDE_LOTE, ESDE_OBS
                    FROM ensambles_detalle D, ARTICULO A WHERE D.ARTI_COD = A.ARTI_COD AND D.ENSA_ID = :ID INTO
                    :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :BODITEM, :COSTO, :IVAPORC, :IVAMONTO, :CONSUMO, :TOTAL, :LOTE, :OBSITEM
                    DO
                    BEGIN
                    SUBTOTAL = TOTAL - IVAMONTO - CONSUMO;
                    SUSPEND;
                    END
              ELSE
                BEGIN
                SELECT SUM(ESDE_IVAMONTO), SUM(ESDE_CONSUMO), SUM(ESDE_TOTAL) FROM ENSAMBLES_detalle D WHERE D.ENSA_ID = :ID INTO
                    :IVAMONTO, :CONSUMO, :TOTAL;
                SUBTOTAL = TOTAL - IVAMONTO - CONSUMO;
                SUSPEND;
                END
             END
            END
        END
    END
  if (BIN_AND(TIPO, 32) <> 0) then
    BEGIN
    SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 16 INTO :NOMTIPO;
    FOR SELECT DESE_ID, E.PREF_PRE, DESE_NUMERO, DESE_FECHA, DESE_CONC, DESE_REFER, E.BODE_COD, BODE_NOM, DESE_CODBAR, DESE_DESC, DESE_CANT, DESE_UNIDAD, DESE_LOTE, DESE_OBS, DESE_ANULADO
    FROM DESENSAMBLES E, BODEGA B, PREFIJOS P
    WHERE E.BODE_COD = B.BODE_COD AND DESE_FECHA >= :FECINI AND DESE_FECHA <= :FECFIN 
     AND P.PREF_PRE = E.PREF_PRE AND P.TIDO_COD = 16 AND ((P.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
    ORDER BY DESE_FECHA, DESE_ID
    into :ID, PREF, :NUMERO, :FECHA, :CONCEPTO, :REFER, :CODBODORI, :NOMBODORI, :PRODCODBAR, :PRODDES, :PRODCANT, :PRODUNIDAD, :PRODLOTE, :OBS, :ANULADO
    DO
        BEGIN
        if (((:PREFIJO = '') or (:PREF = :PREFIJO)) AND ((:ANULADOS = 'S') or (:ANULADO = 'N'))) then
            BEGIN
            if (anulado = 'S') then
             BEGIN
              ITEM = 0;
              ARTICULO = '';
              CODBAR = '';
              ARTIDES = '';
              CANT = 0;
              UNIDAD = '';
              BODITEM = '';
              lote = '';
              costo = 0;
              DTOPORC = 0;
              DTOMONTO = 0;
              IVAPORC = 0;
              IVAMONTO = 0;
              CONSUMO = 0;
              EXANT = 0;
              TOTAL = 0;
              OBSITEM = null;
              SUBTOTAL = 0;
              SUSPEND;
             END
            ELSE
             BEGIN
              if (DETALLE = 'S') then
                FOR SELECT DESE_ITEM, A.ARTI_COD, DEDE_CODBAR, DEDE_DESC, DEDE_CANT, DEDE_UNIDAD, BODE_COD, DEDE_COSTO, DEDE_IVAPORC, DEDE_IVAMONTO, DEDE_CONSUMO, DEDE_TOTAL, DEDE_LOTE, DEDE_OBS
                    FROM desensambles_detalle D, ARTICULO A WHERE D.ARTI_COD = A.ARTI_COD AND D.DESE_ID = :ID INTO
                    :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :BODITEM, :COSTO, :IVAPORC, :IVAMONTO, :CONSUMO, :TOTAL, :LOTE, :OBSITEM
                    DO
                    BEGIN
                    SUBTOTAL = TOTAL - IVAMONTO - CONSUMO;
                    SUSPEND;
                    END
              ELSE
                BEGIN
                SELECT SUM(DEDE_IVAMONTO), SUM(DEDE_CONSUMO), SUM(DEDE_TOTAL) FROM DESENSAMBLES_detalle D WHERE D.DESE_ID = :ID INTO
                    :IVAMONTO, :CONSUMO, :TOTAL;
                SUBTOTAL = TOTAL - IVAMONTO - CONSUMO;
                SUSPEND;
                END
             END
            END
        END
    END
  if (BIN_AND(TIPO, 64) <> 0) then
    BEGIN
    SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 17 INTO :NOMTIPO;
    FOR SELECT RESE_ID, R.PREF_PRE, RESE_NUMERO, RESE_FECHA, RESE_CONC, RESE_REFER, R.BODE_COD, BODE_NOM, RESE_NOMTERC, RESE_OBS, RESE_ANULADO
    FROM RESERVAS R, BODEGA B, PREFIJOS P
    WHERE R.BODE_COD = B.BODE_COD AND R.RESE_FECHA >= :FECINI AND R.RESE_FECHA <= :FECFIN 
     AND P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = 17 AND ((P.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
    ORDER BY RESE_FECHA, RESE_ID
    into :ID, :PREF, :NUMERO, :FECHA, :CONCEPTO, :REFER, :CODBODORI, :NOMBODORI, :NOMTERCERO, :OBS, :ANULADO
    DO
        BEGIN
        if (((:PREFIJO = '') or (:PREF = :PREFIJO)) AND ((:ANULADOS = 'S') or (:ANULADO = 'N'))) then
            BEGIN
            if (anulado = 'S') then
             BEGIN
              ITEM = 0;
              ARTICULO = '';
              CODBAR = '';
              ARTIDES = '';
              CANT = 0;
              UNIDAD = '';
              BODITEM = '';
              lote = '';
              costo = 0;
              DTOPORC = 0;
              DTOMONTO = 0;
              IVAPORC = 0;
              IVAMONTO = 0;
              CONSUMO = 0;
              EXANT = 0;
              TOTAL = 0;
              OBSITEM = null;
              SUBTOTAL = 0;
              SUSPEND;
             END
            ELSE
             BEGIN
              if (DETALLE = 'S') then
                FOR SELECT RSDE_ITEM, A.ARTI_COD, RSDE_CODBAR, RSDE_DESC, RDSE_CANT, RSDE_UNIDAD, BODE_COD, RSDE_OBS
                    FROM RESERVAS_DETALLE D, ARTICULO A WHERE D.ARTI_COD = A.ARTI_COD AND D.RESE_ID = :ID INTO
                    :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :BODITEM, :OBSITEM
                    DO
                    SUSPEND;
              ELSE
                BEGIN
                SELECT SUM(RDSE_CANT) FROM RESERVAS_detalle D WHERE D.RESE_ID = :ID INTO
                    :CANT;
                SUSPEND;
                END
             END
            END
        END
    END
  if (BIN_AND(TIPO, 128) <> 0) then
    BEGIN
    SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 18 INTO :NOMTIPO;
    FOR SELECT ORIN_ID, O.PREF_PRE, ORIN_NUMERO, ORIN_FECHA, ORIN_FECLLEGA, ORIN_CONC, ORIN_REFER, ORIN_NOMTERC, ORIN_OBS, ORIN_ANULADO
        FROM ORDENES_INVENTARIO O, PREFIJOS P
        WHERE ORIN_FECHA >= :FECINI AND ORIN_FECHA <= :FECFIN 
        AND P.PREF_PRE = O.PREF_PRE AND P.TIDO_COD = 18 AND ((P.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
        ORDER BY ORIN_FECHA, ORIN_ID
        into :ID, PREF, :NUMERO, :FECHA, :VENCE, :CONCEPTO, :REFER, :NOMTERCERO, :OBS, :ANULADO
        DO
        BEGIN
        if (((:PREFIJO = '') or (:PREF = :PREFIJO)) AND ((:ANULADOS = 'S') or (:ANULADO = 'N'))) then
            BEGIN
            if (anulado = 'S') then
             BEGIN
              ITEM = 0;
              ARTICULO = '';
              CODBAR = '';
              ARTIDES = '';
              CANT = 0;
              UNIDAD = '';
              BODITEM = '';
              lote = '';
              costo = 0;
              DTOPORC = 0;
              DTOMONTO = 0;
              IVAPORC = 0;
              IVAMONTO = 0;
              CONSUMO = 0;
              EXANT = 0;
              TOTAL = 0;
              OBSITEM = null;
              SUBTOTAL = 0;
              SUSPEND;
             END
            ELSE
             BEGIN
              if (DETALLE = 'S') then
                FOR SELECT ORID_ITEM, A.ARTI_COD, ORID_CODBAR, ORID_DESC, ORID_CANT, ORID_UNIDAD, ORIN_COSTO, ORID_DTOPORC, ORID_DTOMONTO, ORID_IVAPORC, ORID_IVAMONTO, ORID_CONSUMO, ORID_TOTAL, ORID_OBS, ORID_LOTE
                    FROM ORDENINVENTARIO_DETALLE D, ARTICULO A WHERE D.ARTI_COD = A.ARTI_COD AND D.ORIN_ID = :ID INTO
                    :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :COSTO, :DTOPORC, :DTOMONTO, :IVAPORC, :IVAMONTO, :CONSUMO, :TOTAL, :OBSITEM, :LOTE
                    DO
                    BEGIN
                    SUBTOTAL = TOTAL - IVAMONTO - CONSUMO;
                    SUSPEND;
                    END
              ELSE
                BEGIN
                SELECT SUM(ORID_IVAMONTO), SUM(ORID_CONSUMO), SUM(ORID_TOTAL) FROM ordeninventario_detalle D WHERE D.ORIN_ID = :ID INTO
                    :IVAMONTO, :CONSUMO, :TOTAL;
                SUBTOTAL = TOTAL - IVAMONTO - CONSUMO;
                SUSPEND;
                END
             END
            END
        END
    END
END

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE REP_CONSECUTIVOS_INV(
    TIPO INTEGER,
    DETALLE CHAR(1),
    PREINI VARCHAR(4),
    PREFIN VARCHAR(4),
    NUMINI VARCHAR(6),
    NUMFIN VARCHAR(6),
    ANULADOS CHAR(1),
    SUBEMPRESA INTEGER)
RETURNS (
    NOMTIPO VARCHAR(30),
    ID INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    VENCE DATE,
    CONCEPTO VARCHAR(60),
    REFER VARCHAR(60),
    CODBODORI VARCHAR(2),
    NOMBODORI VARCHAR(30),
    CODBODDES VARCHAR(2),
    NOMBODDES VARCHAR(30),
    NOMTERCERO VARCHAR(60),
    PRODCODBAR VARCHAR(15),
    PRODDES VARCHAR(60),
    PRODCANT NUMERIC(18,4),
    PRODUNIDAD VARCHAR(8),
    PRODLOTE VARCHAR(15),
    OBS BLOB SUB_TYPE 0 SEGMENT SIZE 80,
    ITEM INTEGER,
    ARTICULO VARCHAR(15),
    CODBAR VARCHAR(15),
    ARTIDES VARCHAR(60),
    CANT NUMERIC(18,4),
    EXANT NUMERIC(18,4),
    UNIDAD VARCHAR(8),
    BODITEM VARCHAR(2),
    COSTO NUMERIC(18,2),
    DTOPORC NUMERIC(9,2),
    DTOMONTO NUMERIC(18,2),
    IVAPORC NUMERIC(9,2),
    IVAMONTO NUMERIC(18,2),
    CONSUMO NUMERIC(18,2),
    SUBTOTAL NUMERIC(18,2),
    TOTAL NUMERIC(18,2),
    LOTE VARCHAR(15),
    ANULADO CHAR(1),
    OBSITEM BLOB SUB_TYPE 0 SEGMENT SIZE 80)
AS
BEGIN
  /* DETERMINE LA TABLA A EXAMINAR */
  if (BIN_AND(TIPO, 1) <> 0) then
    BEGIN
    SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 11 INTO :NOMTIPO;
    FOR SELECT ENTR_ID, E.PREF_PRE, ENTR_NUMERO, ENTR_FECHA, ENTR_CONC, ENTR_REFER, E.BODE_COD, BODE_NOM, ENTR_NOMTERC, ENTR_OBS, ENTR_ANULADO
    FROM ENTRADAS E, BODEGA B, PREFIJOS PR
    WHERE E.BODE_COD = B.BODE_COD AND E.PREF_PRE >= :PREINI AND E.PREF_PRE <= :PREFIN AND ENTR_NUMERO >= :NUMINI AND ENTR_NUMERO <= :NUMFIN
     AND PR.PREF_PRE = E.PREF_PRE AND PR.TIDO_COD = 11 AND ((PR.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
    ORDER BY E.PREF_PRE, ENTR_NUMERO
    INTO :ID, :PREF, :NUMERO, :FECHA, :CONCEPTO, :REFER, :CODBODORI, :NOMBODORI, :NOMTERCERO, :OBS, :ANULADO
    DO
        BEGIN
        if ((:ANULADOS = 'S') or (:ANULADO = 'N')) then
            BEGIN
            if (anulado = 'S') then
             BEGIN
              ITEM = 0;
              ARTICULO = '';
              CODBAR = '';
              ARTIDES = '';
              CANT = 0;
              UNIDAD = '';
              BODITEM = '';
              lote = '';
              costo = 0;
              DTOPORC = 0;
              DTOMONTO = 0;
              IVAPORC = 0;
              IVAMONTO = 0;
              CONSUMO = 0;
              TOTAL = 0;
              OBSITEM = null;
              SUBTOTAL = 0;
              SUSPEND;
             END
            ELSE
             BEGIN
              if (DETALLE = 'S') then
                FOR SELECT ENDE_ITEM, A.ARTI_COD, ENDE_CODBAR, ENDE_DESC, ENDE_CANT, ENDE_UNIDAD, BODE_COD, ENDE_COSTO, ENDE_DTOPORC, ENDE_DTOMONTO, ENDE_IVAPORC, ENDE_IVAMONTO, ENDE_CONSUMO, ENDE_TOTAL, ENDE_LOTE, ENDE_OBS
                    FROM ENTRADAS_DETALLE D, ARTICULO A
                    WHERE D.ARTI_COD = A.ARTI_COD AND D.ENTR_ID = :ID
                    ORDER BY ENDE_ITEM
                    INTO :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :BODITEM, :COSTO, :DTOPORC, :DTOMONTO, :IVAPORC, :IVAMONTO, :CONSUMO, :TOTAL, :LOTE, :OBSITEM
                    DO
                    BEGIN
                    SUBTOTAL = TOTAL - IVAMONTO - CONSUMO;
                    SUSPEND;
                    END
              ELSE
                BEGIN
                SELECT SUM(ENDE_IVAMONTO), SUM(ENDE_CONSUMO), SUM(ENDE_TOTAL) FROM ENTRADAS_DETALLE D WHERE D.ENTR_ID = :ID INTO
                    :IVAMONTO, :CONSUMO, :TOTAL;
                SUBTOTAL = TOTAL - IVAMONTO - CONSUMO;
                SUSPEND;
                END
             END
            END
        END
    END
  if (BIN_AND(TIPO, 2) <> 0) then
    BEGIN
    SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 12 INTO :NOMTIPO;
    FOR SELECT SALI_ID, S.PREF_PRE, SALI_NUMERO, SALI_FECHA, SALI_CONC, SALI_REFER, S.BODE_COD, BODE_NOM, SALI_NOMTERC, SALI_OBS, SALI_ANULADO
    FROM SALIDAS S, BODEGA B, PREFIJOS PR
    WHERE S.BODE_COD = B.BODE_COD AND S.PREF_PRE >= :PREINI AND S.PREF_PRE <= :PREFIN AND SALI_NUMERO >= :NUMINI AND SALI_NUMERO <= :NUMFIN
     AND PR.PREF_PRE = S.PREF_PRE AND PR.TIDO_COD = 12 AND ((PR.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
    ORDER BY S.PREF_PRE, SALI_NUMERO
    into :ID, :PREF, :NUMERO, :FECHA, :CONCEPTO, :REFER, :CODBODORI, :NOMBODORI, :NOMTERCERO, :OBS, :ANULADO
    DO
        BEGIN
        if ((:ANULADOS = 'S') or (:ANULADO = 'N')) then
            BEGIN
            if (anulado = 'S') then
             BEGIN
              ITEM = 0;
              ARTICULO = '';
              CODBAR = '';
              ARTIDES = '';
              CANT = 0;
              UNIDAD = '';
              BODITEM = '';
              lote = '';
              costo = 0;
              DTOPORC = 0;
              DTOMONTO = 0;
              IVAPORC = 0;
              IVAMONTO = 0;
              CONSUMO = 0;
              TOTAL = 0;
              OBSITEM = null;
              SUBTOTAL = 0;
              SUSPEND;
             END
            ELSE
             BEGIN
              if (DETALLE = 'S') then
                FOR SELECT SADE_ITEM, A.ARTI_COD, SADE_CODBAR, SADE_DESC, SADE_CANT, SADE_UNIDAD, BODE_COD, SADE_COSTO, SADE_IVAPORC, SADE_IVAMONTO, SADE_CONSUMO, SADE_TOTAL, SADE_LOTE, SADE_OBS
                FROM SALIDAS_DETALLE D, ARTICULO A
                WHERE D.ARTI_COD = A.ARTI_COD AND D.SALI_ID = :ID
                ORDER BY SADE_ITEM
                INTO :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :BODITEM, :COSTO, :IVAPORC, :IVAMONTO, :CONSUMO, :TOTAL, :LOTE, :OBSITEM
                    DO
                BEGIN
                SUBTOTAL = TOTAL - IVAMONTO - CONSUMO;
                SUSPEND;
                END
              ELSE
                BEGIN
                SELECT SUM(SADE_IVAMONTO), SUM(SADE_CONSUMO), SUM(SADE_TOTAL) FROM SALIDAS_DETALLE D WHERE D.SALI_ID = :ID INTO
                    :IVAMONTO, :CONSUMO, :TOTAL;
                SUBTOTAL = TOTAL - IVAMONTO - CONSUMO;
                SUSPEND;
                END
             END
            END
        END
    END
  if (BIN_AND(TIPO, 4) <> 0) then
    BEGIN
    SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 13 INTO :NOMTIPO;
    FOR SELECT TRAN_ID, T.PREF_PRE, TRAN_NUMERO, TRAN_FECHA, TRAN_CONC, TRAN_REFER, T.BODE_COD, BO.BODE_NOM, TRAN_BODDES, BD.BODE_NOM, TRAN_OBS, TRAN_ANULADO
    FROM TRASFERENCIAS T, BODEGA BO, BODEGA BD, PREFIJOS PR
    WHERE T.BODE_COD = BO.BODE_COD AND T.TRAN_BODDES = BD.BODE_COD AND T.PREF_PRE >= :PREINI AND T.PREF_PRE <= :PREFIN AND TRAN_NUMERO >= :NUMINI AND TRAN_NUMERO <= :NUMFIN
     AND PR.PREF_PRE = T.PREF_PRE AND PR.TIDO_COD = 13 AND ((PR.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
    ORDER BY T.PREF_PRE, TRAN_NUMERO
    into :ID, :PREF, :NUMERO, :FECHA, :CONCEPTO, :REFER, :CODBODORI, :NOMBODORI, :CODBODDES, :NOMBODDES, :OBS, :ANULADO
    DO
        BEGIN
        if ((:ANULADOS = 'S') or (:ANULADO = 'N')) then
            BEGIN
            if (anulado = 'S') then
             BEGIN
              ITEM = 0;
              ARTICULO = '';
              CODBAR = '';
              ARTIDES = '';
              CANT = 0;
              UNIDAD = '';
              BODITEM = '';
              lote = '';
              costo = 0;
              DTOPORC = 0;
              DTOMONTO = 0;
              IVAPORC = 0;
              IVAMONTO = 0;
              CONSUMO = 0;
              TOTAL = 0;
              OBSITEM = null;
              SUBTOTAL = 0;
              SUSPEND;
             END
            ELSE
             BEGIN
              if (DETALLE = 'S') then
                FOR SELECT TRAS_ITEM, A.ARTI_COD, TRAS_CODBAR, TRAS_DESC, TRAS_CANT, TRAS_UNIDAD, TRAS_COSTO, TRAS_IVAPORC, TRAS_IVAMONTO, TRAS_CONSUMO, TRAS_TOTAL, TRAS_LOTE, TRAS_OBS
                FROM TRASFERENCIAS_DETALLE D, ARTICULO A
                WHERE D.ARTI_COD = A.ARTI_COD AND D.TRAN_ID = :ID
                ORDER BY TRAS_ITEM
                INTO :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :COSTO, :IVAPORC, :IVAMONTO, :CONSUMO, :TOTAL, :LOTE, :OBSITEM
                    DO
                    BEGIN
                    SUBTOTAL = TOTAL - IVAMONTO - CONSUMO;
                    SUSPEND;
                    END
              ELSE
                BEGIN
                SELECT SUM(TRAS_IVAMONTO), SUM(TRAS_CONSUMO), SUM(TRAS_TOTAL) FROM trasferencias_detalle D WHERE D.TRAN_ID = :ID INTO
                    :IVAMONTO, :CONSUMO, :TOTAL;
                SUBTOTAL = TOTAL - IVAMONTO - CONSUMO;
                SUSPEND;
                END
             END
            END
        END
    END
  if (BIN_AND(TIPO, 8) <> 0) then
    BEGIN
    SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 14 INTO :NOMTIPO;
    FOR SELECT AJUS_ID, A.PREF_PRE, AJUS_NUMERO, AJUS_FECHA, AJUS_CONC, A.BODE_COD, BODE_NOM, AJUS_OBS, AJUS_ANULADO
    FROM AJUSTES A, BODEGA B, PREFIJOS PR
    WHERE A.BODE_COD = B.BODE_COD AND A.PREF_PRE >= :PREINI AND A.PREF_PRE <= :PREFIN AND AJUS_NUMERO >= :NUMINI AND AJUS_NUMERO <= :NUMFIN
     AND PR.PREF_PRE = A.PREF_PRE AND PR.TIDO_COD = 14 AND ((PR.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
    ORDER BY A.PREF_PRE, AJUS_NUMERO
    into :ID, :PREF, :NUMERO, :FECHA, :CONCEPTO, :CODBODORI, :NOMBODORI, :OBS, :ANULADO
    DO
        BEGIN
        if ((:ANULADOS = 'S') or (:ANULADO = 'N')) then
            BEGIN
            if (anulado = 'S') then
             BEGIN
              ITEM = 0;
              ARTICULO = '';
              CODBAR = '';
              ARTIDES = '';
              CANT = 0;
              UNIDAD = '';
              BODITEM = '';
              lote = '';
              costo = 0;
              DTOPORC = 0;
              DTOMONTO = 0;
              IVAPORC = 0;
              IVAMONTO = 0;
              CONSUMO = 0;
              EXANT = 0;
              TOTAL = 0;
              OBSITEM = null;
              SUBTOTAL = 0;
              SUSPEND;
             END
            ELSE
             BEGIN
              if (DETALLE = 'S') then
                FOR SELECT AJUS_ITEM, A.ARTI_COD, AJUS_CODBAR, AJDE_DESC, AJUS_EXANT, AJUS_UNIDAD, BODE_COD, AJUS_EXNUE, AJUS_LOTE, AJDE_OBS
                FROM AJUSTES_DETALLE D, ARTICULO A
                WHERE D.ARTI_COD = A.ARTI_COD AND D.AJUS_ID = :ID
                ORDER BY AJUS_ITEM
                INTO :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :EXANT, :UNIDAD, :BODITEM, :CANT, :LOTE, :OBSITEM
                    DO
                      BEGIN
                      TOTAL = (CANT - EXANT) * COSTO;
                      SUBTOTAL = TOTAL;
                      SUSPEND;
                      END
              ELSE
                BEGIN
                TOTAL = 0;
                FOR SELECT ARTI_COD, AJUS_EXNUE, AJUS_EXANT FROM AJUSTES_DETALLE D WHERE D.AJUS_ID = :ID INTO
                    :ARTICULO, :CANT, :EXANT
                    DO
                      BEGIN
                      EXECUTE PROCEDURE COSTO_PROMEDIO(:ARTICULO, :FECHA) returning_values (:COSTO);
                      TOTAL = TOTAL + ((CANT - EXANT) * COSTO);
                      SUBTOTAL = TOTAL;
                      END
                SUSPEND;
                END
             END
            END
        END
    END
  if (BIN_AND(TIPO, 16) <> 0) then
    BEGIN
    SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 15 INTO :NOMTIPO;
    FOR SELECT ENSA_ID, E.PREF_PRE, ENSA_NUMERO, ENSA_FECHA, ENSA_CONC, ENSA_REFER, E.BODE_COD, BODE_NOM, ENSA_CODBAR, ENSA_DESC, ENSA_CANT, ENSA_UNIDAD, ENSA_LOTE, ENSA_OBS, ENSA_ANULADO
    FROM ENSAMBLES E, BODEGA B, PREFIJOS PR
    WHERE E.BODE_COD = B.BODE_COD AND E.PREF_PRE >= :PREINI AND E.PREF_PRE <= :PREFIN AND ENSA_NUMERO >= :NUMINI AND ENSA_NUMERO <= :NUMFIN
     AND PR.PREF_PRE = E.PREF_PRE AND PR.TIDO_COD = 15 AND ((PR.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
    ORDER BY E.PREF_PRE, ENSA_NUMERO
    into :ID, :PREF, :NUMERO, :FECHA, :CONCEPTO, :REFER, :CODBODORI, :NOMBODORI, :PRODCODBAR, :PRODDES, :PRODCANT, :PRODUNIDAD, :PRODLOTE, :OBS, :ANULADO
    DO
        BEGIN
        if ((:ANULADOS = 'S') or (:ANULADO = 'N')) then
            BEGIN
            if (anulado = 'S') then
             BEGIN
              ITEM = 0;
              ARTICULO = '';
              CODBAR = '';
              ARTIDES = '';
              CANT = 0;
              UNIDAD = '';
              BODITEM = '';
              lote = '';
              costo = 0;
              DTOPORC = 0;
              DTOMONTO = 0;
              IVAPORC = 0;
              IVAMONTO = 0;
              CONSUMO = 0;
              TOTAL = 0;
              OBSITEM = null;
              SUBTOTAL = 0;
              SUSPEND;
             END
            ELSE
             BEGIN
              if (DETALLE = 'S') then
                FOR SELECT ESDE_ITEM, A.ARTI_COD, ESDE_CODBAR, ESDE_DESC, ESDE_CANT, ESDE_UNIDAD, BODE_COD, ESDE_COSTO, ESDE_IVAPORC, ESDE_IVAMONTO, ESDE_CONSUMO, ESDE_TOTAL, ESDE_LOTE, ESDE_OBS
                FROM ensambles_detalle D, ARTICULO A
                WHERE D.ARTI_COD = A.ARTI_COD AND D.ENSA_ID = :ID
                ORDER BY ESDE_ITEM
                INTO :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :BODITEM, :COSTO, :IVAPORC, :IVAMONTO, :CONSUMO, :TOTAL, :LOTE, :OBSITEM
                    DO
                    BEGIN
                    SUBTOTAL = TOTAL - IVAMONTO - CONSUMO;
                    SUSPEND;
                    END
              ELSE
                BEGIN
                SELECT SUM(ESDE_IVAMONTO), SUM(ESDE_CONSUMO), SUM(ESDE_TOTAL) FROM ENSAMBLES_detalle D WHERE D.ENSA_ID = :ID INTO
                    :IVAMONTO, :CONSUMO, :TOTAL;
                SUBTOTAL = TOTAL - IVAMONTO - CONSUMO;
                SUSPEND;
                END
             END
            END
        END
    END
  if (BIN_AND(TIPO, 32) <> 0) then
    BEGIN
    SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 16 INTO :NOMTIPO;
    FOR SELECT DESE_ID, E.PREF_PRE, DESE_NUMERO, DESE_FECHA, DESE_CONC, DESE_REFER, E.BODE_COD, BODE_NOM, DESE_CODBAR, DESE_DESC, DESE_CANT, DESE_UNIDAD, DESE_LOTE, DESE_OBS, DESE_ANULADO
    FROM DESENSAMBLES E, BODEGA B, PREFIJOS PR
    WHERE E.BODE_COD = B.BODE_COD AND E.PREF_PRE >= :PREINI AND E.PREF_PRE <= :PREFIN AND DESE_NUMERO >= :NUMINI AND DESE_NUMERO <= :NUMFIN
     AND PR.PREF_PRE = E.PREF_PRE AND PR.TIDO_COD = 16 AND ((PR.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
    ORDER BY E.PREF_PRE, DESE_NUMERO
    into :ID, :PREF, :NUMERO, :FECHA, :CONCEPTO, :REFER, :CODBODORI, :NOMBODORI, :PRODCODBAR, :PRODDES, :PRODCANT, :PRODUNIDAD, :PRODLOTE, :OBS, :ANULADO
    DO
        BEGIN
        if ((:ANULADOS = 'S') or (:ANULADO = 'N')) then
            BEGIN
            if (anulado = 'S') then
             BEGIN
              ITEM = 0;
              ARTICULO = '';
              CODBAR = '';
              ARTIDES = '';
              CANT = 0;
              UNIDAD = '';
              BODITEM = '';
              lote = '';
              costo = 0;
              DTOPORC = 0;
              DTOMONTO = 0;
              IVAPORC = 0;
              IVAMONTO = 0;
              CONSUMO = 0;
              TOTAL = 0;
              OBSITEM = null;
              SUBTOTAL = 0;
              SUSPEND;
             END
            ELSE
             BEGIN
              if (DETALLE = 'S') then
                FOR SELECT DESE_ITEM, A.ARTI_COD, DEDE_CODBAR, DEDE_DESC, DEDE_CANT, DEDE_UNIDAD, BODE_COD, DEDE_COSTO, DEDE_IVAPORC, DEDE_IVAMONTO, DEDE_CONSUMO, DEDE_TOTAL, DEDE_LOTE, DEDE_OBS
                FROM DESensambles_detalle D, ARTICULO A
                WHERE D.ARTI_COD = A.ARTI_COD AND D.DESE_ID = :ID
                ORDER BY DESE_ITEM
                INTO
                    :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :BODITEM, :COSTO, :IVAPORC, :IVAMONTO, :CONSUMO, :TOTAL, :LOTE, :OBSITEM
                    DO
                    BEGIN
                    SUBTOTAL = TOTAL - IVAMONTO - CONSUMO;
                    SUSPEND;
                    END
              ELSE
                BEGIN
                SELECT SUM(DEDE_IVAMONTO), SUM(DEDE_CONSUMO), SUM(DEDE_TOTAL) FROM DESENSAMBLES_detalle D WHERE D.DESE_ID = :ID INTO
                    :IVAMONTO, :CONSUMO, :TOTAL;
                SUBTOTAL = TOTAL - IVAMONTO - CONSUMO;
                SUSPEND;
                END
             END
            END
        END
    END
  if (BIN_AND(TIPO, 64) <> 0) then
    BEGIN
    SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 17 INTO :NOMTIPO;
    FOR SELECT RESE_ID, R.PREF_PRE, RESE_NUMERO, RESE_FECHA, RESE_CONC, RESE_REFER, R.BODE_COD, BODE_NOM, RESE_NOMTERC, RESE_OBS, RESE_ANULADO
    FROM RESERVAS R, BODEGA B, PREFIJOS PR
    WHERE R.BODE_COD = B.BODE_COD AND R.PREF_PRE >= :PREINI AND R.PREF_PRE <= :PREFIN AND RESE_NUMERO >= :NUMINI AND RESE_NUMERO <= :NUMFIN
     AND PR.PREF_PRE = R.PREF_PRE AND PR.TIDO_COD = 17 AND ((PR.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
    ORDER BY R.PREF_PRE, RESE_NUMERO
    into :ID, :PREF, :NUMERO, :FECHA, :CONCEPTO, :REFER, :CODBODORI, :NOMBODORI, :NOMTERCERO, :OBS, :ANULADO
    DO
        BEGIN
        if ((:ANULADOS = 'S') or (:ANULADO = 'N')) then
            BEGIN
            if (anulado = 'S') then
             BEGIN
              ITEM = 0;
              ARTICULO = '';
              CODBAR = '';
              ARTIDES = '';
              CANT = 0;
              UNIDAD = '';
              BODITEM = '';
              lote = '';
              costo = 0;
              DTOPORC = 0;
              DTOMONTO = 0;
              IVAPORC = 0;
              IVAMONTO = 0;
              CONSUMO = 0;
              EXANT = 0;
              TOTAL = 0;
              OBSITEM = null;
              SUBTOTAL = 0;
              SUSPEND;
             END
            ELSE
             BEGIN
              if (DETALLE = 'S') then
                FOR SELECT RSDE_ITEM, A.ARTI_COD, RSDE_CODBAR, RSDE_DESC, RDSE_CANT, RSDE_UNIDAD, BODE_COD, RSDE_OBS
                FROM RESERVAS_DETALLE D, ARTICULO A
                WHERE D.ARTI_COD = A.ARTI_COD AND D.RESE_ID = :ID
                ORDER BY RSDE_ITEM
                INTO :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :BODITEM, :OBSITEM
                    DO
                    SUSPEND;
              ELSE
                BEGIN
                SELECT SUM(RDSE_CANT) FROM RESERVAS_detalle D WHERE D.RESE_ID = :ID INTO
                    :CANT;
                SUSPEND;
                END
             END
            END
        END
    END
  if (BIN_AND(TIPO, 128) <> 0) then
    BEGIN
    SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 18 INTO :NOMTIPO;
    FOR SELECT ORIN_ID, O.PREF_PRE, ORIN_NUMERO, ORIN_FECHA, ORIN_FECLLEGA, ORIN_CONC, ORIN_REFER, ORIN_NOMTERC, ORIN_OBS, ORIN_ANULADO
    FROM ORDENES_INVENTARIO O, PREFIJOS PR
    WHERE O.PREF_PRE >= :PREINI AND O.PREF_PRE <= :PREFIN AND ORIN_NUMERO >= :NUMINI AND ORIN_NUMERO <= :NUMFIN
     AND PR.PREF_PRE = O.PREF_PRE AND PR.TIDO_COD = 18 AND ((PR.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
    ORDER BY O.PREF_PRE, ORIN_NUMERO
    into :ID, :PREF, :NUMERO, :FECHA, :VENCE, :CONCEPTO, :REFER, :NOMTERCERO, :OBS, :ANULADO
    DO
        BEGIN
        if ((:ANULADOS = 'S') or (:ANULADO = 'N')) then
            BEGIN
            if (anulado = 'S') then
             BEGIN
              ITEM = 0;
              ARTICULO = '';
              CODBAR = '';
              ARTIDES = '';
              CANT = 0;
              UNIDAD = '';
              BODITEM = '';
              lote = '';
              costo = 0;
              DTOPORC = 0;
              DTOMONTO = 0;
              IVAPORC = 0;
              IVAMONTO = 0;
              CONSUMO = 0;
              EXANT = 0;
              TOTAL = 0;
              OBSITEM = null;
              SUBTOTAL = 0;
              SUSPEND;
             END
            ELSE
             BEGIN
              if (DETALLE = 'S') then
                FOR SELECT ORID_ITEM, A.ARTI_COD, ORID_CODBAR, ORID_DESC, ORID_CANT, ORID_UNIDAD, ORIN_COSTO, ORID_DTOPORC, ORID_DTOMONTO, ORID_IVAPORC, ORID_IVAMONTO, ORID_CONSUMO, ORID_TOTAL, ORID_OBS, ORID_LOTE
                FROM ORDENINVENTARIO_DETALLE D, ARTICULO A
                WHERE D.ARTI_COD = A.ARTI_COD AND D.ORIN_ID = :ID
                ORDER BY ORID_ITEM
                INTO :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :COSTO, :DTOPORC, :DTOMONTO, :IVAPORC, :IVAMONTO, :CONSUMO, :TOTAL, :OBSITEM, :LOTE
                    DO
                    BEGIN
                    SUBTOTAL = TOTAL - IVAMONTO - CONSUMO;
                    SUSPEND;
                    END
              ELSE
                BEGIN
                SELECT SUM(ORID_IVAMONTO), SUM(ORID_CONSUMO), SUM(ORID_TOTAL) FROM ordeninventario_detalle D WHERE D.ORIN_ID = :ID INTO
                    :IVAMONTO, :CONSUMO, :TOTAL;
                SUBTOTAL = TOTAL - IVAMONTO - CONSUMO;
                SUSPEND;
                END
             END
            END
        END
    END
END

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE REP_DISPONIBILIDAD(
    FECHA DATE,
    ARTINI VARCHAR(20),
    ARTFIN VARCHAR(20),
    GRPINI VARCHAR(3),
    GRPFIN VARCHAR(3),
    ORDEN CHAR(1),
    CEROS CHAR(1),
    DETALLE CHAR(1),
    AGRUPA CHAR(1),
    SUCURSAL INTEGER)
RETURNS (
    CODIGO VARCHAR(15),
    NOMBRE VARCHAR(60),
    UNIDAD VARCHAR(8),
    CODGRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    CODSUBG VARCHAR(3),
    NOMSUBG VARCHAR(30),
    CODMARC VARCHAR(3),
    NOMMARC VARCHAR(30),
    CODBOD VARCHAR(2),
    NOMBOD VARCHAR(30),
    EXIST NUMERIC(18,4),
    PROMEDIO NUMERIC(18,4),
    SALIDAS NUMERIC(18,4),
    DISPONIBILIDAD INTEGER,
    DIAS INTEGER,
    PROMEDIADO INTEGER,
    COSTO NUMERIC(18,2),
    COSTOPRO NUMERIC(18,2),
    SUGERIDO NUMERIC(18,4),
    FECCOMPRA DATE)
AS
DECLARE VARIABLE CODINI VARCHAR(20);
DECLARE VARIABLE CODFIN VARCHAR(20);
DECLARE VARIABLE DESINI VARCHAR(20);
DECLARE VARIABLE DESFIN VARCHAR(20);
DECLARE VARIABLE MARINI VARCHAR(20);
DECLARE VARIABLE MARFIN VARCHAR(20);
declare variable DIASC VARCHAR(255);
declare variable DIA_ART VARCHAR(2) CHARACTER SET NONE;
BEGIN
if (ORDEN = 'C') then
    BEGIN
    CODINI = ARTINI;
    CODFIN = ARTFIN;
    DESINI = '';
    DESFIN = 'zz';
    END
ELSE
    BEGIN
    DESINI = ARTINI;
    DESFIN = ARTFIN;
    CODINI = '';
    CODFIN = 'zz';
    END
if (AGRUPA = 'G') then
    BEGIN
    MARINI = '';
    MARFIN = 'zz';
    END
ELSE
    if (AGRUPA = 'M') then
        BEGIN
        MARINI = GRPINI;
        MARFIN = GRPFIN;
        GRPINI = '';
        GRPFIN = 'zz';
        END
if (DETALLE = 'S') then
  BEGIN
  FOR SELECT ARTI_COD, ARTI_DES, ARTI_UNIDAD, ARTI_DIAS, A.GRUP_COD, GRUP_NOM, A.SUBG_COD, A.MARC_COD, BODE_COD, BODE_NOM, ARTI_DIANALIS
      FROM ARTICULO A, GRUPO G, BODEGA B
      WHERE ARTI_COD >= :CODINI AND ARTI_COD <= :CODFIN AND A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :GRPFIN AND ARTI_DES >= :DESINI AND ARTI_DES <= :DESFIN AND
      G.GRUP_COD = A.GRUP_COD AND A.ESAR_COD <> 'I' AND ((SUCU_ID = :SUCURSAL) or (:SUCURSAL = 0)) AND
      (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN)))
      INTO :CODIGO, :NOMBRE, :UNIDAD, :DIAS, :CODGRUPO, :NOMGRUPO, :CODSUBG, :CODMARC, :CODBOD, :NOMBOD, :PROMEDIADO
      DO
        BEGIN
        NOMMARC = '';
        NOMSUBG = '';
        SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO :NOMMARC;
        SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
        EXECUTE PROCEDURE ultimo_costo(:CODIGO, :FECHA, :UNIDAD) returning_values (:COSTO);
        EXECUTE PROCEDURE costo_promedio(:CODIGO, :FECHA) RETURNING_VALUES :costopro;
        EXECUTE PROCEDURE DISPONIBILIDAD_ARTICULO(CODIGO, FECHA, :CODBOD) returning_values (:DISPONIBILIDAD, :EXIST, :PROMEDIO, :SALIDAS);
        /*ESTABLECER CUAL ES EL VALOR DE DIAS PARA PROMEDIO*/
        EXECUTE PROCEDURE lee_configuracion ('INVENTARIO', 'EXISTENCIAS', 'PROMEDIAR LAS SALIDAS DEL INVENTARIO CON EL NUMERO DE DIAS ASIGNADO A CADA ARTICULO') returning_values (:DIA_ART);
        if (DIA_ART = 'NO') then
          BEGIN
            EXECUTE PROCEDURE lee_configuracion ('INVENTARIO', 'EXISTENCIAS', 'NUMERO DE DIAS PARA PROMEDIO DE SALIDAS POR ARTICULO') returning_values (DIASC);
            PROMEDIADO = CAST(DIASC AS INTEGER);
          END
        if ((DISPONIBILIDAD < DIAS) and (PROMEDIO > 0))then
            SUGERIDO = (DIAS * PROMEDIO) - EXIST;
        ELSE
            SUGERIDO = 0;
        SELECT MAX(FACO_FECHA) FROM FACTURAS_COMPRA F, FACTURAS_COMPRAS_DETALLE D
            WHERE F.FACO_ID = D.faco_id AND D.ARTI_COD = :CODIGO AND FACO_FECHA <= :FECHA AND D.bode_cod = :codbod
            INTO :FECCOMPRA;
        if ((PROMEDIO > 0) or (EXIST <> 0) or (CEROS = 'S')) then
            SUSPEND;
        END
  END
ELSE
  BEGIN
  FOR SELECT ARTI_COD, ARTI_DES, ARTI_UNIDAD, ARTI_DIAS, A.GRUP_COD, GRUP_NOM, A.SUBG_COD, A.MARC_COD, ARTI_DIANALIS
      FROM ARTICULO A, GRUPO G
      WHERE ARTI_COD >= :CODINI AND ARTI_COD <= :CODFIN AND A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :GRPFIN AND ARTI_DES >= :DESINI AND ARTI_DES <= :DESFIN AND G.GRUP_COD = A.GRUP_COD AND
      A.ESAR_COD <> 'I' AND (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN)))
      INTO :CODIGO, :NOMBRE, :UNIDAD, :DIAS, :CODGRUPO, :NOMGRUPO, :CODSUBG, :CODMARC, :PROMEDIADO
      DO
        BEGIN
        NOMMARC = '';
        NOMSUBG = '';
        SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO :NOMMARC;
        SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
        EXECUTE PROCEDURE costo_promedio(:CODIGO, :FECHA) RETURNING_VALUES :costopro;
        EXECUTE PROCEDURE ultimo_costo(:CODIGO, :FECHA, :UNIDAD) returning_values (:COSTO);
        EXECUTE PROCEDURE DISPONIBILIDAD_TOTAL_ARTICULO(CODIGO, FECHA) returning_values (:DISPONIBILIDAD, :EXIST, :PROMEDIO, :SALIDAS);
        /*ESTABLECER CUAL ES EL VALOR DE DIAS PARA PROMEDIO*/
        EXECUTE PROCEDURE lee_configuracion ('INVENTARIO', 'EXISTENCIAS', 'PROMEDIAR LAS SALIDAS DEL INVENTARIO CON EL NUMERO DE DIAS ASIGNADO A CADA ARTICULO') returning_values (:DIA_ART);
        if (DIA_ART = 'NO') then
          BEGIN
            EXECUTE PROCEDURE lee_configuracion ('INVENTARIO', 'EXISTENCIAS', 'NUMERO DE DIAS PARA PROMEDIO DE SALIDAS POR ARTICULO') returning_values (DIASC);
            PROMEDIADO = CAST(DIASC AS INTEGER);
          END
        if ((DISPONIBILIDAD < DIAS) and (PROMEDIO > 0))then
            SUGERIDO = (DIAS * PROMEDIO) - EXIST;
        ELSE
            SUGERIDO = 0;
        SELECT MAX(FACO_FECHA) FROM FACTURAS_COMPRA F, FACTURAS_COMPRAS_DETALLE D
            WHERE F.FACO_ID = D.faco_id AND D.ARTI_COD = :CODIGO AND FACO_FECHA <= :FECHA
            INTO :FECCOMPRA;
        if ((PROMEDIO > 0) or (EXIST <> 0) or (CEROS = 'S')) then
            SUSPEND;
        END
  END
END

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE REP_KARDEX_ARTICULO(
    DETALLE CHAR(1),
    FECINI DATE,
    FECFIN DATE,
    ARTINI VARCHAR(20),
    ARTFIN VARCHAR(20),
    GRPINI VARCHAR(2),
    GRPFIN VARCHAR(2),
    ORDEN CHAR(1),
    BODEGA VARCHAR(2))
RETURNS (
    CODIGO VARCHAR(15),
    NOMBRE VARCHAR(60),
    UNIDAD VARCHAR(8),
    CODGRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    CODSUBG VARCHAR(3),
    NOMSUBG VARCHAR(30),
    CODMARC VARCHAR(3),
    NOMMARC VARCHAR(30),
    CODBOD VARCHAR(2),
    SALDOINI NUMERIC(18,4),
    COSTOINI NUMERIC(18,2),
    ENTRADAS NUMERIC(18,4),
    COSTOENT NUMERIC(18,2),
    SALIDAS NUMERIC(18,4),
    COSTOSAL NUMERIC(18,2),
    SALDOFIN NUMERIC(18,4),
    COSTOFIN NUMERIC(18,2),
    TIPODOC VARCHAR(8),
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    CONCEPTO VARCHAR(60),
    NIT VARCHAR(20),
    CONS INTEGER,
    CANFINAL NUMERIC(18,4),
    COSFINAL NUMERIC(18,2))
AS
DECLARE VARIABLE ENTRADA CHAR(1);
DECLARE VARIABLE CANT NUMERIC(18,4);
DECLARE VARIABLE COSTO NUMERIC(18,2);
DECLARE VARIABLE CODINI VARCHAR(20);
DECLARE VARIABLE CODFIN VARCHAR(20);
DECLARE VARIABLE DESINI VARCHAR(20);
DECLARE VARIABLE DESFIN VARCHAR(20);
BEGIN
if (ORDEN = 'C') then
    BEGIN
    CODINI = ARTINI;
    CODFIN = ARTFIN;
    DESINI = '';
    DESFIN = 'zz';
    END
ELSE
    BEGIN
    DESINI = ARTINI;
    DESFIN = ARTFIN;
    CODINI = '';
    CODFIN = 'zz';
    END
  FOR
    SELECT ARTI_COD, ARTI_DES, ARTI_UNIDAD, A.GRUP_COD, A.SUBG_COD, A.MARC_COD
      FROM ARTICULO A
      WHERE ARTI_COD >= :CODINI AND ARTI_COD <= :CODFIN AND A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :GRPFIN AND ARTI_DES >= :DESINI AND ARTI_DES <= :DESFIN AND A.ESAR_COD <> 'I'
      INTO :CODIGO, :NOMBRE, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
      DO
        BEGIN
        NOMMARC = '';
        NOMSUBG = '';
        SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
        SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
        SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
        if (BODEGA = '') then
            BEGIN
            EXECUTE PROCEDURE SALDO_INICIAL_TOTAL_INV(CODIGO, FECINI) returning_values (:SALDOINI);
            EXECUTE PROCEDURE VALOR_INICIAL_INVENTARIO(CODIGO, FECINI) returning_values (COSTOINI);
            END
        ELSE
            BEGIN
            EXECUTE PROCEDURE SALDO_INICIAL_INVENTARIO(CODIGO, FECINI, :BODEGA) returning_values (SALDOINI);
            EXECUTE PROCEDURE COSTO_PROMEDIO(CODIGO, FECINI-1) returning_values (COSTOINI);
            COSTOINI = COSTOINI * saldoini;
            END
        if (DETALLE = 'N') then
            BEGIN
            /* SUME LAS ENTRADAS */
            if (BODEGA = '') then
              SELECT SUM(COST_ENTC), SUM(COST_ENTP), SUM(COST_SALC), SUM(COST_SALP) FROM COSTOS
                WHERE (COST_FECHA >= :FECINI) AND (COST_FECHA <= :FECFIN) AND (ARTI_COD = :codigo)
                INTO :ENTRADAS, :COSTOENT, :SALIDAS, :COSTOSAL;
            ELSE
              SELECT SUM(COST_ENTC), SUM(COST_ENTP), SUM(COST_SALC), SUM(COST_SALP)
                FROM COSTOS C, MOVIMIENTO_ARTICULO M
                WHERE (COST_FECHA >= :FECINI) AND (COST_FECHA <= :FECFIN) AND (C.ARTI_COD = :codigo) AND C.cost_idmov = M.mvar_cons AND BODE_COD = :BODEGA
                INTO :ENTRADAS, :COSTOENT, :SALIDAS, :COSTOSAL;

            if (ENTRADAS IS NULL) then
              ENTRADAS = 0;
            if (COSTOENT IS NULL) then
              COSTOENT = 0;
            if (SALIDAS IS NULL) then
              SALIDAS = 0;
            if (COSTOSAL IS NULL) then
              COSTOSAL = 0;
            SALDOFIN = SALDOINI + ENTRADAS - SALIDAS;
            COSTOFIN = COSTOINI + COSTOENT - COSTOSAL;
            if (BODEGA = '') then
                BEGIN
                EXECUTE PROCEDURE SALDO_INICIAL_TOTAL_INV(CODIGO, fecfin+1) returning_values (canfinal);
                EXECUTE PROCEDURE VALOR_INICIAL_INVENTARIO(CODIGO, FECFIN+1) returning_values (cosfinal);
                END
            ELSE
                BEGIN
                EXECUTE PROCEDURE SALDO_INICIAL_INVENTARIO(CODIGO, FECFIN+1, :BODEGA) returning_values (CANFINAL);
                EXECUTE PROCEDURE COSTO_PROMEDIO(CODIGO, FECFIN+1) returning_values (COSFINAL);
                COSFINAL = COSFINAL * CANFINAL;
                END
            SUSPEND;
            END
        ELSE
            BEGIN
            SALDOFIN = SALDOINI;
            COSTOFIN = COSTOINI;
            COSTOENT = 0;
            COSTOSAL = 0;
            FOR SELECT TIDO_NOMCORTO, MVAR_ENTRADA, MVAR_PREF, MVAR_NUMERO, MVAR_CANT, MVAR_COSTO, MVAR_CONC, MVAR_FECHA, M.TERC_NIT, MVAR_CONS, BODE_COD, COST_SALDOP, COST_SALDOC
                FROM MOVIMIENTO_ARTICULO M, TIPO_DOCUMENTO TD, COSTOS C
                WHERE TD.TIDO_COD = MVAR_TIPODOC AND (MVAR_FECHA >= :FECINI) AND (MVAR_FECHA <= :FECFIN) AND (MVAR_TIPODOC <> 13) AND (m.ARTI_COD = :CODIGO) AND M.mvar_cons = C.cost_idmov
                ORDER BY MVAR_FECHA, MVAR_CONS
                INTO :TIPODOC, :ENTRADA, :PREFIJO, :NUMERO, :ENTRADAS, :COSTOENT, :CONCEPTO, :FECHA, :NIT, :CONS, :CODBOD, :costo, :cant
                DO
                    BEGIN
                    if (ENTRADA = 'S') then
                        BEGIN
                        SALIDAS = 0;
                        SALDOFIN = SALDOFIN + ENTRADAS;
                        COSTOFIN = COSTOFIN + (ENTRADAS * COSTOENT);
                        if (CANT > 0) then
                            COSTOSAL = COSTO / CANT;
                        else
                            COSTOSAL = 0;
                        end
                    ELSE
                        BEGIN
                        SALIDAS = ENTRADAS;
                        ENTRADAS = 0;
                        if (CANT > 0) then
                            COSTOSAL = COSTO / CANT;
                        else
                            COSTOSAL = 0;
                        SALDOFIN = SALDOFIN - SALIDAS;
                        COSTOFIN = COSTOFIN - (SALIDAS * costosal);
                        END
                    SUSPEND;
                    END
            END
        END
END

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE REP_PRODUCTOS(
    ORDEN CHAR(1),
    DESDE VARCHAR(15),
    HASTA VARCHAR(15),
    FECHA DATE)
RETURNS (
    CODIGO VARCHAR(15),
    DESCR VARCHAR(60),
    GRUPCOD VARCHAR(2),
    GRUPNOM VARCHAR(30),
    SUBGCOD VARCHAR(3),
    SUBGNOM VARCHAR(30),
    MARCCOD VARCHAR(3),
    MARCNOM VARCHAR(30),
    ESTADO CHAR(1),
    UNIDAD VARCHAR(8),
    CODCOMP VARCHAR(15),
    DESCOMP VARCHAR(60),
    CANT NUMERIC(18,4),
    UNDCOMP VARCHAR(8),
    CODBARCOMP VARCHAR(15),
    COSTO NUMERIC(18,2),
    TOTAL NUMERIC(18,2))
AS
BEGIN
  FOR SELECT ARTI_COD, ARTI_DES, ARTI_UNIDAD, A.GRUP_COD, GRUP_NOM, A.SUBG_COD, A.MARC_COD, A.esar_cod
  FROM ARTICULO A, GRUPO G, estado_articulo E
  WHERE A.GRUP_COD = G.GRUP_COD AND A.ESAR_COD = E.ESAR_COD AND ARTI_COD IN (SELECT DISTINCT ARTI_COD FROM ARTICULOS_PRODUCTO)
  INTO :CODIGO, :DESCR, :unidad, :GRUPCOD, :GRUPNOM, :SUBGCOD, :MARCCOD, :ESTADO
  DO
    if ((ORDEN = 'C' AND CODIGO >= :DESDE AND CODIGO <= :HASTA) OR
        (ORDEN = 'D' AND DESCR >= :DESDE AND DESCR <= :HASTA)) then
        BEGIN
        SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :MARCCOD INTO MARCNOM;
        SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :SUBGCOD AND GRUP_COD = :GRUPCOD INTO :SUBGNOM;
        FOR SELECT ARPR_COMP, ARTI_DES, ARPR_CODBAR, ARPR_CANT, ARPR_UNIDAD
        FROM ARTICULOS_PRODUCTO P, ARTICULO A
        WHERE P.ARTI_COD = :CODIGO AND P.ARPR_COMP = A.ARTI_COD
          INTO :CODCOMP, :DESCOMP, :CODBARCOMP, :CANT, :UNDCOMP
          DO
            begin
            EXECUTE PROCEDURE COSTO_PROMEDIO (:CODCOMP, :FECHA) returning_values (:COSTO);
            EXECUTE PROCEDURE CANTIDAD_POR_FACTOR (:CODCOMP, :CANT, :UNDCOMP) returning_values (:CANT);
            TOTAL = COSTO * CANT;
            SUSPEND;
            END
        END
END

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE REP_UTILIDAD_CLIENTE(
    TIPO INTEGER,
    DETALLE CHAR(1),
    TERINI VARCHAR(20),
    TERFIN VARCHAR(20),
    FECINI DATE,
    FECFIN DATE,
    ARTINI VARCHAR(15),
    ARTFIN VARCHAR(15),
    ORDEN CHAR(1),
    CEROS CHAR(1),
    SUBEMPRESA INTEGER)
RETURNS (
    NIT VARCHAR(20),
    NOMBRE VARCHAR(60),
    TELEFONO VARCHAR(40),
    CIUDAD VARCHAR(40),
    CODZONA VARCHAR(2),
    NOMZONA VARCHAR(30),
    NOMTIPO VARCHAR(50),
    ARTICULO VARCHAR(15),
    DESCRIPCION VARCHAR(60),
    CODGRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    CODSUBG VARCHAR(3),
    NOMSUBG VARCHAR(30),
    CODMARC VARCHAR(3),
    NOMMARC VARCHAR(30),
    UNIDAD VARCHAR(8),
    CANTIDAD NUMERIC(18,4),
    BASE NUMERIC(18,2),
    IVA NUMERIC(18,2),
    COSTO NUMERIC(18,2),
    UTILIDAD NUMERIC(18,4),
    PORC NUMERIC(9,2),
    TOTAL NUMERIC(18,2),
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    DTO NUMERIC(9,2))
AS
DECLARE VARIABLE COSTOUNIT NUMERIC(18,4);
DECLARE VARIABLE CODINI VARCHAR(15);
DECLARE VARIABLE CODFIN VARCHAR(15);
DECLARE VARIABLE DESINI VARCHAR(15);
DECLARE VARIABLE DESFIN VARCHAR(15);
declare variable UOM VARCHAR(20);
declare variable NUMROWS INTEGER;
BEGIN
if (ORDEN = 'C') then
    BEGIN
    CODINI = ARTINI;
    CODFIN = ARTFIN;
    DESINI = '';
    DESFIN = 'zz';
    END
ELSE
    BEGIN
    DESINI = ARTINI;
    DESFIN = ARTFIN;
    CODINI = '';
    CODFIN = 'zz';
    END
EXECUTE PROCEDURE lee_configuracion ('FACTURACION', 'ARTICULOS', 'SUGERIR PRECIOS CON PORCENTAJE DE MARGEN O UTILIDAD') returning_values (:UOM);
SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = :TIPO INTO :NOMTIPO;
if (DETALLE = 'N') then
    BEGIN
    if (BIN_AND(TIPO, 1) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 31 INTO :NOMTIPO;
        /* BORRA LA TABLA AUXILIAR */
        DELETE FROM reportes_aux WHERE REPA_ID = 3 AND REPA_USER = USER;

        FOR SELECT MAX(T.TERC_NIT), MAX(TERC_NOM), MAX(TERC_TEL), MAX(TERC_CIU), MAX(ZONA_COD), MAX(D.ARTI_COD), SUM(FADE_CANT * FADE_FACTOR), SUM(FACT_FACTOR*(FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO)),
            SUM(FACT_FACTOR*FADE_IVAMONTO), SUM(FACT_FACTOR*FADE_TOTAL),
            MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD), SUM(COST_SALP)
            FROM FACTURAS_DETALLE D, FACTURAS F, PREFIJOS P, terceros T, CLIENTES C, ARTICULO A, movimiento_articulo m, costos CO
            WHERE C.TERC_NIT = T.TERC_NIT AND TERC_CLIE = 'S' AND F.terc_nit = T.terc_nit AND T.TERC_NIT >= :TERINI AND T.TERC_NIT <= :TERFIN AND
            F.FACT_ID = D.FACT_ID AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND FACT_ANULADO = 'N'
            AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) and substring(D.arti_cod from 1 FOR 2) <> '.t'
            AND D.ARTI_COD = A.arti_cod AND A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN
            AND F.fact_id = M.mvar_idref AND M.mvar_tipodoc = 31 AND M.mvar_item = D.fade_item AND M.mvar_cons = CO.cost_idmov
            GROUP BY T.TERC_NIT, D.ARTI_COD
            INTO :NIT, :NOMBRE, :TELEFONO, :CIUDAD, :CODZONA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :TOTAL,
            :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :COSTO
            DO
            BEGIN
            SELECT ZONA_NOM FROM ZONAS WHERE ZONA_COD = :CODZONA INTO :NOMZONA;
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            if (CEROS = 'S') then
                INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (3, USER, :ARTICULO);
            SUSPEND;
            END /* FOR */
        if (CEROS = 'S') then
            BEGIN
            COSTO = 0;
            UTILIDAD = 0;
            PORC = 0;
            /* agregue los articulos sin factura */
            FOR SELECT ARTI_COD, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN
                INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                DO
                BEGIN
                SELECT COUNT(REPA_ARTICULO) FROM REPORTES_AUX WHERE REPA_ID = 3 AND REPA_USER = USER AND REPA_ARTICULO = :articulo INTO :numrows;
                if (numrows = 0) then
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        END
    if (BIN_AND(TIPO, 2) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 32 INTO :NOMTIPO;
        /* BORRA LA TABLA AUXILIAR */
        DELETE FROM reportes_aux WHERE REPA_ID = 3 AND REPA_USER = USER;

        FOR SELECT MAX(T.TERC_NIT), MAX(TERC_NOM), MAX(TERC_TEL), MAX(TERC_CIU), MAX(ZONA_COD), MAX(D.ARTI_COD), SUM(RVDE_CANT * RVDE_FACTOR), SUM(RVDE_TOTAL-RVDE_IVAMONTO-RVDE_CONSUMO), SUM(RVDE_IVAMONTO), SUM(RVDE_TOTAL),
            MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD), SUM(COST_SALP)
            FROM REMISIONES_VENTA_DETALLE D, REMISIONES_VENTA R, PREFIJOS P, terceros T, CLIENTES C, ARTICULO A, movimiento_articulo m, costos CO
            WHERE C.TERC_NIT = T.TERC_NIT AND TERC_CLIE = 'S' AND R.terc_nit = T.terc_nit AND T.TERC_NIT >= :TERINI AND T.TERC_NIT <= :TERFIN AND
            R.REVT_ID = D.REVT_ID AND REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN AND REVT_ANULADO = 'N'
            AND P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = 32 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            AND D.ARTI_COD = A.arti_cod AND A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN
            AND R.revt_id = M.mvar_idref AND M.mvar_tipodoc = 32 AND M.mvar_item = D.rvde_item AND M.mvar_cons = CO.cost_idmov
            GROUP BY T.TERC_NIT, D.ARTI_COD
            INTO :NIT, :NOMBRE, :TELEFONO, :CIUDAD, :CODZONA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :TOTAL,
                :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :COSTO
            DO
                BEGIN
                SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                if (CANTIDAD IS NULL) then
                    CANTIDAD = 0;
                if (BASE IS NULL) then
                    BASE = 0;
                if (IVA IS NULL) then
                    IVA = 0;
                UTILIDAD = BASE - COSTO;
                if (UOM = 'UTILIDAD') then
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                else
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            if (CEROS = 'S') then
                INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (3, USER, :ARTICULO);
            SUSPEND;
            END /* FOR */
        if (CEROS = 'S') then
            BEGIN
            COSTO = 0;
            UTILIDAD = 0;
            PORC = 0;
            /* agregue los articulos sin factura */
            FOR SELECT ARTI_COD, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN
                INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                DO
                BEGIN
                SELECT COUNT(REPA_ARTICULO) FROM REPORTES_AUX WHERE REPA_ID = 3 AND REPA_USER = USER AND REPA_ARTICULO = :articulo INTO :numrows;
                if (numrows = 0) then
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        END
    if (BIN_AND(TIPO, 4) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 33 INTO :NOMTIPO;
        /* BORRA LA TABLA AUXILIAR */
        DELETE FROM reportes_aux WHERE REPA_ID = 3 AND REPA_USER = USER;

        FOR SELECT MAX(T.TERC_NIT), MAX(TERC_NOM), MAX(TERC_TEL), MAX(TERC_CIU), MAX(ZONA_COD), MAX(D.ARTI_COD), SUM(DVDE_CANT * DVDE_FACTOR), SUM(DEVT_FACTOR*(DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO)),
            SUM(DEVT_FACTOR*DVDE_IVAMONTO), SUM(DEVT_FACTOR*DVDE_TOTAL),
            MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD), SUM(COST_ENTP)
            FROM devoluciones_ventas_detalle D, DEVOLUCIONES_VENTAS V, PREFIJOS P, terceros T, CLIENTES C, ARTICULO A, MOVIMIENTO_ARTICULO M, COSTOS CO
            WHERE C.TERC_NIT = T.TERC_NIT AND TERC_CLIE = 'S' AND V.terc_nit = T.terc_nit AND T.TERC_NIT >= :TERINI AND T.TERC_NIT <= :TERFIN AND
            V.DEVT_ID = D.DEVT_ID AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND DEVT_ANULADO = 'N'
            AND P.PREF_PRE = V.PREF_PRE AND P.TIDO_COD = 33 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) and substring(D.arti_cod from 1 FOR 2) <> '.t'
            AND D.ARTI_COD = A.arti_cod AND A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN
            AND V.devt_id = M.mvar_idref AND M.mvar_tipodoc = 33 AND M.mvar_item = D.dvde_item AND M.mvar_cons = CO.cost_idmov
            GROUP BY T.TERC_NIT, D.ARTI_COD
            INTO :NIT, :NOMBRE, :TELEFONO, :CIUDAD, :CODZONA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :TOTAL,
                :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :COSTO
            DO
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            TOTAL = TOTAL * -1;
            IVA = IVA * -1;
            BASE = BASE * -1;
            CANTIDAD = CANTIDAD * -1;
            COSTO = COSTO * -1;
            UTILIDAD = UTILIDAD * -1;
            if (CEROS = 'S') then
                INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (3, USER, :ARTICULO);
            SUSPEND;
            END /* FOR */
        if (CEROS = 'S') then
            BEGIN
            COSTO = 0;
            UTILIDAD = 0;
            PORC = 0;
            /* agregue los articulos sin factura */
            FOR SELECT ARTI_COD, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN
                INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                DO
                BEGIN
                SELECT COUNT(REPA_ARTICULO) FROM REPORTES_AUX WHERE REPA_ID = 3 AND REPA_USER = USER AND REPA_ARTICULO = :articulo INTO :numrows;
                if (numrows = 0) then
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        END
    if (BIN_AND(TIPO, 8) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 34 INTO :NOMTIPO;
        /* BORRA LA TABLA AUXILIAR */
        DELETE FROM reportes_aux WHERE REPA_ID = 3 AND REPA_USER = USER;

        FOR SELECT MAX(T.TERC_NIT), MAX(TERC_NOM), MAX(TERC_TEL), MAX(TERC_CIU), MAX(ZONA_COD), MAX(ARTI_COD), SUM(PEDE_CANT * PEDE_FACTOR), SUM(PEDI_FACTOR*(PEDE_TOTAL-PEDE_IVAMONTO-PEDE_CONSUMO)),
            SUM(PEDI_FACTOR*PEDE_IVAMONTO), SUM(PEDI_FACTOR*PEDE_TOTAL)
            FROM PEDIDOS_DETALLE D, PEDIDOS P, PREFIJOS PR, terceros T, CLIENTES C
            WHERE C.TERC_NIT = T.TERC_NIT AND TERC_CLIE = 'S' AND P.terc_nit = T.terc_nit AND T.TERC_NIT >= :TERINI AND T.TERC_NIT <= :TERFIN AND
            P.PEDI_ID = D.PEDI_ID AND PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND PEDI_ANULADO = 'N'
            AND PR.PREF_PRE = P.PREF_PRE AND P.TIDO_COD = 34 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY T.TERC_NIT, ARTI_COD
            INTO :NIT, :NOMBRE, :TELEFONO, :CIUDAD, :CODZONA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :TOTAL
            DO
            BEGIN
            SELECT ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                FROM ARTICULO WHERE ARTI_COD = :ARTICULO
                INTO :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC;
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            EXECUTE PROCEDURE costo_promedio (:ARTICULO, :FECFIN) RETURNING_VALUES (:COSTOUNIT);
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            COSTO = CANTIDAD * COSTOUNIT;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            if (CEROS = 'S') then
                INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (3, USER, :ARTICULO);
            SUSPEND;
            END /* FOR */
        if (CEROS = 'S') then
            BEGIN
            COSTO = 0;
            UTILIDAD = 0;
            PORC = 0;
            /* agregue los articulos sin factura */
            FOR SELECT ARTI_COD, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN
                INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                DO
                BEGIN
                SELECT COUNT(REPA_ARTICULO) FROM REPORTES_AUX WHERE REPA_ID = 3 AND REPA_USER = USER AND REPA_ARTICULO = :articulo INTO :numrows;
                if (numrows = 0) then
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        END
    if (BIN_AND(TIPO, 16) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 35 INTO :NOMTIPO;
        /* BORRA LA TABLA AUXILIAR */
        DELETE FROM reportes_aux WHERE REPA_ID = 3 AND REPA_USER = USER;

        FOR SELECT MAX(T.TERC_NIT), MAX(TERC_NOM), MAX(TERC_TEL), MAX(TERC_CIU), MAX(ZONA_COD), MAX(ARTI_COD), SUM(CTDE_CANT * CTDE_FACTOR), SUM(COTI_FACTOR*(CTDE_TOTAL-CTDE_IVAMONTO-CTDE_CONSUMO)),
            SUM(COTI_FACTOR*CTDE_IVAMONTO), SUM(COTI_FACTOR*CTDE_TOTAL)
            FROM COTIZACIONES_DETALLE D, COTIZACIONES CT, PREFIJOS P, terceros T, CLIENTES C
            WHERE C.TERC_NIT = T.TERC_NIT AND TERC_CLIE = 'S' AND C.terc_nit = T.terc_nit AND T.TERC_NIT >= :TERINI AND T.TERC_NIT <= :TERFIN AND
            CT.COTI_ID = D.COTI_ID AND COTI_FECHA >= :FECINI AND COTI_FECHA <= :FECFIN AND COTI_ANULADO = 'N'
            AND P.PREF_PRE = CT.PREF_PRE AND P.TIDO_COD = 35 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY T.TERC_NIT, ARTI_COD
            INTO :NIT, :NOMBRE, :TELEFONO, :CIUDAD, :CODZONA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :TOTAL
            DO
            BEGIN
            SELECT ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                FROM ARTICULO WHERE ARTI_COD = :ARTICULO
                INTO :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC;
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            EXECUTE PROCEDURE costo_promedio (:ARTICULO, :FECFIN) RETURNING_VALUES (:COSTOUNIT);
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            COSTO = CANTIDAD * COSTOUNIT;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            if (CEROS = 'S') then
                INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (3, USER, :ARTICULO);
            SUSPEND;
            END /* FOR */
        if (CEROS = 'S') then
            BEGIN
            COSTO = 0;
            UTILIDAD = 0;
            PORC = 0;
            /* agregue los articulos sin factura */
            FOR SELECT ARTI_COD, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN
                INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                DO
                BEGIN
                SELECT COUNT(REPA_ARTICULO) FROM REPORTES_AUX WHERE REPA_ID = 3 AND REPA_USER = USER AND REPA_ARTICULO = :articulo INTO :numrows;
                if (numrows = 0) then
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        END
    END
ELSE
    BEGIN
    if (BIN_AND(TIPO, 1) <> 0) then
            BEGIN
            SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 31 INTO :NOMTIPO;
            FOR SELECT F.PREF_PRE, FACT_NUMERO, FACT_FECHA, ARTI_COD, FADE_CANT * FADE_FACTOR, (FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO)*FACT_FACTOR,
                FADE_IVAMONTO*FACT_FACTOR, FADE_DTOPORC, FADE_TOTAL*FACT_FACTOR, F.terc_nit, F.fact_nomcliente
                FROM FACTURAS F, FACTURAS_DETALLE D, PREFIJOS P
                WHERE F.FACT_ID = D.FACT_ID AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND F.TERC_NIT >= :TERINI AND F.TERC_NIT <= :TERFIN AND FACT_ANULADO = 'N'
                 AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) and substring(D.arti_cod from 1 FOR 2) <> '.t'
                ORDER BY f.terc_nit, ARTI_COD, FACT_FECHA, F.FACT_ID, FADE_ITEM
                INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :DTO, :TOTAL, :NIT, :nombre
                DO
                BEGIN
                SELECT ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO WHERE ARTI_COD = :ARTICULO
                    INTO :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC;
                SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                EXECUTE PROCEDURE costo_promedio (:ARTICULO, :FECHA) RETURNING_VALUES (:COSTOUNIT);
                COSTO = COSTOUNIT * CANTIDAD;
                UTILIDAD = BASE - COSTO;
                if (UOM = 'UTILIDAD') then
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                else
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
                SUSPEND;
                END
            END
    if (BIN_AND(TIPO, 2) <> 0) then
            BEGIN
            SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 32 INTO :NOMTIPO;
            FOR SELECT R.PREF_PRE, REVT_NUMERO, REVT_FECHA, ARTI_COD, RVDE_CANT * RVDE_FACTOR,
                (RVDE_TOTAL - RVDE_IVAMONTO), RVDE_IVAMONTO, RVDE_DTOPORC, RVDE_TOTAL, R.terc_nit, R.revt_nomterc
                FROM REMISIONES_VENTA R, REMISIONES_VENTA_DETALLE D, PREFIJOS P
                WHERE R.REVT_ID = D.REVT_ID AND REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN AND R.TERC_NIT >= :TERINI AND R.TERC_NIT <= :TERFIN AND REVT_ANULADO = 'N'
                 AND P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = 32 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                ORDER BY r.terc_nit, ARTI_COD, REVT_FECHA, R.REVT_ID, RVDE_ITEM
                INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :DTO, :TOTAL, :NIT, :nombre
                DO
                BEGIN
                SELECT ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO WHERE ARTI_COD = :ARTICULO
                    INTO :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC;
                SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                EXECUTE PROCEDURE costo_promedio (:ARTICULO, :FECHA) RETURNING_VALUES (:COSTOUNIT);
                COSTO = COSTOUNIT * CANTIDAD;
                UTILIDAD = BASE - COSTO;
                if (UOM = 'UTILIDAD') then
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                else
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
                SUSPEND;
                END
            END
    if (BIN_AND(TIPO, 4) <> 0) then
            BEGIN
            SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 33 INTO :NOMTIPO;
            FOR SELECT V.PREF_PRE, DEVT_NUMERO, DEVT_FECHA, ARTI_COD, DVDE_CANT * DVDE_FACTOR, (DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO)*DEVT_FACTOR,
                DVDE_IVAMONTO*DEVT_FACTOR, DVDE_DTOPORC, DVDE_TOTAL*DEVT_FACTOR, V.terc_nit, V.devt_nomterc
                FROM DEVOLUCIONES_VENTAS V, DEVOLUCIONES_VENTAS_DETALLE D, PREFIJOS P
                WHERE V.DEVT_ID = D.DEVT_ID AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND V.TERC_NIT >= :TERINI AND V.TERC_NIT <= :TERFIN AND DEVT_ANULADO = 'N'
                 AND P.PREF_PRE = V.PREF_PRE AND P.TIDO_COD = 33 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))  and substring(D.arti_cod from 1 FOR 2) <> '.t'
                ORDER BY v.terc_nit, ARTI_COD, DEVT_FECHA, D.DEVT_ID, DVDE_ITEM
                INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :DTO, :TOTAL, :NIT, :nombre
                DO
                BEGIN
                SELECT ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO WHERE ARTI_COD = :ARTICULO
                    INTO :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC;
                SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                EXECUTE PROCEDURE costo_promedio (:ARTICULO, :FECHA) RETURNING_VALUES (:COSTOUNIT);
                COSTO = COSTOUNIT * CANTIDAD;
                UTILIDAD = BASE - COSTO;
                if (UOM = 'UTILIDAD') then
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                else
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
                TOTAL = TOTAL * -1;
                IVA = IVA * -1;
                BASE = BASE * -1;
                CANTIDAD = CANTIDAD * -1;
                COSTO = COSTO * -1;
                UTILIDAD = UTILIDAD * -1;
                SUSPEND;
                END
            END
    if (BIN_AND(TIPO, 8) <> 0) then
            BEGIN
            SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 34 INTO :NOMTIPO;
            FOR SELECT P.PREF_PRE, PEDI_NUMERO, PEDI_FECHA, ARTI_COD, PEDE_CANT * PEDE_FACTOR, (PEDE_TOTAL-PEDE_IVAMONTO-PEDE_CONSUMO)*PEDI_FACTOR,
                PEDE_IVAMONTO*PEDI_FACTOR, PEDE_DTOPORC, PEDE_TOTAL*PEDI_FACTOR, P.terc_nit, P.pedi_nomterc
                FROM PEDIDOS P, PEDIDOS_DETALLE D, PREFIJOS PR
                WHERE P.PEDI_ID = D.PEDI_ID AND PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND P.TERC_NIT >= :TERINI AND P.TERC_NIT <= :TERFIN AND PEDI_ANULADO = 'N'
                 AND P.PREF_PRE = PR.PREF_PRE AND P.TIDO_COD = 34 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                ORDER BY p.terc_nit, ARTI_COD, PEDI_FECHA, P.PEDI_ID, PEDE_ITEM
                INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :DTO, :TOTAL, :NIT, :nombre
                DO
                BEGIN
                SELECT ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO WHERE ARTI_COD = :ARTICULO
                    INTO :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC;
                SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                EXECUTE PROCEDURE costo_promedio (:ARTICULO, :FECHA) RETURNING_VALUES (:COSTOUNIT);
                COSTO = COSTOUNIT * CANTIDAD;
                UTILIDAD = BASE - COSTO;
                if (UOM = 'UTILIDAD') then
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                else
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
                SUSPEND;
                END
            END
    if (BIN_AND(TIPO, 16) <> 0) then
            BEGIN
            SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 35 INTO :NOMTIPO;
            FOR SELECT C.PREF_PRE, COTI_NUMERO, COTI_FECHA, ARTI_COD, CTDE_CANT * CTDE_FACTOR, (CTDE_TOTAL-CTDE_IVAMONTO-CTDE_CONSUMO)*COTI_FACTOR,
                CTDE_IVAMONTO*COTI_FACTOR, CTDE_DTOPORC, CTDE_TOTAL*COTI_FACTOR, C.terc_nit, C.coti_nomterc
                FROM COTIZACIONES C, COTIZACIONES_DETALLE D, PREFIJOS P
                WHERE C.COTI_ID = D.COTI_ID AND ARTI_COD = :ARTICULO AND COTI_FECHA >= :FECINI AND COTI_FECHA <= :FECFIN AND C.TERC_NIT >= :TERINI AND C.TERC_NIT <= :TERFIN AND COTI_ANULADO = 'N'
                 AND P.PREF_PRE = C.PREF_PRE AND P.TIDO_COD = 35 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                ORDER BY c.terc_nit, COTI_FECHA, C.COTI_ID, CTDE_ITEM
                INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :DTO, :TOTAL, :NIT, :nombre
                DO
                BEGIN
                SELECT ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO WHERE ARTI_COD = :ARTICULO
                    INTO :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC;
                SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                EXECUTE PROCEDURE costo_promedio (:ARTICULO, :FECHA) RETURNING_VALUES (:COSTOUNIT);
                COSTO = COSTOUNIT * CANTIDAD;
                UTILIDAD = BASE - COSTO;
                if (UOM = 'UTILIDAD') then
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                else
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
                SUSPEND;
                END
            END
    END
END

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE REP_UTILIDAD_VENDEDOR(
    TIPO INTEGER,
    DETALLE CHAR(1),
    VENINI VARCHAR(20),
    VENFIN VARCHAR(20),
    FECINI DATE,
    FECFIN DATE,
    ARTINI VARCHAR(15),
    ARTFIN VARCHAR(15),
    ORDEN CHAR(1),
    CEROS CHAR(1),
    SUBEMPRESA INTEGER)
RETURNS (
    CODVEND VARCHAR(20),
    NOMVEND VARCHAR(60),
    NOMTIPO VARCHAR(50),
    ARTICULO VARCHAR(15),
    DESCRIPCION VARCHAR(60),
    CODGRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    CODSUBG VARCHAR(3),
    NOMSUBG VARCHAR(30),
    CODMARC VARCHAR(3),
    NOMMARC VARCHAR(30),
    UNIDAD VARCHAR(8),
    CANTIDAD NUMERIC(18,4),
    BASE NUMERIC(18,2),
    IVA NUMERIC(18,2),
    CONSUMO NUMERIC(18,2),
    COSTO NUMERIC(18,2),
    UTILIDAD NUMERIC(18,4),
    PORC NUMERIC(9,2),
    TOTAL NUMERIC(18,2),
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    DTO NUMERIC(9,2))
AS
DECLARE VARIABLE COSTOUNIT NUMERIC(18,4);
DECLARE VARIABLE CODINI VARCHAR(15);
DECLARE VARIABLE CODFIN VARCHAR(15);
DECLARE VARIABLE DESINI VARCHAR(15);
DECLARE VARIABLE DESFIN VARCHAR(15);
declare variable UOM VARCHAR(20);
BEGIN
if (ORDEN = 'C') then
    BEGIN
    CODINI = ARTINI;
    CODFIN = ARTFIN;
    DESINI = '';
    DESFIN = 'zz';
    END
ELSE
    BEGIN
    DESINI = ARTINI;
    DESFIN = ARTFIN;
    CODINI = '';
    CODFIN = 'zz';
    END
  EXECUTE PROCEDURE lee_configuracion ('FACTURACION', 'ARTICULOS', 'SUGERIR PRECIOS CON PORCENTAJE DE MARGEN O UTILIDAD') returning_values (:UOM);
  SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = :TIPO INTO :NOMTIPO;
  FOR select VEND_COD, VEND_NOMBRE
    from VENDEDORES
    where VEND_COD >= :VENINI AND VEND_COD <= :VENFIN
    INTO :CODVEND, :NOMVEND
    DO  
    BEGIN
    if (DETALLE = 'N') then
        BEGIN
        if (BIN_AND(TIPO, 1) <> 0) then
            BEGIN
            SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 31 INTO :NOMTIPO;
            /* BORRA LA TABLA AUXILIAR */
            DELETE FROM reportes_aux WHERE REPA_ID = 4 AND REPA_USER = USER;
            FOR SELECT MAX(D.ARTI_COD), SUM(FADE_CANT * FADE_FACTOR), SUM(FACT_FACTOR*(FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO)),
                SUM(FACT_FACTOR*FADE_IVAMONTO), SUM(FACT_FACTOR*FADE_TOTAL), SUM(FADE_CONSUMO),
                MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD), SUM(COST_SALP)
                FROM FACTURAS_DETALLE D, FACTURAS F, PREFIJOS P, ARTICULO A, movimiento_articulo m, costos c
                WHERE F.FACT_ID = D.FACT_ID AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND VEND_COD = :CODVEND AND FACT_ANULADO = 'N'
                 AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) and substring(D.arti_cod from 1 FOR 2) <> '.t'
                 AND D.ARTI_COD = A.arti_cod AND A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN
                 AND F.fact_id = M.mvar_idref AND M.mvar_tipodoc = 31 AND M.mvar_item = D.fade_item AND M.mvar_cons = C.cost_idmov
                GROUP BY D.ARTI_COD
                INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :TOTAL, :CONSUMO,
                    :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :COSTO
                DO
                BEGIN
                SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                if (CANTIDAD IS NULL) then
                    CANTIDAD = 0;
                if (BASE IS NULL) then
                    BASE = 0;
                if (IVA IS NULL) then
                    IVA = 0;
                UTILIDAD = BASE - COSTO;
                if (UOM = 'UTILIDAD') then
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                else
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
                if (CEROS = 'S') then
                    begin
                    INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (4, USER, :ARTICULO);
                    SUSPEND;
                    end
                ELSE
                    if ((BASE <> 0) AND (CANTIDAD <> 0)) then
                        SUSPEND;
                END
            if (CEROS = 'S') then
                BEGIN
                COSTO = 0;
                UTILIDAD = 0;
                PORC = 0;
                /* agregue los articulos sin factura */
                FOR SELECT ARTI_COD, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN and
                    not exists (select REPA_ARTICULO FROM REPORTES_AUX WHERE REPA_ID = 4 AND REPA_USER = USER AND REPA_ARTICULO = a.arti_cod)
                    INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                    DO
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        if (BIN_AND(TIPO, 2) <> 0) then
            BEGIN
            SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 32 INTO :NOMTIPO;
            FOR SELECT MAX(D.ARTI_COD), SUM(RVDE_CANT * RVDE_FACTOR), SUM(RVDE_TOTAL-RVDE_IVAMONTO-RVDE_CONSUMO), SUM(RVDE_IVAMONTO), SUM(RVDE_TOTAL), SUM(RVDE_CONSUMO),
                MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD), SUM(COST_SALP)
                FROM REMISIONES_VENTA_DETALLE D, REMISIONES_VENTA R, PREFIJOS P, ARTICULO A, movimiento_articulo m, costos c
                WHERE R.REVT_ID = D.REVT_ID AND REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN AND VEND_COD = :CODVEND AND REVT_ANULADO = 'N'
                 AND P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = 32 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                 AND D.ARTI_COD = A.arti_cod AND A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN
                 AND r.revt_id = M.mvar_idref AND M.mvar_tipodoc = 32 AND M.mvar_item = D.rvde_item AND M.mvar_cons = C.cost_idmov
                GROUP BY D.ARTI_COD
                INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :TOTAL, :CONSUMO,
                    :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :COSTO
                DO
                BEGIN
                SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                if (CANTIDAD IS NULL) then
                    CANTIDAD = 0;
                if (BASE IS NULL) then
                    BASE = 0;
                if (IVA IS NULL) then
                    IVA = 0;
                UTILIDAD = BASE - COSTO;
                if (UOM = 'UTILIDAD') then
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                else
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
                if (CEROS = 'S') then
                    begin
                    INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (4, USER, :ARTICULO);
                    SUSPEND;
                    end
                ELSE
                    if ((BASE <> 0) AND (CANTIDAD <> 0)) then
                        SUSPEND;
                END
            if (CEROS = 'S') then
                BEGIN
                COSTO = 0;
                UTILIDAD = 0;
                PORC = 0;
                /* agregue los articulos sin factura */
                FOR SELECT ARTI_COD, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN and
                    not exists (select REPA_ARTICULO FROM REPORTES_AUX WHERE REPA_ID = 4 AND REPA_USER = USER AND REPA_ARTICULO = a.arti_cod)
                    INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                    DO
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        if (BIN_AND(TIPO, 4) <> 0) then
            BEGIN
            SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 33 INTO :NOMTIPO;
            FOR SELECT MAX(D.ARTI_COD), SUM(DVDE_CANT * DVDE_FACTOR), SUM(DEVT_FACTOR*(DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO)),
                SUM(DEVT_FACTOR*DVDE_IVAMONTO), SUM(DEVT_FACTOR*DVDE_TOTAL), SUM(DVDE_CONSUMO),
                MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD), SUM(COST_ENTP)
                FROM devoluciones_ventas_detalle D, DEVOLUCIONES_VENTAS V, PREFIJOS P, ARTICULO A, MOVIMIENTO_ARTICULO M, COSTOS C
                WHERE V.DEVT_ID = D.DEVT_ID AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND VEND_COD = :CODVEND AND DEVT_ANULADO = 'N'
                 AND P.PREF_PRE = V.PREF_PRE AND P.TIDO_COD = 33 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) and substring(D.arti_cod from 1 FOR 2) <> '.t'
                 AND D.ARTI_COD = A.arti_cod AND A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN
                 AND V.devt_id = M.mvar_idref AND M.mvar_tipodoc = 33 AND M.mvar_item = D.dvde_item AND M.mvar_cons = C.cost_idmov
                GROUP BY D.ARTI_COD
                INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :TOTAL, :CONSUMO,
                    :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :COSTO
                DO
                BEGIN
                SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                if (CANTIDAD IS NULL) then
                    CANTIDAD = 0;
                if (BASE IS NULL) then
                    BASE = 0;
                if (IVA IS NULL) then
                    IVA = 0;
                UTILIDAD = BASE - COSTO;
                if (UOM = 'UTILIDAD') then
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                else
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
                TOTAL = TOTAL * -1;
                IVA = IVA * -1;
                BASE = BASE * -1;
                CANTIDAD = CANTIDAD * -1;
                COSTO = COSTO * -1;
                UTILIDAD = UTILIDAD * -1;
                if (CEROS = 'S') then
                    begin
                    INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (4, USER, :ARTICULO);
                    SUSPEND;
                    end
                ELSE
                    if ((BASE <> 0) AND (CANTIDAD <> 0)) then
                        SUSPEND;
                END
            if (CEROS = 'S') then
                BEGIN
                COSTO = 0;
                UTILIDAD = 0;
                PORC = 0;
                /* agregue los articulos sin factura */
                FOR SELECT ARTI_COD, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN and
                    not exists (select REPA_ARTICULO FROM REPORTES_AUX WHERE REPA_ID = 4 AND REPA_USER = USER AND REPA_ARTICULO = a.arti_cod)
                    INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                    DO
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        if (BIN_AND(TIPO, 8) <> 0) then
            BEGIN
            SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 34 INTO :NOMTIPO;
            FOR SELECT MAX(ARTI_COD), SUM(PEDE_CANT * PEDE_FACTOR), SUM(PEDI_FACTOR*(PEDE_TOTAL-PEDE_IVAMONTO-PEDE_CONSUMO)),
                SUM(PEDI_FACTOR*PEDE_IVAMONTO), SUM(PEDI_FACTOR*PEDE_TOTAL), SUM(PEDE_CONSUMO)
                FROM PEDIDOS_DETALLE D, PEDIDOS P, PREFIJOS PR
                WHERE P.PEDI_ID = D.PEDI_ID AND PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND VEND_COD = :CODVEND AND PEDI_ANULADO = 'N'
                 AND PR.PREF_PRE = P.PREF_PRE AND P.TIDO_COD = 34 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                GROUP BY ARTI_COD
                INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :TOTAL, :CONSUMO
                DO
                BEGIN
                SELECT ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO WHERE ARTI_COD = :ARTICULO
                    INTO :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC;
                SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                EXECUTE PROCEDURE costo_promedio (:ARTICULO, :FECFIN) RETURNING_VALUES (:COSTOUNIT);
                if (CANTIDAD IS NULL) then
                    CANTIDAD = 0;
                if (BASE IS NULL) then
                    BASE = 0;
                if (IVA IS NULL) then
                    IVA = 0;
                COSTO = CANTIDAD * COSTOUNIT;
                UTILIDAD = BASE - COSTO;
                if (UOM = 'UTILIDAD') then
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                else
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
                if (CEROS = 'S') then
                    begin
                    INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (4, USER, :ARTICULO);
                    SUSPEND;
                    end
                ELSE
                    if ((BASE <> 0) AND (CANTIDAD <> 0)) then
                        SUSPEND;
                END
            if (CEROS = 'S') then
                BEGIN
                COSTO = 0;
                UTILIDAD = 0;
                PORC = 0;
                /* agregue los articulos sin factura */
                FOR SELECT ARTI_COD, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN and
                    not exists (select REPA_ARTICULO FROM REPORTES_AUX WHERE REPA_ID = 4 AND REPA_USER = USER AND REPA_ARTICULO = a.arti_cod)
                    INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                    DO
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        if (BIN_AND(TIPO, 16) <> 0) then
            BEGIN
            SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 35 INTO :NOMTIPO;
            FOR SELECT MAX(ARTI_COD), SUM(CTDE_CANT * CTDE_FACTOR), SUM(COTI_FACTOR*(CTDE_TOTAL-CTDE_IVAMONTO-CTDE_CONSUMO)),
                SUM(COTI_FACTOR*CTDE_IVAMONTO), SUM(COTI_FACTOR*CTDE_TOTAL), SUM(CTDE_CONSUMO)
                FROM COTIZACIONES_DETALLE D, COTIZACIONES C, PREFIJOS P
                WHERE C.COTI_ID = D.COTI_ID AND COTI_FECHA >= :FECINI AND COTI_FECHA <= :FECFIN AND VEND_COD = :CODVEND AND COTI_ANULADO = 'N'
                 AND P.PREF_PRE = C.PREF_PRE AND P.TIDO_COD = 35 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                GROUP BY ARTI_COD
                INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :TOTAL, :CONSUMO
                DO
                BEGIN
                SELECT ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO WHERE ARTI_COD = :ARTICULO
                    INTO :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC;
                SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                EXECUTE PROCEDURE costo_promedio (:ARTICULO, :FECFIN) RETURNING_VALUES (:COSTOUNIT);
                if (CANTIDAD IS NULL) then
                    CANTIDAD = 0;
                if (BASE IS NULL) then
                    BASE = 0;
                if (IVA IS NULL) then
                    IVA = 0;
                COSTO = CANTIDAD * COSTOUNIT;
                UTILIDAD = BASE - COSTO;
                if (UOM = 'UTILIDAD') then
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                else
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
                if (CEROS = 'S') then
                    begin
                    INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (4, USER, :ARTICULO);
                    SUSPEND;
                    end
                ELSE
                    if ((BASE <> 0) AND (CANTIDAD <> 0)) then
                        SUSPEND;
                END
            if (CEROS = 'S') then
                BEGIN
                COSTO = 0;
                UTILIDAD = 0;
                PORC = 0;
                /* agregue los articulos sin factura */
                FOR SELECT ARTI_COD, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN and
                    not exists (select REPA_ARTICULO FROM REPORTES_AUX WHERE REPA_ID = 4 AND REPA_USER = USER AND REPA_ARTICULO = a.arti_cod)
                    INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                    DO
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        END
    ELSE
        BEGIN
        if (BIN_AND(TIPO, 1) <> 0) then
            BEGIN
            SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 31 INTO :NOMTIPO;
            FOR SELECT F.PREF_PRE, FACT_NUMERO, FACT_FECHA, ARTI_COD, FADE_CANT * FADE_FACTOR, (FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO)*FACT_FACTOR,
                FADE_IVAMONTO*FACT_FACTOR, FADE_DTOPORC, FADE_TOTAL*FACT_FACTOR, FADE_CONSUMO
                FROM FACTURAS F, FACTURAS_DETALLE D, PREFIJOS P
                WHERE F.FACT_ID = D.FACT_ID AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND VEND_COD = :CODVEND AND FACT_ANULADO = 'N'
                 AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) and substring(D.arti_cod from 1 FOR 2) <> '.t'
                ORDER BY ARTI_COD, FACT_FECHA, F.FACT_ID, FADE_ITEM
                INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :DTO, :TOTAL, :CONSUMO
                DO
                BEGIN
                SELECT ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO WHERE ARTI_COD = :ARTICULO
                    INTO :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC;
                SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                EXECUTE PROCEDURE costo_promedio (:ARTICULO, :FECHA) RETURNING_VALUES (:COSTOUNIT);
                COSTO = COSTOUNIT * CANTIDAD;
                UTILIDAD = BASE - COSTO;
                if (UOM = 'UTILIDAD') then
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                else
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
                if (CEROS = 'S') then
                    INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (4, USER, :ARTICULO);
                SUSPEND;
                END
            if (CEROS = 'S') then
                BEGIN
                COSTO = 0;
                UTILIDAD = 0;
                PORC = 0;
                /* agregue los articulos sin factura */
                FOR SELECT ARTI_COD, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN and
                    not exists (select REPA_ARTICULO FROM REPORTES_AUX WHERE REPA_ID = 4 AND REPA_USER = USER AND REPA_ARTICULO = a.arti_cod)
                    INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                    DO
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        if (BIN_AND(TIPO, 2) <> 0) then
            BEGIN
            SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 32 INTO :NOMTIPO;
            FOR SELECT R.PREF_PRE, REVT_NUMERO, REVT_FECHA, ARTI_COD, RVDE_CANT * RVDE_FACTOR, (RVDE_TOTAL - RVDE_IVAMONTO), RVDE_IVAMONTO, RVDE_DTOPORC, RVDE_TOTAL, RVDE_CONSUMO
                FROM REMISIONES_VENTA R, REMISIONES_VENTA_DETALLE D, PREFIJOS P
                WHERE R.REVT_ID = D.REVT_ID AND REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN AND VEND_COD = :CODVEND AND REVT_ANULADO = 'N'
                 AND P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = 32 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) and substring(D.arti_cod from 1 FOR 2) <> '.t'
                ORDER BY ARTI_COD, REVT_FECHA, R.REVT_ID, RVDE_ITEM
                INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :DTO, :TOTAL, :CONSUMO
                DO
                BEGIN
                SELECT ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO WHERE ARTI_COD = :ARTICULO
                    INTO :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC;
                SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                EXECUTE PROCEDURE costo_promedio (:ARTICULO, :FECHA) RETURNING_VALUES (:COSTOUNIT);
                COSTO = COSTOUNIT * CANTIDAD;
                UTILIDAD = BASE - COSTO;
                if (UOM = 'UTILIDAD') then
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                else
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
                if (CEROS = 'S') then
                    INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (4, USER, :ARTICULO);
                SUSPEND;
                END
            if (CEROS = 'S') then
                BEGIN
                COSTO = 0;
                UTILIDAD = 0;
                PORC = 0;
                /* agregue los articulos sin factura */
                FOR SELECT ARTI_COD, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN and
                    not exists (select REPA_ARTICULO FROM REPORTES_AUX WHERE REPA_ID = 4 AND REPA_USER = USER AND REPA_ARTICULO = a.arti_cod)
                    INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                    DO
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        if (BIN_AND(TIPO, 4) <> 0) then
            BEGIN
            SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 33 INTO :NOMTIPO;
            FOR SELECT V.PREF_PRE, DEVT_NUMERO, DEVT_FECHA, ARTI_COD, DVDE_CANT * DVDE_FACTOR, (DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO)*DEVT_FACTOR,
                DVDE_IVAMONTO*DEVT_FACTOR, DVDE_DTOPORC, DVDE_TOTAL*DEVT_FACTOR, DVDE_CONSUMO
                FROM DEVOLUCIONES_VENTAS V, DEVOLUCIONES_VENTAS_DETALLE D, PREFIJOS P
                WHERE V.DEVT_ID = D.DEVT_ID AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND VEND_COD = :CODVEND AND DEVT_ANULADO = 'N'
                 AND P.PREF_PRE = V.PREF_PRE AND P.TIDO_COD = 33 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) and substring(D.arti_cod from 1 FOR 2) <> '.t'
                ORDER BY ARTI_COD, DEVT_FECHA, D.DEVT_ID, DVDE_ITEM
                INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :DTO, :TOTAL, :CONSUMO
                DO
                BEGIN
                SELECT ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO WHERE ARTI_COD = :ARTICULO
                    INTO :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC;
                SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                EXECUTE PROCEDURE costo_promedio (:ARTICULO, :FECHA) RETURNING_VALUES (:COSTOUNIT);
                COSTO = COSTOUNIT * CANTIDAD;
                UTILIDAD = BASE - COSTO;
                if (UOM = 'UTILIDAD') then
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                else
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
                TOTAL = TOTAL * -1;
                IVA = IVA * -1;
                BASE = BASE * -1;
                CANTIDAD = CANTIDAD * -1;
                COSTO = COSTO * -1;
                UTILIDAD = UTILIDAD * -1;
                if (CEROS = 'S') then
                    INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (4, USER, :ARTICULO);
                SUSPEND;
                END
            if (CEROS = 'S') then
                BEGIN
                COSTO = 0;
                UTILIDAD = 0;
                PORC = 0;
                /* agregue los articulos sin factura */
                FOR SELECT ARTI_COD, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN and
                    not exists (select REPA_ARTICULO FROM REPORTES_AUX WHERE REPA_ID = 4 AND REPA_USER = USER AND REPA_ARTICULO = a.arti_cod)
                    INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                    DO
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        if (BIN_AND(TIPO, 8) <> 0) then
            BEGIN
            SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 34 INTO :NOMTIPO;
            FOR SELECT P.PREF_PRE, PEDI_NUMERO, PEDI_FECHA, ARTI_COD, PEDE_CANT * PEDE_FACTOR, (PEDE_TOTAL-PEDE_IVAMONTO-PEDE_CONSUMO)*PEDI_FACTOR,
                PEDE_IVAMONTO*PEDI_FACTOR, PEDE_DTOPORC, PEDE_TOTAL*PEDI_FACTOR, PEDE_CONSUMO
                FROM PEDIDOS P, PEDIDOS_DETALLE D, PREFIJOS PR
                WHERE P.PEDI_ID = D.PEDI_ID AND PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND VEND_COD = :CODVEND AND PEDI_ANULADO = 'N'
                 AND P.PREF_PRE = PR.PREF_PRE AND P.TIDO_COD = 34 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                ORDER BY ARTI_COD, PEDI_FECHA, P.PEDI_ID, PEDE_ITEM
                INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :DTO, :TOTAL, :CONSUMO
                DO
                BEGIN
                SELECT ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO WHERE ARTI_COD = :ARTICULO
                    INTO :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC;
                SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                EXECUTE PROCEDURE costo_promedio (:ARTICULO, :FECHA) RETURNING_VALUES (:COSTOUNIT);
                COSTO = COSTOUNIT * CANTIDAD;
                UTILIDAD = BASE - COSTO;
                if (UOM = 'UTILIDAD') then
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                else
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
                if (CEROS = 'S') then
                    INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (4, USER, :ARTICULO);
                SUSPEND;
                END
            if (CEROS = 'S') then
                BEGIN
                COSTO = 0;
                UTILIDAD = 0;
                PORC = 0;
                /* agregue los articulos sin factura */
                FOR SELECT ARTI_COD, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN and
                    not exists (select REPA_ARTICULO FROM REPORTES_AUX WHERE REPA_ID = 4 AND REPA_USER = USER AND REPA_ARTICULO = a.arti_cod)
                    INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                    DO
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        if (BIN_AND(TIPO, 16) <> 0) then
            BEGIN
            SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 35 INTO :NOMTIPO;
            FOR SELECT C.PREF_PRE, COTI_NUMERO, COTI_FECHA, ARTI_COD, CTDE_CANT * CTDE_FACTOR, (CTDE_TOTAL-CTDE_IVAMONTO-CTDE_CONSUMO)*COTI_FACTOR,
                CTDE_IVAMONTO*COTI_FACTOR, CTDE_DTOPORC, CTDE_TOTAL*COTI_FACTOR, CTDE_CONSUMO
                FROM COTIZACIONES C, COTIZACIONES_DETALLE D, PREFIJOS P
                WHERE C.COTI_ID = D.COTI_ID AND ARTI_COD = :ARTICULO AND COTI_FECHA >= :FECINI AND COTI_FECHA <= :FECFIN AND VEND_COD = :CODVEND AND COTI_ANULADO = 'N'
                 AND P.PREF_PRE = C.PREF_PRE AND P.TIDO_COD = 35 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                ORDER BY COTI_FECHA, C.COTI_ID, CTDE_ITEM
                INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :DTO, :TOTAL, :CONSUMO
                DO
                BEGIN
                SELECT ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO WHERE ARTI_COD = :ARTICULO
                    INTO :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC;
                SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                EXECUTE PROCEDURE costo_promedio (:ARTICULO, :FECHA) RETURNING_VALUES (:COSTOUNIT);
                COSTO = COSTOUNIT * CANTIDAD;
                UTILIDAD = BASE - COSTO;
                if (UOM = 'UTILIDAD') then
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                else
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
                if (CEROS = 'S') then
                    INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (4, USER, :ARTICULO);
                SUSPEND;
                END
            if (CEROS = 'S') then
                BEGIN
                COSTO = 0;
                UTILIDAD = 0;
                PORC = 0;
                /* agregue los articulos sin factura */
                FOR SELECT ARTI_COD, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN and
                    not exists (select REPA_ARTICULO FROM REPORTES_AUX WHERE REPA_ID = 4 AND REPA_USER = USER AND REPA_ARTICULO = a.arti_cod)
                    INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                    DO
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        END
    END
END

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE REP_UTILIDAD_VENTAS(
    TIPO INTEGER,
    DETALLE CHAR(1),
    FECINI DATE,
    FECFIN DATE,
    ARTINI VARCHAR(15),
    ARTFIN VARCHAR(15),
    GRPINI VARCHAR(3),
    GRPFIN VARCHAR(3),
    ORDEN CHAR(1),
    AGRUPA CHAR(1),
    CEROS CHAR(1),
    SUBEMPRESA INTEGER)
RETURNS (
    ARTICULO VARCHAR(15),
    DESCRIPCION VARCHAR(60),
    CODGRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    CODSUBG VARCHAR(3),
    NOMSUBG VARCHAR(30),
    CODMARC VARCHAR(3),
    NOMMARC VARCHAR(30),
    UNIDAD VARCHAR(8),
    CANTIDAD NUMERIC(18,4),
    BASE NUMERIC(18,4),
    COSTO NUMERIC(18,4),
    UTILIDAD NUMERIC(18,4),
    PORC NUMERIC(9,2),
    IVA NUMERIC(18,4),
    CONSUMO NUMERIC(18,4),
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    TIPODOC INTEGER)
AS
DECLARE VARIABLE COSTOUNIT NUMERIC(18,4);
declare variable CODINI VARCHAR(15);
declare variable CODFIN VARCHAR(15);
declare variable DESINI VARCHAR(15);
declare variable DESFIN VARCHAR(15);
declare variable MARINI VARCHAR(3);
declare variable MARFIN VARCHAR(3);
declare variable UOM VARCHAR(20);
declare variable NUMROWS INTEGER;
BEGIN
if (ORDEN = 'C') then
    BEGIN
    CODINI = ARTINI;
    CODFIN = ARTFIN;
    DESINI = '';
    DESFIN = 'zz';
    END
ELSE
    BEGIN
    DESINI = ARTINI;
    DESFIN = ARTFIN;
    CODINI = '';
    CODFIN = 'zz';
    END
if (AGRUPA = 'G') then
    BEGIN
    MARINI = '';
    MARFIN = 'zz';
    END
ELSE
    if (AGRUPA = 'M') then
        BEGIN
        MARINI = GRPINI;
        MARFIN = GRPFIN;
        GRPINI = '';
        GRPFIN = 'zz';
        END
    ELSE
        BEGIN
        MARINI = '';
        MARFIN = 'zz';
        GRPINI = '';
        GRPFIN = 'zz';
        END
EXECUTE PROCEDURE lee_configuracion ('FACTURACION', 'ARTICULOS', 'SUGERIR PRECIOS CON PORCENTAJE DE MARGEN O UTILIDAD') returning_values (:UOM);
if (DETALLE = 'N') then
    BEGIN
    if (BIN_AND(TIPO, 1) <> 0) then
        BEGIN
        TIPODOC = 31;
        /* BORRA LA TABLA AUXILIAR */
        DELETE FROM reportes_aux WHERE REPA_ID = 2 AND REPA_USER = USER;

        FOR SELECT MAX(D.ARTI_COD), SUM(FADE_CANT * FADE_FACTOR), SUM((FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO)*FACT_FACTOR), SUM(FADE_IVAMONTO*FACT_FACTOR), SUM(FADE_CONSUMO),
            MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD), SUM(COST_SALP)
            FROM FACTURAS_DETALLE D, FACTURAS F, PREFIJOS P, ARTICULO A, movimiento_articulo m, costos c
            WHERE F.FACT_ID = D.FACT_ID AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND D.ARTI_COD = A.arti_cod AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            F.fact_id = M.mvar_idref AND M.mvar_tipodoc = 31 AND M.mvar_item = D.fade_item AND M.mvar_cons = C.cost_idmov AND
            FACT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) and substring(a.arti_cod from 1 FOR 2) <> '.t'
            GROUP BY D.ARTI_COD
            INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,
            :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :COSTO
            DO
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
/*            EXECUTE PROCEDURE costo_promedio (:ARTICULO, :FECFIN) RETURNING_VALUES (:COSTOUNIT);*/
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
/*            COSTO = cantidad * COSTOUNIT;*/
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                if (COSTO > 0) then
                    PORC = UTILIDAD * 100 / COSTO;
                ELSE
                    PORC = 100;
            else
                if (BASE > 0) then
                    PORC = UTILIDAD * 100 / BASE;
                ELSE
                    PORC = 0;
            if (CEROS = 'S') then
                INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (2, USER, :ARTICULO);
            SUSPEND;
            END /* FOR */
        if (CEROS = 'S') then
            BEGIN
            COSTO = 0;
            UTILIDAD = 0;
            PORC = 0;
            /* agregue los articulos sin factura */
            FOR SELECT ARTI_COD, 0, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND
                    A.ARTI_DES <= :DESFIN AND A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND
                    (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN)))
                INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,:DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                DO
                BEGIN
                SELECT COUNT(REPA_ARTICULO) FROM REPORTES_AUX WHERE REPA_ID = 2 AND REPA_USER = USER AND REPA_ARTICULO = :articulo INTO :numrows;
                if (numrows = 0) then
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        END
    if (BIN_AND(TIPO, 2) <> 0) then
        BEGIN
        TIPODOC = 32;
        /* BORRA LA TABLA AUXILIAR */
        DELETE FROM reportes_aux WHERE REPA_ID = 2 AND REPA_USER = USER;

        FOR SELECT MAX(D.ARTI_COD), SUM(RVDE_CANT * RVDE_FACTOR), SUM(RVDE_TOTAL-RVDE_IVAMONTO-RVDE_CONSUMO), SUM(RVDE_IVAMONTO), SUM(RVDE_CONSUMO),
            MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD), SUM(COST_SALP)
            FROM REMISIONES_VENTA_DETALLE D, REMISIONES_VENTA R, PREFIJOS P, ARTICULO A, movimiento_articulo m, costos c
            WHERE R.REVT_ID = D.REVT_ID AND P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = 32 AND D.ARTI_COD = A.arti_cod AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            R.revt_id = M.mvar_idref AND M.mvar_tipodoc = 32 AND M.mvar_item = D.rvde_item AND M.mvar_cons = C.cost_idmov AND
            REVT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY D.ARTI_COD
            INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,
            :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :COSTO
            DO
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
/*            EXECUTE PROCEDURE costo_promedio (:ARTICULO, :FECFIN) RETURNING_VALUES (:COSTOUNIT); */
/*            COSTO = cantidad * COSTOUNIT;*/
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                if (COSTO > 0) then
                    PORC = UTILIDAD * 100 / COSTO;
                ELSE
                    PORC = 100;
            else
                if (BASE > 0) then
                    PORC = UTILIDAD * 100 / BASE;
                ELSE
                    PORC = 0;
            if (CEROS = 'S') then
                INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (2, USER, :ARTICULO);
            SUSPEND;
            END /* FOR */
        if (CEROS = 'S') then
            BEGIN
            COSTO = 0;
            UTILIDAD = 0;
            PORC = 0;
            /* agregue los articulos sin factura */
            FOR SELECT ARTI_COD, 0, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND
                    A.ARTI_DES <= :DESFIN AND A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND
                    (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN)))
                INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,:DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                DO
                BEGIN
                SELECT COUNT(REPA_ARTICULO) FROM REPORTES_AUX WHERE REPA_ID = 2 AND REPA_USER = USER AND REPA_ARTICULO = :articulo INTO :numrows;
                if (numrows = 0) then
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        END
    if (BIN_AND(TIPO, 4) <> 0) then
        BEGIN
        TIPODOC = 33;
        /* BORRA LA TABLA AUXILIAR */
        DELETE FROM reportes_aux WHERE REPA_ID = 2 AND REPA_USER = USER;

        FOR SELECT MAX(D.ARTI_COD), SUM(DVDE_CANT * DVDE_FACTOR), SUM((DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO)*DEVT_FACTOR), SUM(DVDE_IVAMONTO*DEVT_FACTOR), SUM(DVDE_CONSUMO),
            MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD), SUM(COST_ENTP)
            FROM devoluciones_ventas_detalle D, DEVOLUCIONES_VENTAS V, PREFIJOS P, ARTICULO A, MOVIMIENTO_ARTICULO M, COSTOS C
            WHERE V.DEVT_ID = D.DEVT_ID AND P.PREF_PRE = V.PREF_PRE AND P.TIDO_COD = 33 AND D.ARTI_COD = A.arti_cod AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            V.devt_id = M.mvar_idref AND M.mvar_tipodoc = 33 AND M.mvar_item = D.dvde_item AND M.mvar_cons = C.cost_idmov AND
            DEVT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY D.ARTI_COD
            INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,
            :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :COSTO
            DO
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            else
                CANTIDAD = CANTIDAD * -1;
            if (BASE IS NULL) then
                BASE = 0;
            else
                BASE = BASE * -1;
            if (IVA IS NULL) then
                IVA = 0;
            else
                IVA = IVA * -1;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            else
                CONSUMO = CONSUMO * -1;
/*            EXECUTE PROCEDURE costo_promedio (:ARTICULO, :FECFIN) RETURNING_VALUES (:COSTOUNIT);*/
/*            COSTO = cantidad * COSTOUNIT;*/
            COSTO = costo * -1;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                if (COSTO > 0) then
                    PORC = UTILIDAD * 100 / COSTO;
                ELSE
                    PORC = 100;
            else
                if (BASE > 0) then
                    PORC = UTILIDAD * 100 / BASE;
                ELSE
                    PORC = 0;
            if (CEROS = 'S') then
                INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (2, USER, :ARTICULO);
            SUSPEND;
            END /* FOR */
        if (CEROS = 'S') then
            BEGIN
            COSTO = 0;
            UTILIDAD = 0;
            PORC = 0;
            /* agregue los articulos sin factura */
            FOR SELECT ARTI_COD, 0, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND
                    A.ARTI_DES <= :DESFIN AND A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND
                    (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN)))
                INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,:DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                DO
                BEGIN
                SELECT COUNT(REPA_ARTICULO) FROM REPORTES_AUX WHERE REPA_ID = 2 AND REPA_USER = USER AND REPA_ARTICULO = :articulo INTO :numrows;
                if (numrows = 0) then
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        END
    if (BIN_AND(TIPO, 8) <> 0) then
        BEGIN
        TIPODOC = 34;
        /* BORRA LA TABLA AUXILIAR */
        DELETE FROM reportes_aux WHERE REPA_ID = 2 AND REPA_USER = USER;

        FOR SELECT MAX(D.ARTI_COD), SUM(PEDE_CANT * PEDE_FACTOR), SUM((PEDE_TOTAL-PEDE_IVAMONTO-PEDE_CONSUMO)*PEDI_FACTOR), SUM(PEDE_IVAMONTO*PEDI_FACTOR), SUM(PEDE_CONSUMO),
            MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD)
            FROM PEDIDOS_DETALLE D, PEDIDOS P, PREFIJOS R, ARTICULO A
            WHERE P.PEDI_ID = D.PEDI_ID AND P.PREF_PRE = R.PREF_PRE AND R.TIDO_COD = 34 AND D.ARTI_COD = A.arti_cod AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            PEDI_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY D.ARTI_COD
            INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,
            :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
            DO
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            EXECUTE PROCEDURE costo_promedio (:ARTICULO, :FECFIN) RETURNING_VALUES (:COSTOUNIT);
            COSTO = cantidad * COSTOUNIT;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                if (COSTO > 0) then
                    PORC = UTILIDAD * 100 / COSTO;
                ELSE
                    PORC = 100;
            else
                if (BASE > 0) then
                    PORC = UTILIDAD * 100 / BASE;
                ELSE
                    PORC = 0;
            if (CEROS = 'S') then
                INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (2, USER, :ARTICULO);
            SUSPEND;
            END /* FOR */
        if (CEROS = 'S') then
            BEGIN
            COSTO = 0;
            UTILIDAD = 0;
            PORC = 0;
            /* agregue los articulos sin factura */
            FOR SELECT ARTI_COD, 0, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND
                    A.ARTI_DES <= :DESFIN AND A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND
                    (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN)))
                INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,:DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                DO
                BEGIN
                SELECT COUNT(REPA_ARTICULO) FROM REPORTES_AUX WHERE REPA_ID = 2 AND REPA_USER = USER AND REPA_ARTICULO = :articulo INTO :numrows;
                if (numrows = 0) then
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        END
    if (BIN_AND(TIPO, 16) <> 0) then
        BEGIN
        TIPODOC = 35;
        /* BORRA LA TABLA AUXILIAR */
        DELETE FROM reportes_aux WHERE REPA_ID = 2 AND REPA_USER = USER;

        FOR SELECT MAX(D.ARTI_COD), SUM(CTDE_CANT * CTDE_FACTOR), SUM((CTDE_TOTAL-CTDE_IVAMONTO-CTDE_CONSUMO)*COTI_FACTOR), SUM(CTDE_IVAMONTO), SUM(CTDE_CONSUMO),
            MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD)
            FROM COTIZACIONES_DETALLE D, COTIZACIONES C, PREFIJOS P, ARTICULO A
            WHERE C.COTI_ID = D.COTI_ID AND P.PREF_PRE = C.PREF_PRE AND P.TIDO_COD = 35 AND D.ARTI_COD = A.arti_cod AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND COTI_FECHA >= :FECINI AND COTI_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            COTI_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY D.ARTI_COD
            INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,
            :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
            DO
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            EXECUTE PROCEDURE costo_promedio (:ARTICULO, :FECFIN) RETURNING_VALUES (:COSTOUNIT);
            COSTO = cantidad * COSTOUNIT;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                if (COSTO > 0) then
                    PORC = UTILIDAD * 100 / COSTO;
                ELSE
                    PORC = 100;
            else
                if (BASE > 0) then
                    PORC = UTILIDAD * 100 / BASE;
                ELSE
                    PORC = 0;
            if (CEROS = 'S') then
                INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (2, USER, :ARTICULO);
            SUSPEND;
            END /* FOR */
        if (CEROS = 'S') then
            BEGIN
            COSTO = 0;
            UTILIDAD = 0;
            PORC = 0;
            /* agregue los articulos sin factura */
            FOR SELECT ARTI_COD, 0, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND
                    A.ARTI_DES <= :DESFIN AND A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND
                    (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN)))
                INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,:DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                DO
                BEGIN
                SELECT COUNT(REPA_ARTICULO) FROM REPORTES_AUX WHERE REPA_ID = 2 AND REPA_USER = USER AND REPA_ARTICULO = :articulo INTO :numrows;
                if (numrows = 0) then
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        END
    END
ELSE
    BEGIN
    if (BIN_AND(TIPO, 1) <> 0) then
        BEGIN
        TIPODOC = 31;
        FOR SELECT F.PREF_PRE, FACT_NUMERO, FACT_FECHA, D.ARTI_COD, FADE_CANT * FADE_FACTOR, (FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO)*FACT_FACTOR, FADE_IVAMONTO*FACT_FACTOR, FADE_CONSUMO,
            ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD, COST_SALP
            FROM FACTURAS F, FACTURAS_DETALLE D, PREFIJOS P, ARTICULO A, MOVIMIENTO_ARTICULO M, COSTOS C
            WHERE F.FACT_ID = D.FACT_ID AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND D.ARTI_COD = A.arti_cod AND
                A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
                A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND FACT_FECHA >= :FECINI AND
                (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
                F.fact_id = M.mvar_idref AND M.mvar_tipodoc = 31 AND M.mvar_item = D.fade_item AND M.mvar_cons = C.cost_idmov AND
                FACT_FECHA <= :FECFIN AND FACT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) and substring(a.arti_cod from 1 FOR 2) <> '.t'
            ORDER BY D.ARTI_COD, FACT_FECHA, F.FACT_ID, FADE_ITEM
            INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,
                :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :COSTO
            DO
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
/*            EXECUTE PROCEDURE costo_promedio (:ARTICULO, :FECHA) RETURNING_VALUES (:COSTOUNIT);*/
/*            COSTO = COSTOUNIT * CANTIDAD;*/
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                if (COSTO > 0) then
                    PORC = UTILIDAD * 100 / COSTO;
                ELSE
                    PORC = 100;
            else
                if (BASE > 0) then
                    PORC = UTILIDAD * 100 / BASE;
                ELSE
                    PORC = 0;
            SUSPEND;
            END
        END
    if (BIN_AND(TIPO, 2) <> 0) then
        BEGIN
        TIPODOC = 32;
        FOR SELECT R.PREF_PRE, REVT_NUMERO, REVT_FECHA, D.ARTI_COD, RVDE_CANT * RVDE_FACTOR, RVDE_TOTAL-RVDE_IVAMONTO-RVDE_CONSUMO, RVDE_IVAMONTO, RVDE_CONSUMO,
            ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD, COST_SALP
            FROM REMISIONES_VENTA R, REMISIONES_VENTA_DETALLE D, PREFIJOS P, ARTICULO A, MOVIMIENTO_ARTICULO M, COSTOS C
            WHERE R.REVT_ID = D.REVT_ID AND P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = 32 AND D.ARTI_COD = A.arti_cod AND
                A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
                A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN AND
                R.revt_id = M.mvar_idref AND M.mvar_tipodoc = 32 AND M.mvar_item = D.rvde_item AND M.mvar_cons = C.cost_idmov AND
                (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
                REVT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            ORDER BY D.ARTI_COD, REVT_FECHA, R.REVT_ID, RVDE_ITEM
            INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,
                :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :COSTO
            DO
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            EXECUTE PROCEDURE costo_promedio (:ARTICULO, :FECHA) RETURNING_VALUES (:COSTOUNIT);
            COSTO = COSTOUNIT * CANTIDAD;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                if (COSTO > 0) then
                    PORC = UTILIDAD * 100 / COSTO;
                ELSE
                    PORC = 100;
            else
                if (BASE > 0) then
                    PORC = UTILIDAD * 100 / BASE;
                ELSE
                    PORC = 0;
            SUSPEND;
            END
        END
    if (BIN_AND(TIPO, 4) <> 0) then
        BEGIN
        TIPODOC = 33;
        FOR SELECT V.PREF_PRE, DEVT_NUMERO, DEVT_FECHA, D.ARTI_COD, DVDE_CANT * DVDE_FACTOR, (DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO)*DEVT_FACTOR, DVDE_IVAMONTO*DEVT_FACTOR, DVDE_CONSUMO,
            ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD, COST_ENTP
            FROM DEVOLUCIONES_VENTAS V, DEVOLUCIONES_VENTAS_DETALLE D, PREFIJOS P, ARTICULO A, MOVIMIENTO_ARTICULO M, COSTOS C
            WHERE V.DEVT_ID = D.DEVT_ID AND P.PREF_PRE = V.PREF_PRE AND P.TIDO_COD = 33 AND D.ARTI_COD = A.arti_cod AND
                A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
                A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND
                (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
                V.devt_id = M.mvar_idref AND M.mvar_tipodoc = 33 AND M.mvar_item = D.dvde_item AND M.mvar_cons = C.cost_idmov AND
                DEVT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            ORDER BY D.ARTI_COD, DEVT_FECHA, V.DEVT_ID, DVDE_ITEM
            INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,
                :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :COSTO
            DO
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            EXECUTE PROCEDURE costo_promedio (:ARTICULO, :FECHA) RETURNING_VALUES (:COSTOUNIT);
            BASE = BASE * -1;
            CANTIDAD = CANTIDAD * -1;
            IVA = IVA * -1;
            CONSUMO = CONSUMO * -1;
            COSTO = COSTOUNIT * CANTIDAD;
            COSTO = COSTO * -1;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                if (COSTO > 0) then
                    PORC = UTILIDAD * 100 / COSTO;
                ELSE
                    PORC = 100;
            else
                if (BASE > 0) then
                    PORC = UTILIDAD * 100 / BASE;
                ELSE
                    PORC = 0;
            SUSPEND;
            END
        END
    if (BIN_AND(TIPO, 8) <> 0) then
        BEGIN
        TIPODOC = 34;
        FOR SELECT P.PREF_PRE, PEDI_NUMERO, PEDI_FECHA, D.ARTI_COD, PEDE_CANT * PEDE_FACTOR, (PEDE_TOTAL-PEDE_IVAMONTO-PEDE_CONSUMO)*PEDI_FACTOR, PEDE_IVAMONTO*PEDI_FACTOR, PEDE_CONSUMO,
            ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD 
            FROM PEDIDOS P, PEDIDOS_DETALLE D, PREFIJOS R, ARTICULO A
            WHERE P.PEDI_ID = D.PEDI_ID AND P.PREF_PRE = R.PREF_PRE AND R.TIDO_COD = 34 AND D.ARTI_COD = A.arti_cod AND
                A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
                A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND
                (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
                PEDI_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            ORDER BY D.ARTI_COD, PEDI_FECHA, P.PEDI_ID, PEDE_ITEM
            INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,
                :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
            DO
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            EXECUTE PROCEDURE costo_promedio (:ARTICULO, :FECHA) RETURNING_VALUES (:COSTOUNIT);
            COSTO = COSTOUNIT * CANTIDAD;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                if (COSTO > 0) then
                    PORC = UTILIDAD * 100 / COSTO;
                ELSE
                    PORC = 100;
            else
                if (BASE > 0) then
                    PORC = UTILIDAD * 100 / BASE;
                ELSE
                    PORC = 0;
            SUSPEND;
            END
        END
    if (BIN_AND(TIPO, 16) <> 0) then
        BEGIN
        TIPODOC = 35;
        FOR SELECT C.PREF_PRE, COTI_NUMERO, COTI_FECHA, D.ARTI_COD, CTDE_CANT * CTDE_FACTOR, (CTDE_TOTAL-CTDE_IVAMONTO-CTDE_CONSUMO)*COTI_FACTOR, CTDE_IVAMONTO*COTI_FACTOR, CTDE_CONSUMO,
            ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD 
            FROM COTIZACIONES C, COTIZACIONES_DETALLE D, PREFIJOS P, ARTICULO A
            WHERE C.COTI_ID = D.COTI_ID AND P.PREF_PRE = C.PREF_PRE AND P.TIDO_COD = 35 AND D.ARTI_COD = A.arti_cod AND
                A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
                A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND COTI_FECHA >= :FECINI AND COTI_FECHA <= :FECFIN AND
                (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
                COTI_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            ORDER BY D.ARTI_COD, COTI_FECHA, C.COTI_ID, CTDE_ITEM
            INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,
                :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
            DO
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            EXECUTE PROCEDURE costo_promedio (:ARTICULO, :FECHA) RETURNING_VALUES (:COSTOUNIT);
            COSTO = COSTOUNIT * CANTIDAD;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                if (COSTO > 0) then
                    PORC = UTILIDAD * 100 / COSTO;
                ELSE
                    PORC = 100;
            else
                if (BASE > 0) then
                    PORC = UTILIDAD * 100 / BASE;
                ELSE
                    PORC = 0;
            SUSPEND;
            END
        END
    END
END

^

SET TERM ; ^

SET TERM ^ ;

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

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE REVISA_PRECIOS(
    LISTA INTEGER,
    FECHA DATE)
RETURNS (
    ARTICULO VARCHAR(20),
    DESCR VARCHAR(60),
    GRUPO VARCHAR(2),
    SUBGRUPO VARCHAR(3),
    MARCA VARCHAR(3),
    FIJO NUMERIC(18,2),
    UNIDAD VARCHAR(8),
    PORC NUMERIC(9,4),
    SUGERIDO NUMERIC(18,2),
    DIFER NUMERIC(18,2),
    NUEVO NUMERIC(18,2),
    OK CHAR(1))
AS
declare variable marg numeric(9,4);
declare variable UOM VARCHAR(10);
declare variable BASE VARCHAR(10);
declare variable CAMBIO VARCHAR(10);
declare variable COSTO numeric(18,2);
declare variable COSTOP numeric(18,2);
declare variable COSTOU numeric(18,2);
declare variable DIFMAX numeric(18,2);
declare variable DIG INTEGER;
declare variable TARIVA NUMERIC(9,4);
declare variable IVAINC CHAR(1);
declare variable LISTAREF INTEGER;
begin
execute procedure lee_configuracion ('FACTURACION', 'ARTICULOS', 'SUGERIR PRECIOS CON PORCENTAJE DE MARGEN O UTILIDAD') returning_values (:UOM);
EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION', 'ARTICULOS', 'REDONDEO AL MULTIPLO DE DIEZ EN PRECIOS') RETURNING_VALUES (:DIG);
EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION','ARTICULOS','CAMBIO DE PRECIOS AUTOMATICO AL CAMBIAR COSTO O PRECIO') returning_values (CAMBIO);
EXECUTE PROCEDURE lee_configuracion('FACTURACION','ARTICULOS','COSTO BASE PARA CALCULO DE PRECIOS DE VENTA AUTOMATICOS') returning_values (:BASE);
EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION','ARTICULOS','CODIGO DE LA LISTA DE PRECIOS BASE PARA CAMBIO DE PRECIOS AUTOMATICO') returning_values (LISTAREF);
EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION','ARTICULOS','DIFERENCIA EN PESOS MAXIMA A PERMITIR PARA CAMBIAR PRECIOS') returning_values (DIFMAX);
for select A.arti_cod, A.arti_des, A.grup_cod, A.subg_cod, A.marc_cod, A.arti_unidad, prar_fijo, prar_margen, prar_util, TAIV_PORC
    from precios_articulo p, articulo a, tarifa_iva T
    where a.arti_cod = p.arti_cod and lipr_cod = :lista and a.taiv_cod = t.taiv_cod order by A.arti_cod
    into :articulo, descr, :grupo, :subgrupo, :marca, :unidad, :fijo, :marg, :porc, :tariva
    do
    begin
    if (UOM <> 'UTILIDAD') then
        PORC = MARG;
    if (CAMBIO = 'COSTO') then
        BEGIN
        EXECUTE PROCEDURE COSTO_PROMEDIO (:ARTICULO, :FECHA) RETURNING_VALUES(:COSTOP);
        EXECUTE PROCEDURE ULTIMO_COSTO (:ARTICULO, :FECHA, :UNIDAD) RETURNING_VALUES(:COSTOU);
        if (base = 'ULTIMO') then
            COSTO = COSTOU;
        ELSE
            BEGIN
            COSTO = COSTOP;
            if (base = 'MAYOR') then
                if (COSTOP < COSTOU) then
                    COSTO = COSTOU;
            END
        SELECT LIPR_MODIF FROM LISTA_PRECIOS WHERE LIPR_COD = :lista INTO :IVAINC;
        if (IVAINC = 'S') then
            COSTO = COSTO * (1 + TARIVA/100);
        if (UOM = 'UTILIDAD') then
            SUGERIDO = COSTO * (1 + :PORC/100);
        ELSE
            SUGERIDO = COSTO / (1 - :PORC/100);
        END
    ELSE
        if (LISTA <> LISTAREF) then
            BEGIN
            SELECT PRAR_FIJO FROM PRECIOS_ARTICULO WHERE ARTI_COD = :articulo AND LIPR_COD = :LISTAREF INTO :SUGERIDO;
            if (IVAINC = 'S') then
                SUGERIDO = SUGERIDO / (1 + TARIVA/100);
            if (UOM = 'UTILIDAD') then
                SUGERIDO = SUGERIDO * (1 + :PORC/100);
            ELSE
                SUGERIDO = SUGERIDO / (1 - :PORC/100);
            END
    EXECUTE PROCEDURE REDONDEE (SUGERIDO, DIG) returning_values (SUGERIDO);
    DIFER = SUGERIDO - FIJO;
    NUEVO = SUGERIDO;
    OK = 'S';
    if ((abs(DIFER) > DIFMAX) and (sugerido <> 0)) then
        suspend;
    end
end

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE TARIFAS_ENSAMBLE(
    PRODUCTO VARCHAR(20),
    PRECIO NUMERIC(18,2),
    FECHA DATE)
RETURNS (
    T0 NUMERIC(18,2),
    T1 NUMERIC(18,2),
    T2 NUMERIC(18,2),
    T3 NUMERIC(18,2),
    T4 NUMERIC(18,2),
    TC NUMERIC(18,2))
AS
declare variable COSTO NUMERIC(18,2);
declare variable TOTAL NUMERIC(18,2);
declare variable TARIFA INTEGER;
declare variable COMPON VARCHAR(20);
declare variable CANT NUMERIC(18,4);
declare variable UNIDAD VARCHAR(8);
declare variable CONSUMO NUMERIC(18,2);
begin
T0 = 0;
T1 = 0;
T2 = 0;
T3 = 0;
T4 = 0;
TC = 0;
TOTAL = 0;
FOR SELECT ARPR_COMP, ARPR_CANT, ARPR_UNIDAD, TAIV_COD, ARTI_CONSUMO
    FROM articulos_producto P, ARTICULO A WHERE P.ARTI_COD = :PRODUCTO AND P.arpr_comp = A.arti_cod
    INTO :COMPON, :CANT, :UNIDAD, :TARIFA, :CONSUMO
    DO
    BEGIN
    EXECUTE PROCEDURE cantidad_por_factor (:COMPON, :CANT, :UNIDAD) returning_values (:cant);
    EXECUTE PROCEDURE costo_promedio (:COMPON, :FECHA) returning_values (:COSTO);
    TOTAL = TOTAL + COSTO * CANT;
    TC = TC + CONSUMO * CANT;
    if (TARIFA = 0) then
        T0 = T0 + COSTO * CANT;
    if (TARIFA = 1) then
        T1 = T1 + COSTO * CANT;
    if (TARIFA = 2) then
        T2 = T2 + COSTO * CANT;
    if (TARIFA = 3) then
        T3 = T3 + COSTO * CANT;
    if (TARIFA = 4) then
        T4 = T4 + COSTO * CANT;
    END
if (TOTAL <> 0) then
    BEGIN
    T0 = T0 * PRECIO / TOTAL;
    T1 = T1 * PRECIO / TOTAL;
    T2 = T2 * PRECIO / TOTAL;
    T3 = T3 * PRECIO / TOTAL;
    T4 = T4 * PRECIO / TOTAL;
    END
ELSE
    BEGIN
    T0 = 0;
    T1 = 0;
    T2 = 0;
    T3 = 0;
    T4 = 0;
    END
suspend;
end

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE UTILIDAD_VENTAS(
    TIPO INTEGER,
    DETALLE CHAR(1),
    FECINI DATE,
    FECFIN DATE,
    PREFIJO VARCHAR(4),
    SUBEMPRESA INTEGER)
RETURNS (
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    PTVTID INTEGER,
    VENDCOD INTEGER,
    NIT VARCHAR(20),
    NOMTERCERO VARCHAR(60),
    ARTICULO VARCHAR(15),
    ARTIDES VARCHAR(60),
    CANT NUMERIC(18,4),
    UNIDAD VARCHAR(8),
    PRECIO NUMERIC(18,2),
    COSTO NUMERIC(18,2),
    UTILIDAD NUMERIC(18,2),
    PORC NUMERIC(9,2))
AS
declare variable IMPTOS CHAR(1);
declare variable ID INTEGER;
declare variable IVA NUMERIC(18,2);
declare variable COSTOT NUMERIC(18,2);
declare variable PRECIOT NUMERIC(18,2);
declare variable UOM VARCHAR(20);
BEGIN
EXECUTE PROCEDURE lee_configuracion ('FACTURACION', 'ARTICULOS', 'SUGERIR PRECIOS CON PORCENTAJE DE MARGEN O UTILIDAD') returning_values (:UOM);
/* DETERMINE LA TABLA A EXAMINAR */
if (TIPO = 31) then
    BEGIN
    /* FACTURA */
    FOR SELECT FACT_ID, F.PREF_PRE, FACT_NUMERO, FACT_FECHA, PTVT_ID, VEND_COD, TERC_NIT, FACT_NOMCLIENTE, FACT_IVAINC
        FROM FACTURAS F, PREFIJOS P
        WHERE FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND FACT_ANULADO = 'N'
         AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = :TIPO AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
        ORDER BY FACT_FECHA, F.PREF_PRE, FACT_NUMERO
        INTO :ID, :PREF, :NUMERO, :FECHA, :PTVTID, :VENDCOD, :NIT, :NOMTERCERO, :IMPTOS
        DO
        if ((PREFIJO = '') or (PREFIJO = PREF)) then
          BEGIN
          COSTOT = 0;
          PRECIOT = 0;
          FOR SELECT D.ARTI_COD, SUBSTR(FADE_DESC,1,60), FADE_CANT * FADE_FACTOR, FADE_UNIDAD, (FADE_PRUNIT - FADE_DTOMONTO) / FADE_FACTOR, FADE_IVAMONTO, COST_SALP
            FROM FACTURAS_DETALLE D, MOVIMIENTO_ARTICULO M, COSTOS C
            WHERE FACT_ID = :ID and substring(D.arti_cod from 1 FOR 2) <> '.t' AND D.fact_id = M.mvar_idref AND
                M.mvar_tipodoc = 31 AND M.mvar_item = D.fade_item AND M.mvar_cons = C.cost_idmov
            INTO :ARTICULO, :ARTIDES, :CANT, :UNIDAD, :PRECIO, :IVA, :COSTO
            DO
                BEGIN
                PRECIO = PRECIO * CANT;
                if (IMPTOS = 'S') then
                    PRECIO = PRECIO - IVA;
                UTILIDAD = PRECIO - COSTO;
                if (DETALLE = 'S') then
                    BEGIN
                    if (UOM = 'UTILIDAD') then
                        EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                    else
                        EXECUTE PROCEDURE PORCENTAJE (utilidad,  PRECIO, 'S') returning_values (PORC);
                    SUSPEND;
                    END
                ELSE
                    BEGIN
                    COSTOT = COSTOT + COSTO;
                    PRECIOT = PRECIOT + PRECIO;
                    END
                END
          if (DETALLE <> 'S') then
            BEGIN
            COSTO = COSTOT;
            PRECIO = PRECIOT;
            UTILIDAD = PRECIO - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  PRECIO, 'S') returning_values (PORC);
            SUSPEND;
            END
          END
    END
  if (TIPO = 32) then
    BEGIN
    /* REMISION */
    FOR SELECT REVT_ID, R.PREF_PRE, REVT_NUMERO, REVT_FECHA, PTVT_ID, VEND_COD, TERC_NIT, REVT_NOMTERC, REVT_IVAINC
        FROM REMISIONES_VENTA R, PREFIJOS P
        WHERE REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN AND REVT_ANULADO = 'N'
         AND P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = :TIPO AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
        ORDER BY REVT_FECHA, R.PREF_PRE, REVT_NUMERO
        INTO :ID, :PREF, :NUMERO, :FECHA, :PTVTID, :VENDCOD, :NIT, :NOMTERCERO, :IMPTOS
        DO
        if ((PREFIJO = '') or (PREFIJO = PREF)) then
          BEGIN
          COSTOT = 0;
          PRECIOT = 0;
          FOR SELECT D.ARTI_COD, SUBSTR(RVDE_DESC,1,60), RVDE_CANT * RVDE_FACTOR, RVDE_UNIDAD, (RVDE_PRUNIT - RVDE_DTOMONTO) / RVDE_FACTOR, RVDE_IVAMONTO, COST_SALP
            FROM REMISIONES_VENTA_DETALLE D, movimiento_articulo m, costos c
            WHERE REVT_ID = :ID and substring(D.arti_cod from 1 FOR 2) <> '.t' AND D.revt_id = M.mvar_idref AND
                M.mvar_tipodoc = 32 AND M.mvar_item = D.rvde_item AND M.mvar_cons = C.cost_idmov
            INTO :ARTICULO, :ARTIDES, :CANT, :UNIDAD, :PRECIO, :IVA, :COSTO
            DO
                BEGIN
                PRECIO = PRECIO * CANT;
                if (IMPTOS = 'S') then
                    PRECIO = PRECIO - IVA;
                UTILIDAD = PRECIO - COSTO;
                if (DETALLE = 'S') then
                    BEGIN
                    if (UOM = 'UTILIDAD') then
                        EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                    else
                        EXECUTE PROCEDURE PORCENTAJE (utilidad,  PRECIO, 'S') returning_values (PORC);
                    SUSPEND;
                    END
                ELSE
                    BEGIN
                    COSTOT = COSTOT + COSTO;
                    PRECIOT = PRECIOT + PRECIO;
                    END
                END
          if (DETALLE <> 'S') then
            BEGIN
            COSTO = COSTOT;
            PRECIO = PRECIOT;
            UTILIDAD = PRECIO - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  PRECIO, 'S') returning_values (PORC);
            SUSPEND;
            END
          END
    END
  if (TIPO = 33) then
    BEGIN
    /* DEVOLUCION */
    FOR SELECT DEVT_ID, D.PREF_PRE, DEVT_NUMERO, DEVT_FECHA, PTVT_ID, VEND_COD, TERC_NIT, DEVT_NOMTERC, DEVT_IVAINC
        FROM DEVOLUCIONES_VENTAS D, PREFIJOS P
        WHERE DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND DEVT_ANULADO = 'N'
         AND P.PREF_PRE = D.PREF_PRE AND P.TIDO_COD = :TIPO AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
        ORDER BY DEVT_FECHA, D.PREF_PRE, DEVT_NUMERO
        INTO :ID, :PREF, :NUMERO, :FECHA, :PTVTID, :VENDCOD, :NIT, :NOMTERCERO, :IMPTOS
        DO
        if ((PREFIJO = '') or (PREFIJO = PREF)) then
          BEGIN
          COSTOT = 0;
          PRECIOT = 0;
          FOR SELECT D.ARTI_COD, SUBSTR(DVDE_DESC,1,60), DVDE_CANT * DVDE_FACTOR, DVDE_UNIDAD, (DVDE_PRUNIT - DVDE_DTOMONTO) / DVDE_FACTOR, DVDE_IVAMONTO, COST_ENTP
            FROM DEVOLUCIONES_VENTAS_DETALLE D, MOVIMIENTO_ARTICULO M, COSTOS C
            WHERE DEVT_ID = :ID and substring(D.arti_cod from 1 FOR 2) <> '.t' AND D.devt_id = M.mvar_idref AND
                M.mvar_tipodoc = 33 AND M.mvar_item = D.dvde_item AND M.mvar_cons = C.cost_idmov
            INTO :ARTICULO, :ARTIDES, :CANT, :UNIDAD, :PRECIO, :IVA, :COSTO
            DO
                BEGIN
                PRECIO = PRECIO * CANT;
                if (IMPTOS = 'S') then
                    PRECIO = PRECIO - IVA;
                UTILIDAD = PRECIO - COSTO;
                if (DETALLE = 'S') then
                    BEGIN
                    if (UOM = 'UTILIDAD') then
                        EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                    else
                        EXECUTE PROCEDURE PORCENTAJE (utilidad,  PRECIO, 'S') returning_values (PORC);
                    SUSPEND;
                    END
                ELSE
                    BEGIN
                    COSTOT = COSTOT + COSTO;
                    PRECIOT = PRECIOT + PRECIO;
                    END
                END
        if (DETALLE <> 'S') then
            BEGIN
            COSTO = COSTOT;
            PRECIO = PRECIOT;
            UTILIDAD = PRECIO - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  PRECIO, 'S') returning_values (PORC);
            SUSPEND;
            END
        END
    END
  if (TIPO = 34) then
    BEGIN
    /* PEDIDO */
    FOR SELECT PEDI_ID, P.PREF_PRE, PEDI_NUMERO, PEDI_FECHA, PTVT_ID, VEND_COD, TERC_NIT, PEDI_NOMTERC, PEDI_IVAINC
        FROM PEDIDOS P, PREFIJOS R
        WHERE PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND PEDI_ANULADO = 'N'
         AND P.PREF_PRE = R.PREF_PRE AND R.TIDO_COD = :TIPO AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
        ORDER BY PEDI_FECHA, P.PREF_PRE, PEDI_NUMERO
        INTO :ID, :PREF, :NUMERO, :FECHA, :PTVTID, :VENDCOD, :NIT, :NOMTERCERO, :IMPTOS
        DO
        if ((PREFIJO = '') or (PREFIJO = PREF)) then
          BEGIN
          COSTOT = 0;
          PRECIOT = 0;
          FOR SELECT ARTI_COD, SUBSTR(PEDE_DESC,1,60), PEDE_CANT * PEDE_FACTOR, PEDE_UNIDAD, (PEDE_PRUNIT - PEDE_DTOMONTO) / PEDE_FACTOR, PEDE_IVAMONTO
            FROM PEDIDOS_DETALLE
            WHERE PEDI_ID = :ID
            INTO :ARTICULO, :ARTIDES, :CANT, :UNIDAD, :PRECIO, :IVA
            DO
                BEGIN
                EXECUTE PROCEDURE COSTO_PROMEDIO(:ARTICULO, :FECHA) returning_values (:COSTO);
                COSTO = COSTO * CANT;
                PRECIO = PRECIO * CANT;
                if (IMPTOS = 'S') then
                    PRECIO = PRECIO - IVA;
                UTILIDAD = PRECIO - COSTO;
                if (DETALLE = 'S') then
                    BEGIN
                    if (UOM = 'UTILIDAD') then
                        EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                    else
                        EXECUTE PROCEDURE PORCENTAJE (utilidad,  PRECIO, 'S') returning_values (PORC);
                    SUSPEND;
                    END
                ELSE
                    BEGIN
                    COSTOT = COSTOT + COSTO;
                    PRECIOT = PRECIOT + PRECIO;
                    END
                END
        if (DETALLE <> 'S') then
            BEGIN
            COSTO = COSTOT;
            PRECIO = PRECIOT;
            UTILIDAD = PRECIO - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  PRECIO, 'S') returning_values (PORC);
            SUSPEND;
            END
        END
    END
  if (TIPO = 35) then
    BEGIN
    /* COTIZACION */
    FOR SELECT COTI_ID, C.PREF_PRE, COTI_NUMERO, COTI_FECHA, PTVT_ID, VEND_COD, TERC_NIT, COTI_NOMTERC, COTI_IMPTOS
        FROM COTIZACIONES C, PREFIJOS P
        WHERE COTI_FECHA >= :FECINI AND COTI_FECHA <= :FECFIN AND COTI_ANULADO = 'N'
         AND P.PREF_PRE = C.PREF_PRE AND P.TIDO_COD = :TIPO AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
        ORDER BY COTI_FECHA, C.PREF_PRE, COTI_NUMERO
        INTO :ID, :PREF, :NUMERO, :FECHA, :PTVTID, :VENDCOD, :NIT, :NOMTERCERO, :IMPTOS
        DO
        if ((PREFIJO = '') or (PREFIJO = PREF)) then
          BEGIN
          COSTOT = 0;
          PRECIOT = 0;
          FOR SELECT ARTI_COD, SUBSTR(CTDE_DESC,1,60), CTDE_CANT * CTDE_FACTOR, CTDE_UNIDAD, (CTDE_PRUNIT - CTDE_DTOMONTO) / CTDE_FACTOR, CTDE_IVAMONTO
            FROM COTIZACIONES_DETALLE
            WHERE COTI_ID = :ID
            INTO :ARTICULO, :ARTIDES, :CANT, :UNIDAD, :PRECIO, :IVA
            DO
                BEGIN
                EXECUTE PROCEDURE COSTO_PROMEDIO(:ARTICULO, :FECHA) returning_values (:COSTO);
                COSTO = COSTO * CANT;
                PRECIO = PRECIO * CANT;
                if (IMPTOS = 'S') then
                    PRECIO = PRECIO - IVA;
                UTILIDAD = PRECIO - COSTO;
                if (DETALLE = 'S') then
                    BEGIN
                    if (UOM = 'UTILIDAD') then
                        EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                    else
                        EXECUTE PROCEDURE PORCENTAJE (utilidad,  PRECIO, 'S') returning_values (PORC);
                    SUSPEND;
                    END
                ELSE
                    BEGIN
                    COSTOT = COSTOT + COSTO;
                    PRECIOT = PRECIOT + PRECIO;
                    END
                END
        if (DETALLE <> 'S') then
            BEGIN
            COSTO = COSTOT;
            PRECIO = PRECIOT;
            UTILIDAD = PRECIO - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  PRECIO, 'S') returning_values (PORC);
            SUSPEND;
            END
        END
    END
END

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE CHEQUEO_COSTOS(
    ARTICULO VARCHAR(20),
    FECHA DATE)
AS
declare variable NUMROWS INTEGER;
DECLARE VARIABLE ID INTEGER;
DECLARE VARIABLE FECMV DATE;
DECLARE VARIABLE CANT NUMERIC(15,4);
DECLARE VARIABLE COSTO NUMERIC(18,2);
DECLARE VARIABLE ENTRADA CHAR(1);
DECLARE VARIABLE TIPO INTEGER;
begin
SELECT COUNT(*) FROM COSTOS WHERE ARTI_COD = :ARTICULO AND COST_FECHA > :FECHA INTO :NUMROWS;
if (NUMROWS > 0) then
    BEGIN
    delete from costos where arti_cod = :ARTICULO AND COST_FECHA > :FECHA;
    for select mvar_cons, mvar_fecha, mvar_cant, mvar_costo, mvar_entrada, mvar_tipodoc
        from movimiento_articulo WHERE ARTI_COD = :ARTICULO AND MVAR_FECHA > :FECHA
        order by mvar_fecha, mvar_cons /* SE HACE ESTRICTAMENTE EN ORDEN DE FECHA Y REGISTRO, SI LO EDITAN CAMBIA EL ORDEN */
        into :id, :fecmv, :cant, :costo, :entrada, :tipo
        do
        if ((TIPO <> 13)) then
            EXECUTE PROCEDURE actualice_costo(:ARTICULO, :fecmv, :costo, :cant, :entrada, 'N', :id, :tipo);
    END
end

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE CHEQUEO_INVENTARIO(
    ARTINI VARCHAR(20),
    ARTFIN VARCHAR(20))
AS
DECLARE VARIABLE FECHA DATE;
DECLARE VARIABLE CANT NUMERIC(15,4);
DECLARE VARIABLE COSTO NUMERIC(18,2);
DECLARE VARIABLE ENTRADA CHAR(1);
DECLARE VARIABLE BODEGA CHAR(2);
DECLARE VARIABLE ID INTEGER;
DECLARE VARIABLE TIPO INTEGER;
declare variable TIPOEX CHAR(1);
DECLARE VARIABLE LOTE VARCHAR(20);
DECLARE VARIABLE EXISTE CHAR(1);
declare variable ARTICULO VARCHAR(20);
declare variable IDL INTEGER;
BEGIN
for select arti_cod from articulo where arti_cod >= :artini and arti_cod <= :artfin into :ARTICULO
  DO
  BEGIN
  DELETE FROM existencia_lote where arti_cod = :articulo;
  DELETE FROM lotes where arti_cod = :articulo;
  delete from costos where arti_cod = :ARTICULO;
  delete from existencia WHERE ARTI_COD = :ARTICULO;
  for select mvar_cons, mvar_fecha, mvar_cant, mvar_costo, mvar_entrada, bode_cod, mvar_tipodoc, mvar_lote
    from movimiento_articulo WHERE ARTI_COD = :ARTICULO
    order by mvar_fecha, mvar_cons
    into :id, :fecha, :cant, :costo, :entrada, :bodega, :tipo, :lote
  do
    begin
    SELECT ARTI_EXIST
        FROM   ARTICULO
        WHERE  ARTICULO.ARTI_COD = :ARTICULO
        INTO :TIPOEX;
    if ((TIPO <> 13)) then
        EXECUTE PROCEDURE actualice_costo(:ARTICULO, :fecha, :costo, :cant, :entrada, 'N', :id, :tipo);
    /* actualice existencias */
    if (:entrada = 'S') then
        begin
        execute procedure sume_existencia(:articulo, :bodega, :fecha, :cant, 'N');
        if (TIPOEX = 'L') then
            begin
            EXISTE = 'N';
            SELECT 'S' FROM LOTES WHERE ARTI_COD = :ARTICULO AND BODE_COD = :BODEGA AND LOTE_NRO = :lote INTO :EXISTE;
            if (EXISTE = 'S') then
                UPDATE LOTES
                    set lote_saldo = lote_saldo + :cant
                    where (arti_cod = :ARTICULO) and (BODE_COD = :BODEGA) AND (lote_nro = :lote);
            ELSE
                INSERT INTO LOTES (ARTI_COD, BODE_COD, LOTE_NRO, LOTE_FECHA, LOTE_CANT, LOTE_COSTO, LOTE_SALDO)
                    VALUES (:ARTICULO, :bodega, :lote, :fecha, :cant, :costo, :cant);
            end
        end
    else
        begin
        execute procedure reste_existencia(:articulo, :bodega, :fecha, :cant, 'N');
        if (TIPOEX = 'L') then
            begin
            EXISTE = 'N';
            SELECT 'S' FROM LOTES WHERE ARTI_COD = :ARTICULO AND BODE_COD = :BODEGA AND LOTE_NRO = :lote INTO :EXISTE;
            if (EXISTE = 'S') then
                UPDATE LOTES
                    set lote_saldo = lote_saldo - :cant
                    where (arti_cod = :ARTICULO) AND (BODE_COD = :BODEGA) and (lote_nro = :lote);
            ELSE
                BEGIN
                /* ARREGLE EL LOTE YA QUE NO EXISTE */
                SELECT MIN(LOTE_ID) FROM LOTES WHERE ARTI_COD = :articulo AND BODE_COD = :BODEGA AND LOTE_CANT >= :cant INTO :IDL;
                SELECT LOTE_NRO FROM LOTES WHERE LOTE_ID = :IDL INTO :LOTE;
                UPDATE MOVIMIENTO_ARTICULO SET MVAR_LOTE = :LOTE WHERE MVAR_CONS = :ID;
                UPDATE LOTES
                    set lote_saldo = lote_saldo - :cant
                    where (arti_cod = :ARTICULO) and (BODE_COD = :BODEGA) AND (lote_nro = :lote);
                END
            EXISTE = 'N';
            SELECT 'S' FROM EXISTENCIA_LOTE
                WHERE LOTE_NRO = :LOTE AND EXLO_FECHA = :FECHA AND ARTI_COD = :ARTICULO AND BODE_COD = :bodega
                INTO :EXISTE;
            if (EXISTE = 'S') then
                UPDATE EXISTENCIA_LOTE
                       SET EXLO_SAL = EXLO_SAL + :cant
                    WHERE LOTE_NRO = :LOTE AND EXLO_FECHA = :FECHA AND ARTI_COD = :ARTICULO AND BODE_COD = :bodega;
            else
                INSERT INTO EXISTENCIA_LOTE (ARTI_COD, BODE_COD, LOTE_NRO, EXLO_FECHA, EXLO_SAL)
                    VALUES (:ARTICULO, :BODEGA, :LOTE, :FECHA, :CANT);
            end
        end
    END
  END
END

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE CAMBIO_PRECIOS(
    FECHA DATE)
AS
declare variable ART VARCHAR(20);
BEGIN
FOR SELECT ARTI_COD FROM ARTICULO INTO :ART DO
    EXECUTE PROCEDURE CALCULA_PRECIOS(:ART, :FECHA);
  SUSPEND;
END

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE CONTABILICE_COSTO_VENTAS(
    ID INTEGER,
    IDINTER INTEGER)
RETURNS (
    IDC INTEGER)
AS
declare variable PREF VARCHAR(4);
declare variable NUM VARCHAR(6);
declare variable NUMERO VARCHAR(10);
declare variable INVEN CHAR(1);
declare variable CTAINVEN VARCHAR(20);
declare variable COSTOS CHAR(1);
declare variable CTACOSTOS VARCHAR(20);
declare variable EXISTE CHAR(1);
declare variable CUENTA VARCHAR(20);
declare variable MONTO NUMERIC(18,2);
declare variable TIPOCUEN CHAR(1);
declare variable NIT VARCHAR(20);
declare variable PROY VARCHAR(4);
declare variable CENTRO VARCHAR(4);
declare variable ART VARCHAR(15);
declare variable ANULADO CHAR(1);
declare variable NROI INTEGER;
declare variable NUMROWS INTEGER;
declare variable CONC CHAR(120);
declare variable VENCEAUX DATE;
declare variable VENCE CHAR(8);
begin
/* TRAIGA EL ID DEL ENCABEZADO DEL COMPROBANTE CONTABLE */
SELECT ENCO_CONSEC FROM COMPROBANTE_ENCABEZADO WHERE ENCO_TIPOREF = 31 AND ENCO_IDREF = :ID INTO :IDC;
SELECT MAX(CODE_ITEM) FROM COMPROBANTE_DETALLE WHERE ENCO_CONSEC = :idc INTO :NROI;
NROI = NROI + 1;
/* EJECUTE LA PARTE DE CONTABIL_FACTURA QUE CORRESPONDE A LOS COSTOS */
EXISTE = 'N';
SELECT 'S', INVE_COSTO, INVE_INVEN, INVE_CTAINVEN, INVE_CTACOSTOS
    FROM INTERFAZ_VENTAS
    WHERE INVE_ID = :IDINTER
    INTO :EXISTE, :COSTOS, :INVEN, :CTAINVEN, :CTACOSTOS;
if (EXISTE = 'S') then
  BEGIN
  SELECT FACT_ANULADO, PREF_PRE, FACT_NUMERO, FACT_VENCE, TERC_NIT FROM FACTURAS F
        WHERE FACT_ID = :ID INTO :ANULADO, :PREF, :NUMERO, :VENCEAUX, :NIT;
  NUMERO = PREF || NUM;
  CONC = 'COSTO EN VENTAS FACTURA ' || :NUMERO;
  EXECUTE PROCEDURE FECHA_A_CONTA(:VENCEAUX) returning_values (:VENCE);
  if (ANULADO = 'N') then
    BEGIN
    SELECT BODE_CENTRO, BODE_PROY FROM BODEGA B, FACTURAS F, PUNTO_VENTA P
        WHERE B.BODE_COD = P.BODE_COD AND P.PTVT_ID = F.PTVT_ID AND F.FACT_ID = :ID INTO :CENTRO, :PROY;
    /* SE ASUME QUE NO HAN CAMBIADO LAS CUENTAS DE COSTOS, POR ESO SE HACE UPDATE A LOS MOVIMIENTOS DE ESAS CUENTAS */
    EXECUTE PROCEDURE COSTO_EN_VENTAS(31, :ID);
    if (COSTOS = 'A') then
        BEGIN
        FOR SELECT MAX(CTACOS), SUM(CANT * COSTO)
            FROM COSTO_VENTAS
            GROUP BY CTACOS
            INTO :CTACOSTOS, :MONTO
        DO
            BEGIN
            if (MONTO <> 0) then
                BEGIN
                CUENTA = NULL;
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :CTACOSTOS INTO :CUENTA, :TIPOCUEN;
                IF (CUENTA IS NULL) THEN
                    begin
                    EXCEPTION CUENTA_NO_EXISTE 'La cuenta ' || :ctacostos || ' no existe.';
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT ARTI_COD, CANT * COSTO
                        FROM COSTO_VENTAS
                        WHERE CTACOS = :CUENTA
                        INTO :ART, :MONTO
                    DO
                        BEGIN
                        SELECT COUNT(*) FROM COMPROBANTE_DETALLE WHERE CUEN_COD = :CUENTA AND ENCO_CONSEC = :IDC AND ARTI_COD = :ART INTO :NUMROWS;
                        if (NUMROWS = 0) then
                            BEGIN
                            INSERT INTO comprobante_detalle (ENCO_CONSEC, CODE_ITEM, CUEN_COD, CODE_CONCEPTO, CODE_REFER, CODE_DEBITO, CODE_CREDITO, CODE_BASE, CODE_PORC, TERC_NIT, PROY_COD, CENT_COD, CNDE_DOCNUMERO, CNDE_DOCAPLICA, DOCO_VENCE, ARTI_COD, CODE_TIPOAPL, CODE_TIPONUE)
                                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                            NROI = NROI + 1;
                            END
                        ELSE
                            UPDATE COMPROBANTE_DETALLE
                                SET CODE_DEBITO = :MONTO
                            WHERE CUEN_COD = :CUENTA AND ENCO_CONSEC = :IDC AND ARTI_COD = :ART;
                        END
                    END
                ELSE
                    BEGIN
                    SELECT COUNT(*) FROM COMPROBANTE_DETALLE WHERE CUEN_COD = :CUENTA AND ENCO_CONSEC = :IDC INTO :NUMROWS;
                    if (NUMROWS = 0) then
                        BEGIN
                        if (TIPOCUEN = 'C') then
                            INSERT INTO comprobante_detalle (ENCO_CONSEC, CODE_ITEM, CUEN_COD, CODE_CONCEPTO, CODE_REFER, CODE_DEBITO, CODE_CREDITO, CODE_BASE, CODE_PORC, TERC_NIT, PROY_COD, CENT_COD, CNDE_DOCNUMERO, CNDE_DOCAPLICA, DOCO_VENCE, ARTI_COD, CODE_TIPOAPL, CODE_TIPONUE)
                                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                        ELSE
                            INSERT INTO comprobante_detalle (ENCO_CONSEC, CODE_ITEM, CUEN_COD, CODE_CONCEPTO, CODE_REFER, CODE_DEBITO, CODE_CREDITO, CODE_BASE, CODE_PORC, TERC_NIT, PROY_COD, CENT_COD, CNDE_DOCNUMERO, CNDE_DOCAPLICA, DOCO_VENCE, ARTI_COD, CODE_TIPOAPL, CODE_TIPONUE)
                                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NROI = NROI + 1;
                        END
                    ELSE
                        UPDATE COMPROBANTE_DETALLE
                            SET CODE_DEBITO = :MONTO
                        WHERE CUEN_COD = :CUENTA AND ENCO_CONSEC = :IDC;
                    END
                END /* MONTO <> 0 */
            END /* FOR */
        END /* COSTOS */
    if (COSTOS = 'K') then
        BEGIN
        SELECT SUM(CANT * COSTO)
            FROM COSTO_VENTAS
            INTO :MONTO;
        if (MONTO <> 0) then
            BEGIN
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTACOSTOS INTO :CUENTA, :TIPOCUEN;
            IF (CUENTA IS NULL) THEN
                begin
                EXCEPTION CUENTA_NO_EXISTE 'La cuenta ' || :ctacostos || ' no existe.';
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, REGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT ARTI_COD, CANT * COSTO
                    FROM COSTO_VENTAS
                    INTO :ART, :MONTO
                DO
                    BEGIN
                    SELECT COUNT(*) FROM COMPROBANTE_DETALLE WHERE CUEN_COD = :CUENTA AND ENCO_CONSEC = :IDC AND ARTI_COD = :ART INTO :NUMROWS;
                    if (NUMROWS = 0) then
                        BEGIN
                            INSERT INTO comprobante_detalle (ENCO_CONSEC, CODE_ITEM, CUEN_COD, CODE_CONCEPTO, CODE_REFER, CODE_DEBITO, CODE_CREDITO, CODE_BASE, CODE_PORC, TERC_NIT, PROY_COD, CENT_COD, CNDE_DOCNUMERO, CNDE_DOCAPLICA, DOCO_VENCE, ARTI_COD, CODE_TIPOAPL, CODE_TIPONUE)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        END
                    ELSE
                        UPDATE COMPROBANTE_DETALLE
                            SET CODE_DEBITO = :MONTO
                        WHERE CUEN_COD = :CUENTA AND ENCO_CONSEC = :IDC AND ARTI_COD = :ART;
                    END
                END
            ELSE
                BEGIN
                SELECT COUNT(*) FROM COMPROBANTE_DETALLE WHERE CUEN_COD = :CUENTA AND ENCO_CONSEC = :IDC INTO :NUMROWS;
                if (NUMROWS = 0) then
                    BEGIN
                    if (TIPOCUEN = 'C') then
                        INSERT INTO comprobante_detalle (ENCO_CONSEC, CODE_ITEM, CUEN_COD, CODE_CONCEPTO, CODE_REFER, CODE_DEBITO, CODE_CREDITO, CODE_BASE, CODE_PORC, TERC_NIT, PROY_COD, CENT_COD, CNDE_DOCNUMERO, CNDE_DOCAPLICA, DOCO_VENCE, ARTI_COD, CODE_TIPOAPL, CODE_TIPONUE)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    ELSE
                        INSERT INTO comprobante_detalle (ENCO_CONSEC, CODE_ITEM, CUEN_COD, CODE_CONCEPTO, CODE_REFER, CODE_DEBITO, CODE_CREDITO, CODE_BASE, CODE_PORC, TERC_NIT, PROY_COD, CENT_COD, CNDE_DOCNUMERO, CNDE_DOCAPLICA, DOCO_VENCE, ARTI_COD, CODE_TIPOAPL, CODE_TIPONUE)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    END
                ELSE
                    UPDATE COMPROBANTE_DETALLE
                        SET CODE_DEBITO = :MONTO
                    WHERE CUEN_COD = :CUENTA AND ENCO_CONSEC = :IDC;
                END
            END /* MONTO <> 0 */
        END /* COSTOS = K */
    if (INVEN = 'A') then
        BEGIN
        FOR SELECT MAX(CTAINV), SUM(CANT * COSTO)
            FROM COSTO_VENTAS
            GROUP BY CTAINV
            INTO :CTAINVEN, :MONTO
        DO
            BEGIN
            if (MONTO <> 0) then
                BEGIN
                CUENTA = NULL;
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :CTAINVEN INTO :CUENTA, :TIPOCUEN;
                IF (CUENTA IS NULL) THEN
                    begin
                    EXCEPTION CUENTA_NO_EXISTE 'La cuenta ' || :ctainven || ' no existe.';
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, REGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT ARTI_COD, CANT * COSTO
                        FROM COSTO_VENTAS
                        WHERE CTAINV = :CUENTA
                        INTO :ART, :MONTO
                    DO
                        BEGIN
                        SELECT COUNT(*) FROM COMPROBANTE_DETALLE WHERE CUEN_COD = :CUENTA AND ENCO_CONSEC = :IDC AND ARTI_COD = :ART INTO :NUMROWS;
                        if (NUMROWS = 0) then
                            BEGIN
                            INSERT INTO comprobante_detalle (ENCO_CONSEC, CODE_ITEM, CUEN_COD, CODE_CONCEPTO, CODE_REFER, CODE_DEBITO, CODE_CREDITO, CODE_BASE, CODE_PORC, TERC_NIT, PROY_COD, CENT_COD, CNDE_DOCNUMERO, CNDE_DOCAPLICA, DOCO_VENCE, ARTI_COD, CODE_TIPOAPL, CODE_TIPONUE)
                                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                            NROI = NROI + 1;
                            END
                        ELSE
                            UPDATE COMPROBANTE_DETALLE
                                SET CODE_CREDITO = :MONTO
                            WHERE CUEN_COD = :CUENTA AND ENCO_CONSEC = :IDC AND ARTI_COD = :ART;
                        END
                    END
                ELSE
                    BEGIN
                    SELECT COUNT(*) FROM COMPROBANTE_DETALLE WHERE CUEN_COD = :CUENTA AND ENCO_CONSEC = :IDC INTO :NUMROWS;
                    if (NUMROWS = 0) then
                        BEGIN
                        if (TIPOCUEN = 'C') then
                            INSERT INTO comprobante_detalle (ENCO_CONSEC, CODE_ITEM, CUEN_COD, CODE_CONCEPTO, CODE_REFER, CODE_DEBITO, CODE_CREDITO, CODE_BASE, CODE_PORC, TERC_NIT, PROY_COD, CENT_COD, CNDE_DOCNUMERO, CNDE_DOCAPLICA, DOCO_VENCE, ARTI_COD, CODE_TIPOAPL, CODE_TIPONUE)
                                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                        ELSE
                            INSERT INTO comprobante_detalle (ENCO_CONSEC, CODE_ITEM, CUEN_COD, CODE_CONCEPTO, CODE_REFER, CODE_DEBITO, CODE_CREDITO, CODE_BASE, CODE_PORC, TERC_NIT, PROY_COD, CENT_COD, CNDE_DOCNUMERO, CNDE_DOCAPLICA, DOCO_VENCE, ARTI_COD, CODE_TIPOAPL, CODE_TIPONUE)
                                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NROI = NROI + 1;
                        END
                    ELSE
                        UPDATE COMPROBANTE_DETALLE
                            SET CODE_CREDITO = :MONTO
                        WHERE CUEN_COD = :CUENTA AND ENCO_CONSEC = :IDC;
                    END
                END /* MONTO <> 0 */
            END /* FOR */
        END /* INVEN = A */
    if (INVEN = 'K') then
        BEGIN
        SELECT SUM(CANT * COSTO)
            FROM COSTO_VENTAS
            INTO :MONTO;
        if (MONTO <> 0) then
            BEGIN
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTAINVEN INTO :CUENTA, :TIPOCUEN;
            IF (CUENTA IS NULL) THEN
                begin
                EXCEPTION CUENTA_NO_EXISTE 'La cuenta ' || :ctainven || ' no existe.';
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT ARTI_COD, CANT * COSTO
                    FROM COSTO_VENTAS
                    INTO :ART, :MONTO
                DO
                    BEGIN
                    SELECT COUNT(*) FROM COMPROBANTE_DETALLE WHERE CUEN_COD = :CUENTA AND ENCO_CONSEC = :IDC AND ARTI_COD = :ART INTO :NUMROWS;
                    if (NUMROWS = 0) then
                        BEGIN
                        INSERT INTO comprobante_detalle (ENCO_CONSEC, CODE_ITEM, CUEN_COD, CODE_CONCEPTO, CODE_REFER, CODE_DEBITO, CODE_CREDITO, CODE_BASE, CODE_PORC, TERC_NIT, PROY_COD, CENT_COD, CNDE_DOCNUMERO, CNDE_DOCAPLICA, DOCO_VENCE, ARTI_COD, CODE_TIPOAPL, CODE_TIPONUE)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        END
                    ELSE
                        UPDATE COMPROBANTE_DETALLE
                            SET CODE_CREDITO = :MONTO
                        WHERE CUEN_COD = :CUENTA AND ENCO_CONSEC = :IDC AND ARTI_COD = :ART;
                    END
                END
            ELSE
                BEGIN
                SELECT COUNT(*) FROM COMPROBANTE_DETALLE WHERE CUEN_COD = :CUENTA AND ENCO_CONSEC = :IDC INTO :NUMROWS;
                if (NUMROWS = 0) then
                    BEGIN
                    if (TIPOCUEN = 'C') then
                        INSERT INTO comprobante_detalle (ENCO_CONSEC, CODE_ITEM, CUEN_COD, CODE_CONCEPTO, CODE_REFER, CODE_DEBITO, CODE_CREDITO, CODE_BASE, CODE_PORC, TERC_NIT, PROY_COD, CENT_COD, CNDE_DOCNUMERO, CNDE_DOCAPLICA, DOCO_VENCE, ARTI_COD, CODE_TIPOAPL, CODE_TIPONUE)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    ELSE
                        INSERT INTO comprobante_detalle (ENCO_CONSEC, CODE_ITEM, CUEN_COD, CODE_CONCEPTO, CODE_REFER, CODE_DEBITO, CODE_CREDITO, CODE_BASE, CODE_PORC, TERC_NIT, PROY_COD, CENT_COD, CNDE_DOCNUMERO, CNDE_DOCAPLICA, DOCO_VENCE, ARTI_COD, CODE_TIPOAPL, CODE_TIPONUE)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    END
                ELSE
                    UPDATE COMPROBANTE_DETALLE
                        SET CODE_CREDITO = :MONTO
                    WHERE CUEN_COD = :CUENTA AND ENCO_CONSEC = :IDC;
                END
            END /* MONTO <> 0 */
        END /* INVEN = K */
    END
  END
end

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE CONTABIL_DEVOLCLI(
    IDDOC INTEGER,
    IDINTER INTEGER)
RETURNS (
    ERROR INTEGER,
    VER CHAR(1),
    IDC INTEGER)
AS
declare variable PREF VARCHAR(4);
declare variable NUM VARCHAR(6);
declare variable NUMERO VARCHAR(10);
declare variable FECAUX DATE;
declare variable FECHA CHAR(8);
declare variable CONC CHAR(120);
declare variable NUMFAC VARCHAR(10);
declare variable VRDTO NUMERIC(18, 2);
declare variable VRADIC NUMERIC(18, 2);
declare variable VRSUBT NUMERIC(18, 2);
declare variable VRIVA NUMERIC(18, 2);
declare variable PRTFTE NUMERIC(9, 2);
declare variable VRRTFTE NUMERIC(18, 2);
declare variable VRRTIVA NUMERIC(18, 2);
declare variable PRTICA NUMERIC(9, 2);
declare variable VRRTICA NUMERIC(18, 2);
declare variable VRTOTAL NUMERIC(18, 2);
declare variable VREXTRA NUMERIC(18, 2);
declare variable TIPOCOMP VARCHAR(3);
declare variable PREFCONT VARCHAR(4);
declare variable VENTAS CHAR(1);
declare variable CTAVENTAS VARCHAR(20);
declare variable IVA CHAR(1);
declare variable CTAIVA VARCHAR(20);
declare variable CONSUMO CHAR(1);
declare variable CTACONSUMO VARCHAR(20);
declare variable CARTERA CHAR(1);
declare variable CTACARTERA VARCHAR(20);
declare variable RTFTE CHAR(1);
declare variable CTARTFTE VARCHAR(20);
declare variable RTIVA CHAR(1);
declare variable CTARTIVA VARCHAR(20);
declare variable RTICA CHAR(1);
declare variable CTARTICA VARCHAR(20);
declare variable INVEN CHAR(1);
declare variable CTAINVEN VARCHAR(20);
declare variable COSTOS CHAR(1);
declare variable CTACOSTOS VARCHAR(20);
declare variable CTADTO VARCHAR(20);
declare variable CTAADIC VARCHAR(20);
declare variable CTAEXTRA VARCHAR(20);
declare variable EXISTE CHAR(1);
declare variable CUENTA VARCHAR(20);
declare variable MONTO NUMERIC(18,2);
declare variable TIPOCUEN CHAR(1);
declare variable NIT VARCHAR(20);
declare variable PROY VARCHAR(4);
declare variable CENTRO VARCHAR(4);
declare variable PORC NUMERIC(5,2);
declare variable DEBITO NUMERIC(18,2);
declare variable CREDITO NUMERIC(18,2);
declare variable NROI INTEGER;
declare variable ART VARCHAR(15);
declare variable IMPINC CHAR(1);
declare variable IMPTOS NUMERIC(18, 2);
declare variable SUMA NUMERIC(18,2);
declare variable PORCIVA NUMERIC(9,2);
declare variable TCTACLIEN VARCHAR(20);
declare variable TCTAVENTA VARCHAR(20);
declare variable TCTARTFTE VARCHAR(20);
declare variable TCTARTIVA VARCHAR(20);
declare variable TCTARTICA VARCHAR(20);
declare variable CTADIC VARCHAR(20);
declare variable BASEADIC VARCHAR(20);
declare variable PORCADIC NUMERIC(5,2);
declare variable VALORADIC NUMERIC(18,2);
declare variable DBADIC CHAR(1);
declare variable PTOVTA INTEGER;
declare variable ANULADO CHAR(1);
declare variable CENT CHAR(1);
DECLARE VARIABLE MERCANCIA NUMERIC(18,2);
declare variable FACTOR DOUBLE PRECISION;
declare variable DIG INTEGER;
DECLARE VARIABLE FOMENTO VARCHAR(2);
DECLARE VARIABLE VRCONSUMO NUMERIC(18,2);
declare variable AUTORET VARCHAR(10);
declare variable FAUTORET DATE;
declare variable IDREM INTEGER;
declare variable DTOXIT CHAR(2);
declare variable ERRORC INTEGER;
BEGIN
EXECUTE PROCEDURE LEE_CONFIGURACION('COMPRAS', 'FACTURAS', 'USAR IMPOCONSUMO COMO PORCENTAJE DE FOMENTO') returning_values (FOMENTO);
EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'FECHA AUTORETENEDOR NO DESCONTAR RETENCIONES DEL SALDO PERO SI CONTABILIZARLAS') returning_values (AUTORET);
if (AUTORET <> '') then
    FAUTORET = CAST(AUTORET AS DATE);
else
    FAUTORET = '9999/12/31';
  /* BUSQUE LA INTERFACE */
  EXISTE = 'N';
  SELECT 'S', TICO_COD, PRCO_PRE, INVE_VENTAS, INVE_IVA, INVE_CONSUMO, INVE_CARTERA, INVE_RTFTE, INVE_RTIVA, INVE_RTICA, INVE_COSTO, INVE_INVEN, INVE_CTAVENTAS, INVE_CTAIVA, INVE_CTACONSUMO, INVE_CTADTO, INVE_CTAADIC, INVE_CTAEXTRA, INVE_CTACARTERA, INVE_CTARTFTE, INVE_CTARTIVA, INVE_CTARTICA, INVE_CTAINVEN, INVE_CTACOSTOS, INVE_CONFIRMAR, INVE_CENTRO
    FROM INTERFAZ_VENTAS
    WHERE INVE_ID = :IDINTER
    INTO :EXISTE, :TIPOCOMP, :PREFCONT, :VENTAS, :IVA, :CONSUMO, :CARTERA, :RTFTE, :RTIVA, :RTICA, :COSTOS, :INVEN, :CTAVENTAS, :CTAIVA, :CTACONSUMO, :CTADTO, :CTAADIC, :CTAEXTRA, :CTACARTERA, :CTARTFTE, :CTARTIVA, :CTARTICA, :CTAINVEN, :CTACOSTOS, :VER, :CENT;
  if (EXISTE = 'S') then
   BEGIN
    /* BORRE CUALQUEIR CONTABILIZACION PREVIA */
    DELETE FROM CONTABILIZACION WHERE CNTB_TIPOREF = 33 AND CNTB_IDREF = :IDDOC;
    /* TRAIGA EL ENCABEZADO DE LA DEVOLUCION */
   SELECT PREF_PRE, DEVT_NUMERO, DEVT_FECHA, F.TERC_NIT, DEVT_IVAINC, PTVT_ID, DEVT_FACTURA, DEVT_DTOMONTO, DEVT_ADICIONAL, DEVT_IVAMONTO, DEVT_EXTRA, DEVT_TOTAL, DEVT_RTFTEPORC, DEVT_RTFTEMONTO, DEVT_RTIVAPORC, DEVT_RTIVAMONTO, DEVT_RTICAPORC, DEVT_RTICAMONTO, TERC_CTARTFTE, TERC_CTARTIVA, TERC_CTARTICA, TERC_CTAVENTA, TERC_CTACLIENTE, DEVT_ANULADO, DEVT_REMID
        FROM DEVOLUCIONES_VENTAS F, TERCEROS T
        WHERE DEVT_ID = :IDDOC AND F.TERC_NIT = T.TERC_NIT
        INTO :PREF, :NUM, :FECAUX, :NIT, :IMPINC, :PTOVTA, :NUMFAC, :VRDTO, :VRADIC, :VRIVA, :VREXTRA, :VRTOTAL, :PRTFTE, :VRRTFTE, :PORC, :VRRTIVA, :PRTICA, :VRRTICA, :TCTARTFTE, TCTARTIVA, TCTARTICA, TCTAVENTA, TCTACLIEN, ANULADO, :IDREM;
   if (idrem is null) Then
    IDREM = 0;
   if ((ANULADO = 'N') AND (IDREM = 0)) then
    BEGIN
    NUMERO = PREF || NUM;
    SELECT SUM(DVDE_CONSUMO) FROM devoluciones_ventas_detalle WHERE DEVT_ID = :iddoc AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL)) INTO :MERCANCIA;
    VRSUBT = VRTOTAL - VREXTRA - VRIVA - MERCANCIA; /* BASE DE RETEFTE Y RETEICA */
    EXECUTE PROCEDURE lee_configuracion ('FACTURACION', 'DEVOLUCIONES', 'DESCUENTO PIE DEVOLUCION IGUAL A SUMA DE DESCUENTOS POR ITEM') returning_values (:DTOXIT);
    if (DTOXIT = 'SI') then
        VRDTO = 0;
    MERCANCIA = VRSUBT - VRADIC + VRDTO;
    IF (CENT = 'B') THEN
        SELECT B.BODE_CENTRO, B.BODE_PROY FROM BODEGA B, DEVOLUCIONES_VENTAS F
            WHERE B.BODE_COD = F.BODE_COD AND F.DEVT_ID = :IDDOC INTO :CENTRO, :PROY;
    IF (CENT = 'V') THEN
        SELECT V.CENT_COD, V.PROY_COD FROM VENDEDORES V, DEVOLUCIONES_VENTAS F
            WHERE V.VEND_COD = F.VEND_COD AND F.DEVT_ID = :IDDOC INTO :CENTRO, :PROY;
    IF (CENT = 'P') THEN
        SELECT P.PREF_CENTRO,P.PREF_PROY  FROM PREFIJOS P, DEVOLUCIONES_VENTAS F
            WHERE P.PREF_PRE = F.PREF_PRE AND F.DEVT_ID = :IDDOC AND P.TIDO_COD = 33 INTO :CENTRO, :PROY;
    EXECUTE PROCEDURE FECHA_A_CONTA(:FECAUX) returning_values (:FECHA);
    /* REGISTRE EL ENCABEZADO CONTABLE */
    IDC = GEN_ID(ID_CONTABILIZA, 1);
    CONC = 'DEVOLUCION VENTAS No. ' || NUMERO || ' EN FACTURA ' || NUMFAC;
    CONC = SUBSTR(CONC, 1, 60);
    INSERT INTO CONTABILIZACION (CNTB_ID, CNTB_TIPOCOMP, CNTB_PREFCNT, CNTB_NUMERO, CNTB_FECHA, CNTB_CONCEPTO, CNTB_REF, CNTB_TIPOREF, CNTB_IDREF, CNTB_PREFREF, CNTB_NUMREF, CNTB_PROCESADO)
        VALUES (:IDC, :TIPOCOMP, :PREFCONT, :NUM, :FECHA, :CONC, '', 33, :IDDOC, :PREF, :NUM, 'N');
    NROI = 0;
    SUMA = 0;
    ERROR = 0;
    /* SI NO HAY CUENTA DE DESCUENTO NI ADICIONAL CALCULE UN FACTOR PARA LAS VENTAS Y EL IVA */
    if (MERCANCIA <> 0) then
        FACTOR = CAST(VRSUBT AS DOUBLE PRECISION) / CAST(MERCANCIA AS DOUBLE PRECISION);
    ELSE
        FACTOR = 1;
    /* TRAIGA EL NUMERO DE DIGITOS PARA EL REDONDEO */
    SELECT CAST(CONF_VALOR AS INTEGER) FROM CONFIGURACION WHERE CONF_MODULO = 'FACTURACION' AND
        CONF_CATEGORIA = 'GENERAL' AND CONF_PROPIEDAD = 'REDONDEO AL MULTIPLO DE DIEZ EN TOTALES' INTO :DIG;
    /* CUENTAS DE VENTAS */
    if (VENTAS = 'A') then
        BEGIN
        FOR SELECT MAX(COAR_CTADEV), SUM(cast(DVDE_CANT as double precision) * (DVDE_PRUNIT-DVDE_DTOMONTO)), SUM(DVDE_IVAMONTO), SUM(DVDE_CONSUMO)
            FROM ARTICULO A, CONTABIL_ARTICULO C, DEVOLUCIONES_VENTAS_DETALLE F
            WHERE F.DEVT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
            GROUP BY COAR_CTADEV
            INTO :CTAVENTAS, :MONTO, :IMPTOS, :VRCONSUMO
            DO
            BEGIN
            if (IMPINC = 'S') then
                if (FOMENTO = 'SI') then
                    MONTO = MONTO - IMPTOS;
                ELSE
                    MONTO = MONTO - IMPTOS - VRCONSUMO;
            ELSE
            if (FOMENTO = 'SI') then
            MONTO = MONTO + VRCONSUMO;
            if ((CTADTO IS NULL) OR (CTADTO = '')) then
                MONTO = MONTO * FACTOR;
            execute procedure redondee(MONTO, DIG) returning_values (MONTO);
            if (MONTO <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTAVENTAS, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT F.ARTI_COD, (cast(DVDE_CANT as double precision) * (DVDE_PRUNIT-DVDE_DTOMONTO)), (DVDE_IVAMONTO+DVDE_CONSUMO)
                        FROM ARTICULO A, CONTABIL_ARTICULO C, DEVOLUCIONES_VENTAS_DETALLE F
                        WHERE F.DEVT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTAINV = :CUENTA AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
                        INTO :ART, :MONTO, :IMPTOS
                    DO
                        BEGIN
                        if (IMPINC = 'S') then
                            MONTO = MONTO - IMPTOS;
                        if ((CTADTO IS NULL) OR (CTADTO = '')) then
                            MONTO = MONTO * FACTOR;
                        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        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, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                    NROI = NROI + 1;
                    SUMA = SUMA + MONTO;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA + MONTO;
                    END
                END /* MONTO <> 0 */
            END /* FOR */
        END /* VENTAS X ARTICULO */
     IF ((VENTAS = 'C') OR (VENTAS = 'K')) THEN
        BEGIN
        IF (VENTAS = 'C') THEN
            CTAVENTAS = TCTAVENTA;
        SELECT SUM(cast(DVDE_CANT as double precision) * (DVDE_PRUNIT-DVDE_DTOMONTO)), SUM(DVDE_IVAMONTO), SUM(DVDE_CONSUMO)
            FROM DEVOLUCIONES_VENTAS_DETALLE F
            WHERE F.DEVT_ID = :IDDOC  AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
            INTO :MONTO, :IMPTOS, :VRCONSUMO;
        if (IMPINC = 'S') then
            if (FOMENTO = 'SI') then
               MONTO = MONTO - IMPTOS;
            ELSE
               MONTO = MONTO - IMPTOS - VRCONSUMO;
        ELSE
         if (FOMENTO = 'SI') then
          MONTO = MONTO + VRCONSUMO;
        if ((CTADTO IS NULL) OR (CTADTO = '')) then
            MONTO = MONTO * FACTOR;
        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
        if (MONTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTAVENTAS, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT F.ARTI_COD, (cast(DVDE_CANT as double precision) * (DVDE_PRUNIT-DVDE_DTOMONTO)), (DVDE_IVAMONTO+DVDE_CONSUMO)
                    FROM ARTICULO A, DEVOLUCIONES_VENTAS_DETALLE F
                    WHERE F.DEVT_ID = :IDDOC AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
                    INTO :ART, :MONTO, :IMPTOS
                    DO
                    BEGIN
                    if (IMPINC = 'S') then
                        MONTO = MONTO - IMPTOS;
                    if ((CTADTO IS NULL) OR (CTADTO = '')) then
                        MONTO = MONTO * FACTOR;
                    execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                    NROI = NROI + 1;
                    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, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                NROI = NROI + 1;
                SUMA = SUMA + MONTO;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA + MONTO;
                END
            END /* MONTO <> 0 */
        END /* VENTAS DE CLIENTE O CONSTANTE */
    /* EL IVA EN VENTAS */
    if (IVA = 'A') then
        BEGIN
        FOR SELECT MAX(COAR_CTAIVAV), SUM(DVDE_IVAMONTO), SUM(DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO), SUM(DVDE_CONSUMO)
            FROM ARTICULO A, CONTABIL_ARTICULO C, DEVOLUCIONES_VENTAS_DETALLE F
            WHERE F.DEVT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
            GROUP BY COAR_CTAIVAV
            INTO :CTAIVA, :IMPTOS, :MONTO, :VALORADIC
        DO
            BEGIN
            if (FOMENTO = 'SI') then
                MONTO = MONTO + VALORADIC;
            MONTO = MONTO * -1;
            MONTO = MONTO * FACTOR;
            IMPTOS = IMPTOS * FACTOR;
            execute procedure redondee(MONTO, DIG) returning_values (MONTO);
            execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
            if (IMPTOS <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTAIVA, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT F.ARTI_COD, DVDE_IVAMONTO, (cast(DVDE_CANT as double precision) * (DVDE_PRUNIT-DVDE_DTOMONTO)), TAIV_PORC, DVDE_CONSUMO
                        FROM ARTICULO A, CONTABIL_ARTICULO C, DEVOLUCIONES_VENTAS_DETALLE F, TARIFA_IVA T
                        WHERE F.DEVT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND A.TAIV_COD = T.TAIV_COD AND COAR_CTAIVAV = :CUENTA AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
                        INTO :ART, :IMPTOS, :MONTO, :PORCIVA, :VALORADIC
                    DO
                        BEGIN
                        if (IMPINC = 'S') then
                            MONTO = MONTO - IMPTOS - VALORADIC;
                        MONTO = MONTO * -1;
                        MONTO = MONTO * FACTOR;
                        IMPTOS = IMPTOS * FACTOR;
                        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                        execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                        if (IMPTOS <> 0) then
                            BEGIN
                            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :IMPTOS, 0, :MONTO, :PORCIVA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                            NROI = NROI + 1;
                            SUMA = SUMA + IMPTOS;
                            END
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                    NROI = NROI + 1;
                    SUMA = SUMA + IMPTOS;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA + IMPTOS;
                    END
                END   /* IMPTOS <> 0 */
            END /* FOR */
        END /* IVA X ARTICULO */
    if (IVA = 'K') then /* IVA EN CTA CONSTANTE */
        BEGIN
        SELECT SUM(DVDE_IVAMONTO), SUM(DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO), SUM(DVDE_CONSUMO)
            FROM DEVOLUCIONES_VENTAS_DETALLE F
            WHERE F.DEVT_ID = :IDDOC  AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
            INTO :IMPTOS, :MONTO, :VALORADIC;
        if (FOMENTO = 'SI') then
            MONTO = MONTO + VALORADIC;
        MONTO = MONTO * -1;
        MONTO = MONTO * FACTOR;
        IMPTOS = IMPTOS * FACTOR;
        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
        execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
        if (IMPTOS <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTAIVA, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT F.ARTI_COD, (cast(DVDE_CANT as double precision) * (DVDE_PRUNIT-DVDE_DTOMONTO)), DVDE_IVAMONTO, TAIV_PORC, DVDE_CONSUMO
                    FROM ARTICULO A, DEVOLUCIONES_VENTAS_DETALLE F, TARIFA_IVA T
                    WHERE F.DEVT_ID = :IDDOC AND A.TAIV_COD = T.TAIV_COD AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
                    INTO :ART, :MONTO, :IMPTOS, :PORCIVA, :VALORADIC
                    DO
                    BEGIN
                    if (IMPINC = 'S') then
                        MONTO = MONTO - IMPTOS - VALORADIC;
                    MONTO = MONTO * -1;
                    MONTO = MONTO * FACTOR;
                    IMPTOS = IMPTOS * FACTOR;
                    execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                    execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                    if (IMPTOS <> 0) then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', :IMPTOS, 0, :MONTO, :PORCIVA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        SUMA = SUMA + IMPTOS;
                        END
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                NROI = NROI + 1;
                SUMA = SUMA + IMPTOS;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA + IMPTOS;
                END
            END /* IMPTOS <> 0 */
        END /* IVA EN CTA CONSTANTE */
    /* EL IMPOCONSUMO */
    if ((CONSUMO = 'A') AND (FOMENTO <> 'SI')) then
        BEGIN
        FOR SELECT MAX(COAR_CTACONS), SUM(DVDE_CONSUMO)
            FROM ARTICULO A, CONTABIL_ARTICULO C, DEVOLUCIONES_VENTAS_DETALLE F
            WHERE F.DEVT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
            GROUP BY COAR_CTACONS
            INTO :CTACONSUMO, :IMPTOS
        DO
            BEGIN
            if (IMPTOS <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTACONSUMO, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, REGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT F.ARTI_COD, DVDE_CONSUMO
                        FROM ARTICULO A, CONTABIL_ARTICULO C, DEVOLUCIONES_VENTAS_DETALLE F
                        WHERE F.DEVT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTACONS = :CUENTA AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
                        INTO :ART, :IMPTOS
                    DO
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 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, :NROI, :CUENTA, :CONC, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                    NROI = NROI + 1;
                    SUMA = SUMA + IMPTOS;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA + IMPTOS;
                    END
                END /* IMPTOS <> 0 */
            END /* FOR */
        END /* CONSUMO X ARTICULO */
    if ((CONSUMO = 'K') AND (FOMENTO <> 'SI')) then
        BEGIN
        SELECT SUM(DVDE_CONSUMO)
            FROM DEVOLUCIONES_VENTAS_DETALLE F
            WHERE F.DEVT_ID = :IDDOC AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
            INTO :IMPTOS;
        if (IMPTOS <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTACONSUMO, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT F.ARTI_COD, DVDE_CONSUMO
                    FROM ARTICULO A, DEVOLUCIONES_VENTAS_DETALLE F
                    WHERE F.DEVT_ID = :IDDOC  AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
                    INTO :ART, :IMPTOS
                    DO
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTACONSUMO, :CONC, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                    NROI = NROI + 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, :NROI, :CTACONSUMO, :CONC, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA + IMPTOS;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTACONSUMO, :CONC, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA + IMPTOS;
                END
            END /* IMPTOS <> 0 */
        END /* CONSUMO EN CTA CONSTANTE */
    /* DESCUENTO */
    if ((CTADTO IS NOT NULL) AND
        (CTADTO <> '') AND
        (VRDTO <> 0)) THEN
        BEGIN
        EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTADTO, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRDTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
            NROI = NROI + 1;
            SUMA = SUMA - VRDTO;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRDTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 33);
            NROI = NROI + 1;
            SUMA = SUMA - VRDTO;
            END
        END /* DESCUENTO */
    /* VALOR ADIC */
    if ((CTAADIC IS NOT NULL) AND
        (CTAADIC <> '') AND
        (VRADIC <> 0)) THEN
        BEGIN
        EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTAADIC, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRADIC, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
            NROI = NROI + 1;
            SUMA = SUMA + VRADIC;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRADIC, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 33);
            NROI = NROI + 1;
            SUMA = SUMA + VRADIC;
            END
        END /* VR. ADIC */
    /* VALOR EXTRA */
    if ((CTAEXTRA IS NOT NULL) AND
        (CTAEXTRA <> '') AND
        (VREXTRA <> 0)) THEN
        BEGIN
        EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTAEXTRA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VREXTRA, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
            NROI = NROI + 1;
            SUMA = SUMA + VREXTRA;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VREXTRA, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 33);
            NROI = NROI + 1;
            SUMA = SUMA + VREXTRA;
            END
        END /* VR. EXTRA */
    /* RETENCION FUENTE */
    if ((RTFTE = 'C') or (RTFTE = 'K')) then
      if (VRRTFTE <> 0) then
        BEGIN
        if (RTFTE = 'C') then
            CTARTFTE = TCTARTFTE;
        EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTARTFTE, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, (:VRSUBT*-1), :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
            NROI = NROI + 1;
            SUMA = SUMA - VRRTFTE;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, (:VRSUBT*-1), :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA - VRRTFTE;
            END
        /* AUTORETENCION */
        if (FAUTORET <= fecaux) then
            BEGIN
            EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'CUENTA DE AUTORETENCION EN LA FUENTE') returning_values (CTARTFTE);
            EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTARTFTE, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :VRSUBT, :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                NROI = NROI + 1;
                SUMA = SUMA + VRRTFTE;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :VRSUBT, :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA + VRRTFTE;
                END
            END
        END /* RTFTE */
    if (RTFTE = 'A') then
      BEGIN
      FOR SELECT MAX(COAR_CTARTFTEV), MAX(COAR_RTFTE), MIN(COAR_RTBASE), SUM(DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO), SUM((DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO)*COAR_RTFTE)
        FROM CONTABIL_ARTICULO C, devoluciones_ventas_detalle F
        WHERE F.devt_id = :IDDOC AND F.ARTI_COD = C.ARTI_COD AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
        GROUP BY COAR_CTARTFTEV
        INTO :CTARTFTE, :PRTFTE, :baseadic, :MONTO, :VRRTFTE
        DO
        BEGIN
        MONTO = MONTO * FACTOR;
        if (MONTO >= BASEADIC) then
            BEGIN
            VRRTFTE = VRRTFTE * FACTOR / 100;
            execute procedure redondee(VRRTFTE, DIG) returning_values (VRRTFTE);
            execute procedure redondee(MONTO, DIG) returning_values (MONTO);
            if (VRRTFTE <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTARTFTE, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, (:MONTO*-1), :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                    NROI = NROI + 1;
                    SUMA = SUMA - VRRTFTE;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, (:MONTO*-1), :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA - VRRTFTE;
                    END
                /* AUTORETENCION */
                if (FAUTORET <= fecaux) then
                    BEGIN
                    EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'CUENTA DE AUTORETENCION EN LA FUENTE') returning_values (CTARTFTE);
                    EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTARTFTE, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
                    if (ERRORC <> 0) then
                        ERROR = ERROR + 1;
                    if (TIPOCUEN = 'C') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :MONTO, :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                        NROI = NROI + 1;
                        SUMA = SUMA + VRRTFTE;
                        END
                    if (TIPOCUEN = 'N') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :MONTO, :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NROI = NROI + 1;
                        SUMA = SUMA + VRRTFTE;
                        END
                    END
                END
            END
        END /* RTFTE */
      END
    /* RETENCION IVA */
    if ((RTIVA = 'C') or (RTIVA = 'K')) then
      if (VRRTIVA <> 0) then
        BEGIN
        if (RTIVA = 'C') then
            CTARTIVA = TCTARTIVA;
        EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTARTIVA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTIVA, (:VRIVA*-1), :PORC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
            NROI = NROI + 1;
            SUMA = SUMA - VRRTIVA;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTIVA, (:VRIVA*-1), :PORC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA - VRRTIVA;
            END
        END /* RTIVA */
    /* RETENCION DE ICA */
    if ((RTICA = 'C') or (RTICA = 'K')) then
      if (VRRTICA <> 0) then
        BEGIN
        if (RTICA = 'C') then
            CTARTICA = TCTARTICA;
        EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTARTICA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTICA, (:VRSUBT*-1), :PRTICA, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
            NROI = NROI + 1;
            SUMA = SUMA - VRRTICA;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTICA, (:VRSUBT*-1), :PRTICA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA - VRRTICA;
            END
        END /* RTICA */
    /* CIERRE EL COMPROBANTE CONTRA LA CUENTA DEL TERCERO O LA CONSTANTE */
    if ((SUMA <> 0) and ((CARTERA = 'C') or (CARTERA = 'K') or (CARTERA = 'J'))) then
        BEGIN
        if (SUMA < 0) then
            BEGIN
            DEBITO = SUMA * -1;
            CREDITO = 0;
            END
        ELSE
            BEGIN
            DEBITO = 0;
            CREDITO = SUMA;
            END
        if (CARTERA = 'C') then
            CTACARTERA = TCTACLIEN;
        if (CARTERA = 'J') then
            BEGIN
            /* BUSQUE LA CUENTA DE LA CAJA */
            SELECT CAJA_CUENTA FROM CAJAS C, PUNTO_VENTA P
                WHERE P.CAJA_ID = C.CAJA_ID AND PTVT_ID = :PTOVTA
                INTO :CTACARTERA;
            END
        EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTACARTERA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :DEBITO, :CREDITO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
        if (TIPOCUEN = 'N') then
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :DEBITO, :CREDITO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
        NROI = NROI + 1;
        END /* SUMA EN CARTERA */
    /* CALCULE COSTOS EN VENTAS */
    EXECUTE PROCEDURE COSTO_EN_VENTAS(33, :IDDOC);
    if (COSTOS = 'A') then
        BEGIN
        FOR SELECT MAX(CTACOS), SUM(cast(CANT as double precision) * COSTO)
            FROM COSTO_VENTAS
            GROUP BY CTACOS
            INTO :CTACOSTOS, :MONTO
        DO
            BEGIN
            if (MONTO <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTACOSTOS, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT ARTI_COD, cast(CANT as double precision) * COSTO
                        FROM COSTO_VENTAS
                        WHERE CTACOS = :CUENTA
                        INTO :ART, :MONTO
                    DO
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                    NROI = NROI + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    END
                END /* MONTO <> 0 */
            END /* FOR */
        END /* COSTOS */
    if (COSTOS = 'K') then
        BEGIN
        SELECT SUM(cast(CANT as double precision) * COSTO)
            FROM COSTO_VENTAS
            INTO :MONTO;
        if (MONTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTACOSTOS, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, REGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT ARTI_COD, cast(CANT as double precision) * COSTO
                    FROM COSTO_VENTAS
                    INTO :ART, :MONTO
                DO
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTACOSTOS, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                    NROI = NROI + 1;
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTACOSTOS, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                NROI = NROI + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTACOSTOS, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                END
            END /* MONTO <> 0 */
        END /* COSTOS = K */
    if (INVEN = 'A') then
        BEGIN
        FOR SELECT MAX(CTAINV), SUM(cast(CANT as double precision) * COSTO)
            FROM COSTO_VENTAS
            GROUP BY CTAINV
            INTO :CTAINVEN, :MONTO
        DO
            BEGIN
            if (MONTO <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTAINVEN, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, REGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT ARTI_COD, cast(CANT as double precision) * COSTO
                        FROM COSTO_VENTAS
                        WHERE CTAINV = :CUENTA
                        INTO :ART, :MONTO
                    DO
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                    NROI = NROI + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    END
                END /* MONTO <> 0 */
            END /* FOR */
        END /* INVEN = A */
    if (INVEN = 'K') then
        BEGIN
        SELECT SUM(cast(CANT as double precision) * COSTO)
            FROM COSTO_VENTAS
            INTO :MONTO;
        if (MONTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTAINVEN, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT ARTI_COD, cast(CANT as double precision) * COSTO
                    FROM COSTO_VENTAS
                    INTO :ART, :MONTO
                DO
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTAINVEN, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                    NROI = NROI + 1;
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAINVEN, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                NROI = NROI + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAINVEN, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                END
            END /* MONTO <> 0 */
        END /* INVEN = K */
    /* recorra las cuentas adicionales */
    FOR SELECT INVC_CUENTA, INVC_BASE, INVC_PORC, INVC_VALOR, INVC_DB
        FROM INTERFAZ_VENTAS_CTAS WHERE INVE_ID = :IDINTER
        INTO :CTADIC, :BASEADIC, :PORCADIC, :VALORADIC, :DBADIC
        DO
        BEGIN
        if (valoradic <> 0) then
            monto = valoradic;
        else
            BEGIN
            if (:BASEADIC = 'SUBTOTAL') then
                VALORADIC = vrsubt;
            if (:BASEADIC = 'DESCUENTO') then
                VALORADIC = VRDTO;
            if (:BASEADIC = 'IVA') then
                VALORADIC = VRIVA;
            if (:BASEADIC = 'ADICIONAL') then
                VALORADIC = VRADIC;
            if (:BASEADIC = 'EXTRA') then
                VALORADIC = VREXTRA;
            if (:BASEADIC = 'TOTAL') then
                VALORADIC = VRTOTAL;
            MONTO = VALORADIC * PORCADIC;
            END
        if (MONTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTADIC, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                if (DBADIC = 'S') then
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                ELSE
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                NROI = NROI + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                if (DBADIC = 'S') then
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                ELSE
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                END
            NROI = NROI + 1;
            END
        END
    if (error > 0) then
        ver = 'S';
    SUSPEND;
    END
   END /* EXISTE LA INTERFAZ */
  ELSE
    BEGIN
    EXECUTE PROCEDURE ERROR (33, :IDDOC, :PREF, 1);
    ERROR = ERROR + 1;
    VER = 'S';
    SUSPEND;
    END
END

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE CONTABIL_FACTURA(
    IDDOC INTEGER,
    IDINTER INTEGER)
RETURNS (
    ERROR INTEGER,
    VER CHAR(1),
    IDC INTEGER)
AS
declare variable pref varchar(4);
declare variable num varchar(6);
declare variable numero varchar(10);
declare variable fecaux date;
declare variable fecha char(8);
declare variable conc varchar(60);
declare variable venceaux date;
declare variable vence char(8);
declare variable vrdto numeric(18,2);
declare variable vradic numeric(18,2);
declare variable vrsubt numeric(18,2);
declare variable vriva numeric(18,2);
declare variable prtfte numeric(9,2);
declare variable vrrtfte numeric(18,2);
declare variable vrrtiva numeric(18,2);
declare variable prtica numeric(9,2);
declare variable vrrtica numeric(18,2);
declare variable vrtotal numeric(18,2);
declare variable vrextra numeric(18,2);
declare variable tipocomp varchar(3);
declare variable prefcont varchar(4);
declare variable ventas char(1);
declare variable ctaventas varchar(20);
declare variable iva char(1);
declare variable ctaiva varchar(20);
declare variable consumo char(1);
declare variable ctaconsumo varchar(20);
declare variable cartera char(1);
declare variable ctacartera varchar(20);
declare variable rtfte char(1);
declare variable ctartfte varchar(20);
declare variable rtiva char(1);
declare variable ctartiva varchar(20);
declare variable rtica char(1);
declare variable ctartica varchar(20);
declare variable inven char(1);
declare variable ctainven varchar(20);
declare variable costos char(1);
declare variable ctacostos varchar(20);
declare variable ctadto varchar(20);
declare variable ctaadic varchar(20);
declare variable ctaextra varchar(20);
declare variable existe char(1);
declare variable cuenta varchar(20);
declare variable monto numeric(18,2);
declare variable tipocuen char(1);
declare variable nit varchar(20);
declare variable nombre varchar(60);
declare variable proy varchar(4);
declare variable centro varchar(4);
declare variable porc numeric(5,2);
declare variable debito numeric(18,2);
declare variable credito numeric(18,2);
declare variable nroi integer;
declare variable art varchar(15);
declare variable imptos numeric(18,2);
declare variable suma numeric(18,2);
declare variable porciva numeric(9,2);
declare variable tctaclien varchar(20);
declare variable tctaventa varchar(20);
declare variable tctartfte varchar(20);
declare variable tctartiva varchar(20);
declare variable tctartica varchar(20);
declare variable ctadic varchar(20);
declare variable baseadic varchar(20);
declare variable porcadic numeric(5,2);
declare variable valoradic numeric(18,2);
declare variable dbadic char(1);
declare variable ptovta integer;
declare variable anulado char(1);
declare variable dig integer;
declare variable mercancia numeric(18,2);
declare variable fomento varchar(2);
declare variable DTOXIT varchar(2);
declare variable vrconsumo numeric(18,2);
declare variable factor double precision;
declare variable cent char(1);
declare variable AUTORET VARCHAR(10);
declare variable FAUTORET DATE;
declare variable ERRORC INTEGER;
BEGIN
EXECUTE PROCEDURE LEE_CONFIGURACION('COMPRAS', 'FACTURAS', 'USAR IMPOCONSUMO COMO PORCENTAJE DE FOMENTO') returning_values (FOMENTO);
EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'FECHA AUTORETENEDOR NO DESCONTAR RETENCIONES DEL SALDO PERO SI CONTABILIZARLAS') returning_values (AUTORET);
if (AUTORET <> '') then
    FAUTORET = CAST(AUTORET AS DATE);
else
    FAUTORET = '9999/12/31';
/* BUSQUE LA INTERFACE */
EXISTE = 'N';
SELECT 'S', TICO_COD, PRCO_PRE, INVE_VENTAS, INVE_IVA, INVE_CONSUMO, INVE_CARTERA, INVE_RTFTE, INVE_RTIVA, INVE_RTICA, INVE_COSTO, INVE_INVEN, INVE_CTAVENTAS, INVE_CTAIVA, INVE_CTACONSUMO, INVE_CTADTO, INVE_CTAADIC, INVE_CTAEXTRA, INVE_CTACARTERA, INVE_CTARTFTE, INVE_CTARTIVA, INVE_CTARTICA, INVE_CTAINVEN, INVE_CTACOSTOS, INVE_CONFIRMAR, INVE_CENTRO
    FROM INTERFAZ_VENTAS
    WHERE INVE_ID = :IDINTER
    INTO :EXISTE, :TIPOCOMP, :PREFCONT, :VENTAS, :IVA, :CONSUMO, :CARTERA, :RTFTE, :RTIVA, :RTICA, :COSTOS, :INVEN, :CTAVENTAS, :CTAIVA, :CTACONSUMO, :CTADTO, :CTAADIC, :CTAEXTRA, :CTACARTERA, :CTARTFTE, :CTARTIVA, :CTARTICA, :CTAINVEN, :CTACOSTOS, :VER, :CENT;
if (EXISTE = 'S') then
  BEGIN
    /* BORRE CUALQUEIR CONTABILIZACION PREVIA */
    DELETE FROM CONTABILIZACION WHERE CNTB_TIPOREF = 31 AND CNTB_IDREF = :IDDOC;

  /* TRAIGA EL ENCABEZADO DE LA FACTURA */
  SELECT PREF_PRE, FACT_NUMERO, FACT_FECHA, F.TERC_NIT, PTVT_ID, FACT_VENCE, FACT_DTOMONTO, FACT_ADICIONAL, FACT_IVAMONTO, FACT_EXTRA, FACT_TOTAL, FACT_RTFTEPOR, FACT_RTFTEMONTO, FACT_RTIVAPOR, FACT_RTIVAMONTO, FACT_RTICAPOR, FACT_RTICAMONTO, FACT_NOMCLIENTE, TERC_CTARTFTE, TERC_CTARTIVA, TERC_CTARTICA, TERC_CTAVENTA, TERC_CTACLIENTE, FACT_ANULADO
        FROM FACTURAS F, TERCEROS T
        WHERE FACT_ID = :IDDOC AND F.TERC_NIT = T.TERC_NIT
        INTO :PREF, :NUM, :FECAUX, :NIT, :PTOVTA, :VENCEAUX, :VRDTO, :VRADIC, :VRIVA, :VREXTRA, :VRTOTAL, :PRTFTE, :VRRTFTE, :PORC, :VRRTIVA, :PRTICA, :VRRTICA, :NOMBRE, TCTARTFTE, TCTARTIVA, TCTARTICA, TCTAVENTA, TCTACLIEN, ANULADO;
  if (ANULADO = 'N') then
    BEGIN
    /* BUSQUE EL CENTRO DEL PUNTO, LA BODEGA, O EL PREFIJO  */
    IF (CENT = 'B') THEN
        SELECT B.BODE_CENTRO, B.BODE_PROY FROM BODEGA B, FACTURAS F
            WHERE B.BODE_COD = F.BODE_COD AND F.FACT_ID = :IDDOC INTO :CENTRO, :PROY;
    IF (CENT = 'V') THEN
        SELECT V.CENT_COD, V.PROY_COD FROM VENDEDORES V, FACTURAS F
            WHERE V.VEND_COD = F.VEND_COD AND F.FACT_ID = :IDDOC INTO :CENTRO, :PROY;
    IF (CENT = 'P') THEN
        SELECT P.PREF_CENTRO,P.PREF_PROY  FROM PREFIJOS P, FACTURAS F
            WHERE P.PREF_PRE = F.PREF_PRE AND F.FACT_ID = :IDDOC AND P.TIDO_COD = 31 INTO :CENTRO, :PROY;
    NUMERO = PREF || NUM;
    SELECT SUM (FADE_CONSUMO) FROM FACTURAS_DETALLE WHERE FACT_ID = :IDDOC  AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
        INTO MERCANCIA;
    VRSUBT = VRTOTAL - VREXTRA - VRIVA - MERCANCIA; /* BASE DE RETEFTE Y RETEICA */

    EXECUTE PROCEDURE lee_configuracion ('FACTURACION', 'FACTURAS', 'DESCUENTO PIE FACTURA IGUAL A SUMA DE DESCUENTOS POR ITEM') returning_values (:DTOXIT);
    if (DTOXIT = 'SI') then
        VRDTO = 0;
    MERCANCIA = VRSUBT - VRADIC + VRDTO;
    EXECUTE PROCEDURE FECHA_A_CONTA(:FECAUX) returning_values (:FECHA);
    EXECUTE PROCEDURE FECHA_A_CONTA(:VENCEAUX) returning_values (:VENCE);
    /* REGISTRE EL ENCABEZADO CONTABLE */
    IDC = GEN_ID(ID_CONTABILIZA, 1);
    if (STRLEN(NOMBRE)> 43 ) then
      CONC = 'FV No.' || NUMERO || '-' || SUBSTR(NOMBRE,1,43);
    ELSE
      CONC = 'FV No.' || NUMERO || '-' || NOMBRE;
    INSERT INTO CONTABILIZACION (CNTB_ID, CNTB_TIPOCOMP, CNTB_PREFCNT, CNTB_NUMERO, CNTB_FECHA, CNTB_CONCEPTO, CNTB_REF, CNTB_TIPOREF, CNTB_IDREF, CNTB_PREFREF, CNTB_NUMREF, CNTB_PROCESADO)
        VALUES (:IDC, :TIPOCOMP, :PREFCONT, :NUM, :FECHA, :CONC, '', 31, :IDDOC, :PREF, :NUM, 'N');
    NROI = 0;
    SUMA = 0;
    ERROR = 0;
    /* SI NO HAY CUENTA DE DESCUENTO NI ADICIONAL CALCULE UN FACTOR PARA LAS VENTAS Y EL IVA */
    if (MERCANCIA <> 0) then
        FACTOR = CAST(VRSUBT AS DOUBLE PRECISION) / CAST(MERCANCIA AS DOUBLE PRECISION);
    ELSE
        FACTOR = 1;
    /* TRAIGA EL NUMERO DE DIGITOS PARA EL REDONDEO */
    SELECT CAST(CONF_VALOR AS INTEGER) FROM CONFIGURACION WHERE CONF_MODULO = 'FACTURACION' AND
        CONF_CATEGORIA = 'GENERAL' AND CONF_PROPIEDAD = 'REDONDEO AL MULTIPLO DE DIEZ EN TOTALES' INTO :DIG;
    /* CUENTAS DE VENTAS */
    if (VENTAS = 'A') then
        BEGIN
        FOR SELECT MAX(COAR_CTAVNT), SUM(FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), SUM(FADE_IVAMONTO), SUM(FADE_CONSUMO)
            FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_DETALLE F
            WHERE F.FACT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
            GROUP BY COAR_CTAVNT
            INTO :CTAVENTAS, :MONTO, :IMPTOS, :VRCONSUMO
            DO
            BEGIN
            if (FOMENTO = 'SI') then
                MONTO = MONTO + VRCONSUMO;
            if ((CTADTO IS NULL) OR (CTADTO = '')) then
                MONTO = MONTO * FACTOR;
            execute procedure redondee(MONTO, DIG) returning_values (MONTO);
            if (MONTO <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTAVENTAS, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT F.ARTI_COD, (FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), FADE_CONSUMO
                        FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_DETALLE F
                        WHERE F.FACT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTAINV = :CUENTA AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
                        INTO :ART, :MONTO, :IMPTOS
                    DO
                        BEGIN
                        if (FOMENTO = 'SI') then
                            MONTO = MONTO + IMPTOS;
                        if ((CTADTO IS NULL) OR (CTADTO = '')) then
                            MONTO = MONTO * FACTOR;
                        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                        if (MONTO <> 0) then
                            BEGIN
                            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                            NROI = NROI + 1;
                            SUMA = SUMA - MONTO;
                            END
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    NROI = NROI + 1;
                    SUMA = SUMA - MONTO;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA - MONTO;
                    END
                END /* MONTO <> 0 */
            END /* FOR */
        END /* VENTAS X ARTICULO */
     IF ((VENTAS = 'C') OR (VENTAS = 'K')) THEN
        BEGIN
        IF (VENTAS = 'C') THEN
            CTAVENTAS = TCTAVENTA;
        SELECT SUM(FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), SUM(FADE_IVAMONTO), SUM (FADE_CONSUMO)
            FROM FACTURAS_DETALLE F
            WHERE F.FACT_ID = :IDDOC AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
            INTO :MONTO, :IMPTOS, :VRCONSUMO;
        if (FOMENTO = 'SI') then
            MONTO = MONTO + VRCONSUMO;
        if ((CTADTO IS NULL) OR (CTADTO = '')) then
            MONTO = MONTO * FACTOR;
        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
        if (MONTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTAVENTAS, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT F.ARTI_COD, (FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), FADE_CONSUMO
                    FROM ARTICULO A, FACTURAS_DETALLE F
                    WHERE F.FACT_ID = :IDDOC AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
                    INTO :ART, :MONTO, :IMPTOS
                    DO
                    BEGIN
                    if (FOMENTO = 'SI') then
                        MONTO = MONTO + VRCONSUMO;
                    if ((CTADTO IS NULL) OR (CTADTO = '')) then
                        MONTO = MONTO * FACTOR;
                    execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                    if (MONTO <> 0) then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        SUMA = SUMA - MONTO;
                        END
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - MONTO;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - MONTO;
                END
            END /* MONTO <> 0 */
        END /* VENTAS DE CLIENTE O CONSTANTE */
    /* EL IVA EN VENTAS */
    if (IVA = 'A') then
        BEGIN
        FOR SELECT MAX(COAR_CTAIVAV), SUM(FADE_IVAMONTO), SUM(FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), sum(FADE_CONSUMO)
            FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_DETALLE F
            WHERE F.FACT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
            GROUP BY COAR_CTAIVAV
            INTO :CTAIVA, :IMPTOS, :MONTO, :VALORADIC
        DO
            BEGIN
            if (FOMENTO = 'SI') then
                MONTO = MONTO + VALORADIC;
            MONTO = MONTO * -1;
            MONTO = MONTO * FACTOR;
            IMPTOS = IMPTOS * FACTOR;
            execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
            execute procedure redondee(MONTO, DIG) returning_values (MONTO);
            if (IMPTOS <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTAIVA, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT F.ARTI_COD, FADE_IVAMONTO, (FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), TAIV_PORC, FADE_CONSUMO
                        FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_DETALLE F, TARIFA_IVA T
                        WHERE F.FACT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTAIVAV = :CUENTA AND A.TAIV_COD = T.TAIV_COD AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
                        INTO :ART, :IMPTOS, :MONTO, :PORCIVA, :VALORADIC
                    DO
                        BEGIN
                        if (FOMENTO = 'SI') then
                            MONTO = MONTO + VALORADIC;
                        MONTO = MONTO * -1;
                        MONTO = MONTO * FACTOR;
                        IMPTOS = IMPTOS * FACTOR;
                        execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                        if (IMPTOS <> 0) then
                            BEGIN
                            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, :MONTO, :PORCIVA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                            NROI = NROI + 1;
                            SUMA = SUMA + DEBITO - CREDITO;
                            END
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, :MONTO, ABS(:IMPTOS*100/:MONTO), :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    NROI = NROI + 1;
                    SUMA = SUMA - IMPTOS;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, :MONTO, ABS(:IMPTOS*100/:MONTO), :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA - IMPTOS;
                    END
                END   /* IMPTOS <> 0 */
            END /* FOR */
        END /* IVA X ARTICULO */
    if (IVA = 'K') then /* IVA EN CTA CONSTANTE */
        BEGIN
        SELECT SUM(FADE_IVAMONTO), SUM(FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), SUM(FADE_CONSUMO)
            FROM FACTURAS_DETALLE F
            WHERE F.FACT_ID = :IDDOC and FADE_IVAMONTO <> 0 AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
            INTO :IMPTOS, :MONTO, :valoradic;
        if (FOMENTO = 'SI') then
            MONTO = MONTO + VALORADIC;
        MONTO = MONTO * -1;
        MONTO = MONTO * FACTOR;
        IMPTOS = IMPTOS * FACTOR;
        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
        execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
        if (IMPTOS <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTAIVA, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT F.ARTI_COD, (FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), FADE_IVAMONTO, TAIV_PORC, FADE_CONSUMO
                    FROM ARTICULO A, FACTURAS_DETALLE F, TARIFA_IVA T
                    WHERE F.FACT_ID = :IDDOC AND A.TAIV_COD = T.TAIV_COD AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
                    INTO :ART, :MONTO, :IMPTOS, :PORCIVA, :VALORADIC
                    DO
                    BEGIN
                    if (FOMENTO = 'SI') then
                        MONTO = MONTO + VALORADIC;
                    MONTO = MONTO * -1;
                    MONTO = MONTO * FACTOR;
                    IMPTOS = IMPTOS * FACTOR;
                    execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                    execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                    if (IMPTOS <> 0) then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', 0, :IMPTOS, :MONTO, :PORCIVA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        SUMA = SUMA - IMPTOS;
                        END
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', 0, :IMPTOS, :MONTO, ABS(:IMPTOS*100/:MONTO), :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - IMPTOS;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', 0, :IMPTOS, :MONTO, ABS(:IMPTOS*100/:MONTO), :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - IMPTOS;
                END
            END /* IMPTOS <> 0 */
        END /* IVA EN CTA CONSTANTE */
    /* EL IMPOCONSUMO */
    if ((CONSUMO = 'A') AND (FOMENTO <> 'SI')) then
        BEGIN
        FOR SELECT MAX(COAR_CTACONS), SUM(FADE_CONSUMO)
            FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_DETALLE F
            WHERE F.FACT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
            GROUP BY COAR_CTACONS
            INTO :CTACONSUMO, :IMPTOS
        DO
            BEGIN
            execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
            if (IMPTOS <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTACONSUMO, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, REGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT F.ARTI_COD, FADE_CONSUMO
                        FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_DETALLE F
                        WHERE F.FACT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTACONS = :CUENTA AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
                        INTO :ART, :IMPTOS
                    DO
                        BEGIN
                        execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                        if (IMPTOS <> 0) then
                            BEGIN
                            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                            NROI = NROI + 1;
                            SUMA = SUMA - IMPTOS;
                            END
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    NROI = NROI + 1;
                    SUMA = SUMA - IMPTOS;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA - IMPTOS;
                    END
                END /* IMPTOS <> 0 */
            END /* FOR */
        END /* CONSUMO X ARTICULO */
    if ((CONSUMO = 'K') AND (FOMENTO <> 'SI')) then /* CONSUMO EN CTA CONSTANTE */
        BEGIN
        SELECT SUM(FADE_CONSUMO)
            FROM FACTURAS_DETALLE F
            WHERE F.FACT_ID = :IDDOC AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
            INTO :IMPTOS;
        execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
        if (IMPTOS <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTACONSUMO, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT F.ARTI_COD, FADE_CONSUMO
                    FROM ARTICULO A, FACTURAS_DETALLE F
                    WHERE F.FACT_ID = :IDDOC AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
                    INTO :ART, :IMPTOS
                    DO
                    BEGIN
                    execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                    if (IMPTOS <> 0) then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CTACONSUMO, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        SUMA = SUMA - IMPTOS;
                        END
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTACONSUMO, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - IMPTOS;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTACONSUMO, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - IMPTOS;
                END
            END /* IMPTOS <> 0 */
        END /* CONSUMO EN CTA CONSTANTE */
    /* DESCUENTO */
    if ((CTADTO IS NOT NULL) AND (CTADTO <> '')) then
        BEGIN
        execute procedure redondee(VRDTO, DIG) returning_values (VRDTO);
        if (VRDTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTADTO, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRDTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA + VRDTO;
                END
            if (TIPOCUEN = 'N') then
                    BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRDTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA + VRDTO;
                END
            END
        END /* DESCUENTO */
    /* VALOR ADIC */
    if ((CTAADIC IS NOT NULL) AND (CTAADIC <> '')) then
        BEGIN
        execute procedure redondee(VRADIC, DIG) returning_values (VRADIC);
        if (VRADIC <> 0) THEN
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTAADIC, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRADIC, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - VRADIC;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRADIC, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - VRADIC;
                END
            END
        END /* VR. ADIC */
    /* VALOR EXTRA */
    if ((CTAEXTRA IS NOT NULL) AND (CTAEXTRA <> '')) THEN
        BEGIN
        execute procedure redondee(VREXTRA, DIG) returning_values (VREXTRA);
        if (VREXTRA <> 0) THEN
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTAEXTRA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VREXTRA, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - VREXTRA;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VREXTRA, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - VREXTRA;
                END
            END
        END /* VR. EXTRA */
    /* DESCUENTE EL IMPOCONSUMO */
    SELECT SUM(FADE_CONSUMO)
        FROM FACTURAS_DETALLE F WHERE F.FACT_ID = :IDDOC AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL)) INTO :IMPTOS;
    vrsubt = vrsubt - IMPTOS;
    /* RETENCION FUENTE */
    if ((RTFTE = 'C') or (RTFTE = 'K')) then
      BEGIN
      execute procedure redondee(VRRTFTE, DIG) returning_values (VRRTFTE);
      if (VRRTFTE <> 0) then
        BEGIN
        if (RTFTE = 'C') then
            CTARTFTE = TCTARTFTE;
        EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTARTFTE, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :VRSUBT, :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTFTE;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :VRSUBT, :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTFTE;
            END
        /* AUTORETENCION */
        if (FAUTORET <= fecaux) then
            BEGIN
            EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'CUENTA DE AUTORETENCION EN LA FUENTE') returning_values (CTARTFTE);
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTARTFTE INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERROR (31, :IDDOC, :CTARTFTE, 2);
                CUENTA = CTARTFTE;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                begin
                EXECUTE PROCEDURE ERROR (31, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, (:VRSUBT*-1), :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - VRRTFTE;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, (:VRSUBT*-1), :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - VRRTFTE;
                END
            END
        END /* RTFTE */
      END
    if (RTFTE = 'A') then
      BEGIN
      FOR SELECT MAX(COAR_CTARTFTEV), MAX(COAR_RTFTE), MIN(COAR_RTBASE), SUM(FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), SUM((FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO)*COAR_RTFTE)
        FROM CONTABIL_ARTICULO C, FACTURAS_DETALLE F
        WHERE F.FACT_ID = :IDDOC AND F.ARTI_COD = C.ARTI_COD AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
        GROUP BY COAR_CTARTFTEV
        INTO :CTARTFTE, :PRTFTE, :baseadic, :MONTO, :VRRTFTE
        DO
        BEGIN
        MONTO = MONTO * FACTOR;
        if (MONTO >= BASEADIC) then
            BEGIN
            VRRTFTE = VRRTFTE * FACTOR / 100;
            execute procedure redondee(VRRTFTE, DIG) returning_values (VRRTFTE);
            execute procedure redondee(MONTO, DIG) returning_values (MONTO);
            if (VRRTFTE <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTARTFTE, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :MONTO, :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    NROI = NROI + 1;
                    SUMA = SUMA + VRRTFTE;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :MONTO, :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA + VRRTFTE;
                    END
                /* AUTORETENCION */
                if (FAUTORET <= fecaux) then
                    BEGIN
                    EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'CUENTA DE AUTORETENCION EN LA FUENTE') returning_values (CTARTFTE);
                    EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTARTFTE, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
                    if (ERRORC <> 0) then
                        ERROR = ERROR + 1;
                    if (TIPOCUEN = 'C') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, (:MONTO*-1), :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                        NROI = NROI + 1;
                        SUMA = SUMA - VRRTFTE;
                        END
                    if (TIPOCUEN = 'N') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, (:MONTO*-1), :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NROI = NROI + 1;
                        SUMA = SUMA - VRRTFTE;
                        END
                    END
                END
            END
        END /* RTFTE */
      END
    /* RETENCION IVA */
    if ((RTIVA = 'C') or (RTIVA = 'K')) then
      BEGIN
      execute procedure redondee(VRRTIVA, DIG) returning_values (VRRTIVA);
      if (VRRTIVA <> 0) then
        BEGIN
        if (RTIVA = 'C') then
            CTARTIVA = TCTARTIVA;
        EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTARTIVA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTIVA, 0, :VRIVA, :PORC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTIVA;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTIVA, 0, :VRIVA, :PORC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTIVA;
            END
        END /* RTIVA */
      END
    /* RETENCION DE ICA */
    if ((RTICA = 'C') or (RTICA = 'K')) then
      BEGIN
      execute procedure redondee(VRRTICA, DIG) returning_values (VRRTICA);
      if (VRRTICA <> 0) then
        BEGIN
        if (RTICA = 'C') then
            CTARTICA = TCTARTICA;
        EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTARTICA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTICA, 0, :VRSUBT, :PRTICA, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTICA;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTICA, 0, :VRSUBT, :PRTICA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTICA;
            END
        END /* RTICA */
      END
    /* CIERRE EL COMPROBANTE CONTRA LA CUENTA DEL TERCERO O LA CONSTANTE */
    if ((SUMA <> 0) and ((CARTERA = 'C') or (CARTERA = 'K') or (CARTERA = 'J'))) then
        BEGIN
        if (SUMA < 0) then
            BEGIN
            DEBITO = SUMA * -1;
            CREDITO = 0;
            END
        ELSE
            BEGIN
            DEBITO = 0;
            CREDITO = SUMA;
            END
        if (CARTERA = 'C') then
            CTACARTERA = TCTACLIEN;
        if (CARTERA = 'J') then
            BEGIN
            /* BUSQUE LA CUENTA DE LA CAJA */
            SELECT CAJA_CUENTA FROM CAJAS C, PUNTO_VENTA P
                WHERE P.CAJA_ID = C.CAJA_ID AND PTVT_ID = :PTOVTA
                INTO :CTACARTERA;
            END
        EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTACARTERA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :DEBITO, :CREDITO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
        if (TIPOCUEN = 'N') then
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :DEBITO, :CREDITO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
        NROI = NROI + 1;
        END /* SUMA EN CARTERA */
    /* CALCULE COSTOS EN VENTAS */
    EXECUTE PROCEDURE COSTO_EN_VENTAS(31, :IDDOC);
    if (COSTOS = 'A') then
        BEGIN
        FOR SELECT MAX(CTACOS), SUM(CAST(CANT AS DOUBLE PRECISION) * COSTO)
            FROM COSTO_VENTAS
            GROUP BY CTACOS
            INTO :CTACOSTOS, :MONTO
        DO
            BEGIN
            if (MONTO <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTACOSTOS, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT ARTI_COD, CANT * COSTO
                        FROM COSTO_VENTAS
                        WHERE CTACOS = :CUENTA
                        INTO :ART, :MONTO
                    DO
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    NROI = NROI + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    END
                END /* MONTO <> 0 */
            END /* FOR */
        END /* COSTOS */
    if (COSTOS = 'K') then
        BEGIN
        SELECT SUM(CAST(CANT AS DOUBLE PRECISION) * COSTO)
            FROM COSTO_VENTAS
            INTO :MONTO;
        if (MONTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTACOSTOS, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, REGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT ARTI_COD, CANT * COSTO
                    FROM COSTO_VENTAS
                    INTO :ART, :MONTO
                DO
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTACOSTOS, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                    NROI = NROI + 1;
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTACOSTOS, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTACOSTOS, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                END
            END /* MONTO <> 0 */
        END /* COSTOS = K */
    if (INVEN = 'A') then
        BEGIN
        FOR SELECT MAX(CTAINV), SUM(CAST(CANT AS DOUBLE PRECISION) * COSTO)
            FROM COSTO_VENTAS
            GROUP BY CTAINV
            INTO :CTAINVEN, :MONTO
        DO
            BEGIN
            if (MONTO <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTAINVEN, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, REGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT ARTI_COD, CANT * COSTO
                        FROM COSTO_VENTAS
                        WHERE CTAINV = :CUENTA
                        INTO :ART, :MONTO
                    DO
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    NROI = NROI + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    END
                END /* MONTO <> 0 */
            END /* FOR */
        END /* INVEN = A */
    if (INVEN = 'K') then
        BEGIN
        SELECT SUM(CAST(CANT AS DOUBLE PRECISION) * COSTO)
            FROM COSTO_VENTAS
            INTO :MONTO;
        if (MONTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTAINVEN, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT ARTI_COD, CANT * COSTO
                    FROM COSTO_VENTAS
                    INTO :ART, :MONTO
                DO
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTAINVEN, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                    NROI = NROI + 1;
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAINVEN, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAINVEN, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                END
            END /* MONTO <> 0 */
        END /* INVEN = K */
    /* recorra las cuentas adicionales */
    FOR SELECT INVC_CUENTA, INVC_BASE, INVC_PORC, INVC_VALOR, INVC_DB
        FROM INTERFAZ_VENTAS_CTAS
        WHERE INVE_ID = :IDINTER
        INTO :CTADIC, :BASEADIC, :PORCADIC, :VALORADIC, :DBADIC
        DO
        BEGIN
        if (VALORADIC <> 0) then
            MONTO = VALORADIC;
        ELSE
            BEGIN
            if (:BASEADIC = 'SUBTOTAL') then
                VALORADIC = vrsubt;
            if (:BASEADIC = 'DESCUENTO') then
                VALORADIC = VRDTO;
            if (:BASEADIC = 'IVA') then
                VALORADIC = VRIVA;
            if (:BASEADIC = 'ADICIONAL') then
                VALORADIC = VRADIC;
            if (:BASEADIC = 'EXTRA') then
                VALORADIC = VREXTRA;
            if (:BASEADIC = 'TOTAL') then
                VALORADIC = VRTOTAL;
            MONTO = VALORADIC * PORCADIC / 100;
            END
        if (MONTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTADIC, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                if (DBADIC = 'S') then
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                ELSE
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                if (DBADIC = 'S') then
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                ELSE
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                END
            NROI = NROI + 1;
            END
        END
    if (ERROR > 0) then
        VER = 'S';
    SUSPEND;
    END /* NO ANULADO */
  END /* EXISTE LA INTERFAZ */
ELSE
    BEGIN
    EXECUTE PROCEDURE ERROR (31, :IDDOC, :PREF, 1);
    ERROR = ERROR + 1;
    VER = 'S';
    SUSPEND;
    END
END

^

SET TERM ; ^

SET TERM ^ ;

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

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE CONTABIL_FACTURAS_CONTADO(
    FECFAC DATE,
    NIT VARCHAR(20),
    PREF VARCHAR(4),
    PTVTA INTEGER,
    IDINTER INTEGER)
RETURNS (
    ERROR INTEGER,
    VER CHAR(1),
    IDC INTEGER)
AS
declare variable num varchar(8);
declare variable numero varchar(10);
declare variable fecha char(8);
declare variable conc char(120);
declare variable vence char(8);
declare variable vrdto numeric(18,2);
declare variable vradic numeric(18,2);
declare variable vrsubt numeric(18,2);
declare variable vriva numeric(18,2);
declare variable prtfte numeric(9,2);
declare variable vrrtfte numeric(18,2);
declare variable vrrtiva numeric(18,2);
declare variable prtica numeric(9,2);
declare variable vrrtica numeric(18,2);
declare variable vrtotal numeric(18,2);
declare variable vrextra numeric(18,2);
declare variable tipocomp varchar(3);
declare variable prefcont varchar(4);
declare variable ventas char(1);
declare variable ctaventas varchar(20);
declare variable iva char(1);
declare variable ctaiva varchar(20);
declare variable consumo char(1);
declare variable ctaconsumo varchar(20);
declare variable cartera char(1);
declare variable ctacartera varchar(20);
declare variable rtfte char(1);
declare variable ctartfte varchar(20);
declare variable rtiva char(1);
declare variable ctartiva varchar(20);
declare variable rtica char(1);
declare variable ctartica varchar(20);
declare variable inven char(1);
declare variable ctainven varchar(20);
declare variable costos char(1);
declare variable ctacostos varchar(20);
declare variable ctadto varchar(20);
declare variable ctaadic varchar(20);
declare variable ctaextra varchar(20);
declare variable existe char(1);
declare variable cuenta varchar(20);
declare variable monto numeric(18,2);
declare variable tipocuen char(1);
declare variable nombre varchar(60);
declare variable proy varchar(4);
declare variable centro varchar(4);
declare variable porc numeric(5,2);
declare variable debito numeric(18,2);
declare variable credito numeric(18,2);
declare variable nroi integer;
declare variable art varchar(15);
declare variable impinc char(1);
declare variable imptos numeric(18,2);
declare variable suma numeric(18,2);
declare variable porciva numeric(9,2);
declare variable tctaclien varchar(20);
declare variable tctaventa varchar(20);
declare variable tctartfte varchar(20);
declare variable tctartiva varchar(20);
declare variable tctartica varchar(20);
declare variable ctadic varchar(20);
declare variable baseadic varchar(20);
declare variable porcadic numeric(5,2);
declare variable valoradic numeric(18,2);
declare variable dbadic char(1);
declare variable ptovta integer;
declare variable dig integer;
declare variable mercancia numeric(18,2);
declare variable factor double precision;
declare variable cent char(1);
BEGIN
/* BUSQUE LA INTERFACE */
EXISTE = 'N';
SELECT 'S', TICO_COD, PRCO_PRE, INVE_VENTAS, INVE_IVA, INVE_CONSUMO, INVE_CARTERA, INVE_RTFTE, INVE_RTIVA, INVE_RTICA, INVE_COSTO, INVE_INVEN, INVE_CTAVENTAS, INVE_CTAIVA, INVE_CTACONSUMO, INVE_CTADTO, INVE_CTAADIC, INVE_CTAEXTRA, INVE_CTACARTERA, INVE_CTARTFTE, INVE_CTARTIVA, INVE_CTARTICA, INVE_CTAINVEN, INVE_CTACOSTOS, INVE_CONFIRMAR, INVE_CENTRO
    FROM INTERFAZ_VENTAS
    WHERE INVE_ID = :IDINTER
    INTO :EXISTE, :TIPOCOMP, :PREFCONT, :VENTAS, :IVA, :CONSUMO, :CARTERA, :RTFTE, :RTIVA, :RTICA, :COSTOS, :INVEN, :CTAVENTAS, :CTAIVA, :CTACONSUMO, :CTADTO, :CTAADIC, :CTAEXTRA, :CTACARTERA, :CTARTFTE, :CTARTIVA, :CTARTICA, :CTAINVEN, :CTACOSTOS, :VER, :CENT;
if (EXISTE = 'S') then
  BEGIN
  /* BORRE CUALQUEIR CONTABILIZACION PREVIA */
/*  DELETE FROM CONTABILIZACION WHERE CNTB_TIPOREF = 31 AND CNTB_IDREF = 0;
  /* BUSQUE EL CENTRO DEL PUNTO, LA BODEGA, O EL PREFIJO  */
  IF (CENT = 'B') THEN
    SELECT B.BODE_CENTRO, B.BODE_PROY FROM BODEGA B, PUNTO_VENTA P
        WHERE B.BODE_COD = P.BODE_COD AND P.ptvt_id = :ptvta INTO :CENTRO, :PROY;
  IF (CENT = 'V') THEN
    SELECT MAX(V.CENT_COD), MAX(V.PROY_COD) FROM VENDEDORES V
        WHERE V.PTVT_ID = :PTVTA INTO :CENTRO, :PROY;
  IF (CENT = 'P') THEN
    SELECT P.PREF_PROY, P.PREF_CENTRO FROM PREFIJOS P
        WHERE P.PREF_PRE = :PREF AND P.TIDO_COD = 31 INTO :CENTRO, :PROY;
  /* TRAIGA LOS DATOS DEL CLIENTE */
  SELECT TERC_NOM, TERC_CTARTFTE, TERC_CTARTIVA, TERC_CTARTICA, TERC_CTAVENTA, TERC_CTACLIENTE
        FROM TERCEROS T WHERE TERC_NIT = :NIT
        INTO :NOMBRE, TCTARTFTE, TCTARTIVA, TCTARTICA, TCTAVENTA, TCTACLIEN;
  SELECT SUM(FACT_DTOMONTO), SUM(FACT_ADICIONAL), SUM(FACT_IVAMONTO), SUM(FACT_EXTRA), SUM(FACT_TOTAL), SUM(FACT_RTFTEMONTO), SUM(FACT_RTIVAMONTO), SUM(FACT_RTICAMONTO), MAX(FACT_IVAINC)
        FROM FACTURAS F WHERE FACT_FECHA = :FECFAC AND FACT_ANULADO = 'N' AND PTVT_ID = :ptvta AND PREF_PRE = :PREF
        INTO :VRDTO, :VRADIC, :VRIVA, :VREXTRA, :VRTOTAL, :VRRTFTE, :VRRTIVA, :VRRTICA, :impinc;
  VRSUBT = VRTOTAL - VREXTRA - VRIVA; /* BASE DE RETEFTE Y RETEICA */
  MERCANCIA = VRSUBT - VRADIC + VRDTO;
  EXECUTE PROCEDURE FECHA_A_CONTA(:FECFAC) returning_values (:FECHA);
  VENCE = FECHA;
  /* REGISTRE EL ENCABEZADO CONTABLE */
  IDC = GEN_ID(ID_CONTABILIZA, 1);
  CONC = 'RESUMEN VENTAS ' || FECHA;
  NUM = SUBSTR(FECHA, 3, 8);
  INSERT INTO CONTABILIZACION (CNTB_ID, CNTB_TIPOCOMP, CNTB_PREFCNT, CNTB_NUMERO, CNTB_FECHA, CNTB_CONCEPTO, CNTB_REF, CNTB_TIPOREF, CNTB_IDREF, CNTB_PREFREF, CNTB_NUMREF, CNTB_PROCESADO)
        VALUES (:IDC, :TIPOCOMP, :PREFCONT, :NUM, :FECHA, :CONC, '', 0, 0, :PREF, :NUM, 'N');
  NROI = 0;
  SUMA = 0;
  ERROR = 0;
  /* SI NO HAY CUENTA DE DESCUENTO NI ADICIONAL CALCULE UN FACTOR PARA LAS VENTAS Y EL IVA */
  if (MERCANCIA <> 0) then
    FACTOR = CAST(VRSUBT AS DOUBLE PRECISION) / CAST(MERCANCIA AS DOUBLE PRECISION);
  ELSE
    FACTOR = 1;
  /* TRAIGA EL NUMERO DE DIGITOS PARA EL REDONDEO */
  SELECT CAST(CONF_VALOR AS INTEGER) FROM CONFIGURACION WHERE CONF_MODULO = 'FACTURACION' AND
        CONF_CATEGORIA = 'GENERAL' AND CONF_PROPIEDAD = 'REDONDEO AL MULTIPLO DE DIEZ EN TOTALES' INTO :DIG;
  /* CUENTAS DE VENTAS */
  if (VENTAS = 'A') then
        BEGIN
        FOR SELECT MAX(COAR_CTAVNT), SUM(CAST(FADE_CANT AS DOUBLE PRECISION) * (FADE_PRUNIT-FADE_DTOMONTO)), SUM(FADE_IVAMONTO+FADE_CONSUMO)
            FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_DETALLE FD, FACTURAS F
            WHERE F.FACT_ID = FD.FACT_ID AND FACT_FECHA = :FECFAC AND FD.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND F.PREF_PRE = :PREF AND F.PTVT_ID = :PTVTA AND FACT_ANULADO = 'N' AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
            GROUP BY COAR_CTAVNT
            INTO :CTAVENTAS, :MONTO, :IMPTOS
            DO
            BEGIN
            if (IMPINC = 'S') then
                MONTO = MONTO - IMPTOS;
            if ((CTADTO IS NULL) OR (CTADTO = '')) then
                MONTO = MONTO * FACTOR;
            execute procedure redondee(MONTO, DIG) returning_values (MONTO);
            if (MONTO <> 0) then
                BEGIN
                CUENTA = NULL;
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :CTAVENTAS INTO :CUENTA, :TIPOCUEN;
                if (CUENTA IS NULL) then
                    begin
                    EXECUTE PROCEDURE ERROR (31, 0, :CTAVENTAS, 2);
                    CUENTA = CTAVENTAS;
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT FD.ARTI_COD, (CAST(FADE_CANT AS DOUBLE PRECISION) * (FADE_PRUNIT-FADE_DTOMONTO)), (FADE_IVAMONTO+FADE_CONSUMO)
                        FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_DETALLE FD, FACTURAS F
                        WHERE F.FACT_ID = FD.FACT_ID AND FACT_FECHA = :FECFAC AND F.PREF_PRE = :PREF AND F.PTVT_ID = :PTVTA AND FD.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTAINV = :CUENTA AND FACT_ANULADO = 'N' AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
                        INTO :ART, :MONTO, :IMPTOS
                    DO
                        BEGIN
                        if (IMPINC = 'S') then
                            MONTO = MONTO - IMPTOS;
                        if ((CTADTO IS NULL) OR (CTADTO = '')) then
                            MONTO = MONTO * FACTOR;
                        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                        if (MONTO <> 0) then
                            BEGIN
                            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                            NROI = NROI + 1;
                            SUMA = SUMA - MONTO;
                            END
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    NROI = NROI + 1;
                    SUMA = SUMA - MONTO;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA - MONTO;
                    END
                END /* MONTO <> 0 */
            END /* FOR */
        END /* VENTAS X ARTICULO */
     IF ((VENTAS = 'C') OR (VENTAS = 'K')) THEN
        BEGIN
        IF (VENTAS = 'C') THEN
            CTAVENTAS = TCTAVENTA;
        SELECT SUM(CAST(FADE_CANT AS DOUBLE PRECISION) * (FADE_PRUNIT-FADE_DTOMONTO)), SUM(FADE_IVAMONTO+FADE_CONSUMO)
            FROM FACTURAS_DETALLE FD, FACTURAS F
            WHERE F.FACT_ID = FD.FACT_ID AND FACT_FECHA = :FECFAC AND F.PREF_PRE = :PREF AND F.PTVT_ID = :PTVTA AND FACT_ANULADO = 'N' AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
            INTO :MONTO, :IMPTOS;
        if (IMPINC = 'S') then
            MONTO = MONTO - IMPTOS;
        if ((CTADTO IS NULL) OR (CTADTO = '')) then
            MONTO = MONTO * FACTOR;
        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
        if (MONTO <> 0) then
            BEGIN
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTAVENTAS INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERROR (31, 0, :CTAVENTAS, 2);
                CUENTA = CTAVENTAS;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT FD.ARTI_COD, (CAST(FADE_CANT AS DOUBLE PRECISION) * (FADE_PRUNIT-FADE_DTOMONTO)), (FADE_IVAMONTO+FADE_CONSUMO)
                    FROM /*ARTICULO A,*/ FACTURAS_DETALLE FD, FACTURAS F
                    WHERE F.FACT_ID = FD.FACT_ID AND FACT_FECHA = :FECFAC AND F.PREF_PRE = :PREF AND F.PTVT_ID = :PTVTA AND FACT_ANULADO = 'N' AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
                    INTO :ART, :MONTO, :IMPTOS
                    DO
                    BEGIN
                    if (IMPINC = 'S') then
                        MONTO = MONTO - IMPTOS;
                    if ((CTADTO IS NULL) OR (CTADTO = '')) then
                        MONTO = MONTO * FACTOR;
                    execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                    if (MONTO <> 0) then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        SUMA = SUMA - MONTO;
                        END
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - MONTO;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - MONTO;
                END
            END /* MONTO <> 0 */
        END /* VENTAS DE CLIENTE O CONSTANTE */
    /* EL IVA EN VENTAS */
    if (IVA = 'A') then
        BEGIN
        FOR SELECT MAX(COAR_CTAIVAV), SUM(FADE_IVAMONTO), SUM(CAST(FADE_CANT AS DOUBLE PRECISION) * (FADE_PRUNIT-FADE_DTOMONTO)), sum(FADE_CONSUMO)
            FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_DETALLE FD, FACTURAS F
            WHERE F.FACT_ID = FD.FACT_ID AND FACT_FECHA = :FECFAC AND F.PREF_PRE = :PREF AND F.PTVT_ID = :PTVTA AND FD.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND FACT_ANULADO = 'N' AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
            GROUP BY COAR_CTAIVAV
            INTO :CTAIVA, :IMPTOS, :MONTO, :VALORADIC
        DO
            BEGIN
            if (IMPINC = 'S') then
                MONTO = MONTO - IMPTOS - VALORADIC;
            MONTO = MONTO * -1;
            MONTO = MONTO * FACTOR;
            IMPTOS = IMPTOS * FACTOR;
            execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
            execute procedure redondee(MONTO, DIG) returning_values (MONTO);
            if (IMPTOS <> 0) then
                BEGIN
                CUENTA = NULL;
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :CTAIVA INTO :CUENTA, :TIPOCUEN;
                if (CUENTA IS NULL) then
                    begin
                    EXECUTE PROCEDURE ERROR (31, 0, :CTAIVA, 2);
                    CUENTA = CTAIVA;
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT FD.ARTI_COD, FADE_IVAMONTO, (CAST(FADE_CANT AS DOUBLE PRECISION) * (FADE_PRUNIT-FADE_DTOMONTO)), TAIV_PORC, FADE_CONSUMO
                        FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_DETALLE FD, FACTURAS F, TARIFA_IVA T
                        WHERE F.FACT_ID = FD.FACT_ID AND FACT_FECHA = :FECFAC AND F.PREF_PRE = :PREF AND F.PTVT_ID = :PTVTA AND FD.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTAIVAV = :CUENTA AND A.TAIV_COD = T.TAIV_COD AND FACT_ANULADO = 'N' AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
                        INTO :ART, :IMPTOS, :MONTO, :PORCIVA, :VALORADIC
                    DO
                        BEGIN
                        if (IMPINC = 'S') then
                            MONTO = MONTO - IMPTOS - VALORADIC;
                        MONTO = MONTO * -1;
                        MONTO = MONTO * FACTOR;
                        IMPTOS = IMPTOS * FACTOR;
                        execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                        if (IMPTOS <> 0) then
                            BEGIN
                            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, :MONTO, :PORCIVA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                            NROI = NROI + 1;
                            SUMA = SUMA + DEBITO - CREDITO;
                            END
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, :MONTO, ABS(:IMPTOS*100/:MONTO), :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    NROI = NROI + 1;
                    SUMA = SUMA - IMPTOS;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, :MONTO, ABS(:IMPTOS*100/:MONTO), :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA - IMPTOS;
                    END
                END   /* IMPTOS <> 0 */
            END /* FOR */
        END /* IVA X ARTICULO */
    if (IVA = 'K') then /* IVA EN CTA CONSTANTE */
        BEGIN
        SELECT SUM(FADE_IVAMONTO), SUM(CAST(FADE_CANT AS DOUBLE PRECISION) * (FADE_PRUNIT-FADE_DTOMONTO)), SUM(FADE_CONSUMO)
            FROM FACTURAS_DETALLE FD, FACTURAS F
            WHERE F.FACT_ID = FD.FACT_ID AND FACT_FECHA = :FECFAC AND F.PREF_PRE = :PREF AND F.PTVT_ID = :PTVTA AND FACT_ANULADO = 'N' AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
            INTO :IMPTOS, :MONTO, :valoradic;
        if (IMPINC = 'S') then
            MONTO = MONTO - IMPTOS - VALORADIC;
        MONTO = MONTO * -1;
        MONTO = MONTO * FACTOR;
        IMPTOS = IMPTOS * FACTOR;
        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
        execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
        if (IMPTOS <> 0) then
            BEGIN
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTAIVA INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERROR (31, 0, :CTAIVA, 2);
                CUENTA = CTAIVA;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT FD.ARTI_COD, (CAST(FADE_CANT AS DOUBLE PRECISION) * (FADE_PRUNIT-FADE_DTOMONTO)), FADE_IVAMONTO, TAIV_PORC, FADE_CONSUMO
                    FROM ARTICULO A, FACTURAS_DETALLE FD, FACTURAS F, TARIFA_IVA T
                    WHERE F.FACT_ID = FD.FACT_ID AND FACT_FECHA = :FECFAC AND F.PREF_PRE = :PREF AND F.PTVT_ID = :PTVTA AND FD.arti_cod = A.arti_cod AND T.TAIV_COD=A.TAIV_COD AND FACT_ANULADO = 'N' AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
                    INTO :ART, :MONTO, :IMPTOS, :PORCIVA, :VALORADIC
                    DO
                    BEGIN
                    if (IMPINC = 'S') then
                        MONTO = MONTO - IMPTOS - VALORADIC;
                    MONTO = MONTO * -1;
                    MONTO = MONTO * FACTOR;
                    IMPTOS = IMPTOS * FACTOR;
                    execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                    execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                    if (IMPTOS <> 0) then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', 0, :IMPTOS, :MONTO, :PORCIVA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        SUMA = SUMA - IMPTOS;
                        END
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', 0, :IMPTOS, :MONTO, ABS(:IMPTOS*100/:MONTO), :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - IMPTOS;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', 0, :IMPTOS, :MONTO, ABS(:IMPTOS*100/:MONTO), :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - IMPTOS;
                END
            END /* IMPTOS <> 0 */
        END /* IVA EN CTA CONSTANTE */
    /* EL IMPOCONSUMO */
    if (CONSUMO = 'A') then
        BEGIN
        FOR SELECT MAX(COAR_CTACONS), SUM(FADE_CONSUMO)
            FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_DETALLE FD, FACTURAS F
            WHERE F.FACT_ID = FD.FACT_ID AND FACT_FECHA = :FECFAC AND F.PREF_PRE = :PREF AND F.PTVT_ID = :PTVTA AND FD.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND FACT_ANULADO = 'N' AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
            GROUP BY COAR_CTACONS
            INTO :CTACONSUMO, :IMPTOS
        DO
            BEGIN
            execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
            if (IMPTOS <> 0) then
                BEGIN
                CUENTA = NULL;
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :CTACONSUMO INTO :CUENTA, :TIPOCUEN;
                if (CUENTA IS NULL) then
                    begin
                    EXECUTE PROCEDURE ERROR (31, 0, :CTACONSUMO, 2);
                    CUENTA = CTACONSUMO;
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, REGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT FD.ARTI_COD, FADE_CONSUMO
                        FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_DETALLE FD, FACTURAS F
                        WHERE F.FACT_ID = FD.FACT_ID AND FACT_FECHA = :FECFAC AND F.PREF_PRE = :PREF AND F.PTVT_ID = :PTVTA AND FD.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTACONS = :CUENTA AND FACT_ANULADO = 'N' AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
                        INTO :ART, :IMPTOS
                    DO
                        BEGIN
                        execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                        if (IMPTOS <> 0) then
                            BEGIN
                            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                            NROI = NROI + 1;
                            SUMA = SUMA - IMPTOS;
                            END
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    NROI = NROI + 1;
                    SUMA = SUMA - IMPTOS;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA - CREDITO;
                    END
                END /* IMPTOS <> 0 */
            END /* FOR */
        END /* CONSUMO X ARTICULO */
    if (CONSUMO = 'K') then /* CONSUMO EN CTA CONSTANTE */
        BEGIN
        SELECT SUM(FADE_CONSUMO)
            FROM FACTURAS_DETALLE FD, FACTURAS F
            WHERE F.FACT_ID = FD.FACT_ID AND FACT_FECHA = :FECFAC AND F.PREF_PRE = :PREF AND F.PTVT_ID = :PTVTA AND FACT_ANULADO = 'N' AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
            INTO :IMPTOS;
        execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
        if (IMPTOS <> 0) then
            BEGIN
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTACONSUMO INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERROR (31, 0, :CTACONSUMO, 2);
                CUENTA = CTACONSUMO;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT FD.ARTI_COD, FADE_CONSUMO
                    FROM /*ARTICULO A,*/ FACTURAS_DETALLE FD, FACTURAS F
                    WHERE F.FACT_ID = FD.FACT_ID AND FACT_FECHA = :FECFAC AND F.PREF_PRE = :PREF AND F.PTVT_ID = :PTVTA AND FACT_ANULADO = 'N' AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
                    INTO :ART, :IMPTOS
                    DO
                    BEGIN
                    execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                    if (IMPTOS <> 0) then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CTACONSUMO, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        SUMA = SUMA - IMPTOS;
                        END
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTACONSUMO, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - IMPTOS;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTACONSUMO, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - IMPTOS;
                END
            END /* IMPTOS <> 0 */
        END /* CONSUMO EN CTA CONSTANTE */
    /* DESCUENTO */
    if ((CTADTO IS NOT NULL) AND (CTADTO <> '')) then
        BEGIN
        execute procedure redondee(VRDTO, DIG) returning_values (VRDTO);
        if (VRDTO <> 0) then
            BEGIN
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTADTO INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERROR (31, 0, :CTADTO, 2);
                CUENTA = CTADTO;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                begin
                EXECUTE PROCEDURE ERROR (31, 0, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRDTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA + VRDTO;
                END
            if (TIPOCUEN = 'N') then
                    BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRDTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA + VRDTO;
                END
            END
        END /* DESCUENTO */
    /* VALOR ADIC */
    if ((CTAADIC IS NOT NULL) AND (CTAADIC <> '')) then
        BEGIN
        execute procedure redondee(VRADIC, DIG) returning_values (VRADIC);
        if (VRADIC <> 0) THEN
            BEGIN
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTAADIC INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERROR (31, 0, :CTAADIC, 2);
                CUENTA = CTAADIC;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                begin
                EXECUTE PROCEDURE ERROR (31, 0, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRADIC, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - VRADIC;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRADIC, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - VRADIC;
                END
            END
        END /* VR. ADIC */
    /* VALOR EXTRA */
    if ((CTAEXTRA IS NOT NULL) AND (CTAEXTRA <> '')) THEN
        BEGIN
        execute procedure redondee(VREXTRA, DIG) returning_values (VREXTRA);
        if (VREXTRA <> 0) THEN
            BEGIN
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTAEXTRA INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERROR (31, 0, :CTAEXTRA, 2);
                CUENTA = CTAEXTRA;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                begin
                EXECUTE PROCEDURE ERROR (31, 0, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VREXTRA, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - VREXTRA;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VREXTRA, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - VREXTRA;
                END
            END
        END /* VR. EXTRA */
    /* RETENCION FUENTE */
    if ((RTFTE = 'C') or (RTFTE = 'K')) then
      BEGIN
      execute procedure redondee(VRRTFTE, DIG) returning_values (VRRTFTE);
      if (VRRTFTE <> 0) then
        BEGIN
        if (RTFTE = 'C') then
            CTARTFTE = TCTARTFTE;
        CUENTA = NULL;
        SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
            WHERE CUEN_COD = :CTARTFTE INTO :CUENTA, :TIPOCUEN;
        if (CUENTA IS NULL) then
            begin
            EXECUTE PROCEDURE ERROR (31, 0, :CTARTFTE, 2);
            CUENTA = CTARTFTE;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            begin
            EXECUTE PROCEDURE ERROR (31, 0, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :VRSUBT, :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTFTE;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :VRSUBT, :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTFTE;
            END
        END /* RTFTE */
      END
    /* RETENCION IVA */
    if ((RTIVA = 'C') or (RTIVA = 'K')) then
      BEGIN
      execute procedure redondee(VRRTIVA, DIG) returning_values (VRRTIVA);
      if (VRRTIVA <> 0) then
        BEGIN
        if (RTIVA = 'C') then
            CTARTIVA = TCTARTIVA;
        CUENTA = NULL;
        SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
            WHERE CUEN_COD = :CTARTIVA INTO :CUENTA, :TIPOCUEN;
        if (CUENTA IS NULL) then
            begin
            EXECUTE PROCEDURE ERROR (31, 0, :CTARTIVA, 2);
            CUENTA = CTARTIVA;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            begin
            EXECUTE PROCEDURE ERROR (31, 0, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTIVA, 0, :VRIVA, :PORC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTIVA;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTIVA, 0, :VRIVA, :PORC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTIVA;
            END
        END /* RTIVA */
      END
    /* RETENCION DE ICA */
    if ((RTICA = 'C') or (RTICA = 'K')) then
      BEGIN
      execute procedure redondee(VRRTICA, DIG) returning_values (VRRTICA);
      if (VRRTICA <> 0) then
        BEGIN
        if (RTICA = 'C') then
            CTARTICA = TCTARTICA;
        CUENTA = NULL;
        SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
            WHERE CUEN_COD = :CTARTICA INTO :CUENTA, :TIPOCUEN;
        if (CUENTA IS NULL) then
            begin
            EXECUTE PROCEDURE ERROR (31, 0, :CTARTICA, 2);
            CUENTA = CTARTICA;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            begin
            EXECUTE PROCEDURE ERROR (31, 0, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTICA, 0, :VRSUBT, :PRTICA, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTICA;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTICA, 0, :VRSUBT, :PRTICA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTICA;
            END
        END /* RTICA */
      END
    /* CIERRE EL COMPROBANTE CONTRA LA CUENTA DEL TERCERO O LA CONSTANTE */
    if ((SUMA <> 0) and ((CARTERA = 'C') or (CARTERA = 'K') or (CARTERA = 'J'))) then
        BEGIN
        if (SUMA < 0) then
            BEGIN
            DEBITO = SUMA * -1;
            CREDITO = 0;
            END
        ELSE
            BEGIN
            DEBITO = 0;
            CREDITO = SUMA;
            END
        if (CARTERA = 'C') then
            CTACARTERA = TCTACLIEN;
        if (CARTERA = 'J') then
            BEGIN
            /* BUSQUE LA CUENTA DE LA CAJA */
            SELECT CAJA_CUENTA FROM CAJAS C, PUNTO_VENTA P
                WHERE P.CAJA_ID = C.CAJA_ID AND PTVT_ID = :PTOVTA
                INTO :CTACARTERA;
            END
        CUENTA = NULL;
        SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
            WHERE CUEN_COD = :CTACARTERA INTO :CUENTA, :TIPOCUEN;
        if (CUENTA IS NULL) then
            begin
            EXECUTE PROCEDURE ERROR (31, 0, :CTACARTERA, 2);
            CUENTA = CTACARTERA;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            begin
            EXECUTE PROCEDURE ERROR (31, 0, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'C') then
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :DEBITO, :CREDITO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
        if (TIPOCUEN = 'N') then
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :DEBITO, :CREDITO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
        NROI = NROI + 1;
        END /* SUMA EN CARTERA */
    /* CALCULE LOS COSTOS */
    EXECUTE PROCEDURE costo_en_ventas_contado(:fecfac,  :pref, :ptvta);
    if (COSTOS = 'A') then
        BEGIN
        FOR SELECT MAX(CTACOS), SUM(COSTO)
            FROM COSTO_VENTAS
            GROUP BY CTACOS
            INTO :CTACOSTOS, :MONTO
        DO
            BEGIN
            if (MONTO <> 0) then
                BEGIN
                CUENTA = NULL;
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :CTACOSTOS INTO :CUENTA, :TIPOCUEN;
                IF (CUENTA IS NULL) THEN
                    begin
                    EXECUTE PROCEDURE ERROR (31, 0, :CTACOSTOS, 2);
                    CUENTA = CTARTFTE;
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT ARTI_COD, CANT * COSTO
                        FROM COSTO_VENTAS
                        WHERE CTACOS = :CUENTA
                        INTO :ART, :MONTO
                    DO
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    NROI = NROI + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    END
                END /* MONTO <> 0 */
            END /* FOR */
        END /* COSTOS */
    if (COSTOS = 'K') then
        BEGIN
        SELECT SUM(COSTO)
            FROM COSTO_VENTAS
            INTO :MONTO;
        if (MONTO <> 0) then
            BEGIN
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTACOSTOS INTO :CUENTA, :TIPOCUEN;
            IF (CUENTA IS NULL) THEN
                begin
                EXECUTE PROCEDURE ERROR (31, 0, :CTACOSTOS, 2);
                CUENTA = CTARTFTE;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, REGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT ARTI_COD, CANT * COSTO
                    FROM COSTO_VENTAS
                    INTO :ART, :MONTO
                DO
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTACOSTOS, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                    NROI = NROI + 1;
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTACOSTOS, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTACOSTOS, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                END
            END /* MONTO <> 0 */
        END /* COSTOS = K */
    if (INVEN = 'A') then
        BEGIN
        FOR SELECT MAX(CTAINV), SUM(COSTO)
            FROM COSTO_VENTAS
            GROUP BY CTAINV
            INTO :CTAINVEN, :MONTO
        DO
            BEGIN
            if (MONTO <> 0) then
                BEGIN
                CUENTA = NULL;
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :CTAINVEN INTO :CUENTA, :TIPOCUEN;
                IF (CUENTA IS NULL) THEN
                    begin
                    EXECUTE PROCEDURE ERROR (31, 0, :CTAINVEN, 2);
                    CUENTA = CTAINVEN;
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, REGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT ARTI_COD, CANT * COSTO
                        FROM COSTO_VENTAS
                        WHERE CTAINV = :CUENTA
                        INTO :ART, :MONTO
                    DO
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    NROI = NROI + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    END
                END /* MONTO <> 0 */
            END /* FOR */
        END /* INVEN = A */
    if (INVEN = 'K') then
        BEGIN
        SELECT SUM(COSTO)
            FROM COSTO_VENTAS
            INTO :MONTO;
        if (MONTO <> 0) then
            BEGIN
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTAINVEN INTO :CUENTA, :TIPOCUEN;
            IF (CUENTA IS NULL) THEN
                begin
                EXECUTE PROCEDURE ERROR (31, 0, :CTAINVEN, 2);
                CUENTA = CTAINVEN;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT ARTI_COD, CANT * COSTO
                    FROM COSTO_VENTAS
                    INTO :ART, :MONTO
                DO
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTAINVEN, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                    NROI = NROI + 1;
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAINVEN, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAINVEN, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                END
            END /* MONTO <> 0 */
        END /* INVEN = K */
    /* recorra las cuentas adicionales */
    FOR SELECT INVC_CUENTA, INVC_BASE, INVC_PORC, INVC_VALOR, INVC_DB
        FROM INTERFAZ_VENTAS_CTAS
        WHERE INVE_ID = :IDINTER
        INTO :CTADIC, :BASEADIC, :PORCADIC, :VALORADIC, :DBADIC
        DO
        BEGIN
        if (VALORADIC <> 0) then
            MONTO = VALORADIC;
        ELSE
            BEGIN
            if (:BASEADIC = 'SUBTOTAL') then
                VALORADIC = vrsubt;
            if (:BASEADIC = 'DESCUENTO') then
                VALORADIC = VRDTO;
            if (:BASEADIC = 'IVA') then
                VALORADIC = VRIVA;
            if (:BASEADIC = 'ADICIONAL') then
                VALORADIC = VRADIC;
            if (:BASEADIC = 'EXTRA') then
                VALORADIC = VREXTRA;
            if (:BASEADIC = 'TOTAL') then
                VALORADIC = VRTOTAL;
            MONTO = VALORADIC * PORCADIC / 100;
            END
        if (MONTO <> 0) then
            BEGIN
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTADIC INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERROR (31, 0, :CTADIC, 2);
                CUENTA = CTADIC;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                begin
                EXECUTE PROCEDURE ERROR (31, 0, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'C') then
                BEGIN
                if (DBADIC = 'S') then
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                ELSE
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                if (DBADIC = 'S') then
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                ELSE
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                END
            NROI = NROI + 1;
            END
        END
    if (ERROR > 0) then
        VER = 'S';
    SUSPEND;
    END /* EXISTE LA INTERFAZ */
ELSE
    BEGIN
    EXECUTE PROCEDURE ERROR (31, 0, :PREF, 1);
    ERROR = ERROR + 1;
    VER = 'S';
    SUSPEND;
    END
END

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE EXISTENCIAS_DESDE_HASTA(
    FECHA DATE,
    ARTINI VARCHAR(20),
    ARTFIN VARCHAR(20),
    GRPINI VARCHAR(3),
    GRPFIN VARCHAR(3),
    BODINI VARCHAR(2),
    BODFIN VARCHAR(2),
    ORDEN CHAR(1),
    AGRUPA CHAR(1),
    DETALLE CHAR(1),
    RESERVA CHAR(1),
    ENPESO CHAR(1),
    SUCURSAL INTEGER)
RETURNS (
    CANT NUMERIC(18,4),
    COSTO NUMERIC(18,2),
    COSTO_LOTE NUMERIC(18,2),
    CODIGO VARCHAR(15),
    NOMBRE VARCHAR(60),
    UNIDAD VARCHAR(8),
    STAND VARCHAR(15),
    CODGRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    CODSUBG VARCHAR(3),
    NOMSUBG VARCHAR(30),
    CODMARC VARCHAR(3),
    NOMMARC VARCHAR(30),
    CODBOD VARCHAR(2),
    LOTE VARCHAR(15),
    NOMBOD VARCHAR(30),
    COSTOTOT NUMERIC(18,2),
    ULTCOSTO NUMERIC(18,2),
    FECHACOSTO DATE,
    CONSUMO NUMERIC(18,2),
    RESERVADO NUMERIC(18,4),
    ORDENADO NUMERIC(18,4),
    IVA NUMERIC(9,2),
    PESOUNIT NUMERIC(18,4),
    PESOTOTAL NUMERIC(18,4),
    CODBAR VARCHAR(20))
AS
declare variable exist char(1);
declare variable codini varchar(20);
declare variable codfin varchar(20);
declare variable desini varchar(20);
declare variable desfin varchar(20);
declare variable ordenc numeric(18,4);
declare variable pedido numeric(18,4);
declare variable ok char(1);
declare variable id integer;
declare variable item integer;
declare variable und varchar(8);
declare variable factor numeric(18,4);
declare variable cant2 numeric(18,4);
declare variable PEDAUTO CHAR(2);
BEGIN
if (ORDEN = 'C') then
    BEGIN
    CODINI = ARTINI;
    CODFIN = ARTFIN;
    DESINI = '';
    DESFIN = 'zz';
    END
ELSE
    BEGIN
    DESINI = ARTINI;
    DESFIN = ARTFIN;
    CODINI = '';
    CODFIN = 'zz';
    END
EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION', 'FACTURAS', 'GENERAR PEDIDO AUTOMATICAMENTE CON LA FACTURA') returning_values (pedauto);
if (DETALLE = 'B') then
  BEGIN
  FOR SELECT ARTI_COD, ARTI_DES, ARTI_UNIDAD, ARTI_EXIST, TAIV_PORC, A.GRUP_COD, A.SUBG_COD, A.MARC_COD, BODE_COD, BODE_NOM, ARTI_CONSUMO, ARTI_PESO/1000
      FROM ARTICULO A, BODEGA B, TARIFA_IVA T
      WHERE ARTI_COD >= :CODINI AND ARTI_COD <= :CODFIN AND ARTI_DES >= :DESINI AND ARTI_DES <= :DESFIN AND ESAR_COD <> 'I' AND BODE_COD >= :BODINI AND
      BODE_COD <= :BODFIN AND ((SUCU_ID = :SUCURSAL) or (:SUCURSAL = 0)) AND A.TAIV_COD = T.TAIV_COD
      INTO :CODIGO, :NOMBRE, :UNIDAD, :EXIST, :IVA, :CODGRUPO, :CODSUBG, :CODMARC, :CODBOD, :NOMBOD, :CONSUMO, :pesounit
      DO
        BEGIN
        OK = 'N';
        if (AGRUPA = 'G') then
            BEGIN
            if ((CODGRUPO >= GRPINI) AND (CODGRUPO <= GRPFIN)) then
                OK = 'S';
            end
        ELSE
            if (AGRUPA = 'M') then
                BEGIN
                if ((CODMARC >= GRPINI) AND (CODMARC <= GRPFIN)) then
                    OK = 'S';
                END
        if (OK = 'S') then
            BEGIN
            NOMGRUPO = '';
            NOMMARC = '';
            NOMSUBG = '';
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            SELECT MAX(COBA_COD) FROM BARRAS_ARTICULO WHERE ARTI_COD = :codigo AND COBA_UNIDAD = :unidad INTO :codbar;
            if (CODBAR IS NULL) then
                CODBAR = CODIGO;
            if (EXIST <> 'N') then
                BEGIN
                SELECT STAND_COD FROM STANDS WHERE ARTI_COD = :CODIGO AND STAND_BODEGA = :CODBOD INTO :STAND;
                EXECUTE PROCEDURE SALDO_INICIAL_INVENTARIO(CODIGO, FECHA, :CODBOD) returning_values (CANT);
                EXECUTE PROCEDURE COSTO_PROMEDIO_UNIDAD(CODIGO, FECHA, UNIDAD) returning_values (COSTO);
                EXECUTE PROCEDURE ULTIMO_COSTO(CODIGO, FECHA, UNIDAD) returning_values (ULTCOSTO);
                SELECT MAX(MVAR_FECHA) FROM MOVIMIENTO_ARTICULO WHERE ARTI_COD = :CODIGO AND MVAR_ENTRADA = 'S' AND MVAR_FECHA <= :FECHA INTO :FECHACOSTO;
                COSTOTOT = :CANT * :COSTO;
                CONSUMO = CONSUMO * CANT;
                if (RESERVA = 'S') then
                    BEGIN
                    SELECT SUM(ORID_ENTREGAR)
                        FROM ORDENINVENTARIO_DETALLE OD, ordenes_inventario O
                        WHERE O.ORIN_ID = OD.ORIN_ID AND ARTI_COD = :CODIGO AND ORIN_FECHA <= :FECHA AND ORIN_FECLLEGA >= :FECHA AND ORID_ANULADO = 'N' AND OD.BODE_COD = :CODBOD
                        INTO :ORDENADO;
                    if (ORDENADO IS NULL) then
                        ORDENADO = 0;
                    ORDENC = 0;
                    FOR SELECT O.ORDC_ID, OCDE_ITEM, OCDE_CANT * OCDE_FACTOR
                        FROM ORDENES_COMPRA O, ORDENES_COMPRA_DETALLE OD
                        WHERE O.ORDC_ID = OD.ORDC_ID AND OD.ARTI_COD = :CODIGO AND (ORDC_FECHA+ORDC_VALIDEZ) >= :FECHA AND ORDC_FECHA <= :FECHA AND OCDE_ANULADO = 'N' AND OD.BODE_COD = :CODBOD
                        INTO :ID, :ITEM, :CANT2
                        do
                        BEGIN
                        EXECUTE PROCEDURE FALTANTE(23, 21, ID, ITEM) returning_values (PEDIDO, UND, FACTOR);
                        if (PEDIDO * FACTOR = CANT2) then /* SI NO SE HA FACTURADO MIRE A VER SI SE REMISIONO */
                            EXECUTE PROCEDURE FALTANTE(23, 22, ID, ITEM) returning_values (PEDIDO, UND, FACTOR);
                        if (PEDIDO IS NULL) then
                            PEDIDO = 0;
                        ORDENC = ORDENC + PEDIDO * FACTOR;
                        END
                    ORDENADO = ORDENADO + ORDENC;
                    SELECT SUM(RSDE_LIBERAR)
                        FROM RESERVAS_DETALLE RD, RESERVAS R
                        WHERE R.RESE_ID = RD.RESE_ID AND ARTI_COD = :CODIGO AND RESE_FECHA <= :FECHA AND RESE_VENCE >= :FECHA AND RD.BODE_COD = :CODBOD AND RSDE_ANULADO = 'N'
                        INTO :RESERVADO;
                    if (RESERVADO IS NULL) then
                        RESERVADO = 0;
                    PEDIDO = 0;
                    FOR SELECT P.PEDI_ID, PEDE_ITEM, PEDE_CANT * PEDE_FACTOR
                        FROM PEDIDOS P, PEDIDOS_DETALLE PD
                        WHERE P.PEDI_ID = PD.PEDI_ID AND PD.ARTI_COD = :CODIGO AND (PEDI_FECHA+PEDI_VALIDEZ) >= :FECHA AND PEDI_FECHA <= :FECHA AND PEDE_ANULADO = 'N' AND BODE_COD = :CODBOD
                        INTO :ID, :ITEM, :CANT2
                        do
                        BEGIN
                        EXECUTE PROCEDURE FALTANTE(34, 31, ID, ITEM) returning_values (ORDENC, UND, FACTOR);
                        if ((ORDENC * FACTOR = CANT2) or (PEDAUTO = 'SI')) then /* SI NO SE HA FACTURADO MIRE A VER SI SE REMISIONO */
                            EXECUTE PROCEDURE FALTANTE(34, 32, ID, ITEM) returning_values (ORDENC, UND, FACTOR);
                        if (ORDENC IS NULL) then
                            ORDENC = 0;
                        PEDIDO = PEDIDO + ORDENC * FACTOR;
                        END
                    RESERVADO = RESERVADO + PEDIDO;
                    END
                ELSE
                    BEGIN
                    RESERVADO = 0;
                    ORDENADO = 0;
                    END
                if (ENPESO = 'S') then
                    BEGIN
                    if (pesounit IS NULL) then
                        pesounit = 0;
                    if (PESOUNIT <> 0) then
                        BEGIN
                        pesototal = PESOUNIT * cant;
                        SUSPEND;
                        END
                    END
                ELSE
                    SUSPEND;
                END
            END
        END
  END

if (DETALLE = 'L') then
  BEGIN
  FOR SELECT A.ARTI_COD, ARTI_DES, ARTI_UNIDAD, ARTI_EXIST, TAIV_PORC, A.GRUP_COD, A.SUBG_COD, A.MARC_COD, L.lote_nro, L.lote_nro||' - '||L.lote_vence, ARTI_CONSUMO,l.bode_cod, L.lote_saldo,l.lote_costo, ARTI_PESO/1000
      FROM ARTICULO A, LOTES l, TARIFA_IVA T
      WHERE A.ARTI_COD >= '0' AND A.ARTI_COD <= 'zz' AND ARTI_DES >= '' AND ARTI_DES <= 'zz' AND ESAR_COD <> 'I' AND A.TAIV_COD = T.TAIV_COD and a.arti_cod = l.arti_cod
      INTO :CODIGO, :NOMBRE, :UNIDAD, :EXIST, :IVA, :CODGRUPO, :CODSUBG, :CODMARC, :LOTE, :NOMBOD, :CONSUMO, :codbod, :cant, :costo_lote, :pesounit
      DO
        BEGIN
        OK = 'N';
        if (AGRUPA = 'G') then
            BEGIN
            if ((CODGRUPO >= GRPINI) AND (CODGRUPO <= GRPFIN)) then
                OK = 'S';
            end
        ELSE
            if (AGRUPA = 'M') then
                BEGIN
                if ((CODMARC >= GRPINI) AND (CODMARC <= GRPFIN)) then
                    OK = 'S';
                END
        if (OK = 'S') then
            BEGIN
            NOMGRUPO = '';
            NOMMARC = '';
            NOMSUBG = '';
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            SELECT MAX(COBA_COD) FROM BARRAS_ARTICULO WHERE ARTI_COD = :codigo AND COBA_UNIDAD = :unidad INTO :codbar;
            if (CODBAR IS NULL) then
                CODBAR = CODIGO;

            if (EXIST <> 'N') then
                BEGIN
                EXECUTE PROCEDURE COSTO_PROMEDIO_UNIDAD(CODIGO, FECHA, UNIDAD) returning_values (COSTO);
                EXECUTE PROCEDURE ULTIMO_COSTO(CODIGO, FECHA, UNIDAD) returning_values (ULTCOSTO);
                SELECT MAX(MVAR_FECHA) FROM MOVIMIENTO_ARTICULO WHERE ARTI_COD = :CODIGO AND MVAR_ENTRADA = 'S' AND MVAR_FECHA <= :FECHA INTO :FECHACOSTO;
                COSTOTOT = :CANT * :COSTO;
                CONSUMO = CONSUMO * CANT;
                if (RESERVA = 'S') then
                    BEGIN
                    SELECT SUM(ORID_ENTREGAR)
                        FROM ORDENINVENTARIO_DETALLE OD, ordenes_inventario O
                        WHERE O.ORIN_ID = OD.ORIN_ID AND ARTI_COD = :CODIGO AND ORIN_FECHA <= :FECHA AND ORIN_FECLLEGA >= :FECHA AND ORID_ANULADO = 'N'
                        INTO :ORDENADO;
                    if (ORDENADO IS NULL) then
                        ORDENADO = 0;
                    ORDENC = 0;
                    FOR SELECT O.ORDC_ID, OCDE_ITEM, OCDE_CANT * OCDE_FACTOR
                        FROM ORDENES_COMPRA O, ORDENES_COMPRA_DETALLE OD
                        WHERE O.ORDC_ID = OD.ORDC_ID AND OD.ARTI_COD = :CODIGO AND (ORDC_FECHA+ORDC_VALIDEZ) >= :FECHA AND ORDC_FECHA <= :FECHA AND OCDE_ANULADO = 'N'
                        INTO :ID, :ITEM, :CANT2
                        do
                        BEGIN
                        EXECUTE PROCEDURE FALTANTE(23, 21, ID, ITEM) returning_values (PEDIDO, UND, FACTOR);
                        if (PEDIDO * FACTOR = CANT2) then /* SI NO SE HA FACTURADO MIRE A VER SI SE REMISIONO */
                            EXECUTE PROCEDURE FALTANTE(23, 22, ID, ITEM) returning_values (PEDIDO, UND, FACTOR);
                        if (PEDIDO IS NULL) then
                            PEDIDO = 0;
                        ORDENC = ORDENC + PEDIDO * FACTOR;
                        END
                    ORDENADO = ORDENADO + ORDENC;
                    SELECT SUM(RSDE_LIBERAR)
                        FROM RESERVAS_DETALLE RD, RESERVAS R
                        WHERE R.RESE_ID = RD.RESE_ID AND ARTI_COD = :CODIGO AND RESE_FECHA <= :FECHA AND RESE_VENCE >= :FECHA AND RSDE_ANULADO = 'N'
                        INTO :RESERVADO;
                    if (RESERVADO IS NULL) then
                        RESERVADO = 0;
                    PEDIDO = 0;
                    FOR SELECT P.PEDI_ID, PEDE_ITEM, PEDE_CANT * PEDE_FACTOR
                        FROM PEDIDOS P, PEDIDOS_DETALLE PD
                        WHERE P.PEDI_ID = PD.PEDI_ID AND PD.ARTI_COD = :CODIGO AND (PEDI_FECHA+PEDI_VALIDEZ) >= :FECHA AND PEDI_FECHA <= :FECHA AND PEDE_ANULADO = 'N'
                        INTO :ID, :ITEM, :CANT2
                        do
                        BEGIN
                        EXECUTE PROCEDURE FALTANTE(34, 31, ID, ITEM) returning_values (ORDENC, UND, FACTOR);
                        if ((ORDENC * FACTOR = CANT2) or (PEDAUTO = 'SI')) then /* SI NO SE HA FACTURADO MIRE A VER SI SE REMISIONO */
                            EXECUTE PROCEDURE FALTANTE(34, 32, ID, ITEM) returning_values (ORDENC, UND, FACTOR);
                        if (ORDENC IS NULL) then
                            ORDENC = 0;
                        PEDIDO = PEDIDO + ORDENC * FACTOR;
                        END
                    RESERVADO = RESERVADO + PEDIDO;
                    END
                ELSE
                    BEGIN
                    RESERVADO = 0;
                    ORDENADO = 0;
                    END
                if (ENPESO = 'S') then
                    BEGIN
                    if (pesounit IS NULL) then
                        pesounit = 0;
                    if (PESOUNIT <> 0) then
                        BEGIN
                        pesototal = PESOUNIT * cant;
                        SUSPEND;
                        END
                    END
                ELSE
                    SUSPEND;
                END
            END
        END
  end
if (DETALLE = 'N') then
  BEGIN
  FOR SELECT ARTI_COD, ARTI_DES, ARTI_UNIDAD, ARTI_EXIST, TAIV_PORC, A.GRUP_COD, A.SUBG_COD, A.MARC_COD, ARTI_CONSUMO, ARTI_PESO/1000
      FROM ARTICULO A, TARIFA_IVA T
      WHERE ARTI_COD >= :CODINI AND ARTI_COD <= :CODFIN AND ARTI_DES >= :DESINI AND ARTI_DES <= :DESFIN AND ESAR_COD <> 'I' AND A.TAIV_COD = T.TAIV_COD
      INTO :CODIGO, :NOMBRE, :UNIDAD, :EXIST, :IVA, :CODGRUPO, :CODSUBG, :CODMARC, :CONSUMO, :pesounit
      DO
        BEGIN
        OK = 'N';
        if (AGRUPA = 'G') then
            BEGIN
            if ((GRPINI = '0') AND (GRPFIN = 'zz')) then
                OK = 'S';
            else
                if ((CODGRUPO >= GRPINI) AND (CODGRUPO <= GRPFIN)) then
                    OK = 'S';
            end
        ELSE
            if (AGRUPA = 'M') then
                BEGIN
                if ((GRPINI = '0') AND (GRPFIN = 'zzz')) then
                    OK = 'S';
                else
                    if ((CODMARC >= GRPINI) AND (CODMARC <= GRPFIN)) then
                        OK = 'S';
                END
        if (OK = 'S') then
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            SELECT MAX(COBA_COD) FROM BARRAS_ARTICULO WHERE ARTI_COD = :codigo AND COBA_UNIDAD = :unidad INTO :codbar;
            if (CODBAR IS NULL) then
                CODBAR = CODIGO;

            if (EXIST <> 'N') then
                BEGIN
                EXECUTE PROCEDURE SALDO_INICIAL_TOTAL_INV(CODIGO, FECHA) returning_values (CANT);
                EXECUTE PROCEDURE COSTO_PROMEDIO_UNIDAD(CODIGO, FECHA, UNIDAD) returning_values (COSTO);
                EXECUTE PROCEDURE ULTIMO_COSTO(CODIGO, FECHA, UNIDAD) returning_values (ULTCOSTO);
                SELECT MAX(MVAR_FECHA) FROM MOVIMIENTO_ARTICULO WHERE ARTI_COD = :CODIGO AND MVAR_ENTRADA = 'S' AND MVAR_FECHA <= :FECHA INTO :FECHACOSTO;
                COSTOTOT = :CANT * :COSTO;
                CONSUMO = CONSUMO * CANT;
                if (RESERVA = 'S') then
                    BEGIN
                    SELECT SUM(ORID_ENTREGAR)
                        FROM ORDENINVENTARIO_DETALLE OD, ordenes_inventario O
                        WHERE O.ORIN_ID = OD.ORIN_ID AND ARTI_COD = :CODIGO AND ORIN_FECHA <= :FECHA AND ORIN_FECLLEGA >= :FECHA AND ORID_ANULADO = 'N'
                        INTO :ORDENADO;
                        if (ORDENADO IS NULL) then
                            ORDENADO = 0;
                    ORDENC = 0;
                    FOR SELECT O.ORDC_ID, OCDE_ITEM, OCDE_CANT * OCDE_FACTOR
                        FROM ORDENES_COMPRA O, ORDENES_COMPRA_DETALLE OD
                        WHERE O.ORDC_ID = OD.ORDC_ID AND OD.ARTI_COD = :CODIGO AND (ORDC_FECHA+ORDC_VALIDEZ) >= :FECHA AND ORDC_FECHA <= :FECHA AND OCDE_ANULADO = 'N'
                        INTO :ID, :ITEM, :CANT2
                        do
                        BEGIN
                        EXECUTE PROCEDURE FALTANTE(23, 21, ID, ITEM) returning_values (PEDIDO, UND, FACTOR);
                        if (PEDIDO * FACTOR = CANT2) then /* SI NO SE HA FACTURADO MIRE A VER SI SE REMISIONO */
                            EXECUTE PROCEDURE FALTANTE(23, 22, ID, ITEM) returning_values (PEDIDO, UND, FACTOR);
                        if (PEDIDO IS NULL) then
                            PEDIDO = 0;
                        ORDENC = ORDENC + PEDIDO * FACTOR;
                        END
                    ORDENADO = ORDENADO + ORDENC;
                    SELECT SUM(RSDE_LIBERAR)
                        FROM RESERVAS_DETALLE RD, RESERVAS R
                        WHERE R.RESE_ID = RD.RESE_ID AND ARTI_COD = :CODIGO AND RESE_FECHA <= :FECHA AND RESE_VENCE >= :FECHA AND RSDE_ANULADO = 'N'
                        INTO :RESERVADO;
                    if (RESERVADO IS NULL) then
                        RESERVADO = 0;
                    PEDIDO = 0;
                    FOR SELECT P.PEDI_ID, PEDE_ITEM, PEDE_CANT * PEDE_FACTOR
                        FROM PEDIDOS P, PEDIDOS_DETALLE PD, PUNTO_VENTA PT
                        WHERE P.PEDI_ID = PD.PEDI_ID AND PD.ARTI_COD = :CODIGO AND PT.ptvt_id = P.PTVT_ID AND (PEDI_FECHA+PEDI_VALIDEZ) >= :FECHA AND PEDI_FECHA <= :FECHA AND PEDE_ANULADO = 'N'
                        INTO :ID, :ITEM, :CANT2
                        do
                        BEGIN
                        EXECUTE PROCEDURE FALTANTE(34, 31, ID, ITEM) returning_values (ORDENC, UND, FACTOR);
                        if ((ORDENC * FACTOR = CANT2) or (PEDAUTO = 'SI')) then /* SI NO SE HA FACTURADO MIRE A VER SI SE REMISIONO */
                            EXECUTE PROCEDURE FALTANTE(34, 32, ID, ITEM) returning_values (ORDENC, UND, FACTOR);
                        if (ORDENC IS NULL) then
                            ORDENC = 0;
                        PEDIDO = PEDIDO + ORDENC * FACTOR;
                        END
                    if (PEDIDO IS NULL) then
                        PEDIDO = 0;
                    RESERVADO = RESERVADO + PEDIDO;
                    END
                ELSE
                    BEGIN
                    RESERVADO = 0;
                    ORDENADO = 0;
                    END
                if (ENPESO = 'S') then
                    BEGIN
                    if (pesounit IS NULL) then
                        pesounit = 0;
                    if (PESOUNIT <> 0) then
                        BEGIN
                        pesototal = PESOUNIT * cant;
                        SUSPEND;
                        END
                    END
                ELSE
                    SUSPEND;
                END
            END
        END
  END
END

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE INVENTARIO_FAMILIA(
    FECHA DATE,
    FAMILIA VARCHAR(20))
RETURNS (
    ARTICULO VARCHAR(20),
    INTERNO VARCHAR(20),
    DESCRIPCION VARCHAR(60),
    CANTIDAD NUMERIC(18,2),
    UNIDAD VARCHAR(8),
    TOTAL NUMERIC(18,2))
AS
declare variable COSTO NUMERIC(18,4);
begin
FOR SELECT A.ARTI_COD, ARTI_DES, ARTI_UNIDAD, p.pvar_cod FROM ARTICULO A, PROVEEDOR_ARTICULO P
    WHERE ESAR_COD <> 'I' AND A.arti_cod = P.arti_cod AND P.terc_nit = :FAMILIA
    INTO :ARTICULO, :descripcion, :UNIDAD, :INTERNO
    DO
    BEGIN
    EXECUTE PROCEDURE SALDO_INICIAL_TOTAL_INV(ARTICULO, FECHA) returning_values (cantidad);
    EXECUTE PROCEDURE COSTO_PROMEDIO_UNIDAD(ARTICULO, FECHA, UNIDAD) returning_values (COSTO);
    TOTAL = COSTO * CANTIDAD;
    suspend;
    END
end

^

SET TERM ; ^

SET TERM ^ ;

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

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE DEVOLUCIONES_SIN_CONTABILIDAD(
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    ID INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    ESTADO VARCHAR(20),
    IDI INTEGER,
    IDC INTEGER)
AS
DECLARE VARIABLE VER CHAR(2);
declare variable FECICNT VARCHAR(10);
declare variable FECFCNT VARCHAR(10);
declare variable ERROR INTEGER;
declare variable idref INTEGER;
BEGIN
EXECUTE PROCEDURE fecha_a_conta(FECINI) returning_values (FECICNT);
EXECUTE PROCEDURE fecha_a_conta(FECFIN) returning_values (FECFCNT);
FOR SELECT DEVT_ID, PREF_PRE, DEVT_NUMERO FROM devoluciones_ventas WHERE DEVT_ANULADO = 'N' AND
    DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN
    INTO :ID, :PREF, :NUMERO
DO
  BEGIN
  idref = null;
  SELECT ENCO_IDREF FROM COMPROBANTE_ENCABEZADO WHERE ENCO_TIPOREF = 33 AND ENCO_FECHA >= :FECICNT AND ENCO_FECHA <= :FECFCNT and ENCO_IDREF = :id into :idref;
  if (idref IS NULL) then
  begin
   ESTADO = 'PROCESANDO';
   SUSPEND;
   SELECT MAX(INVE_ID) FROM INTERFAZ_VENTAS WHERE PREF_PRE = :PREF AND TIDO_COD = 33 INTO :IDI;
   EXECUTE PROCEDURE contabil_devolcli (:ID, :IDI) RETURNING_VALUES (:ERROR, :VER, :IDC);
   if (ERROR = 0) then
    BEGIN
    EXECUTE PROCEDURE CONTABILIZA_PENDIENTE (:IDC);
    ESTADO = 'OK';
    END
   ELSE
    ESTADO = 'ERROR';
   suspend;
  End
  END
END

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE FACTURAS_SIN_CONTABILIDAD(
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    ID INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    ESTADO VARCHAR(20),
    IDI INTEGER,
    IDC INTEGER)
AS
DECLARE VARIABLE VER CHAR(2);
declare variable FECICNT VARCHAR(10);
declare variable FECFCNT VARCHAR(10);
declare variable ERROR INTEGER;
declare variable idref INTEGER;
BEGIN
EXECUTE PROCEDURE fecha_a_conta(FECINI) returning_values (FECICNT);
EXECUTE PROCEDURE fecha_a_conta(FECFIN) returning_values (FECFCNT);
FOR SELECT FACT_ID, PREF_PRE, FACT_NUMERO FROM FACTURAS WHERE FACT_ANULADO = 'N' AND
    FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN INTO :ID, :PREF, :NUMERO
DO
  BEGIN
  idref = null;
  SELECT ENCO_IDREF FROM COMPROBANTE_ENCABEZADO WHERE ENCO_TIPOREF = 31 AND ENCO_FECHA >= :FECICNT AND ENCO_FECHA <= :FECFCNT and ENCO_IDREF = :ID into :idref;
  if (idref IS NULL) then
  begin
   ESTADO = 'PROCESANDO';
   ERROR = NULL;
   SUSPEND;
   SELECT MAX(INVE_ID) FROM INTERFAZ_VENTAS WHERE PREF_PRE = :PREF AND TIDO_COD = 31 INTO :IDI;
   EXECUTE PROCEDURE CONTABIL_FACTURA (:ID, :IDI) RETURNING_VALUES (:ERROR, VER, :IDC);
   if ((ERROR = 0) or (error IS NULL)) then
    BEGIN
    EXECUTE PROCEDURE CONTABILIZA_PENDIENTE (:IDC);
    ESTADO = 'OK';
    END
   ELSE
    ESTADO = 'ERROR';
   suspend;
  end
  END
END

^

SET TERM ; ^

SET TERM ^ ;

ALTER TRIGGER AJUSTES_DETALLE_AI
AS
declare variable fec date;
declare variable CONC VARCHAR(60);
declare variable Pref varchar(4);
declare variable Num varchar(6);
declare variable CANTAJ numeric(18,4);
declare variable COSTO NUMERIC(18,2);
declare variable factor numeric(18,4);
declare variable NOAJUSTAR CHAR(1);
BEGIN
  if ((NEW.AJUS_ID <> 0) and (new.ajde_anulado = 'N')) then
    BEGIN
    select AJUS_fecha, AJUS_conc, AJUS_NUMERO, PREF_PRE, AJUS_NOAJUSTAR
        from AJUSTES where AJUS_id = new.AJUS_id into :fec, :conc, :Num, :Pref, :noajustar;
    if (noajustar = 'N') then
        begin
        execute procedure factor_unidad_cant(new.arti_cod, new.ajus_unidad) returning_values(factor);
        CANTAJ = NEW.ajus_exant - (NEW.ajus_exnue * :factor);
        /* CUANDO CAMBIA LA EXISTENCIA REGISTRE EL MOV. */

        if (CANTAJ > 0) then
          BEGIN
          /* ES UNA SALIDA */
          INSERT INTO MOVIMIENTO_ARTICULO
            (ARTI_COD, MVAR_CONS, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM)
            VALUES(NEW.ARTI_COD, GEN_ID(ID_MOVARTI,1), NEW.BODE_COD, :FEC, 14, NEW.AJUS_id,
            :CONC, :cantaj, 0, 'N', NEW.ajus_lote, :Pref, :Num, NEW.ajus_item);
          END
        ELSE
          BEGIN
          /* ES UNA ENTRADA */
          EXECUTE PROCEDURE costo_promedio(NEW.arti_cod, :FEC) returning_values (:COSTO);
          INSERT INTO MOVIMIENTO_ARTICULO
            (ARTI_COD, MVAR_CONS, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM)
            VALUES(NEW.ARTI_COD, GEN_ID(ID_MOVARTI,1), NEW.BODE_COD, :FEC, 14, NEW.AJUS_id,
            :CONC, abs(:cantaj), :COSTO, 'S', NEW.ajus_lote, :Pref, :Num, NEW.ajus_item);
          END
        end
    END
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER TRIGGER AJUSTES_DETALLE_AU
as
declare variable fec date;
declare variable CONC VARCHAR(60);
declare variable cantaj numeric(18,4);
declare variable Pref varchar(4);
declare variable Num varchar(6);
declare variable COSTO NUMERIC(18,2);
declare variable factor numeric(18,4);
declare variable NOAJUSTAR CHAR(1);
BEGIN
if ((old.ajus_id <> 0) and (old.ajde_anulado = 'N')) then
    DELETE FROM MOVIMIENTO_ARTICULO WHERE (mvar_tipodoc = 14) and (mvar_idref = new.ajus_id) and (mvar_item = new.ajus_item);
if ((NEW.AJUS_id <> 0) and (NEW.ajde_anulado = 'N')) then
    begin
    select AJUS_fecha, AJUS_conc, AJUS_NUMERO, PREF_PRE, AJUS_NOAJUSTAR
        from AJUSTES where AJUS_id = new.AJUS_id into :fec, :conc, :Num, :Pref, :NOAJUSTAR;
    if (NOAJUSTAR = 'N') then
        BEGIN
        execute procedure factor_unidad_cant(new.arti_cod, new.ajus_unidad) returning_values(factor);
        CANTAJ = NEW.ajus_exant - (NEW.ajus_exnue * :factor);
        /* CUANDO CAMBIA LA EXISTENCIA REGISTRE EL MOV. */
        if (CANTAJ > 0) then
            BEGIN
            /* ES UNA SALIDA */
            INSERT INTO MOVIMIENTO_ARTICULO
                (ARTI_COD, MVAR_CONS, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM)
                VALUES(NEW.ARTI_COD, GEN_ID(ID_MOVARTI,1), NEW.BODE_COD, :FEC, 14, NEW.AJUS_id,
                :CONC, :cantaj, 0, 'N', NEW.ajus_lote, :Pref, :Num, new.ajus_item);
            END
        ELSE
            BEGIN
            /* ES UNA ENTRADA */
            EXECUTE PROCEDURE costo_promedio(NEW.arti_cod, :FEC) returning_values (:COSTO);
            INSERT INTO MOVIMIENTO_ARTICULO
                (ARTI_COD, MVAR_CONS, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM)
                VALUES(NEW.ARTI_COD, GEN_ID(ID_MOVARTI,1), NEW.BODE_COD, :FEC, 14, NEW.AJUS_id,
                :CONC, abs(:cantaj), :costo, 'S', NEW.ajus_lote, :Pref, :Num, new.ajus_item);
            END
        END
    END
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER TRIGGER AJUSTES_DETALLE_BI
as
declare variable FECHA DATE;
begin
/* COLOQUE EL COSTO PROMEDIO */
SELECT AJUS_FECHA FROM AJUSTES WHERE AJUS_ID = NEW.ajus_id INTO :FECHA;
EXECUTE PROCEDURE costo_promedio(NEW.arti_cod, :FECHA) returning_values (NEW.ajde_costo);
end
^

SET TERM ; ^

SET TERM ^ ;

ALTER TRIGGER DESENSAMBLES_DETALLE_AI
AS
declare variable fec date;
declare variable CONC VARCHAR(60);
declare variable factor numeric(18,4);
declare variable COSTO numeric(18,2);
declare variable Pref varchar(4);
declare variable Num varchar(6);
declare variable CANT NUMERIC(18,2);
declare variable CANTOT CHAR(2);
BEGIN
  if ((NEW.DESE_id <> 0) and (new.dede_anulado = 'N')) then
    begin
    select dese_fecha, dese_conc, pref_pre, dese_numero, dese_cant * dese_factor
        from desensambles where dese_id = new.dese_id into :fec, :conc, :Pref, :Num, :CANT;
    execute procedure factor_unidad_cant(new.arti_cod, new.dede_unidad) returning_values(factor);
    execute procedure costo_promedio(new.arti_cod, :FEC) returning_values (:COSTO);
    EXECUTE PROCEDURE LEE_CONFIGURACION('INVENTARIO', 'ENSAMBLES', 'FORMACIONES CON CANTIDADES TOTALES') returning_values (:CANTOT);
    if (CANTOT <> 'SI') then
        CANT = CANT * factor * new.dede_cant;
    ELSE
        CANT = factor * new.dede_cant;
    INSERT INTO MOVIMIENTO_ARTICULO
      (ARTI_COD, MVAR_CONS, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM)
      VALUES(NEW.ARTI_COD, GEN_ID(ID_MOVARTI,1), NEW.BODE_COD, :FEC, 16, NEW.dese_id,
      :CONC, :CANT, :COSTO, 'S', new.dede_lote, :Pref, :Num, new.dese_item);

    /* RECORRA LAS LISTAS DE PRECIOS Y CAMBIE EL PRECIO */
    EXECUTE PROCEDURE CALCULA_PRECIOS(NEW.ARTI_COD, :fec);
    END
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER TRIGGER DESENSAMBLES_DETALLE_AU
AS
declare variable fec date;
declare variable CONC VARCHAR(60);
declare variable Pref varchar(4);
declare variable Num varchar(6);
declare variable factor numeric(18,4);
declare variable COSTO numeric(18,2);
declare variable CANT NUMERIC(18,2);
declare variable CANTOT CHAR(2);
BEGIN
/* Anule el anterior */
if ((OLD.DESE_ID <> 0) AND (OLD.dede_anulado = 'N')) then
    delete from movimiento_articulo where (mvar_tipodoc = 16) and (mvar_idref = old.DESE_id) and (mvar_item = old.dese_item);
if ((NEW.dese_id <> 0) AND (new.dede_anulado = 'N')) then
    BEGIN
    EXECUTE PROCEDURE LEE_CONFIGURACION('INVENTARIO', 'ENSAMBLES', 'FORMACIONES CON CANTIDADES TOTALES') returning_values (:CANTOT);
    select dese_fecha, dese_conc, pref_pre, dese_numero, dese_cant * dese_factor
        from desensambles where dese_id = new.dese_id into :fec, :conc, :Pref, :Num, :CANT;
    execute procedure factor_unidad_cant(new.arti_cod, new.dede_unidad) returning_values(factor);
    execute procedure costo_promedio(new.arti_cod, :FEC) returning_values (:COSTO);
    if (CANTOT <> 'SI') then
        CANT = CANT * factor * new.dede_cant;
    ELSE
        CANT = factor * new.dede_cant;
    INSERT INTO MOVIMIENTO_ARTICULO
        (ARTI_COD, MVAR_CONS, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM)
        VALUES(NEW.ARTI_COD, GEN_ID(ID_MOVARTI,1), NEW.BODE_COD, :FEC, 16, NEW.dese_id,
        :CONC, :CANT, :COSTO, 'S', new.dede_lote, :Pref, :Num, new.dese_item);

    /* RECORRA LAS LISTAS DE PRECIOS Y CAMBIE EL PRECIO */
    EXECUTE PROCEDURE CALCULA_PRECIOS(NEW.ARTI_COD, :fec);
    END
END
^

SET TERM ; ^

SET TERM ^ ;

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

SET TERM ; ^

SET TERM ^ ;

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

SET TERM ; ^

SET TERM ^ ;

ALTER TRIGGER NOTAS_CREDITO_PROVEEDOR_AI
AS
declare variable COSTO NUMERIC(18,2);
declare variable EXISTENCIA NUMERIC(18,4);
declare variable CODBOD VARCHAR(3);
BEGIN
if ((NEW.NCPR_ID <> 0) and (new.ncpr_anulado = 'N')) then
    BEGIN
    /* Registre el nuevo saldo del documento */
    INSERT INTO SALDOS_DOC_CXPAGAR (SDCP_TIPOREF, SDCP_IDREF, SDCP_FECHA, TERC_NIT, SDCP_RTEFTE, SDCP_RTIVA, SDCP_RTICA, SDCP_ABONO, SDCP_ABRTFTE, SDCP_ABRTIVA, SDCP_ABRTICA, SDCP_DEBITO, SDCP_MONTO, SDCP_TRM)
        VALUES (52, NEW.NCPR_ID, NEW.ncpr_fecha, NEW.terc_nit, (NEW.ncpr_rtftemonto * -1), (NEW.ncpr_rtivamonto * -1), (NEW.ncpr_rticamonto * -1), 0, 0, 0, 0, 'N', (NEW.ncpr_monto+NEW.ncpr_ivamonto)*-1, NEW.ncpr_trm);
    /* Registre el movimiento del proveedor */
    INSERT INTO MOVIMIENTO_PROVEEDOR (MVPR_ID, TERC_NIT, MVPR_TIPOREF, MVPR_IDREF, MVPR_FECHA, MVPR_VENCE, MVPR_CONC, MVPR_MONTO, MVPR_RTFTE, MVPR_RTIVA, MVPR_RTICA, MVPR_DEBITO, MVPR_ABONO, MVPR_PREFIJO, MVPR_NUMERO, MVPR_TRM)
      VALUES (GEN_ID(ID_MOVPROV, 1), NEW.TERC_NIT, 52, NEW.NCPR_ID, NEW.NCPR_FECHA, NEW.NCPR_FECHA, NEW.NCPR_CONC, NEW.NCPR_MONTO+NEW.NCPR_IVAMONTO, NEW.NCPR_RTFTEMONTO, NEW.NCPR_RTIVAMONTO, NEW.NCPR_RTICAMONTO, 'N', 'N', NEW.pref_pre, NEW.ncpr_numero, NEW.ncpr_trm);
    /* afecte el articulo */
    if (new.arti_cod <> '') then
        begin
        /* CALCULE EL NUEVO COSTO */
        execute procedure costo_promedio (new.arti_cod, new.ncpr_fecha) returning_values (:COSTO);
        execute procedure saldo_total_inventario (new.arti_cod, new.ncpr_fecha) returning_values (:EXISTENCIA);
        COSTO = (COSTO * EXISTENCIA - (NEW.ncpr_monto - NEW.ncpr_ivamonto)) / EXISTENCIA;
        FOR SELECT DISTINCT BODE_COD FROM EXISTENCIA WHERE ARTI_COD = NEW.ARTI_COD INTO :CODBOD do
            BEGIN
            execute procedure saldo_inventario (new.arti_cod, :CODBOD, new.ncpr_fecha) returning_values (:EXISTENCIA);
            /* SAQUE TODO LO QUE TENGA */
            INSERT INTO MOVIMIENTO_ARTICULO
              (ARTI_COD, MVAR_CONS, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM, TERC_NIT)
              VALUES(NEW.ARTI_COD, GEN_ID(ID_MOVARTI,1), :CODBOD, new.ncpr_fecha, 52, NEW.ncpr_id,
              new.ncpr_conc, :EXISTENCIA, 0, 'N', '', new.pref_pre, new.ncpr_numero, 1, new.terc_nit);
            /* META TODO CON EL NUEVO COSTO */
            INSERT INTO MOVIMIENTO_ARTICULO
              (ARTI_COD, MVAR_CONS, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM, TERC_NIT)
              VALUES(NEW.ARTI_COD, GEN_ID(ID_MOVARTI,1), :CODBOD, new.ncpr_fecha, 52, NEW.ncpr_id,
              new.ncpr_conc, :EXISTENCIA, :COSTO, 'S', '', new.pref_pre, new.ncpr_numero, 1, new.terc_nit);
            END
        /* RECORRA LAS LISTAS DE PRECIOS Y CAMBIE EL PRECIO */
        EXECUTE PROCEDURE CALCULA_PRECIOS(NEW.ARTI_COD, new.ncpr_fecha);
        end
    INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
        VALUES (USER, 52, NEW.ncpr_id, 'I', NEW.pref_pre || NEW.ncpr_numero);
    END
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER TRIGGER NOTAS_CREDITO_PROVEEDOR_AU
AS
declare variable ABONOS char(1);
declare variable consec INTEGER;
declare variable COSTO NUMERIC(18,2);
declare variable EXISTENCIA NUMERIC(18,4);
declare variable CODBOD VARCHAR(3);
BEGIN
if (new.ncpr_anulado = 'S') then
    begin
    select enco_consec from comprobante_encabezado where enco_tiporef = 52 and enco_idref = old.ncpr_id into :consec;
    if (NOT consec is null) then
      delete from comprobante_detalle where enco_consec = :consec;
    delete from comprobante_encabezado where enco_tiporef = 52 and enco_idref = old.ncpr_id;
    INSERT INTO AUDITORIA (AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
        VALUES (USER, 52, new.ncpr_id, 'A', NEW.pref_pre || NEW.ncpr_numero);
    end

/* BORRE EL REGISTRO PREVIO */
if ((old.ncpr_id <> 0) and (old.ncpr_anulado = 'N')) then
    begin
    /* Verifique si habia abonos a la nota */
    ABONOS = 'N';
    select 'S' FROM SALDOS_DOC_CXPAGAR WHERE SDCP_TIPOREF = 52 AND SDCP_IDREF = OLD.NCPR_ID AND SDCP_ABONO <> 0 INTO :ABONOS;
    if (ABONOS = 'N') then
        BEGIN
        /* BORRE EL REGISTRO PREVIO */
        delete from saldos_doc_cxpagar where sdcp_tiporef = 52 and sdcp_idref = old.ncpr_id;
        delete from movimiento_PROVEEDOR where (mvpr_tiporef = 52) and (mvpr_idref = old.ncpr_id);
        delete from movimiento_articulo where  (mvar_tipodoc = 52) and (mvar_idref = old.ncpr_id);
        END
    else
        exception DOCUMENTO_CON_ABONOS 'El descuento de proveedor ' || old.pref_pre || old.ncpr_numero || ' tiene abonos registrados.';
    end
if ((new.ncpr_id <> 0) and (new.ncpr_anulado = 'N')) then
    begin
    /* Registre el nuevo saldo del documento */
    INSERT INTO SALDOS_DOC_CXPAGAR (SDCP_TIPOREF, SDCP_IDREF, SDCP_FECHA, TERC_NIT, SDCP_RTEFTE, SDCP_RTIVA, SDCP_RTICA, SDCP_ABONO, SDCP_ABRTFTE, SDCP_ABRTIVA, SDCP_ABRTICA, SDCP_DEBITO, SDCP_MONTO, SDCP_TRM)
        VALUES (52, NEW.NCPR_ID, NEW.ncpr_fecha, NEW.terc_nit, (NEW.ncpr_rtftemonto * -1), (NEW.ncpr_rtivamonto * -1), (NEW.ncpr_rticamonto * -1), 0, 0, 0, 0, 'N', (NEW.ncpr_monto+NEW.ncpr_ivamonto)*-1, NEW.ncpr_trm);
    /* Registre el movimiento del proveedor */
    INSERT INTO MOVIMIENTO_PROVEEDOR (MVPR_ID, TERC_NIT, MVPR_TIPOREF, MVPR_IDREF, MVPR_FECHA, MVPR_VENCE, MVPR_CONC, MVPR_MONTO, MVPR_RTFTE, MVPR_RTIVA, MVPR_RTICA, MVPR_DEBITO, MVPR_ABONO, MVPR_PREFIJO, MVPR_NUMERO, MVPR_TRM)
        VALUES (GEN_ID(ID_MOVPROV, 1), NEW.TERC_NIT, 52, NEW.NCPR_ID, NEW.NCPR_FECHA, NEW.NCPR_FECHA, NEW.NCPR_CONC, NEW.NCPR_MONTO+NEW.ncpr_ivamonto, NEW.NCPR_RTFTEMONTO, NEW.NCPR_RTIVAMONTO, NEW.NCPR_RTICAMONTO, 'N', 'N', NEW.pref_pre, NEW.ncpr_numero, NEW.ncpr_trm);
    /* afecte el articulo */
    if (new.arti_cod <> '') then
        begin
        /* CALCULE EL NUEVO COSTO */
        execute procedure costo_promedio (new.arti_cod, new.ncpr_fecha) returning_values (:COSTO);
        execute procedure saldo_total_inventario (new.arti_cod, new.ncpr_fecha) returning_values (:EXISTENCIA);
        COSTO = (COSTO * EXISTENCIA - (NEW.ncpr_monto - NEW.ncpr_ivamonto)) / EXISTENCIA;
        FOR SELECT DISTINCT BODE_COD FROM EXISTENCIA WHERE ARTI_COD = NEW.ARTI_COD INTO :CODBOD do
            BEGIN
            execute procedure saldo_inventario (new.arti_cod, :CODBOD, new.ncpr_fecha) returning_values (:EXISTENCIA);
            /* SAQUE TODO LO QUE TENGA */
            INSERT INTO MOVIMIENTO_ARTICULO
                (ARTI_COD, MVAR_CONS, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM, TERC_NIT)
                VALUES(NEW.ARTI_COD, GEN_ID(ID_MOVARTI,1), :CODBOD, new.ncpr_fecha, 52, NEW.ncpr_id,
                new.ncpr_conc, :EXISTENCIA, 0, 'N', '', new.pref_pre, new.ncpr_numero, 1, new.terc_nit);
            /* META TODO CON EL NUEVO COSTO */
            INSERT INTO MOVIMIENTO_ARTICULO
                (ARTI_COD, MVAR_CONS, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM, TERC_NIT)
                VALUES(NEW.ARTI_COD, GEN_ID(ID_MOVARTI,1), :CODBOD, new.ncpr_fecha, 52, NEW.ncpr_id,
                new.ncpr_conc, :EXISTENCIA, :COSTO, 'S', '', new.pref_pre, new.ncpr_numero, 1, new.terc_nit);
            END
        /* RECORRA LAS LISTAS DE PRECIOS Y CAMBIE EL PRECIO */
        EXECUTE PROCEDURE CALCULA_PRECIOS(NEW.ARTI_COD, new.ncpr_fecha);
        end
    INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
        VALUES (USER, 52, NEW.ncpr_id, 'U', NEW.pref_pre || NEW.ncpr_numero);
    end
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER TRIGGER PRECIOS_ARTICULO_BI
AS
declare variable UNIDAD VARCHAR(8);
declare variable UOR VARCHAR(20);
declare variable COSTOP NUMERIC(18, 2);
declare variable COSTOU NUMERIC(18, 2);
declare variable COSTO NUMERIC(18, 2);
declare variable DIG INTEGER;
declare variable IVAINC CHAR(1);
declare variable IVAINC1 CHAR(1);
declare variable TARIVA NUMERIC(9,2);
declare variable BASE varchar(10);
declare variable CAMBIO CHAR(7);
declare variable LISTA INTEGER;
declare variable PRECIO NUMERIC(18, 4);
BEGIN
if (NEW.prar_util IS NULL) then
    NEW.prar_util = 0;
if (NEW.prar_margen IS NULL) then
    NEW.prar_margen = 0;
if (NEW.prar_cantmin IS NULL) then
    NEW.prar_cantmin = 0.01;
if (NEW.prar_auto = 'S') then
    BEGIN
    SELECT LIPR_MODIF FROM LISTA_PRECIOS L
        WHERE LIPR_COD = NEW.LIPR_COD INTO :IVAINC;
    
    SELECT ARTI_UNIDAD, TAIV_PORC FROM ARTICULO A, TARIFA_IVA T
        WHERE ARTI_COD = NEW.ARTI_COD AND A.taiv_cod = T.taiv_cod INTO :UNIDAD, :TARIVA;
    EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION', 'ARTICULOS', 'SUGERIR PRECIOS CON PORCENTAJE DE MARGEN O UTILIDAD') RETURNING_VALUES (:UOR);
    EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION', 'ARTICULOS', 'REDONDEO AL MULTIPLO DE DIEZ EN PRECIOS') RETURNING_VALUES (:DIG);
    EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION','ARTICULOS','CAMBIO DE PRECIOS AUTOMATICO AL CAMBIAR COSTO O PRECIO') returning_values (CAMBIO);
    if (CAMBIO <> 'PRECIO') then
        BEGIN
        EXECUTE PROCEDURE lee_configuracion('FACTURACION','ARTICULOS','COSTO BASE PARA CALCULO DE PRECIOS DE VENTA AUTOMATICOS') returning_values (:BASE);
        EXECUTE PROCEDURE COSTO_PROMEDIO (NEW.ARTI_COD, 'NOW') RETURNING_VALUES(:COSTOP);
        EXECUTE PROCEDURE ULTIMO_COSTO (NEW.ARTI_COD, 'NOW', :UNIDAD) RETURNING_VALUES(:COSTOU);
        if (base = 'ULTIMO') then
            BEGIN
            COSTO = COSTOU;
            END
        ELSE
            BEGIN
            COSTO = COSTOP;
            if (base = 'MAYOR') then
                if (COSTOP < COSTOU) then
                    COSTO = COSTOU;
            END
        if (IVAINC = 'S') then
            COSTO = COSTO * (1 + TARIVA/100);
        if (UOR = 'UTILIDAD') then
            NEW.PRAR_FIJO = (:COSTO * (1 + NEW.prar_util/100));
        ELSE
            NEW.PRAR_FIJO = (:COSTO / (1 - NEW.prar_margen/100));
        EXECUTE PROCEDURE REDONDEE (NEW.prar_fijo, DIG) returning_values (NEW.prar_fijo);
        END
    ELSE
        BEGIN
        /* PRECIO */
        EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION','ARTICULOS','CODIGO DE LA LISTA DE PRECIOS BASE PARA CAMBIO DE PRECIOS AUTOMATICO') returning_values (LISTA);
        if (NEW.lipr_cod <> :LISTA) then
            BEGIN
            SELECT PRAR_FIJO FROM PRECIOS_ARTICULO WHERE LIPR_COD = :LISTA AND ARTI_COD = NEW.arti_cod INTO :PRECIO;
            SELECT LIPR_MODIF FROM LISTA_PRECIOS L
                WHERE LIPR_COD = :lista INTO :IVAINC1;
            if (ivainc = 'S') then
                if (IVAINC1 = 'S') then
                    NEW.prar_fijo = precio;
                else
                    NEW.prar_fijo = precio * (1 + TARIVA/100);
            ELSE
                if (IVAINC1 = 'S') then
                    NEW.prar_fijo = precio / (1 + TARIVA/100);
                else
                    NEW.prar_fijo = precio;
            if (UOR = 'UTILIDAD') then
                NEW.prar_fijo = NEW.prar_fijo * (1 + NEW.prar_util/100);
            ELSE
                NEW.prar_fijo = NEW.prar_fijo / (1 - NEW.prar_margen/100);
            EXECUTE PROCEDURE REDONDEE (NEW.prar_fijo, DIG) returning_values (NEW.prar_fijo);
            END
        END
    END
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER TRIGGER PRECIOS_ARTICULO_BU
as
declare variable UNIDAD VARCHAR(8);
declare variable UOR VARCHAR(20);
declare variable DIG INTEGER;
declare variable IVAINC CHAR(1);
declare variable TARIVA NUMERIC(9,4);
declare variable CAMBIO CHAR(7);
declare variable BASE VARCHAR(10);
declare variable REP CHAR(2);
declare variable COSTOP NUMERIC(18, 2);
declare variable COSTOU NUMERIC(18, 2);
declare variable COSTO NUMERIC(18, 2);
declare variable LISTA INTEGER;
declare variable PRECIO NUMERIC(18, 4);
declare variable IVAINC1 CHAR(1);
begin
if (NEW.prar_auto = 'S') then
    BEGIN
    EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION','ARTICULOS','CAMBIO DE PRECIOS AUTOMATICO AL CAMBIAR COSTO O PRECIO') returning_values (CAMBIO);
    EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION', 'ARTICULOS', 'SUGERIR PRECIOS CON PORCENTAJE DE MARGEN O UTILIDAD') RETURNING_VALUES (:UOR);
    EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION', 'ARTICULOS', 'REDONDEO AL MULTIPLO DE DIEZ EN PRECIOS') RETURNING_VALUES (:DIG);
    EXECUTE PROCEDURE LEE_CONFIGURACION('INVENTARIO', 'ARTICULOS', 'REPLICAR CAMBIOS EN ARTICULOS') RETURNING_VALUES (:REP);
    SELECT LIPR_MODIF FROM LISTA_PRECIOS L
        WHERE LIPR_COD = NEW.LIPR_COD INTO :IVAINC;
    
    if (CAMBIO <> 'PRECIO') then
      begin
      if (REP <> 'SI') then
        BEGIN
        SELECT ARTI_UNIDAD, TAIV_PORC FROM ARTICULO A, TARIFA_IVA T WHERE A.TAIV_COD = T.TAIV_COD AND ARTI_COD = NEW.arti_cod INTO :UNIDAD, :TARIVA;
        EXECUTE PROCEDURE lee_configuracion('FACTURACION','ARTICULOS','COSTO BASE PARA CALCULO DE PRECIOS DE VENTA AUTOMATICOS') returning_values (:BASE);
        EXECUTE PROCEDURE COSTO_PROMEDIO (NEW.arti_cod, 'NOW') RETURNING_VALUES(:COSTOP);
        EXECUTE PROCEDURE ULTIMO_COSTO (NEW.arti_cod, 'NOW', :UNIDAD) RETURNING_VALUES(:COSTOU);
        if (base = 'ULTIMO') then
            COSTO = COSTOU;
        ELSE
            BEGIN
            COSTO = COSTOP;
            if (base = 'MAYOR') then
                if (COSTOP < COSTOU) then
                    COSTO = COSTOU;
            END
        if (IVAINC = 'S') then
            COSTO = COSTO * (1 + TARIVA/100);
            
        if (UOR = 'UTILIDAD') then
            BEGIN
            COSTO = COSTO * (1 + NEW.prar_util/100);
            EXECUTE PROCEDURE REDONDEE (COSTO, DIG) returning_values (COSTO);
            new.prar_fijo = :COSTO;
            END
        ELSE
            BEGIN
            COSTO = COSTO / (1 - NEW.prar_margen/100);
            EXECUTE PROCEDURE REDONDEE (COSTO, DIG) returning_values (COSTO);
            NEW.PRAR_FIJO = :COSTO;
            END
        END
      end
    else
        begin
        /* PRECIO */
        EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION','ARTICULOS','CODIGO DE LA LISTA DE PRECIOS BASE PARA CAMBIO DE PRECIOS AUTOMATICO') returning_values (LISTA);
        if (NEW.lipr_cod <> :LISTA) then
            BEGIN
            SELECT PRAR_FIJO FROM PRECIOS_ARTICULO WHERE LIPR_COD = :LISTA AND ARTI_COD = NEW.arti_cod INTO :PRECIO;
            SELECT LIPR_MODIF FROM LISTA_PRECIOS L
                WHERE LIPR_COD = :lista INTO :IVAINC1;
            if (ivainc = 'S') then
                if (IVAINC1 = 'S') then
                    NEW.prar_fijo = precio;
                else
                    NEW.prar_fijo = precio * (1 + TARIVA/100);
            ELSE
                if (IVAINC1 = 'S') then
                    NEW.prar_fijo = precio / (1 + TARIVA/100);
                else
                    NEW.prar_fijo = precio;
            if (UOR = 'UTILIDAD') then
                NEW.prar_fijo = NEW.prar_fijo * (1 + NEW.prar_util/100);
            ELSE
                NEW.prar_fijo = NEW.prar_fijo / (1 - NEW.prar_margen/100);
            EXECUTE PROCEDURE REDONDEE (NEW.prar_fijo, DIG) returning_values (NEW.prar_fijo);
            END
        end
    END
end
^

SET TERM ; ^

SET TERM ^ ;

ALTER TRIGGER MOVIMIENTO_ARTICULO_AD
AS
declare variable LOTE CHAR(1);
BEGIN
  /* INSERTE EL NUEVO LOTE */
  SELECT ARTI_EXIST
    FROM   ARTICULO
    WHERE  ARTICULO.ARTI_COD = OLD.ARTI_COD
    INTO :LOTE;
  /* BORRE LOS VIEJOS */
  if (old.mvar_tipodoc <> 13) then
      BEGIN
      EXECUTE PROCEDURE actualice_costo(old.arti_cod, old.mvar_fecha, old.mvar_costo, old.mvar_cant, old.mvar_entrada, 'S', OLD.mvar_cons, OLD.mvar_tipodoc);
      EXECUTE PROCEDURE chequeo_costos(old.arti_cod, old.mvar_fecha);
      END
  /* actualice existencias */
  if (old.mvar_entrada = 'S') then
    BEGIN
    execute procedure sume_existencia(old.arti_cod, old.bode_cod, old.mvar_fecha, old.mvar_cant, 'S');
    if (LOTE = 'L') then
        UPDATE LOTES
            set lote_saldo = lote_saldo - old.mvar_cant
            where (arti_cod = old.ARTI_COD) and (bode_cod = old.bode_cod) and (lote_nro = old.mvar_lote);
    END
  else
    BEGIN
    execute procedure reste_existencia(old.arti_cod, old.bode_cod, old.mvar_fecha, old.mvar_cant, 'S');
    if (LOTE = 'L') then
        UPDATE LOTES
            set lote_saldo = lote_saldo + old.mvar_cant
            where (arti_cod = old.ARTI_COD) and (bode_cod = old.bode_cod) and (lote_nro = old.mvar_lote);
    END
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER TRIGGER MOVIMIENTO_ARTICULO_AI
AS
declare variable EXISTE CHAR(1);
declare variable LOTE CHAR(1);
BEGIN
  /* INSERTE EL NUEVO LOTE */
  SELECT ARTI_EXIST FROM ARTICULO WHERE ARTICULO.ARTI_COD = NEW.ARTI_COD INTO :LOTE;
  /* ACTUALICE COSTOS cuando no es transferencia */
  if (new.mvar_tipodoc <> 13) then
      BEGIN
      EXECUTE PROCEDURE actualice_costo(new.arti_cod, new.mvar_fecha, new.mvar_costo, new.mvar_cant, new.mvar_entrada, 'N', new.mvar_cons, new.mvar_tipodoc);
      EXECUTE PROCEDURE chequeo_costos(NEW.arti_cod, NEW.mvar_fecha);
      END
  /* actualice existencias */
  if (new.mvar_entrada = 'S') then
    BEGIN
    execute procedure sume_existencia(new.arti_cod, new.bode_cod, new.mvar_fecha, new.mvar_cant, 'N');
    if (LOTE = 'L') then
        BEGIN
        if (NEW.MVAR_LOTE IS NULL) then
            EXCEPTION LOTE_OBLIGATORIO 'Debe especificar un número de lote para el articulo ' || new.arti_cod;
        ELSE
         BEGIN
         EXISTE = 'N';
         SELECT 'S' FROM LOTES WHERE ARTI_COD = NEW.ARTI_COD AND BODE_COD = NEW.bode_cod AND LOTE_NRO = new.mvar_lote INTO :EXISTE;
         if (EXISTE = 'S') then
            UPDATE LOTES
             set lote_saldo = lote_saldo + new.mvar_cant
              where (arti_cod = NEW.ARTI_COD) and (BODE_COD = NEW.bode_cod) and (lote_nro = new.mvar_lote);
         ELSE
            INSERT INTO LOTES (ARTI_COD, BODE_COD, LOTE_NRO, LOTE_FECHA, LOTE_CANT, LOTE_COSTO, LOTE_SALDO)
                VALUES (NEW.ARTI_COD, NEW.bode_cod, NEW.mvar_lote, NEW.mvar_fecha, NEW.mvar_cant, NEW.mvar_costo, NEW.mvar_cant);
         END
        END
    END
  else
    BEGIN
    execute procedure reste_existencia(new.arti_cod, new.bode_cod, new.mvar_fecha, new.mvar_cant, 'N');
    /* ACTUALICE LA EXISTENCIA DEL LOTE */
    if (LOTE = 'L') then
    if (NEW.mvar_lote IS NULL) then
        EXCEPTION LOTE_NEGATIVO 'Debe indicar un número de lote para el artículo ' || new.arti_cod;
    ELSE
        BEGIN
        /* Actualice el saldo historico del lote */
        EXISTE = 'N';
        SELECT 'S' FROM EXISTENCIA_LOTE WHERE LOTE_NRO = NEW.MVAR_LOTE AND EXLO_FECHA = NEW.MVAR_FECHA AND ARTI_COD = NEW.arti_cod AND BODE_COD = NEW.bode_cod INTO :EXISTE;
        if (EXISTE = 'S') then
            BEGIN
            UPDATE EXISTENCIA_LOTE
                SET EXLO_SAL = EXLO_SAL + NEW.mvar_cant
                WHERE LOTE_NRO = NEW.MVAR_LOTE AND EXLO_FECHA = NEW.MVAR_FECHA AND ARTI_COD = NEW.ARTI_COD AND BODE_COD = NEW.bode_cod;
            END
        ELSE
            BEGIN
            INSERT INTO EXISTENCIA_LOTE (ARTI_COD, BODE_COD, LOTE_NRO, EXLO_FECHA, EXLO_SAL)
                VALUES (NEW.ARTI_COD, NEW.bode_cod, NEW.MVAR_LOTE, NEW.MVAR_FECHA, NEW.MVAR_CANT);
            END
        UPDATE LOTES
            set lote_saldo = lote_saldo - new.mvar_cant
            where (arti_cod = NEW.ARTI_COD) and (BODE_COD = NEW.bode_cod) and (lote_nro = new.mvar_lote);
        END
    END
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER TRIGGER ENSAMBLES_AI
AS
declare variable COSTO NUMERIC(18,2);
BEGIN
if ((NEW.ENSA_id <> 0) and (new.ensa_anulado = 'N')) then
  begin
  COSTO = new.ensa_costo / NEW.ensa_factor;
  INSERT INTO MOVIMIENTO_ARTICULO
    (ARTI_COD, MVAR_CONS, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM)
    VALUES(NEW.ARTI_COD, GEN_ID(ID_MOVARTI,1), new.bode_cod, new.ensa_fecha, 15, NEW.ensa_id,
    new.ensa_conc, NEW.ensa_factor * new.ensa_cant, :COSTO, 'S', new.ensa_lote, new.pref_pre, new.ensa_numero, 0);

  /* RECORRA LAS LISTAS DE PRECIOS Y CAMBIE EL PRECIO */
  EXECUTE PROCEDURE CALCULA_PRECIOS(NEW.ARTI_COD, new.ensa_fecha);

  /* ingrese el retal */
  if ((new.ensa_codretal is not null) and (new.ensa_codretal <> '')) then
      INSERT INTO MOVIMIENTO_ARTICULO
        (ARTI_COD, MVAR_CONS, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM)
        VALUES(NEW.ensa_codretal, GEN_ID(ID_MOVARTI,1), new.bode_cod, new.ensa_fecha, 15, NEW.ensa_id,
        new.ensa_conc, new.ensa_cantretal, :COSTO, 'S', new.ensa_lote, new.pref_pre, new.ensa_numero, 999);

  INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
    VALUES (USER, 15, NEW.ensa_id, 'I', NEW.pref_pre || NEW.ensa_numero);
  end
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER TRIGGER ENSAMBLES_AU
AS
declare variable COSTO NUMERIC(18,2);
declare variable consec INTEGER;
BEGIN
/* BORRE LA CONTABILIZACION */
if (NEW.ensa_anulado = 'S') then
    BEGIN
    select enco_consec from comprobante_encabezado where enco_tiporef = 15 and enco_idref = old.ensa_id into :consec;
    if (NOT consec is null) then
     delete from comprobante_detalle where enco_consec = :consec;
    delete from comprobante_encabezado where enco_tiporef = 15 and enco_idref = old.ensa_id;
    INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
        VALUES (USER, 15, NEW.ensa_id, 'A', NEW.pref_pre || NEW.ensa_numero);
    END

/* BORRE EL ANTERIOR Y GRABE EL NUEVO */
if ((OLD.ensa_id <> 0) AND (OLD.ensa_anulado = 'N')) then
    begin
    delete from movimiento_articulo where (mvar_tipodoc = 15) and (mvar_idref = old.ensa_id) and (mvar_item = 0);
    delete from movimiento_articulo where (mvar_tipodoc = 15) and (mvar_idref = old.ensa_id) and (mvar_item = 999);
    end
if ((new.ensa_id <> 0) AND (NEW.ensa_anulado = 'N')) then
    begin
    COSTO = new.ensa_costo / NEW.ensa_factor;
    INSERT INTO MOVIMIENTO_ARTICULO
        (ARTI_COD, MVAR_CONS, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM)
        VALUES(NEW.ARTI_COD, GEN_ID(ID_MOVARTI,1), new.bode_cod, new.ensa_fecha, 15, NEW.ensa_id,
        new.ensa_conc, NEW.ensa_factor * new.ensa_cant, :COSTO, 'S', new.ensa_lote, new.pref_pre, new.ensa_numero, 0);

    /* RECORRA LAS LISTAS DE PRECIOS Y CAMBIE EL PRECIO */
    EXECUTE PROCEDURE CALCULA_PRECIOS(NEW.ARTI_COD, new.ensa_fecha);

    /* ingrese el retal */
    if ((new.ensa_codretal is not null) and (new.ensa_codretal <> '')) then
      INSERT INTO MOVIMIENTO_ARTICULO
        (ARTI_COD, MVAR_CONS, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM)
        VALUES(NEW.ensa_codretal, GEN_ID(ID_MOVARTI,1), new.bode_cod, new.ensa_fecha, 15, NEW.ensa_id,
        new.ensa_conc, new.ensa_cantretal, :COSTO, 'S', new.ensa_lote, new.pref_pre, new.ensa_numero, 999);

    INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
        VALUES (USER, 15, NEW.ensa_id, 'U', NEW.pref_pre || NEW.ensa_numero);
    end
/* SI CAMBIO LA FECHA ACTUALICE LOS DETALLES */
if ((OLD.pref_pre <> NEW.pref_pre) or
    (OLD.ensa_numero <> NEW.ensa_numero) or
    (OLD.ensa_fecha <> NEW.ensa_fecha) ) then
    UPDATE ENSAMBLES_DETALLE SET ESDE_TRANSMIT = 'N' WHERE ENSA_ID = OLD.ENSA_ID;

if (OLD.ensa_anulado <> NEW.ensa_anulado) then
    UPDATE ENSAMBLES_DETALLE SET ESDE_ANULADO = NEW.ensa_anulado WHERE ENSA_ID = OLD.ENSA_ID;

if (OLD.ensa_transmit <> NEW.ensa_transmit) then
    UPDATE ENSAMBLES_DETALLE SET ESDE_TRANSMIT = NEW.ensa_transmit WHERE ENSA_ID = OLD.ENSA_ID;
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER TRIGGER ENTRADAS_DETALLE_AI
AS
declare variable fec date;
declare variable CONC VARCHAR(60);
declare variable factor numeric(18,4);
declare variable Pref varchar(4);
declare variable Num varchar(6);
declare variable Nit varchar(20);
declare variable IVAINC CHAR(2);
declare variable COSTO NUMERIC(18,2);
BEGIN
  if ((NEW.entr_id <> 0) and (new.ende_anulado = 'N')) then
    BEGIN
    select entr_fecha, entr_conc, pref_pre, entr_numero, terc_nit, entr_imptos
        from entradas where entr_id = new.entr_id
        into :fec, :conc, :Pref, :Num, :Nit, :ivainc;
    execute procedure factor_unidad_cant(new.arti_cod, new.ende_unidad) returning_values(factor);
    COSTO = ((new.ende_costo - NEW.ende_dtomonto) / :factor);
    if (IVAINC = 'S') then
        COSTO = COSTO / (1 + NEW.ende_ivaporc/100);
    INSERT INTO MOVIMIENTO_ARTICULO
      (ARTI_COD, MVAR_CONS, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM, TERC_NIT)
      VALUES(NEW.ARTI_COD, GEN_ID(ID_MOVARTI,1), NEW.BODE_COD, :FEC, 11, NEW.entr_id,
      :CONC, :factor * new.ende_cant, :costo, 'S', new.ende_lote, :Pref, :Num, new.ende_item, :Nit);
    /* RECORRA LAS LISTAS DE PRECIOS Y CAMBIE EL PRECIO */
    EXECUTE PROCEDURE CALCULA_PRECIOS(NEW.ARTI_COD, :FEC);
    /* ACTUALICE EL STAND */
    if (new.ende_stand is not null) then
        UPDATE or INSERT INTO stands (ARTI_COD, STAND_BODEGA, STAND_COD) VALUES (NEW.arti_cod, NEW.bode_cod, NEW.ende_stand);
    END
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER TRIGGER ENTRADAS_DETALLE_AU
as
declare variable fec date;
declare variable CONC VARCHAR(60);
declare variable Pref varchar(4);
declare variable Num varchar(6);
declare variable Nit varchar(20);
declare variable factor numeric(18,4);
declare variable IVAINC CHAR(2);
declare variable COSTO NUMERIC(18,2);
BEGIN
if ((OLD.entr_id <> 0) AND (OLD.ende_anulado = 'N')) then
    DELETE FROM MOVIMIENTO_ARTICULO WHERE (mvar_tipodoc = 11) and (mvar_idref = new.entr_id) and (mvar_item = old.ende_item);
if ((NEW.entr_id <> 0) AND (NEW.ende_anulado = 'N')) then
    begin
    select entr_fecha, entr_conc, pref_pre, entr_numero, terc_nit, entr_imptos
        from entradas where entr_id = new.entr_id
        into :fec, :conc, :Pref, :Num, :Nit, :ivainc;
    execute procedure factor_unidad_cant(new.arti_cod, new.ende_unidad) returning_values(factor);
    COSTO = ((new.ende_costo - NEW.ende_dtomonto) / :factor);
    if (IVAINC = 'S') then
        COSTO = COSTO / (1 + NEW.ende_ivaporc/100);
    INSERT INTO MOVIMIENTO_ARTICULO
        (ARTI_COD, MVAR_CONS, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM, TERC_NIT)
        VALUES(NEW.ARTI_COD, GEN_ID(ID_MOVARTI,1), NEW.BODE_COD, :FEC, 11, NEW.entr_id,
        :CONC, :factor * new.ende_cant, :COSTO, 'S', new.ende_lote, :Pref, :Num, new.ende_item, :Nit);
    /* RECORRA LAS LISTAS DE PRECIOS Y CAMBIE EL PRECIO */
    EXECUTE PROCEDURE CALCULA_PRECIOS(NEW.ARTI_COD, :FEC);
    /* ACTUALICE EL STAND */
    if (new.ende_stand is not null) then
        UPDATE or INSERT INTO stands (ARTI_COD, STAND_BODEGA, STAND_COD) VALUES (NEW.arti_cod, NEW.bode_cod, NEW.ende_stand);
    END
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER TRIGGER FACTCOMP_DETALLE_AD
AS
declare variable fec date;
declare variable CONSO VARCHAR(2);
declare variable CONSOLIDA INTEGER;
declare variable NUMROWS INTEGER;
declare variable VERIF CHAR(2);
BEGIN
if ((old.fcde_anulado = 'N') and (OLD.faco_id <> 0)) then
    begin
    select faco_fecha, faco_consolida from facturas_compra where faco_id = old.faco_id into :fec, :consolida;
    DELETE FROM MOVIMIENTO_ARTICULO WHERE (mvar_tipodoc = 21) and (mvar_idref = old.faco_id) and (mvar_item = old.fcde_item);
    /* RECORRA LAS LISTAS DE PRECIOS Y CAMBIE EL PRECIO */
    EXECUTE PROCEDURE CALCULA_PRECIOS(old.ARTI_COD, :FEC);
    /* LOS PENDIENTES */
    if (CONSOLIDA <> 0) then
        BEGIN
        UPDATE consolidado_faltantes SET COFA_OK = 'N' WHERE COFA_ID = :consolida AND COFA_ITEM = old.FCDE_ITEM AND ARTI_COD = old.arti_cod;
        SELECT COUNT(CEFA_ITEM) FROM consolide_faltantes WHERE CEFA_ID = :CONSOLIDA INTO :NUMROWS;
        EXECUTE procedure LEE_CONFIGURACION ('COMPRAS','DOCUMENTOS','SUMAR CANTIDADES PENDIENTES AL CONSOLIDAR DOCUMENTOS') returning_values (CONSO);
        /* IGNORE LA CONSOLIDACION SI SE VALIDAN CODIGOS DE LA ORDEN */
        SELECT MIN(CEFA_TIPOORI) FROM consolide_faltantes WHERE CEFA_ID = :CONSOLIDA INTO :NUMROWS;
        if (NUMROWS = 23) then
            BEGIN
            EXECUTE PROCEDURE LEE_CONFIGURACION('COMPRAS', 'FACTURAS', 'VERIFICAR CODIGOS DE LA ORDEN') returning_values (VERIF);
            if (VERIF = 'SI') then
                CONSO = 'NO';
            END
        SELECT COUNT(CEFA_ITEM) FROM consolide_faltantes WHERE CEFA_ID = :CONSOLIDA INTO :NUMROWS;
        if ((CONSO = 'SI') AND (NUMROWS > 1)) then
            UPDATE consolidado_faltantes SET COFA_OK = 'N' WHERE COFA_ID = :consolida;
        END
    enD
END
^

SET TERM ; ^

SET TERM ^ ;

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

        if (COSTO > 0 ) then
         BEGIN
          /* ACTUALICE EL COSTO POR PROVEEDOR */
          SELECT PVAR_FECHA FROM PROVEEDOR_ARTICULO
            WHERE TERC_NIT = :Nit AND ARTI_COD = NEW.ARTI_COD
            INTO :FECAUX;
          if (FECAUX IS NULL) then
            INSERT INTO PROVEEDOR_ARTICULO (TERC_NIT, ARTI_COD, PVAR_COSTO, PVAR_FECHA, PVAR_COD,PVAR_DES)
                VALUES (:Nit, NEW.ARTI_COD, :COSTO, :fec, NEW.fcde_codprov,NEW.fcde_desc);
          else
            UPDATE PROVEEDOR_ARTICULO
                SET PVAR_COSTO = :COSTO, PVAR_FECHA = :fec, PVAR_COD = NEW.fcde_codprov
                WHERE ARTI_COD = NEW.ARTI_COD AND TERC_NIT = :Nit;
         END
        /* RECORRA LAS LISTAS DE PRECIOS Y CAMBIE EL PRECIO */
        EXECUTE PROCEDURE CALCULA_PRECIOS(NEW.ARTI_COD, :FEC);
        END /* AFECTAR INV */
    EXECUTE PROCEDURE lee_configuracion('COMPRAS', 'FACTURAS', 'ACTUALIZAR COSTOS DE LA REMISION RELACIONADA AL GRABAR LA FACTURA') returning_values (:ACTREM);
    if ((ACTREM = 'SI') and (Tipo = 22)) then
        BEGIN
        numrows = 0;
        select mvar_cons, MVAR_ITEM, MVAR_FECHA, MVAR_IDREF, MVAR_CANT, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO
            from movimiento_articulo M, consolidado_faltantes C
            where C.cofa_id = :CONSOLIDA AND mvar_tipodoc = 22 and mvar_idref = C.cofa_idori AND C.cofa_tipoori = 22 and m.arti_cod = new.arti_cod
            into :numrows, :iterem, :fecrem, :idrem, :cantrem, :loterem, :prefrem, :numrem;
        
        if (numrows <> 0) then
            BEGIN
            DELETE FROM MOVIMIENTO_ARTICULO WHERE MVAR_CONS = :numrows;
            INSERT INTO MOVIMIENTO_ARTICULO
                (ARTI_COD, MVAR_CONS, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM, TERC_NIT)
                VALUES(NEW.ARTI_COD, GEN_ID(ID_MOVARTI,1), NEW.BODE_COD, :fecrem, 22, :idrem,
                :CONC, :cantrem, :costo, 'S', :loterem, :prefrem, :numrem, :iterem, :Nit);
        
            if (COSTO > 0 ) then
                BEGIN
                /* ACTUALICE EL COSTO POR PROVEEDOR */
                SELECT PVAR_FECHA FROM PROVEEDOR_ARTICULO
                    WHERE TERC_NIT = :Nit AND ARTI_COD = NEW.ARTI_COD
                    INTO :FECAUX;
                if (FECAUX IS NULL) then
                    INSERT INTO PROVEEDOR_ARTICULO (TERC_NIT, ARTI_COD, PVAR_COSTO, PVAR_FECHA, PVAR_COD,PVAR_DES)
                        VALUES (:Nit, NEW.ARTI_COD, :COSTO, :fec, NEW.fcde_codprov,NEW.fcde_desc);
                else
                    UPDATE PROVEEDOR_ARTICULO
                        SET PVAR_COSTO = :COSTO, PVAR_FECHA = :fec, PVAR_COD = NEW.fcde_codprov
                        WHERE ARTI_COD = NEW.ARTI_COD AND TERC_NIT = :Nit;
                END
            /* RECORRA LAS LISTAS DE PRECIOS Y CAMBIE EL PRECIO */
            EXECUTE PROCEDURE CALCULA_PRECIOS(NEW.ARTI_COD, :FEC);
            END
        END

    /* ACTUALICE EL PENDIENTE  */
    if (CONSOLIDA <> 0) then
        BEGIN
        UPDATE consolidado_faltantes SET COFA_OK = 'S' WHERE COFA_ID = :consolida AND COFA_ITEM = NEW.FCDE_ITEM AND ARTI_COD = NEW.arti_cod;
        EXECUTE procedure LEE_CONFIGURACION ('COMPRAS','DOCUMENTOS','SUMAR CANTIDADES PENDIENTES AL CONSOLIDAR DOCUMENTOS') returning_values (CONSO);
        /* IGNORE LA CONSOLIDACION SI SE VALIDAN CODIGOS DE LA ORDEN */
        SELECT MIN(CEFA_TIPOORI) FROM consolide_faltantes WHERE CEFA_ID = :CONSOLIDA INTO :NUMROWS;
        if (NUMROWS = 23) then
            BEGIN
            EXECUTE PROCEDURE LEE_CONFIGURACION('COMPRAS', 'FACTURAS', 'VERIFICAR CODIGOS DE LA ORDEN') returning_values (MENORV);
            if (MENORV = 'SI') then
                CONSO = 'NO';
            END
        SELECT COUNT(CEFA_ITEM) FROM consolide_faltantes WHERE CEFA_ID = :CONSOLIDA INTO :NUMROWS;
        if ((CONSO = 'SI') AND (NUMROWS > 1)) then
            UPDATE consolidado_faltantes SET COFA_IDDES = NEW.faco_id, COFA_OK = 'S' WHERE COFA_ID = :consolida;
        else
            BEGIN
            /* BUSQUE EL CONSOLIDADO EN EL MISMO ITEM Y SI ES DIFERENTE ACTUALICELO */
            select COFA_CANT * COFA_FACTOR FROM consolidado_faltantes WHERE COFA_ID = :consolida AND COFA_ITEM = NEW.FCDE_ITEM AND ARTI_COD = NEW.arti_cod INTO :CANTREL;
            if (NEW.FCDE_CANT * NEW.FCDE_FACTOR < CANTREL) then
                UPDATE consolidado_faltantes SET COFA_IDDES = NEW.faco_id, COFA_CANT = NEW.FCDE_CANT, COFA_FACTOR = NEW.FCDE_FACTOR
                    WHERE COFA_ID = :consolida AND COFA_ITEM = NEW.FCDE_ITEM AND ARTI_COD = NEW.arti_cod;
            END
        END
    /* ACTUALICE EL STAND */
    if (new.fcde_stand is not null) then
        UPDATE or INSERT INTO stands (ARTI_COD, STAND_BODEGA, STAND_COD) VALUES (NEW.arti_cod, NEW.bode_cod, NEW.fcde_stand);
    END
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER TRIGGER FACTCOMP_DETALLE_AU
as
declare variable fec date;
declare variable fecaux date;
declare variable AUX varchar(90);
declare variable CONC VARCHAR(60);
declare variable Pref varchar(4);
declare variable Num varchar(6);
declare variable Nit varchar(20);
declare variable factor numeric(18,4);
declare variable TIPO INTEGER;
declare variable INVFAC CHAR(2);
declare variable IVAINC CHAR(2);
declare variable COSTO NUMERIC(18,2);
declare variable CANTREL NUMERIC(18,4);
declare variable NUMPROV VARCHAR(10);
declare variable NUMPED VARCHAR(30);
declare variable NUMREM VARCHAR(30);
declare variable CONSO VARCHAR(2);
declare variable CONSOLIDA INTEGER;
declare variable NUMROWS INTEGER;
declare variable DTOPIE NUMERIC(18,2);
declare variable ADICIONAL NUMERIC(18,2);
declare variable TOTAL NUMERIC(18,2);
declare variable IVAMONTO NUMERIC(18,2);
declare variable EXTRA NUMERIC(18,2);
declare variable FACT NUMERIC(18,4);
declare variable MENORV CHAR(2);
declare variable ACTREM CHAR(2);
declare variable FECREM date;
declare variable IDREM INTEGER;
declare variable ITEREM INTEGER;
declare variable CANTREM NUMERIC(18,4);
declare variable LOTEREM VARCHAR(15);
declare variable PREFREM CHAR(4);
BEGIN
if (old.fcde_devuelto = new.fcde_devuelto) then
    begin
    /* deshaga lo viejo */
    if ((old.fcde_anulado = 'N') and (OLD.faco_id <> 0)) then
        begin
        select faco_fecha, faco_consolida from facturas_compra where faco_id = old.faco_id into :fec, :consolida;
        DELETE FROM MOVIMIENTO_ARTICULO WHERE (mvar_tipodoc = 21) and (mvar_idref = old.faco_id) and (mvar_item = old.fcde_item);
        /* RECORRA LAS LISTAS DE PRECIOS Y CAMBIE EL PRECIO */
        EXECUTE PROCEDURE CALCULA_PRECIOS(old.ARTI_COD, :FEC);
        /* LOS PENDIENTES */
        if (CONSOLIDA <> 0) then
            BEGIN
            UPDATE consolidado_faltantes SET COFA_OK = 'N' WHERE COFA_ID = :consolida AND COFA_ITEM = old.FCDE_ITEM AND ARTI_COD = old.arti_cod;
            SELECT COUNT(CEFA_ITEM) FROM consolide_faltantes WHERE CEFA_ID = :CONSOLIDA INTO :NUMROWS;
            EXECUTE procedure LEE_CONFIGURACION ('COMPRAS','DOCUMENTOS','SUMAR CANTIDADES PENDIENTES AL CONSOLIDAR DOCUMENTOS') returning_values (CONSO);
            /* IGNORE LA CONSOLIDACION SI SE VALIDAN CODIGOS DE LA ORDEN */
            SELECT MIN(CEFA_TIPOORI) FROM consolide_faltantes WHERE CEFA_ID = :CONSOLIDA INTO :NUMROWS;
            if (NUMROWS = 23) then
                BEGIN
                EXECUTE PROCEDURE LEE_CONFIGURACION('COMPRAS', 'FACTURAS', 'VERIFICAR CODIGOS DE LA ORDEN') returning_values (MENORV);
                if (MENORV = 'SI') then
                    CONSO = 'NO';
                END
            if (CONSO = 'SI') then
                UPDATE consolidado_faltantes SET COFA_OK = 'N' WHERE COFA_ID = :consolida;
            END
        end
    /* Registre el nuevo */
    if ((new.fcde_anulado = 'N') and (new.faco_id <> 0)) then
        BEGIN
        select faco_fecha, pref_pre, faco_numero, terc_nit, faco_imptos, faco_numprov, faco_remision, faco_orden, faco_consolida, faco_dtomonto, faco_adicional, faco_total, faco_ivamonto, faco_extra
            from facturas_compra where faco_id = new.faco_id
            into :fec, :Pref, :Num, :Nit, :ivainc, :numprov, :numrem, :numped, :consolida, :dtopie, :adicional, :total, :ivamonto, :extra;
        conc = 'FACTURA DE COMPRA No.' || PREF || NUM || '-' || NUMPROV;
        if (NUMREM <> '') then
            BEGIN
            AUX = SUBSTR(NUMREM, 1, 15);
            conc = conc || '-REM:' || AUX;
            END
        else
            if (NUMPED <> '') then
                BEGIN
                AUX = SUBSTR(NUMPED, 1, 15);
                conc = conc || '-ORDEN ' || AUX;
                END
        SELECT MAX(CEFA_TIPOORI) FROM consolide_faltantes WHERE CEFA_ID = :CONSOLIDA INTO :TIPO;
        if (Tipo is null) then
            Tipo = 0;
        execute procedure lee_configuracion('COMPRAS', 'FACTURAS', 'AFECTAR INVENTARIO CON LA FACTURA') returning_values (:INVFAC);
        /* si se hizo con base en una remision no afecte inventario */
        if ((Tipo <> 22) and (INVFAC = 'SI')) then
            begin
            execute procedure factor_unidad_cant(new.arti_cod, new.fcde_unidad) returning_values(factor);
            COSTO = ((new.fcde_prunit - NEW.fcde_dtomonto) / :factor);
            if (IVAINC = 'S') then
                COSTO = COSTO / (1 + NEW.fcde_ivaporc/100);
            EXECUTE PROCEDURE lee_configuracion('COMPRAS','FACTURAS','DESCUENTO Y VALOR ADICIONAL DEL DOCUMENTO COMO MENOR VALOR DEL COSTO') returning_values (:MENORV);
            if (MENORV = 'SI') then
                BEGIN
                FACT = (TOTAL - EXTRA - IVAMONTO);
                if ((FACT - ADICIONAL + DTOPIE) <> 0) then
                    FACT = FACT / (FACT - ADICIONAL + DTOPIE);
                ELSE
                    FACT = 1;
                COSTO = COSTO * FACT;
                END
            INSERT INTO MOVIMIENTO_ARTICULO
                (ARTI_COD, MVAR_CONS, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM, TERC_NIT)
                VALUES(NEW.ARTI_COD, GEN_ID(ID_MOVARTI,1), NEW.BODE_COD, :FEC, 21, NEW.faco_id,
                :CONC, :factor * new.fcde_cant, :COSTO, 'S', new.fcde_lote, :Pref, :Num, NEW.fcde_item, :Nit);
            if (COSTO > 0 ) then
             BEGIN
              /* ACTUALICE EL COSTO POR PROVEEDOR */
              SELECT PVAR_FECHA FROM PROVEEDOR_ARTICULO
                WHERE TERC_NIT = :Nit AND ARTI_COD = NEW.ARTI_COD INTO :FECAUX;
              if (FECAUX IS NULL) then
                INSERT INTO PROVEEDOR_ARTICULO (TERC_NIT, ARTI_COD, PVAR_COSTO, PVAR_FECHA, PVAR_COD,PVAR_DES)
                    VALUES (:Nit, NEW.ARTI_COD, :COSTO, :fec, NEW.fcde_codprov,NEW.fcde_desc);
              else
                UPDATE PROVEEDOR_ARTICULO
                    SET PVAR_COSTO = :COSTO, PVAR_FECHA = :fec, PVAR_COD = NEW.fcde_codprov
                    WHERE ARTI_COD = NEW.ARTI_COD AND TERC_NIT = :Nit;
             END
            /* RECORRA LAS LISTAS DE PRECIOS Y CAMBIE EL PRECIO */
            EXECUTE PROCEDURE CALCULA_PRECIOS(NEW.ARTI_COD, :FEC);
            end
        EXECUTE PROCEDURE lee_configuracion('COMPRAS', 'FACTURAS', 'ACTUALIZAR COSTOS DE LA REMISION RELACIONADA AL GRABAR LA FACTURA') returning_values (:ACTREM);
        if ((ACTREM = 'SI') and (Tipo = 22)) then
            BEGIN
            numrows = 0;
            select mvar_cons, MVAR_ITEM, MVAR_FECHA, MVAR_IDREF, MVAR_CANT, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO
                from movimiento_articulo M, consolidado_faltantes C
                where C.cofa_id = :CONSOLIDA AND mvar_tipodoc = 22 and mvar_idref = C.cofa_idori AND C.cofa_tipoori = 22 and m.arti_cod = new.arti_cod
                into :numrows, :iterem, :fecrem, :idrem, :cantrem, :loterem, :prefrem, :numrem;
            
            if (numrows <> 0) then
                BEGIN
                DELETE FROM MOVIMIENTO_ARTICULO WHERE MVAR_CONS = :numrows;
                INSERT INTO MOVIMIENTO_ARTICULO
                    (ARTI_COD, MVAR_CONS, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM, TERC_NIT)
                    VALUES(NEW.ARTI_COD, GEN_ID(ID_MOVARTI,1), NEW.BODE_COD, :fecrem, 22, :idrem,
                    :CONC, :cantrem, :costo, 'S', :loterem, :prefrem, :numrem, :iterem, :Nit);
        
                if (COSTO > 0 ) then
                    BEGIN
                    /* ACTUALICE EL COSTO POR PROVEEDOR */
                    SELECT PVAR_FECHA FROM PROVEEDOR_ARTICULO
                        WHERE TERC_NIT = :Nit AND ARTI_COD = NEW.ARTI_COD
                        INTO :FECAUX;
                    if (FECAUX IS NULL) then
                        INSERT INTO PROVEEDOR_ARTICULO (TERC_NIT, ARTI_COD, PVAR_COSTO, PVAR_FECHA, PVAR_COD,PVAR_DES)
                            VALUES (:Nit, NEW.ARTI_COD, :COSTO, :fec, NEW.fcde_codprov,NEW.fcde_desc);
                    else
                        UPDATE PROVEEDOR_ARTICULO
                            SET PVAR_COSTO = :COSTO, PVAR_FECHA = :fec, PVAR_COD = NEW.fcde_codprov
                            WHERE ARTI_COD = NEW.ARTI_COD AND TERC_NIT = :Nit;
                    END
                /* RECORRA LAS LISTAS DE PRECIOS Y CAMBIE EL PRECIO */
                EXECUTE PROCEDURE CALCULA_PRECIOS(NEW.ARTI_COD, :FEC);
                END
            END

        if (CONSOLIDA <> 0) then
            begin
            UPDATE consolidado_faltantes SET COFA_OK = 'S' WHERE COFA_ID = :consolida AND COFA_ITEM = NEW.FCDE_ITEM AND ARTI_COD = NEW.arti_cod;
            EXECUTE procedure LEE_CONFIGURACION ('COMPRAS','DOCUMENTOS','SUMAR CANTIDADES PENDIENTES AL CONSOLIDAR DOCUMENTOS') returning_values (CONSO);
            /* IGNORE LA CONSOLIDACION SI SE VALIDAN CODIGOS DE LA ORDEN */
            SELECT MIN(CEFA_TIPOORI) FROM consolide_faltantes WHERE CEFA_ID = :CONSOLIDA INTO :NUMROWS;
            if (NUMROWS = 23) then
                BEGIN
                EXECUTE PROCEDURE LEE_CONFIGURACION('COMPRAS', 'FACTURAS', 'VERIFICAR CODIGOS DE LA ORDEN') returning_values (MENORV);
                if (MENORV = 'SI') then
                    CONSO = 'NO';
                END
            SELECT COUNT(CEFA_ITEM) FROM consolide_faltantes WHERE CEFA_ID = :CONSOLIDA INTO :NUMROWS;
            if ((CONSO = 'SI') AND (NUMROWS > 1)) then
                UPDATE consolidado_faltantes SET COFA_IDDES = NEW.faco_id, COFA_OK = 'S' WHERE COFA_ID = :consolida;
            else
                BEGIN
                /* BUSQUE EL CONSOLIDADO EN EL MISMO ITEM Y SI ES DIFERENTE ACTUALICELO */
                select COFA_CANT * COFA_FACTOR FROM consolidado_faltantes WHERE COFA_ID = :consolida AND COFA_ITEM = NEW.FCDE_ITEM AND ARTI_COD = NEW.arti_cod INTO :CANTREL;
                if (NEW.FCDE_CANT * NEW.FCDE_FACTOR < CANTREL) then
                    UPDATE consolidado_faltantes SET COFA_IDDES = NEW.faco_id, COFA_CANT = NEW.FCDE_CANT, COFA_FACTOR = NEW.FCDE_FACTOR
                        WHERE COFA_ID = :consolida AND COFA_ITEM = NEW.FCDE_ITEM AND ARTI_COD = NEW.arti_cod;
                END
            end
        /* ACTUALICE EL STAND */
        if (new.fcde_stand is not null) then
            UPDATE or INSERT INTO stands (ARTI_COD, STAND_BODEGA, STAND_COD) VALUES (NEW.arti_cod, NEW.bode_cod, NEW.fcde_stand);
        END
    end
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER TRIGGER REMISION_PROVEEDOR_DET_AI
AS
declare variable fec date;
declare variable CONC VARCHAR(60);
declare variable factor numeric(18,4);
declare variable Pref varchar(4);
declare variable Num varchar(6);
declare variable EXISTE CHAR(1);
declare variable NIT VARCHAR(20);
declare variable NUMPROV VARCHAR(20);
declare variable Tipo Integer;
declare variable idfact integer;
declare variable numrows integer;
declare variable IVAINC CHAR(2);
declare variable COSTO NUMERIC(18,2);
declare variable CANTREL NUMERIC(18,4);
declare variable NUMPED VARCHAR(30);
declare variable CONSO CHAR(2);
declare variable CONSOLIDA INTEGER;
declare variable DTOPIE NUMERIC(18,2);
declare variable ADICIONAL NUMERIC(18,2);
declare variable TOTAL NUMERIC(18,2);
declare variable IVAMONTO NUMERIC(18,2);
declare variable EXTRA NUMERIC(18,2);
declare variable FACT NUMERIC(18,4);
declare variable MENORV CHAR(2);
BEGIN
  if ((NEW.repr_id <> 0) and (new.rpvd_anulado = 'N')) then
    BEGIN
    select max(rprd_tiporel), max(rprd_idrel) from remision_proveedor_docrela
        where repr_id = new.repr_id into :Tipo, :idfact;
    if (Tipo is null) then
        Tipo = 0;
    /* si se hizo con base en una factura que afecto el inventario no afecte inventario */
    numrows = 0;
    if (Tipo = 21) Then
        select count(*) from movimiento_articulo where mvar_tipodoc = 21 and mvar_idref = :idfact into :numrows;
    if (numrows is null) then
        numrows = 0;
    if (numrows = 0) then
        begin
        select repr_fecha, pref_pre, repr_numero, REPR_IMPTOS, terc_nit, REPR_NUMPROV, REPR_ORDEN, REPR_CONSOLIDA, repr_dtomonto, repr_adicional, repr_total, repr_ivamonto, repr_extra
            from remision_proveedor where repr_id = new.repr_id
            into :fec, :Pref, :Num, :IVAINC, :NIT, :NUMPROV, :numped, :CONSOLIDA, :dtopie, :adicional, :total, :ivamonto, :extra;
        execute procedure factor_unidad_cant(new.arti_cod, new.rpvd_unidad) returning_values(factor);
        CONC = 'REMISION PROVEEDOR No.' || PREF || NUM || '-' || NUMPROV;
        if (numped <> '') then
            conc = conc || '-ORDEN ' || NUMPED;
        COSTO = ((new.rpvd_prunit - NEW.rpvd_dtomonto) / :factor);
        if (IVAINC = 'S') then
            COSTO = COSTO / (1 + NEW.rpvd_ivaporc/100);
        EXECUTE PROCEDURE lee_configuracion('COMPRAS','FACTURAS','DESCUENTO Y VALOR ADICIONAL DEL DOCUMENTO COMO MENOR VALOR DEL COSTO') returning_values (:MENORV);
        if (MENORV = 'SI') then
            BEGIN
            FACT = (TOTAL - EXTRA - IVAMONTO);
            if ((FACT - ADICIONAL + DTOPIE) <> 0) then
                FACT = FACT / (FACT - ADICIONAL + DTOPIE);
            ELSE
                FACT = 1;
            COSTO = COSTO * FACT;
            END
        INSERT INTO MOVIMIENTO_ARTICULO
          (ARTI_COD, MVAR_CONS, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM, TERC_NIT)
          VALUES(NEW.ARTI_COD, GEN_ID(ID_MOVARTI,1), NEW.BODE_COD, :FEC, 22, NEW.repr_id,
          :CONC, :factor * new.rpvd_cant, :COSTO, 'S', new.rpvd_lote, :Pref, :Num, new.rpvd_item, :Nit);

        /* RECORRA LAS LISTAS DE PRECIOS Y CAMBIE EL PRECIO */
        EXECUTE PROCEDURE CALCULA_PRECIOS(NEW.ARTI_COD, :FEC);

        if (COSTO > 0 ) then
         BEGIN
          /* GRABE PROV X ARTICULO */
          EXISTE = 'N';
          SELECT 'S' FROM PROVEEDOR_ARTICULO WHERE TERC_NIT = :NIT AND ARTI_COD = NEW.ARTI_COD INTO :EXISTE;
          if (EXISTE = 'S') then
            UPDATE PROVEEDOR_ARTICULO 
                SET PVAR_FECHA = :FEC, PVAR_COSTO = :COSTO, PVAR_COD = NEW.rpvd_codprov
                WHERE TERC_NIT = :NIT AND ARTI_COD = NEW.ARTI_COD;
          ELSE
            INSERT INTO PROVEEDOR_ARTICULO (TERC_NIT, ARTI_COD, PVAR_COSTO, PVAR_FECHA, PVAR_COD,PVAR_DES)
                VALUES (:NIT, NEW.ARTI_COD, :COSTO, :FEC, NEW.rpvd_codprov,NEW.rpvd_desc);
         END
        end

    /* ACTUALICE EL PENDIENTE  */
    if (CONSOLIDA <> 0) then
        BEGIN
        EXECUTE PROCEDURE LEE_CONFIGURACION ('COMPRAS','DOCUMENTOS','SUMAR CANTIDADES PENDIENTES AL CONSOLIDAR DOCUMENTOS') returning_values (CONSO);
        SELECT MIN(CEFA_TIPOORI) FROM consolide_faltantes WHERE CEFA_ID = :CONSOLIDA INTO :NUMROWS;
        if (NUMROWS = 23) then
            BEGIN
            EXECUTE PROCEDURE LEE_CONFIGURACION('COMPRAS', 'REMISIONES', 'VERIFICAR CODIGOS DE LA ORDEN') returning_values (MENORV);
            if (MENORV = 'SI') then
                CONSO = 'NO';
            END
        SELECT COUNT(CEFA_ITEM) FROM consolide_faltantes WHERE CEFA_ID = :CONSOLIDA INTO :NUMROWS;
        if ((CONSO = 'SI') AND (NUMROWS > 1)) then
            UPDATE consolidado_faltantes SET COFA_OK = 'S' WHERE COFA_ID = :consolida;
        ELSE
            BEGIN
            /* BUSQUE EL CONSOLIDADO EN EL MISMO ITEM Y SI ES DIFERENTE ACTUALICELO */
            select COFA_CANT * COFA_FACTOR FROM consolidado_faltantes WHERE COFA_ID = :consolida AND COFA_ITEM = NEW.RPVD_ITEM AND ARTI_COD = NEW.arti_cod INTO :CANTREL;
            if (NEW.RPVD_CANT * NEW.RPVD_FACTOR < CANTREL) then
                UPDATE consolidado_faltantes SET COFA_IDDES = NEW.repr_id, COFA_CANT = NEW.RPVD_CANT, COFA_FACTOR = NEW.RPVD_FACTOR
                    WHERE COFA_ID = :consolida AND COFA_ITEM = NEW.RPVD_ITEM AND ARTI_COD = NEW.arti_cod;
            ELSE
                UPDATE consolidado_faltantes SET COFA_IDDES = NEW.repr_id, COFA_OK = 'S' WHERE COFA_ID = :consolida AND COFA_ITEM = NEW.RPVD_ITEM AND ARTI_COD = NEW.arti_cod;
            END
        END
    /* ACTUALICE EL STAND */
    if (new.rpvd_stand is not null) then
        UPDATE or INSERT INTO stands (ARTI_COD, STAND_BODEGA, STAND_COD) VALUES (NEW.arti_cod, NEW.bode_cod, NEW.rpvd_stand);
    END
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER TRIGGER REMISION_PROVEEDOR_DET_AU
AS
declare variable fec date;
declare variable CONC VARCHAR(60);
declare variable Pref varchar(4);
declare variable Num varchar(6);
declare variable factor numeric(18,4);
declare variable EXISTE CHAR(1);
declare variable NIT VARCHAR(20);
declare variable NUMPROV VARCHAR(20);
declare variable Tipo integer;
declare variable idfact integer;
declare variable numrows integer;
declare variable IVAINC CHAR(2);
declare variable COSTO NUMERIC(18,2);
declare variable CANTREL NUMERIC(18,4);
declare variable NUMPED VARCHAR(30);
declare variable CONSO CHAR(2);
declare variable CONSOLIDA INTEGER;
declare variable DTOPIE NUMERIC(18,2);
declare variable ADICIONAL NUMERIC(18,2);
declare variable TOTAL NUMERIC(18,2);
declare variable IVAMONTO NUMERIC(18,2);
declare variable EXTRA NUMERIC(18,2);
declare variable FACT NUMERIC(18,4);
declare variable MENORV CHAR(2);
BEGIN
if ((OLD.repr_id <> 0) AND (OLD.rpvd_anulado = 'N')) then
    begin
    DELETE FROM MOVIMIENTO_ARTICULO WHERE (mvar_tipodoc = 22) and (mvar_idref = new.repr_id) and (mvar_item = old.rpvd_item);
    select REPR_CONSOLIDA from remision_proveedor where repr_id = old.repr_id into :CONSOLIDA;
    if (CONSOLIDA <> 0) then
        begin
        EXECUTE PROCEDURE LEE_CONFIGURACION ('COMPRAS','DOCUMENTOS','SUMAR CANTIDADES PENDIENTES AL CONSOLIDAR DOCUMENTOS') returning_values (CONSO);
        SELECT COUNT(CEFA_ITEM) FROM consolide_faltantes WHERE CEFA_ID = :CONSOLIDA INTO :NUMROWS;
        if ((NUMROWS = 1) OR (CONSO = 'NO')) then
            UPDATE consolidado_faltantes SET COFA_OK = 'N' WHERE COFA_ID = :consolida AND COFA_ITEM = old.RPVD_ITEM AND ARTI_COD = old.arti_cod;
        else
            UPDATE consolidado_faltantes SET COFA_OK = 'N' WHERE COFA_ID = :consolida;
        END
    end
/* Registre el nuevo */
if ((new.repr_id <> 0) AND (new.rpvd_anulado = 'N')) then
    begin
    select repr_fecha, pref_pre, repr_numero, repr_imptos, terc_nit, REPR_NUMPROV, REPR_ORDEN, REPR_CONSOLIDA, repr_dtomonto, repr_adicional, repr_total, repr_ivamonto, repr_extra
        from remision_proveedor where repr_id = new.repr_id
        into :fec, :Pref, :Num, :IVAINC, :NIT, :NUMPROV, :numped, :CONSOLIDA, :dtopie, :adicional, :total, :ivamonto, :extra;
    CONC = 'REMISION PROVEEDOR No.' || PREF || NUM || '-' || NUMPROV;
    if (numped <> '') then
        conc = conc || '-ORDEN ' || NUMPED;
    SELECT MAX(CEFA_TIPOORI) FROM consolide_faltantes WHERE CEFA_ID = :CONSOLIDA INTO :TIPO;
    if (Tipo is null) then
        Tipo = 0;
    select FACO_ID from FACTURAS_COMPRA WHERE FACO_CONSOLIDA = :consolida INTO :IDFACT;
    if (Idfact is null) then
        Idfact = 0;
    /* si se hizo con base en una factura que afecto el inventario no afecte inventario */
    numrows = 0;
    if (Tipo = 21) Then
        select count(*) from movimiento_articulo where mvar_tipodoc = 21 and mvar_idref = :idfact into :numrows;
    if (numrows is null) then
        numrows = 0;
    if (numrows = 0) then
        begin
        execute procedure factor_unidad_cant(new.arti_cod, new.rpvd_unidad) returning_values(factor);
        COSTO = ((new.rpvd_prunit - NEW.rpvd_dtomonto) / :factor);
        if (IVAINC = 'S') then
            COSTO = COSTO / (1 + NEW.rpvd_ivaporc/100);
        EXECUTE PROCEDURE lee_configuracion('COMPRAS','FACTURAS','DESCUENTO Y VALOR ADICIONAL DEL DOCUMENTO COMO MENOR VALOR DEL COSTO') returning_values (:MENORV);
        if (MENORV = 'SI') then
            BEGIN
            FACT = (TOTAL - EXTRA - IVAMONTO);
            if ((FACT - ADICIONAL + DTOPIE) <> 0) then
                FACT = FACT / (FACT - ADICIONAL + DTOPIE);
            ELSE
                FACT = 1;
            COSTO = COSTO * FACT;
            END
        INSERT INTO MOVIMIENTO_ARTICULO
            (ARTI_COD, MVAR_CONS, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM, TERC_NIT)
            VALUES(NEW.ARTI_COD, GEN_ID(ID_MOVARTI,1), NEW.BODE_COD, :FEC, 22, NEW.repr_id,
            :CONC, :factor * new.rpvd_cant, :COSTO, 'S', new.rpvd_lote, :Pref, :Num, new.rpvd_item, :Nit);
            
        /* RECORRA LAS LISTAS DE PRECIOS Y CAMBIE EL PRECIO */
        EXECUTE PROCEDURE CALCULA_PRECIOS(NEW.ARTI_COD, :FEC);
          
        if (COSTO > 0 ) then
         BEGIN
          /* GRABE PROV X ARTICULO */
          EXISTE = 'N';
          SELECT 'S' FROM PROVEEDOR_ARTICULO WHERE TERC_NIT = :NIT AND ARTI_COD = NEW.ARTI_COD INTO :EXISTE;
          if (EXISTE = 'S') then
            UPDATE PROVEEDOR_ARTICULO
                SET PVAR_FECHA = :FEC, PVAR_COSTO = :COSTO, PVAR_COD = NEW.rpvd_codprov
                WHERE TERC_NIT = :NIT AND ARTI_COD = NEW.ARTI_COD;
          ELSE
            INSERT INTO PROVEEDOR_ARTICULO (TERC_NIT, ARTI_COD, PVAR_COSTO, PVAR_FECHA, PVAR_COD,PVAR_DES)
                VALUES (:NIT, NEW.ARTI_COD, :COSTO, :FEC, NEW.rpvd_codprov,NEW.rpvd_desc);
         END
        end
    if (CONSOLIDA <> 0) then
        BEGIN
        EXECUTE PROCEDURE LEE_CONFIGURACION ('COMPRAS','DOCUMENTOS','SUMAR CANTIDADES PENDIENTES AL CONSOLIDAR DOCUMENTOS') returning_values (CONSO);
        /* IGNORE LA CONSOLIDACION SI SE VALIDAN CODIGOS DE LA ORDEN */
        SELECT MIN(CEFA_TIPOORI) FROM consolide_faltantes WHERE CEFA_ID = :CONSOLIDA INTO :NUMROWS;
        if (NUMROWS = 23) then
            BEGIN
            EXECUTE PROCEDURE LEE_CONFIGURACION('COMPRAS', 'REMISIONES', 'VERIFICAR CODIGOS DE LA ORDEN') returning_values (MENORV);
            if (MENORV = 'SI') then
                CONSO = 'NO';
            END
        SELECT COUNT(CEFA_ITEM) FROM consolide_faltantes WHERE CEFA_ID = :CONSOLIDA INTO :NUMROWS;
        if ((CONSO = 'SI') AND (NUMROWS > 1)) then
            UPDATE consolidado_faltantes SET COFA_IDDES = NEW.repr_id, COFA_OK = 'S' WHERE COFA_ID = :consolida;
        ELSE
            BEGIN
            /* BUSQUE EL CONSOLIDADO EN EL MISMO ITEM Y SI ES DIFERENTE ACTUALICELO */
            select COFA_CANT * COFA_FACTOR FROM consolidado_faltantes WHERE COFA_ID = :consolida AND COFA_ITEM = NEW.RPVD_ITEM AND ARTI_COD = NEW.arti_cod INTO :CANTREL;
            if (NEW.RPVD_CANT * NEW.RPVD_FACTOR < CANTREL) then
                UPDATE consolidado_faltantes SET COFA_IDDES = NEW.repr_id, COFA_CANT = NEW.RPVD_CANT, COFA_FACTOR = NEW.RPVD_FACTOR
                    WHERE COFA_ID = :consolida AND COFA_ITEM = NEW.RPVD_ITEM AND ARTI_COD = NEW.arti_cod;
            else
                UPDATE consolidado_faltantes SET COFA_IDDES = NEW.repr_id, COFA_OK = 'S' WHERE COFA_ID = :consolida AND COFA_ITEM = NEW.RPVD_ITEM AND ARTI_COD = NEW.arti_cod;
            END
        END
    /* ACTUALICE EL STAND */
    if (new.rpvd_stand is not null) then
        UPDATE or INSERT INTO stands (ARTI_COD, STAND_BODEGA, STAND_COD) VALUES (NEW.arti_cod, NEW.bode_cod, NEW.rpvd_stand);
    END
END
^

SET TERM ; ^

/* 20090103 INCLUIA LOS MOVIMIENTOS DE TODAS LAS SUCURSALES EN CADA UNA, ADEMAS CON AUTORETENCION NO DESCONTABA LOS ABONOS POSTERIORES A LA RESOLUCION DE DOCUMENTOS ANTERIORES */

SET TERM ^ ;

CREATE OR ALTER procedure CARTERA_CLIENTE(
    NIT varchar(20),
    FECHA date,
    SUCURSAL varchar(10),
    MONEDA integer,
    SOLOPESOS char(1))
returns (
    TIPO integer,
    ID integer,

    PREFIJO varchar(4),
    NUMERO varchar(6),
    CONCEPTO varchar(60),
    SALDO numeric(18,2),
    RTFTE numeric(18,2),
    RTIVA numeric(18,2),
    RTICA numeric(18,2),
    DTOF numeric(18,2),
    TIPONOM varchar(8),
    VENCE date,
    FECDOC date,
    DIAS integer,
    RECPROV_ID integer,
    RECIPROV char(1),
    NOTA varchar(256),
    TRMDOC numeric(18,2))
as
declare variable FEC date;
declare variable DESC_RTES char(2);
declare variable DTOAPL numeric(18,2);
declare variable AB1 numeric(18,2);
declare variable AB2 numeric(18,2);
declare variable AB3 numeric(18,2);
declare variable AB4 numeric(18,2);
declare variable IDNOTA integer;
declare variable AUTORET varchar(10);
declare variable FAUTORET date;
begin
execute procedure LEE_CONFIGURACION('CARTERA', 'SALDOS', 'DESCONTAR RETENCIONES POR CAUSACION') returning_values (DESC_RTES);
execute procedure LEE_CONFIGURACION('CARTERA', 'SALDOS', 'FECHA AUTORETENEDOR NO DESCONTAR RETENCIONES DEL SALDO PERO SI CONTABILIZARLAS') returning_values (AUTORET);
if (AUTORET <> '') then
    FAUTORET = cast(AUTORET as date);
else
    FAUTORET = '9999/12/31';
/* LAS DE ANTES DE LA AUTORETENCION */
if (MONEDA = 0) then
  begin
  if (DESC_RTES = 'SI') then
    begin
    for select max(SDCA_TIPOREF), max(SDCA_IDREF), sum(SDCA_MONTO-SDCA_ABONO-SDCA_RTFTE-SDCA_RTIVA-SDCA_RTICA), sum(SDCA_RTFTE - SDCA_ABRTFTE), sum(SDCA_RTIVA - SDCA_ABRTIVA), sum(SDCA_RTICA - SDCA_ABRTICA)
        from saldos_doc_cartera where TERC_NIT = :nit and (SDCA_FECHA <= :FECHA) and (SDCA_FECHA < :FAUTORET)
        group by sdca_tiporef, sdca_idref into :TIPO, :ID, :SALDO, :RTFTE, :RTIVA, :RTICA
        do
        begin
        if (SALDO <> 0) then
            begin
            select sum(SDCA_ABONO), sum(SDCA_ABRTFTE), sum(SDCA_ABRTIVA), sum(SDCA_ABRTICA)
                from saldos_doc_cartera where SDCA_TIPOREF = :TIPO and SDCA_IDREF = :id and (SDCA_FECHA <= :FECHA) and (SDCA_FECHA >= :FAUTORET)
                into :AB1, :AB2, :AB3, :AB4;
            if (AB1 is null) then
                AB1 = 0;
            if (AB2 is null) then
                AB2 = 0;
            if (AB3 is null) then
                AB3 = 0;
            if (AB4 is null) then
                AB4 = 0;
            SALDO = SALDO - AB1;
            RTFTE = RTFTE - AB2;
            RTIVA = RTIVA - AB3;
            RTICA = RTICA - AB4;
            NUMERO = '';
            select MVCL_FECHA, MVCL_VENCE, MVCL_PREFREF, MVCL_NUMREF, MVCL_CONC, MVCL_TRM
              from MOVIMIENTO_CLIENTES where TERC_NIT = :NIT and mvcl_sucursal = :sucursal and MVCL_FECHA <= :FECHA and MVCL_ABONO = 'N' and mvcl_tiporef = :tipo and mvcl_idref = :id
              into :FECDOC, :VENCE, :PREFIJO, :NUMERO, :CONCEPTO, :TRMDOC;
            if ((NUMERO <> '') AND (SALDO <> 0)) then
              begin
              DIAS = (FECHA -VENCE );
              select TIDO_NOMCORTO from TIPO_DOCUMENTO where TIDO_COD = :TIPO into :TIPONOM;
              if (TIPO = 41) then
                select NDCL_DTOFMONTO, NDCL_FECHADTO from NOTAS_DEBITO_CLIENTES where NDCL_ID = :ID into :DTOF, :FEC;
              if (TIPO = 42) then
                select 0, NCCL_FECHA from NOTAS_CREDITO_CLIENTES where NCCL_ID = :ID into :DTOF, :FEC;
              if (TIPO = 45) then
                select ANCL_DTOFMONTO, ANCL_DTOFECHA from ANTICIPOS_CLIENTE where ANCL_ID = :ID into :DTOF, :FEC;
              if (TIPO = 31) then
                select FACT_DTOFMONTO, FACT_DTOFFECHA from FACTURAS where FACT_ID = :ID into :DTOF, :FEC;
              if (TIPO = 33) then
                select 0, :FECHA from devoluciones_ventas where DEVT_ID = :ID into :DTOF, :FEC;

              recprov_id = 0;
              select max(RCPR_ID) from recibo_provisional_detalle where RPDE_IDDOC = :ID and RPDE_TIPODOC = :TIPO and RPDE_ANULADO = 'N' into :recprov_id;
              if (recprov_id is null) then
                reciprov = 'N';
              else
                reciprov = 'S';
              if (FECHA > FEC) then
                DTOF = 0;
              if (DTOF is null) then
                DTOF = 0;
              if (DTOF <> 0) then
                begin
                select sum(RCDE_DTOF) from RECIBOS_CAJA_DETALLE where RCDE_IDDOC = :ID and RCDE_TIPODOC = :TIPO into :DTOAPL;
                if (DTOAPL is null) then
                    DTOAPL = 0;
                DTOF = DTOF - DTOAPL;
                end
              if (RTFTE is null) then
                RTFTE = 0;
              if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) then
                begin
                if (RTFTE > 0) then
                    RTFTE = 0;
                end
              else
                begin
                if (RTFTE < 0) then
                    RTFTE = 0;
                end

              if (RTIVA is null) then
                RTIVA = 0;
              if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) then
                begin
                if (RTIVA > 0) then
                    RTIVA = 0;
                end
              else
                begin
                if (RTIVA < 0) then
                    RTIVA = 0;
                end

              if (RTICA is null) then
                RTICA = 0;
              if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) then
                begin
                if (RTICA > 0) then
                    RTICA = 0;
                end
              else
                begin
                if (RTICA < 0) then
                    RTICA = 0;
                end

              /* SI TIENE NOTA AGREGUELA */
              select max(NOCL_ID) from NOTAS_CLIENTES where TERC_NIT = :NIT and CLSU_COD = :SUCURSAL and NOCL_TIPODOC = :TIPO and NOCL_IDDOC = :ID into :IDNOTA;
              if (IDNOTA is not null) then
                select NOCL_TEXTO from NOTAS_CLIENTES where NOCL_ID = :IDNOTA into :NOTA;
              else
                NOTA = '';
              if ((SOLOPESOS = 'N') or (TRMDOC = 1)) then
                suspend;
              end
            end
        end
    /* LAS DE DESPUES DE LA AUTORETENCION */
    for select max(SDCA_TIPOREF), max(SDCA_IDREF), sum(SDCA_MONTO-SDCA_ABONO-SDCA_RTIVA-SDCA_RTICA), 0, sum(SDCA_RTIVA - SDCA_ABRTIVA), sum(SDCA_RTICA - SDCA_ABRTICA)
        from saldos_doc_cartera where (TERC_NIT = :nit) and (SDCA_FECHA <= :FECHA) and (SDCA_FECHA >= :FAUTORET) group by sdca_tiporef, sdca_idref
        into :TIPO, :ID, :SALDO, :RTFTE, :RTIVA, :RTICA
        do
        begin
        if (SALDO <> 0) then
            begin
            NUMERO = '';
            select MVCL_FECHA, MVCL_VENCE, MVCL_PREFREF, MVCL_NUMREF, MVCL_CONC, MVCL_TRM
              from MOVIMIENTO_CLIENTES where TERC_NIT = :NIT and mvcl_sucursal = :sucursal and MVCL_FECHA <= :FECHA and MVCL_ABONO = 'N' and mvcl_tiporef = :tipo and mvcl_idref = :id
              into :FECDOC, :VENCE, :PREFIJO, :NUMERO, :CONCEPTO, :TRMDOC;
            if (NUMERO <> '') then
              begin
              DIAS = (FECHA -VENCE );
              select TIDO_NOMCORTO from TIPO_DOCUMENTO where TIDO_COD = :TIPO into :TIPONOM;
              if (TIPO = 41) then
                select NDCL_DTOFMONTO, NDCL_FECHADTO from NOTAS_DEBITO_CLIENTES where NDCL_ID = :ID into :DTOF, :FEC;
              if (TIPO = 42) then
                select 0, NCCL_FECHA from NOTAS_CREDITO_CLIENTES where NCCL_ID = :ID into :DTOF, :FEC;
              if (TIPO = 45) then
                select ANCL_DTOFMONTO, ANCL_DTOFECHA from ANTICIPOS_CLIENTE where ANCL_ID = :ID into :DTOF, :FEC;
              if (TIPO = 31) then
                select FACT_DTOFMONTO, FACT_DTOFFECHA from FACTURAS where FACT_ID = :ID into :DTOF, :FEC;
              if (TIPO = 33) then
                select 0, :FECHA from devoluciones_ventas where DEVT_ID = :ID into :DTOF, :FEC;

              recprov_id = 0;
              select max(RCPR_ID) from recibo_provisional_detalle where RPDE_IDDOC = :ID and RPDE_TIPODOC = :TIPO and RPDE_ANULADO = 'N' into :recprov_id;
              if (recprov_id is null) then
                reciprov = 'N';
              else
                reciprov = 'S';
              if (FECHA > FEC) then
                DTOF = 0;
              if (DTOF is null) then
                DTOF = 0;
              if (DTOF <> 0) then
                begin
                select sum(RCDE_DTOF) from RECIBOS_CAJA_DETALLE where RCDE_IDDOC = :ID and RCDE_TIPODOC = :TIPO into :DTOAPL;
                if (DTOAPL is null) then
                    DTOAPL = 0;
                DTOF = DTOF - DTOAPL;
                end

              if (RTIVA is null) then
                RTIVA = 0;
              if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) then
                begin
                if (RTIVA > 0) then
                    RTIVA = 0;
                end
              else
                begin
                if (RTIVA < 0) then
                    RTIVA = 0;
                end

              if (RTICA is null) then
                RTICA = 0;
              if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) then
                begin
                if (RTICA > 0) then
                    RTICA = 0;
                end
              else
                begin
                if (RTICA < 0) then
                    RTICA = 0;
                end

              /* SI TIENE NOTA AGREGUELA */
              select max(NOCL_ID) from NOTAS_CLIENTES where TERC_NIT = :NIT and CLSU_COD = :SUCURSAL and NOCL_TIPODOC = :TIPO and NOCL_IDDOC = :ID into :IDNOTA;
              if (IDNOTA is not null) then
                select NOCL_TEXTO from NOTAS_CLIENTES where NOCL_ID = :IDNOTA into :NOTA;
              else
                NOTA = '';
              if ((SOLOPESOS = 'N') or (TRMDOC = 1)) then
                suspend;
              end
            end
        end
    end
  else
    begin
    for select max(SDCA_TIPOREF), max(SDCA_IDREF), sum(SDCA_MONTO-SDCA_ABONO-SDCA_ABRTFTE-SDCA_ABRTIVA-SDCA_ABRTICA), sum(SDCA_RTFTE - SDCA_ABRTFTE), sum(SDCA_RTIVA - SDCA_ABRTIVA), sum(SDCA_RTICA - SDCA_ABRTICA)
        from saldos_doc_cartera where (TERC_NIT = :nit) and (SDCA_FECHA <= :FECHA) and (SDCA_FECHA < :FAUTORET) group by sdca_tiporef, sdca_idref
        into :TIPO, :ID, :SALDO, :RTFTE, :RTIVA, :RTICA
        do
        begin
        if (SALDO <> 0) then
            begin
            select sum(SDCA_ABONO+SDCA_ABRTIVA+SDCA_ABRTICA), sum(SDCA_ABRTFTE), sum(SDCA_ABRTIVA), sum(SDCA_ABRTICA)
                from saldos_doc_cartera where SDCA_TIPOREF = :TIPO and SDCA_IDREF = :id and (SDCA_FECHA <= :FECHA) and (SDCA_FECHA >= :FAUTORET)
                into :AB1, :AB2, :AB3, :AB4;
            if (AB1 is null) then
                AB1 = 0;
            if (AB2 is null) then
                AB2 = 0;
            if (AB3 is null) then
                AB3 = 0;
            if (AB4 is null) then
                AB4 = 0;
            SALDO = SALDO - AB1;
            RTFTE = RTFTE - AB2;
            RTIVA = RTIVA - AB3;
            RTICA = RTICA - AB4;
            NUMERO = '';
            select MVCL_FECHA, MVCL_VENCE, MVCL_PREFREF, MVCL_NUMREF, MVCL_CONC, MVCL_TRM
              from MOVIMIENTO_CLIENTES where TERC_NIT = :NIT and mvcl_sucursal = :sucursal and MVCL_FECHA <= :FECHA and MVCL_ABONO = 'N' and mvcl_tiporef = :tipo and mvcl_idref = :id
              into :FECDOC, :VENCE, :PREFIJO, :NUMERO, :CONCEPTO, :TRMDOC;
            if ((NUMERO <> '') AND (SALDO <> 0)) then
              begin
              DIAS = (FECHA -VENCE );
              select TIDO_NOMCORTO from TIPO_DOCUMENTO where TIDO_COD = :TIPO into :TIPONOM;
              if (TIPO = 41) then
                select NDCL_DTOFMONTO, NDCL_FECHADTO from NOTAS_DEBITO_CLIENTES where NDCL_ID = :ID into :DTOF, :FEC;
              if (TIPO = 42) then
                select 0, NCCL_FECHA from NOTAS_CREDITO_CLIENTES where NCCL_ID = :ID into :DTOF, :FEC;
              if (TIPO = 45) then
                select ANCL_DTOFMONTO, ANCL_DTOFECHA from ANTICIPOS_CLIENTE where ANCL_ID = :ID into :DTOF, :FEC;
              if (TIPO = 31) then
                select FACT_DTOFMONTO, FACT_DTOFFECHA from FACTURAS where FACT_ID = :ID into :DTOF, :FEC;
              if (TIPO = 33) then
                select 0, :FECHA from devoluciones_ventas where DEVT_ID = :ID into :DTOF, :FEC;

              recprov_id = 0;
              select max(RCPR_ID) from recibo_provisional_detalle where RPDE_IDDOC = :ID and RPDE_TIPODOC = :TIPO and RPDE_ANULADO = 'N' into :recprov_id;
              if (recprov_id is null) then
                reciprov = 'N';
              else
                reciprov = 'S';
              if (FECHA > FEC) then
                DTOF = 0;
              if (DTOF is null) then
                DTOF = 0;
              if (DTOF <> 0) then
                begin
                select sum(RCDE_DTOF) from RECIBOS_CAJA_DETALLE where RCDE_IDDOC = :ID and RCDE_TIPODOC = :TIPO into :DTOAPL;
                if (DTOAPL is null) then
                    DTOAPL = 0;
                DTOF = DTOF - DTOAPL;
                end
              if (RTFTE is null) then
                RTFTE = 0;
              if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) then
                begin
                if (RTFTE > 0) then
                    RTFTE = 0;
                end
              else
                begin
                if (RTFTE < 0) then
                    RTFTE = 0;
                end

              if (RTIVA is null) then
                RTIVA = 0;
              if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) then
                begin
                if (RTIVA > 0) then
                    RTIVA = 0;
                end
              else
                begin
                if (RTIVA < 0) then
                    RTIVA = 0;
                end

              if (RTICA is null) then
                RTICA = 0;
              if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) then
                begin
                if (RTICA > 0) then
                    RTICA = 0;
                end
              else
                begin
                if (RTICA < 0) then
                    RTICA = 0;
                end

              /* SI TIENE NOTA AGREGUELA */
              select max(NOCL_ID) from NOTAS_CLIENTES where TERC_NIT = :NIT and CLSU_COD = :SUCURSAL and NOCL_TIPODOC = :TIPO and NOCL_IDDOC = :ID into :IDNOTA;
              if (IDNOTA is not null) then
                select NOCL_TEXTO from NOTAS_CLIENTES where NOCL_ID = :IDNOTA into :NOTA;
              else
                NOTA = '';
              if ((SOLOPESOS = 'N') or (TRMDOC = 1)) then
                suspend;
              end
            end
        end
    /* DESPUES DE LA AUTORETENCION */
    for select max(SDCA_TIPOREF), max(SDCA_IDREF), sum(SDCA_MONTO-SDCA_ABONO-SDCA_ABRTIVA-SDCA_ABRTICA), sum(SDCA_RTFTE - SDCA_ABRTFTE), sum(SDCA_RTIVA - SDCA_ABRTIVA), sum(SDCA_RTICA - SDCA_ABRTICA)
        from saldos_doc_cartera where (TERC_NIT = :nit) and (SDCA_FECHA <= :FECHA) and (SDCA_FECHA >= :FAUTORET) group by sdca_tiporef, sdca_idref
        into :TIPO, :ID, :SALDO, :RTFTE, :RTIVA, :RTICA
        do
        begin
        if (SALDO <> 0) then
            begin
            NUMERO = '';
            select MVCL_FECHA, MVCL_VENCE, MVCL_PREFREF, MVCL_NUMREF, MVCL_CONC, MVCL_TRM
              from MOVIMIENTO_CLIENTES where TERC_NIT = :NIT and mvcl_sucursal = :sucursal and MVCL_FECHA <= :FECHA and MVCL_ABONO = 'N' and mvcl_tiporef = :tipo and mvcl_idref = :id
              into :FECDOC, :VENCE, :PREFIJO, :NUMERO, :CONCEPTO, :TRMDOC;
            if (NUMERO <> '') then
              begin
              DIAS = (FECHA -VENCE );
              select TIDO_NOMCORTO from TIPO_DOCUMENTO where TIDO_COD = :TIPO into :TIPONOM;
              if (TIPO = 41) then
                select NDCL_DTOFMONTO, NDCL_FECHADTO from NOTAS_DEBITO_CLIENTES where NDCL_ID = :ID into :DTOF, :FEC;
              if (TIPO = 42) then
                select 0, NCCL_FECHA from NOTAS_CREDITO_CLIENTES where NCCL_ID = :ID into :DTOF, :FEC;
              if (TIPO = 45) then
                select ANCL_DTOFMONTO, ANCL_DTOFECHA from ANTICIPOS_CLIENTE where ANCL_ID = :ID into :DTOF, :FEC;
              if (TIPO = 31) then
                select FACT_DTOFMONTO, FACT_DTOFFECHA from FACTURAS where FACT_ID = :ID into :DTOF, :FEC;
              if (TIPO = 33) then
                select 0, :FECHA from devoluciones_ventas where DEVT_ID = :ID into :DTOF, :FEC;

              recprov_id = 0;
              select max(RCPR_ID) from recibo_provisional_detalle where RPDE_IDDOC = :ID and RPDE_TIPODOC = :TIPO and RPDE_ANULADO = 'N' into :recprov_id;
              if (recprov_id is null) then
                reciprov = 'N';
              else
                reciprov = 'S';
              if (FECHA > FEC) then
                DTOF = 0;
              if (DTOF is null) then
                DTOF = 0;
              if (DTOF <> 0) then
                begin
                select sum(RCDE_DTOF) from RECIBOS_CAJA_DETALLE where RCDE_IDDOC = :ID and RCDE_TIPODOC = :TIPO into :DTOAPL;
                if (DTOAPL is null) then
                    DTOAPL = 0;
                DTOF = DTOF - DTOAPL;
                end

              if (RTIVA is null) then
                RTIVA = 0;
              if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) then
                begin
                if (RTIVA > 0) then
                    RTIVA = 0;
                end
              else
                begin
                if (RTIVA < 0) then
                    RTIVA = 0;
                end

              if (RTICA is null) then
                RTICA = 0;
              if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) then
                begin
                if (RTICA > 0) then
                    RTICA = 0;
                end
              else
                begin
                if (RTICA < 0) then
                    RTICA = 0;
                end

              /* SI TIENE NOTA AGREGUELA */
              select max(NOCL_ID) from NOTAS_CLIENTES where TERC_NIT = :NIT and CLSU_COD = :SUCURSAL and NOCL_TIPODOC = :TIPO and NOCL_IDDOC = :ID into :IDNOTA;
              if (IDNOTA is not null) then
                select NOCL_TEXTO from NOTAS_CLIENTES where NOCL_ID = :IDNOTA into :NOTA;
              else
                NOTA = '';
              if ((SOLOPESOS = 'N') or (TRMDOC = 1)) then
                suspend;
              end
            end
        end
    end
  end
else
  begin
  if (DESC_RTES = 'SI') then
    begin
    for select max(SDCA_TIPOREF), max(SDCA_IDREF), sum((SDCA_MONTO-SDCA_ABONO-SDCA_RTFTE-SDCA_RTIVA-SDCA_RTICA)/SDCA_TRM), sum((SDCA_RTFTE-SDCA_ABRTFTE)/SDCA_TRM), sum((SDCA_RTIVA-SDCA_ABRTIVA)/SDCA_TRM), sum((SDCA_RTICA-SDCA_ABRTICA)/SDCA_TRM)
        from saldos_doc_cartera where TERC_NIT = :nit and (SDCA_FECHA <= :FECHA) and (SDCA_FECHA < :FAUTORET) and SDCA_TRM <> 1
        group by sdca_tiporef, sdca_idref into :TIPO, :ID, :SALDO, :RTFTE, :RTIVA, :RTICA
        do
        begin
        if (SALDO <> 0) then
            begin
            select sum(SDCA_ABONO/SDCA_TRM), sum(SDCA_ABRTFTE), sum(SDCA_ABRTIVA), sum(SDCA_ABRTICA)
                from saldos_doc_cartera where SDCA_TIPOREF = :TIPO and SDCA_IDREF = :id and (SDCA_FECHA <= :FECHA) and (SDCA_FECHA >= :FAUTORET)
                into :AB1, :AB2, :AB3, :AB4;
            if (AB1 is null) then
                AB1 = 0;
            if (AB2 is null) then
                AB2 = 0;
            if (AB3 is null) then
                AB3 = 0;
            if (AB4 is null) then
                AB4 = 0;
            SALDO = SALDO - AB1;
            RTFTE = RTFTE - AB2;
            RTIVA = RTIVA - AB3;
            RTICA = RTICA - AB4;
            NUMERO = '';
            select MVCL_FECHA, MVCL_VENCE, MVCL_PREFREF, MVCL_NUMREF, MVCL_CONC, MVCL_TRM
              from MOVIMIENTO_CLIENTES where TERC_NIT = :NIT and mvcl_sucursal = :sucursal and MVCL_FECHA <= :FECHA and MVCL_ABONO = 'N' and mvcl_tiporef = :tipo and mvcl_idref = :id
              into :FECDOC, :VENCE, :PREFIJO, :NUMERO, :CONCEPTO, :TRMDOC;
            if ((NUMERO <> '') AND (SALDO <> 0)) then
              begin
              DIAS = (FECHA -VENCE );
              select TIDO_NOMCORTO from TIPO_DOCUMENTO where TIDO_COD = :TIPO into :TIPONOM;
              if (TIPO = 41) then
                select NDCL_DTOFMONTO/NDCL_TRM, NDCL_FECHADTO from NOTAS_DEBITO_CLIENTES where NDCL_ID = :ID into :DTOF, :FEC;
              if (TIPO = 42) then
                select 0, NCCL_FECHA from NOTAS_CREDITO_CLIENTES where NCCL_ID = :ID into :DTOF, :FEC;
              if (TIPO = 45) then
                select ANCL_DTOFMONTO/ANCL_TRM, ANCL_DTOFECHA from ANTICIPOS_CLIENTE where ANCL_ID = :ID into :DTOF, :FEC;
              if (TIPO = 31) then
                select FACT_DTOFMONTO/FACT_TRM, FACT_DTOFFECHA from FACTURAS where FACT_ID = :ID into :DTOF, :FEC;
              if (TIPO = 33) then
                select 0, :FECHA from devoluciones_ventas where DEVT_ID = :ID into :DTOF, :FEC;

              recprov_id = 0;
              select max(RCPR_ID) from recibo_provisional_detalle where RPDE_IDDOC = :ID and RPDE_TIPODOC = :TIPO and RPDE_ANULADO = 'N' into :recprov_id;
              if (recprov_id is null) then
                reciprov = 'N';
              else
                reciprov = 'S';
              if (FECHA > FEC) then
                DTOF = 0;
              if (DTOF is null) then
                DTOF = 0;
              if (DTOF <> 0) then
                begin
                select sum(RCDE_DTOF/RECA_TRM) from RECIBOS_CAJA_DETALLE D, recibos_caja R
                    where R.reca_id = D.reca_id and RCDE_IDDOC = :ID and RCDE_TIPODOC = :TIPO into :DTOAPL;
                if (DTOAPL is null) then
                    DTOAPL = 0;
                DTOF = DTOF - DTOAPL;
                end
              if (RTFTE is null) then
                RTFTE = 0;
              if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) then
                begin
                if (RTFTE > 0) then
                    RTFTE = 0;
                end
              else
                begin
                if (RTFTE < 0) then
                    RTFTE = 0;
                end

              if (RTIVA is null) then
                RTIVA = 0;
              if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) then
                begin
                if (RTIVA > 0) then
                    RTIVA = 0;
                end
              else
                begin
                if (RTIVA < 0) then
                    RTIVA = 0;
                end

              if (RTICA is null) then
                RTICA = 0;
              if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) then
                begin
                if (RTICA > 0) then
                    RTICA = 0;
                end
              else
                begin
                if (RTICA < 0) then
                    RTICA = 0;
                end

              /* SI TIENE NOTA AGREGUELA */
              select max(NOCL_ID) from NOTAS_CLIENTES where TERC_NIT = :NIT and CLSU_COD = :SUCURSAL and NOCL_TIPODOC = :TIPO and NOCL_IDDOC = :ID into :IDNOTA;
              if (IDNOTA is not null) then
                select NOCL_TEXTO from NOTAS_CLIENTES where NOCL_ID = :IDNOTA into :NOTA;
              else
                NOTA = '';
              suspend;
              end
            end
        end
    /* LAS DE DESPUES DE LA AUTORETENCION */
    for select max(SDCA_TIPOREF), max(SDCA_IDREF), sum((SDCA_MONTO-SDCA_ABONO-SDCA_RTIVA-SDCA_RTICA)/SDCA_TRM), 0, sum((SDCA_RTIVA-SDCA_ABRTIVA)/SDCA_TRM), sum((SDCA_RTICA-SDCA_ABRTICA)/SDCA_TRM)
        from saldos_doc_cartera where (TERC_NIT = :nit) and (SDCA_FECHA <= :FECHA) and (SDCA_FECHA >= :FAUTORET) group by sdca_tiporef, sdca_idref
        into :TIPO, :ID, :SALDO, :RTFTE, :RTIVA, :RTICA
        do
        begin
        if (SALDO <> 0) then
            begin
            NUMERO = '';
            select MVCL_FECHA, MVCL_VENCE, MVCL_PREFREF, MVCL_NUMREF, MVCL_CONC
              from MOVIMIENTO_CLIENTES where TERC_NIT = :NIT and mvcl_sucursal = :sucursal and MVCL_FECHA <= :FECHA and MVCL_ABONO = 'N' and mvcl_tiporef = :tipo and mvcl_idref = :id
              into :FECDOC, :VENCE, :PREFIJO, :NUMERO, :CONCEPTO;
            if (NUMERO <> '') then
              begin
              DIAS = (FECHA -VENCE );
              select TIDO_NOMCORTO from TIPO_DOCUMENTO where TIDO_COD = :TIPO into :TIPONOM;
              if (TIPO = 41) then
                select NDCL_DTOFMONTO/NDCL_TRM, NDCL_FECHADTO from NOTAS_DEBITO_CLIENTES where NDCL_ID = :ID into :DTOF, :FEC;
              if (TIPO = 42) then
                select 0, NCCL_FECHA from NOTAS_CREDITO_CLIENTES where NCCL_ID = :ID into :DTOF, :FEC;
              if (TIPO = 45) then
                select ANCL_DTOFMONTO/ANCL_TRM, ANCL_DTOFECHA from ANTICIPOS_CLIENTE where ANCL_ID = :ID into :DTOF, :FEC;
              if (TIPO = 31) then
                select FACT_DTOFMONTO/FACT_TRM, FACT_DTOFFECHA from FACTURAS where FACT_ID = :ID into :DTOF, :FEC;
              if (TIPO = 33) then
                select 0, :FECHA from devoluciones_ventas where DEVT_ID = :ID into :DTOF, :FEC;

              recprov_id = 0;
              select max(RCPR_ID) from recibo_provisional_detalle where RPDE_IDDOC = :ID and RPDE_TIPODOC = :TIPO and RPDE_ANULADO = 'N' into :recprov_id;
              if (recprov_id is null) then
                reciprov = 'N';
              else
                reciprov = 'S';
              if (FECHA > FEC) then
                DTOF = 0;
              if (DTOF is null) then
                DTOF = 0;
              if (DTOF <> 0) then
                begin
                select sum(RCDE_DTOF/RECA_TRM) from RECIBOS_CAJA_DETALLE D, RECIBOS_CAJA R
                    where R.reca_id = D.reca_id and RCDE_IDDOC = :ID and RCDE_TIPODOC = :TIPO into :DTOAPL;
                if (DTOAPL is null) then
                    DTOAPL = 0;
                DTOF = DTOF - DTOAPL;
                end

              if (RTIVA is null) then
                RTIVA = 0;
              if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) then
                begin
                if (RTIVA > 0) then
                    RTIVA = 0;
                end
              else
                begin
                if (RTIVA < 0) then
                    RTIVA = 0;
                end

              if (RTICA is null) then
                RTICA = 0;
              if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) then
                begin
                if (RTICA > 0) then
                    RTICA = 0;
                end
              else
                begin
                if (RTICA < 0) then
                    RTICA = 0;
                end

              /* SI TIENE NOTA AGREGUELA */
              select max(NOCL_ID) from NOTAS_CLIENTES where TERC_NIT = :NIT and CLSU_COD = :SUCURSAL and NOCL_TIPODOC = :TIPO and NOCL_IDDOC = :ID into :IDNOTA;
              if (IDNOTA is not null) then
                select NOCL_TEXTO from NOTAS_CLIENTES where NOCL_ID = :IDNOTA into :NOTA;
              else
                NOTA = '';
              suspend;
              end
            end
        end
    end
  else
    begin
    for select max(SDCA_TIPOREF), max(SDCA_IDREF), sum((SDCA_MONTO-SDCA_ABONO-SDCA_ABRTFTE-SDCA_ABRTIVA-SDCA_ABRTICA)/SDCA_TRM), sum((SDCA_RTFTE-SDCA_ABRTFTE)/SDCA_TRM), sum((SDCA_RTIVA-SDCA_ABRTIVA)/SDCA_TRM), sum((SDCA_RTICA-SDCA_ABRTICA)/SDCA_TRM)
        from saldos_doc_cartera where (TERC_NIT = :nit) and (SDCA_FECHA <= :FECHA) and (SDCA_FECHA < :FAUTORET) group by sdca_tiporef, sdca_idref
        into :TIPO, :ID, :SALDO, :RTFTE, :RTIVA, :RTICA
        do
        begin
        if (SALDO <> 0) then
            begin
            select sum((SDCA_ABONO+SDCA_ABRTIVA+SDCA_RTICA)/SDCA_TRM), sum(SDCA_ABRTFTE), sum(SDCA_ABRTIVA), sum(SDCA_ABRTICA)
                from saldos_doc_cartera where SDCA_TIPOREF = :TIPO and SDCA_IDREF = :id and (SDCA_FECHA <= :FECHA) and (SDCA_FECHA >= :FAUTORET)
                INTO :AB1, :AB2, :AB3, :AB4;
            if (AB1 IS NULL) then
                AB1 = 0;
            if (AB2 IS NULL) then
                AB2 = 0;
            if (AB3 IS NULL) then
                AB3 = 0;
            if (AB4 IS NULL) then
                AB4 = 0;
            SALDO = SALDO - AB1;
            RTFTE = RTFTE - AB2;
            RTIVA = RTIVA - AB3;
            RTICA = RTICA - AB4;
            NUMERO = '';
            select MVCL_FECHA, MVCL_VENCE, MVCL_PREFREF, MVCL_NUMREF, MVCL_CONC
              from MOVIMIENTO_CLIENTES where TERC_NIT = :NIT and mvcl_sucursal = :sucursal and MVCL_FECHA <= :FECHA and MVCL_ABONO = 'N' and mvcl_tiporef = :tipo and mvcl_idref = :id
              into :FECDOC, :VENCE, :PREFIJO, :NUMERO, :CONCEPTO;
            if ((NUMERO <> '') AND (SALDO <> 0)) then
              begin
              DIAS = (FECHA -VENCE );
              select TIDO_NOMCORTO from TIPO_DOCUMENTO where TIDO_COD = :TIPO into :TIPONOM;
              if (TIPO = 41) then
                select NDCL_DTOFMONTO/NDCL_TRM, NDCL_FECHADTO from NOTAS_DEBITO_CLIENTES where NDCL_ID = :ID into :DTOF, :FEC;
              if (TIPO = 42) then
                select 0, NCCL_FECHA from NOTAS_CREDITO_CLIENTES where NCCL_ID = :ID into :DTOF, :FEC;
              if (TIPO = 45) then
                select ANCL_DTOFMONTO/ANCL_TRM, ANCL_DTOFECHA from ANTICIPOS_CLIENTE where ANCL_ID = :ID into :DTOF, :FEC;
              if (TIPO = 31) then
                select FACT_DTOFMONTO/FACT_TRM, FACT_DTOFFECHA from FACTURAS where FACT_ID = :ID into :DTOF, :FEC;
              if (TIPO = 33) then
                select 0, :FECHA from devoluciones_ventas where DEVT_ID = :ID into :DTOF, :FEC;

              recprov_id = 0;
              select max(RCPR_ID) from recibo_provisional_detalle where RPDE_IDDOC = :ID and RPDE_TIPODOC = :TIPO and RPDE_ANULADO = 'N' into :recprov_id;
              if (recprov_id is null) then
                reciprov = 'N';
              else
                reciprov = 'S';
              if (FECHA > FEC) then
                DTOF = 0;
              if (DTOF is null) then
                DTOF = 0;
              if (DTOF <> 0) then
                begin
                select sum(RCDE_DTOF/RECA_TRM) from RECIBOS_CAJA_DETALLE D, RECIBOS_CAJA R
                    where R.reca_id = D.reca_id and RCDE_IDDOC = :ID and RCDE_TIPODOC = :TIPO into :DTOAPL;
                if (DTOAPL is null) then
                    DTOAPL = 0;
                DTOF = DTOF - DTOAPL;
                end
              if (RTFTE is null) then
                RTFTE = 0;
              if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) then
                begin
                if (RTFTE > 0) then
                    RTFTE = 0;
                end
              else
                begin
                if (RTFTE < 0) then
                    RTFTE = 0;
                end

              if (RTIVA is null) then
                RTIVA = 0;
              if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) then
                begin
                if (RTIVA > 0) then
                    RTIVA = 0;
                end
              else
                begin
                if (RTIVA < 0) then
                    RTIVA = 0;
                end

              if (RTICA is null) then
                RTICA = 0;
              if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) then
                begin
                if (RTICA > 0) then
                    RTICA = 0;
                end
              else
                begin
                if (RTICA < 0) then
                    RTICA = 0;
                end

              /* SI TIENE NOTA AGREGUELA */
              select max(NOCL_ID) from NOTAS_CLIENTES where TERC_NIT = :NIT and CLSU_COD = :SUCURSAL and NOCL_TIPODOC = :TIPO and NOCL_IDDOC = :ID into :IDNOTA;
              if (IDNOTA is not null) then
                select NOCL_TEXTO from NOTAS_CLIENTES where NOCL_ID = :IDNOTA into :NOTA;
              else
                NOTA = '';
              suspend;
              end
            end
        end
    /* DESPUES DE LA AUTORETENCION */
    for select max(SDCA_TIPOREF), max(SDCA_IDREF), sum((SDCA_MONTO-SDCA_ABONO-SDCA_ABRTIVA-SDCA_ABRTICA)/SDCA_TRM), sum((SDCA_RTFTE-SDCA_ABRTFTE)/SDCA_TRM), sum((SDCA_RTIVA-SDCA_ABRTIVA)/SDCA_TRM), sum((SDCA_RTICA-SDCA_ABRTICA)/SDCA_TRM)
        from saldos_doc_cartera where (TERC_NIT = :nit) and (SDCA_FECHA <= :FECHA) and (SDCA_FECHA >= :FAUTORET) group by sdca_tiporef, sdca_idref
        into :TIPO, :ID, :SALDO, :RTFTE, :RTIVA, :RTICA
        do
        begin
        if (SALDO <> 0) then
            begin
            NUMERO = '';
            select MVCL_FECHA, MVCL_VENCE, MVCL_PREFREF, MVCL_NUMREF, MVCL_CONC
              from MOVIMIENTO_CLIENTES where TERC_NIT = :NIT and mvcl_sucursal = :sucursal and MVCL_FECHA <= :FECHA and MVCL_ABONO = 'N' and mvcl_tiporef = :tipo and mvcl_idref = :id
              into :FECDOC, :VENCE, :PREFIJO, :NUMERO, :CONCEPTO;
            if (NUMERO <> '') then
              begin
              DIAS = (FECHA -VENCE );
              select TIDO_NOMCORTO from TIPO_DOCUMENTO where TIDO_COD = :TIPO into :TIPONOM;
              if (TIPO = 41) then
                select NDCL_DTOFMONTO/NDCL_TRM, NDCL_FECHADTO from NOTAS_DEBITO_CLIENTES where NDCL_ID = :ID into :DTOF, :FEC;
              if (TIPO = 42) then
                select 0, NCCL_FECHA from NOTAS_CREDITO_CLIENTES where NCCL_ID = :ID into :DTOF, :FEC;
              if (TIPO = 45) then
                select ANCL_DTOFMONTO/ANCL_TRM, ANCL_DTOFECHA from ANTICIPOS_CLIENTE where ANCL_ID = :ID into :DTOF, :FEC;
              if (TIPO = 31) then
                select FACT_DTOFMONTO/FACT_TRM, FACT_DTOFFECHA from FACTURAS where FACT_ID = :ID into :DTOF, :FEC;
              if (TIPO = 33) then
                select 0, :FECHA from devoluciones_ventas where DEVT_ID = :ID into :DTOF, :FEC;

              recprov_id = 0;
              select max(RCPR_ID) from recibo_provisional_detalle where RPDE_IDDOC = :ID and RPDE_TIPODOC = :TIPO and RPDE_ANULADO = 'N' into :recprov_id;
              if (recprov_id is null) then
                reciprov = 'N';
              else
                reciprov = 'S';
              if (FECHA > FEC) then
                DTOF = 0;
              if (DTOF is null) then
                DTOF = 0;
              if (DTOF <> 0) then
                begin
                select sum(RCDE_DTOF/RECA_TRM) from RECIBOS_CAJA_DETALLE D, RECIBOS_CAJA R
                    where R.reca_id = D.reca_id and RCDE_IDDOC = :ID and RCDE_TIPODOC = :TIPO into :DTOAPL;
                if (DTOAPL is null) then
                    DTOAPL = 0;
                DTOF = DTOF - DTOAPL;
                end

              if (RTIVA is null) then
                RTIVA = 0;
              if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) then
                begin
                if (RTIVA > 0) then
                    RTIVA = 0;
                end
              else
                begin
                if (RTIVA < 0) then
                    RTIVA = 0;
                end

              if (RTICA is null) then
                RTICA = 0;
              if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) then
                begin
                if (RTICA > 0) then
                    RTICA = 0;
                end
              else
                begin
                if (RTICA < 0) then
                    RTICA = 0;
                end

              /* SI TIENE NOTA AGREGUELA */
              select max(NOCL_ID) from NOTAS_CLIENTES where TERC_NIT = :NIT and CLSU_COD = :SUCURSAL and NOCL_TIPODOC = :TIPO and NOCL_IDDOC = :ID into :IDNOTA;
              if (IDNOTA is not null) then
                select NOCL_TEXTO from NOTAS_CLIENTES where NOCL_ID = :IDNOTA into :NOTA;
              else
                NOTA = '';
              suspend;
              end
            end
        end
    end
  end
end
^

SET TERM ; ^


/* 2009/01/05 no mostraba el stand */

SET TERM ^ ;

CREATE OR ALTER PROCEDURE EXISTENCIAS_COMPRAS(
    ARTICULO VARCHAR(15),
    FECHA DATE,
    UNIDAD VARCHAR(8))
RETURNS (
    BODEGA VARCHAR(2),
    EXISTENCIA NUMERIC(18,4),
    RESERVADO NUMERIC(18,4),
    ORDENADO NUMERIC(18,4),
    PROMEDIO NUMERIC(18,4),
    VENTAMES NUMERIC(18,4),
    FECHACMP DATE,
    CANTCMP NUMERIC(18,4),
    DIAS INTEGER,
    SUGERIDO NUMERIC(18,4),
    STAND VARCHAR(15))
AS
declare variable FACTOR NUMERIC(15,4);
declare variable ORDENC NUMERIC(18,4);
declare variable PEDIDO NUMERIC(18,4);
declare variable ITEM INTEGER;
declare variable ID INTEGER;
declare variable UND VARCHAR(8);
declare variable CANT NUMERIC(18,4);
declare variable FACTOR2 NUMERIC(18,4);
declare variable fecini DATE;
declare variable FECHAAUX VARCHAR(10);
declare variable AGENCIA INTEGER;
declare variable DEVMES NUMERIC(18,2);
declare variable MFAC INTEGER;
declare variable MDEV INTEGER;
declare variable IVAF NUMERIC(18,2);
declare variable IVAD NUMERIC(18,2);
declare variable DIA_ART VARCHAR(2) CHARACTER SET NONE;
declare variable DIASC VARCHAR(255);
declare variable PEDAUTO CHAR(2);
declare variable SALIDAS NUMERIC(18,4);
BEGIN
  for select bode_cod, SUCU_ID from bodega into :bodega, :agencia
    do
    begin
    execute procedure saldo_inventario (:articulo, :bodega, :fecha) returning_values (:Existencia);
    EXECUTE PROCEDURE FACTOR_UNIDAD_CANT(:ARTICULO, :UNIDAD) returning_values (:FACTOR);
    if (FACTOR <> 0) then
        EXISTENCIA = EXISTENCIA / FACTOR;
    else
        EXISTENCIA = 0;
    SELECT STAND_COD FROM STANDS WHERE ARTI_COD = :ARTICULO AND STAND_BODEGA = :BODEGA INTO :stand;
    EXECUTE PROCEDURE promedio_salidas_articulo (:ARTICULO, :FECHA, :BODEGA) returning_values (:PROMEDIO, :SALIDAS);
    EXECUTE PROCEDURE lee_configuracion ('INVENTARIO', 'EXISTENCIAS', 'PROMEDIAR LAS SALIDAS DEL INVENTARIO CON EL NUMERO DE DIAS ASIGNADO A CADA ARTICULO') returning_values (:DIA_ART);
    if (DIA_ART = 'NO') then
        BEGIN
        EXECUTE PROCEDURE lee_configuracion ('INVENTARIO', 'EXISTENCIAS', 'NUMERO DE DIAS PARA PROMEDIO DE SALIDAS POR ARTICULO') returning_values (DIASC);
        DIAS = CAST(DIASC AS INTEGER);
        END
    ELSE
        SELECT ARTI_DIAS FROM ARTICULO WHERE ARTI_COD = :ARTICULO INTO :DIAS;
    if (DIAS is null) then
        DIAS = 0;
    PROMEDIO = DIAS * PROMEDIO;
    if (FACTOR <> 0) then
        PROMEDIO = PROMEDIO / FACTOR;
    SUGERIDO = PROMEDIO - EXISTENCIA;
    SELECT SUM(ORID_ENTREGAR)
      FROM ORDENINVENTARIO_DETALLE OD, ordenes_inventario O
      WHERE O.ORIN_ID = OD.ORIN_ID AND ARTI_COD = :ARTICULO AND ORIN_FECHA <= :FECHA AND ORIN_FECLLEGA >= :FECHA AND ORID_ANULADO = 'N' AND OD.BODE_COD = :BODEGA
      INTO :ORDENADO;
    if (ORDENADO IS NULL) then
        ORDENADO = 0;
    ORDENC = 0;
    FOR SELECT O.ORDC_ID, OCDE_ITEM, OCDE_CANT * OCDE_FACTOR
        FROM ORDENES_COMPRA O, ORDENES_COMPRA_DETALLE OD
        WHERE O.ORDC_ID = OD.ORDC_ID AND OD.ARTI_COD = :ARTICULO AND (ORDC_FECHA+ORDC_VALIDEZ) >= :FECHA AND ORDC_FECHA <= :FECHA AND OCDE_ANULADO = 'N' AND OD.BODE_COD = :BODEGA
        INTO :ID, :ITEM, :CANT
        do
        BEGIN
        EXECUTE PROCEDURE FALTANTE(23, 21, ID, ITEM) returning_values (PEDIDO, UND, FACTOR2);
        if (PEDIDO * FACTOR2 = CANT) then /* SI NO SE HA FACTURADO MIRE A VER SI SE REMISIONO */
            EXECUTE PROCEDURE FALTANTE(23, 22, ID, ITEM) returning_values (PEDIDO, UND, FACTOR2);
        if (PEDIDO IS NULL) then
            PEDIDO = 0;
        ORDENC = ORDENC + PEDIDO * FACTOR2;
        END
    ORDENADO = ORDENADO + ORDENC;
    if (FACTOR <> 0) then
        ORDENADO = ORDENADO / FACTOR;
    SELECT SUM(RSDE_LIBERAR)
      FROM RESERVAS_DETALLE RD, RESERVAS R
      WHERE R.RESE_ID = RD.RESE_ID AND ARTI_COD = :ARTICULO AND RESE_FECHA <= :FECHA AND RESE_VENCE >= :FECHA AND RD.BODE_COD = :BODEGA AND RSDE_ANULADO = 'N'
      INTO :RESERVADO;
    if (RESERVADO IS NULL) then
        RESERVADO = 0;
    PEDIDO = 0;
    FOR SELECT P.PEDI_ID, PEDE_ITEM, PEDE_CANT * PEDE_FACTOR
        FROM PEDIDOS P, PEDIDOS_DETALLE PD
        WHERE P.PEDI_ID = PD.PEDI_ID AND PD.ARTI_COD = :ARTICULO AND (PEDI_FECHA+PEDI_VALIDEZ) >= :FECHA AND PEDI_FECHA <= :FECHA AND PEDE_ANULADO = 'N' AND BODE_COD = :BODEGA
        INTO :ID, :ITEM, :CANT
        do
        BEGIN
        EXECUTE PROCEDURE FALTANTE(34, 31, ID, ITEM) returning_values (ORDENC, UND, FACTOR2);
        EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION', 'FACTURAS', 'GENERAR PEDIDO AUTOMATICAMENTE CON LA FACTURA') returning_values (pedauto);
        if ((ORDENC * FACTOR2 = CANT) or (PEDAUTO = 'SI')) then /* SI NO SE HA FACTURADO MIRE A VER SI SE REMISIONO */
            EXECUTE PROCEDURE FALTANTE(34, 32, ID, ITEM) returning_values (ORDENC, UND, FACTOR2);
        if (ORDENC IS NULL) then
            ORDENC = 0;
        PEDIDO = PEDIDO + ORDENC * FACTOR2;
        END
    RESERVADO = RESERVADO + PEDIDO;
    if (FACTOR <> 0) then
        RESERVADO = RESERVADO / FACTOR;
    /* VENTAS MES */
    FECHAAUX = CAST (FECHA AS VARCHAR(10));
    FECHAAUX = SUBSTR(FECHAAUX, 1, 7) || '/01';
    FECINI = CAST (FECHAAUX AS DATE);
    EXECUTE PROCEDURE ventas_articulo (:ARTICULO, :FECINI, :FECHA, :agencia) returning_values (:ventames, :mfac, :devmes, :mdev, :ivaf, :ivad);
    ventames = ventames - devmes;
    if (FACTOR <> 0) then
        ventames = ventames / FACTOR;
    /* FECHA COMPRA */
    SELECT FIRST 1 FACO_FECHA, FCDE_CANT * FCDE_FACTOR FROM FACTURAS_COMPRA F, FACTURAS_COMPRAS_DETALLE D
        WHERE F.FACO_ID = D.faco_id AND D.ARTI_COD = :articulo AND FACO_FECHA <= :FECHA AND D.bode_cod = :BODEGA
        ORDER BY FACO_FECHA DESC, F.FACO_ID DESC
        INTO :fechacmp, :cantcmp;
    SUSPEND;
    end
END
^

SET TERM ; ^


/* 2009/01/04B  borre el tipodoc si no hay movimiento */

SET TERM ^ ;

CREATE OR ALTER PROCEDURE MOVIMIENTO_CARTERA_DESDE_HASTA(
    NIT VARCHAR(20),
    DESDE DATE,
    HASTA DATE,
    EMPSUCURSAL INTEGER,
    MONEDA INTEGER)
RETURNS (
    INICIAL NUMERIC(18,2),
    TIPODOC VARCHAR(8),
    IDDOC INTEGER,
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    CONCEPTO VARCHAR(60),
    DEBITO NUMERIC(18,2),
    CREDITO NUMERIC(18,2),
    SALDO NUMERIC(18,2),
    NOMBRE VARCHAR(60),
    RTFTE NUMERIC(18,2),
    RTIVA NUMERIC(18,2),
    RTICA NUMERIC(18,2),
    SUCURSAL VARCHAR(10),
    RECPROV_ID INTEGER,
    RECIPROV CHAR(1))
AS
declare variable DB CHAR(1);
declare variable AB CHAR(1);
declare variable RETES CHAR(2);
declare variable tipo integer;
declare variable TRM NUMERIC(18,2);
declare variable i integer;
BEGIN
  /* Ubique el NIT */
  select terc_nom from terceros where terc_nit = :NIT INTO :NOMBRE;
  DESDE = DESDE - 1;
  INICIAL = 0;
  i = 0;
  FOR SELECT MVCL_TIPOREF, MVCL_IDREF FROM MOVIMIENTO_CLIENTES
    WHERE TERC_NIT = :NIT AND MVCL_FECHA <= :DESDE AND MVCL_ABONO = 'N' AND
    ((:empsucursal = 0) or (SUCU_ID = :empsucursal)) AND ((:MONEDA = 0) or (MVCL_TRM <> 1))
    INTO :TIPODOC, :IDDOC
    DO
    BEGIN
    EXECUTE PROCEDURE saldo_doc_cartera(TIPODOC, IDDOC, DESDE, MONEDA) returning_values (SALDO);
    if (SALDO <> 0) then
        INICIAL = INICIAL + SALDO;
    END
  DESDE = DESDE + 1;
  SALDO = INICIAL;
  tipodoc = '';
  iddoc = 0;
  EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'DESCONTAR RETENCIONES POR CAUSACION') returning_values(:RETES);
  FOR select tido_nomcorto, MVCL_TIPOREF, mvcl_idref, mvcl_prefref, mvcl_numref, mvcl_fecha, mvcl_conc, mvcl_monto, mvcl_debito, mvcl_rtefte, mvcl_rteiva, mvcl_rteica, mvcl_abono, mvcl_sucursal, MVCL_TRM
    from movimiento_clientes m, tipo_documento t
    where m.mvcl_tiporef = t.tido_cod and terc_nit = :NIT and mvcl_fecha >= :DESDE and mvcl_fecha <= :HASTA and mvcl_tiporef <> 45 AND
    ((SUCU_ID = :EMPSUCURSAL) or (:EMPSUCURSAL = 0)) AND ((:MONEDA = 0) or (MVCL_TRM <> 1))
    order by mvcl_fecha, mvcl_tiporef
    into :TIPODOC,:tipo,  :IDDOC, :PREFIJO, :NUMERO, :FECHA, :CONCEPTO, :DEBITO, :DB, :RTFTE, :RTIVA, :RTICA, :AB, :SUCURSAL, :TRM
    DO
    BEGIN
    i = i + 1;
    if (DB = 'N') then
        BEGIN
        if (AB = 'S') then
            if (RETES = 'SI') then
                CREDITO = DEBITO;
            ELSE
                CREDITO = DEBITO + RTFTE + RTIVA + RTICA;
        ELSE
            if (RETES = 'SI') then
                CREDITO = DEBITO - RTFTE - RTIVA - RTICA;
            ELSE
                CREDITO = DEBITO;
        DEBITO = 0;
        END
    ELSE
        BEGIN
        if (RETES = 'SI') then
            DEBITO = DEBITO - RTFTE - RTIVA - RTICA;
        CREDITO = 0;
        END
    if ((MONEDA <> 0) AND (TRM <> 0)) then
        BEGIN
        DEBITO = DEBITO / TRM;
        CREDITO = CREDITO / TRM;
        RTFTE = RTFTE / TRM;
        RTIVA = RTIVA / TRM;
        RTICA = RTICA / TRM;
        END
    SALDO = SALDO + DEBITO - CREDITO;
    /* IDENTIFICAR SI EL DOCUMENTO TIENE RECIBO PROVISIONAL*/
    recprov_id = 0;
    SELECT max(RCPR_ID) FROM recibo_provisional_detalle WHERE RPDE_IDDOC = :iddoc  AND RPDE_TIPODOC = :TIPO and RPDE_ANULADO = 'N' INTO :recprov_id;
    if (recprov_id is null) then
      BEGIN
       reciprov = 'N';
      end
    ELSE
      begin
       reciprov = 'S';
      END
    SUSPEND;
    END
if (i = 0) then
    SUSPEND;
END
^

SET TERM ; ^


/* 2009/01/05 NO ANULABA EL DETALLE AL ANULAR EL ENCABEZADO */

SET TERM ^ ;

CREATE OR ALTER TRIGGER PEDIDOS_AU FOR PEDIDOS
ACTIVE AFTER UPDATE POSITION 0
as
begin
if (NEW.pedi_anulado = 'S') then
    BEGIN
    INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
        VALUES (USER, 34, NEW.pedi_id, 'A', NEW.pref_pre || NEW.pedi_numero);
    if (OLD.PEDI_CONSOLIDA <> 0) then
        UPDATE consolidado_faltantes SET COFA_OK = 'N' WHERE COFA_ID = OLD.pedi_consolida;
    if (NEW.pedi_anulado <> OLD.pedi_anulado) then
        UPDATE pedidos_detalle SET PEDE_ANULADO = NEW.pedi_anulado WHERE PEDI_ID = NEW.PEDI_ID;
    END
ELSE
    BEGIN
    /* SI CAMBIA LA CONSOLIDACION ACTUALICE LOS DETALLES */
    if (NEW.pedi_consolida <> OLD.pedi_consolida) then
        UPDATE pedidos_detalle SET PEDE_TRANSMIT = 'N' WHERE PEDI_ID = NEW.PEDI_ID;

    /* ACTUALICE LOS ANULADOS Y TRASMITIDOS */
    if (NEW.pedi_anulado <> OLD.pedi_anulado) then
        UPDATE pedidos_detalle SET PEDE_ANULADO = NEW.pedi_anulado WHERE PEDI_ID = NEW.PEDI_ID;
    if (NEW.pedi_TRANSMIT <> OLD.pedi_transmit) then
        UPDATE pedidos_detalle SET PEDE_TRANSMIT = NEW.pedi_transmit WHERE PEDI_ID = NEW.PEDI_ID;
    INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
        VALUES (USER, 34, NEW.pedi_id, 'U', NEW.pref_pre || NEW.pedi_numero);
    END
end
^

SET TERM ; ^

/* 2009/01/05C  repetia el ultimo movimiento */

SET TERM ^ ;

CREATE OR ALTER PROCEDURE REP_CARTERA_CLIENTES(
    DESDE VARCHAR(20),
    HASTA VARCHAR(20),
    GRPINI VARCHAR(5),
    GRPFIN VARCHAR(5),
    FECHA DATE,
    ORDEN CHAR(1),
    AGRUPA CHAR(1),
    SUBEMPRESA INTEGER,
    GRUPCART INTEGER,
    MONEDA INTEGER)
RETURNS (
    NIT VARCHAR(20),
    NOMBRE VARCHAR(60),
    DIR VARCHAR(60),
    TELEFONO VARCHAR(40),
    CIUDAD VARCHAR(40),
    CONTACTO VARCHAR(60),
    EMAIL VARCHAR(100),
    FAX VARCHAR(25),
    CEL VARCHAR(25),
    CODCLI VARCHAR(20),
    CODZONA VARCHAR(2),
    NOMZONA VARCHAR(60),
    CODCOBR INTEGER,
    NOMCOBR VARCHAR(60),
    SUCURSAL VARCHAR(10),
    NOMSUC VARCHAR(60),
    DV CHAR(1),
    CODCIUD CHAR(5),
    NOMCIUD VARCHAR(60),
    TIPO INTEGER,
    ID INTEGER,
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(6),
    CONCEPTO VARCHAR(60),
    SALDO NUMERIC(18,2),
    PROVISIONAL NUMERIC(18,2),
    RTFTE NUMERIC(18,2),
    RTIVA NUMERIC(18,2),
    RTICA NUMERIC(18,2),
    DTOF NUMERIC(18,2),
    TIPONOM VARCHAR(8),
    FECDOC DATE,
    VENCE DATE,
    DIAS INTEGER,
    CUPO NUMERIC(18,2),
    DISPONIBLE NUMERIC(18,2),
    NOTA VARCHAR(256),
    OBS BLOB SUB_TYPE 0 SEGMENT SIZE 80,
    GRUPCOD INTEGER,
    GRUPNOM VARCHAR(30))
AS
DECLARE VARIABLE NITINI VARCHAR(20);
DECLARE VARIABLE NITFIN VARCHAR(20);
DECLARE VARIABLE NOMINI VARCHAR(20);
DECLARE VARIABLE NOMFIN VARCHAR(20);
DECLARE VARIABLE OK CHAR(1);
DECLARE VARIABLE FOV CHAR(11);
DECLARE VARIABLE DTOAPL NUMERIC(18,2);
DECLARE VARIABLE FECDTO DATE;
DECLARE VARIABLE FECNOTA VARCHAR(10);
DECLARE VARIABLE AUXNOTA VARCHAR(256);
DECLARE VARIABLE IDNOTA INTEGER;
declare variable descnt_prov char(2);
declare variable AUTORET VARCHAR(10);
declare variable FAUTORET DATE;
declare variable INCLANTI CHAR(2);
DECLARE VARIABLE TRM NUMERIC(18,2);
BEGIN
if (ORDEN = 'C') then
    BEGIN
    NITINI = DESDE;
    NITFIN = HASTA;
    NOMINI = '';
    NOMFIN = 'zz';
    END
ELSE
    BEGIN
    NOMINI = DESDE;
    NOMFIN = HASTA;
    NITINI = '';
    NITFIN = 'zz';
    END
  EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'DESCONTAR RECIBOS PROVISIONALES EN INFORMES DE CARTERA') RETURNING_VALUES (:descnt_prov);
  EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'INCLUIR ANTICIPOS DE CLIENTES EN REPORTES Y CONSULTAS DE CARTERA') returning_values (INCLANTI);
  EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'FECHA AUTORETENEDOR NO DESCONTAR RETENCIONES DEL SALDO PERO SI CONTABILIZARLAS') returning_values (AUTORET);
  if (AUTORET <> '') then
    FAUTORET = CAST(AUTORET AS DATE);
  else
    FAUTORET = '9999/12/31';
  /* Ubique el NIT */
  FOR select C.TERC_NIT, TERC_NOM, TERC_DV, CLSU_DIR, CLSU_TEL, CLSU_CIUDAD, S.COBR_COD, S.ZONA_COD, T.CIUD_COD, CLIE_CUPO, CLCU_COD, CLSU_NOMBRE, t.terc_obs, C.GRCA_COD, TERC_CONTACTO, TERC_EMAIL, TERC_FAX, TERC_CEL, CLIE_COD
    from terceros T, CLIENTES C, CLIENTE_SUCURSALES S
    where C.TERC_NIT = T.TERC_NIT AND TERC_CLIE = 'S' AND S.TERC_NIT = C.TERC_NIT AND C.TERC_NIT >= :NITINI AND C.TERC_NIT <= :NITFIN AND
        TERC_NOM >= :NOMINI AND TERC_NOM <= :NOMFIN AND ((:GRUPCART = 0) or (C.GRCA_COD = :GRUPCART))
    INTO :NIT, :NOMBRE, :DV, :DIR, :TELEFONO, :CIUDAD, :CODCOBR, :CODZONA, :CODCIUD, :CUPO, :SUCURSAL, :NOMSUC, :obs, :GRUPCOD, :CONTACTO, :EMAIL, :FAX, :CEL, :CODCLI
    DO  
    BEGIN
    if (CODCOBR IS NOT NULL) then
        SELECT COBR_NOM FROM COBRADORES  WHERE COBR_COD = :CODCOBR INTO :NOMCOBR;
    if (CODZONA IS NOT NULL) then
        SELECT ZONA_NOM FROM ZONAS WHERE ZONA_COD = :CODZONA INTO :NOMZONA;
    if (CODCIUD IS NOT NULL) then
        SELECT CIUD_NOM FROM CIUDADES  WHERE CIUD_COD = :CODCIUD INTO :NOMCIUD;
    SELECT GRCA_NOMBRE FROM GRUPO_CARTERA WHERE GRCA_COD = :GRUPCOD INTO :GRUPNOM;
    DISPONIBLE = CUPO;
    OK = 'N';
    if (AGRUPA = 'Z') then
        BEGIN
        if (GRPINI = '') then
            BEGIN
            if ((CODZONA IS NULL) or (CODZONA >= :GRPINI AND CODZONA <= :GRPFIN)) then
                OK = 'S';
            END
        ELSE
            if (CODZONA >= :GRPINI AND CODZONA <= :GRPFIN) then
                OK = 'S';
        END
    if (AGRUPA = 'I') then
        BEGIN
        if (GRPINI = '') then
            BEGIN
            if ((CODCIUD IS NULL) or (CODCIUD >= :GRPINI AND CODCIUD <= :GRPFIN)) then
                OK = 'S';
            END
        ELSE
            if (CODCIUD >= :GRPINI AND CODCIUD <= :GRPFIN) then
                OK = 'S';
        END
    if (AGRUPA = 'N') then
        OK = 'S';
        
    if (OK = 'S') then
        BEGIN
        /* BUSQUE EN SALDOS_DOC_CARTERA LOS QUE TENGAN SALDO > 0 */
        FOR SELECT MVCL_TIPOREF, MVCL_IDREF, MVCL_PREFREF, MVCL_NUMREF, MVCL_FECHA, MVCL_VENCE, MVCL_CONC
            FROM MOVIMIENTO_CLIENTES WHERE TERC_NIT = :NIT AND MVCL_SUCURSAL = :SUCURSAL AND MVCL_FECHA <= :FECHA AND
            MVCL_ABONO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) AND ((:MONEDA = 0) or (MVCL_TRM <> 1))
            INTO :TIPO, :ID, :PREFIJO, :NUMERO, :FECDOC, :VENCE, :CONCEPTO
            DO
            BEGIN
            if ((inclanti = 'SI') or (TIPO <> 45)) then
                BEGIN
                EXECUTE PROCEDURE saldo_doc_cartera(TIPO, ID, FECHA, MONEDA) returning_values (SALDO);
                if (SALDO <> 0) then
                    BEGIN
                    PROVISIONAL = 0;
                    EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'ANALISIS DE CARTERA CON FECHA FACTURA O VENCIMIENTO') RETURNING_VALUES (FOV);
                    if (FOV = 'FECHA') then
                       DIAS = FECHA - FECDOC;
                    ELSE
                      DIAS = FECHA - VENCE;
                    DISPONIBLE = DISPONIBLE - SALDO;
                    SELECT TIDO_NOMCORTO FROM TIPO_DOCUMENTO WHERE TIDO_COD = :TIPO INTO :TIPONOM;
                    if (TIPO = 41) then
                        SELECT NDCL_DTOFMONTO, NDCL_FECHADTO, NDCL_TRM FROM NOTAS_DEBITO_CLIENTES
                            WHERE NDCL_ID = :ID INTO :DTOF, :FECDTO, :TRM;
                    if (TIPO = 42) then
                        SELECT 0, :FECDOC, 1 FROM NOTAS_CREDITO_CLIENTES
                            WHERE NCCL_ID = :ID INTO :DTOF, :FECDTO, :TRM;
                    if (TIPO = 45) then
                        SELECT ANCL_DTOFMONTO, ANCL_DTOFECHA, ANCL_TRM FROM ANTICIPOS_CLIENTE
                            WHERE ANCL_ID = :ID INTO :DTOF, :FECDTO, :TRM;
                    if (TIPO = 31) then
                        SELECT FACT_DTOFMONTO, FACT_DTOFFECHA, FACT_TRM FROM FACTURAS
                            WHERE FACT_ID = :ID INTO :DTOF, :FECDTO, :TRM;
                    if (TIPO = 33) then
                        SELECT 0, :FECDOC, 1 FROM devoluciones_ventas
                            WHERE DEVT_ID = :ID INTO :DTOF, :FECDTO, :TRM;
                    if ((MONEDA <> 0) AND (TRM <> 0)) then
                        DTOF = DTOF / TRM;
                    if (DTOF IS NULL) then
                        DTOF = 0;
                    if (DTOF <> 0) then
                        BEGIN
                        SELECT SUM(RCDE_DTOF), MAX(RECA_TRM) FROM RECIBOS_CAJA_DETALLE D, RECIBOS_CAJA R
                            WHERE R.reca_id = D.reca_id AND RCDE_IDDOC = :ID AND RCDE_TIPODOC = :TIPO
                            INTO :DTOAPL, :TRM;
                        if (DTOAPL IS NULL) then
                            DTOAPL = 0;
                        if ((MONEDA <> 0) AND (TRM <> 1)) then
                            DTOAPL = DTOAPL / TRM;
                        DTOF = DTOF - DTOAPL;
                        /* SI YA SE VENCIO DEJELO EN CERO */
                        if (FECDTO < FECHA) then
                            DTOF = 0;
                        END
                    if (MONEDA = 0) then
                        SELECT SUM(SDCA_RTFTE - SDCA_ABRTFTE), SUM(SDCA_RTIVA - SDCA_ABRTIVA), SUM(SDCA_RTICA - SDCA_ABRTICA)
                            FROM SALDOS_DOC_CARTERA WHERE SDCA_TIPOREF = :TIPO AND SDCA_IDREF = :ID
                            INTO :RTFTE, :RTIVA, :RTICA;
                    ELSE
                        SELECT SUM((SDCA_RTFTE - SDCA_ABRTFTE)/SDCA_TRM), SUM((SDCA_RTIVA - SDCA_ABRTIVA)/SDCA_TRM), SUM((SDCA_RTICA - SDCA_ABRTICA)/SDCA_TRM)
                            FROM SALDOS_DOC_CARTERA WHERE SDCA_TIPOREF = :TIPO AND SDCA_IDREF = :ID
                            INTO :RTFTE, :RTIVA, :RTICA;
                    if (RTFTE IS NULL) then
                        RTFTE = 0;
                    if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) THEN
                        BEGIN
                        if (RTFTE > 0) then
                            RTFTE = 0;
                        END
                    ELSE
                        BEGIN
                        if (RTFTE < 0) then
                            RTFTE = 0;
                        END
                    if (RTIVA IS NULL) then
                        RTIVA = 0;
                    if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) THEN
                        BEGIN
                        if (RTIVA > 0) then
                            RTIVA = 0;
                        END
                    ELSE
                        BEGIN
                        if (RTIVA < 0) then
                            RTIVA = 0;
                        END
                    if (RTICA IS NULL) then
                        RTICA = 0;
                    if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) THEN
                        BEGIN
                        if (RTICA > 0) then
                            RTICA = 0;
                        END
                    ELSE
                        BEGIN
                        if (RTICA < 0) then
                            RTICA = 0;
                        END
                    if (FAUTORET <= FECDOC) then
                        RTFTE = 0;
                    /* SI TIENE NOTA AGREGUELA */
                    SELECT MAX(NOCL_ID) FROM NOTAS_CLIENTES WHERE TERC_NIT = :NIT AND CLSU_COD = :SUCURSAL AND NOCL_TIPODOC = :TIPO AND NOCL_IDDOC = :ID INTO :IDNOTA;
                    if (IDNOTA IS NOT NULL) then
                        BEGIN
                        SELECT cast(NOCL_FECHA as char(10)), NOCL_TEXTO FROM NOTAS_CLIENTES
                            WHERE NOCL_ID = :IDNOTA INTO :FECNOTA, :AUXNOTA;
                        if (STRLEN(AUXNOTA) < 244) then
                            NOTA = FECNOTA || ':' || AUXNOTA;
                        ELSE
                            NOTA = AUXNOTA;
                        END
                    else
                        NOTA = '';
                    SUSPEND;
                    END  /* SALDO <> 0 */
                END  /* NO ANTICIPO */
            END  /* FOR */
        /* AGREGUE LOS RECIBOS PROVISIONALES CON SIGNO NEGATIVO */
        FOR SELECT 65, MAX(P.RCPR_ID), MAX(PREF_PRE), MAX(RCPR_NUMERO), MAX(RCPR_FECHA), MAX(RCPR_CONC), SUM(RPDE_ABONO * -1), SUM(RPDE_RTFTE*-1), SUM(RPDE_RTIVA*-1), SUM(RPDE_RTICA*-1), MAX(RCPR_TRM)
            FROM RECIBO_PROVISIONAL P, recibo_provisional_detalle D
            WHERE P.rcpr_id = D.rcpr_id AND P.TERC_NIT = :NIT AND RCPR_FECHA <= :FECHA AND RCPR_ANULADO = 'N' AND
            ((RCPR_FECCRUCE IS NULL) or (RCPR_FECCRUCE > :FECHA)) AND RPDE_SUCURSAL = :SUCURSAL AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY P.rcpr_id
            INTO :TIPO, :ID, :PREFIJO, :NUMERO, :FECDOC, :CONCEPTO, :PROVISIONAL, :rtfte,  :RTIVA, :RTICA, :TRM
            DO
            BEGIN
            if ((MONEDA <> 0) AND (TRM <> 0)) then
                PROVISIONAL = PROVISIONAL / TRM;
            if (:descnt_prov = 'NO') then
              SALDO = 0;
            else
              SALDO = :PROVISIONAL;
            SELECT TIDO_NOMCORTO FROM TIPO_DOCUMENTO WHERE TIDO_COD = :TIPO INTO :TIPONOM;
            /* CALCULE EL VENCIMIENTO DEL ULTIMO DOCUMENTO POSFECHADO */
            SELECT MAX(RPPA_FECHA) FROM recibo_provisional_pago WHERE RCPR_ID = :ID INTO :VENCE;
            DIAS = VENCE - FECHA;
            SUSPEND;
            END
        END
    if (AGRUPA = 'C') then
        BEGIN
        FOR SELECT DISTINCT COBR_COD FROM MOVIMIENTO_CLIENTES
            WHERE TERC_NIT = :NIT AND MVCL_SUCURSAL = :SUCURSAL AND MVCL_FECHA <= :FECHA AND
            MVCL_ABONO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            INTO :codcobr
            DO
            BEGIN
            OK = 'N';
            if (GRPINI = '') then
                BEGIN
                if ((CODCOBR IS NULL) or (CODCOBR >= :GRPINI AND CODCOBR <= :GRPFIN)) then
                    OK = 'S';
                END
            ELSE
                if (CODCOBR >= :GRPINI AND CODCOBR <= :GRPFIN) then
                    OK = 'S';
            if (OK = 'S') then
                BEGIN
                SELECT COBR_NOM FROM COBRADORES  WHERE COBR_COD = :CODCOBR INTO :NOMCOBR;
                /* BUSQUE EN SALDOS_DOC_CARTERA LOS QUE TENGAN SALDO > 0 */
                FOR SELECT MVCL_TIPOREF, MVCL_IDREF, MVCL_PREFREF, MVCL_NUMREF, MVCL_FECHA, MVCL_VENCE, MVCL_CONC
                    FROM MOVIMIENTO_CLIENTES WHERE TERC_NIT = :NIT AND MVCL_SUCURSAL = :SUCURSAL AND MVCL_FECHA <= :FECHA AND
                    MVCL_ABONO = 'N' AND COBR_COD = :codcobr AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) AND
                    ((:MONEDA = 0) or (MVCL_TRM <> 1))
                    INTO :TIPO, :ID, :PREFIJO, :NUMERO, :FECDOC, :VENCE, :CONCEPTO
                    DO
                    BEGIN
                    if ((inclanti = 'SI') or (TIPO <> 45)) then
                        BEGIN
                        EXECUTE PROCEDURE saldo_doc_cartera(TIPO, ID, FECHA, MONEDA) returning_values (SALDO);
                        if (SALDO <> 0) then
                            BEGIN
                            PROVISIONAL = 0;
                            EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'ANALISIS DE CARTERA CON FECHA FACTURA O VENCIMIENTO') RETURNING_VALUES (FOV);
                            if (FOV = 'FECHA') then
                               DIAS = FECHA - FECDOC;
                            ELSE
                              DIAS = FECHA - VENCE;
                            DISPONIBLE = DISPONIBLE - SALDO;
                            SELECT TIDO_NOMCORTO FROM TIPO_DOCUMENTO WHERE TIDO_COD = :TIPO INTO :TIPONOM;
                            if (TIPO = 41) then
                                SELECT NDCL_DTOFMONTO, NDCL_FECHADTO, NDCL_TRM FROM NOTAS_DEBITO_CLIENTES
                                    WHERE NDCL_ID = :ID INTO :DTOF, :FECDTO, :TRM;
                            if (TIPO = 42) then
                                SELECT 0, :FECDOC, 1 FROM NOTAS_CREDITO_CLIENTES
                                    WHERE NCCL_ID = :ID INTO :DTOF, :FECDTO, :TRM;
                            if (TIPO = 45) then
                                SELECT ANCL_DTOFMONTO, ANCL_DTOFECHA, ANCL_TRM FROM ANTICIPOS_CLIENTE
                                    WHERE ANCL_ID = :ID INTO :DTOF, :FECDTO, :TRM;
                            if (TIPO = 31) then
                                SELECT FACT_DTOFMONTO, FACT_DTOFFECHA, FACT_TRM FROM FACTURAS
                                    WHERE FACT_ID = :ID INTO :DTOF, :FECDTO, :TRM;
                            if (TIPO = 33) then
                                SELECT 0, :FECDOC, 1 FROM devoluciones_ventas
                                    WHERE DEVT_ID = :ID INTO :DTOF, :FECDTO, :TRM;
                            if (DTOF IS NULL) then
                                DTOF = 0;
                            if ((MONEDA <> 0) AND (TRM <> 0)) then
                                DTOF = DTOF / TRM;
                            if (DTOF <> 0) then
                                BEGIN
                                SELECT SUM(RCDE_DTOF) FROM RECIBOS_CAJA_DETALLE WHERE RCDE_IDDOC = :ID AND RCDE_TIPODOC = :TIPO INTO :DTOAPL;
                                if (DTOAPL IS NULL) then
                                    DTOAPL = 0;
                                DTOF = DTOF - DTOAPL;
                                /* SI YA SE VENCIO DEJELO EN CERO */
                                if (FECDTO < FECHA) then
                                    DTOF = 0;
                                END
                            SELECT SUM(SDCA_RTFTE - SDCA_ABRTFTE), SUM(SDCA_RTIVA - SDCA_ABRTIVA), SUM(SDCA_RTICA - SDCA_ABRTICA)
                                FROM SALDOS_DOC_CARTERA WHERE SDCA_TIPOREF = :TIPO AND SDCA_IDREF = :ID INTO :RTFTE, :RTIVA, :RTICA;
                            if (RTFTE IS NULL) then
                                RTFTE = 0;
                            if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) THEN
                                BEGIN
                                if (RTFTE > 0) then
                                    RTFTE = 0;
                                END
                            ELSE
                                BEGIN
                                if (RTFTE < 0) then
                                    RTFTE = 0;
                                END
                            if (FAUTORET <= FECDOC) then
                                RTFTE = 0;
                            if (RTIVA IS NULL) then
                                RTIVA = 0;
                            if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) THEN
                                BEGIN
                                if (RTIVA > 0) then
                                    RTIVA = 0;
                                END
                            ELSE
                                BEGIN
                                if (RTIVA < 0) then
                                    RTIVA = 0;
                                END
                            if (RTICA IS NULL) then
                                RTICA = 0;
                            if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) THEN
                                BEGIN
                                if (RTICA > 0) then
                                    RTICA = 0;
                                END
                            ELSE
                                BEGIN
                                if (RTICA < 0) then
                                    RTICA = 0;
                                END
                            /* SI TIENE NOTA AGREGUELA */
                            SELECT MAX(NOCL_FECHA) FROM NOTAS_CLIENTES WHERE TERC_NIT = :NIT AND CLSU_COD = :SUCURSAL AND NOCL_TIPODOC = :TIPO AND NOCL_IDDOC = :ID INTO :FECDTO;
                            if (FECDTO IS NOT NULL) then
                                BEGIN
                                SELECT cast(NOCL_FECHA as char(10)), NOCL_TEXTO FROM NOTAS_CLIENTES
                                    WHERE NOCL_ID = :IDNOTA INTO :FECNOTA, :AUXNOTA;
                                if (STRLEN(AUXNOTA) < 244) then
                                    NOTA = FECNOTA || ':' || AUXNOTA;
                                ELSE
                                    NOTA = AUXNOTA;
                                END
                            else
                                NOTA = '';
                            SUSPEND;
                            END  /* SALDO <> 0 */
                        END  /* NO ANTICIPO */
                    END  /* FOR */
                /* AGREGUE LOS RECIBOS PROVISIONALES CON SIGNO NEGATIVO */
                FOR SELECT 65, MAX(P.RCPR_ID), MAX(PREF_PRE), MAX(RCPR_NUMERO), MAX(RCPR_FECHA), MAX(RCPR_CONC), SUM(RPDE_ABONO * -1), SUM(RPDE_RTFTE*-1), SUM(RPDE_RTIVA*-1), SUM(RPDE_RTICA*-1), MAX(RCPR_TRM)
                    FROM RECIBO_PROVISIONAL P, recibo_provisional_detalle D
                    WHERE P.rcpr_id = D.rcpr_id AND P.TERC_NIT = :NIT AND P.VEND_COD = :codcobr AND RCPR_FECHA <= :FECHA AND RCPR_ANULADO = 'N' AND
                    ((RCPR_FECCRUCE IS NULL) or (RCPR_FECCRUCE > :FECHA)) AND RPDE_SUCURSAL = :SUCURSAL AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                    GROUP BY P.rcpr_id
                    INTO :TIPO, :ID, :PREFIJO, :NUMERO, :FECDOC, :CONCEPTO, :PROVISIONAL, :rtfte,  :RTIVA, :RTICA, :TRM
                    DO
                    BEGIN
                    if ((MONEDA <> 0) AND (TRM <> 0)) then
                        PROVISIONAL = PROVISIONAL / TRM;
                    if (:descnt_prov = 'NO') then
                      SALDO = 0;
                    else
                      SALDO = :PROVISIONAL;
                    SELECT TIDO_NOMCORTO FROM TIPO_DOCUMENTO WHERE TIDO_COD = :TIPO INTO :TIPONOM;
                    /* CALCULE EL VENCIMIENTO DEL ULTIMO DOCUMENTO POSFECHADO */
                    SELECT MAX(RPPA_FECHA) FROM recibo_provisional_pago WHERE RCPR_ID = :ID INTO :VENCE;
                    DIAS = VENCE - FECHA;
                    SUSPEND;
                    END
                END /* ok */
            END  /* FOR COBR */
        END  /* AGRUPA = C */
    END  /* FOR NIT */
END
^

SET TERM ; ^


/* 2009/01/05d  NO INLCUIA LAS DEVOLUCIONES DE CHEQUES */

SET TERM ^ ;

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

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

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

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

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

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

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

FOR SELECT R.reca_id, PREF_PRE, RECA_NUMERO, RECA_FECHA, RECA_CONC, TERC_NIT, RCDE_ABONO+RCDE_DTOF, RCDE_RTFTE, RCDE_RTIVA, RCDE_RTICA, D.rcde_sucursal, R.cobr_cod
    FROM recibos_caja_detalle D, recibos_caja R
    WHERE R.reca_id = D.reca_id AND R.reca_id <> 0 AND RECA_ANULADO = 'N' AND TERC_NIT >= :cliini AND TERC_NIT <= :clifin
    ORDER BY RECA_FECHA
    INTO :IDR, :PREF, :NUMERO, :FECHA, :CONC, :NIT, :MONTO, :RTFTE, :RTIVA, :RTICA, :sucursal, :cobr
    DO
    BEGIN
    EXISTE = 'N';
    SELECT 'S' FROM MOVIMIENTO_CLIENTES WHERE MVCL_TIPOREF = 61 AND MVCL_IDREF = :IDR AND MVCL_SUCURSAL = :sucursal INTO :EXISTE;
    if (EXISTE = 'S') then
        begin
        UPDATE movimiento_clientes
            SET MVCL_MONTO = MVCL_MONTO + :MONTO,
                MVCL_RTEFTE = MVCL_RTEFTE + :rtfte,
                MVCL_RTEIVA = MVCL_RTEIVA + :rtiva,
                MVCL_RTEICA = MVCL_RTEICA + :rtica
            WHERE MVCL_TIPOREF = 61 AND MVCL_IDREF = :IDR;
        end
    ELSE
        INSERT INTO MOVIMIENTO_CLIENTES (MVCL_ID, TERC_NIT, MVCL_TIPOREF, MVCL_IDREF, MVCL_FECHA, MVCL_VENCE, MVCL_CONC, MVCL_MONTO, MVCL_RTEFTE, MVCL_RTEIVA, MVCL_RTEICA, MVCL_DEBITO, MVCL_ABONO, MVCL_PREFREF, MVCL_NUMREF, MVCL_SUCURSAL, COBR_COD)
            VALUES (GEN_ID(ID_MOVCLI, 1), :NIT, 61, :ID, :FECHA, :FECHA, :CONC, :MONTO, :RTFTE, :RTIVA, :RTICA, 'N', 'S', :pref, :numero, :sucursal, :cobr);
    END
END
^

SET TERM ; ^

/* 2009/01/06  GENERE EL CAMPO CONSUMIDO DESDE LA BD */

SET TERM ^ ;

CREATE OR ALTER PROCEDURE IMPR_REMISION(
    ID INTEGER)
RETURNS (
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    NIT VARCHAR(20),
    NOMTERCERO VARCHAR(60),
    VENDEDOR INTEGER,
    NOMVENDEDOR VARCHAR(60),
    PUNTOVTA INTEGER,
    NOMPUNTOVTA VARCHAR(30),
    CODBODEGA VARCHAR(2),
    NOMBODEGA VARCHAR(30),
    COTIZACION VARCHAR(30),
    PEDIDO VARCHAR(30),
    FACTURA VARCHAR(30),
    SUBTOTAL NUMERIC(18,2),
    IVAMONTO NUMERIC(18,2),
    TOTALFAC NUMERIC(18,2),
    DESPACHO VARCHAR(255),
    TRANSPORTADOR VARCHAR(60),
    OBS BLOB SUB_TYPE 1 SEGMENT SIZE 80,
    ITEM INTEGER,
    ARTICULO VARCHAR(15),
    CODBAR VARCHAR(15),
    ARTIDES VARCHAR(60),
    CANT NUMERIC(18,4),
    LOTE VARCHAR(15),
    VLOTE DATE,
    UNIDAD VARCHAR(8),
    CAJAS NUMERIC(18,4),
    DEVUELTO NUMERIC(18,4),
    CONSUMIDO NUMERIC(18,4),
    LISTAPR INTEGER,
    REFITEM VARCHAR(60),
    BODITEM VARCHAR(2),
    STAND VARCHAR(15),
    PRUNIT NUMERIC(18,2),
    DTOITPORC NUMERIC(9,2),
    DTOITMONTO NUMERIC(18,2),
    SUBTOTALITEM NUMERIC(18,2),
    PRNETOSINIVA NUMERIC(18,2),
    PRNETO NUMERIC(18,2),
    IVAPORC NUMERIC(9,2),
    IVAITMONTO NUMERIC(18,2),
    CONSUMO NUMERIC(18,2),
    TOTAL NUMERIC(18,2),
    CODIGOCL VARCHAR(20),
    ZONACOD VARCHAR(2),
    ZONANOM VARCHAR(60),
    DV CHAR(1),
    DIRECCION VARCHAR(60),
    CIUDAD VARCHAR(40),
    TELEFONO VARCHAR(40),
    CONTACTO VARCHAR(60),
    FAX VARCHAR(25),
    GRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    SUBGRUPO VARCHAR(3),
    NOMSUBG VARCHAR(30),
    MARCA VARCHAR(3),
    NOMMARCA VARCHAR(30),
    PESO NUMERIC(9,4),
    ANCHO NUMERIC(18,4),
    ALTO NUMERIC(18,4),
    LARGO NUMERIC(18,4),
    SUMA1 NUMERIC(18,2),
    SUMA2 NUMERIC(18,2),
    SUMA3 NUMERIC(18,2),
    IVA1 NUMERIC(18,2),
    IVA2 NUMERIC(18,2),
    IVA3 NUMERIC(18,2),
    SUMAEX NUMERIC(18,2),
    SUMAGR NUMERIC(18,2),
    TOTCAJAS NUMERIC(18,2),
    OBSITEM BLOB SUB_TYPE 1 SEGMENT SIZE 80)
AS
DECLARE VARIABLE IMPTOS CHAR(1);
DECLARE VARIABLE TARIFA INTEGER;
declare variable ORDENCOD CHAR(2);
declare variable SUCUR VARCHAR(10);
declare variable FACTOR NUMERIC(18,4);
BEGIN
  /*  */
  SELECT F.PREF_PRE, REVT_NUMERO, REVT_FECHA, F.BODE_COD, BODE_NOM, F.TERC_NIT, REVT_NOMTERC, F.VEND_COD, VEND_NOMBRE, F.PTVT_ID, PTVT_NOM,
    REVT_COTIZACI, REVT_PEDIDO, REVT_FACTURA, REVT_IVAINC,
    REVT_IVAMONTO, REVT_TOTAL, REVT_DESPACHO, REVT_TRANSP,
    TERC_CONTACTO, TERC_FAX, TERC_DV, REVT_OBS, REVT_SUCURSAL
    FROM REMISIONES_VENTA F, BODEGA B, VENDEDORES V, PUNTO_VENTA P, TERCEROS T
    WHERE F.BODE_COD = B.BODE_COD AND F.VEND_COD = V.VEND_COD AND F.PTVT_ID = P.PTVT_ID AND F.TERC_NIT = T.TERC_NIT AND F.REVT_ID = :ID
    into :PREF, :NUMERO, :FECHA, :CODBODEGA, :NOMBODEGA, :NIT, :NOMTERCERO, :VENDEDOR, :NOMVENDEDOR, :PUNTOVTA, :NOMPUNTOVTA,
    :COTIZACION, :PEDIDO, :FACTURA, :IMPTOS,
    :IVAMONTO, :TOTALFAC, :DESPACHO, :transportador, 
    :CONTACTO, :FAX, :DV, :OBS, :SUCUR;
  SUBTOTAL = TOTALFAC - IVAMONTO;

  SELECT CLIE_COD, C.ZONA_COD, ZONA_NOM
    FROM CLIENTES C, ZONAS Z
    WHERE TERC_NIT = :NIT AND C.ZONA_COD = Z.ZONA_COD
    INTO :CODIGOCL, :ZONACOD, :ZONANOM;
  SELECT CLSU_DIR, CLSU_CIUDAD, CLSU_TEL FROM CLIENTE_SUCURSALES WHERE TERC_NIT = :NIT AND CLCU_COD = :SUCUR
    INTO :DIRECCION, :CIUDAD, :TELEFONO;
    
  SUMAEX = 0;
  SUMA1 = 0;
  SUMA2 = 0;
  SUMA3 = 0;
  IVA1 = 0;
  IVA2 = 0;
  IVA3 = 0;
  ITEM = 0;
  totcajas = 0;
  EXECUTE PROCEDURE lee_configuracion ('FACTURACION','DOCUMENTOS','ORDENAR ITEMS POR CODIGO DE ARTICULO') returning_values (:ORDENCOD);
  if (ORDENCOD = 'SI') then
    BEGIN
    FOR SELECT D.ARTI_COD, RVDE_CODBAR, SUBSTR(RVDE_DESC,1,60), RVDE_CANT, RVDE_UNIDAD, BODE_COD, RVDE_LOTE, LIPR_COD, RVDE_PRUNIT, RVDE_DTOPORC, RVDE_DTOMONTO, RVDE_IVAPORC, RVDE_IVAMONTO, RVDE_CONSUMO, RVDE_TOTAL, RVDE_REFERENCIA,
        GRUP_COD, SUBG_COD, MARC_COD, ARTI_PESO, ARTI_ANCHO, ARTI_ALTO, ARTI_LARGO, TAIV_COD, RVDE_DEVUELTO, RVDE_OBS, RVDE_CAJAS, RVDE_FACTOR
        FROM REMISIONES_VENTA_DETALLE D, ARTICULO A
        WHERE D.ARTI_COD = A.ARTI_COD AND D.REVT_ID = :ID
        ORDER BY RVDE_CODBAR
        INTO :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :BODITEM, :LOTE, :LISTAPR, :PRUNIT, :DTOITPORC, :DTOITMONTO, :IVAPORC, :IVAITMONTO, :CONSUMO, :TOTAL, :refitem,
            :GRUPO, :SUBGRUPO, :MARCA, :PESO, :ANCHO, :ALTO, :LARGO, :TARIFA, :DEVUELTO, :obsitem, :CAJAS, :FACTOR
        DO
        BEGIN
        if (ARTICULO = CODBAR) then
            SELECT FIRST 1 COBA_COD FROM barras_articulo WHERE ARTI_COD = :articulo INTO :CODBAR;
        SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :GRUPO INTO NOMGRUPO;
        SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :MARCA INTO NOMMARCA;
        SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :SUBGRUPO AND GRUP_COD = :GRUPO INTO :NOMSUBG;
        SELECT LOTE_VENCE FROM LOTES WHERE LOTE_NRO = :lote AND ARTI_COD = :ARTICULO AND BODE_COD = :boditem INTO :vlote;
        CONSUMIDO = cant * factor - devuelto;
        ITEM = ITEM + 1;
        PRNETO = PRUNIT - DTOITMONTO;
        if (IVAPORC = 0) then
            SUMAEX = SUMAEX + TOTAL;
        if (TARIFA = 1) then
            BEGIN
            SUMA1 = SUMA1 + TOTAL - IVAITMONTO;
            IVA1 = IVA1 + IVAITMONTO;
            END
        if (TARIFA = 2) then
            BEGIN
            SUMA2 = SUMA2 + TOTAL - IVAITMONTO;
            IVA2 = IVA2 + IVAITMONTO;
            END
        if (TARIFA = 3) then
            BEGIN
            SUMA3 = SUMA3 + TOTAL - IVAITMONTO;
            IVA3 = IVA3 + IVAITMONTO;
            END
        SUMAGR = SUMA1 + SUMA2 + SUMA3;

        if (IMPTOS = 'N') then
            TOTAL = TOTAL - IVAITMONTO;
        ELSE
           BEGIN
           PRNETOSINIVA = PRUNIT / (1 + ivaporc/100);
           SUBTOTALITEM = PRNETOSINIVA * :CANT;
           END
        totcajas = totcajas + cajas;
        SELECT STAND_COD FROM STANDS WHERE ARTI_COD = :ARTICULO AND STAND_BODEGA = :boditem INTO :stand;
        SUSPEND;
        END
    END
ELSE
    BEGIN
    FOR SELECT RVDE_ITEM, D.ARTI_COD, RVDE_CODBAR, SUBSTR(RVDE_DESC,1,60), RVDE_CANT, RVDE_UNIDAD, BODE_COD, RVDE_LOTE, LIPR_COD, RVDE_PRUNIT, RVDE_DTOPORC, RVDE_DTOMONTO, RVDE_IVAPORC, RVDE_IVAMONTO, RVDE_CONSUMO, RVDE_TOTAL, RVDE_REFERENCIA,
        GRUP_COD, SUBG_COD, MARC_COD, ARTI_PESO, ARTI_ANCHO, ARTI_ALTO, ARTI_LARGO, TAIV_COD, RVDE_DEVUELTO, RVDE_OBS, RVDE_CAJAS, RVDE_FACTOR
        FROM REMISIONES_VENTA_DETALLE D, ARTICULO A
        WHERE D.ARTI_COD = A.ARTI_COD AND D.REVT_ID = :ID
        ORDER BY RVDE_ITEM
        INTO :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :BODITEM, :LOTE, :LISTAPR, :PRUNIT, :DTOITPORC, :DTOITMONTO, :IVAPORC, :IVAITMONTO, :CONSUMO, :TOTAL, :refitem,
            :GRUPO, :SUBGRUPO, :MARCA, :PESO, :ANCHO, :ALTO, :LARGO, :TARIFA, :DEVUELTO, :obsitem, :CAJAS, :FACTOR
        DO
        BEGIN
        SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :GRUPO INTO NOMGRUPO;
        SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :MARCA INTO NOMMARCA;
        SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :SUBGRUPO AND GRUP_COD = :GRUPO INTO :NOMSUBG;
        SELECT LOTE_VENCE FROM LOTES WHERE LOTE_NRO = :lote AND ARTI_COD = :ARTICULO AND BODE_COD = :boditem INTO :vlote;
        CONSUMIDO = cant * factor - devuelto;
        ITEM = ITEM + 1;
        PRNETO = PRUNIT - DTOITMONTO;
        if (IVAPORC = 0) then
            SUMAEX = SUMAEX + TOTAL;
        if (TARIFA = 1) then
            BEGIN
            SUMA1 = SUMA1 + TOTAL - IVAITMONTO;
            IVA1 = IVA1 + IVAITMONTO;
            END
        if (TARIFA = 2) then
            BEGIN
            SUMA2 = SUMA2 + TOTAL - IVAITMONTO;
            IVA2 = IVA2 + IVAITMONTO;
            END
        if (TARIFA = 3) then
            BEGIN
            SUMA3 = SUMA3 + TOTAL - IVAITMONTO;
            IVA3 = IVA3 + IVAITMONTO;
            END
        SUMAGR = SUMA1 + SUMA2 + SUMA3;
        SUBTOTALITEM = TOTAL - IVAITMONTO;
        if (IMPTOS = 'N') then
            TOTAL = TOTAL - IVAITMONTO;
        ELSE
           BEGIN
             PRNETOSINIVA = PRUNIT / (1 + ivaporc/100);
             SUBTOTALITEM = PRNETOSINIVA * :CANT;
           END
        totcajas = totcajas + cajas;
        SELECT STAND_COD FROM STANDS WHERE ARTI_COD = :ARTICULO AND STAND_BODEGA = :boditem INTO :stand;
        SUSPEND;
        END
    END
END
^

SET TERM ; ^

/* 2009/01/06B MEJORAS DE VELOCIDAD */

CREATE INDEX MOVIMIENTO_CLIENTES_IDX3 ON MOVIMIENTO_CLIENTES (MVCL_PREFREF);
CREATE INDEX MOVIMIENTO_CLIENTES_IDX4 ON MOVIMIENTO_CLIENTES (MVCL_NUMREF);

CREATE INDEX MOVIMIENTO_PROVEEDOR_IDX1 ON MOVIMIENTO_PROVEEDOR (MVPR_PREFIJO);
CREATE INDEX MOVIMIENTO_PROVEEDOR_IDX3 ON MOVIMIENTO_PROVEEDOR (MVPR_TIPOREF);
CREATE INDEX MOVIMIENTO_PROVEEDOR_IDX2 ON MOVIMIENTO_PROVEEDOR (MVPR_NUMERO);

SET TERM ^ ;

CREATE OR ALTER PROCEDURE IDS_CORTE(
    FECHA DATE,
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    OPER INTEGER,
    FECHAREC DATE,
    PREFREC VARCHAR(4),
    NUMREC VARCHAR(6),
    ID INTEGER,
    ITEM INTEGER,
    TIPO INTEGER,
    DOC INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    IDNUEVO INTEGER)
AS
begin
OPER = 61;
FOR SELECT RECA_FECHA, PREF_PRE, RECA_NUMERO, R.RECA_ID, RCDE_ITEM, RCDE_TIPODOC, RCDE_IDDOC, RCDE_PREFIJO, RCDE_NUMERO
    FROM RECIBOS_CAJA_DETALLE D, RECIBOS_CAJA R
    WHERE R.reca_id = d.reca_id AND RECA_FECHA >= :FECINI AND RECA_FECHA <= :FECFIN AND NOT EXISTS(SELECT MVCL_ID FROM movimiento_clientes WHERE MVCL_TIPOREF = D.rcde_tipodoc AND MVCL_IDREF = D.rcde_iddoc)
    ORDER BY r.RECA_ID, RCDE_ITEM
    INTO :FECHAREC, :PREFREC, :NUMREC, :ID, :ITEM, :TIPO, :DOC, :PREF, :NUMERO
    DO
    BEGIN
    /* BUSQUELO COMO NOTA */
    if ((TIPO = 31) or (TIPO = 41) or (TIPO = 77)) then
        BEGIN
        IDNUEVO = 0;
        SELECT MVCL_IDREF FROM movimiento_clientes
        WHERE MVCL_PREFREF = :PREF AND MVCL_NUMREF = :NUMERO AND MVCL_TIPOREF = 41 AND MVCL_FECHA <= :FECHA
        INTO :IDNUEVO;
        if ((IDNUEVO <> 0) AND (IDNUEVO IS NOT NULL)) then
            UPDATE RECIBOS_CAJA_DETALLE SET RCDE_TIPODOC = 41, RCDE_IDDOC = :IDNUEVO, RCDE_PREFIJO = :PREF WHERE RECA_ID = :ID AND RCDE_ITEM = :ITEM;
        else
            begin
            if (STRLEN(PREF) < 4) then
                PREF = 'C' || pref;
            SELECT MVCL_IDREF FROM movimiento_clientes WHERE MVCL_PREFREF = :PREF AND MVCL_NUMREF = :NUMERO AND MVCL_TIPOREF = 41 AND MVCL_FECHA <= :FECHA INTO :IDNUEVO;
            if ((IDNUEVO <> 0) AND (IDNUEVO IS NOT NULL)) then
                UPDATE RECIBOS_CAJA_DETALLE SET RCDE_TIPODOC = 41, RCDE_IDDOC = :IDNUEVO, RCDE_PREFIJO = :PREF WHERE RECA_ID = :ID AND RCDE_ITEM = :ITEM;
            end
        end
    ELSE
        BEGIN
        IDNUEVO = 0;
        SELECT MVCL_IDREF FROM movimiento_clientes WHERE MVCL_PREFREF = :PREF AND MVCL_NUMREF = :NUMERO AND MVCL_TIPOREF = 42 AND MVCL_FECHA <= :FECHA INTO :IDNUEVO;
        if ((IDNUEVO <> 0) AND (IDNUEVO IS NOT NULL)) then
            UPDATE RECIBOS_CAJA_DETALLE SET RCDE_TIPODOC = 42, RCDE_IDDOC = :IDNUEVO, RCDE_PREFIJO = :PREF  WHERE RECA_ID = :ID AND RCDE_ITEM = :ITEM;
        else
            begin
            if (STRLEN(PREF) < 4) then
                PREF = 'C' || pref;
            SELECT MVCL_IDREF FROM movimiento_clientes WHERE MVCL_PREFREF = :PREF AND MVCL_NUMREF = :NUMERO AND MVCL_TIPOREF = 42 AND MVCL_FECHA <= :FECHA INTO :IDNUEVO;
            if ((IDNUEVO <> 0) AND (IDNUEVO IS NOT NULL)) then
                UPDATE RECIBOS_CAJA_DETALLE SET RCDE_TIPODOC = 42, RCDE_IDDOC = :IDNUEVO, RCDE_PREFIJO = :PREF  WHERE RECA_ID = :ID AND RCDE_ITEM = :ITEM;
            end
        END
    suspend;
    END
OPER = 43;
FOR SELECT APCL_FECHA, PREF_PRE, APCL_NUMERO, A.APCL_ID, ACDE_ITEM, ACDE_TIPODOC, ACDE_IDDOC, ACDE_PREFIJO, ACDE_NUMERO
    FROM aplicacion_cliente_detalle d, aplicacion_cliente a where a.apcl_id = d.apcl_id AND APCL_FECHA >= :FECINI AND APCL_FECHA <= :FECFIN AND NOT EXISTS(SELECT MVCL_ID FROM movimiento_clientes WHERE MVCL_TIPOREF = D.acde_tipodoc AND MVCL_IDREF = D.acde_iddoc)
    ORDER BY a.APCL_ID, ACDE_ITEM
    INTO :FECHAREC, :PREFREC, :NUMREC, :ID, :ITEM, :TIPO, :DOC, :PREF, :NUMERO
    DO
    BEGIN
    /* BUSQUELO COMO NOTA */
    if ((TIPO = 31) or (TIPO = 41) or (TIPO = 77)) then
        BEGIN
        IDNUEVO = 0;
        SELECT MVCL_IDREF FROM movimiento_clientes WHERE MVCL_PREFREF = :PREF AND MVCL_NUMREF = :NUMERO AND MVCL_TIPOREF = 41 AND MVCL_FECHA <= :FECHA INTO :IDNUEVO;
        if ((IDNUEVO <> 0) AND (IDNUEVO IS NOT NULL)) then
            UPDATE aplicacion_cliente_detalle SET ACDE_TIPODOC = 41, ACDE_IDDOC = :IDNUEVO, ACDE_PREFIJO = :PREF  WHERE APCL_ID = :ID AND ACDE_ITEM = :ITEM;
        else
            begin
            if (STRLEN(PREF) < 4) then
                PREF = 'C' || pref;
            SELECT MVCL_IDREF FROM movimiento_clientes WHERE MVCL_PREFREF = :PREF AND MVCL_NUMREF = :NUMERO AND MVCL_TIPOREF = 41 AND MVCL_FECHA <= :FECHA INTO :IDNUEVO;
            if ((IDNUEVO <> 0) AND (IDNUEVO IS NOT NULL)) then
                UPDATE aplicacion_cliente_detalle SET ACDE_TIPODOC = 41, ACDE_IDDOC = :IDNUEVO, ACDE_PREFIJO = :PREF  WHERE APCL_ID = :ID AND ACDE_ITEM = :ITEM;
            end
        end
    ELSE
        BEGIN
        IDNUEVO = 0;
        SELECT MVCL_IDREF FROM movimiento_clientes WHERE MVCL_PREFREF = :PREF AND MVCL_NUMREF = :NUMERO AND MVCL_TIPOREF = 42 AND MVCL_FECHA <= :FECHA INTO :IDNUEVO;
        if ((IDNUEVO <> 0) AND (IDNUEVO IS NOT NULL)) then
            UPDATE aplicacion_cliente_detalle SET ACDE_TIPODOC = 42, ACDE_IDDOC = :IDNUEVO, ACDE_PREFIJO = :PREF  WHERE APCL_ID = :ID AND ACDE_ITEM = :ITEM;
        else
            begin
            if (STRLEN(PREF) < 4) then
                PREF = 'C' || pref;
            SELECT MVCL_IDREF FROM movimiento_clientes WHERE MVCL_PREFREF = :PREF AND MVCL_NUMREF = :NUMERO AND MVCL_TIPOREF = 42 AND MVCL_FECHA <= :FECHA INTO :IDNUEVO;
            if ((IDNUEVO <> 0) AND (IDNUEVO IS NOT NULL)) then
                UPDATE aplicacion_cliente_detalle SET ACDE_TIPODOC = 42, ACDE_IDDOC = :IDNUEVO, ACDE_PREFIJO = :PREF  WHERE APCL_ID = :ID AND ACDE_ITEM = :ITEM;
            end
        END
    suspend;
    END
OPER = 62;
FOR SELECT EGRE_FECHA, PREF_PRE, EGRE_NUMERO, E.EGRE_ID, EGDE_ITEM, EGDE_TIPODOC, EGDE_IDDOC, EGDE_PREFIJO, EGDE_NUMERO
    FROM EGRESOS_DETALLE D, EGRESOS E WHERE D.egre_id = E.egre_id AND EGRE_FECHA >= :FECINI AND EGRE_FECHA <= :FECFIN AND NOT EXISTS(SELECT MVPR_ID FROM movimiento_proveedor WHERE MVPR_TIPOREF = D.egde_tipodoc AND MVPR_IDREF = D.egde_iddoc)
    ORDER BY E.EGRE_ID, EGDE_ITEM
    INTO :FECHAREC, :PREFREC, :NUMREC, :ID, :ITEM, :TIPO, :DOC, :PREF, :NUMERO
    DO
    BEGIN
    /* BUSQUELO COMO NOTA */
    if ((TIPO = 21) or (TIPO = 51)) then
        BEGIN
        IDNUEVO = 0;
        SELECT MVPR_IDREF FROM movimiento_proveedor WHERE MVPR_PREFIJO = :PREF AND MVPR_NUMERO = :NUMERO AND MVPR_TIPOREF = 51 AND MVPR_FECHA <= :FECHA INTO :IDNUEVO;
        if ((IDNUEVO <> 0) AND (IDNUEVO IS NOT NULL)) then
            UPDATE EGRESOS_DETALLE SET EGDE_TIPODOC = 51, EGDE_IDDOC = :IDNUEVO, EGDE_PREFIJO = :PREF  WHERE EGRE_ID = :ID AND EGDE_ITEM = :ITEM;
        else
            begin
            if (STRLEN(PREF) < 4) then
                PREF = 'C' || pref;
            SELECT MVPR_IDREF FROM movimiento_proveedor WHERE MVPR_PREFIJO = :PREF AND MVPR_NUMERO = :NUMERO AND MVPR_TIPOREF = 51 AND MVPR_FECHA <= :FECHA INTO :IDNUEVO;
            if ((IDNUEVO <> 0) AND (IDNUEVO IS NOT NULL)) then
                UPDATE EGRESOS_DETALLE SET EGDE_TIPODOC = 51, EGDE_IDDOC = :IDNUEVO, EGDE_PREFIJO = :PREF  WHERE EGRE_ID = :ID AND EGDE_ITEM = :ITEM;
            end
        end
    ELSE
        BEGIN
        IDNUEVO = 0;
        SELECT MVPR_IDREF FROM movimiento_proveedor WHERE MVPR_PREFIJO = :PREF AND MVPR_NUMERO = :NUMERO AND MVPR_TIPOREF = 52 AND MVPR_FECHA <= :FECHA INTO :IDNUEVO;
        if ((IDNUEVO <> 0) AND (IDNUEVO IS NOT NULL)) then
            UPDATE EGRESOS_DETALLE SET EGDE_TIPODOC = 52, EGDE_IDDOC = :IDNUEVO, EGDE_PREFIJO = :PREF  WHERE EGRE_ID = :ID AND EGDE_ITEM = :ITEM;
        else
            begin
            if (STRLEN(PREF) < 4) then
                PREF = 'C' || pref;
            SELECT MVPR_IDREF FROM movimiento_proveedor WHERE MVPR_PREFIJO = :PREF AND MVPR_NUMERO = :NUMERO AND MVPR_TIPOREF = 52 AND MVPR_FECHA <= :FECHA INTO :IDNUEVO;
            if ((IDNUEVO <> 0) AND (IDNUEVO IS NOT NULL)) then
                UPDATE EGRESOS_DETALLE SET EGDE_TIPODOC = 52, EGDE_IDDOC = :IDNUEVO, EGDE_PREFIJO = :PREF  WHERE EGRE_ID = :ID AND EGDE_ITEM = :ITEM;
            end
        END
    suspend;
    END
OPER = 53;
FOR SELECT APPR_FECHA, pref_pre, APPR_numero, A.APPR_ID, APPD_ITEM, APPD_TIPODOC, APPD_IDDOC, APPD_PREFIJO, APPD_NUMERO
    FROM aplicacion_proveedor_detalle d, aplicacion_provedor a where a.appr_id = d.appr_id AND APPR_FECHA >= :FECINI AND APPR_FECHA <= :FECFIN AND NOT EXISTS(SELECT MVPR_ID FROM movimiento_proveedor WHERE MVPR_TIPOREF = D.appd_tipodoc AND MVPR_IDREF = D.appd_iddoc)
    ORDER BY a.APPR_ID, APPD_ITEM
    INTO :FECHAREC, :PREFREC, :NUMREC, :ID, :ITEM, :TIPO, :DOC, :PREF, :NUMERO
    DO
    BEGIN
    /* BUSQUELO COMO NOTA */
    if ((TIPO = 21) or (TIPO = 51)) then
        BEGIN
        IDNUEVO = 0;
        SELECT MVPR_IDREF FROM movimiento_proveedor WHERE MVPR_PREFIJO = :PREF AND MVPR_NUMERO = :NUMERO AND MVPR_TIPOREF = 51 AND MVPR_FECHA <= :FECHA INTO :IDNUEVO;
        if ((IDNUEVO <> 0) AND (IDNUEVO IS NOT NULL)) then
            UPDATE aplicacion_proveedor_detalle SET APPD_TIPODOC = 51, APPD_IDDOC = :IDNUEVO, APPD_PREFIJO = :PREF  WHERE APPR_ID = :ID AND APPD_ITEM = :ITEM;
        else
            begin
            if (STRLEN(PREF) < 4) then
                PREF = 'C' || pref;
            SELECT MVPR_IDREF FROM movimiento_proveedor WHERE MVPR_PREFIJO = :PREF AND MVPR_NUMERO = :NUMERO AND MVPR_TIPOREF = 51 AND MVPR_FECHA <= :FECHA INTO :IDNUEVO;
            if ((IDNUEVO <> 0) AND (IDNUEVO IS NOT NULL)) then
                UPDATE aplicacion_proveedor_detalle SET APPD_TIPODOC = 51, APPD_IDDOC = :IDNUEVO, APPD_PREFIJO = :PREF  WHERE APPR_ID = :ID AND APPD_ITEM = :ITEM;
            end
        end
    ELSE
        BEGIN
        IDNUEVO = 0;
        SELECT MVPR_IDREF FROM movimiento_proveedor WHERE MVPR_PREFIJO = :PREF AND MVPR_NUMERO = :NUMERO AND MVPR_TIPOREF = 52 AND MVPR_FECHA <= :FECHA INTO :IDNUEVO;
        if ((IDNUEVO <> 0) AND (IDNUEVO IS NOT NULL)) then
            UPDATE aplicacion_proveedor_detalle SET APPD_TIPODOC = 52, APPD_IDDOC = :IDNUEVO, APPD_PREFIJO = :PREF  WHERE APPR_ID = :ID AND APPD_ITEM = :ITEM;
        else
            begin
            if (STRLEN(PREF) < 4) then
                PREF = 'C' || pref;
            SELECT MVPR_IDREF FROM movimiento_proveedor WHERE MVPR_PREFIJO = :PREF AND MVPR_NUMERO = :NUMERO AND MVPR_TIPOREF = 52 AND MVPR_FECHA <= :FECHA INTO :IDNUEVO;
            if ((IDNUEVO <> 0) AND (IDNUEVO IS NOT NULL)) then
                UPDATE aplicacion_proveedor_detalle SET APPD_TIPODOC = 52, APPD_IDDOC = :IDNUEVO, APPD_PREFIJO = :PREF  WHERE APPR_ID = :ID AND APPD_ITEM = :ITEM;
            end
        END
    suspend;
    END
end
^

SET TERM ; ^

CREATE INDEX COSTOS_IDX1 ON COSTOS (COST_IDMOV);

SET TERM ^ ;

CREATE OR ALTER PROCEDURE REP_KARDEX_ARTICULO(
    DETALLE CHAR(1),
    FECINI DATE,
    FECFIN DATE,
    ARTINI VARCHAR(20),
    ARTFIN VARCHAR(20),
    GRPINI VARCHAR(2),
    GRPFIN VARCHAR(2),
    ORDEN CHAR(1),
    BODEGA VARCHAR(2))
RETURNS (
    CODIGO VARCHAR(15),
    NOMBRE VARCHAR(60),
    UNIDAD VARCHAR(8),
    CODGRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    CODSUBG VARCHAR(3),
    NOMSUBG VARCHAR(30),
    CODMARC VARCHAR(3),
    NOMMARC VARCHAR(30),
    CODBOD VARCHAR(2),
    SALDOINI NUMERIC(18,4),
    COSTOINI NUMERIC(18,2),
    ENTRADAS NUMERIC(18,4),
    COSTOENT NUMERIC(18,2),
    SALIDAS NUMERIC(18,4),
    COSTOSAL NUMERIC(18,2),
    SALDOFIN NUMERIC(18,4),
    COSTOFIN NUMERIC(18,2),
    TIPODOC VARCHAR(8),
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    CONCEPTO VARCHAR(60),
    NIT VARCHAR(20),
    CONS INTEGER,
    CANFINAL NUMERIC(18,4),
    COSFINAL NUMERIC(18,2))
AS
DECLARE VARIABLE ENTRADA CHAR(1);
DECLARE VARIABLE CANT NUMERIC(18,4);
DECLARE VARIABLE COSTO NUMERIC(18,2);
DECLARE VARIABLE CODINI VARCHAR(20);
DECLARE VARIABLE CODFIN VARCHAR(20);
DECLARE VARIABLE DESINI VARCHAR(20);
DECLARE VARIABLE DESFIN VARCHAR(20);
BEGIN
if (ORDEN = 'C') then
    BEGIN
    CODINI = ARTINI;
    CODFIN = ARTFIN;
    DESINI = '';
    DESFIN = 'zz';
    END
ELSE
    BEGIN
    DESINI = ARTINI;
    DESFIN = ARTFIN;
    CODINI = '';
    CODFIN = 'zz';
    END
  FOR
    SELECT ARTI_COD, ARTI_DES, ARTI_UNIDAD, A.GRUP_COD, A.SUBG_COD, A.MARC_COD
      FROM ARTICULO A
      WHERE ARTI_COD >= :CODINI AND ARTI_COD <= :CODFIN AND A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :GRPFIN AND ARTI_DES >= :DESINI AND ARTI_DES <= :DESFIN AND A.ESAR_COD <> 'I'
      INTO :CODIGO, :NOMBRE, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
      DO
        BEGIN
        NOMMARC = '';
        NOMSUBG = '';
        SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
        SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
        SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
        if (BODEGA = '') then
            BEGIN
            EXECUTE PROCEDURE SALDO_INICIAL_TOTAL_INV(CODIGO, FECINI) returning_values (:SALDOINI);
            EXECUTE PROCEDURE VALOR_INICIAL_INVENTARIO(CODIGO, FECINI) returning_values (COSTOINI);
            END
        ELSE
            BEGIN
            EXECUTE PROCEDURE SALDO_INICIAL_INVENTARIO(CODIGO, FECINI, :BODEGA) returning_values (SALDOINI);
            EXECUTE PROCEDURE COSTO_PROMEDIO(CODIGO, FECINI-1) returning_values (COSTOINI);
            COSTOINI = COSTOINI * saldoini;
            END
        if (DETALLE = 'N') then
            BEGIN
            /* SUME LAS ENTRADAS */
            if (BODEGA = '') then
              SELECT SUM(COST_ENTC), SUM(COST_ENTP), SUM(COST_SALC), SUM(COST_SALP) FROM COSTOS
                WHERE (COST_FECHA >= :FECINI) AND (COST_FECHA <= :FECFIN) AND (ARTI_COD = :codigo)
                INTO :ENTRADAS, :COSTOENT, :SALIDAS, :COSTOSAL;
            ELSE
              SELECT SUM(COST_ENTC), SUM(COST_ENTP), SUM(COST_SALC), SUM(COST_SALP)
                FROM COSTOS C, MOVIMIENTO_ARTICULO M
                WHERE (COST_FECHA >= :FECINI) AND (COST_FECHA <= :FECFIN) AND (C.ARTI_COD = :codigo) AND C.cost_idmov = M.mvar_cons AND BODE_COD = :BODEGA
                INTO :ENTRADAS, :COSTOENT, :SALIDAS, :COSTOSAL;

            if (ENTRADAS IS NULL) then
              ENTRADAS = 0;
            if (COSTOENT IS NULL) then
              COSTOENT = 0;
            if (SALIDAS IS NULL) then
              SALIDAS = 0;
            if (COSTOSAL IS NULL) then
              COSTOSAL = 0;
            SALDOFIN = SALDOINI + ENTRADAS - SALIDAS;
            COSTOFIN = COSTOINI + COSTOENT - COSTOSAL;
            if (BODEGA = '') then
                BEGIN
                EXECUTE PROCEDURE SALDO_INICIAL_TOTAL_INV(CODIGO, fecfin+1) returning_values (canfinal);
                EXECUTE PROCEDURE VALOR_INICIAL_INVENTARIO(CODIGO, FECFIN+1) returning_values (cosfinal);
                END
            ELSE
                BEGIN
                EXECUTE PROCEDURE SALDO_INICIAL_INVENTARIO(CODIGO, FECFIN+1, :BODEGA) returning_values (CANFINAL);
                EXECUTE PROCEDURE COSTO_PROMEDIO(CODIGO, FECFIN+1) returning_values (COSFINAL);
                COSFINAL = COSFINAL * CANFINAL;
                END
            SUSPEND;
            END
        ELSE
            BEGIN
            SALDOFIN = SALDOINI;
            COSTOFIN = COSTOINI;
            COSTOENT = 0;
            COSTOSAL = 0;
            FOR SELECT TIDO_NOMCORTO, MVAR_ENTRADA, MVAR_PREF, MVAR_NUMERO, MVAR_CANT, MVAR_COSTO, MVAR_CONC, MVAR_FECHA, M.TERC_NIT, MVAR_CONS, BODE_COD, COST_SALDOP, COST_SALDOC
                FROM MOVIMIENTO_ARTICULO M, TIPO_DOCUMENTO TD, COSTOS C
                WHERE TD.TIDO_COD = MVAR_TIPODOC AND (MVAR_FECHA >= :FECINI) AND (MVAR_FECHA <= :FECFIN) AND (MVAR_TIPODOC <> 13) AND (m.ARTI_COD = :CODIGO) AND M.mvar_cons = C.cost_idmov
                ORDER BY MVAR_FECHA, MVAR_CONS
                INTO :TIPODOC, :ENTRADA, :PREFIJO, :NUMERO, :ENTRADAS, :COSTOENT, :CONCEPTO, :FECHA, :NIT, :CONS, :CODBOD, :costo, :cant
                DO
                    BEGIN
                    if (ENTRADA = 'S') then
                        BEGIN
                        SALIDAS = 0;
                        SALDOFIN = SALDOFIN + ENTRADAS;
                        COSTOFIN = COSTOFIN + (ENTRADAS * COSTOENT);
                        if (CANT > 0) then
                            COSTOSAL = COSTO / CANT;
                        else
                            COSTOSAL = 0;
                        end
                    ELSE
                        BEGIN
                        SALIDAS = ENTRADAS;
                        ENTRADAS = 0;
                        if (CANT > 0) then
                            COSTOSAL = COSTO / CANT;
                        else
                            COSTOSAL = 0;
                        SALDOFIN = SALDOFIN - SALIDAS;
                        COSTOFIN = COSTOFIN - (SALIDAS * costosal);
                        END
                    SUSPEND;
                    END
            END
        END
END
^

SET TERM ; ^


/* 2009/01/07 CAUSACION DE DIFERENCIA EN CAMBIO */

CREATE EXCEPTION CUENTA_NO_ES_NORMAL 'La cuenta debe ser de tipo normal';
SET TERM ^ ;

create procedure CAUSA_DIFERENCIA_CAMBIO (
    FECHA DATE,
    TIPOCOMP VARCHAR(3),
    PREFCONT VARCHAR(4),
    NUMCONT VARCHAR(6),
    TRM NUMERIC(18,2),
    NIT VARCHAR(20),
    PROY VARCHAR(4),
    CENTRO VARCHAR(4),
    CTACARTERA VARCHAR(20))
returns (
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(6),
    DIFERENCIA NUMERIC(18,2)
    )
as
declare variable DESC_RTES char(2);
declare variable ID INTEGER;
declare variable OK INTEGER;
declare variable I INTEGER;
declare variable FECAUX CHAR(8);
declare variable CTADIFD VARCHAR(20);
declare variable CTADIFC VARCHAR(20);
declare variable TIPOCUEN CHAR(1);
declare variable AUTORET varchar(10);
declare variable FAUTORET date;
declare variable TIPO INTEGER;
declare variable IDDOC INTEGER;
declare variable SALDO NUMERIC(18,2);
declare variable AB1 NUMERIC(18,2);
declare variable TRMDOC NUMERIC(18,2);
begin
execute procedure LEE_CONFIGURACION('CARTERA', 'SALDOS', 'FECHA AUTORETENEDOR NO DESCONTAR RETENCIONES DEL SALDO PERO SI CONTABILIZARLAS') returning_values (AUTORET);
if (AUTORET <> '') then
    FAUTORET = cast(AUTORET as date);
else
    FAUTORET = '9999/12/31';
EXECUTE PROCEDURE FECHA_A_CONTA(:FECHA) returning_values (:FECAUX);

execute procedure lee_configuracion('GENERAL','GENERAL','CUENTA DE INGRESO POR DIFERENCIA EN CAMBIO PARA OPERACIONES EN OTRA MONEDA') returning_values (:ctadifd);
execute procedure lee_configuracion('GENERAL','GENERAL','CUENTA DE GASTO POR DIFERENCIA EN CAMBIO PARA OPERACIONES EN OTRA MONEDA') returning_values (:ctadifc);
EXECUTE PROCEDURE VALIDE_CUENTA_C (ctadifd) RETURNING_VALUES (:OK);
IF (OK = 0) THEN
    SELECT CUEN_TIPO FROM CUENTAS WHERE CUEN_COD = :ctadifd INTO :TIPOCUEN;
ELSE
    exception cuenta_no_existe 'LA CUENTA ' || ctadifd || ' NO EXISTE.';
if (TIPOCUEN <> 'N') then
    exception cuenta_no_es_normal;
EXECUTE PROCEDURE VALIDE_CUENTA_C (ctadifc) RETURNING_VALUES (:OK);
IF (OK = 0) THEN
    SELECT CUEN_TIPO FROM CUENTAS WHERE CUEN_COD = :ctadifc INTO :TIPOCUEN;
ELSE
    exception cuenta_no_existe 'LA CUENTA ' || ctadifc || ' NO EXISTE.';
if (TIPOCUEN <> 'N') then
    exception cuenta_no_es_normal;

execute procedure LEE_CONFIGURACION('CARTERA', 'SALDOS', 'DESCONTAR RETENCIONES POR CAUSACION') returning_values (DESC_RTES);
execute procedure cambie_id_comproba returning_values(ID);
insert into comprobante_encabezado (tico_cod, prco_pref, enco_consec, enco_numero, enco_fecha, enco_concepto, enco_refer, enco_tiporef, enco_idref)
    values (:tipocomp, :prefcont, :ID, :numcont, :fecaux, 'AJUSTE POR DIFERENCIA EN CAMBIO', '', 0, 0);
I = 1;
if (DESC_RTES = 'SI') then
    BEGIN
    for select max(SDCA_TIPOREF), max(SDCA_IDREF), sum((SDCA_MONTO-SDCA_ABONO-SDCA_RTFTE-SDCA_RTIVA-SDCA_RTICA)/SDCA_TRM)
        from saldos_doc_cartera where (SDCA_FECHA <= :FECHA) and (SDCA_FECHA < :FAUTORET) and SDCA_TRM <> 1
        group by sdca_tiporef, sdca_idref into :TIPO, :IDDOC, :SALDO
        do
        begin
        if (SALDO <> 0) then
            begin
            select sum(SDCA_ABONO/SDCA_TRM)
                from saldos_doc_cartera where SDCA_TIPOREF = :TIPO and SDCA_IDREF = :iddoc and (SDCA_FECHA <= :FECHA) and (SDCA_FECHA >= :FAUTORET)
                into :AB1;
            if (AB1 is null) then
                AB1 = 0;
            SALDO = SALDO - AB1;
            if (SALDO <> 0) then
                begin
                select MVCL_PREFREF, MVCL_NUMREF, MVCL_TRM
                    from MOVIMIENTO_CLIENTES where mvcl_tiporef = :tipo and mvcl_idref = :iddoc
                    into :PREFIJO, :NUMERO, :TRMDOC;
                diferencia = SALDO * (TRM - TRMDOC);
                if (diferencia > 0) then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:ID, :I, :ctadifd, 'AJUSTE POR DIFERENCIA EN CAMBIO', '', 0, :diferencia, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    I = I + 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 (:ID, :I, :ctacartera, 'AJUSTE POR DIFERENCIA EN CAMBIO', '', :diferencia, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    END
                else
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:ID, :I, :ctadifc, 'AJUSTE POR DIFERENCIA EN CAMBIO', '', ABS(:diferencia), 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    I = I + 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 (:ID, :I, :ctacartera, 'AJUSTE POR DIFERENCIA EN CAMBIO', '', 0, ABS(:diferencia), 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    END
                I = I + 1;
                UPDATE MOVIMIENTO_CLIENTES SET MVCL_TRM = :TRM where mvcl_tiporef = :tipo and mvcl_idref = :iddoc;
                suspend;
                end
            end
        end
    /* LAS DE DESPUES DE LA AUTORETENCION */
    for select max(SDCA_TIPOREF), max(SDCA_IDREF), sum((SDCA_MONTO-SDCA_ABONO-SDCA_RTIVA-SDCA_RTICA)/SDCA_TRM)
        from saldos_doc_cartera where (TERC_NIT = :nit) and (SDCA_FECHA <= :FECHA) and (SDCA_FECHA >= :FAUTORET) group by sdca_tiporef, sdca_idref
        into :TIPO, :ID, :SALDO
        do
        begin
        if (SALDO <> 0) then
            begin
            select MVCL_PREFREF, MVCL_NUMREF, MVCL_TRM
                from MOVIMIENTO_CLIENTES where mvcl_tiporef = :tipo and mvcl_idref = :id
                into :PREFIJO, :NUMERO, :TRMDOC;
            diferencia = SALDO * (TRM - TRMDOC);
            if (diferencia > 0) then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:ID, :I, :ctadifd, 'AJUSTE POR DIFERENCIA EN CAMBIO', '', 0, :diferencia, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                I = I + 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 (:ID, :I, :ctacartera, 'AJUSTE POR DIFERENCIA EN CAMBIO', '', :diferencia, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                END
            else
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:ID, :I, :ctadifc, 'AJUSTE POR DIFERENCIA EN CAMBIO', '', ABS(:diferencia), 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                I = I + 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 (:ID, :I, :ctacartera, 'AJUSTE POR DIFERENCIA EN CAMBIO', '', 0, ABS(:diferencia), 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                END
            I = I + 1;
            UPDATE MOVIMIENTO_CLIENTES SET MVCL_TRM = :TRM where mvcl_tiporef = :tipo and mvcl_idref = :iddoc;
            suspend;
            end
        end
     END
else
    BEGIN
    for select max(SDCA_TIPOREF), max(SDCA_IDREF), sum((SDCA_MONTO-SDCA_ABONO-SDCA_ABRTFTE-SDCA_ABRTIVA-SDCA_ABRTICA)/SDCA_TRM)
        from saldos_doc_cartera where (SDCA_FECHA <= :FECHA) and (SDCA_FECHA < :FAUTORET) and SDCA_TRM <> 1
        group by sdca_tiporef, sdca_idref
        into :TIPO, :ID, :SALDO
        do
        begin
        if (SALDO <> 0) then
            begin
            select MVCL_PREFREF, MVCL_NUMREF, MVCL_TRM
                from MOVIMIENTO_CLIENTES where mvcl_tiporef = :tipo and mvcl_idref = :id
                into :PREFIJO, :NUMERO, :TRMDOC;
            diferencia = SALDO * (TRM - TRMDOC);
            if (diferencia > 0) then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:ID, :I, :ctadifd, 'AJUSTE POR DIFERENCIA EN CAMBIO', '', 0, :diferencia, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                I = I + 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 (:ID, :I, :ctacartera, 'AJUSTE POR DIFERENCIA EN CAMBIO', '', :diferencia, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                END
            else
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:ID, :I, :ctadifc, 'AJUSTE POR DIFERENCIA EN CAMBIO', '', ABS(:diferencia), 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                I = I + 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 (:ID, :I, :ctacartera, 'AJUSTE POR DIFERENCIA EN CAMBIO', '', 0, ABS(:diferencia), 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                END
            I = I + 1;
            UPDATE MOVIMIENTO_CLIENTES SET MVCL_TRM = :TRM where mvcl_tiporef = :tipo and mvcl_idref = :iddoc;
            suspend;
            end
        end
    END
end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER PROCEDURE CARTERA_CLIENTE(
    NIT VARCHAR(20),
    FECHA DATE,
    SUCURSAL VARCHAR(10),
    MONEDA INTEGER,
    SOLOPESOS CHAR(1))
RETURNS (
    TIPO INTEGER,
    ID INTEGER,
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(6),
    CONCEPTO VARCHAR(60),
    SALDO NUMERIC(18,2),
    RTFTE NUMERIC(18,2),
    RTIVA NUMERIC(18,2),
    RTICA NUMERIC(18,2),
    DTOF NUMERIC(18,2),
    TIPONOM VARCHAR(8),
    VENCE DATE,
    FECDOC DATE,
    DIAS INTEGER,
    RECPROV_ID INTEGER,
    RECIPROV CHAR(1),
    NOTA VARCHAR(256),
    TRMDOC NUMERIC(18,2))
AS
declare variable FEC date;
declare variable DESC_RTES char(2);
declare variable DTOAPL numeric(18,2);
declare variable AB1 numeric(18,2);
declare variable AB2 numeric(18,2);
declare variable AB3 numeric(18,2);
declare variable AB4 numeric(18,2);
declare variable IDNOTA integer;
declare variable AUTORET varchar(10);
declare variable FAUTORET date;
begin
execute procedure LEE_CONFIGURACION('CARTERA', 'SALDOS', 'DESCONTAR RETENCIONES POR CAUSACION') returning_values (DESC_RTES);
execute procedure LEE_CONFIGURACION('CARTERA', 'SALDOS', 'FECHA AUTORETENEDOR NO DESCONTAR RETENCIONES DEL SALDO PERO SI CONTABILIZARLAS') returning_values (AUTORET);
if (AUTORET <> '') then
    FAUTORET = cast(AUTORET as date);
else
    FAUTORET = '9999/12/31';
/* LAS DE ANTES DE LA AUTORETENCION */
if (MONEDA = 0) then
  begin
  if (DESC_RTES = 'SI') then
    begin
    for select max(SDCA_TIPOREF), max(SDCA_IDREF), sum(SDCA_MONTO-SDCA_ABONO-SDCA_RTFTE-SDCA_RTIVA-SDCA_RTICA), sum(SDCA_RTFTE - SDCA_ABRTFTE), sum(SDCA_RTIVA - SDCA_ABRTIVA), sum(SDCA_RTICA - SDCA_ABRTICA)
        from saldos_doc_cartera where TERC_NIT = :nit and (SDCA_FECHA <= :FECHA) and (SDCA_FECHA < :FAUTORET)
        group by sdca_tiporef, sdca_idref into :TIPO, :ID, :SALDO, :RTFTE, :RTIVA, :RTICA
        do
        begin
        if (SALDO <> 0) then
            begin
            select sum(SDCA_ABONO), sum(SDCA_ABRTFTE), sum(SDCA_ABRTIVA), sum(SDCA_ABRTICA)
                from saldos_doc_cartera where SDCA_TIPOREF = :TIPO and SDCA_IDREF = :id and (SDCA_FECHA <= :FECHA) and (SDCA_FECHA >= :FAUTORET)
                into :AB1, :AB2, :AB3, :AB4;
            if (AB1 is null) then
                AB1 = 0;
            if (AB2 is null) then
                AB2 = 0;
            if (AB3 is null) then
                AB3 = 0;
            if (AB4 is null) then
                AB4 = 0;
            SALDO = SALDO - AB1;
            RTFTE = RTFTE - AB2;
            RTIVA = RTIVA - AB3;
            RTICA = RTICA - AB4;
            NUMERO = '';
            select MVCL_FECHA, MVCL_VENCE, MVCL_PREFREF, MVCL_NUMREF, MVCL_CONC, MVCL_TRM
              from MOVIMIENTO_CLIENTES where TERC_NIT = :NIT and mvcl_sucursal = :sucursal and MVCL_FECHA <= :FECHA and MVCL_ABONO = 'N' and mvcl_tiporef = :tipo and mvcl_idref = :id
              into :FECDOC, :VENCE, :PREFIJO, :NUMERO, :CONCEPTO, :TRMDOC;
            if ((NUMERO <> '') AND (SALDO <> 0)) then
              begin
              DIAS = (FECHA -VENCE );
              select TIDO_NOMCORTO from TIPO_DOCUMENTO where TIDO_COD = :TIPO into :TIPONOM;
              if (TIPO = 41) then
                select NDCL_DTOFMONTO, NDCL_FECHADTO from NOTAS_DEBITO_CLIENTES where NDCL_ID = :ID into :DTOF, :FEC;
              if (TIPO = 42) then
                select 0, NCCL_FECHA from NOTAS_CREDITO_CLIENTES where NCCL_ID = :ID into :DTOF, :FEC;
              if (TIPO = 45) then
                select ANCL_DTOFMONTO, ANCL_DTOFECHA from ANTICIPOS_CLIENTE where ANCL_ID = :ID into :DTOF, :FEC;
              if (TIPO = 31) then
                select FACT_DTOFMONTO, FACT_DTOFFECHA from FACTURAS where FACT_ID = :ID into :DTOF, :FEC;
              if (TIPO = 33) then
                select 0, :FECHA from devoluciones_ventas where DEVT_ID = :ID into :DTOF, :FEC;

              recprov_id = 0;
              select max(RCPR_ID) from recibo_provisional_detalle where RPDE_IDDOC = :ID and RPDE_TIPODOC = :TIPO and RPDE_ANULADO = 'N' into :recprov_id;
              if (recprov_id is null) then
                reciprov = 'N';
              else
                reciprov = 'S';
              if (FECHA > FEC) then
                DTOF = 0;
              if (DTOF is null) then
                DTOF = 0;
              if (DTOF <> 0) then
                begin
                select sum(RCDE_DTOF) from RECIBOS_CAJA_DETALLE where RCDE_IDDOC = :ID and RCDE_TIPODOC = :TIPO into :DTOAPL;
                if (DTOAPL is null) then
                    DTOAPL = 0;
                DTOF = DTOF - DTOAPL;
                end
              if (RTFTE is null) then
                RTFTE = 0;
              if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) then
                begin
                if (RTFTE > 0) then
                    RTFTE = 0;
                end
              else
                begin
                if (RTFTE < 0) then
                    RTFTE = 0;
                end

              if (RTIVA is null) then
                RTIVA = 0;
              if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) then
                begin
                if (RTIVA > 0) then
                    RTIVA = 0;
                end
              else
                begin
                if (RTIVA < 0) then
                    RTIVA = 0;
                end

              if (RTICA is null) then
                RTICA = 0;
              if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) then
                begin
                if (RTICA > 0) then
                    RTICA = 0;
                end
              else
                begin
                if (RTICA < 0) then
                    RTICA = 0;
                end

              /* SI TIENE NOTA AGREGUELA */
              select max(NOCL_ID) from NOTAS_CLIENTES where TERC_NIT = :NIT and CLSU_COD = :SUCURSAL and NOCL_TIPODOC = :TIPO and NOCL_IDDOC = :ID into :IDNOTA;
              if (IDNOTA is not null) then
                select NOCL_TEXTO from NOTAS_CLIENTES where NOCL_ID = :IDNOTA into :NOTA;
              else
                NOTA = '';
              if ((SOLOPESOS = 'N') or (TRMDOC = 1)) then
                suspend;
              end
            end
        end
    /* LAS DE DESPUES DE LA AUTORETENCION */
    for select max(SDCA_TIPOREF), max(SDCA_IDREF), sum(SDCA_MONTO-SDCA_ABONO-SDCA_RTIVA-SDCA_RTICA), 0, sum(SDCA_RTIVA - SDCA_ABRTIVA), sum(SDCA_RTICA - SDCA_ABRTICA)
        from saldos_doc_cartera where (TERC_NIT = :nit) and (SDCA_FECHA <= :FECHA) and (SDCA_FECHA >= :FAUTORET) group by sdca_tiporef, sdca_idref
        into :TIPO, :ID, :SALDO, :RTFTE, :RTIVA, :RTICA
        do
        begin
        if (SALDO <> 0) then
            begin
            NUMERO = '';
            select MVCL_FECHA, MVCL_VENCE, MVCL_PREFREF, MVCL_NUMREF, MVCL_CONC, MVCL_TRM
              from MOVIMIENTO_CLIENTES where TERC_NIT = :NIT and mvcl_sucursal = :sucursal and MVCL_FECHA <= :FECHA and MVCL_ABONO = 'N' and mvcl_tiporef = :tipo and mvcl_idref = :id
              into :FECDOC, :VENCE, :PREFIJO, :NUMERO, :CONCEPTO, :TRMDOC;
            if (NUMERO <> '') then
              begin
              DIAS = (FECHA -VENCE );
              select TIDO_NOMCORTO from TIPO_DOCUMENTO where TIDO_COD = :TIPO into :TIPONOM;
              if (TIPO = 41) then
                select NDCL_DTOFMONTO, NDCL_FECHADTO from NOTAS_DEBITO_CLIENTES where NDCL_ID = :ID into :DTOF, :FEC;
              if (TIPO = 42) then
                select 0, NCCL_FECHA from NOTAS_CREDITO_CLIENTES where NCCL_ID = :ID into :DTOF, :FEC;
              if (TIPO = 45) then
                select ANCL_DTOFMONTO, ANCL_DTOFECHA from ANTICIPOS_CLIENTE where ANCL_ID = :ID into :DTOF, :FEC;
              if (TIPO = 31) then
                select FACT_DTOFMONTO, FACT_DTOFFECHA from FACTURAS where FACT_ID = :ID into :DTOF, :FEC;
              if (TIPO = 33) then
                select 0, :FECHA from devoluciones_ventas where DEVT_ID = :ID into :DTOF, :FEC;

              recprov_id = 0;
              select max(RCPR_ID) from recibo_provisional_detalle where RPDE_IDDOC = :ID and RPDE_TIPODOC = :TIPO and RPDE_ANULADO = 'N' into :recprov_id;
              if (recprov_id is null) then
                reciprov = 'N';
              else
                reciprov = 'S';
              if (FECHA > FEC) then
                DTOF = 0;
              if (DTOF is null) then
                DTOF = 0;
              if (DTOF <> 0) then
                begin
                select sum(RCDE_DTOF) from RECIBOS_CAJA_DETALLE where RCDE_IDDOC = :ID and RCDE_TIPODOC = :TIPO into :DTOAPL;
                if (DTOAPL is null) then
                    DTOAPL = 0;
                DTOF = DTOF - DTOAPL;
                end

              if (RTIVA is null) then
                RTIVA = 0;
              if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) then
                begin
                if (RTIVA > 0) then
                    RTIVA = 0;
                end
              else
                begin
                if (RTIVA < 0) then
                    RTIVA = 0;
                end

              if (RTICA is null) then
                RTICA = 0;
              if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) then
                begin
                if (RTICA > 0) then
                    RTICA = 0;
                end
              else
                begin
                if (RTICA < 0) then
                    RTICA = 0;
                end

              /* SI TIENE NOTA AGREGUELA */
              select max(NOCL_ID) from NOTAS_CLIENTES where TERC_NIT = :NIT and CLSU_COD = :SUCURSAL and NOCL_TIPODOC = :TIPO and NOCL_IDDOC = :ID into :IDNOTA;
              if (IDNOTA is not null) then
                select NOCL_TEXTO from NOTAS_CLIENTES where NOCL_ID = :IDNOTA into :NOTA;
              else
                NOTA = '';
              if ((SOLOPESOS = 'N') or (TRMDOC = 1)) then
                suspend;
              end
            end
        end
    end
  else
    begin
    for select max(SDCA_TIPOREF), max(SDCA_IDREF), sum(SDCA_MONTO-SDCA_ABONO-SDCA_ABRTFTE-SDCA_ABRTIVA-SDCA_ABRTICA), sum(SDCA_RTFTE - SDCA_ABRTFTE), sum(SDCA_RTIVA - SDCA_ABRTIVA), sum(SDCA_RTICA - SDCA_ABRTICA)
        from saldos_doc_cartera where (TERC_NIT = :nit) and (SDCA_FECHA <= :FECHA) and (SDCA_FECHA < :FAUTORET) group by sdca_tiporef, sdca_idref
        into :TIPO, :ID, :SALDO, :RTFTE, :RTIVA, :RTICA
        do
        begin
        if (SALDO <> 0) then
            begin
            select sum(SDCA_ABONO+SDCA_ABRTIVA+SDCA_ABRTICA), sum(SDCA_ABRTFTE), sum(SDCA_ABRTIVA), sum(SDCA_ABRTICA)
                from saldos_doc_cartera where SDCA_TIPOREF = :TIPO and SDCA_IDREF = :id and (SDCA_FECHA <= :FECHA) and (SDCA_FECHA >= :FAUTORET)
                into :AB1, :AB2, :AB3, :AB4;
            if (AB1 is null) then
                AB1 = 0;
            if (AB2 is null) then
                AB2 = 0;
            if (AB3 is null) then
                AB3 = 0;
            if (AB4 is null) then
                AB4 = 0;
            SALDO = SALDO - AB1;
            RTFTE = RTFTE - AB2;
            RTIVA = RTIVA - AB3;
            RTICA = RTICA - AB4;
            NUMERO = '';
            select MVCL_FECHA, MVCL_VENCE, MVCL_PREFREF, MVCL_NUMREF, MVCL_CONC, MVCL_TRM
              from MOVIMIENTO_CLIENTES where TERC_NIT = :NIT and mvcl_sucursal = :sucursal and MVCL_FECHA <= :FECHA and MVCL_ABONO = 'N' and mvcl_tiporef = :tipo and mvcl_idref = :id
              into :FECDOC, :VENCE, :PREFIJO, :NUMERO, :CONCEPTO, :TRMDOC;
            if ((NUMERO <> '') AND (SALDO <> 0)) then
              begin
              DIAS = (FECHA -VENCE );
              select TIDO_NOMCORTO from TIPO_DOCUMENTO where TIDO_COD = :TIPO into :TIPONOM;
              if (TIPO = 41) then
                select NDCL_DTOFMONTO, NDCL_FECHADTO from NOTAS_DEBITO_CLIENTES where NDCL_ID = :ID into :DTOF, :FEC;
              if (TIPO = 42) then
                select 0, NCCL_FECHA from NOTAS_CREDITO_CLIENTES where NCCL_ID = :ID into :DTOF, :FEC;
              if (TIPO = 45) then
                select ANCL_DTOFMONTO, ANCL_DTOFECHA from ANTICIPOS_CLIENTE where ANCL_ID = :ID into :DTOF, :FEC;
              if (TIPO = 31) then
                select FACT_DTOFMONTO, FACT_DTOFFECHA from FACTURAS where FACT_ID = :ID into :DTOF, :FEC;
              if (TIPO = 33) then
                select 0, :FECHA from devoluciones_ventas where DEVT_ID = :ID into :DTOF, :FEC;

              recprov_id = 0;
              select max(RCPR_ID) from recibo_provisional_detalle where RPDE_IDDOC = :ID and RPDE_TIPODOC = :TIPO and RPDE_ANULADO = 'N' into :recprov_id;
              if (recprov_id is null) then
                reciprov = 'N';
              else
                reciprov = 'S';
              if (FECHA > FEC) then
                DTOF = 0;
              if (DTOF is null) then
                DTOF = 0;
              if (DTOF <> 0) then
                begin
                select sum(RCDE_DTOF) from RECIBOS_CAJA_DETALLE where RCDE_IDDOC = :ID and RCDE_TIPODOC = :TIPO into :DTOAPL;
                if (DTOAPL is null) then
                    DTOAPL = 0;
                DTOF = DTOF - DTOAPL;
                end
              if (RTFTE is null) then
                RTFTE = 0;
              if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) then
                begin
                if (RTFTE > 0) then
                    RTFTE = 0;
                end
              else
                begin
                if (RTFTE < 0) then
                    RTFTE = 0;
                end

              if (RTIVA is null) then
                RTIVA = 0;
              if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) then
                begin
                if (RTIVA > 0) then
                    RTIVA = 0;
                end
              else
                begin
                if (RTIVA < 0) then
                    RTIVA = 0;
                end

              if (RTICA is null) then
                RTICA = 0;
              if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) then
                begin
                if (RTICA > 0) then
                    RTICA = 0;
                end
              else
                begin
                if (RTICA < 0) then
                    RTICA = 0;
                end

              /* SI TIENE NOTA AGREGUELA */
              select max(NOCL_ID) from NOTAS_CLIENTES where TERC_NIT = :NIT and CLSU_COD = :SUCURSAL and NOCL_TIPODOC = :TIPO and NOCL_IDDOC = :ID into :IDNOTA;
              if (IDNOTA is not null) then
                select NOCL_TEXTO from NOTAS_CLIENTES where NOCL_ID = :IDNOTA into :NOTA;
              else
                NOTA = '';
              if ((SOLOPESOS = 'N') or (TRMDOC = 1)) then
                suspend;
              end
            end
        end
    /* DESPUES DE LA AUTORETENCION */
    for select max(SDCA_TIPOREF), max(SDCA_IDREF), sum(SDCA_MONTO-SDCA_ABONO-SDCA_ABRTIVA-SDCA_ABRTICA), sum(SDCA_RTFTE - SDCA_ABRTFTE), sum(SDCA_RTIVA - SDCA_ABRTIVA), sum(SDCA_RTICA - SDCA_ABRTICA)
        from saldos_doc_cartera where (TERC_NIT = :nit) and (SDCA_FECHA <= :FECHA) and (SDCA_FECHA >= :FAUTORET) group by sdca_tiporef, sdca_idref
        into :TIPO, :ID, :SALDO, :RTFTE, :RTIVA, :RTICA
        do
        begin
        if (SALDO <> 0) then
            begin
            NUMERO = '';
            select MVCL_FECHA, MVCL_VENCE, MVCL_PREFREF, MVCL_NUMREF, MVCL_CONC, MVCL_TRM
              from MOVIMIENTO_CLIENTES where TERC_NIT = :NIT and mvcl_sucursal = :sucursal and MVCL_FECHA <= :FECHA and MVCL_ABONO = 'N' and mvcl_tiporef = :tipo and mvcl_idref = :id
              into :FECDOC, :VENCE, :PREFIJO, :NUMERO, :CONCEPTO, :TRMDOC;
            if (NUMERO <> '') then
              begin
              DIAS = (FECHA -VENCE );
              select TIDO_NOMCORTO from TIPO_DOCUMENTO where TIDO_COD = :TIPO into :TIPONOM;
              if (TIPO = 41) then
                select NDCL_DTOFMONTO, NDCL_FECHADTO from NOTAS_DEBITO_CLIENTES where NDCL_ID = :ID into :DTOF, :FEC;
              if (TIPO = 42) then
                select 0, NCCL_FECHA from NOTAS_CREDITO_CLIENTES where NCCL_ID = :ID into :DTOF, :FEC;
              if (TIPO = 45) then
                select ANCL_DTOFMONTO, ANCL_DTOFECHA from ANTICIPOS_CLIENTE where ANCL_ID = :ID into :DTOF, :FEC;
              if (TIPO = 31) then
                select FACT_DTOFMONTO, FACT_DTOFFECHA from FACTURAS where FACT_ID = :ID into :DTOF, :FEC;
              if (TIPO = 33) then
                select 0, :FECHA from devoluciones_ventas where DEVT_ID = :ID into :DTOF, :FEC;

              recprov_id = 0;
              select max(RCPR_ID) from recibo_provisional_detalle where RPDE_IDDOC = :ID and RPDE_TIPODOC = :TIPO and RPDE_ANULADO = 'N' into :recprov_id;
              if (recprov_id is null) then
                reciprov = 'N';
              else
                reciprov = 'S';
              if (FECHA > FEC) then
                DTOF = 0;
              if (DTOF is null) then
                DTOF = 0;
              if (DTOF <> 0) then
                begin
                select sum(RCDE_DTOF) from RECIBOS_CAJA_DETALLE where RCDE_IDDOC = :ID and RCDE_TIPODOC = :TIPO into :DTOAPL;
                if (DTOAPL is null) then
                    DTOAPL = 0;
                DTOF = DTOF - DTOAPL;
                end

              if (RTIVA is null) then
                RTIVA = 0;
              if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) then
                begin
                if (RTIVA > 0) then
                    RTIVA = 0;
                end
              else
                begin
                if (RTIVA < 0) then
                    RTIVA = 0;
                end

              if (RTICA is null) then
                RTICA = 0;
              if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) then
                begin
                if (RTICA > 0) then
                    RTICA = 0;
                end
              else
                begin
                if (RTICA < 0) then
                    RTICA = 0;
                end

              /* SI TIENE NOTA AGREGUELA */
              select max(NOCL_ID) from NOTAS_CLIENTES where TERC_NIT = :NIT and CLSU_COD = :SUCURSAL and NOCL_TIPODOC = :TIPO and NOCL_IDDOC = :ID into :IDNOTA;
              if (IDNOTA is not null) then
                select NOCL_TEXTO from NOTAS_CLIENTES where NOCL_ID = :IDNOTA into :NOTA;
              else
                NOTA = '';
              if ((SOLOPESOS = 'N') or (TRMDOC = 1)) then
                suspend;
              end
            end
        end
    end
  end
else
  begin
  if (DESC_RTES = 'SI') then
    begin
    for select max(SDCA_TIPOREF), max(SDCA_IDREF), sum((SDCA_MONTO-SDCA_ABONO-SDCA_RTFTE-SDCA_RTIVA-SDCA_RTICA)/SDCA_TRM), sum((SDCA_RTFTE-SDCA_ABRTFTE)/SDCA_TRM), sum((SDCA_RTIVA-SDCA_ABRTIVA)/SDCA_TRM), sum((SDCA_RTICA-SDCA_ABRTICA)/SDCA_TRM)
        from saldos_doc_cartera where TERC_NIT = :nit and (SDCA_FECHA <= :FECHA) and (SDCA_FECHA < :FAUTORET) and SDCA_TRM <> 1
        group by sdca_tiporef, sdca_idref into :TIPO, :ID, :SALDO, :RTFTE, :RTIVA, :RTICA
        do
        begin
        if (SALDO <> 0) then
            begin
            select sum(SDCA_ABONO/SDCA_TRM), sum(SDCA_ABRTFTE), sum(SDCA_ABRTIVA), sum(SDCA_ABRTICA)
                from saldos_doc_cartera where SDCA_TIPOREF = :TIPO and SDCA_IDREF = :id and (SDCA_FECHA <= :FECHA) and (SDCA_FECHA >= :FAUTORET)
                into :AB1, :AB2, :AB3, :AB4;
            if (AB1 is null) then
                AB1 = 0;
            if (AB2 is null) then
                AB2 = 0;
            if (AB3 is null) then
                AB3 = 0;
            if (AB4 is null) then
                AB4 = 0;
            SALDO = SALDO - AB1;
            RTFTE = RTFTE - AB2;
            RTIVA = RTIVA - AB3;
            RTICA = RTICA - AB4;
            NUMERO = '';
            select MVCL_FECHA, MVCL_VENCE, MVCL_PREFREF, MVCL_NUMREF, MVCL_CONC, MVCL_TRM
              from MOVIMIENTO_CLIENTES where TERC_NIT = :NIT and mvcl_sucursal = :sucursal and MVCL_FECHA <= :FECHA and MVCL_ABONO = 'N' and mvcl_tiporef = :tipo and mvcl_idref = :id
              into :FECDOC, :VENCE, :PREFIJO, :NUMERO, :CONCEPTO, :TRMDOC;
            if ((NUMERO <> '') AND (SALDO <> 0)) then
              begin
              DIAS = (FECHA -VENCE );
              select TIDO_NOMCORTO from TIPO_DOCUMENTO where TIDO_COD = :TIPO into :TIPONOM;
              if (TIPO = 41) then
                select NDCL_DTOFMONTO/NDCL_TRM, NDCL_FECHADTO from NOTAS_DEBITO_CLIENTES where NDCL_ID = :ID into :DTOF, :FEC;
              if (TIPO = 42) then
                select 0, NCCL_FECHA from NOTAS_CREDITO_CLIENTES where NCCL_ID = :ID into :DTOF, :FEC;
              if (TIPO = 45) then
                select ANCL_DTOFMONTO/ANCL_TRM, ANCL_DTOFECHA from ANTICIPOS_CLIENTE where ANCL_ID = :ID into :DTOF, :FEC;
              if (TIPO = 31) then
                select FACT_DTOFMONTO/FACT_TRM, FACT_DTOFFECHA from FACTURAS where FACT_ID = :ID into :DTOF, :FEC;
              if (TIPO = 33) then
                select 0, :FECHA from devoluciones_ventas where DEVT_ID = :ID into :DTOF, :FEC;

              recprov_id = 0;
              select max(RCPR_ID) from recibo_provisional_detalle where RPDE_IDDOC = :ID and RPDE_TIPODOC = :TIPO and RPDE_ANULADO = 'N' into :recprov_id;
              if (recprov_id is null) then
                reciprov = 'N';
              else
                reciprov = 'S';
              if (FECHA > FEC) then
                DTOF = 0;
              if (DTOF is null) then
                DTOF = 0;
              if (DTOF <> 0) then
                begin
                select sum(RCDE_DTOF/RECA_TRM) from RECIBOS_CAJA_DETALLE D, recibos_caja R
                    where R.reca_id = D.reca_id and RCDE_IDDOC = :ID and RCDE_TIPODOC = :TIPO into :DTOAPL;
                if (DTOAPL is null) then
                    DTOAPL = 0;
                DTOF = DTOF - DTOAPL;
                end
              if (RTFTE is null) then
                RTFTE = 0;
              if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) then
                begin
                if (RTFTE > 0) then
                    RTFTE = 0;
                end
              else
                begin
                if (RTFTE < 0) then
                    RTFTE = 0;
                end

              if (RTIVA is null) then
                RTIVA = 0;
              if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) then
                begin
                if (RTIVA > 0) then
                    RTIVA = 0;
                end
              else
                begin
                if (RTIVA < 0) then
                    RTIVA = 0;
                end

              if (RTICA is null) then
                RTICA = 0;
              if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) then
                begin
                if (RTICA > 0) then
                    RTICA = 0;
                end
              else
                begin
                if (RTICA < 0) then
                    RTICA = 0;
                end

              /* SI TIENE NOTA AGREGUELA */
              select max(NOCL_ID) from NOTAS_CLIENTES where TERC_NIT = :NIT and CLSU_COD = :SUCURSAL and NOCL_TIPODOC = :TIPO and NOCL_IDDOC = :ID into :IDNOTA;
              if (IDNOTA is not null) then
                select NOCL_TEXTO from NOTAS_CLIENTES where NOCL_ID = :IDNOTA into :NOTA;
              else
                NOTA = '';
              suspend;
              end
            end
        end
    /* LAS DE DESPUES DE LA AUTORETENCION */
    for select max(SDCA_TIPOREF), max(SDCA_IDREF), sum((SDCA_MONTO-SDCA_ABONO-SDCA_RTIVA-SDCA_RTICA)/SDCA_TRM), 0, sum((SDCA_RTIVA-SDCA_ABRTIVA)/SDCA_TRM), sum((SDCA_RTICA-SDCA_ABRTICA)/SDCA_TRM)
        from saldos_doc_cartera where (TERC_NIT = :nit) and (SDCA_FECHA <= :FECHA) and (SDCA_FECHA >= :FAUTORET) group by sdca_tiporef, sdca_idref
        into :TIPO, :ID, :SALDO, :RTFTE, :RTIVA, :RTICA
        do
        begin
        if (SALDO <> 0) then
            begin
            NUMERO = '';
            select MVCL_FECHA, MVCL_VENCE, MVCL_PREFREF, MVCL_NUMREF, MVCL_CONC
              from MOVIMIENTO_CLIENTES where TERC_NIT = :NIT and mvcl_sucursal = :sucursal and MVCL_FECHA <= :FECHA and MVCL_ABONO = 'N' and mvcl_tiporef = :tipo and mvcl_idref = :id
              into :FECDOC, :VENCE, :PREFIJO, :NUMERO, :CONCEPTO;
            if (NUMERO <> '') then
              begin
              DIAS = (FECHA -VENCE );
              select TIDO_NOMCORTO from TIPO_DOCUMENTO where TIDO_COD = :TIPO into :TIPONOM;
              if (TIPO = 41) then
                select NDCL_DTOFMONTO/NDCL_TRM, NDCL_FECHADTO from NOTAS_DEBITO_CLIENTES where NDCL_ID = :ID into :DTOF, :FEC;
              if (TIPO = 42) then
                select 0, NCCL_FECHA from NOTAS_CREDITO_CLIENTES where NCCL_ID = :ID into :DTOF, :FEC;
              if (TIPO = 45) then
                select ANCL_DTOFMONTO/ANCL_TRM, ANCL_DTOFECHA from ANTICIPOS_CLIENTE where ANCL_ID = :ID into :DTOF, :FEC;
              if (TIPO = 31) then
                select FACT_DTOFMONTO/FACT_TRM, FACT_DTOFFECHA from FACTURAS where FACT_ID = :ID into :DTOF, :FEC;
              if (TIPO = 33) then
                select 0, :FECHA from devoluciones_ventas where DEVT_ID = :ID into :DTOF, :FEC;

              recprov_id = 0;
              select max(RCPR_ID) from recibo_provisional_detalle where RPDE_IDDOC = :ID and RPDE_TIPODOC = :TIPO and RPDE_ANULADO = 'N' into :recprov_id;
              if (recprov_id is null) then
                reciprov = 'N';
              else
                reciprov = 'S';
              if (FECHA > FEC) then
                DTOF = 0;
              if (DTOF is null) then
                DTOF = 0;
              if (DTOF <> 0) then
                begin
                select sum(RCDE_DTOF/RECA_TRM) from RECIBOS_CAJA_DETALLE D, RECIBOS_CAJA R
                    where R.reca_id = D.reca_id and RCDE_IDDOC = :ID and RCDE_TIPODOC = :TIPO into :DTOAPL;
                if (DTOAPL is null) then
                    DTOAPL = 0;
                DTOF = DTOF - DTOAPL;
                end

              if (RTIVA is null) then
                RTIVA = 0;
              if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) then
                begin
                if (RTIVA > 0) then
                    RTIVA = 0;
                end
              else
                begin
                if (RTIVA < 0) then
                    RTIVA = 0;
                end

              if (RTICA is null) then
                RTICA = 0;
              if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) then
                begin
                if (RTICA > 0) then
                    RTICA = 0;
                end
              else
                begin
                if (RTICA < 0) then
                    RTICA = 0;
                end

              /* SI TIENE NOTA AGREGUELA */
              select max(NOCL_ID) from NOTAS_CLIENTES where TERC_NIT = :NIT and CLSU_COD = :SUCURSAL and NOCL_TIPODOC = :TIPO and NOCL_IDDOC = :ID into :IDNOTA;
              if (IDNOTA is not null) then
                select NOCL_TEXTO from NOTAS_CLIENTES where NOCL_ID = :IDNOTA into :NOTA;
              else
                NOTA = '';
              suspend;
              end
            end
        end
    end
  else
    begin
    for select max(SDCA_TIPOREF), max(SDCA_IDREF), sum((SDCA_MONTO-SDCA_ABONO-SDCA_ABRTFTE-SDCA_ABRTIVA-SDCA_ABRTICA)/SDCA_TRM), sum((SDCA_RTFTE-SDCA_ABRTFTE)/SDCA_TRM), sum((SDCA_RTIVA-SDCA_ABRTIVA)/SDCA_TRM), sum((SDCA_RTICA-SDCA_ABRTICA)/SDCA_TRM)
        from saldos_doc_cartera where (TERC_NIT = :nit) and (SDCA_FECHA <= :FECHA) and (SDCA_FECHA < :FAUTORET) and SDCA_TRM <> 1
        group by sdca_tiporef, sdca_idref
        into :TIPO, :ID, :SALDO, :RTFTE, :RTIVA, :RTICA
        do
        begin
        if (SALDO <> 0) then
            begin
            select sum((SDCA_ABONO+SDCA_ABRTIVA+SDCA_RTICA)/SDCA_TRM), sum(SDCA_ABRTFTE), sum(SDCA_ABRTIVA), sum(SDCA_ABRTICA)
                from saldos_doc_cartera where SDCA_TIPOREF = :TIPO and SDCA_IDREF = :id and (SDCA_FECHA <= :FECHA) and (SDCA_FECHA >= :FAUTORET)
                INTO :AB1, :AB2, :AB3, :AB4;
            if (AB1 IS NULL) then
                AB1 = 0;
            if (AB2 IS NULL) then
                AB2 = 0;
            if (AB3 IS NULL) then
                AB3 = 0;
            if (AB4 IS NULL) then
                AB4 = 0;
            SALDO = SALDO - AB1;
            RTFTE = RTFTE - AB2;
            RTIVA = RTIVA - AB3;
            RTICA = RTICA - AB4;
            NUMERO = '';
            select MVCL_FECHA, MVCL_VENCE, MVCL_PREFREF, MVCL_NUMREF, MVCL_CONC
              from MOVIMIENTO_CLIENTES where TERC_NIT = :NIT and mvcl_sucursal = :sucursal and MVCL_FECHA <= :FECHA and MVCL_ABONO = 'N' and mvcl_tiporef = :tipo and mvcl_idref = :id
              into :FECDOC, :VENCE, :PREFIJO, :NUMERO, :CONCEPTO;
            if ((NUMERO <> '') AND (SALDO <> 0)) then
              begin
              DIAS = (FECHA -VENCE );
              select TIDO_NOMCORTO from TIPO_DOCUMENTO where TIDO_COD = :TIPO into :TIPONOM;
              if (TIPO = 41) then
                select NDCL_DTOFMONTO/NDCL_TRM, NDCL_FECHADTO from NOTAS_DEBITO_CLIENTES where NDCL_ID = :ID into :DTOF, :FEC;
              if (TIPO = 42) then
                select 0, NCCL_FECHA from NOTAS_CREDITO_CLIENTES where NCCL_ID = :ID into :DTOF, :FEC;
              if (TIPO = 45) then
                select ANCL_DTOFMONTO/ANCL_TRM, ANCL_DTOFECHA from ANTICIPOS_CLIENTE where ANCL_ID = :ID into :DTOF, :FEC;
              if (TIPO = 31) then
                select FACT_DTOFMONTO/FACT_TRM, FACT_DTOFFECHA from FACTURAS where FACT_ID = :ID into :DTOF, :FEC;
              if (TIPO = 33) then
                select 0, :FECHA from devoluciones_ventas where DEVT_ID = :ID into :DTOF, :FEC;

              recprov_id = 0;
              select max(RCPR_ID) from recibo_provisional_detalle where RPDE_IDDOC = :ID and RPDE_TIPODOC = :TIPO and RPDE_ANULADO = 'N' into :recprov_id;
              if (recprov_id is null) then
                reciprov = 'N';
              else
                reciprov = 'S';
              if (FECHA > FEC) then
                DTOF = 0;
              if (DTOF is null) then
                DTOF = 0;
              if (DTOF <> 0) then
                begin
                select sum(RCDE_DTOF/RECA_TRM) from RECIBOS_CAJA_DETALLE D, RECIBOS_CAJA R
                    where R.reca_id = D.reca_id and RCDE_IDDOC = :ID and RCDE_TIPODOC = :TIPO into :DTOAPL;
                if (DTOAPL is null) then
                    DTOAPL = 0;
                DTOF = DTOF - DTOAPL;
                end
              if (RTFTE is null) then
                RTFTE = 0;
              if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) then
                begin
                if (RTFTE > 0) then
                    RTFTE = 0;
                end
              else
                begin
                if (RTFTE < 0) then
                    RTFTE = 0;
                end

              if (RTIVA is null) then
                RTIVA = 0;
              if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) then
                begin
                if (RTIVA > 0) then
                    RTIVA = 0;
                end
              else
                begin
                if (RTIVA < 0) then
                    RTIVA = 0;
                end

              if (RTICA is null) then
                RTICA = 0;
              if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) then
                begin
                if (RTICA > 0) then
                    RTICA = 0;
                end
              else
                begin
                if (RTICA < 0) then
                    RTICA = 0;
                end

              /* SI TIENE NOTA AGREGUELA */
              select max(NOCL_ID) from NOTAS_CLIENTES where TERC_NIT = :NIT and CLSU_COD = :SUCURSAL and NOCL_TIPODOC = :TIPO and NOCL_IDDOC = :ID into :IDNOTA;
              if (IDNOTA is not null) then
                select NOCL_TEXTO from NOTAS_CLIENTES where NOCL_ID = :IDNOTA into :NOTA;
              else
                NOTA = '';
              suspend;
              end
            end
        end
    /* DESPUES DE LA AUTORETENCION */
    for select max(SDCA_TIPOREF), max(SDCA_IDREF), sum((SDCA_MONTO-SDCA_ABONO-SDCA_ABRTIVA-SDCA_ABRTICA)/SDCA_TRM), sum((SDCA_RTFTE-SDCA_ABRTFTE)/SDCA_TRM), sum((SDCA_RTIVA-SDCA_ABRTIVA)/SDCA_TRM), sum((SDCA_RTICA-SDCA_ABRTICA)/SDCA_TRM)
        from saldos_doc_cartera where (TERC_NIT = :nit) and (SDCA_FECHA <= :FECHA) and (SDCA_FECHA >= :FAUTORET) group by sdca_tiporef, sdca_idref
        into :TIPO, :ID, :SALDO, :RTFTE, :RTIVA, :RTICA
        do
        begin
        if (SALDO <> 0) then
            begin
            NUMERO = '';
            select MVCL_FECHA, MVCL_VENCE, MVCL_PREFREF, MVCL_NUMREF, MVCL_CONC
              from MOVIMIENTO_CLIENTES where TERC_NIT = :NIT and mvcl_sucursal = :sucursal and MVCL_FECHA <= :FECHA and MVCL_ABONO = 'N' and mvcl_tiporef = :tipo and mvcl_idref = :id
              into :FECDOC, :VENCE, :PREFIJO, :NUMERO, :CONCEPTO;
            if (NUMERO <> '') then
              begin
              DIAS = (FECHA -VENCE );
              select TIDO_NOMCORTO from TIPO_DOCUMENTO where TIDO_COD = :TIPO into :TIPONOM;
              if (TIPO = 41) then
                select NDCL_DTOFMONTO/NDCL_TRM, NDCL_FECHADTO from NOTAS_DEBITO_CLIENTES where NDCL_ID = :ID into :DTOF, :FEC;
              if (TIPO = 42) then
                select 0, NCCL_FECHA from NOTAS_CREDITO_CLIENTES where NCCL_ID = :ID into :DTOF, :FEC;
              if (TIPO = 45) then
                select ANCL_DTOFMONTO/ANCL_TRM, ANCL_DTOFECHA from ANTICIPOS_CLIENTE where ANCL_ID = :ID into :DTOF, :FEC;
              if (TIPO = 31) then
                select FACT_DTOFMONTO/FACT_TRM, FACT_DTOFFECHA from FACTURAS where FACT_ID = :ID into :DTOF, :FEC;
              if (TIPO = 33) then
                select 0, :FECHA from devoluciones_ventas where DEVT_ID = :ID into :DTOF, :FEC;

              recprov_id = 0;
              select max(RCPR_ID) from recibo_provisional_detalle where RPDE_IDDOC = :ID and RPDE_TIPODOC = :TIPO and RPDE_ANULADO = 'N' into :recprov_id;
              if (recprov_id is null) then
                reciprov = 'N';
              else
                reciprov = 'S';
              if (FECHA > FEC) then
                DTOF = 0;
              if (DTOF is null) then
                DTOF = 0;
              if (DTOF <> 0) then
                begin
                select sum(RCDE_DTOF/RECA_TRM) from RECIBOS_CAJA_DETALLE D, RECIBOS_CAJA R
                    where R.reca_id = D.reca_id and RCDE_IDDOC = :ID and RCDE_TIPODOC = :TIPO into :DTOAPL;
                if (DTOAPL is null) then
                    DTOAPL = 0;
                DTOF = DTOF - DTOAPL;
                end

              if (RTIVA is null) then
                RTIVA = 0;
              if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) then
                begin
                if (RTIVA > 0) then
                    RTIVA = 0;
                end
              else
                begin
                if (RTIVA < 0) then
                    RTIVA = 0;
                end

              if (RTICA is null) then
                RTICA = 0;
              if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) then
                begin
                if (RTICA > 0) then
                    RTICA = 0;
                end
              else
                begin
                if (RTICA < 0) then
                    RTICA = 0;
                end

              /* SI TIENE NOTA AGREGUELA */
              select max(NOCL_ID) from NOTAS_CLIENTES where TERC_NIT = :NIT and CLSU_COD = :SUCURSAL and NOCL_TIPODOC = :TIPO and NOCL_IDDOC = :ID into :IDNOTA;
              if (IDNOTA is not null) then
                select NOCL_TEXTO from NOTAS_CLIENTES where NOCL_ID = :IDNOTA into :NOTA;
              else
                NOTA = '';
              suspend;
              end
            end
        end
    end
  end
end
^

SET TERM ; ^


/* 2009/01/07B PRECIO NETO QUEDABA EN NULO */

SET TERM ^ ;

CREATE OR ALTER PROCEDURE IMPR_FACTURA(
    ID INTEGER)
RETURNS (
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    VENCE DATE,
    DIASVENCE INTEGER,
    CONTCRED CHAR(17),
    NIT VARCHAR(20),
    NOMTERCERO VARCHAR(60),
    NOMCLIENTE VARCHAR(60),
    VENDEDOR INTEGER,
    NOMVENDEDOR VARCHAR(60),
    PUNTOVTA INTEGER,
    NOMPUNTOVTA VARCHAR(30),
    CODBODEGA VARCHAR(2),
    NOMBODEGA VARCHAR(30),
    AUTORIZACION VARCHAR(20),
    DESPACHO VARCHAR(255),
    TRANSPORTADOR VARCHAR(60),
    COTIZACION VARCHAR(30),
    PEDIDO VARCHAR(30),
    REMISION VARCHAR(30),
    PACIENTE VARCHAR(20),
    NOMPACIENTE VARCHAR(60),
    COMIPORC NUMERIC(9,2),
    COMIMONTO NUMERIC(18,2),
    SUBTOTAL NUMERIC(18,2),
    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),
    EXTRA NUMERIC(18,2),
    DTOFPORC NUMERIC(9,2),
    DTOFMONTO NUMERIC(18,2),
    FECHADTO DATE,
    TOTALFAC NUMERIC(18,2),
    TOTALPAGAR NUMERIC(18,2),
    OBS BLOB SUB_TYPE 1 SEGMENT SIZE 80,
    ITEM INTEGER,
    ARTICULO VARCHAR(15),
    CODBAR VARCHAR(15),
    ARTIDES VARCHAR(60),
    DESCORTA VARCHAR(30),
    CANT NUMERIC(18,4),
    LOTE VARCHAR(15),
    VLOTE DATE,
    UNIDAD VARCHAR(8),
    CAJAS NUMERIC(18,4),
    FACTOR INTEGER,
    LISTAPR INTEGER,
    REFITEM VARCHAR(60),
    BODITEM VARCHAR(2),
    STAND VARCHAR(15),
    PRUNIT NUMERIC(18,2),
    DTOITPORC NUMERIC(9,2),
    DTOITMONTO NUMERIC(18,2),
    PRNETO NUMERIC(18,2),
    IVAPORC NUMERIC(9,2),
    IVAITMONTO NUMERIC(18,2),
    CONSUMO NUMERIC(18,2),
    SUBTOTIT NUMERIC(18,2),
    SUBTOTITCON NUMERIC(18,2),
    DTOIT1 NUMERIC(9,2),
    DTOIT2 NUMERIC(9,2),
    DTOIT3 NUMERIC(9,2),
    TOTAL NUMERIC(18,2),
    CODIGOCL VARCHAR(20),
    ZONACOD VARCHAR(2),
    ZONANOM VARCHAR(60),
    DV CHAR(1),
    DIRECCION VARCHAR(60),
    CIUDAD VARCHAR(40),
    TELEFONO VARCHAR(40),
    CONTACTO VARCHAR(60),
    FAX VARCHAR(25),
    GRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    SUBGRUPO VARCHAR(3),
    NOMSUBG VARCHAR(30),
    MARCA VARCHAR(3),
    NOMMARCA VARCHAR(30),
    PESO NUMERIC(18,4),
    ANCHO NUMERIC(18,4),
    ALTO NUMERIC(18,4),
    LARGO NUMERIC(18,4),
    SUMA1 NUMERIC(18,2),
    SUMA2 NUMERIC(18,2),
    SUMA3 NUMERIC(18,2),
    IVA1 NUMERIC(18,2),
    IVA2 NUMERIC(18,2),
    IVA3 NUMERIC(18,2),
    SUMAEX NUMERIC(18,2),
    SUMAGR NUMERIC(18,2),
    TOTCONSUMO NUMERIC(18,2),
    DTOIT1M NUMERIC(18,2),
    DTOIT2M NUMERIC(18,2),
    DTOIT3M NUMERIC(18,2),
    TOTCAJAS NUMERIC(18,2),
    VEHICULO VARCHAR(8),
    RECIBIDO NUMERIC(18,2),
    CAMBIO NUMERIC(18,2),
    HORA TIME,
    FORMAPAGO1 VARCHAR(30),
    MONTOPAGO1 NUMERIC(18,2),
    FORMAPAGO2 VARCHAR(30),
    MONTOPAGO2 NUMERIC(18,2),
    FORMAPAGO3 VARCHAR(30),
    MONTOPAGO3 NUMERIC(18,2),
    PUNTOS INTEGER,
    PUNTOSACUM INTEGER,
    PUNTOSVENC INTEGER,
    FECPTOS DATE,
    OBSITEM BLOB SUB_TYPE 1 SEGMENT SIZE 80,
    SUCUR VARCHAR(10))
AS
DECLARE VARIABLE IMPTOS CHAR(1);
DECLARE VARIABLE TARIFA INTEGER;
declare variable DEVUELTO NUMERIC(18,2);
/*DECLARE VARIABLE NROCOPIA INTEGER;*/
declare variable ORDENCOD CHAR(2);
declare variable IMPRDEV CHAR(2);
declare variable IMPR CHAR(1);
declare variable ITEMFP INTEGER;
declare variable FORMAP VARCHAR(30);
declare variable MONTOP NUMERIC(18,2);
BEGIN
  SELECT F.PREF_PRE, FACT_NUMERO, FACT_FECHA, FACT_VENCE, F.BODE_COD, BODE_NOM, F.TERC_NIT, FACT_NOMCLIENTE, F.VEND_COD, VEND_NOMBRE, F.PTVT_ID, PTVT_NOM,
    AUTO_NUMERO, FACT_DESPACHO, FACT_TRANSP, FACT_COTIZACI, FACT_PEDIDO, FACT_REMISION, FACT_COMIPORC, FACT_COMIMONTO, FACT_IVAINC, 
    FACT_DTOPOR, FACT_DTOMONTO, FACT_ADICIONAL, FACT_IVAMONTO, FACT_RTFTEPOR, FACT_RTFTEMONTO, FACT_RTIVAPOR, FACT_RTIVAMONTO, FACT_RTICAPOR, FACT_RTICAMONTO, FACT_EXTRA, FACT_DTOFPOR, FACT_DTOFMONTO, FACT_DTOFFECHA, FACT_TOTAL,
    TERC_DIR, TERC_CIU, TERC_TEL, TERC_CONTACTO, TERC_FAX, TERC_DV, FACT_DTOIT1, FACT_DTOIT2, FACT_DTOIT3,
    FACT_OBS, VEHI_COD, /*FACT_NROCOPIA,*/ FACT_RECIBIDO, FACT_SUCURSAL, FACT_DETCLI, FACT_DETCLINOM, TERC_NOM
    FROM FACTURAS F, BODEGA B, VENDEDORES V, PUNTO_VENTA P, TERCEROS T
    WHERE F.BODE_COD = B.BODE_COD AND F.VEND_COD = V.VEND_COD AND F.PTVT_ID = P.PTVT_ID AND F.TERC_NIT = T.TERC_NIT AND F.FACT_ID = :ID
    into :PREF, :NUMERO, :FECHA, :VENCE, :CODBODEGA, :NOMBODEGA, :NIT, :NOMTERCERO, :VENDEDOR, :NOMVENDEDOR, :PUNTOVTA, :NOMPUNTOVTA,
    :AUTORIZACION, :DESPACHO, :TRANSPORTADOR, :COTIZACION, :PEDIDO, :REMISION, :COMIPORC, :COMIMONTO, :IMPTOS,
    :DTOPORC, :DTOMONTO, :ADICIONAL, :IVAMONTO, :RTEFTEPORC, :RTEFTEMONTO, :RTEIVAPORC, :RTEIVAMONTO, :RTEICAPORC, :RTEICAMONTO, :EXTRA, :DTOFPORC, :DTOFMONTO, :FECHADTO, :TOTALFAC,
    :DIRECCION, :CIUDAD, :TELEFONO, :CONTACTO, :FAX, :DV, :dtoit1m, :dtoit2m, :dtoit3m,
    :OBS, :VEHICULO,/* :NROCOPIA,*/ :RECIBIDO, :SUCUR, :paciente, :nompaciente, :nomcliente;

  /* ACUMULE LOS PUNTOS, SE HACE ACA POR SER POSTERIOR AL DETALLE */
  EXECUTE PROCEDURE acumula_puntos_cliente (31, :id, :nit, :fecha) returning_values (:PUNTOS);
  EXECUTE PROCEDURE consulta_puntos_cliente (:id, :nit, :fecha) returning_values (:puntos, :puntosacum, :puntosvenc, :fecptos);

  SELECT CLIE_COD, C.ZONA_COD, ZONA_NOM
    FROM CLIENTES C, ZONAS Z
    WHERE TERC_NIT = :NIT AND C.ZONA_COD = Z.ZONA_COD
    INTO :CODIGOCL, :ZONACOD, :ZONANOM;
  /*SELECT NOCO_NOMBRE FROM NOMBRES_COPIAS where NOCO_ID = :NROCOPIA INTO :NOMCOPIA;*/
  SELECT CLSU_DIR, CLSU_CIUDAD, CLSU_TEL FROM CLIENTE_SUCURSALES WHERE TERC_NIT = :NIT AND CLCU_COD = :SUCUR
    INTO :DIRECCION, :CIUDAD, :TELEFONO;
  /*if (NOMCOPIA IS NULL) then
    NOMCOPIA = 'COPIA No. ' || NROCOPIA;**/
  DIASVENCE = VENCE - FECHA;
  if (DIASVENCE > 0) then
    CONTCRED = 'CREDITO ' || CAST(DIASVENCE AS VARCHAR(3)) || ' DIAS';
  ELSE
    CONTCRED = 'CONTADO';
  SUBTOTAL = TOTALFAC - EXTRA - IVAMONTO - ADICIONAL + DTOMONTO;
  TOTALPAGAR = TOTALFAC - RTEFTEMONTO - RTEIVAMONTO - RTEICAMONTO;
  if (RECIBIDO <> 0) then
      CAMBIO = RECIBIDO - totalpagar;
  ELSE
    CAMBIO = 0;
  SUMAEX = 0;
  SUMA1 = 0;
  SUMA2 = 0;
  SUMA3 = 0;
  IVA1 = 0;
  IVA2 = 0;
  IVA3 = 0;
  TOTCONSUMO = 0;
  MONTOPAGO1 = 0;
  SELECT MAX(AUDI_HORA) FROM AUDITORIA WHERE TIDO_COD = 31 AND AUDI_IDDOC = :ID AND AUDI_OPER = 'I' INTO :HORA;
  /* AHORA LAS FORMAS DE PAGO, BUSQUE EL ABONO DE HOY A LA FACTURA */
  ITEMFP = 1;
  MONTOPAGO1 = 0;
  MONTOPAGO2 = 0;
  MONTOPAGO3 = 0;
  FOR SELECT FOPA_NOM, RCPA_MONTO FROM RECIBOS_CAJA_PAGO P, FORMAS_PAGO F, RECIBOS_CAJA R, RECIBOS_CAJA_DETALLE D
    WHERE R.RECA_ID = P.RECA_ID AND R.RECA_ID = D.RECA_ID AND P.FOPA_ID = F.FOPA_ID AND RECA_FECHA = :FECHA AND RCDE_TIPODOC = 31 AND RCDE_IDDOC = :ID
    INTO :formap, :MONTOP
    DO
    BEGIN
    if (ITEMFP = 1) then
        BEGIN
        FORMAPAGO1 = FORMAP;
        MONTOPAGO1 = MONTOP;
        END
    if (ITEMFP = 2) then
        BEGIN
        FORMAPAGO2 = FORMAP;
        MONTOPAGO2 = MONTOP;
        END
    if (ITEMFP = 3) then
        BEGIN
        FORMAPAGO3 = FORMAP;
        MONTOPAGO3 = MONTOP;
        END
    ITEMFP = ITEMFP + 1;
    END
  EXECUTE PROCEDURE lee_configuracion ('FACTURACION','DOCUMENTOS','ORDENAR ITEMS POR CODIGO DE ARTICULO') returning_values (:ORDENCOD);
  EXECUTE PROCEDURE lee_configuracion ('FACTURACION','POS', 'IMPRIMIR DEVOLUCIONES DE ARTICULOS NEGATIVOS') returning_values (:imprdev);
  totcajas = 0;
  if (ORDENCOD = 'SI') then
    BEGIN
    FOR SELECT FADE_ITEM, D.ARTI_COD, FADE_CODBAR, SUBSTR(FADE_DESC,1,60), ARTI_DESCORTA, FADE_CANT, FADE_UNIDAD, FADE_FACTOR, BODE_COD, FADE_LOTE, LIPR_COD, FADE_PRUNIT, FADE_DTOPORC, FADE_DTOMONTO, FADE_IVAPORC, FADE_IVAMONTO, FADE_CONSUMO, FADE_TOTAL, FADE_REFERENCIA,
        GRUP_COD, SUBG_COD, MARC_COD, ARTI_PESO, ARTI_ANCHO, ARTI_ALTO, ARTI_LARGO, TAIV_COD, FADE_DEVUELTO, FADE_OBS, FADE_DTO1, FADE_DTO2, FADE_DTO3, FADE_CAJAS
        FROM FACTURAS_DETALLE D, ARTICULO A
        WHERE D.ARTI_COD = A.ARTI_COD AND D.FACT_ID = :ID
        ORDER BY D.ARTI_COD
        INTO :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :DESCORTA, :CANT, :UNIDAD, :FACTOR, :BODITEM, :LOTE, :LISTAPR, :PRUNIT, :DTOITPORC, :DTOITMONTO, :IVAPORC, :IVAITMONTO, :CONSUMO, :TOTAL, :refitem,
        :GRUPO, :SUBGRUPO, :MARCA, :PESO, :ANCHO, :ALTO, :LARGO, :TARIFA, :devuelto, :obsitem, :dtoit1, :dtoit2, :dtoit3, :cajas
        DO
          BEGIN
          if (ARTICULO = CODBAR) then
            SELECT FIRST 1 COBA_COD FROM barras_articulo WHERE ARTI_COD = :articulo INTO :CODBAR;
          if (IMPRDEV <> 'SI') then
            BEGIN
            if ((CANT >= 0) AND (DEVUELTO = 0)) then
                IMPR = 'S';
            ELSE
                IMPR = 'N'; /* ES DEVOLUCION */
            END
          ELSE
            IMPR = 'S';
          if (DTOIT1M IS NULL) then
            DTOIT1M = 0;
          if (DTOIT2M IS NULL) then
            DTOIT2M = 0;
          if (DTOIT3M IS NULL) then
            DTOIT3M = 0;
          if (IMPR = 'S') then
            BEGIN
            if (IMPTOS = 'S') then
              if (CANT <> 0) then
                  PRNETO = PRUNIT - DTOITMONTO - ((IVAITMONTO+CONSUMO+dtoit1m+dtoit2m+dtoit3m) / CANT);
                ELSE
                  PRNETO = PRUNIT - DTOITMONTO;
            ELSE
              if (CANT <> 0) then
                  PRNETO = PRUNIT - DTOITMONTO - (dtoit1m + dtoit2m + dtoit3m) / cant;
                ELSE
                  PRNETO = PRUNIT - DTOITMONTO;
            SUBTOTIT = TOTAL - IVAITMONTO - CONSUMO;
            SUBTOTITCON = TOTAL;
            TOTCONSUMO = TOTCONSUMO + CONSUMO;
            SELECT LOTE_VENCE FROM LOTES WHERE LOTE_NRO = :lote AND ARTI_COD = :ARTICULO AND BODE_COD = :boditem INTO :vlote;
            if ((REFITEM <> '.t') or (REFITEM IS NULL)) then
                BEGIN
                /* NO SUME LOS ENSAMBLES */
                if (IVAPORC = 0) then
                    SUMAEX = SUMAEX + TOTAL;
                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;
                END
            if (IMPTOS = 'N') then
                TOTAL = TOTAL - IVAITMONTO - CONSUMO;
            if (ANCHO IS NULL) then
                ANCHO = 0;
            if (ALTO IS NULL) then
                ALTO = 0;
            if (LARGO IS NULL) then
                LARGO = 0;
            if (PESO IS NULL) then
                PESO = 0;
            PESO = PESO * CANT;
            totcajas = totcajas + cajas;
            if (substr(ARTICULO,1,2) = '.t') then
                BEGIN
                REFITEM = '';
                TOTAL = 0;
                SUBTOTIT = 0;
                SUBTOTITCON = 0;
                END
            SELECT STAND_COD FROM STANDS WHERE ARTI_COD = :ARTICULO AND STAND_BODEGA = :boditem INTO :stand;
            SUSPEND;
            END
          END
    END
ELSE
    BEGIN
    FOR SELECT FADE_ITEM, D.ARTI_COD, FADE_CODBAR, SUBSTR(FADE_DESC,1,60), ARTI_DESCORTA, FADE_CANT, FADE_UNIDAD, FADE_FACTOR, BODE_COD, FADE_LOTE, LIPR_COD, FADE_PRUNIT, FADE_DTOPORC, FADE_DTOMONTO, FADE_IVAPORC, FADE_IVAMONTO, FADE_CONSUMO, FADE_TOTAL, FADE_REFERENCIA,
        GRUP_COD, SUBG_COD, MARC_COD, ARTI_PESO, ARTI_ANCHO, ARTI_ALTO, ARTI_LARGO, TAIV_COD, FADE_DEVUELTO, FADE_OBS, FADE_DTO1, FADE_DTO2, FADE_DTO3, FADE_CAJAS
        FROM FACTURAS_DETALLE D, ARTICULO A
        WHERE D.ARTI_COD = A.ARTI_COD AND D.FACT_ID = :ID
        ORDER BY FADE_ITEM
        INTO :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :DESCORTA, :CANT, :UNIDAD, :FACTOR, :BODITEM, :LOTE, :LISTAPR, :PRUNIT, :DTOITPORC, :DTOITMONTO, :IVAPORC, :IVAITMONTO, :CONSUMO, :TOTAL, :refitem,
        :GRUPO, :SUBGRUPO, :MARCA, :PESO, :ANCHO, :ALTO, :LARGO, :TARIFA, :devuelto, :obsitem, :dtoit1, :dtoit2, :dtoit3, :cajas
        DO
          BEGIN
          if (IMPRDEV <> 'SI') then
            BEGIN
            if ((CANT >= 0) AND (DEVUELTO = 0)) then
                IMPR = 'S';
            ELSE
                IMPR = 'N'; /* ES DEVOLUCION */
            END
          ELSE
            IMPR = 'S';
          if (IMPR = 'S') then
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :GRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :MARCA INTO NOMMARCA;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :SUBGRUPO AND GRUP_COD = :GRUPO INTO :NOMSUBG;
            if (IMPTOS = 'S') then
              if (CANT <> 0) then
                  PRNETO = PRUNIT - DTOITMONTO - ((IVAITMONTO+CONSUMO+dtoit1m+dtoit2m+dtoit3m) / CANT);
                ELSE
                  PRNETO = PRUNIT - DTOITMONTO;
            ELSE
              if (CANT <> 0) then
                  PRNETO = PRUNIT - DTOITMONTO - (dtoit1m + dtoit2m + dtoit3m) / cant;
                ELSE
                  PRNETO = PRUNIT - DTOITMONTO;
            SUBTOTIT = TOTAL - IVAITMONTO - CONSUMO;
            SUBTOTITCON = TOTAL;
            TOTCONSUMO = TOTCONSUMO + CONSUMO;
            SELECT LOTE_VENCE FROM LOTES WHERE LOTE_NRO = :lote AND ARTI_COD = :ARTICULO AND BODE_COD = :boditem INTO :vlote;
            if ((REFITEM <> '.t') or (REFITEM IS NULL)) then
                BEGIN
                /* NO SUME LOS ENSAMBLES */
                if (IVAPORC = 0) then
                    SUMAEX = SUMAEX + TOTAL;
                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;
                END
            if (IMPTOS = 'N') then
                TOTAL = TOTAL - IVAITMONTO - CONSUMO;
            if (ANCHO IS NULL) then
                ANCHO = 0;
            if (ALTO IS NULL) then
                ALTO = 0;
            if (LARGO IS NULL) then
                LARGO = 0;
            if (PESO IS NULL) then
                PESO = 0;
            PESO = PESO * CANT;
            totcajas = totcajas + cajas;
            if (substr(ARTICULO,1,2) = '.t') then
                BEGIN
                REFITEM = '';
                TOTAL = 0;
                SUBTOTIT = 0;
                SUBTOTITCON = 0;
                END
            SELECT STAND_COD FROM STANDS WHERE ARTI_COD = :ARTICULO AND STAND_BODEGA = :boditem INTO :stand;
            SUSPEND;
            END
          END
    END
END
^

SET TERM ; ^


/* 2009/01/08 TRIGGERS COMPATIBLES CON FIREBIRD 2.0 */

SET TERM ^ ;

CREATE OR ALTER TRIGGER ENTRADAS_DETALLE_AI FOR ENTRADAS_DETALLE
ACTIVE AFTER INSERT POSITION 0
AS
declare variable fec date;
declare variable CONC VARCHAR(60);
declare variable factor numeric(18,4);
declare variable Pref varchar(4);
declare variable Num varchar(6);
declare variable Nit varchar(20);
declare variable IVAINC CHAR(2);
declare variable COSTO NUMERIC(18,2);
BEGIN
  if ((NEW.entr_id <> 0) and (new.ende_anulado = 'N')) then
    BEGIN
    select entr_fecha, entr_conc, pref_pre, entr_numero, terc_nit, entr_imptos
        from entradas where entr_id = new.entr_id
        into :fec, :conc, :Pref, :Num, :Nit, :ivainc;
    execute procedure factor_unidad_cant(new.arti_cod, new.ende_unidad) returning_values(factor);
    COSTO = ((new.ende_costo - NEW.ende_dtomonto) / :factor);
    if (IVAINC = 'S') then
        COSTO = COSTO / (1 + NEW.ende_ivaporc/100);
    INSERT INTO MOVIMIENTO_ARTICULO
      (ARTI_COD, MVAR_CONS, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM, TERC_NIT)
      VALUES(NEW.ARTI_COD, GEN_ID(ID_MOVARTI,1), NEW.BODE_COD, :FEC, 11, NEW.entr_id,
      :CONC, :factor * new.ende_cant, :costo, 'S', new.ende_lote, :Pref, :Num, new.ende_item, :Nit);
    /* RECORRA LAS LISTAS DE PRECIOS Y CAMBIE EL PRECIO */
    EXECUTE PROCEDURE CALCULA_PRECIOS(NEW.ARTI_COD, :FEC);
    /* ACTUALICE EL STAND */
    if (new.ende_stand is not null) then
      if (exists(select stand_cod from stands where arti_cod = new.arti_cod and stand_bodega = new.bode_cod)) then
        UPDATE stands set stand_cod = new.ende_stand where arti_cod = new.arti_cod and stand_bodega = new.bode_cod;
      else
        INSERT INTO stands (ARTI_COD, STAND_BODEGA, STAND_COD) VALUES (NEW.arti_cod, NEW.bode_cod, NEW.ende_stand);
    END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER REMISION_PROVEEDOR_DET_AI FOR REMISION_PROVEEDOR_DET
ACTIVE AFTER INSERT POSITION 0
AS
declare variable fec date;
declare variable CONC VARCHAR(60);
declare variable factor numeric(18,4);
declare variable Pref varchar(4);
declare variable Num varchar(6);
declare variable EXISTE CHAR(1);
declare variable NIT VARCHAR(20);
declare variable NUMPROV VARCHAR(20);
declare variable Tipo Integer;
declare variable idfact integer;
declare variable numrows integer;
declare variable IVAINC CHAR(2);
declare variable COSTO NUMERIC(18,2);
declare variable CANTREL NUMERIC(18,4);
declare variable NUMPED VARCHAR(30);
declare variable CONSO CHAR(2);
declare variable CONSOLIDA INTEGER;
declare variable DTOPIE NUMERIC(18,2);
declare variable ADICIONAL NUMERIC(18,2);
declare variable TOTAL NUMERIC(18,2);
declare variable IVAMONTO NUMERIC(18,2);
declare variable EXTRA NUMERIC(18,2);
declare variable FACT NUMERIC(18,4);
declare variable MENORV CHAR(2);
BEGIN
  if ((NEW.repr_id <> 0) and (new.rpvd_anulado = 'N')) then
    BEGIN
    select max(rprd_tiporel), max(rprd_idrel) from remision_proveedor_docrela
        where repr_id = new.repr_id into :Tipo, :idfact;
    if (Tipo is null) then
        Tipo = 0;
    /* si se hizo con base en una factura que afecto el inventario no afecte inventario */
    numrows = 0;
    if (Tipo = 21) Then
        select count(*) from movimiento_articulo where mvar_tipodoc = 21 and mvar_idref = :idfact into :numrows;
    if (numrows is null) then
        numrows = 0;
    if (numrows = 0) then
        begin
        select repr_fecha, pref_pre, repr_numero, REPR_IMPTOS, terc_nit, REPR_NUMPROV, REPR_ORDEN, REPR_CONSOLIDA, repr_dtomonto, repr_adicional, repr_total, repr_ivamonto, repr_extra
            from remision_proveedor where repr_id = new.repr_id
            into :fec, :Pref, :Num, :IVAINC, :NIT, :NUMPROV, :numped, :CONSOLIDA, :dtopie, :adicional, :total, :ivamonto, :extra;
        execute procedure factor_unidad_cant(new.arti_cod, new.rpvd_unidad) returning_values(factor);
        CONC = 'REMISION PROVEEDOR No.' || PREF || NUM || '-' || NUMPROV;
        if (numped <> '') then
            conc = conc || '-ORDEN ' || NUMPED;
        COSTO = ((new.rpvd_prunit - NEW.rpvd_dtomonto) / :factor);
        if (IVAINC = 'S') then
            COSTO = COSTO / (1 + NEW.rpvd_ivaporc/100);
        EXECUTE PROCEDURE lee_configuracion('COMPRAS','FACTURAS','DESCUENTO Y VALOR ADICIONAL DEL DOCUMENTO COMO MENOR VALOR DEL COSTO') returning_values (:MENORV);
        if (MENORV = 'SI') then
            BEGIN
            FACT = (TOTAL - EXTRA - IVAMONTO);
            if ((FACT - ADICIONAL + DTOPIE) <> 0) then
                FACT = FACT / (FACT - ADICIONAL + DTOPIE);
            ELSE
                FACT = 1;
            COSTO = COSTO * FACT;
            END
        INSERT INTO MOVIMIENTO_ARTICULO
          (ARTI_COD, MVAR_CONS, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM, TERC_NIT)
          VALUES(NEW.ARTI_COD, GEN_ID(ID_MOVARTI,1), NEW.BODE_COD, :FEC, 22, NEW.repr_id,
          :CONC, :factor * new.rpvd_cant, :COSTO, 'S', new.rpvd_lote, :Pref, :Num, new.rpvd_item, :Nit);

        /* RECORRA LAS LISTAS DE PRECIOS Y CAMBIE EL PRECIO */
        EXECUTE PROCEDURE CALCULA_PRECIOS(NEW.ARTI_COD, :FEC);

        if (COSTO > 0 ) then
         BEGIN
          /* GRABE PROV X ARTICULO */
          EXISTE = 'N';
          SELECT 'S' FROM PROVEEDOR_ARTICULO WHERE TERC_NIT = :NIT AND ARTI_COD = NEW.ARTI_COD INTO :EXISTE;
          if (EXISTE = 'S') then
            UPDATE PROVEEDOR_ARTICULO 
                SET PVAR_FECHA = :FEC, PVAR_COSTO = :COSTO, PVAR_COD = NEW.rpvd_codprov
                WHERE TERC_NIT = :NIT AND ARTI_COD = NEW.ARTI_COD;
          ELSE
            INSERT INTO PROVEEDOR_ARTICULO (TERC_NIT, ARTI_COD, PVAR_COSTO, PVAR_FECHA, PVAR_COD,PVAR_DES)
                VALUES (:NIT, NEW.ARTI_COD, :COSTO, :FEC, NEW.rpvd_codprov,NEW.rpvd_desc);
         END
        end

    /* ACTUALICE EL PENDIENTE  */
    if (CONSOLIDA <> 0) then
        BEGIN
        EXECUTE PROCEDURE LEE_CONFIGURACION ('COMPRAS','DOCUMENTOS','SUMAR CANTIDADES PENDIENTES AL CONSOLIDAR DOCUMENTOS') returning_values (CONSO);
        SELECT MIN(CEFA_TIPOORI) FROM consolide_faltantes WHERE CEFA_ID = :CONSOLIDA INTO :NUMROWS;
        if (NUMROWS = 23) then
            BEGIN
            EXECUTE PROCEDURE LEE_CONFIGURACION('COMPRAS', 'REMISIONES', 'VERIFICAR CODIGOS DE LA ORDEN') returning_values (MENORV);
            if (MENORV = 'SI') then
                CONSO = 'NO';
            END
        SELECT COUNT(CEFA_ITEM) FROM consolide_faltantes WHERE CEFA_ID = :CONSOLIDA INTO :NUMROWS;
        if ((CONSO = 'SI') AND (NUMROWS > 1)) then
            UPDATE consolidado_faltantes SET COFA_OK = 'S' WHERE COFA_ID = :consolida;
        ELSE
            BEGIN
            /* BUSQUE EL CONSOLIDADO EN EL MISMO ITEM Y SI ES DIFERENTE ACTUALICELO */
            select COFA_CANT * COFA_FACTOR FROM consolidado_faltantes WHERE COFA_ID = :consolida AND COFA_ITEM = NEW.RPVD_ITEM AND ARTI_COD = NEW.arti_cod INTO :CANTREL;
            if (NEW.RPVD_CANT * NEW.RPVD_FACTOR < CANTREL) then
                UPDATE consolidado_faltantes SET COFA_IDDES = NEW.repr_id, COFA_CANT = NEW.RPVD_CANT, COFA_FACTOR = NEW.RPVD_FACTOR
                    WHERE COFA_ID = :consolida AND COFA_ITEM = NEW.RPVD_ITEM AND ARTI_COD = NEW.arti_cod;
            ELSE
                UPDATE consolidado_faltantes SET COFA_IDDES = NEW.repr_id, COFA_OK = 'S' WHERE COFA_ID = :consolida AND COFA_ITEM = NEW.RPVD_ITEM AND ARTI_COD = NEW.arti_cod;
            END
        END
    /* ACTUALICE EL STAND */
    if (new.rpvd_stand is not null) then
      if (exists(select stand_cod from stands where arti_cod = new.arti_cod and stand_bodega = new.bode_cod)) then
        UPDATE stands set stand_cod = new.rpvd_stand where arti_cod = new.arti_cod and stand_bodega = new.bode_cod;
      else
        INSERT INTO stands (ARTI_COD, STAND_BODEGA, STAND_COD) VALUES (NEW.arti_cod, NEW.bode_cod, NEW.rpvd_stand);
    END
END
^

SET TERM ; ^


SET TERM ^ ;

CREATE OR ALTER TRIGGER REMISION_PROVEEDOR_DET_AU FOR REMISION_PROVEEDOR_DET
ACTIVE AFTER UPDATE POSITION 0
AS
declare variable fec date;
declare variable CONC VARCHAR(60);
declare variable Pref varchar(4);
declare variable Num varchar(6);
declare variable factor numeric(18,4);
declare variable EXISTE CHAR(1);
declare variable NIT VARCHAR(20);
declare variable NUMPROV VARCHAR(20);
declare variable Tipo integer;
declare variable idfact integer;
declare variable numrows integer;
declare variable IVAINC CHAR(2);
declare variable COSTO NUMERIC(18,2);
declare variable CANTREL NUMERIC(18,4);
declare variable NUMPED VARCHAR(30);
declare variable CONSO CHAR(2);
declare variable CONSOLIDA INTEGER;
declare variable DTOPIE NUMERIC(18,2);
declare variable ADICIONAL NUMERIC(18,2);
declare variable TOTAL NUMERIC(18,2);
declare variable IVAMONTO NUMERIC(18,2);
declare variable EXTRA NUMERIC(18,2);
declare variable FACT NUMERIC(18,4);
declare variable MENORV CHAR(2);
BEGIN
if ((OLD.repr_id <> 0) AND (OLD.rpvd_anulado = 'N')) then
    begin
    DELETE FROM MOVIMIENTO_ARTICULO WHERE (mvar_tipodoc = 22) and (mvar_idref = new.repr_id) and (mvar_item = old.rpvd_item);
    select REPR_CONSOLIDA from remision_proveedor where repr_id = old.repr_id into :CONSOLIDA;
    if (CONSOLIDA <> 0) then
        begin
        EXECUTE PROCEDURE LEE_CONFIGURACION ('COMPRAS','DOCUMENTOS','SUMAR CANTIDADES PENDIENTES AL CONSOLIDAR DOCUMENTOS') returning_values (CONSO);
        SELECT COUNT(CEFA_ITEM) FROM consolide_faltantes WHERE CEFA_ID = :CONSOLIDA INTO :NUMROWS;
        if ((NUMROWS = 1) OR (CONSO = 'NO')) then
            UPDATE consolidado_faltantes SET COFA_OK = 'N' WHERE COFA_ID = :consolida AND COFA_ITEM = old.RPVD_ITEM AND ARTI_COD = old.arti_cod;
        else
            UPDATE consolidado_faltantes SET COFA_OK = 'N' WHERE COFA_ID = :consolida;
        END
    end
/* Registre el nuevo */
if ((new.repr_id <> 0) AND (new.rpvd_anulado = 'N')) then
    begin
    select repr_fecha, pref_pre, repr_numero, repr_imptos, terc_nit, REPR_NUMPROV, REPR_ORDEN, REPR_CONSOLIDA, repr_dtomonto, repr_adicional, repr_total, repr_ivamonto, repr_extra
        from remision_proveedor where repr_id = new.repr_id
        into :fec, :Pref, :Num, :IVAINC, :NIT, :NUMPROV, :numped, :CONSOLIDA, :dtopie, :adicional, :total, :ivamonto, :extra;
    CONC = 'REMISION PROVEEDOR No.' || PREF || NUM || '-' || NUMPROV;
    if (numped <> '') then
        conc = conc || '-ORDEN ' || NUMPED;
    SELECT MAX(CEFA_TIPOORI) FROM consolide_faltantes WHERE CEFA_ID = :CONSOLIDA INTO :TIPO;
    if (Tipo is null) then
        Tipo = 0;
    select FACO_ID from FACTURAS_COMPRA WHERE FACO_CONSOLIDA = :consolida INTO :IDFACT;
    if (Idfact is null) then
        Idfact = 0;
    /* si se hizo con base en una factura que afecto el inventario no afecte inventario */
    numrows = 0;
    if (Tipo = 21) Then
        select count(*) from movimiento_articulo where mvar_tipodoc = 21 and mvar_idref = :idfact into :numrows;
    if (numrows is null) then
        numrows = 0;
    if (numrows = 0) then
        begin
        execute procedure factor_unidad_cant(new.arti_cod, new.rpvd_unidad) returning_values(factor);
        COSTO = ((new.rpvd_prunit - NEW.rpvd_dtomonto) / :factor);
        if (IVAINC = 'S') then
            COSTO = COSTO / (1 + NEW.rpvd_ivaporc/100);
        EXECUTE PROCEDURE lee_configuracion('COMPRAS','FACTURAS','DESCUENTO Y VALOR ADICIONAL DEL DOCUMENTO COMO MENOR VALOR DEL COSTO') returning_values (:MENORV);
        if (MENORV = 'SI') then
            BEGIN
            FACT = (TOTAL - EXTRA - IVAMONTO);
            if ((FACT - ADICIONAL + DTOPIE) <> 0) then
                FACT = FACT / (FACT - ADICIONAL + DTOPIE);
            ELSE
                FACT = 1;
            COSTO = COSTO * FACT;
            END
        INSERT INTO MOVIMIENTO_ARTICULO
            (ARTI_COD, MVAR_CONS, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM, TERC_NIT)
            VALUES(NEW.ARTI_COD, GEN_ID(ID_MOVARTI,1), NEW.BODE_COD, :FEC, 22, NEW.repr_id,
            :CONC, :factor * new.rpvd_cant, :COSTO, 'S', new.rpvd_lote, :Pref, :Num, new.rpvd_item, :Nit);
            
        /* RECORRA LAS LISTAS DE PRECIOS Y CAMBIE EL PRECIO */
        EXECUTE PROCEDURE CALCULA_PRECIOS(NEW.ARTI_COD, :FEC);
          
        if (COSTO > 0 ) then
         BEGIN
          /* GRABE PROV X ARTICULO */
          EXISTE = 'N';
          SELECT 'S' FROM PROVEEDOR_ARTICULO WHERE TERC_NIT = :NIT AND ARTI_COD = NEW.ARTI_COD INTO :EXISTE;
          if (EXISTE = 'S') then
            UPDATE PROVEEDOR_ARTICULO
                SET PVAR_FECHA = :FEC, PVAR_COSTO = :COSTO, PVAR_COD = NEW.rpvd_codprov
                WHERE TERC_NIT = :NIT AND ARTI_COD = NEW.ARTI_COD;
          ELSE
            INSERT INTO PROVEEDOR_ARTICULO (TERC_NIT, ARTI_COD, PVAR_COSTO, PVAR_FECHA, PVAR_COD,PVAR_DES)
                VALUES (:NIT, NEW.ARTI_COD, :COSTO, :FEC, NEW.rpvd_codprov,NEW.rpvd_desc);
         END
        end
    if (CONSOLIDA <> 0) then
        BEGIN
        EXECUTE PROCEDURE LEE_CONFIGURACION ('COMPRAS','DOCUMENTOS','SUMAR CANTIDADES PENDIENTES AL CONSOLIDAR DOCUMENTOS') returning_values (CONSO);
        /* IGNORE LA CONSOLIDACION SI SE VALIDAN CODIGOS DE LA ORDEN */
        SELECT MIN(CEFA_TIPOORI) FROM consolide_faltantes WHERE CEFA_ID = :CONSOLIDA INTO :NUMROWS;
        if (NUMROWS = 23) then
            BEGIN
            EXECUTE PROCEDURE LEE_CONFIGURACION('COMPRAS', 'REMISIONES', 'VERIFICAR CODIGOS DE LA ORDEN') returning_values (MENORV);
            if (MENORV = 'SI') then
                CONSO = 'NO';
            END
        SELECT COUNT(CEFA_ITEM) FROM consolide_faltantes WHERE CEFA_ID = :CONSOLIDA INTO :NUMROWS;
        if ((CONSO = 'SI') AND (NUMROWS > 1)) then
            UPDATE consolidado_faltantes SET COFA_IDDES = NEW.repr_id, COFA_OK = 'S' WHERE COFA_ID = :consolida;
        ELSE
            BEGIN
            /* BUSQUE EL CONSOLIDADO EN EL MISMO ITEM Y SI ES DIFERENTE ACTUALICELO */
            select COFA_CANT * COFA_FACTOR FROM consolidado_faltantes WHERE COFA_ID = :consolida AND COFA_ITEM = NEW.RPVD_ITEM AND ARTI_COD = NEW.arti_cod INTO :CANTREL;
            if (NEW.RPVD_CANT * NEW.RPVD_FACTOR < CANTREL) then
                UPDATE consolidado_faltantes SET COFA_IDDES = NEW.repr_id, COFA_CANT = NEW.RPVD_CANT, COFA_FACTOR = NEW.RPVD_FACTOR
                    WHERE COFA_ID = :consolida AND COFA_ITEM = NEW.RPVD_ITEM AND ARTI_COD = NEW.arti_cod;
            else
                UPDATE consolidado_faltantes SET COFA_IDDES = NEW.repr_id, COFA_OK = 'S' WHERE COFA_ID = :consolida AND COFA_ITEM = NEW.RPVD_ITEM AND ARTI_COD = NEW.arti_cod;
            END
        END
    /* ACTUALICE EL STAND */
    if (new.rpvd_stand is not null) then
      if (exists(select stand_cod from stands where arti_cod = new.arti_cod and stand_bodega = new.bode_cod)) then
        UPDATE stands set stand_cod = new.rpvd_stand where arti_cod = new.arti_cod and stand_bodega = new.bode_cod;
      else
        INSERT INTO stands (ARTI_COD, STAND_BODEGA, STAND_COD) VALUES (NEW.arti_cod, NEW.bode_cod, NEW.rpvd_stand);
    END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER ENTRADAS_DETALLE_AU FOR ENTRADAS_DETALLE
ACTIVE AFTER UPDATE POSITION 0
as
declare variable fec date;
declare variable CONC VARCHAR(60);
declare variable Pref varchar(4);
declare variable Num varchar(6);
declare variable Nit varchar(20);
declare variable factor numeric(18,4);
declare variable IVAINC CHAR(2);
declare variable COSTO NUMERIC(18,2);
BEGIN
if ((OLD.entr_id <> 0) AND (OLD.ende_anulado = 'N')) then
    DELETE FROM MOVIMIENTO_ARTICULO WHERE (mvar_tipodoc = 11) and (mvar_idref = new.entr_id) and (mvar_item = old.ende_item);
if ((NEW.entr_id <> 0) AND (NEW.ende_anulado = 'N')) then
    begin
    select entr_fecha, entr_conc, pref_pre, entr_numero, terc_nit, entr_imptos
        from entradas where entr_id = new.entr_id
        into :fec, :conc, :Pref, :Num, :Nit, :ivainc;
    execute procedure factor_unidad_cant(new.arti_cod, new.ende_unidad) returning_values(factor);
    COSTO = ((new.ende_costo - NEW.ende_dtomonto) / :factor);
    if (IVAINC = 'S') then
        COSTO = COSTO / (1 + NEW.ende_ivaporc/100);
    INSERT INTO MOVIMIENTO_ARTICULO
        (ARTI_COD, MVAR_CONS, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM, TERC_NIT)
        VALUES(NEW.ARTI_COD, GEN_ID(ID_MOVARTI,1), NEW.BODE_COD, :FEC, 11, NEW.entr_id,
        :CONC, :factor * new.ende_cant, :COSTO, 'S', new.ende_lote, :Pref, :Num, new.ende_item, :Nit);
    /* RECORRA LAS LISTAS DE PRECIOS Y CAMBIE EL PRECIO */
    EXECUTE PROCEDURE CALCULA_PRECIOS(NEW.ARTI_COD, :FEC);
    /* ACTUALICE EL STAND */
    if (new.ende_stand is not null) then
      if (exists(select stand_cod from stands where arti_cod = new.arti_cod and stand_bodega = new.bode_cod)) then
        UPDATE stands set stand_cod = new.ende_stand where arti_cod = new.arti_cod and stand_bodega = new.bode_cod;
      else
        INSERT INTO stands (ARTI_COD, STAND_BODEGA, STAND_COD) VALUES (NEW.arti_cod, NEW.bode_cod, NEW.ende_stand);
    END
END
^

SET TERM ; ^

SET TERM ^ ;

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

        if (COSTO > 0 ) then
         BEGIN
          /* ACTUALICE EL COSTO POR PROVEEDOR */
          SELECT PVAR_FECHA FROM PROVEEDOR_ARTICULO
            WHERE TERC_NIT = :Nit AND ARTI_COD = NEW.ARTI_COD
            INTO :FECAUX;
          if (FECAUX IS NULL) then
            INSERT INTO PROVEEDOR_ARTICULO (TERC_NIT, ARTI_COD, PVAR_COSTO, PVAR_FECHA, PVAR_COD,PVAR_DES)
                VALUES (:Nit, NEW.ARTI_COD, :COSTO, :fec, NEW.fcde_codprov,NEW.fcde_desc);
          else
            UPDATE PROVEEDOR_ARTICULO
                SET PVAR_COSTO = :COSTO, PVAR_FECHA = :fec, PVAR_COD = NEW.fcde_codprov
                WHERE ARTI_COD = NEW.ARTI_COD AND TERC_NIT = :Nit;
         END
        /* RECORRA LAS LISTAS DE PRECIOS Y CAMBIE EL PRECIO */
        EXECUTE PROCEDURE CALCULA_PRECIOS(NEW.ARTI_COD, :FEC);
        END /* AFECTAR INV */
    EXECUTE PROCEDURE lee_configuracion('COMPRAS', 'FACTURAS', 'ACTUALIZAR COSTOS DE LA REMISION RELACIONADA AL GRABAR LA FACTURA') returning_values (:ACTREM);
    if ((ACTREM = 'SI') and (Tipo = 22)) then
        BEGIN
        numrows = 0;
        select mvar_cons, MVAR_ITEM, MVAR_FECHA, MVAR_IDREF, MVAR_CANT, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO
            from movimiento_articulo M, consolidado_faltantes C
            where C.cofa_id = :CONSOLIDA AND mvar_tipodoc = 22 and mvar_idref = C.cofa_idori AND C.cofa_tipoori = 22 and m.arti_cod = new.arti_cod
            into :numrows, :iterem, :fecrem, :idrem, :cantrem, :loterem, :prefrem, :numrem;
        
        if (numrows <> 0) then
            BEGIN
            DELETE FROM MOVIMIENTO_ARTICULO WHERE MVAR_CONS = :numrows;
            INSERT INTO MOVIMIENTO_ARTICULO
                (ARTI_COD, MVAR_CONS, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM, TERC_NIT)
                VALUES(NEW.ARTI_COD, GEN_ID(ID_MOVARTI,1), NEW.BODE_COD, :fecrem, 22, :idrem,
                :CONC, :cantrem, :costo, 'S', :loterem, :prefrem, :numrem, :iterem, :Nit);
        
            if (COSTO > 0 ) then
                BEGIN
                /* ACTUALICE EL COSTO POR PROVEEDOR */
                SELECT PVAR_FECHA FROM PROVEEDOR_ARTICULO
                    WHERE TERC_NIT = :Nit AND ARTI_COD = NEW.ARTI_COD
                    INTO :FECAUX;
                if (FECAUX IS NULL) then
                    INSERT INTO PROVEEDOR_ARTICULO (TERC_NIT, ARTI_COD, PVAR_COSTO, PVAR_FECHA, PVAR_COD,PVAR_DES)
                        VALUES (:Nit, NEW.ARTI_COD, :COSTO, :fec, NEW.fcde_codprov,NEW.fcde_desc);
                else
                    UPDATE PROVEEDOR_ARTICULO
                        SET PVAR_COSTO = :COSTO, PVAR_FECHA = :fec, PVAR_COD = NEW.fcde_codprov
                        WHERE ARTI_COD = NEW.ARTI_COD AND TERC_NIT = :Nit;
                END
            /* RECORRA LAS LISTAS DE PRECIOS Y CAMBIE EL PRECIO */
            EXECUTE PROCEDURE CALCULA_PRECIOS(NEW.ARTI_COD, :FEC);
            END
        END

    /* ACTUALICE EL PENDIENTE  */
    if (CONSOLIDA <> 0) then
        BEGIN
        UPDATE consolidado_faltantes SET COFA_OK = 'S' WHERE COFA_ID = :consolida AND COFA_ITEM = NEW.FCDE_ITEM AND ARTI_COD = NEW.arti_cod;
        EXECUTE procedure LEE_CONFIGURACION ('COMPRAS','DOCUMENTOS','SUMAR CANTIDADES PENDIENTES AL CONSOLIDAR DOCUMENTOS') returning_values (CONSO);
        /* IGNORE LA CONSOLIDACION SI SE VALIDAN CODIGOS DE LA ORDEN */
        SELECT MIN(CEFA_TIPOORI) FROM consolide_faltantes WHERE CEFA_ID = :CONSOLIDA INTO :NUMROWS;
        if (NUMROWS = 23) then
            BEGIN
            EXECUTE PROCEDURE LEE_CONFIGURACION('COMPRAS', 'FACTURAS', 'VERIFICAR CODIGOS DE LA ORDEN') returning_values (MENORV);
            if (MENORV = 'SI') then
                CONSO = 'NO';
            END
        SELECT COUNT(CEFA_ITEM) FROM consolide_faltantes WHERE CEFA_ID = :CONSOLIDA INTO :NUMROWS;
        if ((CONSO = 'SI') AND (NUMROWS > 1)) then
            UPDATE consolidado_faltantes SET COFA_IDDES = NEW.faco_id, COFA_OK = 'S' WHERE COFA_ID = :consolida;
        else
            BEGIN
            /* BUSQUE EL CONSOLIDADO EN EL MISMO ITEM Y SI ES DIFERENTE ACTUALICELO */
            select COFA_CANT * COFA_FACTOR FROM consolidado_faltantes WHERE COFA_ID = :consolida AND COFA_ITEM = NEW.FCDE_ITEM AND ARTI_COD = NEW.arti_cod INTO :CANTREL;
            if (NEW.FCDE_CANT * NEW.FCDE_FACTOR < CANTREL) then
                UPDATE consolidado_faltantes SET COFA_IDDES = NEW.faco_id, COFA_CANT = NEW.FCDE_CANT, COFA_FACTOR = NEW.FCDE_FACTOR
                    WHERE COFA_ID = :consolida AND COFA_ITEM = NEW.FCDE_ITEM AND ARTI_COD = NEW.arti_cod;
            END
        END
    /* ACTUALICE EL STAND */
    if (new.fcde_stand is not null) then
      if (exists(select stand_cod from stands where arti_cod = new.arti_cod and stand_bodega = new.bode_cod)) then
        UPDATE stands set stand_cod = new.fcde_stand where arti_cod = new.arti_cod and stand_bodega = new.bode_cod;
      else
        INSERT INTO stands (ARTI_COD, STAND_BODEGA, STAND_COD) VALUES (NEW.arti_cod, NEW.bode_cod, NEW.fcde_stand);
    END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER FACTCOMP_DETALLE_AU FOR FACTURAS_COMPRAS_DETALLE
ACTIVE AFTER UPDATE POSITION 0
as
declare variable fec date;
declare variable fecaux date;
declare variable AUX varchar(90);
declare variable CONC VARCHAR(60);
declare variable Pref varchar(4);
declare variable Num varchar(6);
declare variable Nit varchar(20);
declare variable factor numeric(18,4);
declare variable TIPO INTEGER;
declare variable INVFAC CHAR(2);
declare variable IVAINC CHAR(2);
declare variable COSTO NUMERIC(18,2);
declare variable CANTREL NUMERIC(18,4);
declare variable NUMPROV VARCHAR(10);
declare variable NUMPED VARCHAR(30);
declare variable NUMREM VARCHAR(30);
declare variable CONSO VARCHAR(2);
declare variable CONSOLIDA INTEGER;
declare variable NUMROWS INTEGER;
declare variable DTOPIE NUMERIC(18,2);
declare variable ADICIONAL NUMERIC(18,2);
declare variable TOTAL NUMERIC(18,2);
declare variable IVAMONTO NUMERIC(18,2);
declare variable EXTRA NUMERIC(18,2);
declare variable FACT NUMERIC(18,4);
declare variable MENORV CHAR(2);
declare variable ACTREM CHAR(2);
declare variable FECREM date;
declare variable IDREM INTEGER;
declare variable ITEREM INTEGER;
declare variable CANTREM NUMERIC(18,4);
declare variable LOTEREM VARCHAR(15);
declare variable PREFREM CHAR(4);
BEGIN
if (old.fcde_devuelto = new.fcde_devuelto) then
    begin
    /* deshaga lo viejo */
    if ((old.fcde_anulado = 'N') and (OLD.faco_id <> 0)) then
        begin
        select faco_fecha, faco_consolida from facturas_compra where faco_id = old.faco_id into :fec, :consolida;
        DELETE FROM MOVIMIENTO_ARTICULO WHERE (mvar_tipodoc = 21) and (mvar_idref = old.faco_id) and (mvar_item = old.fcde_item);
        /* RECORRA LAS LISTAS DE PRECIOS Y CAMBIE EL PRECIO */
        EXECUTE PROCEDURE CALCULA_PRECIOS(old.ARTI_COD, :FEC);
        /* LOS PENDIENTES */
        if (CONSOLIDA <> 0) then
            BEGIN
            UPDATE consolidado_faltantes SET COFA_OK = 'N' WHERE COFA_ID = :consolida AND COFA_ITEM = old.FCDE_ITEM AND ARTI_COD = old.arti_cod;
            SELECT COUNT(CEFA_ITEM) FROM consolide_faltantes WHERE CEFA_ID = :CONSOLIDA INTO :NUMROWS;
            EXECUTE procedure LEE_CONFIGURACION ('COMPRAS','DOCUMENTOS','SUMAR CANTIDADES PENDIENTES AL CONSOLIDAR DOCUMENTOS') returning_values (CONSO);
            /* IGNORE LA CONSOLIDACION SI SE VALIDAN CODIGOS DE LA ORDEN */
            SELECT MIN(CEFA_TIPOORI) FROM consolide_faltantes WHERE CEFA_ID = :CONSOLIDA INTO :NUMROWS;
            if (NUMROWS = 23) then
                BEGIN
                EXECUTE PROCEDURE LEE_CONFIGURACION('COMPRAS', 'FACTURAS', 'VERIFICAR CODIGOS DE LA ORDEN') returning_values (MENORV);
                if (MENORV = 'SI') then
                    CONSO = 'NO';
                END
            if (CONSO = 'SI') then
                UPDATE consolidado_faltantes SET COFA_OK = 'N' WHERE COFA_ID = :consolida;
            END
        end
    /* Registre el nuevo */
    if ((new.fcde_anulado = 'N') and (new.faco_id <> 0)) then
        BEGIN
        select faco_fecha, pref_pre, faco_numero, terc_nit, faco_imptos, faco_numprov, faco_remision, faco_orden, faco_consolida, faco_dtomonto, faco_adicional, faco_total, faco_ivamonto, faco_extra
            from facturas_compra where faco_id = new.faco_id
            into :fec, :Pref, :Num, :Nit, :ivainc, :numprov, :numrem, :numped, :consolida, :dtopie, :adicional, :total, :ivamonto, :extra;
        conc = 'FACTURA DE COMPRA No.' || PREF || NUM || '-' || NUMPROV;
        if (NUMREM <> '') then
            BEGIN
            AUX = SUBSTR(NUMREM, 1, 15);
            conc = conc || '-REM:' || AUX;
            END
        else
            if (NUMPED <> '') then
                BEGIN
                AUX = SUBSTR(NUMPED, 1, 15);
                conc = conc || '-ORDEN ' || AUX;
                END
        SELECT MAX(CEFA_TIPOORI) FROM consolide_faltantes WHERE CEFA_ID = :CONSOLIDA INTO :TIPO;
        if (Tipo is null) then
            Tipo = 0;
        execute procedure lee_configuracion('COMPRAS', 'FACTURAS', 'AFECTAR INVENTARIO CON LA FACTURA') returning_values (:INVFAC);
        /* si se hizo con base en una remision no afecte inventario */
        if ((Tipo <> 22) and (INVFAC = 'SI')) then
            begin
            execute procedure factor_unidad_cant(new.arti_cod, new.fcde_unidad) returning_values(factor);
            COSTO = ((new.fcde_prunit - NEW.fcde_dtomonto) / :factor);
            if (IVAINC = 'S') then
                COSTO = COSTO / (1 + NEW.fcde_ivaporc/100);
            EXECUTE PROCEDURE lee_configuracion('COMPRAS','FACTURAS','DESCUENTO Y VALOR ADICIONAL DEL DOCUMENTO COMO MENOR VALOR DEL COSTO') returning_values (:MENORV);
            if (MENORV = 'SI') then
                BEGIN
                FACT = (TOTAL - EXTRA - IVAMONTO);
                if ((FACT - ADICIONAL + DTOPIE) <> 0) then
                    FACT = FACT / (FACT - ADICIONAL + DTOPIE);
                ELSE
                    FACT = 1;
                COSTO = COSTO * FACT;
                END
            INSERT INTO MOVIMIENTO_ARTICULO
                (ARTI_COD, MVAR_CONS, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM, TERC_NIT)
                VALUES(NEW.ARTI_COD, GEN_ID(ID_MOVARTI,1), NEW.BODE_COD, :FEC, 21, NEW.faco_id,
                :CONC, :factor * new.fcde_cant, :COSTO, 'S', new.fcde_lote, :Pref, :Num, NEW.fcde_item, :Nit);
            if (COSTO > 0 ) then
             BEGIN
              /* ACTUALICE EL COSTO POR PROVEEDOR */
              SELECT PVAR_FECHA FROM PROVEEDOR_ARTICULO
                WHERE TERC_NIT = :Nit AND ARTI_COD = NEW.ARTI_COD INTO :FECAUX;
              if (FECAUX IS NULL) then
                INSERT INTO PROVEEDOR_ARTICULO (TERC_NIT, ARTI_COD, PVAR_COSTO, PVAR_FECHA, PVAR_COD,PVAR_DES)
                    VALUES (:Nit, NEW.ARTI_COD, :COSTO, :fec, NEW.fcde_codprov,NEW.fcde_desc);
              else
                UPDATE PROVEEDOR_ARTICULO
                    SET PVAR_COSTO = :COSTO, PVAR_FECHA = :fec, PVAR_COD = NEW.fcde_codprov
                    WHERE ARTI_COD = NEW.ARTI_COD AND TERC_NIT = :Nit;
             END
            /* RECORRA LAS LISTAS DE PRECIOS Y CAMBIE EL PRECIO */
            EXECUTE PROCEDURE CALCULA_PRECIOS(NEW.ARTI_COD, :FEC);
            end
        EXECUTE PROCEDURE lee_configuracion('COMPRAS', 'FACTURAS', 'ACTUALIZAR COSTOS DE LA REMISION RELACIONADA AL GRABAR LA FACTURA') returning_values (:ACTREM);
        if ((ACTREM = 'SI') and (Tipo = 22)) then
            BEGIN
            numrows = 0;
            select mvar_cons, MVAR_ITEM, MVAR_FECHA, MVAR_IDREF, MVAR_CANT, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO
                from movimiento_articulo M, consolidado_faltantes C
                where C.cofa_id = :CONSOLIDA AND mvar_tipodoc = 22 and mvar_idref = C.cofa_idori AND C.cofa_tipoori = 22 and m.arti_cod = new.arti_cod
                into :numrows, :iterem, :fecrem, :idrem, :cantrem, :loterem, :prefrem, :numrem;
            
            if (numrows <> 0) then
                BEGIN
                DELETE FROM MOVIMIENTO_ARTICULO WHERE MVAR_CONS = :numrows;
                INSERT INTO MOVIMIENTO_ARTICULO
                    (ARTI_COD, MVAR_CONS, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM, TERC_NIT)
                    VALUES(NEW.ARTI_COD, GEN_ID(ID_MOVARTI,1), NEW.BODE_COD, :fecrem, 22, :idrem,
                    :CONC, :cantrem, :costo, 'S', :loterem, :prefrem, :numrem, :iterem, :Nit);
        
                if (COSTO > 0 ) then
                    BEGIN
                    /* ACTUALICE EL COSTO POR PROVEEDOR */
                    SELECT PVAR_FECHA FROM PROVEEDOR_ARTICULO
                        WHERE TERC_NIT = :Nit AND ARTI_COD = NEW.ARTI_COD
                        INTO :FECAUX;
                    if (FECAUX IS NULL) then
                        INSERT INTO PROVEEDOR_ARTICULO (TERC_NIT, ARTI_COD, PVAR_COSTO, PVAR_FECHA, PVAR_COD,PVAR_DES)
                            VALUES (:Nit, NEW.ARTI_COD, :COSTO, :fec, NEW.fcde_codprov,NEW.fcde_desc);
                    else
                        UPDATE PROVEEDOR_ARTICULO
                            SET PVAR_COSTO = :COSTO, PVAR_FECHA = :fec, PVAR_COD = NEW.fcde_codprov
                            WHERE ARTI_COD = NEW.ARTI_COD AND TERC_NIT = :Nit;
                    END
                /* RECORRA LAS LISTAS DE PRECIOS Y CAMBIE EL PRECIO */
                EXECUTE PROCEDURE CALCULA_PRECIOS(NEW.ARTI_COD, :FEC);
                END
            END

        if (CONSOLIDA <> 0) then
            begin
            UPDATE consolidado_faltantes SET COFA_OK = 'S' WHERE COFA_ID = :consolida AND COFA_ITEM = NEW.FCDE_ITEM AND ARTI_COD = NEW.arti_cod;
            EXECUTE procedure LEE_CONFIGURACION ('COMPRAS','DOCUMENTOS','SUMAR CANTIDADES PENDIENTES AL CONSOLIDAR DOCUMENTOS') returning_values (CONSO);
            /* IGNORE LA CONSOLIDACION SI SE VALIDAN CODIGOS DE LA ORDEN */
            SELECT MIN(CEFA_TIPOORI) FROM consolide_faltantes WHERE CEFA_ID = :CONSOLIDA INTO :NUMROWS;
            if (NUMROWS = 23) then
                BEGIN
                EXECUTE PROCEDURE LEE_CONFIGURACION('COMPRAS', 'FACTURAS', 'VERIFICAR CODIGOS DE LA ORDEN') returning_values (MENORV);
                if (MENORV = 'SI') then
                    CONSO = 'NO';
                END
            SELECT COUNT(CEFA_ITEM) FROM consolide_faltantes WHERE CEFA_ID = :CONSOLIDA INTO :NUMROWS;
            if ((CONSO = 'SI') AND (NUMROWS > 1)) then
                UPDATE consolidado_faltantes SET COFA_IDDES = NEW.faco_id, COFA_OK = 'S' WHERE COFA_ID = :consolida;
            else
                BEGIN
                /* BUSQUE EL CONSOLIDADO EN EL MISMO ITEM Y SI ES DIFERENTE ACTUALICELO */
                select COFA_CANT * COFA_FACTOR FROM consolidado_faltantes WHERE COFA_ID = :consolida AND COFA_ITEM = NEW.FCDE_ITEM AND ARTI_COD = NEW.arti_cod INTO :CANTREL;
                if (NEW.FCDE_CANT * NEW.FCDE_FACTOR < CANTREL) then
                    UPDATE consolidado_faltantes SET COFA_IDDES = NEW.faco_id, COFA_CANT = NEW.FCDE_CANT, COFA_FACTOR = NEW.FCDE_FACTOR
                        WHERE COFA_ID = :consolida AND COFA_ITEM = NEW.FCDE_ITEM AND ARTI_COD = NEW.arti_cod;
                END
            end
        /* ACTUALICE EL STAND */
        if (new.fcde_stand is not null) then
          if (exists(select stand_cod from stands where arti_cod = new.arti_cod and stand_bodega = new.bode_cod)) then
            UPDATE stands set stand_cod = new.fcde_stand where arti_cod = new.arti_cod and stand_bodega = new.bode_cod;
          else
            INSERT INTO stands (ARTI_COD, STAND_BODEGA, STAND_COD) VALUES (NEW.arti_cod, NEW.bode_cod, NEW.fcde_stand);
        END
    end
END
^

SET TERM ; ^


/* 2009/01/08B debe llenar los codigos de bodega sin importar el rango */

SET TERM ^ ;

CREATE OR ALTER PROCEDURE IMPR_ORDENCMP(
    ID INTEGER,
    BODINI VARCHAR(2),
    BODFIN VARCHAR(2))
RETURNS (
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    DIASVENCE INTEGER,
    NIT VARCHAR(20),
    NOMTERCERO VARCHAR(60),
    CODBODEGA VARCHAR(2),
    NOMBODEGA VARCHAR(30),
    COTIZACION VARCHAR(30),
    SUBTOTAL NUMERIC(18,2),
    DTOPORC NUMERIC(9,2),
    DTOMONTO NUMERIC(18,2),
    ADICIONAL NUMERIC(18,2),
    IVAMONTO NUMERIC(18,2),
    EXTRA NUMERIC(18,2),
    DTOFPORC NUMERIC(9,2),
    DTOFMONTO NUMERIC(18,2),
    FECHADTO DATE,
    TOTALFAC NUMERIC(18,2),
    OBS BLOB SUB_TYPE 1 SEGMENT SIZE 80,
    BOD1 VARCHAR(2),
    BOD2 VARCHAR(2),
    BOD3 VARCHAR(2),
    BOD4 VARCHAR(2),
    BOD5 VARCHAR(2),
    BOD6 VARCHAR(2),
    BOD7 VARCHAR(2),
    BOD8 VARCHAR(2),
    BOD9 VARCHAR(2),
    BOD0 VARCHAR(2),
    ITEM INTEGER,
    ARTICULO VARCHAR(15),
    CODBAR VARCHAR(15),
    ARTIDES VARCHAR(60),
    ARTIPROV VARCHAR(15),
    CANT NUMERIC(18,4),
    UNIDAD VARCHAR(8),
    BODITEM VARCHAR(2),
    PRUNIT NUMERIC(18,2),
    DTOITPORC NUMERIC(9,2),
    DTOITMONTO NUMERIC(18,2),
    PRNETO NUMERIC(18,2),
    IVAPORC NUMERIC(9,2),
    IVAITMONTO NUMERIC(18,2),
    CONSUMO NUMERIC(18,2),
    TOTAL NUMERIC(18,2),
    CODIGOPR VARCHAR(20),
    ZONACOD VARCHAR(2),
    ZONANOM VARCHAR(30),
    DV CHAR(1),
    DIRECCION VARCHAR(60),
    CIUDAD VARCHAR(40),
    TELEFONO VARCHAR(40),
    CONTACTO VARCHAR(60),
    DIASPAGO INTEGER,
    FAX VARCHAR(25),
    GRUPO VARCHAR(2),
    SUBGRUPO VARCHAR(3),
    MARCA VARCHAR(3),
    PESO NUMERIC(9,4),
    ANCHO NUMERIC(18,4),
    ALTO NUMERIC(18,4),
    LARGO NUMERIC(18,4),
    SUMA1 NUMERIC(18,2),
    SUMA2 NUMERIC(18,2),
    SUMA3 NUMERIC(18,2),
    IVA1 NUMERIC(18,2),
    IVA2 NUMERIC(18,2),
    IVA3 NUMERIC(18,2),
    SUMAEX NUMERIC(18,2),
    SUMAGR NUMERIC(18,2),
    CANTB1 NUMERIC(18,4),
    CANTB2 NUMERIC(18,4),
    CANTB3 NUMERIC(18,4),
    CANTB4 NUMERIC(18,4),
    CANTB5 NUMERIC(18,4),
    CANTB6 NUMERIC(18,4),
    CANTB7 NUMERIC(18,4),
    CANTB8 NUMERIC(18,4),
    CANTB9 NUMERIC(18,4),
    CANTB0 NUMERIC(18,4))
AS
declare variable imptos char(1);
declare variable tarifa integer;
declare variable orden char(2);
declare variable i integer;
declare variable totalitem numeric(18,2);
declare variable ivaitem numeric(18,2);
declare variable cantitem numeric(18,2);
BEGIN
  SELECT PREF_PRE, ORDC_NUMERO, ORDC_FECHA, ORDC_VALIDEZ, O.BODE_COD, BODE_NOM, O.TERC_NIT, TERC_NOM, ORDC_COTIZACION, ORDC_IMPTOS,
    ORDC_DTOPORC, ORDC_DTOMONTO, ORDC_ADICIONAL, ORDC_IVAMONTO, 
    ORDC_EXTRA, ORDC_DTOFPORC, ORDC_DTOFMONTO, ORDC_DTOFECHA, ORDC_TOTAL, TERC_DIR, TERC_CIU, TERC_TEL, TERC_CONTACTO, TERC_FAX, TERC_DV,
    ORDC_OBS,ORDC_DIASPAGO
    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;
    
  SELECT PROV_COD, P.GRPR_COD, GRPR_NOM
    FROM PROVEEDORES P, GRUPOS_PROVEEDORES G
    WHERE TERC_NIT = :NIT AND G.GRPR_COD = P.GRPR_COD
    INTO :CODIGOPR, :ZONACOD, :ZONANOM;
    
  SUBTOTAL = TOTALFAC - EXTRA - IVAMONTO - ADICIONAL + DTOMONTO;
  SUMAEX = 0;
  SUMA1 = 0;
  SUMA2 = 0;
  SUMA3 = 0;
  IVA1 = 0;
  IVA2 = 0;
  IVA3 = 0;

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

SET TERM ; ^


/* 2009/01/08C VALIDEZ DE ORDENES DE COMPRA CONFIGURABLE */

INSERT INTO CONFIGURACION (CONF_MODULO, CONF_CATEGORIA, CONF_PROPIEDAD, CONF_VALOR, CONF_POSIBLES, CONF_AYUDA) VALUES ('COMPRAS', 'ORDENES', 'DIAS DE VALIDEZ PARA LAS ORDENES DE COMPRA', '15', '15,30,60,90,180', 'Indique el número de días de validez para las ordenes de compra');
commit work;

/* 2009/01/08D CONFIGURACIONES DE CORREO POR USUARIO */

ALTER TABLE USUARIO
ADD USER_MAILSERVER VARCHAR(100);
ALTER TABLE USUARIO
ADD USER_MAILUSER VARCHAR(40);
ALTER TABLE USUARIO
ADD USER_MAILPASS VARCHAR(40);

delete from CONFIGURACION
WHERE (CONF_MODULO = 'GENERAL') AND (CONF_CATEGORIA = 'GENERAL') AND (CONF_PROPIEDAD = 'CORREO ELECTRONICO CONTRASEÑA DEL SERVIDOR DE CORREO SALIENTE SMTP');

delete from CONFIGURACION
WHERE (CONF_MODULO = 'GENERAL') AND (CONF_CATEGORIA = 'GENERAL') AND (CONF_PROPIEDAD = 'CORREO ELECTRONICO NOMBRE DEL USUARIO DE CORREO SALIENTE SMTP');

delete from CONFIGURACION
WHERE (CONF_MODULO = 'GENERAL') AND (CONF_CATEGORIA = 'GENERAL') AND (CONF_PROPIEDAD = 'CORREO ELECTRONICO SERVIDOR DE CORREO SALIENTE (SMTP)');

commit work;

/*CAMPO ADMINISTRADORA EN TABLA TERCEROS*/
ALTER TABLE TERCEROS ADD TERC_ADMINI CHAR(1);

/* 2009/01/09 REPETIA EL ULTIMO DOCUMENTO Y ESO CAMBIA EL VALOR DEL CUPO DISPONIBLE */

SET TERM ^ ;

CREATE OR ALTER PROCEDURE VENCIDO_CLIENTE(
    NIT VARCHAR(20),
    FECHA DATE,
    SUCURSAL VARCHAR(10),
    BLOQ CHAR(1))
RETURNS (
    TIPO INTEGER,
    ID INTEGER,
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(6),
    SALDO NUMERIC(18,2),
    RTFTE NUMERIC(18,2),
    RTIVA NUMERIC(18,2),
    RTICA NUMERIC(18,2),
    DTOF NUMERIC(18,2),
    TIPONOM VARCHAR(8))
AS
DECLARE VARIABLE FEC DATE;
declare variable DB CHAR(1);
declare variable VENCE DATE;
declare variable AUTORET VARCHAR(10);
declare variable FAUTORET DATE;
declare variable FECDOC DATE;
declare variable DIAS INTEGER;
declare variable DIASBLOQ INTEGER;
BEGIN
EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'FECHA AUTORETENEDOR NO DESCONTAR RETENCIONES DEL SALDO PERO SI CONTABILIZARLAS') returning_values (AUTORET);
if (AUTORET <> '') then
    FAUTORET = CAST(AUTORET AS DATE);
else
    FAUTORET = '9999/12/31';
/* BUSQUE EN SALDOS_DOC_CARTERA LOS QUE TENGAN SALDO > 0 */
FOR SELECT MVCL_TIPOREF, MVCL_IDREF, MVCL_DEBITO, MVCL_PREFREF, MVCL_NUMREF, MVCL_VENCE, MVCL_FECHA
    FROM MOVIMIENTO_CLIENTES
    WHERE TERC_NIT = :NIT AND ((MVCL_SUCURSAL = :SUCURSAL) or (:SUCURSAL = 0)) AND MVCL_FECHA <= :FECHA AND MVCL_ABONO = 'N'
    INTO :TIPO, :ID, :DB, :PREFIJO, :NUMERO, :VENCE, :FECDOC
    DO
    BEGIN
    EXECUTE PROCEDURE saldo_doc_cartera(TIPO, ID, FECHA, 0) returning_values (SALDO);
    if ((SALDO <> 0) AND (VENCE < FECHA)) then
        BEGIN
        DIAS = fecha - vence;
        SELECT CLIE_DIASBLOQ FROM CLIENTES WHERE TERC_NIT = :NIT INTO :DIASBLOQ;
        if (diasbloq IS NULL) then
            diasbloq = 0;
        if ((BLOQ <> 'S') OR (DIAS > DIASBLOQ)) then
            BEGIN
            SELECT TIDO_NOMCORTO FROM TIPO_DOCUMENTO WHERE TIDO_COD = :TIPO INTO :TIPONOM;
            if (TIPO = 41) then
                SELECT NDCL_DTOFMONTO, NDCL_FECHADTO FROM NOTAS_DEBITO_CLIENTES WHERE NDCL_ID = :ID INTO :DTOF, :FEC;
            if (TIPO = 42) then
                SELECT 0, NCCL_FECHA FROM NOTAS_CREDITO_CLIENTES WHERE NCCL_ID = :ID INTO :DTOF, :FEC;
            if (TIPO = 45) then
                SELECT ANCL_DTOFMONTO, ANCL_DTOFECHA FROM ANTICIPOS_CLIENTE WHERE ANCL_ID = :ID INTO :DTOF, :FEC;
            if (TIPO = 31) then
                SELECT 0, :FECHA FROM FACTURAS WHERE FACT_ID = :ID INTO :DTOF, :FEC;
            if (TIPO = 33) then
                SELECT 0, :FECHA FROM devoluciones_ventas WHERE DEVT_ID = :ID INTO :DTOF, :FEC;
            if (FECHA > FEC) then
                DTOF = 0;
            if (DTOF IS NULL) then
                DTOF = 0;
            if (FAUTORET <= FECDOC) then
                BEGIN
                RTFTE = 0;
                RTIVA = 0;
                RTICA = 0;
                END
            ELSE
                BEGIN
                SELECT SUM(SDCA_RTFTE - SDCA_ABRTFTE), SUM(SDCA_RTIVA - SDCA_ABRTIVA), SUM(SDCA_RTICA - SDCA_ABRTICA)
                    FROM SALDOS_DOC_CARTERA WHERE SDCA_TIPOREF = :TIPO AND SDCA_IDREF = :ID INTO :RTFTE, :RTIVA, :RTICA;
                if (RTFTE IS NULL) then
                    RTFTE = 0;
                if (RTIVA IS NULL) then
                    RTIVA = 0;
                if (RTICA IS NULL) then
                    RTICA = 0;
                END
            SUSPEND;
            END
        END
    END
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE CUPO_DISPONIBLE(
    NIT VARCHAR(20),
    FECHA DATE,
    SUCURSAL VARCHAR(10))
RETURNS (
    DISPONIBLE NUMERIC(18,2))
AS
declare variable SALDO NUMERIC(18,2);
begin /*$$IBE$$ 
SELECT CLIE_CUPO FROM CLIENTES WHERE TERC_NIT = :NIT INTO :DISPONIBLE;
if (DISPONIBLE IS NULL) then
    DISPONIBLE = 0;
SELECT SUM(SALDO) FROM VENCIDO_CLIENTE (:NIT, :FECHA, :SUCURSAL, 'N') INTO :SALDO;
if (SALDO IS NULL) then
    SALDO = 0;
DISPONIBLE = DISPONIBLE - SALDO;
suspend;
SUSPEND;
 $$IBE$$*/ SUSPEND;
end
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE CUPO_DISPONIBLE(
    NIT VARCHAR(20),
    FECHA DATE,
    SUCURSAL VARCHAR(10))
RETURNS (
    DISPONIBLE NUMERIC(18,2))
AS
declare variable SALDO NUMERIC(18,2);
begin
SELECT CLIE_CUPO FROM CLIENTES WHERE TERC_NIT = :NIT INTO :DISPONIBLE;
if (DISPONIBLE IS NULL) then
    DISPONIBLE = 0;
SELECT SUM(SALDO) FROM VENCIDO_CLIENTE (:NIT, :FECHA, :SUCURSAL, 'N') INTO :SALDO;
if (SALDO IS NULL) then
    SALDO = 0;
DISPONIBLE = DISPONIBLE - SALDO;
suspend;
SUSPEND;
end

^

SET TERM ; ^

SET TERM ^ ;

ALTER TRIGGER FACTURAS_BI
AS
declare variable NUMERO VARCHAR(6);
declare variable AUTOM CHAR(1);
declare variable EXISTE CHAR(1);
DECLARE VARIABLE VALCUPO CHAR(10);
declare variable DISPONIBLE NUMERIC(18,2);
declare variable OK CHAR(1);
declare variable SITOT CHAR(2);
declare variable CODCOBR INTEGER;
declare variable CODVEND INTEGER;
declare variable contado char(1);
declare variable BLOQAUTO CHAR(2);
declare variable FECCONTA VARCHAR(8);
declare variable FECBLO VARCHAR(8);
declare variable FECSERVER CHAR(2);
declare variable PREGTASA CHAR(2);
BEGIN
EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION', 'DOCUMENTOS', 'INHABILITAR FECHA EN DOCUMENTOS') returning_values (:fecserver);
if (FECSERVER = 'SI') then
    NEW.fact_fecha = CAST ('NOW' AS DATE);
/* doble moneda */
if ((NEW.fact_trm IS NULL) or (NEW.fact_trm = 0)) then
    NEW.fact_trm = 1;
EXECUTE PROCEDURE LEE_CONFIGURACION('GENERAL', 'GENERAL', 'PREGUNTAR TASA DE CAMBIO EN DOCUMENTOS DE CARTERA') returning_values (:pregtasa);
if (PREGTASA = 'SI') then
    BEGIN
    NEW.fact_dtomonto = NEW.fact_dtomonto * NEW.fact_trm;
    NEW.fact_comimonto = NEW.fact_comimonto * NEW.fact_trm;
    NEW.fact_adicional = NEW.fact_adicional * NEW.fact_trm;
    NEW.fact_ivamonto = NEW.fact_ivamonto * NEW.fact_trm;
    NEW.fact_rtftemonto = NEW.fact_rtftemonto * NEW.fact_trm;
    NEW.fact_rtivamonto = NEW.fact_rtivamonto * NEW.fact_trm;
    NEW.fact_rticamonto = NEW.fact_rticamonto * NEW.fact_trm;
    NEW.fact_extra = NEW.fact_extra * NEW.fact_trm;
    NEW.fact_dtofmonto = NEW.fact_dtofmonto * NEW.fact_trm;
    NEW.fact_total = NEW.fact_total * NEW.fact_trm;
    NEW.fact_dtoit1 = NEW.fact_dtoit1 * NEW.fact_trm;
    NEW.fact_dtoit2 = NEW.fact_dtoit2 * NEW.fact_trm;
    NEW.fact_dtoit3 = NEW.fact_dtoit3 * NEW.fact_trm;
    END
EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION', 'POS', 'CAMBIAR FECHA DE BLOQUEO AUTOMATICAMENTE AL CAMBIAR FECHA DE LA FACTURA') RETURNING_VALUES (:bloqauto);
if (bloqauto = 'SI') then
    BEGIN
    EXECUTE PROCEDURE LEE_CONFIGURACION ('CONTABILIDAD', 'GENERAL', 'FECHA DE BLOQUEO') RETURNING_VALUES (:FECBLO);
    EXECUTE PROCEDURE fecha_a_conta (NEW.fact_fecha) returning_values (:FECCONTA);
    if (FECBLO > FECCONTA) then
        EXCEPTION CONTABILIDAD_BLOQUEADA 'La contabilidad esta bloqueada a ' || :fecblo;
    if (FECBLO < FECCONTA) then
        UPDATE CONFIGURACION
            SET CONF_VALOR = :FECCONTA
            WHERE (CONF_MODULO = 'CONTABILIDAD') AND (CONF_CATEGORIA = 'GENERAL') AND (CONF_PROPIEDAD = 'FECHA DE BLOQUEO');
    END
OK = 'S';
EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'ACCION A TOMAR SI EL CUPO DE CREDITO ES INSUFICIENTE') RETURNING_VALUES (:VALCUPO);
select auto_contado from autorizaciones where pref_pre = new.pref_pre and tido_cod = 31 into :contado;
if (contado='N') then
BEGIN
  IF (VALCUPO = 'PROHIBIR') THEN
  BEGIN
  OK = 'N';
  /* VERIFIQUE EL CUPO DE CREDITO */
  execute procedure cupo_disponible(new.TERC_NIT, NEW.fact_fecha, NEW.fact_sucursal) returning_values (:DISPONIBLE);
  if (DISPONIBLE >= (NEW.FACT_TOTAL-NEW.fact_recibido)) then
    OK = 'S';
  END
END
IF (OK = 'S') THEN
  begin
  /* calcule la comision */
  EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION', 'VENDEDORES', 'COMISIONES EN VENTA INCLUYENDO IMPUESTOS') returning_values (:SITOT);
  if ((NEW.fact_comiporc IS NULL) or (NEW.fact_comiporc = 0)) THEN
    BEGIN
    if (SITOT = 'SI') then
      SELECT MAX(COMI_PORC) FROM comisiones WHERE VEND_COD = NEW.vend_cod AND
        COMI_INICIAL <= NEW.fact_total AND COMI_FINAL >= NEW.fact_total
        INTO NEW.fact_comiporc;
    else
      SELECT MAX(COMI_PORC) FROM comisiones WHERE VEND_COD = NEW.vend_cod AND
        COMI_INICIAL <= (NEW.fact_total -NEW.fact_ivamonto) AND COMI_FINAL >= (NEW.fact_total -NEW.fact_ivamonto)
        INTO NEW.fact_comiporc;
    if (NEW.fact_comiporc IS NULL) then
        NEW.fact_comiporc = 0;
    END
  if (SITOT = 'SI') then
      NEW.fact_comimonto = NEW.fact_total * NEW.fact_comiporc / 100;
  ELSE
      NEW.fact_comimonto = (NEW.fact_total -NEW.fact_ivamonto) * NEW.fact_comiporc / 100;

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

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

SET TERM ; ^

SET TERM ^ ;

ALTER TRIGGER PEDIDOS_BI
AS
declare variable NUMERO VARCHAR(6);
declare variable AUTOM CHAR(1);
declare variable EXISTE CHAR(1);
/*DECLARE VARIABLE VALCUPO CHAR(10);*/
declare variable CUPOPED CHAR(10);
declare variable DISPONIBLE NUMERIC(18,2);
declare variable OK CHAR(1);
declare variable FECSERVER CHAR(2);
BEGIN
EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION', 'DOCUMENTOS', 'INHABILITAR FECHA EN DOCUMENTOS') returning_values (:fecserver);
if (FECSERVER = 'SI') then
    NEW.pedi_fecha = CAST ('NOW' AS DATE);
OK = 'S';
/*EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'ACCION A TOMAR SI EL CUPO DE CREDITO ES INSUFICIENTE') RETURNING_VALUES (:VALCUPO);*/
EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION','PEDIDOS','VALIDAR CUPO DE CREDITO EN EL PEDIDO') RETURNING_VALUES (:CUPOPED);
IF (CUPOPED = 'PROHIBIR') THEN /*AND (CUPOPED = 'SI')) THEN*/
  BEGIN
  OK = 'N';
  /* VERIFIQUE EL CUPO DE CREDITO */
  execute procedure cupo_disponible(new.TERC_NIT, NEW.pedi_fecha, NEW.pedi_sucursal) returning_values (:DISPONIBLE);
  if (DISPONIBLE >= NEW.pedi_total) then
    OK = 'S';
  END
IF (OK = 'S') THEN
  begin
  if (NEW.NUMOK = 'N') then
    BEGIN
    /* Actualice el contador del prefijo */
    SELECT PREF_ACTUAL, PREF_AUTO FROM PREFIJOS WHERE TIDO_COD = 34 AND PREF_PRE = NEW.PREF_PRE INTO :NUMERO, :AUTOM;
    /* ACTUALICE EL NUMERO EN COMPROBANTE_ENCABEZADO  */
    if (AUTOM = 'S') then
        BEGIN
        NEW.PEDI_NUMERO = NUMERO;
        NUMERO = CAST((CAST(NUMERO AS INTEGER) + 1) AS CHAR(6));
        UPDATE PREFIJOS
          SET PREF_ACTUAL = :NUMERO
          WHERE TIDO_COD = 34 AND PREF_PRE = NEW.PREF_PRE;
        END
    ELSE
        BEGIN
        if (CAST(NUMERO AS INTEGER) = CAST(NEW.PEDI_NUMERO AS INTEGER)) then
            UPDATE PREFIJOS
                SET PREF_ACTUAL = CAST((CAST(PREF_ACTUAL AS INTEGER) + 1) AS CHAR(6))
                WHERE TIDO_COD = 34 AND PREF_PRE = NEW.PREF_PRE;
        END
    EXECUTE PROCEDURE COMPLETA_CEROS (NEW.PEDI_numero) returning_values (NEW.PEDI_numero);
    NEW.NUMOK = 'S';
    END
  /* Verifique que el numero no existe previamente */
  EXISTE = 'N';
  SELECT 'S' FROM PEDIDOS WHERE PREF_PRE = NEW.PREF_PRE AND PEDI_NUMERO = NEW.PEDI_NUMERO INTO :EXISTE;
  if (EXISTE = 'S') then
    EXCEPTION DOCUMENTO_REGISTRADO 'Ya existe un pedido con el número ' || new.pref_pre || new.pedi_numero;
  END
else
  begin
  EXCEPTION CUPO_INSUFICIENTE;
  end
if ((new.PEDI_TOTAL-new.PEDI_IVAMONTO+new.PEDI_DTOMONTO-new.PEDI_ADICIONAL) = 0) then
    NEW.PEDI_FACTOR = 1;
else
    NEW.PEDI_FACTOR = (new.PEDI_TOTAL-new.PEDI_IVAMONTO)/(new.PEDI_TOTAL-new.PEDI_IVAMONTO+new.PEDI_DTOMONTO-new.PEDI_ADICIONAL);
END
^

SET TERM ; ^

/* 2009/01/09B QUE APAREZCA EL FORMATO EN EL MODULO DE TESORERIA-CAJA */

INSERT INTO TIPO_DOCUMENTO (TIDO_COD, TIDO_NOMCORTO, TIDO_NOMLARGO, TIDO_MODULO, TIDO_INVE, TIDO_CART, TIDO_CXP, TIDO_CAJA, TIDO_BCOS) VALUES (130, 'CUADCAJA', 'CUADRE DE CAJA', 'CAJA', 'N', 'N', 'N', 'N', 'N');
COMMIT WORK;

/* 2009/01/09C integer overflow al traer peso y dimensiones */

SET TERM ^ ;

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

SET TERM ; ^


/* 2009/01/09D string truncation por clie_cod de 15c */

SET TERM ^ ;

CREATE OR ALTER PROCEDURE REP_CONSECUTIVOS_CARTERA(
    TIPO INTEGER,
    DETALLE CHAR(1),
    PREINI VARCHAR(4),
    PREFIN VARCHAR(4),
    NUMINI VARCHAR(6),
    NUMFIN VARCHAR(6),
    ANULADOS CHAR(1),
    SUBEMPRESA INTEGER)
RETURNS (
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    VENCE DATE,
    CONCEPTO VARCHAR(60),
    NIT VARCHAR(20),
    NOMBRE VARCHAR(60),
    DIR VARCHAR(60),
    CIU VARCHAR(40),
    TEL VARCHAR(40),
    CONTACTO VARCHAR(60),
    FAX VARCHAR(25),
    CEL VARCHAR(25),
    EMAIL VARCHAR(100),
    ITEM INTEGER,
    TIPODOC VARCHAR(8),
    PREFDOC VARCHAR(4),
    NUMDOC VARCHAR(6),
    ABONO NUMERIC(18,2),
    MONTO NUMERIC(18,2),
    IVAPORC NUMERIC(9,2),
    IVAMONTO NUMERIC(18,2),
    RTFTEPORC NUMERIC(9,2),
    RTFTEMONTO NUMERIC(18,2),
    RTIVAPORC NUMERIC(9,2),
    RTIVAMONTO NUMERIC(18,2),
    RTICAPORC NUMERIC(9,2),
    RTICAMONTO NUMERIC(18,2),
    DTOFECHA DATE,
    DTOPORC NUMERIC(9,2),
    DTOMONTO NUMERIC(18,2),
    TOTAL NUMERIC(18,2),
    NETO NUMERIC(18,2),
    CLIE_COD VARCHAR(20),
    ZONA_COD VARCHAR(60),
    COBR_COD INTEGER,
    COBR_NOM VARCHAR(60),
    ANULADO CHAR(1),
    NOMTIPO VARCHAR(30))
AS
BEGIN
/* DETERMINE LA TABLA A EXAMINAR */
  if (BIN_AND(TIPO, 1) <> 0) then
    BEGIN
    SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 41 INTO :NOMTIPO;
    FOR SELECT N.PREF_PRE, NDCL_NUMERO, NDCL_FECHA, NDCL_CONC, N.TERC_NIT, TERC_NOM, TERC_DIR, TERC_CIU, TERC_TEL, TERC_CONTACTO, TERC_FAX, TERC_CEL, TERC_EMAIL, NDCL_VENCE, NDCL_MONTO,
        NDCL_IVAPORC, NDCL_IVAMONTO, NDCL_RTFTEPORC, NDCL_RTFTEMONTO, NDCL_RTIVAPORC, NDCL_RTIVAMONTO, NDCL_RTICAPORC, NDCL_RTICAMONTO, NDCL_FECHADTO, NDCL_DTOFPORC, NDCL_DTOFMONTO, CLIE_COD, N.COBR_COD, COBR_NOM, NDCL_ANULADO, ZONA_COD
        FROM NOTAS_DEBITO_CLIENTES N, TERCEROS T, CLIENTES C, COBRADORES CO, PREFIJOS P
        WHERE N.TERC_NIT = T.TERC_NIT AND T.TERC_NIT = C.TERC_NIT AND N.PREF_PRE >= :PREINI AND N.PREF_PRE <= :PREFIN AND NDCL_NUMERO >= :NUMINI AND NDCL_NUMERO <= :NUMFIN AND N.COBR_COD = CO.COBR_COD
         AND P.PREF_PRE = N.PREF_PRE AND P.TIDO_COD = 41 AND ((P.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
        INTO :PREFIJO, :NUMERO, :FECHA, :CONCEPTO, :NIT, :NOMBRE, :DIR, :CIU, :TEL, :CONTACTO, :FAX, :CEL, :EMAIL, :VENCE, :MONTO, :IVAPORC, :IVAMONTO, :RTFTEPORC, :RTFTEMONTO, :RTIVAPORC, :RTIVAMONTO, :RTICAPORC, :RTICAMONTO, :DTOFECHA, :DTOPORC, :DTOMONTO, :CLIE_COD, :COBR_COD, :COBR_NOM, :ANULADO, :ZONA_COD
        DO
          if ((ANULADOS = 'S') or (ANULADO = 'N'))  then
            BEGIN
            if (anulado = 'S') then
              BEGIN
                IVAPORC = 0;
                MONTO = 0;
                IVAMONTO = 0;
                RTFTEPORC = 0;
                RTFTEMONTO = 0;
                RTIVAPORC = 0;
                RTIVAMONTO = 0;
                RTICAPORC = 0;
                RTICAMONTO = 0;
                DTOPORC = 0;
                DTOMONTO = 0;
                TOTAL = 0;
                NETO = 0;
              END
            ELSE
             BEGIN
              if (IVAMONTO IS NULL) then
                IVAMONTO = 0;
              if (RTFTEMONTO IS NULL) then
                RTFTEMONTO = 0;
              if (RTIVAMONTO IS NULL) then
                RTIVAMONTO = 0;
              if (RTICAMONTO IS NULL) then
                RTICAMONTO = 0;
              if (DTOMONTO IS NULL) then
                DTOMONTO = 0;
              TOTAL = MONTO + IVAMONTO;
              NETO = TOTAL - RTFTEMONTO - RTIVAMONTO - RTICAMONTO;
             END
             SUSPEND;
            END
    END
  if (BIN_AND(TIPO, 2) <> 0) then
    BEGIN
    SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 42 INTO :NOMTIPO;
    FOR SELECT N.PREF_PRE, NCCL_NUMERO, NCCL_FECHA, NCCL_CONC, N.TERC_NIT, TERC_NOM, TERC_DIR, TERC_CIU, TERC_TEL, TERC_CONTACTO, TERC_FAX, TERC_CEL, TERC_EMAIL, NCCL_MONTO,
        NCCL_IVAPORC, NCCL_IVAMONTO, NCCL_RTFTEPORC, NCCL_RTFTEMONTO, NCCL_RTIVAPORC, NCCL_RTIVAMONTO, NCCL_RTICAPORC, NCCL_RTICAMONTO, CLIE_COD, N.COBR_COD, COBR_NOM, NCCL_ANULADO, ZONA_COD
        FROM NOTAS_CREDITO_CLIENTES N, TERCEROS T, CLIENTES C, COBRADORES CO, PREFIJOS P
        WHERE N.TERC_NIT = T.TERC_NIT AND T.TERC_NIT = C.TERC_NIT AND N.PREF_PRE >= :PREINI AND N.PREF_PRE <= :PREFIN AND NCCL_NUMERO >= :NUMINI AND NCCL_NUMERO <= :NUMFIN AND N.COBR_COD = CO.COBR_COD
         AND P.PREF_PRE = N.PREF_PRE AND P.TIDO_COD = 42 AND ((P.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
        INTO :PREFIJO, :NUMERO, :FECHA, :CONCEPTO, :NIT, :NOMBRE, :DIR, :CIU, :TEL, :CONTACTO, :FAX, :CEL, :EMAIL, :MONTO, :IVAPORC, :IVAMONTO, :RTFTEPORC, :RTFTEMONTO, :RTIVAPORC, :RTIVAMONTO, :RTICAPORC, :RTICAMONTO, :CLIE_COD, :COBR_COD, :COBR_NOM, :ANULADO, :ZONA_COD
        DO
          if ((ANULADOS = 'S') or (ANULADO = 'N'))  then
            BEGIN
            if (anulado = 'S') then
             BEGIN
                IVAPORC = 0;
                MONTO = 0;
                IVAMONTO = 0;
                RTFTEPORC = 0;
                RTFTEMONTO = 0;
                RTIVAPORC = 0;
                RTIVAMONTO = 0;
                RTICAPORC = 0;
                RTICAMONTO = 0;
                DTOPORC = 0;
                DTOMONTO = 0;
                TOTAL = 0;
                NETO = 0;
             END
            ELSE
             BEGIN
              if (IVAMONTO IS NULL) then
                IVAMONTO = 0;
              if (RTFTEMONTO IS NULL) then
                RTFTEMONTO = 0;
              if (RTIVAMONTO IS NULL) then
                RTIVAMONTO = 0;
              if (RTICAMONTO IS NULL) then
                RTICAMONTO = 0;
              if (DTOMONTO IS NULL) then
                DTOMONTO = 0;
              TOTAL = MONTO + IVAMONTO;
              NETO = TOTAL - RTFTEMONTO - RTIVAMONTO - RTICAMONTO;
             END
            SUSPEND;
            END
    END
  if (BIN_AND(TIPO, 4) <> 0) then
    BEGIN
    SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 43 INTO :NOMTIPO;
    if (DETALLE = 'S') then
        BEGIN
        FOR SELECT A.PREF_PRE, APCL_NUMERO, APCL_FECHA, APCL_CONCEPTO, A.TERC_NIT, TERC_NOM, TERC_DIR, TERC_CIU, TERC_TEL, TERC_CONTACTO, TERC_FAX, TERC_CEL, TERC_EMAIL,
            ACDE_ITEM, TIDO_NOMCORTO, ACDE_PREFIJO, ACDE_NUMERO, ACDE_APLICADO,
            ACDE_RTFTE, ACDE_RTIVA, ACDE_RTICA, CLIE_COD, A.COBR_COD, COBR_NOM, APCL_ANULADO, ZONA_COD
            FROM APLICACION_CLIENTE A, APLICACION_CLIENTE_DETALLE D, TERCEROS T, CLIENTES C, TIPO_DOCUMENTO TD, COBRADORES CO, PREFIJOS P
            WHERE A.TERC_NIT = T.TERC_NIT AND T.TERC_NIT = C.TERC_NIT AND A.APCL_ID = D.APCL_ID AND A.PREF_PRE >= :PREINI AND A.PREF_PRE <= :PREFIN AND APCL_NUMERO >= :NUMINI AND APCL_NUMERO <= :NUMFIN AND ACDE_TIPODOC = TD.TIDO_COD AND A.COBR_COD = CO.COBR_COD
             AND P.PREF_PRE = A.PREF_PRE AND P.TIDO_COD = 43 AND ((P.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            INTO :PREFIJO, :NUMERO, :FECHA, :CONCEPTO, :NIT, :NOMBRE, :DIR, :CIU, :TEL, :CONTACTO, :FAX, :CEL, :EMAIL, :ITEM, :TIPODOC, :PREFDOC, :NUMDOC, :ABONO, :RTFTEMONTO, :RTIVAMONTO, :RTICAMONTO, :CLIE_COD, :COBR_COD, :COBR_NOM, :ANULADO, :ZONA_COD
            DO
              if ((ANULADOS = 'S') or (ANULADO = 'N'))  then
                BEGIN
                if (anulado = 'S') then
                  BEGIN
                   IVAPORC = 0;
                   ABONO = 0;
                   IVAMONTO = 0;
                   RTFTEPORC = 0;
                   RTFTEMONTO = 0;
                   RTIVAPORC = 0;
                   RTIVAMONTO = 0;
                   RTICAPORC = 0;
                   RTICAMONTO = 0;
                   DTOPORC = 0;
                   DTOMONTO = 0;
                   TOTAL = 0;
                   NETO = 0;
                  END
                ELSE
                  BEGIN
                  if (RTFTEMONTO IS NULL) then
                    RTFTEMONTO = 0;
                  if (RTIVAMONTO IS NULL) then
                    RTIVAMONTO = 0;
                  if (RTICAMONTO IS NULL) then
                    RTICAMONTO = 0;
                  TOTAL = MONTO + IVAMONTO;
                  NETO = TOTAL - RTFTEMONTO - RTIVAMONTO - RTICAMONTO;
                  END
                SUSPEND;
                END
        END
    ELSE
        BEGIN
        FOR SELECT MAX(A.PREF_PRE), MAX(APCL_NUMERO), MAX(APCL_FECHA), MAX(APCL_CONCEPTO), MAX(A.TERC_NIT), MAX(TERC_NOM), MAX(TERC_DIR), MAX(TERC_CIU), MAX(TERC_TEL), MAX(TERC_CONTACTO), MAX(TERC_FAX), MAX(TERC_CEL), MAX(TERC_EMAIL),
            SUM(ACDE_APLICADO), SUM(ACDE_RTFTE), SUM(ACDE_RTIVA), SUM(ACDE_RTICA), MAX(CLIE_COD), MAX(A.COBR_COD), MAX(COBR_NOM), MAX(APCL_ANULADO), MAX(ZONA_COD)
            FROM APLICACION_CLIENTE A, APLICACION_CLIENTE_DETALLE D, TERCEROS T, CLIENTES C, TIPO_DOCUMENTO TD, COBRADORES CO, PREFIJOS P
            WHERE A.TERC_NIT = T.TERC_NIT AND T.TERC_NIT = C.TERC_NIT AND A.APCL_ID = D.APCL_ID AND A.PREF_PRE >= :PREINI AND A.PREF_PRE <= :PREFIN AND APCL_NUMERO >= :NUMINI AND APCL_NUMERO <= :NUMFIN AND ACDE_TIPODOC = TD.TIDO_COD AND A.COBR_COD = CO.COBR_COD
             AND P.PREF_PRE = A.PREF_PRE AND P.TIDO_COD = 43 AND ((P.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY A.APCL_ID
            INTO :PREFIJO, :NUMERO, :FECHA, :CONCEPTO, :NIT, :NOMBRE, :DIR, :CIU, :TEL, :CONTACTO, :FAX, :CEL, :EMAIL, :MONTO, :RTFTEMONTO, :RTIVAMONTO, :RTICAMONTO, :CLIE_COD, :COBR_COD, :COBR_NOM, :ANULADO, :ZONA_COD
            DO
              if ((ANULADOS = 'S') or (ANULADO = 'N'))  then
                BEGIN
                if (anulado = 'S') then
                  BEGIN
                   IVAPORC = 0;
                   MONTO = 0;
                   IVAMONTO = 0;
                   RTFTEPORC = 0;
                   RTFTEMONTO = 0;
                   RTIVAPORC = 0;
                   RTIVAMONTO = 0;
                   RTICAPORC = 0;
                   RTICAMONTO = 0;
                   DTOPORC = 0;
                   DTOMONTO = 0;
                   TOTAL = 0;
                   NETO = 0;
                  END
                ELSE
                  BEGIN
                  if (RTFTEMONTO IS NULL) then
                    RTFTEMONTO = 0;
                  if (RTIVAMONTO IS NULL) then
                    RTIVAMONTO = 0;
                  if (RTICAMONTO IS NULL) then
                    RTICAMONTO = 0;
                  TOTAL = MONTO + IVAMONTO;
                  NETO = TOTAL - RTFTEMONTO - RTIVAMONTO - RTICAMONTO;
                  END
                SUSPEND;
                END
        END
    END
  if (BIN_AND(TIPO, 8) <> 0) then
    BEGIN
    SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 45 INTO :NOMTIPO;
    FOR SELECT A.PREF_PRE, ANCL_NUMERO, ANCL_FECHA, ANCL_CONC, A.TERC_NIT, TERC_NOM, TERC_DIR, TERC_CIU, TERC_TEL, TERC_CONTACTO, TERC_FAX, TERC_CEL, TERC_EMAIL, ANCL_BASE,
        ANCL_IVAPORC, ANCL_IVAMONTO, ANCL_RTFTEPORC, ANCL_RTFTEMONTO, ANCL_RTIVAPORC, ANCL_RTIVAMONTO, ANCL_RTICAPORC, ANCL_RTICAMONTO, ANCL_DTOFECHA, ANCL_DTOFPORC, ANCL_DTOFMONTO, CLIE_COD, A.COBR_COD, COBR_NOM, ANCL_ANULADO, ZONA_COD
        FROM ANTICIPOS_CLIENTE A, TERCEROS T, CLIENTES C, COBRADORES CO, PREFIJOS P
        WHERE A.TERC_NIT = T.TERC_NIT AND T.TERC_NIT = C.TERC_NIT AND A.PREF_PRE >= :PREINI AND A.PREF_PRE <= :PREFIN AND ANCL_NUMERO >= :NUMINI AND ANCL_NUMERO <= :NUMFIN AND A.COBR_COD = CO.COBR_COD
         AND P.PREF_PRE = A.PREF_PRE AND P.TIDO_COD = 45 AND ((P.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
        INTO :PREFIJO, :NUMERO, :FECHA, :CONCEPTO, :NIT, :NOMBRE, :DIR, :CIU, :TEL, :CONTACTO, :FAX, :CEL, :EMAIL, :MONTO, :IVAPORC, :IVAMONTO, :RTFTEPORC, :RTFTEMONTO, :RTIVAPORC, :RTIVAMONTO, :RTICAPORC, :RTICAMONTO, :DTOFECHA, :DTOPORC, :DTOMONTO, :CLIE_COD, :COBR_COD, :COBR_NOM, :ANULADO, :ZONA_COD
        DO
          if ((ANULADOS = 'S') or (ANULADO = 'N'))  then
            BEGIN
            if (anulado = 'S') then
              BEGIN
                IVAPORC = 0;
                MONTO = 0;
                IVAMONTO = 0;
                RTFTEPORC = 0;
                RTFTEMONTO = 0;
                RTIVAPORC = 0;
                RTIVAMONTO = 0;
                RTICAPORC = 0;
                RTICAMONTO = 0;
                DTOPORC = 0;
                DTOMONTO = 0;
                TOTAL = 0;
                NETO = 0;
              END
            ELSE
              BEGIN
              if (IVAMONTO IS NULL) then
                IVAMONTO = 0;
              if (RTFTEMONTO IS NULL) then
                RTFTEMONTO = 0;
              if (RTIVAMONTO IS NULL) then
                RTIVAMONTO = 0;
              if (RTICAMONTO IS NULL) then
                RTICAMONTO = 0;
              if (DTOMONTO IS NULL) then
                DTOMONTO = 0;
              TOTAL = MONTO + IVAMONTO;
              NETO = TOTAL - RTFTEMONTO - RTIVAMONTO - RTICAMONTO;
              END
            SUSPEND;
            END
    END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER PROCEDURE REP_COMPROBANTES_CARTERA(
    TIPO INTEGER,
    DETALLE CHAR(1),
    FECINI DATE,
    FECFIN DATE,
    PREFIJO VARCHAR(4),
    ANULADOS CHAR(1),
    SUBEMPRESA INTEGER)
RETURNS (
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    VENCE DATE,
    CONCEPTO VARCHAR(60),
    NIT VARCHAR(20),
    NOMBRE VARCHAR(60),
    DIR VARCHAR(60),
    CIU VARCHAR(40),
    TEL VARCHAR(40),
    CONTACTO VARCHAR(60),
    FAX VARCHAR(25),
    CEL VARCHAR(25),
    EMAIL VARCHAR(100),
    ITEM INTEGER,
    TIPODOC VARCHAR(8),
    PREFDOC VARCHAR(4),
    NUMDOC VARCHAR(6),
    ABONO NUMERIC(18,2),
    MONTO NUMERIC(18,2),
    IVAPORC NUMERIC(9,2),
    IVAMONTO NUMERIC(18,2),
    RTFTEPORC NUMERIC(9,2),
    RTFTEMONTO NUMERIC(18,2),
    RTIVAPORC NUMERIC(9,2),
    RTIVAMONTO NUMERIC(18,2),
    RTICAPORC NUMERIC(9,2),
    RTICAMONTO NUMERIC(18,2),
    DTOFECHA DATE,
    DTOPORC NUMERIC(9,2),
    DTOMONTO NUMERIC(18,2),
    TOTAL NUMERIC(18,2),
    NETO NUMERIC(18,2),
    CLIE_COD VARCHAR(20),
    ZONA_COD VARCHAR(60),
    COBR_COD INTEGER,
    COBR_NOM VARCHAR(60),
    ANULADO CHAR(1),
    NOMTIPO VARCHAR(30))
AS
BEGIN
/* DETERMINE LA TABLA A EXAMINAR */
  if (BIN_AND(TIPO, 1) <> 0) then
    BEGIN
    SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 41 INTO :NOMTIPO;
    FOR SELECT N.PREF_PRE, NDCL_NUMERO, NDCL_FECHA, NDCL_CONC, N.TERC_NIT, TERC_NOM, TERC_DIR, TERC_CIU, TERC_TEL, TERC_CONTACTO, TERC_FAX, TERC_CEL, TERC_EMAIL, NDCL_VENCE, NDCL_MONTO,
        NDCL_IVAPORC, NDCL_IVAMONTO, NDCL_RTFTEPORC, NDCL_RTFTEMONTO, NDCL_RTIVAPORC, NDCL_RTIVAMONTO, NDCL_RTICAPORC, NDCL_RTICAMONTO, NDCL_FECHADTO, NDCL_DTOFPORC, NDCL_DTOFMONTO, CLIE_COD, N.COBR_COD, COBR_NOM, NDCL_ANULADO, ZONA_COD
        FROM NOTAS_DEBITO_CLIENTES N, TERCEROS T, CLIENTES C, COBRADORES CO, PREFIJOS P
        WHERE N.TERC_NIT = T.TERC_NIT AND T.TERC_NIT = C.TERC_NIT AND N.COBR_COD = CO.COBR_COD AND NDCL_FECHA >= :FECINI AND NDCL_FECHA <= :FECFIN AND ((:ANULADOS = 'S') or (NDCL_ANULADO = 'N')) AND
        ((:PREFIJO IS NULL) or (:PREFIJO = '') or (P.PREF_PRE = :PREFIJO)) AND P.PREF_PRE = N.PREF_PRE AND P.TIDO_COD = 41 AND ((P.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
        ORDER BY NDCL_FECHA, NDCL_ID
        INTO :PREF, :NUMERO, :FECHA, :CONCEPTO, :NIT, :NOMBRE, :DIR, :CIU, :TEL, :CONTACTO, :FAX, :CEL, :EMAIL, :VENCE, :MONTO, :IVAPORC, :IVAMONTO, :RTFTEPORC, :RTFTEMONTO, :RTIVAPORC, :RTIVAMONTO, :RTICAPORC, :RTICAMONTO, :DTOFECHA, :DTOPORC, :DTOMONTO, :CLIE_COD, :COBR_COD, :COBR_NOM, :ANULADO, :ZONA_COD
        DO
            BEGIN
            if (anulado = 'S') then
              BEGIN
                IVAPORC = 0;
                MONTO = 0;
                IVAMONTO = 0;
                RTFTEPORC = 0;
                RTFTEMONTO = 0;
                RTIVAPORC = 0;
                RTIVAMONTO = 0;
                RTICAPORC = 0;
                RTICAMONTO = 0;
                DTOPORC = 0;
                DTOMONTO = 0;
                TOTAL = 0;
                NETO = 0;
              END
            else
              BEGIN
              if (IVAMONTO IS NULL) then
                IVAMONTO = 0;
              if (RTFTEMONTO IS NULL) then
                RTFTEMONTO = 0;
              if (RTIVAMONTO IS NULL) then
                RTIVAMONTO = 0;
              if (RTICAMONTO IS NULL) then
                RTICAMONTO = 0;
              if (DTOMONTO IS NULL) then
                DTOMONTO = 0;
              TOTAL = MONTO + IVAMONTO;
              NETO = TOTAL - RTFTEMONTO - RTIVAMONTO - RTICAMONTO;
              END
            SUSPEND;
            END
    END
  if (BIN_AND(TIPO, 2) <> 0) then
    BEGIN
    SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 42 INTO :NOMTIPO;
    FOR SELECT N.PREF_PRE, NCCL_NUMERO, NCCL_FECHA, NCCL_CONC, N.TERC_NIT, TERC_NOM, TERC_DIR, TERC_CIU, TERC_TEL, TERC_CONTACTO, TERC_FAX, TERC_CEL, TERC_EMAIL, NCCL_MONTO,
        NCCL_IVAPORC, NCCL_IVAMONTO, NCCL_RTFTEPORC, NCCL_RTFTEMONTO, NCCL_RTIVAPORC, NCCL_RTIVAMONTO, NCCL_RTICAPORC, NCCL_RTICAMONTO, CLIE_COD, N.COBR_COD, COBR_NOM, NCCL_ANULADO, ZONA_COD
        FROM NOTAS_CREDITO_CLIENTES N, TERCEROS T, CLIENTES C, COBRADORES CO, PREFIJOS P
        WHERE N.TERC_NIT = T.TERC_NIT AND T.TERC_NIT = C.TERC_NIT AND N.COBR_COD = CO.COBR_COD AND NCCL_FECHA >= :FECINI AND NCCL_FECHA <= :FECFIN AND ((:PREFIJO IS NULL) or (:PREFIJO = '') or (P.PREF_PRE = :PREFIJO)) AND ((:ANULADOS = 'S') or (NCCL_ANULADO = 'N'))
         AND P.PREF_PRE = N.PREF_PRE AND P.TIDO_COD = 42 AND ((P.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
        ORDER BY NCCL_FECHA, NCCL_ID
        INTO :PREF, :NUMERO, :FECHA, :CONCEPTO, :NIT, :NOMBRE, :DIR, :CIU, :TEL, :CONTACTO, :FAX, :CEL, :EMAIL, :MONTO, :IVAPORC, :IVAMONTO, :RTFTEPORC, :RTFTEMONTO, :RTIVAPORC, :RTIVAMONTO, :RTICAPORC, :RTICAMONTO, :CLIE_COD, :COBR_COD, :COBR_NOM, :ANULADO, :ZONA_COD
        DO
            BEGIN
            if (anulado = 'S') then
              BEGIN
                IVAPORC = 0;
                MONTO = 0;
                IVAMONTO = 0;
                RTFTEPORC = 0;
                RTFTEMONTO = 0;
                RTIVAPORC = 0;
                RTIVAMONTO = 0;
                RTICAPORC = 0;
                RTICAMONTO = 0;
                DTOPORC = 0;
                DTOMONTO = 0;
                TOTAL = 0;
                NETO = 0;
              END
            ELSE
              BEGIN
              if (IVAMONTO IS NULL) then
                IVAMONTO = 0;
              if (RTFTEMONTO IS NULL) then
                RTFTEMONTO = 0;
              if (RTIVAMONTO IS NULL) then
                RTIVAMONTO = 0;
              if (RTICAMONTO IS NULL) then
                RTICAMONTO = 0;
              if (DTOMONTO IS NULL) then
                DTOMONTO = 0;
              TOTAL = MONTO + IVAMONTO;
              NETO = TOTAL - RTFTEMONTO - RTIVAMONTO - RTICAMONTO;
              END
            SUSPEND;
            END
    END
  if (BIN_AND(TIPO, 4) <> 0) then
    BEGIN
    SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 43 INTO :NOMTIPO;
    if (DETALLE = 'S') then
        BEGIN
        FOR SELECT A.PREF_PRE, APCL_NUMERO, APCL_FECHA, APCL_CONCEPTO, A.TERC_NIT, TERC_NOM, TERC_DIR, TERC_CIU, TERC_TEL, TERC_CONTACTO, TERC_FAX, TERC_CEL, TERC_EMAIL,
            ACDE_ITEM, TIDO_NOMCORTO, ACDE_PREFIJO, ACDE_NUMERO, ACDE_APLICADO,
            ACDE_RTFTE, ACDE_RTIVA, ACDE_RTICA, CLIE_COD, A.COBR_COD, COBR_NOM, APCL_ANULADO, ZONA_COD
            FROM APLICACION_CLIENTE A, APLICACION_CLIENTE_DETALLE D, TERCEROS T, CLIENTES C, TIPO_DOCUMENTO TD, COBRADORES CO, PREFIJOS P
            WHERE A.TERC_NIT = T.TERC_NIT AND T.TERC_NIT = C.TERC_NIT AND A.APCL_ID = D.APCL_ID AND ACDE_TIPODOC = TD.TIDO_COD AND A.COBR_COD = CO.COBR_COD AND APCL_FECHA >= :FECINI AND APCL_FECHA <= :FECFIN AND ((:PREFIJO IS NULL)or (:PREFIJO = '') or (A.PREF_PRE = :PREFIJO)) AND ((:ANULADOS = 'S') or (APCL_ANULADO = 'N'))
             AND P.PREF_PRE = A.PREF_PRE AND P.TIDO_COD = 43 AND ((P.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            ORDER BY APCL_FECHA, A.APCL_ID, ACDE_ITEM
            INTO :PREF, :NUMERO, :FECHA, :CONCEPTO, :NIT, :NOMBRE, :DIR, :CIU, :TEL, :CONTACTO, :FAX, :CEL, :EMAIL, :ITEM, :TIPODOC, :PREFDOC, :NUMDOC, :ABONO, :RTFTEMONTO, :RTIVAMONTO, :RTICAMONTO, :CLIE_COD, :COBR_COD, :COBR_NOM, :ANULADO, :ZONA_COD
            DO
                BEGIN
                if (anulado = 'S') then
                 BEGIN
                  IVAPORC = 0;
                  ABONO = 0;
                  IVAMONTO = 0;
                  RTFTEPORC = 0;
                  RTFTEMONTO = 0;
                  RTIVAPORC = 0;
                  RTIVAMONTO = 0;
                  RTICAPORC = 0;
                  RTICAMONTO = 0;
                  DTOPORC = 0;
                  DTOMONTO = 0;
                  TOTAL = 0;
                  NETO = 0;
                 END
                ELSE
                 BEGIN
                  if (RTFTEMONTO IS NULL) then
                    RTFTEMONTO = 0;
                  if (RTIVAMONTO IS NULL) then
                    RTIVAMONTO = 0;
                  if (RTICAMONTO IS NULL) then
                    RTICAMONTO = 0;
                  TOTAL = ABONO + IVAMONTO;
                  NETO = TOTAL - RTFTEMONTO - RTIVAMONTO - RTICAMONTO;
                 END
                SUSPEND;
                END
        END
    ELSE
        BEGIN
        FOR SELECT MAX(A.PREF_PRE), MAX(APCL_NUMERO), MAX(APCL_FECHA), MAX(APCL_CONCEPTO), MAX(A.TERC_NIT), MAX(TERC_NOM), MAX(TERC_DIR), MAX(TERC_CIU), MAX(TERC_TEL), MAX(TERC_CONTACTO), MAX(TERC_FAX), MAX(TERC_CEL), MAX(TERC_EMAIL),
            SUM(ACDE_APLICADO), SUM(ACDE_RTFTE), SUM(ACDE_RTIVA), SUM(ACDE_RTICA), MAX(CLIE_COD), MAX(A.COBR_COD), MAX(COBR_NOM), MAX(APCL_ANULADO), MAX(ZONA_COD)
            FROM APLICACION_CLIENTE A, APLICACION_CLIENTE_DETALLE D, TERCEROS T, CLIENTES C, TIPO_DOCUMENTO TD, COBRADORES CO, PREFIJOS P
            WHERE A.TERC_NIT = T.TERC_NIT AND T.TERC_NIT = C.TERC_NIT AND A.APCL_ID = D.APCL_ID AND ACDE_TIPODOC = TD.TIDO_COD AND A.COBR_COD = CO.COBR_COD AND APCL_FECHA >= :FECINI AND APCL_FECHA <= :FECFIN AND ((:PREFIJO IS NULL) or (:PREFIJO = '') or (A.PREF_PRE = :PREFIJO)) AND ((:ANULADOS = 'S') or (APCL_ANULADO = 'N'))
             AND P.PREF_PRE = A.PREF_PRE AND P.TIDO_COD = 43 AND ((P.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY A.APCL_ID
            INTO :PREF, :NUMERO, :FECHA, :CONCEPTO, :NIT, :NOMBRE, :DIR, :CIU, :TEL, :CONTACTO, :FAX, :CEL, :EMAIL, :MONTO, :RTFTEMONTO, :RTIVAMONTO, :RTICAMONTO, :CLIE_COD, :COBR_COD, :COBR_NOM, :ANULADO, :ZONA_COD
            DO
                BEGIN
                if (anulado = 'S') then
                 BEGIN
                  IVAPORC = 0;
                  MONTO = 0;
                  IVAMONTO = 0;
                  RTFTEPORC = 0;
                  RTFTEMONTO = 0;
                  RTIVAPORC = 0;
                  RTIVAMONTO = 0;
                  RTICAPORC = 0;
                  RTICAMONTO = 0;
                  DTOPORC = 0;
                  DTOMONTO = 0;
                  TOTAL = 0;
                  NETO = 0;
                 END
                ELSE
                 BEGIN
                  if (RTFTEMONTO IS NULL) then
                    RTFTEMONTO = 0;
                  if (RTIVAMONTO IS NULL) then
                    RTIVAMONTO = 0;
                  if (RTICAMONTO IS NULL) then
                    RTICAMONTO = 0;
                  TOTAL = MONTO + IVAMONTO;
                  NETO = TOTAL - RTFTEMONTO - RTIVAMONTO - RTICAMONTO;
                 END
                SUSPEND;
                END
        END
    END
  if (BIN_AND(TIPO, 8) <> 0) then
    BEGIN
    SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 45 INTO :NOMTIPO;
    FOR SELECT A.PREF_PRE, ANCL_NUMERO, ANCL_FECHA, ANCL_CONC, A.TERC_NIT, TERC_NOM, TERC_DIR, TERC_CIU, TERC_TEL, TERC_CONTACTO, TERC_FAX, TERC_CEL, TERC_EMAIL, ANCL_BASE,
        ANCL_IVAPORC, ANCL_IVAMONTO, ANCL_RTFTEPORC, ANCL_RTFTEMONTO, ANCL_RTIVAPORC, ANCL_RTIVAMONTO, ANCL_RTICAPORC, ANCL_RTICAMONTO, ANCL_DTOFECHA, ANCL_DTOFPORC, ANCL_DTOFMONTO, CLIE_COD, A.COBR_COD, COBR_NOM, ANCL_ANULADO, ZONA_COD
        FROM ANTICIPOS_CLIENTE A, TERCEROS T, CLIENTES C, COBRADORES CO, PREFIJOS P
        WHERE A.TERC_NIT = T.TERC_NIT AND T.TERC_NIT = C.TERC_NIT AND A.COBR_COD = CO.COBR_COD AND ANCL_FECHA >= :FECINI AND ANCL_FECHA <= :FECFIN AND ((:PREFIJO IS NULL) or (:PREFIJO = '') or (P.PREF_PRE = :PREFIJO)) AND ((:ANULADOS = 'S') or (ANCL_ANULADO = 'N'))
         AND P.PREF_PRE = A.PREF_PRE AND P.TIDO_COD = 45 AND ((P.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
        ORDER BY ANCL_FECHA, ANCL_ID
        INTO :PREF, :NUMERO, :FECHA, :CONCEPTO, :NIT, :NOMBRE, :DIR, :CIU, :TEL, :CONTACTO, :FAX, :CEL, :EMAIL, :MONTO, :IVAPORC, :IVAMONTO, :RTFTEPORC, :RTFTEMONTO, :RTIVAPORC, :RTIVAMONTO, :RTICAPORC, :RTICAMONTO, :DTOFECHA, :DTOPORC, :DTOMONTO, :CLIE_COD, :COBR_COD, :COBR_NOM, :ANULADO, :ZONA_COD
        DO
            BEGIN
            if (anulado = 'S') then
              BEGIN
                IVAPORC = 0;
                MONTO = 0;
                IVAMONTO = 0;
                RTFTEPORC = 0;
                RTFTEMONTO = 0;
                RTIVAPORC = 0;
                RTIVAMONTO = 0;
                RTICAPORC = 0;
                RTICAMONTO = 0;
                DTOPORC = 0;
                DTOMONTO = 0;
                TOTAL = 0;
                NETO = 0;
              END
            ELSE
              BEGIN
               if (IVAMONTO IS NULL) then
                 IVAMONTO = 0;
               if (RTFTEMONTO IS NULL) then
                 RTFTEMONTO = 0;
               if (RTIVAMONTO IS NULL) then
                 RTIVAMONTO = 0;
               if (RTICAMONTO IS NULL) then
                 RTICAMONTO = 0;
               if (DTOMONTO IS NULL) then
                 DTOMONTO = 0;
               TOTAL = MONTO + IVAMONTO;
               NETO = TOTAL - RTFTEMONTO - RTIVAMONTO - RTICAMONTO;
              END
            SUSPEND;
            END
    END
END
^

SET TERM ; ^

/* 2009/01/10 CODIFICACION AUTOMATICA POR GRUPO */

UPDATE CONFIGURACION
SET CONF_POSIBLES = 'SI,NO,GRUPO',
    CONF_AYUDA = 'SI: El sistema sugerirá automáticamente el código de cada nuevo artículo de acuerdo al consecutivo interno de 6 digitos, NO: El usuario digitará el código, GRUPO: Se asignará el código de grupo más un consecutivo de 3 dígitos'
WHERE (CONF_MODULO = 'INVENTARIO') AND (CONF_CATEGORIA = 'ARTICULOS') AND (CONF_PROPIEDAD = 'CODIFICAR CON NUMERACION CONSECUTIVA');
COMMIT WORK;


/* 2009/01/13 IVA TOTAL COMO SUMA DE LOS IVA 1, 2, Y 3 */

SET TERM ^ ;

CREATE OR ALTER PROCEDURE IMPUESTOS_VENTAS(
    FECINI DATE,
    FECFIN DATE,
    PREFIJO VARCHAR(4),
    PTOINI INTEGER,
    PTOFIN INTEGER,
    ANULADOS CHAR(1),
    SUBEMPRESA INTEGER)
RETURNS (
    TIPO INTEGER,
    NOMTIPO VARCHAR(30),
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    NIT VARCHAR(20),
    NOMTERCERO VARCHAR(60),
    SUBTOTAL NUMERIC(18,2),
    DTOMONTO NUMERIC(18,2),
    ADICIONAL NUMERIC(18,2),
    IVAMONTO NUMERIC(18,2),
    CONSUMO NUMERIC(18,2),
    EXENTOS NUMERIC(18,2),
    GRAVADOS1 NUMERIC(18,2),
    GRAVADOS2 NUMERIC(18,2),
    GRAVADOS3 NUMERIC(18,2),
    IVA1 NUMERIC(18,2),
    IVA2 NUMERIC(18,2),
    IVA3 NUMERIC(18,2),
    EXTRA NUMERIC(18,2),
    TOTAL NUMERIC(18,2),
    RTFTEMONTO NUMERIC(18,2),
    RTIVAMONTO NUMERIC(18,2),
    RTICAMONTO 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);
BEGIN
/* FACTURA */
TIPO = 31;
SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 31 INTO :NOMTIPO;

FOR SELECT FACT_ID, F.PREF_PRE, FACT_NUMERO, FACT_FECHA, TERC_NIT, FACT_NOMCLIENTE, FACT_ADICIONAL-FACT_DTOMONTO, FACT_IVAMONTO, FACT_RTFTEMONTO, FACT_RTIVAMONTO, FACT_RTICAMONTO, FACT_EXTRA, FACT_TOTAL, FACT_ANULADO
    FROM FACTURAS F, PREFIJOS PR WHERE PTVT_ID >= :PTOINI AND PTVT_ID <= :PTOFIN AND
    FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND ((:PREFIJO = '') or (:PREFIJO IS NULL) or (F.PREF_PRE = :PREFIJO))
    AND PR.PREF_PRE = F.PREF_PRE AND PR.TIDO_COD = 31 AND ((PR.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
    ORDER BY FACT_FECHA, F.PREF_PRE, FACT_NUMERO
    INTO :ID, :PREF, :NUMERO, :FECHA, :NIT, :NOMTERCERO, :DTOMONTO, :IVAMONTO, :RTFTEMONTO, :RTIVAMONTO, :RTICAMONTO, :EXTRA, :TOTAL, :ANULADO
    DO
    BEGIN
    SELECT TERC_EXENTO FROM TERCEROS WHERE TERC_NIT = :NIT INTO :TER_EXENTO;
    if ((ANULADOS = 'S') or (ANULADO = 'N')) then
        BEGIN
        if (ANULADO = 'S') then
            BEGIN
            EXENTOS = 0;
            GRAVADOS1 = 0;
            GRAVADOS2 = 0;
            GRAVADOS3 = 0;
            CONSUMO = 0;
            SUBTOTAL = 0;
            TOTAL = 0;
            EXTRA = 0;
            IVAMONTO = 0;
            DTOMONTO = 0;
            NETO = 0;
            RTFTEMONTO = 0;
            RTIVAMONTO = 0;
            RTICAMONTO = 0;
            END
        else
            BEGIN
            /* CALCULE LAS DIFERENTES TARIFAS */
            if (TER_EXENTO = 'S') then
                BEGIN
                SELECT SUM(FADE_TOTAL - FADE_IVAMONTO - FADE_CONSUMO) FROM FACTURAS_DETALLE D WHERE FACT_ID = :ID AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL)) INTO :EXENTOS;
                GRAVADOS1 = 0;
                GRAVADOS2 = 0;
                GRAVADOS3 = 0;
                end
            else
                begin
                SELECT SUM(FADE_TOTAL - FADE_IVAMONTO - FADE_CONSUMO) FROM FACTURAS_DETALLE D WHERE FACT_ID = :ID AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL)) AND FADE_IVAPORC = 0 INTO :EXENTOS;
                SELECT SUM(FADE_TOTAL - FADE_IVAMONTO - FADE_CONSUMO), SUM(FADE_IVAMONTO) FROM FACTURAS_DETALLE D, TARIFA_IVA T WHERE FACT_ID = :ID AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL)) AND FADE_IVAPORC = TAIV_PORC AND TAIV_COD = 1 INTO :GRAVADOS1, :IVA1;
                SELECT SUM(FADE_TOTAL - FADE_IVAMONTO - FADE_CONSUMO), SUM(FADE_IVAMONTO) FROM FACTURAS_DETALLE D, TARIFA_IVA T WHERE FACT_ID = :ID AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL)) AND FADE_IVAPORC = TAIV_PORC AND TAIV_COD = 2 INTO :GRAVADOS2, :IVA2;
                SELECT SUM(FADE_TOTAL - FADE_IVAMONTO - FADE_CONSUMO), SUM(FADE_IVAMONTO) FROM FACTURAS_DETALLE D, TARIFA_IVA T WHERE FACT_ID = :ID AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL)) AND FADE_IVAPORC = TAIV_PORC AND TAIV_COD = 3 INTO :GRAVADOS3, :IVA3;
                end
            if (iva1 is null) then
                iva1 = 0;
            if (iva2 is null) then
                iva2 = 0;
            if (iva3 is null) then
                iva3 = 0;
            IVAMONTO = IVA1 + IVA2 + IVA3;
            SELECT SUM(FADE_CONSUMO) FROM FACTURAS_DETALLE WHERE FACT_ID = :ID AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL)) INTO :CONSUMO;
            SUBTOTAL = TOTAL - EXTRA - IVAMONTO - DTOMONTO;
            NETO = TOTAL - RTFTEMONTO - RTIVAMONTO - RTICAMONTO;
            END
        if (exentos is null) then
            exentos = 0;
        if (gravados1 is null) then
            gravados1 = 0;
        if (gravados2 is null) then
            gravados2 = 0;
        if (gravados3 is null) then
            gravados3 = 0;
        if (consumo is null) then
            consumo = 0;
        SUSPEND;
        END
    END
    
TIPO = 33;
SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 33 INTO :NOMTIPO;
/* DEVOLUCIONES */
FOR SELECT DEVT_ID, D.PREF_PRE, DEVT_NUMERO, DEVT_FECHA, TERC_NIT, DEVT_NOMTERC, DEVT_ADICIONAL-DEVT_DTOMONTO, DEVT_IVAMONTO, DEVT_RTFTEMONTO, DEVT_RTIVAMONTO, DEVT_RTICAMONTO, DEVT_EXTRA, DEVT_TOTAL, DEVT_ANULADO
    FROM DEVOLUCIONES_VENTAS D, PREFIJOS PR WHERE PTVT_ID >= :PTOINI AND PTVT_ID <= :PTOFIN AND
    DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND ((:PREFIJO = '') or (:PREFIJO IS NULL) or (D.PREF_PRE = :PREFIJO))
    AND PR.PREF_PRE = D.PREF_PRE AND PR.TIDO_COD = 33 AND ((PR.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) AND ((DEVT_REMID = 0) or (DEVT_REMID IS NULL))
    ORDER BY DEVT_FECHA, D.PREF_PRE, DEVT_NUMERO
    INTO :ID, :PREF, :NUMERO, :FECHA, :NIT, :NOMTERCERO, :DTOMONTO, :IVAMONTO, :RTFTEMONTO, :RTIVAMONTO, :RTICAMONTO, :EXTRA, :TOTAL, :ANULADO
    DO
    BEGIN
    SELECT TERC_EXENTO FROM TERCEROS WHERE TERC_NIT = :NIT INTO :TER_EXENTO;
    if ((ANULADOS = 'S') or (ANULADO = 'N')) then
        BEGIN
        if (ANULADO = 'S') then
            BEGIN
            EXENTOS = 0;
            GRAVADOS1 = 0;
            GRAVADOS2 = 0;
            GRAVADOS3 = 0;
            CONSUMO = 0;
            SUBTOTAL = 0;
            TOTAL = 0;
            EXTRA = 0;
            IVAMONTO = 0;
            DTOMONTO = 0;
            NETO = 0;
            RTFTEMONTO = 0;
            RTIVAMONTO = 0;
            RTICAMONTO = 0;
            END
        else
            BEGIN
            DTOMONTO = DTOMONTO * -1;
            ADICIONAL = ADICIONAL * -1;
            IVAMONTO = IVAMONTO * -1;
            EXTRA = EXTRA * -1;
            TOTAL = TOTAL * -1;
            RTFTEMONTO = RTFTEMONTO * -1;
            RTIVAMONTO = RTIVAMONTO * -1;
            RTICAMONTO = RTICAMONTO * -1;
            /* CALCULE LAS DIFERENTES TARIFAS */
            if (TER_EXENTO = 'S') then
             BEGIN
              SELECT SUM(DVDE_TOTAL - DVDE_IVAMONTO - DVDE_CONSUMO) FROM DEVOLUCIONES_VENTAS_DETALLE D WHERE DEVT_ID = :ID AND DVDE_REFERENCIA <> '.t' INTO :EXENTOS;
              GRAVADOS1 = 0;
              GRAVADOS2 = 0;
              GRAVADOS3 = 0;
             end
            else
             begin
              SELECT SUM(DVDE_TOTAL - DVDE_IVAMONTO - DVDE_CONSUMO) FROM DEVOLUCIONES_VENTAS_DETALLE D WHERE DEVT_ID = :ID AND DVDE_REFERENCIA <> '.t' AND DVDE_IVAPORC = 0 INTO :EXENTOS;
              SELECT SUM(DVDE_TOTAL - DVDE_IVAMONTO - DVDE_CONSUMO), SUM(DVDE_IVAMONTO) FROM DEVOLUCIONES_VENTAS_DETALLE D, TARIFA_IVA T WHERE DEVT_ID = :ID AND DVDE_REFERENCIA <> '.t' AND DVDE_IVAPORC = TAIV_PORC AND TAIV_COD = 1 INTO :GRAVADOS1, :IVA1;
              SELECT SUM(DVDE_TOTAL - DVDE_IVAMONTO - DVDE_CONSUMO), SUM(DVDE_IVAMONTO) FROM DEVOLUCIONES_VENTAS_DETALLE D, TARIFA_IVA T WHERE DEVT_ID = :ID AND DVDE_REFERENCIA <> '.t' AND DVDE_IVAPORC = TAIV_PORC AND TAIV_COD = 2 INTO :GRAVADOS2, :IVA2;
              SELECT SUM(DVDE_TOTAL - DVDE_IVAMONTO - DVDE_CONSUMO), SUM(DVDE_IVAMONTO) FROM DEVOLUCIONES_VENTAS_DETALLE D, TARIFA_IVA T WHERE DEVT_ID = :ID AND DVDE_REFERENCIA <> '.t' AND DVDE_IVAPORC = TAIV_PORC AND TAIV_COD = 3 INTO :GRAVADOS3, :IVA3;
             end
            if (iva1 is null) then
                iva1 = 0;
            if (iva2 is null) then
                iva2 = 0;
            if (iva3 is null) then
                iva3 = 0;
            IVAMONTO = IVA1 + IVA2 + IVA3;
            SELECT SUM(DVDE_CONSUMO) FROM DEVOLUCIONES_VENTAS_DETALLE WHERE DEVT_ID = :ID AND DVDE_REFERENCIA <> '.t' INTO :CONSUMO;
            SUBTOTAL = TOTAL - EXTRA - IVAMONTO - DTOMONTO;
            NETO = TOTAL - RTFTEMONTO - RTIVAMONTO - RTICAMONTO;
            EXENTOS = EXENTOS * -1;
            GRAVADOS1 = GRAVADOS1 * -1;
            GRAVADOS2 = GRAVADOS2 * -1;
            GRAVADOS3 = GRAVADOS3 * -1;
            CONSUMO = CONSUMO * -1;
            IVA1 = IVA1 * -1;
            IVA2 = IVA2 * -1;
            IVA3 = IVA3 * -1;
            IVAMONTO = IVAMONTO * -1;
            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 (consumo is null) then
            consumo = 0;
        SUSPEND;
        END
    END
execute procedure lee_configuracion ('FACTURACION', 'DOCUMENTOS', 'INCLUIR NOTAS DE CARTERA EN REPORTE DE IMPUESTOS EN VENTAS') returning_values (:NOTAS);
if (NOTAS = 'SI') then
    BEGIN
    TIPO = 41;
    SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 41 INTO :NOMTIPO;
    FOR SELECT NDCL_ID, N.PREF_PRE, NDCL_NUMERO, NDCL_FECHA, N.TERC_NIT, TERC_NOM, 0, NDCL_IVAMONTO, NDCL_RTFTEMONTO, NDCL_RTIVAMONTO, NDCL_RTICAMONTO, 0, NDCL_MONTO+NDCL_IVAMONTO, NDCL_ANULADO
        FROM NOTAS_DEBITO_CLIENTES N, TERCEROS T, PREFIJOS PR WHERE N.TERC_NIT = T.TERC_NIT AND
        NDCL_FECHA >= :FECINI AND NDCL_FECHA <= :FECFIN AND ((:PREFIJO = '') or (:PREFIJO IS NULL) or (N.PREF_PRE = :PREFIJO))
        AND PR.PREF_PRE = N.PREF_PRE AND PR.TIDO_COD = 41 AND ((PR.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
        ORDER BY NDCL_FECHA, N.PREF_PRE, NDCL_NUMERO
        INTO :ID, :PREF, :NUMERO, :FECHA, :NIT, :NOMTERCERO, :DTOMONTO, :IVAMONTO, :RTFTEMONTO, :RTIVAMONTO, :RTICAMONTO, :EXTRA, :TOTAL, :ANULADO
        DO
        BEGIN
        GRAVADOS2 = 0;
        GRAVADOS3 = 0;
        IVA2 = 0;
        IVA3 = 0;
        CONSUMO = 0;
        if (ANULADO = 'S') then
            BEGIN
            EXENTOS = 0;
            GRAVADOS1 = 0;
            SUBTOTAL = 0;
            TOTAL = 0;
            EXTRA = 0;
            IVAMONTO = 0;
            DTOMONTO = 0;
            NETO = 0;
            RTFTEMONTO = 0;
            RTIVAMONTO = 0;
            RTICAMONTO = 0;
            END
        ELSE
            BEGIN
            if (IVAMONTO <> 0) then
                BEGIN
                GRAVADOS1 = TOTAL-IVAMONTO;
                IVA1 = IVAMONTO;
                exentos = 0;
                END
            ELSE
                BEGIN
                GRAVADOS1 = 0;
                IVA1 = 0;
                exentos = TOTAL;
                END
            SUBTOTAL = TOTAL - EXTRA - IVAMONTO - DTOMONTO;
            NETO = TOTAL - RTFTEMONTO - RTIVAMONTO - RTICAMONTO;
            END
        SUSPEND;
        END

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

SET TERM ; ^

/* UTILIDAD DE 100% EN DEVOLUCIONES YA QUE EL COSTO Y LA BASE ESTABAN YA MULTIPLICADOS POR -1 */
SET TERM ^ ;

CREATE OR ALTER PROCEDURE REP_UTILIDAD_VENTAS(
    TIPO INTEGER,
    DETALLE CHAR(1),
    FECINI DATE,
    FECFIN DATE,
    ARTINI VARCHAR(15),
    ARTFIN VARCHAR(15),
    GRPINI VARCHAR(3),
    GRPFIN VARCHAR(3),
    ORDEN CHAR(1),
    AGRUPA CHAR(1),
    CEROS CHAR(1),
    SUBEMPRESA INTEGER)
RETURNS (
    ARTICULO VARCHAR(15),
    DESCRIPCION VARCHAR(60),
    CODGRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    CODSUBG VARCHAR(3),
    NOMSUBG VARCHAR(30),
    CODMARC VARCHAR(3),
    NOMMARC VARCHAR(30),
    UNIDAD VARCHAR(8),
    CANTIDAD NUMERIC(18,4),
    BASE NUMERIC(18,4),
    COSTO NUMERIC(18,4),
    UTILIDAD NUMERIC(18,4),
    PORC NUMERIC(9,2),
    IVA NUMERIC(18,4),
    CONSUMO NUMERIC(18,4),
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    TIPODOC INTEGER)
AS
DECLARE VARIABLE COSTOUNIT NUMERIC(18,4);
declare variable CODINI VARCHAR(15);
declare variable CODFIN VARCHAR(15);
declare variable DESINI VARCHAR(15);
declare variable DESFIN VARCHAR(15);
declare variable MARINI VARCHAR(3);
declare variable MARFIN VARCHAR(3);
declare variable UOM VARCHAR(20);
declare variable NUMROWS INTEGER;
BEGIN
if (ORDEN = 'C') then
    BEGIN
    CODINI = ARTINI;
    CODFIN = ARTFIN;
    DESINI = '';
    DESFIN = 'zz';
    END
ELSE
    BEGIN
    DESINI = ARTINI;
    DESFIN = ARTFIN;
    CODINI = '';
    CODFIN = 'zz';
    END
if (AGRUPA = 'G') then
    BEGIN
    MARINI = '';
    MARFIN = 'zz';
    END
ELSE
    if (AGRUPA = 'M') then
        BEGIN
        MARINI = GRPINI;
        MARFIN = GRPFIN;
        GRPINI = '';
        GRPFIN = 'zz';
        END
    ELSE
        BEGIN
        MARINI = '';
        MARFIN = 'zz';
        GRPINI = '';
        GRPFIN = 'zz';
        END
EXECUTE PROCEDURE lee_configuracion ('FACTURACION', 'ARTICULOS', 'SUGERIR PRECIOS CON PORCENTAJE DE MARGEN O UTILIDAD') returning_values (:UOM);
if (DETALLE = 'N') then
    BEGIN
    if (BIN_AND(TIPO, 1) <> 0) then
        BEGIN
        TIPODOC = 31;
        /* BORRA LA TABLA AUXILIAR */
        DELETE FROM reportes_aux WHERE REPA_ID = 2 AND REPA_USER = USER;

        FOR SELECT MAX(D.ARTI_COD), SUM(FADE_CANT * FADE_FACTOR), SUM((FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO)*FACT_FACTOR), SUM(FADE_IVAMONTO*FACT_FACTOR), SUM(FADE_CONSUMO),
            MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD), SUM(COST_SALP)
            FROM FACTURAS_DETALLE D, FACTURAS F, PREFIJOS P, ARTICULO A, movimiento_articulo m, costos c
            WHERE F.FACT_ID = D.FACT_ID AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND D.ARTI_COD = A.arti_cod AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            F.fact_id = M.mvar_idref AND M.mvar_tipodoc = 31 AND M.mvar_item = D.fade_item AND M.mvar_cons = C.cost_idmov AND
            FACT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) and substring(a.arti_cod from 1 FOR 2) <> '.t'
            GROUP BY D.ARTI_COD
            INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,
            :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :COSTO
            DO
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
/*            EXECUTE PROCEDURE costo_promedio (:ARTICULO, :FECFIN) RETURNING_VALUES (:COSTOUNIT);*/
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
/*            COSTO = cantidad * COSTOUNIT;*/
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                if (COSTO > 0) then
                    PORC = UTILIDAD * 100 / COSTO;
                ELSE
                    PORC = 100;
            else
                if (BASE > 0) then
                    PORC = UTILIDAD * 100 / BASE;
                ELSE
                    PORC = 0;
            if (CEROS = 'S') then
                INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (2, USER, :ARTICULO);
            SUSPEND;
            END /* FOR */
        if (CEROS = 'S') then
            BEGIN
            COSTO = 0;
            UTILIDAD = 0;
            PORC = 0;
            /* agregue los articulos sin factura */
            FOR SELECT ARTI_COD, 0, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND
                    A.ARTI_DES <= :DESFIN AND A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND
                    (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN)))
                INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,:DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                DO
                BEGIN
                SELECT COUNT(REPA_ARTICULO) FROM REPORTES_AUX WHERE REPA_ID = 2 AND REPA_USER = USER AND REPA_ARTICULO = :articulo INTO :numrows;
                if (numrows = 0) then
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        END
    if (BIN_AND(TIPO, 2) <> 0) then
        BEGIN
        TIPODOC = 32;
        /* BORRA LA TABLA AUXILIAR */
        DELETE FROM reportes_aux WHERE REPA_ID = 2 AND REPA_USER = USER;

        FOR SELECT MAX(D.ARTI_COD), SUM(RVDE_CANT * RVDE_FACTOR), SUM(RVDE_TOTAL-RVDE_IVAMONTO-RVDE_CONSUMO), SUM(RVDE_IVAMONTO), SUM(RVDE_CONSUMO),
            MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD), SUM(COST_SALP)
            FROM REMISIONES_VENTA_DETALLE D, REMISIONES_VENTA R, PREFIJOS P, ARTICULO A, movimiento_articulo m, costos c
            WHERE R.REVT_ID = D.REVT_ID AND P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = 32 AND D.ARTI_COD = A.arti_cod AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            R.revt_id = M.mvar_idref AND M.mvar_tipodoc = 32 AND M.mvar_item = D.rvde_item AND M.mvar_cons = C.cost_idmov AND
            REVT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY D.ARTI_COD
            INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,
            :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :COSTO
            DO
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
/*            EXECUTE PROCEDURE costo_promedio (:ARTICULO, :FECFIN) RETURNING_VALUES (:COSTOUNIT); */
/*            COSTO = cantidad * COSTOUNIT;*/
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                if (COSTO > 0) then
                    PORC = UTILIDAD * 100 / COSTO;
                ELSE
                    PORC = 100;
            else
                if (BASE > 0) then
                    PORC = UTILIDAD * 100 / BASE;
                ELSE
                    PORC = 0;
            if (CEROS = 'S') then
                INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (2, USER, :ARTICULO);
            SUSPEND;
            END /* FOR */
        if (CEROS = 'S') then
            BEGIN
            COSTO = 0;
            UTILIDAD = 0;
            PORC = 0;
            /* agregue los articulos sin factura */
            FOR SELECT ARTI_COD, 0, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND
                    A.ARTI_DES <= :DESFIN AND A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND
                    (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN)))
                INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,:DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                DO
                BEGIN
                SELECT COUNT(REPA_ARTICULO) FROM REPORTES_AUX WHERE REPA_ID = 2 AND REPA_USER = USER AND REPA_ARTICULO = :articulo INTO :numrows;
                if (numrows = 0) then
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        END
    if (BIN_AND(TIPO, 4) <> 0) then
        BEGIN
        TIPODOC = 33;
        /* BORRA LA TABLA AUXILIAR */
        DELETE FROM reportes_aux WHERE REPA_ID = 2 AND REPA_USER = USER;

        FOR SELECT MAX(D.ARTI_COD), SUM(DVDE_CANT * DVDE_FACTOR), SUM((DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO)*DEVT_FACTOR), SUM(DVDE_IVAMONTO*DEVT_FACTOR), SUM(DVDE_CONSUMO),
            MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD), SUM(COST_ENTP)
            FROM devoluciones_ventas_detalle D, DEVOLUCIONES_VENTAS V, PREFIJOS P, ARTICULO A, MOVIMIENTO_ARTICULO M, COSTOS C
            WHERE V.DEVT_ID = D.DEVT_ID AND P.PREF_PRE = V.PREF_PRE AND P.TIDO_COD = 33 AND D.ARTI_COD = A.arti_cod AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            V.devt_id = M.mvar_idref AND M.mvar_tipodoc = 33 AND M.mvar_item = D.dvde_item AND M.mvar_cons = C.cost_idmov AND
            DEVT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY D.ARTI_COD
            INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,
            :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :COSTO
            DO
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            else
                CANTIDAD = CANTIDAD * -1;
            if (BASE IS NULL) then
                BASE = 0;
            else
                BASE = BASE * -1;
            if (IVA IS NULL) then
                IVA = 0;
            else
                IVA = IVA * -1;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            else
                CONSUMO = CONSUMO * -1;
/*            EXECUTE PROCEDURE costo_promedio (:ARTICULO, :FECFIN) RETURNING_VALUES (:COSTOUNIT);*/
/*            COSTO = cantidad * COSTOUNIT;*/
            COSTO = costo * -1;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                if (COSTO < 0) then
                    PORC = UTILIDAD * 100 / COSTO;
                ELSE
                    PORC = 100;
            else
                if (BASE < 0) then
                    PORC = UTILIDAD * 100 / BASE;
                ELSE
                    PORC = 0;
            if (CEROS = 'S') then
                INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (2, USER, :ARTICULO);
            SUSPEND;
            END /* FOR */
        if (CEROS = 'S') then
            BEGIN
            COSTO = 0;
            UTILIDAD = 0;
            PORC = 0;
            /* agregue los articulos sin factura */
            FOR SELECT ARTI_COD, 0, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND
                    A.ARTI_DES <= :DESFIN AND A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND
                    (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN)))
                INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,:DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                DO
                BEGIN
                SELECT COUNT(REPA_ARTICULO) FROM REPORTES_AUX WHERE REPA_ID = 2 AND REPA_USER = USER AND REPA_ARTICULO = :articulo INTO :numrows;
                if (numrows = 0) then
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        END
    if (BIN_AND(TIPO, 8) <> 0) then
        BEGIN
        TIPODOC = 34;
        /* BORRA LA TABLA AUXILIAR */
        DELETE FROM reportes_aux WHERE REPA_ID = 2 AND REPA_USER = USER;

        FOR SELECT MAX(D.ARTI_COD), SUM(PEDE_CANT * PEDE_FACTOR), SUM((PEDE_TOTAL-PEDE_IVAMONTO-PEDE_CONSUMO)*PEDI_FACTOR), SUM(PEDE_IVAMONTO*PEDI_FACTOR), SUM(PEDE_CONSUMO),
            MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD)
            FROM PEDIDOS_DETALLE D, PEDIDOS P, PREFIJOS R, ARTICULO A
            WHERE P.PEDI_ID = D.PEDI_ID AND P.PREF_PRE = R.PREF_PRE AND R.TIDO_COD = 34 AND D.ARTI_COD = A.arti_cod AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            PEDI_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY D.ARTI_COD
            INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,
            :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
            DO
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            EXECUTE PROCEDURE costo_promedio (:ARTICULO, :FECFIN) RETURNING_VALUES (:COSTOUNIT);
            COSTO = cantidad * COSTOUNIT;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                if (COSTO > 0) then
                    PORC = UTILIDAD * 100 / COSTO;
                ELSE
                    PORC = 100;
            else
                if (BASE > 0) then
                    PORC = UTILIDAD * 100 / BASE;
                ELSE
                    PORC = 0;
            if (CEROS = 'S') then
                INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (2, USER, :ARTICULO);
            SUSPEND;
            END /* FOR */
        if (CEROS = 'S') then
            BEGIN
            COSTO = 0;
            UTILIDAD = 0;
            PORC = 0;
            /* agregue los articulos sin factura */
            FOR SELECT ARTI_COD, 0, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND
                    A.ARTI_DES <= :DESFIN AND A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND
                    (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN)))
                INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,:DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                DO
                BEGIN
                SELECT COUNT(REPA_ARTICULO) FROM REPORTES_AUX WHERE REPA_ID = 2 AND REPA_USER = USER AND REPA_ARTICULO = :articulo INTO :numrows;
                if (numrows = 0) then
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        END
    if (BIN_AND(TIPO, 16) <> 0) then
        BEGIN
        TIPODOC = 35;
        /* BORRA LA TABLA AUXILIAR */
        DELETE FROM reportes_aux WHERE REPA_ID = 2 AND REPA_USER = USER;

        FOR SELECT MAX(D.ARTI_COD), SUM(CTDE_CANT * CTDE_FACTOR), SUM((CTDE_TOTAL-CTDE_IVAMONTO-CTDE_CONSUMO)*COTI_FACTOR), SUM(CTDE_IVAMONTO), SUM(CTDE_CONSUMO),
            MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD)
            FROM COTIZACIONES_DETALLE D, COTIZACIONES C, PREFIJOS P, ARTICULO A
            WHERE C.COTI_ID = D.COTI_ID AND P.PREF_PRE = C.PREF_PRE AND P.TIDO_COD = 35 AND D.ARTI_COD = A.arti_cod AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND COTI_FECHA >= :FECINI AND COTI_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            COTI_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY D.ARTI_COD
            INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,
            :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
            DO
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            EXECUTE PROCEDURE costo_promedio (:ARTICULO, :FECFIN) RETURNING_VALUES (:COSTOUNIT);
            COSTO = cantidad * COSTOUNIT;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                if (COSTO > 0) then
                    PORC = UTILIDAD * 100 / COSTO;
                ELSE
                    PORC = 100;
            else
                if (BASE > 0) then
                    PORC = UTILIDAD * 100 / BASE;
                ELSE
                    PORC = 0;
            if (CEROS = 'S') then
                INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (2, USER, :ARTICULO);
            SUSPEND;
            END /* FOR */
        if (CEROS = 'S') then
            BEGIN
            COSTO = 0;
            UTILIDAD = 0;
            PORC = 0;
            /* agregue los articulos sin factura */
            FOR SELECT ARTI_COD, 0, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND
                    A.ARTI_DES <= :DESFIN AND A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND
                    (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN)))
                INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,:DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                DO
                BEGIN
                SELECT COUNT(REPA_ARTICULO) FROM REPORTES_AUX WHERE REPA_ID = 2 AND REPA_USER = USER AND REPA_ARTICULO = :articulo INTO :numrows;
                if (numrows = 0) then
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        END
    END
ELSE
    BEGIN
    if (BIN_AND(TIPO, 1) <> 0) then
        BEGIN
        TIPODOC = 31;
        FOR SELECT F.PREF_PRE, FACT_NUMERO, FACT_FECHA, D.ARTI_COD, FADE_CANT * FADE_FACTOR, (FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO)*FACT_FACTOR, FADE_IVAMONTO*FACT_FACTOR, FADE_CONSUMO,
            ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD, COST_SALP
            FROM FACTURAS F, FACTURAS_DETALLE D, PREFIJOS P, ARTICULO A, MOVIMIENTO_ARTICULO M, COSTOS C
            WHERE F.FACT_ID = D.FACT_ID AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND D.ARTI_COD = A.arti_cod AND
                A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
                A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND FACT_FECHA >= :FECINI AND
                (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
                F.fact_id = M.mvar_idref AND M.mvar_tipodoc = 31 AND M.mvar_item = D.fade_item AND M.mvar_cons = C.cost_idmov AND
                FACT_FECHA <= :FECFIN AND FACT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) and substring(a.arti_cod from 1 FOR 2) <> '.t'
            ORDER BY D.ARTI_COD, FACT_FECHA, F.FACT_ID, FADE_ITEM
            INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,
                :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :COSTO
            DO
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
/*            EXECUTE PROCEDURE costo_promedio (:ARTICULO, :FECHA) RETURNING_VALUES (:COSTOUNIT);*/
/*            COSTO = COSTOUNIT * CANTIDAD;*/
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                if (COSTO > 0) then
                    PORC = UTILIDAD * 100 / COSTO;
                ELSE
                    PORC = 100;
            else
                if (BASE > 0) then
                    PORC = UTILIDAD * 100 / BASE;
                ELSE
                    PORC = 0;
            SUSPEND;
            END
        END
    if (BIN_AND(TIPO, 2) <> 0) then
        BEGIN
        TIPODOC = 32;
        FOR SELECT R.PREF_PRE, REVT_NUMERO, REVT_FECHA, D.ARTI_COD, RVDE_CANT * RVDE_FACTOR, RVDE_TOTAL-RVDE_IVAMONTO-RVDE_CONSUMO, RVDE_IVAMONTO, RVDE_CONSUMO,
            ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD, COST_SALP
            FROM REMISIONES_VENTA R, REMISIONES_VENTA_DETALLE D, PREFIJOS P, ARTICULO A, MOVIMIENTO_ARTICULO M, COSTOS C
            WHERE R.REVT_ID = D.REVT_ID AND P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = 32 AND D.ARTI_COD = A.arti_cod AND
                A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
                A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN AND
                R.revt_id = M.mvar_idref AND M.mvar_tipodoc = 32 AND M.mvar_item = D.rvde_item AND M.mvar_cons = C.cost_idmov AND
                (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
                REVT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            ORDER BY D.ARTI_COD, REVT_FECHA, R.REVT_ID, RVDE_ITEM
            INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,
                :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :COSTO
            DO
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            EXECUTE PROCEDURE costo_promedio (:ARTICULO, :FECHA) RETURNING_VALUES (:COSTOUNIT);
            COSTO = COSTOUNIT * CANTIDAD;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                if (COSTO > 0) then
                    PORC = UTILIDAD * 100 / COSTO;
                ELSE
                    PORC = 100;
            else
                if (BASE > 0) then
                    PORC = UTILIDAD * 100 / BASE;
                ELSE
                    PORC = 0;
            SUSPEND;
            END
        END
    if (BIN_AND(TIPO, 4) <> 0) then
        BEGIN
        TIPODOC = 33;
        FOR SELECT V.PREF_PRE, DEVT_NUMERO, DEVT_FECHA, D.ARTI_COD, DVDE_CANT * DVDE_FACTOR, (DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO)*DEVT_FACTOR, DVDE_IVAMONTO*DEVT_FACTOR, DVDE_CONSUMO,
            ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD, COST_ENTP
            FROM DEVOLUCIONES_VENTAS V, DEVOLUCIONES_VENTAS_DETALLE D, PREFIJOS P, ARTICULO A, MOVIMIENTO_ARTICULO M, COSTOS C
            WHERE V.DEVT_ID = D.DEVT_ID AND P.PREF_PRE = V.PREF_PRE AND P.TIDO_COD = 33 AND D.ARTI_COD = A.arti_cod AND
                A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
                A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND
                (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
                V.devt_id = M.mvar_idref AND M.mvar_tipodoc = 33 AND M.mvar_item = D.dvde_item AND M.mvar_cons = C.cost_idmov AND
                DEVT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            ORDER BY D.ARTI_COD, DEVT_FECHA, V.DEVT_ID, DVDE_ITEM
            INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,
                :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :COSTO
            DO
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            EXECUTE PROCEDURE costo_promedio (:ARTICULO, :FECHA) RETURNING_VALUES (:COSTOUNIT);
            BASE = BASE * -1;
            CANTIDAD = CANTIDAD * -1;
            IVA = IVA * -1;
            CONSUMO = CONSUMO * -1;
            COSTO = COSTOUNIT * CANTIDAD;
            COSTO = COSTO * -1;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                if (COSTO > 0) then
                    PORC = UTILIDAD * 100 / COSTO;
                ELSE
                    PORC = 100;
            else
                if (BASE > 0) then
                    PORC = UTILIDAD * 100 / BASE;
                ELSE
                    PORC = 0;
            SUSPEND;
            END
        END
    if (BIN_AND(TIPO, 8) <> 0) then
        BEGIN
        TIPODOC = 34;
        FOR SELECT P.PREF_PRE, PEDI_NUMERO, PEDI_FECHA, D.ARTI_COD, PEDE_CANT * PEDE_FACTOR, (PEDE_TOTAL-PEDE_IVAMONTO-PEDE_CONSUMO)*PEDI_FACTOR, PEDE_IVAMONTO*PEDI_FACTOR, PEDE_CONSUMO,
            ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD 
            FROM PEDIDOS P, PEDIDOS_DETALLE D, PREFIJOS R, ARTICULO A
            WHERE P.PEDI_ID = D.PEDI_ID AND P.PREF_PRE = R.PREF_PRE AND R.TIDO_COD = 34 AND D.ARTI_COD = A.arti_cod AND
                A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
                A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND
                (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
                PEDI_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            ORDER BY D.ARTI_COD, PEDI_FECHA, P.PEDI_ID, PEDE_ITEM
            INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,
                :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
            DO
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            EXECUTE PROCEDURE costo_promedio (:ARTICULO, :FECHA) RETURNING_VALUES (:COSTOUNIT);
            COSTO = COSTOUNIT * CANTIDAD;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                if (COSTO > 0) then
                    PORC = UTILIDAD * 100 / COSTO;
                ELSE
                    PORC = 100;
            else
                if (BASE > 0) then
                    PORC = UTILIDAD * 100 / BASE;
                ELSE
                    PORC = 0;
            SUSPEND;
            END
        END
    if (BIN_AND(TIPO, 16) <> 0) then
        BEGIN
        TIPODOC = 35;
        FOR SELECT C.PREF_PRE, COTI_NUMERO, COTI_FECHA, D.ARTI_COD, CTDE_CANT * CTDE_FACTOR, (CTDE_TOTAL-CTDE_IVAMONTO-CTDE_CONSUMO)*COTI_FACTOR, CTDE_IVAMONTO*COTI_FACTOR, CTDE_CONSUMO,
            ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD 
            FROM COTIZACIONES C, COTIZACIONES_DETALLE D, PREFIJOS P, ARTICULO A
            WHERE C.COTI_ID = D.COTI_ID AND P.PREF_PRE = C.PREF_PRE AND P.TIDO_COD = 35 AND D.ARTI_COD = A.arti_cod AND
                A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
                A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND COTI_FECHA >= :FECINI AND COTI_FECHA <= :FECFIN AND
                (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
                COTI_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            ORDER BY D.ARTI_COD, COTI_FECHA, C.COTI_ID, CTDE_ITEM
            INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,
                :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
            DO
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            EXECUTE PROCEDURE costo_promedio (:ARTICULO, :FECHA) RETURNING_VALUES (:COSTOUNIT);
            COSTO = COSTOUNIT * CANTIDAD;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                if (COSTO > 0) then
                    PORC = UTILIDAD * 100 / COSTO;
                ELSE
                    PORC = 100;
            else
                if (BASE > 0) then
                    PORC = UTILIDAD * 100 / BASE;
                ELSE
                    PORC = 0;
            SUSPEND;
            END
        END
    END
END
^

SET TERM ; ^








/* 2009/01/14 VUELVA AL ESQUEMA DE 2007 DE LEER MOV_CLIEN, LEYENDO DE SALDOS SE COMPLICA EXAGERADAMENTE EL CALCULO CON AUTORET */

SET TERM ^ ;

CREATE OR ALTER PROCEDURE CARTERA_CLIENTE(
    NIT VARCHAR(20),
    FECHA DATE,
    SUCURSAL VARCHAR(10),
    MONEDA INTEGER,
    SOLOPESOS CHAR(1))
RETURNS (
    TIPO INTEGER,
    ID INTEGER,
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(6),
    CONCEPTO VARCHAR(60),
    SALDO NUMERIC(18,2),
    RTFTE NUMERIC(18,2),
    RTIVA NUMERIC(18,2),
    RTICA NUMERIC(18,2),
    DTOF NUMERIC(18,2),
    TIPONOM VARCHAR(8),
    VENCE DATE,
    FECDOC DATE,
    DIAS INTEGER,
    RECPROV_ID INTEGER,
    RECIPROV CHAR(1),
    NOTA VARCHAR(256),
    TRMDOC NUMERIC(18,2))
AS
declare variable FEC DATE;
declare variable DESC_RTES CHAR(2);
declare variable DTOAPL NUMERIC(18,2);
declare variable TRMREC NUMERIC(18,2);
declare variable IDNOTA INTEGER;
declare variable AUTORET VARCHAR(10);
declare variable FAUTORET DATE;
BEGIN
EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'FECHA AUTORETENEDOR NO DESCONTAR RETENCIONES DEL SALDO PERO SI CONTABILIZARLAS') returning_values (AUTORET);
if (AUTORET <> '') then
    FAUTORET = CAST(AUTORET AS DATE);
else
    FAUTORET = '9999/12/31';
EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'DESCONTAR RETENCIONES POR CAUSACION') returning_values (DESC_RTES);
  /* BUSQUE EN SALDOS_DOC_CARTERA LOS QUE TENGAN SALDO > 0 */
  FOR SELECT MVCL_TIPOREF, MVCL_IDREF, MVCL_FECHA, MVCL_VENCE, MVCL_PREFREF, MVCL_NUMREF, MVCL_CONC, MVCL_TRM
  FROM MOVIMIENTO_CLIENTES
  WHERE TERC_NIT = :NIT AND mvcl_sucursal = :sucursal and MVCL_FECHA <= :FECHA AND MVCL_ABONO = 'N' AND ((:MONEDA = 0) or (MVCL_TRM <> 1))
  INTO :TIPO, :ID, :FECDOC, :VENCE, :PREFIJO, :NUMERO, :CONCEPTO, :TRMDOC
    DO
    BEGIN
    DIAS = (FECHA -VENCE );
    EXECUTE PROCEDURE saldo_doc_cartera(TIPO, ID, FECHA, MONEDA) returning_values (SALDO);
    if (SALDO <> 0) then
        BEGIN
        SELECT TIDO_NOMCORTO FROM TIPO_DOCUMENTO WHERE TIDO_COD = :TIPO INTO :TIPONOM;
        if (TIPO = 41) then
            SELECT NDCL_DTOFMONTO, NDCL_FECHADTO FROM NOTAS_DEBITO_CLIENTES WHERE NDCL_ID = :ID INTO :DTOF, :FEC;
        if (TIPO = 42) then
            SELECT 0, NCCL_FECHA FROM NOTAS_CREDITO_CLIENTES WHERE NCCL_ID = :ID INTO :DTOF, :FEC;
        if (TIPO = 45) then
            SELECT ANCL_DTOFMONTO, ANCL_DTOFECHA FROM ANTICIPOS_CLIENTE WHERE ANCL_ID = :ID INTO :DTOF, :FEC;
        if (TIPO = 31) then
            SELECT FACT_DTOFMONTO, FACT_DTOFFECHA FROM FACTURAS WHERE FACT_ID = :ID INTO :DTOF, :FEC;
        if (TIPO = 33) then
            SELECT 0, :FECHA FROM devoluciones_ventas WHERE DEVT_ID = :ID INTO :DTOF, :FEC;
        if ((MONEDA <> 0) AND (TRMDOC <> 0)) then
            DTOF = DTOF / TRMDOC;

        /* POR WILLIAM IDENTIFICAR SI EL DOCUMENTO TIENE RECIBO PROVISIONAL*/
        recprov_id = 0;
        SELECT max(RCPR_ID) FROM recibo_provisional_detalle WHERE RPDE_IDDOC = :ID AND RPDE_TIPODOC = :TIPO and RPDE_ANULADO = 'N' INTO :recprov_id;
        if /*(recprov_id = 0) or */(recprov_id is null) then
           BEGIN
           reciprov = 'N';
           end 
        ELSE
          begin 
           reciprov = 'S';
          END
        /*FIN WILLIAM*/
        if (FECHA > FEC) then
            DTOF = 0;
        if (DTOF IS NULL) then
            DTOF = 0;
        if (DTOF <> 0) then
            BEGIN
            SELECT SUM(RCDE_DTOF), MAX(RECA_TRM) FROM RECIBOS_CAJA_DETALLE D, RECIBOS_CAJA R
                WHERE R.reca_id = D.reca_id AND RCDE_IDDOC = :ID AND RCDE_TIPODOC = :TIPO
                INTO :DTOAPL, :TRMREC;
            if (DTOAPL IS NULL) then
                DTOAPL = 0;
            if ((MONEDA <> 0) AND (TRMREC <> 0)) then
                DTOAPL = DTOAPL / TRMREC;
            DTOF = DTOF - DTOAPL;
            END
        if (MONEDA = 0) then
            SELECT SUM(SDCA_RTFTE - SDCA_ABRTFTE), SUM(SDCA_RTIVA - SDCA_ABRTIVA), SUM(SDCA_RTICA - SDCA_ABRTICA)
                FROM SALDOS_DOC_CARTERA WHERE SDCA_TIPOREF = :TIPO AND SDCA_IDREF = :ID
                INTO :RTFTE, :RTIVA, :RTICA;
        ELSE
            SELECT SUM((SDCA_RTFTE - SDCA_ABRTFTE)/SDCA_TRM), SUM((SDCA_RTIVA - SDCA_ABRTIVA)/SDCA_TRM), SUM((SDCA_RTICA - SDCA_ABRTICA)/SDCA_TRM)
                FROM SALDOS_DOC_CARTERA WHERE SDCA_TIPOREF = :TIPO AND SDCA_IDREF = :ID
                INTO :RTFTE, :RTIVA, :RTICA;
        if (RTFTE IS NULL) then
            RTFTE = 0;
        if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) THEN
            BEGIN
            if (RTFTE > 0) then
                RTFTE = 0;
            END
        ELSE
            BEGIN
            if (RTFTE < 0) then
                RTFTE = 0;
            END

        if (RTIVA IS NULL) then
            RTIVA = 0;
        if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) THEN
            BEGIN
            if (RTIVA > 0) then
                RTIVA = 0;
            END
        ELSE
            BEGIN
            if (RTIVA < 0) then
                RTIVA = 0;
            END

        if (RTICA IS NULL) then
            RTICA = 0;
        if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) THEN
            BEGIN
            if (RTICA > 0) then
                RTICA = 0;
            END
        ELSE
            BEGIN
            if (RTICA < 0) then
                RTICA = 0;
            END

        if (FAUTORET <= FECDOC) then
            BEGIN
            RTFTE = 0;
            RTIVA = 0;
            RTICA = 0;
            END
        /* RESTE LAS RETENCIONES YA QUE SE SUGERIRAN */
        if (DESC_RTES = 'NO') then
            SALDO = SALDO - RTFTE - RTIVA - RTICA;
        /* SI TIENE NOTA AGREGUELA */
        SELECT MAX(NOCL_ID) FROM NOTAS_CLIENTES WHERE TERC_NIT = :NIT AND CLSU_COD = :SUCURSAL AND NOCL_TIPODOC = :TIPO AND NOCL_IDDOC = :ID INTO :IDNOTA;
        if (IDNOTA IS NOT NULL) then
            SELECT NOCL_TEXTO FROM NOTAS_CLIENTES WHERE NOCL_ID = :IDNOTA INTO :NOTA;
        else
            NOTA = '';
        if ((SOLOPESOS = 'N') or (TRMDOC = 1)) then
            SUSPEND;
        END
    END
END

^

SET TERM ; ^


SET TERM ^ ;

CREATE OR ALTER PROCEDURE REP_CARTERA_CLIENTES(
    DESDE VARCHAR(20),
    HASTA VARCHAR(20),
    GRPINI VARCHAR(5),
    GRPFIN VARCHAR(5),
    FECHA DATE,
    ORDEN CHAR(1),
    AGRUPA CHAR(1),
    SUBEMPRESA INTEGER,
    GRUPCART INTEGER,
    MONEDA INTEGER)
RETURNS (
    NIT VARCHAR(20),
    NOMBRE VARCHAR(60),
    DIR VARCHAR(60),
    TELEFONO VARCHAR(40),
    CIUDAD VARCHAR(40),
    CONTACTO VARCHAR(60),
    EMAIL VARCHAR(100),
    FAX VARCHAR(25),
    CEL VARCHAR(25),
    CODCLI VARCHAR(20),
    CODZONA VARCHAR(2),
    NOMZONA VARCHAR(60),
    CODCOBR INTEGER,
    NOMCOBR VARCHAR(60),
    SUCURSAL VARCHAR(10),
    NOMSUC VARCHAR(60),
    DV CHAR(1),
    CODCIUD CHAR(5),
    NOMCIUD VARCHAR(60),
    TIPO INTEGER,
    ID INTEGER,
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(6),
    CONCEPTO VARCHAR(60),
    SALDO NUMERIC(18,2),
    PROVISIONAL NUMERIC(18,2),
    RTFTE NUMERIC(18,2),
    RTIVA NUMERIC(18,2),
    RTICA NUMERIC(18,2),
    DTOF NUMERIC(18,2),
    TIPONOM VARCHAR(8),
    FECDOC DATE,
    VENCE DATE,
    DIAS INTEGER,
    CUPO NUMERIC(18,2),
    DISPONIBLE NUMERIC(18,2),
    NOTA VARCHAR(256),
    OBS BLOB SUB_TYPE 0 SEGMENT SIZE 80,
    GRUPCOD INTEGER,
    GRUPNOM VARCHAR(30))
AS
DECLARE VARIABLE NITINI VARCHAR(20);
DECLARE VARIABLE NITFIN VARCHAR(20);
DECLARE VARIABLE NOMINI VARCHAR(20);
DECLARE VARIABLE NOMFIN VARCHAR(20);
DECLARE VARIABLE OK CHAR(1);
DECLARE VARIABLE FOV CHAR(11);
DECLARE VARIABLE DTOAPL NUMERIC(18,2);
DECLARE VARIABLE FECDTO DATE;
DECLARE VARIABLE FECNOTA VARCHAR(10);
DECLARE VARIABLE AUXNOTA VARCHAR(256);
DECLARE VARIABLE IDNOTA INTEGER;
declare variable descnt_prov char(2);
declare variable AUTORET VARCHAR(10);
declare variable FAUTORET DATE;
declare variable INCLANTI CHAR(2);
DECLARE VARIABLE TRM NUMERIC(18,2);
BEGIN
if (ORDEN = 'C') then
    BEGIN
    NITINI = DESDE;
    NITFIN = HASTA;
    NOMINI = '';
    NOMFIN = 'zz';
    END
ELSE
    BEGIN
    NOMINI = DESDE;
    NOMFIN = HASTA;
    NITINI = '';
    NITFIN = 'zz';
    END
  EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'DESCONTAR RECIBOS PROVISIONALES EN INFORMES DE CARTERA') RETURNING_VALUES (:descnt_prov);
  EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'INCLUIR ANTICIPOS DE CLIENTES EN REPORTES Y CONSULTAS DE CARTERA') returning_values (INCLANTI);
  EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'FECHA AUTORETENEDOR NO DESCONTAR RETENCIONES DEL SALDO PERO SI CONTABILIZARLAS') returning_values (AUTORET);
  EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'ANALISIS DE CARTERA CON FECHA FACTURA O VENCIMIENTO') RETURNING_VALUES (FOV);
  if (AUTORET <> '') then
    FAUTORET = CAST(AUTORET AS DATE);
  else
    FAUTORET = '9999/12/31';
  /* Ubique el NIT */
  FOR select C.TERC_NIT, TERC_NOM, TERC_DV, CLSU_DIR, CLSU_TEL, CLSU_CIUDAD, S.COBR_COD, S.ZONA_COD, T.CIUD_COD, CLIE_CUPO, CLCU_COD, CLSU_NOMBRE, t.terc_obs, C.GRCA_COD, TERC_CONTACTO, TERC_EMAIL, TERC_FAX, TERC_CEL, CLIE_COD
    from terceros T, CLIENTES C, CLIENTE_SUCURSALES S
    where C.TERC_NIT = T.TERC_NIT AND TERC_CLIE = 'S' AND S.TERC_NIT = C.TERC_NIT AND C.TERC_NIT >= :NITINI AND C.TERC_NIT <= :NITFIN AND
        TERC_NOM >= :NOMINI AND TERC_NOM <= :NOMFIN AND ((:GRUPCART = 0) or (C.GRCA_COD = :GRUPCART))
    INTO :NIT, :NOMBRE, :DV, :DIR, :TELEFONO, :CIUDAD, :CODCOBR, :CODZONA, :CODCIUD, :CUPO, :SUCURSAL, :NOMSUC, :obs, :GRUPCOD, :CONTACTO, :EMAIL, :FAX, :CEL, :CODCLI
    DO  
    BEGIN
    if (CODCOBR IS NOT NULL) then
        SELECT COBR_NOM FROM COBRADORES  WHERE COBR_COD = :CODCOBR INTO :NOMCOBR;
    if (CODZONA IS NOT NULL) then
        SELECT ZONA_NOM FROM ZONAS WHERE ZONA_COD = :CODZONA INTO :NOMZONA;
    if (CODCIUD IS NOT NULL) then
        SELECT CIUD_NOM FROM CIUDADES  WHERE CIUD_COD = :CODCIUD INTO :NOMCIUD;
    SELECT GRCA_NOMBRE FROM GRUPO_CARTERA WHERE GRCA_COD = :GRUPCOD INTO :GRUPNOM;
    DISPONIBLE = CUPO;
    OK = 'N';
    if (AGRUPA = 'Z') then
        BEGIN
        if (GRPINI = '') then
            BEGIN
            if ((CODZONA IS NULL) or (CODZONA >= :GRPINI AND CODZONA <= :GRPFIN)) then
                OK = 'S';
            END
        ELSE
            if (CODZONA >= :GRPINI AND CODZONA <= :GRPFIN) then
                OK = 'S';
        END
    if (AGRUPA = 'I') then
        BEGIN
        if (GRPINI = '') then
            BEGIN
            if ((CODCIUD IS NULL) or (CODCIUD >= :GRPINI AND CODCIUD <= :GRPFIN)) then
                OK = 'S';
            END
        ELSE
            if (CODCIUD >= :GRPINI AND CODCIUD <= :GRPFIN) then
                OK = 'S';
        END
    if (AGRUPA = 'N') then
        OK = 'S';
        
    if (OK = 'S') then
        BEGIN
        /* BUSQUE EN SALDOS_DOC_CARTERA LOS QUE TENGAN SALDO > 0 */
        FOR SELECT MVCL_TIPOREF, MVCL_IDREF, MVCL_PREFREF, MVCL_NUMREF, MVCL_FECHA, MVCL_VENCE, MVCL_CONC
            FROM MOVIMIENTO_CLIENTES WHERE TERC_NIT = :NIT AND MVCL_SUCURSAL = :SUCURSAL AND MVCL_FECHA <= :FECHA AND
            MVCL_ABONO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) AND ((:MONEDA = 0) or (MVCL_TRM <> 1))
            INTO :TIPO, :ID, :PREFIJO, :NUMERO, :FECDOC, :VENCE, :CONCEPTO
            DO
            BEGIN
            if ((inclanti = 'SI') or (TIPO <> 45)) then
                BEGIN
                EXECUTE PROCEDURE saldo_doc_cartera(TIPO, ID, FECHA, MONEDA) returning_values (SALDO);
                if (SALDO <> 0) then
                    BEGIN
                    PROVISIONAL = 0;
                    if (FOV = 'FECHA') then
                       DIAS = FECHA - FECDOC;
                    ELSE
                      DIAS = FECHA - VENCE;
                    DISPONIBLE = DISPONIBLE - SALDO;
                    SELECT TIDO_NOMCORTO FROM TIPO_DOCUMENTO WHERE TIDO_COD = :TIPO INTO :TIPONOM;
                    if (TIPO = 41) then
                        SELECT NDCL_DTOFMONTO, NDCL_FECHADTO, NDCL_TRM FROM NOTAS_DEBITO_CLIENTES
                            WHERE NDCL_ID = :ID INTO :DTOF, :FECDTO, :TRM;
                    if (TIPO = 42) then
                        SELECT 0, :FECDOC, 1 FROM NOTAS_CREDITO_CLIENTES
                            WHERE NCCL_ID = :ID INTO :DTOF, :FECDTO, :TRM;
                    if (TIPO = 45) then
                        SELECT ANCL_DTOFMONTO, ANCL_DTOFECHA, ANCL_TRM FROM ANTICIPOS_CLIENTE
                            WHERE ANCL_ID = :ID INTO :DTOF, :FECDTO, :TRM;
                    if (TIPO = 31) then
                        SELECT FACT_DTOFMONTO, FACT_DTOFFECHA, FACT_TRM FROM FACTURAS
                            WHERE FACT_ID = :ID INTO :DTOF, :FECDTO, :TRM;
                    if (TIPO = 33) then
                        SELECT 0, :FECDOC, 1 FROM devoluciones_ventas
                            WHERE DEVT_ID = :ID INTO :DTOF, :FECDTO, :TRM;
                    if ((MONEDA <> 0) AND (TRM <> 0)) then
                        DTOF = DTOF / TRM;
                    if (DTOF IS NULL) then
                        DTOF = 0;
                    if (DTOF <> 0) then
                        BEGIN
                        SELECT SUM(RCDE_DTOF), MAX(RECA_TRM) FROM RECIBOS_CAJA_DETALLE D, RECIBOS_CAJA R
                            WHERE R.reca_id = D.reca_id AND RCDE_IDDOC = :ID AND RCDE_TIPODOC = :TIPO
                            INTO :DTOAPL, :TRM;
                        if (DTOAPL IS NULL) then
                            DTOAPL = 0;
                        if ((MONEDA <> 0) AND (TRM <> 1)) then
                            DTOAPL = DTOAPL / TRM;
                        DTOF = DTOF - DTOAPL;
                        /* SI YA SE VENCIO DEJELO EN CERO */
                        if (FECDTO < FECHA) then
                            DTOF = 0;
                        END
                    if (MONEDA = 0) then
                        SELECT SUM(SDCA_RTFTE - SDCA_ABRTFTE), SUM(SDCA_RTIVA - SDCA_ABRTIVA), SUM(SDCA_RTICA - SDCA_ABRTICA)
                            FROM SALDOS_DOC_CARTERA WHERE SDCA_TIPOREF = :TIPO AND SDCA_IDREF = :ID
                            INTO :RTFTE, :RTIVA, :RTICA;
                    ELSE
                        SELECT SUM((SDCA_RTFTE - SDCA_ABRTFTE)/SDCA_TRM), SUM((SDCA_RTIVA - SDCA_ABRTIVA)/SDCA_TRM), SUM((SDCA_RTICA - SDCA_ABRTICA)/SDCA_TRM)
                            FROM SALDOS_DOC_CARTERA WHERE SDCA_TIPOREF = :TIPO AND SDCA_IDREF = :ID
                            INTO :RTFTE, :RTIVA, :RTICA;
                    if (RTFTE IS NULL) then
                        RTFTE = 0;
                    if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) THEN
                        BEGIN
                        if (RTFTE > 0) then
                            RTFTE = 0;
                        END
                    ELSE
                        BEGIN
                        if (RTFTE < 0) then
                            RTFTE = 0;
                        END
                    if (RTIVA IS NULL) then
                        RTIVA = 0;
                    if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) THEN
                        BEGIN
                        if (RTIVA > 0) then
                            RTIVA = 0;
                        END
                    ELSE
                        BEGIN
                        if (RTIVA < 0) then
                            RTIVA = 0;
                        END
                    if (RTICA IS NULL) then
                        RTICA = 0;
                    if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) THEN
                        BEGIN
                        if (RTICA > 0) then
                            RTICA = 0;
                        END
                    ELSE
                        BEGIN
                        if (RTICA < 0) then
                            RTICA = 0;
                        END
                    if (FAUTORET <= FECDOC) then
                        RTFTE = 0;
                    /* SI TIENE NOTA AGREGUELA */
                    SELECT MAX(NOCL_ID) FROM NOTAS_CLIENTES WHERE TERC_NIT = :NIT AND CLSU_COD = :SUCURSAL AND NOCL_TIPODOC = :TIPO AND NOCL_IDDOC = :ID INTO :IDNOTA;
                    if (IDNOTA IS NOT NULL) then
                        BEGIN
                        SELECT cast(NOCL_FECHA as char(10)), NOCL_TEXTO FROM NOTAS_CLIENTES
                            WHERE NOCL_ID = :IDNOTA INTO :FECNOTA, :AUXNOTA;
                        if (STRLEN(AUXNOTA) < 244) then
                            NOTA = FECNOTA || ':' || AUXNOTA;
                        ELSE
                            NOTA = AUXNOTA;
                        END
                    else
                        NOTA = '';
                    SUSPEND;
                    END  /* SALDO <> 0 */
                END  /* NO ANTICIPO */
            END  /* FOR */
        /* AGREGUE LOS RECIBOS PROVISIONALES CON SIGNO NEGATIVO */
        FOR SELECT 65, MAX(P.RCPR_ID), MAX(PREF_PRE), MAX(RCPR_NUMERO), MAX(RCPR_FECHA), MAX(RCPR_CONC), SUM(RPDE_ABONO * -1), SUM(RPDE_RTFTE*-1), SUM(RPDE_RTIVA*-1), SUM(RPDE_RTICA*-1), MAX(RCPR_TRM)
            FROM RECIBO_PROVISIONAL P, recibo_provisional_detalle D
            WHERE P.rcpr_id = D.rcpr_id AND P.TERC_NIT = :NIT AND RCPR_FECHA <= :FECHA AND RCPR_ANULADO = 'N' AND
            ((RCPR_FECCRUCE IS NULL) or (RCPR_FECCRUCE > :FECHA)) AND RPDE_SUCURSAL = :SUCURSAL AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY P.rcpr_id
            INTO :TIPO, :ID, :PREFIJO, :NUMERO, :FECDOC, :CONCEPTO, :PROVISIONAL, :rtfte,  :RTIVA, :RTICA, :TRM
            DO
            BEGIN
            if ((MONEDA <> 0) AND (TRM <> 0)) then
                PROVISIONAL = PROVISIONAL / TRM;
            if (:descnt_prov = 'NO') then
              SALDO = 0;
            else
              SALDO = :PROVISIONAL;
            SELECT TIDO_NOMCORTO FROM TIPO_DOCUMENTO WHERE TIDO_COD = :TIPO INTO :TIPONOM;
            /* CALCULE EL VENCIMIENTO DEL ULTIMO DOCUMENTO POSFECHADO */
            SELECT MAX(RPPA_FECHA) FROM recibo_provisional_pago WHERE RCPR_ID = :ID INTO :VENCE;
            DIAS = VENCE - FECHA;
            SUSPEND;
            END
        END
    if (AGRUPA = 'C') then
        BEGIN
        FOR SELECT DISTINCT COBR_COD FROM MOVIMIENTO_CLIENTES
            WHERE TERC_NIT = :NIT AND MVCL_SUCURSAL = :SUCURSAL AND MVCL_FECHA <= :FECHA AND
            MVCL_ABONO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            INTO :codcobr
            DO
            BEGIN
            OK = 'N';
            if (GRPINI = '') then
                BEGIN
                if ((CODCOBR IS NULL) or (CODCOBR >= :GRPINI AND CODCOBR <= :GRPFIN)) then
                    OK = 'S';
                END
            ELSE
                if (CODCOBR >= :GRPINI AND CODCOBR <= :GRPFIN) then
                    OK = 'S';
            if (OK = 'S') then
                BEGIN
                SELECT COBR_NOM FROM COBRADORES  WHERE COBR_COD = :CODCOBR INTO :NOMCOBR;
                /* BUSQUE EN SALDOS_DOC_CARTERA LOS QUE TENGAN SALDO > 0 */
                FOR SELECT MVCL_TIPOREF, MVCL_IDREF, MVCL_PREFREF, MVCL_NUMREF, MVCL_FECHA, MVCL_VENCE, MVCL_CONC
                    FROM MOVIMIENTO_CLIENTES WHERE TERC_NIT = :NIT AND MVCL_SUCURSAL = :SUCURSAL AND MVCL_FECHA <= :FECHA AND
                    MVCL_ABONO = 'N' AND COBR_COD = :codcobr AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) AND
                    ((:MONEDA = 0) or (MVCL_TRM <> 1))
                    INTO :TIPO, :ID, :PREFIJO, :NUMERO, :FECDOC, :VENCE, :CONCEPTO
                    DO
                    BEGIN
                    if ((inclanti = 'SI') or (TIPO <> 45)) then
                        BEGIN
                        EXECUTE PROCEDURE saldo_doc_cartera(TIPO, ID, FECHA, MONEDA) returning_values (SALDO);
                        if (SALDO <> 0) then
                            BEGIN
                            PROVISIONAL = 0;
                            if (FOV = 'FECHA') then
                               DIAS = FECHA - FECDOC;
                            ELSE
                              DIAS = FECHA - VENCE;
                            DISPONIBLE = DISPONIBLE - SALDO;
                            SELECT TIDO_NOMCORTO FROM TIPO_DOCUMENTO WHERE TIDO_COD = :TIPO INTO :TIPONOM;
                            if (TIPO = 41) then
                                SELECT NDCL_DTOFMONTO, NDCL_FECHADTO, NDCL_TRM FROM NOTAS_DEBITO_CLIENTES
                                    WHERE NDCL_ID = :ID INTO :DTOF, :FECDTO, :TRM;
                            if (TIPO = 42) then
                                SELECT 0, :FECDOC, 1 FROM NOTAS_CREDITO_CLIENTES
                                    WHERE NCCL_ID = :ID INTO :DTOF, :FECDTO, :TRM;
                            if (TIPO = 45) then
                                SELECT ANCL_DTOFMONTO, ANCL_DTOFECHA, ANCL_TRM FROM ANTICIPOS_CLIENTE
                                    WHERE ANCL_ID = :ID INTO :DTOF, :FECDTO, :TRM;
                            if (TIPO = 31) then
                                SELECT FACT_DTOFMONTO, FACT_DTOFFECHA, FACT_TRM FROM FACTURAS
                                    WHERE FACT_ID = :ID INTO :DTOF, :FECDTO, :TRM;
                            if (TIPO = 33) then
                                SELECT 0, :FECDOC, 1 FROM devoluciones_ventas
                                    WHERE DEVT_ID = :ID INTO :DTOF, :FECDTO, :TRM;
                            if (DTOF IS NULL) then
                                DTOF = 0;
                            if ((MONEDA <> 0) AND (TRM <> 0)) then
                                DTOF = DTOF / TRM;
                            if (DTOF <> 0) then
                                BEGIN
                                SELECT SUM(RCDE_DTOF) FROM RECIBOS_CAJA_DETALLE WHERE RCDE_IDDOC = :ID AND RCDE_TIPODOC = :TIPO INTO :DTOAPL;
                                if (DTOAPL IS NULL) then
                                    DTOAPL = 0;
                                DTOF = DTOF - DTOAPL;
                                /* SI YA SE VENCIO DEJELO EN CERO */
                                if (FECDTO < FECHA) then
                                    DTOF = 0;
                                END
                            SELECT SUM(SDCA_RTFTE - SDCA_ABRTFTE), SUM(SDCA_RTIVA - SDCA_ABRTIVA), SUM(SDCA_RTICA - SDCA_ABRTICA)
                                FROM SALDOS_DOC_CARTERA WHERE SDCA_TIPOREF = :TIPO AND SDCA_IDREF = :ID INTO :RTFTE, :RTIVA, :RTICA;
                            if (RTFTE IS NULL) then
                                RTFTE = 0;
                            if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) THEN
                                BEGIN
                                if (RTFTE > 0) then
                                    RTFTE = 0;
                                END
                            ELSE
                                BEGIN
                                if (RTFTE < 0) then
                                    RTFTE = 0;
                                END
                            if (FAUTORET <= FECDOC) then
                                RTFTE = 0;
                            if (RTIVA IS NULL) then
                                RTIVA = 0;
                            if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) THEN
                                BEGIN
                                if (RTIVA > 0) then
                                    RTIVA = 0;
                                END
                            ELSE
                                BEGIN
                                if (RTIVA < 0) then
                                    RTIVA = 0;
                                END
                            if (RTICA IS NULL) then
                                RTICA = 0;
                            if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) THEN
                                BEGIN
                                if (RTICA > 0) then
                                    RTICA = 0;
                                END
                            ELSE
                                BEGIN
                                if (RTICA < 0) then
                                    RTICA = 0;
                                END
                            /* SI TIENE NOTA AGREGUELA */
                            SELECT MAX(NOCL_FECHA) FROM NOTAS_CLIENTES WHERE TERC_NIT = :NIT AND CLSU_COD = :SUCURSAL AND NOCL_TIPODOC = :TIPO AND NOCL_IDDOC = :ID INTO :FECDTO;
                            if (FECDTO IS NOT NULL) then
                                BEGIN
                                SELECT cast(NOCL_FECHA as char(10)), NOCL_TEXTO FROM NOTAS_CLIENTES
                                    WHERE NOCL_ID = :IDNOTA INTO :FECNOTA, :AUXNOTA;
                                if (STRLEN(AUXNOTA) < 244) then
                                    NOTA = FECNOTA || ':' || AUXNOTA;
                                ELSE
                                    NOTA = AUXNOTA;
                                END
                            else
                                NOTA = '';
                            SUSPEND;
                            END  /* SALDO <> 0 */
                        END  /* NO ANTICIPO */
                    END  /* FOR */
                /* AGREGUE LOS RECIBOS PROVISIONALES CON SIGNO NEGATIVO */
                FOR SELECT 65, MAX(P.RCPR_ID), MAX(PREF_PRE), MAX(RCPR_NUMERO), MAX(RCPR_FECHA), MAX(RCPR_CONC), SUM(RPDE_ABONO * -1), SUM(RPDE_RTFTE*-1), SUM(RPDE_RTIVA*-1), SUM(RPDE_RTICA*-1), MAX(RCPR_TRM)
                    FROM RECIBO_PROVISIONAL P, recibo_provisional_detalle D
                    WHERE P.rcpr_id = D.rcpr_id AND P.TERC_NIT = :NIT AND P.VEND_COD = :codcobr AND RCPR_FECHA <= :FECHA AND RCPR_ANULADO = 'N' AND
                    ((RCPR_FECCRUCE IS NULL) or (RCPR_FECCRUCE > :FECHA)) AND RPDE_SUCURSAL = :SUCURSAL AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                    GROUP BY P.rcpr_id
                    INTO :TIPO, :ID, :PREFIJO, :NUMERO, :FECDOC, :CONCEPTO, :PROVISIONAL, :rtfte,  :RTIVA, :RTICA, :TRM
                    DO
                    BEGIN
                    if ((MONEDA <> 0) AND (TRM <> 0)) then
                        PROVISIONAL = PROVISIONAL / TRM;
                    if (:descnt_prov = 'NO') then
                      SALDO = 0;
                    else
                      SALDO = :PROVISIONAL;
                    SELECT TIDO_NOMCORTO FROM TIPO_DOCUMENTO WHERE TIDO_COD = :TIPO INTO :TIPONOM;
                    /* CALCULE EL VENCIMIENTO DEL ULTIMO DOCUMENTO POSFECHADO */
                    SELECT MAX(RPPA_FECHA) FROM recibo_provisional_pago WHERE RCPR_ID = :ID INTO :VENCE;
                    DIAS = VENCE - FECHA;
                    SUSPEND;
                    END
                END /* ok */
            END  /* FOR COBR */
        END  /* AGRUPA = C */
    END  /* FOR NIT */
END
^

SET TERM ; ^


/* impoconsumo incluido en precio pero no el IVA */

INSERT INTO CONFIGURACION (CONF_MODULO, CONF_CATEGORIA, CONF_PROPIEDAD, CONF_VALOR, CONF_POSIBLES, CONF_AYUDA) VALUES ('FACTURACION', 'ARTICULOS', 'IMPOCONSUMO INCLUIDO EN EL PRECIO BASE DE VENTA ANTES DE IVA', 'NO', 'SI,NO', 'SI: El impoconsumo se considrea incluído en el precio de venta pero el IVA no. NO: Tanto el impoconsumo como el IVA estan ambos incluidos en el precio o por fuera de este');
commit work;

/* NO TENIA LA VALIDACION DE TRM EN CERO */
SET TERM ^ ;

CREATE OR ALTER TRIGGER FACTURAS_COMPRA_BI FOR FACTURAS_COMPRA
ACTIVE BEFORE INSERT POSITION 0
AS
declare variable NUMERO VARCHAR(6);
declare variable AUTOM CHAR(1);
declare variable EXISTE CHAR(1);
declare variable PREGTASA CHAR(2);
BEGIN
if (NEW.FACO_SIMPLIFICADO IS NULL) then
    NEW.faco_simplificado = 'N';
/* doble moneda */
if ((NEW.faco_trm IS NULL) or (NEW.faco_trm = 0)) then
    NEW.faco_trm = 1;
EXECUTE PROCEDURE LEE_CONFIGURACION('GENERAL', 'GENERAL', 'PREGUNTAR TASA DE CAMBIO EN DOCUMENTOS DE CUENTAS POR PAGAR') returning_values (:pregtasa);
if (PREGTASA = 'SI') then
    BEGIN
    NEW.faco_dtomonto = NEW.faco_dtomonto * NEW.faco_trm;
    NEW.faco_adicional = NEW.faco_adicional * NEW.faco_trm;
    NEW.faco_extra = NEW.faco_extra * NEW.faco_trm;
    NEW.faco_rtivamonto = NEW.faco_rtivamonto * NEW.faco_trm;
    NEW.faco_rticamonto = NEW.faco_rticamonto * NEW.faco_trm;
    NEW.faco_rtftemonto = NEW.faco_rtftemonto * NEW.faco_trm;
    NEW.faco_ivamonto = NEW.faco_ivamonto * NEW.faco_trm;
    NEW.faco_dtofmonto = NEW.faco_dtofmonto * NEW.faco_trm;
    NEW.faco_total = NEW.faco_total * NEW.faco_trm;
    END
if (NEW.numok = 'N') then
  BEGIN
  /* Actualice el contador del prefijo */
  SELECT PREF_ACTUAL, PREF_AUTO FROM PREFIJOS WHERE TIDO_COD = 21 AND PREF_PRE = NEW.PREF_PRE INTO :NUMERO, :AUTOM;
  /* ACTUALICE EL NUMERO EN COMPROBANTE_ENCABEZADO  */
  if (AUTOM = 'S') then
    BEGIN
    NEW.faco_numero = NUMERO;
    NUMERO = CAST((CAST(NUMERO AS INTEGER) + 1) AS CHAR(6));
    UPDATE PREFIJOS
      SET PREF_ACTUAL = :NUMERO
    WHERE TIDO_COD = 21 AND PREF_PRE = NEW.PREF_PRE;
    END
  ELSE
    BEGIN
    if (CAST(NUMERO AS INTEGER) = CAST(NEW.FACO_NUMERO AS INTEGER)) then
        UPDATE PREFIJOS
          SET PREF_ACTUAL = CAST((CAST(PREF_ACTUAL AS INTEGER) + 1) AS CHAR(6))
        WHERE TIDO_COD = 21 AND PREF_PRE = NEW.PREF_PRE;
    END
  EXECUTE PROCEDURE COMPLETA_CEROS (NEW.FACO_numero) returning_values (NEW.FACO_numero);
  NEW.numok = 'S';
  END
/* Verifique que el numero no existe previamente */
EXISTE = 'N';
SELECT 'S' FROM FACTURAS_COMPRA WHERE PREF_PRE = NEW.PREF_PRE AND FACO_NUMERO = NEW.FACO_NUMERO INTO :EXISTE;
if (EXISTE = 'S') then
    EXCEPTION DOCUMENTO_REGISTRADO 'Ya existe una factura de compra con el número ' || new.pref_pre || new.faco_numero;
END
^

SET TERM ; ^


/* TRAIGA SOLO LOS QUE HAN CAMBIADO DE COSTO EN EL RANGO DE FECHAS, LA FECHA FINAL ES A LA QUE SE CALCULAN LOS COSTOS */

SET TERM ^ ;

CREATE OR ALTER PROCEDURE REVISA_PRECIOS(
    LISTA INTEGER,
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    ARTICULO VARCHAR(20),
    DESCR VARCHAR(60),
    GRUPO VARCHAR(2),
    SUBGRUPO VARCHAR(3),
    MARCA VARCHAR(3),
    FIJO NUMERIC(18,2),
    UNIDAD VARCHAR(8),
    PORC NUMERIC(9,4),
    SUGERIDO NUMERIC(18,2),
    DIFER NUMERIC(18,2),
    NUEVO NUMERIC(18,2),
    OK CHAR(1))
AS
declare variable marg numeric(9,4);
declare variable UOM VARCHAR(10);
declare variable BASE VARCHAR(10);
declare variable CAMBIO VARCHAR(10);
declare variable COSTO numeric(18,2);
declare variable COSTOP numeric(18,2);
declare variable COSTOU numeric(18,2);
declare variable DIFMAX numeric(18,2);
declare variable DIG INTEGER;
declare variable TARIVA NUMERIC(9,4);
declare variable IVAINC CHAR(1);
declare variable LISTAREF INTEGER;
begin
execute procedure lee_configuracion ('FACTURACION', 'ARTICULOS', 'SUGERIR PRECIOS CON PORCENTAJE DE MARGEN O UTILIDAD') returning_values (:UOM);
EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION', 'ARTICULOS', 'REDONDEO AL MULTIPLO DE DIEZ EN PRECIOS') RETURNING_VALUES (:DIG);
EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION','ARTICULOS','CAMBIO DE PRECIOS AUTOMATICO AL CAMBIAR COSTO O PRECIO') returning_values (CAMBIO);
EXECUTE PROCEDURE lee_configuracion('FACTURACION','ARTICULOS','COSTO BASE PARA CALCULO DE PRECIOS DE VENTA AUTOMATICOS') returning_values (:BASE);
EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION','ARTICULOS','CODIGO DE LA LISTA DE PRECIOS BASE PARA CAMBIO DE PRECIOS AUTOMATICO') returning_values (LISTAREF);
EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION','ARTICULOS','DIFERENCIA EN PESOS MAXIMA A PERMITIR PARA CAMBIAR PRECIOS') returning_values (DIFMAX);
for select A.arti_cod, A.arti_des, A.grup_cod, A.subg_cod, A.marc_cod, A.arti_unidad, prar_fijo, prar_margen, prar_util, TAIV_PORC
    from precios_articulo p, articulo a, tarifa_iva T
    where a.arti_cod = p.arti_cod and lipr_cod = :lista and a.taiv_cod = t.taiv_cod and exists (select arti_cod from movimiento_articulo m where arti_cod = a.arti_cod and m.mvar_entrada = 'S' and m.mvar_tipodoc <> 33 and m.mvar_tipodoc <> 13 and m.mvar_fecha >= :fecini and m.mvar_fecha <= :fecfin)
    order by A.arti_cod
    into :articulo, descr, :grupo, :subgrupo, :marca, :unidad, :fijo, :marg, :porc, :tariva
    do
    begin
    if (UOM <> 'UTILIDAD') then
        PORC = MARG;
    if (CAMBIO = 'COSTO') then
        BEGIN
        EXECUTE PROCEDURE COSTO_PROMEDIO (:ARTICULO, :FECFIN) RETURNING_VALUES(:COSTOP);
        EXECUTE PROCEDURE ULTIMO_COSTO (:ARTICULO, :FECFIN, :UNIDAD) RETURNING_VALUES(:COSTOU);
        if (base = 'ULTIMO') then
            COSTO = COSTOU;
        ELSE
            BEGIN
            COSTO = COSTOP;
            if (base = 'MAYOR') then
                if (COSTOP < COSTOU) then
                    COSTO = COSTOU;
            END
        SELECT LIPR_MODIF FROM LISTA_PRECIOS WHERE LIPR_COD = :lista INTO :IVAINC;
        if (IVAINC = 'S') then
            COSTO = COSTO * (1 + TARIVA/100);
        if (UOM = 'UTILIDAD') then
            SUGERIDO = COSTO * (1 + :PORC/100);
        ELSE
            SUGERIDO = COSTO / (1 - :PORC/100);
        END
    ELSE
        if (LISTA <> LISTAREF) then
            BEGIN
            SELECT PRAR_FIJO FROM PRECIOS_ARTICULO WHERE ARTI_COD = :articulo AND LIPR_COD = :LISTAREF INTO :SUGERIDO;
            if (IVAINC = 'S') then
                SUGERIDO = SUGERIDO / (1 + TARIVA/100);
            if (UOM = 'UTILIDAD') then
                SUGERIDO = SUGERIDO * (1 + :PORC/100);
            ELSE
                SUGERIDO = SUGERIDO / (1 - :PORC/100);
            END
    EXECUTE PROCEDURE REDONDEE (SUGERIDO, DIG) returning_values (SUGERIDO);
    DIFER = SUGERIDO - FIJO;
    NUEVO = SUGERIDO;
    OK = 'S';
    if ((abs(DIFER) > DIFMAX) and (sugerido <> 0)) then
        suspend;
    end
end
^

SET TERM ; ^


/* IMPORTACION DE CXPAGAR CON IMPUESTOS */

INSERT INTO NOMBRES_CAMPOS (NOMBRE, DESCRIPCION) VALUES ('IVAMONTO', 'Impuesto en ventas IVA');
INSERT INTO NOMBRES_CAMPOS (NOMBRE, DESCRIPCION) VALUES ('RTEFTEMONTO', 'Retención en la fuente');
INSERT INTO NOMBRES_CAMPOS (NOMBRE, DESCRIPCION) VALUES ('RTEIVAMONTO', 'Retención de IVA');
INSERT INTO NOMBRES_CAMPOS (NOMBRE, DESCRIPCION) VALUES ('RTICAMONTO', 'Retención de ICA');


INSERT INTO IMPORTACION_INVENTARIO (IMIN_TIPO, IMIN_DATO, IMIN_COLUMNA, IMIN_ANCHO) VALUES (13, 'IVAMONTO', 12, 8);
INSERT INTO IMPORTACION_INVENTARIO (IMIN_TIPO, IMIN_DATO, IMIN_COLUMNA, IMIN_ANCHO) VALUES (13, 'RTEFTEMONTO', 13, 8);
INSERT INTO IMPORTACION_INVENTARIO (IMIN_TIPO, IMIN_DATO, IMIN_COLUMNA, IMIN_ANCHO) VALUES (13, 'RTEICAMONTO', 14, 8);
INSERT INTO IMPORTACION_INVENTARIO (IMIN_TIPO, IMIN_DATO, IMIN_COLUMNA, IMIN_ANCHO) VALUES (13, 'RTEIVAMONTO', 15, 8);
INSERT INTO IMPORTACION_INVENTARIO (IMIN_TIPO, IMIN_DATO, IMIN_COLUMNA, IMIN_ANCHO) VALUES (16, 'IVAMONTO', 9, 8);
INSERT INTO IMPORTACION_INVENTARIO (IMIN_TIPO, IMIN_DATO, IMIN_COLUMNA, IMIN_ANCHO) VALUES (16, 'RTEFTEMONTO', 10, 8);
INSERT INTO IMPORTACION_INVENTARIO (IMIN_TIPO, IMIN_DATO, IMIN_COLUMNA, IMIN_ANCHO) VALUES (16, 'RTEICAMONTO', 12, 8);
INSERT INTO IMPORTACION_INVENTARIO (IMIN_TIPO, IMIN_DATO, IMIN_COLUMNA, IMIN_ANCHO) VALUES (16, 'RTEIVAMONTO', 11, 8);
COMMIT WORK;

/* 2009/01/15  al importar saldos es importante detectar la causa de las excepciones */

SET TERM ^ ;

CREATE OR ALTER TRIGGER TI_NOTAS_CREDITO_CLIENTES FOR NOTAS_CREDITO_CLIENTES
ACTIVE BEFORE INSERT POSITION 0
AS
DECLARE VARIABLE NUMROWS INTEGER;
BEGIN
    /*  PARENT 'CLIENTES' MUST EXIST WHEN INSERTING A CHILD IN 'NOTAS_CREDITO_CLIENTES'  */
    IF (NEW.TERC_NIT IS NOT NULL) THEN
    BEGIN
       SELECT COUNT(*)
       FROM   CLIENTES
       WHERE  CLIENTES.TERC_NIT = NEW.TERC_NIT
       INTO   :NUMROWS;
       IF (NUMROWS = 0) THEN
       BEGIN
          EXCEPTION CLIENTE_NO_EXISTE 'No existe el cliente ' || new.terc_nit;
       END
    END
    /*  PARENT 'COBRADORES' MUST EXIST WHEN INSERTING A CHILD IN 'NOTAS_CREDITO_CLIENTES'  */
    IF (NEW.COBR_COD IS NOT NULL) THEN
    BEGIN
       SELECT COUNT(*)
       FROM   COBRADORES
       WHERE  COBRADORES.COBR_COD = NEW.COBR_COD
       INTO   :NUMROWS;
       IF (NUMROWS = 0) THEN
       BEGIN
          EXCEPTION COBRADOR_NOREG 'No existe el cobrador ' || new.cobr_cod;
       END
    END
    /*  PARENT 'PREFIJOS' MUST EXIST WHEN INSERTING A CHILD IN 'NOTAS_CREDITO_CLIENTES'  */
    IF (NEW.TIDO_COD IS NOT NULL AND
        NEW.PREF_PRE IS NOT NULL) THEN
    BEGIN
       SELECT COUNT(*)
       FROM   PREFIJOS
       WHERE  PREFIJOS.TIDO_COD = NEW.TIDO_COD
        AND   PREFIJOS.PREF_PRE = NEW.PREF_PRE
       INTO   :NUMROWS;
       IF (NUMROWS = 0) THEN
       BEGIN
          EXCEPTION PREFIJO_NO_EXISTE 'El prefijo ' || new.pref_pre || ' no existe.';
       END
    END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER TI_NOTAS_CREDITO_PROVEEDOR FOR NOTAS_CREDITO_PROVEEDOR
ACTIVE BEFORE INSERT POSITION 0
AS
DECLARE VARIABLE NUMROWS INTEGER;
BEGIN
    /*  PARENT 'PROVEEDORES' MUST EXIST WHEN INSERTING A CHILD IN 'NOTAS_CREDITO_PROVEEDOR'  */
    IF (NEW.TERC_NIT IS NOT NULL) THEN
    BEGIN
       SELECT COUNT(*)
       FROM   PROVEEDORES
       WHERE  PROVEEDORES.TERC_NIT = NEW.TERC_NIT
       INTO   :NUMROWS;
       IF (NUMROWS = 0) THEN
       BEGIN
          EXCEPTION PROVEEDOR_NO_EXISTE 'No existe el proveedor ' || new.terc_nit;
       END
    END
    /*  PARENT 'PREFIJOS' MUST EXIST WHEN INSERTING A CHILD IN 'NOTAS_CREDITO_PROVEEDOR'  */
    IF (NEW.TIDO_COD IS NOT NULL AND
        NEW.PREF_PRE IS NOT NULL) THEN
    BEGIN
       SELECT COUNT(*)
       FROM   PREFIJOS
       WHERE  PREFIJOS.TIDO_COD = NEW.TIDO_COD
        AND   PREFIJOS.PREF_PRE = NEW.PREF_PRE
       INTO   :NUMROWS;
       IF (NUMROWS = 0) THEN
       BEGIN
          EXCEPTION PREFIJO_NO_EXISTE 'No existe el prefijo ' || new.pref_pre;
       END
    END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER TI_NOTAS_DEBITO_CLIENTES FOR NOTAS_DEBITO_CLIENTES
ACTIVE BEFORE INSERT POSITION 0
AS
DECLARE VARIABLE NUMROWS INTEGER;
BEGIN
    /*  PARENT 'CLIENTES' MUST EXIST WHEN INSERTING A CHILD IN 'NOTAS_DEBITO_CLIENTES'  */
    IF (NEW.TERC_NIT IS NOT NULL) THEN
    BEGIN
       SELECT COUNT(*)
       FROM   CLIENTES
       WHERE  CLIENTES.TERC_NIT = NEW.TERC_NIT
       INTO   :NUMROWS;
       IF (NUMROWS = 0) THEN
       BEGIN
          EXCEPTION CLIENTE_NO_EXISTE 'No existe el cliente ' || new.terc_nit;
       END
    END
    /*  PARENT 'VENDEDORES' MUST EXIST WHEN INSERTING A CHILD IN 'NOTAS_DEBITO_CLIENTES'  */
    IF (NEW.COBR_COD IS NOT NULL) THEN
    BEGIN
       SELECT COUNT(*)
       FROM   COBRADORES
       WHERE  COBRADORES.COBR_COD = NEW.COBR_COD
       INTO   :NUMROWS;
       IF (NUMROWS = 0) THEN
       BEGIN
          EXCEPTION COBRADOR_NOREG 'No existe el cobrador ' || new.cobr_cod;
       END
    END
    /*  PARENT 'PREFIJOS' MUST EXIST WHEN INSERTING A CHILD IN 'NOTAS_DEBITO_CLIENTES'  */
    IF (NEW.TIDO_COD IS NOT NULL AND
        NEW.PREF_PRE IS NOT NULL) THEN
    BEGIN
       SELECT COUNT(*)
       FROM   PREFIJOS
       WHERE  PREFIJOS.TIDO_COD = NEW.TIDO_COD
        AND   PREFIJOS.PREF_PRE = NEW.PREF_PRE
       INTO   :NUMROWS;
       IF (NUMROWS = 0) THEN
       BEGIN
          EXCEPTION PREFIJO_NO_EXISTE 'No existe el prefijo de nota débito ' || new.pref_pre;
       END
    END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER TI_NOTAS_DEBITO_PROVEEDOR FOR NOTAS_DEBITO_PROVEEDOR
ACTIVE BEFORE INSERT POSITION 0
AS
DECLARE VARIABLE NUMROWS INTEGER;
BEGIN
    /*  PARENT 'PROVEEDORES' MUST EXIST WHEN INSERTING A CHILD IN 'NOTAS_DEBITO_PROVEEDOR'  */
    IF (NEW.TERC_NIT IS NOT NULL) THEN
    BEGIN
       SELECT COUNT(*)
       FROM   PROVEEDORES
       WHERE  PROVEEDORES.TERC_NIT = NEW.TERC_NIT
       INTO   :NUMROWS;
       IF (NUMROWS = 0) THEN
       BEGIN
          EXCEPTION PROVEEDOR_NO_EXISTE 'No existe el proveedor ' || new.terc_nit;
       END
    END
    /*  PARENT 'PREFIJOS' MUST EXIST WHEN INSERTING A CHILD IN 'NOTAS_DEBITO_PROVEEDOR'  */
    IF (NEW.TIDO_COD IS NOT NULL AND
        NEW.PREF_PRE IS NOT NULL) THEN
    BEGIN
       SELECT COUNT(*)
       FROM   PREFIJOS
       WHERE  PREFIJOS.TIDO_COD = NEW.TIDO_COD
        AND   PREFIJOS.PREF_PRE = NEW.PREF_PRE
       INTO   :NUMROWS;
       IF (NUMROWS = 0) THEN
       BEGIN
          EXCEPTION PREFIJO_NO_EXISTE 'No existe el prefijo de cargo ' || new.pref_pre;
       END
    END
END
^

SET TERM ; ^

/* 2009/01/15B mejoras a ensambles global */

ALTER TABLE ENSAMBLES
ADD ENSA_BODRETAL VARCHAR(2);

grant execute on procedure rep_ensambles to public;

INSERT INTO CONFIGURACION (CONF_MODULO, CONF_CATEGORIA, CONF_PROPIEDAD, CONF_VALOR, CONF_POSIBLES, CONF_AYUDA) VALUES ('INVENTARIO', 'ENSAMBLES', 'OPERARIO Y MAQUINA OBLIGATORIOS', 'NO', 'SI,NO', 'SI: No permite grabar un ensamble sin indicar previamente el operario y la máquina');
commit work;

/* 2009/01/15C */
grant EXECUTE on PROCEDURE MOVER_FORMATO to PUBLIC;
grant select, delete, insert, update on replica_compania to PUBLIC;
grant select, delete, insert, update on replica_articulo_estado to PUBLIC;
grant EXECUTE on PROCEDURE NRO_COPIA to PUBLIC;
grant EXECUTE on PROCEDURE contabil_aplicacl to PUBLIC;
grant EXECUTE on PROCEDURE contabil_aplicapr to PUBLIC;

/* 20090115D  descuentos por item adicionales en devoluciones */

ALTER TABLE DEVOLUCIONES_VENTAS_DETALLE
ADD DVDE_DTO1 T_PORCENTAJE;
ALTER TABLE DEVOLUCIONES_VENTAS_DETALLE
ADD DVDE_DTO2 T_PORCENTAJE;
ALTER TABLE DEVOLUCIONES_VENTAS_DETALLE
ADD DVDE_DTO3 T_PORCENTAJE;
ALTER TABLE DEVOLUCIONES_VENTAS_DETALLE
ADD DVDE_DTOM1 T_MONTO;
ALTER TABLE DEVOLUCIONES_VENTAS_DETALLE
ADD DVDE_DTOM2 T_MONTO;
ALTER TABLE DEVOLUCIONES_VENTAS_DETALLE
ADD DVDE_DTOM3 T_MONTO;
ALTER TABLE DEVOLUCIONES_VENTAS
ADD DEVT_DTOIT1 T_MONTO;
ALTER TABLE DEVOLUCIONES_VENTAS
ADD DEVT_DTOIT2 T_MONTO;
ALTER TABLE DEVOLUCIONES_VENTAS
ADD DEVT_DTOIT3 T_MONTO;

/* 20090115E */
SET TERM ^ ;

CREATE OR ALTER PROCEDURE MOVIMIENTO_NO_AFECTABLE
RETURNS (
    ID INTEGER,
    ITEM INTEGER,
    CUENTA VARCHAR(20))
AS
declare variable NRO INTEGER;
declare variable LON INTEGER;
begin

FOR SELECT CUEN_COD FROM CUENTAS ORDER BY CUEN_COD INTO :CUENTA DO
    BEGIN
    LON = STRLEN(CUENTA);
    SELECT COUNT(*) FROM CUENTAS WHERE SUBSTR(CUEN_COD, 1, :LON) = :CUENTA INTO :NRO;
    IF (NRO <> 1) THEN
        BEGIN
        FOR SELECT ENCO_CONSEC, CODE_ITEM FROM COMPROBANTE_DETALLE WHERE CUEN_COD = :CUENTA INTO :ID, :ITEM
            DO
            suspend;
        END
    END
end
^

SET TERM ; ^


/* 20090116 SE AGREGO CODBARRAS Y UNIDADES ALTERNATIVAS AL EXPORTAR */
SET TERM ^ ;

CREATE OR ALTER PROCEDURE REP_LISTA_PRECIOS(
    ARTINI VARCHAR(20),
    ARTFIN VARCHAR(20),
    GRPINI VARCHAR(2),
    GRPFIN VARCHAR(2),
    ORDEN CHAR(1),
    LINI INTEGER,
    LFIN INTEGER,
    FECHA DATE,
    DEATRES CHAR(1),
    MASIVA CHAR(1),
    HOY CHAR(1))
RETURNS (
    CODIGO VARCHAR(15),
    NOMBRE VARCHAR(60),
    REFERENCIA VARCHAR(20),
    UNIDAD VARCHAR(8),
    UNIDAD2 VARCHAR(8),
    UNIDAD3 VARCHAR(8),
    UNIDAD4 VARCHAR(8),
    CODGRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    CODSUBG VARCHAR(3),
    NOMSUBG VARCHAR(30),
    CODMARC VARCHAR(3),
    NOMMARC VARCHAR(30),
    NOMLISTA VARCHAR(30),
    PRECIO NUMERIC(18,2),
    PRECIO2 NUMERIC(18,2),
    PRECIO3 NUMERIC(18,2),
    MARGEN NUMERIC(9,2),
    IVA NUMERIC(9,2),
    IVAMONTO NUMERIC(18,2),
    CONSUMO NUMERIC(18,2),
    CANTMIN NUMERIC(18,4),
    PESO NUMERIC(9,4),
    ANCHO NUMERIC(18,4),
    ALTO NUMERIC(18,4),
    LARGO NUMERIC(18,4),
    FOTO BLOB SUB_TYPE 1 SEGMENT SIZE 80,
    OBS BLOB SUB_TYPE 1 SEGMENT SIZE 80,
    TOTAL NUMERIC(18,2))
AS
declare variable CODINI VARCHAR(20);
declare variable CODFIN VARCHAR(20);
declare variable DESINI VARCHAR(20);
declare variable DESFIN VARCHAR(20);
declare variable UTIL NUMERIC(9,2);
declare variable MOU CHAR(10);
declare variable LISIVA CHAR(2);
declare variable i integer;
declare variable J integer;
declare variable PRECAUX NUMERIC(18,2);
declare variable NUMROWS INTEGER;
declare variable DIG INTEGER;
declare variable ARTANT VARCHAR(20);
declare variable UNIDADA VARCHAR(8);
BEGIN
if (ORDEN = 'C') then
    BEGIN
    CODINI = ARTINI;
    CODFIN = ARTFIN;
    DESINI = '';
    DESFIN = 'zz';
    END
ELSE
    BEGIN
    DESINI = ARTINI;
    DESFIN = ARTFIN;
    CODINI = '';
    CODFIN = 'zz';
    END
EXECUTE PROCEDURE LEE_CONFIGURACION ('FACTURACION', 'ARTICULOS', 'SUGERIR PRECIOS CON PORCENTAJE DE MARGEN O UTILIDAD') returning_values (MOU);
EXECUTE PROCEDURE LEE_CONFIGURACION ('FACTURACION', 'ARTICULOS', 'REDONDEO AL MULTIPLO DE DIEZ EN PRECIOS') returning_values (DIG);
I = 0;
FOR SELECT a.ARTI_COD, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD, TAIV_PORC, ARTI_CONSUMO,
    ARTI_FOTO, ARTI_PESO, ARTI_LARGO, ARTI_ANCHO, ARTI_ALTO, ARTI_OBS,
    LIPR_NOM, PRAR_FIJO, PRAR_MARGEN, PRAR_UTIL, LIPR_MODIF, PRAR_CANTMIN
    FROM ARTICULO A, TARIFA_IVA T, LISTA_PRECIOS L, PRECIOS_ARTICULO P
    WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :GRPFIN AND
    ARTI_DES >= :DESINI AND ARTI_DES <= :DESFIN AND ESAR_COD = 'A' AND A.TAIV_COD = T.TAIV_COD and
    L.LIPR_COD = P.LIPR_COD AND p.arti_cod = a.arti_cod and l.lipr_cod >= :lini and l.lipr_cod <= :lfin AND
    ((:fecha IS NULL) or ((L.lipr_fecini <= :FECHA) AND (L.lipr_fecfin >= :FECHA)))
    ORDER BY ARTI_COD, L.LIPR_COD
    INTO :CODIGO, :NOMBRE, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :IVA, :CONSUMO,
        :FOTO, :PESO, :LARGO, :ANCHO, :ALTO, :OBS, :NOMLISTA, :PRECIO, :MARGEN, :UTIL, :LISIVA, :cantmin
    DO
    BEGIN
    if (FECHA IS NULL) then
        FECHA = cast('now' as DATE);
    SELECT COUNT(AUDI_ID) FROM AUDITORIA WHERE TIDO_COD = 126 AND AUDI_COD = :CODIGO AND AUDI_FECHA = :FECHA AND AUDI_OPER <> 'D' INTO :NUMROWS;
    if ((HOY = 'N') or (NUMROWS <> 0)) then
        BEGIN
        SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
        SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
        SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
        SELECT MIN(COBA_COD) FROM barras_articulo WHERE ARTI_COD = :codigo INTO :referencia;
        J = 0;
        UNIDAD2 = '';
        UNIDAD3 = '';
        UNIDAD4 = '';
        for SELECT UNAR_UNIDAD FROM unidad_articulo WHERE ARTI_COD = :codigo INTO :unidada
            DO
            BEGIN
            if (J = 0) then
                UNIDAD2 = UNIDADA;
            if (J = 1) then
                UNIDAD3 = UNIDADA;
            if (J = 2) then
                UNIDAD4 = UNIDADA;
            J = J + 1;
            END
        if (MOU = 'UTILIDAD') then
            MARGEN = UTIL;
        if (LISIVA = 'N') then
            IVAMONTO = PRECIO * IVA / 100;
        ELSE
            BEGIN
            IVAMONTO = (PRECIO - CONSUMO) * IVA / (100 + IVA);
            PRECIO = (PRECIO - CONSUMO) / (1 + (IVA/100));
/*            EXECUTE PROCEDURE redondee(PRECIO, DIG) returning_values (PRECIO); */
            END
        TOTAL = PRECIO + IVAMONTO + CONSUMO;
        EXECUTE PROCEDURE redondee(TOTAL, DIG) returning_values (TOTAL);
        if (DEATRES = 'N') then
            SUSPEND;
        else
            BEGIN
            I = I + 1;
            if (MASIVA = 'S') then
                PRECIO = TOTAL;
            TOTAL = 0;
            if (MOD(I,3) = 1) then
                BEGIN
                PRECAUX = PRECIO;
                PRECIO2 = 0;
                PRECIO3 = 0;
                END
            if (MOD(I,3) = 2) then
                BEGIN
                PRECIO2 = PRECIO;
                PRECIO = PRECAUX;
                END
            if (MOD(I,3) = 0) then
                BEGIN
                PRECIO3 = PRECIO;
                PRECIO = PRECAUX;
                SUSPEND;
                END
            END
        END
    if ((DEATRES = 'S') AND (MOD(I,3) <> 0) AND (ARTANT <> CODIGO)) then
        BEGIN
        I = 0;
        SUSPEND;
        END
    ARTANT = CODIGO;
    end
if ((DEATRES = 'S') AND (MOD(I,3) <> 0)) then
    SUSPEND;
END
^

SET TERM ; ^

/* CEDULA EN REPORTE DE VENDEDORES */

SET TERM ^ ;

CREATE OR ALTER PROCEDURE REP_VENDEDORES(
    DESDE INTEGER,
    HASTA INTEGER,
    FECHA DATE)
RETURNS (
    VEND_COD INTEGER,
    VEND_NOMBRE VARCHAR(60),
    VEND_CC VARCHAR(20),
    VEND_ESTADO CHAR(1),
    VEND_DIRECCION VARCHAR(60),
    VEND_TELEFONOS VARCHAR(30),
    PUNTOS NUMERIC(18,4),
    CENTROC VARCHAR(4),
    SUBCENTRO VARCHAR(4),
    PUNTOVTA INTEGER)
AS
begin
FOR SELECT VEND_COD, VEND_NOMBRE, VEND_ESTADO, VEND_DIRECCION, VEND_TELEFONOS, VEND_CC, PROY_COD, CENT_COD, PTVT_ID
    FROM VENDEDORES WHERE VEND_COD >= :desde AND VEND_COD <= :hasta order by VEND_COD
    INTO :vend_cod, :vend_nombre, :vend_estado, :vend_direccion, :vend_telefonos, :vend_cc, :centroc, :subcentro, :puntovta
    DO
    BEGIN
    EXECUTE PROCEDURE consulta_puntos_vendedor (:VEND_COD, :FECHA) returning_values (puntos);
    suspend;
    END
end
^

SET TERM ; ^

/* 20090119 */
/* SE ESTANDARIZO EL SIGNIFICADO DE LOS DATOS PRECIO NETO Y SUBTOTAL ITEM ASI:
PRNETO: PRECIO MENOS DESCUENTO CON O SIN IMPUESTOS DEPENDIENDO DE LA LISTA
PRNETOSINIVA: PRECIO MENOS DESCUENTO ANTES DE IVA E IMPOCONSUMO
SUBTOTIT: SUBTOTAL DEL ITEM ANTES DE IVA Y ANTES DE ICO SI LA CONFIGURACION LO INDICA

OJO PUEDE CAMBIAR LA FORMA COMO SE ESTAN IMPRIMIENDO ACTUALMENTE LAS FACTURAS, PEDIDOS, REMISIONES, COTIZACIONES Y DEVOLUCIONES */

SET TERM ^ ;

CREATE OR ALTER PROCEDURE IMPR_COTIZACION(
    ID INTEGER)
RETURNS (
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    VALIDEZ INTEGER,
    NIT VARCHAR(20),
    NOMTERCERO VARCHAR(60),
    VENDEDOR INTEGER,
    NOMVENDEDOR VARCHAR(60),
    PUNTOVTA INTEGER,
    NOMPUNTOVTA VARCHAR(30),
    SUBTOTAL NUMERIC(18,2),
    DTOPORC NUMERIC(9,2),
    DTOMONTO NUMERIC(18,2),
    ADICIONAL NUMERIC(18,2),
    IVAMONTO NUMERIC(18,2),
    EXTRA NUMERIC(18,2),
    TOTALFAC NUMERIC(18,2),
    OBS BLOB SUB_TYPE 1 SEGMENT SIZE 80,
    ITEM INTEGER,
    ARTICULO VARCHAR(15),
    CODBAR VARCHAR(15),
    ARTIDES VARCHAR(60),
    CANT NUMERIC(18,4),
    UNIDAD VARCHAR(8),
    FACTOR NUMERIC(18,4),
    LISTAPR INTEGER,
    REFITEM VARCHAR(60),
    PRUNIT NUMERIC(18,2),
    DTOITPORC NUMERIC(9,2),
    DTOITMONTO NUMERIC(18,2),
    PRNETO NUMERIC(18,2),
    PRNETOSINIVA NUMERIC(18,2),
    IVAPORC NUMERIC(9,2),
    IVAITMONTO NUMERIC(18,2),
    CONSUMO NUMERIC(18,2),
    SUBTOTIT NUMERIC(18,2),
    TOTAL NUMERIC(18,2),
    CODIGOCL VARCHAR(20),
    ZONACOD VARCHAR(2),
    ZONANOM VARCHAR(60),
    DV CHAR(1),
    DIRECCION VARCHAR(60),
    CIUDAD VARCHAR(40),
    TELEFONO VARCHAR(40),
    CONTACTO VARCHAR(60),
    FAX VARCHAR(25),
    GRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    SUBGRUPO VARCHAR(3),
    NOMSUBG VARCHAR(30),
    MARCA VARCHAR(3),
    NOMMARCA VARCHAR(30),
    PESO NUMERIC(9,4),
    ANCHO NUMERIC(18,4),
    ALTO NUMERIC(18,4),
    LARGO NUMERIC(18,4),
    SUMA1 NUMERIC(18,2),
    SUMA2 NUMERIC(18,2),
    SUMA3 NUMERIC(18,2),
    IVA1 NUMERIC(18,2),
    IVA2 NUMERIC(18,2),
    IVA3 NUMERIC(18,2),
    SUMAEX NUMERIC(18,2),
    SUMAGR NUMERIC(18,2),
    OBSITEM BLOB SUB_TYPE 1 SEGMENT SIZE 80)
AS
DECLARE VARIABLE IMPTOS CHAR(1);
DECLARE VARIABLE TARIFA INTEGER;
declare variable ORDENCOD CHAR(2);
declare variable SUCUR VARCHAR(10);
declare variable ICOINC CHAR(2);
BEGIN
execute procedure lee_configuracion('FACTURACION', 'ARTICULOS', 'IMPOCONSUMO INCLUIDO EN EL PRECIO BASE DE VENTA ANTES DE IVA') returning_values (icoinc);
SELECT F.PREF_PRE, COTI_NUMERO, COTI_FECHA, COTI_VALIDEZ, F.TERC_NIT, COTI_NOMTERC, F.VEND_COD, VEND_NOMBRE, F.PTVT_ID, PTVT_NOM,
    COTI_IMPTOS, COTI_DTOPORC, COTI_DTOMONTO, COTI_ADICIONAL, COTI_IVAMONTO, COTI_EXTRA, COTI_TOTAL,
    TERC_CONTACTO, TERC_FAX, TERC_DV, COTI_OBS, COTI_SUCURSAL
    FROM COTIZACIONES F, VENDEDORES V, PUNTO_VENTA P, TERCEROS T
    WHERE F.VEND_COD = V.VEND_COD AND F.PTVT_ID = P.PTVT_ID AND F.TERC_NIT = T.TERC_NIT AND F.COTI_ID = :ID
    into :PREF, :NUMERO, :FECHA, :VALIDEZ, :NIT, :NOMTERCERO, :VENDEDOR, :NOMVENDEDOR, :PUNTOVTA, :NOMPUNTOVTA,
    :IMPTOS, :DTOPORC, :DTOMONTO, :ADICIONAL, :IVAMONTO, :EXTRA, :TOTALFAC,
    :CONTACTO, :FAX, :DV, :OBS, :SUCUR;
SUBTOTAL = TOTALFAC - EXTRA - IVAMONTO - ADICIONAL + DTOMONTO;

SELECT CLIE_COD, C.ZONA_COD, ZONA_NOM
    FROM CLIENTES C, ZONAS Z
    WHERE TERC_NIT = :NIT AND C.ZONA_COD = Z.ZONA_COD
    INTO :CODIGOCL, :ZONACOD, :ZONANOM;
SELECT CLSU_DIR, CLSU_CIUDAD, CLSU_TEL FROM CLIENTE_SUCURSALES WHERE TERC_NIT = :NIT AND CLCU_COD = :SUCUR
    INTO :DIRECCION, :CIUDAD, :TELEFONO;
    
SUMAEX = 0;
SUMA1 = 0;
SUMA2 = 0;
SUMA3 = 0;
IVA1 = 0;
IVA2 = 0;
IVA3 = 0;
ITEM = 0;
EXECUTE PROCEDURE lee_configuracion ('FACTURACION','DOCUMENTOS','ORDENAR ITEMS POR CODIGO DE ARTICULO') returning_values (:ORDENCOD);
if (ORDENCOD = 'SI') then
    BEGIN
    FOR SELECT D.ARTI_COD, CTDE_CODBAR, SUBSTR(CTDE_DESC,1,60), CTDE_CANT, CTDE_UNIDAD, LIPR_COD, CTDE_PRUNIT, CTDE_DTOPORC, CTDE_DTOMONTO, CTDE_IVAPORC, CTDE_IVAMONTO, CTDE_CONSUMO, CTDE_TOTAL, CTDE_REFERENCIA,
        GRUP_COD, SUBG_COD, MARC_COD, ARTI_PESO, ARTI_ANCHO, ARTI_ALTO, ARTI_LARGO, TAIV_COD, CTDE_OBS, CTDE_FACTOR
        FROM COTIZACIONES_DETALLE D, ARTICULO A
        WHERE D.ARTI_COD = A.ARTI_COD AND D.COTI_ID = :ID
        ORDER BY CTDE_CODBAR
        INTO :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :LISTAPR, :PRUNIT, :DTOITPORC, :DTOITMONTO, :IVAPORC, :IVAITMONTO, :CONSUMO, :TOTAL, :refitem,
        :GRUPO, :SUBGRUPO, :MARCA, :PESO, :ANCHO, :ALTO, :LARGO, :TARIFA, :obsitem, :FACTOR
        DO
        BEGIN
        if (ICOINC = 'SI') then
            SUBTOTIT = TOTAL - IVAITMONTO;
        else
            SUBTOTIT = TOTAL - IVAITMONTO - CONSUMO;
        if (ARTICULO = CODBAR) then
            SELECT FIRST 1 COBA_COD FROM barras_articulo WHERE ARTI_COD = :articulo INTO :CODBAR;
        SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :GRUPO INTO NOMGRUPO;
        SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :MARCA INTO NOMMARCA;
        SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :SUBGRUPO AND GRUP_COD = :GRUPO INTO :NOMSUBG;
        ITEM = ITEM + 1;
        PRNETO = PRUNIT - DTOITMONTO;
        if (IMPTOS = 'S') then
            if (cant <> 0) then
                prnetosiniva = PRUNIT - DTOITMONTO - ((IVAITMONTO+CONSUMO) / CANT);
            else
                prnetosiniva = PRUNIT - DTOITMONTO;
        ELSE
            prnetosiniva = PRUNIT - DTOITMONTO;
        if (ivaporc = 0) then
            SUMAEX = SUMAEX + TOTAL;
        if (TARIFA = 1) then
            BEGIN
            SUMA1 = SUMA1 + TOTAL - IVAITMONTO;
            IVA1 = IVA1 + IVAITMONTO;
            END
        if (TARIFA = 2) then
            BEGIN
            SUMA2 = SUMA2 + TOTAL - IVAITMONTO;
            IVA2 = IVA2 + IVAITMONTO;
            END
        if (TARIFA = 3) then
            BEGIN
            SUMA3 = SUMA3 + TOTAL - IVAITMONTO;
            IVA3 = IVA3 + IVAITMONTO;
            END
        SUMAGR = SUMA1 + SUMA2 + SUMA3;
        if (IMPTOS = 'N') then
            TOTAL = TOTAL - IVAITMONTO;
        SUSPEND;
        END
    END
ELSE
    BEGIN
    FOR SELECT D.ARTI_COD, CTDE_CODBAR, SUBSTR(CTDE_DESC,1,60), CTDE_CANT, CTDE_UNIDAD, LIPR_COD, CTDE_PRUNIT, CTDE_DTOPORC, CTDE_DTOMONTO, CTDE_IVAPORC, CTDE_IVAMONTO, CTDE_CONSUMO, CTDE_TOTAL, CTDE_REFERENCIA,
        GRUP_COD, SUBG_COD, MARC_COD, ARTI_PESO, ARTI_ANCHO, ARTI_ALTO, ARTI_LARGO, TAIV_COD, CTDE_OBS, CTDE_FACTOR
        FROM COTIZACIONES_DETALLE D, ARTICULO A
        WHERE D.ARTI_COD = A.ARTI_COD AND D.COTI_ID = :ID
        ORDER BY CTDE_ITEM
        INTO :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :LISTAPR, :PRUNIT, :DTOITPORC, :DTOITMONTO, :IVAPORC, :IVAITMONTO, :CONSUMO, :TOTAL, :refitem,
        :GRUPO, :SUBGRUPO, :MARCA, :PESO, :ANCHO, :ALTO, :LARGO, :TARIFA, :obsitem, :FACTOR
        DO
        BEGIN
        SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :GRUPO INTO NOMGRUPO;
        SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :MARCA INTO NOMMARCA;
        SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :SUBGRUPO AND GRUP_COD = :GRUPO INTO :NOMSUBG;
        ITEM = ITEM + 1;
        PRNETO = PRUNIT - DTOITMONTO;
        if (IMPTOS = 'S') then
            if (cant <> 0) then
                prnetosiniva = PRUNIT - DTOITMONTO - ((IVAITMONTO+CONSUMO) / CANT);
            else
                prnetosiniva = PRUNIT - DTOITMONTO;
        ELSE
            prnetosiniva = PRUNIT - DTOITMONTO;
        if (ivaporc = 0) then
            SUMAEX = SUMAEX + TOTAL;
        if (TARIFA = 1) then
            BEGIN
            SUMA1 = SUMA1 + TOTAL - IVAITMONTO;
            IVA1 = IVA1 + IVAITMONTO;
            END
        if (TARIFA = 2) then
            BEGIN
            SUMA2 = SUMA2 + TOTAL - IVAITMONTO;
            IVA2 = IVA2 + IVAITMONTO;
            END
        if (TARIFA = 3) then
            BEGIN
            SUMA3 = SUMA3 + TOTAL - IVAITMONTO;
            IVA3 = IVA3 + IVAITMONTO;
            END
        SUMAGR = SUMA1 + SUMA2 + SUMA3;
        if (IMPTOS = 'N') then
            TOTAL = TOTAL - IVAITMONTO;
        SUSPEND;
        END
    END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER PROCEDURE IMPR_REMISION(
    ID INTEGER)
RETURNS (
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    NIT VARCHAR(20),
    NOMTERCERO VARCHAR(60),
    VENDEDOR INTEGER,
    NOMVENDEDOR VARCHAR(60),
    PUNTOVTA INTEGER,
    NOMPUNTOVTA VARCHAR(30),
    CODBODEGA VARCHAR(2),
    NOMBODEGA VARCHAR(30),
    COTIZACION VARCHAR(30),
    PEDIDO VARCHAR(30),
    FACTURA VARCHAR(30),
    SUBTOTAL NUMERIC(18,2),
    IVAMONTO NUMERIC(18,2),
    TOTALFAC NUMERIC(18,2),
    DESPACHO VARCHAR(255),
    TRANSPORTADOR VARCHAR(60),
    OBS BLOB SUB_TYPE 1 SEGMENT SIZE 80,
    ITEM INTEGER,
    ARTICULO VARCHAR(15),
    CODBAR VARCHAR(15),
    ARTIDES VARCHAR(60),
    CANT NUMERIC(18,4),
    LOTE VARCHAR(15),
    VLOTE DATE,
    UNIDAD VARCHAR(8),
    CAJAS NUMERIC(18,4),
    DEVUELTO NUMERIC(18,4),
    CONSUMIDO NUMERIC(18,4),
    LISTAPR INTEGER,
    REFITEM VARCHAR(60),
    BODITEM VARCHAR(2),
    STAND VARCHAR(15),
    PRUNIT NUMERIC(18,2),
    DTOITPORC NUMERIC(9,2),
    DTOITMONTO NUMERIC(18,2),
    PRNETOSINIVA NUMERIC(18,2),
    PRNETO NUMERIC(18,2),
    IVAPORC NUMERIC(9,2),
    IVAITMONTO NUMERIC(18,2),
    CONSUMO NUMERIC(18,2),
    SUBTOTIT NUMERIC(18,2),
    TOTAL NUMERIC(18,2),
    CODIGOCL VARCHAR(20),
    ZONACOD VARCHAR(2),
    ZONANOM VARCHAR(60),
    DV CHAR(1),
    DIRECCION VARCHAR(60),
    CIUDAD VARCHAR(40),
    TELEFONO VARCHAR(40),
    CONTACTO VARCHAR(60),
    FAX VARCHAR(25),
    GRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    SUBGRUPO VARCHAR(3),
    NOMSUBG VARCHAR(30),
    MARCA VARCHAR(3),
    NOMMARCA VARCHAR(30),
    PESO NUMERIC(9,4),
    ANCHO NUMERIC(18,4),
    ALTO NUMERIC(18,4),
    LARGO NUMERIC(18,4),
    SUMA1 NUMERIC(18,2),
    SUMA2 NUMERIC(18,2),
    SUMA3 NUMERIC(18,2),
    IVA1 NUMERIC(18,2),
    IVA2 NUMERIC(18,2),
    IVA3 NUMERIC(18,2),
    SUMAEX NUMERIC(18,2),
    SUMAGR NUMERIC(18,2),
    TOTCAJAS NUMERIC(18,2),
    OBSITEM BLOB SUB_TYPE 1 SEGMENT SIZE 80)
AS
DECLARE VARIABLE IMPTOS CHAR(1);
DECLARE VARIABLE TARIFA INTEGER;
declare variable ORDENCOD CHAR(2);
declare variable SUCUR VARCHAR(10);
declare variable FACTOR NUMERIC(18,4);
declare variable ICOINC CHAR(2);
BEGIN
execute procedure lee_configuracion('FACTURACION', 'ARTICULOS', 'IMPOCONSUMO INCLUIDO EN EL PRECIO BASE DE VENTA ANTES DE IVA') returning_values (icoinc);
EXECUTE PROCEDURE lee_configuracion ('FACTURACION','DOCUMENTOS','ORDENAR ITEMS POR CODIGO DE ARTICULO') returning_values (:ORDENCOD);
SELECT F.PREF_PRE, REVT_NUMERO, REVT_FECHA, F.BODE_COD, BODE_NOM, F.TERC_NIT, REVT_NOMTERC, F.VEND_COD, VEND_NOMBRE, F.PTVT_ID, PTVT_NOM,
    REVT_COTIZACI, REVT_PEDIDO, REVT_FACTURA, REVT_IVAINC,
    REVT_IVAMONTO, REVT_TOTAL, REVT_DESPACHO, REVT_TRANSP,
    TERC_CONTACTO, TERC_FAX, TERC_DV, REVT_OBS, REVT_SUCURSAL
    FROM REMISIONES_VENTA F, BODEGA B, VENDEDORES V, PUNTO_VENTA P, TERCEROS T
    WHERE F.BODE_COD = B.BODE_COD AND F.VEND_COD = V.VEND_COD AND F.PTVT_ID = P.PTVT_ID AND F.TERC_NIT = T.TERC_NIT AND F.REVT_ID = :ID
    into :PREF, :NUMERO, :FECHA, :CODBODEGA, :NOMBODEGA, :NIT, :NOMTERCERO, :VENDEDOR, :NOMVENDEDOR, :PUNTOVTA, :NOMPUNTOVTA,
    :COTIZACION, :PEDIDO, :FACTURA, :IMPTOS,
    :IVAMONTO, :TOTALFAC, :DESPACHO, :transportador, 
    :CONTACTO, :FAX, :DV, :OBS, :SUCUR;
SUBTOTAL = TOTALFAC - IVAMONTO;

SELECT CLIE_COD, C.ZONA_COD, ZONA_NOM
    FROM CLIENTES C, ZONAS Z
    WHERE TERC_NIT = :NIT AND C.ZONA_COD = Z.ZONA_COD
    INTO :CODIGOCL, :ZONACOD, :ZONANOM;
SELECT CLSU_DIR, CLSU_CIUDAD, CLSU_TEL FROM CLIENTE_SUCURSALES WHERE TERC_NIT = :NIT AND CLCU_COD = :SUCUR
    INTO :DIRECCION, :CIUDAD, :TELEFONO;
    
SUMAEX = 0;
SUMA1 = 0;
SUMA2 = 0;
SUMA3 = 0;
IVA1 = 0;
IVA2 = 0;
IVA3 = 0;
ITEM = 0;
totcajas = 0;
if (ORDENCOD = 'SI') then
    BEGIN
    FOR SELECT D.ARTI_COD, RVDE_CODBAR, SUBSTR(RVDE_DESC,1,60), RVDE_CANT, RVDE_UNIDAD, BODE_COD, RVDE_LOTE, LIPR_COD, RVDE_PRUNIT, RVDE_DTOPORC, RVDE_DTOMONTO, RVDE_IVAPORC, RVDE_IVAMONTO, RVDE_CONSUMO, RVDE_TOTAL, RVDE_REFERENCIA,
        GRUP_COD, SUBG_COD, MARC_COD, ARTI_PESO, ARTI_ANCHO, ARTI_ALTO, ARTI_LARGO, TAIV_COD, RVDE_DEVUELTO, RVDE_OBS, RVDE_CAJAS, RVDE_FACTOR
        FROM REMISIONES_VENTA_DETALLE D, ARTICULO A
        WHERE D.ARTI_COD = A.ARTI_COD AND D.REVT_ID = :ID
        ORDER BY RVDE_CODBAR
        INTO :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :BODITEM, :LOTE, :LISTAPR, :PRUNIT, :DTOITPORC, :DTOITMONTO, :IVAPORC, :IVAITMONTO, :CONSUMO, :TOTAL, :refitem,
            :GRUPO, :SUBGRUPO, :MARCA, :PESO, :ANCHO, :ALTO, :LARGO, :TARIFA, :DEVUELTO, :obsitem, :CAJAS, :FACTOR
        DO
        BEGIN
        if (ARTICULO = CODBAR) then
            SELECT FIRST 1 COBA_COD FROM barras_articulo WHERE ARTI_COD = :articulo INTO :CODBAR;
        SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :GRUPO INTO NOMGRUPO;
        SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :MARCA INTO NOMMARCA;
        SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :SUBGRUPO AND GRUP_COD = :GRUPO INTO :NOMSUBG;
        SELECT LOTE_VENCE FROM LOTES WHERE LOTE_NRO = :lote AND ARTI_COD = :ARTICULO AND BODE_COD = :boditem INTO :vlote;
        if (ICOINC = 'SI') then
            SUBTOTIT = TOTAL - IVAITMONTO;
        else
            SUBTOTIT = TOTAL - IVAITMONTO - CONSUMO;
        CONSUMIDO = cant * factor - devuelto;
        ITEM = ITEM + 1;
        PRNETO = PRUNIT - DTOITMONTO;
        if (IMPTOS = 'S') then
            if (cant <> 0) then
                prnetosiniva = PRUNIT - DTOITMONTO - ((IVAITMONTO+CONSUMO) / CANT);
            else
                prnetosiniva = PRUNIT - DTOITMONTO;
        ELSE
            prnetosiniva = PRUNIT - DTOITMONTO;
        if (IVAPORC = 0) then
            SUMAEX = SUMAEX + TOTAL;
        if (TARIFA = 1) then
            BEGIN
            SUMA1 = SUMA1 + TOTAL - IVAITMONTO;
            IVA1 = IVA1 + IVAITMONTO;
            END
        if (TARIFA = 2) then
            BEGIN
            SUMA2 = SUMA2 + TOTAL - IVAITMONTO;
            IVA2 = IVA2 + IVAITMONTO;
            END
        if (TARIFA = 3) then
            BEGIN
            SUMA3 = SUMA3 + TOTAL - IVAITMONTO;
            IVA3 = IVA3 + IVAITMONTO;
            END
        SUMAGR = SUMA1 + SUMA2 + SUMA3;

        totcajas = totcajas + cajas;
        SELECT STAND_COD FROM STANDS WHERE ARTI_COD = :ARTICULO AND STAND_BODEGA = :boditem INTO :stand;
        SUSPEND;
        END
    END
ELSE
    BEGIN
    FOR SELECT RVDE_ITEM, D.ARTI_COD, RVDE_CODBAR, SUBSTR(RVDE_DESC,1,60), RVDE_CANT, RVDE_UNIDAD, BODE_COD, RVDE_LOTE, LIPR_COD, RVDE_PRUNIT, RVDE_DTOPORC, RVDE_DTOMONTO, RVDE_IVAPORC, RVDE_IVAMONTO, RVDE_CONSUMO, RVDE_TOTAL, RVDE_REFERENCIA,
        GRUP_COD, SUBG_COD, MARC_COD, ARTI_PESO, ARTI_ANCHO, ARTI_ALTO, ARTI_LARGO, TAIV_COD, RVDE_DEVUELTO, RVDE_OBS, RVDE_CAJAS, RVDE_FACTOR
        FROM REMISIONES_VENTA_DETALLE D, ARTICULO A
        WHERE D.ARTI_COD = A.ARTI_COD AND D.REVT_ID = :ID
        ORDER BY RVDE_ITEM
        INTO :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :BODITEM, :LOTE, :LISTAPR, :PRUNIT, :DTOITPORC, :DTOITMONTO, :IVAPORC, :IVAITMONTO, :CONSUMO, :TOTAL, :refitem,
            :GRUPO, :SUBGRUPO, :MARCA, :PESO, :ANCHO, :ALTO, :LARGO, :TARIFA, :DEVUELTO, :obsitem, :CAJAS, :FACTOR
        DO
        BEGIN
        SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :GRUPO INTO NOMGRUPO;
        SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :MARCA INTO NOMMARCA;
        SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :SUBGRUPO AND GRUP_COD = :GRUPO INTO :NOMSUBG;
        SELECT LOTE_VENCE FROM LOTES WHERE LOTE_NRO = :lote AND ARTI_COD = :ARTICULO AND BODE_COD = :boditem INTO :vlote;
        if (ICOINC = 'SI') then
            SUBTOTIT = TOTAL - IVAITMONTO;
        else
            SUBTOTIT = TOTAL - IVAITMONTO - CONSUMO;
        CONSUMIDO = cant * factor - devuelto;
        ITEM = ITEM + 1;
        PRNETO = PRUNIT - DTOITMONTO;
        if (IMPTOS = 'S') then
            if (cant <> 0) then
                prnetosiniva = PRUNIT - DTOITMONTO - ((IVAITMONTO+CONSUMO) / CANT);
            else
                prnetosiniva = PRUNIT - DTOITMONTO;
        ELSE
            prnetosiniva = PRUNIT - DTOITMONTO;
        if (IVAPORC = 0) then
            SUMAEX = SUMAEX + TOTAL;
        if (TARIFA = 1) then
            BEGIN
            SUMA1 = SUMA1 + TOTAL - IVAITMONTO;
            IVA1 = IVA1 + IVAITMONTO;
            END
        if (TARIFA = 2) then
            BEGIN
            SUMA2 = SUMA2 + TOTAL - IVAITMONTO;
            IVA2 = IVA2 + IVAITMONTO;
            END
        if (TARIFA = 3) then
            BEGIN
            SUMA3 = SUMA3 + TOTAL - IVAITMONTO;
            IVA3 = IVA3 + IVAITMONTO;
            END
        SUMAGR = SUMA1 + SUMA2 + SUMA3;
        totcajas = totcajas + cajas;
        SELECT STAND_COD FROM STANDS WHERE ARTI_COD = :ARTICULO AND STAND_BODEGA = :boditem INTO :stand;
        SUSPEND;
        END
    END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER PROCEDURE IMPR_PEDIDO(
    ID INTEGER)
RETURNS (
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    VALIDEZ INTEGER,
    NIT VARCHAR(20),
    NOMTERCERO VARCHAR(60),
    VENDEDOR INTEGER,
    NOMVENDEDOR VARCHAR(60),
    PUNTOVTA INTEGER,
    NOMPUNTOVTA VARCHAR(30),
    COTIZACION VARCHAR(30),
    SUBTOTAL NUMERIC(18,2),
    DTOPORC NUMERIC(9,2),
    DTOMONTO NUMERIC(18,2),
    ADICIONAL NUMERIC(18,2),
    IVAMONTO NUMERIC(18,2),
    EXTRA NUMERIC(18,2),
    TOTALFAC NUMERIC(18,2),
    OBS BLOB SUB_TYPE 1 SEGMENT SIZE 80,
    ITEM INTEGER,
    ARTICULO VARCHAR(15),
    CODBAR VARCHAR(15),
    ARTIDES VARCHAR(60),
    BODEGA VARCHAR(2),
    CANT NUMERIC(18,4),
    UNIDAD VARCHAR(8),
    LISTAPR INTEGER,
    REFITEM VARCHAR(60),
    PRUNIT NUMERIC(18,2),
    DTOITPORC NUMERIC(9,2),
    DTOITMONTO NUMERIC(18,2),
    PRNETO NUMERIC(18,2),
    PRNETOSINIVA NUMERIC(18,2),
    IVAPORC NUMERIC(9,2),
    IVAITMONTO NUMERIC(18,2),
    CONSUMO NUMERIC(18,2),
    SUBTOTIT NUMERIC(18,2),
    TOTAL NUMERIC(18,2),
    CODIGOCL VARCHAR(20),
    ZONACOD VARCHAR(2),
    ZONANOM VARCHAR(60),
    DV CHAR(1),
    DIRECCION VARCHAR(60),
    CIUDAD VARCHAR(40),
    TELEFONO VARCHAR(40),
    CONTACTO VARCHAR(60),
    FAX VARCHAR(25),
    GRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    SUBGRUPO VARCHAR(3),
    NOMSUBG VARCHAR(30),
    MARCA VARCHAR(3),
    NOMMARCA VARCHAR(30),
    PESO NUMERIC(9,4),
    ANCHO NUMERIC(18,4),
    ALTO NUMERIC(18,4),
    LARGO NUMERIC(18,4),
    SUMA1 NUMERIC(18,2),
    SUMA2 NUMERIC(18,2),
    SUMA3 NUMERIC(18,2),
    IVA1 NUMERIC(18,2),
    IVA2 NUMERIC(18,2),
    IVA3 NUMERIC(18,2),
    SUMAEX NUMERIC(18,2),
    SUMAGR NUMERIC(18,2),
    OBSITEM BLOB SUB_TYPE 1 SEGMENT SIZE 80)
AS
DECLARE VARIABLE IMPTOS CHAR(1);
DECLARE VARIABLE TARIFA INTEGER;
declare variable ORDENCOD CHAR(2);
declare variable SUCUR VARCHAR(10);
declare variable ICOINC CHAR(2);
BEGIN
execute procedure lee_configuracion('FACTURACION', 'ARTICULOS', 'IMPOCONSUMO INCLUIDO EN EL PRECIO BASE DE VENTA ANTES DE IVA') returning_values (icoinc);
SELECT F.PREF_PRE, PEDI_NUMERO, PEDI_FECHA, PEDI_VALIDEZ, F.TERC_NIT, PEDI_NOMTERC, F.VEND_COD, VEND_NOMBRE, F.PTVT_ID, PTVT_NOM, PEDI_COTIZACI,
    PEDI_IVAINC, PEDI_DTOPOR, PEDI_DTOMONTO, PEDI_ADICIONAL, PEDI_IVAMONTO, PEDI_EXTRA, PEDI_TOTAL,
    TERC_CONTACTO, TERC_FAX, TERC_DV, PEDI_OBS, PEDI_SUCURSAL
    FROM PEDIDOS F, VENDEDORES V, PUNTO_VENTA P, TERCEROS T
    WHERE F.VEND_COD = V.VEND_COD AND F.PTVT_ID = P.PTVT_ID AND F.TERC_NIT = T.TERC_NIT AND F.PEDI_ID = :ID
    into :PREF, :NUMERO, :FECHA, :VALIDEZ, :NIT, :NOMTERCERO, :VENDEDOR, :NOMVENDEDOR, :PUNTOVTA, :NOMPUNTOVTA, :COTIZACION,
    :IMPTOS, :DTOPORC, :DTOMONTO, :ADICIONAL, :IVAMONTO, :EXTRA, :TOTALFAC,
    :CONTACTO, :FAX, :DV, :OBS, :SUCUR;
SUBTOTAL = TOTALFAC - EXTRA - IVAMONTO - ADICIONAL + DTOMONTO;

SELECT CLIE_COD, C.ZONA_COD, ZONA_NOM
    FROM CLIENTES C, ZONAS Z
    WHERE TERC_NIT = :NIT AND C.ZONA_COD = Z.ZONA_COD
    INTO :CODIGOCL, :ZONACOD, :ZONANOM;
SELECT CLSU_DIR, CLSU_CIUDAD, CLSU_TEL FROM CLIENTE_SUCURSALES WHERE TERC_NIT = :NIT AND CLCU_COD = :SUCUR
    INTO :DIRECCION, :CIUDAD, :TELEFONO;
    
SUMAEX = 0;
SUMA1 = 0;
SUMA2 = 0;
SUMA3 = 0;
IVA1 = 0;
IVA2 = 0;
IVA3 = 0;
ITEM = 0;
EXECUTE PROCEDURE lee_configuracion ('FACTURACION','DOCUMENTOS','ORDENAR ITEMS POR CODIGO DE ARTICULO') returning_values (:ORDENCOD);
if (ORDENCOD = 'SI') then
    BEGIN
    FOR SELECT D.ARTI_COD, PEDE_CODBAR, SUBSTR(PEDE_DESC,1,60), PEDE_CANT, PEDE_UNIDAD, LIPR_COD, PEDE_PRUNIT, PEDE_DTOPORC, PEDE_DTOMONTO, PEDE_IVAPORC, PEDE_IVAMONTO, PEDE_CONSUMO, PEDE_TOTAL, PEDE_REFERENCIA,
        GRUP_COD, SUBG_COD, MARC_COD, ARTI_PESO, ARTI_ANCHO, ARTI_ALTO, ARTI_LARGO, TAIV_COD, BODE_COD, PEDE_OBS
        FROM PEDIDOS_DETALLE D, ARTICULO A
        WHERE D.ARTI_COD = A.ARTI_COD AND D.PEDI_ID = :ID
        ORDER BY PEDE_CODBAR
        INTO :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :LISTAPR, :PRUNIT, :DTOITPORC, :DTOITMONTO, :IVAPORC, :IVAITMONTO, :CONSUMO, :TOTAL, :REFITEM,
        :GRUPO, :SUBGRUPO, :MARCA, :PESO, :ANCHO, :ALTO, :LARGO, :TARIFA, :BODEGA, :OBSITEM
        DO
        BEGIN
        if (ARTICULO = CODBAR) then
            SELECT FIRST 1 COBA_COD FROM barras_articulo WHERE ARTI_COD = :articulo INTO :CODBAR;
        SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :GRUPO INTO NOMGRUPO;
        SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :MARCA INTO NOMMARCA;
        SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :SUBGRUPO AND GRUP_COD = :GRUPO INTO :NOMSUBG;
        if (ICOINC = 'SI') then
            SUBTOTIT = TOTAL - IVAITMONTO;
        else
            SUBTOTIT = TOTAL - IVAITMONTO - CONSUMO;
        ITEM = ITEM + 1;
        PRNETO = PRUNIT - DTOITMONTO;
        if (IMPTOS = 'S') then
            if (cant <> 0) then
                prnetosiniva = PRUNIT - DTOITMONTO - ((IVAITMONTO+CONSUMO) / CANT);
            else
                prnetosiniva = PRUNIT - DTOITMONTO;
        ELSE
            prnetosiniva = PRUNIT - DTOITMONTO;
        if (TARIFA = 0) then
            SUMAEX = SUMAEX + TOTAL;
        if (TARIFA = 1) then
            BEGIN
            SUMA1 = SUMA1 + TOTAL - IVAITMONTO;
            IVA1 = IVA1 + IVAITMONTO;
            END
        if (TARIFA = 2) then
            BEGIN
            SUMA2 = SUMA2 + TOTAL - IVAITMONTO;
            IVA2 = IVA2 + IVAITMONTO;
            END
        if (TARIFA = 3) then
            BEGIN
            SUMA3 = SUMA3 + TOTAL - IVAITMONTO;
            IVA3 = IVA3 + IVAITMONTO;
            END
        SUMAGR = SUMA1 + SUMA2 + SUMA3;
        SUSPEND;
        END
    END
ELSE
    BEGIN
    FOR SELECT PEDE_ITEM, D.ARTI_COD, PEDE_CODBAR, SUBSTR(PEDE_DESC,1,60), PEDE_CANT, PEDE_UNIDAD, LIPR_COD, PEDE_PRUNIT, PEDE_DTOPORC, PEDE_DTOMONTO, PEDE_IVAPORC, PEDE_IVAMONTO, PEDE_CONSUMO, PEDE_TOTAL, PEDE_REFERENCIA,
        GRUP_COD, SUBG_COD, MARC_COD, ARTI_PESO, ARTI_ANCHO, ARTI_ALTO, ARTI_LARGO, TAIV_COD, BODE_COD, PEDE_OBS
        FROM PEDIDOS_DETALLE D, ARTICULO A
        WHERE D.ARTI_COD = A.ARTI_COD AND D.PEDI_ID = :ID
        ORDER BY PEDE_ITEM
        INTO :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :LISTAPR, :PRUNIT, :DTOITPORC, :DTOITMONTO, :IVAPORC, :IVAITMONTO, :CONSUMO, :TOTAL, :REFITEM,
        :GRUPO, :SUBGRUPO, :MARCA, :PESO, :ANCHO, :ALTO, :LARGO, :TARIFA, :BODEGA, :obsitem
        DO
        BEGIN
        SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :GRUPO INTO NOMGRUPO;
        SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :MARCA INTO NOMMARCA;
        SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :SUBGRUPO AND GRUP_COD = :GRUPO INTO :NOMSUBG;
        if (ICOINC = 'SI') then
            SUBTOTIT = TOTAL - IVAITMONTO;
        else
            SUBTOTIT = TOTAL - IVAITMONTO - CONSUMO;
        ITEM = ITEM + 1;
        PRNETO = PRUNIT - DTOITMONTO;
        if (IMPTOS = 'S') then
            if (cant <> 0) then
                prnetosiniva = PRUNIT - DTOITMONTO - ((IVAITMONTO+CONSUMO) / CANT);
            else
                prnetosiniva = PRUNIT - DTOITMONTO;
        ELSE
            prnetosiniva = PRUNIT - DTOITMONTO;
        if (IVAPORC = 0) then
            SUMAEX = SUMAEX + TOTAL;
        if (TARIFA = 1) then
            BEGIN
            SUMA1 = SUMA1 + TOTAL - IVAITMONTO;
            IVA1 = IVA1 + IVAITMONTO;
            END
        if (TARIFA = 2) then
            BEGIN
            SUMA2 = SUMA2 + TOTAL - IVAITMONTO;
            IVA2 = IVA2 + IVAITMONTO;
            END
        if (TARIFA = 3) then
            BEGIN
            SUMA3 = SUMA3 + TOTAL - IVAITMONTO;
            IVA3 = IVA3 + IVAITMONTO;
            END
        SUMAGR = SUMA1 + SUMA2 + SUMA3;
        SUSPEND;
        END
    END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER PROCEDURE IMPR_DEVOLUCION(
    ID INTEGER)
RETURNS (
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    NIT VARCHAR(20),
    NOMTERCERO VARCHAR(60),
    VENDEDOR INTEGER,
    NOMVENDEDOR VARCHAR(60),
    PUNTOVTA INTEGER,
    NOMPUNTOVTA VARCHAR(30),
    CODBODEGA VARCHAR(2),
    NOMBODEGA VARCHAR(30),
    FACTURA VARCHAR(30),
    REMISION VARCHAR(10),
    COMIPORC NUMERIC(9,2),
    COMIMONTO NUMERIC(18,2),
    SUBTOTAL NUMERIC(18,2),
    DTOPORC NUMERIC(9,2),
    DTOMONTO NUMERIC(18,2),
    ADICIONAL NUMERIC(18,2),
    IVAMONTO NUMERIC(18,2),
    RTEFTEPORC NUMERIC(9,2),
    RTEFTEMONTO NUMERIC(18,2),
    RTEIVAPORC NUMERIC(9,2),
    RTEIVAMONTO NUMERIC(18,2),
    RTEICAPORC NUMERIC(9,2),
    RTEICAMONTO NUMERIC(18,2),
    EXTRA NUMERIC(18,2),
    TOTALFAC NUMERIC(18,2),
    TOTALPAGAR NUMERIC(18,2),
    OBS BLOB SUB_TYPE 1 SEGMENT SIZE 80,
    ITEM INTEGER,
    ARTICULO VARCHAR(15),
    CODBAR VARCHAR(15),
    ARTIDES VARCHAR(60),
    CANT NUMERIC(18,4),
    LOTE VARCHAR(15),
    UNIDAD VARCHAR(8),
    REFITEM VARCHAR(60),
    BODITEM VARCHAR(2),
    PRUNIT NUMERIC(18,2),
    DTOITPORC NUMERIC(9,2),
    DTOITMONTO NUMERIC(18,2),
    PRNETO NUMERIC(18,2),
    PRNETOSINIVA NUMERIC(18,2),
    IVAPORC NUMERIC(9,2),
    IVAITMONTO NUMERIC(18,2),
    CONSUMO NUMERIC(18,2),
    SUBTOTIT NUMERIC(18,2),
    TOTAL NUMERIC(18,2),
    CODIGOCL VARCHAR(20),
    ZONACOD VARCHAR(2),
    ZONANOM VARCHAR(60),
    DV CHAR(1),
    DIRECCION VARCHAR(60),
    CIUDAD VARCHAR(40),
    TELEFONO VARCHAR(40),
    CONTACTO VARCHAR(60),
    FAX VARCHAR(25),
    GRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    SUBGRUPO VARCHAR(3),
    NOMSUBG VARCHAR(30),
    MARCA VARCHAR(3),
    NOMMARCA VARCHAR(30),
    PESO NUMERIC(9,4),
    ANCHO NUMERIC(18,4),
    ALTO NUMERIC(18,4),
    LARGO NUMERIC(18,4),
    SUMA1 NUMERIC(18,2),
    SUMA2 NUMERIC(18,2),
    SUMA3 NUMERIC(18,2),
    IVA1 NUMERIC(18,2),
    IVA2 NUMERIC(18,2),
    IVA3 NUMERIC(18,2),
    TOTCONSUMO NUMERIC(18,2),
    SUMAEX NUMERIC(18,2),
    SUMAGR NUMERIC(18,2),
    OBSITEM BLOB SUB_TYPE 1 SEGMENT SIZE 80)
AS
DECLARE VARIABLE IMPTOS CHAR(1);
DECLARE VARIABLE TARIFA INTEGER;
declare variable ORDENCOD CHAR(2);
declare variable SUCUR VARCHAR(10);
declare variable PUNTOS NUMERIC(18,4);
declare variable ICOINC CHAR(2);
BEGIN
execute procedure lee_configuracion('FACTURACION', 'ARTICULOS', 'IMPOCONSUMO INCLUIDO EN EL PRECIO BASE DE VENTA ANTES DE IVA') returning_values (icoinc);
SELECT F.PREF_PRE, DEVT_NUMERO, DEVT_FECHA, F.BODE_COD, BODE_NOM, F.TERC_NIT, DEVT_NOMTERC, F.VEND_COD, VEND_NOMBRE, F.PTVT_ID, PTVT_NOM,
    DEVT_FACTURA, DEVT_COMIPORC, DEVT_COMIMONTO, DEVT_IVAINC,
    DEVT_DTOPOR, DEVT_DTOMONTO, DEVT_ADICIONAL, DEVT_IVAMONTO, DEVT_RTFTEPORC, DEVT_RTFTEMONTO, DEVT_RTIVAPORC, DEVT_RTIVAMONTO, DEVT_RTICAPORC, DEVT_RTICAMONTO, DEVT_EXTRA, DEVT_TOTAL,
    TERC_CONTACTO, TERC_FAX, TERC_DV, DEVT_OBS, DEVT_SUCURSAL, DEVT_REMISION
    FROM DEVOLUCIONES_VENTAS F, BODEGA B, VENDEDORES V, PUNTO_VENTA P, TERCEROS T
    WHERE F.BODE_COD = B.BODE_COD AND F.VEND_COD = V.VEND_COD AND F.PTVT_ID = P.PTVT_ID AND F.TERC_NIT = T.TERC_NIT AND F.DEVT_ID = :ID
    into :PREF, :NUMERO, :FECHA, :CODBODEGA, :NOMBODEGA, :NIT, :NOMTERCERO, :VENDEDOR, :NOMVENDEDOR, :PUNTOVTA, :NOMPUNTOVTA,
    :FACTURA, :COMIPORC, :COMIMONTO, :IMPTOS,
    :DTOPORC, :DTOMONTO, :ADICIONAL, :IVAMONTO, :RTEFTEPORC, :RTEFTEMONTO, :RTEIVAPORC, :RTEIVAMONTO, :RTEICAPORC, :RTEICAMONTO, :EXTRA, :TOTALFAC,
    :CONTACTO, :FAX, :DV, :OBS, :SUCUR, :REMISION;
SUBTOTAL = TOTALFAC - EXTRA - IVAMONTO - ADICIONAL + DTOMONTO;
TOTALPAGAR = TOTALFAC - RTEFTEMONTO - RTEIVAMONTO - RTEICAMONTO;

EXECUTE PROCEDURE acumula_puntos_cliente (33, :id, :nit, :fecha) returning_values (:PUNTOS);
SELECT CLIE_COD, C.ZONA_COD, ZONA_NOM
    FROM CLIENTES C, ZONAS Z
    WHERE TERC_NIT = :NIT AND C.ZONA_COD = Z.ZONA_COD
    INTO :CODIGOCL, :ZONACOD, :ZONANOM;
SELECT CLSU_DIR, CLSU_CIUDAD, CLSU_TEL FROM CLIENTE_SUCURSALES WHERE TERC_NIT = :NIT AND CLCU_COD = :SUCUR
    INTO :DIRECCION, :CIUDAD, :TELEFONO;
    
SUMAEX = 0;
SUMA1 = 0;
SUMA2 = 0;
SUMA3 = 0;
IVA1 = 0;
IVA2 = 0;
IVA3 = 0;
TOTCONSUMO = 0;
ITEM = 0;
EXECUTE PROCEDURE lee_configuracion ('FACTURACION','DOCUMENTOS','ORDENAR ITEMS POR CODIGO DE ARTICULO') returning_values (:ORDENCOD);
if (ORDENCOD = 'SI') then
    BEGIN
    FOR SELECT D.ARTI_COD, DVDE_CODBAR, SUBSTR(DVDE_DESC,1,60), DVDE_CANT, DVDE_UNIDAD, BODE_COD, DVDE_LOTE, DVDE_PRUNIT, DVDE_DTOPORC, DVDE_DTOMONTO, DVDE_IVAPORC, DVDE_IVAMONTO, DVDE_CONSUMO, DVDE_TOTAL, DVDE_REFERENCIA,
        GRUP_COD, SUBG_COD, MARC_COD, ARTI_PESO, ARTI_ANCHO, ARTI_ALTO, ARTI_LARGO, TAIV_COD, DVDE_OBS
        FROM DEVOLUCIONES_VENTAS_DETALLE D, ARTICULO A
        WHERE D.ARTI_COD = A.ARTI_COD AND D.DEVT_ID = :ID
        ORDER BY DVDE_CODBAR
        INTO :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :BODITEM, :LOTE, :PRUNIT, :DTOITPORC, :DTOITMONTO, :IVAPORC, :IVAITMONTO, :CONSUMO, :TOTAL, :REFITEM,
        :GRUPO, :SUBGRUPO, :MARCA, :PESO, :ANCHO, :ALTO, :LARGO, :TARIFA, :obsitem
        DO
        BEGIN
        if (ARTICULO = CODBAR) then
            SELECT FIRST 1 COBA_COD FROM barras_articulo WHERE ARTI_COD = :articulo INTO :CODBAR;
        ITEM = ITEM + 1;
        if (ICOINC = 'SI') then
            SUBTOTIT = TOTAL - IVAITMONTO;
        else
            SUBTOTIT = TOTAL - IVAITMONTO - CONSUMO;
        PRNETO = PRUNIT - DTOITMONTO;
        if (IMPTOS = 'S') then
            if (cant <> 0) then
                prnetosiniva = PRUNIT - DTOITMONTO - ((IVAITMONTO+CONSUMO) / CANT);
            else
                prnetosiniva = PRUNIT - DTOITMONTO;
        ELSE
            prnetosiniva = PRUNIT - DTOITMONTO;
        TOTCONSUMO = TOTCONSUMO + CONSUMO;
        if ((REFITEM <> '.t') or (REFITEM IS NULL)) then
            BEGIN
            /* NO SUME LOS ENSAMBLES */
            if (IVAPORC = 0) then
                SUMAEX = SUMAEX + TOTAL;
            if (TARIFA = 1) then
                BEGIN
                SUMA1 = SUMA1 + TOTAL - IVAITMONTO;
                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;
            END
        if (substr(ARTICULO,1,2) = '.t') then
            BEGIN
            REFITEM = '';
            TOTAL = 0;
            END
        SUSPEND;
        END
    END
ELSE
    BEGIN
    FOR SELECT D.ARTI_COD, DVDE_CODBAR, SUBSTR(DVDE_DESC,1,60), DVDE_CANT, DVDE_UNIDAD, BODE_COD, DVDE_LOTE, DVDE_PRUNIT, DVDE_DTOPORC, DVDE_DTOMONTO, DVDE_IVAPORC, DVDE_IVAMONTO, DVDE_CONSUMO, DVDE_TOTAL, DVDE_REFERENCIA,
        GRUP_COD, SUBG_COD, MARC_COD, ARTI_PESO, ARTI_ANCHO, ARTI_ALTO, ARTI_LARGO, TAIV_COD, DVDE_OBS
        FROM DEVOLUCIONES_VENTAS_DETALLE D, ARTICULO A
        WHERE D.ARTI_COD = A.ARTI_COD AND D.DEVT_ID = :ID
        ORDER BY DVDE_ITEM
        INTO :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :BODITEM, :LOTE, :PRUNIT, :DTOITPORC, :DTOITMONTO, :IVAPORC, :IVAITMONTO, :CONSUMO, :TOTAL, :REFITEM,
        :GRUPO, :SUBGRUPO, :MARCA, :PESO, :ANCHO, :ALTO, :LARGO, :TARIFA, :obsitem
        DO
        BEGIN
        if (ARTICULO = CODBAR) then
            SELECT FIRST 1 COBA_COD FROM barras_articulo WHERE ARTI_COD = :articulo INTO :CODBAR;
        SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :GRUPO INTO NOMGRUPO;
        SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :MARCA INTO NOMMARCA;
        SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :SUBGRUPO AND GRUP_COD = :GRUPO INTO :NOMSUBG;
        ITEM = ITEM + 1;
        if (ICOINC = 'SI') then
            SUBTOTIT = TOTAL - IVAITMONTO;
        else
            SUBTOTIT = TOTAL - IVAITMONTO - CONSUMO;
        PRNETO = PRUNIT - DTOITMONTO;
        if (IMPTOS = 'S') then
            if (cant <> 0) then
                prnetosiniva = PRUNIT - DTOITMONTO - ((IVAITMONTO+CONSUMO) / CANT);
            else
                prnetosiniva = PRUNIT - DTOITMONTO;
        ELSE
            prnetosiniva = PRUNIT - DTOITMONTO;
        TOTCONSUMO = TOTCONSUMO + CONSUMO;
        if ((REFITEM <> '.t') or (REFITEM IS NULL)) then
            BEGIN
            /* NO SUME LOS ENSAMBLES */
            if (IVAPORC = 0) then
                SUMAEX = SUMAEX + TOTAL;
            if (TARIFA = 1) then
                BEGIN
                SUMA1 = SUMA1 + TOTAL - IVAITMONTO;
                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;
            END
        if (substr(ARTICULO,1,2) = '.t') then
            BEGIN
            REFITEM = '';
            TOTAL = 0;
            END
        SUSPEND;
        END
    END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER PROCEDURE IMPR_FACTURA(
    ID INTEGER)
RETURNS (
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    VENCE DATE,
    DIASVENCE INTEGER,
    CONTCRED CHAR(17),
    NIT VARCHAR(20),
    NOMTERCERO VARCHAR(60),
    NOMCLIENTE VARCHAR(60),
    VENDEDOR INTEGER,
    NOMVENDEDOR VARCHAR(60),
    PUNTOVTA INTEGER,
    NOMPUNTOVTA VARCHAR(30),
    CODBODEGA VARCHAR(2),
    NOMBODEGA VARCHAR(30),
    AUTORIZACION VARCHAR(20),
    DESPACHO VARCHAR(255),
    TRANSPORTADOR VARCHAR(60),
    COTIZACION VARCHAR(30),
    PEDIDO VARCHAR(30),
    REMISION VARCHAR(30),
    PACIENTE VARCHAR(20),
    NOMPACIENTE VARCHAR(60),
    COMIPORC NUMERIC(9,2),
    COMIMONTO NUMERIC(18,2),
    SUBTOTAL NUMERIC(18,2),
    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),
    EXTRA NUMERIC(18,2),
    DTOFPORC NUMERIC(9,2),
    DTOFMONTO NUMERIC(18,2),
    FECHADTO DATE,
    TOTALFAC NUMERIC(18,2),
    TOTALPAGAR NUMERIC(18,2),
    OBS BLOB SUB_TYPE 1 SEGMENT SIZE 80,
    ITEM INTEGER,
    ARTICULO VARCHAR(15),
    CODBAR VARCHAR(15),
    ARTIDES VARCHAR(60),
    DESCORTA VARCHAR(30),
    CANT NUMERIC(18,4),
    LOTE VARCHAR(15),
    VLOTE DATE,
    UNIDAD VARCHAR(8),
    CAJAS NUMERIC(18,4),
    FACTOR INTEGER,
    LISTAPR INTEGER,
    REFITEM VARCHAR(60),
    BODITEM VARCHAR(2),
    STAND VARCHAR(15),
    PRUNIT NUMERIC(18,2),
    DTOITPORC NUMERIC(9,2),
    DTOITMONTO NUMERIC(18,2),
    PRNETO NUMERIC(18,2),
    PRNETOSINIVA NUMERIC(18,2),
    DTOIT1 NUMERIC(9,2),
    DTOIT2 NUMERIC(9,2),
    DTOIT3 NUMERIC(9,2),
    IVAPORC NUMERIC(9,2),
    IVAITMONTO NUMERIC(18,2),
    CONSUMO NUMERIC(18,2),
    SUBTOTIT NUMERIC(18,2),
    TOTAL NUMERIC(18,2),
    CODIGOCL VARCHAR(20),
    ZONACOD VARCHAR(2),
    ZONANOM VARCHAR(60),
    DV CHAR(1),
    DIRECCION VARCHAR(60),
    CIUDAD VARCHAR(40),
    TELEFONO VARCHAR(40),
    CONTACTO VARCHAR(60),
    FAX VARCHAR(25),
    GRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    SUBGRUPO VARCHAR(3),
    NOMSUBG VARCHAR(30),
    MARCA VARCHAR(3),
    NOMMARCA VARCHAR(30),
    PESO NUMERIC(18,4),
    ANCHO NUMERIC(18,4),
    ALTO NUMERIC(18,4),
    LARGO NUMERIC(18,4),
    SUMA1 NUMERIC(18,2),
    SUMA2 NUMERIC(18,2),
    SUMA3 NUMERIC(18,2),
    IVA1 NUMERIC(18,2),
    IVA2 NUMERIC(18,2),
    IVA3 NUMERIC(18,2),
    SUMAEX NUMERIC(18,2),
    SUMAGR NUMERIC(18,2),
    TOTCONSUMO NUMERIC(18,2),
    DTOIT1M NUMERIC(18,2),
    DTOIT2M NUMERIC(18,2),
    DTOIT3M NUMERIC(18,2),
    TOTCAJAS NUMERIC(18,2),
    VEHICULO VARCHAR(8),
    RECIBIDO NUMERIC(18,2),
    CAMBIO NUMERIC(18,2),
    HORA TIME,
    FORMAPAGO1 VARCHAR(30),
    MONTOPAGO1 NUMERIC(18,2),
    FORMAPAGO2 VARCHAR(30),
    MONTOPAGO2 NUMERIC(18,2),
    FORMAPAGO3 VARCHAR(30),
    MONTOPAGO3 NUMERIC(18,2),
    PUNTOS INTEGER,
    PUNTOSACUM INTEGER,
    PUNTOSVENC INTEGER,
    FECPTOS DATE,
    OBSITEM BLOB SUB_TYPE 1 SEGMENT SIZE 80,
    SUCUR VARCHAR(10))
AS
DECLARE VARIABLE IMPTOS CHAR(1);
DECLARE VARIABLE TARIFA INTEGER;
declare variable DEVUELTO NUMERIC(18,2);
declare variable ORDENCOD CHAR(2);
declare variable IMPRDEV CHAR(2);
declare variable IMPR CHAR(1);
declare variable ITEMFP INTEGER;
declare variable FORMAP VARCHAR(30);
declare variable MONTOP NUMERIC(18,2);
declare variable ICOINC CHAR(2);
BEGIN
execute procedure lee_configuracion('FACTURACION', 'ARTICULOS', 'IMPOCONSUMO INCLUIDO EN EL PRECIO BASE DE VENTA ANTES DE IVA') returning_values (icoinc);
SELECT F.PREF_PRE, FACT_NUMERO, FACT_FECHA, FACT_VENCE, F.BODE_COD, BODE_NOM, F.TERC_NIT, FACT_NOMCLIENTE, F.VEND_COD, VEND_NOMBRE, F.PTVT_ID, PTVT_NOM,
    AUTO_NUMERO, FACT_DESPACHO, FACT_TRANSP, FACT_COTIZACI, FACT_PEDIDO, FACT_REMISION, FACT_COMIPORC, FACT_COMIMONTO, FACT_IVAINC, 
    FACT_DTOPOR, FACT_DTOMONTO, FACT_ADICIONAL, FACT_IVAMONTO, FACT_RTFTEPOR, FACT_RTFTEMONTO, FACT_RTIVAPOR, FACT_RTIVAMONTO, FACT_RTICAPOR, FACT_RTICAMONTO, FACT_EXTRA, FACT_DTOFPOR, FACT_DTOFMONTO, FACT_DTOFFECHA, FACT_TOTAL,
    TERC_DIR, TERC_CIU, TERC_TEL, TERC_CONTACTO, TERC_FAX, TERC_DV, FACT_DTOIT1, FACT_DTOIT2, FACT_DTOIT3,
    FACT_OBS, VEHI_COD, /*FACT_NROCOPIA,*/ FACT_RECIBIDO, FACT_SUCURSAL, FACT_DETCLI, FACT_DETCLINOM, TERC_NOM
    FROM FACTURAS F, BODEGA B, VENDEDORES V, PUNTO_VENTA P, TERCEROS T
    WHERE F.BODE_COD = B.BODE_COD AND F.VEND_COD = V.VEND_COD AND F.PTVT_ID = P.PTVT_ID AND F.TERC_NIT = T.TERC_NIT AND F.FACT_ID = :ID
    into :PREF, :NUMERO, :FECHA, :VENCE, :CODBODEGA, :NOMBODEGA, :NIT, :NOMTERCERO, :VENDEDOR, :NOMVENDEDOR, :PUNTOVTA, :NOMPUNTOVTA,
    :AUTORIZACION, :DESPACHO, :TRANSPORTADOR, :COTIZACION, :PEDIDO, :REMISION, :COMIPORC, :COMIMONTO, :IMPTOS,
    :DTOPORC, :DTOMONTO, :ADICIONAL, :IVAMONTO, :RTEFTEPORC, :RTEFTEMONTO, :RTEIVAPORC, :RTEIVAMONTO, :RTEICAPORC, :RTEICAMONTO, :EXTRA, :DTOFPORC, :DTOFMONTO, :FECHADTO, :TOTALFAC,
    :DIRECCION, :CIUDAD, :TELEFONO, :CONTACTO, :FAX, :DV, :dtoit1m, :dtoit2m, :dtoit3m,
    :OBS, :VEHICULO,/* :NROCOPIA,*/ :RECIBIDO, :SUCUR, :paciente, :nompaciente, :nomcliente;

/* ACUMULE LOS PUNTOS, SE HACE ACA POR SER POSTERIOR AL DETALLE */
EXECUTE PROCEDURE acumula_puntos_cliente (31, :id, :nit, :fecha) returning_values (:PUNTOS);
EXECUTE PROCEDURE consulta_puntos_cliente (:id, :nit, :fecha) returning_values (:puntos, :puntosacum, :puntosvenc, :fecptos);

SELECT CLIE_COD, C.ZONA_COD, ZONA_NOM
    FROM CLIENTES C, ZONAS Z
    WHERE TERC_NIT = :NIT AND C.ZONA_COD = Z.ZONA_COD
    INTO :CODIGOCL, :ZONACOD, :ZONANOM;
SELECT CLSU_DIR, CLSU_CIUDAD, CLSU_TEL FROM CLIENTE_SUCURSALES WHERE TERC_NIT = :NIT AND CLCU_COD = :SUCUR
    INTO :DIRECCION, :CIUDAD, :TELEFONO;
DIASVENCE = VENCE - FECHA;
if (DIASVENCE > 0) then
    CONTCRED = 'CREDITO ' || CAST(DIASVENCE AS VARCHAR(3)) || ' DIAS';
ELSE
    CONTCRED = 'CONTADO';
SUBTOTAL = TOTALFAC - EXTRA - IVAMONTO - ADICIONAL + DTOMONTO;
TOTALPAGAR = TOTALFAC - RTEFTEMONTO - RTEIVAMONTO - RTEICAMONTO;
if (RECIBIDO <> 0) then
    CAMBIO = RECIBIDO - totalpagar;
ELSE
    CAMBIO = 0;
SUMAEX = 0;
SUMA1 = 0;
SUMA2 = 0;
SUMA3 = 0;
IVA1 = 0;
IVA2 = 0;
IVA3 = 0;
TOTCONSUMO = 0;
MONTOPAGO1 = 0;
SELECT MAX(AUDI_HORA) FROM AUDITORIA WHERE TIDO_COD = 31 AND AUDI_IDDOC = :ID AND AUDI_OPER = 'I' INTO :HORA;
/* AHORA LAS FORMAS DE PAGO, BUSQUE EL ABONO DE HOY A LA FACTURA */
ITEMFP = 1;
MONTOPAGO1 = 0;
MONTOPAGO2 = 0;
MONTOPAGO3 = 0;
FOR SELECT FOPA_NOM, RCPA_MONTO FROM RECIBOS_CAJA_PAGO P, FORMAS_PAGO F, RECIBOS_CAJA R, RECIBOS_CAJA_DETALLE D
    WHERE R.RECA_ID = P.RECA_ID AND R.RECA_ID = D.RECA_ID AND P.FOPA_ID = F.FOPA_ID AND RECA_FECHA = :FECHA AND RCDE_TIPODOC = 31 AND RCDE_IDDOC = :ID
    INTO :formap, :MONTOP
    DO
    BEGIN
    if (ITEMFP = 1) then
        BEGIN
        FORMAPAGO1 = FORMAP;
        MONTOPAGO1 = MONTOP;
        END
    if (ITEMFP = 2) then
        BEGIN
        FORMAPAGO2 = FORMAP;
        MONTOPAGO2 = MONTOP;
        END
    if (ITEMFP = 3) then
        BEGIN
        FORMAPAGO3 = FORMAP;
        MONTOPAGO3 = MONTOP;
        END
    ITEMFP = ITEMFP + 1;
    END
EXECUTE PROCEDURE lee_configuracion ('FACTURACION','DOCUMENTOS','ORDENAR ITEMS POR CODIGO DE ARTICULO') returning_values (:ORDENCOD);
EXECUTE PROCEDURE lee_configuracion ('FACTURACION','POS', 'IMPRIMIR DEVOLUCIONES DE ARTICULOS NEGATIVOS') returning_values (:imprdev);
totcajas = 0;
if (ORDENCOD = 'SI') then
    BEGIN
    FOR SELECT FADE_ITEM, D.ARTI_COD, FADE_CODBAR, SUBSTR(FADE_DESC,1,60), ARTI_DESCORTA, FADE_CANT, FADE_UNIDAD, FADE_FACTOR, BODE_COD, FADE_LOTE, LIPR_COD, FADE_PRUNIT, FADE_DTOPORC, FADE_DTOMONTO, FADE_IVAPORC, FADE_IVAMONTO, FADE_CONSUMO, FADE_TOTAL, FADE_REFERENCIA,
        GRUP_COD, SUBG_COD, MARC_COD, ARTI_PESO, ARTI_ANCHO, ARTI_ALTO, ARTI_LARGO, TAIV_COD, FADE_DEVUELTO, FADE_OBS, FADE_DTO1, FADE_DTO2, FADE_DTO3, FADE_CAJAS
        FROM FACTURAS_DETALLE D, ARTICULO A
        WHERE D.ARTI_COD = A.ARTI_COD AND D.FACT_ID = :ID
        ORDER BY D.ARTI_COD
        INTO :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :DESCORTA, :CANT, :UNIDAD, :FACTOR, :BODITEM, :LOTE, :LISTAPR, :PRUNIT, :DTOITPORC, :DTOITMONTO, :IVAPORC, :IVAITMONTO, :CONSUMO, :TOTAL, :refitem,
        :GRUPO, :SUBGRUPO, :MARCA, :PESO, :ANCHO, :ALTO, :LARGO, :TARIFA, :devuelto, :obsitem, :dtoit1, :dtoit2, :dtoit3, :cajas
        DO
          BEGIN
          if (ARTICULO = CODBAR) then
            SELECT FIRST 1 COBA_COD FROM barras_articulo WHERE ARTI_COD = :articulo INTO :CODBAR;
          if (IMPRDEV <> 'SI') then
            BEGIN
            if ((CANT >= 0) AND (DEVUELTO = 0)) then
                IMPR = 'S';
            ELSE
                IMPR = 'N'; /* ES DEVOLUCION */
            END
          ELSE
            IMPR = 'S';
          if (IMPR = 'S') then
            BEGIN
            prneto = PRUNIT - DTOITMONTO - dtoit1m - dtoit2m - dtoit3m;
            if (IMPTOS = 'S') then
                if (cant <> 0) then
                    prnetosiniva = PRUNIT - DTOITMONTO - ((IVAITMONTO+CONSUMO) / CANT) - dtoit1m - dtoit2m - dtoit3m;
                else
                    prnetosiniva = PRUNIT - DTOITMONTO - dtoit1m - dtoit2m - dtoit3m;
            ELSE
                prnetosiniva = PRUNIT - DTOITMONTO - dtoit1m - dtoit2m - dtoit3m;
            if (ICOINC = 'SI') then
                SUBTOTIT = TOTAL - IVAITMONTO;
            else
                SUBTOTIT = TOTAL - IVAITMONTO - CONSUMO;
            TOTCONSUMO = TOTCONSUMO + CONSUMO;
            SELECT LOTE_VENCE FROM LOTES WHERE LOTE_NRO = :lote AND ARTI_COD = :ARTICULO AND BODE_COD = :boditem INTO :vlote;
            if ((REFITEM <> '.t') or (REFITEM IS NULL)) then
                BEGIN
                /* NO SUME LOS ENSAMBLES */
                if (IVAPORC = 0) then
                    SUMAEX = SUMAEX + TOTAL;
                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;
                END
            if (ANCHO IS NULL) then
                ANCHO = 0;
            if (ALTO IS NULL) then
                ALTO = 0;
            if (LARGO IS NULL) then
                LARGO = 0;
            if (PESO IS NULL) then
                PESO = 0;
            PESO = PESO * CANT;
            totcajas = totcajas + cajas;
            if (substr(ARTICULO,1,2) = '.t') then
                BEGIN
                REFITEM = '';
                TOTAL = 0;
                SUBTOTIT = 0;
                END
            SELECT STAND_COD FROM STANDS WHERE ARTI_COD = :ARTICULO AND STAND_BODEGA = :boditem INTO :stand;
            SUSPEND;
            END
          END
    END
ELSE
    BEGIN
    FOR SELECT FADE_ITEM, D.ARTI_COD, FADE_CODBAR, SUBSTR(FADE_DESC,1,60), ARTI_DESCORTA, FADE_CANT, FADE_UNIDAD, FADE_FACTOR, BODE_COD, FADE_LOTE, LIPR_COD, FADE_PRUNIT, FADE_DTOPORC, FADE_DTOMONTO, FADE_IVAPORC, FADE_IVAMONTO, FADE_CONSUMO, FADE_TOTAL, FADE_REFERENCIA,
        GRUP_COD, SUBG_COD, MARC_COD, ARTI_PESO, ARTI_ANCHO, ARTI_ALTO, ARTI_LARGO, TAIV_COD, FADE_DEVUELTO, FADE_OBS, FADE_DTO1, FADE_DTO2, FADE_DTO3, FADE_CAJAS
        FROM FACTURAS_DETALLE D, ARTICULO A
        WHERE D.ARTI_COD = A.ARTI_COD AND D.FACT_ID = :ID
        ORDER BY FADE_ITEM
        INTO :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :DESCORTA, :CANT, :UNIDAD, :FACTOR, :BODITEM, :LOTE, :LISTAPR, :PRUNIT, :DTOITPORC, :DTOITMONTO, :IVAPORC, :IVAITMONTO, :CONSUMO, :TOTAL, :refitem,
        :GRUPO, :SUBGRUPO, :MARCA, :PESO, :ANCHO, :ALTO, :LARGO, :TARIFA, :devuelto, :obsitem, :dtoit1, :dtoit2, :dtoit3, :cajas
        DO
          BEGIN
          if (IMPRDEV <> 'SI') then
            BEGIN
            if ((CANT >= 0) AND (DEVUELTO = 0)) then
                IMPR = 'S';
            ELSE
                IMPR = 'N'; /* ES DEVOLUCION */
            END
          ELSE
            IMPR = 'S';
          if (IMPR = 'S') then
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :GRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :MARCA INTO NOMMARCA;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :SUBGRUPO AND GRUP_COD = :GRUPO INTO :NOMSUBG;
            prneto = PRUNIT - DTOITMONTO - dtoit1m - dtoit2m - dtoit3m;
            if (IMPTOS = 'S') then
                if (cant <> 0) then
                    prnetosiniva = PRUNIT - DTOITMONTO - ((IVAITMONTO+CONSUMO) / CANT) - dtoit1m - dtoit2m - dtoit3m;
                else
                    prnetosiniva = PRUNIT - DTOITMONTO - dtoit1m - dtoit2m - dtoit3m;
            ELSE
                prnetosiniva = PRUNIT - DTOITMONTO - dtoit1m - dtoit2m - dtoit3m;
            if (ICOINC = 'SI') then
                SUBTOTIT = TOTAL - IVAITMONTO;
            else
                SUBTOTIT = TOTAL - IVAITMONTO - CONSUMO;
            TOTCONSUMO = TOTCONSUMO + CONSUMO;
            SELECT LOTE_VENCE FROM LOTES WHERE LOTE_NRO = :lote AND ARTI_COD = :ARTICULO AND BODE_COD = :boditem INTO :vlote;
            if ((REFITEM <> '.t') or (REFITEM IS NULL)) then
                BEGIN
                /* NO SUME LOS ENSAMBLES */
                if (IVAPORC = 0) then
                    SUMAEX = SUMAEX + TOTAL;
                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;
                END
            if (ANCHO IS NULL) then
                ANCHO = 0;
            if (ALTO IS NULL) then
                ALTO = 0;
            if (LARGO IS NULL) then
                LARGO = 0;
            if (PESO IS NULL) then
                PESO = 0;
            PESO = PESO * CANT;
            totcajas = totcajas + cajas;
            if (substr(ARTICULO,1,2) = '.t') then
                BEGIN
                REFITEM = '';
                TOTAL = 0;
                SUBTOTIT = 0;
                END
            SELECT STAND_COD FROM STANDS WHERE ARTI_COD = :ARTICULO AND STAND_BODEGA = :boditem INTO :stand;
            SUSPEND;
            END
          END
    END
END
^

SET TERM ; ^


update revision set revi_FECHA = '2009/01/19';
COMMIT WORK;

/* 20090120 PEDIDOS CON 2 DESCUENTOS POR ITEM ADICIONALES */

ALTER TABLE PEDIDOS_DETALLE
ADD PEDE_DTO1 T_PORCENTAJE;
ALTER TABLE PEDIDOS_DETALLE
ADD PEDE_DTO2 T_PORCENTAJE;
ALTER TABLE PEDIDOS_DETALLE
ADD PEDE_DTO3 T_PORCENTAJE;
ALTER TABLE PEDIDOS_DETALLE
ADD PEDE_DTOM1 T_MONTO;
ALTER TABLE PEDIDOS_DETALLE
ADD PEDE_DTOM2 T_MONTO;
ALTER TABLE PEDIDOS_DETALLE
ADD PEDE_DTOM3 T_MONTO;
ALTER TABLE PEDIDOS
ADD PEDI_DTOIT1 T_MONTO;
ALTER TABLE PEDIDOS
ADD PEDI_DTOIT2 T_MONTO;
ALTER TABLE PEDIDOS
ADD PEDI_DTOIT3 T_MONTO;

ALTER TABLE PRECIOS_ARTICULO
ADD PRAR_DTO1 T_PORCENTAJE;
ALTER TABLE PRECIOS_ARTICULO
ADD PRAR_DTO2 T_PORCENTAJE;

/* INTERFAZ PARA RECIBOS PROVISIONALES */
SET TERM ^ ;

CREATE OR ALTER PROCEDURE CONTABIL_RECIPROV(
    IDDOC INTEGER,
    IDINTER INTEGER)
RETURNS (
    ERROR INTEGER,
    VER CHAR(1),
    IDC INTEGER)
AS
declare variable PREF VARCHAR(4);
declare variable NUM VARCHAR(6);
declare variable FECAUX DATE;
declare variable FECHA CHAR(8);
declare variable CONC CHAR(120);
declare variable VRDTO NUMERIC(18, 2);
declare variable VRRTFTE NUMERIC(18, 2);
declare variable VRRTIVA NUMERIC(18, 2);
declare variable VRRTICA NUMERIC(18, 2);
declare variable VRTOTAL NUMERIC(18, 2);
declare variable TIPOCOMP VARCHAR(3);
declare variable PREFCONT VARCHAR(4);
declare variable BASE CHAR(1);
declare variable CTABASE VARCHAR(20);
declare variable CAJA CHAR(1);
declare variable CTACAJA VARCHAR(20);
declare variable RTFTE CHAR(1);
declare variable CTARTFTE VARCHAR(20);
declare variable RTIVA CHAR(1);
declare variable CTARTIVA VARCHAR(20);
declare variable RTICA CHAR(1);
declare variable CTARTICA VARCHAR(20);
declare variable DTO CHAR(1);
declare variable CTADTO VARCHAR(20);
declare variable EXISTE CHAR(1);
declare variable CUENTA VARCHAR(20);
declare variable MONTO NUMERIC(18,2);
declare variable ES_RETENCION CHAR(1);
declare variable TIPOCUEN CHAR(1);
declare variable NIT VARCHAR(20);
declare variable PROY VARCHAR(4);
declare variable CENTRO VARCHAR(4);
declare variable DEBITO NUMERIC(18,2);
declare variable CREDITO NUMERIC(18,2);
declare variable NROI INTEGER;
declare variable SUMA NUMERIC(18,2);
declare variable TCTACLIEN VARCHAR(20);
declare variable TCTARTFTE VARCHAR(20);
declare variable TCTARTIVA VARCHAR(20);
declare variable TCTARTICA VARCHAR(20);
declare variable TIPOIT INTEGER;
declare variable PREFIT VARCHAR(4);
declare variable NUMIT VARCHAR(6);
declare variable NUMEROIT VARCHAR(10);
declare variable ABONOIT NUMERIC(18,2);
declare variable CTADIC VARCHAR(20);
declare variable BASEADIC VARCHAR(20);
declare variable PORCADIC NUMERIC(5,2);
declare variable VALORADIC NUMERIC(18,2);
declare variable DBADIC CHAR(1);
declare variable ANULADO CHAR(1);
declare variable VRBASE NUMERIC(18,2);
declare variable PORC numeric(9,2);
declare variable OK INTEGER;
BEGIN
ERROR = 0;
/* BUSQUE LA INTERFACE */
EXISTE = 'N';
SELECT 'S', TICO_COD, PRCO_PRE, INCJ_BASE, INCJ_DTOPP, INCJ_RTFTE, INCJ_RTIVA, INCJ_RTICA, INCJ_CAJA, INCJ_CTABASE, INCJ_CTADTO, INCJ_CTARTFTE, INCJ_CTARTIVA, INCJ_CTARTICA, INCJ_CTACAJA, INCJ_CONFIRMAR
    FROM INTERFAZ_CAJA
    WHERE INCJ_ID = :IDINTER
    INTO :EXISTE, :TIPOCOMP, :PREFCONT, :BASE, :DTO, :RTFTE, :RTIVA, :RTICA, :CAJA, :CTABASE, :CTADTO, :CTARTFTE, :CTARTIVA, :CTARTICA, :CTACAJA, :VER;
if (EXISTE = 'S') then
  BEGIN
  /* BORRE LA CONTABILIZACION ANTERIOR */
  OK = 0;
  FOR SELECT CNTB_ID FROM CONTABILIZACION WHERE CNTB_TIPOREF = 65 AND CNTB_IDREF = :IDDOC INTO :OK DO
    BEGIN
    DELETE FROM CONTABILIZACION_DET WHERE CNTB_ID = :OK;
    DELETE FROM CONTABILIZACION WHERE CNTB_ID = :OK;
    END
  /* TRAIGA EL ENCABEZADO DEL RECIBO */
  SELECT PREF_PRE, RCPR_NUMERO, RCPR_FECHA, R.TERC_NIT, RCPR_CONC, RCPR_DTOF, RCPR_MONTO, RCPR_RTFTE, RCPR_RTIVA, RCPR_RTICA, TERC_CTARTFTE, TERC_CTARTIVA, TERC_CTARTICA, TERC_CTACLIENTE, RCPR_ANULADO
    FROM recibo_provisional R, TERCEROS T
    WHERE RCPR_ID = :IDDOC AND R.TERC_NIT = T.TERC_NIT
    INTO :PREF, :NUM, :FECAUX, :NIT, :CONC, :VRDTO, :VRTOTAL, :VRRTFTE, :VRRTIVA, :VRRTICA, :TCTARTFTE, TCTARTIVA, TCTARTICA, TCTACLIEN, :ANULADO;
  if (ANULADO = 'N') then
    BEGIN
    SELECT PREF_CENTRO, PREF_PROY FROM PREFIJOS
        WHERE PREF_PRE = :PREF AND TIDO_COD = 65 INTO :CENTRO, :PROY;
    EXECUTE PROCEDURE FECHA_A_CONTA(:FECAUX) returning_values (:FECHA);
    /* REGISTRE EL ENCABEZADO CONTABLE */
    IDC = GEN_ID(ID_CONTABILIZA, 1);
    INSERT INTO CONTABILIZACION (CNTB_ID, CNTB_TIPOCOMP, CNTB_PREFCNT, CNTB_NUMERO, CNTB_FECHA, CNTB_CONCEPTO, CNTB_REF, CNTB_TIPOREF, CNTB_IDREF, CNTB_PREFREF, CNTB_NUMREF, CNTB_PROCESADO)
        VALUES (:IDC, :TIPOCOMP, :PREFCONT, :NUM, :FECHA, :CONC, '', 65, :IDDOC, :PREF, :NUM, 'N');
    NROI = 0;
    SUMA = 0;
    IF ((CAJA = 'K')) THEN
        BEGIN
        if (vrtotal <> 0) then
            BEGIN
            CUENTA = NULL;
            EXECUTE PROCEDURE VALIDE_CUENTA_C (CTACAJA) RETURNING_VALUES (:OK);
            IF (OK = 0) THEN
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :CTACAJA INTO :CUENTA, :TIPOCUEN;
            ELSE
                begin
                EXECUTE PROCEDURE ERROR (65, :IDDOC, :CTACAJA, 2);
                CUENTA = CTACAJA;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERROR (65, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                EXECUTE PROCEDURE ERROR (65, :IDDOC, :CUENTA, 4);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                IF (vrtotal > 0) THEN
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :vrtotal, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    SUMA = SUMA + vrtotal;
                    END
                ELSE   
                    BEGIN                     
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                       VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, ABS(:vrtotal), 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    SUMA = SUMA + vrtotal;
                    END
                NROI = NROI + 1;
                END
            END /* VRtotal <> 0 */
        END /* CAJA CONSTANTE */
    IF ((CAJA = 'F')) THEN
        BEGIN
        /* AGRUPE LAS CUENTAS DE LAS FORMAS DE PAGO */
        FOR SELECT MAX(FOPA_CTACONTA), SUM(RPPA_MONTO)
            FROM formas_pago F, recibo_provisional_pago R
            WHERE R.RCPR_ID = :IDDOC AND R.FOPA_ID = F.FOPA_ID
            GROUP BY FOPA_CTACONTA
            INTO :CTACAJA, :MONTO
        DO
            BEGIN
            if (MONTO <> 0) then
                BEGIN
                CUENTA = NULL;
                EXECUTE PROCEDURE VALIDE_CUENTA_C (CTACAJA) RETURNING_VALUES (:OK);
                IF (OK = 0) THEN
                    SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                        WHERE CUEN_COD = :CTACAJA INTO :CUENTA, :TIPOCUEN;
                ELSE
                    begin
                    EXECUTE PROCEDURE ERROR (65, :IDDOC, :CTACAJA, 2);
                    CUENTA = CTACAJA;
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (65, :IDDOC, :CUENTA, 3);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (65, :IDDOC, :CUENTA, 4);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    IF (MONTO > 0) THEN
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        SUMA = SUMA + MONTO;
                        END
                    ELSE
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, abs(:MONTO), 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        SUMA = SUMA + MONTO;
                        END
                    NROI = NROI + 1;
                    END
                END /* MONTO <> 0 */
            END /* DO FORMA_PAGO */
        END /* CAJA = F */
    if (DTO = 'K') then /* DTO EN CTA CONSTANTE */
        BEGIN
        if (VRDTO <> 0) then
            BEGIN
            CUENTA = NULL;
            EXECUTE PROCEDURE VALIDE_CUENTA_C (CTADTO) RETURNING_VALUES (:OK);
            IF (OK = 0) THEN
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :CTADTO INTO :CUENTA, :TIPOCUEN;
            ELSE
                begin
                EXECUTE PROCEDURE ERROR (65, :IDDOC, :CTADTO, 2);
                CUENTA = CTADTO;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERROR (65, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                EXECUTE PROCEDURE ERROR (65, :IDDOC, :CUENTA, 4);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRDTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA + VRDTO;
                END
            END /* VRDTO <> 0 */
        END /* DTO EN CTA CONSTANTE */

    /* RETENCION FUENTE */
    if ((RTFTE = 'T') or (RTFTE = 'K')) then
      if (VRRTFTE <> 0) then
        BEGIN
        if (RTFTE = 'T') then
            CTARTFTE = TCTARTFTE;
        CUENTA = NULL;
        EXECUTE PROCEDURE VALIDE_CUENTA_C (CTARTFTE) RETURNING_VALUES (:OK);
        IF (OK = 0) THEN
            SELECT CUEN_COD, CUEN_RETENCION, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTARTFTE INTO :CUENTA, :ES_RETENCION, :TIPOCUEN;
        ELSE
            begin
            EXECUTE PROCEDURE ERROR (65, :IDDOC, :CTARTFTE, 2);
            CUENTA = CTARTFTE;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERROR (65, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERROR (65, :IDDOC, :CUENTA, 4);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            if (ES_RETENCION = 'S') then
                BEGIN
                VRBASE = VRTOTAL + VRDTO + vrrtfte + vrrtiva + vrrtica;
                SELECT CLIE_rtefte from clientes where terc_nit = :NIT INTO :PORC;
                END
            ELSE
                BEGIN
                VRBASE = 0;
                PORC = 0;
                END
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :VRBASE, :PORC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTFTE;
            END
        END /* RTFTE */
    /* RETENCION IVA */
    if ((RTIVA = 'T') or (RTIVA = 'K')) then
      if (VRRTIVA <> 0) then
        BEGIN
        if (RTIVA = 'T') then
            CTARTIVA = TCTARTIVA;
        CUENTA = NULL;
        EXECUTE PROCEDURE VALIDE_CUENTA_C (CTARTIVA) RETURNING_VALUES (:OK);
        IF (OK = 0) THEN
            SELECT CUEN_COD, CUEN_RETENCION, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTARTIVA INTO :CUENTA, :ES_RETENCION, :TIPOCUEN;
        ELSE
            begin
            EXECUTE PROCEDURE ERROR (65, :IDDOC, :CTARTIVA, 2);
            CUENTA = CTARTIVA;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERROR (65, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERROR (65, :IDDOC, :CUENTA, 4);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            if (ES_RETENCION = 'S') then
                BEGIN
                VRBASE = VRTOTAL + VRDTO + vrrtfte + vrrtiva + vrrtica;
                SELECT CLIE_RTEIVA from clientes where terc_nit = :NIT INTO :PORC;
                END
            ELSE
                BEGIN
                VRBASE = 0;
                PORC = 0;
                END
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTIVA, 0, :VRBASE, :PORC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTIVA;
            END
        END /* RTIVA */
    /* RETENCION DE ICA */
    if ((RTICA = 'T') or (RTICA = 'K')) then
      if (VRRTICA <> 0) then
        BEGIN
        if (RTICA = 'T') then
            CTARTICA = TCTARTICA;
        CUENTA = NULL;
        EXECUTE PROCEDURE VALIDE_CUENTA_C (CTARTICA) RETURNING_VALUES (:OK);
        IF (OK = 0) THEN
            SELECT CUEN_COD, CUEN_RETENCION, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTARTICA INTO :CUENTA, :ES_RETENCION, :TIPOCUEN;
        ELSE
            begin
            EXECUTE PROCEDURE ERROR (65, :IDDOC, :CTARTICA, 2);
            CUENTA = CTARTICA;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERROR (65, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERROR (65, :IDDOC, :CUENTA, 4);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            if (ES_RETENCION = 'S') then
                BEGIN
                VRBASE = VRTOTAL + VRDTO + vrrtfte + vrrtiva + vrrtica;
                SELECT CLIE_RTEICA from clientes where terc_nit = :NIT INTO :PORC;
                END
            ELSE
                BEGIN
                VRBASE = 0;
                PORC = 0;
                END
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTICA, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTICA;
            END
        END /* RTICA */
    /* CIERRE EL COMPROBANTE CONTRA LA CUENTA DEL TERCERO O LA BASE CONSTANTE */
    if ((SUMA <> 0) and ((BASE = 'T') or (BASE = 'K'))) then
        BEGIN
        if (SUMA < 0) then
            BEGIN
            DEBITO = SUMA * -1;
            CREDITO = 0;
            END
        ELSE
            BEGIN
            DEBITO = 0;
            CREDITO = SUMA;
            END
        if (BASE = 'T') then
            CTABASE = TCTACLIEN;
        CUENTA = NULL;
        EXECUTE PROCEDURE VALIDE_CUENTA_C (CTABASE) RETURNING_VALUES (:OK);
        IF (OK = 0) THEN
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTABASE INTO :CUENTA, :TIPOCUEN;
        ELSE
            begin
            EXECUTE PROCEDURE ERROR (65, :IDDOC, :CTABASE, 2);
            CUENTA = CTABASE;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERROR (65, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            /* DEBERIA RECORRER DOCUMENTO POR DOCUMENTO */
            FOR SELECT RCDE_TIPODOC, RCDE_PREFIJO, RCDE_NUMERO, RCDE_ABONO+RCDE_RTFTE+RCDE_RTIVA+RCDE_RTICA+RCDE_DTOF
                FROM RECIBOS_CAJA_DETALLE WHERE RECA_ID = :IDDOC
                INTO :TIPOIT, PREFIT, NUMIT, ABONOIT
                DO
                BEGIN
                NUMEROIT = PREFIT || NUMIT;
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :ABONOIT, 0, 0, :NIT, :PROY, :CENTRO, NULL, :NUMEROIT, NULL, NULL, :TIPOIT, 0);
                NROI = NROI + 1;
                END
            END
        if (TIPOCUEN = 'N') then
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :DEBITO, :CREDITO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
        NROI = NROI + 1;
        END /* SUMA EN CARTERA */
    /* recorra las cuentas adicionales */
    FOR SELECT INJC_CUENTA, INJC_BASE, INJC_PORC, INJC_VALOR, INJC_DB
        FROM INTERFAZ_CAJA_CTAS
        WHERE INCJ_ID = :IDINTER
        INTO :CTADIC, :BASEADIC, :PORCADIC, :VALORADIC, :DBADIC
        DO
        BEGIN
        if (:BASEADIC = 'TOTAL') then
            VALORADIC = VRTOTAL;
        if (:BASEADIC = 'DESCUENTO') then
            VALORADIC = VRDTO;
        if (:BASEADIC = 'RTFTE') then
            VALORADIC = VRRTFTE;
        if (:BASEADIC = 'RTIVA') then
            VALORADIC = VRRTIVA;
        if (:BASEADIC = 'RTICA') then
            VALORADIC = VRRTICA;
        MONTO = VALORADIC * PORCADIC;
        CUENTA = NULL;
        EXECUTE PROCEDURE VALIDE_CUENTA_C (CTADIC) RETURNING_VALUES (:OK);
        IF (OK = 0) THEN
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTADIC INTO :CUENTA, :TIPOCUEN;
        ELSE
            begin
            EXECUTE PROCEDURE ERROR (65, :IDDOC, :CTADIC, 2);
            CUENTA = CTADIC;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERROR (65, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERROR (65, :IDDOC, :CUENTA, 4);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            if (DBADIC = 'S') then
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTADIC, :CONC, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            ELSE
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTADIC, :CONC, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            END
        NROI = NROI + 1;
        END
    if (ERROR > 0) then
        VER = 'S';
    SUSPEND;
    END /* NO ANULADO */
  END /* EXISTE LA INTERFAZ */
ELSE
    BEGIN
    EXECUTE PROCEDURE ERROR (65, :IDDOC, :PREF, 1);
    ERROR = ERROR + 1;
    VER = 'S';
    SUSPEND;
    END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER PROCEDURE CONTABIL_RECICAJA(
    IDDOC INTEGER,
    IDINTER INTEGER)
RETURNS (
    ERROR INTEGER,
    VER CHAR(1),
    IDC INTEGER)
AS
declare variable PREF VARCHAR(4);
declare variable NUM VARCHAR(6);
declare variable FECAUX DATE;
declare variable FECHA CHAR(8);
declare variable CONC CHAR(120);
declare variable VRDTO NUMERIC(18, 2);
declare variable VRRTFTE NUMERIC(18, 2);
declare variable VRRTIVA NUMERIC(18, 2);
declare variable VRRTICA NUMERIC(18, 2);
declare variable VRTOTAL NUMERIC(18, 2);
declare variable TIPOCOMP VARCHAR(3);
declare variable PREFCONT VARCHAR(4);
declare variable BASE CHAR(1);
declare variable CTABASE VARCHAR(20);
declare variable CAJA CHAR(1);
declare variable CTACAJA VARCHAR(20);
declare variable RTFTE CHAR(1);
declare variable CTARTFTE VARCHAR(20);
declare variable RTIVA CHAR(1);
declare variable CTARTIVA VARCHAR(20);
declare variable RTICA CHAR(1);
declare variable CTARTICA VARCHAR(20);
declare variable DTO CHAR(1);
declare variable CTADTO VARCHAR(20);
declare variable EXISTE CHAR(1);
declare variable CUENTA VARCHAR(20);
declare variable MONTO NUMERIC(18,2);
declare variable ES_RETENCION CHAR(1);
declare variable TIPOCUEN CHAR(1);
declare variable NIT VARCHAR(20);
declare variable PROY VARCHAR(4);
declare variable CENTRO VARCHAR(4);
declare variable DEBITO NUMERIC(18,2);
declare variable CREDITO NUMERIC(18,2);
declare variable NROI INTEGER;
declare variable SUMA NUMERIC(18,2);
declare variable TCTACLIEN VARCHAR(20);
declare variable TCTARTFTE VARCHAR(20);
declare variable TCTARTIVA VARCHAR(20);
declare variable TCTARTICA VARCHAR(20);
declare variable TIPOIT INTEGER;
declare variable PREFIT VARCHAR(4);
declare variable NUMIT VARCHAR(6);
declare variable NUMEROIT VARCHAR(10);
declare variable ABONOIT NUMERIC(18,2);
declare variable CTADIC VARCHAR(20);
declare variable BASEADIC VARCHAR(20);
declare variable PORCADIC NUMERIC(5,2);
declare variable VALORADIC NUMERIC(18,2);
declare variable DBADIC CHAR(1);
declare variable ANULADO CHAR(1);
declare variable VRBASE NUMERIC(18,2);
declare variable PORC numeric(9,2);
declare variable OK INTEGER;
declare variable CRUCES NUMERIC(18,2);
declare variable VRCAJA NUMERIC(18,2);
declare variable DIFCAMBIO NUMERIC(18,2);
declare variable CTADIF VARCHAR(20);
declare variable PROVID INTEGER;
BEGIN
ERROR = 0;
/* BUSQUE LA INTERFACE */
EXISTE = 'N';
SELECT 'S', TICO_COD, PRCO_PRE, INCJ_BASE, INCJ_DTOPP, INCJ_RTFTE, INCJ_RTIVA, INCJ_RTICA, INCJ_CAJA, INCJ_CTABASE, INCJ_CTADTO, INCJ_CTARTFTE, INCJ_CTARTIVA, INCJ_CTARTICA, INCJ_CTACAJA, INCJ_CONFIRMAR
    FROM INTERFAZ_CAJA
    WHERE INCJ_ID = :IDINTER
    INTO :EXISTE, :TIPOCOMP, :PREFCONT, :BASE, :DTO, :RTFTE, :RTIVA, :RTICA, :CAJA, :CTABASE, :CTADTO, :CTARTFTE, :CTARTIVA, :CTARTICA, :CTACAJA, :VER;
if (EXISTE = 'S') then
  BEGIN
  /* BORRE LA CONTABILIZACION ANTERIOR */
  OK = 0;
  FOR SELECT CNTB_ID FROM CONTABILIZACION WHERE CNTB_TIPOREF = 61 AND CNTB_IDREF = :IDDOC INTO :OK DO
    BEGIN
    DELETE FROM CONTABILIZACION_DET WHERE CNTB_ID = :OK;
    DELETE FROM CONTABILIZACION WHERE CNTB_ID = :OK;
    END
  /* TRAIGA EL ENCABEZADO DEL RECIBO */
  SELECT PREF_PRE, RECA_NUMERO, RECA_FECHA, R.TERC_NIT, RECA_CONC, RECA_DTOF, RECA_MONTO, RECA_RTFTEMONTO, RECA_RTIVAMONTO, RECA_RTICAMONTO, TERC_CTARTFTE, TERC_CTARTIVA, TERC_CTARTICA, TERC_CTACLIENTE, RECA_ANULADO, RECA_PROVID
    FROM RECIBOS_CAJA R, TERCEROS T
    WHERE RECA_ID = :IDDOC AND R.TERC_NIT = T.TERC_NIT
    INTO :PREF, :NUM, :FECAUX, :NIT, :CONC, :VRDTO, :VRTOTAL, :VRRTFTE, :VRRTIVA, :VRRTICA, :TCTARTFTE, TCTARTIVA, TCTARTICA, TCTACLIEN, :ANULADO, :PROVID;
  if (ANULADO = 'N') then
    BEGIN
    SELECT PREF_CENTRO, PREF_PROY FROM PREFIJOS
        WHERE PREF_PRE = :PREF AND TIDO_COD = 61 INTO :CENTRO, :PROY;
    EXECUTE PROCEDURE FECHA_A_CONTA(:FECAUX) returning_values (:FECHA);
    /* REGISTRE EL ENCABEZADO CONTABLE */
    IDC = GEN_ID(ID_CONTABILIZA, 1);
    INSERT INTO CONTABILIZACION (CNTB_ID, CNTB_TIPOCOMP, CNTB_PREFCNT, CNTB_NUMERO, CNTB_FECHA, CNTB_CONCEPTO, CNTB_REF, CNTB_TIPOREF, CNTB_IDREF, CNTB_PREFREF, CNTB_NUMREF, CNTB_PROCESADO)
        VALUES (:IDC, :TIPOCOMP, :PREFCONT, :NUM, :FECHA, :CONC, '', 61, :IDDOC, :PREF, :NUM, 'N');
    NROI = 0;
    SUMA = 0;
    /* SUME LOS CRUCES PARA LLEVARLOS A LA CUENTA X PAGAR Y RESTAR DE LA CAJA */
    SELECT SUM(RCCR_ABONO) FROM RECIBOS_CAJA_CRUCEC WHERE RECA_ID = :iddoc INTO :CRUCES;
    if (CRUCES IS NULL) then
        CRUCES = 0;
    VRCAJA = VRTOTAL - CRUCES;
    IF ((CAJA = 'K')) THEN
        BEGIN
        if (VRCAJA <> 0) then
            BEGIN
            CUENTA = NULL;
            EXECUTE PROCEDURE VALIDE_CUENTA_C (CTACAJA) RETURNING_VALUES (:OK);
            IF (OK = 0) THEN
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :CTACAJA INTO :CUENTA, :TIPOCUEN;
            ELSE
                begin
                EXECUTE PROCEDURE ERROR (61, :IDDOC, :CTACAJA, 2);
                CUENTA = CTACAJA;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERROR (61, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                EXECUTE PROCEDURE ERROR (61, :IDDOC, :CUENTA, 4);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                IF (VRCAJA > 0) THEN
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRCAJA, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    SUMA = SUMA + VRCAJA;
                    END
                ELSE   
                    BEGIN                     
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                       VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, ABS(:VRCAJA), 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    SUMA = SUMA + VRCAJA;
                    END
                NROI = NROI + 1;
                END
            END /* VRCAJA <> 0 */
        END /* CAJA CONSTANTE */
    IF ((CAJA = 'F')) THEN
        BEGIN
        /* AGRUPE LAS CUENTAS DE LAS FORMAS DE PAGO */
        FOR SELECT MAX(FOPA_CTACONTA), SUM(RCPA_MONTO)
            FROM formas_pago F, recibos_caja_pago R
            WHERE R.RECA_ID = :IDDOC AND R.FOPA_ID = F.FOPA_ID
            GROUP BY FOPA_CTACONTA
            INTO :CTACAJA, :MONTO
        DO
            BEGIN
            if (MONTO <> 0) then
                BEGIN
                CUENTA = NULL;
                EXECUTE PROCEDURE VALIDE_CUENTA_C (CTACAJA) RETURNING_VALUES (:OK);
                IF (OK = 0) THEN
                    SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                        WHERE CUEN_COD = :CTACAJA INTO :CUENTA, :TIPOCUEN;
                ELSE
                    begin
                    EXECUTE PROCEDURE ERROR (61, :IDDOC, :CTACAJA, 2);
                    CUENTA = CTACAJA;
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (61, :IDDOC, :CUENTA, 3);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (61, :IDDOC, :CUENTA, 4);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    IF (MONTO > 0) THEN
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        SUMA = SUMA + MONTO;
                        END
                    ELSE
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, abs(:MONTO), 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        SUMA = SUMA + MONTO;
                        END
                    NROI = NROI + 1;
                    END
                END /* MONTO <> 0 */
            END /* DO FORMA_PAGO */
        END /* CAJA = F */
    if (DTO = 'K') then /* DTO EN CTA CONSTANTE */
        BEGIN
        if (VRDTO <> 0) then
            BEGIN
            CUENTA = NULL;
            EXECUTE PROCEDURE VALIDE_CUENTA_C (CTADTO) RETURNING_VALUES (:OK);
            IF (OK = 0) THEN
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :CTADTO INTO :CUENTA, :TIPOCUEN;
            ELSE
                begin
                EXECUTE PROCEDURE ERROR (61, :IDDOC, :CTADTO, 2);
                CUENTA = CTADTO;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERROR (61, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                EXECUTE PROCEDURE ERROR (61, :IDDOC, :CUENTA, 4);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRDTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA + VRDTO;
                END
            END /* VRDTO <> 0 */
        END /* DTO EN CTA CONSTANTE */

    /* LA DIFERENCIA EN CAMBIO */
    SELECT SUM(RCDE_DIFCAMBIO) FROM recibos_caja_detalle WHERE RECA_ID = :iddoc INTO :DIFCAMBIO;
    IF ((DIFCAMBIO IS NOT NULL) AND (DIFCAMBIO <> 0)) THEN
        BEGIN
        if (DIFCAMBIO > 0) then
            execute procedure lee_configuracion('GENERAL','GENERAL','CUENTA DE INGRESO POR DIFERENCIA EN CAMBIO PARA OPERACIONES EN OTRA MONEDA') returning_values (:ctadif);
        else
            execute procedure lee_configuracion('GENERAL','GENERAL','CUENTA DE GASTO POR DIFERENCIA EN CAMBIO PARA OPERACIONES EN OTRA MONEDA') returning_values (:ctadif);
        CUENTA = NULL;
        EXECUTE PROCEDURE VALIDE_CUENTA_C (ctadif) RETURNING_VALUES (:OK);
        IF (OK = 0) THEN
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :ctadif INTO :CUENTA, :TIPOCUEN;
        ELSE
            begin
            EXECUTE PROCEDURE ERROR (61, :IDDOC, :ctadif, 2);
            CUENTA = ctadif;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERROR (61, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERROR (61, :IDDOC, :CUENTA, 4);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            if (DIFCAMBIO > 0) then
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :difcambio, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            else
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', ABS(:difcambio), 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA - difcambio;
            END
        END
    /* RETENCION FUENTE */
    if ((RTFTE = 'T') or (RTFTE = 'K')) then
      if (VRRTFTE <> 0) then
        BEGIN
        if (RTFTE = 'T') then
            CTARTFTE = TCTARTFTE;
        CUENTA = NULL;
        EXECUTE PROCEDURE VALIDE_CUENTA_C (CTARTFTE) RETURNING_VALUES (:OK);
        IF (OK = 0) THEN
            SELECT CUEN_COD, CUEN_RETENCION, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTARTFTE INTO :CUENTA, :ES_RETENCION, :TIPOCUEN;
        ELSE
            begin
            EXECUTE PROCEDURE ERROR (61, :IDDOC, :CTARTFTE, 2);
            CUENTA = CTARTFTE;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERROR (61, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERROR (61, :IDDOC, :CUENTA, 4);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            if (ES_RETENCION = 'S') then
                BEGIN
                VRBASE = VRTOTAL + VRDTO + vrrtfte + vrrtiva + vrrtica;
                SELECT CLIE_rtefte from clientes where terc_nit = :NIT INTO :PORC;
                END
            ELSE
                BEGIN
                VRBASE = 0;
                PORC = 0;
                END
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :VRBASE, :PORC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTFTE;
            END
        END /* RTFTE */
    /* RETENCION IVA */
    if ((RTIVA = 'T') or (RTIVA = 'K')) then
      if (VRRTIVA <> 0) then
        BEGIN
        if (RTIVA = 'T') then
            CTARTIVA = TCTARTIVA;
        CUENTA = NULL;
        EXECUTE PROCEDURE VALIDE_CUENTA_C (CTARTIVA) RETURNING_VALUES (:OK);
        IF (OK = 0) THEN
            SELECT CUEN_COD, CUEN_RETENCION, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTARTIVA INTO :CUENTA, :ES_RETENCION, :TIPOCUEN;
        ELSE
            begin
            EXECUTE PROCEDURE ERROR (61, :IDDOC, :CTARTIVA, 2);
            CUENTA = CTARTIVA;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERROR (61, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERROR (61, :IDDOC, :CUENTA, 4);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            if (ES_RETENCION = 'S') then
                BEGIN
                VRBASE = VRTOTAL + VRDTO + vrrtfte + vrrtiva + vrrtica;
                SELECT CLIE_RTEIVA from clientes where terc_nit = :NIT INTO :PORC;
                END
            ELSE
                BEGIN
                VRBASE = 0;
                PORC = 0;
                END
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTIVA, 0, :VRBASE, :PORC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTIVA;
            END
        END /* RTIVA */
    /* RETENCION DE ICA */
    if ((RTICA = 'T') or (RTICA = 'K')) then
      if (VRRTICA <> 0) then
        BEGIN
        if (RTICA = 'T') then
            CTARTICA = TCTARTICA;
        CUENTA = NULL;
        EXECUTE PROCEDURE VALIDE_CUENTA_C (CTARTICA) RETURNING_VALUES (:OK);
        IF (OK = 0) THEN
            SELECT CUEN_COD, CUEN_RETENCION, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTARTICA INTO :CUENTA, :ES_RETENCION, :TIPOCUEN;
        ELSE
            begin
            EXECUTE PROCEDURE ERROR (61, :IDDOC, :CTARTICA, 2);
            CUENTA = CTARTICA;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERROR (61, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERROR (61, :IDDOC, :CUENTA, 4);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            if (ES_RETENCION = 'S') then
                BEGIN
                VRBASE = VRTOTAL + VRDTO + vrrtfte + vrrtiva + vrrtica;
                SELECT CLIE_RTEICA from clientes where terc_nit = :NIT INTO :PORC;
                END
            ELSE
                BEGIN
                VRBASE = 0;
                PORC = 0;
                END
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTICA, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTICA;
            END
        END /* RTICA */
    /* CRUCES CON CXP */
    if (CRUCES <> 0) then
        BEGIN
        SELECT PROV_CARTERA FROM PROVEEDORES WHERE TERC_NIT = :nit INTO :ctabase;
        if (CTABASE IS NULL) then
            ctabase = tctaclien;
        CUENTA = NULL;
        EXECUTE PROCEDURE VALIDE_CUENTA_C (CTABASE) RETURNING_VALUES (:OK);
        IF (OK = 0) THEN
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTABASE INTO :CUENTA, :TIPOCUEN;
        ELSE
            begin
            EXECUTE PROCEDURE ERROR (61, :IDDOC, :CTABASE, 2);
            CUENTA = CTABASE;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERROR (61, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            /* DEBERIA RECORRER DOCUMENTO POR DOCUMENTO */
            FOR SELECT RCCR_TIPODOC, RCCR_PREFIJO, RCCR_NUMERO, RCCR_ABONO+RCCR_RTFTE+RCCR_RTIVA+RCCR_RTICA+RCCR_DTOF
                FROM recibos_caja_crucec WHERE RECA_ID = :IDDOC
                INTO :TIPOIT, PREFIT, NUMIT, ABONOIT
                DO
                BEGIN
                NUMEROIT = PREFIT || NUMIT;
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :ABONOIT, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, :NUMEROIT, NULL, NULL, :TIPOIT, 0);
                SUMA = SUMA + ABONOIT;
                NROI = NROI + 1;
                END
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :CRUCES, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            SUMA = SUMA + CRUCES;
            NROI = NROI + 1;
            END

        /* LA DIFERENCIA EN CAMBIO */
        SELECT SUM(RCCR_DIFCAMBIO) FROM recibos_caja_crucec WHERE RECA_ID = :iddoc INTO :DIFCAMBIO;
        IF ((DIFCAMBIO IS NOT NULL) AND (DIFCAMBIO <> 0)) THEN
            BEGIN
            if (DIFCAMBIO > 0) then
                execute procedure lee_configuracion('GENERAL','GENERAL','CUENTA DE GASTO POR DIFERENCIA EN CAMBIO PARA OPERACIONES EN OTRA MONEDA') returning_values (:ctadif);
            else
                execute procedure lee_configuracion('GENERAL','GENERAL','CUENTA DE INGRESO POR DIFERENCIA EN CAMBIO PARA OPERACIONES EN OTRA MONEDA') returning_values (:ctadif);
            CUENTA = NULL;
            EXECUTE PROCEDURE VALIDE_CUENTA_C (ctadif) RETURNING_VALUES (:OK);
            IF (OK = 0) THEN
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :ctadif INTO :CUENTA, :TIPOCUEN;
            ELSE
                begin
                EXECUTE PROCEDURE ERROR (61, :IDDOC, :ctadif, 2);
                CUENTA = ctadif;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERROR (61, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                EXECUTE PROCEDURE ERROR (61, :IDDOC, :CUENTA, 4);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                if (DIFCAMBIO > 0) then
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :difcambio, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                else
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, ABS(:difcambio), 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA + difcambio;
                END
            END
        END /* cruces */
    /* CIERRE EL COMPROBANTE CONTRA LA CUENTA DEL TERCERO O LA BASE CONSTANTE */
    if ((SUMA <> 0) and ((BASE = 'T') or (BASE = 'K'))) then
        BEGIN
        if (SUMA < 0) then
            BEGIN
            DEBITO = SUMA * -1;
            CREDITO = 0;
            END
        ELSE
            BEGIN
            DEBITO = 0;
            CREDITO = SUMA;
            END
        if (BASE = 'T') then
            CTABASE = TCTACLIEN;
        CUENTA = NULL;
        EXECUTE PROCEDURE VALIDE_CUENTA_C (CTABASE) RETURNING_VALUES (:OK);
        IF (OK = 0) THEN
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTABASE INTO :CUENTA, :TIPOCUEN;
        ELSE
            begin
            EXECUTE PROCEDURE ERROR (61, :IDDOC, :CTABASE, 2);
            CUENTA = CTABASE;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERROR (61, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            /* DEBERIA RECORRER DOCUMENTO POR DOCUMENTO */
            FOR SELECT RCDE_TIPODOC, RCDE_PREFIJO, RCDE_NUMERO, RCDE_ABONO+RCDE_RTFTE+RCDE_RTIVA+RCDE_RTICA+RCDE_DTOF
                FROM RECIBOS_CAJA_DETALLE WHERE RECA_ID = :IDDOC
                INTO :TIPOIT, PREFIT, NUMIT, ABONOIT
                DO
                BEGIN
                NUMEROIT = PREFIT || NUMIT;
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :ABONOIT, 0, 0, :NIT, :PROY, :CENTRO, NULL, :NUMEROIT, NULL, NULL, :TIPOIT, 0);
                NROI = NROI + 1;
                END
            END
        if (TIPOCUEN = 'N') then
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :DEBITO, :CREDITO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
        NROI = NROI + 1;
        END /* SUMA EN CARTERA */
    /* recorra las cuentas adicionales */
    FOR SELECT INJC_CUENTA, INJC_BASE, INJC_PORC, INJC_VALOR, INJC_DB
        FROM INTERFAZ_CAJA_CTAS
        WHERE INCJ_ID = :IDINTER
        INTO :CTADIC, :BASEADIC, :PORCADIC, :VALORADIC, :DBADIC
        DO
        BEGIN
        if (:BASEADIC = 'TOTAL') then
            VALORADIC = VRTOTAL;
        if (:BASEADIC = 'DESCUENTO') then
            VALORADIC = VRDTO;
        if (:BASEADIC = 'RTFTE') then
            VALORADIC = VRRTFTE;
        if (:BASEADIC = 'RTIVA') then
            VALORADIC = VRRTIVA;
        if (:BASEADIC = 'RTICA') then
            VALORADIC = VRRTICA;
        MONTO = VALORADIC * PORCADIC;
        CUENTA = NULL;
        EXECUTE PROCEDURE VALIDE_CUENTA_C (CTADIC) RETURNING_VALUES (:OK);
        IF (OK = 0) THEN
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTADIC INTO :CUENTA, :TIPOCUEN;
        ELSE
            begin
            EXECUTE PROCEDURE ERROR (61, :IDDOC, :CTADIC, 2);
            CUENTA = CTADIC;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERROR (61, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERROR (61, :IDDOC, :CUENTA, 4);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            if (DBADIC = 'S') then
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTADIC, :CONC, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            ELSE
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTADIC, :CONC, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            END
        NROI = NROI + 1;
        END
    /* REVERSE EL PROVISIONAL SI EXISTE */
    if ((PROVID IS NOT NULL) AND (PROVID <> 0))  then
        BEGIN
        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
            SELECT :IDC, CODE_ITEM+:NROI, CUEN_COD, :CONC, '', CODE_CREDITO, CODE_DEBITO, CODE_BASE*-1, CODE_PORC, TERC_NIT, PROY_COD, CENT_COD, NULL, NULL, NULL, NULL, 0, 0
                FROM COMPROBANTE_DETALLE D, COMPROBANTE_ENCABEZADO E WHERE E.enco_consec = D.enco_consec AND E.enco_tiporef = 65 AND E.enco_idref = :provid ORDER BY CODE_ITEM;
        END
    if (ERROR > 0) then
        VER = 'S';
    SUSPEND;
    END /* NO ANULADO */
  END /* EXISTE LA INTERFAZ */
ELSE
    BEGIN
    EXECUTE PROCEDURE ERROR (61, :IDDOC, :PREF, 1);
    ERROR = ERROR + 1;
    VER = 'S';
    SUSPEND;
    END
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE RECIBOS_SIN_CONTABILIDAD(
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    ID INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    ESTADO VARCHAR(20),
    IDI INTEGER,
    IDC INTEGER,
    ERROR INTEGER)
AS
DECLARE VARIABLE VER CHAR(2);
declare variable FECICNT VARCHAR(10);
declare variable FECFCNT VARCHAR(10);
declare variable idref INTEGER;
BEGIN /*$$IBE$$ 
EXECUTE PROCEDURE fecha_a_conta(FECINI) returning_values (FECICNT);
EXECUTE PROCEDURE fecha_a_conta(FECFIN) returning_values (FECFCNT);
FOR SELECT RECA_ID, PREF_PRE, RECA_NUMERO FROM RECIBOS_CAJA WHERE RECA_ANULADO = 'N' AND
    RECA_FECHA >= :FECINI AND RECA_FECHA <= :FECFIN and PREF_PRE NOT IN (SELECT AUTO_PREFRDC FROM AUTORIZACIONES) ORDER BY RECA_ID
    INTO :ID, :PREF, :NUMERO
DO
  BEGIN
  idref = null;
  SELECT ENCO_IDREF FROM COMPROBANTE_ENCABEZADO WHERE ENCO_TIPOREF = 61 AND ENCO_FECHA >= :FECICNT AND ENCO_FECHA <= :FECFCNT and ENCO_IDREF = :id into :idref;
  if (idref IS NULL) then
  begin
   ESTADO = 'PROCESANDO';
   SUSPEND;
   SELECT MAX(INCJ_ID) FROM INTERFAZ_CAJA WHERE PREF_PRE = :PREF AND TIDO_COD = 61 INTO :IDI;
   EXECUTE PROCEDURE CONTABIL_RECICAJA (:ID, :IDI) RETURNING_VALUES (:ERROR, :VER, :IDC);
   if (ERROR = 0) then
    BEGIN
    EXECUTE PROCEDURE CONTABILIZA_PENDIENTE (:IDC);
    ESTADO = 'OK';
    END
   ELSE
    ESTADO = 'ERROR';
   suspend;
  end
  END
 $$IBE$$*/ SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE RECIBOS_SIN_CONTABILIDAD(
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    ID INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    ESTADO VARCHAR(20),
    IDI INTEGER,
    IDC INTEGER,
    ERROR INTEGER)
AS
DECLARE VARIABLE VER CHAR(2);
declare variable FECICNT VARCHAR(10);
declare variable FECFCNT VARCHAR(10);
declare variable idref INTEGER;
BEGIN
EXECUTE PROCEDURE fecha_a_conta(FECINI) returning_values (FECICNT);
EXECUTE PROCEDURE fecha_a_conta(FECFIN) returning_values (FECFCNT);
FOR SELECT RECA_ID, PREF_PRE, RECA_NUMERO FROM RECIBOS_CAJA WHERE RECA_ANULADO = 'N' AND
    RECA_FECHA >= :FECINI AND RECA_FECHA <= :FECFIN and PREF_PRE NOT IN (SELECT AUTO_PREFRDC FROM AUTORIZACIONES) ORDER BY RECA_ID
    INTO :ID, :PREF, :NUMERO
DO
  BEGIN
  idref = null;
  SELECT ENCO_IDREF FROM COMPROBANTE_ENCABEZADO WHERE ENCO_TIPOREF = 61 AND ENCO_FECHA >= :FECICNT AND ENCO_FECHA <= :FECFCNT and ENCO_IDREF = :id into :idref;
  if (idref IS NULL) then
  begin
   ESTADO = 'PROCESANDO';
   SUSPEND;
   SELECT MAX(INCJ_ID) FROM INTERFAZ_CAJA WHERE PREF_PRE = :PREF AND TIDO_COD = 61 INTO :IDI;
   EXECUTE PROCEDURE CONTABIL_RECICAJA (:ID, :IDI) RETURNING_VALUES (:ERROR, :VER, :IDC);
   if (ERROR = 0) then
    BEGIN
    EXECUTE PROCEDURE CONTABILIZA_PENDIENTE (:IDC);
    ESTADO = 'OK';
    END
   ELSE
    ESTADO = 'ERROR';
   suspend;
  end
  END
END

^

SET TERM ; ^

grant EXECUTE on PROCEDURE CONTABIL_RECIPROV to PUBLIC;


/* 20090121 ERROR VALIDATION ERROR FOR COLUMNA CNDE_CUENTA NULL, PERMITA NULOS EN LA TABLA DE CONTABILIZACION_DETALLE */

update RDB$RELATION_FIELDS set
RDB$NULL_FLAG = NULL
where (RDB$FIELD_NAME = 'CNDE_CUENTA') and
(RDB$RELATION_NAME = 'CONTABILIZACION_DET');
COMMIT WORK;



/* 20090122 ESTRICTAMENTE > PARA QUE HAGA CHEQUEO Y NO >= */

SET TERM ^ ;

CREATE OR ALTER PROCEDURE CHEQUEO_COSTOS(
    ARTICULO VARCHAR(20),
    FECHA DATE)
AS
declare variable NUMROWS INTEGER;
DECLARE VARIABLE ID INTEGER;
DECLARE VARIABLE FECMV DATE;
DECLARE VARIABLE CANT NUMERIC(15,4);
DECLARE VARIABLE COSTO NUMERIC(18,2);
DECLARE VARIABLE ENTRADA CHAR(1);
DECLARE VARIABLE TIPO INTEGER;
begin
SELECT COUNT(*) FROM COSTOS WHERE ARTI_COD = :ARTICULO AND COST_FECHA > :FECHA INTO :NUMROWS;
if (NUMROWS > 0) then
    BEGIN
    delete from costos where arti_cod = :ARTICULO AND COST_FECHA >= :FECHA;
    for select mvar_cons, mvar_fecha, mvar_cant, mvar_costo, mvar_entrada, mvar_tipodoc
        from movimiento_articulo WHERE ARTI_COD = :ARTICULO AND MVAR_FECHA >= :FECHA
        order by mvar_fecha, mvar_cons /* SE HACE ESTRICTAMENTE EN ORDEN DE FECHA Y REGISTRO, SI LO EDITAN CAMBIA EL ORDEN */
        into :id, :fecmv, :cant, :costo, :entrada, :tipo
        do
        if ((TIPO <> 13)) then
            EXECUTE PROCEDURE actualice_costo(:ARTICULO, :fecmv, :costo, :cant, :entrada, 'N', :id, :tipo);
    END
end
^

SET TERM ; ^

SET TERM ^ ;

ALTER TRIGGER MOVIMIENTO_ARTICULO_AD
AS
declare variable LOTE CHAR(1);
BEGIN
  /* INSERTE EL NUEVO LOTE */
  SELECT ARTI_EXIST
    FROM   ARTICULO
    WHERE  ARTICULO.ARTI_COD = OLD.ARTI_COD
    INTO :LOTE;
  /* BORRE LOS VIEJOS */
  if (old.mvar_tipodoc <> 13) then
      BEGIN
      EXECUTE PROCEDURE actualice_costo(old.arti_cod, old.mvar_fecha, old.mvar_costo, old.mvar_cant, old.mvar_entrada, 'S', OLD.mvar_cons, OLD.mvar_tipodoc);
      EXECUTE PROCEDURE chequeo_costos(old.arti_cod, old.mvar_fecha);
      END
  /* actualice existencias */
  if (old.mvar_entrada = 'S') then
    BEGIN
    execute procedure sume_existencia(old.arti_cod, old.bode_cod, old.mvar_fecha, old.mvar_cant, 'S');
    if (LOTE = 'L') then
        UPDATE LOTES
            set lote_saldo = lote_saldo - old.mvar_cant
            where (arti_cod = old.ARTI_COD) and (bode_cod = old.bode_cod) and (lote_nro = old.mvar_lote);
    END
  else
    BEGIN
    execute procedure reste_existencia(old.arti_cod, old.bode_cod, old.mvar_fecha, old.mvar_cant, 'S');
    if (LOTE = 'L') then
        UPDATE LOTES
            set lote_saldo = lote_saldo + old.mvar_cant
            where (arti_cod = old.ARTI_COD) and (bode_cod = old.bode_cod) and (lote_nro = old.mvar_lote);
    END
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER TRIGGER MOVIMIENTO_ARTICULO_AI
AS
declare variable EXISTE CHAR(1);
declare variable LOTE CHAR(1);
BEGIN
  /* INSERTE EL NUEVO LOTE */
  SELECT ARTI_EXIST FROM ARTICULO WHERE ARTICULO.ARTI_COD = NEW.ARTI_COD INTO :LOTE;
  /* ACTUALICE COSTOS cuando no es transferencia */
  if (new.mvar_tipodoc <> 13) then
      BEGIN
      EXECUTE PROCEDURE actualice_costo(new.arti_cod, new.mvar_fecha, new.mvar_costo, new.mvar_cant, new.mvar_entrada, 'N', new.mvar_cons, new.mvar_tipodoc);
      EXECUTE PROCEDURE chequeo_costos(NEW.arti_cod, NEW.mvar_fecha);
      END
  /* actualice existencias */
  if (new.mvar_entrada = 'S') then
    BEGIN
    execute procedure sume_existencia(new.arti_cod, new.bode_cod, new.mvar_fecha, new.mvar_cant, 'N');
    if (LOTE = 'L') then
        BEGIN
        if (NEW.MVAR_LOTE IS NULL) then
            EXCEPTION LOTE_OBLIGATORIO 'Debe especificar un número de lote para el articulo ' || new.arti_cod;
        ELSE
         BEGIN
         EXISTE = 'N';
         SELECT 'S' FROM LOTES WHERE ARTI_COD = NEW.ARTI_COD AND BODE_COD = NEW.bode_cod AND LOTE_NRO = new.mvar_lote INTO :EXISTE;
         if (EXISTE = 'S') then
            UPDATE LOTES
             set lote_saldo = lote_saldo + new.mvar_cant
              where (arti_cod = NEW.ARTI_COD) and (BODE_COD = NEW.bode_cod) and (lote_nro = new.mvar_lote);
         ELSE
            INSERT INTO LOTES (ARTI_COD, BODE_COD, LOTE_NRO, LOTE_FECHA, LOTE_CANT, LOTE_COSTO, LOTE_SALDO)
                VALUES (NEW.ARTI_COD, NEW.bode_cod, NEW.mvar_lote, NEW.mvar_fecha, NEW.mvar_cant, NEW.mvar_costo, NEW.mvar_cant);
         END
        END
    END
  else
    BEGIN
    execute procedure reste_existencia(new.arti_cod, new.bode_cod, new.mvar_fecha, new.mvar_cant, 'N');
    /* ACTUALICE LA EXISTENCIA DEL LOTE */
    if (LOTE = 'L') then
    if (NEW.mvar_lote IS NULL) then
        EXCEPTION LOTE_NEGATIVO 'Debe indicar un número de lote para el artículo ' || new.arti_cod;
    ELSE
        BEGIN
        /* Actualice el saldo historico del lote */
        EXISTE = 'N';
        SELECT 'S' FROM EXISTENCIA_LOTE WHERE LOTE_NRO = NEW.MVAR_LOTE AND EXLO_FECHA = NEW.MVAR_FECHA AND ARTI_COD = NEW.arti_cod AND BODE_COD = NEW.bode_cod INTO :EXISTE;
        if (EXISTE = 'S') then
            BEGIN
            UPDATE EXISTENCIA_LOTE
                SET EXLO_SAL = EXLO_SAL + NEW.mvar_cant
                WHERE LOTE_NRO = NEW.MVAR_LOTE AND EXLO_FECHA = NEW.MVAR_FECHA AND ARTI_COD = NEW.ARTI_COD AND BODE_COD = NEW.bode_cod;
            END
        ELSE
            BEGIN
            INSERT INTO EXISTENCIA_LOTE (ARTI_COD, BODE_COD, LOTE_NRO, EXLO_FECHA, EXLO_SAL)
                VALUES (NEW.ARTI_COD, NEW.bode_cod, NEW.MVAR_LOTE, NEW.MVAR_FECHA, NEW.MVAR_CANT);
            END
        UPDATE LOTES
            set lote_saldo = lote_saldo - new.mvar_cant
            where (arti_cod = NEW.ARTI_COD) and (BODE_COD = NEW.bode_cod) and (lote_nro = new.mvar_lote);
        END
    END
END
^

SET TERM ; ^

/* 20090122B COMPLETE LOS DESCUENTOS EN CERO PARA EVITAR NULL EN IMPRESION DE PR.NETO */
ALTER TRIGGER FACTURAS_DETALLE_AU INACTIVE;
update facturas_detalle set fade_dto1 = 0, fade_dtom1 = 0 where fade_dto1 is null;
commit work;
update facturas_detalle set fade_dto2 = 0, fade_dtom2 = 0 where fade_dto2 is null;
commit work;
update facturas_detalle set fade_dto3 = 0, fade_dtom3 = 0 where fade_dto3 is null;
commit work;
ALTER TRIGGER FACTURAS_DETALLE_AU ACTIVE;

ALTER TRIGGER PEDIDOS_DETALLE_AU INACTIVE;
update pedidos_detalle set pede_dto1 = 0, pede_dtom1 = 0 where pede_dto1 is null;
update pedidos_detalle set pede_dto2 = 0, pede_dtom2 = 0 where pede_dto2 is null;
update pedidos_detalle set pede_dto3 = 0, pede_dtom3 = 0 where pede_dto3 is null;
commit work;
ALTER TRIGGER PEDIDOS_DETALLE_AU ACTIVE;

/* MAL PRECIO NETO */

SET TERM ^ ;

CREATE OR ALTER PROCEDURE IMPR_FACTURA(
    ID INTEGER)
RETURNS (
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    VENCE DATE,
    DIASVENCE INTEGER,
    CONTCRED CHAR(17),
    NIT VARCHAR(20),
    NOMTERCERO VARCHAR(60),
    NOMCLIENTE VARCHAR(60),
    VENDEDOR INTEGER,
    NOMVENDEDOR VARCHAR(60),
    PUNTOVTA INTEGER,
    NOMPUNTOVTA VARCHAR(30),
    CODBODEGA VARCHAR(2),
    NOMBODEGA VARCHAR(30),
    AUTORIZACION VARCHAR(20),
    DESPACHO VARCHAR(255),
    TRANSPORTADOR VARCHAR(60),
    COTIZACION VARCHAR(30),
    PEDIDO VARCHAR(30),
    REMISION VARCHAR(30),
    PACIENTE VARCHAR(20),
    NOMPACIENTE VARCHAR(60),
    COMIPORC NUMERIC(9,2),
    COMIMONTO NUMERIC(18,2),
    SUBTOTAL NUMERIC(18,2),
    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),
    EXTRA NUMERIC(18,2),
    DTOFPORC NUMERIC(9,2),
    DTOFMONTO NUMERIC(18,2),
    FECHADTO DATE,
    TOTALFAC NUMERIC(18,2),
    TOTALPAGAR NUMERIC(18,2),
    OBS BLOB SUB_TYPE 1 SEGMENT SIZE 80,
    ITEM INTEGER,
    ARTICULO VARCHAR(15),
    CODBAR VARCHAR(15),
    ARTIDES VARCHAR(60),
    DESCORTA VARCHAR(30),
    CANT NUMERIC(18,4),
    LOTE VARCHAR(15),
    VLOTE DATE,
    UNIDAD VARCHAR(8),
    CAJAS NUMERIC(18,4),
    FACTOR INTEGER,
    LISTAPR INTEGER,
    REFITEM VARCHAR(60),
    BODITEM VARCHAR(2),
    STAND VARCHAR(15),
    PRUNIT NUMERIC(18,2),
    DTOITPORC NUMERIC(9,2),
    DTOITMONTO NUMERIC(18,2),
    PRNETO NUMERIC(18,2),
    PRNETOSINIVA NUMERIC(18,2),
    DTOIT1 NUMERIC(9,2),
    DTOIT2 NUMERIC(9,2),
    DTOIT3 NUMERIC(9,2),
    IVAPORC NUMERIC(9,2),
    IVAITMONTO NUMERIC(18,2),
    CONSUMO NUMERIC(18,2),
    SUBTOTIT NUMERIC(18,2),
    TOTAL NUMERIC(18,2),
    CODIGOCL VARCHAR(20),
    ZONACOD VARCHAR(2),
    ZONANOM VARCHAR(60),
    DV CHAR(1),
    DIRECCION VARCHAR(60),
    CIUDAD VARCHAR(40),
    TELEFONO VARCHAR(40),
    CONTACTO VARCHAR(60),
    FAX VARCHAR(25),
    GRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    SUBGRUPO VARCHAR(3),
    NOMSUBG VARCHAR(30),
    MARCA VARCHAR(3),
    NOMMARCA VARCHAR(30),
    PESO NUMERIC(18,4),
    ANCHO NUMERIC(18,4),
    ALTO NUMERIC(18,4),
    LARGO NUMERIC(18,4),
    SUMA1 NUMERIC(18,2),
    SUMA2 NUMERIC(18,2),
    SUMA3 NUMERIC(18,2),
    IVA1 NUMERIC(18,2),
    IVA2 NUMERIC(18,2),
    IVA3 NUMERIC(18,2),
    SUMAEX NUMERIC(18,2),
    SUMAGR NUMERIC(18,2),
    TOTCONSUMO NUMERIC(18,2),
    DTOIT1M NUMERIC(18,2),
    DTOIT2M NUMERIC(18,2),
    DTOIT3M NUMERIC(18,2),
    TOTCAJAS NUMERIC(18,2),
    VEHICULO VARCHAR(8),
    RECIBIDO NUMERIC(18,2),
    CAMBIO NUMERIC(18,2),
    HORA TIME,
    FORMAPAGO1 VARCHAR(30),
    MONTOPAGO1 NUMERIC(18,2),
    FORMAPAGO2 VARCHAR(30),
    MONTOPAGO2 NUMERIC(18,2),
    FORMAPAGO3 VARCHAR(30),
    MONTOPAGO3 NUMERIC(18,2),
    PUNTOS INTEGER,
    PUNTOSACUM INTEGER,
    PUNTOSVENC INTEGER,
    FECPTOS DATE,
    OBSITEM BLOB SUB_TYPE 1 SEGMENT SIZE 80,
    SUCUR VARCHAR(10))
AS
DECLARE VARIABLE IMPTOS CHAR(1);
DECLARE VARIABLE TARIFA INTEGER;
declare variable DEVUELTO NUMERIC(18,2);
declare variable ORDENCOD CHAR(2);
declare variable IMPRDEV CHAR(2);
declare variable IMPR CHAR(1);
declare variable ITEMFP INTEGER;
declare variable FORMAP VARCHAR(30);
declare variable MONTOP NUMERIC(18,2);
declare variable ICOINC CHAR(2);
declare variable DTOITM1 NUMERIC(18,2);
declare variable DTOITM2 NUMERIC(18,2);
declare variable DTOITM3 NUMERIC(18,2);
BEGIN
execute procedure lee_configuracion('FACTURACION', 'ARTICULOS', 'IMPOCONSUMO INCLUIDO EN EL PRECIO BASE DE VENTA ANTES DE IVA') returning_values (icoinc);
SELECT F.PREF_PRE, FACT_NUMERO, FACT_FECHA, FACT_VENCE, F.BODE_COD, BODE_NOM, F.TERC_NIT, FACT_NOMCLIENTE, F.VEND_COD, VEND_NOMBRE, F.PTVT_ID, PTVT_NOM,
    AUTO_NUMERO, FACT_DESPACHO, FACT_TRANSP, FACT_COTIZACI, FACT_PEDIDO, FACT_REMISION, FACT_COMIPORC, FACT_COMIMONTO, FACT_IVAINC, 
    FACT_DTOPOR, FACT_DTOMONTO, FACT_ADICIONAL, FACT_IVAMONTO, FACT_RTFTEPOR, FACT_RTFTEMONTO, FACT_RTIVAPOR, FACT_RTIVAMONTO, FACT_RTICAPOR, FACT_RTICAMONTO, FACT_EXTRA, FACT_DTOFPOR, FACT_DTOFMONTO, FACT_DTOFFECHA, FACT_TOTAL,
    TERC_DIR, TERC_CIU, TERC_TEL, TERC_CONTACTO, TERC_FAX, TERC_DV, FACT_DTOIT1, FACT_DTOIT2, FACT_DTOIT3,
    FACT_OBS, VEHI_COD, /*FACT_NROCOPIA,*/ FACT_RECIBIDO, FACT_SUCURSAL, FACT_DETCLI, FACT_DETCLINOM, TERC_NOM
    FROM FACTURAS F, BODEGA B, VENDEDORES V, PUNTO_VENTA P, TERCEROS T
    WHERE F.BODE_COD = B.BODE_COD AND F.VEND_COD = V.VEND_COD AND F.PTVT_ID = P.PTVT_ID AND F.TERC_NIT = T.TERC_NIT AND F.FACT_ID = :ID
    into :PREF, :NUMERO, :FECHA, :VENCE, :CODBODEGA, :NOMBODEGA, :NIT, :NOMTERCERO, :VENDEDOR, :NOMVENDEDOR, :PUNTOVTA, :NOMPUNTOVTA,
    :AUTORIZACION, :DESPACHO, :TRANSPORTADOR, :COTIZACION, :PEDIDO, :REMISION, :COMIPORC, :COMIMONTO, :IMPTOS,
    :DTOPORC, :DTOMONTO, :ADICIONAL, :IVAMONTO, :RTEFTEPORC, :RTEFTEMONTO, :RTEIVAPORC, :RTEIVAMONTO, :RTEICAPORC, :RTEICAMONTO, :EXTRA, :DTOFPORC, :DTOFMONTO, :FECHADTO, :TOTALFAC,
    :DIRECCION, :CIUDAD, :TELEFONO, :CONTACTO, :FAX, :DV, :dtoit1m, :dtoit2m, :dtoit3m,
    :OBS, :VEHICULO,/* :NROCOPIA,*/ :RECIBIDO, :SUCUR, :paciente, :nompaciente, :nomcliente;

/* ACUMULE LOS PUNTOS, SE HACE ACA POR SER POSTERIOR AL DETALLE */
EXECUTE PROCEDURE acumula_puntos_cliente (31, :id, :nit, :fecha) returning_values (:PUNTOS);
EXECUTE PROCEDURE consulta_puntos_cliente (:id, :nit, :fecha) returning_values (:puntos, :puntosacum, :puntosvenc, :fecptos);

SELECT CLIE_COD, C.ZONA_COD, ZONA_NOM
    FROM CLIENTES C, ZONAS Z
    WHERE TERC_NIT = :NIT AND C.ZONA_COD = Z.ZONA_COD
    INTO :CODIGOCL, :ZONACOD, :ZONANOM;
SELECT CLSU_DIR, CLSU_CIUDAD, CLSU_TEL FROM CLIENTE_SUCURSALES WHERE TERC_NIT = :NIT AND CLCU_COD = :SUCUR
    INTO :DIRECCION, :CIUDAD, :TELEFONO;
DIASVENCE = VENCE - FECHA;
if (DIASVENCE > 0) then
    CONTCRED = 'CREDITO ' || CAST(DIASVENCE AS VARCHAR(3)) || ' DIAS';
ELSE
    CONTCRED = 'CONTADO';
SUBTOTAL = TOTALFAC - EXTRA - IVAMONTO - ADICIONAL + DTOMONTO;
TOTALPAGAR = TOTALFAC - RTEFTEMONTO - RTEIVAMONTO - RTEICAMONTO;
if (RECIBIDO <> 0) then
    CAMBIO = RECIBIDO - totalpagar;
ELSE
    CAMBIO = 0;
SUMAEX = 0;
SUMA1 = 0;
SUMA2 = 0;
SUMA3 = 0;
IVA1 = 0;
IVA2 = 0;
IVA3 = 0;
TOTCONSUMO = 0;
MONTOPAGO1 = 0;
SELECT MAX(AUDI_HORA) FROM AUDITORIA WHERE TIDO_COD = 31 AND AUDI_IDDOC = :ID AND AUDI_OPER = 'I' INTO :HORA;
/* AHORA LAS FORMAS DE PAGO, BUSQUE EL ABONO DE HOY A LA FACTURA */
ITEMFP = 1;
MONTOPAGO1 = 0;
MONTOPAGO2 = 0;
MONTOPAGO3 = 0;
FOR SELECT FOPA_NOM, RCPA_MONTO FROM RECIBOS_CAJA_PAGO P, FORMAS_PAGO F, RECIBOS_CAJA R, RECIBOS_CAJA_DETALLE D
    WHERE R.RECA_ID = P.RECA_ID AND R.RECA_ID = D.RECA_ID AND P.FOPA_ID = F.FOPA_ID AND RECA_FECHA = :FECHA AND RCDE_TIPODOC = 31 AND RCDE_IDDOC = :ID
    INTO :formap, :MONTOP
    DO
    BEGIN
    if (ITEMFP = 1) then
        BEGIN
        FORMAPAGO1 = FORMAP;
        MONTOPAGO1 = MONTOP;
        END
    if (ITEMFP = 2) then
        BEGIN
        FORMAPAGO2 = FORMAP;
        MONTOPAGO2 = MONTOP;
        END
    if (ITEMFP = 3) then
        BEGIN
        FORMAPAGO3 = FORMAP;
        MONTOPAGO3 = MONTOP;
        END
    ITEMFP = ITEMFP + 1;
    END
EXECUTE PROCEDURE lee_configuracion ('FACTURACION','DOCUMENTOS','ORDENAR ITEMS POR CODIGO DE ARTICULO') returning_values (:ORDENCOD);
EXECUTE PROCEDURE lee_configuracion ('FACTURACION','POS', 'IMPRIMIR DEVOLUCIONES DE ARTICULOS NEGATIVOS') returning_values (:imprdev);
totcajas = 0;
if (ORDENCOD = 'SI') then
    BEGIN
    FOR SELECT FADE_ITEM, D.ARTI_COD, FADE_CODBAR, SUBSTR(FADE_DESC,1,60), ARTI_DESCORTA, FADE_CANT, FADE_UNIDAD, FADE_FACTOR, BODE_COD, FADE_LOTE, LIPR_COD, FADE_PRUNIT, FADE_DTOPORC, FADE_DTOMONTO, FADE_IVAPORC, FADE_IVAMONTO, FADE_CONSUMO, FADE_TOTAL, FADE_REFERENCIA,
        GRUP_COD, SUBG_COD, MARC_COD, ARTI_PESO, ARTI_ANCHO, ARTI_ALTO, ARTI_LARGO, TAIV_COD, FADE_DEVUELTO, FADE_OBS, FADE_DTO1, FADE_DTO2, FADE_DTO3, FADE_DTOM1, FADE_DTOM2, FADE_DTOM3, FADE_CAJAS
        FROM FACTURAS_DETALLE D, ARTICULO A
        WHERE D.ARTI_COD = A.ARTI_COD AND D.FACT_ID = :ID
        ORDER BY D.ARTI_COD
        INTO :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :DESCORTA, :CANT, :UNIDAD, :FACTOR, :BODITEM, :LOTE, :LISTAPR, :PRUNIT, :DTOITPORC, :DTOITMONTO, :IVAPORC, :IVAITMONTO, :CONSUMO, :TOTAL, :refitem,
        :GRUPO, :SUBGRUPO, :MARCA, :PESO, :ANCHO, :ALTO, :LARGO, :TARIFA, :devuelto, :obsitem, :dtoit1, :dtoit2, :dtoit3, :dtoitm1, :dtoitm2, :dtoitm3, :cajas
        DO
          BEGIN
          if (ARTICULO = CODBAR) then
            SELECT FIRST 1 COBA_COD FROM barras_articulo WHERE ARTI_COD = :articulo INTO :CODBAR;
          if (IMPRDEV <> 'SI') then
            BEGIN
            if ((CANT >= 0) AND (DEVUELTO = 0)) then
                IMPR = 'S';
            ELSE
                IMPR = 'N'; /* ES DEVOLUCION */
            END
          ELSE
            IMPR = 'S';
          if (IMPR = 'S') then
            BEGIN
            prneto = PRUNIT - DTOITMONTO - dtoitm1 - dtoitm2 - dtoitm3;
            if (IMPTOS = 'S') then
                if (cant <> 0) then
                    prnetosiniva = PRUNIT - DTOITMONTO - ((IVAITMONTO+CONSUMO) / CANT) - dtoitm1 - dtoitm2 - dtoitm3;
                else
                    prnetosiniva = PRUNIT - DTOITMONTO - dtoitm1 - dtoitm2 - dtoitm3;
            ELSE
                prnetosiniva = PRUNIT - DTOITMONTO - dtoit1m - dtoit2m - dtoit3m;
            if (ICOINC = 'SI') then
                SUBTOTIT = TOTAL - IVAITMONTO;
            else
                SUBTOTIT = TOTAL - IVAITMONTO - CONSUMO;
            TOTCONSUMO = TOTCONSUMO + CONSUMO;
            SELECT LOTE_VENCE FROM LOTES WHERE LOTE_NRO = :lote AND ARTI_COD = :ARTICULO AND BODE_COD = :boditem INTO :vlote;
            if ((REFITEM <> '.t') or (REFITEM IS NULL)) then
                BEGIN
                /* NO SUME LOS ENSAMBLES */
                if (IVAPORC = 0) then
                    SUMAEX = SUMAEX + TOTAL;
                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;
                END
            if (ANCHO IS NULL) then
                ANCHO = 0;
            if (ALTO IS NULL) then
                ALTO = 0;
            if (LARGO IS NULL) then
                LARGO = 0;
            if (PESO IS NULL) then
                PESO = 0;
            PESO = PESO * CANT;
            totcajas = totcajas + cajas;
            if (substr(ARTICULO,1,2) = '.t') then
                BEGIN
                REFITEM = '';
                TOTAL = 0;
                SUBTOTIT = 0;
                END
            SELECT STAND_COD FROM STANDS WHERE ARTI_COD = :ARTICULO AND STAND_BODEGA = :boditem INTO :stand;
            SUSPEND;
            END
          END
    END
ELSE
    BEGIN
    FOR SELECT FADE_ITEM, D.ARTI_COD, FADE_CODBAR, SUBSTR(FADE_DESC,1,60), ARTI_DESCORTA, FADE_CANT, FADE_UNIDAD, FADE_FACTOR, BODE_COD, FADE_LOTE, LIPR_COD, FADE_PRUNIT, FADE_DTOPORC, FADE_DTOMONTO, FADE_IVAPORC, FADE_IVAMONTO, FADE_CONSUMO, FADE_TOTAL, FADE_REFERENCIA,
        GRUP_COD, SUBG_COD, MARC_COD, ARTI_PESO, ARTI_ANCHO, ARTI_ALTO, ARTI_LARGO, TAIV_COD, FADE_DEVUELTO, FADE_OBS, FADE_DTO1, FADE_DTO2, FADE_DTO3, FADE_DTOM1, FADE_DTOM2, FADE_DTOM3, FADE_CAJAS
        FROM FACTURAS_DETALLE D, ARTICULO A
        WHERE D.ARTI_COD = A.ARTI_COD AND D.FACT_ID = :ID
        ORDER BY FADE_ITEM
        INTO :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :DESCORTA, :CANT, :UNIDAD, :FACTOR, :BODITEM, :LOTE, :LISTAPR, :PRUNIT, :DTOITPORC, :DTOITMONTO, :IVAPORC, :IVAITMONTO, :CONSUMO, :TOTAL, :refitem,
        :GRUPO, :SUBGRUPO, :MARCA, :PESO, :ANCHO, :ALTO, :LARGO, :TARIFA, :devuelto, :obsitem, :dtoit1, :dtoit2, :dtoit3, :dtoitm1, :dtoitm2, :dtoitm3, :cajas
        DO
          BEGIN
          if (IMPRDEV <> 'SI') then
            BEGIN
            if ((CANT >= 0) AND (DEVUELTO = 0)) then
                IMPR = 'S';
            ELSE
                IMPR = 'N'; /* ES DEVOLUCION */
            END
          ELSE
            IMPR = 'S';
          if (IMPR = 'S') then
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :GRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :MARCA INTO NOMMARCA;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :SUBGRUPO AND GRUP_COD = :GRUPO INTO :NOMSUBG;
            prneto = PRUNIT - DTOITMONTO - dtoitm1 - dtoitm2 - dtoitm3;
            if (IMPTOS = 'S') then
                if (cant <> 0) then
                    prnetosiniva = PRUNIT - DTOITMONTO - ((IVAITMONTO+CONSUMO) / CANT) - dtoit1m - dtoit2m - dtoit3m;
                else
                    prnetosiniva = PRUNIT - DTOITMONTO - dtoitm1 - dtoitm2 - dtoitm3;
            ELSE
                prnetosiniva = PRUNIT - DTOITMONTO - dtoitm1 - dtoitm2 - dtoitm3;
            if (ICOINC = 'SI') then
                SUBTOTIT = TOTAL - IVAITMONTO;
            else
                SUBTOTIT = TOTAL - IVAITMONTO - CONSUMO;
            TOTCONSUMO = TOTCONSUMO + CONSUMO;
            SELECT LOTE_VENCE FROM LOTES WHERE LOTE_NRO = :lote AND ARTI_COD = :ARTICULO AND BODE_COD = :boditem INTO :vlote;
            if ((REFITEM <> '.t') or (REFITEM IS NULL)) then
                BEGIN
                /* NO SUME LOS ENSAMBLES */
                if (IVAPORC = 0) then
                    SUMAEX = SUMAEX + TOTAL;
                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;
                END
            if (ANCHO IS NULL) then
                ANCHO = 0;
            if (ALTO IS NULL) then
                ALTO = 0;
            if (LARGO IS NULL) then
                LARGO = 0;
            if (PESO IS NULL) then
                PESO = 0;
            PESO = PESO * CANT;
            totcajas = totcajas + cajas;
            if (substr(ARTICULO,1,2) = '.t') then
                BEGIN
                REFITEM = '';
                TOTAL = 0;
                SUBTOTIT = 0;
                END
            SELECT STAND_COD FROM STANDS WHERE ARTI_COD = :ARTICULO AND STAND_BODEGA = :boditem INTO :stand;
            SUSPEND;
            END
          END
    END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER PROCEDURE IMPR_PEDIDO(
    ID INTEGER)
RETURNS (
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    VALIDEZ INTEGER,
    NIT VARCHAR(20),
    NOMTERCERO VARCHAR(60),
    VENDEDOR INTEGER,
    NOMVENDEDOR VARCHAR(60),
    PUNTOVTA INTEGER,
    NOMPUNTOVTA VARCHAR(30),
    COTIZACION VARCHAR(30),
    SUBTOTAL NUMERIC(18,2),
    DTOPORC NUMERIC(9,2),
    DTOMONTO NUMERIC(18,2),
    ADICIONAL NUMERIC(18,2),
    IVAMONTO NUMERIC(18,2),
    EXTRA NUMERIC(18,2),
    TOTALFAC NUMERIC(18,2),
    OBS BLOB SUB_TYPE 1 SEGMENT SIZE 80,
    ITEM INTEGER,
    ARTICULO VARCHAR(15),
    CODBAR VARCHAR(15),
    ARTIDES VARCHAR(60),
    BODEGA VARCHAR(2),
    CANT NUMERIC(18,4),
    UNIDAD VARCHAR(8),
    LISTAPR INTEGER,
    REFITEM VARCHAR(60),
    PRUNIT NUMERIC(18,2),
    DTOITPORC NUMERIC(9,2),
    DTOITMONTO NUMERIC(18,2),
    PRNETO NUMERIC(18,2),
    PRNETOSINIVA NUMERIC(18,2),
    DTOIT1 NUMERIC(9,2),
    DTOIT2 NUMERIC(9,2),
    DTOIT3 NUMERIC(9,2),
    IVAPORC NUMERIC(9,2),
    IVAITMONTO NUMERIC(18,2),
    CONSUMO NUMERIC(18,2),
    SUBTOTIT NUMERIC(18,2),
    TOTAL NUMERIC(18,2),
    CODIGOCL VARCHAR(20),
    ZONACOD VARCHAR(2),
    ZONANOM VARCHAR(60),
    DV CHAR(1),
    DIRECCION VARCHAR(60),
    CIUDAD VARCHAR(40),
    TELEFONO VARCHAR(40),
    CONTACTO VARCHAR(60),
    FAX VARCHAR(25),
    GRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    SUBGRUPO VARCHAR(3),
    NOMSUBG VARCHAR(30),
    MARCA VARCHAR(3),
    NOMMARCA VARCHAR(30),
    PESO NUMERIC(9,4),
    ANCHO NUMERIC(18,4),
    ALTO NUMERIC(18,4),
    LARGO NUMERIC(18,4),
    SUMA1 NUMERIC(18,2),
    SUMA2 NUMERIC(18,2),
    SUMA3 NUMERIC(18,2),
    IVA1 NUMERIC(18,2),
    IVA2 NUMERIC(18,2),
    IVA3 NUMERIC(18,2),
    SUMAEX NUMERIC(18,2),
    SUMAGR NUMERIC(18,2),
    DTOIT1M NUMERIC(18,2),
    DTOIT2M NUMERIC(18,2),
    DTOIT3M NUMERIC(18,2),
    OBSITEM BLOB SUB_TYPE 1 SEGMENT SIZE 80)
AS
DECLARE VARIABLE IMPTOS CHAR(1);
DECLARE VARIABLE TARIFA INTEGER;
declare variable ORDENCOD CHAR(2);
declare variable SUCUR VARCHAR(10);
declare variable ICOINC CHAR(2);
declare variable DTOITM1 NUMERIC(18,2);
declare variable DTOITM2 NUMERIC(18,2);
declare variable DTOITM3 NUMERIC(18,2);
BEGIN
execute procedure lee_configuracion('FACTURACION', 'ARTICULOS', 'IMPOCONSUMO INCLUIDO EN EL PRECIO BASE DE VENTA ANTES DE IVA') returning_values (icoinc);
SELECT F.PREF_PRE, PEDI_NUMERO, PEDI_FECHA, PEDI_VALIDEZ, F.TERC_NIT, PEDI_NOMTERC, F.VEND_COD, VEND_NOMBRE, F.PTVT_ID, PTVT_NOM, PEDI_COTIZACI,
    PEDI_IVAINC, PEDI_DTOPOR, PEDI_DTOMONTO, PEDI_ADICIONAL, PEDI_IVAMONTO, PEDI_EXTRA, PEDI_TOTAL,
    TERC_CONTACTO, TERC_FAX, TERC_DV, PEDI_OBS, PEDI_SUCURSAL, PEDI_DTOIT1, PEDI_DTOIT2, PEDI_DTOIT3
    FROM PEDIDOS F, VENDEDORES V, PUNTO_VENTA P, TERCEROS T
    WHERE F.VEND_COD = V.VEND_COD AND F.PTVT_ID = P.PTVT_ID AND F.TERC_NIT = T.TERC_NIT AND F.PEDI_ID = :ID
    into :PREF, :NUMERO, :FECHA, :VALIDEZ, :NIT, :NOMTERCERO, :VENDEDOR, :NOMVENDEDOR, :PUNTOVTA, :NOMPUNTOVTA, :COTIZACION,
    :IMPTOS, :DTOPORC, :DTOMONTO, :ADICIONAL, :IVAMONTO, :EXTRA, :TOTALFAC,
    :CONTACTO, :FAX, :DV, :OBS, :SUCUR, :dtoit1m, :dtoit2m, :dtoit3m;
SUBTOTAL = TOTALFAC - EXTRA - IVAMONTO - ADICIONAL + DTOMONTO;

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

SET TERM ; ^


/* 20090122C COMISIONES COBRO POR GRUPO O PRECIO POR ARTICULO */

INSERT INTO CONFIGURACION (CONF_MODULO, CONF_CATEGORIA, CONF_PROPIEDAD, CONF_VALOR, CONF_POSIBLES, CONF_AYUDA) VALUES ('CARTERA', 'COMISIONES', 'COMISION POR COBRO POR ARTICULO', 'NO', 'NO,GRUPO,PRECIO', 'NO: La comisión se liquida con el porcentaje asignado al cobrador. GRUPO: La comisión se liquida con el porcentaje asignada al grupo de mercancía del articulo. PRECIO: La comisión se liquida con el porcentaje de comisión del precio del artículo');
commit work;


SET TERM ^ ;

CREATE OR ALTER PROCEDURE COMISIONES_COBRO(
    DESDE INTEGER,
    HASTA INTEGER,
    FECINI DATE,
    FECFIN DATE,
    DETALLE CHAR(1))
RETURNS (
    CODVEND INTEGER,
    NOMVEND VARCHAR(60),
    NIT VARCHAR(20),
    CLIENTE VARCHAR(60),
    NOMTIPO VARCHAR(8),
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(6),
    FECDOC DATE,
    PREFREC VARCHAR(4),
    NUMREC VARCHAR(6),
    FECREC DATE,
    DIAS INTEGER,
    ABONO NUMERIC(18,2),
    BASE NUMERIC(18,2),
    COMIMONTO NUMERIC(18,2),
    COMIPORC NUMERIC(9,2),
    ARTICULO VARCHAR(20),
    CODGRP VARCHAR(2),
    CANT NUMERIC(18,4),
    DTOFIN NUMERIC(18,2),
    VENCE DATE,
    RTFTE NUMERIC(18,2),
    RTIVA NUMERIC(18,2),
    RTICA NUMERIC(18,2))
AS
DECLARE VARIABLE TIPO INTEGER;
DECLARE VARIABLE ID INTEGER;
DECLARE VARIABLE IVAMONTO NUMERIC(18,2);
DECLARE VARIABLE TOTAL NUMERIC(18,2);
DECLARE VARIABLE SITOT CHAR(2);
DECLARE VARIABLE VENTA CHAR(2);
DECLARE VARIABLE COMIV NUMERIC(18,2);
DECLARE VARIABLE PORCV NUMERIC(18,2);
DECLARE VARIABLE CONSUMO NUMERIC(18,2);
declare variable ALFINAL CHAR(2);
declare variable SALDO NUMERIC(18,2);
declare variable COMISION VARCHAR(10);
declare variable porcaux NUMERIC(9,2);
declare variable BASEAUX DOUBLE PRECISION;
declare variable SUCURSAL VARCHAR(20);
declare variable COMIART VARCHAR(6);
declare variable LISTA INTEGER;
declare variable LISTAP INTEGER;
DECLARE VARIABLE IDF INTEGER;
BEGIN
EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION', 'VENDEDORES', 'COMISIONES EN VENTA INCLUYENDO IMPUESTOS') returning_values (:SITOT);
EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA','COMISIONES','COMISION POR COBRO PAGADERA SOLO EN EL COBRO TOTAL') returning_values (:ALFINAL);
execute procedure lee_configuracion('CARTERA','COMISIONES','COMISION POR COBRO COMO PORCENTAJE DE LA COMISION VENTA') returning_values (:venta);
EXECUTE PROCEDURE lee_configuracion('CARTERA', 'COMISIONES', 'LIQUIDAR COMISION COBRO CON COBRADOR DEL DOCUMENTO O DEL RECIBO') returning_values (:COMISION);
EXECUTE PROCEDURE lee_configuracion ('FACTURACION','FACTURAS', 'CODIGO DE LA LISTA DE PRECIOS A MOSTRAR EN ARTICULOS') returning_values (:LISTAP);
EXECUTE PROCEDURE lee_configuracion('CARTERA', 'COMISIONES', 'COMISION POR COBRO POR ARTICULO') returning_values (:comiart);
FOR SELECT RCDE_TIPODOC, RCDE_IDDOC, RCDE_PREFIJO, RCDE_NUMERO, R.TERC_NIT, TERC_NOM, RECA_FECHA, (RCDE_ABONO+RCDE_RTFTE+RCDE_RTIVA+RCDE_RTICA), PREF_PRE, RECA_NUMERO, COBR_COD, RCDE_DTOF, RCDE_RTFTE, RCDE_RTIVA, RCDE_RTICA
    FROM RECIBOS_CAJA R, RECIBOS_CAJA_DETALLE RD, TERCEROS T
    WHERE R.RECA_ID = RD.RECA_ID AND RECA_FECHA >= :FECINI AND RECA_FECHA <= :FECFIN AND R.TERC_NIT = T.TERC_NIT AND RECA_ANULADO = 'N'
    ORDER BY TERC_NIT, RECA_FECHA
    INTO :TIPO, :ID, :PREFIJO, :NUMERO, :NIT, :CLIENTE, :FECREC, :ABONO, :PREFREC, :NUMREC, :codvend, :DTOFIN, :rtfte, :RTIVA, :RTICA
    DO
    BEGIN
    SELECT TIDO_NOMCORTO FROM TIPO_DOCUMENTO WHERE TIDO_COD = :TIPO INTO :NOMTIPO;
    if (COMISION = 'DOCUMENTO') then
        SELECT MVCL_FECHA, COBR_COD, MVCL_VENCE FROM MOVIMIENTO_CLIENTES WHERE MVCL_TIPOREF = :TIPO AND MVCL_IDREF = :ID
            INTO :FECDOC, :codvend, :VENCE;
    else
        SELECT MVCL_FECHA, MVCL_VENCE FROM MOVIMIENTO_CLIENTES WHERE MVCL_TIPOREF = :TIPO AND MVCL_IDREF = :ID
            INTO :FECDOC, :VENCE;
    if (FECDOC IS NOT NULL) then
        DIAS = FECREC - FECDOC;
    ELSE
        DIAS = 999;
    if ((codvend >= :DESDE) AND (codvend <= :hasta)) then
        BEGIN
        /* TRAIGA EL PORCENTAJE DE ACUERDO A LOS DIAS */
        COMIPORC = 0;
        SELECT CMCB_PORC FROM COMISION_COBRO WHERE CMCB_DIASINI <= :dias AND CMCB_DIASFIN >= :DIAS AND COBR_COD = :CODVEND
            INTO :COMIPORC;
        if (COMIPORC IS NULL) THEN
            COMIPORC = 0;
        if (VENTA = 'NO') then
            BEGIN
            if (TIPO = 31) then
                BEGIN
                if (DETALLE = 'N') then
                    SELECT MAX(FACT_TOTAL), MAX(FACT_IVAMONTO), SUM(FADE_CONSUMO) FROM FACTURAS F, FACTURAS_DETALLE D
                        WHERE F.FACT_ID = D.FACT_ID AND F.FACT_ID = :ID INTO :TOTAL, :IVAMONTO, :CONSUMO;
                ELSE
                    FOR SELECT D.ARTI_COD, FADE_CANT, FADE_TOTAL, FADE_IVAMONTO, FADE_CONSUMO, GRUP_COD, LIPR_COD
                        FROM FACTURAS F, FACTURAS_DETALLE D, ARTICULO A
                        WHERE F.FACT_ID = D.FACT_ID AND D.arti_cod = A.arti_cod AND F.FACT_ID = :ID and substring(a.arti_cod from 1 FOR 2) <> '.t'
                        INTO :ARTICULO, :CANT, :TOTAL, :IVAMONTO, :CONSUMO, :CODGRP, :lista
                        DO
                        BEGIN
                        if (comiart = 'GRUPO') then
                            SELECT GRUP_COMIPOR FROM GRUPO WHERE GRUP_COD = :codgrp INTO :comiporc;
                        if (comiart = 'PRECIO') then
                            SELECT PRAR_COMI FROM precios_articulo WHERE ARTI_COD = :articulo AND LIPR_COD = :LISTA INTO :comiporc;

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

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

SET TERM ; ^


/* 20090123 */
CREATE TABLE ASEGURADORA (
    ASEG_NIT     T_NIT NOT NULL,
    ASEG_NOMBRE  T_CONCEPTO
);

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

drop table vehiculos;

CREATE TABLE VEHICULOS (
    VEHI_COD           VARCHAR(8) NOT NULL,
    TERC_NIT           T_NIT NOT NULL,
    VEHI_NUMERO        VARCHAR(15),
    VEHI_FECSOAT       DATE,
    VEHI_TIPO          INTEGER,
    VEHI_ACTIVO        T_BOOLEANO,
    VEHI_CAPACIDAD     T_ID,
    VEHI_LINEA         VARCHAR(3),
    VEHI_MARCA         VARCHAR(3),
    VEHI_MODELO        CHAR(4),
    VEHI_REGISTRONC    T_CTA_CONTABLE,
    VEHI_PESOV         T_MONTO,
    VEHI_SOATASEG      T_NIT,
    VEHI_SOAT          T_CTA_CONTABLE,
    VEHI_CONDUCTOR     T_NIT,
    VEHI_TENEDOR       T_NIT,
    VEHI_REPOTENCIADO  VARCHAR(4),
    VEHI_CARROC        T_ID,
    VEHI_COLOR         T_CONCEPTO,
    VEHI_SEGCONTR      DATE,
    VEHI_SEGEXTRA      DATE,
    VEHI_SERIE         VARCHAR(20)
);

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


/******************************************************************************/
/****                             Primary Keys                             ****/
/******************************************************************************/

ALTER TABLE ASEGURADORA ADD CONSTRAINT PK_ASEGURADORA PRIMARY KEY (ASEG_NIT);
ALTER TABLE VEHICULOS ADD CONSTRAINT PK_VEHICULOS PRIMARY KEY (VEHI_COD);


/******************************************************************************/
/****                             Foreign Keys                             ****/
/******************************************************************************/

ALTER TABLE VEHICULOS ADD CONSTRAINT FK_VEHICULOS_TERCERO FOREIGN KEY (TERC_NIT) REFERENCES TERCEROS (TERC_NIT);


CREATE TABLE RUTERO (
    RUTE_ID T_ID NOT NULL,
    PREF_PRE VARCHAR(4),
    RUTE_NUMERO T_NUMDOC,
    RUTE_FECHA DATE,
    RUTE_RUTA T_ID,
    RUTE_VEHICULO T_UNIDAD,
    RUTE_CONDUCTOR T_NIT,
    RUTE_NOMCOND T_CONCEPTO,
    RUTE_ASEGURA T_NIT,
    RUTE_HORA TIME,
    RUTE_AUXILIAR1 T_NIT,
    RUTE_AUXILIAR2 T_NIT,
    RUTE_ANULADO T_BOOLEANO,
    RUTE_TRANSMIT T_BOOLEANO);
alter table RUTERO
add constraint PK_RUTERO
primary key (RUTE_ID);

CREATE TABLE RUTERO_DETALLE (
    RUTE_ID T_ID NOT NULL,
    RUTD_ITEM T_ID NOT NULL,
    RUTD_FACTID T_ID NOT NULL,
    RUTD_PREF VARCHAR(4),
    RUTD_NUMERO T_NUMDOC,
    RUTD_NIT T_NIT,
    RUTD_NOMCLI T_CONCEPTO,
    RUTD_VALOR T_MONTO,
    RUTD_CAJAS T_CANTIDAD,
    RUTD_FECENT DATE,
    RUTD_HORAENT TIME,
    RUTD_DEVCAJAS T_CANTIDAD,
    RUTD_OBS BLOB SUB_TYPE 1 SEGMENT SIZE 80,
    RUTD_ANULADO T_BOOLEANO,
    RUTD_TRANSMIT T_BOOLEANO);
alter table RUTERO_DETALLE
add constraint PK_RUTERO_DETALLE
primary key (RUTE_ID,RUTD_ITEM);

CREATE SEQUENCE ID_RUTERO;

SET TERM ^ ;

CREATE OR ALTER PROCEDURE CAMBIE_ID_RUTERO
RETURNS (
    ID INTEGER)
AS
declare variable NUMROWS INTEGER;
BEGIN
/* TRAE EL ID NUEVO Y LO ACTUALIZA */
NUMROWS = 1;
while (NUMROWS > 0) DO
    BEGIN
    ID = GEN_ID(id_rutero, 1);
    /* VERIFIQUE SI YA EXISTE */
    SELECT COUNT(*) FROM rutero WHERE RUTE_ID = :ID INTO :NUMROWS;
    END
SUSPEND;
END
^

SET TERM ; ^

grant select, delete, insert, update on rutero to public;
grant select, delete, insert, update on rutero_detalle to public;
grant execute on procedure CAMBIE_ID_RUTERO to public;


INSERT INTO TIPO_DOCUMENTO (TIDO_COD, TIDO_NOMCORTO, TIDO_NOMLARGO, TIDO_MODULO, TIDO_INVE, TIDO_CART, TIDO_CXP, TIDO_CAJA, TIDO_BCOS) VALUES (37, 'RUTERO', 'RUTERO ENTREGAS', 'VENTAS', 'N', 'N', 'N', 'N', 'N');
COMMIT WORK;

ALTER TABLE TERCEROS ADD TERC_CONDUCTOR T_BOOLEANO;

SET TERM ^ ;

CREATE OR ALTER TRIGGER TERCEROS_BI FOR TERCEROS
ACTIVE BEFORE INSERT POSITION 0
as
begin
if (NEW.terc_tipoid IS NULL) then
    NEW.terc_tipoid = 'J';
if (NEW.terc_clie IS NULL) then
    NEW.terc_clie = 'N';
if (NEW.terc_prov IS NULL) then
    NEW.terc_prov = 'N';
if (NEW.terc_empl IS NULL) then
    NEW.terc_empl = 'N';
if (NEW.terc_estado IS NULL) then
    NEW.terc_estado = 'S';
if (NEW.terc_admini IS NULL) then
    NEW.terc_admini = 'N';
if (NEW.terc_conductor IS NULL) then
    NEW.terc_conductor = 'N';
SELECT SUBSTR(CIUD_NOM,1,40) FROM CIUDADES WHERE CIUD_COD = NEW.ciud_cod INTO NEW.terc_ciu;
end
^

SET TERM ; ^

update terceros set terc_conductor = 'N';
commit work;

ALTER TABLE TERCEROS ADD TERC_LICVEN DATE;
ALTER TABLE TERCEROS ADD TERC_CATEGORIA VARCHAR(20);


INSERT INTO CONFIGURACION (CONF_MODULO, CONF_CATEGORIA, CONF_PROPIEDAD, CONF_VALOR, CONF_POSIBLES, CONF_AYUDA) VALUES ('FACTURACION', 'RUTERO', 'NUMERO DE DIAS PARA LLAMAR FACTURAS AL RUTERO', '2', '2,3,5,7,10,15,30,90,360', 'Indique el máximo número de días a mirar para sugerir las facturas a traer al rutero');
commit work;

CREATE INDEX RUTERO_DETALLE_IDX1
ON RUTERO_DETALLE (RUTD_FACTID);

SET TERM ^ ;

create procedure FACTURAS_RUTERO(
    FECINI DATE,
    FECFIN DATE)
returns (
    ID INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    CLIENTE VARCHAR(20),
    SUCURSAL VARCHAR(10),
    NOMBRE VARCHAR(60),
    DIR VARCHAR(60),
    VEND INTEGER,
    NOMVEND VARCHAR(60),
    ZONA VARCHAR(2),
    NOMZONA VARCHAR(60),
    MONTO NUMERIC(18,2),
    CAJAS NUMERIC(18,4))
as
begin
FOR SELECT FACT_ID, PREF_PRE, FACT_NUMERO, FACT_FECHA, TERC_NIT, FACT_SUCURSAL, FACT_NOMCLIENTE, VEND_COD, FACT_TOTAL
    FROM FACTURAS F WHERE FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND FACT_ANULADO = 'N' AND
    NOT EXISTS (SELECT RUTE_ID FROM RUTERO_DETALLE WHERE RUTD_FACTID = F.fact_id)
    INTO :ID, :PREF, :NUMERO, :FECHA, :CLIENTE, :SUCURSAL, :NOMBRE, :VEND, :MONTO
    DO
    BEGIN
    SELECT SUM(FADE_CAJAS) FROM FACTURAS_DETALLE WHERE FACT_ID = :ID INTO :CAJAS;
    SELECT CLSU_DIR FROM CLIENTE_SUCURSALES WHERE TERC_NIT = :cliente AND CLCU_COD = :sucursal INTO :dir;
    SELECT VEND_NOMBRE FROM vendedores WHERE VEND_COD = :vend INTO :nomvend;
    SELECT C.zona_cod, ZONA_NOM FROM ZONAS Z, CLIENTES C WHERE C.terc_nit = :cliente INTO :zona, :nomzona;
    suspend;
    END
end
^

SET TERM ; ^

grant EXECUTE on PROCEDURE FACTURAS_RUTERO to PUBLIC;

SET TERM ^ ;

CREATE OR ALTER PROCEDURE IMPR_RUTERO(
    ID INTEGER)
RETURNS (
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    NOMRUTA VARCHAR(60),
    RUTA INTEGER,
    CONDUCTOR VARCHAR(20),
    NOMCOND VARCHAR(60),
    AUXILIAR1 VARCHAR(20),
    NOMAUX1 VARCHAR(60),
    AUXILIAR2 VARCHAR(20),
    NOMAUX2 VARCHAR(60),
    VEHICULO VARCHAR(8),
    ASEGURA VARCHAR(60),
    HORASAL TIME,
    TOTALVR NUMERIC(18,2),
    TOTALCAJAS NUMERIC(18,2),
    OBS BLOB SUB_TYPE 1 SEGMENT SIZE 80,
    ITEMDOC INTEGER,
    PREFDOC VARCHAR(4),
    NUMDOC VARCHAR(6),
    NITCLIEN VARCHAR(20),
    SUCURSAL VARCHAR(10),
    NOMCLIEN VARCHAR(60),
    DIRCLIEN VARCHAR(60),
    TELCLIEN VARCHAR(40),
    VEND INTEGER,
    NOMVEND VARCHAR(60),
    ZONA VARCHAR(2),
    NOMZONA VARCHAR(60),
    MONTO NUMERIC(18,2),
    CAJAS NUMERIC(18,2))
AS
declare variable IDDOC INTEGER;
BEGIN
  SELECT PREF_PRE, RUTE_NUMERO, RUTE_FECHA, RUTE_VEHICULO, RUTE_RUTA, E.ruta_nom,
        RUTE_CONDUCTOR, RUTE_NOMCOND, RUTE_ASEGURA, RUTE_HORA, RUTE_AUXILIAR1, RUTE_AUXILIAR2
  FROM rutero R, rutas_entrega E
  WHERE R.rute_ruta = E.ruta_id AND R.rute_id = :ID
  INTO :PREFIJO, :NUMERO, :FECHA, :vehiculo, :ruta, :nomruta,
        :conductor, :nomcond, :asegura, :horasal, :auxiliar1, :auxiliar2;
  SELECT TERC_NOM FROM TERCEROS WHERE TERC_NIT = :auxiliar1 INTO :nomaux1;
  SELECT TERC_NOM FROM TERCEROS WHERE TERC_NIT = :auxiliar2 INTO :nomaux2;
  totalvr = 0;
  totalcajas = 0;
  FOR SELECT RUTD_ITEM, RUTD_FACTID, RUTD_PREF, RUTD_NUMERO, RUTD_NIT, RUTD_NOMCLI,
        RUTD_VALOR, RUTD_CAJAS, RUTD_OBS
        FROM rutero_detalle WHERE RUTE_ID = :ID ORDER BY RUTD_ITEM
        INTO :ITEMDOC, :IDDOC, :PREFDOC, :NUMDOC, :nitclien, :nomclien, :monto, :cajas, :obs
        DO
        BEGIN
        SELECT FACT_SUCURSAL, VEND_COD FROM FACTURAS WHERE FACT_ID = :iddoc INTO :sucursal, :vend;
        SELECT CLSU_DIR, CLSU_TEL, ZONA_COD FROM cliente_sucursales WHERE TERC_NIT = :nitclien AND CLCU_COD = :sucursal
            INTO :dirclien, :telclien, :zona;
        SELECT VEND_NOMBRE FROM vendedores WHERE VEND_COD = :vend INTO :nomvend;
        SELECT ZONA_NOM FROM ZONAS WHERE ZONA_COD = :zona INTO :nomzona;
        totalvr = totalvr + :MONTO;
        totalcajas = totalcajas + :cajas;
        SUSPEND;
        END
END
^

SET TERM ; ^

grant EXECUTE on PROCEDURE IMPR_RUTERO to PUBLIC;

ALTER TABLE RUTERO ADD RUTE_USUARIO T_USUARIO;

SET TERM ^ ;

create procedure RUTERO_FACTURA (
    PREF VARCHAR(4),
    NUMERO VARCHAR(6))
returns (
    ID INTEGER,
    CLIENTE VARCHAR(20),
    SUCURSAL VARCHAR(10),
    NOMBRE VARCHAR(60),
    MONTO NUMERIC(18,2),
    CAJAS NUMERIC(18,4))
as
begin
SELECT FACT_ID, TERC_NIT, FACT_SUCURSAL, FACT_NOMCLIENTE, FACT_TOTAL
    FROM FACTURAS F WHERE PREF_PRE = :pref AND FACT_NUMERO = :numero AND FACT_ANULADO = 'N' AND
    NOT EXISTS (SELECT RUTE_ID FROM RUTERO_DETALLE WHERE RUTD_FACTID = F.fact_id)
    INTO :ID, :CLIENTE, :SUCURSAL, :NOMBRE, :MONTO;
SELECT SUM(FADE_CAJAS) FROM FACTURAS_DETALLE WHERE FACT_ID = :ID INTO :CAJAS;
suspend;
end
^

SET TERM ; ^

grant EXECUTE on PROCEDURE RUTERO_FACTURA to PUBLIC;


CREATE TABLE VEHICULO_CARROCERIA (
    VHCA_ID   INTEGER NOT NULL,
    VHCA_NOM  T_CONCEPTO
);


CREATE TABLE VEHICULO_LINEA (
    VHLI_COD  VARCHAR(3) NOT NULL,
    VHLI_NOM  T_CONCEPTO
);


CREATE TABLE VEHICULO_MARCA (
    VHMA_COD  VARCHAR(3) NOT NULL,
    VHMA_NOM  T_CONCEPTO
);


/******************************************************************************/
/****                             Primary Keys                             ****/
/******************************************************************************/

ALTER TABLE VEHICULO_CARROCERIA ADD CONSTRAINT PK_VEHICULO_CARROCERIA PRIMARY KEY (VHCA_ID);
ALTER TABLE VEHICULO_LINEA ADD CONSTRAINT PK_VEHICULO_LINEA PRIMARY KEY (VHLI_COD);
ALTER TABLE VEHICULO_MARCA ADD CONSTRAINT PK_VEHICULO_MARCA PRIMARY KEY (VHMA_COD);

GRANT ALL ON TIPO_VEHICULO TO PUBLIC;
GRANT ALL ON VEHICULOS TO PUBLIC;
GRANT ALL ON VEHICULO_CARROCERIA TO PUBLIC;
GRANT ALL ON VEHICULO_LINEA TO PUBLIC;
GRANT ALL ON VEHICULO_MARCA TO PUBLIC;


SET TERM ^ ;

CREATE OR ALTER PROCEDURE FACTURAS_RUTERO(
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    ID INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    CLIENTE VARCHAR(20),
    SUCURSAL VARCHAR(10),
    NOMBRE VARCHAR(60),
    DIR VARCHAR(60),
    VEND INTEGER,
    NOMVEND VARCHAR(60),
    ZONA VARCHAR(2),
    NOMZONA VARCHAR(60),
    MONTO NUMERIC(18,2),
    CAJAS NUMERIC(18,4))
AS
begin
FOR SELECT FACT_ID, PREF_PRE, FACT_NUMERO, FACT_FECHA, TERC_NIT, FACT_SUCURSAL, FACT_NOMCLIENTE, VEND_COD, FACT_TOTAL
    FROM FACTURAS F WHERE FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND FACT_ANULADO = 'N' AND
    NOT EXISTS (SELECT RUTE_ID FROM RUTERO_DETALLE WHERE RUTD_FACTID = F.fact_id)
    INTO :ID, :PREF, :NUMERO, :FECHA, :CLIENTE, :SUCURSAL, :NOMBRE, :VEND, :MONTO
    DO
    BEGIN
    SELECT SUM(FADE_CAJAS) FROM FACTURAS_DETALLE WHERE FACT_ID = :ID INTO :CAJAS;
    SELECT CLSU_DIR FROM CLIENTE_SUCURSALES WHERE TERC_NIT = :cliente AND CLCU_COD = :sucursal INTO :dir;
    SELECT VEND_NOMBRE FROM vendedores WHERE VEND_COD = :vend INTO :nomvend;
    SELECT C.zona_cod, ZONA_NOM FROM ZONAS Z, CLIENTES C WHERE Z.zona_nom = C.zona_cod AND C.terc_nit = :cliente INTO :zona, :nomzona;
    suspend;
    END
end
^

SET TERM ; ^

alter table RUTERO_DETALLE add constraint FK_RUTERO_DETALLE_1 foreign key (RUTE_ID) references RUTERO(RUTE_ID) on delete CASCADE on update CASCADE;

/* 20090126 RETORNABA NULL SI NO HAY MOVIMIENTO ANTERIOR */

SET TERM ^ ;

CREATE OR ALTER PROCEDURE SALDO_INICIAL_TOTAL_INV(
    ARTICULO VARCHAR(15),
    FECHA DATE)
RETURNS (
    SALDO NUMERIC(18,4))
AS
BEGIN
SELECT FIRST 1 COST_SALDOC+COST_ENTC-COST_SALC
    FROM COSTOS WHERE ARTI_COD = :ARTICULO AND COST_FECHA < :FECHA
    ORDER BY COST_FECHA DESC,COST_ITEM DESC
    INTO :SALDO;
if (SALDO IS NULL) then
    SALDO = 0;
SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE EXISTENCIAS_DESDE_HASTA(
    FECHA DATE,
    ARTINI VARCHAR(20),
    ARTFIN VARCHAR(20),
    GRPINI VARCHAR(3),
    GRPFIN VARCHAR(3),
    BODINI VARCHAR(2),
    BODFIN VARCHAR(2),
    ORDEN CHAR(1),
    AGRUPA CHAR(1),
    DETALLE CHAR(1),
    RESERVA CHAR(1),
    ENPESO CHAR(1),
    SUCURSAL INTEGER)
RETURNS (
    CANT NUMERIC(18,4),
    COSTO NUMERIC(18,2),
    COSTO_LOTE NUMERIC(18,2),
    CODIGO VARCHAR(15),
    NOMBRE VARCHAR(60),
    UNIDAD VARCHAR(8),
    STAND VARCHAR(15),
    CODGRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    CODSUBG VARCHAR(3),
    NOMSUBG VARCHAR(30),
    CODMARC VARCHAR(3),
    NOMMARC VARCHAR(30),
    CODBOD VARCHAR(2),
    LOTE VARCHAR(15),
    NOMBOD VARCHAR(30),
    COSTOTOT NUMERIC(18,2),
    ULTCOSTO NUMERIC(18,2),
    FECHACOSTO DATE,
    CONSUMO NUMERIC(18,2),
    RESERVADO NUMERIC(18,4),
    ORDENADO NUMERIC(18,4),
    IVA NUMERIC(9,2),
    PESOUNIT NUMERIC(18,4),
    PESOTOTAL NUMERIC(18,4),
    CODBAR VARCHAR(20))
AS
declare variable exist char(1);
declare variable codini varchar(20);
declare variable codfin varchar(20);
declare variable desini varchar(20);
declare variable desfin varchar(20);
declare variable ordenc numeric(18,4);
declare variable pedido numeric(18,4);
declare variable ok char(1);
declare variable id integer;
declare variable item integer;
declare variable und varchar(8);
declare variable factor numeric(18,4);
declare variable cant2 numeric(18,4);
declare variable PEDAUTO CHAR(2);
BEGIN /*$$IBE$$ 
if (ORDEN = 'C') then
    BEGIN
    CODINI = ARTINI;
    CODFIN = ARTFIN;
    DESINI = '';
    DESFIN = 'zz';
    END
ELSE
    BEGIN
    DESINI = ARTINI;
    DESFIN = ARTFIN;
    CODINI = '';
    CODFIN = 'zz';
    END
EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION', 'FACTURAS', 'GENERAR PEDIDO AUTOMATICAMENTE CON LA FACTURA') returning_values (pedauto);
if (DETALLE = 'B') then
  BEGIN
  FOR SELECT ARTI_COD, ARTI_DES, ARTI_UNIDAD, ARTI_EXIST, TAIV_PORC, A.GRUP_COD, A.SUBG_COD, A.MARC_COD, BODE_COD, BODE_NOM, ARTI_CONSUMO, ARTI_PESO/1000
      FROM ARTICULO A, BODEGA B, TARIFA_IVA T
      WHERE ARTI_COD >= :CODINI AND ARTI_COD <= :CODFIN AND ARTI_DES >= :DESINI AND ARTI_DES <= :DESFIN AND ESAR_COD <> 'I' AND BODE_COD >= :BODINI AND
      BODE_COD <= :BODFIN AND ((SUCU_ID = :SUCURSAL) or (:SUCURSAL = 0)) AND A.TAIV_COD = T.TAIV_COD
      INTO :CODIGO, :NOMBRE, :UNIDAD, :EXIST, :IVA, :CODGRUPO, :CODSUBG, :CODMARC, :CODBOD, :NOMBOD, :CONSUMO, :pesounit
      DO
        BEGIN
        OK = 'N';
        if (AGRUPA = 'G') then
            BEGIN
            if ((CODGRUPO >= GRPINI) AND (CODGRUPO <= GRPFIN)) then
                OK = 'S';
            end
        ELSE
            if (AGRUPA = 'M') then
                BEGIN
                if ((CODMARC >= GRPINI) AND (CODMARC <= GRPFIN)) then
                    OK = 'S';
                END
        if (OK = 'S') then
            BEGIN
            NOMGRUPO = '';
            NOMMARC = '';
            NOMSUBG = '';
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            SELECT MAX(COBA_COD) FROM BARRAS_ARTICULO WHERE ARTI_COD = :codigo AND COBA_UNIDAD = :unidad INTO :codbar;
            if (CODBAR IS NULL) then
                CODBAR = CODIGO;
            if (EXIST <> 'N') then
                BEGIN
                SELECT STAND_COD FROM STANDS WHERE ARTI_COD = :CODIGO AND STAND_BODEGA = :CODBOD INTO :STAND;
                EXECUTE PROCEDURE SALDO_INICIAL_INVENTARIO(CODIGO, FECHA, :CODBOD) returning_values (CANT);
                EXECUTE PROCEDURE COSTO_PROMEDIO_UNIDAD(CODIGO, FECHA, UNIDAD) returning_values (COSTO);
                EXECUTE PROCEDURE ULTIMO_COSTO(CODIGO, FECHA, UNIDAD) returning_values (ULTCOSTO);
                SELECT MAX(MVAR_FECHA) FROM MOVIMIENTO_ARTICULO WHERE ARTI_COD = :CODIGO AND MVAR_ENTRADA = 'S' AND MVAR_FECHA <= :FECHA INTO :FECHACOSTO;
                COSTOTOT = :CANT * :COSTO;
                CONSUMO = CONSUMO * CANT;
                if (RESERVA = 'S') then
                    BEGIN
                    SELECT SUM(ORID_ENTREGAR)
                        FROM ORDENINVENTARIO_DETALLE OD, ordenes_inventario O
                        WHERE O.ORIN_ID = OD.ORIN_ID AND ARTI_COD = :CODIGO AND ORIN_FECHA <= :FECHA AND ORIN_FECLLEGA >= :FECHA AND ORID_ANULADO = 'N' AND OD.BODE_COD = :CODBOD
                        INTO :ORDENADO;
                    if (ORDENADO IS NULL) then
                        ORDENADO = 0;
                    ORDENC = 0;
                    FOR SELECT O.ORDC_ID, OCDE_ITEM, OCDE_CANT * OCDE_FACTOR
                        FROM ORDENES_COMPRA O, ORDENES_COMPRA_DETALLE OD
                        WHERE O.ORDC_ID = OD.ORDC_ID AND OD.ARTI_COD = :CODIGO AND (ORDC_FECHA+ORDC_VALIDEZ) >= :FECHA AND ORDC_FECHA <= :FECHA AND OCDE_ANULADO = 'N' AND OD.BODE_COD = :CODBOD
                        INTO :ID, :ITEM, :CANT2
                        do
                        BEGIN
                        EXECUTE PROCEDURE FALTANTE(23, 21, ID, ITEM) returning_values (PEDIDO, UND, FACTOR);
                        if (PEDIDO * FACTOR = CANT2) then  $$IBE$$*/ /* SI NO SE HA FACTURADO MIRE A VER SI SE REMISIONO */ /*$$IBE$$ 
                            EXECUTE PROCEDURE FALTANTE(23, 22, ID, ITEM) returning_values (PEDIDO, UND, FACTOR);
                        if (PEDIDO IS NULL) then
                            PEDIDO = 0;
                        ORDENC = ORDENC + PEDIDO * FACTOR;
                        END
                    ORDENADO = ORDENADO + ORDENC;
                    SELECT SUM(RSDE_LIBERAR)
                        FROM RESERVAS_DETALLE RD, RESERVAS R
                        WHERE R.RESE_ID = RD.RESE_ID AND ARTI_COD = :CODIGO AND RESE_FECHA <= :FECHA AND RESE_VENCE >= :FECHA AND RD.BODE_COD = :CODBOD AND RSDE_ANULADO = 'N'
                        INTO :RESERVADO;
                    if (RESERVADO IS NULL) then
                        RESERVADO = 0;
                    PEDIDO = 0;
                    FOR SELECT P.PEDI_ID, PEDE_ITEM, PEDE_CANT * PEDE_FACTOR
                        FROM PEDIDOS P, PEDIDOS_DETALLE PD
                        WHERE P.PEDI_ID = PD.PEDI_ID AND PD.ARTI_COD = :CODIGO AND (PEDI_FECHA+PEDI_VALIDEZ) >= :FECHA AND PEDI_FECHA <= :FECHA AND PEDE_ANULADO = 'N' AND BODE_COD = :CODBOD
                        INTO :ID, :ITEM, :CANT2
                        do
                        BEGIN
                        EXECUTE PROCEDURE FALTANTE(34, 31, ID, ITEM) returning_values (ORDENC, UND, FACTOR);
                        if ((ORDENC * FACTOR = CANT2) or (PEDAUTO = 'SI')) then  $$IBE$$*/ /* SI NO SE HA FACTURADO MIRE A VER SI SE REMISIONO */ /*$$IBE$$ 
                            EXECUTE PROCEDURE FALTANTE(34, 32, ID, ITEM) returning_values (ORDENC, UND, FACTOR);
                        if (ORDENC IS NULL) then
                            ORDENC = 0;
                        PEDIDO = PEDIDO + ORDENC * FACTOR;
                        END
                    RESERVADO = RESERVADO + PEDIDO;
                    END
                ELSE
                    BEGIN
                    RESERVADO = 0;
                    ORDENADO = 0;
                    END
                if (ENPESO = 'S') then
                    BEGIN
                    if (pesounit IS NULL) then
                        pesounit = 0;
                    if (PESOUNIT <> 0) then
                        BEGIN
                        pesototal = PESOUNIT * cant;
                        SUSPEND;
                        END
                    END
                ELSE
                    SUSPEND;
                END
            END
        END
  END

if (DETALLE = 'L') then
  BEGIN
  FOR SELECT A.ARTI_COD, ARTI_DES, ARTI_UNIDAD, ARTI_EXIST, TAIV_PORC, A.GRUP_COD, A.SUBG_COD, A.MARC_COD, L.lote_nro, L.lote_nro||' - '||L.lote_vence, ARTI_CONSUMO,l.bode_cod, L.lote_saldo,l.lote_costo, ARTI_PESO/1000
      FROM ARTICULO A, LOTES l, TARIFA_IVA T
      WHERE A.ARTI_COD >= '0' AND A.ARTI_COD <= 'zz' AND ARTI_DES >= '' AND ARTI_DES <= 'zz' AND ESAR_COD <> 'I' AND A.TAIV_COD = T.TAIV_COD and a.arti_cod = l.arti_cod
      INTO :CODIGO, :NOMBRE, :UNIDAD, :EXIST, :IVA, :CODGRUPO, :CODSUBG, :CODMARC, :LOTE, :NOMBOD, :CONSUMO, :codbod, :cant, :costo_lote, :pesounit
      DO
        BEGIN
        OK = 'N';
        if (AGRUPA = 'G') then
            BEGIN
            if ((CODGRUPO >= GRPINI) AND (CODGRUPO <= GRPFIN)) then
                OK = 'S';
            end
        ELSE
            if (AGRUPA = 'M') then
                BEGIN
                if ((CODMARC >= GRPINI) AND (CODMARC <= GRPFIN)) then
                    OK = 'S';
                END
        if (OK = 'S') then
            BEGIN
            NOMGRUPO = '';
            NOMMARC = '';
            NOMSUBG = '';
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            SELECT MAX(COBA_COD) FROM BARRAS_ARTICULO WHERE ARTI_COD = :codigo AND COBA_UNIDAD = :unidad INTO :codbar;
            if (CODBAR IS NULL) then
                CODBAR = CODIGO;

            if (EXIST <> 'N') then
                BEGIN
                EXECUTE PROCEDURE COSTO_PROMEDIO_UNIDAD(CODIGO, FECHA, UNIDAD) returning_values (COSTO);
                EXECUTE PROCEDURE ULTIMO_COSTO(CODIGO, FECHA, UNIDAD) returning_values (ULTCOSTO);
                SELECT MAX(MVAR_FECHA) FROM MOVIMIENTO_ARTICULO WHERE ARTI_COD = :CODIGO AND MVAR_ENTRADA = 'S' AND MVAR_FECHA <= :FECHA INTO :FECHACOSTO;
                COSTOTOT = :CANT * :COSTO;
                CONSUMO = CONSUMO * CANT;
                if (RESERVA = 'S') then
                    BEGIN
                    SELECT SUM(ORID_ENTREGAR)
                        FROM ORDENINVENTARIO_DETALLE OD, ordenes_inventario O
                        WHERE O.ORIN_ID = OD.ORIN_ID AND ARTI_COD = :CODIGO AND ORIN_FECHA <= :FECHA AND ORIN_FECLLEGA >= :FECHA AND ORID_ANULADO = 'N'
                        INTO :ORDENADO;
                    if (ORDENADO IS NULL) then
                        ORDENADO = 0;
                    ORDENC = 0;
                    FOR SELECT O.ORDC_ID, OCDE_ITEM, OCDE_CANT * OCDE_FACTOR
                        FROM ORDENES_COMPRA O, ORDENES_COMPRA_DETALLE OD
                        WHERE O.ORDC_ID = OD.ORDC_ID AND OD.ARTI_COD = :CODIGO AND (ORDC_FECHA+ORDC_VALIDEZ) >= :FECHA AND ORDC_FECHA <= :FECHA AND OCDE_ANULADO = 'N'
                        INTO :ID, :ITEM, :CANT2
                        do
                        BEGIN
                        EXECUTE PROCEDURE FALTANTE(23, 21, ID, ITEM) returning_values (PEDIDO, UND, FACTOR);
                        if (PEDIDO * FACTOR = CANT2) then  $$IBE$$*/ /* SI NO SE HA FACTURADO MIRE A VER SI SE REMISIONO */ /*$$IBE$$ 
                            EXECUTE PROCEDURE FALTANTE(23, 22, ID, ITEM) returning_values (PEDIDO, UND, FACTOR);
                        if (PEDIDO IS NULL) then
                            PEDIDO = 0;
                        ORDENC = ORDENC + PEDIDO * FACTOR;
                        END
                    ORDENADO = ORDENADO + ORDENC;
                    SELECT SUM(RSDE_LIBERAR)
                        FROM RESERVAS_DETALLE RD, RESERVAS R
                        WHERE R.RESE_ID = RD.RESE_ID AND ARTI_COD = :CODIGO AND RESE_FECHA <= :FECHA AND RESE_VENCE >= :FECHA AND RSDE_ANULADO = 'N'
                        INTO :RESERVADO;
                    if (RESERVADO IS NULL) then
                        RESERVADO = 0;
                    PEDIDO = 0;
                    FOR SELECT P.PEDI_ID, PEDE_ITEM, PEDE_CANT * PEDE_FACTOR
                        FROM PEDIDOS P, PEDIDOS_DETALLE PD
                        WHERE P.PEDI_ID = PD.PEDI_ID AND PD.ARTI_COD = :CODIGO AND (PEDI_FECHA+PEDI_VALIDEZ) >= :FECHA AND PEDI_FECHA <= :FECHA AND PEDE_ANULADO = 'N'
                        INTO :ID, :ITEM, :CANT2
                        do
                        BEGIN
                        EXECUTE PROCEDURE FALTANTE(34, 31, ID, ITEM) returning_values (ORDENC, UND, FACTOR);
                        if ((ORDENC * FACTOR = CANT2) or (PEDAUTO = 'SI')) then  $$IBE$$*/ /* SI NO SE HA FACTURADO MIRE A VER SI SE REMISIONO */ /*$$IBE$$ 
                            EXECUTE PROCEDURE FALTANTE(34, 32, ID, ITEM) returning_values (ORDENC, UND, FACTOR);
                        if (ORDENC IS NULL) then
                            ORDENC = 0;
                        PEDIDO = PEDIDO + ORDENC * FACTOR;
                        END
                    RESERVADO = RESERVADO + PEDIDO;
                    END
                ELSE
                    BEGIN
                    RESERVADO = 0;
                    ORDENADO = 0;
                    END
                if (ENPESO = 'S') then
                    BEGIN
                    if (pesounit IS NULL) then
                        pesounit = 0;
                    if (PESOUNIT <> 0) then
                        BEGIN
                        pesototal = PESOUNIT * cant;
                        SUSPEND;
                        END
                    END
                ELSE
                    SUSPEND;
                END
            END
        END
  end
if (DETALLE = 'N') then
  BEGIN
  FOR SELECT ARTI_COD, ARTI_DES, ARTI_UNIDAD, ARTI_EXIST, TAIV_PORC, A.GRUP_COD, A.SUBG_COD, A.MARC_COD, ARTI_CONSUMO, ARTI_PESO/1000
      FROM ARTICULO A, TARIFA_IVA T
      WHERE ARTI_COD >= :CODINI AND ARTI_COD <= :CODFIN AND ARTI_DES >= :DESINI AND ARTI_DES <= :DESFIN AND ESAR_COD <> 'I' AND A.TAIV_COD = T.TAIV_COD
      INTO :CODIGO, :NOMBRE, :UNIDAD, :EXIST, :IVA, :CODGRUPO, :CODSUBG, :CODMARC, :CONSUMO, :pesounit
      DO
        BEGIN
        OK = 'N';
        if (AGRUPA = 'G') then
            BEGIN
            if ((GRPINI = '0') AND (GRPFIN = 'zz')) then
                OK = 'S';
            else
                if ((CODGRUPO >= GRPINI) AND (CODGRUPO <= GRPFIN)) then
                    OK = 'S';
            end
        ELSE
            if (AGRUPA = 'M') then
                BEGIN
                if ((GRPINI = '0') AND (GRPFIN = 'zzz')) then
                    OK = 'S';
                else
                    if ((CODMARC >= GRPINI) AND (CODMARC <= GRPFIN)) then
                        OK = 'S';
                END
        if (OK = 'S') then
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            SELECT MAX(COBA_COD) FROM BARRAS_ARTICULO WHERE ARTI_COD = :codigo AND COBA_UNIDAD = :unidad INTO :codbar;
            if (CODBAR IS NULL) then
                CODBAR = CODIGO;

            if (EXIST <> 'N') then
                BEGIN
                EXECUTE PROCEDURE SALDO_INICIAL_TOTAL_INV(CODIGO, FECHA) returning_values (CANT);
                EXECUTE PROCEDURE COSTO_PROMEDIO_UNIDAD(CODIGO, FECHA, UNIDAD) returning_values (COSTO);
                EXECUTE PROCEDURE ULTIMO_COSTO(CODIGO, FECHA, UNIDAD) returning_values (ULTCOSTO);
                SELECT MAX(MVAR_FECHA) FROM MOVIMIENTO_ARTICULO WHERE ARTI_COD = :CODIGO AND MVAR_ENTRADA = 'S' AND MVAR_FECHA <= :FECHA INTO :FECHACOSTO;
                COSTOTOT = :CANT * :COSTO;
                CONSUMO = CONSUMO * CANT;
                if (RESERVA = 'S') then
                    BEGIN
                    SELECT SUM(ORID_ENTREGAR)
                        FROM ORDENINVENTARIO_DETALLE OD, ordenes_inventario O
                        WHERE O.ORIN_ID = OD.ORIN_ID AND ARTI_COD = :CODIGO AND ORIN_FECHA <= :FECHA AND ORIN_FECLLEGA >= :FECHA AND ORID_ANULADO = 'N'
                        INTO :ORDENADO;
                        if (ORDENADO IS NULL) then
                            ORDENADO = 0;
                    ORDENC = 0;
                    FOR SELECT O.ORDC_ID, OCDE_ITEM, OCDE_CANT * OCDE_FACTOR
                        FROM ORDENES_COMPRA O, ORDENES_COMPRA_DETALLE OD
                        WHERE O.ORDC_ID = OD.ORDC_ID AND OD.ARTI_COD = :CODIGO AND (ORDC_FECHA+ORDC_VALIDEZ) >= :FECHA AND ORDC_FECHA <= :FECHA AND OCDE_ANULADO = 'N'
                        INTO :ID, :ITEM, :CANT2
                        do
                        BEGIN
                        EXECUTE PROCEDURE FALTANTE(23, 21, ID, ITEM) returning_values (PEDIDO, UND, FACTOR);
                        if (PEDIDO * FACTOR = CANT2) then  $$IBE$$*/ /* SI NO SE HA FACTURADO MIRE A VER SI SE REMISIONO */ /*$$IBE$$ 
                            EXECUTE PROCEDURE FALTANTE(23, 22, ID, ITEM) returning_values (PEDIDO, UND, FACTOR);
                        if (PEDIDO IS NULL) then
                            PEDIDO = 0;
                        ORDENC = ORDENC + PEDIDO * FACTOR;
                        END
                    ORDENADO = ORDENADO + ORDENC;
                    SELECT SUM(RSDE_LIBERAR)
                        FROM RESERVAS_DETALLE RD, RESERVAS R
                        WHERE R.RESE_ID = RD.RESE_ID AND ARTI_COD = :CODIGO AND RESE_FECHA <= :FECHA AND RESE_VENCE >= :FECHA AND RSDE_ANULADO = 'N'
                        INTO :RESERVADO;
                    if (RESERVADO IS NULL) then
                        RESERVADO = 0;
                    PEDIDO = 0;
                    FOR SELECT P.PEDI_ID, PEDE_ITEM, PEDE_CANT * PEDE_FACTOR
                        FROM PEDIDOS P, PEDIDOS_DETALLE PD, PUNTO_VENTA PT
                        WHERE P.PEDI_ID = PD.PEDI_ID AND PD.ARTI_COD = :CODIGO AND PT.ptvt_id = P.PTVT_ID AND (PEDI_FECHA+PEDI_VALIDEZ) >= :FECHA AND PEDI_FECHA <= :FECHA AND PEDE_ANULADO = 'N'
                        INTO :ID, :ITEM, :CANT2
                        do
                        BEGIN
                        EXECUTE PROCEDURE FALTANTE(34, 31, ID, ITEM) returning_values (ORDENC, UND, FACTOR);
                        if ((ORDENC * FACTOR = CANT2) or (PEDAUTO = 'SI')) then  $$IBE$$*/ /* SI NO SE HA FACTURADO MIRE A VER SI SE REMISIONO */ /*$$IBE$$ 
                            EXECUTE PROCEDURE FALTANTE(34, 32, ID, ITEM) returning_values (ORDENC, UND, FACTOR);
                        if (ORDENC IS NULL) then
                            ORDENC = 0;
                        PEDIDO = PEDIDO + ORDENC * FACTOR;
                        END
                    if (PEDIDO IS NULL) then
                        PEDIDO = 0;
                    RESERVADO = RESERVADO + PEDIDO;
                    END
                ELSE
                    BEGIN
                    RESERVADO = 0;
                    ORDENADO = 0;
                    END
                if (ENPESO = 'S') then
                    BEGIN
                    if (pesounit IS NULL) then
                        pesounit = 0;
                    if (PESOUNIT <> 0) then
                        BEGIN
                        pesototal = PESOUNIT * cant;
                        SUSPEND;
                        END
                    END
                ELSE
                    SUSPEND;
                END
            END
        END
  END
 $$IBE$$*/ SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE INVENTARIO_FAMILIA(
    FECHA DATE,
    FAMILIA VARCHAR(20))
RETURNS (
    ARTICULO VARCHAR(20),
    INTERNO VARCHAR(20),
    DESCRIPCION VARCHAR(60),
    CANTIDAD NUMERIC(18,2),
    UNIDAD VARCHAR(8),
    TOTAL NUMERIC(18,2))
AS
declare variable COSTO NUMERIC(18,4);
begin /*$$IBE$$ 
FOR SELECT A.ARTI_COD, ARTI_DES, ARTI_UNIDAD, p.pvar_cod FROM ARTICULO A, PROVEEDOR_ARTICULO P
    WHERE ESAR_COD <> 'I' AND A.arti_cod = P.arti_cod AND P.terc_nit = :FAMILIA
    INTO :ARTICULO, :descripcion, :UNIDAD, :INTERNO
    DO
    BEGIN
    EXECUTE PROCEDURE SALDO_INICIAL_TOTAL_INV(ARTICULO, FECHA) returning_values (cantidad);
    EXECUTE PROCEDURE COSTO_PROMEDIO_UNIDAD(ARTICULO, FECHA, UNIDAD) returning_values (COSTO);
    TOTAL = COSTO * CANTIDAD;
    suspend;
    END
 $$IBE$$*/ SUSPEND;
end
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE KARDEX_DESDE_HASTA(
    ARTICULO VARCHAR(15),
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    INICIAL_CANT NUMERIC(18,4),
    INICIAL_PESOS NUMERIC(18,2),
    ENT_CANT NUMERIC(18,4),
    ENT_PESOS NUMERIC(18,2),
    SAL_CANT NUMERIC(18,4),
    SAL_PESOS NUMERIC(18,2),
    FINAL_CANT NUMERIC(18,4),
    FINAL_PESOS NUMERIC(18,2))
AS
BEGIN /*$$IBE$$ 
  EXECUTE PROCEDURE SALDO_INICIAL_TOTAL_INV(ARTICULO, FECINI) returning_values (INICIAL_CANT);
  EXECUTE PROCEDURE VALOR_INICIAL_INVENTARIO(ARTICULO, FECINI) returning_values (INICIAL_PESOS);
  SELECT SUM(COST_ENTC), SUM(COST_ENTP), SUM(COST_SALC), SUM(COST_SALP) FROM COSTOS
    WHERE (COST_FECHA >= :FECINI) AND (COST_FECHA <= :FECFIN) AND
          (ARTI_COD = :ARTICULO)
    INTO :ENT_CANT, :ENT_PESOS, :SAL_CANT, :SAL_PESOS;
  if (ENT_CANT IS NULL) then
    ENT_CANT = 0;
  if (ENT_PESOS IS NULL) then
    ENT_PESOS = 0;
  if (SAL_CANT IS NULL) then
    SAL_CANT = 0;
  if (SAL_PESOS IS NULL) then
    SAL_PESOS = 0;
  FINAL_CANT = INICIAL_CANT + ENT_CANT - SAL_CANT;
  FINAL_PESOS = INICIAL_PESOS + ENT_PESOS - SAL_PESOS;
  SUSPEND;
 $$IBE$$*/ SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE REP_EXISTENCIAS_PRECIOS(
    ARTINI VARCHAR(20),
    ARTFIN VARCHAR(20),
    GRPINI VARCHAR(2),
    GRPFIN VARCHAR(2),
    ORDEN CHAR(1),
    LISTA INTEGER,
    FECHA DATE,
    BODINI VARCHAR(2),
    BODFIN VARCHAR(2),
    TODAS CHAR(1),
    IVAINC CHAR(1),
    SINBOD CHAR(1),
    SUBEMPRESA INTEGER)
RETURNS (
    CODIGO VARCHAR(15),
    NOMBRE VARCHAR(60),
    UNIDAD VARCHAR(8),
    CODGRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    CODSUBG VARCHAR(3),
    NOMSUBG VARCHAR(30),
    CODMARC VARCHAR(3),
    NOMMARC VARCHAR(30),
    NOMLISTA VARCHAR(30),
    PRECIO NUMERIC(18,2),
    MARGEN NUMERIC(9,2),
    IVA NUMERIC(9,2),
    CODBOD VARCHAR(2),
    NOMBOD VARCHAR(30),
    CANT NUMERIC(18,4),
    COSTOTOT NUMERIC(18,2))
AS
DECLARE VARIABLE EXIST CHAR(1);
DECLARE VARIABLE CODINI VARCHAR(20);
DECLARE VARIABLE CODFIN VARCHAR(20);
DECLARE VARIABLE DESINI VARCHAR(20);
DECLARE VARIABLE DESFIN VARCHAR(20);
DECLARE VARIABLE FECINI DATE;
DECLARE VARIABLE FECFIN DATE;
DECLARE VARIABLE UTIL NUMERIC(9,2);
DECLARE VARIABLE MOU CHAR(10);
DECLARE VARIABLE LISIVA CHAR(1);
BEGIN /*$$IBE$$ 
if (ORDEN = 'C') then
    BEGIN
    CODINI = ARTINI;
    CODFIN = ARTFIN;
    DESINI = '';
    DESFIN = 'zz';
    END
ELSE
    BEGIN
    DESINI = ARTINI;
    DESFIN = ARTFIN;
    CODINI = '';
    CODFIN = 'zz';
    END
    
EXECUTE PROCEDURE LEE_CONFIGURACION ('FACTURACION', 'ARTICULOS', 'SUGERIR PRECIOS CON PORCENTAJE DE MARGEN O UTILIDAD') returning_values (MOU);
    
FOR SELECT ARTI_COD, ARTI_DES, ARTI_UNIDAD, ARTI_EXIST, A.GRUP_COD, A.SUBG_COD, A.MARC_COD, TAIV_PORC
    FROM ARTICULO A, TARIFA_IVA T
    WHERE ARTI_COD >= :CODINI AND ARTI_COD <= :CODFIN AND A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :GRPFIN AND
    ARTI_DES >= :DESINI AND ARTI_DES <= :DESFIN AND ESAR_COD <> 'I' AND A.TAIV_COD = T.TAIV_COD
    INTO :CODIGO, :NOMBRE, :UNIDAD, :EXIST, :CODGRUPO, :CODSUBG, :CODMARC, :IVA
    DO
    BEGIN
    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
    if (EXIST <> 'N') then
        BEGIN
        if (LISTA = 255) then
            BEGIN
            if (TODAS = 'N') then
                begin
                 $$IBE$$*/ /* Busque las listas validas hoy */ /*$$IBE$$ 
                FOR SELECT LIPR_NOM, LIPR_FECINI, LIPR_FECFIN, PRAR_FIJO, PRAR_MARGEN, PRAR_UTIL, LIPR_MODIF
                    FROM LISTA_PRECIOS L, PRECIOS_ARTICULO P
                    WHERE L.LIPR_COD = P.LIPR_COD AND ARTI_COD = :CODIGO
                    INTO :NOMLISTA, :FECINI, :FECFIN, :PRECIO, :MARGEN, :UTIL, :LISIVA
                    DO
                      BEGIN
                      if (MOU = 'UTILIDAD') then
                        MARGEN = UTIL;
                      if (IVAINC = 'S') THEN
                        BEGIN
                        if (LISIVA = 'N') then
                            PRECIO = PRECIO * (1 + (IVA/100));
                        END
                      END
                end   
            ELSE
                FOR SELECT LIPR_NOM, PRAR_FIJO, PRAR_MARGEN, PRAR_UTIL, LIPR_MODIF
                    FROM LISTA_PRECIOS L, PRECIOS_ARTICULO P
                    WHERE L.LIPR_COD = P.LIPR_COD AND ARTI_COD = :CODIGO
                    INTO :NOMLISTA, :PRECIO, :MARGEN, :UTIL, :LISIVA
                    DO
                    BEGIN
                    EXECUTE PROCEDURE LEE_CONFIGURACION ('FACTURACION', 'ARTICULOS', 'SUGERIR PRECIOS CON PORCENTAJE DE MARGEN O UTILIDAD') returning_values (MOU);
                    if (MOU = 'UTILIDAD') then
                        MARGEN = UTIL;
                    if (IVAINC = 'S') THEN
                        BEGIN
                        if (LISIVA = 'N') then
                            PRECIO = PRECIO * (1 + (IVA/100));
                        END
                    END
            END  $$IBE$$*/ /* 255 */ /*$$IBE$$ 
        ELSE
            BEGIN
            if (TODAS = 'N') then
                begin
                 $$IBE$$*/ /* Busque las listas validas hoy */ /*$$IBE$$ 
                FOR SELECT LIPR_NOM, LIPR_FECINI, LIPR_FECFIN, PRAR_FIJO, PRAR_MARGEN, PRAR_UTIL, LIPR_MODIF
                    FROM LISTA_PRECIOS L, PRECIOS_ARTICULO P
                    WHERE L.LIPR_COD = P.LIPR_COD AND ARTI_COD = :CODIGO AND L.LIPR_COD = :LISTA
                    INTO :NOMLISTA, :FECINI, :FECFIN, :PRECIO, :MARGEN, :UTIL, :LISIVA
                    DO
                    BEGIN
                    if (MOU = 'UTILIDAD') then
                        MARGEN = UTIL;
                    if (IVAINC = 'S') THEN
                        BEGIN
                        if (LISIVA = 'N') then
                            PRECIO = PRECIO * (1 + (IVA/100));
                        END
                    END
                end
            ELSE
                FOR SELECT LIPR_NOM, PRAR_FIJO, PRAR_MARGEN, PRAR_UTIL
                    FROM LISTA_PRECIOS L, PRECIOS_ARTICULO P
                    WHERE L.LIPR_COD = P.LIPR_COD AND ARTI_COD = :CODIGO AND L.LIPR_COD = :LISTA
                    INTO :NOMLISTA, :PRECIO, :MARGEN, :UTIL
                    DO
                    BEGIN
                    if (MOU = 'UTILIDAD') then
                        MARGEN = UTIL;
                    if (IVAINC = 'S') THEN
                        BEGIN
                        if (LISIVA = 'NO') then
                            PRECIO = PRECIO * (1 + (IVA/100));
                        END
                    END
            END
                      
        if (SINBOD = 'S') then
            BEGIN
            EXECUTE PROCEDURE SALDO_INICIAL_TOTAL_INV(CODIGO, FECHA) returning_values (CANT);
            COSTOTOT = CANT * PRECIO;
            if (FECINI is null) then
                SUSPEND;
            else
                if ((FECINI <= :FECHA) AND (FECFIN >= :FECHA)) Then
                    SUSPEND;
            END
        ELSE
            BEGIN
            FOR SELECT BODE_COD, BODE_NOM FROM BODEGA B
                WHERE BODE_COD >= :BODINI AND BODE_COD <= :BODFIN AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                INTO :CODBOD, :NOMBOD
                DO
                BEGIN
                EXECUTE PROCEDURE SALDO_INICIAL_INVENTARIO(CODIGO, FECHA, :CODBOD) returning_values (CANT);
                        
                COSTOTOT = CANT * PRECIO;
                if (FECINI is null) then
                    SUSPEND;
                else
                    if ((FECINI <= :FECHA) AND (FECFIN >= :FECHA)) Then
                        SUSPEND;
                END
            END
        END
    END
 $$IBE$$*/ SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE REP_KARDEX_ARTICULO(
    DETALLE CHAR(1),
    FECINI DATE,
    FECFIN DATE,
    ARTINI VARCHAR(20),
    ARTFIN VARCHAR(20),
    GRPINI VARCHAR(2),
    GRPFIN VARCHAR(2),
    ORDEN CHAR(1),
    BODEGA VARCHAR(2))
RETURNS (
    CODIGO VARCHAR(15),
    NOMBRE VARCHAR(60),
    UNIDAD VARCHAR(8),
    CODGRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    CODSUBG VARCHAR(3),
    NOMSUBG VARCHAR(30),
    CODMARC VARCHAR(3),
    NOMMARC VARCHAR(30),
    CODBOD VARCHAR(2),
    SALDOINI NUMERIC(18,4),
    COSTOINI NUMERIC(18,2),
    ENTRADAS NUMERIC(18,4),
    COSTOENT NUMERIC(18,2),
    SALIDAS NUMERIC(18,4),
    COSTOSAL NUMERIC(18,2),
    SALDOFIN NUMERIC(18,4),
    COSTOFIN NUMERIC(18,2),
    TIPODOC VARCHAR(8),
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    CONCEPTO VARCHAR(60),
    NIT VARCHAR(20),
    CONS INTEGER,
    CANFINAL NUMERIC(18,4),
    COSFINAL NUMERIC(18,2))
AS
DECLARE VARIABLE ENTRADA CHAR(1);
DECLARE VARIABLE CANT NUMERIC(18,4);
DECLARE VARIABLE COSTO NUMERIC(18,2);
DECLARE VARIABLE CODINI VARCHAR(20);
DECLARE VARIABLE CODFIN VARCHAR(20);
DECLARE VARIABLE DESINI VARCHAR(20);
DECLARE VARIABLE DESFIN VARCHAR(20);
BEGIN /*$$IBE$$ 
if (ORDEN = 'C') then
    BEGIN
    CODINI = ARTINI;
    CODFIN = ARTFIN;
    DESINI = '';
    DESFIN = 'zz';
    END
ELSE
    BEGIN
    DESINI = ARTINI;
    DESFIN = ARTFIN;
    CODINI = '';
    CODFIN = 'zz';
    END
  FOR
    SELECT ARTI_COD, ARTI_DES, ARTI_UNIDAD, A.GRUP_COD, A.SUBG_COD, A.MARC_COD
      FROM ARTICULO A
      WHERE ARTI_COD >= :CODINI AND ARTI_COD <= :CODFIN AND A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :GRPFIN AND ARTI_DES >= :DESINI AND ARTI_DES <= :DESFIN AND A.ESAR_COD <> 'I'
      INTO :CODIGO, :NOMBRE, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
      DO
        BEGIN
        NOMMARC = '';
        NOMSUBG = '';
        SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
        SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
        SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
        if (BODEGA = '') then
            BEGIN
            EXECUTE PROCEDURE SALDO_INICIAL_TOTAL_INV(CODIGO, FECINI) returning_values (:SALDOINI);
            EXECUTE PROCEDURE VALOR_INICIAL_INVENTARIO(CODIGO, FECINI) returning_values (COSTOINI);
            END
        ELSE
            BEGIN
            EXECUTE PROCEDURE SALDO_INICIAL_INVENTARIO(CODIGO, FECINI, :BODEGA) returning_values (SALDOINI);
            EXECUTE PROCEDURE COSTO_PROMEDIO(CODIGO, FECINI-1) returning_values (COSTOINI);
            COSTOINI = COSTOINI * saldoini;
            END
        if (DETALLE = 'N') then
            BEGIN
             $$IBE$$*/ /* SUME LAS ENTRADAS */ /*$$IBE$$ 
            if (BODEGA = '') then
              SELECT SUM(COST_ENTC), SUM(COST_ENTP), SUM(COST_SALC), SUM(COST_SALP) FROM COSTOS
                WHERE (COST_FECHA >= :FECINI) AND (COST_FECHA <= :FECFIN) AND (ARTI_COD = :codigo)
                INTO :ENTRADAS, :COSTOENT, :SALIDAS, :COSTOSAL;
            ELSE
              SELECT SUM(COST_ENTC), SUM(COST_ENTP), SUM(COST_SALC), SUM(COST_SALP)
                FROM COSTOS C, MOVIMIENTO_ARTICULO M
                WHERE (COST_FECHA >= :FECINI) AND (COST_FECHA <= :FECFIN) AND (C.ARTI_COD = :codigo) AND C.cost_idmov = M.mvar_cons AND BODE_COD = :BODEGA
                INTO :ENTRADAS, :COSTOENT, :SALIDAS, :COSTOSAL;

            if (ENTRADAS IS NULL) then
              ENTRADAS = 0;
            if (COSTOENT IS NULL) then
              COSTOENT = 0;
            if (SALIDAS IS NULL) then
              SALIDAS = 0;
            if (COSTOSAL IS NULL) then
              COSTOSAL = 0;
            SALDOFIN = SALDOINI + ENTRADAS - SALIDAS;
            COSTOFIN = COSTOINI + COSTOENT - COSTOSAL;
            if (BODEGA = '') then
                BEGIN
                EXECUTE PROCEDURE SALDO_INICIAL_TOTAL_INV(CODIGO, fecfin+1) returning_values (canfinal);
                EXECUTE PROCEDURE VALOR_INICIAL_INVENTARIO(CODIGO, FECFIN+1) returning_values (cosfinal);
                END
            ELSE
                BEGIN
                EXECUTE PROCEDURE SALDO_INICIAL_INVENTARIO(CODIGO, FECFIN+1, :BODEGA) returning_values (CANFINAL);
                EXECUTE PROCEDURE COSTO_PROMEDIO(CODIGO, FECFIN+1) returning_values (COSFINAL);
                COSFINAL = COSFINAL * CANFINAL;
                END
            SUSPEND;
            END
        ELSE
            BEGIN
            SALDOFIN = SALDOINI;
            COSTOFIN = COSTOINI;
            COSTOENT = 0;
            COSTOSAL = 0;
            FOR SELECT TIDO_NOMCORTO, MVAR_ENTRADA, MVAR_PREF, MVAR_NUMERO, MVAR_CANT, MVAR_COSTO, MVAR_CONC, MVAR_FECHA, M.TERC_NIT, MVAR_CONS, BODE_COD, COST_SALDOP, COST_SALDOC
                FROM MOVIMIENTO_ARTICULO M, TIPO_DOCUMENTO TD, COSTOS C
                WHERE TD.TIDO_COD = MVAR_TIPODOC AND (MVAR_FECHA >= :FECINI) AND (MVAR_FECHA <= :FECFIN) AND (MVAR_TIPODOC <> 13) AND (m.ARTI_COD = :CODIGO) AND M.mvar_cons = C.cost_idmov
                ORDER BY MVAR_FECHA, MVAR_CONS
                INTO :TIPODOC, :ENTRADA, :PREFIJO, :NUMERO, :ENTRADAS, :COSTOENT, :CONCEPTO, :FECHA, :NIT, :CONS, :CODBOD, :costo, :cant
                DO
                    BEGIN
                    if (ENTRADA = 'S') then
                        BEGIN
                        SALIDAS = 0;
                        SALDOFIN = SALDOFIN + ENTRADAS;
                        COSTOFIN = COSTOFIN + (ENTRADAS * COSTOENT);
                        if (CANT > 0) then
                            COSTOSAL = COSTO / CANT;
                        else
                            COSTOSAL = 0;
                        end
                    ELSE
                        BEGIN
                        SALIDAS = ENTRADAS;
                        ENTRADAS = 0;
                        if (CANT > 0) then
                            COSTOSAL = COSTO / CANT;
                        else
                            COSTOSAL = 0;
                        SALDOFIN = SALDOFIN - SALIDAS;
                        COSTOFIN = COSTOFIN - (SALIDAS * costosal);
                        END
                    SUSPEND;
                    END
            END
        END
 $$IBE$$*/ SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE EXISTENCIAS_DESDE_HASTA(
    FECHA DATE,
    ARTINI VARCHAR(20),
    ARTFIN VARCHAR(20),
    GRPINI VARCHAR(3),
    GRPFIN VARCHAR(3),
    BODINI VARCHAR(2),
    BODFIN VARCHAR(2),
    ORDEN CHAR(1),
    AGRUPA CHAR(1),
    DETALLE CHAR(1),
    RESERVA CHAR(1),
    ENPESO CHAR(1),
    SUCURSAL INTEGER)
RETURNS (
    CANT NUMERIC(18,4),
    COSTO NUMERIC(18,2),
    COSTO_LOTE NUMERIC(18,2),
    CODIGO VARCHAR(15),
    NOMBRE VARCHAR(60),
    UNIDAD VARCHAR(8),
    STAND VARCHAR(15),
    CODGRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    CODSUBG VARCHAR(3),
    NOMSUBG VARCHAR(30),
    CODMARC VARCHAR(3),
    NOMMARC VARCHAR(30),
    CODBOD VARCHAR(2),
    LOTE VARCHAR(15),
    NOMBOD VARCHAR(30),
    COSTOTOT NUMERIC(18,2),
    ULTCOSTO NUMERIC(18,2),
    FECHACOSTO DATE,
    CONSUMO NUMERIC(18,2),
    RESERVADO NUMERIC(18,4),
    ORDENADO NUMERIC(18,4),
    IVA NUMERIC(9,2),
    PESOUNIT NUMERIC(18,4),
    PESOTOTAL NUMERIC(18,4),
    CODBAR VARCHAR(20))
AS
declare variable exist char(1);
declare variable codini varchar(20);
declare variable codfin varchar(20);
declare variable desini varchar(20);
declare variable desfin varchar(20);
declare variable ordenc numeric(18,4);
declare variable pedido numeric(18,4);
declare variable ok char(1);
declare variable id integer;
declare variable item integer;
declare variable und varchar(8);
declare variable factor numeric(18,4);
declare variable cant2 numeric(18,4);
declare variable PEDAUTO CHAR(2);
BEGIN
if (ORDEN = 'C') then
    BEGIN
    CODINI = ARTINI;
    CODFIN = ARTFIN;
    DESINI = '';
    DESFIN = 'zz';
    END
ELSE
    BEGIN
    DESINI = ARTINI;
    DESFIN = ARTFIN;
    CODINI = '';
    CODFIN = 'zz';
    END
EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION', 'FACTURAS', 'GENERAR PEDIDO AUTOMATICAMENTE CON LA FACTURA') returning_values (pedauto);
if (DETALLE = 'B') then
  BEGIN
  FOR SELECT ARTI_COD, ARTI_DES, ARTI_UNIDAD, ARTI_EXIST, TAIV_PORC, A.GRUP_COD, A.SUBG_COD, A.MARC_COD, BODE_COD, BODE_NOM, ARTI_CONSUMO, ARTI_PESO/1000
      FROM ARTICULO A, BODEGA B, TARIFA_IVA T
      WHERE ARTI_COD >= :CODINI AND ARTI_COD <= :CODFIN AND ARTI_DES >= :DESINI AND ARTI_DES <= :DESFIN AND ESAR_COD <> 'I' AND BODE_COD >= :BODINI AND
      BODE_COD <= :BODFIN AND ((SUCU_ID = :SUCURSAL) or (:SUCURSAL = 0)) AND A.TAIV_COD = T.TAIV_COD
      INTO :CODIGO, :NOMBRE, :UNIDAD, :EXIST, :IVA, :CODGRUPO, :CODSUBG, :CODMARC, :CODBOD, :NOMBOD, :CONSUMO, :pesounit
      DO
        BEGIN
        OK = 'N';
        if (AGRUPA = 'G') then
            BEGIN
            if ((CODGRUPO >= GRPINI) AND (CODGRUPO <= GRPFIN)) then
                OK = 'S';
            end
        ELSE
            if (AGRUPA = 'M') then
                BEGIN
                if ((CODMARC >= GRPINI) AND (CODMARC <= GRPFIN)) then
                    OK = 'S';
                END
        if (OK = 'S') then
            BEGIN
            NOMGRUPO = '';
            NOMMARC = '';
            NOMSUBG = '';
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            SELECT MAX(COBA_COD) FROM BARRAS_ARTICULO WHERE ARTI_COD = :codigo AND COBA_UNIDAD = :unidad INTO :codbar;
            if (CODBAR IS NULL) then
                CODBAR = CODIGO;
            if (EXIST <> 'N') then
                BEGIN
                SELECT STAND_COD FROM STANDS WHERE ARTI_COD = :CODIGO AND STAND_BODEGA = :CODBOD INTO :STAND;
                EXECUTE PROCEDURE SALDO_INICIAL_INVENTARIO(CODIGO, FECHA, :CODBOD) returning_values (CANT);
                EXECUTE PROCEDURE COSTO_PROMEDIO_UNIDAD(CODIGO, FECHA, UNIDAD) returning_values (COSTO);
                EXECUTE PROCEDURE ULTIMO_COSTO(CODIGO, FECHA, UNIDAD) returning_values (ULTCOSTO);
                SELECT MAX(MVAR_FECHA) FROM MOVIMIENTO_ARTICULO WHERE ARTI_COD = :CODIGO AND MVAR_ENTRADA = 'S' AND MVAR_FECHA <= :FECHA INTO :FECHACOSTO;
                COSTOTOT = :CANT * :COSTO;
                CONSUMO = CONSUMO * CANT;
                if (RESERVA = 'S') then
                    BEGIN
                    SELECT SUM(ORID_ENTREGAR)
                        FROM ORDENINVENTARIO_DETALLE OD, ordenes_inventario O
                        WHERE O.ORIN_ID = OD.ORIN_ID AND ARTI_COD = :CODIGO AND ORIN_FECHA <= :FECHA AND ORIN_FECLLEGA >= :FECHA AND ORID_ANULADO = 'N' AND OD.BODE_COD = :CODBOD
                        INTO :ORDENADO;
                    if (ORDENADO IS NULL) then
                        ORDENADO = 0;
                    ORDENC = 0;
                    FOR SELECT O.ORDC_ID, OCDE_ITEM, OCDE_CANT * OCDE_FACTOR
                        FROM ORDENES_COMPRA O, ORDENES_COMPRA_DETALLE OD
                        WHERE O.ORDC_ID = OD.ORDC_ID AND OD.ARTI_COD = :CODIGO AND (ORDC_FECHA+ORDC_VALIDEZ) >= :FECHA AND ORDC_FECHA <= :FECHA AND OCDE_ANULADO = 'N' AND OD.BODE_COD = :CODBOD
                        INTO :ID, :ITEM, :CANT2
                        do
                        BEGIN
                        EXECUTE PROCEDURE FALTANTE(23, 21, ID, ITEM) returning_values (PEDIDO, UND, FACTOR);
                        if (PEDIDO * FACTOR = CANT2) then /* SI NO SE HA FACTURADO MIRE A VER SI SE REMISIONO */
                            EXECUTE PROCEDURE FALTANTE(23, 22, ID, ITEM) returning_values (PEDIDO, UND, FACTOR);
                        if (PEDIDO IS NULL) then
                            PEDIDO = 0;
                        ORDENC = ORDENC + PEDIDO * FACTOR;
                        END
                    ORDENADO = ORDENADO + ORDENC;
                    SELECT SUM(RSDE_LIBERAR)
                        FROM RESERVAS_DETALLE RD, RESERVAS R
                        WHERE R.RESE_ID = RD.RESE_ID AND ARTI_COD = :CODIGO AND RESE_FECHA <= :FECHA AND RESE_VENCE >= :FECHA AND RD.BODE_COD = :CODBOD AND RSDE_ANULADO = 'N'
                        INTO :RESERVADO;
                    if (RESERVADO IS NULL) then
                        RESERVADO = 0;
                    PEDIDO = 0;
                    FOR SELECT P.PEDI_ID, PEDE_ITEM, PEDE_CANT * PEDE_FACTOR
                        FROM PEDIDOS P, PEDIDOS_DETALLE PD
                        WHERE P.PEDI_ID = PD.PEDI_ID AND PD.ARTI_COD = :CODIGO AND (PEDI_FECHA+PEDI_VALIDEZ) >= :FECHA AND PEDI_FECHA <= :FECHA AND PEDE_ANULADO = 'N' AND BODE_COD = :CODBOD
                        INTO :ID, :ITEM, :CANT2
                        do
                        BEGIN
                        EXECUTE PROCEDURE FALTANTE(34, 31, ID, ITEM) returning_values (ORDENC, UND, FACTOR);
                        if ((ORDENC * FACTOR = CANT2) or (PEDAUTO = 'SI')) then /* SI NO SE HA FACTURADO MIRE A VER SI SE REMISIONO */
                            EXECUTE PROCEDURE FALTANTE(34, 32, ID, ITEM) returning_values (ORDENC, UND, FACTOR);
                        if (ORDENC IS NULL) then
                            ORDENC = 0;
                        PEDIDO = PEDIDO + ORDENC * FACTOR;
                        END
                    RESERVADO = RESERVADO + PEDIDO;
                    END
                ELSE
                    BEGIN
                    RESERVADO = 0;
                    ORDENADO = 0;
                    END
                if (ENPESO = 'S') then
                    BEGIN
                    if (pesounit IS NULL) then
                        pesounit = 0;
                    if (PESOUNIT <> 0) then
                        BEGIN
                        pesototal = PESOUNIT * cant;
                        SUSPEND;
                        END
                    END
                ELSE
                    SUSPEND;
                END
            END
        END
  END

if (DETALLE = 'L') then
  BEGIN
  FOR SELECT A.ARTI_COD, ARTI_DES, ARTI_UNIDAD, ARTI_EXIST, TAIV_PORC, A.GRUP_COD, A.SUBG_COD, A.MARC_COD, L.lote_nro, L.lote_nro||' - '||L.lote_vence, ARTI_CONSUMO,l.bode_cod, L.lote_saldo,l.lote_costo, ARTI_PESO/1000
      FROM ARTICULO A, LOTES l, TARIFA_IVA T
      WHERE A.ARTI_COD >= '0' AND A.ARTI_COD <= 'zz' AND ARTI_DES >= '' AND ARTI_DES <= 'zz' AND ESAR_COD <> 'I' AND A.TAIV_COD = T.TAIV_COD and a.arti_cod = l.arti_cod
      INTO :CODIGO, :NOMBRE, :UNIDAD, :EXIST, :IVA, :CODGRUPO, :CODSUBG, :CODMARC, :LOTE, :NOMBOD, :CONSUMO, :codbod, :cant, :costo_lote, :pesounit
      DO
        BEGIN
        OK = 'N';
        if (AGRUPA = 'G') then
            BEGIN
            if ((CODGRUPO >= GRPINI) AND (CODGRUPO <= GRPFIN)) then
                OK = 'S';
            end
        ELSE
            if (AGRUPA = 'M') then
                BEGIN
                if ((CODMARC >= GRPINI) AND (CODMARC <= GRPFIN)) then
                    OK = 'S';
                END
        if (OK = 'S') then
            BEGIN
            NOMGRUPO = '';
            NOMMARC = '';
            NOMSUBG = '';
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            SELECT MAX(COBA_COD) FROM BARRAS_ARTICULO WHERE ARTI_COD = :codigo AND COBA_UNIDAD = :unidad INTO :codbar;
            if (CODBAR IS NULL) then
                CODBAR = CODIGO;

            if (EXIST <> 'N') then
                BEGIN
                EXECUTE PROCEDURE COSTO_PROMEDIO_UNIDAD(CODIGO, FECHA, UNIDAD) returning_values (COSTO);
                EXECUTE PROCEDURE ULTIMO_COSTO(CODIGO, FECHA, UNIDAD) returning_values (ULTCOSTO);
                SELECT MAX(MVAR_FECHA) FROM MOVIMIENTO_ARTICULO WHERE ARTI_COD = :CODIGO AND MVAR_ENTRADA = 'S' AND MVAR_FECHA <= :FECHA INTO :FECHACOSTO;
                COSTOTOT = :CANT * :COSTO;
                CONSUMO = CONSUMO * CANT;
                if (RESERVA = 'S') then
                    BEGIN
                    SELECT SUM(ORID_ENTREGAR)
                        FROM ORDENINVENTARIO_DETALLE OD, ordenes_inventario O
                        WHERE O.ORIN_ID = OD.ORIN_ID AND ARTI_COD = :CODIGO AND ORIN_FECHA <= :FECHA AND ORIN_FECLLEGA >= :FECHA AND ORID_ANULADO = 'N'
                        INTO :ORDENADO;
                    if (ORDENADO IS NULL) then
                        ORDENADO = 0;
                    ORDENC = 0;
                    FOR SELECT O.ORDC_ID, OCDE_ITEM, OCDE_CANT * OCDE_FACTOR
                        FROM ORDENES_COMPRA O, ORDENES_COMPRA_DETALLE OD
                        WHERE O.ORDC_ID = OD.ORDC_ID AND OD.ARTI_COD = :CODIGO AND (ORDC_FECHA+ORDC_VALIDEZ) >= :FECHA AND ORDC_FECHA <= :FECHA AND OCDE_ANULADO = 'N'
                        INTO :ID, :ITEM, :CANT2
                        do
                        BEGIN
                        EXECUTE PROCEDURE FALTANTE(23, 21, ID, ITEM) returning_values (PEDIDO, UND, FACTOR);
                        if (PEDIDO * FACTOR = CANT2) then /* SI NO SE HA FACTURADO MIRE A VER SI SE REMISIONO */
                            EXECUTE PROCEDURE FALTANTE(23, 22, ID, ITEM) returning_values (PEDIDO, UND, FACTOR);
                        if (PEDIDO IS NULL) then
                            PEDIDO = 0;
                        ORDENC = ORDENC + PEDIDO * FACTOR;
                        END
                    ORDENADO = ORDENADO + ORDENC;
                    SELECT SUM(RSDE_LIBERAR)
                        FROM RESERVAS_DETALLE RD, RESERVAS R
                        WHERE R.RESE_ID = RD.RESE_ID AND ARTI_COD = :CODIGO AND RESE_FECHA <= :FECHA AND RESE_VENCE >= :FECHA AND RSDE_ANULADO = 'N'
                        INTO :RESERVADO;
                    if (RESERVADO IS NULL) then
                        RESERVADO = 0;
                    PEDIDO = 0;
                    FOR SELECT P.PEDI_ID, PEDE_ITEM, PEDE_CANT * PEDE_FACTOR
                        FROM PEDIDOS P, PEDIDOS_DETALLE PD
                        WHERE P.PEDI_ID = PD.PEDI_ID AND PD.ARTI_COD = :CODIGO AND (PEDI_FECHA+PEDI_VALIDEZ) >= :FECHA AND PEDI_FECHA <= :FECHA AND PEDE_ANULADO = 'N'
                        INTO :ID, :ITEM, :CANT2
                        do
                        BEGIN
                        EXECUTE PROCEDURE FALTANTE(34, 31, ID, ITEM) returning_values (ORDENC, UND, FACTOR);
                        if ((ORDENC * FACTOR = CANT2) or (PEDAUTO = 'SI')) then /* SI NO SE HA FACTURADO MIRE A VER SI SE REMISIONO */
                            EXECUTE PROCEDURE FALTANTE(34, 32, ID, ITEM) returning_values (ORDENC, UND, FACTOR);
                        if (ORDENC IS NULL) then
                            ORDENC = 0;
                        PEDIDO = PEDIDO + ORDENC * FACTOR;
                        END
                    RESERVADO = RESERVADO + PEDIDO;
                    END
                ELSE
                    BEGIN
                    RESERVADO = 0;
                    ORDENADO = 0;
                    END
                if (ENPESO = 'S') then
                    BEGIN
                    if (pesounit IS NULL) then
                        pesounit = 0;
                    if (PESOUNIT <> 0) then
                        BEGIN
                        pesototal = PESOUNIT * cant;
                        SUSPEND;
                        END
                    END
                ELSE
                    SUSPEND;
                END
            END
        END
  end
if (DETALLE = 'N') then
  BEGIN
  FOR SELECT ARTI_COD, ARTI_DES, ARTI_UNIDAD, ARTI_EXIST, TAIV_PORC, A.GRUP_COD, A.SUBG_COD, A.MARC_COD, ARTI_CONSUMO, ARTI_PESO/1000
      FROM ARTICULO A, TARIFA_IVA T
      WHERE ARTI_COD >= :CODINI AND ARTI_COD <= :CODFIN AND ARTI_DES >= :DESINI AND ARTI_DES <= :DESFIN AND ESAR_COD <> 'I' AND A.TAIV_COD = T.TAIV_COD
      INTO :CODIGO, :NOMBRE, :UNIDAD, :EXIST, :IVA, :CODGRUPO, :CODSUBG, :CODMARC, :CONSUMO, :pesounit
      DO
        BEGIN
        OK = 'N';
        if (AGRUPA = 'G') then
            BEGIN
            if ((GRPINI = '0') AND (GRPFIN = 'zz')) then
                OK = 'S';
            else
                if ((CODGRUPO >= GRPINI) AND (CODGRUPO <= GRPFIN)) then
                    OK = 'S';
            end
        ELSE
            if (AGRUPA = 'M') then
                BEGIN
                if ((GRPINI = '0') AND (GRPFIN = 'zzz')) then
                    OK = 'S';
                else
                    if ((CODMARC >= GRPINI) AND (CODMARC <= GRPFIN)) then
                        OK = 'S';
                END
        if (OK = 'S') then
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            SELECT MAX(COBA_COD) FROM BARRAS_ARTICULO WHERE ARTI_COD = :codigo AND COBA_UNIDAD = :unidad INTO :codbar;
            if (CODBAR IS NULL) then
                CODBAR = CODIGO;

            if (EXIST <> 'N') then
                BEGIN
                EXECUTE PROCEDURE SALDO_INICIAL_TOTAL_INV(CODIGO, FECHA) returning_values (CANT);
                EXECUTE PROCEDURE COSTO_PROMEDIO_UNIDAD(CODIGO, FECHA, UNIDAD) returning_values (COSTO);
                EXECUTE PROCEDURE ULTIMO_COSTO(CODIGO, FECHA, UNIDAD) returning_values (ULTCOSTO);
                SELECT MAX(MVAR_FECHA) FROM MOVIMIENTO_ARTICULO WHERE ARTI_COD = :CODIGO AND MVAR_ENTRADA = 'S' AND MVAR_FECHA <= :FECHA INTO :FECHACOSTO;
                COSTOTOT = :CANT * :COSTO;
                CONSUMO = CONSUMO * CANT;
                if (RESERVA = 'S') then
                    BEGIN
                    SELECT SUM(ORID_ENTREGAR)
                        FROM ORDENINVENTARIO_DETALLE OD, ordenes_inventario O
                        WHERE O.ORIN_ID = OD.ORIN_ID AND ARTI_COD = :CODIGO AND ORIN_FECHA <= :FECHA AND ORIN_FECLLEGA >= :FECHA AND ORID_ANULADO = 'N'
                        INTO :ORDENADO;
                        if (ORDENADO IS NULL) then
                            ORDENADO = 0;
                    ORDENC = 0;
                    FOR SELECT O.ORDC_ID, OCDE_ITEM, OCDE_CANT * OCDE_FACTOR
                        FROM ORDENES_COMPRA O, ORDENES_COMPRA_DETALLE OD
                        WHERE O.ORDC_ID = OD.ORDC_ID AND OD.ARTI_COD = :CODIGO AND (ORDC_FECHA+ORDC_VALIDEZ) >= :FECHA AND ORDC_FECHA <= :FECHA AND OCDE_ANULADO = 'N'
                        INTO :ID, :ITEM, :CANT2
                        do
                        BEGIN
                        EXECUTE PROCEDURE FALTANTE(23, 21, ID, ITEM) returning_values (PEDIDO, UND, FACTOR);
                        if (PEDIDO * FACTOR = CANT2) then /* SI NO SE HA FACTURADO MIRE A VER SI SE REMISIONO */
                            EXECUTE PROCEDURE FALTANTE(23, 22, ID, ITEM) returning_values (PEDIDO, UND, FACTOR);
                        if (PEDIDO IS NULL) then
                            PEDIDO = 0;
                        ORDENC = ORDENC + PEDIDO * FACTOR;
                        END
                    ORDENADO = ORDENADO + ORDENC;
                    SELECT SUM(RSDE_LIBERAR)
                        FROM RESERVAS_DETALLE RD, RESERVAS R
                        WHERE R.RESE_ID = RD.RESE_ID AND ARTI_COD = :CODIGO AND RESE_FECHA <= :FECHA AND RESE_VENCE >= :FECHA AND RSDE_ANULADO = 'N'
                        INTO :RESERVADO;
                    if (RESERVADO IS NULL) then
                        RESERVADO = 0;
                    PEDIDO = 0;
                    FOR SELECT P.PEDI_ID, PEDE_ITEM, PEDE_CANT * PEDE_FACTOR
                        FROM PEDIDOS P, PEDIDOS_DETALLE PD, PUNTO_VENTA PT
                        WHERE P.PEDI_ID = PD.PEDI_ID AND PD.ARTI_COD = :CODIGO AND PT.ptvt_id = P.PTVT_ID AND (PEDI_FECHA+PEDI_VALIDEZ) >= :FECHA AND PEDI_FECHA <= :FECHA AND PEDE_ANULADO = 'N'
                        INTO :ID, :ITEM, :CANT2
                        do
                        BEGIN
                        EXECUTE PROCEDURE FALTANTE(34, 31, ID, ITEM) returning_values (ORDENC, UND, FACTOR);
                        if ((ORDENC * FACTOR = CANT2) or (PEDAUTO = 'SI')) then /* SI NO SE HA FACTURADO MIRE A VER SI SE REMISIONO */
                            EXECUTE PROCEDURE FALTANTE(34, 32, ID, ITEM) returning_values (ORDENC, UND, FACTOR);
                        if (ORDENC IS NULL) then
                            ORDENC = 0;
                        PEDIDO = PEDIDO + ORDENC * FACTOR;
                        END
                    if (PEDIDO IS NULL) then
                        PEDIDO = 0;
                    RESERVADO = RESERVADO + PEDIDO;
                    END
                ELSE
                    BEGIN
                    RESERVADO = 0;
                    ORDENADO = 0;
                    END
                if (ENPESO = 'S') then
                    BEGIN
                    if (pesounit IS NULL) then
                        pesounit = 0;
                    if (PESOUNIT <> 0) then
                        BEGIN
                        pesototal = PESOUNIT * cant;
                        SUSPEND;
                        END
                    END
                ELSE
                    SUSPEND;
                END
            END
        END
  END
END

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE INVENTARIO_FAMILIA(
    FECHA DATE,
    FAMILIA VARCHAR(20))
RETURNS (
    ARTICULO VARCHAR(20),
    INTERNO VARCHAR(20),
    DESCRIPCION VARCHAR(60),
    CANTIDAD NUMERIC(18,2),
    UNIDAD VARCHAR(8),
    TOTAL NUMERIC(18,2))
AS
declare variable COSTO NUMERIC(18,4);
begin
FOR SELECT A.ARTI_COD, ARTI_DES, ARTI_UNIDAD, p.pvar_cod FROM ARTICULO A, PROVEEDOR_ARTICULO P
    WHERE ESAR_COD <> 'I' AND A.arti_cod = P.arti_cod AND P.terc_nit = :FAMILIA
    INTO :ARTICULO, :descripcion, :UNIDAD, :INTERNO
    DO
    BEGIN
    EXECUTE PROCEDURE SALDO_INICIAL_TOTAL_INV(ARTICULO, FECHA) returning_values (cantidad);
    EXECUTE PROCEDURE COSTO_PROMEDIO_UNIDAD(ARTICULO, FECHA, UNIDAD) returning_values (COSTO);
    TOTAL = COSTO * CANTIDAD;
    suspend;
    END
end

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE KARDEX_DESDE_HASTA(
    ARTICULO VARCHAR(15),
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    INICIAL_CANT NUMERIC(18,4),
    INICIAL_PESOS NUMERIC(18,2),
    ENT_CANT NUMERIC(18,4),
    ENT_PESOS NUMERIC(18,2),
    SAL_CANT NUMERIC(18,4),
    SAL_PESOS NUMERIC(18,2),
    FINAL_CANT NUMERIC(18,4),
    FINAL_PESOS NUMERIC(18,2))
AS
BEGIN
  EXECUTE PROCEDURE SALDO_INICIAL_TOTAL_INV(ARTICULO, FECINI) returning_values (INICIAL_CANT);
  EXECUTE PROCEDURE VALOR_INICIAL_INVENTARIO(ARTICULO, FECINI) returning_values (INICIAL_PESOS);
  SELECT SUM(COST_ENTC), SUM(COST_ENTP), SUM(COST_SALC), SUM(COST_SALP) FROM COSTOS
    WHERE (COST_FECHA >= :FECINI) AND (COST_FECHA <= :FECFIN) AND
          (ARTI_COD = :ARTICULO)
    INTO :ENT_CANT, :ENT_PESOS, :SAL_CANT, :SAL_PESOS;
  if (ENT_CANT IS NULL) then
    ENT_CANT = 0;
  if (ENT_PESOS IS NULL) then
    ENT_PESOS = 0;
  if (SAL_CANT IS NULL) then
    SAL_CANT = 0;
  if (SAL_PESOS IS NULL) then
    SAL_PESOS = 0;
  FINAL_CANT = INICIAL_CANT + ENT_CANT - SAL_CANT;
  FINAL_PESOS = INICIAL_PESOS + ENT_PESOS - SAL_PESOS;
  SUSPEND;
END

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE REP_EXISTENCIAS_PRECIOS(
    ARTINI VARCHAR(20),
    ARTFIN VARCHAR(20),
    GRPINI VARCHAR(2),
    GRPFIN VARCHAR(2),
    ORDEN CHAR(1),
    LISTA INTEGER,
    FECHA DATE,
    BODINI VARCHAR(2),
    BODFIN VARCHAR(2),
    TODAS CHAR(1),
    IVAINC CHAR(1),
    SINBOD CHAR(1),
    SUBEMPRESA INTEGER)
RETURNS (
    CODIGO VARCHAR(15),
    NOMBRE VARCHAR(60),
    UNIDAD VARCHAR(8),
    CODGRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    CODSUBG VARCHAR(3),
    NOMSUBG VARCHAR(30),
    CODMARC VARCHAR(3),
    NOMMARC VARCHAR(30),
    NOMLISTA VARCHAR(30),
    PRECIO NUMERIC(18,2),
    MARGEN NUMERIC(9,2),
    IVA NUMERIC(9,2),
    CODBOD VARCHAR(2),
    NOMBOD VARCHAR(30),
    CANT NUMERIC(18,4),
    COSTOTOT NUMERIC(18,2))
AS
DECLARE VARIABLE EXIST CHAR(1);
DECLARE VARIABLE CODINI VARCHAR(20);
DECLARE VARIABLE CODFIN VARCHAR(20);
DECLARE VARIABLE DESINI VARCHAR(20);
DECLARE VARIABLE DESFIN VARCHAR(20);
DECLARE VARIABLE FECINI DATE;
DECLARE VARIABLE FECFIN DATE;
DECLARE VARIABLE UTIL NUMERIC(9,2);
DECLARE VARIABLE MOU CHAR(10);
DECLARE VARIABLE LISIVA CHAR(1);
BEGIN
if (ORDEN = 'C') then
    BEGIN
    CODINI = ARTINI;
    CODFIN = ARTFIN;
    DESINI = '';
    DESFIN = 'zz';
    END
ELSE
    BEGIN
    DESINI = ARTINI;
    DESFIN = ARTFIN;
    CODINI = '';
    CODFIN = 'zz';
    END
    
EXECUTE PROCEDURE LEE_CONFIGURACION ('FACTURACION', 'ARTICULOS', 'SUGERIR PRECIOS CON PORCENTAJE DE MARGEN O UTILIDAD') returning_values (MOU);
    
FOR SELECT ARTI_COD, ARTI_DES, ARTI_UNIDAD, ARTI_EXIST, A.GRUP_COD, A.SUBG_COD, A.MARC_COD, TAIV_PORC
    FROM ARTICULO A, TARIFA_IVA T
    WHERE ARTI_COD >= :CODINI AND ARTI_COD <= :CODFIN AND A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :GRPFIN AND
    ARTI_DES >= :DESINI AND ARTI_DES <= :DESFIN AND ESAR_COD <> 'I' AND A.TAIV_COD = T.TAIV_COD
    INTO :CODIGO, :NOMBRE, :UNIDAD, :EXIST, :CODGRUPO, :CODSUBG, :CODMARC, :IVA
    DO
    BEGIN
    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
    if (EXIST <> 'N') then
        BEGIN
        if (LISTA = 255) then
            BEGIN
            if (TODAS = 'N') then
                begin
                /* Busque las listas validas hoy */
                FOR SELECT LIPR_NOM, LIPR_FECINI, LIPR_FECFIN, PRAR_FIJO, PRAR_MARGEN, PRAR_UTIL, LIPR_MODIF
                    FROM LISTA_PRECIOS L, PRECIOS_ARTICULO P
                    WHERE L.LIPR_COD = P.LIPR_COD AND ARTI_COD = :CODIGO
                    INTO :NOMLISTA, :FECINI, :FECFIN, :PRECIO, :MARGEN, :UTIL, :LISIVA
                    DO
                      BEGIN
                      if (MOU = 'UTILIDAD') then
                        MARGEN = UTIL;
                      if (IVAINC = 'S') THEN
                        BEGIN
                        if (LISIVA = 'N') then
                            PRECIO = PRECIO * (1 + (IVA/100));
                        END
                      END
                end   
            ELSE
                FOR SELECT LIPR_NOM, PRAR_FIJO, PRAR_MARGEN, PRAR_UTIL, LIPR_MODIF
                    FROM LISTA_PRECIOS L, PRECIOS_ARTICULO P
                    WHERE L.LIPR_COD = P.LIPR_COD AND ARTI_COD = :CODIGO
                    INTO :NOMLISTA, :PRECIO, :MARGEN, :UTIL, :LISIVA
                    DO
                    BEGIN
                    EXECUTE PROCEDURE LEE_CONFIGURACION ('FACTURACION', 'ARTICULOS', 'SUGERIR PRECIOS CON PORCENTAJE DE MARGEN O UTILIDAD') returning_values (MOU);
                    if (MOU = 'UTILIDAD') then
                        MARGEN = UTIL;
                    if (IVAINC = 'S') THEN
                        BEGIN
                        if (LISIVA = 'N') then
                            PRECIO = PRECIO * (1 + (IVA/100));
                        END
                    END
            END /* 255 */
        ELSE
            BEGIN
            if (TODAS = 'N') then
                begin
                /* Busque las listas validas hoy */
                FOR SELECT LIPR_NOM, LIPR_FECINI, LIPR_FECFIN, PRAR_FIJO, PRAR_MARGEN, PRAR_UTIL, LIPR_MODIF
                    FROM LISTA_PRECIOS L, PRECIOS_ARTICULO P
                    WHERE L.LIPR_COD = P.LIPR_COD AND ARTI_COD = :CODIGO AND L.LIPR_COD = :LISTA
                    INTO :NOMLISTA, :FECINI, :FECFIN, :PRECIO, :MARGEN, :UTIL, :LISIVA
                    DO
                    BEGIN
                    if (MOU = 'UTILIDAD') then
                        MARGEN = UTIL;
                    if (IVAINC = 'S') THEN
                        BEGIN
                        if (LISIVA = 'N') then
                            PRECIO = PRECIO * (1 + (IVA/100));
                        END
                    END
                end
            ELSE
                FOR SELECT LIPR_NOM, PRAR_FIJO, PRAR_MARGEN, PRAR_UTIL
                    FROM LISTA_PRECIOS L, PRECIOS_ARTICULO P
                    WHERE L.LIPR_COD = P.LIPR_COD AND ARTI_COD = :CODIGO AND L.LIPR_COD = :LISTA
                    INTO :NOMLISTA, :PRECIO, :MARGEN, :UTIL
                    DO
                    BEGIN
                    if (MOU = 'UTILIDAD') then
                        MARGEN = UTIL;
                    if (IVAINC = 'S') THEN
                        BEGIN
                        if (LISIVA = 'NO') then
                            PRECIO = PRECIO * (1 + (IVA/100));
                        END
                    END
            END
                      
        if (SINBOD = 'S') then
            BEGIN
            EXECUTE PROCEDURE SALDO_INICIAL_TOTAL_INV(CODIGO, FECHA) returning_values (CANT);
            COSTOTOT = CANT * PRECIO;
            if (FECINI is null) then
                SUSPEND;
            else
                if ((FECINI <= :FECHA) AND (FECFIN >= :FECHA)) Then
                    SUSPEND;
            END
        ELSE
            BEGIN
            FOR SELECT BODE_COD, BODE_NOM FROM BODEGA B
                WHERE BODE_COD >= :BODINI AND BODE_COD <= :BODFIN AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                INTO :CODBOD, :NOMBOD
                DO
                BEGIN
                EXECUTE PROCEDURE SALDO_INICIAL_INVENTARIO(CODIGO, FECHA, :CODBOD) returning_values (CANT);
                        
                COSTOTOT = CANT * PRECIO;
                if (FECINI is null) then
                    SUSPEND;
                else
                    if ((FECINI <= :FECHA) AND (FECFIN >= :FECHA)) Then
                        SUSPEND;
                END
            END
        END
    END
END

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE REP_KARDEX_ARTICULO(
    DETALLE CHAR(1),
    FECINI DATE,
    FECFIN DATE,
    ARTINI VARCHAR(20),
    ARTFIN VARCHAR(20),
    GRPINI VARCHAR(2),
    GRPFIN VARCHAR(2),
    ORDEN CHAR(1),
    BODEGA VARCHAR(2))
RETURNS (
    CODIGO VARCHAR(15),
    NOMBRE VARCHAR(60),
    UNIDAD VARCHAR(8),
    CODGRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    CODSUBG VARCHAR(3),
    NOMSUBG VARCHAR(30),
    CODMARC VARCHAR(3),
    NOMMARC VARCHAR(30),
    CODBOD VARCHAR(2),
    SALDOINI NUMERIC(18,4),
    COSTOINI NUMERIC(18,2),
    ENTRADAS NUMERIC(18,4),
    COSTOENT NUMERIC(18,2),
    SALIDAS NUMERIC(18,4),
    COSTOSAL NUMERIC(18,2),
    SALDOFIN NUMERIC(18,4),
    COSTOFIN NUMERIC(18,2),
    TIPODOC VARCHAR(8),
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    CONCEPTO VARCHAR(60),
    NIT VARCHAR(20),
    CONS INTEGER,
    CANFINAL NUMERIC(18,4),
    COSFINAL NUMERIC(18,2))
AS
DECLARE VARIABLE ENTRADA CHAR(1);
DECLARE VARIABLE CANT NUMERIC(18,4);
DECLARE VARIABLE COSTO NUMERIC(18,2);
DECLARE VARIABLE CODINI VARCHAR(20);
DECLARE VARIABLE CODFIN VARCHAR(20);
DECLARE VARIABLE DESINI VARCHAR(20);
DECLARE VARIABLE DESFIN VARCHAR(20);
BEGIN
if (ORDEN = 'C') then
    BEGIN
    CODINI = ARTINI;
    CODFIN = ARTFIN;
    DESINI = '';
    DESFIN = 'zz';
    END
ELSE
    BEGIN
    DESINI = ARTINI;
    DESFIN = ARTFIN;
    CODINI = '';
    CODFIN = 'zz';
    END
  FOR
    SELECT ARTI_COD, ARTI_DES, ARTI_UNIDAD, A.GRUP_COD, A.SUBG_COD, A.MARC_COD
      FROM ARTICULO A
      WHERE ARTI_COD >= :CODINI AND ARTI_COD <= :CODFIN AND A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :GRPFIN AND ARTI_DES >= :DESINI AND ARTI_DES <= :DESFIN AND A.ESAR_COD <> 'I'
      INTO :CODIGO, :NOMBRE, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
      DO
        BEGIN
        NOMMARC = '';
        NOMSUBG = '';
        SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
        SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
        SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
        if (BODEGA = '') then
            BEGIN
            EXECUTE PROCEDURE SALDO_INICIAL_TOTAL_INV(CODIGO, FECINI) returning_values (:SALDOINI);
            EXECUTE PROCEDURE VALOR_INICIAL_INVENTARIO(CODIGO, FECINI) returning_values (COSTOINI);
            END
        ELSE
            BEGIN
            EXECUTE PROCEDURE SALDO_INICIAL_INVENTARIO(CODIGO, FECINI, :BODEGA) returning_values (SALDOINI);
            EXECUTE PROCEDURE COSTO_PROMEDIO(CODIGO, FECINI-1) returning_values (COSTOINI);
            COSTOINI = COSTOINI * saldoini;
            END
        if (DETALLE = 'N') then
            BEGIN
            /* SUME LAS ENTRADAS */
            if (BODEGA = '') then
              SELECT SUM(COST_ENTC), SUM(COST_ENTP), SUM(COST_SALC), SUM(COST_SALP) FROM COSTOS
                WHERE (COST_FECHA >= :FECINI) AND (COST_FECHA <= :FECFIN) AND (ARTI_COD = :codigo)
                INTO :ENTRADAS, :COSTOENT, :SALIDAS, :COSTOSAL;
            ELSE
              SELECT SUM(COST_ENTC), SUM(COST_ENTP), SUM(COST_SALC), SUM(COST_SALP)
                FROM COSTOS C, MOVIMIENTO_ARTICULO M
                WHERE (COST_FECHA >= :FECINI) AND (COST_FECHA <= :FECFIN) AND (C.ARTI_COD = :codigo) AND C.cost_idmov = M.mvar_cons AND BODE_COD = :BODEGA
                INTO :ENTRADAS, :COSTOENT, :SALIDAS, :COSTOSAL;

            if (ENTRADAS IS NULL) then
              ENTRADAS = 0;
            if (COSTOENT IS NULL) then
              COSTOENT = 0;
            if (SALIDAS IS NULL) then
              SALIDAS = 0;
            if (COSTOSAL IS NULL) then
              COSTOSAL = 0;
            SALDOFIN = SALDOINI + ENTRADAS - SALIDAS;
            COSTOFIN = COSTOINI + COSTOENT - COSTOSAL;
            if (BODEGA = '') then
                BEGIN
                EXECUTE PROCEDURE SALDO_INICIAL_TOTAL_INV(CODIGO, fecfin+1) returning_values (canfinal);
                EXECUTE PROCEDURE VALOR_INICIAL_INVENTARIO(CODIGO, FECFIN+1) returning_values (cosfinal);
                END
            ELSE
                BEGIN
                EXECUTE PROCEDURE SALDO_INICIAL_INVENTARIO(CODIGO, FECFIN+1, :BODEGA) returning_values (CANFINAL);
                EXECUTE PROCEDURE COSTO_PROMEDIO(CODIGO, FECFIN+1) returning_values (COSFINAL);
                COSFINAL = COSFINAL * CANFINAL;
                END
            SUSPEND;
            END
        ELSE
            BEGIN
            SALDOFIN = SALDOINI;
            COSTOFIN = COSTOINI;
            COSTOENT = 0;
            COSTOSAL = 0;
            FOR SELECT TIDO_NOMCORTO, MVAR_ENTRADA, MVAR_PREF, MVAR_NUMERO, MVAR_CANT, MVAR_COSTO, MVAR_CONC, MVAR_FECHA, M.TERC_NIT, MVAR_CONS, BODE_COD, COST_SALDOP, COST_SALDOC
                FROM MOVIMIENTO_ARTICULO M, TIPO_DOCUMENTO TD, COSTOS C
                WHERE TD.TIDO_COD = MVAR_TIPODOC AND (MVAR_FECHA >= :FECINI) AND (MVAR_FECHA <= :FECFIN) AND (MVAR_TIPODOC <> 13) AND (m.ARTI_COD = :CODIGO) AND M.mvar_cons = C.cost_idmov
                ORDER BY MVAR_FECHA, MVAR_CONS
                INTO :TIPODOC, :ENTRADA, :PREFIJO, :NUMERO, :ENTRADAS, :COSTOENT, :CONCEPTO, :FECHA, :NIT, :CONS, :CODBOD, :costo, :cant
                DO
                    BEGIN
                    if (ENTRADA = 'S') then
                        BEGIN
                        SALIDAS = 0;
                        SALDOFIN = SALDOFIN + ENTRADAS;
                        COSTOFIN = COSTOFIN + (ENTRADAS * COSTOENT);
                        if (CANT > 0) then
                            COSTOSAL = COSTO / CANT;
                        else
                            COSTOSAL = 0;
                        end
                    ELSE
                        BEGIN
                        SALIDAS = ENTRADAS;
                        ENTRADAS = 0;
                        if (CANT > 0) then
                            COSTOSAL = COSTO / CANT;
                        else
                            COSTOSAL = 0;
                        SALDOFIN = SALDOFIN - SALIDAS;
                        COSTOFIN = COSTOFIN - (SALIDAS * costosal);
                        END
                    SUSPEND;
                    END
            END
        END
END

^

SET TERM ; ^


/* 20090127 RUTEROS DICOM */

ALTER TABLE RUTERO
ADD NUMOK T_BOOLEANO;

SET TERM ^ ;

create trigger RUTERO_BI for RUTERO
active BEFORE INSERT position 0
as
declare variable NUMERO VARCHAR(6);
declare variable AUTOM CHAR(1);
declare variable EXISTE CHAR(1);
declare variable FECSERVER CHAR(2);
BEGIN
EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION', 'DOCUMENTOS', 'INHABILITAR FECHA EN DOCUMENTOS') returning_values (:fecserver);
if (FECSERVER = 'SI') then
    NEW.rute_fecha = CAST ('NOW' AS DATE);
if (NEW.numok = 'N') then
    BEGIN
    /* Actualice el contador del prefijo */
    SELECT PREF_ACTUAL, PREF_AUTO FROM PREFIJOS WHERE TIDO_COD = 37 AND PREF_PRE = NEW.PREF_PRE INTO :NUMERO, :AUTOM;
    /* ACTUALICE EL NUMERO EN ENCABEZADO  */
    if (AUTOM = 'S') then
        BEGIN
        NEW.rute_numero = NUMERO;
        NUMERO = CAST((CAST(NUMERO AS INTEGER) + 1) AS CHAR(6));
        UPDATE PREFIJOS
            SET PREF_ACTUAL = :NUMERO
            WHERE TIDO_COD = 37 AND PREF_PRE = NEW.PREF_PRE;
        END
    ELSE
        BEGIN
        if (CAST(NUMERO AS INTEGER) = CAST(NEW.rute_numero AS INTEGER)) then
            UPDATE PREFIJOS
                SET PREF_ACTUAL = CAST((CAST(PREF_ACTUAL AS INTEGER) + 1) AS CHAR(6))
                WHERE TIDO_COD = 37 AND PREF_PRE = NEW.PREF_PRE;
        END
    EXECUTE PROCEDURE COMPLETA_CEROS (NEW.rute_numero) returning_values (NEW.rute_numero);
    NEW.numok = 'S';
    END
  /* Verifique que el numero no existe previamente */
  EXISTE = 'N';
  SELECT 'S' FROM rutero WHERE PREF_PRE = NEW.PREF_PRE AND RUTE_NUMERO = NEW.rute_numero INTO :EXISTE;
  if (EXISTE = 'S') then
    EXCEPTION DOCUMENTO_REGISTRADO 'Ya existe un rutero con el número ' || new.pref_pre || new.rute_numero;
end
^

SET TERM ; ^


CREATE EXCEPTION RUTA_NO_EXISTE 'Ruta de entregas no encontrada';

CREATE EXCEPTION VEHICULO_NO_EXISTE 'No se encontró el vehículo';

SET TERM ^ ;

CREATE OR ALTER TRIGGER TI_RUTERO FOR RUTERO
ACTIVE BEFORE INSERT POSITION 0
AS
DECLARE VARIABLE NUMROWS INTEGER;
BEGIN
    /*  PARENT 'PUNTO_VENTA' MUST EXIST WHEN INSERTING A CHILD IN 'FACTURAS'  */
    IF (NEW.rute_ruta IS NOT NULL) THEN
    BEGIN
       SELECT COUNT(*)
       FROM   rutas_entrega
       WHERE  rutas_entrega.ruta_id = NEW.rute_ruta
       INTO   :NUMROWS;
       IF (NUMROWS = 0) THEN
       BEGIN
          EXCEPTION RUTA_NO_EXISTE;
       END
    END
    /*  PARENT 'VENDEDORES' MUST EXIST WHEN INSERTING A CHILD IN 'FACTURAS'  */
    IF (NEW.rute_vehiculo IS NOT NULL) THEN
    BEGIN
       SELECT COUNT(*)
       FROM   vehiculos
       WHERE  vehiculos.vehi_cod = NEW.rute_vehiculo
       INTO   :NUMROWS;
       IF (NUMROWS = 0) THEN
       BEGIN
          EXCEPTION vehiculo_no_existe;
       END
    END
    /*  PARENT 'CLIENTES' MUST EXIST WHEN INSERTING A CHILD IN 'FACTURAS'  */
    IF (NEW.rute_conductor IS NOT NULL) THEN
    BEGIN
       SELECT COUNT(*)
       FROM   terceros
       WHERE  terceros.TERC_NIT = NEW.rute_conductor
       INTO   :NUMROWS;
       IF (NUMROWS = 0) THEN
       BEGIN
          EXCEPTION tercero_no_existe;
       END
    END
END
^

SET TERM ; ^

SET TERM ^ ;

create trigger RUTERO_AI for RUTERO
active AFTER INSERT position 0
as
begin
INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
    VALUES (USER, 37, NEW.rute_id, 'I', NEW.pref_pre || NEW.rute_numero);
end
^

SET TERM ; ^

SET TERM ^ ;

create trigger RUTERO_AU for RUTERO
active AFTER UPDATE position 0
as
begin
if (NEW.rute_anulado = 'S') then
    BEGIN
    INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
        VALUES (USER, 37, NEW.rute_id, 'A', NEW.pref_pre || NEW.rute_numero);
    END
ELSE
    INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
        VALUES (USER, 37, NEW.rute_id, 'U', NEW.pref_pre || NEW.rute_numero);
/* ACTUALICE EL ANULADO EN LOS DETALLES */
if (OLD.rute_anulado <> NEW.rute_anulado) then
    UPDATE RUTERO_DETALLE SET RUTD_ANULADO = NEW.rute_anulado WHERE RUTE_ID = NEW.rute_id;
if ((OLD.rute_transmit <> NEW.rute_transmit)) then
    UPDATE RUTERO_DETALLE SET RUTD_TRANSMIT = NEW.rute_transmit WHERE RUTE_ID = NEW.rute_id;
end
^

SET TERM ; ^

SET TERM ^ ;

create trigger RUTERO_AD for RUTERO
active AFTER DELETE position 0
as
begin
INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
    VALUES (USER, 37, OLD.rute_id, 'D', OLD.pref_pre || OLD.rute_numero);
end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER PROCEDURE FACTURAS_RUTERO(
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    ID INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    CLIENTE VARCHAR(20),
    SUCURSAL VARCHAR(10),
    NOMBRE VARCHAR(60),
    DIR VARCHAR(60),
    VEND INTEGER,
    NOMVEND VARCHAR(60),
    ZONA VARCHAR(2),
    NOMZONA VARCHAR(60),
    MONTO NUMERIC(18,2),
    CAJAS NUMERIC(18,4))
AS
begin
FOR SELECT FACT_ID, PREF_PRE, FACT_NUMERO, FACT_FECHA, TERC_NIT, FACT_SUCURSAL, FACT_NOMCLIENTE, VEND_COD, FACT_TOTAL
    FROM FACTURAS F WHERE FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND FACT_ANULADO = 'N' AND
    NOT EXISTS (SELECT RUTE_ID FROM RUTERO_DETALLE WHERE RUTD_FACTID = F.fact_id AND RUTD_ANULADO = 'N')
    INTO :ID, :PREF, :NUMERO, :FECHA, :CLIENTE, :SUCURSAL, :NOMBRE, :VEND, :MONTO
    DO
    BEGIN
    SELECT SUM(FADE_CAJAS) FROM FACTURAS_DETALLE WHERE FACT_ID = :ID INTO :CAJAS;
    SELECT CLSU_DIR FROM CLIENTE_SUCURSALES WHERE TERC_NIT = :cliente AND CLCU_COD = :sucursal INTO :dir;
    SELECT VEND_NOMBRE FROM vendedores WHERE VEND_COD = :vend INTO :nomvend;
    SELECT C.zona_cod, ZONA_NOM FROM ZONAS Z, CLIENTES C WHERE Z.zona_nom = C.zona_cod AND C.terc_nit = :cliente INTO :zona, :nomzona;
    suspend;
    END
end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure RUTERO_CONSOLIDADO_ARTICULO (
    ID INTEGER)
returns (
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    NOMRUTA VARCHAR(60),
    RUTA INTEGER,
    CONDUCTOR VARCHAR(20),
    NOMCOND VARCHAR(60),
    AUXILIAR1 VARCHAR(20),
    NOMAUX1 VARCHAR(60),
    AUXILIAR2 VARCHAR(20),
    NOMAUX2 VARCHAR(60),
    VEHICULO VARCHAR(8),
    ASEGURA VARCHAR(60),
    HORASAL TIME,
    CODIGO VARCHAR(20),
    DESCRIPCION VARCHAR(60),
    REFERENCIA VARCHAR(20),
    BODEGA VARCHAR(2),
    STAND VARCHAR(20),
    CANT NUMERIC(18,4),
    UNIDAD VARCHAR(8),
    CAJAS NUMERIC(18,4)    )
as
begin
  SELECT PREF_PRE, RUTE_NUMERO, RUTE_FECHA, RUTE_VEHICULO, RUTE_RUTA, E.ruta_nom,
        RUTE_CONDUCTOR, RUTE_NOMCOND, RUTE_ASEGURA, RUTE_HORA, RUTE_AUXILIAR1, RUTE_AUXILIAR2
  FROM rutero R, rutas_entrega E
  WHERE R.rute_ruta = E.ruta_id AND R.rute_id = :ID
  INTO :PREFIJO, :NUMERO, :FECHA, :vehiculo, :ruta, :nomruta,
        :conductor, :nomcond, :asegura, :horasal, :auxiliar1, :auxiliar2;
  SELECT TERC_NOM FROM TERCEROS WHERE TERC_NIT = :auxiliar1 INTO :nomaux1;
  SELECT TERC_NOM FROM TERCEROS WHERE TERC_NIT = :auxiliar2 INTO :nomaux2;
  FOR SELECT MAX(D.ARTI_COD), SUM(FADE_CANT*FADE_FACTOR), MAX(BODE_COD), SUM(FADE_CAJAS)
    FROM FACTURAS_DETALLE D, rutero_detalle R WHERE R.rute_id = :id AND R.rutd_factid = D.fact_id
    GROUP BY BODE_COD, ARTI_COD
    INTO :CODIGO, :CANT, :bodega,  :CAJAS
    DO
    begin
    SELECT ARTI_DES, ARTI_UNIDAD FROM ARTICULO WHERE ARTI_COD = :CODIGO INTO :descripcion, :unidad;
    SELECT MAX(COBA_COD) FROM BARRAS_ARTICULO WHERE ARTI_COD = :CODIGO INTO :referencia;
    SELECT STAND_COD FROM STANDS WHERE ARTI_COD = :codigo AND STAND_BODEGA = :bodega INTO :stand;
    suspend;
    end
end
^

SET TERM ; ^

GRANT EXECUTE ON PROCEDURE RUTERO_CONSOLIDADO_ARTICULO TO PUBLIC;

/* 20090127B SUSPEND AL FINAL REPETIA EL ULTIMO REGISTRO */

SET TERM ^ ;

CREATE OR ALTER PROCEDURE MOVIMIENTO_CARTERA_MES(
    FECINI DATE,
    FECFIN DATE,
    SUBEMPRESA INTEGER,
    CONTADO CHAR(1),
    MONEDA INTEGER)
RETURNS (
    NIT VARCHAR(20),
    NOMBRE VARCHAR(60),
    CONTACTO VARCHAR(60),
    DIASMAX INTEGER,
    TELEFONO VARCHAR(40),
    INICIAL NUMERIC(18,2),
    DEBITOS NUMERIC(18,2),
    CREDITOS NUMERIC(18,2),
    ABONOS NUMERIC(18,2),
    FINAL NUMERIC(18,2))
AS
declare variable RETES CHAR(2);
declare variable TIPODOC INTEGER;
declare variable IDDOC INTEGER;
declare variable SALDO NUMERIC(18,2);
declare variable NUMROWS INTEGER;
declare variable DIASF INTEGER;
declare variable DIAS INTEGER;
DECLARE VARIABLE FOV CHAR(11);
BEGIN
EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'ANALISIS DE CARTERA CON FECHA FACTURA O VENCIMIENTO') RETURNING_VALUES (FOV);
for select TERC_NIT, TERC_NOM, TERC_CONTACTO, TERC_TEL from TERCEROS WHERE TERC_CLIE = 'S' into :NIT, :NOMBRE, :CONTACTO, :TELEFONO
  DO
    BEGIN
    diasmax = 0;
    SELECT COUNT(*) FROM AUTORIZACIONES WHERE AUTO_NITCONTADO = :NIT INTO :numrows;
    IF ((CONTADO = 'S') or (numrows = 0)) THEN
        BEGIN
        FECINI = FECINI - 1;
        INICIAL = 0;
        FOR SELECT MVCL_TIPOREF, MVCL_IDREF, (:FECFIN-MVCL_FECHA), (:FECFIN-MVCL_VENCE) FROM MOVIMIENTO_CLIENTES
            WHERE TERC_NIT = :NIT AND MVCL_FECHA <= :FECINI AND
            MVCL_ABONO = 'N' AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA)) AND
            ((:moneda = 0) or (MVCL_TRM <> 1))
            INTO :TIPODOC, :IDDOC, :DIASF, DIAS
            DO
            BEGIN
            EXECUTE PROCEDURE saldo_doc_cartera(TIPODOC, IDDOC, FECINI, MONEDA) returning_values (SALDO);
            if (SALDO <> 0) then
                BEGIN
                INICIAL = INICIAL + SALDO;
                if (FOV = 'FECHA') then
                    BEGIN
                    if ((SALDO > 0) AND (DIASMAX < DIASF)) then
                        DIASMAX = DIASF;
                    END
                ELSE
                    BEGIN
                    if ((SALDO > 0) AND (DIASMAX < DIAS)) then
                        DIASMAX = DIAS;
                    END
                END
            END
        EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'DESCONTAR RETENCIONES POR CAUSACION') returning_values(:RETES);
        FECINI = FECINI + 1;
        if (RETES = 'SI') then
            BEGIN
            if (MONEDA = 0) then
                BEGIN
                SELECT SUM(MVCL_MONTO-MVCL_RTEFTE-MVCL_RTEIVA-MVCL_RTEICA), MAX(:FECFIN-MVCL_FECHA), MAX(:FECFIN-MVCL_VENCE) FROM movimiento_clientes
                    WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND MVCL_FECHA < :FECFIN
                    AND MVCL_DEBITO = 'S' AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA))
                    INTO :DEBITOS, :diasf, :dias;
                SELECT SUM(MVCL_MONTO-MVCL_RTEFTE-MVCL_RTEIVA-MVCL_RTEICA) FROM movimiento_clientes
                    WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND MVCL_FECHA < :FECFIN
                    AND MVCL_DEBITO = 'N' AND MVCL_ABONO = 'N' and MVCL_TIPOREF <> 45 AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA))
                    INTO :CREDITOS;
                SELECT SUM(MVCL_MONTO) FROM movimiento_clientes
                    WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND MVCL_FECHA < :FECFIN
                    AND MVCL_ABONO = 'S' AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA))
                    INTO :ABONOS;
                END
            ELSE
                BEGIN
                SELECT SUM((MVCL_MONTO-MVCL_RTEFTE-MVCL_RTEIVA-MVCL_RTEICA)/MVCL_TRM), MAX(:FECFIN-MVCL_FECHA), MAX(:FECFIN-MVCL_VENCE) FROM movimiento_clientes
                    WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND MVCL_FECHA < :FECFIN
                    AND MVCL_DEBITO = 'S' AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA))
                    INTO :DEBITOS, :diasf, :dias;
                SELECT SUM((MVCL_MONTO-MVCL_RTEFTE-MVCL_RTEIVA-MVCL_RTEICA)/MVCL_TRM) FROM movimiento_clientes
                    WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND MVCL_FECHA < :FECFIN
                    AND MVCL_DEBITO = 'N' AND MVCL_ABONO = 'N' and MVCL_TIPOREF <> 45 AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA))
                    INTO :CREDITOS;
                SELECT SUM(MVCL_MONTO/MVCL_TRM) FROM movimiento_clientes
                    WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND MVCL_FECHA < :FECFIN
                    AND MVCL_ABONO = 'S' AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA))
                    INTO :ABONOS;
                END
            END
        ELSE
            BEGIN
            if (MONEDA = 0) then
                BEGIN
                SELECT SUM(MVCL_MONTO), MAX(:FECFIN-MVCL_FECHA), MAX(:FECFIN-MVCL_VENCE) FROM movimiento_clientes
                    WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND MVCL_FECHA < :FECFIN
                    AND MVCL_DEBITO = 'S' AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA))
                    INTO :DEBITOS, :diasf, :dias;
                SELECT SUM(MVCL_MONTO) FROM movimiento_clientes
                    WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND MVCL_FECHA < :FECFIN
                    AND MVCL_DEBITO = 'N' AND MVCL_ABONO = 'N' and MVCL_TIPOREF <> 45 AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA))
                    INTO :CREDITOS;
                SELECT SUM(MVCL_MONTO+MVCL_RTEFTE+MVCL_RTEIVA+MVCL_RTEICA) FROM movimiento_clientes
                    WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND MVCL_FECHA < :FECFIN
                    AND MVCL_ABONO = 'S' AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA))
                    INTO :ABONOS;
                END
            ELSE
                BEGIN
                SELECT SUM(MVCL_MONTO/MVCL_TRM), MAX(:FECFIN-MVCL_FECHA), MAX(:FECFIN-MVCL_VENCE) FROM movimiento_clientes
                    WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND MVCL_FECHA < :FECFIN
                    AND MVCL_DEBITO = 'S' AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA))
                    INTO :DEBITOS, :diasf, :dias;
                SELECT SUM(MVCL_MONTO/MVCL_TRM) FROM movimiento_clientes
                    WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND MVCL_FECHA < :FECFIN
                    AND MVCL_DEBITO = 'N' AND MVCL_ABONO = 'N' and MVCL_TIPOREF <> 45 AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA))
                    INTO :CREDITOS;
                SELECT SUM((MVCL_MONTO+MVCL_RTEFTE+MVCL_RTEIVA+MVCL_RTEICA)/MVCL_TRM) FROM movimiento_clientes
                    WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND MVCL_FECHA < :FECFIN
                    AND MVCL_ABONO = 'S' AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA))
                    INTO :ABONOS;
                END
            END
        if (FOV = 'FECHA') then
            BEGIN
            if ((DIASMAX < DIASF) AND (DIASF IS NOT NULL)) then
                DIASMAX = DIASF;
            END
        ELSE
            BEGIN
            if ((DIASMAX < DIAS) AND (DIAS IS NOT NULL)) then
                DIASMAX = DIAS;
            END
        if (DEBITOS IS NULL) then
            DEBITOS = 0;
        if (CREDITOS IS NULL) then
            CREDITOS = 0;
        if (ABONOS IS NULL) then
            ABONOS = 0;
        FINAL = INICIAL + DEBITOS - CREDITOS - ABONOS;
        SUSPEND;
        END
    END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER PROCEDURE CHEQUEO_SALDOS_DOC_CARTERA(
    CLIINI VARCHAR(20),
    CLIFIN VARCHAR(20))
RETURNS (
    ERROR VARCHAR(60),
    TIPO INTEGER,
    ID INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(6))
AS
declare variable FECHA DATE;
declare variable NIT VARCHAR(20);
declare variable RTFTE NUMERIC(18, 2);
declare variable RTIVA NUMERIC(18, 2);
declare variable RTICA NUMERIC(18, 2);
declare variable MONTO NUMERIC(18, 2);
declare variable EXISTE CHAR(1);
declare variable IDR INTEGER;
declare variable RECAID INTEGER;
declare variable TRM NUMERIC(18, 2);
BEGIN
DELETE FROM SALDOS_DOC_CARTERA WHERE TERC_NIT >= :CLIINI AND TERC_NIT <= :CLIFIN;
DELETE FROM ANTICIPOS_CLIENTE WHERE RECA_ID = 0;

FOR SELECT FACT_ID, FACT_FECHA, TERC_NIT, FACT_RTFTEMONTO, FACT_rtivamonto, FACT_rticamonto, FACT_TOTAL, FACT_TRM
    FROM FACTURAS WHERE FACT_ID <> 0 and fact_anulado = 'N' AND TERC_NIT >= :CLIINI AND TERC_NIT <= :CLIFIN
    ORDER BY FACT_FECHA
    INTO :ID, :FECHA, :nit,  :RTFTE, :RTIVA, :RTICA, :MONTO, :TRM
    DO
    INSERT INTO SALDOS_DOC_CARTERA (SDCA_TIPOREF, SDCA_IDREF, SDCA_FECHA, TERC_NIT, SDCA_RTFTE, SDCA_RTIVA, SDCA_RTICA, SDCA_ABONO, SDCA_ABRTFTE, SDCA_ABRTIVA, SDCA_ABRTICA, SDCA_DEBITO, SDCA_MONTO, SDCA_TRM)
        VALUES (31, :ID, :fecha, :nit, :rtfte, :rtiva, :rtica, 0, 0, 0, 0, 'S', :MONTO, :TRM);

FOR SELECT NDCL_ID, NDCL_FECHA, TERC_NIT, NDCL_RTFTEMONTO, NDCL_rtivamonto, NDCL_rticamonto, ndcl_monto+ndcl_ivamonto, NDCL_TRM
    FROM NOTAS_DEBITO_CLIENTES WHERE NDCL_ID <> 0 and NDCL_anulado = 'N'  AND TERC_NIT >= :CLIINI AND TERC_NIT <= :CLIFIN
    ORDER BY NDCL_FECHA
    INTO :ID, :FECHA, :nit,  :RTFTE, :RTIVA, :RTICA, :MONTO, :TRM
    DO
    INSERT INTO SALDOS_DOC_CARTERA (SDCA_TIPOREF, SDCA_IDREF, SDCA_FECHA, TERC_NIT, SDCA_RTFTE, SDCA_RTIVA, SDCA_RTICA, SDCA_ABONO, SDCA_ABRTFTE, SDCA_ABRTIVA, SDCA_ABRTICA, SDCA_DEBITO, SDCA_MONTO, SDCA_TRM)
        VALUES (41, :ID, :fecha, :nit, :rtfte, :rtiva, :rtica, 0, 0, 0, 0, 'S', :MONTO, :TRM);

FOR SELECT DVCH_ID, DVCH_FECHA, TERC_NIT, 0, 0, 0, DVCH_MONTO
    FROM devolucion_cheques WHERE DVCH_ID <> 0 and DVCH_anulado = 'N' AND DVCH_CARTERA = 'S'  AND TERC_NIT >= :CLIINI AND TERC_NIT <= :CLIFIN
    ORDER BY DVCH_FECHA
    INTO :ID, :FECHA, :nit,  :RTFTE, :RTIVA, :RTICA, :MONTO
    DO
    INSERT INTO SALDOS_DOC_CARTERA (SDCA_TIPOREF, SDCA_IDREF, SDCA_FECHA, TERC_NIT, SDCA_RTFTE, SDCA_RTIVA, SDCA_RTICA, SDCA_ABONO, SDCA_ABRTFTE, SDCA_ABRTIVA, SDCA_ABRTICA, SDCA_DEBITO, SDCA_MONTO, SDCA_TRM)
        VALUES (77, :ID, :fecha, :nit, :rtfte, :rtiva, :rtica, 0, 0, 0, 0, 'S', :MONTO, 1);

FOR SELECT DEVT_ID, DEVT_FECHA, TERC_NIT, DEVT_RTFTEMONTO, DEVT_rtivamonto, DEVT_rticamonto, devt_total, DEVT_TRM
    FROM DEVOLUCIONES_VENTAS WHERE DEVT_ID <> 0 and DEVT_anulado = 'N' AND TERC_NIT >= :CLIINI AND TERC_NIT <= :CLIFIN
    ORDER BY DEVT_FECHA
    INTO :ID, :FECHA, :nit,  :RTFTE, :RTIVA, :RTICA, :MONTO, :TRM
    DO
    INSERT INTO SALDOS_DOC_CARTERA (SDCA_TIPOREF, SDCA_IDREF, SDCA_FECHA, TERC_NIT, SDCA_RTFTE, SDCA_RTIVA, SDCA_RTICA, SDCA_ABONO, SDCA_ABRTFTE, SDCA_ABRTIVA, SDCA_ABRTICA, SDCA_DEBITO, SDCA_MONTO, SDCA_TRM)
        VALUES (33, :ID, :fecha, :nit, :rtfte*-1, :rtiva*-1, :rtica*-1, 0, 0, 0, 0, 'N', :MONTO * -1, :TRM);

FOR SELECT NCCL_ID, NCCL_FECHA, TERC_NIT, NCCL_RTFTEMONTO, NCCL_rtivamonto, NCCL_rticamonto, nccl_monto+nccl_ivamonto, NCCL_TRM
    FROM NOTAS_CREDITO_CLIENTES WHERE NCCL_ID <> 0 and NCCL_anulado = 'N' AND TERC_NIT >= :CLIINI AND TERC_NIT <= :CLIFIN
    ORDER BY NCCL_FECHA
    INTO :ID, :FECHA, :nit,  :RTFTE, :RTIVA, :RTICA, :MONTO, :TRM
    DO
    INSERT INTO SALDOS_DOC_CARTERA (SDCA_TIPOREF, SDCA_IDREF, SDCA_FECHA, TERC_NIT, SDCA_RTFTE, SDCA_RTIVA, SDCA_RTICA, SDCA_ABONO, SDCA_ABRTFTE, SDCA_ABRTIVA, SDCA_ABRTICA, SDCA_DEBITO, SDCA_MONTO, SDCA_TRM)
        VALUES (42, :ID, :fecha, :nit, :rtfte*-1, :rtiva*-1, :rtica*-1, 0, 0, 0, 0, 'N', :MONTO * -1, :TRM);

FOR SELECT ANCL_ID, ANCL_FECHA, TERC_NIT, ANCL_RTFTEMONTO, ANCL_rtivamonto, ANCL_rticamonto, ancl_base+ancl_ivamonto, ANCL_TRM
    FROM ANTICIPOS_CLIENTE WHERE ANCL_ID <> 0 and ANCL_anulado = 'N' AND TERC_NIT >= :CLIINI AND TERC_NIT <= :CLIFIN
    ORDER BY ANCL_FECHA
    INTO :ID, :FECHA, :nit,  :RTFTE, :RTIVA, :RTICA, :MONTO, :TRM
    DO
    INSERT INTO SALDOS_DOC_CARTERA (SDCA_TIPOREF, SDCA_IDREF, SDCA_FECHA, TERC_NIT, SDCA_RTFTE, SDCA_RTIVA, SDCA_RTICA, SDCA_ABONO, SDCA_ABRTFTE, SDCA_ABRTIVA, SDCA_ABRTICA, SDCA_DEBITO, SDCA_MONTO, SDCA_TRM)
        VALUES (45, :ID, :fecha, :nit, :rtfte*-1, :rtiva*-1, :rtica*-1, 0, 0, 0, 0, 'N', :MONTO * -1, :TRM);

FOR SELECT ACDE_TIPODOC, ACDE_IDDOC, APCL_FECHA, TERC_NIT, ACDE_APLICADO, ACDE_RTFTE, ACDE_RTIVA, ACDE_RTICA, A.apcl_trm
    FROM APLICACION_CLIENTE_DETALLE D, APLICACION_CLIENTE A
    WHERE A.APCL_ID = D.apcl_id AND A.APCL_ID <> 0 AND APCL_ANULADO = 'N' AND TERC_NIT >= :CLIINI AND TERC_NIT <= :CLIFIN
    ORDER BY APCL_FECHA
    INTO :TIPO, :ID, :FECHA, :NIT, :MONTO, :RTFTE, :RTIVA, :RTICA, :TRM
    DO
    BEGIN
    EXISTE = 'N';
    select 'S' from saldos_doc_cartera where sdca_tiporef = :TIPO and sdca_idref = :ID and sdca_fecha = :fecha into :EXISTE;
    if (Existe = 'S') then
        begin
        /* actualice el saldo del dia */
        UPDATE saldos_doc_cartera
            SET SDCA_ABONO = SDCA_ABONO + :MONTO,
                SDCA_ABRTFTE = SDCA_ABRTFTE + :RTFTE,
                SDCA_ABRTIVA = SDCA_ABRTIVA + :RTIVA,
                SDCA_ABRTICA = SDCA_ABRTICA + :RTICA,
                SDCA_TRM = :TRM
            WHERE SDCA_TIPOREF = :TIPO AND SDCA_IDREF = :ID AND SDCA_FECHA = :fecha;
        END
    ELSE
        BEGIN
        /* Inserte un nuevo saldo diario */
        INSERT INTO SALDOS_DOC_CARTERA (SDCA_TIPOREF, SDCA_IDREF, SDCA_FECHA, TERC_NIT, SDCA_RTFTE, SDCA_RTIVA, SDCA_RTICA, SDCA_ABONO, SDCA_ABRTFTE, SDCA_ABRTIVA, SDCA_ABRTICA, SDCA_DEBITO, SDCA_MONTO, SDCA_TRM)
            VALUES (:TIPO, :ID, :fecha, :NIT, 0, 0, 0, :MONTO, :rtfte, :rtiva, :rtica, 'N', 0, :TRM);
        END
    END

FOR SELECT R.RECA_ID, RCDE_TIPODOC, RCDE_IDDOC, RECA_FECHA, TERC_NIT, RCDE_ABONO+RCDE_DTOF, RCDE_RTFTE, RCDE_RTIVA, RCDE_RTICA, RECA_TRM
    FROM RECIBOS_CAJA_DETALLE D, RECIBOS_CAJA R
    WHERE R.RECA_ID = D.RECA_id AND R.RECA_ID <> 0 AND RECA_ANULADO = 'N' AND TERC_NIT >= :CLIINI AND TERC_NIT <= :CLIFIN
    ORDER BY RECA_FECHA
    INTO :IDR, :TIPO, :ID, :FECHA, :NIT, :MONTO, :RTFTE, :RTIVA, :RTICA, :TRM
    DO
    BEGIN
    EXISTE = 'N';
    if (TIPO = 45) then
        BEGIN
        SELECT RECA_ID FROM ANTICIPOS_CLIENTE WHERE ANCL_ID = :ID INTO :RECAID;
        if (RECAID = IDR) then
            EXISTE = 'S';
        END
    if (EXISTE = 'N') then
        BEGIN
        select 'S' from saldos_doc_cartera where sdca_tiporef = :TIPO and sdca_idref = :ID and sdca_fecha = :fecha into :EXISTE;
        if (Existe = 'S') then
            begin
            /* actualice el saldo del dia */
            UPDATE saldos_doc_cartera
                SET SDCA_ABONO = SDCA_ABONO + :MONTO,
                    SDCA_ABRTFTE = SDCA_ABRTFTE + :RTFTE,
                    SDCA_ABRTIVA = SDCA_ABRTIVA + :RTIVA,
                    SDCA_ABRTICA = SDCA_ABRTICA + :RTICA,
                    SDCA_TRM = :TRM
                WHERE SDCA_TIPOREF = :TIPO AND SDCA_IDREF = :ID AND SDCA_FECHA = :fecha;
            END
        ELSE
            BEGIN
            /* Inserte un nuevo saldo diario */
            INSERT INTO SALDOS_DOC_CARTERA (SDCA_TIPOREF, SDCA_IDREF, SDCA_FECHA, TERC_NIT, SDCA_RTFTE, SDCA_RTIVA, SDCA_RTICA, SDCA_ABONO, SDCA_ABRTFTE, SDCA_ABRTIVA, SDCA_ABRTICA, SDCA_DEBITO, SDCA_MONTO, SDCA_TRM)
                VALUES (:TIPO, :ID, :fecha, :NIT, 0, 0, 0, :MONTO, :rtfte, :rtiva, :rtica, 'N', 0, :TRM);
            END
        END
    END

FOR SELECT E.egre_id, EGCC_TIPODOC, EGCC_IDDOC, EGRE_FECHA, TERC_NIT, EGCC_ABONO+EGCC_DTOF, EGCC_RTFTE, EGCC_RTIVA, EGCC_RTICA, EGRE_TRM
    FROM EGRESOS_CRUCEC C, EGRESOS E
    WHERE E.egre_id = C.egre_id AND EGRE_ANULADO = 'N' AND TERC_NIT >= :CLIINI AND TERC_NIT <= :CLIFIN
    ORDER BY EGRE_FECHA
    INTO :IDR, :TIPO, :ID, :FECHA, :NIT, :MONTO, :RTFTE, :RTIVA, :RTICA, :TRM
    DO
    BEGIN
    select 'S' from saldos_doc_cartera where sdca_tiporef = :TIPO and sdca_idref = :ID and sdca_fecha = :fecha into :EXISTE;
    if (Existe = 'S') then
        begin
        /* actualice el saldo del dia */
        UPDATE saldos_doc_cartera
            SET SDCA_ABONO = SDCA_ABONO + :MONTO,
            SDCA_ABRTFTE = SDCA_ABRTFTE + :RTFTE,
            SDCA_ABRTIVA = SDCA_ABRTIVA + :RTIVA,
            SDCA_ABRTICA = SDCA_ABRTICA + :RTICA,
            SDCA_TRM = :TRM
            WHERE SDCA_TIPOREF = :TIPO AND SDCA_IDREF = :ID AND SDCA_FECHA = :fecha;
        END
    ELSE
        BEGIN
        /* Inserte un nuevo saldo diario */
        INSERT INTO SALDOS_DOC_CARTERA (SDCA_TIPOREF, SDCA_IDREF, SDCA_FECHA, TERC_NIT, SDCA_RTFTE, SDCA_RTIVA, SDCA_RTICA, SDCA_ABONO, SDCA_ABRTFTE, SDCA_ABRTIVA, SDCA_ABRTICA, SDCA_DEBITO, SDCA_MONTO, SDCA_TRM)
            VALUES (:TIPO, :ID, :fecha, :NIT, 0, 0, 0, :MONTO, :rtfte, :rtiva, :rtica, 'N', 0, :TRM);
        END
    END

for select ancl_id, ancl_base+ancl_ivamonto, PREF_PRE, ANCL_NUMERO, ANCL_TRM from anticipos_cliente
    where ANCL_ANULADO = 'N' and reca_id not in (select reca_id from recibos_caja where reca_anulado = 'N')
    into :ID, :MONTO, :PREF, :NUMERO, :TRM
    do
    begin
    FECHA = cast('now' as date);
    execute procedure saldo_doc_cartera(45, :id, :FECHA, 0) returning_values (:RTFTE);
    if ((MONTO = RTFTE) or (RTFTE IS NULL)) then
        DELETE FROM ANTICIPOS_CLIENTE WHERE ANCL_ID = :ID;
    ELSE
        BEGIN
        TIPO = 45;
        ERROR = 'DOCUMENTO ANULADO CON ABONOS';
        SUSPEND;
        END
    end
END
^

SET TERM ; ^


SET TERM ^ ;

CREATE OR ALTER PROCEDURE CONCILIA_CARTERA(
    FECINI DATE,
    FECFIN DATE,
    CTACART VARCHAR(20),
    SUBEMPRESA INTEGER,
    ANTERIOR CHAR(1))
RETURNS (
    NIT VARCHAR(20),
    NOMBRE VARCHAR(60),
    INICIAL NUMERIC(18,2),
    INICIALC NUMERIC(18,2),
    DEBITOS NUMERIC(18,2),
    DEBITOSC NUMERIC(18,2),
    CREDITOS NUMERIC(18,2),
    CREDITOSC NUMERIC(18,2),
    SALDO NUMERIC(18,2),
    SALDOC NUMERIC(18,2),
    DIFERENCIA NUMERIC(18,2))
AS
declare variable ANO CHAR(4);
declare variable MES INTEGER;
declare variable NUMROWS INTEGER;
declare variable ABONOS NUMERIC(18,2);
declare variable TIPODOC INTEGER;
declare variable IDDOC INTEGER;
declare variable RETES CHAR(2);
begin
ano = EXTRACT(YEAR FROM FECFIN);
mes = EXTRACT(MONTH FROM FECFIN);

for select TERC_NIT, TERC_NOM from TERCEROS WHERE TERC_CLIE = 'S' into :NIT, :NOMBRE
    DO
    BEGIN
    /* OMITE LOS CLIENTES DE CONTADO */
    SELECT COUNT(*) FROM AUTORIZACIONES WHERE AUTO_NITCONTADO = :NIT INTO :numrows;
    IF (numrows = 0) THEN
        BEGIN
        FECINI = FECINI - 1;
        INICIAL = 0;
        FOR SELECT MVCL_TIPOREF, MVCL_IDREF FROM MOVIMIENTO_CLIENTES
            WHERE TERC_NIT = :NIT AND MVCL_FECHA <= :FECINI AND
            MVCL_ABONO = 'N' AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA))
            INTO :TIPODOC, :IDDOC
            DO
            BEGIN
            EXECUTE PROCEDURE saldo_doc_cartera(TIPODOC, IDDOC, FECINI, 0) returning_values (SALDO);
            INICIAL = INICIAL + SALDO;
            END
        EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'DESCONTAR RETENCIONES POR CAUSACION') returning_values(:RETES);
        FECINI = FECINI + 1;
        if (RETES = 'SI') then
            BEGIN
            SELECT SUM(MVCL_MONTO-MVCL_RTEFTE-MVCL_RTEIVA-MVCL_RTEICA) FROM movimiento_clientes
                WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND MVCL_FECHA < :FECFIN
                AND MVCL_DEBITO = 'S' AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA))
                INTO :DEBITOS;
            SELECT SUM(MVCL_MONTO-MVCL_RTEFTE-MVCL_RTEIVA-MVCL_RTEICA) FROM movimiento_clientes
                WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND MVCL_FECHA < :FECFIN
                AND MVCL_DEBITO = 'N' AND MVCL_ABONO = 'N' and MVCL_TIPOREF <> 45 AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA))
                INTO :CREDITOS;
            SELECT SUM(MVCL_MONTO) FROM movimiento_clientes
                WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND MVCL_FECHA < :FECFIN
                AND MVCL_ABONO = 'S' AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA))
                INTO :ABONOS;
            END
        ELSE
            BEGIN
            SELECT SUM(MVCL_MONTO) FROM movimiento_clientes
                WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND MVCL_FECHA < :FECFIN
                AND MVCL_DEBITO = 'S' AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA))
                INTO :DEBITOS;
            SELECT SUM(MVCL_MONTO) FROM movimiento_clientes
                WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND MVCL_FECHA < :FECFIN
                AND MVCL_DEBITO = 'N' AND MVCL_ABONO = 'N' and MVCL_TIPOREF <> 45 AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA))
                INTO :CREDITOS;
            SELECT SUM(MVCL_MONTO+MVCL_RTEFTE+MVCL_RTEIVA+MVCL_RTEICA) FROM movimiento_clientes
                WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND MVCL_FECHA < :FECFIN
                AND MVCL_ABONO = 'S' AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA))
                INTO :ABONOS;
            END
        if (DEBITOS IS NULL) then
            DEBITOS = 0;
        if (CREDITOS IS NULL) then
            CREDITOS = 0;
        if (ABONOS IS NULL) then
            ABONOS = 0;
        CREDITOS = CREDITOS + ABONOS;
        SALDO = INICIAL + DEBITOS - CREDITOS;

        /* LO CONTABLE */
        EXECUTE PROCEDURE SALDO_TERCERO_MES(ctacart, NIT, ANO, MES, 'S') RETURNING_VALUES (INICIALC);
        EXECUTE PROCEDURE MOVIMIENTO_TERCERO_MES(ctacart, NIT, ANO, MES, 'S') RETURNING_VALUES(DEBITOSC);
        EXECUTE PROCEDURE MOVIMIENTO_TERCERO_MES(ctacart, NIT, ANO, MES, 'N') RETURNING_VALUES(CREDITOSC);
        SALDOC = INICIALC + DEBITOSC - CREDITOSC;
        diferencia = SALDO - SALDOC;
        if (DIFERENCIA <> 0) then
            BEGIN
            if (ANTERIOR <> 'S') then
                SUSPEND;
            ELSE
                BEGIN
                if (DIFERENCIA <> (INICIAL - INICIALC)) then
                    SUSPEND;
                END
            END
        END
    END
end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER PROCEDURE IMPR_APLICLIE(
    ID INTEGER)
RETURNS (
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    CONCEPTO VARCHAR(60),
    NIT VARCHAR(20),
    NOMBRE VARCHAR(60),
    DIR VARCHAR(60),
    CIU VARCHAR(40),
    TEL VARCHAR(40),
    CONTACTO VARCHAR(60),
    FAX VARCHAR(25),
    CEL VARCHAR(25),
    EMAIL VARCHAR(100),
    ITEM INTEGER,
    TIPODOC VARCHAR(8),
    PREFDOC VARCHAR(4),
    NUMDOC VARCHAR(6),
    ABONO NUMERIC(18,2),
    RTFTEMONTO NUMERIC(18,2),
    RTIVAMONTO NUMERIC(18,2),
    RTICAMONTO NUMERIC(18,2),
    SALDODOC NUMERIC(18,2),
    ANTERDOC NUMERIC(18,2),
    OBS BLOB SUB_TYPE 1 SEGMENT SIZE 80,
    CLIE_COD VARCHAR(15),
    COBR_COD INTEGER,
    COBR_NOM VARCHAR(60))
AS
declare variable TIPO INTEGER;
declare variable IDDOC INTEGER;
BEGIN
  FOR SELECT PREF_PRE, APCL_NUMERO, APCL_FECHA, APCL_CONCEPTO, P.TERC_NIT, TERC_NOM, TERC_DIR, TERC_CIU, TERC_TEL, TERC_CONTACTO, TERC_FAX, TERC_CEL, TERC_EMAIL,
    ACDE_ITEM, ACDE_TIPODOC, ACDE_IDDOC, TIDO_NOMCORTO, ACDE_PREFIJO, ACDE_NUMERO, ACDE_APLICADO,
    ACDE_RTFTE, ACDE_RTIVA, ACDE_RTICA, APCL_OBS, CLIE_COD, P.COBR_COD, COBR_NOM
    FROM APLICACION_CLIENTE P, APLICACION_CLIENTE_DETALLE PD, TERCEROS T, CLIENTES C, TIPO_DOCUMENTO TD, COBRADORES CO
    WHERE P.TERC_NIT = T.TERC_NIT AND T.TERC_NIT = C.TERC_NIT AND P.APCL_ID = PD.APCL_ID AND P.APCL_ID = :ID AND ACDE_TIPODOC = TD.TIDO_COD AND P.COBR_COD = CO.COBR_COD
    ORDER BY ACDE_ITEM
    INTO :PREFIJO, :NUMERO, :FECHA, :CONCEPTO, :NIT, :NOMBRE, :DIR, :CIU, :TEL, :CONTACTO, :FAX, :CEL, :EMAIL, :ITEM, :TIPO, :IDDOC, :TIPODOC, :PREFDOC, :NUMDOC, :ABONO, :RTFTEMONTO, :RTIVAMONTO, :RTICAMONTO, :OBS, :CLIE_COD, :COBR_COD, :COBR_NOM
    DO
        begin
        EXECUTE PROCEDURE SALDO_DOC_CARTERA(:TIPO, :IDDOC, :FECHA, 0) returning_values (:SALDODOC);
        if (SALDODOC IS NULL) then
            SALDODOC = 0;
        ANTERDOC = SALDODOC + rtftemonto + rtivamonto + rticamonto + abono;
        if (anterdoc IS NULL) then
            ANTERDOC = 0;
        SUSPEND;
        end
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER PROCEDURE IMPR_APLIPROV(
    ID INTEGER)
RETURNS (
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    CONCEPTO VARCHAR(60),
    NIT VARCHAR(20),
    NOMBRE VARCHAR(60),
    DIR VARCHAR(60),
    CIU VARCHAR(40),
    TEL VARCHAR(40),
    CONTACTO VARCHAR(60),
    FAX VARCHAR(25),
    CEL VARCHAR(25),
    EMAIL VARCHAR(100),
    ITEM INTEGER,
    TIPODOC VARCHAR(8),
    PREFDOC VARCHAR(4),
    NUMDOC VARCHAR(6),
    ABONO NUMERIC(18,2),
    RTFTEMONTO NUMERIC(18,2),
    RTIVAMONTO NUMERIC(18,2),
    RTICAMONTO NUMERIC(18,2),
    SALDODOC NUMERIC(18,2),
    ANTERDOC NUMERIC(18,2),
    OBS BLOB SUB_TYPE 1 SEGMENT SIZE 80,
    PROV_COD VARCHAR(15),
    PROV_CARTERA VARCHAR(60),
    PROV_CODIGOINT VARCHAR(15))
AS
declare variable TIPO INTEGER;
declare variable IDDOC INTEGER;
BEGIN
  FOR SELECT PREF_PRE, APPR_NUMERO, APPR_FECHA, APPR_CONC, P.TERC_NIT, TERC_NOM, TERC_DIR, TERC_CIU, TERC_TEL, TERC_CONTACTO, TERC_FAX, TERC_CEL, TERC_EMAIL,
    APPD_ITEM, APPD_TIPODOC, APPD_IDDOC, TIDO_NOMCORTO, APPD_PREFIJO, APPD_NUMERO, APPD_APLICADO,
    APPD_RTFTE, APPD_RTIVA, APPD_RTICA, APPR_OBS, PROV_COD, PROV_CARTERA, PROV_CODIGOINT
    FROM APLICACION_PROVEDOR P, APLICACION_PROVEEDOR_DETALLE PD, TERCEROS T, PROVEEDORES PR, TIPO_DOCUMENTO TD
    WHERE P.TERC_NIT = T.TERC_NIT AND T.TERC_NIT = PR.TERC_NIT AND P.APPR_ID = PD.APPR_ID AND P.APPR_ID = :ID AND APPD_TIPODOC = TD.TIDO_COD
    ORDER BY APPD_ITEM
    INTO :PREFIJO, :NUMERO, :FECHA, :CONCEPTO, :NIT, :NOMBRE, :DIR, :CIU, :TEL, :CONTACTO, :FAX, :CEL, :EMAIL, :ITEM, :TIPO, :IDDOC, :TIPODOC, :PREFDOC, :NUMDOC, :ABONO, :RTFTEMONTO, :RTIVAMONTO, :RTICAMONTO, :OBS, :PROV_COD, :PROV_CARTERA, :PROV_CODIGOINT
    DO
        begin
        EXECUTE PROCEDURE saldo_doc_cxpagar(:TIPO, :IDDOC, :FECHA, 0) returning_values (:SALDODOC);
        if (saldodoc IS NULL) then
            SALDODOC = 0;
        ANTERDOC = SALDODOC + rtftemonto + rtivamonto + rticamonto + abono;
        if (anterdoc IS NULL) then
            ANTERDOC = 0;
        SUSPEND;
        end
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER PROCEDURE IMPR_RECIPROV(
    ID INTEGER)
RETURNS (
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    NOMCAJA VARCHAR(60),
    CODCOBR INTEGER,
    NOMCOBR VARCHAR(60),
    NIT VARCHAR(20),
    NOMBRE VARCHAR(60),
    DIR VARCHAR(60),
    CIU VARCHAR(40),
    TEL VARCHAR(40),
    CONCEPTO VARCHAR(60),
    MONTO NUMERIC(18,2),
    RTFTE NUMERIC(18,2),
    RTIVA NUMERIC(18,2),
    RTICA NUMERIC(18,2),
    DSCTO NUMERIC(18,2),
    OBS BLOB SUB_TYPE 1 SEGMENT SIZE 80,
    ITEMDOC INTEGER,
    TIPODOC VARCHAR(8),
    PREFDOC VARCHAR(4),
    NUMDOC VARCHAR(6),
    SUCURSAL VARCHAR(10),
    ABONODOC NUMERIC(18,2),
    RTFTEDOC NUMERIC(18,2),
    RTIVADOC NUMERIC(18,2),
    RTICADOC NUMERIC(18,2),
    DSCTODOC NUMERIC(18,2),
    SALDODOC NUMERIC(18,2),
    ANTERDOC NUMERIC(18,2))
AS
declare variable NUMROWS INTEGER;
declare variable TIPO integer;
BEGIN
  SELECT PREF_PRE, RCPR_NUMERO, RCPR_FECHA, CAJA_NOMBRE, RCPR_CONC, R.VEND_COD,
        R.TERC_NIT, RCPR_NOMTERC, TERC_DIR, TERC_CIU, TERC_TEL,
        RCPR_MONTO, RCPR_RTFTE, RCPR_RTIVA, RCPR_RTICA, RCPR_DTOF,
        RCPR_OBS
  FROM RECIBO_PROVISIONAL R, TERCEROS T, CAJAS C
  WHERE R.TERC_NIT = T.TERC_NIT AND R.CAJA_ID = C.CAJA_ID AND
        R.RCPR_ID = :ID
  INTO :PREFIJO, :NUMERO, :FECHA, :NOMCAJA, :CONCEPTO, :CODCOBR,
        :NIT, :NOMBRE, :DIR, :CIU, :TEL,
        :MONTO, :RTFTE, :RTIVA, :RTICA, :DSCTO,
        :OBS;
  SELECT COBR_NOM FROM COBRADORES WHERE COBR_COD = :CODCOBR INTO :NOMCOBR;
  SELECT COUNT(RPDE_ITEM) FROM RECIBO_PROVISIONAL_DETALLE
    WHERE RCPR_ID = :ID INTO :NUMROWS;
  if (NUMROWS > 0) then
    FOR SELECT RPDE_ITEM, RPDE_TIPODOC, TIDO_NOMCORTO, RPDE_PREFDOC, RPDE_NUMDOC,
        RPDE_ABONO, RPDE_RTFTE, RPDE_RTIVA, RPDE_RTICA, RPDE_DTOF, RPDE_SUCURSAL
        FROM RECIBO_PROVISIONAL_DETALLE D, TIPO_DOCUMENTO TD
        WHERE D.RCPR_ID = :ID AND TD.TIDO_COD = D.RPDE_TIPODOC
        ORDER BY RPDE_ITEM
        INTO :ITEMDOC, :TIPO, :TIPODOC, :PREFDOC, :NUMDOC, :ABONODOC, :RTFTEDOC, :RTIVADOC, :RTICADOC, :DSCTODOC, :SUCURSAL
        DO
            BEGIN
            EXECUTE PROCEDURE SALDO_DOC_CARTERA(:TIPO, :ID, :FECHA, 0) returning_values (:SALDODOC);
            ANTERDOC = SALDODOC + RTFTEDOC + RTIVADOC + RTICADOC + ABONODOC + DSCTODOC;
            SUSPEND;
            END
  ELSE
    SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER PROCEDURE REP_CARTERA_CONSOLIDADA(
    DESDE VARCHAR(20),
    HASTA VARCHAR(20),
    GRPINI VARCHAR(5),
    GRPFIN VARCHAR(5),
    FECHA DATE,
    ORDEN CHAR(1),
    AGRUPA CHAR(1),
    SUBEMPRESA INTEGER,
    GRUPCART INTEGER,
    MONEDA INTEGER)
RETURNS (
    NIT VARCHAR(20),
    NOMBRE VARCHAR(60),
    TELEFONO VARCHAR(40),
    CIUDAD VARCHAR(40),
    EMAIL VARCHAR(100),
    FAX VARCHAR(25),
    CEL VARCHAR(25),
    CODCLI VARCHAR(20),
    CODZONA VARCHAR(2),
    NOMZONA VARCHAR(60),
    CODCOBR INTEGER,
    NOMCOBR VARCHAR(60),
    SUCURSAL VARCHAR(10),
    DV CHAR(1),
    CODCIUD CHAR(5),
    NOMCIUD VARCHAR(60),
    SALDO NUMERIC(18,2),
    RTFTE NUMERIC(18,2),
    RTIVA NUMERIC(18,2),
    RTICA NUMERIC(18,2),
    DTOF NUMERIC(18,2),
    CUPO NUMERIC(18,2),
    DISPONIBLE NUMERIC(18,2),
    PROVISIONAL NUMERIC(18,2),
    CONTACTO VARCHAR(60),
    ESTADO CHAR(1),
    GRUPCOD INTEGER,
    GRUPNOM VARCHAR(30))
AS
declare variable NITINI VARCHAR(20);
declare variable NITFIN VARCHAR(20);
declare variable NOMINI VARCHAR(20);
declare variable NOMFIN VARCHAR(20);
declare variable OK CHAR(1);
declare variable PSALDO NUMERIC(18,2);
declare variable PRTFTE NUMERIC(18,2);
declare variable PRTIVA NUMERIC(18,2);
declare variable PRTICA NUMERIC(18,2);
declare variable PDTOF NUMERIC(18,2);
declare variable TIPO INTEGER;
declare variable ID INTEGER;
declare variable DTOAPL NUMERIC(18,2);
declare variable FECDTO DATE;
declare variable descnt_prov char(2);
declare variable AUTORET VARCHAR(10);
declare variable FAUTORET DATE;
declare variable FECDOC DATE;
declare variable INCLANTI CHAR(2);
declare variable TRM NUMERIC(18,2);
BEGIN
if (ORDEN = 'C') then
    BEGIN
    NITINI = DESDE;
    NITFIN = HASTA;
    NOMINI = '';
    NOMFIN = 'zz';
    END
ELSE
    BEGIN
    NOMINI = DESDE;
    NOMFIN = HASTA;
    NITINI = '';
    NITFIN = 'zz';
    END
  EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'DESCONTAR RECIBOS PROVISIONALES EN INFORMES DE CARTERA') RETURNING_VALUES (:descnt_prov);
  EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'INCLUIR ANTICIPOS DE CLIENTES EN REPORTES Y CONSULTAS DE CARTERA') returning_values (INCLANTI);
  EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'FECHA AUTORETENEDOR NO DESCONTAR RETENCIONES DEL SALDO PERO SI CONTABILIZARLAS') returning_values (AUTORET);
  if (AUTORET <> '') then
    FAUTORET = CAST(AUTORET AS DATE);
  else
    FAUTORET = '9999/12/31';
  /* Ubique el NIT */
  FOR select C.TERC_NIT, CLSU_NOMBRE, TERC_DV, CLSU_TEL, CLSU_CIUDAD, TERC_CONTACTO, S.COBR_COD, S.ZONA_COD, T.CIUD_COD, CLIE_CUPO, CLIE_ESTADO, CLCU_COD, C.GRCA_COD, TERC_EMAIL, TERC_FAX, TERC_CEL, CLIE_COD
    from terceros T, CLIENTES C, CLIENTE_SUCURSALES S
    where C.TERC_NIT = T.TERC_NIT AND TERC_CLIE = 'S' AND S.TERC_NIT = C.TERC_NIT AND C.TERC_NIT >= :NITINI AND C.TERC_NIT <= :NITFIN AND
        TERC_NOM >= :NOMINI AND TERC_NOM <= :NOMFIN AND ((:GRUPCART = 0) or (C.GRCA_COD = :GRUPCART))
    INTO :NIT, :NOMBRE, :DV, :TELEFONO, :CIUDAD, :CONTACTO, :CODCOBR, :CODZONA, :CODCIUD, :CUPO, :ESTADO, :SUCURSAL, :GRUPCOD, :EMAIL, :FAX, :CEL, :CODCLI
    DO  
    BEGIN
    SELECT GRCA_NOMBRE FROM GRUPO_CARTERA WHERE GRCA_COD = :GRUPCOD INTO :GRUPNOM;
    OK = 'N';
    if (AGRUPA = 'Z') then
        BEGIN
        if (GRPINI = '') then
            BEGIN
            if ((CODZONA IS NULL) or (CODZONA >= :GRPINI AND CODZONA <= :GRPFIN)) then
                OK = 'S';
            END
        ELSE
            if (CODZONA >= :GRPINI AND CODZONA <= :GRPFIN) then
                OK = 'S';
        END
    if (AGRUPA = 'I') then
        BEGIN
        if (GRPINI = '') then
            BEGIN
            if ((CODCIUD IS NULL) or (CODCIUD >= :GRPINI AND CODCIUD <= :GRPFIN)) then
                OK = 'S';
            END
        ELSE
            if (CODCIUD >= :GRPINI AND CODCIUD <= :GRPFIN) then
                OK = 'S';
        END
    if (AGRUPA = 'N') then
        OK = 'S';
        
    if (OK = 'S') then
        BEGIN
        if (CODCOBR IS NOT NULL) then
            SELECT COBR_NOM FROM COBRADORES  WHERE COBR_COD = :CODCOBR INTO :NOMCOBR;
        if (CODZONA IS NOT NULL) then
            SELECT ZONA_NOM FROM ZONAS WHERE ZONA_COD = :CODZONA INTO :NOMZONA;
        if (CODCIUD IS NOT NULL) then
            SELECT CIUD_NOM FROM CIUDADES  WHERE CIUD_COD = :CODCIUD INTO :NOMCIUD;
    
        SALDO = 0;
        RTFTE = 0;
        RTIVA = 0;
        RTICA = 0;
        DTOF = 0;
        /* BUSQUE EN SALDOS_DOC_CARTERA LOS QUE TENGAN SALDO > 0 */
        FOR SELECT MVCL_TIPOREF, MVCL_IDREF, MVCL_FECHA
          FROM MOVIMIENTO_CLIENTES WHERE TERC_NIT = :NIT AND MVCL_SUCURSAL = :SUCURSAL AND MVCL_FECHA <= :FECHA AND
          MVCL_ABONO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) AND ((:MONEDA = 0) or (MVCL_TRM <> 1))
          INTO :TIPO, :ID, :FECDOC
          DO
            BEGIN
            if ((inclanti = 'SI') or (TIPO <> 45)) then
                BEGIN
                EXECUTE PROCEDURE saldo_doc_cartera(TIPO, ID, FECHA, MONEDA) returning_values (PSALDO);
                if (PSALDO <> 0) then
                    BEGIN
                    if (TIPO = 41) then
                        SELECT NDCL_DTOFMONTO, NDCL_FECHADTO, NDCL_TRM FROM NOTAS_DEBITO_CLIENTES
                            WHERE NDCL_ID = :ID INTO :PDTOF, :FECDTO, :TRM;
                    if (TIPO = 42) then
                        SELECT 0, NCCL_FECHA, 1 FROM NOTAS_CREDITO_CLIENTES
                            WHERE NCCL_ID = :ID INTO :PDTOF, :FECDTO, :TRM;
                    if (TIPO = 45) then
                        SELECT ANCL_DTOFMONTO, ANCL_DTOFECHA, ANCL_TRM FROM ANTICIPOS_CLIENTE
                            WHERE ANCL_ID = :ID INTO :PDTOF, :FECDTO, :TRM;
                    if (TIPO = 31) then
                        SELECT FACT_DTOFMONTO, FACT_DTOFFECHA, FACT_TRM FROM FACTURAS
                            WHERE FACT_ID = :ID INTO :PDTOF, :FECDTO, :TRM;
                    if (TIPO = 33) then
                        SELECT 0, DEVT_FECHA, 1 FROM devoluciones_ventas
                            WHERE DEVT_ID = :ID INTO :PDTOF, :FECDTO, :TRM;
                    if (PDTOF IS NULL) then
                        PDTOF = 0;
                    if ((MONEDA <> 0) AND (TRM <> 0)) then
                        PDTOF = PDTOF / TRM;
                    if (PDTOF <> 0) then
                        BEGIN
                        SELECT SUM(RCDE_DTOF), MAX(RECA_TRM) FROM RECIBOS_CAJA_DETALLE D, recibos_caja R
                            WHERE R.reca_id = D.reca_id AND RCDE_IDDOC = :ID AND RCDE_TIPODOC = :TIPO INTO :DTOAPL, :TRM;
                        if (DTOAPL IS NULL) then
                            DTOAPL = 0;
                        if ((MONEDA <> 0) AND (TRM <> 0)) then
                           DTOAPL = DTOAPL / TRM;
                        PDTOF = PDTOF - DTOAPL;
                        /* SI YA SE VENCIO DEJELO EN CERO */
                        if (FECDTO < FECHA) then
                            PDTOF = 0;
                        END
                    if (MONEDA = 0) then
                        SELECT SUM(SDCA_RTFTE - SDCA_ABRTFTE), SUM(SDCA_RTIVA - SDCA_ABRTIVA), SUM(SDCA_RTICA - SDCA_ABRTICA)
                            FROM SALDOS_DOC_CARTERA WHERE SDCA_TIPOREF = :TIPO AND SDCA_IDREF = :ID
                            INTO :PRTFTE, :PRTIVA, :PRTICA;
                    ELSE
                        SELECT SUM((SDCA_RTFTE - SDCA_ABRTFTE)/SDCA_TRM), SUM((SDCA_RTIVA - SDCA_ABRTIVA)/SDCA_TRM), SUM((SDCA_RTICA - SDCA_ABRTICA)/SDCA_TRM)
                            FROM SALDOS_DOC_CARTERA WHERE SDCA_TIPOREF = :TIPO AND SDCA_IDREF = :ID
                            INTO :PRTFTE, :PRTIVA, :PRTICA;
                    if (PRTFTE IS NULL) then
                        PRTFTE = 0;
                    if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) THEN
                        BEGIN
                        if (PRTFTE > 0) then
                            PRTFTE = 0;
                        END
                    ELSE    
                        BEGIN
                        if (PRTFTE < 0) then
                            PRTFTE = 0;
                        END
                    if (PRTIVA IS NULL) then
                        PRTIVA = 0;
                    if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) THEN
                        BEGIN
                        if (PRTIVA > 0) then
                            PRTIVA = 0;
                        END
                    ELSE
                        BEGIN
                        if (PRTIVA < 0) then
                            PRTIVA = 0;
                        END
                    if (PRTICA IS NULL) then
                        PRTICA = 0;
                    if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) THEN
                        BEGIN
                        if (PRTICA > 0) then
                            PRTICA = 0;
                        END
                    ELSE
                        BEGIN
                        if (PRTICA < 0) then
                            PRTICA = 0;
                        END

                    if (FAUTORET <= FECDOC) then
                        PRTFTE = 0;

                    SALDO = SALDO + PSALDO;
                    RTFTE = RTFTE + PRTFTE;
                    RTIVA = RTIVA + PRTIVA;
                    RTICA = RTICA + PRTICA;
                    DTOF = DTOF + PDTOF;
                    END /* SALDO <> 0 */
                END  /* NO ANTICIPO */
            END
        DISPONIBLE = CUPO - SALDO;
        /* LOS RECIBOS PROVISIONALES */
        SELECT SUM(RPDE_ABONO), MAX(RCPR_TRM) FROM recibo_provisional P, recibo_provisional_detalle D
            WHERE P.rcpr_id = D.rcpr_id AND TERC_NIT = :NIT AND RPDE_SUCURSAL = :SUCURSAL AND ((:MONEDA = 0) or (RCPR_TRM <> 1)) AND
            RCPR_FECHA <= :FECHA AND RCPR_ANULADO = 'N' AND ((RCPR_FECCRUCE IS NULL) or (RCPR_FECCRUCE > :FECHA)) AND
            ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            INTO :provisional, :TRM;
        if ((MONEDA <> 0) AND (TRM <> 0)) then
            PROVISIONAL = PROVISIONAL / TRM;
           if (:descnt_prov = 'SI') then
             if (NOT :provisional is NULL) then
              SALDO = :saldo - :PROVISIONAL;
        SUSPEND;
        END
    if (AGRUPA = 'C') then
        BEGIN
        if (CODZONA IS NOT NULL) then
            SELECT ZONA_NOM FROM ZONAS WHERE ZONA_COD = :CODZONA INTO :NOMZONA;
        if (CODCIUD IS NOT NULL) then
            SELECT CIUD_NOM FROM CIUDADES  WHERE CIUD_COD = :CODCIUD INTO :NOMCIUD;
        FOR SELECT DISTINCT COBR_COD FROM MOVIMIENTO_CLIENTES WHERE TERC_NIT = :NIT AND
            MVCL_SUCURSAL = :SUCURSAL AND MVCL_FECHA <= :FECHA AND
            MVCL_ABONO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            INTO :codcobr
            DO
            begin
            OK = 'N';
            if (GRPINI = '') then
                BEGIN
                if ((CODCOBR IS NULL) or (CODCOBR >= :GRPINI AND CODCOBR <= :GRPFIN)) then
                    OK = 'S';
                END
            ELSE
                if (CODCOBR >= :GRPINI AND CODCOBR <= :GRPFIN) then
                    OK = 'S';
            if (OK = 'S') then
                BEGIN
                SELECT COBR_NOM FROM COBRADORES  WHERE COBR_COD = :CODCOBR INTO :NOMCOBR;

                SALDO = 0;
                RTFTE = 0;
                RTIVA = 0;
                RTICA = 0;
                DTOF = 0;
                /* BUSQUE EN SALDOS_DOC_CARTERA LOS QUE TENGAN SALDO > 0 */
                FOR SELECT MVCL_TIPOREF, MVCL_IDREF, MVCL_FECHA
                  FROM MOVIMIENTO_CLIENTES WHERE TERC_NIT = :NIT AND MVCL_SUCURSAL = :SUCURSAL AND ((:moneda = 0) or (mvcl_trm <> 1)) AND
                  MVCL_FECHA <= :FECHA AND COBR_COD = :codcobr AND MVCL_ABONO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                  INTO :TIPO, :ID, :FECDOC
                  DO
                    BEGIN
                    if ((inclanti = 'SI') or (TIPO <> 45)) then
                        BEGIN
                        EXECUTE PROCEDURE saldo_doc_cartera(TIPO, ID, FECHA, MONEDA) returning_values (PSALDO);
                        if (PSALDO <> 0) then
                            BEGIN
                            if (TIPO = 41) then
                                SELECT NDCL_DTOFMONTO, NDCL_FECHADTO, NDCL_TRM FROM NOTAS_DEBITO_CLIENTES
                                    WHERE NDCL_ID = :ID INTO :PDTOF, :FECDTO, :TRM;
                            if (TIPO = 42) then
                                SELECT 0, NCCL_FECHA, 1 FROM NOTAS_CREDITO_CLIENTES
                                    WHERE NCCL_ID = :ID INTO :PDTOF, :FECDTO, :TRM;
                            if (TIPO = 45) then
                                SELECT ANCL_DTOFMONTO, ANCL_DTOFECHA, ANCL_TRM FROM ANTICIPOS_CLIENTE
                                    WHERE ANCL_ID = :ID INTO :PDTOF, :FECDTO, :TRM;
                            if (TIPO = 31) then
                                SELECT FACT_DTOFMONTO, FACT_DTOFFECHA, FACT_TRM FROM FACTURAS
                                    WHERE FACT_ID = :ID INTO :PDTOF, :FECDTO, :TRM;
                            if (TIPO = 33) then
                                SELECT 0, DEVT_FECHA, 1 FROM devoluciones_ventas
                                    WHERE DEVT_ID = :ID INTO :PDTOF, :FECDTO, :TRM;
                            if (PDTOF IS NULL) then
                                PDTOF = 0;
                            if ((MONEDA <> 0) AND (TRM <> 0)) then
                                PDTOF = PDTOF / TRM;
                            if (PDTOF <> 0) then
                                BEGIN
                                SELECT SUM(RCDE_DTOF), MAX(RECA_TRM) FROM RECIBOS_CAJA_DETALLE D, RECIBOS_CAJA R
                                    WHERE R.reca_id = D.reca_id AND RCDE_IDDOC = :ID AND RCDE_TIPODOC = :TIPO INTO :DTOAPL, :TRM;
                                if (DTOAPL IS NULL) then
                                    DTOAPL = 0;
                                if ((MONEDA <> 0) AND (TRM <> 0)) then
                                   DTOAPL = DTOAPL / TRM;
                                PDTOF = PDTOF - DTOAPL;
                                /* SI YA SE VENCIO DEJELO EN CERO */
                                if (FECDTO < FECHA) then
                                    PDTOF = 0;
                                END
                            if (MONEDA = 0) then
                                SELECT SUM(SDCA_RTFTE - SDCA_ABRTFTE), SUM(SDCA_RTIVA - SDCA_ABRTIVA), SUM(SDCA_RTICA - SDCA_ABRTICA)
                                    FROM SALDOS_DOC_CARTERA WHERE SDCA_TIPOREF = :TIPO AND SDCA_IDREF = :ID
                                    INTO :PRTFTE, :PRTIVA, :PRTICA;
                            ELSE
                                SELECT SUM((SDCA_RTFTE - SDCA_ABRTFTE)/SDCA_TRM), SUM((SDCA_RTIVA - SDCA_ABRTIVA)/SDCA_TRM), SUM((SDCA_RTICA - SDCA_ABRTICA)/SDCA_TRM)
                                    FROM SALDOS_DOC_CARTERA WHERE SDCA_TIPOREF = :TIPO AND SDCA_IDREF = :ID
                                    INTO :PRTFTE, :PRTIVA, :PRTICA;
                            if (PRTFTE IS NULL) then
                                PRTFTE = 0;
                            if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) THEN
                                BEGIN
                                if (PRTFTE > 0) then
                                    PRTFTE = 0;
                                END
                            ELSE
                                BEGIN
                                if (PRTFTE < 0) then
                                    PRTFTE = 0;
                                END
                            if (PRTIVA IS NULL) then
                                PRTIVA = 0;
                            if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) THEN
                                BEGIN
                                if (PRTIVA > 0) then
                                    PRTIVA = 0;
                                END
                            ELSE
                                BEGIN
                                if (PRTIVA < 0) then
                                    PRTIVA = 0;
                                END
                            if (PRTICA IS NULL) then
                                PRTICA = 0;
                            if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) THEN
                                BEGIN
                                if (PRTICA > 0) then
                                    PRTICA = 0;
                                END
                            ELSE
                                BEGIN
                                if (PRTICA < 0) then
                                    PRTICA = 0;
                                END
                            if (FAUTORET <= FECDOC) then
                                PRTFTE = 0;
                            SALDO = SALDO + PSALDO;
                            RTFTE = RTFTE + PRTFTE;
                            RTIVA = RTIVA + PRTIVA;
                            RTICA = RTICA + PRTICA;
                            DTOF = DTOF + PDTOF;
                            END /* SALDO <> 0 */
                        END  /* NO ANTICIPO */
                    END
                DISPONIBLE = CUPO - SALDO;
                /* LOS RECIBOS PROVISIONALES */
                SELECT SUM(RPDE_ABONO), MAX(RCPR_TRM) FROM RECIBO_PROVISIONAL P, recibo_provisional_detalle D
                    WHERE P.rcpr_id = D.rcpr_id AND TERC_NIT = :NIT AND RPDE_SUCURSAL = :SUCURSAL AND ((:MONEDA = 0) or (RCPR_TRM <> 1)) AND
                    VEND_COD = :CODCOBR AND RCPR_FECHA <= :FECHA AND RCPR_ANULADO = 'N' AND ((RCPR_FECCRUCE IS NULL) or (RCPR_FECCRUCE > :FECHA)) AND 
                    ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                    INTO :provisional, :TRM;
                if ((MONEDA <> 0) AND (TRM <> 0)) then
                    PROVISIONAL = PROVISIONAL / TRM;
                if (:descnt_prov = 'SI') then
                   if (NOT :provisional IS NULL) then
                    SALDO = :saldo - :PROVISIONAL;
                if (AUTORET = 'SI') then
                    BEGIN
                    RTFTE = 0;
                    RTIVA = 0;
                    RTICA = 0;
                    END
                SUSPEND;
                END  /* OK = S */
            END  /* FOR COBRADOR */
        END  /* AGRUPA = C */
    END  /* FOR NIT */
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER PROCEDURE REP_CARTERA_NOTAS(
    DESDE VARCHAR(20),
    HASTA VARCHAR(20),
    GRPINI VARCHAR(5),
    GRPFIN VARCHAR(5),
    FECHA DATE,
    ORDEN CHAR(1),
    AGRUPA CHAR(1),
    SUBEMPRESA INTEGER,
    VENCEINI DATE,
    VENCEFIN DATE,
    GRUPCART INTEGER,
    MONEDA INTEGER)
RETURNS (
    NIT VARCHAR(20),
    NOMBRE VARCHAR(60),
    TELEFONO VARCHAR(40),
    CIUDAD VARCHAR(40),
    CODZONA VARCHAR(2),
    NOMZONA VARCHAR(60),
    CODCOBR INTEGER,
    NOMCOBR VARCHAR(60),
    SUCURSAL VARCHAR(10),
    DV CHAR(1),
    CODCIUD CHAR(5),
    NOMCIUD VARCHAR(60),
    SALDO NUMERIC(18,2),
    NOTA1 VARCHAR(256),
    NOTA2 VARCHAR(256),
    CUPO NUMERIC(18,2),
    DISPONIBLE NUMERIC(18,2),
    PROVISIONAL NUMERIC(18,2),
    CONTACTO VARCHAR(60),
    ESTADO CHAR(1),
    GRUPCOD INTEGER,
    GRUPNOM VARCHAR(30))
AS
declare variable NITINI VARCHAR(20);
declare variable NITFIN VARCHAR(20);
declare variable NOMINI VARCHAR(20);
declare variable NOMFIN VARCHAR(20);
declare variable OK CHAR(1);
declare variable PSALDO NUMERIC(18,2);
declare variable TIPO INTEGER;
declare variable ID INTEGER;
declare variable NOTA VARCHAR(277);
declare variable TIPODOC VARCHAR(8);
declare variable NUMDOC VARCHAR(10);
declare variable FECNOTA VARCHAR(10);
declare variable I INTEGER;
declare variable INCLANTI CHAR(2);
declare variable TRM NUMERIC(18,2);
BEGIN
if (ORDEN = 'C') then
    BEGIN
    NITINI = DESDE;
    NITFIN = HASTA;
    NOMINI = '';
    NOMFIN = 'zz';
    END
ELSE
    BEGIN
    NOMINI = DESDE;
    NOMFIN = HASTA;
    NITINI = '';
    NITFIN = 'zz';
    END
  EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'INCLUIR ANTICIPOS DE CLIENTES EN REPORTES Y CONSULTAS DE CARTERA') returning_values (INCLANTI);
  /* Ubique el NIT */
  FOR select T.TERC_NIT, CLSU_NOMBRE, TERC_DV, CLSU_TEL, CLSU_CIUDAD, TERC_CONTACTO, S.COBR_COD, S.ZONA_COD, CIUD_COD, CLIE_CUPO, CLIE_ESTADO, CLCU_COD, C.GRCA_COD
    from terceros T, CLIENTES C, CLIENTE_SUCURSALES S
    where C.TERC_NIT = T.TERC_NIT AND TERC_CLIE = 'S' AND S.TERC_NIT = C.TERC_NIT AND T.TERC_NIT >= :NITINI AND T.TERC_NIT <= :NITFIN AND
        TERC_NOM >= :NOMINI AND TERC_NOM <= :NOMFIN AND ((:GRUPCART = 0) or (C.GRCA_COD = :GRUPCART))
    INTO :NIT, :NOMBRE, :DV, :TELEFONO, :CIUDAD, :CONTACTO, :CODCOBR, :CODZONA, :CODCIUD, :CUPO, :ESTADO, :SUCURSAL, :GRUPCOD
    DO  
    BEGIN
    SELECT GRCA_NOMBRE FROM GRUPO_CARTERA WHERE GRCA_COD = :GRUPCOD INTO :GRUPNOM;
    OK = 'N';
    if (AGRUPA = 'Z') then
        BEGIN
        if (GRPINI = '') then
            BEGIN
            if ((CODZONA IS NULL) or (CODZONA >= :GRPINI AND CODZONA <= :GRPFIN)) then
                OK = 'S';
            END
        ELSE
            if (CODZONA >= :GRPINI AND CODZONA <= :GRPFIN) then
                OK = 'S';
        END
    if (AGRUPA = 'I') then
        BEGIN
        if (GRPINI = '') then
            BEGIN
            if ((CODCIUD IS NULL) or (CODCIUD >= :GRPINI AND CODCIUD <= :GRPFIN)) then
                OK = 'S';
            END
        ELSE
            if (CODCIUD >= :GRPINI AND CODCIUD <= :GRPFIN) then
                OK = 'S';
        END
    if (AGRUPA = 'N') then
        OK = 'S';
        
    if (OK = 'S') then
        BEGIN
        if (CODCOBR IS NOT NULL) then
            SELECT COBR_NOM FROM COBRADORES  WHERE COBR_COD = :CODCOBR INTO :NOMCOBR;
        if (CODZONA IS NOT NULL) then
            SELECT ZONA_NOM FROM ZONAS WHERE ZONA_COD = :CODZONA INTO :NOMZONA;
        if (CODCIUD IS NOT NULL) then
            SELECT CIUD_NOM FROM CIUDADES  WHERE CIUD_COD = :CODCIUD INTO :NOMCIUD;
    
        SALDO = 0;
        /* BUSQUE EN SALDOS_DOC_CARTERA LOS QUE TENGAN SALDO > 0 */
        FOR SELECT MVCL_TIPOREF, MVCL_IDREF
          FROM MOVIMIENTO_CLIENTES WHERE TERC_NIT = :NIT AND MVCL_SUCURSAL = :SUCURSAL AND MVCL_FECHA <= :FECHA AND
          MVCL_ABONO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) AND MVCL_VENCE >= :VENCEINI AND
          MVCL_VENCE <= :VENCEFIN AND ((:MONEDA = 0) or (MVCL_TRM <> 1))
          INTO :TIPO, :ID
          DO
            if ((inclanti = 'SI') or (TIPO <> 45)) then
                BEGIN
                EXECUTE PROCEDURE saldo_doc_cartera(TIPO, ID, FECHA, MONEDA) returning_values (PSALDO);
                if (PSALDO <> 0) then
                    SALDO = SALDO + PSALDO;
                END
        DISPONIBLE = CUPO - SALDO;
        /* LOS RECIBOS PROVISIONALES */
        SELECT SUM(RPDE_ABONO), MAX(RCPR_TRM) FROM RECIBO_PROVISIONAL P, recibo_provisional_detalle D
            WHERE P.rcpr_id = D.rcpr_id AND TERC_NIT = :NIT AND RPDE_SUCURSAL = :SUCURSAL AND ((:MONEDA = 0) or (RCPR_TRM <> 1)) AND
            RCPR_FECHA <= :FECHA AND RCPR_ANULADO = 'N' AND ((RCPR_FECCRUCE IS NULL) or (RCPR_FECCRUCE > :FECHA)) AND
            ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            INTO :provisional, :TRM;
        if ((MONEDA <> 0) AND (TRM <> 0)) then
            PROVISIONAL = PROVISIONAL / TRM;
        /* LAS NOTAS DE CLIENTES */
        I = 0;
        NOTA1 = '';
        NOTA2 = '';
        FOR SELECT CAST(NOCL_FECHA AS VARCHAR(10)), tido_nomcorto, NOCL_NUMDOC, NOCL_TEXTO
            FROM NOTAS_CLIENTES N, TIPO_DOCUMENTO T WHERE N.NOCL_TIPODOC = T.TIDO_COD AND TERC_NIT = :NIT
            AND N.TINO_COD = 3 AND N.CLSU_COD = :SUCURSAL
            ORDER BY NOCL_ID DESC INTO :FECNOTA, :TIPODOC, :NUMDOC, :NOTA
            DO
            BEGIN
            if (I = 0) then
                NOTA1 = NOTA;
            if (I = 1) then
                NOTA2 = NOTA;
            I = I + 1;
            END
        SUSPEND;
        END
    if (AGRUPA = 'C') then
        BEGIN
        if (CODZONA IS NOT NULL) then
            SELECT ZONA_NOM FROM ZONAS WHERE ZONA_COD = :CODZONA INTO :NOMZONA;
        if (CODCIUD IS NOT NULL) then
            SELECT CIUD_NOM FROM CIUDADES  WHERE CIUD_COD = :CODCIUD INTO :NOMCIUD;
        FOR SELECT DISTINCT COBR_COD FROM MOVIMIENTO_CLIENTES WHERE TERC_NIT = :NIT AND
            MVCL_SUCURSAL = :SUCURSAL AND MVCL_FECHA <= :FECHA AND
            MVCL_ABONO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) AND MVCL_VENCE >= :VENCEINI AND MVCL_VENCE <= :VENCEFIN
            INTO :codcobr
            DO
            begin
            OK = 'N';
            if (GRPINI = '') then
                BEGIN
                if ((CODCOBR IS NULL) or (CODCOBR >= :GRPINI AND CODCOBR <= :GRPFIN)) then
                    OK = 'S';
                END
            ELSE
                if (CODCOBR >= :GRPINI AND CODCOBR <= :GRPFIN) then
                    OK = 'S';
            if (OK = 'S') then
                BEGIN
                SELECT COBR_NOM FROM COBRADORES  WHERE COBR_COD = :CODCOBR INTO :NOMCOBR;

                SALDO = 0;
                /* BUSQUE EN SALDOS_DOC_CARTERA LOS QUE TENGAN SALDO > 0 */
                FOR SELECT MVCL_TIPOREF, MVCL_IDREF
                  FROM MOVIMIENTO_CLIENTES WHERE TERC_NIT = :NIT AND MVCL_SUCURSAL = :SUCURSAL AND
                  MVCL_FECHA <= :FECHA AND COBR_COD = :codcobr AND MVCL_ABONO = 'N' AND
                  ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) AND MVCL_VENCE >= :VENCEINI AND
                  MVCL_VENCE <= :VENCEFIN AND ((:MONEDA = 0) or (MVCL_TRM <> 1))
                  INTO :TIPO, :ID
                  DO
                    if ((inclanti = 'SI') or (TIPO <> 45)) then
                        BEGIN
                        EXECUTE PROCEDURE saldo_doc_cartera(TIPO, ID, FECHA, MONEDA) returning_values (PSALDO);
                        if (PSALDO <> 0) then
                            BEGIN
                            SALDO = SALDO + PSALDO;
                            END
                        END
                DISPONIBLE = CUPO - SALDO;
                /* LOS RECIBOS PROVISIONALES */
                SELECT SUM(RPDE_ABONO), MAX(RCPR_TRM) FROM RECIBO_PROVISIONAL P, recibo_provisional_detalle D
                    WHERE P.rcpr_id = D.rcpr_id AND TERC_NIT = :NIT AND RPDE_SUCURSAL = :SUCURSAL AND ((:MONEDA = 0) or (RCPR_TRM <> 1)) AND
                    VEND_COD = :CODCOBR AND RCPR_FECHA <= :FECHA AND RCPR_ANULADO = 'N' AND ((RCPR_FECCRUCE IS NULL) or (RCPR_FECCRUCE > :FECHA)) AND
                    ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                    INTO :provisional, :TRM;
                if ((MONEDA <> 0) AND (TRM <> 0)) then
                    PROVISIONAL = PROVISIONAL / TRM;
                /* LAS NOTAS DE CLIENTES */
                I = 0;
                NOTA1 = '';
                NOTA2 = '';
                FOR SELECT CAST(NOCL_FECHA AS VARCHAR(10)), tido_nomcorto, NOCL_NUMDOC, NOCL_TEXTO
                    FROM NOTAS_CLIENTES N, TIPO_DOCUMENTO T WHERE N.NOCL_TIPODOC = T.TIDO_COD AND TERC_NIT = :NIT
                    AND N.TINO_COD = 3 AND N.CLSU_COD = :SUCURSAL
                    ORDER BY NOCL_FECHA DESC INTO :FECNOTA, :TIPODOC, :NUMDOC, :NOTA
                    DO
                    BEGIN
                    if (I = 0) then
                        NOTA1 = NOTA;
                    if (I = 1) then
                        NOTA2 = NOTA;
                    I = I + 1;
                    END
                SUSPEND;
                END  /* OK = S */
            END  /* FOR COBRADOR */
        END  /* AGRUPA = C */
    END  /* FOR NIT */
END
^

SET TERM ; ^

SET TERM ^ ;

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

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER PROCEDURE CUPO_DISPONIBLE(
    NIT VARCHAR(20),
    FECHA DATE,
    SUCURSAL VARCHAR(10))
RETURNS (
    DISPONIBLE NUMERIC(18,2))
AS
declare variable SALDO NUMERIC(18,2);
begin
SELECT CLIE_CUPO FROM CLIENTES WHERE TERC_NIT = :NIT INTO :DISPONIBLE;
if (DISPONIBLE IS NULL) then
    DISPONIBLE = 0;
SELECT SUM(SALDO) FROM VENCIDO_CLIENTE (:NIT, :FECHA, :SUCURSAL, 'N') INTO :SALDO;
if (SALDO IS NULL) then
    SALDO = 0;
DISPONIBLE = DISPONIBLE - SALDO;
SUSPEND;
end
^

SET TERM ; ^

SET TERM ^ ;

ALTER TRIGGER FACTURAS_BI
AS
declare variable NUMERO VARCHAR(6);
declare variable AUTOM CHAR(1);
declare variable EXISTE CHAR(1);
DECLARE VARIABLE VALCUPO CHAR(10);
declare variable DISPONIBLE NUMERIC(18,2);
declare variable OK CHAR(1);
declare variable SITOT CHAR(2);
declare variable CODCOBR INTEGER;
declare variable CODVEND INTEGER;
declare variable contado char(1);
declare variable BLOQAUTO CHAR(2);
declare variable FECCONTA VARCHAR(8);
declare variable FECBLO VARCHAR(8);
declare variable FECSERVER CHAR(2);
declare variable PREGTASA CHAR(2);
BEGIN
EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION', 'DOCUMENTOS', 'INHABILITAR FECHA EN DOCUMENTOS') returning_values (:fecserver);
if (FECSERVER = 'SI') then
    NEW.fact_fecha = CAST ('NOW' AS DATE);
/* doble moneda */
if ((NEW.fact_trm IS NULL) or (NEW.fact_trm = 0)) then
    NEW.fact_trm = 1;
EXECUTE PROCEDURE LEE_CONFIGURACION('GENERAL', 'GENERAL', 'PREGUNTAR TASA DE CAMBIO EN DOCUMENTOS DE CARTERA') returning_values (:pregtasa);
if (PREGTASA = 'SI') then
    BEGIN
    NEW.fact_dtomonto = NEW.fact_dtomonto * NEW.fact_trm;
    NEW.fact_comimonto = NEW.fact_comimonto * NEW.fact_trm;
    NEW.fact_adicional = NEW.fact_adicional * NEW.fact_trm;
    NEW.fact_ivamonto = NEW.fact_ivamonto * NEW.fact_trm;
    NEW.fact_rtftemonto = NEW.fact_rtftemonto * NEW.fact_trm;
    NEW.fact_rtivamonto = NEW.fact_rtivamonto * NEW.fact_trm;
    NEW.fact_rticamonto = NEW.fact_rticamonto * NEW.fact_trm;
    NEW.fact_extra = NEW.fact_extra * NEW.fact_trm;
    NEW.fact_dtofmonto = NEW.fact_dtofmonto * NEW.fact_trm;
    NEW.fact_total = NEW.fact_total * NEW.fact_trm;
    NEW.fact_dtoit1 = NEW.fact_dtoit1 * NEW.fact_trm;
    NEW.fact_dtoit2 = NEW.fact_dtoit2 * NEW.fact_trm;
    NEW.fact_dtoit3 = NEW.fact_dtoit3 * NEW.fact_trm;
    END
EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION', 'POS', 'CAMBIAR FECHA DE BLOQUEO AUTOMATICAMENTE AL CAMBIAR FECHA DE LA FACTURA') RETURNING_VALUES (:bloqauto);
if (bloqauto = 'SI') then
    BEGIN
    EXECUTE PROCEDURE LEE_CONFIGURACION ('CONTABILIDAD', 'GENERAL', 'FECHA DE BLOQUEO') RETURNING_VALUES (:FECBLO);
    EXECUTE PROCEDURE fecha_a_conta (NEW.fact_fecha) returning_values (:FECCONTA);
    if (FECBLO > FECCONTA) then
        EXCEPTION CONTABILIDAD_BLOQUEADA 'La contabilidad esta bloqueada a ' || :fecblo;
    if (FECBLO < FECCONTA) then
        UPDATE CONFIGURACION
            SET CONF_VALOR = :FECCONTA
            WHERE (CONF_MODULO = 'CONTABILIDAD') AND (CONF_CATEGORIA = 'GENERAL') AND (CONF_PROPIEDAD = 'FECHA DE BLOQUEO');
    END
OK = 'S';
EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'ACCION A TOMAR SI EL CUPO DE CREDITO ES INSUFICIENTE') RETURNING_VALUES (:VALCUPO);
select auto_contado from autorizaciones where pref_pre = new.pref_pre and tido_cod = 31 into :contado;
if (contado='N') then
BEGIN
  IF (VALCUPO = 'PROHIBIR') THEN
  BEGIN
  OK = 'N';
  /* VERIFIQUE EL CUPO DE CREDITO */
  execute procedure cupo_disponible(new.TERC_NIT, NEW.fact_fecha, NEW.fact_sucursal) returning_values (:DISPONIBLE);
  if (DISPONIBLE >= (NEW.FACT_TOTAL-NEW.fact_recibido)) then
    OK = 'S';
  END
END
IF (OK = 'S') THEN
  begin
  /* calcule la comision */
  EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION', 'VENDEDORES', 'COMISIONES EN VENTA INCLUYENDO IMPUESTOS') returning_values (:SITOT);
  if ((NEW.fact_comiporc IS NULL) or (NEW.fact_comiporc = 0)) THEN
    BEGIN
    if (SITOT = 'SI') then
      SELECT MAX(COMI_PORC) FROM comisiones WHERE VEND_COD = NEW.vend_cod AND
        COMI_INICIAL <= NEW.fact_total AND COMI_FINAL >= NEW.fact_total
        INTO NEW.fact_comiporc;
    else
      SELECT MAX(COMI_PORC) FROM comisiones WHERE VEND_COD = NEW.vend_cod AND
        COMI_INICIAL <= (NEW.fact_total -NEW.fact_ivamonto) AND COMI_FINAL >= (NEW.fact_total -NEW.fact_ivamonto)
        INTO NEW.fact_comiporc;
    if (NEW.fact_comiporc IS NULL) then
        NEW.fact_comiporc = 0;
    END
  if (SITOT = 'SI') then
      NEW.fact_comimonto = NEW.fact_total * NEW.fact_comiporc / 100;
  ELSE
      NEW.fact_comimonto = (NEW.fact_total -NEW.fact_ivamonto) * NEW.fact_comiporc / 100;

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

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

SET TERM ; ^

SET TERM ^ ;

ALTER TRIGGER PEDIDOS_BI
AS
declare variable NUMERO VARCHAR(6);
declare variable AUTOM CHAR(1);
declare variable EXISTE CHAR(1);
/*DECLARE VARIABLE VALCUPO CHAR(10);*/
declare variable CUPOPED CHAR(10);
declare variable DISPONIBLE NUMERIC(18,2);
declare variable OK CHAR(1);
declare variable FECSERVER CHAR(2);
BEGIN
EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION', 'DOCUMENTOS', 'INHABILITAR FECHA EN DOCUMENTOS') returning_values (:fecserver);
if (FECSERVER = 'SI') then
    NEW.pedi_fecha = CAST ('NOW' AS DATE);
OK = 'S';
/*EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'ACCION A TOMAR SI EL CUPO DE CREDITO ES INSUFICIENTE') RETURNING_VALUES (:VALCUPO);*/
EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION','PEDIDOS','VALIDAR CUPO DE CREDITO EN EL PEDIDO') RETURNING_VALUES (:CUPOPED);
IF (CUPOPED = 'PROHIBIR') THEN /*AND (CUPOPED = 'SI')) THEN*/
  BEGIN
  OK = 'N';
  /* VERIFIQUE EL CUPO DE CREDITO */
  execute procedure cupo_disponible(new.TERC_NIT, NEW.pedi_fecha, NEW.pedi_sucursal) returning_values (:DISPONIBLE);
  if (DISPONIBLE >= NEW.pedi_total) then
    OK = 'S';
  END
IF (OK = 'S') THEN
  begin
  if (NEW.NUMOK = 'N') then
    BEGIN
    /* Actualice el contador del prefijo */
    SELECT PREF_ACTUAL, PREF_AUTO FROM PREFIJOS WHERE TIDO_COD = 34 AND PREF_PRE = NEW.PREF_PRE INTO :NUMERO, :AUTOM;
    /* ACTUALICE EL NUMERO EN COMPROBANTE_ENCABEZADO  */
    if (AUTOM = 'S') then
        BEGIN
        NEW.PEDI_NUMERO = NUMERO;
        NUMERO = CAST((CAST(NUMERO AS INTEGER) + 1) AS CHAR(6));
        UPDATE PREFIJOS
          SET PREF_ACTUAL = :NUMERO
          WHERE TIDO_COD = 34 AND PREF_PRE = NEW.PREF_PRE;
        END
    ELSE
        BEGIN
        if (CAST(NUMERO AS INTEGER) = CAST(NEW.PEDI_NUMERO AS INTEGER)) then
            UPDATE PREFIJOS
                SET PREF_ACTUAL = CAST((CAST(PREF_ACTUAL AS INTEGER) + 1) AS CHAR(6))
                WHERE TIDO_COD = 34 AND PREF_PRE = NEW.PREF_PRE;
        END
    EXECUTE PROCEDURE COMPLETA_CEROS (NEW.PEDI_numero) returning_values (NEW.PEDI_numero);
    NEW.NUMOK = 'S';
    END
  /* Verifique que el numero no existe previamente */
  EXISTE = 'N';
  SELECT 'S' FROM PEDIDOS WHERE PREF_PRE = NEW.PREF_PRE AND PEDI_NUMERO = NEW.PEDI_NUMERO INTO :EXISTE;
  if (EXISTE = 'S') then
    EXCEPTION DOCUMENTO_REGISTRADO 'Ya existe un pedido con el número ' || new.pref_pre || new.pedi_numero;
  END
else
  begin
  EXCEPTION CUPO_INSUFICIENTE;
  end
if ((new.PEDI_TOTAL-new.PEDI_IVAMONTO+new.PEDI_DTOMONTO-new.PEDI_ADICIONAL) = 0) then
    NEW.PEDI_FACTOR = 1;
else
    NEW.PEDI_FACTOR = (new.PEDI_TOTAL-new.PEDI_IVAMONTO)/(new.PEDI_TOTAL-new.PEDI_IVAMONTO+new.PEDI_DTOMONTO-new.PEDI_ADICIONAL);
END
^

SET TERM ; ^

/* 20090127C PEDIDOS O COTIZACIONES DETALLADO NO SALEN */

SET TERM ^ ;

CREATE OR ALTER PROCEDURE REP_VENTAS_CLIENTE(
    TIPO INTEGER,
    NITDESDE VARCHAR(20),
    NITHASTA VARCHAR(20),
    FECINI DATE,
    FECFIN DATE,
    DETALLE CHAR(1),
    ORDEN CHAR(1),
    CEROS CHAR(1),
    SUBEMPRESA INTEGER)
RETURNS (
    NIT VARCHAR(20),
    NOMBRE VARCHAR(60),
    TELEFONO VARCHAR(40),
    CIUDAD VARCHAR(40),
    CODZONA VARCHAR(2),
    NOMZONA VARCHAR(30),
    NOMTIPO VARCHAR(50),
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(6),
    ID INTEGER,
    FECDOC DATE,
    CANTIDAD INTEGER,
    SUBTOTAL NUMERIC(18,2),
    DTO NUMERIC(18,2),
    ADICIONAL NUMERIC(18,2),
    IVA NUMERIC(18,2),
    EXTRA NUMERIC(18,2),
    TOTAL NUMERIC(18,2),
    RTFTE NUMERIC(18,2),
    RTIVA NUMERIC(18,2),
    RTICA NUMERIC(18,2),
    NETO NUMERIC(18,2))
AS
DECLARE VARIABLE NITINI VARCHAR(15);
DECLARE VARIABLE NITFIN VARCHAR(15);
DECLARE VARIABLE NOMINI VARCHAR(15);
DECLARE VARIABLE NOMFIN VARCHAR(15);
BEGIN
if (ORDEN = 'C') then
    BEGIN
    NITINI = NITDESDE;
    NITFIN = NITHASTA;
    NOMINI = '';
    NOMFIN = 'zz';
    END
ELSE
    BEGIN
    NITINI = NITDESDE;
    NITFIN = NITHASTA;
    NOMINI = '';
    NOMFIN = 'zz';
    END

SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = :TIPO INTO :NOMTIPO;
if (DETALLE = 'N') then
    BEGIN
    if (BIN_AND(TIPO, 1) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 31 INTO :NOMTIPO;
        FOR SELECT MAX(T.TERC_NIT), MAX(TERC_NOM), MAX(TERC_TEL), MAX(TERC_CIU), MAX(ZONA_COD),
            COUNT(*), SUM(FACT_DTOMONTO), SUM(FACT_ADICIONAL), SUM(FACT_IVAMONTO), SUM(FACT_EXTRA), SUM(FACT_RTFTEMONTO), SUM(FACT_RTIVAMONTO), SUM(FACT_RTICAMONTO), SUM(FACT_TOTAL)
            FROM FACTURAS F, PREFIJOS P, terceros T, CLIENTES C
            where C.TERC_NIT = T.TERC_NIT AND T.TERC_CLIE = 'S' AND T.TERC_NIT >= :NITINI AND T.TERC_NIT <= :NITFIN AND TERC_NOM >= :NOMINI AND TERC_NOM <= :NOMFIN
             AND F.TERC_NIT = T.terc_nit AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND FACT_ANULADO = 'N'
             AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY F.terc_nit
            INTO :NIT, :NOMBRE, :TELEFONO, :CIUDAD, :CODZONA, :CANTIDAD, :DTO, :ADICIONAL, :IVA, :EXTRA, :RTFTE, :RTIVA, :RTICA, :TOTAL
            DO
            BEGIN
            SELECT ZONA_NOM FROM ZONAS WHERE ZONA_COD = :codzona INTO :NOMZONA;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (DTO IS NULL) then
                DTO = 0;
            if (ADICIONAL IS NULL) then
                ADICIONAL = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (EXTRA IS NULL) then
                EXTRA = 0;
            if (RTFTE IS NULL) then
                RTFTE = 0;
            if (RTIVA IS NULL) then
                RTIVA = 0;
            if (RTICA IS NULL) then
                RTICA = 0;
            SUBTOTAL = TOTAL - EXTRA - IVA - ADICIONAL + DTO;
            NETO = TOTAL - RTFTE - RTIVA - RTICA;
            if (CEROS = 'S') then
              SUSPEND;
            ELSE
              if (CANTIDAD > 0) then
                SUSPEND;
            END
        END
    if (BIN_AND(TIPO, 2) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 32 INTO :NOMTIPO;
        FOR SELECT MAX(T.TERC_NIT), MAX(TERC_NOM), MAX(TERC_TEL), MAX(TERC_CIU), MAX(ZONA_COD),
            COUNT(*), 0, 0, SUM(REVT_IVAMONTO), 0, 0, 0, 0, SUM(REVT_TOTAL)
            FROM REMISIONES_VENTA R, PREFIJOS P, terceros T, CLIENTES C
            where C.TERC_NIT = T.TERC_NIT AND T.TERC_CLIE = 'S' AND T.TERC_NIT >= :NITINI AND T.TERC_NIT <= :NITFIN AND TERC_NOM >= :NOMINI AND TERC_NOM <= :NOMFIN
             AND R.TERC_NIT = T.terc_nit AND REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN AND REVT_ANULADO = 'N'
             AND P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = 32 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY R.terc_nit
            INTO :NIT, :NOMBRE, :TELEFONO, :CIUDAD, :CODZONA, :CANTIDAD, :DTO, :ADICIONAL, :IVA, :EXTRA, :RTFTE, :RTIVA, :RTICA, :TOTAL
            DO
            BEGIN
            SELECT ZONA_NOM FROM ZONAS WHERE ZONA_COD = :codzona INTO :NOMZONA;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (DTO IS NULL) then
                DTO = 0;
            if (ADICIONAL IS NULL) then
                ADICIONAL = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (EXTRA IS NULL) then
                EXTRA = 0;
            if (RTFTE IS NULL) then
                RTFTE = 0;
            if (RTIVA IS NULL) then
                RTIVA = 0;
            if (RTICA IS NULL) then
                RTICA = 0;
            SUBTOTAL = TOTAL - EXTRA - IVA - ADICIONAL + DTO;
            NETO = TOTAL - RTFTE - RTIVA - RTICA;
            if (CEROS = 'S') then
              SUSPEND;
            ELSE
              if (CANTIDAD > 0) then
                SUSPEND;
            END
        END
    if (BIN_AND(TIPO, 4) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 33 INTO :NOMTIPO;
        FOR SELECT MAX(T.TERC_NIT), MAX(TERC_NOM), MAX(TERC_TEL), MAX(TERC_CIU), MAX(ZONA_COD),
            COUNT(*), SUM(DEVT_DTOMONTO), SUM(DEVT_ADICIONAL), SUM(DEVT_IVAMONTO), SUM(DEVT_EXTRA), SUM(DEVT_RTFTEMONTO), SUM(DEVT_RTIVAMONTO), SUM(DEVT_RTICAMONTO), SUM(DEVT_TOTAL)
            FROM DEVOLUCIONES_VENTAS V, PREFIJOS P, terceros T, CLIENTES C
            where C.TERC_NIT = T.TERC_NIT AND T.TERC_CLIE = 'S' AND T.TERC_NIT >= :NITINI AND T.TERC_NIT <= :NITFIN AND TERC_NOM >= :NOMINI AND TERC_NOM <= :NOMFIN
             AND V.TERC_NIT = T.terc_nit AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND DEVT_ANULADO = 'N'
             AND P.PREF_PRE = V.PREF_PRE AND P.TIDO_COD = 33 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) AND ((DEVT_REMID = 0) or (DEVT_REMID IS NULL))
            GROUP BY V.terc_nit
            INTO :NIT, :NOMBRE, :TELEFONO, :CIUDAD, :CODZONA, :CANTIDAD, :DTO, :ADICIONAL, :IVA, :EXTRA, :RTFTE, :RTIVA, :RTICA, :TOTAL
            DO
            BEGIN
            SELECT ZONA_NOM FROM ZONAS WHERE ZONA_COD = :codzona INTO :NOMZONA;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (DTO IS NULL) then
                DTO = 0;
            if (ADICIONAL IS NULL) then
                ADICIONAL = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (EXTRA IS NULL) then
                EXTRA = 0;
            if (RTFTE IS NULL) then
                RTFTE = 0;
            if (RTIVA IS NULL) then
                RTIVA = 0;
            if (RTICA IS NULL) then
                RTICA = 0;
            SUBTOTAL = TOTAL - EXTRA - IVA - ADICIONAL + DTO;
            NETO = TOTAL - RTFTE - RTIVA - RTICA;
            CANTIDAD = CANTIDAD * -1;
            SUBTOTAL = SUBTOTAL * -1;
            TOTAL = TOTAL * -1;
            IVA = IVA * -1;
            EXTRA = EXTRA * -1;
            DTO = DTO * -1;
            ADICIONAL = ADICIONAL * -1;
            RTFTE = RTFTE * -1;
            RTIVA = RTIVA * -1;
            RTICA = RTICA * -1;
            if (CEROS = 'S') then
              SUSPEND;
            ELSE
              if (CANTIDAD > 0) then
                SUSPEND;
            END
        END
    if (BIN_AND(TIPO, 8) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 34 INTO :NOMTIPO;
        FOR SELECT MAX(T.TERC_NIT), MAX(TERC_NOM), MAX(TERC_TEL), MAX(TERC_CIU), MAX(ZONA_COD),
            COUNT(*), SUM(PEDI_DTOMONTO), SUM(PEDI_ADICIONAL), SUM(PEDI_IVAMONTO), SUM(PEDI_EXTRA), 0, 0, 0, SUM(PEDI_TOTAL)
            FROM PEDIDOS P, PREFIJOS PR, terceros T, CLIENTES C
            where C.TERC_NIT = T.TERC_NIT AND T.TERC_CLIE = 'S' AND T.TERC_NIT >= :NITINI AND T.TERC_NIT <= :NITFIN AND TERC_NOM >= :NOMINI AND TERC_NOM <= :NOMFIN
             AND P.TERC_NIT = T.terc_nit AND PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND PEDI_ANULADO = 'N'
             AND PR.PREF_PRE = P.PREF_PRE AND P.TIDO_COD = 34 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY P.terc_nit
            INTO :NIT, :NOMBRE, :TELEFONO, :CIUDAD, :CODZONA, :CANTIDAD, :DTO, :ADICIONAL, :IVA, :EXTRA, :RTFTE, :RTIVA, :RTICA, :TOTAL
            DO
            BEGIN
            SELECT ZONA_NOM FROM ZONAS WHERE ZONA_COD = :codzona INTO :NOMZONA;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (DTO IS NULL) then
                DTO = 0;
            if (ADICIONAL IS NULL) then
                ADICIONAL = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (EXTRA IS NULL) then
                EXTRA = 0;
            if (RTFTE IS NULL) then
                RTFTE = 0;
            if (RTIVA IS NULL) then
                RTIVA = 0;
            if (RTICA IS NULL) then
                RTICA = 0;
            SUBTOTAL = TOTAL - EXTRA - IVA - ADICIONAL + DTO;
            NETO = TOTAL - RTFTE - RTIVA - RTICA;
            if (CEROS = 'S') then
              SUSPEND;
            ELSE
              if (CANTIDAD > 0) then
                SUSPEND;
            END
        END
    if (BIN_AND(TIPO, 16) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 35 INTO :NOMTIPO;
        FOR SELECT MAX(T.TERC_NIT), MAX(TERC_NOM), MAX(TERC_TEL), MAX(TERC_CIU), MAX(ZONA_COD),
            COUNT(*), SUM(COTI_DTOMONTO), SUM(COTI_ADICIONAL), SUM(COTI_IVAMONTO), SUM(COTI_EXTRA), 0, 0, 0, SUM(COTI_TOTAL)
            FROM COTIZACIONES CT, PREFIJOS P, terceros T, CLIENTES C
            where C.TERC_NIT = T.TERC_NIT AND T.TERC_CLIE = 'S' AND T.TERC_NIT >= :NITINI AND T.TERC_NIT <= :NITFIN AND TERC_NOM >= :NOMINI AND TERC_NOM <= :NOMFIN
             AND CT.TERC_NIT = T.terc_nit AND COTI_FECHA >= :FECINI AND COTI_FECHA <= :FECFIN AND COTI_ANULADO = 'N'
             AND P.PREF_PRE = CT.PREF_PRE AND P.TIDO_COD = 35 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY C.terc_nit
            INTO :NIT, :NOMBRE, :TELEFONO, :CIUDAD, :CODZONA, :CANTIDAD, :DTO, :ADICIONAL, :IVA, :EXTRA, :RTFTE, :RTIVA, :RTICA, :TOTAL
            DO
            BEGIN
            SELECT ZONA_NOM FROM ZONAS WHERE ZONA_COD = :codzona INTO :NOMZONA;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (DTO IS NULL) then
                DTO = 0;
            if (ADICIONAL IS NULL) then
                ADICIONAL = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (EXTRA IS NULL) then
                EXTRA = 0;
            if (RTFTE IS NULL) then
                RTFTE = 0;
            if (RTIVA IS NULL) then
                RTIVA = 0;
            if (RTICA IS NULL) then
                RTICA = 0;
            SUBTOTAL = TOTAL - EXTRA - IVA - ADICIONAL + DTO;
            NETO = TOTAL - RTFTE - RTIVA - RTICA;
            if (CEROS = 'S') then
              SUSPEND;
            ELSE
              if (CANTIDAD > 0) then
                SUSPEND;
            END
        END
    END
ELSE
    BEGIN
    if (BIN_AND(TIPO, 1) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 31 INTO :NOMTIPO;
        FOR SELECT FACT_ID, F.PREF_PRE, FACT_NUMERO, FACT_FECHA, FACT_DTOMONTO, FACT_ADICIONAL, FACT_IVAMONTO, FACT_EXTRA, FACT_TOTAL, FACT_RTFTEMONTO, FACT_RTIVAMONTO, FACT_RTICAMONTO, T.TERC_NIT, TERC_NOM, ZONA_COD, TERC_TEL, TERC_CIU
            FROM FACTURAS F, PREFIJOS P, terceros T, CLIENTES C
            where C.TERC_NIT = T.TERC_NIT AND T.TERC_CLIE = 'S' AND T.TERC_NIT >= :NITINI AND T.TERC_NIT <= :NITFIN AND TERC_NOM >= :NOMINI AND TERC_NOM <= :NOMFIN
             AND F.TERC_NIT = T.terc_nit AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND FACT_ANULADO = 'N'
             AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            ORDER BY FACT_FECHA, FACT_ID
            INTO :ID, :PREFIJO, :NUMERO, :FECDOC, :DTO, :ADICIONAL, :IVA, :EXTRA, :TOTAL, :RTFTE, :RTIVA, :RTICA, :nit, :nombre, :codzona, :telefono, :ciudad
            DO
            BEGIN
            SELECT ZONA_NOM FROM ZONAS WHERE ZONA_COD = :codzona INTO :NOMZONA;
            SUBTOTAL = TOTAL - EXTRA - IVA - ADICIONAL + DTO;
            NETO = TOTAL - RTFTE - RTIVA - RTICA;
            SUSPEND;
            END
        END
    if (BIN_AND(TIPO, 2) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 32 INTO :NOMTIPO;
        FOR SELECT REVT_ID, R.PREF_PRE, REVT_NUMERO, REVT_FECHA, 0, 0, REVT_IVAMONTO, 0, REVT_TOTAL, 0, 0, 0, T.TERC_NIT, TERC_NOM, ZONA_COD, TERC_TEL, TERC_CIU
            FROM REMISIONES_VENTA R, PREFIJOS P, terceros T, CLIENTES C
            where C.TERC_NIT = T.TERC_NIT AND T.TERC_CLIE = 'S' AND T.TERC_NIT >= :NITINI AND T.TERC_NIT <= :NITFIN AND TERC_NOM >= :NOMINI AND TERC_NOM <= :NOMFIN
             AND R.TERC_NIT = T.terc_nit AND REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN AND REVT_ANULADO = 'N'
             AND P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = 32 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            ORDER BY REVT_FECHA, REVT_ID
            INTO :ID, :PREFIJO, :NUMERO, :FECDOC, :DTO, :ADICIONAL, :IVA, :EXTRA, :TOTAL, :RTFTE, :RTIVA, :RTICA, :nit, :nombre, :codzona, :telefono, :ciudad
            DO
            BEGIN
            SELECT ZONA_NOM FROM ZONAS WHERE ZONA_COD = :codzona INTO :NOMZONA;
            SUBTOTAL = TOTAL - EXTRA - IVA - ADICIONAL + DTO;
            NETO = TOTAL - RTFTE - RTIVA - RTICA;
            SUSPEND;
            END
        END
    if (BIN_AND(TIPO, 4) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 33 INTO :NOMTIPO;
        FOR SELECT DEVT_ID, V.PREF_PRE, DEVT_NUMERO, DEVT_FECHA, DEVT_DTOMONTO, DEVT_ADICIONAL, DEVT_IVAMONTO, DEVT_EXTRA, DEVT_TOTAL, DEVT_RTFTEMONTO, DEVT_RTIVAMONTO, DEVT_RTICAMONTO, T.TERC_NIT, TERC_NOM, ZONA_COD, TERC_TEL, TERC_CIU
            FROM DEVOLUCIONES_VENTAS V, PREFIJOS P, terceros T, CLIENTES C
            where C.TERC_NIT = T.TERC_NIT AND T.TERC_CLIE = 'S' AND T.TERC_NIT >= :NITINI AND T.TERC_NIT <= :NITFIN AND TERC_NOM >= :NOMINI AND TERC_NOM <= :NOMFIN
             AND V.TERC_NIT = T.terc_nit AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND DEVT_ANULADO = 'N'
             AND P.PREF_PRE = V.PREF_PRE AND P.TIDO_COD = 33 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) AND ((DEVT_REMID = 0) or (DEVT_REMID IS NULL))
            ORDER BY DEVT_FECHA, DEVT_ID
            INTO :ID, :PREFIJO, :NUMERO, :FECDOC, :DTO, :ADICIONAL, :IVA, :EXTRA, :TOTAL, :RTFTE, :RTIVA, :RTICA, :nit, :nombre, :codzona, :telefono, :ciudad
            DO
            BEGIN
            SELECT ZONA_NOM FROM ZONAS WHERE ZONA_COD = :codzona INTO :NOMZONA;
            SUBTOTAL = TOTAL - EXTRA - IVA - ADICIONAL + DTO;
            NETO = TOTAL - RTFTE - RTIVA - RTICA;
            CANTIDAD = CANTIDAD * -1;
            SUBTOTAL = SUBTOTAL * -1;
            TOTAL = TOTAL * -1;
            IVA = IVA * -1;
            EXTRA = EXTRA * -1;
            DTO = DTO * -1;
            ADICIONAL = ADICIONAL * -1;
            RTFTE = RTFTE * -1;
            RTIVA = RTIVA * -1;
            RTICA = RTICA * -1;
            SUSPEND;
            END
        END
    if (BIN_AND(TIPO, 8) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 34 INTO :NOMTIPO;
        FOR SELECT PEDI_ID, P.PREF_PRE, PEDI_NUMERO, PEDI_FECHA, PEDI_DTOMONTO, PEDI_ADICIONAL, PEDI_IVAMONTO, PEDI_EXTRA, PEDI_TOTAL, 0, 0, 0, T.TERC_NIT, TERC_NOM, ZONA_COD, TERC_TEL, TERC_CIU
            FROM PEDIDOS P, PREFIJOS PR, terceros T, CLIENTES C
            where C.TERC_NIT = T.TERC_NIT AND T.TERC_CLIE = 'S' AND T.TERC_NIT >= :NITINI AND T.TERC_NIT <= :NITFIN AND TERC_NOM >= :NOMINI AND TERC_NOM <= :NOMFIN
             AND P.TERC_NIT = T.terc_nit AND PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND PEDI_ANULADO = 'N'
             AND P.PREF_PRE = PR.PREF_PRE AND P.TIDO_COD = 34 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            ORDER BY PEDI_FECHA, PEDI_ID
            INTO :ID, :PREFIJO, :NUMERO, :FECDOC, :DTO, :ADICIONAL, :IVA, :EXTRA, :TOTAL, :RTFTE, :RTIVA, :RTICA, :nit, :nombre, :codzona, :telefono, :ciudad
            DO
            BEGIN
            SELECT ZONA_NOM FROM ZONAS WHERE ZONA_COD = :codzona INTO :NOMZONA;
            SUBTOTAL = TOTAL - EXTRA - IVA - ADICIONAL + DTO;
            NETO = TOTAL - RTFTE - RTIVA - RTICA;
            SUSPEND;
            END
        END
    if (BIN_AND(TIPO, 16) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 35 INTO :NOMTIPO;
        FOR SELECT COTI_ID, CT.PREF_PRE, COTI_NUMERO, COTI_FECHA, COTI_DTOMONTO, COTI_ADICIONAL, COTI_IVAMONTO, COTI_EXTRA, COTI_TOTAL, 0, 0, 0, T.TERC_NIT, TERC_NOM, ZONA_COD, TERC_TEL, TERC_CIU
            FROM COTIZACIONES CT, PREFIJOS P, terceros T, CLIENTES C
            where C.TERC_NIT = T.TERC_NIT AND T.TERC_CLIE = 'S' AND T.TERC_NIT >= :NITINI AND T.TERC_NIT <= :NITFIN AND TERC_NOM >= :NOMINI AND TERC_NOM <= :NOMFIN
             AND CT.TERC_NIT = T.terc_nit AND COTI_FECHA >= :FECINI AND COTI_FECHA <= :FECFIN AND COTI_ANULADO = 'N'
             AND P.PREF_PRE = CT.PREF_PRE AND P.TIDO_COD = 35 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            ORDER BY COTI_FECHA, COTI_ID
            INTO :ID, :PREFIJO, :NUMERO, :FECDOC, :DTO, :ADICIONAL, :IVA, :EXTRA, :TOTAL, :RTFTE, :RTIVA, :RTICA, :nit, :nombre, :codzona, :telefono, :ciudad
            DO
            BEGIN
            SELECT ZONA_NOM FROM ZONAS WHERE ZONA_COD = :codzona INTO :NOMZONA;
            SUBTOTAL = TOTAL - EXTRA - IVA - ADICIONAL + DTO;
            NETO = TOTAL - RTFTE - RTIVA - RTICA;
            SUSPEND;
            END
        END
    END
END
^

SET TERM ; ^



/* 20090128 dv, apellidos, nombres y ciudad en reportes de ventas por cliente para medios mag */

SET TERM ^ ;

CREATE OR ALTER PROCEDURE REP_VENTAS_CLIENTE(
    TIPO INTEGER,
    NITDESDE VARCHAR(20),
    NITHASTA VARCHAR(20),
    FECINI DATE,
    FECFIN DATE,
    DETALLE CHAR(1),
    ORDEN CHAR(1),
    CEROS CHAR(1),
    SUBEMPRESA INTEGER)
RETURNS (
    NIT VARCHAR(20),
    NOMBRE VARCHAR(60),
    DV CHAR(1),
    TELEFONO VARCHAR(40),
    CIUDAD VARCHAR(40),
    CODZONA VARCHAR(2),
    NOMZONA VARCHAR(30),
    NOMTIPO VARCHAR(50),
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(6),
    ID INTEGER,
    FECDOC DATE,
    CANTIDAD INTEGER,
    SUBTOTAL NUMERIC(18,2),
    DTO NUMERIC(18,2),
    ADICIONAL NUMERIC(18,2),
    IVA NUMERIC(18,2),
    EXTRA NUMERIC(18,2),
    TOTAL NUMERIC(18,2),
    RTFTE NUMERIC(18,2),
    RTIVA NUMERIC(18,2),
    RTICA NUMERIC(18,2),
    NETO NUMERIC(18,2),
    APELLIDO1 VARCHAR(60),
    APELLIDO2 VARCHAR(60),
    NOMBRE1 VARCHAR(60),
    NOMBRE2 VARCHAR(60),
    CODCIU VARCHAR(5))
AS
DECLARE VARIABLE NITINI VARCHAR(15);
DECLARE VARIABLE NITFIN VARCHAR(15);
DECLARE VARIABLE NOMINI VARCHAR(15);
DECLARE VARIABLE NOMFIN VARCHAR(15);
BEGIN
if (ORDEN = 'C') then
    BEGIN
    NITINI = NITDESDE;
    NITFIN = NITHASTA;
    NOMINI = '';
    NOMFIN = 'zz';
    END
ELSE
    BEGIN
    NITINI = NITDESDE;
    NITFIN = NITHASTA;
    NOMINI = '';
    NOMFIN = 'zz';
    END

SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = :TIPO INTO :NOMTIPO;
if (DETALLE = 'N') then
    BEGIN
    if (BIN_AND(TIPO, 1) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 31 INTO :NOMTIPO;
        FOR SELECT MAX(T.TERC_NIT), MAX(TERC_NOM), MAX(TERC_TEL), MAX(TERC_CIU), MAX(ZONA_COD), MAX(TERC_DV), MAX(TERC_APELLIDO1), MAX(TERC_APELLIDO2), MAX(TERC_NOMBRE1), MAX(TERC_NOMBRE2), MAX(T.CIUD_COD),
            COUNT(*), SUM(FACT_DTOMONTO), SUM(FACT_ADICIONAL), SUM(FACT_IVAMONTO), SUM(FACT_EXTRA), SUM(FACT_RTFTEMONTO), SUM(FACT_RTIVAMONTO), SUM(FACT_RTICAMONTO), SUM(FACT_TOTAL)
            FROM FACTURAS F, PREFIJOS P, terceros T, CLIENTES C
            where C.TERC_NIT = T.TERC_NIT AND T.TERC_CLIE = 'S' AND T.TERC_NIT >= :NITINI AND T.TERC_NIT <= :NITFIN AND TERC_NOM >= :NOMINI AND TERC_NOM <= :NOMFIN
             AND F.TERC_NIT = T.terc_nit AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND FACT_ANULADO = 'N'
             AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY F.terc_nit
            INTO :NIT, :NOMBRE, :TELEFONO, :CIUDAD, :CODZONA, :DV, :APELLIDO1, :APELLIDO2, :NOMBRE1, :NOMBRE2, :CODCIU,
            :CANTIDAD, :DTO, :ADICIONAL, :IVA, :EXTRA, :RTFTE, :RTIVA, :RTICA, :TOTAL
            DO
            BEGIN
            SELECT ZONA_NOM FROM ZONAS WHERE ZONA_COD = :codzona INTO :NOMZONA;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (DTO IS NULL) then
                DTO = 0;
            if (ADICIONAL IS NULL) then
                ADICIONAL = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (EXTRA IS NULL) then
                EXTRA = 0;
            if (RTFTE IS NULL) then
                RTFTE = 0;
            if (RTIVA IS NULL) then
                RTIVA = 0;
            if (RTICA IS NULL) then
                RTICA = 0;
            SUBTOTAL = TOTAL - EXTRA - IVA - ADICIONAL + DTO;
            NETO = TOTAL - RTFTE - RTIVA - RTICA;
            if (CEROS = 'S') then
              SUSPEND;
            ELSE
              if (CANTIDAD > 0) then
                SUSPEND;
            END
        END
    if (BIN_AND(TIPO, 2) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 32 INTO :NOMTIPO;
        FOR SELECT MAX(T.TERC_NIT), MAX(TERC_NOM), MAX(TERC_TEL), MAX(TERC_CIU), MAX(ZONA_COD), MAX(TERC_DV), MAX(TERC_APELLIDO1), MAX(TERC_APELLIDO2), MAX(TERC_NOMBRE1), MAX(TERC_NOMBRE2), MAX(T.CIUD_COD),
            COUNT(*), 0, 0, SUM(REVT_IVAMONTO), 0, 0, 0, 0, SUM(REVT_TOTAL)
            FROM REMISIONES_VENTA R, PREFIJOS P, terceros T, CLIENTES C
            where C.TERC_NIT = T.TERC_NIT AND T.TERC_CLIE = 'S' AND T.TERC_NIT >= :NITINI AND T.TERC_NIT <= :NITFIN AND TERC_NOM >= :NOMINI AND TERC_NOM <= :NOMFIN
             AND R.TERC_NIT = T.terc_nit AND REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN AND REVT_ANULADO = 'N'
             AND P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = 32 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY R.terc_nit
            INTO :NIT, :NOMBRE, :TELEFONO, :CIUDAD, :CODZONA, :DV, :APELLIDO1, :APELLIDO2, :NOMBRE1, :NOMBRE2, :CODCIU,
            :CANTIDAD, :DTO, :ADICIONAL, :IVA, :EXTRA, :RTFTE, :RTIVA, :RTICA, :TOTAL
            DO
            BEGIN
            SELECT ZONA_NOM FROM ZONAS WHERE ZONA_COD = :codzona INTO :NOMZONA;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (DTO IS NULL) then
                DTO = 0;
            if (ADICIONAL IS NULL) then
                ADICIONAL = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (EXTRA IS NULL) then
                EXTRA = 0;
            if (RTFTE IS NULL) then
                RTFTE = 0;
            if (RTIVA IS NULL) then
                RTIVA = 0;
            if (RTICA IS NULL) then
                RTICA = 0;
            SUBTOTAL = TOTAL - EXTRA - IVA - ADICIONAL + DTO;
            NETO = TOTAL - RTFTE - RTIVA - RTICA;
            if (CEROS = 'S') then
              SUSPEND;
            ELSE
              if (CANTIDAD > 0) then
                SUSPEND;
            END
        END
    if (BIN_AND(TIPO, 4) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 33 INTO :NOMTIPO;
        FOR SELECT MAX(T.TERC_NIT), MAX(TERC_NOM), MAX(TERC_TEL), MAX(TERC_CIU), MAX(ZONA_COD), MAX(TERC_DV), MAX(TERC_APELLIDO1), MAX(TERC_APELLIDO2), MAX(TERC_NOMBRE1), MAX(TERC_NOMBRE2), MAX(T.CIUD_COD),
            COUNT(*), SUM(DEVT_DTOMONTO), SUM(DEVT_ADICIONAL), SUM(DEVT_IVAMONTO), SUM(DEVT_EXTRA), SUM(DEVT_RTFTEMONTO), SUM(DEVT_RTIVAMONTO), SUM(DEVT_RTICAMONTO), SUM(DEVT_TOTAL)
            FROM DEVOLUCIONES_VENTAS V, PREFIJOS P, terceros T, CLIENTES C
            where C.TERC_NIT = T.TERC_NIT AND T.TERC_CLIE = 'S' AND T.TERC_NIT >= :NITINI AND T.TERC_NIT <= :NITFIN AND TERC_NOM >= :NOMINI AND TERC_NOM <= :NOMFIN
             AND V.TERC_NIT = T.terc_nit AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND DEVT_ANULADO = 'N'
             AND P.PREF_PRE = V.PREF_PRE AND P.TIDO_COD = 33 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) AND ((DEVT_REMID = 0) or (DEVT_REMID IS NULL))
            GROUP BY V.terc_nit
            INTO :NIT, :NOMBRE, :TELEFONO, :CIUDAD, :CODZONA, :DV, :APELLIDO1, :APELLIDO2, :NOMBRE1, :NOMBRE2, :CODCIU,
             :CANTIDAD, :DTO, :ADICIONAL, :IVA, :EXTRA, :RTFTE, :RTIVA, :RTICA, :TOTAL
            DO
            BEGIN
            SELECT ZONA_NOM FROM ZONAS WHERE ZONA_COD = :codzona INTO :NOMZONA;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (DTO IS NULL) then
                DTO = 0;
            if (ADICIONAL IS NULL) then
                ADICIONAL = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (EXTRA IS NULL) then
                EXTRA = 0;
            if (RTFTE IS NULL) then
                RTFTE = 0;
            if (RTIVA IS NULL) then
                RTIVA = 0;
            if (RTICA IS NULL) then
                RTICA = 0;
            SUBTOTAL = TOTAL - EXTRA - IVA - ADICIONAL + DTO;
            NETO = TOTAL - RTFTE - RTIVA - RTICA;
            CANTIDAD = CANTIDAD * -1;
            SUBTOTAL = SUBTOTAL * -1;
            TOTAL = TOTAL * -1;
            IVA = IVA * -1;
            EXTRA = EXTRA * -1;
            DTO = DTO * -1;
            ADICIONAL = ADICIONAL * -1;
            RTFTE = RTFTE * -1;
            RTIVA = RTIVA * -1;
            RTICA = RTICA * -1;
            if (CEROS = 'S') then
              SUSPEND;
            ELSE
              if (CANTIDAD > 0) then
                SUSPEND;
            END
        END
    if (BIN_AND(TIPO, 8) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 34 INTO :NOMTIPO;
        FOR SELECT MAX(T.TERC_NIT), MAX(TERC_NOM), MAX(TERC_TEL), MAX(TERC_CIU), MAX(ZONA_COD), MAX(TERC_DV), MAX(TERC_APELLIDO1), MAX(TERC_APELLIDO2), MAX(TERC_NOMBRE1), MAX(TERC_NOMBRE2), MAX(T.CIUD_COD),
            COUNT(*), SUM(PEDI_DTOMONTO), SUM(PEDI_ADICIONAL), SUM(PEDI_IVAMONTO), SUM(PEDI_EXTRA), 0, 0, 0, SUM(PEDI_TOTAL)
            FROM PEDIDOS P, PREFIJOS PR, terceros T, CLIENTES C
            where C.TERC_NIT = T.TERC_NIT AND T.TERC_CLIE = 'S' AND T.TERC_NIT >= :NITINI AND T.TERC_NIT <= :NITFIN AND TERC_NOM >= :NOMINI AND TERC_NOM <= :NOMFIN
             AND P.TERC_NIT = T.terc_nit AND PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND PEDI_ANULADO = 'N'
             AND PR.PREF_PRE = P.PREF_PRE AND P.TIDO_COD = 34 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY P.terc_nit
            INTO :NIT, :NOMBRE, :TELEFONO, :CIUDAD, :CODZONA, :DV, :APELLIDO1, :APELLIDO2, :NOMBRE1, :NOMBRE2, :CODCIU,
            :CANTIDAD, :DTO, :ADICIONAL, :IVA, :EXTRA, :RTFTE, :RTIVA, :RTICA, :TOTAL
            DO
            BEGIN
            SELECT ZONA_NOM FROM ZONAS WHERE ZONA_COD = :codzona INTO :NOMZONA;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (DTO IS NULL) then
                DTO = 0;
            if (ADICIONAL IS NULL) then
                ADICIONAL = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (EXTRA IS NULL) then
                EXTRA = 0;
            if (RTFTE IS NULL) then
                RTFTE = 0;
            if (RTIVA IS NULL) then
                RTIVA = 0;
            if (RTICA IS NULL) then
                RTICA = 0;
            SUBTOTAL = TOTAL - EXTRA - IVA - ADICIONAL + DTO;
            NETO = TOTAL - RTFTE - RTIVA - RTICA;
            if (CEROS = 'S') then
              SUSPEND;
            ELSE
              if (CANTIDAD > 0) then
                SUSPEND;
            END
        END
    if (BIN_AND(TIPO, 16) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 35 INTO :NOMTIPO;
        FOR SELECT MAX(T.TERC_NIT), MAX(TERC_NOM), MAX(TERC_TEL), MAX(TERC_CIU), MAX(ZONA_COD), MAX(TERC_DV), MAX(TERC_APELLIDO1), MAX(TERC_APELLIDO2), MAX(TERC_NOMBRE1), MAX(TERC_NOMBRE2), MAX(T.CIUD_COD),
            COUNT(*), SUM(COTI_DTOMONTO), SUM(COTI_ADICIONAL), SUM(COTI_IVAMONTO), SUM(COTI_EXTRA), 0, 0, 0, SUM(COTI_TOTAL)
            FROM COTIZACIONES CT, PREFIJOS P, terceros T, CLIENTES C
            where C.TERC_NIT = T.TERC_NIT AND T.TERC_CLIE = 'S' AND T.TERC_NIT >= :NITINI AND T.TERC_NIT <= :NITFIN AND TERC_NOM >= :NOMINI AND TERC_NOM <= :NOMFIN
             AND CT.TERC_NIT = T.terc_nit AND COTI_FECHA >= :FECINI AND COTI_FECHA <= :FECFIN AND COTI_ANULADO = 'N'
             AND P.PREF_PRE = CT.PREF_PRE AND P.TIDO_COD = 35 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY C.terc_nit
            INTO :NIT, :NOMBRE, :TELEFONO, :CIUDAD, :CODZONA, :DV, :APELLIDO1, :APELLIDO2, :NOMBRE1, :NOMBRE2, :CODCIU,
            :CANTIDAD, :DTO, :ADICIONAL, :IVA, :EXTRA, :RTFTE, :RTIVA, :RTICA, :TOTAL
            DO
            BEGIN
            SELECT ZONA_NOM FROM ZONAS WHERE ZONA_COD = :codzona INTO :NOMZONA;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (DTO IS NULL) then
                DTO = 0;
            if (ADICIONAL IS NULL) then
                ADICIONAL = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (EXTRA IS NULL) then
                EXTRA = 0;
            if (RTFTE IS NULL) then
                RTFTE = 0;
            if (RTIVA IS NULL) then
                RTIVA = 0;
            if (RTICA IS NULL) then
                RTICA = 0;
            SUBTOTAL = TOTAL - EXTRA - IVA - ADICIONAL + DTO;
            NETO = TOTAL - RTFTE - RTIVA - RTICA;
            if (CEROS = 'S') then
              SUSPEND;
            ELSE
              if (CANTIDAD > 0) then
                SUSPEND;
            END
        END
    END
ELSE
    BEGIN
    if (BIN_AND(TIPO, 1) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 31 INTO :NOMTIPO;
        FOR SELECT FACT_ID, F.PREF_PRE, FACT_NUMERO, FACT_FECHA, FACT_DTOMONTO, FACT_ADICIONAL, FACT_IVAMONTO, FACT_EXTRA, FACT_TOTAL, FACT_RTFTEMONTO, FACT_RTIVAMONTO, FACT_RTICAMONTO,
            T.TERC_NIT, TERC_NOM, ZONA_COD, TERC_TEL, TERC_CIU, TERC_DV, TERC_APELLIDO1, TERC_APELLIDO2, TERC_NOMBRE1, TERC_NOMBRE2, T.CIUD_COD
            FROM FACTURAS F, PREFIJOS P, terceros T, CLIENTES C
            where C.TERC_NIT = T.TERC_NIT AND T.TERC_CLIE = 'S' AND T.TERC_NIT >= :NITINI AND T.TERC_NIT <= :NITFIN AND TERC_NOM >= :NOMINI AND TERC_NOM <= :NOMFIN
             AND F.TERC_NIT = T.terc_nit AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND FACT_ANULADO = 'N'
             AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            ORDER BY FACT_FECHA, FACT_ID
            INTO :ID, :PREFIJO, :NUMERO, :FECDOC, :DTO, :ADICIONAL, :IVA, :EXTRA, :TOTAL, :RTFTE, :RTIVA, :RTICA, :nit, :nombre, :codzona, :telefono, :ciudad, :dv, :APELLIDO1, :APELLIDO2, :NOMBRE1, :NOMBRE2, :CODCIU
            DO
            BEGIN
            SELECT ZONA_NOM FROM ZONAS WHERE ZONA_COD = :codzona INTO :NOMZONA;
            SUBTOTAL = TOTAL - EXTRA - IVA - ADICIONAL + DTO;
            NETO = TOTAL - RTFTE - RTIVA - RTICA;
            SUSPEND;
            END
        END
    if (BIN_AND(TIPO, 2) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 32 INTO :NOMTIPO;
        FOR SELECT REVT_ID, R.PREF_PRE, REVT_NUMERO, REVT_FECHA, 0, 0, REVT_IVAMONTO, 0, REVT_TOTAL, 0, 0, 0,
        T.TERC_NIT, TERC_NOM, ZONA_COD, TERC_TEL, TERC_CIU, TERC_DV, TERC_APELLIDO1, TERC_APELLIDO2, TERC_NOMBRE1, TERC_NOMBRE2, T.CIUD_COD
            FROM REMISIONES_VENTA R, PREFIJOS P, terceros T, CLIENTES C
            where C.TERC_NIT = T.TERC_NIT AND T.TERC_CLIE = 'S' AND T.TERC_NIT >= :NITINI AND T.TERC_NIT <= :NITFIN AND TERC_NOM >= :NOMINI AND TERC_NOM <= :NOMFIN
             AND R.TERC_NIT = T.terc_nit AND REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN AND REVT_ANULADO = 'N'
             AND P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = 32 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            ORDER BY REVT_FECHA, REVT_ID
            INTO :ID, :PREFIJO, :NUMERO, :FECDOC, :DTO, :ADICIONAL, :IVA, :EXTRA, :TOTAL, :RTFTE, :RTIVA, :RTICA, :nit, :nombre, :codzona, :telefono, :ciudad, :DV, :APELLIDO1, :APELLIDO2, :NOMBRE1, :NOMBRE2, :CODCIU
            DO
            BEGIN
            SELECT ZONA_NOM FROM ZONAS WHERE ZONA_COD = :codzona INTO :NOMZONA;
            SUBTOTAL = TOTAL - EXTRA - IVA - ADICIONAL + DTO;
            NETO = TOTAL - RTFTE - RTIVA - RTICA;
            SUSPEND;
            END
        END
    if (BIN_AND(TIPO, 4) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 33 INTO :NOMTIPO;
        FOR SELECT DEVT_ID, V.PREF_PRE, DEVT_NUMERO, DEVT_FECHA, DEVT_DTOMONTO, DEVT_ADICIONAL, DEVT_IVAMONTO, DEVT_EXTRA, DEVT_TOTAL, DEVT_RTFTEMONTO, DEVT_RTIVAMONTO, DEVT_RTICAMONTO,
            T.TERC_NIT, TERC_NOM, ZONA_COD, TERC_TEL, TERC_CIU, TERC_DV, TERC_APELLIDO1, TERC_APELLIDO2, TERC_NOMBRE1, TERC_NOMBRE2, T.CIUD_COD
            FROM DEVOLUCIONES_VENTAS V, PREFIJOS P, terceros T, CLIENTES C
            where C.TERC_NIT = T.TERC_NIT AND T.TERC_CLIE = 'S' AND T.TERC_NIT >= :NITINI AND T.TERC_NIT <= :NITFIN AND TERC_NOM >= :NOMINI AND TERC_NOM <= :NOMFIN
             AND V.TERC_NIT = T.terc_nit AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND DEVT_ANULADO = 'N'
             AND P.PREF_PRE = V.PREF_PRE AND P.TIDO_COD = 33 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) AND ((DEVT_REMID = 0) or (DEVT_REMID IS NULL))
            ORDER BY DEVT_FECHA, DEVT_ID
            INTO :ID, :PREFIJO, :NUMERO, :FECDOC, :DTO, :ADICIONAL, :IVA, :EXTRA, :TOTAL, :RTFTE, :RTIVA, :RTICA, :nit, :nombre, :codzona, :telefono, :ciudad, :DV, :APELLIDO1, :APELLIDO2, :NOMBRE1, :NOMBRE2, :CODCIU
            DO
            BEGIN
            SELECT ZONA_NOM FROM ZONAS WHERE ZONA_COD = :codzona INTO :NOMZONA;
            SUBTOTAL = TOTAL - EXTRA - IVA - ADICIONAL + DTO;
            NETO = TOTAL - RTFTE - RTIVA - RTICA;
            CANTIDAD = CANTIDAD * -1;
            SUBTOTAL = SUBTOTAL * -1;
            TOTAL = TOTAL * -1;
            IVA = IVA * -1;
            EXTRA = EXTRA * -1;
            DTO = DTO * -1;
            ADICIONAL = ADICIONAL * -1;
            RTFTE = RTFTE * -1;
            RTIVA = RTIVA * -1;
            RTICA = RTICA * -1;
            SUSPEND;
            END
        END
    if (BIN_AND(TIPO, 8) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 34 INTO :NOMTIPO;
        FOR SELECT PEDI_ID, P.PREF_PRE, PEDI_NUMERO, PEDI_FECHA, PEDI_DTOMONTO, PEDI_ADICIONAL, PEDI_IVAMONTO, PEDI_EXTRA, PEDI_TOTAL, 0, 0, 0,
            T.TERC_NIT, TERC_NOM, ZONA_COD, TERC_TEL, TERC_CIU, TERC_DV, TERC_APELLIDO1, TERC_APELLIDO2, TERC_NOMBRE1, TERC_NOMBRE2, T.CIUD_COD
            FROM PEDIDOS P, PREFIJOS PR, terceros T, CLIENTES C
            where C.TERC_NIT = T.TERC_NIT AND T.TERC_CLIE = 'S' AND T.TERC_NIT >= :NITINI AND T.TERC_NIT <= :NITFIN AND TERC_NOM >= :NOMINI AND TERC_NOM <= :NOMFIN
             AND P.TERC_NIT = T.terc_nit AND PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND PEDI_ANULADO = 'N'
             AND P.PREF_PRE = PR.PREF_PRE AND P.TIDO_COD = 34 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            ORDER BY PEDI_FECHA, PEDI_ID
            INTO :ID, :PREFIJO, :NUMERO, :FECDOC, :DTO, :ADICIONAL, :IVA, :EXTRA, :TOTAL, :RTFTE, :RTIVA, :RTICA, :nit, :nombre, :codzona, :telefono, :ciudad, :DV, :APELLIDO1, :APELLIDO2, :NOMBRE1, :NOMBRE2, :CODCIU
            DO
            BEGIN
            SELECT ZONA_NOM FROM ZONAS WHERE ZONA_COD = :codzona INTO :NOMZONA;
            SUBTOTAL = TOTAL - EXTRA - IVA - ADICIONAL + DTO;
            NETO = TOTAL - RTFTE - RTIVA - RTICA;
            SUSPEND;
            END
        END
    if (BIN_AND(TIPO, 16) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 35 INTO :NOMTIPO;
        FOR SELECT COTI_ID, CT.PREF_PRE, COTI_NUMERO, COTI_FECHA, COTI_DTOMONTO, COTI_ADICIONAL, COTI_IVAMONTO, COTI_EXTRA, COTI_TOTAL, 0, 0, 0,
            T.TERC_NIT, TERC_NOM, ZONA_COD, TERC_TEL, TERC_CIU, TERC_DV, TERC_APELLIDO1, TERC_APELLIDO2, TERC_NOMBRE1, TERC_NOMBRE2, T.CIUD_COD
            FROM COTIZACIONES CT, PREFIJOS P, terceros T, CLIENTES C
            where C.TERC_NIT = T.TERC_NIT AND T.TERC_CLIE = 'S' AND T.TERC_NIT >= :NITINI AND T.TERC_NIT <= :NITFIN AND TERC_NOM >= :NOMINI AND TERC_NOM <= :NOMFIN
             AND CT.TERC_NIT = T.terc_nit AND COTI_FECHA >= :FECINI AND COTI_FECHA <= :FECFIN AND COTI_ANULADO = 'N'
             AND P.PREF_PRE = CT.PREF_PRE AND P.TIDO_COD = 35 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            ORDER BY COTI_FECHA, COTI_ID
            INTO :ID, :PREFIJO, :NUMERO, :FECDOC, :DTO, :ADICIONAL, :IVA, :EXTRA, :TOTAL, :RTFTE, :RTIVA, :RTICA, :nit, :nombre, :codzona, :telefono, :ciudad, :DV, :APELLIDO1, :APELLIDO2, :NOMBRE1, :NOMBRE2, :CODCIU
            DO
            BEGIN
            SELECT ZONA_NOM FROM ZONAS WHERE ZONA_COD = :codzona INTO :NOMZONA;
            SUBTOTAL = TOTAL - EXTRA - IVA - ADICIONAL + DTO;
            NETO = TOTAL - RTFTE - RTIVA - RTICA;
            SUSPEND;
            END
        END
    END
END
^

SET TERM ; ^


SET TERM ^ ;

CREATE OR ALTER PROCEDURE REP_ARTICULOS_CLIENTE(
    TIPO INTEGER,
    DETALLE CHAR(1),
    TERINI VARCHAR(20),
    TERFIN VARCHAR(20),
    FECINI DATE,
    FECFIN DATE,
    ARTINI VARCHAR(15),
    ARTFIN VARCHAR(15),
    ORDEN CHAR(1),
    CEROS CHAR(1),
    SUBEMPRESA INTEGER)
RETURNS (
    NIT VARCHAR(20),
    NOMBRE VARCHAR(60),
    DV CHAR(1),
    TELEFONO VARCHAR(40),
    CIUDAD VARCHAR(40),
    CODZONA VARCHAR(2),
    NOMZONA VARCHAR(30),
    NOMTIPO VARCHAR(50),
    ARTICULO VARCHAR(15),
    DESCRIPCION VARCHAR(60),
    CODGRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    CODSUBG VARCHAR(3),
    NOMSUBG VARCHAR(30),
    CODMARC VARCHAR(3),
    NOMMARC VARCHAR(30),
    UNIDAD VARCHAR(8),
    CANTIDAD NUMERIC(18,4),
    BASE NUMERIC(18,2),
    IVA NUMERIC(18,2),
    CONSUMO NUMERIC(18,2),
    TOTAL NUMERIC(18,2),
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    DTO NUMERIC(9,2),
    TIPODOC INTEGER)
AS
declare variable CODINI VARCHAR(15);
declare variable CODFIN VARCHAR(15);
declare variable DESINI VARCHAR(15);
declare variable DESFIN VARCHAR(15);
BEGIN
if (ORDEN = 'C') then
    BEGIN
    CODINI = ARTINI;
    CODFIN = ARTFIN;
    DESINI = '';
    DESFIN = 'zz';
    END
ELSE
    BEGIN
    DESINI = ARTINI;
    DESFIN = ARTFIN;
    CODINI = '';
    CODFIN = 'zz';
    END

SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = :TIPO INTO :NOMTIPO;
if (DETALLE = 'N') then
    BEGIN
    if (BIN_AND(TIPO, 1) <> 0) then
        BEGIN
        TIPODOC = 31;
        FOR SELECT SUM(FADE_CANT * FADE_FACTOR), SUM((FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO)*FACT_FACTOR), SUM(FADE_IVAMONTO*FACT_FACTOR), SUM(FADE_CONSUMO), SUM(FADE_TOTAL*FACT_FACTOR),
            max(D.ARTI_COD), MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD), MAX(TERC_NIT)
            FROM FACTURAS_DETALLE D, FACTURAS F, PREFIJOS P, ARTICULO A
            WHERE F.FACT_ID = D.FACT_ID AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND D.ARTI_COD = A.ARTI_COD AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            TERC_NIT >= :TERINI AND TERC_NIT <= :TERFIN AND FACT_ANULADO = 'N' AND
            FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) and substring(a.arti_cod from 1 FOR 2) <> '.t'
            GROUP BY TERC_NIT, D.ARTI_COD
            INTO :CANTIDAD, :BASE, :IVA, :CONSUMO, :TOTAL, :ARTICULO, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :NIT
            DO
            BEGIN
            select TERC_NOM, TERC_TEL, TERC_CIU, C.ZONA_COD, TERC_DV from terceros T, CLIENTES C
                where C.TERC_NIT = T.TERC_NIT AND T.TERC_NIT = :NIT
                INTO :NOMBRE, :TELEFONO, :CIUDAD, :CODZONA, :DV;
            SELECT ZONA_NOM FROM ZONAS WHERE ZONA_COD = :CODZONA INTO :NOMZONA;
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            if (CEROS = 'S') then
                SUSPEND;
            ELSE
                if ((BASE <> 0) AND (CANTIDAD <> 0)) then
                    SUSPEND;
            END
        END
    if (BIN_AND(TIPO, 2) <> 0) then
        BEGIN
        TIPODOC = 32;
        FOR SELECT SUM(RVDE_CANT * RVDE_FACTOR), SUM(RVDE_TOTAL-RVDE_IVAMONTO-RVDE_CONSUMO), SUM(RVDE_IVAMONTO), SUM(RVDE_CONSUMO), SUM(RVDE_TOTAL),
            max(D.ARTI_COD), MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD), MAX(TERC_NIT)
            FROM REMISIONES_VENTA_DETALLE D, REMISIONES_VENTA R, PREFIJOS P, ARTICULO A
            WHERE R.REVT_ID = D.REVT_ID AND P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = 32 AND D.ARTI_COD = A.ARTI_COD AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            TERC_NIT >= :TERINI AND TERC_NIT <= :TERFIN AND REVT_FECHA >= :FECINI AND
            REVT_FECHA <= :FECFIN AND REVT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY TERC_NIT, D.ARTI_COD
            INTO :CANTIDAD, :BASE, :IVA, :CONSUMO, :TOTAL, :ARTICULO, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :NIT
            DO
            BEGIN
            select TERC_NOM, TERC_TEL, TERC_CIU, C.ZONA_COD, TERC_DV from terceros T, CLIENTES C
                where C.TERC_NIT = T.TERC_NIT AND T.TERC_NIT = :NIT
                INTO :NOMBRE, :TELEFONO, :CIUDAD, :CODZONA, :DV;
            SELECT ZONA_NOM FROM ZONAS WHERE ZONA_COD = :CODZONA INTO :NOMZONA;
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            if (CEROS = 'S') then
                SUSPEND;
            ELSE
                if ((BASE <> 0) AND (CANTIDAD <> 0)) then
                    SUSPEND;
            END
        END
    if (BIN_AND(TIPO, 4) <> 0) then
        BEGIN
        TIPODOC = 33;
        FOR SELECT SUM(DVDE_CANT * DVDE_FACTOR), SUM((DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO)*DEVT_FACTOR), SUM(DVDE_IVAMONTO*DEVT_FACTOR), SUM(DVDE_CONSUMO), SUM(DVDE_TOTAL*DEVT_FACTOR),
            max(D.ARTI_COD), MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD), MAX(TERC_NIT)
            FROM devoluciones_ventas_detalle D, DEVOLUCIONES_VENTAS V, PREFIJOS P, ARTICULO A
            WHERE V.DEVT_ID = D.DEVT_ID AND P.PREF_PRE = V.PREF_PRE AND P.TIDO_COD = 33 AND D.ARTI_COD = A.ARTI_COD AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            TERC_NIT >= :TERINI AND TERC_NIT <= :TERFIN AND DEVT_FECHA >= :FECINI AND
            DEVT_FECHA <= :FECFIN AND DEVT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY TERC_NIT, D.ARTI_COD
            INTO :CANTIDAD, :BASE, :IVA, :CONSUMO, :TOTAL, :ARTICULO, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :NIT
            DO
            BEGIN
            select TERC_NOM, TERC_TEL, TERC_CIU, C.ZONA_COD, TERC_DV from terceros T, CLIENTES C
                where C.TERC_NIT = T.TERC_NIT AND T.TERC_NIT = :NIT
                INTO :NOMBRE, :TELEFONO, :CIUDAD, :CODZONA, :DV;
            SELECT ZONA_NOM FROM ZONAS WHERE ZONA_COD = :CODZONA INTO :NOMZONA;
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            CANTIDAD = CANTIDAD * -1;
            BASE = BASE * -1;
            TOTAL = TOTAL * -1;
            IVA = IVA * -1;
            CONSUMO = CONSUMO * -1;
            if (CEROS = 'S') then
                SUSPEND;
            ELSE
                if ((BASE <> 0) AND (CANTIDAD <> 0)) then
                    SUSPEND;
            END
        END
    if (BIN_AND(TIPO, 8) <> 0) then
        BEGIN
        TIPODOC = 34;
        FOR SELECT SUM(PEDE_CANT * PEDE_FACTOR), SUM((PEDE_TOTAL-PEDE_IVAMONTO-PEDE_CONSUMO)*PEDI_FACTOR), SUM(PEDE_IVAMONTO*PEDI_FACTOR), SUM(PEDE_CONSUMO), SUM(PEDE_TOTAL*PEDI_FACTOR),
            max(D.ARTI_COD), MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD), MAX(TERC_NIT)
            FROM PEDIDOS_DETALLE D, PEDIDOS P, PREFIJOS R, ARTICULO A
            WHERE P.PEDI_ID = D.PEDI_ID AND R.PREF_PRE = P.PREF_PRE AND R.TIDO_COD = 34 AND D.ARTI_COD = A.ARTI_COD AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            TERC_NIT >= :TERINI AND TERC_NIT <= :TERFIN AND PEDI_FECHA >= :FECINI AND
            PEDI_FECHA <= :FECFIN AND PEDI_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY TERC_NIT, D.ARTI_COD
            INTO :CANTIDAD, :BASE, :IVA, :CONSUMO, :TOTAL, :ARTICULO, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :NIT
            DO
            BEGIN
            select TERC_NOM, TERC_TEL, TERC_CIU, C.ZONA_COD, TERC_DV from terceros T, CLIENTES C
                where C.TERC_NIT = T.TERC_NIT AND T.TERC_NIT = :NIT
                INTO :NOMBRE, :TELEFONO, :CIUDAD, :CODZONA, :DV;
            SELECT ZONA_NOM FROM ZONAS WHERE ZONA_COD = :CODZONA INTO :NOMZONA;
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            if (CEROS = 'S') then
                SUSPEND;
            ELSE
                if ((BASE <> 0) AND (CANTIDAD <> 0)) then
                    SUSPEND;
            END
        END
    if (BIN_AND(TIPO, 16) <> 0) then
        BEGIN
        TIPODOC = 35;
        FOR SELECT SUM(CTDE_CANT * CTDE_FACTOR), SUM((CTDE_TOTAL-CTDE_IVAMONTO-CTDE_CONSUMO)*COTI_FACTOR), SUM(CTDE_IVAMONTO*COTI_FACTOR), SUM(CTDE_CONSUMO), SUM(CTDE_TOTAL*COTI_FACTOR),
            max(D.ARTI_COD), MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD), MAX(TERC_NIT)
            FROM COTIZACIONES_DETALLE D, COTIZACIONES C, PREFIJOS P, ARTICULO A
            WHERE C.COTI_ID = D.COTI_ID AND P.PREF_PRE = C.PREF_PRE AND P.TIDO_COD = 35 AND D.ARTI_COD = A.ARTI_COD AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            TERC_NIT >= :TERINI AND TERC_NIT <= :TERFIN AND COTI_FECHA >= :FECINI AND
            COTI_FECHA <= :FECFIN AND COTI_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY TERC_NIT, D.ARTI_COD
            INTO :CANTIDAD, :BASE, :IVA, :CONSUMO, :TOTAL, :ARTICULO, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :NIT
            DO
            BEGIN
            select TERC_NOM, TERC_TEL, TERC_CIU, C.ZONA_COD, TERC_DV from terceros T, CLIENTES C
                where C.TERC_NIT = T.TERC_NIT AND T.TERC_NIT = :NIT
                INTO :NOMBRE, :TELEFONO, :CIUDAD, :CODZONA, :DV;
            SELECT ZONA_NOM FROM ZONAS WHERE ZONA_COD = :CODZONA INTO :NOMZONA;
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            if (CEROS = 'S') then
                SUSPEND;
            ELSE
                if ((BASE <> 0) AND (CANTIDAD <> 0)) then
                    SUSPEND;
            END
        END
    END
ELSE
    BEGIN
    if (BIN_AND(TIPO, 1) <> 0) then
        BEGIN
        TIPODOC = 31;
        FOR SELECT F.PREF_PRE, FACT_NUMERO, FACT_FECHA, FADE_CANT * FADE_FACTOR, FADE_PRUNIT/FADE_FACTOR*FACT_FACTOR, FADE_IVAMONTO*FACT_FACTOR, FADE_CONSUMO, FADE_DTOPORC, FADE_TOTAL*FACT_FACTOR,
            D.ARTI_COD, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD, TERC_NIT
            FROM FACTURAS F, FACTURAS_DETALLE D, PREFIJOS P, ARTICULO A
            WHERE F.FACT_ID = D.FACT_ID AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND D.ARTI_COD = A.ARTI_COD AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            TERC_NIT >= :TERINI AND TERC_NIT <= :TERFIN AND FACT_FECHA >= :FECINI AND
            FACT_FECHA <= :FECFIN AND FACT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) and substring(a.arti_cod from 1 FOR 2) <> '.t'
            ORDER BY TERC_NIT, ARTI_COD, FACT_FECHA
            INTO :PREFIJO, :NUMERO, :FECHA, CANTIDAD, :BASE, :IVA, :CONSUMO, :dto, :TOTAL, :ARTICULO, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :NIT
            DO
            BEGIN
            select TERC_NOM, TERC_TEL, TERC_CIU, C.ZONA_COD, TERC_DV from terceros T, CLIENTES C
                where C.TERC_NIT = T.TERC_NIT AND T.TERC_NIT = :NIT
                INTO :NOMBRE, :TELEFONO, :CIUDAD, :CODZONA, :DV;
            SELECT ZONA_NOM FROM ZONAS WHERE ZONA_COD = :CODZONA INTO :NOMZONA;
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            SUSPEND;
            END
        END
    if (BIN_AND(TIPO, 2) <> 0) then
        BEGIN
        TIPODOC = 32;
        FOR SELECT R.PREF_PRE, REVT_NUMERO, REVT_FECHA, RVDE_CANT * RVDE_FACTOR, RVDE_PRUNIT / RVDE_FACTOR, RVDE_IVAMONTO, RVDE_CONSUMO, RVDE_DTOPORC, RVDE_TOTAL,
            D.ARTI_COD, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD, TERC_NIT
            FROM REMISIONES_VENTA R, REMISIONES_VENTA_DETALLE D, PREFIJOS P, ARTICULO A
            WHERE R.REVT_ID = D.REVT_ID AND P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = 32 AND D.ARTI_COD = A.ARTI_COD AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            TERC_NIT >= :TERINI AND TERC_NIT <= :TERFIN AND REVT_FECHA >= :FECINI AND
            REVT_FECHA <= :FECFIN AND REVT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            ORDER BY TERC_NIT, ARTI_COD, REVT_FECHA
            INTO :PREFIJO, :NUMERO, :FECHA, CANTIDAD, :BASE, :IVA, :CONSUMO, :dto, :TOTAL, :ARTICULO, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :NIT
            DO
            BEGIN
            select TERC_NOM, TERC_TEL, TERC_CIU, C.ZONA_COD, TERC_DV from terceros T, CLIENTES C
                where C.TERC_NIT = T.TERC_NIT AND T.TERC_NIT = :NIT
                INTO :NOMBRE, :TELEFONO, :CIUDAD, :CODZONA, :DV;
            SELECT ZONA_NOM FROM ZONAS WHERE ZONA_COD = :CODZONA INTO :NOMZONA;
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            SUSPEND;
            END
        END
    if (BIN_AND(TIPO, 4) <> 0) then
        BEGIN
        TIPODOC = 33;
        FOR SELECT V.PREF_PRE, DEVT_NUMERO, DEVT_FECHA, DVDE_CANT * DVDE_FACTOR, DVDE_PRUNIT/DVDE_FACTOR*DEVT_FACTOR, DVDE_IVAMONTO*DEVT_FACTOR, DVDE_CONSUMO, DVDE_DTOPORC, DVDE_TOTAL*DEVT_FACTOR,
            D.ARTI_COD, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD, TERC_NIT
            FROM DEVOLUCIONES_VENTAS V, DEVOLUCIONES_VENTAS_DETALLE D, PREFIJOS P, ARTICULO A
            WHERE V.DEVT_ID = D.DEVT_ID AND P.PREF_PRE = V.PREF_PRE AND P.TIDO_COD = 33 AND D.ARTI_COD = A.ARTI_COD AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            TERC_NIT >= :TERINI AND TERC_NIT <= :TERFIN AND DEVT_FECHA >= :FECINI AND
            DEVT_FECHA <= :FECFIN AND DEVT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            ORDER BY TERC_NIT, ARTI_COD, DEVT_FECHA
            INTO :PREFIJO, :NUMERO, :FECHA, CANTIDAD, :BASE, :IVA, :CONSUMO, :dto, :TOTAL, :ARTICULO, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :NIT
            DO
            BEGIN
            select TERC_NOM, TERC_TEL, TERC_CIU, C.ZONA_COD, TERC_DV from terceros T, CLIENTES C
                where C.TERC_NIT = T.TERC_NIT AND T.TERC_NIT = :NIT
                INTO :NOMBRE, :TELEFONO, :CIUDAD, :CODZONA, :DV;
            SELECT ZONA_NOM FROM ZONAS WHERE ZONA_COD = :CODZONA INTO :NOMZONA;
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            CANTIDAD = CANTIDAD * -1;
            BASE = BASE * -1;
            TOTAL = TOTAL * -1;
            IVA = IVA * -1;
            CONSUMO = CONSUMO * -1;
            SUSPEND;
            END
        END
    if (BIN_AND(TIPO, 8) <> 0) then
        BEGIN
        TIPODOC = 34;
        FOR SELECT P.PREF_PRE, PEDI_NUMERO, PEDI_FECHA, PEDE_CANT * PEDE_FACTOR, PEDE_PRUNIT/PEDE_FACTOR*PEDI_FACTOR, PEDE_IVAMONTO*PEDI_FACTOR, PEDE_CONSUMO, PEDE_DTOPORC, PEDE_TOTAL*PEDI_FACTOR,
            D.ARTI_COD, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD, TERC_NIT
            FROM PEDIDOS P, PEDIDOS_DETALLE D, PREFIJOS R, ARTICULO A
            WHERE P.PEDI_ID = D.PEDI_ID AND R.PREF_PRE = P.PREF_PRE AND R.TIDO_COD = 34 AND D.ARTI_COD = A.ARTI_COD AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            TERC_NIT >= :TERINI AND TERC_NIT <= :TERFIN AND PEDI_FECHA >= :FECINI AND
            PEDI_FECHA <= :FECFIN AND PEDI_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            ORDER BY TERC_NIT, ARTI_COD, PEDI_FECHA
            INTO :PREFIJO, :NUMERO, :FECHA, CANTIDAD, :BASE, :IVA, :CONSUMO, :dto, :TOTAL, :ARTICULO, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :NIT
            DO
            BEGIN
            select TERC_NOM, TERC_TEL, TERC_CIU, C.ZONA_COD, TERC_DV from terceros T, CLIENTES C
                where C.TERC_NIT = T.TERC_NIT AND T.TERC_NIT = :NIT
                INTO :NOMBRE, :TELEFONO, :CIUDAD, :CODZONA, :DV;
            SELECT ZONA_NOM FROM ZONAS WHERE ZONA_COD = :CODZONA INTO :NOMZONA;
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            SUSPEND;
            END
        END
    if (BIN_AND(TIPO, 16) <> 0) then
        BEGIN
        TIPODOC = 35;
        FOR SELECT C.PREF_PRE, COTI_NUMERO, COTI_FECHA, CTDE_CANT * CTDE_FACTOR, CTDE_PRUNIT/CTDE_FACTOR*COTI_FACTOR, CTDE_IVAMONTO*COTI_FACTOR, CTDE_CONSUMO, CTDE_DTOPORC, CTDE_TOTAL*COTI_FACTOR,
            D.ARTI_COD, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD, TERC_NIT
            FROM COTIZACIONES C, COTIZACIONES_DETALLE D, PREFIJOS P, ARTICULO A
            WHERE C.COTI_ID = D.COTI_ID AND P.PREF_PRE = C.PREF_PRE AND P.TIDO_COD = 34 AND D.ARTI_COD = A.ARTI_COD AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            TERC_NIT >= :TERINI AND TERC_NIT <= :TERFIN AND COTI_FECHA >= :FECINI AND
            COTI_FECHA <= :FECFIN AND COTI_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            ORDER BY TERC_NIT, ARTI_COD, COTI_FECHA
            INTO :PREFIJO, :NUMERO, :FECHA, CANTIDAD, :BASE, :IVA, :CONSUMO, :dto, :TOTAL, :ARTICULO, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :NIT
            DO
            BEGIN
            select TERC_NOM, TERC_TEL, TERC_CIU, C.ZONA_COD, TERC_DV from terceros T, CLIENTES C
                where C.TERC_NIT = T.TERC_NIT AND T.TERC_NIT = :NIT
                INTO :NOMBRE, :TELEFONO, :CIUDAD, :CODZONA, :DV;
            SELECT ZONA_NOM FROM ZONAS WHERE ZONA_COD = :CODZONA INTO :NOMZONA;
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            SUSPEND;
            END
        END
    END
END
^

SET TERM ; ^

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

/* 2009/01/29 : NO IMPRIMIA SUBTOTALIT SI NO SE ORDENABA POR CODIGO */
SET TERM ^ ;

CREATE OR ALTER PROCEDURE IMPR_COTIZACION(
    ID INTEGER)
RETURNS (
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    VALIDEZ INTEGER,
    NIT VARCHAR(20),
    NOMTERCERO VARCHAR(60),
    VENDEDOR INTEGER,
    NOMVENDEDOR VARCHAR(60),
    PUNTOVTA INTEGER,
    NOMPUNTOVTA VARCHAR(30),
    SUBTOTAL NUMERIC(18,2),
    DTOPORC NUMERIC(9,2),
    DTOMONTO NUMERIC(18,2),
    ADICIONAL NUMERIC(18,2),
    IVAMONTO NUMERIC(18,2),
    EXTRA NUMERIC(18,2),
    TOTALFAC NUMERIC(18,2),
    OBS BLOB SUB_TYPE 1 SEGMENT SIZE 80,
    ITEM INTEGER,
    ARTICULO VARCHAR(15),
    CODBAR VARCHAR(15),
    ARTIDES VARCHAR(60),
    CANT NUMERIC(18,4),
    UNIDAD VARCHAR(8),
    FACTOR NUMERIC(18,4),
    LISTAPR INTEGER,
    REFITEM VARCHAR(60),
    PRUNIT NUMERIC(18,2),
    DTOITPORC NUMERIC(9,2),
    DTOITMONTO NUMERIC(18,2),
    PRNETO NUMERIC(18,2),
    PRNETOSINIVA NUMERIC(18,2),
    IVAPORC NUMERIC(9,2),
    IVAITMONTO NUMERIC(18,2),
    CONSUMO NUMERIC(18,2),
    SUBTOTIT NUMERIC(18,2),
    TOTAL NUMERIC(18,2),
    CODIGOCL VARCHAR(20),
    ZONACOD VARCHAR(2),
    ZONANOM VARCHAR(60),
    DV CHAR(1),
    DIRECCION VARCHAR(60),
    CIUDAD VARCHAR(40),
    TELEFONO VARCHAR(40),
    CONTACTO VARCHAR(60),
    FAX VARCHAR(25),
    GRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    SUBGRUPO VARCHAR(3),
    NOMSUBG VARCHAR(30),
    MARCA VARCHAR(3),
    NOMMARCA VARCHAR(30),
    PESO NUMERIC(9,4),
    ANCHO NUMERIC(18,4),
    ALTO NUMERIC(18,4),
    LARGO NUMERIC(18,4),
    SUMA1 NUMERIC(18,2),
    SUMA2 NUMERIC(18,2),
    SUMA3 NUMERIC(18,2),
    IVA1 NUMERIC(18,2),
    IVA2 NUMERIC(18,2),
    IVA3 NUMERIC(18,2),
    SUMAEX NUMERIC(18,2),
    SUMAGR NUMERIC(18,2),
    OBSITEM BLOB SUB_TYPE 1 SEGMENT SIZE 80)
AS
DECLARE VARIABLE IMPTOS CHAR(1);
DECLARE VARIABLE TARIFA INTEGER;
declare variable ORDENCOD CHAR(2);
declare variable SUCUR VARCHAR(10);
declare variable ICOINC CHAR(2);
BEGIN
execute procedure lee_configuracion('FACTURACION', 'ARTICULOS', 'IMPOCONSUMO INCLUIDO EN EL PRECIO BASE DE VENTA ANTES DE IVA') returning_values (icoinc);
SELECT F.PREF_PRE, COTI_NUMERO, COTI_FECHA, COTI_VALIDEZ, F.TERC_NIT, COTI_NOMTERC, F.VEND_COD, VEND_NOMBRE, F.PTVT_ID, PTVT_NOM,
    COTI_IMPTOS, COTI_DTOPORC, COTI_DTOMONTO, COTI_ADICIONAL, COTI_IVAMONTO, COTI_EXTRA, COTI_TOTAL,
    TERC_CONTACTO, TERC_FAX, TERC_DV, COTI_OBS, COTI_SUCURSAL
    FROM COTIZACIONES F, VENDEDORES V, PUNTO_VENTA P, TERCEROS T
    WHERE F.VEND_COD = V.VEND_COD AND F.PTVT_ID = P.PTVT_ID AND F.TERC_NIT = T.TERC_NIT AND F.COTI_ID = :ID
    into :PREF, :NUMERO, :FECHA, :VALIDEZ, :NIT, :NOMTERCERO, :VENDEDOR, :NOMVENDEDOR, :PUNTOVTA, :NOMPUNTOVTA,
    :IMPTOS, :DTOPORC, :DTOMONTO, :ADICIONAL, :IVAMONTO, :EXTRA, :TOTALFAC,
    :CONTACTO, :FAX, :DV, :OBS, :SUCUR;
SUBTOTAL = TOTALFAC - EXTRA - IVAMONTO - ADICIONAL + DTOMONTO;

SELECT CLIE_COD, C.ZONA_COD, ZONA_NOM
    FROM CLIENTES C, ZONAS Z
    WHERE TERC_NIT = :NIT AND C.ZONA_COD = Z.ZONA_COD
    INTO :CODIGOCL, :ZONACOD, :ZONANOM;
SELECT CLSU_DIR, CLSU_CIUDAD, CLSU_TEL FROM CLIENTE_SUCURSALES WHERE TERC_NIT = :NIT AND CLCU_COD = :SUCUR
    INTO :DIRECCION, :CIUDAD, :TELEFONO;
    
SUMAEX = 0;
SUMA1 = 0;
SUMA2 = 0;
SUMA3 = 0;
IVA1 = 0;
IVA2 = 0;
IVA3 = 0;
ITEM = 0;
EXECUTE PROCEDURE lee_configuracion ('FACTURACION','DOCUMENTOS','ORDENAR ITEMS POR CODIGO DE ARTICULO') returning_values (:ORDENCOD);
if (ORDENCOD = 'SI') then
    BEGIN
    FOR SELECT D.ARTI_COD, CTDE_CODBAR, SUBSTR(CTDE_DESC,1,60), CTDE_CANT, CTDE_UNIDAD, LIPR_COD, CTDE_PRUNIT, CTDE_DTOPORC, CTDE_DTOMONTO, CTDE_IVAPORC, CTDE_IVAMONTO, CTDE_CONSUMO, CTDE_TOTAL, CTDE_REFERENCIA,
        GRUP_COD, SUBG_COD, MARC_COD, ARTI_PESO, ARTI_ANCHO, ARTI_ALTO, ARTI_LARGO, TAIV_COD, CTDE_OBS, CTDE_FACTOR
        FROM COTIZACIONES_DETALLE D, ARTICULO A
        WHERE D.ARTI_COD = A.ARTI_COD AND D.COTI_ID = :ID
        ORDER BY CTDE_CODBAR
        INTO :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :LISTAPR, :PRUNIT, :DTOITPORC, :DTOITMONTO, :IVAPORC, :IVAITMONTO, :CONSUMO, :TOTAL, :refitem,
        :GRUPO, :SUBGRUPO, :MARCA, :PESO, :ANCHO, :ALTO, :LARGO, :TARIFA, :obsitem, :FACTOR
        DO
        BEGIN
        if (ICOINC = 'SI') then
            SUBTOTIT = TOTAL - IVAITMONTO;
        else
            SUBTOTIT = TOTAL - IVAITMONTO - CONSUMO;
        if (ARTICULO = CODBAR) then
            SELECT FIRST 1 COBA_COD FROM barras_articulo WHERE ARTI_COD = :articulo INTO :CODBAR;
        SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :GRUPO INTO NOMGRUPO;
        SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :MARCA INTO NOMMARCA;
        SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :SUBGRUPO AND GRUP_COD = :GRUPO INTO :NOMSUBG;
        ITEM = ITEM + 1;
        PRNETO = PRUNIT - DTOITMONTO;
        if (IMPTOS = 'S') then
            if (cant <> 0) then
                prnetosiniva = PRUNIT - DTOITMONTO - ((IVAITMONTO+CONSUMO) / CANT);
            else
                prnetosiniva = PRUNIT - DTOITMONTO;
        ELSE
            prnetosiniva = PRUNIT - DTOITMONTO;
        if (ivaporc = 0) then
            SUMAEX = SUMAEX + TOTAL;
        if (TARIFA = 1) then
            BEGIN
            SUMA1 = SUMA1 + TOTAL - IVAITMONTO;
            IVA1 = IVA1 + IVAITMONTO;
            END
        if (TARIFA = 2) then
            BEGIN
            SUMA2 = SUMA2 + TOTAL - IVAITMONTO;
            IVA2 = IVA2 + IVAITMONTO;
            END
        if (TARIFA = 3) then
            BEGIN
            SUMA3 = SUMA3 + TOTAL - IVAITMONTO;
            IVA3 = IVA3 + IVAITMONTO;
            END
        SUMAGR = SUMA1 + SUMA2 + SUMA3;
        if (IMPTOS = 'N') then
            TOTAL = TOTAL - IVAITMONTO;
        SUSPEND;
        END
    END
ELSE
    BEGIN
    FOR SELECT D.ARTI_COD, CTDE_CODBAR, SUBSTR(CTDE_DESC,1,60), CTDE_CANT, CTDE_UNIDAD, LIPR_COD, CTDE_PRUNIT, CTDE_DTOPORC, CTDE_DTOMONTO, CTDE_IVAPORC, CTDE_IVAMONTO, CTDE_CONSUMO, CTDE_TOTAL, CTDE_REFERENCIA,
        GRUP_COD, SUBG_COD, MARC_COD, ARTI_PESO, ARTI_ANCHO, ARTI_ALTO, ARTI_LARGO, TAIV_COD, CTDE_OBS, CTDE_FACTOR
        FROM COTIZACIONES_DETALLE D, ARTICULO A
        WHERE D.ARTI_COD = A.ARTI_COD AND D.COTI_ID = :ID
        ORDER BY CTDE_ITEM
        INTO :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :LISTAPR, :PRUNIT, :DTOITPORC, :DTOITMONTO, :IVAPORC, :IVAITMONTO, :CONSUMO, :TOTAL, :refitem,
        :GRUPO, :SUBGRUPO, :MARCA, :PESO, :ANCHO, :ALTO, :LARGO, :TARIFA, :obsitem, :FACTOR
        DO
        BEGIN
        SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :GRUPO INTO NOMGRUPO;
        SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :MARCA INTO NOMMARCA;
        SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :SUBGRUPO AND GRUP_COD = :GRUPO INTO :NOMSUBG;
        ITEM = ITEM + 1;
        if (ICOINC = 'SI') then
            SUBTOTIT = TOTAL - IVAITMONTO;
        else
            SUBTOTIT = TOTAL - IVAITMONTO - CONSUMO;
        PRNETO = PRUNIT - DTOITMONTO;
        if (IMPTOS = 'S') then
            if (cant <> 0) then
                prnetosiniva = PRUNIT - DTOITMONTO - ((IVAITMONTO+CONSUMO) / CANT);
            else
                prnetosiniva = PRUNIT - DTOITMONTO;
        ELSE
            prnetosiniva = PRUNIT - DTOITMONTO;
        if (ivaporc = 0) then
            SUMAEX = SUMAEX + TOTAL;
        if (TARIFA = 1) then
            BEGIN
            SUMA1 = SUMA1 + TOTAL - IVAITMONTO;
            IVA1 = IVA1 + IVAITMONTO;
            END
        if (TARIFA = 2) then
            BEGIN
            SUMA2 = SUMA2 + TOTAL - IVAITMONTO;
            IVA2 = IVA2 + IVAITMONTO;
            END
        if (TARIFA = 3) then
            BEGIN
            SUMA3 = SUMA3 + TOTAL - IVAITMONTO;
            IVA3 = IVA3 + IVAITMONTO;
            END
        SUMAGR = SUMA1 + SUMA2 + SUMA3;
        if (IMPTOS = 'N') then
            TOTAL = TOTAL - IVAITMONTO;
        SUSPEND;
        END
    END
END
^

SET TERM ; ^


/* 2009/01/30 : SI DESCUENTOS POR ITEM ADICIONALES EL SUBTOTAL QUEDA ANTES DE ESOS DESCUENTOS */
SET TERM ^ ;

CREATE OR ALTER PROCEDURE IMPR_FACTURA(
    ID INTEGER)
RETURNS (
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    VENCE DATE,
    DIASVENCE INTEGER,
    CONTCRED CHAR(17),
    NIT VARCHAR(20),
    NOMTERCERO VARCHAR(60),
    NOMCLIENTE VARCHAR(60),
    VENDEDOR INTEGER,
    NOMVENDEDOR VARCHAR(60),
    PUNTOVTA INTEGER,
    NOMPUNTOVTA VARCHAR(30),
    CODBODEGA VARCHAR(2),
    NOMBODEGA VARCHAR(30),
    AUTORIZACION VARCHAR(20),
    DESPACHO VARCHAR(255),
    TRANSPORTADOR VARCHAR(60),
    COTIZACION VARCHAR(30),
    PEDIDO VARCHAR(30),
    REMISION VARCHAR(30),
    PACIENTE VARCHAR(20),
    NOMPACIENTE VARCHAR(60),
    COMIPORC NUMERIC(9,2),
    COMIMONTO NUMERIC(18,2),
    SUBTOTAL NUMERIC(18,2),
    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),
    EXTRA NUMERIC(18,2),
    DTOFPORC NUMERIC(9,2),
    DTOFMONTO NUMERIC(18,2),
    FECHADTO DATE,
    TOTALFAC NUMERIC(18,2),
    TOTALPAGAR NUMERIC(18,2),
    OBS BLOB SUB_TYPE 1 SEGMENT SIZE 80,
    ITEM INTEGER,
    ARTICULO VARCHAR(15),
    CODBAR VARCHAR(15),
    ARTIDES VARCHAR(60),
    DESCORTA VARCHAR(30),
    CANT NUMERIC(18,4),
    LOTE VARCHAR(15),
    VLOTE DATE,
    UNIDAD VARCHAR(8),
    CAJAS NUMERIC(18,4),
    FACTOR INTEGER,
    LISTAPR INTEGER,
    REFITEM VARCHAR(60),
    BODITEM VARCHAR(2),
    STAND VARCHAR(15),
    PRUNIT NUMERIC(18,2),
    DTOITPORC NUMERIC(9,2),
    DTOITMONTO NUMERIC(18,2),
    PRNETO NUMERIC(18,2),
    PRNETOSINIVA NUMERIC(18,2),
    DTOIT1 NUMERIC(9,2),
    DTOIT2 NUMERIC(9,2),
    DTOIT3 NUMERIC(9,2),
    IVAPORC NUMERIC(9,2),
    IVAITMONTO NUMERIC(18,2),
    CONSUMO NUMERIC(18,2),
    SUBTOTIT NUMERIC(18,2),
    TOTAL NUMERIC(18,2),
    CODIGOCL VARCHAR(20),
    ZONACOD VARCHAR(2),
    ZONANOM VARCHAR(60),
    DV CHAR(1),
    DIRECCION VARCHAR(60),
    CIUDAD VARCHAR(40),
    TELEFONO VARCHAR(40),
    CONTACTO VARCHAR(60),
    FAX VARCHAR(25),
    GRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    SUBGRUPO VARCHAR(3),
    NOMSUBG VARCHAR(30),
    MARCA VARCHAR(3),
    NOMMARCA VARCHAR(30),
    PESO NUMERIC(18,4),
    ANCHO NUMERIC(18,4),
    ALTO NUMERIC(18,4),
    LARGO NUMERIC(18,4),
    SUMA1 NUMERIC(18,2),
    SUMA2 NUMERIC(18,2),
    SUMA3 NUMERIC(18,2),
    IVA1 NUMERIC(18,2),
    IVA2 NUMERIC(18,2),
    IVA3 NUMERIC(18,2),
    SUMAEX NUMERIC(18,2),
    SUMAGR NUMERIC(18,2),
    TOTCONSUMO NUMERIC(18,2),
    DTOIT1M NUMERIC(18,2),
    DTOIT2M NUMERIC(18,2),
    DTOIT3M NUMERIC(18,2),
    TOTCAJAS NUMERIC(18,2),
    VEHICULO VARCHAR(8),
    RECIBIDO NUMERIC(18,2),
    CAMBIO NUMERIC(18,2),
    HORA TIME,
    FORMAPAGO1 VARCHAR(30),
    MONTOPAGO1 NUMERIC(18,2),
    FORMAPAGO2 VARCHAR(30),
    MONTOPAGO2 NUMERIC(18,2),
    FORMAPAGO3 VARCHAR(30),
    MONTOPAGO3 NUMERIC(18,2),
    PUNTOS INTEGER,
    PUNTOSACUM INTEGER,
    PUNTOSVENC INTEGER,
    FECPTOS DATE,
    OBSITEM BLOB SUB_TYPE 1 SEGMENT SIZE 80,
    SUCUR VARCHAR(10))
AS
DECLARE VARIABLE IMPTOS CHAR(1);
DECLARE VARIABLE TARIFA INTEGER;
declare variable DEVUELTO NUMERIC(18,2);
declare variable ORDENCOD CHAR(2);
declare variable IMPRDEV CHAR(2);
declare variable IMPR CHAR(1);
declare variable ITEMFP INTEGER;
declare variable FORMAP VARCHAR(30);
declare variable MONTOP NUMERIC(18,2);
declare variable ICOINC CHAR(2);
declare variable DTOITM1 NUMERIC(18,2);
declare variable DTOITM2 NUMERIC(18,2);
declare variable DTOITM3 NUMERIC(18,2);
declare variable DTOITE3 CHAR(2);
declare variable SUMDTOIT NUMERIC(18,2);
BEGIN
execute procedure lee_configuracion('FACTURACION', 'ARTICULOS', 'IMPOCONSUMO INCLUIDO EN EL PRECIO BASE DE VENTA ANTES DE IVA') returning_values (icoinc);
execute procedure lee_configuracion('FACTURACION', 'FACTURAS', 'COLUMNAS DE DESCUENTO POR ITEM ADICIONALES') returning_values (DTOITE3);
SELECT F.PREF_PRE, FACT_NUMERO, FACT_FECHA, FACT_VENCE, F.BODE_COD, BODE_NOM, F.TERC_NIT, FACT_NOMCLIENTE, F.VEND_COD, VEND_NOMBRE, F.PTVT_ID, PTVT_NOM,
    AUTO_NUMERO, FACT_DESPACHO, FACT_TRANSP, FACT_COTIZACI, FACT_PEDIDO, FACT_REMISION, FACT_COMIPORC, FACT_COMIMONTO, FACT_IVAINC, 
    FACT_DTOPOR, FACT_DTOMONTO, FACT_ADICIONAL, FACT_IVAMONTO, FACT_RTFTEPOR, FACT_RTFTEMONTO, FACT_RTIVAPOR, FACT_RTIVAMONTO, FACT_RTICAPOR, FACT_RTICAMONTO, FACT_EXTRA, FACT_DTOFPOR, FACT_DTOFMONTO, FACT_DTOFFECHA, FACT_TOTAL,
    TERC_DIR, TERC_CIU, TERC_TEL, TERC_CONTACTO, TERC_FAX, TERC_DV, FACT_DTOIT1, FACT_DTOIT2, FACT_DTOIT3,
    FACT_OBS, VEHI_COD, /*FACT_NROCOPIA,*/ FACT_RECIBIDO, FACT_SUCURSAL, FACT_DETCLI, FACT_DETCLINOM, TERC_NOM
    FROM FACTURAS F, BODEGA B, VENDEDORES V, PUNTO_VENTA P, TERCEROS T
    WHERE F.BODE_COD = B.BODE_COD AND F.VEND_COD = V.VEND_COD AND F.PTVT_ID = P.PTVT_ID AND F.TERC_NIT = T.TERC_NIT AND F.FACT_ID = :ID
    into :PREF, :NUMERO, :FECHA, :VENCE, :CODBODEGA, :NOMBODEGA, :NIT, :NOMTERCERO, :VENDEDOR, :NOMVENDEDOR, :PUNTOVTA, :NOMPUNTOVTA,
    :AUTORIZACION, :DESPACHO, :TRANSPORTADOR, :COTIZACION, :PEDIDO, :REMISION, :COMIPORC, :COMIMONTO, :IMPTOS,
    :DTOPORC, :DTOMONTO, :ADICIONAL, :IVAMONTO, :RTEFTEPORC, :RTEFTEMONTO, :RTEIVAPORC, :RTEIVAMONTO, :RTEICAPORC, :RTEICAMONTO, :EXTRA, :DTOFPORC, :DTOFMONTO, :FECHADTO, :TOTALFAC,
    :DIRECCION, :CIUDAD, :TELEFONO, :CONTACTO, :FAX, :DV, :dtoit1m, :dtoit2m, :dtoit3m,
    :OBS, :VEHICULO,/* :NROCOPIA,*/ :RECIBIDO, :SUCUR, :paciente, :nompaciente, :nomcliente;

/* ACUMULE LOS PUNTOS, SE HACE ACA POR SER POSTERIOR AL DETALLE */
EXECUTE PROCEDURE acumula_puntos_cliente (31, :id, :nit, :fecha) returning_values (:PUNTOS);
EXECUTE PROCEDURE consulta_puntos_cliente (:id, :nit, :fecha) returning_values (:puntos, :puntosacum, :puntosvenc, :fecptos);
if (DTOIT1M IS NULL) then
    DTOIT1M = 0;
if (DTOIT2M IS NULL) then
    DTOIT2M = 0;
if (DTOIT3M IS NULL) then
    DTOIT3M = 0;
SELECT CLIE_COD, C.ZONA_COD, ZONA_NOM
    FROM CLIENTES C, ZONAS Z
    WHERE TERC_NIT = :NIT AND C.ZONA_COD = Z.ZONA_COD
    INTO :CODIGOCL, :ZONACOD, :ZONANOM;
SELECT CLSU_DIR, CLSU_CIUDAD, CLSU_TEL FROM CLIENTE_SUCURSALES WHERE TERC_NIT = :NIT AND CLCU_COD = :SUCUR
    INTO :DIRECCION, :CIUDAD, :TELEFONO;
DIASVENCE = VENCE - FECHA;
if (DIASVENCE > 0) then
    CONTCRED = 'CREDITO ' || CAST(DIASVENCE AS VARCHAR(3)) || ' DIAS';
ELSE
    CONTCRED = 'CONTADO';
SUBTOTAL = TOTALFAC - EXTRA - IVAMONTO - ADICIONAL + DTOMONTO;
if (DTOITE3 = 'SI') then
    BEGIN
    SELECT SUM(FADE_DTOMONTO) FROM FACTURAS_DETALLE WHERE FACT_ID = :id INTO :sumdtoit;
    SUBTOTAL = SUBTOTAL + sumdtoit + dtoit1m + dtoit2m + dtoit3m;
    END
TOTALPAGAR = TOTALFAC - RTEFTEMONTO - RTEIVAMONTO - RTEICAMONTO;
if (RECIBIDO <> 0) then
    CAMBIO = RECIBIDO - totalpagar;
ELSE
    CAMBIO = 0;
SUMAEX = 0;
SUMA1 = 0;
SUMA2 = 0;
SUMA3 = 0;
IVA1 = 0;
IVA2 = 0;
IVA3 = 0;
TOTCONSUMO = 0;
MONTOPAGO1 = 0;
SELECT MAX(AUDI_HORA) FROM AUDITORIA WHERE TIDO_COD = 31 AND AUDI_IDDOC = :ID AND AUDI_OPER = 'I' INTO :HORA;
/* AHORA LAS FORMAS DE PAGO, BUSQUE EL ABONO DE HOY A LA FACTURA */
ITEMFP = 1;
MONTOPAGO1 = 0;
MONTOPAGO2 = 0;
MONTOPAGO3 = 0;
FOR SELECT FOPA_NOM, RCPA_MONTO FROM RECIBOS_CAJA_PAGO P, FORMAS_PAGO F, RECIBOS_CAJA R, RECIBOS_CAJA_DETALLE D
    WHERE R.RECA_ID = P.RECA_ID AND R.RECA_ID = D.RECA_ID AND P.FOPA_ID = F.FOPA_ID AND RECA_FECHA = :FECHA AND RCDE_TIPODOC = 31 AND RCDE_IDDOC = :ID
    INTO :formap, :MONTOP
    DO
    BEGIN
    if (ITEMFP = 1) then
        BEGIN
        FORMAPAGO1 = FORMAP;
        MONTOPAGO1 = MONTOP;
        END
    if (ITEMFP = 2) then
        BEGIN
        FORMAPAGO2 = FORMAP;
        MONTOPAGO2 = MONTOP;
        END
    if (ITEMFP = 3) then
        BEGIN
        FORMAPAGO3 = FORMAP;
        MONTOPAGO3 = MONTOP;
        END
    ITEMFP = ITEMFP + 1;
    END
EXECUTE PROCEDURE lee_configuracion ('FACTURACION','DOCUMENTOS','ORDENAR ITEMS POR CODIGO DE ARTICULO') returning_values (:ORDENCOD);
EXECUTE PROCEDURE lee_configuracion ('FACTURACION','POS', 'IMPRIMIR DEVOLUCIONES DE ARTICULOS NEGATIVOS') returning_values (:imprdev);
totcajas = 0;
if (ORDENCOD = 'SI') then
    BEGIN
    FOR SELECT FADE_ITEM, D.ARTI_COD, FADE_CODBAR, SUBSTR(FADE_DESC,1,60), ARTI_DESCORTA, FADE_CANT, FADE_UNIDAD, FADE_FACTOR, BODE_COD, FADE_LOTE, LIPR_COD, FADE_PRUNIT, FADE_DTOPORC, FADE_DTOMONTO, FADE_IVAPORC, FADE_IVAMONTO, FADE_CONSUMO, FADE_TOTAL, FADE_REFERENCIA,
        GRUP_COD, SUBG_COD, MARC_COD, ARTI_PESO, ARTI_ANCHO, ARTI_ALTO, ARTI_LARGO, TAIV_COD, FADE_DEVUELTO, FADE_OBS, FADE_DTO1, FADE_DTO2, FADE_DTO3, FADE_DTOM1, FADE_DTOM2, FADE_DTOM3, FADE_CAJAS
        FROM FACTURAS_DETALLE D, ARTICULO A
        WHERE D.ARTI_COD = A.ARTI_COD AND D.FACT_ID = :ID
        ORDER BY D.ARTI_COD
        INTO :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :DESCORTA, :CANT, :UNIDAD, :FACTOR, :BODITEM, :LOTE, :LISTAPR, :PRUNIT, :DTOITPORC, :DTOITMONTO, :IVAPORC, :IVAITMONTO, :CONSUMO, :TOTAL, :refitem,
        :GRUPO, :SUBGRUPO, :MARCA, :PESO, :ANCHO, :ALTO, :LARGO, :TARIFA, :devuelto, :obsitem, :dtoit1, :dtoit2, :dtoit3, :dtoitm1, :dtoitm2, :dtoitm3, :cajas
        DO
          BEGIN
          if (ARTICULO = CODBAR) then
            SELECT FIRST 1 COBA_COD FROM barras_articulo WHERE ARTI_COD = :articulo INTO :CODBAR;
          if (IMPRDEV <> 'SI') then
            BEGIN
            if ((CANT >= 0) AND (DEVUELTO = 0)) then
                IMPR = 'S';
            ELSE
                IMPR = 'N'; /* ES DEVOLUCION */
            END
          ELSE
            IMPR = 'S';
          if (IMPR = 'S') then
            BEGIN
            prneto = PRUNIT - DTOITMONTO - dtoitm1 - dtoitm2 - dtoitm3;
            if (IMPTOS = 'S') then
                if (cant <> 0) then
                    prnetosiniva = PRUNIT - DTOITMONTO - ((IVAITMONTO+CONSUMO) / CANT) - dtoitm1 - dtoitm2 - dtoitm3;
                else
                    prnetosiniva = PRUNIT - DTOITMONTO - dtoitm1 - dtoitm2 - dtoitm3;
            ELSE
                prnetosiniva = PRUNIT - DTOITMONTO - dtoit1m - dtoit2m - dtoit3m;
            if (ICOINC = 'SI') then
                SUBTOTIT = TOTAL - IVAITMONTO;
            else
                SUBTOTIT = TOTAL - IVAITMONTO - CONSUMO;
            TOTCONSUMO = TOTCONSUMO + CONSUMO;
            SELECT LOTE_VENCE FROM LOTES WHERE LOTE_NRO = :lote AND ARTI_COD = :ARTICULO AND BODE_COD = :boditem INTO :vlote;
            if ((REFITEM <> '.t') or (REFITEM IS NULL)) then
                BEGIN
                /* NO SUME LOS ENSAMBLES */
                if (IVAPORC = 0) then
                    SUMAEX = SUMAEX + TOTAL;
                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;
                END
            if (ANCHO IS NULL) then
                ANCHO = 0;
            if (ALTO IS NULL) then
                ALTO = 0;
            if (LARGO IS NULL) then
                LARGO = 0;
            if (PESO IS NULL) then
                PESO = 0;
            PESO = PESO * CANT;
            totcajas = totcajas + cajas;
            if (substr(ARTICULO,1,2) = '.t') then
                BEGIN
                REFITEM = '';
                TOTAL = 0;
                SUBTOTIT = 0;
                END
            SELECT STAND_COD FROM STANDS WHERE ARTI_COD = :ARTICULO AND STAND_BODEGA = :boditem INTO :stand;
            SUSPEND;
            END
          END
    END
ELSE
    BEGIN
    FOR SELECT FADE_ITEM, D.ARTI_COD, FADE_CODBAR, SUBSTR(FADE_DESC,1,60), ARTI_DESCORTA, FADE_CANT, FADE_UNIDAD, FADE_FACTOR, BODE_COD, FADE_LOTE, LIPR_COD, FADE_PRUNIT, FADE_DTOPORC, FADE_DTOMONTO, FADE_IVAPORC, FADE_IVAMONTO, FADE_CONSUMO, FADE_TOTAL, FADE_REFERENCIA,
        GRUP_COD, SUBG_COD, MARC_COD, ARTI_PESO, ARTI_ANCHO, ARTI_ALTO, ARTI_LARGO, TAIV_COD, FADE_DEVUELTO, FADE_OBS, FADE_DTO1, FADE_DTO2, FADE_DTO3, FADE_DTOM1, FADE_DTOM2, FADE_DTOM3, FADE_CAJAS
        FROM FACTURAS_DETALLE D, ARTICULO A
        WHERE D.ARTI_COD = A.ARTI_COD AND D.FACT_ID = :ID
        ORDER BY FADE_ITEM
        INTO :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :DESCORTA, :CANT, :UNIDAD, :FACTOR, :BODITEM, :LOTE, :LISTAPR, :PRUNIT, :DTOITPORC, :DTOITMONTO, :IVAPORC, :IVAITMONTO, :CONSUMO, :TOTAL, :refitem,
        :GRUPO, :SUBGRUPO, :MARCA, :PESO, :ANCHO, :ALTO, :LARGO, :TARIFA, :devuelto, :obsitem, :dtoit1, :dtoit2, :dtoit3, :dtoitm1, :dtoitm2, :dtoitm3, :cajas
        DO
          BEGIN
          if (IMPRDEV <> 'SI') then
            BEGIN
            if ((CANT >= 0) AND (DEVUELTO = 0)) then
                IMPR = 'S';
            ELSE
                IMPR = 'N'; /* ES DEVOLUCION */
            END
          ELSE
            IMPR = 'S';
          if (IMPR = 'S') then
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :GRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :MARCA INTO NOMMARCA;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :SUBGRUPO AND GRUP_COD = :GRUPO INTO :NOMSUBG;
            prneto = PRUNIT - DTOITMONTO - dtoitm1 - dtoitm2 - dtoitm3;
            if (IMPTOS = 'S') then
                if (cant <> 0) then
                    prnetosiniva = PRUNIT - DTOITMONTO - ((IVAITMONTO+CONSUMO) / CANT) - dtoit1m - dtoit2m - dtoit3m;
                else
                    prnetosiniva = PRUNIT - DTOITMONTO - dtoitm1 - dtoitm2 - dtoitm3;
            ELSE
                prnetosiniva = PRUNIT - DTOITMONTO - dtoitm1 - dtoitm2 - dtoitm3;
            if (ICOINC = 'SI') then
                SUBTOTIT = TOTAL - IVAITMONTO;
            else
                SUBTOTIT = TOTAL - IVAITMONTO - CONSUMO;
            TOTCONSUMO = TOTCONSUMO + CONSUMO;
            SELECT LOTE_VENCE FROM LOTES WHERE LOTE_NRO = :lote AND ARTI_COD = :ARTICULO AND BODE_COD = :boditem INTO :vlote;
            if ((REFITEM <> '.t') or (REFITEM IS NULL)) then
                BEGIN
                /* NO SUME LOS ENSAMBLES */
                if (IVAPORC = 0) then
                    SUMAEX = SUMAEX + TOTAL;
                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;
                END
            if (ANCHO IS NULL) then
                ANCHO = 0;
            if (ALTO IS NULL) then
                ALTO = 0;
            if (LARGO IS NULL) then
                LARGO = 0;
            if (PESO IS NULL) then
                PESO = 0;
            PESO = PESO * CANT;
            totcajas = totcajas + cajas;
            if (substr(ARTICULO,1,2) = '.t') then
                BEGIN
                REFITEM = '';
                TOTAL = 0;
                SUBTOTIT = 0;
                END
            SELECT STAND_COD FROM STANDS WHERE ARTI_COD = :ARTICULO AND STAND_BODEGA = :boditem INTO :stand;
            SUSPEND;
            END
          END
    END
END
^

SET TERM ; ^


/* 20090131 : SALDO TOTAL INVENTARIO RETORNABA NULO SI NO HAY REGISTROS */
SET TERM ^ ;

CREATE OR ALTER PROCEDURE SALDO_TOTAL_INVENTARIO(
    ARTICULO VARCHAR(15),
    FECHA DATE)
RETURNS (
    SALDO NUMERIC(18,4))
AS
DECLARE VARIABLE SALDO_BOD NUMERIC(15,4);
DECLARE VARIABLE BOD VARCHAR(2);
BEGIN
/*
  SALDO = 0;
  FOR
    SELECT BODE_COD FROM BODEGA WHERE BODE_ACTIVA = 'S' INTO :BOD
  DO
    BEGIN
    EXECUTE PROCEDURE SALDO_INVENTARIO(:ARTICULO, :BOD, :FECHA) RETURNING_VALUES :SALDO_BOD;
    SALDO = SALDO + SALDO_BOD;
    END*/
SELECT FIRST 1 COST_SALDOC+COST_ENTC-COST_SALC
    FROM COSTOS WHERE ARTI_COD = :ARTICULO AND COST_FECHA <= :FECHA
    ORDER BY COST_FECHA DESC,COST_ITEM DESC
    INTO :SALDO;
if (saldo is null) then
    SALDO = 0;
SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE CONSULTA_ARTICULOS_VTAS(
    FECHA DATE,
    INACTIVOS CHAR(1),
    MODULO VARCHAR(20),
    BUSCAR VARCHAR(100),
    CUALQUIERA CHAR(1),
    COLUMNA INTEGER,
    BUSCAR2 VARCHAR(30),
    BUSCAR3 VARCHAR(30),
    BUSCAR4 VARCHAR(30),
    BUSCAR5 VARCHAR(30))
RETURNS (
    CODIGO VARCHAR(20),
    DES VARCHAR(60),
    REF VARCHAR(20),
    GRUPO VARCHAR(30),
    MARCA VARCHAR(30),
    UNIDAD VARCHAR(8),
    ESTADO VARCHAR(30),
    IVA NUMERIC(9,2),
    EXISTEN NUMERIC(18,4),
    PRECIO NUMERIC(18,2),
    CLASE CHAR(1))
AS
DECLARE VARIABLE LISTA INTEGER;
DECLARE VARIABLE EXIST CHAR(2);
DECLARE VARIABLE SINEXIST CHAR(2);
declare variable DIG INTEGER;
declare variable OK CHAR(1);
BEGIN /*$$IBE$$ 
EXISTEN = 0;
EXECUTE PROCEDURE lee_configuracion ('FACTURACION','ARTICULOS', 'VER EXISTENCIA EN CONSULTA ARTICULOS') returning_values (:EXIST);
EXECUTE PROCEDURE lee_configuracion ('FACTURACION','FACTURAS', 'CODIGO DE LA LISTA DE PRECIOS A MOSTRAR EN ARTICULOS') returning_values (:LISTA);
if (modulo = 'FACTURACION') then
  EXECUTE PROCEDURE lee_configuracion ('FACTURACION','ARTICULOS','VER ARTICULOS SIN EXISTENCIA EN CONSULTA DE ARTICULOS') returning_values (:sinexist);
else
  sinexist = 'SI';
EXECUTE PROCEDURE LEE_CONFIGURACION ('FACTURACION', 'ARTICULOS', 'REDONDEO AL MULTIPLO DE DIEZ EN PRECIOS') returning_values (DIG);
if (LISTA > 0) then
    BEGIN
    if ((BUSCAR IS NOT NULL) AND (BUSCAR <> '')) then
        FOR select a.arti_cod, arti_des, grup_cod, arti_unidad, esar_cod, taiv_porc, marc_cod,arti_clase
            from articulo a, tarifa_iva t
            where a.taiv_cod = t.taiv_cod and substring(a.arti_cod from 1 FOR 2) <> '.t' and
            ((:INACTIVOS = 'S') or (esar_cod = 'A') or ((:INACTIVOS = 'C') AND (esar_cod = 'N'))) AND
            ((:COLUMNA <> 0) or (upper(A.ARTI_COD) like upper(:buscar))) AND
            ((:columna <> 1) or (upper(A.ARTI_DES) like upper(:buscar))) AND
            ((:columna <> 2) or (upper(A.ARTI_OBS) like upper(:buscar)) or (upper(A.ARTI_DES) like upper(:buscar)))
            INTO :CODIGO, :DES, :GRUPO, :UNIDAD, :ESTADO, :IVA, :MARCA, :CLASE
            do
            begin
            select first 1 coba_cod from barras_articulo where arti_cod = :codigo into :ref;
            if ((COLUMNA <> 3) or (upper(REF) like upper(:buscar))) then
                BEGIN
                OK = 'N';
                PRECIO = 0;
                SELECT prar_fijo PRECIO FROM precios_articulo WHERE arti_cod = :CODIGO and lipr_cod = :LISTA INTO :PRECIO;
                EXECUTE PROCEDURE redondee(PRECIO, DIG) returning_values (PRECIO);
                if (EXIST = 'SI') then
                    BEGIN
                    EXECUTE PROCEDURE saldo_total_inventario (:CODIGO, :FECHA) returning_values (:EXISTEN);
                    if ((SINEXIST = 'SI')  or (existen <> 0)) then
                        OK = 'S';
                    END
                ELSE
                    OK = 'S';
                if (ok = 'S') then
                    if (CUALQUIERA = 'S') then
                        SUSPEND;
                    ELSE
                        if (BUSCAR2 <> '') then
                            BEGIN
                            IF (NOT EXISTS (SELECT ARTI_COD FROM ARTICULO WHERE ARTI_COD = :CODIGO AND ((upper(ARTI_DES) like upper(:BUSCAR2)) or (UPPER(ARTI_OBS) LIKE UPPER(:BUSCAR2))))) THEN
                                OK = 'N';
                            if ((OK = 'S') AND (BUSCAR3 <> '')) then
                                IF (NOT EXISTS (SELECT ARTI_COD FROM ARTICULO WHERE ARTI_COD = :CODIGO AND ((upper(ARTI_DES) like upper(:BUSCAR3)) or (UPPER(ARTI_OBS) LIKE UPPER(:BUSCAR3))))) THEN
                                    OK = 'N';
                            if ((OK = 'S') AND (BUSCAR4 <> '')) then
                                IF (NOT EXISTS (SELECT ARTI_COD FROM ARTICULO WHERE ARTI_COD = :CODIGO AND ((upper(ARTI_DES) like upper(:BUSCAR4)) or (UPPER(ARTI_OBS) LIKE UPPER(:BUSCAR4))))) THEN
                                    OK = 'N';
                            if ((OK = 'S') AND (BUSCAR4 <> '')) then
                                IF (NOT EXISTS (SELECT ARTI_COD FROM ARTICULO WHERE ARTI_COD = :CODIGO AND ((upper(ARTI_DES) like upper(:BUSCAR4)) or (UPPER(ARTI_OBS) LIKE UPPER(:BUSCAR4))))) THEN
                                    OK = 'N';
                            if ((OK = 'S') AND (BUSCAR5 <> '')) then
                                IF (NOT EXISTS (SELECT ARTI_COD FROM ARTICULO WHERE ARTI_COD = :CODIGO AND ((upper(ARTI_DES) like upper(:BUSCAR5)) or (UPPER(ARTI_OBS) LIKE UPPER(:BUSCAR5))))) THEN
                                    OK = 'N';
                            if (OK = 'S') then
                                SUSPEND;
                            END
                        ELSE
                            SUSPEND;
                END
            end
    ELSE
        FOR select a.arti_cod, arti_des, grup_cod, arti_unidad, esar_cod, taiv_porc, marc_cod,arti_clase
            from articulo a, tarifa_iva t
            where a.taiv_cod = t.taiv_cod and substring(a.arti_cod from 1 FOR 2) <> '.t' and
            ((:INACTIVOS = 'S') or (esar_cod = 'A') or ((:INACTIVOS = 'C') AND (esar_cod = 'N')))
            INTO :CODIGO, :DES, :GRUPO, :UNIDAD, :ESTADO, :IVA, :MARCA, :CLASE
            do
            begin
            select first 1 coba_cod from barras_articulo where arti_cod = :codigo into :ref;
            PRECIO = 0;
            SELECT prar_fijo PRECIO FROM precios_articulo WHERE arti_cod = :CODIGO and lipr_cod = :LISTA INTO :PRECIO;
            EXECUTE PROCEDURE redondee(PRECIO, DIG) returning_values (PRECIO);
            if (EXIST = 'SI') then
                BEGIN
                EXECUTE PROCEDURE saldo_total_inventario (:CODIGO, :FECHA) returning_values (:EXISTEN);
                if ((SINEXIST = 'SI')  or (existen <> 0)) then
                    SUSPEND;
                END
            ELSE
                SUSPEND;
            END
    END
ELSE
    if ((BUSCAR IS NOT NULL) AND (BUSCAR <> '')) then
        FOR select arti_cod, arti_des, grup_cod, arti_unidad, esar_cod, taiv_porc, arti_precio, marc_cod, arti_clase
            from articulo a, tarifa_iva t
            where a.taiv_cod = t.taiv_cod and substring(a.arti_cod from 1 FOR 2) <> '.t' and
            ((:INACTIVOS = 'S') or (esar_cod = 'A') or ((:INACTIVOS = 'C') AND (esar_cod = 'N'))) AND
            ((:COLUMNA <> 0) or (upper(A.ARTI_COD) like upper(:buscar))) AND
            ((:columna <> 1) or (upper(A.ARTI_DES) like upper(:buscar))) AND
            ((:columna <> 2) or (upper(A.ARTI_OBS) like upper(:buscar)) or (upper(A.ARTI_DES) like upper(:buscar)))
            INTO :CODIGO, :DES, :GRUPO, :UNIDAD, :ESTADO, :IVA, :PRECIO, :MARCA, :CLASE
            do
            begin
            select first 1 coba_cod from barras_articulo where arti_cod = :codigo into :ref;
            if ((COLUMNA <> 3) or (upper(REF) like upper(:buscar))) then
                BEGIN
                if (EXIST = 'SI') then
                    BEGIN
                    EXECUTE PROCEDURE saldo_total_inventario (:CODIGO, :FECHA) returning_values (:EXISTEN);
                    if ((SINEXIST = 'SI') or (existen <> 0)) then
                        OK = 'S';
                    END
                ELSE
                    OK = 'S';
                if (ok = 'S') then
                    if (CUALQUIERA = 'S') then
                        SUSPEND;
                    ELSE
                        if (BUSCAR2 <> '') then
                            BEGIN
                            IF (NOT EXISTS (SELECT ARTI_COD FROM ARTICULO WHERE ARTI_COD = :CODIGO AND ((upper(ARTI_DES) like upper(:BUSCAR2)) or (UPPER(ARTI_OBS) LIKE UPPER(:BUSCAR2))))) THEN
                                OK = 'N';
                            if ((OK = 'S') AND (BUSCAR3 <> '')) then
                                IF (NOT EXISTS (SELECT ARTI_COD FROM ARTICULO WHERE ARTI_COD = :CODIGO AND ((upper(ARTI_DES) like upper(:BUSCAR3)) or (UPPER(ARTI_OBS) LIKE UPPER(:BUSCAR3))))) THEN
                                    OK = 'N';
                            if ((OK = 'S') AND (BUSCAR4 <> '')) then
                                IF (NOT EXISTS (SELECT ARTI_COD FROM ARTICULO WHERE ARTI_COD = :CODIGO AND ((upper(ARTI_DES) like upper(:BUSCAR4)) or (UPPER(ARTI_OBS) LIKE UPPER(:BUSCAR4))))) THEN
                                    OK = 'N';
                            if ((OK = 'S') AND (BUSCAR4 <> '')) then
                                IF (NOT EXISTS (SELECT ARTI_COD FROM ARTICULO WHERE ARTI_COD = :CODIGO AND ((upper(ARTI_DES) like upper(:BUSCAR4)) or (UPPER(ARTI_OBS) LIKE UPPER(:BUSCAR4))))) THEN
                                    OK = 'N';
                            if ((OK = 'S') AND (BUSCAR5 <> '')) then
                                IF (NOT EXISTS (SELECT ARTI_COD FROM ARTICULO WHERE ARTI_COD = :CODIGO AND ((upper(ARTI_DES) like upper(:BUSCAR5)) or (UPPER(ARTI_OBS) LIKE UPPER(:BUSCAR5))))) THEN
                                    OK = 'N';
                            if (OK = 'S') then
                                SUSPEND;
                            END
                        ELSE
                            SUSPEND;
                END
            end
    ELSE
        FOR select arti_cod, arti_des, grup_cod, arti_unidad, esar_cod, taiv_porc, arti_precio, marc_cod, arti_clase
            from articulo a, tarifa_iva t
            where a.taiv_cod = t.taiv_cod and substring(a.arti_cod from 1 FOR 2) <> '.t' and
            ((:INACTIVOS = 'S') or (esar_cod = 'A') or ((:INACTIVOS = 'C') AND (esar_cod = 'N')))
            INTO :CODIGO, :DES, :GRUPO, :UNIDAD, :ESTADO, :IVA, :PRECIO, :MARCA, :CLASE
            do
            begin
            select first 1 coba_cod from barras_articulo where arti_cod = :codigo into :ref;
            if (EXIST = 'SI') then
                BEGIN
                EXECUTE PROCEDURE saldo_total_inventario (:CODIGO, :FECHA) returning_values (:EXISTEN);
                if ((SINEXIST = 'SI') or (existen <> 0)) then
                    SUSPEND;
                END
            ELSE
                SUSPEND;
            end
 $$IBE$$*/ SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE DISPONIBILIDAD_TOTAL_ARTICULO(
    ARTICULO VARCHAR(15),
    FECHA DATE)
RETURNS (
    DISPONIBILIDAD INTEGER,
    EXIST NUMERIC(18,4),
    PROMEDIO NUMERIC(18,4),
    SALIDAS NUMERIC(18,4))
AS
BEGIN /*$$IBE$$ 
  EXECUTE PROCEDURE saldo_total_inventario (ARTICULO, FECHA) returning_values (:EXIST);
  EXECUTE PROCEDURE PROMEDIO_TOTAL_ARTICULO(:ARTICULO, :FECHA) returning_values (:PROMEDIO, :SALIDAS);
  if (PROMEDIO > 0) then
    DISPONIBILIDAD = EXIST / PROMEDIO;
  ELSE
    DISPONIBILIDAD = 0;
  SUSPEND;
 $$IBE$$*/ SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE IMPR_ARTICULO(
    CODINI VARCHAR(20),
    CODFIN VARCHAR(20),
    CANT INTEGER)
RETURNS (
    ARTICULO VARCHAR(15),
    DESCRIPCION VARCHAR(60),
    PRECIO NUMERIC(18,2),
    CODGRP VARCHAR(2),
    NOMGRP VARCHAR(30),
    COSUBG VARCHAR(3),
    NOMSUBG VARCHAR(30),
    CODMARC VARCHAR(3),
    NOMMARC VARCHAR(30),
    PESO NUMERIC(18,4),
    PUM NUMERIC(18,2),
    LISTA INTEGER,
    NOMLISTA VARCHAR(30),
    FECHA DATE)
AS
declare variable I INTEGER;
begin /*$$IBE$$ 
EXECUTE PROCEDURE lee_configuracion('FACTURACION', 'FACTURAS', 'CODIGO DE LA LISTA DE PRECIOS A MOSTRAR EN ARTICULOS') returning_values (LISTA);
for select a.arti_cod, arti_des, a.grup_cod, a.subg_cod, a.marc_cod, arti_peso, p.lipr_cod, p.prar_fijo, grup_nom, lipr_nom
    from articulo a, precios_articulo p, grupo g, lista_precios l
    where a.arti_cod = p.arti_cod and a.grup_cod = g.grup_cod and l.lipr_cod = p.lipr_cod AND a.arti_cod >= :codini AND a.arti_cod <= :codfin AND P.lipr_cod = :LISTA
    into :articulo, :descripcion, :codgrp, :cosubg, :codmarc, :peso, :lista, :precio, :nomgrp, :nomlista
    do
    begin
    if (cosubg <> '') then
        select subg_nom from subgrupo where grup_cod = :codgrp and subg_cod = :cosubg into :nomsubg;
    if (codmarc <> '') then
        select marc_nom from marcas where marc_cod = :codmarc into :nommarc;
    if ((PESO <> 0) AND (PESO IS NOT NULL)) then
        PUM = PRECIO / PESO;
    ELSE
        PUM = 0;
    SELECT MAX(AUDI_FECHA) FROM AUDITORIA WHERE TIDO_COD = 126 AND AUDI_COD = :articulo AND AUDI_OPER <> 'D' INTO :fecha;
    if (cant = 0) then
        execute procedure saldo_total_inventario(:articulo, cast('now' as DATE)) returning_values (CANT);
    I = 1;
    WHILE (I < CANT) DO
        BEGIN
        SUSPEND;
        I = I + 1;
        END
    end
 $$IBE$$*/ SUSPEND;
end
^

SET TERM ; ^

SET TERM ^ ;

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

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE REP_ABC_INVENTARIO(
    FECHA DATE,
    ARTINI VARCHAR(20),
    ARTFIN VARCHAR(20),
    GRPINI VARCHAR(2),
    GRPFIN VARCHAR(2),
    ORDEN CHAR(1),
    DIAS INTEGER)
RETURNS (
    CODIGO VARCHAR(15),
    NOMBRE VARCHAR(60),
    UNIDAD VARCHAR(8),
    CODGRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    CODSUBG VARCHAR(3),
    NOMSUBG VARCHAR(30),
    CODMARC VARCHAR(3),
    NOMMARC VARCHAR(30),
    COSTO NUMERIC(18,2),
    SALIDAT NUMERIC(18,4),
    VPROMEDIO NUMERIC(18,4),
    PORC NUMERIC(9,2),
    CLASE CHAR(1))
AS
DECLARE VARIABLE CODINI VARCHAR(20);
DECLARE VARIABLE CODFIN VARCHAR(20);
DECLARE VARIABLE DESINI VARCHAR(20);
DECLARE VARIABLE DESFIN VARCHAR(20);
declare variable ACUMULADO NUMERIC(18,2);
declare variable EXIST NUMERIC(18,2);
declare variable ACUMPORC NUMERIC(9,2);
declare variable FECINI DATE;
declare variable A NUMERIC(9,2);
declare variable B NUMERIC(9,2);
declare variable C NUMERIC(9,2);
BEGIN /*$$IBE$$ 
if (ORDEN = 'C') then
    BEGIN
    CODINI = ARTINI;
    CODFIN = ARTFIN;
    DESINI = '';
    DESFIN = 'zz';
    END
ELSE
    BEGIN
    DESINI = ARTINI;
    DESFIN = ARTFIN;
    CODINI = '';
    CODFIN = 'zz';
    END
DELETE FROM analisis_abcinven;
acumporc = 0;
FECINI = FECHA - DIAS;
 $$IBE$$*/ /* CALCULE LA VENTA PROMEDIO DE CADA ARTICULO */ /*$$IBE$$ 
EXECUTE PROCEDURE LEE_CONFIGURACION ('INVENTARIO', 'EXISTENCIAS', 'PORCENTAJE MINIMO PARA ARTICULO CLASE "A"') returning_values (A);
EXECUTE PROCEDURE LEE_CONFIGURACION ('INVENTARIO', 'EXISTENCIAS', 'PORCENTAJE MINIMO PARA ARTICULO CLASE "B"') returning_values (B);
EXECUTE PROCEDURE LEE_CONFIGURACION ('INVENTARIO', 'EXISTENCIAS', 'PORCENTAJE MINIMO PARA ARTICULO CLASE "C"') returning_values (C);
FOR SELECT ARTI_COD, ARTI_UNIDAD FROM ARTICULO A
      WHERE ARTI_COD >= :CODINI AND ARTI_COD <= :CODFIN AND A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :GRPFIN AND ARTI_DES >= :DESINI AND ARTI_DES <= :DESFIN AND A.ESAR_COD <> 'I'
      INTO :CODIGO, :UNIDAD
      DO
      BEGIN
      EXECUTE PROCEDURE ultimo_costo(:CODIGO, :FECHA, :UNIDAD) returning_values (:COSTO);
      SELECT SUM(MVAR_CANT) FROM MOVIMIENTO_ARTICULO
        WHERE ARTI_COD = :codigo AND MVAR_FECHA >= :FECINI AND MVAR_FECHA <= :FECHA AND MVAR_ENTRADA = 'N' AND MVAR_TIPODOC <> 13 INTO :SALIDAT;
      if (SALIDAT IS NULL) then
        SALIDAT = 0;
      VPROMEDIO = SALIDAT * COSTO;
      insert into analisis_abcinven (ABCI_COD, ABCI_VENTA) VALUES (:codigo, :vpromedio);
      END
SELECT SUM(ABCI_VENTA) FROM analisis_abcinven INTO :acumulado;
FOR SELECT ARTI_COD, ARTI_DES, ARTI_UNIDAD, ARTI_DIAS, A.GRUP_COD, GRUP_NOM, A.SUBG_COD, A.MARC_COD, ABCI_VENTA
      FROM ARTICULO A, GRUPO G, analisis_abcinven N
      WHERE A.ARTI_COD = N.abci_cod AND G.GRUP_COD = A.GRUP_COD
      ORDER BY ABCI_VENTA DESC
      INTO :CODIGO, :NOMBRE, :UNIDAD, :DIAS, :CODGRUPO, :NOMGRUPO, :CODSUBG, :CODMARC, :vpromedio
      DO
        BEGIN
        NOMMARC = '';
        NOMSUBG = '';
        SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO :NOMMARC;
        SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
        EXECUTE PROCEDURE ultimo_costo(:CODIGO, :FECHA, :UNIDAD) returning_values (:COSTO);
        EXECUTE PROCEDURE saldo_total_inventario (:codigo, FECHA) returning_values (:EXIST);
        costo = costo * exist;
        SELECT SUM(MVAR_CANT) FROM MOVIMIENTO_ARTICULO
          WHERE ARTI_COD = :codigo AND MVAR_FECHA >= :FECINI AND MVAR_FECHA <= :FECHA AND MVAR_ENTRADA = 'N' AND MVAR_TIPODOC <> 13 INTO :SALIDAT;
        if (SALIDAT IS NULL) then
          SALIDAT = 0;
        if (acumulado <> 0) then
            PORC = vpromedio / acumulado * 100;
        ELSE
            PORC = 0;
        acumporc = acumporc + porc;
        if (acumporc < A) then
            CLASE = 'A';
        else
            if (acumporc < B) then
                CLASE = 'B';
            else
                if (acumporc < c) then
                    CLASE = 'C';
                else
                    CLASE = 'D';
        SUSPEND;
        END
 $$IBE$$*/ SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

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

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE REP_DISPONIBILIDAD(
    FECHA DATE,
    ARTINI VARCHAR(20),
    ARTFIN VARCHAR(20),
    GRPINI VARCHAR(3),
    GRPFIN VARCHAR(3),
    ORDEN CHAR(1),
    CEROS CHAR(1),
    DETALLE CHAR(1),
    AGRUPA CHAR(1),
    SUCURSAL INTEGER)
RETURNS (
    CODIGO VARCHAR(15),
    NOMBRE VARCHAR(60),
    UNIDAD VARCHAR(8),
    CODGRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    CODSUBG VARCHAR(3),
    NOMSUBG VARCHAR(30),
    CODMARC VARCHAR(3),
    NOMMARC VARCHAR(30),
    CODBOD VARCHAR(2),
    NOMBOD VARCHAR(30),
    EXIST NUMERIC(18,4),
    PROMEDIO NUMERIC(18,4),
    SALIDAS NUMERIC(18,4),
    DISPONIBILIDAD INTEGER,
    DIAS INTEGER,
    PROMEDIADO INTEGER,
    COSTO NUMERIC(18,2),
    COSTOPRO NUMERIC(18,2),
    SUGERIDO NUMERIC(18,4),
    FECCOMPRA DATE)
AS
DECLARE VARIABLE CODINI VARCHAR(20);
DECLARE VARIABLE CODFIN VARCHAR(20);
DECLARE VARIABLE DESINI VARCHAR(20);
DECLARE VARIABLE DESFIN VARCHAR(20);
DECLARE VARIABLE MARINI VARCHAR(20);
DECLARE VARIABLE MARFIN VARCHAR(20);
declare variable DIASC VARCHAR(255);
declare variable DIA_ART VARCHAR(2) CHARACTER SET NONE;
BEGIN /*$$IBE$$ 
if (ORDEN = 'C') then
    BEGIN
    CODINI = ARTINI;
    CODFIN = ARTFIN;
    DESINI = '';
    DESFIN = 'zz';
    END
ELSE
    BEGIN
    DESINI = ARTINI;
    DESFIN = ARTFIN;
    CODINI = '';
    CODFIN = 'zz';
    END
if (AGRUPA = 'G') then
    BEGIN
    MARINI = '';
    MARFIN = 'zz';
    END
ELSE
    if (AGRUPA = 'M') then
        BEGIN
        MARINI = GRPINI;
        MARFIN = GRPFIN;
        GRPINI = '';
        GRPFIN = 'zz';
        END
if (DETALLE = 'S') then
  BEGIN
  FOR SELECT ARTI_COD, ARTI_DES, ARTI_UNIDAD, ARTI_DIAS, A.GRUP_COD, GRUP_NOM, A.SUBG_COD, A.MARC_COD, BODE_COD, BODE_NOM, ARTI_DIANALIS
      FROM ARTICULO A, GRUPO G, BODEGA B
      WHERE ARTI_COD >= :CODINI AND ARTI_COD <= :CODFIN AND A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :GRPFIN AND ARTI_DES >= :DESINI AND ARTI_DES <= :DESFIN AND
      G.GRUP_COD = A.GRUP_COD AND A.ESAR_COD <> 'I' AND ((SUCU_ID = :SUCURSAL) or (:SUCURSAL = 0)) AND
      (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN)))
      INTO :CODIGO, :NOMBRE, :UNIDAD, :DIAS, :CODGRUPO, :NOMGRUPO, :CODSUBG, :CODMARC, :CODBOD, :NOMBOD, :PROMEDIADO
      DO
        BEGIN
        NOMMARC = '';
        NOMSUBG = '';
        SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO :NOMMARC;
        SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
        EXECUTE PROCEDURE ultimo_costo(:CODIGO, :FECHA, :UNIDAD) returning_values (:COSTO);
        EXECUTE PROCEDURE costo_promedio(:CODIGO, :FECHA) RETURNING_VALUES :costopro;
        EXECUTE PROCEDURE DISPONIBILIDAD_ARTICULO(CODIGO, FECHA, :CODBOD) returning_values (:DISPONIBILIDAD, :EXIST, :PROMEDIO, :SALIDAS);
         $$IBE$$*/ /*ESTABLECER CUAL ES EL VALOR DE DIAS PARA PROMEDIO*/ /*$$IBE$$ 
        EXECUTE PROCEDURE lee_configuracion ('INVENTARIO', 'EXISTENCIAS', 'PROMEDIAR LAS SALIDAS DEL INVENTARIO CON EL NUMERO DE DIAS ASIGNADO A CADA ARTICULO') returning_values (:DIA_ART);
        if (DIA_ART = 'NO') then
          BEGIN
            EXECUTE PROCEDURE lee_configuracion ('INVENTARIO', 'EXISTENCIAS', 'NUMERO DE DIAS PARA PROMEDIO DE SALIDAS POR ARTICULO') returning_values (DIASC);
            PROMEDIADO = CAST(DIASC AS INTEGER);
          END
        if ((DISPONIBILIDAD < DIAS) and (PROMEDIO > 0))then
            SUGERIDO = (DIAS * PROMEDIO) - EXIST;
        ELSE
            SUGERIDO = 0;
        SELECT MAX(FACO_FECHA) FROM FACTURAS_COMPRA F, FACTURAS_COMPRAS_DETALLE D
            WHERE F.FACO_ID = D.faco_id AND D.ARTI_COD = :CODIGO AND FACO_FECHA <= :FECHA AND D.bode_cod = :codbod
            INTO :FECCOMPRA;
        if ((PROMEDIO > 0) or (EXIST <> 0) or (CEROS = 'S')) then
            SUSPEND;
        END
  END
ELSE
  BEGIN
  FOR SELECT ARTI_COD, ARTI_DES, ARTI_UNIDAD, ARTI_DIAS, A.GRUP_COD, GRUP_NOM, A.SUBG_COD, A.MARC_COD, ARTI_DIANALIS
      FROM ARTICULO A, GRUPO G
      WHERE ARTI_COD >= :CODINI AND ARTI_COD <= :CODFIN AND A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :GRPFIN AND ARTI_DES >= :DESINI AND ARTI_DES <= :DESFIN AND G.GRUP_COD = A.GRUP_COD AND
      A.ESAR_COD <> 'I' AND (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN)))
      INTO :CODIGO, :NOMBRE, :UNIDAD, :DIAS, :CODGRUPO, :NOMGRUPO, :CODSUBG, :CODMARC, :PROMEDIADO
      DO
        BEGIN
        NOMMARC = '';
        NOMSUBG = '';
        SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO :NOMMARC;
        SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
        EXECUTE PROCEDURE costo_promedio(:CODIGO, :FECHA) RETURNING_VALUES :costopro;
        EXECUTE PROCEDURE ultimo_costo(:CODIGO, :FECHA, :UNIDAD) returning_values (:COSTO);
        EXECUTE PROCEDURE DISPONIBILIDAD_TOTAL_ARTICULO(CODIGO, FECHA) returning_values (:DISPONIBILIDAD, :EXIST, :PROMEDIO, :SALIDAS);
         $$IBE$$*/ /*ESTABLECER CUAL ES EL VALOR DE DIAS PARA PROMEDIO*/ /*$$IBE$$ 
        EXECUTE PROCEDURE lee_configuracion ('INVENTARIO', 'EXISTENCIAS', 'PROMEDIAR LAS SALIDAS DEL INVENTARIO CON EL NUMERO DE DIAS ASIGNADO A CADA ARTICULO') returning_values (:DIA_ART);
        if (DIA_ART = 'NO') then
          BEGIN
            EXECUTE PROCEDURE lee_configuracion ('INVENTARIO', 'EXISTENCIAS', 'NUMERO DE DIAS PARA PROMEDIO DE SALIDAS POR ARTICULO') returning_values (DIASC);
            PROMEDIADO = CAST(DIASC AS INTEGER);
          END
        if ((DISPONIBILIDAD < DIAS) and (PROMEDIO > 0))then
            SUGERIDO = (DIAS * PROMEDIO) - EXIST;
        ELSE
            SUGERIDO = 0;
        SELECT MAX(FACO_FECHA) FROM FACTURAS_COMPRA F, FACTURAS_COMPRAS_DETALLE D
            WHERE F.FACO_ID = D.faco_id AND D.ARTI_COD = :CODIGO AND FACO_FECHA <= :FECHA
            INTO :FECCOMPRA;
        if ((PROMEDIO > 0) or (EXIST <> 0) or (CEROS = 'S')) then
            SUSPEND;
        END
  END
 $$IBE$$*/ SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE CONSULTA_ARTICULOS_VTAS(
    FECHA DATE,
    INACTIVOS CHAR(1),
    MODULO VARCHAR(20),
    BUSCAR VARCHAR(100),
    CUALQUIERA CHAR(1),
    COLUMNA INTEGER,
    BUSCAR2 VARCHAR(30),
    BUSCAR3 VARCHAR(30),
    BUSCAR4 VARCHAR(30),
    BUSCAR5 VARCHAR(30))
RETURNS (
    CODIGO VARCHAR(20),
    DES VARCHAR(60),
    REF VARCHAR(20),
    GRUPO VARCHAR(30),
    MARCA VARCHAR(30),
    UNIDAD VARCHAR(8),
    ESTADO VARCHAR(30),
    IVA NUMERIC(9,2),
    EXISTEN NUMERIC(18,4),
    PRECIO NUMERIC(18,2),
    CLASE CHAR(1))
AS
DECLARE VARIABLE LISTA INTEGER;
DECLARE VARIABLE EXIST CHAR(2);
DECLARE VARIABLE SINEXIST CHAR(2);
declare variable DIG INTEGER;
declare variable OK CHAR(1);
BEGIN
EXISTEN = 0;
EXECUTE PROCEDURE lee_configuracion ('FACTURACION','ARTICULOS', 'VER EXISTENCIA EN CONSULTA ARTICULOS') returning_values (:EXIST);
EXECUTE PROCEDURE lee_configuracion ('FACTURACION','FACTURAS', 'CODIGO DE LA LISTA DE PRECIOS A MOSTRAR EN ARTICULOS') returning_values (:LISTA);
if (modulo = 'FACTURACION') then
  EXECUTE PROCEDURE lee_configuracion ('FACTURACION','ARTICULOS','VER ARTICULOS SIN EXISTENCIA EN CONSULTA DE ARTICULOS') returning_values (:sinexist);
else
  sinexist = 'SI';
EXECUTE PROCEDURE LEE_CONFIGURACION ('FACTURACION', 'ARTICULOS', 'REDONDEO AL MULTIPLO DE DIEZ EN PRECIOS') returning_values (DIG);
if (LISTA > 0) then
    BEGIN
    if ((BUSCAR IS NOT NULL) AND (BUSCAR <> '')) then
        FOR select a.arti_cod, arti_des, grup_cod, arti_unidad, esar_cod, taiv_porc, marc_cod,arti_clase
            from articulo a, tarifa_iva t
            where a.taiv_cod = t.taiv_cod and substring(a.arti_cod from 1 FOR 2) <> '.t' and
            ((:INACTIVOS = 'S') or (esar_cod = 'A') or ((:INACTIVOS = 'C') AND (esar_cod = 'N'))) AND
            ((:COLUMNA <> 0) or (upper(A.ARTI_COD) like upper(:buscar))) AND
            ((:columna <> 1) or (upper(A.ARTI_DES) like upper(:buscar))) AND
            ((:columna <> 2) or (upper(A.ARTI_OBS) like upper(:buscar)) or (upper(A.ARTI_DES) like upper(:buscar)))
            INTO :CODIGO, :DES, :GRUPO, :UNIDAD, :ESTADO, :IVA, :MARCA, :CLASE
            do
            begin
            select first 1 coba_cod from barras_articulo where arti_cod = :codigo into :ref;
            if ((COLUMNA <> 3) or (upper(REF) like upper(:buscar))) then
                BEGIN
                OK = 'N';
                PRECIO = 0;
                SELECT prar_fijo PRECIO FROM precios_articulo WHERE arti_cod = :CODIGO and lipr_cod = :LISTA INTO :PRECIO;
                EXECUTE PROCEDURE redondee(PRECIO, DIG) returning_values (PRECIO);
                if (EXIST = 'SI') then
                    BEGIN
                    EXECUTE PROCEDURE saldo_total_inventario (:CODIGO, :FECHA) returning_values (:EXISTEN);
                    if ((SINEXIST = 'SI')  or (existen <> 0)) then
                        OK = 'S';
                    END
                ELSE
                    OK = 'S';
                if (ok = 'S') then
                    if (CUALQUIERA = 'S') then
                        SUSPEND;
                    ELSE
                        if (BUSCAR2 <> '') then
                            BEGIN
                            IF (NOT EXISTS (SELECT ARTI_COD FROM ARTICULO WHERE ARTI_COD = :CODIGO AND ((upper(ARTI_DES) like upper(:BUSCAR2)) or (UPPER(ARTI_OBS) LIKE UPPER(:BUSCAR2))))) THEN
                                OK = 'N';
                            if ((OK = 'S') AND (BUSCAR3 <> '')) then
                                IF (NOT EXISTS (SELECT ARTI_COD FROM ARTICULO WHERE ARTI_COD = :CODIGO AND ((upper(ARTI_DES) like upper(:BUSCAR3)) or (UPPER(ARTI_OBS) LIKE UPPER(:BUSCAR3))))) THEN
                                    OK = 'N';
                            if ((OK = 'S') AND (BUSCAR4 <> '')) then
                                IF (NOT EXISTS (SELECT ARTI_COD FROM ARTICULO WHERE ARTI_COD = :CODIGO AND ((upper(ARTI_DES) like upper(:BUSCAR4)) or (UPPER(ARTI_OBS) LIKE UPPER(:BUSCAR4))))) THEN
                                    OK = 'N';
                            if ((OK = 'S') AND (BUSCAR4 <> '')) then
                                IF (NOT EXISTS (SELECT ARTI_COD FROM ARTICULO WHERE ARTI_COD = :CODIGO AND ((upper(ARTI_DES) like upper(:BUSCAR4)) or (UPPER(ARTI_OBS) LIKE UPPER(:BUSCAR4))))) THEN
                                    OK = 'N';
                            if ((OK = 'S') AND (BUSCAR5 <> '')) then
                                IF (NOT EXISTS (SELECT ARTI_COD FROM ARTICULO WHERE ARTI_COD = :CODIGO AND ((upper(ARTI_DES) like upper(:BUSCAR5)) or (UPPER(ARTI_OBS) LIKE UPPER(:BUSCAR5))))) THEN
                                    OK = 'N';
                            if (OK = 'S') then
                                SUSPEND;
                            END
                        ELSE
                            SUSPEND;
                END
            end
    ELSE
        FOR select a.arti_cod, arti_des, grup_cod, arti_unidad, esar_cod, taiv_porc, marc_cod,arti_clase
            from articulo a, tarifa_iva t
            where a.taiv_cod = t.taiv_cod and substring(a.arti_cod from 1 FOR 2) <> '.t' and
            ((:INACTIVOS = 'S') or (esar_cod = 'A') or ((:INACTIVOS = 'C') AND (esar_cod = 'N')))
            INTO :CODIGO, :DES, :GRUPO, :UNIDAD, :ESTADO, :IVA, :MARCA, :CLASE
            do
            begin
            select first 1 coba_cod from barras_articulo where arti_cod = :codigo into :ref;
            PRECIO = 0;
            SELECT prar_fijo PRECIO FROM precios_articulo WHERE arti_cod = :CODIGO and lipr_cod = :LISTA INTO :PRECIO;
            EXECUTE PROCEDURE redondee(PRECIO, DIG) returning_values (PRECIO);
            if (EXIST = 'SI') then
                BEGIN
                EXECUTE PROCEDURE saldo_total_inventario (:CODIGO, :FECHA) returning_values (:EXISTEN);
                if ((SINEXIST = 'SI')  or (existen <> 0)) then
                    SUSPEND;
                END
            ELSE
                SUSPEND;
            END
    END
ELSE
    if ((BUSCAR IS NOT NULL) AND (BUSCAR <> '')) then
        FOR select arti_cod, arti_des, grup_cod, arti_unidad, esar_cod, taiv_porc, arti_precio, marc_cod, arti_clase
            from articulo a, tarifa_iva t
            where a.taiv_cod = t.taiv_cod and substring(a.arti_cod from 1 FOR 2) <> '.t' and
            ((:INACTIVOS = 'S') or (esar_cod = 'A') or ((:INACTIVOS = 'C') AND (esar_cod = 'N'))) AND
            ((:COLUMNA <> 0) or (upper(A.ARTI_COD) like upper(:buscar))) AND
            ((:columna <> 1) or (upper(A.ARTI_DES) like upper(:buscar))) AND
            ((:columna <> 2) or (upper(A.ARTI_OBS) like upper(:buscar)) or (upper(A.ARTI_DES) like upper(:buscar)))
            INTO :CODIGO, :DES, :GRUPO, :UNIDAD, :ESTADO, :IVA, :PRECIO, :MARCA, :CLASE
            do
            begin
            select first 1 coba_cod from barras_articulo where arti_cod = :codigo into :ref;
            if ((COLUMNA <> 3) or (upper(REF) like upper(:buscar))) then
                BEGIN
                if (EXIST = 'SI') then
                    BEGIN
                    EXECUTE PROCEDURE saldo_total_inventario (:CODIGO, :FECHA) returning_values (:EXISTEN);
                    if ((SINEXIST = 'SI') or (existen <> 0)) then
                        OK = 'S';
                    END
                ELSE
                    OK = 'S';
                if (ok = 'S') then
                    if (CUALQUIERA = 'S') then
                        SUSPEND;
                    ELSE
                        if (BUSCAR2 <> '') then
                            BEGIN
                            IF (NOT EXISTS (SELECT ARTI_COD FROM ARTICULO WHERE ARTI_COD = :CODIGO AND ((upper(ARTI_DES) like upper(:BUSCAR2)) or (UPPER(ARTI_OBS) LIKE UPPER(:BUSCAR2))))) THEN
                                OK = 'N';
                            if ((OK = 'S') AND (BUSCAR3 <> '')) then
                                IF (NOT EXISTS (SELECT ARTI_COD FROM ARTICULO WHERE ARTI_COD = :CODIGO AND ((upper(ARTI_DES) like upper(:BUSCAR3)) or (UPPER(ARTI_OBS) LIKE UPPER(:BUSCAR3))))) THEN
                                    OK = 'N';
                            if ((OK = 'S') AND (BUSCAR4 <> '')) then
                                IF (NOT EXISTS (SELECT ARTI_COD FROM ARTICULO WHERE ARTI_COD = :CODIGO AND ((upper(ARTI_DES) like upper(:BUSCAR4)) or (UPPER(ARTI_OBS) LIKE UPPER(:BUSCAR4))))) THEN
                                    OK = 'N';
                            if ((OK = 'S') AND (BUSCAR4 <> '')) then
                                IF (NOT EXISTS (SELECT ARTI_COD FROM ARTICULO WHERE ARTI_COD = :CODIGO AND ((upper(ARTI_DES) like upper(:BUSCAR4)) or (UPPER(ARTI_OBS) LIKE UPPER(:BUSCAR4))))) THEN
                                    OK = 'N';
                            if ((OK = 'S') AND (BUSCAR5 <> '')) then
                                IF (NOT EXISTS (SELECT ARTI_COD FROM ARTICULO WHERE ARTI_COD = :CODIGO AND ((upper(ARTI_DES) like upper(:BUSCAR5)) or (UPPER(ARTI_OBS) LIKE UPPER(:BUSCAR5))))) THEN
                                    OK = 'N';
                            if (OK = 'S') then
                                SUSPEND;
                            END
                        ELSE
                            SUSPEND;
                END
            end
    ELSE
        FOR select arti_cod, arti_des, grup_cod, arti_unidad, esar_cod, taiv_porc, arti_precio, marc_cod, arti_clase
            from articulo a, tarifa_iva t
            where a.taiv_cod = t.taiv_cod and substring(a.arti_cod from 1 FOR 2) <> '.t' and
            ((:INACTIVOS = 'S') or (esar_cod = 'A') or ((:INACTIVOS = 'C') AND (esar_cod = 'N')))
            INTO :CODIGO, :DES, :GRUPO, :UNIDAD, :ESTADO, :IVA, :PRECIO, :MARCA, :CLASE
            do
            begin
            select first 1 coba_cod from barras_articulo where arti_cod = :codigo into :ref;
            if (EXIST = 'SI') then
                BEGIN
                EXECUTE PROCEDURE saldo_total_inventario (:CODIGO, :FECHA) returning_values (:EXISTEN);
                if ((SINEXIST = 'SI') or (existen <> 0)) then
                    SUSPEND;
                END
            ELSE
                SUSPEND;
            end
END

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE DISPONIBILIDAD_TOTAL_ARTICULO(
    ARTICULO VARCHAR(15),
    FECHA DATE)
RETURNS (
    DISPONIBILIDAD INTEGER,
    EXIST NUMERIC(18,4),
    PROMEDIO NUMERIC(18,4),
    SALIDAS NUMERIC(18,4))
AS
BEGIN
  EXECUTE PROCEDURE saldo_total_inventario (ARTICULO, FECHA) returning_values (:EXIST);
  EXECUTE PROCEDURE PROMEDIO_TOTAL_ARTICULO(:ARTICULO, :FECHA) returning_values (:PROMEDIO, :SALIDAS);
  if (PROMEDIO > 0) then
    DISPONIBILIDAD = EXIST / PROMEDIO;
  ELSE
    DISPONIBILIDAD = 0;
  SUSPEND;
END

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE IMPR_ARTICULO(
    CODINI VARCHAR(20),
    CODFIN VARCHAR(20),
    CANT INTEGER)
RETURNS (
    ARTICULO VARCHAR(15),
    DESCRIPCION VARCHAR(60),
    PRECIO NUMERIC(18,2),
    CODGRP VARCHAR(2),
    NOMGRP VARCHAR(30),
    COSUBG VARCHAR(3),
    NOMSUBG VARCHAR(30),
    CODMARC VARCHAR(3),
    NOMMARC VARCHAR(30),
    PESO NUMERIC(18,4),
    PUM NUMERIC(18,2),
    LISTA INTEGER,
    NOMLISTA VARCHAR(30),
    FECHA DATE)
AS
declare variable I INTEGER;
begin
EXECUTE PROCEDURE lee_configuracion('FACTURACION', 'FACTURAS', 'CODIGO DE LA LISTA DE PRECIOS A MOSTRAR EN ARTICULOS') returning_values (LISTA);
for select a.arti_cod, arti_des, a.grup_cod, a.subg_cod, a.marc_cod, arti_peso, p.lipr_cod, p.prar_fijo, grup_nom, lipr_nom
    from articulo a, precios_articulo p, grupo g, lista_precios l
    where a.arti_cod = p.arti_cod and a.grup_cod = g.grup_cod and l.lipr_cod = p.lipr_cod AND a.arti_cod >= :codini AND a.arti_cod <= :codfin AND P.lipr_cod = :LISTA
    into :articulo, :descripcion, :codgrp, :cosubg, :codmarc, :peso, :lista, :precio, :nomgrp, :nomlista
    do
    begin
    if (cosubg <> '') then
        select subg_nom from subgrupo where grup_cod = :codgrp and subg_cod = :cosubg into :nomsubg;
    if (codmarc <> '') then
        select marc_nom from marcas where marc_cod = :codmarc into :nommarc;
    if ((PESO <> 0) AND (PESO IS NOT NULL)) then
        PUM = PRECIO / PESO;
    ELSE
        PUM = 0;
    SELECT MAX(AUDI_FECHA) FROM AUDITORIA WHERE TIDO_COD = 126 AND AUDI_COD = :articulo AND AUDI_OPER <> 'D' INTO :fecha;
    if (cant = 0) then
        execute procedure saldo_total_inventario(:articulo, cast('now' as DATE)) returning_values (CANT);
    I = 1;
    WHILE (I < CANT) DO
        BEGIN
        SUSPEND;
        I = I + 1;
        END
    end
end

^

SET TERM ; ^

SET TERM ^ ;

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

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE REP_ABC_INVENTARIO(
    FECHA DATE,
    ARTINI VARCHAR(20),
    ARTFIN VARCHAR(20),
    GRPINI VARCHAR(2),
    GRPFIN VARCHAR(2),
    ORDEN CHAR(1),
    DIAS INTEGER)
RETURNS (
    CODIGO VARCHAR(15),
    NOMBRE VARCHAR(60),
    UNIDAD VARCHAR(8),
    CODGRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    CODSUBG VARCHAR(3),
    NOMSUBG VARCHAR(30),
    CODMARC VARCHAR(3),
    NOMMARC VARCHAR(30),
    COSTO NUMERIC(18,2),
    SALIDAT NUMERIC(18,4),
    VPROMEDIO NUMERIC(18,4),
    PORC NUMERIC(9,2),
    CLASE CHAR(1))
AS
DECLARE VARIABLE CODINI VARCHAR(20);
DECLARE VARIABLE CODFIN VARCHAR(20);
DECLARE VARIABLE DESINI VARCHAR(20);
DECLARE VARIABLE DESFIN VARCHAR(20);
declare variable ACUMULADO NUMERIC(18,2);
declare variable EXIST NUMERIC(18,2);
declare variable ACUMPORC NUMERIC(9,2);
declare variable FECINI DATE;
declare variable A NUMERIC(9,2);
declare variable B NUMERIC(9,2);
declare variable C NUMERIC(9,2);
BEGIN
if (ORDEN = 'C') then
    BEGIN
    CODINI = ARTINI;
    CODFIN = ARTFIN;
    DESINI = '';
    DESFIN = 'zz';
    END
ELSE
    BEGIN
    DESINI = ARTINI;
    DESFIN = ARTFIN;
    CODINI = '';
    CODFIN = 'zz';
    END
DELETE FROM analisis_abcinven;
acumporc = 0;
FECINI = FECHA - DIAS;
/* CALCULE LA VENTA PROMEDIO DE CADA ARTICULO */
EXECUTE PROCEDURE LEE_CONFIGURACION ('INVENTARIO', 'EXISTENCIAS', 'PORCENTAJE MINIMO PARA ARTICULO CLASE "A"') returning_values (A);
EXECUTE PROCEDURE LEE_CONFIGURACION ('INVENTARIO', 'EXISTENCIAS', 'PORCENTAJE MINIMO PARA ARTICULO CLASE "B"') returning_values (B);
EXECUTE PROCEDURE LEE_CONFIGURACION ('INVENTARIO', 'EXISTENCIAS', 'PORCENTAJE MINIMO PARA ARTICULO CLASE "C"') returning_values (C);
FOR SELECT ARTI_COD, ARTI_UNIDAD FROM ARTICULO A
      WHERE ARTI_COD >= :CODINI AND ARTI_COD <= :CODFIN AND A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :GRPFIN AND ARTI_DES >= :DESINI AND ARTI_DES <= :DESFIN AND A.ESAR_COD <> 'I'
      INTO :CODIGO, :UNIDAD
      DO
      BEGIN
      EXECUTE PROCEDURE ultimo_costo(:CODIGO, :FECHA, :UNIDAD) returning_values (:COSTO);
      SELECT SUM(MVAR_CANT) FROM MOVIMIENTO_ARTICULO
        WHERE ARTI_COD = :codigo AND MVAR_FECHA >= :FECINI AND MVAR_FECHA <= :FECHA AND MVAR_ENTRADA = 'N' AND MVAR_TIPODOC <> 13 INTO :SALIDAT;
      if (SALIDAT IS NULL) then
        SALIDAT = 0;
      VPROMEDIO = SALIDAT * COSTO;
      insert into analisis_abcinven (ABCI_COD, ABCI_VENTA) VALUES (:codigo, :vpromedio);
      END
SELECT SUM(ABCI_VENTA) FROM analisis_abcinven INTO :acumulado;
FOR SELECT ARTI_COD, ARTI_DES, ARTI_UNIDAD, ARTI_DIAS, A.GRUP_COD, GRUP_NOM, A.SUBG_COD, A.MARC_COD, ABCI_VENTA
      FROM ARTICULO A, GRUPO G, analisis_abcinven N
      WHERE A.ARTI_COD = N.abci_cod AND G.GRUP_COD = A.GRUP_COD
      ORDER BY ABCI_VENTA DESC
      INTO :CODIGO, :NOMBRE, :UNIDAD, :DIAS, :CODGRUPO, :NOMGRUPO, :CODSUBG, :CODMARC, :vpromedio
      DO
        BEGIN
        NOMMARC = '';
        NOMSUBG = '';
        SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO :NOMMARC;
        SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
        EXECUTE PROCEDURE ultimo_costo(:CODIGO, :FECHA, :UNIDAD) returning_values (:COSTO);
        EXECUTE PROCEDURE saldo_total_inventario (:codigo, FECHA) returning_values (:EXIST);
        costo = costo * exist;
        SELECT SUM(MVAR_CANT) FROM MOVIMIENTO_ARTICULO
          WHERE ARTI_COD = :codigo AND MVAR_FECHA >= :FECINI AND MVAR_FECHA <= :FECHA AND MVAR_ENTRADA = 'N' AND MVAR_TIPODOC <> 13 INTO :SALIDAT;
        if (SALIDAT IS NULL) then
          SALIDAT = 0;
        if (acumulado <> 0) then
            PORC = vpromedio / acumulado * 100;
        ELSE
            PORC = 0;
        acumporc = acumporc + porc;
        if (acumporc < A) then
            CLASE = 'A';
        else
            if (acumporc < B) then
                CLASE = 'B';
            else
                if (acumporc < c) then
                    CLASE = 'C';
                else
                    CLASE = 'D';
        SUSPEND;
        END
END

^

SET TERM ; ^

SET TERM ^ ;

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

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE REP_DISPONIBILIDAD(
    FECHA DATE,
    ARTINI VARCHAR(20),
    ARTFIN VARCHAR(20),
    GRPINI VARCHAR(3),
    GRPFIN VARCHAR(3),
    ORDEN CHAR(1),
    CEROS CHAR(1),
    DETALLE CHAR(1),
    AGRUPA CHAR(1),
    SUCURSAL INTEGER)
RETURNS (
    CODIGO VARCHAR(15),
    NOMBRE VARCHAR(60),
    UNIDAD VARCHAR(8),
    CODGRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    CODSUBG VARCHAR(3),
    NOMSUBG VARCHAR(30),
    CODMARC VARCHAR(3),
    NOMMARC VARCHAR(30),
    CODBOD VARCHAR(2),
    NOMBOD VARCHAR(30),
    EXIST NUMERIC(18,4),
    PROMEDIO NUMERIC(18,4),
    SALIDAS NUMERIC(18,4),
    DISPONIBILIDAD INTEGER,
    DIAS INTEGER,
    PROMEDIADO INTEGER,
    COSTO NUMERIC(18,2),
    COSTOPRO NUMERIC(18,2),
    SUGERIDO NUMERIC(18,4),
    FECCOMPRA DATE)
AS
DECLARE VARIABLE CODINI VARCHAR(20);
DECLARE VARIABLE CODFIN VARCHAR(20);
DECLARE VARIABLE DESINI VARCHAR(20);
DECLARE VARIABLE DESFIN VARCHAR(20);
DECLARE VARIABLE MARINI VARCHAR(20);
DECLARE VARIABLE MARFIN VARCHAR(20);
declare variable DIASC VARCHAR(255);
declare variable DIA_ART VARCHAR(2) CHARACTER SET NONE;
BEGIN
if (ORDEN = 'C') then
    BEGIN
    CODINI = ARTINI;
    CODFIN = ARTFIN;
    DESINI = '';
    DESFIN = 'zz';
    END
ELSE
    BEGIN
    DESINI = ARTINI;
    DESFIN = ARTFIN;
    CODINI = '';
    CODFIN = 'zz';
    END
if (AGRUPA = 'G') then
    BEGIN
    MARINI = '';
    MARFIN = 'zz';
    END
ELSE
    if (AGRUPA = 'M') then
        BEGIN
        MARINI = GRPINI;
        MARFIN = GRPFIN;
        GRPINI = '';
        GRPFIN = 'zz';
        END
if (DETALLE = 'S') then
  BEGIN
  FOR SELECT ARTI_COD, ARTI_DES, ARTI_UNIDAD, ARTI_DIAS, A.GRUP_COD, GRUP_NOM, A.SUBG_COD, A.MARC_COD, BODE_COD, BODE_NOM, ARTI_DIANALIS
      FROM ARTICULO A, GRUPO G, BODEGA B
      WHERE ARTI_COD >= :CODINI AND ARTI_COD <= :CODFIN AND A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :GRPFIN AND ARTI_DES >= :DESINI AND ARTI_DES <= :DESFIN AND
      G.GRUP_COD = A.GRUP_COD AND A.ESAR_COD <> 'I' AND ((SUCU_ID = :SUCURSAL) or (:SUCURSAL = 0)) AND
      (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN)))
      INTO :CODIGO, :NOMBRE, :UNIDAD, :DIAS, :CODGRUPO, :NOMGRUPO, :CODSUBG, :CODMARC, :CODBOD, :NOMBOD, :PROMEDIADO
      DO
        BEGIN
        NOMMARC = '';
        NOMSUBG = '';
        SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO :NOMMARC;
        SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
        EXECUTE PROCEDURE ultimo_costo(:CODIGO, :FECHA, :UNIDAD) returning_values (:COSTO);
        EXECUTE PROCEDURE costo_promedio(:CODIGO, :FECHA) RETURNING_VALUES :costopro;
        EXECUTE PROCEDURE DISPONIBILIDAD_ARTICULO(CODIGO, FECHA, :CODBOD) returning_values (:DISPONIBILIDAD, :EXIST, :PROMEDIO, :SALIDAS);
        /*ESTABLECER CUAL ES EL VALOR DE DIAS PARA PROMEDIO*/
        EXECUTE PROCEDURE lee_configuracion ('INVENTARIO', 'EXISTENCIAS', 'PROMEDIAR LAS SALIDAS DEL INVENTARIO CON EL NUMERO DE DIAS ASIGNADO A CADA ARTICULO') returning_values (:DIA_ART);
        if (DIA_ART = 'NO') then
          BEGIN
            EXECUTE PROCEDURE lee_configuracion ('INVENTARIO', 'EXISTENCIAS', 'NUMERO DE DIAS PARA PROMEDIO DE SALIDAS POR ARTICULO') returning_values (DIASC);
            PROMEDIADO = CAST(DIASC AS INTEGER);
          END
        if ((DISPONIBILIDAD < DIAS) and (PROMEDIO > 0))then
            SUGERIDO = (DIAS * PROMEDIO) - EXIST;
        ELSE
            SUGERIDO = 0;
        SELECT MAX(FACO_FECHA) FROM FACTURAS_COMPRA F, FACTURAS_COMPRAS_DETALLE D
            WHERE F.FACO_ID = D.faco_id AND D.ARTI_COD = :CODIGO AND FACO_FECHA <= :FECHA AND D.bode_cod = :codbod
            INTO :FECCOMPRA;
        if ((PROMEDIO > 0) or (EXIST <> 0) or (CEROS = 'S')) then
            SUSPEND;
        END
  END
ELSE
  BEGIN
  FOR SELECT ARTI_COD, ARTI_DES, ARTI_UNIDAD, ARTI_DIAS, A.GRUP_COD, GRUP_NOM, A.SUBG_COD, A.MARC_COD, ARTI_DIANALIS
      FROM ARTICULO A, GRUPO G
      WHERE ARTI_COD >= :CODINI AND ARTI_COD <= :CODFIN AND A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :GRPFIN AND ARTI_DES >= :DESINI AND ARTI_DES <= :DESFIN AND G.GRUP_COD = A.GRUP_COD AND
      A.ESAR_COD <> 'I' AND (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN)))
      INTO :CODIGO, :NOMBRE, :UNIDAD, :DIAS, :CODGRUPO, :NOMGRUPO, :CODSUBG, :CODMARC, :PROMEDIADO
      DO
        BEGIN
        NOMMARC = '';
        NOMSUBG = '';
        SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO :NOMMARC;
        SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
        EXECUTE PROCEDURE costo_promedio(:CODIGO, :FECHA) RETURNING_VALUES :costopro;
        EXECUTE PROCEDURE ultimo_costo(:CODIGO, :FECHA, :UNIDAD) returning_values (:COSTO);
        EXECUTE PROCEDURE DISPONIBILIDAD_TOTAL_ARTICULO(CODIGO, FECHA) returning_values (:DISPONIBILIDAD, :EXIST, :PROMEDIO, :SALIDAS);
        /*ESTABLECER CUAL ES EL VALOR DE DIAS PARA PROMEDIO*/
        EXECUTE PROCEDURE lee_configuracion ('INVENTARIO', 'EXISTENCIAS', 'PROMEDIAR LAS SALIDAS DEL INVENTARIO CON EL NUMERO DE DIAS ASIGNADO A CADA ARTICULO') returning_values (:DIA_ART);
        if (DIA_ART = 'NO') then
          BEGIN
            EXECUTE PROCEDURE lee_configuracion ('INVENTARIO', 'EXISTENCIAS', 'NUMERO DE DIAS PARA PROMEDIO DE SALIDAS POR ARTICULO') returning_values (DIASC);
            PROMEDIADO = CAST(DIASC AS INTEGER);
          END
        if ((DISPONIBILIDAD < DIAS) and (PROMEDIO > 0))then
            SUGERIDO = (DIAS * PROMEDIO) - EXIST;
        ELSE
            SUGERIDO = 0;
        SELECT MAX(FACO_FECHA) FROM FACTURAS_COMPRA F, FACTURAS_COMPRAS_DETALLE D
            WHERE F.FACO_ID = D.faco_id AND D.ARTI_COD = :CODIGO AND FACO_FECHA <= :FECHA
            INTO :FECCOMPRA;
        if ((PROMEDIO > 0) or (EXIST <> 0) or (CEROS = 'S')) then
            SUSPEND;
        END
  END
END

^

SET TERM ; ^

SET TERM ^ ;

ALTER TRIGGER NOTAS_CREDITO_PROVEEDOR_AI
AS
declare variable COSTO NUMERIC(18,2);
declare variable EXISTENCIA NUMERIC(18,4);
declare variable CODBOD VARCHAR(3);
BEGIN
if ((NEW.NCPR_ID <> 0) and (new.ncpr_anulado = 'N')) then
    BEGIN
    /* Registre el nuevo saldo del documento */
    INSERT INTO SALDOS_DOC_CXPAGAR (SDCP_TIPOREF, SDCP_IDREF, SDCP_FECHA, TERC_NIT, SDCP_RTEFTE, SDCP_RTIVA, SDCP_RTICA, SDCP_ABONO, SDCP_ABRTFTE, SDCP_ABRTIVA, SDCP_ABRTICA, SDCP_DEBITO, SDCP_MONTO, SDCP_TRM)
        VALUES (52, NEW.NCPR_ID, NEW.ncpr_fecha, NEW.terc_nit, (NEW.ncpr_rtftemonto * -1), (NEW.ncpr_rtivamonto * -1), (NEW.ncpr_rticamonto * -1), 0, 0, 0, 0, 'N', (NEW.ncpr_monto+NEW.ncpr_ivamonto)*-1, NEW.ncpr_trm);
    /* Registre el movimiento del proveedor */
    INSERT INTO MOVIMIENTO_PROVEEDOR (MVPR_ID, TERC_NIT, MVPR_TIPOREF, MVPR_IDREF, MVPR_FECHA, MVPR_VENCE, MVPR_CONC, MVPR_MONTO, MVPR_RTFTE, MVPR_RTIVA, MVPR_RTICA, MVPR_DEBITO, MVPR_ABONO, MVPR_PREFIJO, MVPR_NUMERO, MVPR_TRM)
      VALUES (GEN_ID(ID_MOVPROV, 1), NEW.TERC_NIT, 52, NEW.NCPR_ID, NEW.NCPR_FECHA, NEW.NCPR_FECHA, NEW.NCPR_CONC, NEW.NCPR_MONTO+NEW.NCPR_IVAMONTO, NEW.NCPR_RTFTEMONTO, NEW.NCPR_RTIVAMONTO, NEW.NCPR_RTICAMONTO, 'N', 'N', NEW.pref_pre, NEW.ncpr_numero, NEW.ncpr_trm);
    /* afecte el articulo */
    if (new.arti_cod <> '') then
        begin
        /* CALCULE EL NUEVO COSTO */
        execute procedure costo_promedio (new.arti_cod, new.ncpr_fecha) returning_values (:COSTO);
        execute procedure saldo_total_inventario (new.arti_cod, new.ncpr_fecha) returning_values (:EXISTENCIA);
        COSTO = (COSTO * EXISTENCIA - (NEW.ncpr_monto - NEW.ncpr_ivamonto)) / EXISTENCIA;
        FOR SELECT DISTINCT BODE_COD FROM EXISTENCIA WHERE ARTI_COD = NEW.ARTI_COD INTO :CODBOD do
            BEGIN
            execute procedure saldo_inventario (new.arti_cod, :CODBOD, new.ncpr_fecha) returning_values (:EXISTENCIA);
            /* SAQUE TODO LO QUE TENGA */
            INSERT INTO MOVIMIENTO_ARTICULO
              (ARTI_COD, MVAR_CONS, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM, TERC_NIT)
              VALUES(NEW.ARTI_COD, GEN_ID(ID_MOVARTI,1), :CODBOD, new.ncpr_fecha, 52, NEW.ncpr_id,
              new.ncpr_conc, :EXISTENCIA, 0, 'N', '', new.pref_pre, new.ncpr_numero, 1, new.terc_nit);
            /* META TODO CON EL NUEVO COSTO */
            INSERT INTO MOVIMIENTO_ARTICULO
              (ARTI_COD, MVAR_CONS, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM, TERC_NIT)
              VALUES(NEW.ARTI_COD, GEN_ID(ID_MOVARTI,1), :CODBOD, new.ncpr_fecha, 52, NEW.ncpr_id,
              new.ncpr_conc, :EXISTENCIA, :COSTO, 'S', '', new.pref_pre, new.ncpr_numero, 1, new.terc_nit);
            END
        /* RECORRA LAS LISTAS DE PRECIOS Y CAMBIE EL PRECIO */
        EXECUTE PROCEDURE CALCULA_PRECIOS(NEW.ARTI_COD, new.ncpr_fecha);
        end
    INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
        VALUES (USER, 52, NEW.ncpr_id, 'I', NEW.pref_pre || NEW.ncpr_numero);
    END
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER TRIGGER NOTAS_CREDITO_PROVEEDOR_AU
AS
declare variable ABONOS char(1);
declare variable consec INTEGER;
declare variable COSTO NUMERIC(18,2);
declare variable EXISTENCIA NUMERIC(18,4);
declare variable CODBOD VARCHAR(3);
BEGIN
if (new.ncpr_anulado = 'S') then
    begin
    select enco_consec from comprobante_encabezado where enco_tiporef = 52 and enco_idref = old.ncpr_id into :consec;
    if (NOT consec is null) then
      delete from comprobante_detalle where enco_consec = :consec;
    delete from comprobante_encabezado where enco_tiporef = 52 and enco_idref = old.ncpr_id;
    INSERT INTO AUDITORIA (AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
        VALUES (USER, 52, new.ncpr_id, 'A', NEW.pref_pre || NEW.ncpr_numero);
    end

/* BORRE EL REGISTRO PREVIO */
if ((old.ncpr_id <> 0) and (old.ncpr_anulado = 'N')) then
    begin
    /* Verifique si habia abonos a la nota */
    ABONOS = 'N';
    select 'S' FROM SALDOS_DOC_CXPAGAR WHERE SDCP_TIPOREF = 52 AND SDCP_IDREF = OLD.NCPR_ID AND SDCP_ABONO <> 0 INTO :ABONOS;
    if (ABONOS = 'N') then
        BEGIN
        /* BORRE EL REGISTRO PREVIO */
        delete from saldos_doc_cxpagar where sdcp_tiporef = 52 and sdcp_idref = old.ncpr_id;
        delete from movimiento_PROVEEDOR where (mvpr_tiporef = 52) and (mvpr_idref = old.ncpr_id);
        delete from movimiento_articulo where  (mvar_tipodoc = 52) and (mvar_idref = old.ncpr_id);
        END
    else
        exception DOCUMENTO_CON_ABONOS 'El descuento de proveedor ' || old.pref_pre || old.ncpr_numero || ' tiene abonos registrados.';
    end
if ((new.ncpr_id <> 0) and (new.ncpr_anulado = 'N')) then
    begin
    /* Registre el nuevo saldo del documento */
    INSERT INTO SALDOS_DOC_CXPAGAR (SDCP_TIPOREF, SDCP_IDREF, SDCP_FECHA, TERC_NIT, SDCP_RTEFTE, SDCP_RTIVA, SDCP_RTICA, SDCP_ABONO, SDCP_ABRTFTE, SDCP_ABRTIVA, SDCP_ABRTICA, SDCP_DEBITO, SDCP_MONTO, SDCP_TRM)
        VALUES (52, NEW.NCPR_ID, NEW.ncpr_fecha, NEW.terc_nit, (NEW.ncpr_rtftemonto * -1), (NEW.ncpr_rtivamonto * -1), (NEW.ncpr_rticamonto * -1), 0, 0, 0, 0, 'N', (NEW.ncpr_monto+NEW.ncpr_ivamonto)*-1, NEW.ncpr_trm);
    /* Registre el movimiento del proveedor */
    INSERT INTO MOVIMIENTO_PROVEEDOR (MVPR_ID, TERC_NIT, MVPR_TIPOREF, MVPR_IDREF, MVPR_FECHA, MVPR_VENCE, MVPR_CONC, MVPR_MONTO, MVPR_RTFTE, MVPR_RTIVA, MVPR_RTICA, MVPR_DEBITO, MVPR_ABONO, MVPR_PREFIJO, MVPR_NUMERO, MVPR_TRM)
        VALUES (GEN_ID(ID_MOVPROV, 1), NEW.TERC_NIT, 52, NEW.NCPR_ID, NEW.NCPR_FECHA, NEW.NCPR_FECHA, NEW.NCPR_CONC, NEW.NCPR_MONTO+NEW.ncpr_ivamonto, NEW.NCPR_RTFTEMONTO, NEW.NCPR_RTIVAMONTO, NEW.NCPR_RTICAMONTO, 'N', 'N', NEW.pref_pre, NEW.ncpr_numero, NEW.ncpr_trm);
    /* afecte el articulo */
    if (new.arti_cod <> '') then
        begin
        /* CALCULE EL NUEVO COSTO */
        execute procedure costo_promedio (new.arti_cod, new.ncpr_fecha) returning_values (:COSTO);
        execute procedure saldo_total_inventario (new.arti_cod, new.ncpr_fecha) returning_values (:EXISTENCIA);
        COSTO = (COSTO * EXISTENCIA - (NEW.ncpr_monto - NEW.ncpr_ivamonto)) / EXISTENCIA;
        FOR SELECT DISTINCT BODE_COD FROM EXISTENCIA WHERE ARTI_COD = NEW.ARTI_COD INTO :CODBOD do
            BEGIN
            execute procedure saldo_inventario (new.arti_cod, :CODBOD, new.ncpr_fecha) returning_values (:EXISTENCIA);
            /* SAQUE TODO LO QUE TENGA */
            INSERT INTO MOVIMIENTO_ARTICULO
                (ARTI_COD, MVAR_CONS, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM, TERC_NIT)
                VALUES(NEW.ARTI_COD, GEN_ID(ID_MOVARTI,1), :CODBOD, new.ncpr_fecha, 52, NEW.ncpr_id,
                new.ncpr_conc, :EXISTENCIA, 0, 'N', '', new.pref_pre, new.ncpr_numero, 1, new.terc_nit);
            /* META TODO CON EL NUEVO COSTO */
            INSERT INTO MOVIMIENTO_ARTICULO
                (ARTI_COD, MVAR_CONS, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM, TERC_NIT)
                VALUES(NEW.ARTI_COD, GEN_ID(ID_MOVARTI,1), :CODBOD, new.ncpr_fecha, 52, NEW.ncpr_id,
                new.ncpr_conc, :EXISTENCIA, :COSTO, 'S', '', new.pref_pre, new.ncpr_numero, 1, new.terc_nit);
            END
        /* RECORRA LAS LISTAS DE PRECIOS Y CAMBIE EL PRECIO */
        EXECUTE PROCEDURE CALCULA_PRECIOS(NEW.ARTI_COD, new.ncpr_fecha);
        end
    INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
        VALUES (USER, 52, NEW.ncpr_id, 'U', NEW.pref_pre || NEW.ncpr_numero);
    end
END
^

SET TERM ; ^

/* 20090202 : SI SON AUTORETENEDORES NO DESCUENTO LA RETEFTE DEL VALOR A PAGAR */
SET TERM ^ ;

CREATE OR ALTER PROCEDURE IMPR_FACTURA(
    ID INTEGER)
RETURNS (
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    VENCE DATE,
    DIASVENCE INTEGER,
    CONTCRED CHAR(17),
    NIT VARCHAR(20),
    NOMTERCERO VARCHAR(60),
    NOMCLIENTE VARCHAR(60),
    VENDEDOR INTEGER,
    NOMVENDEDOR VARCHAR(60),
    PUNTOVTA INTEGER,
    NOMPUNTOVTA VARCHAR(30),
    CODBODEGA VARCHAR(2),
    NOMBODEGA VARCHAR(30),
    AUTORIZACION VARCHAR(20),
    DESPACHO VARCHAR(255),
    TRANSPORTADOR VARCHAR(60),
    COTIZACION VARCHAR(30),
    PEDIDO VARCHAR(30),
    REMISION VARCHAR(30),
    PACIENTE VARCHAR(20),
    NOMPACIENTE VARCHAR(60),
    COMIPORC NUMERIC(9,2),
    COMIMONTO NUMERIC(18,2),
    SUBTOTAL NUMERIC(18,2),
    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),
    EXTRA NUMERIC(18,2),
    DTOFPORC NUMERIC(9,2),
    DTOFMONTO NUMERIC(18,2),
    FECHADTO DATE,
    TOTALFAC NUMERIC(18,2),
    TOTALPAGAR NUMERIC(18,2),
    OBS BLOB SUB_TYPE 1 SEGMENT SIZE 80,
    ITEM INTEGER,
    ARTICULO VARCHAR(15),
    CODBAR VARCHAR(15),
    ARTIDES VARCHAR(60),
    DESCORTA VARCHAR(30),
    CANT NUMERIC(18,4),
    LOTE VARCHAR(15),
    VLOTE DATE,
    UNIDAD VARCHAR(8),
    CAJAS NUMERIC(18,4),
    FACTOR INTEGER,
    LISTAPR INTEGER,
    REFITEM VARCHAR(60),
    BODITEM VARCHAR(2),
    STAND VARCHAR(15),
    PRUNIT NUMERIC(18,2),
    DTOITPORC NUMERIC(9,2),
    DTOITMONTO NUMERIC(18,2),
    PRNETO NUMERIC(18,2),
    PRNETOSINIVA NUMERIC(18,2),
    DTOIT1 NUMERIC(9,2),
    DTOIT2 NUMERIC(9,2),
    DTOIT3 NUMERIC(9,2),
    IVAPORC NUMERIC(9,2),
    IVAITMONTO NUMERIC(18,2),
    CONSUMO NUMERIC(18,2),
    SUBTOTIT NUMERIC(18,2),
    TOTAL NUMERIC(18,2),
    CODIGOCL VARCHAR(20),
    ZONACOD VARCHAR(2),
    ZONANOM VARCHAR(60),
    DV CHAR(1),
    DIRECCION VARCHAR(60),
    CIUDAD VARCHAR(40),
    TELEFONO VARCHAR(40),
    CONTACTO VARCHAR(60),
    FAX VARCHAR(25),
    GRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    SUBGRUPO VARCHAR(3),
    NOMSUBG VARCHAR(30),
    MARCA VARCHAR(3),
    NOMMARCA VARCHAR(30),
    PESO NUMERIC(18,4),
    ANCHO NUMERIC(18,4),
    ALTO NUMERIC(18,4),
    LARGO NUMERIC(18,4),
    SUMA1 NUMERIC(18,2),
    SUMA2 NUMERIC(18,2),
    SUMA3 NUMERIC(18,2),
    IVA1 NUMERIC(18,2),
    IVA2 NUMERIC(18,2),
    IVA3 NUMERIC(18,2),
    SUMAEX NUMERIC(18,2),
    SUMAGR NUMERIC(18,2),
    TOTCONSUMO NUMERIC(18,2),
    DTOIT1M NUMERIC(18,2),
    DTOIT2M NUMERIC(18,2),
    DTOIT3M NUMERIC(18,2),
    TOTCAJAS NUMERIC(18,2),
    VEHICULO VARCHAR(8),
    RECIBIDO NUMERIC(18,2),
    CAMBIO NUMERIC(18,2),
    HORA TIME,
    FORMAPAGO1 VARCHAR(30),
    MONTOPAGO1 NUMERIC(18,2),
    FORMAPAGO2 VARCHAR(30),
    MONTOPAGO2 NUMERIC(18,2),
    FORMAPAGO3 VARCHAR(30),
    MONTOPAGO3 NUMERIC(18,2),
    PUNTOS INTEGER,
    PUNTOSACUM INTEGER,
    PUNTOSVENC INTEGER,
    FECPTOS DATE,
    OBSITEM BLOB SUB_TYPE 1 SEGMENT SIZE 80,
    SUCUR VARCHAR(10))
AS
DECLARE VARIABLE IMPTOS CHAR(1);
DECLARE VARIABLE TARIFA INTEGER;
declare variable DEVUELTO NUMERIC(18,2);
declare variable ORDENCOD CHAR(2);
declare variable IMPRDEV CHAR(2);
declare variable IMPR CHAR(1);
declare variable ITEMFP INTEGER;
declare variable FORMAP VARCHAR(30);
declare variable MONTOP NUMERIC(18,2);
declare variable ICOINC CHAR(2);
declare variable DTOITM1 NUMERIC(18,2);
declare variable DTOITM2 NUMERIC(18,2);
declare variable DTOITM3 NUMERIC(18,2);
declare variable DTOITE3 CHAR(2);
declare variable SUMDTOIT NUMERIC(18,2);
declare variable AUTORET VARCHAR(10);
declare variable FAUTORET DATE;
BEGIN
execute procedure lee_configuracion('FACTURACION', 'ARTICULOS', 'IMPOCONSUMO INCLUIDO EN EL PRECIO BASE DE VENTA ANTES DE IVA') returning_values (icoinc);
execute procedure lee_configuracion('FACTURACION', 'FACTURAS', 'COLUMNAS DE DESCUENTO POR ITEM ADICIONALES') returning_values (DTOITE3);
SELECT F.PREF_PRE, FACT_NUMERO, FACT_FECHA, FACT_VENCE, F.BODE_COD, BODE_NOM, F.TERC_NIT, FACT_NOMCLIENTE, F.VEND_COD, VEND_NOMBRE, F.PTVT_ID, PTVT_NOM,
    AUTO_NUMERO, FACT_DESPACHO, FACT_TRANSP, FACT_COTIZACI, FACT_PEDIDO, FACT_REMISION, FACT_COMIPORC, FACT_COMIMONTO, FACT_IVAINC, 
    FACT_DTOPOR, FACT_DTOMONTO, FACT_ADICIONAL, FACT_IVAMONTO, FACT_RTFTEPOR, FACT_RTFTEMONTO, FACT_RTIVAPOR, FACT_RTIVAMONTO, FACT_RTICAPOR, FACT_RTICAMONTO, FACT_EXTRA, FACT_DTOFPOR, FACT_DTOFMONTO, FACT_DTOFFECHA, FACT_TOTAL,
    TERC_DIR, TERC_CIU, TERC_TEL, TERC_CONTACTO, TERC_FAX, TERC_DV, FACT_DTOIT1, FACT_DTOIT2, FACT_DTOIT3,
    FACT_OBS, VEHI_COD, /*FACT_NROCOPIA,*/ FACT_RECIBIDO, FACT_SUCURSAL, FACT_DETCLI, FACT_DETCLINOM, TERC_NOM
    FROM FACTURAS F, BODEGA B, VENDEDORES V, PUNTO_VENTA P, TERCEROS T
    WHERE F.BODE_COD = B.BODE_COD AND F.VEND_COD = V.VEND_COD AND F.PTVT_ID = P.PTVT_ID AND F.TERC_NIT = T.TERC_NIT AND F.FACT_ID = :ID
    into :PREF, :NUMERO, :FECHA, :VENCE, :CODBODEGA, :NOMBODEGA, :NIT, :NOMTERCERO, :VENDEDOR, :NOMVENDEDOR, :PUNTOVTA, :NOMPUNTOVTA,
    :AUTORIZACION, :DESPACHO, :TRANSPORTADOR, :COTIZACION, :PEDIDO, :REMISION, :COMIPORC, :COMIMONTO, :IMPTOS,
    :DTOPORC, :DTOMONTO, :ADICIONAL, :IVAMONTO, :RTEFTEPORC, :RTEFTEMONTO, :RTEIVAPORC, :RTEIVAMONTO, :RTEICAPORC, :RTEICAMONTO, :EXTRA, :DTOFPORC, :DTOFMONTO, :FECHADTO, :TOTALFAC,
    :DIRECCION, :CIUDAD, :TELEFONO, :CONTACTO, :FAX, :DV, :dtoit1m, :dtoit2m, :dtoit3m,
    :OBS, :VEHICULO,/* :NROCOPIA,*/ :RECIBIDO, :SUCUR, :paciente, :nompaciente, :nomcliente;

/* ACUMULE LOS PUNTOS, SE HACE ACA POR SER POSTERIOR AL DETALLE */
EXECUTE PROCEDURE acumula_puntos_cliente (31, :id, :nit, :fecha) returning_values (:PUNTOS);
EXECUTE PROCEDURE consulta_puntos_cliente (:id, :nit, :fecha) returning_values (:puntos, :puntosacum, :puntosvenc, :fecptos);
if (DTOIT1M IS NULL) then
    DTOIT1M = 0;
if (DTOIT2M IS NULL) then
    DTOIT2M = 0;
if (DTOIT3M IS NULL) then
    DTOIT3M = 0;
SELECT CLIE_COD, C.ZONA_COD, ZONA_NOM
    FROM CLIENTES C, ZONAS Z
    WHERE TERC_NIT = :NIT AND C.ZONA_COD = Z.ZONA_COD
    INTO :CODIGOCL, :ZONACOD, :ZONANOM;
SELECT CLSU_DIR, CLSU_CIUDAD, CLSU_TEL FROM CLIENTE_SUCURSALES WHERE TERC_NIT = :NIT AND CLCU_COD = :SUCUR
    INTO :DIRECCION, :CIUDAD, :TELEFONO;
DIASVENCE = VENCE - FECHA;
if (DIASVENCE > 0) then
    CONTCRED = 'CREDITO ' || CAST(DIASVENCE AS VARCHAR(3)) || ' DIAS';
ELSE
    CONTCRED = 'CONTADO';
SUBTOTAL = TOTALFAC - EXTRA - IVAMONTO - ADICIONAL + DTOMONTO;
if (DTOITE3 = 'SI') then
    BEGIN
    SELECT SUM(FADE_DTOMONTO) FROM FACTURAS_DETALLE WHERE FACT_ID = :id INTO :sumdtoit;
    SUBTOTAL = SUBTOTAL + sumdtoit + dtoit1m + dtoit2m + dtoit3m;
    END
EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'FECHA AUTORETENEDOR NO DESCONTAR RETENCIONES DEL SALDO PERO SI CONTABILIZARLAS') returning_values (AUTORET);
if (AUTORET <> '') then
    FAUTORET = CAST(AUTORET AS DATE);
else
    FAUTORET = '9999/12/31';
if (FECHA > fautoret) then
    TOTALPAGAR = TOTALFAC - RTEIVAMONTO - RTEICAMONTO;
ELSE
    TOTALPAGAR = TOTALFAC - RTEFTEMONTO - RTEIVAMONTO - RTEICAMONTO;
if (RECIBIDO <> 0) then
    CAMBIO = RECIBIDO - totalpagar;
ELSE
    CAMBIO = 0;
SUMAEX = 0;
SUMA1 = 0;
SUMA2 = 0;
SUMA3 = 0;
IVA1 = 0;
IVA2 = 0;
IVA3 = 0;
TOTCONSUMO = 0;
MONTOPAGO1 = 0;
SELECT MAX(AUDI_HORA) FROM AUDITORIA WHERE TIDO_COD = 31 AND AUDI_IDDOC = :ID AND AUDI_OPER = 'I' INTO :HORA;
/* AHORA LAS FORMAS DE PAGO, BUSQUE EL ABONO DE HOY A LA FACTURA */
ITEMFP = 1;
MONTOPAGO1 = 0;
MONTOPAGO2 = 0;
MONTOPAGO3 = 0;
FOR SELECT FOPA_NOM, RCPA_MONTO FROM RECIBOS_CAJA_PAGO P, FORMAS_PAGO F, RECIBOS_CAJA R, RECIBOS_CAJA_DETALLE D
    WHERE R.RECA_ID = P.RECA_ID AND R.RECA_ID = D.RECA_ID AND P.FOPA_ID = F.FOPA_ID AND RECA_FECHA = :FECHA AND RCDE_TIPODOC = 31 AND RCDE_IDDOC = :ID
    INTO :formap, :MONTOP
    DO
    BEGIN
    if (ITEMFP = 1) then
        BEGIN
        FORMAPAGO1 = FORMAP;
        MONTOPAGO1 = MONTOP;
        END
    if (ITEMFP = 2) then
        BEGIN
        FORMAPAGO2 = FORMAP;
        MONTOPAGO2 = MONTOP;
        END
    if (ITEMFP = 3) then
        BEGIN
        FORMAPAGO3 = FORMAP;
        MONTOPAGO3 = MONTOP;
        END
    ITEMFP = ITEMFP + 1;
    END
EXECUTE PROCEDURE lee_configuracion ('FACTURACION','DOCUMENTOS','ORDENAR ITEMS POR CODIGO DE ARTICULO') returning_values (:ORDENCOD);
EXECUTE PROCEDURE lee_configuracion ('FACTURACION','POS', 'IMPRIMIR DEVOLUCIONES DE ARTICULOS NEGATIVOS') returning_values (:imprdev);
totcajas = 0;
if (ORDENCOD = 'SI') then
    BEGIN
    FOR SELECT FADE_ITEM, D.ARTI_COD, FADE_CODBAR, SUBSTR(FADE_DESC,1,60), ARTI_DESCORTA, FADE_CANT, FADE_UNIDAD, FADE_FACTOR, BODE_COD, FADE_LOTE, LIPR_COD, FADE_PRUNIT, FADE_DTOPORC, FADE_DTOMONTO, FADE_IVAPORC, FADE_IVAMONTO, FADE_CONSUMO, FADE_TOTAL, FADE_REFERENCIA,
        GRUP_COD, SUBG_COD, MARC_COD, ARTI_PESO, ARTI_ANCHO, ARTI_ALTO, ARTI_LARGO, TAIV_COD, FADE_DEVUELTO, FADE_OBS, FADE_DTO1, FADE_DTO2, FADE_DTO3, FADE_DTOM1, FADE_DTOM2, FADE_DTOM3, FADE_CAJAS
        FROM FACTURAS_DETALLE D, ARTICULO A
        WHERE D.ARTI_COD = A.ARTI_COD AND D.FACT_ID = :ID
        ORDER BY D.ARTI_COD
        INTO :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :DESCORTA, :CANT, :UNIDAD, :FACTOR, :BODITEM, :LOTE, :LISTAPR, :PRUNIT, :DTOITPORC, :DTOITMONTO, :IVAPORC, :IVAITMONTO, :CONSUMO, :TOTAL, :refitem,
        :GRUPO, :SUBGRUPO, :MARCA, :PESO, :ANCHO, :ALTO, :LARGO, :TARIFA, :devuelto, :obsitem, :dtoit1, :dtoit2, :dtoit3, :dtoitm1, :dtoitm2, :dtoitm3, :cajas
        DO
          BEGIN
          if (ARTICULO = CODBAR) then
            SELECT FIRST 1 COBA_COD FROM barras_articulo WHERE ARTI_COD = :articulo INTO :CODBAR;
          if (IMPRDEV <> 'SI') then
            BEGIN
            if ((CANT >= 0) AND (DEVUELTO = 0)) then
                IMPR = 'S';
            ELSE
                IMPR = 'N'; /* ES DEVOLUCION */
            END
          ELSE
            IMPR = 'S';
          if (IMPR = 'S') then
            BEGIN
            prneto = PRUNIT - DTOITMONTO - dtoitm1 - dtoitm2 - dtoitm3;
            if (IMPTOS = 'S') then
                if (cant <> 0) then
                    prnetosiniva = PRUNIT - DTOITMONTO - ((IVAITMONTO+CONSUMO) / CANT) - dtoitm1 - dtoitm2 - dtoitm3;
                else
                    prnetosiniva = PRUNIT - DTOITMONTO - dtoitm1 - dtoitm2 - dtoitm3;
            ELSE
                prnetosiniva = PRUNIT - DTOITMONTO - dtoit1m - dtoit2m - dtoit3m;
            if (ICOINC = 'SI') then
                SUBTOTIT = TOTAL - IVAITMONTO;
            else
                SUBTOTIT = TOTAL - IVAITMONTO - CONSUMO;
            TOTCONSUMO = TOTCONSUMO + CONSUMO;
            SELECT LOTE_VENCE FROM LOTES WHERE LOTE_NRO = :lote AND ARTI_COD = :ARTICULO AND BODE_COD = :boditem INTO :vlote;
            if ((REFITEM <> '.t') or (REFITEM IS NULL)) then
                BEGIN
                /* NO SUME LOS ENSAMBLES */
                if (IVAPORC = 0) then
                    SUMAEX = SUMAEX + TOTAL;
                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;
                END
            if (ANCHO IS NULL) then
                ANCHO = 0;
            if (ALTO IS NULL) then
                ALTO = 0;
            if (LARGO IS NULL) then
                LARGO = 0;
            if (PESO IS NULL) then
                PESO = 0;
            PESO = PESO * CANT;
            totcajas = totcajas + cajas;
            if (substr(ARTICULO,1,2) = '.t') then
                BEGIN
                REFITEM = '';
                TOTAL = 0;
                SUBTOTIT = 0;
                END
            SELECT STAND_COD FROM STANDS WHERE ARTI_COD = :ARTICULO AND STAND_BODEGA = :boditem INTO :stand;
            SUSPEND;
            END
          END
    END
ELSE
    BEGIN
    FOR SELECT FADE_ITEM, D.ARTI_COD, FADE_CODBAR, SUBSTR(FADE_DESC,1,60), ARTI_DESCORTA, FADE_CANT, FADE_UNIDAD, FADE_FACTOR, BODE_COD, FADE_LOTE, LIPR_COD, FADE_PRUNIT, FADE_DTOPORC, FADE_DTOMONTO, FADE_IVAPORC, FADE_IVAMONTO, FADE_CONSUMO, FADE_TOTAL, FADE_REFERENCIA,
        GRUP_COD, SUBG_COD, MARC_COD, ARTI_PESO, ARTI_ANCHO, ARTI_ALTO, ARTI_LARGO, TAIV_COD, FADE_DEVUELTO, FADE_OBS, FADE_DTO1, FADE_DTO2, FADE_DTO3, FADE_DTOM1, FADE_DTOM2, FADE_DTOM3, FADE_CAJAS
        FROM FACTURAS_DETALLE D, ARTICULO A
        WHERE D.ARTI_COD = A.ARTI_COD AND D.FACT_ID = :ID
        ORDER BY FADE_ITEM
        INTO :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :DESCORTA, :CANT, :UNIDAD, :FACTOR, :BODITEM, :LOTE, :LISTAPR, :PRUNIT, :DTOITPORC, :DTOITMONTO, :IVAPORC, :IVAITMONTO, :CONSUMO, :TOTAL, :refitem,
        :GRUPO, :SUBGRUPO, :MARCA, :PESO, :ANCHO, :ALTO, :LARGO, :TARIFA, :devuelto, :obsitem, :dtoit1, :dtoit2, :dtoit3, :dtoitm1, :dtoitm2, :dtoitm3, :cajas
        DO
          BEGIN
          if (IMPRDEV <> 'SI') then
            BEGIN
            if ((CANT >= 0) AND (DEVUELTO = 0)) then
                IMPR = 'S';
            ELSE
                IMPR = 'N'; /* ES DEVOLUCION */
            END
          ELSE
            IMPR = 'S';
          if (IMPR = 'S') then
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :GRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :MARCA INTO NOMMARCA;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :SUBGRUPO AND GRUP_COD = :GRUPO INTO :NOMSUBG;
            prneto = PRUNIT - DTOITMONTO - dtoitm1 - dtoitm2 - dtoitm3;
            if (IMPTOS = 'S') then
                if (cant <> 0) then
                    prnetosiniva = PRUNIT - DTOITMONTO - ((IVAITMONTO+CONSUMO) / CANT) - dtoit1m - dtoit2m - dtoit3m;
                else
                    prnetosiniva = PRUNIT - DTOITMONTO - dtoitm1 - dtoitm2 - dtoitm3;
            ELSE
                prnetosiniva = PRUNIT - DTOITMONTO - dtoitm1 - dtoitm2 - dtoitm3;
            if (ICOINC = 'SI') then
                SUBTOTIT = TOTAL - IVAITMONTO;
            else
                SUBTOTIT = TOTAL - IVAITMONTO - CONSUMO;
            TOTCONSUMO = TOTCONSUMO + CONSUMO;
            SELECT LOTE_VENCE FROM LOTES WHERE LOTE_NRO = :lote AND ARTI_COD = :ARTICULO AND BODE_COD = :boditem INTO :vlote;
            if ((REFITEM <> '.t') or (REFITEM IS NULL)) then
                BEGIN
                /* NO SUME LOS ENSAMBLES */
                if (IVAPORC = 0) then
                    SUMAEX = SUMAEX + TOTAL;
                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;
                END
            if (ANCHO IS NULL) then
                ANCHO = 0;
            if (ALTO IS NULL) then
                ALTO = 0;
            if (LARGO IS NULL) then
                LARGO = 0;
            if (PESO IS NULL) then
                PESO = 0;
            PESO = PESO * CANT;
            totcajas = totcajas + cajas;
            if (substr(ARTICULO,1,2) = '.t') then
                BEGIN
                REFITEM = '';
                TOTAL = 0;
                SUBTOTIT = 0;
                END
            SELECT STAND_COD FROM STANDS WHERE ARTI_COD = :ARTICULO AND STAND_BODEGA = :boditem INTO :stand;
            SUSPEND;
            END
          END
    END
END
^

SET TERM ; ^



/* 20090203 : NUMERO REMISION OBLIGATORIO */

INSERT INTO CONFIGURACION (CONF_MODULO, CONF_CATEGORIA, CONF_PROPIEDAD, CONF_VALOR, CONF_POSIBLES, CONF_AYUDA) VALUES ('FACTURACION', 'FACTURAS', 'NUMERO DE REMISION OBLIGATORIO', 'NO', 'SI,NO', 'SI: No se puede facturar sin indicar un número de remisión. NO: Se puede omitir la remisión al facturar');
commit work;

/* 20090204 : ARREGLO TABLA DE STANDS */
SET TERM ^ ;

create procedure CHEQUEO_STANDS
returns (ARTICULO VARCHAR(20),
    BODEGA VARCHAR(2),
    STAND VARCHAR(20))
as
declare variable TIPO INTEGER;
declare variable ID INTEGER;
declare variable ITEM INTEGER;
begin
DELETE FROM STANDS;
FOR SELECT ARTI_COD, BODE_COD, mvar_tipodoc, mvar_idref, mvar_item from movimiento_articulo where mvar_entrada = 'S' order by arti_cod, mvar_fecha
    INTO :ARTICULO, :BODEGA, :tipo, :id, :item
    DO
    BEGIN
    STAND = '';
    if (TIPO = 11) then
        SELECT ENDE_STAND FROM ENTRADAS_DETALLE WHERE (ende_stand is not null) AND ENTR_ID = :ID AND ENDE_ITEM = :ITEM INTO :STAND;
    if (TIPO = 21) then
        SELECT FCDE_STAND FROM FACTURAS_COMPRAS_DETALLE WHERE (fcde_stand is not null) AND FACO_ID = :ID AND FCDE_ITEM = :ITEM INTO :STAND;
    if (TIPO = 22) then
        SELECT RPVD_STAND FROM remision_proveedor_det WHERE (rpvd_stand is not null) AND REPR_ID = :ID AND RPVD_ITEM = :ITEM INTO :STAND;
    if ((STAND IS NOT NULL) AND (STAND <> '')) then
        BEGIN
        if (exists(select stand_cod from stands where arti_cod = :articulo and stand_bodega = :bodega)) then
            UPDATE stands set stand_cod = :stand where arti_cod = :articulo and stand_bodega = :bodega;
        else
            BEGIN
            INSERT INTO stands (ARTI_COD, STAND_BODEGA, STAND_COD) VALUES (:articulo, :bodega, :stand);
            suspend;
            END
        END
    END
end
^

SET TERM ; ^

/* 20090205 : COSTO EN REVISION DE PRECIOS */

SET TERM ^ ;

CREATE OR ALTER PROCEDURE REVISA_PRECIOS(
    LISTA INTEGER,
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    ARTICULO VARCHAR(20),
    DESCR VARCHAR(60),
    GRUPO VARCHAR(2),
    SUBGRUPO VARCHAR(3),
    MARCA VARCHAR(3),
    COSTO NUMERIC(18,2),
    FIJO NUMERIC(18,2),
    UNIDAD VARCHAR(8),
    PORC NUMERIC(9,4),
    SUGERIDO NUMERIC(18,2),
    DIFER NUMERIC(18,2),
    NUEVO NUMERIC(18,2),
    OK CHAR(1))
AS
declare variable marg numeric(9,4);
declare variable UOM VARCHAR(10);
declare variable BASE VARCHAR(10);
declare variable CAMBIO VARCHAR(10);
declare variable COSTOP numeric(18,2);
declare variable COSTOU numeric(18,2);
declare variable DIFMAX numeric(18,2);
declare variable DIG INTEGER;
declare variable TARIVA NUMERIC(9,4);
declare variable IVAINC CHAR(1);
declare variable LISTAREF INTEGER;
begin
execute procedure lee_configuracion ('FACTURACION', 'ARTICULOS', 'SUGERIR PRECIOS CON PORCENTAJE DE MARGEN O UTILIDAD') returning_values (:UOM);
EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION', 'ARTICULOS', 'REDONDEO AL MULTIPLO DE DIEZ EN PRECIOS') RETURNING_VALUES (:DIG);
EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION','ARTICULOS','CAMBIO DE PRECIOS AUTOMATICO AL CAMBIAR COSTO O PRECIO') returning_values (CAMBIO);
EXECUTE PROCEDURE lee_configuracion('FACTURACION','ARTICULOS','COSTO BASE PARA CALCULO DE PRECIOS DE VENTA AUTOMATICOS') returning_values (:BASE);
EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION','ARTICULOS','CODIGO DE LA LISTA DE PRECIOS BASE PARA CAMBIO DE PRECIOS AUTOMATICO') returning_values (LISTAREF);
EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION','ARTICULOS','DIFERENCIA EN PESOS MAXIMA A PERMITIR PARA CAMBIAR PRECIOS') returning_values (DIFMAX);
for select A.arti_cod, A.arti_des, A.grup_cod, A.subg_cod, A.marc_cod, A.arti_unidad, prar_fijo, prar_margen, prar_util, TAIV_PORC
    from precios_articulo p, articulo a, tarifa_iva T
    where a.arti_cod = p.arti_cod and lipr_cod = :lista and a.taiv_cod = t.taiv_cod and exists (select arti_cod from movimiento_articulo m where arti_cod = a.arti_cod and m.mvar_entrada = 'S' and m.mvar_tipodoc <> 33 and m.mvar_tipodoc <> 13 and m.mvar_fecha >= :fecini and m.mvar_fecha <= :fecfin)
    order by A.arti_cod
    into :articulo, descr, :grupo, :subgrupo, :marca, :unidad, :fijo, :marg, :porc, :tariva
    do
    begin
    if (UOM <> 'UTILIDAD') then
        PORC = MARG;
    if (CAMBIO = 'COSTO') then
        BEGIN
        EXECUTE PROCEDURE COSTO_PROMEDIO (:ARTICULO, :FECFIN) RETURNING_VALUES(:COSTOP);
        EXECUTE PROCEDURE ULTIMO_COSTO (:ARTICULO, :FECFIN, :UNIDAD) RETURNING_VALUES(:COSTOU);
        if (base = 'ULTIMO') then
            COSTO = COSTOU;
        ELSE
            BEGIN
            COSTO = COSTOP;
            if (base = 'MAYOR') then
                if (COSTOP < COSTOU) then
                    COSTO = COSTOU;
            END
        SELECT LIPR_MODIF FROM LISTA_PRECIOS WHERE LIPR_COD = :lista INTO :IVAINC;
        if (IVAINC = 'S') then
            COSTO = COSTO * (1 + TARIVA/100);
        if (UOM = 'UTILIDAD') then
            SUGERIDO = COSTO * (1 + :PORC/100);
        ELSE
            SUGERIDO = COSTO / (1 - :PORC/100);
        END
    ELSE
        if (LISTA <> LISTAREF) then
            BEGIN
            SELECT PRAR_FIJO FROM PRECIOS_ARTICULO WHERE ARTI_COD = :articulo AND LIPR_COD = :LISTAREF INTO :SUGERIDO;
            if (IVAINC = 'S') then
                SUGERIDO = SUGERIDO / (1 + TARIVA/100);
            if (UOM = 'UTILIDAD') then
                SUGERIDO = SUGERIDO * (1 + :PORC/100);
            ELSE
                SUGERIDO = SUGERIDO / (1 - :PORC/100);
            END
    EXECUTE PROCEDURE REDONDEE (SUGERIDO, DIG) returning_values (SUGERIDO);
    DIFER = SUGERIDO - FIJO;
    NUEVO = SUGERIDO;
    OK = 'S';
    if ((abs(DIFER) > DIFMAX) and (sugerido <> 0)) then
        suspend;
    end
end
^

SET TERM ; ^

grant EXECUTE on PROCEDURE REVISA_PRECIOS to PUBLIC;

/* 20090205B  NOTAS DEBITO Y CREDITO DE PROVEEDOR CON DISCRIMINACION DE TARIFAS DE IVA */

ALTER TABLE NOTAS_DEBITO_PROVEEDOR
ADD NDPR_BASE1 T_MONTO;
ALTER TABLE NOTAS_DEBITO_PROVEEDOR
ADD NDPR_IVA1 T_MONTO;
ALTER TABLE NOTAS_DEBITO_PROVEEDOR
ADD NDPR_BASE2 T_MONTO;
ALTER TABLE NOTAS_DEBITO_PROVEEDOR
ADD NDPR_IVA2 T_MONTO;
ALTER TABLE NOTAS_DEBITO_PROVEEDOR
ADD NDPR_BASE0 T_MONTO;

ALTER TRIGGER NOTAS_DEBITO_PROVEEDOR_AU INACTIVE;
update notas_debito_proveedor set ndpr_base0 = 0, ndpr_base1 = 0, ndpr_base2 = 0, ndpr_iva1 = 0, ndpr_iva2 = 0;
update notas_debito_proveedor set ndpr_base0 = ndpr_monto where ndpr_ivamonto = 0;
update notas_debito_proveedor set ndpr_base1 = ndpr_monto, ndpr_iva1 = ndpr_ivamonto where ndpr_ivamonto <> 0;
ALTER TRIGGER NOTAS_DEBITO_PROVEEDOR_AU ACTIVE;

SET TERM ^ ;

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

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER PROCEDURE CONTABIL_NOTADBPR(
    IDDOC INTEGER,
    IDINTER INTEGER)
RETURNS (
    ERROR INTEGER,
    VER CHAR(1),
    IDC INTEGER)
AS
declare variable PREF VARCHAR(4);
declare variable NUM VARCHAR(6);
declare variable NUMERO VARCHAR(10);
declare variable FECAUX DATE;
declare variable FECHA CHAR(8);
declare variable CONC CHAR(120);
declare variable VENCEAUX DATE;
declare variable VENCE CHAR(8);
declare variable VRSUBT NUMERIC(18, 2);
declare variable BASE0 NUMERIC(18, 2);
declare variable BASE1 NUMERIC(18, 2);
declare variable BASE2 NUMERIC(18, 2);
declare variable VRIVA NUMERIC(18, 2);
declare variable IVA1 NUMERIC(18, 2);
declare variable IVA2 NUMERIC(18, 2);
declare variable PRTFTE NUMERIC(9, 2);
declare variable VRRTFTE NUMERIC(18, 2);
declare variable PRTIVA NUMERIC(9, 2);
declare variable VRRTIVA NUMERIC(18, 2);
declare variable PRTICA NUMERIC(9, 2);
declare variable VRRTICA NUMERIC(18, 2);
declare variable VRTOTAL NUMERIC(18, 2);
declare variable TIPOCOMP VARCHAR(3);
declare variable PREFCONT VARCHAR(4);
declare variable BASE CHAR(1);
declare variable CTABASE VARCHAR(20);
declare variable IVA CHAR(1);
declare variable CTAIVA VARCHAR(20);
declare variable CLIE CHAR(1);
declare variable CTACLIE VARCHAR(20);
declare variable RTFTE CHAR(1);
declare variable CTARTFTE VARCHAR(20);
declare variable RTIVA CHAR(1);
declare variable CTARTIVA VARCHAR(20);
declare variable RTICA CHAR(1);
declare variable CTARTICA VARCHAR(20);
declare variable EXISTE CHAR(1);
declare variable CUENTA VARCHAR(20);
declare variable MONTO NUMERIC(18,2);
declare variable ES_RETENCION CHAR(1);
declare variable TIPOCUEN CHAR(1);
declare variable NIT VARCHAR(20);
declare variable PROY VARCHAR(4);
declare variable CENTRO VARCHAR(4);
declare variable MONTOBASE NUMERIC(18,2);
declare variable PORC NUMERIC(5,2);
declare variable DEBITO NUMERIC(18,2);
declare variable CREDITO NUMERIC(18,2);
declare variable NROI INTEGER;
declare variable SUMA NUMERIC(18,2);
declare variable TCTACLIEN VARCHAR(20);
declare variable TCTABASE VARCHAR(20);
declare variable TCTARTFTE VARCHAR(20);
declare variable TCTARTIVA VARCHAR(20);
declare variable TCTARTICA VARCHAR(20);
declare variable CUENTAADIC VARCHAR(20);
declare variable BASEADIC VARCHAR(20);
declare variable PORCADIC NUMERIC(5,2);
declare variable VALORADIC NUMERIC(18,2);
declare variable DBADIC CHAR(1);
declare variable NPROY VARCHAR(4);
declare variable NCENTRO VARCHAR(4);
declare variable ANULADO CHAR(1);
declare variable TARIFA INTEGER;
BEGIN
ERROR = 0;
/* BUSQUE LA INTERFACE */
EXISTE = 'N';
SELECT 'S', TICO_COD, PRCO_PRE, INCP_BASE, INCP_IVA, INCP_RTFTE, INCP_RTIVA, INCP_RTICA, INCP_PROV, INCP_CTABASE, INCP_CTAIVA, INCP_CTARTFTE, INCP_CTARTIVA, INCP_CTARTICA, INCP_CTAPROV, INCP_CONFIRMAR
    FROM INTERFAZ_CXPAGAR
    WHERE INCP_ID = :IDINTER
    INTO :EXISTE, :TIPOCOMP, :PREFCONT, :BASE, :IVA, :RTFTE, :RTIVA, :RTICA, :CLIE, :CTABASE, :CTAIVA, :CTARTFTE, :CTARTIVA, :CTARTICA, :CTACLIE, :VER;

if (EXISTE = 'S') then
  BEGIN
  /* BORRE CUALQUEIR CONTABILIZACION PREVIA */
  DELETE FROM CONTABILIZACION WHERE CNTB_TIPOREF = 51 AND CNTB_IDREF = :IDDOC;
  /* TRAIGA EL ENCABEZADO DE LA NOTA */
  SELECT PREF_PRE, NDPR_NUMERO, NDPR_FECHA, NDPR_VENCE, N.TERC_NIT, NDPR_CONC, NDPR_IVAPORC, NDPR_IVAMONTO, NDPR_MONTO, NDPR_RTFTEPORC, NDPR_RTFTEMONTO, NDPR_RTIVAPORC, NDPR_RTIVAMONTO, NDPR_RTICAPORC, NDPR_RTICAMONTO, TERC_CTAVENTA, TERC_CTARTFTE, TERC_CTARTIVA, TERC_CTARTICA, TERC_CTACLIENTE, NDPR_PROY, NDPR_CENTRO, NDPR_ANULADO, NDPR_BASE0, NDPR_BASE1, NDPR_BASE2, NDPR_IVA1, NDPR_IVA2
        FROM NOTAS_DEBITO_PROVEEDOR N, TERCEROS T
        WHERE NDPR_ID = :IDDOC AND N.TERC_NIT = T.TERC_NIT
        INTO :PREF, :NUM, :FECAUX, :VENCEAUX, :NIT, :CONC, :PORC, :VRIVA, :VRTOTAL, :PRTFTE, :VRRTFTE, :PRTIVA, :VRRTIVA, :PRTICA, :VRRTICA, :TCTABASE, TCTARTFTE, TCTARTIVA, TCTARTICA, TCTACLIEN, NPROY, NCENTRO, ANULADO, :BASE0, BASE1, :BASE2, :IVA1, :IVA2;
  if (ANULADO = 'N') then
    BEGIN
    /* SI ES PROVEEDOR, SOBREESCIBE LAS CUENTAS  */
    SELECT PROV_CTAPAGAR, PROV_CTARTFTE, PROV_CTARTIVA, PROV_CTARTICA, PROV_CTACAUSA
        FROM PROVEEDORES WHERE TERC_NIT = :NIT
        INTO TCTACLIEN, TCTARTFTE, TCTARTIVA, TCTARTICA, TCTABASE;
        
    /* SI EL DOCUMENTO ESPECIFICA ALGUNAS SOBRESCRIBA LAS DEL PROVEEDOR */
    SELECT NDPR_CTAPAGAR, NDPR_CTACAUSA
        FROM NOTAS_DEBITO_PROVEEDOR
        WHERE NDPR_ID = :IDDOC
        INTO :TCTACLIEN, TCTABASE;
    SELECT PREF_CENTRO, PREF_PROY FROM PREFIJOS P, NOTAS_DEBITO_PROVEEDOR N
        WHERE P.PREF_PRE = N.PREF_PRE AND P.TIDO_COD = 51 AND N.NDPR_ID = :IDDOC INTO :CENTRO, :PROY;
    if (NPROY <> '') then
        PROY = NPROY;
    if (NCENTRO <> '') then
        CENTRO = NCENTRO;
    NUMERO = PREF || NUM;
    VRSUBT = VRTOTAL; /* BASE DE RETEFTE Y RETEICA */

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

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

    NROI = 0;
    SUMA = 0;

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

        if (VRSUBT <> 0) then
            BEGIN
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO, CUEN_RETENCION FROM CUENTAS
                WHERE CUEN_COD = :CTABASE INTO :CUENTA, :TIPOCUEN, :ES_RETENCION;
            if (CUENTA IS NULL) then
                begin
                INSERT INTO  ERRORES (ERRO_ITEM, ERRO_TIPODOC, ERRO_IDDOC, ERRO_CODIGO, ERRO_CANT, ERRO_CADENA)
                    VALUES(GEN_ID(id_errores, 1), 51, :IDDOC, 'CUENTA NO EXISTE', 0, :CTABASE);
                CUENTA = CTABASE;
                ERROR = ERROR + 1;
                end
            if (ES_RETENCION = 'S') then
                if ((prtiva <> 0) and (vriva = 0)) then
                    montobase = FLOOR(VRSUBT / prtiva);
                else
                    montobase = VRSUBT;
            else
                montobase = 0;
            if (TIPOCUEN = 'I') then
                BEGIN
                INSERT INTO  ERRORES (ERRO_ITEM, ERRO_TIPODOC, ERRO_IDDOC, ERRO_CODIGO, ERRO_CANT, ERRO_CADENA)
                    VALUES(GEN_ID(id_errores, 1), 51, :IDDOC, 'CUENTA DE INVENTARIO', 0, :CUENTA);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRSUBT, 0, :MONTOBASE, :prtiva, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 41);
                NROI = NROI + 1;
                SUMA = SUMA + VRSUBT;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRSUBT, 0, :MONTOBASE, :prtiva, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA + VRSUBT;
                END
            END /* MONTO <> 0 */
        END /* BASE TERCERO O CONSTANTE */
    IF ((BASE = 'I')) THEN
        BEGIN
        FOR SELECT TAIV_CTACOMP, TAIV_COD FROM TARIFA_IVA WHERE TAIV_COD <= 2 INTO :CTABASE, :tarifa
            DO
            BEGIN
            if (TARIFA = 0) then
                vrsubt = BASE0;
            if (TARIFA = 1) then
                vrsubt = BASE1;
            if (TARIFA = 2) then
                vrsubt = BASE2;
            if (VRSUBT <> 0) then
                BEGIN
                CUENTA = NULL;
                SELECT CUEN_COD, CUEN_TIPO, CUEN_RETENCION FROM CUENTAS
                    WHERE CUEN_COD = :CTABASE INTO :CUENTA, :TIPOCUEN, :ES_RETENCION;
                if (CUENTA IS NULL) then
                    begin
                    INSERT INTO  ERRORES (ERRO_ITEM, ERRO_TIPODOC, ERRO_IDDOC, ERRO_CODIGO, ERRO_CANT, ERRO_CADENA)
                        VALUES(GEN_ID(id_errores, 1), 51, :IDDOC, 'CUENTA NO EXISTE', 0, :CTABASE);
                    CUENTA = CTABASE;
                    ERROR = ERROR + 1;
                    end
                montobase = 0;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    INSERT INTO  ERRORES (ERRO_ITEM, ERRO_TIPODOC, ERRO_IDDOC, ERRO_CODIGO, ERRO_CANT, ERRO_CADENA)
                        VALUES(GEN_ID(id_errores, 1), 51, :IDDOC, 'CUENTA DE INVENTARIO', 0, :CUENTA);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRSUBT, 0, :MONTOBASE, :prtiva, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 41);
                    NROI = NROI + 1;
                    SUMA = SUMA + VRSUBT;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRSUBT, 0, :MONTOBASE, :prtiva, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA + VRSUBT;
                    END
                END /* MONTO <> 0 */
            END
        END /* BASE TARIFA DE IVA */
        
    if (IVA = 'I') then /* IVA POR TARIFA */
        BEGIN
        FOR SELECT TAIV_CTAIVACMP, TAIV_COD FROM TARIFA_IVA WHERE (TAIV_COD <> 0) AND (TAIV_COD <= 2) INTO :CTAIVA, :tarifa
            DO
            BEGIN
            if (TARIFA = 1) then
                VRIVA = IVA1;
            if (TARIFA = 2) then
                VRIVA = IVA2;
            if (VRIVA <> 0) then
                BEGIN
                CUENTA = NULL;
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :CTAIVA INTO :CUENTA, :TIPOCUEN;
                if (CUENTA IS NULL) then
                    begin
                    INSERT INTO  ERRORES (ERRO_ITEM, ERRO_TIPODOC, ERRO_IDDOC, ERRO_CODIGO, ERRO_CANT, ERRO_CADENA)
                        VALUES(GEN_ID(id_errores, 1), 51, :IDDOC, 'CUENTA NO EXISTE', 0, :CTAIVA);
                    CUENTA = CTAIVA;
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    INSERT INTO  ERRORES (ERRO_ITEM, ERRO_TIPODOC, ERRO_IDDOC, ERRO_CODIGO, ERRO_CANT, ERRO_CADENA)
                        VALUES(GEN_ID(id_errores, 1), 51, :IDDOC, 'CUENTA DE INVENTARIO', 0, :CUENTA);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', :VRIVA, 0, :vrsubt, :porc, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 41);
                    NROI = NROI + 1;
                    SUMA = SUMA + VRIVA;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', :VRIVA, 0, :vrsubt, :porc, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA + VRIVA;
                    END
                END /* VRIVA <> 0 */
            end /* FOR */
        END /* IVA EN CTA CONSTANTE */
        
    if (IVA = 'K') then /* IVA EN CTA CONSTANTE */
        BEGIN
        if (VRIVA <> 0) then
            BEGIN
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTAIVA INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                INSERT INTO  ERRORES (ERRO_ITEM, ERRO_TIPODOC, ERRO_IDDOC, ERRO_CODIGO, ERRO_CANT, ERRO_CADENA)
                    VALUES(GEN_ID(id_errores, 1), 51, :IDDOC, 'CUENTA NO EXISTE', 0, :CTAIVA);
                CUENTA = CTAIVA;
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                INSERT INTO  ERRORES (ERRO_ITEM, ERRO_TIPODOC, ERRO_IDDOC, ERRO_CODIGO, ERRO_CANT, ERRO_CADENA)
                    VALUES(GEN_ID(id_errores, 1), 51, :IDDOC, 'CUENTA DE INVENTARIO', 0, :CUENTA);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', :VRIVA, 0, :vrsubt, :porc, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 41);
                NROI = NROI + 1;
                SUMA = SUMA + VRIVA;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', :VRIVA, 0, :vrsubt, :porc, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA + VRIVA;
                END
            END /* VRIVA <> 0 */
        END /* IVA EN CTA CONSTANTE */
        
    /* RETENCION FUENTE */
    if ((RTFTE = 'T') or (RTFTE = 'K')) then
      if (VRRTFTE <> 0) then
        BEGIN
        if (RTFTE = 'T') then
            CTARTFTE = TCTARTFTE;
            
        CUENTA = NULL;
        SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
            WHERE CUEN_COD = :CTARTFTE INTO :CUENTA, :TIPOCUEN;
        if (CUENTA IS NULL) then
            begin
            INSERT INTO  ERRORES (ERRO_ITEM, ERRO_TIPODOC, ERRO_IDDOC, ERRO_CODIGO, ERRO_CANT, ERRO_CADENA)
                VALUES(GEN_ID(id_errores, 1), 51, :IDDOC, 'CUENTA NO EXISTE', 0, :CTARTFTE);
            CUENTA = CTARTFTE;
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            INSERT INTO  ERRORES (ERRO_ITEM, ERRO_TIPODOC, ERRO_IDDOC, ERRO_CODIGO, ERRO_CANT, ERRO_CADENA)
                    VALUES(GEN_ID(id_errores, 1), 51, :IDDOC, 'CUENTA DE INVENTARIO', 0, :CUENTA);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, :VRSUBT, :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 41);
            NROI = NROI + 1;
            SUMA = SUMA - VRRTFTE;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, :VRSUBT, :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA - VRRTFTE;
            END
        END /* RTFTE */
        
    /* RETENCION IVA */
    if ((RTIVA = 'T') or (RTIVA = 'K')) then
      if (VRRTIVA <> 0) then
        BEGIN
        if (RTIVA = 'T') then
            CTARTIVA = TCTARTIVA;
            
        CUENTA = NULL;
        SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
            WHERE CUEN_COD = :CTARTIVA INTO :CUENTA, :TIPOCUEN;
        if (CUENTA IS NULL) then
            begin
            INSERT INTO  ERRORES (ERRO_ITEM, ERRO_TIPODOC, ERRO_IDDOC, ERRO_CODIGO, ERRO_CANT, ERRO_CADENA)
                VALUES(GEN_ID(id_errores, 1), 51, :IDDOC, 'CUENTA NO EXISTE', 0, :CTARTIVA);
            CUENTA = CTARTIVA;
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            INSERT INTO  ERRORES (ERRO_ITEM, ERRO_TIPODOC, ERRO_IDDOC, ERRO_CODIGO, ERRO_CANT, ERRO_CADENA)
                VALUES(GEN_ID(id_errores, 1), 51, :IDDOC, 'CUENTA DE INVENTARIO', 0, :CUENTA);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTIVA, :VRIVA, :prtiva, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 41);
            NROI = NROI + 1;
            SUMA = SUMA - VRRTIVA;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTIVA, :VRIVA, :prtiva, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA - VRRTIVA;
            END
        END /* RTIVA */
        
    /* RETENCION DE ICA */
    if ((RTICA = 'T') or (RTICA = 'K')) then
      if (VRRTICA <> 0) then
        BEGIN
        if (RTICA = 'T') then
            CTARTICA = TCTARTICA;
            
        CUENTA = NULL;
        SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
            WHERE CUEN_COD = :CTARTICA INTO :CUENTA, :TIPOCUEN;
        if (CUENTA IS NULL) then
            begin
            INSERT INTO  ERRORES (ERRO_ITEM, ERRO_TIPODOC, ERRO_IDDOC, ERRO_CODIGO, ERRO_CANT, ERRO_CADENA)
                    VALUES(GEN_ID(id_errores, 1), 51, :IDDOC, 'CUENTA NO EXISTE', 0, :CTARTICA);
            CUENTA = CTARTICA;
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            INSERT INTO  ERRORES (ERRO_ITEM, ERRO_TIPODOC, ERRO_IDDOC, ERRO_CODIGO, ERRO_CANT, ERRO_CADENA)
                VALUES(GEN_ID(id_errores, 1), 51, :IDDOC, 'CUENTA DE INVENTARIO', 0, :CUENTA);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTICA, :VRSUBT, :PRTICA, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 41);
            NROI = NROI + 1;
            SUMA = SUMA - VRRTICA;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTICA, :VRSUBT, :PRTICA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA - VRRTICA;
            END
        END /* RTICA */
        
    /* recorra las cuentas adicionales */
    FOR SELECT INPC_CUENTA, INPC_BASE, INPC_PORC, INPC_VALOR, INPC_DB
        FROM INTERFAZ_CXPAGAR_CTAS
        WHERE INCP_ID = :IDINTER
        INTO :CUENTAADIC, :BASEADIC, :PORCADIC, :VALORADIC, :DBADIC
        DO
        BEGIN
        if (:BASEADIC = 'SUBTOTAL') then
            VALORADIC = VRTOTAL - VRIVA;
        if (:BASEADIC = 'IVA') then
            VALORADIC = VRIVA;
        if (:BASEADIC = 'TOTAL') then
            VALORADIC = VRTOTAL;
        MONTO = VALORADIC * PORCADIC;
        
        /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
        CUENTA = NULL;
        SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
            WHERE CUEN_COD = :CUENTAADIC INTO :CUENTA, :TIPOCUEN;
        IF (CUENTA IS NULL) THEN
            begin
            INSERT INTO  ERRORES (ERRO_ITEM, ERRO_TIPODOC, ERRO_IDDOC, ERRO_CODIGO, ERRO_CANT, ERRO_CADENA)
                    VALUES(GEN_ID(id_errores, 1), 51, :IDDOC, 'CUENTA NO EXISTE', 0, :CUENTAADIC);
            CUENTA = CUENTAADIC;
            ERROR = ERROR + 1;
            end
        /* DEPENDE DEL TIPO DE CUENTA */
        if (TIPOCUEN = 'I') then
            BEGIN
            INSERT INTO  ERRORES (ERRO_ITEM, ERRO_TIPODOC, ERRO_IDDOC, ERRO_CODIGO, ERRO_CANT, ERRO_CADENA)
                VALUES(GEN_ID(id_errores, 1), 51, :IDDOC, 'CUENTA DE INVENTARIO', 0, :CUENTA);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            if (DBADIC = 'S') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTAADIC, :CONC, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 31);
                SUMA = SUMA + MONTO;
                END
            ELSE
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTAADIC, :CONC, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 31);
                SUMA = SUMA - MONTO;
                END
            NROI = NROI + 1;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            if (DBADIC = 'S') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTAADIC, :CONC, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                SUMA = SUMA + MONTO;
                END
            ELSE
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTAADIC, :CONC, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                SUMA = SUMA - MONTO;
                END
            NROI = NROI + 1;
            END
        
        NROI = NROI + 1;
        END
        
    /* CIERRE EL COMPROBANTE CONTRA LA CUENTA DEL TERCERO O LA CONSTANTE */
    if ((SUMA <> 0) and ((CLIE = 'T') or (CLIE = 'K'))) then
        BEGIN
        if (SUMA < 0) then
            BEGIN
            DEBITO = SUMA * -1;
            CREDITO = 0;
            END
        ELSE
            BEGIN
            DEBITO = 0;
            CREDITO = SUMA;
            END
        if (CLIE = 'T') then
            CTACLIE = TCTACLIEN;

        CUENTA = NULL;
        SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
            WHERE CUEN_COD = :CTACLIE INTO :CUENTA, :TIPOCUEN;
        IF (CUENTA IS NULL) then
            begin
            INSERT INTO  ERRORES (ERRO_ITEM, ERRO_TIPODOC, ERRO_IDDOC, ERRO_CODIGO, ERRO_CANT, ERRO_CADENA)
                VALUES(GEN_ID(id_errores, 1), 51, :IDDOC, 'CUENTA NO EXISTE', 0, :CTACLIE);
            CUENTA = CTACLIE;
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            INSERT INTO  ERRORES (ERRO_ITEM, ERRO_TIPODOC, ERRO_IDDOC, ERRO_CODIGO, ERRO_CANT, ERRO_CADENA)
                VALUES(GEN_ID(id_errores, 1), 51, :IDDOC, 'CUENTA DE INVENTARIO', 0, :CUENTA);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :DEBITO, :CREDITO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 41);
        if (TIPOCUEN = 'N') then
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :DEBITO, :CREDITO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
        NROI = NROI + 1;
        END /* SUMA EN CARTERA */
    if (ERROR > 0) then
        VER = 'S';
    SUSPEND;
    END /* ANULADO */
  END /* EXISTE LA INTERFAZ */
ELSE
    BEGIN
    INSERT INTO  ERRORES (ERRO_ITEM, ERRO_TIPODOC, ERRO_IDDOC, ERRO_CODIGO, ERRO_CANT, ERRO_CADENA)
        VALUES(GEN_ID(id_errores, 1), 51, :IDDOC, 'INTERFAZ NO EXISTE', 0, :pref);
    ERROR = ERROR + 1;
    VER = 'S';
    SUSPEND;
    END
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE NOTADBPR_SIN_CONTABILIDAD(
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    ID INTEGER,
    IDI INTEGER,
    IDC INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    ESTADO VARCHAR(20),
    ERROR INTEGER)
AS
DECLARE VARIABLE VER CHAR(2);
declare variable FECICNT VARCHAR(10);
declare variable FECFCNT VARCHAR(10);
declare variable idref INTEGER;
BEGIN /*$$IBE$$ 
EXECUTE PROCEDURE fecha_a_conta(FECINI) returning_values (FECICNT);
EXECUTE PROCEDURE fecha_a_conta(FECFIN) returning_values (FECFCNT);
FOR SELECT NDPR_ID, PREF_PRE, NDPR_NUMERO FROM NOTAS_DEBITO_PROVEEDOR WHERE NDPR_ANULADO = 'N' AND
    NDPR_FECHA >= :FECINI AND NDPR_FECHA <= :FECFIN
    ORDER BY NDPR_ID INTO :ID, :PREF, :NUMERO
DO
  BEGIN
  idref = null;
  SELECT ENCO_IDREF FROM COMPROBANTE_ENCABEZADO WHERE ENCO_TIPOREF = 51 AND ENCO_FECHA >= :FECICNT AND ENCO_FECHA <= :FECFCNT and ENCO_IDREF = :id into :idref;
  if (idref IS NULL) then
  begin
  ESTADO = 'PROCESANDO';
  SUSPEND;
  SELECT MAX(INCA_ID) FROM INTERFAZ_CARTERA WHERE PREF_PRE = :PREF AND TIDO_COD = 51 INTO :IDI;
  if (IDI IS NOT NULL) then
    BEGIN
    EXECUTE PROCEDURE CONTABIL_NOTADBPR (:ID, :IDI) RETURNING_VALUES (:ERROR, :VER, :IDC);
    if (ERROR = 0) then
      BEGIN
      EXECUTE PROCEDURE CONTABILIZA_PENDIENTE (:IDC);
      ESTADO = 'OK';
      END
    ELSE
      ESTADO = 'ERROR';
    suspend;
    END
  end
  END
 $$IBE$$*/ SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE NOTADBPR_SIN_CONTABILIDAD(
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    ID INTEGER,
    IDI INTEGER,
    IDC INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    ESTADO VARCHAR(20),
    ERROR INTEGER)
AS
DECLARE VARIABLE VER CHAR(2);
declare variable FECICNT VARCHAR(10);
declare variable FECFCNT VARCHAR(10);
declare variable idref INTEGER;
BEGIN
EXECUTE PROCEDURE fecha_a_conta(FECINI) returning_values (FECICNT);
EXECUTE PROCEDURE fecha_a_conta(FECFIN) returning_values (FECFCNT);
FOR SELECT NDPR_ID, PREF_PRE, NDPR_NUMERO FROM NOTAS_DEBITO_PROVEEDOR WHERE NDPR_ANULADO = 'N' AND
    NDPR_FECHA >= :FECINI AND NDPR_FECHA <= :FECFIN
    ORDER BY NDPR_ID INTO :ID, :PREF, :NUMERO
DO
  BEGIN
  idref = null;
  SELECT ENCO_IDREF FROM COMPROBANTE_ENCABEZADO WHERE ENCO_TIPOREF = 51 AND ENCO_FECHA >= :FECICNT AND ENCO_FECHA <= :FECFCNT and ENCO_IDREF = :id into :idref;
  if (idref IS NULL) then
  begin
  ESTADO = 'PROCESANDO';
  SUSPEND;
  SELECT MAX(INCA_ID) FROM INTERFAZ_CARTERA WHERE PREF_PRE = :PREF AND TIDO_COD = 51 INTO :IDI;
  if (IDI IS NOT NULL) then
    BEGIN
    EXECUTE PROCEDURE CONTABIL_NOTADBPR (:ID, :IDI) RETURNING_VALUES (:ERROR, :VER, :IDC);
    if (ERROR = 0) then
      BEGIN
      EXECUTE PROCEDURE CONTABILIZA_PENDIENTE (:IDC);
      ESTADO = 'OK';
      END
    ELSE
      ESTADO = 'ERROR';
    suspend;
    END
  end
  END
END

^

SET TERM ; ^

ALTER TABLE NOTAS_CREDITO_PROVEEDOR
ADD NCPR_BASE0 T_MONTO;
ALTER TABLE NOTAS_CREDITO_PROVEEDOR
ADD NCPR_BASE1 T_MONTO;
ALTER TABLE NOTAS_CREDITO_PROVEEDOR
ADD NCPR_BASE2 T_MONTO;
ALTER TABLE NOTAS_CREDITO_PROVEEDOR
ADD NCPR_IVA1 T_MONTO;
ALTER TABLE NOTAS_CREDITO_PROVEEDOR
ADD NCPR_IVA2 T_MONTO;

ALTER TRIGGER notas_credito_proveedor_au INACTIVE;
update notas_credito_proveedor set ncpr_base0 = 0, ncpr_base1 = 0, ncpr_base2 = 0, ncpr_iva1 = 0, ncpr_iva2 = 0;
update notas_credito_proveedor set ncpr_base0 = ncpr_monto where ncpr_ivamonto = 0;
update notas_credito_proveedor set ncpr_base1 = ncpr_monto, ncpr_iva1 = ncpr_ivamonto where ncpr_ivamonto <> 0;
ALTER TRIGGER notas_credito_proveedor_au ACTIVE;

SET TERM ^ ;

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

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER PROCEDURE CONTABIL_NOTACRPR(
    IDDOC INTEGER,
    IDINTER INTEGER)
RETURNS (
    ERROR INTEGER,
    VER CHAR(1),
    IDC INTEGER)
AS
declare variable PREF VARCHAR(4);
declare variable NUM VARCHAR(6);
declare variable NUMERO VARCHAR(10);
declare variable FECAUX DATE;
declare variable FECHA CHAR(8);
declare variable CONC CHAR(120);
declare variable VRSUBT NUMERIC(18, 2);
declare variable BASE0 NUMERIC(18, 2);
declare variable BASE1 NUMERIC(18, 2);
declare variable BASE2 NUMERIC(18, 2);
declare variable VRIVA NUMERIC(18, 2);
declare variable IVA1 NUMERIC(18, 2);
declare variable IVA2 NUMERIC(18, 2);
declare variable PRTFTE NUMERIC(9, 2);
declare variable VRRTFTE NUMERIC(18, 2);
declare variable VRRTIVA NUMERIC(18, 2);
declare variable PRTICA NUMERIC(9, 2);
declare variable VRRTICA NUMERIC(18, 2);
declare variable VRTOTAL NUMERIC(18, 2);
declare variable TIPOCOMP VARCHAR(3);
declare variable PREFCONT VARCHAR(4);
declare variable BASE CHAR(1);
declare variable CTABASE VARCHAR(20);
declare variable IVA CHAR(1);
declare variable CTAIVA VARCHAR(20);
declare variable CLIE CHAR(1);
declare variable CTACLIE VARCHAR(20);
declare variable RTFTE CHAR(1);
declare variable CTARTFTE VARCHAR(20);
declare variable RTIVA CHAR(1);
declare variable CTARTIVA VARCHAR(20);
declare variable RTICA CHAR(1);
declare variable CTARTICA VARCHAR(20);
declare variable EXISTE CHAR(1);
declare variable CUENTA VARCHAR(20);
declare variable MONTO NUMERIC(18,2);
declare variable ES_RETENCION CHAR(1);
declare variable TIPOCUEN CHAR(1);
declare variable NIT VARCHAR(20);
declare variable NOMBRE VARCHAR(60);
declare variable PROY VARCHAR(4);
declare variable CENTRO VARCHAR(4);
declare variable PORC NUMERIC(5,2);
declare variable DEBITO NUMERIC(18,2);
declare variable CREDITO NUMERIC(18,2);
declare variable NROI INTEGER;
declare variable SUMA NUMERIC(18,2);
declare variable TCTACLIEN VARCHAR(20);
declare variable TCTABASE VARCHAR(20);
declare variable TCTARTFTE VARCHAR(20);
declare variable TCTARTIVA VARCHAR(20);
declare variable TCTARTICA VARCHAR(20);
declare variable BASEADIC VARCHAR(20);
declare variable PORCADIC NUMERIC(5,2);
declare variable VALORADIC NUMERIC(18,2);
declare variable DBADIC CHAR(1);
declare variable CUENTAADIC VARCHAR(20);
declare variable ANULADO CHAR(1);
declare variable MONTOBASE NUMERIC(18,2);
declare variable TARIFA INTEGER;
BEGIN
ERROR = 0;
/* BUSQUE LA INTERFACE */
EXISTE = 'N';
SELECT 'S', TICO_COD, PRCO_PRE, INCP_BASE, INCP_IVA, INCP_RTFTE, INCP_RTIVA, INCP_RTICA, INCP_PROV, INCP_CTABASE, INCP_CTAIVA, INCP_CTARTFTE, INCP_CTARTIVA, INCP_CTARTICA, INCP_CTAPROV, INCP_CONFIRMAR
  FROM INTERFAZ_CXPAGAR
  WHERE INCP_ID = :IDINTER
  INTO :EXISTE, :TIPOCOMP, :PREFCONT, :BASE, :IVA, :RTFTE, :RTIVA, :RTICA, :CLIE, :CTABASE, :CTAIVA, :CTARTFTE, :CTARTIVA, :CTARTICA, :CTACLIE, :VER;

if (EXISTE = 'S') then
  BEGIN
  /* BORRE CUALQUEIR CONTABILIZACION PREVIA */
  DELETE FROM CONTABILIZACION WHERE CNTB_TIPOREF = 52 AND CNTB_IDREF = :IDDOC;
  /* TRAIGA EL ENCABEZADO DE LA NOTA */
  SELECT PREF_PRE, NCPR_NUMERO, NCPR_FECHA, N.TERC_NIT, NCPR_CONC, NCPR_IVAMONTO, NCPR_MONTO, NCPR_RTFTEPORC, NCPR_RTFTEMONTO, NCPR_RTIVAPORC, NCPR_RTIVAMONTO, NCPR_RTICAPORC, NCPR_RTICAMONTO, TERC_NOM, TERC_CTAVENTA, TERC_CTARTFTE, TERC_CTARTIVA, TERC_CTARTICA, TERC_CTACLIENTE, NCPR_ANULADO, NCPR_BASE0, NCPR_BASE1, NCPR_BASE2, NCPR_IVA1, NCPR_IVA2
    FROM NOTAS_CREDITO_PROVEEDOR N, TERCEROS T
    WHERE NCPR_ID = :IDDOC AND N.TERC_NIT = T.TERC_NIT
    INTO :PREF, :NUM, :FECAUX, :NIT, :CONC, :VRIVA, :VRTOTAL, :PRTFTE, :VRRTFTE, :PORC, :VRRTIVA, :PRTICA, :VRRTICA, :NOMBRE, TCTABASE, TCTARTFTE, TCTARTIVA, TCTARTICA, TCTACLIEN, ANULADO, :BASE0, BASE1, :BASE2, :IVA1, :IVA2;
  if (ANULADO = 'N') then
    BEGIN
    SELECT PREF_CENTRO, PREF_PROY FROM PREFIJOS P, NOTAS_CREDITO_PROVEEDOR N
        WHERE P.PREF_PRE = N.PREF_PRE AND P.TIDO_COD = 52 AND NCPR_ID = :IDDOC INTO :CENTRO, :PROY;
    /* SI ES PROVEEDOR, SOBREESCIBE LAS CUENTAS  */
    SELECT PROV_CTAPAGAR, PROV_CTARTFTE, PROV_CTARTIVA, PROV_CTARTICA, PROV_CTACAUSA
        FROM PROVEEDORES WHERE TERC_NIT = :NIT
        INTO TCTACLIEN, TCTARTFTE, TCTARTIVA, TCTARTICA, TCTABASE;
        
    /* SI EL DOCUMENTO ESPECIFICA ALGUNAS SOBRESCRIBA LAS DEL PROVEEDOR */
    SELECT NCPR_CTAPAGAR, NCPR_CTACAUSA
        FROM NOTAS_CREDITO_PROVEEDOR N
        WHERE NCPR_ID = :IDDOC
        INTO :TCTACLIEN, TCTABASE;
    NUMERO = PREF || NUM;
    VRSUBT = VRTOTAL; /* BASE DE RETEFTE Y RETEICA */

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

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

    NROI = 0;
    SUMA = 0;

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

        if (VRSUBT <> 0) then
            BEGIN
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO, CUEN_RETENCION FROM CUENTAS
                WHERE CUEN_COD = :CTABASE INTO :CUENTA, :TIPOCUEN, :ES_RETENCION;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERROR (52, :IDDOC, :CTABASE, 2);
                CUENTA = CTABASE;
                ERROR = ERROR + 1;
                end
            if (ES_RETENCION = 'S') then
                if (PORC <> 0) then
                    montobase = FLOOR(VRSUBT / PORC * -1);
                else
                    montobase = VRSUBT * -1;
            else
                montobase = 0;
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERROR (52, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRSUBT, :MONTOBASE, :PORC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 52);
                NROI = NROI + 1;
                SUMA = SUMA - VRSUBT;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRSUBT, :MONTOBASE, :PORC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - VRSUBT;
                END
            END /* MONTO <> 0 */
        END /* BASE TERCERO O CONSTANTE */
    IF ((BASE = 'I')) THEN
        BEGIN
        FOR SELECT TAIV_CTACOMP, TAIV_COD FROM TARIFA_IVA WHERE TAIV_COD <= 2 INTO :CTABASE, :tarifa
            DO
            BEGIN
            if (TARIFA = 0) then
                vrsubt = BASE0;
            if (TARIFA = 1) then
                vrsubt = BASE1;
            if (TARIFA = 2) then
                vrsubt = BASE2;
            if (VRSUBT <> 0) then
                BEGIN
                CUENTA = NULL;
                SELECT CUEN_COD, CUEN_TIPO, CUEN_RETENCION FROM CUENTAS
                    WHERE CUEN_COD = :CTABASE INTO :CUENTA, :TIPOCUEN, :ES_RETENCION;
                if (CUENTA IS NULL) then
                    begin
                    EXECUTE PROCEDURE ERROR (52, :IDDOC, :CTABASE, 2);
                    CUENTA = CTABASE;
                    ERROR = ERROR + 1;
                    end
                montobase = 0;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (52, :IDDOC, :CUENTA, 3);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRSUBT, :MONTOBASE, :PORC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 52);
                    NROI = NROI + 1;
                    SUMA = SUMA - VRSUBT;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRSUBT, :MONTOBASE, :PORC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA - VRSUBT;
                    END
                END /* MONTO <> 0 */
            END /* FOR */
        END /* BASE TARIFA IVA */
        
    if (IVA = 'I') then /* IVA X TARIFA */
        BEGIN
        FOR SELECT TAIV_CTAIVACMP, TAIV_COD FROM TARIFA_IVA WHERE (TAIV_COD <> 0) AND (TAIV_COD <= 2) INTO :CTAIVA, :tarifa
            DO
            BEGIN
            if (TARIFA = 1) then
                VRIVA = IVA1;
            if (TARIFA = 2) then
                VRIVA = IVA2;
            if (VRIVA <> 0) then
                BEGIN
                CUENTA = NULL;
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :CTAIVA INTO :CUENTA, :TIPOCUEN;
                if (CUENTA IS NULL) then
                    begin
                    EXECUTE PROCEDURE ERROR (52, :IDDOC, :CTAIVA, 2);
                    CUENTA = CTAIVA;
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (52, :IDDOC, :CUENTA, 3);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', 0, :VRIVA, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 52);
                    NROI = NROI + 1;
                    SUMA = SUMA - VRIVA;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', 0, :VRIVA, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA - VRIVA;
                    END
                END /* VRIVA <> 0 */
            END /* FOR */
        END /* IVA EN CTA CONSTANTE */
        
    if (IVA = 'K') then /* IVA EN CTA CONSTANTE */
        BEGIN
        if (VRIVA <> 0) then
            BEGIN
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTAIVA INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERROR (52, :IDDOC, :CTAIVA, 2);
                CUENTA = CTAIVA;
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERROR (52, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', 0, :VRIVA, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 52);
                NROI = NROI + 1;
                SUMA = SUMA - VRIVA;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', 0, :VRIVA, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - VRIVA;
                END
            END /* VRIVA <> 0 */
        END /* IVA EN CTA CONSTANTE */
        
    /* RETENCION FUENTE */
    if ((RTFTE = 'T') or (RTFTE = 'K')) then
      if (VRRTFTE <> 0) then
        BEGIN
        if (RTFTE = 'T') then
            CTARTFTE = TCTARTFTE;
            
        CUENTA = NULL;
        SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
            WHERE CUEN_COD = :CTARTFTE INTO :CUENTA, :TIPOCUEN;
        if (CUENTA IS NULL) then
            begin
            EXECUTE PROCEDURE ERROR (52, :IDDOC, :CTARTFTE, 2);
            CUENTA = CTARTFTE;
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERROR (52, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :VRSUBT, :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 52);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTFTE;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :VRSUBT, :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTFTE;
            END
        END /* RTFTE */
        
    /* RETENCION IVA */
    if ((RTIVA = 'T') or (RTIVA = 'K')) then
      if (VRRTIVA <> 0) then
        BEGIN
        if (RTIVA = 'T') then
            CTARTIVA = TCTARTIVA;
            
        CUENTA = NULL;
        SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
            WHERE CUEN_COD = :CTARTIVA INTO :CUENTA, :TIPOCUEN;
        if (CUENTA IS NULL) then
            begin
            EXECUTE PROCEDURE ERROR (52, :IDDOC, :CTARTIVA, 2);
            CUENTA = CTARTIVA;
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERROR (52, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTIVA, 0, :VRIVA, :PORC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 52);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTIVA;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTIVA, 0, :VRIVA, :PORC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTIVA;
            END
        END /* RTIVA */
        
    /* RETENCION DE ICA */
    if ((RTICA = 'T') or (RTICA = 'K')) then
      if (VRRTICA <> 0) then
        BEGIN
        if (RTICA = 'T') then
            CTARTICA = TCTARTICA;
            
        CUENTA = NULL;
        SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
            WHERE CUEN_COD = :CTARTICA INTO :CUENTA, :TIPOCUEN;
        if (CUENTA IS NULL) then
            begin
            EXECUTE PROCEDURE ERROR (52, :IDDOC, :CTARTICA, 2);
            CUENTA = CTARTICA;
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERROR (52, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTICA, 0, :VRSUBT, :PRTICA, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 52);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTICA;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTICA, 0, :VRSUBT, :PRTICA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTICA;
            END
        END /* RTICA */
        
    /* recorra las cuentas adicionales */
    FOR SELECT INPC_CUENTA, INPC_BASE, INPC_PORC, INPC_VALOR, INPC_DB
        FROM INTERFAZ_CXPAGAR_CTAS
        WHERE INCP_ID = :IDINTER
        INTO :CUENTAADIC, :BASEADIC, :PORCADIC, :VALORADIC, :DBADIC
        DO
        BEGIN
        if (:BASEADIC = 'SUBTOTAL') then
            VALORADIC = VRTOTAL - VRIVA;
        if (:BASEADIC = 'IVA') then
            VALORADIC = VRIVA;
        if (:BASEADIC = 'TOTAL') then
            VALORADIC = VRTOTAL;
        MONTO = VALORADIC * PORCADIC;
        
        /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
        CUENTA = NULL;
        SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
            WHERE CUEN_COD = :CUENTAADIC INTO :CUENTA, :TIPOCUEN;
        IF (CUENTA IS NULL) THEN
            begin
            EXECUTE PROCEDURE ERROR (52, :IDDOC, :CUENTAADIC, 2);
            CUENTA = CUENTAADIC;
            ERROR = ERROR + 1;
            end
        /* DEPENDE DEL TIPO DE CUENTA */
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERROR (52, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            if (DBADIC = 'S') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTAADIC, :CONC, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 31);
                SUMA = SUMA + MONTO;
                END
            ELSE
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTAADIC, :CONC, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 31);
                SUMA = SUMA - MONTO;
                END
            NROI = NROI + 1;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            if (DBADIC = 'S') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTAADIC, :CONC, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                SUMA = SUMA + MONTO;
                END
            ELSE
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTAADIC, :CONC, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                SUMA = SUMA - MONTO;
                END
            NROI = NROI + 1;
            END
        
        NROI = NROI + 1;
        END
        
    /* CIERRE EL COMPROBANTE CONTRA LA CUENTA DEL TERCERO O LA CONSTANTE */
    if ((SUMA <> 0) and ((CLIE = 'T') or (CLIE = 'K'))) then
        BEGIN
        if (SUMA < 0) then
            BEGIN
            DEBITO = SUMA * -1;
            CREDITO = 0;
            END
        ELSE
            BEGIN
            DEBITO = 0;
            CREDITO = SUMA;
            END
        if (CLIE = 'T') then
            CTACLIE = TCTACLIEN;

        CUENTA = NULL;
        SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
            WHERE CUEN_COD = :CTACLIE INTO :CUENTA, :TIPOCUEN;
        IF (CUENTA IS NULL) then
            begin
            EXECUTE PROCEDURE ERROR (52, :IDDOC, :CTACLIE, 2);
            CUENTA = CTACLIE;
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERROR (52, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :DEBITO, :CREDITO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 52);
        if (TIPOCUEN = 'N') then
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :DEBITO, :CREDITO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
        NROI = NROI + 1;
        END /* SUMA EN CARTERA */
    if (ERROR > 0) then
        VER = 'S';
    SUSPEND;
    END /* NO ANULADO */
  END /* EXISTE LA INTERFAZ */
ELSE
    BEGIN
    EXECUTE PROCEDURE ERROR (52, :IDDOC, :PREF, 1);
    ERROR = ERROR + 1;
    VER = 'S';
    SUSPEND;
    END
END
^

SET TERM ; ^

                SET TERM ^ ;

ALTER PROCEDURE NOTACRPR_SIN_CONTABILIDAD(
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    ID INTEGER,
    IDI INTEGER,
    IDC INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    ESTADO VARCHAR(20),
    ERROR INTEGER)
AS
DECLARE VARIABLE VER CHAR(2);
declare variable FECICNT VARCHAR(10);
declare variable FECFCNT VARCHAR(10);
declare variable idref INTEGER;
BEGIN /*$$IBE$$ 
EXECUTE PROCEDURE fecha_a_conta(FECINI) returning_values (FECICNT);
EXECUTE PROCEDURE fecha_a_conta(FECFIN) returning_values (FECFCNT);
FOR SELECT NCPR_ID, PREF_PRE, NCPR_NUMERO FROM NOTAS_CREDITO_PROVEEDOR WHERE NCPR_ANULADO = 'N' AND
    NCPR_FECHA >= :FECINI AND NCPR_FECHA <= :FECFIN
    ORDER BY NCPR_ID INTO :ID, :PREF, :NUMERO
DO
  BEGIN
  idref = null;
  SELECT ENCO_IDREF FROM COMPROBANTE_ENCABEZADO WHERE ENCO_TIPOREF = 52 AND ENCO_FECHA >= :FECICNT AND ENCO_FECHA <= :FECFCNT and ENCO_IDREF = :id into :idref;
  if (idref IS NULL) then
  begin
  ESTADO = 'PROCESANDO';
  SUSPEND;
  SELECT MAX(INCA_ID) FROM INTERFAZ_CARTERA WHERE PREF_PRE = :PREF AND TIDO_COD = 52 INTO :IDI;
  if (IDI IS NOT NULL) then
    BEGIN
    EXECUTE PROCEDURE CONTABIL_NOTACRPR (:ID, :IDI) RETURNING_VALUES (:ERROR, :VER, :IDC);
    if (ERROR = 0) then
      BEGIN
      EXECUTE PROCEDURE CONTABILIZA_PENDIENTE (:IDC);
      ESTADO = 'OK';
      END
    ELSE
      ESTADO = 'ERROR';
    suspend;
    END
  end
  END
 $$IBE$$*/ SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE NOTACRPR_SIN_CONTABILIDAD(
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    ID INTEGER,
    IDI INTEGER,
    IDC INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    ESTADO VARCHAR(20),
    ERROR INTEGER)
AS
DECLARE VARIABLE VER CHAR(2);
declare variable FECICNT VARCHAR(10);
declare variable FECFCNT VARCHAR(10);
declare variable idref INTEGER;
BEGIN
EXECUTE PROCEDURE fecha_a_conta(FECINI) returning_values (FECICNT);
EXECUTE PROCEDURE fecha_a_conta(FECFIN) returning_values (FECFCNT);
FOR SELECT NCPR_ID, PREF_PRE, NCPR_NUMERO FROM NOTAS_CREDITO_PROVEEDOR WHERE NCPR_ANULADO = 'N' AND
    NCPR_FECHA >= :FECINI AND NCPR_FECHA <= :FECFIN
    ORDER BY NCPR_ID INTO :ID, :PREF, :NUMERO
DO
  BEGIN
  idref = null;
  SELECT ENCO_IDREF FROM COMPROBANTE_ENCABEZADO WHERE ENCO_TIPOREF = 52 AND ENCO_FECHA >= :FECICNT AND ENCO_FECHA <= :FECFCNT and ENCO_IDREF = :id into :idref;
  if (idref IS NULL) then
  begin
  ESTADO = 'PROCESANDO';
  SUSPEND;
  SELECT MAX(INCA_ID) FROM INTERFAZ_CARTERA WHERE PREF_PRE = :PREF AND TIDO_COD = 52 INTO :IDI;
  if (IDI IS NOT NULL) then
    BEGIN
    EXECUTE PROCEDURE CONTABIL_NOTACRPR (:ID, :IDI) RETURNING_VALUES (:ERROR, :VER, :IDC);
    if (ERROR = 0) then
      BEGIN
      EXECUTE PROCEDURE CONTABILIZA_PENDIENTE (:IDC);
      ESTADO = 'OK';
      END
    ELSE
      ESTADO = 'ERROR';
    suspend;
    END
  end
  END
END

^

SET TERM ; ^


INSERT INTO IMPORTACION_INVENTARIO (IMIN_TIPO, IMIN_DATO, IMIN_COLUMNA, IMIN_ANCHO) VALUES (16, 'EXENTOS', 13, 8);
INSERT INTO IMPORTACION_INVENTARIO (IMIN_TIPO, IMIN_DATO, IMIN_COLUMNA, IMIN_ANCHO) VALUES (16, 'GRAVADOS1', 14, 8);
INSERT INTO IMPORTACION_INVENTARIO (IMIN_TIPO, IMIN_DATO, IMIN_COLUMNA, IMIN_ANCHO) VALUES (16, 'GRAVADOS2', 15, 8);
INSERT INTO IMPORTACION_INVENTARIO (IMIN_TIPO, IMIN_DATO, IMIN_COLUMNA, IMIN_ANCHO) VALUES (16, 'IVA1', 16, 8);
INSERT INTO IMPORTACION_INVENTARIO (IMIN_TIPO, IMIN_DATO, IMIN_COLUMNA, IMIN_ANCHO) VALUES (16, 'IVA2', 17, 8);


INSERT INTO NOMBRES_CAMPOS (NOMBRE, DESCRIPCION) VALUES ('EXENTOS', 'Base exenta de IVA');
INSERT INTO NOMBRES_CAMPOS (NOMBRE, DESCRIPCION) VALUES ('GRAVADOS1', 'Base gravada a la tarifa general del IVA');
INSERT INTO NOMBRES_CAMPOS (NOMBRE, DESCRIPCION) VALUES ('GRAVADOS2', 'Base gravada a la tarifa de IVA 2');
INSERT INTO NOMBRES_CAMPOS (NOMBRE, DESCRIPCION) VALUES ('IVA1', 'Monto del IVA a la tarifa general');
INSERT INTO NOMBRES_CAMPOS (NOMBRE, DESCRIPCION) VALUES ('IVA2', 'Monto del IVA de otras tarifas');
COMMIT WORK;

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(6),
    FECHA DATE,
    NIT VARCHAR(20),
    NUMPROV VARCHAR(10),
    NOMTERCERO VARCHAR(60),
    SUBTOTAL NUMERIC(18,2),
    DTOMONTO NUMERIC(18,2),
    ADICIONAL NUMERIC(18,2),
    IVAMONTO NUMERIC(18,2),
    CONSUMO NUMERIC(18,2),
    EXENTOS NUMERIC(18,2),
    IVA1 NUMERIC(18,2),
    IVA2 NUMERIC(18,2),
    IVA3 NUMERIC(18,2),
    GRAVADOS1 NUMERIC(18,2),
    GRAVADOS2 NUMERIC(18,2),
    GRAVADOS3 NUMERIC(18,2),
    EXTRA NUMERIC(18,2),
    TOTAL NUMERIC(18,2),
    RTFTEMONTO NUMERIC(18,2),
    RTIVAMONTO NUMERIC(18,2),
    RTICAMONTO 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);
BEGIN
/* FACTURA */
TIPO = 21;
SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 21 INTO :NOMTIPO;

FOR SELECT FACO_ID, PREF_PRE, FACO_NUMERO, FACO_FECHA, TERC_NIT, FACO_ADICIONAL-FACO_DTOMONTO, FACO_IVAMONTO, FACO_RTFTEMONTO, FACO_RTIVAMONTO, FACO_RTICAMONTO, FACO_EXTRA, FACO_TOTAL, FACO_ANULADO, FACO_NUMPROV
    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, :EXTRA, :TOTAL, :ANULADO, :numprov
    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
        if ((ANULADOS = 'S') or (ANULADO = 'N')) then
            BEGIN
            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;
              END
            ELSE
              BEGIN
              SELECT SUM(FCDE_TOTAL - FCDE_IVAMONTO - FCDE_CONSUMO) FROM FACTURAS_COMPRAS_DETALLE D WHERE FACO_ID = :ID AND FCDE_IVAPORC = 0 INTO :EXENTOS;
              SELECT SUM(FCDE_TOTAL - FCDE_IVAMONTO - FCDE_CONSUMO), SUM(FCDE_IVAMONTO) FROM FACTURAS_COMPRAS_DETALLE D, TARIFA_IVA T WHERE FACO_ID = :ID AND FCDE_IVAPORC = TAIV_PORC AND TAIV_COD = 1 INTO :GRAVADOS1, :IVA1;
              SELECT SUM(FCDE_TOTAL - FCDE_IVAMONTO - FCDE_CONSUMO), SUM(FCDE_IVAMONTO) FROM FACTURAS_COMPRAS_DETALLE D, TARIFA_IVA T WHERE FACO_ID = :ID AND FCDE_IVAPORC = TAIV_PORC AND TAIV_COD = 2 INTO :GRAVADOS2, :IVA2;
              SELECT SUM(FCDE_TOTAL - FCDE_IVAMONTO - FCDE_CONSUMO), SUM(FCDE_IVAMONTO) FROM FACTURAS_COMPRAS_DETALLE D, TARIFA_IVA T WHERE FACO_ID = :ID AND FCDE_IVAPORC = TAIV_PORC AND TAIV_COD = 3 INTO :GRAVADOS3, :IVA3;

              SELECT SUM(FCDE_CONSUMO) FROM FACTURAS_COMPRAS_DETALLE WHERE FACO_ID = :ID INTO :CONSUMO;
              SUBTOTAL = TOTAL - EXTRA - IVAMONTO - DTOMONTO;
              NETO = TOTAL - RTFTEMONTO - RTIVAMONTO - RTICAMONTO;
              END
            if (exentos is null) then
                exentos = 0;
            if (gravados1 is null) then
                gravados1 = 0;
            if (gravados2 is null) then
                gravados2 = 0;
            if (gravados3 is null) then
                gravados3 = 0;
            if (iva1 is null) then
                iva1 = 0;
            if (iva2 is null) then
                iva2 = 0;
            if (iva3 is null) then
                iva3 = 0;
            if (consumo is null) then
                consumo = 0;
            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, TERC_NIT, DVCO_ADICIONAL-DVCO_DTOMONTO, DVCO_IVAMONTO, DVCO_RTFTEMONTO, DVCO_RTIVAMONTO, DVCO_RTICAMONTO, DVCO_EXTRA, DVCO_TOTAL, DVCO_ANULADO, ''
    FROM DEVOLUCIONES_COMPRAS
    WHERE DVCO_FECHA >= :FECINI AND DVCO_FECHA <= :FECFIN ORDER BY DVCO_FECHA, PREF_PRE, DVCO_NUMERO
    INTO :ID, :PREF, :NUMERO, :FECHA, :NIT, :DTOMONTO, :IVAMONTO, :RTFTEMONTO, :RTIVAMONTO, :RTICAMONTO, :EXTRA, :TOTAL, :ANULADO, :numprov
    DO
    BEGIN
    if ((PREFIJO = '') or (PREFIJO IS NULL) or (PREF = PREFIJO)) then
        if ((ANULADOS = 'S') or (ANULADO = 'N')) then
            BEGIN
            SELECT TERC_NOM, TERC_EXENTO FROM TERCEROS WHERE TERC_NIT = :NIT INTO :NOMTERCERO, :TER_EXENTO;
            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;
             END
            ELSE
             BEGIN
              DTOMONTO = DTOMONTO * -1;
              ADICIONAL = ADICIONAL * -1;
              IVAMONTO = IVAMONTO * -1;
              EXTRA = EXTRA * -1;
              TOTAL = TOTAL * -1;
              RTFTEMONTO = RTFTEMONTO * -1;
              RTIVAMONTO = RTIVAMONTO * -1;
              RTICAMONTO = RTICAMONTO * -1;
              /* CALCULE LAS DIFERENTES TARIFAS */
               SELECT SUM(DVCD_TOTAL - DVCD_IVAMONTO - DVCD_CONSUMO) FROM DEVOLUCIONES_COMPRAS_DET D WHERE DVCO_ID = :ID AND DVCD_IVAPORC = 0 INTO :EXENTOS;
               SELECT SUM(DVCD_TOTAL - DVCD_IVAMONTO - DVCD_CONSUMO), SUM(DVCD_IVAMONTO) FROM DEVOLUCIONES_COMPRAS_DET D, TARIFA_IVA T WHERE DVCO_ID = :ID AND DVCD_IVAPORC = TAIV_PORC AND TAIV_COD = 1 INTO :GRAVADOS1, :IVA1;
               SELECT SUM(DVCD_TOTAL - DVCD_IVAMONTO - DVCD_CONSUMO), SUM(DVCD_IVAMONTO) FROM DEVOLUCIONES_COMPRAS_DET D, TARIFA_IVA T WHERE DVCO_ID = :ID AND DVCD_IVAPORC = TAIV_PORC AND TAIV_COD = 2 INTO :GRAVADOS2, :IVA2;
               SELECT SUM(DVCD_TOTAL - DVCD_IVAMONTO - DVCD_CONSUMO), SUM(DVCD_IVAMONTO) FROM DEVOLUCIONES_COMPRAS_DET D, TARIFA_IVA T WHERE DVCO_ID = :ID AND DVCD_IVAPORC = TAIV_PORC AND TAIV_COD = 3 INTO :GRAVADOS3, :IVA3;

              SELECT SUM(DVCD_CONSUMO) FROM DEVOLUCIONES_COMPRAS_DET WHERE DVCO_ID = :ID INTO :CONSUMO;
              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;
              SUBTOTAL = TOTAL - EXTRA - IVAMONTO - DTOMONTO;
              NETO = TOTAL - RTFTEMONTO - RTIVAMONTO - RTICAMONTO;
             END
            if (iva1 is null) then
                iva1 = 0;
            if (iva2 is null) then
                iva2 = 0;
            if (iva3 is null) then
                iva3 = 0;
            if (consumo is null) then
                consumo = 0;
            SUSPEND;
            END
    END

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, 0, NCPR_MONTO + NCPR_IVAMONTO, NCPR_ANULADO, '', NCPR_BASE0, NCPR_BASE1, NCPR_BASE2, NCPR_IVA1, NCPR_IVA2
       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, :EXTRA, :TOTAL, :ANULADO, :numprov, :exentos, :gravados1, :gravados2, :iva1, :iva2
       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
          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;
           END
          ELSE
           BEGIN
            GRAVADOS3 = 0;
            IVA3 = 0;
            CONSUMO = 0;
            SUBTOTAL = TOTAL - EXTRA - IVAMONTO - DTOMONTO;
            NETO = TOTAL - RTFTEMONTO - RTIVAMONTO - RTICAMONTO;
           END
         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, 0, NDPR_MONTO + NDPR_IVAMONTO, NDPR_ANULADO, NDPR_NUMPROV, NDPR_BASE0, NDPR_BASE1, NDPR_BASE2, NDPR_IVA1, NDPR_IVA2 
       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, :EXTRA, :TOTAL, :ANULADO, :numprov, :exentos, :gravados1, :gravados2, :iva1, :iva2
       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
          GRAVADOS3 = 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;
           END
          ELSE
           BEGIN
            GRAVADOS3 = 0;
            IVA3 = 0;
            DTOMONTO = DTOMONTO * -1;
            ADICIONAL = ADICIONAL * -1;
            IVAMONTO = IVAMONTO * -1;
            EXTRA = EXTRA * -1;
            TOTAL = TOTAL * -1;
            RTFTEMONTO = RTFTEMONTO * -1;
            RTIVAMONTO = RTIVAMONTO * -1;
            RTICAMONTO = RTICAMONTO * -1;
            SUBTOTAL = TOTAL - EXTRA - IVAMONTO - DTOMONTO;
            NETO = TOTAL - RTFTEMONTO - RTIVAMONTO - RTICAMONTO;
           END
         suspend;
         END
       END
    END
END
^

SET TERM ; ^


/* 20090206  SALDO TOTAL OTRA VEZ COMO SUMA DE X BODEGA */
SET TERM ^ ;

CREATE OR ALTER PROCEDURE SALDO_TOTAL_INVENTARIO(
    ARTICULO VARCHAR(15),
    FECHA DATE)
RETURNS (
    SALDO NUMERIC(18,4))
AS
DECLARE VARIABLE SALDO_BOD NUMERIC(15,4);
DECLARE VARIABLE BOD VARCHAR(2);
BEGIN
  SALDO = 0;
  FOR
    SELECT BODE_COD FROM BODEGA WHERE BODE_ACTIVA = 'S' INTO :BOD
  DO
    BEGIN
    EXECUTE PROCEDURE SALDO_INVENTARIO(:ARTICULO, :BOD, :FECHA) RETURNING_VALUES :SALDO_BOD;
    SALDO = SALDO + SALDO_BOD;
    END
if (saldo is null) then
    SALDO = 0;
SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE CONSULTA_ARTICULOS_VTAS(
    FECHA DATE,
    INACTIVOS CHAR(1),
    MODULO VARCHAR(20),
    BUSCAR VARCHAR(100),
    CUALQUIERA CHAR(1),
    COLUMNA INTEGER,
    BUSCAR2 VARCHAR(30),
    BUSCAR3 VARCHAR(30),
    BUSCAR4 VARCHAR(30),
    BUSCAR5 VARCHAR(30))
RETURNS (
    CODIGO VARCHAR(20),
    DES VARCHAR(60),
    REF VARCHAR(20),
    GRUPO VARCHAR(30),
    MARCA VARCHAR(30),
    UNIDAD VARCHAR(8),
    ESTADO VARCHAR(30),
    IVA NUMERIC(9,2),
    EXISTEN NUMERIC(18,4),
    PRECIO NUMERIC(18,2),
    CLASE CHAR(1))
AS
DECLARE VARIABLE LISTA INTEGER;
DECLARE VARIABLE EXIST CHAR(2);
DECLARE VARIABLE SINEXIST CHAR(2);
declare variable DIG INTEGER;
declare variable OK CHAR(1);
BEGIN /*$$IBE$$ 
EXISTEN = 0;
EXECUTE PROCEDURE lee_configuracion ('FACTURACION','ARTICULOS', 'VER EXISTENCIA EN CONSULTA ARTICULOS') returning_values (:EXIST);
EXECUTE PROCEDURE lee_configuracion ('FACTURACION','FACTURAS', 'CODIGO DE LA LISTA DE PRECIOS A MOSTRAR EN ARTICULOS') returning_values (:LISTA);
if (modulo = 'FACTURACION') then
  EXECUTE PROCEDURE lee_configuracion ('FACTURACION','ARTICULOS','VER ARTICULOS SIN EXISTENCIA EN CONSULTA DE ARTICULOS') returning_values (:sinexist);
else
  sinexist = 'SI';
EXECUTE PROCEDURE LEE_CONFIGURACION ('FACTURACION', 'ARTICULOS', 'REDONDEO AL MULTIPLO DE DIEZ EN PRECIOS') returning_values (DIG);
if (LISTA > 0) then
    BEGIN
    if ((BUSCAR IS NOT NULL) AND (BUSCAR <> '')) then
        FOR select a.arti_cod, arti_des, grup_cod, arti_unidad, esar_cod, taiv_porc, marc_cod,arti_clase
            from articulo a, tarifa_iva t
            where a.taiv_cod = t.taiv_cod and substring(a.arti_cod from 1 FOR 2) <> '.t' and
            ((:INACTIVOS = 'S') or (esar_cod = 'A') or ((:INACTIVOS = 'C') AND (esar_cod = 'N'))) AND
            ((:COLUMNA <> 0) or (upper(A.ARTI_COD) like upper(:buscar))) AND
            ((:columna <> 1) or (upper(A.ARTI_DES) like upper(:buscar))) AND
            ((:columna <> 2) or (upper(A.ARTI_OBS) like upper(:buscar)) or (upper(A.ARTI_DES) like upper(:buscar)))
            INTO :CODIGO, :DES, :GRUPO, :UNIDAD, :ESTADO, :IVA, :MARCA, :CLASE
            do
            begin
            select first 1 coba_cod from barras_articulo where arti_cod = :codigo into :ref;
            if ((COLUMNA <> 3) or (upper(REF) like upper(:buscar))) then
                BEGIN
                OK = 'N';
                PRECIO = 0;
                SELECT prar_fijo PRECIO FROM precios_articulo WHERE arti_cod = :CODIGO and lipr_cod = :LISTA INTO :PRECIO;
                EXECUTE PROCEDURE redondee(PRECIO, DIG) returning_values (PRECIO);
                if (EXIST = 'SI') then
                    BEGIN
                    EXECUTE PROCEDURE saldo_total_inventario (:CODIGO, :FECHA) returning_values (:EXISTEN);
                    if ((SINEXIST = 'SI')  or (existen <> 0)) then
                        OK = 'S';
                    END
                ELSE
                    OK = 'S';
                if (ok = 'S') then
                    if (CUALQUIERA = 'S') then
                        SUSPEND;
                    ELSE
                        if (BUSCAR2 <> '') then
                            BEGIN
                            IF (NOT EXISTS (SELECT ARTI_COD FROM ARTICULO WHERE ARTI_COD = :CODIGO AND ((upper(ARTI_DES) like upper(:BUSCAR2)) or (UPPER(ARTI_OBS) LIKE UPPER(:BUSCAR2))))) THEN
                                OK = 'N';
                            if ((OK = 'S') AND (BUSCAR3 <> '')) then
                                IF (NOT EXISTS (SELECT ARTI_COD FROM ARTICULO WHERE ARTI_COD = :CODIGO AND ((upper(ARTI_DES) like upper(:BUSCAR3)) or (UPPER(ARTI_OBS) LIKE UPPER(:BUSCAR3))))) THEN
                                    OK = 'N';
                            if ((OK = 'S') AND (BUSCAR4 <> '')) then
                                IF (NOT EXISTS (SELECT ARTI_COD FROM ARTICULO WHERE ARTI_COD = :CODIGO AND ((upper(ARTI_DES) like upper(:BUSCAR4)) or (UPPER(ARTI_OBS) LIKE UPPER(:BUSCAR4))))) THEN
                                    OK = 'N';
                            if ((OK = 'S') AND (BUSCAR4 <> '')) then
                                IF (NOT EXISTS (SELECT ARTI_COD FROM ARTICULO WHERE ARTI_COD = :CODIGO AND ((upper(ARTI_DES) like upper(:BUSCAR4)) or (UPPER(ARTI_OBS) LIKE UPPER(:BUSCAR4))))) THEN
                                    OK = 'N';
                            if ((OK = 'S') AND (BUSCAR5 <> '')) then
                                IF (NOT EXISTS (SELECT ARTI_COD FROM ARTICULO WHERE ARTI_COD = :CODIGO AND ((upper(ARTI_DES) like upper(:BUSCAR5)) or (UPPER(ARTI_OBS) LIKE UPPER(:BUSCAR5))))) THEN
                                    OK = 'N';
                            if (OK = 'S') then
                                SUSPEND;
                            END
                        ELSE
                            SUSPEND;
                END
            end
    ELSE
        FOR select a.arti_cod, arti_des, grup_cod, arti_unidad, esar_cod, taiv_porc, marc_cod,arti_clase
            from articulo a, tarifa_iva t
            where a.taiv_cod = t.taiv_cod and substring(a.arti_cod from 1 FOR 2) <> '.t' and
            ((:INACTIVOS = 'S') or (esar_cod = 'A') or ((:INACTIVOS = 'C') AND (esar_cod = 'N')))
            INTO :CODIGO, :DES, :GRUPO, :UNIDAD, :ESTADO, :IVA, :MARCA, :CLASE
            do
            begin
            select first 1 coba_cod from barras_articulo where arti_cod = :codigo into :ref;
            PRECIO = 0;
            SELECT prar_fijo PRECIO FROM precios_articulo WHERE arti_cod = :CODIGO and lipr_cod = :LISTA INTO :PRECIO;
            EXECUTE PROCEDURE redondee(PRECIO, DIG) returning_values (PRECIO);
            if (EXIST = 'SI') then
                BEGIN
                EXECUTE PROCEDURE saldo_total_inventario (:CODIGO, :FECHA) returning_values (:EXISTEN);
                if ((SINEXIST = 'SI')  or (existen <> 0)) then
                    SUSPEND;
                END
            ELSE
                SUSPEND;
            END
    END
ELSE
    if ((BUSCAR IS NOT NULL) AND (BUSCAR <> '')) then
        FOR select arti_cod, arti_des, grup_cod, arti_unidad, esar_cod, taiv_porc, arti_precio, marc_cod, arti_clase
            from articulo a, tarifa_iva t
            where a.taiv_cod = t.taiv_cod and substring(a.arti_cod from 1 FOR 2) <> '.t' and
            ((:INACTIVOS = 'S') or (esar_cod = 'A') or ((:INACTIVOS = 'C') AND (esar_cod = 'N'))) AND
            ((:COLUMNA <> 0) or (upper(A.ARTI_COD) like upper(:buscar))) AND
            ((:columna <> 1) or (upper(A.ARTI_DES) like upper(:buscar))) AND
            ((:columna <> 2) or (upper(A.ARTI_OBS) like upper(:buscar)) or (upper(A.ARTI_DES) like upper(:buscar)))
            INTO :CODIGO, :DES, :GRUPO, :UNIDAD, :ESTADO, :IVA, :PRECIO, :MARCA, :CLASE
            do
            begin
            select first 1 coba_cod from barras_articulo where arti_cod = :codigo into :ref;
            if ((COLUMNA <> 3) or (upper(REF) like upper(:buscar))) then
                BEGIN
                if (EXIST = 'SI') then
                    BEGIN
                    EXECUTE PROCEDURE saldo_total_inventario (:CODIGO, :FECHA) returning_values (:EXISTEN);
                    if ((SINEXIST = 'SI') or (existen <> 0)) then
                        OK = 'S';
                    END
                ELSE
                    OK = 'S';
                if (ok = 'S') then
                    if (CUALQUIERA = 'S') then
                        SUSPEND;
                    ELSE
                        if (BUSCAR2 <> '') then
                            BEGIN
                            IF (NOT EXISTS (SELECT ARTI_COD FROM ARTICULO WHERE ARTI_COD = :CODIGO AND ((upper(ARTI_DES) like upper(:BUSCAR2)) or (UPPER(ARTI_OBS) LIKE UPPER(:BUSCAR2))))) THEN
                                OK = 'N';
                            if ((OK = 'S') AND (BUSCAR3 <> '')) then
                                IF (NOT EXISTS (SELECT ARTI_COD FROM ARTICULO WHERE ARTI_COD = :CODIGO AND ((upper(ARTI_DES) like upper(:BUSCAR3)) or (UPPER(ARTI_OBS) LIKE UPPER(:BUSCAR3))))) THEN
                                    OK = 'N';
                            if ((OK = 'S') AND (BUSCAR4 <> '')) then
                                IF (NOT EXISTS (SELECT ARTI_COD FROM ARTICULO WHERE ARTI_COD = :CODIGO AND ((upper(ARTI_DES) like upper(:BUSCAR4)) or (UPPER(ARTI_OBS) LIKE UPPER(:BUSCAR4))))) THEN
                                    OK = 'N';
                            if ((OK = 'S') AND (BUSCAR4 <> '')) then
                                IF (NOT EXISTS (SELECT ARTI_COD FROM ARTICULO WHERE ARTI_COD = :CODIGO AND ((upper(ARTI_DES) like upper(:BUSCAR4)) or (UPPER(ARTI_OBS) LIKE UPPER(:BUSCAR4))))) THEN
                                    OK = 'N';
                            if ((OK = 'S') AND (BUSCAR5 <> '')) then
                                IF (NOT EXISTS (SELECT ARTI_COD FROM ARTICULO WHERE ARTI_COD = :CODIGO AND ((upper(ARTI_DES) like upper(:BUSCAR5)) or (UPPER(ARTI_OBS) LIKE UPPER(:BUSCAR5))))) THEN
                                    OK = 'N';
                            if (OK = 'S') then
                                SUSPEND;
                            END
                        ELSE
                            SUSPEND;
                END
            end
    ELSE
        FOR select arti_cod, arti_des, grup_cod, arti_unidad, esar_cod, taiv_porc, arti_precio, marc_cod, arti_clase
            from articulo a, tarifa_iva t
            where a.taiv_cod = t.taiv_cod and substring(a.arti_cod from 1 FOR 2) <> '.t' and
            ((:INACTIVOS = 'S') or (esar_cod = 'A') or ((:INACTIVOS = 'C') AND (esar_cod = 'N')))
            INTO :CODIGO, :DES, :GRUPO, :UNIDAD, :ESTADO, :IVA, :PRECIO, :MARCA, :CLASE
            do
            begin
            select first 1 coba_cod from barras_articulo where arti_cod = :codigo into :ref;
            if (EXIST = 'SI') then
                BEGIN
                EXECUTE PROCEDURE saldo_total_inventario (:CODIGO, :FECHA) returning_values (:EXISTEN);
                if ((SINEXIST = 'SI') or (existen <> 0)) then
                    SUSPEND;
                END
            ELSE
                SUSPEND;
            end
 $$IBE$$*/ SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE DISPONIBILIDAD_TOTAL_ARTICULO(
    ARTICULO VARCHAR(15),
    FECHA DATE)
RETURNS (
    DISPONIBILIDAD INTEGER,
    EXIST NUMERIC(18,4),
    PROMEDIO NUMERIC(18,4),
    SALIDAS NUMERIC(18,4))
AS
BEGIN /*$$IBE$$ 
  EXECUTE PROCEDURE saldo_total_inventario (ARTICULO, FECHA) returning_values (:EXIST);
  EXECUTE PROCEDURE PROMEDIO_TOTAL_ARTICULO(:ARTICULO, :FECHA) returning_values (:PROMEDIO, :SALIDAS);
  if (PROMEDIO > 0) then
    DISPONIBILIDAD = EXIST / PROMEDIO;
  ELSE
    DISPONIBILIDAD = 0;
  SUSPEND;
 $$IBE$$*/ SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE IMPR_ARTICULO(
    CODINI VARCHAR(20),
    CODFIN VARCHAR(20),
    CANT INTEGER)
RETURNS (
    ARTICULO VARCHAR(15),
    DESCRIPCION VARCHAR(60),
    PRECIO NUMERIC(18,2),
    CODGRP VARCHAR(2),
    NOMGRP VARCHAR(30),
    COSUBG VARCHAR(3),
    NOMSUBG VARCHAR(30),
    CODMARC VARCHAR(3),
    NOMMARC VARCHAR(30),
    PESO NUMERIC(18,4),
    PUM NUMERIC(18,2),
    LISTA INTEGER,
    NOMLISTA VARCHAR(30),
    FECHA DATE)
AS
declare variable I INTEGER;
begin /*$$IBE$$ 
EXECUTE PROCEDURE lee_configuracion('FACTURACION', 'FACTURAS', 'CODIGO DE LA LISTA DE PRECIOS A MOSTRAR EN ARTICULOS') returning_values (LISTA);
for select a.arti_cod, arti_des, a.grup_cod, a.subg_cod, a.marc_cod, arti_peso, p.lipr_cod, p.prar_fijo, grup_nom, lipr_nom
    from articulo a, precios_articulo p, grupo g, lista_precios l
    where a.arti_cod = p.arti_cod and a.grup_cod = g.grup_cod and l.lipr_cod = p.lipr_cod AND a.arti_cod >= :codini AND a.arti_cod <= :codfin AND P.lipr_cod = :LISTA
    into :articulo, :descripcion, :codgrp, :cosubg, :codmarc, :peso, :lista, :precio, :nomgrp, :nomlista
    do
    begin
    if (cosubg <> '') then
        select subg_nom from subgrupo where grup_cod = :codgrp and subg_cod = :cosubg into :nomsubg;
    if (codmarc <> '') then
        select marc_nom from marcas where marc_cod = :codmarc into :nommarc;
    if ((PESO <> 0) AND (PESO IS NOT NULL)) then
        PUM = PRECIO / PESO;
    ELSE
        PUM = 0;
    SELECT MAX(AUDI_FECHA) FROM AUDITORIA WHERE TIDO_COD = 126 AND AUDI_COD = :articulo AND AUDI_OPER <> 'D' INTO :fecha;
    if (cant = 0) then
        execute procedure saldo_total_inventario(:articulo, cast('now' as DATE)) returning_values (CANT);
    I = 1;
    WHILE (I < CANT) DO
        BEGIN
        SUSPEND;
        I = I + 1;
        END
    end
 $$IBE$$*/ SUSPEND;
end
^

SET TERM ; ^

SET TERM ^ ;

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

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE REP_ABC_INVENTARIO(
    FECHA DATE,
    ARTINI VARCHAR(20),
    ARTFIN VARCHAR(20),
    GRPINI VARCHAR(2),
    GRPFIN VARCHAR(2),
    ORDEN CHAR(1),
    DIAS INTEGER)
RETURNS (
    CODIGO VARCHAR(15),
    NOMBRE VARCHAR(60),
    UNIDAD VARCHAR(8),
    CODGRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    CODSUBG VARCHAR(3),
    NOMSUBG VARCHAR(30),
    CODMARC VARCHAR(3),
    NOMMARC VARCHAR(30),
    COSTO NUMERIC(18,2),
    SALIDAT NUMERIC(18,4),
    VPROMEDIO NUMERIC(18,4),
    PORC NUMERIC(9,2),
    CLASE CHAR(1))
AS
DECLARE VARIABLE CODINI VARCHAR(20);
DECLARE VARIABLE CODFIN VARCHAR(20);
DECLARE VARIABLE DESINI VARCHAR(20);
DECLARE VARIABLE DESFIN VARCHAR(20);
declare variable ACUMULADO NUMERIC(18,2);
declare variable EXIST NUMERIC(18,2);
declare variable ACUMPORC NUMERIC(9,2);
declare variable FECINI DATE;
declare variable A NUMERIC(9,2);
declare variable B NUMERIC(9,2);
declare variable C NUMERIC(9,2);
BEGIN /*$$IBE$$ 
if (ORDEN = 'C') then
    BEGIN
    CODINI = ARTINI;
    CODFIN = ARTFIN;
    DESINI = '';
    DESFIN = 'zz';
    END
ELSE
    BEGIN
    DESINI = ARTINI;
    DESFIN = ARTFIN;
    CODINI = '';
    CODFIN = 'zz';
    END
DELETE FROM analisis_abcinven;
acumporc = 0;
FECINI = FECHA - DIAS;
 $$IBE$$*/ /* CALCULE LA VENTA PROMEDIO DE CADA ARTICULO */ /*$$IBE$$ 
EXECUTE PROCEDURE LEE_CONFIGURACION ('INVENTARIO', 'EXISTENCIAS', 'PORCENTAJE MINIMO PARA ARTICULO CLASE "A"') returning_values (A);
EXECUTE PROCEDURE LEE_CONFIGURACION ('INVENTARIO', 'EXISTENCIAS', 'PORCENTAJE MINIMO PARA ARTICULO CLASE "B"') returning_values (B);
EXECUTE PROCEDURE LEE_CONFIGURACION ('INVENTARIO', 'EXISTENCIAS', 'PORCENTAJE MINIMO PARA ARTICULO CLASE "C"') returning_values (C);
FOR SELECT ARTI_COD, ARTI_UNIDAD FROM ARTICULO A
      WHERE ARTI_COD >= :CODINI AND ARTI_COD <= :CODFIN AND A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :GRPFIN AND ARTI_DES >= :DESINI AND ARTI_DES <= :DESFIN AND A.ESAR_COD <> 'I'
      INTO :CODIGO, :UNIDAD
      DO
      BEGIN
      EXECUTE PROCEDURE ultimo_costo(:CODIGO, :FECHA, :UNIDAD) returning_values (:COSTO);
      SELECT SUM(MVAR_CANT) FROM MOVIMIENTO_ARTICULO
        WHERE ARTI_COD = :codigo AND MVAR_FECHA >= :FECINI AND MVAR_FECHA <= :FECHA AND MVAR_ENTRADA = 'N' AND MVAR_TIPODOC <> 13 INTO :SALIDAT;
      if (SALIDAT IS NULL) then
        SALIDAT = 0;
      VPROMEDIO = SALIDAT * COSTO;
      insert into analisis_abcinven (ABCI_COD, ABCI_VENTA) VALUES (:codigo, :vpromedio);
      END
SELECT SUM(ABCI_VENTA) FROM analisis_abcinven INTO :acumulado;
FOR SELECT ARTI_COD, ARTI_DES, ARTI_UNIDAD, ARTI_DIAS, A.GRUP_COD, GRUP_NOM, A.SUBG_COD, A.MARC_COD, ABCI_VENTA
      FROM ARTICULO A, GRUPO G, analisis_abcinven N
      WHERE A.ARTI_COD = N.abci_cod AND G.GRUP_COD = A.GRUP_COD
      ORDER BY ABCI_VENTA DESC
      INTO :CODIGO, :NOMBRE, :UNIDAD, :DIAS, :CODGRUPO, :NOMGRUPO, :CODSUBG, :CODMARC, :vpromedio
      DO
        BEGIN
        NOMMARC = '';
        NOMSUBG = '';
        SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO :NOMMARC;
        SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
        EXECUTE PROCEDURE ultimo_costo(:CODIGO, :FECHA, :UNIDAD) returning_values (:COSTO);
        EXECUTE PROCEDURE saldo_total_inventario (:codigo, FECHA) returning_values (:EXIST);
        costo = costo * exist;
        SELECT SUM(MVAR_CANT) FROM MOVIMIENTO_ARTICULO
          WHERE ARTI_COD = :codigo AND MVAR_FECHA >= :FECINI AND MVAR_FECHA <= :FECHA AND MVAR_ENTRADA = 'N' AND MVAR_TIPODOC <> 13 INTO :SALIDAT;
        if (SALIDAT IS NULL) then
          SALIDAT = 0;
        if (acumulado <> 0) then
            PORC = vpromedio / acumulado * 100;
        ELSE
            PORC = 0;
        acumporc = acumporc + porc;
        if (acumporc < A) then
            CLASE = 'A';
        else
            if (acumporc < B) then
                CLASE = 'B';
            else
                if (acumporc < c) then
                    CLASE = 'C';
                else
                    CLASE = 'D';
        SUSPEND;
        END
 $$IBE$$*/ SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

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

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE REP_DISPONIBILIDAD(
    FECHA DATE,
    ARTINI VARCHAR(20),
    ARTFIN VARCHAR(20),
    GRPINI VARCHAR(3),
    GRPFIN VARCHAR(3),
    ORDEN CHAR(1),
    CEROS CHAR(1),
    DETALLE CHAR(1),
    AGRUPA CHAR(1),
    SUCURSAL INTEGER)
RETURNS (
    CODIGO VARCHAR(15),
    NOMBRE VARCHAR(60),
    UNIDAD VARCHAR(8),
    CODGRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    CODSUBG VARCHAR(3),
    NOMSUBG VARCHAR(30),
    CODMARC VARCHAR(3),
    NOMMARC VARCHAR(30),
    CODBOD VARCHAR(2),
    NOMBOD VARCHAR(30),
    EXIST NUMERIC(18,4),
    PROMEDIO NUMERIC(18,4),
    SALIDAS NUMERIC(18,4),
    DISPONIBILIDAD INTEGER,
    DIAS INTEGER,
    PROMEDIADO INTEGER,
    COSTO NUMERIC(18,2),
    COSTOPRO NUMERIC(18,2),
    SUGERIDO NUMERIC(18,4),
    FECCOMPRA DATE)
AS
DECLARE VARIABLE CODINI VARCHAR(20);
DECLARE VARIABLE CODFIN VARCHAR(20);
DECLARE VARIABLE DESINI VARCHAR(20);
DECLARE VARIABLE DESFIN VARCHAR(20);
DECLARE VARIABLE MARINI VARCHAR(20);
DECLARE VARIABLE MARFIN VARCHAR(20);
declare variable DIASC VARCHAR(255);
declare variable DIA_ART VARCHAR(2) CHARACTER SET NONE;
BEGIN /*$$IBE$$ 
if (ORDEN = 'C') then
    BEGIN
    CODINI = ARTINI;
    CODFIN = ARTFIN;
    DESINI = '';
    DESFIN = 'zz';
    END
ELSE
    BEGIN
    DESINI = ARTINI;
    DESFIN = ARTFIN;
    CODINI = '';
    CODFIN = 'zz';
    END
if (AGRUPA = 'G') then
    BEGIN
    MARINI = '';
    MARFIN = 'zz';
    END
ELSE
    if (AGRUPA = 'M') then
        BEGIN
        MARINI = GRPINI;
        MARFIN = GRPFIN;
        GRPINI = '';
        GRPFIN = 'zz';
        END
if (DETALLE = 'S') then
  BEGIN
  FOR SELECT ARTI_COD, ARTI_DES, ARTI_UNIDAD, ARTI_DIAS, A.GRUP_COD, GRUP_NOM, A.SUBG_COD, A.MARC_COD, BODE_COD, BODE_NOM, ARTI_DIANALIS
      FROM ARTICULO A, GRUPO G, BODEGA B
      WHERE ARTI_COD >= :CODINI AND ARTI_COD <= :CODFIN AND A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :GRPFIN AND ARTI_DES >= :DESINI AND ARTI_DES <= :DESFIN AND
      G.GRUP_COD = A.GRUP_COD AND A.ESAR_COD <> 'I' AND ((SUCU_ID = :SUCURSAL) or (:SUCURSAL = 0)) AND
      (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN)))
      INTO :CODIGO, :NOMBRE, :UNIDAD, :DIAS, :CODGRUPO, :NOMGRUPO, :CODSUBG, :CODMARC, :CODBOD, :NOMBOD, :PROMEDIADO
      DO
        BEGIN
        NOMMARC = '';
        NOMSUBG = '';
        SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO :NOMMARC;
        SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
        EXECUTE PROCEDURE ultimo_costo(:CODIGO, :FECHA, :UNIDAD) returning_values (:COSTO);
        EXECUTE PROCEDURE costo_promedio(:CODIGO, :FECHA) RETURNING_VALUES :costopro;
        EXECUTE PROCEDURE DISPONIBILIDAD_ARTICULO(CODIGO, FECHA, :CODBOD) returning_values (:DISPONIBILIDAD, :EXIST, :PROMEDIO, :SALIDAS);
         $$IBE$$*/ /*ESTABLECER CUAL ES EL VALOR DE DIAS PARA PROMEDIO*/ /*$$IBE$$ 
        EXECUTE PROCEDURE lee_configuracion ('INVENTARIO', 'EXISTENCIAS', 'PROMEDIAR LAS SALIDAS DEL INVENTARIO CON EL NUMERO DE DIAS ASIGNADO A CADA ARTICULO') returning_values (:DIA_ART);
        if (DIA_ART = 'NO') then
          BEGIN
            EXECUTE PROCEDURE lee_configuracion ('INVENTARIO', 'EXISTENCIAS', 'NUMERO DE DIAS PARA PROMEDIO DE SALIDAS POR ARTICULO') returning_values (DIASC);
            PROMEDIADO = CAST(DIASC AS INTEGER);
          END
        if ((DISPONIBILIDAD < DIAS) and (PROMEDIO > 0))then
            SUGERIDO = (DIAS * PROMEDIO) - EXIST;
        ELSE
            SUGERIDO = 0;
        SELECT MAX(FACO_FECHA) FROM FACTURAS_COMPRA F, FACTURAS_COMPRAS_DETALLE D
            WHERE F.FACO_ID = D.faco_id AND D.ARTI_COD = :CODIGO AND FACO_FECHA <= :FECHA AND D.bode_cod = :codbod
            INTO :FECCOMPRA;
        if ((PROMEDIO > 0) or (EXIST <> 0) or (CEROS = 'S')) then
            SUSPEND;
        END
  END
ELSE
  BEGIN
  FOR SELECT ARTI_COD, ARTI_DES, ARTI_UNIDAD, ARTI_DIAS, A.GRUP_COD, GRUP_NOM, A.SUBG_COD, A.MARC_COD, ARTI_DIANALIS
      FROM ARTICULO A, GRUPO G
      WHERE ARTI_COD >= :CODINI AND ARTI_COD <= :CODFIN AND A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :GRPFIN AND ARTI_DES >= :DESINI AND ARTI_DES <= :DESFIN AND G.GRUP_COD = A.GRUP_COD AND
      A.ESAR_COD <> 'I' AND (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN)))
      INTO :CODIGO, :NOMBRE, :UNIDAD, :DIAS, :CODGRUPO, :NOMGRUPO, :CODSUBG, :CODMARC, :PROMEDIADO
      DO
        BEGIN
        NOMMARC = '';
        NOMSUBG = '';
        SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO :NOMMARC;
        SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
        EXECUTE PROCEDURE costo_promedio(:CODIGO, :FECHA) RETURNING_VALUES :costopro;
        EXECUTE PROCEDURE ultimo_costo(:CODIGO, :FECHA, :UNIDAD) returning_values (:COSTO);
        EXECUTE PROCEDURE DISPONIBILIDAD_TOTAL_ARTICULO(CODIGO, FECHA) returning_values (:DISPONIBILIDAD, :EXIST, :PROMEDIO, :SALIDAS);
         $$IBE$$*/ /*ESTABLECER CUAL ES EL VALOR DE DIAS PARA PROMEDIO*/ /*$$IBE$$ 
        EXECUTE PROCEDURE lee_configuracion ('INVENTARIO', 'EXISTENCIAS', 'PROMEDIAR LAS SALIDAS DEL INVENTARIO CON EL NUMERO DE DIAS ASIGNADO A CADA ARTICULO') returning_values (:DIA_ART);
        if (DIA_ART = 'NO') then
          BEGIN
            EXECUTE PROCEDURE lee_configuracion ('INVENTARIO', 'EXISTENCIAS', 'NUMERO DE DIAS PARA PROMEDIO DE SALIDAS POR ARTICULO') returning_values (DIASC);
            PROMEDIADO = CAST(DIASC AS INTEGER);
          END
        if ((DISPONIBILIDAD < DIAS) and (PROMEDIO > 0))then
            SUGERIDO = (DIAS * PROMEDIO) - EXIST;
        ELSE
            SUGERIDO = 0;
        SELECT MAX(FACO_FECHA) FROM FACTURAS_COMPRA F, FACTURAS_COMPRAS_DETALLE D
            WHERE F.FACO_ID = D.faco_id AND D.ARTI_COD = :CODIGO AND FACO_FECHA <= :FECHA
            INTO :FECCOMPRA;
        if ((PROMEDIO > 0) or (EXIST <> 0) or (CEROS = 'S')) then
            SUSPEND;
        END
  END
 $$IBE$$*/ SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE CONSULTA_ARTICULOS_VTAS(
    FECHA DATE,
    INACTIVOS CHAR(1),
    MODULO VARCHAR(20),
    BUSCAR VARCHAR(100),
    CUALQUIERA CHAR(1),
    COLUMNA INTEGER,
    BUSCAR2 VARCHAR(30),
    BUSCAR3 VARCHAR(30),
    BUSCAR4 VARCHAR(30),
    BUSCAR5 VARCHAR(30))
RETURNS (
    CODIGO VARCHAR(20),
    DES VARCHAR(60),
    REF VARCHAR(20),
    GRUPO VARCHAR(30),
    MARCA VARCHAR(30),
    UNIDAD VARCHAR(8),
    ESTADO VARCHAR(30),
    IVA NUMERIC(9,2),
    EXISTEN NUMERIC(18,4),
    PRECIO NUMERIC(18,2),
    CLASE CHAR(1))
AS
DECLARE VARIABLE LISTA INTEGER;
DECLARE VARIABLE EXIST CHAR(2);
DECLARE VARIABLE SINEXIST CHAR(2);
declare variable DIG INTEGER;
declare variable OK CHAR(1);
BEGIN
EXISTEN = 0;
EXECUTE PROCEDURE lee_configuracion ('FACTURACION','ARTICULOS', 'VER EXISTENCIA EN CONSULTA ARTICULOS') returning_values (:EXIST);
EXECUTE PROCEDURE lee_configuracion ('FACTURACION','FACTURAS', 'CODIGO DE LA LISTA DE PRECIOS A MOSTRAR EN ARTICULOS') returning_values (:LISTA);
if (modulo = 'FACTURACION') then
  EXECUTE PROCEDURE lee_configuracion ('FACTURACION','ARTICULOS','VER ARTICULOS SIN EXISTENCIA EN CONSULTA DE ARTICULOS') returning_values (:sinexist);
else
  sinexist = 'SI';
EXECUTE PROCEDURE LEE_CONFIGURACION ('FACTURACION', 'ARTICULOS', 'REDONDEO AL MULTIPLO DE DIEZ EN PRECIOS') returning_values (DIG);
if (LISTA > 0) then
    BEGIN
    if ((BUSCAR IS NOT NULL) AND (BUSCAR <> '')) then
        FOR select a.arti_cod, arti_des, grup_cod, arti_unidad, esar_cod, taiv_porc, marc_cod,arti_clase
            from articulo a, tarifa_iva t
            where a.taiv_cod = t.taiv_cod and substring(a.arti_cod from 1 FOR 2) <> '.t' and
            ((:INACTIVOS = 'S') or (esar_cod = 'A') or ((:INACTIVOS = 'C') AND (esar_cod = 'N'))) AND
            ((:COLUMNA <> 0) or (upper(A.ARTI_COD) like upper(:buscar))) AND
            ((:columna <> 1) or (upper(A.ARTI_DES) like upper(:buscar))) AND
            ((:columna <> 2) or (upper(A.ARTI_OBS) like upper(:buscar)) or (upper(A.ARTI_DES) like upper(:buscar)))
            INTO :CODIGO, :DES, :GRUPO, :UNIDAD, :ESTADO, :IVA, :MARCA, :CLASE
            do
            begin
            select first 1 coba_cod from barras_articulo where arti_cod = :codigo into :ref;
            if ((COLUMNA <> 3) or (upper(REF) like upper(:buscar))) then
                BEGIN
                OK = 'N';
                PRECIO = 0;
                SELECT prar_fijo PRECIO FROM precios_articulo WHERE arti_cod = :CODIGO and lipr_cod = :LISTA INTO :PRECIO;
                EXECUTE PROCEDURE redondee(PRECIO, DIG) returning_values (PRECIO);
                if (EXIST = 'SI') then
                    BEGIN
                    EXECUTE PROCEDURE saldo_total_inventario (:CODIGO, :FECHA) returning_values (:EXISTEN);
                    if ((SINEXIST = 'SI')  or (existen <> 0)) then
                        OK = 'S';
                    END
                ELSE
                    OK = 'S';
                if (ok = 'S') then
                    if (CUALQUIERA = 'S') then
                        SUSPEND;
                    ELSE
                        if (BUSCAR2 <> '') then
                            BEGIN
                            IF (NOT EXISTS (SELECT ARTI_COD FROM ARTICULO WHERE ARTI_COD = :CODIGO AND ((upper(ARTI_DES) like upper(:BUSCAR2)) or (UPPER(ARTI_OBS) LIKE UPPER(:BUSCAR2))))) THEN
                                OK = 'N';
                            if ((OK = 'S') AND (BUSCAR3 <> '')) then
                                IF (NOT EXISTS (SELECT ARTI_COD FROM ARTICULO WHERE ARTI_COD = :CODIGO AND ((upper(ARTI_DES) like upper(:BUSCAR3)) or (UPPER(ARTI_OBS) LIKE UPPER(:BUSCAR3))))) THEN
                                    OK = 'N';
                            if ((OK = 'S') AND (BUSCAR4 <> '')) then
                                IF (NOT EXISTS (SELECT ARTI_COD FROM ARTICULO WHERE ARTI_COD = :CODIGO AND ((upper(ARTI_DES) like upper(:BUSCAR4)) or (UPPER(ARTI_OBS) LIKE UPPER(:BUSCAR4))))) THEN
                                    OK = 'N';
                            if ((OK = 'S') AND (BUSCAR4 <> '')) then
                                IF (NOT EXISTS (SELECT ARTI_COD FROM ARTICULO WHERE ARTI_COD = :CODIGO AND ((upper(ARTI_DES) like upper(:BUSCAR4)) or (UPPER(ARTI_OBS) LIKE UPPER(:BUSCAR4))))) THEN
                                    OK = 'N';
                            if ((OK = 'S') AND (BUSCAR5 <> '')) then
                                IF (NOT EXISTS (SELECT ARTI_COD FROM ARTICULO WHERE ARTI_COD = :CODIGO AND ((upper(ARTI_DES) like upper(:BUSCAR5)) or (UPPER(ARTI_OBS) LIKE UPPER(:BUSCAR5))))) THEN
                                    OK = 'N';
                            if (OK = 'S') then
                                SUSPEND;
                            END
                        ELSE
                            SUSPEND;
                END
            end
    ELSE
        FOR select a.arti_cod, arti_des, grup_cod, arti_unidad, esar_cod, taiv_porc, marc_cod,arti_clase
            from articulo a, tarifa_iva t
            where a.taiv_cod = t.taiv_cod and substring(a.arti_cod from 1 FOR 2) <> '.t' and
            ((:INACTIVOS = 'S') or (esar_cod = 'A') or ((:INACTIVOS = 'C') AND (esar_cod = 'N')))
            INTO :CODIGO, :DES, :GRUPO, :UNIDAD, :ESTADO, :IVA, :MARCA, :CLASE
            do
            begin
            select first 1 coba_cod from barras_articulo where arti_cod = :codigo into :ref;
            PRECIO = 0;
            SELECT prar_fijo PRECIO FROM precios_articulo WHERE arti_cod = :CODIGO and lipr_cod = :LISTA INTO :PRECIO;
            EXECUTE PROCEDURE redondee(PRECIO, DIG) returning_values (PRECIO);
            if (EXIST = 'SI') then
                BEGIN
                EXECUTE PROCEDURE saldo_total_inventario (:CODIGO, :FECHA) returning_values (:EXISTEN);
                if ((SINEXIST = 'SI')  or (existen <> 0)) then
                    SUSPEND;
                END
            ELSE
                SUSPEND;
            END
    END
ELSE
    if ((BUSCAR IS NOT NULL) AND (BUSCAR <> '')) then
        FOR select arti_cod, arti_des, grup_cod, arti_unidad, esar_cod, taiv_porc, arti_precio, marc_cod, arti_clase
            from articulo a, tarifa_iva t
            where a.taiv_cod = t.taiv_cod and substring(a.arti_cod from 1 FOR 2) <> '.t' and
            ((:INACTIVOS = 'S') or (esar_cod = 'A') or ((:INACTIVOS = 'C') AND (esar_cod = 'N'))) AND
            ((:COLUMNA <> 0) or (upper(A.ARTI_COD) like upper(:buscar))) AND
            ((:columna <> 1) or (upper(A.ARTI_DES) like upper(:buscar))) AND
            ((:columna <> 2) or (upper(A.ARTI_OBS) like upper(:buscar)) or (upper(A.ARTI_DES) like upper(:buscar)))
            INTO :CODIGO, :DES, :GRUPO, :UNIDAD, :ESTADO, :IVA, :PRECIO, :MARCA, :CLASE
            do
            begin
            select first 1 coba_cod from barras_articulo where arti_cod = :codigo into :ref;
            if ((COLUMNA <> 3) or (upper(REF) like upper(:buscar))) then
                BEGIN
                if (EXIST = 'SI') then
                    BEGIN
                    EXECUTE PROCEDURE saldo_total_inventario (:CODIGO, :FECHA) returning_values (:EXISTEN);
                    if ((SINEXIST = 'SI') or (existen <> 0)) then
                        OK = 'S';
                    END
                ELSE
                    OK = 'S';
                if (ok = 'S') then
                    if (CUALQUIERA = 'S') then
                        SUSPEND;
                    ELSE
                        if (BUSCAR2 <> '') then
                            BEGIN
                            IF (NOT EXISTS (SELECT ARTI_COD FROM ARTICULO WHERE ARTI_COD = :CODIGO AND ((upper(ARTI_DES) like upper(:BUSCAR2)) or (UPPER(ARTI_OBS) LIKE UPPER(:BUSCAR2))))) THEN
                                OK = 'N';
                            if ((OK = 'S') AND (BUSCAR3 <> '')) then
                                IF (NOT EXISTS (SELECT ARTI_COD FROM ARTICULO WHERE ARTI_COD = :CODIGO AND ((upper(ARTI_DES) like upper(:BUSCAR3)) or (UPPER(ARTI_OBS) LIKE UPPER(:BUSCAR3))))) THEN
                                    OK = 'N';
                            if ((OK = 'S') AND (BUSCAR4 <> '')) then
                                IF (NOT EXISTS (SELECT ARTI_COD FROM ARTICULO WHERE ARTI_COD = :CODIGO AND ((upper(ARTI_DES) like upper(:BUSCAR4)) or (UPPER(ARTI_OBS) LIKE UPPER(:BUSCAR4))))) THEN
                                    OK = 'N';
                            if ((OK = 'S') AND (BUSCAR4 <> '')) then
                                IF (NOT EXISTS (SELECT ARTI_COD FROM ARTICULO WHERE ARTI_COD = :CODIGO AND ((upper(ARTI_DES) like upper(:BUSCAR4)) or (UPPER(ARTI_OBS) LIKE UPPER(:BUSCAR4))))) THEN
                                    OK = 'N';
                            if ((OK = 'S') AND (BUSCAR5 <> '')) then
                                IF (NOT EXISTS (SELECT ARTI_COD FROM ARTICULO WHERE ARTI_COD = :CODIGO AND ((upper(ARTI_DES) like upper(:BUSCAR5)) or (UPPER(ARTI_OBS) LIKE UPPER(:BUSCAR5))))) THEN
                                    OK = 'N';
                            if (OK = 'S') then
                                SUSPEND;
                            END
                        ELSE
                            SUSPEND;
                END
            end
    ELSE
        FOR select arti_cod, arti_des, grup_cod, arti_unidad, esar_cod, taiv_porc, arti_precio, marc_cod, arti_clase
            from articulo a, tarifa_iva t
            where a.taiv_cod = t.taiv_cod and substring(a.arti_cod from 1 FOR 2) <> '.t' and
            ((:INACTIVOS = 'S') or (esar_cod = 'A') or ((:INACTIVOS = 'C') AND (esar_cod = 'N')))
            INTO :CODIGO, :DES, :GRUPO, :UNIDAD, :ESTADO, :IVA, :PRECIO, :MARCA, :CLASE
            do
            begin
            select first 1 coba_cod from barras_articulo where arti_cod = :codigo into :ref;
            if (EXIST = 'SI') then
                BEGIN
                EXECUTE PROCEDURE saldo_total_inventario (:CODIGO, :FECHA) returning_values (:EXISTEN);
                if ((SINEXIST = 'SI') or (existen <> 0)) then
                    SUSPEND;
                END
            ELSE
                SUSPEND;
            end
END

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE DISPONIBILIDAD_TOTAL_ARTICULO(
    ARTICULO VARCHAR(15),
    FECHA DATE)
RETURNS (
    DISPONIBILIDAD INTEGER,
    EXIST NUMERIC(18,4),
    PROMEDIO NUMERIC(18,4),
    SALIDAS NUMERIC(18,4))
AS
BEGIN
  EXECUTE PROCEDURE saldo_total_inventario (ARTICULO, FECHA) returning_values (:EXIST);
  EXECUTE PROCEDURE PROMEDIO_TOTAL_ARTICULO(:ARTICULO, :FECHA) returning_values (:PROMEDIO, :SALIDAS);
  if (PROMEDIO > 0) then
    DISPONIBILIDAD = EXIST / PROMEDIO;
  ELSE
    DISPONIBILIDAD = 0;
  SUSPEND;
END

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE IMPR_ARTICULO(
    CODINI VARCHAR(20),
    CODFIN VARCHAR(20),
    CANT INTEGER)
RETURNS (
    ARTICULO VARCHAR(15),
    DESCRIPCION VARCHAR(60),
    PRECIO NUMERIC(18,2),
    CODGRP VARCHAR(2),
    NOMGRP VARCHAR(30),
    COSUBG VARCHAR(3),
    NOMSUBG VARCHAR(30),
    CODMARC VARCHAR(3),
    NOMMARC VARCHAR(30),
    PESO NUMERIC(18,4),
    PUM NUMERIC(18,2),
    LISTA INTEGER,
    NOMLISTA VARCHAR(30),
    FECHA DATE)
AS
declare variable I INTEGER;
begin
EXECUTE PROCEDURE lee_configuracion('FACTURACION', 'FACTURAS', 'CODIGO DE LA LISTA DE PRECIOS A MOSTRAR EN ARTICULOS') returning_values (LISTA);
for select a.arti_cod, arti_des, a.grup_cod, a.subg_cod, a.marc_cod, arti_peso, p.lipr_cod, p.prar_fijo, grup_nom, lipr_nom
    from articulo a, precios_articulo p, grupo g, lista_precios l
    where a.arti_cod = p.arti_cod and a.grup_cod = g.grup_cod and l.lipr_cod = p.lipr_cod AND a.arti_cod >= :codini AND a.arti_cod <= :codfin AND P.lipr_cod = :LISTA
    into :articulo, :descripcion, :codgrp, :cosubg, :codmarc, :peso, :lista, :precio, :nomgrp, :nomlista
    do
    begin
    if (cosubg <> '') then
        select subg_nom from subgrupo where grup_cod = :codgrp and subg_cod = :cosubg into :nomsubg;
    if (codmarc <> '') then
        select marc_nom from marcas where marc_cod = :codmarc into :nommarc;
    if ((PESO <> 0) AND (PESO IS NOT NULL)) then
        PUM = PRECIO / PESO;
    ELSE
        PUM = 0;
    SELECT MAX(AUDI_FECHA) FROM AUDITORIA WHERE TIDO_COD = 126 AND AUDI_COD = :articulo AND AUDI_OPER <> 'D' INTO :fecha;
    if (cant = 0) then
        execute procedure saldo_total_inventario(:articulo, cast('now' as DATE)) returning_values (CANT);
    I = 1;
    WHILE (I < CANT) DO
        BEGIN
        SUSPEND;
        I = I + 1;
        END
    end
end

^

SET TERM ; ^

SET TERM ^ ;

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

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE REP_ABC_INVENTARIO(
    FECHA DATE,
    ARTINI VARCHAR(20),
    ARTFIN VARCHAR(20),
    GRPINI VARCHAR(2),
    GRPFIN VARCHAR(2),
    ORDEN CHAR(1),
    DIAS INTEGER)
RETURNS (
    CODIGO VARCHAR(15),
    NOMBRE VARCHAR(60),
    UNIDAD VARCHAR(8),
    CODGRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    CODSUBG VARCHAR(3),
    NOMSUBG VARCHAR(30),
    CODMARC VARCHAR(3),
    NOMMARC VARCHAR(30),
    COSTO NUMERIC(18,2),
    SALIDAT NUMERIC(18,4),
    VPROMEDIO NUMERIC(18,4),
    PORC NUMERIC(9,2),
    CLASE CHAR(1))
AS
DECLARE VARIABLE CODINI VARCHAR(20);
DECLARE VARIABLE CODFIN VARCHAR(20);
DECLARE VARIABLE DESINI VARCHAR(20);
DECLARE VARIABLE DESFIN VARCHAR(20);
declare variable ACUMULADO NUMERIC(18,2);
declare variable EXIST NUMERIC(18,2);
declare variable ACUMPORC NUMERIC(9,2);
declare variable FECINI DATE;
declare variable A NUMERIC(9,2);
declare variable B NUMERIC(9,2);
declare variable C NUMERIC(9,2);
BEGIN
if (ORDEN = 'C') then
    BEGIN
    CODINI = ARTINI;
    CODFIN = ARTFIN;
    DESINI = '';
    DESFIN = 'zz';
    END
ELSE
    BEGIN
    DESINI = ARTINI;
    DESFIN = ARTFIN;
    CODINI = '';
    CODFIN = 'zz';
    END
DELETE FROM analisis_abcinven;
acumporc = 0;
FECINI = FECHA - DIAS;
/* CALCULE LA VENTA PROMEDIO DE CADA ARTICULO */
EXECUTE PROCEDURE LEE_CONFIGURACION ('INVENTARIO', 'EXISTENCIAS', 'PORCENTAJE MINIMO PARA ARTICULO CLASE "A"') returning_values (A);
EXECUTE PROCEDURE LEE_CONFIGURACION ('INVENTARIO', 'EXISTENCIAS', 'PORCENTAJE MINIMO PARA ARTICULO CLASE "B"') returning_values (B);
EXECUTE PROCEDURE LEE_CONFIGURACION ('INVENTARIO', 'EXISTENCIAS', 'PORCENTAJE MINIMO PARA ARTICULO CLASE "C"') returning_values (C);
FOR SELECT ARTI_COD, ARTI_UNIDAD FROM ARTICULO A
      WHERE ARTI_COD >= :CODINI AND ARTI_COD <= :CODFIN AND A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :GRPFIN AND ARTI_DES >= :DESINI AND ARTI_DES <= :DESFIN AND A.ESAR_COD <> 'I'
      INTO :CODIGO, :UNIDAD
      DO
      BEGIN
      EXECUTE PROCEDURE ultimo_costo(:CODIGO, :FECHA, :UNIDAD) returning_values (:COSTO);
      SELECT SUM(MVAR_CANT) FROM MOVIMIENTO_ARTICULO
        WHERE ARTI_COD = :codigo AND MVAR_FECHA >= :FECINI AND MVAR_FECHA <= :FECHA AND MVAR_ENTRADA = 'N' AND MVAR_TIPODOC <> 13 INTO :SALIDAT;
      if (SALIDAT IS NULL) then
        SALIDAT = 0;
      VPROMEDIO = SALIDAT * COSTO;
      insert into analisis_abcinven (ABCI_COD, ABCI_VENTA) VALUES (:codigo, :vpromedio);
      END
SELECT SUM(ABCI_VENTA) FROM analisis_abcinven INTO :acumulado;
FOR SELECT ARTI_COD, ARTI_DES, ARTI_UNIDAD, ARTI_DIAS, A.GRUP_COD, GRUP_NOM, A.SUBG_COD, A.MARC_COD, ABCI_VENTA
      FROM ARTICULO A, GRUPO G, analisis_abcinven N
      WHERE A.ARTI_COD = N.abci_cod AND G.GRUP_COD = A.GRUP_COD
      ORDER BY ABCI_VENTA DESC
      INTO :CODIGO, :NOMBRE, :UNIDAD, :DIAS, :CODGRUPO, :NOMGRUPO, :CODSUBG, :CODMARC, :vpromedio
      DO
        BEGIN
        NOMMARC = '';
        NOMSUBG = '';
        SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO :NOMMARC;
        SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
        EXECUTE PROCEDURE ultimo_costo(:CODIGO, :FECHA, :UNIDAD) returning_values (:COSTO);
        EXECUTE PROCEDURE saldo_total_inventario (:codigo, FECHA) returning_values (:EXIST);
        costo = costo * exist;
        SELECT SUM(MVAR_CANT) FROM MOVIMIENTO_ARTICULO
          WHERE ARTI_COD = :codigo AND MVAR_FECHA >= :FECINI AND MVAR_FECHA <= :FECHA AND MVAR_ENTRADA = 'N' AND MVAR_TIPODOC <> 13 INTO :SALIDAT;
        if (SALIDAT IS NULL) then
          SALIDAT = 0;
        if (acumulado <> 0) then
            PORC = vpromedio / acumulado * 100;
        ELSE
            PORC = 0;
        acumporc = acumporc + porc;
        if (acumporc < A) then
            CLASE = 'A';
        else
            if (acumporc < B) then
                CLASE = 'B';
            else
                if (acumporc < c) then
                    CLASE = 'C';
                else
                    CLASE = 'D';
        SUSPEND;
        END
END

^

SET TERM ; ^

SET TERM ^ ;

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

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE REP_DISPONIBILIDAD(
    FECHA DATE,
    ARTINI VARCHAR(20),
    ARTFIN VARCHAR(20),
    GRPINI VARCHAR(3),
    GRPFIN VARCHAR(3),
    ORDEN CHAR(1),
    CEROS CHAR(1),
    DETALLE CHAR(1),
    AGRUPA CHAR(1),
    SUCURSAL INTEGER)
RETURNS (
    CODIGO VARCHAR(15),
    NOMBRE VARCHAR(60),
    UNIDAD VARCHAR(8),
    CODGRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    CODSUBG VARCHAR(3),
    NOMSUBG VARCHAR(30),
    CODMARC VARCHAR(3),
    NOMMARC VARCHAR(30),
    CODBOD VARCHAR(2),
    NOMBOD VARCHAR(30),
    EXIST NUMERIC(18,4),
    PROMEDIO NUMERIC(18,4),
    SALIDAS NUMERIC(18,4),
    DISPONIBILIDAD INTEGER,
    DIAS INTEGER,
    PROMEDIADO INTEGER,
    COSTO NUMERIC(18,2),
    COSTOPRO NUMERIC(18,2),
    SUGERIDO NUMERIC(18,4),
    FECCOMPRA DATE)
AS
DECLARE VARIABLE CODINI VARCHAR(20);
DECLARE VARIABLE CODFIN VARCHAR(20);
DECLARE VARIABLE DESINI VARCHAR(20);
DECLARE VARIABLE DESFIN VARCHAR(20);
DECLARE VARIABLE MARINI VARCHAR(20);
DECLARE VARIABLE MARFIN VARCHAR(20);
declare variable DIASC VARCHAR(255);
declare variable DIA_ART VARCHAR(2) CHARACTER SET NONE;
BEGIN
if (ORDEN = 'C') then
    BEGIN
    CODINI = ARTINI;
    CODFIN = ARTFIN;
    DESINI = '';
    DESFIN = 'zz';
    END
ELSE
    BEGIN
    DESINI = ARTINI;
    DESFIN = ARTFIN;
    CODINI = '';
    CODFIN = 'zz';
    END
if (AGRUPA = 'G') then
    BEGIN
    MARINI = '';
    MARFIN = 'zz';
    END
ELSE
    if (AGRUPA = 'M') then
        BEGIN
        MARINI = GRPINI;
        MARFIN = GRPFIN;
        GRPINI = '';
        GRPFIN = 'zz';
        END
if (DETALLE = 'S') then
  BEGIN
  FOR SELECT ARTI_COD, ARTI_DES, ARTI_UNIDAD, ARTI_DIAS, A.GRUP_COD, GRUP_NOM, A.SUBG_COD, A.MARC_COD, BODE_COD, BODE_NOM, ARTI_DIANALIS
      FROM ARTICULO A, GRUPO G, BODEGA B
      WHERE ARTI_COD >= :CODINI AND ARTI_COD <= :CODFIN AND A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :GRPFIN AND ARTI_DES >= :DESINI AND ARTI_DES <= :DESFIN AND
      G.GRUP_COD = A.GRUP_COD AND A.ESAR_COD <> 'I' AND ((SUCU_ID = :SUCURSAL) or (:SUCURSAL = 0)) AND
      (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN)))
      INTO :CODIGO, :NOMBRE, :UNIDAD, :DIAS, :CODGRUPO, :NOMGRUPO, :CODSUBG, :CODMARC, :CODBOD, :NOMBOD, :PROMEDIADO
      DO
        BEGIN
        NOMMARC = '';
        NOMSUBG = '';
        SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO :NOMMARC;
        SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
        EXECUTE PROCEDURE ultimo_costo(:CODIGO, :FECHA, :UNIDAD) returning_values (:COSTO);
        EXECUTE PROCEDURE costo_promedio(:CODIGO, :FECHA) RETURNING_VALUES :costopro;
        EXECUTE PROCEDURE DISPONIBILIDAD_ARTICULO(CODIGO, FECHA, :CODBOD) returning_values (:DISPONIBILIDAD, :EXIST, :PROMEDIO, :SALIDAS);
        /*ESTABLECER CUAL ES EL VALOR DE DIAS PARA PROMEDIO*/
        EXECUTE PROCEDURE lee_configuracion ('INVENTARIO', 'EXISTENCIAS', 'PROMEDIAR LAS SALIDAS DEL INVENTARIO CON EL NUMERO DE DIAS ASIGNADO A CADA ARTICULO') returning_values (:DIA_ART);
        if (DIA_ART = 'NO') then
          BEGIN
            EXECUTE PROCEDURE lee_configuracion ('INVENTARIO', 'EXISTENCIAS', 'NUMERO DE DIAS PARA PROMEDIO DE SALIDAS POR ARTICULO') returning_values (DIASC);
            PROMEDIADO = CAST(DIASC AS INTEGER);
          END
        if ((DISPONIBILIDAD < DIAS) and (PROMEDIO > 0))then
            SUGERIDO = (DIAS * PROMEDIO) - EXIST;
        ELSE
            SUGERIDO = 0;
        SELECT MAX(FACO_FECHA) FROM FACTURAS_COMPRA F, FACTURAS_COMPRAS_DETALLE D
            WHERE F.FACO_ID = D.faco_id AND D.ARTI_COD = :CODIGO AND FACO_FECHA <= :FECHA AND D.bode_cod = :codbod
            INTO :FECCOMPRA;
        if ((PROMEDIO > 0) or (EXIST <> 0) or (CEROS = 'S')) then
            SUSPEND;
        END
  END
ELSE
  BEGIN
  FOR SELECT ARTI_COD, ARTI_DES, ARTI_UNIDAD, ARTI_DIAS, A.GRUP_COD, GRUP_NOM, A.SUBG_COD, A.MARC_COD, ARTI_DIANALIS
      FROM ARTICULO A, GRUPO G
      WHERE ARTI_COD >= :CODINI AND ARTI_COD <= :CODFIN AND A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :GRPFIN AND ARTI_DES >= :DESINI AND ARTI_DES <= :DESFIN AND G.GRUP_COD = A.GRUP_COD AND
      A.ESAR_COD <> 'I' AND (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN)))
      INTO :CODIGO, :NOMBRE, :UNIDAD, :DIAS, :CODGRUPO, :NOMGRUPO, :CODSUBG, :CODMARC, :PROMEDIADO
      DO
        BEGIN
        NOMMARC = '';
        NOMSUBG = '';
        SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO :NOMMARC;
        SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
        EXECUTE PROCEDURE costo_promedio(:CODIGO, :FECHA) RETURNING_VALUES :costopro;
        EXECUTE PROCEDURE ultimo_costo(:CODIGO, :FECHA, :UNIDAD) returning_values (:COSTO);
        EXECUTE PROCEDURE DISPONIBILIDAD_TOTAL_ARTICULO(CODIGO, FECHA) returning_values (:DISPONIBILIDAD, :EXIST, :PROMEDIO, :SALIDAS);
        /*ESTABLECER CUAL ES EL VALOR DE DIAS PARA PROMEDIO*/
        EXECUTE PROCEDURE lee_configuracion ('INVENTARIO', 'EXISTENCIAS', 'PROMEDIAR LAS SALIDAS DEL INVENTARIO CON EL NUMERO DE DIAS ASIGNADO A CADA ARTICULO') returning_values (:DIA_ART);
        if (DIA_ART = 'NO') then
          BEGIN
            EXECUTE PROCEDURE lee_configuracion ('INVENTARIO', 'EXISTENCIAS', 'NUMERO DE DIAS PARA PROMEDIO DE SALIDAS POR ARTICULO') returning_values (DIASC);
            PROMEDIADO = CAST(DIASC AS INTEGER);
          END
        if ((DISPONIBILIDAD < DIAS) and (PROMEDIO > 0))then
            SUGERIDO = (DIAS * PROMEDIO) - EXIST;
        ELSE
            SUGERIDO = 0;
        SELECT MAX(FACO_FECHA) FROM FACTURAS_COMPRA F, FACTURAS_COMPRAS_DETALLE D
            WHERE F.FACO_ID = D.faco_id AND D.ARTI_COD = :CODIGO AND FACO_FECHA <= :FECHA
            INTO :FECCOMPRA;
        if ((PROMEDIO > 0) or (EXIST <> 0) or (CEROS = 'S')) then
            SUSPEND;
        END
  END
END

^

SET TERM ; ^

SET TERM ^ ;

ALTER TRIGGER NOTAS_CREDITO_PROVEEDOR_AI
AS
declare variable COSTO NUMERIC(18,2);
declare variable EXISTENCIA NUMERIC(18,4);
declare variable CODBOD VARCHAR(3);
BEGIN
if ((NEW.NCPR_ID <> 0) and (new.ncpr_anulado = 'N')) then
    BEGIN
    /* Registre el nuevo saldo del documento */
    INSERT INTO SALDOS_DOC_CXPAGAR (SDCP_TIPOREF, SDCP_IDREF, SDCP_FECHA, TERC_NIT, SDCP_RTEFTE, SDCP_RTIVA, SDCP_RTICA, SDCP_ABONO, SDCP_ABRTFTE, SDCP_ABRTIVA, SDCP_ABRTICA, SDCP_DEBITO, SDCP_MONTO, SDCP_TRM)
        VALUES (52, NEW.NCPR_ID, NEW.ncpr_fecha, NEW.terc_nit, (NEW.ncpr_rtftemonto * -1), (NEW.ncpr_rtivamonto * -1), (NEW.ncpr_rticamonto * -1), 0, 0, 0, 0, 'N', (NEW.ncpr_monto+NEW.ncpr_ivamonto)*-1, NEW.ncpr_trm);
    /* Registre el movimiento del proveedor */
    INSERT INTO MOVIMIENTO_PROVEEDOR (MVPR_ID, TERC_NIT, MVPR_TIPOREF, MVPR_IDREF, MVPR_FECHA, MVPR_VENCE, MVPR_CONC, MVPR_MONTO, MVPR_RTFTE, MVPR_RTIVA, MVPR_RTICA, MVPR_DEBITO, MVPR_ABONO, MVPR_PREFIJO, MVPR_NUMERO, MVPR_TRM)
      VALUES (GEN_ID(ID_MOVPROV, 1), NEW.TERC_NIT, 52, NEW.NCPR_ID, NEW.NCPR_FECHA, NEW.NCPR_FECHA, NEW.NCPR_CONC, NEW.NCPR_MONTO+NEW.NCPR_IVAMONTO, NEW.NCPR_RTFTEMONTO, NEW.NCPR_RTIVAMONTO, NEW.NCPR_RTICAMONTO, 'N', 'N', NEW.pref_pre, NEW.ncpr_numero, NEW.ncpr_trm);
    /* afecte el articulo */
    if (new.arti_cod <> '') then
        begin
        /* CALCULE EL NUEVO COSTO */
        execute procedure costo_promedio (new.arti_cod, new.ncpr_fecha) returning_values (:COSTO);
        execute procedure saldo_total_inventario (new.arti_cod, new.ncpr_fecha) returning_values (:EXISTENCIA);
        COSTO = (COSTO * EXISTENCIA - (NEW.ncpr_monto - NEW.ncpr_ivamonto)) / EXISTENCIA;
        FOR SELECT DISTINCT BODE_COD FROM EXISTENCIA WHERE ARTI_COD = NEW.ARTI_COD INTO :CODBOD do
            BEGIN
            execute procedure saldo_inventario (new.arti_cod, :CODBOD, new.ncpr_fecha) returning_values (:EXISTENCIA);
            /* SAQUE TODO LO QUE TENGA */
            INSERT INTO MOVIMIENTO_ARTICULO
              (ARTI_COD, MVAR_CONS, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM, TERC_NIT)
              VALUES(NEW.ARTI_COD, GEN_ID(ID_MOVARTI,1), :CODBOD, new.ncpr_fecha, 52, NEW.ncpr_id,
              new.ncpr_conc, :EXISTENCIA, 0, 'N', '', new.pref_pre, new.ncpr_numero, 1, new.terc_nit);
            /* META TODO CON EL NUEVO COSTO */
            INSERT INTO MOVIMIENTO_ARTICULO
              (ARTI_COD, MVAR_CONS, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM, TERC_NIT)
              VALUES(NEW.ARTI_COD, GEN_ID(ID_MOVARTI,1), :CODBOD, new.ncpr_fecha, 52, NEW.ncpr_id,
              new.ncpr_conc, :EXISTENCIA, :COSTO, 'S', '', new.pref_pre, new.ncpr_numero, 1, new.terc_nit);
            END
        /* RECORRA LAS LISTAS DE PRECIOS Y CAMBIE EL PRECIO */
        EXECUTE PROCEDURE CALCULA_PRECIOS(NEW.ARTI_COD, new.ncpr_fecha);
        end
    INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
        VALUES (USER, 52, NEW.ncpr_id, 'I', NEW.pref_pre || NEW.ncpr_numero);
    END
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER TRIGGER NOTAS_CREDITO_PROVEEDOR_AU
AS
declare variable ABONOS char(1);
declare variable consec INTEGER;
declare variable COSTO NUMERIC(18,2);
declare variable EXISTENCIA NUMERIC(18,4);
declare variable CODBOD VARCHAR(3);
BEGIN
if (new.ncpr_anulado = 'S') then
    begin
    select enco_consec from comprobante_encabezado where enco_tiporef = 52 and enco_idref = old.ncpr_id into :consec;
    if (NOT consec is null) then
      delete from comprobante_detalle where enco_consec = :consec;
    delete from comprobante_encabezado where enco_tiporef = 52 and enco_idref = old.ncpr_id;
    INSERT INTO AUDITORIA (AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
        VALUES (USER, 52, new.ncpr_id, 'A', NEW.pref_pre || NEW.ncpr_numero);
    end

/* BORRE EL REGISTRO PREVIO */
if ((old.ncpr_id <> 0) and (old.ncpr_anulado = 'N')) then
    begin
    /* Verifique si habia abonos a la nota */
    ABONOS = 'N';
    select 'S' FROM SALDOS_DOC_CXPAGAR WHERE SDCP_TIPOREF = 52 AND SDCP_IDREF = OLD.NCPR_ID AND SDCP_ABONO <> 0 INTO :ABONOS;
    if (ABONOS = 'N') then
        BEGIN
        /* BORRE EL REGISTRO PREVIO */
        delete from saldos_doc_cxpagar where sdcp_tiporef = 52 and sdcp_idref = old.ncpr_id;
        delete from movimiento_PROVEEDOR where (mvpr_tiporef = 52) and (mvpr_idref = old.ncpr_id);
        delete from movimiento_articulo where  (mvar_tipodoc = 52) and (mvar_idref = old.ncpr_id);
        END
    else
        exception DOCUMENTO_CON_ABONOS 'El descuento de proveedor ' || old.pref_pre || old.ncpr_numero || ' tiene abonos registrados.';
    end
if ((new.ncpr_id <> 0) and (new.ncpr_anulado = 'N')) then
    begin
    /* Registre el nuevo saldo del documento */
    INSERT INTO SALDOS_DOC_CXPAGAR (SDCP_TIPOREF, SDCP_IDREF, SDCP_FECHA, TERC_NIT, SDCP_RTEFTE, SDCP_RTIVA, SDCP_RTICA, SDCP_ABONO, SDCP_ABRTFTE, SDCP_ABRTIVA, SDCP_ABRTICA, SDCP_DEBITO, SDCP_MONTO, SDCP_TRM)
        VALUES (52, NEW.NCPR_ID, NEW.ncpr_fecha, NEW.terc_nit, (NEW.ncpr_rtftemonto * -1), (NEW.ncpr_rtivamonto * -1), (NEW.ncpr_rticamonto * -1), 0, 0, 0, 0, 'N', (NEW.ncpr_monto+NEW.ncpr_ivamonto)*-1, NEW.ncpr_trm);
    /* Registre el movimiento del proveedor */
    INSERT INTO MOVIMIENTO_PROVEEDOR (MVPR_ID, TERC_NIT, MVPR_TIPOREF, MVPR_IDREF, MVPR_FECHA, MVPR_VENCE, MVPR_CONC, MVPR_MONTO, MVPR_RTFTE, MVPR_RTIVA, MVPR_RTICA, MVPR_DEBITO, MVPR_ABONO, MVPR_PREFIJO, MVPR_NUMERO, MVPR_TRM)
        VALUES (GEN_ID(ID_MOVPROV, 1), NEW.TERC_NIT, 52, NEW.NCPR_ID, NEW.NCPR_FECHA, NEW.NCPR_FECHA, NEW.NCPR_CONC, NEW.NCPR_MONTO+NEW.ncpr_ivamonto, NEW.NCPR_RTFTEMONTO, NEW.NCPR_RTIVAMONTO, NEW.NCPR_RTICAMONTO, 'N', 'N', NEW.pref_pre, NEW.ncpr_numero, NEW.ncpr_trm);
    /* afecte el articulo */
    if (new.arti_cod <> '') then
        begin
        /* CALCULE EL NUEVO COSTO */
        execute procedure costo_promedio (new.arti_cod, new.ncpr_fecha) returning_values (:COSTO);
        execute procedure saldo_total_inventario (new.arti_cod, new.ncpr_fecha) returning_values (:EXISTENCIA);
        COSTO = (COSTO * EXISTENCIA - (NEW.ncpr_monto - NEW.ncpr_ivamonto)) / EXISTENCIA;
        FOR SELECT DISTINCT BODE_COD FROM EXISTENCIA WHERE ARTI_COD = NEW.ARTI_COD INTO :CODBOD do
            BEGIN
            execute procedure saldo_inventario (new.arti_cod, :CODBOD, new.ncpr_fecha) returning_values (:EXISTENCIA);
            /* SAQUE TODO LO QUE TENGA */
            INSERT INTO MOVIMIENTO_ARTICULO
                (ARTI_COD, MVAR_CONS, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM, TERC_NIT)
                VALUES(NEW.ARTI_COD, GEN_ID(ID_MOVARTI,1), :CODBOD, new.ncpr_fecha, 52, NEW.ncpr_id,
                new.ncpr_conc, :EXISTENCIA, 0, 'N', '', new.pref_pre, new.ncpr_numero, 1, new.terc_nit);
            /* META TODO CON EL NUEVO COSTO */
            INSERT INTO MOVIMIENTO_ARTICULO
                (ARTI_COD, MVAR_CONS, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM, TERC_NIT)
                VALUES(NEW.ARTI_COD, GEN_ID(ID_MOVARTI,1), :CODBOD, new.ncpr_fecha, 52, NEW.ncpr_id,
                new.ncpr_conc, :EXISTENCIA, :COSTO, 'S', '', new.pref_pre, new.ncpr_numero, 1, new.terc_nit);
            END
        /* RECORRA LAS LISTAS DE PRECIOS Y CAMBIE EL PRECIO */
        EXECUTE PROCEDURE CALCULA_PRECIOS(NEW.ARTI_COD, new.ncpr_fecha);
        end
    INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
        VALUES (USER, 52, NEW.ncpr_id, 'U', NEW.pref_pre || NEW.ncpr_numero);
    end
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER PROCEDURE SALDO_INICIAL_TOTAL_INV(
    ARTICULO VARCHAR(15),
    FECHA DATE)
RETURNS (
    SALDO NUMERIC(18,4))
AS
DECLARE VARIABLE SALDO_BOD NUMERIC(15,4);
DECLARE VARIABLE BOD VARCHAR(2);
BEGIN
  SALDO = 0;
  FOR
    SELECT BODE_COD FROM BODEGA WHERE BODE_ACTIVA = 'S' INTO :BOD
  DO
    BEGIN
    EXECUTE PROCEDURE saldo_inicial_inventario(:ARTICULO, :FECHA, :BOD) RETURNING_VALUES :SALDO_BOD;
    SALDO = SALDO + SALDO_BOD;
    END
if (saldo is null) then
    SALDO = 0;
SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE EXISTENCIAS_DESDE_HASTA(
    FECHA DATE,
    ARTINI VARCHAR(20),
    ARTFIN VARCHAR(20),
    GRPINI VARCHAR(3),
    GRPFIN VARCHAR(3),
    BODINI VARCHAR(2),
    BODFIN VARCHAR(2),
    ORDEN CHAR(1),
    AGRUPA CHAR(1),
    DETALLE CHAR(1),
    RESERVA CHAR(1),
    ENPESO CHAR(1),
    SUCURSAL INTEGER)
RETURNS (
    CANT NUMERIC(18,4),
    COSTO NUMERIC(18,2),
    COSTO_LOTE NUMERIC(18,2),
    CODIGO VARCHAR(15),
    NOMBRE VARCHAR(60),
    UNIDAD VARCHAR(8),
    STAND VARCHAR(15),
    CODGRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    CODSUBG VARCHAR(3),
    NOMSUBG VARCHAR(30),
    CODMARC VARCHAR(3),
    NOMMARC VARCHAR(30),
    CODBOD VARCHAR(2),
    LOTE VARCHAR(15),
    NOMBOD VARCHAR(30),
    COSTOTOT NUMERIC(18,2),
    ULTCOSTO NUMERIC(18,2),
    FECHACOSTO DATE,
    CONSUMO NUMERIC(18,2),
    RESERVADO NUMERIC(18,4),
    ORDENADO NUMERIC(18,4),
    IVA NUMERIC(9,2),
    PESOUNIT NUMERIC(18,4),
    PESOTOTAL NUMERIC(18,4),
    CODBAR VARCHAR(20))
AS
declare variable exist char(1);
declare variable codini varchar(20);
declare variable codfin varchar(20);
declare variable desini varchar(20);
declare variable desfin varchar(20);
declare variable ordenc numeric(18,4);
declare variable pedido numeric(18,4);
declare variable ok char(1);
declare variable id integer;
declare variable item integer;
declare variable und varchar(8);
declare variable factor numeric(18,4);
declare variable cant2 numeric(18,4);
declare variable PEDAUTO CHAR(2);
BEGIN /*$$IBE$$ 
if (ORDEN = 'C') then
    BEGIN
    CODINI = ARTINI;
    CODFIN = ARTFIN;
    DESINI = '';
    DESFIN = 'zz';
    END
ELSE
    BEGIN
    DESINI = ARTINI;
    DESFIN = ARTFIN;
    CODINI = '';
    CODFIN = 'zz';
    END
EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION', 'FACTURAS', 'GENERAR PEDIDO AUTOMATICAMENTE CON LA FACTURA') returning_values (pedauto);
if (DETALLE = 'B') then
  BEGIN
  FOR SELECT ARTI_COD, ARTI_DES, ARTI_UNIDAD, ARTI_EXIST, TAIV_PORC, A.GRUP_COD, A.SUBG_COD, A.MARC_COD, BODE_COD, BODE_NOM, ARTI_CONSUMO, ARTI_PESO/1000
      FROM ARTICULO A, BODEGA B, TARIFA_IVA T
      WHERE ARTI_COD >= :CODINI AND ARTI_COD <= :CODFIN AND ARTI_DES >= :DESINI AND ARTI_DES <= :DESFIN AND ESAR_COD <> 'I' AND BODE_COD >= :BODINI AND
      BODE_COD <= :BODFIN AND ((SUCU_ID = :SUCURSAL) or (:SUCURSAL = 0)) AND A.TAIV_COD = T.TAIV_COD
      INTO :CODIGO, :NOMBRE, :UNIDAD, :EXIST, :IVA, :CODGRUPO, :CODSUBG, :CODMARC, :CODBOD, :NOMBOD, :CONSUMO, :pesounit
      DO
        BEGIN
        OK = 'N';
        if (AGRUPA = 'G') then
            BEGIN
            if ((CODGRUPO >= GRPINI) AND (CODGRUPO <= GRPFIN)) then
                OK = 'S';
            end
        ELSE
            if (AGRUPA = 'M') then
                BEGIN
                if ((CODMARC >= GRPINI) AND (CODMARC <= GRPFIN)) then
                    OK = 'S';
                END
        if (OK = 'S') then
            BEGIN
            NOMGRUPO = '';
            NOMMARC = '';
            NOMSUBG = '';
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            SELECT MAX(COBA_COD) FROM BARRAS_ARTICULO WHERE ARTI_COD = :codigo AND COBA_UNIDAD = :unidad INTO :codbar;
            if (CODBAR IS NULL) then
                CODBAR = CODIGO;
            if (EXIST <> 'N') then
                BEGIN
                SELECT STAND_COD FROM STANDS WHERE ARTI_COD = :CODIGO AND STAND_BODEGA = :CODBOD INTO :STAND;
                EXECUTE PROCEDURE SALDO_INICIAL_INVENTARIO(CODIGO, FECHA, :CODBOD) returning_values (CANT);
                EXECUTE PROCEDURE COSTO_PROMEDIO_UNIDAD(CODIGO, FECHA, UNIDAD) returning_values (COSTO);
                EXECUTE PROCEDURE ULTIMO_COSTO(CODIGO, FECHA, UNIDAD) returning_values (ULTCOSTO);
                SELECT MAX(MVAR_FECHA) FROM MOVIMIENTO_ARTICULO WHERE ARTI_COD = :CODIGO AND MVAR_ENTRADA = 'S' AND MVAR_FECHA <= :FECHA INTO :FECHACOSTO;
                COSTOTOT = :CANT * :COSTO;
                CONSUMO = CONSUMO * CANT;
                if (RESERVA = 'S') then
                    BEGIN
                    SELECT SUM(ORID_ENTREGAR)
                        FROM ORDENINVENTARIO_DETALLE OD, ordenes_inventario O
                        WHERE O.ORIN_ID = OD.ORIN_ID AND ARTI_COD = :CODIGO AND ORIN_FECHA <= :FECHA AND ORIN_FECLLEGA >= :FECHA AND ORID_ANULADO = 'N' AND OD.BODE_COD = :CODBOD
                        INTO :ORDENADO;
                    if (ORDENADO IS NULL) then
                        ORDENADO = 0;
                    ORDENC = 0;
                    FOR SELECT O.ORDC_ID, OCDE_ITEM, OCDE_CANT * OCDE_FACTOR
                        FROM ORDENES_COMPRA O, ORDENES_COMPRA_DETALLE OD
                        WHERE O.ORDC_ID = OD.ORDC_ID AND OD.ARTI_COD = :CODIGO AND (ORDC_FECHA+ORDC_VALIDEZ) >= :FECHA AND ORDC_FECHA <= :FECHA AND OCDE_ANULADO = 'N' AND OD.BODE_COD = :CODBOD
                        INTO :ID, :ITEM, :CANT2
                        do
                        BEGIN
                        EXECUTE PROCEDURE FALTANTE(23, 21, ID, ITEM) returning_values (PEDIDO, UND, FACTOR);
                        if (PEDIDO * FACTOR = CANT2) then  $$IBE$$*/ /* SI NO SE HA FACTURADO MIRE A VER SI SE REMISIONO */ /*$$IBE$$ 
                            EXECUTE PROCEDURE FALTANTE(23, 22, ID, ITEM) returning_values (PEDIDO, UND, FACTOR);
                        if (PEDIDO IS NULL) then
                            PEDIDO = 0;
                        ORDENC = ORDENC + PEDIDO * FACTOR;
                        END
                    ORDENADO = ORDENADO + ORDENC;
                    SELECT SUM(RSDE_LIBERAR)
                        FROM RESERVAS_DETALLE RD, RESERVAS R
                        WHERE R.RESE_ID = RD.RESE_ID AND ARTI_COD = :CODIGO AND RESE_FECHA <= :FECHA AND RESE_VENCE >= :FECHA AND RD.BODE_COD = :CODBOD AND RSDE_ANULADO = 'N'
                        INTO :RESERVADO;
                    if (RESERVADO IS NULL) then
                        RESERVADO = 0;
                    PEDIDO = 0;
                    FOR SELECT P.PEDI_ID, PEDE_ITEM, PEDE_CANT * PEDE_FACTOR
                        FROM PEDIDOS P, PEDIDOS_DETALLE PD
                        WHERE P.PEDI_ID = PD.PEDI_ID AND PD.ARTI_COD = :CODIGO AND (PEDI_FECHA+PEDI_VALIDEZ) >= :FECHA AND PEDI_FECHA <= :FECHA AND PEDE_ANULADO = 'N' AND BODE_COD = :CODBOD
                        INTO :ID, :ITEM, :CANT2
                        do
                        BEGIN
                        EXECUTE PROCEDURE FALTANTE(34, 31, ID, ITEM) returning_values (ORDENC, UND, FACTOR);
                        if ((ORDENC * FACTOR = CANT2) or (PEDAUTO = 'SI')) then  $$IBE$$*/ /* SI NO SE HA FACTURADO MIRE A VER SI SE REMISIONO */ /*$$IBE$$ 
                            EXECUTE PROCEDURE FALTANTE(34, 32, ID, ITEM) returning_values (ORDENC, UND, FACTOR);
                        if (ORDENC IS NULL) then
                            ORDENC = 0;
                        PEDIDO = PEDIDO + ORDENC * FACTOR;
                        END
                    RESERVADO = RESERVADO + PEDIDO;
                    END
                ELSE
                    BEGIN
                    RESERVADO = 0;
                    ORDENADO = 0;
                    END
                if (ENPESO = 'S') then
                    BEGIN
                    if (pesounit IS NULL) then
                        pesounit = 0;
                    if (PESOUNIT <> 0) then
                        BEGIN
                        pesototal = PESOUNIT * cant;
                        SUSPEND;
                        END
                    END
                ELSE
                    SUSPEND;
                END
            END
        END
  END

if (DETALLE = 'L') then
  BEGIN
  FOR SELECT A.ARTI_COD, ARTI_DES, ARTI_UNIDAD, ARTI_EXIST, TAIV_PORC, A.GRUP_COD, A.SUBG_COD, A.MARC_COD, L.lote_nro, L.lote_nro||' - '||L.lote_vence, ARTI_CONSUMO,l.bode_cod, L.lote_saldo,l.lote_costo, ARTI_PESO/1000
      FROM ARTICULO A, LOTES l, TARIFA_IVA T
      WHERE A.ARTI_COD >= '0' AND A.ARTI_COD <= 'zz' AND ARTI_DES >= '' AND ARTI_DES <= 'zz' AND ESAR_COD <> 'I' AND A.TAIV_COD = T.TAIV_COD and a.arti_cod = l.arti_cod
      INTO :CODIGO, :NOMBRE, :UNIDAD, :EXIST, :IVA, :CODGRUPO, :CODSUBG, :CODMARC, :LOTE, :NOMBOD, :CONSUMO, :codbod, :cant, :costo_lote, :pesounit
      DO
        BEGIN
        OK = 'N';
        if (AGRUPA = 'G') then
            BEGIN
            if ((CODGRUPO >= GRPINI) AND (CODGRUPO <= GRPFIN)) then
                OK = 'S';
            end
        ELSE
            if (AGRUPA = 'M') then
                BEGIN
                if ((CODMARC >= GRPINI) AND (CODMARC <= GRPFIN)) then
                    OK = 'S';
                END
        if (OK = 'S') then
            BEGIN
            NOMGRUPO = '';
            NOMMARC = '';
            NOMSUBG = '';
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            SELECT MAX(COBA_COD) FROM BARRAS_ARTICULO WHERE ARTI_COD = :codigo AND COBA_UNIDAD = :unidad INTO :codbar;
            if (CODBAR IS NULL) then
                CODBAR = CODIGO;

            if (EXIST <> 'N') then
                BEGIN
                EXECUTE PROCEDURE COSTO_PROMEDIO_UNIDAD(CODIGO, FECHA, UNIDAD) returning_values (COSTO);
                EXECUTE PROCEDURE ULTIMO_COSTO(CODIGO, FECHA, UNIDAD) returning_values (ULTCOSTO);
                SELECT MAX(MVAR_FECHA) FROM MOVIMIENTO_ARTICULO WHERE ARTI_COD = :CODIGO AND MVAR_ENTRADA = 'S' AND MVAR_FECHA <= :FECHA INTO :FECHACOSTO;
                COSTOTOT = :CANT * :COSTO;
                CONSUMO = CONSUMO * CANT;
                if (RESERVA = 'S') then
                    BEGIN
                    SELECT SUM(ORID_ENTREGAR)
                        FROM ORDENINVENTARIO_DETALLE OD, ordenes_inventario O
                        WHERE O.ORIN_ID = OD.ORIN_ID AND ARTI_COD = :CODIGO AND ORIN_FECHA <= :FECHA AND ORIN_FECLLEGA >= :FECHA AND ORID_ANULADO = 'N'
                        INTO :ORDENADO;
                    if (ORDENADO IS NULL) then
                        ORDENADO = 0;
                    ORDENC = 0;
                    FOR SELECT O.ORDC_ID, OCDE_ITEM, OCDE_CANT * OCDE_FACTOR
                        FROM ORDENES_COMPRA O, ORDENES_COMPRA_DETALLE OD
                        WHERE O.ORDC_ID = OD.ORDC_ID AND OD.ARTI_COD = :CODIGO AND (ORDC_FECHA+ORDC_VALIDEZ) >= :FECHA AND ORDC_FECHA <= :FECHA AND OCDE_ANULADO = 'N'
                        INTO :ID, :ITEM, :CANT2
                        do
                        BEGIN
                        EXECUTE PROCEDURE FALTANTE(23, 21, ID, ITEM) returning_values (PEDIDO, UND, FACTOR);
                        if (PEDIDO * FACTOR = CANT2) then  $$IBE$$*/ /* SI NO SE HA FACTURADO MIRE A VER SI SE REMISIONO */ /*$$IBE$$ 
                            EXECUTE PROCEDURE FALTANTE(23, 22, ID, ITEM) returning_values (PEDIDO, UND, FACTOR);
                        if (PEDIDO IS NULL) then
                            PEDIDO = 0;
                        ORDENC = ORDENC + PEDIDO * FACTOR;
                        END
                    ORDENADO = ORDENADO + ORDENC;
                    SELECT SUM(RSDE_LIBERAR)
                        FROM RESERVAS_DETALLE RD, RESERVAS R
                        WHERE R.RESE_ID = RD.RESE_ID AND ARTI_COD = :CODIGO AND RESE_FECHA <= :FECHA AND RESE_VENCE >= :FECHA AND RSDE_ANULADO = 'N'
                        INTO :RESERVADO;
                    if (RESERVADO IS NULL) then
                        RESERVADO = 0;
                    PEDIDO = 0;
                    FOR SELECT P.PEDI_ID, PEDE_ITEM, PEDE_CANT * PEDE_FACTOR
                        FROM PEDIDOS P, PEDIDOS_DETALLE PD
                        WHERE P.PEDI_ID = PD.PEDI_ID AND PD.ARTI_COD = :CODIGO AND (PEDI_FECHA+PEDI_VALIDEZ) >= :FECHA AND PEDI_FECHA <= :FECHA AND PEDE_ANULADO = 'N'
                        INTO :ID, :ITEM, :CANT2
                        do
                        BEGIN
                        EXECUTE PROCEDURE FALTANTE(34, 31, ID, ITEM) returning_values (ORDENC, UND, FACTOR);
                        if ((ORDENC * FACTOR = CANT2) or (PEDAUTO = 'SI')) then  $$IBE$$*/ /* SI NO SE HA FACTURADO MIRE A VER SI SE REMISIONO */ /*$$IBE$$ 
                            EXECUTE PROCEDURE FALTANTE(34, 32, ID, ITEM) returning_values (ORDENC, UND, FACTOR);
                        if (ORDENC IS NULL) then
                            ORDENC = 0;
                        PEDIDO = PEDIDO + ORDENC * FACTOR;
                        END
                    RESERVADO = RESERVADO + PEDIDO;
                    END
                ELSE
                    BEGIN
                    RESERVADO = 0;
                    ORDENADO = 0;
                    END
                if (ENPESO = 'S') then
                    BEGIN
                    if (pesounit IS NULL) then
                        pesounit = 0;
                    if (PESOUNIT <> 0) then
                        BEGIN
                        pesototal = PESOUNIT * cant;
                        SUSPEND;
                        END
                    END
                ELSE
                    SUSPEND;
                END
            END
        END
  end
if (DETALLE = 'N') then
  BEGIN
  FOR SELECT ARTI_COD, ARTI_DES, ARTI_UNIDAD, ARTI_EXIST, TAIV_PORC, A.GRUP_COD, A.SUBG_COD, A.MARC_COD, ARTI_CONSUMO, ARTI_PESO/1000
      FROM ARTICULO A, TARIFA_IVA T
      WHERE ARTI_COD >= :CODINI AND ARTI_COD <= :CODFIN AND ARTI_DES >= :DESINI AND ARTI_DES <= :DESFIN AND ESAR_COD <> 'I' AND A.TAIV_COD = T.TAIV_COD
      INTO :CODIGO, :NOMBRE, :UNIDAD, :EXIST, :IVA, :CODGRUPO, :CODSUBG, :CODMARC, :CONSUMO, :pesounit
      DO
        BEGIN
        OK = 'N';
        if (AGRUPA = 'G') then
            BEGIN
            if ((GRPINI = '0') AND (GRPFIN = 'zz')) then
                OK = 'S';
            else
                if ((CODGRUPO >= GRPINI) AND (CODGRUPO <= GRPFIN)) then
                    OK = 'S';
            end
        ELSE
            if (AGRUPA = 'M') then
                BEGIN
                if ((GRPINI = '0') AND (GRPFIN = 'zzz')) then
                    OK = 'S';
                else
                    if ((CODMARC >= GRPINI) AND (CODMARC <= GRPFIN)) then
                        OK = 'S';
                END
        if (OK = 'S') then
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            SELECT MAX(COBA_COD) FROM BARRAS_ARTICULO WHERE ARTI_COD = :codigo AND COBA_UNIDAD = :unidad INTO :codbar;
            if (CODBAR IS NULL) then
                CODBAR = CODIGO;

            if (EXIST <> 'N') then
                BEGIN
                EXECUTE PROCEDURE SALDO_INICIAL_TOTAL_INV(CODIGO, FECHA) returning_values (CANT);
                EXECUTE PROCEDURE COSTO_PROMEDIO_UNIDAD(CODIGO, FECHA, UNIDAD) returning_values (COSTO);
                EXECUTE PROCEDURE ULTIMO_COSTO(CODIGO, FECHA, UNIDAD) returning_values (ULTCOSTO);
                SELECT MAX(MVAR_FECHA) FROM MOVIMIENTO_ARTICULO WHERE ARTI_COD = :CODIGO AND MVAR_ENTRADA = 'S' AND MVAR_FECHA <= :FECHA INTO :FECHACOSTO;
                COSTOTOT = :CANT * :COSTO;
                CONSUMO = CONSUMO * CANT;
                if (RESERVA = 'S') then
                    BEGIN
                    SELECT SUM(ORID_ENTREGAR)
                        FROM ORDENINVENTARIO_DETALLE OD, ordenes_inventario O
                        WHERE O.ORIN_ID = OD.ORIN_ID AND ARTI_COD = :CODIGO AND ORIN_FECHA <= :FECHA AND ORIN_FECLLEGA >= :FECHA AND ORID_ANULADO = 'N'
                        INTO :ORDENADO;
                        if (ORDENADO IS NULL) then
                            ORDENADO = 0;
                    ORDENC = 0;
                    FOR SELECT O.ORDC_ID, OCDE_ITEM, OCDE_CANT * OCDE_FACTOR
                        FROM ORDENES_COMPRA O, ORDENES_COMPRA_DETALLE OD
                        WHERE O.ORDC_ID = OD.ORDC_ID AND OD.ARTI_COD = :CODIGO AND (ORDC_FECHA+ORDC_VALIDEZ) >= :FECHA AND ORDC_FECHA <= :FECHA AND OCDE_ANULADO = 'N'
                        INTO :ID, :ITEM, :CANT2
                        do
                        BEGIN
                        EXECUTE PROCEDURE FALTANTE(23, 21, ID, ITEM) returning_values (PEDIDO, UND, FACTOR);
                        if (PEDIDO * FACTOR = CANT2) then  $$IBE$$*/ /* SI NO SE HA FACTURADO MIRE A VER SI SE REMISIONO */ /*$$IBE$$ 
                            EXECUTE PROCEDURE FALTANTE(23, 22, ID, ITEM) returning_values (PEDIDO, UND, FACTOR);
                        if (PEDIDO IS NULL) then
                            PEDIDO = 0;
                        ORDENC = ORDENC + PEDIDO * FACTOR;
                        END
                    ORDENADO = ORDENADO + ORDENC;
                    SELECT SUM(RSDE_LIBERAR)
                        FROM RESERVAS_DETALLE RD, RESERVAS R
                        WHERE R.RESE_ID = RD.RESE_ID AND ARTI_COD = :CODIGO AND RESE_FECHA <= :FECHA AND RESE_VENCE >= :FECHA AND RSDE_ANULADO = 'N'
                        INTO :RESERVADO;
                    if (RESERVADO IS NULL) then
                        RESERVADO = 0;
                    PEDIDO = 0;
                    FOR SELECT P.PEDI_ID, PEDE_ITEM, PEDE_CANT * PEDE_FACTOR
                        FROM PEDIDOS P, PEDIDOS_DETALLE PD, PUNTO_VENTA PT
                        WHERE P.PEDI_ID = PD.PEDI_ID AND PD.ARTI_COD = :CODIGO AND PT.ptvt_id = P.PTVT_ID AND (PEDI_FECHA+PEDI_VALIDEZ) >= :FECHA AND PEDI_FECHA <= :FECHA AND PEDE_ANULADO = 'N'
                        INTO :ID, :ITEM, :CANT2
                        do
                        BEGIN
                        EXECUTE PROCEDURE FALTANTE(34, 31, ID, ITEM) returning_values (ORDENC, UND, FACTOR);
                        if ((ORDENC * FACTOR = CANT2) or (PEDAUTO = 'SI')) then  $$IBE$$*/ /* SI NO SE HA FACTURADO MIRE A VER SI SE REMISIONO */ /*$$IBE$$ 
                            EXECUTE PROCEDURE FALTANTE(34, 32, ID, ITEM) returning_values (ORDENC, UND, FACTOR);
                        if (ORDENC IS NULL) then
                            ORDENC = 0;
                        PEDIDO = PEDIDO + ORDENC * FACTOR;
                        END
                    if (PEDIDO IS NULL) then
                        PEDIDO = 0;
                    RESERVADO = RESERVADO + PEDIDO;
                    END
                ELSE
                    BEGIN
                    RESERVADO = 0;
                    ORDENADO = 0;
                    END
                if (ENPESO = 'S') then
                    BEGIN
                    if (pesounit IS NULL) then
                        pesounit = 0;
                    if (PESOUNIT <> 0) then
                        BEGIN
                        pesototal = PESOUNIT * cant;
                        SUSPEND;
                        END
                    END
                ELSE
                    SUSPEND;
                END
            END
        END
  END
 $$IBE$$*/ SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE INVENTARIO_FAMILIA(
    FECHA DATE,
    FAMILIA VARCHAR(20))
RETURNS (
    ARTICULO VARCHAR(20),
    INTERNO VARCHAR(20),
    DESCRIPCION VARCHAR(60),
    CANTIDAD NUMERIC(18,2),
    UNIDAD VARCHAR(8),
    TOTAL NUMERIC(18,2))
AS
declare variable COSTO NUMERIC(18,4);
begin /*$$IBE$$ 
FOR SELECT A.ARTI_COD, ARTI_DES, ARTI_UNIDAD, p.pvar_cod FROM ARTICULO A, PROVEEDOR_ARTICULO P
    WHERE ESAR_COD <> 'I' AND A.arti_cod = P.arti_cod AND P.terc_nit = :FAMILIA
    INTO :ARTICULO, :descripcion, :UNIDAD, :INTERNO
    DO
    BEGIN
    EXECUTE PROCEDURE SALDO_INICIAL_TOTAL_INV(ARTICULO, FECHA) returning_values (cantidad);
    EXECUTE PROCEDURE COSTO_PROMEDIO_UNIDAD(ARTICULO, FECHA, UNIDAD) returning_values (COSTO);
    TOTAL = COSTO * CANTIDAD;
    suspend;
    END
 $$IBE$$*/ SUSPEND;
end
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE KARDEX_DESDE_HASTA(
    ARTICULO VARCHAR(15),
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    INICIAL_CANT NUMERIC(18,4),
    INICIAL_PESOS NUMERIC(18,2),
    ENT_CANT NUMERIC(18,4),
    ENT_PESOS NUMERIC(18,2),
    SAL_CANT NUMERIC(18,4),
    SAL_PESOS NUMERIC(18,2),
    FINAL_CANT NUMERIC(18,4),
    FINAL_PESOS NUMERIC(18,2))
AS
BEGIN /*$$IBE$$ 
  EXECUTE PROCEDURE SALDO_INICIAL_TOTAL_INV(ARTICULO, FECINI) returning_values (INICIAL_CANT);
  EXECUTE PROCEDURE VALOR_INICIAL_INVENTARIO(ARTICULO, FECINI) returning_values (INICIAL_PESOS);
  SELECT SUM(COST_ENTC), SUM(COST_ENTP), SUM(COST_SALC), SUM(COST_SALP) FROM COSTOS
    WHERE (COST_FECHA >= :FECINI) AND (COST_FECHA <= :FECFIN) AND
          (ARTI_COD = :ARTICULO)
    INTO :ENT_CANT, :ENT_PESOS, :SAL_CANT, :SAL_PESOS;
  if (ENT_CANT IS NULL) then
    ENT_CANT = 0;
  if (ENT_PESOS IS NULL) then
    ENT_PESOS = 0;
  if (SAL_CANT IS NULL) then
    SAL_CANT = 0;
  if (SAL_PESOS IS NULL) then
    SAL_PESOS = 0;
  FINAL_CANT = INICIAL_CANT + ENT_CANT - SAL_CANT;
  FINAL_PESOS = INICIAL_PESOS + ENT_PESOS - SAL_PESOS;
  SUSPEND;
 $$IBE$$*/ SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE REP_EXISTENCIAS_PRECIOS(
    ARTINI VARCHAR(20),
    ARTFIN VARCHAR(20),
    GRPINI VARCHAR(2),
    GRPFIN VARCHAR(2),
    ORDEN CHAR(1),
    LISTA INTEGER,
    FECHA DATE,
    BODINI VARCHAR(2),
    BODFIN VARCHAR(2),
    TODAS CHAR(1),
    IVAINC CHAR(1),
    SINBOD CHAR(1),
    SUBEMPRESA INTEGER)
RETURNS (
    CODIGO VARCHAR(15),
    NOMBRE VARCHAR(60),
    UNIDAD VARCHAR(8),
    CODGRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    CODSUBG VARCHAR(3),
    NOMSUBG VARCHAR(30),
    CODMARC VARCHAR(3),
    NOMMARC VARCHAR(30),
    NOMLISTA VARCHAR(30),
    PRECIO NUMERIC(18,2),
    MARGEN NUMERIC(9,2),
    IVA NUMERIC(9,2),
    CODBOD VARCHAR(2),
    NOMBOD VARCHAR(30),
    CANT NUMERIC(18,4),
    COSTOTOT NUMERIC(18,2))
AS
DECLARE VARIABLE EXIST CHAR(1);
DECLARE VARIABLE CODINI VARCHAR(20);
DECLARE VARIABLE CODFIN VARCHAR(20);
DECLARE VARIABLE DESINI VARCHAR(20);
DECLARE VARIABLE DESFIN VARCHAR(20);
DECLARE VARIABLE FECINI DATE;
DECLARE VARIABLE FECFIN DATE;
DECLARE VARIABLE UTIL NUMERIC(9,2);
DECLARE VARIABLE MOU CHAR(10);
DECLARE VARIABLE LISIVA CHAR(1);
BEGIN /*$$IBE$$ 
if (ORDEN = 'C') then
    BEGIN
    CODINI = ARTINI;
    CODFIN = ARTFIN;
    DESINI = '';
    DESFIN = 'zz';
    END
ELSE
    BEGIN
    DESINI = ARTINI;
    DESFIN = ARTFIN;
    CODINI = '';
    CODFIN = 'zz';
    END
    
EXECUTE PROCEDURE LEE_CONFIGURACION ('FACTURACION', 'ARTICULOS', 'SUGERIR PRECIOS CON PORCENTAJE DE MARGEN O UTILIDAD') returning_values (MOU);
    
FOR SELECT ARTI_COD, ARTI_DES, ARTI_UNIDAD, ARTI_EXIST, A.GRUP_COD, A.SUBG_COD, A.MARC_COD, TAIV_PORC
    FROM ARTICULO A, TARIFA_IVA T
    WHERE ARTI_COD >= :CODINI AND ARTI_COD <= :CODFIN AND A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :GRPFIN AND
    ARTI_DES >= :DESINI AND ARTI_DES <= :DESFIN AND ESAR_COD <> 'I' AND A.TAIV_COD = T.TAIV_COD
    INTO :CODIGO, :NOMBRE, :UNIDAD, :EXIST, :CODGRUPO, :CODSUBG, :CODMARC, :IVA
    DO
    BEGIN
    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
    if (EXIST <> 'N') then
        BEGIN
        if (LISTA = 255) then
            BEGIN
            if (TODAS = 'N') then
                begin
                 $$IBE$$*/ /* Busque las listas validas hoy */ /*$$IBE$$ 
                FOR SELECT LIPR_NOM, LIPR_FECINI, LIPR_FECFIN, PRAR_FIJO, PRAR_MARGEN, PRAR_UTIL, LIPR_MODIF
                    FROM LISTA_PRECIOS L, PRECIOS_ARTICULO P
                    WHERE L.LIPR_COD = P.LIPR_COD AND ARTI_COD = :CODIGO
                    INTO :NOMLISTA, :FECINI, :FECFIN, :PRECIO, :MARGEN, :UTIL, :LISIVA
                    DO
                      BEGIN
                      if (MOU = 'UTILIDAD') then
                        MARGEN = UTIL;
                      if (IVAINC = 'S') THEN
                        BEGIN
                        if (LISIVA = 'N') then
                            PRECIO = PRECIO * (1 + (IVA/100));
                        END
                      END
                end   
            ELSE
                FOR SELECT LIPR_NOM, PRAR_FIJO, PRAR_MARGEN, PRAR_UTIL, LIPR_MODIF
                    FROM LISTA_PRECIOS L, PRECIOS_ARTICULO P
                    WHERE L.LIPR_COD = P.LIPR_COD AND ARTI_COD = :CODIGO
                    INTO :NOMLISTA, :PRECIO, :MARGEN, :UTIL, :LISIVA
                    DO
                    BEGIN
                    EXECUTE PROCEDURE LEE_CONFIGURACION ('FACTURACION', 'ARTICULOS', 'SUGERIR PRECIOS CON PORCENTAJE DE MARGEN O UTILIDAD') returning_values (MOU);
                    if (MOU = 'UTILIDAD') then
                        MARGEN = UTIL;
                    if (IVAINC = 'S') THEN
                        BEGIN
                        if (LISIVA = 'N') then
                            PRECIO = PRECIO * (1 + (IVA/100));
                        END
                    END
            END  $$IBE$$*/ /* 255 */ /*$$IBE$$ 
        ELSE
            BEGIN
            if (TODAS = 'N') then
                begin
                 $$IBE$$*/ /* Busque las listas validas hoy */ /*$$IBE$$ 
                FOR SELECT LIPR_NOM, LIPR_FECINI, LIPR_FECFIN, PRAR_FIJO, PRAR_MARGEN, PRAR_UTIL, LIPR_MODIF
                    FROM LISTA_PRECIOS L, PRECIOS_ARTICULO P
                    WHERE L.LIPR_COD = P.LIPR_COD AND ARTI_COD = :CODIGO AND L.LIPR_COD = :LISTA
                    INTO :NOMLISTA, :FECINI, :FECFIN, :PRECIO, :MARGEN, :UTIL, :LISIVA
                    DO
                    BEGIN
                    if (MOU = 'UTILIDAD') then
                        MARGEN = UTIL;
                    if (IVAINC = 'S') THEN
                        BEGIN
                        if (LISIVA = 'N') then
                            PRECIO = PRECIO * (1 + (IVA/100));
                        END
                    END
                end
            ELSE
                FOR SELECT LIPR_NOM, PRAR_FIJO, PRAR_MARGEN, PRAR_UTIL
                    FROM LISTA_PRECIOS L, PRECIOS_ARTICULO P
                    WHERE L.LIPR_COD = P.LIPR_COD AND ARTI_COD = :CODIGO AND L.LIPR_COD = :LISTA
                    INTO :NOMLISTA, :PRECIO, :MARGEN, :UTIL
                    DO
                    BEGIN
                    if (MOU = 'UTILIDAD') then
                        MARGEN = UTIL;
                    if (IVAINC = 'S') THEN
                        BEGIN
                        if (LISIVA = 'NO') then
                            PRECIO = PRECIO * (1 + (IVA/100));
                        END
                    END
            END
                      
        if (SINBOD = 'S') then
            BEGIN
            EXECUTE PROCEDURE SALDO_INICIAL_TOTAL_INV(CODIGO, FECHA) returning_values (CANT);
            COSTOTOT = CANT * PRECIO;
            if (FECINI is null) then
                SUSPEND;
            else
                if ((FECINI <= :FECHA) AND (FECFIN >= :FECHA)) Then
                    SUSPEND;
            END
        ELSE
            BEGIN
            FOR SELECT BODE_COD, BODE_NOM FROM BODEGA B
                WHERE BODE_COD >= :BODINI AND BODE_COD <= :BODFIN AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                INTO :CODBOD, :NOMBOD
                DO
                BEGIN
                EXECUTE PROCEDURE SALDO_INICIAL_INVENTARIO(CODIGO, FECHA, :CODBOD) returning_values (CANT);
                        
                COSTOTOT = CANT * PRECIO;
                if (FECINI is null) then
                    SUSPEND;
                else
                    if ((FECINI <= :FECHA) AND (FECFIN >= :FECHA)) Then
                        SUSPEND;
                END
            END
        END
    END
 $$IBE$$*/ SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE REP_KARDEX_ARTICULO(
    DETALLE CHAR(1),
    FECINI DATE,
    FECFIN DATE,
    ARTINI VARCHAR(20),
    ARTFIN VARCHAR(20),
    GRPINI VARCHAR(2),
    GRPFIN VARCHAR(2),
    ORDEN CHAR(1),
    BODEGA VARCHAR(2))
RETURNS (
    CODIGO VARCHAR(15),
    NOMBRE VARCHAR(60),
    UNIDAD VARCHAR(8),
    CODGRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    CODSUBG VARCHAR(3),
    NOMSUBG VARCHAR(30),
    CODMARC VARCHAR(3),
    NOMMARC VARCHAR(30),
    CODBOD VARCHAR(2),
    SALDOINI NUMERIC(18,4),
    COSTOINI NUMERIC(18,2),
    ENTRADAS NUMERIC(18,4),
    COSTOENT NUMERIC(18,2),
    SALIDAS NUMERIC(18,4),
    COSTOSAL NUMERIC(18,2),
    SALDOFIN NUMERIC(18,4),
    COSTOFIN NUMERIC(18,2),
    TIPODOC VARCHAR(8),
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    CONCEPTO VARCHAR(60),
    NIT VARCHAR(20),
    CONS INTEGER,
    CANFINAL NUMERIC(18,4),
    COSFINAL NUMERIC(18,2))
AS
DECLARE VARIABLE ENTRADA CHAR(1);
DECLARE VARIABLE CANT NUMERIC(18,4);
DECLARE VARIABLE COSTO NUMERIC(18,2);
DECLARE VARIABLE CODINI VARCHAR(20);
DECLARE VARIABLE CODFIN VARCHAR(20);
DECLARE VARIABLE DESINI VARCHAR(20);
DECLARE VARIABLE DESFIN VARCHAR(20);
BEGIN /*$$IBE$$ 
if (ORDEN = 'C') then
    BEGIN
    CODINI = ARTINI;
    CODFIN = ARTFIN;
    DESINI = '';
    DESFIN = 'zz';
    END
ELSE
    BEGIN
    DESINI = ARTINI;
    DESFIN = ARTFIN;
    CODINI = '';
    CODFIN = 'zz';
    END
  FOR
    SELECT ARTI_COD, ARTI_DES, ARTI_UNIDAD, A.GRUP_COD, A.SUBG_COD, A.MARC_COD
      FROM ARTICULO A
      WHERE ARTI_COD >= :CODINI AND ARTI_COD <= :CODFIN AND A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :GRPFIN AND ARTI_DES >= :DESINI AND ARTI_DES <= :DESFIN AND A.ESAR_COD <> 'I'
      INTO :CODIGO, :NOMBRE, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
      DO
        BEGIN
        NOMMARC = '';
        NOMSUBG = '';
        SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
        SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
        SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
        if (BODEGA = '') then
            BEGIN
            EXECUTE PROCEDURE SALDO_INICIAL_TOTAL_INV(CODIGO, FECINI) returning_values (:SALDOINI);
            EXECUTE PROCEDURE VALOR_INICIAL_INVENTARIO(CODIGO, FECINI) returning_values (COSTOINI);
            END
        ELSE
            BEGIN
            EXECUTE PROCEDURE SALDO_INICIAL_INVENTARIO(CODIGO, FECINI, :BODEGA) returning_values (SALDOINI);
            EXECUTE PROCEDURE COSTO_PROMEDIO(CODIGO, FECINI-1) returning_values (COSTOINI);
            COSTOINI = COSTOINI * saldoini;
            END
        if (DETALLE = 'N') then
            BEGIN
             $$IBE$$*/ /* SUME LAS ENTRADAS */ /*$$IBE$$ 
            if (BODEGA = '') then
              SELECT SUM(COST_ENTC), SUM(COST_ENTP), SUM(COST_SALC), SUM(COST_SALP) FROM COSTOS
                WHERE (COST_FECHA >= :FECINI) AND (COST_FECHA <= :FECFIN) AND (ARTI_COD = :codigo)
                INTO :ENTRADAS, :COSTOENT, :SALIDAS, :COSTOSAL;
            ELSE
              SELECT SUM(COST_ENTC), SUM(COST_ENTP), SUM(COST_SALC), SUM(COST_SALP)
                FROM COSTOS C, MOVIMIENTO_ARTICULO M
                WHERE (COST_FECHA >= :FECINI) AND (COST_FECHA <= :FECFIN) AND (C.ARTI_COD = :codigo) AND C.cost_idmov = M.mvar_cons AND BODE_COD = :BODEGA
                INTO :ENTRADAS, :COSTOENT, :SALIDAS, :COSTOSAL;

            if (ENTRADAS IS NULL) then
              ENTRADAS = 0;
            if (COSTOENT IS NULL) then
              COSTOENT = 0;
            if (SALIDAS IS NULL) then
              SALIDAS = 0;
            if (COSTOSAL IS NULL) then
              COSTOSAL = 0;
            SALDOFIN = SALDOINI + ENTRADAS - SALIDAS;
            COSTOFIN = COSTOINI + COSTOENT - COSTOSAL;
            if (BODEGA = '') then
                BEGIN
                EXECUTE PROCEDURE SALDO_INICIAL_TOTAL_INV(CODIGO, fecfin+1) returning_values (canfinal);
                EXECUTE PROCEDURE VALOR_INICIAL_INVENTARIO(CODIGO, FECFIN+1) returning_values (cosfinal);
                END
            ELSE
                BEGIN
                EXECUTE PROCEDURE SALDO_INICIAL_INVENTARIO(CODIGO, FECFIN+1, :BODEGA) returning_values (CANFINAL);
                EXECUTE PROCEDURE COSTO_PROMEDIO(CODIGO, FECFIN+1) returning_values (COSFINAL);
                COSFINAL = COSFINAL * CANFINAL;
                END
            SUSPEND;
            END
        ELSE
            BEGIN
            SALDOFIN = SALDOINI;
            COSTOFIN = COSTOINI;
            COSTOENT = 0;
            COSTOSAL = 0;
            FOR SELECT TIDO_NOMCORTO, MVAR_ENTRADA, MVAR_PREF, MVAR_NUMERO, MVAR_CANT, MVAR_COSTO, MVAR_CONC, MVAR_FECHA, M.TERC_NIT, MVAR_CONS, BODE_COD, COST_SALDOP, COST_SALDOC
                FROM MOVIMIENTO_ARTICULO M, TIPO_DOCUMENTO TD, COSTOS C
                WHERE TD.TIDO_COD = MVAR_TIPODOC AND (MVAR_FECHA >= :FECINI) AND (MVAR_FECHA <= :FECFIN) AND (MVAR_TIPODOC <> 13) AND (m.ARTI_COD = :CODIGO) AND M.mvar_cons = C.cost_idmov
                ORDER BY MVAR_FECHA, MVAR_CONS
                INTO :TIPODOC, :ENTRADA, :PREFIJO, :NUMERO, :ENTRADAS, :COSTOENT, :CONCEPTO, :FECHA, :NIT, :CONS, :CODBOD, :costo, :cant
                DO
                    BEGIN
                    if (ENTRADA = 'S') then
                        BEGIN
                        SALIDAS = 0;
                        SALDOFIN = SALDOFIN + ENTRADAS;
                        COSTOFIN = COSTOFIN + (ENTRADAS * COSTOENT);
                        if (CANT > 0) then
                            COSTOSAL = COSTO / CANT;
                        else
                            COSTOSAL = 0;
                        end
                    ELSE
                        BEGIN
                        SALIDAS = ENTRADAS;
                        ENTRADAS = 0;
                        if (CANT > 0) then
                            COSTOSAL = COSTO / CANT;
                        else
                            COSTOSAL = 0;
                        SALDOFIN = SALDOFIN - SALIDAS;
                        COSTOFIN = COSTOFIN - (SALIDAS * costosal);
                        END
                    SUSPEND;
                    END
            END
        END
 $$IBE$$*/ SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE EXISTENCIAS_DESDE_HASTA(
    FECHA DATE,
    ARTINI VARCHAR(20),
    ARTFIN VARCHAR(20),
    GRPINI VARCHAR(3),
    GRPFIN VARCHAR(3),
    BODINI VARCHAR(2),
    BODFIN VARCHAR(2),
    ORDEN CHAR(1),
    AGRUPA CHAR(1),
    DETALLE CHAR(1),
    RESERVA CHAR(1),
    ENPESO CHAR(1),
    SUCURSAL INTEGER)
RETURNS (
    CANT NUMERIC(18,4),
    COSTO NUMERIC(18,2),
    COSTO_LOTE NUMERIC(18,2),
    CODIGO VARCHAR(15),
    NOMBRE VARCHAR(60),
    UNIDAD VARCHAR(8),
    STAND VARCHAR(15),
    CODGRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    CODSUBG VARCHAR(3),
    NOMSUBG VARCHAR(30),
    CODMARC VARCHAR(3),
    NOMMARC VARCHAR(30),
    CODBOD VARCHAR(2),
    LOTE VARCHAR(15),
    NOMBOD VARCHAR(30),
    COSTOTOT NUMERIC(18,2),
    ULTCOSTO NUMERIC(18,2),
    FECHACOSTO DATE,
    CONSUMO NUMERIC(18,2),
    RESERVADO NUMERIC(18,4),
    ORDENADO NUMERIC(18,4),
    IVA NUMERIC(9,2),
    PESOUNIT NUMERIC(18,4),
    PESOTOTAL NUMERIC(18,4),
    CODBAR VARCHAR(20))
AS
declare variable exist char(1);
declare variable codini varchar(20);
declare variable codfin varchar(20);
declare variable desini varchar(20);
declare variable desfin varchar(20);
declare variable ordenc numeric(18,4);
declare variable pedido numeric(18,4);
declare variable ok char(1);
declare variable id integer;
declare variable item integer;
declare variable und varchar(8);
declare variable factor numeric(18,4);
declare variable cant2 numeric(18,4);
declare variable PEDAUTO CHAR(2);
BEGIN
if (ORDEN = 'C') then
    BEGIN
    CODINI = ARTINI;
    CODFIN = ARTFIN;
    DESINI = '';
    DESFIN = 'zz';
    END
ELSE
    BEGIN
    DESINI = ARTINI;
    DESFIN = ARTFIN;
    CODINI = '';
    CODFIN = 'zz';
    END
EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION', 'FACTURAS', 'GENERAR PEDIDO AUTOMATICAMENTE CON LA FACTURA') returning_values (pedauto);
if (DETALLE = 'B') then
  BEGIN
  FOR SELECT ARTI_COD, ARTI_DES, ARTI_UNIDAD, ARTI_EXIST, TAIV_PORC, A.GRUP_COD, A.SUBG_COD, A.MARC_COD, BODE_COD, BODE_NOM, ARTI_CONSUMO, ARTI_PESO/1000
      FROM ARTICULO A, BODEGA B, TARIFA_IVA T
      WHERE ARTI_COD >= :CODINI AND ARTI_COD <= :CODFIN AND ARTI_DES >= :DESINI AND ARTI_DES <= :DESFIN AND ESAR_COD <> 'I' AND BODE_COD >= :BODINI AND
      BODE_COD <= :BODFIN AND ((SUCU_ID = :SUCURSAL) or (:SUCURSAL = 0)) AND A.TAIV_COD = T.TAIV_COD
      INTO :CODIGO, :NOMBRE, :UNIDAD, :EXIST, :IVA, :CODGRUPO, :CODSUBG, :CODMARC, :CODBOD, :NOMBOD, :CONSUMO, :pesounit
      DO
        BEGIN
        OK = 'N';
        if (AGRUPA = 'G') then
            BEGIN
            if ((CODGRUPO >= GRPINI) AND (CODGRUPO <= GRPFIN)) then
                OK = 'S';
            end
        ELSE
            if (AGRUPA = 'M') then
                BEGIN
                if ((CODMARC >= GRPINI) AND (CODMARC <= GRPFIN)) then
                    OK = 'S';
                END
        if (OK = 'S') then
            BEGIN
            NOMGRUPO = '';
            NOMMARC = '';
            NOMSUBG = '';
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            SELECT MAX(COBA_COD) FROM BARRAS_ARTICULO WHERE ARTI_COD = :codigo AND COBA_UNIDAD = :unidad INTO :codbar;
            if (CODBAR IS NULL) then
                CODBAR = CODIGO;
            if (EXIST <> 'N') then
                BEGIN
                SELECT STAND_COD FROM STANDS WHERE ARTI_COD = :CODIGO AND STAND_BODEGA = :CODBOD INTO :STAND;
                EXECUTE PROCEDURE SALDO_INICIAL_INVENTARIO(CODIGO, FECHA, :CODBOD) returning_values (CANT);
                EXECUTE PROCEDURE COSTO_PROMEDIO_UNIDAD(CODIGO, FECHA, UNIDAD) returning_values (COSTO);
                EXECUTE PROCEDURE ULTIMO_COSTO(CODIGO, FECHA, UNIDAD) returning_values (ULTCOSTO);
                SELECT MAX(MVAR_FECHA) FROM MOVIMIENTO_ARTICULO WHERE ARTI_COD = :CODIGO AND MVAR_ENTRADA = 'S' AND MVAR_FECHA <= :FECHA INTO :FECHACOSTO;
                COSTOTOT = :CANT * :COSTO;
                CONSUMO = CONSUMO * CANT;
                if (RESERVA = 'S') then
                    BEGIN
                    SELECT SUM(ORID_ENTREGAR)
                        FROM ORDENINVENTARIO_DETALLE OD, ordenes_inventario O
                        WHERE O.ORIN_ID = OD.ORIN_ID AND ARTI_COD = :CODIGO AND ORIN_FECHA <= :FECHA AND ORIN_FECLLEGA >= :FECHA AND ORID_ANULADO = 'N' AND OD.BODE_COD = :CODBOD
                        INTO :ORDENADO;
                    if (ORDENADO IS NULL) then
                        ORDENADO = 0;
                    ORDENC = 0;
                    FOR SELECT O.ORDC_ID, OCDE_ITEM, OCDE_CANT * OCDE_FACTOR
                        FROM ORDENES_COMPRA O, ORDENES_COMPRA_DETALLE OD
                        WHERE O.ORDC_ID = OD.ORDC_ID AND OD.ARTI_COD = :CODIGO AND (ORDC_FECHA+ORDC_VALIDEZ) >= :FECHA AND ORDC_FECHA <= :FECHA AND OCDE_ANULADO = 'N' AND OD.BODE_COD = :CODBOD
                        INTO :ID, :ITEM, :CANT2
                        do
                        BEGIN
                        EXECUTE PROCEDURE FALTANTE(23, 21, ID, ITEM) returning_values (PEDIDO, UND, FACTOR);
                        if (PEDIDO * FACTOR = CANT2) then /* SI NO SE HA FACTURADO MIRE A VER SI SE REMISIONO */
                            EXECUTE PROCEDURE FALTANTE(23, 22, ID, ITEM) returning_values (PEDIDO, UND, FACTOR);
                        if (PEDIDO IS NULL) then
                            PEDIDO = 0;
                        ORDENC = ORDENC + PEDIDO * FACTOR;
                        END
                    ORDENADO = ORDENADO + ORDENC;
                    SELECT SUM(RSDE_LIBERAR)
                        FROM RESERVAS_DETALLE RD, RESERVAS R
                        WHERE R.RESE_ID = RD.RESE_ID AND ARTI_COD = :CODIGO AND RESE_FECHA <= :FECHA AND RESE_VENCE >= :FECHA AND RD.BODE_COD = :CODBOD AND RSDE_ANULADO = 'N'
                        INTO :RESERVADO;
                    if (RESERVADO IS NULL) then
                        RESERVADO = 0;
                    PEDIDO = 0;
                    FOR SELECT P.PEDI_ID, PEDE_ITEM, PEDE_CANT * PEDE_FACTOR
                        FROM PEDIDOS P, PEDIDOS_DETALLE PD
                        WHERE P.PEDI_ID = PD.PEDI_ID AND PD.ARTI_COD = :CODIGO AND (PEDI_FECHA+PEDI_VALIDEZ) >= :FECHA AND PEDI_FECHA <= :FECHA AND PEDE_ANULADO = 'N' AND BODE_COD = :CODBOD
                        INTO :ID, :ITEM, :CANT2
                        do
                        BEGIN
                        EXECUTE PROCEDURE FALTANTE(34, 31, ID, ITEM) returning_values (ORDENC, UND, FACTOR);
                        if ((ORDENC * FACTOR = CANT2) or (PEDAUTO = 'SI')) then /* SI NO SE HA FACTURADO MIRE A VER SI SE REMISIONO */
                            EXECUTE PROCEDURE FALTANTE(34, 32, ID, ITEM) returning_values (ORDENC, UND, FACTOR);
                        if (ORDENC IS NULL) then
                            ORDENC = 0;
                        PEDIDO = PEDIDO + ORDENC * FACTOR;
                        END
                    RESERVADO = RESERVADO + PEDIDO;
                    END
                ELSE
                    BEGIN
                    RESERVADO = 0;
                    ORDENADO = 0;
                    END
                if (ENPESO = 'S') then
                    BEGIN
                    if (pesounit IS NULL) then
                        pesounit = 0;
                    if (PESOUNIT <> 0) then
                        BEGIN
                        pesototal = PESOUNIT * cant;
                        SUSPEND;
                        END
                    END
                ELSE
                    SUSPEND;
                END
            END
        END
  END

if (DETALLE = 'L') then
  BEGIN
  FOR SELECT A.ARTI_COD, ARTI_DES, ARTI_UNIDAD, ARTI_EXIST, TAIV_PORC, A.GRUP_COD, A.SUBG_COD, A.MARC_COD, L.lote_nro, L.lote_nro||' - '||L.lote_vence, ARTI_CONSUMO,l.bode_cod, L.lote_saldo,l.lote_costo, ARTI_PESO/1000
      FROM ARTICULO A, LOTES l, TARIFA_IVA T
      WHERE A.ARTI_COD >= '0' AND A.ARTI_COD <= 'zz' AND ARTI_DES >= '' AND ARTI_DES <= 'zz' AND ESAR_COD <> 'I' AND A.TAIV_COD = T.TAIV_COD and a.arti_cod = l.arti_cod
      INTO :CODIGO, :NOMBRE, :UNIDAD, :EXIST, :IVA, :CODGRUPO, :CODSUBG, :CODMARC, :LOTE, :NOMBOD, :CONSUMO, :codbod, :cant, :costo_lote, :pesounit
      DO
        BEGIN
        OK = 'N';
        if (AGRUPA = 'G') then
            BEGIN
            if ((CODGRUPO >= GRPINI) AND (CODGRUPO <= GRPFIN)) then
                OK = 'S';
            end
        ELSE
            if (AGRUPA = 'M') then
                BEGIN
                if ((CODMARC >= GRPINI) AND (CODMARC <= GRPFIN)) then
                    OK = 'S';
                END
        if (OK = 'S') then
            BEGIN
            NOMGRUPO = '';
            NOMMARC = '';
            NOMSUBG = '';
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            SELECT MAX(COBA_COD) FROM BARRAS_ARTICULO WHERE ARTI_COD = :codigo AND COBA_UNIDAD = :unidad INTO :codbar;
            if (CODBAR IS NULL) then
                CODBAR = CODIGO;

            if (EXIST <> 'N') then
                BEGIN
                EXECUTE PROCEDURE COSTO_PROMEDIO_UNIDAD(CODIGO, FECHA, UNIDAD) returning_values (COSTO);
                EXECUTE PROCEDURE ULTIMO_COSTO(CODIGO, FECHA, UNIDAD) returning_values (ULTCOSTO);
                SELECT MAX(MVAR_FECHA) FROM MOVIMIENTO_ARTICULO WHERE ARTI_COD = :CODIGO AND MVAR_ENTRADA = 'S' AND MVAR_FECHA <= :FECHA INTO :FECHACOSTO;
                COSTOTOT = :CANT * :COSTO;
                CONSUMO = CONSUMO * CANT;
                if (RESERVA = 'S') then
                    BEGIN
                    SELECT SUM(ORID_ENTREGAR)
                        FROM ORDENINVENTARIO_DETALLE OD, ordenes_inventario O
                        WHERE O.ORIN_ID = OD.ORIN_ID AND ARTI_COD = :CODIGO AND ORIN_FECHA <= :FECHA AND ORIN_FECLLEGA >= :FECHA AND ORID_ANULADO = 'N'
                        INTO :ORDENADO;
                    if (ORDENADO IS NULL) then
                        ORDENADO = 0;
                    ORDENC = 0;
                    FOR SELECT O.ORDC_ID, OCDE_ITEM, OCDE_CANT * OCDE_FACTOR
                        FROM ORDENES_COMPRA O, ORDENES_COMPRA_DETALLE OD
                        WHERE O.ORDC_ID = OD.ORDC_ID AND OD.ARTI_COD = :CODIGO AND (ORDC_FECHA+ORDC_VALIDEZ) >= :FECHA AND ORDC_FECHA <= :FECHA AND OCDE_ANULADO = 'N'
                        INTO :ID, :ITEM, :CANT2
                        do
                        BEGIN
                        EXECUTE PROCEDURE FALTANTE(23, 21, ID, ITEM) returning_values (PEDIDO, UND, FACTOR);
                        if (PEDIDO * FACTOR = CANT2) then /* SI NO SE HA FACTURADO MIRE A VER SI SE REMISIONO */
                            EXECUTE PROCEDURE FALTANTE(23, 22, ID, ITEM) returning_values (PEDIDO, UND, FACTOR);
                        if (PEDIDO IS NULL) then
                            PEDIDO = 0;
                        ORDENC = ORDENC + PEDIDO * FACTOR;
                        END
                    ORDENADO = ORDENADO + ORDENC;
                    SELECT SUM(RSDE_LIBERAR)
                        FROM RESERVAS_DETALLE RD, RESERVAS R
                        WHERE R.RESE_ID = RD.RESE_ID AND ARTI_COD = :CODIGO AND RESE_FECHA <= :FECHA AND RESE_VENCE >= :FECHA AND RSDE_ANULADO = 'N'
                        INTO :RESERVADO;
                    if (RESERVADO IS NULL) then
                        RESERVADO = 0;
                    PEDIDO = 0;
                    FOR SELECT P.PEDI_ID, PEDE_ITEM, PEDE_CANT * PEDE_FACTOR
                        FROM PEDIDOS P, PEDIDOS_DETALLE PD
                        WHERE P.PEDI_ID = PD.PEDI_ID AND PD.ARTI_COD = :CODIGO AND (PEDI_FECHA+PEDI_VALIDEZ) >= :FECHA AND PEDI_FECHA <= :FECHA AND PEDE_ANULADO = 'N'
                        INTO :ID, :ITEM, :CANT2
                        do
                        BEGIN
                        EXECUTE PROCEDURE FALTANTE(34, 31, ID, ITEM) returning_values (ORDENC, UND, FACTOR);
                        if ((ORDENC * FACTOR = CANT2) or (PEDAUTO = 'SI')) then /* SI NO SE HA FACTURADO MIRE A VER SI SE REMISIONO */
                            EXECUTE PROCEDURE FALTANTE(34, 32, ID, ITEM) returning_values (ORDENC, UND, FACTOR);
                        if (ORDENC IS NULL) then
                            ORDENC = 0;
                        PEDIDO = PEDIDO + ORDENC * FACTOR;
                        END
                    RESERVADO = RESERVADO + PEDIDO;
                    END
                ELSE
                    BEGIN
                    RESERVADO = 0;
                    ORDENADO = 0;
                    END
                if (ENPESO = 'S') then
                    BEGIN
                    if (pesounit IS NULL) then
                        pesounit = 0;
                    if (PESOUNIT <> 0) then
                        BEGIN
                        pesototal = PESOUNIT * cant;
                        SUSPEND;
                        END
                    END
                ELSE
                    SUSPEND;
                END
            END
        END
  end
if (DETALLE = 'N') then
  BEGIN
  FOR SELECT ARTI_COD, ARTI_DES, ARTI_UNIDAD, ARTI_EXIST, TAIV_PORC, A.GRUP_COD, A.SUBG_COD, A.MARC_COD, ARTI_CONSUMO, ARTI_PESO/1000
      FROM ARTICULO A, TARIFA_IVA T
      WHERE ARTI_COD >= :CODINI AND ARTI_COD <= :CODFIN AND ARTI_DES >= :DESINI AND ARTI_DES <= :DESFIN AND ESAR_COD <> 'I' AND A.TAIV_COD = T.TAIV_COD
      INTO :CODIGO, :NOMBRE, :UNIDAD, :EXIST, :IVA, :CODGRUPO, :CODSUBG, :CODMARC, :CONSUMO, :pesounit
      DO
        BEGIN
        OK = 'N';
        if (AGRUPA = 'G') then
            BEGIN
            if ((GRPINI = '0') AND (GRPFIN = 'zz')) then
                OK = 'S';
            else
                if ((CODGRUPO >= GRPINI) AND (CODGRUPO <= GRPFIN)) then
                    OK = 'S';
            end
        ELSE
            if (AGRUPA = 'M') then
                BEGIN
                if ((GRPINI = '0') AND (GRPFIN = 'zzz')) then
                    OK = 'S';
                else
                    if ((CODMARC >= GRPINI) AND (CODMARC <= GRPFIN)) then
                        OK = 'S';
                END
        if (OK = 'S') then
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            SELECT MAX(COBA_COD) FROM BARRAS_ARTICULO WHERE ARTI_COD = :codigo AND COBA_UNIDAD = :unidad INTO :codbar;
            if (CODBAR IS NULL) then
                CODBAR = CODIGO;

            if (EXIST <> 'N') then
                BEGIN
                EXECUTE PROCEDURE SALDO_INICIAL_TOTAL_INV(CODIGO, FECHA) returning_values (CANT);
                EXECUTE PROCEDURE COSTO_PROMEDIO_UNIDAD(CODIGO, FECHA, UNIDAD) returning_values (COSTO);
                EXECUTE PROCEDURE ULTIMO_COSTO(CODIGO, FECHA, UNIDAD) returning_values (ULTCOSTO);
                SELECT MAX(MVAR_FECHA) FROM MOVIMIENTO_ARTICULO WHERE ARTI_COD = :CODIGO AND MVAR_ENTRADA = 'S' AND MVAR_FECHA <= :FECHA INTO :FECHACOSTO;
                COSTOTOT = :CANT * :COSTO;
                CONSUMO = CONSUMO * CANT;
                if (RESERVA = 'S') then
                    BEGIN
                    SELECT SUM(ORID_ENTREGAR)
                        FROM ORDENINVENTARIO_DETALLE OD, ordenes_inventario O
                        WHERE O.ORIN_ID = OD.ORIN_ID AND ARTI_COD = :CODIGO AND ORIN_FECHA <= :FECHA AND ORIN_FECLLEGA >= :FECHA AND ORID_ANULADO = 'N'
                        INTO :ORDENADO;
                        if (ORDENADO IS NULL) then
                            ORDENADO = 0;
                    ORDENC = 0;
                    FOR SELECT O.ORDC_ID, OCDE_ITEM, OCDE_CANT * OCDE_FACTOR
                        FROM ORDENES_COMPRA O, ORDENES_COMPRA_DETALLE OD
                        WHERE O.ORDC_ID = OD.ORDC_ID AND OD.ARTI_COD = :CODIGO AND (ORDC_FECHA+ORDC_VALIDEZ) >= :FECHA AND ORDC_FECHA <= :FECHA AND OCDE_ANULADO = 'N'
                        INTO :ID, :ITEM, :CANT2
                        do
                        BEGIN
                        EXECUTE PROCEDURE FALTANTE(23, 21, ID, ITEM) returning_values (PEDIDO, UND, FACTOR);
                        if (PEDIDO * FACTOR = CANT2) then /* SI NO SE HA FACTURADO MIRE A VER SI SE REMISIONO */
                            EXECUTE PROCEDURE FALTANTE(23, 22, ID, ITEM) returning_values (PEDIDO, UND, FACTOR);
                        if (PEDIDO IS NULL) then
                            PEDIDO = 0;
                        ORDENC = ORDENC + PEDIDO * FACTOR;
                        END
                    ORDENADO = ORDENADO + ORDENC;
                    SELECT SUM(RSDE_LIBERAR)
                        FROM RESERVAS_DETALLE RD, RESERVAS R
                        WHERE R.RESE_ID = RD.RESE_ID AND ARTI_COD = :CODIGO AND RESE_FECHA <= :FECHA AND RESE_VENCE >= :FECHA AND RSDE_ANULADO = 'N'
                        INTO :RESERVADO;
                    if (RESERVADO IS NULL) then
                        RESERVADO = 0;
                    PEDIDO = 0;
                    FOR SELECT P.PEDI_ID, PEDE_ITEM, PEDE_CANT * PEDE_FACTOR
                        FROM PEDIDOS P, PEDIDOS_DETALLE PD, PUNTO_VENTA PT
                        WHERE P.PEDI_ID = PD.PEDI_ID AND PD.ARTI_COD = :CODIGO AND PT.ptvt_id = P.PTVT_ID AND (PEDI_FECHA+PEDI_VALIDEZ) >= :FECHA AND PEDI_FECHA <= :FECHA AND PEDE_ANULADO = 'N'
                        INTO :ID, :ITEM, :CANT2
                        do
                        BEGIN
                        EXECUTE PROCEDURE FALTANTE(34, 31, ID, ITEM) returning_values (ORDENC, UND, FACTOR);
                        if ((ORDENC * FACTOR = CANT2) or (PEDAUTO = 'SI')) then /* SI NO SE HA FACTURADO MIRE A VER SI SE REMISIONO */
                            EXECUTE PROCEDURE FALTANTE(34, 32, ID, ITEM) returning_values (ORDENC, UND, FACTOR);
                        if (ORDENC IS NULL) then
                            ORDENC = 0;
                        PEDIDO = PEDIDO + ORDENC * FACTOR;
                        END
                    if (PEDIDO IS NULL) then
                        PEDIDO = 0;
                    RESERVADO = RESERVADO + PEDIDO;
                    END
                ELSE
                    BEGIN
                    RESERVADO = 0;
                    ORDENADO = 0;
                    END
                if (ENPESO = 'S') then
                    BEGIN
                    if (pesounit IS NULL) then
                        pesounit = 0;
                    if (PESOUNIT <> 0) then
                        BEGIN
                        pesototal = PESOUNIT * cant;
                        SUSPEND;
                        END
                    END
                ELSE
                    SUSPEND;
                END
            END
        END
  END
END

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE INVENTARIO_FAMILIA(
    FECHA DATE,
    FAMILIA VARCHAR(20))
RETURNS (
    ARTICULO VARCHAR(20),
    INTERNO VARCHAR(20),
    DESCRIPCION VARCHAR(60),
    CANTIDAD NUMERIC(18,2),
    UNIDAD VARCHAR(8),
    TOTAL NUMERIC(18,2))
AS
declare variable COSTO NUMERIC(18,4);
begin
FOR SELECT A.ARTI_COD, ARTI_DES, ARTI_UNIDAD, p.pvar_cod FROM ARTICULO A, PROVEEDOR_ARTICULO P
    WHERE ESAR_COD <> 'I' AND A.arti_cod = P.arti_cod AND P.terc_nit = :FAMILIA
    INTO :ARTICULO, :descripcion, :UNIDAD, :INTERNO
    DO
    BEGIN
    EXECUTE PROCEDURE SALDO_INICIAL_TOTAL_INV(ARTICULO, FECHA) returning_values (cantidad);
    EXECUTE PROCEDURE COSTO_PROMEDIO_UNIDAD(ARTICULO, FECHA, UNIDAD) returning_values (COSTO);
    TOTAL = COSTO * CANTIDAD;
    suspend;
    END
end

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE KARDEX_DESDE_HASTA(
    ARTICULO VARCHAR(15),
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    INICIAL_CANT NUMERIC(18,4),
    INICIAL_PESOS NUMERIC(18,2),
    ENT_CANT NUMERIC(18,4),
    ENT_PESOS NUMERIC(18,2),
    SAL_CANT NUMERIC(18,4),
    SAL_PESOS NUMERIC(18,2),
    FINAL_CANT NUMERIC(18,4),
    FINAL_PESOS NUMERIC(18,2))
AS
BEGIN
  EXECUTE PROCEDURE SALDO_INICIAL_TOTAL_INV(ARTICULO, FECINI) returning_values (INICIAL_CANT);
  EXECUTE PROCEDURE VALOR_INICIAL_INVENTARIO(ARTICULO, FECINI) returning_values (INICIAL_PESOS);
  SELECT SUM(COST_ENTC), SUM(COST_ENTP), SUM(COST_SALC), SUM(COST_SALP) FROM COSTOS
    WHERE (COST_FECHA >= :FECINI) AND (COST_FECHA <= :FECFIN) AND
          (ARTI_COD = :ARTICULO)
    INTO :ENT_CANT, :ENT_PESOS, :SAL_CANT, :SAL_PESOS;
  if (ENT_CANT IS NULL) then
    ENT_CANT = 0;
  if (ENT_PESOS IS NULL) then
    ENT_PESOS = 0;
  if (SAL_CANT IS NULL) then
    SAL_CANT = 0;
  if (SAL_PESOS IS NULL) then
    SAL_PESOS = 0;
  FINAL_CANT = INICIAL_CANT + ENT_CANT - SAL_CANT;
  FINAL_PESOS = INICIAL_PESOS + ENT_PESOS - SAL_PESOS;
  SUSPEND;
END

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE REP_EXISTENCIAS_PRECIOS(
    ARTINI VARCHAR(20),
    ARTFIN VARCHAR(20),
    GRPINI VARCHAR(2),
    GRPFIN VARCHAR(2),
    ORDEN CHAR(1),
    LISTA INTEGER,
    FECHA DATE,
    BODINI VARCHAR(2),
    BODFIN VARCHAR(2),
    TODAS CHAR(1),
    IVAINC CHAR(1),
    SINBOD CHAR(1),
    SUBEMPRESA INTEGER)
RETURNS (
    CODIGO VARCHAR(15),
    NOMBRE VARCHAR(60),
    UNIDAD VARCHAR(8),
    CODGRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    CODSUBG VARCHAR(3),
    NOMSUBG VARCHAR(30),
    CODMARC VARCHAR(3),
    NOMMARC VARCHAR(30),
    NOMLISTA VARCHAR(30),
    PRECIO NUMERIC(18,2),
    MARGEN NUMERIC(9,2),
    IVA NUMERIC(9,2),
    CODBOD VARCHAR(2),
    NOMBOD VARCHAR(30),
    CANT NUMERIC(18,4),
    COSTOTOT NUMERIC(18,2))
AS
DECLARE VARIABLE EXIST CHAR(1);
DECLARE VARIABLE CODINI VARCHAR(20);
DECLARE VARIABLE CODFIN VARCHAR(20);
DECLARE VARIABLE DESINI VARCHAR(20);
DECLARE VARIABLE DESFIN VARCHAR(20);
DECLARE VARIABLE FECINI DATE;
DECLARE VARIABLE FECFIN DATE;
DECLARE VARIABLE UTIL NUMERIC(9,2);
DECLARE VARIABLE MOU CHAR(10);
DECLARE VARIABLE LISIVA CHAR(1);
BEGIN
if (ORDEN = 'C') then
    BEGIN
    CODINI = ARTINI;
    CODFIN = ARTFIN;
    DESINI = '';
    DESFIN = 'zz';
    END
ELSE
    BEGIN
    DESINI = ARTINI;
    DESFIN = ARTFIN;
    CODINI = '';
    CODFIN = 'zz';
    END
    
EXECUTE PROCEDURE LEE_CONFIGURACION ('FACTURACION', 'ARTICULOS', 'SUGERIR PRECIOS CON PORCENTAJE DE MARGEN O UTILIDAD') returning_values (MOU);
    
FOR SELECT ARTI_COD, ARTI_DES, ARTI_UNIDAD, ARTI_EXIST, A.GRUP_COD, A.SUBG_COD, A.MARC_COD, TAIV_PORC
    FROM ARTICULO A, TARIFA_IVA T
    WHERE ARTI_COD >= :CODINI AND ARTI_COD <= :CODFIN AND A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :GRPFIN AND
    ARTI_DES >= :DESINI AND ARTI_DES <= :DESFIN AND ESAR_COD <> 'I' AND A.TAIV_COD = T.TAIV_COD
    INTO :CODIGO, :NOMBRE, :UNIDAD, :EXIST, :CODGRUPO, :CODSUBG, :CODMARC, :IVA
    DO
    BEGIN
    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
    if (EXIST <> 'N') then
        BEGIN
        if (LISTA = 255) then
            BEGIN
            if (TODAS = 'N') then
                begin
                /* Busque las listas validas hoy */
                FOR SELECT LIPR_NOM, LIPR_FECINI, LIPR_FECFIN, PRAR_FIJO, PRAR_MARGEN, PRAR_UTIL, LIPR_MODIF
                    FROM LISTA_PRECIOS L, PRECIOS_ARTICULO P
                    WHERE L.LIPR_COD = P.LIPR_COD AND ARTI_COD = :CODIGO
                    INTO :NOMLISTA, :FECINI, :FECFIN, :PRECIO, :MARGEN, :UTIL, :LISIVA
                    DO
                      BEGIN
                      if (MOU = 'UTILIDAD') then
                        MARGEN = UTIL;
                      if (IVAINC = 'S') THEN
                        BEGIN
                        if (LISIVA = 'N') then
                            PRECIO = PRECIO * (1 + (IVA/100));
                        END
                      END
                end   
            ELSE
                FOR SELECT LIPR_NOM, PRAR_FIJO, PRAR_MARGEN, PRAR_UTIL, LIPR_MODIF
                    FROM LISTA_PRECIOS L, PRECIOS_ARTICULO P
                    WHERE L.LIPR_COD = P.LIPR_COD AND ARTI_COD = :CODIGO
                    INTO :NOMLISTA, :PRECIO, :MARGEN, :UTIL, :LISIVA
                    DO
                    BEGIN
                    EXECUTE PROCEDURE LEE_CONFIGURACION ('FACTURACION', 'ARTICULOS', 'SUGERIR PRECIOS CON PORCENTAJE DE MARGEN O UTILIDAD') returning_values (MOU);
                    if (MOU = 'UTILIDAD') then
                        MARGEN = UTIL;
                    if (IVAINC = 'S') THEN
                        BEGIN
                        if (LISIVA = 'N') then
                            PRECIO = PRECIO * (1 + (IVA/100));
                        END
                    END
            END /* 255 */
        ELSE
            BEGIN
            if (TODAS = 'N') then
                begin
                /* Busque las listas validas hoy */
                FOR SELECT LIPR_NOM, LIPR_FECINI, LIPR_FECFIN, PRAR_FIJO, PRAR_MARGEN, PRAR_UTIL, LIPR_MODIF
                    FROM LISTA_PRECIOS L, PRECIOS_ARTICULO P
                    WHERE L.LIPR_COD = P.LIPR_COD AND ARTI_COD = :CODIGO AND L.LIPR_COD = :LISTA
                    INTO :NOMLISTA, :FECINI, :FECFIN, :PRECIO, :MARGEN, :UTIL, :LISIVA
                    DO
                    BEGIN
                    if (MOU = 'UTILIDAD') then
                        MARGEN = UTIL;
                    if (IVAINC = 'S') THEN
                        BEGIN
                        if (LISIVA = 'N') then
                            PRECIO = PRECIO * (1 + (IVA/100));
                        END
                    END
                end
            ELSE
                FOR SELECT LIPR_NOM, PRAR_FIJO, PRAR_MARGEN, PRAR_UTIL
                    FROM LISTA_PRECIOS L, PRECIOS_ARTICULO P
                    WHERE L.LIPR_COD = P.LIPR_COD AND ARTI_COD = :CODIGO AND L.LIPR_COD = :LISTA
                    INTO :NOMLISTA, :PRECIO, :MARGEN, :UTIL
                    DO
                    BEGIN
                    if (MOU = 'UTILIDAD') then
                        MARGEN = UTIL;
                    if (IVAINC = 'S') THEN
                        BEGIN
                        if (LISIVA = 'NO') then
                            PRECIO = PRECIO * (1 + (IVA/100));
                        END
                    END
            END
                      
        if (SINBOD = 'S') then
            BEGIN
            EXECUTE PROCEDURE SALDO_INICIAL_TOTAL_INV(CODIGO, FECHA) returning_values (CANT);
            COSTOTOT = CANT * PRECIO;
            if (FECINI is null) then
                SUSPEND;
            else
                if ((FECINI <= :FECHA) AND (FECFIN >= :FECHA)) Then
                    SUSPEND;
            END
        ELSE
            BEGIN
            FOR SELECT BODE_COD, BODE_NOM FROM BODEGA B
                WHERE BODE_COD >= :BODINI AND BODE_COD <= :BODFIN AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                INTO :CODBOD, :NOMBOD
                DO
                BEGIN
                EXECUTE PROCEDURE SALDO_INICIAL_INVENTARIO(CODIGO, FECHA, :CODBOD) returning_values (CANT);
                        
                COSTOTOT = CANT * PRECIO;
                if (FECINI is null) then
                    SUSPEND;
                else
                    if ((FECINI <= :FECHA) AND (FECFIN >= :FECHA)) Then
                        SUSPEND;
                END
            END
        END
    END
END

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE REP_KARDEX_ARTICULO(
    DETALLE CHAR(1),
    FECINI DATE,
    FECFIN DATE,
    ARTINI VARCHAR(20),
    ARTFIN VARCHAR(20),
    GRPINI VARCHAR(2),
    GRPFIN VARCHAR(2),
    ORDEN CHAR(1),
    BODEGA VARCHAR(2))
RETURNS (
    CODIGO VARCHAR(15),
    NOMBRE VARCHAR(60),
    UNIDAD VARCHAR(8),
    CODGRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    CODSUBG VARCHAR(3),
    NOMSUBG VARCHAR(30),
    CODMARC VARCHAR(3),
    NOMMARC VARCHAR(30),
    CODBOD VARCHAR(2),
    SALDOINI NUMERIC(18,4),
    COSTOINI NUMERIC(18,2),
    ENTRADAS NUMERIC(18,4),
    COSTOENT NUMERIC(18,2),
    SALIDAS NUMERIC(18,4),
    COSTOSAL NUMERIC(18,2),
    SALDOFIN NUMERIC(18,4),
    COSTOFIN NUMERIC(18,2),
    TIPODOC VARCHAR(8),
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    CONCEPTO VARCHAR(60),
    NIT VARCHAR(20),
    CONS INTEGER,
    CANFINAL NUMERIC(18,4),
    COSFINAL NUMERIC(18,2))
AS
DECLARE VARIABLE ENTRADA CHAR(1);
DECLARE VARIABLE CANT NUMERIC(18,4);
DECLARE VARIABLE COSTO NUMERIC(18,2);
DECLARE VARIABLE CODINI VARCHAR(20);
DECLARE VARIABLE CODFIN VARCHAR(20);
DECLARE VARIABLE DESINI VARCHAR(20);
DECLARE VARIABLE DESFIN VARCHAR(20);
BEGIN
if (ORDEN = 'C') then
    BEGIN
    CODINI = ARTINI;
    CODFIN = ARTFIN;
    DESINI = '';
    DESFIN = 'zz';
    END
ELSE
    BEGIN
    DESINI = ARTINI;
    DESFIN = ARTFIN;
    CODINI = '';
    CODFIN = 'zz';
    END
  FOR
    SELECT ARTI_COD, ARTI_DES, ARTI_UNIDAD, A.GRUP_COD, A.SUBG_COD, A.MARC_COD
      FROM ARTICULO A
      WHERE ARTI_COD >= :CODINI AND ARTI_COD <= :CODFIN AND A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :GRPFIN AND ARTI_DES >= :DESINI AND ARTI_DES <= :DESFIN AND A.ESAR_COD <> 'I'
      INTO :CODIGO, :NOMBRE, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
      DO
        BEGIN
        NOMMARC = '';
        NOMSUBG = '';
        SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
        SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
        SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
        if (BODEGA = '') then
            BEGIN
            EXECUTE PROCEDURE SALDO_INICIAL_TOTAL_INV(CODIGO, FECINI) returning_values (:SALDOINI);
            EXECUTE PROCEDURE VALOR_INICIAL_INVENTARIO(CODIGO, FECINI) returning_values (COSTOINI);
            END
        ELSE
            BEGIN
            EXECUTE PROCEDURE SALDO_INICIAL_INVENTARIO(CODIGO, FECINI, :BODEGA) returning_values (SALDOINI);
            EXECUTE PROCEDURE COSTO_PROMEDIO(CODIGO, FECINI-1) returning_values (COSTOINI);
            COSTOINI = COSTOINI * saldoini;
            END
        if (DETALLE = 'N') then
            BEGIN
            /* SUME LAS ENTRADAS */
            if (BODEGA = '') then
              SELECT SUM(COST_ENTC), SUM(COST_ENTP), SUM(COST_SALC), SUM(COST_SALP) FROM COSTOS
                WHERE (COST_FECHA >= :FECINI) AND (COST_FECHA <= :FECFIN) AND (ARTI_COD = :codigo)
                INTO :ENTRADAS, :COSTOENT, :SALIDAS, :COSTOSAL;
            ELSE
              SELECT SUM(COST_ENTC), SUM(COST_ENTP), SUM(COST_SALC), SUM(COST_SALP)
                FROM COSTOS C, MOVIMIENTO_ARTICULO M
                WHERE (COST_FECHA >= :FECINI) AND (COST_FECHA <= :FECFIN) AND (C.ARTI_COD = :codigo) AND C.cost_idmov = M.mvar_cons AND BODE_COD = :BODEGA
                INTO :ENTRADAS, :COSTOENT, :SALIDAS, :COSTOSAL;

            if (ENTRADAS IS NULL) then
              ENTRADAS = 0;
            if (COSTOENT IS NULL) then
              COSTOENT = 0;
            if (SALIDAS IS NULL) then
              SALIDAS = 0;
            if (COSTOSAL IS NULL) then
              COSTOSAL = 0;
            SALDOFIN = SALDOINI + ENTRADAS - SALIDAS;
            COSTOFIN = COSTOINI + COSTOENT - COSTOSAL;
            if (BODEGA = '') then
                BEGIN
                EXECUTE PROCEDURE SALDO_INICIAL_TOTAL_INV(CODIGO, fecfin+1) returning_values (canfinal);
                EXECUTE PROCEDURE VALOR_INICIAL_INVENTARIO(CODIGO, FECFIN+1) returning_values (cosfinal);
                END
            ELSE
                BEGIN
                EXECUTE PROCEDURE SALDO_INICIAL_INVENTARIO(CODIGO, FECFIN+1, :BODEGA) returning_values (CANFINAL);
                EXECUTE PROCEDURE COSTO_PROMEDIO(CODIGO, FECFIN+1) returning_values (COSFINAL);
                COSFINAL = COSFINAL * CANFINAL;
                END
            SUSPEND;
            END
        ELSE
            BEGIN
            SALDOFIN = SALDOINI;
            COSTOFIN = COSTOINI;
            COSTOENT = 0;
            COSTOSAL = 0;
            FOR SELECT TIDO_NOMCORTO, MVAR_ENTRADA, MVAR_PREF, MVAR_NUMERO, MVAR_CANT, MVAR_COSTO, MVAR_CONC, MVAR_FECHA, M.TERC_NIT, MVAR_CONS, BODE_COD, COST_SALDOP, COST_SALDOC
                FROM MOVIMIENTO_ARTICULO M, TIPO_DOCUMENTO TD, COSTOS C
                WHERE TD.TIDO_COD = MVAR_TIPODOC AND (MVAR_FECHA >= :FECINI) AND (MVAR_FECHA <= :FECFIN) AND (MVAR_TIPODOC <> 13) AND (m.ARTI_COD = :CODIGO) AND M.mvar_cons = C.cost_idmov
                ORDER BY MVAR_FECHA, MVAR_CONS
                INTO :TIPODOC, :ENTRADA, :PREFIJO, :NUMERO, :ENTRADAS, :COSTOENT, :CONCEPTO, :FECHA, :NIT, :CONS, :CODBOD, :costo, :cant
                DO
                    BEGIN
                    if (ENTRADA = 'S') then
                        BEGIN
                        SALIDAS = 0;
                        SALDOFIN = SALDOFIN + ENTRADAS;
                        COSTOFIN = COSTOFIN + (ENTRADAS * COSTOENT);
                        if (CANT > 0) then
                            COSTOSAL = COSTO / CANT;
                        else
                            COSTOSAL = 0;
                        end
                    ELSE
                        BEGIN
                        SALIDAS = ENTRADAS;
                        ENTRADAS = 0;
                        if (CANT > 0) then
                            COSTOSAL = COSTO / CANT;
                        else
                            COSTOSAL = 0;
                        SALDOFIN = SALDOFIN - SALIDAS;
                        COSTOFIN = COSTOFIN - (SALIDAS * costosal);
                        END
                    SUSPEND;
                    END
            END
        END
END

^

SET TERM ; ^


/* 20090206B  mal los rangos si extendida */
SET TERM ^ ;

CREATE OR ALTER PROCEDURE REP_ANALISIS_CARTERA(
    DESDE VARCHAR(20),
    HASTA VARCHAR(20),
    GRPINI VARCHAR(5),
    GRPFIN VARCHAR(5),
    FECHA DATE,
    DETALLE CHAR(1),
    ORDEN CHAR(1),
    AGRUPA CHAR(1),
    DIASR INTEGER,
    SUBEMPRESA INTEGER,
    GRUPCART INTEGER,
    EXTENDIDA CHAR(1),
    MONEDA INTEGER)
RETURNS (
    NIT VARCHAR(20),
    NOMBRE VARCHAR(60),
    TELEFONO VARCHAR(40),
    CIUDAD VARCHAR(40),
    CONTACTO VARCHAR(60),
    EMAIL VARCHAR(100),
    FAX VARCHAR(25),
    CEL VARCHAR(25),
    CODCLI VARCHAR(20),
    CODZONA VARCHAR(2),
    NOMZONA VARCHAR(60),
    CODCOBR INTEGER,
    NOMCOBR VARCHAR(60),
    DV CHAR(1),
    CODCIUD CHAR(5),
    NOMCIUD VARCHAR(60),
    SUCURSAL VARCHAR(10),
    NOMSUC VARCHAR(60),
    TIPO INTEGER,
    ID INTEGER,
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(6),
    DIAS INTEGER,
    SALDO NUMERIC(18,2),
    CORRIENTE NUMERIC(18,2),
    CERO NUMERIC(18,2),
    TREINTA NUMERIC(18,2),
    SESENTA NUMERIC(18,2),
    NOVENTA NUMERIC(18,2),
    CIENTOCHENTA NUMERIC(18,2),
    DOSSETENTA NUMERIC(18,2),
    TRESSESENTA NUMERIC(18,2),
    PROVISIONAL NUMERIC(18,2),
    TIPONOM VARCHAR(8),
    FECDOC DATE,
    VENCE DATE,
    CUPO NUMERIC(18,2),
    DISPONIBLE NUMERIC(18,2),
    OBS BLOB SUB_TYPE 0 SEGMENT SIZE 80,
    GRUPCOD INTEGER,
    DIA_CAR INTEGER,
    GRUPNOM VARCHAR(30))
AS
DECLARE VARIABLE NITINI VARCHAR(20);
DECLARE VARIABLE NITFIN VARCHAR(20);
DECLARE VARIABLE NOMINI VARCHAR(20);
DECLARE VARIABLE NOMFIN VARCHAR(20);
DECLARE VARIABLE RTFTE NUMERIC(18,2);
DECLARE VARIABLE RTIVA NUMERIC(18,2);
DECLARE VARIABLE RTICA NUMERIC(18,2);
DECLARE VARIABLE VENCIMIENTO VARCHAR(12);
DECLARE VARIABLE OK CHAR(1);
declare variable AUTORET VARCHAR(10);
declare variable FAUTORET DATE;
declare variable INCLANTI CHAR(2);
declare variable descnt_prov char(2);
declare variable MAXDIAS INTEGER;
DECLARE VARIABLE TRM NUMERIC(18,2);
BEGIN
if (ORDEN = 'C') then
    BEGIN
    NITINI = DESDE;
    NITFIN = HASTA;
    NOMINI = '';
    NOMFIN = 'zz';
    END
ELSE
    BEGIN
    NOMINI = DESDE;
    NOMFIN = HASTA;
    NITINI = '';
    NITFIN = 'zz';
    END
/* Ubique el NIT */
EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'FECHA AUTORETENEDOR NO DESCONTAR RETENCIONES DEL SALDO PERO SI CONTABILIZARLAS') returning_values (AUTORET);
if (AUTORET <> '') then
    FAUTORET = CAST(AUTORET AS DATE);
else
    FAUTORET = '9999/12/31';
EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'ANALISIS DE CARTERA CON FECHA FACTURA O VENCIMIENTO') returning_values (VENCIMIENTO);
EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'INCLUIR ANTICIPOS DE CLIENTES EN REPORTES Y CONSULTAS DE CARTERA') returning_values (INCLANTI);
EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'DESCONTAR RECIBOS PROVISIONALES EN INFORMES DE CARTERA') RETURNING_VALUES (:descnt_prov);

FOR select T.TERC_NIT, TERC_NOM, TERC_DV, CLSU_TEL, CLSU_CIUDAD, S.COBR_COD, S.ZONA_COD, T.CIUD_COD, CLIE_CUPO, CLIE_DIAS, CLCU_COD, CLSU_NOMBRE, t.terc_obs, C.GRCA_COD, TERC_CONTACTO, TERC_EMAIL, TERC_FAX, TERC_CEL, CLIE_COD
    from terceros T, CLIENTES C, CLIENTE_SUCURSALES S
    where C.TERC_NIT = T.TERC_NIT AND TERC_CLIE = 'S' AND S.TERC_NIT = C.TERC_NIT and T.TERC_NIT >= :NITINI AND T.TERC_NIT <= :NITFIN AND
        T.TERC_NOM >= :NOMINI AND T.TERC_NOM <= :NOMFIN AND ((:GRUPCART = 0) or (C.GRCA_COD = :GRUPCART))
    INTO :NIT, :NOMBRE, :DV, :TELEFONO, :CIUDAD, :CODCOBR, :CODZONA, :CODCIUD, :CUPO, :DIA_CAR,  :SUCURSAL, :NOMSUC, :obs, :GRUPCOD, :CONTACTO, :EMAIL, :FAX, :CEL, :CODCLI
    DO  
    BEGIN
    SELECT COBR_NOM FROM COBRADORES CB WHERE COBR_COD = :CODCOBR INTO :NOMCOBR;
    SELECT ZONA_NOM FROM ZONAS Z WHERE ZONA_COD = :CODZONA INTO :NOMZONA;
    SELECT CIUD_NOM FROM CIUDADES WHERE CIUD_COD = :CODCIUD INTO :NOMCIUD;
    SELECT GRCA_NOMBRE FROM GRUPO_CARTERA WHERE GRCA_COD = :GRUPCOD INTO :GRUPNOM;
    provisional = 0;
    MAXDIAS = 0;
    OK = 'N';
    if (AGRUPA = 'Z') then
        BEGIN
        if (GRPINI = '') then
            BEGIN
            if ((CODZONA IS NULL) or (CODZONA >= :GRPINI AND CODZONA <= :GRPFIN)) then
                OK = 'S';
            END
        ELSE
            if (CODZONA >= :GRPINI AND CODZONA <= :GRPFIN) then
                OK = 'S';
        END
    if (AGRUPA = 'I') then
        BEGIN
        if (GRPINI = '') then
            BEGIN
            if ((CODCIUD IS NULL) or (CODCIUD >= :GRPINI AND CODCIUD <= :GRPFIN)) then
                OK = 'S';
            END
        ELSE
            if (CODCIUD >= :GRPINI AND CODCIUD <= :GRPFIN) then
                OK = 'S';
        END
    if (AGRUPA = 'N') then
        OK = 'S';
    if (OK = 'S') then
        BEGIN
        DISPONIBLE = CUPO;
        CORRIENTE = 0;
        CERO = 0;
        TREINTA = 0;
        SESENTA = 0;
        NOVENTA = 0;
        CIENTOCHENTA = 0;
        DOSSETENTA = 0;
        TRESSESENTA = 0;
        /* BUSQUE EN SALDOS_DOC_CARTERA LOS QUE TENGAN SALDO > 0 */
        FOR SELECT MVCL_TIPOREF, MVCL_IDREF, MVCL_PREFREF, MVCL_NUMREF, MVCL_FECHA, MVCL_VENCE
            FROM MOVIMIENTO_CLIENTES
            WHERE TERC_NIT = :NIT AND MVCL_SUCURSAL = :SUCURSAL AND MVCL_FECHA <= :FECHA
                AND MVCL_ABONO = 'N' AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA)) AND
                ((:MONEDA = 0) or (MVCL_TRM <> 1))
            INTO :TIPO, :ID, :PREFIJO, :NUMERO, :FECDOC, :VENCE
            DO
            BEGIN
            if ((inclanti = 'SI') or (TIPO <> 45)) then
                BEGIN
                EXECUTE PROCEDURE saldo_doc_cartera(TIPO, ID, FECHA, MONEDA) returning_values (SALDO);
                if (SALDO <> 0) then
                    BEGIN
                    DISPONIBLE = DISPONIBLE - SALDO;
                    SELECT TIDO_NOMCORTO FROM TIPO_DOCUMENTO WHERE TIDO_COD = :TIPO INTO :TIPONOM;

                    if (MONEDA = 0) then
                        SELECT SUM(SDCA_RTFTE - SDCA_ABRTFTE), SUM(SDCA_RTIVA - SDCA_ABRTIVA), SUM(SDCA_RTICA - SDCA_ABRTICA)
                            FROM SALDOS_DOC_CARTERA WHERE SDCA_TIPOREF = :TIPO AND SDCA_IDREF = :ID
                            INTO :RTFTE, :RTIVA, :RTICA;
                    ELSE
                        SELECT SUM((SDCA_RTFTE - SDCA_ABRTFTE)/SDCA_TRM), SUM((SDCA_RTIVA - SDCA_ABRTIVA)/SDCA_TRM), SUM((SDCA_RTICA - SDCA_ABRTICA)/SDCA_TRM)
                            FROM SALDOS_DOC_CARTERA WHERE SDCA_TIPOREF = :TIPO AND SDCA_IDREF = :ID
                            INTO :RTFTE, :RTIVA, :RTICA;
                    if (RTFTE IS NULL) then
                        RTFTE = 0;
                    if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) THEN
                        BEGIN
                        if (RTFTE > 0) then
                            RTFTE = 0;
                        END
                    ELSE
                        BEGIN
                        if (RTFTE < 0) then
                            RTFTE = 0;
                        END
                    if (FAUTORET <= FECDOC) then
                        RTFTE = 0;
                    if (RTIVA IS NULL) then
                        RTIVA = 0;
                    if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) THEN
                        BEGIN
                        if (RTIVA > 0) then
                            RTIVA = 0;
                        END
                    ELSE
                        BEGIN
                        if (RTIVA < 0) then
                            RTIVA = 0;
                        END
                    if (RTICA IS NULL) then
                        RTICA = 0;
                    if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) THEN
                        BEGIN
                        if (RTICA > 0) then
                            RTICA = 0;
                        END
                    ELSE
                        BEGIN
                        if (RTICA < 0) then
                            RTICA = 0;
                        END
                    /* AHORA CLASIFIQUE LOS DIAS */
                    if (VENCIMIENTO = 'FECHA') then
                        DIAS = FECHA - FECDOC;
                    ELSE
                        DIAS = FECHA - VENCE;
                    if (MAXDIAS < DIAS) then
                        MAXDIAS = DIAS;
                    if (DETALLE = 'S') then
                        BEGIN
                        CORRIENTE = 0;
                        CERO = 0;
                        TREINTA = 0;
                        SESENTA = 0;
                        NOVENTA = 0;
                        CIENTOCHENTA = 0;
                        DOSSETENTA = 0;
                        tressesenta = 0;
                        END
                    if (DIAS < 0) then
                        CORRIENTE = CORRIENTE + SALDO;
                    ELSE
                        if (DIAS < DIASR) then
                            CERO = CERO + SALDO;
                        ELSE
                            if (DIAS < (DIASR * 2)) then
                                TREINTA = TREINTA + SALDO;
                            ELSE
                                if (DIAS < (DIASR * 3)) then
                                    SESENTA = SESENTA + SALDO;
                                ELSE
                                    BEGIN
                                    if (EXTENDIDA = 'N') then
                                        NOVENTA = NOVENTA + SALDO;
                                    else    
                                        BEGIN
                                        if (DIAS < (DIASR * 3) * 2) then
                                            NOVENTA = NOVENTA + SALDO;
                                        ELSE
                                            if (DIAS < (DIASR * 3) * 3) then
                                                CIENTOCHENTA = CIENTOCHENTA + SALDO;
                                            ELSE
                                                if (DIAS < (DIASR * 3) * 4) then
                                                    dossetenta = dossetenta + SALDO;
                                                ELSE
                                                    tressesenta = tressesenta + SALDO;
                                        END
                                    END
                    if (DETALLE = 'S') then
                        SUSPEND;
                    END  /* SALDO */
                END  /* NO ANTICIPO */
            END  /* FOR MOV_CLI */
        /* AGREGUE LOS RECIBOS PROVISIONALES CON SIGNO NEGATIVO */
        FOR SELECT 65, MAX(P.RCPR_ID), MAX(PREF_PRE), MAX(RCPR_NUMERO), MAX(RCPR_FECHA), SUM(RPDE_ABONO* -1), SUM(RPDE_RTFTE*-1), SUM(RPDE_RTIVA*-1), SUM(RPDE_RTICA*-1), MAX(RCPR_TRM)
            FROM RECIBO_PROVISIONAL P, recibo_provisional_detalle D
            WHERE P.rcpr_id = D.rcpr_id AND P.TERC_NIT = :NIT AND D.RPDE_SUCURSAL = :SUCURSAL AND P.RCPR_FECHA <= :FECHA AND P.RCPR_ANULADO = 'N' AND
            ((RCPR_FECCRUCE IS NULL) or (RCPR_FECCRUCE > :FECHA)) AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA)) AND ((:MONEDA = 0) or (RCPR_TRM <> 1))
            GROUP BY P.rcpr_id
            INTO :TIPO, :ID, :PREFIJO, :NUMERO, :FECDOC, :PROVISIONAL, :rtfte,  :RTIVA, :RTICA, :TRM
            DO
            BEGIN
            if ((MONEDA <> 0) AND (TRM <> 0)) then
                BEGIN
                PROVISIONAL = PROVISIONAL / TRM;
                RTFTE = RTFTE / TRM;
                RTIVA = RTIVA / TRM;
                RTICA = RTICA / TRM;
                END
            if (:descnt_prov = 'NO') then
              SALDO = 0;
            else
              SALDO = :PROVISIONAL;
            SELECT TIDO_NOMCORTO FROM TIPO_DOCUMENTO WHERE TIDO_COD = :TIPO INTO :TIPONOM;
            /* CALCULE EL VENCIMIENTO DEL ULTIMO DOCUMENTO POSFECHADO */
            SELECT MAX(RPPA_FECHA) FROM recibo_provisional_pago WHERE RCPR_ID = :ID INTO :VENCE;
            DIAS = VENCE - FECHA;
            if (DETALLE = 'S') then
                BEGIN
                CORRIENTE = 0;
                CERO = 0;
                TREINTA = 0;
                SESENTA = 0;
                NOVENTA = 0;
                CIENTOCHENTA = 0;
                DOSSETENTA = 0;
                tressesenta = 0;
                END
            if (DIAS < 0) then
                CORRIENTE = CORRIENTE + SALDO;
            ELSE
                if (DIAS < DIASR) then
                    CERO = CERO + SALDO;
                ELSE
                    if (DIAS < (DIASR * 2)) then
                        TREINTA = TREINTA + SALDO;
                    ELSE
                        if (DIAS < (DIASR * 3)) then
                            SESENTA = SESENTA + SALDO;
                        ELSE
                            BEGIN
                            if (EXTENDIDA = 'N') then
                                NOVENTA = NOVENTA + SALDO;
                            else
                                BEGIN
                                if (DIAS < (DIASR * 3) * 2) then
                                    NOVENTA = NOVENTA + SALDO;
                                ELSE
                                    if (DIAS < (DIASR * 3) * 3) then
                                        CIENTOCHENTA = CIENTOCHENTA + SALDO;
                                    ELSE
                                        if (DIAS < (DIASR * 3) * 4) then
                                            dossetenta = dossetenta + SALDO;
                                        ELSE
                                            tressesenta = tressesenta + SALDO;
                                END
                            END
            if (DETALLE = 'S') then
                SUSPEND;
            END
        if (DETALLE = 'N') then
            begin
            SALDO = CORRIENTE + CERO + TREINTA + SESENTA + NOVENTA;
            DIAS = MAXDIAS;
            SUSPEND;
            end
        END
    if (AGRUPA = 'C') then
        BEGIN
        FOR SELECT DISTINCT COBR_COD FROM MOVIMIENTO_CLIENTES
            WHERE TERC_NIT = :NIT AND MVCL_SUCURSAL = :SUCURSAL AND MVCL_FECHA <= :FECHA
                AND MVCL_ABONO = 'N' AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA)) AND
                ((:MONEDA = 0) or (MVCL_TRM <> 1))
            INTO :codcobr
            DO
            BEGIN
            OK = 'N';
            if (GRPINI = '') then
                BEGIN
                if ((CODCOBR IS NULL) or (CODCOBR >= :GRPINI AND CODCOBR <= :GRPFIN)) then
                    OK = 'S';
                END
            ELSE
                if (CODCOBR >= :GRPINI AND CODCOBR <= :GRPFIN) then
                    OK = 'S';
            if (OK = 'S') then
                BEGIN
                DISPONIBLE = CUPO;
                CORRIENTE = 0;
                CERO = 0;
                TREINTA = 0;
                SESENTA = 0;
                NOVENTA = 0;
                CIENTOCHENTA = 0;
                DOSSETENTA = 0;
                tressesenta = 0;
                SELECT COBR_NOM FROM COBRADORES WHERE COBR_COD = :codcobr INTO :nomcobr;
                /* BUSQUE EN SALDOS_DOC_CARTERA LOS QUE TENGAN SALDO > 0 */
                FOR SELECT MVCL_TIPOREF, MVCL_IDREF, MVCL_PREFREF, MVCL_NUMREF, MVCL_FECHA, MVCL_VENCE
                    FROM MOVIMIENTO_CLIENTES
                    WHERE TERC_NIT = :NIT AND COBR_COD = :CODCOBR AND MVCL_SUCURSAL = :SUCURSAL AND MVCL_FECHA <= :FECHA
                        AND MVCL_ABONO = 'N' AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA))
                    INTO :TIPO, :ID, :PREFIJO, :NUMERO, :FECDOC, :VENCE
                    DO
                    BEGIN
                    if ((inclanti = 'SI') or (TIPO <> 45)) then
                        BEGIN
                        EXECUTE PROCEDURE saldo_doc_cartera(TIPO, ID, FECHA, MONEDA) returning_values (SALDO);
                        if (SALDO <> 0) then
                            BEGIN
                            DISPONIBLE = DISPONIBLE - SALDO;
                            SELECT TIDO_NOMCORTO FROM TIPO_DOCUMENTO WHERE TIDO_COD = :TIPO INTO :TIPONOM;
                            if (MONEDA = 0) then
                                SELECT SUM(SDCA_RTFTE - SDCA_ABRTFTE), SUM(SDCA_RTIVA - SDCA_ABRTIVA), SUM(SDCA_RTICA - SDCA_ABRTICA)
                                    FROM SALDOS_DOC_CARTERA WHERE SDCA_TIPOREF = :TIPO AND SDCA_IDREF = :ID
                                    INTO :RTFTE, :RTIVA, :RTICA;
                            ELSE
                                SELECT SUM((SDCA_RTFTE - SDCA_ABRTFTE)/SDCA_TRM), SUM((SDCA_RTIVA - SDCA_ABRTIVA)/SDCA_TRM), SUM((SDCA_RTICA - SDCA_ABRTICA)/SDCA_TRM)
                                    FROM SALDOS_DOC_CARTERA WHERE SDCA_TIPOREF = :TIPO AND SDCA_IDREF = :ID
                                    INTO :RTFTE, :RTIVA, :RTICA;
                            if (RTFTE IS NULL) then
                                RTFTE = 0;
                            if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) THEN
                                BEGIN
                                if (RTFTE > 0) then
                                    RTFTE = 0;
                                END
                            ELSE
                                BEGIN
                                if (RTFTE < 0) then
                                    RTFTE = 0;
                                END
                            if (FAUTORET <= FECDOC) then
                                RTFTE = 0;
                            if (RTIVA IS NULL) then
                                RTIVA = 0;
                            if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) THEN
                                BEGIN
                                if (RTIVA > 0) then
                                    RTIVA = 0;
                                END
                            ELSE
                                BEGIN
                                if (RTIVA < 0) then
                                    RTIVA = 0;
                                END
                            if (RTICA IS NULL) then
                                RTICA = 0;
                            if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) THEN
                                BEGIN
                                if (RTICA > 0) then
                                    RTICA = 0;
                                END
                            ELSE
                                BEGIN
                                if (RTICA < 0) then
                                    RTICA = 0;
                                END
                            /* AHORA CLASIFIQUE LOS DIAS */
                            if (VENCIMIENTO = 'FECHA') then
                                DIAS = FECHA - FECDOC;
                            ELSE
                                DIAS = FECHA - VENCE;
                            if (MAXDIAS < DIAS) then
                                MAXDIAS = DIAS;
                            if (DETALLE = 'S') then
                                BEGIN
                                CORRIENTE = 0;
                                CERO = 0;
                                TREINTA = 0;
                                SESENTA = 0;
                                NOVENTA = 0;
                                CIENTOCHENTA = 0;
                                DOSSETENTA = 0;
                                tressesenta = 0;
                                END
                            if (DIAS < 0) then
                                CORRIENTE = CORRIENTE + SALDO;
                            ELSE
                                if (DIAS < DIASR) then
                                    CERO = CERO + SALDO;
                                ELSE
                                    if (DIAS < (DIASR * 2)) then
                                        TREINTA = TREINTA + SALDO;
                                    ELSE
                                        if (DIAS < (DIASR * 3)) then
                                            SESENTA = SESENTA + SALDO;
                                        ELSE
                                            BEGIN
                                            if (EXTENDIDA = 'N') then
                                                NOVENTA = NOVENTA + SALDO;
                                            else    
                                                BEGIN
                                                if (DIAS < (DIASR * 3) * 2) then
                                                    NOVENTA = NOVENTA + SALDO;
                                                ELSE
                                                    if (DIAS < (DIASR * 3) * 3) then
                                                        CIENTOCHENTA = CIENTOCHENTA + SALDO;
                                                    ELSE
                                                        if (DIAS < (DIASR * 3) * 4) then
                                                            dossetenta = dossetenta + SALDO;
                                                        ELSE
                                                            tressesenta = tressesenta + SALDO;
                                                END
                                            END
                            if (DETALLE = 'S') then
                                SUSPEND;
                            END  /* SALDO <>  0 */
                        END  /* NO ANTICIPO */
                    END  /* FOR MOV_CLI */
                /* AGREGUE LOS RECIBOS PROVISIONALES CON SIGNO NEGATIVO */
                FOR SELECT 65, MAX(P.RCPR_ID), MAX(PREF_PRE), MAX(RCPR_NUMERO), MAX(RCPR_FECHA), SUM(RPDE_ABONO * -1), SUM(RPDE_RTFTE*-1), SUM(RPDE_RTIVA*-1), SUM(RPDE_RTICA*-1), MAX(RCPR_TRM)
                    FROM RECIBO_PROVISIONAL P, recibo_provisional_detalle D
                    WHERE P.rcpr_id = D.rcpr_id AND P.TERC_NIT = :NIT AND RPDE_SUCURSAL = :SUCURSAL AND P.VEND_COD = :CODCOBR AND P.RCPR_FECHA <= :FECHA AND P.RCPR_ANULADO = 'N' AND
                    ((RCPR_FECCRUCE IS NULL) or (RCPR_FECCRUCE > :FECHA)) AND ((SUCU_ID = :SUBEMPRESA) OR (:SUBEMPRESA = 0)) AND ((:MONEDA = 0) or (RCPR_TRM <> 1))
                    GROUP BY P.rcpr_id
                    INTO :TIPO, :ID, :PREFIJO, :NUMERO, :FECDOC, :PROVISIONAL, :rtfte,  :RTIVA, :RTICA, :TRM
                    DO
                    BEGIN
                    if ((MONEDA <> 0) AND (TRM <> 0)) then
                        BEGIN
                        PROVISIONAL = PROVISIONAL / TRM;
                        RTFTE = RTFTE / TRM;
                        RTIVA = RTIVA / TRM;
                        RTICA = RTICA / TRM;
                        END
                    if (:descnt_prov = 'NO') then
                      SALDO = 0;
                    else
                      SALDO = :PROVISIONAL;
                    SELECT TIDO_NOMCORTO FROM TIPO_DOCUMENTO WHERE TIDO_COD = :TIPO INTO :TIPONOM;
                    /* CALCULE EL VENCIMIENTO DEL ULTIMO DOCUMENTO POSFECHADO */
                    SELECT MAX(RPPA_FECHA) FROM recibo_provisional_pago WHERE RCPR_ID = :ID INTO :VENCE;
                    DIAS = VENCE - FECHA;
                    if (DETALLE = 'S') then
                        BEGIN
                        CORRIENTE = 0;
                        CERO = 0;
                        TREINTA = 0;
                        SESENTA = 0;
                        NOVENTA = 0;
                        CIENTOCHENTA = 0;
                        DOSSETENTA = 0;
                        tressesenta = 0;
                        END
                    if (DIAS < 0) then
                        CORRIENTE = CORRIENTE + SALDO;
                    ELSE
                        if (DIAS < DIASR) then
                            CERO = CERO + SALDO;
                        ELSE
                            if (DIAS < (DIASR * 2)) then
                                TREINTA = TREINTA + SALDO;
                            ELSE
                                if (DIAS < (DIASR * 3)) then
                                    SESENTA = SESENTA + SALDO;
                                ELSE
                                    BEGIN
                                    if (EXTENDIDA = 'N') then
                                        NOVENTA = NOVENTA + SALDO;
                                    else    
                                        BEGIN
                                        if (DIAS < (DIASR * 3) * 2) then
                                            NOVENTA = NOVENTA + SALDO;
                                        ELSE
                                            if (DIAS < (DIASR * 3) * 3) then
                                                CIENTOCHENTA = CIENTOCHENTA + SALDO;
                                            ELSE
                                                if (DIAS < (DIASR * 3) * 4) then
                                                    dossetenta = dossetenta + SALDO;
                                                ELSE
                                                    tressesenta = tressesenta + SALDO;
                                        END
                                    END
                    if (DETALLE = 'S') then
                        SUSPEND;
                    END
                if (DETALLE = 'N') then
                    begin
                    SALDO = CORRIENTE + CERO + TREINTA + SESENTA + NOVENTA;
                    DIAS = MAXDIAS;
                    SUSPEND;
                    end
                END
            END  /* FOR COBRADOR */
        END
    END  /* FOR NIT */
END
^

SET TERM ; ^

/* 20090207 : EXPORTACION DE DATOS DICOM */

SET TERM ^ ;

CREATE OR ALTER PROCEDURE AKTIVIA_CLIENTES
RETURNS (
    CODCLIE VARCHAR(20),
    NOM VARCHAR(60),
    CODSUC VARCHAR(10),
    DIR VARCHAR(60),
    TEL VARCHAR(40),
    EMAIL VARCHAR(100),
    NIT VARCHAR(20),
    FPAGO INTEGER,
    SUBZONA VARCHAR(2),
    CUPO NUMERIC(18,2),
    CEL VARCHAR(25),
    LISTA INTEGER,
    GRUPO INTEGER,
    CIU VARCHAR(40),
    CODCIU VARCHAR(6),
    ZONA VARCHAR(2),
    VEND INTEGER,
    COBR INTEGER)
AS
BEGIN
subzona = '';
for select t.terc_nit,terc_nom,terc_dir,terc_ciu,terc_tel,terc_email,terc_cel,c.clie_cod,c.zona_cod,c.clie_cupo,c.vend_cod, c.cobr_cod, c.lipr_cod, c.clie_dias,T.ciud_cod, s.clcu_cod, c.grca_cod
    from terceros t,clientes c, cliente_sucursales s
    where t.terc_nit = c.terc_nit and s.terc_nit = c.terc_nit AND C.clie_estado = 'A'
    order by t.terc_nit, s.clcu_cod
    into :nit, :nom, :dir, :ciu, :tel, :email, :cel, :codclie, :zona, :cupo, :vend, :cobr, :lista, :fpago, :codciu, :codsuc, :grupo
    do
    begin
    if (fpago > 0) then
        FPAGO = 1;
    suspend;
    end
end
^

SET TERM ; ^

grant execute on procedure aktivia_clientes to public;

SET TERM ^ ;

CREATE OR ALTER PROCEDURE AKTIVIA_VENDEDORES (
    TIPO INTEGER,
    CIU VARCHAR(40))
RETURNS (
    COD INTEGER,
    NOMBRE VARCHAR(60),
    CC VARCHAR(20),
    TIPOVEND INTEGER,
    DIRECCION VARCHAR(60),
    TELEFONOS VARCHAR(30),
    CIUDAD VARCHAR(40),
    CODCIUD VARCHAR(5),
    ZONA VARCHAR(2))
AS
begin
tipovend = tipo;
ciudad = '';
codciud = CIU;
FOR SELECT VEND_COD, VEND_NOMBRE, VEND_DIRECCION, VEND_TELEFONOS, VEND_CC, PROY_COD
    FROM VENDEDORES WHERE VEND_ESTADO = 'A' order by VEND_COD
    INTO :cod, :nombre, :direccion, :telefonos, :cc, :zona
    DO
    suspend;
end
^

SET TERM ; ^

GRANT EXECUTE ON PROCEDURE aktivia_vendedores TO PUBLIC;

SET TERM ^ ;

CREATE OR ALTER PROCEDURE AKTIVIA_PRODUCTOS
RETURNS (
    CODIGO VARCHAR(15),
    BARRAS VARCHAR(15),
    DESCR VARCHAR(60),
    IVA NUMERIC(9,2),
    ICO NUMERIC(18,2),
    UNIDAD VARCHAR(8),
    UNIDADES VARCHAR(100),
    GRUPO VARCHAR(30),
    MARCA VARCHAR(30),
    LISTA1 NUMERIC(18,2),
    LISTA2 NUMERIC(18,2),
    LISTA3 NUMERIC(18,2),
    LISTA4 NUMERIC(18,2),
    LISTA5 NUMERIC(18,2))
AS
declare variable UNIDAD2 VARCHAR(8);
declare variable FACTOR NUMERIC(18,4);
declare variable I INTEGER;
declare variable LISTA NUMERIC(18,2);
begin
FOR select a.arti_cod, arti_des, a.grup_cod, marc_cod, arti_unidad, coba_cod, t.taiv_porc, a.arti_consumo
    from articulo a, barras_articulo b, tarifa_iva t WHERE A.arti_cod = B.arti_cod
    INTO  :codigo, :descr, :grupo, :marca, :unidad, :barras, :iva, :ico
    do
    BEGIN
    SELECT GRUP_NOM FROM GRUPO WHERE GRUP_COD = :grupo INTO :grupo;
    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :marca INTO :marca;
    UNIDADES = '';
    FOR SELECT UNAR_UNIDAD, UNAR_FACCAN FROM unidad_articulo WHERE UNAR_ACTIVA = 'S' INTO :unidad2, :factor
        DO
        BEGIN
        if (UNIDAD <> '') then
            UNIDADES = UNIDADES || ',';
        UNIDADES = UNIDADES || unidad2 || '.' || cast(factor as varchar(20));
        END
    I = 0;
    LISTA1 = 0;
    LISTA2 = 0;
    LISTA3 = 0;
    LISTA4 = 0;
    LISTA5 = 0;
    FOR SELECT PRAR_FIJO FROM precios_articulo WHERE ARTI_COD = :codigo ORDER BY LIPR_COD INTO :LISTA
        DO
        begin
        if (I = 0) then
            LISTA1 = LISTA;
        if (I = 1) then
            LISTA2 = LISTA;
        if (I = 2) then
            LISTA3 = LISTA;
        if (I = 3) then
            LISTA4 = LISTA;
        if (I = 4) then
            LISTA5 = LISTA;
        END
    suspend;
    END
end
^

SET TERM ; ^

grant execute on procedure aktivia_productos to public;

SET TERM ^ ;

CREATE OR ALTER PROCEDURE aktivia_inventario(FECHA DATE)
RETURNS (
    CODBOD VARCHAR(2),
    CODIGO VARCHAR(15),
    CANT NUMERIC(18,4))
AS
BEGIN
FOR SELECT BODE_COD FROM BODEGA WHERE BODE_ACTIVA = 'S' INTO :CODBOD
    DO
    BEGIN
    FOR SELECT ARTI_COD FROM ARTICULO A WHERE ESAR_COD <> 'I' AND ARTI_EXIST <> 'N' INTO :CODIGO
        DO
        BEGIN
        EXECUTE PROCEDURE saldo_inventario(CODIGO, :CODBOD, FECHA) returning_values (CANT);
        SUSPEND;
        END
    END
END
^

SET TERM ; ^

GRANT execute ON PROCEDURE aktivia_inventario TO PUBLIC;

SET TERM ^ ;

CREATE OR ALTER PROCEDURE AKTIVIA_CARTERA(FECHA DATE)
RETURNS (
    NIT VARCHAR(20),
    SALDO NUMERIC(18,2),
    VENCE DATE,
    NUMERO VARCHAR(10),
    TIPONOM VARCHAR(8))
AS
declare variable SUCURSAL VARCHAR(10);
declare variable TIPO INTEGER;
declare variable ID INTEGER;
BEGIN
FOR select C.TERC_NIT, CLCU_COD
    from terceros T, CLIENTES C, CLIENTE_SUCURSALES S
    where C.TERC_NIT = T.TERC_NIT AND TERC_CLIE = 'S' AND S.TERC_NIT = C.TERC_NIT
    INTO :NIT, :SUCURSAL
    DO  
    BEGIN
    /* BUSQUE EN SALDOS_DOC_CARTERA LOS QUE TENGAN SALDO > 0 */
    FOR SELECT MVCL_TIPOREF, MVCL_IDREF, MVCL_PREFREF || MVCL_NUMREF, MVCL_VENCE
        FROM MOVIMIENTO_CLIENTES WHERE TERC_NIT = :NIT AND MVCL_SUCURSAL = :SUCURSAL AND MVCL_FECHA <= :FECHA AND MVCL_ABONO = 'N'
        INTO :TIPO, :ID, :NUMERO, :VENCE
        DO
        BEGIN
        EXECUTE PROCEDURE saldo_doc_cartera(TIPO, ID, FECHA, 0) returning_values (SALDO);
        if (SALDO <> 0) then
            BEGIN
            SELECT TIDO_NOMCORTO FROM TIPO_DOCUMENTO WHERE TIDO_COD = :TIPO INTO :TIPONOM;
            SUSPEND;
            END  /* FOR */
        END
    END
END
^

SET TERM ; ^

grant execute on procedure aktivia_cartera to PUBLIC;

SET TERM ^ ;

CREATE OR ALTER PROCEDURE AKTIVIA_PRODUCTOS
RETURNS (
    CODIGO VARCHAR(15),
    BARRAS VARCHAR(15),
    DESCR VARCHAR(60),
    IVA NUMERIC(9,2),
    ICO NUMERIC(18,2),
    UNIDAD VARCHAR(8),
    UNIDADES VARCHAR(100),
    GRUPO VARCHAR(30),
    MARCA VARCHAR(30),
    LISTA1 NUMERIC(18,2),
    LISTA2 NUMERIC(18,2),
    LISTA3 NUMERIC(18,2),
    LISTA4 NUMERIC(18,2),
    LISTA5 NUMERIC(18,2),
    LISTA6 NUMERIC(18,2),
    LISTA7 NUMERIC(18,2),
    LISTA8 NUMERIC(18,2))
AS
declare variable UNIDAD2 VARCHAR(8);
declare variable FACTOR NUMERIC(18,4);
begin
FOR select a.arti_cod, arti_des, a.grup_cod, marc_cod, arti_unidad, coba_cod, t.taiv_porc, a.arti_consumo
    from articulo a, barras_articulo b, tarifa_iva t WHERE A.arti_cod = B.arti_cod
    INTO  :codigo, :descr, :grupo, :marca, :unidad, :barras, :iva, :ico
    do
    BEGIN
    SELECT GRUP_NOM FROM GRUPO WHERE GRUP_COD = :grupo INTO :grupo;
    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :marca INTO :marca;
    UNIDADES = '';
    FOR SELECT UNAR_UNIDAD, UNAR_FACCAN FROM unidad_articulo WHERE ARTI_COD = :CODIGO AND UNAR_ACTIVA = 'S' INTO :unidad2, :factor
        DO
        BEGIN
        if (UNIDAD <> '') then
            UNIDADES = UNIDADES || ',';
        UNIDADES = UNIDADES || unidad2 || '.' || cast(factor as varchar(20));
        END
    SELECT PRAR_FIJO FROM precios_articulo WHERE ARTI_COD = :codigo and lipr_cod = 1 INTO :LISTA1;
    SELECT PRAR_FIJO FROM precios_articulo WHERE ARTI_COD = :codigo and lipr_cod = 2 INTO :LISTA2;
    SELECT PRAR_FIJO FROM precios_articulo WHERE ARTI_COD = :codigo and lipr_cod = 3 INTO :LISTA3;
    SELECT PRAR_FIJO FROM precios_articulo WHERE ARTI_COD = :codigo and lipr_cod = 4 INTO :LISTA4;
    SELECT PRAR_FIJO FROM precios_articulo WHERE ARTI_COD = :codigo and lipr_cod = 5 INTO :LISTA5;
    SELECT PRAR_FIJO FROM precios_articulo WHERE ARTI_COD = :codigo and lipr_cod = 6 INTO :LISTA6;
    SELECT PRAR_FIJO FROM precios_articulo WHERE ARTI_COD = :codigo and lipr_cod = 7 INTO :LISTA7;
    SELECT PRAR_FIJO FROM precios_articulo WHERE ARTI_COD = :codigo and lipr_cod = 8 INTO :LISTA8;
    suspend;
    END
end
^

SET TERM ; ^

/* 20090208  SUME LAS CANTIDADES SI SE REPITE UN ARTICULO EN LA MISMA BODEGA Y SE IMPRIME CON BODEGAS COMO COLUMNA */

SET TERM ^ ;

CREATE OR ALTER PROCEDURE IMPR_ORDENCMP(
    ID INTEGER,
    BODINI VARCHAR(2),
    BODFIN VARCHAR(2))
RETURNS (
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    DIASVENCE INTEGER,
    NIT VARCHAR(20),
    NOMTERCERO VARCHAR(60),
    CODBODEGA VARCHAR(2),
    NOMBODEGA VARCHAR(30),
    COTIZACION VARCHAR(30),
    SUBTOTAL NUMERIC(18,2),
    DTOPORC NUMERIC(9,2),
    DTOMONTO NUMERIC(18,2),
    ADICIONAL NUMERIC(18,2),
    IVAMONTO NUMERIC(18,2),
    EXTRA NUMERIC(18,2),
    DTOFPORC NUMERIC(9,2),
    DTOFMONTO NUMERIC(18,2),
    FECHADTO DATE,
    TOTALFAC NUMERIC(18,2),
    OBS BLOB SUB_TYPE 1 SEGMENT SIZE 80,
    BOD1 VARCHAR(2),
    BOD2 VARCHAR(2),
    BOD3 VARCHAR(2),
    BOD4 VARCHAR(2),
    BOD5 VARCHAR(2),
    BOD6 VARCHAR(2),
    BOD7 VARCHAR(2),
    BOD8 VARCHAR(2),
    BOD9 VARCHAR(2),
    BOD0 VARCHAR(2),
    ITEM INTEGER,
    ARTICULO VARCHAR(15),
    CODBAR VARCHAR(15),
    ARTIDES VARCHAR(60),
    ARTIPROV VARCHAR(15),
    CANT NUMERIC(18,4),
    UNIDAD VARCHAR(8),
    BODITEM VARCHAR(2),
    PRUNIT NUMERIC(18,2),
    DTOITPORC NUMERIC(9,2),
    DTOITMONTO NUMERIC(18,2),
    PRNETO NUMERIC(18,2),
    IVAPORC NUMERIC(9,2),
    IVAITMONTO NUMERIC(18,2),
    CONSUMO NUMERIC(18,2),
    TOTAL NUMERIC(18,2),
    CODIGOPR VARCHAR(20),
    ZONACOD VARCHAR(2),
    ZONANOM VARCHAR(30),
    DV CHAR(1),
    DIRECCION VARCHAR(60),
    CIUDAD VARCHAR(40),
    TELEFONO VARCHAR(40),
    CONTACTO VARCHAR(60),
    DIASPAGO INTEGER,
    FAX VARCHAR(25),
    GRUPO VARCHAR(2),
    SUBGRUPO VARCHAR(3),
    MARCA VARCHAR(3),
    PESO NUMERIC(9,4),
    ANCHO NUMERIC(18,4),
    ALTO NUMERIC(18,4),
    LARGO NUMERIC(18,4),
    SUMA1 NUMERIC(18,2),
    SUMA2 NUMERIC(18,2),
    SUMA3 NUMERIC(18,2),
    IVA1 NUMERIC(18,2),
    IVA2 NUMERIC(18,2),
    IVA3 NUMERIC(18,2),
    SUMAEX NUMERIC(18,2),
    SUMAGR NUMERIC(18,2),
    CANTB1 NUMERIC(18,4),
    CANTB2 NUMERIC(18,4),
    CANTB3 NUMERIC(18,4),
    CANTB4 NUMERIC(18,4),
    CANTB5 NUMERIC(18,4),
    CANTB6 NUMERIC(18,4),
    CANTB7 NUMERIC(18,4),
    CANTB8 NUMERIC(18,4),
    CANTB9 NUMERIC(18,4),
    CANTB0 NUMERIC(18,4))
AS
declare variable imptos char(1);
declare variable tarifa integer;
declare variable orden char(2);
declare variable i integer;
declare variable totalitem numeric(18,2);
declare variable ivaitem numeric(18,2);
declare variable cantitem numeric(18,2);
BEGIN
  SELECT PREF_PRE, ORDC_NUMERO, ORDC_FECHA, ORDC_VALIDEZ, O.BODE_COD, BODE_NOM, O.TERC_NIT, TERC_NOM, ORDC_COTIZACION, ORDC_IMPTOS,
    ORDC_DTOPORC, ORDC_DTOMONTO, ORDC_ADICIONAL, ORDC_IVAMONTO, 
    ORDC_EXTRA, ORDC_DTOFPORC, ORDC_DTOFMONTO, ORDC_DTOFECHA, ORDC_TOTAL, TERC_DIR, TERC_CIU, TERC_TEL, TERC_CONTACTO, TERC_FAX, TERC_DV,
    ORDC_OBS,ORDC_DIASPAGO
    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;
    
  SELECT PROV_COD, P.GRPR_COD, GRPR_NOM
    FROM PROVEEDORES P, GRUPOS_PROVEEDORES G
    WHERE TERC_NIT = :NIT AND G.GRPR_COD = P.GRPR_COD
    INTO :CODIGOPR, :ZONACOD, :ZONANOM;
    
  SUBTOTAL = TOTALFAC - EXTRA - IVAMONTO - ADICIONAL + DTOMONTO;
  SUMAEX = 0;
  SUMA1 = 0;
  SUMA2 = 0;
  SUMA3 = 0;
  IVA1 = 0;
  IVA2 = 0;
  IVA3 = 0;

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

SET TERM ; ^



/* 20090209 OPTIMIZACION DEL REPORTE DE RETENCIONES */
SET TERM ^ ;

CREATE OR ALTER PROCEDURE REP_RETENCION_CLIENTE(
    DESDE VARCHAR(20),
    HASTA VARCHAR(20),
    GRPINI VARCHAR(5),
    GRPFIN VARCHAR(5),
    FECINI DATE,
    FECFIN DATE,
    DETALLE CHAR(1),
    ORDEN CHAR(1),
    AGRUPA CHAR(1),
    SUBEMPRESA INTEGER)
RETURNS (
    NIT VARCHAR(20),
    NOMBRE VARCHAR(60),
    TELEFONO VARCHAR(40),
    CIUDAD VARCHAR(40),
    CODZONA VARCHAR(2),
    NOMZONA VARCHAR(60),
    CODCOBR INTEGER,
    NOMCOBR VARCHAR(60),
    SUCURSAL VARCHAR(10),
    NOMSUC VARCHAR(60),
    DV CHAR(1),
    CODCIUD CHAR(5),
    NOMCIUD VARCHAR(60),
    TIPODOC VARCHAR(8),
    IDDOC INTEGER,
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    CONCEPTO VARCHAR(60),
    DEBITO NUMERIC(18,2),
    CREDITO NUMERIC(18,2),
    RTFTE NUMERIC(18,2),
    RTIVA NUMERIC(18,2),
    RTICA NUMERIC(18,2))
AS
declare variable NITINI VARCHAR(20);
declare variable NITFIN VARCHAR(20);
declare variable NOMINI VARCHAR(20);
declare variable NOMFIN VARCHAR(20);
declare variable RETES VARCHAR(2);
declare variable OK CHAR(1);
declare variable DB CHAR(1);
BEGIN
EXECUTE PROCEDURE LEE_CONFIGURACION ('CARTERA', 'SALDOS', 'DESCONTAR RETENCIONES POR CAUSACION') returning_values (RETES);
if (ORDEN = 'C') then
    BEGIN
    NITINI = DESDE;
    NITFIN = HASTA;
    NOMINI = '';
    NOMFIN = 'zz';
    END
ELSE
    BEGIN
    NOMINI = DESDE;
    NOMFIN = HASTA;
    NITINI = '';
    NITFIN = 'zz';
    END

if (DETALLE = 'S') then
    BEGIN
    if (RETES = 'SI') then
        FOR select T.TERC_NIT, TERC_NOM, TERC_DV, TERC_TEL, TERC_CIU, S.COBR_COD, C.ZONA_COD, T.CIUD_COD, CLCU_COD, CLSU_NOMBRE,
            tido_nomcorto, mvcl_idref, mvcl_prefref, mvcl_numref, mvcl_fecha, mvcl_conc, mvcl_monto, mvcl_debito, mvcl_rtefte, mvcl_rteiva, mvcl_rteica
            from movimiento_clientes m, tipo_documento TD, terceros T, CLIENTES C, CLIENTE_SUCURSALES S
            where m.mvcl_tiporef = td.tido_cod and mvcl_fecha >= :FECINI and mvcl_fecha <= :FECFIN AND mvcl_abono = 'N'
            and C.TERC_NIT = T.TERC_NIT AND TERC_CLIE = 'S' AND S.TERC_NIT = C.TERC_NIT AND M.terc_nit = T.terc_nit AND
            T.TERC_NIT >= :NITINI AND T.TERC_NIT <= :NITFIN AND TERC_NOM >= :NOMINI AND TERC_NOM <= :NOMFIN AND ((sucu_id = :subempresa) or (:subempresa = 0))
            ORDER BY T.TERC_NIT, MVCL_FECHA, MVCL_ID
            into :NIT, :NOMBRE, :DV, :TELEFONO, :CIUDAD, :CODCOBR, :CODZONA, :CODCIUD, :SUCURSAL, :NOMSUC,
            :TIPODOC, :IDDOC, :PREFIJO, :NUMERO, :FECHA, :CONCEPTO, :DEBITO, :DB, :RTFTE, :RTIVA, :RTICA
            DO
            BEGIN
            OK = 'N';
            if (AGRUPA = 'Z') then
                BEGIN
                if (GRPINI = '') then
                    BEGIN
                    if ((CODZONA IS NULL) or (CODZONA >= :GRPINI AND CODZONA <= :GRPFIN)) then
                        OK = 'S';
                    END
                ELSE
                    if (CODZONA >= :GRPINI AND CODZONA <= :GRPFIN) then
                        OK = 'S';
                END
            if (AGRUPA = 'C') then
                BEGIN
                if (GRPINI = '') then
                    BEGIN
                    if ((CODCOBR IS NULL) or (CODCOBR >= :GRPINI AND CODCOBR <= :GRPFIN)) then
                        OK = 'S';
                    END
                ELSE
                    if (CODCOBR >= :GRPINI AND CODCOBR <= :GRPFIN) then
                        OK = 'S';
                END
            if (AGRUPA = 'I') then
                BEGIN
                if (GRPINI = '') then
                    BEGIN
                    if ((CODCIUD IS NULL) or (CODCIUD >= :GRPINI AND CODCIUD <= :GRPFIN)) then
                        OK = 'S';
                    END
                ELSE
                    if (CODCIUD >= :GRPINI AND CODCIUD <= :GRPFIN) then
                        OK = 'S';
                END
            if (AGRUPA = 'N') then
                OK = 'S';
        
            if (OK = 'S') then
                BEGIN
                SELECT COBR_NOM FROM COBRADORES WHERE COBR_COD = :CODCOBR INTO :NOMCOBR;
                SELECT ZONA_NOM FROM ZONAS WHERE ZONA_COD = :CODZONA INTO :NOMZONA;
                SELECT CIUD_NOM FROM CIUDADES WHERE CIUD_COD = :CODCIUD INTO :NOMCIUD;
                if (RTFTE IS NULL) then
                    RTFTE = 0;
                if (RTIVA IS NULL) then
                    RTIVA = 0;
                if (RTICA IS NULL) then
                    RTICA = 0;
                if (DB = 'N') then
                    BEGIN
                    CREDITO = DEBITO;
                    DEBITO = 0;
                    RTFTE = rtfte * -1;
                    RTIVA = rtiva * -1;
                    RTICA = rtica * -1;
                    END
                ELSE
                    CREDITO = 0;
                SUSPEND;
                END
            END
    ELSE
        FOR select T.TERC_NIT, TERC_NOM, TERC_DV, TERC_TEL, TERC_CIU, S.COBR_COD, C.ZONA_COD, T.CIUD_COD, CLCU_COD, CLSU_NOMBRE,
            tido_nomcorto, mvcl_idref, mvcl_prefref, mvcl_numref, mvcl_fecha, mvcl_conc, mvcl_monto, mvcl_debito, mvcl_rtefte, mvcl_rteiva, mvcl_rteica
            from movimiento_clientes m, tipo_documento TD, terceros T, CLIENTES C, CLIENTE_SUCURSALES S
            where m.mvcl_tiporef = td.tido_cod and mvcl_fecha >= :FECINI and mvcl_fecha <= :FECFIN AND mvcl_abono = 'S'
            and C.TERC_NIT = T.TERC_NIT AND TERC_CLIE = 'S' AND S.TERC_NIT = C.TERC_NIT AND M.terc_nit = T.terc_nit AND
            T.TERC_NIT >= :NITINI AND T.TERC_NIT <= :NITFIN AND TERC_NOM >= :NOMINI AND TERC_NOM <= :NOMFIN AND ((sucu_id = :subempresa) or (:subempresa = 0))
            ORDER BY T.TERC_NIT, MVCL_FECHA, MVCL_ID
            into :NIT, :NOMBRE, :DV, :TELEFONO, :CIUDAD, :CODCOBR, :CODZONA, :CODCIUD, :SUCURSAL, :NOMSUC,
            :TIPODOC, :IDDOC, :PREFIJO, :NUMERO, :FECHA, :CONCEPTO, :DEBITO, :DB, :RTFTE, :RTIVA, :RTICA
            DO
            BEGIN
            if (RTFTE IS NULL) then
                RTFTE = 0;
            if (RTIVA IS NULL) then
                RTIVA = 0;
            if (RTICA IS NULL) then
                RTICA = 0;
            if ((RTFTE <> 0) or (RTIVA <> 0) or (RTICA <> 0)) then
                BEGIN
                OK = 'N';
                if (AGRUPA = 'Z') then
                    BEGIN
                    if (GRPINI = '') then
                        BEGIN
                        if ((CODZONA IS NULL) or (CODZONA >= :GRPINI AND CODZONA <= :GRPFIN)) then
                            OK = 'S';
                        END
                    ELSE
                        if (CODZONA >= :GRPINI AND CODZONA <= :GRPFIN) then
                            OK = 'S';
                    END
                if (AGRUPA = 'C') then
                    BEGIN
                    if (GRPINI = '') then
                        BEGIN
                        if ((CODCOBR IS NULL) or (CODCOBR >= :GRPINI AND CODCOBR <= :GRPFIN)) then
                            OK = 'S';
                        END
                    ELSE
                        if (CODCOBR >= :GRPINI AND CODCOBR <= :GRPFIN) then
                            OK = 'S';
                    END
                if (AGRUPA = 'I') then
                    BEGIN
                    if (GRPINI = '') then
                        BEGIN
                        if ((CODCIUD IS NULL) or (CODCIUD >= :GRPINI AND CODCIUD <= :GRPFIN)) then
                            OK = 'S';
                        END
                    ELSE
                        if (CODCIUD >= :GRPINI AND CODCIUD <= :GRPFIN) then
                            OK = 'S';
                    END
                if (AGRUPA = 'N') then
                    OK = 'S';
            
                if (OK = 'S') then
                    BEGIN
                    SELECT COBR_NOM FROM COBRADORES WHERE COBR_COD = :CODCOBR INTO :NOMCOBR;
                    SELECT ZONA_NOM FROM ZONAS WHERE ZONA_COD = :CODZONA INTO :NOMZONA;
                    SELECT CIUD_NOM FROM CIUDADES WHERE CIUD_COD = :CODCIUD INTO :NOMCIUD;
                    if (DB = 'N') then
                        BEGIN
                        CREDITO = DEBITO;
                        DEBITO = 0;
                        END
                    ELSE
                        CREDITO = 0;
                    SUSPEND;
                    END
                END
            END
    END
ELSE
    BEGIN
    if (RETES = 'SI') then
        BEGIN
        FOR select MAX(T.TERC_NIT), MAX(TERC_NOM), MAX(TERC_DV), MAX(TERC_TEL), MAX(TERC_CIU), MAX(S.COBR_COD), MAX(C.ZONA_COD), MAX(T.CIUD_COD), MAX(CLCU_COD), MAX(CLSU_NOMBRE),
            SUM(MVCL_RTEFTE), SUM(MVCL_RTEIVA), SUM(MVCL_RTEICA) 
            from movimiento_clientes m, terceros T, CLIENTES C, CLIENTE_SUCURSALES S
            where mvcl_fecha >= :FECINI and mvcl_fecha <= :FECFIN AND mvcl_abono = 'N'
            and C.TERC_NIT = T.TERC_NIT AND TERC_CLIE = 'S' AND S.TERC_NIT = C.TERC_NIT AND M.terc_nit = T.terc_nit AND
            T.TERC_NIT >= :NITINI AND T.TERC_NIT <= :NITFIN AND TERC_NOM >= :NOMINI AND TERC_NOM <= :NOMFIN AND ((sucu_id = :subempresa) or (:subempresa = 0))
            GROUP BY T.TERC_NIT
            into :NIT, :NOMBRE, :DV, :TELEFONO, :CIUDAD, :CODCOBR, :CODZONA, :CODCIUD, :SUCURSAL, :NOMSUC,
            :RTFTE, :RTIVA, :RTICA
            DO
            BEGIN
            if (RTFTE IS NULL) then
                RTFTE = 0;
            if (RTIVA IS NULL) then
                RTIVA = 0;
            if (RTICA IS NULL) then
                RTICA = 0;
            if ((RTFTE <> 0) or (RTIVA <> 0) or (RTICA <> 0)) then
                BEGIN
                OK = 'N';
                if (AGRUPA = 'Z') then
                    BEGIN
                    if (GRPINI = '') then
                        BEGIN
                        if ((CODZONA IS NULL) or (CODZONA >= :GRPINI AND CODZONA <= :GRPFIN)) then
                            OK = 'S';
                        END
                    ELSE
                        if (CODZONA >= :GRPINI AND CODZONA <= :GRPFIN) then
                            OK = 'S';
                    END
                if (AGRUPA = 'C') then
                    BEGIN
                    if (GRPINI = '') then
                        BEGIN
                        if ((CODCOBR IS NULL) or (CODCOBR >= :GRPINI AND CODCOBR <= :GRPFIN)) then
                            OK = 'S';
                        END
                    ELSE
                        if (CODCOBR >= :GRPINI AND CODCOBR <= :GRPFIN) then
                            OK = 'S';
                    END
                if (AGRUPA = 'I') then
                    BEGIN
                    if (GRPINI = '') then
                        BEGIN
                        if ((CODCIUD IS NULL) or (CODCIUD >= :GRPINI AND CODCIUD <= :GRPFIN)) then
                            OK = 'S';
                        END
                    ELSE
                        if (CODCIUD >= :GRPINI AND CODCIUD <= :GRPFIN) then
                            OK = 'S';
                    END
                if (AGRUPA = 'N') then
                    OK = 'S';
            
                if (OK = 'S') then
                    BEGIN
                    SELECT SUM(MVCL_MONTO) FROM movimiento_clientes WHERE TERC_NIT = :NIT and mvcl_sucursal = :sucursal AND MVCL_FECHA >= :FECINI AND MVCL_FECHA <= :FECFIN AND MVCL_DEBITO = 'S' AND MVCL_ABONO = 'N' AND (MVCL_RTEFTE <> 0 OR MVCL_RTEIVA <> 0 OR MVCL_RTEICA <> 0) and ((sucu_id = :subempresa) or (:subempresa = 0)) INTO :DEBITO;
                    SELECT SUM(MVCL_MONTO) FROM movimiento_clientes WHERE TERC_NIT = :NIT and mvcl_sucursal = :sucursal AND MVCL_FECHA >= :FECINI AND MVCL_FECHA <= :FECFIN AND MVCL_DEBITO = 'N'  AND MVCL_ABONO = 'N' AND (MVCL_RTEFTE <> 0 OR MVCL_RTEIVA <> 0 OR MVCL_RTEICA <> 0) and ((sucu_id = :subempresa) or (:subempresa = 0)) INTO :CREDITO;
                    if (DEBITO IS NULL) then
                        DEBITO = 0;
                    if (CREDITO IS NULL) then
                        CREDITO = 0;
                    SELECT COBR_NOM FROM COBRADORES WHERE COBR_COD = :CODCOBR INTO :NOMCOBR;
                    SELECT ZONA_NOM FROM ZONAS WHERE ZONA_COD = :CODZONA INTO :NOMZONA;
                    SELECT CIUD_NOM FROM CIUDADES WHERE CIUD_COD = :CODCIUD INTO :NOMCIUD;
                    SUSPEND;
                    END
                END
            END
        end
    ELSE
        BEGIN
        FOR select MAX(T.TERC_NIT), MAX(TERC_NOM), MAX(TERC_DV), MAX(TERC_TEL), MAX(TERC_CIU), MAX(S.COBR_COD), MAX(C.ZONA_COD), MAX(T.CIUD_COD), MAX(CLCU_COD), MAX(CLSU_NOMBRE),
            SUM(MVCL_RTEFTE), SUM(MVCL_RTEIVA), SUM(MVCL_RTEICA) 
            from movimiento_clientes m, terceros T, CLIENTES C, CLIENTE_SUCURSALES S
            where mvcl_fecha >= :FECINI and mvcl_fecha <= :FECFIN AND mvcl_abono = 'S'
            and C.TERC_NIT = T.TERC_NIT AND TERC_CLIE = 'S' AND S.TERC_NIT = C.TERC_NIT AND M.terc_nit = T.terc_nit AND
            T.TERC_NIT >= :NITINI AND T.TERC_NIT <= :NITFIN AND TERC_NOM >= :NOMINI AND TERC_NOM <= :NOMFIN AND ((sucu_id = :subempresa) or (:subempresa = 0))
            GROUP BY T.TERC_NIT
            into :NIT, :NOMBRE, :DV, :TELEFONO, :CIUDAD, :CODCOBR, :CODZONA, :CODCIUD, :SUCURSAL, :NOMSUC,
            :RTFTE, :RTIVA, :RTICA
            DO
            BEGIN
            if (RTFTE IS NULL) then
                RTFTE = 0;
            if (RTIVA IS NULL) then
                RTIVA = 0;
            if (RTICA IS NULL) then
                RTICA = 0;
            if ((RTFTE <> 0) or (RTIVA <> 0) or (RTICA <> 0)) then
                BEGIN
                OK = 'N';
                if (AGRUPA = 'Z') then
                    BEGIN
                    if (GRPINI = '') then
                        BEGIN
                        if ((CODZONA IS NULL) or (CODZONA >= :GRPINI AND CODZONA <= :GRPFIN)) then
                            OK = 'S';
                        END
                    ELSE
                        if (CODZONA >= :GRPINI AND CODZONA <= :GRPFIN) then
                            OK = 'S';
                    END
                if (AGRUPA = 'C') then
                    BEGIN
                    if (GRPINI = '') then
                        BEGIN
                        if ((CODCOBR IS NULL) or (CODCOBR >= :GRPINI AND CODCOBR <= :GRPFIN)) then
                            OK = 'S';
                        END
                    ELSE
                        if (CODCOBR >= :GRPINI AND CODCOBR <= :GRPFIN) then
                            OK = 'S';
                    END
                if (AGRUPA = 'I') then
                    BEGIN
                    if (GRPINI = '') then
                        BEGIN
                        if ((CODCIUD IS NULL) or (CODCIUD >= :GRPINI AND CODCIUD <= :GRPFIN)) then
                            OK = 'S';
                        END
                    ELSE
                        if (CODCIUD >= :GRPINI AND CODCIUD <= :GRPFIN) then
                            OK = 'S';
                    END
                if (AGRUPA = 'N') then
                    OK = 'S';
            
                if (OK = 'S') then
                    BEGIN
                    SELECT SUM(MVCL_MONTO) FROM movimiento_clientes WHERE TERC_NIT = :NIT and mvcl_sucursal = :sucursal AND MVCL_FECHA >= :FECINI AND MVCL_FECHA <= :FECFIN AND MVCL_DEBITO = 'S' AND MVCL_ABONO = 'S' AND (MVCL_RTEFTE <> 0 OR MVCL_RTEIVA <> 0 OR MVCL_RTEICA <> 0) and ((sucu_id = :subempresa) or (:subempresa = 0)) INTO :DEBITO;
                    SELECT SUM(MVCL_MONTO) FROM movimiento_clientes WHERE TERC_NIT = :NIT and mvcl_sucursal = :sucursal AND MVCL_FECHA >= :FECINI AND MVCL_FECHA <= :FECFIN AND MVCL_DEBITO = 'N'  AND MVCL_ABONO = 'S' AND (MVCL_RTEFTE <> 0 OR MVCL_RTEIVA <> 0 OR MVCL_RTEICA <> 0) and ((sucu_id = :subempresa) or (:subempresa = 0)) INTO :CREDITO;
                    if (DEBITO IS NULL) then
                        DEBITO = 0;
                    if (CREDITO IS NULL) then
                        CREDITO = 0;
                    SELECT COBR_NOM FROM COBRADORES WHERE COBR_COD = :CODCOBR INTO :NOMCOBR;
                    SELECT ZONA_NOM FROM ZONAS WHERE ZONA_COD = :CODZONA INTO :NOMZONA;
                    SELECT CIUD_NOM FROM CIUDADES WHERE CIUD_COD = :CODCIUD INTO :NOMCIUD;
                    SUSPEND;
                    END
                END
            END
        END
    END
END
^

SET TERM ; ^

/* 20090210  INCLUIR LAS TRANSFERENCIAS Y APLICACIONES CLIENTE/PROVEEDOR EN LOS DOCUMENTOS SIN CONTABILIZAR */
SET TERM ^ ;

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

SET TERM ; ^


/* 20090210B  LA VARIABLE DESCRETE ESTABA COMO 'S' Y NO COMO 'SI', SIEMPRE LO REPORTABA CON LOS EGRESOS */

SET TERM ^ ;

CREATE OR ALTER PROCEDURE REP_RETENCION_PROVEEDOR(
    DESDE VARCHAR(20),
    HASTA VARCHAR(20),
    GRPINI VARCHAR(5),
    GRPFIN VARCHAR(5),
    FECINI DATE,
    FECFIN DATE,
    DETALLE CHAR(1),
    ORDEN CHAR(1),
    AGRUPA CHAR(1))
RETURNS (
    NIT VARCHAR(20),
    NOMBRE VARCHAR(60),
    TELEFONO VARCHAR(40),
    CIUDAD VARCHAR(40),
    CODZONA VARCHAR(2),
    NOMZONA VARCHAR(60),
    DV CHAR(1),
    CODCIUD CHAR(5),
    NOMCIUD VARCHAR(60),
    TIPODOC VARCHAR(8),
    IDDOC INTEGER,
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    CONCEPTO VARCHAR(60),
    DEBITO NUMERIC(18,2),
    CREDITO NUMERIC(18,2),
    RTFTE NUMERIC(18,2),
    RTIVA NUMERIC(18,2),
    RTICA NUMERIC(18,2))
AS
declare variable NITINI VARCHAR(20);
declare variable NITFIN VARCHAR(20);
declare variable NOMINI VARCHAR(20);
declare variable NOMFIN VARCHAR(20);
declare variable OK CHAR(1);
declare variable DB CHAR(1);
declare variable AB CHAR(1);
declare variable DESCRETE CHAR(2);
BEGIN
if (ORDEN = 'C') then
    BEGIN
    NITINI = DESDE;
    NITFIN = HASTA;
    NOMINI = '';
    NOMFIN = 'zz';
    END
ELSE
    BEGIN
    NOMINI = DESDE;
    NOMFIN = HASTA;
    NITINI = '';
    NITFIN = 'zz';
    END
EXECUTE PROCEDURE LEE_CONFIGURACION('CXPAGAR', 'SALDOS', 'DESCONTAR RETENCIONES POR CAUSACION') returning_values (DESCRETE);
/* Ubique el NIT */
FOR select T.TERC_NIT, TERC_NOM, TERC_DV, TERC_TEL, TERC_CIU, P.GRPR_COD, GRPR_NOM, T.CIUD_COD, CIUD_NOM
    from terceros T, PROVEEDORES P
    LEFT OUTER JOIN GRUPOS_PROVEEDORES G ON (P.GRPR_COD = G.GRPR_COD)
    LEFT OUTER JOIN CIUDADES CI ON (T.CIUD_COD = CI.CIUD_COD)
    where P.TERC_NIT = T.TERC_NIT AND TERC_PROV = 'S' AND T.TERC_NIT >= :NITINI AND T.TERC_NIT <= :NITFIN AND
        TERC_NOM >= :NOMINI AND TERC_NOM <= :NOMFIN
    INTO :NIT, :NOMBRE, :DV, :TELEFONO, :CIUDAD, :CODZONA, :NOMZONA, :CODCIUD, :NOMCIUD
    DO  
    BEGIN
    OK = 'N';
    if (AGRUPA = 'Z') then
        BEGIN
        if (GRPINI = '') then
            BEGIN
            if ((CODZONA IS NULL) or (CODZONA >= :GRPINI AND CODZONA <= :GRPFIN)) then
                OK = 'S';
            END
        ELSE
            if (CODZONA >= :GRPINI AND CODZONA <= :GRPFIN) then
                OK = 'S';
        END
    if (AGRUPA = 'C') then
        BEGIN
        if (GRPINI = '') then
            BEGIN
            if ((CODCIUD IS NULL) or (CODCIUD >= :GRPINI AND CODCIUD <= :GRPFIN)) then
                OK = 'S';
            END
        ELSE
            if (CODCIUD >= :GRPINI AND CODCIUD <= :GRPFIN) then
                OK = 'S';
        END
    if (AGRUPA = 'N') then
        OK = 'S';
        
    if (OK = 'S') then
        BEGIN
        if (DETALLE = 'S') then
            BEGIN
            if (DESCRETE = 'SI') then
                FOR select tido_nomcorto, mvpr_idref, mvpr_prefijo, mvpr_numero, mvpr_fecha, mvpr_conc, mvpr_monto, mvpr_debito, mvpr_rtfte, mvpr_rtiva, mvpr_rtica, mvpr_abono
                    from movimiento_proveedor m, tipo_documento t
                    where m.mvpr_tiporef = t.tido_cod and terc_nit = :NIT and mvpr_fecha >= :FECINI and mvpr_fecha <= :FECFIN AND MVPR_TIPOREF <> 55 AND mvpr_abono = 'N' AND (MVPR_RTFTE <> 0 OR MVPR_RTIVA <> 0 OR MVPR_RTICA <> 0) 
                    order by mvpr_fecha, mvpr_tiporef
                    into :TIPODOC, :IDDOC, :PREFIJO, :NUMERO, :FECHA, :CONCEPTO, :DEBITO, :DB, :RTFTE, :RTIVA, :RTICA, :AB
                    DO
                    BEGIN
                    if (RTFTE IS NULL) then
                        RTFTE = 0;
                    if (RTIVA IS NULL) then
                        RTIVA = 0;
                    if (RTICA IS NULL) then
                        RTICA = 0;
                    if (DB = 'N') then
                        BEGIN
                        CREDITO = DEBITO;
                        DEBITO = 0;
                        RTFTE = RTFTE * -1;
                        RTIVA = RTIVA * -1;
                        RTICA = RTICA * -1;
                        END
                    ELSE
                        CREDITO = 0;
                    if ((RTFTE <> 0) or (RTIVA <> 0) or (RTICA <> 0)) then
                        SUSPEND;
                    END
            ELSE
                FOR select tido_nomcorto, mvpr_idref, mvpr_prefijo, mvpr_numero, mvpr_fecha, mvpr_conc, mvpr_monto, mvpr_debito, mvpr_rtfte, mvpr_rtiva, mvpr_rtica, mvpr_abono
                    from movimiento_proveedor m, tipo_documento t
                    where m.mvpr_tiporef = t.tido_cod and terc_nit = :NIT and mvpr_fecha >= :FECINI and mvpr_fecha <= :FECFIN AND mvpr_abono = 'S' AND (MVPR_RTFTE <> 0 OR MVPR_RTIVA <> 0 OR MVPR_RTICA <> 0)
                    order by mvpr_fecha, mvpr_tiporef
                    into :TIPODOC, :IDDOC, :PREFIJO, :NUMERO, :FECHA, :CONCEPTO, :DEBITO, :DB, :RTFTE, :RTIVA, :RTICA, :AB
                    DO
                    BEGIN
                    if (RTFTE IS NULL) then
                        RTFTE = 0;
                    if (RTIVA IS NULL) then
                        RTIVA = 0;
                    if (RTICA IS NULL) then
                        RTICA = 0;
                    if (DB = 'N') then
                        BEGIN
                        CREDITO = DEBITO;
                        DEBITO = 0;
                        RTFTE = RTFTE * -1;
                        RTIVA = RTIVA * -1;
                        RTICA = RTICA * -1;
                        END
                    ELSE
                        CREDITO = 0;
                    if ((RTFTE <> 0) or (RTIVA <> 0) or (RTICA <> 0)) then
                        SUSPEND;
                    END
            END
        ELSE
            BEGIN
            if (DESCRETE = 'SI') then
                BEGIN
                SELECT SUM(MVPR_MONTO) FROM movimiento_proveedor WHERE TERC_NIT = :NIT AND MVPR_FECHA >= :FECINI AND MVPR_FECHA <= :FECFIN AND MVPR_DEBITO = 'S' and MVPR_ABONO = 'N' AND (MVPR_RTFTE <> 0 OR MVPR_RTIVA <> 0 OR MVPR_RTICA <> 0) INTO :DEBITO;
                SELECT SUM(MVPR_MONTO) FROM movimiento_proveedor WHERE TERC_NIT = :NIT AND MVPR_FECHA >= :FECINI AND MVPR_FECHA <= :FECFIN AND MVPR_DEBITO = 'N' AND MVPR_TIPOREF <> 55 AND MVPR_ABONO = 'N' AND (MVPR_RTFTE <> 0 OR MVPR_RTIVA <> 0 OR MVPR_RTICA <> 0) INTO :CREDITO;
                SELECT sum(mvpr_rtfte), sum(mvpr_rtiva), sum(mvpr_rtica) FROM movimiento_proveedor WHERE TERC_NIT = :NIT AND MVPR_FECHA >= :FECINI AND MVPR_FECHA <= :FECFIN AND MVPR_ABONO = 'N' INTO :RTFTE, :RTIVA, :RTICA;
                END
            else
                BEGIN
                SELECT SUM(MVPR_MONTO) FROM movimiento_proveedor WHERE TERC_NIT = :NIT AND MVPR_FECHA >= :FECINI AND MVPR_FECHA <= :FECFIN AND MVPR_DEBITO = 'S' and MVPR_ABONO = 'S' AND (MVPR_RTFTE <> 0 OR MVPR_RTIVA <> 0 OR MVPR_RTICA <> 0) INTO :DEBITO;
                SELECT SUM(MVPR_MONTO) FROM movimiento_proveedor WHERE TERC_NIT = :NIT AND MVPR_FECHA >= :FECINI AND MVPR_FECHA <= :FECFIN AND MVPR_DEBITO = 'N' AND MVPR_TIPOREF <> 55 AND MVPR_ABONO = 'S' AND (MVPR_RTFTE <> 0 OR MVPR_RTIVA <> 0 OR MVPR_RTICA <> 0) INTO :CREDITO;
                SELECT sum(mvpr_rtfte), sum(mvpr_rtiva), sum(mvpr_rtica) FROM movimiento_proveedor WHERE TERC_NIT = :NIT AND MVPR_FECHA >= :FECINI AND MVPR_FECHA <= :FECFIN AND MVPR_ABONO = 'S' INTO :RTFTE, :RTIVA, :RTICA;
                END
            if (DEBITO IS NULL) then
                DEBITO = 0;
            if (CREDITO IS NULL) then
                CREDITO = 0;
            if (RTFTE IS NULL) then
                RTFTE = 0;
            if (RTIVA IS NULL) then
                RTIVA = 0;
            if (RTICA IS NULL) then
                RTICA = 0;
            if ((RTFTE <> 0) or (RTIVA <> 0) or (RTICA <> 0)) then
                SUSPEND;
            END
        END
    END
END
^

SET TERM ; ^

/* 20090210C  SE PERDIA LA BASE DE LA TETENCION CUANDO LA BASE ESTABA EN 'I' */

SET TERM ^ ;

CREATE OR ALTER PROCEDURE CONTABIL_NOTADBPR(
    IDDOC INTEGER,
    IDINTER INTEGER)
RETURNS (
    ERROR INTEGER,
    VER CHAR(1),
    IDC INTEGER)
AS
declare variable PREF VARCHAR(4);
declare variable NUM VARCHAR(6);
declare variable NUMERO VARCHAR(10);
declare variable FECAUX DATE;
declare variable FECHA CHAR(8);
declare variable CONC CHAR(120);
declare variable VENCEAUX DATE;
declare variable VENCE CHAR(8);
declare variable VRSUBT NUMERIC(18, 2);
declare variable BASE0 NUMERIC(18, 2);
declare variable BASE1 NUMERIC(18, 2);
declare variable BASE2 NUMERIC(18, 2);
declare variable VRIVA NUMERIC(18, 2);
declare variable IVA1 NUMERIC(18, 2);
declare variable IVA2 NUMERIC(18, 2);
declare variable PRTFTE NUMERIC(9, 2);
declare variable VRRTFTE NUMERIC(18, 2);
declare variable PRTIVA NUMERIC(9, 2);
declare variable VRRTIVA NUMERIC(18, 2);
declare variable PRTICA NUMERIC(9, 2);
declare variable VRRTICA NUMERIC(18, 2);
declare variable VRTOTAL NUMERIC(18, 2);
declare variable TIPOCOMP VARCHAR(3);
declare variable PREFCONT VARCHAR(4);
declare variable BASE CHAR(1);
declare variable CTABASE VARCHAR(20);
declare variable IVA CHAR(1);
declare variable CTAIVA VARCHAR(20);
declare variable CLIE CHAR(1);
declare variable CTACLIE VARCHAR(20);
declare variable RTFTE CHAR(1);
declare variable CTARTFTE VARCHAR(20);
declare variable RTIVA CHAR(1);
declare variable CTARTIVA VARCHAR(20);
declare variable RTICA CHAR(1);
declare variable CTARTICA VARCHAR(20);
declare variable EXISTE CHAR(1);
declare variable CUENTA VARCHAR(20);
declare variable MONTO NUMERIC(18,2);
declare variable ES_RETENCION CHAR(1);
declare variable TIPOCUEN CHAR(1);
declare variable NIT VARCHAR(20);
declare variable PROY VARCHAR(4);
declare variable CENTRO VARCHAR(4);
declare variable MONTOBASE NUMERIC(18,2);
declare variable PORC NUMERIC(5,2);
declare variable DEBITO NUMERIC(18,2);
declare variable CREDITO NUMERIC(18,2);
declare variable NROI INTEGER;
declare variable SUMA NUMERIC(18,2);
declare variable TCTACLIEN VARCHAR(20);
declare variable TCTABASE VARCHAR(20);
declare variable TCTARTFTE VARCHAR(20);
declare variable TCTARTIVA VARCHAR(20);
declare variable TCTARTICA VARCHAR(20);
declare variable CUENTAADIC VARCHAR(20);
declare variable BASEADIC VARCHAR(20);
declare variable PORCADIC NUMERIC(5,2);
declare variable VALORADIC NUMERIC(18,2);
declare variable DBADIC CHAR(1);
declare variable NPROY VARCHAR(4);
declare variable NCENTRO VARCHAR(4);
declare variable ANULADO CHAR(1);
declare variable TARIFA INTEGER;
BEGIN
ERROR = 0;
/* BUSQUE LA INTERFACE */
EXISTE = 'N';
SELECT 'S', TICO_COD, PRCO_PRE, INCP_BASE, INCP_IVA, INCP_RTFTE, INCP_RTIVA, INCP_RTICA, INCP_PROV, INCP_CTABASE, INCP_CTAIVA, INCP_CTARTFTE, INCP_CTARTIVA, INCP_CTARTICA, INCP_CTAPROV, INCP_CONFIRMAR
    FROM INTERFAZ_CXPAGAR
    WHERE INCP_ID = :IDINTER
    INTO :EXISTE, :TIPOCOMP, :PREFCONT, :BASE, :IVA, :RTFTE, :RTIVA, :RTICA, :CLIE, :CTABASE, :CTAIVA, :CTARTFTE, :CTARTIVA, :CTARTICA, :CTACLIE, :VER;

if (EXISTE = 'S') then
  BEGIN
  /* BORRE CUALQUEIR CONTABILIZACION PREVIA */
  DELETE FROM CONTABILIZACION WHERE CNTB_TIPOREF = 51 AND CNTB_IDREF = :IDDOC;
  /* TRAIGA EL ENCABEZADO DE LA NOTA */
  SELECT PREF_PRE, NDPR_NUMERO, NDPR_FECHA, NDPR_VENCE, N.TERC_NIT, NDPR_CONC, NDPR_IVAPORC, NDPR_IVAMONTO, NDPR_MONTO, NDPR_RTFTEPORC, NDPR_RTFTEMONTO, NDPR_RTIVAPORC, NDPR_RTIVAMONTO, NDPR_RTICAPORC, NDPR_RTICAMONTO, TERC_CTAVENTA, TERC_CTARTFTE, TERC_CTARTIVA, TERC_CTARTICA, TERC_CTACLIENTE, NDPR_PROY, NDPR_CENTRO, NDPR_ANULADO, NDPR_BASE0, NDPR_BASE1, NDPR_BASE2, NDPR_IVA1, NDPR_IVA2
        FROM NOTAS_DEBITO_PROVEEDOR N, TERCEROS T
        WHERE NDPR_ID = :IDDOC AND N.TERC_NIT = T.TERC_NIT
        INTO :PREF, :NUM, :FECAUX, :VENCEAUX, :NIT, :CONC, :PORC, :VRIVA, :VRTOTAL, :PRTFTE, :VRRTFTE, :PRTIVA, :VRRTIVA, :PRTICA, :VRRTICA, :TCTABASE, TCTARTFTE, TCTARTIVA, TCTARTICA, TCTACLIEN, NPROY, NCENTRO, ANULADO, :BASE0, BASE1, :BASE2, :IVA1, :IVA2;
  if (ANULADO = 'N') then
    BEGIN
    /* SI ES PROVEEDOR, SOBREESCIBE LAS CUENTAS  */
    SELECT PROV_CTAPAGAR, PROV_CTARTFTE, PROV_CTARTIVA, PROV_CTARTICA, PROV_CTACAUSA
        FROM PROVEEDORES WHERE TERC_NIT = :NIT
        INTO TCTACLIEN, TCTARTFTE, TCTARTIVA, TCTARTICA, TCTABASE;
        
    /* SI EL DOCUMENTO ESPECIFICA ALGUNAS SOBRESCRIBA LAS DEL PROVEEDOR */
    SELECT NDPR_CTAPAGAR, NDPR_CTACAUSA
        FROM NOTAS_DEBITO_PROVEEDOR
        WHERE NDPR_ID = :IDDOC
        INTO :TCTACLIEN, TCTABASE;
    SELECT PREF_CENTRO, PREF_PROY FROM PREFIJOS P, NOTAS_DEBITO_PROVEEDOR N
        WHERE P.PREF_PRE = N.PREF_PRE AND P.TIDO_COD = 51 AND N.NDPR_ID = :IDDOC INTO :CENTRO, :PROY;
    if (NPROY <> '') then
        PROY = NPROY;
    if (NCENTRO <> '') then
        CENTRO = NCENTRO;
    NUMERO = PREF || NUM;
    VRSUBT = VRTOTAL; /* BASE DE RETEFTE Y RETEICA */

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

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

    NROI = 0;
    SUMA = 0;

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

        if (VRSUBT <> 0) then
            BEGIN
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO, CUEN_RETENCION FROM CUENTAS
                WHERE CUEN_COD = :CTABASE INTO :CUENTA, :TIPOCUEN, :ES_RETENCION;
            if (CUENTA IS NULL) then
                begin
                INSERT INTO  ERRORES (ERRO_ITEM, ERRO_TIPODOC, ERRO_IDDOC, ERRO_CODIGO, ERRO_CANT, ERRO_CADENA)
                    VALUES(GEN_ID(id_errores, 1), 51, :IDDOC, 'CUENTA NO EXISTE', 0, :CTABASE);
                CUENTA = CTABASE;
                ERROR = ERROR + 1;
                end
            if (ES_RETENCION = 'S') then
                if ((prtiva <> 0) and (vriva = 0)) then
                    montobase = FLOOR(VRSUBT / prtiva);
                else
                    montobase = VRSUBT;
            else
                montobase = 0;
            if (TIPOCUEN = 'I') then
                BEGIN
                INSERT INTO  ERRORES (ERRO_ITEM, ERRO_TIPODOC, ERRO_IDDOC, ERRO_CODIGO, ERRO_CANT, ERRO_CADENA)
                    VALUES(GEN_ID(id_errores, 1), 51, :IDDOC, 'CUENTA DE INVENTARIO', 0, :CUENTA);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRSUBT, 0, :MONTOBASE, :prtiva, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 41);
                NROI = NROI + 1;
                SUMA = SUMA + VRSUBT;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRSUBT, 0, :MONTOBASE, :prtiva, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA + VRSUBT;
                END
            END /* MONTO <> 0 */
        END /* BASE TERCERO O CONSTANTE */
    IF ((BASE = 'I')) THEN
        BEGIN
        FOR SELECT TAIV_CTACOMP, TAIV_COD FROM TARIFA_IVA WHERE TAIV_COD <= 2 INTO :CTABASE, :tarifa
            DO
            BEGIN
            if (TARIFA = 0) then
                vrsubt = BASE0;
            if (TARIFA = 1) then
                vrsubt = BASE1;
            if (TARIFA = 2) then
                vrsubt = BASE2;
            if (VRSUBT <> 0) then
                BEGIN
                CUENTA = NULL;
                SELECT CUEN_COD, CUEN_TIPO, CUEN_RETENCION FROM CUENTAS
                    WHERE CUEN_COD = :CTABASE INTO :CUENTA, :TIPOCUEN, :ES_RETENCION;
                if (CUENTA IS NULL) then
                    begin
                    INSERT INTO  ERRORES (ERRO_ITEM, ERRO_TIPODOC, ERRO_IDDOC, ERRO_CODIGO, ERRO_CANT, ERRO_CADENA)
                        VALUES(GEN_ID(id_errores, 1), 51, :IDDOC, 'CUENTA NO EXISTE', 0, :CTABASE);
                    CUENTA = CTABASE;
                    ERROR = ERROR + 1;
                    end
                montobase = 0;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    INSERT INTO  ERRORES (ERRO_ITEM, ERRO_TIPODOC, ERRO_IDDOC, ERRO_CODIGO, ERRO_CANT, ERRO_CADENA)
                        VALUES(GEN_ID(id_errores, 1), 51, :IDDOC, 'CUENTA DE INVENTARIO', 0, :CUENTA);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRSUBT, 0, :MONTOBASE, :prtiva, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 41);
                    NROI = NROI + 1;
                    SUMA = SUMA + VRSUBT;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRSUBT, 0, :MONTOBASE, :prtiva, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA + VRSUBT;
                    END
                END /* MONTO <> 0 */
            END
        END /* BASE TARIFA DE IVA */

    VRSUBT = VRTOTAL; /* BASE DE RETEFTE Y RETEICA */
    if (IVA = 'I') then /* IVA POR TARIFA */
        BEGIN
        FOR SELECT TAIV_CTAIVACMP, TAIV_COD FROM TARIFA_IVA WHERE (TAIV_COD <> 0) AND (TAIV_COD <= 2) INTO :CTAIVA, :tarifa
            DO
            BEGIN
            if (TARIFA = 1) then
                VRIVA = IVA1;
            if (TARIFA = 2) then
                VRIVA = IVA2;
            if (VRIVA <> 0) then
                BEGIN
                CUENTA = NULL;
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :CTAIVA INTO :CUENTA, :TIPOCUEN;
                if (CUENTA IS NULL) then
                    begin
                    INSERT INTO  ERRORES (ERRO_ITEM, ERRO_TIPODOC, ERRO_IDDOC, ERRO_CODIGO, ERRO_CANT, ERRO_CADENA)
                        VALUES(GEN_ID(id_errores, 1), 51, :IDDOC, 'CUENTA NO EXISTE', 0, :CTAIVA);
                    CUENTA = CTAIVA;
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    INSERT INTO  ERRORES (ERRO_ITEM, ERRO_TIPODOC, ERRO_IDDOC, ERRO_CODIGO, ERRO_CANT, ERRO_CADENA)
                        VALUES(GEN_ID(id_errores, 1), 51, :IDDOC, 'CUENTA DE INVENTARIO', 0, :CUENTA);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', :VRIVA, 0, :vrsubt, :porc, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 41);
                    NROI = NROI + 1;
                    SUMA = SUMA + VRIVA;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', :VRIVA, 0, :vrsubt, :porc, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA + VRIVA;
                    END
                END /* VRIVA <> 0 */
            end /* FOR */
        END /* IVA EN CTA CONSTANTE */
        
    if (IVA = 'K') then /* IVA EN CTA CONSTANTE */
        BEGIN
        if (VRIVA <> 0) then
            BEGIN
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTAIVA INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                INSERT INTO  ERRORES (ERRO_ITEM, ERRO_TIPODOC, ERRO_IDDOC, ERRO_CODIGO, ERRO_CANT, ERRO_CADENA)
                    VALUES(GEN_ID(id_errores, 1), 51, :IDDOC, 'CUENTA NO EXISTE', 0, :CTAIVA);
                CUENTA = CTAIVA;
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                INSERT INTO  ERRORES (ERRO_ITEM, ERRO_TIPODOC, ERRO_IDDOC, ERRO_CODIGO, ERRO_CANT, ERRO_CADENA)
                    VALUES(GEN_ID(id_errores, 1), 51, :IDDOC, 'CUENTA DE INVENTARIO', 0, :CUENTA);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', :VRIVA, 0, :vrsubt, :porc, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 41);
                NROI = NROI + 1;
                SUMA = SUMA + VRIVA;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', :VRIVA, 0, :vrsubt, :porc, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA + VRIVA;
                END
            END /* VRIVA <> 0 */
        END /* IVA EN CTA CONSTANTE */
        
    /* RETENCION FUENTE */
    if ((RTFTE = 'T') or (RTFTE = 'K')) then
      if (VRRTFTE <> 0) then
        BEGIN
        if (RTFTE = 'T') then
            CTARTFTE = TCTARTFTE;
            
        CUENTA = NULL;
        SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
            WHERE CUEN_COD = :CTARTFTE INTO :CUENTA, :TIPOCUEN;
        if (CUENTA IS NULL) then
            begin
            INSERT INTO  ERRORES (ERRO_ITEM, ERRO_TIPODOC, ERRO_IDDOC, ERRO_CODIGO, ERRO_CANT, ERRO_CADENA)
                VALUES(GEN_ID(id_errores, 1), 51, :IDDOC, 'CUENTA NO EXISTE', 0, :CTARTFTE);
            CUENTA = CTARTFTE;
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            INSERT INTO  ERRORES (ERRO_ITEM, ERRO_TIPODOC, ERRO_IDDOC, ERRO_CODIGO, ERRO_CANT, ERRO_CADENA)
                    VALUES(GEN_ID(id_errores, 1), 51, :IDDOC, 'CUENTA DE INVENTARIO', 0, :CUENTA);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, :VRSUBT, :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 41);
            NROI = NROI + 1;
            SUMA = SUMA - VRRTFTE;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, :VRSUBT, :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA - VRRTFTE;
            END
        END /* RTFTE */
        
    /* RETENCION IVA */
    if ((RTIVA = 'T') or (RTIVA = 'K')) then
      if (VRRTIVA <> 0) then
        BEGIN
        if (RTIVA = 'T') then
            CTARTIVA = TCTARTIVA;
            
        CUENTA = NULL;
        SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
            WHERE CUEN_COD = :CTARTIVA INTO :CUENTA, :TIPOCUEN;
        if (CUENTA IS NULL) then
            begin
            INSERT INTO  ERRORES (ERRO_ITEM, ERRO_TIPODOC, ERRO_IDDOC, ERRO_CODIGO, ERRO_CANT, ERRO_CADENA)
                VALUES(GEN_ID(id_errores, 1), 51, :IDDOC, 'CUENTA NO EXISTE', 0, :CTARTIVA);
            CUENTA = CTARTIVA;
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            INSERT INTO  ERRORES (ERRO_ITEM, ERRO_TIPODOC, ERRO_IDDOC, ERRO_CODIGO, ERRO_CANT, ERRO_CADENA)
                VALUES(GEN_ID(id_errores, 1), 51, :IDDOC, 'CUENTA DE INVENTARIO', 0, :CUENTA);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTIVA, :VRIVA, :prtiva, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 41);
            NROI = NROI + 1;
            SUMA = SUMA - VRRTIVA;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTIVA, :VRIVA, :prtiva, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA - VRRTIVA;
            END
        END /* RTIVA */
        
    /* RETENCION DE ICA */
    if ((RTICA = 'T') or (RTICA = 'K')) then
      if (VRRTICA <> 0) then
        BEGIN
        if (RTICA = 'T') then
            CTARTICA = TCTARTICA;
            
        CUENTA = NULL;
        SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
            WHERE CUEN_COD = :CTARTICA INTO :CUENTA, :TIPOCUEN;
        if (CUENTA IS NULL) then
            begin
            INSERT INTO  ERRORES (ERRO_ITEM, ERRO_TIPODOC, ERRO_IDDOC, ERRO_CODIGO, ERRO_CANT, ERRO_CADENA)
                    VALUES(GEN_ID(id_errores, 1), 51, :IDDOC, 'CUENTA NO EXISTE', 0, :CTARTICA);
            CUENTA = CTARTICA;
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            INSERT INTO  ERRORES (ERRO_ITEM, ERRO_TIPODOC, ERRO_IDDOC, ERRO_CODIGO, ERRO_CANT, ERRO_CADENA)
                VALUES(GEN_ID(id_errores, 1), 51, :IDDOC, 'CUENTA DE INVENTARIO', 0, :CUENTA);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTICA, :VRSUBT, :PRTICA, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 41);
            NROI = NROI + 1;
            SUMA = SUMA - VRRTICA;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTICA, :VRSUBT, :PRTICA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA - VRRTICA;
            END
        END /* RTICA */
        
    /* recorra las cuentas adicionales */
    FOR SELECT INPC_CUENTA, INPC_BASE, INPC_PORC, INPC_VALOR, INPC_DB
        FROM INTERFAZ_CXPAGAR_CTAS
        WHERE INCP_ID = :IDINTER
        INTO :CUENTAADIC, :BASEADIC, :PORCADIC, :VALORADIC, :DBADIC
        DO
        BEGIN
        if (:BASEADIC = 'SUBTOTAL') then
            VALORADIC = VRTOTAL - VRIVA;
        if (:BASEADIC = 'IVA') then
            VALORADIC = VRIVA;
        if (:BASEADIC = 'TOTAL') then
            VALORADIC = VRTOTAL;
        MONTO = VALORADIC * PORCADIC;
        
        /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
        CUENTA = NULL;
        SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
            WHERE CUEN_COD = :CUENTAADIC INTO :CUENTA, :TIPOCUEN;
        IF (CUENTA IS NULL) THEN
            begin
            INSERT INTO  ERRORES (ERRO_ITEM, ERRO_TIPODOC, ERRO_IDDOC, ERRO_CODIGO, ERRO_CANT, ERRO_CADENA)
                    VALUES(GEN_ID(id_errores, 1), 51, :IDDOC, 'CUENTA NO EXISTE', 0, :CUENTAADIC);
            CUENTA = CUENTAADIC;
            ERROR = ERROR + 1;
            end
        /* DEPENDE DEL TIPO DE CUENTA */
        if (TIPOCUEN = 'I') then
            BEGIN
            INSERT INTO  ERRORES (ERRO_ITEM, ERRO_TIPODOC, ERRO_IDDOC, ERRO_CODIGO, ERRO_CANT, ERRO_CADENA)
                VALUES(GEN_ID(id_errores, 1), 51, :IDDOC, 'CUENTA DE INVENTARIO', 0, :CUENTA);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            if (DBADIC = 'S') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTAADIC, :CONC, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 31);
                SUMA = SUMA + MONTO;
                END
            ELSE
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTAADIC, :CONC, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 31);
                SUMA = SUMA - MONTO;
                END
            NROI = NROI + 1;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            if (DBADIC = 'S') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTAADIC, :CONC, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                SUMA = SUMA + MONTO;
                END
            ELSE
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTAADIC, :CONC, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                SUMA = SUMA - MONTO;
                END
            NROI = NROI + 1;
            END
        
        NROI = NROI + 1;
        END
        
    /* CIERRE EL COMPROBANTE CONTRA LA CUENTA DEL TERCERO O LA CONSTANTE */
    if ((SUMA <> 0) and ((CLIE = 'T') or (CLIE = 'K'))) then
        BEGIN
        if (SUMA < 0) then
            BEGIN
            DEBITO = SUMA * -1;
            CREDITO = 0;
            END
        ELSE
            BEGIN
            DEBITO = 0;
            CREDITO = SUMA;
            END
        if (CLIE = 'T') then
            CTACLIE = TCTACLIEN;

        CUENTA = NULL;
        SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
            WHERE CUEN_COD = :CTACLIE INTO :CUENTA, :TIPOCUEN;
        IF (CUENTA IS NULL) then
            begin
            INSERT INTO  ERRORES (ERRO_ITEM, ERRO_TIPODOC, ERRO_IDDOC, ERRO_CODIGO, ERRO_CANT, ERRO_CADENA)
                VALUES(GEN_ID(id_errores, 1), 51, :IDDOC, 'CUENTA NO EXISTE', 0, :CTACLIE);
            CUENTA = CTACLIE;
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            INSERT INTO  ERRORES (ERRO_ITEM, ERRO_TIPODOC, ERRO_IDDOC, ERRO_CODIGO, ERRO_CANT, ERRO_CADENA)
                VALUES(GEN_ID(id_errores, 1), 51, :IDDOC, 'CUENTA DE INVENTARIO', 0, :CUENTA);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :DEBITO, :CREDITO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 41);
        if (TIPOCUEN = 'N') then
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :DEBITO, :CREDITO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
        NROI = NROI + 1;
        END /* SUMA EN CARTERA */
    if (ERROR > 0) then
        VER = 'S';
    SUSPEND;
    END /* ANULADO */
  END /* EXISTE LA INTERFAZ */
ELSE
    BEGIN
    INSERT INTO  ERRORES (ERRO_ITEM, ERRO_TIPODOC, ERRO_IDDOC, ERRO_CODIGO, ERRO_CANT, ERRO_CADENA)
        VALUES(GEN_ID(id_errores, 1), 51, :IDDOC, 'INTERFAZ NO EXISTE', 0, :pref);
    ERROR = ERROR + 1;
    VER = 'S';
    SUSPEND;
    END
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE NOTADBPR_SIN_CONTABILIDAD(
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    ID INTEGER,
    IDI INTEGER,
    IDC INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    ESTADO VARCHAR(20),
    ERROR INTEGER)
AS
DECLARE VARIABLE VER CHAR(2);
declare variable FECICNT VARCHAR(10);
declare variable FECFCNT VARCHAR(10);
declare variable idref INTEGER;
BEGIN /*$$IBE$$ 
EXECUTE PROCEDURE fecha_a_conta(FECINI) returning_values (FECICNT);
EXECUTE PROCEDURE fecha_a_conta(FECFIN) returning_values (FECFCNT);
FOR SELECT NDPR_ID, PREF_PRE, NDPR_NUMERO FROM NOTAS_DEBITO_PROVEEDOR WHERE NDPR_ANULADO = 'N' AND
    NDPR_FECHA >= :FECINI AND NDPR_FECHA <= :FECFIN
    ORDER BY NDPR_ID INTO :ID, :PREF, :NUMERO
DO
  BEGIN
  idref = null;
  SELECT ENCO_IDREF FROM COMPROBANTE_ENCABEZADO WHERE ENCO_TIPOREF = 51 AND ENCO_FECHA >= :FECICNT AND ENCO_FECHA <= :FECFCNT and ENCO_IDREF = :id into :idref;
  if (idref IS NULL) then
  begin
  ESTADO = 'PROCESANDO';
  SUSPEND;
  SELECT MAX(INCA_ID) FROM INTERFAZ_CARTERA WHERE PREF_PRE = :PREF AND TIDO_COD = 51 INTO :IDI;
  if (IDI IS NOT NULL) then
    BEGIN
    EXECUTE PROCEDURE CONTABIL_NOTADBPR (:ID, :IDI) RETURNING_VALUES (:ERROR, :VER, :IDC);
    if (ERROR = 0) then
      BEGIN
      EXECUTE PROCEDURE CONTABILIZA_PENDIENTE (:IDC);
      ESTADO = 'OK';
      END
    ELSE
      ESTADO = 'ERROR';
    suspend;
    END
  end
  END
 $$IBE$$*/ SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE NOTADBPR_SIN_CONTABILIDAD(
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    ID INTEGER,
    IDI INTEGER,
    IDC INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    ESTADO VARCHAR(20),
    ERROR INTEGER)
AS
DECLARE VARIABLE VER CHAR(2);
declare variable FECICNT VARCHAR(10);
declare variable FECFCNT VARCHAR(10);
declare variable idref INTEGER;
BEGIN
EXECUTE PROCEDURE fecha_a_conta(FECINI) returning_values (FECICNT);
EXECUTE PROCEDURE fecha_a_conta(FECFIN) returning_values (FECFCNT);
FOR SELECT NDPR_ID, PREF_PRE, NDPR_NUMERO FROM NOTAS_DEBITO_PROVEEDOR WHERE NDPR_ANULADO = 'N' AND
    NDPR_FECHA >= :FECINI AND NDPR_FECHA <= :FECFIN
    ORDER BY NDPR_ID INTO :ID, :PREF, :NUMERO
DO
  BEGIN
  idref = null;
  SELECT ENCO_IDREF FROM COMPROBANTE_ENCABEZADO WHERE ENCO_TIPOREF = 51 AND ENCO_FECHA >= :FECICNT AND ENCO_FECHA <= :FECFCNT and ENCO_IDREF = :id into :idref;
  if (idref IS NULL) then
  begin
  ESTADO = 'PROCESANDO';
  SUSPEND;
  SELECT MAX(INCA_ID) FROM INTERFAZ_CARTERA WHERE PREF_PRE = :PREF AND TIDO_COD = 51 INTO :IDI;
  if (IDI IS NOT NULL) then
    BEGIN
    EXECUTE PROCEDURE CONTABIL_NOTADBPR (:ID, :IDI) RETURNING_VALUES (:ERROR, :VER, :IDC);
    if (ERROR = 0) then
      BEGIN
      EXECUTE PROCEDURE CONTABILIZA_PENDIENTE (:IDC);
      ESTADO = 'OK';
      END
    ELSE
      ESTADO = 'ERROR';
    suspend;
    END
  end
  END
END

^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER PROCEDURE CONTABIL_NOTACRPR(
    IDDOC INTEGER,
    IDINTER INTEGER)
RETURNS (
    ERROR INTEGER,
    VER CHAR(1),
    IDC INTEGER)
AS
declare variable PREF VARCHAR(4);
declare variable NUM VARCHAR(6);
declare variable NUMERO VARCHAR(10);
declare variable FECAUX DATE;
declare variable FECHA CHAR(8);
declare variable CONC CHAR(120);
declare variable VRSUBT NUMERIC(18, 2);
declare variable BASE0 NUMERIC(18, 2);
declare variable BASE1 NUMERIC(18, 2);
declare variable BASE2 NUMERIC(18, 2);
declare variable VRIVA NUMERIC(18, 2);
declare variable IVA1 NUMERIC(18, 2);
declare variable IVA2 NUMERIC(18, 2);
declare variable PRTFTE NUMERIC(9, 2);
declare variable VRRTFTE NUMERIC(18, 2);
declare variable VRRTIVA NUMERIC(18, 2);
declare variable PRTICA NUMERIC(9, 2);
declare variable VRRTICA NUMERIC(18, 2);
declare variable VRTOTAL NUMERIC(18, 2);
declare variable TIPOCOMP VARCHAR(3);
declare variable PREFCONT VARCHAR(4);
declare variable BASE CHAR(1);
declare variable CTABASE VARCHAR(20);
declare variable IVA CHAR(1);
declare variable CTAIVA VARCHAR(20);
declare variable CLIE CHAR(1);
declare variable CTACLIE VARCHAR(20);
declare variable RTFTE CHAR(1);
declare variable CTARTFTE VARCHAR(20);
declare variable RTIVA CHAR(1);
declare variable CTARTIVA VARCHAR(20);
declare variable RTICA CHAR(1);
declare variable CTARTICA VARCHAR(20);
declare variable EXISTE CHAR(1);
declare variable CUENTA VARCHAR(20);
declare variable MONTO NUMERIC(18,2);
declare variable ES_RETENCION CHAR(1);
declare variable TIPOCUEN CHAR(1);
declare variable NIT VARCHAR(20);
declare variable NOMBRE VARCHAR(60);
declare variable PROY VARCHAR(4);
declare variable CENTRO VARCHAR(4);
declare variable PORC NUMERIC(5,2);
declare variable DEBITO NUMERIC(18,2);
declare variable CREDITO NUMERIC(18,2);
declare variable NROI INTEGER;
declare variable SUMA NUMERIC(18,2);
declare variable TCTACLIEN VARCHAR(20);
declare variable TCTABASE VARCHAR(20);
declare variable TCTARTFTE VARCHAR(20);
declare variable TCTARTIVA VARCHAR(20);
declare variable TCTARTICA VARCHAR(20);
declare variable BASEADIC VARCHAR(20);
declare variable PORCADIC NUMERIC(5,2);
declare variable VALORADIC NUMERIC(18,2);
declare variable DBADIC CHAR(1);
declare variable CUENTAADIC VARCHAR(20);
declare variable ANULADO CHAR(1);
declare variable MONTOBASE NUMERIC(18,2);
declare variable TARIFA INTEGER;
BEGIN
ERROR = 0;
/* BUSQUE LA INTERFACE */
EXISTE = 'N';
SELECT 'S', TICO_COD, PRCO_PRE, INCP_BASE, INCP_IVA, INCP_RTFTE, INCP_RTIVA, INCP_RTICA, INCP_PROV, INCP_CTABASE, INCP_CTAIVA, INCP_CTARTFTE, INCP_CTARTIVA, INCP_CTARTICA, INCP_CTAPROV, INCP_CONFIRMAR
  FROM INTERFAZ_CXPAGAR
  WHERE INCP_ID = :IDINTER
  INTO :EXISTE, :TIPOCOMP, :PREFCONT, :BASE, :IVA, :RTFTE, :RTIVA, :RTICA, :CLIE, :CTABASE, :CTAIVA, :CTARTFTE, :CTARTIVA, :CTARTICA, :CTACLIE, :VER;

if (EXISTE = 'S') then
  BEGIN
  /* BORRE CUALQUEIR CONTABILIZACION PREVIA */
  DELETE FROM CONTABILIZACION WHERE CNTB_TIPOREF = 52 AND CNTB_IDREF = :IDDOC;
  /* TRAIGA EL ENCABEZADO DE LA NOTA */
  SELECT PREF_PRE, NCPR_NUMERO, NCPR_FECHA, N.TERC_NIT, NCPR_CONC, NCPR_IVAMONTO, NCPR_MONTO, NCPR_RTFTEPORC, NCPR_RTFTEMONTO, NCPR_RTIVAPORC, NCPR_RTIVAMONTO, NCPR_RTICAPORC, NCPR_RTICAMONTO, TERC_NOM, TERC_CTAVENTA, TERC_CTARTFTE, TERC_CTARTIVA, TERC_CTARTICA, TERC_CTACLIENTE, NCPR_ANULADO, NCPR_BASE0, NCPR_BASE1, NCPR_BASE2, NCPR_IVA1, NCPR_IVA2
    FROM NOTAS_CREDITO_PROVEEDOR N, TERCEROS T
    WHERE NCPR_ID = :IDDOC AND N.TERC_NIT = T.TERC_NIT
    INTO :PREF, :NUM, :FECAUX, :NIT, :CONC, :VRIVA, :VRTOTAL, :PRTFTE, :VRRTFTE, :PORC, :VRRTIVA, :PRTICA, :VRRTICA, :NOMBRE, TCTABASE, TCTARTFTE, TCTARTIVA, TCTARTICA, TCTACLIEN, ANULADO, :BASE0, BASE1, :BASE2, :IVA1, :IVA2;
  if (ANULADO = 'N') then
    BEGIN
    SELECT PREF_CENTRO, PREF_PROY FROM PREFIJOS P, NOTAS_CREDITO_PROVEEDOR N
        WHERE P.PREF_PRE = N.PREF_PRE AND P.TIDO_COD = 52 AND NCPR_ID = :IDDOC INTO :CENTRO, :PROY;
    /* SI ES PROVEEDOR, SOBREESCIBE LAS CUENTAS  */
    SELECT PROV_CTAPAGAR, PROV_CTARTFTE, PROV_CTARTIVA, PROV_CTARTICA, PROV_CTACAUSA
        FROM PROVEEDORES WHERE TERC_NIT = :NIT
        INTO TCTACLIEN, TCTARTFTE, TCTARTIVA, TCTARTICA, TCTABASE;
        
    /* SI EL DOCUMENTO ESPECIFICA ALGUNAS SOBRESCRIBA LAS DEL PROVEEDOR */
    SELECT NCPR_CTAPAGAR, NCPR_CTACAUSA
        FROM NOTAS_CREDITO_PROVEEDOR N
        WHERE NCPR_ID = :IDDOC
        INTO :TCTACLIEN, TCTABASE;
    NUMERO = PREF || NUM;
    VRSUBT = VRTOTAL; /* BASE DE RETEFTE Y RETEICA */

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

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

    NROI = 0;
    SUMA = 0;

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

        if (VRSUBT <> 0) then
            BEGIN
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO, CUEN_RETENCION FROM CUENTAS
                WHERE CUEN_COD = :CTABASE INTO :CUENTA, :TIPOCUEN, :ES_RETENCION;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERROR (52, :IDDOC, :CTABASE, 2);
                CUENTA = CTABASE;
                ERROR = ERROR + 1;
                end
            if (ES_RETENCION = 'S') then
                if (PORC <> 0) then
                    montobase = FLOOR(VRSUBT / PORC * -1);
                else
                    montobase = VRSUBT * -1;
            else
                montobase = 0;
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERROR (52, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRSUBT, :MONTOBASE, :PORC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 52);
                NROI = NROI + 1;
                SUMA = SUMA - VRSUBT;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRSUBT, :MONTOBASE, :PORC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - VRSUBT;
                END
            END /* MONTO <> 0 */
        END /* BASE TERCERO O CONSTANTE */
    IF ((BASE = 'I')) THEN
        BEGIN
        FOR SELECT TAIV_CTACOMP, TAIV_COD FROM TARIFA_IVA WHERE TAIV_COD <= 2 INTO :CTABASE, :tarifa
            DO
            BEGIN
            if (TARIFA = 0) then
                vrsubt = BASE0;
            if (TARIFA = 1) then
                vrsubt = BASE1;
            if (TARIFA = 2) then
                vrsubt = BASE2;
            if (VRSUBT <> 0) then
                BEGIN
                CUENTA = NULL;
                SELECT CUEN_COD, CUEN_TIPO, CUEN_RETENCION FROM CUENTAS
                    WHERE CUEN_COD = :CTABASE INTO :CUENTA, :TIPOCUEN, :ES_RETENCION;
                if (CUENTA IS NULL) then
                    begin
                    EXECUTE PROCEDURE ERROR (52, :IDDOC, :CTABASE, 2);
                    CUENTA = CTABASE;
                    ERROR = ERROR + 1;
                    end
                montobase = 0;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (52, :IDDOC, :CUENTA, 3);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRSUBT, :MONTOBASE, :PORC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 52);
                    NROI = NROI + 1;
                    SUMA = SUMA - VRSUBT;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRSUBT, :MONTOBASE, :PORC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA - VRSUBT;
                    END
                END /* MONTO <> 0 */
            END /* FOR */
        END /* BASE TARIFA IVA */

    VRSUBT = VRTOTAL; /* BASE DE RETEFTE Y RETEICA */
    if (IVA = 'I') then /* IVA X TARIFA */
        BEGIN
        FOR SELECT TAIV_CTAIVACMP, TAIV_COD FROM TARIFA_IVA WHERE (TAIV_COD <> 0) AND (TAIV_COD <= 2) INTO :CTAIVA, :tarifa
            DO
            BEGIN
            if (TARIFA = 1) then
                VRIVA = IVA1;
            if (TARIFA = 2) then
                VRIVA = IVA2;
            if (VRIVA <> 0) then
                BEGIN
                CUENTA = NULL;
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :CTAIVA INTO :CUENTA, :TIPOCUEN;
                if (CUENTA IS NULL) then
                    begin
                    EXECUTE PROCEDURE ERROR (52, :IDDOC, :CTAIVA, 2);
                    CUENTA = CTAIVA;
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (52, :IDDOC, :CUENTA, 3);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', 0, :VRIVA, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 52);
                    NROI = NROI + 1;
                    SUMA = SUMA - VRIVA;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', 0, :VRIVA, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA - VRIVA;
                    END
                END /* VRIVA <> 0 */
            END /* FOR */
        END /* IVA EN CTA CONSTANTE */
        
    if (IVA = 'K') then /* IVA EN CTA CONSTANTE */
        BEGIN
        if (VRIVA <> 0) then
            BEGIN
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTAIVA INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERROR (52, :IDDOC, :CTAIVA, 2);
                CUENTA = CTAIVA;
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERROR (52, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', 0, :VRIVA, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 52);
                NROI = NROI + 1;
                SUMA = SUMA - VRIVA;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', 0, :VRIVA, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - VRIVA;
                END
            END /* VRIVA <> 0 */
        END /* IVA EN CTA CONSTANTE */
        
    /* RETENCION FUENTE */
    if ((RTFTE = 'T') or (RTFTE = 'K')) then
      if (VRRTFTE <> 0) then
        BEGIN
        if (RTFTE = 'T') then
            CTARTFTE = TCTARTFTE;
            
        CUENTA = NULL;
        SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
            WHERE CUEN_COD = :CTARTFTE INTO :CUENTA, :TIPOCUEN;
        if (CUENTA IS NULL) then
            begin
            EXECUTE PROCEDURE ERROR (52, :IDDOC, :CTARTFTE, 2);
            CUENTA = CTARTFTE;
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERROR (52, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :VRSUBT, :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 52);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTFTE;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :VRSUBT, :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTFTE;
            END
        END /* RTFTE */
        
    /* RETENCION IVA */
    if ((RTIVA = 'T') or (RTIVA = 'K')) then
      if (VRRTIVA <> 0) then
        BEGIN
        if (RTIVA = 'T') then
            CTARTIVA = TCTARTIVA;
            
        CUENTA = NULL;
        SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
            WHERE CUEN_COD = :CTARTIVA INTO :CUENTA, :TIPOCUEN;
        if (CUENTA IS NULL) then
            begin
            EXECUTE PROCEDURE ERROR (52, :IDDOC, :CTARTIVA, 2);
            CUENTA = CTARTIVA;
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERROR (52, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTIVA, 0, :VRIVA, :PORC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 52);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTIVA;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTIVA, 0, :VRIVA, :PORC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTIVA;
            END
        END /* RTIVA */
        
    /* RETENCION DE ICA */
    if ((RTICA = 'T') or (RTICA = 'K')) then
      if (VRRTICA <> 0) then
        BEGIN
        if (RTICA = 'T') then
            CTARTICA = TCTARTICA;
            
        CUENTA = NULL;
        SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
            WHERE CUEN_COD = :CTARTICA INTO :CUENTA, :TIPOCUEN;
        if (CUENTA IS NULL) then
            begin
            EXECUTE PROCEDURE ERROR (52, :IDDOC, :CTARTICA, 2);
            CUENTA = CTARTICA;
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERROR (52, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTICA, 0, :VRSUBT, :PRTICA, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 52);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTICA;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTICA, 0, :VRSUBT, :PRTICA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTICA;
            END
        END /* RTICA */
        
    /* recorra las cuentas adicionales */
    FOR SELECT INPC_CUENTA, INPC_BASE, INPC_PORC, INPC_VALOR, INPC_DB
        FROM INTERFAZ_CXPAGAR_CTAS
        WHERE INCP_ID = :IDINTER
        INTO :CUENTAADIC, :BASEADIC, :PORCADIC, :VALORADIC, :DBADIC
        DO
        BEGIN
        if (:BASEADIC = 'SUBTOTAL') then
            VALORADIC = VRTOTAL - VRIVA;
        if (:BASEADIC = 'IVA') then
            VALORADIC = VRIVA;
        if (:BASEADIC = 'TOTAL') then
            VALORADIC = VRTOTAL;
        MONTO = VALORADIC * PORCADIC;
        
        /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
        CUENTA = NULL;
        SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
            WHERE CUEN_COD = :CUENTAADIC INTO :CUENTA, :TIPOCUEN;
        IF (CUENTA IS NULL) THEN
            begin
            EXECUTE PROCEDURE ERROR (52, :IDDOC, :CUENTAADIC, 2);
            CUENTA = CUENTAADIC;
            ERROR = ERROR + 1;
            end
        /* DEPENDE DEL TIPO DE CUENTA */
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERROR (52, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            if (DBADIC = 'S') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTAADIC, :CONC, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 31);
                SUMA = SUMA + MONTO;
                END
            ELSE
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTAADIC, :CONC, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 31);
                SUMA = SUMA - MONTO;
                END
            NROI = NROI + 1;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            if (DBADIC = 'S') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTAADIC, :CONC, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                SUMA = SUMA + MONTO;
                END
            ELSE
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTAADIC, :CONC, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                SUMA = SUMA - MONTO;
                END
            NROI = NROI + 1;
            END
        
        NROI = NROI + 1;
        END
        
    /* CIERRE EL COMPROBANTE CONTRA LA CUENTA DEL TERCERO O LA CONSTANTE */
    if ((SUMA <> 0) and ((CLIE = 'T') or (CLIE = 'K'))) then
        BEGIN
        if (SUMA < 0) then
            BEGIN
            DEBITO = SUMA * -1;
            CREDITO = 0;
            END
        ELSE
            BEGIN
            DEBITO = 0;
            CREDITO = SUMA;
            END
        if (CLIE = 'T') then
            CTACLIE = TCTACLIEN;

        CUENTA = NULL;
        SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
            WHERE CUEN_COD = :CTACLIE INTO :CUENTA, :TIPOCUEN;
        IF (CUENTA IS NULL) then
            begin
            EXECUTE PROCEDURE ERROR (52, :IDDOC, :CTACLIE, 2);
            CUENTA = CTACLIE;
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERROR (52, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :DEBITO, :CREDITO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 52);
        if (TIPOCUEN = 'N') then
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :DEBITO, :CREDITO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
        NROI = NROI + 1;
        END /* SUMA EN CARTERA */
    if (ERROR > 0) then
        VER = 'S';
    SUSPEND;
    END /* NO ANULADO */
  END /* EXISTE LA INTERFAZ */
ELSE
    BEGIN
    EXECUTE PROCEDURE ERROR (52, :IDDOC, :PREF, 1);
    ERROR = ERROR + 1;
    VER = 'S';
    SUSPEND;
    END
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE NOTACRPR_SIN_CONTABILIDAD(
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    ID INTEGER,
    IDI INTEGER,
    IDC INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    ESTADO VARCHAR(20),
    ERROR INTEGER)
AS
DECLARE VARIABLE VER CHAR(2);
declare variable FECICNT VARCHAR(10);
declare variable FECFCNT VARCHAR(10);
declare variable idref INTEGER;
BEGIN /*$$IBE$$ 
EXECUTE PROCEDURE fecha_a_conta(FECINI) returning_values (FECICNT);
EXECUTE PROCEDURE fecha_a_conta(FECFIN) returning_values (FECFCNT);
FOR SELECT NCPR_ID, PREF_PRE, NCPR_NUMERO FROM NOTAS_CREDITO_PROVEEDOR WHERE NCPR_ANULADO = 'N' AND
    NCPR_FECHA >= :FECINI AND NCPR_FECHA <= :FECFIN
    ORDER BY NCPR_ID INTO :ID, :PREF, :NUMERO
DO
  BEGIN
  idref = null;
  SELECT ENCO_IDREF FROM COMPROBANTE_ENCABEZADO WHERE ENCO_TIPOREF = 52 AND ENCO_FECHA >= :FECICNT AND ENCO_FECHA <= :FECFCNT and ENCO_IDREF = :id into :idref;
  if (idref IS NULL) then
  begin
  ESTADO = 'PROCESANDO';
  SUSPEND;
  SELECT MAX(INCA_ID) FROM INTERFAZ_CARTERA WHERE PREF_PRE = :PREF AND TIDO_COD = 52 INTO :IDI;
  if (IDI IS NOT NULL) then
    BEGIN
    EXECUTE PROCEDURE CONTABIL_NOTACRPR (:ID, :IDI) RETURNING_VALUES (:ERROR, :VER, :IDC);
    if (ERROR = 0) then
      BEGIN
      EXECUTE PROCEDURE CONTABILIZA_PENDIENTE (:IDC);
      ESTADO = 'OK';
      END
    ELSE
      ESTADO = 'ERROR';
    suspend;
    END
  end
  END
 $$IBE$$*/ SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE NOTACRPR_SIN_CONTABILIDAD(
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    ID INTEGER,
    IDI INTEGER,
    IDC INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    ESTADO VARCHAR(20),
    ERROR INTEGER)
AS
DECLARE VARIABLE VER CHAR(2);
declare variable FECICNT VARCHAR(10);
declare variable FECFCNT VARCHAR(10);
declare variable idref INTEGER;
BEGIN
EXECUTE PROCEDURE fecha_a_conta(FECINI) returning_values (FECICNT);
EXECUTE PROCEDURE fecha_a_conta(FECFIN) returning_values (FECFCNT);
FOR SELECT NCPR_ID, PREF_PRE, NCPR_NUMERO FROM NOTAS_CREDITO_PROVEEDOR WHERE NCPR_ANULADO = 'N' AND
    NCPR_FECHA >= :FECINI AND NCPR_FECHA <= :FECFIN
    ORDER BY NCPR_ID INTO :ID, :PREF, :NUMERO
DO
  BEGIN
  idref = null;
  SELECT ENCO_IDREF FROM COMPROBANTE_ENCABEZADO WHERE ENCO_TIPOREF = 52 AND ENCO_FECHA >= :FECICNT AND ENCO_FECHA <= :FECFCNT and ENCO_IDREF = :id into :idref;
  if (idref IS NULL) then
  begin
  ESTADO = 'PROCESANDO';
  SUSPEND;
  SELECT MAX(INCA_ID) FROM INTERFAZ_CARTERA WHERE PREF_PRE = :PREF AND TIDO_COD = 52 INTO :IDI;
  if (IDI IS NOT NULL) then
    BEGIN
    EXECUTE PROCEDURE CONTABIL_NOTACRPR (:ID, :IDI) RETURNING_VALUES (:ERROR, :VER, :IDC);
    if (ERROR = 0) then
      BEGIN
      EXECUTE PROCEDURE CONTABILIZA_PENDIENTE (:IDC);
      ESTADO = 'OK';
      END
    ELSE
      ESTADO = 'ERROR';
    suspend;
    END
  end
  END
END

^

SET TERM ; ^


/* 20090210D MAL CONSOLIDADO SUMABA LAS DEVOLUCIONES */

SET TERM ^ ;

CREATE OR ALTER PROCEDURE REP_RETENCION_CLIENTE(
    DESDE VARCHAR(20),
    HASTA VARCHAR(20),
    GRPINI VARCHAR(5),
    GRPFIN VARCHAR(5),
    FECINI DATE,
    FECFIN DATE,
    DETALLE CHAR(1),
    ORDEN CHAR(1),
    AGRUPA CHAR(1),
    SUBEMPRESA INTEGER)
RETURNS (
    NIT VARCHAR(20),
    NOMBRE VARCHAR(60),
    TELEFONO VARCHAR(40),
    CIUDAD VARCHAR(40),
    CODZONA VARCHAR(2),
    NOMZONA VARCHAR(60),
    CODCOBR INTEGER,
    NOMCOBR VARCHAR(60),
    SUCURSAL VARCHAR(10),
    NOMSUC VARCHAR(60),
    DV CHAR(1),
    CODCIUD CHAR(5),
    NOMCIUD VARCHAR(60),
    TIPODOC VARCHAR(8),
    IDDOC INTEGER,
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    CONCEPTO VARCHAR(60),
    DEBITO NUMERIC(18,2),
    CREDITO NUMERIC(18,2),
    RTFTE NUMERIC(18,2),
    RTIVA NUMERIC(18,2),
    RTICA NUMERIC(18,2))
AS
declare variable NITINI VARCHAR(20);
declare variable NITFIN VARCHAR(20);
declare variable NOMINI VARCHAR(20);
declare variable NOMFIN VARCHAR(20);
declare variable RETES VARCHAR(2);
declare variable OK CHAR(1);
declare variable DB CHAR(1);
declare variable ARTFTE NUMERIC(18,2);
declare variable ARTIVA NUMERIC(18,2);
declare variable ARTICA NUMERIC(18,2);
BEGIN
EXECUTE PROCEDURE LEE_CONFIGURACION ('CARTERA', 'SALDOS', 'DESCONTAR RETENCIONES POR CAUSACION') returning_values (RETES);
if (ORDEN = 'C') then
    BEGIN
    NITINI = DESDE;
    NITFIN = HASTA;
    NOMINI = '';
    NOMFIN = 'zz';
    END
ELSE
    BEGIN
    NOMINI = DESDE;
    NOMFIN = HASTA;
    NITINI = '';
    NITFIN = 'zz';
    END

if (DETALLE = 'S') then
    BEGIN
    if (RETES = 'SI') then
        FOR select T.TERC_NIT, TERC_NOM, TERC_DV, TERC_TEL, TERC_CIU, S.COBR_COD, C.ZONA_COD, T.CIUD_COD, CLCU_COD, CLSU_NOMBRE,
            tido_nomcorto, mvcl_idref, mvcl_prefref, mvcl_numref, mvcl_fecha, mvcl_conc, mvcl_monto, mvcl_debito, mvcl_rtefte, mvcl_rteiva, mvcl_rteica
            from movimiento_clientes m, tipo_documento TD, terceros T, CLIENTES C, CLIENTE_SUCURSALES S
            where m.mvcl_tiporef = td.tido_cod and mvcl_fecha >= :FECINI and mvcl_fecha <= :FECFIN AND mvcl_abono = 'N'
            and C.TERC_NIT = T.TERC_NIT AND TERC_CLIE = 'S' AND S.TERC_NIT = C.TERC_NIT AND M.terc_nit = T.terc_nit AND M.mvcl_sucursal = S.clcu_cod AND
            T.TERC_NIT >= :NITINI AND T.TERC_NIT <= :NITFIN AND TERC_NOM >= :NOMINI AND TERC_NOM <= :NOMFIN AND ((sucu_id = :subempresa) or (:subempresa = 0))
            AND ((MVCL_RTEFTE <> 0) or (MVCL_RTEIVA <> 0) or (MVCL_RTEICA <> 0))
            ORDER BY T.TERC_NIT, MVCL_FECHA, MVCL_ID
            into :NIT, :NOMBRE, :DV, :TELEFONO, :CIUDAD, :CODCOBR, :CODZONA, :CODCIUD, :SUCURSAL, :NOMSUC,
            :TIPODOC, :IDDOC, :PREFIJO, :NUMERO, :FECHA, :CONCEPTO, :DEBITO, :DB, :RTFTE, :RTIVA, :RTICA
            DO
            BEGIN
            OK = 'N';
            if (AGRUPA = 'Z') then
                BEGIN
                if (GRPINI = '') then
                    BEGIN
                    if ((CODZONA IS NULL) or (CODZONA >= :GRPINI AND CODZONA <= :GRPFIN)) then
                        OK = 'S';
                    END
                ELSE
                    if (CODZONA >= :GRPINI AND CODZONA <= :GRPFIN) then
                        OK = 'S';
                END
            if (AGRUPA = 'C') then
                BEGIN
                if (GRPINI = '') then
                    BEGIN
                    if ((CODCOBR IS NULL) or (CODCOBR >= :GRPINI AND CODCOBR <= :GRPFIN)) then
                        OK = 'S';
                    END
                ELSE
                    if (CODCOBR >= :GRPINI AND CODCOBR <= :GRPFIN) then
                        OK = 'S';
                END
            if (AGRUPA = 'I') then
                BEGIN
                if (GRPINI = '') then
                    BEGIN
                    if ((CODCIUD IS NULL) or (CODCIUD >= :GRPINI AND CODCIUD <= :GRPFIN)) then
                        OK = 'S';
                    END
                ELSE
                    if (CODCIUD >= :GRPINI AND CODCIUD <= :GRPFIN) then
                        OK = 'S';
                END
            if (AGRUPA = 'N') then
                OK = 'S';
        
            if (OK = 'S') then
                BEGIN
                SELECT COBR_NOM FROM COBRADORES WHERE COBR_COD = :CODCOBR INTO :NOMCOBR;
                SELECT ZONA_NOM FROM ZONAS WHERE ZONA_COD = :CODZONA INTO :NOMZONA;
                SELECT CIUD_NOM FROM CIUDADES WHERE CIUD_COD = :CODCIUD INTO :NOMCIUD;
                if (RTFTE IS NULL) then
                    RTFTE = 0;
                if (RTIVA IS NULL) then
                    RTIVA = 0;
                if (RTICA IS NULL) then
                    RTICA = 0;
                if (DB = 'N') then
                    BEGIN
                    CREDITO = DEBITO;
                    DEBITO = 0;
                    RTFTE = rtfte * -1;
                    RTIVA = rtiva * -1;
                    RTICA = rtica * -1;
                    END
                ELSE
                    CREDITO = 0;
                SUSPEND;
                END
            END
    ELSE
        FOR select T.TERC_NIT, TERC_NOM, TERC_DV, TERC_TEL, TERC_CIU, S.COBR_COD, C.ZONA_COD, T.CIUD_COD, CLCU_COD, CLSU_NOMBRE,
            tido_nomcorto, mvcl_idref, mvcl_prefref, mvcl_numref, mvcl_fecha, mvcl_conc, mvcl_monto, mvcl_debito, mvcl_rtefte, mvcl_rteiva, mvcl_rteica
            from movimiento_clientes m, tipo_documento TD, terceros T, CLIENTES C, CLIENTE_SUCURSALES S
            where m.mvcl_tiporef = td.tido_cod and mvcl_fecha >= :FECINI and mvcl_fecha <= :FECFIN AND mvcl_abono = 'S'
            and C.TERC_NIT = T.TERC_NIT AND TERC_CLIE = 'S' AND S.TERC_NIT = C.TERC_NIT AND M.terc_nit = T.terc_nit AND M.mvcl_sucursal = S.clcu_cod AND
            T.TERC_NIT >= :NITINI AND T.TERC_NIT <= :NITFIN AND TERC_NOM >= :NOMINI AND TERC_NOM <= :NOMFIN AND ((sucu_id = :subempresa) or (:subempresa = 0))
            ORDER BY T.TERC_NIT, MVCL_FECHA, MVCL_ID
            into :NIT, :NOMBRE, :DV, :TELEFONO, :CIUDAD, :CODCOBR, :CODZONA, :CODCIUD, :SUCURSAL, :NOMSUC,
            :TIPODOC, :IDDOC, :PREFIJO, :NUMERO, :FECHA, :CONCEPTO, :DEBITO, :DB, :RTFTE, :RTIVA, :RTICA
            DO
            BEGIN
            if (RTFTE IS NULL) then
                RTFTE = 0;
            if (RTIVA IS NULL) then
                RTIVA = 0;
            if (RTICA IS NULL) then
                RTICA = 0;
            if ((RTFTE <> 0) or (RTIVA <> 0) or (RTICA <> 0)) then
                BEGIN
                OK = 'N';
                if (AGRUPA = 'Z') then
                    BEGIN
                    if (GRPINI = '') then
                        BEGIN
                        if ((CODZONA IS NULL) or (CODZONA >= :GRPINI AND CODZONA <= :GRPFIN)) then
                            OK = 'S';
                        END
                    ELSE
                        if (CODZONA >= :GRPINI AND CODZONA <= :GRPFIN) then
                            OK = 'S';
                    END
                if (AGRUPA = 'C') then
                    BEGIN
                    if (GRPINI = '') then
                        BEGIN
                        if ((CODCOBR IS NULL) or (CODCOBR >= :GRPINI AND CODCOBR <= :GRPFIN)) then
                            OK = 'S';
                        END
                    ELSE
                        if (CODCOBR >= :GRPINI AND CODCOBR <= :GRPFIN) then
                            OK = 'S';
                    END
                if (AGRUPA = 'I') then
                    BEGIN
                    if (GRPINI = '') then
                        BEGIN
                        if ((CODCIUD IS NULL) or (CODCIUD >= :GRPINI AND CODCIUD <= :GRPFIN)) then
                            OK = 'S';
                        END
                    ELSE
                        if (CODCIUD >= :GRPINI AND CODCIUD <= :GRPFIN) then
                            OK = 'S';
                    END
                if (AGRUPA = 'N') then
                    OK = 'S';
            
                if (OK = 'S') then
                    BEGIN
                    SELECT COBR_NOM FROM COBRADORES WHERE COBR_COD = :CODCOBR INTO :NOMCOBR;
                    SELECT ZONA_NOM FROM ZONAS WHERE ZONA_COD = :CODZONA INTO :NOMZONA;
                    SELECT CIUD_NOM FROM CIUDADES WHERE CIUD_COD = :CODCIUD INTO :NOMCIUD;
                    if (DB = 'N') then
                        BEGIN
                        CREDITO = DEBITO;
                        DEBITO = 0;
                        END
                    ELSE
                        CREDITO = 0;
                    SUSPEND;
                    END
                END
            END
    END
ELSE
    BEGIN
    if (RETES = 'SI') then
        BEGIN
        FOR select MAX(T.TERC_NIT), MAX(TERC_NOM), MAX(TERC_DV), MAX(TERC_TEL), MAX(TERC_CIU), MAX(S.COBR_COD), MAX(C.ZONA_COD), MAX(T.CIUD_COD), MAX(CLCU_COD), MAX(CLSU_NOMBRE)
            from movimiento_clientes m, terceros T, CLIENTES C, CLIENTE_SUCURSALES S
            where mvcl_fecha >= :FECINI and mvcl_fecha <= :FECFIN AND mvcl_abono = 'N'
            and C.TERC_NIT = T.TERC_NIT AND TERC_CLIE = 'S' AND S.TERC_NIT = C.TERC_NIT AND M.terc_nit = T.terc_nit AND M.mvcl_sucursal = S.clcu_cod AND
            T.TERC_NIT >= :NITINI AND T.TERC_NIT <= :NITFIN AND TERC_NOM >= :NOMINI AND TERC_NOM <= :NOMFIN AND ((sucu_id = :subempresa) or (:subempresa = 0))
            GROUP BY T.TERC_NIT
            into :NIT, :NOMBRE, :DV, :TELEFONO, :CIUDAD, :CODCOBR, :CODZONA, :CODCIUD, :SUCURSAL, :NOMSUC
            DO
            BEGIN
            SELECT SUM(MVCL_RTEFTE), SUM(MVCL_RTEIVA), SUM(MVCL_RTEICA) FROM movimiento_clientes WHERE TERC_NIT = :nit AND mvcl_sucursal = :sucursal AND
                mvcl_fecha >= :FECINI and mvcl_fecha <= :FECFIN AND mvcl_abono = 'N' AND MVCL_DEBITO = 'S'
                INTO :RTFTE, :RTIVA, :RTICA;
            if (RTFTE IS NULL) then
                RTFTE = 0;
            if (RTIVA IS NULL) then
                RTIVA = 0;
            if (RTICA IS NULL) then
                RTICA = 0;
            SELECT SUM(MVCL_RTEFTE), SUM(MVCL_RTEIVA), SUM(MVCL_RTEICA) FROM movimiento_clientes WHERE TERC_NIT = :nit AND mvcl_sucursal = :sucursal AND
                mvcl_fecha >= :FECINI and mvcl_fecha <= :FECFIN AND mvcl_abono = 'N' AND MVCL_DEBITO = 'N'
                INTO :ARTFTE, :ARTIVA, :ARTICA;
            if (ARTFTE IS NULL) then
                ARTFTE = 0;
            if (ARTIVA IS NULL) then
                ARTIVA = 0;
            if (ARTICA IS NULL) then
                ARTICA = 0;
            RTFTE = RTFTE - ARTFTE;
            RTIVA = RTIVA - ARTIVA;
            RTICA = RTICA - ARTICA;
            if ((RTFTE <> 0) or (RTIVA <> 0) or (RTICA <> 0)) then
                BEGIN
                OK = 'N';
                if (AGRUPA = 'Z') then
                    BEGIN
                    if (GRPINI = '') then
                        BEGIN
                        if ((CODZONA IS NULL) or (CODZONA >= :GRPINI AND CODZONA <= :GRPFIN)) then
                            OK = 'S';
                        END
                    ELSE
                        if (CODZONA >= :GRPINI AND CODZONA <= :GRPFIN) then
                            OK = 'S';
                    END
                if (AGRUPA = 'C') then
                    BEGIN
                    if (GRPINI = '') then
                        BEGIN
                        if ((CODCOBR IS NULL) or (CODCOBR >= :GRPINI AND CODCOBR <= :GRPFIN)) then
                            OK = 'S';
                        END
                    ELSE
                        if (CODCOBR >= :GRPINI AND CODCOBR <= :GRPFIN) then
                            OK = 'S';
                    END
                if (AGRUPA = 'I') then
                    BEGIN
                    if (GRPINI = '') then
                        BEGIN
                        if ((CODCIUD IS NULL) or (CODCIUD >= :GRPINI AND CODCIUD <= :GRPFIN)) then
                            OK = 'S';
                        END
                    ELSE
                        if (CODCIUD >= :GRPINI AND CODCIUD <= :GRPFIN) then
                            OK = 'S';
                    END
                if (AGRUPA = 'N') then
                    OK = 'S';
            
                if (OK = 'S') then
                    BEGIN
                    SELECT SUM(MVCL_MONTO) FROM movimiento_clientes WHERE TERC_NIT = :NIT and mvcl_sucursal = :sucursal AND MVCL_FECHA >= :FECINI AND MVCL_FECHA <= :FECFIN AND MVCL_DEBITO = 'S' AND MVCL_ABONO = 'N' AND (MVCL_RTEFTE <> 0 OR MVCL_RTEIVA <> 0 OR MVCL_RTEICA <> 0) and ((sucu_id = :subempresa) or (:subempresa = 0)) INTO :DEBITO;
                    SELECT SUM(MVCL_MONTO) FROM movimiento_clientes WHERE TERC_NIT = :NIT and mvcl_sucursal = :sucursal AND MVCL_FECHA >= :FECINI AND MVCL_FECHA <= :FECFIN AND MVCL_DEBITO = 'N'  AND MVCL_ABONO = 'N' AND (MVCL_RTEFTE <> 0 OR MVCL_RTEIVA <> 0 OR MVCL_RTEICA <> 0) and ((sucu_id = :subempresa) or (:subempresa = 0)) INTO :CREDITO;
                    if (DEBITO IS NULL) then
                        DEBITO = 0;
                    if (CREDITO IS NULL) then
                        CREDITO = 0;
                    SELECT COBR_NOM FROM COBRADORES WHERE COBR_COD = :CODCOBR INTO :NOMCOBR;
                    SELECT ZONA_NOM FROM ZONAS WHERE ZONA_COD = :CODZONA INTO :NOMZONA;
                    SELECT CIUD_NOM FROM CIUDADES WHERE CIUD_COD = :CODCIUD INTO :NOMCIUD;
                    SUSPEND;
                    END
                END
            END
        end
    ELSE
        BEGIN
        FOR select MAX(T.TERC_NIT), MAX(TERC_NOM), MAX(TERC_DV), MAX(TERC_TEL), MAX(TERC_CIU), MAX(S.COBR_COD), MAX(C.ZONA_COD), MAX(T.CIUD_COD), MAX(CLCU_COD), MAX(CLSU_NOMBRE)
            from movimiento_clientes m, terceros T, CLIENTES C, CLIENTE_SUCURSALES S
            where mvcl_fecha >= :FECINI and mvcl_fecha <= :FECFIN AND mvcl_abono = 'S'
            and C.TERC_NIT = T.TERC_NIT AND TERC_CLIE = 'S' AND S.TERC_NIT = C.TERC_NIT AND M.terc_nit = T.terc_nit AND M.mvcl_sucursal = S.clcu_cod AND
            T.TERC_NIT >= :NITINI AND T.TERC_NIT <= :NITFIN AND TERC_NOM >= :NOMINI AND TERC_NOM <= :NOMFIN AND ((sucu_id = :subempresa) or (:subempresa = 0))
            GROUP BY T.TERC_NIT
            into :NIT, :NOMBRE, :DV, :TELEFONO, :CIUDAD, :CODCOBR, :CODZONA, :CODCIUD, :SUCURSAL, :NOMSUC
            DO
            BEGIN
            SELECT SUM(MVCL_RTEFTE), SUM(MVCL_RTEIVA), SUM(MVCL_RTEICA) FROM movimiento_clientes WHERE TERC_NIT = :nit AND mvcl_sucursal = :sucursal AND
                mvcl_fecha >= :FECINI and mvcl_fecha <= :FECFIN AND mvcl_abono = 'N' AND MVCL_DEBITO = 'S'
                INTO :RTFTE, :RTIVA, :RTICA;
            if (RTFTE IS NULL) then
                RTFTE = 0;
            if (RTIVA IS NULL) then
                RTIVA = 0;
            if (RTICA IS NULL) then
                RTICA = 0;
            SELECT SUM(MVCL_RTEFTE), SUM(MVCL_RTEIVA), SUM(MVCL_RTEICA) FROM movimiento_clientes WHERE TERC_NIT = :nit AND mvcl_sucursal = :sucursal AND
                mvcl_fecha >= :FECINI and mvcl_fecha <= :FECFIN AND mvcl_abono = 'N' AND MVCL_DEBITO = 'N'
                INTO :ARTFTE, :ARTIVA, :ARTICA;
            if (ARTFTE IS NULL) then
                ARTFTE = 0;
            if (ARTIVA IS NULL) then
                ARTIVA = 0;
            if (ARTICA IS NULL) then
                ARTICA = 0;
            RTFTE = RTFTE - ARTFTE;
            RTIVA = RTIVA - ARTIVA;
            RTICA = RTICA - ARTICA;
            if ((RTFTE <> 0) or (RTIVA <> 0) or (RTICA <> 0)) then
                BEGIN
                OK = 'N';
                if (AGRUPA = 'Z') then
                    BEGIN
                    if (GRPINI = '') then
                        BEGIN
                        if ((CODZONA IS NULL) or (CODZONA >= :GRPINI AND CODZONA <= :GRPFIN)) then
                            OK = 'S';
                        END
                    ELSE
                        if (CODZONA >= :GRPINI AND CODZONA <= :GRPFIN) then
                            OK = 'S';
                    END
                if (AGRUPA = 'C') then
                    BEGIN
                    if (GRPINI = '') then
                        BEGIN
                        if ((CODCOBR IS NULL) or (CODCOBR >= :GRPINI AND CODCOBR <= :GRPFIN)) then
                            OK = 'S';
                        END
                    ELSE
                        if (CODCOBR >= :GRPINI AND CODCOBR <= :GRPFIN) then
                            OK = 'S';
                    END
                if (AGRUPA = 'I') then
                    BEGIN
                    if (GRPINI = '') then
                        BEGIN
                        if ((CODCIUD IS NULL) or (CODCIUD >= :GRPINI AND CODCIUD <= :GRPFIN)) then
                            OK = 'S';
                        END
                    ELSE
                        if (CODCIUD >= :GRPINI AND CODCIUD <= :GRPFIN) then
                            OK = 'S';
                    END
                if (AGRUPA = 'N') then
                    OK = 'S';
            
                if (OK = 'S') then
                    BEGIN
                    SELECT SUM(MVCL_MONTO) FROM movimiento_clientes WHERE TERC_NIT = :NIT and mvcl_sucursal = :sucursal AND MVCL_FECHA >= :FECINI AND MVCL_FECHA <= :FECFIN AND MVCL_DEBITO = 'S' AND MVCL_ABONO = 'S' AND (MVCL_RTEFTE <> 0 OR MVCL_RTEIVA <> 0 OR MVCL_RTEICA <> 0) and ((sucu_id = :subempresa) or (:subempresa = 0)) INTO :DEBITO;
                    SELECT SUM(MVCL_MONTO) FROM movimiento_clientes WHERE TERC_NIT = :NIT and mvcl_sucursal = :sucursal AND MVCL_FECHA >= :FECINI AND MVCL_FECHA <= :FECFIN AND MVCL_DEBITO = 'N'  AND MVCL_ABONO = 'S' AND (MVCL_RTEFTE <> 0 OR MVCL_RTEIVA <> 0 OR MVCL_RTEICA <> 0) and ((sucu_id = :subempresa) or (:subempresa = 0)) INTO :CREDITO;
                    if (DEBITO IS NULL) then
                        DEBITO = 0;
                    if (CREDITO IS NULL) then
                        CREDITO = 0;
                    SELECT COBR_NOM FROM COBRADORES WHERE COBR_COD = :CODCOBR INTO :NOMCOBR;
                    SELECT ZONA_NOM FROM ZONAS WHERE ZONA_COD = :CODZONA INTO :NOMZONA;
                    SELECT CIUD_NOM FROM CIUDADES WHERE CIUD_COD = :CODCIUD INTO :NOMCIUD;
                    SUSPEND;
                    END
                END
            END
        END
    END
END
^

SET TERM ; ^


/* 20090211 IMPRESION DE CHEQUES DESDE CONTABILIDAD, DATOS DE BENEFICIARIO Y MONTO EN ENCABEZADO Y FTO DE IMPRESION */
/* comprobantes contables con nit y monto imprimibles */

ALTER TABLE COMPROBANTE_ENCABEZADO
ADD TERC_NIT T_NIT;
ALTER TABLE COMPROBANTE_ENCABEZADO
ADD ENCO_NOMTERC T_CONCEPTO;
ALTER TABLE COMPROBANTE_ENCABEZADO
ADD ENCO_MONTO T_MONTO;

ALTER TABLE TIPO_COMPROBANTE
ADD TICO_FORMATO T_BOOLEANO;
update tipo_comprobante set tico_formato = 'N';

SET TERM ^ ;

create trigger TIPO_COMPROBANTE_BI for TIPO_COMPROBANTE
active BEFORE INSERT position 0
as
begin
if (new.tico_formato is null) then
    new.tico_formato = 'N';
end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER PROCEDURE IMPR_COMPROBANTE(
    ID INTEGER)
RETURNS (
    TIPO VARCHAR(3),
    FTO CHAR(1),
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA CHAR(8),
    CONCEPTO VARCHAR(60),
    REFER VARCHAR(8),
    NOMTIPO VARCHAR(60),
    NITENC VARCHAR(20),
    NOMENC VARCHAR(60),
    MONTO NUMERIC(18,2),
    ITEM INTEGER,
    CUENTA VARCHAR(20),
    NOMCUENTA VARCHAR(60),
    NIT VARCHAR(20),
    NOMTERCERO VARCHAR(60),
    PROYECTO VARCHAR(4),
    CENTRO VARCHAR(4),
    NOMPROY VARCHAR(60),
    NOMCENT VARCHAR(60),
    ITCONCEPTO VARCHAR(60),
    ITREFER VARCHAR(8),
    ARTICULO VARCHAR(15),
    NOMARTIC VARCHAR(60),
    DEBITO NUMERIC(18,2),
    CREDITO NUMERIC(18,2),
    BASE NUMERIC(18,2),
    PORC NUMERIC(9,4),
    NUMDOC VARCHAR(8),
    NUMAPLICA VARCHAR(8),
    VENCE CHAR(8),
    TIPODOC VARCHAR(8),
    TIPODOCAP VARCHAR(8))
AS
declare variable ITEMS INTEGER;
declare variable MAX_COMPROBA INTEGER;
declare variable TIPOCUEN CHAR(1);
BEGIN
SELECT E.TICO_COD, PRCO_PREF, ENCO_NUMERO, ENCO_FECHA, ENCO_CONCEPTO, ENCO_REFER, TICO_NOM, terc_nit, enco_nomterc, enco_monto, TICO_FORMATO
    FROM COMPROBANTE_ENCABEZADO E, TIPO_COMPROBANTE T WHERE E.TICO_COD = T.TICO_COD AND E.ENCO_CONSEC = :ID into
    :TIPO, :PREF, :NUMERO, :FECHA, :CONCEPTO, :REFER, NOMTIPO, :nitenc, :nomenc, :monto, :fto;
FOR SELECT CODE_ITEM, D.CUEN_COD, C.CUEN_NOM, D.TERC_NIT, TERC_NOM, D.PROY_COD, D.CENT_COD, PROY_NOM, CENT_NOM, CODE_CONCEPTO, CODE_REFER, D.ARTI_COD, CODE_DEBITO, CODE_CREDITO, CODE_BASE, CODE_PORC, CNDE_DOCNUMERO, CNDE_DOCAPLICA, DOCO_VENCE, CODE_TIPONUE, CODE_TIPOAPL
    FROM COMPROBANTE_DETALLE D, CUENTAS C, TERCEROS T, PROYECTOS P, CENTROS CE
    WHERE D.CUEN_COD = C.CUEN_COD AND D.TERC_NIT = T.TERC_NIT AND D.PROY_COD = P.PROY_COD AND D.CENT_COD = CE.CENT_COD AND P.PROY_COD = CE.PROY_COD AND D.ENCO_CONSEC = :ID
    ORDER BY CODE_ITEM
    INTO
    :ITEM, :CUENTA, :NOMCUENTA, :NIT, :NOMTERCERO, :PROYECTO, :CENTRO, :NOMPROY, :NOMCENT, :ITCONCEPTO, :ITREFER, :ARTICULO, :DEBITO, :CREDITO, :BASE, :PORC, :NUMDOC, :NUMAPLICA, :VENCE, :TIPODOC, :TIPODOCAP
    DO
    begin
    SELECT CUEN_TIPO FROM CUENTAS WHERE CUEN_COD = :cuenta INTO :tipocuen;
    if (tipocuen = 'I') then
        select ARTI_DES from ARTICULO where ARTI_COD = :articulo into :NOMARTIC;
    ELSE
        if (tipocuen = 'A') then
            select ACFJ_DESC from activos_fijos where ACFJ_COD = :articulo into :NOMARTIC;
    select TIDO_NOMCORTO from TIPO_DOCUMENTO where TIDO_COD = :tipodoc INTO :tipodoc;
    select TIDO_NOMCORTO from TIPO_DOCUMENTO where TIDO_COD = :tipodocap INTO :tipodocap;
    SUSPEND;
    end
if (FTO <> 'S') then
    BEGIN
    SELECT COUNT(*) FROM COMPROBANTE_DETALLE WHERE ENCO_CONSEC = :ID INTO :ITEMS;
    EXECUTE PROCEDURE LEE_CONFIGURACION('CONTABILIDAD','GENERAL','NUMERO DE ITEMS EN IMPRESION DE COMPROBANTES') returning_values :MAX_COMPROBA;
    ITEM = NULL;
    CUENTA = NULL;
    NOMCUENTA = NULL;
    NIT = NULL;
    NOMTERCERO = NULL;
    PROYECTO = NULL;
    CENTRO = NULL;
    NOMPROY = NULL;
    NOMCENT = NULL;
    ITCONCEPTO = NULL;
    ITREFER = NULL;
    ARTICULO = NULL;
    NOMARTIC = NULL;
    DEBITO = NULL;
    CREDITO = NULL;
    BASE = NULL;
    PORC = NULL;
    NUMDOC = NULL;
    NUMAPLICA = NULL;
    VENCE = NULL;
    TIPODOC = NULL;
    TIPODOCAP = NULL;
    WHILE (ITEMS < MAX_COMPROBA) DO
        BEGIN
        ITEMS = ITEMS + 1;
        SUSPEND;
        END
    END
END
^

SET TERM ; ^


INSERT INTO FORMATOS (TIDO_COD, PREF_PRE, FORM_IMPRE, FORM_NROITEMS, FORM_PAGINAS, FORM_ENTRELINEA, FORM_FONT, FORM_FSIZE, FORM_PAPELAN, FORM_PAPELAL) VALUES (1, 'EGR', NULL, 20, 'S', 60, 'Modern', 8, 8.5, 11);

COMMIT WORK;

INSERT INTO FORMATO_DATOS (TIDO_COD, PREF_PRE, DAFO_DATO, DAFO_IMPRIME, DAFO_POSX, DAFO_POSY, DAFO_FORMATO, DAFO_LONG, DAFO_REPITE, DAFO_FONT, DAFO_FSIZE, DAFO_LIQUIDA, DAFO_POSYVAR, DAFO_ITEM, DAFO_INI) VALUES (1, 'EGR', 'TIPO', 'N', 1, 1, NULL, 3, 'N', 'Modern', 8, 'N', 'N', 1, 1);
INSERT INTO FORMATO_DATOS (TIDO_COD, PREF_PRE, DAFO_DATO, DAFO_IMPRIME, DAFO_POSX, DAFO_POSY, DAFO_FORMATO, DAFO_LONG, DAFO_REPITE, DAFO_FONT, DAFO_FSIZE, DAFO_LIQUIDA, DAFO_POSYVAR, DAFO_ITEM, DAFO_INI) VALUES (1, 'EGR', 'NOMBRE TIPO', 'S', 100, 130, NULL, 60, 'N', 'Modern', 10, 'N', 'N', 2, 1);
INSERT INTO FORMATO_DATOS (TIDO_COD, PREF_PRE, DAFO_DATO, DAFO_IMPRIME, DAFO_POSX, DAFO_POSY, DAFO_FORMATO, DAFO_LONG, DAFO_REPITE, DAFO_FONT, DAFO_FSIZE, DAFO_LIQUIDA, DAFO_POSYVAR, DAFO_ITEM, DAFO_INI) VALUES (1, 'EGR', 'PREFIJO', 'S', 480, 130, NULL, 4, 'N', 'Modern', 8, 'N', 'N', 3, 1);
INSERT INTO FORMATO_DATOS (TIDO_COD, PREF_PRE, DAFO_DATO, DAFO_IMPRIME, DAFO_POSX, DAFO_POSY, DAFO_FORMATO, DAFO_LONG, DAFO_REPITE, DAFO_FONT, DAFO_FSIZE, DAFO_LIQUIDA, DAFO_POSYVAR, DAFO_ITEM, DAFO_INI) VALUES (1, 'EGR', 'NUMERO', 'S', 520, 130, NULL, 6, 'N', 'Modern', 8, 'N', 'N', 4, 1);
INSERT INTO FORMATO_DATOS (TIDO_COD, PREF_PRE, DAFO_DATO, DAFO_IMPRIME, DAFO_POSX, DAFO_POSY, DAFO_FORMATO, DAFO_LONG, DAFO_REPITE, DAFO_FONT, DAFO_FSIZE, DAFO_LIQUIDA, DAFO_POSYVAR, DAFO_ITEM, DAFO_INI) VALUES (1, 'EGR', 'FECHA', 'S', 1000, 190, NULL, 4, 'N', 'Modern', 8, 'N', 'N', 5, 1);
INSERT INTO FORMATO_DATOS (TIDO_COD, PREF_PRE, DAFO_DATO, DAFO_IMPRIME, DAFO_POSX, DAFO_POSY, DAFO_FORMATO, DAFO_LONG, DAFO_REPITE, DAFO_FONT, DAFO_FSIZE, DAFO_LIQUIDA, DAFO_POSYVAR, DAFO_ITEM, DAFO_INI) VALUES (1, 'EGR', 'CONCEPTO', 'S', 100, 160, NULL, 60, 'N', 'Modern', 8, 'N', 'N', 6, 1);
INSERT INTO FORMATO_DATOS (TIDO_COD, PREF_PRE, DAFO_DATO, DAFO_IMPRIME, DAFO_POSX, DAFO_POSY, DAFO_FORMATO, DAFO_LONG, DAFO_REPITE, DAFO_FONT, DAFO_FSIZE, DAFO_LIQUIDA, DAFO_POSYVAR, DAFO_ITEM, DAFO_INI) VALUES (1, 'EGR', 'REFERENCIA', 'N', 1, 7, NULL, 20, 'N', 'Modern', 8, 'N', 'N', 7, 1);
INSERT INTO FORMATO_DATOS (TIDO_COD, PREF_PRE, DAFO_DATO, DAFO_IMPRIME, DAFO_POSX, DAFO_POSY, DAFO_FORMATO, DAFO_LONG, DAFO_REPITE, DAFO_FONT, DAFO_FSIZE, DAFO_LIQUIDA, DAFO_POSYVAR, DAFO_ITEM, DAFO_INI) VALUES (1, 'EGR', 'ENCABEZADO NIT', 'N', 1, 8, NULL, 20, 'N', 'Modern', 8, 'N', 'N', 8, 1);
INSERT INTO FORMATO_DATOS (TIDO_COD, PREF_PRE, DAFO_DATO, DAFO_IMPRIME, DAFO_POSX, DAFO_POSY, DAFO_FORMATO, DAFO_LONG, DAFO_REPITE, DAFO_FONT, DAFO_FSIZE, DAFO_LIQUIDA, DAFO_POSYVAR, DAFO_ITEM, DAFO_INI) VALUES (1, 'EGR', 'ENCABEZADO NOMBRE', 'S', 100, 240, NULL, 60, 'N', 'Modern', 8, 'N', 'N', 9, 1);
INSERT INTO FORMATO_DATOS (TIDO_COD, PREF_PRE, DAFO_DATO, DAFO_IMPRIME, DAFO_POSX, DAFO_POSY, DAFO_FORMATO, DAFO_LONG, DAFO_REPITE, DAFO_FONT, DAFO_FSIZE, DAFO_LIQUIDA, DAFO_POSYVAR, DAFO_ITEM, DAFO_INI) VALUES (1, 'EGR', 'TOTAL DEBITOS', 'S', 1200, 1380, NULL, NULL, 'N', 'Modern', 8, 'S', 'N', 10, 1);
INSERT INTO FORMATO_DATOS (TIDO_COD, PREF_PRE, DAFO_DATO, DAFO_IMPRIME, DAFO_POSX, DAFO_POSY, DAFO_FORMATO, DAFO_LONG, DAFO_REPITE, DAFO_FONT, DAFO_FSIZE, DAFO_LIQUIDA, DAFO_POSYVAR, DAFO_ITEM, DAFO_INI) VALUES (1, 'EGR', 'TOTAL CREDITOS', 'S', 1400, 1380, NULL, NULL, 'N', 'Modern', 8, 'S', 'N', 11, 1);
INSERT INTO FORMATO_DATOS (TIDO_COD, PREF_PRE, DAFO_DATO, DAFO_IMPRIME, DAFO_POSX, DAFO_POSY, DAFO_FORMATO, DAFO_LONG, DAFO_REPITE, DAFO_FONT, DAFO_FSIZE, DAFO_LIQUIDA, DAFO_POSYVAR, DAFO_ITEM, DAFO_INI) VALUES (1, 'EGR', 'MONTO COMPROBANTE', 'S', 1300, 190, NULL, NULL, 'N', 'Modern', 8, 'N', 'N', 12, 1);
INSERT INTO FORMATO_DATOS (TIDO_COD, PREF_PRE, DAFO_DATO, DAFO_IMPRIME, DAFO_POSX, DAFO_POSY, DAFO_FORMATO, DAFO_LONG, DAFO_REPITE, DAFO_FONT, DAFO_FSIZE, DAFO_LIQUIDA, DAFO_POSYVAR, DAFO_ITEM, DAFO_INI) VALUES (1, 'EGR', 'MONTO LETRAS', 'S', 100, 270, NULL, 70, 'N', 'Modern', 8, 'N', 'N', 13, 1);
INSERT INTO FORMATO_DATOS (TIDO_COD, PREF_PRE, DAFO_DATO, DAFO_IMPRIME, DAFO_POSX, DAFO_POSY, DAFO_FORMATO, DAFO_LONG, DAFO_REPITE, DAFO_FONT, DAFO_FSIZE, DAFO_LIQUIDA, DAFO_POSYVAR, DAFO_ITEM, DAFO_INI) VALUES (1, 'EGR', 'NOMBRE USUARIO', 'N', 1, 14, NULL, 60, 'N', 'Modern', 8, 'N', 'N', 14, 1);
INSERT INTO FORMATO_DATOS (TIDO_COD, PREF_PRE, DAFO_DATO, DAFO_IMPRIME, DAFO_POSX, DAFO_POSY, DAFO_FORMATO, DAFO_LONG, DAFO_REPITE, DAFO_FONT, DAFO_FSIZE, DAFO_LIQUIDA, DAFO_POSYVAR, DAFO_ITEM, DAFO_INI) VALUES (1, 'EGR', 'CODIGO USUARIO', 'N', 1, 15, NULL, 8, 'N', 'Modern', 8, 'N', 'N', 15, 1);
INSERT INTO FORMATO_DATOS (TIDO_COD, PREF_PRE, DAFO_DATO, DAFO_IMPRIME, DAFO_POSX, DAFO_POSY, DAFO_FORMATO, DAFO_LONG, DAFO_REPITE, DAFO_FONT, DAFO_FSIZE, DAFO_LIQUIDA, DAFO_POSYVAR, DAFO_ITEM, DAFO_INI) VALUES (1, 'EGR', 'NUMERO PAGINA', 'N', 1, 16, NULL, 3, 'N', 'Modern', 8, 'N', 'N', 16, 1);
INSERT INTO FORMATO_DATOS (TIDO_COD, PREF_PRE, DAFO_DATO, DAFO_IMPRIME, DAFO_POSX, DAFO_POSY, DAFO_FORMATO, DAFO_LONG, DAFO_REPITE, DAFO_FONT, DAFO_FSIZE, DAFO_LIQUIDA, DAFO_POSYVAR, DAFO_ITEM, DAFO_INI) VALUES (1, 'EGR', 'FECHA REGISTRO', 'N', 1, 17, NULL, 10, 'N', 'Modern', 8, 'N', 'N', 17, 1);
INSERT INTO FORMATO_DATOS (TIDO_COD, PREF_PRE, DAFO_DATO, DAFO_IMPRIME, DAFO_POSX, DAFO_POSY, DAFO_FORMATO, DAFO_LONG, DAFO_REPITE, DAFO_FONT, DAFO_FSIZE, DAFO_LIQUIDA, DAFO_POSYVAR, DAFO_ITEM, DAFO_INI) VALUES (1, 'EGR', 'HORA REGISTRO', 'N', 1, 18, NULL, 10, 'N', 'Modern', 8, 'N', 'N', 18, 1);
INSERT INTO FORMATO_DATOS (TIDO_COD, PREF_PRE, DAFO_DATO, DAFO_IMPRIME, DAFO_POSX, DAFO_POSY, DAFO_FORMATO, DAFO_LONG, DAFO_REPITE, DAFO_FONT, DAFO_FSIZE, DAFO_LIQUIDA, DAFO_POSYVAR, DAFO_ITEM, DAFO_INI) VALUES (1, 'EGR', 'USUARIO REGISTRO', 'N', 1, 19, NULL, 8, 'N', 'Modern', 8, 'N', 'N', 19, 1);
INSERT INTO FORMATO_DATOS (TIDO_COD, PREF_PRE, DAFO_DATO, DAFO_IMPRIME, DAFO_POSX, DAFO_POSY, DAFO_FORMATO, DAFO_LONG, DAFO_REPITE, DAFO_FONT, DAFO_FSIZE, DAFO_LIQUIDA, DAFO_POSYVAR, DAFO_ITEM, DAFO_INI) VALUES (1, 'EGR', 'NOMBRE COMPANIA', 'S', 100, 100, NULL, 60, 'N', 'Modern', 10, 'N', 'N', 20, 1);
INSERT INTO FORMATO_DATOS (TIDO_COD, PREF_PRE, DAFO_DATO, DAFO_IMPRIME, DAFO_POSX, DAFO_POSY, DAFO_FORMATO, DAFO_LONG, DAFO_REPITE, DAFO_FONT, DAFO_FSIZE, DAFO_LIQUIDA, DAFO_POSYVAR, DAFO_ITEM, DAFO_INI) VALUES (1, 'EGR', 'NIT COMPANIA', 'S', 100, 130, NULL, 20, 'N', 'Modern', 8, 'N', 'N', 21, 1);
INSERT INTO FORMATO_DATOS (TIDO_COD, PREF_PRE, DAFO_DATO, DAFO_IMPRIME, DAFO_POSX, DAFO_POSY, DAFO_FORMATO, DAFO_LONG, DAFO_REPITE, DAFO_FONT, DAFO_FSIZE, DAFO_LIQUIDA, DAFO_POSYVAR, DAFO_ITEM, DAFO_INI) VALUES (1, 'EGR', 'ITEM', 'N', 1, 30, NULL, 3, 'S', 'Modern', 8, 'N', 'N', 22, 1);
INSERT INTO FORMATO_DATOS (TIDO_COD, PREF_PRE, DAFO_DATO, DAFO_IMPRIME, DAFO_POSX, DAFO_POSY, DAFO_FORMATO, DAFO_LONG, DAFO_REPITE, DAFO_FONT, DAFO_FSIZE, DAFO_LIQUIDA, DAFO_POSYVAR, DAFO_ITEM, DAFO_INI) VALUES (1, 'EGR', 'CUENTA', 'S', 110, 380, NULL, 20, 'S', 'Modern', 8, 'N', 'N', 23, 1);
INSERT INTO FORMATO_DATOS (TIDO_COD, PREF_PRE, DAFO_DATO, DAFO_IMPRIME, DAFO_POSX, DAFO_POSY, DAFO_FORMATO, DAFO_LONG, DAFO_REPITE, DAFO_FONT, DAFO_FSIZE, DAFO_LIQUIDA, DAFO_POSYVAR, DAFO_ITEM, DAFO_INI) VALUES (1, 'EGR', 'NOMBRE CUENTA', 'S', 460, 380, NULL, 40, 'S', 'Modern', 8, 'N', 'N', 24, 1);
INSERT INTO FORMATO_DATOS (TIDO_COD, PREF_PRE, DAFO_DATO, DAFO_IMPRIME, DAFO_POSX, DAFO_POSY, DAFO_FORMATO, DAFO_LONG, DAFO_REPITE, DAFO_FONT, DAFO_FSIZE, DAFO_LIQUIDA, DAFO_POSYVAR, DAFO_ITEM, DAFO_INI) VALUES (1, 'EGR', 'NIT TERCERO', 'S', 250, 380, NULL, 20, 'S', 'Modern', 8, 'N', 'N', 25, 1);
INSERT INTO FORMATO_DATOS (TIDO_COD, PREF_PRE, DAFO_DATO, DAFO_IMPRIME, DAFO_POSX, DAFO_POSY, DAFO_FORMATO, DAFO_LONG, DAFO_REPITE, DAFO_FONT, DAFO_FSIZE, DAFO_LIQUIDA, DAFO_POSYVAR, DAFO_ITEM, DAFO_INI) VALUES (1, 'EGR', 'NOMBRE TERCERO', 'S', 760, 380, NULL, 60, 'S', 'Modern', 8, 'N', 'N', 26, 1);
INSERT INTO FORMATO_DATOS (TIDO_COD, PREF_PRE, DAFO_DATO, DAFO_IMPRIME, DAFO_POSX, DAFO_POSY, DAFO_FORMATO, DAFO_LONG, DAFO_REPITE, DAFO_FONT, DAFO_FSIZE, DAFO_LIQUIDA, DAFO_POSYVAR, DAFO_ITEM, DAFO_INI) VALUES (1, 'EGR', 'CENTRO COSTO', 'S', 370, 380, NULL, 4, 'S', 'Modern', 8, 'N', 'N', 27, 1);
INSERT INTO FORMATO_DATOS (TIDO_COD, PREF_PRE, DAFO_DATO, DAFO_IMPRIME, DAFO_POSX, DAFO_POSY, DAFO_FORMATO, DAFO_LONG, DAFO_REPITE, DAFO_FONT, DAFO_FSIZE, DAFO_LIQUIDA, DAFO_POSYVAR, DAFO_ITEM, DAFO_INI) VALUES (1, 'EGR', 'SUBCENTRO COSTO', 'S', 400, 380, NULL, 4, 'S', 'Modern', 8, 'N', 'N', 28, 1);
INSERT INTO FORMATO_DATOS (TIDO_COD, PREF_PRE, DAFO_DATO, DAFO_IMPRIME, DAFO_POSX, DAFO_POSY, DAFO_FORMATO, DAFO_LONG, DAFO_REPITE, DAFO_FONT, DAFO_FSIZE, DAFO_LIQUIDA, DAFO_POSYVAR, DAFO_ITEM, DAFO_INI) VALUES (1, 'EGR', 'NOMBRE CENTRO COSTO', 'N', 900, 300, NULL, 30, 'S', 'Modern', 8, 'N', 'N', 29, 1);
INSERT INTO FORMATO_DATOS (TIDO_COD, PREF_PRE, DAFO_DATO, DAFO_IMPRIME, DAFO_POSX, DAFO_POSY, DAFO_FORMATO, DAFO_LONG, DAFO_REPITE, DAFO_FONT, DAFO_FSIZE, DAFO_LIQUIDA, DAFO_POSYVAR, DAFO_ITEM, DAFO_INI) VALUES (1, 'EGR', 'NOMBRE SUBCENTRO COSTO', 'N', 1000, 300, NULL, 30, 'S', 'Modern', 8, 'N', 'N', 30, 1);
INSERT INTO FORMATO_DATOS (TIDO_COD, PREF_PRE, DAFO_DATO, DAFO_IMPRIME, DAFO_POSX, DAFO_POSY, DAFO_FORMATO, DAFO_LONG, DAFO_REPITE, DAFO_FONT, DAFO_FSIZE, DAFO_LIQUIDA, DAFO_POSYVAR, DAFO_ITEM, DAFO_INI) VALUES (1, 'EGR', 'CONCEPTO ITEM', 'S', 460, 410, NULL, 60, 'S', 'Modern', 8, 'N', 'N', 31, 1);
INSERT INTO FORMATO_DATOS (TIDO_COD, PREF_PRE, DAFO_DATO, DAFO_IMPRIME, DAFO_POSX, DAFO_POSY, DAFO_FORMATO, DAFO_LONG, DAFO_REPITE, DAFO_FONT, DAFO_FSIZE, DAFO_LIQUIDA, DAFO_POSYVAR, DAFO_ITEM, DAFO_INI) VALUES (1, 'EGR', 'REFERENCIA ITEM', 'N', 1100, 300, NULL, NULL, 'S', 'Modern', 8, 'N', 'N', 32, 1);
INSERT INTO FORMATO_DATOS (TIDO_COD, PREF_PRE, DAFO_DATO, DAFO_IMPRIME, DAFO_POSX, DAFO_POSY, DAFO_FORMATO, DAFO_LONG, DAFO_REPITE, DAFO_FONT, DAFO_FSIZE, DAFO_LIQUIDA, DAFO_POSYVAR, DAFO_ITEM, DAFO_INI) VALUES (1, 'EGR', 'ARTICULO', 'N', 1100, 300, NULL, NULL, 'S', 'Modern', 8, 'N', 'N', 33, 1);
INSERT INTO FORMATO_DATOS (TIDO_COD, PREF_PRE, DAFO_DATO, DAFO_IMPRIME, DAFO_POSX, DAFO_POSY, DAFO_FORMATO, DAFO_LONG, DAFO_REPITE, DAFO_FONT, DAFO_FSIZE, DAFO_LIQUIDA, DAFO_POSYVAR, DAFO_ITEM, DAFO_INI) VALUES (1, 'EGR', 'DEBITO ITEM', 'S', 1200, 380, NULL, NULL, 'S', 'Modern', 8, 'N', 'N', 34, 1);
INSERT INTO FORMATO_DATOS (TIDO_COD, PREF_PRE, DAFO_DATO, DAFO_IMPRIME, DAFO_POSX, DAFO_POSY, DAFO_FORMATO, DAFO_LONG, DAFO_REPITE, DAFO_FONT, DAFO_FSIZE, DAFO_LIQUIDA, DAFO_POSYVAR, DAFO_ITEM, DAFO_INI) VALUES (1, 'EGR', 'CREDITO ITEM', 'S', 1400, 380, NULL, NULL, 'S', 'Modern', 8, 'N', 'N', 35, 1);
INSERT INTO FORMATO_DATOS (TIDO_COD, PREF_PRE, DAFO_DATO, DAFO_IMPRIME, DAFO_POSX, DAFO_POSY, DAFO_FORMATO, DAFO_LONG, DAFO_REPITE, DAFO_FONT, DAFO_FSIZE, DAFO_LIQUIDA, DAFO_POSYVAR, DAFO_ITEM, DAFO_INI) VALUES (1, 'EGR', 'BASE ITEM', 'N', 1200, 300, NULL, NULL, 'S', 'Modern', 8, 'N', 'N', 36, 1);
INSERT INTO FORMATO_DATOS (TIDO_COD, PREF_PRE, DAFO_DATO, DAFO_IMPRIME, DAFO_POSX, DAFO_POSY, DAFO_FORMATO, DAFO_LONG, DAFO_REPITE, DAFO_FONT, DAFO_FSIZE, DAFO_LIQUIDA, DAFO_POSYVAR, DAFO_ITEM, DAFO_INI) VALUES (1, 'EGR', 'PORCENTAJE ITEM', 'N', 1250, 300, NULL, NULL, 'S', 'Modern', 8, 'N', 'N', 37, 1);
INSERT INTO FORMATO_DATOS (TIDO_COD, PREF_PRE, DAFO_DATO, DAFO_IMPRIME, DAFO_POSX, DAFO_POSY, DAFO_FORMATO, DAFO_LONG, DAFO_REPITE, DAFO_FONT, DAFO_FSIZE, DAFO_LIQUIDA, DAFO_POSYVAR, DAFO_ITEM, DAFO_INI) VALUES (1, 'EGR', 'FECHA', 'S', 1080, 190, NULL, 2, 'N', 'Modern', 8, 'N', 'N', 38, 5);
INSERT INTO FORMATO_DATOS (TIDO_COD, PREF_PRE, DAFO_DATO, DAFO_IMPRIME, DAFO_POSX, DAFO_POSY, DAFO_FORMATO, DAFO_LONG, DAFO_REPITE, DAFO_FONT, DAFO_FSIZE, DAFO_LIQUIDA, DAFO_POSYVAR, DAFO_ITEM, DAFO_INI) VALUES (1, 'EGR', 'FECHA', 'S', 1120, 190, NULL, 2, 'N', 'Modern', 8, 'N', 'N', 39, 7);
INSERT INTO FORMATO_DATOS (TIDO_COD, PREF_PRE, DAFO_DATO, DAFO_IMPRIME, DAFO_POSX, DAFO_POSY, DAFO_FORMATO, DAFO_LONG, DAFO_REPITE, DAFO_FONT, DAFO_FSIZE, DAFO_LIQUIDA, DAFO_POSYVAR, DAFO_ITEM, DAFO_INI) VALUES (1, 'EGR', 'MONTO LETRAS', 'S', 150, 300, NULL, 70, 'N', 'Modern', 8, 'N', 'N', 40, 71);

COMMIT WORK;

INSERT INTO FORMATO_LINEAS (TIDO_COD, PREF_PRE, FOLI_ITEM, FOLI_TIPO, FOLI_X, FOLI_Y, FOLI_POSX, FOLI_POSY, FOLI_CADENA, FOLI_FONT, FOLI_FSIZE, FOLI_LIQUIDA) VALUES (1, 'EGR', 1, 'C', 1300, 20, 100, 330, NULL, 'Modern', 8, 'N');
INSERT INTO FORMATO_LINEAS (TIDO_COD, PREF_PRE, FOLI_ITEM, FOLI_TIPO, FOLI_X, FOLI_Y, FOLI_POSX, FOLI_POSY, FOLI_CADENA, FOLI_FONT, FOLI_FSIZE, FOLI_LIQUIDA) VALUES (1, 'EGR', 2, 'T', NULL, NULL, 1050, 350, 'DEBITOS', 'Modern', 8, 'N');
INSERT INTO FORMATO_LINEAS (TIDO_COD, PREF_PRE, FOLI_ITEM, FOLI_TIPO, FOLI_X, FOLI_Y, FOLI_POSX, FOLI_POSY, FOLI_CADENA, FOLI_FONT, FOLI_FSIZE, FOLI_LIQUIDA) VALUES (1, 'EGR', 3, 'T', NULL, NULL, 280, 350, 'NIT', 'Modern', 8, 'N');
INSERT INTO FORMATO_LINEAS (TIDO_COD, PREF_PRE, FOLI_ITEM, FOLI_TIPO, FOLI_X, FOLI_Y, FOLI_POSX, FOLI_POSY, FOLI_CADENA, FOLI_FONT, FOLI_FSIZE, FOLI_LIQUIDA) VALUES (1, 'EGR', 4, 'T', NULL, NULL, 370, 350, 'CENTRO COSTO', 'Modern', 8, 'N');
INSERT INTO FORMATO_LINEAS (TIDO_COD, PREF_PRE, FOLI_ITEM, FOLI_TIPO, FOLI_X, FOLI_Y, FOLI_POSX, FOLI_POSY, FOLI_CADENA, FOLI_FONT, FOLI_FSIZE, FOLI_LIQUIDA) VALUES (1, 'EGR', 5, 'T', NULL, NULL, 110, 350, 'CUENTA', 'Modern', 8, 'N');
INSERT INTO FORMATO_LINEAS (TIDO_COD, PREF_PRE, FOLI_ITEM, FOLI_TIPO, FOLI_X, FOLI_Y, FOLI_POSX, FOLI_POSY, FOLI_CADENA, FOLI_FONT, FOLI_FSIZE, FOLI_LIQUIDA) VALUES (1, 'EGR', 17, 'T', NULL, NULL, 400, 130, 'No.', 'Modern', 8, 'N');
INSERT INTO FORMATO_LINEAS (TIDO_COD, PREF_PRE, FOLI_ITEM, FOLI_TIPO, FOLI_X, FOLI_Y, FOLI_POSX, FOLI_POSY, FOLI_CADENA, FOLI_FONT, FOLI_FSIZE, FOLI_LIQUIDA) VALUES (1, 'EGR', 10, 'C', 1300, 1000, 100, 350, NULL, 'Modern', 8, 'N');
INSERT INTO FORMATO_LINEAS (TIDO_COD, PREF_PRE, FOLI_ITEM, FOLI_TIPO, FOLI_X, FOLI_Y, FOLI_POSX, FOLI_POSY, FOLI_CADENA, FOLI_FONT, FOLI_FSIZE, FOLI_LIQUIDA) VALUES (1, 'EGR', 7, 'T', NULL, NULL, 600, 350, 'CUENTA-TERCERO/CONCEPTO', 'Modern', 8, 'N');
INSERT INTO FORMATO_LINEAS (TIDO_COD, PREF_PRE, FOLI_ITEM, FOLI_TIPO, FOLI_X, FOLI_Y, FOLI_POSX, FOLI_POSY, FOLI_CADENA, FOLI_FONT, FOLI_FSIZE, FOLI_LIQUIDA) VALUES (1, 'EGR', 12, 'L', 0, 1000, 240, 350, NULL, 'Modern', 8, 'N');
INSERT INTO FORMATO_LINEAS (TIDO_COD, PREF_PRE, FOLI_ITEM, FOLI_TIPO, FOLI_X, FOLI_Y, FOLI_POSX, FOLI_POSY, FOLI_CADENA, FOLI_FONT, FOLI_FSIZE, FOLI_LIQUIDA) VALUES (1, 'EGR', 13, 'L', 0, 1000, 360, 350, NULL, 'Modern', 8, 'N');
INSERT INTO FORMATO_LINEAS (TIDO_COD, PREF_PRE, FOLI_ITEM, FOLI_TIPO, FOLI_X, FOLI_Y, FOLI_POSX, FOLI_POSY, FOLI_CADENA, FOLI_FONT, FOLI_FSIZE, FOLI_LIQUIDA) VALUES (1, 'EGR', 9, 'T', NULL, NULL, 1250, 350, 'CREDITOS', 'Modern', 8, 'N');
INSERT INTO FORMATO_LINEAS (TIDO_COD, PREF_PRE, FOLI_ITEM, FOLI_TIPO, FOLI_X, FOLI_Y, FOLI_POSX, FOLI_POSY, FOLI_CADENA, FOLI_FONT, FOLI_FSIZE, FOLI_LIQUIDA) VALUES (1, 'EGR', 14, 'L', 0, 1000, 450, 350, NULL, 'Modern', 8, 'N');
INSERT INTO FORMATO_LINEAS (TIDO_COD, PREF_PRE, FOLI_ITEM, FOLI_TIPO, FOLI_X, FOLI_Y, FOLI_POSX, FOLI_POSY, FOLI_CADENA, FOLI_FONT, FOLI_FSIZE, FOLI_LIQUIDA) VALUES (1, 'EGR', 15, 'L', 0, 1000, 990, 350, NULL, 'Modern', 8, 'N');
INSERT INTO FORMATO_LINEAS (TIDO_COD, PREF_PRE, FOLI_ITEM, FOLI_TIPO, FOLI_X, FOLI_Y, FOLI_POSX, FOLI_POSY, FOLI_CADENA, FOLI_FONT, FOLI_FSIZE, FOLI_LIQUIDA) VALUES (1, 'EGR', 20, 'T', NULL, NULL, NULL, NULL, NULL, 'Modern', 8, 'N');
INSERT INTO FORMATO_LINEAS (TIDO_COD, PREF_PRE, FOLI_ITEM, FOLI_TIPO, FOLI_X, FOLI_Y, FOLI_POSX, FOLI_POSY, FOLI_CADENA, FOLI_FONT, FOLI_FSIZE, FOLI_LIQUIDA) VALUES (1, 'EGR', 21, 'L', 0, 1000, 1210, 350, NULL, 'Modern', 8, 'N');

COMMIT WORK;

/* 20090212b MAL POR EL LEFT OUTER JOIN */

SET TERM ^ ;

CREATE OR ALTER PROCEDURE REP_RETENCION_PROVEEDOR(
    DESDE VARCHAR(20),
    HASTA VARCHAR(20),
    GRPINI VARCHAR(5),
    GRPFIN VARCHAR(5),
    FECINI DATE,
    FECFIN DATE,
    DETALLE CHAR(1),
    ORDEN CHAR(1),
    AGRUPA CHAR(1))
RETURNS (
    NIT VARCHAR(20),
    NOMBRE VARCHAR(60),
    TELEFONO VARCHAR(40),
    CIUDAD VARCHAR(40),
    CODZONA VARCHAR(2),
    NOMZONA VARCHAR(60),
    DV CHAR(1),
    CODCIUD CHAR(5),
    NOMCIUD VARCHAR(60),
    TIPODOC VARCHAR(8),
    IDDOC INTEGER,
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    CONCEPTO VARCHAR(60),
    DEBITO NUMERIC(18,2),
    CREDITO NUMERIC(18,2),
    RTFTE NUMERIC(18,2),
    RTIVA NUMERIC(18,2),
    RTICA NUMERIC(18,2))
AS
declare variable NITINI VARCHAR(20);
declare variable NITFIN VARCHAR(20);
declare variable NOMINI VARCHAR(20);
declare variable NOMFIN VARCHAR(20);
declare variable OK CHAR(1);
declare variable DB CHAR(1);
declare variable AB CHAR(1);
declare variable DESCRETE CHAR(2);
BEGIN
if (ORDEN = 'C') then
    BEGIN
    NITINI = DESDE;
    NITFIN = HASTA;
    NOMINI = '';
    NOMFIN = 'zz';
    END
ELSE
    BEGIN
    NOMINI = DESDE;
    NOMFIN = HASTA;
    NITINI = '';
    NITFIN = 'zz';
    END
EXECUTE PROCEDURE LEE_CONFIGURACION('CXPAGAR', 'SALDOS', 'DESCONTAR RETENCIONES POR CAUSACION') returning_values (DESCRETE);
/* Ubique el NIT */
FOR select T.TERC_NIT, TERC_NOM, TERC_DV, TERC_TEL, TERC_CIU, P.GRPR_COD, T.CIUD_COD
    from terceros T, PROVEEDORES P
    where P.TERC_NIT = T.TERC_NIT AND TERC_PROV = 'S' AND T.TERC_NIT >= :NITINI AND T.TERC_NIT <= :NITFIN AND
        TERC_NOM >= :NOMINI AND TERC_NOM <= :NOMFIN
    INTO :NIT, :NOMBRE, :DV, :TELEFONO, :CIUDAD, :CODZONA, :CODCIUD
    DO  
    BEGIN
    OK = 'N';
    if (AGRUPA = 'Z') then
        BEGIN
        if (GRPINI = '') then
            BEGIN
            if ((CODZONA IS NULL) or (CODZONA >= :GRPINI AND CODZONA <= :GRPFIN)) then
                OK = 'S';
            END
        ELSE
            if (CODZONA >= :GRPINI AND CODZONA <= :GRPFIN) then
                OK = 'S';
        END
    if (AGRUPA = 'C') then
        BEGIN
        if (GRPINI = '') then
            BEGIN
            if ((CODCIUD IS NULL) or (CODCIUD >= :GRPINI AND CODCIUD <= :GRPFIN)) then
                OK = 'S';
            END
        ELSE
            if (CODCIUD >= :GRPINI AND CODCIUD <= :GRPFIN) then
                OK = 'S';
        END
    if (AGRUPA = 'N') then
        OK = 'S';
        
    if (OK = 'S') then
        BEGIN
        select GRPR_NOM from GRUPOS_PROVEEDORES where GRPR_COD = :codzona into :NOMZONA;
        select CIUD_NOM from CIUDADES where CIUD_COD = :codciud into :nomciud;
        if (DETALLE = 'S') then
            BEGIN
            if (DESCRETE = 'SI') then
                FOR select tido_nomcorto, mvpr_idref, mvpr_prefijo, mvpr_numero, mvpr_fecha, mvpr_conc, mvpr_monto, mvpr_debito, mvpr_rtfte, mvpr_rtiva, mvpr_rtica, mvpr_abono
                    from movimiento_proveedor m, tipo_documento t
                    where m.mvpr_tiporef = t.tido_cod and terc_nit = :NIT and mvpr_fecha >= :FECINI and mvpr_fecha <= :FECFIN AND MVPR_TIPOREF <> 55 AND mvpr_abono = 'N' AND (MVPR_RTFTE <> 0 OR MVPR_RTIVA <> 0 OR MVPR_RTICA <> 0) 
                    order by mvpr_fecha, mvpr_tiporef
                    into :TIPODOC, :IDDOC, :PREFIJO, :NUMERO, :FECHA, :CONCEPTO, :DEBITO, :DB, :RTFTE, :RTIVA, :RTICA, :AB
                    DO
                    BEGIN
                    if (RTFTE IS NULL) then
                        RTFTE = 0;
                    if (RTIVA IS NULL) then
                        RTIVA = 0;
                    if (RTICA IS NULL) then
                        RTICA = 0;
                    if (DB = 'N') then
                        BEGIN
                        CREDITO = DEBITO;
                        DEBITO = 0;
                        RTFTE = RTFTE * -1;
                        RTIVA = RTIVA * -1;
                        RTICA = RTICA * -1;
                        END
                    ELSE
                        CREDITO = 0;
                    if ((RTFTE <> 0) or (RTIVA <> 0) or (RTICA <> 0)) then
                        SUSPEND;
                    END
            ELSE
                FOR select tido_nomcorto, mvpr_idref, mvpr_prefijo, mvpr_numero, mvpr_fecha, mvpr_conc, mvpr_monto, mvpr_debito, mvpr_rtfte, mvpr_rtiva, mvpr_rtica, mvpr_abono
                    from movimiento_proveedor m, tipo_documento t
                    where m.mvpr_tiporef = t.tido_cod and terc_nit = :NIT and mvpr_fecha >= :FECINI and mvpr_fecha <= :FECFIN AND mvpr_abono = 'S' AND (MVPR_RTFTE <> 0 OR MVPR_RTIVA <> 0 OR MVPR_RTICA <> 0)
                    order by mvpr_fecha, mvpr_tiporef
                    into :TIPODOC, :IDDOC, :PREFIJO, :NUMERO, :FECHA, :CONCEPTO, :DEBITO, :DB, :RTFTE, :RTIVA, :RTICA, :AB
                    DO
                    BEGIN
                    if (RTFTE IS NULL) then
                        RTFTE = 0;
                    if (RTIVA IS NULL) then
                        RTIVA = 0;
                    if (RTICA IS NULL) then
                        RTICA = 0;
                    if (DB = 'N') then
                        BEGIN
                        CREDITO = DEBITO;
                        DEBITO = 0;
                        RTFTE = RTFTE * -1;
                        RTIVA = RTIVA * -1;
                        RTICA = RTICA * -1;
                        END
                    ELSE
                        CREDITO = 0;
                    if ((RTFTE <> 0) or (RTIVA <> 0) or (RTICA <> 0)) then
                        SUSPEND;
                    END
            END
        ELSE
            BEGIN
            if (DESCRETE = 'SI') then
                BEGIN
                SELECT SUM(MVPR_MONTO) FROM movimiento_proveedor WHERE TERC_NIT = :NIT AND MVPR_FECHA >= :FECINI AND MVPR_FECHA <= :FECFIN AND MVPR_DEBITO = 'S' and MVPR_ABONO = 'N' AND (MVPR_RTFTE <> 0 OR MVPR_RTIVA <> 0 OR MVPR_RTICA <> 0) INTO :DEBITO;
                SELECT SUM(MVPR_MONTO) FROM movimiento_proveedor WHERE TERC_NIT = :NIT AND MVPR_FECHA >= :FECINI AND MVPR_FECHA <= :FECFIN AND MVPR_DEBITO = 'N' AND MVPR_TIPOREF <> 55 AND MVPR_ABONO = 'N' AND (MVPR_RTFTE <> 0 OR MVPR_RTIVA <> 0 OR MVPR_RTICA <> 0) INTO :CREDITO;
                SELECT sum(mvpr_rtfte), sum(mvpr_rtiva), sum(mvpr_rtica) FROM movimiento_proveedor WHERE TERC_NIT = :NIT AND MVPR_FECHA >= :FECINI AND MVPR_FECHA <= :FECFIN AND MVPR_ABONO = 'N' INTO :RTFTE, :RTIVA, :RTICA;
                END
            else
                BEGIN
                SELECT SUM(MVPR_MONTO) FROM movimiento_proveedor WHERE TERC_NIT = :NIT AND MVPR_FECHA >= :FECINI AND MVPR_FECHA <= :FECFIN AND MVPR_DEBITO = 'S' and MVPR_ABONO = 'S' AND (MVPR_RTFTE <> 0 OR MVPR_RTIVA <> 0 OR MVPR_RTICA <> 0) INTO :DEBITO;
                SELECT SUM(MVPR_MONTO) FROM movimiento_proveedor WHERE TERC_NIT = :NIT AND MVPR_FECHA >= :FECINI AND MVPR_FECHA <= :FECFIN AND MVPR_DEBITO = 'N' AND MVPR_TIPOREF <> 55 AND MVPR_ABONO = 'S' AND (MVPR_RTFTE <> 0 OR MVPR_RTIVA <> 0 OR MVPR_RTICA <> 0) INTO :CREDITO;
                SELECT sum(mvpr_rtfte), sum(mvpr_rtiva), sum(mvpr_rtica) FROM movimiento_proveedor WHERE TERC_NIT = :NIT AND MVPR_FECHA >= :FECINI AND MVPR_FECHA <= :FECFIN AND MVPR_ABONO = 'S' INTO :RTFTE, :RTIVA, :RTICA;
                END
            if (DEBITO IS NULL) then
                DEBITO = 0;
            if (CREDITO IS NULL) then
                CREDITO = 0;
            if (RTFTE IS NULL) then
                RTFTE = 0;
            if (RTIVA IS NULL) then
                RTIVA = 0;
            if (RTICA IS NULL) then
                RTICA = 0;
            if ((RTFTE <> 0) or (RTIVA <> 0) or (RTICA <> 0)) then
                SUSPEND;
            END
        END
    END
END
^

SET TERM ; ^


/* 20090212 confirmacion de ruteros con recibo de caja */

ALTER TABLE RUTERO
ADD RUTE_CONFIMADO T_BOOLEANO;
ALTER TABLE RUTERO_DETALLE
ADD RUTD_ENTREGADO T_BOOLEANO;
ALTER TABLE RUTERO_DETALLE
ADD RUTD_DEVID T_ID;
ALTER TABLE RUTERO_DETALLE
ADD RUTD_DEVNUMERO VARCHAR(10);
ALTER TABLE RUTERO_DETALLE
ADD RUTD_RECID T_ID;
ALTER TABLE RUTERO_DETALLE
ADD RUTD_RECIBO VARCHAR(10);
ALTER TABLE RUTERO_DETALLE
ADD RUTD_VEND INTEGER;
ALTER TABLE RUTERO_DETALLE
ADD RUTF_PREFRDC VARCHAR(4);
ALTER TABLE RUTERO_DETALLE
ADD RUTD_RECOK T_BOOLEANO;

SET TERM ^ ;

CREATE OR ALTER PROCEDURE RUTERO_FACTURA(
    PREF VARCHAR(4),
    NUMERO VARCHAR(6))
RETURNS (
    ID INTEGER,
    CLIENTE VARCHAR(20),
    SUCURSAL VARCHAR(10),
    NOMBRE VARCHAR(60),
    MONTO NUMERIC(18,2),
    CAJAS NUMERIC(18,4))
AS
begin
SELECT FACT_ID, TERC_NIT, FACT_SUCURSAL, FACT_NOMCLIENTE, FACT_TOTAL
    FROM FACTURAS F WHERE PREF_PRE = :pref AND FACT_NUMERO = :numero AND FACT_ANULADO = 'N' AND
    NOT EXISTS (SELECT RUTE_ID FROM RUTERO_DETALLE WHERE RUTD_FACTID = F.fact_id AND RUTD_ANULADO = 'N')
    INTO :ID, :CLIENTE, :SUCURSAL, :NOMBRE, :MONTO;
SELECT SUM(FADE_CAJAS) FROM FACTURAS_DETALLE WHERE FACT_ID = :ID INTO :CAJAS;
suspend;
end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER RECIBOS_CAJA_AI FOR RECIBOS_CAJA
ACTIVE AFTER INSERT POSITION 0
AS
BEGIN
if ((new.reca_id <> 0) and (new.reca_anulado = 'N'))Then
    BEGIN
    /* siexistia un recibo provisional borrelo */
    if ((new.reca_provid is not null) and (new.reca_provid <> 0)) then
        update recibo_provisional set rcpr_feccruce = new.reca_fecha, rcpr_idcruce = new.reca_id where rcpr_id = new.reca_provid;
    /* actualice el ok si esta en un rutero */
    UPDATE RUTERO_DETALLE SET RUTD_RECOK = 'S' WHERE RUTD_RECID = NEW.reca_id;

    INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
        VALUES (USER, 61, NEW.reca_id, 'I', NEW.pref_pre || NEW.reca_numero);
    END
END
^

SET TERM ; ^


/* 20090213 */
/* PESO DEL DOCUMENTO EN KILOS Y NO EN GRAMOS */

SET TERM ^ ;

CREATE OR ALTER PROCEDURE IMPR_FACTURA(
    ID INTEGER)
RETURNS (
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    VENCE DATE,
    DIASVENCE INTEGER,
    CONTCRED CHAR(17),
    NIT VARCHAR(20),
    NOMTERCERO VARCHAR(60),
    NOMCLIENTE VARCHAR(60),
    VENDEDOR INTEGER,
    NOMVENDEDOR VARCHAR(60),
    PUNTOVTA INTEGER,
    NOMPUNTOVTA VARCHAR(30),
    CODBODEGA VARCHAR(2),
    NOMBODEGA VARCHAR(30),
    AUTORIZACION VARCHAR(20),
    DESPACHO VARCHAR(255),
    TRANSPORTADOR VARCHAR(60),
    COTIZACION VARCHAR(30),
    PEDIDO VARCHAR(30),
    REMISION VARCHAR(30),
    PACIENTE VARCHAR(20),
    NOMPACIENTE VARCHAR(60),
    COMIPORC NUMERIC(9,2),
    COMIMONTO NUMERIC(18,2),
    SUBTOTAL NUMERIC(18,2),
    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),
    EXTRA NUMERIC(18,2),
    DTOFPORC NUMERIC(9,2),
    DTOFMONTO NUMERIC(18,2),
    FECHADTO DATE,
    TOTALFAC NUMERIC(18,2),
    TOTALPAGAR NUMERIC(18,2),
    OBS BLOB SUB_TYPE 1 SEGMENT SIZE 80,
    ITEM INTEGER,
    ARTICULO VARCHAR(15),
    CODBAR VARCHAR(15),
    ARTIDES VARCHAR(60),
    DESCORTA VARCHAR(30),
    CANT NUMERIC(18,4),
    LOTE VARCHAR(15),
    VLOTE DATE,
    UNIDAD VARCHAR(8),
    CAJAS NUMERIC(18,4),
    FACTOR NUMERIC(18,4),
    LISTAPR INTEGER,
    REFITEM VARCHAR(60),
    BODITEM VARCHAR(2),
    STAND VARCHAR(15),
    PRUNIT NUMERIC(18,2),
    DTOITPORC NUMERIC(9,2),
    DTOITMONTO NUMERIC(18,2),
    PRNETO NUMERIC(18,2),
    PRNETOSINIVA NUMERIC(18,2),
    DTOIT1 NUMERIC(9,2),
    DTOIT2 NUMERIC(9,2),
    DTOIT3 NUMERIC(9,2),
    IVAPORC NUMERIC(9,2),
    IVAITMONTO NUMERIC(18,2),
    CONSUMO NUMERIC(18,2),
    SUBTOTIT NUMERIC(18,2),
    TOTAL NUMERIC(18,2),
    CODIGOCL VARCHAR(20),
    ZONACOD VARCHAR(2),
    ZONANOM VARCHAR(60),
    DV CHAR(1),
    DIRECCION VARCHAR(60),
    CIUDAD VARCHAR(40),
    TELEFONO VARCHAR(40),
    CONTACTO VARCHAR(60),
    FAX VARCHAR(25),
    GRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    SUBGRUPO VARCHAR(3),
    NOMSUBG VARCHAR(30),
    MARCA VARCHAR(3),
    NOMMARCA VARCHAR(30),
    PESO NUMERIC(18,4),
    ANCHO NUMERIC(18,4),
    ALTO NUMERIC(18,4),
    LARGO NUMERIC(18,4),
    SUMA1 NUMERIC(18,2),
    SUMA2 NUMERIC(18,2),
    SUMA3 NUMERIC(18,2),
    IVA1 NUMERIC(18,2),
    IVA2 NUMERIC(18,2),
    IVA3 NUMERIC(18,2),
    SUMAEX NUMERIC(18,2),
    SUMAGR NUMERIC(18,2),
    TOTCONSUMO NUMERIC(18,2),
    DTOIT1M NUMERIC(18,2),
    DTOIT2M NUMERIC(18,2),
    DTOIT3M NUMERIC(18,2),
    TOTCAJAS NUMERIC(18,2),
    VEHICULO VARCHAR(8),
    RECIBIDO NUMERIC(18,2),
    CAMBIO NUMERIC(18,2),
    HORA TIME,
    FORMAPAGO1 VARCHAR(30),
    MONTOPAGO1 NUMERIC(18,2),
    FORMAPAGO2 VARCHAR(30),
    MONTOPAGO2 NUMERIC(18,2),
    FORMAPAGO3 VARCHAR(30),
    MONTOPAGO3 NUMERIC(18,2),
    PUNTOS INTEGER,
    PUNTOSACUM INTEGER,
    PUNTOSVENC INTEGER,
    FECPTOS DATE,
    OBSITEM BLOB SUB_TYPE 1 SEGMENT SIZE 80,
    SUCUR VARCHAR(10))
AS
DECLARE VARIABLE IMPTOS CHAR(1);
DECLARE VARIABLE TARIFA INTEGER;
declare variable DEVUELTO NUMERIC(18,2);
declare variable ORDENCOD CHAR(2);
declare variable IMPRDEV CHAR(2);
declare variable IMPR CHAR(1);
declare variable ITEMFP INTEGER;
declare variable FORMAP VARCHAR(30);
declare variable MONTOP NUMERIC(18,2);
declare variable ICOINC CHAR(2);
declare variable DTOITM1 NUMERIC(18,2);
declare variable DTOITM2 NUMERIC(18,2);
declare variable DTOITM3 NUMERIC(18,2);
declare variable DTOITE3 CHAR(2);
declare variable SUMDTOIT NUMERIC(18,2);
declare variable AUTORET VARCHAR(10);
declare variable FAUTORET DATE;
BEGIN
execute procedure lee_configuracion('FACTURACION', 'ARTICULOS', 'IMPOCONSUMO INCLUIDO EN EL PRECIO BASE DE VENTA ANTES DE IVA') returning_values (icoinc);
execute procedure lee_configuracion('FACTURACION', 'FACTURAS', 'COLUMNAS DE DESCUENTO POR ITEM ADICIONALES') returning_values (DTOITE3);
SELECT F.PREF_PRE, FACT_NUMERO, FACT_FECHA, FACT_VENCE, F.BODE_COD, BODE_NOM, F.TERC_NIT, FACT_NOMCLIENTE, F.VEND_COD, VEND_NOMBRE, F.PTVT_ID, PTVT_NOM,
    AUTO_NUMERO, FACT_DESPACHO, FACT_TRANSP, FACT_COTIZACI, FACT_PEDIDO, FACT_REMISION, FACT_COMIPORC, FACT_COMIMONTO, FACT_IVAINC, 
    FACT_DTOPOR, FACT_DTOMONTO, FACT_ADICIONAL, FACT_IVAMONTO, FACT_RTFTEPOR, FACT_RTFTEMONTO, FACT_RTIVAPOR, FACT_RTIVAMONTO, FACT_RTICAPOR, FACT_RTICAMONTO, FACT_EXTRA, FACT_DTOFPOR, FACT_DTOFMONTO, FACT_DTOFFECHA, FACT_TOTAL,
    TERC_DIR, TERC_CIU, TERC_TEL, TERC_CONTACTO, TERC_FAX, TERC_DV, FACT_DTOIT1, FACT_DTOIT2, FACT_DTOIT3,
    FACT_OBS, VEHI_COD, /*FACT_NROCOPIA,*/ FACT_RECIBIDO, FACT_SUCURSAL, FACT_DETCLI, FACT_DETCLINOM, TERC_NOM
    FROM FACTURAS F, BODEGA B, VENDEDORES V, PUNTO_VENTA P, TERCEROS T
    WHERE F.BODE_COD = B.BODE_COD AND F.VEND_COD = V.VEND_COD AND F.PTVT_ID = P.PTVT_ID AND F.TERC_NIT = T.TERC_NIT AND F.FACT_ID = :ID
    into :PREF, :NUMERO, :FECHA, :VENCE, :CODBODEGA, :NOMBODEGA, :NIT, :NOMTERCERO, :VENDEDOR, :NOMVENDEDOR, :PUNTOVTA, :NOMPUNTOVTA,
    :AUTORIZACION, :DESPACHO, :TRANSPORTADOR, :COTIZACION, :PEDIDO, :REMISION, :COMIPORC, :COMIMONTO, :IMPTOS,
    :DTOPORC, :DTOMONTO, :ADICIONAL, :IVAMONTO, :RTEFTEPORC, :RTEFTEMONTO, :RTEIVAPORC, :RTEIVAMONTO, :RTEICAPORC, :RTEICAMONTO, :EXTRA, :DTOFPORC, :DTOFMONTO, :FECHADTO, :TOTALFAC,
    :DIRECCION, :CIUDAD, :TELEFONO, :CONTACTO, :FAX, :DV, :dtoit1m, :dtoit2m, :dtoit3m,
    :OBS, :VEHICULO,/* :NROCOPIA,*/ :RECIBIDO, :SUCUR, :paciente, :nompaciente, :nomcliente;

/* ACUMULE LOS PUNTOS, SE HACE ACA POR SER POSTERIOR AL DETALLE */
EXECUTE PROCEDURE acumula_puntos_cliente (31, :id, :nit, :fecha) returning_values (:PUNTOS);
EXECUTE PROCEDURE consulta_puntos_cliente (:id, :nit, :fecha) returning_values (:puntos, :puntosacum, :puntosvenc, :fecptos);
if (DTOIT1M IS NULL) then
    DTOIT1M = 0;
if (DTOIT2M IS NULL) then
    DTOIT2M = 0;
if (DTOIT3M IS NULL) then
    DTOIT3M = 0;
SELECT CLIE_COD, C.ZONA_COD, ZONA_NOM
    FROM CLIENTES C, ZONAS Z
    WHERE TERC_NIT = :NIT AND C.ZONA_COD = Z.ZONA_COD
    INTO :CODIGOCL, :ZONACOD, :ZONANOM;
SELECT CLSU_DIR, CLSU_CIUDAD, CLSU_TEL FROM CLIENTE_SUCURSALES WHERE TERC_NIT = :NIT AND CLCU_COD = :SUCUR
    INTO :DIRECCION, :CIUDAD, :TELEFONO;
DIASVENCE = VENCE - FECHA;
if (DIASVENCE > 0) then
    CONTCRED = 'CREDITO ' || CAST(DIASVENCE AS VARCHAR(3)) || ' DIAS';
ELSE
    CONTCRED = 'CONTADO';
SUBTOTAL = TOTALFAC - EXTRA - IVAMONTO - ADICIONAL + DTOMONTO;
if (DTOITE3 = 'SI') then
    BEGIN
    SELECT SUM(FADE_DTOMONTO) FROM FACTURAS_DETALLE WHERE FACT_ID = :id INTO :sumdtoit;
    SUBTOTAL = SUBTOTAL + sumdtoit + dtoit1m + dtoit2m + dtoit3m;
    END
EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'FECHA AUTORETENEDOR NO DESCONTAR RETENCIONES DEL SALDO PERO SI CONTABILIZARLAS') returning_values (AUTORET);
if (AUTORET <> '') then
    FAUTORET = CAST(AUTORET AS DATE);
else
    FAUTORET = '9999/12/31';
if (FECHA > fautoret) then
    TOTALPAGAR = TOTALFAC - RTEIVAMONTO - RTEICAMONTO;
ELSE
    TOTALPAGAR = TOTALFAC - RTEFTEMONTO - RTEIVAMONTO - RTEICAMONTO;
if (RECIBIDO <> 0) then
    CAMBIO = RECIBIDO - totalpagar;
ELSE
    CAMBIO = 0;
SUMAEX = 0;
SUMA1 = 0;
SUMA2 = 0;
SUMA3 = 0;
IVA1 = 0;
IVA2 = 0;
IVA3 = 0;
TOTCONSUMO = 0;
MONTOPAGO1 = 0;
SELECT MAX(AUDI_HORA) FROM AUDITORIA WHERE TIDO_COD = 31 AND AUDI_IDDOC = :ID AND AUDI_OPER = 'I' INTO :HORA;
/* AHORA LAS FORMAS DE PAGO, BUSQUE EL ABONO DE HOY A LA FACTURA */
ITEMFP = 1;
MONTOPAGO1 = 0;
MONTOPAGO2 = 0;
MONTOPAGO3 = 0;
FOR SELECT FOPA_NOM, RCPA_MONTO FROM RECIBOS_CAJA_PAGO P, FORMAS_PAGO F, RECIBOS_CAJA R, RECIBOS_CAJA_DETALLE D
    WHERE R.RECA_ID = P.RECA_ID AND R.RECA_ID = D.RECA_ID AND P.FOPA_ID = F.FOPA_ID AND RECA_FECHA = :FECHA AND RCDE_TIPODOC = 31 AND RCDE_IDDOC = :ID
    INTO :formap, :MONTOP
    DO
    BEGIN
    if (ITEMFP = 1) then
        BEGIN
        FORMAPAGO1 = FORMAP;
        MONTOPAGO1 = MONTOP;
        END
    if (ITEMFP = 2) then
        BEGIN
        FORMAPAGO2 = FORMAP;
        MONTOPAGO2 = MONTOP;
        END
    if (ITEMFP = 3) then
        BEGIN
        FORMAPAGO3 = FORMAP;
        MONTOPAGO3 = MONTOP;
        END
    ITEMFP = ITEMFP + 1;
    END
EXECUTE PROCEDURE lee_configuracion ('FACTURACION','DOCUMENTOS','ORDENAR ITEMS POR CODIGO DE ARTICULO') returning_values (:ORDENCOD);
EXECUTE PROCEDURE lee_configuracion ('FACTURACION','POS', 'IMPRIMIR DEVOLUCIONES DE ARTICULOS NEGATIVOS') returning_values (:imprdev);
totcajas = 0;
if (ORDENCOD = 'SI') then
    BEGIN
    FOR SELECT FADE_ITEM, D.ARTI_COD, FADE_CODBAR, SUBSTR(FADE_DESC,1,60), ARTI_DESCORTA, FADE_CANT, FADE_UNIDAD, FADE_FACTOR, BODE_COD, FADE_LOTE, LIPR_COD, FADE_PRUNIT, FADE_DTOPORC, FADE_DTOMONTO, FADE_IVAPORC, FADE_IVAMONTO, FADE_CONSUMO, FADE_TOTAL, FADE_REFERENCIA,
        GRUP_COD, SUBG_COD, MARC_COD, ARTI_PESO, ARTI_ANCHO, ARTI_ALTO, ARTI_LARGO, TAIV_COD, FADE_DEVUELTO, FADE_OBS, FADE_DTO1, FADE_DTO2, FADE_DTO3, FADE_DTOM1, FADE_DTOM2, FADE_DTOM3, FADE_CAJAS
        FROM FACTURAS_DETALLE D, ARTICULO A
        WHERE D.ARTI_COD = A.ARTI_COD AND D.FACT_ID = :ID
        ORDER BY D.ARTI_COD
        INTO :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :DESCORTA, :CANT, :UNIDAD, :FACTOR, :BODITEM, :LOTE, :LISTAPR, :PRUNIT, :DTOITPORC, :DTOITMONTO, :IVAPORC, :IVAITMONTO, :CONSUMO, :TOTAL, :refitem,
        :GRUPO, :SUBGRUPO, :MARCA, :PESO, :ANCHO, :ALTO, :LARGO, :TARIFA, :devuelto, :obsitem, :dtoit1, :dtoit2, :dtoit3, :dtoitm1, :dtoitm2, :dtoitm3, :cajas
        DO
          BEGIN
          if (ARTICULO = CODBAR) then
            SELECT FIRST 1 COBA_COD FROM barras_articulo WHERE ARTI_COD = :articulo INTO :CODBAR;
          if (IMPRDEV <> 'SI') then
            BEGIN
            if ((CANT >= 0) AND (DEVUELTO = 0)) then
                IMPR = 'S';
            ELSE
                IMPR = 'N'; /* ES DEVOLUCION */
            END
          ELSE
            IMPR = 'S';
          if (IMPR = 'S') then
            BEGIN
            prneto = PRUNIT - DTOITMONTO - dtoitm1 - dtoitm2 - dtoitm3;
            if (IMPTOS = 'S') then
                if (cant <> 0) then
                    prnetosiniva = PRUNIT - DTOITMONTO - ((IVAITMONTO+CONSUMO) / CANT) - dtoitm1 - dtoitm2 - dtoitm3;
                else
                    prnetosiniva = PRUNIT - DTOITMONTO - dtoitm1 - dtoitm2 - dtoitm3;
            ELSE
                prnetosiniva = PRUNIT - DTOITMONTO - dtoit1m - dtoit2m - dtoit3m;
            if (ICOINC = 'SI') then
                SUBTOTIT = TOTAL - IVAITMONTO;
            else
                SUBTOTIT = TOTAL - IVAITMONTO - CONSUMO;
            TOTCONSUMO = TOTCONSUMO + CONSUMO;
            SELECT LOTE_VENCE FROM LOTES WHERE LOTE_NRO = :lote AND ARTI_COD = :ARTICULO AND BODE_COD = :boditem INTO :vlote;
            if ((REFITEM <> '.t') or (REFITEM IS NULL)) then
                BEGIN
                /* NO SUME LOS ENSAMBLES */
                if (IVAPORC = 0) then
                    SUMAEX = SUMAEX + TOTAL;
                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;
                END
            if (ANCHO IS NULL) then
                ANCHO = 0;
            if (ALTO IS NULL) then
                ALTO = 0;
            if (LARGO IS NULL) then
                LARGO = 0;
            if (PESO IS NULL) then
                PESO = 0;
            PESO = PESO * CANT * FACTOR / 1000;
            totcajas = totcajas + cajas;
            if (substr(ARTICULO,1,2) = '.t') then
                BEGIN
                REFITEM = '';
                TOTAL = 0;
                SUBTOTIT = 0;
                END
            SELECT STAND_COD FROM STANDS WHERE ARTI_COD = :ARTICULO AND STAND_BODEGA = :boditem INTO :stand;
            SUSPEND;
            END
          END
    END
ELSE
    BEGIN
    FOR SELECT FADE_ITEM, D.ARTI_COD, FADE_CODBAR, SUBSTR(FADE_DESC,1,60), ARTI_DESCORTA, FADE_CANT, FADE_UNIDAD, FADE_FACTOR, BODE_COD, FADE_LOTE, LIPR_COD, FADE_PRUNIT, FADE_DTOPORC, FADE_DTOMONTO, FADE_IVAPORC, FADE_IVAMONTO, FADE_CONSUMO, FADE_TOTAL, FADE_REFERENCIA,
        GRUP_COD, SUBG_COD, MARC_COD, ARTI_PESO, ARTI_ANCHO, ARTI_ALTO, ARTI_LARGO, TAIV_COD, FADE_DEVUELTO, FADE_OBS, FADE_DTO1, FADE_DTO2, FADE_DTO3, FADE_DTOM1, FADE_DTOM2, FADE_DTOM3, FADE_CAJAS
        FROM FACTURAS_DETALLE D, ARTICULO A
        WHERE D.ARTI_COD = A.ARTI_COD AND D.FACT_ID = :ID
        ORDER BY FADE_ITEM
        INTO :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :DESCORTA, :CANT, :UNIDAD, :FACTOR, :BODITEM, :LOTE, :LISTAPR, :PRUNIT, :DTOITPORC, :DTOITMONTO, :IVAPORC, :IVAITMONTO, :CONSUMO, :TOTAL, :refitem,
        :GRUPO, :SUBGRUPO, :MARCA, :PESO, :ANCHO, :ALTO, :LARGO, :TARIFA, :devuelto, :obsitem, :dtoit1, :dtoit2, :dtoit3, :dtoitm1, :dtoitm2, :dtoitm3, :cajas
        DO
          BEGIN
          if (IMPRDEV <> 'SI') then
            BEGIN
            if ((CANT >= 0) AND (DEVUELTO = 0)) then
                IMPR = 'S';
            ELSE
                IMPR = 'N'; /* ES DEVOLUCION */
            END
          ELSE
            IMPR = 'S';
          if (IMPR = 'S') then
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :GRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :MARCA INTO NOMMARCA;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :SUBGRUPO AND GRUP_COD = :GRUPO INTO :NOMSUBG;
            prneto = PRUNIT - DTOITMONTO - dtoitm1 - dtoitm2 - dtoitm3;
            if (IMPTOS = 'S') then
                if (cant <> 0) then
                    prnetosiniva = PRUNIT - DTOITMONTO - ((IVAITMONTO+CONSUMO) / CANT) - dtoit1m - dtoit2m - dtoit3m;
                else
                    prnetosiniva = PRUNIT - DTOITMONTO - dtoitm1 - dtoitm2 - dtoitm3;
            ELSE
                prnetosiniva = PRUNIT - DTOITMONTO - dtoitm1 - dtoitm2 - dtoitm3;
            if (ICOINC = 'SI') then
                SUBTOTIT = TOTAL - IVAITMONTO;
            else
                SUBTOTIT = TOTAL - IVAITMONTO - CONSUMO;
            TOTCONSUMO = TOTCONSUMO + CONSUMO;
            SELECT LOTE_VENCE FROM LOTES WHERE LOTE_NRO = :lote AND ARTI_COD = :ARTICULO AND BODE_COD = :boditem INTO :vlote;
            if ((REFITEM <> '.t') or (REFITEM IS NULL)) then
                BEGIN
                /* NO SUME LOS ENSAMBLES */
                if (IVAPORC = 0) then
                    SUMAEX = SUMAEX + TOTAL;
                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;
                END
            if (ANCHO IS NULL) then
                ANCHO = 0;
            if (ALTO IS NULL) then
                ALTO = 0;
            if (LARGO IS NULL) then
                LARGO = 0;
            if (PESO IS NULL) then
                PESO = 0;
            PESO = PESO * CANT * FACTOR / 1000;
            totcajas = totcajas + cajas;
            if (substr(ARTICULO,1,2) = '.t') then
                BEGIN
                REFITEM = '';
                TOTAL = 0;
                SUBTOTIT = 0;
                END
            SELECT STAND_COD FROM STANDS WHERE ARTI_COD = :ARTICULO AND STAND_BODEGA = :boditem INTO :stand;
            SUSPEND;
            END
          END
    END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER PROCEDURE IMPR_PEDIDO(
    ID INTEGER)
RETURNS (
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    VALIDEZ INTEGER,
    NIT VARCHAR(20),
    NOMTERCERO VARCHAR(60),
    VENDEDOR INTEGER,
    NOMVENDEDOR VARCHAR(60),
    PUNTOVTA INTEGER,
    NOMPUNTOVTA VARCHAR(30),
    COTIZACION VARCHAR(30),
    SUBTOTAL NUMERIC(18,2),
    DTOPORC NUMERIC(9,2),
    DTOMONTO NUMERIC(18,2),
    ADICIONAL NUMERIC(18,2),
    IVAMONTO NUMERIC(18,2),
    EXTRA NUMERIC(18,2),
    TOTALFAC NUMERIC(18,2),
    OBS BLOB SUB_TYPE 1 SEGMENT SIZE 80,
    ITEM INTEGER,
    ARTICULO VARCHAR(15),
    CODBAR VARCHAR(15),
    ARTIDES VARCHAR(60),
    BODEGA VARCHAR(2),
    CANT NUMERIC(18,4),
    UNIDAD VARCHAR(8),
    FACTOR NUMERIC(18,4),
    LISTAPR INTEGER,
    REFITEM VARCHAR(60),
    PRUNIT NUMERIC(18,2),
    DTOITPORC NUMERIC(9,2),
    DTOITMONTO NUMERIC(18,2),
    PRNETO NUMERIC(18,2),
    PRNETOSINIVA NUMERIC(18,2),
    DTOIT1 NUMERIC(9,2),
    DTOIT2 NUMERIC(9,2),
    DTOIT3 NUMERIC(9,2),
    IVAPORC NUMERIC(9,2),
    IVAITMONTO NUMERIC(18,2),
    CONSUMO NUMERIC(18,2),
    SUBTOTIT NUMERIC(18,2),
    TOTAL NUMERIC(18,2),
    CODIGOCL VARCHAR(20),
    ZONACOD VARCHAR(2),
    ZONANOM VARCHAR(60),
    DV CHAR(1),
    DIRECCION VARCHAR(60),
    CIUDAD VARCHAR(40),
    TELEFONO VARCHAR(40),
    CONTACTO VARCHAR(60),
    FAX VARCHAR(25),
    GRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    SUBGRUPO VARCHAR(3),
    NOMSUBG VARCHAR(30),
    MARCA VARCHAR(3),
    NOMMARCA VARCHAR(30),
    PESO NUMERIC(9,4),
    ANCHO NUMERIC(18,4),
    ALTO NUMERIC(18,4),
    LARGO NUMERIC(18,4),
    SUMA1 NUMERIC(18,2),
    SUMA2 NUMERIC(18,2),
    SUMA3 NUMERIC(18,2),
    IVA1 NUMERIC(18,2),
    IVA2 NUMERIC(18,2),
    IVA3 NUMERIC(18,2),
    SUMAEX NUMERIC(18,2),
    SUMAGR NUMERIC(18,2),
    DTOIT1M NUMERIC(18,2),
    DTOIT2M NUMERIC(18,2),
    DTOIT3M NUMERIC(18,2),
    OBSITEM BLOB SUB_TYPE 1 SEGMENT SIZE 80)
AS
DECLARE VARIABLE IMPTOS CHAR(1);
DECLARE VARIABLE TARIFA INTEGER;
declare variable ORDENCOD CHAR(2);
declare variable SUCUR VARCHAR(10);
declare variable ICOINC CHAR(2);
declare variable DTOITM1 NUMERIC(18,2);
declare variable DTOITM2 NUMERIC(18,2);
declare variable DTOITM3 NUMERIC(18,2);
BEGIN
execute procedure lee_configuracion('FACTURACION', 'ARTICULOS', 'IMPOCONSUMO INCLUIDO EN EL PRECIO BASE DE VENTA ANTES DE IVA') returning_values (icoinc);
SELECT F.PREF_PRE, PEDI_NUMERO, PEDI_FECHA, PEDI_VALIDEZ, F.TERC_NIT, PEDI_NOMTERC, F.VEND_COD, VEND_NOMBRE, F.PTVT_ID, PTVT_NOM, PEDI_COTIZACI,
    PEDI_IVAINC, PEDI_DTOPOR, PEDI_DTOMONTO, PEDI_ADICIONAL, PEDI_IVAMONTO, PEDI_EXTRA, PEDI_TOTAL,
    TERC_CONTACTO, TERC_FAX, TERC_DV, PEDI_OBS, PEDI_SUCURSAL, PEDI_DTOIT1, PEDI_DTOIT2, PEDI_DTOIT3
    FROM PEDIDOS F, VENDEDORES V, PUNTO_VENTA P, TERCEROS T
    WHERE F.VEND_COD = V.VEND_COD AND F.PTVT_ID = P.PTVT_ID AND F.TERC_NIT = T.TERC_NIT AND F.PEDI_ID = :ID
    into :PREF, :NUMERO, :FECHA, :VALIDEZ, :NIT, :NOMTERCERO, :VENDEDOR, :NOMVENDEDOR, :PUNTOVTA, :NOMPUNTOVTA, :COTIZACION,
    :IMPTOS, :DTOPORC, :DTOMONTO, :ADICIONAL, :IVAMONTO, :EXTRA, :TOTALFAC,
    :CONTACTO, :FAX, :DV, :OBS, :SUCUR, :dtoit1m, :dtoit2m, :dtoit3m;
SUBTOTAL = TOTALFAC - EXTRA - IVAMONTO - ADICIONAL + DTOMONTO;

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

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER PROCEDURE IMPR_COTIZACION(
    ID INTEGER)
RETURNS (
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    VALIDEZ INTEGER,
    NIT VARCHAR(20),
    NOMTERCERO VARCHAR(60),
    VENDEDOR INTEGER,
    NOMVENDEDOR VARCHAR(60),
    PUNTOVTA INTEGER,
    NOMPUNTOVTA VARCHAR(30),
    SUBTOTAL NUMERIC(18,2),
    DTOPORC NUMERIC(9,2),
    DTOMONTO NUMERIC(18,2),
    ADICIONAL NUMERIC(18,2),
    IVAMONTO NUMERIC(18,2),
    EXTRA NUMERIC(18,2),
    TOTALFAC NUMERIC(18,2),
    OBS BLOB SUB_TYPE 1 SEGMENT SIZE 80,
    ITEM INTEGER,
    ARTICULO VARCHAR(15),
    CODBAR VARCHAR(15),
    ARTIDES VARCHAR(60),
    CANT NUMERIC(18,4),
    UNIDAD VARCHAR(8),
    FACTOR NUMERIC(18,4),
    LISTAPR INTEGER,
    REFITEM VARCHAR(60),
    PRUNIT NUMERIC(18,2),
    DTOITPORC NUMERIC(9,2),
    DTOITMONTO NUMERIC(18,2),
    PRNETO NUMERIC(18,2),
    PRNETOSINIVA NUMERIC(18,2),
    IVAPORC NUMERIC(9,2),
    IVAITMONTO NUMERIC(18,2),
    CONSUMO NUMERIC(18,2),
    SUBTOTIT NUMERIC(18,2),
    TOTAL NUMERIC(18,2),
    CODIGOCL VARCHAR(20),
    ZONACOD VARCHAR(2),
    ZONANOM VARCHAR(60),
    DV CHAR(1),
    DIRECCION VARCHAR(60),
    CIUDAD VARCHAR(40),
    TELEFONO VARCHAR(40),
    CONTACTO VARCHAR(60),
    FAX VARCHAR(25),
    GRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    SUBGRUPO VARCHAR(3),
    NOMSUBG VARCHAR(30),
    MARCA VARCHAR(3),
    NOMMARCA VARCHAR(30),
    PESO NUMERIC(9,4),
    ANCHO NUMERIC(18,4),
    ALTO NUMERIC(18,4),
    LARGO NUMERIC(18,4),
    SUMA1 NUMERIC(18,2),
    SUMA2 NUMERIC(18,2),
    SUMA3 NUMERIC(18,2),
    IVA1 NUMERIC(18,2),
    IVA2 NUMERIC(18,2),
    IVA3 NUMERIC(18,2),
    SUMAEX NUMERIC(18,2),
    SUMAGR NUMERIC(18,2),
    OBSITEM BLOB SUB_TYPE 1 SEGMENT SIZE 80)
AS
DECLARE VARIABLE IMPTOS CHAR(1);
DECLARE VARIABLE TARIFA INTEGER;
declare variable ORDENCOD CHAR(2);
declare variable SUCUR VARCHAR(10);
declare variable ICOINC CHAR(2);
BEGIN
execute procedure lee_configuracion('FACTURACION', 'ARTICULOS', 'IMPOCONSUMO INCLUIDO EN EL PRECIO BASE DE VENTA ANTES DE IVA') returning_values (icoinc);
SELECT F.PREF_PRE, COTI_NUMERO, COTI_FECHA, COTI_VALIDEZ, F.TERC_NIT, COTI_NOMTERC, F.VEND_COD, VEND_NOMBRE, F.PTVT_ID, PTVT_NOM,
    COTI_IMPTOS, COTI_DTOPORC, COTI_DTOMONTO, COTI_ADICIONAL, COTI_IVAMONTO, COTI_EXTRA, COTI_TOTAL,
    TERC_CONTACTO, TERC_FAX, TERC_DV, COTI_OBS, COTI_SUCURSAL
    FROM COTIZACIONES F, VENDEDORES V, PUNTO_VENTA P, TERCEROS T
    WHERE F.VEND_COD = V.VEND_COD AND F.PTVT_ID = P.PTVT_ID AND F.TERC_NIT = T.TERC_NIT AND F.COTI_ID = :ID
    into :PREF, :NUMERO, :FECHA, :VALIDEZ, :NIT, :NOMTERCERO, :VENDEDOR, :NOMVENDEDOR, :PUNTOVTA, :NOMPUNTOVTA,
    :IMPTOS, :DTOPORC, :DTOMONTO, :ADICIONAL, :IVAMONTO, :EXTRA, :TOTALFAC,
    :CONTACTO, :FAX, :DV, :OBS, :SUCUR;
SUBTOTAL = TOTALFAC - EXTRA - IVAMONTO - ADICIONAL + DTOMONTO;

SELECT CLIE_COD, C.ZONA_COD, ZONA_NOM
    FROM CLIENTES C, ZONAS Z
    WHERE TERC_NIT = :NIT AND C.ZONA_COD = Z.ZONA_COD
    INTO :CODIGOCL, :ZONACOD, :ZONANOM;
SELECT CLSU_DIR, CLSU_CIUDAD, CLSU_TEL FROM CLIENTE_SUCURSALES WHERE TERC_NIT = :NIT AND CLCU_COD = :SUCUR
    INTO :DIRECCION, :CIUDAD, :TELEFONO;
    
SUMAEX = 0;
SUMA1 = 0;
SUMA2 = 0;
SUMA3 = 0;
IVA1 = 0;
IVA2 = 0;
IVA3 = 0;
ITEM = 0;
EXECUTE PROCEDURE lee_configuracion ('FACTURACION','DOCUMENTOS','ORDENAR ITEMS POR CODIGO DE ARTICULO') returning_values (:ORDENCOD);
if (ORDENCOD = 'SI') then
    BEGIN
    FOR SELECT D.ARTI_COD, CTDE_CODBAR, SUBSTR(CTDE_DESC,1,60), CTDE_CANT, CTDE_UNIDAD, LIPR_COD, CTDE_PRUNIT, CTDE_DTOPORC, CTDE_DTOMONTO, CTDE_IVAPORC, CTDE_IVAMONTO, CTDE_CONSUMO, CTDE_TOTAL, CTDE_REFERENCIA,
        GRUP_COD, SUBG_COD, MARC_COD, ARTI_PESO, ARTI_ANCHO, ARTI_ALTO, ARTI_LARGO, TAIV_COD, CTDE_OBS, CTDE_FACTOR
        FROM COTIZACIONES_DETALLE D, ARTICULO A
        WHERE D.ARTI_COD = A.ARTI_COD AND D.COTI_ID = :ID
        ORDER BY CTDE_CODBAR
        INTO :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :LISTAPR, :PRUNIT, :DTOITPORC, :DTOITMONTO, :IVAPORC, :IVAITMONTO, :CONSUMO, :TOTAL, :refitem,
        :GRUPO, :SUBGRUPO, :MARCA, :PESO, :ANCHO, :ALTO, :LARGO, :TARIFA, :obsitem, :FACTOR
        DO
        BEGIN
        if (ICOINC = 'SI') then
            SUBTOTIT = TOTAL - IVAITMONTO;
        else
            SUBTOTIT = TOTAL - IVAITMONTO - CONSUMO;
        if (ARTICULO = CODBAR) then
            SELECT FIRST 1 COBA_COD FROM barras_articulo WHERE ARTI_COD = :articulo INTO :CODBAR;
        SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :GRUPO INTO NOMGRUPO;
        SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :MARCA INTO NOMMARCA;
        SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :SUBGRUPO AND GRUP_COD = :GRUPO INTO :NOMSUBG;
        ITEM = ITEM + 1;
        PRNETO = PRUNIT - DTOITMONTO;
        if (PESO IS NULL) then
            PESO = 0;
        PESO = PESO * CANT * FACTOR / 1000;
        if (IMPTOS = 'S') then
            if (cant <> 0) then
                prnetosiniva = PRUNIT - DTOITMONTO - ((IVAITMONTO+CONSUMO) / CANT);
            else
                prnetosiniva = PRUNIT - DTOITMONTO;
        ELSE
            prnetosiniva = PRUNIT - DTOITMONTO;
        if (ivaporc = 0) then
            SUMAEX = SUMAEX + TOTAL;
        if (TARIFA = 1) then
            BEGIN
            SUMA1 = SUMA1 + TOTAL - IVAITMONTO;
            IVA1 = IVA1 + IVAITMONTO;
            END
        if (TARIFA = 2) then
            BEGIN
            SUMA2 = SUMA2 + TOTAL - IVAITMONTO;
            IVA2 = IVA2 + IVAITMONTO;
            END
        if (TARIFA = 3) then
            BEGIN
            SUMA3 = SUMA3 + TOTAL - IVAITMONTO;
            IVA3 = IVA3 + IVAITMONTO;
            END
        SUMAGR = SUMA1 + SUMA2 + SUMA3;
        if (IMPTOS = 'N') then
            TOTAL = TOTAL - IVAITMONTO;
        SUSPEND;
        END
    END
ELSE
    BEGIN
    FOR SELECT D.ARTI_COD, CTDE_CODBAR, SUBSTR(CTDE_DESC,1,60), CTDE_CANT, CTDE_UNIDAD, LIPR_COD, CTDE_PRUNIT, CTDE_DTOPORC, CTDE_DTOMONTO, CTDE_IVAPORC, CTDE_IVAMONTO, CTDE_CONSUMO, CTDE_TOTAL, CTDE_REFERENCIA,
        GRUP_COD, SUBG_COD, MARC_COD, ARTI_PESO, ARTI_ANCHO, ARTI_ALTO, ARTI_LARGO, TAIV_COD, CTDE_OBS, CTDE_FACTOR
        FROM COTIZACIONES_DETALLE D, ARTICULO A
        WHERE D.ARTI_COD = A.ARTI_COD AND D.COTI_ID = :ID
        ORDER BY CTDE_ITEM
        INTO :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :LISTAPR, :PRUNIT, :DTOITPORC, :DTOITMONTO, :IVAPORC, :IVAITMONTO, :CONSUMO, :TOTAL, :refitem,
        :GRUPO, :SUBGRUPO, :MARCA, :PESO, :ANCHO, :ALTO, :LARGO, :TARIFA, :obsitem, :FACTOR
        DO
        BEGIN
        SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :GRUPO INTO NOMGRUPO;
        SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :MARCA INTO NOMMARCA;
        SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :SUBGRUPO AND GRUP_COD = :GRUPO INTO :NOMSUBG;
        ITEM = ITEM + 1;
        if (ICOINC = 'SI') then
            SUBTOTIT = TOTAL - IVAITMONTO;
        else
            SUBTOTIT = TOTAL - IVAITMONTO - CONSUMO;
        PRNETO = PRUNIT - DTOITMONTO;
        if (PESO IS NULL) then
            PESO = 0;
        PESO = PESO * CANT * FACTOR / 1000;
        if (IMPTOS = 'S') then
            if (cant <> 0) then
                prnetosiniva = PRUNIT - DTOITMONTO - ((IVAITMONTO+CONSUMO) / CANT);
            else
                prnetosiniva = PRUNIT - DTOITMONTO;
        ELSE
            prnetosiniva = PRUNIT - DTOITMONTO;
        if (ivaporc = 0) then
            SUMAEX = SUMAEX + TOTAL;
        if (TARIFA = 1) then
            BEGIN
            SUMA1 = SUMA1 + TOTAL - IVAITMONTO;
            IVA1 = IVA1 + IVAITMONTO;
            END
        if (TARIFA = 2) then
            BEGIN
            SUMA2 = SUMA2 + TOTAL - IVAITMONTO;
            IVA2 = IVA2 + IVAITMONTO;
            END
        if (TARIFA = 3) then
            BEGIN
            SUMA3 = SUMA3 + TOTAL - IVAITMONTO;
            IVA3 = IVA3 + IVAITMONTO;
            END
        SUMAGR = SUMA1 + SUMA2 + SUMA3;
        if (IMPTOS = 'N') then
            TOTAL = TOTAL - IVAITMONTO;
        SUSPEND;
        END
    END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER PROCEDURE IMPR_DEVOLUCION(
    ID INTEGER)
RETURNS (
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    NIT VARCHAR(20),
    NOMTERCERO VARCHAR(60),
    VENDEDOR INTEGER,
    NOMVENDEDOR VARCHAR(60),
    PUNTOVTA INTEGER,
    NOMPUNTOVTA VARCHAR(30),
    CODBODEGA VARCHAR(2),
    NOMBODEGA VARCHAR(30),
    FACTURA VARCHAR(30),
    REMISION VARCHAR(10),
    COMIPORC NUMERIC(9,2),
    COMIMONTO NUMERIC(18,2),
    SUBTOTAL NUMERIC(18,2),
    DTOPORC NUMERIC(9,2),
    DTOMONTO NUMERIC(18,2),
    ADICIONAL NUMERIC(18,2),
    IVAMONTO NUMERIC(18,2),
    RTEFTEPORC NUMERIC(9,2),
    RTEFTEMONTO NUMERIC(18,2),
    RTEIVAPORC NUMERIC(9,2),
    RTEIVAMONTO NUMERIC(18,2),
    RTEICAPORC NUMERIC(9,2),
    RTEICAMONTO NUMERIC(18,2),
    EXTRA NUMERIC(18,2),
    TOTALFAC NUMERIC(18,2),
    TOTALPAGAR NUMERIC(18,2),
    OBS BLOB SUB_TYPE 1 SEGMENT SIZE 80,
    ITEM INTEGER,
    ARTICULO VARCHAR(15),
    CODBAR VARCHAR(15),
    ARTIDES VARCHAR(60),
    CANT NUMERIC(18,4),
    LOTE VARCHAR(15),
    UNIDAD VARCHAR(8),
    FACTOR NUMERIC(18,4),
    REFITEM VARCHAR(60),
    BODITEM VARCHAR(2),
    PRUNIT NUMERIC(18,2),
    DTOITPORC NUMERIC(9,2),
    DTOITMONTO NUMERIC(18,2),
    PRNETO NUMERIC(18,2),
    PRNETOSINIVA NUMERIC(18,2),
    IVAPORC NUMERIC(9,2),
    IVAITMONTO NUMERIC(18,2),
    CONSUMO NUMERIC(18,2),
    SUBTOTIT NUMERIC(18,2),
    TOTAL NUMERIC(18,2),
    CODIGOCL VARCHAR(20),
    ZONACOD VARCHAR(2),
    ZONANOM VARCHAR(60),
    DV CHAR(1),
    DIRECCION VARCHAR(60),
    CIUDAD VARCHAR(40),
    TELEFONO VARCHAR(40),
    CONTACTO VARCHAR(60),
    FAX VARCHAR(25),
    GRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    SUBGRUPO VARCHAR(3),
    NOMSUBG VARCHAR(30),
    MARCA VARCHAR(3),
    NOMMARCA VARCHAR(30),
    PESO NUMERIC(9,4),
    ANCHO NUMERIC(18,4),
    ALTO NUMERIC(18,4),
    LARGO NUMERIC(18,4),
    SUMA1 NUMERIC(18,2),
    SUMA2 NUMERIC(18,2),
    SUMA3 NUMERIC(18,2),
    IVA1 NUMERIC(18,2),
    IVA2 NUMERIC(18,2),
    IVA3 NUMERIC(18,2),
    TOTCONSUMO NUMERIC(18,2),
    SUMAEX NUMERIC(18,2),
    SUMAGR NUMERIC(18,2),
    OBSITEM BLOB SUB_TYPE 1 SEGMENT SIZE 80)
AS
DECLARE VARIABLE IMPTOS CHAR(1);
DECLARE VARIABLE TARIFA INTEGER;
declare variable ORDENCOD CHAR(2);
declare variable SUCUR VARCHAR(10);
declare variable PUNTOS NUMERIC(18,4);
declare variable ICOINC CHAR(2);
BEGIN
execute procedure lee_configuracion('FACTURACION', 'ARTICULOS', 'IMPOCONSUMO INCLUIDO EN EL PRECIO BASE DE VENTA ANTES DE IVA') returning_values (icoinc);
SELECT F.PREF_PRE, DEVT_NUMERO, DEVT_FECHA, F.BODE_COD, BODE_NOM, F.TERC_NIT, DEVT_NOMTERC, F.VEND_COD, VEND_NOMBRE, F.PTVT_ID, PTVT_NOM,
    DEVT_FACTURA, DEVT_COMIPORC, DEVT_COMIMONTO, DEVT_IVAINC,
    DEVT_DTOPOR, DEVT_DTOMONTO, DEVT_ADICIONAL, DEVT_IVAMONTO, DEVT_RTFTEPORC, DEVT_RTFTEMONTO, DEVT_RTIVAPORC, DEVT_RTIVAMONTO, DEVT_RTICAPORC, DEVT_RTICAMONTO, DEVT_EXTRA, DEVT_TOTAL,
    TERC_CONTACTO, TERC_FAX, TERC_DV, DEVT_OBS, DEVT_SUCURSAL, DEVT_REMISION
    FROM DEVOLUCIONES_VENTAS F, BODEGA B, VENDEDORES V, PUNTO_VENTA P, TERCEROS T
    WHERE F.BODE_COD = B.BODE_COD AND F.VEND_COD = V.VEND_COD AND F.PTVT_ID = P.PTVT_ID AND F.TERC_NIT = T.TERC_NIT AND F.DEVT_ID = :ID
    into :PREF, :NUMERO, :FECHA, :CODBODEGA, :NOMBODEGA, :NIT, :NOMTERCERO, :VENDEDOR, :NOMVENDEDOR, :PUNTOVTA, :NOMPUNTOVTA,
    :FACTURA, :COMIPORC, :COMIMONTO, :IMPTOS,
    :DTOPORC, :DTOMONTO, :ADICIONAL, :IVAMONTO, :RTEFTEPORC, :RTEFTEMONTO, :RTEIVAPORC, :RTEIVAMONTO, :RTEICAPORC, :RTEICAMONTO, :EXTRA, :TOTALFAC,
    :CONTACTO, :FAX, :DV, :OBS, :SUCUR, :REMISION;
SUBTOTAL = TOTALFAC - EXTRA - IVAMONTO - ADICIONAL + DTOMONTO;
TOTALPAGAR = TOTALFAC - RTEFTEMONTO - RTEIVAMONTO - RTEICAMONTO;

EXECUTE PROCEDURE acumula_puntos_cliente (33, :id, :nit, :fecha) returning_values (:PUNTOS);
SELECT CLIE_COD, C.ZONA_COD, ZONA_NOM
    FROM CLIENTES C, ZONAS Z
    WHERE TERC_NIT = :NIT AND C.ZONA_COD = Z.ZONA_COD
    INTO :CODIGOCL, :ZONACOD, :ZONANOM;
SELECT CLSU_DIR, CLSU_CIUDAD, CLSU_TEL FROM CLIENTE_SUCURSALES WHERE TERC_NIT = :NIT AND CLCU_COD = :SUCUR
    INTO :DIRECCION, :CIUDAD, :TELEFONO;
    
SUMAEX = 0;
SUMA1 = 0;
SUMA2 = 0;
SUMA3 = 0;
IVA1 = 0;
IVA2 = 0;
IVA3 = 0;
TOTCONSUMO = 0;
ITEM = 0;
EXECUTE PROCEDURE lee_configuracion ('FACTURACION','DOCUMENTOS','ORDENAR ITEMS POR CODIGO DE ARTICULO') returning_values (:ORDENCOD);
if (ORDENCOD = 'SI') then
    BEGIN
    FOR SELECT D.ARTI_COD, DVDE_CODBAR, SUBSTR(DVDE_DESC,1,60), DVDE_CANT, DVDE_UNIDAD, BODE_COD, DVDE_LOTE, DVDE_PRUNIT, DVDE_DTOPORC, DVDE_DTOMONTO, DVDE_IVAPORC, DVDE_IVAMONTO, DVDE_CONSUMO, DVDE_TOTAL, DVDE_REFERENCIA,
        GRUP_COD, SUBG_COD, MARC_COD, ARTI_PESO, ARTI_ANCHO, ARTI_ALTO, ARTI_LARGO, TAIV_COD, DVDE_OBS, DVDE_FACTOR
        FROM DEVOLUCIONES_VENTAS_DETALLE D, ARTICULO A
        WHERE D.ARTI_COD = A.ARTI_COD AND D.DEVT_ID = :ID
        ORDER BY DVDE_CODBAR
        INTO :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :BODITEM, :LOTE, :PRUNIT, :DTOITPORC, :DTOITMONTO, :IVAPORC, :IVAITMONTO, :CONSUMO, :TOTAL, :REFITEM,
        :GRUPO, :SUBGRUPO, :MARCA, :PESO, :ANCHO, :ALTO, :LARGO, :TARIFA, :obsitem, :FACTOR
        DO
        BEGIN
        if (ARTICULO = CODBAR) then
            SELECT FIRST 1 COBA_COD FROM barras_articulo WHERE ARTI_COD = :articulo INTO :CODBAR;
        ITEM = ITEM + 1;
        if (ICOINC = 'SI') then
            SUBTOTIT = TOTAL - IVAITMONTO;
        else
            SUBTOTIT = TOTAL - IVAITMONTO - CONSUMO;
        PRNETO = PRUNIT - DTOITMONTO;
        if (PESO IS NULL) then
            PESO = 0;
        PESO = PESO * CANT * FACTOR / 1000;
        if (IMPTOS = 'S') then
            if (cant <> 0) then
                prnetosiniva = PRUNIT - DTOITMONTO - ((IVAITMONTO+CONSUMO) / CANT);
            else
                prnetosiniva = PRUNIT - DTOITMONTO;
        ELSE
            prnetosiniva = PRUNIT - DTOITMONTO;
        TOTCONSUMO = TOTCONSUMO + CONSUMO;
        if ((REFITEM <> '.t') or (REFITEM IS NULL)) then
            BEGIN
            /* NO SUME LOS ENSAMBLES */
            if (IVAPORC = 0) then
                SUMAEX = SUMAEX + TOTAL;
            if (TARIFA = 1) then
                BEGIN
                SUMA1 = SUMA1 + TOTAL - IVAITMONTO;
                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;
            END
        if (substr(ARTICULO,1,2) = '.t') then
            BEGIN
            REFITEM = '';
            TOTAL = 0;
            END
        SUSPEND;
        END
    END
ELSE
    BEGIN
    FOR SELECT D.ARTI_COD, DVDE_CODBAR, SUBSTR(DVDE_DESC,1,60), DVDE_CANT, DVDE_UNIDAD, BODE_COD, DVDE_LOTE, DVDE_PRUNIT, DVDE_DTOPORC, DVDE_DTOMONTO, DVDE_IVAPORC, DVDE_IVAMONTO, DVDE_CONSUMO, DVDE_TOTAL, DVDE_REFERENCIA,
        GRUP_COD, SUBG_COD, MARC_COD, ARTI_PESO, ARTI_ANCHO, ARTI_ALTO, ARTI_LARGO, TAIV_COD, DVDE_OBS, DVDE_FACTOR
        FROM DEVOLUCIONES_VENTAS_DETALLE D, ARTICULO A
        WHERE D.ARTI_COD = A.ARTI_COD AND D.DEVT_ID = :ID
        ORDER BY DVDE_ITEM
        INTO :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :BODITEM, :LOTE, :PRUNIT, :DTOITPORC, :DTOITMONTO, :IVAPORC, :IVAITMONTO, :CONSUMO, :TOTAL, :REFITEM,
        :GRUPO, :SUBGRUPO, :MARCA, :PESO, :ANCHO, :ALTO, :LARGO, :TARIFA, :obsitem, :FACTOR
        DO
        BEGIN
        if (ARTICULO = CODBAR) then
            SELECT FIRST 1 COBA_COD FROM barras_articulo WHERE ARTI_COD = :articulo INTO :CODBAR;
        SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :GRUPO INTO NOMGRUPO;
        SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :MARCA INTO NOMMARCA;
        SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :SUBGRUPO AND GRUP_COD = :GRUPO INTO :NOMSUBG;
        ITEM = ITEM + 1;
        if (ICOINC = 'SI') then
            SUBTOTIT = TOTAL - IVAITMONTO;
        else
            SUBTOTIT = TOTAL - IVAITMONTO - CONSUMO;
        PRNETO = PRUNIT - DTOITMONTO;
        if (PESO IS NULL) then
            PESO = 0;
        PESO = PESO * CANT * FACTOR / 1000;
        if (IMPTOS = 'S') then
            if (cant <> 0) then
                prnetosiniva = PRUNIT - DTOITMONTO - ((IVAITMONTO+CONSUMO) / CANT);
            else
                prnetosiniva = PRUNIT - DTOITMONTO;
        ELSE
            prnetosiniva = PRUNIT - DTOITMONTO;
        TOTCONSUMO = TOTCONSUMO + CONSUMO;
        if ((REFITEM <> '.t') or (REFITEM IS NULL)) then
            BEGIN
            /* NO SUME LOS ENSAMBLES */
            if (IVAPORC = 0) then
                SUMAEX = SUMAEX + TOTAL;
            if (TARIFA = 1) then
                BEGIN
                SUMA1 = SUMA1 + TOTAL - IVAITMONTO;
                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;
            END
        if (substr(ARTICULO,1,2) = '.t') then
            BEGIN
            REFITEM = '';
            TOTAL = 0;
            END
        SUSPEND;
        END
    END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER PROCEDURE IMPR_REMISION(
    ID INTEGER)
RETURNS (
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    NIT VARCHAR(20),
    NOMTERCERO VARCHAR(60),
    VENDEDOR INTEGER,
    NOMVENDEDOR VARCHAR(60),
    PUNTOVTA INTEGER,
    NOMPUNTOVTA VARCHAR(30),
    CODBODEGA VARCHAR(2),
    NOMBODEGA VARCHAR(30),
    COTIZACION VARCHAR(30),
    PEDIDO VARCHAR(30),
    FACTURA VARCHAR(30),
    SUBTOTAL NUMERIC(18,2),
    IVAMONTO NUMERIC(18,2),
    TOTALFAC NUMERIC(18,2),
    DESPACHO VARCHAR(255),
    TRANSPORTADOR VARCHAR(60),
    OBS BLOB SUB_TYPE 1 SEGMENT SIZE 80,
    ITEM INTEGER,
    ARTICULO VARCHAR(15),
    CODBAR VARCHAR(15),
    ARTIDES VARCHAR(60),
    CANT NUMERIC(18,4),
    LOTE VARCHAR(15),
    VLOTE DATE,
    UNIDAD VARCHAR(8),
    FACTOR NUMERIC(18,4),
    CAJAS NUMERIC(18,4),
    DEVUELTO NUMERIC(18,4),
    CONSUMIDO NUMERIC(18,4),
    LISTAPR INTEGER,
    REFITEM VARCHAR(60),
    BODITEM VARCHAR(2),
    STAND VARCHAR(15),
    PRUNIT NUMERIC(18,2),
    DTOITPORC NUMERIC(9,2),
    DTOITMONTO NUMERIC(18,2),
    PRNETOSINIVA NUMERIC(18,2),
    PRNETO NUMERIC(18,2),
    IVAPORC NUMERIC(9,2),
    IVAITMONTO NUMERIC(18,2),
    CONSUMO NUMERIC(18,2),
    SUBTOTIT NUMERIC(18,2),
    TOTAL NUMERIC(18,2),
    CODIGOCL VARCHAR(20),
    ZONACOD VARCHAR(2),
    ZONANOM VARCHAR(60),
    DV CHAR(1),
    DIRECCION VARCHAR(60),
    CIUDAD VARCHAR(40),
    TELEFONO VARCHAR(40),
    CONTACTO VARCHAR(60),
    FAX VARCHAR(25),
    GRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    SUBGRUPO VARCHAR(3),
    NOMSUBG VARCHAR(30),
    MARCA VARCHAR(3),
    NOMMARCA VARCHAR(30),
    PESO NUMERIC(9,4),
    ANCHO NUMERIC(18,4),
    ALTO NUMERIC(18,4),
    LARGO NUMERIC(18,4),
    SUMA1 NUMERIC(18,2),
    SUMA2 NUMERIC(18,2),
    SUMA3 NUMERIC(18,2),
    IVA1 NUMERIC(18,2),
    IVA2 NUMERIC(18,2),
    IVA3 NUMERIC(18,2),
    SUMAEX NUMERIC(18,2),
    SUMAGR NUMERIC(18,2),
    TOTCAJAS NUMERIC(18,2),
    OBSITEM BLOB SUB_TYPE 1 SEGMENT SIZE 80)
AS
DECLARE VARIABLE IMPTOS CHAR(1);
DECLARE VARIABLE TARIFA INTEGER;
declare variable ORDENCOD CHAR(2);
declare variable SUCUR VARCHAR(10);
declare variable ICOINC CHAR(2);
BEGIN
execute procedure lee_configuracion('FACTURACION', 'ARTICULOS', 'IMPOCONSUMO INCLUIDO EN EL PRECIO BASE DE VENTA ANTES DE IVA') returning_values (icoinc);
EXECUTE PROCEDURE lee_configuracion ('FACTURACION','DOCUMENTOS','ORDENAR ITEMS POR CODIGO DE ARTICULO') returning_values (:ORDENCOD);
SELECT F.PREF_PRE, REVT_NUMERO, REVT_FECHA, F.BODE_COD, BODE_NOM, F.TERC_NIT, REVT_NOMTERC, F.VEND_COD, VEND_NOMBRE, F.PTVT_ID, PTVT_NOM,
    REVT_COTIZACI, REVT_PEDIDO, REVT_FACTURA, REVT_IVAINC,
    REVT_IVAMONTO, REVT_TOTAL, REVT_DESPACHO, REVT_TRANSP,
    TERC_CONTACTO, TERC_FAX, TERC_DV, REVT_OBS, REVT_SUCURSAL
    FROM REMISIONES_VENTA F, BODEGA B, VENDEDORES V, PUNTO_VENTA P, TERCEROS T
    WHERE F.BODE_COD = B.BODE_COD AND F.VEND_COD = V.VEND_COD AND F.PTVT_ID = P.PTVT_ID AND F.TERC_NIT = T.TERC_NIT AND F.REVT_ID = :ID
    into :PREF, :NUMERO, :FECHA, :CODBODEGA, :NOMBODEGA, :NIT, :NOMTERCERO, :VENDEDOR, :NOMVENDEDOR, :PUNTOVTA, :NOMPUNTOVTA,
    :COTIZACION, :PEDIDO, :FACTURA, :IMPTOS,
    :IVAMONTO, :TOTALFAC, :DESPACHO, :transportador, 
    :CONTACTO, :FAX, :DV, :OBS, :SUCUR;
SUBTOTAL = TOTALFAC - IVAMONTO;

SELECT CLIE_COD, C.ZONA_COD, ZONA_NOM
    FROM CLIENTES C, ZONAS Z
    WHERE TERC_NIT = :NIT AND C.ZONA_COD = Z.ZONA_COD
    INTO :CODIGOCL, :ZONACOD, :ZONANOM;
SELECT CLSU_DIR, CLSU_CIUDAD, CLSU_TEL FROM CLIENTE_SUCURSALES WHERE TERC_NIT = :NIT AND CLCU_COD = :SUCUR
    INTO :DIRECCION, :CIUDAD, :TELEFONO;
    
SUMAEX = 0;
SUMA1 = 0;
SUMA2 = 0;
SUMA3 = 0;
IVA1 = 0;
IVA2 = 0;
IVA3 = 0;
ITEM = 0;
totcajas = 0;
if (ORDENCOD = 'SI') then
    BEGIN
    FOR SELECT D.ARTI_COD, RVDE_CODBAR, SUBSTR(RVDE_DESC,1,60), RVDE_CANT, RVDE_UNIDAD, BODE_COD, RVDE_LOTE, LIPR_COD, RVDE_PRUNIT, RVDE_DTOPORC, RVDE_DTOMONTO, RVDE_IVAPORC, RVDE_IVAMONTO, RVDE_CONSUMO, RVDE_TOTAL, RVDE_REFERENCIA,
        GRUP_COD, SUBG_COD, MARC_COD, ARTI_PESO, ARTI_ANCHO, ARTI_ALTO, ARTI_LARGO, TAIV_COD, RVDE_DEVUELTO, RVDE_OBS, RVDE_CAJAS, RVDE_FACTOR
        FROM REMISIONES_VENTA_DETALLE D, ARTICULO A
        WHERE D.ARTI_COD = A.ARTI_COD AND D.REVT_ID = :ID
        ORDER BY RVDE_CODBAR
        INTO :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :BODITEM, :LOTE, :LISTAPR, :PRUNIT, :DTOITPORC, :DTOITMONTO, :IVAPORC, :IVAITMONTO, :CONSUMO, :TOTAL, :refitem,
            :GRUPO, :SUBGRUPO, :MARCA, :PESO, :ANCHO, :ALTO, :LARGO, :TARIFA, :DEVUELTO, :obsitem, :CAJAS, :FACTOR
        DO
        BEGIN
        if (ARTICULO = CODBAR) then
            SELECT FIRST 1 COBA_COD FROM barras_articulo WHERE ARTI_COD = :articulo INTO :CODBAR;
        SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :GRUPO INTO NOMGRUPO;
        SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :MARCA INTO NOMMARCA;
        SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :SUBGRUPO AND GRUP_COD = :GRUPO INTO :NOMSUBG;
        SELECT LOTE_VENCE FROM LOTES WHERE LOTE_NRO = :lote AND ARTI_COD = :ARTICULO AND BODE_COD = :boditem INTO :vlote;
        if (ICOINC = 'SI') then
            SUBTOTIT = TOTAL - IVAITMONTO;
        else
            SUBTOTIT = TOTAL - IVAITMONTO - CONSUMO;
        CONSUMIDO = cant * factor - devuelto;
        ITEM = ITEM + 1;
        PRNETO = PRUNIT - DTOITMONTO;
        if (PESO IS NULL) then
            PESO = 0;
        PESO = PESO * CANT * FACTOR / 1000;
        if (IMPTOS = 'S') then
            if (cant <> 0) then
                prnetosiniva = PRUNIT - DTOITMONTO - ((IVAITMONTO+CONSUMO) / CANT);
            else
                prnetosiniva = PRUNIT - DTOITMONTO;
        ELSE
            prnetosiniva = PRUNIT - DTOITMONTO;
        if (IVAPORC = 0) then
            SUMAEX = SUMAEX + TOTAL;
        if (TARIFA = 1) then
            BEGIN
            SUMA1 = SUMA1 + TOTAL - IVAITMONTO;
            IVA1 = IVA1 + IVAITMONTO;
            END
        if (TARIFA = 2) then
            BEGIN
            SUMA2 = SUMA2 + TOTAL - IVAITMONTO;
            IVA2 = IVA2 + IVAITMONTO;
            END
        if (TARIFA = 3) then
            BEGIN
            SUMA3 = SUMA3 + TOTAL - IVAITMONTO;
            IVA3 = IVA3 + IVAITMONTO;
            END
        SUMAGR = SUMA1 + SUMA2 + SUMA3;

        totcajas = totcajas + cajas;
        SELECT STAND_COD FROM STANDS WHERE ARTI_COD = :ARTICULO AND STAND_BODEGA = :boditem INTO :stand;
        SUSPEND;
        END
    END
ELSE
    BEGIN
    FOR SELECT RVDE_ITEM, D.ARTI_COD, RVDE_CODBAR, SUBSTR(RVDE_DESC,1,60), RVDE_CANT, RVDE_UNIDAD, BODE_COD, RVDE_LOTE, LIPR_COD, RVDE_PRUNIT, RVDE_DTOPORC, RVDE_DTOMONTO, RVDE_IVAPORC, RVDE_IVAMONTO, RVDE_CONSUMO, RVDE_TOTAL, RVDE_REFERENCIA,
        GRUP_COD, SUBG_COD, MARC_COD, ARTI_PESO, ARTI_ANCHO, ARTI_ALTO, ARTI_LARGO, TAIV_COD, RVDE_DEVUELTO, RVDE_OBS, RVDE_CAJAS, RVDE_FACTOR
        FROM REMISIONES_VENTA_DETALLE D, ARTICULO A
        WHERE D.ARTI_COD = A.ARTI_COD AND D.REVT_ID = :ID
        ORDER BY RVDE_ITEM
        INTO :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :BODITEM, :LOTE, :LISTAPR, :PRUNIT, :DTOITPORC, :DTOITMONTO, :IVAPORC, :IVAITMONTO, :CONSUMO, :TOTAL, :refitem,
            :GRUPO, :SUBGRUPO, :MARCA, :PESO, :ANCHO, :ALTO, :LARGO, :TARIFA, :DEVUELTO, :obsitem, :CAJAS, :FACTOR
        DO
        BEGIN
        SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :GRUPO INTO NOMGRUPO;
        SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :MARCA INTO NOMMARCA;
        SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :SUBGRUPO AND GRUP_COD = :GRUPO INTO :NOMSUBG;
        SELECT LOTE_VENCE FROM LOTES WHERE LOTE_NRO = :lote AND ARTI_COD = :ARTICULO AND BODE_COD = :boditem INTO :vlote;
        if (ICOINC = 'SI') then
            SUBTOTIT = TOTAL - IVAITMONTO;
        else
            SUBTOTIT = TOTAL - IVAITMONTO - CONSUMO;
        CONSUMIDO = cant * factor - devuelto;
        ITEM = ITEM + 1;
        PRNETO = PRUNIT - DTOITMONTO;
        if (PESO IS NULL) then
            PESO = 0;
        PESO = PESO * CANT * FACTOR / 1000;
        if (IMPTOS = 'S') then
            if (cant <> 0) then
                prnetosiniva = PRUNIT - DTOITMONTO - ((IVAITMONTO+CONSUMO) / CANT);
            else
                prnetosiniva = PRUNIT - DTOITMONTO;
        ELSE
            prnetosiniva = PRUNIT - DTOITMONTO;
        if (IVAPORC = 0) then
            SUMAEX = SUMAEX + TOTAL;
        if (TARIFA = 1) then
            BEGIN
            SUMA1 = SUMA1 + TOTAL - IVAITMONTO;
            IVA1 = IVA1 + IVAITMONTO;
            END
        if (TARIFA = 2) then
            BEGIN
            SUMA2 = SUMA2 + TOTAL - IVAITMONTO;
            IVA2 = IVA2 + IVAITMONTO;
            END
        if (TARIFA = 3) then
            BEGIN
            SUMA3 = SUMA3 + TOTAL - IVAITMONTO;
            IVA3 = IVA3 + IVAITMONTO;
            END
        SUMAGR = SUMA1 + SUMA2 + SUMA3;
        totcajas = totcajas + cajas;
        SELECT STAND_COD FROM STANDS WHERE ARTI_COD = :ARTICULO AND STAND_BODEGA = :boditem INTO :stand;
        SUSPEND;
        END
    END
END
^

SET TERM ; ^

/* DISCRIMINACION DE UNIDADES ALTERNATIVAS */

SET TERM ^ ;

CREATE OR ALTER PROCEDURE REP_VENTAS_ARTICULO(
    TIPO INTEGER,
    ARTINI VARCHAR(20),
    ARTFIN VARCHAR(20),
    DETALLE CHAR(1),
    FECINI DATE,
    FECFIN DATE,
    GRPINI VARCHAR(3),
    GRPFIN VARCHAR(3),
    PTOINI INTEGER,
    PTOFIN INTEGER,
    ORDEN CHAR(1),
    AGRUPA CHAR(1),
    CEROS CHAR(1),
    UNIDADES CHAR(1),
    SUBEMPRESA INTEGER)
RETURNS (
    ARTICULO VARCHAR(15),
    DESCRIPCION VARCHAR(60),
    CODGRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    CODSUBG VARCHAR(3),
    NOMSUBG VARCHAR(30),
    CODMARC VARCHAR(3),
    NOMMARC VARCHAR(30),
    UNIDAD VARCHAR(8),
    CANTIDAD NUMERIC(18,4),
    BASE NUMERIC(18,2),
    IVA NUMERIC(18,2),
    CONSUMO NUMERIC(18,2),
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    DTO NUMERIC(9,2),
    TRANSP VARCHAR(60),
    ALTERNATIVAS NUMERIC(18,4),
    NOMTIPO VARCHAR(50))
AS
DECLARE VARIABLE CODINI VARCHAR(20);
DECLARE VARIABLE CODFIN VARCHAR(20);
DECLARE VARIABLE DESINI VARCHAR(20);
DECLARE VARIABLE DESFIN VARCHAR(20);
declare variable MARINI VARCHAR(3);
declare variable MARFIN VARCHAR(3);
declare variable NUMROWS INTEGER;
declare variable CANTAUX NUMERIC(18,4);
BEGIN
if (ORDEN = 'C') then
    BEGIN
    CODINI = ARTINI;
    CODFIN = ARTFIN;
    DESINI = '';
    DESFIN = 'zz';
    END
ELSE
    BEGIN
    DESINI = ARTINI;
    DESFIN = ARTFIN;
    CODINI = '0';
    CODFIN = 'zz';
    END
if (AGRUPA = 'G') then
    BEGIN
    MARINI = '';
    MARFIN = 'zz';
    END
ELSE
    if (AGRUPA = 'M') then
        BEGIN
        MARINI = GRPINI;
        MARFIN = GRPFIN;
        GRPINI = '';
        GRPFIN = 'zz';
        END
    ELSE
        BEGIN
        MARINI = '';
        MARFIN = 'zz';
        END
/* BORRA LA TABLA AUXILIAR */
DELETE FROM reportes_aux WHERE REPA_ID = 1 AND REPA_USER = USER;

if (DETALLE = 'N') then
    BEGIN
    if (BIN_AND(TIPO, 1) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 31 INTO :NOMTIPO;
        /* BORRA LA TABLA AUXILIAR */
        DELETE FROM reportes_aux WHERE REPA_ID = 1 AND REPA_USER = USER;

        FOR SELECT MAX(D.ARTI_COD), SUM(FADE_CANT * FADE_FACTOR), SUM(FACT_FACTOR*(FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO)),
            SUM(FACT_FACTOR*FADE_IVAMONTO), SUM(FADE_CONSUMO), MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD)
            FROM FACTURAS_DETALLE D, FACTURAS F, PREFIJOS P, ARTICULO A WHERE F.PTVT_ID >= :PTOINI AND F.PTVT_ID <= :PTOFIN AND
            F.FACT_ID = D.FACT_ID AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND D.ARTI_COD = A.arti_cod AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            FACT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) and substring(a.arti_cod from 1 FOR 2) <> '.t'
            GROUP BY D.ARTI_COD
            INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,
            :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
            DO
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            if (UNIDADES = 'S') then
                BEGIN
                SELECT SUM(FADE_CANT), SUM(FADE_CANT*FADE_FACTOR) FROM FACTURAS_DETALLE D, FACTURAS F, PREFIJOS P
                    WHERE F.PTVT_ID >= :PTOINI AND F.PTVT_ID <= :PTOFIN AND D.fade_unidad <> :unidad AND
                    F.FACT_ID = D.FACT_ID AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND
                    D.ARTI_COD = :articulo AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND
                    FACT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) INTO :alternativas, :cantaux;
                cantidad = cantidad - cantaux;
                END
            if (CEROS = 'S') then
                INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (1, USER, :ARTICULO);
            SUSPEND;
            END
        if (CEROS = 'S') then
            BEGIN
            /* agregue los articulos sin factura */
            FOR SELECT ARTI_COD, 0, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND
                    A.ARTI_DES <= :DESFIN AND A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND
                    (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN)))
                INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,:DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                DO
                BEGIN
                SELECT COUNT(REPA_ARTICULO) FROM REPORTES_AUX WHERE REPA_ID = 1 AND REPA_USER = USER AND REPA_ARTICULO = :articulo INTO :numrows;
                if (numrows = 0) then
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        END

    if (BIN_AND(TIPO, 2) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 32 INTO :NOMTIPO;
        /* BORRA LA TABLA AUXILIAR */
        DELETE FROM reportes_aux WHERE REPA_ID = 1 AND REPA_USER = USER;

        FOR SELECT MAX(D.ARTI_COD), SUM(RVDE_CANT * RVDE_FACTOR), SUM((RVDE_TOTAL-RVDE_IVAMONTO-RVDE_CONSUMO)), SUM(RVDE_IVAMONTO),
            SUM(RVDE_CONSUMO), MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD)
            FROM REMISIONES_VENTA_DETALLE D, REMISIONES_VENTA R, PREFIJOS P, ARTICULO A WHERE R.PTVT_ID >= :PTOINI AND R.PTVT_ID <= :PTOFIN AND
            R.REVT_ID = D.REVT_ID AND P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = 32 AND D.ARTI_COD = A.arti_cod AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            REVT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY D.ARTI_COD
            INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,
            :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
            DO
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            if (UNIDADES = 'S') then
                BEGIN
                SELECT SUM(RVDE_CANT), SUM(RVDE_CANT*RVDE_FACTOR) FROM REMISIONES_VENTA_DETALLE D, REMISIONES_VENTA R, PREFIJOS P
                    WHERE R.PTVT_ID >= :PTOINI AND R.PTVT_ID <= :PTOFIN AND D.rvde_unidad <> :unidad AND
                    R.revt_id = D.revt_id AND P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = 32 AND
                    D.ARTI_COD = :articulo AND REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN AND
                    REVT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) INTO :alternativas, :cantaux;
                cantidad = cantidad - cantaux;
                END
            if (CEROS = 'S') then
                INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (1, USER, :ARTICULO);
            SUSPEND;
            END
        if (CEROS = 'S') then
            BEGIN
            /* agregue los articulos sin factura */
            FOR SELECT ARTI_COD, 0, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND
                    A.ARTI_DES <= :DESFIN AND A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND
                    (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN)))
                INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,:DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                DO
                BEGIN
                SELECT COUNT(REPA_ARTICULO) FROM REPORTES_AUX WHERE REPA_ID = 1 AND REPA_USER = USER AND REPA_ARTICULO = :articulo INTO :numrows;
                if (numrows = 0) then
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        END

    if (BIN_AND(TIPO, 4) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 33 INTO :NOMTIPO;
        /* BORRA LA TABLA AUXILIAR */
        DELETE FROM reportes_aux WHERE REPA_ID = 1 AND REPA_USER = USER;

        FOR SELECT MAX(D.ARTI_COD), SUM(DVDE_CANT * DVDE_FACTOR), SUM(DEVT_FACTOR*(DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO)),
            SUM(DEVT_FACTOR*DVDE_IVAMONTO), SUM(DVDE_CONSUMO), MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD)
            FROM devoluciones_ventas_detalle D, DEVOLUCIONES_VENTAS V, PREFIJOS P, ARTICULO A WHERE V.PTVT_ID >= :PTOINI AND V.PTVT_ID <= :PTOFIN AND
            V.DEVT_ID = D.DEVT_ID AND P.PREF_PRE = V.PREF_PRE AND P.TIDO_COD = 33 AND D.ARTI_COD = A.arti_cod AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            DEVT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) AND ((DEVT_REMID = 0) or (DEVT_REMID IS NULL))
            GROUP BY D.ARTI_COD
            INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,
            :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
            DO
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            CANTIDAD = CANTIDAD * -1;
            BASE = BASE * -1;
            IVA = IVA * -1;
            CONSUMO = CONSUMO * -1;
            if (UNIDADES = 'S') then
                BEGIN
                SELECT SUM(DVDE_CANT), SUM(DVDE_CANT*DVDE_FACTOR) FROM devoluciones_ventas_detalle D, DEVOLUCIONES_VENTAS V, PREFIJOS P
                    WHERE V.PTVT_ID >= :PTOINI AND V.PTVT_ID <= :PTOFIN AND D.dvde_unidad <> :unidad AND
                    V.devt_id = D.devt_id AND P.PREF_PRE = V.PREF_PRE AND P.TIDO_COD = 33 AND
                    D.ARTI_COD = :articulo AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND
                    DEVT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) INTO :alternativas, :cantaux;
                cantidad = cantidad - cantaux;
                END
            if (CEROS = 'S') then
                INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (1, USER, :ARTICULO);
            SUSPEND;
            END
        if (CEROS = 'S') then
            BEGIN
            /* agregue los articulos sin factura */
            FOR SELECT ARTI_COD, 0, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND
                    A.ARTI_DES <= :DESFIN AND A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND
                    (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN)))
                INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,:DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                DO
                BEGIN
                SELECT COUNT(REPA_ARTICULO) FROM REPORTES_AUX WHERE REPA_ID = 1 AND REPA_USER = USER AND REPA_ARTICULO = :articulo INTO :numrows;
                if (numrows = 0) then
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        END
    if (BIN_AND(TIPO, 8) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 34 INTO :NOMTIPO;
        /* BORRA LA TABLA AUXILIAR */
        DELETE FROM reportes_aux WHERE REPA_ID = 1 AND REPA_USER = USER;

        FOR SELECT MAX(D.ARTI_COD), SUM(PEDE_CANT * PEDE_FACTOR), SUM(PEDI_FACTOR*(PEDE_TOTAL-PEDE_IVAMONTO-PEDE_CONSUMO)),
            SUM(PEDI_FACTOR*PEDE_IVAMONTO), SUM(PEDE_CONSUMO),
            MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD)
            FROM PEDIDOS_DETALLE D, PEDIDOS P, PREFIJOS R, ARTICULO A WHERE P.PTVT_ID >= :PTOINI AND P.PTVT_ID <= :PTOFIN AND
            P.PEDI_ID = D.PEDI_ID AND P.PREF_PRE = R.PREF_PRE AND R.TIDO_COD = 34 AND D.ARTI_COD = A.arti_cod AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            PEDI_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY D.ARTI_COD
            INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,
            :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
            DO
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            if (UNIDADES = 'S') then
                BEGIN
                SELECT SUM(PEDE_CANT), SUM(PEDE_CANT*PEDE_FACTOR) FROM PEDIDOS_DETALLE D, PEDIDOS P, PREFIJOS R
                    WHERE P.PTVT_ID >= :PTOINI AND P.PTVT_ID <= :PTOFIN AND D.pede_unidad <> :unidad AND
                    P.pedi_id = D.pedi_id AND P.PREF_PRE = R.PREF_PRE AND R.TIDO_COD = 31 AND
                    D.ARTI_COD = :articulo AND PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND
                    PEDI_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) INTO :alternativas, :cantaux;
                cantidad = cantidad - cantaux;
                END
            if (CEROS = 'S') then
                INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (1, USER, :ARTICULO);
            SUSPEND;
            END
        if (CEROS = 'S') then
            BEGIN
            /* agregue los articulos sin factura */
            FOR SELECT ARTI_COD, 0, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND
                    A.ARTI_DES <= :DESFIN AND A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND
                    (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN)))
                INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,:DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                DO
                BEGIN
                SELECT COUNT(REPA_ARTICULO) FROM REPORTES_AUX WHERE REPA_ID = 1 AND REPA_USER = USER AND REPA_ARTICULO = :articulo INTO :numrows;
                if (numrows = 0) then
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        END
    if (BIN_AND(TIPO, 16) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 35 INTO :NOMTIPO;
        /* BORRA LA TABLA AUXILIAR */
        DELETE FROM reportes_aux WHERE REPA_ID = 1 AND REPA_USER = USER;

        FOR SELECT MAX(D.ARTI_COD), SUM(CTDE_CANT * CTDE_FACTOR), SUM(COTI_FACTOR*(CTDE_TOTAL-CTDE_IVAMONTO-CTDE_CONSUMO)),
            SUM(COTI_FACTOR*CTDE_IVAMONTO), SUM(CTDE_CONSUMO),
            MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD)
            FROM COTIZACIONES_DETALLE D, COTIZACIONES C, PREFIJOS P, ARTICULO A WHERE C.PTVT_ID >= :PTOINI AND C.PTVT_ID <= :PTOFIN AND
            C.COTI_ID = D.COTI_ID AND P.PREF_PRE = C.PREF_PRE AND P.TIDO_COD = 35 AND D.ARTI_COD = A.arti_cod AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND COTI_FECHA >= :FECINI AND COTI_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            COTI_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY D.ARTI_COD
            INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,
            :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
            DO
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            if (UNIDADES = 'S') then
                BEGIN
                SELECT SUM(CTDE_CANT), SUM(CTDE_CANT*CTDE_FACTOR) FROM COTIZACIONES_DETALLE D, COTIZACIONES C, PREFIJOS P
                    WHERE C.PTVT_ID >= :PTOINI AND C.PTVT_ID <= :PTOFIN AND D.ctde_unidad <> :unidad AND
                    C.coti_id = D.coti_id AND P.PREF_PRE = C.PREF_PRE AND P.TIDO_COD = 35 AND
                    D.ARTI_COD = :articulo AND COTI_FECHA >= :FECINI AND COTI_FECHA <= :FECFIN AND
                    COTI_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) INTO :alternativas, :cantaux;
                cantidad = cantidad - cantaux;
                END
            if (CEROS = 'S') then
                INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (1, USER, :ARTICULO);
            SUSPEND;
            END
        if (CEROS = 'S') then
            BEGIN
            /* agregue los articulos sin factura */
            FOR SELECT ARTI_COD, 0, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND
                    A.ARTI_DES <= :DESFIN AND A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND
                    (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN)))
                INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,:DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                DO
                BEGIN
                SELECT COUNT(REPA_ARTICULO) FROM REPORTES_AUX WHERE REPA_ID = 1 AND REPA_USER = USER AND REPA_ARTICULO = :articulo INTO :numrows;
                if (numrows = 0) then
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        END
    END
ELSE
  if (DETALLE = 'S') then
    BEGIN
    if (BIN_AND(TIPO, 1) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 31 INTO :NOMTIPO;
        FOR SELECT F.PREF_PRE, FACT_NUMERO, FACT_FECHA, D.ARTI_COD, FADE_CANT * FADE_FACTOR, (FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO)*FACT_FACTOR,
        FADE_IVAMONTO*FACT_FACTOR, FADE_CONSUMO, FADE_DTOPORC,
            ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD, FACT_TRANSP
            FROM FACTURAS F, FACTURAS_DETALLE D, PREFIJOS P, ARTICULO A WHERE F.PTVT_ID >= :PTOINI AND F.PTVT_ID <= :PTOFIN AND
                F.FACT_ID = D.FACT_ID AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND D.ARTI_COD = A.arti_cod AND
                A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
                A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND FACT_FECHA >= :FECINI AND
                (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
                FACT_FECHA <= :FECFIN AND FACT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) and substring(a.arti_cod from 1 FOR 2) <> '.t'
            /*ORDER BY D.ARTI_COD, FACT_FECHA, FACT_ID, FADE_ITEM*/
            INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO, :DTO,
                :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :transp
            DO
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            SUSPEND;
            END
        END
    if (BIN_AND(TIPO, 2) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 32 INTO :NOMTIPO;
        FOR SELECT R.PREF_PRE, REVT_NUMERO, REVT_FECHA, D.ARTI_COD, RVDE_CANT * RVDE_FACTOR, (RVDE_TOTAL-RVDE_IVAMONTO-RVDE_CONSUMO), RVDE_IVAMONTO, RVDE_CONSUMO, RVDE_DTOPORC,
            ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD, REVT_TRANSP
            FROM REMISIONES_VENTA R, REMISIONES_VENTA_DETALLE D, PREFIJOS P, ARTICULO A
            WHERE R.REVT_ID = D.REVT_ID AND P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = 32 AND D.ARTI_COD = A.arti_cod AND
                A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
                A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN AND
                (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
                REVT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO, :DTO,
                :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :transp
            DO
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            SUSPEND;
            END
        END
    if (BIN_AND(TIPO, 4) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 33 INTO :NOMTIPO;
        FOR SELECT V.PREF_PRE, DEVT_NUMERO, DEVT_FECHA, D.ARTI_COD, DVDE_CANT * DVDE_FACTOR, (DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO)*DEVT_FACTOR,
            DVDE_IVAMONTO*DEVT_FACTOR, DVDE_CONSUMO, DVDE_DTOPORC,
            ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD 
            FROM DEVOLUCIONES_VENTAS V, DEVOLUCIONES_VENTAS_DETALLE D, PREFIJOS P, ARTICULO A WHERE V.PTVT_ID >= :PTOINI AND V.PTVT_ID <= :PTOFIN AND
                V.DEVT_ID = D.DEVT_ID AND P.PREF_PRE = V.PREF_PRE AND P.TIDO_COD = 33 AND D.ARTI_COD = A.arti_cod AND
                A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
                A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND
                (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
                DEVT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) AND ((DEVT_REMID = 0) or (DEVT_REMID IS NULL))
            /*ORDER BY D.ARTI_COD, DEVT_FECHA, DEVT_ID, DVDE_ITEM*/
            INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO, :DTO,
                :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
            DO
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            CANTIDAD = CANTIDAD * -1;
            BASE = BASE * -1;
            IVA = IVA * -1;
            CONSUMO = CONSUMO * -1;
            SUSPEND;
            END
        END
    if (BIN_AND(TIPO, 8) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 34 INTO :NOMTIPO;
        FOR SELECT P.PREF_PRE, PEDI_NUMERO, PEDI_FECHA, D.ARTI_COD, PEDE_CANT * PEDE_FACTOR, (PEDE_TOTAL-PEDE_IVAMONTO-PEDE_CONSUMO)*PEDI_FACTOR,
                PEDE_IVAMONTO*PEDI_FACTOR, PEDE_CONSUMO, PEDE_DTOPORC,
            ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD 
            FROM PEDIDOS P, PEDIDOS_DETALLE D, PREFIJOS R, ARTICULO A WHERE P.PTVT_ID >= :PTOINI AND P.PTVT_ID <= :PTOFIN AND
                P.PEDI_ID = D.PEDI_ID AND P.PREF_PRE = R.PREF_PRE AND R.TIDO_COD = 34 AND D.ARTI_COD = A.arti_cod AND
                A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
                A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND
                (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
                PEDI_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            /*ORDER BY D.ARTI_COD, PEDI_FECHA, PEDI_ID, PEDE_ITEM*/
            INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO, :DTO,
                :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
            DO
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            SUSPEND;
            END
        END
    if (BIN_AND(TIPO, 16) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 35 INTO :NOMTIPO;
        FOR SELECT C.PREF_PRE, COTI_NUMERO, COTI_FECHA, D.ARTI_COD, CTDE_CANT * CTDE_FACTOR, (CTDE_TOTAL-CTDE_IVAMONTO-CTDE_CONSUMO)*COTI_FACTOR,
                CTDE_IVAMONTO*COTI_FACTOR, CTDE_CONSUMO, CTDE_DTOPORC,
            ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD 
            FROM COTIZACIONES C, COTIZACIONES_DETALLE D, PREFIJOS P, ARTICULO A WHERE C.PTVT_ID >= :PTOINI AND C.PTVT_ID <= :PTOFIN AND
                C.COTI_ID = D.COTI_ID AND P.PREF_PRE = C.PREF_PRE AND P.TIDO_COD = 35 AND D.ARTI_COD = A.arti_cod AND
                A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
                A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND COTI_FECHA >= :FECINI AND COTI_FECHA <= :FECFIN AND
                (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
                COTI_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            /*ORDER BY D.ARTI_COD, COTI_FECHA, COTI_ID, CTDE_ITEM*/
            INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO, :DTO,
                :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
            DO
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            SUSPEND;
            END
        END
    END
  ELSE
    BEGIN
    if (BIN_AND(TIPO, 1) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 31 INTO :NOMTIPO;
        FOR SELECT MAX(D.ARTI_COD), SUM(FADE_CANT * FADE_FACTOR), SUM((FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO)*FACT_FACTOR),
            SUM(FACT_FACTOR*FADE_IVAMONTO), SUM(FADE_CONSUMO), MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD), MAX(FACT_TRANSP)
            FROM FACTURAS_DETALLE D, FACTURAS F, PREFIJOS P, ARTICULO A WHERE F.PTVT_ID >= :PTOINI AND F.PTVT_ID <= :PTOFIN AND
            F.FACT_ID = D.FACT_ID AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND D.ARTI_COD = A.arti_cod AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            FACT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) and substring(a.arti_cod from 1 FOR 2) <> '.t'
            GROUP BY FACT_TRANSP, D.ARTI_COD
            INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,
            :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :transp
            DO
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            if (CEROS = 'S') then
                SUSPEND;
            ELSE
                if ((BASE <> 0) AND (CANTIDAD <> 0)) then
                    SUSPEND;
            END
        END

    if (BIN_AND(TIPO, 2) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 32 INTO :NOMTIPO;
        FOR SELECT MAX(D.ARTI_COD), SUM(RVDE_CANT * RVDE_FACTOR), SUM((RVDE_TOTAL-RVDE_IVAMONTO-RVDE_CONSUMO)), SUM(RVDE_IVAMONTO),
            SUM(RVDE_CONSUMO), MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD), MAX(REVT_TRANSP)
            FROM REMISIONES_VENTA_DETALLE D, REMISIONES_VENTA R, PREFIJOS P, ARTICULO A WHERE R.PTVT_ID >= :PTOINI AND R.PTVT_ID <= :PTOFIN AND
            R.REVT_ID = D.REVT_ID AND P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = 32 AND D.ARTI_COD = A.arti_cod AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            REVT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY REVT_TRANSP, D.ARTI_COD
            INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,
            :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :transp
            DO
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            if (CEROS = 'S') then
                SUSPEND;
            ELSE
                if ((BASE <> 0) AND (CANTIDAD <> 0)) then
                    SUSPEND;
            END
        END
    END
END
^

SET TERM ; ^

/* 20090214 MAL CUANDO ERA DE A TRES LISTAS */

SET TERM ^ ;

ALTER PROCEDURE REP_LISTA_PRECIOS(
    ARTINI VARCHAR(20),
    ARTFIN VARCHAR(20),
    GRPINI VARCHAR(2),
    GRPFIN VARCHAR(2),
    ORDEN CHAR(1),
    LINI INTEGER,
    LFIN INTEGER,
    FECHA DATE,
    DEATRES CHAR(1),
    MASIVA CHAR(1),
    HOY CHAR(1))
RETURNS (
    CODIGO VARCHAR(15),
    NOMBRE VARCHAR(60),
    REFERENCIA VARCHAR(20),
    UNIDAD VARCHAR(8),
    UNIDAD2 VARCHAR(8),
    UNIDAD3 VARCHAR(8),
    UNIDAD4 VARCHAR(8),
    CODGRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    CODSUBG VARCHAR(3),
    NOMSUBG VARCHAR(30),
    CODMARC VARCHAR(3),
    NOMMARC VARCHAR(30),
    NOMLISTA VARCHAR(30),
    PRECIO NUMERIC(18,2),
    PRECIO2 NUMERIC(18,2),
    PRECIO3 NUMERIC(18,2),
    MARGEN NUMERIC(9,2),
    IVA NUMERIC(9,2),
    IVAMONTO NUMERIC(18,2),
    CONSUMO NUMERIC(18,2),
    CANTMIN NUMERIC(18,4),
    PESO NUMERIC(9,4),
    ANCHO NUMERIC(18,4),
    ALTO NUMERIC(18,4),
    LARGO NUMERIC(18,4),
    FOTO BLOB SUB_TYPE 1 SEGMENT SIZE 80,
    OBS BLOB SUB_TYPE 1 SEGMENT SIZE 80,
    TOTAL NUMERIC(18,2))
AS
declare variable CODINI VARCHAR(20);
declare variable CODFIN VARCHAR(20);
declare variable DESINI VARCHAR(20);
declare variable DESFIN VARCHAR(20);
declare variable UTIL NUMERIC(9,2);
declare variable MOU CHAR(10);
declare variable LISIVA CHAR(2);
declare variable i integer;
declare variable J integer;
declare variable PRECAUX NUMERIC(18,2);
declare variable NUMROWS INTEGER;
declare variable DIG INTEGER;
declare variable UNIDADA VARCHAR(8);
BEGIN
if (ORDEN = 'C') then
    BEGIN
    CODINI = ARTINI;
    CODFIN = ARTFIN;
    DESINI = '';
    DESFIN = 'zz';
    END
ELSE
    BEGIN
    DESINI = ARTINI;
    DESFIN = ARTFIN;
    CODINI = '';
    CODFIN = 'zz';
    END
EXECUTE PROCEDURE LEE_CONFIGURACION ('FACTURACION', 'ARTICULOS', 'SUGERIR PRECIOS CON PORCENTAJE DE MARGEN O UTILIDAD') returning_values (MOU);
EXECUTE PROCEDURE LEE_CONFIGURACION ('FACTURACION', 'ARTICULOS', 'REDONDEO AL MULTIPLO DE DIEZ EN PRECIOS') returning_values (DIG);
FOR SELECT a.ARTI_COD, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD, TAIV_PORC, ARTI_CONSUMO,
    ARTI_FOTO, ARTI_PESO, ARTI_LARGO, ARTI_ANCHO, ARTI_ALTO, ARTI_OBS
    FROM ARTICULO A, TARIFA_IVA T
    WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :GRPFIN AND
    ARTI_DES >= :DESINI AND ARTI_DES <= :DESFIN AND ESAR_COD = 'A' AND A.TAIV_COD = T.TAIV_COD
    ORDER BY ARTI_COD
    INTO :CODIGO, :NOMBRE, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :IVA, :CONSUMO,
        :FOTO, :PESO, :LARGO, :ANCHO, :ALTO, :OBS
    DO
    BEGIN
    I = 0;
    FOR SELECT LIPR_NOM, PRAR_FIJO, PRAR_MARGEN, PRAR_UTIL, LIPR_MODIF, PRAR_CANTMIN
        FROM LISTA_PRECIOS L, PRECIOS_ARTICULO P
        WHERE L.LIPR_COD = P.LIPR_COD AND p.arti_cod = :codigo and l.lipr_cod >= :lini and l.lipr_cod <= :lfin AND
        ((:fecha IS NULL) or ((L.lipr_fecini <= :FECHA) AND (L.lipr_fecfin >= :FECHA)))
        ORDER BY L.LIPR_COD
        INTO :NOMLISTA, :PRECIO, :MARGEN, :UTIL, :LISIVA, :cantmin
        do
        BEGIN
        if (FECHA IS NULL) then
            FECHA = cast('now' as DATE);
        SELECT COUNT(AUDI_ID) FROM AUDITORIA WHERE TIDO_COD = 126 AND AUDI_COD = :CODIGO AND AUDI_FECHA = :FECHA AND AUDI_OPER <> 'D' INTO :NUMROWS;
        if ((HOY = 'N') or (NUMROWS <> 0)) then
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            SELECT MIN(COBA_COD) FROM barras_articulo WHERE ARTI_COD = :codigo INTO :referencia;
            J = 0;
            UNIDAD2 = '';
            UNIDAD3 = '';
            UNIDAD4 = '';
            for SELECT UNAR_UNIDAD FROM unidad_articulo WHERE ARTI_COD = :codigo INTO :unidada
                DO
                BEGIN
                if (J = 0) then
                    UNIDAD2 = UNIDADA;
                if (J = 1) then
                    UNIDAD3 = UNIDADA;
                if ( J = 2) then
                    UNIDAD4 = UNIDADA;
                J = J + 1;
                END
            if (MOU = 'UTILIDAD') then
                MARGEN = UTIL;
            if (LISIVA = 'N') then
                IVAMONTO = PRECIO * IVA / 100;
            ELSE
                BEGIN
                IVAMONTO = (PRECIO - CONSUMO) * IVA / (100 + IVA);
                PRECIO = (PRECIO - CONSUMO) / (1 + (IVA/100));
/*              EXECUTE PROCEDURE redondee(PRECIO, DIG) returning_values (PRECIO); */
                END
            TOTAL = PRECIO + IVAMONTO + CONSUMO;
            EXECUTE PROCEDURE redondee(TOTAL, DIG) returning_values (TOTAL);
            if (DEATRES = 'N') then
                SUSPEND;
            else
                BEGIN
                I = I + 1;
                if (MASIVA = 'S') then
                    PRECIO = TOTAL;
                TOTAL = 0;
                if (MOD(I,3) = 1) then
                    BEGIN
                    PRECAUX = PRECIO;
                    PRECIO2 = 0;
                    PRECIO3 = 0;
                    END
                if (MOD(I,3) = 2) then
                    BEGIN
                    PRECIO2 = PRECIO;
                    PRECIO = PRECAUX;
                    END
                if (MOD(I,3) = 0) then
                    BEGIN
                    PRECIO3 = PRECIO;
                    PRECIO = PRECAUX;
                    SUSPEND;
                    END
                END
            END
        end
    if ((DEATRES = 'S') AND (MOD(I,3) <> 0)) then
        SUSPEND;
    end
END
^

SET TERM ; ^


/* 20090217 PESO DEL RETAL ESTA QUEDANDO EN GRAMOS Y NO EN KILOS COMO LOS DEMAS */

SET TERM ^ ;

CREATE OR ALTER PROCEDURE REP_ENSAMBLES(
    FECINI DATE,
    FECFIN DATE,
    PREFINI VARCHAR(4),
    PREFFIN VARCHAR(4),
    OPER INTEGER,
    MAQUI INTEGER,
    BODINI VARCHAR(2),
    BODFIN VARCHAR(2),
    DETALLE CHAR(1),
    SUBEMPRESA INTEGER)
RETURNS (
    FECHA DATE,
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    OPERARIO VARCHAR(60),
    MAQUINA VARCHAR(60),
    BODEGA VARCHAR(2),
    NOMBODEGA VARCHAR(60),
    PRODUCTO VARCHAR(20),
    DESPROD VARCHAR(60),
    CANT NUMERIC(18,4),
    PESO NUMERIC(18,4),
    RETAL VARCHAR(60),
    PESORETAL NUMERIC(18,4),
    CONC VARCHAR(60),
    OBS VARCHAR(255),
    CODCOMP VARCHAR(20),
    DESCOMP VARCHAR(60),
    CANTCOMP NUMERIC(18,4),
    BODCOMP VARCHAR(2),
    PESOCOMP NUMERIC(18,4))
AS
declare variable cantretal NUMERIC(18,4);
declare variable ID INTEGER;
begin
FOR SELECT ENSA_ID, E.PREF_PRE, ENSA_NUMERO, ENSA_FECHA, ENSA_CONC, E.BODE_COD, BODE_NOM, ENSA_CODBAR, ENSA_DESC,
    ENSA_CANT, ENSA_PESO, ENSA_OBS, ENSA_CODRETAL, ENSA_CANTRETAL, ENSA_OPER, ENSA_MAQUINA
    FROM ENSAMBLES E, BODEGA B, PREFIJOS P
    WHERE E.BODE_COD = B.BODE_COD AND E.ENSA_FECHA >= :FECINI AND E.ENSA_FECHA <= :FECFIN AND E.PREF_PRE >= :prefini AND E.PREF_PRE <= :preffin
     AND P.PREF_PRE = E.PREF_PRE AND P.TIDO_COD = 15 AND ((P.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) AND ENSA_ANULADO = 'N'
     AND ((:OPER = 0) OR (ENSA_OPER = :OPER)) AND ((:MAQUI = 0) or (ENSA_MAQUINA = :MAQUI)) AND E.bode_cod >= :bodini AND E.bode_cod <= :bodfin
    ORDER BY ENSA_FECHA, ENSA_ID
    into :ID, :PREF, :NUMERO, :FECHA, :conc, :bodega, :nombodega, :producto, :desprod,
    :cant, :peso, :OBS, :retal, :cantretal, :operario, :maquina
    DO
    BEGIN
    SELECT ENOP_NOMBRE FROM ensamble_operario WHERE ENOP_ID = :operario INTO :operario;
    SELECT ENMA_NOMBRE FROM ensamble_maquina WHERE ENMA_ID = :maquina INTO :maquina;
    SELECT ARTI_PESO FROM ARTICULO WHERE ARTI_COD = :retal INTO :pesoretal;
    if (pesoretal IS NULL) then
        pesoretal = 0;
    pesoretal = pesoretal * cantretal / 1000;
    if (DETALLE = 'S') then
        FOR SELECT ESDE_CODBAR, ESDE_DESC, ESDE_CANT, BODE_COD, ESDE_PESO
            FROM ensambles_detalle D, ARTICULO A WHERE D.ARTI_COD = A.ARTI_COD AND D.ENSA_ID = :ID INTO
            :codcomp, :descomp, :cantcomp, :bodcomp, :pesocomp
            DO
            BEGIN
            SUSPEND;
            END
    else
        SUSPEND;
    END
end
^

SET TERM ; ^


/* 20090217B detalle las sucursales de cada cliente */

SET TERM ^ ;

CREATE OR ALTER PROCEDURE REP_CLIENTES(
    DESDE VARCHAR(20),
    HASTA VARCHAR(20),
    ZONINI VARCHAR(5),
    ZONFIN VARCHAR(5),
    VENINI INTEGER,
    VENFIN INTEGER,
    AGRUPA CHAR(1),
    ORDEN CHAR(1),
    INACTIVOS CHAR(1))
RETURNS (
    NIT VARCHAR(20),
    NOM VARCHAR(60),
    SUC VARCHAR(10),
    DIR VARCHAR(60),
    CIU VARCHAR(40),
    TEL VARCHAR(40),
    CONTACTO VARCHAR(60),
    OBS VARCHAR(255),
    EMAIL VARCHAR(100),
    FAX VARCHAR(25),
    CEL VARCHAR(25),
    CODCLIE VARCHAR(20),
    CODCIU VARCHAR(6),
    ZONA VARCHAR(2),
    ESTADO CHAR(1),
    RTEFTE NUMERIC(9,4),
    RTEIVA NUMERIC(9,4),
    RTEICA NUMERIC(9,4),
    RTFTEBASE NUMERIC(18,2),
    DTOMAX NUMERIC(9,4),
    CUPO NUMERIC(18,2),
    COBR INTEGER,
    VEND INTEGER,
    ANIV DATE,
    CLIDESDE DATE,
    LISTA INTEGER,
    DIAS INTEGER,
    DIASBLOQ INTEGER,
    DETALLE CHAR(1),
    NOMLISTA VARCHAR(30),
    NOMVEND VARCHAR(60),
    NOMCOBR VARCHAR(60),
    NOMZONA VARCHAR(60),
    NOMCIUD VARCHAR(60),
    CTACLIE VARCHAR(20),
    CTAVNTA VARCHAR(20),
    CTARTFTE VARCHAR(20),
    CTARTIVA VARCHAR(20),
    CTARTICA VARCHAR(20))
AS
declare variable NITINI VARCHAR(20);
declare variable NITFIN VARCHAR(20);
declare variable NOMINI VARCHAR(20);
declare variable NOMFIN VARCHAR(20);
declare variable NUMROWS INTEGER;
begin
if (ORDEN = 'C') then
    BEGIN
    NITINI = DESDE;
    NITFIN = HASTA;
    NOMINI = '';
    NOMFIN = 'zz';
    END
ELSE
    BEGIN
    NOMINI = DESDE;
    NOMFIN = HASTA;
    NITINI = '';
    NITFIN = 'zz';
    END

for select t.terc_nit,terc_nom,terc_dir,terc_ciu,terc_tel,terc_contacto,SUBSTRING(TERC_OBS FROM 1 FOR 255),
    terc_email,terc_fax,terc_cel,c.clie_cod,c.zona_cod,c.clie_estado,c.clie_rtefte,c.clie_rteiva,c.clie_rteica,c.clie_rtftebase,c.clie_dtomax,
    c.clie_cupo,c.vend_cod, c.cobr_cod, c.clie_aniv, c.clie_fecha, c.lipr_cod, c.clie_dias, c.clie_diasbloq, c.clie_detalle,
    terc_ctartfte,terc_ctartiva,terc_ctartica,terc_ctaventa,terc_ctacliente, T.ciud_cod
    from terceros t,clientes c where t.terc_nit = c.terc_nit and t.terc_nit >= :nitini and t.terc_nit <= :nitfin and terc_nom >= :nomini and terc_nom <= :nomfin
    into :nit, :nom, :dir, :ciu, :tel, :contacto, :obs,
    :email, :fax, :cel, :codclie, :zona, :estado, :rtefte, :rteiva, :rteica,
    :rtftebase, :dtomax, :cupo, :vend, :cobr, :aniv, :clidesde, :lista, :dias, :diasbloq, :detalle,
    :ctartfte, :ctartiva, :ctartica, :ctavnta, :ctaclie, :codciu
    do
    begin
    if ((inactivos = 'S') or (estado <> 'I'))  then
        begin
        SUC = '';
        SELECT COUNT(*) FROM CLIENTE_SUCURSALES WHERE TERC_NIT = :NIT INTO :NUMROWS;
        if (NUMROWS > 1) then
            BEGIN
            nomlista = '';
            select lipr_nom from LISTA_PRECIOS where lipr_cod = :lista into nomlista;
            FOR SELECT CLCU_COD, CLSU_NOMBRE, CLSU_DIR, CLSU_CIUDAD, CLSU_TEL, SUBSTRING(CLSU_OBS FROM 1 FOR 255), VEND_COD, COBR_COD, ZONA_COD
                FROM cliente_sucursales WHERE TERC_NIT = :NIT ORDER BY CLCU_COD
                INTO :SUC, :nom, :dir, :ciu, :tel, :obs, :vend, :cobr, :zona
                DO
                BEGIN
                nomzona = '';
                nomcobr = '';
                nomciud = '';
                nomvend = '';
                select zona_nom from zonas where zona_cod = :zona into :nomzona;
                select cobr_nom from cobradores where cobr_cod = :cobr into nomcobr;
                select vend_nombre from vendedores where vend_cod = :vend into nomvend;
                select ciud_nom from ciudades where ciud_cod = :nomcobr into nomciud;
                if (AGRUPA = 'V') then
                  begin
                  if ((vend >= :venini) and (vend <= :venfin)) then
                    suspend;
                  end
                else
                  if (AGRUPA = 'B') then
                    begin
                    if ((cobr >= :venini) and (cobr <= :venfin)) then
                        suspend;
                    end
                  else
                    if (AGRUPA = 'Z') then
                      begin
                      if ((zona >= :zonini) and (zona <= :zonfin)) then
                        suspend;
                      end
                    else
                      if (AGRUPA = 'C') then
                        begin
                        if ((codciu >= :zonini) and (codciu <= :zonfin)) then
                          suspend;
                        end
                      else
                        suspend;
                end
            END
        ELSE
            BEGIN
            nomzona = '';
            nomcobr = '';
            nomciud = '';
            nomvend = '';
            select zona_nom from zonas where zona_cod = :zona into :nomzona;
            select cobr_nom from cobradores where cobr_cod = :cobr into nomcobr;
            select vend_nombre from vendedores where vend_cod = :vend into nomvend;
            select ciud_nom from ciudades where ciud_cod = :nomcobr into nomciud;
            if (AGRUPA = 'V') then
                begin
                if ((vend >= :venini) and (vend <= :venfin)) then
                    suspend;
                end
            else
                if (AGRUPA = 'B') then
                    begin
                    if ((cobr >= :venini) and (cobr <= :venfin)) then
                        suspend;
                    end
                else
                    if (AGRUPA = 'Z') then
                      begin
                      if ((zona >= :zonini) and (zona <= :zonfin)) then
                        suspend;
                      end
                    else
                      if (AGRUPA = 'C') then
                        begin
                        if ((codciu >= :zonini) and (codciu <= :zonfin)) then
                          suspend;
                        end
                      else
                        suspend;
            END
        end
    end
end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER PROCEDURE REP_VENTAS_CLIENTE(
    TIPO INTEGER,
    NITDESDE VARCHAR(20),
    NITHASTA VARCHAR(20),
    FECINI DATE,
    FECFIN DATE,
    DETALLE CHAR(1),
    ORDEN CHAR(1),
    CEROS CHAR(1),
    SUBEMPRESA INTEGER)
RETURNS (
    NIT VARCHAR(20),
    NOMBRE VARCHAR(60),
    DV CHAR(1),
    TELEFONO VARCHAR(40),
    CIUDAD VARCHAR(40),
    CODZONA VARCHAR(2),
    NOMZONA VARCHAR(30),
    NOMTIPO VARCHAR(50),
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(6),
    SUCURSAL VARCHAR(10),
    ID INTEGER,
    FECDOC DATE,
    CANTIDAD INTEGER,
    SUBTOTAL NUMERIC(18,2),
    DTO NUMERIC(18,2),
    ADICIONAL NUMERIC(18,2),
    IVA NUMERIC(18,2),
    EXTRA NUMERIC(18,2),
    TOTAL NUMERIC(18,2),
    RTFTE NUMERIC(18,2),
    RTIVA NUMERIC(18,2),
    RTICA NUMERIC(18,2),
    NETO NUMERIC(18,2),
    APELLIDO1 VARCHAR(60),
    APELLIDO2 VARCHAR(60),
    NOMBRE1 VARCHAR(60),
    NOMBRE2 VARCHAR(60),
    CODCIU VARCHAR(5))
AS
DECLARE VARIABLE NITINI VARCHAR(15);
DECLARE VARIABLE NITFIN VARCHAR(15);
DECLARE VARIABLE NOMINI VARCHAR(15);
DECLARE VARIABLE NOMFIN VARCHAR(15);
BEGIN
if (ORDEN = 'C') then
    BEGIN
    NITINI = NITDESDE;
    NITFIN = NITHASTA;
    NOMINI = '';
    NOMFIN = 'zz';
    END
ELSE
    BEGIN
    NITINI = NITDESDE;
    NITFIN = NITHASTA;
    NOMINI = '';
    NOMFIN = 'zz';
    END

SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = :TIPO INTO :NOMTIPO;
if (DETALLE = 'N') then
    BEGIN
    if (BIN_AND(TIPO, 1) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 31 INTO :NOMTIPO;
        FOR SELECT MAX(T.TERC_NIT), MAX(TERC_NOM), MAX(TERC_TEL), MAX(TERC_CIU), MAX(ZONA_COD), MAX(TERC_DV), MAX(TERC_APELLIDO1), MAX(TERC_APELLIDO2), MAX(TERC_NOMBRE1), MAX(TERC_NOMBRE2), MAX(T.CIUD_COD),
            COUNT(*), SUM(FACT_DTOMONTO), SUM(FACT_ADICIONAL), SUM(FACT_IVAMONTO), SUM(FACT_EXTRA), SUM(FACT_RTFTEMONTO), SUM(FACT_RTIVAMONTO), SUM(FACT_RTICAMONTO), SUM(FACT_TOTAL)
            FROM FACTURAS F, PREFIJOS P, terceros T, CLIENTES C
            where C.TERC_NIT = T.TERC_NIT AND T.TERC_CLIE = 'S' AND T.TERC_NIT >= :NITINI AND T.TERC_NIT <= :NITFIN AND TERC_NOM >= :NOMINI AND TERC_NOM <= :NOMFIN
             AND F.TERC_NIT = T.terc_nit AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND FACT_ANULADO = 'N'
             AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY F.terc_nit
            INTO :NIT, :NOMBRE, :TELEFONO, :CIUDAD, :CODZONA, :DV, :APELLIDO1, :APELLIDO2, :NOMBRE1, :NOMBRE2, :CODCIU,
            :CANTIDAD, :DTO, :ADICIONAL, :IVA, :EXTRA, :RTFTE, :RTIVA, :RTICA, :TOTAL
            DO
            BEGIN
            SELECT ZONA_NOM FROM ZONAS WHERE ZONA_COD = :codzona INTO :NOMZONA;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (DTO IS NULL) then
                DTO = 0;
            if (ADICIONAL IS NULL) then
                ADICIONAL = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (EXTRA IS NULL) then
                EXTRA = 0;
            if (RTFTE IS NULL) then
                RTFTE = 0;
            if (RTIVA IS NULL) then
                RTIVA = 0;
            if (RTICA IS NULL) then
                RTICA = 0;
            SUBTOTAL = TOTAL - EXTRA - IVA - ADICIONAL + DTO;
            NETO = TOTAL - RTFTE - RTIVA - RTICA;
            if (CEROS = 'S') then
              SUSPEND;
            ELSE
              if (CANTIDAD > 0) then
                SUSPEND;
            END
        END
    if (BIN_AND(TIPO, 2) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 32 INTO :NOMTIPO;
        FOR SELECT MAX(T.TERC_NIT), MAX(TERC_NOM), MAX(TERC_TEL), MAX(TERC_CIU), MAX(ZONA_COD), MAX(TERC_DV), MAX(TERC_APELLIDO1), MAX(TERC_APELLIDO2), MAX(TERC_NOMBRE1), MAX(TERC_NOMBRE2), MAX(T.CIUD_COD),
            COUNT(*), 0, 0, SUM(REVT_IVAMONTO), 0, 0, 0, 0, SUM(REVT_TOTAL)
            FROM REMISIONES_VENTA R, PREFIJOS P, terceros T, CLIENTES C
            where C.TERC_NIT = T.TERC_NIT AND T.TERC_CLIE = 'S' AND T.TERC_NIT >= :NITINI AND T.TERC_NIT <= :NITFIN AND TERC_NOM >= :NOMINI AND TERC_NOM <= :NOMFIN
             AND R.TERC_NIT = T.terc_nit AND REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN AND REVT_ANULADO = 'N'
             AND P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = 32 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY R.terc_nit
            INTO :NIT, :NOMBRE, :TELEFONO, :CIUDAD, :CODZONA, :DV, :APELLIDO1, :APELLIDO2, :NOMBRE1, :NOMBRE2, :CODCIU,
            :CANTIDAD, :DTO, :ADICIONAL, :IVA, :EXTRA, :RTFTE, :RTIVA, :RTICA, :TOTAL
            DO
            BEGIN
            SELECT ZONA_NOM FROM ZONAS WHERE ZONA_COD = :codzona INTO :NOMZONA;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (DTO IS NULL) then
                DTO = 0;
            if (ADICIONAL IS NULL) then
                ADICIONAL = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (EXTRA IS NULL) then
                EXTRA = 0;
            if (RTFTE IS NULL) then
                RTFTE = 0;
            if (RTIVA IS NULL) then
                RTIVA = 0;
            if (RTICA IS NULL) then
                RTICA = 0;
            SUBTOTAL = TOTAL - EXTRA - IVA - ADICIONAL + DTO;
            NETO = TOTAL - RTFTE - RTIVA - RTICA;
            if (CEROS = 'S') then
              SUSPEND;
            ELSE
              if (CANTIDAD > 0) then
                SUSPEND;
            END
        END
    if (BIN_AND(TIPO, 4) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 33 INTO :NOMTIPO;
        FOR SELECT MAX(T.TERC_NIT), MAX(TERC_NOM), MAX(TERC_TEL), MAX(TERC_CIU), MAX(ZONA_COD), MAX(TERC_DV), MAX(TERC_APELLIDO1), MAX(TERC_APELLIDO2), MAX(TERC_NOMBRE1), MAX(TERC_NOMBRE2), MAX(T.CIUD_COD),
            COUNT(*), SUM(DEVT_DTOMONTO), SUM(DEVT_ADICIONAL), SUM(DEVT_IVAMONTO), SUM(DEVT_EXTRA), SUM(DEVT_RTFTEMONTO), SUM(DEVT_RTIVAMONTO), SUM(DEVT_RTICAMONTO), SUM(DEVT_TOTAL)
            FROM DEVOLUCIONES_VENTAS V, PREFIJOS P, terceros T, CLIENTES C
            where C.TERC_NIT = T.TERC_NIT AND T.TERC_CLIE = 'S' AND T.TERC_NIT >= :NITINI AND T.TERC_NIT <= :NITFIN AND TERC_NOM >= :NOMINI AND TERC_NOM <= :NOMFIN
             AND V.TERC_NIT = T.terc_nit AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND DEVT_ANULADO = 'N'
             AND P.PREF_PRE = V.PREF_PRE AND P.TIDO_COD = 33 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) AND ((DEVT_REMID = 0) or (DEVT_REMID IS NULL))
            GROUP BY V.terc_nit
            INTO :NIT, :NOMBRE, :TELEFONO, :CIUDAD, :CODZONA, :DV, :APELLIDO1, :APELLIDO2, :NOMBRE1, :NOMBRE2, :CODCIU,
             :CANTIDAD, :DTO, :ADICIONAL, :IVA, :EXTRA, :RTFTE, :RTIVA, :RTICA, :TOTAL
            DO
            BEGIN
            SELECT ZONA_NOM FROM ZONAS WHERE ZONA_COD = :codzona INTO :NOMZONA;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (DTO IS NULL) then
                DTO = 0;
            if (ADICIONAL IS NULL) then
                ADICIONAL = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (EXTRA IS NULL) then
                EXTRA = 0;
            if (RTFTE IS NULL) then
                RTFTE = 0;
            if (RTIVA IS NULL) then
                RTIVA = 0;
            if (RTICA IS NULL) then
                RTICA = 0;
            SUBTOTAL = TOTAL - EXTRA - IVA - ADICIONAL + DTO;
            NETO = TOTAL - RTFTE - RTIVA - RTICA;
            CANTIDAD = CANTIDAD * -1;
            SUBTOTAL = SUBTOTAL * -1;
            TOTAL = TOTAL * -1;
            IVA = IVA * -1;
            EXTRA = EXTRA * -1;
            DTO = DTO * -1;
            ADICIONAL = ADICIONAL * -1;
            RTFTE = RTFTE * -1;
            RTIVA = RTIVA * -1;
            RTICA = RTICA * -1;
            if (CEROS = 'S') then
              SUSPEND;
            ELSE
              if (CANTIDAD > 0) then
                SUSPEND;
            END
        END
    if (BIN_AND(TIPO, 8) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 34 INTO :NOMTIPO;
        FOR SELECT MAX(T.TERC_NIT), MAX(TERC_NOM), MAX(TERC_TEL), MAX(TERC_CIU), MAX(ZONA_COD), MAX(TERC_DV), MAX(TERC_APELLIDO1), MAX(TERC_APELLIDO2), MAX(TERC_NOMBRE1), MAX(TERC_NOMBRE2), MAX(T.CIUD_COD),
            COUNT(*), SUM(PEDI_DTOMONTO), SUM(PEDI_ADICIONAL), SUM(PEDI_IVAMONTO), SUM(PEDI_EXTRA), 0, 0, 0, SUM(PEDI_TOTAL)
            FROM PEDIDOS P, PREFIJOS PR, terceros T, CLIENTES C
            where C.TERC_NIT = T.TERC_NIT AND T.TERC_CLIE = 'S' AND T.TERC_NIT >= :NITINI AND T.TERC_NIT <= :NITFIN AND TERC_NOM >= :NOMINI AND TERC_NOM <= :NOMFIN
             AND P.TERC_NIT = T.terc_nit AND PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND PEDI_ANULADO = 'N'
             AND PR.PREF_PRE = P.PREF_PRE AND P.TIDO_COD = 34 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY P.terc_nit
            INTO :NIT, :NOMBRE, :TELEFONO, :CIUDAD, :CODZONA, :DV, :APELLIDO1, :APELLIDO2, :NOMBRE1, :NOMBRE2, :CODCIU,
            :CANTIDAD, :DTO, :ADICIONAL, :IVA, :EXTRA, :RTFTE, :RTIVA, :RTICA, :TOTAL
            DO
            BEGIN
            SELECT ZONA_NOM FROM ZONAS WHERE ZONA_COD = :codzona INTO :NOMZONA;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (DTO IS NULL) then
                DTO = 0;
            if (ADICIONAL IS NULL) then
                ADICIONAL = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (EXTRA IS NULL) then
                EXTRA = 0;
            if (RTFTE IS NULL) then
                RTFTE = 0;
            if (RTIVA IS NULL) then
                RTIVA = 0;
            if (RTICA IS NULL) then
                RTICA = 0;
            SUBTOTAL = TOTAL - EXTRA - IVA - ADICIONAL + DTO;
            NETO = TOTAL - RTFTE - RTIVA - RTICA;
            if (CEROS = 'S') then
              SUSPEND;
            ELSE
              if (CANTIDAD > 0) then
                SUSPEND;
            END
        END
    if (BIN_AND(TIPO, 16) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 35 INTO :NOMTIPO;
        FOR SELECT MAX(T.TERC_NIT), MAX(TERC_NOM), MAX(TERC_TEL), MAX(TERC_CIU), MAX(ZONA_COD), MAX(TERC_DV), MAX(TERC_APELLIDO1), MAX(TERC_APELLIDO2), MAX(TERC_NOMBRE1), MAX(TERC_NOMBRE2), MAX(T.CIUD_COD),
            COUNT(*), SUM(COTI_DTOMONTO), SUM(COTI_ADICIONAL), SUM(COTI_IVAMONTO), SUM(COTI_EXTRA), 0, 0, 0, SUM(COTI_TOTAL)
            FROM COTIZACIONES CT, PREFIJOS P, terceros T, CLIENTES C
            where C.TERC_NIT = T.TERC_NIT AND T.TERC_CLIE = 'S' AND T.TERC_NIT >= :NITINI AND T.TERC_NIT <= :NITFIN AND TERC_NOM >= :NOMINI AND TERC_NOM <= :NOMFIN
             AND CT.TERC_NIT = T.terc_nit AND COTI_FECHA >= :FECINI AND COTI_FECHA <= :FECFIN AND COTI_ANULADO = 'N'
             AND P.PREF_PRE = CT.PREF_PRE AND P.TIDO_COD = 35 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY C.terc_nit
            INTO :NIT, :NOMBRE, :TELEFONO, :CIUDAD, :CODZONA, :DV, :APELLIDO1, :APELLIDO2, :NOMBRE1, :NOMBRE2, :CODCIU,
            :CANTIDAD, :DTO, :ADICIONAL, :IVA, :EXTRA, :RTFTE, :RTIVA, :RTICA, :TOTAL
            DO
            BEGIN
            SELECT ZONA_NOM FROM ZONAS WHERE ZONA_COD = :codzona INTO :NOMZONA;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (DTO IS NULL) then
                DTO = 0;
            if (ADICIONAL IS NULL) then
                ADICIONAL = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (EXTRA IS NULL) then
                EXTRA = 0;
            if (RTFTE IS NULL) then
                RTFTE = 0;
            if (RTIVA IS NULL) then
                RTIVA = 0;
            if (RTICA IS NULL) then
                RTICA = 0;
            SUBTOTAL = TOTAL - EXTRA - IVA - ADICIONAL + DTO;
            NETO = TOTAL - RTFTE - RTIVA - RTICA;
            if (CEROS = 'S') then
              SUSPEND;
            ELSE
              if (CANTIDAD > 0) then
                SUSPEND;
            END
        END
    END
ELSE
    BEGIN
    if (BIN_AND(TIPO, 1) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 31 INTO :NOMTIPO;
        FOR SELECT FACT_ID, F.PREF_PRE, FACT_NUMERO, FACT_FECHA, FACT_DTOMONTO, FACT_ADICIONAL, FACT_IVAMONTO, FACT_EXTRA, FACT_TOTAL, FACT_RTFTEMONTO, FACT_RTIVAMONTO, FACT_RTICAMONTO,
            T.TERC_NIT, TERC_NOM, ZONA_COD, TERC_TEL, TERC_CIU, TERC_DV, TERC_APELLIDO1, TERC_APELLIDO2, TERC_NOMBRE1, TERC_NOMBRE2, T.CIUD_COD, F.fact_sucursal
            FROM FACTURAS F, PREFIJOS P, terceros T, CLIENTES C
            where C.TERC_NIT = T.TERC_NIT AND T.TERC_CLIE = 'S' AND T.TERC_NIT >= :NITINI AND T.TERC_NIT <= :NITFIN AND TERC_NOM >= :NOMINI AND TERC_NOM <= :NOMFIN
             AND F.TERC_NIT = T.terc_nit AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND FACT_ANULADO = 'N'
             AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            ORDER BY FACT_FECHA, FACT_ID
            INTO :ID, :PREFIJO, :NUMERO, :FECDOC, :DTO, :ADICIONAL, :IVA, :EXTRA, :TOTAL, :RTFTE, :RTIVA, :RTICA, :nit, :nombre, :codzona, :telefono, :ciudad, :dv, :APELLIDO1, :APELLIDO2, :NOMBRE1, :NOMBRE2, :CODCIU, :sucursal
            DO
            BEGIN
            SELECT ZONA_NOM FROM ZONAS WHERE ZONA_COD = :codzona INTO :NOMZONA;
            SUBTOTAL = TOTAL - EXTRA - IVA - ADICIONAL + DTO;
            NETO = TOTAL - RTFTE - RTIVA - RTICA;
            SUSPEND;
            END
        END
    if (BIN_AND(TIPO, 2) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 32 INTO :NOMTIPO;
        FOR SELECT REVT_ID, R.PREF_PRE, REVT_NUMERO, REVT_FECHA, 0, 0, REVT_IVAMONTO, 0, REVT_TOTAL, 0, 0, 0,
        T.TERC_NIT, TERC_NOM, ZONA_COD, TERC_TEL, TERC_CIU, TERC_DV, TERC_APELLIDO1, TERC_APELLIDO2, TERC_NOMBRE1, TERC_NOMBRE2, T.CIUD_COD, R.revt_sucursal
            FROM REMISIONES_VENTA R, PREFIJOS P, terceros T, CLIENTES C
            where C.TERC_NIT = T.TERC_NIT AND T.TERC_CLIE = 'S' AND T.TERC_NIT >= :NITINI AND T.TERC_NIT <= :NITFIN AND TERC_NOM >= :NOMINI AND TERC_NOM <= :NOMFIN
             AND R.TERC_NIT = T.terc_nit AND REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN AND REVT_ANULADO = 'N'
             AND P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = 32 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            ORDER BY REVT_FECHA, REVT_ID
            INTO :ID, :PREFIJO, :NUMERO, :FECDOC, :DTO, :ADICIONAL, :IVA, :EXTRA, :TOTAL, :RTFTE, :RTIVA, :RTICA, :nit, :nombre, :codzona, :telefono, :ciudad, :DV, :APELLIDO1, :APELLIDO2, :NOMBRE1, :NOMBRE2, :CODCIU, :sucursal
            DO
            BEGIN
            SELECT ZONA_NOM FROM ZONAS WHERE ZONA_COD = :codzona INTO :NOMZONA;
            SUBTOTAL = TOTAL - EXTRA - IVA - ADICIONAL + DTO;
            NETO = TOTAL - RTFTE - RTIVA - RTICA;
            SUSPEND;
            END
        END
    if (BIN_AND(TIPO, 4) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 33 INTO :NOMTIPO;
        FOR SELECT DEVT_ID, V.PREF_PRE, DEVT_NUMERO, DEVT_FECHA, DEVT_DTOMONTO, DEVT_ADICIONAL, DEVT_IVAMONTO, DEVT_EXTRA, DEVT_TOTAL, DEVT_RTFTEMONTO, DEVT_RTIVAMONTO, DEVT_RTICAMONTO,
            T.TERC_NIT, TERC_NOM, ZONA_COD, TERC_TEL, TERC_CIU, TERC_DV, TERC_APELLIDO1, TERC_APELLIDO2, TERC_NOMBRE1, TERC_NOMBRE2, T.CIUD_COD, V.devt_sucursal
            FROM DEVOLUCIONES_VENTAS V, PREFIJOS P, terceros T, CLIENTES C
            where C.TERC_NIT = T.TERC_NIT AND T.TERC_CLIE = 'S' AND T.TERC_NIT >= :NITINI AND T.TERC_NIT <= :NITFIN AND TERC_NOM >= :NOMINI AND TERC_NOM <= :NOMFIN
             AND V.TERC_NIT = T.terc_nit AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND DEVT_ANULADO = 'N'
             AND P.PREF_PRE = V.PREF_PRE AND P.TIDO_COD = 33 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) AND ((DEVT_REMID = 0) or (DEVT_REMID IS NULL))
            ORDER BY DEVT_FECHA, DEVT_ID
            INTO :ID, :PREFIJO, :NUMERO, :FECDOC, :DTO, :ADICIONAL, :IVA, :EXTRA, :TOTAL, :RTFTE, :RTIVA, :RTICA, :nit, :nombre, :codzona, :telefono, :ciudad, :DV, :APELLIDO1, :APELLIDO2, :NOMBRE1, :NOMBRE2, :CODCIU, :sucursal
            DO
            BEGIN
            SELECT ZONA_NOM FROM ZONAS WHERE ZONA_COD = :codzona INTO :NOMZONA;
            SUBTOTAL = TOTAL - EXTRA - IVA - ADICIONAL + DTO;
            NETO = TOTAL - RTFTE - RTIVA - RTICA;
            CANTIDAD = CANTIDAD * -1;
            SUBTOTAL = SUBTOTAL * -1;
            TOTAL = TOTAL * -1;
            IVA = IVA * -1;
            EXTRA = EXTRA * -1;
            DTO = DTO * -1;
            ADICIONAL = ADICIONAL * -1;
            RTFTE = RTFTE * -1;
            RTIVA = RTIVA * -1;
            RTICA = RTICA * -1;
            SUSPEND;
            END
        END
    if (BIN_AND(TIPO, 8) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 34 INTO :NOMTIPO;
        FOR SELECT PEDI_ID, P.PREF_PRE, PEDI_NUMERO, PEDI_FECHA, PEDI_DTOMONTO, PEDI_ADICIONAL, PEDI_IVAMONTO, PEDI_EXTRA, PEDI_TOTAL, 0, 0, 0,
            T.TERC_NIT, TERC_NOM, ZONA_COD, TERC_TEL, TERC_CIU, TERC_DV, TERC_APELLIDO1, TERC_APELLIDO2, TERC_NOMBRE1, TERC_NOMBRE2, T.CIUD_COD, P.pedi_sucursal
            FROM PEDIDOS P, PREFIJOS PR, terceros T, CLIENTES C
            where C.TERC_NIT = T.TERC_NIT AND T.TERC_CLIE = 'S' AND T.TERC_NIT >= :NITINI AND T.TERC_NIT <= :NITFIN AND TERC_NOM >= :NOMINI AND TERC_NOM <= :NOMFIN
             AND P.TERC_NIT = T.terc_nit AND PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND PEDI_ANULADO = 'N'
             AND P.PREF_PRE = PR.PREF_PRE AND P.TIDO_COD = 34 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            ORDER BY PEDI_FECHA, PEDI_ID
            INTO :ID, :PREFIJO, :NUMERO, :FECDOC, :DTO, :ADICIONAL, :IVA, :EXTRA, :TOTAL, :RTFTE, :RTIVA, :RTICA, :nit, :nombre, :codzona, :telefono, :ciudad, :DV, :APELLIDO1, :APELLIDO2, :NOMBRE1, :NOMBRE2, :CODCIU, :sucursal
            DO
            BEGIN
            SELECT ZONA_NOM FROM ZONAS WHERE ZONA_COD = :codzona INTO :NOMZONA;
            SUBTOTAL = TOTAL - EXTRA - IVA - ADICIONAL + DTO;
            NETO = TOTAL - RTFTE - RTIVA - RTICA;
            SUSPEND;
            END
        END
    if (BIN_AND(TIPO, 16) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 35 INTO :NOMTIPO;
        FOR SELECT COTI_ID, CT.PREF_PRE, COTI_NUMERO, COTI_FECHA, COTI_DTOMONTO, COTI_ADICIONAL, COTI_IVAMONTO, COTI_EXTRA, COTI_TOTAL, 0, 0, 0,
            T.TERC_NIT, TERC_NOM, ZONA_COD, TERC_TEL, TERC_CIU, TERC_DV, TERC_APELLIDO1, TERC_APELLIDO2, TERC_NOMBRE1, TERC_NOMBRE2, T.CIUD_COD, CT.coti_sucursal
            FROM COTIZACIONES CT, PREFIJOS P, terceros T, CLIENTES C
            where C.TERC_NIT = T.TERC_NIT AND T.TERC_CLIE = 'S' AND T.TERC_NIT >= :NITINI AND T.TERC_NIT <= :NITFIN AND TERC_NOM >= :NOMINI AND TERC_NOM <= :NOMFIN
             AND CT.TERC_NIT = T.terc_nit AND COTI_FECHA >= :FECINI AND COTI_FECHA <= :FECFIN AND COTI_ANULADO = 'N'
             AND P.PREF_PRE = CT.PREF_PRE AND P.TIDO_COD = 35 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            ORDER BY COTI_FECHA, COTI_ID
            INTO :ID, :PREFIJO, :NUMERO, :FECDOC, :DTO, :ADICIONAL, :IVA, :EXTRA, :TOTAL, :RTFTE, :RTIVA, :RTICA, :nit, :nombre, :codzona, :telefono, :ciudad, :DV, :APELLIDO1, :APELLIDO2, :NOMBRE1, :NOMBRE2, :CODCIU, :sucursal
            DO
            BEGIN
            SELECT ZONA_NOM FROM ZONAS WHERE ZONA_COD = :codzona INTO :NOMZONA;
            SUBTOTAL = TOTAL - EXTRA - IVA - ADICIONAL + DTO;
            NETO = TOTAL - RTFTE - RTIVA - RTICA;
            SUSPEND;
            END
        END
    END
END
^

SET TERM ; ^

SET TERM ^ ;

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

SET TERM ; ^

SET TERM ^ ;

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

SET TERM ; ^


/* 20090217C UNIDADES ALTERNATIVAS EN NULL */
SET TERM ^ ;

CREATE OR ALTER PROCEDURE REP_VENTAS_ARTICULO(
    TIPO INTEGER,
    ARTINI VARCHAR(20),
    ARTFIN VARCHAR(20),
    DETALLE CHAR(1),
    FECINI DATE,
    FECFIN DATE,
    GRPINI VARCHAR(3),
    GRPFIN VARCHAR(3),
    PTOINI INTEGER,
    PTOFIN INTEGER,
    ORDEN CHAR(1),
    AGRUPA CHAR(1),
    CEROS CHAR(1),
    UNIDADES CHAR(1),
    SUBEMPRESA INTEGER)
RETURNS (
    ARTICULO VARCHAR(15),
    DESCRIPCION VARCHAR(60),
    CODGRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    CODSUBG VARCHAR(3),
    NOMSUBG VARCHAR(30),
    CODMARC VARCHAR(3),
    NOMMARC VARCHAR(30),
    UNIDAD VARCHAR(8),
    CANTIDAD NUMERIC(18,4),
    BASE NUMERIC(18,2),
    IVA NUMERIC(18,2),
    CONSUMO NUMERIC(18,2),
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    DTO NUMERIC(9,2),
    TRANSP VARCHAR(60),
    ALTERNATIVAS NUMERIC(18,4),
    NOMTIPO VARCHAR(50))
AS
DECLARE VARIABLE CODINI VARCHAR(20);
DECLARE VARIABLE CODFIN VARCHAR(20);
DECLARE VARIABLE DESINI VARCHAR(20);
DECLARE VARIABLE DESFIN VARCHAR(20);
declare variable MARINI VARCHAR(3);
declare variable MARFIN VARCHAR(3);
declare variable NUMROWS INTEGER;
declare variable CANTAUX NUMERIC(18,4);
BEGIN
if (ORDEN = 'C') then
    BEGIN
    CODINI = ARTINI;
    CODFIN = ARTFIN;
    DESINI = '';
    DESFIN = 'zz';
    END
ELSE
    BEGIN
    DESINI = ARTINI;
    DESFIN = ARTFIN;
    CODINI = '0';
    CODFIN = 'zz';
    END
if (AGRUPA = 'G') then
    BEGIN
    MARINI = '';
    MARFIN = 'zz';
    END
ELSE
    if (AGRUPA = 'M') then
        BEGIN
        MARINI = GRPINI;
        MARFIN = GRPFIN;
        GRPINI = '';
        GRPFIN = 'zz';
        END
    ELSE
        BEGIN
        MARINI = '';
        MARFIN = 'zz';
        END
/* BORRA LA TABLA AUXILIAR */
DELETE FROM reportes_aux WHERE REPA_ID = 1 AND REPA_USER = USER;

if (DETALLE = 'N') then
    BEGIN
    if (BIN_AND(TIPO, 1) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 31 INTO :NOMTIPO;
        /* BORRA LA TABLA AUXILIAR */
        DELETE FROM reportes_aux WHERE REPA_ID = 1 AND REPA_USER = USER;

        FOR SELECT MAX(D.ARTI_COD), SUM(FADE_CANT * FADE_FACTOR), SUM(FACT_FACTOR*(FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO)),
            SUM(FACT_FACTOR*FADE_IVAMONTO), SUM(FADE_CONSUMO), MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD)
            FROM FACTURAS_DETALLE D, FACTURAS F, PREFIJOS P, ARTICULO A WHERE F.PTVT_ID >= :PTOINI AND F.PTVT_ID <= :PTOFIN AND
            F.FACT_ID = D.FACT_ID AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND D.ARTI_COD = A.arti_cod AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            FACT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) and substring(a.arti_cod from 1 FOR 2) <> '.t'
            GROUP BY D.ARTI_COD
            INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,
            :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
            DO
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            if (UNIDADES = 'S') then
                BEGIN
                SELECT SUM(FADE_CANT), SUM(FADE_CANT*FADE_FACTOR) FROM FACTURAS_DETALLE D, FACTURAS F, PREFIJOS P
                    WHERE F.PTVT_ID >= :PTOINI AND F.PTVT_ID <= :PTOFIN AND D.fade_unidad <> :unidad AND
                    F.FACT_ID = D.FACT_ID AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND
                    D.ARTI_COD = :articulo AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND
                    FACT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) INTO :alternativas, :cantaux;
                if (alternativas IS NULL) then
                    alternativas = 0;
                if (cantaux IS NULL) then
                    cantaux = 0;
                cantidad = cantidad - cantaux;
                END
            if (CEROS = 'S') then
                INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (1, USER, :ARTICULO);
            SUSPEND;
            END
        if (CEROS = 'S') then
            BEGIN
            /* agregue los articulos sin factura */
            FOR SELECT ARTI_COD, 0, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND
                    A.ARTI_DES <= :DESFIN AND A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND
                    (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN)))
                INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,:DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                DO
                BEGIN
                SELECT COUNT(REPA_ARTICULO) FROM REPORTES_AUX WHERE REPA_ID = 1 AND REPA_USER = USER AND REPA_ARTICULO = :articulo INTO :numrows;
                if (numrows = 0) then
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        END

    if (BIN_AND(TIPO, 2) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 32 INTO :NOMTIPO;
        /* BORRA LA TABLA AUXILIAR */
        DELETE FROM reportes_aux WHERE REPA_ID = 1 AND REPA_USER = USER;

        FOR SELECT MAX(D.ARTI_COD), SUM(RVDE_CANT * RVDE_FACTOR), SUM((RVDE_TOTAL-RVDE_IVAMONTO-RVDE_CONSUMO)), SUM(RVDE_IVAMONTO),
            SUM(RVDE_CONSUMO), MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD)
            FROM REMISIONES_VENTA_DETALLE D, REMISIONES_VENTA R, PREFIJOS P, ARTICULO A WHERE R.PTVT_ID >= :PTOINI AND R.PTVT_ID <= :PTOFIN AND
            R.REVT_ID = D.REVT_ID AND P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = 32 AND D.ARTI_COD = A.arti_cod AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            REVT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY D.ARTI_COD
            INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,
            :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
            DO
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            if (UNIDADES = 'S') then
                BEGIN
                SELECT SUM(RVDE_CANT), SUM(RVDE_CANT*RVDE_FACTOR) FROM REMISIONES_VENTA_DETALLE D, REMISIONES_VENTA R, PREFIJOS P
                    WHERE R.PTVT_ID >= :PTOINI AND R.PTVT_ID <= :PTOFIN AND D.rvde_unidad <> :unidad AND
                    R.revt_id = D.revt_id AND P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = 32 AND
                    D.ARTI_COD = :articulo AND REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN AND
                    REVT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) INTO :alternativas, :cantaux;
                if (alternativas IS NULL) then
                    alternativas = 0;
                if (cantaux IS NULL) then
                    cantaux = 0;
                cantidad = cantidad - cantaux;
                END
            if (CEROS = 'S') then
                INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (1, USER, :ARTICULO);
            SUSPEND;
            END
        if (CEROS = 'S') then
            BEGIN
            /* agregue los articulos sin factura */
            FOR SELECT ARTI_COD, 0, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND
                    A.ARTI_DES <= :DESFIN AND A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND
                    (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN)))
                INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,:DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                DO
                BEGIN
                SELECT COUNT(REPA_ARTICULO) FROM REPORTES_AUX WHERE REPA_ID = 1 AND REPA_USER = USER AND REPA_ARTICULO = :articulo INTO :numrows;
                if (numrows = 0) then
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        END

    if (BIN_AND(TIPO, 4) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 33 INTO :NOMTIPO;
        /* BORRA LA TABLA AUXILIAR */
        DELETE FROM reportes_aux WHERE REPA_ID = 1 AND REPA_USER = USER;

        FOR SELECT MAX(D.ARTI_COD), SUM(DVDE_CANT * DVDE_FACTOR), SUM(DEVT_FACTOR*(DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO)),
            SUM(DEVT_FACTOR*DVDE_IVAMONTO), SUM(DVDE_CONSUMO), MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD)
            FROM devoluciones_ventas_detalle D, DEVOLUCIONES_VENTAS V, PREFIJOS P, ARTICULO A WHERE V.PTVT_ID >= :PTOINI AND V.PTVT_ID <= :PTOFIN AND
            V.DEVT_ID = D.DEVT_ID AND P.PREF_PRE = V.PREF_PRE AND P.TIDO_COD = 33 AND D.ARTI_COD = A.arti_cod AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            DEVT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) AND ((DEVT_REMID = 0) or (DEVT_REMID IS NULL))
            GROUP BY D.ARTI_COD
            INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,
            :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
            DO
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            CANTIDAD = CANTIDAD * -1;
            BASE = BASE * -1;
            IVA = IVA * -1;
            CONSUMO = CONSUMO * -1;
            if (UNIDADES = 'S') then
                BEGIN
                SELECT SUM(DVDE_CANT), SUM(DVDE_CANT*DVDE_FACTOR) FROM devoluciones_ventas_detalle D, DEVOLUCIONES_VENTAS V, PREFIJOS P
                    WHERE V.PTVT_ID >= :PTOINI AND V.PTVT_ID <= :PTOFIN AND D.dvde_unidad <> :unidad AND
                    V.devt_id = D.devt_id AND P.PREF_PRE = V.PREF_PRE AND P.TIDO_COD = 33 AND
                    D.ARTI_COD = :articulo AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND
                    DEVT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) INTO :alternativas, :cantaux;
                if (alternativas IS NULL) then
                    alternativas = 0;
                if (cantaux IS NULL) then
                    cantaux = 0;
                cantidad = cantidad - cantaux;
                END
            if (CEROS = 'S') then
                INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (1, USER, :ARTICULO);
            SUSPEND;
            END
        if (CEROS = 'S') then
            BEGIN
            /* agregue los articulos sin factura */
            FOR SELECT ARTI_COD, 0, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND
                    A.ARTI_DES <= :DESFIN AND A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND
                    (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN)))
                INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,:DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                DO
                BEGIN
                SELECT COUNT(REPA_ARTICULO) FROM REPORTES_AUX WHERE REPA_ID = 1 AND REPA_USER = USER AND REPA_ARTICULO = :articulo INTO :numrows;
                if (numrows = 0) then
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        END
    if (BIN_AND(TIPO, 8) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 34 INTO :NOMTIPO;
        /* BORRA LA TABLA AUXILIAR */
        DELETE FROM reportes_aux WHERE REPA_ID = 1 AND REPA_USER = USER;

        FOR SELECT MAX(D.ARTI_COD), SUM(PEDE_CANT * PEDE_FACTOR), SUM(PEDI_FACTOR*(PEDE_TOTAL-PEDE_IVAMONTO-PEDE_CONSUMO)),
            SUM(PEDI_FACTOR*PEDE_IVAMONTO), SUM(PEDE_CONSUMO),
            MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD)
            FROM PEDIDOS_DETALLE D, PEDIDOS P, PREFIJOS R, ARTICULO A WHERE P.PTVT_ID >= :PTOINI AND P.PTVT_ID <= :PTOFIN AND
            P.PEDI_ID = D.PEDI_ID AND P.PREF_PRE = R.PREF_PRE AND R.TIDO_COD = 34 AND D.ARTI_COD = A.arti_cod AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            PEDI_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY D.ARTI_COD
            INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,
            :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
            DO
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            if (UNIDADES = 'S') then
                BEGIN
                SELECT SUM(PEDE_CANT), SUM(PEDE_CANT*PEDE_FACTOR) FROM PEDIDOS_DETALLE D, PEDIDOS P, PREFIJOS R
                    WHERE P.PTVT_ID >= :PTOINI AND P.PTVT_ID <= :PTOFIN AND D.pede_unidad <> :unidad AND
                    P.pedi_id = D.pedi_id AND P.PREF_PRE = R.PREF_PRE AND R.TIDO_COD = 31 AND
                    D.ARTI_COD = :articulo AND PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND
                    PEDI_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) INTO :alternativas, :cantaux;
                if (alternativas IS NULL) then
                    alternativas = 0;
                if (cantaux IS NULL) then
                    cantaux = 0;
                cantidad = cantidad - cantaux;
                END
            if (CEROS = 'S') then
                INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (1, USER, :ARTICULO);
            SUSPEND;
            END
        if (CEROS = 'S') then
            BEGIN
            /* agregue los articulos sin factura */
            FOR SELECT ARTI_COD, 0, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND
                    A.ARTI_DES <= :DESFIN AND A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND
                    (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN)))
                INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,:DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                DO
                BEGIN
                SELECT COUNT(REPA_ARTICULO) FROM REPORTES_AUX WHERE REPA_ID = 1 AND REPA_USER = USER AND REPA_ARTICULO = :articulo INTO :numrows;
                if (numrows = 0) then
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        END
    if (BIN_AND(TIPO, 16) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 35 INTO :NOMTIPO;
        /* BORRA LA TABLA AUXILIAR */
        DELETE FROM reportes_aux WHERE REPA_ID = 1 AND REPA_USER = USER;

        FOR SELECT MAX(D.ARTI_COD), SUM(CTDE_CANT * CTDE_FACTOR), SUM(COTI_FACTOR*(CTDE_TOTAL-CTDE_IVAMONTO-CTDE_CONSUMO)),
            SUM(COTI_FACTOR*CTDE_IVAMONTO), SUM(CTDE_CONSUMO),
            MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD)
            FROM COTIZACIONES_DETALLE D, COTIZACIONES C, PREFIJOS P, ARTICULO A WHERE C.PTVT_ID >= :PTOINI AND C.PTVT_ID <= :PTOFIN AND
            C.COTI_ID = D.COTI_ID AND P.PREF_PRE = C.PREF_PRE AND P.TIDO_COD = 35 AND D.ARTI_COD = A.arti_cod AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND COTI_FECHA >= :FECINI AND COTI_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            COTI_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY D.ARTI_COD
            INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,
            :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
            DO
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            if (UNIDADES = 'S') then
                BEGIN
                SELECT SUM(CTDE_CANT), SUM(CTDE_CANT*CTDE_FACTOR) FROM COTIZACIONES_DETALLE D, COTIZACIONES C, PREFIJOS P
                    WHERE C.PTVT_ID >= :PTOINI AND C.PTVT_ID <= :PTOFIN AND D.ctde_unidad <> :unidad AND
                    C.coti_id = D.coti_id AND P.PREF_PRE = C.PREF_PRE AND P.TIDO_COD = 35 AND
                    D.ARTI_COD = :articulo AND COTI_FECHA >= :FECINI AND COTI_FECHA <= :FECFIN AND
                    COTI_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) INTO :alternativas, :cantaux;
                if (alternativas IS NULL) then
                    alternativas = 0;
                if (cantaux IS NULL) then
                    cantaux = 0;
                cantidad = cantidad - cantaux;
                END
            if (CEROS = 'S') then
                INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (1, USER, :ARTICULO);
            SUSPEND;
            END
        if (CEROS = 'S') then
            BEGIN
            /* agregue los articulos sin factura */
            FOR SELECT ARTI_COD, 0, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND
                    A.ARTI_DES <= :DESFIN AND A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND
                    (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN)))
                INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,:DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                DO
                BEGIN
                SELECT COUNT(REPA_ARTICULO) FROM REPORTES_AUX WHERE REPA_ID = 1 AND REPA_USER = USER AND REPA_ARTICULO = :articulo INTO :numrows;
                if (numrows = 0) then
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        END
    END
ELSE
  if (DETALLE = 'S') then
    BEGIN
    if (BIN_AND(TIPO, 1) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 31 INTO :NOMTIPO;
        FOR SELECT F.PREF_PRE, FACT_NUMERO, FACT_FECHA, D.ARTI_COD, FADE_CANT * FADE_FACTOR, (FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO)*FACT_FACTOR,
        FADE_IVAMONTO*FACT_FACTOR, FADE_CONSUMO, FADE_DTOPORC,
            ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD, FACT_TRANSP
            FROM FACTURAS F, FACTURAS_DETALLE D, PREFIJOS P, ARTICULO A WHERE F.PTVT_ID >= :PTOINI AND F.PTVT_ID <= :PTOFIN AND
                F.FACT_ID = D.FACT_ID AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND D.ARTI_COD = A.arti_cod AND
                A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
                A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND FACT_FECHA >= :FECINI AND
                (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
                FACT_FECHA <= :FECFIN AND FACT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) and substring(a.arti_cod from 1 FOR 2) <> '.t'
            /*ORDER BY D.ARTI_COD, FACT_FECHA, FACT_ID, FADE_ITEM*/
            INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO, :DTO,
                :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :transp
            DO
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            SUSPEND;
            END
        END
    if (BIN_AND(TIPO, 2) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 32 INTO :NOMTIPO;
        FOR SELECT R.PREF_PRE, REVT_NUMERO, REVT_FECHA, D.ARTI_COD, RVDE_CANT * RVDE_FACTOR, (RVDE_TOTAL-RVDE_IVAMONTO-RVDE_CONSUMO), RVDE_IVAMONTO, RVDE_CONSUMO, RVDE_DTOPORC,
            ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD, REVT_TRANSP
            FROM REMISIONES_VENTA R, REMISIONES_VENTA_DETALLE D, PREFIJOS P, ARTICULO A
            WHERE R.REVT_ID = D.REVT_ID AND P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = 32 AND D.ARTI_COD = A.arti_cod AND
                A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
                A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN AND
                (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
                REVT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO, :DTO,
                :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :transp
            DO
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            SUSPEND;
            END
        END
    if (BIN_AND(TIPO, 4) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 33 INTO :NOMTIPO;
        FOR SELECT V.PREF_PRE, DEVT_NUMERO, DEVT_FECHA, D.ARTI_COD, DVDE_CANT * DVDE_FACTOR, (DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO)*DEVT_FACTOR,
            DVDE_IVAMONTO*DEVT_FACTOR, DVDE_CONSUMO, DVDE_DTOPORC,
            ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD 
            FROM DEVOLUCIONES_VENTAS V, DEVOLUCIONES_VENTAS_DETALLE D, PREFIJOS P, ARTICULO A WHERE V.PTVT_ID >= :PTOINI AND V.PTVT_ID <= :PTOFIN AND
                V.DEVT_ID = D.DEVT_ID AND P.PREF_PRE = V.PREF_PRE AND P.TIDO_COD = 33 AND D.ARTI_COD = A.arti_cod AND
                A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
                A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND
                (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
                DEVT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) AND ((DEVT_REMID = 0) or (DEVT_REMID IS NULL))
            /*ORDER BY D.ARTI_COD, DEVT_FECHA, DEVT_ID, DVDE_ITEM*/
            INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO, :DTO,
                :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
            DO
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            CANTIDAD = CANTIDAD * -1;
            BASE = BASE * -1;
            IVA = IVA * -1;
            CONSUMO = CONSUMO * -1;
            SUSPEND;
            END
        END
    if (BIN_AND(TIPO, 8) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 34 INTO :NOMTIPO;
        FOR SELECT P.PREF_PRE, PEDI_NUMERO, PEDI_FECHA, D.ARTI_COD, PEDE_CANT * PEDE_FACTOR, (PEDE_TOTAL-PEDE_IVAMONTO-PEDE_CONSUMO)*PEDI_FACTOR,
                PEDE_IVAMONTO*PEDI_FACTOR, PEDE_CONSUMO, PEDE_DTOPORC,
            ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD 
            FROM PEDIDOS P, PEDIDOS_DETALLE D, PREFIJOS R, ARTICULO A WHERE P.PTVT_ID >= :PTOINI AND P.PTVT_ID <= :PTOFIN AND
                P.PEDI_ID = D.PEDI_ID AND P.PREF_PRE = R.PREF_PRE AND R.TIDO_COD = 34 AND D.ARTI_COD = A.arti_cod AND
                A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
                A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND
                (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
                PEDI_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            /*ORDER BY D.ARTI_COD, PEDI_FECHA, PEDI_ID, PEDE_ITEM*/
            INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO, :DTO,
                :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
            DO
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            SUSPEND;
            END
        END
    if (BIN_AND(TIPO, 16) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 35 INTO :NOMTIPO;
        FOR SELECT C.PREF_PRE, COTI_NUMERO, COTI_FECHA, D.ARTI_COD, CTDE_CANT * CTDE_FACTOR, (CTDE_TOTAL-CTDE_IVAMONTO-CTDE_CONSUMO)*COTI_FACTOR,
                CTDE_IVAMONTO*COTI_FACTOR, CTDE_CONSUMO, CTDE_DTOPORC,
            ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD 
            FROM COTIZACIONES C, COTIZACIONES_DETALLE D, PREFIJOS P, ARTICULO A WHERE C.PTVT_ID >= :PTOINI AND C.PTVT_ID <= :PTOFIN AND
                C.COTI_ID = D.COTI_ID AND P.PREF_PRE = C.PREF_PRE AND P.TIDO_COD = 35 AND D.ARTI_COD = A.arti_cod AND
                A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
                A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND COTI_FECHA >= :FECINI AND COTI_FECHA <= :FECFIN AND
                (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
                COTI_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            /*ORDER BY D.ARTI_COD, COTI_FECHA, COTI_ID, CTDE_ITEM*/
            INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO, :DTO,
                :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
            DO
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            SUSPEND;
            END
        END
    END
  ELSE
    BEGIN
    if (BIN_AND(TIPO, 1) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 31 INTO :NOMTIPO;
        FOR SELECT MAX(D.ARTI_COD), SUM(FADE_CANT * FADE_FACTOR), SUM((FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO)*FACT_FACTOR),
            SUM(FACT_FACTOR*FADE_IVAMONTO), SUM(FADE_CONSUMO), MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD), MAX(FACT_TRANSP)
            FROM FACTURAS_DETALLE D, FACTURAS F, PREFIJOS P, ARTICULO A WHERE F.PTVT_ID >= :PTOINI AND F.PTVT_ID <= :PTOFIN AND
            F.FACT_ID = D.FACT_ID AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND D.ARTI_COD = A.arti_cod AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            FACT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) and substring(a.arti_cod from 1 FOR 2) <> '.t'
            GROUP BY FACT_TRANSP, D.ARTI_COD
            INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,
            :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :transp
            DO
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            if (CEROS = 'S') then
                SUSPEND;
            ELSE
                if ((BASE <> 0) AND (CANTIDAD <> 0)) then
                    SUSPEND;
            END
        END

    if (BIN_AND(TIPO, 2) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 32 INTO :NOMTIPO;
        FOR SELECT MAX(D.ARTI_COD), SUM(RVDE_CANT * RVDE_FACTOR), SUM((RVDE_TOTAL-RVDE_IVAMONTO-RVDE_CONSUMO)), SUM(RVDE_IVAMONTO),
            SUM(RVDE_CONSUMO), MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD), MAX(REVT_TRANSP)
            FROM REMISIONES_VENTA_DETALLE D, REMISIONES_VENTA R, PREFIJOS P, ARTICULO A WHERE R.PTVT_ID >= :PTOINI AND R.PTVT_ID <= :PTOFIN AND
            R.REVT_ID = D.REVT_ID AND P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = 32 AND D.ARTI_COD = A.arti_cod AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            REVT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY REVT_TRANSP, D.ARTI_COD
            INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,
            :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :transp
            DO
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            if (CEROS = 'S') then
                SUSPEND;
            ELSE
                if ((BASE <> 0) AND (CANTIDAD <> 0)) then
                    SUSPEND;
            END
        END
    END
END
^

SET TERM ; ^



update revision set revi_FECHA = '2009/02/17';
COMMIT WORK;

/* 20090218 : SI LA LISTA TIENE AGENCIA 0 NO LA FILTRE POR AGENCIA */
SET TERM ^ ;

CREATE OR ALTER PROCEDURE LISTAS_ARTICULO(
    ARTICULO VARCHAR(15),
    FECHA DATE,
    DIAS INTEGER,
    TODAS CHAR(1),
    HORA TIME,
    AGENCIA INTEGER)
RETURNS (
    NOMLISTA VARCHAR(30),
    CODLISTA INTEGER,
    IVAINC CHAR(1))
AS
declare variable FECINI DATE;
declare variable FECFIN DATE;
declare variable DIA smallint;
declare variable DIASEM smallint;
declare variable HORAINI time;
declare variable HORAFIN time;
declare variable SUCID INTEGER;
declare variable PORAGENCIA CHAR(2);
BEGIN
execute procedure lee_configuracion ('FACTURACION', 'DOCUMENTOS', 'FILTRAR LISTAS DE PRECIOS POR AGENCIA') returning_values (:poragencia);
if (TODAS = 'N') then
    begin
    DIA = EXTRACT(weekday FROM FECHA) + 1;
    /* Busque las listas validas hoy */
    FOR SELECT L.LIPR_COD, LIPR_NOM, LIPR_FECINI, LIPR_FECFIN, LIPR_MODIF, LIPR_DIASEM, LIPR_HORAINI, LIPR_HORAFIN, SUCU_ID
        FROM LISTA_PRECIOS L, PRECIOS_ARTICULO P
        WHERE L.LIPR_COD = P.LIPR_COD AND ARTI_COD = :ARTICULO AND
            ((LIPR_DIASMAX IS NULL) or (LIPR_DIASMAX >= :DIAS))
        INTO :CODLISTA, :NOMLISTA, :FECINI, :FECFIN, :IVAINC, :DIASEM, :HORAINI, :HORAFIN, :SUCID
        DO
          if (FECINI is null) then
            begin
            if ((PORAGENCIA = 'NO') OR ((:AGENCIA = 0) or (:SUCID = :AGENCIA) or (:sucid = 0))) THEN
              SUSPEND;
            end
          else
            begin
            if ((FECINI <= :FECHA) AND (FECFIN >= :FECHA) AND (HORAINI <= HORA) AND (HORAFIN >= HORA) AND ((DIASEM = 0) or (DIA = DIASEM)))  Then
                if ((PORAGENCIA = 'NO') OR ((:AGENCIA = 0) or (:SUCID = :AGENCIA) or (:SUCID = 0))) THEN
                    SUSPEND;
            end
      end
  ELSE
      FOR SELECT L.LIPR_COD, LIPR_NOM, LIPR_MODIF, SUCU_ID
        FROM LISTA_PRECIOS L, PRECIOS_ARTICULO P
        WHERE L.LIPR_COD = P.LIPR_COD AND ARTI_COD = :ARTICULO
        INTO :CODLISTA, :NOMLISTA, :IVAINC, :SUCID
        DO
        if ((PORAGENCIA = 'NO') OR ((:AGENCIA = 0) or (:SUCID = :AGENCIA) or (:SUCID = 0))) THEN
          SUSPEND;
END
^

SET TERM ; ^



/* 20090218b : ARTICULO A APLICAR EN NOTAS DEBITO PROVEEDOR */

ALTER TABLE NOTAS_DEBITO_PROVEEDOR
ADD ARTI_COD T_COD_ARTICULO;

SET TERM ^ ;

CREATE OR ALTER TRIGGER NOTAS_DEBITO_PROVEEDOR_AD FOR NOTAS_DEBITO_PROVEEDOR
ACTIVE AFTER DELETE POSITION 0
AS
declare variable ABONOS integer;
declare variable consec INTEGER;
BEGIN
select enco_consec from comprobante_encabezado where enco_tiporef = 51 and enco_idref = old.ndpr_id into :consec;
if (NOT consec is null) then
  delete from comprobante_detalle where enco_consec = :consec;
delete from comprobante_encabezado where enco_tiporef = 51 and enco_idref = old.ndpr_id;
/* BORRE EL REGISTRO PREVIO */
if ((old.ndpr_id <> 0) and (old.ndpr_anulado = 'N')) then
    begin
    /* Verifique si habia abonos a la nota */
    ABONOS = 0;
    select COUNT(*) FROM SALDOS_DOC_CXPAGAR WHERE SDCP_TIPOREF = 51 AND SDCP_IDREF = OLD.NDPR_ID AND SDCP_ABONO <> 0 INTO :ABONOS;
    if (ABONOS = 0) then
        BEGIN
        /* BORRE EL REGISTRO PREVIO */
        delete from saldos_doc_cxpagar where sdcp_tiporef = 51 and sdcp_idref = old.ndpr_id;
        delete from movimiento_PROVEEDOR where (mvpr_tiporef = 51) and (mvpr_idref = old.ndpr_id);
        delete from movimiento_articulo where  (mvar_tipodoc = 51) and (mvar_idref = old.ndpr_id);
        END
    else
        exception DOCUMENTO_CON_ABONOS 'El cargo de proveedor ' || old.pref_pre || old.ndpr_numero || ' tiene abonos registrados.';
    INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
        VALUES (USER, 51, OLD.ndpr_id, 'D', OLD.pref_pre || OLD.ndpr_numero);
    end
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER NOTAS_DEBITO_PROVEEDOR_AI FOR NOTAS_DEBITO_PROVEEDOR
ACTIVE AFTER INSERT POSITION 0
AS
declare variable COSTO NUMERIC(18,2);
declare variable EXISTENCIA NUMERIC(18,4);
declare variable CODBOD VARCHAR(3);
BEGIN
  if ((NEW.NDPR_ID <> 0) and (new.ndpr_anulado = 'N')) then
    BEGIN
    INSERT INTO SALDOS_DOC_CXPAGAR (SDCP_TIPOREF, SDCP_IDREF, SDCP_FECHA, TERC_NIT, SDCP_RTEFTE, SDCP_RTIVA, SDCP_RTICA, SDCP_ABONO, SDCP_ABRTFTE, SDCP_ABRTIVA, SDCP_ABRTICA, SDCP_DEBITO, SDCP_MONTO, SDCP_TRM)
        VALUES (51, NEW.NDPR_ID, NEW.ndpr_fecha, NEW.terc_nit, NEW.ndpr_rtftemonto, NEW.ndpr_rtivamonto, NEW.ndpr_rticamonto, 0, 0, 0, 0, 'S', NEW.ndpr_monto+NEW.ndpr_ivamonto, NEW.ndpr_trm);
    /* Registre el movimiento del proveedor */
    INSERT INTO MOVIMIENTO_PROVEEDOR (MVPR_ID, TERC_NIT, MVPR_TIPOREF, MVPR_IDREF, MVPR_FECHA, MVPR_VENCE, MVPR_CONC, MVPR_MONTO, MVPR_RTFTE, MVPR_RTIVA, MVPR_RTICA, MVPR_DEBITO, MVPR_ABONO, MVPR_PREFIJO, MVPR_NUMERO, MVPR_TRM)
      VALUES (GEN_ID(ID_MOVPROV, 1), NEW.TERC_NIT, 51, NEW.NDPR_ID, NEW.NDPR_FECHA, NEW.NDPR_VENCE, NEW.NDPR_CONC, NEW.NDPR_MONTO+NEW.ndpr_Ivamonto, NEW.NDPR_RTFTEMONTO, NEW.NDPR_RTIVAMONTO, NEW.NDPR_RTICAMONTO, 'S', 'N', NEW.pref_pre, NEW.ndpr_numero, NEW.ndpr_trm);
    /* afecte el articulo */
    if (new.arti_cod <> '') then
        begin
        /* CALCULE EL NUEVO COSTO */
        execute procedure costo_promedio (new.arti_cod, new.ndpr_fecha) returning_values (:COSTO);
        execute procedure saldo_total_inventario (new.arti_cod, new.ndpr_fecha) returning_values (:EXISTENCIA);
        COSTO = (COSTO * EXISTENCIA + (NEW.ndpr_monto)) / EXISTENCIA;
        FOR SELECT DISTINCT BODE_COD FROM EXISTENCIA WHERE ARTI_COD = NEW.ARTI_COD INTO :CODBOD do
            BEGIN
            execute procedure saldo_inventario (new.arti_cod, :CODBOD, new.ndpr_fecha) returning_values (:EXISTENCIA);
            if (existencia <> 0) then
                BEGIN
                /* SAQUE TODO LO QUE TENGA */
                INSERT INTO MOVIMIENTO_ARTICULO
                  (ARTI_COD, MVAR_CONS, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM, TERC_NIT)
                  VALUES(NEW.ARTI_COD, GEN_ID(ID_MOVARTI,1), :CODBOD, new.ndpr_fecha, 51, NEW.ndpr_id,
                  new.ndpr_conc, :EXISTENCIA, 0, 'N', '', new.pref_pre, new.ndpr_numero, 1, new.terc_nit);
                END
            END
        FOR SELECT DISTINCT BODE_COD, MVAR_CANT FROM MOVIMIENTO_ARTICULO WHERE MVAR_TIPODOC = 51 AND MVAR_IDREF = NEW.ndpr_id
            INTO :CODBOD, :existencia do
            BEGIN
            /* META TODO CON EL NUEVO COSTO */
            INSERT INTO MOVIMIENTO_ARTICULO
              (ARTI_COD, MVAR_CONS, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM, TERC_NIT)
              VALUES(NEW.ARTI_COD, GEN_ID(ID_MOVARTI,1), :CODBOD, new.ndpr_fecha, 51, NEW.ndpr_id,
              new.ndpr_conc, :EXISTENCIA, :COSTO, 'S', '', new.pref_pre, new.ndpr_numero, 1, new.terc_nit);
            END
        /* RECORRA LAS LISTAS DE PRECIOS Y CAMBIE EL PRECIO */
        EXECUTE PROCEDURE CALCULA_PRECIOS(NEW.ARTI_COD, new.ndpr_fecha);
        end
    INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
        VALUES (USER, 51, NEW.ndpr_id, 'I', NEW.pref_pre || NEW.ndpr_numero);
    END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER NOTAS_DEBITO_PROVEEDOR_AU FOR NOTAS_DEBITO_PROVEEDOR
ACTIVE AFTER UPDATE POSITION 0
AS
declare variable ABONOS char(1);
declare variable consec INTEGER;
declare variable COSTO NUMERIC(18,2);
declare variable EXISTENCIA NUMERIC(18,4);
declare variable CODBOD VARCHAR(3);
BEGIN
if (new.ndpr_anulado = 'S') then
    begin
    select enco_consec from comprobante_encabezado where enco_tiporef = 51 and enco_idref = old.ndpr_id into :consec;
    if (NOT consec is null) then
      delete from comprobante_detalle where enco_consec = :consec;
    delete from comprobante_encabezado where enco_tiporef = 51 and enco_idref = old.ndpr_id;
    INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
        VALUES (USER, 51, NEW.ndpr_id, 'A', NEW.pref_pre || NEW.ndpr_numero);
    end

/* BORRE EL REGISTRO PREVIO */
if ((old.ndpr_id <> 0) and (old.ndpr_anulado = 'N')) then
    begin
    /* Verifique si habia abonos a la nota */
    ABONOS = 'N';
    select 'S' FROM SALDOS_DOC_CXPAGAR WHERE SDCP_TIPOREF = 51 AND SDCP_IDREF = OLD.NDPR_ID AND SDCP_ABONO <> 0 INTO :ABONOS;
    if (ABONOS = 'N') then
        BEGIN
        /* BORRE EL REGISTRO PREVIO */
        delete from saldos_doc_cxpagar where sdcp_tiporef = 51 and sdcp_idref = old.ndpr_id;
        delete from movimiento_PROVEEDOR where (mvpr_tiporef = 51) and (mvpr_idref = old.ndpr_id);
        delete from movimiento_articulo where  (mvar_tipodoc = 51) and (mvar_idref = old.ndpr_id);
        END
    else
        exception DOCUMENTO_CON_ABONOS 'El cargo de proveedor ' || old.pref_pre || old.ndpr_numero || ' tiene abonos registrados.';
    end
if ((new.ndpr_id <> 0) and (new.ndpr_anulado = 'N')) then
    begin
    /* Registre el nuevo saldo del documento */
    INSERT INTO SALDOS_DOC_CXPAGAR (SDCP_TIPOREF, SDCP_IDREF, SDCP_FECHA, TERC_NIT, SDCP_RTEFTE, SDCP_RTIVA, SDCP_RTICA, SDCP_ABONO, SDCP_ABRTFTE, SDCP_ABRTIVA, SDCP_ABRTICA, SDCP_DEBITO, SDCP_MONTO, SDCP_TRM)
        VALUES (51, NEW.NDPR_ID, NEW.ndpr_fecha, NEW.terc_nit, NEW.ndpr_rtftemonto, NEW.ndpr_rtivamonto, NEW.ndpr_rticamonto, 0, 0, 0, 0, 'N', NEW.ndpr_monto+NEW.ndpr_ivamonto, NEW.ndpr_trm);
    /* Registre el movimiento del proveedor */
    INSERT INTO MOVIMIENTO_PROVEEDOR (MVPR_ID, TERC_NIT, MVPR_TIPOREF, MVPR_IDREF, MVPR_FECHA, MVPR_VENCE, MVPR_CONC, MVPR_MONTO, MVPR_RTFTE, MVPR_RTIVA, MVPR_RTICA, MVPR_DEBITO, MVPR_ABONO, MVPR_PREFIJO, MVPR_NUMERO, MVPR_TRM)
        VALUES (GEN_ID(ID_MOVPROV, 1), NEW.TERC_NIT, 51, NEW.NDPR_ID, NEW.NDPR_FECHA, NEW.ndpr_vence, NEW.NDPR_CONC, NEW.NDPR_MONTO+NEW.ndpr_ivamonto, NEW.NDPR_RTFTEMONTO, NEW.NDPR_RTIVAMONTO, NEW.NDPR_RTICAMONTO, 'S', 'N', NEW.pref_pre, NEW.ndpr_numero, NEW.ndpr_trm);
    if (new.arti_cod <> '') then
        begin
        /* CALCULE EL NUEVO COSTO */
        execute procedure costo_promedio (new.arti_cod, new.ndpr_fecha) returning_values (:COSTO);
        execute procedure saldo_total_inventario (new.arti_cod, new.ndpr_fecha) returning_values (:EXISTENCIA);
        COSTO = (COSTO * EXISTENCIA + (NEW.ndpr_monto)) / EXISTENCIA;
        FOR SELECT DISTINCT BODE_COD FROM EXISTENCIA WHERE ARTI_COD = NEW.ARTI_COD INTO :CODBOD do
            BEGIN
            execute procedure saldo_inventario (new.arti_cod, :CODBOD, new.ndpr_fecha) returning_values (:EXISTENCIA);
            if (existencia <> 0) then
                BEGIN
                /* SAQUE TODO LO QUE TENGA */
                INSERT INTO MOVIMIENTO_ARTICULO
                  (ARTI_COD, MVAR_CONS, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM, TERC_NIT)
                  VALUES(NEW.ARTI_COD, GEN_ID(ID_MOVARTI,1), :CODBOD, new.ndpr_fecha, 51, NEW.ndpr_id,
                  new.ndpr_conc, :EXISTENCIA, 0, 'N', '', new.pref_pre, new.ndpr_numero, 1, new.terc_nit);
                END
            END
        FOR SELECT DISTINCT BODE_COD, MVAR_CANT FROM MOVIMIENTO_ARTICULO WHERE MVAR_TIPODOC = 51 AND MVAR_IDREF = NEW.ndpr_id
            INTO :CODBOD, :existencia do
            BEGIN
            /* META TODO CON EL NUEVO COSTO */
            INSERT INTO MOVIMIENTO_ARTICULO
              (ARTI_COD, MVAR_CONS, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM, TERC_NIT)
              VALUES(NEW.ARTI_COD, GEN_ID(ID_MOVARTI,1), :CODBOD, new.ndpr_fecha, 51, NEW.ndpr_id,
              new.ndpr_conc, :EXISTENCIA, :COSTO, 'S', '', new.pref_pre, new.ndpr_numero, 1, new.terc_nit);
            END
        /* RECORRA LAS LISTAS DE PRECIOS Y CAMBIE EL PRECIO */
        EXECUTE PROCEDURE CALCULA_PRECIOS(NEW.ARTI_COD, new.ndpr_fecha);
        end
    INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
        VALUES (USER, 51, NEW.ndpr_id, 'U', NEW.pref_pre || NEW.ndpr_numero);
    end
END
^

SET TERM ; ^


/* 20090218C : CUANDO HAY VARIAS BODEGAS HACER UN DESCUENTO A UN ARTICULO DEJA MAL EL COSTO POR NO HACER PRIMERO TODAS LAS SALIDAS Y LUEGO TODAS LAS ENTRADAS */

SET TERM ^ ;

CREATE OR ALTER TRIGGER NOTAS_CREDITO_PROVEEDOR_AI FOR NOTAS_CREDITO_PROVEEDOR
ACTIVE AFTER INSERT POSITION 0
AS
declare variable COSTO NUMERIC(18,2);
declare variable EXISTENCIA NUMERIC(18,4);
declare variable CODBOD VARCHAR(3);
BEGIN
if ((NEW.NCPR_ID <> 0) and (new.ncpr_anulado = 'N')) then
    BEGIN
    /* Registre el nuevo saldo del documento */
    INSERT INTO SALDOS_DOC_CXPAGAR (SDCP_TIPOREF, SDCP_IDREF, SDCP_FECHA, TERC_NIT, SDCP_RTEFTE, SDCP_RTIVA, SDCP_RTICA, SDCP_ABONO, SDCP_ABRTFTE, SDCP_ABRTIVA, SDCP_ABRTICA, SDCP_DEBITO, SDCP_MONTO, SDCP_TRM)
        VALUES (52, NEW.NCPR_ID, NEW.ncpr_fecha, NEW.terc_nit, (NEW.ncpr_rtftemonto * -1), (NEW.ncpr_rtivamonto * -1), (NEW.ncpr_rticamonto * -1), 0, 0, 0, 0, 'N', (NEW.ncpr_monto+NEW.ncpr_ivamonto)*-1, NEW.ncpr_trm);
    /* Registre el movimiento del proveedor */
    INSERT INTO MOVIMIENTO_PROVEEDOR (MVPR_ID, TERC_NIT, MVPR_TIPOREF, MVPR_IDREF, MVPR_FECHA, MVPR_VENCE, MVPR_CONC, MVPR_MONTO, MVPR_RTFTE, MVPR_RTIVA, MVPR_RTICA, MVPR_DEBITO, MVPR_ABONO, MVPR_PREFIJO, MVPR_NUMERO, MVPR_TRM)
      VALUES (GEN_ID(ID_MOVPROV, 1), NEW.TERC_NIT, 52, NEW.NCPR_ID, NEW.NCPR_FECHA, NEW.NCPR_FECHA, NEW.NCPR_CONC, NEW.NCPR_MONTO+NEW.NCPR_IVAMONTO, NEW.NCPR_RTFTEMONTO, NEW.NCPR_RTIVAMONTO, NEW.NCPR_RTICAMONTO, 'N', 'N', NEW.pref_pre, NEW.ncpr_numero, NEW.ncpr_trm);
    /* afecte el articulo */
    if (new.arti_cod <> '') then
        begin
        /* CALCULE EL NUEVO COSTO */
        execute procedure costo_promedio (new.arti_cod, new.ncpr_fecha) returning_values (:COSTO);
        execute procedure saldo_total_inventario (new.arti_cod, new.ncpr_fecha) returning_values (:EXISTENCIA);
        COSTO = ((COSTO * EXISTENCIA) - NEW.ncpr_monto) / EXISTENCIA;
        FOR SELECT DISTINCT BODE_COD FROM EXISTENCIA WHERE ARTI_COD = NEW.ARTI_COD INTO :CODBOD do
            BEGIN
            execute procedure saldo_inventario (new.arti_cod, :CODBOD, new.ncpr_fecha) returning_values (:EXISTENCIA);
            if (EXISTENCIA <> 0) then
                BEGIN
                /* SAQUE TODO LO QUE TENGA */
                INSERT INTO MOVIMIENTO_ARTICULO
                  (ARTI_COD, MVAR_CONS, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM, TERC_NIT)
                  VALUES(NEW.ARTI_COD, GEN_ID(ID_MOVARTI,1), :CODBOD, new.ncpr_fecha, 52, NEW.ncpr_id,
                  new.ncpr_conc, :EXISTENCIA, 0, 'N', '', new.pref_pre, new.ncpr_numero, 1, new.terc_nit);
                END
            END
        FOR SELECT DISTINCT BODE_COD, MVAR_CANT FROM MOVIMIENTO_ARTICULO WHERE MVAR_TIPODOC = 52 AND MVAR_IDREF = NEW.ncpr_id
            INTO :CODBOD, :existencia do
            BEGIN
            /* META TODO CON EL NUEVO COSTO */
            INSERT INTO MOVIMIENTO_ARTICULO
              (ARTI_COD, MVAR_CONS, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM, TERC_NIT)
              VALUES(NEW.ARTI_COD, GEN_ID(ID_MOVARTI,1), :CODBOD, new.ncpr_fecha, 52, NEW.ncpr_id,
              new.ncpr_conc, :EXISTENCIA, :COSTO, 'S', '', new.pref_pre, new.ncpr_numero, 1, new.terc_nit);
            END
        /* RECORRA LAS LISTAS DE PRECIOS Y CAMBIE EL PRECIO */
        EXECUTE PROCEDURE CALCULA_PRECIOS(NEW.ARTI_COD, new.ncpr_fecha);
        end
    INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
        VALUES (USER, 52, NEW.ncpr_id, 'I', NEW.pref_pre || NEW.ncpr_numero);
    END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER NOTAS_CREDITO_PROVEEDOR_AU FOR NOTAS_CREDITO_PROVEEDOR
ACTIVE AFTER UPDATE POSITION 0
AS
declare variable ABONOS char(1);
declare variable consec INTEGER;
declare variable COSTO NUMERIC(18,2);
declare variable EXISTENCIA NUMERIC(18,4);
declare variable CODBOD VARCHAR(3);
BEGIN
if (new.ncpr_anulado = 'S') then
    begin
    select enco_consec from comprobante_encabezado where enco_tiporef = 52 and enco_idref = old.ncpr_id into :consec;
    if (NOT consec is null) then
      delete from comprobante_detalle where enco_consec = :consec;
    delete from comprobante_encabezado where enco_tiporef = 52 and enco_idref = old.ncpr_id;
    INSERT INTO AUDITORIA (AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
        VALUES (USER, 52, new.ncpr_id, 'A', NEW.pref_pre || NEW.ncpr_numero);
    end

/* BORRE EL REGISTRO PREVIO */
if ((old.ncpr_id <> 0) and (old.ncpr_anulado = 'N')) then
    begin
    /* Verifique si habia abonos a la nota */
    ABONOS = 'N';
    select 'S' FROM SALDOS_DOC_CXPAGAR WHERE SDCP_TIPOREF = 52 AND SDCP_IDREF = OLD.NCPR_ID AND SDCP_ABONO <> 0 INTO :ABONOS;
    if (ABONOS = 'N') then
        BEGIN
        /* BORRE EL REGISTRO PREVIO */
        delete from saldos_doc_cxpagar where sdcp_tiporef = 52 and sdcp_idref = old.ncpr_id;
        delete from movimiento_PROVEEDOR where (mvpr_tiporef = 52) and (mvpr_idref = old.ncpr_id);
        delete from movimiento_articulo where  (mvar_tipodoc = 52) and (mvar_idref = old.ncpr_id);
        END
    else
        exception DOCUMENTO_CON_ABONOS 'El descuento de proveedor ' || old.pref_pre || old.ncpr_numero || ' tiene abonos registrados.';
    end
if ((new.ncpr_id <> 0) and (new.ncpr_anulado = 'N')) then
    begin
    /* Registre el nuevo saldo del documento */
    INSERT INTO SALDOS_DOC_CXPAGAR (SDCP_TIPOREF, SDCP_IDREF, SDCP_FECHA, TERC_NIT, SDCP_RTEFTE, SDCP_RTIVA, SDCP_RTICA, SDCP_ABONO, SDCP_ABRTFTE, SDCP_ABRTIVA, SDCP_ABRTICA, SDCP_DEBITO, SDCP_MONTO, SDCP_TRM)
        VALUES (52, NEW.NCPR_ID, NEW.ncpr_fecha, NEW.terc_nit, (NEW.ncpr_rtftemonto * -1), (NEW.ncpr_rtivamonto * -1), (NEW.ncpr_rticamonto * -1), 0, 0, 0, 0, 'N', (NEW.ncpr_monto+NEW.ncpr_ivamonto)*-1, NEW.ncpr_trm);
    /* Registre el movimiento del proveedor */
    INSERT INTO MOVIMIENTO_PROVEEDOR (MVPR_ID, TERC_NIT, MVPR_TIPOREF, MVPR_IDREF, MVPR_FECHA, MVPR_VENCE, MVPR_CONC, MVPR_MONTO, MVPR_RTFTE, MVPR_RTIVA, MVPR_RTICA, MVPR_DEBITO, MVPR_ABONO, MVPR_PREFIJO, MVPR_NUMERO, MVPR_TRM)
        VALUES (GEN_ID(ID_MOVPROV, 1), NEW.TERC_NIT, 52, NEW.NCPR_ID, NEW.NCPR_FECHA, NEW.NCPR_FECHA, NEW.NCPR_CONC, NEW.NCPR_MONTO+NEW.ncpr_ivamonto, NEW.NCPR_RTFTEMONTO, NEW.NCPR_RTIVAMONTO, NEW.NCPR_RTICAMONTO, 'N', 'N', NEW.pref_pre, NEW.ncpr_numero, NEW.ncpr_trm);
    /* afecte el articulo */
    if (new.arti_cod <> '') then
        begin
        /* CALCULE EL NUEVO COSTO */
        execute procedure costo_promedio (new.arti_cod, new.ncpr_fecha) returning_values (:COSTO);
        execute procedure saldo_total_inventario (new.arti_cod, new.ncpr_fecha) returning_values (:EXISTENCIA);
        COSTO = ((COSTO * EXISTENCIA) - NEW.ncpr_monto) / EXISTENCIA;
        FOR SELECT DISTINCT BODE_COD FROM EXISTENCIA WHERE ARTI_COD = NEW.ARTI_COD INTO :CODBOD do
            BEGIN
            execute procedure saldo_inventario (new.arti_cod, :CODBOD, new.ncpr_fecha) returning_values (:EXISTENCIA);
            if (EXISTENCIA <> 0) then
                BEGIN
                /* SAQUE TODO LO QUE TENGA */
                INSERT INTO MOVIMIENTO_ARTICULO
                    (ARTI_COD, MVAR_CONS, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM, TERC_NIT)
                    VALUES(NEW.ARTI_COD, GEN_ID(ID_MOVARTI,1), :CODBOD, new.ncpr_fecha, 52, NEW.ncpr_id,
                    new.ncpr_conc, :EXISTENCIA, 0, 'N', '', new.pref_pre, new.ncpr_numero, 1, new.terc_nit);
                end
            END
        FOR SELECT DISTINCT BODE_COD, MVAR_CANT FROM MOVIMIENTO_ARTICULO WHERE MVAR_TIPODOC = 52 AND MVAR_IDREF = NEW.ncpr_id
            INTO :CODBOD, :existencia do
            BEGIN
            /* META TODO CON EL NUEVO COSTO */
            INSERT INTO MOVIMIENTO_ARTICULO
                (ARTI_COD, MVAR_CONS, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM, TERC_NIT)
                VALUES(NEW.ARTI_COD, GEN_ID(ID_MOVARTI,1), :CODBOD, new.ncpr_fecha, 52, NEW.ncpr_id,
                new.ncpr_conc, :EXISTENCIA, :COSTO, 'S', '', new.pref_pre, new.ncpr_numero, 1, new.terc_nit);
            END
        /* RECORRA LAS LISTAS DE PRECIOS Y CAMBIE EL PRECIO */
        EXECUTE PROCEDURE CALCULA_PRECIOS(NEW.ARTI_COD, new.ncpr_fecha);
        end
    INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
        VALUES (USER, 52, NEW.ncpr_id, 'U', NEW.pref_pre || NEW.ncpr_numero);
    end
END
^

SET TERM ; ^


/* 20090218D : BASES E IVAS DE DEVOLUCIONES VACIO POR NO VALIDAR LOS NULOS EN REFERENCIA */

SET TERM ^ ;

CREATE OR ALTER PROCEDURE IMPUESTOS_VENTAS(
    FECINI DATE,
    FECFIN DATE,
    PREFIJO VARCHAR(4),
    PTOINI INTEGER,
    PTOFIN INTEGER,
    ANULADOS CHAR(1),
    SUBEMPRESA INTEGER)
RETURNS (
    TIPO INTEGER,
    NOMTIPO VARCHAR(30),
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    NIT VARCHAR(20),
    NOMTERCERO VARCHAR(60),
    SUBTOTAL NUMERIC(18,2),
    DTOMONTO NUMERIC(18,2),
    ADICIONAL NUMERIC(18,2),
    IVAMONTO NUMERIC(18,2),
    CONSUMO NUMERIC(18,2),
    EXENTOS NUMERIC(18,2),
    GRAVADOS1 NUMERIC(18,2),
    GRAVADOS2 NUMERIC(18,2),
    GRAVADOS3 NUMERIC(18,2),
    IVA1 NUMERIC(18,2),
    IVA2 NUMERIC(18,2),
    IVA3 NUMERIC(18,2),
    EXTRA NUMERIC(18,2),
    TOTAL NUMERIC(18,2),
    RTFTEMONTO NUMERIC(18,2),
    RTIVAMONTO NUMERIC(18,2),
    RTICAMONTO 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);
BEGIN
/* FACTURA */
TIPO = 31;
SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 31 INTO :NOMTIPO;

FOR SELECT FACT_ID, F.PREF_PRE, FACT_NUMERO, FACT_FECHA, TERC_NIT, FACT_NOMCLIENTE, FACT_ADICIONAL-FACT_DTOMONTO, FACT_IVAMONTO, FACT_RTFTEMONTO, FACT_RTIVAMONTO, FACT_RTICAMONTO, FACT_EXTRA, FACT_TOTAL, FACT_ANULADO
    FROM FACTURAS F, PREFIJOS PR WHERE PTVT_ID >= :PTOINI AND PTVT_ID <= :PTOFIN AND
    FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND ((:PREFIJO = '') or (:PREFIJO IS NULL) or (F.PREF_PRE = :PREFIJO))
    AND PR.PREF_PRE = F.PREF_PRE AND PR.TIDO_COD = 31 AND ((PR.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
    ORDER BY FACT_FECHA, F.PREF_PRE, FACT_NUMERO
    INTO :ID, :PREF, :NUMERO, :FECHA, :NIT, :NOMTERCERO, :DTOMONTO, :IVAMONTO, :RTFTEMONTO, :RTIVAMONTO, :RTICAMONTO, :EXTRA, :TOTAL, :ANULADO
    DO
    BEGIN
    SELECT TERC_EXENTO FROM TERCEROS WHERE TERC_NIT = :NIT INTO :TER_EXENTO;
    if ((ANULADOS = 'S') or (ANULADO = 'N')) then
        BEGIN
        if (ANULADO = 'S') then
            BEGIN
            EXENTOS = 0;
            GRAVADOS1 = 0;
            GRAVADOS2 = 0;
            GRAVADOS3 = 0;
            CONSUMO = 0;
            SUBTOTAL = 0;
            TOTAL = 0;
            EXTRA = 0;
            IVAMONTO = 0;
            DTOMONTO = 0;
            NETO = 0;
            RTFTEMONTO = 0;
            RTIVAMONTO = 0;
            RTICAMONTO = 0;
            END
        else
            BEGIN
            /* CALCULE LAS DIFERENTES TARIFAS */
            if (TER_EXENTO = 'S') then
                BEGIN
                SELECT SUM(FADE_TOTAL - FADE_IVAMONTO - FADE_CONSUMO) FROM FACTURAS_DETALLE D WHERE FACT_ID = :ID AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL)) INTO :EXENTOS;
                GRAVADOS1 = 0;
                GRAVADOS2 = 0;
                GRAVADOS3 = 0;
                end
            else
                begin
                SELECT SUM(FADE_TOTAL - FADE_IVAMONTO - FADE_CONSUMO) FROM FACTURAS_DETALLE D WHERE FACT_ID = :ID AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL)) AND FADE_IVAPORC = 0 INTO :EXENTOS;
                SELECT SUM(FADE_TOTAL - FADE_IVAMONTO - FADE_CONSUMO), SUM(FADE_IVAMONTO) FROM FACTURAS_DETALLE D, TARIFA_IVA T WHERE FACT_ID = :ID AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL)) AND FADE_IVAPORC = TAIV_PORC AND TAIV_COD = 1 INTO :GRAVADOS1, :IVA1;
                SELECT SUM(FADE_TOTAL - FADE_IVAMONTO - FADE_CONSUMO), SUM(FADE_IVAMONTO) FROM FACTURAS_DETALLE D, TARIFA_IVA T WHERE FACT_ID = :ID AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL)) AND FADE_IVAPORC = TAIV_PORC AND TAIV_COD = 2 INTO :GRAVADOS2, :IVA2;
                SELECT SUM(FADE_TOTAL - FADE_IVAMONTO - FADE_CONSUMO), SUM(FADE_IVAMONTO) FROM FACTURAS_DETALLE D, TARIFA_IVA T WHERE FACT_ID = :ID AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL)) AND FADE_IVAPORC = TAIV_PORC AND TAIV_COD = 3 INTO :GRAVADOS3, :IVA3;
                end
            if (iva1 is null) then
                iva1 = 0;
            if (iva2 is null) then
                iva2 = 0;
            if (iva3 is null) then
                iva3 = 0;
            IVAMONTO = IVA1 + IVA2 + IVA3;
            SELECT SUM(FADE_CONSUMO) FROM FACTURAS_DETALLE WHERE FACT_ID = :ID AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL)) INTO :CONSUMO;
            SUBTOTAL = TOTAL - EXTRA - IVAMONTO - DTOMONTO;
            NETO = TOTAL - RTFTEMONTO - RTIVAMONTO - RTICAMONTO;
            END
        if (exentos is null) then
            exentos = 0;
        if (gravados1 is null) then
            gravados1 = 0;
        if (gravados2 is null) then
            gravados2 = 0;
        if (gravados3 is null) then
            gravados3 = 0;
        if (consumo is null) then
            consumo = 0;
        SUSPEND;
        END
    END
    
TIPO = 33;
SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 33 INTO :NOMTIPO;
/* DEVOLUCIONES */
FOR SELECT DEVT_ID, D.PREF_PRE, DEVT_NUMERO, DEVT_FECHA, TERC_NIT, DEVT_NOMTERC, DEVT_ADICIONAL-DEVT_DTOMONTO, DEVT_IVAMONTO, DEVT_RTFTEMONTO, DEVT_RTIVAMONTO, DEVT_RTICAMONTO, DEVT_EXTRA, DEVT_TOTAL, DEVT_ANULADO
    FROM DEVOLUCIONES_VENTAS D, PREFIJOS PR WHERE PTVT_ID >= :PTOINI AND PTVT_ID <= :PTOFIN AND
    DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND ((:PREFIJO = '') or (:PREFIJO IS NULL) or (D.PREF_PRE = :PREFIJO))
    AND PR.PREF_PRE = D.PREF_PRE AND PR.TIDO_COD = 33 AND ((PR.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) AND ((DEVT_REMID = 0) or (DEVT_REMID IS NULL))
    ORDER BY DEVT_FECHA, D.PREF_PRE, DEVT_NUMERO
    INTO :ID, :PREF, :NUMERO, :FECHA, :NIT, :NOMTERCERO, :DTOMONTO, :IVAMONTO, :RTFTEMONTO, :RTIVAMONTO, :RTICAMONTO, :EXTRA, :TOTAL, :ANULADO
    DO
    BEGIN
    SELECT TERC_EXENTO FROM TERCEROS WHERE TERC_NIT = :NIT INTO :TER_EXENTO;
    if ((ANULADOS = 'S') or (ANULADO = 'N')) then
        BEGIN
        if (ANULADO = 'S') then
            BEGIN
            EXENTOS = 0;
            GRAVADOS1 = 0;
            GRAVADOS2 = 0;
            GRAVADOS3 = 0;
            CONSUMO = 0;
            SUBTOTAL = 0;
            TOTAL = 0;
            EXTRA = 0;
            IVAMONTO = 0;
            DTOMONTO = 0;
            NETO = 0;
            RTFTEMONTO = 0;
            RTIVAMONTO = 0;
            RTICAMONTO = 0;
            END
        else
            BEGIN
            DTOMONTO = DTOMONTO * -1;
            ADICIONAL = ADICIONAL * -1;
            IVAMONTO = IVAMONTO * -1;
            EXTRA = EXTRA * -1;
            TOTAL = TOTAL * -1;
            RTFTEMONTO = RTFTEMONTO * -1;
            RTIVAMONTO = RTIVAMONTO * -1;
            RTICAMONTO = RTICAMONTO * -1;
            /* CALCULE LAS DIFERENTES TARIFAS */
            if (TER_EXENTO = 'S') then
             BEGIN
              SELECT SUM(DVDE_TOTAL - DVDE_IVAMONTO - DVDE_CONSUMO) FROM DEVOLUCIONES_VENTAS_DETALLE D WHERE DEVT_ID = :ID AND DVDE_REFERENCIA <> '.t' INTO :EXENTOS;
              GRAVADOS1 = 0;
              GRAVADOS2 = 0;
              GRAVADOS3 = 0;
             end
            else
             begin
              SELECT SUM(DVDE_TOTAL - DVDE_IVAMONTO - DVDE_CONSUMO) FROM DEVOLUCIONES_VENTAS_DETALLE D WHERE DEVT_ID = :ID AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL)) AND DVDE_IVAPORC = 0 INTO :EXENTOS;
              SELECT SUM(DVDE_TOTAL - DVDE_IVAMONTO - DVDE_CONSUMO), SUM(DVDE_IVAMONTO) FROM DEVOLUCIONES_VENTAS_DETALLE D, TARIFA_IVA T WHERE DEVT_ID = :ID AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL)) AND DVDE_IVAPORC = TAIV_PORC AND TAIV_COD = 1 INTO :GRAVADOS1, :IVA1;
              SELECT SUM(DVDE_TOTAL - DVDE_IVAMONTO - DVDE_CONSUMO), SUM(DVDE_IVAMONTO) FROM DEVOLUCIONES_VENTAS_DETALLE D, TARIFA_IVA T WHERE DEVT_ID = :ID AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL)) AND DVDE_IVAPORC = TAIV_PORC AND TAIV_COD = 2 INTO :GRAVADOS2, :IVA2;
              SELECT SUM(DVDE_TOTAL - DVDE_IVAMONTO - DVDE_CONSUMO), SUM(DVDE_IVAMONTO) FROM DEVOLUCIONES_VENTAS_DETALLE D, TARIFA_IVA T WHERE DEVT_ID = :ID AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL)) AND DVDE_IVAPORC = TAIV_PORC AND TAIV_COD = 3 INTO :GRAVADOS3, :IVA3;
             end
            if (iva1 is null) then
                iva1 = 0;
            if (iva2 is null) then
                iva2 = 0;
            if (iva3 is null) then
                iva3 = 0;
            IVAMONTO = IVA1 + IVA2 + IVA3;
            SELECT SUM(DVDE_CONSUMO) FROM DEVOLUCIONES_VENTAS_DETALLE WHERE DEVT_ID = :ID AND DVDE_REFERENCIA <> '.t' INTO :CONSUMO;
            EXENTOS = EXENTOS * -1;
            GRAVADOS1 = GRAVADOS1 * -1;
            GRAVADOS2 = GRAVADOS2 * -1;
            GRAVADOS3 = GRAVADOS3 * -1;
            CONSUMO = CONSUMO * -1;
            IVA1 = IVA1 * -1;
            IVA2 = IVA2 * -1;
            IVA3 = IVA3 * -1;
            IVAMONTO = IVAMONTO * -1;
            SUBTOTAL = TOTAL - EXTRA - IVAMONTO - DTOMONTO;
            NETO = TOTAL - RTFTEMONTO - RTIVAMONTO - RTICAMONTO;
            END
        if (exentos is null) then
            exentos = 0;
        if (gravados1 is null) then
            gravados1 = 0;
        if (gravados2 is null) then
            gravados2 = 0;
        if (gravados3 is null) then
            gravados3 = 0;
        if (consumo is null) then
            consumo = 0;
        SUSPEND;
        END
    END
execute procedure lee_configuracion ('FACTURACION', 'DOCUMENTOS', 'INCLUIR NOTAS DE CARTERA EN REPORTE DE IMPUESTOS EN VENTAS') returning_values (:NOTAS);
if (NOTAS = 'SI') then
    BEGIN
    TIPO = 41;
    SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 41 INTO :NOMTIPO;
    FOR SELECT NDCL_ID, N.PREF_PRE, NDCL_NUMERO, NDCL_FECHA, N.TERC_NIT, TERC_NOM, 0, NDCL_IVAMONTO, NDCL_RTFTEMONTO, NDCL_RTIVAMONTO, NDCL_RTICAMONTO, 0, NDCL_MONTO+NDCL_IVAMONTO, NDCL_ANULADO
        FROM NOTAS_DEBITO_CLIENTES N, TERCEROS T, PREFIJOS PR WHERE N.TERC_NIT = T.TERC_NIT AND
        NDCL_FECHA >= :FECINI AND NDCL_FECHA <= :FECFIN AND ((:PREFIJO = '') or (:PREFIJO IS NULL) or (N.PREF_PRE = :PREFIJO))
        AND PR.PREF_PRE = N.PREF_PRE AND PR.TIDO_COD = 41 AND ((PR.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
        ORDER BY NDCL_FECHA, N.PREF_PRE, NDCL_NUMERO
        INTO :ID, :PREF, :NUMERO, :FECHA, :NIT, :NOMTERCERO, :DTOMONTO, :IVAMONTO, :RTFTEMONTO, :RTIVAMONTO, :RTICAMONTO, :EXTRA, :TOTAL, :ANULADO
        DO
        BEGIN
        GRAVADOS2 = 0;
        GRAVADOS3 = 0;
        IVA2 = 0;
        IVA3 = 0;
        CONSUMO = 0;
        if (ANULADO = 'S') then
            BEGIN
            EXENTOS = 0;
            GRAVADOS1 = 0;
            SUBTOTAL = 0;
            TOTAL = 0;
            EXTRA = 0;
            IVAMONTO = 0;
            DTOMONTO = 0;
            NETO = 0;
            RTFTEMONTO = 0;
            RTIVAMONTO = 0;
            RTICAMONTO = 0;
            END
        ELSE
            BEGIN
            if (IVAMONTO <> 0) then
                BEGIN
                GRAVADOS1 = TOTAL-IVAMONTO;
                IVA1 = IVAMONTO;
                exentos = 0;
                END
            ELSE
                BEGIN
                GRAVADOS1 = 0;
                IVA1 = 0;
                exentos = TOTAL;
                END
            SUBTOTAL = TOTAL - EXTRA - IVAMONTO - DTOMONTO;
            NETO = TOTAL - RTFTEMONTO - RTIVAMONTO - RTICAMONTO;
            END
        SUSPEND;
        END

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

SET TERM ; ^



/* 20090219 : AGRGUE DE UNA VEZ EL 2010 */
UPDATE CONFIGURACION
SET CONF_POSIBLES = '2004,2005,2006,2007,2008,2009,2010'
WHERE (CONF_MODULO = 'CONTABILIDAD') AND (CONF_CATEGORIA = 'GENERAL') AND (CONF_PROPIEDAD = 'AÑO DE INICIO');

/* 20090220 : SEPARAR EN DOS COLUMNAS LA UNIDAD ALTERNATIVA Y SU FACTOR EN REPORTE DE AKTIVIA*/

SET TERM ^ ;

CREATE OR ALTER PROCEDURE AKTIVIA_PRODUCTOS
RETURNS (
    CODIGO VARCHAR(15),
    BARRAS VARCHAR(15),
    DESCR VARCHAR(60),
    IVA NUMERIC(9,2),
    ICO NUMERIC(18,2),
    UNIDAD VARCHAR(8),
    UNIDADES VARCHAR(100),
    GRUPO VARCHAR(30),
    MARCA VARCHAR(30),
    LISTA1 NUMERIC(18,2),
    LISTA2 NUMERIC(18,2),
    LISTA3 NUMERIC(18,2),
    LISTA4 NUMERIC(18,2),
    LISTA5 NUMERIC(18,2),
    LISTA6 NUMERIC(18,2),
    LISTA7 NUMERIC(18,2),
    LISTA8 NUMERIC(18,2))
AS
declare variable UNIDAD2 VARCHAR(8);
declare variable FACTOR NUMERIC(18,4);
begin
FOR select a.arti_cod, arti_des, a.grup_cod, marc_cod, arti_unidad, coba_cod, t.taiv_porc, a.arti_consumo
    from articulo a, barras_articulo b, tarifa_iva t WHERE A.arti_cod = B.arti_cod
    INTO  :codigo, :descr, :grupo, :marca, :unidad, :barras, :iva, :ico
    do
    BEGIN
    SELECT GRUP_NOM FROM GRUPO WHERE GRUP_COD = :grupo INTO :grupo;
    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :marca INTO :marca;
    UNIDADES = '';
    FOR SELECT FIRST 1 UNAR_UNIDAD, UNAR_FACCAN FROM unidad_articulo WHERE ARTI_COD = :CODIGO AND UNAR_ACTIVA = 'S' INTO :unidad2, :factor
        DO
        BEGIN
        UNIDADES = unidad2 || ',' || cast(factor as varchar(20));
        END
    if (UNIDADES = '') then
        UNIDADES = ',';
    SELECT PRAR_FIJO FROM precios_articulo WHERE ARTI_COD = :codigo and lipr_cod = 1 INTO :LISTA1;
    SELECT PRAR_FIJO FROM precios_articulo WHERE ARTI_COD = :codigo and lipr_cod = 2 INTO :LISTA2;
    SELECT PRAR_FIJO FROM precios_articulo WHERE ARTI_COD = :codigo and lipr_cod = 3 INTO :LISTA3;
    SELECT PRAR_FIJO FROM precios_articulo WHERE ARTI_COD = :codigo and lipr_cod = 4 INTO :LISTA4;
    SELECT PRAR_FIJO FROM precios_articulo WHERE ARTI_COD = :codigo and lipr_cod = 5 INTO :LISTA5;
    SELECT PRAR_FIJO FROM precios_articulo WHERE ARTI_COD = :codigo and lipr_cod = 6 INTO :LISTA6;
    SELECT PRAR_FIJO FROM precios_articulo WHERE ARTI_COD = :codigo and lipr_cod = 7 INTO :LISTA7;
    SELECT PRAR_FIJO FROM precios_articulo WHERE ARTI_COD = :codigo and lipr_cod = 8 INTO :LISTA8;
    suspend;
    END
end
^

SET TERM ; ^


SET TERM ^ ;

CREATE OR ALTER PROCEDURE AKTIVIA_CLIENTES
RETURNS (
    CODCLIE VARCHAR(20),
    NOM VARCHAR(60),
    CODSUC VARCHAR(10),
    DIR VARCHAR(60),
    TEL VARCHAR(40),
    EMAIL VARCHAR(100),
    NIT VARCHAR(20),
    FPAGO INTEGER,
    SUBZONA VARCHAR(2),
    CUPO NUMERIC(18,2),
    CEL VARCHAR(25),
    LISTA INTEGER,
    GRUPO INTEGER,
    CIU VARCHAR(40),
    CODCIU VARCHAR(6),
    ZONA VARCHAR(2),
    VEND INTEGER,
    COBR INTEGER)
AS
BEGIN
subzona = '';
for select t.terc_nit,terc_nom,terc_dir,terc_ciu,terc_tel,terc_email,terc_cel,c.clie_cod,c.zona_cod,c.clie_cupo,c.vend_cod, c.cobr_cod, c.lipr_cod, c.clie_dias,T.ciud_cod, s.clcu_cod, c.grca_cod
    from terceros t,clientes c, cliente_sucursales s
    where t.terc_nit = c.terc_nit and s.terc_nit = c.terc_nit AND C.clie_estado = 'A'
    order by t.terc_nit, s.clcu_cod
    into :nit, :nom, :dir, :ciu, :tel, :email, :cel, :codclie, :zona, :cupo, :vend, :cobr, :lista, :fpago, :codciu, :codsuc, :grupo
    do
    begin
    if (LISTA IS NULL) then
        EXECUTE PROCEDURE lee_configuracion ('FACTURACION','FACTURAS', 'CODIGO DE LA LISTA DE PRECIOS A MOSTRAR EN ARTICULOS') returning_values (:LISTA);
    if (GRUPO IS NULL) then
        GRUPO = 1;
    if (fpago > 0) then
        FPAGO = 1;
    suspend;
    end
end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER PROCEDURE AKTIVIA_CARTERA(
    FECHA DATE)
RETURNS (
    NIT VARCHAR(20),
    SUCURSAL VARCHAR(10),
    SALDO NUMERIC(18,2),
    VENCE DATE,
    NUMERO VARCHAR(10),
    TIPONOM VARCHAR(8))
AS
declare variable TIPO INTEGER;
declare variable ID INTEGER;
BEGIN
FOR select C.TERC_NIT, CLCU_COD
    from terceros T, CLIENTES C, CLIENTE_SUCURSALES S
    where C.TERC_NIT = T.TERC_NIT AND TERC_CLIE = 'S' AND S.TERC_NIT = C.TERC_NIT
    INTO :NIT, :SUCURSAL
    DO  
    BEGIN
    /* BUSQUE EN SALDOS_DOC_CARTERA LOS QUE TENGAN SALDO > 0 */
    FOR SELECT MVCL_TIPOREF, MVCL_IDREF, MVCL_PREFREF || MVCL_NUMREF, MVCL_VENCE
        FROM MOVIMIENTO_CLIENTES WHERE TERC_NIT = :NIT AND MVCL_SUCURSAL = :SUCURSAL AND MVCL_FECHA <= :FECHA AND MVCL_ABONO = 'N'
        INTO :TIPO, :ID, :NUMERO, :VENCE
        DO
        BEGIN
        EXECUTE PROCEDURE saldo_doc_cartera(TIPO, ID, FECHA, 0) returning_values (SALDO);
        if (SALDO <> 0) then
            BEGIN
            SELECT TIDO_NOMCORTO FROM TIPO_DOCUMENTO WHERE TIDO_COD = :TIPO INTO :TIPONOM;
            SUSPEND;
            END  /* FOR */
        END
    END
END
^

SET TERM ; ^


/* 20090220B : INVIERTA EL ORDEN DEL CALCULO DEL PESO PARA MINIMIZAR UN INTEGER OVERFLOW */
SET TERM ^ ;

CREATE OR ALTER PROCEDURE IMPR_FACTURA(
    ID INTEGER)
RETURNS (
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    VENCE DATE,
    DIASVENCE INTEGER,
    CONTCRED CHAR(17),
    NIT VARCHAR(20),
    NOMTERCERO VARCHAR(60),
    NOMCLIENTE VARCHAR(60),
    VENDEDOR INTEGER,
    NOMVENDEDOR VARCHAR(60),
    PUNTOVTA INTEGER,
    NOMPUNTOVTA VARCHAR(30),
    CODBODEGA VARCHAR(2),
    NOMBODEGA VARCHAR(30),
    AUTORIZACION VARCHAR(20),
    DESPACHO VARCHAR(255),
    TRANSPORTADOR VARCHAR(60),
    COTIZACION VARCHAR(30),
    PEDIDO VARCHAR(30),
    REMISION VARCHAR(30),
    PACIENTE VARCHAR(20),
    NOMPACIENTE VARCHAR(60),
    COMIPORC NUMERIC(9,2),
    COMIMONTO NUMERIC(18,2),
    SUBTOTAL NUMERIC(18,2),
    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),
    EXTRA NUMERIC(18,2),
    DTOFPORC NUMERIC(9,2),
    DTOFMONTO NUMERIC(18,2),
    FECHADTO DATE,
    TOTALFAC NUMERIC(18,2),
    TOTALPAGAR NUMERIC(18,2),
    OBS BLOB SUB_TYPE 1 SEGMENT SIZE 80,
    ITEM INTEGER,
    ARTICULO VARCHAR(15),
    CODBAR VARCHAR(15),
    ARTIDES VARCHAR(60),
    DESCORTA VARCHAR(30),
    CANT NUMERIC(18,4),
    LOTE VARCHAR(15),
    VLOTE DATE,
    UNIDAD VARCHAR(8),
    CAJAS NUMERIC(18,4),
    FACTOR NUMERIC(18,4),
    LISTAPR INTEGER,
    REFITEM VARCHAR(60),
    BODITEM VARCHAR(2),
    STAND VARCHAR(15),
    PRUNIT NUMERIC(18,2),
    DTOITPORC NUMERIC(9,2),
    DTOITMONTO NUMERIC(18,2),
    PRNETO NUMERIC(18,2),
    PRNETOSINIVA NUMERIC(18,2),
    DTOIT1 NUMERIC(9,2),
    DTOIT2 NUMERIC(9,2),
    DTOIT3 NUMERIC(9,2),
    IVAPORC NUMERIC(9,2),
    IVAITMONTO NUMERIC(18,2),
    CONSUMO NUMERIC(18,2),
    SUBTOTIT NUMERIC(18,2),
    TOTAL NUMERIC(18,2),
    CODIGOCL VARCHAR(20),
    ZONACOD VARCHAR(2),
    ZONANOM VARCHAR(60),
    DV CHAR(1),
    DIRECCION VARCHAR(60),
    CIUDAD VARCHAR(40),
    TELEFONO VARCHAR(40),
    CONTACTO VARCHAR(60),
    FAX VARCHAR(25),
    GRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    SUBGRUPO VARCHAR(3),
    NOMSUBG VARCHAR(30),
    MARCA VARCHAR(3),
    NOMMARCA VARCHAR(30),
    PESO NUMERIC(18,4),
    ANCHO NUMERIC(18,4),
    ALTO NUMERIC(18,4),
    LARGO NUMERIC(18,4),
    SUMA1 NUMERIC(18,2),
    SUMA2 NUMERIC(18,2),
    SUMA3 NUMERIC(18,2),
    IVA1 NUMERIC(18,2),
    IVA2 NUMERIC(18,2),
    IVA3 NUMERIC(18,2),
    SUMAEX NUMERIC(18,2),
    SUMAGR NUMERIC(18,2),
    TOTCONSUMO NUMERIC(18,2),
    DTOIT1M NUMERIC(18,2),
    DTOIT2M NUMERIC(18,2),
    DTOIT3M NUMERIC(18,2),
    TOTCAJAS NUMERIC(18,2),
    VEHICULO VARCHAR(8),
    RECIBIDO NUMERIC(18,2),
    CAMBIO NUMERIC(18,2),
    HORA TIME,
    FORMAPAGO1 VARCHAR(30),
    MONTOPAGO1 NUMERIC(18,2),
    FORMAPAGO2 VARCHAR(30),
    MONTOPAGO2 NUMERIC(18,2),
    FORMAPAGO3 VARCHAR(30),
    MONTOPAGO3 NUMERIC(18,2),
    PUNTOS INTEGER,
    PUNTOSACUM INTEGER,
    PUNTOSVENC INTEGER,
    FECPTOS DATE,
    OBSITEM BLOB SUB_TYPE 1 SEGMENT SIZE 80,
    SUCUR VARCHAR(10))
AS
DECLARE VARIABLE IMPTOS CHAR(1);
DECLARE VARIABLE TARIFA INTEGER;
declare variable DEVUELTO NUMERIC(18,2);
declare variable ORDENCOD CHAR(2);
declare variable IMPRDEV CHAR(2);
declare variable IMPR CHAR(1);
declare variable ITEMFP INTEGER;
declare variable FORMAP VARCHAR(30);
declare variable MONTOP NUMERIC(18,2);
declare variable ICOINC CHAR(2);
declare variable DTOITM1 NUMERIC(18,2);
declare variable DTOITM2 NUMERIC(18,2);
declare variable DTOITM3 NUMERIC(18,2);
declare variable DTOITE3 CHAR(2);
declare variable SUMDTOIT NUMERIC(18,2);
declare variable AUTORET VARCHAR(10);
declare variable FAUTORET DATE;
BEGIN
execute procedure lee_configuracion('FACTURACION', 'ARTICULOS', 'IMPOCONSUMO INCLUIDO EN EL PRECIO BASE DE VENTA ANTES DE IVA') returning_values (icoinc);
execute procedure lee_configuracion('FACTURACION', 'FACTURAS', 'COLUMNAS DE DESCUENTO POR ITEM ADICIONALES') returning_values (DTOITE3);
SELECT F.PREF_PRE, FACT_NUMERO, FACT_FECHA, FACT_VENCE, F.BODE_COD, BODE_NOM, F.TERC_NIT, FACT_NOMCLIENTE, F.VEND_COD, VEND_NOMBRE, F.PTVT_ID, PTVT_NOM,
    AUTO_NUMERO, FACT_DESPACHO, FACT_TRANSP, FACT_COTIZACI, FACT_PEDIDO, FACT_REMISION, FACT_COMIPORC, FACT_COMIMONTO, FACT_IVAINC, 
    FACT_DTOPOR, FACT_DTOMONTO, FACT_ADICIONAL, FACT_IVAMONTO, FACT_RTFTEPOR, FACT_RTFTEMONTO, FACT_RTIVAPOR, FACT_RTIVAMONTO, FACT_RTICAPOR, FACT_RTICAMONTO, FACT_EXTRA, FACT_DTOFPOR, FACT_DTOFMONTO, FACT_DTOFFECHA, FACT_TOTAL,
    TERC_DIR, TERC_CIU, TERC_TEL, TERC_CONTACTO, TERC_FAX, TERC_DV, FACT_DTOIT1, FACT_DTOIT2, FACT_DTOIT3,
    FACT_OBS, VEHI_COD, /*FACT_NROCOPIA,*/ FACT_RECIBIDO, FACT_SUCURSAL, FACT_DETCLI, FACT_DETCLINOM, TERC_NOM
    FROM FACTURAS F, BODEGA B, VENDEDORES V, PUNTO_VENTA P, TERCEROS T
    WHERE F.BODE_COD = B.BODE_COD AND F.VEND_COD = V.VEND_COD AND F.PTVT_ID = P.PTVT_ID AND F.TERC_NIT = T.TERC_NIT AND F.FACT_ID = :ID
    into :PREF, :NUMERO, :FECHA, :VENCE, :CODBODEGA, :NOMBODEGA, :NIT, :NOMTERCERO, :VENDEDOR, :NOMVENDEDOR, :PUNTOVTA, :NOMPUNTOVTA,
    :AUTORIZACION, :DESPACHO, :TRANSPORTADOR, :COTIZACION, :PEDIDO, :REMISION, :COMIPORC, :COMIMONTO, :IMPTOS,
    :DTOPORC, :DTOMONTO, :ADICIONAL, :IVAMONTO, :RTEFTEPORC, :RTEFTEMONTO, :RTEIVAPORC, :RTEIVAMONTO, :RTEICAPORC, :RTEICAMONTO, :EXTRA, :DTOFPORC, :DTOFMONTO, :FECHADTO, :TOTALFAC,
    :DIRECCION, :CIUDAD, :TELEFONO, :CONTACTO, :FAX, :DV, :dtoit1m, :dtoit2m, :dtoit3m,
    :OBS, :VEHICULO,/* :NROCOPIA,*/ :RECIBIDO, :SUCUR, :paciente, :nompaciente, :nomcliente;

/* ACUMULE LOS PUNTOS, SE HACE ACA POR SER POSTERIOR AL DETALLE */
EXECUTE PROCEDURE acumula_puntos_cliente (31, :id, :nit, :fecha) returning_values (:PUNTOS);
EXECUTE PROCEDURE consulta_puntos_cliente (:id, :nit, :fecha) returning_values (:puntos, :puntosacum, :puntosvenc, :fecptos);
if (DTOIT1M IS NULL) then
    DTOIT1M = 0;
if (DTOIT2M IS NULL) then
    DTOIT2M = 0;
if (DTOIT3M IS NULL) then
    DTOIT3M = 0;
SELECT CLIE_COD, C.ZONA_COD, ZONA_NOM
    FROM CLIENTES C, ZONAS Z
    WHERE TERC_NIT = :NIT AND C.ZONA_COD = Z.ZONA_COD
    INTO :CODIGOCL, :ZONACOD, :ZONANOM;
SELECT CLSU_DIR, CLSU_CIUDAD, CLSU_TEL FROM CLIENTE_SUCURSALES WHERE TERC_NIT = :NIT AND CLCU_COD = :SUCUR
    INTO :DIRECCION, :CIUDAD, :TELEFONO;
DIASVENCE = VENCE - FECHA;
if (DIASVENCE > 0) then
    CONTCRED = 'CREDITO ' || CAST(DIASVENCE AS VARCHAR(3)) || ' DIAS';
ELSE
    CONTCRED = 'CONTADO';
SUBTOTAL = TOTALFAC - EXTRA - IVAMONTO - ADICIONAL + DTOMONTO;
if (DTOITE3 = 'SI') then
    BEGIN
    SELECT SUM(FADE_DTOMONTO) FROM FACTURAS_DETALLE WHERE FACT_ID = :id INTO :sumdtoit;
    SUBTOTAL = SUBTOTAL + sumdtoit + dtoit1m + dtoit2m + dtoit3m;
    END
EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'FECHA AUTORETENEDOR NO DESCONTAR RETENCIONES DEL SALDO PERO SI CONTABILIZARLAS') returning_values (AUTORET);
if (AUTORET <> '') then
    FAUTORET = CAST(AUTORET AS DATE);
else
    FAUTORET = '9999/12/31';
if (FECHA > fautoret) then
    TOTALPAGAR = TOTALFAC - RTEIVAMONTO - RTEICAMONTO;
ELSE
    TOTALPAGAR = TOTALFAC - RTEFTEMONTO - RTEIVAMONTO - RTEICAMONTO;
if (RECIBIDO <> 0) then
    CAMBIO = RECIBIDO - totalpagar;
ELSE
    CAMBIO = 0;
SUMAEX = 0;
SUMA1 = 0;
SUMA2 = 0;
SUMA3 = 0;
IVA1 = 0;
IVA2 = 0;
IVA3 = 0;
TOTCONSUMO = 0;
MONTOPAGO1 = 0;
SELECT MAX(AUDI_HORA) FROM AUDITORIA WHERE TIDO_COD = 31 AND AUDI_IDDOC = :ID AND AUDI_OPER = 'I' INTO :HORA;
/* AHORA LAS FORMAS DE PAGO, BUSQUE EL ABONO DE HOY A LA FACTURA */
ITEMFP = 1;
MONTOPAGO1 = 0;
MONTOPAGO2 = 0;
MONTOPAGO3 = 0;
FOR SELECT FOPA_NOM, RCPA_MONTO FROM RECIBOS_CAJA_PAGO P, FORMAS_PAGO F, RECIBOS_CAJA R, RECIBOS_CAJA_DETALLE D
    WHERE R.RECA_ID = P.RECA_ID AND R.RECA_ID = D.RECA_ID AND P.FOPA_ID = F.FOPA_ID AND RECA_FECHA = :FECHA AND RCDE_TIPODOC = 31 AND RCDE_IDDOC = :ID
    INTO :formap, :MONTOP
    DO
    BEGIN
    if (ITEMFP = 1) then
        BEGIN
        FORMAPAGO1 = FORMAP;
        MONTOPAGO1 = MONTOP;
        END
    if (ITEMFP = 2) then
        BEGIN
        FORMAPAGO2 = FORMAP;
        MONTOPAGO2 = MONTOP;
        END
    if (ITEMFP = 3) then
        BEGIN
        FORMAPAGO3 = FORMAP;
        MONTOPAGO3 = MONTOP;
        END
    ITEMFP = ITEMFP + 1;
    END
EXECUTE PROCEDURE lee_configuracion ('FACTURACION','DOCUMENTOS','ORDENAR ITEMS POR CODIGO DE ARTICULO') returning_values (:ORDENCOD);
EXECUTE PROCEDURE lee_configuracion ('FACTURACION','POS', 'IMPRIMIR DEVOLUCIONES DE ARTICULOS NEGATIVOS') returning_values (:imprdev);
totcajas = 0;
if (ORDENCOD = 'SI') then
    BEGIN
    FOR SELECT FADE_ITEM, D.ARTI_COD, FADE_CODBAR, SUBSTR(FADE_DESC,1,60), ARTI_DESCORTA, FADE_CANT, FADE_UNIDAD, FADE_FACTOR, BODE_COD, FADE_LOTE, LIPR_COD, FADE_PRUNIT, FADE_DTOPORC, FADE_DTOMONTO, FADE_IVAPORC, FADE_IVAMONTO, FADE_CONSUMO, FADE_TOTAL, FADE_REFERENCIA,
        GRUP_COD, SUBG_COD, MARC_COD, ARTI_PESO, ARTI_ANCHO, ARTI_ALTO, ARTI_LARGO, TAIV_COD, FADE_DEVUELTO, FADE_OBS, FADE_DTO1, FADE_DTO2, FADE_DTO3, FADE_DTOM1, FADE_DTOM2, FADE_DTOM3, FADE_CAJAS
        FROM FACTURAS_DETALLE D, ARTICULO A
        WHERE D.ARTI_COD = A.ARTI_COD AND D.FACT_ID = :ID
        ORDER BY D.ARTI_COD
        INTO :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :DESCORTA, :CANT, :UNIDAD, :FACTOR, :BODITEM, :LOTE, :LISTAPR, :PRUNIT, :DTOITPORC, :DTOITMONTO, :IVAPORC, :IVAITMONTO, :CONSUMO, :TOTAL, :refitem,
        :GRUPO, :SUBGRUPO, :MARCA, :PESO, :ANCHO, :ALTO, :LARGO, :TARIFA, :devuelto, :obsitem, :dtoit1, :dtoit2, :dtoit3, :dtoitm1, :dtoitm2, :dtoitm3, :cajas
        DO
          BEGIN
          if (ARTICULO = CODBAR) then
            SELECT FIRST 1 COBA_COD FROM barras_articulo WHERE ARTI_COD = :articulo INTO :CODBAR;
          if (IMPRDEV <> 'SI') then
            BEGIN
            if ((CANT >= 0) AND (DEVUELTO = 0)) then
                IMPR = 'S';
            ELSE
                IMPR = 'N'; /* ES DEVOLUCION */
            END
          ELSE
            IMPR = 'S';
          if (IMPR = 'S') then
            BEGIN
            prneto = PRUNIT - DTOITMONTO - dtoitm1 - dtoitm2 - dtoitm3;
            if (IMPTOS = 'S') then
                if (cant <> 0) then
                    prnetosiniva = PRUNIT - DTOITMONTO - ((IVAITMONTO+CONSUMO) / CANT) - dtoitm1 - dtoitm2 - dtoitm3;
                else
                    prnetosiniva = PRUNIT - DTOITMONTO - dtoitm1 - dtoitm2 - dtoitm3;
            ELSE
                prnetosiniva = PRUNIT - DTOITMONTO - dtoit1m - dtoit2m - dtoit3m;
            if (ICOINC = 'SI') then
                SUBTOTIT = TOTAL - IVAITMONTO;
            else
                SUBTOTIT = TOTAL - IVAITMONTO - CONSUMO;
            TOTCONSUMO = TOTCONSUMO + CONSUMO;
            SELECT LOTE_VENCE FROM LOTES WHERE LOTE_NRO = :lote AND ARTI_COD = :ARTICULO AND BODE_COD = :boditem INTO :vlote;
            if ((REFITEM <> '.t') or (REFITEM IS NULL)) then
                BEGIN
                /* NO SUME LOS ENSAMBLES */
                if (IVAPORC = 0) then
                    SUMAEX = SUMAEX + TOTAL;
                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;
                END
            if (ANCHO IS NULL) then
                ANCHO = 0;
            if (ALTO IS NULL) then
                ALTO = 0;
            if (LARGO IS NULL) then
                LARGO = 0;
            if (PESO IS NULL) then
                PESO = 0;
            PESO = (PESO / 1000) * CANT * FACTOR;
            totcajas = totcajas + cajas;
            if (substr(ARTICULO,1,2) = '.t') then
                BEGIN
                REFITEM = '';
                TOTAL = 0;
                SUBTOTIT = 0;
                END
            SELECT STAND_COD FROM STANDS WHERE ARTI_COD = :ARTICULO AND STAND_BODEGA = :boditem INTO :stand;
            SUSPEND;
            END
          END
    END
ELSE
    BEGIN
    FOR SELECT FADE_ITEM, D.ARTI_COD, FADE_CODBAR, SUBSTR(FADE_DESC,1,60), ARTI_DESCORTA, FADE_CANT, FADE_UNIDAD, FADE_FACTOR, BODE_COD, FADE_LOTE, LIPR_COD, FADE_PRUNIT, FADE_DTOPORC, FADE_DTOMONTO, FADE_IVAPORC, FADE_IVAMONTO, FADE_CONSUMO, FADE_TOTAL, FADE_REFERENCIA,
        GRUP_COD, SUBG_COD, MARC_COD, ARTI_PESO, ARTI_ANCHO, ARTI_ALTO, ARTI_LARGO, TAIV_COD, FADE_DEVUELTO, FADE_OBS, FADE_DTO1, FADE_DTO2, FADE_DTO3, FADE_DTOM1, FADE_DTOM2, FADE_DTOM3, FADE_CAJAS
        FROM FACTURAS_DETALLE D, ARTICULO A
        WHERE D.ARTI_COD = A.ARTI_COD AND D.FACT_ID = :ID
        ORDER BY FADE_ITEM
        INTO :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :DESCORTA, :CANT, :UNIDAD, :FACTOR, :BODITEM, :LOTE, :LISTAPR, :PRUNIT, :DTOITPORC, :DTOITMONTO, :IVAPORC, :IVAITMONTO, :CONSUMO, :TOTAL, :refitem,
        :GRUPO, :SUBGRUPO, :MARCA, :PESO, :ANCHO, :ALTO, :LARGO, :TARIFA, :devuelto, :obsitem, :dtoit1, :dtoit2, :dtoit3, :dtoitm1, :dtoitm2, :dtoitm3, :cajas
        DO
          BEGIN
          if (IMPRDEV <> 'SI') then
            BEGIN
            if ((CANT >= 0) AND (DEVUELTO = 0)) then
                IMPR = 'S';
            ELSE
                IMPR = 'N'; /* ES DEVOLUCION */
            END
          ELSE
            IMPR = 'S';
          if (IMPR = 'S') then
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :GRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :MARCA INTO NOMMARCA;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :SUBGRUPO AND GRUP_COD = :GRUPO INTO :NOMSUBG;
            prneto = PRUNIT - DTOITMONTO - dtoitm1 - dtoitm2 - dtoitm3;
            if (IMPTOS = 'S') then
                if (cant <> 0) then
                    prnetosiniva = PRUNIT - DTOITMONTO - ((IVAITMONTO+CONSUMO) / CANT) - dtoit1m - dtoit2m - dtoit3m;
                else
                    prnetosiniva = PRUNIT - DTOITMONTO - dtoitm1 - dtoitm2 - dtoitm3;
            ELSE
                prnetosiniva = PRUNIT - DTOITMONTO - dtoitm1 - dtoitm2 - dtoitm3;
            if (ICOINC = 'SI') then
                SUBTOTIT = TOTAL - IVAITMONTO;
            else
                SUBTOTIT = TOTAL - IVAITMONTO - CONSUMO;
            TOTCONSUMO = TOTCONSUMO + CONSUMO;
            SELECT LOTE_VENCE FROM LOTES WHERE LOTE_NRO = :lote AND ARTI_COD = :ARTICULO AND BODE_COD = :boditem INTO :vlote;
            if ((REFITEM <> '.t') or (REFITEM IS NULL)) then
                BEGIN
                /* NO SUME LOS ENSAMBLES */
                if (IVAPORC = 0) then
                    SUMAEX = SUMAEX + TOTAL;
                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;
                END
            if (ANCHO IS NULL) then
                ANCHO = 0;
            if (ALTO IS NULL) then
                ALTO = 0;
            if (LARGO IS NULL) then
                LARGO = 0;
            if (PESO IS NULL) then
                PESO = 0;
            PESO = (PESO / 1000)* CANT * FACTOR;
            totcajas = totcajas + cajas;
            if (substr(ARTICULO,1,2) = '.t') then
                BEGIN
                REFITEM = '';
                TOTAL = 0;
                SUBTOTIT = 0;
                END
            SELECT STAND_COD FROM STANDS WHERE ARTI_COD = :ARTICULO AND STAND_BODEGA = :boditem INTO :stand;
            SUSPEND;
            END
          END
    END
END
^

SET TERM ; ^



/* 20080225 : COMISIONES POR ARTICULO CONSOLIDADAS MAL CUANDO HAY DEVOLUCIONES */

SET TERM ^ ;

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

SET TERM ; ^


/* 20090225B RECUPERACION DE CARTERA POR COBRADOR SIEMPRE DECIA QUE NO HAY DATOS PARA EL REPORTE */

SET TERM ^ ;

CREATE OR ALTER PROCEDURE RECUPERACION_CARTERA(
    DESDE VARCHAR(20),
    HASTA VARCHAR(20),
    GRPINI VARCHAR(5),
    GRPFIN VARCHAR(5),
    FECHA DATE,
    ORDEN CHAR(1),
    AGRUPA CHAR(1),
    SUCURSAL INTEGER,
    MONEDA INTEGER)
RETURNS (
    NIT VARCHAR(20),
    NOMBRE VARCHAR(60),
    TELEFONO VARCHAR(40),
    CIUDAD VARCHAR(60),
    CODZONA VARCHAR(2),
    NOMZONA VARCHAR(60),
    CODCOBR INTEGER,
    NOMCOBR VARCHAR(60),
    DV CHAR(1),
    CODCIUD CHAR(5),
    NOMCIUD VARCHAR(60),
    INICIAL NUMERIC(18,2),
    CARGOS1 NUMERIC(18,2),
    ABONOS1 NUMERIC(18,2),
    CARGOS2 NUMERIC(18,2),
    ABONOS2 NUMERIC(18,2),
    CARGOS3 NUMERIC(18,2),
    ABONOS3 NUMERIC(18,2),
    FINAL NUMERIC(18,2))
AS
declare variable NITINI VARCHAR(20);
declare variable NITFIN VARCHAR(20);
declare variable NOMINI VARCHAR(60);
declare variable NOMFIN VARCHAR(60);
declare variable OK CHAR(1);
declare variable FECINI DATE;
declare variable FECFIN DATE;
declare variable DEBITO NUMERIC(18,2);
declare variable CREDITO NUMERIC(18,2);
declare variable TIPODOC INTEGER;
declare variable IDDOC INTEGER;
declare variable SALDO NUMERIC(18,2);
declare variable RTFTE NUMERIC(18,2);
declare variable RTIVA NUMERIC(18,2);
declare variable RTICA NUMERIC(18,2);
declare variable RETES CHAR(2);
BEGIN
EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'DESCONTAR RETENCIONES POR CAUSACION') returning_values (:RETES);
if (ORDEN = 'C') then
    BEGIN
    NITINI = DESDE;
    NITFIN = HASTA;
    NOMINI = '';
    NOMFIN = 'zz';
    END
ELSE
    BEGIN
    NOMINI = DESDE;
    NOMFIN = HASTA;
    NITINI = '';
    NITFIN = 'zz';
    END
  /* Ubique el NIT */
  FOR select T.TERC_NIT, TERC_NOM, TERC_DV, TERC_TEL, TERC_CIU, C.COBR_COD, C.ZONA_COD, T.CIUD_COD
    from terceros T, CLIENTES C
    where C.TERC_NIT = T.TERC_NIT AND TERC_CLIE = 'S' AND T.TERC_NIT >= :NITINI AND T.TERC_NIT <= :NITFIN AND
        TERC_NOM >= :NOMINI AND TERC_NOM <= :NOMFIN
    INTO :NIT, :NOMBRE, :DV, :TELEFONO, :CIUDAD, :CODCOBR, :CODZONA, :CODCIUD
    DO  
    BEGIN
    FECINI = FECHA - 90;
    OK = 'N';
    if (AGRUPA = 'Z') then
        BEGIN
        if (GRPINI = '') then
            BEGIN
            if ((CODZONA IS NULL) or (CODZONA >= :GRPINI AND CODZONA <= :GRPFIN)) then
                OK = 'S';
            END
        ELSE
            if (CODZONA >= :GRPINI AND CODZONA <= :GRPFIN) then
                OK = 'S';
        END
    if (AGRUPA = 'I') then
        BEGIN
        if (GRPINI = '') then
            BEGIN
            if ((CODCIUD IS NULL) or (CODCIUD >= :GRPINI AND CODCIUD <= :GRPFIN)) then
                OK = 'S';
            END
        ELSE
            if (CODCIUD >= :GRPINI AND CODCIUD <= :GRPFIN) then
                OK = 'S';
        END
    if (AGRUPA = 'N') then
        OK = 'S';
        
    if (OK = 'S') then
        BEGIN
        SELECT COBR_NOM FROM COBRADORES CB WHERE COBR_COD = :CODCOBR INTO :NOMCOBR;
        SELECT ZONA_NOM FROM ZONAS WHERE ZONA_COD = :CODZONA INTO :NOMZONA;
        SELECT CIUD_NOM FROM CIUDADES WHERE CIUD_COD = :CODCIUD INTO :NOMCIUD;
        CARGOS1 = 0;
        ABONOS1 = 0;
        CARGOS2 = 0;
        ABONOS2 = 0;
        CARGOS3 = 0;
        ABONOS3 = 0;
        INICIAL = 0;
        FOR SELECT MVCL_TIPOREF, MVCL_IDREF FROM MOVIMIENTO_CLIENTES
            WHERE TERC_NIT = :NIT AND MVCL_FECHA <= :FECINI AND ((:MONEDA = 0) or (MVCL_TRM <> 1)) AND
            MVCL_ABONO = 'N' AND ((:SUCURSAL = 0) or (SUCU_ID = :SUCURSAL))
            INTO :TIPODOC, :IDDOC
            DO
            BEGIN
            EXECUTE PROCEDURE saldo_doc_cartera(TIPODOC, IDDOC, FECINI, MONEDA) returning_values (SALDO);
            INICIAL = INICIAL + SALDO;
            END
        FECFIN = FECINI + 30;
        if (MONEDA = 0) then
            SELECT SUM(MVCL_MONTO), SUM(MVCL_RTEFTE), SUM(MVCL_RTEIVA), SUM(MVCL_RTEICA) FROM movimiento_clientes WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND
                MVCL_FECHA < :FECFIN AND MVCL_DEBITO = 'S' AND MVCL_ABONO = 'N' AND ((:SUCURSAL = 0) or (SUCU_ID = :SUCURSAL))
                INTO :DEBITO, :RTFTE, :RTIVA, :RTICA;
        ELSE
            SELECT SUM(MVCL_MONTO/MVCL_TRM), SUM(MVCL_RTEFTE/MVCL_TRM), SUM(MVCL_RTEIVA/MVCL_TRM), SUM(MVCL_RTEICA/MVCL_TRM)
                FROM movimiento_clientes WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND ((:MONEDA = 0) or (MVCL_TRM <> 1)) AND
                MVCL_FECHA < :FECFIN AND MVCL_DEBITO = 'S' AND MVCL_ABONO = 'N' AND ((:SUCURSAL = 0) or (SUCU_ID = :SUCURSAL))
                INTO :DEBITO, :RTFTE, :RTIVA, :RTICA;
        if (DEBITO IS NULL) then
            DEBITO = 0;
        if (rtfte IS NULL) then
            rtfte = 0;
        if (rtiva IS NULL) then
            rtiva = 0;
        if (rtica IS NULL) then
            rtica = 0;
        IF (RETES = 'SI') then
            DEBITO = DEBITO - RTFTE - RTIVA - RTICA;

        if (MONEDA = 0) then
            SELECT SUM(MVCL_MONTO), SUM(MVCL_RTEFTE), SUM(MVCL_RTEIVA), SUM(MVCL_RTEICA)  FROM movimiento_clientes WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI
                AND MVCL_FECHA < :FECFIN AND MVCL_DEBITO = 'N'  AND MVCL_ABONO = 'N' AND ((:SUCURSAL = 0) or (SUCU_ID = :SUCURSAL))
                INTO :CREDITO, :RTFTE, :RTIVA, :RTICA;
        ELSE
            SELECT SUM(MVCL_MONTO/MVCL_TRM), SUM(MVCL_RTEFTE/MVCL_TRM), SUM(MVCL_RTEIVA/MVCL_TRM), SUM(MVCL_RTEICA/MVCL_TRM)
                FROM movimiento_clientes WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND ((:MONEDA = 0) or (MVCL_TRM <> 1))
                AND MVCL_FECHA < :FECFIN AND MVCL_DEBITO = 'N'  AND MVCL_ABONO = 'N' AND ((:SUCURSAL = 0) or (SUCU_ID = :SUCURSAL))
                INTO :CREDITO, :RTFTE, :RTIVA, :RTICA;
        if (CREDITO IS NULL) then
            CREDITO = 0;
        if (rtfte IS NULL) then
            rtfte = 0;
        if (rtiva IS NULL) then
            rtiva = 0;
        if (rtica IS NULL) then
            rtica = 0;
        IF (RETES = 'SI') then
            CREDITO = CREDITO - RTFTE - RTIVA - RTICA;
        CARGOS3 = DEBITO - CREDITO;
        if (MONEDA = 0) then
            SELECT SUM(MVCL_MONTO), SUM(MVCL_RTEFTE), SUM(MVCL_RTEIVA), SUM(MVCL_RTEICA)  FROM movimiento_clientes WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI
                AND MVCL_FECHA < :FECFIN AND MVCL_DEBITO = 'N' AND MVCL_ABONO = 'S' AND ((:SUCURSAL = 0) or (SUCU_ID = :SUCURSAL))
                INTO :CREDITO, :RTFTE, :RTIVA, :RTICA;
        ELSE
            SELECT SUM(MVCL_MONTO/MVCL_TRM), SUM(MVCL_RTEFTE/MVCL_TRM), SUM(MVCL_RTEIVA/MVCL_TRM), SUM(MVCL_RTEICA/MVCL_TRM)
                FROM movimiento_clientes WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND ((:MONEDA = 0) or (MVCL_TRM <> 1))
                AND MVCL_FECHA < :FECFIN AND MVCL_DEBITO = 'N' AND MVCL_ABONO = 'S' AND ((:SUCURSAL = 0) or (SUCU_ID = :SUCURSAL))
                INTO :CREDITO, :RTFTE, :RTIVA, :RTICA;
        if (CREDITO IS NULL) then
            CREDITO = 0;
        if (rtfte IS NULL) then
            rtfte = 0;
        if (rtiva IS NULL) then
            rtiva = 0;
        if (rtica IS NULL) then
            rtica = 0;
        IF (RETES = 'NO') then
            CREDITO = CREDITO + RTFTE + RTIVA + RTICA;
        ABONOS3 = CREDITO;
        FECINI = FECFIN;
        FECFIN = FECINI + 30;
        if (MONEDA = 0) then
            SELECT SUM(MVCL_MONTO), SUM(MVCL_RTEFTE), SUM(MVCL_RTEIVA), SUM(MVCL_RTEICA)  FROM movimiento_clientes WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI
                AND MVCL_FECHA < :FECFIN AND MVCL_DEBITO = 'S' AND MVCL_ABONO = 'N' AND ((:SUCURSAL = 0) or (SUCU_ID = :SUCURSAL))
                INTO :DEBITO, :RTFTE, :RTIVA, :RTICA;
        ELSE
            SELECT SUM(MVCL_MONTO/MVCL_TRM), SUM(MVCL_RTEFTE/MVCL_TRM), SUM(MVCL_RTEIVA/MVCL_TRM), SUM(MVCL_RTEICA/MVCL_TRM)
                FROM movimiento_clientes WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND ((:MONEDA = 0) or (MVCL_TRM <> 1))
                AND MVCL_FECHA < :FECFIN AND MVCL_DEBITO = 'S' AND MVCL_ABONO = 'N' AND ((:SUCURSAL = 0) or (SUCU_ID = :SUCURSAL))
                INTO :DEBITO, :RTFTE, :RTIVA, :RTICA;
        if (DEBITO IS NULL) then
            DEBITO = 0;
        if (rtfte IS NULL) then
            rtfte = 0;
        if (rtiva IS NULL) then
            rtiva = 0;
        if (rtica IS NULL) then
            rtica = 0;
        IF (RETES = 'SI') then
            DEBITO = DEBITO - RTFTE - RTIVA - RTICA;
        if (MONEDA = 0) then
            SELECT SUM(MVCL_MONTO), SUM(MVCL_RTEFTE), SUM(MVCL_RTEIVA), SUM(MVCL_RTEICA)  FROM movimiento_clientes WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI
                AND MVCL_FECHA < :FECFIN AND MVCL_DEBITO = 'N'  AND MVCL_ABONO = 'N' AND ((:SUCURSAL = 0) or (SUCU_ID = :SUCURSAL))
                INTO :CREDITO, :RTFTE, :RTIVA, :RTICA;
        ELSE
            SELECT SUM(MVCL_MONTO/MVCL_TRM), SUM(MVCL_RTEFTE/MVCL_TRM), SUM(MVCL_RTEIVA/MVCL_TRM), SUM(MVCL_RTEICA/MVCL_TRM)
                FROM movimiento_clientes WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND ((:MONEDA = 0) or (MVCL_TRM <> 1))
                AND MVCL_FECHA < :FECFIN AND MVCL_DEBITO = 'N'  AND MVCL_ABONO = 'N' AND ((:SUCURSAL = 0) or (SUCU_ID = :SUCURSAL))
                INTO :CREDITO, :RTFTE, :RTIVA, :RTICA;
        if (CREDITO IS NULL) then
            CREDITO = 0;
        if (rtfte IS NULL) then
            rtfte = 0;
        if (rtiva IS NULL) then
            rtiva = 0;
        if (rtica IS NULL) then
            rtica = 0;
        IF (RETES = 'SI') then
            CREDITO = CREDITO - RTFTE - RTIVA - RTICA;
        CARGOS2 = DEBITO - CREDITO;
        if (MONEDA = 0) then
            SELECT SUM(MVCL_MONTO), SUM(MVCL_RTEFTE), SUM(MVCL_RTEIVA), SUM(MVCL_RTEICA)  FROM movimiento_clientes WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI
                AND MVCL_FECHA < :FECFIN AND MVCL_DEBITO = 'N'  AND MVCL_ABONO = 'S' AND ((:SUCURSAL = 0) or (SUCU_ID = :SUCURSAL))
                INTO :CREDITO, :RTFTE, :RTIVA, :RTICA;
        ELSE
            SELECT SUM(MVCL_MONTO/MVCL_TRM), SUM(MVCL_RTEFTE/MVCL_TRM), SUM(MVCL_RTEIVA/MVCL_TRM), SUM(MVCL_RTEICA/MVCL_TRM)
                FROM movimiento_clientes WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND ((:MONEDA = 0) or (MVCL_TRM <> 1))
                AND MVCL_FECHA < :FECFIN AND MVCL_DEBITO = 'N'  AND MVCL_ABONO = 'S' AND ((:SUCURSAL = 0) or (SUCU_ID = :SUCURSAL))
                INTO :CREDITO, :RTFTE, :RTIVA, :RTICA;
        if (CREDITO IS NULL) then
            CREDITO = 0;
        if (rtfte IS NULL) then
            rtfte = 0;
        if (rtiva IS NULL) then
            rtiva = 0;
        if (rtica IS NULL) then
            rtica = 0;
        IF (RETES = 'NO') then
            CREDITO = CREDITO + RTFTE + RTIVA + RTICA;
        ABONOS2 = CREDITO;
        FECINI = FECFIN;
        FECFIN = FECINI + 30;
        if (MONEDA = 0) then
            SELECT SUM(MVCL_MONTO), SUM(MVCL_RTEFTE), SUM(MVCL_RTEIVA), SUM(MVCL_RTEICA)  FROM movimiento_clientes WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI
                AND MVCL_FECHA < :FECFIN AND MVCL_DEBITO = 'S' AND MVCL_ABONO = 'N' AND ((:SUCURSAL = 0) or (SUCU_ID = :SUCURSAL))
                INTO :DEBITO, :RTFTE, :RTIVA, :RTICA;
        ELSE
            SELECT SUM(MVCL_MONTO/MVCL_TRM), SUM(MVCL_RTEFTE/MVCL_TRM), SUM(MVCL_RTEIVA/MVCL_TRM), SUM(MVCL_RTEICA/MVCL_TRM)
                FROM movimiento_clientes WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND ((:MONEDA = 0) or (MVCL_TRM <> 1))
                AND MVCL_FECHA < :FECFIN AND MVCL_DEBITO = 'S' AND MVCL_ABONO = 'N' AND ((:SUCURSAL = 0) or (SUCU_ID = :SUCURSAL))
                INTO :DEBITO, :RTFTE, :RTIVA, :RTICA;
        if (DEBITO IS NULL) then
            DEBITO = 0;
        if (rtfte IS NULL) then
            rtfte = 0;
        if (rtiva IS NULL) then
            rtiva = 0;
        if (rtica IS NULL) then
            rtica = 0;
        IF (RETES = 'SI') then
            DEBITO = DEBITO - RTFTE - RTIVA - RTICA;
        if (MONEDA = 0) then
            SELECT SUM(MVCL_MONTO), SUM(MVCL_RTEFTE), SUM(MVCL_RTEIVA), SUM(MVCL_RTEICA)  FROM movimiento_clientes WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI
                AND MVCL_FECHA < :FECFIN AND MVCL_DEBITO = 'N'  AND MVCL_ABONO = 'N' AND ((:SUCURSAL = 0) or (SUCU_ID = :SUCURSAL))
                INTO :CREDITO, :RTFTE, :RTIVA, :RTICA;
        ELSE
            SELECT SUM(MVCL_MONTO/MVCL_TRM), SUM(MVCL_RTEFTE/MVCL_TRM), SUM(MVCL_RTEIVA/MVCL_TRM), SUM(MVCL_RTEICA/MVCL_TRM)
                FROM movimiento_clientes WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND ((:MONEDA = 0) or (MVCL_TRM <> 1))
                AND MVCL_FECHA < :FECFIN AND MVCL_DEBITO = 'N'  AND MVCL_ABONO = 'N' AND ((:SUCURSAL = 0) or (SUCU_ID = :SUCURSAL))
                INTO :CREDITO, :RTFTE, :RTIVA, :RTICA;
        if (CREDITO IS NULL) then
            CREDITO = 0;
        if (rtfte IS NULL) then
            rtfte = 0;
        if (rtiva IS NULL) then
            rtiva = 0;
        if (rtica IS NULL) then
            rtica = 0;
        IF (RETES = 'SI') then
            CREDITO = CREDITO - RTFTE - RTIVA - RTICA;
        CARGOS1 = DEBITO - CREDITO;
        if (MONEDA = 0) then
            SELECT SUM(MVCL_MONTO), SUM(MVCL_RTEFTE), SUM(MVCL_RTEIVA), SUM(MVCL_RTEICA)  FROM movimiento_clientes WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI
                AND MVCL_FECHA < :FECFIN AND MVCL_DEBITO = 'N'  AND MVCL_ABONO = 'S' AND ((:SUCURSAL = 0) or (SUCU_ID = :SUCURSAL))
                INTO :CREDITO, :RTFTE, :RTIVA, :RTICA;
        ELSE
            SELECT SUM(MVCL_MONTO/MVCL_TRM), SUM(MVCL_RTEFTE/MVCL_TRM), SUM(MVCL_RTEIVA/MVCL_TRM), SUM(MVCL_RTEICA/MVCL_TRM)
                FROM movimiento_clientes WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND ((:MONEDA = 0) or (MVCL_TRM <> 1))
                AND MVCL_FECHA < :FECFIN AND MVCL_DEBITO = 'N'  AND MVCL_ABONO = 'S' AND ((:SUCURSAL = 0) or (SUCU_ID = :SUCURSAL))
                INTO :CREDITO, :RTFTE, :RTIVA, :RTICA;
        if (CREDITO IS NULL) then
            CREDITO = 0;
        if (rtfte IS NULL) then
            rtfte = 0;
        if (rtiva IS NULL) then
            rtiva = 0;
        if (rtica IS NULL) then
            rtica = 0;
        IF (RETES = 'NO') then
            CREDITO = CREDITO + RTFTE + RTIVA + RTICA;
        ABONOS1 = CREDITO;
        FINAL = INICIAL + CARGOS3 + CARGOS2 + CARGOS1 - ABONOS3 - ABONOS2 - ABONOS1;
        SUSPEND;
        END

    if (AGRUPA = 'C') then
        BEGIN
        CARGOS1 = 0;
        ABONOS1 = 0;
        CARGOS2 = 0;
        ABONOS2 = 0;
        CARGOS3 = 0;
        ABONOS3 = 0;
        INICIAL = 0;
        for select distinct cobr_cod from movimiento_clientes
            WHERE TERC_NIT = :NIT AND MVCL_FECHA <= :FECHA AND
            MVCL_ABONO = 'N' AND ((:SUCURSAL = 0) or (SUCU_ID = :SUCURSAL))
            into :codcobr
            do
            BEGIN
            OK = 'N';
            if (GRPINI = '') then
                BEGIN
                if ((CODCOBR IS NULL) or (CODCOBR >= :GRPINI AND CODCOBR <= :GRPFIN)) then
                    OK = 'S';
                END
            ELSE
                if (CODCOBR >= :GRPINI AND CODCOBR <= :GRPFIN) then
                    OK = 'S';
            if (OK = 'S') then
                begin
                SELECT COBR_NOM FROM COBRADORES WHERE COBR_COD = :codcobr INTO :nomcobr;
                FOR SELECT MVCL_TIPOREF, MVCL_IDREF FROM MOVIMIENTO_CLIENTES
                    WHERE TERC_NIT = :NIT AND MVCL_FECHA <= :FECINI AND COBR_COD = :codcobr AND
                    MVCL_ABONO = 'N' AND ((:SUCURSAL = 0) or (SUCU_ID = :SUCURSAL))
                    INTO :TIPODOC, :IDDOC
                    DO
                    BEGIN
                    EXECUTE PROCEDURE saldo_doc_cartera(TIPODOC, IDDOC, FECINI, 0) returning_values (SALDO);
                    INICIAL = INICIAL + SALDO;
                    END
                FECFIN = FECINI + 30;
                if (MONEDA = 0) then
                    SELECT SUM(MVCL_MONTO), SUM(MVCL_RTEFTE), SUM(MVCL_RTEIVA), SUM(MVCL_RTEICA) FROM movimiento_clientes WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND
                        MVCL_FECHA < :FECFIN AND MVCL_DEBITO = 'S' AND MVCL_ABONO = 'N' AND COBR_COD = :codcobr AND ((:SUCURSAL = 0) or (SUCU_ID = :SUCURSAL))
                        INTO :DEBITO, :RTFTE, :RTIVA, :RTICA;
                ELSE
                    SELECT SUM(MVCL_MONTO/MVCL_TRM), SUM(MVCL_RTEFTE/MVCL_TRM), SUM(MVCL_RTEIVA/MVCL_TRM), SUM(MVCL_RTEICA/MVCL_TRM)
                        FROM movimiento_clientes WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND ((:MONEDA = 0) or (MVCL_TRM <> 1)) AND
                        MVCL_FECHA < :FECFIN AND MVCL_DEBITO = 'S' AND MVCL_ABONO = 'N' AND COBR_COD = :codcobr AND ((:SUCURSAL = 0) or (SUCU_ID = :SUCURSAL))
                        INTO :DEBITO, :RTFTE, :RTIVA, :RTICA;
                if (DEBITO IS NULL) then
                    DEBITO = 0;
                if (rtfte IS NULL) then
                    rtfte = 0;
                if (rtiva IS NULL) then
                    rtiva = 0;
                if (rtica IS NULL) then
                    rtica = 0;
                IF (RETES = 'SI') then
                    DEBITO = DEBITO - RTFTE - RTIVA - RTICA;
                if (MONEDA = 0) then
                    SELECT SUM(MVCL_MONTO), SUM(MVCL_RTEFTE), SUM(MVCL_RTEIVA), SUM(MVCL_RTEICA) FROM movimiento_clientes WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI
                        AND MVCL_FECHA < :FECFIN AND MVCL_DEBITO = 'N'  AND MVCL_ABONO = 'N' AND COBR_COD = :codcobr AND ((:SUCURSAL = 0) or (SUCU_ID = :SUCURSAL))
                        INTO :CREDITO, :RTFTE, :RTIVA, :RTICA;
                ELSE
                    SELECT SUM(MVCL_MONTO/MVCL_TRM), SUM(MVCL_RTEFTE/MVCL_TRM), SUM(MVCL_RTEIVA/MVCL_TRM), SUM(MVCL_RTEICA/MVCL_TRM)
                        FROM movimiento_clientes WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND ((:MONEDA = 0) or (MVCL_TRM <> 1)) 
                        AND MVCL_FECHA < :FECFIN AND MVCL_DEBITO = 'N'  AND MVCL_ABONO = 'N' AND COBR_COD = :codcobr AND ((:SUCURSAL = 0) or (SUCU_ID = :SUCURSAL))
                        INTO :CREDITO, :RTFTE, :RTIVA, :RTICA;
                if (CREDITO IS NULL) then
                    CREDITO = 0;
                if (rtfte IS NULL) then
                    rtfte = 0;
                if (rtiva IS NULL) then
                    rtiva = 0;
                if (rtica IS NULL) then
                    rtica = 0;
                IF (RETES = 'SI') then
                    CREDITO = CREDITO - RTFTE - RTIVA - RTICA;
                CARGOS3 = DEBITO - CREDITO;
                if (MONEDA = 0) then
                    SELECT SUM(MVCL_MONTO), SUM(MVCL_RTEFTE), SUM(MVCL_RTEIVA), SUM(MVCL_RTEICA) FROM movimiento_clientes WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI
                        AND MVCL_FECHA < :FECFIN AND MVCL_DEBITO = 'N' AND MVCL_ABONO = 'S' AND COBR_COD = :codcobr AND ((:SUCURSAL = 0) or (SUCU_ID = :SUCURSAL))
                        INTO :CREDITO, :RTFTE, :RTIVA, :RTICA;
                ELSE
                    SELECT SUM(MVCL_MONTO/MVCL_TRM), SUM(MVCL_RTEFTE/MVCL_TRM), SUM(MVCL_RTEIVA/MVCL_TRM), SUM(MVCL_RTEICA/MVCL_TRM)
                        FROM movimiento_clientes WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND ((:MONEDA = 0) or (MVCL_TRM <> 1)) 
                        AND MVCL_FECHA < :FECFIN AND MVCL_DEBITO = 'N' AND MVCL_ABONO = 'S' AND COBR_COD = :codcobr AND ((:SUCURSAL = 0) or (SUCU_ID = :SUCURSAL))
                        INTO :CREDITO, :RTFTE, :RTIVA, :RTICA;
                if (CREDITO IS NULL) then
                    CREDITO = 0;
                if (rtfte IS NULL) then
                    rtfte = 0;
                if (rtiva IS NULL) then
                    rtiva = 0;
                if (rtica IS NULL) then
                    rtica = 0;
                IF (RETES = 'NO') then
                    CREDITO = CREDITO + RTFTE + RTIVA + RTICA;
                ABONOS3 = CREDITO;
                FECINI = FECFIN;
                FECFIN = FECINI + 30;
                if (MONEDA = 0) then
                    SELECT SUM(MVCL_MONTO), SUM(MVCL_RTEFTE), SUM(MVCL_RTEIVA), SUM(MVCL_RTEICA) FROM movimiento_clientes WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI
                        AND MVCL_FECHA < :FECFIN AND MVCL_DEBITO = 'S' AND MVCL_ABONO = 'N' AND COBR_COD = :codcobr AND ((:SUCURSAL = 0) or (SUCU_ID = :SUCURSAL))
                        INTO :DEBITO, :RTFTE, :RTIVA, :RTICA;
                ELSE
                    SELECT SUM(MVCL_MONTO/MVCL_TRM), SUM(MVCL_RTEFTE/MVCL_TRM), SUM(MVCL_RTEIVA/MVCL_TRM), SUM(MVCL_RTEICA/MVCL_TRM)
                        FROM movimiento_clientes WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND ((:MONEDA = 0) or (MVCL_TRM <> 1)) 
                        AND MVCL_FECHA < :FECFIN AND MVCL_DEBITO = 'S' AND MVCL_ABONO = 'N' AND COBR_COD = :codcobr AND ((:SUCURSAL = 0) or (SUCU_ID = :SUCURSAL))
                        INTO :DEBITO, :RTFTE, :RTIVA, :RTICA;
                if (DEBITO IS NULL) then
                    DEBITO = 0;
                if (rtfte IS NULL) then
                    rtfte = 0;
                if (rtiva IS NULL) then
                    rtiva = 0;
                if (rtica IS NULL) then
                    rtica = 0;
                IF (RETES = 'SI') then
                    DEBITO = DEBITO - RTFTE - RTIVA - RTICA;
                if (MONEDA = 0) then
                    SELECT SUM(MVCL_MONTO), SUM(MVCL_RTEFTE), SUM(MVCL_RTEIVA), SUM(MVCL_RTEICA) FROM movimiento_clientes WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI
                        AND MVCL_FECHA < :FECFIN AND MVCL_DEBITO = 'N'  AND MVCL_ABONO = 'N' AND COBR_COD = :codcobr AND ((:SUCURSAL = 0) or (SUCU_ID = :SUCURSAL))
                        INTO :CREDITO, :RTFTE, :RTIVA, :RTICA;
                ELSE
                    SELECT SUM(MVCL_MONTO/MVCL_TRM), SUM(MVCL_RTEFTE/MVCL_TRM), SUM(MVCL_RTEIVA/MVCL_TRM), SUM(MVCL_RTEICA/MVCL_TRM)
                        FROM movimiento_clientes WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND ((:MONEDA = 0) or (MVCL_TRM <> 1)) 
                        AND MVCL_FECHA < :FECFIN AND MVCL_DEBITO = 'N'  AND MVCL_ABONO = 'N' AND COBR_COD = :codcobr AND ((:SUCURSAL = 0) or (SUCU_ID = :SUCURSAL))
                        INTO :CREDITO, :RTFTE, :RTIVA, :RTICA;
                if (CREDITO IS NULL) then
                    CREDITO = 0;
                if (rtfte IS NULL) then
                    rtfte = 0;
                if (rtiva IS NULL) then
                    rtiva = 0;
                if (rtica IS NULL) then
                    rtica = 0;
                IF (RETES = 'SI') then
                    CREDITO = CREDITO - RTFTE - RTIVA - RTICA;
                CARGOS2 = DEBITO - CREDITO;
                if (MONEDA = 0) then
                    SELECT SUM(MVCL_MONTO), SUM(MVCL_RTEFTE), SUM(MVCL_RTEIVA), SUM(MVCL_RTEICA) FROM movimiento_clientes WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI
                        AND MVCL_FECHA < :FECFIN AND MVCL_DEBITO = 'N'  AND MVCL_ABONO = 'S' AND COBR_COD = :codcobr AND ((:SUCURSAL = 0) or (SUCU_ID = :SUCURSAL))
                        INTO :CREDITO, :RTFTE, :RTIVA, :RTICA;
                ELSE
                    SELECT SUM(MVCL_MONTO/MVCL_TRM), SUM(MVCL_RTEFTE/MVCL_TRM), SUM(MVCL_RTEIVA/MVCL_TRM), SUM(MVCL_RTEICA/MVCL_TRM)
                        FROM movimiento_clientes WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND ((:MONEDA = 0) or (MVCL_TRM <> 1)) 
                        AND MVCL_FECHA < :FECFIN AND MVCL_DEBITO = 'N'  AND MVCL_ABONO = 'S' AND COBR_COD = :codcobr AND ((:SUCURSAL = 0) or (SUCU_ID = :SUCURSAL))
                        INTO :CREDITO, :RTFTE, :RTIVA, :RTICA;
                if (CREDITO IS NULL) then
                    CREDITO = 0;
                if (rtfte IS NULL) then
                    rtfte = 0;
                if (rtiva IS NULL) then
                    rtiva = 0;
                if (rtica IS NULL) then
                    rtica = 0;
                IF (RETES = 'NO') then
                    CREDITO = CREDITO + RTFTE + RTIVA + RTICA;
                ABONOS2 = CREDITO;
                FECINI = FECFIN;
                FECFIN = FECINI + 30;
                if (MONEDA = 0) then
                    SELECT SUM(MVCL_MONTO), SUM(MVCL_RTEFTE), SUM(MVCL_RTEIVA), SUM(MVCL_RTEICA) FROM movimiento_clientes WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI
                        AND MVCL_FECHA < :FECFIN AND MVCL_DEBITO = 'S' AND MVCL_ABONO = 'N' AND COBR_COD = :codcobr AND ((:SUCURSAL = 0) or (SUCU_ID = :SUCURSAL))
                        INTO :DEBITO, :RTFTE, :RTIVA, :RTICA;
                ELSE
                    SELECT SUM(MVCL_MONTO/MVCL_TRM), SUM(MVCL_RTEFTE/MVCL_TRM), SUM(MVCL_RTEIVA/MVCL_TRM), SUM(MVCL_RTEICA/MVCL_TRM)
                        FROM movimiento_clientes WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND ((:MONEDA = 0) or (MVCL_TRM <> 1)) 
                        AND MVCL_FECHA < :FECFIN AND MVCL_DEBITO = 'S' AND MVCL_ABONO = 'N' AND COBR_COD = :codcobr AND ((:SUCURSAL = 0) or (SUCU_ID = :SUCURSAL))
                        INTO :DEBITO, :RTFTE, :RTIVA, :RTICA;
                if (DEBITO IS NULL) then
                    DEBITO = 0;
                if (rtfte IS NULL) then
                    rtfte = 0;
                if (rtiva IS NULL) then
                    rtiva = 0;
                if (rtica IS NULL) then
                    rtica = 0;
                IF (RETES = 'SI') then
                    DEBITO = DEBITO - RTFTE - RTIVA - RTICA;
                if (MONEDA = 0) then
                    SELECT SUM(MVCL_MONTO), SUM(MVCL_RTEFTE), SUM(MVCL_RTEIVA), SUM(MVCL_RTEICA) FROM movimiento_clientes WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI
                        AND MVCL_FECHA < :FECFIN AND MVCL_DEBITO = 'N'  AND MVCL_ABONO = 'N' AND COBR_COD = :codcobr AND ((:SUCURSAL = 0) or (SUCU_ID = :SUCURSAL))
                        INTO :CREDITO, :RTFTE, :RTIVA, :RTICA;
                ELSE
                    SELECT SUM(MVCL_MONTO/MVCL_TRM), SUM(MVCL_RTEFTE/MVCL_TRM), SUM(MVCL_RTEIVA/MVCL_TRM), SUM(MVCL_RTEICA/MVCL_TRM)
                        FROM movimiento_clientes WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND ((:MONEDA = 0) or (MVCL_TRM <> 1)) 
                        AND MVCL_FECHA < :FECFIN AND MVCL_DEBITO = 'N'  AND MVCL_ABONO = 'N' AND COBR_COD = :codcobr AND ((:SUCURSAL = 0) or (SUCU_ID = :SUCURSAL))
                        INTO :CREDITO, :RTFTE, :RTIVA, :RTICA;
                if (CREDITO IS NULL) then
                    CREDITO = 0;
                if (rtfte IS NULL) then
                    rtfte = 0;
                if (rtiva IS NULL) then
                    rtiva = 0;
                if (rtica IS NULL) then
                    rtica = 0;
                IF (RETES = 'SI') then
                    CREDITO = CREDITO - RTFTE - RTIVA - RTICA;
                CARGOS1 = DEBITO - CREDITO;
                if (MONEDA = 0) then
                    SELECT SUM(MVCL_MONTO), SUM(MVCL_RTEFTE), SUM(MVCL_RTEIVA), SUM(MVCL_RTEICA) FROM movimiento_clientes WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI
                        AND MVCL_FECHA < :FECFIN AND MVCL_DEBITO = 'N'  AND MVCL_ABONO = 'S' AND COBR_COD = :codcobr AND ((:SUCURSAL = 0) or (SUCU_ID = :SUCURSAL))
                        INTO :CREDITO, :RTFTE, :RTIVA, :RTICA;
                ELSE
                    SELECT SUM(MVCL_MONTO/MVCL_TRM), SUM(MVCL_RTEFTE/MVCL_TRM), SUM(MVCL_RTEIVA/MVCL_TRM), SUM(MVCL_RTEICA/MVCL_TRM)
                        FROM movimiento_clientes WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND ((:MONEDA = 0) or (MVCL_TRM <> 1)) 
                        AND MVCL_FECHA < :FECFIN AND MVCL_DEBITO = 'N'  AND MVCL_ABONO = 'S' AND COBR_COD = :codcobr AND ((:SUCURSAL = 0) or (SUCU_ID = :SUCURSAL))
                        INTO :CREDITO, :RTFTE, :RTIVA, :RTICA;
                if (CREDITO IS NULL) then
                    CREDITO = 0;
                if (rtfte IS NULL) then
                    rtfte = 0;
                if (rtiva IS NULL) then
                    rtiva = 0;
                if (rtica IS NULL) then
                    rtica = 0;
                IF (RETES = 'NO') then
                    CREDITO = CREDITO + RTFTE + RTIVA + RTICA;
                ABONOS1 = CREDITO;
                FINAL = INICIAL + CARGOS3 + CARGOS2 + CARGOS1 - ABONOS3 - ABONOS2 - ABONOS1;
                SUSPEND;
                END
            END
        END
    END
END
^

SET TERM ; ^



/* 20090226 EL CAMPO DIF_CAMBIO DE RECIBOS QUEDABA NULL Y AFECTABA REPORTES DE MOVIMIENTO Y CARTERA */

ALTER TRIGGER RECIBOS_CAJA_DETALLE_AU INACTIVE;
UPDATE RECIBOS_CAJA_DETALLE SET RCDE_DIFCAMBIO = 0 WHERE RCDE_DIFCAMBIO IS NULL;
COMMIT WORK;
ALTER TRIGGER RECIBOS_CAJA_DETALLE_AU ACTIVE;

UPDATE SALDOS_DOC_CARTERA SET SDCA_ABONO = 0 WHERE SDCA_ABONO IS NULL;
COMMIT WORK;

SET TERM ^ ;

ALTER TRIGGER RECIBOS_CAJA_DETALLE_BI
ACTIVE BEFORE INSERT POSITION 0
AS
DECLARE VARIABLE NUMROWS INTEGER;
declare variable PREGTASA CHAR(2);
declare variable TRM NUMERIC(18,2);
declare variable TRMDOC NUMERIC(18,2);
begin
if (NEW.rcde_difcambio IS NULL) then
    NEW.rcde_difcambio = 0;
IF (NEW.RECA_ID IS NOT NULL) THEN
    BEGIN
       SELECT COUNT(*)
       FROM   RECIBOS_CAJA
       WHERE  RECIBOS_CAJA.RECA_ID = NEW.RECA_ID
       INTO   :NUMROWS;
       IF (NUMROWS = 0) THEN
       BEGIN
          EXCEPTION recibo_no_existe;
       END
    END
if (NEW.rcde_sucursal IS NULL) then
    NEW.rcde_sucursal = '01';
/* SI TRM <> 1 CONVIERTA A PESOS LOS VALORES */
EXECUTE PROCEDURE LEE_CONFIGURACION('GENERAL', 'GENERAL', 'PREGUNTAR TASA DE CAMBIO EN DOCUMENTOS DE CARTERA') returning_values (:pregtasa);
if (PREGTASA = 'SI') then
    BEGIN
    SELECT RECA_TRM FROM recibos_caja WHERE RECA_ID = NEW.reca_id INTO :TRM;
    SELECT MVCL_TRM FROM movimiento_clientes M WHERE M.mvcl_tiporef = NEW.rcde_tipodoc AND M.mvcl_idref = NEW.rcde_iddoc INTO :TRMDOC;
    NEW.rcde_difcambio = (NEW.rcde_abono + NEW.rcde_dtof) * (TRM - TRMDOC);
    NEW.rcde_abono = NEW.rcde_abono * :trmdoc;
    NEW.rcde_rtfte = NEW.rcde_rtfte * :trmdoc;
    NEW.rcde_rtiva = NEW.rcde_rtiva * :trmdoc;
    NEW.rcde_rtica = NEW.rcde_rtica * :trmdoc;
    NEW.rcde_dtof = NEW.rcde_dtof * :trmdoc;
    end
END
^

SET TERM ; ^


/* 20090226B : GMF USABA FLOOR EN LUGAR DE REDONDEE Y EN CONTABILIDAD PODIA QUEDAR UNA DIFERENCIA DE 1 PESO */

SET TERM ^ ;

CREATE OR ALTER TRIGGER EGRESOS_BANCO_AI FOR EGRESOS_BANCO
ACTIVE AFTER INSERT POSITION 0
AS
declare variable GMFPORC NUMERIC(5,2);
declare variable GMFMONTO NUMERIC(18,2);
declare variable egrenumero varchar(10);
declare variable nit varchar(20);
BEGIN
  /* REGISTRE EL MOVIMIENTO DEL BANCO */
  if ((NEW.EGRE_ID <> 0) and (new.egbc_anulado = 'N')) then
    BEGIN
    /* BUSQUE EL GMF DE LA CUENTA */
    if (NEW.EGBC_GMF = 'S') then
        BEGIN
        SELECT CUBA_GMFPOR FROM CUENTAS_BANCO WHERE CUBA_COD = NEW.CUBA_COD INTO :GMFPORC;
        if (GMFPORC IS NULL) then
            GMFPORC = 0;
        END
    ELSE
        GMFPORC = 0;
    EXECUTE procedure REDONDEE(NEW.EGBC_MONTO * :GMFPORC / 1000, 0) returning_values (GMFMONTO);
    select pref_pre||egre_numero,terc_nit from egresos where egre_id = new.egre_id into :egrenumero, :nit;

    if (NEW.EGBC_TIPOBCO = 72) then
        BEGIN
        /* CHEQUE */
        INSERT INTO CHEQUES (CHEQ_ID, CUBA_COD, PRBA_PREF, CHEQ_NUMERO, CHEQ_FECHA, CHEQ_IDEGRESO, CHEQ_CONCEPTO, CHEQ_BENEF, CHEQ_MONTO, CHEQ_GMFPORC, CHEQ_GMFMONTO, CHEQ_ANULADO, CHEQ_TRANSMIT,CHEQ_EGRESO,TERC_NIT)
            VALUES (GEN_ID(ID_CHEQUES, 1), NEW.CUBA_COD, NEW.PRBA_PREF, NEW.EGBC_NUMERO, NEW.EGBC_FECHA, NEW.EGRE_ID, NEW.EGBC_CONCEPTO, NEW.EGBC_BENEF, NEW.EGBC_MONTO, :GMFPORC, :GMFMONTO, 'N', 'N',:egrenumero, :NIT);
        END
    if (NEW.EGBC_TIPOBCO = 73) then
        BEGIN
        /* RETIRO */
        INSERT INTO RETIROS (RETI_ID, CUBA_COD, PRBA_PREF, RETI_NUMERO, RETI_FECHA, RETI_IDEGRESO, RETI_CONCEPTO, RETI_BENEF, RETI_MONTO, RETI_GMFPORC, RETI_GMFMONTO, RETI_ANULADO, RETI_TRANSMIT,RETI_EGRESO,TERC_NIT)
            VALUES (GEN_ID(id_retiros, 1), NEW.CUBA_COD, NEW.PRBA_PREF, NEW.EGBC_NUMERO, NEW.EGBC_FECHA, NEW.EGRE_ID, NEW.EGBC_CONCEPTO, NEW.EGBC_BENEF, NEW.EGBC_MONTO, :GMFPORC, :GMFMONTO, 'N', 'N',:egrenumero, :NIT);
        END
    END
END
^

SET TERM ; ^



/* 20090226C :NUEVO PROEDIMIENTO PARA REEMPLAZAR LA CUENTA CONTABLE DEL BANCO EN LOS COMPROBANTES CONTABLES */

SET TERM ^ ;

CREATE OR ALTER PROCEDURE ARREGLA_CUENTA_BANCO_CONTA(
    CTAANT VARCHAR(20))
RETURNS (
    ID INTEGER,
    CTA VARCHAR(20))
AS
begin
FOR SELECT D.ENCO_CONSEC, CUBA_CTACONTA
    FROM COMPROBANTE_DETALLE D, cuentas_banco CB, COMPROBANTE_ENCABEZADO E, EGRESOS_BANCO EB
    WHERE E.enco_tiporef = 62 AND E.enco_consec = D.enco_consec AND EB.egre_id = E.enco_idref AND EB.cuba_cod = CB.cuba_cod AND D.CUEN_COD = :CTAANT AND D.cuen_cod <> CB.cuba_ctaconta
    INTO :ID, :CTA
    DO
    begin
    UPDATE COMPROBANTE_DETALLE SET CUEN_COD = :CTA WHERE CUEN_COD = :CTAANT AND ENCO_CONSEC = :ID;
    suspend;
    END
end
^

SET TERM ; ^



/* 20090226D TRM EN 1 EN MOVIMIENTO CLIENTES SI ESTA EN CERO */

SET TERM ^ ;

CREATE OR ALTER TRIGGER MOVIMIENTO_CLIENTES_BI FOR MOVIMIENTO_CLIENTES
ACTIVE BEFORE INSERT POSITION 0
as
begin
if ((NEW.mvcl_trm IS NULL) or (NEW.mvcl_trm = 0)) then
    NEW.mvcl_trm = 1;
/* AGREGE LA SUCURSAL QUE REGISTRO BASADO EN EL PREFIJO */
if (NEW.mvcl_tiporef <> 77) then
    SELECT SUCU_ID FROM PREFIJOS WHERE PREF_PRE = NEW.mvcl_prefref AND TIDO_COD = NEW.mvcl_tiporef
        INTO NEW.sucu_id;
ELSE
    SELECT SUCU_ID FROM CAJAS C, DEVOLUCION_CHEQUES D
        WHERE DVCH_ID = NEW.mvcl_idref AND D.caja_id = C.caja_id INTO NEW.sucu_id;
end
^

SET TERM ; ^



/* 20090226E : COMISIONES CONSOLIDADO, PORCENTAJE MAL POR PRECISION, MULTIPLICAR POR 100 ANTES */
SET TERM ^ ;

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

SET TERM ; ^



/* 20090226F : UNIDADES COMO DIVISION ENTRE EL FACTOR DE CANTIDAD */
SET TERM ^ ;

CREATE OR ALTER PROCEDURE REP_VENTAS_ARTICULO(
    TIPO INTEGER,
    ARTINI VARCHAR(20),
    ARTFIN VARCHAR(20),
    DETALLE CHAR(1),
    FECINI DATE,
    FECFIN DATE,
    GRPINI VARCHAR(3),
    GRPFIN VARCHAR(3),
    PTOINI INTEGER,
    PTOFIN INTEGER,
    ORDEN CHAR(1),
    AGRUPA CHAR(1),
    CEROS CHAR(1),
    UNIDADES CHAR(1),
    SUBEMPRESA INTEGER)
RETURNS (
    ARTICULO VARCHAR(15),
    DESCRIPCION VARCHAR(60),
    CODGRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    CODSUBG VARCHAR(3),
    NOMSUBG VARCHAR(30),
    CODMARC VARCHAR(3),
    NOMMARC VARCHAR(30),
    UNIDAD VARCHAR(8),
    CANTIDAD NUMERIC(18,4),
    BASE NUMERIC(18,2),
    IVA NUMERIC(18,2),
    CONSUMO NUMERIC(18,2),
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    DTO NUMERIC(9,2),
    TRANSP VARCHAR(60),
    ALTERNATIVAS NUMERIC(18,4),
    NOMTIPO VARCHAR(50))
AS
DECLARE VARIABLE CODINI VARCHAR(20);
DECLARE VARIABLE CODFIN VARCHAR(20);
DECLARE VARIABLE DESINI VARCHAR(20);
DECLARE VARIABLE DESFIN VARCHAR(20);
declare variable MARINI VARCHAR(3);
declare variable MARFIN VARCHAR(3);
declare variable NUMROWS INTEGER;
declare variable CANTAUX NUMERIC(18,4);
BEGIN
if (ORDEN = 'C') then
    BEGIN
    CODINI = ARTINI;
    CODFIN = ARTFIN;
    DESINI = '';
    DESFIN = 'zz';
    END
ELSE
    BEGIN
    DESINI = ARTINI;
    DESFIN = ARTFIN;
    CODINI = '0';
    CODFIN = 'zz';
    END
if (AGRUPA = 'G') then
    BEGIN
    MARINI = '';
    MARFIN = 'zz';
    END
ELSE
    if (AGRUPA = 'M') then
        BEGIN
        MARINI = GRPINI;
        MARFIN = GRPFIN;
        GRPINI = '';
        GRPFIN = 'zz';
        END
    ELSE
        BEGIN
        MARINI = '';
        MARFIN = 'zz';
        END
/* BORRA LA TABLA AUXILIAR */
DELETE FROM reportes_aux WHERE REPA_ID = 1 AND REPA_USER = USER;

if (DETALLE = 'N') then
    BEGIN
    if (BIN_AND(TIPO, 1) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 31 INTO :NOMTIPO;
        /* BORRA LA TABLA AUXILIAR */
        DELETE FROM reportes_aux WHERE REPA_ID = 1 AND REPA_USER = USER;

        FOR SELECT MAX(D.ARTI_COD), SUM(FADE_CANT * FADE_FACTOR), SUM(FACT_FACTOR*(FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO)),
            SUM(FACT_FACTOR*FADE_IVAMONTO), SUM(FADE_CONSUMO), MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD)
            FROM FACTURAS_DETALLE D, FACTURAS F, PREFIJOS P, ARTICULO A WHERE F.PTVT_ID >= :PTOINI AND F.PTVT_ID <= :PTOFIN AND
            F.FACT_ID = D.FACT_ID AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND D.ARTI_COD = A.arti_cod AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            FACT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) and substring(a.arti_cod from 1 FOR 2) <> '.t'
            GROUP BY D.ARTI_COD
            INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,
            :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
            DO
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            if (UNIDADES = 'S') then
                BEGIN
                cantaux = 1;
                select max(unar_faccan) from unidad_articulo where arti_cod = :articulo into :cantaux;
                if (cantaux IS NULL) then
                    cantaux = 1;
                alternativas = floor(cantidad / cantaux);
                cantidad = cantidad - alternativas * cantaux;
                END
            if (CEROS = 'S') then
                INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (1, USER, :ARTICULO);
            SUSPEND;
            END
        if (CEROS = 'S') then
            BEGIN
            /* agregue los articulos sin factura */
            FOR SELECT ARTI_COD, 0, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND
                    A.ARTI_DES <= :DESFIN AND A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND
                    (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN)))
                INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,:DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                DO
                BEGIN
                SELECT COUNT(REPA_ARTICULO) FROM REPORTES_AUX WHERE REPA_ID = 1 AND REPA_USER = USER AND REPA_ARTICULO = :articulo INTO :numrows;
                if (numrows = 0) then
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        END

    if (BIN_AND(TIPO, 2) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 32 INTO :NOMTIPO;
        /* BORRA LA TABLA AUXILIAR */
        DELETE FROM reportes_aux WHERE REPA_ID = 1 AND REPA_USER = USER;

        FOR SELECT MAX(D.ARTI_COD), SUM(RVDE_CANT * RVDE_FACTOR), SUM((RVDE_TOTAL-RVDE_IVAMONTO-RVDE_CONSUMO)), SUM(RVDE_IVAMONTO),
            SUM(RVDE_CONSUMO), MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD)
            FROM REMISIONES_VENTA_DETALLE D, REMISIONES_VENTA R, PREFIJOS P, ARTICULO A WHERE R.PTVT_ID >= :PTOINI AND R.PTVT_ID <= :PTOFIN AND
            R.REVT_ID = D.REVT_ID AND P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = 32 AND D.ARTI_COD = A.arti_cod AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            REVT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY D.ARTI_COD
            INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,
            :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
            DO
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            if (UNIDADES = 'S') then
                BEGIN
                cantaux = 1;
                select max(unar_faccan) from unidad_articulo where arti_cod = :articulo into :cantaux;
                if (cantaux IS NULL) then
                    cantaux = 1;
                alternativas = floor(cantidad / cantaux);
                cantidad = cantidad - alternativas * cantaux;
                END
            if (CEROS = 'S') then
                INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (1, USER, :ARTICULO);
            SUSPEND;
            END
        if (CEROS = 'S') then
            BEGIN
            /* agregue los articulos sin factura */
            FOR SELECT ARTI_COD, 0, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND
                    A.ARTI_DES <= :DESFIN AND A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND
                    (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN)))
                INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,:DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                DO
                BEGIN
                SELECT COUNT(REPA_ARTICULO) FROM REPORTES_AUX WHERE REPA_ID = 1 AND REPA_USER = USER AND REPA_ARTICULO = :articulo INTO :numrows;
                if (numrows = 0) then
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        END

    if (BIN_AND(TIPO, 4) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 33 INTO :NOMTIPO;
        /* BORRA LA TABLA AUXILIAR */
        DELETE FROM reportes_aux WHERE REPA_ID = 1 AND REPA_USER = USER;

        FOR SELECT MAX(D.ARTI_COD), SUM(DVDE_CANT * DVDE_FACTOR), SUM(DEVT_FACTOR*(DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO)),
            SUM(DEVT_FACTOR*DVDE_IVAMONTO), SUM(DVDE_CONSUMO), MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD)
            FROM devoluciones_ventas_detalle D, DEVOLUCIONES_VENTAS V, PREFIJOS P, ARTICULO A WHERE V.PTVT_ID >= :PTOINI AND V.PTVT_ID <= :PTOFIN AND
            V.DEVT_ID = D.DEVT_ID AND P.PREF_PRE = V.PREF_PRE AND P.TIDO_COD = 33 AND D.ARTI_COD = A.arti_cod AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            DEVT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) AND ((DEVT_REMID = 0) or (DEVT_REMID IS NULL))
            GROUP BY D.ARTI_COD
            INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,
            :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
            DO
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            CANTIDAD = CANTIDAD * -1;
            BASE = BASE * -1;
            IVA = IVA * -1;
            CONSUMO = CONSUMO * -1;
            if (UNIDADES = 'S') then
                BEGIN
                cantaux = 1;
                select max(unar_faccan) from unidad_articulo where arti_cod = :articulo into :cantaux;
                if (cantaux IS NULL) then
                    cantaux = 1;
                alternativas = floor(cantidad / cantaux);
                cantidad = cantidad - alternativas * cantaux;
                END
            if (CEROS = 'S') then
                INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (1, USER, :ARTICULO);
            SUSPEND;
            END
        if (CEROS = 'S') then
            BEGIN
            /* agregue los articulos sin factura */
            FOR SELECT ARTI_COD, 0, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND
                    A.ARTI_DES <= :DESFIN AND A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND
                    (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN)))
                INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,:DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                DO
                BEGIN
                SELECT COUNT(REPA_ARTICULO) FROM REPORTES_AUX WHERE REPA_ID = 1 AND REPA_USER = USER AND REPA_ARTICULO = :articulo INTO :numrows;
                if (numrows = 0) then
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        END
    if (BIN_AND(TIPO, 8) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 34 INTO :NOMTIPO;
        /* BORRA LA TABLA AUXILIAR */
        DELETE FROM reportes_aux WHERE REPA_ID = 1 AND REPA_USER = USER;

        FOR SELECT MAX(D.ARTI_COD), SUM(PEDE_CANT * PEDE_FACTOR), SUM(PEDI_FACTOR*(PEDE_TOTAL-PEDE_IVAMONTO-PEDE_CONSUMO)),
            SUM(PEDI_FACTOR*PEDE_IVAMONTO), SUM(PEDE_CONSUMO),
            MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD)
            FROM PEDIDOS_DETALLE D, PEDIDOS P, PREFIJOS R, ARTICULO A WHERE P.PTVT_ID >= :PTOINI AND P.PTVT_ID <= :PTOFIN AND
            P.PEDI_ID = D.PEDI_ID AND P.PREF_PRE = R.PREF_PRE AND R.TIDO_COD = 34 AND D.ARTI_COD = A.arti_cod AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            PEDI_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY D.ARTI_COD
            INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,
            :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
            DO
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            if (UNIDADES = 'S') then
                BEGIN
                cantaux = 1;
                select max(unar_faccan) from unidad_articulo where arti_cod = :articulo into :cantaux;
                if (cantaux IS NULL) then
                    cantaux = 1;
                alternativas = floor(cantidad / cantaux);
                cantidad = cantidad - alternativas * cantaux;
                END
            if (CEROS = 'S') then
                INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (1, USER, :ARTICULO);
            SUSPEND;
            END
        if (CEROS = 'S') then
            BEGIN
            /* agregue los articulos sin factura */
            FOR SELECT ARTI_COD, 0, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND
                    A.ARTI_DES <= :DESFIN AND A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND
                    (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN)))
                INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,:DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                DO
                BEGIN
                SELECT COUNT(REPA_ARTICULO) FROM REPORTES_AUX WHERE REPA_ID = 1 AND REPA_USER = USER AND REPA_ARTICULO = :articulo INTO :numrows;
                if (numrows = 0) then
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        END
    if (BIN_AND(TIPO, 16) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 35 INTO :NOMTIPO;
        /* BORRA LA TABLA AUXILIAR */
        DELETE FROM reportes_aux WHERE REPA_ID = 1 AND REPA_USER = USER;

        FOR SELECT MAX(D.ARTI_COD), SUM(CTDE_CANT * CTDE_FACTOR), SUM(COTI_FACTOR*(CTDE_TOTAL-CTDE_IVAMONTO-CTDE_CONSUMO)),
            SUM(COTI_FACTOR*CTDE_IVAMONTO), SUM(CTDE_CONSUMO),
            MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD)
            FROM COTIZACIONES_DETALLE D, COTIZACIONES C, PREFIJOS P, ARTICULO A WHERE C.PTVT_ID >= :PTOINI AND C.PTVT_ID <= :PTOFIN AND
            C.COTI_ID = D.COTI_ID AND P.PREF_PRE = C.PREF_PRE AND P.TIDO_COD = 35 AND D.ARTI_COD = A.arti_cod AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND COTI_FECHA >= :FECINI AND COTI_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            COTI_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY D.ARTI_COD
            INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,
            :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
            DO
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            if (UNIDADES = 'S') then
                BEGIN
                cantaux = 1;
                select max(unar_faccan) from unidad_articulo where arti_cod = :articulo into :cantaux;
                if (cantaux IS NULL) then
                    cantaux = 1;
                alternativas = floor(cantidad / cantaux);
                cantidad = cantidad - alternativas * cantaux;
                END
            if (CEROS = 'S') then
                INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (1, USER, :ARTICULO);
            SUSPEND;
            END
        if (CEROS = 'S') then
            BEGIN
            /* agregue los articulos sin factura */
            FOR SELECT ARTI_COD, 0, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND
                    A.ARTI_DES <= :DESFIN AND A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND
                    (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN)))
                INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,:DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                DO
                BEGIN
                SELECT COUNT(REPA_ARTICULO) FROM REPORTES_AUX WHERE REPA_ID = 1 AND REPA_USER = USER AND REPA_ARTICULO = :articulo INTO :numrows;
                if (numrows = 0) then
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        END
    END
ELSE
  if (DETALLE = 'S') then
    BEGIN
    if (BIN_AND(TIPO, 1) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 31 INTO :NOMTIPO;
        FOR SELECT F.PREF_PRE, FACT_NUMERO, FACT_FECHA, D.ARTI_COD, FADE_CANT * FADE_FACTOR, (FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO)*FACT_FACTOR,
        FADE_IVAMONTO*FACT_FACTOR, FADE_CONSUMO, FADE_DTOPORC,
            ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD, FACT_TRANSP
            FROM FACTURAS F, FACTURAS_DETALLE D, PREFIJOS P, ARTICULO A WHERE F.PTVT_ID >= :PTOINI AND F.PTVT_ID <= :PTOFIN AND
                F.FACT_ID = D.FACT_ID AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND D.ARTI_COD = A.arti_cod AND
                A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
                A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND FACT_FECHA >= :FECINI AND
                (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
                FACT_FECHA <= :FECFIN AND FACT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) and substring(a.arti_cod from 1 FOR 2) <> '.t'
            /*ORDER BY D.ARTI_COD, FACT_FECHA, FACT_ID, FADE_ITEM*/
            INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO, :DTO,
                :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :transp
            DO
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            SUSPEND;
            END
        END
    if (BIN_AND(TIPO, 2) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 32 INTO :NOMTIPO;
        FOR SELECT R.PREF_PRE, REVT_NUMERO, REVT_FECHA, D.ARTI_COD, RVDE_CANT * RVDE_FACTOR, (RVDE_TOTAL-RVDE_IVAMONTO-RVDE_CONSUMO), RVDE_IVAMONTO, RVDE_CONSUMO, RVDE_DTOPORC,
            ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD, REVT_TRANSP
            FROM REMISIONES_VENTA R, REMISIONES_VENTA_DETALLE D, PREFIJOS P, ARTICULO A
            WHERE R.REVT_ID = D.REVT_ID AND P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = 32 AND D.ARTI_COD = A.arti_cod AND
                A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
                A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN AND
                (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
                REVT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO, :DTO,
                :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :transp
            DO
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            SUSPEND;
            END
        END
    if (BIN_AND(TIPO, 4) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 33 INTO :NOMTIPO;
        FOR SELECT V.PREF_PRE, DEVT_NUMERO, DEVT_FECHA, D.ARTI_COD, DVDE_CANT * DVDE_FACTOR, (DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO)*DEVT_FACTOR,
            DVDE_IVAMONTO*DEVT_FACTOR, DVDE_CONSUMO, DVDE_DTOPORC,
            ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD 
            FROM DEVOLUCIONES_VENTAS V, DEVOLUCIONES_VENTAS_DETALLE D, PREFIJOS P, ARTICULO A WHERE V.PTVT_ID >= :PTOINI AND V.PTVT_ID <= :PTOFIN AND
                V.DEVT_ID = D.DEVT_ID AND P.PREF_PRE = V.PREF_PRE AND P.TIDO_COD = 33 AND D.ARTI_COD = A.arti_cod AND
                A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
                A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND
                (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
                DEVT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) AND ((DEVT_REMID = 0) or (DEVT_REMID IS NULL))
            /*ORDER BY D.ARTI_COD, DEVT_FECHA, DEVT_ID, DVDE_ITEM*/
            INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO, :DTO,
                :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
            DO
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            CANTIDAD = CANTIDAD * -1;
            BASE = BASE * -1;
            IVA = IVA * -1;
            CONSUMO = CONSUMO * -1;
            SUSPEND;
            END
        END
    if (BIN_AND(TIPO, 8) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 34 INTO :NOMTIPO;
        FOR SELECT P.PREF_PRE, PEDI_NUMERO, PEDI_FECHA, D.ARTI_COD, PEDE_CANT * PEDE_FACTOR, (PEDE_TOTAL-PEDE_IVAMONTO-PEDE_CONSUMO)*PEDI_FACTOR,
                PEDE_IVAMONTO*PEDI_FACTOR, PEDE_CONSUMO, PEDE_DTOPORC,
            ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD 
            FROM PEDIDOS P, PEDIDOS_DETALLE D, PREFIJOS R, ARTICULO A WHERE P.PTVT_ID >= :PTOINI AND P.PTVT_ID <= :PTOFIN AND
                P.PEDI_ID = D.PEDI_ID AND P.PREF_PRE = R.PREF_PRE AND R.TIDO_COD = 34 AND D.ARTI_COD = A.arti_cod AND
                A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
                A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND
                (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
                PEDI_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            /*ORDER BY D.ARTI_COD, PEDI_FECHA, PEDI_ID, PEDE_ITEM*/
            INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO, :DTO,
                :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
            DO
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            SUSPEND;
            END
        END
    if (BIN_AND(TIPO, 16) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 35 INTO :NOMTIPO;
        FOR SELECT C.PREF_PRE, COTI_NUMERO, COTI_FECHA, D.ARTI_COD, CTDE_CANT * CTDE_FACTOR, (CTDE_TOTAL-CTDE_IVAMONTO-CTDE_CONSUMO)*COTI_FACTOR,
                CTDE_IVAMONTO*COTI_FACTOR, CTDE_CONSUMO, CTDE_DTOPORC,
            ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD 
            FROM COTIZACIONES C, COTIZACIONES_DETALLE D, PREFIJOS P, ARTICULO A WHERE C.PTVT_ID >= :PTOINI AND C.PTVT_ID <= :PTOFIN AND
                C.COTI_ID = D.COTI_ID AND P.PREF_PRE = C.PREF_PRE AND P.TIDO_COD = 35 AND D.ARTI_COD = A.arti_cod AND
                A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
                A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND COTI_FECHA >= :FECINI AND COTI_FECHA <= :FECFIN AND
                (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
                COTI_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            /*ORDER BY D.ARTI_COD, COTI_FECHA, COTI_ID, CTDE_ITEM*/
            INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO, :DTO,
                :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
            DO
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            SUSPEND;
            END
        END
    END
  ELSE
    BEGIN
    if (BIN_AND(TIPO, 1) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 31 INTO :NOMTIPO;
        FOR SELECT MAX(D.ARTI_COD), SUM(FADE_CANT * FADE_FACTOR), SUM((FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO)*FACT_FACTOR),
            SUM(FACT_FACTOR*FADE_IVAMONTO), SUM(FADE_CONSUMO), MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD), MAX(FACT_TRANSP)
            FROM FACTURAS_DETALLE D, FACTURAS F, PREFIJOS P, ARTICULO A WHERE F.PTVT_ID >= :PTOINI AND F.PTVT_ID <= :PTOFIN AND
            F.FACT_ID = D.FACT_ID AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND D.ARTI_COD = A.arti_cod AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            FACT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) and substring(a.arti_cod from 1 FOR 2) <> '.t'
            GROUP BY FACT_TRANSP, D.ARTI_COD
            INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,
            :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :transp
            DO
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            if (CEROS = 'S') then
                SUSPEND;
            ELSE
                if ((BASE <> 0) AND (CANTIDAD <> 0)) then
                    SUSPEND;
            END
        END

    if (BIN_AND(TIPO, 2) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 32 INTO :NOMTIPO;
        FOR SELECT MAX(D.ARTI_COD), SUM(RVDE_CANT * RVDE_FACTOR), SUM((RVDE_TOTAL-RVDE_IVAMONTO-RVDE_CONSUMO)), SUM(RVDE_IVAMONTO),
            SUM(RVDE_CONSUMO), MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD), MAX(REVT_TRANSP)
            FROM REMISIONES_VENTA_DETALLE D, REMISIONES_VENTA R, PREFIJOS P, ARTICULO A WHERE R.PTVT_ID >= :PTOINI AND R.PTVT_ID <= :PTOFIN AND
            R.REVT_ID = D.REVT_ID AND P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = 32 AND D.ARTI_COD = A.arti_cod AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            REVT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY REVT_TRANSP, D.ARTI_COD
            INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,
            :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :transp
            DO
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            if (CEROS = 'S') then
                SUSPEND;
            ELSE
                if ((BASE <> 0) AND (CANTIDAD <> 0)) then
                    SUSPEND;
            END
        END
    END
END
^

SET TERM ; ^



/* 20090227 : aktivia repetia los articulos por tarifa de iva */

SET TERM ^ ;

CREATE OR ALTER PROCEDURE AKTIVIA_PRODUCTOS
RETURNS (
    CODIGO VARCHAR(15),
    BARRAS VARCHAR(15),
    DESCR VARCHAR(60),
    IVA NUMERIC(9,2),
    ICO NUMERIC(18,2),
    UNIDAD VARCHAR(8),
    UNIDADES VARCHAR(100),
    GRUPO VARCHAR(30),
    MARCA VARCHAR(30),
    LISTA1 NUMERIC(18,2),
    LISTA2 NUMERIC(18,2),
    LISTA3 NUMERIC(18,2),
    LISTA4 NUMERIC(18,2),
    LISTA5 NUMERIC(18,2),
    LISTA6 NUMERIC(18,2),
    LISTA7 NUMERIC(18,2),
    LISTA8 NUMERIC(18,2))
AS
declare variable UNIDAD2 VARCHAR(8);
declare variable FACTOR NUMERIC(18,4);
begin
FOR select a.arti_cod, arti_des, a.grup_cod, marc_cod, arti_unidad, coba_cod, t.taiv_porc, a.arti_consumo
    from articulo a, barras_articulo b, tarifa_iva t WHERE A.arti_cod = B.arti_cod and a.taiv_cod = t.taiv_cod
    INTO  :codigo, :descr, :grupo, :marca, :unidad, :barras, :iva, :ico
    do
    BEGIN
    SELECT GRUP_NOM FROM GRUPO WHERE GRUP_COD = :grupo INTO :grupo;
    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :marca INTO :marca;
    UNIDADES = '';
    FOR SELECT FIRST 1 UNAR_UNIDAD, UNAR_FACCAN FROM unidad_articulo WHERE ARTI_COD = :CODIGO AND UNAR_ACTIVA = 'S' INTO :unidad2, :factor
        DO
        BEGIN
        UNIDADES = unidad2 || ',' || cast(factor as varchar(20));
        END
    if (UNIDADES = '') then
        UNIDADES = ',';
    SELECT PRAR_FIJO FROM precios_articulo WHERE ARTI_COD = :codigo and lipr_cod = 1 INTO :LISTA1;
    SELECT PRAR_FIJO FROM precios_articulo WHERE ARTI_COD = :codigo and lipr_cod = 2 INTO :LISTA2;
    SELECT PRAR_FIJO FROM precios_articulo WHERE ARTI_COD = :codigo and lipr_cod = 3 INTO :LISTA3;
    SELECT PRAR_FIJO FROM precios_articulo WHERE ARTI_COD = :codigo and lipr_cod = 4 INTO :LISTA4;
    SELECT PRAR_FIJO FROM precios_articulo WHERE ARTI_COD = :codigo and lipr_cod = 5 INTO :LISTA5;
    SELECT PRAR_FIJO FROM precios_articulo WHERE ARTI_COD = :codigo and lipr_cod = 6 INTO :LISTA6;
    SELECT PRAR_FIJO FROM precios_articulo WHERE ARTI_COD = :codigo and lipr_cod = 7 INTO :LISTA7;
    SELECT PRAR_FIJO FROM precios_articulo WHERE ARTI_COD = :codigo and lipr_cod = 8 INTO :LISTA8;
    suspend;
    END
end
^

SET TERM ; ^



/* 20090228 : EL NIT EN CONTABILIDAD ES DEL BANCO */
SET TERM ^ ;

CREATE OR ALTER PROCEDURE CONTABIL_CONSIGNATAR(
    IDDOC INTEGER,
    IDINTER INTEGER)
RETURNS (
    ERROR INTEGER,
    VER CHAR(1),
    IDC INTEGER)
AS
declare variable PREF VARCHAR(4);
declare variable NUM VARCHAR(6);
declare variable NUMERO VARCHAR(10);
declare variable FECAUX DATE;
declare variable FECHA CHAR(8);
declare variable CONC CHAR(120);
declare variable VRDTO NUMERIC(18, 2);
declare variable VRRTFTE NUMERIC(18, 2);
declare variable VRRTIVA NUMERIC(18, 2);
declare variable VRRTICA NUMERIC(18, 2);
declare variable VRTOTAL NUMERIC(18, 2);
declare variable TIPOCOMP VARCHAR(3);
declare variable PREFCONT VARCHAR(4);
declare variable BASE CHAR(1);
declare variable PORC NUMERIC(8,2);
declare variable CTABASE VARCHAR(20);
declare variable CAJA CHAR(1);
declare variable CTACAJA VARCHAR(20);
declare variable RTFTE CHAR(1);
declare variable CTARTFTE VARCHAR(20);
declare variable RTIVA CHAR(1);
declare variable CTARTIVA VARCHAR(20);
declare variable RTICA CHAR(1);
declare variable CTARTICA VARCHAR(20);
declare variable DTO CHAR(1);
declare variable CTADTO VARCHAR(20);
declare variable EXISTE CHAR(1);
declare variable CUENTA VARCHAR(20);
declare variable MONTO NUMERIC(18,2);
declare variable TIPOCUEN CHAR(1);
declare variable NIT VARCHAR(20);
declare variable PROY VARCHAR(4);
declare variable CENTRO VARCHAR(4);
declare variable DEBITO NUMERIC(18,2);
declare variable CREDITO NUMERIC(18,2);
declare variable NROI INTEGER;
declare variable SUMA NUMERIC(18,2);
declare variable CTADIC VARCHAR(20);
declare variable BASEADIC VARCHAR(20);
declare variable PORCADIC NUMERIC(5,2);
declare variable VALORADIC NUMERIC(18,2);
declare variable DBADIC CHAR(1);
declare variable CHEQUE CHAR(1);
declare variable IDCAJA INTEGER;
declare variable IDBANCO INTEGER;
declare variable ANULADO CHAR(1);
declare variable VRBASE NUMERIC(18,2);
BEGIN
/* BUSQUE LA INTERFACE */
EXISTE = 'N';
SELECT 'S', TICO_COD, PRCO_PRE, INCJ_BASE, INCJ_DTOPP, INCJ_RTFTE, INCJ_RTIVA, INCJ_RTICA, INCJ_CAJA, INCJ_CTABASE, INCJ_CTADTO, INCJ_CTARTFTE, INCJ_CTARTIVA, INCJ_CTARTICA, INCJ_CTACAJA, INCJ_CONFIRMAR
    FROM INTERFAZ_CAJA
    WHERE INCJ_ID = :IDINTER
    INTO :EXISTE, :TIPOCOMP, :PREFCONT, :BASE, :DTO, :RTFTE, :RTIVA, :RTICA, :CAJA, :CTABASE, :CTADTO, :CTARTFTE, :CTARTIVA, :CTARTICA, :CTACAJA, :VER;
if (EXISTE = 'S') then
    BEGIN
    DELETE FROM contabilizacion WHERE CNTB_TIPOREF = 64 AND CNTB_IDREF = :IDDOC;

    /* TRAIGA EL ENCABEZADO DE LA CONSIGNACION */
    SELECT PREF_PRE, COTJ_NUMERO, COTJ_FECHA, COTJ_CONCEPTO, COTJ_MONTO, COTJ_COMISION, COTJ_RTFTE, COTJ_RTIVA, COTJ_RTICA, COTJ_CHEQUE, CAJA_ID, CUBA_COD, COTJ_ANULADO
        FROM consigna_tarjetas
        WHERE COTJ_ID = :IDDOC
        INTO :PREF, :NUM, :FECAUX, :CONC, :VRTOTAL, :VRDTO, :VRRTFTE, :VRRTIVA, :VRRTICA, :CHEQUE, :IDCAJA, :IDBANCO, :ANULADO;
    if (ANULADO = 'N') then
        BEGIN
        /* EL NIT ES EL DEL BANCO */
        SELECT B.banc_nit FROM bancos B, CUENTAS_BANCO C WHERE C.banc_cod = B.banc_cod AND C.cuba_cod = :idbanco INTO :nit;

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

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

        NROI = 0;
        SUMA = 0;
        ERROR = 0;
        VRBASE = VRTOTAL;

        IF ((CAJA = 'K') or (CAJA = 'F') ) THEN
            BEGIN
            if (VRTOTAL <> 0) then
                BEGIN
                IF ((CAJA = 'F')) THEN
                    BEGIN
                    /* TRAIGA LA CUENTA DE LA CAJA O EL BANCO A ABONAR */
                    if (CHEQUE = 'S') then
                        SELECT CUBA_CTACONTA FROM CUENTAS_BANCO WHERE CUBA_COD = :IDBANCO INTO CTACAJA;
                    ELSE
                        SELECT CAJA_CUENTA FROM CAJAS WHERE CAJA_ID = :IDCAJA INTO CTACAJA;
                    END
                
                CUENTA = NULL;
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :CTACAJA INTO :CUENTA, :TIPOCUEN;
                if (CUENTA IS NULL) then
                    begin
                    EXECUTE PROCEDURE ERROR (64, :IDDOC, :CTABASE, 2);
                    CUENTA = CTABASE;
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (64, :IDDOC, :CUENTA, 3);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (64, :IDDOC, :CUENTA, 4);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRTOTAL, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA + VRTOTAL;
                    END
                END /* VRTOTAL <> 0 */
            END /* CAJA CONSTANTE */
        
        if (DTO = 'K') then /* COMISION */
            BEGIN
            if (VRDTO <> 0) then
                BEGIN
                CUENTA = NULL;
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :CTADTO INTO :CUENTA, :TIPOCUEN;
                if (CUENTA IS NULL) then
                    begin
                    EXECUTE PROCEDURE ERROR (64, :IDDOC, :CTABASE, 2);
                    CUENTA = CTABASE;
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (64, :IDDOC, :CUENTA, 3);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (64, :IDDOC, :CUENTA, 4);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRDTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA + VRDTO;
                    END
                END /* VRDTO <> 0 */
            END /* DTO EN CTA CONSTANTE */
        
        /* RETENCION FUENTE */
        if (RTFTE = 'K') then
          if (VRRTFTE <> 0) then
            BEGIN
            PORC = vrrtfte * 100 / vrbase;
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTARTFTE INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERROR (64, :IDDOC, :ctartfte, 2);
                CUENTA = CTABASE;
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERROR (64, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                EXECUTE PROCEDURE ERROR (64, :IDDOC, :CUENTA, 4);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :vrbase, :PORC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA + VRRTFTE;
                END
            END /* RTFTE */
        
        /* RETENCION IVA */
        if (RTIVA = 'K') then
          if (VRRTIVA <> 0) then
            BEGIN
            PORC = VRRTIVA / VRBASE;
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO
                FROM CUENTAS
                WHERE CUEN_COD = :CTARTIVA
                INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERROR (64, :IDDOC, :ctartiva, 2);
                CUENTA = CTABASE;
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERROR (64, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                EXECUTE PROCEDURE ERROR (64, :IDDOC, :CUENTA, 4);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTIVA, 0, :VRBASE, :PORC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA + VRRTIVA;
                END
            END /* RTIVA */
        
        /* RETENCION ICA */
        if (rtica = 'K') then
          if (vrrtica <> 0) then
            BEGIN
            PORC = vrrtica / VRBASE;
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO
                FROM CUENTAS
                WHERE CUEN_COD = :ctartica
                INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERROR (64, :IDDOC, :ctartica, 2);
                CUENTA = ctartica;
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERROR (64, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                EXECUTE PROCEDURE ERROR (64, :IDDOC, :CUENTA, 4);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :vrrtica, 0, :VRBASE, :PORC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA + vrrtica;
                END
            END /* RTIVA */
        
        /* CIERRE EL COMPROBANTE CONTRA LA CUENTA DE LA CAJA */
        if ((SUMA <> 0) and ((BASE = 'F') or (BASE = 'K'))) then
            BEGIN
            if (SUMA < 0) then
                BEGIN
                DEBITO = SUMA * -1;
                CREDITO = 0;
                END
            ELSE    
                BEGIN
                DEBITO = 0;
                CREDITO = SUMA;
                END
            if (BASE = 'F') then
                SELECT CAJA_CUENTA FROM CAJAS WHERE CAJA_ID = :IDCAJA INTO CTABASE;

            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTABASE INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERROR (64, :IDDOC, :CTABASE, 2);
                CUENTA = CTABASE;
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERROR (64, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                EXECUTE PROCEDURE ERROR (64, :IDDOC, :CUENTA, 4);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'N') then
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :DEBITO, :CREDITO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            END /* SUMA EN CARTERA */

        /* recorra las cuentas adicionales */
        FOR SELECT INJC_CUENTA, INJC_BASE, INJC_PORC, INJC_VALOR, INJC_DB
            FROM INTERFAZ_CAJA_CTAS
            WHERE INCJ_ID = :IDINTER
            INTO :CTADIC, :BASEADIC, :PORCADIC, :VALORADIC, :DBADIC
            DO
            BEGIN
            if (:BASEADIC = 'TOTAL') then
                VALORADIC = VRTOTAL;
            if (:BASEADIC = 'DESCUENTO') then
                VALORADIC = VRDTO;
            if (:BASEADIC = 'RTFTE') then
                VALORADIC = VRRTFTE;
            if (:BASEADIC = 'RTIVA') then
                VALORADIC = VRRTIVA;
            MONTO = VALORADIC * PORCADIC;
        
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTADIC INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERROR (66, :IDDOC, :CTABASE, 2);
                CUENTA = CTABASE;
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERROR (66, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                EXECUTE PROCEDURE ERROR (66, :IDDOC, :CUENTA, 4);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                if (DBADIC = 'S') then
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                ELSE
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                END
            NROI = NROI + 1;
            END     
        
        if (ERROR > 0) then
            VER = 'S';
        SUSPEND;
        END
    END /* EXISTE LA INTERFAZ */
ELSE
    BEGIN
    EXECUTE PROCEDURE ERROR (64, :IDDOC, :PREF, 1);
    ERROR = ERROR + 1;
    VER = 'S';
    SUSPEND;
    END
END
^

SET TERM ; ^



/* 20090228B : repetia el cod barras del anterior cuando el articulo no tiene */
SET TERM ^ ;

CREATE OR ALTER PROCEDURE CONSULTA_ARTICULOS_VTAS(
    FECHA DATE,
    INACTIVOS CHAR(1),
    MODULO VARCHAR(20),
    BUSCAR VARCHAR(100),
    CUALQUIERA CHAR(1),
    COLUMNA INTEGER,
    BUSCAR2 VARCHAR(30),
    BUSCAR3 VARCHAR(30),
    BUSCAR4 VARCHAR(30),
    BUSCAR5 VARCHAR(30))
RETURNS (
    CODIGO VARCHAR(20),
    DES VARCHAR(60),
    REF VARCHAR(20),
    GRUPO VARCHAR(30),
    MARCA VARCHAR(30),
    UNIDAD VARCHAR(8),
    ESTADO VARCHAR(30),
    IVA NUMERIC(9,2),
    EXISTEN NUMERIC(18,4),
    PRECIO NUMERIC(18,2),
    CLASE CHAR(1))
AS
DECLARE VARIABLE LISTA INTEGER;
DECLARE VARIABLE EXIST CHAR(2);
DECLARE VARIABLE SINEXIST CHAR(2);
declare variable DIG INTEGER;
declare variable OK CHAR(1);
BEGIN
EXISTEN = 0;
EXECUTE PROCEDURE lee_configuracion ('FACTURACION','ARTICULOS', 'VER EXISTENCIA EN CONSULTA ARTICULOS') returning_values (:EXIST);
EXECUTE PROCEDURE lee_configuracion ('FACTURACION','FACTURAS', 'CODIGO DE LA LISTA DE PRECIOS A MOSTRAR EN ARTICULOS') returning_values (:LISTA);
if (modulo = 'FACTURACION') then
  EXECUTE PROCEDURE lee_configuracion ('FACTURACION','ARTICULOS','VER ARTICULOS SIN EXISTENCIA EN CONSULTA DE ARTICULOS') returning_values (:sinexist);
else
  sinexist = 'SI';
EXECUTE PROCEDURE LEE_CONFIGURACION ('FACTURACION', 'ARTICULOS', 'REDONDEO AL MULTIPLO DE DIEZ EN PRECIOS') returning_values (DIG);
if (LISTA > 0) then
    BEGIN
    if ((BUSCAR IS NOT NULL) AND (BUSCAR <> '')) then
        FOR select a.arti_cod, arti_des, grup_cod, arti_unidad, esar_cod, taiv_porc, marc_cod,arti_clase
            from articulo a, tarifa_iva t
            where a.taiv_cod = t.taiv_cod and substring(a.arti_cod from 1 FOR 2) <> '.t' and
            ((:INACTIVOS = 'S') or (esar_cod = 'A') or ((:INACTIVOS = 'C') AND (esar_cod = 'N'))) AND
            ((:COLUMNA <> 0) or (upper(A.ARTI_COD) like upper(:buscar))) AND
            ((:columna <> 1) or (upper(A.ARTI_DES) like upper(:buscar))) AND
            ((:columna <> 2) or (upper(A.ARTI_OBS) like upper(:buscar)) or (upper(A.ARTI_DES) like upper(:buscar)))
            INTO :CODIGO, :DES, :GRUPO, :UNIDAD, :ESTADO, :IVA, :MARCA, :CLASE
            do
            begin
            ref = '';
            select first 1 coba_cod from barras_articulo where arti_cod = :codigo into :ref;
            if ((COLUMNA <> 3) or (upper(REF) like upper(:buscar))) then
                BEGIN
                OK = 'N';
                PRECIO = 0;
                SELECT prar_fijo PRECIO FROM precios_articulo WHERE arti_cod = :CODIGO and lipr_cod = :LISTA INTO :PRECIO;
                EXECUTE PROCEDURE redondee(PRECIO, DIG) returning_values (PRECIO);
                if (EXIST = 'SI') then
                    BEGIN
                    EXECUTE PROCEDURE saldo_total_inventario (:CODIGO, :FECHA) returning_values (:EXISTEN);
                    if ((SINEXIST = 'SI')  or (existen <> 0)) then
                        OK = 'S';
                    END
                ELSE
                    OK = 'S';
                if (ok = 'S') then
                    if (CUALQUIERA = 'S') then
                        SUSPEND;
                    ELSE
                        if (BUSCAR2 <> '') then
                            BEGIN
                            IF (NOT EXISTS (SELECT ARTI_COD FROM ARTICULO WHERE ARTI_COD = :CODIGO AND ((upper(ARTI_DES) like upper(:BUSCAR2)) or (UPPER(ARTI_OBS) LIKE UPPER(:BUSCAR2))))) THEN
                                OK = 'N';
                            if ((OK = 'S') AND (BUSCAR3 <> '')) then
                                IF (NOT EXISTS (SELECT ARTI_COD FROM ARTICULO WHERE ARTI_COD = :CODIGO AND ((upper(ARTI_DES) like upper(:BUSCAR3)) or (UPPER(ARTI_OBS) LIKE UPPER(:BUSCAR3))))) THEN
                                    OK = 'N';
                            if ((OK = 'S') AND (BUSCAR4 <> '')) then
                                IF (NOT EXISTS (SELECT ARTI_COD FROM ARTICULO WHERE ARTI_COD = :CODIGO AND ((upper(ARTI_DES) like upper(:BUSCAR4)) or (UPPER(ARTI_OBS) LIKE UPPER(:BUSCAR4))))) THEN
                                    OK = 'N';
                            if ((OK = 'S') AND (BUSCAR4 <> '')) then
                                IF (NOT EXISTS (SELECT ARTI_COD FROM ARTICULO WHERE ARTI_COD = :CODIGO AND ((upper(ARTI_DES) like upper(:BUSCAR4)) or (UPPER(ARTI_OBS) LIKE UPPER(:BUSCAR4))))) THEN
                                    OK = 'N';
                            if ((OK = 'S') AND (BUSCAR5 <> '')) then
                                IF (NOT EXISTS (SELECT ARTI_COD FROM ARTICULO WHERE ARTI_COD = :CODIGO AND ((upper(ARTI_DES) like upper(:BUSCAR5)) or (UPPER(ARTI_OBS) LIKE UPPER(:BUSCAR5))))) THEN
                                    OK = 'N';
                            if (OK = 'S') then
                                SUSPEND;
                            END
                        ELSE
                            SUSPEND;
                END
            end
    ELSE
        FOR select a.arti_cod, arti_des, grup_cod, arti_unidad, esar_cod, taiv_porc, marc_cod,arti_clase
            from articulo a, tarifa_iva t
            where a.taiv_cod = t.taiv_cod and substring(a.arti_cod from 1 FOR 2) <> '.t' and
            ((:INACTIVOS = 'S') or (esar_cod = 'A') or ((:INACTIVOS = 'C') AND (esar_cod = 'N')))
            INTO :CODIGO, :DES, :GRUPO, :UNIDAD, :ESTADO, :IVA, :MARCA, :CLASE
            do
            begin
            ref = '';
            select first 1 coba_cod from barras_articulo where arti_cod = :codigo into :ref;
            PRECIO = 0;
            SELECT prar_fijo PRECIO FROM precios_articulo WHERE arti_cod = :CODIGO and lipr_cod = :LISTA INTO :PRECIO;
            EXECUTE PROCEDURE redondee(PRECIO, DIG) returning_values (PRECIO);
            if (EXIST = 'SI') then
                BEGIN
                EXECUTE PROCEDURE saldo_total_inventario (:CODIGO, :FECHA) returning_values (:EXISTEN);
                if ((SINEXIST = 'SI')  or (existen <> 0)) then
                    SUSPEND;
                END
            ELSE
                SUSPEND;
            END
    END
ELSE
    if ((BUSCAR IS NOT NULL) AND (BUSCAR <> '')) then
        FOR select arti_cod, arti_des, grup_cod, arti_unidad, esar_cod, taiv_porc, arti_precio, marc_cod, arti_clase
            from articulo a, tarifa_iva t
            where a.taiv_cod = t.taiv_cod and substring(a.arti_cod from 1 FOR 2) <> '.t' and
            ((:INACTIVOS = 'S') or (esar_cod = 'A') or ((:INACTIVOS = 'C') AND (esar_cod = 'N'))) AND
            ((:COLUMNA <> 0) or (upper(A.ARTI_COD) like upper(:buscar))) AND
            ((:columna <> 1) or (upper(A.ARTI_DES) like upper(:buscar))) AND
            ((:columna <> 2) or (upper(A.ARTI_OBS) like upper(:buscar)) or (upper(A.ARTI_DES) like upper(:buscar)))
            INTO :CODIGO, :DES, :GRUPO, :UNIDAD, :ESTADO, :IVA, :PRECIO, :MARCA, :CLASE
            do
            begin
            ref = '';
            select first 1 coba_cod from barras_articulo where arti_cod = :codigo into :ref;
            if ((COLUMNA <> 3) or (upper(REF) like upper(:buscar))) then
                BEGIN
                if (EXIST = 'SI') then
                    BEGIN
                    EXECUTE PROCEDURE saldo_total_inventario (:CODIGO, :FECHA) returning_values (:EXISTEN);
                    if ((SINEXIST = 'SI') or (existen <> 0)) then
                        OK = 'S';
                    END
                ELSE
                    OK = 'S';
                if (ok = 'S') then
                    if (CUALQUIERA = 'S') then
                        SUSPEND;
                    ELSE
                        if (BUSCAR2 <> '') then
                            BEGIN
                            IF (NOT EXISTS (SELECT ARTI_COD FROM ARTICULO WHERE ARTI_COD = :CODIGO AND ((upper(ARTI_DES) like upper(:BUSCAR2)) or (UPPER(ARTI_OBS) LIKE UPPER(:BUSCAR2))))) THEN
                                OK = 'N';
                            if ((OK = 'S') AND (BUSCAR3 <> '')) then
                                IF (NOT EXISTS (SELECT ARTI_COD FROM ARTICULO WHERE ARTI_COD = :CODIGO AND ((upper(ARTI_DES) like upper(:BUSCAR3)) or (UPPER(ARTI_OBS) LIKE UPPER(:BUSCAR3))))) THEN
                                    OK = 'N';
                            if ((OK = 'S') AND (BUSCAR4 <> '')) then
                                IF (NOT EXISTS (SELECT ARTI_COD FROM ARTICULO WHERE ARTI_COD = :CODIGO AND ((upper(ARTI_DES) like upper(:BUSCAR4)) or (UPPER(ARTI_OBS) LIKE UPPER(:BUSCAR4))))) THEN
                                    OK = 'N';
                            if ((OK = 'S') AND (BUSCAR4 <> '')) then
                                IF (NOT EXISTS (SELECT ARTI_COD FROM ARTICULO WHERE ARTI_COD = :CODIGO AND ((upper(ARTI_DES) like upper(:BUSCAR4)) or (UPPER(ARTI_OBS) LIKE UPPER(:BUSCAR4))))) THEN
                                    OK = 'N';
                            if ((OK = 'S') AND (BUSCAR5 <> '')) then
                                IF (NOT EXISTS (SELECT ARTI_COD FROM ARTICULO WHERE ARTI_COD = :CODIGO AND ((upper(ARTI_DES) like upper(:BUSCAR5)) or (UPPER(ARTI_OBS) LIKE UPPER(:BUSCAR5))))) THEN
                                    OK = 'N';
                            if (OK = 'S') then
                                SUSPEND;
                            END
                        ELSE
                            SUSPEND;
                END
            end
    ELSE
        FOR select arti_cod, arti_des, grup_cod, arti_unidad, esar_cod, taiv_porc, arti_precio, marc_cod, arti_clase
            from articulo a, tarifa_iva t
            where a.taiv_cod = t.taiv_cod and substring(a.arti_cod from 1 FOR 2) <> '.t' and
            ((:INACTIVOS = 'S') or (esar_cod = 'A') or ((:INACTIVOS = 'C') AND (esar_cod = 'N')))
            INTO :CODIGO, :DES, :GRUPO, :UNIDAD, :ESTADO, :IVA, :PRECIO, :MARCA, :CLASE
            do
            begin
            ref = '';
            select first 1 coba_cod from barras_articulo where arti_cod = :codigo into :ref;
            if (EXIST = 'SI') then
                BEGIN
                EXECUTE PROCEDURE saldo_total_inventario (:CODIGO, :FECHA) returning_values (:EXISTEN);
                if ((SINEXIST = 'SI') or (existen <> 0)) then
                    SUSPEND;
                END
            ELSE
                SUSPEND;
            end
END
^

SET TERM ; ^


/* 20090228C : NO INCLUIR ARTICULOS INACTIVOS */
SET TERM ^ ;

CREATE OR ALTER PROCEDURE AKTIVIA_PRODUCTOS
RETURNS (
    CODIGO VARCHAR(15),
    BARRAS VARCHAR(15),
    DESCR VARCHAR(60),
    IVA NUMERIC(9,2),
    ICO NUMERIC(18,2),
    UNIDAD VARCHAR(8),
    UNIDADES VARCHAR(100),
    GRUPO VARCHAR(30),
    MARCA VARCHAR(30),
    LISTA1 NUMERIC(18,2),
    LISTA2 NUMERIC(18,2),
    LISTA3 NUMERIC(18,2),
    LISTA4 NUMERIC(18,2),
    LISTA5 NUMERIC(18,2),
    LISTA6 NUMERIC(18,2),
    LISTA7 NUMERIC(18,2),
    LISTA8 NUMERIC(18,2))
AS
declare variable UNIDAD2 VARCHAR(8);
declare variable FACTOR NUMERIC(18,4);
begin
FOR select a.arti_cod, arti_des, a.grup_cod, marc_cod, arti_unidad, coba_cod, t.taiv_porc, a.arti_consumo
    from articulo a, barras_articulo b, tarifa_iva t WHERE A.arti_cod = B.arti_cod and a.taiv_cod = t.taiv_cod AND A.esar_cod = 'A'
    INTO  :codigo, :descr, :grupo, :marca, :unidad, :barras, :iva, :ico
    do
    BEGIN
    SELECT GRUP_NOM FROM GRUPO WHERE GRUP_COD = :grupo INTO :grupo;
    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :marca INTO :marca;
    UNIDADES = '';
    FOR SELECT FIRST 1 UNAR_UNIDAD, UNAR_FACCAN FROM unidad_articulo WHERE ARTI_COD = :CODIGO AND UNAR_ACTIVA = 'S' INTO :unidad2, :factor
        DO
        BEGIN
        UNIDADES = unidad2 || ',' || cast(factor as varchar(20));
        END
    if (UNIDADES = '') then
        UNIDADES = ',';
    SELECT PRAR_FIJO FROM precios_articulo WHERE ARTI_COD = :codigo and lipr_cod = 1 INTO :LISTA1;
    SELECT PRAR_FIJO FROM precios_articulo WHERE ARTI_COD = :codigo and lipr_cod = 2 INTO :LISTA2;
    SELECT PRAR_FIJO FROM precios_articulo WHERE ARTI_COD = :codigo and lipr_cod = 3 INTO :LISTA3;
    SELECT PRAR_FIJO FROM precios_articulo WHERE ARTI_COD = :codigo and lipr_cod = 4 INTO :LISTA4;
    SELECT PRAR_FIJO FROM precios_articulo WHERE ARTI_COD = :codigo and lipr_cod = 5 INTO :LISTA5;
    SELECT PRAR_FIJO FROM precios_articulo WHERE ARTI_COD = :codigo and lipr_cod = 6 INTO :LISTA6;
    SELECT PRAR_FIJO FROM precios_articulo WHERE ARTI_COD = :codigo and lipr_cod = 7 INTO :LISTA7;
    SELECT PRAR_FIJO FROM precios_articulo WHERE ARTI_COD = :codigo and lipr_cod = 8 INTO :LISTA8;
    suspend;
    END
end
^

SET TERM ; ^



/* 20090228D : string truncation en tipo */

SET TERM ^ ;

CREATE OR ALTER PROCEDURE CUADRE_CAJA_FPAGO(
    FECHA DATE)
RETURNS (
    CHETIPO VARCHAR(30),
    CHERECIBO VARCHAR(10),
    CHEMONTO NUMERIC(18,2))
AS
begin
/* DETALLE DE LAS FORMAS DE PAGO */
FOR SELECT FOPA_NOM, RCPA_MONTO, RECA_NUMERO FROM RECIBOS_CAJA_PAGO P, RECIBOS_CAJA R, formas_pago F
    WHERE R.RECA_ID = P.RECA_ID AND RECA_FECHA = :FECHA AND F.fopa_id = P.fopa_id AND P.FOPA_ID <> 1 and RECA_ANULADO = 'N'
    INTO :chetipo, :chemonto, :cherecibo
    DO
    BEGIN
    if (chemonto IS NULL) then
        chemonto = 0;
    SUSPEND;
    END
end
^

SET TERM ; ^



/* 20090228E : CRUCES DE EGRESOS EN CHEQUEO DE MOVIMIENTO CLIENTES */
SET TERM ^ ;

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

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

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

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

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

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

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

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

SET TERM ; ^


/* 20090228F : no tomaba el ultimo dia del mes en cartera y cxpagar */
SET TERM ^ ;

CREATE OR ALTER PROCEDURE MOVIMIENTO_CARTERA_MES(
    FECINI DATE,
    FECFIN DATE,
    SUBEMPRESA INTEGER,
    CONTADO CHAR(1),
    MONEDA INTEGER)
RETURNS (
    NIT VARCHAR(20),
    NOMBRE VARCHAR(60),
    CONTACTO VARCHAR(60),
    DIASMAX INTEGER,
    TELEFONO VARCHAR(40),
    INICIAL NUMERIC(18,2),
    DEBITOS NUMERIC(18,2),
    CREDITOS NUMERIC(18,2),
    ABONOS NUMERIC(18,2),
    FINAL NUMERIC(18,2))
AS
declare variable RETES CHAR(2);
declare variable TIPODOC INTEGER;
declare variable IDDOC INTEGER;
declare variable SALDO NUMERIC(18,2);
declare variable NUMROWS INTEGER;
declare variable DIASF INTEGER;
declare variable DIAS INTEGER;
DECLARE VARIABLE FOV CHAR(11);
BEGIN
EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'ANALISIS DE CARTERA CON FECHA FACTURA O VENCIMIENTO') RETURNING_VALUES (FOV);
for select TERC_NIT, TERC_NOM, TERC_CONTACTO, TERC_TEL from TERCEROS WHERE TERC_CLIE = 'S' into :NIT, :NOMBRE, :CONTACTO, :TELEFONO
  DO
    BEGIN
    diasmax = 0;
    SELECT COUNT(*) FROM AUTORIZACIONES WHERE AUTO_NITCONTADO = :NIT INTO :numrows;
    IF ((CONTADO = 'S') or (numrows = 0)) THEN
        BEGIN
        FECINI = FECINI - 1;
        INICIAL = 0;
        FOR SELECT MVCL_TIPOREF, MVCL_IDREF, (:FECFIN-MVCL_FECHA), (:FECFIN-MVCL_VENCE) FROM MOVIMIENTO_CLIENTES
            WHERE TERC_NIT = :NIT AND MVCL_FECHA <= :FECINI AND
            MVCL_ABONO = 'N' AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA)) AND
            ((:moneda = 0) or (MVCL_TRM <> 1))
            INTO :TIPODOC, :IDDOC, :DIASF, DIAS
            DO
            BEGIN
            EXECUTE PROCEDURE saldo_doc_cartera(TIPODOC, IDDOC, FECINI, MONEDA) returning_values (SALDO);
            if (SALDO <> 0) then
                BEGIN
                INICIAL = INICIAL + SALDO;
                if (FOV = 'FECHA') then
                    BEGIN
                    if ((SALDO > 0) AND (DIASMAX < DIASF)) then
                        DIASMAX = DIASF;
                    END
                ELSE
                    BEGIN
                    if ((SALDO > 0) AND (DIASMAX < DIAS)) then
                        DIASMAX = DIAS;
                    END
                END
            END
        EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'DESCONTAR RETENCIONES POR CAUSACION') returning_values(:RETES);
        FECINI = FECINI + 1;
        if (RETES = 'SI') then
            BEGIN
            if (MONEDA = 0) then
                BEGIN
                SELECT SUM(MVCL_MONTO-MVCL_RTEFTE-MVCL_RTEIVA-MVCL_RTEICA), MAX(:FECFIN-MVCL_FECHA), MAX(:FECFIN-MVCL_VENCE) FROM movimiento_clientes
                    WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND MVCL_FECHA <= :FECFIN
                    AND MVCL_DEBITO = 'S' AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA))
                    INTO :DEBITOS, :diasf, :dias;
                SELECT SUM(MVCL_MONTO-MVCL_RTEFTE-MVCL_RTEIVA-MVCL_RTEICA) FROM movimiento_clientes
                    WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND MVCL_FECHA <= :FECFIN
                    AND MVCL_DEBITO = 'N' AND MVCL_ABONO = 'N' and MVCL_TIPOREF <> 45 AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA))
                    INTO :CREDITOS;
                SELECT SUM(MVCL_MONTO) FROM movimiento_clientes
                    WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND MVCL_FECHA <= :FECFIN
                    AND MVCL_ABONO = 'S' AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA))
                    INTO :ABONOS;
                END
            ELSE
                BEGIN
                SELECT SUM((MVCL_MONTO-MVCL_RTEFTE-MVCL_RTEIVA-MVCL_RTEICA)/MVCL_TRM), MAX(:FECFIN-MVCL_FECHA), MAX(:FECFIN-MVCL_VENCE) FROM movimiento_clientes
                    WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND MVCL_FECHA <= :FECFIN
                    AND MVCL_DEBITO = 'S' AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA))
                    INTO :DEBITOS, :diasf, :dias;
                SELECT SUM((MVCL_MONTO-MVCL_RTEFTE-MVCL_RTEIVA-MVCL_RTEICA)/MVCL_TRM) FROM movimiento_clientes
                    WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND MVCL_FECHA <= :FECFIN
                    AND MVCL_DEBITO = 'N' AND MVCL_ABONO = 'N' and MVCL_TIPOREF <> 45 AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA))
                    INTO :CREDITOS;
                SELECT SUM(MVCL_MONTO/MVCL_TRM) FROM movimiento_clientes
                    WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND MVCL_FECHA <= :FECFIN
                    AND MVCL_ABONO = 'S' AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA))
                    INTO :ABONOS;
                END
            END
        ELSE
            BEGIN
            if (MONEDA = 0) then
                BEGIN
                SELECT SUM(MVCL_MONTO), MAX(:FECFIN-MVCL_FECHA), MAX(:FECFIN-MVCL_VENCE) FROM movimiento_clientes
                    WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND MVCL_FECHA <= :FECFIN
                    AND MVCL_DEBITO = 'S' AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA))
                    INTO :DEBITOS, :diasf, :dias;
                SELECT SUM(MVCL_MONTO) FROM movimiento_clientes
                    WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND MVCL_FECHA <= :FECFIN
                    AND MVCL_DEBITO = 'N' AND MVCL_ABONO = 'N' and MVCL_TIPOREF <> 45 AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA))
                    INTO :CREDITOS;
                SELECT SUM(MVCL_MONTO+MVCL_RTEFTE+MVCL_RTEIVA+MVCL_RTEICA) FROM movimiento_clientes
                    WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND MVCL_FECHA <= :FECFIN
                    AND MVCL_ABONO = 'S' AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA))
                    INTO :ABONOS;
                END
            ELSE
                BEGIN
                SELECT SUM(MVCL_MONTO/MVCL_TRM), MAX(:FECFIN-MVCL_FECHA), MAX(:FECFIN-MVCL_VENCE) FROM movimiento_clientes
                    WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND MVCL_FECHA <= :FECFIN
                    AND MVCL_DEBITO = 'S' AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA))
                    INTO :DEBITOS, :diasf, :dias;
                SELECT SUM(MVCL_MONTO/MVCL_TRM) FROM movimiento_clientes
                    WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND MVCL_FECHA <= :FECFIN
                    AND MVCL_DEBITO = 'N' AND MVCL_ABONO = 'N' and MVCL_TIPOREF <> 45 AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA))
                    INTO :CREDITOS;
                SELECT SUM((MVCL_MONTO+MVCL_RTEFTE+MVCL_RTEIVA+MVCL_RTEICA)/MVCL_TRM) FROM movimiento_clientes
                    WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND MVCL_FECHA <= :FECFIN
                    AND MVCL_ABONO = 'S' AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA))
                    INTO :ABONOS;
                END
            END
        if (FOV = 'FECHA') then
            BEGIN
            if ((DIASMAX < DIASF) AND (DIASF IS NOT NULL)) then
                DIASMAX = DIASF;
            END
        ELSE
            BEGIN
            if ((DIASMAX < DIAS) AND (DIAS IS NOT NULL)) then
                DIASMAX = DIAS;
            END
        if (DEBITOS IS NULL) then
            DEBITOS = 0;
        if (CREDITOS IS NULL) then
            CREDITOS = 0;
        if (ABONOS IS NULL) then
            ABONOS = 0;
        FINAL = INICIAL + DEBITOS - CREDITOS - ABONOS;
        SUSPEND;
        END
    END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER PROCEDURE MOVIMIENTO_CXPAGAR_MES(
    FECINI DATE,
    FECFIN DATE,
    MONEDA INTEGER)
RETURNS (
    NIT VARCHAR(20),
    NOMBRE VARCHAR(60),
    INICIAL NUMERIC(18,4),
    DEBITOS NUMERIC(18,4),
    CREDITOS NUMERIC(18,4),
    ABONOS NUMERIC(18,4),
    FINAL NUMERIC(18,4))
AS
declare variable RETES CHAR(2);
BEGIN
  for select TERC_NIT, TERC_NOM from TERCEROS WHERE TERC_PROV = 'S' into :NIT, :NOMBRE
  DO
    BEGIN
    EXECUTE PROCEDURE saldo_proveedor (NIT, FECINI, MONEDA) returning_values (INICIAL);
    EXECUTE PROCEDURE LEE_CONFIGURACION('CXPAGAR', 'SALDOS', 'DESCONTAR RETENCIONES POR CAUSACION') returning_values(:RETES);
    if (RETES = 'SI') then
        BEGIN
        SELECT SUM((MVPR_MONTO-MVPR_RTFTE-MVPR_RTIVA-MVPR_RTICA)/MVPR_TRM)
            FROM movimiento_proveedor
            WHERE TERC_NIT = :NIT AND MVPR_FECHA >= :FECINI AND MVPR_FECHA <= :FECFIN AND MVPR_DEBITO = 'S' AND ((:MONEDA = 0) or (MVPR_TRM <> 1))
            INTO :DEBITOS;
        SELECT SUM((MVPR_MONTO-MVPR_RTFTE-MVPR_RTIVA-MVPR_RTICA)/MVPR_TRM)
            FROM movimiento_proveedor
            WHERE TERC_NIT = :NIT AND MVPR_FECHA >= :FECINI AND MVPR_FECHA <= :FECFIN AND MVPR_DEBITO = 'N' AND MVPR_ABONO = 'N' and MVPR_TIPOREF <> 55 AND ((:MONEDA = 0) or (MVPR_TRM <> 1))
            INTO :CREDITOS;
        SELECT SUM(MVPR_MONTO/MVPR_TRM) FROM movimiento_proveedor
            WHERE TERC_NIT = :NIT AND MVPR_FECHA >= :FECINI AND MVPR_FECHA <= :FECFIN AND MVPR_ABONO = 'S' AND ((:MONEDA = 0) or (MVPR_TRM <> 1))
            INTO :ABONOS;
        END
    ELSE
        BEGIN
        SELECT SUM(MVPR_MONTO/MVPR_TRM)
            FROM movimiento_proveedor
            WHERE TERC_NIT = :NIT AND MVPR_FECHA >= :FECINI AND MVPR_FECHA <= :FECFIN AND MVPR_DEBITO = 'S' AND ((:MONEDA = 0) or (MVPR_TRM <> 1))
            INTO :DEBITOS;
        SELECT SUM(MVPR_MONTO/MVPR_TRM)
            FROM movimiento_proveedor
            WHERE TERC_NIT = :NIT AND MVPR_FECHA >= :FECINI AND MVPR_FECHA <= :FECFIN AND MVPR_DEBITO = 'N' AND MVPR_ABONO = 'N' AND MVPR_TIPOREF <> 55 AND ((:MONEDA = 0) or (MVPR_TRM <> 1))
            INTO :CREDITOS;
        SELECT SUM((MVPR_MONTO+MVPR_RTFTE+MVPR_RTIVA+MVPR_RTICA)/MVPR_TRM)
            FROM movimiento_proveedor
            WHERE TERC_NIT = :NIT AND MVPR_FECHA >= :FECINI AND MVPR_FECHA <= :FECFIN AND MVPR_ABONO = 'S' AND ((:MONEDA = 0) or (MVPR_TRM <> 1))
            INTO :ABONOS;
        END
    if (DEBITOS IS NULL) then
        DEBITOS = 0;
    if (CREDITOS IS NULL) then
        CREDITOS = 0;
    if (ABONOS IS NULL) then
        ABONOS = 0;
    FINAL = INICIAL + DEBITOS - CREDITOS - ABONOS;
    SUSPEND;
    END
END
^

SET TERM ; ^



/* 20090301 : STAND NO SE INICIALIZABA EN CADA REGISTRO */
SET TERM ^ ;

CREATE OR ALTER PROCEDURE EXISTENCIAS_COMPRAS(
    ARTICULO VARCHAR(15),
    FECHA DATE,
    UNIDAD VARCHAR(8))
RETURNS (
    BODEGA VARCHAR(2),
    EXISTENCIA NUMERIC(18,4),
    RESERVADO NUMERIC(18,4),
    ORDENADO NUMERIC(18,4),
    PROMEDIO NUMERIC(18,4),
    VENTAMES NUMERIC(18,4),
    FECHACMP DATE,
    CANTCMP NUMERIC(18,4),
    DIAS INTEGER,
    SUGERIDO NUMERIC(18,4),
    STAND VARCHAR(15))
AS
declare variable FACTOR NUMERIC(15,4);
declare variable ORDENC NUMERIC(18,4);
declare variable PEDIDO NUMERIC(18,4);
declare variable ITEM INTEGER;
declare variable ID INTEGER;
declare variable UND VARCHAR(8);
declare variable CANT NUMERIC(18,4);
declare variable FACTOR2 NUMERIC(18,4);
declare variable fecini DATE;
declare variable FECHAAUX VARCHAR(10);
declare variable AGENCIA INTEGER;
declare variable DEVMES NUMERIC(18,2);
declare variable MFAC INTEGER;
declare variable MDEV INTEGER;
declare variable IVAF NUMERIC(18,2);
declare variable IVAD NUMERIC(18,2);
declare variable DIA_ART VARCHAR(2) CHARACTER SET NONE;
declare variable DIASC VARCHAR(255);
declare variable PEDAUTO CHAR(2);
declare variable SALIDAS NUMERIC(18,4);
BEGIN
  for select bode_cod, SUCU_ID from bodega into :bodega, :agencia
    do
    begin
    execute procedure saldo_inventario (:articulo, :bodega, :fecha) returning_values (:Existencia);
    EXECUTE PROCEDURE FACTOR_UNIDAD_CANT(:ARTICULO, :UNIDAD) returning_values (:FACTOR);
    if (FACTOR <> 0) then
        EXISTENCIA = EXISTENCIA / FACTOR;
    else
        EXISTENCIA = 0;
    STAND = '';
    SELECT STAND_COD FROM STANDS WHERE ARTI_COD = :ARTICULO AND STAND_BODEGA = :BODEGA INTO :stand;
    EXECUTE PROCEDURE promedio_salidas_articulo (:ARTICULO, :FECHA, :BODEGA) returning_values (:PROMEDIO, :SALIDAS);
    EXECUTE PROCEDURE lee_configuracion ('INVENTARIO', 'EXISTENCIAS', 'PROMEDIAR LAS SALIDAS DEL INVENTARIO CON EL NUMERO DE DIAS ASIGNADO A CADA ARTICULO') returning_values (:DIA_ART);
    if (DIA_ART = 'NO') then
        BEGIN
        EXECUTE PROCEDURE lee_configuracion ('INVENTARIO', 'EXISTENCIAS', 'NUMERO DE DIAS PARA PROMEDIO DE SALIDAS POR ARTICULO') returning_values (DIASC);
        DIAS = CAST(DIASC AS INTEGER);
        END
    ELSE
        SELECT ARTI_DIAS FROM ARTICULO WHERE ARTI_COD = :ARTICULO INTO :DIAS;
    if (DIAS is null) then
        DIAS = 0;
    PROMEDIO = DIAS * PROMEDIO;
    if (FACTOR <> 0) then
        PROMEDIO = PROMEDIO / FACTOR;
    SUGERIDO = PROMEDIO - EXISTENCIA;
    SELECT SUM(ORID_ENTREGAR)
      FROM ORDENINVENTARIO_DETALLE OD, ordenes_inventario O
      WHERE O.ORIN_ID = OD.ORIN_ID AND ARTI_COD = :ARTICULO AND ORIN_FECHA <= :FECHA AND ORIN_FECLLEGA >= :FECHA AND ORID_ANULADO = 'N' AND OD.BODE_COD = :BODEGA
      INTO :ORDENADO;
    if (ORDENADO IS NULL) then
        ORDENADO = 0;
    ORDENC = 0;
    FOR SELECT O.ORDC_ID, OCDE_ITEM, OCDE_CANT * OCDE_FACTOR
        FROM ORDENES_COMPRA O, ORDENES_COMPRA_DETALLE OD
        WHERE O.ORDC_ID = OD.ORDC_ID AND OD.ARTI_COD = :ARTICULO AND (ORDC_FECHA+ORDC_VALIDEZ) >= :FECHA AND ORDC_FECHA <= :FECHA AND OCDE_ANULADO = 'N' AND OD.BODE_COD = :BODEGA
        INTO :ID, :ITEM, :CANT
        do
        BEGIN
        EXECUTE PROCEDURE FALTANTE(23, 21, ID, ITEM) returning_values (PEDIDO, UND, FACTOR2);
        if (PEDIDO * FACTOR2 = CANT) then /* SI NO SE HA FACTURADO MIRE A VER SI SE REMISIONO */
            EXECUTE PROCEDURE FALTANTE(23, 22, ID, ITEM) returning_values (PEDIDO, UND, FACTOR2);
        if (PEDIDO IS NULL) then
            PEDIDO = 0;
        ORDENC = ORDENC + PEDIDO * FACTOR2;
        END
    ORDENADO = ORDENADO + ORDENC;
    if (FACTOR <> 0) then
        ORDENADO = ORDENADO / FACTOR;
    SELECT SUM(RSDE_LIBERAR)
      FROM RESERVAS_DETALLE RD, RESERVAS R
      WHERE R.RESE_ID = RD.RESE_ID AND ARTI_COD = :ARTICULO AND RESE_FECHA <= :FECHA AND RESE_VENCE >= :FECHA AND RD.BODE_COD = :BODEGA AND RSDE_ANULADO = 'N'
      INTO :RESERVADO;
    if (RESERVADO IS NULL) then
        RESERVADO = 0;
    PEDIDO = 0;
    FOR SELECT P.PEDI_ID, PEDE_ITEM, PEDE_CANT * PEDE_FACTOR
        FROM PEDIDOS P, PEDIDOS_DETALLE PD
        WHERE P.PEDI_ID = PD.PEDI_ID AND PD.ARTI_COD = :ARTICULO AND (PEDI_FECHA+PEDI_VALIDEZ) >= :FECHA AND PEDI_FECHA <= :FECHA AND PEDE_ANULADO = 'N' AND BODE_COD = :BODEGA
        INTO :ID, :ITEM, :CANT
        do
        BEGIN
        EXECUTE PROCEDURE FALTANTE(34, 31, ID, ITEM) returning_values (ORDENC, UND, FACTOR2);
        EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION', 'FACTURAS', 'GENERAR PEDIDO AUTOMATICAMENTE CON LA FACTURA') returning_values (pedauto);
        if ((ORDENC * FACTOR2 = CANT) or (PEDAUTO = 'SI')) then /* SI NO SE HA FACTURADO MIRE A VER SI SE REMISIONO */
            EXECUTE PROCEDURE FALTANTE(34, 32, ID, ITEM) returning_values (ORDENC, UND, FACTOR2);
        if (ORDENC IS NULL) then
            ORDENC = 0;
        PEDIDO = PEDIDO + ORDENC * FACTOR2;
        END
    RESERVADO = RESERVADO + PEDIDO;
    if (FACTOR <> 0) then
        RESERVADO = RESERVADO / FACTOR;
    /* VENTAS MES */
    FECHAAUX = CAST (FECHA AS VARCHAR(10));
    FECHAAUX = SUBSTR(FECHAAUX, 1, 7) || '/01';
    FECINI = CAST (FECHAAUX AS DATE);
    EXECUTE PROCEDURE ventas_articulo (:ARTICULO, :FECINI, :FECHA, :agencia) returning_values (:ventames, :mfac, :devmes, :mdev, :ivaf, :ivad);
    ventames = ventames - devmes;
    if (FACTOR <> 0) then
        ventames = ventames / FACTOR;
    /* FECHA COMPRA */
    SELECT FIRST 1 FACO_FECHA, FCDE_CANT * FCDE_FACTOR FROM FACTURAS_COMPRA F, FACTURAS_COMPRAS_DETALLE D
        WHERE F.FACO_ID = D.faco_id AND D.ARTI_COD = :articulo AND FACO_FECHA <= :FECHA AND D.bode_cod = :BODEGA
        ORDER BY FACO_FECHA DESC, F.FACO_ID DESC
        INTO :fechacmp, :cantcmp;
    SUSPEND;
    end
END
^

SET TERM ; ^



/* 20090302 : LA VARIABLE EXISTE NO SE INICIALIZABA AL RECALCULAR LOS EGRESOS_CRUCES Y OMITIA EL REGISTRO EN SALDOS */

SET TERM ^ ;

CREATE OR ALTER PROCEDURE CHEQUEO_SALDOS_DOC_CARTERA(
    CLIINI VARCHAR(20),
    CLIFIN VARCHAR(20))
RETURNS (
    ERROR VARCHAR(60),
    TIPO INTEGER,
    ID INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(6))
AS
declare variable FECHA DATE;
declare variable NIT VARCHAR(20);
declare variable RTFTE NUMERIC(18, 2);
declare variable RTIVA NUMERIC(18, 2);
declare variable RTICA NUMERIC(18, 2);
declare variable MONTO NUMERIC(18, 2);
declare variable EXISTE CHAR(1);
declare variable IDR INTEGER;
declare variable RECAID INTEGER;
declare variable TRM NUMERIC(18, 2);
BEGIN
DELETE FROM SALDOS_DOC_CARTERA WHERE TERC_NIT >= :CLIINI AND TERC_NIT <= :CLIFIN;
DELETE FROM ANTICIPOS_CLIENTE WHERE RECA_ID = 0;

FOR SELECT FACT_ID, FACT_FECHA, TERC_NIT, FACT_RTFTEMONTO, FACT_rtivamonto, FACT_rticamonto, FACT_TOTAL, FACT_TRM
    FROM FACTURAS WHERE FACT_ID <> 0 and fact_anulado = 'N' AND TERC_NIT >= :CLIINI AND TERC_NIT <= :CLIFIN
    ORDER BY FACT_FECHA
    INTO :ID, :FECHA, :nit,  :RTFTE, :RTIVA, :RTICA, :MONTO, :TRM
    DO
    INSERT INTO SALDOS_DOC_CARTERA (SDCA_TIPOREF, SDCA_IDREF, SDCA_FECHA, TERC_NIT, SDCA_RTFTE, SDCA_RTIVA, SDCA_RTICA, SDCA_ABONO, SDCA_ABRTFTE, SDCA_ABRTIVA, SDCA_ABRTICA, SDCA_DEBITO, SDCA_MONTO, SDCA_TRM)
        VALUES (31, :ID, :fecha, :nit, :rtfte, :rtiva, :rtica, 0, 0, 0, 0, 'S', :MONTO, :TRM);

FOR SELECT NDCL_ID, NDCL_FECHA, TERC_NIT, NDCL_RTFTEMONTO, NDCL_rtivamonto, NDCL_rticamonto, ndcl_monto+ndcl_ivamonto, NDCL_TRM
    FROM NOTAS_DEBITO_CLIENTES WHERE NDCL_ID <> 0 and NDCL_anulado = 'N'  AND TERC_NIT >= :CLIINI AND TERC_NIT <= :CLIFIN
    ORDER BY NDCL_FECHA
    INTO :ID, :FECHA, :nit,  :RTFTE, :RTIVA, :RTICA, :MONTO, :TRM
    DO
    INSERT INTO SALDOS_DOC_CARTERA (SDCA_TIPOREF, SDCA_IDREF, SDCA_FECHA, TERC_NIT, SDCA_RTFTE, SDCA_RTIVA, SDCA_RTICA, SDCA_ABONO, SDCA_ABRTFTE, SDCA_ABRTIVA, SDCA_ABRTICA, SDCA_DEBITO, SDCA_MONTO, SDCA_TRM)
        VALUES (41, :ID, :fecha, :nit, :rtfte, :rtiva, :rtica, 0, 0, 0, 0, 'S', :MONTO, :TRM);

FOR SELECT DVCH_ID, DVCH_FECHA, TERC_NIT, 0, 0, 0, DVCH_MONTO
    FROM devolucion_cheques WHERE DVCH_ID <> 0 and DVCH_anulado = 'N' AND DVCH_CARTERA = 'S'  AND TERC_NIT >= :CLIINI AND TERC_NIT <= :CLIFIN
    ORDER BY DVCH_FECHA
    INTO :ID, :FECHA, :nit,  :RTFTE, :RTIVA, :RTICA, :MONTO
    DO
    INSERT INTO SALDOS_DOC_CARTERA (SDCA_TIPOREF, SDCA_IDREF, SDCA_FECHA, TERC_NIT, SDCA_RTFTE, SDCA_RTIVA, SDCA_RTICA, SDCA_ABONO, SDCA_ABRTFTE, SDCA_ABRTIVA, SDCA_ABRTICA, SDCA_DEBITO, SDCA_MONTO, SDCA_TRM)
        VALUES (77, :ID, :fecha, :nit, :rtfte, :rtiva, :rtica, 0, 0, 0, 0, 'S', :MONTO, 1);

FOR SELECT DEVT_ID, DEVT_FECHA, TERC_NIT, DEVT_RTFTEMONTO, DEVT_rtivamonto, DEVT_rticamonto, devt_total, DEVT_TRM
    FROM DEVOLUCIONES_VENTAS WHERE DEVT_ID <> 0 and DEVT_anulado = 'N' AND TERC_NIT >= :CLIINI AND TERC_NIT <= :CLIFIN
    ORDER BY DEVT_FECHA
    INTO :ID, :FECHA, :nit,  :RTFTE, :RTIVA, :RTICA, :MONTO, :TRM
    DO
    INSERT INTO SALDOS_DOC_CARTERA (SDCA_TIPOREF, SDCA_IDREF, SDCA_FECHA, TERC_NIT, SDCA_RTFTE, SDCA_RTIVA, SDCA_RTICA, SDCA_ABONO, SDCA_ABRTFTE, SDCA_ABRTIVA, SDCA_ABRTICA, SDCA_DEBITO, SDCA_MONTO, SDCA_TRM)
        VALUES (33, :ID, :fecha, :nit, :rtfte*-1, :rtiva*-1, :rtica*-1, 0, 0, 0, 0, 'N', :MONTO * -1, :TRM);

FOR SELECT NCCL_ID, NCCL_FECHA, TERC_NIT, NCCL_RTFTEMONTO, NCCL_rtivamonto, NCCL_rticamonto, nccl_monto+nccl_ivamonto, NCCL_TRM
    FROM NOTAS_CREDITO_CLIENTES WHERE NCCL_ID <> 0 and NCCL_anulado = 'N' AND TERC_NIT >= :CLIINI AND TERC_NIT <= :CLIFIN
    ORDER BY NCCL_FECHA
    INTO :ID, :FECHA, :nit,  :RTFTE, :RTIVA, :RTICA, :MONTO, :TRM
    DO
    INSERT INTO SALDOS_DOC_CARTERA (SDCA_TIPOREF, SDCA_IDREF, SDCA_FECHA, TERC_NIT, SDCA_RTFTE, SDCA_RTIVA, SDCA_RTICA, SDCA_ABONO, SDCA_ABRTFTE, SDCA_ABRTIVA, SDCA_ABRTICA, SDCA_DEBITO, SDCA_MONTO, SDCA_TRM)
        VALUES (42, :ID, :fecha, :nit, :rtfte*-1, :rtiva*-1, :rtica*-1, 0, 0, 0, 0, 'N', :MONTO * -1, :TRM);

FOR SELECT ANCL_ID, ANCL_FECHA, TERC_NIT, ANCL_RTFTEMONTO, ANCL_rtivamonto, ANCL_rticamonto, ancl_base+ancl_ivamonto, ANCL_TRM
    FROM ANTICIPOS_CLIENTE WHERE ANCL_ID <> 0 and ANCL_anulado = 'N' AND TERC_NIT >= :CLIINI AND TERC_NIT <= :CLIFIN
    ORDER BY ANCL_FECHA
    INTO :ID, :FECHA, :nit,  :RTFTE, :RTIVA, :RTICA, :MONTO, :TRM
    DO
    INSERT INTO SALDOS_DOC_CARTERA (SDCA_TIPOREF, SDCA_IDREF, SDCA_FECHA, TERC_NIT, SDCA_RTFTE, SDCA_RTIVA, SDCA_RTICA, SDCA_ABONO, SDCA_ABRTFTE, SDCA_ABRTIVA, SDCA_ABRTICA, SDCA_DEBITO, SDCA_MONTO, SDCA_TRM)
        VALUES (45, :ID, :fecha, :nit, :rtfte*-1, :rtiva*-1, :rtica*-1, 0, 0, 0, 0, 'N', :MONTO * -1, :TRM);

FOR SELECT ACDE_TIPODOC, ACDE_IDDOC, APCL_FECHA, TERC_NIT, ACDE_APLICADO, ACDE_RTFTE, ACDE_RTIVA, ACDE_RTICA, A.apcl_trm
    FROM APLICACION_CLIENTE_DETALLE D, APLICACION_CLIENTE A
    WHERE A.APCL_ID = D.apcl_id AND A.APCL_ID <> 0 AND APCL_ANULADO = 'N' AND TERC_NIT >= :CLIINI AND TERC_NIT <= :CLIFIN
    ORDER BY APCL_FECHA
    INTO :TIPO, :ID, :FECHA, :NIT, :MONTO, :RTFTE, :RTIVA, :RTICA, :TRM
    DO
    BEGIN
    EXISTE = 'N';
    select 'S' from saldos_doc_cartera where sdca_tiporef = :TIPO and sdca_idref = :ID and sdca_fecha = :fecha into :EXISTE;
    if (Existe = 'S') then
        begin
        /* actualice el saldo del dia */
        UPDATE saldos_doc_cartera
            SET SDCA_ABONO = SDCA_ABONO + :MONTO,
                SDCA_ABRTFTE = SDCA_ABRTFTE + :RTFTE,
                SDCA_ABRTIVA = SDCA_ABRTIVA + :RTIVA,
                SDCA_ABRTICA = SDCA_ABRTICA + :RTICA,
                SDCA_TRM = :TRM
            WHERE SDCA_TIPOREF = :TIPO AND SDCA_IDREF = :ID AND SDCA_FECHA = :fecha;
        END
    ELSE
        BEGIN
        /* Inserte un nuevo saldo diario */
        INSERT INTO SALDOS_DOC_CARTERA (SDCA_TIPOREF, SDCA_IDREF, SDCA_FECHA, TERC_NIT, SDCA_RTFTE, SDCA_RTIVA, SDCA_RTICA, SDCA_ABONO, SDCA_ABRTFTE, SDCA_ABRTIVA, SDCA_ABRTICA, SDCA_DEBITO, SDCA_MONTO, SDCA_TRM)
            VALUES (:TIPO, :ID, :fecha, :NIT, 0, 0, 0, :MONTO, :rtfte, :rtiva, :rtica, 'N', 0, :TRM);
        END
    END

FOR SELECT R.RECA_ID, RCDE_TIPODOC, RCDE_IDDOC, RECA_FECHA, TERC_NIT, RCDE_ABONO+RCDE_DTOF, RCDE_RTFTE, RCDE_RTIVA, RCDE_RTICA, RECA_TRM
    FROM RECIBOS_CAJA_DETALLE D, RECIBOS_CAJA R
    WHERE R.RECA_ID = D.RECA_id AND R.RECA_ID <> 0 AND RECA_ANULADO = 'N' AND TERC_NIT >= :CLIINI AND TERC_NIT <= :CLIFIN
    ORDER BY RECA_FECHA
    INTO :IDR, :TIPO, :ID, :FECHA, :NIT, :MONTO, :RTFTE, :RTIVA, :RTICA, :TRM
    DO
    BEGIN
    EXISTE = 'N';
    if (TIPO = 45) then
        BEGIN
        SELECT RECA_ID FROM ANTICIPOS_CLIENTE WHERE ANCL_ID = :ID INTO :RECAID;
        if (RECAID = IDR) then
            EXISTE = 'S';
        END
    if (EXISTE = 'N') then
        BEGIN
        select 'S' from saldos_doc_cartera where sdca_tiporef = :TIPO and sdca_idref = :ID and sdca_fecha = :fecha into :EXISTE;
        if (Existe = 'S') then
            begin
            /* actualice el saldo del dia */
            UPDATE saldos_doc_cartera
                SET SDCA_ABONO = SDCA_ABONO + :MONTO,
                    SDCA_ABRTFTE = SDCA_ABRTFTE + :RTFTE,
                    SDCA_ABRTIVA = SDCA_ABRTIVA + :RTIVA,
                    SDCA_ABRTICA = SDCA_ABRTICA + :RTICA,
                    SDCA_TRM = :TRM
                WHERE SDCA_TIPOREF = :TIPO AND SDCA_IDREF = :ID AND SDCA_FECHA = :fecha;
            END
        ELSE
            BEGIN
            /* Inserte un nuevo saldo diario */
            INSERT INTO SALDOS_DOC_CARTERA (SDCA_TIPOREF, SDCA_IDREF, SDCA_FECHA, TERC_NIT, SDCA_RTFTE, SDCA_RTIVA, SDCA_RTICA, SDCA_ABONO, SDCA_ABRTFTE, SDCA_ABRTIVA, SDCA_ABRTICA, SDCA_DEBITO, SDCA_MONTO, SDCA_TRM)
                VALUES (:TIPO, :ID, :fecha, :NIT, 0, 0, 0, :MONTO, :rtfte, :rtiva, :rtica, 'N', 0, :TRM);
            END
        END
    END

FOR SELECT E.egre_id, EGCC_TIPODOC, EGCC_IDDOC, EGRE_FECHA, TERC_NIT, EGCC_ABONO+EGCC_DTOF, EGCC_RTFTE, EGCC_RTIVA, EGCC_RTICA, EGRE_TRM
    FROM EGRESOS_CRUCEC C, EGRESOS E
    WHERE E.egre_id = C.egre_id AND EGRE_ANULADO = 'N' AND TERC_NIT >= :CLIINI AND TERC_NIT <= :CLIFIN
    ORDER BY EGRE_FECHA
    INTO :IDR, :TIPO, :ID, :FECHA, :NIT, :MONTO, :RTFTE, :RTIVA, :RTICA, :TRM
    DO
    BEGIN
    EXISTE = 'N';
    select 'S' from saldos_doc_cartera where sdca_tiporef = :TIPO and sdca_idref = :ID and sdca_fecha = :fecha into :EXISTE;
    if (Existe = 'S') then
        begin
        /* actualice el saldo del dia */
        UPDATE saldos_doc_cartera
            SET SDCA_ABONO = SDCA_ABONO + :MONTO,
            SDCA_ABRTFTE = SDCA_ABRTFTE + :RTFTE,
            SDCA_ABRTIVA = SDCA_ABRTIVA + :RTIVA,
            SDCA_ABRTICA = SDCA_ABRTICA + :RTICA,
            SDCA_TRM = :TRM
            WHERE SDCA_TIPOREF = :TIPO AND SDCA_IDREF = :ID AND SDCA_FECHA = :fecha;
        END
    ELSE
        BEGIN
        /* Inserte un nuevo saldo diario */
        INSERT INTO SALDOS_DOC_CARTERA (SDCA_TIPOREF, SDCA_IDREF, SDCA_FECHA, TERC_NIT, SDCA_RTFTE, SDCA_RTIVA, SDCA_RTICA, SDCA_ABONO, SDCA_ABRTFTE, SDCA_ABRTIVA, SDCA_ABRTICA, SDCA_DEBITO, SDCA_MONTO, SDCA_TRM)
            VALUES (:TIPO, :ID, :fecha, :NIT, 0, 0, 0, :MONTO, :rtfte, :rtiva, :rtica, 'N', 0, :TRM);
        END
    END

for select ancl_id, ancl_base+ancl_ivamonto, PREF_PRE, ANCL_NUMERO, ANCL_TRM from anticipos_cliente
    where ANCL_ANULADO = 'N' and reca_id not in (select reca_id from recibos_caja where reca_anulado = 'N')
    into :ID, :MONTO, :PREF, :NUMERO, :TRM
    do
    begin
    FECHA = cast('now' as date);
    execute procedure saldo_doc_cartera(45, :id, :FECHA, 0) returning_values (:RTFTE);
    if ((MONTO = RTFTE) or (RTFTE IS NULL)) then
        DELETE FROM ANTICIPOS_CLIENTE WHERE ANCL_ID = :ID;
    ELSE
        BEGIN
        TIPO = 45;
        ERROR = 'DOCUMENTO ANULADO CON ABONOS';
        SUSPEND;
        END
    end
END
^

SET TERM ; ^



/* 20080302B : CERTIFICADOS DE RETENCION MUCHISIMO MAS RAPIDOS */

SET TERM ^ ;

CREATE OR ALTER PROCEDURE CERTIFICADOS_RETENCION (
    nitini varchar(20),
    nitfin varchar(20),
    ctaini varchar(20),
    ctafin varchar(20),
    fecini varchar(8),
    fecfin varchar(8),
    fecexp date,
    admon varchar(60),
    numerar char(1),
    inicial varchar(6))
returns (
    nit varchar(20),
    nombre varchar(60),
    direccion varchar(60),
    ciudad varchar(40),
    codcuenta varchar(20),
    nomcuenta varchar(60),
    base numeric(18,2),
    retencion numeric(18,2),
    fechaexp date,
    administracion varchar(60),
    numero varchar(20))
as
declare variable nitant varchar(20);
begin
NITANT = '';
FECHAEXP = FECEXP;
ADMINISTRACION = ADMON;
NUMERO = CAST((CAST(INICIAL AS INTEGER) - 1) AS CHAR(6));
FOR SELECT MAX(D.TERC_NIT), MAX(D.CUEN_COD), SUM(CODE_BASE), SUM(CODE_DEBITO - CODE_CREDITO), MAX(CUEN_NOM)
    FROM COMPROBANTE_ENCABEZADO E, COMPROBANTE_DETALLE D, CUENTAS C
    WHERE E.ENCO_CONSEC = D.ENCO_CONSEC AND C.CUEN_COD >= :CTAINI AND C.CUEN_COD <= :CTAFIN AND D.cuen_cod = C.cuen_cod AND CUEN_RETENCION = 'S' AND
    D.TERC_NIT >= :NITINI AND D.TERC_NIT <= :NITFIN AND ENCO_FECHA >= :FECINI AND ENCO_FECHA <= :FECFIN
    GROUP BY D.TERC_NIT, D.CUEN_COD
    INTO :NIT, :CODCUENTA, :base,  :RETENCION, :NOMCUENTA
    DO
    BEGIN
    SELECT TERC_NOM, TERC_DIR, TERC_CIU FROM TERCEROS
        WHERE TERC_NIT = :NIT INTO :NOMBRE, :DIRECCION, :CIUDAD;
    if (RETENCION <> 0) then
        begin
        if (substr(CODCUENTA, 1, 1) = '2') then
            BEGIN
            BASE = BASE * -1;
            RETENCION = RETENCION * -1;
            END
        if (numerar = 'S') then
            BEGIN
            if (nit <> NITANT) then
                BEGIN
                NUMERO = CAST((CAST(NUMERO AS INTEGER) + 1) AS CHAR(6));
                EXECUTE PROCEDURE COMPLETA_CEROS(NUMERO) returning_values (NUMERO);
                END
            NITANT = NIT;
            END
        ELSE
            NUMERO = '';
        SUSPEND;
        end
    END
end
^

SET TERM ; ^



/* 20090302C : PESO DIVIDIDO POR 1000 ANTES DE MULTIPLICARLO POR CANTIDAD PARA EVITAR OVERFLOW */
SET TERM ^ ;

CREATE OR ALTER PROCEDURE IMPR_ENTRADA(
    ID INTEGER)
RETURNS (
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    CONCEPTO VARCHAR(60),
    REFER VARCHAR(60),
    CODBODEGA VARCHAR(2),
    NOMBODEGA VARCHAR(30),
    NOMTERCERO VARCHAR(60),
    OBS BLOB SUB_TYPE 1 SEGMENT SIZE 80,
    ITEM INTEGER,
    ARTICULO VARCHAR(15),
    CODBAR VARCHAR(15),
    ARTIDES VARCHAR(60),
    CANT NUMERIC(18,4),
    UNIDAD VARCHAR(8),
    BODITEM VARCHAR(2),
    STAND VARCHAR(15),
    COSTO NUMERIC(18,2),
    DTOPORC NUMERIC(9,2),
    DTOMONTO NUMERIC(18,2),
    IVAPORC NUMERIC(9,2),
    IVAMONTO NUMERIC(18,2),
    CONSUMO NUMERIC(18,2),
    TOTAL NUMERIC(18,2),
    PRECIO NUMERIC(18,2),
    LOTE VARCHAR(15),
    PESOUNIT NUMERIC(18,4),
    PESOTOT NUMERIC(18,4),
    VOLUMUNIT NUMERIC(18,4),
    VOLUMTOT NUMERIC(18,4),
    TOTALDOC NUMERIC(18,2),
    CONSUMODOC NUMERIC(18,2),
    TOTALMASIMP NUMERIC(18,2))
AS
declare variable IMPTOS CHAR(1);
declare variable LARGO NUMERIC(18,4);
declare variable ANCHO NUMERIC(18,4);
declare variable ALTO NUMERIC(18,4);
declare variable LISTA CHAR(3);
BEGIN
  /*  */
  PESOTOT = 0;
  VOLUMTOT = 0;
  SELECT PREF_PRE, ENTR_NUMERO, ENTR_FECHA, ENTR_CONC, ENTR_REFER, E.BODE_COD, BODE_NOM, ENTR_NOMTERC, ENTR_IMPTOS, ENTR_OBS
    FROM ENTRADAS E, BODEGA B
    WHERE E.BODE_COD = B.BODE_COD AND E.ENTR_ID = :ID
    into :PREF, :NUMERO, :FECHA, :CONCEPTO, :REFER, :CODBODEGA, :NOMBODEGA, :NOMTERCERO, :IMPTOS, :OBS;
  SELECT SUM(ENDE_TOTAL), SUM(ENDE_IVAMONTO), SUM(ENDE_CONSUMO*ENDE_CANT*ENDE_FACTOR) FROM ENTRADAS_DETALLE
    WHERE ENTR_ID = :ID INTO :TOTALDOC, :IVAMONTO, :CONSUMODOC;
  TOTALMASIMP = TOTALDOC + CONSUMODOC;
  if (IMPTOS = 'N') then
    TOTALDOC = TOTALDOC - IVAMONTO;
    
  FOR SELECT ENDE_ITEM, A.ARTI_COD, ENDE_CODBAR, SUBSTR(ENDE_DESC,1,60), ENDE_CANT, ENDE_UNIDAD, BODE_COD, ENDE_COSTO, ENDE_DTOPORC, ENDE_DTOMONTO, ENDE_IVAPORC, ENDE_IVAMONTO, ENDE_CONSUMO, ENDE_TOTAL, ENDE_LOTE,
    (ARTI_PESO / 1000 * ENDE_CANT * ENDE_FACTOR), (ARTI_LARGO / 100 * ENDE_FACTOR), (ARTI_ANCHO / 100 * ENDE_FACTOR), (ARTI_ALTO / 100 * ENDE_FACTOR)
    FROM ENTRADAS_DETALLE D, ARTICULO A
    WHERE D.ARTI_COD = A.ARTI_COD AND D.ENTR_ID = :ID
    ORDER BY ENDE_ITEM
    INTO :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :BODITEM, :COSTO, :DTOPORC, :DTOMONTO, :IVAPORC, :IVAMONTO, :CONSUMO, :TOTAL, :LOTE, :PESOUNIT, :LARGO, :ANCHO, :ALTO
    DO
      BEGIN
      EXECUTE PROCEDURE LEE_CONFIGURACION('INVENTARIO','DOCUMENTOS','CODIGO DE LISTA DE PRECIOS A IMPRIMIR EN DOCUMENTOS') returning_values (:LISTA);
      if (NOT lista IS NULL) then
          SELECT PRAR_FIJO FROM PRECIOS_ARTICULO WHERE ARTI_COD = :articulo AND LIPR_COD = :LISTA INTO :PRECIO;
      if (PESOUNIT IS NULL) then
        PESOUNIT = 0;
      PESOTOT = PESOTOT + PESOUNIT;
      VOLUMUNIT = ANCHO * ALTO * LARGO;
      volumunit = VOLUMUNIT * CANT;
      if (VOLUMUNIT IS NULL) then
        VOLUMUNIT = 0;
      VOLUMTOT = VOLUMTOT + VOLUMUNIT;
      if (IMPTOS = 'N') then
        TOTAL = TOTAL - IVAMONTO;
      SELECT STAND_COD FROM STANDS WHERE ARTI_COD = :ARTICULO AND STAND_BODEGA = :boditem INTO :stand;
      SUSPEND;
      END
END
^

SET TERM ; ^


SET TERM ^ ;

CREATE OR ALTER PROCEDURE IMPR_SALIDA(
    ID INTEGER)
RETURNS (
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    CONCEPTO VARCHAR(60),
    REFER VARCHAR(60),
    CODBODEGA VARCHAR(2),
    NOMBODEGA VARCHAR(30),
    NOMTERCERO VARCHAR(60),
    OBS BLOB SUB_TYPE 0 SEGMENT SIZE 80,
    ITEM INTEGER,
    ARTICULO VARCHAR(15),
    CODBAR VARCHAR(15),
    ARTIDES VARCHAR(60),
    CANT NUMERIC(18,4),
    UNIDAD VARCHAR(8),
    BODITEM VARCHAR(2),
    STAND VARCHAR(15),
    COSTO NUMERIC(18,2),
    IVAPORC NUMERIC(9,2),
    IVAMONTO NUMERIC(18,2),
    CONSUMO NUMERIC(18,2),
    TOTAL NUMERIC(18,2),
    TOTALITEM NUMERIC(18,2),
    PRECIO NUMERIC(18,2),
    LOTE VARCHAR(15),
    PESOUNIT NUMERIC(18,4),
    PESOTOT NUMERIC(18,4),
    VOLUMUNIT NUMERIC(18,4),
    VOLUMTOT NUMERIC(18,4),
    TOTALDOC NUMERIC(18,2),
    ULTIMO NUMERIC(18,2),
    TOTALULT NUMERIC(18,2),
    CONSUMODOC NUMERIC(18,2),
    TOTALMASIMP NUMERIC(18,2))
AS
declare variable IMPTOS CHAR(1);
declare variable LARGO NUMERIC(18,4);
declare variable ANCHO NUMERIC(18,4);
declare variable ALTO NUMERIC(18,4);
declare variable LISTA CHAR(3);
BEGIN
  /*  */
  SELECT PREF_PRE, SALI_NUMERO, SALI_FECHA, SALI_CONC, SALI_REFER, S.BODE_COD, BODE_NOM, SALI_NOMTERC, SALI_IMPTOS, SALI_OBS
    FROM SALIDAS S, BODEGA B WHERE S.BODE_COD = B.BODE_COD AND S.SALI_ID = :ID into
    :PREF, :NUMERO, :FECHA, :CONCEPTO, :REFER, :CODBODEGA, :NOMBODEGA, :NOMTERCERO, :IMPTOS, :OBS;
  SELECT SUM(SADE_TOTAL), SUM(SADE_IVAMONTO), SUM(SADE_CONSUMO*SADE_CANT*SADE_FACTOR) FROM SALIDAS_DETALLE
    WHERE SALI_ID = :ID INTO :TOTALDOC, :IVAMONTO, :CONSUMODOC;
  TOTALMASIMP = TOTALDOC + CONSUMODOC;
  if (IMPTOS = 'N') then
    TOTALDOC = TOTALDOC - IVAMONTO;
  FOR SELECT SADE_ITEM, A.ARTI_COD, SADE_CODBAR, SADE_DESC, SADE_CANT, SADE_UNIDAD, BODE_COD, SADE_COSTO, SADE_IVAPORC, SADE_IVAMONTO, SADE_CONSUMO, SADE_TOTAL, SADE_LOTE,
    (ARTI_PESO / 1000 * SADE_CANT * SADE_FACTOR), (ARTI_LARGO / 100 * SADE_FACTOR), (ARTI_ANCHO / 100 * SADE_FACTOR), (ARTI_ALTO / 100 * SADE_FACTOR)
    FROM SALIDAS_DETALLE D, ARTICULO A
    WHERE D.ARTI_COD = A.ARTI_COD AND D.SALI_ID = :ID
    ORDER BY SADE_ITEM
    INTO :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :BODITEM, :COSTO, :IVAPORC, :IVAMONTO, :CONSUMO, :TOTAL, :LOTE, :PESOUNIT, :LARGO, :ANCHO, :ALTO
    DO
      BEGIN
      EXECUTE PROCEDURE LEE_CONFIGURACION('INVENTARIO','DOCUMENTOS','CODIGO DE LISTA DE PRECIOS A IMPRIMIR EN DOCUMENTOS') returning_values (:LISTA);
      if (NOT lista IS NULL) then
          SELECT PRAR_FIJO FROM PRECIOS_ARTICULO WHERE ARTI_COD = :articulo AND LIPR_COD = :LISTA INTO :PRECIO;
      EXECUTE PROCEDURE ultimo_costo(:articulo, :fecha,  :unidad) returning_values (:ultimo);
      TOTALULT = CANT * ULTIMO;
      TOTALITEM = COSTO + IVAMONTO + CONSUMO;
      if (IMPTOS = 'N') then
        TOTAL = TOTAL - IVAMONTO;
      if (PESOUNIT IS NULL) then
        PESOUNIT = 0;
      PESOTOT = PESOTOT + PESOUNIT;
      VOLUMUNIT = ANCHO * ALTO * LARGO;
      volumunit = VOLUMUNIT * CANT;
      if (VOLUMUNIT IS NULL) then
        VOLUMUNIT = 0;
      VOLUMTOT = VOLUMTOT + VOLUMUNIT;
      SELECT STAND_COD FROM STANDS WHERE ARTI_COD = :ARTICULO AND STAND_BODEGA = :boditem INTO :stand;
      SUSPEND;
      END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER PROCEDURE IMPR_DEVOLUCION(
    ID INTEGER)
RETURNS (
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    NIT VARCHAR(20),
    NOMTERCERO VARCHAR(60),
    VENDEDOR INTEGER,
    NOMVENDEDOR VARCHAR(60),
    PUNTOVTA INTEGER,
    NOMPUNTOVTA VARCHAR(30),
    CODBODEGA VARCHAR(2),
    NOMBODEGA VARCHAR(30),
    FACTURA VARCHAR(30),
    REMISION VARCHAR(10),
    COMIPORC NUMERIC(9,2),
    COMIMONTO NUMERIC(18,2),
    SUBTOTAL NUMERIC(18,2),
    DTOPORC NUMERIC(9,2),
    DTOMONTO NUMERIC(18,2),
    ADICIONAL NUMERIC(18,2),
    IVAMONTO NUMERIC(18,2),
    RTEFTEPORC NUMERIC(9,2),
    RTEFTEMONTO NUMERIC(18,2),
    RTEIVAPORC NUMERIC(9,2),
    RTEIVAMONTO NUMERIC(18,2),
    RTEICAPORC NUMERIC(9,2),
    RTEICAMONTO NUMERIC(18,2),
    EXTRA NUMERIC(18,2),
    TOTALFAC NUMERIC(18,2),
    TOTALPAGAR NUMERIC(18,2),
    OBS BLOB SUB_TYPE 1 SEGMENT SIZE 80,
    ITEM INTEGER,
    ARTICULO VARCHAR(15),
    CODBAR VARCHAR(15),
    ARTIDES VARCHAR(60),
    CANT NUMERIC(18,4),
    LOTE VARCHAR(15),
    UNIDAD VARCHAR(8),
    FACTOR NUMERIC(18,4),
    REFITEM VARCHAR(60),
    BODITEM VARCHAR(2),
    PRUNIT NUMERIC(18,2),
    DTOITPORC NUMERIC(9,2),
    DTOITMONTO NUMERIC(18,2),
    PRNETO NUMERIC(18,2),
    PRNETOSINIVA NUMERIC(18,2),
    IVAPORC NUMERIC(9,2),
    IVAITMONTO NUMERIC(18,2),
    CONSUMO NUMERIC(18,2),
    SUBTOTIT NUMERIC(18,2),
    TOTAL NUMERIC(18,2),
    CODIGOCL VARCHAR(20),
    ZONACOD VARCHAR(2),
    ZONANOM VARCHAR(60),
    DV CHAR(1),
    DIRECCION VARCHAR(60),
    CIUDAD VARCHAR(40),
    TELEFONO VARCHAR(40),
    CONTACTO VARCHAR(60),
    FAX VARCHAR(25),
    GRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    SUBGRUPO VARCHAR(3),
    NOMSUBG VARCHAR(30),
    MARCA VARCHAR(3),
    NOMMARCA VARCHAR(30),
    PESO NUMERIC(9,4),
    ANCHO NUMERIC(18,4),
    ALTO NUMERIC(18,4),
    LARGO NUMERIC(18,4),
    SUMA1 NUMERIC(18,2),
    SUMA2 NUMERIC(18,2),
    SUMA3 NUMERIC(18,2),
    IVA1 NUMERIC(18,2),
    IVA2 NUMERIC(18,2),
    IVA3 NUMERIC(18,2),
    TOTCONSUMO NUMERIC(18,2),
    SUMAEX NUMERIC(18,2),
    SUMAGR NUMERIC(18,2),
    OBSITEM BLOB SUB_TYPE 1 SEGMENT SIZE 80)
AS
DECLARE VARIABLE IMPTOS CHAR(1);
DECLARE VARIABLE TARIFA INTEGER;
declare variable ORDENCOD CHAR(2);
declare variable SUCUR VARCHAR(10);
declare variable PUNTOS NUMERIC(18,4);
declare variable ICOINC CHAR(2);
BEGIN
execute procedure lee_configuracion('FACTURACION', 'ARTICULOS', 'IMPOCONSUMO INCLUIDO EN EL PRECIO BASE DE VENTA ANTES DE IVA') returning_values (icoinc);
SELECT F.PREF_PRE, DEVT_NUMERO, DEVT_FECHA, F.BODE_COD, BODE_NOM, F.TERC_NIT, DEVT_NOMTERC, F.VEND_COD, VEND_NOMBRE, F.PTVT_ID, PTVT_NOM,
    DEVT_FACTURA, DEVT_COMIPORC, DEVT_COMIMONTO, DEVT_IVAINC,
    DEVT_DTOPOR, DEVT_DTOMONTO, DEVT_ADICIONAL, DEVT_IVAMONTO, DEVT_RTFTEPORC, DEVT_RTFTEMONTO, DEVT_RTIVAPORC, DEVT_RTIVAMONTO, DEVT_RTICAPORC, DEVT_RTICAMONTO, DEVT_EXTRA, DEVT_TOTAL,
    TERC_CONTACTO, TERC_FAX, TERC_DV, DEVT_OBS, DEVT_SUCURSAL, DEVT_REMISION
    FROM DEVOLUCIONES_VENTAS F, BODEGA B, VENDEDORES V, PUNTO_VENTA P, TERCEROS T
    WHERE F.BODE_COD = B.BODE_COD AND F.VEND_COD = V.VEND_COD AND F.PTVT_ID = P.PTVT_ID AND F.TERC_NIT = T.TERC_NIT AND F.DEVT_ID = :ID
    into :PREF, :NUMERO, :FECHA, :CODBODEGA, :NOMBODEGA, :NIT, :NOMTERCERO, :VENDEDOR, :NOMVENDEDOR, :PUNTOVTA, :NOMPUNTOVTA,
    :FACTURA, :COMIPORC, :COMIMONTO, :IMPTOS,
    :DTOPORC, :DTOMONTO, :ADICIONAL, :IVAMONTO, :RTEFTEPORC, :RTEFTEMONTO, :RTEIVAPORC, :RTEIVAMONTO, :RTEICAPORC, :RTEICAMONTO, :EXTRA, :TOTALFAC,
    :CONTACTO, :FAX, :DV, :OBS, :SUCUR, :REMISION;
SUBTOTAL = TOTALFAC - EXTRA - IVAMONTO - ADICIONAL + DTOMONTO;
TOTALPAGAR = TOTALFAC - RTEFTEMONTO - RTEIVAMONTO - RTEICAMONTO;

EXECUTE PROCEDURE acumula_puntos_cliente (33, :id, :nit, :fecha) returning_values (:PUNTOS);
SELECT CLIE_COD, C.ZONA_COD, ZONA_NOM
    FROM CLIENTES C, ZONAS Z
    WHERE TERC_NIT = :NIT AND C.ZONA_COD = Z.ZONA_COD
    INTO :CODIGOCL, :ZONACOD, :ZONANOM;
SELECT CLSU_DIR, CLSU_CIUDAD, CLSU_TEL FROM CLIENTE_SUCURSALES WHERE TERC_NIT = :NIT AND CLCU_COD = :SUCUR
    INTO :DIRECCION, :CIUDAD, :TELEFONO;
    
SUMAEX = 0;
SUMA1 = 0;
SUMA2 = 0;
SUMA3 = 0;
IVA1 = 0;
IVA2 = 0;
IVA3 = 0;
TOTCONSUMO = 0;
ITEM = 0;
EXECUTE PROCEDURE lee_configuracion ('FACTURACION','DOCUMENTOS','ORDENAR ITEMS POR CODIGO DE ARTICULO') returning_values (:ORDENCOD);
if (ORDENCOD = 'SI') then
    BEGIN
    FOR SELECT D.ARTI_COD, DVDE_CODBAR, SUBSTR(DVDE_DESC,1,60), DVDE_CANT, DVDE_UNIDAD, BODE_COD, DVDE_LOTE, DVDE_PRUNIT, DVDE_DTOPORC, DVDE_DTOMONTO, DVDE_IVAPORC, DVDE_IVAMONTO, DVDE_CONSUMO, DVDE_TOTAL, DVDE_REFERENCIA,
        GRUP_COD, SUBG_COD, MARC_COD, ARTI_PESO, ARTI_ANCHO, ARTI_ALTO, ARTI_LARGO, TAIV_COD, DVDE_OBS, DVDE_FACTOR
        FROM DEVOLUCIONES_VENTAS_DETALLE D, ARTICULO A
        WHERE D.ARTI_COD = A.ARTI_COD AND D.DEVT_ID = :ID
        ORDER BY DVDE_CODBAR
        INTO :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :BODITEM, :LOTE, :PRUNIT, :DTOITPORC, :DTOITMONTO, :IVAPORC, :IVAITMONTO, :CONSUMO, :TOTAL, :REFITEM,
        :GRUPO, :SUBGRUPO, :MARCA, :PESO, :ANCHO, :ALTO, :LARGO, :TARIFA, :obsitem, :FACTOR
        DO
        BEGIN
        if (ARTICULO = CODBAR) then
            SELECT FIRST 1 COBA_COD FROM barras_articulo WHERE ARTI_COD = :articulo INTO :CODBAR;
        ITEM = ITEM + 1;
        if (ICOINC = 'SI') then
            SUBTOTIT = TOTAL - IVAITMONTO;
        else
            SUBTOTIT = TOTAL - IVAITMONTO - CONSUMO;
        PRNETO = PRUNIT - DTOITMONTO;
        if (PESO IS NULL) then
            PESO = 0;
        PESO = PESO / 1000 * CANT * FACTOR;
        if (IMPTOS = 'S') then
            if (cant <> 0) then
                prnetosiniva = PRUNIT - DTOITMONTO - ((IVAITMONTO+CONSUMO) / CANT);
            else
                prnetosiniva = PRUNIT - DTOITMONTO;
        ELSE
            prnetosiniva = PRUNIT - DTOITMONTO;
        TOTCONSUMO = TOTCONSUMO + CONSUMO;
        if ((REFITEM <> '.t') or (REFITEM IS NULL)) then
            BEGIN
            /* NO SUME LOS ENSAMBLES */
            if (IVAPORC = 0) then
                SUMAEX = SUMAEX + TOTAL;
            if (TARIFA = 1) then
                BEGIN
                SUMA1 = SUMA1 + TOTAL - IVAITMONTO;
                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;
            END
        if (substr(ARTICULO,1,2) = '.t') then
            BEGIN
            REFITEM = '';
            TOTAL = 0;
            END
        SUSPEND;
        END
    END
ELSE
    BEGIN
    FOR SELECT D.ARTI_COD, DVDE_CODBAR, SUBSTR(DVDE_DESC,1,60), DVDE_CANT, DVDE_UNIDAD, BODE_COD, DVDE_LOTE, DVDE_PRUNIT, DVDE_DTOPORC, DVDE_DTOMONTO, DVDE_IVAPORC, DVDE_IVAMONTO, DVDE_CONSUMO, DVDE_TOTAL, DVDE_REFERENCIA,
        GRUP_COD, SUBG_COD, MARC_COD, ARTI_PESO, ARTI_ANCHO, ARTI_ALTO, ARTI_LARGO, TAIV_COD, DVDE_OBS, DVDE_FACTOR
        FROM DEVOLUCIONES_VENTAS_DETALLE D, ARTICULO A
        WHERE D.ARTI_COD = A.ARTI_COD AND D.DEVT_ID = :ID
        ORDER BY DVDE_ITEM
        INTO :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :BODITEM, :LOTE, :PRUNIT, :DTOITPORC, :DTOITMONTO, :IVAPORC, :IVAITMONTO, :CONSUMO, :TOTAL, :REFITEM,
        :GRUPO, :SUBGRUPO, :MARCA, :PESO, :ANCHO, :ALTO, :LARGO, :TARIFA, :obsitem, :FACTOR
        DO
        BEGIN
        if (ARTICULO = CODBAR) then
            SELECT FIRST 1 COBA_COD FROM barras_articulo WHERE ARTI_COD = :articulo INTO :CODBAR;
        SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :GRUPO INTO NOMGRUPO;
        SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :MARCA INTO NOMMARCA;
        SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :SUBGRUPO AND GRUP_COD = :GRUPO INTO :NOMSUBG;
        ITEM = ITEM + 1;
        if (ICOINC = 'SI') then
            SUBTOTIT = TOTAL - IVAITMONTO;
        else
            SUBTOTIT = TOTAL - IVAITMONTO - CONSUMO;
        PRNETO = PRUNIT - DTOITMONTO;
        if (PESO IS NULL) then
            PESO = 0;
        PESO = PESO / 1000 * CANT * FACTOR;
        if (IMPTOS = 'S') then
            if (cant <> 0) then
                prnetosiniva = PRUNIT - DTOITMONTO - ((IVAITMONTO+CONSUMO) / CANT);
            else
                prnetosiniva = PRUNIT - DTOITMONTO;
        ELSE
            prnetosiniva = PRUNIT - DTOITMONTO;
        TOTCONSUMO = TOTCONSUMO + CONSUMO;
        if ((REFITEM <> '.t') or (REFITEM IS NULL)) then
            BEGIN
            /* NO SUME LOS ENSAMBLES */
            if (IVAPORC = 0) then
                SUMAEX = SUMAEX + TOTAL;
            if (TARIFA = 1) then
                BEGIN
                SUMA1 = SUMA1 + TOTAL - IVAITMONTO;
                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;
            END
        if (substr(ARTICULO,1,2) = '.t') then
            BEGIN
            REFITEM = '';
            TOTAL = 0;
            END
        SUSPEND;
        END
    END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER PROCEDURE IMPR_COTIZACION(
    ID INTEGER)
RETURNS (
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    VALIDEZ INTEGER,
    NIT VARCHAR(20),
    NOMTERCERO VARCHAR(60),
    VENDEDOR INTEGER,
    NOMVENDEDOR VARCHAR(60),
    PUNTOVTA INTEGER,
    NOMPUNTOVTA VARCHAR(30),
    SUBTOTAL NUMERIC(18,2),
    DTOPORC NUMERIC(9,2),
    DTOMONTO NUMERIC(18,2),
    ADICIONAL NUMERIC(18,2),
    IVAMONTO NUMERIC(18,2),
    EXTRA NUMERIC(18,2),
    TOTALFAC NUMERIC(18,2),
    OBS BLOB SUB_TYPE 1 SEGMENT SIZE 80,
    ITEM INTEGER,
    ARTICULO VARCHAR(15),
    CODBAR VARCHAR(15),
    ARTIDES VARCHAR(60),
    CANT NUMERIC(18,4),
    UNIDAD VARCHAR(8),
    FACTOR NUMERIC(18,4),
    LISTAPR INTEGER,
    REFITEM VARCHAR(60),
    PRUNIT NUMERIC(18,2),
    DTOITPORC NUMERIC(9,2),
    DTOITMONTO NUMERIC(18,2),
    PRNETO NUMERIC(18,2),
    PRNETOSINIVA NUMERIC(18,2),
    IVAPORC NUMERIC(9,2),
    IVAITMONTO NUMERIC(18,2),
    CONSUMO NUMERIC(18,2),
    SUBTOTIT NUMERIC(18,2),
    TOTAL NUMERIC(18,2),
    CODIGOCL VARCHAR(20),
    ZONACOD VARCHAR(2),
    ZONANOM VARCHAR(60),
    DV CHAR(1),
    DIRECCION VARCHAR(60),
    CIUDAD VARCHAR(40),
    TELEFONO VARCHAR(40),
    CONTACTO VARCHAR(60),
    FAX VARCHAR(25),
    GRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    SUBGRUPO VARCHAR(3),
    NOMSUBG VARCHAR(30),
    MARCA VARCHAR(3),
    NOMMARCA VARCHAR(30),
    PESO NUMERIC(9,4),
    ANCHO NUMERIC(18,4),
    ALTO NUMERIC(18,4),
    LARGO NUMERIC(18,4),
    SUMA1 NUMERIC(18,2),
    SUMA2 NUMERIC(18,2),
    SUMA3 NUMERIC(18,2),
    IVA1 NUMERIC(18,2),
    IVA2 NUMERIC(18,2),
    IVA3 NUMERIC(18,2),
    SUMAEX NUMERIC(18,2),
    SUMAGR NUMERIC(18,2),
    OBSITEM BLOB SUB_TYPE 1 SEGMENT SIZE 80)
AS
DECLARE VARIABLE IMPTOS CHAR(1);
DECLARE VARIABLE TARIFA INTEGER;
declare variable ORDENCOD CHAR(2);
declare variable SUCUR VARCHAR(10);
declare variable ICOINC CHAR(2);
BEGIN
execute procedure lee_configuracion('FACTURACION', 'ARTICULOS', 'IMPOCONSUMO INCLUIDO EN EL PRECIO BASE DE VENTA ANTES DE IVA') returning_values (icoinc);
SELECT F.PREF_PRE, COTI_NUMERO, COTI_FECHA, COTI_VALIDEZ, F.TERC_NIT, COTI_NOMTERC, F.VEND_COD, VEND_NOMBRE, F.PTVT_ID, PTVT_NOM,
    COTI_IMPTOS, COTI_DTOPORC, COTI_DTOMONTO, COTI_ADICIONAL, COTI_IVAMONTO, COTI_EXTRA, COTI_TOTAL,
    TERC_CONTACTO, TERC_FAX, TERC_DV, COTI_OBS, COTI_SUCURSAL
    FROM COTIZACIONES F, VENDEDORES V, PUNTO_VENTA P, TERCEROS T
    WHERE F.VEND_COD = V.VEND_COD AND F.PTVT_ID = P.PTVT_ID AND F.TERC_NIT = T.TERC_NIT AND F.COTI_ID = :ID
    into :PREF, :NUMERO, :FECHA, :VALIDEZ, :NIT, :NOMTERCERO, :VENDEDOR, :NOMVENDEDOR, :PUNTOVTA, :NOMPUNTOVTA,
    :IMPTOS, :DTOPORC, :DTOMONTO, :ADICIONAL, :IVAMONTO, :EXTRA, :TOTALFAC,
    :CONTACTO, :FAX, :DV, :OBS, :SUCUR;
SUBTOTAL = TOTALFAC - EXTRA - IVAMONTO - ADICIONAL + DTOMONTO;

SELECT CLIE_COD, C.ZONA_COD, ZONA_NOM
    FROM CLIENTES C, ZONAS Z
    WHERE TERC_NIT = :NIT AND C.ZONA_COD = Z.ZONA_COD
    INTO :CODIGOCL, :ZONACOD, :ZONANOM;
SELECT CLSU_DIR, CLSU_CIUDAD, CLSU_TEL FROM CLIENTE_SUCURSALES WHERE TERC_NIT = :NIT AND CLCU_COD = :SUCUR
    INTO :DIRECCION, :CIUDAD, :TELEFONO;
    
SUMAEX = 0;
SUMA1 = 0;
SUMA2 = 0;
SUMA3 = 0;
IVA1 = 0;
IVA2 = 0;
IVA3 = 0;
ITEM = 0;
EXECUTE PROCEDURE lee_configuracion ('FACTURACION','DOCUMENTOS','ORDENAR ITEMS POR CODIGO DE ARTICULO') returning_values (:ORDENCOD);
if (ORDENCOD = 'SI') then
    BEGIN
    FOR SELECT D.ARTI_COD, CTDE_CODBAR, SUBSTR(CTDE_DESC,1,60), CTDE_CANT, CTDE_UNIDAD, LIPR_COD, CTDE_PRUNIT, CTDE_DTOPORC, CTDE_DTOMONTO, CTDE_IVAPORC, CTDE_IVAMONTO, CTDE_CONSUMO, CTDE_TOTAL, CTDE_REFERENCIA,
        GRUP_COD, SUBG_COD, MARC_COD, ARTI_PESO, ARTI_ANCHO, ARTI_ALTO, ARTI_LARGO, TAIV_COD, CTDE_OBS, CTDE_FACTOR
        FROM COTIZACIONES_DETALLE D, ARTICULO A
        WHERE D.ARTI_COD = A.ARTI_COD AND D.COTI_ID = :ID
        ORDER BY CTDE_CODBAR
        INTO :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :LISTAPR, :PRUNIT, :DTOITPORC, :DTOITMONTO, :IVAPORC, :IVAITMONTO, :CONSUMO, :TOTAL, :refitem,
        :GRUPO, :SUBGRUPO, :MARCA, :PESO, :ANCHO, :ALTO, :LARGO, :TARIFA, :obsitem, :FACTOR
        DO
        BEGIN
        if (ICOINC = 'SI') then
            SUBTOTIT = TOTAL - IVAITMONTO;
        else
            SUBTOTIT = TOTAL - IVAITMONTO - CONSUMO;
        if (ARTICULO = CODBAR) then
            SELECT FIRST 1 COBA_COD FROM barras_articulo WHERE ARTI_COD = :articulo INTO :CODBAR;
        SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :GRUPO INTO NOMGRUPO;
        SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :MARCA INTO NOMMARCA;
        SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :SUBGRUPO AND GRUP_COD = :GRUPO INTO :NOMSUBG;
        ITEM = ITEM + 1;
        PRNETO = PRUNIT - DTOITMONTO;
        if (PESO IS NULL) then
            PESO = 0;
        PESO = PESO / 1000 * CANT * FACTOR;
        if (IMPTOS = 'S') then
            if (cant <> 0) then
                prnetosiniva = PRUNIT - DTOITMONTO - ((IVAITMONTO+CONSUMO) / CANT);
            else
                prnetosiniva = PRUNIT - DTOITMONTO;
        ELSE
            prnetosiniva = PRUNIT - DTOITMONTO;
        if (ivaporc = 0) then
            SUMAEX = SUMAEX + TOTAL;
        if (TARIFA = 1) then
            BEGIN
            SUMA1 = SUMA1 + TOTAL - IVAITMONTO;
            IVA1 = IVA1 + IVAITMONTO;
            END
        if (TARIFA = 2) then
            BEGIN
            SUMA2 = SUMA2 + TOTAL - IVAITMONTO;
            IVA2 = IVA2 + IVAITMONTO;
            END
        if (TARIFA = 3) then
            BEGIN
            SUMA3 = SUMA3 + TOTAL - IVAITMONTO;
            IVA3 = IVA3 + IVAITMONTO;
            END
        SUMAGR = SUMA1 + SUMA2 + SUMA3;
        if (IMPTOS = 'N') then
            TOTAL = TOTAL - IVAITMONTO;
        SUSPEND;
        END
    END
ELSE
    BEGIN
    FOR SELECT D.ARTI_COD, CTDE_CODBAR, SUBSTR(CTDE_DESC,1,60), CTDE_CANT, CTDE_UNIDAD, LIPR_COD, CTDE_PRUNIT, CTDE_DTOPORC, CTDE_DTOMONTO, CTDE_IVAPORC, CTDE_IVAMONTO, CTDE_CONSUMO, CTDE_TOTAL, CTDE_REFERENCIA,
        GRUP_COD, SUBG_COD, MARC_COD, ARTI_PESO, ARTI_ANCHO, ARTI_ALTO, ARTI_LARGO, TAIV_COD, CTDE_OBS, CTDE_FACTOR
        FROM COTIZACIONES_DETALLE D, ARTICULO A
        WHERE D.ARTI_COD = A.ARTI_COD AND D.COTI_ID = :ID
        ORDER BY CTDE_ITEM
        INTO :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :LISTAPR, :PRUNIT, :DTOITPORC, :DTOITMONTO, :IVAPORC, :IVAITMONTO, :CONSUMO, :TOTAL, :refitem,
        :GRUPO, :SUBGRUPO, :MARCA, :PESO, :ANCHO, :ALTO, :LARGO, :TARIFA, :obsitem, :FACTOR
        DO
        BEGIN
        SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :GRUPO INTO NOMGRUPO;
        SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :MARCA INTO NOMMARCA;
        SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :SUBGRUPO AND GRUP_COD = :GRUPO INTO :NOMSUBG;
        ITEM = ITEM + 1;
        if (ICOINC = 'SI') then
            SUBTOTIT = TOTAL - IVAITMONTO;
        else
            SUBTOTIT = TOTAL - IVAITMONTO - CONSUMO;
        PRNETO = PRUNIT - DTOITMONTO;
        if (PESO IS NULL) then
            PESO = 0;
        PESO = PESO / 1000 * CANT * FACTOR;
        if (IMPTOS = 'S') then
            if (cant <> 0) then
                prnetosiniva = PRUNIT - DTOITMONTO - ((IVAITMONTO+CONSUMO) / CANT);
            else
                prnetosiniva = PRUNIT - DTOITMONTO;
        ELSE
            prnetosiniva = PRUNIT - DTOITMONTO;
        if (ivaporc = 0) then
            SUMAEX = SUMAEX + TOTAL;
        if (TARIFA = 1) then
            BEGIN
            SUMA1 = SUMA1 + TOTAL - IVAITMONTO;
            IVA1 = IVA1 + IVAITMONTO;
            END
        if (TARIFA = 2) then
            BEGIN
            SUMA2 = SUMA2 + TOTAL - IVAITMONTO;
            IVA2 = IVA2 + IVAITMONTO;
            END
        if (TARIFA = 3) then
            BEGIN
            SUMA3 = SUMA3 + TOTAL - IVAITMONTO;
            IVA3 = IVA3 + IVAITMONTO;
            END
        SUMAGR = SUMA1 + SUMA2 + SUMA3;
        if (IMPTOS = 'N') then
            TOTAL = TOTAL - IVAITMONTO;
        SUSPEND;
        END
    END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER PROCEDURE IMPR_PEDIDO(
    ID INTEGER)
RETURNS (
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    VALIDEZ INTEGER,
    NIT VARCHAR(20),
    NOMTERCERO VARCHAR(60),
    VENDEDOR INTEGER,
    NOMVENDEDOR VARCHAR(60),
    PUNTOVTA INTEGER,
    NOMPUNTOVTA VARCHAR(30),
    COTIZACION VARCHAR(30),
    SUBTOTAL NUMERIC(18,2),
    DTOPORC NUMERIC(9,2),
    DTOMONTO NUMERIC(18,2),
    ADICIONAL NUMERIC(18,2),
    IVAMONTO NUMERIC(18,2),
    EXTRA NUMERIC(18,2),
    TOTALFAC NUMERIC(18,2),
    OBS BLOB SUB_TYPE 1 SEGMENT SIZE 80,
    ITEM INTEGER,
    ARTICULO VARCHAR(15),
    CODBAR VARCHAR(15),
    ARTIDES VARCHAR(60),
    BODEGA VARCHAR(2),
    CANT NUMERIC(18,4),
    UNIDAD VARCHAR(8),
    FACTOR NUMERIC(18,4),
    LISTAPR INTEGER,
    REFITEM VARCHAR(60),
    PRUNIT NUMERIC(18,2),
    DTOITPORC NUMERIC(9,2),
    DTOITMONTO NUMERIC(18,2),
    PRNETO NUMERIC(18,2),
    PRNETOSINIVA NUMERIC(18,2),
    DTOIT1 NUMERIC(9,2),
    DTOIT2 NUMERIC(9,2),
    DTOIT3 NUMERIC(9,2),
    IVAPORC NUMERIC(9,2),
    IVAITMONTO NUMERIC(18,2),
    CONSUMO NUMERIC(18,2),
    SUBTOTIT NUMERIC(18,2),
    TOTAL NUMERIC(18,2),
    CODIGOCL VARCHAR(20),
    ZONACOD VARCHAR(2),
    ZONANOM VARCHAR(60),
    DV CHAR(1),
    DIRECCION VARCHAR(60),
    CIUDAD VARCHAR(40),
    TELEFONO VARCHAR(40),
    CONTACTO VARCHAR(60),
    FAX VARCHAR(25),
    GRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    SUBGRUPO VARCHAR(3),
    NOMSUBG VARCHAR(30),
    MARCA VARCHAR(3),
    NOMMARCA VARCHAR(30),
    PESO NUMERIC(9,4),
    ANCHO NUMERIC(18,4),
    ALTO NUMERIC(18,4),
    LARGO NUMERIC(18,4),
    SUMA1 NUMERIC(18,2),
    SUMA2 NUMERIC(18,2),
    SUMA3 NUMERIC(18,2),
    IVA1 NUMERIC(18,2),
    IVA2 NUMERIC(18,2),
    IVA3 NUMERIC(18,2),
    SUMAEX NUMERIC(18,2),
    SUMAGR NUMERIC(18,2),
    DTOIT1M NUMERIC(18,2),
    DTOIT2M NUMERIC(18,2),
    DTOIT3M NUMERIC(18,2),
    OBSITEM BLOB SUB_TYPE 1 SEGMENT SIZE 80)
AS
DECLARE VARIABLE IMPTOS CHAR(1);
DECLARE VARIABLE TARIFA INTEGER;
declare variable ORDENCOD CHAR(2);
declare variable SUCUR VARCHAR(10);
declare variable ICOINC CHAR(2);
declare variable DTOITM1 NUMERIC(18,2);
declare variable DTOITM2 NUMERIC(18,2);
declare variable DTOITM3 NUMERIC(18,2);
BEGIN
execute procedure lee_configuracion('FACTURACION', 'ARTICULOS', 'IMPOCONSUMO INCLUIDO EN EL PRECIO BASE DE VENTA ANTES DE IVA') returning_values (icoinc);
SELECT F.PREF_PRE, PEDI_NUMERO, PEDI_FECHA, PEDI_VALIDEZ, F.TERC_NIT, PEDI_NOMTERC, F.VEND_COD, VEND_NOMBRE, F.PTVT_ID, PTVT_NOM, PEDI_COTIZACI,
    PEDI_IVAINC, PEDI_DTOPOR, PEDI_DTOMONTO, PEDI_ADICIONAL, PEDI_IVAMONTO, PEDI_EXTRA, PEDI_TOTAL,
    TERC_CONTACTO, TERC_FAX, TERC_DV, PEDI_OBS, PEDI_SUCURSAL, PEDI_DTOIT1, PEDI_DTOIT2, PEDI_DTOIT3
    FROM PEDIDOS F, VENDEDORES V, PUNTO_VENTA P, TERCEROS T
    WHERE F.VEND_COD = V.VEND_COD AND F.PTVT_ID = P.PTVT_ID AND F.TERC_NIT = T.TERC_NIT AND F.PEDI_ID = :ID
    into :PREF, :NUMERO, :FECHA, :VALIDEZ, :NIT, :NOMTERCERO, :VENDEDOR, :NOMVENDEDOR, :PUNTOVTA, :NOMPUNTOVTA, :COTIZACION,
    :IMPTOS, :DTOPORC, :DTOMONTO, :ADICIONAL, :IVAMONTO, :EXTRA, :TOTALFAC,
    :CONTACTO, :FAX, :DV, :OBS, :SUCUR, :dtoit1m, :dtoit2m, :dtoit3m;
SUBTOTAL = TOTALFAC - EXTRA - IVAMONTO - ADICIONAL + DTOMONTO;

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

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER PROCEDURE IMPR_REMISION(
    ID INTEGER)
RETURNS (
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    NIT VARCHAR(20),
    NOMTERCERO VARCHAR(60),
    VENDEDOR INTEGER,
    NOMVENDEDOR VARCHAR(60),
    PUNTOVTA INTEGER,
    NOMPUNTOVTA VARCHAR(30),
    CODBODEGA VARCHAR(2),
    NOMBODEGA VARCHAR(30),
    COTIZACION VARCHAR(30),
    PEDIDO VARCHAR(30),
    FACTURA VARCHAR(30),
    SUBTOTAL NUMERIC(18,2),
    IVAMONTO NUMERIC(18,2),
    TOTALFAC NUMERIC(18,2),
    DESPACHO VARCHAR(255),
    TRANSPORTADOR VARCHAR(60),
    OBS BLOB SUB_TYPE 1 SEGMENT SIZE 80,
    ITEM INTEGER,
    ARTICULO VARCHAR(15),
    CODBAR VARCHAR(15),
    ARTIDES VARCHAR(60),
    CANT NUMERIC(18,4),
    LOTE VARCHAR(15),
    VLOTE DATE,
    UNIDAD VARCHAR(8),
    FACTOR NUMERIC(18,4),
    CAJAS NUMERIC(18,4),
    DEVUELTO NUMERIC(18,4),
    CONSUMIDO NUMERIC(18,4),
    LISTAPR INTEGER,
    REFITEM VARCHAR(60),
    BODITEM VARCHAR(2),
    STAND VARCHAR(15),
    PRUNIT NUMERIC(18,2),
    DTOITPORC NUMERIC(9,2),
    DTOITMONTO NUMERIC(18,2),
    PRNETOSINIVA NUMERIC(18,2),
    PRNETO NUMERIC(18,2),
    IVAPORC NUMERIC(9,2),
    IVAITMONTO NUMERIC(18,2),
    CONSUMO NUMERIC(18,2),
    SUBTOTIT NUMERIC(18,2),
    TOTAL NUMERIC(18,2),
    CODIGOCL VARCHAR(20),
    ZONACOD VARCHAR(2),
    ZONANOM VARCHAR(60),
    DV CHAR(1),
    DIRECCION VARCHAR(60),
    CIUDAD VARCHAR(40),
    TELEFONO VARCHAR(40),
    CONTACTO VARCHAR(60),
    FAX VARCHAR(25),
    GRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    SUBGRUPO VARCHAR(3),
    NOMSUBG VARCHAR(30),
    MARCA VARCHAR(3),
    NOMMARCA VARCHAR(30),
    PESO NUMERIC(9,4),
    ANCHO NUMERIC(18,4),
    ALTO NUMERIC(18,4),
    LARGO NUMERIC(18,4),
    SUMA1 NUMERIC(18,2),
    SUMA2 NUMERIC(18,2),
    SUMA3 NUMERIC(18,2),
    IVA1 NUMERIC(18,2),
    IVA2 NUMERIC(18,2),
    IVA3 NUMERIC(18,2),
    SUMAEX NUMERIC(18,2),
    SUMAGR NUMERIC(18,2),
    TOTCAJAS NUMERIC(18,2),
    OBSITEM BLOB SUB_TYPE 1 SEGMENT SIZE 80)
AS
DECLARE VARIABLE IMPTOS CHAR(1);
DECLARE VARIABLE TARIFA INTEGER;
declare variable ORDENCOD CHAR(2);
declare variable SUCUR VARCHAR(10);
declare variable ICOINC CHAR(2);
BEGIN
execute procedure lee_configuracion('FACTURACION', 'ARTICULOS', 'IMPOCONSUMO INCLUIDO EN EL PRECIO BASE DE VENTA ANTES DE IVA') returning_values (icoinc);
EXECUTE PROCEDURE lee_configuracion ('FACTURACION','DOCUMENTOS','ORDENAR ITEMS POR CODIGO DE ARTICULO') returning_values (:ORDENCOD);
SELECT F.PREF_PRE, REVT_NUMERO, REVT_FECHA, F.BODE_COD, BODE_NOM, F.TERC_NIT, REVT_NOMTERC, F.VEND_COD, VEND_NOMBRE, F.PTVT_ID, PTVT_NOM,
    REVT_COTIZACI, REVT_PEDIDO, REVT_FACTURA, REVT_IVAINC,
    REVT_IVAMONTO, REVT_TOTAL, REVT_DESPACHO, REVT_TRANSP,
    TERC_CONTACTO, TERC_FAX, TERC_DV, REVT_OBS, REVT_SUCURSAL
    FROM REMISIONES_VENTA F, BODEGA B, VENDEDORES V, PUNTO_VENTA P, TERCEROS T
    WHERE F.BODE_COD = B.BODE_COD AND F.VEND_COD = V.VEND_COD AND F.PTVT_ID = P.PTVT_ID AND F.TERC_NIT = T.TERC_NIT AND F.REVT_ID = :ID
    into :PREF, :NUMERO, :FECHA, :CODBODEGA, :NOMBODEGA, :NIT, :NOMTERCERO, :VENDEDOR, :NOMVENDEDOR, :PUNTOVTA, :NOMPUNTOVTA,
    :COTIZACION, :PEDIDO, :FACTURA, :IMPTOS,
    :IVAMONTO, :TOTALFAC, :DESPACHO, :transportador, 
    :CONTACTO, :FAX, :DV, :OBS, :SUCUR;
SUBTOTAL = TOTALFAC - IVAMONTO;

SELECT CLIE_COD, C.ZONA_COD, ZONA_NOM
    FROM CLIENTES C, ZONAS Z
    WHERE TERC_NIT = :NIT AND C.ZONA_COD = Z.ZONA_COD
    INTO :CODIGOCL, :ZONACOD, :ZONANOM;
SELECT CLSU_DIR, CLSU_CIUDAD, CLSU_TEL FROM CLIENTE_SUCURSALES WHERE TERC_NIT = :NIT AND CLCU_COD = :SUCUR
    INTO :DIRECCION, :CIUDAD, :TELEFONO;
    
SUMAEX = 0;
SUMA1 = 0;
SUMA2 = 0;
SUMA3 = 0;
IVA1 = 0;
IVA2 = 0;
IVA3 = 0;
ITEM = 0;
totcajas = 0;
if (ORDENCOD = 'SI') then
    BEGIN
    FOR SELECT D.ARTI_COD, RVDE_CODBAR, SUBSTR(RVDE_DESC,1,60), RVDE_CANT, RVDE_UNIDAD, BODE_COD, RVDE_LOTE, LIPR_COD, RVDE_PRUNIT, RVDE_DTOPORC, RVDE_DTOMONTO, RVDE_IVAPORC, RVDE_IVAMONTO, RVDE_CONSUMO, RVDE_TOTAL, RVDE_REFERENCIA,
        GRUP_COD, SUBG_COD, MARC_COD, ARTI_PESO, ARTI_ANCHO, ARTI_ALTO, ARTI_LARGO, TAIV_COD, RVDE_DEVUELTO, RVDE_OBS, RVDE_CAJAS, RVDE_FACTOR
        FROM REMISIONES_VENTA_DETALLE D, ARTICULO A
        WHERE D.ARTI_COD = A.ARTI_COD AND D.REVT_ID = :ID
        ORDER BY RVDE_CODBAR
        INTO :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :BODITEM, :LOTE, :LISTAPR, :PRUNIT, :DTOITPORC, :DTOITMONTO, :IVAPORC, :IVAITMONTO, :CONSUMO, :TOTAL, :refitem,
            :GRUPO, :SUBGRUPO, :MARCA, :PESO, :ANCHO, :ALTO, :LARGO, :TARIFA, :DEVUELTO, :obsitem, :CAJAS, :FACTOR
        DO
        BEGIN
        if (ARTICULO = CODBAR) then
            SELECT FIRST 1 COBA_COD FROM barras_articulo WHERE ARTI_COD = :articulo INTO :CODBAR;
        SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :GRUPO INTO NOMGRUPO;
        SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :MARCA INTO NOMMARCA;
        SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :SUBGRUPO AND GRUP_COD = :GRUPO INTO :NOMSUBG;
        SELECT LOTE_VENCE FROM LOTES WHERE LOTE_NRO = :lote AND ARTI_COD = :ARTICULO AND BODE_COD = :boditem INTO :vlote;
        if (ICOINC = 'SI') then
            SUBTOTIT = TOTAL - IVAITMONTO;
        else
            SUBTOTIT = TOTAL - IVAITMONTO - CONSUMO;
        CONSUMIDO = cant * factor - devuelto;
        ITEM = ITEM + 1;
        PRNETO = PRUNIT - DTOITMONTO;
        if (PESO IS NULL) then
            PESO = 0;
        PESO = PESO / 1000 * CANT * FACTOR;
        if (IMPTOS = 'S') then
            if (cant <> 0) then
                prnetosiniva = PRUNIT - DTOITMONTO - ((IVAITMONTO+CONSUMO) / CANT);
            else
                prnetosiniva = PRUNIT - DTOITMONTO;
        ELSE
            prnetosiniva = PRUNIT - DTOITMONTO;
        if (IVAPORC = 0) then
            SUMAEX = SUMAEX + TOTAL;
        if (TARIFA = 1) then
            BEGIN
            SUMA1 = SUMA1 + TOTAL - IVAITMONTO;
            IVA1 = IVA1 + IVAITMONTO;
            END
        if (TARIFA = 2) then
            BEGIN
            SUMA2 = SUMA2 + TOTAL - IVAITMONTO;
            IVA2 = IVA2 + IVAITMONTO;
            END
        if (TARIFA = 3) then
            BEGIN
            SUMA3 = SUMA3 + TOTAL - IVAITMONTO;
            IVA3 = IVA3 + IVAITMONTO;
            END
        SUMAGR = SUMA1 + SUMA2 + SUMA3;

        totcajas = totcajas + cajas;
        SELECT STAND_COD FROM STANDS WHERE ARTI_COD = :ARTICULO AND STAND_BODEGA = :boditem INTO :stand;
        SUSPEND;
        END
    END
ELSE
    BEGIN
    FOR SELECT RVDE_ITEM, D.ARTI_COD, RVDE_CODBAR, SUBSTR(RVDE_DESC,1,60), RVDE_CANT, RVDE_UNIDAD, BODE_COD, RVDE_LOTE, LIPR_COD, RVDE_PRUNIT, RVDE_DTOPORC, RVDE_DTOMONTO, RVDE_IVAPORC, RVDE_IVAMONTO, RVDE_CONSUMO, RVDE_TOTAL, RVDE_REFERENCIA,
        GRUP_COD, SUBG_COD, MARC_COD, ARTI_PESO, ARTI_ANCHO, ARTI_ALTO, ARTI_LARGO, TAIV_COD, RVDE_DEVUELTO, RVDE_OBS, RVDE_CAJAS, RVDE_FACTOR
        FROM REMISIONES_VENTA_DETALLE D, ARTICULO A
        WHERE D.ARTI_COD = A.ARTI_COD AND D.REVT_ID = :ID
        ORDER BY RVDE_ITEM
        INTO :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :BODITEM, :LOTE, :LISTAPR, :PRUNIT, :DTOITPORC, :DTOITMONTO, :IVAPORC, :IVAITMONTO, :CONSUMO, :TOTAL, :refitem,
            :GRUPO, :SUBGRUPO, :MARCA, :PESO, :ANCHO, :ALTO, :LARGO, :TARIFA, :DEVUELTO, :obsitem, :CAJAS, :FACTOR
        DO
        BEGIN
        SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :GRUPO INTO NOMGRUPO;
        SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :MARCA INTO NOMMARCA;
        SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :SUBGRUPO AND GRUP_COD = :GRUPO INTO :NOMSUBG;
        SELECT LOTE_VENCE FROM LOTES WHERE LOTE_NRO = :lote AND ARTI_COD = :ARTICULO AND BODE_COD = :boditem INTO :vlote;
        if (ICOINC = 'SI') then
            SUBTOTIT = TOTAL - IVAITMONTO;
        else
            SUBTOTIT = TOTAL - IVAITMONTO - CONSUMO;
        CONSUMIDO = cant * factor - devuelto;
        ITEM = ITEM + 1;
        PRNETO = PRUNIT - DTOITMONTO;
        if (PESO IS NULL) then
            PESO = 0;
        PESO = PESO / 1000 * CANT * FACTOR;
        if (IMPTOS = 'S') then
            if (cant <> 0) then
                prnetosiniva = PRUNIT - DTOITMONTO - ((IVAITMONTO+CONSUMO) / CANT);
            else
                prnetosiniva = PRUNIT - DTOITMONTO;
        ELSE
            prnetosiniva = PRUNIT - DTOITMONTO;
        if (IVAPORC = 0) then
            SUMAEX = SUMAEX + TOTAL;
        if (TARIFA = 1) then
            BEGIN
            SUMA1 = SUMA1 + TOTAL - IVAITMONTO;
            IVA1 = IVA1 + IVAITMONTO;
            END
        if (TARIFA = 2) then
            BEGIN
            SUMA2 = SUMA2 + TOTAL - IVAITMONTO;
            IVA2 = IVA2 + IVAITMONTO;
            END
        if (TARIFA = 3) then
            BEGIN
            SUMA3 = SUMA3 + TOTAL - IVAITMONTO;
            IVA3 = IVA3 + IVAITMONTO;
            END
        SUMAGR = SUMA1 + SUMA2 + SUMA3;
        totcajas = totcajas + cajas;
        SELECT STAND_COD FROM STANDS WHERE ARTI_COD = :ARTICULO AND STAND_BODEGA = :boditem INTO :stand;
        SUSPEND;
        END
    END
END
^

SET TERM ; ^


/* 20090303 : NO CONTABILIZA COSTO E INVENTARIO SI EL ARTICULO NO TIENE CUENTAS ASI LA INTERFAZ SEA 'K' */
SET TERM ^ ;

CREATE OR ALTER PROCEDURE COSTO_EN_VENTAS(
    TIPO INTEGER,
    ID INTEGER)
AS
declare variable FECHA DATE;
declare variable ARTICULO VARCHAR(20);
declare variable CANTIDAD NUMERIC(18,4);
declare variable COSTO NUMERIC(18,2);
declare variable CTACOSTO VARCHAR(20);
declare variable CTAINVEN VARCHAR(20);
BEGIN
DELETE FROM COSTO_VENTAS;
if (TIPO = 31) then
    BEGIN
    /* FACTURA DE VENTA */
    FOR SELECT D.ARTI_COD, FADE_CANT * FADE_FACTOR, FACT_FECHA
        FROM ARTICULO A, FACTURAS F, FACTURAS_DETALLE D
        WHERE F.FACT_ID = D.FACT_ID AND A.ARTI_COD = D.ARTI_COD AND F.FACT_ID = :ID AND FACT_ANULADO = 'N'
        INTO :ARTICULO, :CANTIDAD, :FECHA
        DO
        BEGIN
        SELECT COAR_CTACOS, COAR_CTAINV FROM CONTABIL_ARTICULO WHERE ARTI_COD = :articulo INTO :CTACOSTO, :CTAINVEN;
        EXECUTE PROCEDURE COSTO_PROMEDIO(:ARTICULO, :FECHA) returning_values (:COSTO);
        INSERT INTO COSTO_VENTAS VALUES (:ARTICULO, :CANTIDAD, :COSTO, :CTACOSTO, :CTAINVEN);
        END
    END
if (TIPO = 32) then
    BEGIN
    /* REMISION */
    FOR SELECT D.ARTI_COD, RVDE_CANT * RVDE_FACTOR, REVT_FECHA
        FROM ARTICULO A, REMISIONES_VENTA R, REMISIONES_VENTA_DETALLE D
        WHERE R.REVT_ID = D.REVT_ID AND A.ARTI_COD = D.ARTI_COD AND R.REVT_ID = :ID AND REVT_ANULADO = 'N'
        INTO :ARTICULO, :CANTIDAD, :FECHA
        DO
        BEGIN
        SELECT COAR_CTACOS, COAR_CTAINV FROM CONTABIL_ARTICULO WHERE ARTI_COD = :articulo INTO :CTACOSTO, :CTAINVEN;
        EXECUTE PROCEDURE COSTO_PROMEDIO(:ARTICULO, :FECHA) returning_values (:COSTO);
        INSERT INTO COSTO_VENTAS VALUES (:ARTICULO, :CANTIDAD, :COSTO, :CTACOSTO, :CTAINVEN);
        END
    END
if (TIPO = 33) then
    BEGIN
    /* DEVOLUCION */
    FOR SELECT D.ARTI_COD, DVDE_CANT * DVDE_FACTOR, DEVT_FECHA
        FROM ARTICULO A, DEVOLUCIONES_VENTAS DV, DEVOLUCIONES_VENTAS_DETALLE D
        WHERE DV.DEVT_ID = D.DEVT_ID AND A.ARTI_COD = D.ARTI_COD AND DV.DEVT_ID = :ID AND DEVT_ANULADO = 'N'
        INTO :ARTICULO, :CANTIDAD, :FECHA
        DO
        BEGIN
        SELECT COAR_CTACOS, COAR_CTAINV FROM CONTABIL_ARTICULO WHERE ARTI_COD = :articulo INTO :CTACOSTO, :CTAINVEN;
        EXECUTE PROCEDURE COSTO_PROMEDIO(:ARTICULO, :FECHA) returning_values (:COSTO);
        INSERT INTO COSTO_VENTAS VALUES (:ARTICULO, :CANTIDAD, :COSTO, :CTACOSTO, :CTAINVEN);
        END
    END
END

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE CONTABILICE_COSTO_VENTAS(
    ID INTEGER,
    IDINTER INTEGER)
RETURNS (
    IDC INTEGER)
AS
declare variable PREF VARCHAR(4);
declare variable NUM VARCHAR(6);
declare variable NUMERO VARCHAR(10);
declare variable INVEN CHAR(1);
declare variable CTAINVEN VARCHAR(20);
declare variable COSTOS CHAR(1);
declare variable CTACOSTOS VARCHAR(20);
declare variable EXISTE CHAR(1);
declare variable CUENTA VARCHAR(20);
declare variable MONTO NUMERIC(18,2);
declare variable TIPOCUEN CHAR(1);
declare variable NIT VARCHAR(20);
declare variable PROY VARCHAR(4);
declare variable CENTRO VARCHAR(4);
declare variable ART VARCHAR(15);
declare variable ANULADO CHAR(1);
declare variable NROI INTEGER;
declare variable NUMROWS INTEGER;
declare variable CONC CHAR(120);
declare variable VENCEAUX DATE;
declare variable VENCE CHAR(8);
begin
/* TRAIGA EL ID DEL ENCABEZADO DEL COMPROBANTE CONTABLE */ /*$$IBE$$ 
SELECT ENCO_CONSEC FROM COMPROBANTE_ENCABEZADO WHERE ENCO_TIPOREF = 31 AND ENCO_IDREF = :ID INTO :IDC;
SELECT MAX(CODE_ITEM) FROM COMPROBANTE_DETALLE WHERE ENCO_CONSEC = :idc INTO :NROI;
NROI = NROI + 1;
 $$IBE$$*/ /* EJECUTE LA PARTE DE CONTABIL_FACTURA QUE CORRESPONDE A LOS COSTOS */ /*$$IBE$$ 
EXISTE = 'N';
SELECT 'S', INVE_COSTO, INVE_INVEN, INVE_CTAINVEN, INVE_CTACOSTOS
    FROM INTERFAZ_VENTAS
    WHERE INVE_ID = :IDINTER
    INTO :EXISTE, :COSTOS, :INVEN, :CTAINVEN, :CTACOSTOS;
if (EXISTE = 'S') then
  BEGIN
  SELECT FACT_ANULADO, PREF_PRE, FACT_NUMERO, FACT_VENCE, TERC_NIT FROM FACTURAS F
        WHERE FACT_ID = :ID INTO :ANULADO, :PREF, :NUMERO, :VENCEAUX, :NIT;
  NUMERO = PREF || NUM;
  CONC = 'COSTO EN VENTAS FACTURA ' || :NUMERO;
  EXECUTE PROCEDURE FECHA_A_CONTA(:VENCEAUX) returning_values (:VENCE);
  if (ANULADO = 'N') then
    BEGIN
    SELECT BODE_CENTRO, BODE_PROY FROM BODEGA B, FACTURAS F, PUNTO_VENTA P
        WHERE B.BODE_COD = P.BODE_COD AND P.PTVT_ID = F.PTVT_ID AND F.FACT_ID = :ID INTO :CENTRO, :PROY;
     $$IBE$$*/ /* SE ASUME QUE NO HAN CAMBIADO LAS CUENTAS DE COSTOS, POR ESO SE HACE UPDATE A LOS MOVIMIENTOS DE ESAS CUENTAS */ /*$$IBE$$ 
    EXECUTE PROCEDURE COSTO_EN_VENTAS(31, :ID);
    if (COSTOS = 'A') then
        BEGIN
        FOR SELECT MAX(CTACOS), SUM(CANT * COSTO)
            FROM COSTO_VENTAS
            GROUP BY CTACOS
            INTO :CTACOSTOS, :MONTO
        DO
            BEGIN
            if (MONTO <> 0) then
                BEGIN
                CUENTA = NULL;
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :CTACOSTOS INTO :CUENTA, :TIPOCUEN;
                IF (CUENTA IS NULL) THEN
                    begin
                    EXCEPTION CUENTA_NO_EXISTE 'La cuenta ' || :ctacostos || ' no existe.';
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                     $$IBE$$*/ /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */ /*$$IBE$$ 
                    FOR SELECT ARTI_COD, CANT * COSTO
                        FROM COSTO_VENTAS
                        WHERE CTACOS = :CUENTA
                        INTO :ART, :MONTO
                    DO
                        BEGIN
                        SELECT COUNT(*) FROM COMPROBANTE_DETALLE WHERE CUEN_COD = :CUENTA AND ENCO_CONSEC = :IDC AND ARTI_COD = :ART INTO :NUMROWS;
                        if (NUMROWS = 0) then
                            BEGIN
                            INSERT INTO comprobante_detalle (ENCO_CONSEC, CODE_ITEM, CUEN_COD, CODE_CONCEPTO, CODE_REFER, CODE_DEBITO, CODE_CREDITO, CODE_BASE, CODE_PORC, TERC_NIT, PROY_COD, CENT_COD, CNDE_DOCNUMERO, CNDE_DOCAPLICA, DOCO_VENCE, ARTI_COD, CODE_TIPOAPL, CODE_TIPONUE)
                                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                            NROI = NROI + 1;
                            END
                        ELSE
                            UPDATE COMPROBANTE_DETALLE
                                SET CODE_DEBITO = :MONTO
                            WHERE CUEN_COD = :CUENTA AND ENCO_CONSEC = :IDC AND ARTI_COD = :ART;
                        END
                    END
                ELSE
                    BEGIN
                    SELECT COUNT(*) FROM COMPROBANTE_DETALLE WHERE CUEN_COD = :CUENTA AND ENCO_CONSEC = :IDC INTO :NUMROWS;
                    if (NUMROWS = 0) then
                        BEGIN
                        if (TIPOCUEN = 'C') then
                            INSERT INTO comprobante_detalle (ENCO_CONSEC, CODE_ITEM, CUEN_COD, CODE_CONCEPTO, CODE_REFER, CODE_DEBITO, CODE_CREDITO, CODE_BASE, CODE_PORC, TERC_NIT, PROY_COD, CENT_COD, CNDE_DOCNUMERO, CNDE_DOCAPLICA, DOCO_VENCE, ARTI_COD, CODE_TIPOAPL, CODE_TIPONUE)
                                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                        ELSE
                            INSERT INTO comprobante_detalle (ENCO_CONSEC, CODE_ITEM, CUEN_COD, CODE_CONCEPTO, CODE_REFER, CODE_DEBITO, CODE_CREDITO, CODE_BASE, CODE_PORC, TERC_NIT, PROY_COD, CENT_COD, CNDE_DOCNUMERO, CNDE_DOCAPLICA, DOCO_VENCE, ARTI_COD, CODE_TIPOAPL, CODE_TIPONUE)
                                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NROI = NROI + 1;
                        END
                    ELSE
                        UPDATE COMPROBANTE_DETALLE
                            SET CODE_DEBITO = :MONTO
                        WHERE CUEN_COD = :CUENTA AND ENCO_CONSEC = :IDC;
                    END
                END  $$IBE$$*/ /* MONTO <> 0 */ /*$$IBE$$ 
            END  $$IBE$$*/ /* FOR */ /*$$IBE$$ 
        END  $$IBE$$*/ /* COSTOS */ /*$$IBE$$ 
    if (COSTOS = 'K') then
        BEGIN
        SELECT SUM(CANT * COSTO)
            FROM COSTO_VENTAS
            INTO :MONTO;
        if (MONTO <> 0) then
            BEGIN
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTACOSTOS INTO :CUENTA, :TIPOCUEN;
            IF (CUENTA IS NULL) THEN
                begin
                EXCEPTION CUENTA_NO_EXISTE 'La cuenta ' || :ctacostos || ' no existe.';
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                 $$IBE$$*/ /* ES UNA CUENTA DE INVENTARIO, REGISTRE UNO A UNO LOS ARTICULOS */ /*$$IBE$$ 
                FOR SELECT ARTI_COD, CANT * COSTO
                    FROM COSTO_VENTAS
                    INTO :ART, :MONTO
                DO
                    BEGIN
                    SELECT COUNT(*) FROM COMPROBANTE_DETALLE WHERE CUEN_COD = :CUENTA AND ENCO_CONSEC = :IDC AND ARTI_COD = :ART INTO :NUMROWS;
                    if (NUMROWS = 0) then
                        BEGIN
                            INSERT INTO comprobante_detalle (ENCO_CONSEC, CODE_ITEM, CUEN_COD, CODE_CONCEPTO, CODE_REFER, CODE_DEBITO, CODE_CREDITO, CODE_BASE, CODE_PORC, TERC_NIT, PROY_COD, CENT_COD, CNDE_DOCNUMERO, CNDE_DOCAPLICA, DOCO_VENCE, ARTI_COD, CODE_TIPOAPL, CODE_TIPONUE)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        END
                    ELSE
                        UPDATE COMPROBANTE_DETALLE
                            SET CODE_DEBITO = :MONTO
                        WHERE CUEN_COD = :CUENTA AND ENCO_CONSEC = :IDC AND ARTI_COD = :ART;
                    END
                END
            ELSE
                BEGIN
                SELECT COUNT(*) FROM COMPROBANTE_DETALLE WHERE CUEN_COD = :CUENTA AND ENCO_CONSEC = :IDC INTO :NUMROWS;
                if (NUMROWS = 0) then
                    BEGIN
                    if (TIPOCUEN = 'C') then
                        INSERT INTO comprobante_detalle (ENCO_CONSEC, CODE_ITEM, CUEN_COD, CODE_CONCEPTO, CODE_REFER, CODE_DEBITO, CODE_CREDITO, CODE_BASE, CODE_PORC, TERC_NIT, PROY_COD, CENT_COD, CNDE_DOCNUMERO, CNDE_DOCAPLICA, DOCO_VENCE, ARTI_COD, CODE_TIPOAPL, CODE_TIPONUE)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    ELSE
                        INSERT INTO comprobante_detalle (ENCO_CONSEC, CODE_ITEM, CUEN_COD, CODE_CONCEPTO, CODE_REFER, CODE_DEBITO, CODE_CREDITO, CODE_BASE, CODE_PORC, TERC_NIT, PROY_COD, CENT_COD, CNDE_DOCNUMERO, CNDE_DOCAPLICA, DOCO_VENCE, ARTI_COD, CODE_TIPOAPL, CODE_TIPONUE)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    END
                ELSE
                    UPDATE COMPROBANTE_DETALLE
                        SET CODE_DEBITO = :MONTO
                    WHERE CUEN_COD = :CUENTA AND ENCO_CONSEC = :IDC;
                END
            END  $$IBE$$*/ /* MONTO <> 0 */ /*$$IBE$$ 
        END  $$IBE$$*/ /* COSTOS = K */ /*$$IBE$$ 
    if (INVEN = 'A') then
        BEGIN
        FOR SELECT MAX(CTAINV), SUM(CANT * COSTO)
            FROM COSTO_VENTAS
            GROUP BY CTAINV
            INTO :CTAINVEN, :MONTO
        DO
            BEGIN
            if (MONTO <> 0) then
                BEGIN
                CUENTA = NULL;
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :CTAINVEN INTO :CUENTA, :TIPOCUEN;
                IF (CUENTA IS NULL) THEN
                    begin
                    EXCEPTION CUENTA_NO_EXISTE 'La cuenta ' || :ctainven || ' no existe.';
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                     $$IBE$$*/ /* ES UNA CUENTA DE INVENTARIO, REGISTRE UNO A UNO LOS ARTICULOS */ /*$$IBE$$ 
                    FOR SELECT ARTI_COD, CANT * COSTO
                        FROM COSTO_VENTAS
                        WHERE CTAINV = :CUENTA
                        INTO :ART, :MONTO
                    DO
                        BEGIN
                        SELECT COUNT(*) FROM COMPROBANTE_DETALLE WHERE CUEN_COD = :CUENTA AND ENCO_CONSEC = :IDC AND ARTI_COD = :ART INTO :NUMROWS;
                        if (NUMROWS = 0) then
                            BEGIN
                            INSERT INTO comprobante_detalle (ENCO_CONSEC, CODE_ITEM, CUEN_COD, CODE_CONCEPTO, CODE_REFER, CODE_DEBITO, CODE_CREDITO, CODE_BASE, CODE_PORC, TERC_NIT, PROY_COD, CENT_COD, CNDE_DOCNUMERO, CNDE_DOCAPLICA, DOCO_VENCE, ARTI_COD, CODE_TIPOAPL, CODE_TIPONUE)
                                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                            NROI = NROI + 1;
                            END
                        ELSE
                            UPDATE COMPROBANTE_DETALLE
                                SET CODE_CREDITO = :MONTO
                            WHERE CUEN_COD = :CUENTA AND ENCO_CONSEC = :IDC AND ARTI_COD = :ART;
                        END
                    END
                ELSE
                    BEGIN
                    SELECT COUNT(*) FROM COMPROBANTE_DETALLE WHERE CUEN_COD = :CUENTA AND ENCO_CONSEC = :IDC INTO :NUMROWS;
                    if (NUMROWS = 0) then
                        BEGIN
                        if (TIPOCUEN = 'C') then
                            INSERT INTO comprobante_detalle (ENCO_CONSEC, CODE_ITEM, CUEN_COD, CODE_CONCEPTO, CODE_REFER, CODE_DEBITO, CODE_CREDITO, CODE_BASE, CODE_PORC, TERC_NIT, PROY_COD, CENT_COD, CNDE_DOCNUMERO, CNDE_DOCAPLICA, DOCO_VENCE, ARTI_COD, CODE_TIPOAPL, CODE_TIPONUE)
                                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                        ELSE
                            INSERT INTO comprobante_detalle (ENCO_CONSEC, CODE_ITEM, CUEN_COD, CODE_CONCEPTO, CODE_REFER, CODE_DEBITO, CODE_CREDITO, CODE_BASE, CODE_PORC, TERC_NIT, PROY_COD, CENT_COD, CNDE_DOCNUMERO, CNDE_DOCAPLICA, DOCO_VENCE, ARTI_COD, CODE_TIPOAPL, CODE_TIPONUE)
                                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NROI = NROI + 1;
                        END
                    ELSE
                        UPDATE COMPROBANTE_DETALLE
                            SET CODE_CREDITO = :MONTO
                        WHERE CUEN_COD = :CUENTA AND ENCO_CONSEC = :IDC;
                    END
                END  $$IBE$$*/ /* MONTO <> 0 */ /*$$IBE$$ 
            END  $$IBE$$*/ /* FOR */ /*$$IBE$$ 
        END  $$IBE$$*/ /* INVEN = A */ /*$$IBE$$ 
    if (INVEN = 'K') then
        BEGIN
        SELECT SUM(CANT * COSTO)
            FROM COSTO_VENTAS
            INTO :MONTO;
        if (MONTO <> 0) then
            BEGIN
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTAINVEN INTO :CUENTA, :TIPOCUEN;
            IF (CUENTA IS NULL) THEN
                begin
                EXCEPTION CUENTA_NO_EXISTE 'La cuenta ' || :ctainven || ' no existe.';
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                 $$IBE$$*/ /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */ /*$$IBE$$ 
                FOR SELECT ARTI_COD, CANT * COSTO
                    FROM COSTO_VENTAS
                    INTO :ART, :MONTO
                DO
                    BEGIN
                    SELECT COUNT(*) FROM COMPROBANTE_DETALLE WHERE CUEN_COD = :CUENTA AND ENCO_CONSEC = :IDC AND ARTI_COD = :ART INTO :NUMROWS;
                    if (NUMROWS = 0) then
                        BEGIN
                        INSERT INTO comprobante_detalle (ENCO_CONSEC, CODE_ITEM, CUEN_COD, CODE_CONCEPTO, CODE_REFER, CODE_DEBITO, CODE_CREDITO, CODE_BASE, CODE_PORC, TERC_NIT, PROY_COD, CENT_COD, CNDE_DOCNUMERO, CNDE_DOCAPLICA, DOCO_VENCE, ARTI_COD, CODE_TIPOAPL, CODE_TIPONUE)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        END
                    ELSE
                        UPDATE COMPROBANTE_DETALLE
                            SET CODE_CREDITO = :MONTO
                        WHERE CUEN_COD = :CUENTA AND ENCO_CONSEC = :IDC AND ARTI_COD = :ART;
                    END
                END
            ELSE
                BEGIN
                SELECT COUNT(*) FROM COMPROBANTE_DETALLE WHERE CUEN_COD = :CUENTA AND ENCO_CONSEC = :IDC INTO :NUMROWS;
                if (NUMROWS = 0) then
                    BEGIN
                    if (TIPOCUEN = 'C') then
                        INSERT INTO comprobante_detalle (ENCO_CONSEC, CODE_ITEM, CUEN_COD, CODE_CONCEPTO, CODE_REFER, CODE_DEBITO, CODE_CREDITO, CODE_BASE, CODE_PORC, TERC_NIT, PROY_COD, CENT_COD, CNDE_DOCNUMERO, CNDE_DOCAPLICA, DOCO_VENCE, ARTI_COD, CODE_TIPOAPL, CODE_TIPONUE)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    ELSE
                        INSERT INTO comprobante_detalle (ENCO_CONSEC, CODE_ITEM, CUEN_COD, CODE_CONCEPTO, CODE_REFER, CODE_DEBITO, CODE_CREDITO, CODE_BASE, CODE_PORC, TERC_NIT, PROY_COD, CENT_COD, CNDE_DOCNUMERO, CNDE_DOCAPLICA, DOCO_VENCE, ARTI_COD, CODE_TIPOAPL, CODE_TIPONUE)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    END
                ELSE
                    UPDATE COMPROBANTE_DETALLE
                        SET CODE_CREDITO = :MONTO
                    WHERE CUEN_COD = :CUENTA AND ENCO_CONSEC = :IDC;
                END
            END  $$IBE$$*/ /* MONTO <> 0 */ /*$$IBE$$ 
        END  $$IBE$$*/ /* INVEN = K */ /*$$IBE$$ 
    END
  END
 $$IBE$$*/ SUSPEND;
end
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE CONTABIL_DEVOLCLI(
    IDDOC INTEGER,
    IDINTER INTEGER)
RETURNS (
    ERROR INTEGER,
    VER CHAR(1),
    IDC INTEGER)
AS
declare variable PREF VARCHAR(4);
declare variable NUM VARCHAR(6);
declare variable NUMERO VARCHAR(10);
declare variable FECAUX DATE;
declare variable FECHA CHAR(8);
declare variable CONC CHAR(120);
declare variable NUMFAC VARCHAR(10);
declare variable VRDTO NUMERIC(18, 2);
declare variable VRADIC NUMERIC(18, 2);
declare variable VRSUBT NUMERIC(18, 2);
declare variable VRIVA NUMERIC(18, 2);
declare variable PRTFTE NUMERIC(9, 2);
declare variable VRRTFTE NUMERIC(18, 2);
declare variable VRRTIVA NUMERIC(18, 2);
declare variable PRTICA NUMERIC(9, 2);
declare variable VRRTICA NUMERIC(18, 2);
declare variable VRTOTAL NUMERIC(18, 2);
declare variable VREXTRA NUMERIC(18, 2);
declare variable TIPOCOMP VARCHAR(3);
declare variable PREFCONT VARCHAR(4);
declare variable VENTAS CHAR(1);
declare variable CTAVENTAS VARCHAR(20);
declare variable IVA CHAR(1);
declare variable CTAIVA VARCHAR(20);
declare variable CONSUMO CHAR(1);
declare variable CTACONSUMO VARCHAR(20);
declare variable CARTERA CHAR(1);
declare variable CTACARTERA VARCHAR(20);
declare variable RTFTE CHAR(1);
declare variable CTARTFTE VARCHAR(20);
declare variable RTIVA CHAR(1);
declare variable CTARTIVA VARCHAR(20);
declare variable RTICA CHAR(1);
declare variable CTARTICA VARCHAR(20);
declare variable INVEN CHAR(1);
declare variable CTAINVEN VARCHAR(20);
declare variable COSTOS CHAR(1);
declare variable CTACOSTOS VARCHAR(20);
declare variable CTADTO VARCHAR(20);
declare variable CTAADIC VARCHAR(20);
declare variable CTAEXTRA VARCHAR(20);
declare variable EXISTE CHAR(1);
declare variable CUENTA VARCHAR(20);
declare variable MONTO NUMERIC(18,2);
declare variable TIPOCUEN CHAR(1);
declare variable NIT VARCHAR(20);
declare variable PROY VARCHAR(4);
declare variable CENTRO VARCHAR(4);
declare variable PORC NUMERIC(5,2);
declare variable DEBITO NUMERIC(18,2);
declare variable CREDITO NUMERIC(18,2);
declare variable NROI INTEGER;
declare variable ART VARCHAR(15);
declare variable IMPINC CHAR(1);
declare variable IMPTOS NUMERIC(18, 2);
declare variable SUMA NUMERIC(18,2);
declare variable PORCIVA NUMERIC(9,2);
declare variable TCTACLIEN VARCHAR(20);
declare variable TCTAVENTA VARCHAR(20);
declare variable TCTARTFTE VARCHAR(20);
declare variable TCTARTIVA VARCHAR(20);
declare variable TCTARTICA VARCHAR(20);
declare variable CTADIC VARCHAR(20);
declare variable BASEADIC VARCHAR(20);
declare variable PORCADIC NUMERIC(5,2);
declare variable VALORADIC NUMERIC(18,2);
declare variable DBADIC CHAR(1);
declare variable PTOVTA INTEGER;
declare variable ANULADO CHAR(1);
declare variable CENT CHAR(1);
DECLARE VARIABLE MERCANCIA NUMERIC(18,2);
declare variable FACTOR DOUBLE PRECISION;
declare variable DIG INTEGER;
DECLARE VARIABLE FOMENTO VARCHAR(2);
DECLARE VARIABLE VRCONSUMO NUMERIC(18,2);
declare variable AUTORET VARCHAR(10);
declare variable FAUTORET DATE;
declare variable IDREM INTEGER;
declare variable DTOXIT CHAR(2);
declare variable ERRORC INTEGER;
BEGIN /*$$IBE$$ 
EXECUTE PROCEDURE LEE_CONFIGURACION('COMPRAS', 'FACTURAS', 'USAR IMPOCONSUMO COMO PORCENTAJE DE FOMENTO') returning_values (FOMENTO);
EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'FECHA AUTORETENEDOR NO DESCONTAR RETENCIONES DEL SALDO PERO SI CONTABILIZARLAS') returning_values (AUTORET);
if (AUTORET <> '') then
    FAUTORET = CAST(AUTORET AS DATE);
else
    FAUTORET = '9999/12/31';
   $$IBE$$*/ /* BUSQUE LA INTERFACE */ /*$$IBE$$ 
  EXISTE = 'N';
  SELECT 'S', TICO_COD, PRCO_PRE, INVE_VENTAS, INVE_IVA, INVE_CONSUMO, INVE_CARTERA, INVE_RTFTE, INVE_RTIVA, INVE_RTICA, INVE_COSTO, INVE_INVEN, INVE_CTAVENTAS, INVE_CTAIVA, INVE_CTACONSUMO, INVE_CTADTO, INVE_CTAADIC, INVE_CTAEXTRA, INVE_CTACARTERA, INVE_CTARTFTE, INVE_CTARTIVA, INVE_CTARTICA, INVE_CTAINVEN, INVE_CTACOSTOS, INVE_CONFIRMAR, INVE_CENTRO
    FROM INTERFAZ_VENTAS
    WHERE INVE_ID = :IDINTER
    INTO :EXISTE, :TIPOCOMP, :PREFCONT, :VENTAS, :IVA, :CONSUMO, :CARTERA, :RTFTE, :RTIVA, :RTICA, :COSTOS, :INVEN, :CTAVENTAS, :CTAIVA, :CTACONSUMO, :CTADTO, :CTAADIC, :CTAEXTRA, :CTACARTERA, :CTARTFTE, :CTARTIVA, :CTARTICA, :CTAINVEN, :CTACOSTOS, :VER, :CENT;
  if (EXISTE = 'S') then
   BEGIN
     $$IBE$$*/ /* BORRE CUALQUEIR CONTABILIZACION PREVIA */ /*$$IBE$$ 
    DELETE FROM CONTABILIZACION WHERE CNTB_TIPOREF = 33 AND CNTB_IDREF = :IDDOC;
     $$IBE$$*/ /* TRAIGA EL ENCABEZADO DE LA DEVOLUCION */ /*$$IBE$$ 
   SELECT PREF_PRE, DEVT_NUMERO, DEVT_FECHA, F.TERC_NIT, DEVT_IVAINC, PTVT_ID, DEVT_FACTURA, DEVT_DTOMONTO, DEVT_ADICIONAL, DEVT_IVAMONTO, DEVT_EXTRA, DEVT_TOTAL, DEVT_RTFTEPORC, DEVT_RTFTEMONTO, DEVT_RTIVAPORC, DEVT_RTIVAMONTO, DEVT_RTICAPORC, DEVT_RTICAMONTO, TERC_CTARTFTE, TERC_CTARTIVA, TERC_CTARTICA, TERC_CTAVENTA, TERC_CTACLIENTE, DEVT_ANULADO, DEVT_REMID
        FROM DEVOLUCIONES_VENTAS F, TERCEROS T
        WHERE DEVT_ID = :IDDOC AND F.TERC_NIT = T.TERC_NIT
        INTO :PREF, :NUM, :FECAUX, :NIT, :IMPINC, :PTOVTA, :NUMFAC, :VRDTO, :VRADIC, :VRIVA, :VREXTRA, :VRTOTAL, :PRTFTE, :VRRTFTE, :PORC, :VRRTIVA, :PRTICA, :VRRTICA, :TCTARTFTE, TCTARTIVA, TCTARTICA, TCTAVENTA, TCTACLIEN, ANULADO, :IDREM;
   if (idrem is null) Then
    IDREM = 0;
   if ((ANULADO = 'N') AND (IDREM = 0)) then
    BEGIN
    NUMERO = PREF || NUM;
    SELECT SUM(DVDE_CONSUMO) FROM devoluciones_ventas_detalle WHERE DEVT_ID = :iddoc AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL)) INTO :MERCANCIA;
    VRSUBT = VRTOTAL - VREXTRA - VRIVA - MERCANCIA;  $$IBE$$*/ /* BASE DE RETEFTE Y RETEICA */ /*$$IBE$$ 
    EXECUTE PROCEDURE lee_configuracion ('FACTURACION', 'DEVOLUCIONES', 'DESCUENTO PIE DEVOLUCION IGUAL A SUMA DE DESCUENTOS POR ITEM') returning_values (:DTOXIT);
    if (DTOXIT = 'SI') then
        VRDTO = 0;
    MERCANCIA = VRSUBT - VRADIC + VRDTO;
    IF (CENT = 'B') THEN
        SELECT B.BODE_CENTRO, B.BODE_PROY FROM BODEGA B, DEVOLUCIONES_VENTAS F
            WHERE B.BODE_COD = F.BODE_COD AND F.DEVT_ID = :IDDOC INTO :CENTRO, :PROY;
    IF (CENT = 'V') THEN
        SELECT V.CENT_COD, V.PROY_COD FROM VENDEDORES V, DEVOLUCIONES_VENTAS F
            WHERE V.VEND_COD = F.VEND_COD AND F.DEVT_ID = :IDDOC INTO :CENTRO, :PROY;
    IF (CENT = 'P') THEN
        SELECT P.PREF_CENTRO,P.PREF_PROY  FROM PREFIJOS P, DEVOLUCIONES_VENTAS F
            WHERE P.PREF_PRE = F.PREF_PRE AND F.DEVT_ID = :IDDOC AND P.TIDO_COD = 33 INTO :CENTRO, :PROY;
    EXECUTE PROCEDURE FECHA_A_CONTA(:FECAUX) returning_values (:FECHA);
     $$IBE$$*/ /* REGISTRE EL ENCABEZADO CONTABLE */ /*$$IBE$$ 
    IDC = GEN_ID(ID_CONTABILIZA, 1);
    CONC = 'DEVOLUCION VENTAS No. ' || NUMERO || ' EN FACTURA ' || NUMFAC;
    CONC = SUBSTR(CONC, 1, 60);
    INSERT INTO CONTABILIZACION (CNTB_ID, CNTB_TIPOCOMP, CNTB_PREFCNT, CNTB_NUMERO, CNTB_FECHA, CNTB_CONCEPTO, CNTB_REF, CNTB_TIPOREF, CNTB_IDREF, CNTB_PREFREF, CNTB_NUMREF, CNTB_PROCESADO)
        VALUES (:IDC, :TIPOCOMP, :PREFCONT, :NUM, :FECHA, :CONC, '', 33, :IDDOC, :PREF, :NUM, 'N');
    NROI = 0;
    SUMA = 0;
    ERROR = 0;
     $$IBE$$*/ /* SI NO HAY CUENTA DE DESCUENTO NI ADICIONAL CALCULE UN FACTOR PARA LAS VENTAS Y EL IVA */ /*$$IBE$$ 
    if (MERCANCIA <> 0) then
        FACTOR = CAST(VRSUBT AS DOUBLE PRECISION) / CAST(MERCANCIA AS DOUBLE PRECISION);
    ELSE
        FACTOR = 1;
     $$IBE$$*/ /* TRAIGA EL NUMERO DE DIGITOS PARA EL REDONDEO */ /*$$IBE$$ 
    SELECT CAST(CONF_VALOR AS INTEGER) FROM CONFIGURACION WHERE CONF_MODULO = 'FACTURACION' AND
        CONF_CATEGORIA = 'GENERAL' AND CONF_PROPIEDAD = 'REDONDEO AL MULTIPLO DE DIEZ EN TOTALES' INTO :DIG;
     $$IBE$$*/ /* CUENTAS DE VENTAS */ /*$$IBE$$ 
    if (VENTAS = 'A') then
        BEGIN
        FOR SELECT MAX(COAR_CTADEV), SUM(cast(DVDE_CANT as double precision) * (DVDE_PRUNIT-DVDE_DTOMONTO)), SUM(DVDE_IVAMONTO), SUM(DVDE_CONSUMO)
            FROM ARTICULO A, CONTABIL_ARTICULO C, DEVOLUCIONES_VENTAS_DETALLE F
            WHERE F.DEVT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
            GROUP BY COAR_CTADEV
            INTO :CTAVENTAS, :MONTO, :IMPTOS, :VRCONSUMO
            DO
            BEGIN
            if (IMPINC = 'S') then
                if (FOMENTO = 'SI') then
                    MONTO = MONTO - IMPTOS;
                ELSE
                    MONTO = MONTO - IMPTOS - VRCONSUMO;
            ELSE
            if (FOMENTO = 'SI') then
            MONTO = MONTO + VRCONSUMO;
            if ((CTADTO IS NULL) OR (CTADTO = '')) then
                MONTO = MONTO * FACTOR;
            execute procedure redondee(MONTO, DIG) returning_values (MONTO);
            if (MONTO <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTAVENTAS, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                     $$IBE$$*/ /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */ /*$$IBE$$ 
                    FOR SELECT F.ARTI_COD, (cast(DVDE_CANT as double precision) * (DVDE_PRUNIT-DVDE_DTOMONTO)), (DVDE_IVAMONTO+DVDE_CONSUMO)
                        FROM ARTICULO A, CONTABIL_ARTICULO C, DEVOLUCIONES_VENTAS_DETALLE F
                        WHERE F.DEVT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTAINV = :CUENTA AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
                        INTO :ART, :MONTO, :IMPTOS
                    DO
                        BEGIN
                        if (IMPINC = 'S') then
                            MONTO = MONTO - IMPTOS;
                        if ((CTADTO IS NULL) OR (CTADTO = '')) then
                            MONTO = MONTO * FACTOR;
                        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        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, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                    NROI = NROI + 1;
                    SUMA = SUMA + MONTO;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA + MONTO;
                    END
                END  $$IBE$$*/ /* MONTO <> 0 */ /*$$IBE$$ 
            END  $$IBE$$*/ /* FOR */ /*$$IBE$$ 
        END  $$IBE$$*/ /* VENTAS X ARTICULO */ /*$$IBE$$ 
     IF ((VENTAS = 'C') OR (VENTAS = 'K')) THEN
        BEGIN
        IF (VENTAS = 'C') THEN
            CTAVENTAS = TCTAVENTA;
        SELECT SUM(cast(DVDE_CANT as double precision) * (DVDE_PRUNIT-DVDE_DTOMONTO)), SUM(DVDE_IVAMONTO), SUM(DVDE_CONSUMO)
            FROM DEVOLUCIONES_VENTAS_DETALLE F
            WHERE F.DEVT_ID = :IDDOC  AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
            INTO :MONTO, :IMPTOS, :VRCONSUMO;
        if (IMPINC = 'S') then
            if (FOMENTO = 'SI') then
               MONTO = MONTO - IMPTOS;
            ELSE
               MONTO = MONTO - IMPTOS - VRCONSUMO;
        ELSE
         if (FOMENTO = 'SI') then
          MONTO = MONTO + VRCONSUMO;
        if ((CTADTO IS NULL) OR (CTADTO = '')) then
            MONTO = MONTO * FACTOR;
        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
        if (MONTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTAVENTAS, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'I') then
                BEGIN
                 $$IBE$$*/ /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */ /*$$IBE$$ 
                FOR SELECT F.ARTI_COD, (cast(DVDE_CANT as double precision) * (DVDE_PRUNIT-DVDE_DTOMONTO)), (DVDE_IVAMONTO+DVDE_CONSUMO)
                    FROM ARTICULO A, DEVOLUCIONES_VENTAS_DETALLE F
                    WHERE F.DEVT_ID = :IDDOC AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
                    INTO :ART, :MONTO, :IMPTOS
                    DO
                    BEGIN
                    if (IMPINC = 'S') then
                        MONTO = MONTO - IMPTOS;
                    if ((CTADTO IS NULL) OR (CTADTO = '')) then
                        MONTO = MONTO * FACTOR;
                    execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                    NROI = NROI + 1;
                    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, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                NROI = NROI + 1;
                SUMA = SUMA + MONTO;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA + MONTO;
                END
            END  $$IBE$$*/ /* MONTO <> 0 */ /*$$IBE$$ 
        END  $$IBE$$*/ /* VENTAS DE CLIENTE O CONSTANTE */
    /* EL IVA EN VENTAS */ /*$$IBE$$ 
    if (IVA = 'A') then
        BEGIN
        FOR SELECT MAX(COAR_CTAIVAV), SUM(DVDE_IVAMONTO), SUM(DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO), SUM(DVDE_CONSUMO)
            FROM ARTICULO A, CONTABIL_ARTICULO C, DEVOLUCIONES_VENTAS_DETALLE F
            WHERE F.DEVT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
            GROUP BY COAR_CTAIVAV
            INTO :CTAIVA, :IMPTOS, :MONTO, :VALORADIC
        DO
            BEGIN
            if (FOMENTO = 'SI') then
                MONTO = MONTO + VALORADIC;
            MONTO = MONTO * -1;
            MONTO = MONTO * FACTOR;
            IMPTOS = IMPTOS * FACTOR;
            execute procedure redondee(MONTO, DIG) returning_values (MONTO);
            execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
            if (IMPTOS <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTAIVA, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                     $$IBE$$*/ /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */ /*$$IBE$$ 
                    FOR SELECT F.ARTI_COD, DVDE_IVAMONTO, (cast(DVDE_CANT as double precision) * (DVDE_PRUNIT-DVDE_DTOMONTO)), TAIV_PORC, DVDE_CONSUMO
                        FROM ARTICULO A, CONTABIL_ARTICULO C, DEVOLUCIONES_VENTAS_DETALLE F, TARIFA_IVA T
                        WHERE F.DEVT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND A.TAIV_COD = T.TAIV_COD AND COAR_CTAIVAV = :CUENTA AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
                        INTO :ART, :IMPTOS, :MONTO, :PORCIVA, :VALORADIC
                    DO
                        BEGIN
                        if (IMPINC = 'S') then
                            MONTO = MONTO - IMPTOS - VALORADIC;
                        MONTO = MONTO * -1;
                        MONTO = MONTO * FACTOR;
                        IMPTOS = IMPTOS * FACTOR;
                        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                        execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                        if (IMPTOS <> 0) then
                            BEGIN
                            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :IMPTOS, 0, :MONTO, :PORCIVA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                            NROI = NROI + 1;
                            SUMA = SUMA + IMPTOS;
                            END
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                    NROI = NROI + 1;
                    SUMA = SUMA + IMPTOS;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA + IMPTOS;
                    END
                END    $$IBE$$*/ /* IMPTOS <> 0 */ /*$$IBE$$ 
            END  $$IBE$$*/ /* FOR */ /*$$IBE$$ 
        END  $$IBE$$*/ /* IVA X ARTICULO */ /*$$IBE$$ 
    if (IVA = 'K') then  $$IBE$$*/ /* IVA EN CTA CONSTANTE */ /*$$IBE$$ 
        BEGIN
        SELECT SUM(DVDE_IVAMONTO), SUM(DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO), SUM(DVDE_CONSUMO)
            FROM DEVOLUCIONES_VENTAS_DETALLE F
            WHERE F.DEVT_ID = :IDDOC  AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
            INTO :IMPTOS, :MONTO, :VALORADIC;
        if (FOMENTO = 'SI') then
            MONTO = MONTO + VALORADIC;
        MONTO = MONTO * -1;
        MONTO = MONTO * FACTOR;
        IMPTOS = IMPTOS * FACTOR;
        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
        execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
        if (IMPTOS <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTAIVA, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'I') then
                BEGIN
                 $$IBE$$*/ /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */ /*$$IBE$$ 
                FOR SELECT F.ARTI_COD, (cast(DVDE_CANT as double precision) * (DVDE_PRUNIT-DVDE_DTOMONTO)), DVDE_IVAMONTO, TAIV_PORC, DVDE_CONSUMO
                    FROM ARTICULO A, DEVOLUCIONES_VENTAS_DETALLE F, TARIFA_IVA T
                    WHERE F.DEVT_ID = :IDDOC AND A.TAIV_COD = T.TAIV_COD AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
                    INTO :ART, :MONTO, :IMPTOS, :PORCIVA, :VALORADIC
                    DO
                    BEGIN
                    if (IMPINC = 'S') then
                        MONTO = MONTO - IMPTOS - VALORADIC;
                    MONTO = MONTO * -1;
                    MONTO = MONTO * FACTOR;
                    IMPTOS = IMPTOS * FACTOR;
                    execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                    execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                    if (IMPTOS <> 0) then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', :IMPTOS, 0, :MONTO, :PORCIVA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        SUMA = SUMA + IMPTOS;
                        END
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                NROI = NROI + 1;
                SUMA = SUMA + IMPTOS;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA + IMPTOS;
                END
            END  $$IBE$$*/ /* IMPTOS <> 0 */ /*$$IBE$$ 
        END  $$IBE$$*/ /* IVA EN CTA CONSTANTE */
    /* EL IMPOCONSUMO */ /*$$IBE$$ 
    if ((CONSUMO = 'A') AND (FOMENTO <> 'SI')) then
        BEGIN
        FOR SELECT MAX(COAR_CTACONS), SUM(DVDE_CONSUMO)
            FROM ARTICULO A, CONTABIL_ARTICULO C, DEVOLUCIONES_VENTAS_DETALLE F
            WHERE F.DEVT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
            GROUP BY COAR_CTACONS
            INTO :CTACONSUMO, :IMPTOS
        DO
            BEGIN
            if (IMPTOS <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTACONSUMO, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                     $$IBE$$*/ /* ES UNA CUENTA DE INVENTARIO, REGISTRE UNO A UNO LOS ARTICULOS */ /*$$IBE$$ 
                    FOR SELECT F.ARTI_COD, DVDE_CONSUMO
                        FROM ARTICULO A, CONTABIL_ARTICULO C, DEVOLUCIONES_VENTAS_DETALLE F
                        WHERE F.DEVT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTACONS = :CUENTA AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
                        INTO :ART, :IMPTOS
                    DO
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 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, :NROI, :CUENTA, :CONC, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                    NROI = NROI + 1;
                    SUMA = SUMA + IMPTOS;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA + IMPTOS;
                    END
                END  $$IBE$$*/ /* IMPTOS <> 0 */ /*$$IBE$$ 
            END  $$IBE$$*/ /* FOR */ /*$$IBE$$ 
        END  $$IBE$$*/ /* CONSUMO X ARTICULO */ /*$$IBE$$ 
    if ((CONSUMO = 'K') AND (FOMENTO <> 'SI')) then
        BEGIN
        SELECT SUM(DVDE_CONSUMO)
            FROM DEVOLUCIONES_VENTAS_DETALLE F
            WHERE F.DEVT_ID = :IDDOC AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
            INTO :IMPTOS;
        if (IMPTOS <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTACONSUMO, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'I') then
                BEGIN
                 $$IBE$$*/ /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */ /*$$IBE$$ 
                FOR SELECT F.ARTI_COD, DVDE_CONSUMO
                    FROM ARTICULO A, DEVOLUCIONES_VENTAS_DETALLE F
                    WHERE F.DEVT_ID = :IDDOC  AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
                    INTO :ART, :IMPTOS
                    DO
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTACONSUMO, :CONC, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                    NROI = NROI + 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, :NROI, :CTACONSUMO, :CONC, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA + IMPTOS;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTACONSUMO, :CONC, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA + IMPTOS;
                END
            END  $$IBE$$*/ /* IMPTOS <> 0 */ /*$$IBE$$ 
        END  $$IBE$$*/ /* CONSUMO EN CTA CONSTANTE */
    /* DESCUENTO */ /*$$IBE$$ 
    if ((CTADTO IS NOT NULL) AND
        (CTADTO <> '') AND
        (VRDTO <> 0)) THEN
        BEGIN
        EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTADTO, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRDTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
            NROI = NROI + 1;
            SUMA = SUMA - VRDTO;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRDTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 33);
            NROI = NROI + 1;
            SUMA = SUMA - VRDTO;
            END
        END  $$IBE$$*/ /* DESCUENTO */
    /* VALOR ADIC */ /*$$IBE$$ 
    if ((CTAADIC IS NOT NULL) AND
        (CTAADIC <> '') AND
        (VRADIC <> 0)) THEN
        BEGIN
        EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTAADIC, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRADIC, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
            NROI = NROI + 1;
            SUMA = SUMA + VRADIC;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRADIC, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 33);
            NROI = NROI + 1;
            SUMA = SUMA + VRADIC;
            END
        END  $$IBE$$*/ /* VR. ADIC */
    /* VALOR EXTRA */ /*$$IBE$$ 
    if ((CTAEXTRA IS NOT NULL) AND
        (CTAEXTRA <> '') AND
        (VREXTRA <> 0)) THEN
        BEGIN
        EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTAEXTRA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VREXTRA, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
            NROI = NROI + 1;
            SUMA = SUMA + VREXTRA;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VREXTRA, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 33);
            NROI = NROI + 1;
            SUMA = SUMA + VREXTRA;
            END
        END  $$IBE$$*/ /* VR. EXTRA */
    /* RETENCION FUENTE */ /*$$IBE$$ 
    if ((RTFTE = 'C') or (RTFTE = 'K')) then
      if (VRRTFTE <> 0) then
        BEGIN
        if (RTFTE = 'C') then
            CTARTFTE = TCTARTFTE;
        EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTARTFTE, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, (:VRSUBT*-1), :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
            NROI = NROI + 1;
            SUMA = SUMA - VRRTFTE;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, (:VRSUBT*-1), :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA - VRRTFTE;
            END
         $$IBE$$*/ /* AUTORETENCION */ /*$$IBE$$ 
        if (FAUTORET <= fecaux) then
            BEGIN
            EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'CUENTA DE AUTORETENCION EN LA FUENTE') returning_values (CTARTFTE);
            EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTARTFTE, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :VRSUBT, :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                NROI = NROI + 1;
                SUMA = SUMA + VRRTFTE;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :VRSUBT, :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA + VRRTFTE;
                END
            END
        END  $$IBE$$*/ /* RTFTE */ /*$$IBE$$ 
    if (RTFTE = 'A') then
      BEGIN
      FOR SELECT MAX(COAR_CTARTFTEV), MAX(COAR_RTFTE), MIN(COAR_RTBASE), SUM(DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO), SUM((DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO)*COAR_RTFTE)
        FROM CONTABIL_ARTICULO C, devoluciones_ventas_detalle F
        WHERE F.devt_id = :IDDOC AND F.ARTI_COD = C.ARTI_COD AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
        GROUP BY COAR_CTARTFTEV
        INTO :CTARTFTE, :PRTFTE, :baseadic, :MONTO, :VRRTFTE
        DO
        BEGIN
        MONTO = MONTO * FACTOR;
        if (MONTO >= BASEADIC) then
            BEGIN
            VRRTFTE = VRRTFTE * FACTOR / 100;
            execute procedure redondee(VRRTFTE, DIG) returning_values (VRRTFTE);
            execute procedure redondee(MONTO, DIG) returning_values (MONTO);
            if (VRRTFTE <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTARTFTE, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, (:MONTO*-1), :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                    NROI = NROI + 1;
                    SUMA = SUMA - VRRTFTE;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, (:MONTO*-1), :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA - VRRTFTE;
                    END
                 $$IBE$$*/ /* AUTORETENCION */ /*$$IBE$$ 
                if (FAUTORET <= fecaux) then
                    BEGIN
                    EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'CUENTA DE AUTORETENCION EN LA FUENTE') returning_values (CTARTFTE);
                    EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTARTFTE, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
                    if (ERRORC <> 0) then
                        ERROR = ERROR + 1;
                    if (TIPOCUEN = 'C') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :MONTO, :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                        NROI = NROI + 1;
                        SUMA = SUMA + VRRTFTE;
                        END
                    if (TIPOCUEN = 'N') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :MONTO, :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NROI = NROI + 1;
                        SUMA = SUMA + VRRTFTE;
                        END
                    END
                END
            END
        END  $$IBE$$*/ /* RTFTE */ /*$$IBE$$ 
      END
     $$IBE$$*/ /* RETENCION IVA */ /*$$IBE$$ 
    if ((RTIVA = 'C') or (RTIVA = 'K')) then
      if (VRRTIVA <> 0) then
        BEGIN
        if (RTIVA = 'C') then
            CTARTIVA = TCTARTIVA;
        EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTARTIVA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTIVA, (:VRIVA*-1), :PORC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
            NROI = NROI + 1;
            SUMA = SUMA - VRRTIVA;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTIVA, (:VRIVA*-1), :PORC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA - VRRTIVA;
            END
        END  $$IBE$$*/ /* RTIVA */
    /* RETENCION DE ICA */ /*$$IBE$$ 
    if ((RTICA = 'C') or (RTICA = 'K')) then
      if (VRRTICA <> 0) then
        BEGIN
        if (RTICA = 'C') then
            CTARTICA = TCTARTICA;
        EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTARTICA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTICA, (:VRSUBT*-1), :PRTICA, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
            NROI = NROI + 1;
            SUMA = SUMA - VRRTICA;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTICA, (:VRSUBT*-1), :PRTICA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA - VRRTICA;
            END
        END  $$IBE$$*/ /* RTICA */
    /* CIERRE EL COMPROBANTE CONTRA LA CUENTA DEL TERCERO O LA CONSTANTE */ /*$$IBE$$ 
    if ((SUMA <> 0) and ((CARTERA = 'C') or (CARTERA = 'K') or (CARTERA = 'J'))) then
        BEGIN
        if (SUMA < 0) then
            BEGIN
            DEBITO = SUMA * -1;
            CREDITO = 0;
            END
        ELSE
            BEGIN
            DEBITO = 0;
            CREDITO = SUMA;
            END
        if (CARTERA = 'C') then
            CTACARTERA = TCTACLIEN;
        if (CARTERA = 'J') then
            BEGIN
             $$IBE$$*/ /* BUSQUE LA CUENTA DE LA CAJA */ /*$$IBE$$ 
            SELECT CAJA_CUENTA FROM CAJAS C, PUNTO_VENTA P
                WHERE P.CAJA_ID = C.CAJA_ID AND PTVT_ID = :PTOVTA
                INTO :CTACARTERA;
            END
        EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTACARTERA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :DEBITO, :CREDITO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
        if (TIPOCUEN = 'N') then
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :DEBITO, :CREDITO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
        NROI = NROI + 1;
        END  $$IBE$$*/ /* SUMA EN CARTERA */
    /* CALCULE COSTOS EN VENTAS */ /*$$IBE$$ 
    EXECUTE PROCEDURE COSTO_EN_VENTAS(33, :IDDOC);
    if (COSTOS = 'A') then
        BEGIN
        FOR SELECT MAX(CTACOS), SUM(cast(CANT as double precision) * COSTO)
            FROM COSTO_VENTAS
            GROUP BY CTACOS
            INTO :CTACOSTOS, :MONTO
        DO
            BEGIN
            if (MONTO <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTACOSTOS, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                     $$IBE$$*/ /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */ /*$$IBE$$ 
                    FOR SELECT ARTI_COD, cast(CANT as double precision) * COSTO
                        FROM COSTO_VENTAS
                        WHERE CTACOS = :CUENTA
                        INTO :ART, :MONTO
                    DO
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                    NROI = NROI + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    END
                END  $$IBE$$*/ /* MONTO <> 0 */ /*$$IBE$$ 
            END  $$IBE$$*/ /* FOR */ /*$$IBE$$ 
        END  $$IBE$$*/ /* COSTOS */ /*$$IBE$$ 
    if (COSTOS = 'K') then
        BEGIN
        SELECT SUM(cast(CANT as double precision) * COSTO)
            FROM COSTO_VENTAS
            INTO :MONTO;
        if (MONTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTACOSTOS, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'I') then
                BEGIN
                 $$IBE$$*/ /* ES UNA CUENTA DE INVENTARIO, REGISTRE UNO A UNO LOS ARTICULOS */ /*$$IBE$$ 
                FOR SELECT ARTI_COD, cast(CANT as double precision) * COSTO
                    FROM COSTO_VENTAS
                    INTO :ART, :MONTO
                DO
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTACOSTOS, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                    NROI = NROI + 1;
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTACOSTOS, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                NROI = NROI + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTACOSTOS, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                END
            END  $$IBE$$*/ /* MONTO <> 0 */ /*$$IBE$$ 
        END  $$IBE$$*/ /* COSTOS = K */ /*$$IBE$$ 
    if (INVEN = 'A') then
        BEGIN
        FOR SELECT MAX(CTAINV), SUM(cast(CANT as double precision) * COSTO)
            FROM COSTO_VENTAS
            GROUP BY CTAINV
            INTO :CTAINVEN, :MONTO
        DO
            BEGIN
            if (MONTO <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTAINVEN, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                     $$IBE$$*/ /* ES UNA CUENTA DE INVENTARIO, REGISTRE UNO A UNO LOS ARTICULOS */ /*$$IBE$$ 
                    FOR SELECT ARTI_COD, cast(CANT as double precision) * COSTO
                        FROM COSTO_VENTAS
                        WHERE CTAINV = :CUENTA
                        INTO :ART, :MONTO
                    DO
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                    NROI = NROI + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    END
                END  $$IBE$$*/ /* MONTO <> 0 */ /*$$IBE$$ 
            END  $$IBE$$*/ /* FOR */ /*$$IBE$$ 
        END  $$IBE$$*/ /* INVEN = A */ /*$$IBE$$ 
    if (INVEN = 'K') then
        BEGIN
        SELECT SUM(cast(CANT as double precision) * COSTO)
            FROM COSTO_VENTAS
            INTO :MONTO;
        if (MONTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTAINVEN, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'I') then
                BEGIN
                 $$IBE$$*/ /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */ /*$$IBE$$ 
                FOR SELECT ARTI_COD, cast(CANT as double precision) * COSTO
                    FROM COSTO_VENTAS
                    INTO :ART, :MONTO
                DO
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTAINVEN, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                    NROI = NROI + 1;
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAINVEN, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                NROI = NROI + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAINVEN, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                END
            END  $$IBE$$*/ /* MONTO <> 0 */ /*$$IBE$$ 
        END  $$IBE$$*/ /* INVEN = K */
    /* recorra las cuentas adicionales */ /*$$IBE$$ 
    FOR SELECT INVC_CUENTA, INVC_BASE, INVC_PORC, INVC_VALOR, INVC_DB
        FROM INTERFAZ_VENTAS_CTAS WHERE INVE_ID = :IDINTER
        INTO :CTADIC, :BASEADIC, :PORCADIC, :VALORADIC, :DBADIC
        DO
        BEGIN
        if (valoradic <> 0) then
            monto = valoradic;
        else
            BEGIN
            if (:BASEADIC = 'SUBTOTAL') then
                VALORADIC = vrsubt;
            if (:BASEADIC = 'DESCUENTO') then
                VALORADIC = VRDTO;
            if (:BASEADIC = 'IVA') then
                VALORADIC = VRIVA;
            if (:BASEADIC = 'ADICIONAL') then
                VALORADIC = VRADIC;
            if (:BASEADIC = 'EXTRA') then
                VALORADIC = VREXTRA;
            if (:BASEADIC = 'TOTAL') then
                VALORADIC = VRTOTAL;
            MONTO = VALORADIC * PORCADIC;
            END
        if (MONTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTADIC, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                if (DBADIC = 'S') then
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                ELSE
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                NROI = NROI + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                if (DBADIC = 'S') then
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                ELSE
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                END
            NROI = NROI + 1;
            END
        END
    if (error > 0) then
        ver = 'S';
    SUSPEND;
    END
   END  $$IBE$$*/ /* EXISTE LA INTERFAZ */ /*$$IBE$$ 
  ELSE
    BEGIN
    EXECUTE PROCEDURE ERROR (33, :IDDOC, :PREF, 1);
    ERROR = ERROR + 1;
    VER = 'S';
    SUSPEND;
    END
 $$IBE$$*/ SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE CONTABIL_FACTURA(
    IDDOC INTEGER,
    IDINTER INTEGER)
RETURNS (
    ERROR INTEGER,
    VER CHAR(1),
    IDC INTEGER)
AS
declare variable pref varchar(4);
declare variable num varchar(6);
declare variable numero varchar(10);
declare variable fecaux date;
declare variable fecha char(8);
declare variable conc varchar(60);
declare variable venceaux date;
declare variable vence char(8);
declare variable vrdto numeric(18,2);
declare variable vradic numeric(18,2);
declare variable vrsubt numeric(18,2);
declare variable vriva numeric(18,2);
declare variable prtfte numeric(9,2);
declare variable vrrtfte numeric(18,2);
declare variable vrrtiva numeric(18,2);
declare variable prtica numeric(9,2);
declare variable vrrtica numeric(18,2);
declare variable vrtotal numeric(18,2);
declare variable vrextra numeric(18,2);
declare variable tipocomp varchar(3);
declare variable prefcont varchar(4);
declare variable ventas char(1);
declare variable ctaventas varchar(20);
declare variable iva char(1);
declare variable ctaiva varchar(20);
declare variable consumo char(1);
declare variable ctaconsumo varchar(20);
declare variable cartera char(1);
declare variable ctacartera varchar(20);
declare variable rtfte char(1);
declare variable ctartfte varchar(20);
declare variable rtiva char(1);
declare variable ctartiva varchar(20);
declare variable rtica char(1);
declare variable ctartica varchar(20);
declare variable inven char(1);
declare variable ctainven varchar(20);
declare variable costos char(1);
declare variable ctacostos varchar(20);
declare variable ctadto varchar(20);
declare variable ctaadic varchar(20);
declare variable ctaextra varchar(20);
declare variable existe char(1);
declare variable cuenta varchar(20);
declare variable monto numeric(18,2);
declare variable tipocuen char(1);
declare variable nit varchar(20);
declare variable nombre varchar(60);
declare variable proy varchar(4);
declare variable centro varchar(4);
declare variable porc numeric(5,2);
declare variable debito numeric(18,2);
declare variable credito numeric(18,2);
declare variable nroi integer;
declare variable art varchar(15);
declare variable imptos numeric(18,2);
declare variable suma numeric(18,2);
declare variable porciva numeric(9,2);
declare variable tctaclien varchar(20);
declare variable tctaventa varchar(20);
declare variable tctartfte varchar(20);
declare variable tctartiva varchar(20);
declare variable tctartica varchar(20);
declare variable ctadic varchar(20);
declare variable baseadic varchar(20);
declare variable porcadic numeric(5,2);
declare variable valoradic numeric(18,2);
declare variable dbadic char(1);
declare variable ptovta integer;
declare variable anulado char(1);
declare variable dig integer;
declare variable mercancia numeric(18,2);
declare variable fomento varchar(2);
declare variable DTOXIT varchar(2);
declare variable vrconsumo numeric(18,2);
declare variable factor double precision;
declare variable cent char(1);
declare variable AUTORET VARCHAR(10);
declare variable FAUTORET DATE;
declare variable ERRORC INTEGER;
BEGIN /*$$IBE$$ 
EXECUTE PROCEDURE LEE_CONFIGURACION('COMPRAS', 'FACTURAS', 'USAR IMPOCONSUMO COMO PORCENTAJE DE FOMENTO') returning_values (FOMENTO);
EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'FECHA AUTORETENEDOR NO DESCONTAR RETENCIONES DEL SALDO PERO SI CONTABILIZARLAS') returning_values (AUTORET);
if (AUTORET <> '') then
    FAUTORET = CAST(AUTORET AS DATE);
else
    FAUTORET = '9999/12/31';
 $$IBE$$*/ /* BUSQUE LA INTERFACE */ /*$$IBE$$ 
EXISTE = 'N';
SELECT 'S', TICO_COD, PRCO_PRE, INVE_VENTAS, INVE_IVA, INVE_CONSUMO, INVE_CARTERA, INVE_RTFTE, INVE_RTIVA, INVE_RTICA, INVE_COSTO, INVE_INVEN, INVE_CTAVENTAS, INVE_CTAIVA, INVE_CTACONSUMO, INVE_CTADTO, INVE_CTAADIC, INVE_CTAEXTRA, INVE_CTACARTERA, INVE_CTARTFTE, INVE_CTARTIVA, INVE_CTARTICA, INVE_CTAINVEN, INVE_CTACOSTOS, INVE_CONFIRMAR, INVE_CENTRO
    FROM INTERFAZ_VENTAS
    WHERE INVE_ID = :IDINTER
    INTO :EXISTE, :TIPOCOMP, :PREFCONT, :VENTAS, :IVA, :CONSUMO, :CARTERA, :RTFTE, :RTIVA, :RTICA, :COSTOS, :INVEN, :CTAVENTAS, :CTAIVA, :CTACONSUMO, :CTADTO, :CTAADIC, :CTAEXTRA, :CTACARTERA, :CTARTFTE, :CTARTIVA, :CTARTICA, :CTAINVEN, :CTACOSTOS, :VER, :CENT;
if (EXISTE = 'S') then
  BEGIN
     $$IBE$$*/ /* BORRE CUALQUEIR CONTABILIZACION PREVIA */ /*$$IBE$$ 
    DELETE FROM CONTABILIZACION WHERE CNTB_TIPOREF = 31 AND CNTB_IDREF = :IDDOC;

   $$IBE$$*/ /* TRAIGA EL ENCABEZADO DE LA FACTURA */ /*$$IBE$$ 
  SELECT PREF_PRE, FACT_NUMERO, FACT_FECHA, F.TERC_NIT, PTVT_ID, FACT_VENCE, FACT_DTOMONTO, FACT_ADICIONAL, FACT_IVAMONTO, FACT_EXTRA, FACT_TOTAL, FACT_RTFTEPOR, FACT_RTFTEMONTO, FACT_RTIVAPOR, FACT_RTIVAMONTO, FACT_RTICAPOR, FACT_RTICAMONTO, FACT_NOMCLIENTE, TERC_CTARTFTE, TERC_CTARTIVA, TERC_CTARTICA, TERC_CTAVENTA, TERC_CTACLIENTE, FACT_ANULADO
        FROM FACTURAS F, TERCEROS T
        WHERE FACT_ID = :IDDOC AND F.TERC_NIT = T.TERC_NIT
        INTO :PREF, :NUM, :FECAUX, :NIT, :PTOVTA, :VENCEAUX, :VRDTO, :VRADIC, :VRIVA, :VREXTRA, :VRTOTAL, :PRTFTE, :VRRTFTE, :PORC, :VRRTIVA, :PRTICA, :VRRTICA, :NOMBRE, TCTARTFTE, TCTARTIVA, TCTARTICA, TCTAVENTA, TCTACLIEN, ANULADO;
  if (ANULADO = 'N') then
    BEGIN
     $$IBE$$*/ /* BUSQUE EL CENTRO DEL PUNTO, LA BODEGA, O EL PREFIJO  */ /*$$IBE$$ 
    IF (CENT = 'B') THEN
        SELECT B.BODE_CENTRO, B.BODE_PROY FROM BODEGA B, FACTURAS F
            WHERE B.BODE_COD = F.BODE_COD AND F.FACT_ID = :IDDOC INTO :CENTRO, :PROY;
    IF (CENT = 'V') THEN
        SELECT V.CENT_COD, V.PROY_COD FROM VENDEDORES V, FACTURAS F
            WHERE V.VEND_COD = F.VEND_COD AND F.FACT_ID = :IDDOC INTO :CENTRO, :PROY;
    IF (CENT = 'P') THEN
        SELECT P.PREF_CENTRO,P.PREF_PROY  FROM PREFIJOS P, FACTURAS F
            WHERE P.PREF_PRE = F.PREF_PRE AND F.FACT_ID = :IDDOC AND P.TIDO_COD = 31 INTO :CENTRO, :PROY;
    NUMERO = PREF || NUM;
    SELECT SUM (FADE_CONSUMO) FROM FACTURAS_DETALLE WHERE FACT_ID = :IDDOC  AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
        INTO MERCANCIA;
    VRSUBT = VRTOTAL - VREXTRA - VRIVA - MERCANCIA;  $$IBE$$*/ /* BASE DE RETEFTE Y RETEICA */ /*$$IBE$$ 

    EXECUTE PROCEDURE lee_configuracion ('FACTURACION', 'FACTURAS', 'DESCUENTO PIE FACTURA IGUAL A SUMA DE DESCUENTOS POR ITEM') returning_values (:DTOXIT);
    if (DTOXIT = 'SI') then
        VRDTO = 0;
    MERCANCIA = VRSUBT - VRADIC + VRDTO;
    EXECUTE PROCEDURE FECHA_A_CONTA(:FECAUX) returning_values (:FECHA);
    EXECUTE PROCEDURE FECHA_A_CONTA(:VENCEAUX) returning_values (:VENCE);
     $$IBE$$*/ /* REGISTRE EL ENCABEZADO CONTABLE */ /*$$IBE$$ 
    IDC = GEN_ID(ID_CONTABILIZA, 1);
    if (STRLEN(NOMBRE)> 43 ) then
      CONC = 'FV No.' || NUMERO || '-' || SUBSTR(NOMBRE,1,43);
    ELSE
      CONC = 'FV No.' || NUMERO || '-' || NOMBRE;
    INSERT INTO CONTABILIZACION (CNTB_ID, CNTB_TIPOCOMP, CNTB_PREFCNT, CNTB_NUMERO, CNTB_FECHA, CNTB_CONCEPTO, CNTB_REF, CNTB_TIPOREF, CNTB_IDREF, CNTB_PREFREF, CNTB_NUMREF, CNTB_PROCESADO)
        VALUES (:IDC, :TIPOCOMP, :PREFCONT, :NUM, :FECHA, :CONC, '', 31, :IDDOC, :PREF, :NUM, 'N');
    NROI = 0;
    SUMA = 0;
    ERROR = 0;
     $$IBE$$*/ /* SI NO HAY CUENTA DE DESCUENTO NI ADICIONAL CALCULE UN FACTOR PARA LAS VENTAS Y EL IVA */ /*$$IBE$$ 
    if (MERCANCIA <> 0) then
        FACTOR = CAST(VRSUBT AS DOUBLE PRECISION) / CAST(MERCANCIA AS DOUBLE PRECISION);
    ELSE
        FACTOR = 1;
     $$IBE$$*/ /* TRAIGA EL NUMERO DE DIGITOS PARA EL REDONDEO */ /*$$IBE$$ 
    SELECT CAST(CONF_VALOR AS INTEGER) FROM CONFIGURACION WHERE CONF_MODULO = 'FACTURACION' AND
        CONF_CATEGORIA = 'GENERAL' AND CONF_PROPIEDAD = 'REDONDEO AL MULTIPLO DE DIEZ EN TOTALES' INTO :DIG;
     $$IBE$$*/ /* CUENTAS DE VENTAS */ /*$$IBE$$ 
    if (VENTAS = 'A') then
        BEGIN
        FOR SELECT MAX(COAR_CTAVNT), SUM(FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), SUM(FADE_IVAMONTO), SUM(FADE_CONSUMO)
            FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_DETALLE F
            WHERE F.FACT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
            GROUP BY COAR_CTAVNT
            INTO :CTAVENTAS, :MONTO, :IMPTOS, :VRCONSUMO
            DO
            BEGIN
            if (FOMENTO = 'SI') then
                MONTO = MONTO + VRCONSUMO;
            if ((CTADTO IS NULL) OR (CTADTO = '')) then
                MONTO = MONTO * FACTOR;
            execute procedure redondee(MONTO, DIG) returning_values (MONTO);
            if (MONTO <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTAVENTAS, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                     $$IBE$$*/ /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */ /*$$IBE$$ 
                    FOR SELECT F.ARTI_COD, (FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), FADE_CONSUMO
                        FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_DETALLE F
                        WHERE F.FACT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTAINV = :CUENTA AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
                        INTO :ART, :MONTO, :IMPTOS
                    DO
                        BEGIN
                        if (FOMENTO = 'SI') then
                            MONTO = MONTO + IMPTOS;
                        if ((CTADTO IS NULL) OR (CTADTO = '')) then
                            MONTO = MONTO * FACTOR;
                        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                        if (MONTO <> 0) then
                            BEGIN
                            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                            NROI = NROI + 1;
                            SUMA = SUMA - MONTO;
                            END
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    NROI = NROI + 1;
                    SUMA = SUMA - MONTO;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA - MONTO;
                    END
                END  $$IBE$$*/ /* MONTO <> 0 */ /*$$IBE$$ 
            END  $$IBE$$*/ /* FOR */ /*$$IBE$$ 
        END  $$IBE$$*/ /* VENTAS X ARTICULO */ /*$$IBE$$ 
     IF ((VENTAS = 'C') OR (VENTAS = 'K')) THEN
        BEGIN
        IF (VENTAS = 'C') THEN
            CTAVENTAS = TCTAVENTA;
        SELECT SUM(FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), SUM(FADE_IVAMONTO), SUM (FADE_CONSUMO)
            FROM FACTURAS_DETALLE F
            WHERE F.FACT_ID = :IDDOC AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
            INTO :MONTO, :IMPTOS, :VRCONSUMO;
        if (FOMENTO = 'SI') then
            MONTO = MONTO + VRCONSUMO;
        if ((CTADTO IS NULL) OR (CTADTO = '')) then
            MONTO = MONTO * FACTOR;
        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
        if (MONTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTAVENTAS, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'I') then
                BEGIN
                 $$IBE$$*/ /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */ /*$$IBE$$ 
                FOR SELECT F.ARTI_COD, (FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), FADE_CONSUMO
                    FROM ARTICULO A, FACTURAS_DETALLE F
                    WHERE F.FACT_ID = :IDDOC AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
                    INTO :ART, :MONTO, :IMPTOS
                    DO
                    BEGIN
                    if (FOMENTO = 'SI') then
                        MONTO = MONTO + VRCONSUMO;
                    if ((CTADTO IS NULL) OR (CTADTO = '')) then
                        MONTO = MONTO * FACTOR;
                    execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                    if (MONTO <> 0) then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        SUMA = SUMA - MONTO;
                        END
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - MONTO;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - MONTO;
                END
            END  $$IBE$$*/ /* MONTO <> 0 */ /*$$IBE$$ 
        END  $$IBE$$*/ /* VENTAS DE CLIENTE O CONSTANTE */
    /* EL IVA EN VENTAS */ /*$$IBE$$ 
    if (IVA = 'A') then
        BEGIN
        FOR SELECT MAX(COAR_CTAIVAV), SUM(FADE_IVAMONTO), SUM(FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), sum(FADE_CONSUMO)
            FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_DETALLE F
            WHERE F.FACT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
            GROUP BY COAR_CTAIVAV
            INTO :CTAIVA, :IMPTOS, :MONTO, :VALORADIC
        DO
            BEGIN
            if (FOMENTO = 'SI') then
                MONTO = MONTO + VALORADIC;
            MONTO = MONTO * -1;
            MONTO = MONTO * FACTOR;
            IMPTOS = IMPTOS * FACTOR;
            execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
            execute procedure redondee(MONTO, DIG) returning_values (MONTO);
            if (IMPTOS <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTAIVA, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                     $$IBE$$*/ /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */ /*$$IBE$$ 
                    FOR SELECT F.ARTI_COD, FADE_IVAMONTO, (FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), TAIV_PORC, FADE_CONSUMO
                        FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_DETALLE F, TARIFA_IVA T
                        WHERE F.FACT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTAIVAV = :CUENTA AND A.TAIV_COD = T.TAIV_COD AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
                        INTO :ART, :IMPTOS, :MONTO, :PORCIVA, :VALORADIC
                    DO
                        BEGIN
                        if (FOMENTO = 'SI') then
                            MONTO = MONTO + VALORADIC;
                        MONTO = MONTO * -1;
                        MONTO = MONTO * FACTOR;
                        IMPTOS = IMPTOS * FACTOR;
                        execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                        if (IMPTOS <> 0) then
                            BEGIN
                            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, :MONTO, :PORCIVA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                            NROI = NROI + 1;
                            SUMA = SUMA + DEBITO - CREDITO;
                            END
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, :MONTO, ABS(:IMPTOS*100/:MONTO), :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    NROI = NROI + 1;
                    SUMA = SUMA - IMPTOS;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, :MONTO, ABS(:IMPTOS*100/:MONTO), :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA - IMPTOS;
                    END
                END    $$IBE$$*/ /* IMPTOS <> 0 */ /*$$IBE$$ 
            END  $$IBE$$*/ /* FOR */ /*$$IBE$$ 
        END  $$IBE$$*/ /* IVA X ARTICULO */ /*$$IBE$$ 
    if (IVA = 'K') then  $$IBE$$*/ /* IVA EN CTA CONSTANTE */ /*$$IBE$$ 
        BEGIN
        SELECT SUM(FADE_IVAMONTO), SUM(FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), SUM(FADE_CONSUMO)
            FROM FACTURAS_DETALLE F
            WHERE F.FACT_ID = :IDDOC and FADE_IVAMONTO <> 0 AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
            INTO :IMPTOS, :MONTO, :valoradic;
        if (FOMENTO = 'SI') then
            MONTO = MONTO + VALORADIC;
        MONTO = MONTO * -1;
        MONTO = MONTO * FACTOR;
        IMPTOS = IMPTOS * FACTOR;
        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
        execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
        if (IMPTOS <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTAIVA, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'I') then
                BEGIN
                 $$IBE$$*/ /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */ /*$$IBE$$ 
                FOR SELECT F.ARTI_COD, (FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), FADE_IVAMONTO, TAIV_PORC, FADE_CONSUMO
                    FROM ARTICULO A, FACTURAS_DETALLE F, TARIFA_IVA T
                    WHERE F.FACT_ID = :IDDOC AND A.TAIV_COD = T.TAIV_COD AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
                    INTO :ART, :MONTO, :IMPTOS, :PORCIVA, :VALORADIC
                    DO
                    BEGIN
                    if (FOMENTO = 'SI') then
                        MONTO = MONTO + VALORADIC;
                    MONTO = MONTO * -1;
                    MONTO = MONTO * FACTOR;
                    IMPTOS = IMPTOS * FACTOR;
                    execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                    execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                    if (IMPTOS <> 0) then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', 0, :IMPTOS, :MONTO, :PORCIVA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        SUMA = SUMA - IMPTOS;
                        END
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', 0, :IMPTOS, :MONTO, ABS(:IMPTOS*100/:MONTO), :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - IMPTOS;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', 0, :IMPTOS, :MONTO, ABS(:IMPTOS*100/:MONTO), :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - IMPTOS;
                END
            END  $$IBE$$*/ /* IMPTOS <> 0 */ /*$$IBE$$ 
        END  $$IBE$$*/ /* IVA EN CTA CONSTANTE */
    /* EL IMPOCONSUMO */ /*$$IBE$$ 
    if ((CONSUMO = 'A') AND (FOMENTO <> 'SI')) then
        BEGIN
        FOR SELECT MAX(COAR_CTACONS), SUM(FADE_CONSUMO)
            FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_DETALLE F
            WHERE F.FACT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
            GROUP BY COAR_CTACONS
            INTO :CTACONSUMO, :IMPTOS
        DO
            BEGIN
            execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
            if (IMPTOS <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTACONSUMO, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                     $$IBE$$*/ /* ES UNA CUENTA DE INVENTARIO, REGISTRE UNO A UNO LOS ARTICULOS */ /*$$IBE$$ 
                    FOR SELECT F.ARTI_COD, FADE_CONSUMO
                        FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_DETALLE F
                        WHERE F.FACT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTACONS = :CUENTA AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
                        INTO :ART, :IMPTOS
                    DO
                        BEGIN
                        execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                        if (IMPTOS <> 0) then
                            BEGIN
                            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                            NROI = NROI + 1;
                            SUMA = SUMA - IMPTOS;
                            END
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    NROI = NROI + 1;
                    SUMA = SUMA - IMPTOS;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA - IMPTOS;
                    END
                END  $$IBE$$*/ /* IMPTOS <> 0 */ /*$$IBE$$ 
            END  $$IBE$$*/ /* FOR */ /*$$IBE$$ 
        END  $$IBE$$*/ /* CONSUMO X ARTICULO */ /*$$IBE$$ 
    if ((CONSUMO = 'K') AND (FOMENTO <> 'SI')) then  $$IBE$$*/ /* CONSUMO EN CTA CONSTANTE */ /*$$IBE$$ 
        BEGIN
        SELECT SUM(FADE_CONSUMO)
            FROM FACTURAS_DETALLE F
            WHERE F.FACT_ID = :IDDOC AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
            INTO :IMPTOS;
        execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
        if (IMPTOS <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTACONSUMO, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'I') then
                BEGIN
                 $$IBE$$*/ /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */ /*$$IBE$$ 
                FOR SELECT F.ARTI_COD, FADE_CONSUMO
                    FROM ARTICULO A, FACTURAS_DETALLE F
                    WHERE F.FACT_ID = :IDDOC AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
                    INTO :ART, :IMPTOS
                    DO
                    BEGIN
                    execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                    if (IMPTOS <> 0) then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CTACONSUMO, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        SUMA = SUMA - IMPTOS;
                        END
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTACONSUMO, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - IMPTOS;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTACONSUMO, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - IMPTOS;
                END
            END  $$IBE$$*/ /* IMPTOS <> 0 */ /*$$IBE$$ 
        END  $$IBE$$*/ /* CONSUMO EN CTA CONSTANTE */
    /* DESCUENTO */ /*$$IBE$$ 
    if ((CTADTO IS NOT NULL) AND (CTADTO <> '')) then
        BEGIN
        execute procedure redondee(VRDTO, DIG) returning_values (VRDTO);
        if (VRDTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTADTO, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRDTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA + VRDTO;
                END
            if (TIPOCUEN = 'N') then
                    BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRDTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA + VRDTO;
                END
            END
        END  $$IBE$$*/ /* DESCUENTO */
    /* VALOR ADIC */ /*$$IBE$$ 
    if ((CTAADIC IS NOT NULL) AND (CTAADIC <> '')) then
        BEGIN
        execute procedure redondee(VRADIC, DIG) returning_values (VRADIC);
        if (VRADIC <> 0) THEN
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTAADIC, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRADIC, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - VRADIC;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRADIC, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - VRADIC;
                END
            END
        END  $$IBE$$*/ /* VR. ADIC */
    /* VALOR EXTRA */ /*$$IBE$$ 
    if ((CTAEXTRA IS NOT NULL) AND (CTAEXTRA <> '')) THEN
        BEGIN
        execute procedure redondee(VREXTRA, DIG) returning_values (VREXTRA);
        if (VREXTRA <> 0) THEN
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTAEXTRA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VREXTRA, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - VREXTRA;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VREXTRA, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - VREXTRA;
                END
            END
        END  $$IBE$$*/ /* VR. EXTRA */
    /* DESCUENTE EL IMPOCONSUMO */ /*$$IBE$$ 
    SELECT SUM(FADE_CONSUMO)
        FROM FACTURAS_DETALLE F WHERE F.FACT_ID = :IDDOC AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL)) INTO :IMPTOS;
    vrsubt = vrsubt - IMPTOS;
     $$IBE$$*/ /* RETENCION FUENTE */ /*$$IBE$$ 
    if ((RTFTE = 'C') or (RTFTE = 'K')) then
      BEGIN
      execute procedure redondee(VRRTFTE, DIG) returning_values (VRRTFTE);
      if (VRRTFTE <> 0) then
        BEGIN
        if (RTFTE = 'C') then
            CTARTFTE = TCTARTFTE;
        EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTARTFTE, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :VRSUBT, :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTFTE;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :VRSUBT, :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTFTE;
            END
         $$IBE$$*/ /* AUTORETENCION */ /*$$IBE$$ 
        if (FAUTORET <= fecaux) then
            BEGIN
            EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'CUENTA DE AUTORETENCION EN LA FUENTE') returning_values (CTARTFTE);
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTARTFTE INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERROR (31, :IDDOC, :CTARTFTE, 2);
                CUENTA = CTARTFTE;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                begin
                EXECUTE PROCEDURE ERROR (31, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, (:VRSUBT*-1), :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - VRRTFTE;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, (:VRSUBT*-1), :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - VRRTFTE;
                END
            END
        END  $$IBE$$*/ /* RTFTE */ /*$$IBE$$ 
      END
    if (RTFTE = 'A') then
      BEGIN
      FOR SELECT MAX(COAR_CTARTFTEV), MAX(COAR_RTFTE), MIN(COAR_RTBASE), SUM(FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), SUM((FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO)*COAR_RTFTE)
        FROM CONTABIL_ARTICULO C, FACTURAS_DETALLE F
        WHERE F.FACT_ID = :IDDOC AND F.ARTI_COD = C.ARTI_COD AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
        GROUP BY COAR_CTARTFTEV
        INTO :CTARTFTE, :PRTFTE, :baseadic, :MONTO, :VRRTFTE
        DO
        BEGIN
        MONTO = MONTO * FACTOR;
        if (MONTO >= BASEADIC) then
            BEGIN
            VRRTFTE = VRRTFTE * FACTOR / 100;
            execute procedure redondee(VRRTFTE, DIG) returning_values (VRRTFTE);
            execute procedure redondee(MONTO, DIG) returning_values (MONTO);
            if (VRRTFTE <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTARTFTE, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :MONTO, :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    NROI = NROI + 1;
                    SUMA = SUMA + VRRTFTE;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :MONTO, :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA + VRRTFTE;
                    END
                 $$IBE$$*/ /* AUTORETENCION */ /*$$IBE$$ 
                if (FAUTORET <= fecaux) then
                    BEGIN
                    EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'CUENTA DE AUTORETENCION EN LA FUENTE') returning_values (CTARTFTE);
                    EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTARTFTE, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
                    if (ERRORC <> 0) then
                        ERROR = ERROR + 1;
                    if (TIPOCUEN = 'C') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, (:MONTO*-1), :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                        NROI = NROI + 1;
                        SUMA = SUMA - VRRTFTE;
                        END
                    if (TIPOCUEN = 'N') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, (:MONTO*-1), :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NROI = NROI + 1;
                        SUMA = SUMA - VRRTFTE;
                        END
                    END
                END
            END
        END  $$IBE$$*/ /* RTFTE */ /*$$IBE$$ 
      END
     $$IBE$$*/ /* RETENCION IVA */ /*$$IBE$$ 
    if ((RTIVA = 'C') or (RTIVA = 'K')) then
      BEGIN
      execute procedure redondee(VRRTIVA, DIG) returning_values (VRRTIVA);
      if (VRRTIVA <> 0) then
        BEGIN
        if (RTIVA = 'C') then
            CTARTIVA = TCTARTIVA;
        EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTARTIVA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTIVA, 0, :VRIVA, :PORC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTIVA;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTIVA, 0, :VRIVA, :PORC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTIVA;
            END
        END  $$IBE$$*/ /* RTIVA */ /*$$IBE$$ 
      END
     $$IBE$$*/ /* RETENCION DE ICA */ /*$$IBE$$ 
    if ((RTICA = 'C') or (RTICA = 'K')) then
      BEGIN
      execute procedure redondee(VRRTICA, DIG) returning_values (VRRTICA);
      if (VRRTICA <> 0) then
        BEGIN
        if (RTICA = 'C') then
            CTARTICA = TCTARTICA;
        EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTARTICA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTICA, 0, :VRSUBT, :PRTICA, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTICA;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTICA, 0, :VRSUBT, :PRTICA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTICA;
            END
        END  $$IBE$$*/ /* RTICA */ /*$$IBE$$ 
      END
     $$IBE$$*/ /* CIERRE EL COMPROBANTE CONTRA LA CUENTA DEL TERCERO O LA CONSTANTE */ /*$$IBE$$ 
    if ((SUMA <> 0) and ((CARTERA = 'C') or (CARTERA = 'K') or (CARTERA = 'J'))) then
        BEGIN
        if (SUMA < 0) then
            BEGIN
            DEBITO = SUMA * -1;
            CREDITO = 0;
            END
        ELSE
            BEGIN
            DEBITO = 0;
            CREDITO = SUMA;
            END
        if (CARTERA = 'C') then
            CTACARTERA = TCTACLIEN;
        if (CARTERA = 'J') then
            BEGIN
             $$IBE$$*/ /* BUSQUE LA CUENTA DE LA CAJA */ /*$$IBE$$ 
            SELECT CAJA_CUENTA FROM CAJAS C, PUNTO_VENTA P
                WHERE P.CAJA_ID = C.CAJA_ID AND PTVT_ID = :PTOVTA
                INTO :CTACARTERA;
            END
        EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTACARTERA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :DEBITO, :CREDITO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
        if (TIPOCUEN = 'N') then
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :DEBITO, :CREDITO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
        NROI = NROI + 1;
        END  $$IBE$$*/ /* SUMA EN CARTERA */
    /* CALCULE COSTOS EN VENTAS */ /*$$IBE$$ 
    EXECUTE PROCEDURE COSTO_EN_VENTAS(31, :IDDOC);
    if (COSTOS = 'A') then
        BEGIN
        FOR SELECT MAX(CTACOS), SUM(CAST(CANT AS DOUBLE PRECISION) * COSTO)
            FROM COSTO_VENTAS
            GROUP BY CTACOS
            INTO :CTACOSTOS, :MONTO
        DO
            BEGIN
            if (MONTO <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTACOSTOS, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                     $$IBE$$*/ /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */ /*$$IBE$$ 
                    FOR SELECT ARTI_COD, CANT * COSTO
                        FROM COSTO_VENTAS
                        WHERE CTACOS = :CUENTA
                        INTO :ART, :MONTO
                    DO
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    NROI = NROI + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    END
                END  $$IBE$$*/ /* MONTO <> 0 */ /*$$IBE$$ 
            END  $$IBE$$*/ /* FOR */ /*$$IBE$$ 
        END  $$IBE$$*/ /* COSTOS */ /*$$IBE$$ 
    if (COSTOS = 'K') then
        BEGIN
        SELECT SUM(CAST(CANT AS DOUBLE PRECISION) * COSTO)
            FROM COSTO_VENTAS
            INTO :MONTO;
        if (MONTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTACOSTOS, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'I') then
                BEGIN
                 $$IBE$$*/ /* ES UNA CUENTA DE INVENTARIO, REGISTRE UNO A UNO LOS ARTICULOS */ /*$$IBE$$ 
                FOR SELECT ARTI_COD, CANT * COSTO
                    FROM COSTO_VENTAS
                    INTO :ART, :MONTO
                DO
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTACOSTOS, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                    NROI = NROI + 1;
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTACOSTOS, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTACOSTOS, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                END
            END  $$IBE$$*/ /* MONTO <> 0 */ /*$$IBE$$ 
        END  $$IBE$$*/ /* COSTOS = K */ /*$$IBE$$ 
    if (INVEN = 'A') then
        BEGIN
        FOR SELECT MAX(CTAINV), SUM(CAST(CANT AS DOUBLE PRECISION) * COSTO)
            FROM COSTO_VENTAS
            GROUP BY CTAINV
            INTO :CTAINVEN, :MONTO
        DO
            BEGIN
            if (MONTO <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTAINVEN, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                     $$IBE$$*/ /* ES UNA CUENTA DE INVENTARIO, REGISTRE UNO A UNO LOS ARTICULOS */ /*$$IBE$$ 
                    FOR SELECT ARTI_COD, CANT * COSTO
                        FROM COSTO_VENTAS
                        WHERE CTAINV = :CUENTA
                        INTO :ART, :MONTO
                    DO
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    NROI = NROI + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    END
                END  $$IBE$$*/ /* MONTO <> 0 */ /*$$IBE$$ 
            END  $$IBE$$*/ /* FOR */ /*$$IBE$$ 
        END  $$IBE$$*/ /* INVEN = A */ /*$$IBE$$ 
    if (INVEN = 'K') then
        BEGIN
        SELECT SUM(CAST(CANT AS DOUBLE PRECISION) * COSTO)
            FROM COSTO_VENTAS
            INTO :MONTO;
        if (MONTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTAINVEN, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'I') then
                BEGIN
                 $$IBE$$*/ /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */ /*$$IBE$$ 
                FOR SELECT ARTI_COD, CANT * COSTO
                    FROM COSTO_VENTAS
                    INTO :ART, :MONTO
                DO
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTAINVEN, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                    NROI = NROI + 1;
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAINVEN, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAINVEN, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                END
            END  $$IBE$$*/ /* MONTO <> 0 */ /*$$IBE$$ 
        END  $$IBE$$*/ /* INVEN = K */
    /* recorra las cuentas adicionales */ /*$$IBE$$ 
    FOR SELECT INVC_CUENTA, INVC_BASE, INVC_PORC, INVC_VALOR, INVC_DB
        FROM INTERFAZ_VENTAS_CTAS
        WHERE INVE_ID = :IDINTER
        INTO :CTADIC, :BASEADIC, :PORCADIC, :VALORADIC, :DBADIC
        DO
        BEGIN
        if (VALORADIC <> 0) then
            MONTO = VALORADIC;
        ELSE
            BEGIN
            if (:BASEADIC = 'SUBTOTAL') then
                VALORADIC = vrsubt;
            if (:BASEADIC = 'DESCUENTO') then
                VALORADIC = VRDTO;
            if (:BASEADIC = 'IVA') then
                VALORADIC = VRIVA;
            if (:BASEADIC = 'ADICIONAL') then
                VALORADIC = VRADIC;
            if (:BASEADIC = 'EXTRA') then
                VALORADIC = VREXTRA;
            if (:BASEADIC = 'TOTAL') then
                VALORADIC = VRTOTAL;
            MONTO = VALORADIC * PORCADIC / 100;
            END
        if (MONTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTADIC, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                if (DBADIC = 'S') then
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                ELSE
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                if (DBADIC = 'S') then
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                ELSE
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                END
            NROI = NROI + 1;
            END
        END
    if (ERROR > 0) then
        VER = 'S';
    SUSPEND;
    END  $$IBE$$*/ /* NO ANULADO */ /*$$IBE$$ 
  END  $$IBE$$*/ /* EXISTE LA INTERFAZ */ /*$$IBE$$ 
ELSE
    BEGIN
    EXECUTE PROCEDURE ERROR (31, :IDDOC, :PREF, 1);
    ERROR = ERROR + 1;
    VER = 'S';
    SUSPEND;
    END
 $$IBE$$*/ SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

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

SET TERM ; ^

SET TERM ^ ;

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

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE DEVOLUCIONES_SIN_CONTABILIDAD(
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    ID INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    ESTADO VARCHAR(20),
    IDI INTEGER,
    IDC INTEGER)
AS
DECLARE VARIABLE VER CHAR(2);
declare variable FECICNT VARCHAR(10);
declare variable FECFCNT VARCHAR(10);
declare variable ERROR INTEGER;
declare variable idref INTEGER;
BEGIN /*$$IBE$$ 
EXECUTE PROCEDURE fecha_a_conta(FECINI) returning_values (FECICNT);
EXECUTE PROCEDURE fecha_a_conta(FECFIN) returning_values (FECFCNT);
FOR SELECT DEVT_ID, PREF_PRE, DEVT_NUMERO FROM devoluciones_ventas WHERE DEVT_ANULADO = 'N' AND
    DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN
    INTO :ID, :PREF, :NUMERO
DO
  BEGIN
  idref = null;
  SELECT ENCO_IDREF FROM COMPROBANTE_ENCABEZADO WHERE ENCO_TIPOREF = 33 AND ENCO_FECHA >= :FECICNT AND ENCO_FECHA <= :FECFCNT and ENCO_IDREF = :id into :idref;
  if (idref IS NULL) then
  begin
   ESTADO = 'PROCESANDO';
   SUSPEND;
   SELECT MAX(INVE_ID) FROM INTERFAZ_VENTAS WHERE PREF_PRE = :PREF AND TIDO_COD = 33 INTO :IDI;
   EXECUTE PROCEDURE contabil_devolcli (:ID, :IDI) RETURNING_VALUES (:ERROR, :VER, :IDC);
   if (ERROR = 0) then
    BEGIN
    EXECUTE PROCEDURE CONTABILIZA_PENDIENTE (:IDC);
    ESTADO = 'OK';
    END
   ELSE
    ESTADO = 'ERROR';
   suspend;
  End
  END
 $$IBE$$*/ SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE FACTURAS_SIN_CONTABILIDAD(
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    ID INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    ESTADO VARCHAR(20),
    IDI INTEGER,
    IDC INTEGER)
AS
DECLARE VARIABLE VER CHAR(2);
declare variable FECICNT VARCHAR(10);
declare variable FECFCNT VARCHAR(10);
declare variable ERROR INTEGER;
declare variable idref INTEGER;
BEGIN /*$$IBE$$ 
EXECUTE PROCEDURE fecha_a_conta(FECINI) returning_values (FECICNT);
EXECUTE PROCEDURE fecha_a_conta(FECFIN) returning_values (FECFCNT);
FOR SELECT FACT_ID, PREF_PRE, FACT_NUMERO FROM FACTURAS WHERE FACT_ANULADO = 'N' AND
    FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN INTO :ID, :PREF, :NUMERO
DO
  BEGIN
  idref = null;
  SELECT ENCO_IDREF FROM COMPROBANTE_ENCABEZADO WHERE ENCO_TIPOREF = 31 AND ENCO_FECHA >= :FECICNT AND ENCO_FECHA <= :FECFCNT and ENCO_IDREF = :ID into :idref;
  if (idref IS NULL) then
  begin
   ESTADO = 'PROCESANDO';
   ERROR = NULL;
   SUSPEND;
   SELECT MAX(INVE_ID) FROM INTERFAZ_VENTAS WHERE PREF_PRE = :PREF AND TIDO_COD = 31 INTO :IDI;
   EXECUTE PROCEDURE CONTABIL_FACTURA (:ID, :IDI) RETURNING_VALUES (:ERROR, VER, :IDC);
   if ((ERROR = 0) or (error IS NULL)) then
    BEGIN
    EXECUTE PROCEDURE CONTABILIZA_PENDIENTE (:IDC);
    ESTADO = 'OK';
    END
   ELSE
    ESTADO = 'ERROR';
   suspend;
  end
  END
 $$IBE$$*/ SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE CONTABILICE_COSTO_VENTAS(
    ID INTEGER,
    IDINTER INTEGER)
RETURNS (
    IDC INTEGER)
AS
declare variable PREF VARCHAR(4);
declare variable NUM VARCHAR(6);
declare variable NUMERO VARCHAR(10);
declare variable INVEN CHAR(1);
declare variable CTAINVEN VARCHAR(20);
declare variable COSTOS CHAR(1);
declare variable CTACOSTOS VARCHAR(20);
declare variable EXISTE CHAR(1);
declare variable CUENTA VARCHAR(20);
declare variable MONTO NUMERIC(18,2);
declare variable TIPOCUEN CHAR(1);
declare variable NIT VARCHAR(20);
declare variable PROY VARCHAR(4);
declare variable CENTRO VARCHAR(4);
declare variable ART VARCHAR(15);
declare variable ANULADO CHAR(1);
declare variable NROI INTEGER;
declare variable NUMROWS INTEGER;
declare variable CONC CHAR(120);
declare variable VENCEAUX DATE;
declare variable VENCE CHAR(8);
begin
/* TRAIGA EL ID DEL ENCABEZADO DEL COMPROBANTE CONTABLE */
SELECT ENCO_CONSEC FROM COMPROBANTE_ENCABEZADO WHERE ENCO_TIPOREF = 31 AND ENCO_IDREF = :ID INTO :IDC;
SELECT MAX(CODE_ITEM) FROM COMPROBANTE_DETALLE WHERE ENCO_CONSEC = :idc INTO :NROI;
NROI = NROI + 1;
/* EJECUTE LA PARTE DE CONTABIL_FACTURA QUE CORRESPONDE A LOS COSTOS */
EXISTE = 'N';
SELECT 'S', INVE_COSTO, INVE_INVEN, INVE_CTAINVEN, INVE_CTACOSTOS
    FROM INTERFAZ_VENTAS
    WHERE INVE_ID = :IDINTER
    INTO :EXISTE, :COSTOS, :INVEN, :CTAINVEN, :CTACOSTOS;
if (EXISTE = 'S') then
  BEGIN
  SELECT FACT_ANULADO, PREF_PRE, FACT_NUMERO, FACT_VENCE, TERC_NIT FROM FACTURAS F
        WHERE FACT_ID = :ID INTO :ANULADO, :PREF, :NUMERO, :VENCEAUX, :NIT;
  NUMERO = PREF || NUM;
  CONC = 'COSTO EN VENTAS FACTURA ' || :NUMERO;
  EXECUTE PROCEDURE FECHA_A_CONTA(:VENCEAUX) returning_values (:VENCE);
  if (ANULADO = 'N') then
    BEGIN
    SELECT BODE_CENTRO, BODE_PROY FROM BODEGA B, FACTURAS F, PUNTO_VENTA P
        WHERE B.BODE_COD = P.BODE_COD AND P.PTVT_ID = F.PTVT_ID AND F.FACT_ID = :ID INTO :CENTRO, :PROY;
    /* SE ASUME QUE NO HAN CAMBIADO LAS CUENTAS DE COSTOS, POR ESO SE HACE UPDATE A LOS MOVIMIENTOS DE ESAS CUENTAS */
    EXECUTE PROCEDURE COSTO_EN_VENTAS(31, :ID);
    if (COSTOS = 'A') then
        BEGIN
        FOR SELECT MAX(CTACOS), SUM(CANT * COSTO)
            FROM COSTO_VENTAS
            GROUP BY CTACOS
            INTO :CTACOSTOS, :MONTO
        DO
            BEGIN
            if (MONTO <> 0) then
                BEGIN
                CUENTA = NULL;
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :CTACOSTOS INTO :CUENTA, :TIPOCUEN;
                IF (CUENTA IS NULL) THEN
                    begin
                    EXCEPTION CUENTA_NO_EXISTE 'La cuenta ' || :ctacostos || ' no existe.';
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT ARTI_COD, CANT * COSTO
                        FROM COSTO_VENTAS
                        WHERE CTACOS = :CUENTA
                        INTO :ART, :MONTO
                    DO
                        BEGIN
                        SELECT COUNT(*) FROM COMPROBANTE_DETALLE WHERE CUEN_COD = :CUENTA AND ENCO_CONSEC = :IDC AND ARTI_COD = :ART INTO :NUMROWS;
                        if (NUMROWS = 0) then
                            BEGIN
                            INSERT INTO comprobante_detalle (ENCO_CONSEC, CODE_ITEM, CUEN_COD, CODE_CONCEPTO, CODE_REFER, CODE_DEBITO, CODE_CREDITO, CODE_BASE, CODE_PORC, TERC_NIT, PROY_COD, CENT_COD, CNDE_DOCNUMERO, CNDE_DOCAPLICA, DOCO_VENCE, ARTI_COD, CODE_TIPOAPL, CODE_TIPONUE)
                                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                            NROI = NROI + 1;
                            END
                        ELSE
                            UPDATE COMPROBANTE_DETALLE
                                SET CODE_DEBITO = :MONTO
                            WHERE CUEN_COD = :CUENTA AND ENCO_CONSEC = :IDC AND ARTI_COD = :ART;
                        END
                    END
                ELSE
                    BEGIN
                    SELECT COUNT(*) FROM COMPROBANTE_DETALLE WHERE CUEN_COD = :CUENTA AND ENCO_CONSEC = :IDC INTO :NUMROWS;
                    if (NUMROWS = 0) then
                        BEGIN
                        if (TIPOCUEN = 'C') then
                            INSERT INTO comprobante_detalle (ENCO_CONSEC, CODE_ITEM, CUEN_COD, CODE_CONCEPTO, CODE_REFER, CODE_DEBITO, CODE_CREDITO, CODE_BASE, CODE_PORC, TERC_NIT, PROY_COD, CENT_COD, CNDE_DOCNUMERO, CNDE_DOCAPLICA, DOCO_VENCE, ARTI_COD, CODE_TIPOAPL, CODE_TIPONUE)
                                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                        ELSE
                            INSERT INTO comprobante_detalle (ENCO_CONSEC, CODE_ITEM, CUEN_COD, CODE_CONCEPTO, CODE_REFER, CODE_DEBITO, CODE_CREDITO, CODE_BASE, CODE_PORC, TERC_NIT, PROY_COD, CENT_COD, CNDE_DOCNUMERO, CNDE_DOCAPLICA, DOCO_VENCE, ARTI_COD, CODE_TIPOAPL, CODE_TIPONUE)
                                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NROI = NROI + 1;
                        END
                    ELSE
                        UPDATE COMPROBANTE_DETALLE
                            SET CODE_DEBITO = :MONTO
                        WHERE CUEN_COD = :CUENTA AND ENCO_CONSEC = :IDC;
                    END
                END /* MONTO <> 0 */
            END /* FOR */
        END /* COSTOS */
    if (COSTOS = 'K') then
        BEGIN
        SELECT SUM(CANT * COSTO)
            FROM COSTO_VENTAS
            INTO :MONTO;
        if (MONTO <> 0) then
            BEGIN
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTACOSTOS INTO :CUENTA, :TIPOCUEN;
            IF (CUENTA IS NULL) THEN
                begin
                EXCEPTION CUENTA_NO_EXISTE 'La cuenta ' || :ctacostos || ' no existe.';
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, REGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT ARTI_COD, CANT * COSTO
                    FROM COSTO_VENTAS
                    INTO :ART, :MONTO
                DO
                    BEGIN
                    SELECT COUNT(*) FROM COMPROBANTE_DETALLE WHERE CUEN_COD = :CUENTA AND ENCO_CONSEC = :IDC AND ARTI_COD = :ART INTO :NUMROWS;
                    if (NUMROWS = 0) then
                        BEGIN
                            INSERT INTO comprobante_detalle (ENCO_CONSEC, CODE_ITEM, CUEN_COD, CODE_CONCEPTO, CODE_REFER, CODE_DEBITO, CODE_CREDITO, CODE_BASE, CODE_PORC, TERC_NIT, PROY_COD, CENT_COD, CNDE_DOCNUMERO, CNDE_DOCAPLICA, DOCO_VENCE, ARTI_COD, CODE_TIPOAPL, CODE_TIPONUE)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        END
                    ELSE
                        UPDATE COMPROBANTE_DETALLE
                            SET CODE_DEBITO = :MONTO
                        WHERE CUEN_COD = :CUENTA AND ENCO_CONSEC = :IDC AND ARTI_COD = :ART;
                    END
                END
            ELSE
                BEGIN
                SELECT COUNT(*) FROM COMPROBANTE_DETALLE WHERE CUEN_COD = :CUENTA AND ENCO_CONSEC = :IDC INTO :NUMROWS;
                if (NUMROWS = 0) then
                    BEGIN
                    if (TIPOCUEN = 'C') then
                        INSERT INTO comprobante_detalle (ENCO_CONSEC, CODE_ITEM, CUEN_COD, CODE_CONCEPTO, CODE_REFER, CODE_DEBITO, CODE_CREDITO, CODE_BASE, CODE_PORC, TERC_NIT, PROY_COD, CENT_COD, CNDE_DOCNUMERO, CNDE_DOCAPLICA, DOCO_VENCE, ARTI_COD, CODE_TIPOAPL, CODE_TIPONUE)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    ELSE
                        INSERT INTO comprobante_detalle (ENCO_CONSEC, CODE_ITEM, CUEN_COD, CODE_CONCEPTO, CODE_REFER, CODE_DEBITO, CODE_CREDITO, CODE_BASE, CODE_PORC, TERC_NIT, PROY_COD, CENT_COD, CNDE_DOCNUMERO, CNDE_DOCAPLICA, DOCO_VENCE, ARTI_COD, CODE_TIPOAPL, CODE_TIPONUE)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    END
                ELSE
                    UPDATE COMPROBANTE_DETALLE
                        SET CODE_DEBITO = :MONTO
                    WHERE CUEN_COD = :CUENTA AND ENCO_CONSEC = :IDC;
                END
            END /* MONTO <> 0 */
        END /* COSTOS = K */
    if (INVEN = 'A') then
        BEGIN
        FOR SELECT MAX(CTAINV), SUM(CANT * COSTO)
            FROM COSTO_VENTAS
            GROUP BY CTAINV
            INTO :CTAINVEN, :MONTO
        DO
            BEGIN
            if (MONTO <> 0) then
                BEGIN
                CUENTA = NULL;
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :CTAINVEN INTO :CUENTA, :TIPOCUEN;
                IF (CUENTA IS NULL) THEN
                    begin
                    EXCEPTION CUENTA_NO_EXISTE 'La cuenta ' || :ctainven || ' no existe.';
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, REGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT ARTI_COD, CANT * COSTO
                        FROM COSTO_VENTAS
                        WHERE CTAINV = :CUENTA
                        INTO :ART, :MONTO
                    DO
                        BEGIN
                        SELECT COUNT(*) FROM COMPROBANTE_DETALLE WHERE CUEN_COD = :CUENTA AND ENCO_CONSEC = :IDC AND ARTI_COD = :ART INTO :NUMROWS;
                        if (NUMROWS = 0) then
                            BEGIN
                            INSERT INTO comprobante_detalle (ENCO_CONSEC, CODE_ITEM, CUEN_COD, CODE_CONCEPTO, CODE_REFER, CODE_DEBITO, CODE_CREDITO, CODE_BASE, CODE_PORC, TERC_NIT, PROY_COD, CENT_COD, CNDE_DOCNUMERO, CNDE_DOCAPLICA, DOCO_VENCE, ARTI_COD, CODE_TIPOAPL, CODE_TIPONUE)
                                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                            NROI = NROI + 1;
                            END
                        ELSE
                            UPDATE COMPROBANTE_DETALLE
                                SET CODE_CREDITO = :MONTO
                            WHERE CUEN_COD = :CUENTA AND ENCO_CONSEC = :IDC AND ARTI_COD = :ART;
                        END
                    END
                ELSE
                    BEGIN
                    SELECT COUNT(*) FROM COMPROBANTE_DETALLE WHERE CUEN_COD = :CUENTA AND ENCO_CONSEC = :IDC INTO :NUMROWS;
                    if (NUMROWS = 0) then
                        BEGIN
                        if (TIPOCUEN = 'C') then
                            INSERT INTO comprobante_detalle (ENCO_CONSEC, CODE_ITEM, CUEN_COD, CODE_CONCEPTO, CODE_REFER, CODE_DEBITO, CODE_CREDITO, CODE_BASE, CODE_PORC, TERC_NIT, PROY_COD, CENT_COD, CNDE_DOCNUMERO, CNDE_DOCAPLICA, DOCO_VENCE, ARTI_COD, CODE_TIPOAPL, CODE_TIPONUE)
                                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                        ELSE
                            INSERT INTO comprobante_detalle (ENCO_CONSEC, CODE_ITEM, CUEN_COD, CODE_CONCEPTO, CODE_REFER, CODE_DEBITO, CODE_CREDITO, CODE_BASE, CODE_PORC, TERC_NIT, PROY_COD, CENT_COD, CNDE_DOCNUMERO, CNDE_DOCAPLICA, DOCO_VENCE, ARTI_COD, CODE_TIPOAPL, CODE_TIPONUE)
                                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NROI = NROI + 1;
                        END
                    ELSE
                        UPDATE COMPROBANTE_DETALLE
                            SET CODE_CREDITO = :MONTO
                        WHERE CUEN_COD = :CUENTA AND ENCO_CONSEC = :IDC;
                    END
                END /* MONTO <> 0 */
            END /* FOR */
        END /* INVEN = A */
    if (INVEN = 'K') then
        BEGIN
        SELECT SUM(CANT * COSTO)
            FROM COSTO_VENTAS
            INTO :MONTO;
        if (MONTO <> 0) then
            BEGIN
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTAINVEN INTO :CUENTA, :TIPOCUEN;
            IF (CUENTA IS NULL) THEN
                begin
                EXCEPTION CUENTA_NO_EXISTE 'La cuenta ' || :ctainven || ' no existe.';
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT ARTI_COD, CANT * COSTO
                    FROM COSTO_VENTAS
                    INTO :ART, :MONTO
                DO
                    BEGIN
                    SELECT COUNT(*) FROM COMPROBANTE_DETALLE WHERE CUEN_COD = :CUENTA AND ENCO_CONSEC = :IDC AND ARTI_COD = :ART INTO :NUMROWS;
                    if (NUMROWS = 0) then
                        BEGIN
                        INSERT INTO comprobante_detalle (ENCO_CONSEC, CODE_ITEM, CUEN_COD, CODE_CONCEPTO, CODE_REFER, CODE_DEBITO, CODE_CREDITO, CODE_BASE, CODE_PORC, TERC_NIT, PROY_COD, CENT_COD, CNDE_DOCNUMERO, CNDE_DOCAPLICA, DOCO_VENCE, ARTI_COD, CODE_TIPOAPL, CODE_TIPONUE)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        END
                    ELSE
                        UPDATE COMPROBANTE_DETALLE
                            SET CODE_CREDITO = :MONTO
                        WHERE CUEN_COD = :CUENTA AND ENCO_CONSEC = :IDC AND ARTI_COD = :ART;
                    END
                END
            ELSE
                BEGIN
                SELECT COUNT(*) FROM COMPROBANTE_DETALLE WHERE CUEN_COD = :CUENTA AND ENCO_CONSEC = :IDC INTO :NUMROWS;
                if (NUMROWS = 0) then
                    BEGIN
                    if (TIPOCUEN = 'C') then
                        INSERT INTO comprobante_detalle (ENCO_CONSEC, CODE_ITEM, CUEN_COD, CODE_CONCEPTO, CODE_REFER, CODE_DEBITO, CODE_CREDITO, CODE_BASE, CODE_PORC, TERC_NIT, PROY_COD, CENT_COD, CNDE_DOCNUMERO, CNDE_DOCAPLICA, DOCO_VENCE, ARTI_COD, CODE_TIPOAPL, CODE_TIPONUE)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    ELSE
                        INSERT INTO comprobante_detalle (ENCO_CONSEC, CODE_ITEM, CUEN_COD, CODE_CONCEPTO, CODE_REFER, CODE_DEBITO, CODE_CREDITO, CODE_BASE, CODE_PORC, TERC_NIT, PROY_COD, CENT_COD, CNDE_DOCNUMERO, CNDE_DOCAPLICA, DOCO_VENCE, ARTI_COD, CODE_TIPOAPL, CODE_TIPONUE)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    END
                ELSE
                    UPDATE COMPROBANTE_DETALLE
                        SET CODE_CREDITO = :MONTO
                    WHERE CUEN_COD = :CUENTA AND ENCO_CONSEC = :IDC;
                END
            END /* MONTO <> 0 */
        END /* INVEN = K */
    END
  END
end

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE CONTABIL_DEVOLCLI(
    IDDOC INTEGER,
    IDINTER INTEGER)
RETURNS (
    ERROR INTEGER,
    VER CHAR(1),
    IDC INTEGER)
AS
declare variable PREF VARCHAR(4);
declare variable NUM VARCHAR(6);
declare variable NUMERO VARCHAR(10);
declare variable FECAUX DATE;
declare variable FECHA CHAR(8);
declare variable CONC CHAR(120);
declare variable NUMFAC VARCHAR(10);
declare variable VRDTO NUMERIC(18, 2);
declare variable VRADIC NUMERIC(18, 2);
declare variable VRSUBT NUMERIC(18, 2);
declare variable VRIVA NUMERIC(18, 2);
declare variable PRTFTE NUMERIC(9, 2);
declare variable VRRTFTE NUMERIC(18, 2);
declare variable VRRTIVA NUMERIC(18, 2);
declare variable PRTICA NUMERIC(9, 2);
declare variable VRRTICA NUMERIC(18, 2);
declare variable VRTOTAL NUMERIC(18, 2);
declare variable VREXTRA NUMERIC(18, 2);
declare variable TIPOCOMP VARCHAR(3);
declare variable PREFCONT VARCHAR(4);
declare variable VENTAS CHAR(1);
declare variable CTAVENTAS VARCHAR(20);
declare variable IVA CHAR(1);
declare variable CTAIVA VARCHAR(20);
declare variable CONSUMO CHAR(1);
declare variable CTACONSUMO VARCHAR(20);
declare variable CARTERA CHAR(1);
declare variable CTACARTERA VARCHAR(20);
declare variable RTFTE CHAR(1);
declare variable CTARTFTE VARCHAR(20);
declare variable RTIVA CHAR(1);
declare variable CTARTIVA VARCHAR(20);
declare variable RTICA CHAR(1);
declare variable CTARTICA VARCHAR(20);
declare variable INVEN CHAR(1);
declare variable CTAINVEN VARCHAR(20);
declare variable COSTOS CHAR(1);
declare variable CTACOSTOS VARCHAR(20);
declare variable CTADTO VARCHAR(20);
declare variable CTAADIC VARCHAR(20);
declare variable CTAEXTRA VARCHAR(20);
declare variable EXISTE CHAR(1);
declare variable CUENTA VARCHAR(20);
declare variable MONTO NUMERIC(18,2);
declare variable TIPOCUEN CHAR(1);
declare variable NIT VARCHAR(20);
declare variable PROY VARCHAR(4);
declare variable CENTRO VARCHAR(4);
declare variable PORC NUMERIC(5,2);
declare variable DEBITO NUMERIC(18,2);
declare variable CREDITO NUMERIC(18,2);
declare variable NROI INTEGER;
declare variable ART VARCHAR(15);
declare variable IMPINC CHAR(1);
declare variable IMPTOS NUMERIC(18, 2);
declare variable SUMA NUMERIC(18,2);
declare variable PORCIVA NUMERIC(9,2);
declare variable TCTACLIEN VARCHAR(20);
declare variable TCTAVENTA VARCHAR(20);
declare variable TCTARTFTE VARCHAR(20);
declare variable TCTARTIVA VARCHAR(20);
declare variable TCTARTICA VARCHAR(20);
declare variable CTADIC VARCHAR(20);
declare variable BASEADIC VARCHAR(20);
declare variable PORCADIC NUMERIC(5,2);
declare variable VALORADIC NUMERIC(18,2);
declare variable DBADIC CHAR(1);
declare variable PTOVTA INTEGER;
declare variable ANULADO CHAR(1);
declare variable CENT CHAR(1);
DECLARE VARIABLE MERCANCIA NUMERIC(18,2);
declare variable FACTOR DOUBLE PRECISION;
declare variable DIG INTEGER;
DECLARE VARIABLE FOMENTO VARCHAR(2);
DECLARE VARIABLE VRCONSUMO NUMERIC(18,2);
declare variable AUTORET VARCHAR(10);
declare variable FAUTORET DATE;
declare variable IDREM INTEGER;
declare variable DTOXIT CHAR(2);
declare variable ERRORC INTEGER;
BEGIN
EXECUTE PROCEDURE LEE_CONFIGURACION('COMPRAS', 'FACTURAS', 'USAR IMPOCONSUMO COMO PORCENTAJE DE FOMENTO') returning_values (FOMENTO);
EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'FECHA AUTORETENEDOR NO DESCONTAR RETENCIONES DEL SALDO PERO SI CONTABILIZARLAS') returning_values (AUTORET);
if (AUTORET <> '') then
    FAUTORET = CAST(AUTORET AS DATE);
else
    FAUTORET = '9999/12/31';
  /* BUSQUE LA INTERFACE */
  EXISTE = 'N';
  SELECT 'S', TICO_COD, PRCO_PRE, INVE_VENTAS, INVE_IVA, INVE_CONSUMO, INVE_CARTERA, INVE_RTFTE, INVE_RTIVA, INVE_RTICA, INVE_COSTO, INVE_INVEN, INVE_CTAVENTAS, INVE_CTAIVA, INVE_CTACONSUMO, INVE_CTADTO, INVE_CTAADIC, INVE_CTAEXTRA, INVE_CTACARTERA, INVE_CTARTFTE, INVE_CTARTIVA, INVE_CTARTICA, INVE_CTAINVEN, INVE_CTACOSTOS, INVE_CONFIRMAR, INVE_CENTRO
    FROM INTERFAZ_VENTAS
    WHERE INVE_ID = :IDINTER
    INTO :EXISTE, :TIPOCOMP, :PREFCONT, :VENTAS, :IVA, :CONSUMO, :CARTERA, :RTFTE, :RTIVA, :RTICA, :COSTOS, :INVEN, :CTAVENTAS, :CTAIVA, :CTACONSUMO, :CTADTO, :CTAADIC, :CTAEXTRA, :CTACARTERA, :CTARTFTE, :CTARTIVA, :CTARTICA, :CTAINVEN, :CTACOSTOS, :VER, :CENT;
  if (EXISTE = 'S') then
   BEGIN
    /* BORRE CUALQUEIR CONTABILIZACION PREVIA */
    DELETE FROM CONTABILIZACION WHERE CNTB_TIPOREF = 33 AND CNTB_IDREF = :IDDOC;
    /* TRAIGA EL ENCABEZADO DE LA DEVOLUCION */
   SELECT PREF_PRE, DEVT_NUMERO, DEVT_FECHA, F.TERC_NIT, DEVT_IVAINC, PTVT_ID, DEVT_FACTURA, DEVT_DTOMONTO, DEVT_ADICIONAL, DEVT_IVAMONTO, DEVT_EXTRA, DEVT_TOTAL, DEVT_RTFTEPORC, DEVT_RTFTEMONTO, DEVT_RTIVAPORC, DEVT_RTIVAMONTO, DEVT_RTICAPORC, DEVT_RTICAMONTO, TERC_CTARTFTE, TERC_CTARTIVA, TERC_CTARTICA, TERC_CTAVENTA, TERC_CTACLIENTE, DEVT_ANULADO, DEVT_REMID
        FROM DEVOLUCIONES_VENTAS F, TERCEROS T
        WHERE DEVT_ID = :IDDOC AND F.TERC_NIT = T.TERC_NIT
        INTO :PREF, :NUM, :FECAUX, :NIT, :IMPINC, :PTOVTA, :NUMFAC, :VRDTO, :VRADIC, :VRIVA, :VREXTRA, :VRTOTAL, :PRTFTE, :VRRTFTE, :PORC, :VRRTIVA, :PRTICA, :VRRTICA, :TCTARTFTE, TCTARTIVA, TCTARTICA, TCTAVENTA, TCTACLIEN, ANULADO, :IDREM;
   if (idrem is null) Then
    IDREM = 0;
   if ((ANULADO = 'N') AND (IDREM = 0)) then
    BEGIN
    NUMERO = PREF || NUM;
    SELECT SUM(DVDE_CONSUMO) FROM devoluciones_ventas_detalle WHERE DEVT_ID = :iddoc AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL)) INTO :MERCANCIA;
    VRSUBT = VRTOTAL - VREXTRA - VRIVA - MERCANCIA; /* BASE DE RETEFTE Y RETEICA */
    EXECUTE PROCEDURE lee_configuracion ('FACTURACION', 'DEVOLUCIONES', 'DESCUENTO PIE DEVOLUCION IGUAL A SUMA DE DESCUENTOS POR ITEM') returning_values (:DTOXIT);
    if (DTOXIT = 'SI') then
        VRDTO = 0;
    MERCANCIA = VRSUBT - VRADIC + VRDTO;
    IF (CENT = 'B') THEN
        SELECT B.BODE_CENTRO, B.BODE_PROY FROM BODEGA B, DEVOLUCIONES_VENTAS F
            WHERE B.BODE_COD = F.BODE_COD AND F.DEVT_ID = :IDDOC INTO :CENTRO, :PROY;
    IF (CENT = 'V') THEN
        SELECT V.CENT_COD, V.PROY_COD FROM VENDEDORES V, DEVOLUCIONES_VENTAS F
            WHERE V.VEND_COD = F.VEND_COD AND F.DEVT_ID = :IDDOC INTO :CENTRO, :PROY;
    IF (CENT = 'P') THEN
        SELECT P.PREF_CENTRO,P.PREF_PROY  FROM PREFIJOS P, DEVOLUCIONES_VENTAS F
            WHERE P.PREF_PRE = F.PREF_PRE AND F.DEVT_ID = :IDDOC AND P.TIDO_COD = 33 INTO :CENTRO, :PROY;
    EXECUTE PROCEDURE FECHA_A_CONTA(:FECAUX) returning_values (:FECHA);
    /* REGISTRE EL ENCABEZADO CONTABLE */
    IDC = GEN_ID(ID_CONTABILIZA, 1);
    CONC = 'DEVOLUCION VENTAS No. ' || NUMERO || ' EN FACTURA ' || NUMFAC;
    CONC = SUBSTR(CONC, 1, 60);
    INSERT INTO CONTABILIZACION (CNTB_ID, CNTB_TIPOCOMP, CNTB_PREFCNT, CNTB_NUMERO, CNTB_FECHA, CNTB_CONCEPTO, CNTB_REF, CNTB_TIPOREF, CNTB_IDREF, CNTB_PREFREF, CNTB_NUMREF, CNTB_PROCESADO)
        VALUES (:IDC, :TIPOCOMP, :PREFCONT, :NUM, :FECHA, :CONC, '', 33, :IDDOC, :PREF, :NUM, 'N');
    NROI = 0;
    SUMA = 0;
    ERROR = 0;
    /* SI NO HAY CUENTA DE DESCUENTO NI ADICIONAL CALCULE UN FACTOR PARA LAS VENTAS Y EL IVA */
    if (MERCANCIA <> 0) then
        FACTOR = CAST(VRSUBT AS DOUBLE PRECISION) / CAST(MERCANCIA AS DOUBLE PRECISION);
    ELSE
        FACTOR = 1;
    /* TRAIGA EL NUMERO DE DIGITOS PARA EL REDONDEO */
    SELECT CAST(CONF_VALOR AS INTEGER) FROM CONFIGURACION WHERE CONF_MODULO = 'FACTURACION' AND
        CONF_CATEGORIA = 'GENERAL' AND CONF_PROPIEDAD = 'REDONDEO AL MULTIPLO DE DIEZ EN TOTALES' INTO :DIG;
    /* CUENTAS DE VENTAS */
    if (VENTAS = 'A') then
        BEGIN
        FOR SELECT MAX(COAR_CTADEV), SUM(cast(DVDE_CANT as double precision) * (DVDE_PRUNIT-DVDE_DTOMONTO)), SUM(DVDE_IVAMONTO), SUM(DVDE_CONSUMO)
            FROM ARTICULO A, CONTABIL_ARTICULO C, DEVOLUCIONES_VENTAS_DETALLE F
            WHERE F.DEVT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
            GROUP BY COAR_CTADEV
            INTO :CTAVENTAS, :MONTO, :IMPTOS, :VRCONSUMO
            DO
            BEGIN
            if (IMPINC = 'S') then
                if (FOMENTO = 'SI') then
                    MONTO = MONTO - IMPTOS;
                ELSE
                    MONTO = MONTO - IMPTOS - VRCONSUMO;
            ELSE
            if (FOMENTO = 'SI') then
            MONTO = MONTO + VRCONSUMO;
            if ((CTADTO IS NULL) OR (CTADTO = '')) then
                MONTO = MONTO * FACTOR;
            execute procedure redondee(MONTO, DIG) returning_values (MONTO);
            if (MONTO <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTAVENTAS, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT F.ARTI_COD, (cast(DVDE_CANT as double precision) * (DVDE_PRUNIT-DVDE_DTOMONTO)), (DVDE_IVAMONTO+DVDE_CONSUMO)
                        FROM ARTICULO A, CONTABIL_ARTICULO C, DEVOLUCIONES_VENTAS_DETALLE F
                        WHERE F.DEVT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTAINV = :CUENTA AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
                        INTO :ART, :MONTO, :IMPTOS
                    DO
                        BEGIN
                        if (IMPINC = 'S') then
                            MONTO = MONTO - IMPTOS;
                        if ((CTADTO IS NULL) OR (CTADTO = '')) then
                            MONTO = MONTO * FACTOR;
                        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        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, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                    NROI = NROI + 1;
                    SUMA = SUMA + MONTO;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA + MONTO;
                    END
                END /* MONTO <> 0 */
            END /* FOR */
        END /* VENTAS X ARTICULO */
     IF ((VENTAS = 'C') OR (VENTAS = 'K')) THEN
        BEGIN
        IF (VENTAS = 'C') THEN
            CTAVENTAS = TCTAVENTA;
        SELECT SUM(cast(DVDE_CANT as double precision) * (DVDE_PRUNIT-DVDE_DTOMONTO)), SUM(DVDE_IVAMONTO), SUM(DVDE_CONSUMO)
            FROM DEVOLUCIONES_VENTAS_DETALLE F
            WHERE F.DEVT_ID = :IDDOC  AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
            INTO :MONTO, :IMPTOS, :VRCONSUMO;
        if (IMPINC = 'S') then
            if (FOMENTO = 'SI') then
               MONTO = MONTO - IMPTOS;
            ELSE
               MONTO = MONTO - IMPTOS - VRCONSUMO;
        ELSE
         if (FOMENTO = 'SI') then
          MONTO = MONTO + VRCONSUMO;
        if ((CTADTO IS NULL) OR (CTADTO = '')) then
            MONTO = MONTO * FACTOR;
        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
        if (MONTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTAVENTAS, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT F.ARTI_COD, (cast(DVDE_CANT as double precision) * (DVDE_PRUNIT-DVDE_DTOMONTO)), (DVDE_IVAMONTO+DVDE_CONSUMO)
                    FROM ARTICULO A, DEVOLUCIONES_VENTAS_DETALLE F
                    WHERE F.DEVT_ID = :IDDOC AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
                    INTO :ART, :MONTO, :IMPTOS
                    DO
                    BEGIN
                    if (IMPINC = 'S') then
                        MONTO = MONTO - IMPTOS;
                    if ((CTADTO IS NULL) OR (CTADTO = '')) then
                        MONTO = MONTO * FACTOR;
                    execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                    NROI = NROI + 1;
                    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, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                NROI = NROI + 1;
                SUMA = SUMA + MONTO;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA + MONTO;
                END
            END /* MONTO <> 0 */
        END /* VENTAS DE CLIENTE O CONSTANTE */
    /* EL IVA EN VENTAS */
    if (IVA = 'A') then
        BEGIN
        FOR SELECT MAX(COAR_CTAIVAV), SUM(DVDE_IVAMONTO), SUM(DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO), SUM(DVDE_CONSUMO)
            FROM ARTICULO A, CONTABIL_ARTICULO C, DEVOLUCIONES_VENTAS_DETALLE F
            WHERE F.DEVT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
            GROUP BY COAR_CTAIVAV
            INTO :CTAIVA, :IMPTOS, :MONTO, :VALORADIC
        DO
            BEGIN
            if (FOMENTO = 'SI') then
                MONTO = MONTO + VALORADIC;
            MONTO = MONTO * -1;
            MONTO = MONTO * FACTOR;
            IMPTOS = IMPTOS * FACTOR;
            execute procedure redondee(MONTO, DIG) returning_values (MONTO);
            execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
            if (IMPTOS <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTAIVA, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT F.ARTI_COD, DVDE_IVAMONTO, (cast(DVDE_CANT as double precision) * (DVDE_PRUNIT-DVDE_DTOMONTO)), TAIV_PORC, DVDE_CONSUMO
                        FROM ARTICULO A, CONTABIL_ARTICULO C, DEVOLUCIONES_VENTAS_DETALLE F, TARIFA_IVA T
                        WHERE F.DEVT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND A.TAIV_COD = T.TAIV_COD AND COAR_CTAIVAV = :CUENTA AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
                        INTO :ART, :IMPTOS, :MONTO, :PORCIVA, :VALORADIC
                    DO
                        BEGIN
                        if (IMPINC = 'S') then
                            MONTO = MONTO - IMPTOS - VALORADIC;
                        MONTO = MONTO * -1;
                        MONTO = MONTO * FACTOR;
                        IMPTOS = IMPTOS * FACTOR;
                        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                        execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                        if (IMPTOS <> 0) then
                            BEGIN
                            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :IMPTOS, 0, :MONTO, :PORCIVA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                            NROI = NROI + 1;
                            SUMA = SUMA + IMPTOS;
                            END
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                    NROI = NROI + 1;
                    SUMA = SUMA + IMPTOS;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA + IMPTOS;
                    END
                END   /* IMPTOS <> 0 */
            END /* FOR */
        END /* IVA X ARTICULO */
    if (IVA = 'K') then /* IVA EN CTA CONSTANTE */
        BEGIN
        SELECT SUM(DVDE_IVAMONTO), SUM(DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO), SUM(DVDE_CONSUMO)
            FROM DEVOLUCIONES_VENTAS_DETALLE F
            WHERE F.DEVT_ID = :IDDOC  AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
            INTO :IMPTOS, :MONTO, :VALORADIC;
        if (FOMENTO = 'SI') then
            MONTO = MONTO + VALORADIC;
        MONTO = MONTO * -1;
        MONTO = MONTO * FACTOR;
        IMPTOS = IMPTOS * FACTOR;
        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
        execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
        if (IMPTOS <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTAIVA, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT F.ARTI_COD, (cast(DVDE_CANT as double precision) * (DVDE_PRUNIT-DVDE_DTOMONTO)), DVDE_IVAMONTO, TAIV_PORC, DVDE_CONSUMO
                    FROM ARTICULO A, DEVOLUCIONES_VENTAS_DETALLE F, TARIFA_IVA T
                    WHERE F.DEVT_ID = :IDDOC AND A.TAIV_COD = T.TAIV_COD AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
                    INTO :ART, :MONTO, :IMPTOS, :PORCIVA, :VALORADIC
                    DO
                    BEGIN
                    if (IMPINC = 'S') then
                        MONTO = MONTO - IMPTOS - VALORADIC;
                    MONTO = MONTO * -1;
                    MONTO = MONTO * FACTOR;
                    IMPTOS = IMPTOS * FACTOR;
                    execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                    execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                    if (IMPTOS <> 0) then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', :IMPTOS, 0, :MONTO, :PORCIVA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        SUMA = SUMA + IMPTOS;
                        END
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                NROI = NROI + 1;
                SUMA = SUMA + IMPTOS;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA + IMPTOS;
                END
            END /* IMPTOS <> 0 */
        END /* IVA EN CTA CONSTANTE */
    /* EL IMPOCONSUMO */
    if ((CONSUMO = 'A') AND (FOMENTO <> 'SI')) then
        BEGIN
        FOR SELECT MAX(COAR_CTACONS), SUM(DVDE_CONSUMO)
            FROM ARTICULO A, CONTABIL_ARTICULO C, DEVOLUCIONES_VENTAS_DETALLE F
            WHERE F.DEVT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
            GROUP BY COAR_CTACONS
            INTO :CTACONSUMO, :IMPTOS
        DO
            BEGIN
            if (IMPTOS <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTACONSUMO, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, REGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT F.ARTI_COD, DVDE_CONSUMO
                        FROM ARTICULO A, CONTABIL_ARTICULO C, DEVOLUCIONES_VENTAS_DETALLE F
                        WHERE F.DEVT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTACONS = :CUENTA AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
                        INTO :ART, :IMPTOS
                    DO
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 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, :NROI, :CUENTA, :CONC, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                    NROI = NROI + 1;
                    SUMA = SUMA + IMPTOS;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA + IMPTOS;
                    END
                END /* IMPTOS <> 0 */
            END /* FOR */
        END /* CONSUMO X ARTICULO */
    if ((CONSUMO = 'K') AND (FOMENTO <> 'SI')) then
        BEGIN
        SELECT SUM(DVDE_CONSUMO)
            FROM DEVOLUCIONES_VENTAS_DETALLE F
            WHERE F.DEVT_ID = :IDDOC AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
            INTO :IMPTOS;
        if (IMPTOS <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTACONSUMO, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT F.ARTI_COD, DVDE_CONSUMO
                    FROM ARTICULO A, DEVOLUCIONES_VENTAS_DETALLE F
                    WHERE F.DEVT_ID = :IDDOC  AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
                    INTO :ART, :IMPTOS
                    DO
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTACONSUMO, :CONC, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                    NROI = NROI + 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, :NROI, :CTACONSUMO, :CONC, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA + IMPTOS;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTACONSUMO, :CONC, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA + IMPTOS;
                END
            END /* IMPTOS <> 0 */
        END /* CONSUMO EN CTA CONSTANTE */
    /* DESCUENTO */
    if ((CTADTO IS NOT NULL) AND
        (CTADTO <> '') AND
        (VRDTO <> 0)) THEN
        BEGIN
        EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTADTO, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRDTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
            NROI = NROI + 1;
            SUMA = SUMA - VRDTO;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRDTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 33);
            NROI = NROI + 1;
            SUMA = SUMA - VRDTO;
            END
        END /* DESCUENTO */
    /* VALOR ADIC */
    if ((CTAADIC IS NOT NULL) AND
        (CTAADIC <> '') AND
        (VRADIC <> 0)) THEN
        BEGIN
        EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTAADIC, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRADIC, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
            NROI = NROI + 1;
            SUMA = SUMA + VRADIC;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRADIC, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 33);
            NROI = NROI + 1;
            SUMA = SUMA + VRADIC;
            END
        END /* VR. ADIC */
    /* VALOR EXTRA */
    if ((CTAEXTRA IS NOT NULL) AND
        (CTAEXTRA <> '') AND
        (VREXTRA <> 0)) THEN
        BEGIN
        EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTAEXTRA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VREXTRA, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
            NROI = NROI + 1;
            SUMA = SUMA + VREXTRA;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VREXTRA, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 33);
            NROI = NROI + 1;
            SUMA = SUMA + VREXTRA;
            END
        END /* VR. EXTRA */
    /* RETENCION FUENTE */
    if ((RTFTE = 'C') or (RTFTE = 'K')) then
      if (VRRTFTE <> 0) then
        BEGIN
        if (RTFTE = 'C') then
            CTARTFTE = TCTARTFTE;
        EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTARTFTE, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, (:VRSUBT*-1), :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
            NROI = NROI + 1;
            SUMA = SUMA - VRRTFTE;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, (:VRSUBT*-1), :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA - VRRTFTE;
            END
        /* AUTORETENCION */
        if (FAUTORET <= fecaux) then
            BEGIN
            EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'CUENTA DE AUTORETENCION EN LA FUENTE') returning_values (CTARTFTE);
            EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTARTFTE, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :VRSUBT, :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                NROI = NROI + 1;
                SUMA = SUMA + VRRTFTE;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :VRSUBT, :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA + VRRTFTE;
                END
            END
        END /* RTFTE */
    if (RTFTE = 'A') then
      BEGIN
      FOR SELECT MAX(COAR_CTARTFTEV), MAX(COAR_RTFTE), MIN(COAR_RTBASE), SUM(DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO), SUM((DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO)*COAR_RTFTE)
        FROM CONTABIL_ARTICULO C, devoluciones_ventas_detalle F
        WHERE F.devt_id = :IDDOC AND F.ARTI_COD = C.ARTI_COD AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
        GROUP BY COAR_CTARTFTEV
        INTO :CTARTFTE, :PRTFTE, :baseadic, :MONTO, :VRRTFTE
        DO
        BEGIN
        MONTO = MONTO * FACTOR;
        if (MONTO >= BASEADIC) then
            BEGIN
            VRRTFTE = VRRTFTE * FACTOR / 100;
            execute procedure redondee(VRRTFTE, DIG) returning_values (VRRTFTE);
            execute procedure redondee(MONTO, DIG) returning_values (MONTO);
            if (VRRTFTE <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTARTFTE, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, (:MONTO*-1), :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                    NROI = NROI + 1;
                    SUMA = SUMA - VRRTFTE;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, (:MONTO*-1), :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA - VRRTFTE;
                    END
                /* AUTORETENCION */
                if (FAUTORET <= fecaux) then
                    BEGIN
                    EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'CUENTA DE AUTORETENCION EN LA FUENTE') returning_values (CTARTFTE);
                    EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTARTFTE, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
                    if (ERRORC <> 0) then
                        ERROR = ERROR + 1;
                    if (TIPOCUEN = 'C') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :MONTO, :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                        NROI = NROI + 1;
                        SUMA = SUMA + VRRTFTE;
                        END
                    if (TIPOCUEN = 'N') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :MONTO, :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NROI = NROI + 1;
                        SUMA = SUMA + VRRTFTE;
                        END
                    END
                END
            END
        END /* RTFTE */
      END
    /* RETENCION IVA */
    if ((RTIVA = 'C') or (RTIVA = 'K')) then
      if (VRRTIVA <> 0) then
        BEGIN
        if (RTIVA = 'C') then
            CTARTIVA = TCTARTIVA;
        EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTARTIVA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTIVA, (:VRIVA*-1), :PORC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
            NROI = NROI + 1;
            SUMA = SUMA - VRRTIVA;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTIVA, (:VRIVA*-1), :PORC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA - VRRTIVA;
            END
        END /* RTIVA */
    /* RETENCION DE ICA */
    if ((RTICA = 'C') or (RTICA = 'K')) then
      if (VRRTICA <> 0) then
        BEGIN
        if (RTICA = 'C') then
            CTARTICA = TCTARTICA;
        EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTARTICA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTICA, (:VRSUBT*-1), :PRTICA, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
            NROI = NROI + 1;
            SUMA = SUMA - VRRTICA;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTICA, (:VRSUBT*-1), :PRTICA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA - VRRTICA;
            END
        END /* RTICA */
    /* CIERRE EL COMPROBANTE CONTRA LA CUENTA DEL TERCERO O LA CONSTANTE */
    if ((SUMA <> 0) and ((CARTERA = 'C') or (CARTERA = 'K') or (CARTERA = 'J'))) then
        BEGIN
        if (SUMA < 0) then
            BEGIN
            DEBITO = SUMA * -1;
            CREDITO = 0;
            END
        ELSE
            BEGIN
            DEBITO = 0;
            CREDITO = SUMA;
            END
        if (CARTERA = 'C') then
            CTACARTERA = TCTACLIEN;
        if (CARTERA = 'J') then
            BEGIN
            /* BUSQUE LA CUENTA DE LA CAJA */
            SELECT CAJA_CUENTA FROM CAJAS C, PUNTO_VENTA P
                WHERE P.CAJA_ID = C.CAJA_ID AND PTVT_ID = :PTOVTA
                INTO :CTACARTERA;
            END
        EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTACARTERA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :DEBITO, :CREDITO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
        if (TIPOCUEN = 'N') then
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :DEBITO, :CREDITO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
        NROI = NROI + 1;
        END /* SUMA EN CARTERA */
    /* CALCULE COSTOS EN VENTAS */
    EXECUTE PROCEDURE COSTO_EN_VENTAS(33, :IDDOC);
    if (COSTOS = 'A') then
        BEGIN
        FOR SELECT MAX(CTACOS), SUM(cast(CANT as double precision) * COSTO)
            FROM COSTO_VENTAS
            GROUP BY CTACOS
            INTO :CTACOSTOS, :MONTO
        DO
            BEGIN
            if (MONTO <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTACOSTOS, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT ARTI_COD, cast(CANT as double precision) * COSTO
                        FROM COSTO_VENTAS
                        WHERE CTACOS = :CUENTA
                        INTO :ART, :MONTO
                    DO
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                    NROI = NROI + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    END
                END /* MONTO <> 0 */
            END /* FOR */
        END /* COSTOS */
    if (COSTOS = 'K') then
        BEGIN
        SELECT SUM(cast(CANT as double precision) * COSTO)
            FROM COSTO_VENTAS
            INTO :MONTO;
        if (MONTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTACOSTOS, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, REGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT ARTI_COD, cast(CANT as double precision) * COSTO
                    FROM COSTO_VENTAS
                    INTO :ART, :MONTO
                DO
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTACOSTOS, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                    NROI = NROI + 1;
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTACOSTOS, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                NROI = NROI + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTACOSTOS, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                END
            END /* MONTO <> 0 */
        END /* COSTOS = K */
    if (INVEN = 'A') then
        BEGIN
        FOR SELECT MAX(CTAINV), SUM(cast(CANT as double precision) * COSTO)
            FROM COSTO_VENTAS
            GROUP BY CTAINV
            INTO :CTAINVEN, :MONTO
        DO
            BEGIN
            if (MONTO <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTAINVEN, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, REGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT ARTI_COD, cast(CANT as double precision) * COSTO
                        FROM COSTO_VENTAS
                        WHERE CTAINV = :CUENTA
                        INTO :ART, :MONTO
                    DO
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                    NROI = NROI + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    END
                END /* MONTO <> 0 */
            END /* FOR */
        END /* INVEN = A */
    if (INVEN = 'K') then
        BEGIN
        SELECT SUM(cast(CANT as double precision) * COSTO)
            FROM COSTO_VENTAS
            INTO :MONTO;
        if (MONTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTAINVEN, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT ARTI_COD, cast(CANT as double precision) * COSTO
                    FROM COSTO_VENTAS
                    INTO :ART, :MONTO
                DO
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTAINVEN, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                    NROI = NROI + 1;
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAINVEN, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                NROI = NROI + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAINVEN, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                END
            END /* MONTO <> 0 */
        END /* INVEN = K */
    /* recorra las cuentas adicionales */
    FOR SELECT INVC_CUENTA, INVC_BASE, INVC_PORC, INVC_VALOR, INVC_DB
        FROM INTERFAZ_VENTAS_CTAS WHERE INVE_ID = :IDINTER
        INTO :CTADIC, :BASEADIC, :PORCADIC, :VALORADIC, :DBADIC
        DO
        BEGIN
        if (valoradic <> 0) then
            monto = valoradic;
        else
            BEGIN
            if (:BASEADIC = 'SUBTOTAL') then
                VALORADIC = vrsubt;
            if (:BASEADIC = 'DESCUENTO') then
                VALORADIC = VRDTO;
            if (:BASEADIC = 'IVA') then
                VALORADIC = VRIVA;
            if (:BASEADIC = 'ADICIONAL') then
                VALORADIC = VRADIC;
            if (:BASEADIC = 'EXTRA') then
                VALORADIC = VREXTRA;
            if (:BASEADIC = 'TOTAL') then
                VALORADIC = VRTOTAL;
            MONTO = VALORADIC * PORCADIC;
            END
        if (MONTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTADIC, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                if (DBADIC = 'S') then
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                ELSE
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                NROI = NROI + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                if (DBADIC = 'S') then
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                ELSE
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                END
            NROI = NROI + 1;
            END
        END
    if (error > 0) then
        ver = 'S';
    SUSPEND;
    END
   END /* EXISTE LA INTERFAZ */
  ELSE
    BEGIN
    EXECUTE PROCEDURE ERROR (33, :IDDOC, :PREF, 1);
    ERROR = ERROR + 1;
    VER = 'S';
    SUSPEND;
    END
END

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE CONTABIL_FACTURA(
    IDDOC INTEGER,
    IDINTER INTEGER)
RETURNS (
    ERROR INTEGER,
    VER CHAR(1),
    IDC INTEGER)
AS
declare variable pref varchar(4);
declare variable num varchar(6);
declare variable numero varchar(10);
declare variable fecaux date;
declare variable fecha char(8);
declare variable conc varchar(60);
declare variable venceaux date;
declare variable vence char(8);
declare variable vrdto numeric(18,2);
declare variable vradic numeric(18,2);
declare variable vrsubt numeric(18,2);
declare variable vriva numeric(18,2);
declare variable prtfte numeric(9,2);
declare variable vrrtfte numeric(18,2);
declare variable vrrtiva numeric(18,2);
declare variable prtica numeric(9,2);
declare variable vrrtica numeric(18,2);
declare variable vrtotal numeric(18,2);
declare variable vrextra numeric(18,2);
declare variable tipocomp varchar(3);
declare variable prefcont varchar(4);
declare variable ventas char(1);
declare variable ctaventas varchar(20);
declare variable iva char(1);
declare variable ctaiva varchar(20);
declare variable consumo char(1);
declare variable ctaconsumo varchar(20);
declare variable cartera char(1);
declare variable ctacartera varchar(20);
declare variable rtfte char(1);
declare variable ctartfte varchar(20);
declare variable rtiva char(1);
declare variable ctartiva varchar(20);
declare variable rtica char(1);
declare variable ctartica varchar(20);
declare variable inven char(1);
declare variable ctainven varchar(20);
declare variable costos char(1);
declare variable ctacostos varchar(20);
declare variable ctadto varchar(20);
declare variable ctaadic varchar(20);
declare variable ctaextra varchar(20);
declare variable existe char(1);
declare variable cuenta varchar(20);
declare variable monto numeric(18,2);
declare variable tipocuen char(1);
declare variable nit varchar(20);
declare variable nombre varchar(60);
declare variable proy varchar(4);
declare variable centro varchar(4);
declare variable porc numeric(5,2);
declare variable debito numeric(18,2);
declare variable credito numeric(18,2);
declare variable nroi integer;
declare variable art varchar(15);
declare variable imptos numeric(18,2);
declare variable suma numeric(18,2);
declare variable porciva numeric(9,2);
declare variable tctaclien varchar(20);
declare variable tctaventa varchar(20);
declare variable tctartfte varchar(20);
declare variable tctartiva varchar(20);
declare variable tctartica varchar(20);
declare variable ctadic varchar(20);
declare variable baseadic varchar(20);
declare variable porcadic numeric(5,2);
declare variable valoradic numeric(18,2);
declare variable dbadic char(1);
declare variable ptovta integer;
declare variable anulado char(1);
declare variable dig integer;
declare variable mercancia numeric(18,2);
declare variable fomento varchar(2);
declare variable DTOXIT varchar(2);
declare variable vrconsumo numeric(18,2);
declare variable factor double precision;
declare variable cent char(1);
declare variable AUTORET VARCHAR(10);
declare variable FAUTORET DATE;
declare variable ERRORC INTEGER;
BEGIN
EXECUTE PROCEDURE LEE_CONFIGURACION('COMPRAS', 'FACTURAS', 'USAR IMPOCONSUMO COMO PORCENTAJE DE FOMENTO') returning_values (FOMENTO);
EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'FECHA AUTORETENEDOR NO DESCONTAR RETENCIONES DEL SALDO PERO SI CONTABILIZARLAS') returning_values (AUTORET);
if (AUTORET <> '') then
    FAUTORET = CAST(AUTORET AS DATE);
else
    FAUTORET = '9999/12/31';
/* BUSQUE LA INTERFACE */
EXISTE = 'N';
SELECT 'S', TICO_COD, PRCO_PRE, INVE_VENTAS, INVE_IVA, INVE_CONSUMO, INVE_CARTERA, INVE_RTFTE, INVE_RTIVA, INVE_RTICA, INVE_COSTO, INVE_INVEN, INVE_CTAVENTAS, INVE_CTAIVA, INVE_CTACONSUMO, INVE_CTADTO, INVE_CTAADIC, INVE_CTAEXTRA, INVE_CTACARTERA, INVE_CTARTFTE, INVE_CTARTIVA, INVE_CTARTICA, INVE_CTAINVEN, INVE_CTACOSTOS, INVE_CONFIRMAR, INVE_CENTRO
    FROM INTERFAZ_VENTAS
    WHERE INVE_ID = :IDINTER
    INTO :EXISTE, :TIPOCOMP, :PREFCONT, :VENTAS, :IVA, :CONSUMO, :CARTERA, :RTFTE, :RTIVA, :RTICA, :COSTOS, :INVEN, :CTAVENTAS, :CTAIVA, :CTACONSUMO, :CTADTO, :CTAADIC, :CTAEXTRA, :CTACARTERA, :CTARTFTE, :CTARTIVA, :CTARTICA, :CTAINVEN, :CTACOSTOS, :VER, :CENT;
if (EXISTE = 'S') then
  BEGIN
    /* BORRE CUALQUEIR CONTABILIZACION PREVIA */
    DELETE FROM CONTABILIZACION WHERE CNTB_TIPOREF = 31 AND CNTB_IDREF = :IDDOC;

  /* TRAIGA EL ENCABEZADO DE LA FACTURA */
  SELECT PREF_PRE, FACT_NUMERO, FACT_FECHA, F.TERC_NIT, PTVT_ID, FACT_VENCE, FACT_DTOMONTO, FACT_ADICIONAL, FACT_IVAMONTO, FACT_EXTRA, FACT_TOTAL, FACT_RTFTEPOR, FACT_RTFTEMONTO, FACT_RTIVAPOR, FACT_RTIVAMONTO, FACT_RTICAPOR, FACT_RTICAMONTO, FACT_NOMCLIENTE, TERC_CTARTFTE, TERC_CTARTIVA, TERC_CTARTICA, TERC_CTAVENTA, TERC_CTACLIENTE, FACT_ANULADO
        FROM FACTURAS F, TERCEROS T
        WHERE FACT_ID = :IDDOC AND F.TERC_NIT = T.TERC_NIT
        INTO :PREF, :NUM, :FECAUX, :NIT, :PTOVTA, :VENCEAUX, :VRDTO, :VRADIC, :VRIVA, :VREXTRA, :VRTOTAL, :PRTFTE, :VRRTFTE, :PORC, :VRRTIVA, :PRTICA, :VRRTICA, :NOMBRE, TCTARTFTE, TCTARTIVA, TCTARTICA, TCTAVENTA, TCTACLIEN, ANULADO;
  if (ANULADO = 'N') then
    BEGIN
    /* BUSQUE EL CENTRO DEL PUNTO, LA BODEGA, O EL PREFIJO  */
    IF (CENT = 'B') THEN
        SELECT B.BODE_CENTRO, B.BODE_PROY FROM BODEGA B, FACTURAS F
            WHERE B.BODE_COD = F.BODE_COD AND F.FACT_ID = :IDDOC INTO :CENTRO, :PROY;
    IF (CENT = 'V') THEN
        SELECT V.CENT_COD, V.PROY_COD FROM VENDEDORES V, FACTURAS F
            WHERE V.VEND_COD = F.VEND_COD AND F.FACT_ID = :IDDOC INTO :CENTRO, :PROY;
    IF (CENT = 'P') THEN
        SELECT P.PREF_CENTRO,P.PREF_PROY  FROM PREFIJOS P, FACTURAS F
            WHERE P.PREF_PRE = F.PREF_PRE AND F.FACT_ID = :IDDOC AND P.TIDO_COD = 31 INTO :CENTRO, :PROY;
    NUMERO = PREF || NUM;
    SELECT SUM (FADE_CONSUMO) FROM FACTURAS_DETALLE WHERE FACT_ID = :IDDOC  AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
        INTO MERCANCIA;
    VRSUBT = VRTOTAL - VREXTRA - VRIVA - MERCANCIA; /* BASE DE RETEFTE Y RETEICA */

    EXECUTE PROCEDURE lee_configuracion ('FACTURACION', 'FACTURAS', 'DESCUENTO PIE FACTURA IGUAL A SUMA DE DESCUENTOS POR ITEM') returning_values (:DTOXIT);
    if (DTOXIT = 'SI') then
        VRDTO = 0;
    MERCANCIA = VRSUBT - VRADIC + VRDTO;
    EXECUTE PROCEDURE FECHA_A_CONTA(:FECAUX) returning_values (:FECHA);
    EXECUTE PROCEDURE FECHA_A_CONTA(:VENCEAUX) returning_values (:VENCE);
    /* REGISTRE EL ENCABEZADO CONTABLE */
    IDC = GEN_ID(ID_CONTABILIZA, 1);
    if (STRLEN(NOMBRE)> 43 ) then
      CONC = 'FV No.' || NUMERO || '-' || SUBSTR(NOMBRE,1,43);
    ELSE
      CONC = 'FV No.' || NUMERO || '-' || NOMBRE;
    INSERT INTO CONTABILIZACION (CNTB_ID, CNTB_TIPOCOMP, CNTB_PREFCNT, CNTB_NUMERO, CNTB_FECHA, CNTB_CONCEPTO, CNTB_REF, CNTB_TIPOREF, CNTB_IDREF, CNTB_PREFREF, CNTB_NUMREF, CNTB_PROCESADO)
        VALUES (:IDC, :TIPOCOMP, :PREFCONT, :NUM, :FECHA, :CONC, '', 31, :IDDOC, :PREF, :NUM, 'N');
    NROI = 0;
    SUMA = 0;
    ERROR = 0;
    /* SI NO HAY CUENTA DE DESCUENTO NI ADICIONAL CALCULE UN FACTOR PARA LAS VENTAS Y EL IVA */
    if (MERCANCIA <> 0) then
        FACTOR = CAST(VRSUBT AS DOUBLE PRECISION) / CAST(MERCANCIA AS DOUBLE PRECISION);
    ELSE
        FACTOR = 1;
    /* TRAIGA EL NUMERO DE DIGITOS PARA EL REDONDEO */
    SELECT CAST(CONF_VALOR AS INTEGER) FROM CONFIGURACION WHERE CONF_MODULO = 'FACTURACION' AND
        CONF_CATEGORIA = 'GENERAL' AND CONF_PROPIEDAD = 'REDONDEO AL MULTIPLO DE DIEZ EN TOTALES' INTO :DIG;
    /* CUENTAS DE VENTAS */
    if (VENTAS = 'A') then
        BEGIN
        FOR SELECT MAX(COAR_CTAVNT), SUM(FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), SUM(FADE_IVAMONTO), SUM(FADE_CONSUMO)
            FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_DETALLE F
            WHERE F.FACT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
            GROUP BY COAR_CTAVNT
            INTO :CTAVENTAS, :MONTO, :IMPTOS, :VRCONSUMO
            DO
            BEGIN
            if (FOMENTO = 'SI') then
                MONTO = MONTO + VRCONSUMO;
            if ((CTADTO IS NULL) OR (CTADTO = '')) then
                MONTO = MONTO * FACTOR;
            execute procedure redondee(MONTO, DIG) returning_values (MONTO);
            if (MONTO <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTAVENTAS, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT F.ARTI_COD, (FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), FADE_CONSUMO
                        FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_DETALLE F
                        WHERE F.FACT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTAINV = :CUENTA AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
                        INTO :ART, :MONTO, :IMPTOS
                    DO
                        BEGIN
                        if (FOMENTO = 'SI') then
                            MONTO = MONTO + IMPTOS;
                        if ((CTADTO IS NULL) OR (CTADTO = '')) then
                            MONTO = MONTO * FACTOR;
                        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                        if (MONTO <> 0) then
                            BEGIN
                            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                            NROI = NROI + 1;
                            SUMA = SUMA - MONTO;
                            END
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    NROI = NROI + 1;
                    SUMA = SUMA - MONTO;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA - MONTO;
                    END
                END /* MONTO <> 0 */
            END /* FOR */
        END /* VENTAS X ARTICULO */
     IF ((VENTAS = 'C') OR (VENTAS = 'K')) THEN
        BEGIN
        IF (VENTAS = 'C') THEN
            CTAVENTAS = TCTAVENTA;
        SELECT SUM(FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), SUM(FADE_IVAMONTO), SUM (FADE_CONSUMO)
            FROM FACTURAS_DETALLE F
            WHERE F.FACT_ID = :IDDOC AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
            INTO :MONTO, :IMPTOS, :VRCONSUMO;
        if (FOMENTO = 'SI') then
            MONTO = MONTO + VRCONSUMO;
        if ((CTADTO IS NULL) OR (CTADTO = '')) then
            MONTO = MONTO * FACTOR;
        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
        if (MONTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTAVENTAS, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT F.ARTI_COD, (FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), FADE_CONSUMO
                    FROM ARTICULO A, FACTURAS_DETALLE F
                    WHERE F.FACT_ID = :IDDOC AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
                    INTO :ART, :MONTO, :IMPTOS
                    DO
                    BEGIN
                    if (FOMENTO = 'SI') then
                        MONTO = MONTO + VRCONSUMO;
                    if ((CTADTO IS NULL) OR (CTADTO = '')) then
                        MONTO = MONTO * FACTOR;
                    execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                    if (MONTO <> 0) then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        SUMA = SUMA - MONTO;
                        END
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - MONTO;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - MONTO;
                END
            END /* MONTO <> 0 */
        END /* VENTAS DE CLIENTE O CONSTANTE */
    /* EL IVA EN VENTAS */
    if (IVA = 'A') then
        BEGIN
        FOR SELECT MAX(COAR_CTAIVAV), SUM(FADE_IVAMONTO), SUM(FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), sum(FADE_CONSUMO)
            FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_DETALLE F
            WHERE F.FACT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
            GROUP BY COAR_CTAIVAV
            INTO :CTAIVA, :IMPTOS, :MONTO, :VALORADIC
        DO
            BEGIN
            if (FOMENTO = 'SI') then
                MONTO = MONTO + VALORADIC;
            MONTO = MONTO * -1;
            MONTO = MONTO * FACTOR;
            IMPTOS = IMPTOS * FACTOR;
            execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
            execute procedure redondee(MONTO, DIG) returning_values (MONTO);
            if (IMPTOS <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTAIVA, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT F.ARTI_COD, FADE_IVAMONTO, (FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), TAIV_PORC, FADE_CONSUMO
                        FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_DETALLE F, TARIFA_IVA T
                        WHERE F.FACT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTAIVAV = :CUENTA AND A.TAIV_COD = T.TAIV_COD AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
                        INTO :ART, :IMPTOS, :MONTO, :PORCIVA, :VALORADIC
                    DO
                        BEGIN
                        if (FOMENTO = 'SI') then
                            MONTO = MONTO + VALORADIC;
                        MONTO = MONTO * -1;
                        MONTO = MONTO * FACTOR;
                        IMPTOS = IMPTOS * FACTOR;
                        execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                        if (IMPTOS <> 0) then
                            BEGIN
                            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, :MONTO, :PORCIVA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                            NROI = NROI + 1;
                            SUMA = SUMA + DEBITO - CREDITO;
                            END
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, :MONTO, ABS(:IMPTOS*100/:MONTO), :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    NROI = NROI + 1;
                    SUMA = SUMA - IMPTOS;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, :MONTO, ABS(:IMPTOS*100/:MONTO), :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA - IMPTOS;
                    END
                END   /* IMPTOS <> 0 */
            END /* FOR */
        END /* IVA X ARTICULO */
    if (IVA = 'K') then /* IVA EN CTA CONSTANTE */
        BEGIN
        SELECT SUM(FADE_IVAMONTO), SUM(FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), SUM(FADE_CONSUMO)
            FROM FACTURAS_DETALLE F
            WHERE F.FACT_ID = :IDDOC and FADE_IVAMONTO <> 0 AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
            INTO :IMPTOS, :MONTO, :valoradic;
        if (FOMENTO = 'SI') then
            MONTO = MONTO + VALORADIC;
        MONTO = MONTO * -1;
        MONTO = MONTO * FACTOR;
        IMPTOS = IMPTOS * FACTOR;
        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
        execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
        if (IMPTOS <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTAIVA, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT F.ARTI_COD, (FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), FADE_IVAMONTO, TAIV_PORC, FADE_CONSUMO
                    FROM ARTICULO A, FACTURAS_DETALLE F, TARIFA_IVA T
                    WHERE F.FACT_ID = :IDDOC AND A.TAIV_COD = T.TAIV_COD AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
                    INTO :ART, :MONTO, :IMPTOS, :PORCIVA, :VALORADIC
                    DO
                    BEGIN
                    if (FOMENTO = 'SI') then
                        MONTO = MONTO + VALORADIC;
                    MONTO = MONTO * -1;
                    MONTO = MONTO * FACTOR;
                    IMPTOS = IMPTOS * FACTOR;
                    execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                    execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                    if (IMPTOS <> 0) then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', 0, :IMPTOS, :MONTO, :PORCIVA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        SUMA = SUMA - IMPTOS;
                        END
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', 0, :IMPTOS, :MONTO, ABS(:IMPTOS*100/:MONTO), :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - IMPTOS;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', 0, :IMPTOS, :MONTO, ABS(:IMPTOS*100/:MONTO), :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - IMPTOS;
                END
            END /* IMPTOS <> 0 */
        END /* IVA EN CTA CONSTANTE */
    /* EL IMPOCONSUMO */
    if ((CONSUMO = 'A') AND (FOMENTO <> 'SI')) then
        BEGIN
        FOR SELECT MAX(COAR_CTACONS), SUM(FADE_CONSUMO)
            FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_DETALLE F
            WHERE F.FACT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
            GROUP BY COAR_CTACONS
            INTO :CTACONSUMO, :IMPTOS
        DO
            BEGIN
            execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
            if (IMPTOS <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTACONSUMO, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, REGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT F.ARTI_COD, FADE_CONSUMO
                        FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_DETALLE F
                        WHERE F.FACT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTACONS = :CUENTA AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
                        INTO :ART, :IMPTOS
                    DO
                        BEGIN
                        execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                        if (IMPTOS <> 0) then
                            BEGIN
                            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                            NROI = NROI + 1;
                            SUMA = SUMA - IMPTOS;
                            END
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    NROI = NROI + 1;
                    SUMA = SUMA - IMPTOS;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA - IMPTOS;
                    END
                END /* IMPTOS <> 0 */
            END /* FOR */
        END /* CONSUMO X ARTICULO */
    if ((CONSUMO = 'K') AND (FOMENTO <> 'SI')) then /* CONSUMO EN CTA CONSTANTE */
        BEGIN
        SELECT SUM(FADE_CONSUMO)
            FROM FACTURAS_DETALLE F
            WHERE F.FACT_ID = :IDDOC AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
            INTO :IMPTOS;
        execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
        if (IMPTOS <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTACONSUMO, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT F.ARTI_COD, FADE_CONSUMO
                    FROM ARTICULO A, FACTURAS_DETALLE F
                    WHERE F.FACT_ID = :IDDOC AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
                    INTO :ART, :IMPTOS
                    DO
                    BEGIN
                    execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                    if (IMPTOS <> 0) then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CTACONSUMO, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        SUMA = SUMA - IMPTOS;
                        END
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTACONSUMO, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - IMPTOS;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTACONSUMO, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - IMPTOS;
                END
            END /* IMPTOS <> 0 */
        END /* CONSUMO EN CTA CONSTANTE */
    /* DESCUENTO */
    if ((CTADTO IS NOT NULL) AND (CTADTO <> '')) then
        BEGIN
        execute procedure redondee(VRDTO, DIG) returning_values (VRDTO);
        if (VRDTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTADTO, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRDTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA + VRDTO;
                END
            if (TIPOCUEN = 'N') then
                    BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRDTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA + VRDTO;
                END
            END
        END /* DESCUENTO */
    /* VALOR ADIC */
    if ((CTAADIC IS NOT NULL) AND (CTAADIC <> '')) then
        BEGIN
        execute procedure redondee(VRADIC, DIG) returning_values (VRADIC);
        if (VRADIC <> 0) THEN
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTAADIC, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRADIC, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - VRADIC;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRADIC, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - VRADIC;
                END
            END
        END /* VR. ADIC */
    /* VALOR EXTRA */
    if ((CTAEXTRA IS NOT NULL) AND (CTAEXTRA <> '')) THEN
        BEGIN
        execute procedure redondee(VREXTRA, DIG) returning_values (VREXTRA);
        if (VREXTRA <> 0) THEN
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTAEXTRA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VREXTRA, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - VREXTRA;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VREXTRA, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - VREXTRA;
                END
            END
        END /* VR. EXTRA */
    /* DESCUENTE EL IMPOCONSUMO */
    SELECT SUM(FADE_CONSUMO)
        FROM FACTURAS_DETALLE F WHERE F.FACT_ID = :IDDOC AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL)) INTO :IMPTOS;
    vrsubt = vrsubt - IMPTOS;
    /* RETENCION FUENTE */
    if ((RTFTE = 'C') or (RTFTE = 'K')) then
      BEGIN
      execute procedure redondee(VRRTFTE, DIG) returning_values (VRRTFTE);
      if (VRRTFTE <> 0) then
        BEGIN
        if (RTFTE = 'C') then
            CTARTFTE = TCTARTFTE;
        EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTARTFTE, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :VRSUBT, :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTFTE;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :VRSUBT, :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTFTE;
            END
        /* AUTORETENCION */
        if (FAUTORET <= fecaux) then
            BEGIN
            EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'CUENTA DE AUTORETENCION EN LA FUENTE') returning_values (CTARTFTE);
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTARTFTE INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERROR (31, :IDDOC, :CTARTFTE, 2);
                CUENTA = CTARTFTE;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                begin
                EXECUTE PROCEDURE ERROR (31, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, (:VRSUBT*-1), :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - VRRTFTE;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, (:VRSUBT*-1), :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - VRRTFTE;
                END
            END
        END /* RTFTE */
      END
    if (RTFTE = 'A') then
      BEGIN
      FOR SELECT MAX(COAR_CTARTFTEV), MAX(COAR_RTFTE), MIN(COAR_RTBASE), SUM(FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), SUM((FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO)*COAR_RTFTE)
        FROM CONTABIL_ARTICULO C, FACTURAS_DETALLE F
        WHERE F.FACT_ID = :IDDOC AND F.ARTI_COD = C.ARTI_COD AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
        GROUP BY COAR_CTARTFTEV
        INTO :CTARTFTE, :PRTFTE, :baseadic, :MONTO, :VRRTFTE
        DO
        BEGIN
        MONTO = MONTO * FACTOR;
        if (MONTO >= BASEADIC) then
            BEGIN
            VRRTFTE = VRRTFTE * FACTOR / 100;
            execute procedure redondee(VRRTFTE, DIG) returning_values (VRRTFTE);
            execute procedure redondee(MONTO, DIG) returning_values (MONTO);
            if (VRRTFTE <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTARTFTE, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :MONTO, :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    NROI = NROI + 1;
                    SUMA = SUMA + VRRTFTE;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :MONTO, :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA + VRRTFTE;
                    END
                /* AUTORETENCION */
                if (FAUTORET <= fecaux) then
                    BEGIN
                    EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'CUENTA DE AUTORETENCION EN LA FUENTE') returning_values (CTARTFTE);
                    EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTARTFTE, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
                    if (ERRORC <> 0) then
                        ERROR = ERROR + 1;
                    if (TIPOCUEN = 'C') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, (:MONTO*-1), :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                        NROI = NROI + 1;
                        SUMA = SUMA - VRRTFTE;
                        END
                    if (TIPOCUEN = 'N') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, (:MONTO*-1), :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NROI = NROI + 1;
                        SUMA = SUMA - VRRTFTE;
                        END
                    END
                END
            END
        END /* RTFTE */
      END
    /* RETENCION IVA */
    if ((RTIVA = 'C') or (RTIVA = 'K')) then
      BEGIN
      execute procedure redondee(VRRTIVA, DIG) returning_values (VRRTIVA);
      if (VRRTIVA <> 0) then
        BEGIN
        if (RTIVA = 'C') then
            CTARTIVA = TCTARTIVA;
        EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTARTIVA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTIVA, 0, :VRIVA, :PORC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTIVA;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTIVA, 0, :VRIVA, :PORC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTIVA;
            END
        END /* RTIVA */
      END
    /* RETENCION DE ICA */
    if ((RTICA = 'C') or (RTICA = 'K')) then
      BEGIN
      execute procedure redondee(VRRTICA, DIG) returning_values (VRRTICA);
      if (VRRTICA <> 0) then
        BEGIN
        if (RTICA = 'C') then
            CTARTICA = TCTARTICA;
        EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTARTICA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTICA, 0, :VRSUBT, :PRTICA, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTICA;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTICA, 0, :VRSUBT, :PRTICA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTICA;
            END
        END /* RTICA */
      END
    /* CIERRE EL COMPROBANTE CONTRA LA CUENTA DEL TERCERO O LA CONSTANTE */
    if ((SUMA <> 0) and ((CARTERA = 'C') or (CARTERA = 'K') or (CARTERA = 'J'))) then
        BEGIN
        if (SUMA < 0) then
            BEGIN
            DEBITO = SUMA * -1;
            CREDITO = 0;
            END
        ELSE
            BEGIN
            DEBITO = 0;
            CREDITO = SUMA;
            END
        if (CARTERA = 'C') then
            CTACARTERA = TCTACLIEN;
        if (CARTERA = 'J') then
            BEGIN
            /* BUSQUE LA CUENTA DE LA CAJA */
            SELECT CAJA_CUENTA FROM CAJAS C, PUNTO_VENTA P
                WHERE P.CAJA_ID = C.CAJA_ID AND PTVT_ID = :PTOVTA
                INTO :CTACARTERA;
            END
        EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTACARTERA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :DEBITO, :CREDITO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
        if (TIPOCUEN = 'N') then
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :DEBITO, :CREDITO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
        NROI = NROI + 1;
        END /* SUMA EN CARTERA */
    /* CALCULE COSTOS EN VENTAS */
    EXECUTE PROCEDURE COSTO_EN_VENTAS(31, :IDDOC);
    if (COSTOS = 'A') then
        BEGIN
        FOR SELECT MAX(CTACOS), SUM(CAST(CANT AS DOUBLE PRECISION) * COSTO)
            FROM COSTO_VENTAS
            GROUP BY CTACOS
            INTO :CTACOSTOS, :MONTO
        DO
            BEGIN
            if (MONTO <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTACOSTOS, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT ARTI_COD, CANT * COSTO
                        FROM COSTO_VENTAS
                        WHERE CTACOS = :CUENTA
                        INTO :ART, :MONTO
                    DO
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    NROI = NROI + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    END
                END /* MONTO <> 0 */
            END /* FOR */
        END /* COSTOS */
    if (COSTOS = 'K') then
        BEGIN
        SELECT SUM(CAST(CANT AS DOUBLE PRECISION) * COSTO)
            FROM COSTO_VENTAS
            INTO :MONTO;
        if (MONTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTACOSTOS, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, REGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT ARTI_COD, CANT * COSTO
                    FROM COSTO_VENTAS
                    INTO :ART, :MONTO
                DO
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTACOSTOS, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                    NROI = NROI + 1;
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTACOSTOS, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTACOSTOS, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                END
            END /* MONTO <> 0 */
        END /* COSTOS = K */
    if (INVEN = 'A') then
        BEGIN
        FOR SELECT MAX(CTAINV), SUM(CAST(CANT AS DOUBLE PRECISION) * COSTO)
            FROM COSTO_VENTAS
            GROUP BY CTAINV
            INTO :CTAINVEN, :MONTO
        DO
            BEGIN
            if (MONTO <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTAINVEN, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, REGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT ARTI_COD, CANT * COSTO
                        FROM COSTO_VENTAS
                        WHERE CTAINV = :CUENTA
                        INTO :ART, :MONTO
                    DO
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    NROI = NROI + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    END
                END /* MONTO <> 0 */
            END /* FOR */
        END /* INVEN = A */
    if (INVEN = 'K') then
        BEGIN
        SELECT SUM(CAST(CANT AS DOUBLE PRECISION) * COSTO)
            FROM COSTO_VENTAS
            INTO :MONTO;
        if (MONTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTAINVEN, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT ARTI_COD, CANT * COSTO
                    FROM COSTO_VENTAS
                    INTO :ART, :MONTO
                DO
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTAINVEN, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                    NROI = NROI + 1;
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAINVEN, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAINVEN, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                END
            END /* MONTO <> 0 */
        END /* INVEN = K */
    /* recorra las cuentas adicionales */
    FOR SELECT INVC_CUENTA, INVC_BASE, INVC_PORC, INVC_VALOR, INVC_DB
        FROM INTERFAZ_VENTAS_CTAS
        WHERE INVE_ID = :IDINTER
        INTO :CTADIC, :BASEADIC, :PORCADIC, :VALORADIC, :DBADIC
        DO
        BEGIN
        if (VALORADIC <> 0) then
            MONTO = VALORADIC;
        ELSE
            BEGIN
            if (:BASEADIC = 'SUBTOTAL') then
                VALORADIC = vrsubt;
            if (:BASEADIC = 'DESCUENTO') then
                VALORADIC = VRDTO;
            if (:BASEADIC = 'IVA') then
                VALORADIC = VRIVA;
            if (:BASEADIC = 'ADICIONAL') then
                VALORADIC = VRADIC;
            if (:BASEADIC = 'EXTRA') then
                VALORADIC = VREXTRA;
            if (:BASEADIC = 'TOTAL') then
                VALORADIC = VRTOTAL;
            MONTO = VALORADIC * PORCADIC / 100;
            END
        if (MONTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTADIC, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                if (DBADIC = 'S') then
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                ELSE
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                if (DBADIC = 'S') then
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                ELSE
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                END
            NROI = NROI + 1;
            END
        END
    if (ERROR > 0) then
        VER = 'S';
    SUSPEND;
    END /* NO ANULADO */
  END /* EXISTE LA INTERFAZ */
ELSE
    BEGIN
    EXECUTE PROCEDURE ERROR (31, :IDDOC, :PREF, 1);
    ERROR = ERROR + 1;
    VER = 'S';
    SUSPEND;
    END
END

^

SET TERM ; ^

SET TERM ^ ;

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

^

SET TERM ; ^

SET TERM ^ ;

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

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE DEVOLUCIONES_SIN_CONTABILIDAD(
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    ID INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    ESTADO VARCHAR(20),
    IDI INTEGER,
    IDC INTEGER)
AS
DECLARE VARIABLE VER CHAR(2);
declare variable FECICNT VARCHAR(10);
declare variable FECFCNT VARCHAR(10);
declare variable ERROR INTEGER;
declare variable idref INTEGER;
BEGIN
EXECUTE PROCEDURE fecha_a_conta(FECINI) returning_values (FECICNT);
EXECUTE PROCEDURE fecha_a_conta(FECFIN) returning_values (FECFCNT);
FOR SELECT DEVT_ID, PREF_PRE, DEVT_NUMERO FROM devoluciones_ventas WHERE DEVT_ANULADO = 'N' AND
    DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN
    INTO :ID, :PREF, :NUMERO
DO
  BEGIN
  idref = null;
  SELECT ENCO_IDREF FROM COMPROBANTE_ENCABEZADO WHERE ENCO_TIPOREF = 33 AND ENCO_FECHA >= :FECICNT AND ENCO_FECHA <= :FECFCNT and ENCO_IDREF = :id into :idref;
  if (idref IS NULL) then
  begin
   ESTADO = 'PROCESANDO';
   SUSPEND;
   SELECT MAX(INVE_ID) FROM INTERFAZ_VENTAS WHERE PREF_PRE = :PREF AND TIDO_COD = 33 INTO :IDI;
   EXECUTE PROCEDURE contabil_devolcli (:ID, :IDI) RETURNING_VALUES (:ERROR, :VER, :IDC);
   if (ERROR = 0) then
    BEGIN
    EXECUTE PROCEDURE CONTABILIZA_PENDIENTE (:IDC);
    ESTADO = 'OK';
    END
   ELSE
    ESTADO = 'ERROR';
   suspend;
  End
  END
END

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE FACTURAS_SIN_CONTABILIDAD(
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    ID INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    ESTADO VARCHAR(20),
    IDI INTEGER,
    IDC INTEGER)
AS
DECLARE VARIABLE VER CHAR(2);
declare variable FECICNT VARCHAR(10);
declare variable FECFCNT VARCHAR(10);
declare variable ERROR INTEGER;
declare variable idref INTEGER;
BEGIN
EXECUTE PROCEDURE fecha_a_conta(FECINI) returning_values (FECICNT);
EXECUTE PROCEDURE fecha_a_conta(FECFIN) returning_values (FECFCNT);
FOR SELECT FACT_ID, PREF_PRE, FACT_NUMERO FROM FACTURAS WHERE FACT_ANULADO = 'N' AND
    FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN INTO :ID, :PREF, :NUMERO
DO
  BEGIN
  idref = null;
  SELECT ENCO_IDREF FROM COMPROBANTE_ENCABEZADO WHERE ENCO_TIPOREF = 31 AND ENCO_FECHA >= :FECICNT AND ENCO_FECHA <= :FECFCNT and ENCO_IDREF = :ID into :idref;
  if (idref IS NULL) then
  begin
   ESTADO = 'PROCESANDO';
   ERROR = NULL;
   SUSPEND;
   SELECT MAX(INVE_ID) FROM INTERFAZ_VENTAS WHERE PREF_PRE = :PREF AND TIDO_COD = 31 INTO :IDI;
   EXECUTE PROCEDURE CONTABIL_FACTURA (:ID, :IDI) RETURNING_VALUES (:ERROR, VER, :IDC);
   if ((ERROR = 0) or (error IS NULL)) then
    BEGIN
    EXECUTE PROCEDURE CONTABILIZA_PENDIENTE (:IDC);
    ESTADO = 'OK';
    END
   ELSE
    ESTADO = 'ERROR';
   suspend;
  end
  END
END

^

SET TERM ; ^


/* 20090303B : AMBIGUOS TERC_NIT POR CAMPO EN COMPROBANTE_ENCABEZADO Y CORRECCION MM1003 */

ALTER PROCEDURE AUXILIAR_ARTICULO_MES (
    CUENTA VARCHAR(20) CHARACTER SET NONE,
    ARTICULO VARCHAR(15) CHARACTER SET NONE,
    ANO CHAR(4) CHARACTER SET NONE,
    PERIODO INTEGER)
RETURNS (
    ID INTEGER,
    TIPOCOMP VARCHAR(3) CHARACTER SET NONE,
    PREFIJO VARCHAR(4) CHARACTER SET NONE,
    NUMERO VARCHAR(6) CHARACTER SET NONE,
    FECHA CHAR(8) CHARACTER SET NONE,
    CONCEPTO VARCHAR(31) CHARACTER SET NONE,
    NIT VARCHAR(15) CHARACTER SET NONE,
    REF VARCHAR(20) CHARACTER SET NONE,
    BASE NUMERIC(18,2),
    PORC NUMERIC(9,4),
    DEBITO NUMERIC(18,2),
    CREDITO NUMERIC(18,2),
    PROYECTO VARCHAR(4) CHARACTER SET NONE,
    CENTRO VARCHAR(4) CHARACTER SET NONE,
    TIPOREF INTEGER,
    IDREF INTEGER)
AS
BEGIN
  /* TRAE LOS MOV. DEL MES DE LA CUENTA y articulo DADOS */
  FOR SELECT E.ENCO_CONSEC, TICO_COD, PRCO_PREF, ENCO_NUMERO, ENCO_FECHA, CODE_CONCEPTO, D.TERC_NIT, CODE_REFER, CODE_BASE, CODE_PORC, CODE_DEBITO, CODE_CREDITO, PROY_COD, CENT_COD, ENCO_TIPOREF, ENCO_IDREF
    FROM COMPROBANTE_ENCABEZADO E, COMPROBANTE_DETALLE D
    WHERE E.ENCO_CONSEC = D.ENCO_CONSEC AND CUEN_COD = :CUENTA AND ARTI_COD = :ARTICULO
    INTO :ID, :TIPOCOMP, :PREFIJO, :NUMERO, :FECHA, :CONCEPTO, :NIT, :REF, :BASE, :PORC, :DEBITO, :CREDITO, :PROYECTO, :centro, :TIPOREF, :IDREF
    DO
        BEGIN
        if ((SUBSTR(FECHA, 1, 4) = :ANO) AND (CAST(SUBSTR(FECHA, 5, 6) AS INTEGER) = :PERIODO)) then
            SUSPEND;
        END
END;

/*******************************************************************************
The next statement causes the following error:

Undefined name.
Dynamic SQL Error.
SQL error code = -204.
Ambiguous field name between table COMPROBANTE_ENCABEZADO and table COMPROBANTE_DETALLE .
TERC_NIT.
*******************************************************************************/
ALTER PROCEDURE AUXILIAR_CENTRO_MES (
    CUENTA VARCHAR(20) CHARACTER SET NONE,
    PROYECTO VARCHAR(4) CHARACTER SET NONE,
    CENTRO VARCHAR(4) CHARACTER SET NONE,
    ANO CHAR(4) CHARACTER SET NONE,
    PERIODO INTEGER)
RETURNS (
    ID INTEGER,
    TIPOCOMP VARCHAR(3) CHARACTER SET NONE,
    PREFIJO VARCHAR(4) CHARACTER SET NONE,
    NUMERO VARCHAR(6) CHARACTER SET NONE,
    FECHA CHAR(8) CHARACTER SET NONE,
    CONCEPTO VARCHAR(60) CHARACTER SET NONE,
    REF VARCHAR(20) CHARACTER SET NONE,
    BASE NUMERIC(18,2),
    PORC NUMERIC(9,4),
    DEBITO NUMERIC(18,2),
    CREDITO NUMERIC(18,2),
    NIT VARCHAR(20) CHARACTER SET NONE,
    TIPOREF INTEGER,
    IDREF INTEGER)
AS
BEGIN
  /* TRAE LOS MOV. DEL MES DE LA CUENTA DADA */
  FOR SELECT E.ENCO_CONSEC, TICO_COD, PRCO_PREF, ENCO_NUMERO, ENCO_FECHA, CODE_CONCEPTO, CODE_REFER, CODE_BASE, CODE_PORC, CODE_DEBITO, CODE_CREDITO, D.TERC_NIT, ENCO_TIPOREF, ENCO_IDREF
    FROM COMPROBANTE_ENCABEZADO E, COMPROBANTE_DETALLE D
    WHERE E.ENCO_CONSEC = D.ENCO_CONSEC AND CUEN_COD = :CUENTA AND PROY_COD = :PROYECTO AND CENT_COD = :CENTRO
    INTO :ID, :TIPOCOMP, :PREFIJO, :NUMERO, :FECHA, :CONCEPTO, :REF, :BASE, :PORC, :DEBITO, :CREDITO, :NIT, :TIPOREF, :IDREF
    DO
        BEGIN
        if ((SUBSTR(FECHA, 1, 4) = :ANO) AND (CAST(SUBSTR(FECHA, 5, 6) AS INTEGER) = :PERIODO)) then
            SUSPEND;
        END
END;

/*******************************************************************************
The next statement causes the following error:

Undefined name.
Dynamic SQL Error.
SQL error code = -204.
Ambiguous field name between table COMPROBANTE_ENCABEZADO and table COMPROBANTE_DETALLE .
TERC_NIT.
*******************************************************************************/
ALTER PROCEDURE AUXILIAR_CUENTA_MES (
    CUENTA VARCHAR(20) CHARACTER SET NONE,
    ANO CHAR(4) CHARACTER SET NONE,
    PERIODO INTEGER)
RETURNS (
    ID INTEGER,
    TIPOCOMP VARCHAR(3) CHARACTER SET NONE,
    PREFIJO VARCHAR(4) CHARACTER SET NONE,
    NUMERO VARCHAR(6) CHARACTER SET NONE,
    FECHA CHAR(8) CHARACTER SET NONE,
    CONCEPTO VARCHAR(60) CHARACTER SET NONE,
    NIT VARCHAR(15) CHARACTER SET NONE,
    REF VARCHAR(20) CHARACTER SET NONE,
    BASE NUMERIC(18,2),
    PORC NUMERIC(9,4),
    DEBITO NUMERIC(18,2),
    CREDITO NUMERIC(18,2),
    PROYECTO VARCHAR(4) CHARACTER SET NONE,
    CENTRO VARCHAR(4) CHARACTER SET NONE,
    TIPOREF INTEGER,
    IDREF INTEGER)
AS
BEGIN
  /* TRAE LOS MOV. DEL MES DE LA CUENTA DADA */
  FOR SELECT E.ENCO_CONSEC, TICO_COD, PRCO_PREF, ENCO_NUMERO, ENCO_FECHA, CODE_CONCEPTO, D.TERC_NIT, CODE_REFER, CODE_BASE, CODE_PORC, CODE_DEBITO, CODE_CREDITO, PROY_COD, CENT_COD, ENCO_TIPOREF, ENCO_IDREF
    FROM COMPROBANTE_ENCABEZADO E, COMPROBANTE_DETALLE D
    WHERE E.ENCO_CONSEC = D.ENCO_CONSEC AND CUEN_COD = :CUENTA
    ORDER BY ENCO_FECHA, PRCO_PREF, ENCO_NUMERO
    INTO :ID, :TIPOCOMP, :PREFIJO, :NUMERO, :FECHA, :CONCEPTO, :NIT, :REF, :BASE, :PORC, :DEBITO, :CREDITO, :PROYECTO, :centro, :TIPOREF, :IDREF
    DO
        BEGIN
        if ((SUBSTR(FECHA, 1, 4) = :ANO) AND (CAST(SUBSTR(FECHA, 5, 6) AS INTEGER) = :PERIODO)) then
            SUSPEND;
        END
END;

/*******************************************************************************
The next statement causes the following error:

Undefined name.
Dynamic SQL Error.
SQL error code = -204.
Ambiguous field name between table COMPROBANTE_ENCABEZADO and table COMPROBANTE_DETALLE .
TERC_NIT.
*******************************************************************************/
ALTER PROCEDURE AUXILIAR_TERCERO_MES (
    CUENTA VARCHAR(20) CHARACTER SET NONE,
    TERCERO VARCHAR(20) CHARACTER SET NONE,
    ANO CHAR(4) CHARACTER SET NONE,
    PERIODO INTEGER)
RETURNS (
    ID INTEGER,
    TIPOCOMP VARCHAR(3) CHARACTER SET NONE,
    PREFIJO VARCHAR(4) CHARACTER SET NONE,
    NUMERO VARCHAR(6) CHARACTER SET NONE,
    FECHA CHAR(8) CHARACTER SET NONE,
    CONCEPTO VARCHAR(60) CHARACTER SET NONE,
    REF VARCHAR(20) CHARACTER SET NONE,
    BASE NUMERIC(18,2),
    PORC NUMERIC(9,4),
    DEBITO NUMERIC(18,2),
    CREDITO NUMERIC(18,2),
    PROYECTO VARCHAR(4) CHARACTER SET NONE,
    CENTRO VARCHAR(4) CHARACTER SET NONE,
    TIPOREF INTEGER,
    IDREF INTEGER)
AS
BEGIN
  /* TRAE LOS MOV. DEL MES DE LA CUENTA DADA */
  FOR SELECT E.ENCO_CONSEC, TICO_COD, PRCO_PREF, ENCO_NUMERO, ENCO_FECHA, CODE_CONCEPTO, CODE_REFER, CODE_BASE, CODE_PORC, CODE_DEBITO, CODE_CREDITO, PROY_COD, CENT_COD, ENCO_TIPOREF, ENCO_IDREF
    FROM COMPROBANTE_ENCABEZADO E, COMPROBANTE_DETALLE D
    WHERE E.ENCO_CONSEC = D.ENCO_CONSEC AND CUEN_COD = :CUENTA AND D.TERC_NIT = :TERCERO
    INTO :ID, :TIPOCOMP, :PREFIJO, :NUMERO, :FECHA, :CONCEPTO, :REF, :BASE, :PORC, :DEBITO, :CREDITO, :PROYECTO, :centro, :TIPOREF, :IDREF
    DO
        BEGIN
        if ((SUBSTR(FECHA, 1, 4) = :ANO) AND (CAST(SUBSTR(FECHA, 5, 6) AS INTEGER) = :PERIODO)) then
            SUSPEND;
        END
END;

/*******************************************************************************
The next statement causes the following error:

Undefined name.
Dynamic SQL Error.
SQL error code = -204.
Ambiguous field name between table COMPROBANTE_ENCABEZADO and table COMPROBANTE_DETALLE .
TERC_NIT.
*******************************************************************************/
ALTER PROCEDURE CERTIFICADOS_RETENCION (
    NITINI VARCHAR(20) CHARACTER SET NONE,
    NITFIN VARCHAR(20) CHARACTER SET NONE,
    CTAINI VARCHAR(20) CHARACTER SET NONE,
    CTAFIN VARCHAR(20) CHARACTER SET NONE,
    FECINI VARCHAR(8) CHARACTER SET NONE,
    FECFIN VARCHAR(8) CHARACTER SET NONE,
    FECEXP DATE,
    ADMON VARCHAR(60) CHARACTER SET NONE,
    NUMERAR CHAR(1) CHARACTER SET NONE,
    INICIAL VARCHAR(6) CHARACTER SET NONE)
RETURNS (
    NIT VARCHAR(20) CHARACTER SET NONE,
    NOMBRE VARCHAR(60) CHARACTER SET NONE,
    DIRECCION VARCHAR(60) CHARACTER SET NONE,
    CIUDAD VARCHAR(40) CHARACTER SET NONE,
    CODCUENTA VARCHAR(20) CHARACTER SET NONE,
    NOMCUENTA VARCHAR(60) CHARACTER SET NONE,
    BASE NUMERIC(18,2),
    RETENCION NUMERIC(18,2),
    FECHAEXP DATE,
    ADMINISTRACION VARCHAR(60) CHARACTER SET NONE,
    NUMERO VARCHAR(20) CHARACTER SET NONE)
AS
declare variable actual integer;
begin
FECHAEXP = FECEXP;
ADMINISTRACION = ADMON;
ACTUAL = CAST(INICIAL AS INTEGER);
FOR SELECT TERC_NIT, TERC_NOM, TERC_DIR, TERC_CIU FROM TERCEROS
  WHERE TERC_NIT >= :NITINI AND TERC_NIT <= :NITFIN ORDER BY TERC_NIT
  INTO :NIT, :NOMBRE, :DIRECCION, :CIUDAD
  DO
    BEGIN
    FOR SELECT CUEN_COD, CUEN_NOM FROM CUENTAS WHERE CUEN_RETENCION = 'S' AND
      CUEN_COD >= :CTAINI AND CUEN_COD <= :CTAFIN
      INTO :CODCUENTA, :NOMCUENTA
      DO
        BEGIN
        SELECT SUM(CODE_BASE), SUM(CODE_DEBITO - CODE_CREDITO)
          FROM COMPROBANTE_ENCABEZADO E, COMPROBANTE_DETALLE D
          WHERE E.ENCO_CONSEC = D.ENCO_CONSEC AND CUEN_COD = :CODCUENTA AND D.TERC_NIT = :NIT AND
          ENCO_FECHA >= :FECINI AND ENCO_FECHA <= :FECFIN
          INTO :base,  :RETENCION;
        if (RETENCION <> 0) then
            begin
            if (substr(CODCUENTA, 1, 1) = '2') then
                BEGIN
                BASE = BASE * -1;
                RETENCION = RETENCION * -1;
                END
            if (numerar = 'S') then
                BEGIN
                NUMERO = CAST(ACTUAL AS CHAR(6));
                EXECUTE PROCEDURE COMPLETA_CEROS(NUMERO) returning_values (NUMERO);
                NUMERO = 'NUMERO: ' || NUMERO;
                ACTUAL = ACTUAL + 1;
                END
            ELSE
                NUMERO = '';
            SUSPEND;
            end
        END
    END
end;

/*******************************************************************************
The next statement causes the following error:

Undefined name.
Dynamic SQL Error.
SQL error code = -204.
Ambiguous field name between table COMPROBANTE_DETALLE and table COMPROBANTE_ENCABEZADO .
TERC_NIT.
*******************************************************************************/
ALTER PROCEDURE CHEQUEO_SALDOS_CONTA (
    FECINI CHAR(8) CHARACTER SET NONE,
    CTAINI VARCHAR(20) CHARACTER SET NONE,
    CTAFIN VARCHAR(20) CHARACTER SET NONE)
AS
declare variable CUENTA VARCHAR(20);
declare variable NIT VARCHAR(20);
declare variable PROY VARCHAR(4);
declare variable CENTRO VARCHAR(4);
declare variable ARTIC VARCHAR(15);
declare variable DEBITOS NUMERIC(15,2);
declare variable CREDITOS NUMERIC(15,2);
declare variable FECHA CHAR(8);
DECLARE VARIABLE ANO CHAR(4);
DECLARE VARIABLE MES CHAR(2);
DECLARE VARIABLE INICIAL CHAR(8);
DECLARE VARIABLE EXISTE CHAR(1);
declare variable CUENTAUX VARCHAR(20);
BEGIN
DELETE FROM saldos_centros_TERCERO WHERE SACU_FECHA >= :FECINI AND CUEN_COD >= :CTAINI AND CUEN_COD <= :CTAFIN;
DELETE FROM saldos_centros WHERE SACU_FECHA >= :FECINI AND CUEN_COD >= :CTAINI AND CUEN_COD <= :CTAFIN;
DELETE FROM saldos_terceros WHERE SACU_FECHA >= :FECINI AND CUEN_COD >= :CTAINI AND CUEN_COD <= :CTAFIN;
DELETE FROM SALDOS_ARTICULO WHERE SAAR_FECHA >= :FECINI AND CUEN_COD >= :CTAINI AND CUEN_COD <= :CTAFIN;
DELETE FROM saldos_cuentas WHERE SACU_FECHA >= :FECINI AND CUEN_COD >= :CTAINI AND CUEN_COD <= :CTAFIN;
/* BORRE LOS DB Y CR EN CERO */
UPDATE COMPROBANTE_DETALLE SET CODE_DEBITO = 0 WHERE CODE_DEBITO IS NULL;
UPDATE COMPROBANTE_DETALLE SET CODE_CREDITO = 0 WHERE CODE_CREDITO IS NULL;
/* EMPIECE CON LOS SALDOS INICIALES */
EXECUTE PROCEDURE LEE_CONFIGURACION('CONTABILIDAD', 'GENERAL', 'AÑO DE INICIO') RETURNING_VALUES (ANO);
EXECUTE PROCEDURE LEE_CONFIGURACION('CONTABILIDAD', 'GENERAL', 'MES DE INICIO') RETURNING_VALUES (MES);
EXECUTE PROCEDURE compone_fecha_conta (ANO, MES, 1) returning_values (INICIAL);
if (FECINI <= INICIAL) then
    BEGIN
    FOR SELECT CUEN_COD, TERC_NIT, PROY_COD, CENT_COD, ARTI_COD, SAIN_DEBITO, SAIN_CREDITO FROM SALDOS_INICIALES INTO :CUENTA, :NIT, :PROY, :CENTRO, :ARTIC, :DEBITOS, :CREDITOS
        DO
        BEGIN
        /* Busque en saldos_cuentas la cuenta y la fecha, si la encuentra actualice INICIAL, si no inserte un registro */
        CUENTAUX = CUENTA;
        WHILE (CUENTAUX <> '') DO
            BEGIN
            EXISTE = 'N';
            SELECT 'S' FROM SALDOS_CUENTAS
                WHERE (CUEN_COD = :CUENTAUX) AND (SACU_FECHA = :INICIAL) INTO :EXISTE;
            IF (EXISTE = 'N') THEN
                BEGIN
                INSERT INTO SALDOS_CUENTAS(CUEN_COD, SACU_FECHA, SACU_SALDO, SACU_DEBITO, SACU_CREDITO)
                    VALUES (:CUENTAUX, :INICIAL, :DEBITOS-:CREDITOS, 0, 0);
                END
            ELSE
                BEGIN
                UPDATE SALDOS_CUENTAS
                    SET SACU_SALDO = SACU_SALDO + :DEBITOS - :CREDITOS
                    WHERE (CUEN_COD = :CUENTAUX) AND (SACU_FECHA = :INICIAL);
                END
            EXECUTE PROCEDURE PADRE(CUENTAUX) RETURNING_VALUES (CUENTAUX);
            END
    
        /* Busque en saldos_TERCEROS si la encuentra actualice INICIAL, si no inserte un registro */
        EXISTE = 'N';
        SELECT 'S' FROM SALDOS_TERCEROS
            WHERE (CUEN_COD = :CUENTA) AND (TERC_NIT = :NIT) AND (SACU_FECHA = :INICIAL) INTO :EXISTE;
        IF (EXISTE = 'N') THEN
            BEGIN
            INSERT INTO SALDOS_TERCEROS(CUEN_COD, TERC_NIT, SACU_FECHA, SATE_SALDO, SATE_DEBITO, SATE_CREDITO)
                VALUES (:CUENTA, :NIT, :INICIAL, :DEBITOS-:CREDITOS, 0, 0);
            END
        ELSE
            BEGIN
            UPDATE SALDOS_TERCEROS
                SET SATE_SALDO = SATE_SALDO + :DEBITOS - :CREDITOS
                WHERE (CUEN_COD = :CUENTA) AND (TERC_NIT = :NIT) AND (SACU_FECHA = :INICIAL);
            END
        /* Busque en saldos_CENTROS si la encuentra actualice INICIAL, si no inserte un registro */
        EXISTE = 'N';
        SELECT 'S' FROM SALDOS_CENTROS
            WHERE (CUEN_COD = :CUENTA) AND (PROY_COD = :PROY) AND (CENT_COD = :CENTRO) AND (SACU_FECHA = :INICIAL) INTO :EXISTE;
        IF (EXISTE = 'N') THEN
            BEGIN
            INSERT INTO SALDOS_CENTROS(CUEN_COD, PROY_COD, CENT_COD, SACU_FECHA, SACE_SALDO, SACE_DEBITO, SACE_CREDITO)
                VALUES (:CUENTA, :PROY, :CENTRO, :INICIAL, :DEBITOS-:CREDITOS, 0, 0);
            END
        ELSE
            BEGIN
            UPDATE SALDOS_CENTROS
                SET SACE_SALDO = SACE_SALDO + :DEBITOS - :CREDITOS
                WHERE (CUEN_COD = :CUENTA) AND (PROY_COD = :PROY) AND (CENT_COD = :CENTRO) AND (SACU_FECHA = :INICIAL);
            END
        /* Busque en saldos_CENTROS-TERCERO si la encuentra actualice INICIAL, si no inserte un registro */
        EXISTE = 'N';
        SELECT 'S' FROM SALDOS_CENTROS_TERCERO
            WHERE (CUEN_COD = :CUENTA) AND (PROY_COD = :PROY) AND (CENT_COD = :CENTRO) AND (TERC_NIT = :NIT) AND (SACU_FECHA = :INICIAL) INTO :EXISTE;
        IF (EXISTE = 'N') THEN
            BEGIN
            INSERT INTO SALDOS_CENTROS_TERCERO(CUEN_COD, PROY_COD, CENT_COD, TERC_NIT, SACU_FECHA, SACT_SALDO, SACT_DEBITO, SACT_CREDITO)
                VALUES (:CUENTA, :PROY, :CENTRO, :NIT, :INICIAL, :DEBITOS-:CREDITOS, 0, 0);
            END
        ELSE
            BEGIN
            UPDATE SALDOS_CENTROS_TERCERO
                SET SACT_SALDO = SACT_SALDO + :DEBITOS - :CREDITOS
                WHERE (CUEN_COD = :CUENTA) AND (PROY_COD = :PROY) AND (CENT_COD = :CENTRO) AND (TERC_NIT = :NIT) AND (SACU_FECHA = :INICIAL);
            END
        /* LOS DETALLADOS POR ARTICULO */
        if (ARTIC IS NOT NULL) then
            BEGIN
            EXISTE = 'N';
            SELECT 'S' FROM SALDOS_ARTICULO
                WHERE (CUEN_COD = :CUENTA) AND (ARTI_COD = :ARTIC) AND (SAAR_FECHA = :INICIAL) INTO :EXISTE;
            IF (EXISTE = 'N') THEN
                BEGIN
                INSERT INTO SALDOS_ARTICULO(CUEN_COD, ARTI_COD, SAAR_FECHA, SAAR_SALDO, SAAR_DEBITOS, SAAR_CREDITOS)
                    VALUES (:CUENTA, :ARTIC, :INICIAL, :DEBITOS-:CREDITOS, 0, 0);
                END
            ELSE
                BEGIN
                UPDATE SALDOS_ARTICULO
                    SET SAAR_SALDO = SAAR_SALDO + :DEBITOS - :CREDITOS
                    WHERE (CUEN_COD = :CUENTA) AND (ARTI_COD = :ARTIC) AND (SAAR_FECHA = :INICIAL);
                END
            END
        END
    END /* SI DESDE EL INICIO */
/* AHORA LOS MOVIMIENTOS */
FOR SELECT CUEN_COD, D.TERC_NIT, PROY_COD, CENT_COD, ARTI_COD, CODE_DEBITO, CODE_CREDITO, ENCO_FECHA
    FROM COMPROBANTE_DETALLE d, COMPROBANTE_ENCABEZADO C WHERE C.ENCO_CONSEC = d.enco_consec AND ENCO_FECHA >= :FECINI
    ORDER BY ENCO_FECHA, CUEN_COD, D.TERC_NIT
    INTO :CUENTA, :NIT, :PROY, :CENTRO, :ARTIC, :DEBITOS, :CREDITOS, :FECHA
    DO
    BEGIN
    EXECUTE PROCEDURE ACTUALICE_SALDO_CUENTA(:CUENTA, FECHA, :DEBITOS, :CREDITOS);
    EXECUTE PROCEDURE ACTUALICE_SALDO_TERCERO(:CUENTA, :NIT, FECHA, :DEBITOS, :CREDITOS);
    EXECUTE PROCEDURE ACTUALICE_SALDO_CENTRO(:CUENTA, :PROY, :CENTRO, FECHA, :DEBITOS, :CREDITOS);
    EXECUTE PROCEDURE ACTUALICE_SALDO_CENTRO_TERCERO(:CUENTA, :PROY, :CENTRO, :NIT, FECHA, :DEBITOS, :CREDITOS);
    IF (ARTIC IS NOT NULL) THEN
        EXECUTE PROCEDURE ACTUALICE_SALDO_ARTICULO(:CUENTA, :ARTIC, :FECHA, :DEBITOS, :CREDITOS);
    END
END;

/*******************************************************************************
The next statement causes the following error:

Undefined name.
Dynamic SQL Error.
SQL error code = -204.
Ambiguous field name between table COMPROBANTE_ENCABEZADO and table COMPROBANTE_DETALLE .
TERC_NIT.
*******************************************************************************/
ALTER PROCEDURE COMPROBANTES_DIARIO (
    FECINI VARCHAR(8) CHARACTER SET NONE,
    FECFIN VARCHAR(8) CHARACTER SET NONE,
    CONSOLIDADO CHAR(1) CHARACTER SET NONE)
RETURNS (
    ID INTEGER,
    TIPOCOMP VARCHAR(3) CHARACTER SET NONE,
    PREFIJO VARCHAR(4) CHARACTER SET NONE,
    NUMERO VARCHAR(6) CHARACTER SET NONE,
    FECHA CHAR(8) CHARACTER SET NONE,
    CUENTA VARCHAR(20) CHARACTER SET NONE,
    NIT VARCHAR(15) CHARACTER SET NONE,
    PROYECTO VARCHAR(4) CHARACTER SET NONE,
    CENTRO VARCHAR(4) CHARACTER SET NONE,
    CONCEPTO VARCHAR(60) CHARACTER SET NONE,
    REF VARCHAR(20) CHARACTER SET NONE,
    BASE NUMERIC(18,2),
    PORC NUMERIC(9,4),
    DEBITO NUMERIC(18,2),
    CREDITO NUMERIC(18,2),
    TIPOREF INTEGER,
    IDREF INTEGER)
AS
BEGIN
  /* TRAE LOS COMPROBANTES SEGUN EL RANGO DADO */
  if (:CONSOLIDADO = 'S') then
    BEGIN
    FOR SELECT MAX(E.ENCO_CONSEC), MAX(TICO_COD), MAX(PRCO_PREF), MAX(ENCO_NUMERO), MAX(ENCO_FECHA), MAX(ENCO_CONCEPTO), MAX(ENCO_REFER), SUM(CODE_BASE), SUM(CODE_DEBITO), SUM(CODE_CREDITO), MAX(ENCO_TIPOREF), MAX(ENCO_IDREF)
        FROM COMPROBANTE_ENCABEZADO E, COMPROBANTE_DETALLE D
        WHERE E.ENCO_CONSEC = D.ENCO_CONSEC AND ENCO_FECHA >= :FECINI AND ENCO_FECHA <= :FECFIN
        GROUP BY ENCO_FECHA, TICO_COD, E.ENCO_CONSEC
        ORDER BY ENCO_FECHA, TICO_COD, E.ENCO_CONSEC
        INTO :ID, :TIPOCOMP, :PREFIJO, :NUMERO, :FECHA, :CONCEPTO, :REF, :BASE, :DEBITO, :CREDITO, :TIPOREF, :IDREF
        DO
            SUSPEND;
    END
  ELSE
    BEGIN
    FOR SELECT E.ENCO_CONSEC, TICO_COD, PRCO_PREF, ENCO_NUMERO, ENCO_FECHA, CUEN_COD, CODE_CONCEPTO, D.TERC_NIT, CODE_REFER, CODE_BASE, CODE_PORC, CODE_DEBITO, CODE_CREDITO, PROY_COD, CENT_COD
        FROM COMPROBANTE_ENCABEZADO E, COMPROBANTE_DETALLE D
        WHERE E.ENCO_CONSEC = D.ENCO_CONSEC AND ENCO_FECHA >= :FECINI AND ENCO_FECHA <= :FECFIN
        ORDER BY ENCO_FECHA, TICO_COD, E.ENCO_CONSEC
        INTO :ID, :TIPOCOMP, :PREFIJO, :NUMERO, :FECHA, :CUENTA, :CONCEPTO, :NIT, :REF, :BASE, :PORC, :DEBITO, :CREDITO, :PROYECTO, :centro
        DO
            SUSPEND;
    END
END;

/*******************************************************************************
The next statement causes the following error:

Undefined name.
Dynamic SQL Error.
SQL error code = -204.
Ambiguous field name between table COMPROBANTE_ENCABEZADO and table COMPROBANTE_DETALLE .
TERC_NIT.
*******************************************************************************/
ALTER PROCEDURE COMPROBANTES_TERCERO (
    NIT VARCHAR(20) CHARACTER SET NONE)
RETURNS (
    ID INTEGER,
    TIPO VARCHAR(3) CHARACTER SET NONE,
    PREFIJO VARCHAR(4) CHARACTER SET NONE,
    NUMERO VARCHAR(6) CHARACTER SET NONE,
    FECHA CHAR(8) CHARACTER SET NONE,
    CONCEPTO VARCHAR(60) CHARACTER SET NONE,
    REF VARCHAR(20) CHARACTER SET NONE,
    TIPOREF INTEGER)
AS
BEGIN
  /* TRAE LOS COMPROBANTES SEGUN EL RANGO DADO */
    FOR SELECT MAX(E.ENCO_CONSEC), MAX(TICO_COD), MAX(PRCO_PREF), MAX(ENCO_NUMERO), MAX(ENCO_FECHA), MAX(ENCO_CONCEPTO), MAX(ENCO_REFER), MAX(ENCO_TIPOREF)
        FROM COMPROBANTE_ENCABEZADO E, COMPROBANTE_DETALLE D
        WHERE E.ENCO_CONSEC = D.ENCO_CONSEC AND D.TERC_NIT = :NIT
        GROUP BY ENCO_FECHA, TICO_COD, E.ENCO_CONSEC
        ORDER BY ENCO_FECHA, TICO_COD, E.ENCO_CONSEC
        INTO :ID, :TIPO, :PREFIJO, :NUMERO, :FECHA, :CONCEPTO, :REF, :TIPOREF
        DO
            SUSPEND;
END;

/*******************************************************************************
The next statement causes the following error:

Undefined name.
Dynamic SQL Error.
SQL error code = -204.
Ambiguous field name between table COMPROBANTE_ENCABEZADO and table COMPROBANTE_DETALLE .
TERC_NIT.
*******************************************************************************/
ALTER PROCEDURE CONSECUTIVOS_CONTA (
    TIPOINI VARCHAR(3) CHARACTER SET NONE,
    TIPOFIN VARCHAR(3) CHARACTER SET NONE,
    PREFINI VARCHAR(4) CHARACTER SET NONE,
    PREFFIN VARCHAR(4) CHARACTER SET NONE,
    NUMINI VARCHAR(6) CHARACTER SET NONE,
    NUMFIN VARCHAR(6) CHARACTER SET NONE,
    CONSOLIDADO CHAR(1) CHARACTER SET NONE)
RETURNS (
    ID INTEGER,
    TIPOCOMP VARCHAR(3) CHARACTER SET NONE,
    PREFIJO VARCHAR(4) CHARACTER SET NONE,
    NUMERO VARCHAR(6) CHARACTER SET NONE,
    FECHA CHAR(8) CHARACTER SET NONE,
    CUENTA VARCHAR(20) CHARACTER SET NONE,
    NIT VARCHAR(15) CHARACTER SET NONE,
    PROYECTO VARCHAR(4) CHARACTER SET NONE,
    CENTRO VARCHAR(4) CHARACTER SET NONE,
    CONCEPTO VARCHAR(60) CHARACTER SET NONE,
    REF VARCHAR(20) CHARACTER SET NONE,
    BASE NUMERIC(18,2),
    PORC NUMERIC(9,4),
    DEBITO NUMERIC(18,2),
    CREDITO NUMERIC(18,2),
    TIPOREF INTEGER,
    IDREF INTEGER,
    NOMTIPO VARCHAR(60) CHARACTER SET NONE)
AS
BEGIN
  /* TRAE LOS COMPROBANTES SEGUN EL RANGO DADO */
  if (:CONSOLIDADO = 'S') then
    BEGIN
    FOR SELECT MAX(E.ENCO_CONSEC), MAX(E.TICO_COD), MAX(PRCO_PREF), MAX(ENCO_NUMERO), MAX(ENCO_FECHA), MAX(ENCO_CONCEPTO), MAX(ENCO_REFER), SUM(CODE_BASE), SUM(CODE_DEBITO), SUM(CODE_CREDITO), MAX(ENCO_TIPOREF), MAX(ENCO_IDREF), MAX(TICO_NOM)
        FROM COMPROBANTE_ENCABEZADO E, COMPROBANTE_DETALLE D, TIPO_COMPROBANTE T
        WHERE E.ENCO_CONSEC = D.ENCO_CONSEC AND E.TICO_COD = T.TICO_COD AND E.TICO_COD >= :TIPOINI AND E.TICO_COD <= :TIPOFIN AND PRCO_PREF >= :PREFINI AND PRCO_PREF <= :PREFFIN AND ENCO_NUMERO >= :NUMINI AND ENCO_NUMERO <= :NUMFIN
        GROUP BY E.TICO_COD, PRCO_PREF, ENCO_NUMERO, E.ENCO_CONSEC
        ORDER BY E.TICO_COD, PRCO_PREF, ENCO_NUMERO, E.ENCO_CONSEC
        INTO :ID, :TIPOCOMP, :PREFIJO, :NUMERO, :FECHA, :CONCEPTO, :REF, :BASE, :DEBITO, :CREDITO, :TIPOREF, :IDREF, :NOMTIPO
        DO
            SUSPEND;
    END
  ELSE
    BEGIN
    FOR SELECT E.ENCO_CONSEC, E.TICO_COD, PRCO_PREF, ENCO_NUMERO, ENCO_FECHA, CUEN_COD, CODE_CONCEPTO, D.TERC_NIT, CODE_REFER, CODE_BASE, CODE_PORC, CODE_DEBITO, CODE_CREDITO, PROY_COD, CENT_COD, TICO_NOM
        FROM COMPROBANTE_ENCABEZADO E, COMPROBANTE_DETALLE D, TIPO_COMPROBANTE T
        WHERE E.ENCO_CONSEC = D.ENCO_CONSEC AND E.TICO_COD = T.TICO_COD AND E.TICO_COD >= :TIPOINI AND E.TICO_COD <= :TIPOFIN AND PRCO_PREF >= :PREFINI AND PRCO_PREF <= :PREFFIN AND ENCO_NUMERO >= :NUMINI AND ENCO_NUMERO <= :NUMFIN
        ORDER BY E.TICO_COD, PRCO_PREF, ENCO_NUMERO, CODE_ITEM
        INTO :ID, :TIPOCOMP, :PREFIJO, :NUMERO, :FECHA, :CUENTA, :CONCEPTO, :NIT, :REF, :BASE, :PORC, :DEBITO, :CREDITO, :PROYECTO, :centro, :NOMTIPO
        DO
            SUSPEND;
    END
END;

/*******************************************************************************
The next statement causes the following error:

Undefined name.
Dynamic SQL Error.
SQL error code = -204.
Ambiguous field name between table COMPROBANTE_DETALLE and table COMPROBANTE_ENCABEZADO .
TERC_NIT.
*******************************************************************************/
ALTER PROCEDURE CONTABIL_RECICAJA (
    IDDOC INTEGER,
    IDINTER INTEGER)
RETURNS (
    ERROR INTEGER,
    VER CHAR(1) CHARACTER SET NONE,
    IDC INTEGER)
AS
declare variable PREF VARCHAR(4);
declare variable NUM VARCHAR(6);
declare variable FECAUX DATE;
declare variable FECHA CHAR(8);
declare variable CONC CHAR(120);
declare variable VRDTO NUMERIC(18, 2);
declare variable VRRTFTE NUMERIC(18, 2);
declare variable VRRTIVA NUMERIC(18, 2);
declare variable VRRTICA NUMERIC(18, 2);
declare variable VRTOTAL NUMERIC(18, 2);
declare variable TIPOCOMP VARCHAR(3);
declare variable PREFCONT VARCHAR(4);
declare variable BASE CHAR(1);
declare variable CTABASE VARCHAR(20);
declare variable CAJA CHAR(1);
declare variable CTACAJA VARCHAR(20);
declare variable RTFTE CHAR(1);
declare variable CTARTFTE VARCHAR(20);
declare variable RTIVA CHAR(1);
declare variable CTARTIVA VARCHAR(20);
declare variable RTICA CHAR(1);
declare variable CTARTICA VARCHAR(20);
declare variable DTO CHAR(1);
declare variable CTADTO VARCHAR(20);
declare variable EXISTE CHAR(1);
declare variable CUENTA VARCHAR(20);
declare variable MONTO NUMERIC(18,2);
declare variable ES_RETENCION CHAR(1);
declare variable TIPOCUEN CHAR(1);
declare variable NIT VARCHAR(20);
declare variable PROY VARCHAR(4);
declare variable CENTRO VARCHAR(4);
declare variable DEBITO NUMERIC(18,2);
declare variable CREDITO NUMERIC(18,2);
declare variable NROI INTEGER;
declare variable SUMA NUMERIC(18,2);
declare variable TCTACLIEN VARCHAR(20);
declare variable TCTARTFTE VARCHAR(20);
declare variable TCTARTIVA VARCHAR(20);
declare variable TCTARTICA VARCHAR(20);
declare variable TIPOIT INTEGER;
declare variable PREFIT VARCHAR(4);
declare variable NUMIT VARCHAR(6);
declare variable NUMEROIT VARCHAR(10);
declare variable ABONOIT NUMERIC(18,2);
declare variable CTADIC VARCHAR(20);
declare variable BASEADIC VARCHAR(20);
declare variable PORCADIC NUMERIC(5,2);
declare variable VALORADIC NUMERIC(18,2);
declare variable DBADIC CHAR(1);
declare variable ANULADO CHAR(1);
declare variable VRBASE NUMERIC(18,2);
declare variable PORC numeric(9,2);
declare variable OK INTEGER;
declare variable CRUCES NUMERIC(18,2);
declare variable VRCAJA NUMERIC(18,2);
declare variable DIFCAMBIO NUMERIC(18,2);
declare variable CTADIF VARCHAR(20);
declare variable PROVID INTEGER;
BEGIN
ERROR = 0;
/* BUSQUE LA INTERFACE */
EXISTE = 'N';
SELECT 'S', TICO_COD, PRCO_PRE, INCJ_BASE, INCJ_DTOPP, INCJ_RTFTE, INCJ_RTIVA, INCJ_RTICA, INCJ_CAJA, INCJ_CTABASE, INCJ_CTADTO, INCJ_CTARTFTE, INCJ_CTARTIVA, INCJ_CTARTICA, INCJ_CTACAJA, INCJ_CONFIRMAR
    FROM INTERFAZ_CAJA
    WHERE INCJ_ID = :IDINTER
    INTO :EXISTE, :TIPOCOMP, :PREFCONT, :BASE, :DTO, :RTFTE, :RTIVA, :RTICA, :CAJA, :CTABASE, :CTADTO, :CTARTFTE, :CTARTIVA, :CTARTICA, :CTACAJA, :VER;
if (EXISTE = 'S') then
  BEGIN
  /* BORRE LA CONTABILIZACION ANTERIOR */
  OK = 0;
  FOR SELECT CNTB_ID FROM CONTABILIZACION WHERE CNTB_TIPOREF = 61 AND CNTB_IDREF = :IDDOC INTO :OK DO
    BEGIN
    DELETE FROM CONTABILIZACION_DET WHERE CNTB_ID = :OK;
    DELETE FROM CONTABILIZACION WHERE CNTB_ID = :OK;
    END
  /* TRAIGA EL ENCABEZADO DEL RECIBO */
  SELECT PREF_PRE, RECA_NUMERO, RECA_FECHA, R.TERC_NIT, RECA_CONC, RECA_DTOF, RECA_MONTO, RECA_RTFTEMONTO, RECA_RTIVAMONTO, RECA_RTICAMONTO, TERC_CTARTFTE, TERC_CTARTIVA, TERC_CTARTICA, TERC_CTACLIENTE, RECA_ANULADO, RECA_PROVID
    FROM RECIBOS_CAJA R, TERCEROS T
    WHERE RECA_ID = :IDDOC AND R.TERC_NIT = T.TERC_NIT
    INTO :PREF, :NUM, :FECAUX, :NIT, :CONC, :VRDTO, :VRTOTAL, :VRRTFTE, :VRRTIVA, :VRRTICA, :TCTARTFTE, TCTARTIVA, TCTARTICA, TCTACLIEN, :ANULADO, :PROVID;
  if (ANULADO = 'N') then
    BEGIN
    SELECT PREF_CENTRO, PREF_PROY FROM PREFIJOS
        WHERE PREF_PRE = :PREF AND TIDO_COD = 61 INTO :CENTRO, :PROY;
    EXECUTE PROCEDURE FECHA_A_CONTA(:FECAUX) returning_values (:FECHA);
    /* REGISTRE EL ENCABEZADO CONTABLE */
    IDC = GEN_ID(ID_CONTABILIZA, 1);
    INSERT INTO CONTABILIZACION (CNTB_ID, CNTB_TIPOCOMP, CNTB_PREFCNT, CNTB_NUMERO, CNTB_FECHA, CNTB_CONCEPTO, CNTB_REF, CNTB_TIPOREF, CNTB_IDREF, CNTB_PREFREF, CNTB_NUMREF, CNTB_PROCESADO)
        VALUES (:IDC, :TIPOCOMP, :PREFCONT, :NUM, :FECHA, :CONC, '', 61, :IDDOC, :PREF, :NUM, 'N');
    NROI = 0;
    SUMA = 0;
    /* SUME LOS CRUCES PARA LLEVARLOS A LA CUENTA X PAGAR Y RESTAR DE LA CAJA */
    SELECT SUM(RCCR_ABONO) FROM RECIBOS_CAJA_CRUCEC WHERE RECA_ID = :iddoc INTO :CRUCES;
    if (CRUCES IS NULL) then
        CRUCES = 0;
    VRCAJA = VRTOTAL - CRUCES;
    IF ((CAJA = 'K')) THEN
        BEGIN
        if (VRCAJA <> 0) then
            BEGIN
            CUENTA = NULL;
            EXECUTE PROCEDURE VALIDE_CUENTA_C (CTACAJA) RETURNING_VALUES (:OK);
            IF (OK = 0) THEN
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :CTACAJA INTO :CUENTA, :TIPOCUEN;
            ELSE
                begin
                EXECUTE PROCEDURE ERROR (61, :IDDOC, :CTACAJA, 2);
                CUENTA = CTACAJA;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERROR (61, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                EXECUTE PROCEDURE ERROR (61, :IDDOC, :CUENTA, 4);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                IF (VRCAJA > 0) THEN
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRCAJA, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    SUMA = SUMA + VRCAJA;
                    END
                ELSE   
                    BEGIN                     
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                       VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, ABS(:VRCAJA), 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    SUMA = SUMA + VRCAJA;
                    END
                NROI = NROI + 1;
                END
            END /* VRCAJA <> 0 */
        END /* CAJA CONSTANTE */
    IF ((CAJA = 'F')) THEN
        BEGIN
        /* AGRUPE LAS CUENTAS DE LAS FORMAS DE PAGO */
        FOR SELECT MAX(FOPA_CTACONTA), SUM(RCPA_MONTO)
            FROM formas_pago F, recibos_caja_pago R
            WHERE R.RECA_ID = :IDDOC AND R.FOPA_ID = F.FOPA_ID
            GROUP BY FOPA_CTACONTA
            INTO :CTACAJA, :MONTO
        DO
            BEGIN
            if (MONTO <> 0) then
                BEGIN
                CUENTA = NULL;
                EXECUTE PROCEDURE VALIDE_CUENTA_C (CTACAJA) RETURNING_VALUES (:OK);
                IF (OK = 0) THEN
                    SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                        WHERE CUEN_COD = :CTACAJA INTO :CUENTA, :TIPOCUEN;
                ELSE
                    begin
                    EXECUTE PROCEDURE ERROR (61, :IDDOC, :CTACAJA, 2);
                    CUENTA = CTACAJA;
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (61, :IDDOC, :CUENTA, 3);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (61, :IDDOC, :CUENTA, 4);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    IF (MONTO > 0) THEN
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        SUMA = SUMA + MONTO;
                        END
                    ELSE
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, abs(:MONTO), 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        SUMA = SUMA + MONTO;
                        END
                    NROI = NROI + 1;
                    END
                END /* MONTO <> 0 */
            END /* DO FORMA_PAGO */
        END /* CAJA = F */
    if (DTO = 'K') then /* DTO EN CTA CONSTANTE */
        BEGIN
        if (VRDTO <> 0) then
            BEGIN
            CUENTA = NULL;
            EXECUTE PROCEDURE VALIDE_CUENTA_C (CTADTO) RETURNING_VALUES (:OK);
            IF (OK = 0) THEN
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :CTADTO INTO :CUENTA, :TIPOCUEN;
            ELSE
                begin
                EXECUTE PROCEDURE ERROR (61, :IDDOC, :CTADTO, 2);
                CUENTA = CTADTO;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERROR (61, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                EXECUTE PROCEDURE ERROR (61, :IDDOC, :CUENTA, 4);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRDTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA + VRDTO;
                END
            END /* VRDTO <> 0 */
        END /* DTO EN CTA CONSTANTE */

    /* LA DIFERENCIA EN CAMBIO */
    SELECT SUM(RCDE_DIFCAMBIO) FROM recibos_caja_detalle WHERE RECA_ID = :iddoc INTO :DIFCAMBIO;
    IF ((DIFCAMBIO IS NOT NULL) AND (DIFCAMBIO <> 0)) THEN
        BEGIN
        if (DIFCAMBIO > 0) then
            execute procedure lee_configuracion('GENERAL','GENERAL','CUENTA DE INGRESO POR DIFERENCIA EN CAMBIO PARA OPERACIONES EN OTRA MONEDA') returning_values (:ctadif);
        else
            execute procedure lee_configuracion('GENERAL','GENERAL','CUENTA DE GASTO POR DIFERENCIA EN CAMBIO PARA OPERACIONES EN OTRA MONEDA') returning_values (:ctadif);
        CUENTA = NULL;
        EXECUTE PROCEDURE VALIDE_CUENTA_C (ctadif) RETURNING_VALUES (:OK);
        IF (OK = 0) THEN
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :ctadif INTO :CUENTA, :TIPOCUEN;
        ELSE
            begin
            EXECUTE PROCEDURE ERROR (61, :IDDOC, :ctadif, 2);
            CUENTA = ctadif;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERROR (61, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERROR (61, :IDDOC, :CUENTA, 4);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            if (DIFCAMBIO > 0) then
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :difcambio, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            else
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', ABS(:difcambio), 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA - difcambio;
            END
        END
    /* RETENCION FUENTE */
    if ((RTFTE = 'T') or (RTFTE = 'K')) then
      if (VRRTFTE <> 0) then
        BEGIN
        if (RTFTE = 'T') then
            CTARTFTE = TCTARTFTE;
        CUENTA = NULL;
        EXECUTE PROCEDURE VALIDE_CUENTA_C (CTARTFTE) RETURNING_VALUES (:OK);
        IF (OK = 0) THEN
            SELECT CUEN_COD, CUEN_RETENCION, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTARTFTE INTO :CUENTA, :ES_RETENCION, :TIPOCUEN;
        ELSE
            begin
            EXECUTE PROCEDURE ERROR (61, :IDDOC, :CTARTFTE, 2);
            CUENTA = CTARTFTE;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERROR (61, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERROR (61, :IDDOC, :CUENTA, 4);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            if (ES_RETENCION = 'S') then
                BEGIN
                VRBASE = VRTOTAL + VRDTO + vrrtfte + vrrtiva + vrrtica;
                SELECT CLIE_rtefte from clientes where terc_nit = :NIT INTO :PORC;
                END
            ELSE
                BEGIN
                VRBASE = 0;
                PORC = 0;
                END
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :VRBASE, :PORC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTFTE;
            END
        END /* RTFTE */
    /* RETENCION IVA */
    if ((RTIVA = 'T') or (RTIVA = 'K')) then
      if (VRRTIVA <> 0) then
        BEGIN
        if (RTIVA = 'T') then
            CTARTIVA = TCTARTIVA;
        CUENTA = NULL;
        EXECUTE PROCEDURE VALIDE_CUENTA_C (CTARTIVA) RETURNING_VALUES (:OK);
        IF (OK = 0) THEN
            SELECT CUEN_COD, CUEN_RETENCION, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTARTIVA INTO :CUENTA, :ES_RETENCION, :TIPOCUEN;
        ELSE
            begin
            EXECUTE PROCEDURE ERROR (61, :IDDOC, :CTARTIVA, 2);
            CUENTA = CTARTIVA;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERROR (61, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERROR (61, :IDDOC, :CUENTA, 4);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            if (ES_RETENCION = 'S') then
                BEGIN
                VRBASE = VRTOTAL + VRDTO + vrrtfte + vrrtiva + vrrtica;
                SELECT CLIE_RTEIVA from clientes where terc_nit = :NIT INTO :PORC;
                END
            ELSE
                BEGIN
                VRBASE = 0;
                PORC = 0;
                END
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTIVA, 0, :VRBASE, :PORC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTIVA;
            END
        END /* RTIVA */
    /* RETENCION DE ICA */
    if ((RTICA = 'T') or (RTICA = 'K')) then
      if (VRRTICA <> 0) then
        BEGIN
        if (RTICA = 'T') then
            CTARTICA = TCTARTICA;
        CUENTA = NULL;
        EXECUTE PROCEDURE VALIDE_CUENTA_C (CTARTICA) RETURNING_VALUES (:OK);
        IF (OK = 0) THEN
            SELECT CUEN_COD, CUEN_RETENCION, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTARTICA INTO :CUENTA, :ES_RETENCION, :TIPOCUEN;
        ELSE
            begin
            EXECUTE PROCEDURE ERROR (61, :IDDOC, :CTARTICA, 2);
            CUENTA = CTARTICA;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERROR (61, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERROR (61, :IDDOC, :CUENTA, 4);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            if (ES_RETENCION = 'S') then
                BEGIN
                VRBASE = VRTOTAL + VRDTO + vrrtfte + vrrtiva + vrrtica;
                SELECT CLIE_RTEICA from clientes where terc_nit = :NIT INTO :PORC;
                END
            ELSE
                BEGIN
                VRBASE = 0;
                PORC = 0;
                END
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTICA, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTICA;
            END
        END /* RTICA */
    /* CRUCES CON CXP */
    if (CRUCES <> 0) then
        BEGIN
        SELECT PROV_CARTERA FROM PROVEEDORES WHERE TERC_NIT = :nit INTO :ctabase;
        if (CTABASE IS NULL) then
            ctabase = tctaclien;
        CUENTA = NULL;
        EXECUTE PROCEDURE VALIDE_CUENTA_C (CTABASE) RETURNING_VALUES (:OK);
        IF (OK = 0) THEN
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTABASE INTO :CUENTA, :TIPOCUEN;
        ELSE
            begin
            EXECUTE PROCEDURE ERROR (61, :IDDOC, :CTABASE, 2);
            CUENTA = CTABASE;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERROR (61, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            /* DEBERIA RECORRER DOCUMENTO POR DOCUMENTO */
            FOR SELECT RCCR_TIPODOC, RCCR_PREFIJO, RCCR_NUMERO, RCCR_ABONO+RCCR_RTFTE+RCCR_RTIVA+RCCR_RTICA+RCCR_DTOF
                FROM recibos_caja_crucec WHERE RECA_ID = :IDDOC
                INTO :TIPOIT, PREFIT, NUMIT, ABONOIT
                DO
                BEGIN
                NUMEROIT = PREFIT || NUMIT;
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :ABONOIT, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, :NUMEROIT, NULL, NULL, :TIPOIT, 0);
                SUMA = SUMA + ABONOIT;
                NROI = NROI + 1;
                END
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :CRUCES, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            SUMA = SUMA + CRUCES;
            NROI = NROI + 1;
            END

        /* LA DIFERENCIA EN CAMBIO */
        SELECT SUM(RCCR_DIFCAMBIO) FROM recibos_caja_crucec WHERE RECA_ID = :iddoc INTO :DIFCAMBIO;
        IF ((DIFCAMBIO IS NOT NULL) AND (DIFCAMBIO <> 0)) THEN
            BEGIN
            if (DIFCAMBIO > 0) then
                execute procedure lee_configuracion('GENERAL','GENERAL','CUENTA DE GASTO POR DIFERENCIA EN CAMBIO PARA OPERACIONES EN OTRA MONEDA') returning_values (:ctadif);
            else
                execute procedure lee_configuracion('GENERAL','GENERAL','CUENTA DE INGRESO POR DIFERENCIA EN CAMBIO PARA OPERACIONES EN OTRA MONEDA') returning_values (:ctadif);
            CUENTA = NULL;
            EXECUTE PROCEDURE VALIDE_CUENTA_C (ctadif) RETURNING_VALUES (:OK);
            IF (OK = 0) THEN
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :ctadif INTO :CUENTA, :TIPOCUEN;
            ELSE
                begin
                EXECUTE PROCEDURE ERROR (61, :IDDOC, :ctadif, 2);
                CUENTA = ctadif;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERROR (61, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                EXECUTE PROCEDURE ERROR (61, :IDDOC, :CUENTA, 4);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                if (DIFCAMBIO > 0) then
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :difcambio, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                else
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, ABS(:difcambio), 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA + difcambio;
                END
            END
        END /* cruces */
    /* CIERRE EL COMPROBANTE CONTRA LA CUENTA DEL TERCERO O LA BASE CONSTANTE */
    if ((SUMA <> 0) and ((BASE = 'T') or (BASE = 'K'))) then
        BEGIN
        if (SUMA < 0) then
            BEGIN
            DEBITO = SUMA * -1;
            CREDITO = 0;
            END
        ELSE
            BEGIN
            DEBITO = 0;
            CREDITO = SUMA;
            END
        if (BASE = 'T') then
            CTABASE = TCTACLIEN;
        CUENTA = NULL;
        EXECUTE PROCEDURE VALIDE_CUENTA_C (CTABASE) RETURNING_VALUES (:OK);
        IF (OK = 0) THEN
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTABASE INTO :CUENTA, :TIPOCUEN;
        ELSE
            begin
            EXECUTE PROCEDURE ERROR (61, :IDDOC, :CTABASE, 2);
            CUENTA = CTABASE;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERROR (61, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            /* DEBERIA RECORRER DOCUMENTO POR DOCUMENTO */
            FOR SELECT RCDE_TIPODOC, RCDE_PREFIJO, RCDE_NUMERO, RCDE_ABONO+RCDE_RTFTE+RCDE_RTIVA+RCDE_RTICA+RCDE_DTOF
                FROM RECIBOS_CAJA_DETALLE WHERE RECA_ID = :IDDOC
                INTO :TIPOIT, PREFIT, NUMIT, ABONOIT
                DO
                BEGIN
                NUMEROIT = PREFIT || NUMIT;
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :ABONOIT, 0, 0, :NIT, :PROY, :CENTRO, NULL, :NUMEROIT, NULL, NULL, :TIPOIT, 0);
                NROI = NROI + 1;
                END
            END
        if (TIPOCUEN = 'N') then
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :DEBITO, :CREDITO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
        NROI = NROI + 1;
        END /* SUMA EN CARTERA */
    /* recorra las cuentas adicionales */
    FOR SELECT INJC_CUENTA, INJC_BASE, INJC_PORC, INJC_VALOR, INJC_DB
        FROM INTERFAZ_CAJA_CTAS
        WHERE INCJ_ID = :IDINTER
        INTO :CTADIC, :BASEADIC, :PORCADIC, :VALORADIC, :DBADIC
        DO
        BEGIN
        if (:BASEADIC = 'TOTAL') then
            VALORADIC = VRTOTAL;
        if (:BASEADIC = 'DESCUENTO') then
            VALORADIC = VRDTO;
        if (:BASEADIC = 'RTFTE') then
            VALORADIC = VRRTFTE;
        if (:BASEADIC = 'RTIVA') then
            VALORADIC = VRRTIVA;
        if (:BASEADIC = 'RTICA') then
            VALORADIC = VRRTICA;
        MONTO = VALORADIC * PORCADIC;
        CUENTA = NULL;
        EXECUTE PROCEDURE VALIDE_CUENTA_C (CTADIC) RETURNING_VALUES (:OK);
        IF (OK = 0) THEN
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTADIC INTO :CUENTA, :TIPOCUEN;
        ELSE
            begin
            EXECUTE PROCEDURE ERROR (61, :IDDOC, :CTADIC, 2);
            CUENTA = CTADIC;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERROR (61, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERROR (61, :IDDOC, :CUENTA, 4);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            if (DBADIC = 'S') then
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTADIC, :CONC, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            ELSE
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTADIC, :CONC, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            END
        NROI = NROI + 1;
        END
    /* REVERSE EL PROVISIONAL SI EXISTE */
    if ((PROVID IS NOT NULL) AND (PROVID <> 0))  then
        BEGIN
        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
            SELECT :IDC, CODE_ITEM+:NROI, CUEN_COD, :CONC, '', CODE_CREDITO, CODE_DEBITO, CODE_BASE*-1, CODE_PORC, D.TERC_NIT, PROY_COD, CENT_COD, NULL, NULL, NULL, NULL, 0, 0
                FROM COMPROBANTE_DETALLE D, COMPROBANTE_ENCABEZADO E WHERE E.enco_consec = D.enco_consec AND E.enco_tiporef = 65 AND E.enco_idref = :provid ORDER BY CODE_ITEM;
        END
    if (ERROR > 0) then
        VER = 'S';
    SUSPEND;
    END /* NO ANULADO */
  END /* EXISTE LA INTERFAZ */
ELSE
    BEGIN
    EXECUTE PROCEDURE ERROR (61, :IDDOC, :PREF, 1);
    ERROR = ERROR + 1;
    VER = 'S';
    SUSPEND;
    END
END;

/*******************************************************************************
The next statement causes the following error:

Undefined name.
Dynamic SQL Error.
SQL error code = -204.
Ambiguous field name between table COMPROBANTE_ENCABEZADO and table COMPROBANTE_DETALLE .
TERC_NIT.
*******************************************************************************/
ALTER PROCEDURE CRONOLOGICO_CONTA (
    TIPOINI VARCHAR(3) CHARACTER SET NONE,
    TIPOFIN VARCHAR(3) CHARACTER SET NONE,
    FECINI VARCHAR(8) CHARACTER SET NONE,
    FECFIN VARCHAR(8) CHARACTER SET NONE,
    CONSOLIDADO CHAR(1) CHARACTER SET NONE)
RETURNS (
    ID INTEGER,
    TIPOCOMP VARCHAR(3) CHARACTER SET NONE,
    PREFIJO VARCHAR(4) CHARACTER SET NONE,
    NUMERO VARCHAR(6) CHARACTER SET NONE,
    FECHA CHAR(8) CHARACTER SET NONE,
    CUENTA VARCHAR(20) CHARACTER SET NONE,
    NIT VARCHAR(15) CHARACTER SET NONE,
    PROYECTO VARCHAR(4) CHARACTER SET NONE,
    CENTRO VARCHAR(4) CHARACTER SET NONE,
    CONCEPTO VARCHAR(60) CHARACTER SET NONE,
    REF VARCHAR(20) CHARACTER SET NONE,
    BASE NUMERIC(18,2),
    PORC NUMERIC(9,4),
    DEBITO NUMERIC(18,2),
    CREDITO NUMERIC(18,2),
    TIPOREF INTEGER,
    IDREF INTEGER,
    NOMTIPO VARCHAR(60) CHARACTER SET NONE)
AS
BEGIN
  /* TRAE LOS COMPROBANTES SEGUN EL RANGO DADO */
  if (:CONSOLIDADO = 'S') then
    BEGIN
    FOR SELECT MAX(E.ENCO_CONSEC), MAX(E.TICO_COD), MAX(PRCO_PREF), MAX(ENCO_NUMERO), MAX(ENCO_FECHA), MAX(ENCO_CONCEPTO), MAX(ENCO_REFER), SUM(CODE_BASE), SUM(CODE_DEBITO), SUM(CODE_CREDITO), MAX(ENCO_TIPOREF), MAX(ENCO_IDREF), MAX(TICO_NOM)
        FROM COMPROBANTE_ENCABEZADO E, COMPROBANTE_DETALLE D, TIPO_COMPROBANTE T
        WHERE E.ENCO_CONSEC = D.ENCO_CONSEC AND E.TICO_COD = T.TICO_COD AND E.TICO_COD >= :TIPOINI AND E.TICO_COD <= :TIPOFIN AND ENCO_FECHA >= :FECINI AND ENCO_FECHA <= :FECFIN
        GROUP BY E.TICO_COD, ENCO_FECHA, PRCO_PREF, ENCO_NUMERO
        ORDER BY E.TICO_COD, ENCO_FECHA, PRCO_PREF, ENCO_NUMERO
        INTO :ID, :TIPOCOMP, :PREFIJO, :NUMERO, :FECHA, :CONCEPTO, :REF, :BASE, :DEBITO, :CREDITO, :TIPOREF, :IDREF, :NOMTIPO
        DO
            SUSPEND;
    END
  ELSE
    BEGIN
    FOR SELECT E.ENCO_CONSEC, E.TICO_COD, PRCO_PREF, ENCO_NUMERO, ENCO_FECHA, CUEN_COD, CODE_CONCEPTO, D.TERC_NIT, CODE_REFER, CODE_BASE, CODE_PORC, CODE_DEBITO, CODE_CREDITO, PROY_COD, CENT_COD, TICO_NOM
        FROM COMPROBANTE_ENCABEZADO E, COMPROBANTE_DETALLE D, TIPO_COMPROBANTE T
        WHERE E.ENCO_CONSEC = D.ENCO_CONSEC AND E.TICO_COD = T.TICO_COD AND E.TICO_COD >= :TIPOINI AND E.TICO_COD <= :TIPOFIN AND ENCO_FECHA >= :FECINI AND ENCO_FECHA <= :FECFIN
        ORDER BY E.TICO_COD, ENCO_FECHA, PRCO_PREF, ENCO_NUMERO, CODE_ITEM
        INTO :ID, :TIPOCOMP, :PREFIJO, :NUMERO, :FECHA, :CUENTA, :CONCEPTO, :NIT, :REF, :BASE, :PORC, :DEBITO, :CREDITO, :PROYECTO, :centro, :NOMTIPO
        DO
            SUSPEND;
    END
END;

/*******************************************************************************
The next statement causes the following error:

Undefined name.
Dynamic SQL Error.
SQL error code = -204.
Ambiguous field name between table COMPROBANTE_DETALLE and table COMPROBANTE_ENCABEZADO .
TERC_NIT.
*******************************************************************************/
ALTER PROCEDURE MEDIOS_MAGNETICOS (
    ANO CHAR(4) CHARACTER SET NONE)
RETURNS (
    TIPO CHAR(1) CHARACTER SET NONE,
    CODIGO CHAR(2) CHARACTER SET NONE,
    SUBCODIGO CHAR(2) CHARACTER SET NONE,
    NIT CHAR(20) CHARACTER SET NONE,
    DV CHAR(1) CHARACTER SET NONE,
    CLASE CHAR(1) CHARACTER SET NONE,
    NOMBRE VARCHAR(60) CHARACTER SET NONE,
    VALOR1 NUMERIC(18,2),
    VALOR2 NUMERIC(18,2),
    VALOR3 NUMERIC(18,2),
    DESCRIPCION VARCHAR(60) CHARACTER SET NONE,
    DIRECCION VARCHAR(60) CHARACTER SET NONE,
    DEPTOYMUN CHAR(5) CHARACTER SET NONE)
AS
declare variable CONF CHAR(30);
declare variable CIU VARCHAR(45);
declare variable CTABASE VARCHAR(20);
declare variable CTAAUX VARCHAR(20);
declare variable CUENTA VARCHAR(20);
declare variable LARGO INTEGER;
declare variable NOMAUX VARCHAR(60);
declare variable BASEMIN NUMERIC(18,2);
declare variable ACUMULADO NUMERIC(18,2);
BEGIN
  /* LITERAL A: - ACCIONISTAS */
  SELECT COME_RESPUESTA FROM CONFIGURA_MEDIOSMAG WHERE COME_ITEM = 1 INTO :CTABASE;
  SELECT COME_RESPUESTA FROM CONFIGURA_MEDIOSMAG WHERE COME_ITEM = 2 INTO :CONF;
  if (CONF = 'TERCEROS') then
    BEGIN
    FOR SELECT DISTINCT TERC_NIT
      FROM SALDOS_TERCEROS
      WHERE CUEN_COD = :CTABASE
      ORDER BY TERC_NIT
      INTO :NIT
        do
        BEGIN
        FOR SELECT '2', '60', '00', TERC_NIT, TERC_NOM, 0, 0, '', TERC_DIR, TERC_CIU
        FROM TERCEROS WHERE TERC_NIT = :NIT
        INTO :TIPO, :CODIGO, :SUBCODIGO, :NIT, :NOMBRE, :VALOR2, :VALOR3, :DESCRIPCION, :DIRECCION, :CIU
            DO
            BEGIN
            EXECUTE PROCEDURE SALDO_TERCERO_MES(:CTABASE, :NIT, :ANO, 13, 'S') RETURNING_VALUES (VALOR1);
            if (VALOR1 <> 0) then
                BEGIN
                /* EL CODIGO DEL MUNICIPIO */
                CIU = '%' || SUBSTR(CIU, 1, 6) || '%';
                SELECT MIN(CIUD_COD) FROM CIUDADES WHERE CIUD_NOM LIKE :CIU INTO :DEPTOYMUN;
                VALOR1 = ABS(VALOR1);
                SUSPEND;
                END
            END
        END
    END
  ELSE
    BEGIN
    LARGO = STRLEN(CTABASE);
    FOR SELECT CUEN_COD, '2', '60', '00', CUEN_NOM, 0, 0, ''
        FROM CUENTAS
        WHERE SUBSTR(CUEN_COD, 1, :LARGO) = :CTABASE
        INTO :CUENTA, :TIPO, :CODIGO, :SUBCODIGO, :NOMBRE, :VALOR2, :VALOR3, :DESCRIPCION
        DO
            BEGIN
            NIT = '';
            DIRECCION = '';
            CIU = '';
            DEPTOYMUN = '';
            /* INTENTE BUSCAR LOS 15 PRIMEROS CAR. DEL NOMBRE COMO TERCERO */
            NOMAUX = '%' || SUBSTR(NOMBRE, 1, 15) || '%';
            SELECT MAX(TERC_NIT), MAX(TERC_NOM), MAX(TERC_DIR), MAX(TERC_CIU)
                FROM TERCEROS
                WHERE UPPER(TERC_NOM) LIKE UPPER(:NOMAUX)
                INTO :NIT, :NOMAUX, :DIRECCION, :CIU;
            if (NOMAUX IS NOT NULL) then
                NOMBRE = NOMAUX;
            /* EL SALDO FINAL */
            EXECUTE PROCEDURE SALDO_CUENTA_MES (:CUENTA, :ANO, 12, 'N') RETURNING_VALUES (:VALOR1);
            /* EL CODIGO DEL MUNICIPIO */
            CIU = '%' || SUBSTR(CIU, 1, 6) || '%';
            SELECT MIN(CIUD_COD) FROM CIUDADES WHERE CIUD_NOM LIKE :CIU INTO :DEPTOYMUN;
            VALOR1 = ABS(VALOR1);
            SUSPEND;
            END
    END
  /* LITERAL A: - DIVIDENOS */
  SELECT COME_RESPUESTA FROM CONFIGURA_MEDIOSMAG WHERE COME_ITEM = 3 INTO :CTABASE;
  LARGO = STRLEN(CTABASE);

  FOR SELECT MAX(TERC_NIT), SUM(SATE_CREDITO)
    FROM SALDOS_TERCEROS
    WHERE SUBSTR(CUEN_COD, 1, :LARGO) = :CTABASE AND :ANO = SUBSTR(SACU_FECHA, 1, 4)
    GROUP BY TERC_NIT
    ORDER BY TERC_NIT
    INTO :NIT, :VALOR1
    do
        BEGIN
        IF (VALOR1 IS NULL) THEN
            VALOR1 = 0;
        if (VALOR1 <> 0) then
            BEGIN
            FOR SELECT '2', '60', '01', TERC_NIT, TERC_NOM, 0, 0, '', TERC_DIR, TERC_CIU
                FROM TERCEROS WHERE TERC_NIT = :NIT
                INTO :TIPO, :CODIGO, :SUBCODIGO, :NIT, :NOMBRE, :VALOR2, :VALOR3, :DESCRIPCION, :DIRECCION, :CIU
                DO
                    BEGIN
                    /* EL CODIGO DEL MUNICIPIO */
                    CIU = '%' || SUBSTR(CIU, 1, 6) || '%';
                    SELECT MIN(CIUD_COD) FROM CIUDADES WHERE CIUD_NOM LIKE :CIU INTO :DEPTOYMUN;
                    VALOR1 = ABS(VALOR1);
                    SUSPEND;
                    END
            END
        END
  /* LITERAL E: SALARIOS */
  BASEMIN = 40000000;

  FOR SELECT MAX(TERC_NIT), SUM(SATE_DEBITO)
    FROM SALDOS_TERCEROS
    WHERE ((CUEN_COD >= '5105' AND CUEN_COD <= '510566') OR
        (CUEN_COD >= '5205' AND CUEN_COD <= '520566')) AND :ANO = SUBSTR(SACU_FECHA, 1, 4)
    GROUP BY TERC_NIT
    ORDER BY TERC_NIT
    INTO :NIT, :VALOR1
    do
        BEGIN
        IF (VALOR1 IS NULL) THEN
            VALOR1 = 0;
        if (VALOR1 >= :BASEMIN) then
            BEGIN
            FOR SELECT '2', '75', '01', TERC_NIT, TERC_NOM, 0, 0, '', TERC_DIR, TERC_CIU
            FROM TERCEROS WHERE TERC_NIT = :NIT
            INTO :TIPO, :CODIGO, :SUBCODIGO, :NIT, :NOMBRE, :VALOR2, :VALOR3, :DESCRIPCION, :DIRECCION, :CIU
            DO
                BEGIN
                /* EL CODIGO DEL MUNICIPIO */
                CIU = '%' || SUBSTR(CIU, 1, 6) || '%';
                SELECT MIN(CIUD_COD) FROM CIUDADES WHERE CIUD_NOM LIKE :CIU INTO :DEPTOYMUN;
                ACUMULADO = ACUMULADO + VALOR1;
                VALOR1 = ABS(VALOR1);
                SUSPEND;
                END
            END
        END

    /* EL RESTANTE CON NIT 222222222 */
    SELECT SUM(SATE_CREDITO)
        FROM SALDOS_TERCEROS
        WHERE ((CUEN_COD >= '5105' AND CUEN_COD <= '510566') OR
        (CUEN_COD >= '5205' AND CUEN_COD <= '520566')) AND :ANO = SUBSTR(SACU_FECHA, 1, 4)
        INTO :VALOR1;
    if (VALOR1 > ACUMULADO) then
        BEGIN
        TIPO = '2';
        CODIGO = '75';
        SUBCODIGO = '16';
        NIT = '222222222';
        NOMBRE = 'CUANTIAS MENORES';
        VALOR1 = ABS(VALOR1 - ACUMULADO);
        VALOR2 = 0;
        VALOR3 = 0;
        DESCRIPCION = '';
        DIRECCION = '';
        DEPTOYMUN = '11001';
        SUSPEND;
        END
  /* LITERAL E: PARAFISCALES - CONF. 4 Y 5 */
  BASEMIN = 1000000;
  ACUMULADO = 0;
  FOR SELECT MAX(TERC_NIT), SUM(SATE_DEBITO)
    FROM SALDOS_TERCEROS
    WHERE ((CUEN_COD >= '510572' AND CUEN_COD <= '510578') OR
        (CUEN_COD >= '520572' AND CUEN_COD <= '520578')) AND :ANO = SUBSTR(SACU_FECHA, 1, 4)
    GROUP BY TERC_NIT
    ORDER BY TERC_NIT
    INTO :NIT, :VALOR1
    do
        BEGIN
        IF (VALOR1 IS NULL) THEN
            VALOR1 = 0;
        if (VALOR1 >= :BASEMIN) then
            BEGIN
            FOR SELECT '2', '75', '03', TERC_NIT, TERC_NOM, 0, 0, '', TERC_DIR, TERC_CIU
            FROM TERCEROS WHERE TERC_NIT = :NIT
            INTO :TIPO, :CODIGO, :SUBCODIGO, :NIT, :NOMBRE, :VALOR2, :VALOR3, :DESCRIPCION, :DIRECCION, :CIU
            DO
                BEGIN
                /* EL CODIGO DEL MUNICIPIO */
                CIU = '%' || SUBSTR(CIU, 1, 6) || '%';
                SELECT MIN(CIUD_COD) FROM CIUDADES WHERE CIUD_NOM LIKE :CIU INTO :DEPTOYMUN;
                ACUMULADO = ACUMULADO + VALOR1;
                VALOR1 = ABS(VALOR1);
                SUSPEND;
                END
            END
        END

    /* EL RESTANTE CON NIT 222222222 */
    SELECT SUM(SATE_DEBITO)
        FROM SALDOS_TERCEROS
        WHERE ((CUEN_COD >= '510572' AND CUEN_COD <= '510578') OR
        (CUEN_COD >= '520572' AND CUEN_COD <= '520578')) AND :ANO = SUBSTR(SACU_FECHA, 1, 4)
        INTO :VALOR1;
    if (VALOR1 > ACUMULADO) then
        BEGIN
        TIPO = '2';
        CODIGO = '75';
        SUBCODIGO = '16';
        NIT = '222222222';
        NOMBRE = 'CUANTIAS MENORES';
        VALOR1 = ABS(VALOR1 - ACUMULADO);
        VALOR2 = 0;
        VALOR3 = 0;
        DESCRIPCION = '';
        DIRECCION = '';
        DEPTOYMUN = '11001';
        SUSPEND;
        END
  /* LITERAL E: EPS Y ARP */
  ACUMULADO = 0;
  FOR SELECT MAX(TERC_NIT), SUM(SATE_DEBITO)
    FROM SALDOS_TERCEROS
    WHERE ((CUEN_COD >= '510568' AND CUEN_COD <= '510569') OR
        (CUEN_COD >= '520568' AND CUEN_COD <= '520569')) AND :ANO = SUBSTR(SACU_FECHA, 1, 4)
    GROUP BY TERC_NIT
    ORDER BY TERC_NIT
    INTO :NIT, :VALOR1
    do
        BEGIN
        IF (VALOR1 IS NULL) THEN
            VALOR1 = 0;
        if (VALOR1 >= :BASEMIN) then
            BEGIN
            FOR SELECT '2', '75', '04', TERC_NIT, TERC_NOM, 0, 0, '', TERC_DIR, TERC_CIU
            FROM TERCEROS WHERE TERC_NIT = :NIT
            INTO :TIPO, :CODIGO, :SUBCODIGO, :NIT, :NOMBRE, :VALOR2, :VALOR3, :DESCRIPCION, :DIRECCION, :CIU
            DO
                BEGIN
                /* EL CODIGO DEL MUNICIPIO */
                CIU = '%' || SUBSTR(CIU, 1, 6) || '%';
                SELECT MIN(CIUD_COD) FROM CIUDADES WHERE CIUD_NOM LIKE :CIU INTO :DEPTOYMUN;
                ACUMULADO = ACUMULADO + VALOR1;
                VALOR1 = ABS(VALOR1);
                SUSPEND;
                END
            END
        END

    /* EL RESTANTE CON NIT 222222222 */
    SELECT SUM(SATE_DEBITO)
        FROM SALDOS_TERCEROS
        WHERE ((CUEN_COD >= '510568' AND CUEN_COD <= '510569') OR
        (CUEN_COD >= '520568' AND CUEN_COD <= '520569')) AND :ANO = SUBSTR(SACU_FECHA, 1, 4)
        INTO :VALOR1;
    if (VALOR1 > ACUMULADO) then
        BEGIN
        TIPO = '2';
        CODIGO = '75';
        SUBCODIGO = '16';
        NIT = '222222222';
        NOMBRE = 'CUANTIAS MENORES';
        VALOR1 = ABS(VALOR1 - ACUMULADO);
        VALOR2 = 0;
        VALOR3 = 0;
        DESCRIPCION = '';
        DIRECCION = '';
        DEPTOYMUN = '11001';
        SUSPEND;
        END
  /* LITERAL E: PENSIONES */
  ACUMULADO = 0;
  FOR SELECT MAX(TERC_NIT), SUM(SATE_DEBITO)
    FROM SALDOS_TERCEROS
    WHERE (CUEN_COD = '510570'  OR CUEN_COD = '520570') AND :ANO = SUBSTR(SACU_FECHA, 1, 4)
    GROUP BY TERC_NIT
    ORDER BY TERC_NIT
    INTO :NIT, :VALOR1
    do
        BEGIN
        IF (VALOR1 IS NULL) THEN
            VALOR1 = 0;
        if (VALOR1 >= :BASEMIN) then
            BEGIN
            FOR SELECT '2', '75', '05', TERC_NIT, TERC_NOM, 0, 0, '', TERC_DIR, TERC_CIU
            FROM TERCEROS WHERE TERC_NIT = :NIT
            INTO :TIPO, :CODIGO, :SUBCODIGO, :NIT, :NOMBRE, :VALOR2, :VALOR3, :DESCRIPCION, :DIRECCION, :CIU
            DO
                BEGIN
                /* EL CODIGO DEL MUNICIPIO */
                CIU = '%' || SUBSTR(CIU, 1, 6) || '%';
                SELECT MIN(CIUD_COD) FROM CIUDADES WHERE CIUD_NOM LIKE :CIU INTO :DEPTOYMUN;
                ACUMULADO = ACUMULADO + VALOR1;
                VALOR1 = ABS(VALOR1);
                SUSPEND;
                END
            END
        END

    /* EL RESTANTE CON NIT 222222222 */
    SELECT SUM(SATE_DEBITO)
        FROM SALDOS_TERCEROS
        WHERE (CUEN_COD = '510570' OR CUEN_COD = '520570') AND :ANO = SUBSTR(SACU_FECHA, 1, 4)
        INTO :VALOR1;
    if (VALOR1 > ACUMULADO) then
        BEGIN
        TIPO = '2';
        CODIGO = '75';
        SUBCODIGO = '16';
        NIT = '222222222';
        NOMBRE = 'CUANTIAS MENORES';
        VALOR1 = ABS(VALOR1 - ACUMULADO);
        VALOR2 = 0;
        VALOR3 = 0;
        DESCRIPCION = '';
        DIRECCION = '';
        DEPTOYMUN = '11001';
        SUSPEND;
        END
  /* LITERAL E: GASTOS DIFERIDOS */
  ACUMULADO = 0;
  FOR SELECT MAX(TERC_NIT), SUM(SATE_DEBITO)
    FROM SALDOS_TERCEROS
    WHERE (CUEN_COD >= '17' AND CUEN_COD <= '179999') AND :ANO = SUBSTR(SACU_FECHA, 1, 4)
    GROUP BY TERC_NIT
    ORDER BY TERC_NIT
    INTO :NIT, :VALOR1
    do
        BEGIN
        IF (VALOR1 IS NULL) THEN
            VALOR1 = 0;
        if (VALOR1 >= :BASEMIN) then
            BEGIN
            FOR SELECT '2', '75', '06', TERC_NIT, TERC_NOM, 0, 0, '', TERC_DIR, TERC_CIU
            FROM TERCEROS WHERE TERC_NIT = :NIT
            INTO :TIPO, :CODIGO, :SUBCODIGO, :NIT, :NOMBRE, :VALOR2, :VALOR3, :DESCRIPCION, :DIRECCION, :CIU
            DO
                BEGIN
                /* EL CODIGO DEL MUNICIPIO */
                CIU = '%' || SUBSTR(CIU, 1, 6) || '%';
                SELECT MIN(CIUD_COD) FROM CIUDADES WHERE CIUD_NOM LIKE :CIU INTO :DEPTOYMUN;
                ACUMULADO = ACUMULADO + VALOR1;
                VALOR1 = ABS(VALOR1);
                SUSPEND;
                END
            END
        END

    /* EL RESTANTE CON NIT 222222222 */
    SELECT SUM(SATE_DEBITO)
        FROM SALDOS_TERCEROS
        WHERE ((CUEN_COD >= '510568' AND CUEN_COD <= '510569') OR
        (CUEN_COD >= '520568' AND CUEN_COD <= '520569')) AND :ANO = SUBSTR(SACU_FECHA, 1, 4)
        INTO :VALOR1;
    if (VALOR1 > ACUMULADO) then
        BEGIN
        TIPO = '2';
        CODIGO = '75';
        SUBCODIGO = '16';
        NIT = '222222222';
        NOMBRE = 'CUANTIAS MENORES';
        VALOR1 = ABS(VALOR1 - ACUMULADO);
        VALOR2 = 0;
        VALOR3 = 0;
        DESCRIPCION = '';
        DIRECCION = '';
        DEPTOYMUN = '11001';
        SUSPEND;
        END
  /* LITERAL E: ACTIVOS FIJOS */
  ACUMULADO = 0;
  FOR SELECT MAX(TERC_NIT), SUM(SATE_DEBITO)
    FROM SALDOS_TERCEROS
    WHERE (CUEN_COD >= '15' AND CUEN_COD <= '159999') AND :ANO = SUBSTR(SACU_FECHA, 1, 4)
    GROUP BY TERC_NIT
    ORDER BY TERC_NIT
    INTO :NIT, :VALOR1
    do
        BEGIN
        IF (VALOR1 IS NULL) THEN
            VALOR1 = 0;
        if (VALOR1 >= :BASEMIN) then
            BEGIN
            FOR SELECT '2', '75', '07', TERC_NIT, TERC_NOM, 0, 0, '', TERC_DIR, TERC_CIU
            FROM TERCEROS WHERE TERC_NIT = :NIT
            INTO :TIPO, :CODIGO, :SUBCODIGO, :NIT, :NOMBRE, :VALOR2, :VALOR3, :DESCRIPCION, :DIRECCION, :CIU
            DO
                BEGIN
                /* EL CODIGO DEL MUNICIPIO */
                CIU = '%' || SUBSTR(CIU, 1, 6) || '%';
                SELECT MIN(CIUD_COD) FROM CIUDADES WHERE CIUD_NOM LIKE :CIU INTO :DEPTOYMUN;
                ACUMULADO = ACUMULADO + VALOR1;
                VALOR1 = ABS(VALOR1);
                SUSPEND;
                END
            END
        END

    /* EL RESTANTE CON NIT 222222222 */
    SELECT SUM(SATE_DEBITO)
        FROM SALDOS_TERCEROS
        WHERE ((CUEN_COD >= '510568' AND CUEN_COD <= '510569') OR
        (CUEN_COD >= '520568' AND CUEN_COD <= '520569')) AND :ANO = SUBSTR(SACU_FECHA, 1, 4)
        INTO :VALOR1;
    if (VALOR1 > ACUMULADO) then
        BEGIN
        TIPO = '2';
        CODIGO = '75';
        SUBCODIGO = '16';
        NIT = '222222222';
        NOMBRE = 'CUANTIAS MENORES';
        VALOR1 = ABS(VALOR1 - ACUMULADO);
        VALOR2 = 0;
        VALOR3 = 0;
        DESCRIPCION = '';
        DIRECCION = '';
        DEPTOYMUN = '11001';
        SUSPEND;
        END
  /* LITERAL E: ACTIVOS MOVIBLES */
  ACUMULADO = 0;
  FOR SELECT MAX(TERC_NIT), SUM(SATE_DEBITO)
    FROM SALDOS_TERCEROS
    WHERE (CUEN_COD >= '14' AND CUEN_COD <= '149999') AND :ANO = SUBSTR(SACU_FECHA, 1, 4)
    GROUP BY TERC_NIT
    ORDER BY TERC_NIT
    INTO :NIT, :VALOR1
    do
        BEGIN
        IF (VALOR1 IS NULL) THEN
            VALOR1 = 0;
        if (VALOR1 >= :BASEMIN) then
            BEGIN
            FOR SELECT '2', '75', '00', TERC_NIT, TERC_NOM, 0, 0, '', TERC_DIR, TERC_CIU
            FROM TERCEROS WHERE TERC_NIT = :NIT
            INTO :TIPO, :CODIGO, :SUBCODIGO, :NIT, :NOMBRE, :VALOR2, :VALOR3, :DESCRIPCION, :DIRECCION, :CIU
            DO
                BEGIN
                /* EL CODIGO DEL MUNICIPIO */
                CIU = '%' || SUBSTR(CIU, 1, 6) || '%';
                SELECT MIN(CIUD_COD) FROM CIUDADES WHERE CIUD_NOM LIKE :CIU INTO :DEPTOYMUN;
                ACUMULADO = ACUMULADO + VALOR1;
                VALOR1 = ABS(VALOR1);
                SUSPEND;
                END
            END
        END

    /* EL RESTANTE CON NIT 222222222 */
    SELECT SUM(SATE_DEBITO)
        FROM SALDOS_TERCEROS
        WHERE (CUEN_COD >= '14' AND CUEN_COD <= '149999') AND :ANO = SUBSTR(SACU_FECHA, 1, 4)
        INTO :VALOR1;
    if (VALOR1 > ACUMULADO) then
        BEGIN
        TIPO = '2';
        CODIGO = '75';
        SUBCODIGO = '00';
        NIT = '222222222';
        NOMBRE = 'CUANTIAS MENORES';
        VALOR1 = ABS(VALOR1 - ACUMULADO);
        VALOR2 = 0;
        VALOR3 = 0;
        DESCRIPCION = '';
        DIRECCION = '';
        DEPTOYMUN = '11001';
        SUSPEND;
        END
  /* LITERAL E: HONORARIOS Y COMISIONES */
  ACUMULADO = 0;
  FOR SELECT MAX(TERC_NIT), SUM(SATE_DEBITO)
    FROM SALDOS_TERCEROS
    WHERE ((CUEN_COD >= '5110' AND CUEN_COD <= '511099') OR
        (CUEN_COD >= '5210' AND CUEN_COD <= '521099')) AND :ANO = SUBSTR(SACU_FECHA, 1, 4)
    GROUP BY TERC_NIT
    ORDER BY TERC_NIT
    INTO :NIT, :VALOR1
    do
        BEGIN
        IF (VALOR1 IS NULL) THEN
            VALOR1 = 0;
        if (VALOR1 >= :BASEMIN) then
            BEGIN
            FOR SELECT '2', '75', '10', TERC_NIT, TERC_NOM, 0, 0, '', TERC_DIR, TERC_CIU
            FROM TERCEROS WHERE TERC_NIT = :NIT
            INTO :TIPO, :CODIGO, :SUBCODIGO, :NIT, :NOMBRE, :VALOR2, :VALOR3, :DESCRIPCION, :DIRECCION, :CIU
            DO
                BEGIN
                /* EL CODIGO DEL MUNICIPIO */
                CIU = '%' || SUBSTR(CIU, 1, 6) || '%';
                SELECT MIN(CIUD_COD) FROM CIUDADES WHERE CIUD_NOM LIKE :CIU INTO :DEPTOYMUN;
                ACUMULADO = ACUMULADO + VALOR1;
                VALOR1 = ABS(VALOR1);
                SUSPEND;
                END
            END
        END

    /* EL RESTANTE CON NIT 222222222 */
    SELECT SUM(SATE_DEBITO)
        FROM SALDOS_TERCEROS
        WHERE ((CUEN_COD >= '5110' AND CUEN_COD <= '511099') OR
        (CUEN_COD >= '5210' AND CUEN_COD <= '521099')) AND :ANO = SUBSTR(SACU_FECHA, 1, 4)
        INTO :VALOR1;
    if (VALOR1 > ACUMULADO) then
        BEGIN
        TIPO = '2';
        CODIGO = '75';
        SUBCODIGO = '16';
        NIT = '222222222';
        NOMBRE = 'CUANTIAS MENORES';
        VALOR1 = ABS(VALOR1 - ACUMULADO);
        VALOR2 = 0;
        VALOR3 = 0;
        DESCRIPCION = '';
        DIRECCION = '';
        DEPTOYMUN = '11001';
        SUSPEND;
        END
  /* LITERAL E: SERVICIOS */
  ACUMULADO = 0;
  FOR SELECT MAX(TERC_NIT), SUM(SATE_DEBITO)
    FROM SALDOS_TERCEROS
    WHERE ((CUEN_COD >= '5135' AND CUEN_COD <= '513599') OR
        (CUEN_COD >= '5235' AND CUEN_COD <= '523599')) AND :ANO = SUBSTR(SACU_FECHA, 1, 4)
    GROUP BY TERC_NIT
    ORDER BY TERC_NIT
    INTO :NIT, :VALOR1
    do
        BEGIN
        IF (VALOR1 IS NULL) THEN
            VALOR1 = 0;
        if (VALOR1 >= :BASEMIN) then
            BEGIN
            FOR SELECT '2', '75', '15', TERC_NIT, TERC_NOM, 0, 0, '', TERC_DIR, TERC_CIU
            FROM TERCEROS WHERE TERC_NIT = :NIT
            INTO :TIPO, :CODIGO, :SUBCODIGO, :NIT, :NOMBRE, :VALOR2, :VALOR3, :DESCRIPCION, :DIRECCION, :CIU
            DO
                BEGIN
                /* EL CODIGO DEL MUNICIPIO */
                CIU = '%' || SUBSTR(CIU, 1, 6) || '%';
                SELECT MIN(CIUD_COD) FROM CIUDADES WHERE CIUD_NOM LIKE :CIU INTO :DEPTOYMUN;
                ACUMULADO = ACUMULADO + VALOR1;
                VALOR1 = ABS(VALOR1);
                SUSPEND;
                END
            END
        END

    /* EL RESTANTE CON NIT 222222222 */
    SELECT SUM(SATE_DEBITO)
        FROM SALDOS_TERCEROS
        WHERE ((CUEN_COD >= '5135' AND CUEN_COD <= '513599') OR
        (CUEN_COD >= '5235' AND CUEN_COD <= '523599')) AND :ANO = SUBSTR(SACU_FECHA, 1, 4)
        INTO :VALOR1;
    if (VALOR1 > ACUMULADO) then
        BEGIN
        TIPO = '2';
        CODIGO = '75';
        SUBCODIGO = '16';
        NIT = '222222222';
        NOMBRE = 'CUANTIAS MENORES';
        VALOR1 = ABS(VALOR1 - ACUMULADO);
        VALOR2 = 0;
        VALOR3 = 0;
        DESCRIPCION = '';
        DIRECCION = '';
        DEPTOYMUN = '11001';
        SUSPEND;
        END
  /* LITERAL E: DONACIONES */
  ACUMULADO = 0;
  FOR SELECT MAX(TERC_NIT), SUM(SATE_DEBITO)
    FROM SALDOS_TERCEROS
    WHERE CUEN_COD = '539525' AND :ANO = SUBSTR(SACU_FECHA, 1, 4)
    GROUP BY TERC_NIT
    ORDER BY TERC_NIT
    INTO :NIT, :VALOR1
    do
        BEGIN
        IF (VALOR1 IS NULL) THEN
            VALOR1 = 0;
        if (VALOR1 >= :BASEMIN) then
            BEGIN
            FOR SELECT '2', '75', '15', TERC_NIT, TERC_NOM, 0, 0, '', TERC_DIR, TERC_CIU
            FROM TERCEROS WHERE TERC_NIT = :NIT
            INTO :TIPO, :CODIGO, :SUBCODIGO, :NIT, :NOMBRE, :VALOR2, :VALOR3, :DESCRIPCION, :DIRECCION, :CIU
            DO
                BEGIN
                /* EL CODIGO DEL MUNICIPIO */
                CIU = '%' || SUBSTR(CIU, 1, 6) || '%';
                SELECT MIN(CIUD_COD) FROM CIUDADES WHERE CIUD_NOM LIKE :CIU INTO :DEPTOYMUN;
                ACUMULADO = ACUMULADO + VALOR1;
                VALOR1 = ABS(VALOR1);
                SUSPEND;
                END
            END
        END

    /* EL RESTANTE CON NIT 222222222 */
    SELECT SUM(SATE_DEBITO)
        FROM SALDOS_TERCEROS
        WHERE CUEN_COD = '539525' AND :ANO = SUBSTR(SACU_FECHA, 1, 4)
        INTO :VALOR1;
    if (VALOR1 > ACUMULADO) then
        BEGIN
        TIPO = '2';
        CODIGO = '75';
        SUBCODIGO = '16';
        NIT = '222222222';
        NOMBRE = 'CUANTIAS MENORES';
        VALOR1 = ABS(VALOR1 - ACUMULADO);
        VALOR2 = 0;
        VALOR3 = 0;
        DESCRIPCION = '';
        DIRECCION = '';
        DEPTOYMUN = '11001';
        SUSPEND;
        END
  /* LITERAL E: INTERESES Y REND. FINANCIEROS */
  ACUMULADO = 0;
  FOR SELECT MAX(TERC_NIT), SUM(SATE_DEBITO)
    FROM SALDOS_TERCEROS
    WHERE ((CUEN_COD = '530520') OR (CUEN_COD <= '236535')) AND :ANO = SUBSTR(SACU_FECHA, 1, 4)
    GROUP BY TERC_NIT
    ORDER BY TERC_NIT
    INTO :NIT, :VALOR1
    do
        BEGIN
        IF (VALOR1 IS NULL) THEN
            VALOR1 = 0;
        if (VALOR1 >= :BASEMIN) then
            BEGIN
            FOR SELECT '2', '75', '21', TERC_NIT, TERC_NOM, 0, 0, '', TERC_DIR, TERC_CIU
            FROM TERCEROS WHERE TERC_NIT = :NIT
            INTO :TIPO, :CODIGO, :SUBCODIGO, :NIT, :NOMBRE, :VALOR2, :VALOR3, :DESCRIPCION, :DIRECCION, :CIU
            DO
                BEGIN
                /* EL CODIGO DEL MUNICIPIO */
                CIU = '%' || SUBSTR(CIU, 1, 6) || '%';
                SELECT MIN(CIUD_COD) FROM CIUDADES WHERE CIUD_NOM LIKE :CIU INTO :DEPTOYMUN;
                ACUMULADO = ACUMULADO + VALOR1;
                VALOR1 = ABS(VALOR1);
                SUSPEND;
                END
            END
        END

    /* EL RESTANTE CON NIT 222222222 */
    SELECT SUM(SATE_DEBITO)
        FROM SALDOS_TERCEROS
        WHERE ((CUEN_COD = '530520') OR (CUEN_COD <= '236535')) AND :ANO = SUBSTR(SACU_FECHA, 1, 4)
        INTO :VALOR1;
    if (VALOR1 > ACUMULADO) then
        BEGIN
        TIPO = '2';
        CODIGO = '75';
        SUBCODIGO = '16';
        NIT = '222222222';
        NOMBRE = 'CUANTIAS MENORES';
        VALOR1 = ABS(VALOR1 - ACUMULADO);
        VALOR2 = 0;
        VALOR3 = 0;
        DESCRIPCION = '';
        DIRECCION = '';
        DEPTOYMUN = '11001';
        SUSPEND;
        END
  /* LITERAL E: ARRENDAMIENTOS */
  ACUMULADO = 0;
  FOR SELECT MAX(TERC_NIT), SUM(SATE_DEBITO)
    FROM SALDOS_TERCEROS
    WHERE ((CUEN_COD >= '5120' AND CUEN_COD <= '512099') OR
        (CUEN_COD >= '5220' AND CUEN_COD <= '522099')) AND :ANO = SUBSTR(SACU_FECHA, 1, 4)
    GROUP BY TERC_NIT
    ORDER BY TERC_NIT
    INTO :NIT, :VALOR1
    do
        BEGIN
        IF (VALOR1 IS NULL) THEN
            VALOR1 = 0;
        if (VALOR1 >= :BASEMIN) then
            BEGIN
            FOR SELECT '2', '75', '22', TERC_NIT, TERC_NOM, 0, 0, '', TERC_DIR, TERC_CIU
            FROM TERCEROS WHERE TERC_NIT = :NIT
            INTO :TIPO, :CODIGO, :SUBCODIGO, :NIT, :NOMBRE, :VALOR2, :VALOR3, :DESCRIPCION, :DIRECCION, :CIU
            DO
                BEGIN
                /* EL CODIGO DEL MUNICIPIO */
                CIU = '%' || SUBSTR(CIU, 1, 6) || '%';
                SELECT MIN(CIUD_COD) FROM CIUDADES WHERE CIUD_NOM LIKE :CIU INTO :DEPTOYMUN;
                ACUMULADO = ACUMULADO + VALOR1;
                VALOR1 = ABS(VALOR1);
                SUSPEND;
                END
            END
        END

    /* EL RESTANTE CON NIT 222222222 */
    SELECT SUM(SATE_DEBITO)
        FROM SALDOS_TERCEROS
        WHERE ((CUEN_COD >= '5120' AND CUEN_COD <= '512099') OR
        (CUEN_COD >= '5220' AND CUEN_COD <= '522099')) AND :ANO = SUBSTR(SACU_FECHA, 1, 4)
        INTO :VALOR1;
    if (VALOR1 > ACUMULADO) then
        BEGIN
        TIPO = '2';
        CODIGO = '75';
        SUBCODIGO = '16';
        NIT = '222222222';
        NOMBRE = 'CUANTIAS MENORES';
        VALOR1 = ABS(VALOR1 - ACUMULADO);
        VALOR2 = 0;
        VALOR3 = 0;
        DESCRIPCION = '';
        DIRECCION = '';
        DEPTOYMUN = '11001';
        SUSPEND;
        END
  /* LITERAL E: IMPUESTOS */
  ACUMULADO = 0;
  FOR SELECT MAX(TERC_NIT), SUM(SATE_DEBITO)
    FROM SALDOS_TERCEROS
    WHERE ((CUEN_COD >= '5115' AND CUEN_COD <= '511599') OR
        (CUEN_COD >= '5215' AND CUEN_COD <= '521599')) AND :ANO = SUBSTR(SACU_FECHA, 1, 4)
    GROUP BY TERC_NIT
    ORDER BY TERC_NIT
    INTO :NIT, :VALOR1
    do
        BEGIN
        IF (VALOR1 IS NULL) THEN
            VALOR1 = 0;
        if (VALOR1 >= :BASEMIN) then
            BEGIN
            FOR SELECT '2', '75', '23', TERC_NIT, TERC_NOM, 0, 0, '', TERC_DIR, TERC_CIU
            FROM TERCEROS WHERE TERC_NIT = :NIT
            INTO :TIPO, :CODIGO, :SUBCODIGO, :NIT, :NOMBRE, :VALOR2, :VALOR3, :DESCRIPCION, :DIRECCION, :CIU
            DO
                BEGIN
                /* EL CODIGO DEL MUNICIPIO */
                CIU = '%' || SUBSTR(CIU, 1, 6) || '%';
                SELECT MIN(CIUD_COD) FROM CIUDADES WHERE CIUD_NOM LIKE :CIU INTO :DEPTOYMUN;
                ACUMULADO = ACUMULADO + VALOR1;
                VALOR1 = ABS(VALOR1);
                SUSPEND;
                END
            END
        END

    /* EL RESTANTE CON NIT 222222222 */
    SELECT SUM(SATE_DEBITO)
        FROM SALDOS_TERCEROS
    WHERE ((CUEN_COD >= '5115' AND CUEN_COD <= '511599') OR
        (CUEN_COD >= '5215' AND CUEN_COD <= '521599')) AND :ANO = SUBSTR(SACU_FECHA, 1, 4)
        INTO :VALOR1;
    if (VALOR1 > ACUMULADO) then
        BEGIN
        TIPO = '2';
        CODIGO = '75';
        SUBCODIGO = '16';
        NIT = '222222222';
        NOMBRE = 'CUANTIAS MENORES';
        VALOR1 = ABS(VALOR1 - ACUMULADO);
        VALOR2 = 0;
        VALOR3 = 0;
        DESCRIPCION = '';
        DIRECCION = '';
        DEPTOYMUN = '11001';
        SUSPEND;
        END
  /* LITERAL E: AMORTIZACION */
  ACUMULADO = 0;
  FOR SELECT MAX(TERC_NIT), SUM(SATE_DEBITO)
    FROM SALDOS_TERCEROS
    WHERE ((CUEN_COD >= '5165' AND CUEN_COD <= '516599') OR
        (CUEN_COD >= '5265' AND CUEN_COD <= '526599')) AND :ANO = SUBSTR(SACU_FECHA, 1, 4)
    GROUP BY TERC_NIT
    ORDER BY TERC_NIT
    INTO :NIT, :VALOR1
    do
        BEGIN
        IF (VALOR1 IS NULL) THEN
            VALOR1 = 0;
        if (VALOR1 >= :BASEMIN) then
            BEGIN
            FOR SELECT '2', '75', '24', TERC_NIT, TERC_NOM, 0, 0, '', TERC_DIR, TERC_CIU
            FROM TERCEROS WHERE TERC_NIT = :NIT
            INTO :TIPO, :CODIGO, :SUBCODIGO, :NIT, :NOMBRE, :VALOR2, :VALOR3, :DESCRIPCION, :DIRECCION, :CIU
            DO
                BEGIN
                /* EL CODIGO DEL MUNICIPIO */
                CIU = '%' || SUBSTR(CIU, 1, 6) || '%';
                SELECT MIN(CIUD_COD) FROM CIUDADES WHERE CIUD_NOM LIKE :CIU INTO :DEPTOYMUN;
                ACUMULADO = ACUMULADO + VALOR1;
                VALOR1 = ABS(VALOR1);
                SUSPEND;
                END
            END
        END

    /* EL RESTANTE CON NIT 222222222 */
    SELECT SUM(SATE_DEBITO)
        FROM SALDOS_TERCEROS
        WHERE ((CUEN_COD >= '5165' AND CUEN_COD <= '516599') OR
        (CUEN_COD >= '5265' AND CUEN_COD <= '526599')) AND :ANO = SUBSTR(SACU_FECHA, 1, 4)
        INTO :VALOR1;
    if (VALOR1 > ACUMULADO) then
        BEGIN
        TIPO = '2';
        CODIGO = '75';
        SUBCODIGO = '16';
        NIT = '222222222';
        NOMBRE = 'CUANTIAS MENORES';
        VALOR1 = ABS(VALOR1 - ACUMULADO);
        VALOR2 = 0;
        VALOR3 = 0;
        DESCRIPCION = '';
        DIRECCION = '';
        DEPTOYMUN = '11001';
        SUSPEND;
        END
  /* LITERAL E: DEPRECIACION */
  ACUMULADO = 0;
  FOR SELECT MAX(TERC_NIT), SUM(SATE_DEBITO)
    FROM SALDOS_TERCEROS
    WHERE ((CUEN_COD >= '5160' AND CUEN_COD <= '516099') OR
        (CUEN_COD >= '5260' AND CUEN_COD <= '526099')) AND :ANO = SUBSTR(SACU_FECHA, 1, 4)
    GROUP BY TERC_NIT
    ORDER BY TERC_NIT
    INTO :NIT, :VALOR1
    do
        BEGIN
        IF (VALOR1 IS NULL) THEN
            VALOR1 = 0;
        if (VALOR1 >= :BASEMIN) then
            BEGIN
            FOR SELECT '2', '75', '25', TERC_NIT, TERC_NOM, 0, 0, '', TERC_DIR, TERC_CIU
            FROM TERCEROS WHERE TERC_NIT = :NIT
            INTO :TIPO, :CODIGO, :SUBCODIGO, :NIT, :NOMBRE, :VALOR2, :VALOR3, :DESCRIPCION, :DIRECCION, :CIU
            DO
                BEGIN
                /* EL CODIGO DEL MUNICIPIO */
                CIU = '%' || SUBSTR(CIU, 1, 6) || '%';
                SELECT MIN(CIUD_COD) FROM CIUDADES WHERE CIUD_NOM LIKE :CIU INTO :DEPTOYMUN;
                ACUMULADO = ACUMULADO + VALOR1;
                VALOR1 = ABS(VALOR1);
                SUSPEND;
                END
            END
        END

    /* EL RESTANTE CON NIT 222222222 */
    SELECT SUM(SATE_DEBITO)
        FROM SALDOS_TERCEROS
        WHERE ((CUEN_COD >= '5160' AND CUEN_COD <= '516099') OR
        (CUEN_COD >= '5260' AND CUEN_COD <= '526099')) AND :ANO = SUBSTR(SACU_FECHA, 1, 4)
        INTO :VALOR1;
    if (VALOR1 > ACUMULADO) then
        BEGIN
        TIPO = '2';
        CODIGO = '75';
        SUBCODIGO = '16';
        NIT = '222222222';
        NOMBRE = 'CUANTIAS MENORES';
        VALOR1 = ABS(VALOR1 - ACUMULADO);
        VALOR2 = 0;
        VALOR3 = 0;
        DESCRIPCION = '';
        DIRECCION = '';
        DEPTOYMUN = '11001';
        SUSPEND;
        END
  /* LITERAL E: PROVISIONES */
  ACUMULADO = 0;
  FOR SELECT MAX(TERC_NIT), SUM(SATE_DEBITO)
    FROM SALDOS_TERCEROS
    WHERE ((CUEN_COD >= '5199' AND CUEN_COD <= '519999') OR
        (CUEN_COD >= '5299' AND CUEN_COD <= '529999')) AND :ANO = SUBSTR(SACU_FECHA, 1, 4)
    GROUP BY TERC_NIT
    ORDER BY TERC_NIT
    INTO :NIT, :VALOR1
    do
        BEGIN
        IF (VALOR1 IS NULL) THEN
            VALOR1 = 0;
        if (VALOR1 >= :BASEMIN) then
            BEGIN
            FOR SELECT '2', '75', '26', TERC_NIT, TERC_NOM, 0, 0, '', TERC_DIR, TERC_CIU
            FROM TERCEROS WHERE TERC_NIT = :NIT
            INTO :TIPO, :CODIGO, :SUBCODIGO, :NIT, :NOMBRE, :VALOR2, :VALOR3, :DESCRIPCION, :DIRECCION, :CIU
            DO
                BEGIN
                /* EL CODIGO DEL MUNICIPIO */
                CIU = '%' || SUBSTR(CIU, 1, 6) || '%';
                SELECT MIN(CIUD_COD) FROM CIUDADES WHERE CIUD_NOM LIKE :CIU INTO :DEPTOYMUN;
                ACUMULADO = ACUMULADO + VALOR1;
                VALOR1 = ABS(VALOR1);
                SUSPEND;
                END
            END
        END

    /* EL RESTANTE CON NIT 222222222 */
    SELECT SUM(SATE_DEBITO)
        FROM SALDOS_TERCEROS
        WHERE ((CUEN_COD >= '5199' AND CUEN_COD <= '519999') OR
        (CUEN_COD >= '5299' AND CUEN_COD <= '529999')) AND :ANO = SUBSTR(SACU_FECHA, 1, 4)
        INTO :VALOR1;
    if (VALOR1 > ACUMULADO) then
        BEGIN
        TIPO = '2';
        CODIGO = '75';
        SUBCODIGO = '16';
        NIT = '222222222';
        NOMBRE = 'CUANTIAS MENORES';
        VALOR1 = ABS(VALOR1 - ACUMULADO);
        VALOR2 = 0;
        VALOR3 = 0;
        DESCRIPCION = '';
        DIRECCION = '';
        DEPTOYMUN = '11001';
        SUSPEND;
        END
  /* LITERAL E: OTRAS DEDUCCIONES */
  ACUMULADO = 0;
  FOR SELECT MAX(TERC_NIT), SUM(SATE_DEBITO)
    FROM SALDOS_TERCEROS
    WHERE ((CUEN_COD >= '5125' AND CUEN_COD <= '512599') OR
        (CUEN_COD >= '5130' AND CUEN_COD <= '513099') OR
        (CUEN_COD >= '5140' AND CUEN_COD <= '514099') OR
        (CUEN_COD >= '5145' AND CUEN_COD <= '514599') OR
        (CUEN_COD >= '5150' AND CUEN_COD <= '515099') OR
        (CUEN_COD >= '5155' AND CUEN_COD <= '515599') OR
        (CUEN_COD >= '5195' AND CUEN_COD <= '519599') OR
        (CUEN_COD >= '5225' AND CUEN_COD <= '522599') OR
        (CUEN_COD >= '5230' AND CUEN_COD <= '523099') OR
        (CUEN_COD >= '5240' AND CUEN_COD <= '524099') OR
        (CUEN_COD >= '5245' AND CUEN_COD <= '524599') OR
        (CUEN_COD >= '5250' AND CUEN_COD <= '525099') OR
        (CUEN_COD >= '5255' AND CUEN_COD <= '525599') OR
        (CUEN_COD >= '5295' AND CUEN_COD <= '529599')) AND :ANO = SUBSTR(SACU_FECHA, 1, 4)
    GROUP BY TERC_NIT
    ORDER BY TERC_NIT
    INTO :NIT, :VALOR1
    do
        BEGIN
        IF (VALOR1 IS NULL) THEN
            VALOR1 = 0;
        if (VALOR1 >= :BASEMIN) then
            BEGIN
            FOR SELECT '2', '75', '16', TERC_NIT, TERC_NOM, 0, 0, '', TERC_DIR, TERC_CIU
            FROM TERCEROS WHERE TERC_NIT = :NIT
            INTO :TIPO, :CODIGO, :SUBCODIGO, :NIT, :NOMBRE, :VALOR2, :VALOR3, :DESCRIPCION, :DIRECCION, :CIU
            DO
                BEGIN
                /* EL CODIGO DEL MUNICIPIO */
                CIU = '%' || SUBSTR(CIU, 1, 6) || '%';
                SELECT MIN(CIUD_COD) FROM CIUDADES WHERE CIUD_NOM LIKE :CIU INTO :DEPTOYMUN;
                ACUMULADO = ACUMULADO + VALOR1;
                VALOR1 = ABS(VALOR1);
                SUSPEND;
                END
            END
        END

    /* EL RESTANTE CON NIT 222222222 */
    SELECT SUM(SATE_DEBITO)
        FROM SALDOS_TERCEROS
        WHERE ((CUEN_COD >= '5125' AND CUEN_COD <= '512599') OR
        (CUEN_COD >= '5130' AND CUEN_COD <= '513099') OR
        (CUEN_COD >= '5140' AND CUEN_COD <= '514099') OR
        (CUEN_COD >= '5145' AND CUEN_COD <= '514599') OR
        (CUEN_COD >= '5150' AND CUEN_COD <= '515099') OR
        (CUEN_COD >= '5155' AND CUEN_COD <= '515599') OR
        (CUEN_COD >= '5195' AND CUEN_COD <= '519599') OR
        (CUEN_COD >= '5225' AND CUEN_COD <= '522599') OR
        (CUEN_COD >= '5230' AND CUEN_COD <= '523099') OR
        (CUEN_COD >= '5240' AND CUEN_COD <= '524099') OR
        (CUEN_COD >= '5245' AND CUEN_COD <= '524599') OR
        (CUEN_COD >= '5250' AND CUEN_COD <= '525099') OR
        (CUEN_COD >= '5255' AND CUEN_COD <= '525599') OR
        (CUEN_COD >= '5295' AND CUEN_COD <= '529599')) AND :ANO = SUBSTR(SACU_FECHA, 1, 4)
        INTO :VALOR1;
    if (VALOR1 > ACUMULADO) then
        BEGIN
        TIPO = '2';
        CODIGO = '75';
        SUBCODIGO = '16';
        NIT = '222222222';
        NOMBRE = 'CUANTIAS MENORES';
        VALOR1 = ABS(VALOR1 - ACUMULADO);
        VALOR2 = 0;
        VALOR3 = 0;
        DESCRIPCION = '';
        DIRECCION = '';
        DEPTOYMUN = '11001';
        SUSPEND;
        END
  /* LITERAL E: IVA RETENIDO */
  ACUMULADO = 0;
  FOR SELECT MAX(TERC_NIT), SUM(SATE_CREDITO)
    FROM SALDOS_TERCEROS
    WHERE (CUEN_COD >= '2367' AND CUEN_COD <= '236799') AND :ANO = SUBSTR(SACU_FECHA, 1, 4)
    GROUP BY TERC_NIT
    ORDER BY TERC_NIT
    INTO :NIT, :VALOR1
    do
        BEGIN
        IF (VALOR1 IS NULL) THEN
            VALOR1 = 0;
        if (VALOR1 <> 0) then
            BEGIN
            FOR SELECT '2', '75', '30', TERC_NIT, TERC_NOM, 0, 0, '', TERC_DIR, TERC_CIU
            FROM TERCEROS WHERE TERC_NIT = :NIT
            INTO :TIPO, :CODIGO, :SUBCODIGO, :NIT, :NOMBRE, :VALOR2, :VALOR3, :DESCRIPCION, :DIRECCION, :CIU
            DO
                BEGIN
                /* EL CODIGO DEL MUNICIPIO */
                CIU = '%' || SUBSTR(CIU, 1, 6) || '%';
                SELECT MIN(CIUD_COD) FROM CIUDADES WHERE CIUD_NOM LIKE :CIU INTO :DEPTOYMUN;
                ACUMULADO = ACUMULADO + VALOR1;
                VALOR1 = ABS(VALOR1);
                SUSPEND;
                END
            END
        END

  /* LITERAL E: IVA DESCONTABLE */
  ACUMULADO = 0;
  FOR SELECT MAX(TERC_NIT), SUM(SATE_DEBITO)
    FROM SALDOS_TERCEROS
    WHERE (CUEN_COD >= '24080505' AND CUEN_COD <= '24080510') AND :ANO = SUBSTR(SACU_FECHA, 1, 4)
    GROUP BY TERC_NIT
    ORDER BY TERC_NIT
    INTO :NIT, :VALOR1
    do
        BEGIN
        IF (VALOR1 IS NULL) THEN
            VALOR1 = 0;
        if (VALOR1 <> 0) then
            BEGIN
            FOR SELECT '2', '72', '20', TERC_NIT, TERC_NOM, 0, 0, '', TERC_DIR, TERC_CIU
            FROM TERCEROS WHERE TERC_NIT = :NIT
            INTO :TIPO, :CODIGO, :SUBCODIGO, :NIT, :NOMBRE, :VALOR2, :VALOR3, :DESCRIPCION, :DIRECCION, :CIU
            DO
                BEGIN
                /* EL CODIGO DEL MUNICIPIO */
                CIU = '%' || SUBSTR(CIU, 1, 6) || '%';
                SELECT MIN(CIUD_COD) FROM CIUDADES WHERE CIUD_NOM LIKE :CIU INTO :DEPTOYMUN;
                ACUMULADO = ACUMULADO + VALOR1;
                VALOR1 = ABS(VALOR1);
                SUSPEND;
                END
            END
        END
  /* LITERAL E: RETEFUENTE SALARIOS */
  ACUMULADO = 0;
  FOR SELECT MAX(TERC_NIT), SUM(SATE_DEBITO)
    FROM SALDOS_TERCEROS
    WHERE (CUEN_COD >= '236505' AND CUEN_COD <= '23650599') AND :ANO = SUBSTR(SACU_FECHA, 1, 4)
    GROUP BY TERC_NIT
    ORDER BY TERC_NIT
    INTO :NIT, :VALOR1
    do
        BEGIN
        IF (VALOR1 IS NULL) THEN
            VALOR1 = 0;
        if (VALOR1 <> 0) then
            BEGIN
            FOR SELECT '2', '72', '01', TERC_NIT, TERC_NOM, 0, 0, '', TERC_DIR, TERC_CIU
            FROM TERCEROS WHERE TERC_NIT = :NIT
            INTO :TIPO, :CODIGO, :SUBCODIGO, :NIT, :NOMBRE, :VALOR2, :VALOR3, :DESCRIPCION, :DIRECCION, :CIU
            DO
                BEGIN
                /* CALCULE LA BASE */
                SELECT SUM(CODE_BASE) FROM COMPROBANTE_DETALLE D, COMPROBANTE_ENCABEZADO E
                WHERE E.ENCO_CONSEC = D.ENCO_CONSEC AND (CUEN_COD >= '236505' AND CUEN_COD <= '23650599')
                    AND :ANO = SUBSTR(E.ENCO_FECHA, 1, 4) AND D.TERC_NIT = :NIT
                INTO :VALOR2;
                IF (VALOR2 IS NULL) THEN
                    VALOR2 = 0;
                /* EL CODIGO DEL MUNICIPIO */
                CIU = '%' || SUBSTR(CIU, 1, 6) || '%';
                SELECT MIN(CIUD_COD) FROM CIUDADES WHERE CIUD_NOM LIKE :CIU INTO :DEPTOYMUN;
                ACUMULADO = ACUMULADO + VALOR1;
                VALOR1 = ABS(VALOR1);
                SUSPEND;
                END
            END
        END

  /* LITERAL E: RETEFUENTE COMPRAS */
  ACUMULADO = 0;
  FOR SELECT MAX(TERC_NIT), SUM(SATE_DEBITO)
    FROM SALDOS_TERCEROS
    WHERE (CUEN_COD >= '236540' AND CUEN_COD <= '23654099') AND :ANO = SUBSTR(SACU_FECHA, 1, 4)
    GROUP BY TERC_NIT
    ORDER BY TERC_NIT
    INTO :NIT, :VALOR1
    do
        BEGIN
        IF (VALOR1 IS NULL) THEN
            VALOR1 = 0;
        if (VALOR1 <> 0) then
            BEGIN
            FOR SELECT '2', '72', '00', TERC_NIT, TERC_NOM, 0, 0, '', TERC_DIR, TERC_CIU
            FROM TERCEROS WHERE TERC_NIT = :NIT
            INTO :TIPO, :CODIGO, :SUBCODIGO, :NIT, :NOMBRE, :VALOR2, :VALOR3, :DESCRIPCION, :DIRECCION, :CIU
            DO
                BEGIN
                /* CALCULE LA BASE */
                SELECT SUM(CODE_BASE) FROM COMPROBANTE_DETALLE D, COMPROBANTE_ENCABEZADO E
                WHERE E.ENCO_CONSEC = D.ENCO_CONSEC AND (CUEN_COD >= '236540' AND CUEN_COD <= '23654099')
                    AND :ANO = SUBSTR(E.ENCO_FECHA, 1, 4) AND D.TERC_NIT = :NIT
                INTO :VALOR2;
                IF (VALOR2 IS NULL) THEN
                    VALOR2 = 0;
                /* EL CODIGO DEL MUNICIPIO */
                CIU = '%' || SUBSTR(CIU, 1, 6) || '%';
                SELECT MIN(CIUD_COD) FROM CIUDADES WHERE CIUD_NOM LIKE :CIU INTO :DEPTOYMUN;
                ACUMULADO = ACUMULADO + VALOR1;
                VALOR1 = ABS(VALOR1);
                SUSPEND;
                END
            END
        END
  /* LITERAL E: RETEFUENTE HONORARIOS Y COMISIONES */
  ACUMULADO = 0;
  FOR SELECT MAX(TERC_NIT), SUM(SATE_DEBITO)
    FROM SALDOS_TERCEROS
    WHERE (CUEN_COD >= '236515' AND CUEN_COD <= '23652099') AND :ANO = SUBSTR(SACU_FECHA, 1, 4)
    GROUP BY TERC_NIT
    ORDER BY TERC_NIT
    INTO :NIT, :VALOR1
    do
        BEGIN
        IF (VALOR1 IS NULL) THEN
            VALOR1 = 0;
        if (VALOR1 <> 0) then
            BEGIN
            FOR SELECT '2', '72', '10', TERC_NIT, TERC_NOM, 0, 0, '', TERC_DIR, TERC_CIU
            FROM TERCEROS WHERE TERC_NIT = :NIT
            INTO :TIPO, :CODIGO, :SUBCODIGO, :NIT, :NOMBRE, :VALOR2, :VALOR3, :DESCRIPCION, :DIRECCION, :CIU
            DO
                BEGIN
                /* CALCULE LA BASE */
                SELECT SUM(CODE_BASE) FROM COMPROBANTE_DETALLE D, COMPROBANTE_ENCABEZADO E
                WHERE E.ENCO_CONSEC = D.ENCO_CONSEC AND (CUEN_COD >= '236515' AND CUEN_COD <= '23652099')
                    AND :ANO = SUBSTR(E.ENCO_FECHA, 1, 4) AND D.TERC_NIT = :NIT
                INTO :VALOR2;
                IF (VALOR2 IS NULL) THEN
                    VALOR2 = 0;
                /* EL CODIGO DEL MUNICIPIO */
                CIU = '%' || SUBSTR(CIU, 1, 6) || '%';
                SELECT MIN(CIUD_COD) FROM CIUDADES WHERE CIUD_NOM LIKE :CIU INTO :DEPTOYMUN;
                ACUMULADO = ACUMULADO + VALOR1;
                VALOR1 = ABS(VALOR1);
                SUSPEND;
                END
            END
        END

  /* LITERAL E: RETEFUENTE SERVICIOS */
  ACUMULADO = 0;
  FOR SELECT MAX(TERC_NIT), SUM(SATE_DEBITO)
    FROM SALDOS_TERCEROS
    WHERE (CUEN_COD >= '236525' AND CUEN_COD <= '23652599') AND :ANO = SUBSTR(SACU_FECHA, 1, 4)
    GROUP BY TERC_NIT
    ORDER BY TERC_NIT
    INTO :NIT, :VALOR1
    do
        BEGIN
        IF (VALOR1 IS NULL) THEN
            VALOR1 = 0;
        if (VALOR1 <> 0) then
            BEGIN
            FOR SELECT '2', '72', '15', TERC_NIT, TERC_NOM, 0, 0, '', TERC_DIR, TERC_CIU
            FROM TERCEROS WHERE TERC_NIT = :NIT
            INTO :TIPO, :CODIGO, :SUBCODIGO, :NIT, :NOMBRE, :VALOR2, :VALOR3, :DESCRIPCION, :DIRECCION, :CIU
            DO
                BEGIN
                /* CALCULE LA BASE */
                SELECT SUM(CODE_BASE) FROM COMPROBANTE_DETALLE D, COMPROBANTE_ENCABEZADO E
                WHERE E.ENCO_CONSEC = D.ENCO_CONSEC AND (CUEN_COD >= '236525' AND CUEN_COD <= '23652599')
                    AND :ANO = SUBSTR(E.ENCO_FECHA, 1, 4) AND D.TERC_NIT = :NIT
                INTO :VALOR2;
                IF (VALOR2 IS NULL) THEN
                    VALOR2 = 0;
                /* EL CODIGO DEL MUNICIPIO */
                CIU = '%' || SUBSTR(CIU, 1, 6) || '%';
                SELECT MIN(CIUD_COD) FROM CIUDADES WHERE CIUD_NOM LIKE :CIU INTO :DEPTOYMUN;
                ACUMULADO = ACUMULADO + VALOR1;
                VALOR1 = ABS(VALOR1);
                SUSPEND;
                END
            END
        END
  /* LITERAL E: RETEFUENTE RENDIMIENTOS */
  ACUMULADO = 0;
  FOR SELECT MAX(TERC_NIT), SUM(SATE_DEBITO)
    FROM SALDOS_TERCEROS
    WHERE (CUEN_COD >= '236535' AND CUEN_COD <= '23653599') AND :ANO = SUBSTR(SACU_FECHA, 1, 4)
    GROUP BY TERC_NIT
    ORDER BY TERC_NIT
    INTO :NIT, :VALOR1
    do
        BEGIN
        IF (VALOR1 IS NULL) THEN
            VALOR1 = 0;
        if (VALOR1 <> 0) then
            BEGIN
            FOR SELECT '2', '72', '21', TERC_NIT, TERC_NOM, 0, 0, '', TERC_DIR, TERC_CIU
            FROM TERCEROS WHERE TERC_NIT = :NIT
            INTO :TIPO, :CODIGO, :SUBCODIGO, :NIT, :NOMBRE, :VALOR2, :VALOR3, :DESCRIPCION, :DIRECCION, :CIU
            DO
                BEGIN
                /* CALCULE LA BASE */
                SELECT SUM(CODE_BASE) FROM COMPROBANTE_DETALLE D, COMPROBANTE_ENCABEZADO E
                WHERE E.ENCO_CONSEC = D.ENCO_CONSEC AND (CUEN_COD >= '236535' AND CUEN_COD <= '23653599')
                    AND :ANO = SUBSTR(E.ENCO_FECHA, 1, 4) AND D.TERC_NIT = :NIT
                INTO :VALOR2;
                IF (VALOR2 IS NULL) THEN
                    VALOR2 = 0;
                /* EL CODIGO DEL MUNICIPIO */
                CIU = '%' || SUBSTR(CIU, 1, 6) || '%';
                SELECT MIN(CIUD_COD) FROM CIUDADES WHERE CIUD_NOM LIKE :CIU INTO :DEPTOYMUN;
                ACUMULADO = ACUMULADO + VALOR1;
                VALOR1 = ABS(VALOR1);
                SUSPEND;
                END
            END
        END

  /* LITERAL E: RETEFUENTE ARRENDAMIENTOS */
  ACUMULADO = 0;
  FOR SELECT MAX(TERC_NIT), SUM(SATE_DEBITO)
    FROM SALDOS_TERCEROS
    WHERE (CUEN_COD >= '236530' AND CUEN_COD <= '23653099') AND :ANO = SUBSTR(SACU_FECHA, 1, 4)
    GROUP BY TERC_NIT
    ORDER BY TERC_NIT
    INTO :NIT, :VALOR1
    do
        BEGIN
        IF (VALOR1 IS NULL) THEN
            VALOR1 = 0;
        if (VALOR1 <> 0) then
            BEGIN
            FOR SELECT '2', '72', '22', TERC_NIT, TERC_NOM, 0, 0, '', TERC_DIR, TERC_CIU
            FROM TERCEROS WHERE TERC_NIT = :NIT
            INTO :TIPO, :CODIGO, :SUBCODIGO, :NIT, :NOMBRE, :VALOR2, :VALOR3, :DESCRIPCION, :DIRECCION, :CIU
            DO
                BEGIN
                /* CALCULE LA BASE */
                SELECT SUM(CODE_BASE) FROM COMPROBANTE_DETALLE D, COMPROBANTE_ENCABEZADO E
                WHERE E.ENCO_CONSEC = D.ENCO_CONSEC AND (CUEN_COD >= '236525' AND CUEN_COD <= '23652599')
                    AND :ANO = SUBSTR(E.ENCO_FECHA, 1, 4) AND D.TERC_NIT = :NIT
                INTO :VALOR2;
                IF (VALOR2 IS NULL) THEN
                    VALOR2 = 0;
                /* EL CODIGO DEL MUNICIPIO */
                CIU = '%' || SUBSTR(CIU, 1, 6) || '%';
                SELECT MIN(CIUD_COD) FROM CIUDADES WHERE CIUD_NOM LIKE :CIU INTO :DEPTOYMUN;
                ACUMULADO = ACUMULADO + VALOR1;
                VALOR1 = ABS(VALOR1);
                SUSPEND;
                END
            END
        END
  /* LITERAL E: RETEFUENTE otras */
  ACUMULADO = 0;
  FOR SELECT MAX(TERC_NIT), SUM(SATE_DEBITO)
    FROM SALDOS_TERCEROS
    WHERE (CUEN_COD >= '236570' AND CUEN_COD <= '23657099') AND :ANO = SUBSTR(SACU_FECHA, 1, 4)
    GROUP BY TERC_NIT
    ORDER BY TERC_NIT
    INTO :NIT, :VALOR1
    do
        BEGIN
        IF (VALOR1 IS NULL) THEN
            VALOR1 = 0;
        if (VALOR1 <> 0) then
            BEGIN
            FOR SELECT '2', '72', '16', TERC_NIT, TERC_NOM, 0, 0, '', TERC_DIR, TERC_CIU
            FROM TERCEROS WHERE TERC_NIT = :NIT
            INTO :TIPO, :CODIGO, :SUBCODIGO, :NIT, :NOMBRE, :VALOR2, :VALOR3, :DESCRIPCION, :DIRECCION, :CIU
            DO
                BEGIN
                /* CALCULE LA BASE */
                SELECT SUM(CODE_BASE) FROM COMPROBANTE_DETALLE D, COMPROBANTE_ENCABEZADO E
                WHERE E.ENCO_CONSEC = D.ENCO_CONSEC AND (CUEN_COD >= '236570' AND CUEN_COD <= '23657099')
                    AND :ANO = SUBSTR(E.ENCO_FECHA, 1, 4) AND D.TERC_NIT = :NIT
                INTO :VALOR2;
                IF (VALOR2 IS NULL) THEN
                    VALOR2 = 0;
                /* EL CODIGO DEL MUNICIPIO */
                CIU = '%' || SUBSTR(CIU, 1, 6) || '%';
                SELECT MIN(CIUD_COD) FROM CIUDADES WHERE CIUD_NOM LIKE :CIU INTO :DEPTOYMUN;
                ACUMULADO = ACUMULADO + VALOR1;
                VALOR1 = ABS(VALOR1);
                SUSPEND;
                END
            END
        END

  /* LITERAL F: INGRESOS OPERACIONALES */
  BASEMIN = 5000000;
  ACUMULADO = 0;
  FOR SELECT MAX(TERC_NIT), SUM(SATE_CREDITO)
    FROM SALDOS_TERCEROS
    WHERE (CUEN_COD >= '41' AND CUEN_COD < '42') AND :ANO = SUBSTR(SACU_FECHA, 1, 4)
    GROUP BY TERC_NIT
    ORDER BY TERC_NIT
    INTO :NIT, :VALOR1
    do
        BEGIN
        IF (VALOR1 IS NULL) THEN
            VALOR1 = 0;
        if (VALOR1 > BASEMIN) then
            BEGIN
            FOR SELECT '2', '78', '00', TERC_NIT, TERC_NOM, 0, 0, '', TERC_DIR, TERC_CIU
            FROM TERCEROS WHERE TERC_NIT = :NIT
            INTO :TIPO, :CODIGO, :SUBCODIGO, :NIT, :NOMBRE, :VALOR2, :VALOR3, :DESCRIPCION, :DIRECCION, :CIU
            DO
                BEGIN
                /* EL CODIGO DEL MUNICIPIO */
                CIU = '%' || SUBSTR(CIU, 1, 6) || '%';
                SELECT MIN(CIUD_COD) FROM CIUDADES WHERE CIUD_NOM LIKE :CIU INTO :DEPTOYMUN;
                ACUMULADO = ACUMULADO + VALOR1;
                VALOR1 = ABS(VALOR1);
                SUSPEND;
                END
            END
        END
  /* LITERAL F: INGRESOS NO OPERACIONALES */
  ACUMULADO = 0;
  FOR SELECT MAX(TERC_NIT), SUM(SATE_CREDITO)
    FROM SALDOS_TERCEROS
    WHERE (CUEN_COD >= '421010' AND CUEN_COD < '43') AND :ANO = SUBSTR(SACU_FECHA, 1, 4)
    GROUP BY TERC_NIT
    ORDER BY TERC_NIT
    INTO :NIT, :VALOR1
    do
        BEGIN
        IF (VALOR1 IS NULL) THEN
            VALOR1 = 0;
        if (VALOR1 > BASEMIN) then
            BEGIN
            FOR SELECT '2', '78', '01', TERC_NIT, TERC_NOM, 0, 0, '', TERC_DIR, TERC_CIU
            FROM TERCEROS WHERE TERC_NIT = :NIT
            INTO :TIPO, :CODIGO, :SUBCODIGO, :NIT, :NOMBRE, :VALOR2, :VALOR3, :DESCRIPCION, :DIRECCION, :CIU
            DO
                BEGIN
                /* EL CODIGO DEL MUNICIPIO */
                CIU = '%' || SUBSTR(CIU, 1, 6) || '%';
                SELECT MIN(CIUD_COD) FROM CIUDADES WHERE CIUD_NOM LIKE :CIU INTO :DEPTOYMUN;
                ACUMULADO = ACUMULADO + VALOR1;
                VALOR1 = ABS(VALOR1);
                SUSPEND;
                END
            END
        END

  /* LITERAL F: INGRESOS FINANCIEROS */
  ACUMULADO = 0;
  FOR SELECT MAX(TERC_NIT), SUM(SATE_CREDITO)
    FROM SALDOS_TERCEROS
    WHERE (CUEN_COD >= '421005' AND CUEN_COD <= '42100599') AND :ANO = SUBSTR(SACU_FECHA, 1, 4)
    GROUP BY TERC_NIT
    ORDER BY TERC_NIT
    INTO :NIT, :VALOR1
    do
        BEGIN
        IF (VALOR1 IS NULL) THEN
            VALOR1 = 0;
        if (VALOR1 > BASEMIN) then
            BEGIN
            FOR SELECT '2', '78', '02', TERC_NIT, TERC_NOM, 0, 0, '', TERC_DIR, TERC_CIU
            FROM TERCEROS WHERE TERC_NIT = :NIT
            INTO :TIPO, :CODIGO, :SUBCODIGO, :NIT, :NOMBRE, :VALOR2, :VALOR3, :DESCRIPCION, :DIRECCION, :CIU
            DO
                BEGIN
                /* EL CODIGO DEL MUNICIPIO */
                CIU = '%' || SUBSTR(CIU, 1, 6) || '%';
                SELECT MIN(CIUD_COD) FROM CIUDADES WHERE CIUD_NOM LIKE :CIU INTO :DEPTOYMUN;
                ACUMULADO = ACUMULADO + VALOR1;
                VALOR1 = ABS(VALOR1);
                SUSPEND;
                END
            END
        END
  /* LITERAL F: IVA GENERADO */
  ACUMULADO = 0;
  FOR SELECT MAX(TERC_NIT), SUM(SATE_CREDITO)
    FROM SALDOS_TERCEROS
    WHERE (CUEN_COD >= '2408' AND CUEN_COD <= '240899') AND :ANO = SUBSTR(SACU_FECHA, 1, 4)
    GROUP BY TERC_NIT
    ORDER BY TERC_NIT
    INTO :NIT, :VALOR1
    do
        BEGIN
        IF (VALOR1 IS NULL) THEN
            VALOR1 = 0;
        if (VALOR1 > BASEMIN) then
            BEGIN
            FOR SELECT '2', '78', '03', TERC_NIT, TERC_NOM, 0, 0, '', TERC_DIR, TERC_CIU
            FROM TERCEROS WHERE TERC_NIT = :NIT
            INTO :TIPO, :CODIGO, :SUBCODIGO, :NIT, :NOMBRE, :VALOR2, :VALOR3, :DESCRIPCION, :DIRECCION, :CIU
            DO
                BEGIN
                /* EL CODIGO DEL MUNICIPIO */
                CIU = '%' || SUBSTR(CIU, 1, 6) || '%';
                SELECT MIN(CIUD_COD) FROM CIUDADES WHERE CIUD_NOM LIKE :CIU INTO :DEPTOYMUN;
                ACUMULADO = ACUMULADO + VALOR1;
                VALOR1 = ABS(VALOR1);
                SUSPEND;
                END
            END
        END

  /* LITERAL H: CUENTAS POR PAGAR PROVEEDORES */
  BASEMIN = -5000000;
  ACUMULADO = 0;
  FOR SELECT CUEN_COD FROM CUENTAS WHERE CUEN_COD <= '22' AND CUEN_COD < '23' ORDER BY CUEN_COD INTO :CTAAUX
      do
        BEGIN
        FOR SELECT '2', '87', '00', TERC_NIT, TERC_NOM, 0, 0, '', TERC_DIR, TERC_CIU
        FROM TERCEROS
        INTO :TIPO, :CODIGO, :SUBCODIGO, :NIT, :NOMBRE, :VALOR2, :VALOR3, :DESCRIPCION, :DIRECCION, :CIU
            DO
            BEGIN
            EXECUTE PROCEDURE SALDO_TERCERO_MES(:CTAAUX, :NIT, :ANO, 13, 'S') RETURNING_VALUES (VALOR1);
            if (VALOR1 < BASEMIN) then
                BEGIN
                /* EL CODIGO DEL MUNICIPIO */
                CIU = '%' || SUBSTR(CIU, 1, 6) || '%';
                SELECT MIN(CIUD_COD) FROM CIUDADES WHERE CIUD_NOM LIKE :CIU INTO :DEPTOYMUN;
                VALOR1 = ABS(VALOR1);
                SUSPEND;
                END
            ELSE
               BEGIN
               VALOR1 = ABS(VALOR1);
               ACUMULADO = ACUMULADO + VALOR1;
               END
            END
        END
    /* EL RESTANTE CON NIT 222222222 */
    TIPO = '2';
    CODIGO = '87';
    SUBCODIGO = '00';
    NIT = '222222222';
    NOMBRE = 'SALDO DE PASIVO DE MENOR CUANTIA';
    VALOR1 = ACUMULADO;
    VALOR2 = 0;
    VALOR3 = 0;
    DESCRIPCION = '';
    DIRECCION = '';
    DEPTOYMUN = '11001';
    SUSPEND;

  /* LITERAL H: CUENTAS POR PAGAR COMPANIAS VINCULADAS, ACCIONISTAS Y SOCIOS */
  BASEMIN = -5000000;
  ACUMULADO = 0;
  FOR SELECT CUEN_COD FROM CUENTAS
  WHERE ((CUEN_COD <= '2355' AND CUEN_COD < '2356') OR
  (CUEN_COD <= '2315' AND CUEN_COD < '2316'))
  ORDER BY CUEN_COD INTO :CTAAUX
      do
        BEGIN
        FOR SELECT '2', '87', '02', TERC_NIT, TERC_NOM, 0, 0, '', TERC_DIR, TERC_CIU
        FROM TERCEROS
        INTO :TIPO, :CODIGO, :SUBCODIGO, :NIT, :NOMBRE, :VALOR2, :VALOR3, :DESCRIPCION, :DIRECCION, :CIU
            DO
            BEGIN
            EXECUTE PROCEDURE SALDO_TERCERO_MES(:CTAAUX, :NIT, :ANO, 13, 'S') RETURNING_VALUES (VALOR1);
            if (VALOR1 < BASEMIN) then
                BEGIN
                /* EL CODIGO DEL MUNICIPIO */
                CIU = '%' || SUBSTR(CIU, 1, 6) || '%';
                SELECT MIN(CIUD_COD) FROM CIUDADES WHERE CIUD_NOM LIKE :CIU INTO :DEPTOYMUN;
                VALOR1 = ABS(VALOR1);
                SUSPEND;
                END
            ELSE
               BEGIN
               VALOR1 = ABS(VALOR1);
               ACUMULADO = ACUMULADO + VALOR1;
               END
            END
        END

    /* EL RESTANTE CON NIT 222222222 */
    TIPO = '2';
    CODIGO = '87';
    SUBCODIGO = '02';
    NIT = '222222222';
    NOMBRE = 'SALDO DE PASIVO DE MENOR CUANTIA';
    VALOR1 = ACUMULADO;
    VALOR2 = 0;
    VALOR3 = 0;
    DESCRIPCION = '';
    DIRECCION = '';
    DEPTOYMUN = '11001';
    SUSPEND;

  /* LITERAL H: CUENTAS POR PAGAR FINANCIERAS */
  BASEMIN = -5000000;
  ACUMULADO = 0;
  FOR SELECT CUEN_COD FROM CUENTAS WHERE CUEN_COD <= '21' AND CUEN_COD < '22' ORDER BY CUEN_COD INTO :CTAAUX
      do
        BEGIN
        FOR SELECT '2', '87', '03', TERC_NIT, TERC_NOM, 0, 0, '', TERC_DIR, TERC_CIU
        FROM TERCEROS
        INTO :TIPO, :CODIGO, :SUBCODIGO, :NIT, :NOMBRE, :VALOR2, :VALOR3, :DESCRIPCION, :DIRECCION, :CIU
            DO
            BEGIN
            EXECUTE PROCEDURE SALDO_TERCERO_MES(:CTAAUX, :NIT, :ANO, 13, 'S') RETURNING_VALUES (VALOR1);
            if (VALOR1 < BASEMIN) then
                BEGIN
                /* EL CODIGO DEL MUNICIPIO */
                CIU = '%' || SUBSTR(CIU, 1, 6) || '%';
                SELECT MIN(CIUD_COD) FROM CIUDADES WHERE CIUD_NOM LIKE :CIU INTO :DEPTOYMUN;
                VALOR1 = ABS(VALOR1);
                SUSPEND;
                END
            ELSE
               BEGIN
               VALOR1 = ABS(VALOR1);
               ACUMULADO = ACUMULADO + VALOR1;
               END
            END
        END
    /* EL RESTANTE CON NIT 222222222 */
    TIPO = '2';
    CODIGO = '87';
    SUBCODIGO = '03';
    NIT = '222222222';
    NOMBRE = 'SALDO DE PASIVO DE MENOR CUANTIA';
    VALOR1 = ACUMULADO;
    VALOR2 = 0;
    VALOR3 = 0;
    DESCRIPCION = '';
    DIRECCION = '';
    DEPTOYMUN = '11001';
    SUSPEND;
  /* LITERAL H: CUENTAS POR PAGAR LABORALES */
  BASEMIN = -5000000;
  ACUMULADO = 0;
  FOR SELECT CUEN_COD FROM CUENTAS WHERE CUEN_COD <= '25' AND CUEN_COD < '26' ORDER BY CUEN_COD INTO :CTAAUX
      do
        BEGIN
        FOR SELECT '2', '87', '05', TERC_NIT, TERC_NOM, 0, 0, '', TERC_DIR, TERC_CIU
        FROM TERCEROS
        INTO :TIPO, :CODIGO, :SUBCODIGO, :NIT, :NOMBRE, :VALOR2, :VALOR3, :DESCRIPCION, :DIRECCION, :CIU
            DO
            BEGIN
            EXECUTE PROCEDURE SALDO_TERCERO_MES(:CTAAUX, :NIT, :ANO, 13, 'S') RETURNING_VALUES (VALOR1);
            if (VALOR1 < BASEMIN) then
                BEGIN
                /* EL CODIGO DEL MUNICIPIO */
                CIU = '%' || SUBSTR(CIU, 1, 6) || '%';
                SELECT MIN(CIUD_COD) FROM CIUDADES WHERE CIUD_NOM LIKE :CIU INTO :DEPTOYMUN;
                VALOR1 = ABS(VALOR1);
                SUSPEND;
                END
            ELSE
               BEGIN
               VALOR1 = ABS(VALOR1);
               ACUMULADO = ACUMULADO + VALOR1;
               END
            END
        END
    /* EL RESTANTE CON NIT 222222222 */
    TIPO = '2';
    CODIGO = '87';
    SUBCODIGO = '05';
    NIT = '222222222';
    NOMBRE = 'SALDO DE PASIVO DE MENOR CUANTIA';
    VALOR1 = ACUMULADO;
    VALOR2 = 0;
    VALOR3 = 0;
    DESCRIPCION = '';
    DIRECCION = '';
    DEPTOYMUN = '11001';
    SUSPEND;

  /* LITERAL H: CUENTAS POR PAGAR IMPUESTOS */
  BASEMIN = -5000000;
  ACUMULADO = 0;
  FOR SELECT CUEN_COD FROM CUENTAS WHERE CUEN_COD <= '24' AND CUEN_COD < '25' ORDER BY CUEN_COD INTO :CTAAUX
      do
        BEGIN
        FOR SELECT '2', '87', '06', TERC_NIT, TERC_NOM, 0, 0, '', TERC_DIR, TERC_CIU
        FROM TERCEROS
        INTO :TIPO, :CODIGO, :SUBCODIGO, :NIT, :NOMBRE, :VALOR2, :VALOR3, :DESCRIPCION, :DIRECCION, :CIU
            DO
            BEGIN
            EXECUTE PROCEDURE SALDO_TERCERO_MES(:CTAAUX, :NIT, :ANO, 13, 'S') RETURNING_VALUES (VALOR1);
            if (VALOR1 < BASEMIN) then
                BEGIN
                /* EL CODIGO DEL MUNICIPIO */
                CIU = '%' || SUBSTR(CIU, 1, 6) || '%';
                SELECT MIN(CIUD_COD) FROM CIUDADES WHERE CIUD_NOM LIKE :CIU INTO :DEPTOYMUN;
                VALOR1 = ABS(VALOR1);
                SUSPEND;
                END
            ELSE
               BEGIN
               VALOR1 = ABS(VALOR1);
               ACUMULADO = ACUMULADO + VALOR1;
               END
            END
        END
    /* EL RESTANTE CON NIT 222222222 */
    TIPO = '2';
    CODIGO = '87';
    SUBCODIGO = '06';
    NIT = '222222222';
    NOMBRE = 'SALDO DE PASIVO DE MENOR CUANTIA';
    VALOR1 = ACUMULADO;
    VALOR2 = 0;
    VALOR3 = 0;
    DESCRIPCION = '';
    DIRECCION = '';
    DEPTOYMUN = '11001';
    SUSPEND;
  /* LITERAL H: DEMAS CUENTAS POR PAGAR */
  BASEMIN = -5000000;
  ACUMULADO = 0;
  FOR SELECT CUEN_COD FROM CUENTAS
  WHERE (((CUEN_COD <= '23') AND (CUEN_COD < '24')) AND
  ((CUEN_COD < '2355') or (CUEN_COD >= '2356')) AND
  ((CUEN_COD < '2315') OR (CUEN_COD >= '2316'))) OR
  ((CUEN_COD >= '28') AND (CUEN_COD < '3'))
   ORDER BY CUEN_COD INTO :CTAAUX
      do
        BEGIN
        FOR SELECT '2', '87', '04', TERC_NIT, TERC_NOM, 0, 0, '', TERC_DIR, TERC_CIU
        FROM TERCEROS
        INTO :TIPO, :CODIGO, :SUBCODIGO, :NIT, :NOMBRE, :VALOR2, :VALOR3, :DESCRIPCION, :DIRECCION, :CIU
            DO
            BEGIN
            EXECUTE PROCEDURE SALDO_TERCERO_MES(:CTAAUX, :NIT, :ANO, 13, 'S') RETURNING_VALUES (VALOR1);
            if (VALOR1 < BASEMIN) then
                BEGIN
                /* EL CODIGO DEL MUNICIPIO */
                CIU = '%' || SUBSTR(CIU, 1, 6) || '%';
                SELECT MIN(CIUD_COD) FROM CIUDADES WHERE CIUD_NOM LIKE :CIU INTO :DEPTOYMUN;
                VALOR1 = ABS(VALOR1);
                SUSPEND;
                END
            ELSE
               BEGIN
               VALOR1 = ABS(VALOR1);
               ACUMULADO = ACUMULADO + VALOR1;
               END
            END
        END
    /* EL RESTANTE CON NIT 222222222 */
    TIPO = '2';
    CODIGO = '87';
    SUBCODIGO = '04';
    NIT = '222222222';
    NOMBRE = 'SALDO DE PASIVO DE MENOR CUANTIA';
    VALOR1 = ACUMULADO;
    VALOR2 = 0;
    VALOR3 = 0;
    DESCRIPCION = '';
    DIRECCION = '';
    DEPTOYMUN = '11001';
    SUSPEND;

  /* LITERAL I: DEUDORES - CLIENTES */
  BASEMIN = 5000000;
  ACUMULADO = 0;
  FOR SELECT CUEN_COD FROM CUENTAS WHERE CUEN_COD <= '1305' AND CUEN_COD < '1306' ORDER BY CUEN_COD INTO :CTAAUX
      do
        BEGIN
        FOR SELECT '2', '90', '00', TERC_NIT, TERC_NOM, 0, 0, '', TERC_DIR, TERC_CIU
        FROM TERCEROS
        INTO :TIPO, :CODIGO, :SUBCODIGO, :NIT, :NOMBRE, :VALOR2, :VALOR3, :DESCRIPCION, :DIRECCION, :CIU
            DO
            BEGIN
            EXECUTE PROCEDURE SALDO_TERCERO_MES(:CTAAUX, :NIT, :ANO, 13, 'S') RETURNING_VALUES (VALOR1);
            if (VALOR1 > BASEMIN) then
                BEGIN
                /* EL CODIGO DEL MUNICIPIO */
                CIU = '%' || SUBSTR(CIU, 1, 6) || '%';
                SELECT MIN(CIUD_COD) FROM CIUDADES WHERE CIUD_NOM LIKE :CIU INTO :DEPTOYMUN;
                SUSPEND;
                END
            ELSE
               BEGIN
               ACUMULADO = ACUMULADO + VALOR1;
               END
            END
        END
    /* EL RESTANTE CON NIT 222222222 */
    TIPO = '2';
    CODIGO = '90';
    SUBCODIGO = '00';
    NIT = '222222222';
    NOMBRE = 'SALDO DEUDORES DE MENOR CUANTIA';
    VALOR1 = ACUMULADO;
    VALOR2 = 0;
    VALOR3 = 0;
    DESCRIPCION = '';
    DIRECCION = '';
    DEPTOYMUN = '11001';
    SUSPEND;
  /* LITERAL I: DEUDORES - ACCIONISTAS,SOCIOS Y CIAS VINCULADAS */
  BASEMIN = 5000000;
  ACUMULADO = 0;
  FOR SELECT CUEN_COD FROM CUENTAS
  WHERE ((CUEN_COD <= '1310' AND CUEN_COD < '131016') OR
  (CUEN_COD <= '1320' AND CUEN_COD < '1326'))
  ORDER BY CUEN_COD INTO :CTAAUX
      do
        BEGIN
        FOR SELECT '2', '90', '02', TERC_NIT, TERC_NOM, 0, 0, '', TERC_DIR, TERC_CIU
        FROM TERCEROS
        INTO :TIPO, :CODIGO, :SUBCODIGO, :NIT, :NOMBRE, :VALOR2, :VALOR3, :DESCRIPCION, :DIRECCION, :CIU
            DO
            BEGIN
            EXECUTE PROCEDURE SALDO_TERCERO_MES(:CTAAUX, :NIT, :ANO, 13, 'S') RETURNING_VALUES (VALOR1);
            if (VALOR1 > BASEMIN) then
                BEGIN
                /* EL CODIGO DEL MUNICIPIO */
                CIU = '%' || SUBSTR(CIU, 1, 6) || '%';
                SELECT MIN(CIUD_COD) FROM CIUDADES WHERE CIUD_NOM LIKE :CIU INTO :DEPTOYMUN;
                SUSPEND;
                END
            ELSE
               BEGIN
               ACUMULADO = ACUMULADO + VALOR1;
               END
            END
        END
    /* EL RESTANTE CON NIT 222222222 */
    TIPO = '2';
    CODIGO = '90';
    SUBCODIGO = '02';
    NIT = '222222222';
    NOMBRE = 'SALDO DEUDORES DE MENOR CUANTIA';
    VALOR1 = ACUMULADO;
    VALOR2 = 0;
    VALOR3 = 0;
    DESCRIPCION = '';
    DIRECCION = '';
    DEPTOYMUN = '11001';
    SUSPEND;
END;

/*******************************************************************************
The next statement causes the following error:

Undefined name.
Dynamic SQL Error.
SQL error code = -204.
Ambiguous field name between table COMPROBANTE_DETALLE and table COMPROBANTE_ENCABEZADO .
TERC_NIT.
*******************************************************************************/
ALTER PROCEDURE MEDIOS_MAGNETICOS_SHD (
    CUENTA VARCHAR(20) CHARACTER SET NONE,
    FECINI VARCHAR(8) CHARACTER SET NONE,
    FECFIN VARCHAR(8) CHARACTER SET NONE,
    NITSHD VARCHAR(20) CHARACTER SET NONE)
RETURNS (
    NIT VARCHAR(20) CHARACTER SET NONE,
    NOMBRE VARCHAR(60) CHARACTER SET NONE,
    DIRECCION VARCHAR(60) CHARACTER SET NONE,
    TELEFONO VARCHAR(40) CHARACTER SET NONE,
    MUNICIPIO VARCHAR(5) CHARACTER SET NONE,
    NOMMUNICIPIO VARCHAR(40) CHARACTER SET NONE,
    DEPARTAMENTO VARCHAR(40) CHARACTER SET NONE,
    RETENCION NUMERIC(18,2))
AS
declare variable LONCTA INTEGER;
declare variable LONCIU INTEGER;
declare variable NOMCIUDAD VARCHAR(60);
begin
LONCTA = STRLEN(CUENTA);
FOR SELECT MAX(D.TERC_NIT), SUM(CODE_DEBITO-CODE_CREDITO) FROM COMPROBANTE_DETALLE D, COMPROBANTE_ENCABEZADO E
    WHERE E.ENCO_CONSEC = D.ENCO_CONSEC AND ENCO_FECHA >= :FECINI AND ENCO_FECHA <= :FECFIN AND D.TERC_NIT <> :NITSHD AND
    (SUBSTR(CUEN_COD,1,:LONCTA) = :CUENTA) AND ((CODE_CREDITO <> 0) or (CODE_DEBITO <> 0))
    GROUP BY D.TERC_NIT
    INTO :NIT, :RETENCION
    DO
    BEGIN
    SELECT TERC_NOM, TERC_DIR, SUBSTR(TERC_TEL,1,10), CIUD_COD FROM TERCEROS WHERE TERC_NIT = :NIT
        INTO :NOMBRE, :DIRECCION, :TELEFONO, :MUNICIPIO;
    if (MUNICIPIO <> '') then
        BEGIN
        SELECT CIUD_NOM FROM CIUDADES WHERE CIUD_COD = :MUNICIPIO INTO :nomciudad;
        lonciu = STRLEN(nomciudad);
        EXECUTE PROCEDURE POS(' - ', NOMCIUDAD) returning_values (LONCTA);
        nommunicipio = SUBSTR(nomciudad, 1, LONCTA);
        departamento = SUBSTR(nomciudad, LONCTA+3, LONCIU);
        END
    ELSE
        BEGIN
        nommunicipio = '';
        departamento = '';
        END
    SUSPEND;
    END
end;

/*******************************************************************************
The next statement causes the following error:

Undefined name.
Dynamic SQL Error.
SQL error code = -204.
Ambiguous field name between table COMPROBANTE_DETALLE and table COMPROBANTE_ENCABEZADO .
TERC_NIT.
*******************************************************************************/
ALTER PROCEDURE MM_1001 (
    INICIO CHAR(8) CHARACTER SET NONE,
    FINAL CHAR(8) CHARACTER SET NONE)
AS
declare variable CONCEPTO INTEGER;
declare variable TIPODOC INTEGER;
declare variable NIT VARCHAR(15) CHARACTER SET NONE;
declare variable DV CHAR(1) CHARACTER SET NONE;
declare variable APELLIDO1 VARCHAR(60) CHARACTER SET NONE;
declare variable APELLIDO2 VARCHAR(60) CHARACTER SET NONE;
declare variable NOMBRE1 VARCHAR(60) CHARACTER SET NONE;
declare variable NOMBRE2 VARCHAR(60) CHARACTER SET NONE;
declare variable RAZONSOCIAL VARCHAR(450) CHARACTER SET NONE;
declare variable DIRECCION VARCHAR(200) CHARACTER SET NONE;
declare variable DEPARTAMENTO CHAR(2) CHARACTER SET NONE;
declare variable MUNICIPIO CHAR(3) CHARACTER SET NONE;
declare variable PAGO NUMERIC(18,0);
declare variable MINIMO NUMERIC(18,2);
declare variable MENORCUANTIA NUMERIC(18,2);
declare variable TOTALTERC NUMERIC(18,2);
declare variable ITEM integer;
begin
ITEM = 0;
/* SALARIOS */
MENORCUANTIA = 0;
select COME_RESPUESTA, COME_MINIMO  FROM configura_mediosmag WHERE COME_ITEM = 21 INTO :CONCEPTO, :MINIMO;
FOR SELECT MAX(D.TERC_NIT), SUM(CODE_DEBITO-CODE_CREDITO)
    FROM COMPROBANTE_DETALLE D, COMPROBANTE_ENCABEZADO E, mediosmag_cuentas M
    WHERE M.mmcu_item = 21 AND SUBSTR(CUEN_COD,1,STRLEN(M.mmcu_cuenta)) = M.mmcu_cuenta AND
    E.ENCO_CONSEC = D.ENCO_CONSEC AND ENCO_FECHA >= :INICIO AND ENCO_FECHA <= :FINAL AND
    ((CODE_CREDITO <> 0) or (CODE_DEBITO <> 0))
    GROUP BY D.TERC_NIT
    INTO :NIT, :PAGO
    DO
    BEGIN
    SELECT SUM(CODE_DEBITO-CODE_CREDITO) FROM COMPROBANTE_DETALLE D, COMPROBANTE_ENCABEZADO E
    WHERE E.ENCO_CONSEC = D.ENCO_CONSEC AND ENCO_FECHA >= :INICIO AND ENCO_FECHA <= :FINAL AND
    (SUBSTR(CUEN_COD,1,1) = '5') AND D.TERC_NIT = :NIT INTO :TOTALTERC;
    if ((TOTALTERC >= :MINIMO) AND (PAGO > 0)) then
        BEGIN
        SELECT TERC_NOM, TERC_NOMBRE1, TERC_NOMBRE2, TERC_APELLIDO1, TERC_APELLIDO2, TERC_DV, TIID_CODIGO,
            TERC_DIR, SUBSTR(CIUD_COD,1,2), SUBSTR(CIUD_COD,3,5)
            FROM TERCEROS T left outer join TIPO_ID IT on (T.TERC_TIPOID = IT.TIID_COD) WHERE TERC_NIT = :NIT
            INTO :RAZONSOCIAL, :NOMBRE1, :NOMBRE2, :APELLIDO1, :APELLIDO2, :DV, :TIPODOC, :DIRECCION, :DEPARTAMENTO, :MUNICIPIO;
        ITEM = ITEM + 1;
        insert into medios_magneticos_datos (memg_formato, memg_ano, memg_item, memg_concepto, memg_tipodoc, memg_nit, memg_dv,memg_apellido1, memg_apellido2, 
            memg_nombre1, memg_nombre2, memg_razonsocial, memg_direccion, memg_departamento, memg_municipio, memg_pago)
            values (1001, substr(:inicio,1,4), :item,  :concepto, :tipodoc, :nit, :dv, :apellido1, :apellido2,
            :nombre1, :nombre2, :razonsocial, :direccion, :departamento, :municipio, :pago);
        END
    ELSE
        MENORCUANTIA = MENORCUANTIA + PAGO;
    END
if (MENORCUANTIA <> 0) then
    BEGIN
    NIT = '222222222';
    razonsocial = 'CUANTIAS MENORES';
    NOMBRE1 = '';
    NOMBRE2 = '';
    APELLIDO1 = '';
    APELLIDO2 = '';
    DIRECCION = '';
    DV = '';
    TIPODOC = 13;
    DEPARTAMENTO = '11';
    MUNICIPIO = '001';
    PAGO = MENORCUANTIA;
    ITEM = ITEM + 1;
    insert into medios_magneticos_datos (memg_formato, memg_ano, memg_item, memg_concepto, memg_tipodoc, memg_nit, memg_dv,memg_apellido1, memg_apellido2,
        memg_nombre1, memg_nombre2, memg_razonsocial, memg_direccion, memg_departamento, memg_municipio, memg_pago)
        values (1001, substr(:inicio,1,4), :item,  :concepto, :tipodoc, :nit, :dv, :apellido1, :apellido2,
        :nombre1, :nombre2, :razonsocial, :direccion, :departamento, :municipio, :pago);
    END

/* HONORARIOS */
MENORCUANTIA = 0;
select COME_RESPUESTA, COME_MINIMO  FROM configura_mediosmag WHERE COME_ITEM = 22 INTO :CONCEPTO, :MINIMO;
FOR SELECT MAX(D.TERC_NIT), SUM(CODE_DEBITO-CODE_CREDITO)
    FROM COMPROBANTE_DETALLE D, COMPROBANTE_ENCABEZADO E, mediosmag_cuentas M
    WHERE M.mmcu_item = 22 AND SUBSTR(CUEN_COD,1,STRLEN(M.mmcu_cuenta)) = M.mmcu_cuenta AND E.ENCO_CONSEC = D.ENCO_CONSEC AND
    ENCO_FECHA >= :INICIO AND ENCO_FECHA <= :FINAL AND ((CODE_CREDITO <> 0) or (CODE_DEBITO <> 0))
    GROUP BY D.TERC_NIT
    INTO :NIT, :PAGO
    DO
    BEGIN
    SELECT SUM(CODE_DEBITO-CODE_CREDITO) FROM COMPROBANTE_DETALLE D, COMPROBANTE_ENCABEZADO E
    WHERE E.ENCO_CONSEC = D.ENCO_CONSEC AND ENCO_FECHA >= :INICIO AND ENCO_FECHA <= :FINAL AND
    (SUBSTR(CUEN_COD,1,1) = '5') AND D.TERC_NIT = :NIT INTO :TOTALTERC;
    if ((TOTALTERC >= :MINIMO) AND (PAGO > 0)) then
        BEGIN
        SELECT TERC_NOM, TERC_NOMBRE1, TERC_NOMBRE2, TERC_APELLIDO1, TERC_APELLIDO2, TERC_DV, TIID_CODIGO,
            TERC_DIR, SUBSTR(CIUD_COD,1,2), SUBSTR(CIUD_COD,3,5)
            FROM TERCEROS T left outer join TIPO_ID IT on (T.TERC_TIPOID = IT.TIID_COD) WHERE TERC_NIT = :NIT
            INTO :RAZONSOCIAL, :NOMBRE1, :NOMBRE2, :APELLIDO1, :APELLIDO2, :DV, :TIPODOC, :DIRECCION, :DEPARTAMENTO, :MUNICIPIO;
        ITEM = ITEM + 1;
        insert into medios_magneticos_datos (memg_formato, memg_ano, memg_item, memg_concepto, memg_tipodoc, memg_nit, memg_dv,memg_apellido1, memg_apellido2, 
            memg_nombre1, memg_nombre2, memg_razonsocial, memg_direccion, memg_departamento, memg_municipio, memg_pago)
            values (1001, substr(:inicio,1,4), :item,  :concepto, :tipodoc, :nit, :dv, :apellido1, :apellido2,
            :nombre1, :nombre2, :razonsocial, :direccion, :departamento, :municipio, :pago);
        END
    ELSE
        MENORCUANTIA = MENORCUANTIA + PAGO;
    END
if (MENORCUANTIA <> 0) then
    BEGIN
    NIT = '222222222';
    razonsocial = 'CUANTIAS MENORES';
    NOMBRE1 = '';
    NOMBRE2 = '';
    APELLIDO1 = '';
    APELLIDO2 = '';
    DIRECCION = '';
    DV = '';
    TIPODOC = 13;
    DEPARTAMENTO = '11';
    MUNICIPIO = '001';
    PAGO = MENORCUANTIA;
    ITEM = ITEM + 1;
    insert into medios_magneticos_datos (memg_formato, memg_ano, memg_item, memg_concepto, memg_tipodoc, memg_nit, memg_dv,memg_apellido1, memg_apellido2,
        memg_nombre1, memg_nombre2, memg_razonsocial, memg_direccion, memg_departamento, memg_municipio, memg_pago)
        values (1001, substr(:inicio,1,4), :item,  :concepto, :tipodoc, :nit, :dv, :apellido1, :apellido2,
        :nombre1, :nombre2, :razonsocial, :direccion, :departamento, :municipio, :pago);
    END
/* comisiones */
MENORCUANTIA = 0;
select COME_RESPUESTA, COME_MINIMO FROM configura_mediosmag WHERE COME_ITEM = 23 INTO :CONCEPTO, :MINIMO;
FOR SELECT MAX(D.TERC_NIT), SUM(CODE_DEBITO-CODE_CREDITO)
    FROM COMPROBANTE_DETALLE D, COMPROBANTE_ENCABEZADO E, mediosmag_cuentas M
    WHERE M.mmcu_item = 23 AND SUBSTR(CUEN_COD,1,STRLEN(M.mmcu_cuenta)) = M.mmcu_cuenta AND
    E.ENCO_CONSEC = D.ENCO_CONSEC AND ENCO_FECHA >= :INICIO AND ENCO_FECHA <= :FINAL AND
    ((CODE_CREDITO <> 0) or (CODE_DEBITO <> 0))
    GROUP BY D.TERC_NIT
    INTO :NIT, :PAGO
    DO
    BEGIN
    SELECT SUM(CODE_DEBITO-CODE_CREDITO) FROM COMPROBANTE_DETALLE D, COMPROBANTE_ENCABEZADO E
    WHERE E.ENCO_CONSEC = D.ENCO_CONSEC AND ENCO_FECHA >= :INICIO AND ENCO_FECHA <= :FINAL AND
    (SUBSTR(CUEN_COD,1,1) = '5') AND D.TERC_NIT = :NIT INTO :TOTALTERC;
    if ((TOTALTERC >= :MINIMO) AND (PAGO > 0)) then
        BEGIN
        SELECT TERC_NOM, TERC_NOMBRE1, TERC_NOMBRE2, TERC_APELLIDO1, TERC_APELLIDO2, TERC_DV, TIID_CODIGO,
            TERC_DIR, SUBSTR(CIUD_COD,1,2), SUBSTR(CIUD_COD,3,5)
            FROM TERCEROS T left outer join TIPO_ID IT on (T.TERC_TIPOID = IT.TIID_COD) WHERE TERC_NIT = :NIT
            INTO :RAZONSOCIAL, :NOMBRE1, :NOMBRE2, :APELLIDO1, :APELLIDO2, :DV, :TIPODOC, :DIRECCION, :DEPARTAMENTO, :MUNICIPIO;
        ITEM = ITEM + 1;
        insert into medios_magneticos_datos (memg_formato, memg_ano, memg_item, memg_concepto, memg_tipodoc, memg_nit, memg_dv,memg_apellido1, memg_apellido2, 
            memg_nombre1, memg_nombre2, memg_razonsocial, memg_direccion, memg_departamento, memg_municipio, memg_pago)
            values (1001, substr(:inicio,1,4), :item,  :concepto, :tipodoc, :nit, :dv, :apellido1, :apellido2,
            :nombre1, :nombre2, :razonsocial, :direccion, :departamento, :municipio, :pago);
        END
    ELSE
        MENORCUANTIA = MENORCUANTIA + PAGO;
    END
if (MENORCUANTIA <> 0) then
    BEGIN
    NIT = '222222222';
    razonsocial = 'CUANTIAS MENORES';
    NOMBRE1 = '';
    NOMBRE2 = '';
    APELLIDO1 = '';
    APELLIDO2 = '';
    DIRECCION = '';
    DV = '';
    TIPODOC = 13;
    DEPARTAMENTO = '11';
    MUNICIPIO = '001';
    PAGO = MENORCUANTIA;
    ITEM = ITEM + 1;
    insert into medios_magneticos_datos (memg_formato, memg_ano, memg_item, memg_concepto, memg_tipodoc, memg_nit, memg_dv,memg_apellido1, memg_apellido2,
        memg_nombre1, memg_nombre2, memg_razonsocial, memg_direccion, memg_departamento, memg_municipio, memg_pago)
        values (1001, substr(:inicio,1,4), :item,  :concepto, :tipodoc, :nit, :dv, :apellido1, :apellido2,
        :nombre1, :nombre2, :razonsocial, :direccion, :departamento, :municipio, :pago);
    END
/* servicios */
MENORCUANTIA = 0;
select COME_RESPUESTA, COME_MINIMO  FROM configura_mediosmag WHERE COME_ITEM = 24 INTO :CONCEPTO, :MINIMO;
FOR SELECT MAX(D.TERC_NIT), SUM(CODE_DEBITO-CODE_CREDITO)
    FROM COMPROBANTE_DETALLE D, COMPROBANTE_ENCABEZADO E, mediosmag_cuentas M
    WHERE M.mmcu_item = 24 AND SUBSTR(CUEN_COD,1,STRLEN(M.mmcu_cuenta)) = M.mmcu_cuenta AND
    E.ENCO_CONSEC = D.ENCO_CONSEC AND ENCO_FECHA >= :INICIO AND ENCO_FECHA <= :FINAL AND
    ((CODE_CREDITO <> 0) or (CODE_DEBITO <> 0))
    GROUP BY D.TERC_NIT
    INTO :NIT, :PAGO
    DO
    BEGIN
    SELECT SUM(CODE_DEBITO-CODE_CREDITO) FROM COMPROBANTE_DETALLE D, COMPROBANTE_ENCABEZADO E
    WHERE E.ENCO_CONSEC = D.ENCO_CONSEC AND ENCO_FECHA >= :INICIO AND ENCO_FECHA <= :FINAL AND
    (SUBSTR(CUEN_COD,1,1) = '5') AND D.TERC_NIT = :NIT INTO :TOTALTERC;
    if ((TOTALTERC >= :MINIMO) AND (PAGO > 0)) then
        BEGIN
        SELECT TERC_NOM, TERC_NOMBRE1, TERC_NOMBRE2, TERC_APELLIDO1, TERC_APELLIDO2, TERC_DV, TIID_CODIGO,
            TERC_DIR, SUBSTR(CIUD_COD,1,2), SUBSTR(CIUD_COD,3,5)
            FROM TERCEROS T left outer join TIPO_ID IT on (T.TERC_TIPOID = IT.TIID_COD) WHERE TERC_NIT = :NIT
            INTO :RAZONSOCIAL, :NOMBRE1, :NOMBRE2, :APELLIDO1, :APELLIDO2, :DV, :TIPODOC, :DIRECCION, :DEPARTAMENTO, :MUNICIPIO;
        ITEM = ITEM + 1;
        insert into medios_magneticos_datos (memg_formato, memg_ano, memg_item, memg_concepto, memg_tipodoc, memg_nit, memg_dv,memg_apellido1, memg_apellido2, 
            memg_nombre1, memg_nombre2, memg_razonsocial, memg_direccion, memg_departamento, memg_municipio, memg_pago)
            values (1001, substr(:inicio,1,4), :item,  :concepto, :tipodoc, :nit, :dv, :apellido1, :apellido2,
            :nombre1, :nombre2, :razonsocial, :direccion, :departamento, :municipio, :pago);
        END
    ELSE
        MENORCUANTIA = MENORCUANTIA + PAGO;
    END
if (MENORCUANTIA <> 0) then
    BEGIN
    NIT = '222222222';
    razonsocial = 'CUANTIAS MENORES';
    NOMBRE1 = '';
    NOMBRE2 = '';
    APELLIDO1 = '';
    APELLIDO2 = '';
    DIRECCION = '';
    DV = '';
    TIPODOC = 13;
    DEPARTAMENTO = '11';
    MUNICIPIO = '001';
    PAGO = MENORCUANTIA;
    ITEM = ITEM + 1;
    insert into medios_magneticos_datos (memg_formato, memg_ano, memg_item, memg_concepto, memg_tipodoc, memg_nit, memg_dv,memg_apellido1, memg_apellido2,
        memg_nombre1, memg_nombre2, memg_razonsocial, memg_direccion, memg_departamento, memg_municipio, memg_pago)
        values (1001, substr(:inicio,1,4), :item,  :concepto, :tipodoc, :nit, :dv, :apellido1, :apellido2,
        :nombre1, :nombre2, :razonsocial, :direccion, :departamento, :municipio, :pago);
    END
/* arrendamientos */
MENORCUANTIA = 0;
select COME_RESPUESTA, COME_MINIMO  FROM configura_mediosmag WHERE COME_ITEM = 25 INTO :CONCEPTO, :MINIMO;
FOR SELECT MAX(D.TERC_NIT), SUM(CODE_DEBITO-CODE_CREDITO)
    FROM COMPROBANTE_DETALLE D, COMPROBANTE_ENCABEZADO E, mediosmag_cuentas M
    WHERE M.mmcu_item = 25 AND SUBSTR(CUEN_COD,1,STRLEN(M.mmcu_cuenta)) = M.mmcu_cuenta AND
    E.ENCO_CONSEC = D.ENCO_CONSEC AND ENCO_FECHA >= :INICIO AND ENCO_FECHA <= :FINAL AND
    ((CODE_CREDITO <> 0) or (CODE_DEBITO <> 0))
    GROUP BY D.TERC_NIT
    INTO :NIT, :PAGO
    DO
    BEGIN
    SELECT SUM(CODE_DEBITO-CODE_CREDITO) FROM COMPROBANTE_DETALLE D, COMPROBANTE_ENCABEZADO E
    WHERE E.ENCO_CONSEC = D.ENCO_CONSEC AND ENCO_FECHA >= :INICIO AND ENCO_FECHA <= :FINAL AND
    (SUBSTR(CUEN_COD,1,1) = '5') AND
    D.TERC_NIT = :NIT INTO :TOTALTERC;
    if ((TOTALTERC >= :MINIMO) AND (PAGO > 0)) then
        BEGIN
        SELECT TERC_NOM, TERC_NOMBRE1, TERC_NOMBRE2, TERC_APELLIDO1, TERC_APELLIDO2, TERC_DV, TIID_CODIGO,
            TERC_DIR, SUBSTR(CIUD_COD,1,2), SUBSTR(CIUD_COD,3,5)
            FROM TERCEROS T left outer join TIPO_ID IT on (T.TERC_TIPOID = IT.TIID_COD) WHERE TERC_NIT = :NIT
            INTO :RAZONSOCIAL, :NOMBRE1, :NOMBRE2, :APELLIDO1, :APELLIDO2, :DV, :TIPODOC, :DIRECCION, :DEPARTAMENTO, :MUNICIPIO;
        ITEM = ITEM + 1;
        insert into medios_magneticos_datos (memg_formato, memg_ano, memg_item, memg_concepto, memg_tipodoc, memg_nit, memg_dv,memg_apellido1, memg_apellido2, 
            memg_nombre1, memg_nombre2, memg_razonsocial, memg_direccion, memg_departamento, memg_municipio, memg_pago)
            values (1001, substr(:inicio,1,4), :item,  :concepto, :tipodoc, :nit, :dv, :apellido1, :apellido2,
            :nombre1, :nombre2, :razonsocial, :direccion, :departamento, :municipio, :pago);
        END
    ELSE
        MENORCUANTIA = MENORCUANTIA + PAGO;
    END
if (MENORCUANTIA <> 0) then
    BEGIN
    NIT = '222222222';
    razonsocial = 'CUANTIAS MENORES';
    NOMBRE1 = '';
    NOMBRE2 = '';
    APELLIDO1 = '';
    APELLIDO2 = '';
    DIRECCION = '';
    DV = '';
    TIPODOC = 13;
    DEPARTAMENTO = '11';
    MUNICIPIO = '001';
    PAGO = MENORCUANTIA;
    ITEM = ITEM + 1;
    insert into medios_magneticos_datos (memg_formato, memg_ano, memg_item, memg_concepto, memg_tipodoc, memg_nit, memg_dv,memg_apellido1, memg_apellido2,
        memg_nombre1, memg_nombre2, memg_razonsocial, memg_direccion, memg_departamento, memg_municipio, memg_pago)
        values (1001, substr(:inicio,1,4), :item,  :concepto, :tipodoc, :nit, :dv, :apellido1, :apellido2,
        :nombre1, :nombre2, :razonsocial, :direccion, :departamento, :municipio, :pago);
    END
/* intereses y rendimientos */
MENORCUANTIA = 0;
select COME_RESPUESTA, COME_MINIMO  FROM configura_mediosmag WHERE COME_ITEM = 26 INTO :CONCEPTO, :MINIMO;
FOR SELECT MAX(D.TERC_NIT), SUM(CODE_DEBITO-CODE_CREDITO)
    FROM COMPROBANTE_DETALLE D, COMPROBANTE_ENCABEZADO E, mediosmag_cuentas M
    WHERE M.mmcu_item = 26 AND SUBSTR(CUEN_COD,1,STRLEN(M.mmcu_cuenta)) = M.mmcu_cuenta AND
    E.ENCO_CONSEC = D.ENCO_CONSEC AND ENCO_FECHA >= :INICIO AND ENCO_FECHA <= :FINAL AND
    ((CODE_CREDITO <> 0) or (CODE_DEBITO <> 0))
    GROUP BY D.TERC_NIT
    INTO :NIT, :PAGO
    DO
    BEGIN
    SELECT SUM(CODE_DEBITO-CODE_CREDITO) FROM COMPROBANTE_DETALLE D, COMPROBANTE_ENCABEZADO E
    WHERE E.ENCO_CONSEC = D.ENCO_CONSEC AND ENCO_FECHA >= :INICIO AND ENCO_FECHA <= :FINAL AND
    (SUBSTR(CUEN_COD,1,1) = '5') AND D.TERC_NIT = :NIT INTO :TOTALTERC;
    if ((TOTALTERC >= :MINIMO) AND (PAGO > 0)) then
        BEGIN
        SELECT TERC_NOM, TERC_NOMBRE1, TERC_NOMBRE2, TERC_APELLIDO1, TERC_APELLIDO2, TERC_DV, TIID_CODIGO,
            TERC_DIR, SUBSTR(CIUD_COD,1,2), SUBSTR(CIUD_COD,3,5)
            FROM TERCEROS T left outer join TIPO_ID IT on (T.TERC_TIPOID = IT.TIID_COD) WHERE TERC_NIT = :NIT
            INTO :RAZONSOCIAL, :NOMBRE1, :NOMBRE2, :APELLIDO1, :APELLIDO2, :DV, :TIPODOC, :DIRECCION, :DEPARTAMENTO, :MUNICIPIO;
        ITEM = ITEM + 1;
        insert into medios_magneticos_datos (memg_formato, memg_ano, memg_item, memg_concepto, memg_tipodoc, memg_nit, memg_dv,memg_apellido1, memg_apellido2, 
            memg_nombre1, memg_nombre2, memg_razonsocial, memg_direccion, memg_departamento, memg_municipio, memg_pago)
            values (1001, substr(:inicio,1,4), :item,  :concepto, :tipodoc, :nit, :dv, :apellido1, :apellido2,
            :nombre1, :nombre2, :razonsocial, :direccion, :departamento, :municipio, :pago);
        END
    ELSE
        MENORCUANTIA = MENORCUANTIA + PAGO;
    END
if (MENORCUANTIA <> 0) then
    BEGIN
    NIT = '222222222';
    razonsocial = 'CUANTIAS MENORES';
    NOMBRE1 = '';
    NOMBRE2 = '';
    APELLIDO1 = '';
    APELLIDO2 = '';
    DIRECCION = '';
    DV = '';
    TIPODOC = 13;
    DEPARTAMENTO = '11';
    MUNICIPIO = '001';
    PAGO = MENORCUANTIA;
    ITEM = ITEM + 1;
    insert into medios_magneticos_datos (memg_formato, memg_ano, memg_item, memg_concepto, memg_tipodoc, memg_nit, memg_dv,memg_apellido1, memg_apellido2,
        memg_nombre1, memg_nombre2, memg_razonsocial, memg_direccion, memg_departamento, memg_municipio, memg_pago)
        values (1001, substr(:inicio,1,4), :item,  :concepto, :tipodoc, :nit, :dv, :apellido1, :apellido2,
        :nombre1, :nombre2, :razonsocial, :direccion, :departamento, :municipio, :pago);
    END
/* Cargos diferidos y gastos anticipados */
MENORCUANTIA = 0;
select COME_RESPUESTA, COME_MINIMO  FROM configura_mediosmag WHERE COME_ITEM = 29 INTO :CONCEPTO, :MINIMO;
FOR SELECT MAX(D.TERC_NIT), SUM(CODE_DEBITO-CODE_CREDITO)
    FROM COMPROBANTE_DETALLE D, COMPROBANTE_ENCABEZADO E, mediosmag_cuentas M
    WHERE M.mmcu_item = 29 AND SUBSTR(CUEN_COD,1,STRLEN(M.mmcu_cuenta)) = M.mmcu_cuenta AND
    E.ENCO_CONSEC = D.ENCO_CONSEC AND ENCO_FECHA >= :INICIO AND ENCO_FECHA <= :FINAL AND
    ((CODE_CREDITO <> 0) or (CODE_DEBITO <> 0))
    GROUP BY D.TERC_NIT
    INTO :NIT, :PAGO
    DO
    BEGIN
    SELECT SUM(CODE_DEBITO-CODE_CREDITO) FROM COMPROBANTE_DETALLE D, COMPROBANTE_ENCABEZADO E
    WHERE E.ENCO_CONSEC = D.ENCO_CONSEC AND ENCO_FECHA >= :INICIO AND ENCO_FECHA <= :FINAL AND
    (SUBSTR(CUEN_COD,1,1) = '5') AND D.TERC_NIT = :NIT INTO :TOTALTERC;
    if ((TOTALTERC >= :MINIMO) AND (PAGO > 0)) then
        BEGIN
        SELECT TERC_NOM, TERC_NOMBRE1, TERC_NOMBRE2, TERC_APELLIDO1, TERC_APELLIDO2, TERC_DV, TIID_CODIGO,
            TERC_DIR, SUBSTR(CIUD_COD,1,2), SUBSTR(CIUD_COD,3,5)
            FROM TERCEROS T left outer join TIPO_ID IT on (T.TERC_TIPOID = IT.TIID_COD) WHERE TERC_NIT = :NIT
            INTO :RAZONSOCIAL, :NOMBRE1, :NOMBRE2, :APELLIDO1, :APELLIDO2, :DV, :TIPODOC, :DIRECCION, :DEPARTAMENTO, :MUNICIPIO;
        ITEM = ITEM + 1;
        insert into medios_magneticos_datos (memg_formato, memg_ano, memg_item, memg_concepto, memg_tipodoc, memg_nit, memg_dv,memg_apellido1, memg_apellido2, 
            memg_nombre1, memg_nombre2, memg_razonsocial, memg_direccion, memg_departamento, memg_municipio, memg_pago)
            values (1001, substr(:inicio,1,4), :item,  :concepto, :tipodoc, :nit, :dv, :apellido1, :apellido2,
            :nombre1, :nombre2, :razonsocial, :direccion, :departamento, :municipio, :pago);
        END
    ELSE
        MENORCUANTIA = MENORCUANTIA + PAGO;
    END
if (MENORCUANTIA <> 0) then
    BEGIN
    NIT = '222222222';
    razonsocial = 'CUANTIAS MENORES';
    NOMBRE1 = '';
    NOMBRE2 = '';
    APELLIDO1 = '';
    APELLIDO2 = '';
    DIRECCION = '';
    DV = '';
    TIPODOC = 13;
    DEPARTAMENTO = '11';
    MUNICIPIO = '001';
    PAGO = MENORCUANTIA;
    ITEM = ITEM + 1;
    insert into medios_magneticos_datos (memg_formato, memg_ano, memg_item, memg_concepto, memg_tipodoc, memg_nit, memg_dv,memg_apellido1, memg_apellido2,
        memg_nombre1, memg_nombre2, memg_razonsocial, memg_direccion, memg_departamento, memg_municipio, memg_pago)
        values (1001, substr(:inicio,1,4), :item,  :concepto, :tipodoc, :nit, :dv, :apellido1, :apellido2,
        :nombre1, :nombre2, :razonsocial, :direccion, :departamento, :municipio, :pago);
    END
/* Aportes SENA,ICBF,Cajas */
MENORCUANTIA = 0;
select COME_RESPUESTA, COME_MINIMO  FROM configura_mediosmag WHERE COME_ITEM = 30 INTO :CONCEPTO, :MINIMO;
FOR SELECT MAX(D.TERC_NIT), SUM(CODE_DEBITO-CODE_CREDITO)
    FROM COMPROBANTE_DETALLE D, COMPROBANTE_ENCABEZADO E, mediosmag_cuentas M
    WHERE M.mmcu_item = 30 AND SUBSTR(CUEN_COD,1,STRLEN(M.mmcu_cuenta)) = M.mmcu_cuenta AND
    E.ENCO_CONSEC = D.ENCO_CONSEC AND ENCO_FECHA >= :INICIO AND ENCO_FECHA <= :FINAL AND
    ((CODE_CREDITO <> 0) or (CODE_DEBITO <> 0))
    GROUP BY D.TERC_NIT
    INTO :NIT, :PAGO
    DO
    BEGIN
    SELECT SUM(CODE_DEBITO-CODE_CREDITO) FROM COMPROBANTE_DETALLE D, COMPROBANTE_ENCABEZADO E
    WHERE E.ENCO_CONSEC = D.ENCO_CONSEC AND ENCO_FECHA >= :INICIO AND ENCO_FECHA <= :FINAL AND
    (SUBSTR(CUEN_COD,1,1) = '5') AND D.TERC_NIT = :NIT INTO :TOTALTERC;
    if ((TOTALTERC >= :MINIMO) AND (PAGO > 0)) then
        BEGIN
        SELECT TERC_NOM, TERC_NOMBRE1, TERC_NOMBRE2, TERC_APELLIDO1, TERC_APELLIDO2, TERC_DV, TIID_CODIGO,
            TERC_DIR, SUBSTR(CIUD_COD,1,2), SUBSTR(CIUD_COD,3,5)
            FROM TERCEROS T left outer join TIPO_ID IT on (T.TERC_TIPOID = IT.TIID_COD) WHERE TERC_NIT = :NIT
            INTO :RAZONSOCIAL, :NOMBRE1, :NOMBRE2, :APELLIDO1, :APELLIDO2, :DV, :TIPODOC, :DIRECCION, :DEPARTAMENTO, :MUNICIPIO;
        ITEM = ITEM + 1;
        insert into medios_magneticos_datos (memg_formato, memg_ano, memg_item, memg_concepto, memg_tipodoc, memg_nit, memg_dv,memg_apellido1, memg_apellido2, 
            memg_nombre1, memg_nombre2, memg_razonsocial, memg_direccion, memg_departamento, memg_municipio, memg_pago)
            values (1001, substr(:inicio,1,4), :item,  :concepto, :tipodoc, :nit, :dv, :apellido1, :apellido2,
            :nombre1, :nombre2, :razonsocial, :direccion, :departamento, :municipio, :pago);
        END
    ELSE
        MENORCUANTIA = MENORCUANTIA + PAGO;
    END
if (MENORCUANTIA <> 0) then
    BEGIN
    NIT = '222222222';
    razonsocial = 'CUANTIAS MENORES';
    NOMBRE1 = '';
    NOMBRE2 = '';
    APELLIDO1 = '';
    APELLIDO2 = '';
    DIRECCION = '';
    DV = '';
    TIPODOC = 13;
    DEPARTAMENTO = '11';
    MUNICIPIO = '001';
    PAGO = MENORCUANTIA;
    ITEM = ITEM + 1;
    insert into medios_magneticos_datos (memg_formato, memg_ano, memg_item, memg_concepto, memg_tipodoc, memg_nit, memg_dv,memg_apellido1, memg_apellido2,
        memg_nombre1, memg_nombre2, memg_razonsocial, memg_direccion, memg_departamento, memg_municipio, memg_pago)
        values (1001, substr(:inicio,1,4), :item,  :concepto, :tipodoc, :nit, :dv, :apellido1, :apellido2,
        :nombre1, :nombre2, :razonsocial, :direccion, :departamento, :municipio, :pago);
    END
/* Aportes EPS-ISS-ARP */
MENORCUANTIA = 0;
select COME_RESPUESTA, COME_MINIMO  FROM configura_mediosmag WHERE COME_ITEM = 31 INTO :CONCEPTO, :MINIMO;
FOR SELECT MAX(D.TERC_NIT), SUM(CODE_DEBITO-CODE_CREDITO)
    FROM COMPROBANTE_DETALLE D, COMPROBANTE_ENCABEZADO E, mediosmag_cuentas M
    WHERE M.mmcu_item = 31 AND SUBSTR(CUEN_COD,1,STRLEN(M.mmcu_cuenta)) = M.mmcu_cuenta AND
    E.ENCO_CONSEC = D.ENCO_CONSEC AND ENCO_FECHA >= :INICIO AND ENCO_FECHA <= :FINAL AND
    ((CODE_CREDITO <> 0) or (CODE_DEBITO <> 0))
    GROUP BY D.TERC_NIT
    INTO :NIT, :PAGO
    DO
    BEGIN
    SELECT SUM(CODE_DEBITO-CODE_CREDITO) FROM COMPROBANTE_DETALLE D, COMPROBANTE_ENCABEZADO E
    WHERE E.ENCO_CONSEC = D.ENCO_CONSEC AND ENCO_FECHA >= :INICIO AND ENCO_FECHA <= :FINAL AND
    (SUBSTR(CUEN_COD,1,1) = '5') AND D.TERC_NIT = :NIT INTO :TOTALTERC;
    if ((TOTALTERC >= :MINIMO) AND (PAGO > 0)) then
        BEGIN
        SELECT TERC_NOM, TERC_NOMBRE1, TERC_NOMBRE2, TERC_APELLIDO1, TERC_APELLIDO2, TERC_DV, TIID_CODIGO,
            TERC_DIR, SUBSTR(CIUD_COD,1,2), SUBSTR(CIUD_COD,3,5)
            FROM TERCEROS T left outer join TIPO_ID IT on (T.TERC_TIPOID = IT.TIID_COD) WHERE TERC_NIT = :NIT
            INTO :RAZONSOCIAL, :NOMBRE1, :NOMBRE2, :APELLIDO1, :APELLIDO2, :DV, :TIPODOC, :DIRECCION, :DEPARTAMENTO, :MUNICIPIO;
        ITEM = ITEM + 1;
        insert into medios_magneticos_datos (memg_formato, memg_ano, memg_item, memg_concepto, memg_tipodoc, memg_nit, memg_dv,memg_apellido1, memg_apellido2, 
            memg_nombre1, memg_nombre2, memg_razonsocial, memg_direccion, memg_departamento, memg_municipio, memg_pago)
            values (1001, substr(:inicio,1,4), :item,  :concepto, :tipodoc, :nit, :dv, :apellido1, :apellido2,
            :nombre1, :nombre2, :razonsocial, :direccion, :departamento, :municipio, :pago);
        END
    ELSE
        MENORCUANTIA = MENORCUANTIA + PAGO;
    END
if (MENORCUANTIA <> 0) then
    BEGIN
    NIT = '222222222';
    razonsocial = 'CUANTIAS MENORES';
    NOMBRE1 = '';
    NOMBRE2 = '';
    APELLIDO1 = '';
    APELLIDO2 = '';
    DIRECCION = '';
    DV = '';
    TIPODOC = 13;
    DEPARTAMENTO = '11';
    MUNICIPIO = '001';
    PAGO = MENORCUANTIA;
    ITEM = ITEM + 1;
    insert into medios_magneticos_datos (memg_formato, memg_ano, memg_item, memg_concepto, memg_tipodoc, memg_nit, memg_dv,memg_apellido1, memg_apellido2,
        memg_nombre1, memg_nombre2, memg_razonsocial, memg_direccion, memg_departamento, memg_municipio, memg_pago)
        values (1001, substr(:inicio,1,4), :item,  :concepto, :tipodoc, :nit, :dv, :apellido1, :apellido2,
        :nombre1, :nombre2, :razonsocial, :direccion, :departamento, :municipio, :pago);
    END
/* Aportes fondos pensiones */
MENORCUANTIA = 0;
select COME_RESPUESTA, COME_MINIMO  FROM configura_mediosmag WHERE COME_ITEM = 32 INTO :CONCEPTO, :MINIMO;
FOR SELECT MAX(D.TERC_NIT), SUM(CODE_DEBITO-CODE_CREDITO)
    FROM COMPROBANTE_DETALLE D, COMPROBANTE_ENCABEZADO E, mediosmag_cuentas M
    WHERE M.mmcu_item = 32 AND SUBSTR(CUEN_COD,1,STRLEN(M.mmcu_cuenta)) = M.mmcu_cuenta AND
    E.ENCO_CONSEC = D.ENCO_CONSEC AND ENCO_FECHA >= :INICIO AND ENCO_FECHA <= :FINAL AND
    ((CODE_CREDITO <> 0) or (CODE_DEBITO <> 0))
    GROUP BY D.TERC_NIT
    INTO :NIT, :PAGO
    DO
    BEGIN
    SELECT SUM(CODE_DEBITO-CODE_CREDITO) FROM COMPROBANTE_DETALLE D, COMPROBANTE_ENCABEZADO E
    WHERE E.ENCO_CONSEC = D.ENCO_CONSEC AND ENCO_FECHA >= :INICIO AND ENCO_FECHA <= :FINAL AND
    (SUBSTR(CUEN_COD,1,1) = '5') AND D.TERC_NIT = :NIT INTO :TOTALTERC;
    if ((TOTALTERC >= :MINIMO) AND (PAGO > 0)) then
        BEGIN
        SELECT TERC_NOM, TERC_NOMBRE1, TERC_NOMBRE2, TERC_APELLIDO1, TERC_APELLIDO2, TERC_DV, TIID_CODIGO,
            TERC_DIR, SUBSTR(CIUD_COD,1,2), SUBSTR(CIUD_COD,3,5)
            FROM TERCEROS T left outer join TIPO_ID IT on (T.TERC_TIPOID = IT.TIID_COD) WHERE TERC_NIT = :NIT
            INTO :RAZONSOCIAL, :NOMBRE1, :NOMBRE2, :APELLIDO1, :APELLIDO2, :DV, :TIPODOC, :DIRECCION, :DEPARTAMENTO, :MUNICIPIO;
        ITEM = ITEM + 1;
        insert into medios_magneticos_datos (memg_formato, memg_ano, memg_item, memg_concepto, memg_tipodoc, memg_nit, memg_dv,memg_apellido1, memg_apellido2, 
            memg_nombre1, memg_nombre2, memg_razonsocial, memg_direccion, memg_departamento, memg_municipio, memg_pago)
            values (1001, substr(:inicio,1,4), :item,  :concepto, :tipodoc, :nit, :dv, :apellido1, :apellido2,
            :nombre1, :nombre2, :razonsocial, :direccion, :departamento, :municipio, :pago);
        END
    ELSE
        MENORCUANTIA = MENORCUANTIA + PAGO;
    END
if (MENORCUANTIA <> 0) then
    BEGIN
    NIT = '222222222';
    razonsocial = 'CUANTIAS MENORES';
    NOMBRE1 = '';
    NOMBRE2 = '';
    APELLIDO1 = '';
    APELLIDO2 = '';
    DIRECCION = '';
    DV = '';
    TIPODOC = 13;
    DEPARTAMENTO = '11';
    MUNICIPIO = '001';
    PAGO = MENORCUANTIA;
    ITEM = ITEM + 1;
    insert into medios_magneticos_datos (memg_formato, memg_ano, memg_item, memg_concepto, memg_tipodoc, memg_nit, memg_dv,memg_apellido1, memg_apellido2,
        memg_nombre1, memg_nombre2, memg_razonsocial, memg_direccion, memg_departamento, memg_municipio, memg_pago)
        values (1001, substr(:inicio,1,4), :item,  :concepto, :tipodoc, :nit, :dv, :apellido1, :apellido2,
        :nombre1, :nombre2, :razonsocial, :direccion, :departamento, :municipio, :pago);
    END
/* Donaciones en efectivo */
MENORCUANTIA = 0;
select COME_RESPUESTA, COME_MINIMO  FROM configura_mediosmag WHERE COME_ITEM = 33 INTO :CONCEPTO, :MINIMO;
FOR SELECT MAX(D.TERC_NIT), SUM(CODE_DEBITO-CODE_CREDITO)
    FROM COMPROBANTE_DETALLE D, COMPROBANTE_ENCABEZADO E, mediosmag_cuentas M
    WHERE M.mmcu_item = 33 AND SUBSTR(CUEN_COD,1,STRLEN(M.mmcu_cuenta)) = M.mmcu_cuenta AND
    E.ENCO_CONSEC = D.ENCO_CONSEC AND ENCO_FECHA >= :INICIO AND ENCO_FECHA <= :FINAL AND
    ((CODE_CREDITO <> 0) or (CODE_DEBITO <> 0))
    GROUP BY D.TERC_NIT
    INTO :NIT, :PAGO
    DO
    BEGIN
    SELECT SUM(CODE_DEBITO-CODE_CREDITO) FROM COMPROBANTE_DETALLE D, COMPROBANTE_ENCABEZADO E
    WHERE E.ENCO_CONSEC = D.ENCO_CONSEC AND ENCO_FECHA >= :INICIO AND ENCO_FECHA <= :FINAL AND
    (SUBSTR(CUEN_COD,1,1) = '5') AND
    D.TERC_NIT = :NIT INTO :TOTALTERC;
    if ((TOTALTERC >= :MINIMO) AND (PAGO > 0)) then
        BEGIN
        SELECT TERC_NOM, TERC_NOMBRE1, TERC_NOMBRE2, TERC_APELLIDO1, TERC_APELLIDO2, TERC_DV, TIID_CODIGO,
            TERC_DIR, SUBSTR(CIUD_COD,1,2), SUBSTR(CIUD_COD,3,5)
            FROM TERCEROS T left outer join TIPO_ID IT on (T.TERC_TIPOID = IT.TIID_COD) WHERE TERC_NIT = :NIT
            INTO :RAZONSOCIAL, :NOMBRE1, :NOMBRE2, :APELLIDO1, :APELLIDO2, :DV, :TIPODOC, :DIRECCION, :DEPARTAMENTO, :MUNICIPIO;
        ITEM = ITEM + 1;
        insert into medios_magneticos_datos (memg_formato, memg_ano, memg_item, memg_concepto, memg_tipodoc, memg_nit, memg_dv,memg_apellido1, memg_apellido2, 
            memg_nombre1, memg_nombre2, memg_razonsocial, memg_direccion, memg_departamento, memg_municipio, memg_pago)
            values (1001, substr(:inicio,1,4), :item,  :concepto, :tipodoc, :nit, :dv, :apellido1, :apellido2,
            :nombre1, :nombre2, :razonsocial, :direccion, :departamento, :municipio, :pago);
        END
    ELSE
        MENORCUANTIA = MENORCUANTIA + PAGO;
    END
if (MENORCUANTIA <> 0) then
    BEGIN
    NIT = '222222222';
    razonsocial = 'CUANTIAS MENORES';
    NOMBRE1 = '';
    NOMBRE2 = '';
    APELLIDO1 = '';
    APELLIDO2 = '';
    DIRECCION = '';
    DV = '';
    TIPODOC = 13;
    DEPARTAMENTO = '11';
    MUNICIPIO = '001';
    PAGO = MENORCUANTIA;
    ITEM = ITEM + 1;
    insert into medios_magneticos_datos (memg_formato, memg_ano, memg_item, memg_concepto, memg_tipodoc, memg_nit, memg_dv,memg_apellido1, memg_apellido2,
        memg_nombre1, memg_nombre2, memg_razonsocial, memg_direccion, memg_departamento, memg_municipio, memg_pago)
        values (1001, substr(:inicio,1,4), :item,  :concepto, :tipodoc, :nit, :dv, :apellido1, :apellido2,
        :nombre1, :nombre2, :razonsocial, :direccion, :departamento, :municipio, :pago);
    END
/* Donaciones en otros activos */
MENORCUANTIA = 0;
select COME_RESPUESTA, COME_MINIMO  FROM configura_mediosmag WHERE COME_ITEM = 34 INTO :CONCEPTO, :MINIMO;
FOR SELECT MAX(D.TERC_NIT), SUM(CODE_DEBITO-CODE_CREDITO)
    FROM COMPROBANTE_DETALLE D, COMPROBANTE_ENCABEZADO E, mediosmag_cuentas M
    WHERE M.mmcu_item = 34 AND SUBSTR(CUEN_COD,1,STRLEN(M.mmcu_cuenta)) = M.mmcu_cuenta AND
    E.ENCO_CONSEC = D.ENCO_CONSEC AND ENCO_FECHA >= :INICIO AND ENCO_FECHA <= :FINAL AND
    ((CODE_CREDITO <> 0) or (CODE_DEBITO <> 0))
    GROUP BY D.TERC_NIT
    INTO :NIT, :PAGO
    DO
    BEGIN
    SELECT SUM(CODE_DEBITO-CODE_CREDITO) FROM COMPROBANTE_DETALLE D, COMPROBANTE_ENCABEZADO E
    WHERE E.ENCO_CONSEC = D.ENCO_CONSEC AND ENCO_FECHA >= :INICIO AND ENCO_FECHA <= :FINAL AND
    (SUBSTR(CUEN_COD,1,1) = '5') AND
    D.TERC_NIT = :NIT INTO :TOTALTERC;
    if ((TOTALTERC >= :MINIMO) AND (PAGO > 0)) then
        BEGIN
        SELECT TERC_NOM, TERC_NOMBRE1, TERC_NOMBRE2, TERC_APELLIDO1, TERC_APELLIDO2, TERC_DV, TIID_CODIGO,
            TERC_DIR, SUBSTR(CIUD_COD,1,2), SUBSTR(CIUD_COD,3,5)
            FROM TERCEROS T left outer join TIPO_ID IT on (T.TERC_TIPOID = IT.TIID_COD) WHERE TERC_NIT = :NIT
            INTO :RAZONSOCIAL, :NOMBRE1, :NOMBRE2, :APELLIDO1, :APELLIDO2, :DV, :TIPODOC, :DIRECCION, :DEPARTAMENTO, :MUNICIPIO;
        ITEM = ITEM + 1;
        insert into medios_magneticos_datos (memg_formato, memg_ano, memg_item, memg_concepto, memg_tipodoc, memg_nit, memg_dv,memg_apellido1, memg_apellido2, 
            memg_nombre1, memg_nombre2, memg_razonsocial, memg_direccion, memg_departamento, memg_municipio, memg_pago)
            values (1001, substr(:inicio,1,4), :item,  :concepto, :tipodoc, :nit, :dv, :apellido1, :apellido2,
            :nombre1, :nombre2, :razonsocial, :direccion, :departamento, :municipio, :pago);
        END
    ELSE
        MENORCUANTIA = MENORCUANTIA + PAGO;
    END
if (MENORCUANTIA <> 0) then
    BEGIN
    NIT = '222222222';
    razonsocial = 'CUANTIAS MENORES';
    NOMBRE1 = '';
    NOMBRE2 = '';
    APELLIDO1 = '';
    APELLIDO2 = '';
    DIRECCION = '';
    DV = '';
    TIPODOC = 13;
    DEPARTAMENTO = '11';
    MUNICIPIO = '001';
    PAGO = MENORCUANTIA;
    ITEM = ITEM + 1;
    insert into medios_magneticos_datos (memg_formato, memg_ano, memg_item, memg_concepto, memg_tipodoc, memg_nit, memg_dv,memg_apellido1, memg_apellido2,
        memg_nombre1, memg_nombre2, memg_razonsocial, memg_direccion, memg_departamento, memg_municipio, memg_pago)
        values (1001, substr(:inicio,1,4), :item,  :concepto, :tipodoc, :nit, :dv, :apellido1, :apellido2,
        :nombre1, :nombre2, :razonsocial, :direccion, :departamento, :municipio, :pago);
    END
/* Impuestos */
MENORCUANTIA = 0;
select COME_RESPUESTA, COME_MINIMO  FROM configura_mediosmag WHERE COME_ITEM = 35 INTO :CONCEPTO, :MINIMO;
FOR SELECT MAX(D.TERC_NIT), SUM(CODE_DEBITO-CODE_CREDITO)
    FROM COMPROBANTE_DETALLE D, COMPROBANTE_ENCABEZADO E, mediosmag_cuentas M
    WHERE M.mmcu_item = 35 AND SUBSTR(CUEN_COD,1,STRLEN(M.mmcu_cuenta)) = M.mmcu_cuenta AND
    E.ENCO_CONSEC = D.ENCO_CONSEC AND ENCO_FECHA >= :INICIO AND ENCO_FECHA <= :FINAL AND
    ((CODE_CREDITO <> 0) or (CODE_DEBITO <> 0))
    GROUP BY D.TERC_NIT
    INTO :NIT, :PAGO
    DO
    BEGIN
    SELECT SUM(CODE_DEBITO-CODE_CREDITO) FROM COMPROBANTE_DETALLE D, COMPROBANTE_ENCABEZADO E
    WHERE E.ENCO_CONSEC = D.ENCO_CONSEC AND ENCO_FECHA >= :INICIO AND ENCO_FECHA <= :FINAL AND
    (SUBSTR(CUEN_COD,1,1) = '5') AND
    D.TERC_NIT = :NIT INTO :TOTALTERC;
    if ((TOTALTERC >= :MINIMO) AND (PAGO > 0)) then
        BEGIN
        SELECT TERC_NOM, TERC_NOMBRE1, TERC_NOMBRE2, TERC_APELLIDO1, TERC_APELLIDO2, TERC_DV, TIID_CODIGO,
            TERC_DIR, SUBSTR(CIUD_COD,1,2), SUBSTR(CIUD_COD,3,5)
            FROM TERCEROS T left outer join TIPO_ID IT on (T.TERC_TIPOID = IT.TIID_COD) WHERE TERC_NIT = :NIT
            INTO :RAZONSOCIAL, :NOMBRE1, :NOMBRE2, :APELLIDO1, :APELLIDO2, :DV, :TIPODOC, :DIRECCION, :DEPARTAMENTO, :MUNICIPIO;
        ITEM = ITEM + 1;
        insert into medios_magneticos_datos (memg_formato, memg_ano, memg_item, memg_concepto, memg_tipodoc, memg_nit, memg_dv,memg_apellido1, memg_apellido2, 
            memg_nombre1, memg_nombre2, memg_razonsocial, memg_direccion, memg_departamento, memg_municipio, memg_pago)
            values (1001, substr(:inicio,1,4), :item,  :concepto, :tipodoc, :nit, :dv, :apellido1, :apellido2,
            :nombre1, :nombre2, :razonsocial, :direccion, :departamento, :municipio, :pago);
        END
    ELSE
        MENORCUANTIA = MENORCUANTIA + PAGO;
    END
if (MENORCUANTIA <> 0) then
    BEGIN
    NIT = '222222222';
    razonsocial = 'CUANTIAS MENORES';
    NOMBRE1 = '';
    NOMBRE2 = '';
    APELLIDO1 = '';
    APELLIDO2 = '';
    DIRECCION = '';
    DV = '';
    TIPODOC = 13;
    DEPARTAMENTO = '11';
    MUNICIPIO = '001';
    PAGO = MENORCUANTIA;
    ITEM = ITEM + 1;
    insert into medios_magneticos_datos (memg_formato, memg_ano, memg_item, memg_concepto, memg_tipodoc, memg_nit, memg_dv,memg_apellido1, memg_apellido2,
        memg_nombre1, memg_nombre2, memg_razonsocial, memg_direccion, memg_departamento, memg_municipio, memg_pago)
        values (1001, substr(:inicio,1,4), :item,  :concepto, :tipodoc, :nit, :dv, :apellido1, :apellido2,
        :nombre1, :nombre2, :razonsocial, :direccion, :departamento, :municipio, :pago);
    END
/* Otros costos y deducciones */
MENORCUANTIA = 0;
select COME_RESPUESTA, COME_MINIMO  FROM configura_mediosmag WHERE COME_ITEM = 36 INTO :CONCEPTO, :MINIMO;
FOR SELECT MAX(D.TERC_NIT), SUM(CODE_DEBITO-CODE_CREDITO)
    FROM COMPROBANTE_DETALLE D, COMPROBANTE_ENCABEZADO E, mediosmag_cuentas M
    WHERE M.mmcu_item = 36 AND SUBSTR(CUEN_COD,1,STRLEN(M.mmcu_cuenta)) = M.mmcu_cuenta AND
    E.ENCO_CONSEC = D.ENCO_CONSEC AND ENCO_FECHA >= :INICIO AND ENCO_FECHA <= :FINAL AND
    ((CODE_CREDITO <> 0) or (CODE_DEBITO <> 0))
    GROUP BY D.TERC_NIT
    INTO :NIT, :PAGO
    DO
    BEGIN
    SELECT SUM(CODE_DEBITO-CODE_CREDITO) FROM COMPROBANTE_DETALLE D, COMPROBANTE_ENCABEZADO E
    WHERE E.ENCO_CONSEC = D.ENCO_CONSEC AND ENCO_FECHA >= :INICIO AND ENCO_FECHA <= :FINAL AND
    (SUBSTR(CUEN_COD,1,1) = '5') AND D.TERC_NIT = :NIT INTO :TOTALTERC;
    if ((TOTALTERC >= :MINIMO) AND (PAGO > 0)) then
        BEGIN
        SELECT TERC_NOM, TERC_NOMBRE1, TERC_NOMBRE2, TERC_APELLIDO1, TERC_APELLIDO2, TERC_DV, TIID_CODIGO,
            TERC_DIR, SUBSTR(CIUD_COD,1,2), SUBSTR(CIUD_COD,3,5)
            FROM TERCEROS T left outer join TIPO_ID IT on (T.TERC_TIPOID = IT.TIID_COD) WHERE TERC_NIT = :NIT
            INTO :RAZONSOCIAL, :NOMBRE1, :NOMBRE2, :APELLIDO1, :APELLIDO2, :DV, :TIPODOC, :DIRECCION, :DEPARTAMENTO, :MUNICIPIO;
        ITEM = ITEM + 1;
        insert into medios_magneticos_datos (memg_formato, memg_ano, memg_item, memg_concepto, memg_tipodoc, memg_nit, memg_dv,memg_apellido1, memg_apellido2, 
            memg_nombre1, memg_nombre2, memg_razonsocial, memg_direccion, memg_departamento, memg_municipio, memg_pago)
            values (1001, substr(:inicio,1,4), :item,  :concepto, :tipodoc, :nit, :dv, :apellido1, :apellido2,
            :nombre1, :nombre2, :razonsocial, :direccion, :departamento, :municipio, :pago);
        END
    ELSE
        MENORCUANTIA = MENORCUANTIA + PAGO;
    END
if (MENORCUANTIA <> 0) then
    BEGIN
    NIT = '222222222';
    razonsocial = 'CUANTIAS MENORES';
    NOMBRE1 = '';
    NOMBRE2 = '';
    APELLIDO1 = '';
    APELLIDO2 = '';
    DIRECCION = '';
    DV = '';
    TIPODOC = 13;
    DEPARTAMENTO = '11';
    MUNICIPIO = '001';
    PAGO = MENORCUANTIA;
    ITEM = ITEM + 1;
    insert into medios_magneticos_datos (memg_formato, memg_ano, memg_item, memg_concepto, memg_tipodoc, memg_nit, memg_dv,memg_apellido1, memg_apellido2,
        memg_nombre1, memg_nombre2, memg_razonsocial, memg_direccion, memg_departamento, memg_municipio, memg_pago)
        values (1001, substr(:inicio,1,4), :item,  :concepto, :tipodoc, :nit, :dv, :apellido1, :apellido2,
        :nombre1, :nombre2, :razonsocial, :direccion, :departamento, :municipio, :pago);
    END
end;

/*******************************************************************************
The next statement causes the following error:

Undefined name.
Dynamic SQL Error.
SQL error code = -204.
Ambiguous field name between table COMPROBANTE_DETALLE and table COMPROBANTE_ENCABEZADO .
TERC_NIT.
*******************************************************************************/
ALTER PROCEDURE MM_1002 (
    INICIO CHAR(8) CHARACTER SET NONE,
    FINAL CHAR(8) CHARACTER SET NONE)
AS
declare variable CONCEPTO INTEGER;
declare variable TIPODOC INTEGER;
declare variable NIT VARCHAR(15) CHARACTER SET NONE;
declare variable DV CHAR(1) CHARACTER SET NONE;
declare variable APELLIDO1 VARCHAR(60) CHARACTER SET NONE;
declare variable APELLIDO2 VARCHAR(60) CHARACTER SET NONE;
declare variable NOMBRE1 VARCHAR(60) CHARACTER SET NONE;
declare variable NOMBRE2 VARCHAR(60) CHARACTER SET NONE;
declare variable RAZONSOCIAL VARCHAR(450) CHARACTER SET NONE;
declare variable DIRECCION VARCHAR(200) CHARACTER SET NONE;
declare variable DEPARTAMENTO CHAR(2) CHARACTER SET NONE;
declare variable MUNICIPIO CHAR(3) CHARACTER SET NONE;
declare variable PAGO NUMERIC(18,0);
declare variable RETENCION NUMERIC(18,0);
declare variable ITEM INTEGER;
begin
ITEM = 0;
/* RETENCIONES SALARIOS */
select COME_RESPUESTA FROM configura_mediosmag WHERE COME_ITEM = 1 INTO :CONCEPTO;
FOR SELECT MAX(D.TERC_NIT), SUM(CODE_CREDITO-CODE_DEBITO), SUM(CODE_BASE)
    FROM COMPROBANTE_DETALLE D, COMPROBANTE_ENCABEZADO E, mediosmag_cuentas M
    WHERE M.mmcu_item = 1 AND E.ENCO_CONSEC = D.ENCO_CONSEC AND ENCO_FECHA >= :INICIO AND ENCO_FECHA <= :FINAL AND
    SUBSTR(CUEN_COD,1,STRLEN(M.mmcu_cuenta)) = M.mmcu_cuenta AND ((CODE_CREDITO <> 0) or (CODE_DEBITO <> 0))
    GROUP BY D.TERC_NIT
    INTO :NIT, :RETENCION, :PAGO
    DO
    BEGIN
    if (RETENCION > 0) then
        BEGIN
        PAGO = PAGO * -1;
        SELECT TERC_NOM, TERC_NOMBRE1, TERC_NOMBRE2, TERC_APELLIDO1, TERC_APELLIDO2, TERC_DV, TIID_CODIGO,
            TERC_DIR, SUBSTR(CIUD_COD,1,2), SUBSTR(CIUD_COD,3,5)
            FROM TERCEROS T left outer join TIPO_ID IT on (T.TERC_TIPOID = IT.TIID_COD) WHERE TERC_NIT = :NIT
            INTO :RAZONSOCIAL, :NOMBRE1, :NOMBRE2, :APELLIDO1, :APELLIDO2, :DV, :TIPODOC, :DIRECCION, :DEPARTAMENTO, :MUNICIPIO;
        ITEM = ITEM + 1;
        insert into medios_magneticos_datos (memg_formato, memg_ano, memg_item, memg_concepto, memg_tipodoc, memg_nit, memg_dv,memg_apellido1, memg_apellido2, 
            memg_nombre1, memg_nombre2, memg_razonsocial, memg_direccion, memg_departamento, memg_municipio, memg_pago, memg_retencion)
            values (1002, substr(:inicio,1,4), :item,  :concepto, :tipodoc, :nit, :dv, :apellido1, :apellido2,
            :nombre1, :nombre2, :razonsocial, :direccion, :departamento, :municipio, :pago, :retencion);
        END
    END
/* RETENCIONES COMPRAS */
select COME_RESPUESTA FROM configura_mediosmag WHERE COME_ITEM = 2 INTO :CONCEPTO;
FOR SELECT MAX(D.TERC_NIT), SUM(CODE_CREDITO-CODE_DEBITO), SUM(CODE_BASE)
    FROM COMPROBANTE_DETALLE D, COMPROBANTE_ENCABEZADO E, mediosmag_cuentas M
    WHERE M.mmcu_item = 2 AND E.ENCO_CONSEC = D.ENCO_CONSEC AND ENCO_FECHA >= :INICIO AND ENCO_FECHA <= :FINAL AND
    SUBSTR(CUEN_COD,1,STRLEN(M.mmcu_cuenta)) = M.mmcu_cuenta AND ((CODE_CREDITO <> 0) or (CODE_DEBITO <> 0))
    GROUP BY D.TERC_NIT
    INTO :NIT, :RETENCION, :PAGO
    DO
    BEGIN
    if (RETENCION > 0) then
        BEGIN
        PAGO = PAGO * -1;
        SELECT TERC_NOM, TERC_NOMBRE1, TERC_NOMBRE2, TERC_APELLIDO1, TERC_APELLIDO2, TERC_DV, TIID_CODIGO,
            TERC_DIR, SUBSTR(CIUD_COD,1,2), SUBSTR(CIUD_COD,3,5)
            FROM TERCEROS T left outer join TIPO_ID IT on (T.TERC_TIPOID = IT.TIID_COD) WHERE TERC_NIT = :NIT
            INTO :RAZONSOCIAL, :NOMBRE1, :NOMBRE2, :APELLIDO1, :APELLIDO2, :DV, :TIPODOC, :DIRECCION, :DEPARTAMENTO, :MUNICIPIO;
        ITEM = ITEM + 1;
        insert into medios_magneticos_datos (memg_formato, memg_ano, memg_item, memg_concepto, memg_tipodoc, memg_nit, memg_dv,memg_apellido1, memg_apellido2, 
            memg_nombre1, memg_nombre2, memg_razonsocial, memg_direccion, memg_departamento, memg_municipio, memg_pago, memg_retencion)
            values (1002, substr(:inicio,1,4), :item,  :concepto, :tipodoc, :nit, :dv, :apellido1, :apellido2,
            :nombre1, :nombre2, :razonsocial, :direccion, :departamento, :municipio, :pago, :retencion);
        END
    END
/* RETENCIONES COMISIONES */
select COME_RESPUESTA FROM configura_mediosmag WHERE COME_ITEM = 3 INTO :CONCEPTO;
FOR SELECT MAX(D.TERC_NIT), SUM(CODE_CREDITO-CODE_DEBITO), SUM(CODE_BASE)
    FROM COMPROBANTE_DETALLE D, COMPROBANTE_ENCABEZADO E, mediosmag_cuentas M
    WHERE M.mmcu_item = 3 AND E.ENCO_CONSEC = D.ENCO_CONSEC AND ENCO_FECHA >= :INICIO AND ENCO_FECHA <= :FINAL AND
    SUBSTR(CUEN_COD,1,STRLEN(M.mmcu_cuenta)) = M.mmcu_cuenta AND ((CODE_CREDITO <> 0) or (CODE_DEBITO <> 0))
    GROUP BY D.TERC_NIT
    INTO :NIT, :RETENCION, :PAGO
    DO
    BEGIN
    if (RETENCION > 0) then
        BEGIN
        PAGO = PAGO * -1;
        SELECT TERC_NOM, TERC_NOMBRE1, TERC_NOMBRE2, TERC_APELLIDO1, TERC_APELLIDO2, TERC_DV, TIID_CODIGO,
            TERC_DIR, SUBSTR(CIUD_COD,1,2), SUBSTR(CIUD_COD,3,5)
            FROM TERCEROS T left outer join TIPO_ID IT on (T.TERC_TIPOID = IT.TIID_COD) WHERE TERC_NIT = :NIT
            INTO :RAZONSOCIAL, :NOMBRE1, :NOMBRE2, :APELLIDO1, :APELLIDO2, :DV, :TIPODOC, :DIRECCION, :DEPARTAMENTO, :MUNICIPIO;
        ITEM = ITEM + 1;
        insert into medios_magneticos_datos (memg_formato, memg_ano, memg_item, memg_concepto, memg_tipodoc, memg_nit, memg_dv,memg_apellido1, memg_apellido2, 
            memg_nombre1, memg_nombre2, memg_razonsocial, memg_direccion, memg_departamento, memg_municipio, memg_pago, memg_retencion)
            values (1002, substr(:inicio,1,4), :item,  :concepto, :tipodoc, :nit, :dv, :apellido1, :apellido2,
            :nombre1, :nombre2, :razonsocial, :direccion, :departamento, :municipio, :pago, :retencion);
        END
    END
/* RETENCIONES HONORARIOS */
select COME_RESPUESTA FROM configura_mediosmag WHERE COME_ITEM = 4 INTO :CONCEPTO;
FOR SELECT MAX(D.TERC_NIT), SUM(CODE_CREDITO-CODE_DEBITO), SUM(CODE_BASE)
    FROM COMPROBANTE_DETALLE D, COMPROBANTE_ENCABEZADO E, mediosmag_cuentas M
    WHERE M.mmcu_item = 4 AND E.ENCO_CONSEC = D.ENCO_CONSEC AND ENCO_FECHA >= :INICIO AND ENCO_FECHA <= :FINAL AND
    SUBSTR(CUEN_COD,1,STRLEN(M.mmcu_cuenta)) = M.mmcu_cuenta AND ((CODE_CREDITO <> 0) or (CODE_DEBITO <> 0))
    GROUP BY D.TERC_NIT
    INTO :NIT, :RETENCION, :PAGO
    DO
    BEGIN
    if (RETENCION > 0) then
        BEGIN
        PAGO = PAGO * -1;
        SELECT TERC_NOM, TERC_NOMBRE1, TERC_NOMBRE2, TERC_APELLIDO1, TERC_APELLIDO2, TERC_DV, TIID_CODIGO,
            TERC_DIR, SUBSTR(CIUD_COD,1,2), SUBSTR(CIUD_COD,3,5)
            FROM TERCEROS T left outer join TIPO_ID IT on (T.TERC_TIPOID = IT.TIID_COD) WHERE TERC_NIT = :NIT
            INTO :RAZONSOCIAL, :NOMBRE1, :NOMBRE2, :APELLIDO1, :APELLIDO2, :DV, :TIPODOC, :DIRECCION, :DEPARTAMENTO, :MUNICIPIO;
        ITEM = ITEM + 1;
        insert into medios_magneticos_datos (memg_formato, memg_ano, memg_item, memg_concepto, memg_tipodoc, memg_nit, memg_dv,memg_apellido1, memg_apellido2, 
            memg_nombre1, memg_nombre2, memg_razonsocial, memg_direccion, memg_departamento, memg_municipio, memg_pago, memg_retencion)
            values (1002, substr(:inicio,1,4), :item,  :concepto, :tipodoc, :nit, :dv, :apellido1, :apellido2,
            :nombre1, :nombre2, :razonsocial, :direccion, :departamento, :municipio, :pago, :retencion);
        END
    END
/* RETENCIONES SERVICIOS */
select COME_RESPUESTA FROM configura_mediosmag WHERE COME_ITEM = 5 INTO :CONCEPTO;
FOR SELECT MAX(D.TERC_NIT), SUM(CODE_CREDITO-CODE_DEBITO), SUM(CODE_BASE)
    FROM COMPROBANTE_DETALLE D, COMPROBANTE_ENCABEZADO E, mediosmag_cuentas M
    WHERE M.mmcu_item = 5 AND E.ENCO_CONSEC = D.ENCO_CONSEC AND ENCO_FECHA >= :INICIO AND ENCO_FECHA <= :FINAL AND
    SUBSTR(CUEN_COD,1,STRLEN(M.mmcu_cuenta)) = M.mmcu_cuenta AND ((CODE_CREDITO <> 0) or (CODE_DEBITO <> 0))
    GROUP BY D.TERC_NIT
    INTO :NIT, :RETENCION, :PAGO
    DO
    BEGIN
    if (RETENCION > 0) then
        BEGIN
        PAGO = PAGO * -1;
        SELECT TERC_NOM, TERC_NOMBRE1, TERC_NOMBRE2, TERC_APELLIDO1, TERC_APELLIDO2, TERC_DV, TIID_CODIGO,
            TERC_DIR, SUBSTR(CIUD_COD,1,2), SUBSTR(CIUD_COD,3,5)
            FROM TERCEROS T left outer join TIPO_ID IT on (T.TERC_TIPOID = IT.TIID_COD) WHERE TERC_NIT = :NIT
            INTO :RAZONSOCIAL, :NOMBRE1, :NOMBRE2, :APELLIDO1, :APELLIDO2, :DV, :TIPODOC, :DIRECCION, :DEPARTAMENTO, :MUNICIPIO;
        ITEM = ITEM + 1;
        insert into medios_magneticos_datos (memg_formato, memg_ano, memg_item, memg_concepto, memg_tipodoc, memg_nit, memg_dv,memg_apellido1, memg_apellido2, 
            memg_nombre1, memg_nombre2, memg_razonsocial, memg_direccion, memg_departamento, memg_municipio, memg_pago, memg_retencion)
            values (1002, substr(:inicio,1,4), :item,  :concepto, :tipodoc, :nit, :dv, :apellido1, :apellido2,
            :nombre1, :nombre2, :razonsocial, :direccion, :departamento, :municipio, :pago, :retencion);
        END
    END
/* RETENCIONES ARRENDAMIENTOS */
select COME_RESPUESTA FROM configura_mediosmag WHERE COME_ITEM = 6 INTO :CONCEPTO;
FOR SELECT MAX(D.TERC_NIT), SUM(CODE_CREDITO-CODE_DEBITO), SUM(CODE_BASE)
    FROM COMPROBANTE_DETALLE D, COMPROBANTE_ENCABEZADO E, mediosmag_cuentas M
    WHERE M.mmcu_item = 6 AND E.ENCO_CONSEC = D.ENCO_CONSEC AND ENCO_FECHA >= :INICIO AND ENCO_FECHA <= :FINAL AND
    SUBSTR(CUEN_COD,1,STRLEN(M.mmcu_cuenta)) = M.mmcu_cuenta AND ((CODE_CREDITO <> 0) or (CODE_DEBITO <> 0))
    GROUP BY D.TERC_NIT
    INTO :NIT, :RETENCION, :PAGO
    DO
    BEGIN
    if (RETENCION > 0) then
        BEGIN
        PAGO = PAGO * -1;
        SELECT TERC_NOM, TERC_NOMBRE1, TERC_NOMBRE2, TERC_APELLIDO1, TERC_APELLIDO2, TERC_DV, TIID_CODIGO,
            TERC_DIR, SUBSTR(CIUD_COD,1,2), SUBSTR(CIUD_COD,3,5)
            FROM TERCEROS T left outer join TIPO_ID IT on (T.TERC_TIPOID = IT.TIID_COD) WHERE TERC_NIT = :NIT
            INTO :RAZONSOCIAL, :NOMBRE1, :NOMBRE2, :APELLIDO1, :APELLIDO2, :DV, :TIPODOC, :DIRECCION, :DEPARTAMENTO, :MUNICIPIO;
        ITEM = ITEM + 1;
        insert into medios_magneticos_datos (memg_formato, memg_ano, memg_item, memg_concepto, memg_tipodoc, memg_nit, memg_dv,memg_apellido1, memg_apellido2, 
            memg_nombre1, memg_nombre2, memg_razonsocial, memg_direccion, memg_departamento, memg_municipio, memg_pago, memg_retencion)
            values (1002, substr(:inicio,1,4), :item,  :concepto, :tipodoc, :nit, :dv, :apellido1, :apellido2,
            :nombre1, :nombre2, :razonsocial, :direccion, :departamento, :municipio, :pago, :retencion);
        END
    END
/* RETENCIONES RENDIMIENTOS F. */
select COME_RESPUESTA FROM configura_mediosmag WHERE COME_ITEM = 7 INTO :CONCEPTO;
FOR SELECT MAX(D.TERC_NIT), SUM(CODE_CREDITO-CODE_DEBITO), SUM(CODE_BASE)
    FROM COMPROBANTE_DETALLE D, COMPROBANTE_ENCABEZADO E, mediosmag_cuentas M
    WHERE M.mmcu_item = 7 AND E.ENCO_CONSEC = D.ENCO_CONSEC AND ENCO_FECHA >= :INICIO AND ENCO_FECHA <= :FINAL AND
    SUBSTR(CUEN_COD,1,STRLEN(M.mmcu_cuenta)) = M.mmcu_cuenta AND ((CODE_CREDITO <> 0) or (CODE_DEBITO <> 0))
    GROUP BY D.TERC_NIT
    INTO :NIT, :RETENCION, :PAGO
    DO
    BEGIN
    if (RETENCION > 0) then
        BEGIN
        PAGO = PAGO * -1;
        SELECT TERC_NOM, TERC_NOMBRE1, TERC_NOMBRE2, TERC_APELLIDO1, TERC_APELLIDO2, TERC_DV, TIID_CODIGO,
            TERC_DIR, SUBSTR(CIUD_COD,1,2), SUBSTR(CIUD_COD,3,5)
            FROM TERCEROS T left outer join TIPO_ID IT on (T.TERC_TIPOID = IT.TIID_COD) WHERE TERC_NIT = :NIT
            INTO :RAZONSOCIAL, :NOMBRE1, :NOMBRE2, :APELLIDO1, :APELLIDO2, :DV, :TIPODOC, :DIRECCION, :DEPARTAMENTO, :MUNICIPIO;
        ITEM = ITEM + 1;
        insert into medios_magneticos_datos (memg_formato, memg_ano, memg_item, memg_concepto, memg_tipodoc, memg_nit, memg_dv,memg_apellido1, memg_apellido2, 
            memg_nombre1, memg_nombre2, memg_razonsocial, memg_direccion, memg_departamento, memg_municipio, memg_pago, memg_retencion)
            values (1002, substr(:inicio,1,4), :item,  :concepto, :tipodoc, :nit, :dv, :apellido1, :apellido2,
            :nombre1, :nombre2, :razonsocial, :direccion, :departamento, :municipio, :pago, :retencion);
        END
    END
/* RETENCIONES DIVIDENDOS */
select COME_RESPUESTA FROM configura_mediosmag WHERE COME_ITEM = 8 INTO :CONCEPTO;
FOR SELECT MAX(D.TERC_NIT), SUM(CODE_CREDITO-CODE_DEBITO), SUM(CODE_BASE)
    FROM COMPROBANTE_DETALLE D, COMPROBANTE_ENCABEZADO E, mediosmag_cuentas M
    WHERE M.mmcu_item = 8 AND E.ENCO_CONSEC = D.ENCO_CONSEC AND ENCO_FECHA >= :INICIO AND ENCO_FECHA <= :FINAL AND
    SUBSTR(CUEN_COD,1,STRLEN(M.mmcu_cuenta)) = M.mmcu_cuenta AND ((CODE_CREDITO <> 0) or (CODE_DEBITO <> 0))
    GROUP BY D.TERC_NIT
    INTO :NIT, :RETENCION, :PAGO
    DO
    BEGIN
    if (RETENCION > 0) then
        BEGIN
        PAGO = PAGO * -1;
        SELECT TERC_NOM, TERC_NOMBRE1, TERC_NOMBRE2, TERC_APELLIDO1, TERC_APELLIDO2, TERC_DV, TIID_CODIGO,
            TERC_DIR, SUBSTR(CIUD_COD,1,2), SUBSTR(CIUD_COD,3,5)
            FROM TERCEROS T left outer join TIPO_ID IT on (T.TERC_TIPOID = IT.TIID_COD) WHERE TERC_NIT = :NIT
            INTO :RAZONSOCIAL, :NOMBRE1, :NOMBRE2, :APELLIDO1, :APELLIDO2, :DV, :TIPODOC, :DIRECCION, :DEPARTAMENTO, :MUNICIPIO;
        ITEM = ITEM + 1;
        insert into medios_magneticos_datos (memg_formato, memg_ano, memg_item, memg_concepto, memg_tipodoc, memg_nit, memg_dv,memg_apellido1, memg_apellido2, 
            memg_nombre1, memg_nombre2, memg_razonsocial, memg_direccion, memg_departamento, memg_municipio, memg_pago, memg_retencion)
            values (1002, substr(:inicio,1,4), :item,  :concepto, :tipodoc, :nit, :dv, :apellido1, :apellido2,
            :nombre1, :nombre2, :razonsocial, :direccion, :departamento, :municipio, :pago, :retencion);
        END
    END
/* RETENCIONES ENAJENACION ACTIVOS */
select COME_RESPUESTA FROM configura_mediosmag WHERE COME_ITEM = 9 INTO :CONCEPTO;
FOR SELECT MAX(D.TERC_NIT), SUM(CODE_CREDITO-CODE_DEBITO), SUM(CODE_BASE)
    FROM COMPROBANTE_DETALLE D, COMPROBANTE_ENCABEZADO E, mediosmag_cuentas M
    WHERE M.mmcu_item = 9 AND E.ENCO_CONSEC = D.ENCO_CONSEC AND ENCO_FECHA >= :INICIO AND ENCO_FECHA <= :FINAL AND
    SUBSTR(CUEN_COD,1,STRLEN(M.mmcu_cuenta)) = M.mmcu_cuenta AND ((CODE_CREDITO <> 0) or (CODE_DEBITO <> 0))
    GROUP BY D.TERC_NIT
    INTO :NIT, :RETENCION, :PAGO
    DO
    BEGIN
    if (RETENCION > 0) then
        BEGIN
        PAGO = PAGO * -1;
        SELECT TERC_NOM, TERC_NOMBRE1, TERC_NOMBRE2, TERC_APELLIDO1, TERC_APELLIDO2, TERC_DV, TIID_CODIGO,
            TERC_DIR, SUBSTR(CIUD_COD,1,2), SUBSTR(CIUD_COD,3,5)
            FROM TERCEROS T left outer join TIPO_ID IT on (T.TERC_TIPOID = IT.TIID_COD) WHERE TERC_NIT = :NIT
            INTO :RAZONSOCIAL, :NOMBRE1, :NOMBRE2, :APELLIDO1, :APELLIDO2, :DV, :TIPODOC, :DIRECCION, :DEPARTAMENTO, :MUNICIPIO;
        ITEM = ITEM + 1;
        insert into medios_magneticos_datos (memg_formato, memg_ano, memg_item, memg_concepto, memg_tipodoc, memg_nit, memg_dv,memg_apellido1, memg_apellido2, 
            memg_nombre1, memg_nombre2, memg_razonsocial, memg_direccion, memg_departamento, memg_municipio, memg_pago, memg_retencion)
            values (1002, substr(:inicio,1,4), :item,  :concepto, :tipodoc, :nit, :dv, :apellido1, :apellido2,
            :nombre1, :nombre2, :razonsocial, :direccion, :departamento, :municipio, :pago, :retencion);
        END
    END
/* RETENCIONES TARJETAS */
select COME_RESPUESTA FROM configura_mediosmag WHERE COME_ITEM = 10 INTO :CONCEPTO;
FOR SELECT MAX(D.TERC_NIT), SUM(CODE_CREDITO-CODE_DEBITO), SUM(CODE_BASE)
    FROM COMPROBANTE_DETALLE D, COMPROBANTE_ENCABEZADO E, mediosmag_cuentas M
    WHERE M.mmcu_item = 10 AND E.ENCO_CONSEC = D.ENCO_CONSEC AND ENCO_FECHA >= :INICIO AND ENCO_FECHA <= :FINAL AND
    SUBSTR(CUEN_COD,1,STRLEN(M.mmcu_cuenta)) = M.mmcu_cuenta AND ((CODE_CREDITO <> 0) or (CODE_DEBITO <> 0))
    GROUP BY D.TERC_NIT
    INTO :NIT, :RETENCION, :PAGO
    DO
    BEGIN
    if (RETENCION > 0) then
        BEGIN
        PAGO = PAGO * -1;
        SELECT TERC_NOM, TERC_NOMBRE1, TERC_NOMBRE2, TERC_APELLIDO1, TERC_APELLIDO2, TERC_DV, TIID_CODIGO,
            TERC_DIR, SUBSTR(CIUD_COD,1,2), SUBSTR(CIUD_COD,3,5)
            FROM TERCEROS T left outer join TIPO_ID IT on (T.TERC_TIPOID = IT.TIID_COD) WHERE TERC_NIT = :NIT
            INTO :RAZONSOCIAL, :NOMBRE1, :NOMBRE2, :APELLIDO1, :APELLIDO2, :DV, :TIPODOC, :DIRECCION, :DEPARTAMENTO, :MUNICIPIO;
        ITEM = ITEM + 1;
        insert into medios_magneticos_datos (memg_formato, memg_ano, memg_item, memg_concepto, memg_tipodoc, memg_nit, memg_dv,memg_apellido1, memg_apellido2, 
            memg_nombre1, memg_nombre2, memg_razonsocial, memg_direccion, memg_departamento, memg_municipio, memg_pago, memg_retencion)
            values (1002, substr(:inicio,1,4), :item,  :concepto, :tipodoc, :nit, :dv, :apellido1, :apellido2,
            :nombre1, :nombre2, :razonsocial, :direccion, :departamento, :municipio, :pago, :retencion);
        END
    END
/* RETENCIONES LOTERIAS */
select COME_RESPUESTA FROM configura_mediosmag WHERE COME_ITEM = 11 INTO :CONCEPTO;
FOR SELECT MAX(D.TERC_NIT), SUM(CODE_CREDITO-CODE_DEBITO), SUM(CODE_BASE)
    FROM COMPROBANTE_DETALLE D, COMPROBANTE_ENCABEZADO E, mediosmag_cuentas M
    WHERE M.mmcu_item = 11 AND E.ENCO_CONSEC = D.ENCO_CONSEC AND ENCO_FECHA >= :INICIO AND ENCO_FECHA <= :FINAL AND
    SUBSTR(CUEN_COD,1,STRLEN(M.mmcu_cuenta)) = M.mmcu_cuenta AND ((CODE_CREDITO <> 0) or (CODE_DEBITO <> 0))
    GROUP BY D.TERC_NIT
    INTO :NIT, :RETENCION, :PAGO
    DO
    BEGIN
    if (RETENCION > 0) then
        BEGIN
        PAGO = PAGO * -1;
        SELECT TERC_NOM, TERC_NOMBRE1, TERC_NOMBRE2, TERC_APELLIDO1, TERC_APELLIDO2, TERC_DV, TIID_CODIGO,
            TERC_DIR, SUBSTR(CIUD_COD,1,2), SUBSTR(CIUD_COD,3,5)
            FROM TERCEROS T left outer join TIPO_ID IT on (T.TERC_TIPOID = IT.TIID_COD) WHERE TERC_NIT = :NIT
            INTO :RAZONSOCIAL, :NOMBRE1, :NOMBRE2, :APELLIDO1, :APELLIDO2, :DV, :TIPODOC, :DIRECCION, :DEPARTAMENTO, :MUNICIPIO;
        ITEM = ITEM + 1;
        insert into medios_magneticos_datos (memg_formato, memg_ano, memg_item, memg_concepto, memg_tipodoc, memg_nit, memg_dv,memg_apellido1, memg_apellido2, 
            memg_nombre1, memg_nombre2, memg_razonsocial, memg_direccion, memg_departamento, memg_municipio, memg_pago, memg_retencion)
            values (1002, substr(:inicio,1,4), :item,  :concepto, :tipodoc, :nit, :dv, :apellido1, :apellido2,
            :nombre1, :nombre2, :razonsocial, :direccion, :departamento, :municipio, :pago, :retencion);
        END
    END
/* RETENCIONES PAGOS EXTERIOR */
select COME_RESPUESTA FROM configura_mediosmag WHERE COME_ITEM = 12 INTO :CONCEPTO;
FOR SELECT MAX(D.TERC_NIT), SUM(CODE_CREDITO-CODE_DEBITO), SUM(CODE_BASE)
    FROM COMPROBANTE_DETALLE D, COMPROBANTE_ENCABEZADO E, mediosmag_cuentas M
    WHERE M.mmcu_item = 12 AND E.ENCO_CONSEC = D.ENCO_CONSEC AND ENCO_FECHA >= :INICIO AND ENCO_FECHA <= :FINAL AND
    SUBSTR(CUEN_COD,1,STRLEN(M.mmcu_cuenta)) = M.mmcu_cuenta AND ((CODE_CREDITO <> 0) or (CODE_DEBITO <> 0))
    GROUP BY D.TERC_NIT
    INTO :NIT, :RETENCION, :PAGO
    DO
    BEGIN
    if (RETENCION > 0) then
        BEGIN
        PAGO = PAGO * -1;
        SELECT TERC_NOM, TERC_NOMBRE1, TERC_NOMBRE2, TERC_APELLIDO1, TERC_APELLIDO2, TERC_DV, TIID_CODIGO,
            TERC_DIR, SUBSTR(CIUD_COD,1,2), SUBSTR(CIUD_COD,3,5)
            FROM TERCEROS T left outer join TIPO_ID IT on (T.TERC_TIPOID = IT.TIID_COD) WHERE TERC_NIT = :NIT
            INTO :RAZONSOCIAL, :NOMBRE1, :NOMBRE2, :APELLIDO1, :APELLIDO2, :DV, :TIPODOC, :DIRECCION, :DEPARTAMENTO, :MUNICIPIO;
        ITEM = ITEM + 1;
        insert into medios_magneticos_datos (memg_formato, memg_ano, memg_item, memg_concepto, memg_tipodoc, memg_nit, memg_dv,memg_apellido1, memg_apellido2, 
            memg_nombre1, memg_nombre2, memg_razonsocial, memg_direccion, memg_departamento, memg_municipio, memg_pago, memg_retencion)
            values (1002, substr(:inicio,1,4), :item,  :concepto, :tipodoc, :nit, :dv, :apellido1, :apellido2,
            :nombre1, :nombre2, :razonsocial, :direccion, :departamento, :municipio, :pago, :retencion);
        END
    END
/* OTRAS RETENCIONES */
select COME_RESPUESTA FROM configura_mediosmag WHERE COME_ITEM = 13 INTO :CONCEPTO;
FOR SELECT MAX(D.TERC_NIT), SUM(CODE_CREDITO-CODE_DEBITO), SUM(CODE_BASE)
    FROM COMPROBANTE_DETALLE D, COMPROBANTE_ENCABEZADO E, mediosmag_cuentas M
    WHERE M.mmcu_item = 13 AND E.ENCO_CONSEC = D.ENCO_CONSEC AND ENCO_FECHA >= :INICIO AND ENCO_FECHA <= :FINAL AND
    SUBSTR(CUEN_COD,1,STRLEN(M.mmcu_cuenta)) = M.mmcu_cuenta AND ((CODE_CREDITO <> 0) or (CODE_DEBITO <> 0))
    GROUP BY D.TERC_NIT
    INTO :NIT, :RETENCION, :PAGO
    DO
    BEGIN
    if (RETENCION > 0) then
        BEGIN
        PAGO = PAGO * -1;
        SELECT TERC_NOM, TERC_NOMBRE1, TERC_NOMBRE2, TERC_APELLIDO1, TERC_APELLIDO2, TERC_DV, TIID_CODIGO,
            TERC_DIR, SUBSTR(CIUD_COD,1,2), SUBSTR(CIUD_COD,3,5)
            FROM TERCEROS T left outer join TIPO_ID IT on (T.TERC_TIPOID = IT.TIID_COD) WHERE TERC_NIT = :NIT
            INTO :RAZONSOCIAL, :NOMBRE1, :NOMBRE2, :APELLIDO1, :APELLIDO2, :DV, :TIPODOC, :DIRECCION, :DEPARTAMENTO, :MUNICIPIO;
        ITEM = ITEM + 1;
        insert into medios_magneticos_datos (memg_formato, memg_ano, memg_item, memg_concepto, memg_tipodoc, memg_nit, memg_dv,memg_apellido1, memg_apellido2, 
            memg_nombre1, memg_nombre2, memg_razonsocial, memg_direccion, memg_departamento, memg_municipio, memg_pago, memg_retencion)
            values (1002, substr(:inicio,1,4), :item,  :concepto, :tipodoc, :nit, :dv, :apellido1, :apellido2,
            :nombre1, :nombre2, :razonsocial, :direccion, :departamento, :municipio, :pago, :retencion);
        END
    END
/* AUTO-RETENCIONES VENTAS */
select COME_RESPUESTA FROM configura_mediosmag WHERE COME_ITEM = 14 INTO :CONCEPTO;
FOR SELECT MAX(D.TERC_NIT), SUM(CODE_CREDITO-CODE_DEBITO), SUM(CODE_BASE)
    FROM COMPROBANTE_DETALLE D, COMPROBANTE_ENCABEZADO E, mediosmag_cuentas M
    WHERE M.mmcu_item = 14 AND E.ENCO_CONSEC = D.ENCO_CONSEC AND ENCO_FECHA >= :INICIO AND ENCO_FECHA <= :FINAL AND
    SUBSTR(CUEN_COD,1,STRLEN(M.mmcu_cuenta)) = M.mmcu_cuenta AND ((CODE_CREDITO <> 0) or (CODE_DEBITO <> 0))
    GROUP BY D.TERC_NIT
    INTO :NIT, :RETENCION, :PAGO
    DO
    BEGIN
    if (RETENCION > 0) then
        BEGIN
        PAGO = PAGO * -1;
        SELECT TERC_NOM, TERC_NOMBRE1, TERC_NOMBRE2, TERC_APELLIDO1, TERC_APELLIDO2, TERC_DV, TIID_CODIGO,
            TERC_DIR, SUBSTR(CIUD_COD,1,2), SUBSTR(CIUD_COD,3,5)
            FROM TERCEROS T left outer join TIPO_ID IT on (T.TERC_TIPOID = IT.TIID_COD) WHERE TERC_NIT = :NIT
            INTO :RAZONSOCIAL, :NOMBRE1, :NOMBRE2, :APELLIDO1, :APELLIDO2, :DV, :TIPODOC, :DIRECCION, :DEPARTAMENTO, :MUNICIPIO;
        ITEM = ITEM + 1;
        insert into medios_magneticos_datos (memg_formato, memg_ano, memg_item, memg_concepto, memg_tipodoc, memg_nit, memg_dv,memg_apellido1, memg_apellido2, 
            memg_nombre1, memg_nombre2, memg_razonsocial, memg_direccion, memg_departamento, memg_municipio, memg_pago, memg_retencion)
            values (1002, substr(:inicio,1,4), :item,  :concepto, :tipodoc, :nit, :dv, :apellido1, :apellido2,
            :nombre1, :nombre2, :razonsocial, :direccion, :departamento, :municipio, :pago, :retencion);
        END
    END
/* AUTO-RETENCIONES SERVICIOS */
select COME_RESPUESTA FROM configura_mediosmag WHERE COME_ITEM = 15 INTO :CONCEPTO;
FOR SELECT MAX(D.TERC_NIT), SUM(CODE_CREDITO-CODE_DEBITO), SUM(CODE_BASE)
    FROM COMPROBANTE_DETALLE D, COMPROBANTE_ENCABEZADO E, mediosmag_cuentas M
    WHERE M.mmcu_item = 15 AND E.ENCO_CONSEC = D.ENCO_CONSEC AND ENCO_FECHA >= :INICIO AND ENCO_FECHA <= :FINAL AND
    SUBSTR(CUEN_COD,1,STRLEN(M.mmcu_cuenta)) = M.mmcu_cuenta AND ((CODE_CREDITO <> 0) or (CODE_DEBITO <> 0))
    GROUP BY D.TERC_NIT
    INTO :NIT, :RETENCION, :PAGO
    DO
    BEGIN
    if (RETENCION > 0) then
        BEGIN
        PAGO = PAGO * -1;
        SELECT TERC_NOM, TERC_NOMBRE1, TERC_NOMBRE2, TERC_APELLIDO1, TERC_APELLIDO2, TERC_DV, TIID_CODIGO,
            TERC_DIR, SUBSTR(CIUD_COD,1,2), SUBSTR(CIUD_COD,3,5)
            FROM TERCEROS T left outer join TIPO_ID IT on (T.TERC_TIPOID = IT.TIID_COD) WHERE TERC_NIT = :NIT
            INTO :RAZONSOCIAL, :NOMBRE1, :NOMBRE2, :APELLIDO1, :APELLIDO2, :DV, :TIPODOC, :DIRECCION, :DEPARTAMENTO, :MUNICIPIO;
        ITEM = ITEM + 1;
        insert into medios_magneticos_datos (memg_formato, memg_ano, memg_item, memg_concepto, memg_tipodoc, memg_nit, memg_dv,memg_apellido1, memg_apellido2, 
            memg_nombre1, memg_nombre2, memg_razonsocial, memg_direccion, memg_departamento, memg_municipio, memg_pago, memg_retencion)
            values (1002, substr(:inicio,1,4), :item,  :concepto, :tipodoc, :nit, :dv, :apellido1, :apellido2,
            :nombre1, :nombre2, :razonsocial, :direccion, :departamento, :municipio, :pago, :retencion);
        END
    END
/* AUTO-RETENCIONES RENDIMIENTOS */
select COME_RESPUESTA FROM configura_mediosmag WHERE COME_ITEM = 16 INTO :CONCEPTO;
FOR SELECT MAX(D.TERC_NIT), SUM(CODE_CREDITO-CODE_DEBITO), SUM(CODE_BASE)
    FROM COMPROBANTE_DETALLE D, COMPROBANTE_ENCABEZADO E, mediosmag_cuentas M
    WHERE M.mmcu_item = 16 AND E.ENCO_CONSEC = D.ENCO_CONSEC AND ENCO_FECHA >= :INICIO AND ENCO_FECHA <= :FINAL AND
    SUBSTR(CUEN_COD,1,STRLEN(M.mmcu_cuenta)) = M.mmcu_cuenta AND ((CODE_CREDITO <> 0) or (CODE_DEBITO <> 0))
    GROUP BY D.TERC_NIT
    INTO :NIT, :RETENCION, :PAGO
    DO
    BEGIN
    if (RETENCION > 0) then
        BEGIN
        PAGO = PAGO * -1;
        SELECT TERC_NOM, TERC_NOMBRE1, TERC_NOMBRE2, TERC_APELLIDO1, TERC_APELLIDO2, TERC_DV, TIID_CODIGO,
            TERC_DIR, SUBSTR(CIUD_COD,1,2), SUBSTR(CIUD_COD,3,5)
            FROM TERCEROS T left outer join TIPO_ID IT on (T.TERC_TIPOID = IT.TIID_COD) WHERE TERC_NIT = :NIT
            INTO :RAZONSOCIAL, :NOMBRE1, :NOMBRE2, :APELLIDO1, :APELLIDO2, :DV, :TIPODOC, :DIRECCION, :DEPARTAMENTO, :MUNICIPIO;
        ITEM = ITEM + 1;
        insert into medios_magneticos_datos (memg_formato, memg_ano, memg_item, memg_concepto, memg_tipodoc, memg_nit, memg_dv,memg_apellido1, memg_apellido2, 
            memg_nombre1, memg_nombre2, memg_razonsocial, memg_direccion, memg_departamento, memg_municipio, memg_pago, memg_retencion)
            values (1002, substr(:inicio,1,4), :item,  :concepto, :tipodoc, :nit, :dv, :apellido1, :apellido2,
            :nombre1, :nombre2, :razonsocial, :direccion, :departamento, :municipio, :pago, :retencion);
        END
    END
/* OTRAS AUTO-RETENCIONES */
select COME_RESPUESTA FROM configura_mediosmag WHERE COME_ITEM = 17 INTO :CONCEPTO;
FOR SELECT MAX(D.TERC_NIT), SUM(CODE_CREDITO-CODE_DEBITO), SUM(CODE_BASE)
    FROM COMPROBANTE_DETALLE D, COMPROBANTE_ENCABEZADO E, mediosmag_cuentas M
    WHERE M.mmcu_item = 17 AND E.ENCO_CONSEC = D.ENCO_CONSEC AND ENCO_FECHA >= :INICIO AND ENCO_FECHA <= :FINAL AND
    SUBSTR(CUEN_COD,1,STRLEN(M.mmcu_cuenta)) = M.mmcu_cuenta AND ((CODE_CREDITO <> 0) or (CODE_DEBITO <> 0))
    GROUP BY D.TERC_NIT
    INTO :NIT, :RETENCION, :PAGO
    DO
    BEGIN
    if (RETENCION > 0) then
        BEGIN
        PAGO = PAGO * -1;
        SELECT TERC_NOM, TERC_NOMBRE1, TERC_NOMBRE2, TERC_APELLIDO1, TERC_APELLIDO2, TERC_DV, TIID_CODIGO,
            TERC_DIR, SUBSTR(CIUD_COD,1,2), SUBSTR(CIUD_COD,3,5)
            FROM TERCEROS T left outer join TIPO_ID IT on (T.TERC_TIPOID = IT.TIID_COD) WHERE TERC_NIT = :NIT
            INTO :RAZONSOCIAL, :NOMBRE1, :NOMBRE2, :APELLIDO1, :APELLIDO2, :DV, :TIPODOC, :DIRECCION, :DEPARTAMENTO, :MUNICIPIO;
        ITEM = ITEM + 1;
        insert into medios_magneticos_datos (memg_formato, memg_ano, memg_item, memg_concepto, memg_tipodoc, memg_nit, memg_dv,memg_apellido1, memg_apellido2, 
            memg_nombre1, memg_nombre2, memg_razonsocial, memg_direccion, memg_departamento, memg_municipio, memg_pago, memg_retencion)
            values (1002, substr(:inicio,1,4), :item,  :concepto, :tipodoc, :nit, :dv, :apellido1, :apellido2,
            :nombre1, :nombre2, :razonsocial, :direccion, :departamento, :municipio, :pago, :retencion);
        END
    END
/* RETENCIONES IVA R.COMUN */
select COME_RESPUESTA FROM configura_mediosmag WHERE COME_ITEM = 18 INTO :CONCEPTO;
FOR SELECT MAX(D.TERC_NIT), SUM(CODE_CREDITO-CODE_DEBITO), SUM(CODE_BASE)
    FROM COMPROBANTE_DETALLE D, COMPROBANTE_ENCABEZADO E, mediosmag_cuentas M
    WHERE M.mmcu_item = 18 AND E.ENCO_CONSEC = D.ENCO_CONSEC AND ENCO_FECHA >= :INICIO AND ENCO_FECHA <= :FINAL AND
    SUBSTR(CUEN_COD,1,STRLEN(M.mmcu_cuenta)) = M.mmcu_cuenta AND ((CODE_CREDITO <> 0) or (CODE_DEBITO <> 0))
    GROUP BY D.TERC_NIT
    INTO :NIT, :RETENCION, :PAGO
    DO
    BEGIN
    if (RETENCION > 0) then
        BEGIN
        PAGO = PAGO * -1;
        SELECT TERC_NOM, TERC_NOMBRE1, TERC_NOMBRE2, TERC_APELLIDO1, TERC_APELLIDO2, TERC_DV, TIID_CODIGO,
            TERC_DIR, SUBSTR(CIUD_COD,1,2), SUBSTR(CIUD_COD,3,5)
            FROM TERCEROS T left outer join TIPO_ID IT on (T.TERC_TIPOID = IT.TIID_COD) WHERE TERC_NIT = :NIT
            INTO :RAZONSOCIAL, :NOMBRE1, :NOMBRE2, :APELLIDO1, :APELLIDO2, :DV, :TIPODOC, :DIRECCION, :DEPARTAMENTO, :MUNICIPIO;
        ITEM = ITEM + 1;
        insert into medios_magneticos_datos (memg_formato, memg_ano, memg_item, memg_concepto, memg_tipodoc, memg_nit, memg_dv,memg_apellido1, memg_apellido2, 
            memg_nombre1, memg_nombre2, memg_razonsocial, memg_direccion, memg_departamento, memg_municipio, memg_pago, memg_retencion)
            values (1002, substr(:inicio,1,4), :item,  :concepto, :tipodoc, :nit, :dv, :apellido1, :apellido2,
            :nombre1, :nombre2, :razonsocial, :direccion, :departamento, :municipio, :pago, :retencion);
        END
    END
/* RETENCIONES IVA R.SIMPLIFICADO */
select COME_RESPUESTA FROM configura_mediosmag WHERE COME_ITEM = 19 INTO :CONCEPTO;
FOR SELECT MAX(D.TERC_NIT), SUM(CODE_CREDITO-CODE_DEBITO), SUM(CODE_BASE)
    FROM COMPROBANTE_DETALLE D, COMPROBANTE_ENCABEZADO E, mediosmag_cuentas M
    WHERE M.mmcu_item = 19 AND E.ENCO_CONSEC = D.ENCO_CONSEC AND ENCO_FECHA >= :INICIO AND ENCO_FECHA <= :FINAL AND
    SUBSTR(CUEN_COD,1,STRLEN(M.mmcu_cuenta)) = M.mmcu_cuenta AND ((CODE_CREDITO <> 0) or (CODE_DEBITO <> 0))
    GROUP BY D.TERC_NIT
    INTO :NIT, :RETENCION, :PAGO
    DO
    BEGIN
    if (RETENCION > 0) then
        BEGIN
        PAGO = PAGO * -1;
        SELECT TERC_NOM, TERC_NOMBRE1, TERC_NOMBRE2, TERC_APELLIDO1, TERC_APELLIDO2, TERC_DV, TIID_CODIGO,
            TERC_DIR, SUBSTR(CIUD_COD,1,2), SUBSTR(CIUD_COD,3,5)
            FROM TERCEROS T left outer join TIPO_ID IT on (T.TERC_TIPOID = IT.TIID_COD) WHERE TERC_NIT = :NIT
            INTO :RAZONSOCIAL, :NOMBRE1, :NOMBRE2, :APELLIDO1, :APELLIDO2, :DV, :TIPODOC, :DIRECCION, :DEPARTAMENTO, :MUNICIPIO;
        ITEM = ITEM + 1;
        insert into medios_magneticos_datos (memg_formato, memg_ano, memg_item, memg_concepto, memg_tipodoc, memg_nit, memg_dv,memg_apellido1, memg_apellido2, 
            memg_nombre1, memg_nombre2, memg_razonsocial, memg_direccion, memg_departamento, memg_municipio, memg_pago, memg_retencion)
            values (1002, substr(:inicio,1,4), :item,  :concepto, :tipodoc, :nit, :dv, :apellido1, :apellido2,
            :nombre1, :nombre2, :razonsocial, :direccion, :departamento, :municipio, :pago, :retencion);
        END
    END
end;

/*******************************************************************************
The next statement causes the following error:

Undefined name.
Dynamic SQL Error.
SQL error code = -204.
Ambiguous field name between table COMPROBANTE_DETALLE and table COMPROBANTE_ENCABEZADO .
TERC_NIT.
*******************************************************************************/
ALTER PROCEDURE MM_1003 (
    INICIO CHAR(8) CHARACTER SET NONE,
    FINAL CHAR(8) CHARACTER SET NONE)
AS
declare variable CONCEPTO INTEGER;
declare variable TIPODOC INTEGER;
declare variable NIT VARCHAR(15) CHARACTER SET NONE;
declare variable DV CHAR(1) CHARACTER SET NONE;
declare variable APELLIDO1 VARCHAR(60) CHARACTER SET NONE;
declare variable APELLIDO2 VARCHAR(60) CHARACTER SET NONE;
declare variable NOMBRE1 VARCHAR(60) CHARACTER SET NONE;
declare variable NOMBRE2 VARCHAR(60) CHARACTER SET NONE;
declare variable RAZONSOCIAL VARCHAR(450) CHARACTER SET NONE;
declare variable DIRECCION VARCHAR(200) CHARACTER SET NONE;
declare variable DEPARTAMENTO CHAR(2) CHARACTER SET NONE;
declare variable MUNICIPIO CHAR(3) CHARACTER SET NONE;
declare variable RETENCION NUMERIC(18,0);
declare variable ITEM INTEGER;
begin
ITEM = 0;
/* RETENCIONES SALARIOS */
select COME_RESPUESTA FROM configura_mediosmag WHERE COME_ITEM = 41 INTO :CONCEPTO;
FOR SELECT MAX(D.TERC_NIT), SUM(CODE_CREDITO-CODE_DEBITO)
    FROM COMPROBANTE_DETALLE D, COMPROBANTE_ENCABEZADO E, mediosmag_cuentas M
    WHERE M.mmcu_item = 41 AND SUBSTR(CUEN_COD,1,STRLEN(M.mmcu_cuenta)) = M.mmcu_cuenta AND
    E.ENCO_CONSEC = D.ENCO_CONSEC AND ENCO_FECHA >= :INICIO AND ENCO_FECHA <= :FINAL AND
    ((CODE_CREDITO <> 0) or (CODE_DEBITO <> 0))
    GROUP BY D.TERC_NIT
    INTO :NIT, :RETENCION
    DO
    BEGIN
    if (RETENCION > 0) then
        BEGIN
        SELECT TERC_NOM, TERC_NOMBRE1, TERC_NOMBRE2, TERC_APELLIDO1, TERC_APELLIDO2, TERC_DV, TIID_CODIGO,
            TERC_DIR, SUBSTR(CIUD_COD,1,2), SUBSTR(CIUD_COD,3,5)
            FROM TERCEROS T left outer join TIPO_ID IT on (T.TERC_TIPOID = IT.TIID_COD) WHERE TERC_NIT = :NIT
            INTO :RAZONSOCIAL, :NOMBRE1, :NOMBRE2, :APELLIDO1, :APELLIDO2, :DV, :TIPODOC, :DIRECCION, :DEPARTAMENTO, :MUNICIPIO;
        ITEM = ITEM + 1;
        insert into medios_magneticos_datos (memg_formato, memg_ano, memg_item, memg_concepto, memg_tipodoc, memg_nit, memg_dv,memg_apellido1, memg_apellido2, 
            memg_nombre1, memg_nombre2, memg_razonsocial, memg_direccion, memg_departamento, memg_municipio, memg_pago)
            values (1003, substr(:inicio,1,4), :item,  :concepto, :tipodoc, :nit, :dv, :apellido1, :apellido2,
            :nombre1, :nombre2, :razonsocial, :direccion, :departamento, :municipio, :retencion);
        END
    END
/* RETENCIONES VENTAS */
select COME_RESPUESTA FROM configura_mediosmag WHERE COME_ITEM = 42 INTO :CONCEPTO;
FOR SELECT MAX(D.TERC_NIT), SUM(CODE_CREDITO-CODE_DEBITO)
    FROM COMPROBANTE_DETALLE D, COMPROBANTE_ENCABEZADO E, mediosmag_cuentas M
    WHERE M.mmcu_item = 42 AND SUBSTR(CUEN_COD,1,STRLEN(M.mmcu_cuenta)) = M.mmcu_cuenta AND
    E.ENCO_CONSEC = D.ENCO_CONSEC AND ENCO_FECHA >= :INICIO AND ENCO_FECHA <= :FINAL AND
    ((CODE_CREDITO <> 0) or (CODE_DEBITO <> 0))
    GROUP BY D.TERC_NIT
    INTO :NIT, :RETENCION
    DO
    BEGIN
    if (RETENCION > 0) then
        BEGIN
        SELECT TERC_NOM, TERC_NOMBRE1, TERC_NOMBRE2, TERC_APELLIDO1, TERC_APELLIDO2, TERC_DV, TIID_CODIGO,
            TERC_DIR, SUBSTR(CIUD_COD,1,2), SUBSTR(CIUD_COD,3,5)
            FROM TERCEROS T left outer join TIPO_ID IT on (T.TERC_TIPOID = IT.TIID_COD) WHERE TERC_NIT = :NIT
            INTO :RAZONSOCIAL, :NOMBRE1, :NOMBRE2, :APELLIDO1, :APELLIDO2, :DV, :TIPODOC, :DIRECCION, :DEPARTAMENTO, :MUNICIPIO;
        ITEM = ITEM + 1;
        insert into medios_magneticos_datos (memg_formato, memg_ano, memg_item, memg_concepto, memg_tipodoc, memg_nit, memg_dv,memg_apellido1, memg_apellido2, 
            memg_nombre1, memg_nombre2, memg_razonsocial, memg_direccion, memg_departamento, memg_municipio, memg_pago)
            values (1003, substr(:inicio,1,4), :item,  :concepto, :tipodoc, :nit, :dv, :apellido1, :apellido2,
            :nombre1, :nombre2, :razonsocial, :direccion, :departamento, :municipio, :retencion);
        END
    END
/* RETENCIONES SERVICIOS */
select COME_RESPUESTA FROM configura_mediosmag WHERE COME_ITEM = 43 INTO :CONCEPTO;
FOR SELECT MAX(D.TERC_NIT), SUM(CODE_CREDITO-CODE_DEBITO)
    FROM COMPROBANTE_DETALLE D, COMPROBANTE_ENCABEZADO E, mediosmag_cuentas M
    WHERE M.mmcu_item = 43 AND SUBSTR(CUEN_COD,1,STRLEN(M.mmcu_cuenta)) = M.mmcu_cuenta AND
    E.ENCO_CONSEC = D.ENCO_CONSEC AND ENCO_FECHA >= :INICIO AND ENCO_FECHA <= :FINAL AND
    ((CODE_CREDITO <> 0) or (CODE_DEBITO <> 0))
    GROUP BY D.TERC_NIT
    INTO :NIT, :RETENCION
    DO
    BEGIN
    if (RETENCION > 0) then
        BEGIN
        SELECT TERC_NOM, TERC_NOMBRE1, TERC_NOMBRE2, TERC_APELLIDO1, TERC_APELLIDO2, TERC_DV, TIID_CODIGO,
            TERC_DIR, SUBSTR(CIUD_COD,1,2), SUBSTR(CIUD_COD,3,5)
            FROM TERCEROS T left outer join TIPO_ID IT on (T.TERC_TIPOID = IT.TIID_COD) WHERE TERC_NIT = :NIT
            INTO :RAZONSOCIAL, :NOMBRE1, :NOMBRE2, :APELLIDO1, :APELLIDO2, :DV, :TIPODOC, :DIRECCION, :DEPARTAMENTO, :MUNICIPIO;
        ITEM = ITEM + 1;
        insert into medios_magneticos_datos (memg_formato, memg_ano, memg_item, memg_concepto, memg_tipodoc, memg_nit, memg_dv,memg_apellido1, memg_apellido2, 
            memg_nombre1, memg_nombre2, memg_razonsocial, memg_direccion, memg_departamento, memg_municipio, memg_pago)
            values (1003, substr(:inicio,1,4), :item,  :concepto, :tipodoc, :nit, :dv, :apellido1, :apellido2,
            :nombre1, :nombre2, :razonsocial, :direccion, :departamento, :municipio, :retencion);
        END
    END
/* RETENCIONES HONORARIOS */
select COME_RESPUESTA FROM configura_mediosmag WHERE COME_ITEM = 44 INTO :CONCEPTO;
FOR SELECT MAX(D.TERC_NIT), SUM(CODE_CREDITO-CODE_DEBITO)
    FROM COMPROBANTE_DETALLE D, COMPROBANTE_ENCABEZADO E, mediosmag_cuentas M
    WHERE M.mmcu_item = 44 AND SUBSTR(CUEN_COD,1,STRLEN(M.mmcu_cuenta)) = M.mmcu_cuenta AND
    E.ENCO_CONSEC = D.ENCO_CONSEC AND ENCO_FECHA >= :INICIO AND ENCO_FECHA <= :FINAL AND
    ((CODE_CREDITO <> 0) or (CODE_DEBITO <> 0))
    GROUP BY D.TERC_NIT
    INTO :NIT, :RETENCION
    DO
    BEGIN
    if (RETENCION > 0) then
        BEGIN
        SELECT TERC_NOM, TERC_NOMBRE1, TERC_NOMBRE2, TERC_APELLIDO1, TERC_APELLIDO2, TERC_DV, TIID_CODIGO,
            TERC_DIR, SUBSTR(CIUD_COD,1,2), SUBSTR(CIUD_COD,3,5)
            FROM TERCEROS T left outer join TIPO_ID IT on (T.TERC_TIPOID = IT.TIID_COD) WHERE TERC_NIT = :NIT
            INTO :RAZONSOCIAL, :NOMBRE1, :NOMBRE2, :APELLIDO1, :APELLIDO2, :DV, :TIPODOC, :DIRECCION, :DEPARTAMENTO, :MUNICIPIO;
        ITEM = ITEM + 1;
        insert into medios_magneticos_datos (memg_formato, memg_ano, memg_item, memg_concepto, memg_tipodoc, memg_nit, memg_dv,memg_apellido1, memg_apellido2, 
            memg_nombre1, memg_nombre2, memg_razonsocial, memg_direccion, memg_departamento, memg_municipio, memg_pago)
            values (1003, substr(:inicio,1,4), :item,  :concepto, :tipodoc, :nit, :dv, :apellido1, :apellido2,
            :nombre1, :nombre2, :razonsocial, :direccion, :departamento, :municipio, :retencion);
        END
    END
/* RETENCIONES COMISIONES */
select COME_RESPUESTA FROM configura_mediosmag WHERE COME_ITEM = 45 INTO :CONCEPTO;
FOR SELECT MAX(D.TERC_NIT), SUM(CODE_CREDITO-CODE_DEBITO)
    FROM COMPROBANTE_DETALLE D, COMPROBANTE_ENCABEZADO E, mediosmag_cuentas M
    WHERE M.mmcu_item = 45 AND SUBSTR(CUEN_COD,1,STRLEN(M.mmcu_cuenta)) = M.mmcu_cuenta AND
    E.ENCO_CONSEC = D.ENCO_CONSEC AND ENCO_FECHA >= :INICIO AND ENCO_FECHA <= :FINAL AND
    ((CODE_CREDITO <> 0) or (CODE_DEBITO <> 0))
    GROUP BY D.TERC_NIT
    INTO :NIT, :RETENCION
    DO
    BEGIN
    if (RETENCION > 0) then
        BEGIN
        SELECT TERC_NOM, TERC_NOMBRE1, TERC_NOMBRE2, TERC_APELLIDO1, TERC_APELLIDO2, TERC_DV, TIID_CODIGO,
            TERC_DIR, SUBSTR(CIUD_COD,1,2), SUBSTR(CIUD_COD,3,5)
            FROM TERCEROS T left outer join TIPO_ID IT on (T.TERC_TIPOID = IT.TIID_COD) WHERE TERC_NIT = :NIT
            INTO :RAZONSOCIAL, :NOMBRE1, :NOMBRE2, :APELLIDO1, :APELLIDO2, :DV, :TIPODOC, :DIRECCION, :DEPARTAMENTO, :MUNICIPIO;
        ITEM = ITEM + 1;
        insert into medios_magneticos_datos (memg_formato, memg_ano, memg_item, memg_concepto, memg_tipodoc, memg_nit, memg_dv,memg_apellido1, memg_apellido2, 
            memg_nombre1, memg_nombre2, memg_razonsocial, memg_direccion, memg_departamento, memg_municipio, memg_pago)
            values (1003, substr(:inicio,1,4), :item,  :concepto, :tipodoc, :nit, :dv, :apellido1, :apellido2,
            :nombre1, :nombre2, :razonsocial, :direccion, :departamento, :municipio, :retencion);
        END
    END
/* RETENCIONES RENDIMIENTOS */
select COME_RESPUESTA FROM configura_mediosmag WHERE COME_ITEM = 46 INTO :CONCEPTO;
FOR SELECT MAX(D.TERC_NIT), SUM(CODE_CREDITO-CODE_DEBITO)
    FROM COMPROBANTE_DETALLE D, COMPROBANTE_ENCABEZADO E, mediosmag_cuentas M
    WHERE M.mmcu_item = 46 AND SUBSTR(CUEN_COD,1,STRLEN(M.mmcu_cuenta)) = M.mmcu_cuenta AND
    E.ENCO_CONSEC = D.ENCO_CONSEC AND ENCO_FECHA >= :INICIO AND ENCO_FECHA <= :FINAL AND
    ((CODE_CREDITO <> 0) or (CODE_DEBITO <> 0))
    GROUP BY D.TERC_NIT
    INTO :NIT, :RETENCION
    DO
    BEGIN
    if (RETENCION > 0) then
        BEGIN
        SELECT TERC_NOM, TERC_NOMBRE1, TERC_NOMBRE2, TERC_APELLIDO1, TERC_APELLIDO2, TERC_DV, TIID_CODIGO,
            TERC_DIR, SUBSTR(CIUD_COD,1,2), SUBSTR(CIUD_COD,3,5)
            FROM TERCEROS T left outer join TIPO_ID IT on (T.TERC_TIPOID = IT.TIID_COD) WHERE TERC_NIT = :NIT
            INTO :RAZONSOCIAL, :NOMBRE1, :NOMBRE2, :APELLIDO1, :APELLIDO2, :DV, :TIPODOC, :DIRECCION, :DEPARTAMENTO, :MUNICIPIO;
        ITEM = ITEM + 1;
        insert into medios_magneticos_datos (memg_formato, memg_ano, memg_item, memg_concepto, memg_tipodoc, memg_nit, memg_dv,memg_apellido1, memg_apellido2, 
            memg_nombre1, memg_nombre2, memg_razonsocial, memg_direccion, memg_departamento, memg_municipio, memg_pago)
            values (1003, substr(:inicio,1,4), :item,  :concepto, :tipodoc, :nit, :dv, :apellido1, :apellido2,
            :nombre1, :nombre2, :razonsocial, :direccion, :departamento, :municipio, :retencion);
        END
    END
/* RETENCIONES ARRIENDOS */
select COME_RESPUESTA FROM configura_mediosmag WHERE COME_ITEM = 47 INTO :CONCEPTO;
FOR SELECT MAX(D.TERC_NIT), SUM(CODE_CREDITO-CODE_DEBITO)
    FROM COMPROBANTE_DETALLE D, COMPROBANTE_ENCABEZADO E, mediosmag_cuentas M
    WHERE M.mmcu_item = 47 AND SUBSTR(CUEN_COD,1,STRLEN(M.mmcu_cuenta)) = M.mmcu_cuenta AND
    E.ENCO_CONSEC = D.ENCO_CONSEC AND ENCO_FECHA >= :INICIO AND ENCO_FECHA <= :FINAL AND
    ((CODE_CREDITO <> 0) or (CODE_DEBITO <> 0))
    GROUP BY D.TERC_NIT
    INTO :NIT, :RETENCION
    DO
    BEGIN
    if (RETENCION > 0) then
        BEGIN
        SELECT TERC_NOM, TERC_NOMBRE1, TERC_NOMBRE2, TERC_APELLIDO1, TERC_APELLIDO2, TERC_DV, TIID_CODIGO,
            TERC_DIR, SUBSTR(CIUD_COD,1,2), SUBSTR(CIUD_COD,3,5)
            FROM TERCEROS T left outer join TIPO_ID IT on (T.TERC_TIPOID = IT.TIID_COD) WHERE TERC_NIT = :NIT
            INTO :RAZONSOCIAL, :NOMBRE1, :NOMBRE2, :APELLIDO1, :APELLIDO2, :DV, :TIPODOC, :DIRECCION, :DEPARTAMENTO, :MUNICIPIO;
        ITEM = ITEM + 1;
        insert into medios_magneticos_datos (memg_formato, memg_ano, memg_item, memg_concepto, memg_tipodoc, memg_nit, memg_dv,memg_apellido1, memg_apellido2, 
            memg_nombre1, memg_nombre2, memg_razonsocial, memg_direccion, memg_departamento, memg_municipio, memg_pago)
            values (1003, substr(:inicio,1,4), :item,  :concepto, :tipodoc, :nit, :dv, :apellido1, :apellido2,
            :nombre1, :nombre2, :razonsocial, :direccion, :departamento, :municipio, :retencion);
        END
    END
/* RETENCIONES OTRAS */
select COME_RESPUESTA FROM configura_mediosmag WHERE COME_ITEM = 48 INTO :CONCEPTO;
FOR SELECT MAX(D.TERC_NIT), SUM(CODE_CREDITO-CODE_DEBITO)
    FROM COMPROBANTE_DETALLE D, COMPROBANTE_ENCABEZADO E, mediosmag_cuentas M
    WHERE M.mmcu_item = 48 AND SUBSTR(CUEN_COD,1,STRLEN(M.mmcu_cuenta)) = M.mmcu_cuenta AND
    E.ENCO_CONSEC = D.ENCO_CONSEC AND ENCO_FECHA >= :INICIO AND ENCO_FECHA <= :FINAL AND
    ((CODE_CREDITO <> 0) or (CODE_DEBITO <> 0))
    GROUP BY D.TERC_NIT
    INTO :NIT, :RETENCION
    DO
    BEGIN
    if (RETENCION > 0) then
        BEGIN
        SELECT TERC_NOM, TERC_NOMBRE1, TERC_NOMBRE2, TERC_APELLIDO1, TERC_APELLIDO2, TERC_DV, TIID_CODIGO,
            TERC_DIR, SUBSTR(CIUD_COD,1,2), SUBSTR(CIUD_COD,3,5)
            FROM TERCEROS T left outer join TIPO_ID IT on (T.TERC_TIPOID = IT.TIID_COD) WHERE TERC_NIT = :NIT
            INTO :RAZONSOCIAL, :NOMBRE1, :NOMBRE2, :APELLIDO1, :APELLIDO2, :DV, :TIPODOC, :DIRECCION, :DEPARTAMENTO, :MUNICIPIO;
        ITEM = ITEM + 1;
        insert into medios_magneticos_datos (memg_formato, memg_ano, memg_item, memg_concepto, memg_tipodoc, memg_nit, memg_dv,memg_apellido1, memg_apellido2, 
            memg_nombre1, memg_nombre2, memg_razonsocial, memg_direccion, memg_departamento, memg_municipio, memg_pago)
            values (1003, substr(:inicio,1,4), :item,  :concepto, :tipodoc, :nit, :dv, :apellido1, :apellido2,
            :nombre1, :nombre2, :razonsocial, :direccion, :departamento, :municipio, :retencion);
        END
    END
/* RETENCIONES DE IVA */
select COME_RESPUESTA FROM configura_mediosmag WHERE COME_ITEM = 49 INTO :CONCEPTO;
FOR SELECT MAX(D.TERC_NIT), SUM(CODE_CREDITO-CODE_DEBITO)
    FROM COMPROBANTE_DETALLE D, COMPROBANTE_ENCABEZADO E, mediosmag_cuentas M
    WHERE M.mmcu_item = 49 AND SUBSTR(CUEN_COD,1,STRLEN(M.mmcu_cuenta)) = M.mmcu_cuenta AND
    E.ENCO_CONSEC = D.ENCO_CONSEC AND ENCO_FECHA >= :INICIO AND ENCO_FECHA <= :FINAL AND
    ((CODE_CREDITO <> 0) or (CODE_DEBITO <> 0))
    GROUP BY D.TERC_NIT
    INTO :NIT, :RETENCION
    DO
    BEGIN
    if (RETENCION > 0) then
        BEGIN
        SELECT TERC_NOM, TERC_NOMBRE1, TERC_NOMBRE2, TERC_APELLIDO1, TERC_APELLIDO2, TERC_DV, TIID_CODIGO,
            TERC_DIR, SUBSTR(CIUD_COD,1,2), SUBSTR(CIUD_COD,3,5)
            FROM TERCEROS T left outer join TIPO_ID IT on (T.TERC_TIPOID = IT.TIID_COD) WHERE TERC_NIT = :NIT
            INTO :RAZONSOCIAL, :NOMBRE1, :NOMBRE2, :APELLIDO1, :APELLIDO2, :DV, :TIPODOC, :DIRECCION, :DEPARTAMENTO, :MUNICIPIO;
        ITEM = ITEM + 1;
        insert into medios_magneticos_datos (memg_formato, memg_ano, memg_item, memg_concepto, memg_tipodoc, memg_nit, memg_dv,memg_apellido1, memg_apellido2, 
            memg_nombre1, memg_nombre2, memg_razonsocial, memg_direccion, memg_departamento, memg_municipio, memg_pago)
            values (1003, substr(:inicio,1,4), :item,  :concepto, :tipodoc, :nit, :dv, :apellido1, :apellido2,
            :nombre1, :nombre2, :razonsocial, :direccion, :departamento, :municipio, :retencion);
        END
    END
end;

/*******************************************************************************
The next statement causes the following error:

Undefined name.
Dynamic SQL Error.
SQL error code = -204.
Ambiguous field name between table COMPROBANTE_DETALLE and table COMPROBANTE_ENCABEZADO .
TERC_NIT.
*******************************************************************************/
ALTER PROCEDURE MM_1005 (
    INICIO CHAR(8) CHARACTER SET NONE,
    FINAL CHAR(8) CHARACTER SET NONE)
AS
declare variable TIPODOC INTEGER;
declare variable NIT VARCHAR(15) CHARACTER SET NONE;
declare variable DV CHAR(1) CHARACTER SET NONE;
declare variable APELLIDO1 VARCHAR(60) CHARACTER SET NONE;
declare variable APELLIDO2 VARCHAR(60) CHARACTER SET NONE;
declare variable NOMBRE1 VARCHAR(60) CHARACTER SET NONE;
declare variable NOMBRE2 VARCHAR(60) CHARACTER SET NONE;
declare variable RAZONSOCIAL VARCHAR(450) CHARACTER SET NONE;
declare variable IVA NUMERIC(18,0);
declare variable ITEM INTEGER;
begin
ITEM = 0;
/* IVA DESCONTABLE */
FOR SELECT MAX(D.TERC_NIT), SUM(CODE_DEBITO-CODE_CREDITO)
    FROM COMPROBANTE_DETALLE D, COMPROBANTE_ENCABEZADO E, mediosmag_cuentas M
    WHERE M.mmcu_item = 111 AND SUBSTR(CUEN_COD,1,STRLEN(M.mmcu_cuenta)) = M.mmcu_cuenta AND
    E.ENCO_CONSEC = D.ENCO_CONSEC AND ENCO_FECHA >= :INICIO AND ENCO_FECHA <= :FINAL
    GROUP BY D.TERC_NIT
    INTO :NIT, :IVA
    DO
    BEGIN
    if (IVA > 0) then
        BEGIN
        SELECT TERC_NOM, TERC_NOMBRE1, TERC_NOMBRE2, TERC_APELLIDO1, TERC_APELLIDO2, TERC_DV, TIID_CODIGO
            FROM TERCEROS T left outer join TIPO_ID IT on (T.TERC_TIPOID = IT.TIID_COD) WHERE TERC_NIT = :NIT
            INTO :RAZONSOCIAL, :NOMBRE1, :NOMBRE2, :APELLIDO1, :APELLIDO2, :DV, :TIPODOC;
        ITEM = ITEM + 1;
        insert into medios_magneticos_datos (memg_formato, memg_ano, memg_item, memg_tipodoc, memg_nit, memg_dv,memg_apellido1, memg_apellido2,
            memg_nombre1, memg_nombre2, memg_razonsocial, memg_pago)
            values (1005, substr(:inicio,1,4), :item, :tipodoc, :nit, :dv, :apellido1, :apellido2,
            :nombre1, :nombre2, :razonsocial, :iva);
        END
    END
end;

/*******************************************************************************
The next statement causes the following error:

Undefined name.
Dynamic SQL Error.
SQL error code = -204.
Ambiguous field name between table COMPROBANTE_DETALLE and table COMPROBANTE_ENCABEZADO .
TERC_NIT.
*******************************************************************************/
ALTER PROCEDURE MM_1006 (
    INICIO CHAR(8) CHARACTER SET NONE,
    FINAL CHAR(8) CHARACTER SET NONE)
AS
declare variable TIPODOC INTEGER;
declare variable NIT VARCHAR(15) CHARACTER SET NONE;
declare variable DV CHAR(1) CHARACTER SET NONE;
declare variable APELLIDO1 VARCHAR(60) CHARACTER SET NONE;
declare variable APELLIDO2 VARCHAR(60) CHARACTER SET NONE;
declare variable NOMBRE1 VARCHAR(60) CHARACTER SET NONE;
declare variable NOMBRE2 VARCHAR(60) CHARACTER SET NONE;
declare variable RAZONSOCIAL VARCHAR(450) CHARACTER SET NONE;
declare variable IVA NUMERIC(18,0);
declare variable ITEM INTEGER;
begin
ITEM = 0;
/* IVA GENERADO */
FOR SELECT MAX(D.TERC_NIT), SUM(CODE_CREDITO-CODE_DEBITO)
    FROM COMPROBANTE_DETALLE D, COMPROBANTE_ENCABEZADO E, mediosmag_cuentas M
    WHERE M.mmcu_item = 115 AND SUBSTR(CUEN_COD,1,STRLEN(M.mmcu_cuenta)) = M.mmcu_cuenta AND
    E.ENCO_CONSEC = D.ENCO_CONSEC AND ENCO_FECHA >= :INICIO AND ENCO_FECHA <= :FINAL
    GROUP BY D.TERC_NIT
    INTO :NIT, :IVA
    DO
    BEGIN
    if (IVA > 0) then
        BEGIN
        SELECT TERC_NOM, TERC_NOMBRE1, TERC_NOMBRE2, TERC_APELLIDO1, TERC_APELLIDO2, TERC_DV, TIID_CODIGO
            FROM TERCEROS T left outer join TIPO_ID IT on (T.TERC_TIPOID = IT.TIID_COD) WHERE TERC_NIT = :NIT
            INTO :RAZONSOCIAL, :NOMBRE1, :NOMBRE2, :APELLIDO1, :APELLIDO2, :DV, :TIPODOC;
        ITEM = ITEM + 1;
        insert into medios_magneticos_datos (memg_formato, memg_ano, memg_item, memg_tipodoc, memg_nit, memg_dv,memg_apellido1, memg_apellido2,
            memg_nombre1, memg_nombre2, memg_razonsocial, memg_pago)
            values (1006, substr(:inicio,1,4), :item, :tipodoc, :nit, :dv, :apellido1, :apellido2,
            :nombre1, :nombre2, :razonsocial, :iva);
        END
    END
end;

/*******************************************************************************
The next statement causes the following error:

Undefined name.
Dynamic SQL Error.
SQL error code = -204.
Ambiguous field name between table COMPROBANTE_DETALLE and table COMPROBANTE_ENCABEZADO .
TERC_NIT.
*******************************************************************************/
ALTER PROCEDURE MM_1007 (
    INICIO CHAR(8) CHARACTER SET NONE,
    FINAL CHAR(8) CHARACTER SET NONE)
AS
declare variable CONCEPTO INTEGER;
declare variable TIPODOC INTEGER;
declare variable NIT VARCHAR(15) CHARACTER SET NONE;
declare variable DV CHAR(1) CHARACTER SET NONE;
declare variable APELLIDO1 VARCHAR(60) CHARACTER SET NONE;
declare variable APELLIDO2 VARCHAR(60) CHARACTER SET NONE;
declare variable NOMBRE1 VARCHAR(60) CHARACTER SET NONE;
declare variable NOMBRE2 VARCHAR(60) CHARACTER SET NONE;
declare variable RAZONSOCIAL VARCHAR(450) CHARACTER SET NONE;
declare variable INGRESO NUMERIC(18,0);
declare variable DEVOLUCION NUMERIC(18,0);
declare variable ITEM INTEGER;
declare variable MINIMO NUMERIC(18,2);
declare variable MENORCUANTIAI NUMERIC(18,2);
declare variable MENORCUANTIAD NUMERIC(18,2);
declare variable TOTALTERC NUMERIC(18,2);
begin
ITEM = 0;
MENORCUANTIAI = 0;
MENORCUANTIAD = 0;
/* INGRESOS OPERACIONALES */
select COME_RESPUESTA, COME_MINIMO FROM configura_mediosmag WHERE COME_ITEM = 51 INTO :CONCEPTO, :MINIMO;
FOR SELECT MAX(D.TERC_NIT), SUM(CODE_CREDITO), SUM(CODE_DEBITO)
    FROM COMPROBANTE_DETALLE D, COMPROBANTE_ENCABEZADO E, mediosmag_cuentas M
    WHERE M.mmcu_item = 51 AND SUBSTR(CUEN_COD,1,STRLEN(M.mmcu_cuenta)) = M.mmcu_cuenta AND
    E.ENCO_CONSEC = D.ENCO_CONSEC AND ENCO_FECHA >= :INICIO AND ENCO_FECHA <= :FINAL AND
    ((CODE_CREDITO <> 0) or (CODE_DEBITO <> 0))
    GROUP BY D.TERC_NIT
    INTO :NIT, :ingreso, :devolucion
    DO
    BEGIN
    SELECT SUM(CODE_CREDITO-CODE_DEBITO) FROM comprobante_detalle WHERE TERC_NIT = :NIT AND
        SUBSTR(CUEN_COD,1,1) = '4' INTO TOTALTERC;
    if (INGRESO IS NULL) then
        INGRESO = 0;
    if (DEVOLUCION IS NULL) then
        DEVOLUCION = 0;
    if ((TOTALTERC >= MINIMO) AND ((INGRESO > 0) or (DEVOLUCION > 0))) then
        BEGIN
        SELECT TERC_NOM, TERC_NOMBRE1, TERC_NOMBRE2, TERC_APELLIDO1, TERC_APELLIDO2, TERC_DV, TIID_CODIGO
            FROM TERCEROS T left outer join TIPO_ID IT on (T.TERC_TIPOID = IT.TIID_COD) WHERE TERC_NIT = :NIT
            INTO :RAZONSOCIAL, :NOMBRE1, :NOMBRE2, :APELLIDO1, :APELLIDO2, :DV, :TIPODOC;
        ITEM = ITEM + 1;
        insert into medios_magneticos_datos (memg_formato, memg_ano, memg_item, memg_concepto, memg_tipodoc, memg_nit, memg_dv,memg_apellido1, memg_apellido2, 
            memg_nombre1, memg_nombre2, memg_razonsocial, memg_pago, memg_retencion)
            values (1007, substr(:inicio,1,4), :item,  :concepto, :tipodoc, :nit, :dv, :apellido1, :apellido2,
            :nombre1, :nombre2, :razonsocial, :ingreso, :devolucion);
        END
    ELSE
        BEGIN
        MENORCUANTIAI = MENORCUANTIAI + INGRESO;
        MENORCUANTIAD = MENORCUANTIAD + DEVOLUCION;
        END
    END
if ((MENORCUANTIAI > 0) or (MENORCUANTIAD > 0)) then
    BEGIN
    NIT = '222222222';
    razonsocial = 'CUANTIAS MENORES';
    NOMBRE1 = '';
    NOMBRE2 = '';
    APELLIDO1 = '';
    APELLIDO2 = '';
    DV = '';
    TIPODOC = 13;
    ITEM = ITEM + 1;
    insert into medios_magneticos_datos (memg_formato, memg_ano, memg_item, memg_concepto, memg_tipodoc, memg_nit, memg_dv,memg_apellido1, memg_apellido2,
        memg_nombre1, memg_nombre2, memg_razonsocial, memg_pago, memg_retencion)
        values (1007, substr(:inicio,1,4), :item,  :concepto, :tipodoc, :nit, :dv, :apellido1, :apellido2,
        :nombre1, :nombre2, :razonsocial, :menorcuantiai, :menorcuantiad);
    END
/* INGRESOS NO-OPERACIONALES */
MENORCUANTIAI = 0;
MENORCUANTIAD = 0;
select COME_RESPUESTA, COME_MINIMO FROM configura_mediosmag WHERE COME_ITEM = 52 INTO :CONCEPTO, :MINIMO;
FOR SELECT MAX(D.TERC_NIT), SUM(CODE_CREDITO), SUM(CODE_DEBITO)
    FROM COMPROBANTE_DETALLE D, COMPROBANTE_ENCABEZADO E, mediosmag_cuentas M
    WHERE M.mmcu_item = 52 AND SUBSTR(CUEN_COD,1,STRLEN(M.mmcu_cuenta)) = M.mmcu_cuenta AND
    E.ENCO_CONSEC = D.ENCO_CONSEC AND ENCO_FECHA >= :INICIO AND ENCO_FECHA <= :FINAL AND
    ((CODE_CREDITO <> 0) or (CODE_DEBITO <> 0))
    GROUP BY D.TERC_NIT
    INTO :NIT, :ingreso,  :devolucion
    DO
    BEGIN
    SELECT SUM(CODE_CREDITO-CODE_DEBITO) FROM comprobante_detalle WHERE TERC_NIT = :NIT AND
        SUBSTR(CUEN_COD,1,1) = '4' INTO TOTALTERC;
    if (INGRESO IS NULL) then
        INGRESO = 0;
    if (DEVOLUCION IS NULL) then
        DEVOLUCION = 0;
    if ((TOTALTERC >= MINIMO) AND ((INGRESO > 0) or (DEVOLUCION > 0))) then
        BEGIN
        SELECT TERC_NOM, TERC_NOMBRE1, TERC_NOMBRE2, TERC_APELLIDO1, TERC_APELLIDO2, TERC_DV, TIID_CODIGO
            FROM TERCEROS T left outer join TIPO_ID IT on (T.TERC_TIPOID = IT.TIID_COD) WHERE TERC_NIT = :NIT
            INTO :RAZONSOCIAL, :NOMBRE1, :NOMBRE2, :APELLIDO1, :APELLIDO2, :DV, :TIPODOC;
        ITEM = ITEM + 1;
        insert into medios_magneticos_datos (memg_formato, memg_ano, memg_item, memg_concepto, memg_tipodoc, memg_nit, memg_dv,memg_apellido1, memg_apellido2, 
            memg_nombre1, memg_nombre2, memg_razonsocial, memg_pago, memg_retencion)
            values (1007, substr(:inicio,1,4), :item,  :concepto, :tipodoc, :nit, :dv, :apellido1, :apellido2,
            :nombre1, :nombre2, :razonsocial, :ingreso, :devolucion);
        END
    ELSE
        BEGIN
        MENORCUANTIAI = MENORCUANTIAI + INGRESO;
        MENORCUANTIAD = MENORCUANTIAD + DEVOLUCION;
        END
    END
if ((MENORCUANTIAI > 0) or (MENORCUANTIAD > 0)) then
    BEGIN
    NIT = '222222222';
    razonsocial = 'CUANTIAS MENORES';
    NOMBRE1 = '';
    NOMBRE2 = '';
    APELLIDO1 = '';
    APELLIDO2 = '';
    DV = '';
    TIPODOC = 13;
    ITEM = ITEM + 1;
    insert into medios_magneticos_datos (memg_formato, memg_ano, memg_item, memg_concepto, memg_tipodoc, memg_nit, memg_dv,memg_apellido1, memg_apellido2,
        memg_nombre1, memg_nombre2, memg_razonsocial, memg_pago, memg_retencion)
        values (1007, substr(:inicio,1,4), :item,  :concepto, :tipodoc, :nit, :dv, :apellido1, :apellido2,
        :nombre1, :nombre2, :razonsocial, :menorcuantiai, :menorcuantiad);
    END
/* INGRESOS FINANCIEROS*/
MENORCUANTIAI = 0;
MENORCUANTIAD = 0;
select COME_RESPUESTA, COME_MINIMO FROM configura_mediosmag WHERE COME_ITEM = 53 INTO :CONCEPTO, :MINIMO;
FOR SELECT MAX(D.TERC_NIT), SUM(CODE_CREDITO), SUM(CODE_DEBITO)
    FROM COMPROBANTE_DETALLE D, COMPROBANTE_ENCABEZADO E, mediosmag_cuentas M
    WHERE M.mmcu_item = 53 AND SUBSTR(CUEN_COD,1,STRLEN(M.mmcu_cuenta)) = M.mmcu_cuenta AND
    E.ENCO_CONSEC = D.ENCO_CONSEC AND ENCO_FECHA >= :INICIO AND ENCO_FECHA <= :FINAL AND
    ((CODE_CREDITO <> 0) or (CODE_DEBITO <> 0))
    GROUP BY D.TERC_NIT
    INTO :NIT, :ingreso,  :devolucion
    DO
    BEGIN
    SELECT SUM(CODE_CREDITO-CODE_DEBITO) FROM comprobante_detalle WHERE TERC_NIT = :NIT AND
        SUBSTR(CUEN_COD,1,1) = '4' INTO TOTALTERC;
    if (INGRESO IS NULL) then
        INGRESO = 0;
    if (DEVOLUCION IS NULL) then
        DEVOLUCION = 0;
    if ((TOTALTERC >= MINIMO) AND ((INGRESO > 0) or (DEVOLUCION > 0))) then
        BEGIN
        SELECT TERC_NOM, TERC_NOMBRE1, TERC_NOMBRE2, TERC_APELLIDO1, TERC_APELLIDO2, TERC_DV, TIID_CODIGO
            FROM TERCEROS T left outer join TIPO_ID IT on (T.TERC_TIPOID = IT.TIID_COD) WHERE TERC_NIT = :NIT
            INTO :RAZONSOCIAL, :NOMBRE1, :NOMBRE2, :APELLIDO1, :APELLIDO2, :DV, :TIPODOC;
        ITEM = ITEM + 1;
        insert into medios_magneticos_datos (memg_formato, memg_ano, memg_item, memg_concepto, memg_tipodoc, memg_nit, memg_dv,memg_apellido1, memg_apellido2, 
            memg_nombre1, memg_nombre2, memg_razonsocial, memg_pago, memg_retencion)
            values (1007, substr(:inicio,1,4), :item,  :concepto, :tipodoc, :nit, :dv, :apellido1, :apellido2,
            :nombre1, :nombre2, :razonsocial, :ingreso, :devolucion);
        END
    ELSE
        BEGIN
        MENORCUANTIAI = MENORCUANTIAI + INGRESO;
        MENORCUANTIAD = MENORCUANTIAD + DEVOLUCION;
        END
    END
if ((MENORCUANTIAI > 0) or (MENORCUANTIAD > 0)) then
    BEGIN
    NIT = '222222222';
    razonsocial = 'CUANTIAS MENORES';
    NOMBRE1 = '';
    NOMBRE2 = '';
    APELLIDO1 = '';
    APELLIDO2 = '';
    DV = '';
    TIPODOC = 13;
    ITEM = ITEM + 1;
    insert into medios_magneticos_datos (memg_formato, memg_ano, memg_item, memg_concepto, memg_tipodoc, memg_nit, memg_dv,memg_apellido1, memg_apellido2,
        memg_nombre1, memg_nombre2, memg_razonsocial, memg_pago, memg_retencion)
        values (1007, substr(:inicio,1,4), :item,  :concepto, :tipodoc, :nit, :dv, :apellido1, :apellido2,
        :nombre1, :nombre2, :razonsocial, :menorcuantiai, :menorcuantiad);
    END
end;

SET TERM ^ ;

CREATE OR ALTER PROCEDURE MM_1003(
    INICIO CHAR(8),
    FINAL CHAR(8))
AS
declare variable CONCEPTO INTEGER;
declare variable TIPODOC INTEGER;
declare variable NIT VARCHAR(15) CHARACTER SET NONE;
declare variable DV CHAR(1) CHARACTER SET NONE;
declare variable APELLIDO1 VARCHAR(60) CHARACTER SET NONE;
declare variable APELLIDO2 VARCHAR(60) CHARACTER SET NONE;
declare variable NOMBRE1 VARCHAR(60) CHARACTER SET NONE;
declare variable NOMBRE2 VARCHAR(60) CHARACTER SET NONE;
declare variable RAZONSOCIAL VARCHAR(450) CHARACTER SET NONE;
declare variable DIRECCION VARCHAR(200) CHARACTER SET NONE;
declare variable DEPARTAMENTO CHAR(2) CHARACTER SET NONE;
declare variable MUNICIPIO CHAR(3) CHARACTER SET NONE;
declare variable RETENCION NUMERIC(18,0);
declare variable ITEM INTEGER;
begin
ITEM = 0;
/* RETENCIONES SALARIOS */
select COME_RESPUESTA FROM configura_mediosmag WHERE COME_ITEM = 41 INTO :CONCEPTO;
FOR SELECT MAX(D.TERC_NIT), SUM(CODE_DEBITO-CODE_CREDITO)
    FROM COMPROBANTE_DETALLE D, COMPROBANTE_ENCABEZADO E, mediosmag_cuentas M
    WHERE M.mmcu_item = 41 AND SUBSTR(CUEN_COD,1,STRLEN(M.mmcu_cuenta)) = M.mmcu_cuenta AND
    E.ENCO_CONSEC = D.ENCO_CONSEC AND ENCO_FECHA >= :INICIO AND ENCO_FECHA <= :FINAL AND
    ((CODE_CREDITO <> 0) or (CODE_DEBITO <> 0))
    GROUP BY D.TERC_NIT
    INTO :NIT, :RETENCION
    DO
    BEGIN
    if (RETENCION > 0) then
        BEGIN
        SELECT TERC_NOM, TERC_NOMBRE1, TERC_NOMBRE2, TERC_APELLIDO1, TERC_APELLIDO2, TERC_DV, TIID_CODIGO,
            TERC_DIR, SUBSTR(CIUD_COD,1,2), SUBSTR(CIUD_COD,3,5)
            FROM TERCEROS T left outer join TIPO_ID IT on (T.TERC_TIPOID = IT.TIID_COD) WHERE TERC_NIT = :NIT
            INTO :RAZONSOCIAL, :NOMBRE1, :NOMBRE2, :APELLIDO1, :APELLIDO2, :DV, :TIPODOC, :DIRECCION, :DEPARTAMENTO, :MUNICIPIO;
        ITEM = ITEM + 1;
        insert into medios_magneticos_datos (memg_formato, memg_ano, memg_item, memg_concepto, memg_tipodoc, memg_nit, memg_dv,memg_apellido1, memg_apellido2, 
            memg_nombre1, memg_nombre2, memg_razonsocial, memg_direccion, memg_departamento, memg_municipio, memg_pago)
            values (1003, substr(:inicio,1,4), :item,  :concepto, :tipodoc, :nit, :dv, :apellido1, :apellido2,
            :nombre1, :nombre2, :razonsocial, :direccion, :departamento, :municipio, :retencion);
        END
    END
/* RETENCIONES VENTAS */
select COME_RESPUESTA FROM configura_mediosmag WHERE COME_ITEM = 42 INTO :CONCEPTO;
FOR SELECT MAX(D.TERC_NIT), SUM(CODE_DEBITO-CODE_CREDITO)
    FROM COMPROBANTE_DETALLE D, COMPROBANTE_ENCABEZADO E, mediosmag_cuentas M
    WHERE M.mmcu_item = 42 AND SUBSTR(CUEN_COD,1,STRLEN(M.mmcu_cuenta)) = M.mmcu_cuenta AND
    E.ENCO_CONSEC = D.ENCO_CONSEC AND ENCO_FECHA >= :INICIO AND ENCO_FECHA <= :FINAL AND
    ((CODE_CREDITO <> 0) or (CODE_DEBITO <> 0))
    GROUP BY D.TERC_NIT
    INTO :NIT, :RETENCION
    DO
    BEGIN
    if (RETENCION > 0) then
        BEGIN
        SELECT TERC_NOM, TERC_NOMBRE1, TERC_NOMBRE2, TERC_APELLIDO1, TERC_APELLIDO2, TERC_DV, TIID_CODIGO,
            TERC_DIR, SUBSTR(CIUD_COD,1,2), SUBSTR(CIUD_COD,3,5)
            FROM TERCEROS T left outer join TIPO_ID IT on (T.TERC_TIPOID = IT.TIID_COD) WHERE TERC_NIT = :NIT
            INTO :RAZONSOCIAL, :NOMBRE1, :NOMBRE2, :APELLIDO1, :APELLIDO2, :DV, :TIPODOC, :DIRECCION, :DEPARTAMENTO, :MUNICIPIO;
        ITEM = ITEM + 1;
        insert into medios_magneticos_datos (memg_formato, memg_ano, memg_item, memg_concepto, memg_tipodoc, memg_nit, memg_dv,memg_apellido1, memg_apellido2, 
            memg_nombre1, memg_nombre2, memg_razonsocial, memg_direccion, memg_departamento, memg_municipio, memg_pago)
            values (1003, substr(:inicio,1,4), :item,  :concepto, :tipodoc, :nit, :dv, :apellido1, :apellido2,
            :nombre1, :nombre2, :razonsocial, :direccion, :departamento, :municipio, :retencion);
        END
    END
/* RETENCIONES SERVICIOS */
select COME_RESPUESTA FROM configura_mediosmag WHERE COME_ITEM = 43 INTO :CONCEPTO;
FOR SELECT MAX(D.TERC_NIT), SUM(CODE_DEBITO-CODE_CREDITO)
    FROM COMPROBANTE_DETALLE D, COMPROBANTE_ENCABEZADO E, mediosmag_cuentas M
    WHERE M.mmcu_item = 43 AND SUBSTR(CUEN_COD,1,STRLEN(M.mmcu_cuenta)) = M.mmcu_cuenta AND
    E.ENCO_CONSEC = D.ENCO_CONSEC AND ENCO_FECHA >= :INICIO AND ENCO_FECHA <= :FINAL AND
    ((CODE_CREDITO <> 0) or (CODE_DEBITO <> 0))
    GROUP BY D.TERC_NIT
    INTO :NIT, :RETENCION
    DO
    BEGIN
    if (RETENCION > 0) then
        BEGIN
        SELECT TERC_NOM, TERC_NOMBRE1, TERC_NOMBRE2, TERC_APELLIDO1, TERC_APELLIDO2, TERC_DV, TIID_CODIGO,
            TERC_DIR, SUBSTR(CIUD_COD,1,2), SUBSTR(CIUD_COD,3,5)
            FROM TERCEROS T left outer join TIPO_ID IT on (T.TERC_TIPOID = IT.TIID_COD) WHERE TERC_NIT = :NIT
            INTO :RAZONSOCIAL, :NOMBRE1, :NOMBRE2, :APELLIDO1, :APELLIDO2, :DV, :TIPODOC, :DIRECCION, :DEPARTAMENTO, :MUNICIPIO;
        ITEM = ITEM + 1;
        insert into medios_magneticos_datos (memg_formato, memg_ano, memg_item, memg_concepto, memg_tipodoc, memg_nit, memg_dv,memg_apellido1, memg_apellido2, 
            memg_nombre1, memg_nombre2, memg_razonsocial, memg_direccion, memg_departamento, memg_municipio, memg_pago)
            values (1003, substr(:inicio,1,4), :item,  :concepto, :tipodoc, :nit, :dv, :apellido1, :apellido2,
            :nombre1, :nombre2, :razonsocial, :direccion, :departamento, :municipio, :retencion);
        END
    END
/* RETENCIONES HONORARIOS */
select COME_RESPUESTA FROM configura_mediosmag WHERE COME_ITEM = 44 INTO :CONCEPTO;
FOR SELECT MAX(D.TERC_NIT), SUM(CODE_DEBITO-CODE_CREDITO)
    FROM COMPROBANTE_DETALLE D, COMPROBANTE_ENCABEZADO E, mediosmag_cuentas M
    WHERE M.mmcu_item = 44 AND SUBSTR(CUEN_COD,1,STRLEN(M.mmcu_cuenta)) = M.mmcu_cuenta AND
    E.ENCO_CONSEC = D.ENCO_CONSEC AND ENCO_FECHA >= :INICIO AND ENCO_FECHA <= :FINAL AND
    ((CODE_CREDITO <> 0) or (CODE_DEBITO <> 0))
    GROUP BY D.TERC_NIT
    INTO :NIT, :RETENCION
    DO
    BEGIN
    if (RETENCION > 0) then
        BEGIN
        SELECT TERC_NOM, TERC_NOMBRE1, TERC_NOMBRE2, TERC_APELLIDO1, TERC_APELLIDO2, TERC_DV, TIID_CODIGO,
            TERC_DIR, SUBSTR(CIUD_COD,1,2), SUBSTR(CIUD_COD,3,5)
            FROM TERCEROS T left outer join TIPO_ID IT on (T.TERC_TIPOID = IT.TIID_COD) WHERE TERC_NIT = :NIT
            INTO :RAZONSOCIAL, :NOMBRE1, :NOMBRE2, :APELLIDO1, :APELLIDO2, :DV, :TIPODOC, :DIRECCION, :DEPARTAMENTO, :MUNICIPIO;
        ITEM = ITEM + 1;
        insert into medios_magneticos_datos (memg_formato, memg_ano, memg_item, memg_concepto, memg_tipodoc, memg_nit, memg_dv,memg_apellido1, memg_apellido2, 
            memg_nombre1, memg_nombre2, memg_razonsocial, memg_direccion, memg_departamento, memg_municipio, memg_pago)
            values (1003, substr(:inicio,1,4), :item,  :concepto, :tipodoc, :nit, :dv, :apellido1, :apellido2,
            :nombre1, :nombre2, :razonsocial, :direccion, :departamento, :municipio, :retencion);
        END
    END
/* RETENCIONES COMISIONES */
select COME_RESPUESTA FROM configura_mediosmag WHERE COME_ITEM = 45 INTO :CONCEPTO;
FOR SELECT MAX(D.TERC_NIT), SUM(CODE_DEBITO-CODE_CREDITO)
    FROM COMPROBANTE_DETALLE D, COMPROBANTE_ENCABEZADO E, mediosmag_cuentas M
    WHERE M.mmcu_item = 45 AND SUBSTR(CUEN_COD,1,STRLEN(M.mmcu_cuenta)) = M.mmcu_cuenta AND
    E.ENCO_CONSEC = D.ENCO_CONSEC AND ENCO_FECHA >= :INICIO AND ENCO_FECHA <= :FINAL AND
    ((CODE_CREDITO <> 0) or (CODE_DEBITO <> 0))
    GROUP BY D.TERC_NIT
    INTO :NIT, :RETENCION
    DO
    BEGIN
    if (RETENCION > 0) then
        BEGIN
        SELECT TERC_NOM, TERC_NOMBRE1, TERC_NOMBRE2, TERC_APELLIDO1, TERC_APELLIDO2, TERC_DV, TIID_CODIGO,
            TERC_DIR, SUBSTR(CIUD_COD,1,2), SUBSTR(CIUD_COD,3,5)
            FROM TERCEROS T left outer join TIPO_ID IT on (T.TERC_TIPOID = IT.TIID_COD) WHERE TERC_NIT = :NIT
            INTO :RAZONSOCIAL, :NOMBRE1, :NOMBRE2, :APELLIDO1, :APELLIDO2, :DV, :TIPODOC, :DIRECCION, :DEPARTAMENTO, :MUNICIPIO;
        ITEM = ITEM + 1;
        insert into medios_magneticos_datos (memg_formato, memg_ano, memg_item, memg_concepto, memg_tipodoc, memg_nit, memg_dv,memg_apellido1, memg_apellido2, 
            memg_nombre1, memg_nombre2, memg_razonsocial, memg_direccion, memg_departamento, memg_municipio, memg_pago)
            values (1003, substr(:inicio,1,4), :item,  :concepto, :tipodoc, :nit, :dv, :apellido1, :apellido2,
            :nombre1, :nombre2, :razonsocial, :direccion, :departamento, :municipio, :retencion);
        END
    END
/* RETENCIONES RENDIMIENTOS */
select COME_RESPUESTA FROM configura_mediosmag WHERE COME_ITEM = 46 INTO :CONCEPTO;
FOR SELECT MAX(D.TERC_NIT), SUM(CODE_DEBITO-CODE_CREDITO)
    FROM COMPROBANTE_DETALLE D, COMPROBANTE_ENCABEZADO E, mediosmag_cuentas M
    WHERE M.mmcu_item = 46 AND SUBSTR(CUEN_COD,1,STRLEN(M.mmcu_cuenta)) = M.mmcu_cuenta AND
    E.ENCO_CONSEC = D.ENCO_CONSEC AND ENCO_FECHA >= :INICIO AND ENCO_FECHA <= :FINAL AND
    ((CODE_CREDITO <> 0) or (CODE_DEBITO <> 0))
    GROUP BY D.TERC_NIT
    INTO :NIT, :RETENCION
    DO
    BEGIN
    if (RETENCION > 0) then
        BEGIN
        SELECT TERC_NOM, TERC_NOMBRE1, TERC_NOMBRE2, TERC_APELLIDO1, TERC_APELLIDO2, TERC_DV, TIID_CODIGO,
            TERC_DIR, SUBSTR(CIUD_COD,1,2), SUBSTR(CIUD_COD,3,5)
            FROM TERCEROS T left outer join TIPO_ID IT on (T.TERC_TIPOID = IT.TIID_COD) WHERE TERC_NIT = :NIT
            INTO :RAZONSOCIAL, :NOMBRE1, :NOMBRE2, :APELLIDO1, :APELLIDO2, :DV, :TIPODOC, :DIRECCION, :DEPARTAMENTO, :MUNICIPIO;
        ITEM = ITEM + 1;
        insert into medios_magneticos_datos (memg_formato, memg_ano, memg_item, memg_concepto, memg_tipodoc, memg_nit, memg_dv,memg_apellido1, memg_apellido2, 
            memg_nombre1, memg_nombre2, memg_razonsocial, memg_direccion, memg_departamento, memg_municipio, memg_pago)
            values (1003, substr(:inicio,1,4), :item,  :concepto, :tipodoc, :nit, :dv, :apellido1, :apellido2,
            :nombre1, :nombre2, :razonsocial, :direccion, :departamento, :municipio, :retencion);
        END
    END
/* RETENCIONES ARRIENDOS */
select COME_RESPUESTA FROM configura_mediosmag WHERE COME_ITEM = 47 INTO :CONCEPTO;
FOR SELECT MAX(D.TERC_NIT), SUM(CODE_DEBITO-CODE_CREDITO)
    FROM COMPROBANTE_DETALLE D, COMPROBANTE_ENCABEZADO E, mediosmag_cuentas M
    WHERE M.mmcu_item = 47 AND SUBSTR(CUEN_COD,1,STRLEN(M.mmcu_cuenta)) = M.mmcu_cuenta AND
    E.ENCO_CONSEC = D.ENCO_CONSEC AND ENCO_FECHA >= :INICIO AND ENCO_FECHA <= :FINAL AND
    ((CODE_CREDITO <> 0) or (CODE_DEBITO <> 0))
    GROUP BY D.TERC_NIT
    INTO :NIT, :RETENCION
    DO
    BEGIN
    if (RETENCION > 0) then
        BEGIN
        SELECT TERC_NOM, TERC_NOMBRE1, TERC_NOMBRE2, TERC_APELLIDO1, TERC_APELLIDO2, TERC_DV, TIID_CODIGO,
            TERC_DIR, SUBSTR(CIUD_COD,1,2), SUBSTR(CIUD_COD,3,5)
            FROM TERCEROS T left outer join TIPO_ID IT on (T.TERC_TIPOID = IT.TIID_COD) WHERE TERC_NIT = :NIT
            INTO :RAZONSOCIAL, :NOMBRE1, :NOMBRE2, :APELLIDO1, :APELLIDO2, :DV, :TIPODOC, :DIRECCION, :DEPARTAMENTO, :MUNICIPIO;
        ITEM = ITEM + 1;
        insert into medios_magneticos_datos (memg_formato, memg_ano, memg_item, memg_concepto, memg_tipodoc, memg_nit, memg_dv,memg_apellido1, memg_apellido2, 
            memg_nombre1, memg_nombre2, memg_razonsocial, memg_direccion, memg_departamento, memg_municipio, memg_pago)
            values (1003, substr(:inicio,1,4), :item,  :concepto, :tipodoc, :nit, :dv, :apellido1, :apellido2,
            :nombre1, :nombre2, :razonsocial, :direccion, :departamento, :municipio, :retencion);
        END
    END
/* RETENCIONES OTRAS */
select COME_RESPUESTA FROM configura_mediosmag WHERE COME_ITEM = 48 INTO :CONCEPTO;
FOR SELECT MAX(D.TERC_NIT), SUM(CODE_DEBITO-CODE_CREDITO)
    FROM COMPROBANTE_DETALLE D, COMPROBANTE_ENCABEZADO E, mediosmag_cuentas M
    WHERE M.mmcu_item = 48 AND SUBSTR(CUEN_COD,1,STRLEN(M.mmcu_cuenta)) = M.mmcu_cuenta AND
    E.ENCO_CONSEC = D.ENCO_CONSEC AND ENCO_FECHA >= :INICIO AND ENCO_FECHA <= :FINAL AND
    ((CODE_CREDITO <> 0) or (CODE_DEBITO <> 0))
    GROUP BY D.TERC_NIT
    INTO :NIT, :RETENCION
    DO
    BEGIN
    if (RETENCION > 0) then
        BEGIN
        SELECT TERC_NOM, TERC_NOMBRE1, TERC_NOMBRE2, TERC_APELLIDO1, TERC_APELLIDO2, TERC_DV, TIID_CODIGO,
            TERC_DIR, SUBSTR(CIUD_COD,1,2), SUBSTR(CIUD_COD,3,5)
            FROM TERCEROS T left outer join TIPO_ID IT on (T.TERC_TIPOID = IT.TIID_COD) WHERE TERC_NIT = :NIT
            INTO :RAZONSOCIAL, :NOMBRE1, :NOMBRE2, :APELLIDO1, :APELLIDO2, :DV, :TIPODOC, :DIRECCION, :DEPARTAMENTO, :MUNICIPIO;
        ITEM = ITEM + 1;
        insert into medios_magneticos_datos (memg_formato, memg_ano, memg_item, memg_concepto, memg_tipodoc, memg_nit, memg_dv,memg_apellido1, memg_apellido2, 
            memg_nombre1, memg_nombre2, memg_razonsocial, memg_direccion, memg_departamento, memg_municipio, memg_pago)
            values (1003, substr(:inicio,1,4), :item,  :concepto, :tipodoc, :nit, :dv, :apellido1, :apellido2,
            :nombre1, :nombre2, :razonsocial, :direccion, :departamento, :municipio, :retencion);
        END
    END
/* RETENCIONES DE IVA */
select COME_RESPUESTA FROM configura_mediosmag WHERE COME_ITEM = 49 INTO :CONCEPTO;
FOR SELECT MAX(D.TERC_NIT), SUM(CODE_DEBITO-CODE_CREDITO)
    FROM COMPROBANTE_DETALLE D, COMPROBANTE_ENCABEZADO E, mediosmag_cuentas M
    WHERE M.mmcu_item = 49 AND SUBSTR(CUEN_COD,1,STRLEN(M.mmcu_cuenta)) = M.mmcu_cuenta AND
    E.ENCO_CONSEC = D.ENCO_CONSEC AND ENCO_FECHA >= :INICIO AND ENCO_FECHA <= :FINAL AND
    ((CODE_CREDITO <> 0) or (CODE_DEBITO <> 0))
    GROUP BY D.TERC_NIT
    INTO :NIT, :RETENCION
    DO
    BEGIN
    if (RETENCION > 0) then
        BEGIN
        SELECT TERC_NOM, TERC_NOMBRE1, TERC_NOMBRE2, TERC_APELLIDO1, TERC_APELLIDO2, TERC_DV, TIID_CODIGO,
            TERC_DIR, SUBSTR(CIUD_COD,1,2), SUBSTR(CIUD_COD,3,5)
            FROM TERCEROS T left outer join TIPO_ID IT on (T.TERC_TIPOID = IT.TIID_COD) WHERE TERC_NIT = :NIT
            INTO :RAZONSOCIAL, :NOMBRE1, :NOMBRE2, :APELLIDO1, :APELLIDO2, :DV, :TIPODOC, :DIRECCION, :DEPARTAMENTO, :MUNICIPIO;
        ITEM = ITEM + 1;
        insert into medios_magneticos_datos (memg_formato, memg_ano, memg_item, memg_concepto, memg_tipodoc, memg_nit, memg_dv,memg_apellido1, memg_apellido2, 
            memg_nombre1, memg_nombre2, memg_razonsocial, memg_direccion, memg_departamento, memg_municipio, memg_pago)
            values (1003, substr(:inicio,1,4), :item,  :concepto, :tipodoc, :nit, :dv, :apellido1, :apellido2,
            :nombre1, :nombre2, :razonsocial, :direccion, :departamento, :municipio, :retencion);
        END
    END
end
^

SET TERM ; ^


/* 20080303C : CONSOLIDACION DE CODIGOS DE ARTICULOS */

SET TERM ^ ;

CREATE OR ALTER PROCEDURE CONSOLIDA_ARTICULOS(
    ARTICULOV VARCHAR(20),
    ARTICULON VARCHAR(20))
RETURNS (
    TIPO INTEGER,
    ID INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE)
AS
begin
FOR SELECT MVAR_TIPODOC, MVAR_IDREF, MVAR_FECHA, MVAR_pref, mvar_numero from movimiento_articulo
    where arti_cod = :articulov order by mvar_fecha
    into :tipo, :id, :fecha, :pref, :numero
    do
    begin
    if (tipo = 11) then
        update entradas_detalle set arti_cod = :articulon, ende_codbar = :articulon where entr_id = :id and arti_cod = :articulov;
    if (tipo = 12) then
        update salidas_detalle set arti_cod = :articulon, sade_codbar = :articulon where sali_id = :id and arti_cod = :articulov;
    if (tipo = 13) then
        update trasferencias_detalle set arti_cod = :articulon, tras_codbar = :articulon where tran_id = :id and arti_cod = :articulov;
    if (tipo = 14) then
        update ajustes_detalle set arti_cod = :articulon, ajus_codbar = :articulon where ajus_id = :id and arti_cod = :articulov;
    if (tipo = 15) then
        begin
        update ensambles set arti_cod = :articulon, ensa_codbar = :articulon where ensa_id = :id and arti_cod = :articulov;
        update ensambles_detalle set arti_cod = :articulon, esde_codbar = :articulon where ensa_id = :id and arti_cod = :articulov;
        end
    if (tipo = 16) then
        begin
        update desensambles set arti_cod = :articulon, dese_codbar = :articulon where dese_id = :id and arti_cod = :articulov;
        update desensambles_detalle set arti_cod = :articulon, dede_codbar = :articulon where dese_id = :id and arti_cod = :articulov;
        end
    if (tipo = 17) then
        update reservas_detalle set arti_cod = :articulon, rsde_codbar = :articulon where rese_id = :id and arti_cod = :articulov;
    if (tipo = 18) then
        update ordeninventario_detalle set arti_cod = :articulon, orid_codbar = :articulon where orin_id = :id and arti_cod = :articulov;
    if (tipo = 21) then
        update facturas_compras_detalle set arti_cod = :articulon, fcde_codbar = :articulon where faco_id = :id and arti_cod = :articulov;
    if (tipo = 22) then
        update remision_proveedor_det set arti_cod = :articulon, rpvd_codbar = :articulon where repr_id = :id and arti_cod = :articulov;
    if (tipo = 24) then
        update devoluciones_compras_det set arti_cod = :articulon, dvcd_codbar = :articulon where dvco_id = :id and arti_cod = :articulov;
    if (tipo = 31) then
        update facturas_detalle set arti_cod = :articulon, fade_codbar = :articulon where fact_id = :id and arti_cod = :articulov;
    if (tipo = 32) then
        update remisiones_venta_detalle set arti_cod = :articulon, rvde_codbar = :articulon where revt_id = :id and arti_cod = :articulov;
    if (tipo = 33) then
        update devoluciones_compras_det set arti_cod = :articulon, dvcd_codbar = :articulon where dvco_id = :id and arti_cod = :articulov;
    if (tipo = 51) then
        update notas_debito_proveedor set arti_cod = :articulon where ndpr_id = :id and arti_cod = :articulov;
    if (tipo = 52) then
        update notas_credito_proveedor set arti_cod = :articulon where ncpr_id = :id and arti_cod = :articulov;
    suspend;
    end
/* por si estan desactivados los triggers */
update movimiento_articulo set arti_cod = :articulon where arti_cod = :articulov;
end
^

SET TERM ; ^



/* 20090304 : consolidado imprimie los que estan en cero */
SET TERM ^ ;

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

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

SET TERM ; ^



/* 20090305 : BASE DEL RUTERO */
SET TERM ^ ;

CREATE OR ALTER PROCEDURE IMPR_RUTERO(
    ID INTEGER)
RETURNS (
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    NOMRUTA VARCHAR(60),
    RUTA INTEGER,
    CONDUCTOR VARCHAR(20),
    NOMCOND VARCHAR(60),
    AUXILIAR1 VARCHAR(20),
    NOMAUX1 VARCHAR(60),
    AUXILIAR2 VARCHAR(20),
    NOMAUX2 VARCHAR(60),
    VEHICULO VARCHAR(8),
    ASEGURA VARCHAR(60),
    NITASEGURA VARCHAR(20),
    HORASAL TIME,
    TOTALVR NUMERIC(18,2),
    TOTALCAJAS NUMERIC(18,2),
    OBS BLOB SUB_TYPE 1 SEGMENT SIZE 80,
    ITEMDOC INTEGER,
    PREFDOC VARCHAR(4),
    NUMDOC VARCHAR(6),
    NITCLIEN VARCHAR(20),
    SUCURSAL VARCHAR(10),
    NOMCLIEN VARCHAR(60),
    DIRCLIEN VARCHAR(60),
    TELCLIEN VARCHAR(40),
    VEND INTEGER,
    NOMVEND VARCHAR(60),
    ZONA VARCHAR(2),
    NOMZONA VARCHAR(60),
    MONTO NUMERIC(18,2),
    BASE NUMERIC(18,2),
    CAJAS NUMERIC(18,2))
AS
declare variable IDDOC INTEGER;
BEGIN
  SELECT PREF_PRE, RUTE_NUMERO, RUTE_FECHA, RUTE_VEHICULO, RUTE_RUTA, E.ruta_nom,
        RUTE_CONDUCTOR, RUTE_NOMCOND, RUTE_ASEGURA, RUTE_HORA, RUTE_AUXILIAR1, RUTE_AUXILIAR2
  FROM rutero R, rutas_entrega E
  WHERE R.rute_ruta = E.ruta_id AND R.rute_id = :ID
  INTO :PREFIJO, :NUMERO, :FECHA, :vehiculo, :ruta, :nomruta,
        :conductor, :nomcond, :nitasegura, :horasal, :auxiliar1, :auxiliar2;
  SELECT TERC_NOM FROM TERCEROS WHERE TERC_NIT = :auxiliar1 INTO :nomaux1;
  SELECT TERC_NOM FROM TERCEROS WHERE TERC_NIT = :auxiliar2 INTO :nomaux2;
  SELECT ASEG_NOMBRE FROM aseguradora WHERE ASEG_NIT = :nitasegura INTO :asegura;
  totalvr = 0;
  totalcajas = 0;
  FOR SELECT RUTD_ITEM, RUTD_FACTID, RUTD_PREF, RUTD_NUMERO, RUTD_NIT, RUTD_NOMCLI,
        RUTD_VALOR, RUTD_CAJAS, RUTD_OBS
        FROM rutero_detalle WHERE RUTE_ID = :ID ORDER BY RUTD_ITEM
        INTO :ITEMDOC, :IDDOC, :PREFDOC, :NUMDOC, :nitclien, :nomclien, :monto, :cajas, :obs
        DO
        BEGIN
        SELECT FACT_SUCURSAL, VEND_COD, FACT_TOTAL-FACT_IVAMONTO FROM FACTURAS
            WHERE FACT_ID = :iddoc INTO :sucursal, :vend, :BASE;
        SELECT CLSU_DIR, CLSU_TEL, ZONA_COD FROM cliente_sucursales WHERE TERC_NIT = :nitclien AND CLCU_COD = :sucursal
            INTO :dirclien, :telclien, :zona;
        SELECT VEND_NOMBRE FROM vendedores WHERE VEND_COD = :vend INTO :nomvend;
        SELECT ZONA_NOM FROM ZONAS WHERE ZONA_COD = :zona INTO :nomzona;
        totalvr = totalvr + :MONTO;
        totalcajas = totalcajas + :cajas;
        SUSPEND;
        END
END
^

SET TERM ; ^


/* 30090306 : COMISIONES POR DOCUMENTO CONSOLIDADAS */
SET TERM ^ ;

CREATE OR ALTER PROCEDURE COMISIONES_DOCUMENTO(
    DESDE VARCHAR(10),
    HASTA VARCHAR(10),
    FECINI DATE,
    FECFIN DATE,
    AGENCIA INTEGER,
    DETALLE CHAR(1))
RETURNS (
    CODVEND INTEGER,
    NOMVEND VARCHAR(60),
    NOMTIPO VARCHAR(8),
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(6),
    FECDOC DATE,
    CLIENTE VARCHAR(60),
    BASE NUMERIC(18,2),
    COMIMONTO NUMERIC(18,2),
    COMIPORC NUMERIC(9,2),
    BASEFV NUMERIC(18,2),
    COMIMONTOFV NUMERIC(18,2),
    BASEDV NUMERIC(18,2),
    COMIMONTODV NUMERIC(18,2),
    PEDIDO VARCHAR(30))
AS
declare variable IVAMONTO NUMERIC(18,2);
declare variable EXTRA NUMERIC(18,2);
declare variable TOTAL NUMERIC(18,2);
declare variable SITOT CHAR(2);
declare variable IDFACT INTEGER;
declare variable CONSUMO NUMERIC(18,2);
declare variable BASEAUX NUMERIC(18,2);
declare variable COMIAUX NUMERIC(18,2);
BEGIN
EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION', 'VENDEDORES', 'COMISIONES EN VENTA INCLUYENDO IMPUESTOS') returning_values (:SITOT);
FOR select VEND_COD, VEND_NOMBRE
    from VENDEDORES
    where VEND_COD >= :DESDE AND VEND_COD <= :HASTA AND ((:AGENCIA = 0) or (SUCU_ID = :AGENCIA))
    INTO :CODVEND, :NOMVEND
    DO  
    BEGIN
    if (DETALLE = 'S') then
        BEGIN
        SELECT TIDO_NOMCORTO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 31 INTO :NOMTIPO;
        FOR SELECT MAX(PREF_PRE), MAX(FACT_NUMERO), MAX(FACT_FECHA), MAX(FACT_NOMCLIENTE), MAX(FACT_TOTAL), MAX(FACT_EXTRA), MAX(FACT_IVAMONTO), MAX(FACT_COMIPORC), MAX(FACT_COMIMONTO), MAX(FACT_PEDIDO), SUM(FADE_CONSUMO)
            FROM FACTURAS f, facturas_detalle d WHERE F.FACT_ID = D.FACT_ID AND VEND_COD = :CODVEND AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND FACT_ANULADO = 'N'
            GROUP BY F.FACT_ID
            INTO :PREFIJO, :NUMERO, :FECDOC, :CLIENTE, :TOTAL, :EXTRA, :IVAMONTO, :COMIPORC, :COMIMONTO, :PEDIDO, :CONSUMO
            DO
            BEGIN
            if (COMIPORC <> 0) then
                BEGIN
                BASE = :comimonto * 100 / :comiporc;
                EXECUTE PROCEDURE redondee(:BASE, 0) returning_values (:BASE);
                END
            ELSE
                if (SITOT = 'SI') then
                    BASE = TOTAL;
                ELSE
                    BASE = TOTAL - EXTRA - IVAMONTO - CONSUMO;
            SUSPEND;
            END
        SELECT TIDO_NOMCORTO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 33 INTO :NOMTIPO;
        FOR SELECT MAX(PREF_PRE), MAX(DEVT_NUMERO), MAX(DEVT_FECHA), MAX(DEVT_NOMTERC), MAX(DEVT_IVAMONTO), MAX(DEVT_EXTRA), MAX(DEVT_TOTAL), MAX(DEVT_COMIPORC), MAX(DEVT_COMIMONTO), MAX(DEVT_FACTID), SUM(DVDE_CONSUMO)
            FROM DEVOLUCIONES_VENTAS V, DEVOLUCIONES_VENTAS_DETALLE D WHERE V.DEVT_ID = D.DEVT_ID AND VEND_COD = :CODVEND AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND DEVT_ANULADO = 'N'
            GROUP BY v.DEVT_ID
            INTO :PREFIJO, :NUMERO, :FECDOC, :CLIENTE, :IVAMONTO, :EXTRA, :TOTAL, :COMIPORC, :COMIMONTO, :IDFACT, :CONSUMO
            DO
            BEGIN
            SELECT FACT_PEDIDO FROM FACTURAS WHERE FACT_ID = :IDFACT INTO :PEDIDO;
            if (COMIPORC <> 0) then
                BEGIN
                BASE = :comimonto * 100 / :comiporc;
                EXECUTE PROCEDURE redondee(:BASE, 0) returning_values (:BASE);
                END
            ELSE
                if (SITOT = 'SI') then
                    BASE = TOTAL;
                ELSE
                    BASE = TOTAL - EXTRA - IVAMONTO - CONSUMO;
            BASE = BASE * -1;
            COMIMONTO = COMIMONTO * -1;
            SUSPEND;
            END
        END
    ELSE
        BEGIN
        BASE = 0;
        comimonto = 0;
        BASEFV = 0;
        comimontofv = 0;
        BASEDV = 0;
        comimontodv = 0;
        FOR SELECT MAX(PREF_PRE), MAX(FACT_NUMERO), MAX(FACT_FECHA), MAX(FACT_NOMCLIENTE), MAX(FACT_TOTAL), MAX(FACT_EXTRA), MAX(FACT_IVAMONTO), MAX(FACT_COMIPORC), MAX(FACT_COMIMONTO), MAX(FACT_PEDIDO), SUM(FADE_CONSUMO)
            FROM FACTURAS f, facturas_detalle d WHERE F.FACT_ID = D.FACT_ID AND VEND_COD = :CODVEND AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND FACT_ANULADO = 'N'
            GROUP BY F.FACT_ID
            INTO :PREFIJO, :NUMERO, :FECDOC, :CLIENTE, :TOTAL, :EXTRA, :IVAMONTO, :COMIPORC, :comiaux, :PEDIDO, :CONSUMO
            DO
            BEGIN
            if (COMIPORC <> 0) then
                BEGIN
                BASEAUX = :comiaux * 100 / :comiporc;
                EXECUTE PROCEDURE redondee(:BASEAUX, 0) returning_values (:BASEAUX);
                basefv = basefv + BASEAUX;
                comimontofv = comimontofv + comiaux;
                END
            ELSE
                BEGIN
                if (SITOT = 'SI') then
                    BASEAUX = TOTAL;
                ELSE
                    BASEAUX = TOTAL - EXTRA - IVAMONTO - CONSUMO;
                basefv = basefv + BASEAUX;
                comimontofv = comimontofv + comiaux;
                END
            END
        SELECT TIDO_NOMCORTO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 33 INTO :NOMTIPO;
        FOR SELECT MAX(PREF_PRE), MAX(DEVT_NUMERO), MAX(DEVT_FECHA), MAX(DEVT_NOMTERC), MAX(DEVT_IVAMONTO), MAX(DEVT_EXTRA), MAX(DEVT_TOTAL), MAX(DEVT_COMIPORC), MAX(DEVT_COMIMONTO), MAX(DEVT_FACTID), SUM(DVDE_CONSUMO)
            FROM DEVOLUCIONES_VENTAS V, DEVOLUCIONES_VENTAS_DETALLE D WHERE V.DEVT_ID = D.DEVT_ID AND VEND_COD = :CODVEND AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND DEVT_ANULADO = 'N'
            GROUP BY v.DEVT_ID
            INTO :PREFIJO, :NUMERO, :FECDOC, :CLIENTE, :IVAMONTO, :EXTRA, :TOTAL, :COMIPORC, :comiaux, :IDFACT, :CONSUMO
            DO
            BEGIN
            SELECT FACT_PEDIDO FROM FACTURAS WHERE FACT_ID = :IDFACT INTO :PEDIDO;
            if (COMIPORC <> 0) then
                BEGIN
                BASEAUX = :comimonto * 100 / :comiporc;
                EXECUTE PROCEDURE redondee(:BASEAUX, 0) returning_values (:BASEAUX);
                BASEDV = BASEDV + BASEAUX;
                comimontodv = comimontodv + comiaux;
                END
            ELSE
                BEGIN
                if (SITOT = 'SI') then
                    baseaux = TOTAL;
                ELSE
                    baseaux = TOTAL - EXTRA - IVAMONTO - CONSUMO;
                BASEDV = BASEDV + BASEAUX;
                comimontodv = comimontodv + comiaux;
                END
            END
        BASE = basefv - basedv;
        COMIMONTO = comimontofv - comimontodv;
        SUSPEND;
        END
    END
END
^

SET TERM ; ^


/* 20090306B : NO DESCONTABA LOS DESCUENTOS NI EL IMPOCONSUMO DE LAS VENTAS */
SET TERM ^ ;

CREATE OR ALTER PROCEDURE UTILIDAD_VENTAS(
    TIPO INTEGER,
    DETALLE CHAR(1),
    FECINI DATE,
    FECFIN DATE,
    PREFIJO VARCHAR(4),
    SUBEMPRESA INTEGER)
RETURNS (
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    PTVTID INTEGER,
    VENDCOD INTEGER,
    NIT VARCHAR(20),
    NOMTERCERO VARCHAR(60),
    ARTICULO VARCHAR(15),
    ARTIDES VARCHAR(60),
    CANT NUMERIC(18,4),
    UNIDAD VARCHAR(8),
    PRECIO NUMERIC(18,2),
    COSTO NUMERIC(18,2),
    UTILIDAD NUMERIC(18,2),
    PORC NUMERIC(9,2))
AS
declare variable IMPTOS CHAR(1);
declare variable ID INTEGER;
declare variable IVA NUMERIC(18,2);
declare variable COSTOT NUMERIC(18,2);
declare variable PRECIOT NUMERIC(18,2);
declare variable UOM VARCHAR(20);
declare variable icoinc char(2);
declare variable consumo NUMERIC(18,2);
declare variable factor NUMERIC(18,4);
BEGIN
EXECUTE PROCEDURE lee_configuracion ('FACTURACION', 'ARTICULOS', 'SUGERIR PRECIOS CON PORCENTAJE DE MARGEN O UTILIDAD') returning_values (:UOM);
EXECUTE PROCEDURE lee_configuracion ('FACTURACION', 'ARTICULOS', 'IMPOCONSUMO INCLUIDO EN EL PRECIO BASE DE VENTA ANTES DE IVA') returning_values (:icoinc);
/* DETERMINE LA TABLA A EXAMINAR */
if (TIPO = 31) then
    BEGIN
    /* FACTURA */
    FOR SELECT FACT_ID, F.PREF_PRE, FACT_NUMERO, FACT_FECHA, PTVT_ID, VEND_COD, TERC_NIT, FACT_NOMCLIENTE, FACT_IVAINC, fact_factor
        FROM FACTURAS F, PREFIJOS P
        WHERE FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND FACT_ANULADO = 'N'
         AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = :TIPO AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
        ORDER BY FACT_FECHA, F.PREF_PRE, FACT_NUMERO
        INTO :ID, :PREF, :NUMERO, :FECHA, :PTVTID, :VENDCOD, :NIT, :NOMTERCERO, :IMPTOS, :factor
        DO
        if ((PREFIJO = '') or (PREFIJO = PREF)) then
          BEGIN
          COSTOT = 0;
          PRECIOT = 0;
          FOR SELECT D.ARTI_COD, SUBSTR(FADE_DESC,1,60), FADE_CANT * FADE_FACTOR, FADE_UNIDAD, (FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO)*:FACTOR, FADE_IVAMONTO, COST_SALP, fade_consumo
            FROM FACTURAS_DETALLE D, MOVIMIENTO_ARTICULO M, COSTOS C
            WHERE FACT_ID = :ID and substring(D.arti_cod from 1 FOR 2) <> '.t' AND D.fact_id = M.mvar_idref AND
                M.mvar_tipodoc = 31 AND M.mvar_item = D.fade_item AND M.mvar_cons = C.cost_idmov
            INTO :ARTICULO, :ARTIDES, :CANT, :UNIDAD, :PRECIO, :IVA, :COSTO, :consumo
            DO
                BEGIN
                UTILIDAD = PRECIO - COSTO;
                if (DETALLE = 'S') then
                    BEGIN
                    if (UOM = 'UTILIDAD') then
                        EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                    else
                        EXECUTE PROCEDURE PORCENTAJE (utilidad,  PRECIO, 'S') returning_values (PORC);
                    SUSPEND;
                    END
                ELSE
                    BEGIN
                    COSTOT = COSTOT + COSTO;
                    PRECIOT = PRECIOT + PRECIO;
                    END
                END
          if (DETALLE <> 'S') then
            BEGIN
            COSTO = COSTOT;
            PRECIO = PRECIOT;
            UTILIDAD = PRECIO - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  PRECIO, 'S') returning_values (PORC);
            SUSPEND;
            END
          END
    END
  if (TIPO = 32) then
    BEGIN
    /* REMISION */
    FOR SELECT REVT_ID, R.PREF_PRE, REVT_NUMERO, REVT_FECHA, PTVT_ID, VEND_COD, TERC_NIT, REVT_NOMTERC, REVT_IVAINC
        FROM REMISIONES_VENTA R, PREFIJOS P
        WHERE REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN AND REVT_ANULADO = 'N'
         AND P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = :TIPO AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
        ORDER BY REVT_FECHA, R.PREF_PRE, REVT_NUMERO
        INTO :ID, :PREF, :NUMERO, :FECHA, :PTVTID, :VENDCOD, :NIT, :NOMTERCERO, :IMPTOS
        DO
        if ((PREFIJO = '') or (PREFIJO = PREF)) then
          BEGIN
          COSTOT = 0;
          PRECIOT = 0;
          FOR SELECT D.ARTI_COD, SUBSTR(RVDE_DESC,1,60), RVDE_CANT * RVDE_FACTOR, RVDE_UNIDAD, (RVDE_TOTAL-RVDE_IVAMONTO-RVDE_CONSUMO), RVDE_IVAMONTO, COST_SALP, rvde_consumo
            FROM REMISIONES_VENTA_DETALLE D, movimiento_articulo m, costos c
            WHERE REVT_ID = :ID and substring(D.arti_cod from 1 FOR 2) <> '.t' AND D.revt_id = M.mvar_idref AND
                M.mvar_tipodoc = 32 AND M.mvar_item = D.rvde_item AND M.mvar_cons = C.cost_idmov
            INTO :ARTICULO, :ARTIDES, :CANT, :UNIDAD, :PRECIO, :IVA, :COSTO, :consumo
            DO
                BEGIN
                if (IMPTOS = 'S') then
                    PRECIO = PRECIO - IVA;
                if (icoinc = 'SI') then
                    PRECIO = PRECIO - consumo;
                UTILIDAD = PRECIO - COSTO;
                if (DETALLE = 'S') then
                    BEGIN
                    if (UOM = 'UTILIDAD') then
                        EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                    else
                        EXECUTE PROCEDURE PORCENTAJE (utilidad,  PRECIO, 'S') returning_values (PORC);
                    SUSPEND;
                    END
                ELSE
                    BEGIN
                    COSTOT = COSTOT + COSTO;
                    PRECIOT = PRECIOT + PRECIO;
                    END
                END
          if (DETALLE <> 'S') then
            BEGIN
            COSTO = COSTOT;
            PRECIO = PRECIOT;
            UTILIDAD = PRECIO - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  PRECIO, 'S') returning_values (PORC);
            SUSPEND;
            END
          END
    END
  if (TIPO = 33) then
    BEGIN
    /* DEVOLUCION */
    FOR SELECT DEVT_ID, D.PREF_PRE, DEVT_NUMERO, DEVT_FECHA, PTVT_ID, VEND_COD, TERC_NIT, DEVT_NOMTERC, DEVT_IVAINC, DEVT_FACTOR
        FROM DEVOLUCIONES_VENTAS D, PREFIJOS P
        WHERE DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND DEVT_ANULADO = 'N'
         AND P.PREF_PRE = D.PREF_PRE AND P.TIDO_COD = :TIPO AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
        ORDER BY DEVT_FECHA, D.PREF_PRE, DEVT_NUMERO
        INTO :ID, :PREF, :NUMERO, :FECHA, :PTVTID, :VENDCOD, :NIT, :NOMTERCERO, :IMPTOS, :FACTOR
        DO
        if ((PREFIJO = '') or (PREFIJO = PREF)) then
          BEGIN
          COSTOT = 0;
          PRECIOT = 0;
          FOR SELECT D.ARTI_COD, SUBSTR(DVDE_DESC,1,60), DVDE_CANT * DVDE_FACTOR, DVDE_UNIDAD, (DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO)*:FACTOR, DVDE_IVAMONTO, COST_ENTP, dvde_consumo
            FROM DEVOLUCIONES_VENTAS_DETALLE D, MOVIMIENTO_ARTICULO M, COSTOS C
            WHERE DEVT_ID = :ID and substring(D.arti_cod from 1 FOR 2) <> '.t' AND D.devt_id = M.mvar_idref AND
                M.mvar_tipodoc = 33 AND M.mvar_item = D.dvde_item AND M.mvar_cons = C.cost_idmov
            INTO :ARTICULO, :ARTIDES, :CANT, :UNIDAD, :PRECIO, :IVA, :COSTO, :consumo
            DO
                BEGIN
                if (IMPTOS = 'S') then
                    PRECIO = PRECIO - IVA;
                if (icoinc = 'SI') then
                    PRECIO = PRECIO - consumo;
                UTILIDAD = PRECIO - COSTO;
                if (DETALLE = 'S') then
                    BEGIN
                    if (UOM = 'UTILIDAD') then
                        EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                    else
                        EXECUTE PROCEDURE PORCENTAJE (utilidad,  PRECIO, 'S') returning_values (PORC);
                    SUSPEND;
                    END
                ELSE
                    BEGIN
                    COSTOT = COSTOT + COSTO;
                    PRECIOT = PRECIOT + PRECIO;
                    END
                END
        if (DETALLE <> 'S') then
            BEGIN
            COSTO = COSTOT;
            PRECIO = PRECIOT;
            UTILIDAD = PRECIO - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  PRECIO, 'S') returning_values (PORC);
            SUSPEND;
            END
        END
    END
  if (TIPO = 34) then
    BEGIN
    /* PEDIDO */
    FOR SELECT PEDI_ID, P.PREF_PRE, PEDI_NUMERO, PEDI_FECHA, PTVT_ID, VEND_COD, TERC_NIT, PEDI_NOMTERC, PEDI_IVAINC, PEDI_FACTOR
        FROM PEDIDOS P, PREFIJOS R
        WHERE PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND PEDI_ANULADO = 'N'
         AND P.PREF_PRE = R.PREF_PRE AND R.TIDO_COD = :TIPO AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
        ORDER BY PEDI_FECHA, P.PREF_PRE, PEDI_NUMERO
        INTO :ID, :PREF, :NUMERO, :FECHA, :PTVTID, :VENDCOD, :NIT, :NOMTERCERO, :IMPTOS, :FACTOR
        DO
        if ((PREFIJO = '') or (PREFIJO = PREF)) then
          BEGIN
          COSTOT = 0;
          PRECIOT = 0;
          FOR SELECT ARTI_COD, SUBSTR(PEDE_DESC,1,60), PEDE_CANT * PEDE_FACTOR, PEDE_UNIDAD, (PEDE_TOTAL-PEDE_IVAMONTO-PEDE_CONSUMO)*:FACTOR, PEDE_IVAMONTO, pede_consumo
            FROM PEDIDOS_DETALLE
            WHERE PEDI_ID = :ID
            INTO :ARTICULO, :ARTIDES, :CANT, :UNIDAD, :PRECIO, :IVA, :consumo
            DO
                BEGIN
                EXECUTE PROCEDURE COSTO_PROMEDIO(:ARTICULO, :FECHA) returning_values (:COSTO);
                COSTO = COSTO * CANT;
                if (IMPTOS = 'S') then
                    PRECIO = PRECIO - IVA;
                if (icoinc = 'SI') then
                    PRECIO = PRECIO - consumo;
                UTILIDAD = PRECIO - COSTO;
                if (DETALLE = 'S') then
                    BEGIN
                    if (UOM = 'UTILIDAD') then
                        EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                    else
                        EXECUTE PROCEDURE PORCENTAJE (utilidad,  PRECIO, 'S') returning_values (PORC);
                    SUSPEND;
                    END
                ELSE
                    BEGIN
                    COSTOT = COSTOT + COSTO;
                    PRECIOT = PRECIOT + PRECIO;
                    END
                END
        if (DETALLE <> 'S') then
            BEGIN
            COSTO = COSTOT;
            PRECIO = PRECIOT;
            UTILIDAD = PRECIO - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  PRECIO, 'S') returning_values (PORC);
            SUSPEND;
            END
        END
    END
  if (TIPO = 35) then
    BEGIN
    /* COTIZACION */
    FOR SELECT COTI_ID, C.PREF_PRE, COTI_NUMERO, COTI_FECHA, PTVT_ID, VEND_COD, TERC_NIT, COTI_NOMTERC, COTI_IMPTOS, COTI_FACTOR
        FROM COTIZACIONES C, PREFIJOS P
        WHERE COTI_FECHA >= :FECINI AND COTI_FECHA <= :FECFIN AND COTI_ANULADO = 'N'
         AND P.PREF_PRE = C.PREF_PRE AND P.TIDO_COD = :TIPO AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
        ORDER BY COTI_FECHA, C.PREF_PRE, COTI_NUMERO
        INTO :ID, :PREF, :NUMERO, :FECHA, :PTVTID, :VENDCOD, :NIT, :NOMTERCERO, :IMPTOS, :FACTOR
        DO
        if ((PREFIJO = '') or (PREFIJO = PREF)) then
          BEGIN
          COSTOT = 0;
          PRECIOT = 0;
          FOR SELECT ARTI_COD, SUBSTR(CTDE_DESC,1,60), CTDE_CANT * CTDE_FACTOR, CTDE_UNIDAD, (CTDE_TOTAL-CTDE_IVAMONTO-CTDE_CONSUMO)*:FACTOR, CTDE_IVAMONTO, ctde_consumo
            FROM COTIZACIONES_DETALLE
            WHERE COTI_ID = :ID
            INTO :ARTICULO, :ARTIDES, :CANT, :UNIDAD, :PRECIO, :IVA, :consumo
            DO
                BEGIN
                EXECUTE PROCEDURE COSTO_PROMEDIO(:ARTICULO, :FECHA) returning_values (:COSTO);
                COSTO = COSTO * CANT;
                if (IMPTOS = 'S') then
                    PRECIO = PRECIO - IVA;
                if (icoinc = 'SI') then
                    PRECIO = PRECIO - consumo;
                UTILIDAD = PRECIO - COSTO;
                if (DETALLE = 'S') then
                    BEGIN
                    if (UOM = 'UTILIDAD') then
                        EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                    else
                        EXECUTE PROCEDURE PORCENTAJE (utilidad,  PRECIO, 'S') returning_values (PORC);
                    SUSPEND;
                    END
                ELSE
                    BEGIN
                    COSTOT = COSTOT + COSTO;
                    PRECIOT = PRECIOT + PRECIO;
                    END
                END
        if (DETALLE <> 'S') then
            BEGIN
            COSTO = COSTOT;
            PRECIO = PRECIOT;
            UTILIDAD = PRECIO - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  PRECIO, 'S') returning_values (PORC);
            SUSPEND;
            END
        END
    END
END
^

SET TERM ; ^


/* 20090306C : DEVOLUCIONES DETALLADO NO MULTIPLICABA LA BASE POR -1 Y CONSOLIDADO NO INCLUIA LAS DEVOLUCIONES */
SET TERM ^ ;

CREATE OR ALTER PROCEDURE REP_VENTAS_VENDEDOR(
    TIPO INTEGER,
    DESDE VARCHAR(20),
    HASTA VARCHAR(20),
    FECINI DATE,
    FECFIN DATE,
    DETALLE CHAR(1),
    CEROS CHAR(1),
    SUBEMPRESA INTEGER)
RETURNS (
    CODVEND INTEGER,
    NOMVEND VARCHAR(60),
    NOMTIPO VARCHAR(50),
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(6),
    NIT VARCHAR(20),
    NOMBRE VARCHAR(60),
    ID INTEGER,
    FECDOC DATE,
    CANTIDAD INTEGER,
    SUBTOTAL NUMERIC(18,2),
    DTO NUMERIC(18,2),
    ADICIONAL NUMERIC(18,2),
    CONSUMO NUMERIC(18,2),
    IVA NUMERIC(18,2),
    EXTRA NUMERIC(18,2),
    TOTAL NUMERIC(18,2),
    RTFTE NUMERIC(18,2),
    RTIVA NUMERIC(18,2),
    RTICA NUMERIC(18,2),
    NETO NUMERIC(18,2))
AS
BEGIN
if (DETALLE = 'N') then
    BEGIN
    NIT = '';
    NOMBRE = '';
    if (BIN_AND(TIPO, 1) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 31 INTO :NOMTIPO;
        FOR SELECT MAX(F.VEND_COD), MAX(VEND_NOMBRE), COUNT(*), SUM(FACT_DTOMONTO), SUM(FACT_ADICIONAL), SUM(FACT_IVAMONTO), SUM(FACT_EXTRA), SUM(FACT_RTFTEMONTO), SUM(FACT_RTIVAMONTO), SUM(FACT_RTICAMONTO), SUM(FACT_TOTAL)
            FROM FACTURAS F, PREFIJOS P, VENDEDORES V
            WHERE F.VEND_COD >= :DESDE AND F.VEND_COD <= :HASTA AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND FACT_ANULADO = 'N'
             AND F.vend_cod = V.vend_cod AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND ((P.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY F.VEND_COD
            INTO :CODVEND, :NOMVEND, :CANTIDAD, :DTO, :ADICIONAL, :IVA, :EXTRA, :RTFTE, :RTIVA, :RTICA, :TOTAL
            DO
            BEGIN
            SELECT SUM(FADE_CONSUMO) FROM FACTURAS_DETALLE D, FACTURAS F WHERE F.FACT_ID = D.FACT_ID AND
                VEND_COD = :CODVEND AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND FACT_ANULADO = 'N' and substring(D.arti_cod from 1 FOR 2) <> '.t'
                INTO :CONSUMO;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (DTO IS NULL) then
                DTO = 0;
            if (ADICIONAL IS NULL) then
                ADICIONAL = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (EXTRA IS NULL) then
                EXTRA = 0;
            if (RTFTE IS NULL) then
                RTFTE = 0;
            if (RTIVA IS NULL) then
                RTIVA = 0;
            if (RTICA IS NULL) then
                RTICA = 0;
            SUBTOTAL = TOTAL - EXTRA - IVA - ADICIONAL + DTO - CONSUMO;
            NETO = TOTAL - RTFTE - RTIVA - RTICA;
            if (CEROS = 'S') then
              SUSPEND;
            ELSE
              if (CANTIDAD > 0) then
                SUSPEND;
            END
        END
    if (BIN_AND(TIPO, 2) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 32 INTO :NOMTIPO;
        FOR SELECT MAX(R.VEND_COD), MAX(VEND_NOMBRE), COUNT(*), 0, 0, SUM(REVT_IVAMONTO), 0, 0, 0, 0, SUM(REVT_TOTAL)
            FROM REMISIONES_VENTA R, PREFIJOS P, VENDEDORES V
            WHERE R.VEND_COD >= :DESDE AND R.VEND_COD <= :HASTA
             AND R.vend_cod = V.vend_cod AND REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN AND REVT_ANULADO = 'N'
             AND P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = 32 AND ((P.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY R.VEND_COD
            INTO :CODVEND, :NOMVEND, :CANTIDAD, :DTO, :ADICIONAL, :IVA, :EXTRA, :RTFTE, :RTIVA, :RTICA, :TOTAL
            DO
            BEGIN
            SELECT SUM(RVDE_CONSUMO) FROM REMISIONES_VENTA R, REMISIONES_VENTA_DETALLE D WHERE R.REVT_ID = D.REVT_ID AND
                VEND_COD = :CODVEND AND REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN AND REVT_ANULADO = 'N'
                INTO :CONSUMO;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (DTO IS NULL) then
                DTO = 0;
            if (ADICIONAL IS NULL) then
                ADICIONAL = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (EXTRA IS NULL) then
                EXTRA = 0;
            if (RTFTE IS NULL) then
                RTFTE = 0;
            if (RTIVA IS NULL) then
                RTIVA = 0;
            if (RTICA IS NULL) then
                RTICA = 0;
            SUBTOTAL = TOTAL - EXTRA - IVA - ADICIONAL + DTO - CONSUMO;
            NETO = TOTAL - RTFTE - RTIVA - RTICA;
            if (CEROS = 'S') then
              SUSPEND;
            ELSE
              if (CANTIDAD > 0) then
                SUSPEND;
            END
        END
    if (BIN_AND(TIPO, 4) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 33 INTO :NOMTIPO;
        FOR SELECT MAX(D.VEND_COD), MAX(VEND_NOMBRE), COUNT(*), SUM(DEVT_DTOMONTO), SUM(DEVT_ADICIONAL), SUM(DEVT_IVAMONTO), SUM(DEVT_EXTRA), SUM(DEVT_RTFTEMONTO), SUM(DEVT_RTIVAMONTO), SUM(DEVT_RTICAMONTO), SUM(DEVT_TOTAL)
            FROM DEVOLUCIONES_VENTAS D, PREFIJOS P, VENDEDORES V
            WHERE D.VEND_COD >= :DESDE AND D.VEND_COD <= :HASTA
             AND D.vend_cod = V.vend_cod AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND DEVT_ANULADO = 'N'
             AND P.PREF_PRE = D.PREF_PRE AND P.TIDO_COD = 33 AND ((P.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) AND ((DEVT_REMID = 0) or (DEVT_REMID IS NULL))
            GROUP BY D.VEND_COD
            INTO :CODVEND, :NOMVEND, :CANTIDAD, :DTO, :ADICIONAL, :IVA, :EXTRA, :RTFTE, :RTIVA, :RTICA, :TOTAL
            DO
            BEGIN
            SELECT SUM(DVDE_CONSUMO) FROM DEVOLUCIONES_VENTAS V, DEVOLUCIONES_VENTAS_DETALLE D WHERE V.DEVT_ID = D.DEVT_ID AND
                VEND_COD = :CODVEND AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND DEVT_ANULADO = 'N' and substring(D.arti_cod from 1 FOR 2) <> '.t'
                INTO :CONSUMO;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (DTO IS NULL) then
                DTO = 0;
            if (ADICIONAL IS NULL) then
                ADICIONAL = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (EXTRA IS NULL) then
                EXTRA = 0;
            if (RTFTE IS NULL) then
                RTFTE = 0;
            if (RTIVA IS NULL) then
                RTIVA = 0;
            if (RTICA IS NULL) then
                RTICA = 0;
            SUBTOTAL = TOTAL - EXTRA - IVA - ADICIONAL + DTO - CONSUMO;
            NETO = TOTAL - RTFTE - RTIVA - RTICA;
            CANTIDAD = CANTIDAD * -1;
            SUBTOTAL = SUBTOTAL * -1;
            TOTAL = TOTAL * -1;
            IVA = IVA * -1;
            EXTRA = EXTRA * -1;
            DTO = DTO * -1;
            ADICIONAL = ADICIONAL * -1;
            RTFTE = RTFTE * -1;
            RTIVA = RTIVA * -1;
            RTICA = RTICA * -1;
            if (CEROS = 'S') then
              SUSPEND;
            ELSE
              if (CANTIDAD <> 0) then
                SUSPEND;
            END
        END
    if (BIN_AND(TIPO, 8) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 34 INTO :NOMTIPO;
        FOR SELECT MAX(P.VEND_COD), MAX(VEND_NOMBRE), COUNT(*), SUM(PEDI_DTOMONTO), SUM(PEDI_ADICIONAL), SUM(PEDI_IVAMONTO), SUM(PEDI_EXTRA), 0, 0, 0, SUM(PEDI_TOTAL)
            FROM PEDIDOS P, PREFIJOS PR, VENDEDORES V
            WHERE V.VEND_COD >= :DESDE AND V.VEND_COD <= :HASTA
             AND P.vend_cod = V.vend_cod AND PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND PEDI_ANULADO = 'N'
             AND P.PREF_PRE = PR.PREF_PRE AND PR.TIDO_COD = 34 AND ((PR.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY P.VEND_COD
            INTO :CODVEND, :NOMVEND, :CANTIDAD, :DTO, :ADICIONAL, :IVA, :EXTRA, :RTFTE, :RTIVA, :RTICA, :TOTAL
            DO
            BEGIN
            SELECT SUM(PEDE_CONSUMO) FROM PEDIDOS P, PEDIDOS_DETALLE D WHERE P.PEDI_ID = D.PEDI_ID AND
                VEND_COD = :CODVEND AND PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND PEDI_ANULADO = 'N'
                INTO :CONSUMO;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (DTO IS NULL) then
                DTO = 0;
            if (ADICIONAL IS NULL) then
                ADICIONAL = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (EXTRA IS NULL) then
                EXTRA = 0;
            if (RTFTE IS NULL) then
                RTFTE = 0;
            if (RTIVA IS NULL) then
                RTIVA = 0;
            if (RTICA IS NULL) then
                RTICA = 0;
            SUBTOTAL = TOTAL - EXTRA - IVA - ADICIONAL + DTO - CONSUMO;
            NETO = TOTAL - RTFTE - RTIVA - RTICA;
            if (CEROS = 'S') then
              SUSPEND;
            ELSE
              if (CANTIDAD > 0) then
                SUSPEND;
            END
        END
    if (BIN_AND(TIPO, 16) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 35 INTO :NOMTIPO;
        FOR SELECT MAX(C.VEND_COD), MAX(VEND_NOMBRE), COUNT(*), SUM(COTI_DTOMONTO), SUM(COTI_ADICIONAL), SUM(COTI_IVAMONTO), SUM(COTI_EXTRA), 0, 0, 0, SUM(COTI_TOTAL)
            FROM COTIZACIONES C, PREFIJOS P, VENDEDORES V
            WHERE V.VEND_COD >= :DESDE AND V.VEND_COD <= :HASTA
             AND C.vend_cod = V.vend_cod AND COTI_FECHA >= :FECINI AND COTI_FECHA <= :FECFIN AND COTI_ANULADO = 'N'
             AND P.PREF_PRE = C.PREF_PRE AND P.TIDO_COD = 35 AND ((P.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY C.VEND_COD
            INTO :CODVEND, :NOMVEND, :CANTIDAD, :DTO, :ADICIONAL, :IVA, :EXTRA, :RTFTE, :RTIVA, :RTICA, :TOTAL
            DO
            BEGIN
            SELECT SUM(CTDE_CONSUMO) FROM COTIZACIONES C, COTIZACIONES_DETALLE D WHERE C.COTI_ID = D.COTI_ID AND
                VEND_COD = :CODVEND AND COTI_FECHA >= :FECINI AND COTI_FECHA <= :FECFIN AND COTI_ANULADO = 'N'
                INTO :CONSUMO;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (DTO IS NULL) then
                DTO = 0;
            if (ADICIONAL IS NULL) then
                ADICIONAL = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (EXTRA IS NULL) then
                EXTRA = 0;
            if (RTFTE IS NULL) then
                RTFTE = 0;
            if (RTIVA IS NULL) then
                RTIVA = 0;
            if (RTICA IS NULL) then
                RTICA = 0;
            SUBTOTAL = TOTAL - EXTRA - IVA - ADICIONAL + DTO - CONSUMO;
            NETO = TOTAL - RTFTE - RTIVA - RTICA;
            if (CEROS = 'S') then
              SUSPEND;
            ELSE
              if (CANTIDAD > 0) then
                SUSPEND;
            END
        END
    END
ELSE
    BEGIN
    if (BIN_AND(TIPO, 1) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 31 INTO :NOMTIPO;
        FOR SELECT F.VEND_COD, VEND_NOMBRE, F.FACT_ID, F.PREF_PRE, FACT_NUMERO, FACT_FECHA, FACT_DTOMONTO, FACT_ADICIONAL, FACT_IVAMONTO, FACT_EXTRA, FACT_TOTAL, FACT_RTFTEMONTO, FACT_RTIVAMONTO, FACT_RTICAMONTO, TERC_NIT, FACT_NOMCLIENTE
            FROM FACTURAS F, PREFIJOS P, VENDEDORES V WHERE F.vend_cod = V.vend_cod AND F.VEND_COD >= :DESDE AND F.VEND_COD <= :HASTA AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND FACT_ANULADO = 'N'
             AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND ((P.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            ORDER BY V.VEND_COD, FACT_FECHA, FACT_ID
            INTO :CODVEND, :NOMVEND, :ID, :PREFIJO, :NUMERO, :FECDOC, :DTO, :ADICIONAL, :IVA, :EXTRA, :TOTAL, :RTFTE, :RTIVA, :RTICA, :NIT, :NOMBRE
            DO
            BEGIN
            SELECT SUM(FADE_CONSUMO) FROM FACTURAS_DETALLE WHERE FACT_ID = :ID and substring(arti_cod from 1 FOR 2) <> '.t'
                INTO :CONSUMO;
            SUBTOTAL = TOTAL - EXTRA - IVA - ADICIONAL + DTO - CONSUMO;
            NETO = TOTAL - RTFTE - RTIVA - RTICA;
            SUSPEND;
            END
         END
    if (BIN_AND(TIPO, 2) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 32 INTO :NOMTIPO;
        FOR SELECT R.VEND_COD, VEND_NOMBRE, REVT_ID, R.PREF_PRE, REVT_NUMERO, REVT_FECHA, 0, 0, REVT_IVAMONTO, 0, REVT_TOTAL, 0, 0, 0, TERC_NIT, REVT_NOMTERC
            FROM REMISIONES_VENTA R, PREFIJOS P, VENDEDORES V WHERE R.vend_cod = V.vend_cod AND R.VEND_COD >= :DESDE AND R.VEND_COD <= :HASTA AND REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN AND REVT_ANULADO = 'N'
             AND P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = 32 AND ((P.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            ORDER BY V.VEND_COD, REVT_FECHA, REVT_ID
            INTO :CODVEND, :NOMVEND, :ID, :PREFIJO, :NUMERO, :FECDOC, :DTO, :ADICIONAL, :IVA, :EXTRA, :TOTAL, :RTFTE, :RTIVA, :RTICA, :NIT, :NOMBRE
            DO
            BEGIN
            SELECT SUM(RVDE_CONSUMO) FROM REMISIONES_VENTA_DETALLE WHERE REVT_ID = :ID
                INTO :CONSUMO;
            SUBTOTAL = TOTAL - EXTRA - IVA - ADICIONAL + DTO - CONSUMO;
            NETO = TOTAL - RTFTE - RTIVA - RTICA;
            SUSPEND;
            END
         END
    if (BIN_AND(TIPO, 4) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 33 INTO :NOMTIPO;
        FOR SELECT V.VEND_COD, VEND_NOMBRE, DEVT_ID, D.PREF_PRE, DEVT_NUMERO, DEVT_FECHA, DEVT_DTOMONTO, DEVT_ADICIONAL, DEVT_IVAMONTO, DEVT_EXTRA, DEVT_TOTAL, DEVT_RTFTEMONTO, DEVT_RTIVAMONTO, DEVT_RTICAMONTO, TERC_NIT, DEVT_NOMTERC
            FROM DEVOLUCIONES_VENTAS D, PREFIJOS P, VENDEDORES V WHERE D.vend_cod = V.vend_cod AND V.VEND_COD >= :DESDE AND V.VEND_COD <= :HASTA AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND DEVT_ANULADO = 'N'
             AND P.PREF_PRE = D.PREF_PRE AND P.TIDO_COD = 33 AND ((P.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) AND ((DEVT_REMID = 0) or (DEVT_REMID IS NULL))
            ORDER BY V.VEND_COD, DEVT_FECHA, DEVT_ID
            INTO :CODVEND, :NOMVEND, :ID, :PREFIJO, :NUMERO, :FECDOC, :DTO, :ADICIONAL, :IVA, :EXTRA, :TOTAL, :RTFTE, :RTIVA, :RTICA, :NIT, :NOMBRE
            DO
            BEGIN
            SELECT SUM(DVDE_CONSUMO) FROM DEVOLUCIONES_VENTAS_DETALLE WHERE DEVT_ID = :ID and substring(arti_cod from 1 FOR 2) <> '.t'
                INTO :CONSUMO;
            SUBTOTAL = TOTAL - EXTRA - IVA - ADICIONAL + DTO - CONSUMO;
            NETO = TOTAL - RTFTE - RTIVA - RTICA;
            SUBTOTAL = SUBTOTAL * -1;
            TOTAL = TOTAL * -1;
            IVA = IVA * -1;
            EXTRA = EXTRA * -1;
            DTO = DTO * -1;
            ADICIONAL = ADICIONAL * -1;
            RTFTE = RTFTE * -1;
            RTIVA = RTIVA * -1;
            RTICA = RTICA * -1;
            SUSPEND;
            END
         END
    if (BIN_AND(TIPO, 8) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 34 INTO :NOMTIPO;
        FOR SELECT P.VEND_COD, VEND_NOMBRE, PEDI_ID, P.PREF_PRE, PEDI_NUMERO, PEDI_FECHA, PEDI_DTOMONTO, PEDI_ADICIONAL, PEDI_IVAMONTO, PEDI_EXTRA, PEDI_TOTAL, 0, 0, 0, TERC_NIT, PEDI_NOMTERC
            FROM PEDIDOS P, PREFIJOS PR, VENDEDORES V WHERE P.vend_cod = V.vend_cod AND P.VEND_COD >= :DESDE AND P.VEND_COD <= :HASTA AND PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND PEDI_ANULADO = 'N'
             AND P.PREF_PRE = PR.PREF_PRE AND PR.TIDO_COD = 34 AND ((PR.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            ORDER BY V.VEND_COD, PEDI_FECHA, PEDI_ID
            INTO :CODVEND, :NOMVEND, :ID, :PREFIJO, :NUMERO, :FECDOC, :DTO, :ADICIONAL, :IVA, :EXTRA, :TOTAL, :RTFTE, :RTIVA, :RTICA, :NIT, :NOMBRE
            DO
            BEGIN
            SELECT SUM(PEDE_CONSUMO) FROM PEDIDOS_DETALLE WHERE PEDI_ID = :ID
                INTO :CONSUMO;
            SUBTOTAL = TOTAL - EXTRA - IVA - ADICIONAL + DTO - CONSUMO;
            NETO = TOTAL - RTFTE - RTIVA - RTICA;
            SUSPEND;
            END
         END
    if (BIN_AND(TIPO, 16) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 35 INTO :NOMTIPO;
        FOR SELECT C.VEND_COD, VEND_NOMBRE, COTI_ID, C.PREF_PRE, COTI_NUMERO, COTI_FECHA, COTI_DTOMONTO, COTI_ADICIONAL, COTI_IVAMONTO, COTI_EXTRA, COTI_TOTAL, 0, 0, 0, TERC_NIT, COTI_NOMTERC
            FROM COTIZACIONES C, PREFIJOS P, VENDEDORES V WHERE C.vend_cod = V.vend_cod AND C.VEND_COD >= :DESDE AND C.VEND_COD <= :HASTA AND COTI_FECHA >= :FECINI AND COTI_FECHA <= :FECFIN AND COTI_ANULADO = 'N'
             AND P.PREF_PRE = C.PREF_PRE AND P.TIDO_COD = 35 AND ((P.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            ORDER BY V.VEND_COD, COTI_FECHA, COTI_ID
            INTO :CODVEND, :NOMVEND, :ID, :PREFIJO, :NUMERO, :FECDOC, :DTO, :ADICIONAL, :IVA, :EXTRA, :TOTAL, :RTFTE, :RTIVA, :RTICA, :NIT, :NOMBRE
            DO
            BEGIN
            SELECT SUM(CTDE_CONSUMO) FROM COTIZACIONES_DETALLE WHERE COTI_ID = :ID
                INTO :CONSUMO;
            SUBTOTAL = TOTAL - EXTRA - IVA - ADICIONAL + DTO - CONSUMO;
            NETO = TOTAL - RTFTE - RTIVA - RTICA;
            SUSPEND;
            END
        END
    END
END
^

SET TERM ; ^

/* 20090307 mejoras de ruteros */
/* PERMITA TRAER FACTURAS NO ENTREGADAS ASI ESTEN EN OTRO RUTERO */
SET TERM ^ ;

CREATE OR ALTER PROCEDURE FACTURAS_RUTERO(
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    ID INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    CLIENTE VARCHAR(20),
    SUCURSAL VARCHAR(10),
    NOMBRE VARCHAR(60),
    DIR VARCHAR(60),
    VEND INTEGER,
    NOMVEND VARCHAR(60),
    ZONA VARCHAR(2),
    NOMZONA VARCHAR(60),
    MONTO NUMERIC(18,2),
    CAJAS NUMERIC(18,4))
AS
begin
FOR SELECT FACT_ID, PREF_PRE, FACT_NUMERO, FACT_FECHA, TERC_NIT, FACT_SUCURSAL, FACT_NOMCLIENTE, VEND_COD, FACT_TOTAL
    FROM FACTURAS F WHERE FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND FACT_ANULADO = 'N' AND
    NOT EXISTS (SELECT RUTE_ID FROM RUTERO_DETALLE WHERE RUTD_FACTID = F.fact_id AND RUTD_ANULADO = 'N' AND RUTD_ENTREGADO = 'S')
    INTO :ID, :PREF, :NUMERO, :FECHA, :CLIENTE, :SUCURSAL, :NOMBRE, :VEND, :MONTO
    DO
    BEGIN
    SELECT SUM(FADE_CAJAS) FROM FACTURAS_DETALLE WHERE FACT_ID = :ID INTO :CAJAS;
    SELECT CLSU_DIR FROM CLIENTE_SUCURSALES WHERE TERC_NIT = :cliente AND CLCU_COD = :sucursal INTO :dir;
    SELECT VEND_NOMBRE FROM vendedores WHERE VEND_COD = :vend INTO :nomvend;
    SELECT C.zona_cod, ZONA_NOM FROM ZONAS Z, CLIENTES C WHERE Z.zona_nom = C.zona_cod AND C.terc_nit = :cliente INTO :zona, :nomzona;
    suspend;
    END
end
^

SET TERM ; ^




INSERT INTO NOMBRES_CAMPOS (NOMBRE, DESCRIPCION) VALUES ('PREF_PRE', 'Prefijo del documento');
INSERT INTO NOMBRES_CAMPOS (NOMBRE, DESCRIPCION) VALUES ('FACT_NUMERO', 'Número de la factura');
INSERT INTO NOMBRES_CAMPOS (NOMBRE, DESCRIPCION) VALUES ('FACT_FECHA', 'Fecha de la factura');
INSERT INTO NOMBRES_CAMPOS (NOMBRE, DESCRIPCION) VALUES ('FACT_VENCE', 'Vencimiento de la factura');
INSERT INTO NOMBRES_CAMPOS (NOMBRE, DESCRIPCION) VALUES ('PTVT_ID', 'Punto de venta');
INSERT INTO NOMBRES_CAMPOS (NOMBRE, DESCRIPCION) VALUES ('FACT_NOMCLIENTE', 'Nombre del cliente');
INSERT INTO NOMBRES_CAMPOS (NOMBRE, DESCRIPCION) VALUES ('FACT_SUCURSAL', 'Sucursal del cliente');
INSERT INTO NOMBRES_CAMPOS (NOMBRE, DESCRIPCION) VALUES ('FACT_REMISION', 'Remisión de la factura');
INSERT INTO NOMBRES_CAMPOS (NOMBRE, DESCRIPCION) VALUES ('FACT_PEDIDO', 'Pedido de la factura');
INSERT INTO NOMBRES_CAMPOS (NOMBRE, DESCRIPCION) VALUES ('FACT_COTIZACION', 'Cotización de la factura');
INSERT INTO NOMBRES_CAMPOS (NOMBRE, DESCRIPCION) VALUES ('FACT_RTFTEMONTO', 'Monto retención en la fuente');
INSERT INTO NOMBRES_CAMPOS (NOMBRE, DESCRIPCION) VALUES ('FACT_RTIVAMONTO', 'Monto retención de IVA');
INSERT INTO NOMBRES_CAMPOS (NOMBRE, DESCRIPCION) VALUES ('FACT_RTICAMONTO', 'Monto retención de ICA');
INSERT INTO NOMBRES_CAMPOS (NOMBRE, DESCRIPCION) VALUES ('FACT_DTOMONTO', 'Monto del descuento final');
INSERT INTO NOMBRES_CAMPOS (NOMBRE, DESCRIPCION) VALUES ('FACT_ADICIONAL', 'Valor adicional factura');
INSERT INTO NOMBRES_CAMPOS (NOMBRE, DESCRIPCION) VALUES ('FACT_EXTRA', 'Valor extra factura');
INSERT INTO NOMBRES_CAMPOS (NOMBRE, DESCRIPCION) VALUES ('FACT_DTOFMONTO', 'Monto descuento condicional');
INSERT INTO NOMBRES_CAMPOS (NOMBRE, DESCRIPCION) VALUES ('FACT_DTOFFECHA', 'Fecha descuento condicional');
INSERT INTO NOMBRES_CAMPOS (NOMBRE, DESCRIPCION) VALUES ('FACT_OBS', 'Observaciones factura');
INSERT INTO NOMBRES_CAMPOS (NOMBRE, DESCRIPCION) VALUES ('FACT_COMIPORC', 'Porcentaje comision');
INSERT INTO NOMBRES_CAMPOS (NOMBRE, DESCRIPCION) VALUES ('FACT_COMIMONTO', 'Monto de la comisión');
INSERT INTO NOMBRES_CAMPOS (NOMBRE, DESCRIPCION) VALUES ('FACT_IVAINC', 'Impuestos incluidos');
commit work;


/* TRAER EL VENDEDOR DE LA FACTURA */
SET TERM ^ ;

CREATE OR ALTER PROCEDURE RUTERO_FACTURA(
    PREF VARCHAR(4),
    NUMERO VARCHAR(6))
RETURNS (
    ID INTEGER,
    CLIENTE VARCHAR(20),
    SUCURSAL VARCHAR(10),
    NOMBRE VARCHAR(60),
    MONTO NUMERIC(18,2),
    CAJAS NUMERIC(18,4),
    VENDEDOR INTEGER)
AS
begin
SELECT FACT_ID, TERC_NIT, FACT_SUCURSAL, FACT_NOMCLIENTE, FACT_TOTAL, VEND_COD
    FROM FACTURAS F WHERE PREF_PRE = :pref AND FACT_NUMERO = :numero AND FACT_ANULADO = 'N' AND
    NOT EXISTS (SELECT RUTE_ID FROM RUTERO_DETALLE WHERE RUTD_FACTID = F.fact_id)
    INTO :ID, :CLIENTE, :SUCURSAL, :NOMBRE, :MONTO, :VENDEDOR;
SELECT SUM(FADE_CAJAS) FROM FACTURAS_DETALLE WHERE FACT_ID = :ID INTO :CAJAS;
suspend;
end
^

SET TERM ; ^


update rutero_detalle d set rutd_vend = (select vend_cod from facturas where fact_id = d.rutd_factid);
commit work;

/* valide que aunque este no se halla entregado */
SET TERM ^ ;

CREATE OR ALTER PROCEDURE RUTERO_FACTURA(
    PREF VARCHAR(4),
    NUMERO VARCHAR(6))
RETURNS (
    ID INTEGER,
    CLIENTE VARCHAR(20),
    SUCURSAL VARCHAR(10),
    NOMBRE VARCHAR(60),
    MONTO NUMERIC(18,2),
    CAJAS NUMERIC(18,4),
    VENDEDOR INTEGER)
AS
begin
SELECT FACT_ID, TERC_NIT, FACT_SUCURSAL, FACT_NOMCLIENTE, FACT_TOTAL, VEND_COD
    FROM FACTURAS F WHERE PREF_PRE = :pref AND FACT_NUMERO = :numero AND FACT_ANULADO = 'N' AND
    NOT EXISTS (SELECT RUTE_ID FROM RUTERO_DETALLE WHERE RUTD_FACTID = F.fact_id and rutd_entregado = 'S')
    INTO :ID, :CLIENTE, :SUCURSAL, :NOMBRE, :MONTO, :VENDEDOR;
SELECT SUM(FADE_CAJAS) FROM FACTURAS_DETALLE WHERE FACT_ID = :ID INTO :CAJAS;
if (cajas is null) then
    cajas = 0;
suspend;
end
^

SET TERM ; ^



update revision set revi_FECHA = '2009/03/07';
COMMIT WORK;

/* 20090308 IMPORTACION DE PEDIDOS, AKTIVIA */
INSERT INTO IMPORTACION_INVENTARIO (IMIN_TIPO, IMIN_DATO, IMIN_COLUMNA, IMIN_ANCHO) VALUES (23, 'PREF_PRE', 1, 4);
INSERT INTO IMPORTACION_INVENTARIO (IMIN_TIPO, IMIN_DATO, IMIN_COLUMNA, IMIN_ANCHO) VALUES (23, 'PEDI_NUMERO', 2, 6);
INSERT INTO IMPORTACION_INVENTARIO (IMIN_TIPO, IMIN_DATO, IMIN_COLUMNA, IMIN_ANCHO) VALUES (23, 'PEDI_FECHA', 3, 10);
INSERT INTO IMPORTACION_INVENTARIO (IMIN_TIPO, IMIN_DATO, IMIN_COLUMNA, IMIN_ANCHO) VALUES (23, 'PEDI_VENCE', 4, 10);
INSERT INTO IMPORTACION_INVENTARIO (IMIN_TIPO, IMIN_DATO, IMIN_COLUMNA, IMIN_ANCHO) VALUES (23, 'VEND_COD', 5, 4);
INSERT INTO IMPORTACION_INVENTARIO (IMIN_TIPO, IMIN_DATO, IMIN_COLUMNA, IMIN_ANCHO) VALUES (23, 'PTVT_ID', 6, 3);
INSERT INTO IMPORTACION_INVENTARIO (IMIN_TIPO, IMIN_DATO, IMIN_COLUMNA, IMIN_ANCHO) VALUES (23, 'TERC_NIT', 7, 15);
INSERT INTO IMPORTACION_INVENTARIO (IMIN_TIPO, IMIN_DATO, IMIN_COLUMNA, IMIN_ANCHO) VALUES (23, 'PEDI_NOMTERC', 8, 60);
INSERT INTO IMPORTACION_INVENTARIO (IMIN_TIPO, IMIN_DATO, IMIN_COLUMNA, IMIN_ANCHO) VALUES (23, 'PEDI_SUCURSAL', 9, 10);
INSERT INTO IMPORTACION_INVENTARIO (IMIN_TIPO, IMIN_DATO, IMIN_COLUMNA, IMIN_ANCHO) VALUES (23, 'PEDI_RTFTEMONTO', 10, 15);
INSERT INTO IMPORTACION_INVENTARIO (IMIN_TIPO, IMIN_DATO, IMIN_COLUMNA, IMIN_ANCHO) VALUES (23, 'PEDI_RTIVAMONTO', 11, 15);
INSERT INTO IMPORTACION_INVENTARIO (IMIN_TIPO, IMIN_DATO, IMIN_COLUMNA, IMIN_ANCHO) VALUES (23, 'PEDI_RTICAMONTO', 12, 15);
INSERT INTO IMPORTACION_INVENTARIO (IMIN_TIPO, IMIN_DATO, IMIN_COLUMNA, IMIN_ANCHO) VALUES (23, 'PEDI_DTOMONTO', 13, 15);
INSERT INTO IMPORTACION_INVENTARIO (IMIN_TIPO, IMIN_DATO, IMIN_COLUMNA, IMIN_ANCHO) VALUES (23, 'PEDI_ADICIONAL', 14, 15);
INSERT INTO IMPORTACION_INVENTARIO (IMIN_TIPO, IMIN_DATO, IMIN_COLUMNA, IMIN_ANCHO) VALUES (23, 'PEDI_EXTRA', 15, 15);
INSERT INTO IMPORTACION_INVENTARIO (IMIN_TIPO, IMIN_DATO, IMIN_COLUMNA, IMIN_ANCHO) VALUES (23, 'PEDI_DTOFMONTO', 16, 15);
INSERT INTO IMPORTACION_INVENTARIO (IMIN_TIPO, IMIN_DATO, IMIN_COLUMNA, IMIN_ANCHO) VALUES (23, 'PEDI_DTOFFECHA', 17, 15);
INSERT INTO IMPORTACION_INVENTARIO (IMIN_TIPO, IMIN_DATO, IMIN_COLUMNA, IMIN_ANCHO) VALUES (23, 'PEDI_TOTAL', 18, 255);
INSERT INTO IMPORTACION_INVENTARIO (IMIN_TIPO, IMIN_DATO, IMIN_COLUMNA, IMIN_ANCHO) VALUES (23, 'ARTI_COD', 19, 9);
INSERT INTO IMPORTACION_INVENTARIO (IMIN_TIPO, IMIN_DATO, IMIN_COLUMNA, IMIN_ANCHO) VALUES (23, 'PEDE_CANT', 20, 15);
INSERT INTO IMPORTACION_INVENTARIO (IMIN_TIPO, IMIN_DATO, IMIN_COLUMNA, IMIN_ANCHO) VALUES (23, 'PEDE_UNIDAD', 21, 1);
INSERT INTO IMPORTACION_INVENTARIO (IMIN_TIPO, IMIN_DATO, IMIN_COLUMNA, IMIN_ANCHO) VALUES (23, 'PEDE_PRUNIT', 22, 1);
INSERT INTO IMPORTACION_INVENTARIO (IMIN_TIPO, IMIN_DATO, IMIN_COLUMNA, IMIN_ANCHO) VALUES (23, 'PEDE_DTOPORC', 23, 1);
COMMIT WORK;

/* 20090308b */
/* permisos para triggers de notas_debito_proveedor  */
GRANT UPDATE,REFERENCES ON NOTAS_DEBITO_PROVEEDOR TO TRIGGER NOTAS_DEBITO_PROVEEDOR_AI;
GRANT INSERT ON SALDOS_DOC_CXPAGAR TO TRIGGER NOTAS_DEBITO_PROVEEDOR_AI;
GRANT INSERT ON MOVIMIENTO_PROVEEDOR TO TRIGGER NOTAS_DEBITO_PROVEEDOR_AI;
GRANT EXECUTE ON PROCEDURE COSTO_PROMEDIO TO TRIGGER NOTAS_DEBITO_PROVEEDOR_AI;
GRANT EXECUTE ON PROCEDURE SALDO_TOTAL_INVENTARIO TO TRIGGER NOTAS_DEBITO_PROVEEDOR_AI;
GRANT SELECT ON EXISTENCIA TO TRIGGER NOTAS_DEBITO_PROVEEDOR_AI;
GRANT EXECUTE ON PROCEDURE SALDO_INVENTARIO TO TRIGGER NOTAS_DEBITO_PROVEEDOR_AI;
GRANT SELECT,INSERT ON MOVIMIENTO_ARTICULO TO TRIGGER NOTAS_DEBITO_PROVEEDOR_AI;
GRANT EXECUTE ON PROCEDURE CALCULA_PRECIOS TO TRIGGER NOTAS_DEBITO_PROVEEDOR_AI;
GRANT INSERT ON AUDITORIA TO TRIGGER NOTAS_DEBITO_PROVEEDOR_AI;

GRANT UPDATE,REFERENCES ON NOTAS_DEBITO_PROVEEDOR TO TRIGGER NOTAS_DEBITO_PROVEEDOR_AU;
GRANT SELECT,DELETE ON COMPROBANTE_ENCABEZADO TO TRIGGER NOTAS_DEBITO_PROVEEDOR_AU;
GRANT SELECT,DELETE ON COMPROBANTE_DETALLE TO TRIGGER NOTAS_DEBITO_PROVEEDOR_AU;
GRANT INSERT ON AUDITORIA TO TRIGGER NOTAS_DEBITO_PROVEEDOR_AU;
GRANT SELECT,INSERT,DELETE ON SALDOS_DOC_CXPAGAR TO TRIGGER NOTAS_DEBITO_PROVEEDOR_AU;
GRANT SELECT,INSERT,DELETE ON MOVIMIENTO_PROVEEDOR TO TRIGGER NOTAS_DEBITO_PROVEEDOR_AU;
GRANT SELECT,INSERT,DELETE ON MOVIMIENTO_ARTICULO TO TRIGGER NOTAS_DEBITO_PROVEEDOR_AU;
GRANT EXECUTE ON PROCEDURE COSTO_PROMEDIO TO TRIGGER NOTAS_DEBITO_PROVEEDOR_AU;
GRANT EXECUTE ON PROCEDURE SALDO_TOTAL_INVENTARIO TO TRIGGER NOTAS_DEBITO_PROVEEDOR_AU;
GRANT SELECT ON EXISTENCIA TO TRIGGER NOTAS_DEBITO_PROVEEDOR_AU;
GRANT EXECUTE ON PROCEDURE SALDO_INVENTARIO TO TRIGGER NOTAS_DEBITO_PROVEEDOR_AU;
GRANT EXECUTE ON PROCEDURE CALCULA_PRECIOS TO TRIGGER NOTAS_DEBITO_PROVEEDOR_AU;

GRANT UPDATE,REFERENCES ON NOTAS_DEBITO_PROVEEDOR TO TRIGGER NOTAS_DEBITO_PROVEEDOR_AD;
GRANT SELECT,DELETE ON COMPROBANTE_ENCABEZADO TO TRIGGER NOTAS_DEBITO_PROVEEDOR_AD;
GRANT SELECT,DELETE ON COMPROBANTE_DETALLE TO TRIGGER NOTAS_DEBITO_PROVEEDOR_AD;
GRANT SELECT,DELETE ON SALDOS_DOC_CXPAGAR TO TRIGGER NOTAS_DEBITO_PROVEEDOR_AD;
GRANT SELECT,DELETE ON MOVIMIENTO_PROVEEDOR TO TRIGGER NOTAS_DEBITO_PROVEEDOR_AD;
GRANT SELECT,DELETE ON MOVIMIENTO_ARTICULO TO TRIGGER NOTAS_DEBITO_PROVEEDOR_AD;
GRANT INSERT ON AUDITORIA TO TRIGGER NOTAS_DEBITO_PROVEEDOR_AD;

/* 20090309 */
/* NUEVOS DOCUMENTOS SIN CONTABILIZAR */
SET TERM ^ ;

CREATE OR ALTER PROCEDURE APLICACIONCL_SIN_CONTABILIDAD(
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    ID INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    ESTADO VARCHAR(20),
    IDI INTEGER,
    IDC INTEGER,
    ERROR INTEGER)
AS
DECLARE VARIABLE VER CHAR(2);
declare variable FECICNT VARCHAR(10);
declare variable FECFCNT VARCHAR(10);
declare variable idref INTEGER;
BEGIN
EXECUTE PROCEDURE fecha_a_conta(FECINI) returning_values (FECICNT);
EXECUTE PROCEDURE fecha_a_conta(FECFIN) returning_values (FECFCNT);
FOR SELECT APCL_ID, PREF_PRE, APCL_NUMERO FROM aplicacion_cliente WHERE APCL_ANULADO = 'N' AND
    APCL_FECHA >= :FECINI AND APCL_FECHA <= :FECFIN ORDER BY APCL_ID
    INTO :ID, :PREF, :NUMERO
DO
  BEGIN
  idref = null;
  SELECT ENCO_IDREF FROM COMPROBANTE_ENCABEZADO WHERE ENCO_TIPOREF = 43 AND ENCO_FECHA >= :FECICNT AND ENCO_FECHA <= :FECFCNT and ENCO_IDREF = :id into :idref;
  if (idref IS NULL) then
  begin
   ESTADO = 'PROCESANDO';
   SUSPEND;
   SELECT MAX(INCA_ID) FROM INTERFAZ_CARTERA WHERE PREF_PRE = :PREF AND TIDO_COD = 43 INTO :IDI;
   EXECUTE PROCEDURE contabil_aplicacl (:ID, :IDI) RETURNING_VALUES (:ERROR, :VER, :IDC);
   if (ERROR = 0) then
    BEGIN
    EXECUTE PROCEDURE CONTABILIZA_PENDIENTE (:IDC);
    ESTADO = 'OK';
    END
   ELSE
    ESTADO = 'ERROR';
   suspend;
  end
  END
END
^

SET TERM ; ^


SET TERM ^ ;

CREATE OR ALTER PROCEDURE APLICACIONPR_SIN_CONTABILIDAD(
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    ID INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    ESTADO VARCHAR(20),
    IDI INTEGER,
    IDC INTEGER,
    ERROR INTEGER)
AS
DECLARE VARIABLE VER CHAR(2);
declare variable FECICNT VARCHAR(10);
declare variable FECFCNT VARCHAR(10);
declare variable idref INTEGER;
BEGIN
EXECUTE PROCEDURE fecha_a_conta(FECINI) returning_values (FECICNT);
EXECUTE PROCEDURE fecha_a_conta(FECFIN) returning_values (FECFCNT);
FOR SELECT APPR_ID, PREF_PRE, APPR_NUMERO FROM aplicacion_provedor WHERE APPR_ANULADO = 'N' AND
    APPR_FECHA >= :FECINI AND APPR_FECHA <= :FECFIN ORDER BY APPR_ID
    INTO :ID, :PREF, :NUMERO
DO
  BEGIN
  idref = null;
  SELECT ENCO_IDREF FROM COMPROBANTE_ENCABEZADO WHERE ENCO_TIPOREF = 53 AND ENCO_FECHA >= :FECICNT AND ENCO_FECHA <= :FECFCNT and ENCO_IDREF = :id into :idref;
  if (idref IS NULL) then
  begin
   ESTADO = 'PROCESANDO';
   SUSPEND;
   SELECT MAX(INCP_ID) FROM interfaz_cxpagar WHERE PREF_PRE = :PREF AND TIDO_COD = 53 INTO :IDI;
   EXECUTE PROCEDURE contabil_aplicapr (:ID, :IDI) RETURNING_VALUES (:ERROR, :VER, :IDC);
   if (ERROR = 0) then
    BEGIN
    EXECUTE PROCEDURE CONTABILIZA_PENDIENTE (:IDC);
    ESTADO = 'OK';
    END
   ELSE
    ESTADO = 'ERROR';
   suspend;
  end
  END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER PROCEDURE TRASFERENCIAS_SIN_CONTABILIDAD(
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    ID INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    ESTADO VARCHAR(20),
    IDI INTEGER,
    IDC INTEGER)
AS
DECLARE VARIABLE VER CHAR(2);
declare variable FECICNT VARCHAR(10);
declare variable FECFCNT VARCHAR(10);
declare variable ERROR INTEGER;
declare variable idref INTEGER;
BEGIN
EXECUTE PROCEDURE fecha_a_conta(FECINI) returning_values (FECICNT);
EXECUTE PROCEDURE fecha_a_conta(FECFIN) returning_values (FECFCNT);
FOR SELECT TRAN_ID, PREF_PRE, TRAN_NUMERO FROM trasferencias WHERE TRAN_ANULADO = 'N' AND
    TRAN_FECHA >= :FECINI AND TRAN_FECHA <= :FECFIN
    INTO :ID, :PREF, :NUMERO
DO
  BEGIN
  idref = null;
  SELECT ENCO_IDREF FROM COMPROBANTE_ENCABEZADO WHERE ENCO_TIPOREF = 13 AND ENCO_FECHA >= :FECICNT AND ENCO_FECHA <= :FECFCNT and ENCO_IDREF = :id into :idref;
  if (idref IS NULL) then
  begin
  ESTADO = 'PROCESANDO';
  SUSPEND;
  SELECT MAX(ININ_ID) FROM INTERFAZ_INVENTARIO WHERE PREF_PRE = :PREF AND TIDO_COD = 13 INTO :IDI;
  EXECUTE PROCEDURE contabil_traslamercancia (:ID, :IDI) RETURNING_VALUES (:ERROR, :VER, :IDC);
  if (ERROR = 0) then
    BEGIN
      EXECUTE PROCEDURE CONTABILIZA_PENDIENTE (:IDC);
      ESTADO = 'OK';
      END
  ELSE
    ESTADO = 'ERROR';
  suspend;
  end
  END
END
^

SET TERM ; ^


/* 20090310 */
/* PROCEDIMIENTO PARA REVERTIR RETENCIONES DE EGRESOS */
SET TERM ^ ;

CREATE OR ALTER procedure REVERSE_RETENCIONES_EGRESOS (
    FECINI VARCHAR(8),
    FECFIN VARCHAR(8),
    TIPO VARCHAR(3))
returns (
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    CUENTA VARCHAR(20),
    RET NUMERIC(18,2))
as
declare variable IDC INTEGER;
declare variable ITEM INTEGER;
begin
FOR SELECT ENCO_CONSEC, PRCO_PREF, ENCO_NUMERO FROM COMPROBANTE_ENCABEZADO
    WHERE ENCO_FECHA >= :fecini AND ENCO_FECHA <= :fecfin AND TICO_COD = :TIPO
    ORDER BY ENCO_CONSEC
    INTO :IDC, :pref, :numero
    DO
    BEGIN
    FOR SELECT CODE_ITEM, CUEN_COD, CODE_CREDITO FROM comprobante_detalle
        WHERE ENCO_CONSEC = :IDC AND SUBSTRING(CUEN_COD FROM 1 FOR 3) = '236'
        INTO :ITEM, :CUENTA, :RET
        DO
        BEGIN
        UPDATE COMPROBANTE_DETALLE SET CODE_CREDITO = CODE_CREDITO + :RET
            where ENCO_CONSEC = :IDC AND SUBSTRING(CUEN_COD FROM 1 FOR 2) = '11';
        DELETE FROM COMPROBANTE_DETALLE WHERE ENCO_CONSEC = :IDC AND CODE_ITEM = :ITEM;
        suspend;
        END
    END
end
^

SET TERM ; ^



/* 20090311 */
/* personalizar la fracción de moneda (centavos) */
INSERT INTO CONFIGURACION (CONF_MODULO, CONF_CATEGORIA, CONF_PROPIEDAD, CONF_VALOR, CONF_POSIBLES, CONF_AYUDA) VALUES ('GENERAL', 'GENERAL', 'FRACCION DE MONEDA EN MONTOS EN LETRAS', 'CTVS', 'CTVS, /100, CTMS', 'Indique la palabra que aparecerá luego de la fracción de moneda en los montos en letras');
commit work;


/* 20090311b */
/* AVISE SI HAY RECIBOS PROVISIONALES SIN CRUZAR AL ENTRAR AL MODULO DE CARTERA */
INSERT INTO CONFIGURACION (CONF_MODULO, CONF_CATEGORIA, CONF_PROPIEDAD, CONF_VALOR, CONF_POSIBLES, CONF_AYUDA) VALUES ('CARTERA', 'GENERAL', 'MOSTRAR RECIBOS PROVISIONALES PENDIENTES AL ENTRAR AL MODULO', 'SI', 'SI,NO', 'SI:Muestra un listado de recibos provisionales pendientes de cruce a la fecha del sistema cada vez que se abre el módulo de cartera');
COMMIT WORK;

/* 20090312 */
/* rutero graba directamente el recibo y no espera al final, no se usa mas el campo recok */
SET TERM ^ ;

CREATE OR ALTER TRIGGER RECIBOS_CAJA_AI FOR RECIBOS_CAJA
ACTIVE AFTER INSERT POSITION 0
AS
BEGIN
if ((new.reca_id <> 0) and (new.reca_anulado = 'N'))Then
    BEGIN
    /* siexistia un recibo provisional borrelo */
    if ((new.reca_provid is not null) and (new.reca_provid <> 0)) then
        update recibo_provisional set rcpr_feccruce = new.reca_fecha, rcpr_idcruce = new.reca_id where rcpr_id = new.reca_provid;
    INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
        VALUES (USER, 61, NEW.reca_id, 'I', NEW.pref_pre || NEW.reca_numero);
    END
END
^

SET TERM ; ^

ALTER TABLE RUTERO_DETALLE DROP RUTD_RECOK;


DELETE FROM mediosmag_archivos;
DELETE FROM mediosmag_cuentas;
DELETE FROM configura_mediosmag;

INSERT INTO CONFIGURA_MEDIOSMAG (COME_ITEM, COME_DESCRIPCION, COME_RESPUESTA, COME_CUENTA, COME_FORMATO, COME_MINIMO, COME_NATUR) VALUES (1, 'CONCEPTO RETENCIONES PRACTICADAS POR SALARIOS', '2301', '236505', 1002, 0, NULL);
INSERT INTO CONFIGURA_MEDIOSMAG (COME_ITEM, COME_DESCRIPCION, COME_RESPUESTA, COME_CUENTA, COME_FORMATO, COME_MINIMO, COME_NATUR) VALUES (2, 'CONCEPTO RETENCIONES PRACTICADAS POR COMPRAS', '2302', '236540', 1002, 0, NULL);
INSERT INTO CONFIGURA_MEDIOSMAG (COME_ITEM, COME_DESCRIPCION, COME_RESPUESTA, COME_CUENTA, COME_FORMATO, COME_MINIMO, COME_NATUR) VALUES (3, 'CONCEPTO RETENCIONES PRACTICADAS POR COMISIONES', '2303', '236520', 1002, 0, NULL);
INSERT INTO CONFIGURA_MEDIOSMAG (COME_ITEM, COME_DESCRIPCION, COME_RESPUESTA, COME_CUENTA, COME_FORMATO, COME_MINIMO, COME_NATUR) VALUES (4, 'CONCEPTO RETENCIONES PRACTICADAS POR HONORARIOS', '2304', '236515', 1002, 0, NULL);
INSERT INTO CONFIGURA_MEDIOSMAG (COME_ITEM, COME_DESCRIPCION, COME_RESPUESTA, COME_CUENTA, COME_FORMATO, COME_MINIMO, COME_NATUR) VALUES (5, 'CONCEPTO RETENCIONES PRACTICADAS POR SERVICIOS', '2305', '236525', 1002, 0, NULL);
INSERT INTO CONFIGURA_MEDIOSMAG (COME_ITEM, COME_DESCRIPCION, COME_RESPUESTA, COME_CUENTA, COME_FORMATO, COME_MINIMO, COME_NATUR) VALUES (6, 'CONCEPTO RETENCIONES PRACTICADAS POR ARRENDAMIENTOS', '2306', '236530', 1002, 0, NULL);
INSERT INTO CONFIGURA_MEDIOSMAG (COME_ITEM, COME_DESCRIPCION, COME_RESPUESTA, COME_CUENTA, COME_FORMATO, COME_MINIMO, COME_NATUR) VALUES (7, 'CONCEPTO RETENCIONES PRACTICADAS POR RENDIMIENTOS', '2307', '236535', 1002, 0, NULL);
INSERT INTO CONFIGURA_MEDIOSMAG (COME_ITEM, COME_DESCRIPCION, COME_RESPUESTA, COME_CUENTA, COME_FORMATO, COME_MINIMO, COME_NATUR) VALUES (8, 'CONCEPTO RETENCIONES PRACTICADAS POR DIVIDENDOS', '2308', '236510', 1002, 0, NULL);
INSERT INTO CONFIGURA_MEDIOSMAG (COME_ITEM, COME_DESCRIPCION, COME_RESPUESTA, COME_CUENTA, COME_FORMATO, COME_MINIMO, COME_NATUR) VALUES (9, 'CONCEPTO RETENCIONES PRACTICADAS POR ENAJENACION ACTIVOS', '2309', '236560', 1002, 0, NULL);
INSERT INTO CONFIGURA_MEDIOSMAG (COME_ITEM, COME_DESCRIPCION, COME_RESPUESTA, COME_CUENTA, COME_FORMATO, COME_MINIMO, COME_NATUR) VALUES (10, 'CONCEPTO RETENCIONES PRACTICADAS SOBRE INGRESOS TARJETAS', '2310', NULL, 1002, 0, NULL);
INSERT INTO CONFIGURA_MEDIOSMAG (COME_ITEM, COME_DESCRIPCION, COME_RESPUESTA, COME_CUENTA, COME_FORMATO, COME_MINIMO, COME_NATUR) VALUES (11, 'CONCEPTO RETENCIONES PRACTICADAS POR LOTERIAS', '2311', '236545', 1002, 0, NULL);
INSERT INTO CONFIGURA_MEDIOSMAG (COME_ITEM, COME_DESCRIPCION, COME_RESPUESTA, COME_CUENTA, COME_FORMATO, COME_MINIMO, COME_NATUR) VALUES (12, 'CONCEPTO RETENCIONES PRACTICADAS POR PAGOS AL EXTERIOR', '2312', '236550', 1002, 0, NULL);
INSERT INTO CONFIGURA_MEDIOSMAG (COME_ITEM, COME_DESCRIPCION, COME_RESPUESTA, COME_CUENTA, COME_FORMATO, COME_MINIMO, COME_NATUR) VALUES (13, 'CONCEPTO OTRAS RETENCIONES PRACTICADAS', '2313', '236570', 1002, 0, NULL);
INSERT INTO CONFIGURA_MEDIOSMAG (COME_ITEM, COME_DESCRIPCION, COME_RESPUESTA, COME_CUENTA, COME_FORMATO, COME_MINIMO, COME_NATUR) VALUES (14, 'CONCEPTO AUTO-RETENCIONES POR VENTAS', '2314', '236575', 1002, 0, NULL);
INSERT INTO CONFIGURA_MEDIOSMAG (COME_ITEM, COME_DESCRIPCION, COME_RESPUESTA, COME_CUENTA, COME_FORMATO, COME_MINIMO, COME_NATUR) VALUES (15, 'CONCEPTO AUTO-RETENCIONES POR SERVICIOS', '2315', '236575', 1002, 0, NULL);
INSERT INTO CONFIGURA_MEDIOSMAG (COME_ITEM, COME_DESCRIPCION, COME_RESPUESTA, COME_CUENTA, COME_FORMATO, COME_MINIMO, COME_NATUR) VALUES (16, 'CONCEPTO AUTO-RETENCIONES POR RENDIMIENTOS', '2316', NULL, 1002, 0, NULL);
INSERT INTO CONFIGURA_MEDIOSMAG (COME_ITEM, COME_DESCRIPCION, COME_RESPUESTA, COME_CUENTA, COME_FORMATO, COME_MINIMO, COME_NATUR) VALUES (17, 'CONCEPTO OTRAS AUTO-RETENCIONES PRACTICADAS', '2317', NULL, 1002, 0, NULL);
INSERT INTO CONFIGURA_MEDIOSMAG (COME_ITEM, COME_DESCRIPCION, COME_RESPUESTA, COME_CUENTA, COME_FORMATO, COME_MINIMO, COME_NATUR) VALUES (18, 'CONCEPTO RETENCIONES DE IVA', '2318', '2367', 1002, 0, NULL);
INSERT INTO CONFIGURA_MEDIOSMAG (COME_ITEM, COME_DESCRIPCION, COME_RESPUESTA, COME_CUENTA, COME_FORMATO, COME_MINIMO, COME_NATUR) VALUES (19, 'CONCEPTO RETENCIONES DEL IVA AL REGIMEN SIMPLIFICADO', '2319', NULL, 1002, 0, NULL);
INSERT INTO CONFIGURA_MEDIOSMAG (COME_ITEM, COME_DESCRIPCION, COME_RESPUESTA, COME_CUENTA, COME_FORMATO, COME_MINIMO, COME_NATUR) VALUES (20, 'CONCEPTO RETENCIONES DE IVA A EXTRANJEROS', '2320', NULL, 1002, 0, NULL);
INSERT INTO CONFIGURA_MEDIOSMAG (COME_ITEM, COME_DESCRIPCION, COME_RESPUESTA, COME_CUENTA, COME_FORMATO, COME_MINIMO, COME_NATUR) VALUES (21, 'CONCEPTO PAGOS POR SALARIOS', '5001', NULL, 1001, 10000000, 'N');
INSERT INTO CONFIGURA_MEDIOSMAG (COME_ITEM, COME_DESCRIPCION, COME_RESPUESTA, COME_CUENTA, COME_FORMATO, COME_MINIMO, COME_NATUR) VALUES (22, 'CONCEPTO PAGOS HONORARIOS', '5002', NULL, 1001, 1000000, 'N');
INSERT INTO CONFIGURA_MEDIOSMAG (COME_ITEM, COME_DESCRIPCION, COME_RESPUESTA, COME_CUENTA, COME_FORMATO, COME_MINIMO, COME_NATUR) VALUES (23, 'CONCEPTO PAGOS COMISIONES', '5003', NULL, 1001, 1000000, 'N');
INSERT INTO CONFIGURA_MEDIOSMAG (COME_ITEM, COME_DESCRIPCION, COME_RESPUESTA, COME_CUENTA, COME_FORMATO, COME_MINIMO, COME_NATUR) VALUES (24, 'CONCEPTO PAGOS SERVICIOS', '5004', NULL, 1001, 1000000, 'N');
INSERT INTO CONFIGURA_MEDIOSMAG (COME_ITEM, COME_DESCRIPCION, COME_RESPUESTA, COME_CUENTA, COME_FORMATO, COME_MINIMO, COME_NATUR) VALUES (25, 'CONCEPTO PAGOS ARRENDAMIENTOS', '5005', NULL, 1001, 1000000, 'N');
INSERT INTO CONFIGURA_MEDIOSMAG (COME_ITEM, COME_DESCRIPCION, COME_RESPUESTA, COME_CUENTA, COME_FORMATO, COME_MINIMO, COME_NATUR) VALUES (26, 'CONCEPTO PAGOS INTERESES Y RENDIMIENTOS', '5006', NULL, 1001, 1000000, 'N');
INSERT INTO CONFIGURA_MEDIOSMAG (COME_ITEM, COME_DESCRIPCION, COME_RESPUESTA, COME_CUENTA, COME_FORMATO, COME_MINIMO, COME_NATUR) VALUES (27, 'CONCEPTO PAGOS COMPRA ACTIVOS MOVILES', '5007', NULL, 1001, 1000000, 'N');
INSERT INTO CONFIGURA_MEDIOSMAG (COME_ITEM, COME_DESCRIPCION, COME_RESPUESTA, COME_CUENTA, COME_FORMATO, COME_MINIMO, COME_NATUR) VALUES (28, 'CONCEPTO PAGOS COMPRA ACTIVOS FIJOS', '5008', NULL, 1001, 1000000, 'N');
INSERT INTO CONFIGURA_MEDIOSMAG (COME_ITEM, COME_DESCRIPCION, COME_RESPUESTA, COME_CUENTA, COME_FORMATO, COME_MINIMO, COME_NATUR) VALUES (29, 'CONCEPTO PAGOS DIFERIDOS Y GASTOS POR ANTICIPADO', '5009', NULL, 1001, 1000000, 'D');
INSERT INTO CONFIGURA_MEDIOSMAG (COME_ITEM, COME_DESCRIPCION, COME_RESPUESTA, COME_CUENTA, COME_FORMATO, COME_MINIMO, COME_NATUR) VALUES (30, 'CONCEPTO PAGOS APORTES SENA,ICBF,CAJA COMPENSACION', '5010', NULL, 1001, 1000000, 'N');
INSERT INTO CONFIGURA_MEDIOSMAG (COME_ITEM, COME_DESCRIPCION, COME_RESPUESTA, COME_CUENTA, COME_FORMATO, COME_MINIMO, COME_NATUR) VALUES (31, 'CONCEPTO PAGOS APORTES EPS-ISS-ARP', '5011', NULL, 1001, 1000000, 'N');
INSERT INTO CONFIGURA_MEDIOSMAG (COME_ITEM, COME_DESCRIPCION, COME_RESPUESTA, COME_CUENTA, COME_FORMATO, COME_MINIMO, COME_NATUR) VALUES (32, 'CONCEPTO PAGOS APORTES FONDOS PENSIONES', '5012', NULL, 1001, 1000000, 'N');
INSERT INTO CONFIGURA_MEDIOSMAG (COME_ITEM, COME_DESCRIPCION, COME_RESPUESTA, COME_CUENTA, COME_FORMATO, COME_MINIMO, COME_NATUR) VALUES (33, 'CONCEPTO PAGOS DONACIONES EN DINERO', '5013', '53952505', 1001, 1000000, 'N');
INSERT INTO CONFIGURA_MEDIOSMAG (COME_ITEM, COME_DESCRIPCION, COME_RESPUESTA, COME_CUENTA, COME_FORMATO, COME_MINIMO, COME_NATUR) VALUES (34, 'CONCEPTO PAGOS DONACIONES EN OTROS ACTIVOS', '5014', '53952510', 1001, 1000000, 'N');
INSERT INTO CONFIGURA_MEDIOSMAG (COME_ITEM, COME_DESCRIPCION, COME_RESPUESTA, COME_CUENTA, COME_FORMATO, COME_MINIMO, COME_NATUR) VALUES (35, 'CONCEPTO PAGOS IMPUESTOS', '5015', '1000000', 1001, 1000000, 'N');
INSERT INTO CONFIGURA_MEDIOSMAG (COME_ITEM, COME_DESCRIPCION, COME_RESPUESTA, COME_CUENTA, COME_FORMATO, COME_MINIMO, COME_NATUR) VALUES (36, 'CONCEPTO OTROS COSTOS Y DEDUCCIONES', '5016', '1000000', 1001, 1000000, 'N');
INSERT INTO CONFIGURA_MEDIOSMAG (COME_ITEM, COME_DESCRIPCION, COME_RESPUESTA, COME_CUENTA, COME_FORMATO, COME_MINIMO, COME_NATUR) VALUES (37, 'CONCEPTO PAGOS PENSIONES', '5022', NULL, 1001, 500000, 'N');
INSERT INTO CONFIGURA_MEDIOSMAG (COME_ITEM, COME_DESCRIPCION, COME_RESPUESTA, COME_CUENTA, COME_FORMATO, COME_MINIMO, COME_NATUR) VALUES (38, 'CONCEPTO AMORTIZACION PAGOS DIFERIDOS', '5019', NULL, 1001, 500000, 'C');
INSERT INTO CONFIGURA_MEDIOSMAG (COME_ITEM, COME_DESCRIPCION, COME_RESPUESTA, COME_CUENTA, COME_FORMATO, COME_MINIMO, COME_NATUR) VALUES (39, 'CONCEPTO DEDUCCION COMPRA DE ACTIVOS ART. 158-3', '5020', NULL, 1001, 500000, 'N');
INSERT INTO CONFIGURA_MEDIOSMAG (COME_ITEM, COME_DESCRIPCION, COME_RESPUESTA, COME_CUENTA, COME_FORMATO, COME_MINIMO, COME_NATUR) VALUES (40, 'CONCEPTO DEDUCCION MEDIO AMBIENTE', '5021', NULL, 1001, 500000, 'N');
INSERT INTO CONFIGURA_MEDIOSMAG (COME_ITEM, COME_DESCRIPCION, COME_RESPUESTA, COME_CUENTA, COME_FORMATO, COME_MINIMO, COME_NATUR) VALUES (41, 'CONCEPTO RETENCIONES QUE LE PRACTICARON POR SALARIOS', '1301', '13551501', 1003, 0, NULL);
INSERT INTO CONFIGURA_MEDIOSMAG (COME_ITEM, COME_DESCRIPCION, COME_RESPUESTA, COME_CUENTA, COME_FORMATO, COME_MINIMO, COME_NATUR) VALUES (42, 'CONCEPTO RETENCIONES QUE LE PRACTICARON POR VENTAS', '1302', '13551502', 1003, 0, NULL);
INSERT INTO CONFIGURA_MEDIOSMAG (COME_ITEM, COME_DESCRIPCION, COME_RESPUESTA, COME_CUENTA, COME_FORMATO, COME_MINIMO, COME_NATUR) VALUES (43, 'CONCEPTO RETENCIONES QUE LE PRACTICARON POR SERVICIOS', '1303', '13551503', 1003, 0, NULL);
INSERT INTO CONFIGURA_MEDIOSMAG (COME_ITEM, COME_DESCRIPCION, COME_RESPUESTA, COME_CUENTA, COME_FORMATO, COME_MINIMO, COME_NATUR) VALUES (44, 'CONCEPTO RETENCIONES QUE LE PRACTICARON POR HONORARIOS', '1304', '13551504', 1003, 0, NULL);
INSERT INTO CONFIGURA_MEDIOSMAG (COME_ITEM, COME_DESCRIPCION, COME_RESPUESTA, COME_CUENTA, COME_FORMATO, COME_MINIMO, COME_NATUR) VALUES (45, 'CONCEPTO RETENCIONES QUE LE PRACTICARON POR COMISIONES', '1305', '13551505', 1003, 0, NULL);
INSERT INTO CONFIGURA_MEDIOSMAG (COME_ITEM, COME_DESCRIPCION, COME_RESPUESTA, COME_CUENTA, COME_FORMATO, COME_MINIMO, COME_NATUR) VALUES (46, 'CONCEPTO RETENCIONES QUE LE PRACTICARON POR RENDIMIENTOS', '1306', '13551506', 1003, 0, NULL);
INSERT INTO CONFIGURA_MEDIOSMAG (COME_ITEM, COME_DESCRIPCION, COME_RESPUESTA, COME_CUENTA, COME_FORMATO, COME_MINIMO, COME_NATUR) VALUES (47, 'CONCEPTO RETENCIONES QUE LE PRACTICARON POR ARRENDAMIENTOS', '1307', '13551507', 1003, 0, NULL);
INSERT INTO CONFIGURA_MEDIOSMAG (COME_ITEM, COME_DESCRIPCION, COME_RESPUESTA, COME_CUENTA, COME_FORMATO, COME_MINIMO, COME_NATUR) VALUES (48, 'CONCEPTO RETENCIONES QUE LE PRACTICARON POR OTRAS RETENCIONE', '1308', '13551508', 1003, 0, NULL);
INSERT INTO CONFIGURA_MEDIOSMAG (COME_ITEM, COME_DESCRIPCION, COME_RESPUESTA, COME_CUENTA, COME_FORMATO, COME_MINIMO, COME_NATUR) VALUES (49, 'CONCEPTO RETENCIONES DE IVA QUE LE PRACTICARON', '1309', '135517', 1003, 0, NULL);
INSERT INTO CONFIGURA_MEDIOSMAG (COME_ITEM, COME_DESCRIPCION, COME_RESPUESTA, COME_CUENTA, COME_FORMATO, COME_MINIMO, COME_NATUR) VALUES (51, 'CONCEPTO INGRESOS OPERACIONALES', '4001', NULL, 1007, 1000000, NULL);
INSERT INTO CONFIGURA_MEDIOSMAG (COME_ITEM, COME_DESCRIPCION, COME_RESPUESTA, COME_CUENTA, COME_FORMATO, COME_MINIMO, COME_NATUR) VALUES (52, 'CONCEPTO INGRESOS NO OPERACIONALES', '4002', NULL, 1007, 1000000, NULL);
INSERT INTO CONFIGURA_MEDIOSMAG (COME_ITEM, COME_DESCRIPCION, COME_RESPUESTA, COME_CUENTA, COME_FORMATO, COME_MINIMO, COME_NATUR) VALUES (53, 'CONCEPTO INGRESOS POR INTERESES Y RENDIMIENTOS', '4003', NULL, 1007, 1000000, NULL);
INSERT INTO CONFIGURA_MEDIOSMAG (COME_ITEM, COME_DESCRIPCION, COME_RESPUESTA, COME_CUENTA, COME_FORMATO, COME_MINIMO, COME_NATUR) VALUES (61, 'CONCEPTO SALDOS CUENTAS POR COBRAR A CLIENTES', '1315', NULL, 1008, 5000000, NULL);
INSERT INTO CONFIGURA_MEDIOSMAG (COME_ITEM, COME_DESCRIPCION, COME_RESPUESTA, COME_CUENTA, COME_FORMATO, COME_MINIMO, COME_NATUR) VALUES (62, 'CONCEPTO SALDOS CUENTAS POR COBRAR ACCIONISTAS,SOCIOS', '1316', NULL, 1008, 5000000, NULL);
INSERT INTO CONFIGURA_MEDIOSMAG (COME_ITEM, COME_DESCRIPCION, COME_RESPUESTA, COME_CUENTA, COME_FORMATO, COME_MINIMO, COME_NATUR) VALUES (63, 'CONCEPTO SALDOS OTRAS CUENTAS POR COBRAR', '1317', NULL, 1008, 5000000, NULL);
INSERT INTO CONFIGURA_MEDIOSMAG (COME_ITEM, COME_DESCRIPCION, COME_RESPUESTA, COME_CUENTA, COME_FORMATO, COME_MINIMO, COME_NATUR) VALUES (64, 'CONCEPTO SALDOS PROVISION DE CARTERA', '1318', NULL, 1008, 5000000, NULL);
INSERT INTO CONFIGURA_MEDIOSMAG (COME_ITEM, COME_DESCRIPCION, COME_RESPUESTA, COME_CUENTA, COME_FORMATO, COME_MINIMO, COME_NATUR) VALUES (71, 'CONCEPTO SALDOS CUENTAS POR PAGAR A PROVEEDORES', '2201', NULL, 1009, 5000000, NULL);
INSERT INTO CONFIGURA_MEDIOSMAG (COME_ITEM, COME_DESCRIPCION, COME_RESPUESTA, COME_CUENTA, COME_FORMATO, COME_MINIMO, COME_NATUR) VALUES (72, 'CONCEPTO SALDOS CUENTAS POR PAGAR A SOCIOS,ACCIONISTAS', '2202', NULL, 1009, 5000000, NULL);
INSERT INTO CONFIGURA_MEDIOSMAG (COME_ITEM, COME_DESCRIPCION, COME_RESPUESTA, COME_CUENTA, COME_FORMATO, COME_MINIMO, COME_NATUR) VALUES (73, 'CONCEPTO SALDOS OBLIGACIONES FINANCIERAS', '2203', NULL, 1009, 5000000, NULL);
INSERT INTO CONFIGURA_MEDIOSMAG (COME_ITEM, COME_DESCRIPCION, COME_RESPUESTA, COME_CUENTA, COME_FORMATO, COME_MINIMO, COME_NATUR) VALUES (74, 'CONCEPTO SALDOS POR PAGAR IMPUESTOS,GRAVAMENES', '2204', NULL, 1009, 5000000, NULL);
INSERT INTO CONFIGURA_MEDIOSMAG (COME_ITEM, COME_DESCRIPCION, COME_RESPUESTA, COME_CUENTA, COME_FORMATO, COME_MINIMO, COME_NATUR) VALUES (75, 'CONCEPTO SALDOS PASIVOS LABORALES', '2205', NULL, 1009, 5000000, NULL);
INSERT INTO CONFIGURA_MEDIOSMAG (COME_ITEM, COME_DESCRIPCION, COME_RESPUESTA, COME_CUENTA, COME_FORMATO, COME_MINIMO, COME_NATUR) VALUES (76, 'CONCEPTO SALDOS OTROS PASIVOS', '2206', NULL, 1009, 5000000, NULL);
INSERT INTO CONFIGURA_MEDIOSMAG (COME_ITEM, COME_DESCRIPCION, COME_RESPUESTA, COME_CUENTA, COME_FORMATO, COME_MINIMO, COME_NATUR) VALUES (80, 'CONCEPTO DEL SALDO EN BANCOS EXTRANJEROS', '1115', NULL, 1012, 0, NULL);
INSERT INTO CONFIGURA_MEDIOSMAG (COME_ITEM, COME_DESCRIPCION, COME_RESPUESTA, COME_CUENTA, COME_FORMATO, COME_MINIMO, COME_NATUR) VALUES (81, 'CONCEPTO DEL SALDO EN CAJA', '1105', NULL, 1011, 0, NULL);
INSERT INTO CONFIGURA_MEDIOSMAG (COME_ITEM, COME_DESCRIPCION, COME_RESPUESTA, COME_CUENTA, COME_FORMATO, COME_MINIMO, COME_NATUR) VALUES (82, 'CONCEPTO DEL SALDO EN BANCOS', '1110', NULL, 1012, 0, NULL);
INSERT INTO CONFIGURA_MEDIOSMAG (COME_ITEM, COME_DESCRIPCION, COME_RESPUESTA, COME_CUENTA, COME_FORMATO, COME_MINIMO, COME_NATUR) VALUES (83, 'CONCEPTO DEL SALDO DE INVERSIONES EN BONOS', '1200', NULL, 1012, 0, NULL);
INSERT INTO CONFIGURA_MEDIOSMAG (COME_ITEM, COME_DESCRIPCION, COME_RESPUESTA, COME_CUENTA, COME_FORMATO, COME_MINIMO, COME_NATUR) VALUES (84, 'CONCEPTO DEL SALDO DE INVERSIONES EN CDTS', '1201', NULL, 1012, 0, NULL);
INSERT INTO CONFIGURA_MEDIOSMAG (COME_ITEM, COME_DESCRIPCION, COME_RESPUESTA, COME_CUENTA, COME_FORMATO, COME_MINIMO, COME_NATUR) VALUES (85, 'CONCEPTO DEL SALDO DE INVERSIONES EN TITULOS', '1202', NULL, 1012, 0, NULL);
INSERT INTO CONFIGURA_MEDIOSMAG (COME_ITEM, COME_DESCRIPCION, COME_RESPUESTA, COME_CUENTA, COME_FORMATO, COME_MINIMO, COME_NATUR) VALUES (86, 'CONCEPTO DEL SALDO DE INVERSIONES EN DERECHOS FIDUCIARIOS', '1203', NULL, 1012, 0, NULL);
INSERT INTO CONFIGURA_MEDIOSMAG (COME_ITEM, COME_DESCRIPCION, COME_RESPUESTA, COME_CUENTA, COME_FORMATO, COME_MINIMO, COME_NATUR) VALUES (87, 'CONCEPTO DEL SALDO DE OTRAS INVERSIONES', '1204', NULL, 1012, 0, NULL);
INSERT INTO CONFIGURA_MEDIOSMAG (COME_ITEM, COME_DESCRIPCION, COME_RESPUESTA, COME_CUENTA, COME_FORMATO, COME_MINIMO, COME_NATUR) VALUES (88, 'CONCEPTO DEL SALDO DE ACCIONES O CUOTAS EN SOCIEDADES', '1205', NULL, 1012, 0, NULL);
INSERT INTO CONFIGURA_MEDIOSMAG (COME_ITEM, COME_DESCRIPCION, COME_RESPUESTA, COME_CUENTA, COME_FORMATO, COME_MINIMO, COME_NATUR) VALUES (89, 'CONCEPTO DEL SALDO DE ACTIVOS INMUEBLES', '1501', NULL, 1011, 0, NULL);
INSERT INTO CONFIGURA_MEDIOSMAG (COME_ITEM, COME_DESCRIPCION, COME_RESPUESTA, COME_CUENTA, COME_FORMATO, COME_MINIMO, COME_NATUR) VALUES (90, 'CONCEPTO DEL SALDO DE MAQUINARIA Y EQUIPO', '1502', NULL, 1011, 0, NULL);
INSERT INTO CONFIGURA_MEDIOSMAG (COME_ITEM, COME_DESCRIPCION, COME_RESPUESTA, COME_CUENTA, COME_FORMATO, COME_MINIMO, COME_NATUR) VALUES (91, 'CONCEPTO DEL SALDO DE EQUIPO DE OFICINA', '1503', NULL, 1011, 0, NULL);
INSERT INTO CONFIGURA_MEDIOSMAG (COME_ITEM, COME_DESCRIPCION, COME_RESPUESTA, COME_CUENTA, COME_FORMATO, COME_MINIMO, COME_NATUR) VALUES (92, 'CONCEPTO DEL SALDO DE FLOTA Y EQUIPO DE TRANSPORTE', '1504', NULL, 1011, 0, NULL);
INSERT INTO CONFIGURA_MEDIOSMAG (COME_ITEM, COME_DESCRIPCION, COME_RESPUESTA, COME_CUENTA, COME_FORMATO, COME_MINIMO, COME_NATUR) VALUES (93, 'CONCEPTO DEL SALDO DE EQUIPO DE COMPUTO Y COMUNICACION', '1505', NULL, 1011, 0, NULL);
INSERT INTO CONFIGURA_MEDIOSMAG (COME_ITEM, COME_DESCRIPCION, COME_RESPUESTA, COME_CUENTA, COME_FORMATO, COME_MINIMO, COME_NATUR) VALUES (94, 'CONCEPTO DEL SALDO DE ACTIVO FIJO AMORTIZABLE', '1511', NULL, 1011, 0, NULL);
INSERT INTO CONFIGURA_MEDIOSMAG (COME_ITEM, COME_DESCRIPCION, COME_RESPUESTA, COME_CUENTA, COME_FORMATO, COME_MINIMO, COME_NATUR) VALUES (95, 'CONCEPTO DEL SALDO DE OTROS ACTIVOS FIJOS', '1507', NULL, 1011, 0, NULL);
INSERT INTO CONFIGURA_MEDIOSMAG (COME_ITEM, COME_DESCRIPCION, COME_RESPUESTA, COME_CUENTA, COME_FORMATO, COME_MINIMO, COME_NATUR) VALUES (96, 'CONCEPTO DEL SALDO DEPRECIACION ACUMULADA', '1514', NULL, 1011, 0, NULL);
INSERT INTO CONFIGURA_MEDIOSMAG (COME_ITEM, COME_DESCRIPCION, COME_RESPUESTA, COME_CUENTA, COME_FORMATO, COME_MINIMO, COME_NATUR) VALUES (97, 'CONCEPTO DEL SALDO DE OTROS ACTIVOS', '1509', NULL, 1011, 0, NULL);
INSERT INTO CONFIGURA_MEDIOSMAG (COME_ITEM, COME_DESCRIPCION, COME_RESPUESTA, COME_CUENTA, COME_FORMATO, COME_MINIMO, COME_NATUR) VALUES (101, 'CONCEPTO DEL SALDO DE COSTOS EN VENTAS', '1406', NULL, 1011, 0, NULL);
INSERT INTO CONFIGURA_MEDIOSMAG (COME_ITEM, COME_DESCRIPCION, COME_RESPUESTA, COME_CUENTA, COME_FORMATO, COME_MINIMO, COME_NATUR) VALUES (102, 'CONCEPTO DEL SALDO FINAL DE INVENTARIOS', '1407', NULL, 1011, 0, NULL);
INSERT INTO CONFIGURA_MEDIOSMAG (COME_ITEM, COME_DESCRIPCION, COME_RESPUESTA, COME_CUENTA, COME_FORMATO, COME_MINIMO, COME_NATUR) VALUES (105, 'CONCEPTO INGRESO POR DIVIDENDOS Y PARTICIPACIONES NO CONSTIT', '8001', NULL, 1011, 0, NULL);
INSERT INTO CONFIGURA_MEDIOSMAG (COME_ITEM, COME_DESCRIPCION, COME_RESPUESTA, COME_CUENTA, COME_FORMATO, COME_MINIMO, COME_NATUR) VALUES (106, 'CONCEPTO DE DEDUCCIONES POR SALARIOS', '8207', NULL, 1011, 0, NULL);
INSERT INTO CONFIGURA_MEDIOSMAG (COME_ITEM, COME_DESCRIPCION, COME_RESPUESTA, COME_CUENTA, COME_FORMATO, COME_MINIMO, COME_NATUR) VALUES (111, '1005 - IMPUESTO A LAS VENTAS DESCONTABLE', '', NULL, 1005, 0, NULL);
INSERT INTO CONFIGURA_MEDIOSMAG (COME_ITEM, COME_DESCRIPCION, COME_RESPUESTA, COME_CUENTA, COME_FORMATO, COME_MINIMO, COME_NATUR) VALUES (115, '1006 - IMPUESTO A LAS VENTAS GENERADO', '', NULL, 1006, 137900, NULL);
INSERT INTO CONFIGURA_MEDIOSMAG (COME_ITEM, COME_DESCRIPCION, COME_RESPUESTA, COME_CUENTA, COME_FORMATO, COME_MINIMO, COME_NATUR) VALUES (121, 'CONCEPTO PAGOS SERVICIOS TECNICOS AL EXTERIOR', '5027', NULL, 1001, 500000, 'N');
INSERT INTO CONFIGURA_MEDIOSMAG (COME_ITEM, COME_DESCRIPCION, COME_RESPUESTA, COME_CUENTA, COME_FORMATO, COME_MINIMO, COME_NATUR) VALUES (122, 'CONCEPTO PAGOS ASISTENCIA TECNICA AL EXTERIOR', '5023', NULL, 1001, 500000, 'N');
INSERT INTO CONFIGURA_MEDIOSMAG (COME_ITEM, COME_DESCRIPCION, COME_RESPUESTA, COME_CUENTA, COME_FORMATO, COME_MINIMO, COME_NATUR) VALUES (123, 'CONCEPTO PAGOS POR MARCAS AL EXTERIOR', '5024', NULL, 1001, 500000, 'N');
INSERT INTO CONFIGURA_MEDIOSMAG (COME_ITEM, COME_DESCRIPCION, COME_RESPUESTA, COME_CUENTA, COME_FORMATO, COME_MINIMO, COME_NATUR) VALUES (124, 'CONCEPTO PAGOS POR PATENTES AL EXTERIOR', '5025', NULL, 1001, 500000, 'N');
INSERT INTO CONFIGURA_MEDIOSMAG (COME_ITEM, COME_DESCRIPCION, COME_RESPUESTA, COME_CUENTA, COME_FORMATO, COME_MINIMO, COME_NATUR) VALUES (125, 'CONCEPTO PAGOS POR REGALIAS AL EXTERIOR', '5026', NULL, 1001, 500000, 'N');
INSERT INTO CONFIGURA_MEDIOSMAG (COME_ITEM, COME_DESCRIPCION, COME_RESPUESTA, COME_CUENTA, COME_FORMATO, COME_MINIMO, COME_NATUR) VALUES (130, 'CONCEPTO RETENCIONES ASUMIDAS POR SALARIOS', '2321', NULL, 1002, 0, NULL);
INSERT INTO CONFIGURA_MEDIOSMAG (COME_ITEM, COME_DESCRIPCION, COME_RESPUESTA, COME_CUENTA, COME_FORMATO, COME_MINIMO, COME_NATUR) VALUES (131, 'CONCEPTOS RETENCIONES ASUMIDAS POR COMPRAS', '2322', NULL, 1002, 0, NULL);
INSERT INTO CONFIGURA_MEDIOSMAG (COME_ITEM, COME_DESCRIPCION, COME_RESPUESTA, COME_CUENTA, COME_FORMATO, COME_MINIMO, COME_NATUR) VALUES (132, 'CONCEPTOS RETENCIONES ASUMIDAS POR COMISIONES', '2323', NULL, 1002, 0, NULL);
INSERT INTO CONFIGURA_MEDIOSMAG (COME_ITEM, COME_DESCRIPCION, COME_RESPUESTA, COME_CUENTA, COME_FORMATO, COME_MINIMO, COME_NATUR) VALUES (133, 'CONCEPTOS RETENCIONES ASUMIDAS POR HONORARIOS', '2324', NULL, 1002, 0, NULL);
INSERT INTO CONFIGURA_MEDIOSMAG (COME_ITEM, COME_DESCRIPCION, COME_RESPUESTA, COME_CUENTA, COME_FORMATO, COME_MINIMO, COME_NATUR) VALUES (134, 'CONCEPTOS RETENCIONES ASUMIDAS POR SERVICIOS', '2325', NULL, 1002, 0, NULL);
INSERT INTO CONFIGURA_MEDIOSMAG (COME_ITEM, COME_DESCRIPCION, COME_RESPUESTA, COME_CUENTA, COME_FORMATO, COME_MINIMO, COME_NATUR) VALUES (135, 'CONCEPTOS RETENCIONES ASUMIDAS POR ARRENDAMIENTOS', '2326', NULL, 1002, 0, NULL);
INSERT INTO CONFIGURA_MEDIOSMAG (COME_ITEM, COME_DESCRIPCION, COME_RESPUESTA, COME_CUENTA, COME_FORMATO, COME_MINIMO, COME_NATUR) VALUES (136, 'CONCEPTOS RETENCIONES ASUMIDAS POR RENDIMIENTOS F.', '2327', NULL, 1002, 0, NULL);
INSERT INTO CONFIGURA_MEDIOSMAG (COME_ITEM, COME_DESCRIPCION, COME_RESPUESTA, COME_CUENTA, COME_FORMATO, COME_MINIMO, COME_NATUR) VALUES (137, 'CONCEPTOS RETENCIONES ASUMIDAS POR DIVIDENDOS', '2328', NULL, 1002, 0, NULL);
INSERT INTO CONFIGURA_MEDIOSMAG (COME_ITEM, COME_DESCRIPCION, COME_RESPUESTA, COME_CUENTA, COME_FORMATO, COME_MINIMO, COME_NATUR) VALUES (138, 'CONCEPTOS RETENCIONES ASUMIDAS POR ENAJENACION DE ACTIVOS', '2329', NULL, 1002, 0, NULL);
INSERT INTO CONFIGURA_MEDIOSMAG (COME_ITEM, COME_DESCRIPCION, COME_RESPUESTA, COME_CUENTA, COME_FORMATO, COME_MINIMO, COME_NATUR) VALUES (139, 'CONCEPTOS RETENCIONES ASUMIDAS POR TARJETAS', '2330', NULL, 1002, 0, NULL);
INSERT INTO CONFIGURA_MEDIOSMAG (COME_ITEM, COME_DESCRIPCION, COME_RESPUESTA, COME_CUENTA, COME_FORMATO, COME_MINIMO, COME_NATUR) VALUES (140, 'CONCEPTOS RETENCIONES ASUMIDAS POR LOTERIAS', '2331', NULL, 1002, 0, NULL);
INSERT INTO CONFIGURA_MEDIOSMAG (COME_ITEM, COME_DESCRIPCION, COME_RESPUESTA, COME_CUENTA, COME_FORMATO, COME_MINIMO, COME_NATUR) VALUES (141, 'CONCEPTOS RETENCIONES ASUMIDAS POR PAGOS AL EXTERIOR', '2332', NULL, 1002, 0, NULL);
INSERT INTO CONFIGURA_MEDIOSMAG (COME_ITEM, COME_DESCRIPCION, COME_RESPUESTA, COME_CUENTA, COME_FORMATO, COME_MINIMO, COME_NATUR) VALUES (142, 'CONCEPTOS RETENCIONES ASUMIDAS POR OTROS CONCEPTOS', '2333', NULL, 1002, 0, NULL);
INSERT INTO CONFIGURA_MEDIOSMAG (COME_ITEM, COME_DESCRIPCION, COME_RESPUESTA, COME_CUENTA, COME_FORMATO, COME_MINIMO, COME_NATUR) VALUES (143, 'CONCEPTOS RETENCIONES POR CONEPTO DE TIMBRE', '2334', NULL, 1002, 0, NULL);
INSERT INTO CONFIGURA_MEDIOSMAG (COME_ITEM, COME_DESCRIPCION, COME_RESPUESTA, COME_CUENTA, COME_FORMATO, COME_MINIMO, COME_NATUR) VALUES (145, 'CONCEPTOS DEVOLUCION RETENCIONES DE OTROS AÑOS', '2335', NULL, 1002, 0, NULL);
INSERT INTO CONFIGURA_MEDIOSMAG (COME_ITEM, COME_DESCRIPCION, COME_RESPUESTA, COME_CUENTA, COME_FORMATO, COME_MINIMO, COME_NATUR) VALUES (146, 'CONCEPTOS DEVOLUCION RETEIVA DE AÑOS ANTERIORES', '2336', NULL, 1002, 0, NULL);
INSERT INTO CONFIGURA_MEDIOSMAG (COME_ITEM, COME_DESCRIPCION, COME_RESPUESTA, COME_CUENTA, COME_FORMATO, COME_MINIMO, COME_NATUR) VALUES (150, 'CONCEPTO DEL SALDO DE TERRENOS', '1510', NULL, 1011, 0, NULL);
INSERT INTO CONFIGURA_MEDIOSMAG (COME_ITEM, COME_DESCRIPCION, COME_RESPUESTA, COME_CUENTA, COME_FORMATO, COME_MINIMO, COME_NATUR) VALUES (151, 'CONCEPTO DEL SALDO DE ACTIVOS INTANGIBLES', '1512', NULL, 1011, 0, NULL);
INSERT INTO CONFIGURA_MEDIOSMAG (COME_ITEM, COME_DESCRIPCION, COME_RESPUESTA, COME_CUENTA, COME_FORMATO, COME_MINIMO, COME_NATUR) VALUES (152, 'CONCEPTO DEL SALDO DE ACTIVOS AGOTABLES', '1513', NULL, 1011, 0, NULL);
INSERT INTO CONFIGURA_MEDIOSMAG (COME_ITEM, COME_DESCRIPCION, COME_RESPUESTA, COME_CUENTA, COME_FORMATO, COME_MINIMO, COME_NATUR) VALUES (153, 'CONCEPTO DEL SALDO DE AMORTIZACION', '1515', NULL, 1011, 0, NULL);
INSERT INTO CONFIGURA_MEDIOSMAG (COME_ITEM, COME_DESCRIPCION, COME_RESPUESTA, COME_CUENTA, COME_FORMATO, COME_MINIMO, COME_NATUR) VALUES (154, 'CONCEPTO DEL SALDO DE AGOTAMIENTO', '1516', NULL, 1011, 0, NULL);
INSERT INTO CONFIGURA_MEDIOSMAG (COME_ITEM, COME_DESCRIPCION, COME_RESPUESTA, COME_CUENTA, COME_FORMATO, COME_MINIMO, COME_NATUR) VALUES (155, 'CONCEPTO DEL SALDO DE ACTIVOS OMITIDOS', '1517', NULL, 1011, 0, NULL);
INSERT INTO CONFIGURA_MEDIOSMAG (COME_ITEM, COME_DESCRIPCION, COME_RESPUESTA, COME_CUENTA, COME_FORMATO, COME_MINIMO, COME_NATUR) VALUES (160, 'CONCEPTO SALDO INICIAL INVENTARIO ANUAL', '1401', NULL, 1011, 0, NULL);
INSERT INTO CONFIGURA_MEDIOSMAG (COME_ITEM, COME_DESCRIPCION, COME_RESPUESTA, COME_CUENTA, COME_FORMATO, COME_MINIMO, COME_NATUR) VALUES (161, 'CONCEPTO COMPRAS NETAS DEL AÑO INV. PERIODICO', '1402', NULL, 1011, 0, NULL);
INSERT INTO CONFIGURA_MEDIOSMAG (COME_ITEM, COME_DESCRIPCION, COME_RESPUESTA, COME_CUENTA, COME_FORMATO, COME_MINIMO, COME_NATUR) VALUES (162, 'CONCEPTO COSTO MANO DE OBRA DIRECTA ANUAL', '1403', NULL, 1011, 0, NULL);
INSERT INTO CONFIGURA_MEDIOSMAG (COME_ITEM, COME_DESCRIPCION, COME_RESPUESTA, COME_CUENTA, COME_FORMATO, COME_MINIMO, COME_NATUR) VALUES (163, 'CONCEPTO COSTOS INDIRECTOS FABRICACION ANUAL', '1404', NULL, 1011, 0, NULL);
INSERT INTO CONFIGURA_MEDIOSMAG (COME_ITEM, COME_DESCRIPCION, COME_RESPUESTA, COME_CUENTA, COME_FORMATO, COME_MINIMO, COME_NATUR) VALUES (164, 'CONCEPTO OTROS COSTOS INVENTARIO PERIODICO', '1405', NULL, 1011, 0, NULL);
INSERT INTO CONFIGURA_MEDIOSMAG (COME_ITEM, COME_DESCRIPCION, COME_RESPUESTA, COME_CUENTA, COME_FORMATO, COME_MINIMO, COME_NATUR) VALUES (165, 'CONCEPTO NACIMIENTOS GANADO ANUAL', '1408', NULL, 1011, 0, NULL);
INSERT INTO CONFIGURA_MEDIOSMAG (COME_ITEM, COME_DESCRIPCION, COME_RESPUESTA, COME_CUENTA, COME_FORMATO, COME_MINIMO, COME_NATUR) VALUES (166, 'CONCEPTO MUERTES GANADO ANUAL', '1409', NULL, 1011, 0, NULL);
INSERT INTO CONFIGURA_MEDIOSMAG (COME_ITEM, COME_DESCRIPCION, COME_RESPUESTA, COME_CUENTA, COME_FORMATO, COME_MINIMO, COME_NATUR) VALUES (167, 'CONCEPTO COMPRAS Y GASTOS CAPITALIZADOS GANADEROS', '1410', NULL, 1011, 0, NULL);
INSERT INTO CONFIGURA_MEDIOSMAG (COME_ITEM, COME_DESCRIPCION, COME_RESPUESTA, COME_CUENTA, COME_FORMATO, COME_MINIMO, COME_NATUR) VALUES (168, 'CONCEPTO VALORIZACIONES DE GANADO BOVINO', '1411', NULL, 1011, 0, NULL);
INSERT INTO CONFIGURA_MEDIOSMAG (COME_ITEM, COME_DESCRIPCION, COME_RESPUESTA, COME_CUENTA, COME_FORMATO, COME_MINIMO, COME_NATUR) VALUES (169, 'CONCEPTO VALOR DEL INVENTARIO FINAL GANADO', '1412', NULL, 1011, 0, NULL);
INSERT INTO CONFIGURA_MEDIOSMAG (COME_ITEM, COME_DESCRIPCION, COME_RESPUESTA, COME_CUENTA, COME_FORMATO, COME_MINIMO, COME_NATUR) VALUES (170, 'CONCEPTO VALOR DEL INVENTARIO INICIAL GANDO', '1413', NULL, 1011, 0, NULL);
INSERT INTO CONFIGURA_MEDIOSMAG (COME_ITEM, COME_DESCRIPCION, COME_RESPUESTA, COME_CUENTA, COME_FORMATO, COME_MINIMO, COME_NATUR) VALUES (180, 'CONCEPTO INGRESO POR RENDIMIENTOS NO CONSTITUTIVOS', '8002', NULL, 1011, 0, NULL);
INSERT INTO CONFIGURA_MEDIOSMAG (COME_ITEM, COME_DESCRIPCION, COME_RESPUESTA, COME_CUENTA, COME_FORMATO, COME_MINIMO, COME_NATUR) VALUES (181, 'CONCEPTO OTROS INGRESOS NO CONTITUTIVOS DE RENTA', '8003', NULL, 1011, 0, NULL);
INSERT INTO CONFIGURA_MEDIOSMAG (COME_ITEM, COME_DESCRIPCION, COME_RESPUESTA, COME_CUENTA, COME_FORMATO, COME_MINIMO, COME_NATUR) VALUES (182, 'CONCEPTO RENTAS EXENTAS POR SERVICIOS HOTELEROS', '8101', NULL, 1011, 0, NULL);
INSERT INTO CONFIGURA_MEDIOSMAG (COME_ITEM, COME_DESCRIPCION, COME_RESPUESTA, COME_CUENTA, COME_FORMATO, COME_MINIMO, COME_NATUR) VALUES (183, 'CONCEPTO RENTAS EXENTAS LEY PAEZ', '8102', NULL, 1011, 0, NULL);
INSERT INTO CONFIGURA_MEDIOSMAG (COME_ITEM, COME_DESCRIPCION, COME_RESPUESTA, COME_CUENTA, COME_FORMATO, COME_MINIMO, COME_NATUR) VALUES (184, 'CONCEPTO RENTAS EXENTAS EJE CAFETERO', '8103', NULL, 1011, 0, NULL);
INSERT INTO CONFIGURA_MEDIOSMAG (COME_ITEM, COME_DESCRIPCION, COME_RESPUESTA, COME_CUENTA, COME_FORMATO, COME_MINIMO, COME_NATUR) VALUES (185, 'CONCEPTO RENTAS EXENTAS VENTA ENERGIA', '8104', NULL, 1011, 0, NULL);
INSERT INTO CONFIGURA_MEDIOSMAG (COME_ITEM, COME_DESCRIPCION, COME_RESPUESTA, COME_CUENTA, COME_FORMATO, COME_MINIMO, COME_NATUR) VALUES (186, 'CONCEPTO RENTAS EXENTAS SERVICIOS DE ECOTURISMO', '8105', NULL, 1011, 0, NULL);
INSERT INTO CONFIGURA_MEDIOSMAG (COME_ITEM, COME_DESCRIPCION, COME_RESPUESTA, COME_CUENTA, COME_FORMATO, COME_MINIMO, COME_NATUR) VALUES (187, 'CONCEPTO RENTAS EXENTAS NUEVAS PLANTACIONES FORESTALES', '8106', NULL, 1011, 0, NULL);
INSERT INTO CONFIGURA_MEDIOSMAG (COME_ITEM, COME_DESCRIPCION, COME_RESPUESTA, COME_CUENTA, COME_FORMATO, COME_MINIMO, COME_NATUR) VALUES (188, 'CONCEPTO RENTAS EXENTAS PROD. MEDICIONALES Y SOFTWARE', '8107', NULL, 1011, 0, NULL);
INSERT INTO CONFIGURA_MEDIOSMAG (COME_ITEM, COME_DESCRIPCION, COME_RESPUESTA, COME_CUENTA, COME_FORMATO, COME_MINIMO, COME_NATUR) VALUES (189, 'CONCEPTO RENTAS EXENTAS TRANSPORTE FLUVIAL', '8109', NULL, 1011, 0, NULL);
INSERT INTO CONFIGURA_MEDIOSMAG (COME_ITEM, COME_DESCRIPCION, COME_RESPUESTA, COME_CUENTA, COME_FORMATO, COME_MINIMO, COME_NATUR) VALUES (190, 'CONCPETO RENTAS EXENTAS LEASING VIVIENDA', '8110', NULL, 1011, 0, NULL);
INSERT INTO CONFIGURA_MEDIOSMAG (COME_ITEM, COME_DESCRIPCION, COME_RESPUESTA, COME_CUENTA, COME_FORMATO, COME_MINIMO, COME_NATUR) VALUES (191, 'CONCEPTO RENTAS EXENTAS LEY 388 DE 1997', '8111', NULL, 1011, 0, NULL);
INSERT INTO CONFIGURA_MEDIOSMAG (COME_ITEM, COME_DESCRIPCION, COME_RESPUESTA, COME_CUENTA, COME_FORMATO, COME_MINIMO, COME_NATUR) VALUES (192, 'CONCEPTO RENTAS EXENTAS JUEGOS DE SUERTE Y AZAR', '8114', NULL, 1011, 0, NULL);
INSERT INTO CONFIGURA_MEDIOSMAG (COME_ITEM, COME_DESCRIPCION, COME_RESPUESTA, COME_CUENTA, COME_FORMATO, COME_MINIMO, COME_NATUR) VALUES (193, 'CONCEPTO RENTAS EXENTAS ASFALTOS LEY 30/82', '8118', NULL, 1011, 0, NULL);
INSERT INTO CONFIGURA_MEDIOSMAG (COME_ITEM, COME_DESCRIPCION, COME_RESPUESTA, COME_CUENTA, COME_FORMATO, COME_MINIMO, COME_NATUR) VALUES (194, 'CONCEPTO RENTAS EXENTAS TITULARIZACION DE CARTERA HIPOTECARI', '8116', NULL, 1011, 0, NULL);
INSERT INTO CONFIGURA_MEDIOSMAG (COME_ITEM, COME_DESCRIPCION, COME_RESPUESTA, COME_CUENTA, COME_FORMATO, COME_MINIMO, COME_NATUR) VALUES (195, 'CONCEPTO RENTAS EXENTAS POR INCENTIVOS A FINANCIACION VIS', '8117', NULL, 1011, 0, NULL);
INSERT INTO CONFIGURA_MEDIOSMAG (COME_ITEM, COME_DESCRIPCION, COME_RESPUESTA, COME_CUENTA, COME_FORMATO, COME_MINIMO, COME_NATUR) VALUES (196, 'CONCEPTO RENTAS EXENTAS SERVICIOS EXTERIOR LEY 677/01', '8119', NULL, 1011, 0, NULL);
INSERT INTO CONFIGURA_MEDIOSMAG (COME_ITEM, COME_DESCRIPCION, COME_RESPUESTA, COME_CUENTA, COME_FORMATO, COME_MINIMO, COME_NATUR) VALUES (197, 'CONCEPTO RENTAS EXENTAS INDUSTRIA EDITORIAL', '8115', NULL, 1011, 0, NULL);
INSERT INTO CONFIGURA_MEDIOSMAG (COME_ITEM, COME_DESCRIPCION, COME_RESPUESTA, COME_CUENTA, COME_FORMATO, COME_MINIMO, COME_NATUR) VALUES (198, 'CONCEPTO OTRAS RENTAS EXENTAS', '8108', NULL, 1011, 0, NULL);
INSERT INTO CONFIGURA_MEDIOSMAG (COME_ITEM, COME_DESCRIPCION, COME_RESPUESTA, COME_CUENTA, COME_FORMATO, COME_MINIMO, COME_NATUR) VALUES (199, 'CONCEPTO RENTAS EXENTAS DOBLE TRIBUTACION', '8120', NULL, 1011, 0, NULL);
INSERT INTO CONFIGURA_MEDIOSMAG (COME_ITEM, COME_DESCRIPCION, COME_RESPUESTA, COME_CUENTA, COME_FORMATO, COME_MINIMO, COME_NATUR) VALUES (200, 'CONCEPTOS DEDUCCION ACTIVOS FIJOS PRODUCTIVOS', '8200', NULL, 1011, 0, NULL);
INSERT INTO CONFIGURA_MEDIOSMAG (COME_ITEM, COME_DESCRIPCION, COME_RESPUESTA, COME_CUENTA, COME_FORMATO, COME_MINIMO, COME_NATUR) VALUES (201, 'CONCEPTOS DEDUCCION PERDIDAS DEL EJERCICIO', '8201', NULL, 1011, 0, NULL);
INSERT INTO CONFIGURA_MEDIOSMAG (COME_ITEM, COME_DESCRIPCION, COME_RESPUESTA, COME_CUENTA, COME_FORMATO, COME_MINIMO, COME_NATUR) VALUES (202, 'CONCEPTOS DEDUCCION MEJORAMIENTO MEDIO AMBIENTE', '8202', NULL, 1011, 0, NULL);
INSERT INTO CONFIGURA_MEDIOSMAG (COME_ITEM, COME_DESCRIPCION, COME_RESPUESTA, COME_CUENTA, COME_FORMATO, COME_MINIMO, COME_NATUR) VALUES (203, 'CONCEPTOS DEDUCCION NUEVAS PLANTACIONES', '8203', NULL, 1011, 0, NULL);
INSERT INTO CONFIGURA_MEDIOSMAG (COME_ITEM, COME_DESCRIPCION, COME_RESPUESTA, COME_CUENTA, COME_FORMATO, COME_MINIMO, COME_NATUR) VALUES (204, 'CONCEPTOS DEDUCCION DESARROLLO CIENTIFICO', '8204', NULL, 1011, 0, NULL);
INSERT INTO CONFIGURA_MEDIOSMAG (COME_ITEM, COME_DESCRIPCION, COME_RESPUESTA, COME_CUENTA, COME_FORMATO, COME_MINIMO, COME_NATUR) VALUES (205, 'CONCEPTOS DEDUCCION PROVISION DEUDAS DE DIFICIL COBRO', '8205', NULL, 1011, 0, NULL);

COMMIT WORK;

INSERT INTO MEDIOSMAG_ARCHIVOS (MEDM_FORMATO, MEDM_NOMBRE, MEDM_VERSION, MEDM_VALOR1, MEDM_VALOR2) VALUES (1001, '1001 - PAGOS O ABONOS EN CUENTA', '07', 'PAGO', 'NO DEDUC');
INSERT INTO MEDIOSMAG_ARCHIVOS (MEDM_FORMATO, MEDM_NOMBRE, MEDM_VERSION, MEDM_VALOR1, MEDM_VALOR2) VALUES (1002, '1002 - RETENCIONES EN LA FUENTE PRACTICADAS', '07', 'BASE', 'RETENCION');
INSERT INTO MEDIOSMAG_ARCHIVOS (MEDM_FORMATO, MEDM_NOMBRE, MEDM_VERSION, MEDM_VALOR1, MEDM_VALOR2) VALUES (1003, '1003 - RETENCIONES EN LA FUENTE QUE LE PRACTICARON', '06', 'RETENCION', NULL);
INSERT INTO MEDIOSMAG_ARCHIVOS (MEDM_FORMATO, MEDM_NOMBRE, MEDM_VERSION, MEDM_VALOR1, MEDM_VALOR2) VALUES (1005, '1005 - IMPUESTO A LAS VENTAS DESCONTABLE', '06', 'VR.IMPUESTO', NULL);
INSERT INTO MEDIOSMAG_ARCHIVOS (MEDM_FORMATO, MEDM_NOMBRE, MEDM_VERSION, MEDM_VALOR1, MEDM_VALOR2) VALUES (1006, '1006 - IMPUESTO A LAS VENTAS GENERADO', '06', 'VR.IMPUESTO', NULL);
INSERT INTO MEDIOSMAG_ARCHIVOS (MEDM_FORMATO, MEDM_NOMBRE, MEDM_VERSION, MEDM_VALOR1, MEDM_VALOR2) VALUES (1007, '1007 - INGRESOS RECIBIDOS', '07', 'INGRESOS', 'DEVOLUCIONES');
INSERT INTO MEDIOSMAG_ARCHIVOS (MEDM_FORMATO, MEDM_NOMBRE, MEDM_VERSION, MEDM_VALOR1, MEDM_VALOR2) VALUES (1008, '1008 - SALDOS DE CUENTAS POR COBRAR A DIC.31', '07', 'SALDO', NULL);
INSERT INTO MEDIOSMAG_ARCHIVOS (MEDM_FORMATO, MEDM_NOMBRE, MEDM_VERSION, MEDM_VALOR1, MEDM_VALOR2) VALUES (1009, '1009 - SALDOS DE CUENTAS POR PAGAR A DIC.31', '07', 'SALDO', NULL);
INSERT INTO MEDIOSMAG_ARCHIVOS (MEDM_FORMATO, MEDM_NOMBRE, MEDM_VERSION, MEDM_VALOR1, MEDM_VALOR2) VALUES (1010, '1010 - INFORMACION DE SOCIOS Y ACCIONISTAS', '07', 'VR.PATRIMONIAL', 'VR.DIVIDENDOS');
INSERT INTO MEDIOSMAG_ARCHIVOS (MEDM_FORMATO, MEDM_NOMBRE, MEDM_VERSION, MEDM_VALOR1, MEDM_VALOR2) VALUES (1011, '1011 - INFORMACION DE LAS DECLARACIONES TRIBUTARIAS', '06', 'SALDO', NULL);
INSERT INTO MEDIOSMAG_ARCHIVOS (MEDM_FORMATO, MEDM_NOMBRE, MEDM_VERSION, MEDM_VALOR1, MEDM_VALOR2) VALUES (1012, '1012 - INF. DEC. TRIBUTARIAS-ACCIONES,INVERSIONES,BANCOS', '07', 'VALOR', NULL);

COMMIT WORK;

INSERT INTO MEDIOSMAG_CUENTAS (MMCU_ITEM, MMCU_CUENTA, MMCU_CONS) VALUES (21, '510506', 1);
INSERT INTO MEDIOSMAG_CUENTAS (MMCU_ITEM, MMCU_CUENTA, MMCU_CONS) VALUES (21, '510515', 2);
INSERT INTO MEDIOSMAG_CUENTAS (MMCU_ITEM, MMCU_CUENTA, MMCU_CONS) VALUES (22, '5110', 4);
INSERT INTO MEDIOSMAG_CUENTAS (MMCU_ITEM, MMCU_CUENTA, MMCU_CONS) VALUES (24, '5135', 5);
INSERT INTO MEDIOSMAG_CUENTAS (MMCU_ITEM, MMCU_CUENTA, MMCU_CONS) VALUES (25, '5120', 7);
INSERT INTO MEDIOSMAG_CUENTAS (MMCU_ITEM, MMCU_CUENTA, MMCU_CONS) VALUES (23, '529505', 9);
INSERT INTO MEDIOSMAG_CUENTAS (MMCU_ITEM, MMCU_CUENTA, MMCU_CONS) VALUES (26, '530520', 10);
INSERT INTO MEDIOSMAG_CUENTAS (MMCU_ITEM, MMCU_CUENTA, MMCU_CONS) VALUES (28, '1504', 11);
INSERT INTO MEDIOSMAG_CUENTAS (MMCU_ITEM, MMCU_CUENTA, MMCU_CONS) VALUES (28, '1508', 12);
INSERT INTO MEDIOSMAG_CUENTAS (MMCU_ITEM, MMCU_CUENTA, MMCU_CONS) VALUES (28, '1516', 13);
INSERT INTO MEDIOSMAG_CUENTAS (MMCU_ITEM, MMCU_CUENTA, MMCU_CONS) VALUES (27, '1524', 14);
INSERT INTO MEDIOSMAG_CUENTAS (MMCU_ITEM, MMCU_CUENTA, MMCU_CONS) VALUES (27, '1528', 15);
INSERT INTO MEDIOSMAG_CUENTAS (MMCU_ITEM, MMCU_CUENTA, MMCU_CONS) VALUES (27, '1540', 16);
INSERT INTO MEDIOSMAG_CUENTAS (MMCU_ITEM, MMCU_CUENTA, MMCU_CONS) VALUES (29, '17', 17);
INSERT INTO MEDIOSMAG_CUENTAS (MMCU_ITEM, MMCU_CUENTA, MMCU_CONS) VALUES (30, '510572', 19);
INSERT INTO MEDIOSMAG_CUENTAS (MMCU_ITEM, MMCU_CUENTA, MMCU_CONS) VALUES (30, '510575', 20);
INSERT INTO MEDIOSMAG_CUENTAS (MMCU_ITEM, MMCU_CUENTA, MMCU_CONS) VALUES (30, '510578', 21);
INSERT INTO MEDIOSMAG_CUENTAS (MMCU_ITEM, MMCU_CUENTA, MMCU_CONS) VALUES (31, '510568', 23);
INSERT INTO MEDIOSMAG_CUENTAS (MMCU_ITEM, MMCU_CUENTA, MMCU_CONS) VALUES (31, '510569', 24);
INSERT INTO MEDIOSMAG_CUENTAS (MMCU_ITEM, MMCU_CUENTA, MMCU_CONS) VALUES (32, '510570', 25);
INSERT INTO MEDIOSMAG_CUENTAS (MMCU_ITEM, MMCU_CUENTA, MMCU_CONS) VALUES (33, '539525', 26);
INSERT INTO MEDIOSMAG_CUENTAS (MMCU_ITEM, MMCU_CUENTA, MMCU_CONS) VALUES (35, '5115', 28);
INSERT INTO MEDIOSMAG_CUENTAS (MMCU_ITEM, MMCU_CUENTA, MMCU_CONS) VALUES (35, '5215', 29);
INSERT INTO MEDIOSMAG_CUENTAS (MMCU_ITEM, MMCU_CUENTA, MMCU_CONS) VALUES (36, '5195', 30);
INSERT INTO MEDIOSMAG_CUENTAS (MMCU_ITEM, MMCU_CUENTA, MMCU_CONS) VALUES (38, '17', 31);
INSERT INTO MEDIOSMAG_CUENTAS (MMCU_ITEM, MMCU_CUENTA, MMCU_CONS) VALUES (1, '236505', 32);
INSERT INTO MEDIOSMAG_CUENTAS (MMCU_ITEM, MMCU_CUENTA, MMCU_CONS) VALUES (2, '236540', 33);
INSERT INTO MEDIOSMAG_CUENTAS (MMCU_ITEM, MMCU_CUENTA, MMCU_CONS) VALUES (3, '236520', 34);
INSERT INTO MEDIOSMAG_CUENTAS (MMCU_ITEM, MMCU_CUENTA, MMCU_CONS) VALUES (4, '236515', 35);
INSERT INTO MEDIOSMAG_CUENTAS (MMCU_ITEM, MMCU_CUENTA, MMCU_CONS) VALUES (5, '236525', 36);
INSERT INTO MEDIOSMAG_CUENTAS (MMCU_ITEM, MMCU_CUENTA, MMCU_CONS) VALUES (6, '236530', 37);
INSERT INTO MEDIOSMAG_CUENTAS (MMCU_ITEM, MMCU_CUENTA, MMCU_CONS) VALUES (7, '236535', 38);
INSERT INTO MEDIOSMAG_CUENTAS (MMCU_ITEM, MMCU_CUENTA, MMCU_CONS) VALUES (8, '236510', 39);
INSERT INTO MEDIOSMAG_CUENTAS (MMCU_ITEM, MMCU_CUENTA, MMCU_CONS) VALUES (9, '236560', 40);
INSERT INTO MEDIOSMAG_CUENTAS (MMCU_ITEM, MMCU_CUENTA, MMCU_CONS) VALUES (11, '236545', 41);
INSERT INTO MEDIOSMAG_CUENTAS (MMCU_ITEM, MMCU_CUENTA, MMCU_CONS) VALUES (13, '236570', 42);
INSERT INTO MEDIOSMAG_CUENTAS (MMCU_ITEM, MMCU_CUENTA, MMCU_CONS) VALUES (14, '236575', 43);
INSERT INTO MEDIOSMAG_CUENTAS (MMCU_ITEM, MMCU_CUENTA, MMCU_CONS) VALUES (19, '2367', 45);
INSERT INTO MEDIOSMAG_CUENTAS (MMCU_ITEM, MMCU_CUENTA, MMCU_CONS) VALUES (18, '0', 44);
INSERT INTO MEDIOSMAG_CUENTAS (MMCU_ITEM, MMCU_CUENTA, MMCU_CONS) VALUES (41, '0', 48);
INSERT INTO MEDIOSMAG_CUENTAS (MMCU_ITEM, MMCU_CUENTA, MMCU_CONS) VALUES (42, '135515', 50);
INSERT INTO MEDIOSMAG_CUENTAS (MMCU_ITEM, MMCU_CUENTA, MMCU_CONS) VALUES (111, '240810', 51);
INSERT INTO MEDIOSMAG_CUENTAS (MMCU_ITEM, MMCU_CUENTA, MMCU_CONS) VALUES (115, '240805', 52);
INSERT INTO MEDIOSMAG_CUENTAS (MMCU_ITEM, MMCU_CUENTA, MMCU_CONS) VALUES (51, '41', 53);
INSERT INTO MEDIOSMAG_CUENTAS (MMCU_ITEM, MMCU_CUENTA, MMCU_CONS) VALUES (53, '4210', 55);
INSERT INTO MEDIOSMAG_CUENTAS (MMCU_ITEM, MMCU_CUENTA, MMCU_CONS) VALUES (52, '4205', 54);
INSERT INTO MEDIOSMAG_CUENTAS (MMCU_ITEM, MMCU_CUENTA, MMCU_CONS) VALUES (52, '4215', 56);
INSERT INTO MEDIOSMAG_CUENTAS (MMCU_ITEM, MMCU_CUENTA, MMCU_CONS) VALUES (52, '4220', 57);
INSERT INTO MEDIOSMAG_CUENTAS (MMCU_ITEM, MMCU_CUENTA, MMCU_CONS) VALUES (52, '4225', 58);
INSERT INTO MEDIOSMAG_CUENTAS (MMCU_ITEM, MMCU_CUENTA, MMCU_CONS) VALUES (52, '4230', 59);
INSERT INTO MEDIOSMAG_CUENTAS (MMCU_ITEM, MMCU_CUENTA, MMCU_CONS) VALUES (52, '4235', 60);
INSERT INTO MEDIOSMAG_CUENTAS (MMCU_ITEM, MMCU_CUENTA, MMCU_CONS) VALUES (52, '4240', 61);
INSERT INTO MEDIOSMAG_CUENTAS (MMCU_ITEM, MMCU_CUENTA, MMCU_CONS) VALUES (52, '4245', 62);
INSERT INTO MEDIOSMAG_CUENTAS (MMCU_ITEM, MMCU_CUENTA, MMCU_CONS) VALUES (52, '4248', 63);
INSERT INTO MEDIOSMAG_CUENTAS (MMCU_ITEM, MMCU_CUENTA, MMCU_CONS) VALUES (52, '4250', 64);
INSERT INTO MEDIOSMAG_CUENTAS (MMCU_ITEM, MMCU_CUENTA, MMCU_CONS) VALUES (52, '4255', 65);
INSERT INTO MEDIOSMAG_CUENTAS (MMCU_ITEM, MMCU_CUENTA, MMCU_CONS) VALUES (52, '4295', 66);
INSERT INTO MEDIOSMAG_CUENTAS (MMCU_ITEM, MMCU_CUENTA, MMCU_CONS) VALUES (61, '1305', 67);
INSERT INTO MEDIOSMAG_CUENTAS (MMCU_ITEM, MMCU_CUENTA, MMCU_CONS) VALUES (62, '1325', 69);
INSERT INTO MEDIOSMAG_CUENTAS (MMCU_ITEM, MMCU_CUENTA, MMCU_CONS) VALUES (63, '1310', 70);
INSERT INTO MEDIOSMAG_CUENTAS (MMCU_ITEM, MMCU_CUENTA, MMCU_CONS) VALUES (63, '1315', 74);
INSERT INTO MEDIOSMAG_CUENTAS (MMCU_ITEM, MMCU_CUENTA, MMCU_CONS) VALUES (63, '1320', 75);
INSERT INTO MEDIOSMAG_CUENTAS (MMCU_ITEM, MMCU_CUENTA, MMCU_CONS) VALUES (63, '1323', 76);
INSERT INTO MEDIOSMAG_CUENTAS (MMCU_ITEM, MMCU_CUENTA, MMCU_CONS) VALUES (63, '1328', 77);
INSERT INTO MEDIOSMAG_CUENTAS (MMCU_ITEM, MMCU_CUENTA, MMCU_CONS) VALUES (63, '1330', 79);
INSERT INTO MEDIOSMAG_CUENTAS (MMCU_ITEM, MMCU_CUENTA, MMCU_CONS) VALUES (63, '1332', 80);
INSERT INTO MEDIOSMAG_CUENTAS (MMCU_ITEM, MMCU_CUENTA, MMCU_CONS) VALUES (63, '1335', 81);
INSERT INTO MEDIOSMAG_CUENTAS (MMCU_ITEM, MMCU_CUENTA, MMCU_CONS) VALUES (63, '1340', 82);
INSERT INTO MEDIOSMAG_CUENTAS (MMCU_ITEM, MMCU_CUENTA, MMCU_CONS) VALUES (63, '1345', 83);
INSERT INTO MEDIOSMAG_CUENTAS (MMCU_ITEM, MMCU_CUENTA, MMCU_CONS) VALUES (63, '1350', 84);
INSERT INTO MEDIOSMAG_CUENTAS (MMCU_ITEM, MMCU_CUENTA, MMCU_CONS) VALUES (63, '1355', 85);
INSERT INTO MEDIOSMAG_CUENTAS (MMCU_ITEM, MMCU_CUENTA, MMCU_CONS) VALUES (63, '1360', 86);
INSERT INTO MEDIOSMAG_CUENTAS (MMCU_ITEM, MMCU_CUENTA, MMCU_CONS) VALUES (63, '1365', 87);
INSERT INTO MEDIOSMAG_CUENTAS (MMCU_ITEM, MMCU_CUENTA, MMCU_CONS) VALUES (63, '1370', 88);
INSERT INTO MEDIOSMAG_CUENTAS (MMCU_ITEM, MMCU_CUENTA, MMCU_CONS) VALUES (63, '1380', 89);
INSERT INTO MEDIOSMAG_CUENTAS (MMCU_ITEM, MMCU_CUENTA, MMCU_CONS) VALUES (63, '1385', 90);
INSERT INTO MEDIOSMAG_CUENTAS (MMCU_ITEM, MMCU_CUENTA, MMCU_CONS) VALUES (64, '1390', 91);
INSERT INTO MEDIOSMAG_CUENTAS (MMCU_ITEM, MMCU_CUENTA, MMCU_CONS) VALUES (71, '22', 92);
INSERT INTO MEDIOSMAG_CUENTAS (MMCU_ITEM, MMCU_CUENTA, MMCU_CONS) VALUES (72, '2355', 93);
INSERT INTO MEDIOSMAG_CUENTAS (MMCU_ITEM, MMCU_CUENTA, MMCU_CONS) VALUES (73, '21', 94);
INSERT INTO MEDIOSMAG_CUENTAS (MMCU_ITEM, MMCU_CUENTA, MMCU_CONS) VALUES (74, '24', 95);
INSERT INTO MEDIOSMAG_CUENTAS (MMCU_ITEM, MMCU_CUENTA, MMCU_CONS) VALUES (75, '25', 97);
INSERT INTO MEDIOSMAG_CUENTAS (MMCU_ITEM, MMCU_CUENTA, MMCU_CONS) VALUES (76, '2305', 96);
INSERT INTO MEDIOSMAG_CUENTAS (MMCU_ITEM, MMCU_CUENTA, MMCU_CONS) VALUES (76, '2310', 98);
INSERT INTO MEDIOSMAG_CUENTAS (MMCU_ITEM, MMCU_CUENTA, MMCU_CONS) VALUES (76, '2315', 99);
INSERT INTO MEDIOSMAG_CUENTAS (MMCU_ITEM, MMCU_CUENTA, MMCU_CONS) VALUES (76, '2330', 100);
INSERT INTO MEDIOSMAG_CUENTAS (MMCU_ITEM, MMCU_CUENTA, MMCU_CONS) VALUES (76, '2335', 101);
INSERT INTO MEDIOSMAG_CUENTAS (MMCU_ITEM, MMCU_CUENTA, MMCU_CONS) VALUES (76, '2340', 102);
INSERT INTO MEDIOSMAG_CUENTAS (MMCU_ITEM, MMCU_CUENTA, MMCU_CONS) VALUES (76, '2345', 103);
INSERT INTO MEDIOSMAG_CUENTAS (MMCU_ITEM, MMCU_CUENTA, MMCU_CONS) VALUES (76, '2350', 104);
INSERT INTO MEDIOSMAG_CUENTAS (MMCU_ITEM, MMCU_CUENTA, MMCU_CONS) VALUES (76, '2357', 105);
INSERT INTO MEDIOSMAG_CUENTAS (MMCU_ITEM, MMCU_CUENTA, MMCU_CONS) VALUES (76, '2360', 106);
INSERT INTO MEDIOSMAG_CUENTAS (MMCU_ITEM, MMCU_CUENTA, MMCU_CONS) VALUES (76, '2365', 107);
INSERT INTO MEDIOSMAG_CUENTAS (MMCU_ITEM, MMCU_CUENTA, MMCU_CONS) VALUES (76, '2370', 108);
INSERT INTO MEDIOSMAG_CUENTAS (MMCU_ITEM, MMCU_CUENTA, MMCU_CONS) VALUES (76, '2375', 109);
INSERT INTO MEDIOSMAG_CUENTAS (MMCU_ITEM, MMCU_CUENTA, MMCU_CONS) VALUES (76, '2380', 110);
INSERT INTO MEDIOSMAG_CUENTAS (MMCU_ITEM, MMCU_CUENTA, MMCU_CONS) VALUES (81, '1105', 112);
INSERT INTO MEDIOSMAG_CUENTAS (MMCU_ITEM, MMCU_CUENTA, MMCU_CONS) VALUES (160, '14', 113);

COMMIT WORK;

INSERT INTO TIPO_ID (TIID_COD, TIID_NOM, TIID_CODIGO) VALUES ('S', 'EXTRANJERO SIN DOCUMENTO', 43);

COMMIT WORK;

SET TERM ^ ;

CREATE OR ALTER PROCEDURE MM_1001(
    INICIO CHAR(8),
    FINAL CHAR(8))
AS
declare variable IDCONC INTEGER;
declare variable CONCEPTO INTEGER;
declare variable TIPODOC INTEGER;
declare variable NIT VARCHAR(15) CHARACTER SET NONE;
declare variable DV CHAR(1) CHARACTER SET NONE;
declare variable APELLIDO1 VARCHAR(60) CHARACTER SET NONE;
declare variable APELLIDO2 VARCHAR(60) CHARACTER SET NONE;
declare variable NOMBRE1 VARCHAR(60) CHARACTER SET NONE;
declare variable NOMBRE2 VARCHAR(60) CHARACTER SET NONE;
declare variable RAZONSOCIAL VARCHAR(450) CHARACTER SET NONE;
declare variable DIRECCION VARCHAR(200) CHARACTER SET NONE;
declare variable DEPARTAMENTO CHAR(2) CHARACTER SET NONE;
declare variable MUNICIPIO CHAR(3) CHARACTER SET NONE;
declare variable PAIS CHAR(3) CHARACTER SET NONE;
declare variable PAGO NUMERIC(18,0);
declare variable DEBITOS NUMERIC(18,2);
declare variable CREDITOS NUMERIC(18,2);
declare variable MINIMO NUMERIC(18,2);
declare variable MENORCUANTIA NUMERIC(18,2);
declare variable TOTALTERC NUMERIC(18,2);
declare variable ITEM integer;
declare variable DIRMENOR VARCHAR(200) CHARACTER SET NONE;
declare variable DEPMENOR CHAR(2) CHARACTER SET NONE;
declare variable MUNMENOR CHAR(3) CHARACTER SET NONE;
declare variable PAISMENOR CHAR(3) CHARACTER SET NONE;
declare variable NATUR CHAR(1);
begin
EXECUTE PROCEDURE lee_configuracion('CONTABILIDAD', 'GENERAL', 'NIT COMPAÑIA') returning_values (:NIT);
SELECT TERC_DIR, SUBSTR(CIUD_COD,1,2), SUBSTR(CIUD_COD,3,5), PAIS_ID FROM TERCEROS WHERE TERC_NIT = :NIT
    INTO :dirmenor, :depmenor, :munmenor, :paismenor;
ITEM = 0;
FOR SELECT COME_ITEM, COME_RESPUESTA, COME_MINIMO, COME_NATUR FROM CONFIGURA_MEDIOSMAG
    WHERE COME_FORMATO = '1001' INTO :idconc, :CONCEPTO , :MINIMO, :NATUR
    DO
    BEGIN
    MENORCUANTIA = 0;
    FOR SELECT MAX(D.TERC_NIT), SUM(CODE_DEBITO-CODE_CREDITO), SUM(CODE_DEBITO), SUM(CODE_CREDITO)
        FROM COMPROBANTE_DETALLE D, COMPROBANTE_ENCABEZADO E, mediosmag_cuentas M
        WHERE M.mmcu_item = :idconc AND SUBSTR(CUEN_COD,1,STRLEN(M.mmcu_cuenta)) = M.mmcu_cuenta AND
        E.ENCO_CONSEC = D.ENCO_CONSEC AND ENCO_FECHA >= :INICIO AND ENCO_FECHA <= :FINAL AND
        ((CODE_CREDITO <> 0) or (CODE_DEBITO <> 0))
        GROUP BY D.TERC_NIT
        INTO :NIT, :PAGO, :debitos, :creditos
        DO
        BEGIN
        if (NATUR = 'D') then
            pago = debitos;
        if (NATUR = 'C') then
            pago = creditos;
        execute procedure TOTAL_PAGOS_TERCERO_ANO (:NIT, :INICIO, :FINAL) returning_values (:TOTALTERC);
        if ((TOTALTERC >= :MINIMO) AND (PAGO > 0)) then
            BEGIN
            SELECT TERC_NOM, TERC_NOMBRE1, TERC_NOMBRE2, TERC_APELLIDO1, TERC_APELLIDO2, TERC_DV, TIID_CODIGO,
                TERC_DIR, SUBSTR(CIUD_COD,1,2), SUBSTR(CIUD_COD,3,5), PAIS_ID
                FROM TERCEROS T left outer join TIPO_ID IT on (T.TERC_TIPOID = IT.TIID_COD) WHERE TERC_NIT = :NIT
                INTO :RAZONSOCIAL, :NOMBRE1, :NOMBRE2, :APELLIDO1, :APELLIDO2, :DV, :TIPODOC, :DIRECCION, :DEPARTAMENTO, :MUNICIPIO, :PAIS;
            ITEM = ITEM + 1;
            insert into medios_magneticos_datos (memg_formato, memg_ano, memg_item, memg_concepto, memg_tipodoc, memg_nit, memg_dv,memg_apellido1, memg_apellido2, 
                memg_nombre1, memg_nombre2, memg_razonsocial, memg_direccion, memg_departamento, memg_municipio, memg_pago, memg_pais)
                values (1001, substr(:inicio,1,4), :item,  :concepto, :tipodoc, :nit, :dv, :apellido1, :apellido2,
                :nombre1, :nombre2, :razonsocial, :direccion, :departamento, :municipio, :pago, :pais);
            END
        ELSE
            MENORCUANTIA = MENORCUANTIA + PAGO;
        END
    if (MENORCUANTIA <> 0) then
        BEGIN
        ITEM = ITEM + 1;
        insert into medios_magneticos_datos (memg_formato, memg_ano, memg_item, memg_concepto, memg_tipodoc, memg_nit, memg_dv,memg_apellido1, memg_apellido2,
            memg_nombre1, memg_nombre2, memg_razonsocial, memg_direccion, memg_departamento, memg_municipio, memg_pago, memg_pais)
            values (1001, substr(:inicio,1,4), :item,  :concepto, 43, '222222222', '', '', '',
            '', '', 'CUANTIAS MENORES', :dirmenor, :depmenor, :munmenor, :menorcuantia, :paismenor);
        END
    END

end
^

SET TERM ; ^

SET TERM ^ ;

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

SET TERM ; ^

SET TERM ^ ;

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

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER PROCEDURE MM_1005(
    INICIO CHAR(8),
    FINAL CHAR(8))
AS
declare variable TIPODOC INTEGER;
declare variable NIT VARCHAR(15) CHARACTER SET NONE;
declare variable DV CHAR(1) CHARACTER SET NONE;
declare variable APELLIDO1 VARCHAR(60) CHARACTER SET NONE;
declare variable APELLIDO2 VARCHAR(60) CHARACTER SET NONE;
declare variable NOMBRE1 VARCHAR(60) CHARACTER SET NONE;
declare variable NOMBRE2 VARCHAR(60) CHARACTER SET NONE;
declare variable RAZONSOCIAL VARCHAR(450) CHARACTER SET NONE;
declare variable IVA NUMERIC(18,0);
declare variable ITEM INTEGER;
begin
ITEM = 0;
/* IVA DESCONTABLE */
FOR SELECT MAX(D.TERC_NIT), SUM(CODE_DEBITO-CODE_CREDITO)
    FROM COMPROBANTE_DETALLE D, COMPROBANTE_ENCABEZADO E, mediosmag_cuentas M
    WHERE M.mmcu_item = 111 AND SUBSTR(CUEN_COD,1,STRLEN(M.mmcu_cuenta)) = M.mmcu_cuenta AND
    E.ENCO_CONSEC = D.ENCO_CONSEC AND ENCO_FECHA >= :INICIO AND ENCO_FECHA <= :FINAL
    GROUP BY D.TERC_NIT
    INTO :NIT, :IVA
    DO
    BEGIN
    if (IVA > 0) then
        BEGIN
        SELECT TERC_NOM, TERC_NOMBRE1, TERC_NOMBRE2, TERC_APELLIDO1, TERC_APELLIDO2, TERC_DV, TIID_CODIGO
            FROM TERCEROS T left outer join TIPO_ID IT on (T.TERC_TIPOID = IT.TIID_COD) WHERE TERC_NIT = :NIT
            INTO :RAZONSOCIAL, :NOMBRE1, :NOMBRE2, :APELLIDO1, :APELLIDO2, :DV, :TIPODOC;
        ITEM = ITEM + 1;
        insert into medios_magneticos_datos (memg_formato, memg_ano, memg_item, memg_tipodoc, memg_nit, memg_dv,memg_apellido1, memg_apellido2,
            memg_nombre1, memg_nombre2, memg_razonsocial, memg_pago)
            values (1005, substr(:inicio,1,4), :item, :tipodoc, :nit, :dv, :apellido1, :apellido2,
            :nombre1, :nombre2, :razonsocial, :iva);
        END
    END
end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER PROCEDURE MM_1006(
    INICIO CHAR(8),
    FINAL CHAR(8))
AS
declare variable TIPODOC INTEGER;
declare variable NIT VARCHAR(15) CHARACTER SET NONE;
declare variable DV CHAR(1) CHARACTER SET NONE;
declare variable APELLIDO1 VARCHAR(60) CHARACTER SET NONE;
declare variable APELLIDO2 VARCHAR(60) CHARACTER SET NONE;
declare variable NOMBRE1 VARCHAR(60) CHARACTER SET NONE;
declare variable NOMBRE2 VARCHAR(60) CHARACTER SET NONE;
declare variable RAZONSOCIAL VARCHAR(450) CHARACTER SET NONE;
declare variable IVA NUMERIC(18,0);
declare variable ITEM INTEGER;
declare variable DIRMENOR VARCHAR(200) CHARACTER SET NONE;
declare variable DEPMENOR CHAR(2) CHARACTER SET NONE;
declare variable MUNMENOR CHAR(3) CHARACTER SET NONE;
declare variable PAISMENOR CHAR(3) CHARACTER SET NONE;
declare variable MENORCUANTIA NUMERIC(18,2);
declare variable MINIMO NUMERIC(18,2);
begin
ITEM = 0;
MENORCUANTIA = 0;
SELECT COME_MINIMO FROM configura_mediosmag WHERE COME_ITEM = 115 INTO :MINIMO;
/* IVA GENERADO */
FOR SELECT MAX(D.TERC_NIT), SUM(CODE_CREDITO-CODE_DEBITO)
    FROM COMPROBANTE_DETALLE D, COMPROBANTE_ENCABEZADO E, mediosmag_cuentas M
    WHERE M.mmcu_item = 115 AND SUBSTR(CUEN_COD,1,STRLEN(M.mmcu_cuenta)) = M.mmcu_cuenta AND
    E.ENCO_CONSEC = D.ENCO_CONSEC AND ENCO_FECHA >= :INICIO AND ENCO_FECHA <= :FINAL
    GROUP BY D.TERC_NIT
    INTO :NIT, :IVA
    DO
    BEGIN
    if (iva > 0) then
      if (IVA > MINIMO) then
        BEGIN
        SELECT TERC_NOM, TERC_NOMBRE1, TERC_NOMBRE2, TERC_APELLIDO1, TERC_APELLIDO2, TERC_DV, TIID_CODIGO
            FROM TERCEROS T left outer join TIPO_ID IT on (T.TERC_TIPOID = IT.TIID_COD) WHERE TERC_NIT = :NIT
            INTO :RAZONSOCIAL, :NOMBRE1, :NOMBRE2, :APELLIDO1, :APELLIDO2, :DV, :TIPODOC;
        ITEM = ITEM + 1;
        insert into medios_magneticos_datos (memg_formato, memg_ano, memg_item, memg_tipodoc, memg_nit, memg_dv,memg_apellido1, memg_apellido2,
            memg_nombre1, memg_nombre2, memg_razonsocial, memg_pago)
            values (1006, substr(:inicio,1,4), :item, :tipodoc, :nit, :dv, :apellido1, :apellido2,
            :nombre1, :nombre2, :razonsocial, :iva);
        END
      ELSE
        MENORCUANTIA = MENORCUANTIA + iva;
    END
if (MENORCUANTIA > 0) then
    BEGIN
    EXECUTE PROCEDURE lee_configuracion('CONTABILIDAD', 'GENERAL', 'NIT COMPAÑIA') returning_values (:NIT);
    SELECT TERC_DIR, SUBSTR(CIUD_COD,1,2), SUBSTR(CIUD_COD,3,5), PAIS_ID FROM TERCEROS WHERE TERC_NIT = :NIT
    INTO :dirmenor, :depmenor, :munmenor, :paismenor;
    ITEM = ITEM + 1;
    insert into medios_magneticos_datos (memg_formato, memg_ano, memg_item, memg_tipodoc, memg_nit, memg_dv,memg_apellido1, memg_apellido2,
        memg_nombre1, memg_nombre2, memg_razonsocial, memg_direccion, memg_departamento, memg_municipio, memg_pago, memg_pais)
        values (1006, substr(:inicio,1,4), :item,  43, '222222222', '', '', '',
        '', '', 'CUANTIAS MENORES', :dirmenor, :depmenor, :munmenor, :menorcuantia, :paismenor);
    END
end
^

SET TERM ; ^

SET TERM ^ ;

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

SET TERM ; ^

SET TERM ^ ;

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

SET TERM ; ^

SET TERM ^ ;

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

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER PROCEDURE MM_1011(
    INICIO CHAR(8),
    FINAL CHAR(8))
AS
declare variable CONCEPTO INTEGER;
declare variable SALDO NUMERIC(18,0);
declare variable SALDOAUX NUMERIC(18,0);
declare variable ITEM INTEGER;
declare variable ANO CHAR(4);
declare variable CUENTA VARCHAR(20);
begin
ITEM = 1;
ANO = SUBSTR(INICIO,1,4);
/* SALDO EN CAJA */
select COME_RESPUESTA FROM configura_mediosmag WHERE COME_ITEM = 81 INTO :CONCEPTO;
FOR SELECT MMCU_CUENTA FROM mediosmag_cuentas M WHERE M.mmcu_item = 81 INTO :CUENTA
    DO
    BEGIN
    EXECUTE PROCEDURE saldo_cuenta (CUENTA, FINAL) returning_values (SALDO);
    if (saldo > 0) then
        begin
        insert into medios_magneticos_datos (memg_formato, memg_ano, memg_item, memg_concepto, memg_pago)
            values (1011, :ANO, :item,  :concepto, :SALDO);
        ITEM = ITEM + 1;
        end
    END
/* SALDO DE ACTIVOS FIJOS INMUEBLES */
SALDO = 0;
select COME_RESPUESTA FROM configura_mediosmag WHERE COME_ITEM = 89 INTO :CONCEPTO;
FOR SELECT MMCU_CUENTA FROM mediosmag_cuentas M WHERE M.mmcu_item = 89 INTO :CUENTA
    DO
    BEGIN
    EXECUTE PROCEDURE saldo_cuenta (CUENTA, FINAL) returning_values (SALDOAUX);
    SALDO = SALDO + SALDOAUX;
    END
if (saldo > 0) then
    begin
    insert into medios_magneticos_datos (memg_formato, memg_ano, memg_item, memg_concepto, memg_pago)
        values (1011, :ANO, :item, :concepto, :SALDO);
    ITEM = ITEM + 1;
    end
/* SALDO DE MAQUINARIA Y EQUIPO */
select COME_RESPUESTA FROM configura_mediosmag WHERE COME_ITEM = 90 INTO :CONCEPTO;
FOR SELECT MMCU_CUENTA FROM mediosmag_cuentas M WHERE M.mmcu_item = 90 INTO :CUENTA
    DO
    BEGIN
    EXECUTE PROCEDURE saldo_cuenta (CUENTA, FINAL) returning_values (SALDOAUX);
    SALDO = SALDO + SALDOAUX;
    END
if (saldo > 0) then
    begin
    insert into medios_magneticos_datos (memg_formato, memg_ano, memg_item, memg_concepto, memg_pago)
        values (1011, :ANO, :item, :concepto, :SALDO);
    ITEM = ITEM + 1;
    end
/* SALDO DE EQUIPO DE OFICINA */
select COME_RESPUESTA FROM configura_mediosmag WHERE COME_ITEM = 91 INTO :CONCEPTO;
FOR SELECT MMCU_CUENTA FROM mediosmag_cuentas M WHERE M.mmcu_item = 91 INTO :CUENTA
    DO
    BEGIN
    EXECUTE PROCEDURE saldo_cuenta (CUENTA, FINAL) returning_values (SALDO);
    if (saldo > 0) then
        begin
        insert into medios_magneticos_datos (memg_formato, memg_ano, memg_item, memg_concepto, memg_pago)
            values (1011, :ANO, :item, :concepto, :SALDO);
        ITEM = ITEM + 1;
        end
    END
/* SALDO DE EQUIPO DE TRANSPORTE */
select COME_RESPUESTA FROM configura_mediosmag WHERE COME_ITEM = 92 INTO :CONCEPTO;
FOR SELECT MMCU_CUENTA FROM mediosmag_cuentas M WHERE M.mmcu_item = 92 INTO :CUENTA
    DO
    BEGIN
    EXECUTE PROCEDURE saldo_cuenta (CUENTA, FINAL) returning_values (SALDO);
    if (saldo > 0) then
        begin
        insert into medios_magneticos_datos (memg_formato, memg_ano, memg_item, memg_concepto, memg_pago)
            values (1011, :ANO, :item, :concepto, :SALDO);
        ITEM = ITEM + 1;
        end
    END
/* SALDO DE EQUIPO DE COMPUTO */
select COME_RESPUESTA FROM configura_mediosmag WHERE COME_ITEM = 93 INTO :CONCEPTO;
FOR SELECT MMCU_CUENTA FROM mediosmag_cuentas M WHERE M.mmcu_item = 93 INTO :CUENTA
    DO
    BEGIN
    EXECUTE PROCEDURE saldo_cuenta (CUENTA, FINAL) returning_values (SALDO);
    if (saldo > 0) then
        begin
        insert into medios_magneticos_datos (memg_formato, memg_ano, memg_item, memg_concepto, memg_pago)
            values (1011, :ANO, :item, :concepto, :SALDO);
        ITEM = ITEM + 1;
        end
    END
/* SALDO DE INTANGIBLES */
select COME_RESPUESTA FROM configura_mediosmag WHERE COME_ITEM = 94 INTO :CONCEPTO;
FOR SELECT MMCU_CUENTA FROM mediosmag_cuentas M WHERE M.mmcu_item = 94 INTO :CUENTA
    DO
    BEGIN
    EXECUTE PROCEDURE saldo_cuenta (CUENTA, FINAL) returning_values (SALDO);
    if (saldo > 0) then
        begin
        insert into medios_magneticos_datos (memg_formato, memg_ano, memg_item, memg_concepto, memg_pago)
            values (1011, :ANO, :item, :concepto, :SALDO);
        ITEM = ITEM + 1;
        end
    END
/* SALDO OTROS ACTIVOS FIJOS */
SALDO = 0;
select COME_RESPUESTA FROM configura_mediosmag WHERE COME_ITEM = 95 INTO :CONCEPTO;
FOR SELECT MMCU_CUENTA FROM mediosmag_cuentas M WHERE M.mmcu_item = 95 INTO :CUENTA
    DO
    BEGIN
    EXECUTE PROCEDURE saldo_cuenta (CUENTA, FINAL) returning_values (SALDOAUX);
    SALDO = SALDO + SALDOAUX;
    END
if (saldo > 0) then
    begin
    insert into medios_magneticos_datos (memg_formato, memg_ano, memg_item, memg_concepto, memg_pago)
        values (1011, :ANO, :item, :concepto, :SALDO);
    ITEM = ITEM + 1;
    end
/* SALDO DEPRECIACION ACUMULADA */
SALDO = 0;
select COME_RESPUESTA FROM configura_mediosmag WHERE COME_ITEM = 96 INTO :CONCEPTO;
FOR SELECT MMCU_CUENTA FROM mediosmag_cuentas M WHERE M.mmcu_item = 96 INTO :CUENTA
    DO
    BEGIN
    EXECUTE PROCEDURE saldo_cuenta (CUENTA, FINAL) returning_values (SALDOAUX);
    SALDO = SALDO + SALDOAUX;
    END
if (saldo > 0) then
    begin
    insert into medios_magneticos_datos (memg_formato, memg_ano, memg_item, memg_concepto, memg_pago)
        values (1011, :ANO, :item, :concepto, :SALDO);
    ITEM = ITEM + 1;
    end
/* SALDO OTROS ACTIVOS */
SALDO = 0;
select COME_RESPUESTA FROM configura_mediosmag WHERE COME_ITEM = 97 INTO :CONCEPTO;
FOR SELECT MMCU_CUENTA FROM mediosmag_cuentas M WHERE M.mmcu_item = 97 INTO :CUENTA
    DO
    BEGIN
    EXECUTE PROCEDURE saldo_cuenta (CUENTA, FINAL) returning_values (SALDOAUX);
    SALDO = SALDO + SALDOAUX;
    END
if (saldo > 0) then
    begin
    insert into medios_magneticos_datos (memg_formato, memg_ano, memg_item, memg_concepto, memg_pago)
        values (1011, :ANO, :item, :concepto, :SALDO);
    ITEM = ITEM + 1;
    end
/* SALDO COSTO EN VENTAS */
select COME_RESPUESTA FROM configura_mediosmag WHERE COME_ITEM = 101 INTO :CONCEPTO;
FOR SELECT MMCU_CUENTA FROM mediosmag_cuentas M WHERE M.mmcu_item = 101 INTO :CUENTA
    DO
    BEGIN
    EXECUTE PROCEDURE saldo_cuenta (CUENTA, FINAL) returning_values (SALDO);
    if (saldo > 0) then
        begin
        insert into medios_magneticos_datos (memg_formato, memg_ano, memg_item, memg_concepto, memg_pago)
            values (1011, :ANO, :item, :concepto, :SALDO);
        ITEM = ITEM + 1;
        end
    END
/* SALDO INVENTARIO */
select COME_RESPUESTA FROM configura_mediosmag WHERE COME_ITEM = 102 INTO :CONCEPTO;
FOR SELECT MMCU_CUENTA FROM mediosmag_cuentas M WHERE M.mmcu_item = 102 INTO :CUENTA
    DO
    BEGIN
    EXECUTE PROCEDURE saldo_cuenta (CUENTA, FINAL) returning_values (SALDO);
    if (saldo > 0) then
        begin
        insert into medios_magneticos_datos (memg_formato, memg_ano, memg_item, memg_concepto, memg_pago)
            values (1011, :ANO, :item, :concepto, :SALDO);
        ITEM = ITEM + 1;
        end
    END
/* INGRESOS NO CONSTITUTIVOS DE RENTA - DIVIDENDOS */
select COME_RESPUESTA FROM configura_mediosmag WHERE COME_ITEM = 105 INTO :CONCEPTO;
FOR SELECT MMCU_CUENTA FROM mediosmag_cuentas M WHERE M.mmcu_item = 105 INTO :CUENTA
    DO
    BEGIN
    EXECUTE PROCEDURE saldo_cuenta (CUENTA, FINAL) returning_values (SALDO);
    if (saldo > 0) then
        begin
        insert into medios_magneticos_datos (memg_formato, memg_ano, memg_item, memg_concepto, memg_pago)
            values (1011, :ANO, :item, :concepto, :SALDO);
        ITEM = ITEM + 1;
        end
    END
/* DEDUCCIONES POR SALARIOS */
SALDO = 0;
select COME_RESPUESTA FROM configura_mediosmag WHERE COME_ITEM = 106 INTO :CONCEPTO;
FOR SELECT MMCU_CUENTA FROM mediosmag_cuentas M WHERE M.mmcu_item = 106 INTO :CUENTA
    DO
    BEGIN
    EXECUTE PROCEDURE saldo_cuenta (CUENTA, FINAL) returning_values (SALDO);
    SALDO = SALDO + SALDOAUX;
    END
if (saldo > 0) then
    begin
    insert into medios_magneticos_datos (memg_formato, memg_ano, memg_item, memg_concepto, memg_pago)
        values (1011, :ANO, :item, :concepto, :SALDO);
    ITEM = ITEM + 1;
    end
end
^

SET TERM ; ^

SET TERM ^ ;

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

SET TERM ; ^


/* 20090314 */
/* ARREGLE LOS COMPROBANTES CON DB/CR NULL ANTES DE BORRAR LOS SALDOS */
SET TERM ^ ;

CREATE OR ALTER PROCEDURE CHEQUEO_SALDOS_CONTA(
    FECINI CHAR(8),
    CTAINI VARCHAR(20),
    CTAFIN VARCHAR(20))
AS
declare variable CUENTA VARCHAR(20);
declare variable NIT VARCHAR(20);
declare variable PROY VARCHAR(4);
declare variable CENTRO VARCHAR(4);
declare variable ARTIC VARCHAR(15);
declare variable DEBITOS NUMERIC(15,2);
declare variable CREDITOS NUMERIC(15,2);
declare variable FECHA CHAR(8);
DECLARE VARIABLE ANO CHAR(4);
DECLARE VARIABLE MES CHAR(2);
DECLARE VARIABLE INICIAL CHAR(8);
DECLARE VARIABLE EXISTE CHAR(1);
declare variable CUENTAUX VARCHAR(20);
BEGIN
/* BORRE LOS DB Y CR EN CERO */
UPDATE COMPROBANTE_DETALLE SET CODE_DEBITO = 0 WHERE CODE_DEBITO IS NULL;
UPDATE COMPROBANTE_DETALLE SET CODE_CREDITO = 0 WHERE CODE_CREDITO IS NULL;
DELETE FROM saldos_centros_TERCERO WHERE SACU_FECHA >= :FECINI AND CUEN_COD >= :CTAINI AND CUEN_COD <= :CTAFIN;
DELETE FROM saldos_centros WHERE SACU_FECHA >= :FECINI AND CUEN_COD >= :CTAINI AND CUEN_COD <= :CTAFIN;
DELETE FROM saldos_terceros WHERE SACU_FECHA >= :FECINI AND CUEN_COD >= :CTAINI AND CUEN_COD <= :CTAFIN;
DELETE FROM SALDOS_ARTICULO WHERE SAAR_FECHA >= :FECINI AND CUEN_COD >= :CTAINI AND CUEN_COD <= :CTAFIN;
DELETE FROM saldos_cuentas WHERE SACU_FECHA >= :FECINI AND CUEN_COD >= :CTAINI AND CUEN_COD <= :CTAFIN;
/* EMPIECE CON LOS SALDOS INICIALES */
EXECUTE PROCEDURE LEE_CONFIGURACION('CONTABILIDAD', 'GENERAL', 'AÑO DE INICIO') RETURNING_VALUES (ANO);
EXECUTE PROCEDURE LEE_CONFIGURACION('CONTABILIDAD', 'GENERAL', 'MES DE INICIO') RETURNING_VALUES (MES);
EXECUTE PROCEDURE compone_fecha_conta (ANO, MES, 1) returning_values (INICIAL);
if (FECINI <= INICIAL) then
    BEGIN
    FOR SELECT CUEN_COD, TERC_NIT, PROY_COD, CENT_COD, ARTI_COD, SAIN_DEBITO, SAIN_CREDITO FROM SALDOS_INICIALES INTO :CUENTA, :NIT, :PROY, :CENTRO, :ARTIC, :DEBITOS, :CREDITOS
        DO
        BEGIN
        /* Busque en saldos_cuentas la cuenta y la fecha, si la encuentra actualice INICIAL, si no inserte un registro */
        CUENTAUX = CUENTA;
        WHILE (CUENTAUX <> '') DO
            BEGIN
            EXISTE = 'N';
            SELECT 'S' FROM SALDOS_CUENTAS
                WHERE (CUEN_COD = :CUENTAUX) AND (SACU_FECHA = :INICIAL) INTO :EXISTE;
            IF (EXISTE = 'N') THEN
                BEGIN
                INSERT INTO SALDOS_CUENTAS(CUEN_COD, SACU_FECHA, SACU_SALDO, SACU_DEBITO, SACU_CREDITO)
                    VALUES (:CUENTAUX, :INICIAL, :DEBITOS-:CREDITOS, 0, 0);
                END
            ELSE
                BEGIN
                UPDATE SALDOS_CUENTAS
                    SET SACU_SALDO = SACU_SALDO + :DEBITOS - :CREDITOS
                    WHERE (CUEN_COD = :CUENTAUX) AND (SACU_FECHA = :INICIAL);
                END
            EXECUTE PROCEDURE PADRE(CUENTAUX) RETURNING_VALUES (CUENTAUX);
            END
    
        /* Busque en saldos_TERCEROS si la encuentra actualice INICIAL, si no inserte un registro */
        EXISTE = 'N';
        SELECT 'S' FROM SALDOS_TERCEROS
            WHERE (CUEN_COD = :CUENTA) AND (TERC_NIT = :NIT) AND (SACU_FECHA = :INICIAL) INTO :EXISTE;
        IF (EXISTE = 'N') THEN
            BEGIN
            INSERT INTO SALDOS_TERCEROS(CUEN_COD, TERC_NIT, SACU_FECHA, SATE_SALDO, SATE_DEBITO, SATE_CREDITO)
                VALUES (:CUENTA, :NIT, :INICIAL, :DEBITOS-:CREDITOS, 0, 0);
            END
        ELSE
            BEGIN
            UPDATE SALDOS_TERCEROS
                SET SATE_SALDO = SATE_SALDO + :DEBITOS - :CREDITOS
                WHERE (CUEN_COD = :CUENTA) AND (TERC_NIT = :NIT) AND (SACU_FECHA = :INICIAL);
            END
        /* Busque en saldos_CENTROS si la encuentra actualice INICIAL, si no inserte un registro */
        EXISTE = 'N';
        SELECT 'S' FROM SALDOS_CENTROS
            WHERE (CUEN_COD = :CUENTA) AND (PROY_COD = :PROY) AND (CENT_COD = :CENTRO) AND (SACU_FECHA = :INICIAL) INTO :EXISTE;
        IF (EXISTE = 'N') THEN
            BEGIN
            INSERT INTO SALDOS_CENTROS(CUEN_COD, PROY_COD, CENT_COD, SACU_FECHA, SACE_SALDO, SACE_DEBITO, SACE_CREDITO)
                VALUES (:CUENTA, :PROY, :CENTRO, :INICIAL, :DEBITOS-:CREDITOS, 0, 0);
            END
        ELSE
            BEGIN
            UPDATE SALDOS_CENTROS
                SET SACE_SALDO = SACE_SALDO + :DEBITOS - :CREDITOS
                WHERE (CUEN_COD = :CUENTA) AND (PROY_COD = :PROY) AND (CENT_COD = :CENTRO) AND (SACU_FECHA = :INICIAL);
            END
        /* Busque en saldos_CENTROS-TERCERO si la encuentra actualice INICIAL, si no inserte un registro */
        EXISTE = 'N';
        SELECT 'S' FROM SALDOS_CENTROS_TERCERO
            WHERE (CUEN_COD = :CUENTA) AND (PROY_COD = :PROY) AND (CENT_COD = :CENTRO) AND (TERC_NIT = :NIT) AND (SACU_FECHA = :INICIAL) INTO :EXISTE;
        IF (EXISTE = 'N') THEN
            BEGIN
            INSERT INTO SALDOS_CENTROS_TERCERO(CUEN_COD, PROY_COD, CENT_COD, TERC_NIT, SACU_FECHA, SACT_SALDO, SACT_DEBITO, SACT_CREDITO)
                VALUES (:CUENTA, :PROY, :CENTRO, :NIT, :INICIAL, :DEBITOS-:CREDITOS, 0, 0);
            END
        ELSE
            BEGIN
            UPDATE SALDOS_CENTROS_TERCERO
                SET SACT_SALDO = SACT_SALDO + :DEBITOS - :CREDITOS
                WHERE (CUEN_COD = :CUENTA) AND (PROY_COD = :PROY) AND (CENT_COD = :CENTRO) AND (TERC_NIT = :NIT) AND (SACU_FECHA = :INICIAL);
            END
        /* LOS DETALLADOS POR ARTICULO */
        if (ARTIC IS NOT NULL) then
            BEGIN
            EXISTE = 'N';
            SELECT 'S' FROM SALDOS_ARTICULO
                WHERE (CUEN_COD = :CUENTA) AND (ARTI_COD = :ARTIC) AND (SAAR_FECHA = :INICIAL) INTO :EXISTE;
            IF (EXISTE = 'N') THEN
                BEGIN
                INSERT INTO SALDOS_ARTICULO(CUEN_COD, ARTI_COD, SAAR_FECHA, SAAR_SALDO, SAAR_DEBITOS, SAAR_CREDITOS)
                    VALUES (:CUENTA, :ARTIC, :INICIAL, :DEBITOS-:CREDITOS, 0, 0);
                END
            ELSE
                BEGIN
                UPDATE SALDOS_ARTICULO
                    SET SAAR_SALDO = SAAR_SALDO + :DEBITOS - :CREDITOS
                    WHERE (CUEN_COD = :CUENTA) AND (ARTI_COD = :ARTIC) AND (SAAR_FECHA = :INICIAL);
                END
            END
        END
    END /* SI DESDE EL INICIO */
/* AHORA LOS MOVIMIENTOS */
FOR SELECT CUEN_COD, D.TERC_NIT, PROY_COD, CENT_COD, ARTI_COD, CODE_DEBITO, CODE_CREDITO, ENCO_FECHA
    FROM COMPROBANTE_DETALLE d, COMPROBANTE_ENCABEZADO C WHERE C.ENCO_CONSEC = d.enco_consec AND ENCO_FECHA >= :FECINI
    ORDER BY ENCO_FECHA, CUEN_COD, D.TERC_NIT
    INTO :CUENTA, :NIT, :PROY, :CENTRO, :ARTIC, :DEBITOS, :CREDITOS, :FECHA
    DO
    BEGIN
    EXECUTE PROCEDURE ACTUALICE_SALDO_CUENTA(:CUENTA, FECHA, :DEBITOS, :CREDITOS);
    EXECUTE PROCEDURE ACTUALICE_SALDO_TERCERO(:CUENTA, :NIT, FECHA, :DEBITOS, :CREDITOS);
    EXECUTE PROCEDURE ACTUALICE_SALDO_CENTRO(:CUENTA, :PROY, :CENTRO, FECHA, :DEBITOS, :CREDITOS);
    EXECUTE PROCEDURE ACTUALICE_SALDO_CENTRO_TERCERO(:CUENTA, :PROY, :CENTRO, :NIT, FECHA, :DEBITOS, :CREDITOS);
    IF (ARTIC IS NOT NULL) THEN
        EXECUTE PROCEDURE ACTUALICE_SALDO_ARTICULO(:CUENTA, :ARTIC, :FECHA, :DEBITOS, :CREDITOS);
    END
END
^

SET TERM ; ^



/* 20090315 */
/* AL BORRAR CONSIGNACIONES NO ELIMINA LA RELACION CON EL RECIBO, SI SE VUELVE A GRABAR AL BORRAR EL RECIBO DA UN MULTIPLE ROWS */
SET TERM ^ ;

CREATE OR ALTER TRIGGER CONSIGNA_AD FOR CONSIGNA
ACTIVE AFTER DELETE POSITION 0
as
declare variable consec INTEGER;
begin
  INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD, AUDI_TICO)
    VALUES (USER, 71, OLD.cons_id, 'D', OLD.prba_pref || OLD.cons_numero, OLD.cuba_cod);
/* BORRE LA RELACION CON EL RECIBO DE CAJA QUE LO CONSIGNO */
DELETE from consolidado_faltantes where cofa_tipodes = 71 AND cofa_iddes = OLD.cons_id;

for select enco_consec from comprobante_encabezado where enco_tiporef = 71 and enco_idref = old.cons_id into :consec
    do
    begin
    delete from comprobante_detalle where enco_consec = :consec;
    delete from comprobante_encabezado where enco_consec = :consec;
    end
end
^

SET TERM ; ^


SET TERM ^ ;

CREATE OR ALTER TRIGGER CONSIGNA_TARJETAS_AD FOR CONSIGNA_TARJETAS
ACTIVE AFTER DELETE POSITION 0
as
declare variable consec INTEGER;
begin
if (old.cotj_id <> 0) then
    DELETE FROM MOVIMIENTO_BANCO
        WHERE MOBA_TIPODOC = 64 AND MOBA_IDREF = OLD.cotj_id;
select enco_consec from comprobante_encabezado where enco_tiporef = 64 and enco_idref = old.cotj_id into :consec;
if (NOT consec is null) then
  delete from comprobante_detalle where enco_consec = :consec;
delete from comprobante_encabezado where enco_tiporef = 64 and enco_idref = old.cotj_id;
/* BORRE LA RELACION CON EL RECIBO DE CAJA QUE LO CONSIGNO */
DELETE from consolidado_faltantes where cofa_tipodes = 64 AND cofa_iddes = OLD.cotj_id;

INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
    VALUES (USER, 64, OLD.cotj_id, 'D', OLD.pref_pre || OLD.cotj_numero);
end
^

SET TERM ; ^


/* 20090316 */
/* PARA EVITAR ERRORES POR REDONDEAR POR ITEM, QUEDA CONFIGURABLE */
INSERT INTO CONFIGURACION (CONF_MODULO, CONF_CATEGORIA, CONF_PROPIEDAD, CONF_VALOR, CONF_POSIBLES, CONF_AYUDA) VALUES ('FACTURACION', 'DOCUMENTOS', 'REDONDEAR SUBTOTAL E IVA POR ITEM', 'SI', 'SI,NO', 'SI:Aplica el mismo redondeo que a los totales del documento al subtotal por item y al IVA por item. NO: Calcula el IVA y subtotal por item con 2 decimales y solo redondea los totales del documento');
COMMIT WORK;


/* 20090317 */
/* CELULAR DEL CLIENTE EN DOCUMENTOS DE VENTAS */
SET TERM ^ ;

CREATE OR ALTER PROCEDURE IMPR_FACTURA(
    ID INTEGER)
RETURNS (
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    VENCE DATE,
    DIASVENCE INTEGER,
    CONTCRED CHAR(17),
    NIT VARCHAR(20),
    NOMTERCERO VARCHAR(60),
    NOMCLIENTE VARCHAR(60),
    VENDEDOR INTEGER,
    NOMVENDEDOR VARCHAR(60),
    PUNTOVTA INTEGER,
    NOMPUNTOVTA VARCHAR(30),
    CODBODEGA VARCHAR(2),
    NOMBODEGA VARCHAR(30),
    AUTORIZACION VARCHAR(20),
    DESPACHO VARCHAR(255),
    TRANSPORTADOR VARCHAR(60),
    COTIZACION VARCHAR(30),
    PEDIDO VARCHAR(30),
    REMISION VARCHAR(30),
    PACIENTE VARCHAR(20),
    NOMPACIENTE VARCHAR(60),
    COMIPORC NUMERIC(9,2),
    COMIMONTO NUMERIC(18,2),
    SUBTOTAL NUMERIC(18,2),
    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),
    EXTRA NUMERIC(18,2),
    DTOFPORC NUMERIC(9,2),
    DTOFMONTO NUMERIC(18,2),
    FECHADTO DATE,
    TOTALFAC NUMERIC(18,2),
    TOTALPAGAR NUMERIC(18,2),
    OBS BLOB SUB_TYPE 1 SEGMENT SIZE 80,
    ITEM INTEGER,
    ARTICULO VARCHAR(15),
    CODBAR VARCHAR(15),
    ARTIDES VARCHAR(60),
    DESCORTA VARCHAR(30),
    CANT NUMERIC(18,4),
    LOTE VARCHAR(15),
    VLOTE DATE,
    UNIDAD VARCHAR(8),
    CAJAS NUMERIC(18,4),
    FACTOR NUMERIC(18,4),
    LISTAPR INTEGER,
    REFITEM VARCHAR(60),
    BODITEM VARCHAR(2),
    STAND VARCHAR(15),
    PRUNIT NUMERIC(18,2),
    DTOITPORC NUMERIC(9,2),
    DTOITMONTO NUMERIC(18,2),
    PRNETO NUMERIC(18,2),
    PRNETOSINIVA NUMERIC(18,2),
    DTOIT1 NUMERIC(9,2),
    DTOIT2 NUMERIC(9,2),
    DTOIT3 NUMERIC(9,2),
    IVAPORC NUMERIC(9,2),
    IVAITMONTO NUMERIC(18,2),
    CONSUMO NUMERIC(18,2),
    SUBTOTIT NUMERIC(18,2),
    TOTAL NUMERIC(18,2),
    CODIGOCL VARCHAR(20),
    ZONACOD VARCHAR(2),
    ZONANOM VARCHAR(60),
    DV CHAR(1),
    DIRECCION VARCHAR(60),
    CIUDAD VARCHAR(40),
    TELEFONO VARCHAR(40),
    CONTACTO VARCHAR(60),
    FAX VARCHAR(25),
    CEL VARCHAR(25),
    GRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    SUBGRUPO VARCHAR(3),
    NOMSUBG VARCHAR(30),
    MARCA VARCHAR(3),
    NOMMARCA VARCHAR(30),
    PESO NUMERIC(18,4),
    ANCHO NUMERIC(18,4),
    ALTO NUMERIC(18,4),
    LARGO NUMERIC(18,4),
    SUMA1 NUMERIC(18,2),
    SUMA2 NUMERIC(18,2),
    SUMA3 NUMERIC(18,2),
    IVA1 NUMERIC(18,2),
    IVA2 NUMERIC(18,2),
    IVA3 NUMERIC(18,2),
    SUMAEX NUMERIC(18,2),
    SUMAGR NUMERIC(18,2),
    TOTCONSUMO NUMERIC(18,2),
    DTOIT1M NUMERIC(18,2),
    DTOIT2M NUMERIC(18,2),
    DTOIT3M NUMERIC(18,2),
    TOTCAJAS NUMERIC(18,2),
    VEHICULO VARCHAR(8),
    RECIBIDO NUMERIC(18,2),
    CAMBIO NUMERIC(18,2),
    HORA TIME,
    FORMAPAGO1 VARCHAR(30),
    MONTOPAGO1 NUMERIC(18,2),
    FORMAPAGO2 VARCHAR(30),
    MONTOPAGO2 NUMERIC(18,2),
    FORMAPAGO3 VARCHAR(30),
    MONTOPAGO3 NUMERIC(18,2),
    PUNTOS INTEGER,
    PUNTOSACUM INTEGER,
    PUNTOSVENC INTEGER,
    FECPTOS DATE,
    OBSITEM BLOB SUB_TYPE 1 SEGMENT SIZE 80,
    SUCUR VARCHAR(10))
AS
DECLARE VARIABLE IMPTOS CHAR(1);
DECLARE VARIABLE TARIFA INTEGER;
declare variable DEVUELTO NUMERIC(18,2);
declare variable ORDENCOD CHAR(2);
declare variable IMPRDEV CHAR(2);
declare variable IMPR CHAR(1);
declare variable ITEMFP INTEGER;
declare variable FORMAP VARCHAR(30);
declare variable MONTOP NUMERIC(18,2);
declare variable ICOINC CHAR(2);
declare variable DTOITM1 NUMERIC(18,2);
declare variable DTOITM2 NUMERIC(18,2);
declare variable DTOITM3 NUMERIC(18,2);
declare variable DTOITE3 CHAR(2);
declare variable SUMDTOIT NUMERIC(18,2);
declare variable AUTORET VARCHAR(10);
declare variable FAUTORET DATE;
BEGIN
execute procedure lee_configuracion('FACTURACION', 'ARTICULOS', 'IMPOCONSUMO INCLUIDO EN EL PRECIO BASE DE VENTA ANTES DE IVA') returning_values (icoinc);
execute procedure lee_configuracion('FACTURACION', 'FACTURAS', 'COLUMNAS DE DESCUENTO POR ITEM ADICIONALES') returning_values (DTOITE3);
SELECT F.PREF_PRE, FACT_NUMERO, FACT_FECHA, FACT_VENCE, F.BODE_COD, BODE_NOM, F.TERC_NIT, FACT_NOMCLIENTE, F.VEND_COD, VEND_NOMBRE, F.PTVT_ID, PTVT_NOM,
    AUTO_NUMERO, FACT_DESPACHO, FACT_TRANSP, FACT_COTIZACI, FACT_PEDIDO, FACT_REMISION, FACT_COMIPORC, FACT_COMIMONTO, FACT_IVAINC, 
    FACT_DTOPOR, FACT_DTOMONTO, FACT_ADICIONAL, FACT_IVAMONTO, FACT_RTFTEPOR, FACT_RTFTEMONTO, FACT_RTIVAPOR, FACT_RTIVAMONTO, FACT_RTICAPOR, FACT_RTICAMONTO, FACT_EXTRA, FACT_DTOFPOR, FACT_DTOFMONTO, FACT_DTOFFECHA, FACT_TOTAL,
    TERC_DIR, TERC_CIU, TERC_TEL, TERC_CONTACTO, TERC_FAX, TERC_DV, TERC_CEL, FACT_DTOIT1, FACT_DTOIT2, FACT_DTOIT3,
    FACT_OBS, VEHI_COD, /*FACT_NROCOPIA,*/ FACT_RECIBIDO, FACT_SUCURSAL, FACT_DETCLI, FACT_DETCLINOM, TERC_NOM
    FROM FACTURAS F, BODEGA B, VENDEDORES V, PUNTO_VENTA P, TERCEROS T
    WHERE F.BODE_COD = B.BODE_COD AND F.VEND_COD = V.VEND_COD AND F.PTVT_ID = P.PTVT_ID AND F.TERC_NIT = T.TERC_NIT AND F.FACT_ID = :ID
    into :PREF, :NUMERO, :FECHA, :VENCE, :CODBODEGA, :NOMBODEGA, :NIT, :NOMTERCERO, :VENDEDOR, :NOMVENDEDOR, :PUNTOVTA, :NOMPUNTOVTA,
    :AUTORIZACION, :DESPACHO, :TRANSPORTADOR, :COTIZACION, :PEDIDO, :REMISION, :COMIPORC, :COMIMONTO, :IMPTOS,
    :DTOPORC, :DTOMONTO, :ADICIONAL, :IVAMONTO, :RTEFTEPORC, :RTEFTEMONTO, :RTEIVAPORC, :RTEIVAMONTO, :RTEICAPORC, :RTEICAMONTO, :EXTRA, :DTOFPORC, :DTOFMONTO, :FECHADTO, :TOTALFAC,
    :DIRECCION, :CIUDAD, :TELEFONO, :CONTACTO, :FAX, :DV, :CEL, :dtoit1m, :dtoit2m, :dtoit3m,
    :OBS, :VEHICULO,/* :NROCOPIA,*/ :RECIBIDO, :SUCUR, :paciente, :nompaciente, :nomcliente;

/* ACUMULE LOS PUNTOS, SE HACE ACA POR SER POSTERIOR AL DETALLE */
EXECUTE PROCEDURE acumula_puntos_cliente (31, :id, :nit, :fecha) returning_values (:PUNTOS);
EXECUTE PROCEDURE consulta_puntos_cliente (:id, :nit, :fecha) returning_values (:puntos, :puntosacum, :puntosvenc, :fecptos);
if (DTOIT1M IS NULL) then
    DTOIT1M = 0;
if (DTOIT2M IS NULL) then
    DTOIT2M = 0;
if (DTOIT3M IS NULL) then
    DTOIT3M = 0;
SELECT CLIE_COD, C.ZONA_COD, ZONA_NOM
    FROM CLIENTES C, ZONAS Z
    WHERE TERC_NIT = :NIT AND C.ZONA_COD = Z.ZONA_COD
    INTO :CODIGOCL, :ZONACOD, :ZONANOM;
SELECT CLSU_DIR, CLSU_CIUDAD, CLSU_TEL FROM CLIENTE_SUCURSALES WHERE TERC_NIT = :NIT AND CLCU_COD = :SUCUR
    INTO :DIRECCION, :CIUDAD, :TELEFONO;
DIASVENCE = VENCE - FECHA;
if (DIASVENCE > 0) then
    CONTCRED = 'CREDITO ' || CAST(DIASVENCE AS VARCHAR(3)) || ' DIAS';
ELSE
    CONTCRED = 'CONTADO';
SUBTOTAL = TOTALFAC - EXTRA - IVAMONTO - ADICIONAL + DTOMONTO;
if (DTOITE3 = 'SI') then
    BEGIN
    SELECT SUM(FADE_DTOMONTO) FROM FACTURAS_DETALLE WHERE FACT_ID = :id INTO :sumdtoit;
    SUBTOTAL = SUBTOTAL + sumdtoit + dtoit1m + dtoit2m + dtoit3m;
    END
EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'FECHA AUTORETENEDOR NO DESCONTAR RETENCIONES DEL SALDO PERO SI CONTABILIZARLAS') returning_values (AUTORET);
if (AUTORET <> '') then
    FAUTORET = CAST(AUTORET AS DATE);
else
    FAUTORET = '9999/12/31';
if (FECHA > fautoret) then
    TOTALPAGAR = TOTALFAC - RTEIVAMONTO - RTEICAMONTO;
ELSE
    TOTALPAGAR = TOTALFAC - RTEFTEMONTO - RTEIVAMONTO - RTEICAMONTO;
if (RECIBIDO <> 0) then
    CAMBIO = RECIBIDO - totalpagar;
ELSE
    CAMBIO = 0;
SUMAEX = 0;
SUMA1 = 0;
SUMA2 = 0;
SUMA3 = 0;
IVA1 = 0;
IVA2 = 0;
IVA3 = 0;
TOTCONSUMO = 0;
MONTOPAGO1 = 0;
SELECT MAX(AUDI_HORA) FROM AUDITORIA WHERE TIDO_COD = 31 AND AUDI_IDDOC = :ID AND AUDI_OPER = 'I' INTO :HORA;
/* AHORA LAS FORMAS DE PAGO, BUSQUE EL ABONO DE HOY A LA FACTURA */
ITEMFP = 1;
MONTOPAGO1 = 0;
MONTOPAGO2 = 0;
MONTOPAGO3 = 0;
FOR SELECT FOPA_NOM, RCPA_MONTO FROM RECIBOS_CAJA_PAGO P, FORMAS_PAGO F, RECIBOS_CAJA R, RECIBOS_CAJA_DETALLE D
    WHERE R.RECA_ID = P.RECA_ID AND R.RECA_ID = D.RECA_ID AND P.FOPA_ID = F.FOPA_ID AND RECA_FECHA = :FECHA AND RCDE_TIPODOC = 31 AND RCDE_IDDOC = :ID
    INTO :formap, :MONTOP
    DO
    BEGIN
    if (ITEMFP = 1) then
        BEGIN
        FORMAPAGO1 = FORMAP;
        MONTOPAGO1 = MONTOP;
        END
    if (ITEMFP = 2) then
        BEGIN
        FORMAPAGO2 = FORMAP;
        MONTOPAGO2 = MONTOP;
        END
    if (ITEMFP = 3) then
        BEGIN
        FORMAPAGO3 = FORMAP;
        MONTOPAGO3 = MONTOP;
        END
    ITEMFP = ITEMFP + 1;
    END
EXECUTE PROCEDURE lee_configuracion ('FACTURACION','DOCUMENTOS','ORDENAR ITEMS POR CODIGO DE ARTICULO') returning_values (:ORDENCOD);
EXECUTE PROCEDURE lee_configuracion ('FACTURACION','POS', 'IMPRIMIR DEVOLUCIONES DE ARTICULOS NEGATIVOS') returning_values (:imprdev);
totcajas = 0;
if (ORDENCOD = 'SI') then
    BEGIN
    FOR SELECT FADE_ITEM, D.ARTI_COD, FADE_CODBAR, SUBSTR(FADE_DESC,1,60), ARTI_DESCORTA, FADE_CANT, FADE_UNIDAD, FADE_FACTOR, BODE_COD, FADE_LOTE, LIPR_COD, FADE_PRUNIT, FADE_DTOPORC, FADE_DTOMONTO, FADE_IVAPORC, FADE_IVAMONTO, FADE_CONSUMO, FADE_TOTAL, FADE_REFERENCIA,
        GRUP_COD, SUBG_COD, MARC_COD, ARTI_PESO, ARTI_ANCHO, ARTI_ALTO, ARTI_LARGO, TAIV_COD, FADE_DEVUELTO, FADE_OBS, FADE_DTO1, FADE_DTO2, FADE_DTO3, FADE_DTOM1, FADE_DTOM2, FADE_DTOM3, FADE_CAJAS
        FROM FACTURAS_DETALLE D, ARTICULO A
        WHERE D.ARTI_COD = A.ARTI_COD AND D.FACT_ID = :ID
        ORDER BY D.ARTI_COD
        INTO :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :DESCORTA, :CANT, :UNIDAD, :FACTOR, :BODITEM, :LOTE, :LISTAPR, :PRUNIT, :DTOITPORC, :DTOITMONTO, :IVAPORC, :IVAITMONTO, :CONSUMO, :TOTAL, :refitem,
        :GRUPO, :SUBGRUPO, :MARCA, :PESO, :ANCHO, :ALTO, :LARGO, :TARIFA, :devuelto, :obsitem, :dtoit1, :dtoit2, :dtoit3, :dtoitm1, :dtoitm2, :dtoitm3, :cajas
        DO
          BEGIN
          if (ARTICULO = CODBAR) then
            SELECT FIRST 1 COBA_COD FROM barras_articulo WHERE ARTI_COD = :articulo INTO :CODBAR;
          if (IMPRDEV <> 'SI') then
            BEGIN
            if ((CANT >= 0) AND (DEVUELTO = 0)) then
                IMPR = 'S';
            ELSE
                IMPR = 'N'; /* ES DEVOLUCION */
            END
          ELSE
            IMPR = 'S';
          if (IMPR = 'S') then
            BEGIN
            prneto = PRUNIT - DTOITMONTO - dtoitm1 - dtoitm2 - dtoitm3;
            if (IMPTOS = 'S') then
                if (cant <> 0) then
                    prnetosiniva = PRUNIT - DTOITMONTO - ((IVAITMONTO+CONSUMO) / CANT) - dtoitm1 - dtoitm2 - dtoitm3;
                else
                    prnetosiniva = PRUNIT - DTOITMONTO - dtoitm1 - dtoitm2 - dtoitm3;
            ELSE
                prnetosiniva = PRUNIT - DTOITMONTO - dtoit1m - dtoit2m - dtoit3m;
            if (ICOINC = 'SI') then
                SUBTOTIT = TOTAL - IVAITMONTO;
            else
                SUBTOTIT = TOTAL - IVAITMONTO - CONSUMO;
            TOTCONSUMO = TOTCONSUMO + CONSUMO;
            SELECT LOTE_VENCE FROM LOTES WHERE LOTE_NRO = :lote AND ARTI_COD = :ARTICULO AND BODE_COD = :boditem INTO :vlote;
            if ((REFITEM <> '.t') or (REFITEM IS NULL)) then
                BEGIN
                /* NO SUME LOS ENSAMBLES */
                if (IVAPORC = 0) then
                    SUMAEX = SUMAEX + TOTAL;
                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;
                END
            if (ANCHO IS NULL) then
                ANCHO = 0;
            if (ALTO IS NULL) then
                ALTO = 0;
            if (LARGO IS NULL) then
                LARGO = 0;
            if (PESO IS NULL) then
                PESO = 0;
            PESO = (PESO / 1000) * CANT * FACTOR;
            totcajas = totcajas + cajas;
            if (substr(ARTICULO,1,2) = '.t') then
                BEGIN
                REFITEM = '';
                TOTAL = 0;
                SUBTOTIT = 0;
                END
            SELECT STAND_COD FROM STANDS WHERE ARTI_COD = :ARTICULO AND STAND_BODEGA = :boditem INTO :stand;
            SUSPEND;
            END
          END
    END
ELSE
    BEGIN
    FOR SELECT FADE_ITEM, D.ARTI_COD, FADE_CODBAR, SUBSTR(FADE_DESC,1,60), ARTI_DESCORTA, FADE_CANT, FADE_UNIDAD, FADE_FACTOR, BODE_COD, FADE_LOTE, LIPR_COD, FADE_PRUNIT, FADE_DTOPORC, FADE_DTOMONTO, FADE_IVAPORC, FADE_IVAMONTO, FADE_CONSUMO, FADE_TOTAL, FADE_REFERENCIA,
        GRUP_COD, SUBG_COD, MARC_COD, ARTI_PESO, ARTI_ANCHO, ARTI_ALTO, ARTI_LARGO, TAIV_COD, FADE_DEVUELTO, FADE_OBS, FADE_DTO1, FADE_DTO2, FADE_DTO3, FADE_DTOM1, FADE_DTOM2, FADE_DTOM3, FADE_CAJAS
        FROM FACTURAS_DETALLE D, ARTICULO A
        WHERE D.ARTI_COD = A.ARTI_COD AND D.FACT_ID = :ID
        ORDER BY FADE_ITEM
        INTO :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :DESCORTA, :CANT, :UNIDAD, :FACTOR, :BODITEM, :LOTE, :LISTAPR, :PRUNIT, :DTOITPORC, :DTOITMONTO, :IVAPORC, :IVAITMONTO, :CONSUMO, :TOTAL, :refitem,
        :GRUPO, :SUBGRUPO, :MARCA, :PESO, :ANCHO, :ALTO, :LARGO, :TARIFA, :devuelto, :obsitem, :dtoit1, :dtoit2, :dtoit3, :dtoitm1, :dtoitm2, :dtoitm3, :cajas
        DO
          BEGIN
          if (IMPRDEV <> 'SI') then
            BEGIN
            if ((CANT >= 0) AND (DEVUELTO = 0)) then
                IMPR = 'S';
            ELSE
                IMPR = 'N'; /* ES DEVOLUCION */
            END
          ELSE
            IMPR = 'S';
          if (IMPR = 'S') then
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :GRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :MARCA INTO NOMMARCA;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :SUBGRUPO AND GRUP_COD = :GRUPO INTO :NOMSUBG;
            prneto = PRUNIT - DTOITMONTO - dtoitm1 - dtoitm2 - dtoitm3;
            if (IMPTOS = 'S') then
                if (cant <> 0) then
                    prnetosiniva = PRUNIT - DTOITMONTO - ((IVAITMONTO+CONSUMO) / CANT) - dtoit1m - dtoit2m - dtoit3m;
                else
                    prnetosiniva = PRUNIT - DTOITMONTO - dtoitm1 - dtoitm2 - dtoitm3;
            ELSE
                prnetosiniva = PRUNIT - DTOITMONTO - dtoitm1 - dtoitm2 - dtoitm3;
            if (ICOINC = 'SI') then
                SUBTOTIT = TOTAL - IVAITMONTO;
            else
                SUBTOTIT = TOTAL - IVAITMONTO - CONSUMO;
            TOTCONSUMO = TOTCONSUMO + CONSUMO;
            SELECT LOTE_VENCE FROM LOTES WHERE LOTE_NRO = :lote AND ARTI_COD = :ARTICULO AND BODE_COD = :boditem INTO :vlote;
            if ((REFITEM <> '.t') or (REFITEM IS NULL)) then
                BEGIN
                /* NO SUME LOS ENSAMBLES */
                if (IVAPORC = 0) then
                    SUMAEX = SUMAEX + TOTAL;
                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;
                END
            if (ANCHO IS NULL) then
                ANCHO = 0;
            if (ALTO IS NULL) then
                ALTO = 0;
            if (LARGO IS NULL) then
                LARGO = 0;
            if (PESO IS NULL) then
                PESO = 0;
            PESO = (PESO / 1000)* CANT * FACTOR;
            totcajas = totcajas + cajas;
            if (substr(ARTICULO,1,2) = '.t') then
                BEGIN
                REFITEM = '';
                TOTAL = 0;
                SUBTOTIT = 0;
                END
            SELECT STAND_COD FROM STANDS WHERE ARTI_COD = :ARTICULO AND STAND_BODEGA = :boditem INTO :stand;
            SUSPEND;
            END
          END
    END
END
^

SET TERM ; ^


SET TERM ^ ;

CREATE OR ALTER PROCEDURE IMPR_DEVOLUCION(
    ID INTEGER)
RETURNS (
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    NIT VARCHAR(20),
    NOMTERCERO VARCHAR(60),
    VENDEDOR INTEGER,
    NOMVENDEDOR VARCHAR(60),
    PUNTOVTA INTEGER,
    NOMPUNTOVTA VARCHAR(30),
    CODBODEGA VARCHAR(2),
    NOMBODEGA VARCHAR(30),
    FACTURA VARCHAR(30),
    REMISION VARCHAR(10),
    COMIPORC NUMERIC(9,2),
    COMIMONTO NUMERIC(18,2),
    SUBTOTAL NUMERIC(18,2),
    DTOPORC NUMERIC(9,2),
    DTOMONTO NUMERIC(18,2),
    ADICIONAL NUMERIC(18,2),
    IVAMONTO NUMERIC(18,2),
    RTEFTEPORC NUMERIC(9,2),
    RTEFTEMONTO NUMERIC(18,2),
    RTEIVAPORC NUMERIC(9,2),
    RTEIVAMONTO NUMERIC(18,2),
    RTEICAPORC NUMERIC(9,2),
    RTEICAMONTO NUMERIC(18,2),
    EXTRA NUMERIC(18,2),
    TOTALFAC NUMERIC(18,2),
    TOTALPAGAR NUMERIC(18,2),
    OBS BLOB SUB_TYPE 1 SEGMENT SIZE 80,
    ITEM INTEGER,
    ARTICULO VARCHAR(15),
    CODBAR VARCHAR(15),
    ARTIDES VARCHAR(60),
    CANT NUMERIC(18,4),
    LOTE VARCHAR(15),
    UNIDAD VARCHAR(8),
    FACTOR NUMERIC(18,4),
    REFITEM VARCHAR(60),
    BODITEM VARCHAR(2),
    PRUNIT NUMERIC(18,2),
    DTOITPORC NUMERIC(9,2),
    DTOITMONTO NUMERIC(18,2),
    PRNETO NUMERIC(18,2),
    PRNETOSINIVA NUMERIC(18,2),
    IVAPORC NUMERIC(9,2),
    IVAITMONTO NUMERIC(18,2),
    CONSUMO NUMERIC(18,2),
    SUBTOTIT NUMERIC(18,2),
    TOTAL NUMERIC(18,2),
    CODIGOCL VARCHAR(20),
    ZONACOD VARCHAR(2),
    ZONANOM VARCHAR(60),
    DV CHAR(1),
    DIRECCION VARCHAR(60),
    CIUDAD VARCHAR(40),
    TELEFONO VARCHAR(40),
    CONTACTO VARCHAR(60),
    FAX VARCHAR(25),
    CEL VARCHAR(25),
    GRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    SUBGRUPO VARCHAR(3),
    NOMSUBG VARCHAR(30),
    MARCA VARCHAR(3),
    NOMMARCA VARCHAR(30),
    PESO NUMERIC(9,4),
    ANCHO NUMERIC(18,4),
    ALTO NUMERIC(18,4),
    LARGO NUMERIC(18,4),
    SUMA1 NUMERIC(18,2),
    SUMA2 NUMERIC(18,2),
    SUMA3 NUMERIC(18,2),
    IVA1 NUMERIC(18,2),
    IVA2 NUMERIC(18,2),
    IVA3 NUMERIC(18,2),
    TOTCONSUMO NUMERIC(18,2),
    SUMAEX NUMERIC(18,2),
    SUMAGR NUMERIC(18,2),
    OBSITEM BLOB SUB_TYPE 1 SEGMENT SIZE 80)
AS
DECLARE VARIABLE IMPTOS CHAR(1);
DECLARE VARIABLE TARIFA INTEGER;
declare variable ORDENCOD CHAR(2);
declare variable SUCUR VARCHAR(10);
declare variable PUNTOS NUMERIC(18,4);
declare variable ICOINC CHAR(2);
BEGIN
execute procedure lee_configuracion('FACTURACION', 'ARTICULOS', 'IMPOCONSUMO INCLUIDO EN EL PRECIO BASE DE VENTA ANTES DE IVA') returning_values (icoinc);
SELECT F.PREF_PRE, DEVT_NUMERO, DEVT_FECHA, F.BODE_COD, BODE_NOM, F.TERC_NIT, DEVT_NOMTERC, F.VEND_COD, VEND_NOMBRE, F.PTVT_ID, PTVT_NOM,
    DEVT_FACTURA, DEVT_COMIPORC, DEVT_COMIMONTO, DEVT_IVAINC,
    DEVT_DTOPOR, DEVT_DTOMONTO, DEVT_ADICIONAL, DEVT_IVAMONTO, DEVT_RTFTEPORC, DEVT_RTFTEMONTO, DEVT_RTIVAPORC, DEVT_RTIVAMONTO, DEVT_RTICAPORC, DEVT_RTICAMONTO, DEVT_EXTRA, DEVT_TOTAL,
    TERC_CONTACTO, TERC_FAX, TERC_DV, TERC_CEL, DEVT_OBS, DEVT_SUCURSAL, DEVT_REMISION
    FROM DEVOLUCIONES_VENTAS F, BODEGA B, VENDEDORES V, PUNTO_VENTA P, TERCEROS T
    WHERE F.BODE_COD = B.BODE_COD AND F.VEND_COD = V.VEND_COD AND F.PTVT_ID = P.PTVT_ID AND F.TERC_NIT = T.TERC_NIT AND F.DEVT_ID = :ID
    into :PREF, :NUMERO, :FECHA, :CODBODEGA, :NOMBODEGA, :NIT, :NOMTERCERO, :VENDEDOR, :NOMVENDEDOR, :PUNTOVTA, :NOMPUNTOVTA,
    :FACTURA, :COMIPORC, :COMIMONTO, :IMPTOS,
    :DTOPORC, :DTOMONTO, :ADICIONAL, :IVAMONTO, :RTEFTEPORC, :RTEFTEMONTO, :RTEIVAPORC, :RTEIVAMONTO, :RTEICAPORC, :RTEICAMONTO, :EXTRA, :TOTALFAC,
    :CONTACTO, :FAX, :DV, :CEL, :OBS, :SUCUR, :REMISION;
SUBTOTAL = TOTALFAC - EXTRA - IVAMONTO - ADICIONAL + DTOMONTO;
TOTALPAGAR = TOTALFAC - RTEFTEMONTO - RTEIVAMONTO - RTEICAMONTO;

EXECUTE PROCEDURE acumula_puntos_cliente (33, :id, :nit, :fecha) returning_values (:PUNTOS);
SELECT CLIE_COD, C.ZONA_COD, ZONA_NOM
    FROM CLIENTES C, ZONAS Z
    WHERE TERC_NIT = :NIT AND C.ZONA_COD = Z.ZONA_COD
    INTO :CODIGOCL, :ZONACOD, :ZONANOM;
SELECT CLSU_DIR, CLSU_CIUDAD, CLSU_TEL FROM CLIENTE_SUCURSALES WHERE TERC_NIT = :NIT AND CLCU_COD = :SUCUR
    INTO :DIRECCION, :CIUDAD, :TELEFONO;
    
SUMAEX = 0;
SUMA1 = 0;
SUMA2 = 0;
SUMA3 = 0;
IVA1 = 0;
IVA2 = 0;
IVA3 = 0;
TOTCONSUMO = 0;
ITEM = 0;
EXECUTE PROCEDURE lee_configuracion ('FACTURACION','DOCUMENTOS','ORDENAR ITEMS POR CODIGO DE ARTICULO') returning_values (:ORDENCOD);
if (ORDENCOD = 'SI') then
    BEGIN
    FOR SELECT D.ARTI_COD, DVDE_CODBAR, SUBSTR(DVDE_DESC,1,60), DVDE_CANT, DVDE_UNIDAD, BODE_COD, DVDE_LOTE, DVDE_PRUNIT, DVDE_DTOPORC, DVDE_DTOMONTO, DVDE_IVAPORC, DVDE_IVAMONTO, DVDE_CONSUMO, DVDE_TOTAL, DVDE_REFERENCIA,
        GRUP_COD, SUBG_COD, MARC_COD, ARTI_PESO, ARTI_ANCHO, ARTI_ALTO, ARTI_LARGO, TAIV_COD, DVDE_OBS, DVDE_FACTOR
        FROM DEVOLUCIONES_VENTAS_DETALLE D, ARTICULO A
        WHERE D.ARTI_COD = A.ARTI_COD AND D.DEVT_ID = :ID
        ORDER BY DVDE_CODBAR
        INTO :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :BODITEM, :LOTE, :PRUNIT, :DTOITPORC, :DTOITMONTO, :IVAPORC, :IVAITMONTO, :CONSUMO, :TOTAL, :REFITEM,
        :GRUPO, :SUBGRUPO, :MARCA, :PESO, :ANCHO, :ALTO, :LARGO, :TARIFA, :obsitem, :FACTOR
        DO
        BEGIN
        if (ARTICULO = CODBAR) then
            SELECT FIRST 1 COBA_COD FROM barras_articulo WHERE ARTI_COD = :articulo INTO :CODBAR;
        ITEM = ITEM + 1;
        if (ICOINC = 'SI') then
            SUBTOTIT = TOTAL - IVAITMONTO;
        else
            SUBTOTIT = TOTAL - IVAITMONTO - CONSUMO;
        PRNETO = PRUNIT - DTOITMONTO;
        if (PESO IS NULL) then
            PESO = 0;
        PESO = PESO / 1000 * CANT * FACTOR;
        if (IMPTOS = 'S') then
            if (cant <> 0) then
                prnetosiniva = PRUNIT - DTOITMONTO - ((IVAITMONTO+CONSUMO) / CANT);
            else
                prnetosiniva = PRUNIT - DTOITMONTO;
        ELSE
            prnetosiniva = PRUNIT - DTOITMONTO;
        TOTCONSUMO = TOTCONSUMO + CONSUMO;
        if ((REFITEM <> '.t') or (REFITEM IS NULL)) then
            BEGIN
            /* NO SUME LOS ENSAMBLES */
            if (IVAPORC = 0) then
                SUMAEX = SUMAEX + TOTAL;
            if (TARIFA = 1) then
                BEGIN
                SUMA1 = SUMA1 + TOTAL - IVAITMONTO;
                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;
            END
        if (substr(ARTICULO,1,2) = '.t') then
            BEGIN
            REFITEM = '';
            TOTAL = 0;
            END
        SUSPEND;
        END
    END
ELSE
    BEGIN
    FOR SELECT D.ARTI_COD, DVDE_CODBAR, SUBSTR(DVDE_DESC,1,60), DVDE_CANT, DVDE_UNIDAD, BODE_COD, DVDE_LOTE, DVDE_PRUNIT, DVDE_DTOPORC, DVDE_DTOMONTO, DVDE_IVAPORC, DVDE_IVAMONTO, DVDE_CONSUMO, DVDE_TOTAL, DVDE_REFERENCIA,
        GRUP_COD, SUBG_COD, MARC_COD, ARTI_PESO, ARTI_ANCHO, ARTI_ALTO, ARTI_LARGO, TAIV_COD, DVDE_OBS, DVDE_FACTOR
        FROM DEVOLUCIONES_VENTAS_DETALLE D, ARTICULO A
        WHERE D.ARTI_COD = A.ARTI_COD AND D.DEVT_ID = :ID
        ORDER BY DVDE_ITEM
        INTO :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :BODITEM, :LOTE, :PRUNIT, :DTOITPORC, :DTOITMONTO, :IVAPORC, :IVAITMONTO, :CONSUMO, :TOTAL, :REFITEM,
        :GRUPO, :SUBGRUPO, :MARCA, :PESO, :ANCHO, :ALTO, :LARGO, :TARIFA, :obsitem, :FACTOR
        DO
        BEGIN
        if (ARTICULO = CODBAR) then
            SELECT FIRST 1 COBA_COD FROM barras_articulo WHERE ARTI_COD = :articulo INTO :CODBAR;
        SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :GRUPO INTO NOMGRUPO;
        SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :MARCA INTO NOMMARCA;
        SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :SUBGRUPO AND GRUP_COD = :GRUPO INTO :NOMSUBG;
        ITEM = ITEM + 1;
        if (ICOINC = 'SI') then
            SUBTOTIT = TOTAL - IVAITMONTO;
        else
            SUBTOTIT = TOTAL - IVAITMONTO - CONSUMO;
        PRNETO = PRUNIT - DTOITMONTO;
        if (PESO IS NULL) then
            PESO = 0;
        PESO = PESO / 1000 * CANT * FACTOR;
        if (IMPTOS = 'S') then
            if (cant <> 0) then
                prnetosiniva = PRUNIT - DTOITMONTO - ((IVAITMONTO+CONSUMO) / CANT);
            else
                prnetosiniva = PRUNIT - DTOITMONTO;
        ELSE
            prnetosiniva = PRUNIT - DTOITMONTO;
        TOTCONSUMO = TOTCONSUMO + CONSUMO;
        if ((REFITEM <> '.t') or (REFITEM IS NULL)) then
            BEGIN
            /* NO SUME LOS ENSAMBLES */
            if (IVAPORC = 0) then
                SUMAEX = SUMAEX + TOTAL;
            if (TARIFA = 1) then
                BEGIN
                SUMA1 = SUMA1 + TOTAL - IVAITMONTO;
                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;
            END
        if (substr(ARTICULO,1,2) = '.t') then
            BEGIN
            REFITEM = '';
            TOTAL = 0;
            END
        SUSPEND;
        END
    END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER PROCEDURE IMPR_COTIZACION(
    ID INTEGER)
RETURNS (
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    VALIDEZ INTEGER,
    NIT VARCHAR(20),
    NOMTERCERO VARCHAR(60),
    VENDEDOR INTEGER,
    NOMVENDEDOR VARCHAR(60),
    PUNTOVTA INTEGER,
    NOMPUNTOVTA VARCHAR(30),
    SUBTOTAL NUMERIC(18,2),
    DTOPORC NUMERIC(9,2),
    DTOMONTO NUMERIC(18,2),
    ADICIONAL NUMERIC(18,2),
    IVAMONTO NUMERIC(18,2),
    EXTRA NUMERIC(18,2),
    TOTALFAC NUMERIC(18,2),
    OBS BLOB SUB_TYPE 1 SEGMENT SIZE 80,
    ITEM INTEGER,
    ARTICULO VARCHAR(15),
    CODBAR VARCHAR(15),
    ARTIDES VARCHAR(60),
    CANT NUMERIC(18,4),
    UNIDAD VARCHAR(8),
    FACTOR NUMERIC(18,4),
    LISTAPR INTEGER,
    REFITEM VARCHAR(60),
    PRUNIT NUMERIC(18,2),
    DTOITPORC NUMERIC(9,2),
    DTOITMONTO NUMERIC(18,2),
    PRNETO NUMERIC(18,2),
    PRNETOSINIVA NUMERIC(18,2),
    IVAPORC NUMERIC(9,2),
    IVAITMONTO NUMERIC(18,2),
    CONSUMO NUMERIC(18,2),
    SUBTOTIT NUMERIC(18,2),
    TOTAL NUMERIC(18,2),
    CODIGOCL VARCHAR(20),
    ZONACOD VARCHAR(2),
    ZONANOM VARCHAR(60),
    DV CHAR(1),
    DIRECCION VARCHAR(60),
    CIUDAD VARCHAR(40),
    TELEFONO VARCHAR(40),
    CONTACTO VARCHAR(60),
    FAX VARCHAR(25),
    CEL VARCHAR(25),
    GRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    SUBGRUPO VARCHAR(3),
    NOMSUBG VARCHAR(30),
    MARCA VARCHAR(3),
    NOMMARCA VARCHAR(30),
    PESO NUMERIC(9,4),
    ANCHO NUMERIC(18,4),
    ALTO NUMERIC(18,4),
    LARGO NUMERIC(18,4),
    SUMA1 NUMERIC(18,2),
    SUMA2 NUMERIC(18,2),
    SUMA3 NUMERIC(18,2),
    IVA1 NUMERIC(18,2),
    IVA2 NUMERIC(18,2),
    IVA3 NUMERIC(18,2),
    SUMAEX NUMERIC(18,2),
    SUMAGR NUMERIC(18,2),
    OBSITEM BLOB SUB_TYPE 1 SEGMENT SIZE 80)
AS
DECLARE VARIABLE IMPTOS CHAR(1);
DECLARE VARIABLE TARIFA INTEGER;
declare variable ORDENCOD CHAR(2);
declare variable SUCUR VARCHAR(10);
declare variable ICOINC CHAR(2);
BEGIN
execute procedure lee_configuracion('FACTURACION', 'ARTICULOS', 'IMPOCONSUMO INCLUIDO EN EL PRECIO BASE DE VENTA ANTES DE IVA') returning_values (icoinc);
SELECT F.PREF_PRE, COTI_NUMERO, COTI_FECHA, COTI_VALIDEZ, F.TERC_NIT, COTI_NOMTERC, F.VEND_COD, VEND_NOMBRE, F.PTVT_ID, PTVT_NOM,
    COTI_IMPTOS, COTI_DTOPORC, COTI_DTOMONTO, COTI_ADICIONAL, COTI_IVAMONTO, COTI_EXTRA, COTI_TOTAL,
    TERC_CONTACTO, TERC_FAX, TERC_DV, TERC_CEL, COTI_OBS, COTI_SUCURSAL
    FROM COTIZACIONES F, VENDEDORES V, PUNTO_VENTA P, TERCEROS T
    WHERE F.VEND_COD = V.VEND_COD AND F.PTVT_ID = P.PTVT_ID AND F.TERC_NIT = T.TERC_NIT AND F.COTI_ID = :ID
    into :PREF, :NUMERO, :FECHA, :VALIDEZ, :NIT, :NOMTERCERO, :VENDEDOR, :NOMVENDEDOR, :PUNTOVTA, :NOMPUNTOVTA,
    :IMPTOS, :DTOPORC, :DTOMONTO, :ADICIONAL, :IVAMONTO, :EXTRA, :TOTALFAC,
    :CONTACTO, :FAX, :DV, :CEL, :OBS, :SUCUR;
SUBTOTAL = TOTALFAC - EXTRA - IVAMONTO - ADICIONAL + DTOMONTO;

SELECT CLIE_COD, C.ZONA_COD, ZONA_NOM
    FROM CLIENTES C, ZONAS Z
    WHERE TERC_NIT = :NIT AND C.ZONA_COD = Z.ZONA_COD
    INTO :CODIGOCL, :ZONACOD, :ZONANOM;
SELECT CLSU_DIR, CLSU_CIUDAD, CLSU_TEL FROM CLIENTE_SUCURSALES WHERE TERC_NIT = :NIT AND CLCU_COD = :SUCUR
    INTO :DIRECCION, :CIUDAD, :TELEFONO;
    
SUMAEX = 0;
SUMA1 = 0;
SUMA2 = 0;
SUMA3 = 0;
IVA1 = 0;
IVA2 = 0;
IVA3 = 0;
ITEM = 0;
EXECUTE PROCEDURE lee_configuracion ('FACTURACION','DOCUMENTOS','ORDENAR ITEMS POR CODIGO DE ARTICULO') returning_values (:ORDENCOD);
if (ORDENCOD = 'SI') then
    BEGIN
    FOR SELECT D.ARTI_COD, CTDE_CODBAR, SUBSTR(CTDE_DESC,1,60), CTDE_CANT, CTDE_UNIDAD, LIPR_COD, CTDE_PRUNIT, CTDE_DTOPORC, CTDE_DTOMONTO, CTDE_IVAPORC, CTDE_IVAMONTO, CTDE_CONSUMO, CTDE_TOTAL, CTDE_REFERENCIA,
        GRUP_COD, SUBG_COD, MARC_COD, ARTI_PESO, ARTI_ANCHO, ARTI_ALTO, ARTI_LARGO, TAIV_COD, CTDE_OBS, CTDE_FACTOR
        FROM COTIZACIONES_DETALLE D, ARTICULO A
        WHERE D.ARTI_COD = A.ARTI_COD AND D.COTI_ID = :ID
        ORDER BY CTDE_CODBAR
        INTO :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :LISTAPR, :PRUNIT, :DTOITPORC, :DTOITMONTO, :IVAPORC, :IVAITMONTO, :CONSUMO, :TOTAL, :refitem,
        :GRUPO, :SUBGRUPO, :MARCA, :PESO, :ANCHO, :ALTO, :LARGO, :TARIFA, :obsitem, :FACTOR
        DO
        BEGIN
        if (ICOINC = 'SI') then
            SUBTOTIT = TOTAL - IVAITMONTO;
        else
            SUBTOTIT = TOTAL - IVAITMONTO - CONSUMO;
        if (ARTICULO = CODBAR) then
            SELECT FIRST 1 COBA_COD FROM barras_articulo WHERE ARTI_COD = :articulo INTO :CODBAR;
        SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :GRUPO INTO NOMGRUPO;
        SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :MARCA INTO NOMMARCA;
        SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :SUBGRUPO AND GRUP_COD = :GRUPO INTO :NOMSUBG;
        ITEM = ITEM + 1;
        PRNETO = PRUNIT - DTOITMONTO;
        if (PESO IS NULL) then
            PESO = 0;
        PESO = PESO / 1000 * CANT * FACTOR;
        if (IMPTOS = 'S') then
            if (cant <> 0) then
                prnetosiniva = PRUNIT - DTOITMONTO - ((IVAITMONTO+CONSUMO) / CANT);
            else
                prnetosiniva = PRUNIT - DTOITMONTO;
        ELSE
            prnetosiniva = PRUNIT - DTOITMONTO;
        if (ivaporc = 0) then
            SUMAEX = SUMAEX + TOTAL;
        if (TARIFA = 1) then
            BEGIN
            SUMA1 = SUMA1 + TOTAL - IVAITMONTO;
            IVA1 = IVA1 + IVAITMONTO;
            END
        if (TARIFA = 2) then
            BEGIN
            SUMA2 = SUMA2 + TOTAL - IVAITMONTO;
            IVA2 = IVA2 + IVAITMONTO;
            END
        if (TARIFA = 3) then
            BEGIN
            SUMA3 = SUMA3 + TOTAL - IVAITMONTO;
            IVA3 = IVA3 + IVAITMONTO;
            END
        SUMAGR = SUMA1 + SUMA2 + SUMA3;
        if (IMPTOS = 'N') then
            TOTAL = TOTAL - IVAITMONTO;
        SUSPEND;
        END
    END
ELSE
    BEGIN
    FOR SELECT D.ARTI_COD, CTDE_CODBAR, SUBSTR(CTDE_DESC,1,60), CTDE_CANT, CTDE_UNIDAD, LIPR_COD, CTDE_PRUNIT, CTDE_DTOPORC, CTDE_DTOMONTO, CTDE_IVAPORC, CTDE_IVAMONTO, CTDE_CONSUMO, CTDE_TOTAL, CTDE_REFERENCIA,
        GRUP_COD, SUBG_COD, MARC_COD, ARTI_PESO, ARTI_ANCHO, ARTI_ALTO, ARTI_LARGO, TAIV_COD, CTDE_OBS, CTDE_FACTOR
        FROM COTIZACIONES_DETALLE D, ARTICULO A
        WHERE D.ARTI_COD = A.ARTI_COD AND D.COTI_ID = :ID
        ORDER BY CTDE_ITEM
        INTO :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :LISTAPR, :PRUNIT, :DTOITPORC, :DTOITMONTO, :IVAPORC, :IVAITMONTO, :CONSUMO, :TOTAL, :refitem,
        :GRUPO, :SUBGRUPO, :MARCA, :PESO, :ANCHO, :ALTO, :LARGO, :TARIFA, :obsitem, :FACTOR
        DO
        BEGIN
        SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :GRUPO INTO NOMGRUPO;
        SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :MARCA INTO NOMMARCA;
        SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :SUBGRUPO AND GRUP_COD = :GRUPO INTO :NOMSUBG;
        ITEM = ITEM + 1;
        if (ICOINC = 'SI') then
            SUBTOTIT = TOTAL - IVAITMONTO;
        else
            SUBTOTIT = TOTAL - IVAITMONTO - CONSUMO;
        PRNETO = PRUNIT - DTOITMONTO;
        if (PESO IS NULL) then
            PESO = 0;
        PESO = PESO / 1000 * CANT * FACTOR;
        if (IMPTOS = 'S') then
            if (cant <> 0) then
                prnetosiniva = PRUNIT - DTOITMONTO - ((IVAITMONTO+CONSUMO) / CANT);
            else
                prnetosiniva = PRUNIT - DTOITMONTO;
        ELSE
            prnetosiniva = PRUNIT - DTOITMONTO;
        if (ivaporc = 0) then
            SUMAEX = SUMAEX + TOTAL;
        if (TARIFA = 1) then
            BEGIN
            SUMA1 = SUMA1 + TOTAL - IVAITMONTO;
            IVA1 = IVA1 + IVAITMONTO;
            END
        if (TARIFA = 2) then
            BEGIN
            SUMA2 = SUMA2 + TOTAL - IVAITMONTO;
            IVA2 = IVA2 + IVAITMONTO;
            END
        if (TARIFA = 3) then
            BEGIN
            SUMA3 = SUMA3 + TOTAL - IVAITMONTO;
            IVA3 = IVA3 + IVAITMONTO;
            END
        SUMAGR = SUMA1 + SUMA2 + SUMA3;
        if (IMPTOS = 'N') then
            TOTAL = TOTAL - IVAITMONTO;
        SUSPEND;
        END
    END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER PROCEDURE IMPR_PEDIDO(
    ID INTEGER)
RETURNS (
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    VALIDEZ INTEGER,
    NIT VARCHAR(20),
    NOMTERCERO VARCHAR(60),
    VENDEDOR INTEGER,
    NOMVENDEDOR VARCHAR(60),
    PUNTOVTA INTEGER,
    NOMPUNTOVTA VARCHAR(30),
    COTIZACION VARCHAR(30),
    SUBTOTAL NUMERIC(18,2),
    DTOPORC NUMERIC(9,2),
    DTOMONTO NUMERIC(18,2),
    ADICIONAL NUMERIC(18,2),
    IVAMONTO NUMERIC(18,2),
    EXTRA NUMERIC(18,2),
    TOTALFAC NUMERIC(18,2),
    OBS BLOB SUB_TYPE 1 SEGMENT SIZE 80,
    ITEM INTEGER,
    ARTICULO VARCHAR(15),
    CODBAR VARCHAR(15),
    ARTIDES VARCHAR(60),
    BODEGA VARCHAR(2),
    CANT NUMERIC(18,4),
    UNIDAD VARCHAR(8),
    FACTOR NUMERIC(18,4),
    LISTAPR INTEGER,
    REFITEM VARCHAR(60),
    PRUNIT NUMERIC(18,2),
    DTOITPORC NUMERIC(9,2),
    DTOITMONTO NUMERIC(18,2),
    PRNETO NUMERIC(18,2),
    PRNETOSINIVA NUMERIC(18,2),
    DTOIT1 NUMERIC(9,2),
    DTOIT2 NUMERIC(9,2),
    DTOIT3 NUMERIC(9,2),
    IVAPORC NUMERIC(9,2),
    IVAITMONTO NUMERIC(18,2),
    CONSUMO NUMERIC(18,2),
    SUBTOTIT NUMERIC(18,2),
    TOTAL NUMERIC(18,2),
    CODIGOCL VARCHAR(20),
    ZONACOD VARCHAR(2),
    ZONANOM VARCHAR(60),
    DV CHAR(1),
    DIRECCION VARCHAR(60),
    CIUDAD VARCHAR(40),
    TELEFONO VARCHAR(40),
    CONTACTO VARCHAR(60),
    FAX VARCHAR(25),
    CEL VARCHAR(25),
    GRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    SUBGRUPO VARCHAR(3),
    NOMSUBG VARCHAR(30),
    MARCA VARCHAR(3),
    NOMMARCA VARCHAR(30),
    PESO NUMERIC(9,4),
    ANCHO NUMERIC(18,4),
    ALTO NUMERIC(18,4),
    LARGO NUMERIC(18,4),
    SUMA1 NUMERIC(18,2),
    SUMA2 NUMERIC(18,2),
    SUMA3 NUMERIC(18,2),
    IVA1 NUMERIC(18,2),
    IVA2 NUMERIC(18,2),
    IVA3 NUMERIC(18,2),
    SUMAEX NUMERIC(18,2),
    SUMAGR NUMERIC(18,2),
    DTOIT1M NUMERIC(18,2),
    DTOIT2M NUMERIC(18,2),
    DTOIT3M NUMERIC(18,2),
    OBSITEM BLOB SUB_TYPE 1 SEGMENT SIZE 80)
AS
DECLARE VARIABLE IMPTOS CHAR(1);
DECLARE VARIABLE TARIFA INTEGER;
declare variable ORDENCOD CHAR(2);
declare variable SUCUR VARCHAR(10);
declare variable ICOINC CHAR(2);
declare variable DTOITM1 NUMERIC(18,2);
declare variable DTOITM2 NUMERIC(18,2);
declare variable DTOITM3 NUMERIC(18,2);
BEGIN
execute procedure lee_configuracion('FACTURACION', 'ARTICULOS', 'IMPOCONSUMO INCLUIDO EN EL PRECIO BASE DE VENTA ANTES DE IVA') returning_values (icoinc);
SELECT F.PREF_PRE, PEDI_NUMERO, PEDI_FECHA, PEDI_VALIDEZ, F.TERC_NIT, PEDI_NOMTERC, F.VEND_COD, VEND_NOMBRE, F.PTVT_ID, PTVT_NOM, PEDI_COTIZACI,
    PEDI_IVAINC, PEDI_DTOPOR, PEDI_DTOMONTO, PEDI_ADICIONAL, PEDI_IVAMONTO, PEDI_EXTRA, PEDI_TOTAL,
    TERC_CONTACTO, TERC_FAX, TERC_DV, TERC_CEL, PEDI_OBS, PEDI_SUCURSAL, PEDI_DTOIT1, PEDI_DTOIT2, PEDI_DTOIT3
    FROM PEDIDOS F, VENDEDORES V, PUNTO_VENTA P, TERCEROS T
    WHERE F.VEND_COD = V.VEND_COD AND F.PTVT_ID = P.PTVT_ID AND F.TERC_NIT = T.TERC_NIT AND F.PEDI_ID = :ID
    into :PREF, :NUMERO, :FECHA, :VALIDEZ, :NIT, :NOMTERCERO, :VENDEDOR, :NOMVENDEDOR, :PUNTOVTA, :NOMPUNTOVTA, :COTIZACION,
    :IMPTOS, :DTOPORC, :DTOMONTO, :ADICIONAL, :IVAMONTO, :EXTRA, :TOTALFAC,
    :CONTACTO, :FAX, :DV, :CEL, :OBS, :SUCUR, :dtoit1m, :dtoit2m, :dtoit3m;
SUBTOTAL = TOTALFAC - EXTRA - IVAMONTO - ADICIONAL + DTOMONTO;

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

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER PROCEDURE IMPR_REMISION(
    ID INTEGER)
RETURNS (
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    NIT VARCHAR(20),
    NOMTERCERO VARCHAR(60),
    VENDEDOR INTEGER,
    NOMVENDEDOR VARCHAR(60),
    PUNTOVTA INTEGER,
    NOMPUNTOVTA VARCHAR(30),
    CODBODEGA VARCHAR(2),
    NOMBODEGA VARCHAR(30),
    COTIZACION VARCHAR(30),
    PEDIDO VARCHAR(30),
    FACTURA VARCHAR(30),
    SUBTOTAL NUMERIC(18,2),
    IVAMONTO NUMERIC(18,2),
    TOTALFAC NUMERIC(18,2),
    DESPACHO VARCHAR(255),
    TRANSPORTADOR VARCHAR(60),
    OBS BLOB SUB_TYPE 1 SEGMENT SIZE 80,
    ITEM INTEGER,
    ARTICULO VARCHAR(15),
    CODBAR VARCHAR(15),
    ARTIDES VARCHAR(60),
    CANT NUMERIC(18,4),
    LOTE VARCHAR(15),
    VLOTE DATE,
    UNIDAD VARCHAR(8),
    FACTOR NUMERIC(18,4),
    CAJAS NUMERIC(18,4),
    DEVUELTO NUMERIC(18,4),
    CONSUMIDO NUMERIC(18,4),
    LISTAPR INTEGER,
    REFITEM VARCHAR(60),
    BODITEM VARCHAR(2),
    STAND VARCHAR(15),
    PRUNIT NUMERIC(18,2),
    DTOITPORC NUMERIC(9,2),
    DTOITMONTO NUMERIC(18,2),
    PRNETOSINIVA NUMERIC(18,2),
    PRNETO NUMERIC(18,2),
    IVAPORC NUMERIC(9,2),
    IVAITMONTO NUMERIC(18,2),
    CONSUMO NUMERIC(18,2),
    SUBTOTIT NUMERIC(18,2),
    TOTAL NUMERIC(18,2),
    CODIGOCL VARCHAR(20),
    ZONACOD VARCHAR(2),
    ZONANOM VARCHAR(60),
    DV CHAR(1),
    DIRECCION VARCHAR(60),
    CIUDAD VARCHAR(40),
    TELEFONO VARCHAR(40),
    CONTACTO VARCHAR(60),
    FAX VARCHAR(25),
    CEL VARCHAR(25),
    GRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    SUBGRUPO VARCHAR(3),
    NOMSUBG VARCHAR(30),
    MARCA VARCHAR(3),
    NOMMARCA VARCHAR(30),
    PESO NUMERIC(9,4),
    ANCHO NUMERIC(18,4),
    ALTO NUMERIC(18,4),
    LARGO NUMERIC(18,4),
    SUMA1 NUMERIC(18,2),
    SUMA2 NUMERIC(18,2),
    SUMA3 NUMERIC(18,2),
    IVA1 NUMERIC(18,2),
    IVA2 NUMERIC(18,2),
    IVA3 NUMERIC(18,2),
    SUMAEX NUMERIC(18,2),
    SUMAGR NUMERIC(18,2),
    TOTCAJAS NUMERIC(18,2),
    OBSITEM BLOB SUB_TYPE 1 SEGMENT SIZE 80)
AS
DECLARE VARIABLE IMPTOS CHAR(1);
DECLARE VARIABLE TARIFA INTEGER;
declare variable ORDENCOD CHAR(2);
declare variable SUCUR VARCHAR(10);
declare variable ICOINC CHAR(2);
BEGIN
execute procedure lee_configuracion('FACTURACION', 'ARTICULOS', 'IMPOCONSUMO INCLUIDO EN EL PRECIO BASE DE VENTA ANTES DE IVA') returning_values (icoinc);
EXECUTE PROCEDURE lee_configuracion ('FACTURACION','DOCUMENTOS','ORDENAR ITEMS POR CODIGO DE ARTICULO') returning_values (:ORDENCOD);
SELECT F.PREF_PRE, REVT_NUMERO, REVT_FECHA, F.BODE_COD, BODE_NOM, F.TERC_NIT, REVT_NOMTERC, F.VEND_COD, VEND_NOMBRE, F.PTVT_ID, PTVT_NOM,
    REVT_COTIZACI, REVT_PEDIDO, REVT_FACTURA, REVT_IVAINC,
    REVT_IVAMONTO, REVT_TOTAL, REVT_DESPACHO, REVT_TRANSP,
    TERC_CONTACTO, TERC_FAX, TERC_DV, TERC_CEL, REVT_OBS, REVT_SUCURSAL
    FROM REMISIONES_VENTA F, BODEGA B, VENDEDORES V, PUNTO_VENTA P, TERCEROS T
    WHERE F.BODE_COD = B.BODE_COD AND F.VEND_COD = V.VEND_COD AND F.PTVT_ID = P.PTVT_ID AND F.TERC_NIT = T.TERC_NIT AND F.REVT_ID = :ID
    into :PREF, :NUMERO, :FECHA, :CODBODEGA, :NOMBODEGA, :NIT, :NOMTERCERO, :VENDEDOR, :NOMVENDEDOR, :PUNTOVTA, :NOMPUNTOVTA,
    :COTIZACION, :PEDIDO, :FACTURA, :IMPTOS,
    :IVAMONTO, :TOTALFAC, :DESPACHO, :transportador, 
    :CONTACTO, :FAX, :DV, :CEL, :OBS, :SUCUR;
SUBTOTAL = TOTALFAC - IVAMONTO;

SELECT CLIE_COD, C.ZONA_COD, ZONA_NOM
    FROM CLIENTES C, ZONAS Z
    WHERE TERC_NIT = :NIT AND C.ZONA_COD = Z.ZONA_COD
    INTO :CODIGOCL, :ZONACOD, :ZONANOM;
SELECT CLSU_DIR, CLSU_CIUDAD, CLSU_TEL FROM CLIENTE_SUCURSALES WHERE TERC_NIT = :NIT AND CLCU_COD = :SUCUR
    INTO :DIRECCION, :CIUDAD, :TELEFONO;
    
SUMAEX = 0;
SUMA1 = 0;
SUMA2 = 0;
SUMA3 = 0;
IVA1 = 0;
IVA2 = 0;
IVA3 = 0;
ITEM = 0;
totcajas = 0;
if (ORDENCOD = 'SI') then
    BEGIN
    FOR SELECT D.ARTI_COD, RVDE_CODBAR, SUBSTR(RVDE_DESC,1,60), RVDE_CANT, RVDE_UNIDAD, BODE_COD, RVDE_LOTE, LIPR_COD, RVDE_PRUNIT, RVDE_DTOPORC, RVDE_DTOMONTO, RVDE_IVAPORC, RVDE_IVAMONTO, RVDE_CONSUMO, RVDE_TOTAL, RVDE_REFERENCIA,
        GRUP_COD, SUBG_COD, MARC_COD, ARTI_PESO, ARTI_ANCHO, ARTI_ALTO, ARTI_LARGO, TAIV_COD, RVDE_DEVUELTO, RVDE_OBS, RVDE_CAJAS, RVDE_FACTOR
        FROM REMISIONES_VENTA_DETALLE D, ARTICULO A
        WHERE D.ARTI_COD = A.ARTI_COD AND D.REVT_ID = :ID
        ORDER BY RVDE_CODBAR
        INTO :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :BODITEM, :LOTE, :LISTAPR, :PRUNIT, :DTOITPORC, :DTOITMONTO, :IVAPORC, :IVAITMONTO, :CONSUMO, :TOTAL, :refitem,
            :GRUPO, :SUBGRUPO, :MARCA, :PESO, :ANCHO, :ALTO, :LARGO, :TARIFA, :DEVUELTO, :obsitem, :CAJAS, :FACTOR
        DO
        BEGIN
        if (ARTICULO = CODBAR) then
            SELECT FIRST 1 COBA_COD FROM barras_articulo WHERE ARTI_COD = :articulo INTO :CODBAR;
        SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :GRUPO INTO NOMGRUPO;
        SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :MARCA INTO NOMMARCA;
        SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :SUBGRUPO AND GRUP_COD = :GRUPO INTO :NOMSUBG;
        SELECT LOTE_VENCE FROM LOTES WHERE LOTE_NRO = :lote AND ARTI_COD = :ARTICULO AND BODE_COD = :boditem INTO :vlote;
        if (ICOINC = 'SI') then
            SUBTOTIT = TOTAL - IVAITMONTO;
        else
            SUBTOTIT = TOTAL - IVAITMONTO - CONSUMO;
        CONSUMIDO = cant * factor - devuelto;
        ITEM = ITEM + 1;
        PRNETO = PRUNIT - DTOITMONTO;
        if (PESO IS NULL) then
            PESO = 0;
        PESO = PESO / 1000 * CANT * FACTOR;
        if (IMPTOS = 'S') then
            if (cant <> 0) then
                prnetosiniva = PRUNIT - DTOITMONTO - ((IVAITMONTO+CONSUMO) / CANT);
            else
                prnetosiniva = PRUNIT - DTOITMONTO;
        ELSE
            prnetosiniva = PRUNIT - DTOITMONTO;
        if (IVAPORC = 0) then
            SUMAEX = SUMAEX + TOTAL;
        if (TARIFA = 1) then
            BEGIN
            SUMA1 = SUMA1 + TOTAL - IVAITMONTO;
            IVA1 = IVA1 + IVAITMONTO;
            END
        if (TARIFA = 2) then
            BEGIN
            SUMA2 = SUMA2 + TOTAL - IVAITMONTO;
            IVA2 = IVA2 + IVAITMONTO;
            END
        if (TARIFA = 3) then
            BEGIN
            SUMA3 = SUMA3 + TOTAL - IVAITMONTO;
            IVA3 = IVA3 + IVAITMONTO;
            END
        SUMAGR = SUMA1 + SUMA2 + SUMA3;

        totcajas = totcajas + cajas;
        SELECT STAND_COD FROM STANDS WHERE ARTI_COD = :ARTICULO AND STAND_BODEGA = :boditem INTO :stand;
        SUSPEND;
        END
    END
ELSE
    BEGIN
    FOR SELECT RVDE_ITEM, D.ARTI_COD, RVDE_CODBAR, SUBSTR(RVDE_DESC,1,60), RVDE_CANT, RVDE_UNIDAD, BODE_COD, RVDE_LOTE, LIPR_COD, RVDE_PRUNIT, RVDE_DTOPORC, RVDE_DTOMONTO, RVDE_IVAPORC, RVDE_IVAMONTO, RVDE_CONSUMO, RVDE_TOTAL, RVDE_REFERENCIA,
        GRUP_COD, SUBG_COD, MARC_COD, ARTI_PESO, ARTI_ANCHO, ARTI_ALTO, ARTI_LARGO, TAIV_COD, RVDE_DEVUELTO, RVDE_OBS, RVDE_CAJAS, RVDE_FACTOR
        FROM REMISIONES_VENTA_DETALLE D, ARTICULO A
        WHERE D.ARTI_COD = A.ARTI_COD AND D.REVT_ID = :ID
        ORDER BY RVDE_ITEM
        INTO :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :BODITEM, :LOTE, :LISTAPR, :PRUNIT, :DTOITPORC, :DTOITMONTO, :IVAPORC, :IVAITMONTO, :CONSUMO, :TOTAL, :refitem,
            :GRUPO, :SUBGRUPO, :MARCA, :PESO, :ANCHO, :ALTO, :LARGO, :TARIFA, :DEVUELTO, :obsitem, :CAJAS, :FACTOR
        DO
        BEGIN
        SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :GRUPO INTO NOMGRUPO;
        SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :MARCA INTO NOMMARCA;
        SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :SUBGRUPO AND GRUP_COD = :GRUPO INTO :NOMSUBG;
        SELECT LOTE_VENCE FROM LOTES WHERE LOTE_NRO = :lote AND ARTI_COD = :ARTICULO AND BODE_COD = :boditem INTO :vlote;
        if (ICOINC = 'SI') then
            SUBTOTIT = TOTAL - IVAITMONTO;
        else
            SUBTOTIT = TOTAL - IVAITMONTO - CONSUMO;
        CONSUMIDO = cant * factor - devuelto;
        ITEM = ITEM + 1;
        PRNETO = PRUNIT - DTOITMONTO;
        if (PESO IS NULL) then
            PESO = 0;
        PESO = PESO / 1000 * CANT * FACTOR;
        if (IMPTOS = 'S') then
            if (cant <> 0) then
                prnetosiniva = PRUNIT - DTOITMONTO - ((IVAITMONTO+CONSUMO) / CANT);
            else
                prnetosiniva = PRUNIT - DTOITMONTO;
        ELSE
            prnetosiniva = PRUNIT - DTOITMONTO;
        if (IVAPORC = 0) then
            SUMAEX = SUMAEX + TOTAL;
        if (TARIFA = 1) then
            BEGIN
            SUMA1 = SUMA1 + TOTAL - IVAITMONTO;
            IVA1 = IVA1 + IVAITMONTO;
            END
        if (TARIFA = 2) then
            BEGIN
            SUMA2 = SUMA2 + TOTAL - IVAITMONTO;
            IVA2 = IVA2 + IVAITMONTO;
            END
        if (TARIFA = 3) then
            BEGIN
            SUMA3 = SUMA3 + TOTAL - IVAITMONTO;
            IVA3 = IVA3 + IVAITMONTO;
            END
        SUMAGR = SUMA1 + SUMA2 + SUMA3;
        totcajas = totcajas + cajas;
        SELECT STAND_COD FROM STANDS WHERE ARTI_COD = :ARTICULO AND STAND_BODEGA = :boditem INTO :stand;
        SUSPEND;
        END
    END
END
^

SET TERM ; ^


/* 20090318 */
/* BASE RETENCIONES NEGATIVA */
SET TERM ^ ;

CREATE OR ALTER PROCEDURE CONTABIL_NOTADBPR(
    IDDOC INTEGER,
    IDINTER INTEGER)
RETURNS (
    ERROR INTEGER,
    VER CHAR(1),
    IDC INTEGER)
AS
declare variable PREF VARCHAR(4);
declare variable NUM VARCHAR(6);
declare variable NUMERO VARCHAR(10);
declare variable FECAUX DATE;
declare variable FECHA CHAR(8);
declare variable CONC CHAR(120);
declare variable VENCEAUX DATE;
declare variable VENCE CHAR(8);
declare variable VRSUBT NUMERIC(18, 2);
declare variable BASE0 NUMERIC(18, 2);
declare variable BASE1 NUMERIC(18, 2);
declare variable BASE2 NUMERIC(18, 2);
declare variable VRIVA NUMERIC(18, 2);
declare variable IVA1 NUMERIC(18, 2);
declare variable IVA2 NUMERIC(18, 2);
declare variable PRTFTE NUMERIC(9, 2);
declare variable VRRTFTE NUMERIC(18, 2);
declare variable PRTIVA NUMERIC(9, 2);
declare variable VRRTIVA NUMERIC(18, 2);
declare variable PRTICA NUMERIC(9, 2);
declare variable VRRTICA NUMERIC(18, 2);
declare variable VRTOTAL NUMERIC(18, 2);
declare variable TIPOCOMP VARCHAR(3);
declare variable PREFCONT VARCHAR(4);
declare variable BASE CHAR(1);
declare variable CTABASE VARCHAR(20);
declare variable IVA CHAR(1);
declare variable CTAIVA VARCHAR(20);
declare variable CLIE CHAR(1);
declare variable CTACLIE VARCHAR(20);
declare variable RTFTE CHAR(1);
declare variable CTARTFTE VARCHAR(20);
declare variable RTIVA CHAR(1);
declare variable CTARTIVA VARCHAR(20);
declare variable RTICA CHAR(1);
declare variable CTARTICA VARCHAR(20);
declare variable EXISTE CHAR(1);
declare variable CUENTA VARCHAR(20);
declare variable MONTO NUMERIC(18,2);
declare variable ES_RETENCION CHAR(1);
declare variable TIPOCUEN CHAR(1);
declare variable NIT VARCHAR(20);
declare variable PROY VARCHAR(4);
declare variable CENTRO VARCHAR(4);
declare variable MONTOBASE NUMERIC(18,2);
declare variable PORC NUMERIC(5,2);
declare variable DEBITO NUMERIC(18,2);
declare variable CREDITO NUMERIC(18,2);
declare variable NROI INTEGER;
declare variable SUMA NUMERIC(18,2);
declare variable TCTACLIEN VARCHAR(20);
declare variable TCTABASE VARCHAR(20);
declare variable TCTARTFTE VARCHAR(20);
declare variable TCTARTIVA VARCHAR(20);
declare variable TCTARTICA VARCHAR(20);
declare variable CUENTAADIC VARCHAR(20);
declare variable BASEADIC VARCHAR(20);
declare variable PORCADIC NUMERIC(5,2);
declare variable VALORADIC NUMERIC(18,2);
declare variable DBADIC CHAR(1);
declare variable NPROY VARCHAR(4);
declare variable NCENTRO VARCHAR(4);
declare variable ANULADO CHAR(1);
declare variable TARIFA INTEGER;
BEGIN
ERROR = 0;
/* BUSQUE LA INTERFACE */
EXISTE = 'N';
SELECT 'S', TICO_COD, PRCO_PRE, INCP_BASE, INCP_IVA, INCP_RTFTE, INCP_RTIVA, INCP_RTICA, INCP_PROV, INCP_CTABASE, INCP_CTAIVA, INCP_CTARTFTE, INCP_CTARTIVA, INCP_CTARTICA, INCP_CTAPROV, INCP_CONFIRMAR
    FROM INTERFAZ_CXPAGAR
    WHERE INCP_ID = :IDINTER
    INTO :EXISTE, :TIPOCOMP, :PREFCONT, :BASE, :IVA, :RTFTE, :RTIVA, :RTICA, :CLIE, :CTABASE, :CTAIVA, :CTARTFTE, :CTARTIVA, :CTARTICA, :CTACLIE, :VER;

if (EXISTE = 'S') then
  BEGIN
  /* BORRE CUALQUEIR CONTABILIZACION PREVIA */
  DELETE FROM CONTABILIZACION WHERE CNTB_TIPOREF = 51 AND CNTB_IDREF = :IDDOC;
  /* TRAIGA EL ENCABEZADO DE LA NOTA */
  SELECT PREF_PRE, NDPR_NUMERO, NDPR_FECHA, NDPR_VENCE, N.TERC_NIT, NDPR_CONC, NDPR_IVAPORC, NDPR_IVAMONTO, NDPR_MONTO, NDPR_RTFTEPORC, NDPR_RTFTEMONTO, NDPR_RTIVAPORC, NDPR_RTIVAMONTO, NDPR_RTICAPORC, NDPR_RTICAMONTO, TERC_CTAVENTA, TERC_CTARTFTE, TERC_CTARTIVA, TERC_CTARTICA, TERC_CTACLIENTE, NDPR_PROY, NDPR_CENTRO, NDPR_ANULADO, NDPR_BASE0, NDPR_BASE1, NDPR_BASE2, NDPR_IVA1, NDPR_IVA2
        FROM NOTAS_DEBITO_PROVEEDOR N, TERCEROS T
        WHERE NDPR_ID = :IDDOC AND N.TERC_NIT = T.TERC_NIT
        INTO :PREF, :NUM, :FECAUX, :VENCEAUX, :NIT, :CONC, :PORC, :VRIVA, :VRTOTAL, :PRTFTE, :VRRTFTE, :PRTIVA, :VRRTIVA, :PRTICA, :VRRTICA, :TCTABASE, TCTARTFTE, TCTARTIVA, TCTARTICA, TCTACLIEN, NPROY, NCENTRO, ANULADO, :BASE0, BASE1, :BASE2, :IVA1, :IVA2;
  if (ANULADO = 'N') then
    BEGIN
    /* SI ES PROVEEDOR, SOBREESCIBE LAS CUENTAS  */
    SELECT PROV_CTAPAGAR, PROV_CTARTFTE, PROV_CTARTIVA, PROV_CTARTICA, PROV_CTACAUSA
        FROM PROVEEDORES WHERE TERC_NIT = :NIT
        INTO TCTACLIEN, TCTARTFTE, TCTARTIVA, TCTARTICA, TCTABASE;
        
    /* SI EL DOCUMENTO ESPECIFICA ALGUNAS SOBRESCRIBA LAS DEL PROVEEDOR */
    SELECT NDPR_CTAPAGAR, NDPR_CTACAUSA
        FROM NOTAS_DEBITO_PROVEEDOR
        WHERE NDPR_ID = :IDDOC
        INTO :TCTACLIEN, TCTABASE;
    SELECT PREF_CENTRO, PREF_PROY FROM PREFIJOS P, NOTAS_DEBITO_PROVEEDOR N
        WHERE P.PREF_PRE = N.PREF_PRE AND P.TIDO_COD = 51 AND N.NDPR_ID = :IDDOC INTO :CENTRO, :PROY;
    if (NPROY <> '') then
        PROY = NPROY;
    if (NCENTRO <> '') then
        CENTRO = NCENTRO;
    NUMERO = PREF || NUM;
    VRSUBT = VRTOTAL; /* BASE DE RETEFTE Y RETEICA */

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

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

    NROI = 0;
    SUMA = 0;

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

        if (VRSUBT <> 0) then
            BEGIN
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO, CUEN_RETENCION FROM CUENTAS
                WHERE CUEN_COD = :CTABASE INTO :CUENTA, :TIPOCUEN, :ES_RETENCION;
            if (CUENTA IS NULL) then
                begin
                INSERT INTO  ERRORES (ERRO_ITEM, ERRO_TIPODOC, ERRO_IDDOC, ERRO_CODIGO, ERRO_CANT, ERRO_CADENA)
                    VALUES(GEN_ID(id_errores, 1), 51, :IDDOC, 'CUENTA NO EXISTE', 0, :CTABASE);
                CUENTA = CTABASE;
                ERROR = ERROR + 1;
                end
            if (ES_RETENCION = 'S') then
                if ((prtiva <> 0) and (vriva = 0)) then
                    montobase = FLOOR(VRSUBT / prtiva);
                else
                    montobase = VRSUBT;
            else
                montobase = 0;
            if (TIPOCUEN = 'I') then
                BEGIN
                INSERT INTO  ERRORES (ERRO_ITEM, ERRO_TIPODOC, ERRO_IDDOC, ERRO_CODIGO, ERRO_CANT, ERRO_CADENA)
                    VALUES(GEN_ID(id_errores, 1), 51, :IDDOC, 'CUENTA DE INVENTARIO', 0, :CUENTA);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRSUBT, 0, :MONTOBASE, :prtiva, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 41);
                NROI = NROI + 1;
                SUMA = SUMA + VRSUBT;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRSUBT, 0, :MONTOBASE, :prtiva, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA + VRSUBT;
                END
            END /* MONTO <> 0 */
        END /* BASE TERCERO O CONSTANTE */
    IF ((BASE = 'I')) THEN
        BEGIN
        FOR SELECT TAIV_CTACOMP, TAIV_COD FROM TARIFA_IVA WHERE TAIV_COD <= 2 INTO :CTABASE, :tarifa
            DO
            BEGIN
            if (TARIFA = 0) then
                vrsubt = BASE0;
            if (TARIFA = 1) then
                vrsubt = BASE1;
            if (TARIFA = 2) then
                vrsubt = BASE2;
            if (VRSUBT <> 0) then
                BEGIN
                CUENTA = NULL;
                SELECT CUEN_COD, CUEN_TIPO, CUEN_RETENCION FROM CUENTAS
                    WHERE CUEN_COD = :CTABASE INTO :CUENTA, :TIPOCUEN, :ES_RETENCION;
                if (CUENTA IS NULL) then
                    begin
                    INSERT INTO  ERRORES (ERRO_ITEM, ERRO_TIPODOC, ERRO_IDDOC, ERRO_CODIGO, ERRO_CANT, ERRO_CADENA)
                        VALUES(GEN_ID(id_errores, 1), 51, :IDDOC, 'CUENTA NO EXISTE', 0, :CTABASE);
                    CUENTA = CTABASE;
                    ERROR = ERROR + 1;
                    end
                montobase = 0;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    INSERT INTO  ERRORES (ERRO_ITEM, ERRO_TIPODOC, ERRO_IDDOC, ERRO_CODIGO, ERRO_CANT, ERRO_CADENA)
                        VALUES(GEN_ID(id_errores, 1), 51, :IDDOC, 'CUENTA DE INVENTARIO', 0, :CUENTA);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRSUBT, 0, :MONTOBASE, :prtiva, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 41);
                    NROI = NROI + 1;
                    SUMA = SUMA + VRSUBT;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRSUBT, 0, :MONTOBASE, :prtiva, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA + VRSUBT;
                    END
                END /* MONTO <> 0 */
            END
        END /* BASE TARIFA DE IVA */

    VRSUBT = VRTOTAL; /* BASE DE RETEFTE Y RETEICA */
    if (IVA = 'I') then /* IVA POR TARIFA */
        BEGIN
        FOR SELECT TAIV_CTAIVACMP, TAIV_COD FROM TARIFA_IVA WHERE (TAIV_COD <> 0) AND (TAIV_COD <= 2) INTO :CTAIVA, :tarifa
            DO
            BEGIN
            if (TARIFA = 1) then
                VRIVA = IVA1;
            if (TARIFA = 2) then
                VRIVA = IVA2;
            if (VRIVA <> 0) then
                BEGIN
                CUENTA = NULL;
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :CTAIVA INTO :CUENTA, :TIPOCUEN;
                if (CUENTA IS NULL) then
                    begin
                    INSERT INTO  ERRORES (ERRO_ITEM, ERRO_TIPODOC, ERRO_IDDOC, ERRO_CODIGO, ERRO_CANT, ERRO_CADENA)
                        VALUES(GEN_ID(id_errores, 1), 51, :IDDOC, 'CUENTA NO EXISTE', 0, :CTAIVA);
                    CUENTA = CTAIVA;
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    INSERT INTO  ERRORES (ERRO_ITEM, ERRO_TIPODOC, ERRO_IDDOC, ERRO_CODIGO, ERRO_CANT, ERRO_CADENA)
                        VALUES(GEN_ID(id_errores, 1), 51, :IDDOC, 'CUENTA DE INVENTARIO', 0, :CUENTA);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', :VRIVA, 0, :vrsubt, :porc, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 41);
                    NROI = NROI + 1;
                    SUMA = SUMA + VRIVA;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', :VRIVA, 0, :vrsubt, :porc, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA + VRIVA;
                    END
                END /* VRIVA <> 0 */
            end /* FOR */
        END /* IVA EN CTA CONSTANTE */
        
    if (IVA = 'K') then /* IVA EN CTA CONSTANTE */
        BEGIN
        if (VRIVA <> 0) then
            BEGIN
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTAIVA INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                INSERT INTO  ERRORES (ERRO_ITEM, ERRO_TIPODOC, ERRO_IDDOC, ERRO_CODIGO, ERRO_CANT, ERRO_CADENA)
                    VALUES(GEN_ID(id_errores, 1), 51, :IDDOC, 'CUENTA NO EXISTE', 0, :CTAIVA);
                CUENTA = CTAIVA;
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                INSERT INTO  ERRORES (ERRO_ITEM, ERRO_TIPODOC, ERRO_IDDOC, ERRO_CODIGO, ERRO_CANT, ERRO_CADENA)
                    VALUES(GEN_ID(id_errores, 1), 51, :IDDOC, 'CUENTA DE INVENTARIO', 0, :CUENTA);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', :VRIVA, 0, :vrsubt, :porc, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 41);
                NROI = NROI + 1;
                SUMA = SUMA + VRIVA;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', :VRIVA, 0, :vrsubt, :porc, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA + VRIVA;
                END
            END /* VRIVA <> 0 */
        END /* IVA EN CTA CONSTANTE */
        
    /* RETENCION FUENTE */
    if ((RTFTE = 'T') or (RTFTE = 'K')) then
      if (VRRTFTE <> 0) then
        BEGIN
        if (RTFTE = 'T') then
            CTARTFTE = TCTARTFTE;
            
        CUENTA = NULL;
        SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
            WHERE CUEN_COD = :CTARTFTE INTO :CUENTA, :TIPOCUEN;
        if (CUENTA IS NULL) then
            begin
            INSERT INTO  ERRORES (ERRO_ITEM, ERRO_TIPODOC, ERRO_IDDOC, ERRO_CODIGO, ERRO_CANT, ERRO_CADENA)
                VALUES(GEN_ID(id_errores, 1), 51, :IDDOC, 'CUENTA NO EXISTE', 0, :CTARTFTE);
            CUENTA = CTARTFTE;
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            INSERT INTO  ERRORES (ERRO_ITEM, ERRO_TIPODOC, ERRO_IDDOC, ERRO_CODIGO, ERRO_CANT, ERRO_CADENA)
                    VALUES(GEN_ID(id_errores, 1), 51, :IDDOC, 'CUENTA DE INVENTARIO', 0, :CUENTA);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, (:VRSUBT*-1), :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 41);
            NROI = NROI + 1;
            SUMA = SUMA - VRRTFTE;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, (:VRSUBT*-1), :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA - VRRTFTE;
            END
        END /* RTFTE */
        
    /* RETENCION IVA */
    if ((RTIVA = 'T') or (RTIVA = 'K')) then
      if (VRRTIVA <> 0) then
        BEGIN
        if (RTIVA = 'T') then
            CTARTIVA = TCTARTIVA;
            
        CUENTA = NULL;
        SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
            WHERE CUEN_COD = :CTARTIVA INTO :CUENTA, :TIPOCUEN;
        if (CUENTA IS NULL) then
            begin
            INSERT INTO  ERRORES (ERRO_ITEM, ERRO_TIPODOC, ERRO_IDDOC, ERRO_CODIGO, ERRO_CANT, ERRO_CADENA)
                VALUES(GEN_ID(id_errores, 1), 51, :IDDOC, 'CUENTA NO EXISTE', 0, :CTARTIVA);
            CUENTA = CTARTIVA;
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            INSERT INTO  ERRORES (ERRO_ITEM, ERRO_TIPODOC, ERRO_IDDOC, ERRO_CODIGO, ERRO_CANT, ERRO_CADENA)
                VALUES(GEN_ID(id_errores, 1), 51, :IDDOC, 'CUENTA DE INVENTARIO', 0, :CUENTA);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTIVA, (:VRIVA*-1), :prtiva, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 41);
            NROI = NROI + 1;
            SUMA = SUMA - VRRTIVA;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTIVA, (:VRIVA*-1), :prtiva, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA - VRRTIVA;
            END
        END /* RTIVA */
        
    /* RETENCION DE ICA */
    if ((RTICA = 'T') or (RTICA = 'K')) then
      if (VRRTICA <> 0) then
        BEGIN
        if (RTICA = 'T') then
            CTARTICA = TCTARTICA;
            
        CUENTA = NULL;
        SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
            WHERE CUEN_COD = :CTARTICA INTO :CUENTA, :TIPOCUEN;
        if (CUENTA IS NULL) then
            begin
            INSERT INTO  ERRORES (ERRO_ITEM, ERRO_TIPODOC, ERRO_IDDOC, ERRO_CODIGO, ERRO_CANT, ERRO_CADENA)
                    VALUES(GEN_ID(id_errores, 1), 51, :IDDOC, 'CUENTA NO EXISTE', 0, :CTARTICA);
            CUENTA = CTARTICA;
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            INSERT INTO  ERRORES (ERRO_ITEM, ERRO_TIPODOC, ERRO_IDDOC, ERRO_CODIGO, ERRO_CANT, ERRO_CADENA)
                VALUES(GEN_ID(id_errores, 1), 51, :IDDOC, 'CUENTA DE INVENTARIO', 0, :CUENTA);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTICA, (:VRSUBT*-1), :PRTICA, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 41);
            NROI = NROI + 1;
            SUMA = SUMA - VRRTICA;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTICA, (:VRSUBT*-1), :PRTICA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA - VRRTICA;
            END
        END /* RTICA */
        
    /* recorra las cuentas adicionales */
    FOR SELECT INPC_CUENTA, INPC_BASE, INPC_PORC, INPC_VALOR, INPC_DB
        FROM INTERFAZ_CXPAGAR_CTAS
        WHERE INCP_ID = :IDINTER
        INTO :CUENTAADIC, :BASEADIC, :PORCADIC, :VALORADIC, :DBADIC
        DO
        BEGIN
        if (:BASEADIC = 'SUBTOTAL') then
            VALORADIC = VRTOTAL - VRIVA;
        if (:BASEADIC = 'IVA') then
            VALORADIC = VRIVA;
        if (:BASEADIC = 'TOTAL') then
            VALORADIC = VRTOTAL;
        MONTO = VALORADIC * PORCADIC;
        
        /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
        CUENTA = NULL;
        SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
            WHERE CUEN_COD = :CUENTAADIC INTO :CUENTA, :TIPOCUEN;
        IF (CUENTA IS NULL) THEN
            begin
            INSERT INTO  ERRORES (ERRO_ITEM, ERRO_TIPODOC, ERRO_IDDOC, ERRO_CODIGO, ERRO_CANT, ERRO_CADENA)
                    VALUES(GEN_ID(id_errores, 1), 51, :IDDOC, 'CUENTA NO EXISTE', 0, :CUENTAADIC);
            CUENTA = CUENTAADIC;
            ERROR = ERROR + 1;
            end
        /* DEPENDE DEL TIPO DE CUENTA */
        if (TIPOCUEN = 'I') then
            BEGIN
            INSERT INTO  ERRORES (ERRO_ITEM, ERRO_TIPODOC, ERRO_IDDOC, ERRO_CODIGO, ERRO_CANT, ERRO_CADENA)
                VALUES(GEN_ID(id_errores, 1), 51, :IDDOC, 'CUENTA DE INVENTARIO', 0, :CUENTA);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            if (DBADIC = 'S') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTAADIC, :CONC, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 31);
                SUMA = SUMA + MONTO;
                END
            ELSE
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTAADIC, :CONC, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 31);
                SUMA = SUMA - MONTO;
                END
            NROI = NROI + 1;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            if (DBADIC = 'S') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTAADIC, :CONC, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                SUMA = SUMA + MONTO;
                END
            ELSE
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTAADIC, :CONC, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                SUMA = SUMA - MONTO;
                END
            NROI = NROI + 1;
            END
        
        NROI = NROI + 1;
        END
        
    /* CIERRE EL COMPROBANTE CONTRA LA CUENTA DEL TERCERO O LA CONSTANTE */
    if ((SUMA <> 0) and ((CLIE = 'T') or (CLIE = 'K'))) then
        BEGIN
        if (SUMA < 0) then
            BEGIN
            DEBITO = SUMA * -1;
            CREDITO = 0;
            END
        ELSE
            BEGIN
            DEBITO = 0;
            CREDITO = SUMA;
            END
        if (CLIE = 'T') then
            CTACLIE = TCTACLIEN;

        CUENTA = NULL;
        SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
            WHERE CUEN_COD = :CTACLIE INTO :CUENTA, :TIPOCUEN;
        IF (CUENTA IS NULL) then
            begin
            INSERT INTO  ERRORES (ERRO_ITEM, ERRO_TIPODOC, ERRO_IDDOC, ERRO_CODIGO, ERRO_CANT, ERRO_CADENA)
                VALUES(GEN_ID(id_errores, 1), 51, :IDDOC, 'CUENTA NO EXISTE', 0, :CTACLIE);
            CUENTA = CTACLIE;
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            INSERT INTO  ERRORES (ERRO_ITEM, ERRO_TIPODOC, ERRO_IDDOC, ERRO_CODIGO, ERRO_CANT, ERRO_CADENA)
                VALUES(GEN_ID(id_errores, 1), 51, :IDDOC, 'CUENTA DE INVENTARIO', 0, :CUENTA);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :DEBITO, :CREDITO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 41);
        if (TIPOCUEN = 'N') then
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :DEBITO, :CREDITO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
        NROI = NROI + 1;
        END /* SUMA EN CARTERA */
    if (ERROR > 0) then
        VER = 'S';
    SUSPEND;
    END /* ANULADO */
  END /* EXISTE LA INTERFAZ */
ELSE
    BEGIN
    INSERT INTO  ERRORES (ERRO_ITEM, ERRO_TIPODOC, ERRO_IDDOC, ERRO_CODIGO, ERRO_CANT, ERRO_CADENA)
        VALUES(GEN_ID(id_errores, 1), 51, :IDDOC, 'INTERFAZ NO EXISTE', 0, :pref);
    ERROR = ERROR + 1;
    VER = 'S';
    SUSPEND;
    END
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE NOTADBPR_SIN_CONTABILIDAD(
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    ID INTEGER,
    IDI INTEGER,
    IDC INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    ESTADO VARCHAR(20),
    ERROR INTEGER)
AS
DECLARE VARIABLE VER CHAR(2);
declare variable FECICNT VARCHAR(10);
declare variable FECFCNT VARCHAR(10);
declare variable idref INTEGER;
BEGIN /*$$IBE$$ 
EXECUTE PROCEDURE fecha_a_conta(FECINI) returning_values (FECICNT);
EXECUTE PROCEDURE fecha_a_conta(FECFIN) returning_values (FECFCNT);
FOR SELECT NDPR_ID, PREF_PRE, NDPR_NUMERO FROM NOTAS_DEBITO_PROVEEDOR WHERE NDPR_ANULADO = 'N' AND
    NDPR_FECHA >= :FECINI AND NDPR_FECHA <= :FECFIN
    ORDER BY NDPR_ID INTO :ID, :PREF, :NUMERO
DO
  BEGIN
  idref = null;
  SELECT ENCO_IDREF FROM COMPROBANTE_ENCABEZADO WHERE ENCO_TIPOREF = 51 AND ENCO_FECHA >= :FECICNT AND ENCO_FECHA <= :FECFCNT and ENCO_IDREF = :id into :idref;
  if (idref IS NULL) then
  begin
  ESTADO = 'PROCESANDO';
  SUSPEND;
  SELECT MAX(INCA_ID) FROM INTERFAZ_CARTERA WHERE PREF_PRE = :PREF AND TIDO_COD = 51 INTO :IDI;
  if (IDI IS NOT NULL) then
    BEGIN
    EXECUTE PROCEDURE CONTABIL_NOTADBPR (:ID, :IDI) RETURNING_VALUES (:ERROR, :VER, :IDC);
    if (ERROR = 0) then
      BEGIN
      EXECUTE PROCEDURE CONTABILIZA_PENDIENTE (:IDC);
      ESTADO = 'OK';
      END
    ELSE
      ESTADO = 'ERROR';
    suspend;
    END
  end
  END
 $$IBE$$*/ SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE NOTADBPR_SIN_CONTABILIDAD(
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    ID INTEGER,
    IDI INTEGER,
    IDC INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    ESTADO VARCHAR(20),
    ERROR INTEGER)
AS
DECLARE VARIABLE VER CHAR(2);
declare variable FECICNT VARCHAR(10);
declare variable FECFCNT VARCHAR(10);
declare variable idref INTEGER;
BEGIN
EXECUTE PROCEDURE fecha_a_conta(FECINI) returning_values (FECICNT);
EXECUTE PROCEDURE fecha_a_conta(FECFIN) returning_values (FECFCNT);
FOR SELECT NDPR_ID, PREF_PRE, NDPR_NUMERO FROM NOTAS_DEBITO_PROVEEDOR WHERE NDPR_ANULADO = 'N' AND
    NDPR_FECHA >= :FECINI AND NDPR_FECHA <= :FECFIN
    ORDER BY NDPR_ID INTO :ID, :PREF, :NUMERO
DO
  BEGIN
  idref = null;
  SELECT ENCO_IDREF FROM COMPROBANTE_ENCABEZADO WHERE ENCO_TIPOREF = 51 AND ENCO_FECHA >= :FECICNT AND ENCO_FECHA <= :FECFCNT and ENCO_IDREF = :id into :idref;
  if (idref IS NULL) then
  begin
  ESTADO = 'PROCESANDO';
  SUSPEND;
  SELECT MAX(INCA_ID) FROM INTERFAZ_CARTERA WHERE PREF_PRE = :PREF AND TIDO_COD = 51 INTO :IDI;
  if (IDI IS NOT NULL) then
    BEGIN
    EXECUTE PROCEDURE CONTABIL_NOTADBPR (:ID, :IDI) RETURNING_VALUES (:ERROR, :VER, :IDC);
    if (ERROR = 0) then
      BEGIN
      EXECUTE PROCEDURE CONTABILIZA_PENDIENTE (:IDC);
      ESTADO = 'OK';
      END
    ELSE
      ESTADO = 'ERROR';
    suspend;
    END
  end
  END
END

^

SET TERM ; ^



/* 20090318b */
/* CONTABILIZACION DE RECIBOS CON CRUCES NO TRAIA LA CUENTA X PAGAR */
SET TERM ^ ;

CREATE OR ALTER PROCEDURE CONTABIL_RECICAJA(
    IDDOC INTEGER,
    IDINTER INTEGER)
RETURNS (
    ERROR INTEGER,
    VER CHAR(1),
    IDC INTEGER)
AS
declare variable PREF VARCHAR(4);
declare variable NUM VARCHAR(6);
declare variable FECAUX DATE;
declare variable FECHA CHAR(8);
declare variable CONC CHAR(120);
declare variable VRDTO NUMERIC(18, 2);
declare variable VRRTFTE NUMERIC(18, 2);
declare variable VRRTIVA NUMERIC(18, 2);
declare variable VRRTICA NUMERIC(18, 2);
declare variable VRTOTAL NUMERIC(18, 2);
declare variable TIPOCOMP VARCHAR(3);
declare variable PREFCONT VARCHAR(4);
declare variable BASE CHAR(1);
declare variable CTABASE VARCHAR(20);
declare variable CAJA CHAR(1);
declare variable CTACAJA VARCHAR(20);
declare variable RTFTE CHAR(1);
declare variable CTARTFTE VARCHAR(20);
declare variable RTIVA CHAR(1);
declare variable CTARTIVA VARCHAR(20);
declare variable RTICA CHAR(1);
declare variable CTARTICA VARCHAR(20);
declare variable DTO CHAR(1);
declare variable CTADTO VARCHAR(20);
declare variable EXISTE CHAR(1);
declare variable CUENTA VARCHAR(20);
declare variable MONTO NUMERIC(18,2);
declare variable ES_RETENCION CHAR(1);
declare variable TIPOCUEN CHAR(1);
declare variable NIT VARCHAR(20);
declare variable PROY VARCHAR(4);
declare variable CENTRO VARCHAR(4);
declare variable DEBITO NUMERIC(18,2);
declare variable CREDITO NUMERIC(18,2);
declare variable NROI INTEGER;
declare variable SUMA NUMERIC(18,2);
declare variable TCTACLIEN VARCHAR(20);
declare variable TCTARTFTE VARCHAR(20);
declare variable TCTARTIVA VARCHAR(20);
declare variable TCTARTICA VARCHAR(20);
declare variable TIPOIT INTEGER;
declare variable PREFIT VARCHAR(4);
declare variable NUMIT VARCHAR(6);
declare variable NUMEROIT VARCHAR(10);
declare variable ABONOIT NUMERIC(18,2);
declare variable CTADIC VARCHAR(20);
declare variable BASEADIC VARCHAR(20);
declare variable PORCADIC NUMERIC(5,2);
declare variable VALORADIC NUMERIC(18,2);
declare variable DBADIC CHAR(1);
declare variable ANULADO CHAR(1);
declare variable VRBASE NUMERIC(18,2);
declare variable PORC numeric(9,2);
declare variable OK INTEGER;
declare variable CRUCES NUMERIC(18,2);
declare variable VRCAJA NUMERIC(18,2);
declare variable DIFCAMBIO NUMERIC(18,2);
declare variable CTADIF VARCHAR(20);
declare variable PROVID INTEGER;
BEGIN
ERROR = 0;
/* BUSQUE LA INTERFACE */
EXISTE = 'N';
SELECT 'S', TICO_COD, PRCO_PRE, INCJ_BASE, INCJ_DTOPP, INCJ_RTFTE, INCJ_RTIVA, INCJ_RTICA, INCJ_CAJA, INCJ_CTABASE, INCJ_CTADTO, INCJ_CTARTFTE, INCJ_CTARTIVA, INCJ_CTARTICA, INCJ_CTACAJA, INCJ_CONFIRMAR
    FROM INTERFAZ_CAJA
    WHERE INCJ_ID = :IDINTER
    INTO :EXISTE, :TIPOCOMP, :PREFCONT, :BASE, :DTO, :RTFTE, :RTIVA, :RTICA, :CAJA, :CTABASE, :CTADTO, :CTARTFTE, :CTARTIVA, :CTARTICA, :CTACAJA, :VER;
if (EXISTE = 'S') then
  BEGIN
  /* BORRE LA CONTABILIZACION ANTERIOR */
  OK = 0;
  FOR SELECT CNTB_ID FROM CONTABILIZACION WHERE CNTB_TIPOREF = 61 AND CNTB_IDREF = :IDDOC INTO :OK DO
    BEGIN
    DELETE FROM CONTABILIZACION_DET WHERE CNTB_ID = :OK;
    DELETE FROM CONTABILIZACION WHERE CNTB_ID = :OK;
    END
  /* TRAIGA EL ENCABEZADO DEL RECIBO */
  SELECT PREF_PRE, RECA_NUMERO, RECA_FECHA, R.TERC_NIT, RECA_CONC, RECA_DTOF, RECA_MONTO, RECA_RTFTEMONTO, RECA_RTIVAMONTO, RECA_RTICAMONTO, TERC_CTARTFTE, TERC_CTARTIVA, TERC_CTARTICA, TERC_CTACLIENTE, RECA_ANULADO, RECA_PROVID
    FROM RECIBOS_CAJA R, TERCEROS T
    WHERE RECA_ID = :IDDOC AND R.TERC_NIT = T.TERC_NIT
    INTO :PREF, :NUM, :FECAUX, :NIT, :CONC, :VRDTO, :VRTOTAL, :VRRTFTE, :VRRTIVA, :VRRTICA, :TCTARTFTE, TCTARTIVA, TCTARTICA, TCTACLIEN, :ANULADO, :PROVID;
  if (ANULADO = 'N') then
    BEGIN
    SELECT PREF_CENTRO, PREF_PROY FROM PREFIJOS
        WHERE PREF_PRE = :PREF AND TIDO_COD = 61 INTO :CENTRO, :PROY;
    EXECUTE PROCEDURE FECHA_A_CONTA(:FECAUX) returning_values (:FECHA);
    /* REGISTRE EL ENCABEZADO CONTABLE */
    IDC = GEN_ID(ID_CONTABILIZA, 1);
    INSERT INTO CONTABILIZACION (CNTB_ID, CNTB_TIPOCOMP, CNTB_PREFCNT, CNTB_NUMERO, CNTB_FECHA, CNTB_CONCEPTO, CNTB_REF, CNTB_TIPOREF, CNTB_IDREF, CNTB_PREFREF, CNTB_NUMREF, CNTB_PROCESADO)
        VALUES (:IDC, :TIPOCOMP, :PREFCONT, :NUM, :FECHA, :CONC, '', 61, :IDDOC, :PREF, :NUM, 'N');
    NROI = 0;
    SUMA = 0;
    /* SUME LOS CRUCES PARA LLEVARLOS A LA CUENTA X PAGAR Y RESTAR DE LA CAJA */
    SELECT SUM(RCCR_ABONO) FROM RECIBOS_CAJA_CRUCEC WHERE RECA_ID = :iddoc INTO :CRUCES;
    if (CRUCES IS NULL) then
        CRUCES = 0;
    VRCAJA = VRTOTAL - CRUCES;
    IF ((CAJA = 'K')) THEN
        BEGIN
        if (VRCAJA <> 0) then
            BEGIN
            CUENTA = NULL;
            EXECUTE PROCEDURE VALIDE_CUENTA_C (CTACAJA) RETURNING_VALUES (:OK);
            IF (OK = 0) THEN
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :CTACAJA INTO :CUENTA, :TIPOCUEN;
            ELSE
                begin
                EXECUTE PROCEDURE ERROR (61, :IDDOC, :CTACAJA, 2);
                CUENTA = CTACAJA;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERROR (61, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                EXECUTE PROCEDURE ERROR (61, :IDDOC, :CUENTA, 4);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                IF (VRCAJA > 0) THEN
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRCAJA, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    SUMA = SUMA + VRCAJA;
                    END
                ELSE   
                    BEGIN                     
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                       VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, ABS(:VRCAJA), 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    SUMA = SUMA + VRCAJA;
                    END
                NROI = NROI + 1;
                END
            END /* VRCAJA <> 0 */
        END /* CAJA CONSTANTE */
    IF ((CAJA = 'F')) THEN
        BEGIN
        /* AGRUPE LAS CUENTAS DE LAS FORMAS DE PAGO */
        FOR SELECT MAX(FOPA_CTACONTA), SUM(RCPA_MONTO)
            FROM formas_pago F, recibos_caja_pago R
            WHERE R.RECA_ID = :IDDOC AND R.FOPA_ID = F.FOPA_ID
            GROUP BY FOPA_CTACONTA
            INTO :CTACAJA, :MONTO
        DO
            BEGIN
            if (MONTO <> 0) then
                BEGIN
                CUENTA = NULL;
                EXECUTE PROCEDURE VALIDE_CUENTA_C (CTACAJA) RETURNING_VALUES (:OK);
                IF (OK = 0) THEN
                    SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                        WHERE CUEN_COD = :CTACAJA INTO :CUENTA, :TIPOCUEN;
                ELSE
                    begin
                    EXECUTE PROCEDURE ERROR (61, :IDDOC, :CTACAJA, 2);
                    CUENTA = CTACAJA;
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (61, :IDDOC, :CUENTA, 3);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (61, :IDDOC, :CUENTA, 4);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    IF (MONTO > 0) THEN
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        SUMA = SUMA + MONTO;
                        END
                    ELSE
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, abs(:MONTO), 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        SUMA = SUMA + MONTO;
                        END
                    NROI = NROI + 1;
                    END
                END /* MONTO <> 0 */
            END /* DO FORMA_PAGO */
        END /* CAJA = F */
    if (DTO = 'K') then /* DTO EN CTA CONSTANTE */
        BEGIN
        if (VRDTO <> 0) then
            BEGIN
            CUENTA = NULL;
            EXECUTE PROCEDURE VALIDE_CUENTA_C (CTADTO) RETURNING_VALUES (:OK);
            IF (OK = 0) THEN
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :CTADTO INTO :CUENTA, :TIPOCUEN;
            ELSE
                begin
                EXECUTE PROCEDURE ERROR (61, :IDDOC, :CTADTO, 2);
                CUENTA = CTADTO;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERROR (61, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                EXECUTE PROCEDURE ERROR (61, :IDDOC, :CUENTA, 4);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRDTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA + VRDTO;
                END
            END /* VRDTO <> 0 */
        END /* DTO EN CTA CONSTANTE */

    /* LA DIFERENCIA EN CAMBIO */
    SELECT SUM(RCDE_DIFCAMBIO) FROM recibos_caja_detalle WHERE RECA_ID = :iddoc INTO :DIFCAMBIO;
    IF ((DIFCAMBIO IS NOT NULL) AND (DIFCAMBIO <> 0)) THEN
        BEGIN
        if (DIFCAMBIO > 0) then
            execute procedure lee_configuracion('GENERAL','GENERAL','CUENTA DE INGRESO POR DIFERENCIA EN CAMBIO PARA OPERACIONES EN OTRA MONEDA') returning_values (:ctadif);
        else
            execute procedure lee_configuracion('GENERAL','GENERAL','CUENTA DE GASTO POR DIFERENCIA EN CAMBIO PARA OPERACIONES EN OTRA MONEDA') returning_values (:ctadif);
        CUENTA = NULL;
        EXECUTE PROCEDURE VALIDE_CUENTA_C (ctadif) RETURNING_VALUES (:OK);
        IF (OK = 0) THEN
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :ctadif INTO :CUENTA, :TIPOCUEN;
        ELSE
            begin
            EXECUTE PROCEDURE ERROR (61, :IDDOC, :ctadif, 2);
            CUENTA = ctadif;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERROR (61, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERROR (61, :IDDOC, :CUENTA, 4);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            if (DIFCAMBIO > 0) then
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :difcambio, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            else
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', ABS(:difcambio), 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA - difcambio;
            END
        END
    /* RETENCION FUENTE */
    if ((RTFTE = 'T') or (RTFTE = 'K')) then
      if (VRRTFTE <> 0) then
        BEGIN
        if (RTFTE = 'T') then
            CTARTFTE = TCTARTFTE;
        CUENTA = NULL;
        EXECUTE PROCEDURE VALIDE_CUENTA_C (CTARTFTE) RETURNING_VALUES (:OK);
        IF (OK = 0) THEN
            SELECT CUEN_COD, CUEN_RETENCION, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTARTFTE INTO :CUENTA, :ES_RETENCION, :TIPOCUEN;
        ELSE
            begin
            EXECUTE PROCEDURE ERROR (61, :IDDOC, :CTARTFTE, 2);
            CUENTA = CTARTFTE;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERROR (61, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERROR (61, :IDDOC, :CUENTA, 4);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            if (ES_RETENCION = 'S') then
                BEGIN
                VRBASE = VRTOTAL + VRDTO + vrrtfte + vrrtiva + vrrtica;
                SELECT CLIE_rtefte from clientes where terc_nit = :NIT INTO :PORC;
                END
            ELSE
                BEGIN
                VRBASE = 0;
                PORC = 0;
                END
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :VRBASE, :PORC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTFTE;
            END
        END /* RTFTE */
    /* RETENCION IVA */
    if ((RTIVA = 'T') or (RTIVA = 'K')) then
      if (VRRTIVA <> 0) then
        BEGIN
        if (RTIVA = 'T') then
            CTARTIVA = TCTARTIVA;
        CUENTA = NULL;
        EXECUTE PROCEDURE VALIDE_CUENTA_C (CTARTIVA) RETURNING_VALUES (:OK);
        IF (OK = 0) THEN
            SELECT CUEN_COD, CUEN_RETENCION, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTARTIVA INTO :CUENTA, :ES_RETENCION, :TIPOCUEN;
        ELSE
            begin
            EXECUTE PROCEDURE ERROR (61, :IDDOC, :CTARTIVA, 2);
            CUENTA = CTARTIVA;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERROR (61, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERROR (61, :IDDOC, :CUENTA, 4);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            if (ES_RETENCION = 'S') then
                BEGIN
                VRBASE = VRTOTAL + VRDTO + vrrtfte + vrrtiva + vrrtica;
                SELECT CLIE_RTEIVA from clientes where terc_nit = :NIT INTO :PORC;
                END
            ELSE
                BEGIN
                VRBASE = 0;
                PORC = 0;
                END
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTIVA, 0, :VRBASE, :PORC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTIVA;
            END
        END /* RTIVA */
    /* RETENCION DE ICA */
    if ((RTICA = 'T') or (RTICA = 'K')) then
      if (VRRTICA <> 0) then
        BEGIN
        if (RTICA = 'T') then
            CTARTICA = TCTARTICA;
        CUENTA = NULL;
        EXECUTE PROCEDURE VALIDE_CUENTA_C (CTARTICA) RETURNING_VALUES (:OK);
        IF (OK = 0) THEN
            SELECT CUEN_COD, CUEN_RETENCION, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTARTICA INTO :CUENTA, :ES_RETENCION, :TIPOCUEN;
        ELSE
            begin
            EXECUTE PROCEDURE ERROR (61, :IDDOC, :CTARTICA, 2);
            CUENTA = CTARTICA;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERROR (61, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERROR (61, :IDDOC, :CUENTA, 4);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            if (ES_RETENCION = 'S') then
                BEGIN
                VRBASE = VRTOTAL + VRDTO + vrrtfte + vrrtiva + vrrtica;
                SELECT CLIE_RTEICA from clientes where terc_nit = :NIT INTO :PORC;
                END
            ELSE
                BEGIN
                VRBASE = 0;
                PORC = 0;
                END
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTICA, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTICA;
            END
        END /* RTICA */
    /* CRUCES CON CXP */
    if (CRUCES <> 0) then
        BEGIN
        SELECT PROV_CTAPAGAR FROM PROVEEDORES WHERE TERC_NIT = :nit INTO :ctabase;
        if (CTABASE IS NULL) then
            ctabase = tctaclien;
        CUENTA = NULL;
        EXECUTE PROCEDURE VALIDE_CUENTA_C (CTABASE) RETURNING_VALUES (:OK);
        IF (OK = 0) THEN
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTABASE INTO :CUENTA, :TIPOCUEN;
        ELSE
            begin
            EXECUTE PROCEDURE ERROR (61, :IDDOC, :CTABASE, 2);
            CUENTA = CTABASE;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERROR (61, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            /* DEBERIA RECORRER DOCUMENTO POR DOCUMENTO */
            FOR SELECT RCCR_TIPODOC, RCCR_PREFIJO, RCCR_NUMERO, RCCR_ABONO+RCCR_RTFTE+RCCR_RTIVA+RCCR_RTICA+RCCR_DTOF
                FROM recibos_caja_crucec WHERE RECA_ID = :IDDOC
                INTO :TIPOIT, PREFIT, NUMIT, ABONOIT
                DO
                BEGIN
                NUMEROIT = PREFIT || NUMIT;
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :ABONOIT, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, :NUMEROIT, NULL, NULL, :TIPOIT, 0);
                SUMA = SUMA + ABONOIT;
                NROI = NROI + 1;
                END
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :CRUCES, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            SUMA = SUMA + CRUCES;
            NROI = NROI + 1;
            END

        /* LA DIFERENCIA EN CAMBIO */
        SELECT SUM(RCCR_DIFCAMBIO) FROM recibos_caja_crucec WHERE RECA_ID = :iddoc INTO :DIFCAMBIO;
        IF ((DIFCAMBIO IS NOT NULL) AND (DIFCAMBIO <> 0)) THEN
            BEGIN
            if (DIFCAMBIO > 0) then
                execute procedure lee_configuracion('GENERAL','GENERAL','CUENTA DE GASTO POR DIFERENCIA EN CAMBIO PARA OPERACIONES EN OTRA MONEDA') returning_values (:ctadif);
            else
                execute procedure lee_configuracion('GENERAL','GENERAL','CUENTA DE INGRESO POR DIFERENCIA EN CAMBIO PARA OPERACIONES EN OTRA MONEDA') returning_values (:ctadif);
            CUENTA = NULL;
            EXECUTE PROCEDURE VALIDE_CUENTA_C (ctadif) RETURNING_VALUES (:OK);
            IF (OK = 0) THEN
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :ctadif INTO :CUENTA, :TIPOCUEN;
            ELSE
                begin
                EXECUTE PROCEDURE ERROR (61, :IDDOC, :ctadif, 2);
                CUENTA = ctadif;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERROR (61, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                EXECUTE PROCEDURE ERROR (61, :IDDOC, :CUENTA, 4);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                if (DIFCAMBIO > 0) then
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :difcambio, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                else
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, ABS(:difcambio), 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA + difcambio;
                END
            END
        END /* cruces */
    /* CIERRE EL COMPROBANTE CONTRA LA CUENTA DEL TERCERO O LA BASE CONSTANTE */
    if ((SUMA <> 0) and ((BASE = 'T') or (BASE = 'K'))) then
        BEGIN
        if (SUMA < 0) then
            BEGIN
            DEBITO = SUMA * -1;
            CREDITO = 0;
            END
        ELSE
            BEGIN
            DEBITO = 0;
            CREDITO = SUMA;
            END
        if (BASE = 'T') then
            CTABASE = TCTACLIEN;
        CUENTA = NULL;
        EXECUTE PROCEDURE VALIDE_CUENTA_C (CTABASE) RETURNING_VALUES (:OK);
        IF (OK = 0) THEN
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTABASE INTO :CUENTA, :TIPOCUEN;
        ELSE
            begin
            EXECUTE PROCEDURE ERROR (61, :IDDOC, :CTABASE, 2);
            CUENTA = CTABASE;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERROR (61, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            /* DEBERIA RECORRER DOCUMENTO POR DOCUMENTO */
            FOR SELECT RCDE_TIPODOC, RCDE_PREFIJO, RCDE_NUMERO, RCDE_ABONO+RCDE_RTFTE+RCDE_RTIVA+RCDE_RTICA+RCDE_DTOF
                FROM RECIBOS_CAJA_DETALLE WHERE RECA_ID = :IDDOC
                INTO :TIPOIT, PREFIT, NUMIT, ABONOIT
                DO
                BEGIN
                NUMEROIT = PREFIT || NUMIT;
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :ABONOIT, 0, 0, :NIT, :PROY, :CENTRO, NULL, :NUMEROIT, NULL, NULL, :TIPOIT, 0);
                NROI = NROI + 1;
                END
            END
        if (TIPOCUEN = 'N') then
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :DEBITO, :CREDITO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
        NROI = NROI + 1;
        END /* SUMA EN CARTERA */
    /* recorra las cuentas adicionales */
    FOR SELECT INJC_CUENTA, INJC_BASE, INJC_PORC, INJC_VALOR, INJC_DB
        FROM INTERFAZ_CAJA_CTAS
        WHERE INCJ_ID = :IDINTER
        INTO :CTADIC, :BASEADIC, :PORCADIC, :VALORADIC, :DBADIC
        DO
        BEGIN
        if (:BASEADIC = 'TOTAL') then
            VALORADIC = VRTOTAL;
        if (:BASEADIC = 'DESCUENTO') then
            VALORADIC = VRDTO;
        if (:BASEADIC = 'RTFTE') then
            VALORADIC = VRRTFTE;
        if (:BASEADIC = 'RTIVA') then
            VALORADIC = VRRTIVA;
        if (:BASEADIC = 'RTICA') then
            VALORADIC = VRRTICA;
        MONTO = VALORADIC * PORCADIC;
        CUENTA = NULL;
        EXECUTE PROCEDURE VALIDE_CUENTA_C (CTADIC) RETURNING_VALUES (:OK);
        IF (OK = 0) THEN
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTADIC INTO :CUENTA, :TIPOCUEN;
        ELSE
            begin
            EXECUTE PROCEDURE ERROR (61, :IDDOC, :CTADIC, 2);
            CUENTA = CTADIC;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERROR (61, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERROR (61, :IDDOC, :CUENTA, 4);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            if (DBADIC = 'S') then
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTADIC, :CONC, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            ELSE
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTADIC, :CONC, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            END
        NROI = NROI + 1;
        END
    /* REVERSE EL PROVISIONAL SI EXISTE */
    if ((PROVID IS NOT NULL) AND (PROVID <> 0))  then
        BEGIN
        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
            SELECT :IDC, CODE_ITEM+:NROI, CUEN_COD, :CONC, '', CODE_CREDITO, CODE_DEBITO, CODE_BASE*-1, CODE_PORC, D.TERC_NIT, PROY_COD, CENT_COD, NULL, NULL, NULL, NULL, 0, 0
                FROM COMPROBANTE_DETALLE D, COMPROBANTE_ENCABEZADO E WHERE E.enco_consec = D.enco_consec AND E.enco_tiporef = 65 AND E.enco_idref = :provid ORDER BY CODE_ITEM;
        END
    if (ERROR > 0) then
        VER = 'S';
    SUSPEND;
    END /* NO ANULADO */
  END /* EXISTE LA INTERFAZ */
ELSE
    BEGIN
    EXECUTE PROCEDURE ERROR (61, :IDDOC, :PREF, 1);
    ERROR = ERROR + 1;
    VER = 'S';
    SUSPEND;
    END
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE RECIBOS_SIN_CONTABILIDAD(
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    ID INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    ESTADO VARCHAR(20),
    IDI INTEGER,
    IDC INTEGER,
    ERROR INTEGER)
AS
DECLARE VARIABLE VER CHAR(2);
declare variable FECICNT VARCHAR(10);
declare variable FECFCNT VARCHAR(10);
declare variable idref INTEGER;
BEGIN /*$$IBE$$ 
EXECUTE PROCEDURE fecha_a_conta(FECINI) returning_values (FECICNT);
EXECUTE PROCEDURE fecha_a_conta(FECFIN) returning_values (FECFCNT);
FOR SELECT RECA_ID, PREF_PRE, RECA_NUMERO FROM RECIBOS_CAJA WHERE RECA_ANULADO = 'N' AND
    RECA_FECHA >= :FECINI AND RECA_FECHA <= :FECFIN and PREF_PRE NOT IN (SELECT AUTO_PREFRDC FROM AUTORIZACIONES) ORDER BY RECA_ID
    INTO :ID, :PREF, :NUMERO
DO
  BEGIN
  idref = null;
  SELECT ENCO_IDREF FROM COMPROBANTE_ENCABEZADO WHERE ENCO_TIPOREF = 61 AND ENCO_FECHA >= :FECICNT AND ENCO_FECHA <= :FECFCNT and ENCO_IDREF = :id into :idref;
  if (idref IS NULL) then
  begin
   ESTADO = 'PROCESANDO';
   SUSPEND;
   SELECT MAX(INCJ_ID) FROM INTERFAZ_CAJA WHERE PREF_PRE = :PREF AND TIDO_COD = 61 INTO :IDI;
   EXECUTE PROCEDURE CONTABIL_RECICAJA (:ID, :IDI) RETURNING_VALUES (:ERROR, :VER, :IDC);
   if (ERROR = 0) then
    BEGIN
    EXECUTE PROCEDURE CONTABILIZA_PENDIENTE (:IDC);
    ESTADO = 'OK';
    END
   ELSE
    ESTADO = 'ERROR';
   suspend;
  end
  END
 $$IBE$$*/ SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE RECIBOS_SIN_CONTABILIDAD(
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    ID INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    ESTADO VARCHAR(20),
    IDI INTEGER,
    IDC INTEGER,
    ERROR INTEGER)
AS
DECLARE VARIABLE VER CHAR(2);
declare variable FECICNT VARCHAR(10);
declare variable FECFCNT VARCHAR(10);
declare variable idref INTEGER;
BEGIN
EXECUTE PROCEDURE fecha_a_conta(FECINI) returning_values (FECICNT);
EXECUTE PROCEDURE fecha_a_conta(FECFIN) returning_values (FECFCNT);
FOR SELECT RECA_ID, PREF_PRE, RECA_NUMERO FROM RECIBOS_CAJA WHERE RECA_ANULADO = 'N' AND
    RECA_FECHA >= :FECINI AND RECA_FECHA <= :FECFIN and PREF_PRE NOT IN (SELECT AUTO_PREFRDC FROM AUTORIZACIONES) ORDER BY RECA_ID
    INTO :ID, :PREF, :NUMERO
DO
  BEGIN
  idref = null;
  SELECT ENCO_IDREF FROM COMPROBANTE_ENCABEZADO WHERE ENCO_TIPOREF = 61 AND ENCO_FECHA >= :FECICNT AND ENCO_FECHA <= :FECFCNT and ENCO_IDREF = :id into :idref;
  if (idref IS NULL) then
  begin
   ESTADO = 'PROCESANDO';
   SUSPEND;
   SELECT MAX(INCJ_ID) FROM INTERFAZ_CAJA WHERE PREF_PRE = :PREF AND TIDO_COD = 61 INTO :IDI;
   EXECUTE PROCEDURE CONTABIL_RECICAJA (:ID, :IDI) RETURNING_VALUES (:ERROR, :VER, :IDC);
   if (ERROR = 0) then
    BEGIN
    EXECUTE PROCEDURE CONTABILIZA_PENDIENTE (:IDC);
    ESTADO = 'OK';
    END
   ELSE
    ESTADO = 'ERROR';
   suspend;
  end
  END
END

^

SET TERM ; ^



/* 20090319 */
/* configurar si se pueden modificar o no las cotizaciones */
INSERT INTO CONFIGURACION (CONF_MODULO, CONF_CATEGORIA, CONF_PROPIEDAD, CONF_VALOR, CONF_POSIBLES, CONF_AYUDA) VALUES ('COMPRAS', 'COTIZACIONES', 'PERMITIR MODIFICAR COTIZACIONES PREVIAMENTE REGISTRADAS', 'SI', 'SI,NO', 'SI: Permite hacer cambios en las cotizaciones de proveedores desde la opción de consultar');

INSERT INTO CONFIGURACION (CONF_MODULO, CONF_CATEGORIA, CONF_PROPIEDAD, CONF_VALOR, CONF_POSIBLES, CONF_AYUDA) VALUES ('FACTURACION', 'COTIZACIONES', 'PERMITIR MODIFICAR COTIZACIONES PREVIAMENTE REGISTRADAS', 'SI', 'SI,NO', 'SI: Permite desde la consulta hacer cambios a una cotización previamente registrada.');
commit work;

/* 20090320 */
/* NO INCLUIA LA LISTA BASE PARA CAMBIO DE PRECIOS */
SET TERM ^ ;

CREATE OR ALTER PROCEDURE REVISA_PRECIOS(
    LISTA INTEGER,
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    ARTICULO VARCHAR(20),
    DESCR VARCHAR(60),
    GRUPO VARCHAR(2),
    SUBGRUPO VARCHAR(3),
    MARCA VARCHAR(3),
    COSTO NUMERIC(18,2),
    FIJO NUMERIC(18,2),
    UNIDAD VARCHAR(8),
    PORC NUMERIC(9,4),
    SUGERIDO NUMERIC(18,2),
    DIFER NUMERIC(18,2),
    NUEVO NUMERIC(18,2),
    OK CHAR(1))
AS
declare variable marg numeric(9,4);
declare variable UOM VARCHAR(10);
declare variable BASE VARCHAR(10);
declare variable CAMBIO VARCHAR(10);
declare variable COSTOP numeric(18,2);
declare variable COSTOU numeric(18,2);
declare variable DIFMAX numeric(18,2);
declare variable DIG INTEGER;
declare variable TARIVA NUMERIC(9,4);
declare variable IVAINC CHAR(1);
declare variable LISTAREF INTEGER;
begin
execute procedure lee_configuracion ('FACTURACION', 'ARTICULOS', 'SUGERIR PRECIOS CON PORCENTAJE DE MARGEN O UTILIDAD') returning_values (:UOM);
EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION', 'ARTICULOS', 'REDONDEO AL MULTIPLO DE DIEZ EN PRECIOS') RETURNING_VALUES (:DIG);
EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION','ARTICULOS','CAMBIO DE PRECIOS AUTOMATICO AL CAMBIAR COSTO O PRECIO') returning_values (CAMBIO);
EXECUTE PROCEDURE lee_configuracion('FACTURACION','ARTICULOS','COSTO BASE PARA CALCULO DE PRECIOS DE VENTA AUTOMATICOS') returning_values (:BASE);
EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION','ARTICULOS','CODIGO DE LA LISTA DE PRECIOS BASE PARA CAMBIO DE PRECIOS AUTOMATICO') returning_values (LISTAREF);
EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION','ARTICULOS','DIFERENCIA EN PESOS MAXIMA A PERMITIR PARA CAMBIAR PRECIOS') returning_values (DIFMAX);
for select A.arti_cod, A.arti_des, A.grup_cod, A.subg_cod, A.marc_cod, A.arti_unidad, prar_fijo, prar_margen, prar_util, TAIV_PORC
    from precios_articulo p, articulo a, tarifa_iva T
    where a.arti_cod = p.arti_cod and lipr_cod = :lista and a.taiv_cod = t.taiv_cod and exists (select arti_cod from movimiento_articulo m where arti_cod = a.arti_cod and m.mvar_entrada = 'S' and m.mvar_tipodoc <> 33 and m.mvar_tipodoc <> 13 and m.mvar_fecha >= :fecini and m.mvar_fecha <= :fecfin)
    order by A.arti_cod
    into :articulo, descr, :grupo, :subgrupo, :marca, :unidad, :fijo, :marg, :porc, :tariva
    do
    begin
    if (UOM <> 'UTILIDAD') then
        PORC = MARG;
    EXECUTE PROCEDURE COSTO_PROMEDIO (:ARTICULO, :FECFIN) RETURNING_VALUES(:COSTOP);
    EXECUTE PROCEDURE ULTIMO_COSTO (:ARTICULO, :FECFIN, :UNIDAD) RETURNING_VALUES(:COSTOU);
    if (base = 'ULTIMO') then
        COSTO = COSTOU;
    ELSE
        BEGIN
        COSTO = COSTOP;
        if (base = 'MAYOR') then
            if (COSTOP < COSTOU) then
                COSTO = COSTOU;
        END
    SELECT LIPR_MODIF FROM LISTA_PRECIOS WHERE LIPR_COD = :lista INTO :IVAINC;
    if (IVAINC = 'S') then
        COSTO = COSTO * (1 + TARIVA/100);
    if (CAMBIO = 'COSTO') then
        BEGIN
        if (UOM = 'UTILIDAD') then
            SUGERIDO = COSTO * (1 + :PORC/100);
        ELSE
            SUGERIDO = COSTO / (1 - :PORC/100);
        END
    ELSE
        begin
        SELECT PRAR_FIJO FROM PRECIOS_ARTICULO WHERE ARTI_COD = :articulo AND LIPR_COD = :LISTAREF INTO :SUGERIDO;
        if (IVAINC = 'S') then
            SUGERIDO = SUGERIDO / (1 + TARIVA/100);
        if (UOM = 'UTILIDAD') then
            SUGERIDO = SUGERIDO * (1 + :PORC/100);
        ELSE
            SUGERIDO = SUGERIDO / (1 - :PORC/100);
        end
    EXECUTE PROCEDURE REDONDEE (SUGERIDO, DIG) returning_values (SUGERIDO);
    DIFER = SUGERIDO - FIJO;
    NUEVO = SUGERIDO;
    OK = 'S';
    if ((abs(DIFER) > DIFMAX) and (sugerido <> 0)) then
        suspend;
    end
end
^

SET TERM ; ^



/* 20090321 */
/* ESTADISTICA ANUAL */
CREATE TABLE VENTAS_MES (
    MES SMALLINT NOT NULL,
    TOTAL T_MONTO);
alter table VENTAS_MES
add constraint PK_VENTAS_MES
primary key (MES);

SET TERM ^ ;

CREATE OR ALTER PROCEDURE VENTAS_CLIENTE_ANO(
    NITDESDE VARCHAR(20),
    NITHASTA VARCHAR(20),
    FECHA DATE,
    ORDEN CHAR(1),
    MASIVA CHAR(1),
    SUBEMPRESA INTEGER)
RETURNS (
    NIT VARCHAR(20),
    MES INTEGER,
    TOTAL NUMERIC(18,2))
AS
DECLARE VARIABLE NITINI VARCHAR(15);
DECLARE VARIABLE NITFIN VARCHAR(15);
DECLARE VARIABLE NOMINI VARCHAR(15);
DECLARE VARIABLE NOMFIN VARCHAR(15);
declare variable FECINI DATE;
DECLARE VARIABLE DTO NUMERIC(18,2);
DECLARE VARIABLE ADICIONAL NUMERIC(18,2);
DECLARE VARIABLE IVA NUMERIC(18,2);
DECLARE VARIABLE EXTRA NUMERIC(18,2);
declare variable DEV NUMERIC(18, 2);
BEGIN
if (ORDEN = 'C') then
    BEGIN
    NITINI = NITDESDE;
    NITFIN = NITHASTA;
    NOMINI = '';
    NOMFIN = 'zz';
    END
ELSE
    BEGIN
    NITINI = NITDESDE;
    NITFIN = NITHASTA;
    NOMINI = '';
    NOMFIN = 'zz';
    END

FECINI = fecha - 365;
FOR SELECT MAX(T.TERC_NIT), MAX(EXTRACT(MONTH FROM FACT_FECHA)),
    SUM(FACT_IVAMONTO), SUM(FACT_TOTAL)
    FROM FACTURAS F, PREFIJOS P, terceros T, CLIENTES C
    where C.TERC_NIT = T.TERC_NIT AND T.TERC_CLIE = 'S' AND T.TERC_NIT >= :NITINI AND T.TERC_NIT <= :NITFIN AND TERC_NOM >= :NOMINI AND TERC_NOM <= :NOMFIN
    AND F.TERC_NIT = T.terc_nit AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECHA AND FACT_ANULADO = 'N'
    AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
    GROUP BY F.terc_nit, EXTRACT(MONTH FROM FACT_FECHA)
    INTO :NIT, :MES, :IVA, :TOTAL
    DO
    BEGIN
    if (TOTAL IS NULL) then
        TOTAL = 0;
    if (IVA IS NULL) then
        IVA = 0;
    if (MASIVA <> 'S') then
        TOTAL = TOTAL - IVA;
    SELECT SUM(DEVT_IVAMONTO), SUM(DEVT_TOTAL)
        FROM DEVOLUCIONES_VENTAS V, PREFIJOS P
        where V.TERC_NIT = :nit AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECHA AND DEVT_ANULADO = 'N'
        AND P.PREF_PRE = V.PREF_PRE AND P.TIDO_COD = 33 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
        AND EXTRACT(MONTH FROM DEVT_FECHA) = :MES
        INTO :IVA, :DEV;
    if (DEV IS NULL) then
        DEV = 0;
    if (IVA IS NULL) then
        IVA = 0;
    if (MASIVA <> 'S') then
        DEV = DEV - IVA;
    TOTAL = TOTAL - DEV;
    if (TOTAL <> 0) then
        SUSPEND;
    END
/* AGREGUE LOS TERCEROS SIN VENTAS */
FOR SELECT MAX(T.TERC_NIT), MAX(EXTRACT(MONTH FROM DEVT_FECHA)),
    SUM(DEVT_DTOMONTO), SUM(DEVT_ADICIONAL), SUM(DEVT_IVAMONTO), SUM(DEVT_EXTRA), SUM(DEVT_TOTAL)
    FROM terceros T, CLIENTES C, DEVOLUCIONES_VENTAS V, PREFIJOS P
    where C.TERC_NIT = T.TERC_NIT AND T.TERC_CLIE = 'S' AND T.TERC_NIT >= :NITINI AND T.TERC_NIT <= :NITFIN AND TERC_NOM >= :NOMINI AND TERC_NOM <= :NOMFIN
        AND V.TERC_NIT = T.terc_nit AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECHA AND DEVT_ANULADO = 'N'
        AND P.PREF_PRE = V.PREF_PRE AND P.TIDO_COD = 33 AND ((P.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
        AND NOT EXISTS (select FACT_ID FROM FACTURAS F, PREFIJOS PR WHERE TERC_NIT = T.terc_nit AND EXTRACT(MONTH FROM FACT_FECHA) = EXTRACT(MONTH FROM DEVT_FECHA) AND FACT_ANULADO = 'N'
        AND PR.PREF_PRE = F.PREF_PRE AND PR.TIDO_COD = 31 AND ((PR.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)))
    GROUP BY V.terc_nit, EXTRACT(MONTH FROM DEVT_FECHA)
    INTO :NIT, :MES, :DTO, :ADICIONAL, :IVA, :EXTRA, :DEV
    DO
    BEGIN
    TOTAL = 0;
    if (DTO IS NULL) then
        DTO = 0;
    if (ADICIONAL IS NULL) then
        ADICIONAL = 0;
    if (IVA IS NULL) then
        IVA = 0;
    if (EXTRA IS NULL) then
        EXTRA = 0;
    if (MASIVA <> 'S') then
        DEV = DEV - EXTRA - IVA - ADICIONAL + DTO;
    TOTAL = TOTAL - DEV;
    if (TOTAL <> 0) then
        SUSPEND;
    END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER PROCEDURE REP_VENTAS_CLIENTE_ANO(
    NITDESDE VARCHAR(20),
    NITHASTA VARCHAR(20),
    FECHA DATE,
    ORDEN CHAR(1),
    MASIVA CHAR(1),
    SUBEMPRESA INTEGER)
RETURNS (
    NIT VARCHAR(20),
    NOMBRE VARCHAR(60),
    TELEFONO VARCHAR(40),
    CIUDAD VARCHAR(40),
    CODZONA VARCHAR(2),
    NOMZONA VARCHAR(30),
    TOTAL1 NUMERIC(18,2),
    TOTAL2 NUMERIC(18,2),
    TOTAL3 NUMERIC(18,2),
    TOTAL4 NUMERIC(18,2),
    TOTAL5 NUMERIC(18,2),
    TOTAL6 NUMERIC(18,2),
    TOTAL7 NUMERIC(18,2),
    TOTAL8 NUMERIC(18,2),
    TOTAL9 NUMERIC(18,2),
    TOTAL10 NUMERIC(18,2),
    TOTAL11 NUMERIC(18,2),
    TOTAL12 NUMERIC(18,2))
AS
declare variable NITN VARCHAR(20);
declare variable TOTAL NUMERIC(18,2);
declare variable MES INTEGER;
BEGIN /*$$IBE$$ 
NIT = '';
FOR SELECT NIT, MES, TOTAL
    FROM VENTAS_CLIENTE_ANO (:nitdesde, :nithasta, :fecha, :orden, :masiva, :subempresa)
    ORDER BY NIT, MES
    INTO :NITN, :MES, :TOTAL
    DO
    BEGIN
    if (NIT = '') then
        BEGIN
        NIT = NITN;
        TOTAL1 = 0;
        TOTAL2 = 0;
        TOTAL3 = 0;
        TOTAL4 = 0;
        TOTAL5 = 0;
        TOTAL6 = 0;
        TOTAL7 = 0;
        TOTAL8 = 0;
        TOTAL9 = 0;
        TOTAL10 = 0;
        TOTAL11 = 0;
        TOTAL12 = 0;
        END
    if (NIT <> NITN) then
        BEGIN
        SELECT TERC_NOM, TERC_TEL, TERC_CIU, C.ZONA_COD FROM TERCEROS T, CLIENTES C
            WHERE T.terc_nit = C.terc_nit AND T.TERC_NIT = :nit INTO NOMBRE, :TELEFONO, :CIUDAD, :CODZONA;
        SELECT ZONA_NOM FROM ZONAS WHERE ZONA_COD = :codzona INTO :NOMZONA;
        SUSPEND;
        NIT = NITN;
        TOTAL1 = 0;
        TOTAL2 = 0;
        TOTAL3 = 0;
        TOTAL4 = 0;
        TOTAL5 = 0;
        TOTAL6 = 0;
        TOTAL7 = 0;
        TOTAL8 = 0;
        TOTAL9 = 0;
        TOTAL10 = 0;
        TOTAL11 = 0;
        TOTAL12 = 0;
        END
    IF (MES = 1) THEN TOTAL1 = TOTAL;
    IF (MES = 2) THEN TOTAL2 = TOTAL;
    IF (MES = 3) THEN TOTAL3 = TOTAL;
    IF (MES = 4) THEN TOTAL4 = TOTAL;
    IF (MES = 5) THEN TOTAL5 = TOTAL;
    IF (MES = 6) THEN TOTAL6 = TOTAL;
    IF (MES = 7) THEN TOTAL7 = TOTAL;
    IF (MES = 8) THEN TOTAL8 = TOTAL;
    IF (MES = 9) THEN TOTAL9 = TOTAL;
    IF (MES = 10) THEN TOTAL10 = TOTAL;
    IF (MES = 11) THEN TOTAL11 = TOTAL;
    IF (MES = 12) THEN TOTAL12 = TOTAL;
    END
NIT = NITN;
SELECT TERC_NOM, TERC_TEL, TERC_CIU, C.ZONA_COD FROM TERCEROS T, CLIENTES C
   WHERE T.terc_nit = C.terc_nit AND T.TERC_NIT = :nitn INTO NOMBRE, :TELEFONO, :CIUDAD, :CODZONA;
SELECT ZONA_NOM FROM ZONAS WHERE ZONA_COD = :codzona INTO :NOMZONA;
SUSPEND;
 $$IBE$$*/ SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE REP_VENTAS_CLIENTE_ANO(
    NITDESDE VARCHAR(20),
    NITHASTA VARCHAR(20),
    FECHA DATE,
    ORDEN CHAR(1),
    MASIVA CHAR(1),
    SUBEMPRESA INTEGER)
RETURNS (
    NIT VARCHAR(20),
    NOMBRE VARCHAR(60),
    TELEFONO VARCHAR(40),
    CIUDAD VARCHAR(40),
    CODZONA VARCHAR(2),
    NOMZONA VARCHAR(30),
    TOTAL1 NUMERIC(18,2),
    TOTAL2 NUMERIC(18,2),
    TOTAL3 NUMERIC(18,2),
    TOTAL4 NUMERIC(18,2),
    TOTAL5 NUMERIC(18,2),
    TOTAL6 NUMERIC(18,2),
    TOTAL7 NUMERIC(18,2),
    TOTAL8 NUMERIC(18,2),
    TOTAL9 NUMERIC(18,2),
    TOTAL10 NUMERIC(18,2),
    TOTAL11 NUMERIC(18,2),
    TOTAL12 NUMERIC(18,2))
AS
declare variable NITN VARCHAR(20);
declare variable TOTAL NUMERIC(18,2);
declare variable MES INTEGER;
BEGIN
NIT = '';
FOR SELECT NIT, MES, TOTAL
    FROM VENTAS_CLIENTE_ANO (:nitdesde, :nithasta, :fecha, :orden, :masiva, :subempresa)
    ORDER BY NIT, MES
    INTO :NITN, :MES, :TOTAL
    DO
    BEGIN
    if (NIT = '') then
        BEGIN
        NIT = NITN;
        TOTAL1 = 0;
        TOTAL2 = 0;
        TOTAL3 = 0;
        TOTAL4 = 0;
        TOTAL5 = 0;
        TOTAL6 = 0;
        TOTAL7 = 0;
        TOTAL8 = 0;
        TOTAL9 = 0;
        TOTAL10 = 0;
        TOTAL11 = 0;
        TOTAL12 = 0;
        END
    if (NIT <> NITN) then
        BEGIN
        SELECT TERC_NOM, TERC_TEL, TERC_CIU, C.ZONA_COD FROM TERCEROS T, CLIENTES C
            WHERE T.terc_nit = C.terc_nit AND T.TERC_NIT = :nit INTO NOMBRE, :TELEFONO, :CIUDAD, :CODZONA;
        SELECT ZONA_NOM FROM ZONAS WHERE ZONA_COD = :codzona INTO :NOMZONA;
        SUSPEND;
        NIT = NITN;
        TOTAL1 = 0;
        TOTAL2 = 0;
        TOTAL3 = 0;
        TOTAL4 = 0;
        TOTAL5 = 0;
        TOTAL6 = 0;
        TOTAL7 = 0;
        TOTAL8 = 0;
        TOTAL9 = 0;
        TOTAL10 = 0;
        TOTAL11 = 0;
        TOTAL12 = 0;
        END
    IF (MES = 1) THEN TOTAL1 = TOTAL;
    IF (MES = 2) THEN TOTAL2 = TOTAL;
    IF (MES = 3) THEN TOTAL3 = TOTAL;
    IF (MES = 4) THEN TOTAL4 = TOTAL;
    IF (MES = 5) THEN TOTAL5 = TOTAL;
    IF (MES = 6) THEN TOTAL6 = TOTAL;
    IF (MES = 7) THEN TOTAL7 = TOTAL;
    IF (MES = 8) THEN TOTAL8 = TOTAL;
    IF (MES = 9) THEN TOTAL9 = TOTAL;
    IF (MES = 10) THEN TOTAL10 = TOTAL;
    IF (MES = 11) THEN TOTAL11 = TOTAL;
    IF (MES = 12) THEN TOTAL12 = TOTAL;
    END
NIT = NITN;
SELECT TERC_NOM, TERC_TEL, TERC_CIU, C.ZONA_COD FROM TERCEROS T, CLIENTES C
   WHERE T.terc_nit = C.terc_nit AND T.TERC_NIT = :nitn INTO NOMBRE, :TELEFONO, :CIUDAD, :CODZONA;
SELECT ZONA_NOM FROM ZONAS WHERE ZONA_COD = :codzona INTO :NOMZONA;
SUSPEND;
END

^

SET TERM ; ^

SET TERM ^ ;

CREATE or ALTER PROCEDURE VENTAS_ANUALES_CLIENTE(
    NIT VARCHAR(20),
    FECHA DATE)
RETURNS (
    PERIODO VARCHAR(8),
    TOTAL NUMERIC(18,2))
AS
declare variable EXISTE INTEGER;
declare variable ANO INTEGER;
declare variable MES INTEGER;
declare variable MESI INTEGER;
begin
DELETE FROM VENTAS_MES;
INSERT INTO VENTAS_MES (MES, TOTAL) SELECT MES, TOTAL
    FROM VENTAS_CLIENTE_ANO (:nit, :nit, :fecha, 'C', 'N', 0);
MES = 0;
ANO = EXTRACT(YEAR FROM (:FECHA));
MESI = EXTRACT(MONTH FROM (:FECHA));
WHILE (MES < 12) DO
    BEGIN
    MES = MES + 1;
    SELECT COUNT(*), MAX(TOTAL) FROM VENTAS_MES WHERE MES = :mes INTO :EXISTE, :TOTAL;
    if (EXISTE = 0) then
        TOTAL = 0;
    if (MES = MESI) then
        ANO = ANO -1;
    if (MES < 10) then
        PERIODO = ANO || '-0' || MES;
    ELSE
        PERIODO = ANO || '-' || MES;
    SUSPEND;
    END
end

^

SET TERM ; ^

grant all on VENTAS_MES to public;
grant execute on procedure VENTAS_CLIENTE_ANO to public;
grant execute on procedure REP_VENTAS_CLIENTE_ANO to public;
grant execute on procedure VENTAS_ANUALES_CLIENTE to public;

/* 20090322 */
SET TERM ^ ;

CREATE OR ALTER PROCEDURE VENTAS_VENDEDOR_ANO(
    VENDINI INTEGER,
    VENDFIN INTEGER,
    FECHA DATE,
    MASIVA CHAR(1),
    SUBEMPRESA INTEGER)
RETURNS (
    VEND INTEGER,
    MES INTEGER,
    TOTAL NUMERIC(18,2))
AS
declare variable FECINI DATE;
DECLARE VARIABLE DTO NUMERIC(18,2);
DECLARE VARIABLE ADICIONAL NUMERIC(18,2);
DECLARE VARIABLE IVA NUMERIC(18,2);
DECLARE VARIABLE EXTRA NUMERIC(18,2);
declare variable DEV NUMERIC(18, 2);
BEGIN
FECINI = fecha - 365;
FOR SELECT MAX(F.vend_cod), MAX(EXTRACT(MONTH FROM FACT_FECHA)),
    SUM(FACT_IVAMONTO), SUM(FACT_TOTAL)
    FROM FACTURAS F, PREFIJOS P
    where F.vend_cod >= :vendini AND F.vend_cod <= :vendfin AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECHA AND FACT_ANULADO = 'N'
    AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
    GROUP BY F.vend_cod, EXTRACT(MONTH FROM FACT_FECHA)
    INTO :vend, :MES, :IVA, :TOTAL
    DO
    BEGIN
    if (TOTAL IS NULL) then
        TOTAL = 0;
    if (IVA IS NULL) then
        IVA = 0;
    if (MASIVA <> 'S') then
        TOTAL = TOTAL - IVA;
    SELECT SUM(DEVT_IVAMONTO), SUM(DEVT_TOTAL)
        FROM DEVOLUCIONES_VENTAS V, PREFIJOS P
        where V.vend_cod = :vend AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECHA AND DEVT_ANULADO = 'N'
        AND P.PREF_PRE = V.PREF_PRE AND P.TIDO_COD = 33 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
        AND EXTRACT(MONTH FROM DEVT_FECHA) = :MES
        INTO :IVA, :DEV;
    if (DEV IS NULL) then
        DEV = 0;
    if (IVA IS NULL) then
        IVA = 0;
    if (MASIVA <> 'S') then
        DEV = DEV - IVA;
    TOTAL = TOTAL - DEV;
    if (TOTAL <> 0) then
        SUSPEND;
    END
/* AGREGUE LOS vendedores SIN VENTAS */
FOR SELECT MAX(v.vend_cod), MAX(EXTRACT(MONTH FROM DEVT_FECHA)),
    SUM(DEVT_DTOMONTO), SUM(DEVT_ADICIONAL), SUM(DEVT_IVAMONTO), SUM(DEVT_EXTRA), SUM(DEVT_TOTAL)
    FROM DEVOLUCIONES_VENTAS V, PREFIJOS P
    where v.vend_cod >= :vendini AND v.vend_cod <= :vendfin AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECHA AND DEVT_ANULADO = 'N'
        AND P.PREF_PRE = V.PREF_PRE AND P.TIDO_COD = 33 AND ((P.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
        AND NOT EXISTS (select FACT_ID FROM FACTURAS F, PREFIJOS PR WHERE vend_cod = v.vend_cod AND EXTRACT(MONTH FROM FACT_FECHA) = EXTRACT(MONTH FROM DEVT_FECHA) AND FACT_ANULADO = 'N'
        AND PR.PREF_PRE = F.PREF_PRE AND PR.TIDO_COD = 31 AND ((PR.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)))
    GROUP BY V.vend_cod, EXTRACT(MONTH FROM DEVT_FECHA)
    INTO :vend, :MES, :DTO, :ADICIONAL, :IVA, :EXTRA, :DEV
    DO
    BEGIN
    TOTAL = 0;
    if (DTO IS NULL) then
        DTO = 0;
    if (ADICIONAL IS NULL) then
        ADICIONAL = 0;
    if (IVA IS NULL) then
        IVA = 0;
    if (EXTRA IS NULL) then
        EXTRA = 0;
    if (MASIVA <> 'S') then
        DEV = DEV - EXTRA - IVA - ADICIONAL + DTO;
    TOTAL = TOTAL - DEV;
    if (TOTAL <> 0) then
        SUSPEND;
    END
END
^

SET TERM ; ^

grant execute on procedure VENTAS_VENDEDOR_ANO to public;

SET TERM ^ ;

CREATE OR ALTER PROCEDURE VENTAS_ANUALES_VENDEDOR(
    VEND INTEGER,
    FECHA DATE)
RETURNS (
    PERIODO VARCHAR(8),
    TOTAL NUMERIC(18,2))
AS
declare variable EXISTE INTEGER;
declare variable ANO INTEGER;
declare variable MES INTEGER;
declare variable MESI INTEGER;
begin
DELETE FROM VENTAS_MES;
INSERT INTO VENTAS_MES (MES, TOTAL) SELECT MES, TOTAL
    FROM ventas_vendedor_ano (:vend, :vend, :fecha, 'N', 0);
MES = 0;
ANO = EXTRACT(YEAR FROM (:FECHA));
MESI = EXTRACT(MONTH FROM (:FECHA));
WHILE (MES < 12) DO
    BEGIN
    MES = MES + 1;
    SELECT COUNT(*), MAX(TOTAL) FROM VENTAS_MES WHERE MES = :mes INTO :EXISTE, :TOTAL;
    if (EXISTE = 0) then
        TOTAL = 0;
    if (MES = MESI) then
        ANO = ANO -1;
    if (MES < 10) then
        PERIODO = ANO || '-0' || MES;
    ELSE
        PERIODO = ANO || '-' || MES;
    SUSPEND;
    END
end
^

SET TERM ; ^

grant execute on procedure ventas_anuales_vendedor to public;

SET TERM ^ ;

CREATE OR ALTER PROCEDURE VENTAS_ARTICULO_ANO(
    ARTINI VARCHAR(20),
    ARTFIN VARCHAR(20),
    FECHA DATE,
    MASIVA CHAR(1),
    SUBEMPRESA INTEGER)
RETURNS (
    ARTICULO VARCHAR(20),
    MES INTEGER,
    TOTAL NUMERIC(18,2))
AS
declare variable FECINI DATE;
DECLARE VARIABLE DTO NUMERIC(18,2);
DECLARE VARIABLE ADICIONAL NUMERIC(18,2);
DECLARE VARIABLE IVA NUMERIC(18,2);
DECLARE VARIABLE EXTRA NUMERIC(18,2);
declare variable DEV NUMERIC(18, 2);
BEGIN
FECINI = fecha - 365;
FOR SELECT MAX(d.arti_cod), MAX(EXTRACT(MONTH FROM FACT_FECHA)),
    SUM(FACT_IVAMONTO), SUM(FACT_TOTAL)
    FROM FACTURAS F, FACTURAS_DETALLE D, PREFIJOS P
    where F.fact_id = D.fact_id AND D.arti_cod >= :artini AND d.arti_cod <= :artfin AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECHA AND FACT_ANULADO = 'N'
    AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
    GROUP BY d.arti_cod, EXTRACT(MONTH FROM FACT_FECHA)
    INTO :articulo, :MES, :IVA, :TOTAL
    DO
    BEGIN
    if (TOTAL IS NULL) then
        TOTAL = 0;
    if (IVA IS NULL) then
        IVA = 0;
    if (MASIVA <> 'S') then
        TOTAL = TOTAL - IVA;
    SELECT SUM(DEVT_IVAMONTO), SUM(DEVT_TOTAL)
        FROM DEVOLUCIONES_VENTAS V, devoluciones_ventas_detalle D, PREFIJOS P
        where V.devt_id = D.devt_id AND D.arti_cod = :articulo AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECHA AND DEVT_ANULADO = 'N'
        AND P.PREF_PRE = V.PREF_PRE AND P.TIDO_COD = 33 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
        AND EXTRACT(MONTH FROM DEVT_FECHA) = :MES
        INTO :IVA, :DEV;
    if (DEV IS NULL) then
        DEV = 0;
    if (IVA IS NULL) then
        IVA = 0;
    if (MASIVA <> 'S') then
        DEV = DEV - IVA;
    TOTAL = TOTAL - DEV;
    if (TOTAL <> 0) then
        SUSPEND;
    END
/* AGREGUE LOS vendedores SIN VENTAS */
FOR SELECT MAX(D.arti_cod), MAX(EXTRACT(MONTH FROM DEVT_FECHA)),
    SUM(DEVT_DTOMONTO), SUM(DEVT_ADICIONAL), SUM(DEVT_IVAMONTO), SUM(DEVT_EXTRA), SUM(DEVT_TOTAL)
    FROM DEVOLUCIONES_VENTAS V, devoluciones_ventas_detalle D, PREFIJOS P
    where V.devt_id = D.devt_id AND D.arti_cod >= :artini AND D.arti_cod <= :artfin AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECHA AND DEVT_ANULADO = 'N'
        AND P.PREF_PRE = V.PREF_PRE AND P.TIDO_COD = 33 AND ((P.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
        AND NOT EXISTS (select F.FACT_ID FROM FACTURAS F, FACTURAS_DETALLE FD, PREFIJOS PR WHERE F.fact_id = FD.fact_id AND FD.arti_cod = D.arti_cod AND EXTRACT(MONTH FROM FACT_FECHA) = EXTRACT(MONTH FROM DEVT_FECHA) AND FACT_ANULADO = 'N'
        AND PR.PREF_PRE = F.PREF_PRE AND PR.TIDO_COD = 31 AND ((PR.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)))
    GROUP BY V.vend_cod, EXTRACT(MONTH FROM DEVT_FECHA)
    INTO :articulo, :MES, :DTO, :ADICIONAL, :IVA, :EXTRA, :DEV
    DO
    BEGIN
    TOTAL = 0;
    if (DTO IS NULL) then
        DTO = 0;
    if (ADICIONAL IS NULL) then
        ADICIONAL = 0;
    if (IVA IS NULL) then
        IVA = 0;
    if (EXTRA IS NULL) then
        EXTRA = 0;
    if (MASIVA <> 'S') then
        DEV = DEV - EXTRA - IVA - ADICIONAL + DTO;
    TOTAL = TOTAL - DEV;
    if (TOTAL <> 0) then
        SUSPEND;
    END
END
^

SET TERM ; ^

grant execute on procedure VENTAS_ARTICULO_ANO to public;

SET TERM ^ ;

CREATE OR ALTER PROCEDURE VENTAS_ANUALES_ARTICULO(
    ARTICULO VARCHAR(20),
    FECHA DATE)
RETURNS (
    PERIODO VARCHAR(8),
    TOTAL NUMERIC(18,2))
AS
declare variable EXISTE INTEGER;
declare variable ANO INTEGER;
declare variable MES INTEGER;
declare variable MESI INTEGER;
begin
DELETE FROM VENTAS_MES;
INSERT INTO VENTAS_MES (MES, TOTAL) SELECT MES, TOTAL
    FROM ventas_articulo_ano (:articulo, :articulo, :fecha, 'N', 0);
MES = 0;
ANO = EXTRACT(YEAR FROM (:FECHA));
MESI = EXTRACT(MONTH FROM (:FECHA));
WHILE (MES < 12) DO
    BEGIN
    MES = MES + 1;
    SELECT COUNT(*), MAX(TOTAL) FROM VENTAS_MES WHERE MES = :mes INTO :EXISTE, :TOTAL;
    if (EXISTE = 0) then
        TOTAL = 0;
    if (MES = MESI) then
        ANO = ANO -1;
    if (MES < 10) then
        PERIODO = ANO || '-0' || MES;
    ELSE
        PERIODO = ANO || '-' || MES;
    SUSPEND;
    END
end
^

SET TERM ; ^

grant execute on procedure ventas_anuales_articulo to public;


/* 20090322 */
/* DETALLES DEL ARTICULO EN CONSULTAS DE INVENTARIO */
SET TERM ^ ;

CREATE OR ALTER PROCEDURE KARDEX_INVENTARIO_MES(
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    CODIGO VARCHAR(15),
    DESCRIPCION VARCHAR(60),
    CODGRP VARCHAR(2),
    CODSUBG VARCHAR(3),
    CODMARCA VARCHAR(3),
    UNIDAD VARCHAR(8),
    IVA NUMERIC(9,2),
    INICIAL NUMERIC(18,2),
    ENTRADA NUMERIC(18,2),
    SALIDA NUMERIC(18,2),
    FINAL NUMERIC(18,2))
AS
BEGIN
  for select arti_cod, arti_des, GRUP_COD, SUBG_COD, MARC_COD, ARTI_UNIDAD, TAIV_PORC
    from articulo A, tarifa_iva T where A.taiv_cod = T.taiv_cod AND substring(arti_cod from 1 FOR 2) <> '.t'
    into :CODIGO, :DESCRIPCION, :CODGRP, :CODSUBG, :codmarca, :UNIDAD, :IVA
  DO
    BEGIN
    EXECUTE PROCEDURE KARDEX_ARTICULO_MES(CODIGO, FECINI, FECFIN) returning_values (:INICIAL, :ENTRADA, :SALIDA);
    FINAL = INICIAL + ENTRADA - SALIDA;
    SUSPEND;
    END
END
^

SET TERM ; ^


SET TERM ^ ;

CREATE OR ALTER PROCEDURE MOVIMIENTO_INVENTARIO_MES(
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    CODIGO VARCHAR(15),
    DESCRIPCION VARCHAR(60),
    CODGRP VARCHAR(2),
    CODSUBG VARCHAR(3),
    CODMARCA VARCHAR(3),
    UNIDAD VARCHAR(8),
    IVA NUMERIC(9,2),
    INICIAL NUMERIC(18,4),
    ENTRADA NUMERIC(18,4),
    SALIDA NUMERIC(18,4),
    FINAL NUMERIC(18,4))
AS
BEGIN
  for select arti_cod, arti_des, GRUP_COD, SUBG_COD, MARC_COD, ARTI_UNIDAD, TAIV_PORC
    from articulo A, tarifa_iva T where A.taiv_cod = T.taiv_cod AND substring(arti_cod from 1 FOR 2) <> '.t'
    into :CODIGO, :DESCRIPCION, :CODGRP, :CODSUBG, :codmarca, :UNIDAD, :IVA
  DO
    BEGIN
    EXECUTE PROCEDURE MOVIMIENTO_TOTAL_ARTICULO_MES(CODIGO, FECINI, FECFIN) returning_values (:INICIAL, :ENTRADA, :SALIDA);
    FINAL = INICIAL + ENTRADA - SALIDA;
    SUSPEND;
    END
END
^

SET TERM ; ^


/* 20090322b */
/* PREVEA QUE LA TABLA PUEDE LLEGAR A SER MUY GRANDE Y EL LOCATE INICIAL DEMORARSE MUCHO */
CREATE INDEX TASA_CAMBIO_MONEDA_IDX1
ON TASA_CAMBIO_MONEDA (TACA_FECHA);


/* 20090323 */
/* inhabilitar cuentas contables en egresos */
INSERT INTO CONFIGURACION (CONF_MODULO, CONF_CATEGORIA, CONF_PROPIEDAD, CONF_VALOR, CONF_POSIBLES, CONF_AYUDA) VALUES ('CAJA', 'EGRESOS', 'INHABILITAR CUENTAS CONTABLES PARA EVITAR DOBLE CONTABILIZACION', 'NO', 'SI,NO', 'SI:Se contabiizan únicamente las cuentas especificadas en la interfaz contable sin incluir cuentas digitadas en el egreso. NO: Se contabiliza la interfaz y se agregan las cuentas indicadas en la parte inferior del egreso');
COMMIT WORK;
    
/* 20090323b */
/* CONTABILIZAR BASE DEL EGRESO POR DOCUMENTO ABONADO */
SET TERM ^ ;

CREATE OR ALTER PROCEDURE CONTABIL_EGRESO(
    IDDOC INTEGER,
    IDINTER INTEGER)
RETURNS (
    ERROR INTEGER,
    VER CHAR(1),
    IDC INTEGER)
AS
declare variable PREF VARCHAR(4);
declare variable NUM VARCHAR(6);
declare variable FECAUX DATE;
declare variable FECHA CHAR(8);
declare variable CONC CHAR(120);
declare variable VRDTO NUMERIC(18, 2);
declare variable VRRTFTE NUMERIC(18, 2);
declare variable VRRTIVA NUMERIC(18, 2);
declare variable VRRTICA NUMERIC(18, 2);
declare variable VRTOTAL NUMERIC(18, 2);
declare variable TIPOCOMP VARCHAR(3);
declare variable PREFCONT VARCHAR(4);
declare variable BASE CHAR(1);
declare variable CTABASE VARCHAR(20);
declare variable CAJA CHAR(1);
declare variable CTACAJA VARCHAR(20);
declare variable RTFTE CHAR(1);
declare variable CTARTFTE VARCHAR(20);
declare variable RTIVA CHAR(1);
declare variable CTARTIVA VARCHAR(20);
declare variable RTICA CHAR(1);
declare variable CTARTICA VARCHAR(20);
declare variable DTO CHAR(1);
declare variable CTADTO VARCHAR(20);
declare variable EXISTE CHAR(1);
declare variable CUENTA VARCHAR(20);
declare variable MONTO NUMERIC(18,2);
declare variable ES_RETENCION CHAR(1);
declare variable TIPOCUEN CHAR(1);
declare variable NIT VARCHAR(20);
declare variable PROY VARCHAR(4);
declare variable CENTRO VARCHAR(4);
declare variable MONTOBASE NUMERIC(18,2);
declare variable PORC NUMERIC(9,2);
declare variable DEBITO NUMERIC(18,2);
declare variable CREDITO NUMERIC(18,2);
declare variable NROI INTEGER;
declare variable SUMA NUMERIC(18,2);
declare variable TCTACLIEN VARCHAR(20);
declare variable TCTARTFTE VARCHAR(20);
declare variable TCTARTIVA VARCHAR(20);
declare variable TCTARTICA VARCHAR(20);
declare variable TCTACART VARCHAR(20);
declare variable TIPOIT INTEGER;
declare variable PREFIT VARCHAR(4);
declare variable NUMIT VARCHAR(6);
declare variable NUMEROIT VARCHAR(10);
declare variable ABONOIT NUMERIC(18,2);
declare variable CTADIC VARCHAR(20);
declare variable BASEADIC VARCHAR(20);
declare variable PORCADIC NUMERIC(5,2);
declare variable VALORADIC NUMERIC(18,2);
declare variable DBADIC CHAR(1);
declare variable VRBASE NUMERIC(18,2);
declare variable GMF CHAR(1);
declare variable CODBCO INTEGER;
declare variable NUMCHEQ VARCHAR(20);
declare variable CRUCES NUMERIC(18,2);
declare variable VRCAJA NUMERIC(18,2);
declare variable OK INTEGER;
declare variable DIFCAMBIO NUMERIC(18,2);
declare variable CTADIF VARCHAR(20);
BEGIN
/* BUSQUE LA INTERFACE */
EXISTE = 'N';
SELECT 'S', TICO_COD, PRCO_PRE, INCJ_BASE, INCJ_DTOPP, INCJ_RTFTE, INCJ_RTIVA, INCJ_RTICA, INCJ_CAJA, INCJ_CTABASE, INCJ_CTADTO, INCJ_CTARTFTE, INCJ_CTARTIVA, INCJ_CTARTICA, INCJ_CTACAJA, INCJ_CONFIRMAR
    FROM INTERFAZ_CAJA
    WHERE INCJ_ID = :IDINTER
    INTO :EXISTE, :TIPOCOMP, :PREFCONT, :BASE, :DTO, :RTFTE, :RTIVA, :RTICA, :CAJA, :CTABASE, :CTADTO, :CTARTFTE, :CTARTIVA, :CTARTICA, :CTACAJA, :VER;
if (EXISTE = 'S') then
    BEGIN
    OK = 0;
    FOR SELECT CNTB_ID FROM CONTABILIZACION WHERE CNTB_TIPOREF = 62 AND CNTB_IDREF = :IDDOC INTO :OK DO
        BEGIN
        DELETE FROM CONTABILIZACION_DET WHERE CNTB_ID = :OK;
        DELETE FROM CONTABILIZACION WHERE CNTB_ID = :OK;
        END

    /* TRAIGA EL ENCABEZADO DEL EGRESO */
    SELECT PREF_PRE, EGRE_NUMERO, EGRE_FECHA, E.TERC_NIT, EGRE_CONC, EGRE_DTOF, EGRE_MONTO, EGRE_RTFTEMONTO, EGRE_RTIVAMONTO, EGRE_RTICAMONTO, TERC_CTARTFTE, TERC_CTARTIVA, TERC_CTARTICA, TERC_CTACLIENTE
        FROM EGRESOS E, TERCEROS T
        WHERE EGRE_ID = :IDDOC AND E.TERC_NIT = T.TERC_NIT
        INTO :PREF, :NUM, :FECAUX, :NIT, :CONC, :VRDTO, :VRTOTAL, :VRRTFTE, :VRRTIVA, :VRRTICA, :TCTARTFTE, TCTARTIVA, TCTARTICA, TCTACLIEN;
    /* SI ES PROVEEDOR, SOBREESCIBE LAS CUENTAS  */
    SELECT PROV_CTAPAGAR, PROV_CTARTFTE, PROV_CTARTIVA, PROV_CTARTICA
        FROM PROVEEDORES WHERE TERC_NIT = :NIT
        INTO TCTACLIEN, TCTARTFTE, TCTARTIVA, TCTARTICA;
    SELECT PREF_CENTRO, PREF_PROY FROM PREFIJOS
        WHERE PREF_PRE = :PREF AND TIDO_COD = 62 INTO :CENTRO, :PROY;
    EXECUTE PROCEDURE FECHA_A_CONTA(:FECAUX) returning_values (:FECHA);
    /* REGISTRE EL ENCABEZADO CONTABLE */
    IDC = GEN_ID(ID_CONTABILIZA, 1);
    INSERT INTO CONTABILIZACION (CNTB_ID, CNTB_TIPOCOMP, CNTB_PREFCNT, CNTB_NUMERO, CNTB_FECHA, CNTB_CONCEPTO, CNTB_REF, CNTB_TIPOREF, CNTB_IDREF, CNTB_PREFREF, CNTB_NUMREF, CNTB_PROCESADO)
        VALUES (:IDC, :TIPOCOMP, :PREFCONT, :NUM, :FECHA, :CONC, '', 62, :IDDOC, :PREF, :NUM, 'N');
    /* SUME LOS CRUCES PARA LLEVARLOS A LA CUENTA X PAGAR Y RESTAR DE LA CAJA */
    SELECT SUM(EGCC_ABONO) FROM EGRESOS_CRUCEC WHERE EGRE_ID = :iddoc INTO :CRUCES;
    if (CRUCES IS NULL) then
        CRUCES = 0;
    VRCAJA = VRTOTAL - CRUCES;
    NROI = 0;
    SUMA = 0;
    ERROR = 0;
    /* EL CREDITO EN LA CAJA O EL BANCO */
    IF ((CAJA = 'K')) THEN
        BEGIN
        if (VRCAJA <> 0) then
            BEGIN
            CUENTA = NULL;
            EXECUTE PROCEDURE VALIDE_CUENTA_C (CTACAJA) RETURNING_VALUES (:OK);
            IF (OK = 0) THEN
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :CTACAJA INTO :CUENTA, :TIPOCUEN;
            ELSE
                begin
                EXECUTE PROCEDURE ERROR (62, :IDDOC, :CTACAJA, 2);
                CUENTA = CTACAJA;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 4);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRCAJA, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - VRCAJA;
                END
            END /* VRCAJA <> 0 */
        END /* CAJA CONSTANTE */
    IF ((CAJA = 'F')) THEN
        BEGIN
        /* mueva la cuenta de la caja o el banco o ambas */
        /* PRIMERO LA CAJA */
        FOR SELECT CAJA_CUENTA, EGCA_MONTO FROM EGRESOS_CAJA E, CAJAS C
            WHERE C.CAJA_ID = E.CAJA_ID AND EGRE_ID = :IDDOC
            INTO :CTACAJA, :MONTO
            DO
            BEGIN
            if (MONTO <> 0) then
                BEGIN
                CUENTA = NULL;
                EXECUTE PROCEDURE VALIDE_CUENTA_C (CTACAJA) RETURNING_VALUES (:OK);
                IF (OK = 0) THEN
                    SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                        WHERE CUEN_COD = :CTACAJA INTO :CUENTA, :TIPOCUEN;
                ELSE
                    begin
                    EXECUTE PROCEDURE ERROR (62, :IDDOC, :CTACAJA, 2);
                    CUENTA = CTACAJA;
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 4);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA - MONTO;
                    END
                END /* MONTO <> 0 */
            END /* DO CAJA */
        /* AHORA EL BANCO */
        MONTO = 0;
        SELECT CUBA_CTACONTA, EGBC_MONTO, EGBC_GMF, E.CUBA_COD, CUBA_GMFPOR, EGBC_NUMERO
            FROM EGRESOS_BANCO E, CUENTAS_BANCO C
            WHERE E.CUBA_COD = C.CUBA_COD AND EGRE_ID = :IDDOC
            INTO :CTACAJA, :MONTO, :GMF, :CODBCO, :PORC, :NUMCHEQ;
        if (MONTO <> 0) then
            BEGIN
            if (MONTO <> 0) then
                BEGIN
                CUENTA = NULL;
                EXECUTE PROCEDURE VALIDE_CUENTA_C (CTACAJA) RETURNING_VALUES (:OK);
                IF (OK = 0) THEN
                    SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                        WHERE CUEN_COD = :CTACAJA INTO :CUENTA, :TIPOCUEN;
                ELSE
                    begin
                    EXECUTE PROCEDURE ERROR (62, :IDDOC, :CTACAJA, 2);
                    CUENTA = CTACAJA;
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 4);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, :NUMCHEQ, 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA - MONTO;
                    END
                /* EL GMF */
                if ((GMF = 'S') AND (PORC <> 0)) then
                    BEGIN
                    EXECUTE procedure REDONDEE(:MONTO * :PORC / 1000, 0) returning_values (MONTO);
                    /* REGISTRE EL GMF EN LA MISMA CUENTA DEL BANCO COMO CREDITO */
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, :NUMCHEQ, 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA - MONTO;

                    /* AHORA LA CUENTA DEL GASTO */
                    SELECT CUBA_CTAGMF FROM CUENTAS_BANCO
                        where CUBA_COD = :CODBCO INTO :CTACAJA;
                    EXECUTE PROCEDURE VALIDE_CUENTA_C (CTACAJA) RETURNING_VALUES (:OK);
                    IF (OK = 0) THEN
                        SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                            WHERE CUEN_COD = :CTACAJA INTO :CUENTA, :TIPOCUEN;
                    ELSE
                        begin
                        EXECUTE PROCEDURE ERROR (62, :IDDOC, :CTACAJA, 2);
                        CUENTA = CTACAJA;
                        TIPOCUEN = 'N';
                        ERROR = ERROR + 1;
                        end
                    if (TIPOCUEN = 'I') then
                        BEGIN
                        EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
                        TIPOCUEN = 'N';
                        ERROR = ERROR + 1;
                        END
                    if (TIPOCUEN = 'C') then
                        BEGIN
                        EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 4);
                        TIPOCUEN = 'N';
                        ERROR = ERROR + 1;
                        END
                    if (TIPOCUEN = 'N') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, :NUMCHEQ, :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NROI = NROI + 1;
                        SUMA = SUMA + MONTO;
                        END
                    END /* GMF */
                END /* MONTO <> 0 */
            END /* EGRESO_BANCO */
        END /* CAJA = F */

    /* LOS CRUCES CON CUENTAS X COBRAR */
    if (CRUCES <> 0) then
        BEGIN
        SELECT TERC_CTACLIENTE FROM TERCEROS WHERE TERC_NIT = :nit INTO :tctacart;
        if (tctacart IS NULL) then
            tctacart = tctaclien;
        CUENTA = NULL;
        EXECUTE PROCEDURE VALIDE_CUENTA_C (tctacart) RETURNING_VALUES (:OK);
        IF (OK = 0) THEN
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :tctacart INTO :CUENTA, :TIPOCUEN;
        ELSE
            begin
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :tctacart, 2);
            CUENTA = tctacart;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            /* DEBERIA RECORRER DOCUMENTO POR DOCUMENTO */
            FOR SELECT EGCC_TIPODOC, EGCC_PREFIJO, EGCC_NUMERO, EGCC_ABONO+EGCC_RTFTE+EGCC_RTIVA+EGCC_RTICA+EGCC_DTOF
                FROM egresos_crucec WHERE EGRE_ID = :IDDOC
                INTO :TIPOIT, PREFIT, NUMIT, ABONOIT
                DO
                BEGIN
                NUMEROIT = PREFIT || NUMIT;
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :ABONOIT, 0, 0, :NIT, :PROY, :CENTRO, NULL, :NUMEROIT, NULL, NULL, :TIPOIT, 0);
                SUMA = SUMA - ABONOIT;
                NROI = NROI + 1;
                END
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :CRUCES, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            SUMA = SUMA - CRUCES;
            NROI = NROI + 1;
            END
        /* LA DIFERENCIA EN CAMBIO */
        SELECT SUM(EGCC_DIFCAMBIO) FROM egresos_crucec WHERE EGRE_ID = :iddoc INTO :DIFCAMBIO;
        IF ((DIFCAMBIO IS NOT NULL) AND (DIFCAMBIO <> 0)) THEN
            BEGIN
            if (DIFCAMBIO > 0) then
                execute procedure lee_configuracion('GENERAL','GENERAL','CUENTA DE INGRESO POR DIFERENCIA EN CAMBIO PARA OPERACIONES EN OTRA MONEDA') returning_values (:ctadif);
            else
                execute procedure lee_configuracion('GENERAL','GENERAL','CUENTA DE GASTO POR DIFERENCIA EN CAMBIO PARA OPERACIONES EN OTRA MONEDA') returning_values (:ctadif);
            CUENTA = NULL;
            EXECUTE PROCEDURE VALIDE_CUENTA_C (ctadif) RETURNING_VALUES (:OK);
            IF (OK = 0) THEN
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :ctadif INTO :CUENTA, :TIPOCUEN;
            ELSE
                begin
                EXECUTE PROCEDURE ERROR (62, :IDDOC, :ctadif, 2);
                CUENTA = ctadif;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 4);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                if (DIFCAMBIO > 0) then
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :difcambio, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                else
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', ABS(:difcambio), 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - difcambio;
                END
            END
        END /* cruces */

    if (DTO = 'K') then /* DTO EN CTA CONSTANTE */
        BEGIN
        if (VRDTO <> 0) then
            BEGIN
            CUENTA = NULL;
            EXECUTE PROCEDURE VALIDE_CUENTA_C (CTADTO) RETURNING_VALUES (:OK);
            IF (OK = 0) THEN
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :CTADTO INTO :CUENTA, :TIPOCUEN;
            ELSE
                begin
                EXECUTE PROCEDURE ERROR (62, :IDDOC, :CTADTO, 2);
                CUENTA = CTADTO;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 4);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRDTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - VRDTO;
                END
            END /* VRDTO <> 0 */
        END /* DTO EN CTA CONSTANTE */

    /* LA DIFERENCIA EN CAMBIO */
    SELECT SUM(EGDE_DIFCAMBIO) FROM egresos_detalle WHERE EGRE_ID = :iddoc INTO :DIFCAMBIO;
    IF ((DIFCAMBIO IS NOT NULL) AND (DIFCAMBIO <> 0)) THEN
        BEGIN
        if (DIFCAMBIO > 0) then
            execute procedure lee_configuracion('GENERAL','GENERAL','CUENTA DE GASTO POR DIFERENCIA EN CAMBIO PARA OPERACIONES EN OTRA MONEDA') returning_values (:ctadif);
        else
            execute procedure lee_configuracion('GENERAL','GENERAL','CUENTA DE INGRESO POR DIFERENCIA EN CAMBIO PARA OPERACIONES EN OTRA MONEDA') returning_values (:ctadif);
        CUENTA = NULL;
        EXECUTE PROCEDURE VALIDE_CUENTA_C (ctadif) RETURNING_VALUES (:OK);
        IF (OK = 0) THEN
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :ctadif INTO :CUENTA, :TIPOCUEN;
        ELSE
            begin
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :ctadif, 2);
            CUENTA = ctadif;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 4);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            if (DIFCAMBIO > 0) then
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :difcambio, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            else
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, ABS(:difcambio), 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA + difcambio;
            END
        END
    /* RETENCION FUENTE */
    if ((RTFTE = 'T') or (RTFTE = 'K')) then
      if (VRRTFTE <> 0) then
        BEGIN
        if (RTFTE = 'T') then
            CTARTFTE = TCTARTFTE;
        CUENTA = NULL;
        EXECUTE PROCEDURE VALIDE_CUENTA_C (CTARTFTE) RETURNING_VALUES (:OK);
        IF (OK = 0) THEN
            SELECT CUEN_COD, CUEN_RETENCION, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTARTFTE INTO :CUENTA, :ES_RETENCION, :TIPOCUEN;
        ELSE
            begin
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :CTARTFTE, 2);
            CUENTA = CTARTFTE;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 4);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            if (ES_RETENCION = 'S') then
                BEGIN
                VRBASE = VRTOTAL;
                SELECT PROV_RETEFTE from proveedores where terc_nit = :NIT INTO :PORC;
                END
            ELSE
                BEGIN
                VRBASE = 0;
                PORC = 0;
                END
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, :VRBASE, :PORC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA - VRRTFTE;
            END
        END /* RTFTE */
    /* RETENCION IVA */
    if ((RTIVA = 'T') or (RTIVA = 'K')) then
      if (VRRTIVA <> 0) then
        BEGIN
        if (RTIVA = 'T') then
            CTARTIVA = TCTARTIVA;
        CUENTA = NULL;
        EXECUTE PROCEDURE VALIDE_CUENTA_C (CTARTIVA) RETURNING_VALUES (:OK);
        IF (OK = 0) THEN
            SELECT CUEN_COD, CUEN_RETENCION, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTARTIVA INTO :CUENTA, :ES_RETENCION, :TIPOCUEN;
        ELSE
            begin
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :CTARTIVA, 2);
            CUENTA = CTARTIVA;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 4);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            if (ES_RETENCION = 'S') then
                BEGIN
                VRBASE = VRTOTAL;
                SELECT PROV_RTEIVA from proveedores where terc_nit = :NIT INTO :PORC;
                END
            ELSE
                BEGIN
                VRBASE = 0;
                PORC = 0;
                END
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTIVA, :VRBASE, :PORC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA - VRRTIVA;
            END
        END /* RTIVA */
    /* RETENCION DE ICA */
    if ((RTICA = 'T') or (RTICA = 'K')) then
      if (VRRTICA <> 0) then
        BEGIN
        if (RTICA = 'T') then
            CTARTICA = TCTARTICA;
        CUENTA = NULL;
        EXECUTE PROCEDURE VALIDE_CUENTA_C (CTARTICA) RETURNING_VALUES (:OK);
        IF (OK = 0) THEN
            SELECT CUEN_COD, CUEN_RETENCION, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTARTICA INTO :CUENTA, :ES_RETENCION, :TIPOCUEN;
        ELSE
            begin
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :CTARTICA, 2);
            CUENTA = CTARTICA;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 4);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            if (ES_RETENCION = 'S') then
                BEGIN
                VRBASE = VRTOTAL;
                SELECT PROV_RTEICA from proveedores where terc_nit = :NIT INTO :PORC;
                END
            ELSE
                BEGIN
                VRBASE = 0;
                PORC = 0;
                END
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTICA, :VRBASE, :PORC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA - VRRTICA;
            END
        END /* RTICA */
    /* RECORRA LAS CUENTAS DE EGRESOS_CONTABILIDAD */
    FOR SELECT CUEN_COD, EGCO_NIT, EGCO_PROY, EGCO_CENTRO, EGCO_CONC, EGCO_DEBITOS, EGCO_CREDITOS, EGCO_BASEM, EGCO_PORC
        FROM EGRESOS_CONTABILIDAD WHERE EGRE_ID = :IDDOC ORDER BY EGCO_ITEM
        INTO :CTABASE, :NIT, :PROY, :CENTRO, :CONC, :DEBITO, :CREDITO, :MONTOBASE, :PORC
        DO
        BEGIN
        CUENTA = NULL;
        EXECUTE PROCEDURE VALIDE_CUENTA_C (CTABASE) RETURNING_VALUES (:OK);
        IF (OK = 0) THEN
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTABASE INTO :CUENTA, :TIPOCUEN;
        ELSE
            begin
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :CTABASE, 2);
            CUENTA = CTABASE;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 4);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'N') then
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :DEBITO, :CREDITO, :MONTOBASE, :PORC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
        SUMA = SUMA + DEBITO - CREDITO;
        NROI = NROI + 1;
        END
    /* CIERRE EL COMPROBANTE CONTRA LA CUENTA DEL TERCERO O LA BASE CONSTANTE */
    if (SUMA <> 0) THEN
        BEGIN
        if (SUMA < 0) then
            BEGIN
            DEBITO = SUMA * -1;
            CREDITO = 0;
            END
        ELSE
            BEGIN
            DEBITO = 0;
            CREDITO = SUMA;
            END
        if ((BASE = 'F') or (BASE = 'T') or (BASE = 'K')) then
            BEGIN
            if (BASE = 'T') then
                CTABASE = TCTACLIEN;
            if (BASE = 'F') then
                BEGIN
                SELECT CAJA_CUENTA FROM EGRESOS E, CAJAS C
                    WHERE C.CAJA_ID = E.CAJA_ID AND EGRE_ID = :IDDOC INTO :CTABASE;
                END
            CUENTA = NULL;
            EXECUTE PROCEDURE VALIDE_CUENTA_C (CTABASE) RETURNING_VALUES (:OK);
            IF (OK = 0) THEN
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :CTABASE INTO :CUENTA, :TIPOCUEN;
            ELSE
                begin
                EXECUTE PROCEDURE ERROR (62, :IDDOC, :CTABASE, 2);
                CUENTA = CTABASE;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                /* DEBERIA RECORRER DOCUMENTO POR DOCUMENTO */
                FOR SELECT RCDE_TIPODOC, RCDE_PREFIJO, RCDE_NUMERO, RCDE_ABONO+RCDE_RTFTE+RCDE_RTIVA+RCDE_RTICA+RCDE_DTOF
                    FROM RECIBOS_CAJA_DETALLE WHERE RECA_ID = :IDDOC
                    INTO :TIPOIT, PREFIT, NUMIT, ABONOIT
                    DO
                    BEGIN
                    NUMEROIT = PREFIT || NUMIT;
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :ABONOIT, 0, 0, :NIT, :PROY, :CENTRO, NULL, :NUMEROIT, NULL, NULL, :TIPOIT, 0);
                    NROI = NROI + 1;
                    END
                END
            if (TIPOCUEN = 'N') then
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :DEBITO, :CREDITO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            END /* SUMA EN CARTERA */
        if (BASE = 'D') then
            BEGIN
            CTABASE = NULL;
            FOR SELECT EGDE_TIPODOC, EGDE_PREFIJO, EGDE_NUMERO, CUEN_COD, CODE_DEBITO-CODE_CREDITO, PROY_COD, CENT_COD
                FROM EGRESOS_DETALLE ED, COMPROBANTE_ENCABEZADO E, COMPROBANTE_DETALLE D
                WHERE E.enco_consec = D.enco_consec AND E.enco_tiporef = ED.egde_tipodoc AND E.enco_idref = ED.egde_iddoc AND SUBSTR(CUEN_COD,1,1) = '2' AND
                SUBSTR(CUEN_COD,1,3) <> '236' AND SUBSTR(CUEN_COD,1,4) <> '2408' AND EGRE_ID = :IDDOC
                INTO :tipoit, :PREFIT, :NUMIT, :ctabase, :suma, :proy, :centro
                DO
                BEGIN
                CUENTA = NULL;
                EXECUTE PROCEDURE VALIDE_CUENTA_C (ctabase) RETURNING_VALUES (:OK);
                IF (OK = 0) THEN
                    SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                        WHERE CUEN_COD = :CTABASE INTO :CUENTA, :TIPOCUEN;
                ELSE
                    begin
                    EXECUTE PROCEDURE ERROR (62, :IDDOC, :CTABASE, 2);
                    CUENTA = CTABASE;
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    end
                if (SUMA < 0) then
                    BEGIN
                    DEBITO = SUMA * -1;
                    CREDITO = 0;
                    END
                ELSE
                    BEGIN
                    DEBITO = 0;
                    CREDITO = SUMA;
                    END
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    /* DEBERIA RECORRER DOCUMENTO POR DOCUMENTO */
                    NUMEROIT = PREFIT || NUMIT;
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :debito, :credito, 0, 0, :NIT, :PROY, :CENTRO, NULL, :NUMEROIT, NULL, NULL, :TIPOIT, 0);
                    END
                if (TIPOCUEN = 'N') then
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :DEBITO, :CREDITO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                END /* SUMA EN CARTERA */
            END
        END
    /* recorra las cuentas adicionales */
    FOR SELECT INJC_CUENTA, INJC_BASE, INJC_PORC, INJC_VALOR, INJC_DB
        FROM INTERFAZ_CAJA_CTAS
        WHERE INCJ_ID = :IDINTER
        INTO :CTADIC, :BASEADIC, :PORCADIC, :VALORADIC, :DBADIC
        DO
        BEGIN
        if (:BASEADIC = 'TOTAL') then
            VALORADIC = VRTOTAL;
        if (:BASEADIC = 'DESCUENTO') then
            VALORADIC = VRDTO;
        if (:BASEADIC = 'RTFTE') then
            VALORADIC = VRRTFTE;
        if (:BASEADIC = 'RTIVA') then
            VALORADIC = VRRTIVA;
        if (:BASEADIC = 'RTICA') then
            VALORADIC = VRRTICA;
        MONTO = VALORADIC * PORCADIC;
        CUENTA = NULL;
        EXECUTE PROCEDURE VALIDE_CUENTA_C (CTADIC) RETURNING_VALUES (:OK);
        IF (OK = 0) THEN
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTADIC INTO :CUENTA, :TIPOCUEN;
        ELSE
            begin
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :CTADIC, 2);
            CUENTA = CTADIC;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 4);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            if (DBADIC = 'S') then
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTADIC, :CONC, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            ELSE
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTADIC, :CONC, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            END
        NROI = NROI + 1;
        END
    if (ERROR > 0) then
        VER = 'S';
    SUSPEND;
    END /* EXISTE LA INTERFAZ */
  ELSE
    BEGIN
    EXECUTE PROCEDURE ERROR (62, :IDDOC, :PREF, 1);
    ERROR = ERROR + 1;
    VER = 'S';
    SUSPEND;
    END
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE EGRESOS_SIN_CONTABILIDAD(
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    ID INTEGER,
    IDI INTEGER,
    IDC INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    ESTADO VARCHAR(20),
    ERROR INTEGER)
AS
DECLARE VARIABLE VER CHAR(2);
declare variable FECICNT VARCHAR(10);
declare variable FECFCNT VARCHAR(10);
declare variable idref INTEGER;
BEGIN /*$$IBE$$ 
EXECUTE PROCEDURE fecha_a_conta(FECINI) returning_values (FECICNT);
EXECUTE PROCEDURE fecha_a_conta(FECFIN) returning_values (FECFCNT);
FOR SELECT EGRE_ID, PREF_PRE, egre_numero FROM EGRESOS WHERE EGRE_ANULADO = 'N' AND PREF_PRE <> 'R004' AND
    EGRE_FECHA >= :FECINI AND EGRE_FECHA <= :FECFIN ORDER BY EGRE_ID INTO :ID, :PREF, :NUMERO
DO
  BEGIN
  idref = null;
  SELECT ENCO_IDREF FROM COMPROBANTE_ENCABEZADO WHERE ENCO_TIPOREF = 62 AND ENCO_FECHA >= :FECICNT AND ENCO_FECHA <= :FECFCNT and ENCO_IDREF = :ID into :idref;
  if (idref IS NULL) then
  begin
   ESTADO = 'PROCESANDO';
   SUSPEND;
   SELECT MAX(INCJ_ID) FROM INTERFAZ_CAJA WHERE PREF_PRE = :PREF AND TIDO_COD = 62 INTO :IDI;
   EXECUTE PROCEDURE CONTABIL_EGRESO (:ID, :IDI) RETURNING_VALUES (:ERROR, :VER, :IDC);
   IF (ERROR = 0) THEN
      BEGIN
      EXECUTE PROCEDURE CONTABILIZA_PENDIENTE (:IDC);
      ESTADO = 'OK';
      END
   ELSE
    ESTADO = 'ERROR';
   suspend;
  end
  END
 $$IBE$$*/ SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE EGRESOS_SIN_CONTABILIDAD(
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    ID INTEGER,
    IDI INTEGER,
    IDC INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    ESTADO VARCHAR(20),
    ERROR INTEGER)
AS
DECLARE VARIABLE VER CHAR(2);
declare variable FECICNT VARCHAR(10);
declare variable FECFCNT VARCHAR(10);
declare variable idref INTEGER;
BEGIN
EXECUTE PROCEDURE fecha_a_conta(FECINI) returning_values (FECICNT);
EXECUTE PROCEDURE fecha_a_conta(FECFIN) returning_values (FECFCNT);
FOR SELECT EGRE_ID, PREF_PRE, egre_numero FROM EGRESOS WHERE EGRE_ANULADO = 'N' AND PREF_PRE <> 'R004' AND
    EGRE_FECHA >= :FECINI AND EGRE_FECHA <= :FECFIN ORDER BY EGRE_ID INTO :ID, :PREF, :NUMERO
DO
  BEGIN
  idref = null;
  SELECT ENCO_IDREF FROM COMPROBANTE_ENCABEZADO WHERE ENCO_TIPOREF = 62 AND ENCO_FECHA >= :FECICNT AND ENCO_FECHA <= :FECFCNT and ENCO_IDREF = :ID into :idref;
  if (idref IS NULL) then
  begin
   ESTADO = 'PROCESANDO';
   SUSPEND;
   SELECT MAX(INCJ_ID) FROM INTERFAZ_CAJA WHERE PREF_PRE = :PREF AND TIDO_COD = 62 INTO :IDI;
   EXECUTE PROCEDURE CONTABIL_EGRESO (:ID, :IDI) RETURNING_VALUES (:ERROR, :VER, :IDC);
   IF (ERROR = 0) THEN
      BEGIN
      EXECUTE PROCEDURE CONTABILIZA_PENDIENTE (:IDC);
      ESTADO = 'OK';
      END
   ELSE
    ESTADO = 'ERROR';
   suspend;
  end
  END
END

^

SET TERM ; ^


/* 20090323c */
DROP INDEX CONTABILIZACION_IDX1;
CREATE INDEX CONTABILIZACION_IDX1
ON CONTABILIZACION (CNTB_TIPOREF);
CREATE INDEX CONTABILIZACION_IDX2
ON CONTABILIZACION (CNTB_IDREF);


/* 20090323d */

INSERT INTO CONCILIACION_OPERACIONES (CUBA_COD, COOP_OPER, COOP_TIPODOC, COOP_DB) VALUES (1, 'ABONO', 75, 'S');
INSERT INTO CONCILIACION_OPERACIONES (CUBA_COD, COOP_OPER, COOP_TIPODOC, COOP_DB) VALUES (1, 'COBROS', 73, 'N');
INSERT INTO CONCILIACION_OPERACIONES (CUBA_COD, COOP_OPER, COOP_TIPODOC, COOP_DB) VALUES (1, 'COMIS', 73, 'N');
INSERT INTO CONCILIACION_OPERACIONES (CUBA_COD, COOP_OPER, COOP_TIPODOC, COOP_DB) VALUES (1, 'CONSI', 71, 'S');
INSERT INTO CONCILIACION_OPERACIONES (CUBA_COD, COOP_OPER, COOP_TIPODOC, COOP_DB) VALUES (1, 'CUOTA', 73, 'N');
INSERT INTO CONCILIACION_OPERACIONES (CUBA_COD, COOP_OPER, COOP_TIPODOC, COOP_DB) VALUES (1, 'PAGO N', 71, 'S');
INSERT INTO CONCILIACION_OPERACIONES (CUBA_COD, COOP_OPER, COOP_TIPODOC, COOP_DB) VALUES (1, 'PAGO P', 73, 'N');
INSERT INTO CONCILIACION_OPERACIONES (CUBA_COD, COOP_OPER, COOP_TIPODOC, COOP_DB) VALUES (1, 'PAGO S', 73, 'N');
INSERT INTO CONCILIACION_OPERACIONES (CUBA_COD, COOP_OPER, COOP_TIPODOC, COOP_DB) VALUES (1, 'PAGO T', 73, 'N');
INSERT INTO CONCILIACION_OPERACIONES (CUBA_COD, COOP_OPER, COOP_TIPODOC, COOP_DB) VALUES (1, 'RETIRO', 73, 'N');
commit work;

/* 20090323e */
/* agregue columnas de zona, vendedor, cobrador y grupo a las ventas por cliente */
SET TERM ^ ;

CREATE OR ALTER PROCEDURE VENTAS_CLIENTE_MES(
    FECINI DATE,
    FECFIN DATE,
    SUBEMPRESA INTEGER)
RETURNS (
    NIT VARCHAR(20),
    NOMBRE VARCHAR(60),
    ZONA CHAR(2),
    VEND INTEGER,
    COBR INTEGER,
    GRUP INTEGER,
    FACTURAS INTEGER,
    MFACTURAS NUMERIC(18,2),
    DEVOLUCIONES INTEGER,
    MDEVOLUCIONES NUMERIC(18,2),
    IVAFACT NUMERIC(18,2),
    IVADEV NUMERIC(18,2),
    CONSUMOF NUMERIC(18,2),
    CONSUMOD NUMERIC(18,2))
AS
BEGIN
  for select T.TERC_NIT, TERC_NOM, ZONA_COD, VEND_COD, COBR_COD, GRCA_COD
    from TERCEROS T, CLIENTES C WHERE T.terc_nit = C.terc_nit AND TERC_CLIE = 'S'
    into :NIT, :NOMBRE, :zona, :vend, :cobr, :grup
  DO
    BEGIN
    EXECUTE PROCEDURE VENTAS_CLIENTE (NIT, FECINI, FECFIN, SUBEMPRESA) returning_values (FACTURAS, MFACTURAS, DEVOLUCIONES, MDEVOLUCIONES, IVAFACT, IVADEV, CONSUMOF, CONSUMOD);
    SUSPEND;
    END
END
^

SET TERM ; ^



/* 20090324 */
/* CONFIGURABLE SI INCLUIR EL DTOFIN EN LAS COMISIONES DE COBRO */
INSERT INTO CONFIGURACION (CONF_MODULO, CONF_CATEGORIA, CONF_PROPIEDAD, CONF_VALOR, CONF_POSIBLES, CONF_AYUDA) VALUES ('CARTERA', 'COMISIONES', 'INCLUIR DESCUENTO FINANCIERO EN BASE DE COMISIONES POR COBRO', 'NO', 'SI,NO', 'SI: No resta el valor del descuento digitado en los recibos de la base de la comisión por cobro. NO: Liquida la comisión solo sobre el valor recibido sin incluir los descuentos por pronto pago');
commit work;

SET TERM ^ ;

CREATE OR ALTER PROCEDURE COMISIONES_COBRO(
    DESDE INTEGER,
    HASTA INTEGER,
    FECINI DATE,
    FECFIN DATE,
    DETALLE CHAR(1))
RETURNS (
    CODVEND INTEGER,
    NOMVEND VARCHAR(60),
    NIT VARCHAR(20),
    CLIENTE VARCHAR(60),
    NOMTIPO VARCHAR(8),
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(6),
    FECDOC DATE,
    PREFREC VARCHAR(4),
    NUMREC VARCHAR(6),
    FECREC DATE,
    DIAS INTEGER,
    ABONO NUMERIC(18,2),
    BASE NUMERIC(18,2),
    COMIMONTO NUMERIC(18,2),
    COMIPORC NUMERIC(9,2),
    ARTICULO VARCHAR(20),
    CODGRP VARCHAR(2),
    CANT NUMERIC(18,4),
    DTOFIN NUMERIC(18,2),
    VENCE DATE,
    RTFTE NUMERIC(18,2),
    RTIVA NUMERIC(18,2),
    RTICA NUMERIC(18,2))
AS
DECLARE VARIABLE TIPO INTEGER;
DECLARE VARIABLE ID INTEGER;
DECLARE VARIABLE IVAMONTO NUMERIC(18,2);
DECLARE VARIABLE TOTAL NUMERIC(18,2);
DECLARE VARIABLE SITOT CHAR(2);
DECLARE VARIABLE VENTA CHAR(2);
DECLARE VARIABLE COMIV NUMERIC(18,2);
DECLARE VARIABLE PORCV NUMERIC(18,2);
DECLARE VARIABLE CONSUMO NUMERIC(18,2);
declare variable ALFINAL CHAR(2);
declare variable SALDO NUMERIC(18,2);
declare variable COMISION VARCHAR(10);
declare variable porcaux NUMERIC(9,2);
declare variable BASEAUX DOUBLE PRECISION;
declare variable SUCURSAL VARCHAR(20);
declare variable COMIART VARCHAR(6);
declare variable LISTA INTEGER;
declare variable LISTAP INTEGER;
declare variable INCDTO CHAR(2);
DECLARE VARIABLE IDF INTEGER;
BEGIN
EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION', 'VENDEDORES', 'COMISIONES EN VENTA INCLUYENDO IMPUESTOS') returning_values (:SITOT);
EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA','COMISIONES','COMISION POR COBRO PAGADERA SOLO EN EL COBRO TOTAL') returning_values (:ALFINAL);
execute procedure lee_configuracion('CARTERA','COMISIONES','COMISION POR COBRO COMO PORCENTAJE DE LA COMISION VENTA') returning_values (:venta);
EXECUTE PROCEDURE lee_configuracion('CARTERA', 'COMISIONES', 'LIQUIDAR COMISION COBRO CON COBRADOR DEL DOCUMENTO O DEL RECIBO') returning_values (:COMISION);
EXECUTE PROCEDURE lee_configuracion ('FACTURACION','FACTURAS', 'CODIGO DE LA LISTA DE PRECIOS A MOSTRAR EN ARTICULOS') returning_values (:LISTAP);
EXECUTE PROCEDURE lee_configuracion('CARTERA', 'COMISIONES', 'COMISION POR COBRO POR ARTICULO') returning_values (:comiart);
EXECUTE PROCEDURE lee_configuracion('CARTERA', 'COMISIONES', 'INCLUIR DESCUENTO FINANCIERO EN BASE DE COMISIONES POR COBRO') returning_values (:incdto);
FOR SELECT RCDE_TIPODOC, RCDE_IDDOC, RCDE_PREFIJO, RCDE_NUMERO, R.TERC_NIT, TERC_NOM, RECA_FECHA, (RCDE_ABONO+RCDE_RTFTE+RCDE_RTIVA+RCDE_RTICA), PREF_PRE, RECA_NUMERO, COBR_COD, RCDE_DTOF, RCDE_RTFTE, RCDE_RTIVA, RCDE_RTICA
    FROM RECIBOS_CAJA R, RECIBOS_CAJA_DETALLE RD, TERCEROS T
    WHERE R.RECA_ID = RD.RECA_ID AND RECA_FECHA >= :FECINI AND RECA_FECHA <= :FECFIN AND R.TERC_NIT = T.TERC_NIT AND RECA_ANULADO = 'N'
    ORDER BY TERC_NIT, RECA_FECHA
    INTO :TIPO, :ID, :PREFIJO, :NUMERO, :NIT, :CLIENTE, :FECREC, :ABONO, :PREFREC, :NUMREC, :codvend, :DTOFIN, :rtfte, :RTIVA, :RTICA
    DO
    BEGIN
    SELECT TIDO_NOMCORTO FROM TIPO_DOCUMENTO WHERE TIDO_COD = :TIPO INTO :NOMTIPO;
    if (incdto = 'SI') then
        ABONO = ABONO + DTOFIN;
    if (COMISION = 'DOCUMENTO') then
        SELECT MVCL_FECHA, COBR_COD, MVCL_VENCE FROM MOVIMIENTO_CLIENTES WHERE MVCL_TIPOREF = :TIPO AND MVCL_IDREF = :ID
            INTO :FECDOC, :codvend, :VENCE;
    else
        SELECT MVCL_FECHA, MVCL_VENCE FROM MOVIMIENTO_CLIENTES WHERE MVCL_TIPOREF = :TIPO AND MVCL_IDREF = :ID
            INTO :FECDOC, :VENCE;
    if (FECDOC IS NOT NULL) then
        DIAS = FECREC - FECDOC;
    ELSE
        DIAS = 999;
    if ((codvend >= :DESDE) AND (codvend <= :hasta)) then
        BEGIN
        /* TRAIGA EL PORCENTAJE DE ACUERDO A LOS DIAS */
        COMIPORC = 0;
        SELECT CMCB_PORC FROM COMISION_COBRO WHERE CMCB_DIASINI <= :dias AND CMCB_DIASFIN >= :DIAS AND COBR_COD = :CODVEND
            INTO :COMIPORC;
        if (COMIPORC IS NULL) THEN
            COMIPORC = 0;
        if (VENTA = 'NO') then
            BEGIN
            if (TIPO = 31) then
                BEGIN
                if (DETALLE = 'N') then
                    SELECT MAX(FACT_TOTAL), MAX(FACT_IVAMONTO), SUM(FADE_CONSUMO) FROM FACTURAS F, FACTURAS_DETALLE D
                        WHERE F.FACT_ID = D.FACT_ID AND F.FACT_ID = :ID INTO :TOTAL, :IVAMONTO, :CONSUMO;
                ELSE
                    FOR SELECT D.ARTI_COD, FADE_CANT, FADE_TOTAL, FADE_IVAMONTO, FADE_CONSUMO, GRUP_COD, LIPR_COD
                        FROM FACTURAS F, FACTURAS_DETALLE D, ARTICULO A
                        WHERE F.FACT_ID = D.FACT_ID AND D.arti_cod = A.arti_cod AND F.FACT_ID = :ID and substring(a.arti_cod from 1 FOR 2) <> '.t'
                        INTO :ARTICULO, :CANT, :TOTAL, :IVAMONTO, :CONSUMO, :CODGRP, :lista
                        DO
                        BEGIN
                        if (comiart = 'GRUPO') then
                            SELECT GRUP_COMIPOR FROM GRUPO WHERE GRUP_COD = :codgrp INTO :comiporc;
                        if (comiart = 'PRECIO') then
                            SELECT PRAR_COMI FROM precios_articulo WHERE ARTI_COD = :articulo AND LIPR_COD = :LISTA INTO :comiporc;

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

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

SET TERM ; ^


/* 20090324b */
/* contabilizacion de retenciones de los cruces */
SET TERM ^ ;

CREATE OR ALTER PROCEDURE CONTABIL_EGRESO(
    IDDOC INTEGER,
    IDINTER INTEGER)
RETURNS (
    ERROR INTEGER,
    VER CHAR(1),
    IDC INTEGER)
AS
declare variable PREF VARCHAR(4);
declare variable NUM VARCHAR(6);
declare variable FECAUX DATE;
declare variable FECHA CHAR(8);
declare variable CONC CHAR(120);
declare variable VRDTO NUMERIC(18, 2);
declare variable VRRTFTE NUMERIC(18, 2);
declare variable VRRTIVA NUMERIC(18, 2);
declare variable VRRTICA NUMERIC(18, 2);
declare variable VRTOTAL NUMERIC(18, 2);
declare variable TIPOCOMP VARCHAR(3);
declare variable PREFCONT VARCHAR(4);
declare variable BASE CHAR(1);
declare variable CTABASE VARCHAR(20);
declare variable CAJA CHAR(1);
declare variable CTACAJA VARCHAR(20);
declare variable RTFTE CHAR(1);
declare variable CTARTFTE VARCHAR(20);
declare variable RTIVA CHAR(1);
declare variable CTARTIVA VARCHAR(20);
declare variable RTICA CHAR(1);
declare variable CTARTICA VARCHAR(20);
declare variable DTO CHAR(1);
declare variable CTADTO VARCHAR(20);
declare variable EXISTE CHAR(1);
declare variable CUENTA VARCHAR(20);
declare variable MONTO NUMERIC(18,2);
declare variable ES_RETENCION CHAR(1);
declare variable TIPOCUEN CHAR(1);
declare variable NIT VARCHAR(20);
declare variable PROY VARCHAR(4);
declare variable CENTRO VARCHAR(4);
declare variable MONTOBASE NUMERIC(18,2);
declare variable PORC NUMERIC(9,2);
declare variable DEBITO NUMERIC(18,2);
declare variable CREDITO NUMERIC(18,2);
declare variable NROI INTEGER;
declare variable SUMA NUMERIC(18,2);
declare variable TCTACLIEN VARCHAR(20);
declare variable TCTARTFTE VARCHAR(20);
declare variable TCTARTIVA VARCHAR(20);
declare variable TCTARTICA VARCHAR(20);
declare variable TCTACART VARCHAR(20);
declare variable TIPOIT INTEGER;
declare variable PREFIT VARCHAR(4);
declare variable NUMIT VARCHAR(6);
declare variable NUMEROIT VARCHAR(10);
declare variable ABONOIT NUMERIC(18,2);
declare variable CTADIC VARCHAR(20);
declare variable BASEADIC VARCHAR(20);
declare variable PORCADIC NUMERIC(5,2);
declare variable VALORADIC NUMERIC(18,2);
declare variable DBADIC CHAR(1);
declare variable VRBASE NUMERIC(18,2);
declare variable GMF CHAR(1);
declare variable CODBCO INTEGER;
declare variable NUMCHEQ VARCHAR(20);
declare variable CRUCES NUMERIC(18,2);
declare variable VRCAJA NUMERIC(18,2);
declare variable OK INTEGER;
declare variable DIFCAMBIO NUMERIC(18,2);
declare variable CTADIF VARCHAR(20);
declare variable RTFTEC NUMERIC(18,2);
declare variable RTIVAC NUMERIC(18,2);
declare variable RTICAC NUMERIC(18,2);
declare variable RTFTER CHAR(1);
declare variable CTARTFTER VARCHAR(20);
declare variable RTIVAR CHAR(1);
declare variable CTARTIVAR VARCHAR(20);
declare variable RTICAR CHAR(1);
declare variable CTARTICAR VARCHAR(20);
BEGIN
/* BUSQUE LA INTERFACE */
EXISTE = 'N';
SELECT 'S', TICO_COD, PRCO_PRE, INCJ_BASE, INCJ_DTOPP, INCJ_RTFTE, INCJ_RTIVA, INCJ_RTICA, INCJ_CAJA, INCJ_CTABASE, INCJ_CTADTO, INCJ_CTARTFTE, INCJ_CTARTIVA, INCJ_CTARTICA, INCJ_CTACAJA, INCJ_CONFIRMAR
    FROM INTERFAZ_CAJA
    WHERE INCJ_ID = :IDINTER
    INTO :EXISTE, :TIPOCOMP, :PREFCONT, :BASE, :DTO, :RTFTE, :RTIVA, :RTICA, :CAJA, :CTABASE, :CTADTO, :CTARTFTE, :CTARTIVA, :CTARTICA, :CTACAJA, :VER;
if (EXISTE = 'S') then
    BEGIN
    OK = 0;
    FOR SELECT CNTB_ID FROM CONTABILIZACION WHERE CNTB_TIPOREF = 62 AND CNTB_IDREF = :IDDOC INTO :OK DO
        BEGIN
        DELETE FROM CONTABILIZACION_DET WHERE CNTB_ID = :OK;
        DELETE FROM CONTABILIZACION WHERE CNTB_ID = :OK;
        END

    /* TRAIGA EL ENCABEZADO DEL EGRESO */
    SELECT PREF_PRE, EGRE_NUMERO, EGRE_FECHA, E.TERC_NIT, EGRE_CONC, EGRE_DTOF, EGRE_MONTO, EGRE_RTFTEMONTO, EGRE_RTIVAMONTO, EGRE_RTICAMONTO, TERC_CTARTFTE, TERC_CTARTIVA, TERC_CTARTICA, TERC_CTACLIENTE
        FROM EGRESOS E, TERCEROS T
        WHERE EGRE_ID = :IDDOC AND E.TERC_NIT = T.TERC_NIT
        INTO :PREF, :NUM, :FECAUX, :NIT, :CONC, :VRDTO, :VRTOTAL, :VRRTFTE, :VRRTIVA, :VRRTICA, :TCTARTFTE, TCTARTIVA, TCTARTICA, TCTACLIEN;
    /* SI ES PROVEEDOR, SOBREESCIBE LAS CUENTAS  */
    SELECT PROV_CTAPAGAR, PROV_CTARTFTE, PROV_CTARTIVA, PROV_CTARTICA
        FROM PROVEEDORES WHERE TERC_NIT = :NIT
        INTO TCTACLIEN, TCTARTFTE, TCTARTIVA, TCTARTICA;
    SELECT PREF_CENTRO, PREF_PROY FROM PREFIJOS
        WHERE PREF_PRE = :PREF AND TIDO_COD = 62 INTO :CENTRO, :PROY;
    EXECUTE PROCEDURE FECHA_A_CONTA(:FECAUX) returning_values (:FECHA);
    /* REGISTRE EL ENCABEZADO CONTABLE */
    IDC = GEN_ID(ID_CONTABILIZA, 1);
    INSERT INTO CONTABILIZACION (CNTB_ID, CNTB_TIPOCOMP, CNTB_PREFCNT, CNTB_NUMERO, CNTB_FECHA, CNTB_CONCEPTO, CNTB_REF, CNTB_TIPOREF, CNTB_IDREF, CNTB_PREFREF, CNTB_NUMREF, CNTB_PROCESADO)
        VALUES (:IDC, :TIPOCOMP, :PREFCONT, :NUM, :FECHA, :CONC, '', 62, :IDDOC, :PREF, :NUM, 'N');
    /* SUME LOS CRUCES PARA LLEVARLOS A LA CUENTA X PAGAR Y RESTAR DE LA CAJA */
    SELECT SUM(EGCC_ABONO) FROM EGRESOS_CRUCEC WHERE EGRE_ID = :iddoc INTO :CRUCES;
    if (CRUCES IS NULL) then
        CRUCES = 0;
    VRCAJA = VRTOTAL - CRUCES;
    NROI = 0;
    SUMA = 0;
    ERROR = 0;
    /* EL CREDITO EN LA CAJA O EL BANCO */
    IF ((CAJA = 'K')) THEN
        BEGIN
        if (VRCAJA <> 0) then
            BEGIN
            CUENTA = NULL;
            EXECUTE PROCEDURE VALIDE_CUENTA_C (CTACAJA) RETURNING_VALUES (:OK);
            IF (OK = 0) THEN
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :CTACAJA INTO :CUENTA, :TIPOCUEN;
            ELSE
                begin
                EXECUTE PROCEDURE ERROR (62, :IDDOC, :CTACAJA, 2);
                CUENTA = CTACAJA;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 4);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRCAJA, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - VRCAJA;
                END
            END /* VRCAJA <> 0 */
        END /* CAJA CONSTANTE */
    IF ((CAJA = 'F')) THEN
        BEGIN
        /* mueva la cuenta de la caja o el banco o ambas */
        /* PRIMERO LA CAJA */
        FOR SELECT CAJA_CUENTA, EGCA_MONTO FROM EGRESOS_CAJA E, CAJAS C
            WHERE C.CAJA_ID = E.CAJA_ID AND EGRE_ID = :IDDOC
            INTO :CTACAJA, :MONTO
            DO
            BEGIN
            if (MONTO <> 0) then
                BEGIN
                CUENTA = NULL;
                EXECUTE PROCEDURE VALIDE_CUENTA_C (CTACAJA) RETURNING_VALUES (:OK);
                IF (OK = 0) THEN
                    SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                        WHERE CUEN_COD = :CTACAJA INTO :CUENTA, :TIPOCUEN;
                ELSE
                    begin
                    EXECUTE PROCEDURE ERROR (62, :IDDOC, :CTACAJA, 2);
                    CUENTA = CTACAJA;
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 4);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA - MONTO;
                    END
                END /* MONTO <> 0 */
            END /* DO CAJA */
        /* AHORA EL BANCO */
        MONTO = 0;
        SELECT CUBA_CTACONTA, EGBC_MONTO, EGBC_GMF, E.CUBA_COD, CUBA_GMFPOR, EGBC_NUMERO
            FROM EGRESOS_BANCO E, CUENTAS_BANCO C
            WHERE E.CUBA_COD = C.CUBA_COD AND EGRE_ID = :IDDOC
            INTO :CTACAJA, :MONTO, :GMF, :CODBCO, :PORC, :NUMCHEQ;
        if (MONTO <> 0) then
            BEGIN
            if (MONTO <> 0) then
                BEGIN
                CUENTA = NULL;
                EXECUTE PROCEDURE VALIDE_CUENTA_C (CTACAJA) RETURNING_VALUES (:OK);
                IF (OK = 0) THEN
                    SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                        WHERE CUEN_COD = :CTACAJA INTO :CUENTA, :TIPOCUEN;
                ELSE
                    begin
                    EXECUTE PROCEDURE ERROR (62, :IDDOC, :CTACAJA, 2);
                    CUENTA = CTACAJA;
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 4);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, :NUMCHEQ, 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA - MONTO;
                    END
                /* EL GMF */
                if ((GMF = 'S') AND (PORC <> 0)) then
                    BEGIN
                    EXECUTE procedure REDONDEE(:MONTO * :PORC / 1000, 0) returning_values (MONTO);
                    /* REGISTRE EL GMF EN LA MISMA CUENTA DEL BANCO COMO CREDITO */
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, :NUMCHEQ, 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA - MONTO;

                    /* AHORA LA CUENTA DEL GASTO */
                    SELECT CUBA_CTAGMF FROM CUENTAS_BANCO
                        where CUBA_COD = :CODBCO INTO :CTACAJA;
                    EXECUTE PROCEDURE VALIDE_CUENTA_C (CTACAJA) RETURNING_VALUES (:OK);
                    IF (OK = 0) THEN
                        SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                            WHERE CUEN_COD = :CTACAJA INTO :CUENTA, :TIPOCUEN;
                    ELSE
                        begin
                        EXECUTE PROCEDURE ERROR (62, :IDDOC, :CTACAJA, 2);
                        CUENTA = CTACAJA;
                        TIPOCUEN = 'N';
                        ERROR = ERROR + 1;
                        end
                    if (TIPOCUEN = 'I') then
                        BEGIN
                        EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
                        TIPOCUEN = 'N';
                        ERROR = ERROR + 1;
                        END
                    if (TIPOCUEN = 'C') then
                        BEGIN
                        EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 4);
                        TIPOCUEN = 'N';
                        ERROR = ERROR + 1;
                        END
                    if (TIPOCUEN = 'N') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, :NUMCHEQ, :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NROI = NROI + 1;
                        SUMA = SUMA + MONTO;
                        END
                    END /* GMF */
                END /* MONTO <> 0 */
            END /* EGRESO_BANCO */
        END /* CAJA = F */

    /* LOS CRUCES CON CUENTAS X COBRAR */
    if (CRUCES <> 0) then
        BEGIN
        SELECT TERC_CTACLIENTE FROM TERCEROS WHERE TERC_NIT = :nit INTO :tctacart;
        if (tctacart IS NULL) then
            tctacart = tctaclien;
        CUENTA = NULL;
        EXECUTE PROCEDURE VALIDE_CUENTA_C (tctacart) RETURNING_VALUES (:OK);
        IF (OK = 0) THEN
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :tctacart INTO :CUENTA, :TIPOCUEN;
        ELSE
            begin
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :tctacart, 2);
            CUENTA = tctacart;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            /* DEBERIA RECORRER DOCUMENTO POR DOCUMENTO */
            FOR SELECT EGCC_TIPODOC, EGCC_PREFIJO, EGCC_NUMERO, EGCC_ABONO+EGCC_RTFTE+EGCC_RTIVA+EGCC_RTICA+EGCC_DTOF
                FROM egresos_crucec WHERE EGRE_ID = :IDDOC
                INTO :TIPOIT, PREFIT, NUMIT, ABONOIT
                DO
                BEGIN
                NUMEROIT = PREFIT || NUMIT;
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :ABONOIT, 0, 0, :NIT, :PROY, :CENTRO, NULL, :NUMEROIT, NULL, NULL, :TIPOIT, 0);
                SUMA = SUMA - ABONOIT;
                NROI = NROI + 1;
                END
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :CRUCES, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            SUMA = SUMA - CRUCES;
            NROI = NROI + 1;
            END
        /* LA DIFERENCIA EN CAMBIO */
        SELECT SUM(EGCC_DIFCAMBIO) FROM egresos_crucec WHERE EGRE_ID = :iddoc INTO :DIFCAMBIO;
        IF ((DIFCAMBIO IS NOT NULL) AND (DIFCAMBIO <> 0)) THEN
            BEGIN
            if (DIFCAMBIO > 0) then
                execute procedure lee_configuracion('GENERAL','GENERAL','CUENTA DE INGRESO POR DIFERENCIA EN CAMBIO PARA OPERACIONES EN OTRA MONEDA') returning_values (:ctadif);
            else
                execute procedure lee_configuracion('GENERAL','GENERAL','CUENTA DE GASTO POR DIFERENCIA EN CAMBIO PARA OPERACIONES EN OTRA MONEDA') returning_values (:ctadif);
            CUENTA = NULL;
            EXECUTE PROCEDURE VALIDE_CUENTA_C (ctadif) RETURNING_VALUES (:OK);
            IF (OK = 0) THEN
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :ctadif INTO :CUENTA, :TIPOCUEN;
            ELSE
                begin
                EXECUTE PROCEDURE ERROR (62, :IDDOC, :ctadif, 2);
                CUENTA = ctadif;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 4);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                if (DIFCAMBIO > 0) then
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :difcambio, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                else
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', ABS(:difcambio), 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - difcambio;
                END
            END
        /* RETEFUENTE DEL CRUCE */
        SELECT first 1 INCJ_RTFTE, INCJ_RTIVA, INCJ_RTICA, INCJ_CTARTFTE, INCJ_CTARTIVA, INCJ_CTARTICA
            FROM INTERFAZ_CAJA WHERE tido_cod = 61 into :RTFTER, :RTIVAR, :RTICAR, :CTARTFTER, :CTARTIVAR, :CTARTICAR;
        SELECT SUM(EGCC_RTFTE) FROM egresos_crucec WHERE EGRE_ID = :iddoc INTO :rtftec;
        IF ((rtftec IS NOT NULL) AND (rtftec <> 0)) THEN
            BEGIN
            if ((RTFTER = 'T') or (RTFTER = 'K')) then
                BEGIN
                if (RTFTER = 'T') then
                    SELECT TERC_CTARTFTE FROM TERCEROS WHERE TERC_NIT = :NIT INTO CTARTFTER;
                CUENTA = NULL;
                EXECUTE PROCEDURE VALIDE_CUENTA_C (ctartfter) RETURNING_VALUES (:OK);
                IF (OK = 0) THEN
                    SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                        WHERE CUEN_COD = :ctartfter INTO :CUENTA, :TIPOCUEN;
                ELSE
                    begin
                    EXECUTE PROCEDURE ERROR (62, :IDDOC, :ctartfter, 2);
                    CUENTA = ctartfter;
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 4);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :rtftec, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA + rtftec;
                    END
                END
            END
        /* RETEIVA DEL CRUCE */
        SELECT SUM(EGCC_RTIVA) FROM egresos_crucec WHERE EGRE_ID = :iddoc INTO :rtivac;
        IF ((rtivac IS NOT NULL) AND (rtivac <> 0)) THEN
            BEGIN
            if ((RTIVAR = 'T') or (RTIVAR = 'K')) then
                BEGIN
                if (RTIVAR = 'T') then
                    SELECT TERC_CTARTIVA FROM TERCEROS WHERE TERC_NIT = :NIT INTO CTARTIVAR;
                CUENTA = NULL;
                EXECUTE PROCEDURE VALIDE_CUENTA_C (ctartivar) RETURNING_VALUES (:OK);
                IF (OK = 0) THEN
                    SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                        WHERE CUEN_COD = :ctartivar INTO :CUENTA, :TIPOCUEN;
                ELSE
                    begin
                    EXECUTE PROCEDURE ERROR (62, :IDDOC, :ctartivar, 2);
                    CUENTA = ctartivar;
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 4);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :rtivac, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA + rtivac;
                    END
                END
            END
        /* RETEICA DEL CRUCE */
        SELECT SUM(EGCC_RTICA) FROM egresos_crucec WHERE EGRE_ID = :iddoc INTO :rticac;
        IF ((rticac IS NOT NULL) AND (rtivac <> 0)) THEN
            BEGIN
            if ((RTICAR = 'T') or (RTICAR = 'K')) then
                BEGIN
                if (RTICAR = 'T') then
                    SELECT TERC_CTARTICA FROM TERCEROS WHERE TERC_NIT = :NIT INTO CTARTICAR;
                CUENTA = NULL;
                EXECUTE PROCEDURE VALIDE_CUENTA_C (ctarticar) RETURNING_VALUES (:OK);
                IF (OK = 0) THEN
                    SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                        WHERE CUEN_COD = :ctarticar INTO :CUENTA, :TIPOCUEN;
                ELSE
                    begin
                    EXECUTE PROCEDURE ERROR (62, :IDDOC, :ctarticar, 2);
                    CUENTA = ctarticar;
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 4);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :rticac, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA + rticac;
                    END
                END
            END
        END /* cruces */

    if (DTO = 'K') then /* DTO EN CTA CONSTANTE */
        BEGIN
        if (VRDTO <> 0) then
            BEGIN
            CUENTA = NULL;
            EXECUTE PROCEDURE VALIDE_CUENTA_C (CTADTO) RETURNING_VALUES (:OK);
            IF (OK = 0) THEN
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :CTADTO INTO :CUENTA, :TIPOCUEN;
            ELSE
                begin
                EXECUTE PROCEDURE ERROR (62, :IDDOC, :CTADTO, 2);
                CUENTA = CTADTO;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 4);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRDTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - VRDTO;
                END
            END /* VRDTO <> 0 */
        END /* DTO EN CTA CONSTANTE */

    /* LA DIFERENCIA EN CAMBIO */
    SELECT SUM(EGDE_DIFCAMBIO) FROM egresos_detalle WHERE EGRE_ID = :iddoc INTO :DIFCAMBIO;
    IF ((DIFCAMBIO IS NOT NULL) AND (DIFCAMBIO <> 0)) THEN
        BEGIN
        if (DIFCAMBIO > 0) then
            execute procedure lee_configuracion('GENERAL','GENERAL','CUENTA DE GASTO POR DIFERENCIA EN CAMBIO PARA OPERACIONES EN OTRA MONEDA') returning_values (:ctadif);
        else
            execute procedure lee_configuracion('GENERAL','GENERAL','CUENTA DE INGRESO POR DIFERENCIA EN CAMBIO PARA OPERACIONES EN OTRA MONEDA') returning_values (:ctadif);
        CUENTA = NULL;
        EXECUTE PROCEDURE VALIDE_CUENTA_C (ctadif) RETURNING_VALUES (:OK);
        IF (OK = 0) THEN
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :ctadif INTO :CUENTA, :TIPOCUEN;
        ELSE
            begin
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :ctadif, 2);
            CUENTA = ctadif;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 4);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            if (DIFCAMBIO > 0) then
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :difcambio, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            else
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, ABS(:difcambio), 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA + difcambio;
            END
        END
    /* RETENCION FUENTE */
    if ((RTFTE = 'T') or (RTFTE = 'K')) then
      if (VRRTFTE <> 0) then
        BEGIN
        if (RTFTE = 'T') then
            CTARTFTE = TCTARTFTE;
        CUENTA = NULL;
        EXECUTE PROCEDURE VALIDE_CUENTA_C (CTARTFTE) RETURNING_VALUES (:OK);
        IF (OK = 0) THEN
            SELECT CUEN_COD, CUEN_RETENCION, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTARTFTE INTO :CUENTA, :ES_RETENCION, :TIPOCUEN;
        ELSE
            begin
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :CTARTFTE, 2);
            CUENTA = CTARTFTE;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 4);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            if (ES_RETENCION = 'S') then
                BEGIN
                VRBASE = VRTOTAL;
                SELECT PROV_RETEFTE from proveedores where terc_nit = :NIT INTO :PORC;
                END
            ELSE
                BEGIN
                VRBASE = 0;
                PORC = 0;
                END
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, :VRBASE, :PORC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA - VRRTFTE;
            END
        END /* RTFTE */
    /* RETENCION IVA */
    if ((RTIVA = 'T') or (RTIVA = 'K')) then
      if (VRRTIVA <> 0) then
        BEGIN
        if (RTIVA = 'T') then
            CTARTIVA = TCTARTIVA;
        CUENTA = NULL;
        EXECUTE PROCEDURE VALIDE_CUENTA_C (CTARTIVA) RETURNING_VALUES (:OK);
        IF (OK = 0) THEN
            SELECT CUEN_COD, CUEN_RETENCION, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTARTIVA INTO :CUENTA, :ES_RETENCION, :TIPOCUEN;
        ELSE
            begin
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :CTARTIVA, 2);
            CUENTA = CTARTIVA;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 4);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            if (ES_RETENCION = 'S') then
                BEGIN
                VRBASE = VRTOTAL;
                SELECT PROV_RTEIVA from proveedores where terc_nit = :NIT INTO :PORC;
                END
            ELSE
                BEGIN
                VRBASE = 0;
                PORC = 0;
                END
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTIVA, :VRBASE, :PORC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA - VRRTIVA;
            END
        END /* RTIVA */
    /* RETENCION DE ICA */
    if ((RTICA = 'T') or (RTICA = 'K')) then
      if (VRRTICA <> 0) then
        BEGIN
        if (RTICA = 'T') then
            CTARTICA = TCTARTICA;
        CUENTA = NULL;
        EXECUTE PROCEDURE VALIDE_CUENTA_C (CTARTICA) RETURNING_VALUES (:OK);
        IF (OK = 0) THEN
            SELECT CUEN_COD, CUEN_RETENCION, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTARTICA INTO :CUENTA, :ES_RETENCION, :TIPOCUEN;
        ELSE
            begin
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :CTARTICA, 2);
            CUENTA = CTARTICA;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 4);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            if (ES_RETENCION = 'S') then
                BEGIN
                VRBASE = VRTOTAL;
                SELECT PROV_RTEICA from proveedores where terc_nit = :NIT INTO :PORC;
                END
            ELSE
                BEGIN
                VRBASE = 0;
                PORC = 0;
                END
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTICA, :VRBASE, :PORC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA - VRRTICA;
            END
        END /* RTICA */
    /* RECORRA LAS CUENTAS DE EGRESOS_CONTABILIDAD */
    FOR SELECT CUEN_COD, EGCO_NIT, EGCO_PROY, EGCO_CENTRO, EGCO_CONC, EGCO_DEBITOS, EGCO_CREDITOS, EGCO_BASEM, EGCO_PORC
        FROM EGRESOS_CONTABILIDAD WHERE EGRE_ID = :IDDOC ORDER BY EGCO_ITEM
        INTO :CTABASE, :NIT, :PROY, :CENTRO, :CONC, :DEBITO, :CREDITO, :MONTOBASE, :PORC
        DO
        BEGIN
        CUENTA = NULL;
        EXECUTE PROCEDURE VALIDE_CUENTA_C (CTABASE) RETURNING_VALUES (:OK);
        IF (OK = 0) THEN
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTABASE INTO :CUENTA, :TIPOCUEN;
        ELSE
            begin
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :CTABASE, 2);
            CUENTA = CTABASE;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 4);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'N') then
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :DEBITO, :CREDITO, :MONTOBASE, :PORC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
        SUMA = SUMA + DEBITO - CREDITO;
        NROI = NROI + 1;
        END
    /* CIERRE EL COMPROBANTE CONTRA LA CUENTA DEL TERCERO O LA BASE CONSTANTE */
    if (SUMA <> 0) THEN
        BEGIN
        if (SUMA < 0) then
            BEGIN
            DEBITO = SUMA * -1;
            CREDITO = 0;
            END
        ELSE
            BEGIN
            DEBITO = 0;
            CREDITO = SUMA;
            END
        if ((BASE = 'F') or (BASE = 'T') or (BASE = 'K')) then
            BEGIN
            if (BASE = 'T') then
                CTABASE = TCTACLIEN;
            if (BASE = 'F') then
                BEGIN
                SELECT CAJA_CUENTA FROM EGRESOS E, CAJAS C
                    WHERE C.CAJA_ID = E.CAJA_ID AND EGRE_ID = :IDDOC INTO :CTABASE;
                END
            CUENTA = NULL;
            EXECUTE PROCEDURE VALIDE_CUENTA_C (CTABASE) RETURNING_VALUES (:OK);
            IF (OK = 0) THEN
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :CTABASE INTO :CUENTA, :TIPOCUEN;
            ELSE
                begin
                EXECUTE PROCEDURE ERROR (62, :IDDOC, :CTABASE, 2);
                CUENTA = CTABASE;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                /* DEBERIA RECORRER DOCUMENTO POR DOCUMENTO */
                FOR SELECT RCDE_TIPODOC, RCDE_PREFIJO, RCDE_NUMERO, RCDE_ABONO+RCDE_RTFTE+RCDE_RTIVA+RCDE_RTICA+RCDE_DTOF
                    FROM RECIBOS_CAJA_DETALLE WHERE RECA_ID = :IDDOC
                    INTO :TIPOIT, PREFIT, NUMIT, ABONOIT
                    DO
                    BEGIN
                    NUMEROIT = PREFIT || NUMIT;
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :ABONOIT, 0, 0, :NIT, :PROY, :CENTRO, NULL, :NUMEROIT, NULL, NULL, :TIPOIT, 0);
                    NROI = NROI + 1;
                    END
                END
            if (TIPOCUEN = 'N') then
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :DEBITO, :CREDITO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            END /* SUMA EN CARTERA */
        if (BASE = 'D') then
            BEGIN
            CTABASE = NULL;
            FOR SELECT EGDE_TIPODOC, EGDE_PREFIJO, EGDE_NUMERO, CUEN_COD, CODE_DEBITO-CODE_CREDITO, PROY_COD, CENT_COD
                FROM EGRESOS_DETALLE ED, COMPROBANTE_ENCABEZADO E, COMPROBANTE_DETALLE D
                WHERE E.enco_consec = D.enco_consec AND E.enco_tiporef = ED.egde_tipodoc AND E.enco_idref = ED.egde_iddoc AND SUBSTR(CUEN_COD,1,1) = '2' AND
                SUBSTR(CUEN_COD,1,3) <> '236' AND SUBSTR(CUEN_COD,1,4) <> '2408' AND EGRE_ID = :IDDOC
                INTO :tipoit, :PREFIT, :NUMIT, :ctabase, :suma, :proy, :centro
                DO
                BEGIN
                CUENTA = NULL;
                EXECUTE PROCEDURE VALIDE_CUENTA_C (ctabase) RETURNING_VALUES (:OK);
                IF (OK = 0) THEN
                    SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                        WHERE CUEN_COD = :CTABASE INTO :CUENTA, :TIPOCUEN;
                ELSE
                    begin
                    EXECUTE PROCEDURE ERROR (62, :IDDOC, :CTABASE, 2);
                    CUENTA = CTABASE;
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    end
                if (SUMA < 0) then
                    BEGIN
                    DEBITO = SUMA * -1;
                    CREDITO = 0;
                    END
                ELSE
                    BEGIN
                    DEBITO = 0;
                    CREDITO = SUMA;
                    END
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    /* DEBERIA RECORRER DOCUMENTO POR DOCUMENTO */
                    NUMEROIT = PREFIT || NUMIT;
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :debito, :credito, 0, 0, :NIT, :PROY, :CENTRO, NULL, :NUMEROIT, NULL, NULL, :TIPOIT, 0);
                    END
                if (TIPOCUEN = 'N') then
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :DEBITO, :CREDITO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                END /* SUMA EN CARTERA */
            END
        END
    /* recorra las cuentas adicionales */
    FOR SELECT INJC_CUENTA, INJC_BASE, INJC_PORC, INJC_VALOR, INJC_DB
        FROM INTERFAZ_CAJA_CTAS
        WHERE INCJ_ID = :IDINTER
        INTO :CTADIC, :BASEADIC, :PORCADIC, :VALORADIC, :DBADIC
        DO
        BEGIN
        if (:BASEADIC = 'TOTAL') then
            VALORADIC = VRTOTAL;
        if (:BASEADIC = 'DESCUENTO') then
            VALORADIC = VRDTO;
        if (:BASEADIC = 'RTFTE') then
            VALORADIC = VRRTFTE;
        if (:BASEADIC = 'RTIVA') then
            VALORADIC = VRRTIVA;
        if (:BASEADIC = 'RTICA') then
            VALORADIC = VRRTICA;
        MONTO = VALORADIC * PORCADIC;
        CUENTA = NULL;
        EXECUTE PROCEDURE VALIDE_CUENTA_C (CTADIC) RETURNING_VALUES (:OK);
        IF (OK = 0) THEN
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTADIC INTO :CUENTA, :TIPOCUEN;
        ELSE
            begin
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :CTADIC, 2);
            CUENTA = CTADIC;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 4);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            if (DBADIC = 'S') then
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTADIC, :CONC, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            ELSE
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTADIC, :CONC, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            END
        NROI = NROI + 1;
        END
    if (ERROR > 0) then
        VER = 'S';
    SUSPEND;
    END /* EXISTE LA INTERFAZ */
  ELSE
    BEGIN
    EXECUTE PROCEDURE ERROR (62, :IDDOC, :PREF, 1);
    ERROR = ERROR + 1;
    VER = 'S';
    SUSPEND;
    END
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE EGRESOS_SIN_CONTABILIDAD(
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    ID INTEGER,
    IDI INTEGER,
    IDC INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    ESTADO VARCHAR(20),
    ERROR INTEGER)
AS
DECLARE VARIABLE VER CHAR(2);
declare variable FECICNT VARCHAR(10);
declare variable FECFCNT VARCHAR(10);
declare variable idref INTEGER;
BEGIN /*$$IBE$$ 
EXECUTE PROCEDURE fecha_a_conta(FECINI) returning_values (FECICNT);
EXECUTE PROCEDURE fecha_a_conta(FECFIN) returning_values (FECFCNT);
FOR SELECT EGRE_ID, PREF_PRE, egre_numero FROM EGRESOS WHERE EGRE_ANULADO = 'N' AND PREF_PRE <> 'R004' AND
    EGRE_FECHA >= :FECINI AND EGRE_FECHA <= :FECFIN ORDER BY EGRE_ID INTO :ID, :PREF, :NUMERO
DO
  BEGIN
  idref = null;
  SELECT ENCO_IDREF FROM COMPROBANTE_ENCABEZADO WHERE ENCO_TIPOREF = 62 AND ENCO_FECHA >= :FECICNT AND ENCO_FECHA <= :FECFCNT and ENCO_IDREF = :ID into :idref;
  if (idref IS NULL) then
  begin
   ESTADO = 'PROCESANDO';
   SUSPEND;
   SELECT MAX(INCJ_ID) FROM INTERFAZ_CAJA WHERE PREF_PRE = :PREF AND TIDO_COD = 62 INTO :IDI;
   EXECUTE PROCEDURE CONTABIL_EGRESO (:ID, :IDI) RETURNING_VALUES (:ERROR, :VER, :IDC);
   IF (ERROR = 0) THEN
      BEGIN
      EXECUTE PROCEDURE CONTABILIZA_PENDIENTE (:IDC);
      ESTADO = 'OK';
      END
   ELSE
    ESTADO = 'ERROR';
   suspend;
  end
  END
 $$IBE$$*/ SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE EGRESOS_SIN_CONTABILIDAD(
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    ID INTEGER,
    IDI INTEGER,
    IDC INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    ESTADO VARCHAR(20),
    ERROR INTEGER)
AS
DECLARE VARIABLE VER CHAR(2);
declare variable FECICNT VARCHAR(10);
declare variable FECFCNT VARCHAR(10);
declare variable idref INTEGER;
BEGIN
EXECUTE PROCEDURE fecha_a_conta(FECINI) returning_values (FECICNT);
EXECUTE PROCEDURE fecha_a_conta(FECFIN) returning_values (FECFCNT);
FOR SELECT EGRE_ID, PREF_PRE, egre_numero FROM EGRESOS WHERE EGRE_ANULADO = 'N' AND PREF_PRE <> 'R004' AND
    EGRE_FECHA >= :FECINI AND EGRE_FECHA <= :FECFIN ORDER BY EGRE_ID INTO :ID, :PREF, :NUMERO
DO
  BEGIN
  idref = null;
  SELECT ENCO_IDREF FROM COMPROBANTE_ENCABEZADO WHERE ENCO_TIPOREF = 62 AND ENCO_FECHA >= :FECICNT AND ENCO_FECHA <= :FECFCNT and ENCO_IDREF = :ID into :idref;
  if (idref IS NULL) then
  begin
   ESTADO = 'PROCESANDO';
   SUSPEND;
   SELECT MAX(INCJ_ID) FROM INTERFAZ_CAJA WHERE PREF_PRE = :PREF AND TIDO_COD = 62 INTO :IDI;
   EXECUTE PROCEDURE CONTABIL_EGRESO (:ID, :IDI) RETURNING_VALUES (:ERROR, :VER, :IDC);
   IF (ERROR = 0) THEN
      BEGIN
      EXECUTE PROCEDURE CONTABILIZA_PENDIENTE (:IDC);
      ESTADO = 'OK';
      END
   ELSE
    ESTADO = 'ERROR';
   suspend;
  end
  END
END

^

SET TERM ; ^


SET TERM ^ ;

CREATE OR ALTER PROCEDURE CONTABIL_RECICAJA(
    IDDOC INTEGER,
    IDINTER INTEGER)
RETURNS (
    ERROR INTEGER,
    VER CHAR(1),
    IDC INTEGER)
AS
declare variable PREF VARCHAR(4);
declare variable NUM VARCHAR(6);
declare variable FECAUX DATE;
declare variable FECHA CHAR(8);
declare variable CONC CHAR(120);
declare variable VRDTO NUMERIC(18, 2);
declare variable VRRTFTE NUMERIC(18, 2);
declare variable VRRTIVA NUMERIC(18, 2);
declare variable VRRTICA NUMERIC(18, 2);
declare variable VRTOTAL NUMERIC(18, 2);
declare variable TIPOCOMP VARCHAR(3);
declare variable PREFCONT VARCHAR(4);
declare variable BASE CHAR(1);
declare variable CTABASE VARCHAR(20);
declare variable CAJA CHAR(1);
declare variable CTACAJA VARCHAR(20);
declare variable RTFTE CHAR(1);
declare variable CTARTFTE VARCHAR(20);
declare variable RTIVA CHAR(1);
declare variable CTARTIVA VARCHAR(20);
declare variable RTICA CHAR(1);
declare variable CTARTICA VARCHAR(20);
declare variable DTO CHAR(1);
declare variable CTADTO VARCHAR(20);
declare variable EXISTE CHAR(1);
declare variable CUENTA VARCHAR(20);
declare variable MONTO NUMERIC(18,2);
declare variable ES_RETENCION CHAR(1);
declare variable TIPOCUEN CHAR(1);
declare variable NIT VARCHAR(20);
declare variable PROY VARCHAR(4);
declare variable CENTRO VARCHAR(4);
declare variable DEBITO NUMERIC(18,2);
declare variable CREDITO NUMERIC(18,2);
declare variable NROI INTEGER;
declare variable SUMA NUMERIC(18,2);
declare variable TCTACLIEN VARCHAR(20);
declare variable TCTARTFTE VARCHAR(20);
declare variable TCTARTIVA VARCHAR(20);
declare variable TCTARTICA VARCHAR(20);
declare variable TIPOIT INTEGER;
declare variable PREFIT VARCHAR(4);
declare variable NUMIT VARCHAR(6);
declare variable NUMEROIT VARCHAR(10);
declare variable ABONOIT NUMERIC(18,2);
declare variable CTADIC VARCHAR(20);
declare variable BASEADIC VARCHAR(20);
declare variable PORCADIC NUMERIC(5,2);
declare variable VALORADIC NUMERIC(18,2);
declare variable DBADIC CHAR(1);
declare variable ANULADO CHAR(1);
declare variable VRBASE NUMERIC(18,2);
declare variable PORC numeric(9,2);
declare variable OK INTEGER;
declare variable CRUCES NUMERIC(18,2);
declare variable VRCAJA NUMERIC(18,2);
declare variable DIFCAMBIO NUMERIC(18,2);
declare variable CTADIF VARCHAR(20);
declare variable PROVID INTEGER;
declare variable RTFTEC NUMERIC(18,2);
declare variable RTIVAC NUMERIC(18,2);
declare variable RTICAC NUMERIC(18,2);
declare variable RTFTER CHAR(1);
declare variable CTARTFTER VARCHAR(20);
declare variable RTIVAR CHAR(1);
declare variable CTARTIVAR VARCHAR(20);
declare variable RTICAR CHAR(1);
declare variable CTARTICAR VARCHAR(20);
BEGIN
ERROR = 0;
/* BUSQUE LA INTERFACE */
EXISTE = 'N';
SELECT 'S', TICO_COD, PRCO_PRE, INCJ_BASE, INCJ_DTOPP, INCJ_RTFTE, INCJ_RTIVA, INCJ_RTICA, INCJ_CAJA, INCJ_CTABASE, INCJ_CTADTO, INCJ_CTARTFTE, INCJ_CTARTIVA, INCJ_CTARTICA, INCJ_CTACAJA, INCJ_CONFIRMAR
    FROM INTERFAZ_CAJA
    WHERE INCJ_ID = :IDINTER
    INTO :EXISTE, :TIPOCOMP, :PREFCONT, :BASE, :DTO, :RTFTE, :RTIVA, :RTICA, :CAJA, :CTABASE, :CTADTO, :CTARTFTE, :CTARTIVA, :CTARTICA, :CTACAJA, :VER;
if (EXISTE = 'S') then
  BEGIN
  /* BORRE LA CONTABILIZACION ANTERIOR */
  OK = 0;
  FOR SELECT CNTB_ID FROM CONTABILIZACION WHERE CNTB_TIPOREF = 61 AND CNTB_IDREF = :IDDOC INTO :OK DO
    BEGIN
    DELETE FROM CONTABILIZACION_DET WHERE CNTB_ID = :OK;
    DELETE FROM CONTABILIZACION WHERE CNTB_ID = :OK;
    END
  /* TRAIGA EL ENCABEZADO DEL RECIBO */
  SELECT PREF_PRE, RECA_NUMERO, RECA_FECHA, R.TERC_NIT, RECA_CONC, RECA_DTOF, RECA_MONTO, RECA_RTFTEMONTO, RECA_RTIVAMONTO, RECA_RTICAMONTO, TERC_CTARTFTE, TERC_CTARTIVA, TERC_CTARTICA, TERC_CTACLIENTE, RECA_ANULADO, RECA_PROVID
    FROM RECIBOS_CAJA R, TERCEROS T
    WHERE RECA_ID = :IDDOC AND R.TERC_NIT = T.TERC_NIT
    INTO :PREF, :NUM, :FECAUX, :NIT, :CONC, :VRDTO, :VRTOTAL, :VRRTFTE, :VRRTIVA, :VRRTICA, :TCTARTFTE, TCTARTIVA, TCTARTICA, TCTACLIEN, :ANULADO, :PROVID;
  if (ANULADO = 'N') then
    BEGIN
    SELECT PREF_CENTRO, PREF_PROY FROM PREFIJOS
        WHERE PREF_PRE = :PREF AND TIDO_COD = 61 INTO :CENTRO, :PROY;
    EXECUTE PROCEDURE FECHA_A_CONTA(:FECAUX) returning_values (:FECHA);
    /* REGISTRE EL ENCABEZADO CONTABLE */
    IDC = GEN_ID(ID_CONTABILIZA, 1);
    INSERT INTO CONTABILIZACION (CNTB_ID, CNTB_TIPOCOMP, CNTB_PREFCNT, CNTB_NUMERO, CNTB_FECHA, CNTB_CONCEPTO, CNTB_REF, CNTB_TIPOREF, CNTB_IDREF, CNTB_PREFREF, CNTB_NUMREF, CNTB_PROCESADO)
        VALUES (:IDC, :TIPOCOMP, :PREFCONT, :NUM, :FECHA, :CONC, '', 61, :IDDOC, :PREF, :NUM, 'N');
    NROI = 0;
    SUMA = 0;
    /* SUME LOS CRUCES PARA LLEVARLOS A LA CUENTA X PAGAR Y RESTAR DE LA CAJA */
    SELECT SUM(RCCR_ABONO) FROM RECIBOS_CAJA_CRUCEC WHERE RECA_ID = :iddoc INTO :CRUCES;
    if (CRUCES IS NULL) then
        CRUCES = 0;
    VRCAJA = VRTOTAL - CRUCES;
    IF ((CAJA = 'K')) THEN
        BEGIN
        if (VRCAJA <> 0) then
            BEGIN
            CUENTA = NULL;
            EXECUTE PROCEDURE VALIDE_CUENTA_C (CTACAJA) RETURNING_VALUES (:OK);
            IF (OK = 0) THEN
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :CTACAJA INTO :CUENTA, :TIPOCUEN;
            ELSE
                begin
                EXECUTE PROCEDURE ERROR (61, :IDDOC, :CTACAJA, 2);
                CUENTA = CTACAJA;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERROR (61, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                EXECUTE PROCEDURE ERROR (61, :IDDOC, :CUENTA, 4);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                IF (VRCAJA > 0) THEN
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRCAJA, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    SUMA = SUMA + VRCAJA;
                    END
                ELSE   
                    BEGIN                     
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                       VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, ABS(:VRCAJA), 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    SUMA = SUMA + VRCAJA;
                    END
                NROI = NROI + 1;
                END
            END /* VRCAJA <> 0 */
        END /* CAJA CONSTANTE */
    IF ((CAJA = 'F')) THEN
        BEGIN
        /* AGRUPE LAS CUENTAS DE LAS FORMAS DE PAGO */
        FOR SELECT MAX(FOPA_CTACONTA), SUM(RCPA_MONTO)
            FROM formas_pago F, recibos_caja_pago R
            WHERE R.RECA_ID = :IDDOC AND R.FOPA_ID = F.FOPA_ID
            GROUP BY FOPA_CTACONTA
            INTO :CTACAJA, :MONTO
        DO
            BEGIN
            if (MONTO <> 0) then
                BEGIN
                CUENTA = NULL;
                EXECUTE PROCEDURE VALIDE_CUENTA_C (CTACAJA) RETURNING_VALUES (:OK);
                IF (OK = 0) THEN
                    SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                        WHERE CUEN_COD = :CTACAJA INTO :CUENTA, :TIPOCUEN;
                ELSE
                    begin
                    EXECUTE PROCEDURE ERROR (61, :IDDOC, :CTACAJA, 2);
                    CUENTA = CTACAJA;
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (61, :IDDOC, :CUENTA, 3);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (61, :IDDOC, :CUENTA, 4);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    IF (MONTO > 0) THEN
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        SUMA = SUMA + MONTO;
                        END
                    ELSE
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, abs(:MONTO), 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        SUMA = SUMA + MONTO;
                        END
                    NROI = NROI + 1;
                    END
                END /* MONTO <> 0 */
            END /* DO FORMA_PAGO */
        END /* CAJA = F */
    if (DTO = 'K') then /* DTO EN CTA CONSTANTE */
        BEGIN
        if (VRDTO <> 0) then
            BEGIN
            CUENTA = NULL;
            EXECUTE PROCEDURE VALIDE_CUENTA_C (CTADTO) RETURNING_VALUES (:OK);
            IF (OK = 0) THEN
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :CTADTO INTO :CUENTA, :TIPOCUEN;
            ELSE
                begin
                EXECUTE PROCEDURE ERROR (61, :IDDOC, :CTADTO, 2);
                CUENTA = CTADTO;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERROR (61, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                EXECUTE PROCEDURE ERROR (61, :IDDOC, :CUENTA, 4);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRDTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA + VRDTO;
                END
            END /* VRDTO <> 0 */
        END /* DTO EN CTA CONSTANTE */

    /* LA DIFERENCIA EN CAMBIO */
    SELECT SUM(RCDE_DIFCAMBIO) FROM recibos_caja_detalle WHERE RECA_ID = :iddoc INTO :DIFCAMBIO;
    IF ((DIFCAMBIO IS NOT NULL) AND (DIFCAMBIO <> 0)) THEN
        BEGIN
        if (DIFCAMBIO > 0) then
            execute procedure lee_configuracion('GENERAL','GENERAL','CUENTA DE INGRESO POR DIFERENCIA EN CAMBIO PARA OPERACIONES EN OTRA MONEDA') returning_values (:ctadif);
        else
            execute procedure lee_configuracion('GENERAL','GENERAL','CUENTA DE GASTO POR DIFERENCIA EN CAMBIO PARA OPERACIONES EN OTRA MONEDA') returning_values (:ctadif);
        CUENTA = NULL;
        EXECUTE PROCEDURE VALIDE_CUENTA_C (ctadif) RETURNING_VALUES (:OK);
        IF (OK = 0) THEN
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :ctadif INTO :CUENTA, :TIPOCUEN;
        ELSE
            begin
            EXECUTE PROCEDURE ERROR (61, :IDDOC, :ctadif, 2);
            CUENTA = ctadif;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERROR (61, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERROR (61, :IDDOC, :CUENTA, 4);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            if (DIFCAMBIO > 0) then
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :difcambio, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            else
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', ABS(:difcambio), 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA - difcambio;
            END
        END
    /* RETENCION FUENTE */
    if ((RTFTE = 'T') or (RTFTE = 'K')) then
      if (VRRTFTE <> 0) then
        BEGIN
        if (RTFTE = 'T') then
            CTARTFTE = TCTARTFTE;
        CUENTA = NULL;
        EXECUTE PROCEDURE VALIDE_CUENTA_C (CTARTFTE) RETURNING_VALUES (:OK);
        IF (OK = 0) THEN
            SELECT CUEN_COD, CUEN_RETENCION, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTARTFTE INTO :CUENTA, :ES_RETENCION, :TIPOCUEN;
        ELSE
            begin
            EXECUTE PROCEDURE ERROR (61, :IDDOC, :CTARTFTE, 2);
            CUENTA = CTARTFTE;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERROR (61, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERROR (61, :IDDOC, :CUENTA, 4);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            if (ES_RETENCION = 'S') then
                BEGIN
                VRBASE = VRTOTAL + VRDTO + vrrtfte + vrrtiva + vrrtica;
                SELECT CLIE_rtefte from clientes where terc_nit = :NIT INTO :PORC;
                END
            ELSE
                BEGIN
                VRBASE = 0;
                PORC = 0;
                END
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :VRBASE, :PORC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTFTE;
            END
        END /* RTFTE */
    /* RETENCION IVA */
    if ((RTIVA = 'T') or (RTIVA = 'K')) then
      if (VRRTIVA <> 0) then
        BEGIN
        if (RTIVA = 'T') then
            CTARTIVA = TCTARTIVA;
        CUENTA = NULL;
        EXECUTE PROCEDURE VALIDE_CUENTA_C (CTARTIVA) RETURNING_VALUES (:OK);
        IF (OK = 0) THEN
            SELECT CUEN_COD, CUEN_RETENCION, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTARTIVA INTO :CUENTA, :ES_RETENCION, :TIPOCUEN;
        ELSE
            begin
            EXECUTE PROCEDURE ERROR (61, :IDDOC, :CTARTIVA, 2);
            CUENTA = CTARTIVA;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERROR (61, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERROR (61, :IDDOC, :CUENTA, 4);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            if (ES_RETENCION = 'S') then
                BEGIN
                VRBASE = VRTOTAL + VRDTO + vrrtfte + vrrtiva + vrrtica;
                SELECT CLIE_RTEIVA from clientes where terc_nit = :NIT INTO :PORC;
                END
            ELSE
                BEGIN
                VRBASE = 0;
                PORC = 0;
                END
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTIVA, 0, :VRBASE, :PORC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTIVA;
            END
        END /* RTIVA */
    /* RETENCION DE ICA */
    if ((RTICA = 'T') or (RTICA = 'K')) then
      if (VRRTICA <> 0) then
        BEGIN
        if (RTICA = 'T') then
            CTARTICA = TCTARTICA;
        CUENTA = NULL;
        EXECUTE PROCEDURE VALIDE_CUENTA_C (CTARTICA) RETURNING_VALUES (:OK);
        IF (OK = 0) THEN
            SELECT CUEN_COD, CUEN_RETENCION, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTARTICA INTO :CUENTA, :ES_RETENCION, :TIPOCUEN;
        ELSE
            begin
            EXECUTE PROCEDURE ERROR (61, :IDDOC, :CTARTICA, 2);
            CUENTA = CTARTICA;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERROR (61, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERROR (61, :IDDOC, :CUENTA, 4);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            if (ES_RETENCION = 'S') then
                BEGIN
                VRBASE = VRTOTAL + VRDTO + vrrtfte + vrrtiva + vrrtica;
                SELECT CLIE_RTEICA from clientes where terc_nit = :NIT INTO :PORC;
                END
            ELSE
                BEGIN
                VRBASE = 0;
                PORC = 0;
                END
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTICA, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTICA;
            END
        END /* RTICA */
    /* CRUCES CON CXP */
    if (CRUCES <> 0) then
        BEGIN
        SELECT PROV_CTAPAGAR FROM PROVEEDORES WHERE TERC_NIT = :nit INTO :ctabase;
        if (CTABASE IS NULL) then
            ctabase = tctaclien;
        CUENTA = NULL;
        EXECUTE PROCEDURE VALIDE_CUENTA_C (CTABASE) RETURNING_VALUES (:OK);
        IF (OK = 0) THEN
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTABASE INTO :CUENTA, :TIPOCUEN;
        ELSE
            begin
            EXECUTE PROCEDURE ERROR (61, :IDDOC, :CTABASE, 2);
            CUENTA = CTABASE;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERROR (61, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            /* DEBERIA RECORRER DOCUMENTO POR DOCUMENTO */
            FOR SELECT RCCR_TIPODOC, RCCR_PREFIJO, RCCR_NUMERO, RCCR_ABONO+RCCR_RTFTE+RCCR_RTIVA+RCCR_RTICA+RCCR_DTOF
                FROM recibos_caja_crucec WHERE RECA_ID = :IDDOC
                INTO :TIPOIT, PREFIT, NUMIT, ABONOIT
                DO
                BEGIN
                NUMEROIT = PREFIT || NUMIT;
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :ABONOIT, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, :NUMEROIT, NULL, NULL, :TIPOIT, 0);
                SUMA = SUMA + ABONOIT;
                NROI = NROI + 1;
                END
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :CRUCES, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            SUMA = SUMA + CRUCES;
            NROI = NROI + 1;
            END

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

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE RECIBOS_SIN_CONTABILIDAD(
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    ID INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    ESTADO VARCHAR(20),
    IDI INTEGER,
    IDC INTEGER,
    ERROR INTEGER)
AS
DECLARE VARIABLE VER CHAR(2);
declare variable FECICNT VARCHAR(10);
declare variable FECFCNT VARCHAR(10);
declare variable idref INTEGER;
BEGIN /*$$IBE$$ 
EXECUTE PROCEDURE fecha_a_conta(FECINI) returning_values (FECICNT);
EXECUTE PROCEDURE fecha_a_conta(FECFIN) returning_values (FECFCNT);
FOR SELECT RECA_ID, PREF_PRE, RECA_NUMERO FROM RECIBOS_CAJA WHERE RECA_ANULADO = 'N' AND
    RECA_FECHA >= :FECINI AND RECA_FECHA <= :FECFIN and PREF_PRE NOT IN (SELECT AUTO_PREFRDC FROM AUTORIZACIONES) ORDER BY RECA_ID
    INTO :ID, :PREF, :NUMERO
DO
  BEGIN
  idref = null;
  SELECT ENCO_IDREF FROM COMPROBANTE_ENCABEZADO WHERE ENCO_TIPOREF = 61 AND ENCO_FECHA >= :FECICNT AND ENCO_FECHA <= :FECFCNT and ENCO_IDREF = :id into :idref;
  if (idref IS NULL) then
  begin
   ESTADO = 'PROCESANDO';
   SUSPEND;
   SELECT MAX(INCJ_ID) FROM INTERFAZ_CAJA WHERE PREF_PRE = :PREF AND TIDO_COD = 61 INTO :IDI;
   EXECUTE PROCEDURE CONTABIL_RECICAJA (:ID, :IDI) RETURNING_VALUES (:ERROR, :VER, :IDC);
   if (ERROR = 0) then
    BEGIN
    EXECUTE PROCEDURE CONTABILIZA_PENDIENTE (:IDC);
    ESTADO = 'OK';
    END
   ELSE
    ESTADO = 'ERROR';
   suspend;
  end
  END
 $$IBE$$*/ SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE RECIBOS_SIN_CONTABILIDAD(
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    ID INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    ESTADO VARCHAR(20),
    IDI INTEGER,
    IDC INTEGER,
    ERROR INTEGER)
AS
DECLARE VARIABLE VER CHAR(2);
declare variable FECICNT VARCHAR(10);
declare variable FECFCNT VARCHAR(10);
declare variable idref INTEGER;
BEGIN
EXECUTE PROCEDURE fecha_a_conta(FECINI) returning_values (FECICNT);
EXECUTE PROCEDURE fecha_a_conta(FECFIN) returning_values (FECFCNT);
FOR SELECT RECA_ID, PREF_PRE, RECA_NUMERO FROM RECIBOS_CAJA WHERE RECA_ANULADO = 'N' AND
    RECA_FECHA >= :FECINI AND RECA_FECHA <= :FECFIN and PREF_PRE NOT IN (SELECT AUTO_PREFRDC FROM AUTORIZACIONES) ORDER BY RECA_ID
    INTO :ID, :PREF, :NUMERO
DO
  BEGIN
  idref = null;
  SELECT ENCO_IDREF FROM COMPROBANTE_ENCABEZADO WHERE ENCO_TIPOREF = 61 AND ENCO_FECHA >= :FECICNT AND ENCO_FECHA <= :FECFCNT and ENCO_IDREF = :id into :idref;
  if (idref IS NULL) then
  begin
   ESTADO = 'PROCESANDO';
   SUSPEND;
   SELECT MAX(INCJ_ID) FROM INTERFAZ_CAJA WHERE PREF_PRE = :PREF AND TIDO_COD = 61 INTO :IDI;
   EXECUTE PROCEDURE CONTABIL_RECICAJA (:ID, :IDI) RETURNING_VALUES (:ERROR, :VER, :IDC);
   if (ERROR = 0) then
    BEGIN
    EXECUTE PROCEDURE CONTABILIZA_PENDIENTE (:IDC);
    ESTADO = 'OK';
    END
   ELSE
    ESTADO = 'ERROR';
   suspend;
  end
  END
END

^

SET TERM ; ^


/* 20090324c */
/* CAMPO GRUPO EN CONSULTA DE PROVEEDORES */
SET TERM ^ ;

CREATE OR ALTER PROCEDURE MOVIMIENTO_CXPAGAR_MES(
    FECINI DATE,
    FECFIN DATE,
    MONEDA INTEGER)
RETURNS (
    NIT VARCHAR(20),
    NOMBRE VARCHAR(60),
    GRUPO VARCHAR(2),
    INICIAL NUMERIC(18,4),
    DEBITOS NUMERIC(18,4),
    CREDITOS NUMERIC(18,4),
    ABONOS NUMERIC(18,4),
    FINAL NUMERIC(18,4))
AS
declare variable RETES CHAR(2);
BEGIN
  for select TERC_NIT, TERC_NOM from TERCEROS WHERE TERC_PROV = 'S' into :NIT, :NOMBRE
  DO
    BEGIN
    SELECT GRPR_COD FROM PROVEEDORES WHERE TERC_NIT = :NIT INTO :grupo;
    EXECUTE PROCEDURE saldo_proveedor (NIT, FECINI, MONEDA) returning_values (INICIAL);
    EXECUTE PROCEDURE LEE_CONFIGURACION('CXPAGAR', 'SALDOS', 'DESCONTAR RETENCIONES POR CAUSACION') returning_values(:RETES);
    if (RETES = 'SI') then
        BEGIN
        SELECT SUM((MVPR_MONTO-MVPR_RTFTE-MVPR_RTIVA-MVPR_RTICA)/MVPR_TRM)
            FROM movimiento_proveedor
            WHERE TERC_NIT = :NIT AND MVPR_FECHA >= :FECINI AND MVPR_FECHA <= :FECFIN AND MVPR_DEBITO = 'S' AND ((:MONEDA = 0) or (MVPR_TRM <> 1))
            INTO :DEBITOS;
        SELECT SUM((MVPR_MONTO-MVPR_RTFTE-MVPR_RTIVA-MVPR_RTICA)/MVPR_TRM)
            FROM movimiento_proveedor
            WHERE TERC_NIT = :NIT AND MVPR_FECHA >= :FECINI AND MVPR_FECHA <= :FECFIN AND MVPR_DEBITO = 'N' AND MVPR_ABONO = 'N' and MVPR_TIPOREF <> 55 AND ((:MONEDA = 0) or (MVPR_TRM <> 1))
            INTO :CREDITOS;
        SELECT SUM(MVPR_MONTO/MVPR_TRM) FROM movimiento_proveedor
            WHERE TERC_NIT = :NIT AND MVPR_FECHA >= :FECINI AND MVPR_FECHA <= :FECFIN AND MVPR_ABONO = 'S' AND ((:MONEDA = 0) or (MVPR_TRM <> 1))
            INTO :ABONOS;
        END
    ELSE
        BEGIN
        SELECT SUM(MVPR_MONTO/MVPR_TRM)
            FROM movimiento_proveedor
            WHERE TERC_NIT = :NIT AND MVPR_FECHA >= :FECINI AND MVPR_FECHA <= :FECFIN AND MVPR_DEBITO = 'S' AND ((:MONEDA = 0) or (MVPR_TRM <> 1))
            INTO :DEBITOS;
        SELECT SUM(MVPR_MONTO/MVPR_TRM)
            FROM movimiento_proveedor
            WHERE TERC_NIT = :NIT AND MVPR_FECHA >= :FECINI AND MVPR_FECHA <= :FECFIN AND MVPR_DEBITO = 'N' AND MVPR_ABONO = 'N' AND MVPR_TIPOREF <> 55 AND ((:MONEDA = 0) or (MVPR_TRM <> 1))
            INTO :CREDITOS;
        SELECT SUM((MVPR_MONTO+MVPR_RTFTE+MVPR_RTIVA+MVPR_RTICA)/MVPR_TRM)
            FROM movimiento_proveedor
            WHERE TERC_NIT = :NIT AND MVPR_FECHA >= :FECINI AND MVPR_FECHA <= :FECFIN AND MVPR_ABONO = 'S' AND ((:MONEDA = 0) or (MVPR_TRM <> 1))
            INTO :ABONOS;
        END
    if (DEBITOS IS NULL) then
        DEBITOS = 0;
    if (CREDITOS IS NULL) then
        CREDITOS = 0;
    if (ABONOS IS NULL) then
        ABONOS = 0;
    FINAL = INICIAL + DEBITOS - CREDITOS - ABONOS;
    SUSPEND;
    END
END
^

SET TERM ; ^

/* 20090325 */
/* CAUSAR DIFERENCIA EN CAMBIO DESDE CONTABILIDAD */
SET TERM ^ ;

CREATE OR ALTER PROCEDURE CAUSA_DIFERENCIA_CAMBIO(
    FECHA DATE,
    TIPOCOMP VARCHAR(3),
    PREFCONT VARCHAR(4),
    NUMCONT VARCHAR(6),
    TRM NUMERIC(18,2),
    CTACARTERA VARCHAR(20))
RETURNS (
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(6),
    NIT VARCHAR(20),
    PROY VARCHAR(4),
    CENTRO VARCHAR(4),
    DIFERENCIA NUMERIC(18,2))
AS
declare variable DESC_RTES char(2);
declare variable ID INTEGER;
declare variable OK INTEGER;
declare variable I INTEGER;
declare variable FECAUX CHAR(8);
declare variable CTADIFD VARCHAR(20);
declare variable CTADIFC VARCHAR(20);
declare variable TIPOCUEN CHAR(1);
declare variable AUTORET varchar(10);
declare variable FAUTORET date;
declare variable TIPO INTEGER;
declare variable IDDOC INTEGER;
declare variable SALDO NUMERIC(18,2);
declare variable AB1 NUMERIC(18,2);
declare variable TRMDOC NUMERIC(18,2);
begin
execute procedure LEE_CONFIGURACION('CARTERA', 'SALDOS', 'FECHA AUTORETENEDOR NO DESCONTAR RETENCIONES DEL SALDO PERO SI CONTABILIZARLAS') returning_values (AUTORET);
if (AUTORET <> '') then
    FAUTORET = cast(AUTORET as date);
else
    FAUTORET = '9999/12/31';
EXECUTE PROCEDURE FECHA_A_CONTA(:FECHA) returning_values (:FECAUX);

execute procedure lee_configuracion('GENERAL','GENERAL','CUENTA DE INGRESO POR DIFERENCIA EN CAMBIO PARA OPERACIONES EN OTRA MONEDA') returning_values (:ctadifd);
execute procedure lee_configuracion('GENERAL','GENERAL','CUENTA DE GASTO POR DIFERENCIA EN CAMBIO PARA OPERACIONES EN OTRA MONEDA') returning_values (:ctadifc);
EXECUTE PROCEDURE VALIDE_CUENTA_C (ctadifd) RETURNING_VALUES (:OK);
IF (OK = 0) THEN
    SELECT CUEN_TIPO FROM CUENTAS WHERE CUEN_COD = :ctadifd INTO :TIPOCUEN;
ELSE
    exception cuenta_no_existe 'LA CUENTA ' || ctadifd || ' NO EXISTE.';
if (TIPOCUEN <> 'N') then
    exception cuenta_no_es_normal;
EXECUTE PROCEDURE VALIDE_CUENTA_C (ctadifc) RETURNING_VALUES (:OK);
IF (OK = 0) THEN
    SELECT CUEN_TIPO FROM CUENTAS WHERE CUEN_COD = :ctadifc INTO :TIPOCUEN;
ELSE
    exception cuenta_no_existe 'LA CUENTA ' || ctadifc || ' NO EXISTE.';
if (TIPOCUEN <> 'N') then
    exception cuenta_no_es_normal;

execute procedure LEE_CONFIGURACION('CARTERA', 'SALDOS', 'DESCONTAR RETENCIONES POR CAUSACION') returning_values (DESC_RTES);
execute procedure cambie_id_comproba returning_values(ID);
insert into comprobante_encabezado (tico_cod, prco_pref, enco_consec, enco_numero, enco_fecha, enco_concepto, enco_refer, enco_tiporef, enco_idref)
    values (:tipocomp, :prefcont, :ID, :numcont, :fecaux, 'AJUSTE POR DIFERENCIA EN CAMBIO', '', 0, 0);
I = 1;
if (DESC_RTES = 'SI') then
    BEGIN
    for select max(SDCA_TIPOREF), max(SDCA_IDREF), sum((SDCA_MONTO-SDCA_ABONO-SDCA_RTFTE-SDCA_RTIVA-SDCA_RTICA)/SDCA_TRM), max(terc_nit)
        from saldos_doc_cartera where (SDCA_FECHA <= :FECHA) and (SDCA_FECHA < :FAUTORET) and SDCA_TRM <> 1
        group by sdca_tiporef, sdca_idref into :TIPO, :IDDOC, :SALDO, :nit
        do
        begin
        if (SALDO <> 0) then
            begin
            select sum(SDCA_ABONO/SDCA_TRM)
                from saldos_doc_cartera where SDCA_TIPOREF = :TIPO and SDCA_IDREF = :iddoc and (SDCA_FECHA <= :FECHA) and (SDCA_FECHA >= :FAUTORET)
                into :AB1;
            if (AB1 is null) then
                AB1 = 0;
            SALDO = SALDO - AB1;
            if (SALDO <> 0) then
                begin
                select MVCL_PREFREF, MVCL_NUMREF, MVCL_TRM, PREF_PROY, PREF_CENTRO
                    from MOVIMIENTO_CLIENTES M, PREFIJOS P
                    where mvcl_tiporef = :tipo and mvcl_idref = :iddoc AND M.mvcl_tiporef = P.tido_cod AND M.mvcl_prefref = P.pref_pre
                    into :PREFIJO, :NUMERO, :TRMDOC, :proy, :centro;
                diferencia = SALDO * (TRM - TRMDOC);
                if (diferencia > 0) then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:ID, :I, :ctadifd, 'AJUSTE POR DIFERENCIA EN CAMBIO', '', 0, :diferencia, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    I = I + 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 (:ID, :I, :ctacartera, 'AJUSTE POR DIFERENCIA EN CAMBIO', '', :diferencia, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    END
                else
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:ID, :I, :ctadifc, 'AJUSTE POR DIFERENCIA EN CAMBIO', '', ABS(:diferencia), 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    I = I + 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 (:ID, :I, :ctacartera, 'AJUSTE POR DIFERENCIA EN CAMBIO', '', 0, ABS(:diferencia), 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    END
                I = I + 1;
                UPDATE MOVIMIENTO_CLIENTES SET MVCL_TRM = :TRM where mvcl_tiporef = :tipo and mvcl_idref = :iddoc;
                suspend;
                end
            end
        end
    /* LAS DE DESPUES DE LA AUTORETENCION */
    for select max(SDCA_TIPOREF), max(SDCA_IDREF), sum((SDCA_MONTO-SDCA_ABONO-SDCA_RTIVA-SDCA_RTICA)/SDCA_TRM), max(terc_nit)
        from saldos_doc_cartera where (TERC_NIT = :nit) and (SDCA_FECHA <= :FECHA) and (SDCA_FECHA >= :FAUTORET) group by sdca_tiporef, sdca_idref
        into :TIPO, :ID, :SALDO, :nit
        do
        begin
        if (SALDO <> 0) then
            begin
            select MVCL_PREFREF, MVCL_NUMREF, MVCL_TRM, PREF_PROY, PREF_CENTRO
                from MOVIMIENTO_CLIENTES M, PREFIJOS P
                where mvcl_tiporef = :tipo and mvcl_idref = :iddoc AND M.mvcl_tiporef = P.tido_cod AND M.mvcl_prefref = P.pref_pre
                into :PREFIJO, :NUMERO, :TRMDOC, :proy, :centro;
            diferencia = SALDO * (TRM - TRMDOC);
            if (diferencia > 0) then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:ID, :I, :ctadifd, 'AJUSTE POR DIFERENCIA EN CAMBIO', '', 0, :diferencia, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                I = I + 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 (:ID, :I, :ctacartera, 'AJUSTE POR DIFERENCIA EN CAMBIO', '', :diferencia, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                END
            else
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:ID, :I, :ctadifc, 'AJUSTE POR DIFERENCIA EN CAMBIO', '', ABS(:diferencia), 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                I = I + 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 (:ID, :I, :ctacartera, 'AJUSTE POR DIFERENCIA EN CAMBIO', '', 0, ABS(:diferencia), 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                END
            I = I + 1;
            UPDATE MOVIMIENTO_CLIENTES SET MVCL_TRM = :TRM where mvcl_tiporef = :tipo and mvcl_idref = :iddoc;
            suspend;
            end
        end
     END
else
    BEGIN
    for select max(SDCA_TIPOREF), max(SDCA_IDREF), sum((SDCA_MONTO-SDCA_ABONO-SDCA_ABRTFTE-SDCA_ABRTIVA-SDCA_ABRTICA)/SDCA_TRM), max(terc_nit)
        from saldos_doc_cartera where (SDCA_FECHA <= :FECHA) and (SDCA_FECHA < :FAUTORET) and SDCA_TRM <> 1
        group by sdca_tiporef, sdca_idref
        into :TIPO, :ID, :SALDO, :nit
        do
        begin
        if (SALDO <> 0) then
            begin
            select MVCL_PREFREF, MVCL_NUMREF, MVCL_TRM, PREF_PROY, PREF_CENTRO
                from MOVIMIENTO_CLIENTES M, PREFIJOS P
                where mvcl_tiporef = :tipo and mvcl_idref = :iddoc AND M.mvcl_tiporef = P.tido_cod AND M.mvcl_prefref = P.pref_pre
                into :PREFIJO, :NUMERO, :TRMDOC, :proy, :centro;
            diferencia = SALDO * (TRM - TRMDOC);
            if (diferencia > 0) then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:ID, :I, :ctadifd, 'AJUSTE POR DIFERENCIA EN CAMBIO', '', 0, :diferencia, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                I = I + 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 (:ID, :I, :ctacartera, 'AJUSTE POR DIFERENCIA EN CAMBIO', '', :diferencia, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                END
            else
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:ID, :I, :ctadifc, 'AJUSTE POR DIFERENCIA EN CAMBIO', '', ABS(:diferencia), 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                I = I + 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 (:ID, :I, :ctacartera, 'AJUSTE POR DIFERENCIA EN CAMBIO', '', 0, ABS(:diferencia), 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                END
            I = I + 1;
            UPDATE MOVIMIENTO_CLIENTES SET MVCL_TRM = :TRM where mvcl_tiporef = :tipo and mvcl_idref = :iddoc;
            suspend;
            end
        end
    END
end
^

SET TERM ; ^


/* 20090325b*/
/* planillas de digitación */

CREATE TABLE PLANILLA_DIGITACION (
    PLDI_ID        T_ID NOT NULL,
    PLDI_NOMBRE    T_CONCEPTO,
    PLDI_MES       T_BOOLEANO,
    PLDI_TERCERO   T_BOOLEANO,
    PLDI_CENTROS   T_BOOLEANO,
    PLDI_TIPOCOMP  T_TIPO_COMP,
    PLDI_PREF      VARCHAR(4) CHARACTER SET NONE,
    PLDI_CONC      T_CONCEPTO,
    PLDI_CONCITE   T_BOOLEANO
);


CREATE TABLE PLANILLA_DIGITACION_CUENTAS (
    PLDI_ID       T_ID NOT NULL,
    PLDC_ITEM     T_ID NOT NULL,
    PLDC_CUENTA   T_CTA_CONTABLE,
    PLDC_TITULO   VARCHAR(30) CHARACTER SET NONE,
    PLDC_BASE     T_BOOLEANO,
    PLDC_DB       T_BOOLEANO,
    PLDC_CUADRAR  T_BOOLEANO
);

ALTER TABLE PLANILLA_DIGITACION ADD CONSTRAINT PK_PLANILLA_DIGITACION PRIMARY KEY (PLDI_ID);
ALTER TABLE PLANILLA_DIGITACION_CUENTAS ADD CONSTRAINT PK_PLANILLA_DIGITACION_CUENTAS PRIMARY KEY (PLDI_ID, PLDC_ITEM);
ALTER TABLE PLANILLA_DIGITACION_CUENTAS ADD CONSTRAINT FK_PLANILLA_DIGITACION_CUENTAS_ FOREIGN KEY (PLDI_ID) REFERENCES PLANILLA_DIGITACION (PLDI_ID) ON DELETE CASCADE ON UPDATE CASCADE;

grant select, delete, insert, update on planilla_digitacion to public;
grant select, delete, insert, update on planilla_digitacion_cuentas to public;

/* 20090326 */
/* cuando no hay agencias no actualizaba el historico */
SET TERM ^ ;

CREATE OR ALTER PROCEDURE ANALISIS_VENTAS_VENDEDOR(
    AGENCIA INTEGER,
    VENDINI INTEGER,
    VENDFIN INTEGER,
    FECHA DATE)
RETURNS (
    CODVEND INTEGER,
    NOMVEND VARCHAR(60),
    CODAGENCIA INTEGER,
    NOMAGENCIA VARCHAR(60),
    PRESUPUESTO NUMERIC(18,2),
    VENTAS NUMERIC(18,2),
    VENTADIA NUMERIC(18,2),
    PENDIENTE NUMERIC(18,2),
    FALTANTE NUMERIC(18,2),
    FALTANTEDIA NUMERIC(18,2),
    PORCENTAJE NUMERIC(9,2),
    PROMEDIO NUMERIC(18,2),
    ESPERADO NUMERIC(18,2),
    RECAUDO NUMERIC(18,2),
    RECAUDODIA NUMERIC(18,2),
    PENDIENTER NUMERIC(18,2),
    MOSTRADORV NUMERIC(18,2),
    MOSTRADORR NUMERIC(18,2),
    MAXIMAVTA NUMERIC(18,2),
    MESMAXIMO VARCHAR(8),
    VENTAANOP NUMERIC(18,2),
    DEBERIAIR NUMERIC(9,2))
AS
DECLARE VARIABLE FECAUX VARCHAR(10);
DECLARE VARIABLE FECINI VARCHAR(10);
DECLARE VARIABLE FEC DATE;
DECLARE VARIABLE ANO INTEGER;
DECLARE VARIABLE MES INTEGER;
DECLARE VARIABLE TIPODOC INTEGER;
DECLARE VARIABLE ID INTEGER;
DECLARE VARIABLE ABONO NUMERIC(18,2);
DECLARE VARIABLE SUBTOTAL NUMERIC(18,2);
DECLARE VARIABLE IVAMONTO NUMERIC(18,2);
DECLARE VARIABLE TOTAL NUMERIC(18,2);
DECLARE VARIABLE ESCONTADO CHAR(1);
DECLARE VARIABLE DIAS INTEGER;
DECLARE VARIABLE AGEN_ANT INTEGER;
DECLARE VARIABLE TOTAL_SUC NUMERIC(18,2);
declare variable DIA INTEGER;
begin
MOSTRADORV = 0;
MOSTRADORR = 0;
AGEN_ANT = 0;
total_suc = 0;
FECAUX = CAST (FECHA AS VARCHAR(10));
ANO = CAST(SUBSTR(FECAUX, 1, 4) AS INTEGER);
MES = CAST(SUBSTR(FECAUX, 6, 7) AS INTEGER);
FECINI = SUBSTR(FECAUX, 1, 8) || '01';
DIA = extract (DAY FROM FECHA);
/*SELECT PRVM_DIAS FROM PRESUPUESTO_VENTAS_MESES WHERE PRVM_ANO = :ANO AND PRVM_MES = :MES INTO :DIAS; */
DIAS = EXTRACT(DAY FROM (FECHA - EXTRACT(DAY FROM FECHA) + 32 - EXTRACT(DAY FROM FECHA - EXTRACT(DAY FROM FECHA) + 32)));
FOR SELECT VEND_COD, VEND_NOMBRE, SUCU_ID, VEND_CONTADO FROM VENDEDORES WHERE VEND_COD >= :VENDINI AND VEND_COD <= :VENDFIN  AND
    ((SUCU_ID = :AGENCIA) or (:AGENCIA = 0)) ORDER BY SUCU_ID, VEND_COD
    INTO :CODVEND, :NOMVEND, :CODAGENCIA, :ESCONTADO
    DO
    BEGIN
    if (CODAGENCIA <> 0) then
        BEGIN
        SELECT SUCU_NOMBRE FROM SUCURSALES WHERE SUCU_ID = :CODAGENCIA INTO :NOMAGENCIA;
        MAXIMAVTA = 0;
        MESMAXIMO = '';
        VENTAANOP = 0;
        /* LA MAXIMA VENTA Y EL MES EN QUE OCURRIO */
        SELECT MAX(HIVE_VENTA) FROM historico_ventas WHERE SUCU_ID = :codagencia INTO maximavta;
        SELECT MAX(CAST(HIVE_MES AS CHAR(2)) || '/' || CAST(HIVE_ANO AS CHAR(4))) FROM
            historico_ventas WHERE HIVE_VENTA = :maximavta AND SUCU_ID = :codagencia INTO :mesmaximo;
        /* LA VENTA DEL MISMO MES EL ANO ANTERIOR */
        SELECT HIVE_VENTA FROM historico_ventas WHERE HIVE_ANO = :ANO-1 AND HIVE_MES = :MES AND SUCU_ID = :codagencia INTO :ventaanop;
        END
    /* TRAIGA EL PRESUPUESTO DEL MES */
    PRESUPUESTO = 0;
    PENDIENTE = 0;
    PENDIENTER = 0;
    SELECT PRVE_VENTA, PRVE_PENDIENTE, PRVE_PENDRECA FROM PRESUPUESTO_VENTAS
        WHERE VEND_COD = :CODVEND AND PRVE_ANO = :ANO AND PRVE_MES = :MES
        INTO :PRESUPUESTO, :PENDIENTE, :PENDIENTER;

    /* CALCULE LAS VENTAS */
    SELECT SUM(FACT_TOTAL-FACT_IVAMONTO) FROM FACTURAS F, PREFIJOS P
        WHERE VEND_COD = :CODVEND AND FACT_FECHA = :FECHA AND FACT_ANULADO = 'N'
        AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND ((SUCU_ID = :AGENCIA) or (:AGENCIA = 0))
        INTO :VENTADIA;
    if (VENTADIA is null) then
        VENTADIA = 0;
    SELECT SUM(FACT_TOTAL-FACT_IVAMONTO) FROM FACTURAS F, PREFIJOS P
        WHERE VEND_COD = :CODVEND AND FACT_FECHA >= :FECINI AND FACT_FECHA < :FECHA AND FACT_ANULADO = 'N'
        AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND ((SUCU_ID = :AGENCIA) or (:AGENCIA = 0))
        INTO :SUBTOTAL;
    if (subtotal is null) then
        ventas = VENTADIA;
    else
        VENTAS = SUBTOTAL + VENTADIA;
    /* CALCULE LAS DEVOLUCIONES */
    SELECT SUM(DEVT_TOTAL-DEVT_IVAMONTO) FROM devoluciones_ventas F, PREFIJOS P
        WHERE VEND_COD = :CODVEND AND DEVT_FECHA = :FECHA AND DEVT_ANULADO = 'N'
        AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 33 AND ((SUCU_ID = :AGENCIA) or (:AGENCIA = 0))
        INTO :SUBTOTAL;
    if (subtotal is not null) then
        BEGIN
        VENTADIA = VENTADIA - SUBTOTAL;
        VENTAS = VENTAS - SUBTOTAL;
        END
    SELECT SUM(DEVT_TOTAL-DEVT_IVAMONTO) FROM devoluciones_ventas F, PREFIJOS P
        WHERE VEND_COD = :CODVEND AND DEVT_FECHA >= :FECINI AND DEVT_FECHA < :FECHA AND DEVT_ANULADO = 'N'
        AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 33 AND ((SUCU_ID = :AGENCIA) or (:AGENCIA = 0))
        INTO :SUBTOTAL;
    if (subtotal is not null) then
        VENTAS = VENTAS - SUBTOTAL;
    /* CALCULE LAS NOTAS CREDITO */
    SELECT SUM(NCCL_MONTO) FROM NOTAS_CREDITO_CLIENTES F, PREFIJOS P
        WHERE VEND_COD = :CODVEND AND NCCL_FECHA = :FECHA AND NCCL_ANULADO = 'N'
        AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 42 AND ((SUCU_ID = :AGENCIA) or (:AGENCIA = 0))
        INTO :SUBTOTAL;
    if (subtotal is not null) then
        BEGIN
        VENTADIA = VENTADIA - SUBTOTAL;
        VENTAS = VENTAS - SUBTOTAL;
        END
    SELECT SUM(NCCL_MONTO) FROM NOTAS_CREDITO_CLIENTES F, PREFIJOS P
        WHERE VEND_COD = :CODVEND AND NCCL_FECHA >= :FECINI AND NCCL_FECHA < :FECHA AND NCCL_ANULADO = 'N'
        AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 42 AND ((SUCU_ID = :AGENCIA) or (:AGENCIA = 0))
        INTO :SUBTOTAL;
    if (subtotal is not null) then
        VENTAS = VENTAS - SUBTOTAL;
    FALTANTE = PRESUPUESTO - VENTAS;
    if (DIAS - DIA > 0) then
        FALTANTEDIA = FALTANTE / (DIAS - DIA);
    ELSE
        FALTANTEDIA = FALTANTE;
    if (PRESUPUESTO <> 0) then
        PORCENTAJE = VENTAS / PRESUPUESTO * 100;
    ELSE
        PORCENTAJE = 0;
    PROMEDIO = (VENTAS + PENDIENTE) / DIA;
    ESPERADO = PROMEDIO * DIAS;
    DEBERIAIR = DIA * 100/ dias;
    RECAUDO = 0;
    RECAUDODIA = 0;
    /* CALCULE EL RECAUDO DEL MES EXCLUYENDO EL IVA */
    FOR SELECT RECA_FECHA, RCDE_TIPODOC, RCDE_IDDOC, (RCDE_ABONO+RCDE_RTFTE+RCDE_RTIVA+RCDE_RTICA)
        FROM RECIBOS_CAJA R, RECIBOS_CAJA_DETALLE RD
        WHERE R.RECA_ID = RD.RECA_ID AND
        RECA_FECHA >= :FECINI AND RECA_FECHA <= :FECHA AND RECA_ANULADO = 'N' AND COBR_COD = :CODVEND
        ORDER BY RECA_FECHA
        INTO :FEC, :TIPODOC, :ID, :ABONO
        DO
        BEGIN
        /* TRAIGA EL DOCUMENTO Y CALCULE LA BASE */
        if (TIPODOC = 31) then
                SELECT FACT_TOTAL,FACT_IVAMONTO FROM FACTURAS WHERE FACT_ID = :ID INTO :TOTAL, :IVAMONTO;
        if (TIPODOC = 33) then
                SELECT DEVT_TOTAL*-1,DEVT_IVAMONTO*-1 FROM DEVOLUCIONES_VENTAS WHERE DEVT_ID = :ID INTO :TOTAL, :IVAMONTO;
        if (TIPODOC = 41) then
                SELECT NDCL_MONTO,NDCL_IVAMONTO FROM NOTAS_DEBITO_CLIENTES WHERE NDCL_ID = :ID INTO :TOTAL, :IVAMONTO;
        if (TIPODOC = 42) then
                SELECT NCCL_MONTO*-1,NCCL_IVAMONTO*-1 FROM NOTAS_CREDITO_CLIENTES WHERE NCCL_ID = :ID INTO :TOTAL, :IVAMONTO;
        if (TIPODOC = 77) then
                SELECT DVCH_MONTO,0 FROM DEVOLUCION_CHEQUES WHERE DVCH_ID = :ID INTO :TOTAL, :IVAMONTO;
        if (TOTAL <> 0) then
            SUBTOTAL = (ABONO / TOTAL) * (TOTAL - IVAMONTO);
        RECAUDO = RECAUDO + SUBTOTAL;
        if (FEC = FECHA) then
            RECAUDODIA = RECAUDODIA + SUBTOTAL;
        END
    if (ESCONTADO = 'S') then
        BEGIN
        MOSTRADORV = MOSTRADORV + VENTAS;
        MOSTRADORR = MOSTRADORR + RECAUDO;
        END
    /* actualice el historico */
    if (AGEN_ANT <> codagencia)  then
        BEGIN
        if (AGEN_ANT <> 0) THEN
            BEGIN
            TOTAL = null;
            SELECT HIVE_VENTA FROM historico_ventas WHERE HIVE_ANO = :ANO AND HIVE_MES = :MES AND SUCU_ID = :AGEN_ANT INTO :TOTAL;
            if (TOTAL is not null) then
                BEGIN
                if (TOTAL_SUC <> 0) then
                    UPDATE historico_ventas SET HIVE_VENTA = (:total_suc)  WHERE HIVE_ANO = :ANO AND HIVE_MES = :MES AND SUCU_ID = :AGEN_ANT;
                END
            ELSE
                INSERT INTO historico_ventas (HIVE_ANO, HIVE_MES, SUCU_ID, HIVE_VENTA) VALUES (:ANO, :MES, :AGEN_ANT, :TOTAL_SUC);
            END
        total_suc = VENTAS;
        END
    ELSE
        BEGIN
        total_suc = :total_suc + :VENTAS;
        END
    AGEN_ANT = :codagencia;
    if ((VENTAS <> 0) or (RECAUDO <> 0) or (:presupuesto <> 0)) then
        suspend;
    END
/* actualice la ultima agencia */
TOTAL = null;
SELECT HIVE_VENTA FROM historico_ventas WHERE HIVE_ANO = :ANO AND HIVE_MES = :MES AND SUCU_ID = :AGEN_ANT INTO :TOTAL;
if (TOTAL is not null) then
    BEGIN
    if (TOTAL_SUC <> 0) then
        UPDATE historico_ventas SET HIVE_VENTA = (:total_suc)  WHERE HIVE_ANO = :ANO AND HIVE_MES = :MES AND SUCU_ID = :AGEN_ANT;
    END
ELSE
    INSERT INTO historico_ventas (HIVE_ANO, HIVE_MES, SUCU_ID, HIVE_VENTA) VALUES (:ANO, :MES, :AGEN_ANT, :TOTAL_SUC);
end
^

SET TERM ; ^

/* 20090327 */
/* SALDO QUEDABAN NEGATIVOS */
SET TERM ^ ;

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

SET TERM ; ^

/* mal where de saldos por cuenta */
SET TERM ^ ;

CREATE OR ALTER PROCEDURE MM_1008 (
    inicio char(8),
    final char(8))
as
declare variable idconc integer;
declare variable concepto integer;
declare variable tipodoc integer;
declare variable nit varchar(15);
declare variable dv char(1);
declare variable apellido1 varchar(60);
declare variable apellido2 varchar(60);
declare variable nombre1 varchar(60);
declare variable nombre2 varchar(60);
declare variable razonsocial varchar(450);
declare variable direccion varchar(200);
declare variable departamento char(2);
declare variable municipio char(3);
declare variable pais char(3);
declare variable saldo numeric(18,0);
declare variable saldoaux numeric(18,0);
declare variable cuenta varchar(20);
declare variable minimo numeric(18,0);
declare variable menorcuantia numeric(18,2);
declare variable item integer;
declare variable ano char(4);
declare variable dirmenor varchar(200);
declare variable depmenor char(2);
declare variable munmenor char(3);
declare variable paismenor char(3);
begin
EXECUTE PROCEDURE lee_configuracion('CONTABILIDAD', 'GENERAL', 'NIT COMPAÑIA') returning_values (:NIT);
SELECT TERC_DIR, SUBSTR(CIUD_COD,1,2), SUBSTR(CIUD_COD,3,5), PAIS_ID FROM TERCEROS WHERE TERC_NIT = :NIT
    INTO :dirmenor, :depmenor, :munmenor, :paismenor;
ITEM = 0;
ANO = SUBSTR(INICIO,1,4);

FOR select COME_ITEM, COME_RESPUESTA, COME_MINIMO
    FROM configura_mediosmag WHERE COME_FORMATO = 1008 INTO :idconc, :CONCEPTO, :MINIMO
    DO
    BEGIN
    MENORCUANTIA = 0;
    FOR SELECT distinct TERC_NIT FROM SALDOS_TERCEROS S, mediosmag_cuentas M
        WHERE M.mmcu_item = :idconc AND SUBSTR(CUEN_COD,1,STRLEN(M.mmcu_cuenta)) = M.mmcu_cuenta
        ORDER BY TERC_NIT INTO :NIT
        do
        BEGIN
        SELECT TERC_NOM, TERC_NOMBRE1, TERC_NOMBRE2, TERC_APELLIDO1, TERC_APELLIDO2, TERC_DV, TIID_CODIGO,
            TERC_DIR, SUBSTR(CIUD_COD,1,2), SUBSTR(CIUD_COD,3,5), PAIS_ID
            FROM TERCEROS T left outer join TIPO_ID IT on (T.TERC_TIPOID = IT.TIID_COD) WHERE TERC_NIT = :NIT
            INTO :RAZONSOCIAL, :NOMBRE1, :NOMBRE2, :APELLIDO1, :APELLIDO2, :DV, :TIPODOC, :DIRECCION, :DEPARTAMENTO, :MUNICIPIO, :PAIS;
        SALDO = 0;
        FOR SELECT DISTINCT CUEN_COD FROM SALDOS_TERCEROS S, mediosmag_cuentas M
            WHERE TERC_NIT = :NIT AND M.mmcu_item = :idconc AND SUBSTR(CUEN_COD,1,STRLEN(M.mmcu_cuenta)) = M.mmcu_cuenta
            INTO :CUENTA
            DO
            BEGIN
            EXECUTE PROCEDURE SALDO_TERCERO_MES(CUENTA, NIT, ANO, 12, 'N') RETURNING_VALUES (SALDOAUX);
            SALDO = SALDO + SALDOAUX;
            END
        if (SALDO >= MINIMO) then
            BEGIN
            ITEM = ITEM + 1;
            insert into medios_magneticos_datos (memg_formato, memg_ano, memg_item, memg_concepto, memg_tipodoc, memg_nit, memg_dv,memg_apellido1, memg_apellido2,
                memg_nombre1, memg_nombre2, memg_razonsocial, memg_direccion, memg_departamento, memg_municipio, memg_pago, memg_pais)
                values (1008, :ano, :item,  :concepto, :tipodoc, :nit, :dv, :apellido1, :apellido2,
                :nombre1, :nombre2, :razonsocial, :direccion, :departamento, :municipio, :SALDO, :pais);
            END
        ELSE
            MENORCUANTIA = MENORCUANTIA + SALDO;
        END
    if (MENORCUANTIA <> 0) then
        BEGIN
        ITEM = ITEM + 1;
        insert into medios_magneticos_datos (memg_formato, memg_ano, memg_item, memg_concepto, memg_tipodoc, memg_nit, memg_dv,memg_apellido1, memg_apellido2,
            memg_nombre1, memg_nombre2, memg_razonsocial, memg_direccion, memg_departamento, memg_municipio, memg_pago, memg_pais)
            values (1008, :ano, :item,  :concepto, 43, '222222222', '', '', '',
            '', '', 'CUANTIAS MENORES', :dirmenor, :depmenor, :munmenor, :menorcuantia, :paismenor);
        END
    END
end
^

SET TERM ; ^


/* 20090328 */
/* PRESUPUESTO CON RANGO Y ORDENADO POR CUENTA */
SET TERM ^ ;

CREATE OR ALTER PROCEDURE PRESUPUESTO_MES(
    PERIODO INTEGER,
    ANO CHAR(4),
    CUENINI VARCHAR(20),
    CUENFIN VARCHAR(20))
RETURNS (
    CUENTA VARCHAR(20),
    NOMCUENTA VARCHAR(60),
    PRDEBITO NUMERIC(18,2),
    PRCREDITO NUMERIC(18,2),
    MVDEBITO NUMERIC(18,2),
    MVCREDITO NUMERIC(18,2),
    DIFERENCIA NUMERIC(18,2),
    PORCENTAJE NUMERIC(9,2))
AS
BEGIN
  /* POR CADA CUENTA AFECTABLE CALCULE PRESUP Y MOV. */
  FOR SELECT CUEN_COD, CUEN_NOM FROM CUENTAS WHERE CUEN_COD >= :CUENINI AND CUEN_COD <= :CUENFIN
      order by cuen_cod INTO :CUENTA, :NOMCUENTA
  DO
    BEGIN
    /* CALCULE EL PRESUPUESTO */
    SELECT PRES_DEBITO, PRES_CREDITO FROM PRESUPUESTO
        WHERE CUEN_COD = :CUENTA AND PRES_PERIODO = :PERIODO
        INTO :PRDEBITO, :PRCREDITO;
    if (PRDEBITO IS NULL) then
        PRDEBITO = 0;
    if (PRCREDITO IS NULL) then
        PRCREDITO = 0;
    /* CALCULE EL MOVIMIENTO */
    EXECUTE PROCEDURE MOVIMIENTO_CUENTA_MES(:CUENTA, :ANO, :PERIODO, 'S') returning_values (:MVDEBITO);
    
    EXECUTE PROCEDURE MOVIMIENTO_CUENTA_MES(:CUENTA, :ANO, :PERIODO, 'N') returning_values (:MVCREDITO);
    
    DIFERENCIA = (PRDEBITO - MVDEBITO) - (PRCREDITO - MVCREDITO);
    if ((PRDEBITO - PRCREDITO) <> 0) then
        PORCENTAJE = 100 - (DIFERENCIA * 100 / (PRDEBITO - PRCREDITO));
    ELSE
        PORCENTAJE = 0;
    SUSPEND;
    END
END
^

SET TERM ; ^

/* INCLUYA NO SOLO EL GASTO SI NO CUALQUIER CUENTA QUE COMPONGA LOS CONCEPTOS */
SET TERM ^ ;

CREATE OR ALTER PROCEDURE TOTAL_PAGOS_TERCERO_ANO(
    NIT VARCHAR(20),
    INI CHAR(8),
    FIN CHAR(8))
RETURNS (
    TOTAL NUMERIC(18,2))
AS
begin
SELECT SUM(CODE_DEBITO-CODE_CREDITO) FROM COMPROBANTE_DETALLE D, COMPROBANTE_ENCABEZADO E, mediosmag_cuentas M, configura_mediosmag C
    WHERE C.come_formato = 1001 AND C.come_item = M.mmcu_item AND M.mmcu_cuenta = D.cuen_cod AND
    E.ENCO_CONSEC = D.ENCO_CONSEC AND ENCO_FECHA >= :INI AND ENCO_FECHA <= :FIN AND
    D.TERC_NIT = :NIT INTO :TOTAL;
suspend;
end
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE MM_1001(
    INICIO CHAR(8),
    FINAL CHAR(8))
AS
declare variable IDCONC INTEGER;
declare variable CONCEPTO INTEGER;
declare variable TIPODOC INTEGER;
declare variable NIT VARCHAR(15) CHARACTER SET NONE;
declare variable DV CHAR(1) CHARACTER SET NONE;
declare variable APELLIDO1 VARCHAR(60) CHARACTER SET NONE;
declare variable APELLIDO2 VARCHAR(60) CHARACTER SET NONE;
declare variable NOMBRE1 VARCHAR(60) CHARACTER SET NONE;
declare variable NOMBRE2 VARCHAR(60) CHARACTER SET NONE;
declare variable RAZONSOCIAL VARCHAR(450) CHARACTER SET NONE;
declare variable DIRECCION VARCHAR(200) CHARACTER SET NONE;
declare variable DEPARTAMENTO CHAR(2) CHARACTER SET NONE;
declare variable MUNICIPIO CHAR(3) CHARACTER SET NONE;
declare variable PAIS CHAR(3) CHARACTER SET NONE;
declare variable PAGO NUMERIC(18,0);
declare variable DEBITOS NUMERIC(18,2);
declare variable CREDITOS NUMERIC(18,2);
declare variable MINIMO NUMERIC(18,2);
declare variable MENORCUANTIA NUMERIC(18,2);
declare variable TOTALTERC NUMERIC(18,2);
declare variable ITEM integer;
declare variable DIRMENOR VARCHAR(200) CHARACTER SET NONE;
declare variable DEPMENOR CHAR(2) CHARACTER SET NONE;
declare variable MUNMENOR CHAR(3) CHARACTER SET NONE;
declare variable PAISMENOR CHAR(3) CHARACTER SET NONE;
declare variable NATUR CHAR(1);
begin
EXECUTE PROCEDURE lee_configuracion('CONTABILIDAD', 'GENERAL', 'NIT COMPAÑIA') returning_values (:NIT);
SELECT TERC_DIR, SUBSTR(CIUD_COD,1,2), SUBSTR(CIUD_COD,3,5), PAIS_ID FROM TERCEROS WHERE TERC_NIT = :NIT
    INTO :dirmenor, :depmenor, :munmenor, :paismenor;
ITEM = 0;
FOR SELECT COME_ITEM, COME_RESPUESTA, COME_MINIMO, COME_NATUR FROM CONFIGURA_MEDIOSMAG
    WHERE COME_FORMATO = '1001' INTO :idconc, :CONCEPTO , :MINIMO, :NATUR
    DO
    BEGIN
    MENORCUANTIA = 0;
    FOR SELECT MAX(D.TERC_NIT), SUM(CODE_DEBITO-CODE_CREDITO), SUM(CODE_DEBITO), SUM(CODE_CREDITO)
        FROM COMPROBANTE_DETALLE D, COMPROBANTE_ENCABEZADO E, mediosmag_cuentas M
        WHERE M.mmcu_item = :idconc AND SUBSTR(CUEN_COD,1,STRLEN(M.mmcu_cuenta)) = M.mmcu_cuenta AND
        E.ENCO_CONSEC = D.ENCO_CONSEC AND ENCO_FECHA >= :INICIO AND ENCO_FECHA <= :FINAL AND
        ((CODE_CREDITO <> 0) or (CODE_DEBITO <> 0))
        GROUP BY D.TERC_NIT
        INTO :NIT, :PAGO, :debitos, :creditos
        DO
        BEGIN
        if (NATUR = 'D') then
            pago = debitos;
        if (NATUR = 'C') then
            pago = creditos;
        execute procedure TOTAL_PAGOS_TERCERO_ANO (:NIT, :INICIO, :FINAL) returning_values (:TOTALTERC);
        if ((TOTALTERC >= :MINIMO) AND (PAGO > 0)) then
            BEGIN
            SELECT TERC_NOM, TERC_NOMBRE1, TERC_NOMBRE2, TERC_APELLIDO1, TERC_APELLIDO2, TERC_DV, TIID_CODIGO,
                TERC_DIR, SUBSTR(CIUD_COD,1,2), SUBSTR(CIUD_COD,3,5), PAIS_ID
                FROM TERCEROS T left outer join TIPO_ID IT on (T.TERC_TIPOID = IT.TIID_COD) WHERE TERC_NIT = :NIT
                INTO :RAZONSOCIAL, :NOMBRE1, :NOMBRE2, :APELLIDO1, :APELLIDO2, :DV, :TIPODOC, :DIRECCION, :DEPARTAMENTO, :MUNICIPIO, :PAIS;
            ITEM = ITEM + 1;
            insert into medios_magneticos_datos (memg_formato, memg_ano, memg_item, memg_concepto, memg_tipodoc, memg_nit, memg_dv,memg_apellido1, memg_apellido2, 
                memg_nombre1, memg_nombre2, memg_razonsocial, memg_direccion, memg_departamento, memg_municipio, memg_pago, memg_pais)
                values (1001, substr(:inicio,1,4), :item,  :concepto, :tipodoc, :nit, :dv, :apellido1, :apellido2,
                :nombre1, :nombre2, :razonsocial, :direccion, :departamento, :municipio, :pago, :pais);
            END
        ELSE
            MENORCUANTIA = MENORCUANTIA + PAGO;
        END
    if (MENORCUANTIA <> 0) then
        BEGIN
        ITEM = ITEM + 1;
        insert into medios_magneticos_datos (memg_formato, memg_ano, memg_item, memg_concepto, memg_tipodoc, memg_nit, memg_dv,memg_apellido1, memg_apellido2,
            memg_nombre1, memg_nombre2, memg_razonsocial, memg_direccion, memg_departamento, memg_municipio, memg_pago, memg_pais)
            values (1001, substr(:inicio,1,4), :item,  :concepto, 43, '222222222', '', '', '',
            '', '', 'CUANTIAS MENORES', :dirmenor, :depmenor, :munmenor, :menorcuantia, :paismenor);
        END
    END

end

^

SET TERM ; ^



update revision set revi_FECHA = '2009/03/28';
COMMIT WORK;

/* 20090329: vendedores por sucursal para aktivia */
SET TERM ^ ;

CREATE OR ALTER PROCEDURE AKTIVIA_CLIENTES
RETURNS (
    CODCLIE VARCHAR(20),
    NOM VARCHAR(60),
    CODSUC VARCHAR(10),
    DIR VARCHAR(60),
    TEL VARCHAR(40),
    EMAIL VARCHAR(100),
    NIT VARCHAR(20),
    FPAGO INTEGER,
    SUBZONA VARCHAR(2),
    CUPO NUMERIC(18,2),
    CEL VARCHAR(25),
    LISTA INTEGER,
    GRUPO INTEGER,
    CIU VARCHAR(40),
    CODCIU VARCHAR(6),
    ZONA VARCHAR(2),
    VEND INTEGER,
    COBR INTEGER)
AS
BEGIN
subzona = '';
for select t.terc_nit,terc_nom,terc_dir,terc_ciu,terc_tel,terc_email,terc_cel,c.clie_cod,s.zona_cod,c.clie_cupo,s.vend_cod, s.cobr_cod, c.lipr_cod, c.clie_dias,T.ciud_cod, s.clcu_cod, c.grca_cod
    from terceros t,clientes c, cliente_sucursales s
    where t.terc_nit = c.terc_nit and s.terc_nit = c.terc_nit AND C.clie_estado = 'A'
    order by t.terc_nit, s.clcu_cod
    into :nit, :nom, :dir, :ciu, :tel, :email, :cel, :codclie, :zona, :cupo, :vend, :cobr, :lista, :fpago, :codciu, :codsuc, :grupo
    do
    begin
    if (LISTA IS NULL) then
        EXECUTE PROCEDURE lee_configuracion ('FACTURACION','FACTURAS', 'CODIGO DE LA LISTA DE PRECIOS A MOSTRAR EN ARTICULOS') returning_values (:LISTA);
    if (GRUPO IS NULL) then
        GRUPO = 1;
    if (fpago > 0) then
        FPAGO = 1;
    suspend;
    end
end
^

SET TERM ; ^



/* 20090330: nomlista mal en clientes sin sucursales */
SET TERM ^ ;

CREATE OR ALTER PROCEDURE REP_CLIENTES(
    DESDE VARCHAR(20),
    HASTA VARCHAR(20),
    ZONINI VARCHAR(5),
    ZONFIN VARCHAR(5),
    VENINI INTEGER,
    VENFIN INTEGER,
    AGRUPA CHAR(1),
    ORDEN CHAR(1),
    INACTIVOS CHAR(1))
RETURNS (
    NIT VARCHAR(20),
    NOM VARCHAR(60),
    SUC VARCHAR(10),
    DIR VARCHAR(60),
    CIU VARCHAR(40),
    TEL VARCHAR(40),
    CONTACTO VARCHAR(60),
    OBS VARCHAR(255),
    EMAIL VARCHAR(100),
    FAX VARCHAR(25),
    CEL VARCHAR(25),
    CODCLIE VARCHAR(20),
    CODCIU VARCHAR(6),
    ZONA VARCHAR(2),
    ESTADO CHAR(1),
    RTEFTE NUMERIC(9,4),
    RTEIVA NUMERIC(9,4),
    RTEICA NUMERIC(9,4),
    RTFTEBASE NUMERIC(18,2),
    DTOMAX NUMERIC(9,4),
    CUPO NUMERIC(18,2),
    COBR INTEGER,
    VEND INTEGER,
    ANIV DATE,
    CLIDESDE DATE,
    LISTA INTEGER,
    DIAS INTEGER,
    DIASBLOQ INTEGER,
    DETALLE CHAR(1),
    NOMLISTA VARCHAR(30),
    NOMVEND VARCHAR(60),
    NOMCOBR VARCHAR(60),
    NOMZONA VARCHAR(60),
    NOMCIUD VARCHAR(60),
    CTACLIE VARCHAR(20),
    CTAVNTA VARCHAR(20),
    CTARTFTE VARCHAR(20),
    CTARTIVA VARCHAR(20),
    CTARTICA VARCHAR(20))
AS
declare variable NITINI VARCHAR(20);
declare variable NITFIN VARCHAR(20);
declare variable NOMINI VARCHAR(20);
declare variable NOMFIN VARCHAR(20);
declare variable NUMROWS INTEGER;
begin
if (ORDEN = 'C') then
    BEGIN
    NITINI = DESDE;
    NITFIN = HASTA;
    NOMINI = '';
    NOMFIN = 'zz';
    END
ELSE
    BEGIN
    NOMINI = DESDE;
    NOMFIN = HASTA;
    NITINI = '';
    NITFIN = 'zz';
    END

for select t.terc_nit,terc_nom,terc_dir,terc_ciu,terc_tel,terc_contacto,SUBSTRING(TERC_OBS FROM 1 FOR 255),
    terc_email,terc_fax,terc_cel,c.clie_cod,c.zona_cod,c.clie_estado,c.clie_rtefte,c.clie_rteiva,c.clie_rteica,c.clie_rtftebase,c.clie_dtomax,
    c.clie_cupo,c.vend_cod, c.cobr_cod, c.clie_aniv, c.clie_fecha, c.lipr_cod, c.clie_dias, c.clie_diasbloq, c.clie_detalle,
    terc_ctartfte,terc_ctartiva,terc_ctartica,terc_ctaventa,terc_ctacliente, T.ciud_cod
    from terceros t,clientes c where t.terc_nit = c.terc_nit and t.terc_nit >= :nitini and t.terc_nit <= :nitfin and terc_nom >= :nomini and terc_nom <= :nomfin
    into :nit, :nom, :dir, :ciu, :tel, :contacto, :obs,
    :email, :fax, :cel, :codclie, :zona, :estado, :rtefte, :rteiva, :rteica,
    :rtftebase, :dtomax, :cupo, :vend, :cobr, :aniv, :clidesde, :lista, :dias, :diasbloq, :detalle,
    :ctartfte, :ctartiva, :ctartica, :ctavnta, :ctaclie, :codciu
    do
    begin
    if ((inactivos = 'S') or (estado <> 'I'))  then
        begin
        SUC = '';
        nomlista = '';
        select lipr_nom from LISTA_PRECIOS where lipr_cod = :lista into nomlista;
        SELECT COUNT(*) FROM CLIENTE_SUCURSALES WHERE TERC_NIT = :NIT INTO :NUMROWS;
        if (NUMROWS > 1) then
            BEGIN
            FOR SELECT CLCU_COD, CLSU_NOMBRE, CLSU_DIR, CLSU_CIUDAD, CLSU_TEL, SUBSTRING(CLSU_OBS FROM 1 FOR 255), VEND_COD, COBR_COD, ZONA_COD
                FROM cliente_sucursales WHERE TERC_NIT = :NIT ORDER BY CLCU_COD
                INTO :SUC, :nom, :dir, :ciu, :tel, :obs, :vend, :cobr, :zona
                DO
                BEGIN
                nomzona = '';
                nomcobr = '';
                nomciud = '';
                nomvend = '';
                select zona_nom from zonas where zona_cod = :zona into :nomzona;
                select cobr_nom from cobradores where cobr_cod = :cobr into nomcobr;
                select vend_nombre from vendedores where vend_cod = :vend into nomvend;
                select ciud_nom from ciudades where ciud_cod = :nomcobr into nomciud;
                if (AGRUPA = 'V') then
                  begin
                  if ((vend >= :venini) and (vend <= :venfin)) then
                    suspend;
                  end
                else
                  if (AGRUPA = 'B') then
                    begin
                    if ((cobr >= :venini) and (cobr <= :venfin)) then
                        suspend;
                    end
                  else
                    if (AGRUPA = 'Z') then
                      begin
                      if ((zona >= :zonini) and (zona <= :zonfin)) then
                        suspend;
                      end
                    else
                      if (AGRUPA = 'C') then
                        begin
                        if ((codciu >= :zonini) and (codciu <= :zonfin)) then
                          suspend;
                        end
                      else
                        suspend;
                end
            END
        ELSE
            BEGIN
            nomzona = '';
            nomcobr = '';
            nomciud = '';
            nomvend = '';
            select zona_nom from zonas where zona_cod = :zona into :nomzona;
            select cobr_nom from cobradores where cobr_cod = :cobr into nomcobr;
            select vend_nombre from vendedores where vend_cod = :vend into nomvend;
            select ciud_nom from ciudades where ciud_cod = :nomcobr into nomciud;
            if (AGRUPA = 'V') then
                begin
                if ((vend >= :venini) and (vend <= :venfin)) then
                    suspend;
                end
            else
                if (AGRUPA = 'B') then
                    begin
                    if ((cobr >= :venini) and (cobr <= :venfin)) then
                        suspend;
                    end
                else
                    if (AGRUPA = 'Z') then
                      begin
                      if ((zona >= :zonini) and (zona <= :zonfin)) then
                        suspend;
                      end
                    else
                      if (AGRUPA = 'C') then
                        begin
                        if ((codciu >= :zonini) and (codciu <= :zonfin)) then
                          suspend;
                        end
                      else
                        suspend;
            END
        end
    end
end
^

SET TERM ; ^



/* 20090331: MM1001 MAL SI LAS CUENTAS X CONCEPTO NO SON AFECTABLES */
SET TERM ^ ;

CREATE OR ALTER PROCEDURE TOTAL_PAGOS_TERCERO_ANO(
    NIT VARCHAR(20),
    INI CHAR(8),
    FIN CHAR(8))
RETURNS (
    TOTAL NUMERIC(18,2))
AS
begin
SELECT SUM(CODE_DEBITO-CODE_CREDITO) FROM COMPROBANTE_DETALLE D, COMPROBANTE_ENCABEZADO E, mediosmag_cuentas M, configura_mediosmag C
    WHERE C.come_formato = 1001 AND C.come_item = M.mmcu_item AND SUBSTR(D.CUEN_COD,1,STRLEN(M.mmcu_cuenta)) = M.mmcu_cuenta AND
    E.ENCO_CONSEC = D.ENCO_CONSEC AND ENCO_FECHA >= :INI AND ENCO_FECHA <= :FIN AND
    D.TERC_NIT = :NIT INTO :TOTAL;
suspend;
end
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE MM_1001(
    INICIO CHAR(8),
    FINAL CHAR(8))
AS
declare variable IDCONC INTEGER;
declare variable CONCEPTO INTEGER;
declare variable TIPODOC INTEGER;
declare variable NIT VARCHAR(15) CHARACTER SET NONE;
declare variable DV CHAR(1) CHARACTER SET NONE;
declare variable APELLIDO1 VARCHAR(60) CHARACTER SET NONE;
declare variable APELLIDO2 VARCHAR(60) CHARACTER SET NONE;
declare variable NOMBRE1 VARCHAR(60) CHARACTER SET NONE;
declare variable NOMBRE2 VARCHAR(60) CHARACTER SET NONE;
declare variable RAZONSOCIAL VARCHAR(450) CHARACTER SET NONE;
declare variable DIRECCION VARCHAR(200) CHARACTER SET NONE;
declare variable DEPARTAMENTO CHAR(2) CHARACTER SET NONE;
declare variable MUNICIPIO CHAR(3) CHARACTER SET NONE;
declare variable PAIS CHAR(3) CHARACTER SET NONE;
declare variable PAGO NUMERIC(18,0);
declare variable DEBITOS NUMERIC(18,2);
declare variable CREDITOS NUMERIC(18,2);
declare variable MINIMO NUMERIC(18,2);
declare variable MENORCUANTIA NUMERIC(18,2);
declare variable TOTALTERC NUMERIC(18,2);
declare variable ITEM integer;
declare variable DIRMENOR VARCHAR(200) CHARACTER SET NONE;
declare variable DEPMENOR CHAR(2) CHARACTER SET NONE;
declare variable MUNMENOR CHAR(3) CHARACTER SET NONE;
declare variable PAISMENOR CHAR(3) CHARACTER SET NONE;
declare variable NATUR CHAR(1);
begin /*$$IBE$$ 
EXECUTE PROCEDURE lee_configuracion('CONTABILIDAD', 'GENERAL', 'NIT COMPAÑIA') returning_values (:NIT);
SELECT TERC_DIR, SUBSTR(CIUD_COD,1,2), SUBSTR(CIUD_COD,3,5), PAIS_ID FROM TERCEROS WHERE TERC_NIT = :NIT
    INTO :dirmenor, :depmenor, :munmenor, :paismenor;
ITEM = 0;
FOR SELECT COME_ITEM, COME_RESPUESTA, COME_MINIMO, COME_NATUR FROM CONFIGURA_MEDIOSMAG
    WHERE COME_FORMATO = '1001' INTO :idconc, :CONCEPTO , :MINIMO, :NATUR
    DO
    BEGIN
    MENORCUANTIA = 0;
    FOR SELECT MAX(D.TERC_NIT), SUM(CODE_DEBITO-CODE_CREDITO), SUM(CODE_DEBITO), SUM(CODE_CREDITO)
        FROM COMPROBANTE_DETALLE D, COMPROBANTE_ENCABEZADO E, mediosmag_cuentas M
        WHERE M.mmcu_item = :idconc AND SUBSTR(CUEN_COD,1,STRLEN(M.mmcu_cuenta)) = M.mmcu_cuenta AND
        E.ENCO_CONSEC = D.ENCO_CONSEC AND ENCO_FECHA >= :INICIO AND ENCO_FECHA <= :FINAL AND
        ((CODE_CREDITO <> 0) or (CODE_DEBITO <> 0))
        GROUP BY D.TERC_NIT
        INTO :NIT, :PAGO, :debitos, :creditos
        DO
        BEGIN
        if (NATUR = 'D') then
            pago = debitos;
        if (NATUR = 'C') then
            pago = creditos;
        execute procedure TOTAL_PAGOS_TERCERO_ANO (:NIT, :INICIO, :FINAL) returning_values (:TOTALTERC);
        if ((TOTALTERC >= :MINIMO) AND (PAGO > 0)) then
            BEGIN
            SELECT TERC_NOM, TERC_NOMBRE1, TERC_NOMBRE2, TERC_APELLIDO1, TERC_APELLIDO2, TERC_DV, TIID_CODIGO,
                TERC_DIR, SUBSTR(CIUD_COD,1,2), SUBSTR(CIUD_COD,3,5), PAIS_ID
                FROM TERCEROS T left outer join TIPO_ID IT on (T.TERC_TIPOID = IT.TIID_COD) WHERE TERC_NIT = :NIT
                INTO :RAZONSOCIAL, :NOMBRE1, :NOMBRE2, :APELLIDO1, :APELLIDO2, :DV, :TIPODOC, :DIRECCION, :DEPARTAMENTO, :MUNICIPIO, :PAIS;
            ITEM = ITEM + 1;
            insert into medios_magneticos_datos (memg_formato, memg_ano, memg_item, memg_concepto, memg_tipodoc, memg_nit, memg_dv,memg_apellido1, memg_apellido2, 
                memg_nombre1, memg_nombre2, memg_razonsocial, memg_direccion, memg_departamento, memg_municipio, memg_pago, memg_pais)
                values (1001, substr(:inicio,1,4), :item,  :concepto, :tipodoc, :nit, :dv, :apellido1, :apellido2,
                :nombre1, :nombre2, :razonsocial, :direccion, :departamento, :municipio, :pago, :pais);
            END
        ELSE
            MENORCUANTIA = MENORCUANTIA + PAGO;
        END
    if (MENORCUANTIA <> 0) then
        BEGIN
        ITEM = ITEM + 1;
        insert into medios_magneticos_datos (memg_formato, memg_ano, memg_item, memg_concepto, memg_tipodoc, memg_nit, memg_dv,memg_apellido1, memg_apellido2,
            memg_nombre1, memg_nombre2, memg_razonsocial, memg_direccion, memg_departamento, memg_municipio, memg_pago, memg_pais)
            values (1001, substr(:inicio,1,4), :item,  :concepto, 43, '222222222', '', '', '',
            '', '', 'CUANTIAS MENORES', :dirmenor, :depmenor, :munmenor, :menorcuantia, :paismenor);
        END
    END

 $$IBE$$*/ EXIT;
end
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE MM_1001(
    INICIO CHAR(8),
    FINAL CHAR(8))
AS
declare variable IDCONC INTEGER;
declare variable CONCEPTO INTEGER;
declare variable TIPODOC INTEGER;
declare variable NIT VARCHAR(15) CHARACTER SET NONE;
declare variable DV CHAR(1) CHARACTER SET NONE;
declare variable APELLIDO1 VARCHAR(60) CHARACTER SET NONE;
declare variable APELLIDO2 VARCHAR(60) CHARACTER SET NONE;
declare variable NOMBRE1 VARCHAR(60) CHARACTER SET NONE;
declare variable NOMBRE2 VARCHAR(60) CHARACTER SET NONE;
declare variable RAZONSOCIAL VARCHAR(450) CHARACTER SET NONE;
declare variable DIRECCION VARCHAR(200) CHARACTER SET NONE;
declare variable DEPARTAMENTO CHAR(2) CHARACTER SET NONE;
declare variable MUNICIPIO CHAR(3) CHARACTER SET NONE;
declare variable PAIS CHAR(3) CHARACTER SET NONE;
declare variable PAGO NUMERIC(18,0);
declare variable DEBITOS NUMERIC(18,2);
declare variable CREDITOS NUMERIC(18,2);
declare variable MINIMO NUMERIC(18,2);
declare variable MENORCUANTIA NUMERIC(18,2);
declare variable TOTALTERC NUMERIC(18,2);
declare variable ITEM integer;
declare variable DIRMENOR VARCHAR(200) CHARACTER SET NONE;
declare variable DEPMENOR CHAR(2) CHARACTER SET NONE;
declare variable MUNMENOR CHAR(3) CHARACTER SET NONE;
declare variable PAISMENOR CHAR(3) CHARACTER SET NONE;
declare variable NATUR CHAR(1);
begin
EXECUTE PROCEDURE lee_configuracion('CONTABILIDAD', 'GENERAL', 'NIT COMPAÑIA') returning_values (:NIT);
SELECT TERC_DIR, SUBSTR(CIUD_COD,1,2), SUBSTR(CIUD_COD,3,5), PAIS_ID FROM TERCEROS WHERE TERC_NIT = :NIT
    INTO :dirmenor, :depmenor, :munmenor, :paismenor;
ITEM = 0;
FOR SELECT COME_ITEM, COME_RESPUESTA, COME_MINIMO, COME_NATUR FROM CONFIGURA_MEDIOSMAG
    WHERE COME_FORMATO = '1001' INTO :idconc, :CONCEPTO , :MINIMO, :NATUR
    DO
    BEGIN
    MENORCUANTIA = 0;
    FOR SELECT MAX(D.TERC_NIT), SUM(CODE_DEBITO-CODE_CREDITO), SUM(CODE_DEBITO), SUM(CODE_CREDITO)
        FROM COMPROBANTE_DETALLE D, COMPROBANTE_ENCABEZADO E, mediosmag_cuentas M
        WHERE M.mmcu_item = :idconc AND SUBSTR(CUEN_COD,1,STRLEN(M.mmcu_cuenta)) = M.mmcu_cuenta AND
        E.ENCO_CONSEC = D.ENCO_CONSEC AND ENCO_FECHA >= :INICIO AND ENCO_FECHA <= :FINAL AND
        ((CODE_CREDITO <> 0) or (CODE_DEBITO <> 0))
        GROUP BY D.TERC_NIT
        INTO :NIT, :PAGO, :debitos, :creditos
        DO
        BEGIN
        if (NATUR = 'D') then
            pago = debitos;
        if (NATUR = 'C') then
            pago = creditos;
        execute procedure TOTAL_PAGOS_TERCERO_ANO (:NIT, :INICIO, :FINAL) returning_values (:TOTALTERC);
        if ((TOTALTERC >= :MINIMO) AND (PAGO > 0)) then
            BEGIN
            SELECT TERC_NOM, TERC_NOMBRE1, TERC_NOMBRE2, TERC_APELLIDO1, TERC_APELLIDO2, TERC_DV, TIID_CODIGO,
                TERC_DIR, SUBSTR(CIUD_COD,1,2), SUBSTR(CIUD_COD,3,5), PAIS_ID
                FROM TERCEROS T left outer join TIPO_ID IT on (T.TERC_TIPOID = IT.TIID_COD) WHERE TERC_NIT = :NIT
                INTO :RAZONSOCIAL, :NOMBRE1, :NOMBRE2, :APELLIDO1, :APELLIDO2, :DV, :TIPODOC, :DIRECCION, :DEPARTAMENTO, :MUNICIPIO, :PAIS;
            ITEM = ITEM + 1;
            insert into medios_magneticos_datos (memg_formato, memg_ano, memg_item, memg_concepto, memg_tipodoc, memg_nit, memg_dv,memg_apellido1, memg_apellido2, 
                memg_nombre1, memg_nombre2, memg_razonsocial, memg_direccion, memg_departamento, memg_municipio, memg_pago, memg_pais)
                values (1001, substr(:inicio,1,4), :item,  :concepto, :tipodoc, :nit, :dv, :apellido1, :apellido2,
                :nombre1, :nombre2, :razonsocial, :direccion, :departamento, :municipio, :pago, :pais);
            END
        ELSE
            MENORCUANTIA = MENORCUANTIA + PAGO;
        END
    if (MENORCUANTIA <> 0) then
        BEGIN
        ITEM = ITEM + 1;
        insert into medios_magneticos_datos (memg_formato, memg_ano, memg_item, memg_concepto, memg_tipodoc, memg_nit, memg_dv,memg_apellido1, memg_apellido2,
            memg_nombre1, memg_nombre2, memg_razonsocial, memg_direccion, memg_departamento, memg_municipio, memg_pago, memg_pais)
            values (1001, substr(:inicio,1,4), :item,  :concepto, 43, '222222222', '', '', '',
            '', '', 'CUANTIAS MENORES', :dirmenor, :depmenor, :munmenor, :menorcuantia, :paismenor);
        END
    END

end

^

SET TERM ; ^



/* 20090401 : UNIDADES ALTERNATIVAS Y PRINCIPALES SEPARADAS (CAJAS/UNIDADES) */
SET TERM ^ ;

CREATE OR ALTER PROCEDURE IMPR_FACTURA(
    ID INTEGER)
RETURNS (
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    VENCE DATE,
    DIASVENCE INTEGER,
    CONTCRED CHAR(17),
    NIT VARCHAR(20),
    NOMTERCERO VARCHAR(60),
    NOMCLIENTE VARCHAR(60),
    VENDEDOR INTEGER,
    NOMVENDEDOR VARCHAR(60),
    PUNTOVTA INTEGER,
    NOMPUNTOVTA VARCHAR(30),
    CODBODEGA VARCHAR(2),
    NOMBODEGA VARCHAR(30),
    AUTORIZACION VARCHAR(20),
    DESPACHO VARCHAR(255),
    TRANSPORTADOR VARCHAR(60),
    COTIZACION VARCHAR(30),
    PEDIDO VARCHAR(30),
    REMISION VARCHAR(30),
    PACIENTE VARCHAR(20),
    NOMPACIENTE VARCHAR(60),
    COMIPORC NUMERIC(9,2),
    COMIMONTO NUMERIC(18,2),
    SUBTOTAL NUMERIC(18,2),
    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),
    EXTRA NUMERIC(18,2),
    DTOFPORC NUMERIC(9,2),
    DTOFMONTO NUMERIC(18,2),
    FECHADTO DATE,
    TOTALFAC NUMERIC(18,2),
    TOTALPAGAR NUMERIC(18,2),
    OBS BLOB SUB_TYPE 1 SEGMENT SIZE 80,
    ITEM INTEGER,
    ARTICULO VARCHAR(15),
    CODBAR VARCHAR(15),
    ARTIDES VARCHAR(60),
    DESCORTA VARCHAR(30),
    CANT NUMERIC(18,4),
    LOTE VARCHAR(15),
    VLOTE DATE,
    UNIDAD VARCHAR(8),
    CAJAS NUMERIC(18,4),
    FACTOR NUMERIC(18,4),
    LISTAPR INTEGER,
    REFITEM VARCHAR(60),
    BODITEM VARCHAR(2),
    STAND VARCHAR(15),
    PRUNIT NUMERIC(18,2),
    DTOITPORC NUMERIC(9,2),
    DTOITMONTO NUMERIC(18,2),
    PRNETO NUMERIC(18,2),
    PRNETOSINIVA NUMERIC(18,2),
    DTOIT1 NUMERIC(9,2),
    DTOIT2 NUMERIC(9,2),
    DTOIT3 NUMERIC(9,2),
    IVAPORC NUMERIC(9,2),
    IVAITMONTO NUMERIC(18,2),
    CONSUMO NUMERIC(18,2),
    SUBTOTIT NUMERIC(18,2),
    TOTAL NUMERIC(18,2),
    CODIGOCL VARCHAR(20),
    ZONACOD VARCHAR(2),
    ZONANOM VARCHAR(60),
    DV CHAR(1),
    DIRECCION VARCHAR(60),
    CIUDAD VARCHAR(40),
    TELEFONO VARCHAR(40),
    CONTACTO VARCHAR(60),
    FAX VARCHAR(25),
    CEL VARCHAR(25),
    GRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    SUBGRUPO VARCHAR(3),
    NOMSUBG VARCHAR(30),
    MARCA VARCHAR(3),
    NOMMARCA VARCHAR(30),
    PESO NUMERIC(18,4),
    ANCHO NUMERIC(18,4),
    ALTO NUMERIC(18,4),
    LARGO NUMERIC(18,4),
    SUMA1 NUMERIC(18,2),
    SUMA2 NUMERIC(18,2),
    SUMA3 NUMERIC(18,2),
    IVA1 NUMERIC(18,2),
    IVA2 NUMERIC(18,2),
    IVA3 NUMERIC(18,2),
    SUMAEX NUMERIC(18,2),
    SUMAGR NUMERIC(18,2),
    TOTCONSUMO NUMERIC(18,2),
    DTOIT1M NUMERIC(18,2),
    DTOIT2M NUMERIC(18,2),
    DTOIT3M NUMERIC(18,2),
    TOTCAJAS NUMERIC(18,2),
    VEHICULO VARCHAR(8),
    RECIBIDO NUMERIC(18,2),
    CAMBIO NUMERIC(18,2),
    HORA TIME,
    FORMAPAGO1 VARCHAR(30),
    MONTOPAGO1 NUMERIC(18,2),
    FORMAPAGO2 VARCHAR(30),
    MONTOPAGO2 NUMERIC(18,2),
    FORMAPAGO3 VARCHAR(30),
    MONTOPAGO3 NUMERIC(18,2),
    PUNTOS INTEGER,
    PUNTOSACUM INTEGER,
    PUNTOSVENC INTEGER,
    FECPTOS DATE,
    OBSITEM BLOB SUB_TYPE 1 SEGMENT SIZE 80,
    SUCUR VARCHAR(10),
    ALTERNATIVAS NUMERIC(18,4),
    PRINCIPALES NUMERIC(18,4))
AS
DECLARE VARIABLE IMPTOS CHAR(1);
DECLARE VARIABLE TARIFA INTEGER;
declare variable DEVUELTO NUMERIC(18,2);
declare variable ORDENCOD CHAR(2);
declare variable IMPRDEV CHAR(2);
declare variable IMPR CHAR(1);
declare variable ITEMFP INTEGER;
declare variable FORMAP VARCHAR(30);
declare variable MONTOP NUMERIC(18,2);
declare variable ICOINC CHAR(2);
declare variable DTOITM1 NUMERIC(18,2);
declare variable DTOITM2 NUMERIC(18,2);
declare variable DTOITM3 NUMERIC(18,2);
declare variable DTOITE3 CHAR(2);
declare variable SUMDTOIT NUMERIC(18,2);
declare variable AUTORET VARCHAR(10);
declare variable FAUTORET DATE;
declare variable FACTCANT NUMERIC(18,4);
BEGIN
execute procedure lee_configuracion('FACTURACION', 'ARTICULOS', 'IMPOCONSUMO INCLUIDO EN EL PRECIO BASE DE VENTA ANTES DE IVA') returning_values (icoinc);
execute procedure lee_configuracion('FACTURACION', 'FACTURAS', 'COLUMNAS DE DESCUENTO POR ITEM ADICIONALES') returning_values (DTOITE3);
SELECT F.PREF_PRE, FACT_NUMERO, FACT_FECHA, FACT_VENCE, F.BODE_COD, BODE_NOM, F.TERC_NIT, FACT_NOMCLIENTE, F.VEND_COD, VEND_NOMBRE, F.PTVT_ID, PTVT_NOM,
    AUTO_NUMERO, FACT_DESPACHO, FACT_TRANSP, FACT_COTIZACI, FACT_PEDIDO, FACT_REMISION, FACT_COMIPORC, FACT_COMIMONTO, FACT_IVAINC, 
    FACT_DTOPOR, FACT_DTOMONTO, FACT_ADICIONAL, FACT_IVAMONTO, FACT_RTFTEPOR, FACT_RTFTEMONTO, FACT_RTIVAPOR, FACT_RTIVAMONTO, FACT_RTICAPOR, FACT_RTICAMONTO, FACT_EXTRA, FACT_DTOFPOR, FACT_DTOFMONTO, FACT_DTOFFECHA, FACT_TOTAL,
    TERC_DIR, TERC_CIU, TERC_TEL, TERC_CONTACTO, TERC_FAX, TERC_DV, TERC_CEL, FACT_DTOIT1, FACT_DTOIT2, FACT_DTOIT3,
    FACT_OBS, VEHI_COD, /*FACT_NROCOPIA,*/ FACT_RECIBIDO, FACT_SUCURSAL, FACT_DETCLI, FACT_DETCLINOM, TERC_NOM
    FROM FACTURAS F, BODEGA B, VENDEDORES V, PUNTO_VENTA P, TERCEROS T
    WHERE F.BODE_COD = B.BODE_COD AND F.VEND_COD = V.VEND_COD AND F.PTVT_ID = P.PTVT_ID AND F.TERC_NIT = T.TERC_NIT AND F.FACT_ID = :ID
    into :PREF, :NUMERO, :FECHA, :VENCE, :CODBODEGA, :NOMBODEGA, :NIT, :NOMTERCERO, :VENDEDOR, :NOMVENDEDOR, :PUNTOVTA, :NOMPUNTOVTA,
    :AUTORIZACION, :DESPACHO, :TRANSPORTADOR, :COTIZACION, :PEDIDO, :REMISION, :COMIPORC, :COMIMONTO, :IMPTOS,
    :DTOPORC, :DTOMONTO, :ADICIONAL, :IVAMONTO, :RTEFTEPORC, :RTEFTEMONTO, :RTEIVAPORC, :RTEIVAMONTO, :RTEICAPORC, :RTEICAMONTO, :EXTRA, :DTOFPORC, :DTOFMONTO, :FECHADTO, :TOTALFAC,
    :DIRECCION, :CIUDAD, :TELEFONO, :CONTACTO, :FAX, :DV, :CEL, :dtoit1m, :dtoit2m, :dtoit3m,
    :OBS, :VEHICULO,/* :NROCOPIA,*/ :RECIBIDO, :SUCUR, :paciente, :nompaciente, :nomcliente;

/* ACUMULE LOS PUNTOS, SE HACE ACA POR SER POSTERIOR AL DETALLE */
EXECUTE PROCEDURE acumula_puntos_cliente (31, :id, :nit, :fecha) returning_values (:PUNTOS);
EXECUTE PROCEDURE consulta_puntos_cliente (:id, :nit, :fecha) returning_values (:puntos, :puntosacum, :puntosvenc, :fecptos);
if (DTOIT1M IS NULL) then
    DTOIT1M = 0;
if (DTOIT2M IS NULL) then
    DTOIT2M = 0;
if (DTOIT3M IS NULL) then
    DTOIT3M = 0;
SELECT CLIE_COD, C.ZONA_COD, ZONA_NOM
    FROM CLIENTES C, ZONAS Z
    WHERE TERC_NIT = :NIT AND C.ZONA_COD = Z.ZONA_COD
    INTO :CODIGOCL, :ZONACOD, :ZONANOM;
SELECT CLSU_DIR, CLSU_CIUDAD, CLSU_TEL FROM CLIENTE_SUCURSALES WHERE TERC_NIT = :NIT AND CLCU_COD = :SUCUR
    INTO :DIRECCION, :CIUDAD, :TELEFONO;
DIASVENCE = VENCE - FECHA;
if (DIASVENCE > 0) then
    CONTCRED = 'CREDITO ' || CAST(DIASVENCE AS VARCHAR(3)) || ' DIAS';
ELSE
    CONTCRED = 'CONTADO';
SUBTOTAL = TOTALFAC - EXTRA - IVAMONTO - ADICIONAL + DTOMONTO;
if (DTOITE3 = 'SI') then
    BEGIN
    SELECT SUM(FADE_DTOMONTO) FROM FACTURAS_DETALLE WHERE FACT_ID = :id INTO :sumdtoit;
    SUBTOTAL = SUBTOTAL + sumdtoit + dtoit1m + dtoit2m + dtoit3m;
    END
EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'FECHA AUTORETENEDOR NO DESCONTAR RETENCIONES DEL SALDO PERO SI CONTABILIZARLAS') returning_values (AUTORET);
if (AUTORET <> '') then
    FAUTORET = CAST(AUTORET AS DATE);
else
    FAUTORET = '9999/12/31';
if (FECHA > fautoret) then
    TOTALPAGAR = TOTALFAC - RTEIVAMONTO - RTEICAMONTO;
ELSE
    TOTALPAGAR = TOTALFAC - RTEFTEMONTO - RTEIVAMONTO - RTEICAMONTO;
if (RECIBIDO <> 0) then
    CAMBIO = RECIBIDO - totalpagar;
ELSE
    CAMBIO = 0;
SUMAEX = 0;
SUMA1 = 0;
SUMA2 = 0;
SUMA3 = 0;
IVA1 = 0;
IVA2 = 0;
IVA3 = 0;
TOTCONSUMO = 0;
MONTOPAGO1 = 0;
SELECT MAX(AUDI_HORA) FROM AUDITORIA WHERE TIDO_COD = 31 AND AUDI_IDDOC = :ID AND AUDI_OPER = 'I' INTO :HORA;
/* AHORA LAS FORMAS DE PAGO, BUSQUE EL ABONO DE HOY A LA FACTURA */
ITEMFP = 1;
MONTOPAGO1 = 0;
MONTOPAGO2 = 0;
MONTOPAGO3 = 0;
FOR SELECT FOPA_NOM, RCPA_MONTO FROM RECIBOS_CAJA_PAGO P, FORMAS_PAGO F, RECIBOS_CAJA R, RECIBOS_CAJA_DETALLE D
    WHERE R.RECA_ID = P.RECA_ID AND R.RECA_ID = D.RECA_ID AND P.FOPA_ID = F.FOPA_ID AND RECA_FECHA = :FECHA AND RCDE_TIPODOC = 31 AND RCDE_IDDOC = :ID
    INTO :formap, :MONTOP
    DO
    BEGIN
    if (ITEMFP = 1) then
        BEGIN
        FORMAPAGO1 = FORMAP;
        MONTOPAGO1 = MONTOP;
        END
    if (ITEMFP = 2) then
        BEGIN
        FORMAPAGO2 = FORMAP;
        MONTOPAGO2 = MONTOP;
        END
    if (ITEMFP = 3) then
        BEGIN
        FORMAPAGO3 = FORMAP;
        MONTOPAGO3 = MONTOP;
        END
    ITEMFP = ITEMFP + 1;
    END
EXECUTE PROCEDURE lee_configuracion ('FACTURACION','DOCUMENTOS','ORDENAR ITEMS POR CODIGO DE ARTICULO') returning_values (:ORDENCOD);
EXECUTE PROCEDURE lee_configuracion ('FACTURACION','POS', 'IMPRIMIR DEVOLUCIONES DE ARTICULOS NEGATIVOS') returning_values (:imprdev);
totcajas = 0;
if (ORDENCOD = 'SI') then
    BEGIN
    FOR SELECT FADE_ITEM, D.ARTI_COD, FADE_CODBAR, SUBSTR(FADE_DESC,1,60), ARTI_DESCORTA, FADE_CANT, FADE_UNIDAD, FADE_FACTOR, BODE_COD, FADE_LOTE, LIPR_COD, FADE_PRUNIT, FADE_DTOPORC, FADE_DTOMONTO, FADE_IVAPORC, FADE_IVAMONTO, FADE_CONSUMO, FADE_TOTAL, FADE_REFERENCIA,
        GRUP_COD, SUBG_COD, MARC_COD, ARTI_PESO, ARTI_ANCHO, ARTI_ALTO, ARTI_LARGO, TAIV_COD, FADE_DEVUELTO, FADE_OBS, FADE_DTO1, FADE_DTO2, FADE_DTO3, FADE_DTOM1, FADE_DTOM2, FADE_DTOM3, FADE_CAJAS
        FROM FACTURAS_DETALLE D, ARTICULO A
        WHERE D.ARTI_COD = A.ARTI_COD AND D.FACT_ID = :ID
        ORDER BY D.ARTI_COD
        INTO :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :DESCORTA, :CANT, :UNIDAD, :FACTOR, :BODITEM, :LOTE, :LISTAPR, :PRUNIT, :DTOITPORC, :DTOITMONTO, :IVAPORC, :IVAITMONTO, :CONSUMO, :TOTAL, :refitem,
        :GRUPO, :SUBGRUPO, :MARCA, :PESO, :ANCHO, :ALTO, :LARGO, :TARIFA, :devuelto, :obsitem, :dtoit1, :dtoit2, :dtoit3, :dtoitm1, :dtoitm2, :dtoitm3, :cajas
        DO
          BEGIN
          if (ARTICULO = CODBAR) then
            SELECT FIRST 1 COBA_COD FROM barras_articulo WHERE ARTI_COD = :articulo INTO :CODBAR;
          if (IMPRDEV <> 'SI') then
            BEGIN
            if ((CANT >= 0) AND (DEVUELTO = 0)) then
                IMPR = 'S';
            ELSE
                IMPR = 'N'; /* ES DEVOLUCION */
            END
          ELSE
            IMPR = 'S';
          if (IMPR = 'S') then
            BEGIN
            prneto = PRUNIT - DTOITMONTO - dtoitm1 - dtoitm2 - dtoitm3;
            if (IMPTOS = 'S') then
                if (cant <> 0) then
                    prnetosiniva = PRUNIT - DTOITMONTO - ((IVAITMONTO+CONSUMO) / CANT) - dtoitm1 - dtoitm2 - dtoitm3;
                else
                    prnetosiniva = PRUNIT - DTOITMONTO - dtoitm1 - dtoitm2 - dtoitm3;
            ELSE
                prnetosiniva = PRUNIT - DTOITMONTO - dtoit1m - dtoit2m - dtoit3m;
            if (ICOINC = 'SI') then
                SUBTOTIT = TOTAL - IVAITMONTO;
            else
                SUBTOTIT = TOTAL - IVAITMONTO - CONSUMO;
            TOTCONSUMO = TOTCONSUMO + CONSUMO;
            SELECT LOTE_VENCE FROM LOTES WHERE LOTE_NRO = :lote AND ARTI_COD = :ARTICULO AND BODE_COD = :boditem INTO :vlote;
            if ((REFITEM <> '.t') or (REFITEM IS NULL)) then
                BEGIN
                /* NO SUME LOS ENSAMBLES */
                if (IVAPORC = 0) then
                    SUMAEX = SUMAEX + TOTAL;
                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;
                END
            if (ANCHO IS NULL) then
                ANCHO = 0;
            if (ALTO IS NULL) then
                ALTO = 0;
            if (LARGO IS NULL) then
                LARGO = 0;
            if (PESO IS NULL) then
                PESO = 0;
            PESO = (PESO / 1000) * CANT * FACTOR;
            totcajas = totcajas + cajas;
            if (substr(ARTICULO,1,2) = '.t') then
                BEGIN
                REFITEM = '';
                TOTAL = 0;
                SUBTOTIT = 0;
                END
            SELECT STAND_COD FROM STANDS WHERE ARTI_COD = :ARTICULO AND STAND_BODEGA = :boditem INTO :stand;
            SELECT FIRST 1 UNAR_FACCAN FROM unidad_articulo WHERE ARTI_COD = :articulo INTO :factcant;
            ALTERNATIVAS = FLOOR(CANT / factcant);
            PRINCIPALES = CANT - (alternativas * factcant);
            SUSPEND;
            END
          END
    END
ELSE
    BEGIN
    FOR SELECT FADE_ITEM, D.ARTI_COD, FADE_CODBAR, SUBSTR(FADE_DESC,1,60), ARTI_DESCORTA, FADE_CANT, FADE_UNIDAD, FADE_FACTOR, BODE_COD, FADE_LOTE, LIPR_COD, FADE_PRUNIT, FADE_DTOPORC, FADE_DTOMONTO, FADE_IVAPORC, FADE_IVAMONTO, FADE_CONSUMO, FADE_TOTAL, FADE_REFERENCIA,
        GRUP_COD, SUBG_COD, MARC_COD, ARTI_PESO, ARTI_ANCHO, ARTI_ALTO, ARTI_LARGO, TAIV_COD, FADE_DEVUELTO, FADE_OBS, FADE_DTO1, FADE_DTO2, FADE_DTO3, FADE_DTOM1, FADE_DTOM2, FADE_DTOM3, FADE_CAJAS
        FROM FACTURAS_DETALLE D, ARTICULO A
        WHERE D.ARTI_COD = A.ARTI_COD AND D.FACT_ID = :ID
        ORDER BY FADE_ITEM
        INTO :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :DESCORTA, :CANT, :UNIDAD, :FACTOR, :BODITEM, :LOTE, :LISTAPR, :PRUNIT, :DTOITPORC, :DTOITMONTO, :IVAPORC, :IVAITMONTO, :CONSUMO, :TOTAL, :refitem,
        :GRUPO, :SUBGRUPO, :MARCA, :PESO, :ANCHO, :ALTO, :LARGO, :TARIFA, :devuelto, :obsitem, :dtoit1, :dtoit2, :dtoit3, :dtoitm1, :dtoitm2, :dtoitm3, :cajas
        DO
          BEGIN
          if (IMPRDEV <> 'SI') then
            BEGIN
            if ((CANT >= 0) AND (DEVUELTO = 0)) then
                IMPR = 'S';
            ELSE
                IMPR = 'N'; /* ES DEVOLUCION */
            END
          ELSE
            IMPR = 'S';
          if (IMPR = 'S') then
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :GRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :MARCA INTO NOMMARCA;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :SUBGRUPO AND GRUP_COD = :GRUPO INTO :NOMSUBG;
            prneto = PRUNIT - DTOITMONTO - dtoitm1 - dtoitm2 - dtoitm3;
            if (IMPTOS = 'S') then
                if (cant <> 0) then
                    prnetosiniva = PRUNIT - DTOITMONTO - ((IVAITMONTO+CONSUMO) / CANT) - dtoit1m - dtoit2m - dtoit3m;
                else
                    prnetosiniva = PRUNIT - DTOITMONTO - dtoitm1 - dtoitm2 - dtoitm3;
            ELSE
                prnetosiniva = PRUNIT - DTOITMONTO - dtoitm1 - dtoitm2 - dtoitm3;
            if (ICOINC = 'SI') then
                SUBTOTIT = TOTAL - IVAITMONTO;
            else
                SUBTOTIT = TOTAL - IVAITMONTO - CONSUMO;
            TOTCONSUMO = TOTCONSUMO + CONSUMO;
            SELECT LOTE_VENCE FROM LOTES WHERE LOTE_NRO = :lote AND ARTI_COD = :ARTICULO AND BODE_COD = :boditem INTO :vlote;
            if ((REFITEM <> '.t') or (REFITEM IS NULL)) then
                BEGIN
                /* NO SUME LOS ENSAMBLES */
                if (IVAPORC = 0) then
                    SUMAEX = SUMAEX + TOTAL;
                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;
                END
            if (ANCHO IS NULL) then
                ANCHO = 0;
            if (ALTO IS NULL) then
                ALTO = 0;
            if (LARGO IS NULL) then
                LARGO = 0;
            if (PESO IS NULL) then
                PESO = 0;
            PESO = (PESO / 1000)* CANT * FACTOR;
            totcajas = totcajas + cajas;
            if (substr(ARTICULO,1,2) = '.t') then
                BEGIN
                REFITEM = '';
                TOTAL = 0;
                SUBTOTIT = 0;
                END
            SELECT STAND_COD FROM STANDS WHERE ARTI_COD = :ARTICULO AND STAND_BODEGA = :boditem INTO :stand;
            SELECT FIRST 1 UNAR_FACCAN FROM unidad_articulo WHERE ARTI_COD = :articulo INTO :factcant;
            ALTERNATIVAS = FLOOR(CANT / factcant);
            PRINCIPALES = CANT - (alternativas * factcant);
            SUSPEND;
            END
          END
    END
END
^

SET TERM ; ^


SET TERM ^ ;

CREATE OR ALTER PROCEDURE IMPR_COTIZACION(
    ID INTEGER)
RETURNS (
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    VALIDEZ INTEGER,
    NIT VARCHAR(20),
    NOMTERCERO VARCHAR(60),
    VENDEDOR INTEGER,
    NOMVENDEDOR VARCHAR(60),
    PUNTOVTA INTEGER,
    NOMPUNTOVTA VARCHAR(30),
    SUBTOTAL NUMERIC(18,2),
    DTOPORC NUMERIC(9,2),
    DTOMONTO NUMERIC(18,2),
    ADICIONAL NUMERIC(18,2),
    IVAMONTO NUMERIC(18,2),
    EXTRA NUMERIC(18,2),
    TOTALFAC NUMERIC(18,2),
    OBS BLOB SUB_TYPE 1 SEGMENT SIZE 80,
    ITEM INTEGER,
    ARTICULO VARCHAR(15),
    CODBAR VARCHAR(15),
    ARTIDES VARCHAR(60),
    CANT NUMERIC(18,4),
    UNIDAD VARCHAR(8),
    FACTOR NUMERIC(18,4),
    LISTAPR INTEGER,
    REFITEM VARCHAR(60),
    PRUNIT NUMERIC(18,2),
    DTOITPORC NUMERIC(9,2),
    DTOITMONTO NUMERIC(18,2),
    PRNETO NUMERIC(18,2),
    PRNETOSINIVA NUMERIC(18,2),
    IVAPORC NUMERIC(9,2),
    IVAITMONTO NUMERIC(18,2),
    CONSUMO NUMERIC(18,2),
    SUBTOTIT NUMERIC(18,2),
    TOTAL NUMERIC(18,2),
    CODIGOCL VARCHAR(20),
    ZONACOD VARCHAR(2),
    ZONANOM VARCHAR(60),
    DV CHAR(1),
    DIRECCION VARCHAR(60),
    CIUDAD VARCHAR(40),
    TELEFONO VARCHAR(40),
    CONTACTO VARCHAR(60),
    FAX VARCHAR(25),
    CEL VARCHAR(25),
    GRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    SUBGRUPO VARCHAR(3),
    NOMSUBG VARCHAR(30),
    MARCA VARCHAR(3),
    NOMMARCA VARCHAR(30),
    PESO NUMERIC(9,4),
    ANCHO NUMERIC(18,4),
    ALTO NUMERIC(18,4),
    LARGO NUMERIC(18,4),
    SUMA1 NUMERIC(18,2),
    SUMA2 NUMERIC(18,2),
    SUMA3 NUMERIC(18,2),
    IVA1 NUMERIC(18,2),
    IVA2 NUMERIC(18,2),
    IVA3 NUMERIC(18,2),
    SUMAEX NUMERIC(18,2),
    SUMAGR NUMERIC(18,2),
    OBSITEM BLOB SUB_TYPE 1 SEGMENT SIZE 80,
    ALTERNATIVAS NUMERIC(18,4),
    PRINCIPALES NUMERIC(18,4))
AS
DECLARE VARIABLE IMPTOS CHAR(1);
DECLARE VARIABLE TARIFA INTEGER;
declare variable ORDENCOD CHAR(2);
declare variable SUCUR VARCHAR(10);
declare variable ICOINC CHAR(2);
declare variable FACTCANT NUMERIC(18,4);
BEGIN
execute procedure lee_configuracion('FACTURACION', 'ARTICULOS', 'IMPOCONSUMO INCLUIDO EN EL PRECIO BASE DE VENTA ANTES DE IVA') returning_values (icoinc);
SELECT F.PREF_PRE, COTI_NUMERO, COTI_FECHA, COTI_VALIDEZ, F.TERC_NIT, COTI_NOMTERC, F.VEND_COD, VEND_NOMBRE, F.PTVT_ID, PTVT_NOM,
    COTI_IMPTOS, COTI_DTOPORC, COTI_DTOMONTO, COTI_ADICIONAL, COTI_IVAMONTO, COTI_EXTRA, COTI_TOTAL,
    TERC_CONTACTO, TERC_FAX, TERC_DV, TERC_CEL, COTI_OBS, COTI_SUCURSAL
    FROM COTIZACIONES F, VENDEDORES V, PUNTO_VENTA P, TERCEROS T
    WHERE F.VEND_COD = V.VEND_COD AND F.PTVT_ID = P.PTVT_ID AND F.TERC_NIT = T.TERC_NIT AND F.COTI_ID = :ID
    into :PREF, :NUMERO, :FECHA, :VALIDEZ, :NIT, :NOMTERCERO, :VENDEDOR, :NOMVENDEDOR, :PUNTOVTA, :NOMPUNTOVTA,
    :IMPTOS, :DTOPORC, :DTOMONTO, :ADICIONAL, :IVAMONTO, :EXTRA, :TOTALFAC,
    :CONTACTO, :FAX, :CEL, :DV, :OBS, :SUCUR;
SUBTOTAL = TOTALFAC - EXTRA - IVAMONTO - ADICIONAL + DTOMONTO;

SELECT CLIE_COD, C.ZONA_COD, ZONA_NOM
    FROM CLIENTES C, ZONAS Z
    WHERE TERC_NIT = :NIT AND C.ZONA_COD = Z.ZONA_COD
    INTO :CODIGOCL, :ZONACOD, :ZONANOM;
SELECT CLSU_DIR, CLSU_CIUDAD, CLSU_TEL FROM CLIENTE_SUCURSALES WHERE TERC_NIT = :NIT AND CLCU_COD = :SUCUR
    INTO :DIRECCION, :CIUDAD, :TELEFONO;
    
SUMAEX = 0;
SUMA1 = 0;
SUMA2 = 0;
SUMA3 = 0;
IVA1 = 0;
IVA2 = 0;
IVA3 = 0;
ITEM = 0;
EXECUTE PROCEDURE lee_configuracion ('FACTURACION','DOCUMENTOS','ORDENAR ITEMS POR CODIGO DE ARTICULO') returning_values (:ORDENCOD);
if (ORDENCOD = 'SI') then
    BEGIN
    FOR SELECT D.ARTI_COD, CTDE_CODBAR, SUBSTR(CTDE_DESC,1,60), CTDE_CANT, CTDE_UNIDAD, LIPR_COD, CTDE_PRUNIT, CTDE_DTOPORC, CTDE_DTOMONTO, CTDE_IVAPORC, CTDE_IVAMONTO, CTDE_CONSUMO, CTDE_TOTAL, CTDE_REFERENCIA,
        GRUP_COD, SUBG_COD, MARC_COD, ARTI_PESO, ARTI_ANCHO, ARTI_ALTO, ARTI_LARGO, TAIV_COD, CTDE_OBS, CTDE_FACTOR
        FROM COTIZACIONES_DETALLE D, ARTICULO A
        WHERE D.ARTI_COD = A.ARTI_COD AND D.COTI_ID = :ID
        ORDER BY CTDE_CODBAR
        INTO :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :LISTAPR, :PRUNIT, :DTOITPORC, :DTOITMONTO, :IVAPORC, :IVAITMONTO, :CONSUMO, :TOTAL, :refitem,
        :GRUPO, :SUBGRUPO, :MARCA, :PESO, :ANCHO, :ALTO, :LARGO, :TARIFA, :obsitem, :FACTOR
        DO
        BEGIN
        if (ICOINC = 'SI') then
            SUBTOTIT = TOTAL - IVAITMONTO;
        else
            SUBTOTIT = TOTAL - IVAITMONTO - CONSUMO;
        if (ARTICULO = CODBAR) then
            SELECT FIRST 1 COBA_COD FROM barras_articulo WHERE ARTI_COD = :articulo INTO :CODBAR;
        SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :GRUPO INTO NOMGRUPO;
        SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :MARCA INTO NOMMARCA;
        SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :SUBGRUPO AND GRUP_COD = :GRUPO INTO :NOMSUBG;
        ITEM = ITEM + 1;
        PRNETO = PRUNIT - DTOITMONTO;
        if (PESO IS NULL) then
            PESO = 0;
        PESO = PESO / 1000 * CANT * FACTOR;
        if (IMPTOS = 'S') then
            if (cant <> 0) then
                prnetosiniva = PRUNIT - DTOITMONTO - ((IVAITMONTO+CONSUMO) / CANT);
            else
                prnetosiniva = PRUNIT - DTOITMONTO;
        ELSE
            prnetosiniva = PRUNIT - DTOITMONTO;
        if (ivaporc = 0) then
            SUMAEX = SUMAEX + TOTAL;
        if (TARIFA = 1) then
            BEGIN
            SUMA1 = SUMA1 + TOTAL - IVAITMONTO;
            IVA1 = IVA1 + IVAITMONTO;
            END
        if (TARIFA = 2) then
            BEGIN
            SUMA2 = SUMA2 + TOTAL - IVAITMONTO;
            IVA2 = IVA2 + IVAITMONTO;
            END
        if (TARIFA = 3) then
            BEGIN
            SUMA3 = SUMA3 + TOTAL - IVAITMONTO;
            IVA3 = IVA3 + IVAITMONTO;
            END
        SUMAGR = SUMA1 + SUMA2 + SUMA3;
        if (IMPTOS = 'N') then
            TOTAL = TOTAL - IVAITMONTO;
        SELECT FIRST 1 UNAR_FACCAN FROM unidad_articulo WHERE ARTI_COD = :articulo INTO :factcant;
        ALTERNATIVAS = FLOOR(CANT / factcant);
        PRINCIPALES = CANT - (alternativas * factcant);
        SUSPEND;
        END
    END
ELSE
    BEGIN
    FOR SELECT D.ARTI_COD, CTDE_CODBAR, SUBSTR(CTDE_DESC,1,60), CTDE_CANT, CTDE_UNIDAD, LIPR_COD, CTDE_PRUNIT, CTDE_DTOPORC, CTDE_DTOMONTO, CTDE_IVAPORC, CTDE_IVAMONTO, CTDE_CONSUMO, CTDE_TOTAL, CTDE_REFERENCIA,
        GRUP_COD, SUBG_COD, MARC_COD, ARTI_PESO, ARTI_ANCHO, ARTI_ALTO, ARTI_LARGO, TAIV_COD, CTDE_OBS, CTDE_FACTOR
        FROM COTIZACIONES_DETALLE D, ARTICULO A
        WHERE D.ARTI_COD = A.ARTI_COD AND D.COTI_ID = :ID
        ORDER BY CTDE_ITEM
        INTO :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :LISTAPR, :PRUNIT, :DTOITPORC, :DTOITMONTO, :IVAPORC, :IVAITMONTO, :CONSUMO, :TOTAL, :refitem,
        :GRUPO, :SUBGRUPO, :MARCA, :PESO, :ANCHO, :ALTO, :LARGO, :TARIFA, :obsitem, :FACTOR
        DO
        BEGIN
        SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :GRUPO INTO NOMGRUPO;
        SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :MARCA INTO NOMMARCA;
        SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :SUBGRUPO AND GRUP_COD = :GRUPO INTO :NOMSUBG;
        ITEM = ITEM + 1;
        if (ICOINC = 'SI') then
            SUBTOTIT = TOTAL - IVAITMONTO;
        else
            SUBTOTIT = TOTAL - IVAITMONTO - CONSUMO;
        PRNETO = PRUNIT - DTOITMONTO;
        if (PESO IS NULL) then
            PESO = 0;
        PESO = PESO / 1000 * CANT * FACTOR;
        if (IMPTOS = 'S') then
            if (cant <> 0) then
                prnetosiniva = PRUNIT - DTOITMONTO - ((IVAITMONTO+CONSUMO) / CANT);
            else
                prnetosiniva = PRUNIT - DTOITMONTO;
        ELSE
            prnetosiniva = PRUNIT - DTOITMONTO;
        if (ivaporc = 0) then
            SUMAEX = SUMAEX + TOTAL;
        if (TARIFA = 1) then
            BEGIN
            SUMA1 = SUMA1 + TOTAL - IVAITMONTO;
            IVA1 = IVA1 + IVAITMONTO;
            END
        if (TARIFA = 2) then
            BEGIN
            SUMA2 = SUMA2 + TOTAL - IVAITMONTO;
            IVA2 = IVA2 + IVAITMONTO;
            END
        if (TARIFA = 3) then
            BEGIN
            SUMA3 = SUMA3 + TOTAL - IVAITMONTO;
            IVA3 = IVA3 + IVAITMONTO;
            END
        SUMAGR = SUMA1 + SUMA2 + SUMA3;
        if (IMPTOS = 'N') then
            TOTAL = TOTAL - IVAITMONTO;
        SELECT FIRST 1 UNAR_FACCAN FROM unidad_articulo WHERE ARTI_COD = :articulo INTO :factcant;
        ALTERNATIVAS = FLOOR(CANT / factcant);
        PRINCIPALES = CANT - (alternativas * factcant);
        SUSPEND;
        END
    END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER PROCEDURE IMPR_PEDIDO(
    ID INTEGER)
RETURNS (
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    VALIDEZ INTEGER,
    NIT VARCHAR(20),
    NOMTERCERO VARCHAR(60),
    VENDEDOR INTEGER,
    NOMVENDEDOR VARCHAR(60),
    PUNTOVTA INTEGER,
    NOMPUNTOVTA VARCHAR(30),
    COTIZACION VARCHAR(30),
    SUBTOTAL NUMERIC(18,2),
    DTOPORC NUMERIC(9,2),
    DTOMONTO NUMERIC(18,2),
    ADICIONAL NUMERIC(18,2),
    IVAMONTO NUMERIC(18,2),
    EXTRA NUMERIC(18,2),
    TOTALFAC NUMERIC(18,2),
    OBS BLOB SUB_TYPE 1 SEGMENT SIZE 80,
    ITEM INTEGER,
    ARTICULO VARCHAR(15),
    CODBAR VARCHAR(15),
    ARTIDES VARCHAR(60),
    BODEGA VARCHAR(2),
    CANT NUMERIC(18,4),
    UNIDAD VARCHAR(8),
    FACTOR NUMERIC(18,4),
    LISTAPR INTEGER,
    REFITEM VARCHAR(60),
    PRUNIT NUMERIC(18,2),
    DTOITPORC NUMERIC(9,2),
    DTOITMONTO NUMERIC(18,2),
    PRNETO NUMERIC(18,2),
    PRNETOSINIVA NUMERIC(18,2),
    DTOIT1 NUMERIC(9,2),
    DTOIT2 NUMERIC(9,2),
    DTOIT3 NUMERIC(9,2),
    IVAPORC NUMERIC(9,2),
    IVAITMONTO NUMERIC(18,2),
    CONSUMO NUMERIC(18,2),
    SUBTOTIT NUMERIC(18,2),
    TOTAL NUMERIC(18,2),
    CODIGOCL VARCHAR(20),
    ZONACOD VARCHAR(2),
    ZONANOM VARCHAR(60),
    DV CHAR(1),
    DIRECCION VARCHAR(60),
    CIUDAD VARCHAR(40),
    TELEFONO VARCHAR(40),
    CONTACTO VARCHAR(60),
    FAX VARCHAR(25),
    CEL VARCHAR(25),
    GRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    SUBGRUPO VARCHAR(3),
    NOMSUBG VARCHAR(30),
    MARCA VARCHAR(3),
    NOMMARCA VARCHAR(30),
    PESO NUMERIC(9,4),
    ANCHO NUMERIC(18,4),
    ALTO NUMERIC(18,4),
    LARGO NUMERIC(18,4),
    SUMA1 NUMERIC(18,2),
    SUMA2 NUMERIC(18,2),
    SUMA3 NUMERIC(18,2),
    IVA1 NUMERIC(18,2),
    IVA2 NUMERIC(18,2),
    IVA3 NUMERIC(18,2),
    SUMAEX NUMERIC(18,2),
    SUMAGR NUMERIC(18,2),
    DTOIT1M NUMERIC(18,2),
    DTOIT2M NUMERIC(18,2),
    DTOIT3M NUMERIC(18,2),
    OBSITEM BLOB SUB_TYPE 1 SEGMENT SIZE 80,
    ALTERNATIVAS NUMERIC(18,4),
    PRINCIPALES NUMERIC(18,4))
AS
DECLARE VARIABLE IMPTOS CHAR(1);
DECLARE VARIABLE TARIFA INTEGER;
declare variable ORDENCOD CHAR(2);
declare variable SUCUR VARCHAR(10);
declare variable ICOINC CHAR(2);
declare variable DTOITM1 NUMERIC(18,2);
declare variable DTOITM2 NUMERIC(18,2);
declare variable DTOITM3 NUMERIC(18,2);
declare variable FACTCANT NUMERIC(18,4);
BEGIN
execute procedure lee_configuracion('FACTURACION', 'ARTICULOS', 'IMPOCONSUMO INCLUIDO EN EL PRECIO BASE DE VENTA ANTES DE IVA') returning_values (icoinc);
SELECT F.PREF_PRE, PEDI_NUMERO, PEDI_FECHA, PEDI_VALIDEZ, F.TERC_NIT, PEDI_NOMTERC, F.VEND_COD, VEND_NOMBRE, F.PTVT_ID, PTVT_NOM, PEDI_COTIZACI,
    PEDI_IVAINC, PEDI_DTOPOR, PEDI_DTOMONTO, PEDI_ADICIONAL, PEDI_IVAMONTO, PEDI_EXTRA, PEDI_TOTAL,
    TERC_CONTACTO, TERC_FAX, TERC_DV, TERC_CEL, PEDI_OBS, PEDI_SUCURSAL, PEDI_DTOIT1, PEDI_DTOIT2, PEDI_DTOIT3
    FROM PEDIDOS F, VENDEDORES V, PUNTO_VENTA P, TERCEROS T
    WHERE F.VEND_COD = V.VEND_COD AND F.PTVT_ID = P.PTVT_ID AND F.TERC_NIT = T.TERC_NIT AND F.PEDI_ID = :ID
    into :PREF, :NUMERO, :FECHA, :VALIDEZ, :NIT, :NOMTERCERO, :VENDEDOR, :NOMVENDEDOR, :PUNTOVTA, :NOMPUNTOVTA, :COTIZACION,
    :IMPTOS, :DTOPORC, :DTOMONTO, :ADICIONAL, :IVAMONTO, :EXTRA, :TOTALFAC,
    :CONTACTO, :FAX, :DV, :CEL, :OBS, :SUCUR, :dtoit1m, :dtoit2m, :dtoit3m;
SUBTOTAL = TOTALFAC - EXTRA - IVAMONTO - ADICIONAL + DTOMONTO;

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

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER PROCEDURE IMPR_REMISION(
    ID INTEGER)
RETURNS (
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    NIT VARCHAR(20),
    NOMTERCERO VARCHAR(60),
    VENDEDOR INTEGER,
    NOMVENDEDOR VARCHAR(60),
    PUNTOVTA INTEGER,
    NOMPUNTOVTA VARCHAR(30),
    CODBODEGA VARCHAR(2),
    NOMBODEGA VARCHAR(30),
    COTIZACION VARCHAR(30),
    PEDIDO VARCHAR(30),
    FACTURA VARCHAR(30),
    SUBTOTAL NUMERIC(18,2),
    IVAMONTO NUMERIC(18,2),
    TOTALFAC NUMERIC(18,2),
    DESPACHO VARCHAR(255),
    TRANSPORTADOR VARCHAR(60),
    OBS BLOB SUB_TYPE 1 SEGMENT SIZE 80,
    ITEM INTEGER,
    ARTICULO VARCHAR(15),
    CODBAR VARCHAR(15),
    ARTIDES VARCHAR(60),
    CANT NUMERIC(18,4),
    LOTE VARCHAR(15),
    VLOTE DATE,
    UNIDAD VARCHAR(8),
    FACTOR NUMERIC(18,4),
    CAJAS NUMERIC(18,4),
    DEVUELTO NUMERIC(18,4),
    CONSUMIDO NUMERIC(18,4),
    LISTAPR INTEGER,
    REFITEM VARCHAR(60),
    BODITEM VARCHAR(2),
    STAND VARCHAR(15),
    PRUNIT NUMERIC(18,2),
    DTOITPORC NUMERIC(9,2),
    DTOITMONTO NUMERIC(18,2),
    PRNETOSINIVA NUMERIC(18,2),
    PRNETO NUMERIC(18,2),
    IVAPORC NUMERIC(9,2),
    IVAITMONTO NUMERIC(18,2),
    CONSUMO NUMERIC(18,2),
    SUBTOTIT NUMERIC(18,2),
    TOTAL NUMERIC(18,2),
    CODIGOCL VARCHAR(20),
    ZONACOD VARCHAR(2),
    ZONANOM VARCHAR(60),
    DV CHAR(1),
    DIRECCION VARCHAR(60),
    CIUDAD VARCHAR(40),
    TELEFONO VARCHAR(40),
    CONTACTO VARCHAR(60),
    FAX VARCHAR(25),
    CEL VARCHAR(25),
    GRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    SUBGRUPO VARCHAR(3),
    NOMSUBG VARCHAR(30),
    MARCA VARCHAR(3),
    NOMMARCA VARCHAR(30),
    PESO NUMERIC(9,4),
    ANCHO NUMERIC(18,4),
    ALTO NUMERIC(18,4),
    LARGO NUMERIC(18,4),
    SUMA1 NUMERIC(18,2),
    SUMA2 NUMERIC(18,2),
    SUMA3 NUMERIC(18,2),
    IVA1 NUMERIC(18,2),
    IVA2 NUMERIC(18,2),
    IVA3 NUMERIC(18,2),
    SUMAEX NUMERIC(18,2),
    SUMAGR NUMERIC(18,2),
    TOTCAJAS NUMERIC(18,2),
    OBSITEM BLOB SUB_TYPE 1 SEGMENT SIZE 80,
    ALTERNATIVAS NUMERIC(18,4),
    PRINCIPALES NUMERIC(18,4))
AS
DECLARE VARIABLE IMPTOS CHAR(1);
DECLARE VARIABLE TARIFA INTEGER;
declare variable ORDENCOD CHAR(2);
declare variable SUCUR VARCHAR(10);
declare variable ICOINC CHAR(2);
declare variable FACTCANT NUMERIC(18,4);
BEGIN
execute procedure lee_configuracion('FACTURACION', 'ARTICULOS', 'IMPOCONSUMO INCLUIDO EN EL PRECIO BASE DE VENTA ANTES DE IVA') returning_values (icoinc);
EXECUTE PROCEDURE lee_configuracion ('FACTURACION','DOCUMENTOS','ORDENAR ITEMS POR CODIGO DE ARTICULO') returning_values (:ORDENCOD);
SELECT F.PREF_PRE, REVT_NUMERO, REVT_FECHA, F.BODE_COD, BODE_NOM, F.TERC_NIT, REVT_NOMTERC, F.VEND_COD, VEND_NOMBRE, F.PTVT_ID, PTVT_NOM,
    REVT_COTIZACI, REVT_PEDIDO, REVT_FACTURA, REVT_IVAINC,
    REVT_IVAMONTO, REVT_TOTAL, REVT_DESPACHO, REVT_TRANSP,
    TERC_CONTACTO, TERC_FAX, TERC_DV, TERC_CEL, REVT_OBS, REVT_SUCURSAL
    FROM REMISIONES_VENTA F, BODEGA B, VENDEDORES V, PUNTO_VENTA P, TERCEROS T
    WHERE F.BODE_COD = B.BODE_COD AND F.VEND_COD = V.VEND_COD AND F.PTVT_ID = P.PTVT_ID AND F.TERC_NIT = T.TERC_NIT AND F.REVT_ID = :ID
    into :PREF, :NUMERO, :FECHA, :CODBODEGA, :NOMBODEGA, :NIT, :NOMTERCERO, :VENDEDOR, :NOMVENDEDOR, :PUNTOVTA, :NOMPUNTOVTA,
    :COTIZACION, :PEDIDO, :FACTURA, :IMPTOS,
    :IVAMONTO, :TOTALFAC, :DESPACHO, :transportador, 
    :CONTACTO, :FAX, :DV, :CEL, :OBS, :SUCUR;
SUBTOTAL = TOTALFAC - IVAMONTO;

SELECT CLIE_COD, C.ZONA_COD, ZONA_NOM
    FROM CLIENTES C, ZONAS Z
    WHERE TERC_NIT = :NIT AND C.ZONA_COD = Z.ZONA_COD
    INTO :CODIGOCL, :ZONACOD, :ZONANOM;
SELECT CLSU_DIR, CLSU_CIUDAD, CLSU_TEL FROM CLIENTE_SUCURSALES WHERE TERC_NIT = :NIT AND CLCU_COD = :SUCUR
    INTO :DIRECCION, :CIUDAD, :TELEFONO;
    
SUMAEX = 0;
SUMA1 = 0;
SUMA2 = 0;
SUMA3 = 0;
IVA1 = 0;
IVA2 = 0;
IVA3 = 0;
ITEM = 0;
totcajas = 0;
if (ORDENCOD = 'SI') then
    BEGIN
    FOR SELECT D.ARTI_COD, RVDE_CODBAR, SUBSTR(RVDE_DESC,1,60), RVDE_CANT, RVDE_UNIDAD, BODE_COD, RVDE_LOTE, LIPR_COD, RVDE_PRUNIT, RVDE_DTOPORC, RVDE_DTOMONTO, RVDE_IVAPORC, RVDE_IVAMONTO, RVDE_CONSUMO, RVDE_TOTAL, RVDE_REFERENCIA,
        GRUP_COD, SUBG_COD, MARC_COD, ARTI_PESO, ARTI_ANCHO, ARTI_ALTO, ARTI_LARGO, TAIV_COD, RVDE_DEVUELTO, RVDE_OBS, RVDE_CAJAS, RVDE_FACTOR
        FROM REMISIONES_VENTA_DETALLE D, ARTICULO A
        WHERE D.ARTI_COD = A.ARTI_COD AND D.REVT_ID = :ID
        ORDER BY RVDE_CODBAR
        INTO :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :BODITEM, :LOTE, :LISTAPR, :PRUNIT, :DTOITPORC, :DTOITMONTO, :IVAPORC, :IVAITMONTO, :CONSUMO, :TOTAL, :refitem,
            :GRUPO, :SUBGRUPO, :MARCA, :PESO, :ANCHO, :ALTO, :LARGO, :TARIFA, :DEVUELTO, :obsitem, :CAJAS, :FACTOR
        DO
        BEGIN
        if (ARTICULO = CODBAR) then
            SELECT FIRST 1 COBA_COD FROM barras_articulo WHERE ARTI_COD = :articulo INTO :CODBAR;
        SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :GRUPO INTO NOMGRUPO;
        SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :MARCA INTO NOMMARCA;
        SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :SUBGRUPO AND GRUP_COD = :GRUPO INTO :NOMSUBG;
        SELECT LOTE_VENCE FROM LOTES WHERE LOTE_NRO = :lote AND ARTI_COD = :ARTICULO AND BODE_COD = :boditem INTO :vlote;
        if (ICOINC = 'SI') then
            SUBTOTIT = TOTAL - IVAITMONTO;
        else
            SUBTOTIT = TOTAL - IVAITMONTO - CONSUMO;
        CONSUMIDO = cant * factor - devuelto;
        ITEM = ITEM + 1;
        PRNETO = PRUNIT - DTOITMONTO;
        if (PESO IS NULL) then
            PESO = 0;
        PESO = PESO / 1000 * CANT * FACTOR;
        if (IMPTOS = 'S') then
            if (cant <> 0) then
                prnetosiniva = PRUNIT - DTOITMONTO - ((IVAITMONTO+CONSUMO) / CANT);
            else
                prnetosiniva = PRUNIT - DTOITMONTO;
        ELSE
            prnetosiniva = PRUNIT - DTOITMONTO;
        if (IVAPORC = 0) then
            SUMAEX = SUMAEX + TOTAL;
        if (TARIFA = 1) then
            BEGIN
            SUMA1 = SUMA1 + TOTAL - IVAITMONTO;
            IVA1 = IVA1 + IVAITMONTO;
            END
        if (TARIFA = 2) then
            BEGIN
            SUMA2 = SUMA2 + TOTAL - IVAITMONTO;
            IVA2 = IVA2 + IVAITMONTO;
            END
        if (TARIFA = 3) then
            BEGIN
            SUMA3 = SUMA3 + TOTAL - IVAITMONTO;
            IVA3 = IVA3 + IVAITMONTO;
            END
        SUMAGR = SUMA1 + SUMA2 + SUMA3;

        totcajas = totcajas + cajas;
        SELECT STAND_COD FROM STANDS WHERE ARTI_COD = :ARTICULO AND STAND_BODEGA = :boditem INTO :stand;
        SELECT FIRST 1 UNAR_FACCAN FROM unidad_articulo WHERE ARTI_COD = :articulo INTO :factcant;
        ALTERNATIVAS = FLOOR(CANT / factcant);
        PRINCIPALES = CANT - (alternativas * factcant);
        SUSPEND;
        END
    END
ELSE
    BEGIN
    FOR SELECT RVDE_ITEM, D.ARTI_COD, RVDE_CODBAR, SUBSTR(RVDE_DESC,1,60), RVDE_CANT, RVDE_UNIDAD, BODE_COD, RVDE_LOTE, LIPR_COD, RVDE_PRUNIT, RVDE_DTOPORC, RVDE_DTOMONTO, RVDE_IVAPORC, RVDE_IVAMONTO, RVDE_CONSUMO, RVDE_TOTAL, RVDE_REFERENCIA,
        GRUP_COD, SUBG_COD, MARC_COD, ARTI_PESO, ARTI_ANCHO, ARTI_ALTO, ARTI_LARGO, TAIV_COD, RVDE_DEVUELTO, RVDE_OBS, RVDE_CAJAS, RVDE_FACTOR
        FROM REMISIONES_VENTA_DETALLE D, ARTICULO A
        WHERE D.ARTI_COD = A.ARTI_COD AND D.REVT_ID = :ID
        ORDER BY RVDE_ITEM
        INTO :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :BODITEM, :LOTE, :LISTAPR, :PRUNIT, :DTOITPORC, :DTOITMONTO, :IVAPORC, :IVAITMONTO, :CONSUMO, :TOTAL, :refitem,
            :GRUPO, :SUBGRUPO, :MARCA, :PESO, :ANCHO, :ALTO, :LARGO, :TARIFA, :DEVUELTO, :obsitem, :CAJAS, :FACTOR
        DO
        BEGIN
        SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :GRUPO INTO NOMGRUPO;
        SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :MARCA INTO NOMMARCA;
        SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :SUBGRUPO AND GRUP_COD = :GRUPO INTO :NOMSUBG;
        SELECT LOTE_VENCE FROM LOTES WHERE LOTE_NRO = :lote AND ARTI_COD = :ARTICULO AND BODE_COD = :boditem INTO :vlote;
        if (ICOINC = 'SI') then
            SUBTOTIT = TOTAL - IVAITMONTO;
        else
            SUBTOTIT = TOTAL - IVAITMONTO - CONSUMO;
        CONSUMIDO = cant * factor - devuelto;
        ITEM = ITEM + 1;
        PRNETO = PRUNIT - DTOITMONTO;
        if (PESO IS NULL) then
            PESO = 0;
        PESO = PESO / 1000 * CANT * FACTOR;
        if (IMPTOS = 'S') then
            if (cant <> 0) then
                prnetosiniva = PRUNIT - DTOITMONTO - ((IVAITMONTO+CONSUMO) / CANT);
            else
                prnetosiniva = PRUNIT - DTOITMONTO;
        ELSE
            prnetosiniva = PRUNIT - DTOITMONTO;
        if (IVAPORC = 0) then
            SUMAEX = SUMAEX + TOTAL;
        if (TARIFA = 1) then
            BEGIN
            SUMA1 = SUMA1 + TOTAL - IVAITMONTO;
            IVA1 = IVA1 + IVAITMONTO;
            END
        if (TARIFA = 2) then
            BEGIN
            SUMA2 = SUMA2 + TOTAL - IVAITMONTO;
            IVA2 = IVA2 + IVAITMONTO;
            END
        if (TARIFA = 3) then
            BEGIN
            SUMA3 = SUMA3 + TOTAL - IVAITMONTO;
            IVA3 = IVA3 + IVAITMONTO;
            END
        SUMAGR = SUMA1 + SUMA2 + SUMA3;
        totcajas = totcajas + cajas;
        SELECT STAND_COD FROM STANDS WHERE ARTI_COD = :ARTICULO AND STAND_BODEGA = :boditem INTO :stand;
        SELECT FIRST 1 UNAR_FACCAN FROM unidad_articulo WHERE ARTI_COD = :articulo INTO :factcant;
        ALTERNATIVAS = FLOOR(CANT / factcant);
        PRINCIPALES = CANT - (alternativas * factcant);
        SUSPEND;
        END
    END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER PROCEDURE IMPR_DEVOLUCION(
    ID INTEGER)
RETURNS (
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    NIT VARCHAR(20),
    NOMTERCERO VARCHAR(60),
    VENDEDOR INTEGER,
    NOMVENDEDOR VARCHAR(60),
    PUNTOVTA INTEGER,
    NOMPUNTOVTA VARCHAR(30),
    CODBODEGA VARCHAR(2),
    NOMBODEGA VARCHAR(30),
    FACTURA VARCHAR(30),
    REMISION VARCHAR(10),
    COMIPORC NUMERIC(9,2),
    COMIMONTO NUMERIC(18,2),
    SUBTOTAL NUMERIC(18,2),
    DTOPORC NUMERIC(9,2),
    DTOMONTO NUMERIC(18,2),
    ADICIONAL NUMERIC(18,2),
    IVAMONTO NUMERIC(18,2),
    RTEFTEPORC NUMERIC(9,2),
    RTEFTEMONTO NUMERIC(18,2),
    RTEIVAPORC NUMERIC(9,2),
    RTEIVAMONTO NUMERIC(18,2),
    RTEICAPORC NUMERIC(9,2),
    RTEICAMONTO NUMERIC(18,2),
    EXTRA NUMERIC(18,2),
    TOTALFAC NUMERIC(18,2),
    TOTALPAGAR NUMERIC(18,2),
    OBS BLOB SUB_TYPE 1 SEGMENT SIZE 80,
    ITEM INTEGER,
    ARTICULO VARCHAR(15),
    CODBAR VARCHAR(15),
    ARTIDES VARCHAR(60),
    CANT NUMERIC(18,4),
    LOTE VARCHAR(15),
    UNIDAD VARCHAR(8),
    FACTOR NUMERIC(18,4),
    REFITEM VARCHAR(60),
    BODITEM VARCHAR(2),
    PRUNIT NUMERIC(18,2),
    DTOITPORC NUMERIC(9,2),
    DTOITMONTO NUMERIC(18,2),
    PRNETO NUMERIC(18,2),
    PRNETOSINIVA NUMERIC(18,2),
    IVAPORC NUMERIC(9,2),
    IVAITMONTO NUMERIC(18,2),
    CONSUMO NUMERIC(18,2),
    SUBTOTIT NUMERIC(18,2),
    TOTAL NUMERIC(18,2),
    CODIGOCL VARCHAR(20),
    ZONACOD VARCHAR(2),
    ZONANOM VARCHAR(60),
    DV CHAR(1),
    DIRECCION VARCHAR(60),
    CIUDAD VARCHAR(40),
    TELEFONO VARCHAR(40),
    CONTACTO VARCHAR(60),
    FAX VARCHAR(25),
    CEL VARCHAR(25),
    GRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    SUBGRUPO VARCHAR(3),
    NOMSUBG VARCHAR(30),
    MARCA VARCHAR(3),
    NOMMARCA VARCHAR(30),
    PESO NUMERIC(9,4),
    ANCHO NUMERIC(18,4),
    ALTO NUMERIC(18,4),
    LARGO NUMERIC(18,4),
    SUMA1 NUMERIC(18,2),
    SUMA2 NUMERIC(18,2),
    SUMA3 NUMERIC(18,2),
    IVA1 NUMERIC(18,2),
    IVA2 NUMERIC(18,2),
    IVA3 NUMERIC(18,2),
    TOTCONSUMO NUMERIC(18,2),
    SUMAEX NUMERIC(18,2),
    SUMAGR NUMERIC(18,2),
    OBSITEM BLOB SUB_TYPE 1 SEGMENT SIZE 80,
    ALTERNATIVAS NUMERIC(18,4),
    PRINCIPALES NUMERIC(18,4))
AS
DECLARE VARIABLE IMPTOS CHAR(1);
DECLARE VARIABLE TARIFA INTEGER;
declare variable ORDENCOD CHAR(2);
declare variable SUCUR VARCHAR(10);
declare variable PUNTOS NUMERIC(18,4);
declare variable ICOINC CHAR(2);
declare variable FACTCANT NUMERIC(18,4);
BEGIN
execute procedure lee_configuracion('FACTURACION', 'ARTICULOS', 'IMPOCONSUMO INCLUIDO EN EL PRECIO BASE DE VENTA ANTES DE IVA') returning_values (icoinc);
SELECT F.PREF_PRE, DEVT_NUMERO, DEVT_FECHA, F.BODE_COD, BODE_NOM, F.TERC_NIT, DEVT_NOMTERC, F.VEND_COD, VEND_NOMBRE, F.PTVT_ID, PTVT_NOM,
    DEVT_FACTURA, DEVT_COMIPORC, DEVT_COMIMONTO, DEVT_IVAINC,
    DEVT_DTOPOR, DEVT_DTOMONTO, DEVT_ADICIONAL, DEVT_IVAMONTO, DEVT_RTFTEPORC, DEVT_RTFTEMONTO, DEVT_RTIVAPORC, DEVT_RTIVAMONTO, DEVT_RTICAPORC, DEVT_RTICAMONTO, DEVT_EXTRA, DEVT_TOTAL,
    TERC_CONTACTO, TERC_FAX, TERC_DV, TERC_CEL, DEVT_OBS, DEVT_SUCURSAL, DEVT_REMISION
    FROM DEVOLUCIONES_VENTAS F, BODEGA B, VENDEDORES V, PUNTO_VENTA P, TERCEROS T
    WHERE F.BODE_COD = B.BODE_COD AND F.VEND_COD = V.VEND_COD AND F.PTVT_ID = P.PTVT_ID AND F.TERC_NIT = T.TERC_NIT AND F.DEVT_ID = :ID
    into :PREF, :NUMERO, :FECHA, :CODBODEGA, :NOMBODEGA, :NIT, :NOMTERCERO, :VENDEDOR, :NOMVENDEDOR, :PUNTOVTA, :NOMPUNTOVTA,
    :FACTURA, :COMIPORC, :COMIMONTO, :IMPTOS,
    :DTOPORC, :DTOMONTO, :ADICIONAL, :IVAMONTO, :RTEFTEPORC, :RTEFTEMONTO, :RTEIVAPORC, :RTEIVAMONTO, :RTEICAPORC, :RTEICAMONTO, :EXTRA, :TOTALFAC,
    :CONTACTO, :FAX, :DV, :CEL, :OBS, :SUCUR, :REMISION;
SUBTOTAL = TOTALFAC - EXTRA - IVAMONTO - ADICIONAL + DTOMONTO;
TOTALPAGAR = TOTALFAC - RTEFTEMONTO - RTEIVAMONTO - RTEICAMONTO;

EXECUTE PROCEDURE acumula_puntos_cliente (33, :id, :nit, :fecha) returning_values (:PUNTOS);
SELECT CLIE_COD, C.ZONA_COD, ZONA_NOM
    FROM CLIENTES C, ZONAS Z
    WHERE TERC_NIT = :NIT AND C.ZONA_COD = Z.ZONA_COD
    INTO :CODIGOCL, :ZONACOD, :ZONANOM;
SELECT CLSU_DIR, CLSU_CIUDAD, CLSU_TEL FROM CLIENTE_SUCURSALES WHERE TERC_NIT = :NIT AND CLCU_COD = :SUCUR
    INTO :DIRECCION, :CIUDAD, :TELEFONO;
    
SUMAEX = 0;
SUMA1 = 0;
SUMA2 = 0;
SUMA3 = 0;
IVA1 = 0;
IVA2 = 0;
IVA3 = 0;
TOTCONSUMO = 0;
ITEM = 0;
EXECUTE PROCEDURE lee_configuracion ('FACTURACION','DOCUMENTOS','ORDENAR ITEMS POR CODIGO DE ARTICULO') returning_values (:ORDENCOD);
if (ORDENCOD = 'SI') then
    BEGIN
    FOR SELECT D.ARTI_COD, DVDE_CODBAR, SUBSTR(DVDE_DESC,1,60), DVDE_CANT, DVDE_UNIDAD, BODE_COD, DVDE_LOTE, DVDE_PRUNIT, DVDE_DTOPORC, DVDE_DTOMONTO, DVDE_IVAPORC, DVDE_IVAMONTO, DVDE_CONSUMO, DVDE_TOTAL, DVDE_REFERENCIA,
        GRUP_COD, SUBG_COD, MARC_COD, ARTI_PESO, ARTI_ANCHO, ARTI_ALTO, ARTI_LARGO, TAIV_COD, DVDE_OBS, DVDE_FACTOR
        FROM DEVOLUCIONES_VENTAS_DETALLE D, ARTICULO A
        WHERE D.ARTI_COD = A.ARTI_COD AND D.DEVT_ID = :ID
        ORDER BY DVDE_CODBAR
        INTO :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :BODITEM, :LOTE, :PRUNIT, :DTOITPORC, :DTOITMONTO, :IVAPORC, :IVAITMONTO, :CONSUMO, :TOTAL, :REFITEM,
        :GRUPO, :SUBGRUPO, :MARCA, :PESO, :ANCHO, :ALTO, :LARGO, :TARIFA, :obsitem, :FACTOR
        DO
        BEGIN
        if (ARTICULO = CODBAR) then
            SELECT FIRST 1 COBA_COD FROM barras_articulo WHERE ARTI_COD = :articulo INTO :CODBAR;
        ITEM = ITEM + 1;
        if (ICOINC = 'SI') then
            SUBTOTIT = TOTAL - IVAITMONTO;
        else
            SUBTOTIT = TOTAL - IVAITMONTO - CONSUMO;
        PRNETO = PRUNIT - DTOITMONTO;
        if (PESO IS NULL) then
            PESO = 0;
        PESO = PESO / 1000 * CANT * FACTOR;
        if (IMPTOS = 'S') then
            if (cant <> 0) then
                prnetosiniva = PRUNIT - DTOITMONTO - ((IVAITMONTO+CONSUMO) / CANT);
            else
                prnetosiniva = PRUNIT - DTOITMONTO;
        ELSE
            prnetosiniva = PRUNIT - DTOITMONTO;
        TOTCONSUMO = TOTCONSUMO + CONSUMO;
        if ((REFITEM <> '.t') or (REFITEM IS NULL)) then
            BEGIN
            /* NO SUME LOS ENSAMBLES */
            if (IVAPORC = 0) then
                SUMAEX = SUMAEX + TOTAL;
            if (TARIFA = 1) then
                BEGIN
                SUMA1 = SUMA1 + TOTAL - IVAITMONTO;
                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;
            END
        if (substr(ARTICULO,1,2) = '.t') then
            BEGIN
            REFITEM = '';
            TOTAL = 0;
            END
        SELECT FIRST 1 UNAR_FACCAN FROM unidad_articulo WHERE ARTI_COD = :articulo INTO :factcant;
        ALTERNATIVAS = FLOOR(CANT / factcant);
        PRINCIPALES = CANT - (alternativas * factcant);
        SUSPEND;
        END
    END
ELSE
    BEGIN
    FOR SELECT D.ARTI_COD, DVDE_CODBAR, SUBSTR(DVDE_DESC,1,60), DVDE_CANT, DVDE_UNIDAD, BODE_COD, DVDE_LOTE, DVDE_PRUNIT, DVDE_DTOPORC, DVDE_DTOMONTO, DVDE_IVAPORC, DVDE_IVAMONTO, DVDE_CONSUMO, DVDE_TOTAL, DVDE_REFERENCIA,
        GRUP_COD, SUBG_COD, MARC_COD, ARTI_PESO, ARTI_ANCHO, ARTI_ALTO, ARTI_LARGO, TAIV_COD, DVDE_OBS, DVDE_FACTOR
        FROM DEVOLUCIONES_VENTAS_DETALLE D, ARTICULO A
        WHERE D.ARTI_COD = A.ARTI_COD AND D.DEVT_ID = :ID
        ORDER BY DVDE_ITEM
        INTO :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :BODITEM, :LOTE, :PRUNIT, :DTOITPORC, :DTOITMONTO, :IVAPORC, :IVAITMONTO, :CONSUMO, :TOTAL, :REFITEM,
        :GRUPO, :SUBGRUPO, :MARCA, :PESO, :ANCHO, :ALTO, :LARGO, :TARIFA, :obsitem, :FACTOR
        DO
        BEGIN
        if (ARTICULO = CODBAR) then
            SELECT FIRST 1 COBA_COD FROM barras_articulo WHERE ARTI_COD = :articulo INTO :CODBAR;
        SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :GRUPO INTO NOMGRUPO;
        SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :MARCA INTO NOMMARCA;
        SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :SUBGRUPO AND GRUP_COD = :GRUPO INTO :NOMSUBG;
        ITEM = ITEM + 1;
        if (ICOINC = 'SI') then
            SUBTOTIT = TOTAL - IVAITMONTO;
        else
            SUBTOTIT = TOTAL - IVAITMONTO - CONSUMO;
        PRNETO = PRUNIT - DTOITMONTO;
        if (PESO IS NULL) then
            PESO = 0;
        PESO = PESO / 1000 * CANT * FACTOR;
        if (IMPTOS = 'S') then
            if (cant <> 0) then
                prnetosiniva = PRUNIT - DTOITMONTO - ((IVAITMONTO+CONSUMO) / CANT);
            else
                prnetosiniva = PRUNIT - DTOITMONTO;
        ELSE
            prnetosiniva = PRUNIT - DTOITMONTO;
        TOTCONSUMO = TOTCONSUMO + CONSUMO;
        if ((REFITEM <> '.t') or (REFITEM IS NULL)) then
            BEGIN
            /* NO SUME LOS ENSAMBLES */
            if (IVAPORC = 0) then
                SUMAEX = SUMAEX + TOTAL;
            if (TARIFA = 1) then
                BEGIN
                SUMA1 = SUMA1 + TOTAL - IVAITMONTO;
                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;
            END
        if (substr(ARTICULO,1,2) = '.t') then
            BEGIN
            REFITEM = '';
            TOTAL = 0;
            END
        SELECT FIRST 1 UNAR_FACCAN FROM unidad_articulo WHERE ARTI_COD = :articulo INTO :factcant;
        ALTERNATIVAS = FLOOR(CANT / factcant);
        PRINCIPALES = CANT - (alternativas * factcant);
        SUSPEND;
        END
    END
END
^

SET TERM ; ^


/* 20090402 */
/* SI SUCU_ID DE LA TABLA DE VENDEDORES ES NULL DABA UN ERROR INSERTANDO EN LA TABLA HISTORICO_VENTAS */
SET TERM ^ ;

CREATE OR ALTER PROCEDURE ANALISIS_VENTAS_VENDEDOR(
    AGENCIA INTEGER,
    VENDINI INTEGER,
    VENDFIN INTEGER,
    FECHA DATE)
RETURNS (
    CODVEND INTEGER,
    NOMVEND VARCHAR(60),
    CODAGENCIA INTEGER,
    NOMAGENCIA VARCHAR(60),
    PRESUPUESTO NUMERIC(18,2),
    VENTAS NUMERIC(18,2),
    VENTADIA NUMERIC(18,2),
    PENDIENTE NUMERIC(18,2),
    FALTANTE NUMERIC(18,2),
    FALTANTEDIA NUMERIC(18,2),
    PORCENTAJE NUMERIC(9,2),
    PROMEDIO NUMERIC(18,2),
    ESPERADO NUMERIC(18,2),
    RECAUDO NUMERIC(18,2),
    RECAUDODIA NUMERIC(18,2),
    PENDIENTER NUMERIC(18,2),
    MOSTRADORV NUMERIC(18,2),
    MOSTRADORR NUMERIC(18,2),
    MAXIMAVTA NUMERIC(18,2),
    MESMAXIMO VARCHAR(8),
    VENTAANOP NUMERIC(18,2),
    DEBERIAIR NUMERIC(9,2))
AS
DECLARE VARIABLE FECAUX VARCHAR(10);
DECLARE VARIABLE FECINI VARCHAR(10);
DECLARE VARIABLE FEC DATE;
DECLARE VARIABLE ANO INTEGER;
DECLARE VARIABLE MES INTEGER;
DECLARE VARIABLE TIPODOC INTEGER;
DECLARE VARIABLE ID INTEGER;
DECLARE VARIABLE ABONO NUMERIC(18,2);
DECLARE VARIABLE SUBTOTAL NUMERIC(18,2);
DECLARE VARIABLE IVAMONTO NUMERIC(18,2);
DECLARE VARIABLE TOTAL NUMERIC(18,2);
DECLARE VARIABLE ESCONTADO CHAR(1);
DECLARE VARIABLE DIAS INTEGER;
DECLARE VARIABLE AGEN_ANT INTEGER;
DECLARE VARIABLE TOTAL_SUC NUMERIC(18,2);
declare variable DIA INTEGER;
begin
MOSTRADORV = 0;
MOSTRADORR = 0;
AGEN_ANT = 0;
total_suc = 0;
FECAUX = CAST (FECHA AS VARCHAR(10));
ANO = CAST(SUBSTR(FECAUX, 1, 4) AS INTEGER);
MES = CAST(SUBSTR(FECAUX, 6, 7) AS INTEGER);
FECINI = SUBSTR(FECAUX, 1, 8) || '01';
DIA = extract (DAY FROM FECHA);
/*SELECT PRVM_DIAS FROM PRESUPUESTO_VENTAS_MESES WHERE PRVM_ANO = :ANO AND PRVM_MES = :MES INTO :DIAS; */
DIAS = EXTRACT(DAY FROM (FECHA - EXTRACT(DAY FROM FECHA) + 32 - EXTRACT(DAY FROM FECHA - EXTRACT(DAY FROM FECHA) + 32)));
FOR SELECT VEND_COD, VEND_NOMBRE, SUCU_ID, VEND_CONTADO FROM VENDEDORES WHERE VEND_COD >= :VENDINI AND VEND_COD <= :VENDFIN  AND
    ((SUCU_ID = :AGENCIA) or (:AGENCIA = 0)) ORDER BY SUCU_ID, VEND_COD
    INTO :CODVEND, :NOMVEND, :CODAGENCIA, :ESCONTADO
    DO
    BEGIN
    if (CODAGENCIA IS NULL) then
        CODAGENCIA = 0;
    if (CODAGENCIA <> 0) then
        BEGIN
        SELECT SUCU_NOMBRE FROM SUCURSALES WHERE SUCU_ID = :CODAGENCIA INTO :NOMAGENCIA;
        MAXIMAVTA = 0;
        MESMAXIMO = '';
        VENTAANOP = 0;
        /* LA MAXIMA VENTA Y EL MES EN QUE OCURRIO */
        SELECT MAX(HIVE_VENTA) FROM historico_ventas WHERE SUCU_ID = :codagencia INTO maximavta;
        SELECT MAX(CAST(HIVE_MES AS CHAR(2)) || '/' || CAST(HIVE_ANO AS CHAR(4))) FROM
            historico_ventas WHERE HIVE_VENTA = :maximavta AND SUCU_ID = :codagencia INTO :mesmaximo;
        /* LA VENTA DEL MISMO MES EL ANO ANTERIOR */
        SELECT HIVE_VENTA FROM historico_ventas WHERE HIVE_ANO = :ANO-1 AND HIVE_MES = :MES AND SUCU_ID = :codagencia INTO :ventaanop;
        END
    /* TRAIGA EL PRESUPUESTO DEL MES */
    PRESUPUESTO = 0;
    PENDIENTE = 0;
    PENDIENTER = 0;
    SELECT PRVE_VENTA, PRVE_PENDIENTE, PRVE_PENDRECA FROM PRESUPUESTO_VENTAS
        WHERE VEND_COD = :CODVEND AND PRVE_ANO = :ANO AND PRVE_MES = :MES
        INTO :PRESUPUESTO, :PENDIENTE, :PENDIENTER;

    /* CALCULE LAS VENTAS */
    SELECT SUM(FACT_TOTAL-FACT_IVAMONTO) FROM FACTURAS F, PREFIJOS P
        WHERE VEND_COD = :CODVEND AND FACT_FECHA = :FECHA AND FACT_ANULADO = 'N'
        AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND ((SUCU_ID = :AGENCIA) or (:AGENCIA = 0))
        INTO :VENTADIA;
    if (VENTADIA is null) then
        VENTADIA = 0;
    SELECT SUM(FACT_TOTAL-FACT_IVAMONTO) FROM FACTURAS F, PREFIJOS P
        WHERE VEND_COD = :CODVEND AND FACT_FECHA >= :FECINI AND FACT_FECHA < :FECHA AND FACT_ANULADO = 'N'
        AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND ((SUCU_ID = :AGENCIA) or (:AGENCIA = 0))
        INTO :SUBTOTAL;
    if (subtotal is null) then
        ventas = VENTADIA;
    else
        VENTAS = SUBTOTAL + VENTADIA;
    /* CALCULE LAS DEVOLUCIONES */
    SELECT SUM(DEVT_TOTAL-DEVT_IVAMONTO) FROM devoluciones_ventas F, PREFIJOS P
        WHERE VEND_COD = :CODVEND AND DEVT_FECHA = :FECHA AND DEVT_ANULADO = 'N'
        AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 33 AND ((SUCU_ID = :AGENCIA) or (:AGENCIA = 0))
        INTO :SUBTOTAL;
    if (subtotal is not null) then
        BEGIN
        VENTADIA = VENTADIA - SUBTOTAL;
        VENTAS = VENTAS - SUBTOTAL;
        END
    SELECT SUM(DEVT_TOTAL-DEVT_IVAMONTO) FROM devoluciones_ventas F, PREFIJOS P
        WHERE VEND_COD = :CODVEND AND DEVT_FECHA >= :FECINI AND DEVT_FECHA < :FECHA AND DEVT_ANULADO = 'N'
        AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 33 AND ((SUCU_ID = :AGENCIA) or (:AGENCIA = 0))
        INTO :SUBTOTAL;
    if (subtotal is not null) then
        VENTAS = VENTAS - SUBTOTAL;
    /* CALCULE LAS NOTAS CREDITO */
    SELECT SUM(NCCL_MONTO) FROM NOTAS_CREDITO_CLIENTES F, PREFIJOS P
        WHERE VEND_COD = :CODVEND AND NCCL_FECHA = :FECHA AND NCCL_ANULADO = 'N'
        AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 42 AND ((SUCU_ID = :AGENCIA) or (:AGENCIA = 0))
        INTO :SUBTOTAL;
    if (subtotal is not null) then
        BEGIN
        VENTADIA = VENTADIA - SUBTOTAL;
        VENTAS = VENTAS - SUBTOTAL;
        END
    SELECT SUM(NCCL_MONTO) FROM NOTAS_CREDITO_CLIENTES F, PREFIJOS P
        WHERE VEND_COD = :CODVEND AND NCCL_FECHA >= :FECINI AND NCCL_FECHA < :FECHA AND NCCL_ANULADO = 'N'
        AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 42 AND ((SUCU_ID = :AGENCIA) or (:AGENCIA = 0))
        INTO :SUBTOTAL;
    if (subtotal is not null) then
        VENTAS = VENTAS - SUBTOTAL;
    FALTANTE = PRESUPUESTO - VENTAS;
    if (DIAS - DIA > 0) then
        FALTANTEDIA = FALTANTE / (DIAS - DIA);
    ELSE
        FALTANTEDIA = FALTANTE;
    if (PRESUPUESTO <> 0) then
        PORCENTAJE = VENTAS / PRESUPUESTO * 100;
    ELSE
        PORCENTAJE = 0;
    PROMEDIO = (VENTAS + PENDIENTE) / DIA;
    ESPERADO = PROMEDIO * DIAS;
    DEBERIAIR = DIA * 100/ dias;
    RECAUDO = 0;
    RECAUDODIA = 0;
    /* CALCULE EL RECAUDO DEL MES EXCLUYENDO EL IVA */
    FOR SELECT RECA_FECHA, RCDE_TIPODOC, RCDE_IDDOC, (RCDE_ABONO+RCDE_RTFTE+RCDE_RTIVA+RCDE_RTICA)
        FROM RECIBOS_CAJA R, RECIBOS_CAJA_DETALLE RD
        WHERE R.RECA_ID = RD.RECA_ID AND
        RECA_FECHA >= :FECINI AND RECA_FECHA <= :FECHA AND RECA_ANULADO = 'N' AND COBR_COD = :CODVEND
        ORDER BY RECA_FECHA
        INTO :FEC, :TIPODOC, :ID, :ABONO
        DO
        BEGIN
        /* TRAIGA EL DOCUMENTO Y CALCULE LA BASE */
        if (TIPODOC = 31) then
                SELECT FACT_TOTAL,FACT_IVAMONTO FROM FACTURAS WHERE FACT_ID = :ID INTO :TOTAL, :IVAMONTO;
        if (TIPODOC = 33) then
                SELECT DEVT_TOTAL*-1,DEVT_IVAMONTO*-1 FROM DEVOLUCIONES_VENTAS WHERE DEVT_ID = :ID INTO :TOTAL, :IVAMONTO;
        if (TIPODOC = 41) then
                SELECT NDCL_MONTO,NDCL_IVAMONTO FROM NOTAS_DEBITO_CLIENTES WHERE NDCL_ID = :ID INTO :TOTAL, :IVAMONTO;
        if (TIPODOC = 42) then
                SELECT NCCL_MONTO*-1,NCCL_IVAMONTO*-1 FROM NOTAS_CREDITO_CLIENTES WHERE NCCL_ID = :ID INTO :TOTAL, :IVAMONTO;
        if (TIPODOC = 77) then
                SELECT DVCH_MONTO,0 FROM DEVOLUCION_CHEQUES WHERE DVCH_ID = :ID INTO :TOTAL, :IVAMONTO;
        if (TOTAL <> 0) then
            SUBTOTAL = (ABONO / TOTAL) * (TOTAL - IVAMONTO);
        RECAUDO = RECAUDO + SUBTOTAL;
        if (FEC = FECHA) then
            RECAUDODIA = RECAUDODIA + SUBTOTAL;
        END
    if (ESCONTADO = 'S') then
        BEGIN
        MOSTRADORV = MOSTRADORV + VENTAS;
        MOSTRADORR = MOSTRADORR + RECAUDO;
        END
    /* actualice el historico */
    if (AGEN_ANT <> codagencia)  then
        BEGIN
        if (AGEN_ANT <> 0) THEN
            BEGIN
            TOTAL = null;
            SELECT HIVE_VENTA FROM historico_ventas WHERE HIVE_ANO = :ANO AND HIVE_MES = :MES AND SUCU_ID = :AGEN_ANT INTO :TOTAL;
            if (TOTAL is not null) then
                BEGIN
                if (TOTAL_SUC <> 0) then
                    UPDATE historico_ventas SET HIVE_VENTA = (:total_suc)  WHERE HIVE_ANO = :ANO AND HIVE_MES = :MES AND SUCU_ID = :AGEN_ANT;
                END
            ELSE
                INSERT INTO historico_ventas (HIVE_ANO, HIVE_MES, SUCU_ID, HIVE_VENTA) VALUES (:ANO, :MES, :AGEN_ANT, :TOTAL_SUC);
            END
        total_suc = VENTAS;
        END
    ELSE
        BEGIN
        total_suc = :total_suc + :VENTAS;
        END
    AGEN_ANT = :codagencia;
    if ((VENTAS <> 0) or (RECAUDO <> 0) or (:presupuesto <> 0)) then
        suspend;
    END
/* actualice la ultima agencia */
TOTAL = null;
SELECT HIVE_VENTA FROM historico_ventas WHERE HIVE_ANO = :ANO AND HIVE_MES = :MES AND SUCU_ID = :AGEN_ANT INTO :TOTAL;
if (TOTAL is not null) then
    BEGIN
    if (TOTAL_SUC <> 0) then
        UPDATE historico_ventas SET HIVE_VENTA = (:total_suc)  WHERE HIVE_ANO = :ANO AND HIVE_MES = :MES AND SUCU_ID = :AGEN_ANT;
    END
ELSE
    INSERT INTO historico_ventas (HIVE_ANO, HIVE_MES, SUCU_ID, HIVE_VENTA) VALUES (:ANO, :MES, :AGEN_ANT, :TOTAL_SUC);
end
^

SET TERM ; ^



/* 20090403 */
/* LA BD NO VOLVIA A VALIDAR QUE LA FECHA DEL ABONO SEA POSTERIOR AL DOCUMENTO */

CREATE EXCEPTION FECHA_ANTERIOR_DOCUMENTO 'La fecha del abono es anterior a la fecha del documento a abonar';

SET TERM ^ ;

CREATE OR ALTER TRIGGER RECIBOS_CAJA_DETALLE_BI FOR RECIBOS_CAJA_DETALLE
ACTIVE BEFORE INSERT POSITION 0
AS
DECLARE VARIABLE NUMROWS INTEGER;
declare variable PREGTASA CHAR(2);
declare variable TRM NUMERIC(18,2);
declare variable TRMDOC NUMERIC(18,2);
declare variable FECREC DATE;
declare variable FECDOC DATE;
begin
IF (NEW.RECA_ID IS NOT NULL) THEN
    BEGIN
       SELECT COUNT(*)
       FROM   RECIBOS_CAJA
       WHERE  RECIBOS_CAJA.RECA_ID = NEW.RECA_ID
       INTO   :NUMROWS;
       IF (NUMROWS = 0) THEN
       BEGIN
          EXCEPTION recibo_no_existe;
       END
    END
if (NEW.rcde_sucursal IS NULL) then
    NEW.rcde_sucursal = '01';
/* SI TRM <> 1 CONVIERTA A PESOS LOS VALORES */
EXECUTE PROCEDURE LEE_CONFIGURACION('GENERAL', 'GENERAL', 'PREGUNTAR TASA DE CAMBIO EN DOCUMENTOS DE CARTERA') returning_values (:pregtasa);
if (PREGTASA = 'SI') then
    BEGIN
    SELECT RECA_TRM FROM recibos_caja WHERE RECA_ID = NEW.reca_id INTO :TRM;
    SELECT MVCL_TRM FROM movimiento_clientes M WHERE M.mvcl_tiporef = NEW.rcde_tipodoc AND M.mvcl_idref = NEW.rcde_iddoc INTO :TRMDOC;
    NEW.rcde_difcambio = (NEW.rcde_abono + NEW.rcde_dtof) * (TRM - TRMDOC);
    NEW.rcde_abono = NEW.rcde_abono * :trmdoc;
    NEW.rcde_rtfte = NEW.rcde_rtfte * :trmdoc;
    NEW.rcde_rtiva = NEW.rcde_rtiva * :trmdoc;
    NEW.rcde_rtica = NEW.rcde_rtica * :trmdoc;
    NEW.rcde_dtof = NEW.rcde_dtof * :trmdoc;
    end
/* valide que la fecha no sea anterior al documento */
SELECT RECA_FECHA FROM recibos_caja WHERE RECA_ID = NEW.reca_id INTO :FECREC;
SELECT MVCL_FECHA FROM movimiento_clientes M WHERE M.mvcl_tiporef = NEW.rcde_tipodoc AND M.mvcl_idref = NEW.rcde_iddoc INTO :FECDOC;
if (FECDOC > FECREC) then
    exception fecha_anterior_documento 'EL RECIBO DE FECHA ' || :FECREC || ' INTENTA ABONAR UN DOCUMENTO DE FECHA ' || FECDOC;
END
^

SET TERM ; ^


SET TERM ^ ;

CREATE OR ALTER TRIGGER EGRESOS_DETALLE_BI FOR EGRESOS_DETALLE
ACTIVE BEFORE INSERT POSITION 0
as
declare variable PREGTASA CHAR(2);
declare variable TRM NUMERIC(18,2);
declare variable TRMDOC NUMERIC(18,2);
declare variable FECREC DATE;
declare variable FECDOC DATE;
begin
/* SI TRM <> 1 CONVIERTA A PESOS LOS VALORES */
EXECUTE PROCEDURE LEE_CONFIGURACION('GENERAL', 'GENERAL', 'PREGUNTAR TASA DE CAMBIO EN DOCUMENTOS DE CUENTAS POR PAGAR') returning_values (:pregtasa);
if (PREGTASA = 'SI') then
    BEGIN
    SELECT EGRE_TRM FROM EGRESOS WHERE EGRE_ID = NEW.egre_id INTO :TRM;
    SELECT MVPR_TRM FROM MOVIMIENTO_PROVEEDOR M WHERE M.mvpr_tiporef = NEW.egde_tipodoc AND M.mvpr_idref = NEW.egde_iddoc INTO :TRMDOC;
    NEW.egde_difcambio = (NEW.egde_abono + NEW.egde_dtof) * (TRM - TRMDOC);
    NEW.egde_abono = NEW.egde_abono * :trmdoc;
    NEW.egde_rtfte = NEW.egde_rtfte * :trmdoc;
    NEW.egde_rtiva = NEW.egde_rtiva * :trmdoc;
    NEW.egde_rtica = NEW.egde_rtica * :trmdoc;
    NEW.egde_dtof = NEW.egde_dtof * :trmdoc;
    END
/* valide que la fecha no sea anterior al documento */
SELECT EGRE_FECHA FROM EGRESOS WHERE EGRE_ID = NEW.egre_id INTO :FECREC;
SELECT MVPR_FECHA FROM movimiento_proveedor M WHERE M.mvpr_tiporef = NEW.egde_tipodoc AND M.mvpr_idref = NEW.egde_iddoc INTO :FECDOC;
if (FECDOC > FECREC) then
    exception fecha_anterior_documento 'EL EGRESO DE FECHA ' || :FECREC || ' INTENTA ABONAR UN DOCUMENTO DE FECHA ' || FECDOC;
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER APLICACION_CLIENTE_DETALLE_BI FOR APLICACION_CLIENTE_DETALLE
ACTIVE BEFORE INSERT POSITION 0
as
declare variable PREGTASA CHAR(2);
declare variable TRM NUMERIC(18,2);
declare variable SALDO NUMERIC(18,2);
declare variable SALDOM NUMERIC(18,2);
declare variable RETES CHAR(2);
declare variable FECREC DATE;
declare variable FECDOC DATE;
begin
/* valide que la fecha no sea anterior al documento */
SELECT APCL_FECHA FROM aplicacion_cliente WHERE APCL_ID = NEW.apcl_id INTO :FECREC;
SELECT MVCL_FECHA FROM movimiento_clientes M WHERE M.mvcl_tiporef = NEW.acde_tipodoc AND M.mvcl_idref = NEW.acde_iddoc INTO :FECDOC;
if (FECDOC > FECREC) then
    exception fecha_anterior_documento 'LA APLICACION DE FECHA ' || :FECREC || ' INTENTA ABONAR UN DOCUMENTO DE FECHA ' || FECDOC;

/* SI TRM <> 1 CONVIERTA A PESOS LOS VALORES */
EXECUTE PROCEDURE LEE_CONFIGURACION('GENERAL', 'GENERAL', 'PREGUNTAR TASA DE CAMBIO EN DOCUMENTOS DE CARTERA') returning_values (:pregtasa);
if (PREGTASA = 'SI') then
    BEGIN
    SELECT APCL_TRM FROM aplicacion_cliente WHERE APCL_ID = NEW.apcl_id INTO :TRM;
    NEW.acde_aplicado = NEW.acde_aplicado * :trm;
    NEW.acde_rtfte = NEW.acde_rtfte * :trm;
    NEW.acde_rtiva = NEW.acde_rtiva * :trm;
    NEW.acde_rtica = NEW.acde_rtica * :trm;
    /* VERIFIQUE LOS SALDOS SI LLEVE LA DIFERENCIA COMO DIF EN CAMBIO */
    execute procedure lee_configuracion('CARTERA', 'SALDOS', 'DESCONTAR RETENCIONES POR CAUSACION') returning_values (RETES);
    execute procedure saldo_doc_cartera(new.acde_tipodoc, new.acde_iddoc, '9999/12/31', 0) returning_values(saldo);
    if (SALDO < 0) then
        BEGIN
        if (RETES = 'SI') then
            begin
            if (saldo > NEW.acde_aplicado) then
                BEGIN
                execute procedure saldo_doc_cartera(new.acde_tipodoc, new.acde_iddoc, '9999/12/31', 1) returning_values(saldoM);
                if (saldoM > (NEW.acde_aplicado/:TRM)) then
                    EXCEPTION DOCUMENTO_ABONO_MAYOR 'EL SALDO DEL DOCUMENTO ' || NEW.acde_prefijo || NEW.acde_numero || ' ES INSUFICIENTE.';
                else
                    BEGIN
                    NEW.acde_difcambio = :SALDO - NEW.acde_aplicado;
                    NEW.acde_aplicado = NEW.acde_aplicado - NEW.acde_difcambio;
                    END
                END
            end
        ELSE
            begin
            if (saldo > (NEW.acde_aplicado + NEW.acde_rtfte + NEW.acde_rtiva + NEW.acde_rtica)) then
                begin
                execute procedure saldo_doc_cartera(new.acde_tipodoc, new.acde_iddoc, '9999/12/31', 1) returning_values(saldoM);
                if (saldoM > ((NEW.acde_aplicado+NEW.acde_rtfte+NEW.acde_rtiva+NEW.acde_rtica)/:TRM)) then
                    EXCEPTION DOCUMENTO_ABONO_MAYOR 'EL SALDO DEL DOCUMENTO ' || NEW.acde_prefijo || NEW.acde_numero || ' ES INSUFICIENTE.';
                else
                    BEGIN
                    NEW.acde_difcambio = :SALDO - (NEW.acde_aplicado+NEW.acde_rtfte+NEW.acde_rtiva+NEW.acde_rtica);
                    NEW.acde_aplicado = NEW.acde_aplicado - NEW.acde_difcambio;
                    END
                end
            end
        END
    else
        BEGIN
        if (RETES = 'SI') then
            begin
            if (saldo < NEW.acde_aplicado) then
                BEGIN
                execute procedure saldo_doc_cartera(new.acde_tipodoc, new.acde_iddoc, '9999/12/31', 1) returning_values(saldoM);
                if (saldoM < (NEW.acde_aplicado/:TRM)) then
                    EXCEPTION DOCUMENTO_ABONO_MAYOR 'EL SALDO DEL DOCUMENTO ' || NEW.acde_prefijo || NEW.acde_numero || ' ES INSUFICIENTE.';
                else
                    BEGIN
                    NEW.acde_difcambio = :SALDO - NEW.acde_aplicado;
                    NEW.acde_aplicado = NEW.acde_aplicado - NEW.acde_difcambio;
                    END
                END
            end
        ELSE
            begin
            if (saldo < (NEW.acde_aplicado + NEW.acde_rtfte + NEW.acde_rtiva + NEW.acde_rtica)) then
                begin
                execute procedure saldo_doc_cartera(new.acde_tipodoc, new.acde_iddoc, '9999/12/31', 1) returning_values(saldoM);
                if (saldoM < ((NEW.acde_aplicado+NEW.acde_rtfte+NEW.acde_rtiva+NEW.acde_rtica)/:TRM)) then
                    EXCEPTION DOCUMENTO_ABONO_MAYOR 'EL SALDO DEL DOCUMENTO ' || NEW.acde_prefijo || NEW.acde_numero || ' ES INSUFICIENTE.';
                else
                    BEGIN
                    NEW.acde_difcambio = :SALDO - (NEW.acde_aplicado+NEW.acde_rtfte+NEW.acde_rtiva+NEW.acde_rtica);
                    NEW.acde_aplicado = NEW.acde_aplicado - NEW.acde_difcambio;
                    END
                end
            end
        END
    end
end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER APLICACION_PROVEEDOR_DETALLE_BI FOR APLICACION_PROVEEDOR_DETALLE
ACTIVE BEFORE INSERT POSITION 0
as
declare variable PREGTASA CHAR(2);
declare variable TRM NUMERIC(18,2);
declare variable SALDO NUMERIC(18,2);
declare variable SALDOM NUMERIC(18,2);
declare variable RETES CHAR(2);
declare variable FECREC DATE;
declare variable FECDOC DATE;
begin
/* valide que la fecha no sea anterior al documento */
SELECT APPR_FECHA FROM aplicacion_provedor WHERE APPR_ID = NEW.appr_id INTO :FECREC;
SELECT MVPR_FECHA FROM movimiento_proveedor M WHERE M.mvpr_tiporef = NEW.appd_tipodoc AND M.mvpr_idref = NEW.appd_iddoc INTO :FECDOC;
if (FECDOC > FECREC) then
    exception fecha_anterior_documento 'LA APLICACION DE FECHA ' || :FECREC || ' INTENTA ABONAR UN DOCUMENTO DE FECHA ' || FECDOC;

/* SI TRM <> 1 CONVIERTA A PESOS LOS VALORES */
EXECUTE PROCEDURE LEE_CONFIGURACION('GENERAL', 'GENERAL', 'PREGUNTAR TASA DE CAMBIO EN DOCUMENTOS DE CUENTAS POR PAGAR') returning_values (:pregtasa);
if (PREGTASA = 'SI') then
    BEGIN
    SELECT APPR_TRM FROM aplicacion_provedor WHERE APPR_ID = NEW.appr_id INTO :TRM;
    NEW.appd_aplicado = NEW.appd_aplicado * :trm;
    NEW.appd_rtfte = NEW.appd_rtfte * :trm;
    NEW.appd_rtiva = NEW.appd_rtiva * :trm;
    NEW.appd_rtica = NEW.appd_rtica * :trm;
    /* VERIFIQUE LOS SALDOS SI LLEVE LA DIFERENCIA COMO DIF EN CAMBIO */
    execute procedure lee_configuracion('CXPAGAR', 'SALDOS', 'DESCONTAR RETENCIONES POR CAUSACION') returning_values (RETES);
    execute procedure saldo_doc_cxpagar(new.appd_tipodoc, new.appd_iddoc, '9999/12/31', 0) returning_values(saldo);
    if (SALDO < 0) then
        BEGIN
        if (RETES = 'SI') then
            begin
            if (saldo > NEW.appd_aplicado) then
                BEGIN
                execute procedure saldo_doc_cxpagar(new.appd_tipodoc, new.appd_iddoc, '9999/12/31', 1) returning_values(saldoM);
                if (saldoM > (NEW.appd_aplicado/:TRM)) then
                    EXCEPTION DOCUMENTO_ABONO_MAYOR 'EL SALDO DEL DOCUMENTO ' || NEW.appd_prefijo || NEW.appd_numero || ' ES INSUFICIENTE.';
                else
                    BEGIN
                    NEW.appd_difcambio = :SALDO - NEW.appd_aplicado;
                    NEW.appd_aplicado = NEW.appd_aplicado - NEW.appd_difcambio;
                    END
                END
            end
        ELSE
            begin
            if (saldo > (NEW.appd_aplicado + NEW.appd_rtfte + NEW.appd_rtiva + NEW.appd_rtica)) then
                begin
                execute procedure saldo_doc_cxpagar(new.appd_tipodoc, new.appd_iddoc, '9999/12/31', 1) returning_values(saldoM);
                if (saldoM > ((NEW.appd_aplicado+NEW.appd_rtfte+NEW.appd_rtiva+NEW.appd_rtica)/:TRM)) then
                    EXCEPTION DOCUMENTO_ABONO_MAYOR 'EL SALDO DEL DOCUMENTO ' || NEW.appd_prefijo || NEW.appd_numero || ' ES INSUFICIENTE.';
                else
                    BEGIN
                    NEW.appd_difcambio = :SALDO - (NEW.appd_aplicado+NEW.appd_rtfte+NEW.appd_rtiva+NEW.appd_rtica);
                    NEW.appd_aplicado = NEW.appd_aplicado - NEW.appd_difcambio;
                    END
                end
            end
        END
    else
        BEGIN
        if (RETES = 'SI') then
            begin
            if (saldo < NEW.appd_aplicado) then
                BEGIN
                execute procedure saldo_doc_cxpagar(new.appd_tipodoc, new.appd_iddoc, '9999/12/31', 1) returning_values(saldoM);
                if (saldoM < (NEW.appd_aplicado/:TRM)) then
                    EXCEPTION DOCUMENTO_ABONO_MAYOR 'EL SALDO DEL DOCUMENTO ' || NEW.appd_prefijo || NEW.appd_numero || ' ES INSUFICIENTE.';
                else
                    BEGIN
                    NEW.appd_difcambio = :SALDO - NEW.appd_aplicado;
                    NEW.appd_aplicado = NEW.appd_aplicado - NEW.appd_difcambio;
                    END
                END
            end
        ELSE
            begin
            if (saldo < (NEW.appd_aplicado + NEW.appd_rtfte + NEW.appd_rtiva + NEW.appd_rtica)) then
                begin
                execute procedure saldo_doc_cxpagar(new.appd_tipodoc, new.appd_iddoc, '9999/12/31', 1) returning_values(saldoM);
                if (saldoM < ((NEW.appd_aplicado+NEW.appd_rtfte+NEW.appd_rtiva+NEW.appd_rtica)/:TRM)) then
                    EXCEPTION DOCUMENTO_ABONO_MAYOR 'EL SALDO DEL DOCUMENTO ' || NEW.appd_prefijo || NEW.appd_numero || ' ES INSUFICIENTE.';
                else
                    BEGIN
                    NEW.appd_difcambio = :SALDO - (NEW.appd_aplicado+NEW.appd_rtfte+NEW.appd_rtiva+NEW.appd_rtica);
                    NEW.appd_aplicado = NEW.appd_aplicado - NEW.appd_difcambio;
                    END
                end
            end
        END
    end
end
^

SET TERM ; ^


/* 20090404 */
/* EXCLUYA EL IMPOCONSUMO DEL ANALISIS Y DEJE CONFIGURABLE SI INCLUIR DEV.CHEQUES EN EL RECAUDO */

INSERT INTO CONFIGURACION (CONF_MODULO, CONF_CATEGORIA, CONF_PROPIEDAD, CONF_VALOR, CONF_POSIBLES, CONF_AYUDA) VALUES ('CARTERA', 'COMISIONES', 'INCLUIR RECAUDO DE CHEQUES DEVUELTOS EN COMISIONES', 'SI', 'SI,NO', 'SI: Incluye el recaudo de un cheque devuelto aplicando la tabla de comisiones dependiendo del número de días. NO: Ignora los pagos por concepto de cheques devueltos de las comisiones');
commit work;

SET TERM ^ ;

CREATE OR ALTER PROCEDURE COMISIONES_COBRO(
    DESDE INTEGER,
    HASTA INTEGER,
    FECINI DATE,
    FECFIN DATE,
    DETALLE CHAR(1))
RETURNS (
    CODVEND INTEGER,
    NOMVEND VARCHAR(60),
    NIT VARCHAR(20),
    CLIENTE VARCHAR(60),
    NOMTIPO VARCHAR(8),
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(6),
    FECDOC DATE,
    PREFREC VARCHAR(4),
    NUMREC VARCHAR(6),
    FECREC DATE,
    DIAS INTEGER,
    ABONO NUMERIC(18,2),
    BASE NUMERIC(18,2),
    COMIMONTO NUMERIC(18,2),
    COMIPORC NUMERIC(9,2),
    ARTICULO VARCHAR(20),
    CODGRP VARCHAR(2),
    CANT NUMERIC(18,4),
    DTOFIN NUMERIC(18,2),
    VENCE DATE,
    RTFTE NUMERIC(18,2),
    RTIVA NUMERIC(18,2),
    RTICA NUMERIC(18,2))
AS
DECLARE VARIABLE TIPO INTEGER;
DECLARE VARIABLE ID INTEGER;
DECLARE VARIABLE IVAMONTO NUMERIC(18,2);
DECLARE VARIABLE TOTAL NUMERIC(18,2);
DECLARE VARIABLE SITOT CHAR(2);
DECLARE VARIABLE VENTA CHAR(2);
DECLARE VARIABLE COMIV NUMERIC(18,2);
DECLARE VARIABLE PORCV NUMERIC(18,2);
DECLARE VARIABLE CONSUMO NUMERIC(18,2);
declare variable ALFINAL CHAR(2);
declare variable SALDO NUMERIC(18,2);
declare variable COMISION VARCHAR(10);
declare variable porcaux NUMERIC(9,2);
declare variable BASEAUX DOUBLE PRECISION;
declare variable SUCURSAL VARCHAR(20);
declare variable COMIART VARCHAR(6);
declare variable LISTA INTEGER;
declare variable LISTAP INTEGER;
declare variable INCDTO CHAR(2);
declare variable INCCHE CHAR(2);
DECLARE VARIABLE IDF INTEGER;
BEGIN
EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION', 'VENDEDORES', 'COMISIONES EN VENTA INCLUYENDO IMPUESTOS') returning_values (:SITOT);
EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA','COMISIONES','COMISION POR COBRO PAGADERA SOLO EN EL COBRO TOTAL') returning_values (:ALFINAL);
execute procedure lee_configuracion('CARTERA','COMISIONES','COMISION POR COBRO COMO PORCENTAJE DE LA COMISION VENTA') returning_values (:venta);
EXECUTE PROCEDURE lee_configuracion('CARTERA', 'COMISIONES', 'LIQUIDAR COMISION COBRO CON COBRADOR DEL DOCUMENTO O DEL RECIBO') returning_values (:COMISION);
EXECUTE PROCEDURE lee_configuracion ('FACTURACION','FACTURAS', 'CODIGO DE LA LISTA DE PRECIOS A MOSTRAR EN ARTICULOS') returning_values (:LISTAP);
EXECUTE PROCEDURE lee_configuracion('CARTERA', 'COMISIONES', 'COMISION POR COBRO POR ARTICULO') returning_values (:comiart);
EXECUTE PROCEDURE lee_configuracion('CARTERA', 'COMISIONES', 'INCLUIR DESCUENTO FINANCIERO EN BASE DE COMISIONES POR COBRO') returning_values (:incdto);
EXECUTE PROCEDURE lee_configuracion('CARTERA', 'COMISIONES', 'INCLUIR RECAUDO DE CHEQUES DEVUELTOS EN COMISIONES') returning_values (:incche);
FOR SELECT RCDE_TIPODOC, RCDE_IDDOC, RCDE_PREFIJO, RCDE_NUMERO, R.TERC_NIT, TERC_NOM, RECA_FECHA, (RCDE_ABONO+RCDE_RTFTE+RCDE_RTIVA+RCDE_RTICA), PREF_PRE, RECA_NUMERO, COBR_COD, RCDE_DTOF, RCDE_RTFTE, RCDE_RTIVA, RCDE_RTICA
    FROM RECIBOS_CAJA R, RECIBOS_CAJA_DETALLE RD, TERCEROS T
    WHERE R.RECA_ID = RD.RECA_ID AND RECA_FECHA >= :FECINI AND RECA_FECHA <= :FECFIN AND R.TERC_NIT = T.TERC_NIT AND RECA_ANULADO = 'N'
    ORDER BY TERC_NIT, RECA_FECHA
    INTO :TIPO, :ID, :PREFIJO, :NUMERO, :NIT, :CLIENTE, :FECREC, :ABONO, :PREFREC, :NUMREC, :codvend, :DTOFIN, :rtfte, :RTIVA, :RTICA
    DO
    BEGIN
    SELECT TIDO_NOMCORTO FROM TIPO_DOCUMENTO WHERE TIDO_COD = :TIPO INTO :NOMTIPO;
    if (incdto = 'SI') then
        ABONO = ABONO + DTOFIN;
    if (COMISION = 'DOCUMENTO') then
        SELECT MVCL_FECHA, COBR_COD, MVCL_VENCE FROM MOVIMIENTO_CLIENTES WHERE MVCL_TIPOREF = :TIPO AND MVCL_IDREF = :ID
            INTO :FECDOC, :codvend, :VENCE;
    else
        SELECT MVCL_FECHA, MVCL_VENCE FROM MOVIMIENTO_CLIENTES WHERE MVCL_TIPOREF = :TIPO AND MVCL_IDREF = :ID
            INTO :FECDOC, :VENCE;
    if (FECDOC IS NOT NULL) then
        DIAS = FECREC - FECDOC;
    ELSE
        DIAS = 999;
    if ((codvend >= :DESDE) AND (codvend <= :hasta)) then
        BEGIN
        /* TRAIGA EL PORCENTAJE DE ACUERDO A LOS DIAS */
        COMIPORC = 0;
        SELECT CMCB_PORC FROM COMISION_COBRO WHERE CMCB_DIASINI <= :dias AND CMCB_DIASFIN >= :DIAS AND COBR_COD = :CODVEND
            INTO :COMIPORC;
        if (COMIPORC IS NULL) THEN
            COMIPORC = 0;
        if (VENTA = 'NO') then
            BEGIN
            if (TIPO = 31) then
                BEGIN
                if (DETALLE = 'N') then
                    SELECT MAX(FACT_TOTAL), MAX(FACT_IVAMONTO), SUM(FADE_CONSUMO) FROM FACTURAS F, FACTURAS_DETALLE D
                        WHERE F.FACT_ID = D.FACT_ID AND F.FACT_ID = :ID INTO :TOTAL, :IVAMONTO, :CONSUMO;
                ELSE
                    FOR SELECT D.ARTI_COD, FADE_CANT, FADE_TOTAL, FADE_IVAMONTO, FADE_CONSUMO, GRUP_COD, LIPR_COD
                        FROM FACTURAS F, FACTURAS_DETALLE D, ARTICULO A
                        WHERE F.FACT_ID = D.FACT_ID AND D.arti_cod = A.arti_cod AND F.FACT_ID = :ID and substring(a.arti_cod from 1 FOR 2) <> '.t'
                        INTO :ARTICULO, :CANT, :TOTAL, :IVAMONTO, :CONSUMO, :CODGRP, :lista
                        DO
                        BEGIN
                        if (comiart = 'GRUPO') then
                            SELECT GRUP_COMIPOR FROM GRUPO WHERE GRUP_COD = :codgrp INTO :comiporc;
                        if (comiart = 'PRECIO') then
                            SELECT PRAR_COMI FROM precios_articulo WHERE ARTI_COD = :articulo AND LIPR_COD = :LISTA INTO :comiporc;

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

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

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER PROCEDURE ANALISIS_VENTAS_VENDEDOR(
    AGENCIA INTEGER,
    VENDINI INTEGER,
    VENDFIN INTEGER,
    FECHA DATE)
RETURNS (
    CODVEND INTEGER,
    NOMVEND VARCHAR(60),
    CODAGENCIA INTEGER,
    NOMAGENCIA VARCHAR(60),
    PRESUPUESTO NUMERIC(18,2),
    VENTAS NUMERIC(18,2),
    VENTADIA NUMERIC(18,2),
    PENDIENTE NUMERIC(18,2),
    FALTANTE NUMERIC(18,2),
    FALTANTEDIA NUMERIC(18,2),
    PORCENTAJE NUMERIC(9,2),
    PROMEDIO NUMERIC(18,2),
    ESPERADO NUMERIC(18,2),
    RECAUDO NUMERIC(18,2),
    RECAUDODIA NUMERIC(18,2),
    PENDIENTER NUMERIC(18,2),
    MOSTRADORV NUMERIC(18,2),
    MOSTRADORR NUMERIC(18,2),
    MAXIMAVTA NUMERIC(18,2),
    MESMAXIMO VARCHAR(8),
    VENTAANOP NUMERIC(18,2),
    DEBERIAIR NUMERIC(9,2))
AS
DECLARE VARIABLE FECAUX VARCHAR(10);
DECLARE VARIABLE FECINI VARCHAR(10);
DECLARE VARIABLE FEC DATE;
DECLARE VARIABLE ANO INTEGER;
DECLARE VARIABLE MES INTEGER;
DECLARE VARIABLE TIPODOC INTEGER;
DECLARE VARIABLE ID INTEGER;
DECLARE VARIABLE ABONO NUMERIC(18,2);
DECLARE VARIABLE SUBTOTAL NUMERIC(18,2);
DECLARE VARIABLE IVAMONTO NUMERIC(18,2);
DECLARE VARIABLE TOTAL NUMERIC(18,2);
DECLARE VARIABLE ESCONTADO CHAR(1);
DECLARE VARIABLE DIAS INTEGER;
DECLARE VARIABLE AGEN_ANT INTEGER;
DECLARE VARIABLE TOTAL_SUC NUMERIC(18,2);
declare variable DIA INTEGER;
DECLARE VARIABLE CONSUMO NUMERIC(18,2);
declare variable INCCHE CHAR(2);
begin
EXECUTE PROCEDURE lee_configuracion('CARTERA', 'COMISIONES', 'INCLUIR RECAUDO DE CHEQUES DEVUELTOS EN COMISIONES') returning_values (:incche);
MOSTRADORV = 0;
MOSTRADORR = 0;
AGEN_ANT = 0;
total_suc = 0;
FECAUX = CAST (FECHA AS VARCHAR(10));
ANO = CAST(SUBSTR(FECAUX, 1, 4) AS INTEGER);
MES = CAST(SUBSTR(FECAUX, 6, 7) AS INTEGER);
FECINI = SUBSTR(FECAUX, 1, 8) || '01';
DIA = extract (DAY FROM FECHA);
/*SELECT PRVM_DIAS FROM PRESUPUESTO_VENTAS_MESES WHERE PRVM_ANO = :ANO AND PRVM_MES = :MES INTO :DIAS; */
DIAS = EXTRACT(DAY FROM (FECHA - EXTRACT(DAY FROM FECHA) + 32 - EXTRACT(DAY FROM FECHA - EXTRACT(DAY FROM FECHA) + 32)));
FOR SELECT VEND_COD, VEND_NOMBRE, SUCU_ID, VEND_CONTADO FROM VENDEDORES WHERE VEND_COD >= :VENDINI AND VEND_COD <= :VENDFIN  AND
    ((SUCU_ID = :AGENCIA) or (:AGENCIA = 0)) ORDER BY SUCU_ID, VEND_COD
    INTO :CODVEND, :NOMVEND, :CODAGENCIA, :ESCONTADO
    DO
    BEGIN
    if (CODAGENCIA IS NULL) then
        CODAGENCIA = 0;
    if (CODAGENCIA <> 0) then
        BEGIN
        SELECT SUCU_NOMBRE FROM SUCURSALES WHERE SUCU_ID = :CODAGENCIA INTO :NOMAGENCIA;
        MAXIMAVTA = 0;
        MESMAXIMO = '';
        VENTAANOP = 0;
        /* LA MAXIMA VENTA Y EL MES EN QUE OCURRIO */
        SELECT MAX(HIVE_VENTA) FROM historico_ventas WHERE SUCU_ID = :codagencia INTO maximavta;
        SELECT MAX(CAST(HIVE_MES AS CHAR(2)) || '/' || CAST(HIVE_ANO AS CHAR(4))) FROM
            historico_ventas WHERE HIVE_VENTA = :maximavta AND SUCU_ID = :codagencia INTO :mesmaximo;
        /* LA VENTA DEL MISMO MES EL ANO ANTERIOR */
        SELECT HIVE_VENTA FROM historico_ventas WHERE HIVE_ANO = :ANO-1 AND HIVE_MES = :MES AND SUCU_ID = :codagencia INTO :ventaanop;
        END
    /* TRAIGA EL PRESUPUESTO DEL MES */
    PRESUPUESTO = 0;
    PENDIENTE = 0;
    PENDIENTER = 0;
    SELECT PRVE_VENTA, PRVE_PENDIENTE, PRVE_PENDRECA FROM PRESUPUESTO_VENTAS
        WHERE VEND_COD = :CODVEND AND PRVE_ANO = :ANO AND PRVE_MES = :MES
        INTO :PRESUPUESTO, :PENDIENTE, :PENDIENTER;

    /* CALCULE LAS VENTAS */
    SELECT SUM(FACT_TOTAL-FACT_IVAMONTO) FROM FACTURAS F, PREFIJOS P
        WHERE VEND_COD = :CODVEND AND FACT_FECHA = :FECHA AND FACT_ANULADO = 'N'
        AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND ((SUCU_ID = :AGENCIA) or (:AGENCIA = 0))
        INTO :VENTADIA;
    if (VENTADIA is null) then
        VENTADIA = 0;
    SELECT SUM(FACT_TOTAL-FACT_IVAMONTO) FROM FACTURAS F, PREFIJOS P
        WHERE VEND_COD = :CODVEND AND FACT_FECHA >= :FECINI AND FACT_FECHA < :FECHA AND FACT_ANULADO = 'N'
        AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND ((SUCU_ID = :AGENCIA) or (:AGENCIA = 0))
        INTO :SUBTOTAL;
    if (subtotal is null) then
        ventas = VENTADIA;
    else
        VENTAS = SUBTOTAL + VENTADIA;
    /* CALCULE LAS DEVOLUCIONES */
    SELECT SUM(DEVT_TOTAL-DEVT_IVAMONTO) FROM devoluciones_ventas F, PREFIJOS P
        WHERE VEND_COD = :CODVEND AND DEVT_FECHA = :FECHA AND DEVT_ANULADO = 'N'
        AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 33 AND ((SUCU_ID = :AGENCIA) or (:AGENCIA = 0))
        INTO :SUBTOTAL;
    if (subtotal is not null) then
        BEGIN
        VENTADIA = VENTADIA - SUBTOTAL;
        VENTAS = VENTAS - SUBTOTAL;
        END
    SELECT SUM(DEVT_TOTAL-DEVT_IVAMONTO) FROM devoluciones_ventas F, PREFIJOS P
        WHERE VEND_COD = :CODVEND AND DEVT_FECHA >= :FECINI AND DEVT_FECHA < :FECHA AND DEVT_ANULADO = 'N'
        AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 33 AND ((SUCU_ID = :AGENCIA) or (:AGENCIA = 0))
        INTO :SUBTOTAL;
    if (subtotal is not null) then
        VENTAS = VENTAS - SUBTOTAL;
    /* CALCULE LAS NOTAS CREDITO */
    SELECT SUM(NCCL_MONTO) FROM NOTAS_CREDITO_CLIENTES F, PREFIJOS P
        WHERE VEND_COD = :CODVEND AND NCCL_FECHA = :FECHA AND NCCL_ANULADO = 'N'
        AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 42 AND ((SUCU_ID = :AGENCIA) or (:AGENCIA = 0))
        INTO :SUBTOTAL;
    if (subtotal is not null) then
        BEGIN
        VENTADIA = VENTADIA - SUBTOTAL;
        VENTAS = VENTAS - SUBTOTAL;
        END
    SELECT SUM(NCCL_MONTO) FROM NOTAS_CREDITO_CLIENTES F, PREFIJOS P
        WHERE VEND_COD = :CODVEND AND NCCL_FECHA >= :FECINI AND NCCL_FECHA < :FECHA AND NCCL_ANULADO = 'N'
        AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 42 AND ((SUCU_ID = :AGENCIA) or (:AGENCIA = 0))
        INTO :SUBTOTAL;
    if (subtotal is not null) then
        VENTAS = VENTAS - SUBTOTAL;
    FALTANTE = PRESUPUESTO - VENTAS;
    if (DIAS - DIA > 0) then
        FALTANTEDIA = FALTANTE / (DIAS - DIA);
    ELSE
        FALTANTEDIA = FALTANTE;
    if (PRESUPUESTO <> 0) then
        PORCENTAJE = VENTAS / PRESUPUESTO * 100;
    ELSE
        PORCENTAJE = 0;
    PROMEDIO = (VENTAS + PENDIENTE) / DIA;
    ESPERADO = PROMEDIO * DIAS;
    DEBERIAIR = DIA * 100/ dias;
    RECAUDO = 0;
    RECAUDODIA = 0;
    /* CALCULE EL RECAUDO DEL MES EXCLUYENDO EL IVA */
    FOR SELECT RECA_FECHA, RCDE_TIPODOC, RCDE_IDDOC, (RCDE_ABONO+RCDE_RTFTE+RCDE_RTIVA+RCDE_RTICA)
        FROM RECIBOS_CAJA R, RECIBOS_CAJA_DETALLE RD
        WHERE R.RECA_ID = RD.RECA_ID AND
        RECA_FECHA >= :FECINI AND RECA_FECHA <= :FECHA AND RECA_ANULADO = 'N' AND COBR_COD = :CODVEND
        ORDER BY RECA_FECHA
        INTO :FEC, :TIPODOC, :ID, :ABONO
        DO
        BEGIN
        /* TRAIGA EL DOCUMENTO Y CALCULE LA BASE */
        if (TIPODOC = 31) then
            BEGIN
            SELECT FACT_TOTAL,FACT_IVAMONTO FROM FACTURAS WHERE FACT_ID = :ID INTO :TOTAL, :IVAMONTO;
            SELECT SUM(FADE_CONSUMO) FROM FACTURAS_DETALLE D WHERE FACT_ID = :ID INTO :CONSUMO;
            END
        if (TIPODOC = 33) then
            BEGIN
            SELECT DEVT_TOTAL*-1,DEVT_IVAMONTO*-1 FROM DEVOLUCIONES_VENTAS WHERE DEVT_ID = :ID INTO :TOTAL, :IVAMONTO;
            SELECT SUM(DVDE_CONSUMO) FROM DEVOLUCIONES_VENTAS_DETALLE D WHERE DEVT_ID = :ID INTO :CONSUMO;
            END
        if (TIPODOC = 41) then
            BEGIN
            SELECT NDCL_MONTO,NDCL_IVAMONTO FROM NOTAS_DEBITO_CLIENTES WHERE NDCL_ID = :ID INTO :TOTAL, :IVAMONTO;
            CONSUMO = 0;
            END
        if (TIPODOC = 42) then
            BEGIN
            SELECT NCCL_MONTO*-1,NCCL_IVAMONTO*-1 FROM NOTAS_CREDITO_CLIENTES WHERE NCCL_ID = :ID INTO :TOTAL, :IVAMONTO;
            CONSUMO = 0;
            END
        if (TIPODOC = 77) then
            BEGIN
            if (INCCHE = 'SI') then
                SELECT DVCH_MONTO,0 FROM DEVOLUCION_CHEQUES WHERE DVCH_ID = :ID INTO :TOTAL, :IVAMONTO;
            else
                BEGIN
                TOTAL = 0;
                IVAMONTO = 0;
                END
            CONSUMO = 0;
            END
        if (TOTAL <> 0) then
            SUBTOTAL = (TOTAL - IVAMONTO - CONSUMO) / TOTAL * ABONO;
        ELSE
            SUBTOTAL = 0;
        RECAUDO = RECAUDO + SUBTOTAL;
        if (FEC = FECHA) then
            RECAUDODIA = RECAUDODIA + SUBTOTAL;
        END
    if (ESCONTADO = 'S') then
        BEGIN
        MOSTRADORV = MOSTRADORV + VENTAS;
        MOSTRADORR = MOSTRADORR + RECAUDO;
        END
    /* actualice el historico */
    if (AGEN_ANT <> codagencia)  then
        BEGIN
        if (AGEN_ANT <> 0) THEN
            BEGIN
            TOTAL = null;
            SELECT HIVE_VENTA FROM historico_ventas WHERE HIVE_ANO = :ANO AND HIVE_MES = :MES AND SUCU_ID = :AGEN_ANT INTO :TOTAL;
            if (TOTAL is not null) then
                BEGIN
                if (TOTAL_SUC <> 0) then
                    UPDATE historico_ventas SET HIVE_VENTA = (:total_suc)  WHERE HIVE_ANO = :ANO AND HIVE_MES = :MES AND SUCU_ID = :AGEN_ANT;
                END
            ELSE
                INSERT INTO historico_ventas (HIVE_ANO, HIVE_MES, SUCU_ID, HIVE_VENTA) VALUES (:ANO, :MES, :AGEN_ANT, :TOTAL_SUC);
            END
        total_suc = VENTAS;
        END
    ELSE
        BEGIN
        total_suc = :total_suc + :VENTAS;
        END
    AGEN_ANT = :codagencia;
    if ((VENTAS <> 0) or (RECAUDO <> 0) or (:presupuesto <> 0)) then
        suspend;
    END
/* actualice la ultima agencia */
TOTAL = null;
SELECT HIVE_VENTA FROM historico_ventas WHERE HIVE_ANO = :ANO AND HIVE_MES = :MES AND SUCU_ID = :AGEN_ANT INTO :TOTAL;
if (TOTAL is not null) then
    BEGIN
    if (TOTAL_SUC <> 0) then
        UPDATE historico_ventas SET HIVE_VENTA = (:total_suc)  WHERE HIVE_ANO = :ANO AND HIVE_MES = :MES AND SUCU_ID = :AGEN_ANT;
    END
ELSE
    INSERT INTO historico_ventas (HIVE_ANO, HIVE_MES, SUCU_ID, HIVE_VENTA) VALUES (:ANO, :MES, :AGEN_ANT, :TOTAL_SUC);
end
^

SET TERM ; ^


/* 20090406 */
/* NO ACTUALICE EL INVENTARIO SI SOLO CAMBIA EL DEVUELTO */

SET TERM ^ ;

CREATE OR ALTER TRIGGER REMISIONES_VENTA_DETALLE_AU FOR REMISIONES_VENTA_DETALLE
ACTIVE AFTER UPDATE POSITION 0
AS
declare variable fec date;
declare variable CONC VARCHAR(60);
declare variable NOMCLI varchar(60);
declare variable Pref varchar(4);
declare variable Num varchar(6);
declare variable Nit varchar(20);
declare variable factor numeric(18,4);
declare variable Tipo integer;
declare variable idfact integer;
declare variable numrows integer;
declare variable CANTREL NUMERIC(18,4);
declare variable CONSO CHAR(2);
declare variable CONSOLIDA INTEGER;
declare variable PEDAUTO CHAR(2);
declare variable IDPED INTEGER;
BEGIN
/* Anule el anterior */
if ((OLD.revt_id <> 0) AND (OLD.rvde_anulado = 'N')) then
  if ((OLD.rvde_cant * OLD.rvde_factor <> NEW.rvde_cant * NEW.rvde_factor) or (OLD.rvde_total <> NEW.rvde_total) or (OLD.arti_cod <> NEW.arti_cod) or (NEW.rvde_anulado = 'S')) then
    begin
    delete from movimiento_articulo where (mvar_tipodoc = 32) and (mvar_idref = old.revt_id) and (mvar_item = old.rvde_item);
    select REVT_CONSOLIDA, LIPR_COD from remisiones_venta where revt_id = old.revt_id into :CONSOLIDA, :IDPED;
    if (CONSOLIDA <> 0) then
        begin
        EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION', 'FACTURAS', 'GENERAR PEDIDO AUTOMATICAMENTE CON LA FACTURA') returning_values (pedauto);
        EXECUTE procedure LEE_CONFIGURACION ('FACTURACION','DOCUMENTOS','DEJAR PENDIENTES LOS ARTICULOS NO INCLUIDOS AL TRAER DOCUMENTOS RELACIONADOS') returning_values (CONSO);
        if (CONSO = 'SI') then
            begin
            UPDATE consolidado_faltantes SET COFA_OK = 'N' WHERE COFA_ID = :consolida AND COFA_ITEM = old.RVDE_ITEM AND ARTI_COD = old.arti_cod;
            if (PEDAUTO = 'SI') then
                UPDATE consolidado_faltantes SET COFA_OK = 'N' WHERE COFA_ID = :idped AND COFA_ITEM = old.RVDE_ITEM AND ARTI_COD = old.arti_cod;
            end
        else
            BEGIN
            UPDATE consolidado_faltantes SET COFA_OK = 'N' WHERE COFA_ID = :consolida;
            if (PEDAUTO = 'SI') then
                UPDATE consolidado_faltantes SET COFA_OK = 'N' WHERE COFA_ID = :idped;
            END
        END
    end
/* Registre el nuevo */
if ((new.revt_id <> 0) AND (new.rvde_anulado = 'N')) then
  if ((OLD.rvde_cant * OLD.rvde_factor <> NEW.rvde_cant * NEW.rvde_factor) or (OLD.rvde_total <> NEW.rvde_total) or (OLD.arti_cod <> NEW.arti_cod) or (OLD.rvde_anulado = 'S')) then
    begin
    select revt_fecha, pref_pre, revt_numero, terc_nit, revt_nomterc, REVT_CONSOLIDA, lipr_cod
        from remisiones_venta where revt_id = new.revt_id
        into :fec, :Pref, :Num, :Nit, :Nomcli, :CONSOLIDA, :idped;
    CONC = 'REMISION A CLIENTE No.' || PREF || NUM;
    NOMCLI = SUBSTR(NOMCLI, 1, 24);
    conc = conc || '-' || NOMCLI;

    SELECT MAX(CEFA_TIPOORI), MAX(CEFA_IDORI) FROM consolide_faltantes WHERE CEFA_ID = :CONSOLIDA INTO :TIPO, :IDFACT;
    if (Tipo is null) then
        Tipo = 0;
    if (Idfact is null) then
        Idfact = 0;
    /* si se hizo con base en una factura que afecto el inventario no afecte inventario */
    numrows = 0;
    if (Tipo = 31) Then
        begin
        select count(*) from movimiento_articulo where mvar_tipodoc = 31 and mvar_idref = :idfact into :numrows;
        if (numrows is null) then
            numrows = 0;
        end
    if (numrows = 0) then
        begin
        /* Registre el nuevo */
        execute procedure factor_unidad_cant(new.arti_cod, new.rvde_unidad) returning_values(factor);
        INSERT INTO MOVIMIENTO_ARTICULO
            (ARTI_COD, MVAR_CONS, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM, TERC_NIT)
            VALUES(NEW.ARTI_COD, GEN_ID(ID_MOVARTI,1), NEW.BODE_COD, :FEC, 32, NEW.revt_id,
            :CONC, :factor * new.rvde_cant, 0, 'N', new.rvde_lote, :Pref, :Num, new.rvde_item, :Nit);
        end
    /* ACTUALICE EL PENDIENTE  */
    if (CONSOLIDA <> 0) then
        begin
        EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION', 'FACTURAS', 'GENERAR PEDIDO AUTOMATICAMENTE CON LA FACTURA') returning_values (pedauto);
        EXECUTE procedure LEE_CONFIGURACION ('FACTURACION','DOCUMENTOS','DEJAR PENDIENTES LOS ARTICULOS NO INCLUIDOS AL TRAER DOCUMENTOS RELACIONADOS') returning_values (CONSO);
        if (CONSO = 'SI') then
            BEGIN
            /* BUSQUE EL CONSOLIDADO EN EL MISMO ITEM Y SI ES DIFERENTE ACTUALICELO */
            select COFA_CANT * COFA_FACTOR FROM consolidado_faltantes WHERE COFA_ID = :consolida AND COFA_ITEM = NEW.RVDE_ITEM AND ARTI_COD = NEW.arti_cod INTO :CANTREL;
            if (NEW.RVDE_CANT * NEW.RVDE_FACTOR < CANTREL) then
                begin
                UPDATE consolidado_faltantes SET COFA_IDDES = NEW.revt_id, COFA_CANT = NEW.RVDE_CANT, COFA_FACTOR = NEW.RVDE_FACTOR, COFA_OK = 'S' 
                    WHERE COFA_ID = :consolida AND COFA_ITEM = NEW.RVDE_ITEM AND ARTI_COD = NEW.arti_cod;
                if (PEDAUTO = 'SI') then
                    UPDATE consolidado_faltantes SET COFA_IDDES = NEW.revt_id, COFA_CANT = NEW.RVDE_CANT, COFA_FACTOR = NEW.RVDE_FACTOR, COFA_OK = 'S' 
                        WHERE COFA_ID = :idped AND COFA_ITEM = NEW.RVDE_ITEM AND ARTI_COD = NEW.arti_cod;
                end
            else
                begin
                UPDATE consolidado_faltantes SET COFA_IDDES = NEW.revt_id, COFA_OK = 'S' WHERE COFA_ID = :consolida AND COFA_ITEM = NEW.RVDE_ITEM AND ARTI_COD = NEW.arti_cod;
                if (PEDAUTO = 'SI') then
                    UPDATE consolidado_faltantes SET COFA_IDDES = NEW.revt_id, COFA_OK = 'S' WHERE COFA_ID = :idped AND COFA_ITEM = NEW.RVDE_ITEM AND ARTI_COD = NEW.arti_cod;
                end
            END
        else
            begin
            UPDATE consolidado_faltantes SET COFA_IDDES = NEW.revt_id, COFA_OK = 'S' WHERE COFA_ID = :consolida;
            if (PEDAUTO = 'SI') then
                UPDATE consolidado_faltantes SET COFA_IDDES = NEW.revt_id, COFA_OK = 'S' WHERE COFA_ID = :idped;
            end
        END
    end
END
^

SET TERM ; ^


SET TERM ^ ;

CREATE OR ALTER TRIGGER FACTURAS_DETALLE_AU FOR FACTURAS_DETALLE
ACTIVE AFTER UPDATE POSITION 0
as
declare variable fec date;
declare variable CONC VARCHAR(60);
declare variable NOMCLI varchar(60);
declare variable Pref varchar(4);
declare variable Num varchar(6);
declare variable Nit varchar(20);
declare variable factor numeric(18,4);
declare variable INVFAC CHAR(2);
declare variable TIPO INTEGER;
declare variable PEDAUTO CHAR(2);
declare variable CANTREL NUMERIC(18,4);
declare variable CONSO CHAR(2);
declare variable CONSOLIDA INTEGER;
declare variable consec INTEGER;
declare variable ESPOS CHAR(1);
BEGIN
EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION','FACTURAS','GENERAR PEDIDO AUTOMATICAMENTE CON LA FACTURA') RETURNING_VALUES (PEDAUTO);
if ((OLD.fact_id <> 0) AND (OLD.fade_anulado = 'N')) then
    BEGIN
    if ((OLD.FADE_CANT * OLD.FADE_FACTOR <> NEW.fade_cant * NEW.fade_factor) or (OLD.fade_total <> NEW.fade_total) or (OLD.arti_cod <> NEW.arti_cod) or (NEW.fade_anulado = 'S')) then
        begin
        DELETE FROM MOVIMIENTO_ARTICULO WHERE (mvar_tipodoc = 31) and (mvar_idref = OLD.fact_id) and (mvar_item = old.fade_item);

        if (PEDAUTO = 'SI') then
            BEGIN
            SELECT pref_pre, fact_numero from facturas where fact_id = OLD.fact_id
                into :Pref, :Num;
            SELECT PEDI_ID FROM PEDIDOS WHERE PREF_PRE = :pref AND PEDI_NUMERO = :num into :consec;
            if (consec is not null) then
              DELETE FROM PEDIDOS_DETALLE WHERE PEDE_ITEM = OLD.FADE_ITEM AND PEDI_ID = :consec;
            END
        ELSE
            BEGIN
            /* DESHAGA LOS PENDIENTES */
            SELECT fact_consolida from facturas where fact_id = OLD.fact_id into :Consolida;
            if (CONSOLIDA <> 0) then
                BEGIN
                UPDATE consolidado_faltantes SET COFA_OK = 'N' WHERE COFA_ID = :consolida AND COFA_ITEM = OLD.FADE_ITEM AND ARTI_COD = OLD.arti_cod;
                EXECUTE procedure LEE_CONFIGURACION ('FACTURACION','DOCUMENTOS','DEJAR PENDIENTES LOS ARTICULOS NO INCLUIDOS AL TRAER DOCUMENTOS RELACIONADOS') returning_values (CONSO);
                if (CONSO = 'NO') then
                    UPDATE consolidado_faltantes SET COFA_OK = 'N' WHERE COFA_ID = :consolida;
                END
            END
        end
    END
if ((NEW.fact_id <> 0) and (new.fade_anulado = 'N')) then
    if ((OLD.fact_id = 0) OR (OLD.FADE_CANT * OLD.FADE_FACTOR <> NEW.fade_cant * NEW.fade_factor) or (OLD.fade_total <> NEW.fade_total) or (OLD.arti_cod <> NEW.arti_cod) or (OLD.fade_anulado = 'S')) then
      BEGIN
      select fact_fecha, pref_pre, fact_numero, terc_nit, fact_nomcliente, fact_consolida
            from facturas where fact_id = new.fact_id
            into :fec, :Pref, :Num, :Nit, :Nomcli, :Consolida;
      SELECT MAX(CEFA_TIPOORI) FROM consolide_faltantes WHERE CEFA_ID = :CONSOLIDA INTO :TIPO;
      if (Tipo IS NULL) then
        Tipo = 0;
      execute procedure lee_configuracion('FACTURACION', 'FACTURAS', 'AFECTAR INVENTARIO CON LA FACTURA') returning_values (:INVFAC);
      SELECT MIN(AUTO_ESPOS) FROM AUTORIZACIONES WHERE PREF_PRE = :pref INTO :ESPOS;
      if (ESPOS = 'S') then
        BEGIN
        INVFAC = 'SI';
        PEDAUTO = 'NO';
        END
       /* si se hizo con base en una remisi¢n no afecte inventario */
      if ((Tipo <> 32) and (INVFAC = 'SI')) then
        begin
        if (STRLEN(NOMCLI) > 29) then
            CONC = 'FACTURA DE VENTA No.' || PREF || NUM || '-' || SUBSTR(NOMCLI,1,29);
        ELSE
            CONC = 'FACTURA DE VENTA No.' || PREF || NUM || '-' || NOMCLI;
        DELETE FROM MOVIMIENTO_ARTICULO WHERE (mvar_tipodoc = 31) and (mvar_idref = OLD.fact_id) and (mvar_item = old.fade_item);
        execute procedure factor_unidad_cant(new.arti_cod, new.fade_unidad) returning_values(factor);
        INSERT INTO MOVIMIENTO_ARTICULO
            (ARTI_COD, MVAR_CONS, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM, TERC_NIT)
            VALUES(NEW.ARTI_COD, GEN_ID(ID_MOVARTI,1), NEW.BODE_COD, :FEC, 31, NEW.fact_id,
            :CONC, :factor * new.fade_cant, 0, 'N', new.fade_lote, :Pref, :Num, new.fade_item, :Nit);
        end
        if (PEDAUTO = 'SI') then
          BEGIN
          INSERT INTO PEDIDOS_DETALLE (PEDI_ID, PEDE_ITEM, ARTI_COD, PEDE_CANT, PEDE_UNIDAD, PEDE_DTOPORC, PEDE_DTOMONTO, PEDE_IVAPORC, PEDE_IVAMONTO, PEDE_CONSUMO, PEDE_FACTOR, PEDE_DESC, PEDE_OBS, PEDE_CODBAR, PEDE_TOTAL, PEDE_ANULADO, PEDE_TRANSMIT, LIPR_COD, PEDE_REFERENCIA, PEDE_PRUNIT, PEDE_FACTURAD, PEDE_REMISIONAD, PEDE_RESERVA, BODE_COD)
            VALUES (0, NEW.FADE_ITEM, NEW.ARTI_COD, NEW.FADE_CANT, NEW.FADE_UNIDAD, NEW.FADE_DTOPORC, NEW.FADE_DTOMONTO, NEW.FADE_IVAPORC, NEW.FADE_IVAMONTO, NEW.FADE_CONSUMO, NEW.FADE_FACTOR, NEW.FADE_DESC, NEW.FADE_OBS, NEW.FADE_CODBAR, NEW.FADE_TOTAL, 'N', 'N', NEW.LIPR_COD, NEW.FADE_REFERENCIA, NEW.FADE_PRUNIT, NEW.FADE_CANT * NEW.FADE_FACTOR, 0, NEW.FADE_CANT * NEW.FADE_FACTOR, NEW.bode_cod);
          END
        ELSE
          BEGIN
          if (CONSOLIDA <> 0) then
            BEGIN
            UPDATE consolidado_faltantes SET COFA_OK = 'S' WHERE COFA_ID = :consolida AND COFA_ITEM = NEW.FADE_ITEM AND ARTI_COD = NEW.arti_cod;
            EXECUTE procedure LEE_CONFIGURACION ('FACTURACION','DOCUMENTOS','DEJAR PENDIENTES LOS ARTICULOS NO INCLUIDOS AL TRAER DOCUMENTOS RELACIONADOS') returning_values (CONSO);
            if (CONSO = 'NO') then
                UPDATE consolidado_faltantes SET COFA_OK = 'S' WHERE COFA_ID = :consolida;
            ELSE
                BEGIN
                /* BUSQUE EL CONSOLIDADO EN EL MISMO ITEM Y SI ES DIFERENTE ACTUALICELO */
                select COFA_CANT * COFA_FACTOR FROM consolidado_faltantes WHERE COFA_ID = :consolida AND COFA_ITEM = NEW.FADE_ITEM AND ARTI_COD = NEW.arti_cod INTO :CANTREL;
                if (NEW.FADE_CANT * NEW.FADE_FACTOR < CANTREL) then
                    UPDATE consolidado_faltantes SET COFA_CANT = NEW.FADE_CANT, COFA_FACTOR = NEW.FADE_FACTOR
                        WHERE COFA_ID = :consolida AND COFA_ITEM = NEW.FADE_ITEM AND ARTI_COD = NEW.arti_cod;
                END
            END
          END
        END
END
^

SET TERM ; ^

/* 20090406b AGREGUE CONSUMO, IVAMONTO Y TOTAL CON IMPUESTOS */

SET TERM ^ ;

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

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

SET TERM ; ^


/* 20090406c */
/* CUANDO HAN CAMBIADO LAS TARIFAS DE LOS ARTICULOS HAY QUE RECONTABILIZAR CON BASE EN EL PORCENTAJE QUE TENIAN EN EL DOCUMENTO Y NO EN EL ARTICULO */
SET TERM ^ ;

CREATE OR ALTER PROCEDURE CONTABIL_FACTURA_IVA(
    IDDOC INTEGER,
    IDINTER INTEGER)
RETURNS (
    ERROR INTEGER,
    VER CHAR(1),
    IDC INTEGER)
AS
declare variable pref varchar(4);
declare variable num varchar(6);
declare variable numero varchar(10);
declare variable fecaux date;
declare variable fecha char(8);
declare variable conc varchar(60);
declare variable venceaux date;
declare variable vence char(8);
declare variable vrdto numeric(18,2);
declare variable vradic numeric(18,2);
declare variable vrsubt numeric(18,2);
declare variable vriva numeric(18,2);
declare variable prtfte numeric(9,2);
declare variable vrrtfte numeric(18,2);
declare variable vrrtiva numeric(18,2);
declare variable prtica numeric(9,2);
declare variable vrrtica numeric(18,2);
declare variable vrtotal numeric(18,2);
declare variable vrextra numeric(18,2);
declare variable tipocomp varchar(3);
declare variable prefcont varchar(4);
declare variable ventas char(1);
declare variable ctaventas varchar(20);
declare variable iva char(1);
declare variable ctaiva varchar(20);
declare variable consumo char(1);
declare variable ctaconsumo varchar(20);
declare variable cartera char(1);
declare variable ctacartera varchar(20);
declare variable rtfte char(1);
declare variable ctartfte varchar(20);
declare variable rtiva char(1);
declare variable ctartiva varchar(20);
declare variable rtica char(1);
declare variable ctartica varchar(20);
declare variable inven char(1);
declare variable ctainven varchar(20);
declare variable costos char(1);
declare variable ctacostos varchar(20);
declare variable ctadto varchar(20);
declare variable ctaadic varchar(20);
declare variable ctaextra varchar(20);
declare variable existe char(1);
declare variable cuenta varchar(20);
declare variable monto numeric(18,2);
declare variable tipocuen char(1);
declare variable nit varchar(20);
declare variable nombre varchar(60);
declare variable proy varchar(4);
declare variable centro varchar(4);
declare variable porc numeric(5,2);
declare variable debito numeric(18,2);
declare variable credito numeric(18,2);
declare variable nroi integer;
declare variable art varchar(15);
declare variable imptos numeric(18,2);
declare variable suma numeric(18,2);
declare variable porciva numeric(9,2);
declare variable tctaclien varchar(20);
declare variable tctaventa varchar(20);
declare variable tctartfte varchar(20);
declare variable tctartiva varchar(20);
declare variable tctartica varchar(20);
declare variable ctadic varchar(20);
declare variable baseadic varchar(20);
declare variable porcadic numeric(5,2);
declare variable valoradic numeric(18,2);
declare variable dbadic char(1);
declare variable ptovta integer;
declare variable anulado char(1);
declare variable dig integer;
declare variable mercancia numeric(18,2);
declare variable fomento varchar(2);
declare variable DTOXIT varchar(2);
declare variable vrconsumo numeric(18,2);
declare variable factor double precision;
declare variable cent char(1);
declare variable AUTORET VARCHAR(10);
declare variable FAUTORET DATE;
declare variable ERRORC INTEGER;
BEGIN
EXECUTE PROCEDURE LEE_CONFIGURACION('COMPRAS', 'FACTURAS', 'USAR IMPOCONSUMO COMO PORCENTAJE DE FOMENTO') returning_values (FOMENTO);
EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'FECHA AUTORETENEDOR NO DESCONTAR RETENCIONES DEL SALDO PERO SI CONTABILIZARLAS') returning_values (AUTORET);
if (AUTORET <> '') then
    FAUTORET = CAST(AUTORET AS DATE);
else
    FAUTORET = '9999/12/31';
/* BUSQUE LA INTERFACE */
EXISTE = 'N';
SELECT 'S', TICO_COD, PRCO_PRE, INVE_VENTAS, INVE_IVA, INVE_CONSUMO, INVE_CARTERA, INVE_RTFTE, INVE_RTIVA, INVE_RTICA, INVE_COSTO, INVE_INVEN, INVE_CTAVENTAS, INVE_CTAIVA, INVE_CTACONSUMO, INVE_CTADTO, INVE_CTAADIC, INVE_CTAEXTRA, INVE_CTACARTERA, INVE_CTARTFTE, INVE_CTARTIVA, INVE_CTARTICA, INVE_CTAINVEN, INVE_CTACOSTOS, INVE_CONFIRMAR, INVE_CENTRO
    FROM INTERFAZ_VENTAS
    WHERE INVE_ID = :IDINTER
    INTO :EXISTE, :TIPOCOMP, :PREFCONT, :VENTAS, :IVA, :CONSUMO, :CARTERA, :RTFTE, :RTIVA, :RTICA, :COSTOS, :INVEN, :CTAVENTAS, :CTAIVA, :CTACONSUMO, :CTADTO, :CTAADIC, :CTAEXTRA, :CTACARTERA, :CTARTFTE, :CTARTIVA, :CTARTICA, :CTAINVEN, :CTACOSTOS, :VER, :CENT;
if (EXISTE = 'S') then
  BEGIN
    /* BORRE CUALQUEIR CONTABILIZACION PREVIA */
    DELETE FROM CONTABILIZACION WHERE CNTB_TIPOREF = 31 AND CNTB_IDREF = :IDDOC;

  /* TRAIGA EL ENCABEZADO DE LA FACTURA */
  SELECT PREF_PRE, FACT_NUMERO, FACT_FECHA, F.TERC_NIT, PTVT_ID, FACT_VENCE, FACT_DTOMONTO, FACT_ADICIONAL, FACT_IVAMONTO, FACT_EXTRA, FACT_TOTAL, FACT_RTFTEPOR, FACT_RTFTEMONTO, FACT_RTIVAPOR, FACT_RTIVAMONTO, FACT_RTICAPOR, FACT_RTICAMONTO, FACT_NOMCLIENTE, TERC_CTARTFTE, TERC_CTARTIVA, TERC_CTARTICA, TERC_CTAVENTA, TERC_CTACLIENTE, FACT_ANULADO
        FROM FACTURAS F, TERCEROS T
        WHERE FACT_ID = :IDDOC AND F.TERC_NIT = T.TERC_NIT
        INTO :PREF, :NUM, :FECAUX, :NIT, :PTOVTA, :VENCEAUX, :VRDTO, :VRADIC, :VRIVA, :VREXTRA, :VRTOTAL, :PRTFTE, :VRRTFTE, :PORC, :VRRTIVA, :PRTICA, :VRRTICA, :NOMBRE, TCTARTFTE, TCTARTIVA, TCTARTICA, TCTAVENTA, TCTACLIEN, ANULADO;
  if (ANULADO = 'N') then
    BEGIN
    /* BUSQUE EL CENTRO DEL PUNTO, LA BODEGA, O EL PREFIJO  */
    IF (CENT = 'B') THEN
        SELECT B.BODE_CENTRO, B.BODE_PROY FROM BODEGA B, FACTURAS F
            WHERE B.BODE_COD = F.BODE_COD AND F.FACT_ID = :IDDOC INTO :CENTRO, :PROY;
    IF (CENT = 'V') THEN
        SELECT V.CENT_COD, V.PROY_COD FROM VENDEDORES V, FACTURAS F
            WHERE V.VEND_COD = F.VEND_COD AND F.FACT_ID = :IDDOC INTO :CENTRO, :PROY;
    IF (CENT = 'P') THEN
        SELECT P.PREF_CENTRO,P.PREF_PROY  FROM PREFIJOS P, FACTURAS F
            WHERE P.PREF_PRE = F.PREF_PRE AND F.FACT_ID = :IDDOC AND P.TIDO_COD = 31 INTO :CENTRO, :PROY;
    NUMERO = PREF || NUM;
    SELECT SUM (FADE_CONSUMO) FROM FACTURAS_DETALLE WHERE FACT_ID = :IDDOC  AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
        INTO MERCANCIA;
    VRSUBT = VRTOTAL - VREXTRA - VRIVA - MERCANCIA; /* BASE DE RETEFTE Y RETEICA */

    EXECUTE PROCEDURE lee_configuracion ('FACTURACION', 'FACTURAS', 'DESCUENTO PIE FACTURA IGUAL A SUMA DE DESCUENTOS POR ITEM') returning_values (:DTOXIT);
    if (DTOXIT = 'SI') then
        VRDTO = 0;
    MERCANCIA = VRSUBT - VRADIC + VRDTO;
    EXECUTE PROCEDURE FECHA_A_CONTA(:FECAUX) returning_values (:FECHA);
    EXECUTE PROCEDURE FECHA_A_CONTA(:VENCEAUX) returning_values (:VENCE);
    /* REGISTRE EL ENCABEZADO CONTABLE */
    IDC = GEN_ID(ID_CONTABILIZA, 1);
    if (STRLEN(NOMBRE)> 43 ) then
      CONC = 'FV No.' || NUMERO || '-' || SUBSTR(NOMBRE,1,43);
    ELSE
      CONC = 'FV No.' || NUMERO || '-' || NOMBRE;
    INSERT INTO CONTABILIZACION (CNTB_ID, CNTB_TIPOCOMP, CNTB_PREFCNT, CNTB_NUMERO, CNTB_FECHA, CNTB_CONCEPTO, CNTB_REF, CNTB_TIPOREF, CNTB_IDREF, CNTB_PREFREF, CNTB_NUMREF, CNTB_PROCESADO)
        VALUES (:IDC, :TIPOCOMP, :PREFCONT, :NUM, :FECHA, :CONC, '', 31, :IDDOC, :PREF, :NUM, 'N');
    NROI = 0;
    SUMA = 0;
    ERROR = 0;
    /* SI NO HAY CUENTA DE DESCUENTO NI ADICIONAL CALCULE UN FACTOR PARA LAS VENTAS Y EL IVA */
    if (MERCANCIA <> 0) then
        FACTOR = CAST(VRSUBT AS DOUBLE PRECISION) / CAST(MERCANCIA AS DOUBLE PRECISION);
    ELSE
        FACTOR = 1;
    /* TRAIGA EL NUMERO DE DIGITOS PARA EL REDONDEO */
    SELECT CAST(CONF_VALOR AS INTEGER) FROM CONFIGURACION WHERE CONF_MODULO = 'FACTURACION' AND
        CONF_CATEGORIA = 'GENERAL' AND CONF_PROPIEDAD = 'REDONDEO AL MULTIPLO DE DIEZ EN TOTALES' INTO :DIG;
    /* CUENTAS DE VENTAS */
    if (VENTAS = 'A') then
        BEGIN
        FOR SELECT MAX(TAIV_CTAVTA), SUM(FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), SUM(FADE_IVAMONTO), SUM(FADE_CONSUMO)
            FROM TARIFA_IVA T, FACTURAS_DETALLE F
            WHERE F.FACT_ID = :IDDOC AND F.fade_ivaporc = T.taiv_porc AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
            GROUP BY TAIV_CTAVTA
            INTO :CTAVENTAS, :MONTO, :IMPTOS, :VRCONSUMO
            DO
            BEGIN
            if (FOMENTO = 'SI') then
                MONTO = MONTO + VRCONSUMO;
            if ((CTADTO IS NULL) OR (CTADTO = '')) then
                MONTO = MONTO * FACTOR;
            execute procedure redondee(MONTO, DIG) returning_values (MONTO);
            if (MONTO <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTAVENTAS, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT F.ARTI_COD, (FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), FADE_CONSUMO
                        FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_DETALLE F
                        WHERE F.FACT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTAINV = :CUENTA AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
                        INTO :ART, :MONTO, :IMPTOS
                    DO
                        BEGIN
                        if (FOMENTO = 'SI') then
                            MONTO = MONTO + IMPTOS;
                        if ((CTADTO IS NULL) OR (CTADTO = '')) then
                            MONTO = MONTO * FACTOR;
                        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                        if (MONTO <> 0) then
                            BEGIN
                            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                            NROI = NROI + 1;
                            SUMA = SUMA - MONTO;
                            END
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    NROI = NROI + 1;
                    SUMA = SUMA - MONTO;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA - MONTO;
                    END
                END /* MONTO <> 0 */
            END /* FOR */
        END /* VENTAS X ARTICULO */
     IF ((VENTAS = 'C') OR (VENTAS = 'K')) THEN
        BEGIN
        IF (VENTAS = 'C') THEN
            CTAVENTAS = TCTAVENTA;
        SELECT SUM(FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), SUM(FADE_IVAMONTO), SUM (FADE_CONSUMO)
            FROM FACTURAS_DETALLE F
            WHERE F.FACT_ID = :IDDOC AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
            INTO :MONTO, :IMPTOS, :VRCONSUMO;
        if (FOMENTO = 'SI') then
            MONTO = MONTO + VRCONSUMO;
        if ((CTADTO IS NULL) OR (CTADTO = '')) then
            MONTO = MONTO * FACTOR;
        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
        if (MONTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTAVENTAS, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT F.ARTI_COD, (FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), FADE_CONSUMO
                    FROM ARTICULO A, FACTURAS_DETALLE F
                    WHERE F.FACT_ID = :IDDOC AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
                    INTO :ART, :MONTO, :IMPTOS
                    DO
                    BEGIN
                    if (FOMENTO = 'SI') then
                        MONTO = MONTO + VRCONSUMO;
                    if ((CTADTO IS NULL) OR (CTADTO = '')) then
                        MONTO = MONTO * FACTOR;
                    execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                    if (MONTO <> 0) then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        SUMA = SUMA - MONTO;
                        END
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - MONTO;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - MONTO;
                END
            END /* MONTO <> 0 */
        END /* VENTAS DE CLIENTE O CONSTANTE */
    /* EL IVA EN VENTAS */
    if (IVA = 'A') then
        BEGIN
        FOR SELECT MAX(TAIV_CTAIVAVNT), SUM(FADE_IVAMONTO), SUM(FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), sum(FADE_CONSUMO)
            FROM TARIFA_IVA T, FACTURAS_DETALLE F
            WHERE F.FACT_ID = :IDDOC AND F.fade_ivaporc = T.taiv_porc AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
            GROUP BY TAIV_CTAIVAVNT
            INTO :CTAIVA, :IMPTOS, :MONTO, :VALORADIC
        DO
            BEGIN
            if (FOMENTO = 'SI') then
                MONTO = MONTO + VALORADIC;
            MONTO = MONTO * -1;
            MONTO = MONTO * FACTOR;
            IMPTOS = IMPTOS * FACTOR;
            execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
            execute procedure redondee(MONTO, DIG) returning_values (MONTO);
            if (IMPTOS <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTAIVA, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT F.ARTI_COD, FADE_IVAMONTO, (FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), TAIV_PORC, FADE_CONSUMO
                        FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_DETALLE F, TARIFA_IVA T
                        WHERE F.FACT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTAIVAV = :CUENTA AND A.TAIV_COD = T.TAIV_COD AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
                        INTO :ART, :IMPTOS, :MONTO, :PORCIVA, :VALORADIC
                    DO
                        BEGIN
                        if (FOMENTO = 'SI') then
                            MONTO = MONTO + VALORADIC;
                        MONTO = MONTO * -1;
                        MONTO = MONTO * FACTOR;
                        IMPTOS = IMPTOS * FACTOR;
                        execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                        if (IMPTOS <> 0) then
                            BEGIN
                            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, :MONTO, :PORCIVA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                            NROI = NROI + 1;
                            SUMA = SUMA + DEBITO - CREDITO;
                            END
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, :MONTO, ABS(:IMPTOS*100/:MONTO), :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    NROI = NROI + 1;
                    SUMA = SUMA - IMPTOS;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, :MONTO, ABS(:IMPTOS*100/:MONTO), :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA - IMPTOS;
                    END
                END   /* IMPTOS <> 0 */
            END /* FOR */
        END /* IVA X ARTICULO */
    if (IVA = 'K') then /* IVA EN CTA CONSTANTE */
        BEGIN
        SELECT SUM(FADE_IVAMONTO), SUM(FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), SUM(FADE_CONSUMO)
            FROM FACTURAS_DETALLE F
            WHERE F.FACT_ID = :IDDOC and FADE_IVAMONTO <> 0 AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
            INTO :IMPTOS, :MONTO, :valoradic;
        if (FOMENTO = 'SI') then
            MONTO = MONTO + VALORADIC;
        MONTO = MONTO * -1;
        MONTO = MONTO * FACTOR;
        IMPTOS = IMPTOS * FACTOR;
        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
        execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
        if (IMPTOS <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTAIVA, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT F.ARTI_COD, (FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), FADE_IVAMONTO, TAIV_PORC, FADE_CONSUMO
                    FROM ARTICULO A, FACTURAS_DETALLE F, TARIFA_IVA T
                    WHERE F.FACT_ID = :IDDOC AND A.TAIV_COD = T.TAIV_COD AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
                    INTO :ART, :MONTO, :IMPTOS, :PORCIVA, :VALORADIC
                    DO
                    BEGIN
                    if (FOMENTO = 'SI') then
                        MONTO = MONTO + VALORADIC;
                    MONTO = MONTO * -1;
                    MONTO = MONTO * FACTOR;
                    IMPTOS = IMPTOS * FACTOR;
                    execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                    execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                    if (IMPTOS <> 0) then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', 0, :IMPTOS, :MONTO, :PORCIVA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        SUMA = SUMA - IMPTOS;
                        END
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', 0, :IMPTOS, :MONTO, ABS(:IMPTOS*100/:MONTO), :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - IMPTOS;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', 0, :IMPTOS, :MONTO, ABS(:IMPTOS*100/:MONTO), :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - IMPTOS;
                END
            END /* IMPTOS <> 0 */
        END /* IVA EN CTA CONSTANTE */
    /* EL IMPOCONSUMO */
    if ((CONSUMO = 'A') AND (FOMENTO <> 'SI')) then
        BEGIN
        FOR SELECT MAX(COAR_CTACONS), SUM(FADE_CONSUMO)
            FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_DETALLE F
            WHERE F.FACT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
            GROUP BY COAR_CTACONS
            INTO :CTACONSUMO, :IMPTOS
        DO
            BEGIN
            execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
            if (IMPTOS <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTACONSUMO, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, REGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT F.ARTI_COD, FADE_CONSUMO
                        FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_DETALLE F
                        WHERE F.FACT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTACONS = :CUENTA AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
                        INTO :ART, :IMPTOS
                    DO
                        BEGIN
                        execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                        if (IMPTOS <> 0) then
                            BEGIN
                            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                            NROI = NROI + 1;
                            SUMA = SUMA - IMPTOS;
                            END
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    NROI = NROI + 1;
                    SUMA = SUMA - IMPTOS;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA - IMPTOS;
                    END
                END /* IMPTOS <> 0 */
            END /* FOR */
        END /* CONSUMO X ARTICULO */
    if ((CONSUMO = 'K') AND (FOMENTO <> 'SI')) then /* CONSUMO EN CTA CONSTANTE */
        BEGIN
        SELECT SUM(FADE_CONSUMO)
            FROM FACTURAS_DETALLE F
            WHERE F.FACT_ID = :IDDOC AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
            INTO :IMPTOS;
        execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
        if (IMPTOS <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTACONSUMO, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT F.ARTI_COD, FADE_CONSUMO
                    FROM ARTICULO A, FACTURAS_DETALLE F
                    WHERE F.FACT_ID = :IDDOC AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
                    INTO :ART, :IMPTOS
                    DO
                    BEGIN
                    execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                    if (IMPTOS <> 0) then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CTACONSUMO, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        SUMA = SUMA - IMPTOS;
                        END
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTACONSUMO, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - IMPTOS;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTACONSUMO, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - IMPTOS;
                END
            END /* IMPTOS <> 0 */
        END /* CONSUMO EN CTA CONSTANTE */
    /* DESCUENTO */
    if ((CTADTO IS NOT NULL) AND (CTADTO <> '')) then
        BEGIN
        execute procedure redondee(VRDTO, DIG) returning_values (VRDTO);
        if (VRDTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTADTO, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRDTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA + VRDTO;
                END
            if (TIPOCUEN = 'N') then
                    BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRDTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA + VRDTO;
                END
            END
        END /* DESCUENTO */
    /* VALOR ADIC */
    if ((CTAADIC IS NOT NULL) AND (CTAADIC <> '')) then
        BEGIN
        execute procedure redondee(VRADIC, DIG) returning_values (VRADIC);
        if (VRADIC <> 0) THEN
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTAADIC, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRADIC, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - VRADIC;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRADIC, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - VRADIC;
                END
            END
        END /* VR. ADIC */
    /* VALOR EXTRA */
    if ((CTAEXTRA IS NOT NULL) AND (CTAEXTRA <> '')) THEN
        BEGIN
        execute procedure redondee(VREXTRA, DIG) returning_values (VREXTRA);
        if (VREXTRA <> 0) THEN
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTAEXTRA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VREXTRA, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - VREXTRA;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VREXTRA, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - VREXTRA;
                END
            END
        END /* VR. EXTRA */
    /* DESCUENTE EL IMPOCONSUMO */
    SELECT SUM(FADE_CONSUMO)
        FROM FACTURAS_DETALLE F WHERE F.FACT_ID = :IDDOC AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL)) INTO :IMPTOS;
    vrsubt = vrsubt - IMPTOS;
    /* RETENCION FUENTE */
    if ((RTFTE = 'C') or (RTFTE = 'K')) then
      BEGIN
      execute procedure redondee(VRRTFTE, DIG) returning_values (VRRTFTE);
      if (VRRTFTE <> 0) then
        BEGIN
        if (RTFTE = 'C') then
            CTARTFTE = TCTARTFTE;
        EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTARTFTE, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :VRSUBT, :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTFTE;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :VRSUBT, :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTFTE;
            END
        /* AUTORETENCION */
        if (FAUTORET <= fecaux) then
            BEGIN
            EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'CUENTA DE AUTORETENCION EN LA FUENTE') returning_values (CTARTFTE);
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTARTFTE INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERROR (31, :IDDOC, :CTARTFTE, 2);
                CUENTA = CTARTFTE;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                begin
                EXECUTE PROCEDURE ERROR (31, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, (:VRSUBT*-1), :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - VRRTFTE;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, (:VRSUBT*-1), :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - VRRTFTE;
                END
            END
        END /* RTFTE */
      END
    if (RTFTE = 'A') then
      BEGIN
      FOR SELECT MAX(COAR_CTARTFTEV), MAX(COAR_RTFTE), MIN(COAR_RTBASE), SUM(FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), SUM((FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO)*COAR_RTFTE)
        FROM CONTABIL_ARTICULO C, FACTURAS_DETALLE F
        WHERE F.FACT_ID = :IDDOC AND F.ARTI_COD = C.ARTI_COD AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
        GROUP BY COAR_CTARTFTEV
        INTO :CTARTFTE, :PRTFTE, :baseadic, :MONTO, :VRRTFTE
        DO
        BEGIN
        MONTO = MONTO * FACTOR;
        if (MONTO >= BASEADIC) then
            BEGIN
            VRRTFTE = VRRTFTE * FACTOR / 100;
            execute procedure redondee(VRRTFTE, DIG) returning_values (VRRTFTE);
            execute procedure redondee(MONTO, DIG) returning_values (MONTO);
            if (VRRTFTE <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTARTFTE, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :MONTO, :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    NROI = NROI + 1;
                    SUMA = SUMA + VRRTFTE;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :MONTO, :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA + VRRTFTE;
                    END
                /* AUTORETENCION */
                if (FAUTORET <= fecaux) then
                    BEGIN
                    EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'CUENTA DE AUTORETENCION EN LA FUENTE') returning_values (CTARTFTE);
                    EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTARTFTE, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
                    if (ERRORC <> 0) then
                        ERROR = ERROR + 1;
                    if (TIPOCUEN = 'C') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, (:MONTO*-1), :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                        NROI = NROI + 1;
                        SUMA = SUMA - VRRTFTE;
                        END
                    if (TIPOCUEN = 'N') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, (:MONTO*-1), :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NROI = NROI + 1;
                        SUMA = SUMA - VRRTFTE;
                        END
                    END
                END
            END
        END /* RTFTE */
      END
    /* RETENCION IVA */
    if ((RTIVA = 'C') or (RTIVA = 'K')) then
      BEGIN
      execute procedure redondee(VRRTIVA, DIG) returning_values (VRRTIVA);
      if (VRRTIVA <> 0) then
        BEGIN
        if (RTIVA = 'C') then
            CTARTIVA = TCTARTIVA;
        EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTARTIVA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTIVA, 0, :VRIVA, :PORC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTIVA;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTIVA, 0, :VRIVA, :PORC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTIVA;
            END
        END /* RTIVA */
      END
    /* RETENCION DE ICA */
    if ((RTICA = 'C') or (RTICA = 'K')) then
      BEGIN
      execute procedure redondee(VRRTICA, DIG) returning_values (VRRTICA);
      if (VRRTICA <> 0) then
        BEGIN
        if (RTICA = 'C') then
            CTARTICA = TCTARTICA;
        EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTARTICA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTICA, 0, :VRSUBT, :PRTICA, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTICA;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTICA, 0, :VRSUBT, :PRTICA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTICA;
            END
        END /* RTICA */
      END
    /* CIERRE EL COMPROBANTE CONTRA LA CUENTA DEL TERCERO O LA CONSTANTE */
    if ((SUMA <> 0) and ((CARTERA = 'C') or (CARTERA = 'K') or (CARTERA = 'J'))) then
        BEGIN
        if (SUMA < 0) then
            BEGIN
            DEBITO = SUMA * -1;
            CREDITO = 0;
            END
        ELSE
            BEGIN
            DEBITO = 0;
            CREDITO = SUMA;
            END
        if (CARTERA = 'C') then
            CTACARTERA = TCTACLIEN;
        if (CARTERA = 'J') then
            BEGIN
            /* BUSQUE LA CUENTA DE LA CAJA */
            SELECT CAJA_CUENTA FROM CAJAS C, PUNTO_VENTA P
                WHERE P.CAJA_ID = C.CAJA_ID AND PTVT_ID = :PTOVTA
                INTO :CTACARTERA;
            END
        EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTACARTERA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :DEBITO, :CREDITO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
        if (TIPOCUEN = 'N') then
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :DEBITO, :CREDITO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
        NROI = NROI + 1;
        END /* SUMA EN CARTERA */
    /* CALCULE COSTOS EN VENTAS */
    EXECUTE PROCEDURE COSTO_EN_VENTAS(31, :IDDOC);
    if (COSTOS = 'A') then
        BEGIN
        FOR SELECT MAX(CTACOS), SUM(CAST(CANT AS DOUBLE PRECISION) * COSTO)
            FROM COSTO_VENTAS
            GROUP BY CTACOS
            INTO :CTACOSTOS, :MONTO
        DO
            BEGIN
            if (MONTO <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTACOSTOS, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT ARTI_COD, CANT * COSTO
                        FROM COSTO_VENTAS
                        WHERE CTACOS = :CUENTA
                        INTO :ART, :MONTO
                    DO
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    NROI = NROI + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    END
                END /* MONTO <> 0 */
            END /* FOR */
        END /* COSTOS */
    if (COSTOS = 'K') then
        BEGIN
        SELECT SUM(CAST(CANT AS DOUBLE PRECISION) * COSTO)
            FROM COSTO_VENTAS
            INTO :MONTO;
        if (MONTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTACOSTOS, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, REGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT ARTI_COD, CANT * COSTO
                    FROM COSTO_VENTAS
                    INTO :ART, :MONTO
                DO
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTACOSTOS, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                    NROI = NROI + 1;
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTACOSTOS, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTACOSTOS, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                END
            END /* MONTO <> 0 */
        END /* COSTOS = K */
    if (INVEN = 'A') then
        BEGIN
        FOR SELECT MAX(CTAINV), SUM(CAST(CANT AS DOUBLE PRECISION) * COSTO)
            FROM COSTO_VENTAS
            GROUP BY CTAINV
            INTO :CTAINVEN, :MONTO
        DO
            BEGIN
            if (MONTO <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTAINVEN, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, REGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT ARTI_COD, CANT * COSTO
                        FROM COSTO_VENTAS
                        WHERE CTAINV = :CUENTA
                        INTO :ART, :MONTO
                    DO
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    NROI = NROI + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    END
                END /* MONTO <> 0 */
            END /* FOR */
        END /* INVEN = A */
    if (INVEN = 'K') then
        BEGIN
        SELECT SUM(CAST(CANT AS DOUBLE PRECISION) * COSTO)
            FROM COSTO_VENTAS
            INTO :MONTO;
        if (MONTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTAINVEN, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT ARTI_COD, CANT * COSTO
                    FROM COSTO_VENTAS
                    INTO :ART, :MONTO
                DO
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTAINVEN, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                    NROI = NROI + 1;
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAINVEN, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAINVEN, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                END
            END /* MONTO <> 0 */
        END /* INVEN = K */
    /* recorra las cuentas adicionales */
    FOR SELECT INVC_CUENTA, INVC_BASE, INVC_PORC, INVC_VALOR, INVC_DB
        FROM INTERFAZ_VENTAS_CTAS
        WHERE INVE_ID = :IDINTER
        INTO :CTADIC, :BASEADIC, :PORCADIC, :VALORADIC, :DBADIC
        DO
        BEGIN
        if (VALORADIC <> 0) then
            MONTO = VALORADIC;
        ELSE
            BEGIN
            if (:BASEADIC = 'SUBTOTAL') then
                VALORADIC = vrsubt;
            if (:BASEADIC = 'DESCUENTO') then
                VALORADIC = VRDTO;
            if (:BASEADIC = 'IVA') then
                VALORADIC = VRIVA;
            if (:BASEADIC = 'ADICIONAL') then
                VALORADIC = VRADIC;
            if (:BASEADIC = 'EXTRA') then
                VALORADIC = VREXTRA;
            if (:BASEADIC = 'TOTAL') then
                VALORADIC = VRTOTAL;
            MONTO = VALORADIC * PORCADIC / 100;
            END
        if (MONTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTADIC, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                if (DBADIC = 'S') then
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                ELSE
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                if (DBADIC = 'S') then
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                ELSE
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                END
            NROI = NROI + 1;
            END
        END
    if (ERROR > 0) then
        VER = 'S';
    SUSPEND;
    END /* NO ANULADO */
  END /* EXISTE LA INTERFAZ */
ELSE
    BEGIN
    EXECUTE PROCEDURE ERROR (31, :IDDOC, :PREF, 1);
    ERROR = ERROR + 1;
    VER = 'S';
    SUSPEND;
    END
END
^

SET TERM ; ^


SET TERM ^ ;

CREATE OR ALTER PROCEDURE CONTABIL_FACTCOMP_IVA(
    IDDOC INTEGER,
    IDINTER INTEGER)
RETURNS (
    ERROR INTEGER,
    VER CHAR(1),
    IDC INTEGER)
AS
DECLARE VARIABLE PREFIJO VARCHAR(4);
DECLARE VARIABLE NUM VARCHAR(6);
DECLARE VARIABLE NUMERO VARCHAR(10);
DECLARE VARIABLE FECAUX DATE;
DECLARE VARIABLE FECHA CHAR(8);
DECLARE VARIABLE CONCEPTO CHAR(60);
DECLARE VARIABLE VENCEAUX DATE;
DECLARE VARIABLE VENCE CHAR(8);
DECLARE VARIABLE VRDTO NUMERIC(18,2);
DECLARE VARIABLE VRADIC NUMERIC(18,2);
DECLARE VARIABLE VRSUBT NUMERIC(18,2);
DECLARE VARIABLE VRIVA NUMERIC(18,2);
DECLARE VARIABLE PRTFTE NUMERIC(9,2);
DECLARE VARIABLE VRRTFTE NUMERIC(18,2);
DECLARE VARIABLE VRRTIVA NUMERIC(18,2);
DECLARE VARIABLE PRTICA NUMERIC(9,2);
DECLARE VARIABLE VRRTICA NUMERIC(18,2);
DECLARE VARIABLE VRTOTAL NUMERIC(18,2);
DECLARE VARIABLE VREXTRA NUMERIC(18,2);
DECLARE VARIABLE TIPOCOMP VARCHAR(3);
DECLARE VARIABLE PREFCONT VARCHAR(4);
DECLARE VARIABLE INVEN CHAR(1);
DECLARE VARIABLE CTAINVEN VARCHAR(20);
DECLARE VARIABLE IVA CHAR(1);
DECLARE VARIABLE CTAIVA VARCHAR(20);
DECLARE VARIABLE CONSUMO CHAR(1);
DECLARE VARIABLE CTACONSUMO VARCHAR(20);
DECLARE VARIABLE CXP CHAR(1);
DECLARE VARIABLE CTACXP VARCHAR(20);
DECLARE VARIABLE RTFTE CHAR(1);
DECLARE VARIABLE CTARTFTE VARCHAR(20);
DECLARE VARIABLE RTIVA CHAR(1);
DECLARE VARIABLE CTARTIVA VARCHAR(20);
DECLARE VARIABLE RTICA CHAR(1);
DECLARE VARIABLE CTARTICA VARCHAR(20);
DECLARE VARIABLE CTADTO VARCHAR(20);
DECLARE VARIABLE CTAADIC VARCHAR(20);
DECLARE VARIABLE CTAEXTRA VARCHAR(20);
DECLARE VARIABLE EXISTE CHAR(1);
DECLARE VARIABLE CUENTA VARCHAR(20);
DECLARE VARIABLE MONTO NUMERIC(18,2);
DECLARE VARIABLE TIPOCUEN CHAR(1);
DECLARE VARIABLE NIT VARCHAR(20);
DECLARE VARIABLE NOMBRE VARCHAR(60);
DECLARE VARIABLE PROY VARCHAR(4);
DECLARE VARIABLE CENTRO VARCHAR(4);
DECLARE VARIABLE PROYDET VARCHAR(4);
DECLARE VARIABLE CENTRODET VARCHAR(4);
DECLARE VARIABLE PORC NUMERIC(5,2);
DECLARE VARIABLE NUMITEMS INTEGER;
DECLARE VARIABLE ARTICULO VARCHAR(15);
DECLARE VARIABLE IMPINC CHAR(1);
DECLARE VARIABLE IMPTOS NUMERIC(18,2);
DECLARE VARIABLE SUMA NUMERIC(18,2);
DECLARE VARIABLE PORCIVA NUMERIC(9,2);
DECLARE VARIABLE TCTAPROV VARCHAR(20);
DECLARE VARIABLE TCTARTFTE VARCHAR(20);
DECLARE VARIABLE TCTARTIVA VARCHAR(20);
DECLARE VARIABLE TCTARTICA VARCHAR(20);
DECLARE VARIABLE CUENTAADIC VARCHAR(20);
DECLARE VARIABLE BASEADIC VARCHAR(20);
DECLARE VARIABLE PORCADIC NUMERIC(5,2);
DECLARE VARIABLE VALORADIC NUMERIC(18,2);
DECLARE VARIABLE DBADIC CHAR(1);
DECLARE VARIABLE FOMENTO CHAR(2);
DECLARE VARIABLE BODE_DET CHAR(2);
DECLARE VARIABLE NUMPROV VARCHAR(10);
DECLARE VARIABLE MERCANCIA NUMERIC(18,2);
declare variable FACTOR DOUBLE PRECISION;
DECLARE VARIABLE MENORV CHAR(2);
declare variable DIG INTEGER;
declare variable NETO NUMERIC(18,2);
declare variable CENT CHAR(1);
declare variable ANULADO CHAR(1);
declare variable ERRORC INTEGER;
BEGIN
  /* INTERFACE */
  EXISTE = 'N';
  SELECT 'S', TICO_COD, PRCO_PRE, INCO_INVEN, INCO_IVA, INCO_CONSUMO, INCO_CXP, INCO_RTFTE, INCO_RTIVA, INCO_RTICA, INCO_CTAINVEN, INCO_CTAIVA, INCO_CTACONSUMO, INCO_CTADTO, INCO_CTAADIC, INCO_CTAEXTRA, INCO_CTACXP, INCO_CTARTFTE, INCO_CTARTIVA, INCO_CTARTICA, INCO_CONFIRMAR, INCO_CENTRO
    FROM INTERFAZ_COMPRAS WHERE INCO_ID = :IDINTER INTO :EXISTE, :TIPOCOMP, :PREFCONT, :INVEN, :IVA, :CONSUMO, :CXP, :RTFTE, :RTIVA, :RTICA, :CTAINVEN, :CTAIVA, :CTACONSUMO, :CTADTO, :CTAADIC, :CTAEXTRA, :CTACXP, :CTARTFTE, :CTARTIVA, :CTARTICA, :VER, :CENT;
  if (EXISTE = 'S') then
    BEGIN
    /* BORRE CONTABILIZACION PREVIA */
    DELETE FROM CONTABILIZACION WHERE CNTB_TIPOREF = 21 AND CNTB_IDREF = :IDDOC;
    /* ENCABEZADO DE LA FACTURA */
    SELECT PREF_PRE, FACO_NUMERO, FACO_FECHA, F.TERC_NIT, FACO_IMPTOS, FACO_VENCE, FACO_DTOMONTO, FACO_ADICIONAL, FACO_IVAMONTO, FACO_EXTRA, FACO_TOTAL, FACO_RTFTEPORC, FACO_RTFTEMONTO, FACO_RTIVAPOR, FACO_RTIVAMONTO, FACO_RTICAPOR, FACO_RTICAMONTO, TERC_NOM, PROV_CTARTFTE, PROV_CTARTIVA, PROV_CTARTICA, PROV_CTAPAGAR, FACO_NUMPROV, FACO_ANULADO
        FROM FACTURAS_COMPRA F, TERCEROS T, PROVEEDORES P WHERE FACO_ID = :IDDOC AND F.TERC_NIT = T.TERC_NIT AND T.TERC_NIT = P.TERC_NIT
        INTO :PREFIJO, :NUM, :FECAUX, :NIT, :IMPINC, :VENCEAUX, :VRDTO, :VRADIC, :VRIVA, :VREXTRA, :VRTOTAL, :PRTFTE, :VRRTFTE, :PORC, :VRRTIVA, :PRTICA, :VRRTICA, :NOMBRE, TCTARTFTE, TCTARTIVA, TCTARTICA, TCTAPROV, :NUMPROV, :ANULADO;
    /* CENTRO DE LA BODEGA */
    IF (CENT = 'B') THEN
        SELECT BODE_CENTRO, BODE_PROY FROM BODEGA B, FACTURAS_COMPRA F WHERE B.BODE_COD = F.BODE_COD AND F.FACO_ID = :IDDOC INTO :CENTRO, :PROY;
    ELSE
        SELECT PREF_CENTRO,PREF_PROY  FROM PREFIJOS P, FACTURAS_COMPRA F WHERE P.PREF_PRE = F.PREF_PRE AND F.FACO_ID = :IDDOC AND P.TIDO_COD = 21 INTO :CENTRO, :PROY;
    if (ANULADO = 'N') then
        BEGIN
        NUMERO = PREFIJO || NUM;
        VRSUBT = VRTOTAL - VREXTRA - VRIVA;
        MERCANCIA = VRSUBT - VRADIC + VRDTO;
        EXECUTE PROCEDURE FECHA_A_CONTA(:FECAUX) returning_values (:FECHA);
        EXECUTE PROCEDURE FECHA_A_CONTA(:VENCEAUX) returning_values (:VENCE);
        if (NUMPROV IS NULL) then
            NUMPROV = NUMERO;
        CONCEPTO = 'FC No.' || NUMERO || '-' || SUBSTR(NOMBRE,1,26) || '-NPROV.' || NUMPROV;
        IDC = GEN_ID(ID_CONTABILIZA, 1);
        INSERT INTO CONTABILIZACION (CNTB_ID, CNTB_TIPOCOMP, CNTB_PREFCNT, CNTB_NUMERO, CNTB_FECHA, CNTB_CONCEPTO, CNTB_REF, CNTB_TIPOREF, CNTB_IDREF, CNTB_PREFREF, CNTB_NUMREF, CNTB_PROCESADO)
            VALUES (:IDC, :TIPOCOMP, :PREFCONT, :NUM, :FECHA, :CONCEPTO, '', 21, :IDDOC, :PREFIJO, :NUM, 'N');
        NUMITEMS = 0;
        SUMA = 0;
        NETO = 0;
        ERROR = 0;
        EXECUTE PROCEDURE LEE_CONFIGURACION('COMPRAS', 'FACTURAS', 'USAR IMPOCONSUMO COMO PORCENTAJE DE FOMENTO') RETURNING_VALUES (FOMENTO);
        EXECUTE PROCEDURE lee_configuracion('COMPRAS','FACTURAS','DESCUENTO Y VALOR ADICIONAL DEL DOCUMENTO COMO MENOR VALOR DEL COSTO') returning_values (:MENORV);
        SELECT SUM(FCDE_consumo) from facturas_compras_detalle where faco_id = :IDDOC into :valoradic;
        if (MENORV = 'SI') then
            if (MERCANCIA <> 0) then
                FACTOR = (CAST(VRSUBT AS DOUBLE PRECISION) - VALORADIC) / (CAST(MERCANCIA AS DOUBLE PRECISION) - VALORADIC);
            ELSE
                FACTOR = 1;
        ELSE
           FACTOR = 1;
        SELECT CAST(CONF_VALOR AS INTEGER) FROM CONFIGURACION WHERE CONF_MODULO = 'COMPRAS' AND CONF_CATEGORIA = 'GENERAL' AND CONF_PROPIEDAD = 'REDONDEO AL MULTIPLO DE DIEZ EN TOTALES' INTO :DIG;
        if (INVEN = 'A') then
            BEGIN
            FOR SELECT MAX(TAIV_CTACOMP), SUM(CAST(FCDE_CANT AS DOUBLE PRECISION) * (FCDE_PRUNIT-FCDE_DTOMONTO)), SUM(FCDE_IVAMONTO), SUM(FCDE_CONSUMO), MAX(F.BODE_COD)
                FROM TARIFA_IVA T, FACTURAS_COMPRAS_DETALLE F WHERE F.FACO_ID = :IDDOC AND F.fcde_ivaporc = T.taiv_porc
                GROUP BY TAIV_CTACOMP, F.BODE_COD INTO :CTAINVEN, :MONTO, :IMPTOS, :VALORADIC, :BODE_DET DO
                BEGIN
                IF (CENT = 'B') THEN
                  SELECT BODE_CENTRO, BODE_PROY FROM BODEGA WHERE BODE_COD = :BODE_DET INTO :CENTRODET, :PROYDET;
                if (IMPINC = 'S') then
                    BEGIN
                    MONTO = MONTO - IMPTOS;
                    if (FOMENTO <> 'SI' ) then
                        MONTO = MONTO - VALORADIC;
                    END
                MONTO = MONTO * FACTOR;
                execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                EXECUTE PROCEDURE CUENTA_INTERFAZ(21, :IDDOC, :CTAINVEN, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    FOR SELECT F.ARTI_COD, (FCDE_CANT * (FCDE_PRUNIT-FCDE_DTOMONTO)), FCDE_IVAMONTO, FCDE_CONSUMO
                        FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_COMPRAS_DETALLE F WHERE F.FACO_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTAINV = :CUENTA
                        INTO :ARTICULO, :MONTO, :IMPTOS, :VALORADIC DO
                        BEGIN
                        if (IMPINC = 'S') then
                            BEGIN
                            MONTO = MONTO - IMPTOS;
                            if (FOMENTO <> 'SI' ) then
                                MONTO = MONTO - VALORADIC;
                            END
                        MONTO = MONTO * FACTOR;
                        execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                        IF (CENT = 'B') THEN
                           INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                               VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROYDET, :CENTRODET, NULL, NULL, NULL, :ARTICULO, 0, 0);
                        ELSE
                           INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                               VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                        NUMITEMS = NUMITEMS + 1;
                        NETO = NETO + MONTO;
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    IF (CENT = 'B') THEN
                       INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                           VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROYDET, :CENTRODET, :NUMERO, NULL, :VENCE, NULL, 0, 21);
                    ELSE
                       INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                           VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 21);
                    NUMITEMS = NUMITEMS + 1;
                    NETO = NETO + MONTO;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    IF (CENT = 'B') THEN
                       INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                           VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROYDET, :CENTRODET, NULL, NULL, NULL, NULL, 0, 0);
                    ELSE
                       INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                           VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NUMITEMS = NUMITEMS + 1;
                    NETO = NETO + MONTO;
                    END
                END
            END
        if (INVEN = 'K') then
            BEGIN
            FOR SELECT SUM(CAST(FCDE_CANT AS DOUBLE PRECISION) * (FCDE_PRUNIT-FCDE_DTOMONTO)), SUM(FCDE_IVAMONTO), SUM(FCDE_CONSUMO), MAX(BODE_COD)
                FROM FACTURAS_COMPRAS_DETALLE WHERE FACO_ID = :IDDOC GROUP BY BODE_COD INTO :MONTO, :IMPTOS, :VALORADIC, :BODE_DET Do
                BEGIN
                  IF (CENT = 'B') THEN
                    SELECT BODE_CENTRO, BODE_PROY FROM BODEGA WHERE BODE_COD = :BODE_DET INTO :CENTRODET, :PROYDET;
                  if (IMPINC = 'S') then
                   BEGIN
                    MONTO = MONTO - IMPTOS;
                    if (FOMENTO <> 'SI' ) then
                      MONTO = MONTO - VALORADIC;
                   END
                  MONTO = MONTO * FACTOR;
                  execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                  execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                  EXECUTE PROCEDURE CUENTA_INTERFAZ(21, :IDDOC, :CTAINVEN, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                  if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                  if (TIPOCUEN = 'I') then
                   BEGIN
                    FOR SELECT ARTI_COD, (FCDE_CANT * (FCDE_PRUNIT-FCDE_DTOMONTO)), FCDE_IVAMONTO, FCDE_CONSUMO
                      FROM FACTURAS_COMPRAS_DETALLE WHERE FACO_ID = :IDDOC INTO :ARTICULO, :MONTO, :IMPTOS, :VALORADIC DO
                       BEGIN
                       if (IMPINC = 'S') then
                        BEGIN
                         MONTO = MONTO - IMPTOS;
                         if (FOMENTO <> 'SI' ) then
                            MONTO = MONTO - VALORADIC;
                        END
                       MONTO = MONTO * FACTOR;
                       execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                       execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                       IF (CENT = 'B') THEN
                          INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                             VALUES (:IDC, :NUMITEMS, :CTAINVEN, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROYDET, :CENTRODET, NULL, NULL, NULL, :ARTICULO, 0, 0);
                       ELSE
                          INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                             VALUES (:IDC, :NUMITEMS, :CTAINVEN, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                       NUMITEMS = NUMITEMS + 1;
                       NETO = NETO + MONTO;
                       END
                   END
                  if (TIPOCUEN = 'C') then
                   BEGIN
                    IF (CENT = 'B') THEN
                       INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                         VALUES (:IDC, :NUMITEMS, :CTAINVEN, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROYDET, :CENTRODET, :NUMERO, NULL, :VENCE, NULL, 0, 21);
                    ELSE
                       INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                         VALUES (:IDC, :NUMITEMS, :CTAINVEN, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 21);
                    NUMITEMS = NUMITEMS + 1;
                    NETO = NETO + MONTO;
                   END
                  if (TIPOCUEN = 'N') then
                   BEGIN
                    IF (CENT = 'B') THEN
                       INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                          VALUES (:IDC, :NUMITEMS, :CTAINVEN, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROYDET, :CENTRODET, NULL, NULL, NULL, NULL, 0, 0);
                    ELSE
                       INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                          VALUES (:IDC, :NUMITEMS, :CTAINVEN, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NUMITEMS = NUMITEMS + 1;
                    NETO = NETO + MONTO;
                   END
                END
            END
        /* EL IVA */
        if (IVA = 'A') then
            BEGIN
            FOR SELECT MAX(TAIV_CTAIVACMP), SUM(FCDE_IVAMONTO), SUM(CAST(FCDE_CANT AS DOUBLE PRECISION) * (FCDE_PRUNIT-FCDE_DTOMONTO)), SUM(FCDE_CONSUMO)
                FROM TARIFA_IVA T, FACTURAS_COMPRAS_DETALLE F
                WHERE F.FACO_ID = :IDDOC AND F.fcde_ivaporc = T.taiv_porc AND FCDE_IVAMONTO <> 0
                GROUP BY TAIV_CTAIVACMP
                INTO :CTAIVA, :IMPTOS, :MONTO, :VALORADIC DO
              if (IMPTOS <> 0) then
                BEGIN
                IMPTOS = CAST(IMPTOS AS DOUBLE PRECISION) * VRSUBT / MERCANCIA;
                if (IMPINC = 'S') then
                    BEGIN
                    MONTO = MONTO - IMPTOS;
                    if (FOMENTO <> 'SI' ) then
                        MONTO = MONTO - VALORADIC;
                    END
                MONTO = CAST(MONTO AS DOUBLE PRECISION) * VRSUBT / MERCANCIA;
                execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                EXECUTE PROCEDURE CUENTA_INTERFAZ(21, :IDDOC, :CTAIVA, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    FOR SELECT F.ARTI_COD, FCDE_IVAMONTO, (FCDE_CANT * (FCDE_PRUNIT-FCDE_DTOMONTO)), TAIV_PORC, FCDE_CONSUMO
                        FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_COMPRAS_DETALLE F, TARIFA_IVA T WHERE F.FACO_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTAIVAV = :CUENTA AND A.TAIV_COD = T.TAIV_COD
                        INTO :ARTICULO, :IMPTOS, :MONTO, :PORCIVA, :VALORADIC
                    DO
                        BEGIN
                        IMPTOS = CAST(IMPTOS AS DOUBLE PRECISION) * VRSUBT / MERCANCIA;
                        if (IMPINC = 'S') then
                            BEGIN
                            MONTO = MONTO - IMPTOS;
                            if (FOMENTO <> 'SI' ) then
                                MONTO = MONTO - VALORADIC;
                            END
                        MONTO = CAST(MONTO AS DOUBLE PRECISION) * VRSUBT / MERCANCIA;
                        execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :IMPTOS, 0, :MONTO, :PORCIVA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                        NUMITEMS = NUMITEMS + 1;
                        NETO = NETO + IMPTOS;
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :IMPTOS, 0, :MONTO, :IMPTOS*100/:MONTO, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 21);
                    NUMITEMS = NUMITEMS + 1;
                    NETO = NETO + IMPTOS;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :IMPTOS, 0, :MONTO, CAST(:IMPTOS AS DOUBLE PRECISION)*100/CAST(:MONTO AS DOUBLE PRECISION), :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NUMITEMS = NUMITEMS + 1;
                    NETO = NETO + IMPTOS;
                    END
                END
            END
        if (IVA = 'K') then /* IVA EN CTA CONSTANTE */
            BEGIN
            SELECT SUM(FCDE_IVAMONTO), SUM(CAST(FCDE_CANT AS DOUBLE PRECISION) * (FCDE_PRUNIT-FCDE_DTOMONTO)), SUM(FCDE_CONSUMO)
                FROM FACTURAS_COMPRAS_DETALLE F
                WHERE F.FACO_ID = :IDDOC  AND FCDE_IVAMONTO <> 0
                INTO :IMPTOS, :MONTO, :VALORADIC;
            if (IMPTOS <> 0) then
                BEGIN
                IMPTOS = CAST(IMPTOS AS DOUBLE PRECISION) * VRSUBT / MERCANCIA;
                if (IMPINC = 'S') then
                    BEGIN
                    MONTO = MONTO - IMPTOS;
                    if (FOMENTO <> 'SI' ) then
                        MONTO = MONTO - VALORADIC;
                    END
                MONTO = CAST(MONTO AS DOUBLE PRECISION) * VRSUBT / MERCANCIA;
                execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                EXECUTE PROCEDURE CUENTA_INTERFAZ(21, :IDDOC, :CTAIVA, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    FOR SELECT F.ARTI_COD, (FCDE_CANT * (FCDE_PRUNIT-FCDE_DTOMONTO)), FCDE_IVAMONTO, TAIV_PORC, FCDE_CONSUMO
                        FROM ARTICULO A, FACTURAS_COMPRAS_DETALLE F, TARIFA_IVA T WHERE F.FACO_ID = :IDDOC AND A.TAIV_COD = T.TAIV_COD
                        INTO :ARTICULO, :MONTO, :IMPTOS, :PORCIVA, :VALORADIC DO
                        BEGIN
                        IMPTOS = CAST(IMPTOS AS DOUBLE PRECISION) * VRSUBT / MERCANCIA;
                        if (IMPINC = 'S') then
                            BEGIN
                            MONTO = MONTO - IMPTOS;
                            if (FOMENTO <> 'SI' ) then
                                MONTO = MONTO - VALORADIC;
                            END
                        MONTO = CAST(MONTO AS DOUBLE PRECISION) * VRSUBT / MERCANCIA;
                        execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                        if (IMPTOS <> 0) then
                            BEGIN
                            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                VALUES (:IDC, :NUMITEMS, :CTAIVA, :CONCEPTO, '', :IMPTOS, 0, :MONTO, :PORCIVA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                            NUMITEMS = NUMITEMS + 1;
                            NETO = NETO + IMPTOS;
                            END
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NUMITEMS, :CTAIVA, :CONCEPTO, '', :IMPTOS, 0, :MONTO, :IMPTOS*100/:MONTO, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 21);
                    NUMITEMS = NUMITEMS + 1;
                    NETO = NETO + IMPTOS;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NUMITEMS, :CTAIVA, :CONCEPTO, '', :IMPTOS, 0, :MONTO, :IMPTOS*100/:MONTO, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NUMITEMS = NUMITEMS + 1;
                    NETO = NETO + IMPTOS;
                    END
                END
            END
        /* EL IMPOCONSUMO */
        if (CONSUMO = 'A') then
            BEGIN
            FOR SELECT MAX(COAR_CTACONS), SUM(FCDE_CONSUMO) FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_COMPRAS_DETALLE F
                WHERE F.FACO_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD GROUP BY COAR_CTACONS INTO :CTACONSUMO, :IMPTOS
            DO
              if (IMPTOS <> 0) then
                BEGIN
                execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                EXECUTE PROCEDURE CUENTA_INTERFAZ(21, :IDDOC, :CTACONSUMO, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (FOMENTO <> 'SI') then
                    BEGIN
                    if (TIPOCUEN = 'I') then
                        BEGIN
                        FOR SELECT F.ARTI_COD, FCDE_CONSUMO FROM ARTICULO A, FACTURAS_COMPRAS_DETALLE F WHERE F.FACO_ID = :IDDOC INTO :ARTICULO, :IMPTOS
                            DO
                            BEGIN
                            if (IMPTOS <> 0) then
                                BEGIN
                                execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                    VALUES (:IDC, :NUMITEMS, :CTACONSUMO, :CONCEPTO, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                                NUMITEMS = NUMITEMS + 1;
                                NETO = NETO + IMPTOS;
                                END
                            END
                        END
                    if (TIPOCUEN = 'C') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CTACONSUMO, :CONCEPTO, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                        NUMITEMS = NUMITEMS + 1;
                        NETO = NETO + IMPTOS;
                        END
                    if (TIPOCUEN = 'N') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CTACONSUMO, :CONCEPTO, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NUMITEMS = NUMITEMS + 1;
                        NETO = NETO + IMPTOS;
                        END
                    END
                ELSE
                    BEGIN
                    if (TIPOCUEN = 'I') then
                        BEGIN
                        FOR SELECT F.ARTI_COD, FCDE_CONSUMO FROM ARTICULO A, FACTURAS_COMPRAS_DETALLE F WHERE F.FACO_ID = :IDDOC INTO :ARTICULO, :IMPTOS
                            DO
                            BEGIN
                            if (IMPTOS <> 0) then
                                BEGIN
                                execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                    VALUES (:IDC, :NUMITEMS, :CTACONSUMO, :CONCEPTO, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                                NUMITEMS = NUMITEMS + 1;
                                NETO = NETO - IMPTOS;
                                END
                            END
                        END
                    if (TIPOCUEN = 'C') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CTACONSUMO, :CONCEPTO, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                        NUMITEMS = NUMITEMS + 1;
                        NETO = NETO - IMPTOS;
                        END
                    if (TIPOCUEN = 'N') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CTACONSUMO, :CONCEPTO, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NUMITEMS = NUMITEMS + 1;
                        NETO = NETO - IMPTOS;
                        END
                    END
                END
            END
        if (CONSUMO = 'K') then /* CONSUMO EN CTA CONSTANTE */
            BEGIN
            SELECT SUM(FCDE_CONSUMO) FROM FACTURAS_COMPRAS_DETALLE F WHERE F.FACO_ID = :IDDOC INTO :IMPTOS;
            if (IMPTOS <> 0) then
              BEGIN
              execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
              /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
              EXECUTE PROCEDURE CUENTA_INTERFAZ(21, :IDDOC, :CTACONSUMO, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
              if (ERRORC <> 0) then
                ERROR = ERROR + 1;
              if (FOMENTO <> 'SI') then
                BEGIN
                /* DEPENDE DEL TIPO DE CUENTA */
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT F.ARTI_COD, FCDE_CONSUMO FROM ARTICULO A, FACTURAS_COMPRAS_DETALLE F WHERE F.FACO_ID = :IDDOC INTO :ARTICULO, :IMPTOS
                        DO
                        BEGIN
                        if (IMPTOS <> 0) then
                            BEGIN
                            execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                VALUES (:IDC, :NUMITEMS, :CTACONSUMO, :CONCEPTO, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                            NUMITEMS = NUMITEMS + 1;
                            NETO = NETO + IMPTOS;
                            END
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    /* INSERTE EL REGISTRO DE LA BASE */
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NUMITEMS, :CTACONSUMO, :CONCEPTO, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    NUMITEMS = NUMITEMS + 1;
                    NETO = NETO + IMPTOS;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NUMITEMS, :CTACONSUMO, :CONCEPTO, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NUMITEMS = NUMITEMS + 1;
                    NETO = NETO + IMPTOS;
                    END
                END
              ELSE
                BEGIN
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT F.ARTI_COD, FCDE_CONSUMO FROM ARTICULO A, FACTURAS_COMPRAS_DETALLE F WHERE F.FACO_ID = :IDDOC INTO :ARTICULO, :IMPTOS
                        DO
                        BEGIN
                        if (IMPTOS <> 0) then
                            BEGIN
                           execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                           INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                VALUES (:IDC, :NUMITEMS, :CTACONSUMO, :CONCEPTO, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                            NUMITEMS = NUMITEMS + 1;
                            NETO = NETO - IMPTOS;
                            END
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    /* INSERTE EL REGISTRO DE LA BASE */
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NUMITEMS, :CTACONSUMO, :CONCEPTO, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    NUMITEMS = NUMITEMS + 1;
                    NETO = NETO - IMPTOS;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NUMITEMS, :CTACONSUMO, :CONCEPTO, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NUMITEMS = NUMITEMS + 1;
                    NETO = NETO - IMPTOS;
                    END
                END
              end
            END
        /* DESCUENTO */
        if ((CTADTO IS NOT NULL) AND
            (CTADTO <> '')) THEN
          BEGIN
          execute procedure redondee(VRDTO, DIG) returning_values (VRDTO);
          if (VRDTO <> 0) then
            begin
            /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
            EXECUTE PROCEDURE CUENTA_INTERFAZ(21, :IDDOC, :CTADTO, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :VRDTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 21);
                NUMITEMS = NUMITEMS + 1;
                NETO = NETO - VRDTO;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                /* INSERTE EL REGISTRO DE LA BASE */
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :VRDTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NUMITEMS = NUMITEMS + 1;
                NETO = NETO - VRDTO;
                END
            end
          END
        /* VALOR ADIC */
        if ((CTAADIC IS NOT NULL) AND
            (CTAADIC <> '')) THEN
          BEGIN
          execute procedure redondee(VRADIC, DIG) returning_values (VRADIC);
          if (VRADIC <> 0) then
            begin
            /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
            EXECUTE PROCEDURE CUENTA_INTERFAZ(21, :IDDOC, :CTAADIC, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :VRADIC, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 21);
                NUMITEMS = NUMITEMS + 1;
                NETO = NETO + VRADIC;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :VRADIC, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NUMITEMS = NUMITEMS + 1;
                NETO = NETO + VRADIC;
                END
            end
          END
        /* VALOR EXTRA */
        if ((CTAEXTRA IS NOT NULL) AND
            (CTAEXTRA <> '')) THEN
          BEGIN
          execute procedure redondee(VREXTRA, DIG) returning_values (VREXTRA);
          if (VREXTRA <> 0) then
            begin
            /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
            EXECUTE PROCEDURE CUENTA_INTERFAZ(21, :IDDOC, :CTAEXTRA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :VREXTRA, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 21);
                NUMITEMS = NUMITEMS + 1;
                NETO = NETO + VREXTRA;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :VREXTRA, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NUMITEMS = NUMITEMS + 1;
                NETO = NETO + VREXTRA;
                END
            end
          END

        /* DESCUENTE EL IMPOCONSUMO */
        SELECT SUM(FCDE_CONSUMO) FROM FACTURAS_COMPRAS_DETALLE F WHERE F.FACO_ID = :IDDOC INTO :IMPTOS;
        if (IMPTOS IS NULL) then
            IMPTOS = 0;
        vrsubt = vrsubt - IMPTOS;
        /* RETENCION FUENTE */
        if ((RTFTE = 'P') or (RTFTE = 'K')) then
          BEGIN
          execute procedure redondee(VRRTFTE, DIG) returning_values (VRRTFTE);
          if (VRRTFTE <> 0) then
            begin
            if (RTFTE = 'P') then
                CTARTFTE = TCTARTFTE;
            EXECUTE PROCEDURE CUENTA_INTERFAZ(21, :IDDOC, :CTARTFTE, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :VRRTFTE, (:VRSUBT*-1), :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NUMITEMS = NUMITEMS + 1;
                NETO = NETO - VRRTFTE;
                SUMA = VRRTFTE;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :VRRTFTE, (:VRSUBT*-1), :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NUMITEMS = NUMITEMS + 1;
                NETO = NETO - VRRTFTE;
                SUMA = VRRTFTE;
                END
            end
          END
        if (RTFTE = 'A') then
          BEGIN
          FOR SELECT MAX(COAR_CTARTFTE), MAX(COAR_RTFTE), MIN(COAR_RTBASE), SUM(FCDE_TOTAL-FCDE_IVAMONTO-FCDE_CONSUMO), SUM((FCDE_TOTAL-FCDE_IVAMONTO-FCDE_CONSUMO)*COAR_RTFTE)
            FROM CONTABIL_ARTICULO C, FACTURAS_COMPRAS_DETALLE F
            WHERE F.faco_id = :IDDOC AND F.ARTI_COD = C.ARTI_COD
            GROUP BY COAR_CTARTFTE
            INTO :CTARTFTE, :PRTFTE, :baseadic,  :MONTO, :VRRTFTE
            DO
            BEGIN
            MONTO = MONTO * FACTOR * -1;
            if (MONTO >= :baseadic) then
                BEGIN
                VRRTFTE = VRRTFTE * FACTOR / 100;
                execute procedure redondee(VRRTFTE, DIG) returning_values (VRRTFTE);
                execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                if (VRRTFTE <> 0) then
                    BEGIN
                    EXECUTE PROCEDURE CUENTA_INTERFAZ(21, :IDDOC, :CTARTFTE, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
                    if (ERRORC <> 0) then
                        ERROR = ERROR + 1;
                    if (TIPOCUEN = 'C') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :VRRTFTE, :VRSUBT, :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                        NUMITEMS = NUMITEMS + 1;
                        NETO = NETO - VRRTFTE;
                        SUMA = VRRTFTE;
                        END
                    if (TIPOCUEN = 'N') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :VRRTFTE, :VRSUBT, :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NUMITEMS = NUMITEMS + 1;
                        NETO = NETO - VRRTFTE;
                        SUMA = VRRTFTE;
                        END
                    end
                end
              END
          END
        /* RETENCION IVA */
        if ((RTIVA = 'P') or (RTIVA = 'K')) then
          BEGIN
          execute procedure redondee(VRRTIVA, DIG) returning_values (VRRTIVA);
          if (VRRTIVA <> 0) then
            begin
            if (RTIVA = 'P') then
                CTARTIVA = TCTARTIVA;
            EXECUTE PROCEDURE CUENTA_INTERFAZ(21, :IDDOC, :CTARTIVA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :VRRTIVA, (:VRIVA*-1), :PORC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 21);
                NUMITEMS = NUMITEMS + 1;
                NETO = NETO - VRRTIVA;
                SUMA = SUMA + VRRTIVA;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :VRRTIVA, (:VRIVA*-1), :PORC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NUMITEMS = NUMITEMS + 1;
                NETO = NETO - VRRTIVA;
                SUMA = SUMA + VRRTIVA;
                END
            end
          END
        /* RETENCION DE ICA */
        if ((RTICA = 'P') or (RTICA = 'K')) then
          BEGIN
          execute procedure redondee(VRRTICA, DIG) returning_values (VRRTICA);
          if (VRRTICA <> 0) then
            begin
            if (RTICA = 'P') then
                CTARTICA = TCTARTICA;
            EXECUTE PROCEDURE CUENTA_INTERFAZ(21, :IDDOC, :CTARTICA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :VRRTICA, (:VRSUBT*-1), :PRTICA, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 21);
                NUMITEMS = NUMITEMS + 1;
                NETO = NETO - VRRTICA;
                SUMA = SUMA + VRRTICA;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :VRRTICA, (:VRSUBT*-1), :PRTICA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NUMITEMS = NUMITEMS + 1;
                NETO = NETO - VRRTICA;
                SUMA = SUMA + VRRTICA;
                END
            end
          END
        /* CIERRE EL COMPROBANTE CONTRA LA CUENTA DEL TERCERO O LA CONSTANTE */
        if ((CXP = 'P') or (CXP = 'K')) then
            BEGIN
            SUMA = VRTOTAL - SUMA;
            execute procedure redondee(SUMA, DIG) returning_values (SUMA);
            if (CXP = 'P') then
                CTACXP = TCTAPROV;
            EXECUTE PROCEDURE CUENTA_INTERFAZ(21, :IDDOC, :CTACXP, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :SUMA, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 21);
            if (TIPOCUEN = 'N') then
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :SUMA, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NETO = NETO - SUMA;
            NUMITEMS = NUMITEMS + 1;
            END
        /* recorra las cuentas adicionales */
        FOR SELECT INCC_CUENTA, INCC_BASE, INCC_PORC, INCC_VALOR, INCC_DB FROM INTERFAZ_COMPRAS_CTAS
            WHERE INCO_ID = :IDINTER INTO :CUENTAADIC, :BASEADIC, :PORCADIC, :VALORADIC, :DBADIC
            DO
            BEGIN
            if (VALORADIC <> 0) then
                MONTO = VALORADIC;
            ELSE
                BEGIN
                if (:BASEADIC = 'SUBTOTAL') then
                    VALORADIC = VRTOTAL - VREXTRA - VRIVA - VRADIC + VRDTO;
                if (:BASEADIC = 'DESCUENTO') then
                    VALORADIC = VRDTO;
                if (:BASEADIC = 'IVA') then
                    VALORADIC = VRIVA;
                if (:BASEADIC = 'CONSUMO') then
                    SELECT SUM(FCDE_CONSUMO) FROM FACTURAS_COMPRAS_DETALLE F WHERE F.FACO_ID = :IDDOC INTO :VALORADIC;
                if (:BASEADIC = 'ADICIONAL') then
                    VALORADIC = VRADIC;
                if (:BASEADIC = 'EXTRA') then
                    VALORADIC = VREXTRA;
                if (:BASEADIC = 'TOTAL') then
                    VALORADIC = VRTOTAL;
                MONTO = CAST(VALORADIC AS DOUBLE PRECISION) * PORCADIC / 100;
                END
            if (MONTO <> 0) then
                BEGIN
                execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                EXECUTE PROCEDURE CUENTA_INTERFAZ(21, :IDDOC, :CUENTAADIC, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'C') then
                    BEGIN
                    if (DBADIC = 'S') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTAADIC, :CONCEPTO, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                        SUMA = SUMA + MONTO;
                        NETO = NETO + MONTO;
                        END
                    ELSE
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTAADIC, :CONCEPTO, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                        SUMA = SUMA - MONTO;
                        NETO = NETO - MONTO;
                        END
                    NUMITEMS = NUMITEMS + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    if (DBADIC = 'S') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTAADIC, :CONCEPTO, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        SUMA = SUMA + MONTO;
                        NETO = NETO + MONTO;
                        END
                    ELSE
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTAADIC, :CONCEPTO, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        SUMA = SUMA - MONTO;
                        NETO = NETO - MONTO;
                        END
                    NUMITEMS = NUMITEMS + 1;
                    END
                END
            END
        if (NETO <> 0) then
            BEGIN
            EXECUTE PROCEDURE lee_configuracion ('CONTABILIDAD','GENERAL','CUENTA PARA CUADRAR COMPROBANTES DESCUADRADOS DE INTERFAZ') returning_values (:ctaadic);
            if (ctaadic <> '') then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(21, :IDDOC, :CTAADIC, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'C') then
                    BEGIN
                    if (NETO < 0) then
                        BEGIN
                        NETO = NETO * -1;
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :NETO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                        END
                    ELSE
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :NETO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                        END
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    if (NETO < 0) then
                        BEGIN
                        NETO = NETO * -1;
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :NETO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        END
                    ELSE
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :NETO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        END
                    END
                END
            END
        END
    if (ERROR > 0) then
        VER = 'S';
    SUSPEND;
    END
ELSE
    BEGIN
    EXECUTE PROCEDURE ERROR (21, :IDDOC, :PREFIJO, 1);
    ERROR = ERROR + 1;
    VER = 'S';
    SUSPEND;
    END
END
^

SET TERM ; ^


/* 20090406d  LISTA DE PRECIOS POR SUCURSAL */

ALTER TABLE CLIENTE_SUCURSALES
ADD LIPR_COD INTEGER;

UPDATE CLIENTE_SUCURSALES S SET LIPR_COD = (SELECT LIPR_COD FROM CLIENTES WHERE TERC_NIT = S.terc_nit);
COMMIT WORK;

/* 20090406e ALTERNATIVAS Y UNIDADES SI NO HAY UNIDAD ALTERNATIVA DABA NULL  */
SET TERM ^ ;

CREATE OR ALTER PROCEDURE IMPR_FACTURA(
    ID INTEGER)
RETURNS (
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    VENCE DATE,
    DIASVENCE INTEGER,
    CONTCRED CHAR(17),
    NIT VARCHAR(20),
    NOMTERCERO VARCHAR(60),
    NOMCLIENTE VARCHAR(60),
    VENDEDOR INTEGER,
    NOMVENDEDOR VARCHAR(60),
    PUNTOVTA INTEGER,
    NOMPUNTOVTA VARCHAR(30),
    CODBODEGA VARCHAR(2),
    NOMBODEGA VARCHAR(30),
    AUTORIZACION VARCHAR(20),
    DESPACHO VARCHAR(255),
    TRANSPORTADOR VARCHAR(60),
    COTIZACION VARCHAR(30),
    PEDIDO VARCHAR(30),
    REMISION VARCHAR(30),
    PACIENTE VARCHAR(20),
    NOMPACIENTE VARCHAR(60),
    COMIPORC NUMERIC(9,2),
    COMIMONTO NUMERIC(18,2),
    SUBTOTAL NUMERIC(18,2),
    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),
    EXTRA NUMERIC(18,2),
    DTOFPORC NUMERIC(9,2),
    DTOFMONTO NUMERIC(18,2),
    FECHADTO DATE,
    TOTALFAC NUMERIC(18,2),
    TOTALPAGAR NUMERIC(18,2),
    OBS BLOB SUB_TYPE 1 SEGMENT SIZE 80,
    ITEM INTEGER,
    ARTICULO VARCHAR(15),
    CODBAR VARCHAR(15),
    ARTIDES VARCHAR(60),
    DESCORTA VARCHAR(30),
    CANT NUMERIC(18,4),
    LOTE VARCHAR(15),
    VLOTE DATE,
    UNIDAD VARCHAR(8),
    CAJAS NUMERIC(18,4),
    FACTOR NUMERIC(18,4),
    LISTAPR INTEGER,
    REFITEM VARCHAR(60),
    BODITEM VARCHAR(2),
    STAND VARCHAR(15),
    PRUNIT NUMERIC(18,2),
    DTOITPORC NUMERIC(9,2),
    DTOITMONTO NUMERIC(18,2),
    PRNETO NUMERIC(18,2),
    PRNETOSINIVA NUMERIC(18,2),
    DTOIT1 NUMERIC(9,2),
    DTOIT2 NUMERIC(9,2),
    DTOIT3 NUMERIC(9,2),
    IVAPORC NUMERIC(9,2),
    IVAITMONTO NUMERIC(18,2),
    CONSUMO NUMERIC(18,2),
    SUBTOTIT NUMERIC(18,2),
    TOTAL NUMERIC(18,2),
    CODIGOCL VARCHAR(20),
    ZONACOD VARCHAR(2),
    ZONANOM VARCHAR(60),
    DV CHAR(1),
    DIRECCION VARCHAR(60),
    CIUDAD VARCHAR(40),
    TELEFONO VARCHAR(40),
    CONTACTO VARCHAR(60),
    FAX VARCHAR(25),
    CEL VARCHAR(25),
    GRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    SUBGRUPO VARCHAR(3),
    NOMSUBG VARCHAR(30),
    MARCA VARCHAR(3),
    NOMMARCA VARCHAR(30),
    PESO NUMERIC(18,4),
    ANCHO NUMERIC(18,4),
    ALTO NUMERIC(18,4),
    LARGO NUMERIC(18,4),
    SUMA1 NUMERIC(18,2),
    SUMA2 NUMERIC(18,2),
    SUMA3 NUMERIC(18,2),
    IVA1 NUMERIC(18,2),
    IVA2 NUMERIC(18,2),
    IVA3 NUMERIC(18,2),
    SUMAEX NUMERIC(18,2),
    SUMAGR NUMERIC(18,2),
    TOTCONSUMO NUMERIC(18,2),
    DTOIT1M NUMERIC(18,2),
    DTOIT2M NUMERIC(18,2),
    DTOIT3M NUMERIC(18,2),
    TOTCAJAS NUMERIC(18,2),
    VEHICULO VARCHAR(8),
    RECIBIDO NUMERIC(18,2),
    CAMBIO NUMERIC(18,2),
    HORA TIME,
    FORMAPAGO1 VARCHAR(30),
    MONTOPAGO1 NUMERIC(18,2),
    FORMAPAGO2 VARCHAR(30),
    MONTOPAGO2 NUMERIC(18,2),
    FORMAPAGO3 VARCHAR(30),
    MONTOPAGO3 NUMERIC(18,2),
    PUNTOS INTEGER,
    PUNTOSACUM INTEGER,
    PUNTOSVENC INTEGER,
    FECPTOS DATE,
    OBSITEM BLOB SUB_TYPE 1 SEGMENT SIZE 80,
    SUCUR VARCHAR(10),
    ALTERNATIVAS NUMERIC(18,4),
    PRINCIPALES NUMERIC(18,4))
AS
DECLARE VARIABLE IMPTOS CHAR(1);
DECLARE VARIABLE TARIFA INTEGER;
declare variable DEVUELTO NUMERIC(18,2);
declare variable ORDENCOD CHAR(2);
declare variable IMPRDEV CHAR(2);
declare variable IMPR CHAR(1);
declare variable ITEMFP INTEGER;
declare variable FORMAP VARCHAR(30);
declare variable MONTOP NUMERIC(18,2);
declare variable ICOINC CHAR(2);
declare variable DTOITM1 NUMERIC(18,2);
declare variable DTOITM2 NUMERIC(18,2);
declare variable DTOITM3 NUMERIC(18,2);
declare variable DTOITE3 CHAR(2);
declare variable SUMDTOIT NUMERIC(18,2);
declare variable AUTORET VARCHAR(10);
declare variable FAUTORET DATE;
declare variable FACTCANT NUMERIC(18,4);
BEGIN
execute procedure lee_configuracion('FACTURACION', 'ARTICULOS', 'IMPOCONSUMO INCLUIDO EN EL PRECIO BASE DE VENTA ANTES DE IVA') returning_values (icoinc);
execute procedure lee_configuracion('FACTURACION', 'FACTURAS', 'COLUMNAS DE DESCUENTO POR ITEM ADICIONALES') returning_values (DTOITE3);
SELECT F.PREF_PRE, FACT_NUMERO, FACT_FECHA, FACT_VENCE, F.BODE_COD, BODE_NOM, F.TERC_NIT, FACT_NOMCLIENTE, F.VEND_COD, VEND_NOMBRE, F.PTVT_ID, PTVT_NOM,
    AUTO_NUMERO, FACT_DESPACHO, FACT_TRANSP, FACT_COTIZACI, FACT_PEDIDO, FACT_REMISION, FACT_COMIPORC, FACT_COMIMONTO, FACT_IVAINC, 
    FACT_DTOPOR, FACT_DTOMONTO, FACT_ADICIONAL, FACT_IVAMONTO, FACT_RTFTEPOR, FACT_RTFTEMONTO, FACT_RTIVAPOR, FACT_RTIVAMONTO, FACT_RTICAPOR, FACT_RTICAMONTO, FACT_EXTRA, FACT_DTOFPOR, FACT_DTOFMONTO, FACT_DTOFFECHA, FACT_TOTAL,
    TERC_DIR, TERC_CIU, TERC_TEL, TERC_CONTACTO, TERC_FAX, TERC_DV, TERC_CEL, FACT_DTOIT1, FACT_DTOIT2, FACT_DTOIT3,
    FACT_OBS, VEHI_COD, /*FACT_NROCOPIA,*/ FACT_RECIBIDO, FACT_SUCURSAL, FACT_DETCLI, FACT_DETCLINOM, TERC_NOM
    FROM FACTURAS F, BODEGA B, VENDEDORES V, PUNTO_VENTA P, TERCEROS T
    WHERE F.BODE_COD = B.BODE_COD AND F.VEND_COD = V.VEND_COD AND F.PTVT_ID = P.PTVT_ID AND F.TERC_NIT = T.TERC_NIT AND F.FACT_ID = :ID
    into :PREF, :NUMERO, :FECHA, :VENCE, :CODBODEGA, :NOMBODEGA, :NIT, :NOMTERCERO, :VENDEDOR, :NOMVENDEDOR, :PUNTOVTA, :NOMPUNTOVTA,
    :AUTORIZACION, :DESPACHO, :TRANSPORTADOR, :COTIZACION, :PEDIDO, :REMISION, :COMIPORC, :COMIMONTO, :IMPTOS,
    :DTOPORC, :DTOMONTO, :ADICIONAL, :IVAMONTO, :RTEFTEPORC, :RTEFTEMONTO, :RTEIVAPORC, :RTEIVAMONTO, :RTEICAPORC, :RTEICAMONTO, :EXTRA, :DTOFPORC, :DTOFMONTO, :FECHADTO, :TOTALFAC,
    :DIRECCION, :CIUDAD, :TELEFONO, :CONTACTO, :FAX, :DV, :CEL, :dtoit1m, :dtoit2m, :dtoit3m,
    :OBS, :VEHICULO,/* :NROCOPIA,*/ :RECIBIDO, :SUCUR, :paciente, :nompaciente, :nomcliente;

/* ACUMULE LOS PUNTOS, SE HACE ACA POR SER POSTERIOR AL DETALLE */
EXECUTE PROCEDURE acumula_puntos_cliente (31, :id, :nit, :fecha) returning_values (:PUNTOS);
EXECUTE PROCEDURE consulta_puntos_cliente (:id, :nit, :fecha) returning_values (:puntos, :puntosacum, :puntosvenc, :fecptos);
if (DTOIT1M IS NULL) then
    DTOIT1M = 0;
if (DTOIT2M IS NULL) then
    DTOIT2M = 0;
if (DTOIT3M IS NULL) then
    DTOIT3M = 0;
SELECT CLIE_COD, C.ZONA_COD, ZONA_NOM
    FROM CLIENTES C, ZONAS Z
    WHERE TERC_NIT = :NIT AND C.ZONA_COD = Z.ZONA_COD
    INTO :CODIGOCL, :ZONACOD, :ZONANOM;
SELECT CLSU_DIR, CLSU_CIUDAD, CLSU_TEL FROM CLIENTE_SUCURSALES WHERE TERC_NIT = :NIT AND CLCU_COD = :SUCUR
    INTO :DIRECCION, :CIUDAD, :TELEFONO;
DIASVENCE = VENCE - FECHA;
if (DIASVENCE > 0) then
    CONTCRED = 'CREDITO ' || CAST(DIASVENCE AS VARCHAR(3)) || ' DIAS';
ELSE
    CONTCRED = 'CONTADO';
SUBTOTAL = TOTALFAC - EXTRA - IVAMONTO - ADICIONAL + DTOMONTO;
if (DTOITE3 = 'SI') then
    BEGIN
    SELECT SUM(FADE_DTOMONTO) FROM FACTURAS_DETALLE WHERE FACT_ID = :id INTO :sumdtoit;
    SUBTOTAL = SUBTOTAL + sumdtoit + dtoit1m + dtoit2m + dtoit3m;
    END
EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'FECHA AUTORETENEDOR NO DESCONTAR RETENCIONES DEL SALDO PERO SI CONTABILIZARLAS') returning_values (AUTORET);
if (AUTORET <> '') then
    FAUTORET = CAST(AUTORET AS DATE);
else
    FAUTORET = '9999/12/31';
if (FECHA > fautoret) then
    TOTALPAGAR = TOTALFAC - RTEIVAMONTO - RTEICAMONTO;
ELSE
    TOTALPAGAR = TOTALFAC - RTEFTEMONTO - RTEIVAMONTO - RTEICAMONTO;
if (RECIBIDO <> 0) then
    CAMBIO = RECIBIDO - totalpagar;
ELSE
    CAMBIO = 0;
SUMAEX = 0;
SUMA1 = 0;
SUMA2 = 0;
SUMA3 = 0;
IVA1 = 0;
IVA2 = 0;
IVA3 = 0;
TOTCONSUMO = 0;
MONTOPAGO1 = 0;
SELECT MAX(AUDI_HORA) FROM AUDITORIA WHERE TIDO_COD = 31 AND AUDI_IDDOC = :ID AND AUDI_OPER = 'I' INTO :HORA;
/* AHORA LAS FORMAS DE PAGO, BUSQUE EL ABONO DE HOY A LA FACTURA */
ITEMFP = 1;
MONTOPAGO1 = 0;
MONTOPAGO2 = 0;
MONTOPAGO3 = 0;
FOR SELECT FOPA_NOM, RCPA_MONTO FROM RECIBOS_CAJA_PAGO P, FORMAS_PAGO F, RECIBOS_CAJA R, RECIBOS_CAJA_DETALLE D
    WHERE R.RECA_ID = P.RECA_ID AND R.RECA_ID = D.RECA_ID AND P.FOPA_ID = F.FOPA_ID AND RECA_FECHA = :FECHA AND RCDE_TIPODOC = 31 AND RCDE_IDDOC = :ID
    INTO :formap, :MONTOP
    DO
    BEGIN
    if (ITEMFP = 1) then
        BEGIN
        FORMAPAGO1 = FORMAP;
        MONTOPAGO1 = MONTOP;
        END
    if (ITEMFP = 2) then
        BEGIN
        FORMAPAGO2 = FORMAP;
        MONTOPAGO2 = MONTOP;
        END
    if (ITEMFP = 3) then
        BEGIN
        FORMAPAGO3 = FORMAP;
        MONTOPAGO3 = MONTOP;
        END
    ITEMFP = ITEMFP + 1;
    END
EXECUTE PROCEDURE lee_configuracion ('FACTURACION','DOCUMENTOS','ORDENAR ITEMS POR CODIGO DE ARTICULO') returning_values (:ORDENCOD);
EXECUTE PROCEDURE lee_configuracion ('FACTURACION','POS', 'IMPRIMIR DEVOLUCIONES DE ARTICULOS NEGATIVOS') returning_values (:imprdev);
totcajas = 0;
if (ORDENCOD = 'SI') then
    BEGIN
    FOR SELECT FADE_ITEM, D.ARTI_COD, FADE_CODBAR, SUBSTR(FADE_DESC,1,60), ARTI_DESCORTA, FADE_CANT, FADE_UNIDAD, FADE_FACTOR, BODE_COD, FADE_LOTE, LIPR_COD, FADE_PRUNIT, FADE_DTOPORC, FADE_DTOMONTO, FADE_IVAPORC, FADE_IVAMONTO, FADE_CONSUMO, FADE_TOTAL, FADE_REFERENCIA,
        GRUP_COD, SUBG_COD, MARC_COD, ARTI_PESO, ARTI_ANCHO, ARTI_ALTO, ARTI_LARGO, TAIV_COD, FADE_DEVUELTO, FADE_OBS, FADE_DTO1, FADE_DTO2, FADE_DTO3, FADE_DTOM1, FADE_DTOM2, FADE_DTOM3, FADE_CAJAS
        FROM FACTURAS_DETALLE D, ARTICULO A
        WHERE D.ARTI_COD = A.ARTI_COD AND D.FACT_ID = :ID
        ORDER BY D.ARTI_COD
        INTO :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :DESCORTA, :CANT, :UNIDAD, :FACTOR, :BODITEM, :LOTE, :LISTAPR, :PRUNIT, :DTOITPORC, :DTOITMONTO, :IVAPORC, :IVAITMONTO, :CONSUMO, :TOTAL, :refitem,
        :GRUPO, :SUBGRUPO, :MARCA, :PESO, :ANCHO, :ALTO, :LARGO, :TARIFA, :devuelto, :obsitem, :dtoit1, :dtoit2, :dtoit3, :dtoitm1, :dtoitm2, :dtoitm3, :cajas
        DO
          BEGIN
          if (ARTICULO = CODBAR) then
            SELECT FIRST 1 COBA_COD FROM barras_articulo WHERE ARTI_COD = :articulo INTO :CODBAR;
          if (IMPRDEV <> 'SI') then
            BEGIN
            if ((CANT >= 0) AND (DEVUELTO = 0)) then
                IMPR = 'S';
            ELSE
                IMPR = 'N'; /* ES DEVOLUCION */
            END
          ELSE
            IMPR = 'S';
          if (IMPR = 'S') then
            BEGIN
            prneto = PRUNIT - DTOITMONTO - dtoitm1 - dtoitm2 - dtoitm3;
            if (IMPTOS = 'S') then
                if (cant <> 0) then
                    prnetosiniva = PRUNIT - DTOITMONTO - ((IVAITMONTO+CONSUMO) / CANT) - dtoitm1 - dtoitm2 - dtoitm3;
                else
                    prnetosiniva = PRUNIT - DTOITMONTO - dtoitm1 - dtoitm2 - dtoitm3;
            ELSE
                prnetosiniva = PRUNIT - DTOITMONTO - dtoit1m - dtoit2m - dtoit3m;
            if (ICOINC = 'SI') then
                SUBTOTIT = TOTAL - IVAITMONTO;
            else
                SUBTOTIT = TOTAL - IVAITMONTO - CONSUMO;
            TOTCONSUMO = TOTCONSUMO + CONSUMO;
            SELECT LOTE_VENCE FROM LOTES WHERE LOTE_NRO = :lote AND ARTI_COD = :ARTICULO AND BODE_COD = :boditem INTO :vlote;
            if ((REFITEM <> '.t') or (REFITEM IS NULL)) then
                BEGIN
                /* NO SUME LOS ENSAMBLES */
                if (IVAPORC = 0) then
                    SUMAEX = SUMAEX + TOTAL;
                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;
                END
            if (ANCHO IS NULL) then
                ANCHO = 0;
            if (ALTO IS NULL) then
                ALTO = 0;
            if (LARGO IS NULL) then
                LARGO = 0;
            if (PESO IS NULL) then
                PESO = 0;
            PESO = (PESO / 1000) * CANT * FACTOR;
            totcajas = totcajas + cajas;
            if (substr(ARTICULO,1,2) = '.t') then
                BEGIN
                REFITEM = '';
                TOTAL = 0;
                SUBTOTIT = 0;
                END
            SELECT STAND_COD FROM STANDS WHERE ARTI_COD = :ARTICULO AND STAND_BODEGA = :boditem INTO :stand;
            factcant = NULL;
            SELECT FIRST 1 UNAR_FACCAN FROM unidad_articulo WHERE ARTI_COD = :articulo INTO :factcant;
            if (factcant IS NULL) then
                factcant = 1;
            ALTERNATIVAS = FLOOR(CANT * factor / factcant);
            PRINCIPALES = (CANT * FACTOR) - (alternativas * factcant);
            SUSPEND;
            END
          END
    END
ELSE
    BEGIN
    FOR SELECT FADE_ITEM, D.ARTI_COD, FADE_CODBAR, SUBSTR(FADE_DESC,1,60), ARTI_DESCORTA, FADE_CANT, FADE_UNIDAD, FADE_FACTOR, BODE_COD, FADE_LOTE, LIPR_COD, FADE_PRUNIT, FADE_DTOPORC, FADE_DTOMONTO, FADE_IVAPORC, FADE_IVAMONTO, FADE_CONSUMO, FADE_TOTAL, FADE_REFERENCIA,
        GRUP_COD, SUBG_COD, MARC_COD, ARTI_PESO, ARTI_ANCHO, ARTI_ALTO, ARTI_LARGO, TAIV_COD, FADE_DEVUELTO, FADE_OBS, FADE_DTO1, FADE_DTO2, FADE_DTO3, FADE_DTOM1, FADE_DTOM2, FADE_DTOM3, FADE_CAJAS
        FROM FACTURAS_DETALLE D, ARTICULO A
        WHERE D.ARTI_COD = A.ARTI_COD AND D.FACT_ID = :ID
        ORDER BY FADE_ITEM
        INTO :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :DESCORTA, :CANT, :UNIDAD, :FACTOR, :BODITEM, :LOTE, :LISTAPR, :PRUNIT, :DTOITPORC, :DTOITMONTO, :IVAPORC, :IVAITMONTO, :CONSUMO, :TOTAL, :refitem,
        :GRUPO, :SUBGRUPO, :MARCA, :PESO, :ANCHO, :ALTO, :LARGO, :TARIFA, :devuelto, :obsitem, :dtoit1, :dtoit2, :dtoit3, :dtoitm1, :dtoitm2, :dtoitm3, :cajas
        DO
          BEGIN
          if (IMPRDEV <> 'SI') then
            BEGIN
            if ((CANT >= 0) AND (DEVUELTO = 0)) then
                IMPR = 'S';
            ELSE
                IMPR = 'N'; /* ES DEVOLUCION */
            END
          ELSE
            IMPR = 'S';
          if (IMPR = 'S') then
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :GRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :MARCA INTO NOMMARCA;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :SUBGRUPO AND GRUP_COD = :GRUPO INTO :NOMSUBG;
            prneto = PRUNIT - DTOITMONTO - dtoitm1 - dtoitm2 - dtoitm3;
            if (IMPTOS = 'S') then
                if (cant <> 0) then
                    prnetosiniva = PRUNIT - DTOITMONTO - ((IVAITMONTO+CONSUMO) / CANT) - dtoit1m - dtoit2m - dtoit3m;
                else
                    prnetosiniva = PRUNIT - DTOITMONTO - dtoitm1 - dtoitm2 - dtoitm3;
            ELSE
                prnetosiniva = PRUNIT - DTOITMONTO - dtoitm1 - dtoitm2 - dtoitm3;
            if (ICOINC = 'SI') then
                SUBTOTIT = TOTAL - IVAITMONTO;
            else
                SUBTOTIT = TOTAL - IVAITMONTO - CONSUMO;
            TOTCONSUMO = TOTCONSUMO + CONSUMO;
            SELECT LOTE_VENCE FROM LOTES WHERE LOTE_NRO = :lote AND ARTI_COD = :ARTICULO AND BODE_COD = :boditem INTO :vlote;
            if ((REFITEM <> '.t') or (REFITEM IS NULL)) then
                BEGIN
                /* NO SUME LOS ENSAMBLES */
                if (IVAPORC = 0) then
                    SUMAEX = SUMAEX + TOTAL;
                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;
                END
            if (ANCHO IS NULL) then
                ANCHO = 0;
            if (ALTO IS NULL) then
                ALTO = 0;
            if (LARGO IS NULL) then
                LARGO = 0;
            if (PESO IS NULL) then
                PESO = 0;
            PESO = (PESO / 1000)* CANT * FACTOR;
            totcajas = totcajas + cajas;
            if (substr(ARTICULO,1,2) = '.t') then
                BEGIN
                REFITEM = '';
                TOTAL = 0;
                SUBTOTIT = 0;
                END
            SELECT STAND_COD FROM STANDS WHERE ARTI_COD = :ARTICULO AND STAND_BODEGA = :boditem INTO :stand;
            factcant = NULL;
            SELECT FIRST 1 UNAR_FACCAN FROM unidad_articulo WHERE ARTI_COD = :articulo INTO :factcant;
            if (factcant IS NULL) then
                factcant = 1;
            ALTERNATIVAS = FLOOR(CANT * factor / factcant);
            PRINCIPALES = (CANT * FACTOR) - (alternativas * factcant);
            SUSPEND;
            END
          END
    END
END
^

SET TERM ; ^


/* 20090407  INCLUIR RUTEROS EN LOS CRUCES DE FACTURAS */
SET TERM ^ ;

CREATE OR ALTER PROCEDURE CRUCES_DOCUMENTOS(
    TIPOORI INTEGER,
    IDORI INTEGER)
RETURNS (
    TIPODES INTEGER,
    ID INTEGER,
    NOMTIPO VARCHAR(8),
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE)
AS
declare variable IDC INTEGER;
declare variable PEDAUTO CHAR(2);
begin
EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION','FACTURAS','GENERAR PEDIDO AUTOMATICAMENTE CON LA FACTURA') RETURNING_VALUES (PEDAUTO);
FOR SELECT DISTINCT COFA_TIPODES, COFA_ID FROM CONSOLIDADO_FALTANTES
    WHERE COFA_TIPOORI = :TIPOORI AND COFA_IDORI = :IDORI AND COFA_OK = 'S' INTO :TIPODES, :IDC
    DO
    BEGIN
    SELECT TIDO_NOMCORTO FROM tipo_documento WHERE TIDO_COD = :tipodes INTO :nomtipo;
    if (TIPODES = 21) then
        SELECT FACO_ID, PREF_PRE, FACO_NUMERO, FACO_FECHA FROM FACTURAS_COMPRA WHERE FACO_CONSOLIDA = :IDC AND FACO_ANULADO = 'N' INTO :ID, :PREFIJO, :NUMERO, :FECHA;
    if (TIPODES = 22) then
        SELECT REPR_ID, PREF_PRE, REPR_NUMERO, REPR_FECHA FROM remision_proveedor WHERE REPR_CONSOLIDA = :IDC AND REPR_ANULADO = 'N' INTO :ID, :PREFIJO, :NUMERO, :FECHA;
    if (TIPODES = 23) then
        SELECT ORDC_ID, PREF_PRE, ORDC_NUMERO, ORDC_FECHA FROM ORDENES_COMPRA WHERE ORDC_CONSOLIDA = :IDC AND ORDC_ANULADO = 'N' INTO :ID, :PREFIJO, :NUMERO, :FECHA;
    if (TIPODES = 31) then
        SELECT FACT_ID, PREF_PRE, FACT_NUMERO, FACT_FECHA FROM FACTURAS WHERE FACT_CONSOLIDA = :IDC AND FACT_ANULADO = 'N' INTO :ID, :PREFIJO, :NUMERO, :FECHA;
    if (TIPODES = 32) then
        SELECT REVT_ID, PREF_PRE, REVT_NUMERO, REVT_FECHA FROM remisiones_venta WHERE REVT_CONSOLIDA = :IDC AND REVT_ANULADO = 'N' INTO :ID, :PREFIJO, :NUMERO, :FECHA;
    if (TIPODES = 34) then
        SELECT PEDI_ID, PREF_PRE, PEDI_NUMERO, PEDI_FECHA FROM PEDIDOS WHERE PEDI_CONSOLIDA = :IDC AND PEDI_ANULADO = 'N' INTO :ID, :PREFIJO, :NUMERO, :FECHA;
    suspend;
    END

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

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

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

SET TERM ; ^


/* 20090407b recibir un mayor valor sin hacer anticipos o notas en recibos */

INSERT INTO CONFIGURACION (CONF_MODULO, CONF_CATEGORIA, CONF_PROPIEDAD, CONF_VALOR, CONF_POSIBLES, CONF_AYUDA) VALUES ('CAJA', 'RECIBOS', 'MAXIMO EXCEDENTE PERMITIDO EN RECIBOS DE CAJA', '1000', '', 'Indique el máximo valor permitido como excedente en el pago de un cliente para ajustar el valor recibido sin hacer anticipos o notas de cartera');
commit work;

ALTER TABLE RECIBOS_CAJA
ADD RECA_EXEDENTE T_MONTO;

/* 20090413 */
ALTER TABLE FORMATO_DATOS
ADD DAFO_CORTARPALABRAS T_BOOLEANO;

UPDATE FORMATO_DATOS SET DAFO_CORTARPALABRAS = 'S';
COMMIT WORK;

ALTER TABLE FORMATO_DATOS
ADD DAFO_JUSTIFICA CHAR(1);

UPDATE FORMATO_DATOS SET DAFO_JUSTIFICA = 'I';
COMMIT WORK;

SET TERM ^ ;


CREATE OR ALTER TRIGGER FORMATO_DATOS_BI FOR FORMATO_DATOS
ACTIVE BEFORE INSERT POSITION 0
AS
BEGIN
  /* Trigger body */
  if (NEW.dafo_imprime IS NULL) then
      NEW.dafo_imprime = 'S';
  if (NEW.dafo_repite IS NULL) then
      NEW.dafo_repite = 'N';
  if (NEW.dafo_cortarpalabras IS NULL) then
      NEW.dafo_cortarpalabras = 'S';
  if (NEW.dafo_justifica IS NULL) then
      NEW.dafo_justifica = 'I';
END
^

SET TERM ; ^


/* 20090413B */
/* SI BASE EN 'D' DEBE TOMAR LA CUENTA DEL DOCUMENTO PERO NO EL MONTO, EL MONTO ES EL DEL DETALLE DEL ABONO */

SET TERM ^ ;

CREATE OR ALTER PROCEDURE CONTABIL_RECICAJA(
    IDDOC INTEGER,
    IDINTER INTEGER)
RETURNS (
    ERROR INTEGER,
    VER CHAR(1),
    IDC INTEGER)
AS
declare variable PREF VARCHAR(4);
declare variable NUM VARCHAR(6);
declare variable FECAUX DATE;
declare variable FECHA CHAR(8);
declare variable CONC CHAR(120);
declare variable VRDTO NUMERIC(18, 2);
declare variable VRRTFTE NUMERIC(18, 2);
declare variable VRRTIVA NUMERIC(18, 2);
declare variable VRRTICA NUMERIC(18, 2);
declare variable VRTOTAL NUMERIC(18, 2);
declare variable TIPOCOMP VARCHAR(3);
declare variable PREFCONT VARCHAR(4);
declare variable BASE CHAR(1);
declare variable CTABASE VARCHAR(20);
declare variable CAJA CHAR(1);
declare variable CTACAJA VARCHAR(20);
declare variable RTFTE CHAR(1);
declare variable CTARTFTE VARCHAR(20);
declare variable RTIVA CHAR(1);
declare variable CTARTIVA VARCHAR(20);
declare variable RTICA CHAR(1);
declare variable CTARTICA VARCHAR(20);
declare variable DTO CHAR(1);
declare variable CTADTO VARCHAR(20);
declare variable EXISTE CHAR(1);
declare variable CUENTA VARCHAR(20);
declare variable MONTO NUMERIC(18,2);
declare variable ES_RETENCION CHAR(1);
declare variable TIPOCUEN CHAR(1);
declare variable NIT VARCHAR(20);
declare variable PROY VARCHAR(4);
declare variable CENTRO VARCHAR(4);
declare variable DEBITO NUMERIC(18,2);
declare variable CREDITO NUMERIC(18,2);
declare variable NROI INTEGER;
declare variable SUMA NUMERIC(18,2);
declare variable TCTACLIEN VARCHAR(20);
declare variable TCTARTFTE VARCHAR(20);
declare variable TCTARTIVA VARCHAR(20);
declare variable TCTARTICA VARCHAR(20);
declare variable TIPOIT INTEGER;
declare variable PREFIT VARCHAR(4);
declare variable NUMIT VARCHAR(6);
declare variable NUMEROIT VARCHAR(10);
declare variable ABONOIT NUMERIC(18,2);
declare variable CTADIC VARCHAR(20);
declare variable BASEADIC VARCHAR(20);
declare variable PORCADIC NUMERIC(5,2);
declare variable VALORADIC NUMERIC(18,2);
declare variable DBADIC CHAR(1);
declare variable ANULADO CHAR(1);
declare variable VRBASE NUMERIC(18,2);
declare variable PORC numeric(9,2);
declare variable OK INTEGER;
declare variable CRUCES NUMERIC(18,2);
declare variable VRCAJA NUMERIC(18,2);
declare variable DIFCAMBIO NUMERIC(18,2);
declare variable CTADIF VARCHAR(20);
declare variable PROVID INTEGER;
declare variable RTFTEC NUMERIC(18,2);
declare variable RTIVAC NUMERIC(18,2);
declare variable RTICAC NUMERIC(18,2);
declare variable RTFTER CHAR(1);
declare variable CTARTFTER VARCHAR(20);
declare variable RTIVAR CHAR(1);
declare variable CTARTIVAR VARCHAR(20);
declare variable RTICAR CHAR(1);
declare variable CTARTICAR VARCHAR(20);
BEGIN
ERROR = 0;
/* BUSQUE LA INTERFACE */
EXISTE = 'N';
SELECT 'S', TICO_COD, PRCO_PRE, INCJ_BASE, INCJ_DTOPP, INCJ_RTFTE, INCJ_RTIVA, INCJ_RTICA, INCJ_CAJA, INCJ_CTABASE, INCJ_CTADTO, INCJ_CTARTFTE, INCJ_CTARTIVA, INCJ_CTARTICA, INCJ_CTACAJA, INCJ_CONFIRMAR
    FROM INTERFAZ_CAJA
    WHERE INCJ_ID = :IDINTER
    INTO :EXISTE, :TIPOCOMP, :PREFCONT, :BASE, :DTO, :RTFTE, :RTIVA, :RTICA, :CAJA, :CTABASE, :CTADTO, :CTARTFTE, :CTARTIVA, :CTARTICA, :CTACAJA, :VER;
if (EXISTE = 'S') then
  BEGIN
  /* BORRE LA CONTABILIZACION ANTERIOR */
  OK = 0;
  FOR SELECT CNTB_ID FROM CONTABILIZACION WHERE CNTB_TIPOREF = 61 AND CNTB_IDREF = :IDDOC INTO :OK DO
    BEGIN
    DELETE FROM CONTABILIZACION_DET WHERE CNTB_ID = :OK;
    DELETE FROM CONTABILIZACION WHERE CNTB_ID = :OK;
    END
  /* TRAIGA EL ENCABEZADO DEL RECIBO */
  SELECT PREF_PRE, RECA_NUMERO, RECA_FECHA, R.TERC_NIT, RECA_CONC, RECA_DTOF, RECA_MONTO, RECA_RTFTEMONTO, RECA_RTIVAMONTO, RECA_RTICAMONTO, TERC_CTARTFTE, TERC_CTARTIVA, TERC_CTARTICA, TERC_CTACLIENTE, RECA_ANULADO, RECA_PROVID
    FROM RECIBOS_CAJA R, TERCEROS T
    WHERE RECA_ID = :IDDOC AND R.TERC_NIT = T.TERC_NIT
    INTO :PREF, :NUM, :FECAUX, :NIT, :CONC, :VRDTO, :VRTOTAL, :VRRTFTE, :VRRTIVA, :VRRTICA, :TCTARTFTE, TCTARTIVA, TCTARTICA, TCTACLIEN, :ANULADO, :PROVID;
  if (ANULADO = 'N') then
    BEGIN
    SELECT PREF_CENTRO, PREF_PROY FROM PREFIJOS
        WHERE PREF_PRE = :PREF AND TIDO_COD = 61 INTO :CENTRO, :PROY;
    EXECUTE PROCEDURE FECHA_A_CONTA(:FECAUX) returning_values (:FECHA);
    /* REGISTRE EL ENCABEZADO CONTABLE */
    IDC = GEN_ID(ID_CONTABILIZA, 1);
    INSERT INTO CONTABILIZACION (CNTB_ID, CNTB_TIPOCOMP, CNTB_PREFCNT, CNTB_NUMERO, CNTB_FECHA, CNTB_CONCEPTO, CNTB_REF, CNTB_TIPOREF, CNTB_IDREF, CNTB_PREFREF, CNTB_NUMREF, CNTB_PROCESADO)
        VALUES (:IDC, :TIPOCOMP, :PREFCONT, :NUM, :FECHA, :CONC, '', 61, :IDDOC, :PREF, :NUM, 'N');
    NROI = 0;
    SUMA = 0;
    /* SUME LOS CRUCES PARA LLEVARLOS A LA CUENTA X PAGAR Y RESTAR DE LA CAJA */
    SELECT SUM(RCCR_ABONO) FROM RECIBOS_CAJA_CRUCEC WHERE RECA_ID = :iddoc INTO :CRUCES;
    if (CRUCES IS NULL) then
        CRUCES = 0;
    VRCAJA = VRTOTAL - CRUCES;
    IF ((CAJA = 'K')) THEN
        BEGIN
        if (VRCAJA <> 0) then
            BEGIN
            CUENTA = NULL;
            EXECUTE PROCEDURE VALIDE_CUENTA_C (CTACAJA) RETURNING_VALUES (:OK);
            IF (OK = 0) THEN
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :CTACAJA INTO :CUENTA, :TIPOCUEN;
            ELSE
                begin
                EXECUTE PROCEDURE ERROR (61, :IDDOC, :CTACAJA, 2);
                CUENTA = CTACAJA;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERROR (61, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                EXECUTE PROCEDURE ERROR (61, :IDDOC, :CUENTA, 4);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                IF (VRCAJA > 0) THEN
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRCAJA, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    SUMA = SUMA + VRCAJA;
                    END
                ELSE   
                    BEGIN                     
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                       VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, ABS(:VRCAJA), 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    SUMA = SUMA + VRCAJA;
                    END
                NROI = NROI + 1;
                END
            END /* VRCAJA <> 0 */
        END /* CAJA CONSTANTE */
    IF ((CAJA = 'F')) THEN
        BEGIN
        /* AGRUPE LAS CUENTAS DE LAS FORMAS DE PAGO */
        FOR SELECT MAX(FOPA_CTACONTA), SUM(RCPA_MONTO)
            FROM formas_pago F, recibos_caja_pago R
            WHERE R.RECA_ID = :IDDOC AND R.FOPA_ID = F.FOPA_ID
            GROUP BY FOPA_CTACONTA
            INTO :CTACAJA, :MONTO
        DO
            BEGIN
            if (MONTO <> 0) then
                BEGIN
                CUENTA = NULL;
                EXECUTE PROCEDURE VALIDE_CUENTA_C (CTACAJA) RETURNING_VALUES (:OK);
                IF (OK = 0) THEN
                    SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                        WHERE CUEN_COD = :CTACAJA INTO :CUENTA, :TIPOCUEN;
                ELSE
                    begin
                    EXECUTE PROCEDURE ERROR (61, :IDDOC, :CTACAJA, 2);
                    CUENTA = CTACAJA;
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (61, :IDDOC, :CUENTA, 3);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (61, :IDDOC, :CUENTA, 4);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    IF (MONTO > 0) THEN
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        SUMA = SUMA + MONTO;
                        END
                    ELSE
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, abs(:MONTO), 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        SUMA = SUMA + MONTO;
                        END
                    NROI = NROI + 1;
                    END
                END /* MONTO <> 0 */
            END /* DO FORMA_PAGO */
        END /* CAJA = F */
    if (DTO = 'K') then /* DTO EN CTA CONSTANTE */
        BEGIN
        if (VRDTO <> 0) then
            BEGIN
            CUENTA = NULL;
            EXECUTE PROCEDURE VALIDE_CUENTA_C (CTADTO) RETURNING_VALUES (:OK);
            IF (OK = 0) THEN
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :CTADTO INTO :CUENTA, :TIPOCUEN;
            ELSE
                begin
                EXECUTE PROCEDURE ERROR (61, :IDDOC, :CTADTO, 2);
                CUENTA = CTADTO;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERROR (61, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                EXECUTE PROCEDURE ERROR (61, :IDDOC, :CUENTA, 4);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRDTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA + VRDTO;
                END
            END /* VRDTO <> 0 */
        END /* DTO EN CTA CONSTANTE */

    /* LA DIFERENCIA EN CAMBIO */
    SELECT SUM(RCDE_DIFCAMBIO) FROM recibos_caja_detalle WHERE RECA_ID = :iddoc INTO :DIFCAMBIO;
    IF ((DIFCAMBIO IS NOT NULL) AND (DIFCAMBIO <> 0)) THEN
        BEGIN
        if (DIFCAMBIO > 0) then
            execute procedure lee_configuracion('GENERAL','GENERAL','CUENTA DE INGRESO POR DIFERENCIA EN CAMBIO PARA OPERACIONES EN OTRA MONEDA') returning_values (:ctadif);
        else
            execute procedure lee_configuracion('GENERAL','GENERAL','CUENTA DE GASTO POR DIFERENCIA EN CAMBIO PARA OPERACIONES EN OTRA MONEDA') returning_values (:ctadif);
        CUENTA = NULL;
        EXECUTE PROCEDURE VALIDE_CUENTA_C (ctadif) RETURNING_VALUES (:OK);
        IF (OK = 0) THEN
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :ctadif INTO :CUENTA, :TIPOCUEN;
        ELSE
            begin
            EXECUTE PROCEDURE ERROR (61, :IDDOC, :ctadif, 2);
            CUENTA = ctadif;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERROR (61, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERROR (61, :IDDOC, :CUENTA, 4);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            if (DIFCAMBIO > 0) then
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :difcambio, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            else
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', ABS(:difcambio), 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA - difcambio;
            END
        END
    /* RETENCION FUENTE */
    if ((RTFTE = 'T') or (RTFTE = 'K')) then
      if (VRRTFTE <> 0) then
        BEGIN
        if (RTFTE = 'T') then
            CTARTFTE = TCTARTFTE;
        CUENTA = NULL;
        EXECUTE PROCEDURE VALIDE_CUENTA_C (CTARTFTE) RETURNING_VALUES (:OK);
        IF (OK = 0) THEN
            SELECT CUEN_COD, CUEN_RETENCION, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTARTFTE INTO :CUENTA, :ES_RETENCION, :TIPOCUEN;
        ELSE
            begin
            EXECUTE PROCEDURE ERROR (61, :IDDOC, :CTARTFTE, 2);
            CUENTA = CTARTFTE;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERROR (61, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERROR (61, :IDDOC, :CUENTA, 4);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            if (ES_RETENCION = 'S') then
                BEGIN
                VRBASE = VRTOTAL + VRDTO + vrrtfte + vrrtiva + vrrtica;
                SELECT CLIE_rtefte from clientes where terc_nit = :NIT INTO :PORC;
                END
            ELSE
                BEGIN
                VRBASE = 0;
                PORC = 0;
                END
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :VRBASE, :PORC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTFTE;
            END
        END /* RTFTE */
    /* RETENCION IVA */
    if ((RTIVA = 'T') or (RTIVA = 'K')) then
      if (VRRTIVA <> 0) then
        BEGIN
        if (RTIVA = 'T') then
            CTARTIVA = TCTARTIVA;
        CUENTA = NULL;
        EXECUTE PROCEDURE VALIDE_CUENTA_C (CTARTIVA) RETURNING_VALUES (:OK);
        IF (OK = 0) THEN
            SELECT CUEN_COD, CUEN_RETENCION, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTARTIVA INTO :CUENTA, :ES_RETENCION, :TIPOCUEN;
        ELSE
            begin
            EXECUTE PROCEDURE ERROR (61, :IDDOC, :CTARTIVA, 2);
            CUENTA = CTARTIVA;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERROR (61, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERROR (61, :IDDOC, :CUENTA, 4);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            if (ES_RETENCION = 'S') then
                BEGIN
                VRBASE = VRTOTAL + VRDTO + vrrtfte + vrrtiva + vrrtica;
                SELECT CLIE_RTEIVA from clientes where terc_nit = :NIT INTO :PORC;
                END
            ELSE
                BEGIN
                VRBASE = 0;
                PORC = 0;
                END
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTIVA, 0, :VRBASE, :PORC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTIVA;
            END
        END /* RTIVA */
    /* RETENCION DE ICA */
    if ((RTICA = 'T') or (RTICA = 'K')) then
      if (VRRTICA <> 0) then
        BEGIN
        if (RTICA = 'T') then
            CTARTICA = TCTARTICA;
        CUENTA = NULL;
        EXECUTE PROCEDURE VALIDE_CUENTA_C (CTARTICA) RETURNING_VALUES (:OK);
        IF (OK = 0) THEN
            SELECT CUEN_COD, CUEN_RETENCION, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTARTICA INTO :CUENTA, :ES_RETENCION, :TIPOCUEN;
        ELSE
            begin
            EXECUTE PROCEDURE ERROR (61, :IDDOC, :CTARTICA, 2);
            CUENTA = CTARTICA;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERROR (61, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERROR (61, :IDDOC, :CUENTA, 4);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            if (ES_RETENCION = 'S') then
                BEGIN
                VRBASE = VRTOTAL + VRDTO + vrrtfte + vrrtiva + vrrtica;
                SELECT CLIE_RTEICA from clientes where terc_nit = :NIT INTO :PORC;
                END
            ELSE
                BEGIN
                VRBASE = 0;
                PORC = 0;
                END
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTICA, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTICA;
            END
        END /* RTICA */
    /* CRUCES CON CXP */
    if (CRUCES <> 0) then
        BEGIN
        SELECT PROV_CTAPAGAR FROM PROVEEDORES WHERE TERC_NIT = :nit INTO :ctabase;
        if (CTABASE IS NULL) then
            ctabase = tctaclien;
        CUENTA = NULL;
        EXECUTE PROCEDURE VALIDE_CUENTA_C (CTABASE) RETURNING_VALUES (:OK);
        IF (OK = 0) THEN
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTABASE INTO :CUENTA, :TIPOCUEN;
        ELSE
            begin
            EXECUTE PROCEDURE ERROR (61, :IDDOC, :CTABASE, 2);
            CUENTA = CTABASE;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERROR (61, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            /* DEBERIA RECORRER DOCUMENTO POR DOCUMENTO */
            FOR SELECT RCCR_TIPODOC, RCCR_PREFIJO, RCCR_NUMERO, RCCR_ABONO+RCCR_RTFTE+RCCR_RTIVA+RCCR_RTICA+RCCR_DTOF
                FROM recibos_caja_crucec WHERE RECA_ID = :IDDOC
                INTO :TIPOIT, PREFIT, NUMIT, ABONOIT
                DO
                BEGIN
                NUMEROIT = PREFIT || NUMIT;
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :ABONOIT, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, :NUMEROIT, NULL, NULL, :TIPOIT, 0);
                SUMA = SUMA + ABONOIT;
                NROI = NROI + 1;
                END
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :CRUCES, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            SUMA = SUMA + CRUCES;
            NROI = NROI + 1;
            END

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

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE RECIBOS_SIN_CONTABILIDAD(
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    ID INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    ESTADO VARCHAR(20),
    IDI INTEGER,
    IDC INTEGER,
    ERROR INTEGER)
AS
DECLARE VARIABLE VER CHAR(2);
declare variable FECICNT VARCHAR(10);
declare variable FECFCNT VARCHAR(10);
declare variable idref INTEGER;
BEGIN /*$$IBE$$ 
EXECUTE PROCEDURE fecha_a_conta(FECINI) returning_values (FECICNT);
EXECUTE PROCEDURE fecha_a_conta(FECFIN) returning_values (FECFCNT);
FOR SELECT RECA_ID, PREF_PRE, RECA_NUMERO FROM RECIBOS_CAJA WHERE RECA_ANULADO = 'N' AND
    RECA_FECHA >= :FECINI AND RECA_FECHA <= :FECFIN and PREF_PRE NOT IN (SELECT AUTO_PREFRDC FROM AUTORIZACIONES) ORDER BY RECA_ID
    INTO :ID, :PREF, :NUMERO
DO
  BEGIN
  idref = null;
  SELECT ENCO_IDREF FROM COMPROBANTE_ENCABEZADO WHERE ENCO_TIPOREF = 61 AND ENCO_FECHA >= :FECICNT AND ENCO_FECHA <= :FECFCNT and ENCO_IDREF = :id into :idref;
  if (idref IS NULL) then
  begin
   ESTADO = 'PROCESANDO';
   SUSPEND;
   SELECT MAX(INCJ_ID) FROM INTERFAZ_CAJA WHERE PREF_PRE = :PREF AND TIDO_COD = 61 INTO :IDI;
   EXECUTE PROCEDURE CONTABIL_RECICAJA (:ID, :IDI) RETURNING_VALUES (:ERROR, :VER, :IDC);
   if (ERROR = 0) then
    BEGIN
    EXECUTE PROCEDURE CONTABILIZA_PENDIENTE (:IDC);
    ESTADO = 'OK';
    END
   ELSE
    ESTADO = 'ERROR';
   suspend;
  end
  END
 $$IBE$$*/ SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE RECIBOS_SIN_CONTABILIDAD(
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    ID INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    ESTADO VARCHAR(20),
    IDI INTEGER,
    IDC INTEGER,
    ERROR INTEGER)
AS
DECLARE VARIABLE VER CHAR(2);
declare variable FECICNT VARCHAR(10);
declare variable FECFCNT VARCHAR(10);
declare variable idref INTEGER;
BEGIN
EXECUTE PROCEDURE fecha_a_conta(FECINI) returning_values (FECICNT);
EXECUTE PROCEDURE fecha_a_conta(FECFIN) returning_values (FECFCNT);
FOR SELECT RECA_ID, PREF_PRE, RECA_NUMERO FROM RECIBOS_CAJA WHERE RECA_ANULADO = 'N' AND
    RECA_FECHA >= :FECINI AND RECA_FECHA <= :FECFIN and PREF_PRE NOT IN (SELECT AUTO_PREFRDC FROM AUTORIZACIONES) ORDER BY RECA_ID
    INTO :ID, :PREF, :NUMERO
DO
  BEGIN
  idref = null;
  SELECT ENCO_IDREF FROM COMPROBANTE_ENCABEZADO WHERE ENCO_TIPOREF = 61 AND ENCO_FECHA >= :FECICNT AND ENCO_FECHA <= :FECFCNT and ENCO_IDREF = :id into :idref;
  if (idref IS NULL) then
  begin
   ESTADO = 'PROCESANDO';
   SUSPEND;
   SELECT MAX(INCJ_ID) FROM INTERFAZ_CAJA WHERE PREF_PRE = :PREF AND TIDO_COD = 61 INTO :IDI;
   EXECUTE PROCEDURE CONTABIL_RECICAJA (:ID, :IDI) RETURNING_VALUES (:ERROR, :VER, :IDC);
   if (ERROR = 0) then
    BEGIN
    EXECUTE PROCEDURE CONTABILIZA_PENDIENTE (:IDC);
    ESTADO = 'OK';
    END
   ELSE
    ESTADO = 'ERROR';
   suspend;
  end
  END
END

^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER PROCEDURE CONTABIL_EGRESO(
    IDDOC INTEGER,
    IDINTER INTEGER)
RETURNS (
    ERROR INTEGER,
    VER CHAR(1),
    IDC INTEGER)
AS
declare variable PREF VARCHAR(4);
declare variable NUM VARCHAR(6);
declare variable FECAUX DATE;
declare variable FECHA CHAR(8);
declare variable CONC CHAR(120);
declare variable VRDTO NUMERIC(18, 2);
declare variable VRRTFTE NUMERIC(18, 2);
declare variable VRRTIVA NUMERIC(18, 2);
declare variable VRRTICA NUMERIC(18, 2);
declare variable VRTOTAL NUMERIC(18, 2);
declare variable TIPOCOMP VARCHAR(3);
declare variable PREFCONT VARCHAR(4);
declare variable BASE CHAR(1);
declare variable CTABASE VARCHAR(20);
declare variable CAJA CHAR(1);
declare variable CTACAJA VARCHAR(20);
declare variable RTFTE CHAR(1);
declare variable CTARTFTE VARCHAR(20);
declare variable RTIVA CHAR(1);
declare variable CTARTIVA VARCHAR(20);
declare variable RTICA CHAR(1);
declare variable CTARTICA VARCHAR(20);
declare variable DTO CHAR(1);
declare variable CTADTO VARCHAR(20);
declare variable EXISTE CHAR(1);
declare variable CUENTA VARCHAR(20);
declare variable MONTO NUMERIC(18,2);
declare variable ES_RETENCION CHAR(1);
declare variable TIPOCUEN CHAR(1);
declare variable NIT VARCHAR(20);
declare variable PROY VARCHAR(4);
declare variable CENTRO VARCHAR(4);
declare variable MONTOBASE NUMERIC(18,2);
declare variable PORC NUMERIC(9,2);
declare variable DEBITO NUMERIC(18,2);
declare variable CREDITO NUMERIC(18,2);
declare variable NROI INTEGER;
declare variable SUMA NUMERIC(18,2);
declare variable TCTACLIEN VARCHAR(20);
declare variable TCTARTFTE VARCHAR(20);
declare variable TCTARTIVA VARCHAR(20);
declare variable TCTARTICA VARCHAR(20);
declare variable TCTACART VARCHAR(20);
declare variable TIPOIT INTEGER;
declare variable PREFIT VARCHAR(4);
declare variable NUMIT VARCHAR(6);
declare variable NUMEROIT VARCHAR(10);
declare variable ABONOIT NUMERIC(18,2);
declare variable CTADIC VARCHAR(20);
declare variable BASEADIC VARCHAR(20);
declare variable PORCADIC NUMERIC(5,2);
declare variable VALORADIC NUMERIC(18,2);
declare variable DBADIC CHAR(1);
declare variable VRBASE NUMERIC(18,2);
declare variable GMF CHAR(1);
declare variable CODBCO INTEGER;
declare variable NUMCHEQ VARCHAR(20);
declare variable CRUCES NUMERIC(18,2);
declare variable VRCAJA NUMERIC(18,2);
declare variable OK INTEGER;
declare variable DIFCAMBIO NUMERIC(18,2);
declare variable CTADIF VARCHAR(20);
declare variable RTFTEC NUMERIC(18,2);
declare variable RTIVAC NUMERIC(18,2);
declare variable RTICAC NUMERIC(18,2);
declare variable RTFTER CHAR(1);
declare variable CTARTFTER VARCHAR(20);
declare variable RTIVAR CHAR(1);
declare variable CTARTIVAR VARCHAR(20);
declare variable RTICAR CHAR(1);
declare variable CTARTICAR VARCHAR(20);
BEGIN
/* BUSQUE LA INTERFACE */
EXISTE = 'N';
SELECT 'S', TICO_COD, PRCO_PRE, INCJ_BASE, INCJ_DTOPP, INCJ_RTFTE, INCJ_RTIVA, INCJ_RTICA, INCJ_CAJA, INCJ_CTABASE, INCJ_CTADTO, INCJ_CTARTFTE, INCJ_CTARTIVA, INCJ_CTARTICA, INCJ_CTACAJA, INCJ_CONFIRMAR
    FROM INTERFAZ_CAJA
    WHERE INCJ_ID = :IDINTER
    INTO :EXISTE, :TIPOCOMP, :PREFCONT, :BASE, :DTO, :RTFTE, :RTIVA, :RTICA, :CAJA, :CTABASE, :CTADTO, :CTARTFTE, :CTARTIVA, :CTARTICA, :CTACAJA, :VER;
if (EXISTE = 'S') then
    BEGIN
    OK = 0;
    FOR SELECT CNTB_ID FROM CONTABILIZACION WHERE CNTB_TIPOREF = 62 AND CNTB_IDREF = :IDDOC INTO :OK DO
        BEGIN
        DELETE FROM CONTABILIZACION_DET WHERE CNTB_ID = :OK;
        DELETE FROM CONTABILIZACION WHERE CNTB_ID = :OK;
        END

    /* TRAIGA EL ENCABEZADO DEL EGRESO */
    SELECT PREF_PRE, EGRE_NUMERO, EGRE_FECHA, E.TERC_NIT, EGRE_CONC, EGRE_DTOF, EGRE_MONTO, EGRE_RTFTEMONTO, EGRE_RTIVAMONTO, EGRE_RTICAMONTO, TERC_CTARTFTE, TERC_CTARTIVA, TERC_CTARTICA, TERC_CTACLIENTE
        FROM EGRESOS E, TERCEROS T
        WHERE EGRE_ID = :IDDOC AND E.TERC_NIT = T.TERC_NIT
        INTO :PREF, :NUM, :FECAUX, :NIT, :CONC, :VRDTO, :VRTOTAL, :VRRTFTE, :VRRTIVA, :VRRTICA, :TCTARTFTE, TCTARTIVA, TCTARTICA, TCTACLIEN;
    /* SI ES PROVEEDOR, SOBREESCIBE LAS CUENTAS  */
    SELECT PROV_CTAPAGAR, PROV_CTARTFTE, PROV_CTARTIVA, PROV_CTARTICA
        FROM PROVEEDORES WHERE TERC_NIT = :NIT
        INTO TCTACLIEN, TCTARTFTE, TCTARTIVA, TCTARTICA;
    SELECT PREF_CENTRO, PREF_PROY FROM PREFIJOS
        WHERE PREF_PRE = :PREF AND TIDO_COD = 62 INTO :CENTRO, :PROY;
    EXECUTE PROCEDURE FECHA_A_CONTA(:FECAUX) returning_values (:FECHA);
    /* REGISTRE EL ENCABEZADO CONTABLE */
    IDC = GEN_ID(ID_CONTABILIZA, 1);
    INSERT INTO CONTABILIZACION (CNTB_ID, CNTB_TIPOCOMP, CNTB_PREFCNT, CNTB_NUMERO, CNTB_FECHA, CNTB_CONCEPTO, CNTB_REF, CNTB_TIPOREF, CNTB_IDREF, CNTB_PREFREF, CNTB_NUMREF, CNTB_PROCESADO)
        VALUES (:IDC, :TIPOCOMP, :PREFCONT, :NUM, :FECHA, :CONC, '', 62, :IDDOC, :PREF, :NUM, 'N');
    /* SUME LOS CRUCES PARA LLEVARLOS A LA CUENTA X PAGAR Y RESTAR DE LA CAJA */
    SELECT SUM(EGCC_ABONO) FROM EGRESOS_CRUCEC WHERE EGRE_ID = :iddoc INTO :CRUCES;
    if (CRUCES IS NULL) then
        CRUCES = 0;
    VRCAJA = VRTOTAL - CRUCES;
    NROI = 0;
    SUMA = 0;
    ERROR = 0;
    /* EL CREDITO EN LA CAJA O EL BANCO */
    IF ((CAJA = 'K')) THEN
        BEGIN
        if (VRCAJA <> 0) then
            BEGIN
            CUENTA = NULL;
            EXECUTE PROCEDURE VALIDE_CUENTA_C (CTACAJA) RETURNING_VALUES (:OK);
            IF (OK = 0) THEN
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :CTACAJA INTO :CUENTA, :TIPOCUEN;
            ELSE
                begin
                EXECUTE PROCEDURE ERROR (62, :IDDOC, :CTACAJA, 2);
                CUENTA = CTACAJA;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 4);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRCAJA, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - VRCAJA;
                END
            END /* VRCAJA <> 0 */
        END /* CAJA CONSTANTE */
    IF ((CAJA = 'F')) THEN
        BEGIN
        /* mueva la cuenta de la caja o el banco o ambas */
        /* PRIMERO LA CAJA */
        FOR SELECT CAJA_CUENTA, EGCA_MONTO FROM EGRESOS_CAJA E, CAJAS C
            WHERE C.CAJA_ID = E.CAJA_ID AND EGRE_ID = :IDDOC
            INTO :CTACAJA, :MONTO
            DO
            BEGIN
            if (MONTO <> 0) then
                BEGIN
                CUENTA = NULL;
                EXECUTE PROCEDURE VALIDE_CUENTA_C (CTACAJA) RETURNING_VALUES (:OK);
                IF (OK = 0) THEN
                    SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                        WHERE CUEN_COD = :CTACAJA INTO :CUENTA, :TIPOCUEN;
                ELSE
                    begin
                    EXECUTE PROCEDURE ERROR (62, :IDDOC, :CTACAJA, 2);
                    CUENTA = CTACAJA;
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 4);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA - MONTO;
                    END
                END /* MONTO <> 0 */
            END /* DO CAJA */
        /* AHORA EL BANCO */
        MONTO = 0;
        SELECT CUBA_CTACONTA, EGBC_MONTO, EGBC_GMF, E.CUBA_COD, CUBA_GMFPOR, EGBC_NUMERO
            FROM EGRESOS_BANCO E, CUENTAS_BANCO C
            WHERE E.CUBA_COD = C.CUBA_COD AND EGRE_ID = :IDDOC
            INTO :CTACAJA, :MONTO, :GMF, :CODBCO, :PORC, :NUMCHEQ;
        if (MONTO <> 0) then
            BEGIN
            if (MONTO <> 0) then
                BEGIN
                CUENTA = NULL;
                EXECUTE PROCEDURE VALIDE_CUENTA_C (CTACAJA) RETURNING_VALUES (:OK);
                IF (OK = 0) THEN
                    SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                        WHERE CUEN_COD = :CTACAJA INTO :CUENTA, :TIPOCUEN;
                ELSE
                    begin
                    EXECUTE PROCEDURE ERROR (62, :IDDOC, :CTACAJA, 2);
                    CUENTA = CTACAJA;
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 4);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, :NUMCHEQ, 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA - MONTO;
                    END
                /* EL GMF */
                if ((GMF = 'S') AND (PORC <> 0)) then
                    BEGIN
                    EXECUTE procedure REDONDEE(:MONTO * :PORC / 1000, 0) returning_values (MONTO);
                    /* REGISTRE EL GMF EN LA MISMA CUENTA DEL BANCO COMO CREDITO */
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, :NUMCHEQ, 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA - MONTO;

                    /* AHORA LA CUENTA DEL GASTO */
                    SELECT CUBA_CTAGMF FROM CUENTAS_BANCO
                        where CUBA_COD = :CODBCO INTO :CTACAJA;
                    EXECUTE PROCEDURE VALIDE_CUENTA_C (CTACAJA) RETURNING_VALUES (:OK);
                    IF (OK = 0) THEN
                        SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                            WHERE CUEN_COD = :CTACAJA INTO :CUENTA, :TIPOCUEN;
                    ELSE
                        begin
                        EXECUTE PROCEDURE ERROR (62, :IDDOC, :CTACAJA, 2);
                        CUENTA = CTACAJA;
                        TIPOCUEN = 'N';
                        ERROR = ERROR + 1;
                        end
                    if (TIPOCUEN = 'I') then
                        BEGIN
                        EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
                        TIPOCUEN = 'N';
                        ERROR = ERROR + 1;
                        END
                    if (TIPOCUEN = 'C') then
                        BEGIN
                        EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 4);
                        TIPOCUEN = 'N';
                        ERROR = ERROR + 1;
                        END
                    if (TIPOCUEN = 'N') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, :NUMCHEQ, :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NROI = NROI + 1;
                        SUMA = SUMA + MONTO;
                        END
                    END /* GMF */
                END /* MONTO <> 0 */
            END /* EGRESO_BANCO */
        END /* CAJA = F */

    /* LOS CRUCES CON CUENTAS X COBRAR */
    if (CRUCES <> 0) then
        BEGIN
        SELECT TERC_CTACLIENTE FROM TERCEROS WHERE TERC_NIT = :nit INTO :tctacart;
        if (tctacart IS NULL) then
            tctacart = tctaclien;
        CUENTA = NULL;
        EXECUTE PROCEDURE VALIDE_CUENTA_C (tctacart) RETURNING_VALUES (:OK);
        IF (OK = 0) THEN
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :tctacart INTO :CUENTA, :TIPOCUEN;
        ELSE
            begin
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :tctacart, 2);
            CUENTA = tctacart;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            /* DEBERIA RECORRER DOCUMENTO POR DOCUMENTO */
            FOR SELECT EGCC_TIPODOC, EGCC_PREFIJO, EGCC_NUMERO, EGCC_ABONO+EGCC_RTFTE+EGCC_RTIVA+EGCC_RTICA+EGCC_DTOF
                FROM egresos_crucec WHERE EGRE_ID = :IDDOC
                INTO :TIPOIT, PREFIT, NUMIT, ABONOIT
                DO
                BEGIN
                NUMEROIT = PREFIT || NUMIT;
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :ABONOIT, 0, 0, :NIT, :PROY, :CENTRO, NULL, :NUMEROIT, NULL, NULL, :TIPOIT, 0);
                SUMA = SUMA - ABONOIT;
                NROI = NROI + 1;
                END
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :CRUCES, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            SUMA = SUMA - CRUCES;
            NROI = NROI + 1;
            END
        /* LA DIFERENCIA EN CAMBIO */
        SELECT SUM(EGCC_DIFCAMBIO) FROM egresos_crucec WHERE EGRE_ID = :iddoc INTO :DIFCAMBIO;
        IF ((DIFCAMBIO IS NOT NULL) AND (DIFCAMBIO <> 0)) THEN
            BEGIN
            if (DIFCAMBIO > 0) then
                execute procedure lee_configuracion('GENERAL','GENERAL','CUENTA DE INGRESO POR DIFERENCIA EN CAMBIO PARA OPERACIONES EN OTRA MONEDA') returning_values (:ctadif);
            else
                execute procedure lee_configuracion('GENERAL','GENERAL','CUENTA DE GASTO POR DIFERENCIA EN CAMBIO PARA OPERACIONES EN OTRA MONEDA') returning_values (:ctadif);
            CUENTA = NULL;
            EXECUTE PROCEDURE VALIDE_CUENTA_C (ctadif) RETURNING_VALUES (:OK);
            IF (OK = 0) THEN
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :ctadif INTO :CUENTA, :TIPOCUEN;
            ELSE
                begin
                EXECUTE PROCEDURE ERROR (62, :IDDOC, :ctadif, 2);
                CUENTA = ctadif;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 4);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                if (DIFCAMBIO > 0) then
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :difcambio, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                else
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', ABS(:difcambio), 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - difcambio;
                END
            END
        /* RETEFUENTE DEL CRUCE */
        SELECT first 1 INCJ_RTFTE, INCJ_RTIVA, INCJ_RTICA, INCJ_CTARTFTE, INCJ_CTARTIVA, INCJ_CTARTICA
            FROM INTERFAZ_CAJA WHERE tido_cod = 61 into :RTFTER, :RTIVAR, :RTICAR, :CTARTFTER, :CTARTIVAR, :CTARTICAR;
        SELECT SUM(EGCC_RTFTE) FROM egresos_crucec WHERE EGRE_ID = :iddoc INTO :rtftec;
        IF ((rtftec IS NOT NULL) AND (rtftec <> 0)) THEN
            BEGIN
            if ((RTFTER = 'T') or (RTFTER = 'K')) then
                BEGIN
                if (RTFTER = 'T') then
                    SELECT TERC_CTARTFTE FROM TERCEROS WHERE TERC_NIT = :NIT INTO CTARTFTER;
                CUENTA = NULL;
                EXECUTE PROCEDURE VALIDE_CUENTA_C (ctartfter) RETURNING_VALUES (:OK);
                IF (OK = 0) THEN
                    SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                        WHERE CUEN_COD = :ctartfter INTO :CUENTA, :TIPOCUEN;
                ELSE
                    begin
                    EXECUTE PROCEDURE ERROR (62, :IDDOC, :ctartfter, 2);
                    CUENTA = ctartfter;
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 4);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :rtftec, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA + rtftec;
                    END
                END
            END
        /* RETEIVA DEL CRUCE */
        SELECT SUM(EGCC_RTIVA) FROM egresos_crucec WHERE EGRE_ID = :iddoc INTO :rtivac;
        IF ((rtivac IS NOT NULL) AND (rtivac <> 0)) THEN
            BEGIN
            if ((RTIVAR = 'T') or (RTIVAR = 'K')) then
                BEGIN
                if (RTIVAR = 'T') then
                    SELECT TERC_CTARTIVA FROM TERCEROS WHERE TERC_NIT = :NIT INTO CTARTIVAR;
                CUENTA = NULL;
                EXECUTE PROCEDURE VALIDE_CUENTA_C (ctartivar) RETURNING_VALUES (:OK);
                IF (OK = 0) THEN
                    SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                        WHERE CUEN_COD = :ctartivar INTO :CUENTA, :TIPOCUEN;
                ELSE
                    begin
                    EXECUTE PROCEDURE ERROR (62, :IDDOC, :ctartivar, 2);
                    CUENTA = ctartivar;
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 4);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :rtivac, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA + rtivac;
                    END
                END
            END
        /* RETEICA DEL CRUCE */
        SELECT SUM(EGCC_RTICA) FROM egresos_crucec WHERE EGRE_ID = :iddoc INTO :rticac;
        IF ((rticac IS NOT NULL) AND (rtivac <> 0)) THEN
            BEGIN
            if ((RTICAR = 'T') or (RTICAR = 'K')) then
                BEGIN
                if (RTICAR = 'T') then
                    SELECT TERC_CTARTICA FROM TERCEROS WHERE TERC_NIT = :NIT INTO CTARTICAR;
                CUENTA = NULL;
                EXECUTE PROCEDURE VALIDE_CUENTA_C (ctarticar) RETURNING_VALUES (:OK);
                IF (OK = 0) THEN
                    SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                        WHERE CUEN_COD = :ctarticar INTO :CUENTA, :TIPOCUEN;
                ELSE
                    begin
                    EXECUTE PROCEDURE ERROR (62, :IDDOC, :ctarticar, 2);
                    CUENTA = ctarticar;
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 4);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :rticac, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA + rticac;
                    END
                END
            END
        END /* cruces */

    if (DTO = 'K') then /* DTO EN CTA CONSTANTE */
        BEGIN
        if (VRDTO <> 0) then
            BEGIN
            CUENTA = NULL;
            EXECUTE PROCEDURE VALIDE_CUENTA_C (CTADTO) RETURNING_VALUES (:OK);
            IF (OK = 0) THEN
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :CTADTO INTO :CUENTA, :TIPOCUEN;
            ELSE
                begin
                EXECUTE PROCEDURE ERROR (62, :IDDOC, :CTADTO, 2);
                CUENTA = CTADTO;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 4);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRDTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - VRDTO;
                END
            END /* VRDTO <> 0 */
        END /* DTO EN CTA CONSTANTE */

    /* LA DIFERENCIA EN CAMBIO */
    SELECT SUM(EGDE_DIFCAMBIO) FROM egresos_detalle WHERE EGRE_ID = :iddoc INTO :DIFCAMBIO;
    IF ((DIFCAMBIO IS NOT NULL) AND (DIFCAMBIO <> 0)) THEN
        BEGIN
        if (DIFCAMBIO > 0) then
            execute procedure lee_configuracion('GENERAL','GENERAL','CUENTA DE GASTO POR DIFERENCIA EN CAMBIO PARA OPERACIONES EN OTRA MONEDA') returning_values (:ctadif);
        else
            execute procedure lee_configuracion('GENERAL','GENERAL','CUENTA DE INGRESO POR DIFERENCIA EN CAMBIO PARA OPERACIONES EN OTRA MONEDA') returning_values (:ctadif);
        CUENTA = NULL;
        EXECUTE PROCEDURE VALIDE_CUENTA_C (ctadif) RETURNING_VALUES (:OK);
        IF (OK = 0) THEN
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :ctadif INTO :CUENTA, :TIPOCUEN;
        ELSE
            begin
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :ctadif, 2);
            CUENTA = ctadif;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 4);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            if (DIFCAMBIO > 0) then
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :difcambio, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            else
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, ABS(:difcambio), 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA + difcambio;
            END
        END
    /* RETENCION FUENTE */
    if ((RTFTE = 'T') or (RTFTE = 'K')) then
      if (VRRTFTE <> 0) then
        BEGIN
        if (RTFTE = 'T') then
            CTARTFTE = TCTARTFTE;
        CUENTA = NULL;
        EXECUTE PROCEDURE VALIDE_CUENTA_C (CTARTFTE) RETURNING_VALUES (:OK);
        IF (OK = 0) THEN
            SELECT CUEN_COD, CUEN_RETENCION, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTARTFTE INTO :CUENTA, :ES_RETENCION, :TIPOCUEN;
        ELSE
            begin
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :CTARTFTE, 2);
            CUENTA = CTARTFTE;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 4);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            if (ES_RETENCION = 'S') then
                BEGIN
                VRBASE = VRTOTAL;
                SELECT PROV_RETEFTE from proveedores where terc_nit = :NIT INTO :PORC;
                END
            ELSE
                BEGIN
                VRBASE = 0;
                PORC = 0;
                END
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, :VRBASE, :PORC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA - VRRTFTE;
            END
        END /* RTFTE */
    /* RETENCION IVA */
    if ((RTIVA = 'T') or (RTIVA = 'K')) then
      if (VRRTIVA <> 0) then
        BEGIN
        if (RTIVA = 'T') then
            CTARTIVA = TCTARTIVA;
        CUENTA = NULL;
        EXECUTE PROCEDURE VALIDE_CUENTA_C (CTARTIVA) RETURNING_VALUES (:OK);
        IF (OK = 0) THEN
            SELECT CUEN_COD, CUEN_RETENCION, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTARTIVA INTO :CUENTA, :ES_RETENCION, :TIPOCUEN;
        ELSE
            begin
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :CTARTIVA, 2);
            CUENTA = CTARTIVA;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 4);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            if (ES_RETENCION = 'S') then
                BEGIN
                VRBASE = VRTOTAL;
                SELECT PROV_RTEIVA from proveedores where terc_nit = :NIT INTO :PORC;
                END
            ELSE
                BEGIN
                VRBASE = 0;
                PORC = 0;
                END
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTIVA, :VRBASE, :PORC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA - VRRTIVA;
            END
        END /* RTIVA */
    /* RETENCION DE ICA */
    if ((RTICA = 'T') or (RTICA = 'K')) then
      if (VRRTICA <> 0) then
        BEGIN
        if (RTICA = 'T') then
            CTARTICA = TCTARTICA;
        CUENTA = NULL;
        EXECUTE PROCEDURE VALIDE_CUENTA_C (CTARTICA) RETURNING_VALUES (:OK);
        IF (OK = 0) THEN
            SELECT CUEN_COD, CUEN_RETENCION, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTARTICA INTO :CUENTA, :ES_RETENCION, :TIPOCUEN;
        ELSE
            begin
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :CTARTICA, 2);
            CUENTA = CTARTICA;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 4);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            if (ES_RETENCION = 'S') then
                BEGIN
                VRBASE = VRTOTAL;
                SELECT PROV_RTEICA from proveedores where terc_nit = :NIT INTO :PORC;
                END
            ELSE
                BEGIN
                VRBASE = 0;
                PORC = 0;
                END
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTICA, :VRBASE, :PORC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA - VRRTICA;
            END
        END /* RTICA */
    /* RECORRA LAS CUENTAS DE EGRESOS_CONTABILIDAD */
    FOR SELECT CUEN_COD, EGCO_NIT, EGCO_PROY, EGCO_CENTRO, EGCO_CONC, EGCO_DEBITOS, EGCO_CREDITOS, EGCO_BASEM, EGCO_PORC
        FROM EGRESOS_CONTABILIDAD WHERE EGRE_ID = :IDDOC ORDER BY EGCO_ITEM
        INTO :CTABASE, :NIT, :PROY, :CENTRO, :CONC, :DEBITO, :CREDITO, :MONTOBASE, :PORC
        DO
        BEGIN
        CUENTA = NULL;
        EXECUTE PROCEDURE VALIDE_CUENTA_C (CTABASE) RETURNING_VALUES (:OK);
        IF (OK = 0) THEN
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTABASE INTO :CUENTA, :TIPOCUEN;
        ELSE
            begin
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :CTABASE, 2);
            CUENTA = CTABASE;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 4);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'N') then
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :DEBITO, :CREDITO, :MONTOBASE, :PORC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
        SUMA = SUMA + DEBITO - CREDITO;
        NROI = NROI + 1;
        END
    /* CIERRE EL COMPROBANTE CONTRA LA CUENTA DEL TERCERO O LA BASE CONSTANTE */
    if (SUMA <> 0) THEN
        BEGIN
        if (SUMA < 0) then
            BEGIN
            DEBITO = SUMA * -1;
            CREDITO = 0;
            END
        ELSE
            BEGIN
            DEBITO = 0;
            CREDITO = SUMA;
            END
        if ((BASE = 'F') or (BASE = 'T') or (BASE = 'K')) then
            BEGIN
            if (BASE = 'T') then
                CTABASE = TCTACLIEN;
            if (BASE = 'F') then
                BEGIN
                SELECT CAJA_CUENTA FROM EGRESOS E, CAJAS C
                    WHERE C.CAJA_ID = E.CAJA_ID AND EGRE_ID = :IDDOC INTO :CTABASE;
                END
            CUENTA = NULL;
            EXECUTE PROCEDURE VALIDE_CUENTA_C (CTABASE) RETURNING_VALUES (:OK);
            IF (OK = 0) THEN
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :CTABASE INTO :CUENTA, :TIPOCUEN;
            ELSE
                begin
                EXECUTE PROCEDURE ERROR (62, :IDDOC, :CTABASE, 2);
                CUENTA = CTABASE;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                /* DEBERIA RECORRER DOCUMENTO POR DOCUMENTO */
                FOR SELECT RCDE_TIPODOC, RCDE_PREFIJO, RCDE_NUMERO, RCDE_ABONO+RCDE_RTFTE+RCDE_RTIVA+RCDE_RTICA+RCDE_DTOF
                    FROM RECIBOS_CAJA_DETALLE WHERE RECA_ID = :IDDOC
                    INTO :TIPOIT, PREFIT, NUMIT, ABONOIT
                    DO
                    BEGIN
                    NUMEROIT = PREFIT || NUMIT;
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :ABONOIT, 0, 0, :NIT, :PROY, :CENTRO, NULL, :NUMEROIT, NULL, NULL, :TIPOIT, 0);
                    NROI = NROI + 1;
                    END
                END
            if (TIPOCUEN = 'N') then
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :DEBITO, :CREDITO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            END /* SUMA EN CARTERA */
        if (BASE = 'D') then
            BEGIN
            CTABASE = NULL;
            FOR SELECT EGDE_TIPODOC, EGDE_PREFIJO, EGDE_NUMERO, CUEN_COD, EGDE_ABONO, PROY_COD, CENT_COD
                FROM EGRESOS_DETALLE ED, COMPROBANTE_ENCABEZADO E, COMPROBANTE_DETALLE D
                WHERE E.enco_consec = D.enco_consec AND E.enco_tiporef = ED.egde_tipodoc AND E.enco_idref = ED.egde_iddoc AND SUBSTR(CUEN_COD,1,1) = '2' AND
                SUBSTR(CUEN_COD,1,3) <> '236' AND SUBSTR(CUEN_COD,1,4) <> '2408' AND EGRE_ID = :IDDOC
                INTO :tipoit, :PREFIT, :NUMIT, :ctabase, :suma, :proy, :centro
                DO
                BEGIN
                CUENTA = NULL;
                EXECUTE PROCEDURE VALIDE_CUENTA_C (ctabase) RETURNING_VALUES (:OK);
                IF (OK = 0) THEN
                    SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                        WHERE CUEN_COD = :CTABASE INTO :CUENTA, :TIPOCUEN;
                ELSE
                    begin
                    EXECUTE PROCEDURE ERROR (62, :IDDOC, :CTABASE, 2);
                    CUENTA = CTABASE;
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    end
                if (SUMA < 0) then
                    BEGIN
                    CREDITO = SUMA * -1;
                    DEBITO = 0;
                    END
                ELSE
                    BEGIN
                    CREDITO = 0;
                    DEBITO = SUMA;
                    END
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    /* DEBERIA RECORRER DOCUMENTO POR DOCUMENTO */
                    NUMEROIT = PREFIT || NUMIT;
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :debito, :credito, 0, 0, :NIT, :PROY, :CENTRO, NULL, :NUMEROIT, NULL, NULL, :TIPOIT, 0);
                    END
                if (TIPOCUEN = 'N') then
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :DEBITO, :CREDITO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                END /* SUMA EN CARTERA */
            END
        END
    /* recorra las cuentas adicionales */
    FOR SELECT INJC_CUENTA, INJC_BASE, INJC_PORC, INJC_VALOR, INJC_DB
        FROM INTERFAZ_CAJA_CTAS
        WHERE INCJ_ID = :IDINTER
        INTO :CTADIC, :BASEADIC, :PORCADIC, :VALORADIC, :DBADIC
        DO
        BEGIN
        if (:BASEADIC = 'TOTAL') then
            VALORADIC = VRTOTAL;
        if (:BASEADIC = 'DESCUENTO') then
            VALORADIC = VRDTO;
        if (:BASEADIC = 'RTFTE') then
            VALORADIC = VRRTFTE;
        if (:BASEADIC = 'RTIVA') then
            VALORADIC = VRRTIVA;
        if (:BASEADIC = 'RTICA') then
            VALORADIC = VRRTICA;
        MONTO = VALORADIC * PORCADIC;
        CUENTA = NULL;
        EXECUTE PROCEDURE VALIDE_CUENTA_C (CTADIC) RETURNING_VALUES (:OK);
        IF (OK = 0) THEN
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTADIC INTO :CUENTA, :TIPOCUEN;
        ELSE
            begin
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :CTADIC, 2);
            CUENTA = CTADIC;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 4);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            if (DBADIC = 'S') then
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTADIC, :CONC, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            ELSE
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTADIC, :CONC, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            END
        NROI = NROI + 1;
        END
    if (ERROR > 0) then
        VER = 'S';
    SUSPEND;
    END /* EXISTE LA INTERFAZ */
  ELSE
    BEGIN
    EXECUTE PROCEDURE ERROR (62, :IDDOC, :PREF, 1);
    ERROR = ERROR + 1;
    VER = 'S';
    SUSPEND;
    END
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE EGRESOS_SIN_CONTABILIDAD(
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    ID INTEGER,
    IDI INTEGER,
    IDC INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    ESTADO VARCHAR(20),
    ERROR INTEGER)
AS
DECLARE VARIABLE VER CHAR(2);
declare variable FECICNT VARCHAR(10);
declare variable FECFCNT VARCHAR(10);
declare variable idref INTEGER;
BEGIN /*$$IBE$$ 
EXECUTE PROCEDURE fecha_a_conta(FECINI) returning_values (FECICNT);
EXECUTE PROCEDURE fecha_a_conta(FECFIN) returning_values (FECFCNT);
FOR SELECT EGRE_ID, PREF_PRE, egre_numero FROM EGRESOS WHERE EGRE_ANULADO = 'N' AND PREF_PRE <> 'R004' AND
    EGRE_FECHA >= :FECINI AND EGRE_FECHA <= :FECFIN ORDER BY EGRE_ID INTO :ID, :PREF, :NUMERO
DO
  BEGIN
  idref = null;
  SELECT ENCO_IDREF FROM COMPROBANTE_ENCABEZADO WHERE ENCO_TIPOREF = 62 AND ENCO_FECHA >= :FECICNT AND ENCO_FECHA <= :FECFCNT and ENCO_IDREF = :ID into :idref;
  if (idref IS NULL) then
  begin
   ESTADO = 'PROCESANDO';
   SUSPEND;
   SELECT MAX(INCJ_ID) FROM INTERFAZ_CAJA WHERE PREF_PRE = :PREF AND TIDO_COD = 62 INTO :IDI;
   EXECUTE PROCEDURE CONTABIL_EGRESO (:ID, :IDI) RETURNING_VALUES (:ERROR, :VER, :IDC);
   IF (ERROR = 0) THEN
      BEGIN
      EXECUTE PROCEDURE CONTABILIZA_PENDIENTE (:IDC);
      ESTADO = 'OK';
      END
   ELSE
    ESTADO = 'ERROR';
   suspend;
  end
  END
 $$IBE$$*/ SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE EGRESOS_SIN_CONTABILIDAD(
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    ID INTEGER,
    IDI INTEGER,
    IDC INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    ESTADO VARCHAR(20),
    ERROR INTEGER)
AS
DECLARE VARIABLE VER CHAR(2);
declare variable FECICNT VARCHAR(10);
declare variable FECFCNT VARCHAR(10);
declare variable idref INTEGER;
BEGIN
EXECUTE PROCEDURE fecha_a_conta(FECINI) returning_values (FECICNT);
EXECUTE PROCEDURE fecha_a_conta(FECFIN) returning_values (FECFCNT);
FOR SELECT EGRE_ID, PREF_PRE, egre_numero FROM EGRESOS WHERE EGRE_ANULADO = 'N' AND PREF_PRE <> 'R004' AND
    EGRE_FECHA >= :FECINI AND EGRE_FECHA <= :FECFIN ORDER BY EGRE_ID INTO :ID, :PREF, :NUMERO
DO
  BEGIN
  idref = null;
  SELECT ENCO_IDREF FROM COMPROBANTE_ENCABEZADO WHERE ENCO_TIPOREF = 62 AND ENCO_FECHA >= :FECICNT AND ENCO_FECHA <= :FECFCNT and ENCO_IDREF = :ID into :idref;
  if (idref IS NULL) then
  begin
   ESTADO = 'PROCESANDO';
   SUSPEND;
   SELECT MAX(INCJ_ID) FROM INTERFAZ_CAJA WHERE PREF_PRE = :PREF AND TIDO_COD = 62 INTO :IDI;
   EXECUTE PROCEDURE CONTABIL_EGRESO (:ID, :IDI) RETURNING_VALUES (:ERROR, :VER, :IDC);
   IF (ERROR = 0) THEN
      BEGIN
      EXECUTE PROCEDURE CONTABILIZA_PENDIENTE (:IDC);
      ESTADO = 'OK';
      END
   ELSE
    ESTADO = 'ERROR';
   suspend;
  end
  END
END

^

SET TERM ; ^


/* 20090413C */
/* SI NO HAY UNIDADES ALTERNATIVAS IMPRIMIA TODO COMO ALTERNATIVA Y NO COMO PRINCIPAL */

SET TERM ^ ;

CREATE OR ALTER PROCEDURE IMPR_FACTURA(
    ID INTEGER)
RETURNS (
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    VENCE DATE,
    DIASVENCE INTEGER,
    CONTCRED CHAR(17),
    NIT VARCHAR(20),
    NOMTERCERO VARCHAR(60),
    NOMCLIENTE VARCHAR(60),
    VENDEDOR INTEGER,
    NOMVENDEDOR VARCHAR(60),
    PUNTOVTA INTEGER,
    NOMPUNTOVTA VARCHAR(30),
    CODBODEGA VARCHAR(2),
    NOMBODEGA VARCHAR(30),
    AUTORIZACION VARCHAR(20),
    DESPACHO VARCHAR(255),
    TRANSPORTADOR VARCHAR(60),
    COTIZACION VARCHAR(30),
    PEDIDO VARCHAR(30),
    REMISION VARCHAR(30),
    PACIENTE VARCHAR(20),
    NOMPACIENTE VARCHAR(60),
    COMIPORC NUMERIC(9,2),
    COMIMONTO NUMERIC(18,2),
    SUBTOTAL NUMERIC(18,2),
    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),
    EXTRA NUMERIC(18,2),
    DTOFPORC NUMERIC(9,2),
    DTOFMONTO NUMERIC(18,2),
    FECHADTO DATE,
    TOTALFAC NUMERIC(18,2),
    TOTALPAGAR NUMERIC(18,2),
    OBS BLOB SUB_TYPE 1 SEGMENT SIZE 80,
    ITEM INTEGER,
    ARTICULO VARCHAR(15),
    CODBAR VARCHAR(15),
    ARTIDES VARCHAR(60),
    DESCORTA VARCHAR(30),
    CANT NUMERIC(18,4),
    LOTE VARCHAR(15),
    VLOTE DATE,
    UNIDAD VARCHAR(8),
    CAJAS NUMERIC(18,4),
    FACTOR NUMERIC(18,4),
    LISTAPR INTEGER,
    REFITEM VARCHAR(60),
    BODITEM VARCHAR(2),
    STAND VARCHAR(15),
    PRUNIT NUMERIC(18,2),
    DTOITPORC NUMERIC(9,2),
    DTOITMONTO NUMERIC(18,2),
    PRNETO NUMERIC(18,2),
    PRNETOSINIVA NUMERIC(18,2),
    DTOIT1 NUMERIC(9,2),
    DTOIT2 NUMERIC(9,2),
    DTOIT3 NUMERIC(9,2),
    IVAPORC NUMERIC(9,2),
    IVAITMONTO NUMERIC(18,2),
    CONSUMO NUMERIC(18,2),
    SUBTOTIT NUMERIC(18,2),
    TOTAL NUMERIC(18,2),
    CODIGOCL VARCHAR(20),
    ZONACOD VARCHAR(2),
    ZONANOM VARCHAR(60),
    DV CHAR(1),
    DIRECCION VARCHAR(60),
    CIUDAD VARCHAR(40),
    TELEFONO VARCHAR(40),
    CONTACTO VARCHAR(60),
    FAX VARCHAR(25),
    CEL VARCHAR(25),
    GRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    SUBGRUPO VARCHAR(3),
    NOMSUBG VARCHAR(30),
    MARCA VARCHAR(3),
    NOMMARCA VARCHAR(30),
    PESO NUMERIC(18,4),
    ANCHO NUMERIC(18,4),
    ALTO NUMERIC(18,4),
    LARGO NUMERIC(18,4),
    SUMA1 NUMERIC(18,2),
    SUMA2 NUMERIC(18,2),
    SUMA3 NUMERIC(18,2),
    IVA1 NUMERIC(18,2),
    IVA2 NUMERIC(18,2),
    IVA3 NUMERIC(18,2),
    SUMAEX NUMERIC(18,2),
    SUMAGR NUMERIC(18,2),
    TOTCONSUMO NUMERIC(18,2),
    DTOIT1M NUMERIC(18,2),
    DTOIT2M NUMERIC(18,2),
    DTOIT3M NUMERIC(18,2),
    TOTCAJAS NUMERIC(18,2),
    VEHICULO VARCHAR(8),
    RECIBIDO NUMERIC(18,2),
    CAMBIO NUMERIC(18,2),
    HORA TIME,
    FORMAPAGO1 VARCHAR(30),
    MONTOPAGO1 NUMERIC(18,2),
    FORMAPAGO2 VARCHAR(30),
    MONTOPAGO2 NUMERIC(18,2),
    FORMAPAGO3 VARCHAR(30),
    MONTOPAGO3 NUMERIC(18,2),
    PUNTOS INTEGER,
    PUNTOSACUM INTEGER,
    PUNTOSVENC INTEGER,
    FECPTOS DATE,
    OBSITEM BLOB SUB_TYPE 1 SEGMENT SIZE 80,
    SUCUR VARCHAR(10),
    ALTERNATIVAS NUMERIC(18,4),
    PRINCIPALES NUMERIC(18,4))
AS
DECLARE VARIABLE IMPTOS CHAR(1);
DECLARE VARIABLE TARIFA INTEGER;
declare variable DEVUELTO NUMERIC(18,2);
declare variable ORDENCOD CHAR(2);
declare variable IMPRDEV CHAR(2);
declare variable IMPR CHAR(1);
declare variable ITEMFP INTEGER;
declare variable FORMAP VARCHAR(30);
declare variable MONTOP NUMERIC(18,2);
declare variable ICOINC CHAR(2);
declare variable DTOITM1 NUMERIC(18,2);
declare variable DTOITM2 NUMERIC(18,2);
declare variable DTOITM3 NUMERIC(18,2);
declare variable DTOITE3 CHAR(2);
declare variable SUMDTOIT NUMERIC(18,2);
declare variable AUTORET VARCHAR(10);
declare variable FAUTORET DATE;
declare variable FACTCANT NUMERIC(18,4);
BEGIN
execute procedure lee_configuracion('FACTURACION', 'ARTICULOS', 'IMPOCONSUMO INCLUIDO EN EL PRECIO BASE DE VENTA ANTES DE IVA') returning_values (icoinc);
execute procedure lee_configuracion('FACTURACION', 'FACTURAS', 'COLUMNAS DE DESCUENTO POR ITEM ADICIONALES') returning_values (DTOITE3);
SELECT F.PREF_PRE, FACT_NUMERO, FACT_FECHA, FACT_VENCE, F.BODE_COD, BODE_NOM, F.TERC_NIT, FACT_NOMCLIENTE, F.VEND_COD, VEND_NOMBRE, F.PTVT_ID, PTVT_NOM,
    AUTO_NUMERO, FACT_DESPACHO, FACT_TRANSP, FACT_COTIZACI, FACT_PEDIDO, FACT_REMISION, FACT_COMIPORC, FACT_COMIMONTO, FACT_IVAINC, 
    FACT_DTOPOR, FACT_DTOMONTO, FACT_ADICIONAL, FACT_IVAMONTO, FACT_RTFTEPOR, FACT_RTFTEMONTO, FACT_RTIVAPOR, FACT_RTIVAMONTO, FACT_RTICAPOR, FACT_RTICAMONTO, FACT_EXTRA, FACT_DTOFPOR, FACT_DTOFMONTO, FACT_DTOFFECHA, FACT_TOTAL,
    TERC_DIR, TERC_CIU, TERC_TEL, TERC_CONTACTO, TERC_FAX, TERC_DV, TERC_CEL, FACT_DTOIT1, FACT_DTOIT2, FACT_DTOIT3,
    FACT_OBS, VEHI_COD, /*FACT_NROCOPIA,*/ FACT_RECIBIDO, FACT_SUCURSAL, FACT_DETCLI, FACT_DETCLINOM, TERC_NOM
    FROM FACTURAS F, BODEGA B, VENDEDORES V, PUNTO_VENTA P, TERCEROS T
    WHERE F.BODE_COD = B.BODE_COD AND F.VEND_COD = V.VEND_COD AND F.PTVT_ID = P.PTVT_ID AND F.TERC_NIT = T.TERC_NIT AND F.FACT_ID = :ID
    into :PREF, :NUMERO, :FECHA, :VENCE, :CODBODEGA, :NOMBODEGA, :NIT, :NOMTERCERO, :VENDEDOR, :NOMVENDEDOR, :PUNTOVTA, :NOMPUNTOVTA,
    :AUTORIZACION, :DESPACHO, :TRANSPORTADOR, :COTIZACION, :PEDIDO, :REMISION, :COMIPORC, :COMIMONTO, :IMPTOS,
    :DTOPORC, :DTOMONTO, :ADICIONAL, :IVAMONTO, :RTEFTEPORC, :RTEFTEMONTO, :RTEIVAPORC, :RTEIVAMONTO, :RTEICAPORC, :RTEICAMONTO, :EXTRA, :DTOFPORC, :DTOFMONTO, :FECHADTO, :TOTALFAC,
    :DIRECCION, :CIUDAD, :TELEFONO, :CONTACTO, :FAX, :DV, :CEL, :dtoit1m, :dtoit2m, :dtoit3m,
    :OBS, :VEHICULO,/* :NROCOPIA,*/ :RECIBIDO, :SUCUR, :paciente, :nompaciente, :nomcliente;

/* ACUMULE LOS PUNTOS, SE HACE ACA POR SER POSTERIOR AL DETALLE */
EXECUTE PROCEDURE acumula_puntos_cliente (31, :id, :nit, :fecha) returning_values (:PUNTOS);
EXECUTE PROCEDURE consulta_puntos_cliente (:id, :nit, :fecha) returning_values (:puntos, :puntosacum, :puntosvenc, :fecptos);
if (DTOIT1M IS NULL) then
    DTOIT1M = 0;
if (DTOIT2M IS NULL) then
    DTOIT2M = 0;
if (DTOIT3M IS NULL) then
    DTOIT3M = 0;
SELECT CLIE_COD, C.ZONA_COD, ZONA_NOM
    FROM CLIENTES C, ZONAS Z
    WHERE TERC_NIT = :NIT AND C.ZONA_COD = Z.ZONA_COD
    INTO :CODIGOCL, :ZONACOD, :ZONANOM;
SELECT CLSU_DIR, CLSU_CIUDAD, CLSU_TEL FROM CLIENTE_SUCURSALES WHERE TERC_NIT = :NIT AND CLCU_COD = :SUCUR
    INTO :DIRECCION, :CIUDAD, :TELEFONO;
DIASVENCE = VENCE - FECHA;
if (DIASVENCE > 0) then
    CONTCRED = 'CREDITO ' || CAST(DIASVENCE AS VARCHAR(3)) || ' DIAS';
ELSE
    CONTCRED = 'CONTADO';
SUBTOTAL = TOTALFAC - EXTRA - IVAMONTO - ADICIONAL + DTOMONTO;
if (DTOITE3 = 'SI') then
    BEGIN
    SELECT SUM(FADE_DTOMONTO) FROM FACTURAS_DETALLE WHERE FACT_ID = :id INTO :sumdtoit;
    SUBTOTAL = SUBTOTAL + sumdtoit + dtoit1m + dtoit2m + dtoit3m;
    END
EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'FECHA AUTORETENEDOR NO DESCONTAR RETENCIONES DEL SALDO PERO SI CONTABILIZARLAS') returning_values (AUTORET);
if (AUTORET <> '') then
    FAUTORET = CAST(AUTORET AS DATE);
else
    FAUTORET = '9999/12/31';
if (FECHA > fautoret) then
    TOTALPAGAR = TOTALFAC - RTEIVAMONTO - RTEICAMONTO;
ELSE
    TOTALPAGAR = TOTALFAC - RTEFTEMONTO - RTEIVAMONTO - RTEICAMONTO;
if (RECIBIDO <> 0) then
    CAMBIO = RECIBIDO - totalpagar;
ELSE
    CAMBIO = 0;
SUMAEX = 0;
SUMA1 = 0;
SUMA2 = 0;
SUMA3 = 0;
IVA1 = 0;
IVA2 = 0;
IVA3 = 0;
TOTCONSUMO = 0;
MONTOPAGO1 = 0;
SELECT MAX(AUDI_HORA) FROM AUDITORIA WHERE TIDO_COD = 31 AND AUDI_IDDOC = :ID AND AUDI_OPER = 'I' INTO :HORA;
/* AHORA LAS FORMAS DE PAGO, BUSQUE EL ABONO DE HOY A LA FACTURA */
ITEMFP = 1;
MONTOPAGO1 = 0;
MONTOPAGO2 = 0;
MONTOPAGO3 = 0;
FOR SELECT FOPA_NOM, RCPA_MONTO FROM RECIBOS_CAJA_PAGO P, FORMAS_PAGO F, RECIBOS_CAJA R, RECIBOS_CAJA_DETALLE D
    WHERE R.RECA_ID = P.RECA_ID AND R.RECA_ID = D.RECA_ID AND P.FOPA_ID = F.FOPA_ID AND RECA_FECHA = :FECHA AND RCDE_TIPODOC = 31 AND RCDE_IDDOC = :ID
    INTO :formap, :MONTOP
    DO
    BEGIN
    if (ITEMFP = 1) then
        BEGIN
        FORMAPAGO1 = FORMAP;
        MONTOPAGO1 = MONTOP;
        END
    if (ITEMFP = 2) then
        BEGIN
        FORMAPAGO2 = FORMAP;
        MONTOPAGO2 = MONTOP;
        END
    if (ITEMFP = 3) then
        BEGIN
        FORMAPAGO3 = FORMAP;
        MONTOPAGO3 = MONTOP;
        END
    ITEMFP = ITEMFP + 1;
    END
EXECUTE PROCEDURE lee_configuracion ('FACTURACION','DOCUMENTOS','ORDENAR ITEMS POR CODIGO DE ARTICULO') returning_values (:ORDENCOD);
EXECUTE PROCEDURE lee_configuracion ('FACTURACION','POS', 'IMPRIMIR DEVOLUCIONES DE ARTICULOS NEGATIVOS') returning_values (:imprdev);
totcajas = 0;
if (ORDENCOD = 'SI') then
    BEGIN
    FOR SELECT FADE_ITEM, D.ARTI_COD, FADE_CODBAR, SUBSTR(FADE_DESC,1,60), ARTI_DESCORTA, FADE_CANT, FADE_UNIDAD, FADE_FACTOR, BODE_COD, FADE_LOTE, LIPR_COD, FADE_PRUNIT, FADE_DTOPORC, FADE_DTOMONTO, FADE_IVAPORC, FADE_IVAMONTO, FADE_CONSUMO, FADE_TOTAL, FADE_REFERENCIA,
        GRUP_COD, SUBG_COD, MARC_COD, ARTI_PESO, ARTI_ANCHO, ARTI_ALTO, ARTI_LARGO, TAIV_COD, FADE_DEVUELTO, FADE_OBS, FADE_DTO1, FADE_DTO2, FADE_DTO3, FADE_DTOM1, FADE_DTOM2, FADE_DTOM3, FADE_CAJAS
        FROM FACTURAS_DETALLE D, ARTICULO A
        WHERE D.ARTI_COD = A.ARTI_COD AND D.FACT_ID = :ID
        ORDER BY D.ARTI_COD
        INTO :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :DESCORTA, :CANT, :UNIDAD, :FACTOR, :BODITEM, :LOTE, :LISTAPR, :PRUNIT, :DTOITPORC, :DTOITMONTO, :IVAPORC, :IVAITMONTO, :CONSUMO, :TOTAL, :refitem,
        :GRUPO, :SUBGRUPO, :MARCA, :PESO, :ANCHO, :ALTO, :LARGO, :TARIFA, :devuelto, :obsitem, :dtoit1, :dtoit2, :dtoit3, :dtoitm1, :dtoitm2, :dtoitm3, :cajas
        DO
          BEGIN
          if (ARTICULO = CODBAR) then
            SELECT FIRST 1 COBA_COD FROM barras_articulo WHERE ARTI_COD = :articulo INTO :CODBAR;
          if (IMPRDEV <> 'SI') then
            BEGIN
            if ((CANT >= 0) AND (DEVUELTO = 0)) then
                IMPR = 'S';
            ELSE
                IMPR = 'N'; /* ES DEVOLUCION */
            END
          ELSE
            IMPR = 'S';
          if (IMPR = 'S') then
            BEGIN
            prneto = PRUNIT - DTOITMONTO - dtoitm1 - dtoitm2 - dtoitm3;
            if (IMPTOS = 'S') then
                if (cant <> 0) then
                    prnetosiniva = PRUNIT - DTOITMONTO - ((IVAITMONTO+CONSUMO) / CANT) - dtoitm1 - dtoitm2 - dtoitm3;
                else
                    prnetosiniva = PRUNIT - DTOITMONTO - dtoitm1 - dtoitm2 - dtoitm3;
            ELSE
                prnetosiniva = PRUNIT - DTOITMONTO - dtoit1m - dtoit2m - dtoit3m;
            if (ICOINC = 'SI') then
                SUBTOTIT = TOTAL - IVAITMONTO;
            else
                SUBTOTIT = TOTAL - IVAITMONTO - CONSUMO;
            TOTCONSUMO = TOTCONSUMO + CONSUMO;
            SELECT LOTE_VENCE FROM LOTES WHERE LOTE_NRO = :lote AND ARTI_COD = :ARTICULO AND BODE_COD = :boditem INTO :vlote;
            if ((REFITEM <> '.t') or (REFITEM IS NULL)) then
                BEGIN
                /* NO SUME LOS ENSAMBLES */
                if (IVAPORC = 0) then
                    SUMAEX = SUMAEX + TOTAL;
                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;
                END
            if (ANCHO IS NULL) then
                ANCHO = 0;
            if (ALTO IS NULL) then
                ALTO = 0;
            if (LARGO IS NULL) then
                LARGO = 0;
            if (PESO IS NULL) then
                PESO = 0;
            PESO = (PESO / 1000) * CANT * FACTOR;
            totcajas = totcajas + cajas;
            if (substr(ARTICULO,1,2) = '.t') then
                BEGIN
                REFITEM = '';
                TOTAL = 0;
                SUBTOTIT = 0;
                END
            SELECT STAND_COD FROM STANDS WHERE ARTI_COD = :ARTICULO AND STAND_BODEGA = :boditem INTO :stand;
            factcant = NULL;
            SELECT FIRST 1 UNAR_FACCAN FROM unidad_articulo WHERE ARTI_COD = :articulo INTO :factcant;
            if (factcant IS NULL) then
                factcant = 1;
            if (factcant = 1) then
                BEGIN
                ALTERNATIVAS = 0;
                PRINCIPALES = (CANT * FACTOR);
                END
            ELSE
                BEGIN
                ALTERNATIVAS = FLOOR(CANT * factor / factcant);
                PRINCIPALES = (CANT * FACTOR) - (alternativas * factcant);
                END
            SUSPEND;
            END
          END
    END
ELSE
    BEGIN
    FOR SELECT FADE_ITEM, D.ARTI_COD, FADE_CODBAR, SUBSTR(FADE_DESC,1,60), ARTI_DESCORTA, FADE_CANT, FADE_UNIDAD, FADE_FACTOR, BODE_COD, FADE_LOTE, LIPR_COD, FADE_PRUNIT, FADE_DTOPORC, FADE_DTOMONTO, FADE_IVAPORC, FADE_IVAMONTO, FADE_CONSUMO, FADE_TOTAL, FADE_REFERENCIA,
        GRUP_COD, SUBG_COD, MARC_COD, ARTI_PESO, ARTI_ANCHO, ARTI_ALTO, ARTI_LARGO, TAIV_COD, FADE_DEVUELTO, FADE_OBS, FADE_DTO1, FADE_DTO2, FADE_DTO3, FADE_DTOM1, FADE_DTOM2, FADE_DTOM3, FADE_CAJAS
        FROM FACTURAS_DETALLE D, ARTICULO A
        WHERE D.ARTI_COD = A.ARTI_COD AND D.FACT_ID = :ID
        ORDER BY FADE_ITEM
        INTO :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :DESCORTA, :CANT, :UNIDAD, :FACTOR, :BODITEM, :LOTE, :LISTAPR, :PRUNIT, :DTOITPORC, :DTOITMONTO, :IVAPORC, :IVAITMONTO, :CONSUMO, :TOTAL, :refitem,
        :GRUPO, :SUBGRUPO, :MARCA, :PESO, :ANCHO, :ALTO, :LARGO, :TARIFA, :devuelto, :obsitem, :dtoit1, :dtoit2, :dtoit3, :dtoitm1, :dtoitm2, :dtoitm3, :cajas
        DO
          BEGIN
          if (IMPRDEV <> 'SI') then
            BEGIN
            if ((CANT >= 0) AND (DEVUELTO = 0)) then
                IMPR = 'S';
            ELSE
                IMPR = 'N'; /* ES DEVOLUCION */
            END
          ELSE
            IMPR = 'S';
          if (IMPR = 'S') then
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :GRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :MARCA INTO NOMMARCA;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :SUBGRUPO AND GRUP_COD = :GRUPO INTO :NOMSUBG;
            prneto = PRUNIT - DTOITMONTO - dtoitm1 - dtoitm2 - dtoitm3;
            if (IMPTOS = 'S') then
                if (cant <> 0) then
                    prnetosiniva = PRUNIT - DTOITMONTO - ((IVAITMONTO+CONSUMO) / CANT) - dtoit1m - dtoit2m - dtoit3m;
                else
                    prnetosiniva = PRUNIT - DTOITMONTO - dtoitm1 - dtoitm2 - dtoitm3;
            ELSE
                prnetosiniva = PRUNIT - DTOITMONTO - dtoitm1 - dtoitm2 - dtoitm3;
            if (ICOINC = 'SI') then
                SUBTOTIT = TOTAL - IVAITMONTO;
            else
                SUBTOTIT = TOTAL - IVAITMONTO - CONSUMO;
            TOTCONSUMO = TOTCONSUMO + CONSUMO;
            SELECT LOTE_VENCE FROM LOTES WHERE LOTE_NRO = :lote AND ARTI_COD = :ARTICULO AND BODE_COD = :boditem INTO :vlote;
            if ((REFITEM <> '.t') or (REFITEM IS NULL)) then
                BEGIN
                /* NO SUME LOS ENSAMBLES */
                if (IVAPORC = 0) then
                    SUMAEX = SUMAEX + TOTAL;
                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;
                END
            if (ANCHO IS NULL) then
                ANCHO = 0;
            if (ALTO IS NULL) then
                ALTO = 0;
            if (LARGO IS NULL) then
                LARGO = 0;
            if (PESO IS NULL) then
                PESO = 0;
            PESO = (PESO / 1000)* CANT * FACTOR;
            totcajas = totcajas + cajas;
            if (substr(ARTICULO,1,2) = '.t') then
                BEGIN
                REFITEM = '';
                TOTAL = 0;
                SUBTOTIT = 0;
                END
            SELECT STAND_COD FROM STANDS WHERE ARTI_COD = :ARTICULO AND STAND_BODEGA = :boditem INTO :stand;
            factcant = NULL;
            SELECT FIRST 1 UNAR_FACCAN FROM unidad_articulo WHERE ARTI_COD = :articulo INTO :factcant;
            if (factcant IS NULL) then
                factcant = 1;
            ALTERNATIVAS = FLOOR(CANT * factor / factcant);
            PRINCIPALES = (CANT * FACTOR) - (alternativas * factcant);
            SUSPEND;
            END
          END
    END
END
^

SET TERM ; ^


/* 20090414 */
/* Interfaz por documento no tenia de donde sacar la cuenta de los anticipos se agrego como configuración */

INSERT INTO CONFIGURACION (CONF_MODULO, CONF_CATEGORIA, CONF_PROPIEDAD, CONF_VALOR, CONF_POSIBLES, CONF_AYUDA) VALUES ('CAJA', 'RECIBOS', 'CUENTA CONTABLE PARA LOS ANTICIPOS DE CLIENTES SI LA INTERFAZ ES POR DOCUMENTO', '280505', '', 'Indique la cuenta contable donde se llevarán los anticipos de clientes en caso que la interfaz de recibos se defina por Documento');
commit work;

SET TERM ^ ;

CREATE OR ALTER PROCEDURE CONTABIL_RECICAJA(
    IDDOC INTEGER,
    IDINTER INTEGER)
RETURNS (
    ERROR INTEGER,
    VER CHAR(1),
    IDC INTEGER)
AS
declare variable PREF VARCHAR(4);
declare variable NUM VARCHAR(6);
declare variable FECAUX DATE;
declare variable FECHA CHAR(8);
declare variable CONC CHAR(120);
declare variable VRDTO NUMERIC(18, 2);
declare variable VRRTFTE NUMERIC(18, 2);
declare variable VRRTIVA NUMERIC(18, 2);
declare variable VRRTICA NUMERIC(18, 2);
declare variable VRTOTAL NUMERIC(18, 2);
declare variable TIPOCOMP VARCHAR(3);
declare variable PREFCONT VARCHAR(4);
declare variable BASE CHAR(1);
declare variable CTABASE VARCHAR(20);
declare variable CAJA CHAR(1);
declare variable CTACAJA VARCHAR(20);
declare variable RTFTE CHAR(1);
declare variable CTARTFTE VARCHAR(20);
declare variable RTIVA CHAR(1);
declare variable CTARTIVA VARCHAR(20);
declare variable RTICA CHAR(1);
declare variable CTARTICA VARCHAR(20);
declare variable DTO CHAR(1);
declare variable CTADTO VARCHAR(20);
declare variable EXISTE CHAR(1);
declare variable CUENTA VARCHAR(20);
declare variable MONTO NUMERIC(18,2);
declare variable ES_RETENCION CHAR(1);
declare variable TIPOCUEN CHAR(1);
declare variable NIT VARCHAR(20);
declare variable PROY VARCHAR(4);
declare variable CENTRO VARCHAR(4);
declare variable DEBITO NUMERIC(18,2);
declare variable CREDITO NUMERIC(18,2);
declare variable NROI INTEGER;
declare variable SUMA NUMERIC(18,2);
declare variable TCTACLIEN VARCHAR(20);
declare variable TCTARTFTE VARCHAR(20);
declare variable TCTARTIVA VARCHAR(20);
declare variable TCTARTICA VARCHAR(20);
declare variable TIPOIT INTEGER;
declare variable IDIT INTEGER;
declare variable PREFIT VARCHAR(4);
declare variable NUMIT VARCHAR(6);
declare variable NUMEROIT VARCHAR(10);
declare variable ABONOIT NUMERIC(18,2);
declare variable CTADIC VARCHAR(20);
declare variable BASEADIC VARCHAR(20);
declare variable PORCADIC NUMERIC(5,2);
declare variable VALORADIC NUMERIC(18,2);
declare variable DBADIC CHAR(1);
declare variable ANULADO CHAR(1);
declare variable VRBASE NUMERIC(18,2);
declare variable PORC numeric(9,2);
declare variable OK INTEGER;
declare variable CRUCES NUMERIC(18,2);
declare variable VRCAJA NUMERIC(18,2);
declare variable DIFCAMBIO NUMERIC(18,2);
declare variable CTADIF VARCHAR(20);
declare variable PROVID INTEGER;
declare variable RTFTEC NUMERIC(18,2);
declare variable RTIVAC NUMERIC(18,2);
declare variable RTICAC NUMERIC(18,2);
declare variable RTFTER CHAR(1);
declare variable CTARTFTER VARCHAR(20);
declare variable RTIVAR CHAR(1);
declare variable CTARTIVAR VARCHAR(20);
declare variable RTICAR CHAR(1);
declare variable CTARTICAR VARCHAR(20);
BEGIN
ERROR = 0;
/* BUSQUE LA INTERFACE */
EXISTE = 'N';
SELECT 'S', TICO_COD, PRCO_PRE, INCJ_BASE, INCJ_DTOPP, INCJ_RTFTE, INCJ_RTIVA, INCJ_RTICA, INCJ_CAJA, INCJ_CTABASE, INCJ_CTADTO, INCJ_CTARTFTE, INCJ_CTARTIVA, INCJ_CTARTICA, INCJ_CTACAJA, INCJ_CONFIRMAR
    FROM INTERFAZ_CAJA
    WHERE INCJ_ID = :IDINTER
    INTO :EXISTE, :TIPOCOMP, :PREFCONT, :BASE, :DTO, :RTFTE, :RTIVA, :RTICA, :CAJA, :CTABASE, :CTADTO, :CTARTFTE, :CTARTIVA, :CTARTICA, :CTACAJA, :VER;
if (EXISTE = 'S') then
  BEGIN
  /* BORRE LA CONTABILIZACION ANTERIOR */
  OK = 0;
  FOR SELECT CNTB_ID FROM CONTABILIZACION WHERE CNTB_TIPOREF = 61 AND CNTB_IDREF = :IDDOC INTO :OK DO
    BEGIN
    DELETE FROM CONTABILIZACION_DET WHERE CNTB_ID = :OK;
    DELETE FROM CONTABILIZACION WHERE CNTB_ID = :OK;
    END
  /* TRAIGA EL ENCABEZADO DEL RECIBO */
  SELECT PREF_PRE, RECA_NUMERO, RECA_FECHA, R.TERC_NIT, RECA_CONC, RECA_DTOF, RECA_MONTO, RECA_RTFTEMONTO, RECA_RTIVAMONTO, RECA_RTICAMONTO, TERC_CTARTFTE, TERC_CTARTIVA, TERC_CTARTICA, TERC_CTACLIENTE, RECA_ANULADO, RECA_PROVID
    FROM RECIBOS_CAJA R, TERCEROS T
    WHERE RECA_ID = :IDDOC AND R.TERC_NIT = T.TERC_NIT
    INTO :PREF, :NUM, :FECAUX, :NIT, :CONC, :VRDTO, :VRTOTAL, :VRRTFTE, :VRRTIVA, :VRRTICA, :TCTARTFTE, TCTARTIVA, TCTARTICA, TCTACLIEN, :ANULADO, :PROVID;
  if (ANULADO = 'N') then
    BEGIN
    SELECT PREF_CENTRO, PREF_PROY FROM PREFIJOS
        WHERE PREF_PRE = :PREF AND TIDO_COD = 61 INTO :CENTRO, :PROY;
    EXECUTE PROCEDURE FECHA_A_CONTA(:FECAUX) returning_values (:FECHA);
    /* REGISTRE EL ENCABEZADO CONTABLE */
    IDC = GEN_ID(ID_CONTABILIZA, 1);
    INSERT INTO CONTABILIZACION (CNTB_ID, CNTB_TIPOCOMP, CNTB_PREFCNT, CNTB_NUMERO, CNTB_FECHA, CNTB_CONCEPTO, CNTB_REF, CNTB_TIPOREF, CNTB_IDREF, CNTB_PREFREF, CNTB_NUMREF, CNTB_PROCESADO)
        VALUES (:IDC, :TIPOCOMP, :PREFCONT, :NUM, :FECHA, :CONC, '', 61, :IDDOC, :PREF, :NUM, 'N');
    NROI = 0;
    SUMA = 0;
    /* SUME LOS CRUCES PARA LLEVARLOS A LA CUENTA X PAGAR Y RESTAR DE LA CAJA */
    SELECT SUM(RCCR_ABONO) FROM RECIBOS_CAJA_CRUCEC WHERE RECA_ID = :iddoc INTO :CRUCES;
    if (CRUCES IS NULL) then
        CRUCES = 0;
    VRCAJA = VRTOTAL - CRUCES;
    IF ((CAJA = 'K')) THEN
        BEGIN
        if (VRCAJA <> 0) then
            BEGIN
            CUENTA = NULL;
            EXECUTE PROCEDURE VALIDE_CUENTA_C (CTACAJA) RETURNING_VALUES (:OK);
            IF (OK = 0) THEN
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :CTACAJA INTO :CUENTA, :TIPOCUEN;
            ELSE
                begin
                EXECUTE PROCEDURE ERROR (61, :IDDOC, :CTACAJA, 2);
                CUENTA = CTACAJA;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERROR (61, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                EXECUTE PROCEDURE ERROR (61, :IDDOC, :CUENTA, 4);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                IF (VRCAJA > 0) THEN
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRCAJA, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    SUMA = SUMA + VRCAJA;
                    END
                ELSE   
                    BEGIN                     
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                       VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, ABS(:VRCAJA), 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    SUMA = SUMA + VRCAJA;
                    END
                NROI = NROI + 1;
                END
            END /* VRCAJA <> 0 */
        END /* CAJA CONSTANTE */
    IF ((CAJA = 'F')) THEN
        BEGIN
        /* AGRUPE LAS CUENTAS DE LAS FORMAS DE PAGO */
        FOR SELECT MAX(FOPA_CTACONTA), SUM(RCPA_MONTO)
            FROM formas_pago F, recibos_caja_pago R
            WHERE R.RECA_ID = :IDDOC AND R.FOPA_ID = F.FOPA_ID
            GROUP BY FOPA_CTACONTA
            INTO :CTACAJA, :MONTO
        DO
            BEGIN
            if (MONTO <> 0) then
                BEGIN
                CUENTA = NULL;
                EXECUTE PROCEDURE VALIDE_CUENTA_C (CTACAJA) RETURNING_VALUES (:OK);
                IF (OK = 0) THEN
                    SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                        WHERE CUEN_COD = :CTACAJA INTO :CUENTA, :TIPOCUEN;
                ELSE
                    begin
                    EXECUTE PROCEDURE ERROR (61, :IDDOC, :CTACAJA, 2);
                    CUENTA = CTACAJA;
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (61, :IDDOC, :CUENTA, 3);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (61, :IDDOC, :CUENTA, 4);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    IF (MONTO > 0) THEN
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        SUMA = SUMA + MONTO;
                        END
                    ELSE
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, abs(:MONTO), 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        SUMA = SUMA + MONTO;
                        END
                    NROI = NROI + 1;
                    END
                END /* MONTO <> 0 */
            END /* DO FORMA_PAGO */
        END /* CAJA = F */
    if (DTO = 'K') then /* DTO EN CTA CONSTANTE */
        BEGIN
        if (VRDTO <> 0) then
            BEGIN
            CUENTA = NULL;
            EXECUTE PROCEDURE VALIDE_CUENTA_C (CTADTO) RETURNING_VALUES (:OK);
            IF (OK = 0) THEN
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :CTADTO INTO :CUENTA, :TIPOCUEN;
            ELSE
                begin
                EXECUTE PROCEDURE ERROR (61, :IDDOC, :CTADTO, 2);
                CUENTA = CTADTO;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERROR (61, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                EXECUTE PROCEDURE ERROR (61, :IDDOC, :CUENTA, 4);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRDTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA + VRDTO;
                END
            END /* VRDTO <> 0 */
        END /* DTO EN CTA CONSTANTE */

    /* LA DIFERENCIA EN CAMBIO */
    SELECT SUM(RCDE_DIFCAMBIO) FROM recibos_caja_detalle WHERE RECA_ID = :iddoc INTO :DIFCAMBIO;
    IF ((DIFCAMBIO IS NOT NULL) AND (DIFCAMBIO <> 0)) THEN
        BEGIN
        if (DIFCAMBIO > 0) then
            execute procedure lee_configuracion('GENERAL','GENERAL','CUENTA DE INGRESO POR DIFERENCIA EN CAMBIO PARA OPERACIONES EN OTRA MONEDA') returning_values (:ctadif);
        else
            execute procedure lee_configuracion('GENERAL','GENERAL','CUENTA DE GASTO POR DIFERENCIA EN CAMBIO PARA OPERACIONES EN OTRA MONEDA') returning_values (:ctadif);
        CUENTA = NULL;
        EXECUTE PROCEDURE VALIDE_CUENTA_C (ctadif) RETURNING_VALUES (:OK);
        IF (OK = 0) THEN
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :ctadif INTO :CUENTA, :TIPOCUEN;
        ELSE
            begin
            EXECUTE PROCEDURE ERROR (61, :IDDOC, :ctadif, 2);
            CUENTA = ctadif;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERROR (61, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERROR (61, :IDDOC, :CUENTA, 4);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            if (DIFCAMBIO > 0) then
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :difcambio, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            else
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', ABS(:difcambio), 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA - difcambio;
            END
        END
    /* RETENCION FUENTE */
    if ((RTFTE = 'T') or (RTFTE = 'K')) then
      if (VRRTFTE <> 0) then
        BEGIN
        if (RTFTE = 'T') then
            CTARTFTE = TCTARTFTE;
        CUENTA = NULL;
        EXECUTE PROCEDURE VALIDE_CUENTA_C (CTARTFTE) RETURNING_VALUES (:OK);
        IF (OK = 0) THEN
            SELECT CUEN_COD, CUEN_RETENCION, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTARTFTE INTO :CUENTA, :ES_RETENCION, :TIPOCUEN;
        ELSE
            begin
            EXECUTE PROCEDURE ERROR (61, :IDDOC, :CTARTFTE, 2);
            CUENTA = CTARTFTE;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERROR (61, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERROR (61, :IDDOC, :CUENTA, 4);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            if (ES_RETENCION = 'S') then
                BEGIN
                VRBASE = VRTOTAL + VRDTO + vrrtfte + vrrtiva + vrrtica;
                SELECT CLIE_rtefte from clientes where terc_nit = :NIT INTO :PORC;
                END
            ELSE
                BEGIN
                VRBASE = 0;
                PORC = 0;
                END
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :VRBASE, :PORC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTFTE;
            END
        END /* RTFTE */
    /* RETENCION IVA */
    if ((RTIVA = 'T') or (RTIVA = 'K')) then
      if (VRRTIVA <> 0) then
        BEGIN
        if (RTIVA = 'T') then
            CTARTIVA = TCTARTIVA;
        CUENTA = NULL;
        EXECUTE PROCEDURE VALIDE_CUENTA_C (CTARTIVA) RETURNING_VALUES (:OK);
        IF (OK = 0) THEN
            SELECT CUEN_COD, CUEN_RETENCION, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTARTIVA INTO :CUENTA, :ES_RETENCION, :TIPOCUEN;
        ELSE
            begin
            EXECUTE PROCEDURE ERROR (61, :IDDOC, :CTARTIVA, 2);
            CUENTA = CTARTIVA;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERROR (61, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERROR (61, :IDDOC, :CUENTA, 4);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            if (ES_RETENCION = 'S') then
                BEGIN
                VRBASE = VRTOTAL + VRDTO + vrrtfte + vrrtiva + vrrtica;
                SELECT CLIE_RTEIVA from clientes where terc_nit = :NIT INTO :PORC;
                END
            ELSE
                BEGIN
                VRBASE = 0;
                PORC = 0;
                END
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTIVA, 0, :VRBASE, :PORC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTIVA;
            END
        END /* RTIVA */
    /* RETENCION DE ICA */
    if ((RTICA = 'T') or (RTICA = 'K')) then
      if (VRRTICA <> 0) then
        BEGIN
        if (RTICA = 'T') then
            CTARTICA = TCTARTICA;
        CUENTA = NULL;
        EXECUTE PROCEDURE VALIDE_CUENTA_C (CTARTICA) RETURNING_VALUES (:OK);
        IF (OK = 0) THEN
            SELECT CUEN_COD, CUEN_RETENCION, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTARTICA INTO :CUENTA, :ES_RETENCION, :TIPOCUEN;
        ELSE
            begin
            EXECUTE PROCEDURE ERROR (61, :IDDOC, :CTARTICA, 2);
            CUENTA = CTARTICA;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERROR (61, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERROR (61, :IDDOC, :CUENTA, 4);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            if (ES_RETENCION = 'S') then
                BEGIN
                VRBASE = VRTOTAL + VRDTO + vrrtfte + vrrtiva + vrrtica;
                SELECT CLIE_RTEICA from clientes where terc_nit = :NIT INTO :PORC;
                END
            ELSE
                BEGIN
                VRBASE = 0;
                PORC = 0;
                END
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTICA, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTICA;
            END
        END /* RTICA */
    /* CRUCES CON CXP */
    if (CRUCES <> 0) then
        BEGIN
        SELECT PROV_CTAPAGAR FROM PROVEEDORES WHERE TERC_NIT = :nit INTO :ctabase;
        if (CTABASE IS NULL) then
            ctabase = tctaclien;
        CUENTA = NULL;
        EXECUTE PROCEDURE VALIDE_CUENTA_C (CTABASE) RETURNING_VALUES (:OK);
        IF (OK = 0) THEN
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTABASE INTO :CUENTA, :TIPOCUEN;
        ELSE
            begin
            EXECUTE PROCEDURE ERROR (61, :IDDOC, :CTABASE, 2);
            CUENTA = CTABASE;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERROR (61, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            /* DEBERIA RECORRER DOCUMENTO POR DOCUMENTO */
            FOR SELECT RCCR_TIPODOC, RCCR_PREFIJO, RCCR_NUMERO, RCCR_ABONO+RCCR_RTFTE+RCCR_RTIVA+RCCR_RTICA+RCCR_DTOF
                FROM recibos_caja_crucec WHERE RECA_ID = :IDDOC
                INTO :TIPOIT, PREFIT, NUMIT, ABONOIT
                DO
                BEGIN
                NUMEROIT = PREFIT || NUMIT;
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :ABONOIT, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, :NUMEROIT, NULL, NULL, :TIPOIT, 0);
                SUMA = SUMA + ABONOIT;
                NROI = NROI + 1;
                END
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :CRUCES, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            SUMA = SUMA + CRUCES;
            NROI = NROI + 1;
            END

        /* LA DIFERENCIA EN CAMBIO */
        SELECT SUM(RCCR_DIFCAMBIO) FROM recibos_caja_crucec WHERE RECA_ID = :iddoc INTO :DIFCAMBIO;
        IF ((DIFCAMBIO IS NOT NULL) AND (DIFCAMBIO <> 0)) THEN
            BEGIN
            if (DIFCAMBIO > 0) then
                execute procedure lee_configuracion('GENERAL','GENERAL','CUENTA DE GASTO POR DIFERENCIA EN CAMBIO PARA OPERACIONES EN OTRA MONEDA') returning_values (:ctadif);
            else
                execute procedure lee_configuracion('GENERAL','GENERAL','CUENTA DE INGRESO POR DIFERENCIA EN CAMBIO PARA OPERACIONES EN OTRA MONEDA') returning_values (:ctadif);
            CUENTA = NULL;
            EXECUTE PROCEDURE VALIDE_CUENTA_C (ctadif) RETURNING_VALUES (:OK);
            IF (OK = 0) THEN
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :ctadif INTO :CUENTA, :TIPOCUEN;
            ELSE
                begin
                EXECUTE PROCEDURE ERROR (61, :IDDOC, :ctadif, 2);
                CUENTA = ctadif;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERROR (61, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                EXECUTE PROCEDURE ERROR (61, :IDDOC, :CUENTA, 4);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                if (DIFCAMBIO > 0) then
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :difcambio, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                else
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, ABS(:difcambio), 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA + difcambio;
                END
            END
        /* RETEFUENTE DEL CRUCE */
        SELECT first 1 INCJ_RTFTE, INCJ_RTIVA, INCJ_RTICA, INCJ_CTARTFTE, INCJ_CTARTIVA, INCJ_CTARTICA
            FROM INTERFAZ_CAJA WHERE tido_cod = 62 into :RTFTER, :RTIVAR, :RTICAR, :CTARTFTER, :CTARTIVAR, :CTARTICAR;
        SELECT SUM(RCCR_RTFTE) FROM recibos_caja_crucec WHERE RECA_ID = :iddoc INTO :rtftec;
        IF ((rtftec IS NOT NULL) AND (rtftec <> 0)) THEN
            BEGIN
            if ((RTFTER = 'T') or (RTFTER = 'K')) then
                BEGIN
                if (RTFTER = 'T') then
                    SELECT PROV_CTARTFTE FROM proveedores WHERE TERC_NIT = :NIT INTO CTARTFTER;
                CUENTA = NULL;
                EXECUTE PROCEDURE VALIDE_CUENTA_C (ctartfter) RETURNING_VALUES (:OK);
                IF (OK = 0) THEN
                    SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                        WHERE CUEN_COD = :ctartfter INTO :CUENTA, :TIPOCUEN;
                ELSE
                    begin
                    EXECUTE PROCEDURE ERROR (62, :IDDOC, :ctartfter, 2);
                    CUENTA = ctartfter;
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 4);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :rtftec, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA - rtftec;
                    END
                END
            END
        /* RETEIVA DEL CRUCE */
        SELECT SUM(RCCR_RTIVA) FROM recibos_caja_crucec WHERE RECA_ID = :iddoc INTO :rtivac;
        IF ((rtivac IS NOT NULL) AND (rtivac <> 0)) THEN
            BEGIN
            if ((RTIVAR = 'T') or (RTIVAR = 'K')) then
                BEGIN
                if (RTIVAR = 'T') then
                    SELECT PROV_CTARTIVA FROM proveedores WHERE TERC_NIT = :NIT INTO CTARTIVAR;
                CUENTA = NULL;
                EXECUTE PROCEDURE VALIDE_CUENTA_C (ctartivar) RETURNING_VALUES (:OK);
                IF (OK = 0) THEN
                    SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                        WHERE CUEN_COD = :ctartivar INTO :CUENTA, :TIPOCUEN;
                ELSE
                    begin
                    EXECUTE PROCEDURE ERROR (62, :IDDOC, :ctartivar, 2);
                    CUENTA = ctartivar;
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 4);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :rtivac, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA - rtivac;
                    END
                END
            END
        /* RETEICA DEL CRUCE */
        SELECT SUM(RCCR_RTICA) FROM recibos_caja_crucec WHERE RECA_ID = :iddoc INTO :rticac;
        IF ((rticac IS NOT NULL) AND (rtivac <> 0)) THEN
            BEGIN
            if ((RTICAR = 'T') or (RTICAR = 'K')) then
                BEGIN
                if (RTICAR = 'T') then
                    SELECT PROV_CTARTICA FROM proveedores WHERE TERC_NIT = :NIT INTO CTARTICAR;
                CUENTA = NULL;
                EXECUTE PROCEDURE VALIDE_CUENTA_C (ctarticar) RETURNING_VALUES (:OK);
                IF (OK = 0) THEN
                    SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                        WHERE CUEN_COD = :ctarticar INTO :CUENTA, :TIPOCUEN;
                ELSE
                    begin
                    EXECUTE PROCEDURE ERROR (62, :IDDOC, :ctarticar, 2);
                    CUENTA = ctarticar;
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 4);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :rticac, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA - rticac;
                    END
                END
            END
        END /* cruces */
    /* CIERRE EL COMPROBANTE CONTRA LA CUENTA DEL TERCERO O LA BASE CONSTANTE */
    if (SUMA <> 0) THEN
        BEGIN
        if  ((BASE = 'T') or (BASE = 'K')) then
            BEGIN
            if (SUMA < 0) then
                BEGIN
                DEBITO = SUMA * -1;
                CREDITO = 0;
                END
            ELSE
                BEGIN
                DEBITO = 0;
                CREDITO = SUMA;
                END
            if (BASE = 'T') then
                CTABASE = TCTACLIEN;
            CUENTA = NULL;
            EXECUTE PROCEDURE VALIDE_CUENTA_C (CTABASE) RETURNING_VALUES (:OK);
            IF (OK = 0) THEN
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :CTABASE INTO :CUENTA, :TIPOCUEN;
            ELSE
                begin
                EXECUTE PROCEDURE ERROR (61, :IDDOC, :CTABASE, 2);
                CUENTA = CTABASE;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERROR (61, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                /* DEBERIA RECORRER DOCUMENTO POR DOCUMENTO */
                FOR SELECT RCDE_TIPODOC, RCDE_PREFIJO, RCDE_NUMERO, RCDE_ABONO+RCDE_RTFTE+RCDE_RTIVA+RCDE_RTICA+RCDE_DTOF
                    FROM RECIBOS_CAJA_DETALLE WHERE RECA_ID = :IDDOC
                    INTO :TIPOIT, PREFIT, NUMIT, ABONOIT
                    DO
                    BEGIN
                    NUMEROIT = PREFIT || NUMIT;
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :ABONOIT, 0, 0, :NIT, :PROY, :CENTRO, NULL, :NUMEROIT, NULL, NULL, :TIPOIT, 0);
                    NROI = NROI + 1;
                    END
                END
            if (TIPOCUEN = 'N') then
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :DEBITO, :CREDITO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            END /* SUMA EN CARTERA */
        if (BASE = 'D') then
            BEGIN
            CTABASE = NULL;
            FOR SELECT RCDE_TIPODOC, RCDE_IDDOC, RCDE_PREFIJO, RCDE_NUMERO, RCDE_ABONO
                FROM RECIBOS_CAJA_DETALLE WHERE RECA_ID = :IDDOC INTO :tipoit, :idit, :PREFIT, :NUMIT, :suma DO
                BEGIN
                if (TIPOIT <> 45) then
                    SELECT CUEN_COD, PROY_COD, CENT_COD FROM COMPROBANTE_ENCABEZADO E, COMPROBANTE_DETALLE D
                        WHERE E.enco_consec = D.enco_consec AND E.enco_tiporef = :TIPOIT AND E.enco_idref = :IDIT
                        AND SUBSTR(CUEN_COD,1,2) = '13' AND SUBSTR(CUEN_COD,1,4) <> '1355'
                        INTO :ctabase, :proy, :centro;
                ELSE
                    /* tome la base de la configuración y el c.costo del prefijo del recibo */
                    execute procedure lee_configuracion('CAJA', 'RECIBOS', 'CUENTA CONTABLE PARA LOS ANTICIPOS DE CLIENTES SI LA INTERFAZ ES POR DOCUMENTO') returning_values (ctabase);
                CUENTA = NULL;
                EXECUTE PROCEDURE VALIDE_CUENTA_C (ctabase) RETURNING_VALUES (:OK);
                IF (OK = 0) THEN
                    SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                        WHERE CUEN_COD = :CTABASE INTO :CUENTA, :TIPOCUEN;
                ELSE
                    begin
                    EXECUTE PROCEDURE ERROR (61, :IDDOC, :CTABASE, 2);
                    CUENTA = CTABASE;
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    end
                if (SUMA < 0) then
                    BEGIN
                    DEBITO = SUMA * -1;
                    CREDITO = 0;
                    END
                ELSE
                    BEGIN
                    DEBITO = 0;
                    CREDITO = SUMA;
                    END
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (61, :IDDOC, :CUENTA, 3);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    /* DEBERIA RECORRER DOCUMENTO POR DOCUMENTO */
                    NUMEROIT = PREFIT || NUMIT;
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :debito, :credito, 0, 0, :NIT, :PROY, :CENTRO, NULL, :NUMEROIT, NULL, NULL, :TIPOIT, 0);
                    END
                if (TIPOCUEN = 'N') then
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :DEBITO, :CREDITO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                END /* SUMA EN CARTERA */
            END
        END
    /* recorra las cuentas adicionales */
    FOR SELECT INJC_CUENTA, INJC_BASE, INJC_PORC, INJC_VALOR, INJC_DB
        FROM INTERFAZ_CAJA_CTAS
        WHERE INCJ_ID = :IDINTER
        INTO :CTADIC, :BASEADIC, :PORCADIC, :VALORADIC, :DBADIC
        DO
        BEGIN
        if (:BASEADIC = 'TOTAL') then
            VALORADIC = VRTOTAL;
        if (:BASEADIC = 'DESCUENTO') then
            VALORADIC = VRDTO;
        if (:BASEADIC = 'RTFTE') then
            VALORADIC = VRRTFTE;
        if (:BASEADIC = 'RTIVA') then
            VALORADIC = VRRTIVA;
        if (:BASEADIC = 'RTICA') then
            VALORADIC = VRRTICA;
        MONTO = VALORADIC * PORCADIC;
        CUENTA = NULL;
        EXECUTE PROCEDURE VALIDE_CUENTA_C (CTADIC) RETURNING_VALUES (:OK);
        IF (OK = 0) THEN
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTADIC INTO :CUENTA, :TIPOCUEN;
        ELSE
            begin
            EXECUTE PROCEDURE ERROR (61, :IDDOC, :CTADIC, 2);
            CUENTA = CTADIC;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERROR (61, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERROR (61, :IDDOC, :CUENTA, 4);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            if (DBADIC = 'S') then
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTADIC, :CONC, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            ELSE
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTADIC, :CONC, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            END
        NROI = NROI + 1;
        END
    /* REVERSE EL PROVISIONAL SI EXISTE */
    if ((PROVID IS NOT NULL) AND (PROVID <> 0))  then
        BEGIN
        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
            SELECT :IDC, CODE_ITEM+:NROI, CUEN_COD, :CONC, '', CODE_CREDITO, CODE_DEBITO, CODE_BASE*-1, CODE_PORC, D.TERC_NIT, PROY_COD, CENT_COD, NULL, NULL, NULL, NULL, 0, 0
                FROM COMPROBANTE_DETALLE D, COMPROBANTE_ENCABEZADO E WHERE E.enco_consec = D.enco_consec AND E.enco_tiporef = 65 AND E.enco_idref = :provid ORDER BY CODE_ITEM;
        END
    if (ERROR > 0) then
        VER = 'S';
    SUSPEND;
    END /* NO ANULADO */
  END /* EXISTE LA INTERFAZ */
ELSE
    BEGIN
    EXECUTE PROCEDURE ERROR (61, :IDDOC, :PREF, 1);
    ERROR = ERROR + 1;
    VER = 'S';
    SUSPEND;
    END
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE RECIBOS_SIN_CONTABILIDAD(
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    ID INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    ESTADO VARCHAR(20),
    IDI INTEGER,
    IDC INTEGER,
    ERROR INTEGER)
AS
DECLARE VARIABLE VER CHAR(2);
declare variable FECICNT VARCHAR(10);
declare variable FECFCNT VARCHAR(10);
declare variable idref INTEGER;
BEGIN /*$$IBE$$ 
EXECUTE PROCEDURE fecha_a_conta(FECINI) returning_values (FECICNT);
EXECUTE PROCEDURE fecha_a_conta(FECFIN) returning_values (FECFCNT);
FOR SELECT RECA_ID, PREF_PRE, RECA_NUMERO FROM RECIBOS_CAJA WHERE RECA_ANULADO = 'N' AND
    RECA_FECHA >= :FECINI AND RECA_FECHA <= :FECFIN and PREF_PRE NOT IN (SELECT AUTO_PREFRDC FROM AUTORIZACIONES) ORDER BY RECA_ID
    INTO :ID, :PREF, :NUMERO
DO
  BEGIN
  idref = null;
  SELECT ENCO_IDREF FROM COMPROBANTE_ENCABEZADO WHERE ENCO_TIPOREF = 61 AND ENCO_FECHA >= :FECICNT AND ENCO_FECHA <= :FECFCNT and ENCO_IDREF = :id into :idref;
  if (idref IS NULL) then
  begin
   ESTADO = 'PROCESANDO';
   SUSPEND;
   SELECT MAX(INCJ_ID) FROM INTERFAZ_CAJA WHERE PREF_PRE = :PREF AND TIDO_COD = 61 INTO :IDI;
   EXECUTE PROCEDURE CONTABIL_RECICAJA (:ID, :IDI) RETURNING_VALUES (:ERROR, :VER, :IDC);
   if (ERROR = 0) then
    BEGIN
    EXECUTE PROCEDURE CONTABILIZA_PENDIENTE (:IDC);
    ESTADO = 'OK';
    END
   ELSE
    ESTADO = 'ERROR';
   suspend;
  end
  END
 $$IBE$$*/ SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE RECIBOS_SIN_CONTABILIDAD(
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    ID INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    ESTADO VARCHAR(20),
    IDI INTEGER,
    IDC INTEGER,
    ERROR INTEGER)
AS
DECLARE VARIABLE VER CHAR(2);
declare variable FECICNT VARCHAR(10);
declare variable FECFCNT VARCHAR(10);
declare variable idref INTEGER;
BEGIN
EXECUTE PROCEDURE fecha_a_conta(FECINI) returning_values (FECICNT);
EXECUTE PROCEDURE fecha_a_conta(FECFIN) returning_values (FECFCNT);
FOR SELECT RECA_ID, PREF_PRE, RECA_NUMERO FROM RECIBOS_CAJA WHERE RECA_ANULADO = 'N' AND
    RECA_FECHA >= :FECINI AND RECA_FECHA <= :FECFIN and PREF_PRE NOT IN (SELECT AUTO_PREFRDC FROM AUTORIZACIONES) ORDER BY RECA_ID
    INTO :ID, :PREF, :NUMERO
DO
  BEGIN
  idref = null;
  SELECT ENCO_IDREF FROM COMPROBANTE_ENCABEZADO WHERE ENCO_TIPOREF = 61 AND ENCO_FECHA >= :FECICNT AND ENCO_FECHA <= :FECFCNT and ENCO_IDREF = :id into :idref;
  if (idref IS NULL) then
  begin
   ESTADO = 'PROCESANDO';
   SUSPEND;
   SELECT MAX(INCJ_ID) FROM INTERFAZ_CAJA WHERE PREF_PRE = :PREF AND TIDO_COD = 61 INTO :IDI;
   EXECUTE PROCEDURE CONTABIL_RECICAJA (:ID, :IDI) RETURNING_VALUES (:ERROR, :VER, :IDC);
   if (ERROR = 0) then
    BEGIN
    EXECUTE PROCEDURE CONTABILIZA_PENDIENTE (:IDC);
    ESTADO = 'OK';
    END
   ELSE
    ESTADO = 'ERROR';
   suspend;
  end
  END
END

^

SET TERM ; ^

INSERT INTO CONFIGURACION (CONF_MODULO, CONF_CATEGORIA, CONF_PROPIEDAD, CONF_VALOR, CONF_POSIBLES, CONF_AYUDA) VALUES ('CAJA', 'EGRESOS', 'CUENTA CONTABLE PARA LOS ANTICIPOS A ACREEDORES SI LA INTERFAZ ES POR DOCUMENTO', '133005', '', 'Indique la cuenta contable donde se llevarán los anticipos a acreedores en caso que la interfaz del egreso se defina por Documento');
commit work;

SET TERM ^ ;

CREATE OR ALTER PROCEDURE CONTABIL_EGRESO(
    IDDOC INTEGER,
    IDINTER INTEGER)
RETURNS (
    ERROR INTEGER,
    VER CHAR(1),
    IDC INTEGER)
AS
declare variable PREF VARCHAR(4);
declare variable NUM VARCHAR(6);
declare variable FECAUX DATE;
declare variable FECHA CHAR(8);
declare variable CONC CHAR(120);
declare variable VRDTO NUMERIC(18, 2);
declare variable VRRTFTE NUMERIC(18, 2);
declare variable VRRTIVA NUMERIC(18, 2);
declare variable VRRTICA NUMERIC(18, 2);
declare variable VRTOTAL NUMERIC(18, 2);
declare variable TIPOCOMP VARCHAR(3);
declare variable PREFCONT VARCHAR(4);
declare variable BASE CHAR(1);
declare variable CTABASE VARCHAR(20);
declare variable CAJA CHAR(1);
declare variable CTACAJA VARCHAR(20);
declare variable RTFTE CHAR(1);
declare variable CTARTFTE VARCHAR(20);
declare variable RTIVA CHAR(1);
declare variable CTARTIVA VARCHAR(20);
declare variable RTICA CHAR(1);
declare variable CTARTICA VARCHAR(20);
declare variable DTO CHAR(1);
declare variable CTADTO VARCHAR(20);
declare variable EXISTE CHAR(1);
declare variable CUENTA VARCHAR(20);
declare variable MONTO NUMERIC(18,2);
declare variable ES_RETENCION CHAR(1);
declare variable TIPOCUEN CHAR(1);
declare variable NIT VARCHAR(20);
declare variable PROY VARCHAR(4);
declare variable CENTRO VARCHAR(4);
declare variable MONTOBASE NUMERIC(18,2);
declare variable PORC NUMERIC(9,2);
declare variable DEBITO NUMERIC(18,2);
declare variable CREDITO NUMERIC(18,2);
declare variable NROI INTEGER;
declare variable SUMA NUMERIC(18,2);
declare variable TCTACLIEN VARCHAR(20);
declare variable TCTARTFTE VARCHAR(20);
declare variable TCTARTIVA VARCHAR(20);
declare variable TCTARTICA VARCHAR(20);
declare variable TCTACART VARCHAR(20);
declare variable TIPOIT INTEGER;
declare variable IDIT INTEGER;
declare variable PREFIT VARCHAR(4);
declare variable NUMIT VARCHAR(6);
declare variable NUMEROIT VARCHAR(10);
declare variable ABONOIT NUMERIC(18,2);
declare variable CTADIC VARCHAR(20);
declare variable BASEADIC VARCHAR(20);
declare variable PORCADIC NUMERIC(5,2);
declare variable VALORADIC NUMERIC(18,2);
declare variable DBADIC CHAR(1);
declare variable VRBASE NUMERIC(18,2);
declare variable GMF CHAR(1);
declare variable CODBCO INTEGER;
declare variable NUMCHEQ VARCHAR(20);
declare variable CRUCES NUMERIC(18,2);
declare variable VRCAJA NUMERIC(18,2);
declare variable OK INTEGER;
declare variable DIFCAMBIO NUMERIC(18,2);
declare variable CTADIF VARCHAR(20);
declare variable RTFTEC NUMERIC(18,2);
declare variable RTIVAC NUMERIC(18,2);
declare variable RTICAC NUMERIC(18,2);
declare variable RTFTER CHAR(1);
declare variable CTARTFTER VARCHAR(20);
declare variable RTIVAR CHAR(1);
declare variable CTARTIVAR VARCHAR(20);
declare variable RTICAR CHAR(1);
declare variable CTARTICAR VARCHAR(20);
BEGIN
/* BUSQUE LA INTERFACE */
EXISTE = 'N';
SELECT 'S', TICO_COD, PRCO_PRE, INCJ_BASE, INCJ_DTOPP, INCJ_RTFTE, INCJ_RTIVA, INCJ_RTICA, INCJ_CAJA, INCJ_CTABASE, INCJ_CTADTO, INCJ_CTARTFTE, INCJ_CTARTIVA, INCJ_CTARTICA, INCJ_CTACAJA, INCJ_CONFIRMAR
    FROM INTERFAZ_CAJA
    WHERE INCJ_ID = :IDINTER
    INTO :EXISTE, :TIPOCOMP, :PREFCONT, :BASE, :DTO, :RTFTE, :RTIVA, :RTICA, :CAJA, :CTABASE, :CTADTO, :CTARTFTE, :CTARTIVA, :CTARTICA, :CTACAJA, :VER;
if (EXISTE = 'S') then
    BEGIN
    OK = 0;
    FOR SELECT CNTB_ID FROM CONTABILIZACION WHERE CNTB_TIPOREF = 62 AND CNTB_IDREF = :IDDOC INTO :OK DO
        BEGIN
        DELETE FROM CONTABILIZACION_DET WHERE CNTB_ID = :OK;
        DELETE FROM CONTABILIZACION WHERE CNTB_ID = :OK;
        END

    /* TRAIGA EL ENCABEZADO DEL EGRESO */
    SELECT PREF_PRE, EGRE_NUMERO, EGRE_FECHA, E.TERC_NIT, EGRE_CONC, EGRE_DTOF, EGRE_MONTO, EGRE_RTFTEMONTO, EGRE_RTIVAMONTO, EGRE_RTICAMONTO, TERC_CTARTFTE, TERC_CTARTIVA, TERC_CTARTICA, TERC_CTACLIENTE
        FROM EGRESOS E, TERCEROS T
        WHERE EGRE_ID = :IDDOC AND E.TERC_NIT = T.TERC_NIT
        INTO :PREF, :NUM, :FECAUX, :NIT, :CONC, :VRDTO, :VRTOTAL, :VRRTFTE, :VRRTIVA, :VRRTICA, :TCTARTFTE, TCTARTIVA, TCTARTICA, TCTACLIEN;
    /* SI ES PROVEEDOR, SOBREESCIBE LAS CUENTAS  */
    SELECT PROV_CTAPAGAR, PROV_CTARTFTE, PROV_CTARTIVA, PROV_CTARTICA
        FROM PROVEEDORES WHERE TERC_NIT = :NIT
        INTO TCTACLIEN, TCTARTFTE, TCTARTIVA, TCTARTICA;
    SELECT PREF_CENTRO, PREF_PROY FROM PREFIJOS
        WHERE PREF_PRE = :PREF AND TIDO_COD = 62 INTO :CENTRO, :PROY;
    EXECUTE PROCEDURE FECHA_A_CONTA(:FECAUX) returning_values (:FECHA);
    /* REGISTRE EL ENCABEZADO CONTABLE */
    IDC = GEN_ID(ID_CONTABILIZA, 1);
    INSERT INTO CONTABILIZACION (CNTB_ID, CNTB_TIPOCOMP, CNTB_PREFCNT, CNTB_NUMERO, CNTB_FECHA, CNTB_CONCEPTO, CNTB_REF, CNTB_TIPOREF, CNTB_IDREF, CNTB_PREFREF, CNTB_NUMREF, CNTB_PROCESADO)
        VALUES (:IDC, :TIPOCOMP, :PREFCONT, :NUM, :FECHA, :CONC, '', 62, :IDDOC, :PREF, :NUM, 'N');
    /* SUME LOS CRUCES PARA LLEVARLOS A LA CUENTA X PAGAR Y RESTAR DE LA CAJA */
    SELECT SUM(EGCC_ABONO) FROM EGRESOS_CRUCEC WHERE EGRE_ID = :iddoc INTO :CRUCES;
    if (CRUCES IS NULL) then
        CRUCES = 0;
    VRCAJA = VRTOTAL - CRUCES;
    NROI = 0;
    SUMA = 0;
    ERROR = 0;
    /* EL CREDITO EN LA CAJA O EL BANCO */
    IF ((CAJA = 'K')) THEN
        BEGIN
        if (VRCAJA <> 0) then
            BEGIN
            CUENTA = NULL;
            EXECUTE PROCEDURE VALIDE_CUENTA_C (CTACAJA) RETURNING_VALUES (:OK);
            IF (OK = 0) THEN
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :CTACAJA INTO :CUENTA, :TIPOCUEN;
            ELSE
                begin
                EXECUTE PROCEDURE ERROR (62, :IDDOC, :CTACAJA, 2);
                CUENTA = CTACAJA;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 4);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRCAJA, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - VRCAJA;
                END
            END /* VRCAJA <> 0 */
        END /* CAJA CONSTANTE */
    IF ((CAJA = 'F')) THEN
        BEGIN
        /* mueva la cuenta de la caja o el banco o ambas */
        /* PRIMERO LA CAJA */
        FOR SELECT CAJA_CUENTA, EGCA_MONTO FROM EGRESOS_CAJA E, CAJAS C
            WHERE C.CAJA_ID = E.CAJA_ID AND EGRE_ID = :IDDOC
            INTO :CTACAJA, :MONTO
            DO
            BEGIN
            if (MONTO <> 0) then
                BEGIN
                CUENTA = NULL;
                EXECUTE PROCEDURE VALIDE_CUENTA_C (CTACAJA) RETURNING_VALUES (:OK);
                IF (OK = 0) THEN
                    SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                        WHERE CUEN_COD = :CTACAJA INTO :CUENTA, :TIPOCUEN;
                ELSE
                    begin
                    EXECUTE PROCEDURE ERROR (62, :IDDOC, :CTACAJA, 2);
                    CUENTA = CTACAJA;
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 4);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA - MONTO;
                    END
                END /* MONTO <> 0 */
            END /* DO CAJA */
        /* AHORA EL BANCO */
        MONTO = 0;
        SELECT CUBA_CTACONTA, EGBC_MONTO, EGBC_GMF, E.CUBA_COD, CUBA_GMFPOR, EGBC_NUMERO
            FROM EGRESOS_BANCO E, CUENTAS_BANCO C
            WHERE E.CUBA_COD = C.CUBA_COD AND EGRE_ID = :IDDOC
            INTO :CTACAJA, :MONTO, :GMF, :CODBCO, :PORC, :NUMCHEQ;
        if (MONTO <> 0) then
            BEGIN
            if (MONTO <> 0) then
                BEGIN
                CUENTA = NULL;
                EXECUTE PROCEDURE VALIDE_CUENTA_C (CTACAJA) RETURNING_VALUES (:OK);
                IF (OK = 0) THEN
                    SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                        WHERE CUEN_COD = :CTACAJA INTO :CUENTA, :TIPOCUEN;
                ELSE
                    begin
                    EXECUTE PROCEDURE ERROR (62, :IDDOC, :CTACAJA, 2);
                    CUENTA = CTACAJA;
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 4);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, :NUMCHEQ, 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA - MONTO;
                    END
                /* EL GMF */
                if ((GMF = 'S') AND (PORC <> 0)) then
                    BEGIN
                    EXECUTE procedure REDONDEE(:MONTO * :PORC / 1000, 0) returning_values (MONTO);
                    /* REGISTRE EL GMF EN LA MISMA CUENTA DEL BANCO COMO CREDITO */
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, :NUMCHEQ, 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA - MONTO;

                    /* AHORA LA CUENTA DEL GASTO */
                    SELECT CUBA_CTAGMF FROM CUENTAS_BANCO
                        where CUBA_COD = :CODBCO INTO :CTACAJA;
                    EXECUTE PROCEDURE VALIDE_CUENTA_C (CTACAJA) RETURNING_VALUES (:OK);
                    IF (OK = 0) THEN
                        SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                            WHERE CUEN_COD = :CTACAJA INTO :CUENTA, :TIPOCUEN;
                    ELSE
                        begin
                        EXECUTE PROCEDURE ERROR (62, :IDDOC, :CTACAJA, 2);
                        CUENTA = CTACAJA;
                        TIPOCUEN = 'N';
                        ERROR = ERROR + 1;
                        end
                    if (TIPOCUEN = 'I') then
                        BEGIN
                        EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
                        TIPOCUEN = 'N';
                        ERROR = ERROR + 1;
                        END
                    if (TIPOCUEN = 'C') then
                        BEGIN
                        EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 4);
                        TIPOCUEN = 'N';
                        ERROR = ERROR + 1;
                        END
                    if (TIPOCUEN = 'N') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, :NUMCHEQ, :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NROI = NROI + 1;
                        SUMA = SUMA + MONTO;
                        END
                    END /* GMF */
                END /* MONTO <> 0 */
            END /* EGRESO_BANCO */
        END /* CAJA = F */

    /* LOS CRUCES CON CUENTAS X COBRAR */
    if (CRUCES <> 0) then
        BEGIN
        SELECT TERC_CTACLIENTE FROM TERCEROS WHERE TERC_NIT = :nit INTO :tctacart;
        if (tctacart IS NULL) then
            tctacart = tctaclien;
        CUENTA = NULL;
        EXECUTE PROCEDURE VALIDE_CUENTA_C (tctacart) RETURNING_VALUES (:OK);
        IF (OK = 0) THEN
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :tctacart INTO :CUENTA, :TIPOCUEN;
        ELSE
            begin
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :tctacart, 2);
            CUENTA = tctacart;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            /* DEBERIA RECORRER DOCUMENTO POR DOCUMENTO */
            FOR SELECT EGCC_TIPODOC, EGCC_PREFIJO, EGCC_NUMERO, EGCC_ABONO+EGCC_RTFTE+EGCC_RTIVA+EGCC_RTICA+EGCC_DTOF
                FROM egresos_crucec WHERE EGRE_ID = :IDDOC
                INTO :TIPOIT, PREFIT, NUMIT, ABONOIT
                DO
                BEGIN
                NUMEROIT = PREFIT || NUMIT;
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :ABONOIT, 0, 0, :NIT, :PROY, :CENTRO, NULL, :NUMEROIT, NULL, NULL, :TIPOIT, 0);
                SUMA = SUMA - ABONOIT;
                NROI = NROI + 1;
                END
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :CRUCES, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            SUMA = SUMA - CRUCES;
            NROI = NROI + 1;
            END
        /* LA DIFERENCIA EN CAMBIO */
        SELECT SUM(EGCC_DIFCAMBIO) FROM egresos_crucec WHERE EGRE_ID = :iddoc INTO :DIFCAMBIO;
        IF ((DIFCAMBIO IS NOT NULL) AND (DIFCAMBIO <> 0)) THEN
            BEGIN
            if (DIFCAMBIO > 0) then
                execute procedure lee_configuracion('GENERAL','GENERAL','CUENTA DE INGRESO POR DIFERENCIA EN CAMBIO PARA OPERACIONES EN OTRA MONEDA') returning_values (:ctadif);
            else
                execute procedure lee_configuracion('GENERAL','GENERAL','CUENTA DE GASTO POR DIFERENCIA EN CAMBIO PARA OPERACIONES EN OTRA MONEDA') returning_values (:ctadif);
            CUENTA = NULL;
            EXECUTE PROCEDURE VALIDE_CUENTA_C (ctadif) RETURNING_VALUES (:OK);
            IF (OK = 0) THEN
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :ctadif INTO :CUENTA, :TIPOCUEN;
            ELSE
                begin
                EXECUTE PROCEDURE ERROR (62, :IDDOC, :ctadif, 2);
                CUENTA = ctadif;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 4);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                if (DIFCAMBIO > 0) then
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :difcambio, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                else
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', ABS(:difcambio), 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - difcambio;
                END
            END
        /* RETEFUENTE DEL CRUCE */
        SELECT first 1 INCJ_RTFTE, INCJ_RTIVA, INCJ_RTICA, INCJ_CTARTFTE, INCJ_CTARTIVA, INCJ_CTARTICA
            FROM INTERFAZ_CAJA WHERE tido_cod = 61 into :RTFTER, :RTIVAR, :RTICAR, :CTARTFTER, :CTARTIVAR, :CTARTICAR;
        SELECT SUM(EGCC_RTFTE) FROM egresos_crucec WHERE EGRE_ID = :iddoc INTO :rtftec;
        IF ((rtftec IS NOT NULL) AND (rtftec <> 0)) THEN
            BEGIN
            if ((RTFTER = 'T') or (RTFTER = 'K')) then
                BEGIN
                if (RTFTER = 'T') then
                    SELECT TERC_CTARTFTE FROM TERCEROS WHERE TERC_NIT = :NIT INTO CTARTFTER;
                CUENTA = NULL;
                EXECUTE PROCEDURE VALIDE_CUENTA_C (ctartfter) RETURNING_VALUES (:OK);
                IF (OK = 0) THEN
                    SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                        WHERE CUEN_COD = :ctartfter INTO :CUENTA, :TIPOCUEN;
                ELSE
                    begin
                    EXECUTE PROCEDURE ERROR (62, :IDDOC, :ctartfter, 2);
                    CUENTA = ctartfter;
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 4);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :rtftec, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA + rtftec;
                    END
                END
            END
        /* RETEIVA DEL CRUCE */
        SELECT SUM(EGCC_RTIVA) FROM egresos_crucec WHERE EGRE_ID = :iddoc INTO :rtivac;
        IF ((rtivac IS NOT NULL) AND (rtivac <> 0)) THEN
            BEGIN
            if ((RTIVAR = 'T') or (RTIVAR = 'K')) then
                BEGIN
                if (RTIVAR = 'T') then
                    SELECT TERC_CTARTIVA FROM TERCEROS WHERE TERC_NIT = :NIT INTO CTARTIVAR;
                CUENTA = NULL;
                EXECUTE PROCEDURE VALIDE_CUENTA_C (ctartivar) RETURNING_VALUES (:OK);
                IF (OK = 0) THEN
                    SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                        WHERE CUEN_COD = :ctartivar INTO :CUENTA, :TIPOCUEN;
                ELSE
                    begin
                    EXECUTE PROCEDURE ERROR (62, :IDDOC, :ctartivar, 2);
                    CUENTA = ctartivar;
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 4);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :rtivac, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA + rtivac;
                    END
                END
            END
        /* RETEICA DEL CRUCE */
        SELECT SUM(EGCC_RTICA) FROM egresos_crucec WHERE EGRE_ID = :iddoc INTO :rticac;
        IF ((rticac IS NOT NULL) AND (rtivac <> 0)) THEN
            BEGIN
            if ((RTICAR = 'T') or (RTICAR = 'K')) then
                BEGIN
                if (RTICAR = 'T') then
                    SELECT TERC_CTARTICA FROM TERCEROS WHERE TERC_NIT = :NIT INTO CTARTICAR;
                CUENTA = NULL;
                EXECUTE PROCEDURE VALIDE_CUENTA_C (ctarticar) RETURNING_VALUES (:OK);
                IF (OK = 0) THEN
                    SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                        WHERE CUEN_COD = :ctarticar INTO :CUENTA, :TIPOCUEN;
                ELSE
                    begin
                    EXECUTE PROCEDURE ERROR (62, :IDDOC, :ctarticar, 2);
                    CUENTA = ctarticar;
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 4);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :rticac, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA + rticac;
                    END
                END
            END
        END /* cruces */

    if (DTO = 'K') then /* DTO EN CTA CONSTANTE */
        BEGIN
        if (VRDTO <> 0) then
            BEGIN
            CUENTA = NULL;
            EXECUTE PROCEDURE VALIDE_CUENTA_C (CTADTO) RETURNING_VALUES (:OK);
            IF (OK = 0) THEN
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :CTADTO INTO :CUENTA, :TIPOCUEN;
            ELSE
                begin
                EXECUTE PROCEDURE ERROR (62, :IDDOC, :CTADTO, 2);
                CUENTA = CTADTO;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 4);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRDTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - VRDTO;
                END
            END /* VRDTO <> 0 */
        END /* DTO EN CTA CONSTANTE */

    /* LA DIFERENCIA EN CAMBIO */
    SELECT SUM(EGDE_DIFCAMBIO) FROM egresos_detalle WHERE EGRE_ID = :iddoc INTO :DIFCAMBIO;
    IF ((DIFCAMBIO IS NOT NULL) AND (DIFCAMBIO <> 0)) THEN
        BEGIN
        if (DIFCAMBIO > 0) then
            execute procedure lee_configuracion('GENERAL','GENERAL','CUENTA DE GASTO POR DIFERENCIA EN CAMBIO PARA OPERACIONES EN OTRA MONEDA') returning_values (:ctadif);
        else
            execute procedure lee_configuracion('GENERAL','GENERAL','CUENTA DE INGRESO POR DIFERENCIA EN CAMBIO PARA OPERACIONES EN OTRA MONEDA') returning_values (:ctadif);
        CUENTA = NULL;
        EXECUTE PROCEDURE VALIDE_CUENTA_C (ctadif) RETURNING_VALUES (:OK);
        IF (OK = 0) THEN
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :ctadif INTO :CUENTA, :TIPOCUEN;
        ELSE
            begin
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :ctadif, 2);
            CUENTA = ctadif;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 4);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            if (DIFCAMBIO > 0) then
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :difcambio, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            else
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, ABS(:difcambio), 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA + difcambio;
            END
        END
    /* RETENCION FUENTE */
    if ((RTFTE = 'T') or (RTFTE = 'K')) then
      if (VRRTFTE <> 0) then
        BEGIN
        if (RTFTE = 'T') then
            CTARTFTE = TCTARTFTE;
        CUENTA = NULL;
        EXECUTE PROCEDURE VALIDE_CUENTA_C (CTARTFTE) RETURNING_VALUES (:OK);
        IF (OK = 0) THEN
            SELECT CUEN_COD, CUEN_RETENCION, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTARTFTE INTO :CUENTA, :ES_RETENCION, :TIPOCUEN;
        ELSE
            begin
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :CTARTFTE, 2);
            CUENTA = CTARTFTE;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 4);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            if (ES_RETENCION = 'S') then
                BEGIN
                VRBASE = VRTOTAL;
                SELECT PROV_RETEFTE from proveedores where terc_nit = :NIT INTO :PORC;
                END
            ELSE
                BEGIN
                VRBASE = 0;
                PORC = 0;
                END
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, :VRBASE, :PORC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA - VRRTFTE;
            END
        END /* RTFTE */
    /* RETENCION IVA */
    if ((RTIVA = 'T') or (RTIVA = 'K')) then
      if (VRRTIVA <> 0) then
        BEGIN
        if (RTIVA = 'T') then
            CTARTIVA = TCTARTIVA;
        CUENTA = NULL;
        EXECUTE PROCEDURE VALIDE_CUENTA_C (CTARTIVA) RETURNING_VALUES (:OK);
        IF (OK = 0) THEN
            SELECT CUEN_COD, CUEN_RETENCION, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTARTIVA INTO :CUENTA, :ES_RETENCION, :TIPOCUEN;
        ELSE
            begin
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :CTARTIVA, 2);
            CUENTA = CTARTIVA;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 4);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            if (ES_RETENCION = 'S') then
                BEGIN
                VRBASE = VRTOTAL;
                SELECT PROV_RTEIVA from proveedores where terc_nit = :NIT INTO :PORC;
                END
            ELSE
                BEGIN
                VRBASE = 0;
                PORC = 0;
                END
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTIVA, :VRBASE, :PORC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA - VRRTIVA;
            END
        END /* RTIVA */
    /* RETENCION DE ICA */
    if ((RTICA = 'T') or (RTICA = 'K')) then
      if (VRRTICA <> 0) then
        BEGIN
        if (RTICA = 'T') then
            CTARTICA = TCTARTICA;
        CUENTA = NULL;
        EXECUTE PROCEDURE VALIDE_CUENTA_C (CTARTICA) RETURNING_VALUES (:OK);
        IF (OK = 0) THEN
            SELECT CUEN_COD, CUEN_RETENCION, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTARTICA INTO :CUENTA, :ES_RETENCION, :TIPOCUEN;
        ELSE
            begin
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :CTARTICA, 2);
            CUENTA = CTARTICA;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 4);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            if (ES_RETENCION = 'S') then
                BEGIN
                VRBASE = VRTOTAL;
                SELECT PROV_RTEICA from proveedores where terc_nit = :NIT INTO :PORC;
                END
            ELSE
                BEGIN
                VRBASE = 0;
                PORC = 0;
                END
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTICA, :VRBASE, :PORC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA - VRRTICA;
            END
        END /* RTICA */
    /* RECORRA LAS CUENTAS DE EGRESOS_CONTABILIDAD */
    FOR SELECT CUEN_COD, EGCO_NIT, EGCO_PROY, EGCO_CENTRO, EGCO_CONC, EGCO_DEBITOS, EGCO_CREDITOS, EGCO_BASEM, EGCO_PORC
        FROM EGRESOS_CONTABILIDAD WHERE EGRE_ID = :IDDOC ORDER BY EGCO_ITEM
        INTO :CTABASE, :NIT, :PROY, :CENTRO, :CONC, :DEBITO, :CREDITO, :MONTOBASE, :PORC
        DO
        BEGIN
        CUENTA = NULL;
        EXECUTE PROCEDURE VALIDE_CUENTA_C (CTABASE) RETURNING_VALUES (:OK);
        IF (OK = 0) THEN
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTABASE INTO :CUENTA, :TIPOCUEN;
        ELSE
            begin
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :CTABASE, 2);
            CUENTA = CTABASE;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 4);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'N') then
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :DEBITO, :CREDITO, :MONTOBASE, :PORC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
        SUMA = SUMA + DEBITO - CREDITO;
        NROI = NROI + 1;
        END
    /* CIERRE EL COMPROBANTE CONTRA LA CUENTA DEL TERCERO O LA BASE CONSTANTE */
    if (SUMA <> 0) THEN
        BEGIN
        if (SUMA < 0) then
            BEGIN
            DEBITO = SUMA * -1;
            CREDITO = 0;
            END
        ELSE
            BEGIN
            DEBITO = 0;
            CREDITO = SUMA;
            END
        if ((BASE = 'F') or (BASE = 'T') or (BASE = 'K')) then
            BEGIN
            if (BASE = 'T') then
                CTABASE = TCTACLIEN;
            if (BASE = 'F') then
                BEGIN
                SELECT CAJA_CUENTA FROM EGRESOS E, CAJAS C
                    WHERE C.CAJA_ID = E.CAJA_ID AND EGRE_ID = :IDDOC INTO :CTABASE;
                END
            CUENTA = NULL;
            EXECUTE PROCEDURE VALIDE_CUENTA_C (CTABASE) RETURNING_VALUES (:OK);
            IF (OK = 0) THEN
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :CTABASE INTO :CUENTA, :TIPOCUEN;
            ELSE
                begin
                EXECUTE PROCEDURE ERROR (62, :IDDOC, :CTABASE, 2);
                CUENTA = CTABASE;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                /* DEBERIA RECORRER DOCUMENTO POR DOCUMENTO */
                FOR SELECT RCDE_TIPODOC, RCDE_PREFIJO, RCDE_NUMERO, RCDE_ABONO+RCDE_RTFTE+RCDE_RTIVA+RCDE_RTICA+RCDE_DTOF
                    FROM RECIBOS_CAJA_DETALLE WHERE RECA_ID = :IDDOC
                    INTO :TIPOIT, PREFIT, NUMIT, ABONOIT
                    DO
                    BEGIN
                    NUMEROIT = PREFIT || NUMIT;
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :ABONOIT, 0, 0, :NIT, :PROY, :CENTRO, NULL, :NUMEROIT, NULL, NULL, :TIPOIT, 0);
                    NROI = NROI + 1;
                    END
                END
            if (TIPOCUEN = 'N') then
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :DEBITO, :CREDITO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            END /* SUMA EN CARTERA */
        if (BASE = 'D') then
            BEGIN
            CTABASE = NULL;
            FOR SELECT EGDE_TIPODOC, EGDE_IDDOC, EGDE_PREFIJO, EGDE_NUMERO, EGDE_ABONO
                FROM EGRESOS_DETALLE WHERE EGRE_ID = :IDDOC INTO :tipoit, :IDIT, :PREFIT, :NUMIT, :suma
                DO
                BEGIN
                if (TIPOIT <> 55) then
                    SELECT CUEN_COD, PROY_COD, CENT_COD FROM COMPROBANTE_ENCABEZADO E, COMPROBANTE_DETALLE D
                        WHERE E.enco_consec = D.enco_consec AND E.enco_tiporef = :TIPOIT AND E.enco_idref = :IDIT AND
                        SUBSTR(CUEN_COD,1,1) = '2' AND SUBSTR(CUEN_COD,1,3) <> '236' AND SUBSTR(CUEN_COD,1,4) <> '2408'
                        INTO :ctabase, :proy, :centro;
                else
                    /* tome la base de la configuración y el c.costo del prefijo del recibo */
                    execute procedure lee_configuracion('CAJA', 'EGRESOS', 'CUENTA CONTABLE PARA LOS ANTICIPOS A ACREEDORES SI LA INTERFAZ ES POR DOCUMENTO') returning_values (ctabase);

                CUENTA = NULL;
                EXECUTE PROCEDURE VALIDE_CUENTA_C (ctabase) RETURNING_VALUES (:OK);
                IF (OK = 0) THEN
                    SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                        WHERE CUEN_COD = :CTABASE INTO :CUENTA, :TIPOCUEN;
                ELSE
                    begin
                    EXECUTE PROCEDURE ERROR (62, :IDDOC, :CTABASE, 2);
                    CUENTA = CTABASE;
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    end
                if (SUMA < 0) then
                    BEGIN
                    CREDITO = SUMA * -1;
                    DEBITO = 0;
                    END
                ELSE
                    BEGIN
                    CREDITO = 0;
                    DEBITO = SUMA;
                    END
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    /* DEBERIA RECORRER DOCUMENTO POR DOCUMENTO */
                    NUMEROIT = PREFIT || NUMIT;
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :debito, :credito, 0, 0, :NIT, :PROY, :CENTRO, NULL, :NUMEROIT, NULL, NULL, :TIPOIT, 0);
                    END
                if (TIPOCUEN = 'N') then
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :DEBITO, :CREDITO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                END /* SUMA EN CARTERA */
            END
        END
    /* recorra las cuentas adicionales */
    FOR SELECT INJC_CUENTA, INJC_BASE, INJC_PORC, INJC_VALOR, INJC_DB
        FROM INTERFAZ_CAJA_CTAS
        WHERE INCJ_ID = :IDINTER
        INTO :CTADIC, :BASEADIC, :PORCADIC, :VALORADIC, :DBADIC
        DO
        BEGIN
        if (:BASEADIC = 'TOTAL') then
            VALORADIC = VRTOTAL;
        if (:BASEADIC = 'DESCUENTO') then
            VALORADIC = VRDTO;
        if (:BASEADIC = 'RTFTE') then
            VALORADIC = VRRTFTE;
        if (:BASEADIC = 'RTIVA') then
            VALORADIC = VRRTIVA;
        if (:BASEADIC = 'RTICA') then
            VALORADIC = VRRTICA;
        MONTO = VALORADIC * PORCADIC;
        CUENTA = NULL;
        EXECUTE PROCEDURE VALIDE_CUENTA_C (CTADIC) RETURNING_VALUES (:OK);
        IF (OK = 0) THEN
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTADIC INTO :CUENTA, :TIPOCUEN;
        ELSE
            begin
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :CTADIC, 2);
            CUENTA = CTADIC;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 4);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            if (DBADIC = 'S') then
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTADIC, :CONC, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            ELSE
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTADIC, :CONC, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            END
        NROI = NROI + 1;
        END
    if (ERROR > 0) then
        VER = 'S';
    SUSPEND;
    END /* EXISTE LA INTERFAZ */
  ELSE
    BEGIN
    EXECUTE PROCEDURE ERROR (62, :IDDOC, :PREF, 1);
    ERROR = ERROR + 1;
    VER = 'S';
    SUSPEND;
    END
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE EGRESOS_SIN_CONTABILIDAD(
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    ID INTEGER,
    IDI INTEGER,
    IDC INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    ESTADO VARCHAR(20),
    ERROR INTEGER)
AS
DECLARE VARIABLE VER CHAR(2);
declare variable FECICNT VARCHAR(10);
declare variable FECFCNT VARCHAR(10);
declare variable idref INTEGER;
BEGIN /*$$IBE$$ 
EXECUTE PROCEDURE fecha_a_conta(FECINI) returning_values (FECICNT);
EXECUTE PROCEDURE fecha_a_conta(FECFIN) returning_values (FECFCNT);
FOR SELECT EGRE_ID, PREF_PRE, egre_numero FROM EGRESOS WHERE EGRE_ANULADO = 'N' AND PREF_PRE <> 'R004' AND
    EGRE_FECHA >= :FECINI AND EGRE_FECHA <= :FECFIN ORDER BY EGRE_ID INTO :ID, :PREF, :NUMERO
DO
  BEGIN
  idref = null;
  SELECT ENCO_IDREF FROM COMPROBANTE_ENCABEZADO WHERE ENCO_TIPOREF = 62 AND ENCO_FECHA >= :FECICNT AND ENCO_FECHA <= :FECFCNT and ENCO_IDREF = :ID into :idref;
  if (idref IS NULL) then
  begin
   ESTADO = 'PROCESANDO';
   SUSPEND;
   SELECT MAX(INCJ_ID) FROM INTERFAZ_CAJA WHERE PREF_PRE = :PREF AND TIDO_COD = 62 INTO :IDI;
   EXECUTE PROCEDURE CONTABIL_EGRESO (:ID, :IDI) RETURNING_VALUES (:ERROR, :VER, :IDC);
   IF (ERROR = 0) THEN
      BEGIN
      EXECUTE PROCEDURE CONTABILIZA_PENDIENTE (:IDC);
      ESTADO = 'OK';
      END
   ELSE
    ESTADO = 'ERROR';
   suspend;
  end
  END
 $$IBE$$*/ SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE EGRESOS_SIN_CONTABILIDAD(
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    ID INTEGER,
    IDI INTEGER,
    IDC INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    ESTADO VARCHAR(20),
    ERROR INTEGER)
AS
DECLARE VARIABLE VER CHAR(2);
declare variable FECICNT VARCHAR(10);
declare variable FECFCNT VARCHAR(10);
declare variable idref INTEGER;
BEGIN
EXECUTE PROCEDURE fecha_a_conta(FECINI) returning_values (FECICNT);
EXECUTE PROCEDURE fecha_a_conta(FECFIN) returning_values (FECFCNT);
FOR SELECT EGRE_ID, PREF_PRE, egre_numero FROM EGRESOS WHERE EGRE_ANULADO = 'N' AND PREF_PRE <> 'R004' AND
    EGRE_FECHA >= :FECINI AND EGRE_FECHA <= :FECFIN ORDER BY EGRE_ID INTO :ID, :PREF, :NUMERO
DO
  BEGIN
  idref = null;
  SELECT ENCO_IDREF FROM COMPROBANTE_ENCABEZADO WHERE ENCO_TIPOREF = 62 AND ENCO_FECHA >= :FECICNT AND ENCO_FECHA <= :FECFCNT and ENCO_IDREF = :ID into :idref;
  if (idref IS NULL) then
  begin
   ESTADO = 'PROCESANDO';
   SUSPEND;
   SELECT MAX(INCJ_ID) FROM INTERFAZ_CAJA WHERE PREF_PRE = :PREF AND TIDO_COD = 62 INTO :IDI;
   EXECUTE PROCEDURE CONTABIL_EGRESO (:ID, :IDI) RETURNING_VALUES (:ERROR, :VER, :IDC);
   IF (ERROR = 0) THEN
      BEGIN
      EXECUTE PROCEDURE CONTABILIZA_PENDIENTE (:IDC);
      ESTADO = 'OK';
      END
   ELSE
    ESTADO = 'ERROR';
   suspend;
  end
  END
END

^

SET TERM ; ^


/* 20090414B */
/* restringir las cantidades negativas en ventas */
INSERT INTO CONFIGURACION (CONF_MODULO, CONF_CATEGORIA, CONF_PROPIEDAD, CONF_VALOR, CONF_POSIBLES, CONF_AYUDA) VALUES ('FACTURACION', 'DOCUMENTOS', 'PERMITIR CANTIDADES NEGATIVAS EN DOCUMENTOS', 'NO', 'SI,NO', 'SI: Permite registrar un item con cantidad negativa. NO: No se permite una cantidad negativa en los items de los documentos de ventas');
commit work;


/* 20090414C */
/* DESDE LA ACTUALIZACION DEL TRM SE PERDIO EL NO AFECTAR LA CARTERA CON DEV. SOBRE REMISION */
SET TERM ^ ;

CREATE OR ALTER TRIGGER DEVOLUCIONES_VENTAS_AI FOR DEVOLUCIONES_VENTAS
ACTIVE AFTER INSERT POSITION 0
AS
declare variable CONC VARCHAR(60);
BEGIN
if ((NEW.DEVT_ID <> 0) and (new.devt_anulado = 'N')) then
    BEGIN
    if ((new.devt_remid IS NULL) or (new.devt_remid = 0) ) then
        begin
        /* Registre el nuevo saldo del documento */
        INSERT INTO SALDOS_DOC_CARTERA (SDCA_TIPOREF, SDCA_IDREF, SDCA_FECHA, TERC_NIT, SDCA_RTFTE, SDCA_RTIVA, SDCA_RTICA, SDCA_ABONO, SDCA_ABRTFTE, SDCA_ABRTIVA, SDCA_ABRTICA, SDCA_DEBITO, SDCA_MONTO, SDCA_TRM)
            VALUES (33, NEW.DEVT_ID, NEW.DEVT_fecha, NEW.terc_nit, (NEW.DEVT_rtftemonto*-1), (NEW.DEVT_rtivamonto*-1), (NEW.DEVT_rticamonto*-1), 0, 0, 0, 0, 'N', (NEW.DEVT_TOTAL*-1), new.devt_trm);
        /* Registre el movimiento del cliente */
        CONC = 'DEVOLUCION VENTA No.' || NEW.PREF_PRE || NEW.DEVT_NUMERO || ' EN FACTURA ' || NEW.devt_factura;
        INSERT INTO MOVIMIENTO_CLIENTES (MVCL_ID, TERC_NIT, MVCL_TIPOREF, MVCL_IDREF, MVCL_FECHA, MVCL_VENCE, MVCL_CONC, MVCL_MONTO, MVCL_RTEFTE, MVCL_RTEIVA, MVCL_RTEICA, MVCL_DEBITO, MVCL_ABONO, MVCL_PREFREF, MVCL_NUMREF, MVCL_SUCURSAL, COBR_COD, MVCL_TRM)
          VALUES (GEN_ID(ID_MOVCLI, 1), NEW.TERC_NIT, 33, NEW.DEVT_ID, NEW.DEVT_FECHA, NEW.DEVT_FECHA, :CONC, NEW.DEVT_TOTAL, NEW.DEVT_RTFTEMONTO, NEW.DEVT_RTIVAMONTO, NEW.DEVT_RTICAMONTO, 'N', 'N', NEW.pref_pre, NEW.DEVT_numero, NEW.devt_sucursal, NEW.cobr_cod, new.devt_trm);
        end
    /* ACTUALICE LA CONSOLIDACION */
    if (NEW.DEVT_CONSOLIDA <> 0) then
        UPDATE consolidado_faltantes SET COFA_IDDES = NEW.devt_id, COFA_OK = 'S' WHERE COFA_ID = NEW.devt_consolida;
    INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
        VALUES (USER, 33, NEW.devt_id, 'I', NEW.pref_pre || NEW.devt_numero);
    END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER DEVOLUCIONES_VENTAS_AU FOR DEVOLUCIONES_VENTAS
ACTIVE AFTER UPDATE POSITION 0
AS
declare variable ABONOS integer;
declare variable CONC VARCHAR(60);
declare variable consec INTEGER;
BEGIN
if (new.devt_anulado = 'S') then
    begin
    select enco_consec from comprobante_encabezado where enco_tiporef = 33 and enco_idref = old.devt_id into :consec;
    if (NOT consec is null) then
      delete from comprobante_detalle where enco_consec = :consec;
    delete from comprobante_encabezado where enco_tiporef = 33 and enco_idref = old.devt_id;

    DELETE FROM puntos_cliente WHERE PTCL_TIPODOC = 33 AND PTCL_IDDOC = OLD.devt_id;

    INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
        VALUES (USER, 33, NEW.devt_id, 'A', NEW.pref_pre || NEW.devt_numero);
    end
if ((old.DEVT_id <> 0) and (old.devt_anulado = 'N')) then
    begin
    if ((old.devt_remid = 0) or (old.devt_remid is null))  then
        begin
        /* Verifique si habia abonos a la nota */
        ABONOS = 0;
        select COUNT(*) FROM SALDOS_DOC_CARTERA WHERE SDCA_TIPOREF = 33 AND SDCA_IDREF = OLD.DEVT_ID AND SDCA_ABONO <> 0 INTO :ABONOS;
        if (ABONOS = 0) then
            BEGIN
            /* BORRE EL REGISTRO PREVIO */
            delete from saldos_doc_cartera where sdca_tiporef = 33 and sdca_idref = old.devt_id;
            delete from movimiento_clientes where (mvcl_tiporef = 33) and (mvcl_idref = old.devt_id);

            /* ACTUALICE LA CONSOLIDACION */
            if (OLD.DEVT_CONSOLIDA <> 0) then
                UPDATE consolidado_faltantes SET COFA_OK = 'N' WHERE COFA_ID = old.devt_consolida;
            END
        else
            exception DOCUMENTO_CON_ABONOS 'La devolución ' || old.pref_pre || old.devt_numero || ' tiene abonos registrados.';
        end
    else
        if (OLD.DEVT_CONSOLIDA <> 0) then
            UPDATE consolidado_faltantes SET COFA_OK = 'N' WHERE COFA_ID = old.devt_consolida;
    END
if ((new.DEVT_id <> 0) and (new.devt_anulado = 'N')) then
    BEGIN
    if ((new.devt_remid = 0) or (new.devt_remid is null))  then
        begin
        /* Registre el nuevo saldo del documento */
        INSERT INTO SALDOS_DOC_CARTERA (SDCA_TIPOREF, SDCA_IDREF, SDCA_FECHA, TERC_NIT, SDCA_RTFTE, SDCA_RTIVA, SDCA_RTICA, SDCA_ABONO, SDCA_ABRTFTE, SDCA_ABRTIVA, SDCA_ABRTICA, SDCA_DEBITO, SDCA_MONTO, SDCA_TRM)
            VALUES (33, NEW.DEVT_ID, NEW.DEVT_fecha, NEW.terc_nit, (NEW.DEVT_rtftemonto*-1), (NEW.DEVT_rtivamonto*-1), (NEW.DEVT_rticamonto*-1), 0, 0, 0, 0, 'N', (NEW.DEVT_TOTAL*-1), NEW.devt_trm);
        /* Registre el movimiento del cliente */
        CONC = 'DEVOLUCION VENTA No.' || NEW.PREF_PRE || NEW.DEVT_NUMERO || ' EN FACTURA ' || NEW.devt_factura;
        INSERT INTO MOVIMIENTO_CLIENTES (MVCL_ID, TERC_NIT, MVCL_TIPOREF, MVCL_IDREF, MVCL_FECHA, MVCL_VENCE, MVCL_CONC, MVCL_MONTO, MVCL_RTEFTE, MVCL_RTEIVA, MVCL_RTEICA, MVCL_DEBITO, MVCL_ABONO, MVCL_PREFREF, MVCL_NUMREF, MVCL_SUCURSAL, COBR_COD, MVCL_TRM)
            VALUES (GEN_ID(ID_MOVCLI, 1), NEW.TERC_NIT, 33, NEW.DEVT_ID, NEW.DEVT_FECHA, NEW.DEVT_FECHA, :CONC, NEW.DEVT_TOTAL, NEW.DEVT_RTFTEMONTO, NEW.DEVT_RTIVAMONTO, NEW.DEVT_RTICAMONTO, 'N', 'N', NEW.pref_pre, NEW.DEVT_numero, NEW.devt_sucursal, NEW.cobr_cod, NEW.devt_trm);
        /* ACTUALICE LA CONSOLIDACION */
        if (NEW.DEVT_CONSOLIDA <> 0) then
            UPDATE consolidado_faltantes SET COFA_IDDES = NEW.devt_id, COFA_OK = 'S' WHERE COFA_ID = NEW.devt_consolida;
        end
    INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
        VALUES (USER, 33, NEW.devt_id, 'U', NEW.pref_pre || NEW.devt_numero);
    END
/* si cambio un dato critico actualice el detalle */
if ((OLD.devt_fecha <> NEW.devt_fecha) or
    (OLD.devt_numero <> NEW.devt_numero) or
    (OLD.pref_pre <> NEW.pref_pre) or
    (OLD.devt_factid <> NEW.devt_factid)) then
    UPDATE DEVOLUCIONES_VENTAS_DETALLE
        SET DVDE_TRANSMIT = 'N'
        WHERE DEVT_ID = NEW.DEVT_ID;
/* ACTUALICE EL ANULADO EN LOS DETALLES */
if (OLD.DEVT_anulado <> NEW.DEVT_anulado) then
    UPDATE DEVOLUCIONES_VENTAS_DETALLE
        SET DVDE_ANULADO = NEW.DEVT_anulado
        WHERE DEVT_ID = NEW.DEVT_ID;
if (OLD.devt_transmit <> NEW.devt_transmit) then
    UPDATE DEVOLUCIONES_VENTAS_DETALLE
        SET DVDE_TRANSMIT = NEW.devt_transmit
        WHERE DEVT_ID = NEW.DEVT_ID;
END
^

SET TERM ; ^


/* 20090414D */
/* SE REPETIA EL STAND EN ARTICULOS QUE NO LO TIENEN */
SET TERM ^ ;

CREATE OR ALTER PROCEDURE EXISTENCIAS_DESDE_HASTA(
    FECHA DATE,
    ARTINI VARCHAR(20),
    ARTFIN VARCHAR(20),
    GRPINI VARCHAR(3),
    GRPFIN VARCHAR(3),
    BODINI VARCHAR(2),
    BODFIN VARCHAR(2),
    ORDEN CHAR(1),
    AGRUPA CHAR(1),
    DETALLE CHAR(1),
    RESERVA CHAR(1),
    ENPESO CHAR(1),
    SUCURSAL INTEGER)
RETURNS (
    CANT NUMERIC(18,4),
    COSTO NUMERIC(18,2),
    COSTO_LOTE NUMERIC(18,2),
    CODIGO VARCHAR(15),
    NOMBRE VARCHAR(60),
    UNIDAD VARCHAR(8),
    STAND VARCHAR(15),
    CODGRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    CODSUBG VARCHAR(3),
    NOMSUBG VARCHAR(30),
    CODMARC VARCHAR(3),
    NOMMARC VARCHAR(30),
    CODBOD VARCHAR(2),
    LOTE VARCHAR(15),
    NOMBOD VARCHAR(30),
    COSTOTOT NUMERIC(18,2),
    ULTCOSTO NUMERIC(18,2),
    FECHACOSTO DATE,
    CONSUMO NUMERIC(18,2),
    RESERVADO NUMERIC(18,4),
    ORDENADO NUMERIC(18,4),
    IVA NUMERIC(9,2),
    PESOUNIT NUMERIC(18,4),
    PESOTOTAL NUMERIC(18,4),
    CODBAR VARCHAR(20))
AS
declare variable exist char(1);
declare variable codini varchar(20);
declare variable codfin varchar(20);
declare variable desini varchar(20);
declare variable desfin varchar(20);
declare variable ordenc numeric(18,4);
declare variable pedido numeric(18,4);
declare variable ok char(1);
declare variable id integer;
declare variable item integer;
declare variable und varchar(8);
declare variable factor numeric(18,4);
declare variable cant2 numeric(18,4);
declare variable PEDAUTO CHAR(2);
BEGIN
if (ORDEN = 'C') then
    BEGIN
    CODINI = ARTINI;
    CODFIN = ARTFIN;
    DESINI = '';
    DESFIN = 'zz';
    END
ELSE
    BEGIN
    DESINI = ARTINI;
    DESFIN = ARTFIN;
    CODINI = '';
    CODFIN = 'zz';
    END
EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION', 'FACTURAS', 'GENERAR PEDIDO AUTOMATICAMENTE CON LA FACTURA') returning_values (pedauto);
if (DETALLE = 'B') then
  BEGIN
  FOR SELECT ARTI_COD, ARTI_DES, ARTI_UNIDAD, ARTI_EXIST, TAIV_PORC, A.GRUP_COD, A.SUBG_COD, A.MARC_COD, BODE_COD, BODE_NOM, ARTI_CONSUMO, ARTI_PESO/1000
      FROM ARTICULO A, BODEGA B, TARIFA_IVA T
      WHERE ARTI_COD >= :CODINI AND ARTI_COD <= :CODFIN AND ARTI_DES >= :DESINI AND ARTI_DES <= :DESFIN AND ESAR_COD <> 'I' AND BODE_COD >= :BODINI AND
      BODE_COD <= :BODFIN AND ((SUCU_ID = :SUCURSAL) or (:SUCURSAL = 0)) AND A.TAIV_COD = T.TAIV_COD
      INTO :CODIGO, :NOMBRE, :UNIDAD, :EXIST, :IVA, :CODGRUPO, :CODSUBG, :CODMARC, :CODBOD, :NOMBOD, :CONSUMO, :pesounit
      DO
        BEGIN
        STAND = '';
        OK = 'N';
        if (AGRUPA = 'G') then
            BEGIN
            if ((CODGRUPO >= GRPINI) AND (CODGRUPO <= GRPFIN)) then
                OK = 'S';
            end
        ELSE
            if (AGRUPA = 'M') then
                BEGIN
                if ((CODMARC >= GRPINI) AND (CODMARC <= GRPFIN)) then
                    OK = 'S';
                END
        if (OK = 'S') then
            BEGIN
            NOMGRUPO = '';
            NOMMARC = '';
            NOMSUBG = '';
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            SELECT MAX(COBA_COD) FROM BARRAS_ARTICULO WHERE ARTI_COD = :codigo AND COBA_UNIDAD = :unidad INTO :codbar;
            if (CODBAR IS NULL) then
                CODBAR = CODIGO;
            if (EXIST <> 'N') then
                BEGIN
                SELECT STAND_COD FROM STANDS WHERE ARTI_COD = :CODIGO AND STAND_BODEGA = :CODBOD INTO :STAND;
                EXECUTE PROCEDURE SALDO_INICIAL_INVENTARIO(CODIGO, FECHA, :CODBOD) returning_values (CANT);
                EXECUTE PROCEDURE COSTO_PROMEDIO_UNIDAD(CODIGO, FECHA, UNIDAD) returning_values (COSTO);
                EXECUTE PROCEDURE ULTIMO_COSTO(CODIGO, FECHA, UNIDAD) returning_values (ULTCOSTO);
                SELECT MAX(MVAR_FECHA) FROM MOVIMIENTO_ARTICULO WHERE ARTI_COD = :CODIGO AND MVAR_ENTRADA = 'S' AND MVAR_FECHA <= :FECHA INTO :FECHACOSTO;
                COSTOTOT = :CANT * :COSTO;
                CONSUMO = CONSUMO * CANT;
                if (RESERVA = 'S') then
                    BEGIN
                    SELECT SUM(ORID_ENTREGAR)
                        FROM ORDENINVENTARIO_DETALLE OD, ordenes_inventario O
                        WHERE O.ORIN_ID = OD.ORIN_ID AND ARTI_COD = :CODIGO AND ORIN_FECHA <= :FECHA AND ORIN_FECLLEGA >= :FECHA AND ORID_ANULADO = 'N' AND OD.BODE_COD = :CODBOD
                        INTO :ORDENADO;
                    if (ORDENADO IS NULL) then
                        ORDENADO = 0;
                    ORDENC = 0;
                    FOR SELECT O.ORDC_ID, OCDE_ITEM, OCDE_CANT * OCDE_FACTOR
                        FROM ORDENES_COMPRA O, ORDENES_COMPRA_DETALLE OD
                        WHERE O.ORDC_ID = OD.ORDC_ID AND OD.ARTI_COD = :CODIGO AND (ORDC_FECHA+ORDC_VALIDEZ) >= :FECHA AND ORDC_FECHA <= :FECHA AND OCDE_ANULADO = 'N' AND OD.BODE_COD = :CODBOD
                        INTO :ID, :ITEM, :CANT2
                        do
                        BEGIN
                        EXECUTE PROCEDURE FALTANTE(23, 21, ID, ITEM) returning_values (PEDIDO, UND, FACTOR);
                        if (PEDIDO * FACTOR = CANT2) then /* SI NO SE HA FACTURADO MIRE A VER SI SE REMISIONO */
                            EXECUTE PROCEDURE FALTANTE(23, 22, ID, ITEM) returning_values (PEDIDO, UND, FACTOR);
                        if (PEDIDO IS NULL) then
                            PEDIDO = 0;
                        ORDENC = ORDENC + PEDIDO * FACTOR;
                        END
                    ORDENADO = ORDENADO + ORDENC;
                    SELECT SUM(RSDE_LIBERAR)
                        FROM RESERVAS_DETALLE RD, RESERVAS R
                        WHERE R.RESE_ID = RD.RESE_ID AND ARTI_COD = :CODIGO AND RESE_FECHA <= :FECHA AND RESE_VENCE >= :FECHA AND RD.BODE_COD = :CODBOD AND RSDE_ANULADO = 'N'
                        INTO :RESERVADO;
                    if (RESERVADO IS NULL) then
                        RESERVADO = 0;
                    PEDIDO = 0;
                    FOR SELECT P.PEDI_ID, PEDE_ITEM, PEDE_CANT * PEDE_FACTOR
                        FROM PEDIDOS P, PEDIDOS_DETALLE PD
                        WHERE P.PEDI_ID = PD.PEDI_ID AND PD.ARTI_COD = :CODIGO AND (PEDI_FECHA+PEDI_VALIDEZ) >= :FECHA AND PEDI_FECHA <= :FECHA AND PEDE_ANULADO = 'N' AND BODE_COD = :CODBOD
                        INTO :ID, :ITEM, :CANT2
                        do
                        BEGIN
                        EXECUTE PROCEDURE FALTANTE(34, 31, ID, ITEM) returning_values (ORDENC, UND, FACTOR);
                        if ((ORDENC * FACTOR = CANT2) or (PEDAUTO = 'SI')) then /* SI NO SE HA FACTURADO MIRE A VER SI SE REMISIONO */
                            EXECUTE PROCEDURE FALTANTE(34, 32, ID, ITEM) returning_values (ORDENC, UND, FACTOR);
                        if (ORDENC IS NULL) then
                            ORDENC = 0;
                        PEDIDO = PEDIDO + ORDENC * FACTOR;
                        END
                    RESERVADO = RESERVADO + PEDIDO;
                    END
                ELSE
                    BEGIN
                    RESERVADO = 0;
                    ORDENADO = 0;
                    END
                if (ENPESO = 'S') then
                    BEGIN
                    if (pesounit IS NULL) then
                        pesounit = 0;
                    if (PESOUNIT <> 0) then
                        BEGIN
                        pesototal = PESOUNIT * cant;
                        SUSPEND;
                        END
                    END
                ELSE
                    SUSPEND;
                END
            END
        END
  END

if (DETALLE = 'L') then
  BEGIN
  FOR SELECT A.ARTI_COD, ARTI_DES, ARTI_UNIDAD, ARTI_EXIST, TAIV_PORC, A.GRUP_COD, A.SUBG_COD, A.MARC_COD, L.lote_nro, L.lote_nro||' - '||L.lote_vence, ARTI_CONSUMO,l.bode_cod, L.lote_saldo,l.lote_costo, ARTI_PESO/1000
      FROM ARTICULO A, LOTES l, TARIFA_IVA T
      WHERE A.ARTI_COD >= '0' AND A.ARTI_COD <= 'zz' AND ARTI_DES >= '' AND ARTI_DES <= 'zz' AND ESAR_COD <> 'I' AND A.TAIV_COD = T.TAIV_COD and a.arti_cod = l.arti_cod
      INTO :CODIGO, :NOMBRE, :UNIDAD, :EXIST, :IVA, :CODGRUPO, :CODSUBG, :CODMARC, :LOTE, :NOMBOD, :CONSUMO, :codbod, :cant, :costo_lote, :pesounit
      DO
        BEGIN
        OK = 'N';
        if (AGRUPA = 'G') then
            BEGIN
            if ((CODGRUPO >= GRPINI) AND (CODGRUPO <= GRPFIN)) then
                OK = 'S';
            end
        ELSE
            if (AGRUPA = 'M') then
                BEGIN
                if ((CODMARC >= GRPINI) AND (CODMARC <= GRPFIN)) then
                    OK = 'S';
                END
        if (OK = 'S') then
            BEGIN
            NOMGRUPO = '';
            NOMMARC = '';
            NOMSUBG = '';
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            SELECT MAX(COBA_COD) FROM BARRAS_ARTICULO WHERE ARTI_COD = :codigo AND COBA_UNIDAD = :unidad INTO :codbar;
            if (CODBAR IS NULL) then
                CODBAR = CODIGO;

            if (EXIST <> 'N') then
                BEGIN
                EXECUTE PROCEDURE COSTO_PROMEDIO_UNIDAD(CODIGO, FECHA, UNIDAD) returning_values (COSTO);
                EXECUTE PROCEDURE ULTIMO_COSTO(CODIGO, FECHA, UNIDAD) returning_values (ULTCOSTO);
                SELECT MAX(MVAR_FECHA) FROM MOVIMIENTO_ARTICULO WHERE ARTI_COD = :CODIGO AND MVAR_ENTRADA = 'S' AND MVAR_FECHA <= :FECHA INTO :FECHACOSTO;
                COSTOTOT = :CANT * :COSTO;
                CONSUMO = CONSUMO * CANT;
                if (RESERVA = 'S') then
                    BEGIN
                    SELECT SUM(ORID_ENTREGAR)
                        FROM ORDENINVENTARIO_DETALLE OD, ordenes_inventario O
                        WHERE O.ORIN_ID = OD.ORIN_ID AND ARTI_COD = :CODIGO AND ORIN_FECHA <= :FECHA AND ORIN_FECLLEGA >= :FECHA AND ORID_ANULADO = 'N'
                        INTO :ORDENADO;
                    if (ORDENADO IS NULL) then
                        ORDENADO = 0;
                    ORDENC = 0;
                    FOR SELECT O.ORDC_ID, OCDE_ITEM, OCDE_CANT * OCDE_FACTOR
                        FROM ORDENES_COMPRA O, ORDENES_COMPRA_DETALLE OD
                        WHERE O.ORDC_ID = OD.ORDC_ID AND OD.ARTI_COD = :CODIGO AND (ORDC_FECHA+ORDC_VALIDEZ) >= :FECHA AND ORDC_FECHA <= :FECHA AND OCDE_ANULADO = 'N'
                        INTO :ID, :ITEM, :CANT2
                        do
                        BEGIN
                        EXECUTE PROCEDURE FALTANTE(23, 21, ID, ITEM) returning_values (PEDIDO, UND, FACTOR);
                        if (PEDIDO * FACTOR = CANT2) then /* SI NO SE HA FACTURADO MIRE A VER SI SE REMISIONO */
                            EXECUTE PROCEDURE FALTANTE(23, 22, ID, ITEM) returning_values (PEDIDO, UND, FACTOR);
                        if (PEDIDO IS NULL) then
                            PEDIDO = 0;
                        ORDENC = ORDENC + PEDIDO * FACTOR;
                        END
                    ORDENADO = ORDENADO + ORDENC;
                    SELECT SUM(RSDE_LIBERAR)
                        FROM RESERVAS_DETALLE RD, RESERVAS R
                        WHERE R.RESE_ID = RD.RESE_ID AND ARTI_COD = :CODIGO AND RESE_FECHA <= :FECHA AND RESE_VENCE >= :FECHA AND RSDE_ANULADO = 'N'
                        INTO :RESERVADO;
                    if (RESERVADO IS NULL) then
                        RESERVADO = 0;
                    PEDIDO = 0;
                    FOR SELECT P.PEDI_ID, PEDE_ITEM, PEDE_CANT * PEDE_FACTOR
                        FROM PEDIDOS P, PEDIDOS_DETALLE PD
                        WHERE P.PEDI_ID = PD.PEDI_ID AND PD.ARTI_COD = :CODIGO AND (PEDI_FECHA+PEDI_VALIDEZ) >= :FECHA AND PEDI_FECHA <= :FECHA AND PEDE_ANULADO = 'N'
                        INTO :ID, :ITEM, :CANT2
                        do
                        BEGIN
                        EXECUTE PROCEDURE FALTANTE(34, 31, ID, ITEM) returning_values (ORDENC, UND, FACTOR);
                        if ((ORDENC * FACTOR = CANT2) or (PEDAUTO = 'SI')) then /* SI NO SE HA FACTURADO MIRE A VER SI SE REMISIONO */
                            EXECUTE PROCEDURE FALTANTE(34, 32, ID, ITEM) returning_values (ORDENC, UND, FACTOR);
                        if (ORDENC IS NULL) then
                            ORDENC = 0;
                        PEDIDO = PEDIDO + ORDENC * FACTOR;
                        END
                    RESERVADO = RESERVADO + PEDIDO;
                    END
                ELSE
                    BEGIN
                    RESERVADO = 0;
                    ORDENADO = 0;
                    END
                if (ENPESO = 'S') then
                    BEGIN
                    if (pesounit IS NULL) then
                        pesounit = 0;
                    if (PESOUNIT <> 0) then
                        BEGIN
                        pesototal = PESOUNIT * cant;
                        SUSPEND;
                        END
                    END
                ELSE
                    SUSPEND;
                END
            END
        END
  end
if (DETALLE = 'N') then
  BEGIN
  FOR SELECT ARTI_COD, ARTI_DES, ARTI_UNIDAD, ARTI_EXIST, TAIV_PORC, A.GRUP_COD, A.SUBG_COD, A.MARC_COD, ARTI_CONSUMO, ARTI_PESO/1000
      FROM ARTICULO A, TARIFA_IVA T
      WHERE ARTI_COD >= :CODINI AND ARTI_COD <= :CODFIN AND ARTI_DES >= :DESINI AND ARTI_DES <= :DESFIN AND ESAR_COD <> 'I' AND A.TAIV_COD = T.TAIV_COD
      INTO :CODIGO, :NOMBRE, :UNIDAD, :EXIST, :IVA, :CODGRUPO, :CODSUBG, :CODMARC, :CONSUMO, :pesounit
      DO
        BEGIN
        OK = 'N';
        if (AGRUPA = 'G') then
            BEGIN
            if ((GRPINI = '0') AND (GRPFIN = 'zz')) then
                OK = 'S';
            else
                if ((CODGRUPO >= GRPINI) AND (CODGRUPO <= GRPFIN)) then
                    OK = 'S';
            end
        ELSE
            if (AGRUPA = 'M') then
                BEGIN
                if ((GRPINI = '0') AND (GRPFIN = 'zzz')) then
                    OK = 'S';
                else
                    if ((CODMARC >= GRPINI) AND (CODMARC <= GRPFIN)) then
                        OK = 'S';
                END
        if (OK = 'S') then
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            SELECT MAX(COBA_COD) FROM BARRAS_ARTICULO WHERE ARTI_COD = :codigo AND COBA_UNIDAD = :unidad INTO :codbar;
            if (CODBAR IS NULL) then
                CODBAR = CODIGO;

            if (EXIST <> 'N') then
                BEGIN
                EXECUTE PROCEDURE SALDO_INICIAL_TOTAL_INV(CODIGO, FECHA) returning_values (CANT);
                EXECUTE PROCEDURE COSTO_PROMEDIO_UNIDAD(CODIGO, FECHA, UNIDAD) returning_values (COSTO);
                EXECUTE PROCEDURE ULTIMO_COSTO(CODIGO, FECHA, UNIDAD) returning_values (ULTCOSTO);
                SELECT MAX(MVAR_FECHA) FROM MOVIMIENTO_ARTICULO WHERE ARTI_COD = :CODIGO AND MVAR_ENTRADA = 'S' AND MVAR_FECHA <= :FECHA INTO :FECHACOSTO;
                COSTOTOT = :CANT * :COSTO;
                CONSUMO = CONSUMO * CANT;
                if (RESERVA = 'S') then
                    BEGIN
                    SELECT SUM(ORID_ENTREGAR)
                        FROM ORDENINVENTARIO_DETALLE OD, ordenes_inventario O
                        WHERE O.ORIN_ID = OD.ORIN_ID AND ARTI_COD = :CODIGO AND ORIN_FECHA <= :FECHA AND ORIN_FECLLEGA >= :FECHA AND ORID_ANULADO = 'N'
                        INTO :ORDENADO;
                        if (ORDENADO IS NULL) then
                            ORDENADO = 0;
                    ORDENC = 0;
                    FOR SELECT O.ORDC_ID, OCDE_ITEM, OCDE_CANT * OCDE_FACTOR
                        FROM ORDENES_COMPRA O, ORDENES_COMPRA_DETALLE OD
                        WHERE O.ORDC_ID = OD.ORDC_ID AND OD.ARTI_COD = :CODIGO AND (ORDC_FECHA+ORDC_VALIDEZ) >= :FECHA AND ORDC_FECHA <= :FECHA AND OCDE_ANULADO = 'N'
                        INTO :ID, :ITEM, :CANT2
                        do
                        BEGIN
                        EXECUTE PROCEDURE FALTANTE(23, 21, ID, ITEM) returning_values (PEDIDO, UND, FACTOR);
                        if (PEDIDO * FACTOR = CANT2) then /* SI NO SE HA FACTURADO MIRE A VER SI SE REMISIONO */
                            EXECUTE PROCEDURE FALTANTE(23, 22, ID, ITEM) returning_values (PEDIDO, UND, FACTOR);
                        if (PEDIDO IS NULL) then
                            PEDIDO = 0;
                        ORDENC = ORDENC + PEDIDO * FACTOR;
                        END
                    ORDENADO = ORDENADO + ORDENC;
                    SELECT SUM(RSDE_LIBERAR)
                        FROM RESERVAS_DETALLE RD, RESERVAS R
                        WHERE R.RESE_ID = RD.RESE_ID AND ARTI_COD = :CODIGO AND RESE_FECHA <= :FECHA AND RESE_VENCE >= :FECHA AND RSDE_ANULADO = 'N'
                        INTO :RESERVADO;
                    if (RESERVADO IS NULL) then
                        RESERVADO = 0;
                    PEDIDO = 0;
                    FOR SELECT P.PEDI_ID, PEDE_ITEM, PEDE_CANT * PEDE_FACTOR
                        FROM PEDIDOS P, PEDIDOS_DETALLE PD, PUNTO_VENTA PT
                        WHERE P.PEDI_ID = PD.PEDI_ID AND PD.ARTI_COD = :CODIGO AND PT.ptvt_id = P.PTVT_ID AND (PEDI_FECHA+PEDI_VALIDEZ) >= :FECHA AND PEDI_FECHA <= :FECHA AND PEDE_ANULADO = 'N'
                        INTO :ID, :ITEM, :CANT2
                        do
                        BEGIN
                        EXECUTE PROCEDURE FALTANTE(34, 31, ID, ITEM) returning_values (ORDENC, UND, FACTOR);
                        if ((ORDENC * FACTOR = CANT2) or (PEDAUTO = 'SI')) then /* SI NO SE HA FACTURADO MIRE A VER SI SE REMISIONO */
                            EXECUTE PROCEDURE FALTANTE(34, 32, ID, ITEM) returning_values (ORDENC, UND, FACTOR);
                        if (ORDENC IS NULL) then
                            ORDENC = 0;
                        PEDIDO = PEDIDO + ORDENC * FACTOR;
                        END
                    if (PEDIDO IS NULL) then
                        PEDIDO = 0;
                    RESERVADO = RESERVADO + PEDIDO;
                    END
                ELSE
                    BEGIN
                    RESERVADO = 0;
                    ORDENADO = 0;
                    END
                if (ENPESO = 'S') then
                    BEGIN
                    if (pesounit IS NULL) then
                        pesounit = 0;
                    if (PESOUNIT <> 0) then
                        BEGIN
                        pesototal = PESOUNIT * cant;
                        SUSPEND;
                        END
                    END
                ELSE
                    SUSPEND;
                END
            END
        END
  END
END
^

SET TERM ; ^


/* 20090414E */
/* se agregaron otras 5 formas de pago */
SET TERM ^ ;

CREATE OR ALTER PROCEDURE CUADRE_CAJA(
    FECHA DATE)
RETURNS (
    VTACONTADO NUMERIC(18,2),
    VTACREDITO NUMERIC(18,2),
    VTATOTAL NUMERIC(18,2),
    VTARETS NUMERIC(18,2),
    DEVCONTADO NUMERIC(18,2),
    DEVCREDITO NUMERIC(18,2),
    DEVTOTAL NUMERIC(18,2),
    DEVOTRODIA NUMERIC(18,2),
    DEVRETS NUMERIC(18,2),
    NETOCONTADO NUMERIC(18,2),
    NETOCREDITO NUMERIC(18,2),
    NETOTOTAL NUMERIC(18,2),
    NETORETS NUMERIC(18,2),
    INGCONTADO NUMERIC(18,2),
    INGDESCTO NUMERIC(18,2),
    INGCXC NUMERIC(18,2),
    INGOTROS NUMERIC(18,2),
    INGTOTAL NUMERIC(18,2),
    EGRCXP NUMERIC(18,2),
    EGROTROS NUMERIC(18,2),
    EGRTOTAL NUMERIC(18,2),
    CONSIGNA NUMERIC(18,2),
    FORMAP1 NUMERIC(18,2),
    FORMAP2 NUMERIC(18,2),
    FORMAP3 NUMERIC(18,2),
    FORMAP4 NUMERIC(18,2),
    FORMAP5 NUMERIC(18,2),
    FORMAP6 NUMERIC(18,2),
    FORMAP7 NUMERIC(18,2),
    FORMAP8 NUMERIC(18,2),
    FORMAP9 NUMERIC(18,2),
    FORMAP0 NUMERIC(18,2))
AS
declare variable DEVDSCTOS NUMERIC(18,2);
declare variable APLIDEV NUMERIC(18,2);
declare variable APLIFAC NUMERIC(18,2);
declare variable IDDOC INTEGER;
declare variable FECDOC DATE;
declare variable APLICA NUMERIC(18,2);
begin
/* ventas totales */
SELECT SUM(FACT_TOTAL), SUM(FACT_RTFTEMONTO+FACT_RTIVAMONTO+FACT_RTICAMONTO) FROM FACTURAS WHERE FACT_FECHA = :FECHA AND FACT_ANULADO = 'N'
    INTO :VTATOTAL, :vtarets;
if (vtatotal IS NULL) then
    vtatotal = 0;
if (vtarets IS NULL) then
    vtarets = 0;
vtatotal = VTATOTAL - vtarets;
SELECT SUM(DEVT_TOTAL), SUM(DEVT_RTFTEMONTO+DEVT_RTIVAMONTO+DEVT_RTICAMONTO) FROM DEVOLUCIONES_VENTAS WHERE DEVT_FECHA = :FECHA AND DEVT_ANULADO = 'N'
    INTO :DEVTOTAL, :devrets;
if (devtotal IS NULL) then
    devtotal = 0;
if (devrets IS NULL) then
    devrets = 0;
devtotal = DEVTOTAL - DEVRETS;
/* ventas contado */
SELECT SUM(RCDE_ABONO), SUM(RCDE_DTOF) FROM RECIBOS_CAJA_DETALLE D, RECIBOS_CAJA R,  FACTURAS F
    WHERE FACT_FECHA = :FECHA AND D.rcde_tipodoc = 31 AND D.rcde_iddoc = F.fact_id AND R.reca_id = D.reca_id AND RECA_FECHA = :FECHA AND RCDE_ANULADO = 'N'
    INTO :vtacontado, :ingdescto;
SELECT SUM(RCDE_ABONO), SUM(RCDE_DTOF) FROM RECIBOS_CAJA_DETALLE D, RECIBOS_CAJA R,  DEVOLUCIONES_VENTAS V
    WHERE DEVT_FECHA = :FECHA AND D.rcde_tipodoc = 33 AND D.rcde_iddoc = V.devt_id AND R.reca_id = D.reca_id AND RECA_FECHA = :FECHA AND RCDE_ANULADO = 'N'
    INTO :devcontado, :devdsctos;
if (vtacontado IS NULL) then
    vtacontado = 0;
if (ingdescto IS NULL) then
    ingdescto = 0;
if (devcontado IS NULL) then
    devcontado = 0;
else
    devcontado = devcontado * -1;
if (devdsctos IS NULL) then
    devdsctos = 0;
SELECT SUM(ACDE_APLICADO) FROM APLICACION_CLIENTE_DETALLE D, APLICACION_CLIENTE R,  FACTURAS F
    WHERE FACT_FECHA = :FECHA AND D.acde_tipodoc = 31 AND D.acde_iddoc = F.fact_id AND R.apcl_id = D.apcl_id AND APCL_FECHA = :FECHA AND ACDE_ANULADO = 'N'
    INTO :aplifac;
if (APLIFAC IS NULL) then
    APLIFAC = 0;
vtacontado = vtacontado + aplifac;
/* DESGLOCE LAS DEV DE HOY DE LAS DE AYER */
APLIDEV = 0;
devotrodia = 0;
FOR SELECT D.acde_iddoc, ACDE_APLICADO FROM APLICACION_CLIENTE_DETALLE D, APLICACION_CLIENTE R
    WHERE R.apcl_id = D.apcl_id AND APCL_FECHA = :FECHA AND ACDE_ANULADO = 'N' AND D.acde_tipodoc = 33
    INTO :IDDOC, :aplica
    DO
    BEGIN
    SELECT DEVT_FECHA, DEVT_FACTID FROM DEVOLUCIONES_VENTAS WHERE DEVT_ID = :IDDOC INTO :FECDOC, :IDDOC;
    SELECT FACT_FECHA FROM FACTURAS WHERE FACT_ID = :IDDOC INTO :FECDOC;
    if (FECDOC = FECHA) then
        APLIDEV = APLIDEV + aplica;
    ELSE
        devotrodia = devotrodia + APLICA;
    END
aplidev = aplidev * -1;
devotrodia = devotrodia * -1;
devtotal = devtotal - devotrodia;
devcontado = devcontado + aplidev;
/* Ventas credito */
vtacredito = vtatotal - vtacontado;
devcredito = devtotal - devcontado;
netocontado = vtacontado - devcontado;
netocredito = vtacredito - devcredito;
netototal = vtatotal - devtotal;
netorets = vtarets - devrets;
/* recibos contado */
ingcontado = vtacontado - devcontado;
ingdescto = ingdescto - devdsctos;

/* recibos totales */
select sum(reca_monto) from recibos_caja where reca_fecha = :fecha AND RECA_ANULADO = 'N' into :ingtotal;
if (ingtotal IS NULL) then
    ingtotal = 0;
/* recibos otros */
select sum(reca_monto) from recibos_caja r where reca_fecha = :fecha AND RECA_ANULADO = 'N' and reca_id not in (select reca_id from recibos_caja_detalle) into :ingotros;
if (ingotros IS NULL) then
    ingotros = 0;
/* recibos cxc */
select sum(rcde_abono) from recibos_caja_detalle d, recibos_caja r,  movimiento_clientes m
    where r.reca_id = d.reca_id and r.reca_fecha = :fecha and d.rcde_tipodoc = m.mvcl_tiporef and d.rcde_iddoc = m.mvcl_idref AND RCDE_ANULADO = 'N' AND ((MVCL_TIPOREF <> 31 AND MVCL_TIPOREF <> 33) OR mvcl_fecha <> :fecha)
    into :ingcxc;
if (ingcxc IS NULL) then
    ingcxc = 0;

/* EGRESOS totales */
select sum(egca_monto) from egresos_caja c, egresos e where e.egre_id = c.egre_id and e.egre_fecha = :fecha AND EGCA_ANULADO = 'N' into :egrtotal;
if (egrtotal IS NULL) then
    egrtotal = 0;
/* EGRESOS otros */
select sum(egca_monto) from egresos_caja c, egresos e where e.egre_id = c.egre_id and e.egre_fecha = :fecha AND EGCA_ANULADO = 'N' and
    e.egre_id not in (select egre_id from egresos_detalle) into :egrotros;
if (egrotros IS NULL) then
    egrotros = 0;
/* EGRESOS cxp */
egrcxp = egrtotal - egrotros;

/* CONSIGNACIONES */
select sum(code_monto) from consigna_detalle d, consigna c
    where c.cons_id = d.cons_id and cons_fecha = :fecha AND CONS_ANULADO = 'N' into :consigna;
if (consigna IS NULL) then
    consigna = 0;

/* POR FORMA DE PAGO */
SELECT SUM(RCPA_MONTO) FROM RECIBOS_CAJA_PAGO P, RECIBOS_CAJA R
    WHERE R.RECA_ID = P.RECA_ID AND RECA_FECHA = :FECHA AND FOPA_ID = 1 and RECA_ANULADO = 'N'
    INTO :FORMAP1;
SELECT SUM(RCPA_MONTO) FROM RECIBOS_CAJA_PAGO P, RECIBOS_CAJA R
    WHERE R.RECA_ID = P.RECA_ID AND RECA_FECHA = :FECHA AND FOPA_ID = 2 and RECA_ANULADO = 'N'
    INTO :FORMAP2;
SELECT SUM(RCPA_MONTO) FROM RECIBOS_CAJA_PAGO P, RECIBOS_CAJA R
    WHERE R.RECA_ID = P.RECA_ID AND RECA_FECHA = :FECHA AND FOPA_ID = 3 and RECA_ANULADO = 'N'
    INTO :FORMAP3;
SELECT SUM(RCPA_MONTO) FROM RECIBOS_CAJA_PAGO P, RECIBOS_CAJA R
    WHERE R.RECA_ID = P.RECA_ID AND RECA_FECHA = :FECHA AND FOPA_ID = 4 and RECA_ANULADO = 'N'
    INTO :FORMAP4;
SELECT SUM(RCPA_MONTO) FROM RECIBOS_CAJA_PAGO P, RECIBOS_CAJA R
    WHERE R.RECA_ID = P.RECA_ID AND RECA_FECHA = :FECHA AND FOPA_ID = 5 and RECA_ANULADO = 'N'
    INTO :FORMAP5;
SELECT SUM(RCPA_MONTO) FROM RECIBOS_CAJA_PAGO P, RECIBOS_CAJA R
    WHERE R.RECA_ID = P.RECA_ID AND RECA_FECHA = :FECHA AND FOPA_ID = 6 and RECA_ANULADO = 'N'
    INTO :FORMAP6;
SELECT SUM(RCPA_MONTO) FROM RECIBOS_CAJA_PAGO P, RECIBOS_CAJA R
    WHERE R.RECA_ID = P.RECA_ID AND RECA_FECHA = :FECHA AND FOPA_ID = 7 and RECA_ANULADO = 'N'
    INTO :FORMAP7;
SELECT SUM(RCPA_MONTO) FROM RECIBOS_CAJA_PAGO P, RECIBOS_CAJA R
    WHERE R.RECA_ID = P.RECA_ID AND RECA_FECHA = :FECHA AND FOPA_ID = 8 and RECA_ANULADO = 'N'
    INTO :FORMAP8;
SELECT SUM(RCPA_MONTO) FROM RECIBOS_CAJA_PAGO P, RECIBOS_CAJA R
    WHERE R.RECA_ID = P.RECA_ID AND RECA_FECHA = :FECHA AND FOPA_ID = 9 and RECA_ANULADO = 'N'
    INTO :FORMAP9;
SELECT SUM(RCPA_MONTO) FROM RECIBOS_CAJA_PAGO P, RECIBOS_CAJA R
    WHERE R.RECA_ID = P.RECA_ID AND RECA_FECHA = :FECHA AND FOPA_ID = 10 and RECA_ANULADO = 'N'
    INTO :FORMAP0;
if (formap1 is null) then
    formap1 = 0;
if (formap2 is null) then
    formap2 = 0;
if (formap3 is null) then
    formap3 = 0;
if (formap4 is null) then
    formap4 = 0;
if (formap5 is null) then
    formap5 = 0;
if (formap6 is null) then
    formap6 = 0;
if (formap7 is null) then
    formap7 = 0;
if (formap8 is null) then
    formap8 = 0;
if (formap9 is null) then
    formap9 = 0;
if (formap0 is null) then
    formap0 = 0;
SUSPEND;
end
^

SET TERM ; ^



/* 20090414F */
/* IMPRESION DEL EXCEDENTE DEL PAGO */
SET TERM ^ ;

CREATE OR ALTER PROCEDURE IMPR_RECICAJA(
    ID INTEGER)
RETURNS (
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    NOMCAJA VARCHAR(60),
    CODCOBR INTEGER,
    NOMCOBR VARCHAR(60),
    NIT VARCHAR(20),
    NOMBRE VARCHAR(60),
    DIR VARCHAR(60),
    CIU VARCHAR(40),
    TEL VARCHAR(40),
    CONCEPTO VARCHAR(60),
    MONTO NUMERIC(18,2),
    RTFTE NUMERIC(18,2),
    RTIVA NUMERIC(18,2),
    RTICA NUMERIC(18,2),
    DSCTO NUMERIC(18,2),
    EXCEDE NUMERIC(18,2),
    OBS BLOB SUB_TYPE 1 SEGMENT SIZE 80,
    ITEMDOC INTEGER,
    TIPODOC VARCHAR(8),
    PREFDOC VARCHAR(4),
    NUMDOC VARCHAR(6),
    SUCURSAL VARCHAR(10),
    ABONODOC NUMERIC(18,2),
    RTFTEDOC NUMERIC(18,2),
    RTIVADOC NUMERIC(18,2),
    RTICADOC NUMERIC(18,2),
    DSCTODOC NUMERIC(18,2),
    SALDODOC NUMERIC(18,2),
    ANTERDOC NUMERIC(18,2))
AS
declare variable NUMROWS INTEGER;
declare variable TIPO integer;
declare variable IDDOC INTEGER;
BEGIN
  SELECT PREF_PRE, RECA_NUMERO, RECA_FECHA, CAJA_NOMBRE, RECA_CONC, R.COBR_COD,
        R.TERC_NIT, RECA_NOMTERC, TERC_DIR, TERC_CIU, TERC_TEL,
        RECA_MONTO, RECA_RTFTEMONTO, RECA_RTIVAMONTO, RECA_RTICAMONTO, RECA_DTOF, RECA_EXEDENTE, RECA_OBS
  FROM RECIBOS_CAJA R, TERCEROS T, CAJAS C
  WHERE R.TERC_NIT = T.TERC_NIT AND R.CAJA_ID = C.CAJA_ID AND
        R.RECA_ID = :ID
  INTO :PREFIJO, :NUMERO, :FECHA, :NOMCAJA, :CONCEPTO, :CODCOBR,
        :NIT, :NOMBRE, :DIR, :CIU, :TEL,
        :MONTO, :RTFTE, :RTIVA, :RTICA, :DSCTO, :excede, :OBS;
  SELECT COBR_NOM FROM COBRADORES WHERE COBR_COD = :CODCOBR INTO :NOMCOBR;
  SELECT COUNT(RCDE_ITEM) FROM RECIBOS_CAJA_DETALLE
    WHERE RECA_ID = :ID INTO :NUMROWS;
  if (NUMROWS > 0) then
    FOR SELECT RCDE_ITEM, RCDE_TIPODOC, RCDE_IDDOC, TIDO_NOMCORTO, RCDE_PREFIJO, RCDE_NUMERO,
        RCDE_ABONO, RCDE_RTFTE, RCDE_RTIVA, RCDE_RTICA, RCDE_DTOF, RCDE_SUCURSAL
        FROM RECIBOS_CAJA_DETALLE D, TIPO_DOCUMENTO TD
        WHERE D.RECA_ID = :ID AND TD.TIDO_COD = D.RCDE_TIPODOC
        ORDER BY RCDE_ITEM
        INTO :ITEMDOC, :TIPO, :IDDOC, :TIPODOC, :PREFDOC, :NUMDOC, :ABONODOC, :RTFTEDOC, :RTIVADOC, :RTICADOC, :DSCTODOC, :sucursal
        DO
            BEGIN
            EXECUTE PROCEDURE SALDO_DOC_CARTERA(:TIPO, :IDDOC, :FECHA, 0) returning_values (:SALDODOC);
            ANTERDOC = SALDODOC + RTFTEDOC + RTIVADOC + RTICADOC + ABONODOC + DSCTODOC;
            SUSPEND;
            END
  ELSE
    SUSPEND;
END
^

SET TERM ; ^


/* 20090414G */
/* documente mejor los prefijos que no existen en bancos */

SET TERM ^ ;

ALTER TRIGGER ti_notas_credito
active before insert position 0
AS
DECLARE VARIABLE NUMROWS INTEGER;
BEGIN
    /*  PARENT 'PREFIJOS_BANCOS' MUST EXIST WHEN INSERTING A CHILD IN 'NOTAS_CREDITO'  */
    IF (NEW.CUBA_COD IS NOT NULL AND
        NEW.PRBA_PREF IS NOT NULL) THEN
    BEGIN
       SELECT COUNT(*)
       FROM   PREFIJOS_BANCOS
       WHERE  PREFIJOS_BANCOS.CUBA_COD = NEW.CUBA_COD
        AND   PREFIJOS_BANCOS.TIDO_COD = 75
        AND   PREFIJOS_BANCOS.PRBA_PREF = NEW.PRBA_PREF
       INTO   :NUMROWS;
       IF (NUMROWS = 0) THEN
       BEGIN
          EXCEPTION PREFIJOBANCO_NO_EXISTE 'No existe el prefijo ' || new.prba_pref || ' de notas crédito para la cuenta ' || new.cuba_cod;
       END
    END
END
^

SET TERM ; ^


SET TERM ^ ;

ALTER TRIGGER ti_notas_debito
active before insert position 0
AS
DECLARE VARIABLE NUMROWS INTEGER;
BEGIN
    /*  PARENT 'PREFIJOS_BANCOS' MUST EXIST WHEN INSERTING A CHILD IN 'NOTAS_DEBITO'  */
    IF (NEW.CUBA_COD IS NOT NULL AND
        NEW.PRBA_PREF IS NOT NULL) THEN
    BEGIN
       SELECT COUNT(*)
       FROM   PREFIJOS_BANCOS
       WHERE  PREFIJOS_BANCOS.CUBA_COD = NEW.CUBA_COD
        AND   PREFIJOS_BANCOS.TIDO_COD = 74
        AND   PREFIJOS_BANCOS.PRBA_PREF = NEW.PRBA_PREF
       INTO   :NUMROWS;
       IF (NUMROWS = 0) THEN
       BEGIN
          EXCEPTION PREFIJOBANCO_NO_EXISTE 'No existe el prefijo ' || new.prba_pref || ' de notas débito para la cuenta ' || new.cuba_cod;
       END
    END
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER TRIGGER ti_consigna
active before insert position 0
AS
DECLARE VARIABLE NUMROWS INTEGER;
BEGIN
    /*  PARENT 'PREFIJOS_BANCOS' MUST EXIST WHEN INSERTING A CHILD IN 'CONSIGNA'  */
    IF (NEW.CUBA_COD IS NOT NULL AND
        NEW.PRBA_PREF IS NOT NULL) THEN
    BEGIN
       SELECT COUNT(*)
       FROM   PREFIJOS_BANCOS
       WHERE  PREFIJOS_BANCOS.CUBA_COD = NEW.CUBA_COD
        AND   PREFIJOS_BANCOS.TIDO_COD = 71
        AND   PREFIJOS_BANCOS.PRBA_PREF = NEW.PRBA_PREF
       INTO   :NUMROWS;
       IF (NUMROWS = 0) THEN
       BEGIN
          EXCEPTION PREFIJOBANCO_NO_EXISTE 'No existe el prefijo ' || new.prba_pref || ' de consignación para la cuenta ' || new.cuba_cod;
       END
    END
END
^

SET TERM ; ^

/* 20090415 */
/* SI DESCONTAR RTES POR CAUSACION EN NO HAY QUE SUMAR LAS RETS AL ABONO POR DOCUMENTO */
SET TERM ^ ;

CREATE OR ALTER PROCEDURE CONTABIL_RECICAJA(
    IDDOC INTEGER,
    IDINTER INTEGER)
RETURNS (
    ERROR INTEGER,
    VER CHAR(1),
    IDC INTEGER)
AS
declare variable PREF VARCHAR(4);
declare variable NUM VARCHAR(6);
declare variable FECAUX DATE;
declare variable FECHA CHAR(8);
declare variable CONC CHAR(120);
declare variable VRDTO NUMERIC(18,2);
declare variable VRRTFTE NUMERIC(18,2);
declare variable VRRTIVA NUMERIC(18,2);
declare variable VRRTICA NUMERIC(18,2);
declare variable VRTOTAL NUMERIC(18,2);
declare variable TIPOCOMP VARCHAR(3);
declare variable PREFCONT VARCHAR(4);
declare variable BASE CHAR(1);
declare variable CTABASE VARCHAR(20);
declare variable CAJA CHAR(1);
declare variable CTACAJA VARCHAR(20);
declare variable RTFTE CHAR(1);
declare variable CTARTFTE VARCHAR(20);
declare variable RTIVA CHAR(1);
declare variable CTARTIVA VARCHAR(20);
declare variable RTICA CHAR(1);
declare variable CTARTICA VARCHAR(20);
declare variable DTO CHAR(1);
declare variable CTADTO VARCHAR(20);
declare variable EXISTE CHAR(1);
declare variable CUENTA VARCHAR(20);
declare variable MONTO NUMERIC(18,2);
declare variable ES_RETENCION CHAR(1);
declare variable TIPOCUEN CHAR(1);
declare variable NIT VARCHAR(20);
declare variable PROY VARCHAR(4);
declare variable CENTRO VARCHAR(4);
declare variable DEBITO NUMERIC(18,2);
declare variable CREDITO NUMERIC(18,2);
declare variable NROI INTEGER;
declare variable SUMA NUMERIC(18,2);
declare variable TCTACLIEN VARCHAR(20);
declare variable TCTARTFTE VARCHAR(20);
declare variable TCTARTIVA VARCHAR(20);
declare variable TCTARTICA VARCHAR(20);
declare variable TIPOIT INTEGER;
declare variable IDIT INTEGER;
declare variable PREFIT VARCHAR(4);
declare variable NUMIT VARCHAR(6);
declare variable NUMEROIT VARCHAR(10);
declare variable ABONOIT NUMERIC(18,2);
declare variable CTADIC VARCHAR(20);
declare variable BASEADIC VARCHAR(20);
declare variable PORCADIC NUMERIC(5,2);
declare variable VALORADIC NUMERIC(18,2);
declare variable DBADIC CHAR(1);
declare variable ANULADO CHAR(1);
declare variable VRBASE NUMERIC(18,2);
declare variable PORC numeric(9,2);
declare variable OK INTEGER;
declare variable CRUCES NUMERIC(18,2);
declare variable VRCAJA NUMERIC(18,2);
declare variable DIFCAMBIO NUMERIC(18,2);
declare variable CTADIF VARCHAR(20);
declare variable PROVID INTEGER;
declare variable RTFTEC NUMERIC(18,2);
declare variable RTIVAC NUMERIC(18,2);
declare variable RTICAC NUMERIC(18,2);
declare variable RTFTER CHAR(1);
declare variable CTARTFTER VARCHAR(20);
declare variable RTIVAR CHAR(1);
declare variable CTARTIVAR VARCHAR(20);
declare variable RTICAR CHAR(1);
declare variable CTARTICAR VARCHAR(20);
declare variable RET CHAR(2);
declare variable RTIT NUMERIC(18,2);
BEGIN
ERROR = 0;
/* BUSQUE LA INTERFACE */
EXISTE = 'N';
SELECT 'S',TICO_COD,PRCO_PRE,INCJ_BASE,INCJ_DTOPP,INCJ_RTFTE,INCJ_RTIVA,INCJ_RTICA,INCJ_CAJA,INCJ_CTABASE,INCJ_CTADTO,INCJ_CTARTFTE,INCJ_CTARTIVA,INCJ_CTARTICA,INCJ_CTACAJA,INCJ_CONFIRMAR
    FROM INTERFAZ_CAJA
    WHERE INCJ_ID = :IDINTER
    INTO :EXISTE,:TIPOCOMP,:PREFCONT,:BASE,:DTO,:RTFTE,:RTIVA,:RTICA,:CAJA,:CTABASE,:CTADTO,:CTARTFTE,:CTARTIVA,:CTARTICA,:CTACAJA,:VER;
if (EXISTE = 'S') then
  BEGIN
  /* BORRE LA CONTABILIZACION ANTERIOR */
  OK = 0;
  FOR SELECT CNTB_ID FROM CONTABILIZACION WHERE CNTB_TIPOREF = 61 AND CNTB_IDREF = :IDDOC INTO :OK DO
    BEGIN
    DELETE FROM CONTABILIZACION_DET WHERE CNTB_ID = :OK;
    DELETE FROM CONTABILIZACION WHERE CNTB_ID = :OK;
    END
  /* TRAIGA EL ENCABEZADO DEL RECIBO */
  SELECT PREF_PRE,RECA_NUMERO,RECA_FECHA,R.TERC_NIT,RECA_CONC,RECA_DTOF,RECA_MONTO,RECA_RTFTEMONTO,RECA_RTIVAMONTO,RECA_RTICAMONTO,TERC_CTARTFTE,TERC_CTARTIVA,TERC_CTARTICA,TERC_CTACLIENTE,RECA_ANULADO,RECA_PROVID
    FROM RECIBOS_CAJA R,TERCEROS T
    WHERE RECA_ID = :IDDOC AND R.TERC_NIT = T.TERC_NIT
    INTO :PREF,:NUM,:FECAUX,:NIT,:CONC,:VRDTO,:VRTOTAL,:VRRTFTE,:VRRTIVA,:VRRTICA,:TCTARTFTE,TCTARTIVA,TCTARTICA,TCTACLIEN,:ANULADO,:PROVID;
  if (ANULADO = 'N') then
    BEGIN
    SELECT PREF_CENTRO,PREF_PROY FROM PREFIJOS
        WHERE PREF_PRE = :PREF AND TIDO_COD = 61 INTO :CENTRO,:PROY;
    EXECUTE PROCEDURE FECHA_A_CONTA(:FECAUX) returning_values (:FECHA);
    IDC = GEN_ID(ID_CONTABILIZA,1);
    INSERT INTO CONTABILIZACION (CNTB_ID,CNTB_TIPOCOMP,CNTB_PREFCNT,CNTB_NUMERO,CNTB_FECHA,CNTB_CONCEPTO,CNTB_REF,CNTB_TIPOREF,CNTB_IDREF,CNTB_PREFREF,CNTB_NUMREF,CNTB_PROCESADO)
        VALUES (:IDC,:TIPOCOMP,:PREFCONT,:NUM,:FECHA,:CONC,'',61,:IDDOC,:PREF,:NUM,'N');
    NROI = 0;
    SUMA = 0;
    /* SUME LOS CRUCES PARA LLEVARLOS A LA CUENTA X PAGAR Y RESTAR DE LA CAJA */
    SELECT SUM(RCCR_ABONO) FROM RECIBOS_CAJA_CRUCEC WHERE RECA_ID = :iddoc INTO :CRUCES;
    if (CRUCES IS NULL) then
        CRUCES = 0;
    VRCAJA = VRTOTAL - CRUCES;
    IF ((CAJA = 'K')) THEN
        BEGIN
        if (VRCAJA <> 0) then
            BEGIN
            CUENTA = NULL;
            EXECUTE PROCEDURE VALIDE_CUENTA_C (CTACAJA) RETURNING_VALUES (:OK);
            IF (OK = 0) THEN
                SELECT CUEN_COD,CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :CTACAJA INTO :CUENTA,:TIPOCUEN;
            ELSE
                begin
                EXECUTE PROCEDURE ERROR (61,:IDDOC,:CTACAJA,2);
                CUENTA = CTACAJA;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERROR (61,:IDDOC,:CUENTA,3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                EXECUTE PROCEDURE ERROR (61,:IDDOC,:CUENTA,4);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                IF (VRCAJA > 0) THEN
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID,CNDE_ITEM,CNDE_CUENTA,CNDE_CONC,CNDE_REF,CNDE_DEBITOS,CNDE_CREDITOS,CNDE_BASE,CNDE_PORC,CNDE_TERC,CNDE_PROY,CNDE_CENTRO,CNDE_DOCNUMERO,CNDE_DOCAPLICAR,CNDE_DOCVENCE,CNDE_ARTICULO,CNDE_DOCTIPOA,CNDE_DOCTIPON)
                        VALUES (:IDC,:NROI,:CUENTA,:CONC,'',:VRCAJA,0,0,0,:NIT,:PROY,:CENTRO,NULL,NULL,NULL,NULL,0,0);
                    SUMA = SUMA + VRCAJA;
                    END
                ELSE   
                    BEGIN                     
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID,CNDE_ITEM,CNDE_CUENTA,CNDE_CONC,CNDE_REF,CNDE_DEBITOS,CNDE_CREDITOS,CNDE_BASE,CNDE_PORC,CNDE_TERC,CNDE_PROY,CNDE_CENTRO,CNDE_DOCNUMERO,CNDE_DOCAPLICAR,CNDE_DOCVENCE,CNDE_ARTICULO,CNDE_DOCTIPOA,CNDE_DOCTIPON)
                       VALUES (:IDC,:NROI,:CUENTA,:CONC,'',0,ABS(:VRCAJA),0,0,:NIT,:PROY,:CENTRO,NULL,NULL,NULL,NULL,0,0);
                    SUMA = SUMA + VRCAJA;
                    END
                NROI = NROI + 1;
                END
            END
        END
    IF ((CAJA = 'F')) THEN
        BEGIN
        FOR SELECT MAX(FOPA_CTACONTA),SUM(RCPA_MONTO)
            FROM formas_pago F,recibos_caja_pago R
            WHERE R.RECA_ID = :IDDOC AND R.FOPA_ID = F.FOPA_ID
            GROUP BY FOPA_CTACONTA
            INTO :CTACAJA,:MONTO
        DO
            BEGIN
            if (MONTO <> 0) then
                BEGIN
                CUENTA = NULL;
                EXECUTE PROCEDURE VALIDE_CUENTA_C (CTACAJA) RETURNING_VALUES (:OK);
                IF (OK = 0) THEN
                    SELECT CUEN_COD,CUEN_TIPO FROM CUENTAS
                        WHERE CUEN_COD = :CTACAJA INTO :CUENTA,:TIPOCUEN;
                ELSE
                    begin
                    EXECUTE PROCEDURE ERROR (61,:IDDOC,:CTACAJA,2);
                    CUENTA = CTACAJA;
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (61,:IDDOC,:CUENTA,3);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (61,:IDDOC,:CUENTA,4);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    IF (MONTO > 0) THEN
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID,CNDE_ITEM,CNDE_CUENTA,CNDE_CONC,CNDE_REF,CNDE_DEBITOS,CNDE_CREDITOS,CNDE_BASE,CNDE_PORC,CNDE_TERC,CNDE_PROY,CNDE_CENTRO,CNDE_DOCNUMERO,CNDE_DOCAPLICAR,CNDE_DOCVENCE,CNDE_ARTICULO,CNDE_DOCTIPOA,CNDE_DOCTIPON)
                            VALUES (:IDC,:NROI,:CUENTA,:CONC,'',:MONTO,0,0,0,:NIT,:PROY,:CENTRO,NULL,NULL,NULL,NULL,0,0);
                        SUMA = SUMA + MONTO;
                        END
                    ELSE
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID,CNDE_ITEM,CNDE_CUENTA,CNDE_CONC,CNDE_REF,CNDE_DEBITOS,CNDE_CREDITOS,CNDE_BASE,CNDE_PORC,CNDE_TERC,CNDE_PROY,CNDE_CENTRO,CNDE_DOCNUMERO,CNDE_DOCAPLICAR,CNDE_DOCVENCE,CNDE_ARTICULO,CNDE_DOCTIPOA,CNDE_DOCTIPON)
                            VALUES (:IDC,:NROI,:CUENTA,:CONC,'',0,abs(:MONTO),0,0,:NIT,:PROY,:CENTRO,NULL,NULL,NULL,NULL,0,0);
                        SUMA = SUMA + MONTO;
                        END
                    NROI = NROI + 1;
                    END
                END /* MONTO <> 0 */
            END /* DO FORMA_PAGO */
        END /* CAJA = F */
    if (DTO = 'K') then /* DTO EN CTA CONSTANTE */
        BEGIN
        if (VRDTO <> 0) then
            BEGIN
            CUENTA = NULL;
            EXECUTE PROCEDURE VALIDE_CUENTA_C (CTADTO) RETURNING_VALUES (:OK);
            IF (OK = 0) THEN
                SELECT CUEN_COD,CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :CTADTO INTO :CUENTA,:TIPOCUEN;
            ELSE
                begin
                EXECUTE PROCEDURE ERROR (61,:IDDOC,:CTADTO,2);
                CUENTA = CTADTO;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERROR (61,:IDDOC,:CUENTA,3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                EXECUTE PROCEDURE ERROR (61,:IDDOC,:CUENTA,4);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID,CNDE_ITEM,CNDE_CUENTA,CNDE_CONC,CNDE_REF,CNDE_DEBITOS,CNDE_CREDITOS,CNDE_BASE,CNDE_PORC,CNDE_TERC,CNDE_PROY,CNDE_CENTRO,CNDE_DOCNUMERO,CNDE_DOCAPLICAR,CNDE_DOCVENCE,CNDE_ARTICULO,CNDE_DOCTIPOA,CNDE_DOCTIPON)
                    VALUES (:IDC,:NROI,:CUENTA,:CONC,'',:VRDTO,0,0,0,:NIT,:PROY,:CENTRO,NULL,NULL,NULL,NULL,0,0);
                NROI = NROI + 1;
                SUMA = SUMA + VRDTO;
                END
            END /* VRDTO <> 0 */
        END /* DTO EN CTA CONSTANTE */

    /* LA DIFERENCIA EN CAMBIO */
    SELECT SUM(RCDE_DIFCAMBIO) FROM recibos_caja_detalle WHERE RECA_ID = :iddoc INTO :DIFCAMBIO;
    IF ((DIFCAMBIO IS NOT NULL) AND (DIFCAMBIO <> 0)) THEN
        BEGIN
        if (DIFCAMBIO > 0) then
            execute procedure lee_configuracion('GENERAL','GENERAL','CUENTA DE INGRESO POR DIFERENCIA EN CAMBIO PARA OPERACIONES EN OTRA MONEDA') returning_values (:ctadif);
        else
            execute procedure lee_configuracion('GENERAL','GENERAL','CUENTA DE GASTO POR DIFERENCIA EN CAMBIO PARA OPERACIONES EN OTRA MONEDA') returning_values (:ctadif);
        CUENTA = NULL;
        EXECUTE PROCEDURE VALIDE_CUENTA_C (ctadif) RETURNING_VALUES (:OK);
        IF (OK = 0) THEN
            SELECT CUEN_COD,CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :ctadif INTO :CUENTA,:TIPOCUEN;
        ELSE
            begin
            EXECUTE PROCEDURE ERROR (61,:IDDOC,:ctadif,2);
            CUENTA = ctadif;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERROR (61,:IDDOC,:CUENTA,3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERROR (61,:IDDOC,:CUENTA,4);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            if (DIFCAMBIO > 0) then
                INSERT INTO CONTABILIZACION_DET (CNTB_ID,CNDE_ITEM,CNDE_CUENTA,CNDE_CONC,CNDE_REF,CNDE_DEBITOS,CNDE_CREDITOS,CNDE_BASE,CNDE_PORC,CNDE_TERC,CNDE_PROY,CNDE_CENTRO,CNDE_DOCNUMERO,CNDE_DOCAPLICAR,CNDE_DOCVENCE,CNDE_ARTICULO,CNDE_DOCTIPOA,CNDE_DOCTIPON)
                    VALUES (:IDC,:NROI,:CUENTA,:CONC,'',0,:difcambio,0,0,:NIT,:PROY,:CENTRO,NULL,NULL,NULL,NULL,0,0);
            else
                INSERT INTO CONTABILIZACION_DET (CNTB_ID,CNDE_ITEM,CNDE_CUENTA,CNDE_CONC,CNDE_REF,CNDE_DEBITOS,CNDE_CREDITOS,CNDE_BASE,CNDE_PORC,CNDE_TERC,CNDE_PROY,CNDE_CENTRO,CNDE_DOCNUMERO,CNDE_DOCAPLICAR,CNDE_DOCVENCE,CNDE_ARTICULO,CNDE_DOCTIPOA,CNDE_DOCTIPON)
                    VALUES (:IDC,:NROI,:CUENTA,:CONC,'',ABS(:difcambio),0,0,0,:NIT,:PROY,:CENTRO,NULL,NULL,NULL,NULL,0,0);
            NROI = NROI + 1;
            SUMA = SUMA - difcambio;
            END
        END
    /* RETENCION FUENTE */
    if ((RTFTE = 'T') or (RTFTE = 'K')) then
      if (VRRTFTE <> 0) then
        BEGIN
        if (RTFTE = 'T') then
            CTARTFTE = TCTARTFTE;
        CUENTA = NULL;
        EXECUTE PROCEDURE VALIDE_CUENTA_C (CTARTFTE) RETURNING_VALUES (:OK);
        IF (OK = 0) THEN
            SELECT CUEN_COD,CUEN_RETENCION,CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTARTFTE INTO :CUENTA,:ES_RETENCION,:TIPOCUEN;
        ELSE
            begin
            EXECUTE PROCEDURE ERROR (61,:IDDOC,:CTARTFTE,2);
            CUENTA = CTARTFTE;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERROR (61,:IDDOC,:CUENTA,3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERROR (61,:IDDOC,:CUENTA,4);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            if (ES_RETENCION = 'S') then
                BEGIN
                VRBASE = VRTOTAL + VRDTO + vrrtfte + vrrtiva + vrrtica;
                SELECT CLIE_rtefte from clientes where terc_nit = :NIT INTO :PORC;
                END
            ELSE
                BEGIN
                VRBASE = 0;
                PORC = 0;
                END
            INSERT INTO CONTABILIZACION_DET (CNTB_ID,CNDE_ITEM,CNDE_CUENTA,CNDE_CONC,CNDE_REF,CNDE_DEBITOS,CNDE_CREDITOS,CNDE_BASE,CNDE_PORC,CNDE_TERC,CNDE_PROY,CNDE_CENTRO,CNDE_DOCNUMERO,CNDE_DOCAPLICAR,CNDE_DOCVENCE,CNDE_ARTICULO,CNDE_DOCTIPOA,CNDE_DOCTIPON)
                VALUES (:IDC,:NROI,:CUENTA,:CONC,'',:VRRTFTE,0,:VRBASE,:PORC,:NIT,:PROY,:CENTRO,NULL,NULL,NULL,NULL,0,0);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTFTE;
            END
        END /* RTFTE */
    /* RETENCION IVA */
    if ((RTIVA = 'T') or (RTIVA = 'K')) then
      if (VRRTIVA <> 0) then
        BEGIN
        if (RTIVA = 'T') then
            CTARTIVA = TCTARTIVA;
        CUENTA = NULL;
        EXECUTE PROCEDURE VALIDE_CUENTA_C (CTARTIVA) RETURNING_VALUES (:OK);
        IF (OK = 0) THEN
            SELECT CUEN_COD,CUEN_RETENCION,CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTARTIVA INTO :CUENTA,:ES_RETENCION,:TIPOCUEN;
        ELSE
            begin
            EXECUTE PROCEDURE ERROR (61,:IDDOC,:CTARTIVA,2);
            CUENTA = CTARTIVA;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERROR (61,:IDDOC,:CUENTA,3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERROR (61,:IDDOC,:CUENTA,4);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            if (ES_RETENCION = 'S') then
                BEGIN
                VRBASE = VRTOTAL + VRDTO + vrrtfte + vrrtiva + vrrtica;
                SELECT CLIE_RTEIVA from clientes where terc_nit = :NIT INTO :PORC;
                END
            ELSE
                BEGIN
                VRBASE = 0;
                PORC = 0;
                END
            INSERT INTO CONTABILIZACION_DET (CNTB_ID,CNDE_ITEM,CNDE_CUENTA,CNDE_CONC,CNDE_REF,CNDE_DEBITOS,CNDE_CREDITOS,CNDE_BASE,CNDE_PORC,CNDE_TERC,CNDE_PROY,CNDE_CENTRO,CNDE_DOCNUMERO,CNDE_DOCAPLICAR,CNDE_DOCVENCE,CNDE_ARTICULO,CNDE_DOCTIPOA,CNDE_DOCTIPON)
                VALUES (:IDC,:NROI,:CUENTA,:CONC,'',:VRRTIVA,0,:VRBASE,:PORC,:NIT,:PROY,:CENTRO,NULL,NULL,NULL,NULL,0,0);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTIVA;
            END
        END /* RTIVA */
    /* RETENCION DE ICA */
    if ((RTICA = 'T') or (RTICA = 'K')) then
      if (VRRTICA <> 0) then
        BEGIN
        if (RTICA = 'T') then
            CTARTICA = TCTARTICA;
        CUENTA = NULL;
        EXECUTE PROCEDURE VALIDE_CUENTA_C (CTARTICA) RETURNING_VALUES (:OK);
        IF (OK = 0) THEN
            SELECT CUEN_COD,CUEN_RETENCION,CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTARTICA INTO :CUENTA,:ES_RETENCION,:TIPOCUEN;
        ELSE
            begin
            EXECUTE PROCEDURE ERROR (61,:IDDOC,:CTARTICA,2);
            CUENTA = CTARTICA;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERROR (61,:IDDOC,:CUENTA,3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERROR (61,:IDDOC,:CUENTA,4);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            if (ES_RETENCION = 'S') then
                BEGIN
                VRBASE = VRTOTAL + VRDTO + vrrtfte + vrrtiva + vrrtica;
                SELECT CLIE_RTEICA from clientes where terc_nit = :NIT INTO :PORC;
                END
            ELSE
                BEGIN
                VRBASE = 0;
                PORC = 0;
                END
            INSERT INTO CONTABILIZACION_DET (CNTB_ID,CNDE_ITEM,CNDE_CUENTA,CNDE_CONC,CNDE_REF,CNDE_DEBITOS,CNDE_CREDITOS,CNDE_BASE,CNDE_PORC,CNDE_TERC,CNDE_PROY,CNDE_CENTRO,CNDE_DOCNUMERO,CNDE_DOCAPLICAR,CNDE_DOCVENCE,CNDE_ARTICULO,CNDE_DOCTIPOA,CNDE_DOCTIPON)
                VALUES (:IDC,:NROI,:CUENTA,:CONC,'',:VRRTICA,0,0,0,:NIT,:PROY,:CENTRO,NULL,NULL,NULL,NULL,0,0);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTICA;
            END
        END /* RTICA */
    /* CRUCES CON CXP */
    if (CRUCES <> 0) then
        BEGIN
        SELECT PROV_CTAPAGAR FROM PROVEEDORES WHERE TERC_NIT = :nit INTO :ctabase;
        if (CTABASE IS NULL) then
            ctabase = tctaclien;
        CUENTA = NULL;
        EXECUTE PROCEDURE VALIDE_CUENTA_C (CTABASE) RETURNING_VALUES (:OK);
        IF (OK = 0) THEN
            SELECT CUEN_COD,CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTABASE INTO :CUENTA,:TIPOCUEN;
        ELSE
            begin
            EXECUTE PROCEDURE ERROR (61,:IDDOC,:CTABASE,2);
            CUENTA = CTABASE;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERROR (61,:IDDOC,:CUENTA,3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            /* DEBERIA RECORRER DOCUMENTO POR DOCUMENTO */
            FOR SELECT RCCR_TIPODOC,RCCR_PREFIJO,RCCR_NUMERO,RCCR_ABONO+RCCR_RTFTE+RCCR_RTIVA+RCCR_RTICA+RCCR_DTOF
                FROM recibos_caja_crucec WHERE RECA_ID = :IDDOC
                INTO :TIPOIT,PREFIT,NUMIT,ABONOIT
                DO
                BEGIN
                NUMEROIT = PREFIT || NUMIT;
                INSERT INTO CONTABILIZACION_DET (CNTB_ID,CNDE_ITEM,CNDE_CUENTA,CNDE_CONC,CNDE_REF,CNDE_DEBITOS,CNDE_CREDITOS,CNDE_BASE,CNDE_PORC,CNDE_TERC,CNDE_PROY,CNDE_CENTRO,CNDE_DOCNUMERO,CNDE_DOCAPLICAR,CNDE_DOCVENCE,CNDE_ARTICULO,CNDE_DOCTIPOA,CNDE_DOCTIPON)
                    VALUES (:IDC,:NROI,:CUENTA,:CONC,'',:ABONOIT,0,0,0,:NIT,:PROY,:CENTRO,NULL,:NUMEROIT,NULL,NULL,:TIPOIT,0);
                SUMA = SUMA + ABONOIT;
                NROI = NROI + 1;
                END
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID,CNDE_ITEM,CNDE_CUENTA,CNDE_CONC,CNDE_REF,CNDE_DEBITOS,CNDE_CREDITOS,CNDE_BASE,CNDE_PORC,CNDE_TERC,CNDE_PROY,CNDE_CENTRO,CNDE_DOCNUMERO,CNDE_DOCAPLICAR,CNDE_DOCVENCE,CNDE_ARTICULO,CNDE_DOCTIPOA,CNDE_DOCTIPON)
                VALUES (:IDC,:NROI,:CUENTA,:CONC,'',:CRUCES,0,0,0,:NIT,:PROY,:CENTRO,NULL,NULL,NULL,NULL,0,0);
            SUMA = SUMA + CRUCES;
            NROI = NROI + 1;
            END

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

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE RECIBOS_SIN_CONTABILIDAD(
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    ID INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    ESTADO VARCHAR(20),
    IDI INTEGER,
    IDC INTEGER,
    ERROR INTEGER)
AS
DECLARE VARIABLE VER CHAR(2);
declare variable FECICNT VARCHAR(10);
declare variable FECFCNT VARCHAR(10);
declare variable idref INTEGER;
BEGIN /*$$IBE$$ 
EXECUTE PROCEDURE fecha_a_conta(FECINI) returning_values (FECICNT);
EXECUTE PROCEDURE fecha_a_conta(FECFIN) returning_values (FECFCNT);
FOR SELECT RECA_ID, PREF_PRE, RECA_NUMERO FROM RECIBOS_CAJA WHERE RECA_ANULADO = 'N' AND
    RECA_FECHA >= :FECINI AND RECA_FECHA <= :FECFIN and PREF_PRE NOT IN (SELECT AUTO_PREFRDC FROM AUTORIZACIONES) ORDER BY RECA_ID
    INTO :ID, :PREF, :NUMERO
DO
  BEGIN
  idref = null;
  SELECT ENCO_IDREF FROM COMPROBANTE_ENCABEZADO WHERE ENCO_TIPOREF = 61 AND ENCO_FECHA >= :FECICNT AND ENCO_FECHA <= :FECFCNT and ENCO_IDREF = :id into :idref;
  if (idref IS NULL) then
  begin
   ESTADO = 'PROCESANDO';
   SUSPEND;
   SELECT MAX(INCJ_ID) FROM INTERFAZ_CAJA WHERE PREF_PRE = :PREF AND TIDO_COD = 61 INTO :IDI;
   EXECUTE PROCEDURE CONTABIL_RECICAJA (:ID, :IDI) RETURNING_VALUES (:ERROR, :VER, :IDC);
   if (ERROR = 0) then
    BEGIN
    EXECUTE PROCEDURE CONTABILIZA_PENDIENTE (:IDC);
    ESTADO = 'OK';
    END
   ELSE
    ESTADO = 'ERROR';
   suspend;
  end
  END
 $$IBE$$*/ SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE RECIBOS_SIN_CONTABILIDAD(
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    ID INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    ESTADO VARCHAR(20),
    IDI INTEGER,
    IDC INTEGER,
    ERROR INTEGER)
AS
DECLARE VARIABLE VER CHAR(2);
declare variable FECICNT VARCHAR(10);
declare variable FECFCNT VARCHAR(10);
declare variable idref INTEGER;
BEGIN
EXECUTE PROCEDURE fecha_a_conta(FECINI) returning_values (FECICNT);
EXECUTE PROCEDURE fecha_a_conta(FECFIN) returning_values (FECFCNT);
FOR SELECT RECA_ID, PREF_PRE, RECA_NUMERO FROM RECIBOS_CAJA WHERE RECA_ANULADO = 'N' AND
    RECA_FECHA >= :FECINI AND RECA_FECHA <= :FECFIN and PREF_PRE NOT IN (SELECT AUTO_PREFRDC FROM AUTORIZACIONES) ORDER BY RECA_ID
    INTO :ID, :PREF, :NUMERO
DO
  BEGIN
  idref = null;
  SELECT ENCO_IDREF FROM COMPROBANTE_ENCABEZADO WHERE ENCO_TIPOREF = 61 AND ENCO_FECHA >= :FECICNT AND ENCO_FECHA <= :FECFCNT and ENCO_IDREF = :id into :idref;
  if (idref IS NULL) then
  begin
   ESTADO = 'PROCESANDO';
   SUSPEND;
   SELECT MAX(INCJ_ID) FROM INTERFAZ_CAJA WHERE PREF_PRE = :PREF AND TIDO_COD = 61 INTO :IDI;
   EXECUTE PROCEDURE CONTABIL_RECICAJA (:ID, :IDI) RETURNING_VALUES (:ERROR, :VER, :IDC);
   if (ERROR = 0) then
    BEGIN
    EXECUTE PROCEDURE CONTABILIZA_PENDIENTE (:IDC);
    ESTADO = 'OK';
    END
   ELSE
    ESTADO = 'ERROR';
   suspend;
  end
  END
END

^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER PROCEDURE CONTABIL_EGRESO(
    IDDOC INTEGER,
    IDINTER INTEGER)
RETURNS (
    ERROR INTEGER,
    VER CHAR(1),
    IDC INTEGER)
AS
declare variable PREF VARCHAR(4);
declare variable NUM VARCHAR(6);
declare variable FECAUX DATE;
declare variable FECHA CHAR(8);
declare variable CONC CHAR(120);
declare variable VRDTO NUMERIC(18, 2);
declare variable VRRTFTE NUMERIC(18, 2);
declare variable VRRTIVA NUMERIC(18, 2);
declare variable VRRTICA NUMERIC(18, 2);
declare variable VRTOTAL NUMERIC(18, 2);
declare variable TIPOCOMP VARCHAR(3);
declare variable PREFCONT VARCHAR(4);
declare variable BASE CHAR(1);
declare variable CTABASE VARCHAR(20);
declare variable CAJA CHAR(1);
declare variable CTACAJA VARCHAR(20);
declare variable RTFTE CHAR(1);
declare variable CTARTFTE VARCHAR(20);
declare variable RTIVA CHAR(1);
declare variable CTARTIVA VARCHAR(20);
declare variable RTICA CHAR(1);
declare variable CTARTICA VARCHAR(20);
declare variable DTO CHAR(1);
declare variable CTADTO VARCHAR(20);
declare variable EXISTE CHAR(1);
declare variable CUENTA VARCHAR(20);
declare variable MONTO NUMERIC(18,2);
declare variable ES_RETENCION CHAR(1);
declare variable TIPOCUEN CHAR(1);
declare variable NIT VARCHAR(20);
declare variable PROY VARCHAR(4);
declare variable CENTRO VARCHAR(4);
declare variable MONTOBASE NUMERIC(18,2);
declare variable PORC NUMERIC(9,2);
declare variable DEBITO NUMERIC(18,2);
declare variable CREDITO NUMERIC(18,2);
declare variable NROI INTEGER;
declare variable SUMA NUMERIC(18,2);
declare variable TCTACLIEN VARCHAR(20);
declare variable TCTARTFTE VARCHAR(20);
declare variable TCTARTIVA VARCHAR(20);
declare variable TCTARTICA VARCHAR(20);
declare variable TCTACART VARCHAR(20);
declare variable TIPOIT INTEGER;
declare variable IDIT INTEGER;
declare variable PREFIT VARCHAR(4);
declare variable NUMIT VARCHAR(6);
declare variable NUMEROIT VARCHAR(10);
declare variable ABONOIT NUMERIC(18,2);
declare variable CTADIC VARCHAR(20);
declare variable BASEADIC VARCHAR(20);
declare variable PORCADIC NUMERIC(5,2);
declare variable VALORADIC NUMERIC(18,2);
declare variable DBADIC CHAR(1);
declare variable VRBASE NUMERIC(18,2);
declare variable GMF CHAR(1);
declare variable CODBCO INTEGER;
declare variable NUMCHEQ VARCHAR(20);
declare variable CRUCES NUMERIC(18,2);
declare variable VRCAJA NUMERIC(18,2);
declare variable OK INTEGER;
declare variable DIFCAMBIO NUMERIC(18,2);
declare variable CTADIF VARCHAR(20);
declare variable RTFTEC NUMERIC(18,2);
declare variable RTIVAC NUMERIC(18,2);
declare variable RTICAC NUMERIC(18,2);
declare variable RTFTER CHAR(1);
declare variable CTARTFTER VARCHAR(20);
declare variable RTIVAR CHAR(1);
declare variable CTARTIVAR VARCHAR(20);
declare variable RTICAR CHAR(1);
declare variable CTARTICAR VARCHAR(20);
declare variable RET CHAR(2);
declare variable RTIT NUMERIC(18,2);
BEGIN
/* BUSQUE LA INTERFACE */
EXISTE = 'N';
SELECT 'S', TICO_COD, PRCO_PRE, INCJ_BASE, INCJ_DTOPP, INCJ_RTFTE, INCJ_RTIVA, INCJ_RTICA, INCJ_CAJA, INCJ_CTABASE, INCJ_CTADTO, INCJ_CTARTFTE, INCJ_CTARTIVA, INCJ_CTARTICA, INCJ_CTACAJA, INCJ_CONFIRMAR
    FROM INTERFAZ_CAJA
    WHERE INCJ_ID = :IDINTER
    INTO :EXISTE, :TIPOCOMP, :PREFCONT, :BASE, :DTO, :RTFTE, :RTIVA, :RTICA, :CAJA, :CTABASE, :CTADTO, :CTARTFTE, :CTARTIVA, :CTARTICA, :CTACAJA, :VER;
if (EXISTE = 'S') then
    BEGIN
    OK = 0;
    FOR SELECT CNTB_ID FROM CONTABILIZACION WHERE CNTB_TIPOREF = 62 AND CNTB_IDREF = :IDDOC INTO :OK DO
        BEGIN
        DELETE FROM CONTABILIZACION_DET WHERE CNTB_ID = :OK;
        DELETE FROM CONTABILIZACION WHERE CNTB_ID = :OK;
        END

    /* TRAIGA EL ENCABEZADO DEL EGRESO */
    SELECT PREF_PRE, EGRE_NUMERO, EGRE_FECHA, E.TERC_NIT, EGRE_CONC, EGRE_DTOF, EGRE_MONTO, EGRE_RTFTEMONTO, EGRE_RTIVAMONTO, EGRE_RTICAMONTO, TERC_CTARTFTE, TERC_CTARTIVA, TERC_CTARTICA, TERC_CTACLIENTE
        FROM EGRESOS E, TERCEROS T
        WHERE EGRE_ID = :IDDOC AND E.TERC_NIT = T.TERC_NIT
        INTO :PREF, :NUM, :FECAUX, :NIT, :CONC, :VRDTO, :VRTOTAL, :VRRTFTE, :VRRTIVA, :VRRTICA, :TCTARTFTE, TCTARTIVA, TCTARTICA, TCTACLIEN;
    /* SI ES PROVEEDOR, SOBREESCIBE LAS CUENTAS  */
    SELECT PROV_CTAPAGAR, PROV_CTARTFTE, PROV_CTARTIVA, PROV_CTARTICA
        FROM PROVEEDORES WHERE TERC_NIT = :NIT
        INTO TCTACLIEN, TCTARTFTE, TCTARTIVA, TCTARTICA;
    SELECT PREF_CENTRO, PREF_PROY FROM PREFIJOS
        WHERE PREF_PRE = :PREF AND TIDO_COD = 62 INTO :CENTRO, :PROY;
    EXECUTE PROCEDURE FECHA_A_CONTA(:FECAUX) returning_values (:FECHA);
    /* REGISTRE EL ENCABEZADO CONTABLE */
    IDC = GEN_ID(ID_CONTABILIZA, 1);
    INSERT INTO CONTABILIZACION (CNTB_ID, CNTB_TIPOCOMP, CNTB_PREFCNT, CNTB_NUMERO, CNTB_FECHA, CNTB_CONCEPTO, CNTB_REF, CNTB_TIPOREF, CNTB_IDREF, CNTB_PREFREF, CNTB_NUMREF, CNTB_PROCESADO)
        VALUES (:IDC, :TIPOCOMP, :PREFCONT, :NUM, :FECHA, :CONC, '', 62, :IDDOC, :PREF, :NUM, 'N');
    /* SUME LOS CRUCES PARA LLEVARLOS A LA CUENTA X PAGAR Y RESTAR DE LA CAJA */
    SELECT SUM(EGCC_ABONO) FROM EGRESOS_CRUCEC WHERE EGRE_ID = :iddoc INTO :CRUCES;
    if (CRUCES IS NULL) then
        CRUCES = 0;
    VRCAJA = VRTOTAL - CRUCES;
    NROI = 0;
    SUMA = 0;
    ERROR = 0;
    /* EL CREDITO EN LA CAJA O EL BANCO */
    IF ((CAJA = 'K')) THEN
        BEGIN
        if (VRCAJA <> 0) then
            BEGIN
            CUENTA = NULL;
            EXECUTE PROCEDURE VALIDE_CUENTA_C (CTACAJA) RETURNING_VALUES (:OK);
            IF (OK = 0) THEN
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :CTACAJA INTO :CUENTA, :TIPOCUEN;
            ELSE
                begin
                EXECUTE PROCEDURE ERROR (62, :IDDOC, :CTACAJA, 2);
                CUENTA = CTACAJA;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 4);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRCAJA, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - VRCAJA;
                END
            END /* VRCAJA <> 0 */
        END /* CAJA CONSTANTE */
    IF ((CAJA = 'F')) THEN
        BEGIN
        /* mueva la cuenta de la caja o el banco o ambas */
        /* PRIMERO LA CAJA */
        FOR SELECT CAJA_CUENTA, EGCA_MONTO FROM EGRESOS_CAJA E, CAJAS C
            WHERE C.CAJA_ID = E.CAJA_ID AND EGRE_ID = :IDDOC
            INTO :CTACAJA, :MONTO
            DO
            BEGIN
            if (MONTO <> 0) then
                BEGIN
                CUENTA = NULL;
                EXECUTE PROCEDURE VALIDE_CUENTA_C (CTACAJA) RETURNING_VALUES (:OK);
                IF (OK = 0) THEN
                    SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                        WHERE CUEN_COD = :CTACAJA INTO :CUENTA, :TIPOCUEN;
                ELSE
                    begin
                    EXECUTE PROCEDURE ERROR (62, :IDDOC, :CTACAJA, 2);
                    CUENTA = CTACAJA;
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 4);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA - MONTO;
                    END
                END /* MONTO <> 0 */
            END /* DO CAJA */
        /* AHORA EL BANCO */
        MONTO = 0;
        SELECT CUBA_CTACONTA, EGBC_MONTO, EGBC_GMF, E.CUBA_COD, CUBA_GMFPOR, EGBC_NUMERO
            FROM EGRESOS_BANCO E, CUENTAS_BANCO C
            WHERE E.CUBA_COD = C.CUBA_COD AND EGRE_ID = :IDDOC
            INTO :CTACAJA, :MONTO, :GMF, :CODBCO, :PORC, :NUMCHEQ;
        if (MONTO <> 0) then
            BEGIN
            if (MONTO <> 0) then
                BEGIN
                CUENTA = NULL;
                EXECUTE PROCEDURE VALIDE_CUENTA_C (CTACAJA) RETURNING_VALUES (:OK);
                IF (OK = 0) THEN
                    SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                        WHERE CUEN_COD = :CTACAJA INTO :CUENTA, :TIPOCUEN;
                ELSE
                    begin
                    EXECUTE PROCEDURE ERROR (62, :IDDOC, :CTACAJA, 2);
                    CUENTA = CTACAJA;
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 4);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, :NUMCHEQ, 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA - MONTO;
                    END
                /* EL GMF */
                if ((GMF = 'S') AND (PORC <> 0)) then
                    BEGIN
                    EXECUTE procedure REDONDEE(:MONTO * :PORC / 1000, 0) returning_values (MONTO);
                    /* REGISTRE EL GMF EN LA MISMA CUENTA DEL BANCO COMO CREDITO */
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, :NUMCHEQ, 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA - MONTO;

                    /* AHORA LA CUENTA DEL GASTO */
                    SELECT CUBA_CTAGMF FROM CUENTAS_BANCO
                        where CUBA_COD = :CODBCO INTO :CTACAJA;
                    EXECUTE PROCEDURE VALIDE_CUENTA_C (CTACAJA) RETURNING_VALUES (:OK);
                    IF (OK = 0) THEN
                        SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                            WHERE CUEN_COD = :CTACAJA INTO :CUENTA, :TIPOCUEN;
                    ELSE
                        begin
                        EXECUTE PROCEDURE ERROR (62, :IDDOC, :CTACAJA, 2);
                        CUENTA = CTACAJA;
                        TIPOCUEN = 'N';
                        ERROR = ERROR + 1;
                        end
                    if (TIPOCUEN = 'I') then
                        BEGIN
                        EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
                        TIPOCUEN = 'N';
                        ERROR = ERROR + 1;
                        END
                    if (TIPOCUEN = 'C') then
                        BEGIN
                        EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 4);
                        TIPOCUEN = 'N';
                        ERROR = ERROR + 1;
                        END
                    if (TIPOCUEN = 'N') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, :NUMCHEQ, :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NROI = NROI + 1;
                        SUMA = SUMA + MONTO;
                        END
                    END /* GMF */
                END /* MONTO <> 0 */
            END /* EGRESO_BANCO */
        END /* CAJA = F */

    /* LOS CRUCES CON CUENTAS X COBRAR */
    if (CRUCES <> 0) then
        BEGIN
        SELECT TERC_CTACLIENTE FROM TERCEROS WHERE TERC_NIT = :nit INTO :tctacart;
        if (tctacart IS NULL) then
            tctacart = tctaclien;
        CUENTA = NULL;
        EXECUTE PROCEDURE VALIDE_CUENTA_C (tctacart) RETURNING_VALUES (:OK);
        IF (OK = 0) THEN
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :tctacart INTO :CUENTA, :TIPOCUEN;
        ELSE
            begin
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :tctacart, 2);
            CUENTA = tctacart;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            /* DEBERIA RECORRER DOCUMENTO POR DOCUMENTO */
            FOR SELECT EGCC_TIPODOC, EGCC_PREFIJO, EGCC_NUMERO, EGCC_ABONO+EGCC_RTFTE+EGCC_RTIVA+EGCC_RTICA+EGCC_DTOF
                FROM egresos_crucec WHERE EGRE_ID = :IDDOC
                INTO :TIPOIT, PREFIT, NUMIT, ABONOIT
                DO
                BEGIN
                NUMEROIT = PREFIT || NUMIT;
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :ABONOIT, 0, 0, :NIT, :PROY, :CENTRO, NULL, :NUMEROIT, NULL, NULL, :TIPOIT, 0);
                SUMA = SUMA - ABONOIT;
                NROI = NROI + 1;
                END
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :CRUCES, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            SUMA = SUMA - CRUCES;
            NROI = NROI + 1;
            END
        /* LA DIFERENCIA EN CAMBIO */
        SELECT SUM(EGCC_DIFCAMBIO) FROM egresos_crucec WHERE EGRE_ID = :iddoc INTO :DIFCAMBIO;
        IF ((DIFCAMBIO IS NOT NULL) AND (DIFCAMBIO <> 0)) THEN
            BEGIN
            if (DIFCAMBIO > 0) then
                execute procedure lee_configuracion('GENERAL','GENERAL','CUENTA DE INGRESO POR DIFERENCIA EN CAMBIO PARA OPERACIONES EN OTRA MONEDA') returning_values (:ctadif);
            else
                execute procedure lee_configuracion('GENERAL','GENERAL','CUENTA DE GASTO POR DIFERENCIA EN CAMBIO PARA OPERACIONES EN OTRA MONEDA') returning_values (:ctadif);
            CUENTA = NULL;
            EXECUTE PROCEDURE VALIDE_CUENTA_C (ctadif) RETURNING_VALUES (:OK);
            IF (OK = 0) THEN
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :ctadif INTO :CUENTA, :TIPOCUEN;
            ELSE
                begin
                EXECUTE PROCEDURE ERROR (62, :IDDOC, :ctadif, 2);
                CUENTA = ctadif;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 4);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                if (DIFCAMBIO > 0) then
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :difcambio, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                else
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', ABS(:difcambio), 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - difcambio;
                END
            END
        /* RETEFUENTE DEL CRUCE */
        SELECT first 1 INCJ_RTFTE, INCJ_RTIVA, INCJ_RTICA, INCJ_CTARTFTE, INCJ_CTARTIVA, INCJ_CTARTICA
            FROM INTERFAZ_CAJA WHERE tido_cod = 61 into :RTFTER, :RTIVAR, :RTICAR, :CTARTFTER, :CTARTIVAR, :CTARTICAR;
        SELECT SUM(EGCC_RTFTE) FROM egresos_crucec WHERE EGRE_ID = :iddoc INTO :rtftec;
        IF ((rtftec IS NOT NULL) AND (rtftec <> 0)) THEN
            BEGIN
            if ((RTFTER = 'T') or (RTFTER = 'K')) then
                BEGIN
                if (RTFTER = 'T') then
                    SELECT TERC_CTARTFTE FROM TERCEROS WHERE TERC_NIT = :NIT INTO CTARTFTER;
                CUENTA = NULL;
                EXECUTE PROCEDURE VALIDE_CUENTA_C (ctartfter) RETURNING_VALUES (:OK);
                IF (OK = 0) THEN
                    SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                        WHERE CUEN_COD = :ctartfter INTO :CUENTA, :TIPOCUEN;
                ELSE
                    begin
                    EXECUTE PROCEDURE ERROR (62, :IDDOC, :ctartfter, 2);
                    CUENTA = ctartfter;
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 4);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :rtftec, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA + rtftec;
                    END
                END
            END
        /* RETEIVA DEL CRUCE */
        SELECT SUM(EGCC_RTIVA) FROM egresos_crucec WHERE EGRE_ID = :iddoc INTO :rtivac;
        IF ((rtivac IS NOT NULL) AND (rtivac <> 0)) THEN
            BEGIN
            if ((RTIVAR = 'T') or (RTIVAR = 'K')) then
                BEGIN
                if (RTIVAR = 'T') then
                    SELECT TERC_CTARTIVA FROM TERCEROS WHERE TERC_NIT = :NIT INTO CTARTIVAR;
                CUENTA = NULL;
                EXECUTE PROCEDURE VALIDE_CUENTA_C (ctartivar) RETURNING_VALUES (:OK);
                IF (OK = 0) THEN
                    SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                        WHERE CUEN_COD = :ctartivar INTO :CUENTA, :TIPOCUEN;
                ELSE
                    begin
                    EXECUTE PROCEDURE ERROR (62, :IDDOC, :ctartivar, 2);
                    CUENTA = ctartivar;
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 4);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :rtivac, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA + rtivac;
                    END
                END
            END
        /* RETEICA DEL CRUCE */
        SELECT SUM(EGCC_RTICA) FROM egresos_crucec WHERE EGRE_ID = :iddoc INTO :rticac;
        IF ((rticac IS NOT NULL) AND (rtivac <> 0)) THEN
            BEGIN
            if ((RTICAR = 'T') or (RTICAR = 'K')) then
                BEGIN
                if (RTICAR = 'T') then
                    SELECT TERC_CTARTICA FROM TERCEROS WHERE TERC_NIT = :NIT INTO CTARTICAR;
                CUENTA = NULL;
                EXECUTE PROCEDURE VALIDE_CUENTA_C (ctarticar) RETURNING_VALUES (:OK);
                IF (OK = 0) THEN
                    SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                        WHERE CUEN_COD = :ctarticar INTO :CUENTA, :TIPOCUEN;
                ELSE
                    begin
                    EXECUTE PROCEDURE ERROR (62, :IDDOC, :ctarticar, 2);
                    CUENTA = ctarticar;
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 4);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :rticac, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA + rticac;
                    END
                END
            END
        END /* cruces */

    if (DTO = 'K') then /* DTO EN CTA CONSTANTE */
        BEGIN
        if (VRDTO <> 0) then
            BEGIN
            CUENTA = NULL;
            EXECUTE PROCEDURE VALIDE_CUENTA_C (CTADTO) RETURNING_VALUES (:OK);
            IF (OK = 0) THEN
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :CTADTO INTO :CUENTA, :TIPOCUEN;
            ELSE
                begin
                EXECUTE PROCEDURE ERROR (62, :IDDOC, :CTADTO, 2);
                CUENTA = CTADTO;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 4);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRDTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - VRDTO;
                END
            END /* VRDTO <> 0 */
        END /* DTO EN CTA CONSTANTE */

    /* LA DIFERENCIA EN CAMBIO */
    SELECT SUM(EGDE_DIFCAMBIO) FROM egresos_detalle WHERE EGRE_ID = :iddoc INTO :DIFCAMBIO;
    IF ((DIFCAMBIO IS NOT NULL) AND (DIFCAMBIO <> 0)) THEN
        BEGIN
        if (DIFCAMBIO > 0) then
            execute procedure lee_configuracion('GENERAL','GENERAL','CUENTA DE GASTO POR DIFERENCIA EN CAMBIO PARA OPERACIONES EN OTRA MONEDA') returning_values (:ctadif);
        else
            execute procedure lee_configuracion('GENERAL','GENERAL','CUENTA DE INGRESO POR DIFERENCIA EN CAMBIO PARA OPERACIONES EN OTRA MONEDA') returning_values (:ctadif);
        CUENTA = NULL;
        EXECUTE PROCEDURE VALIDE_CUENTA_C (ctadif) RETURNING_VALUES (:OK);
        IF (OK = 0) THEN
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :ctadif INTO :CUENTA, :TIPOCUEN;
        ELSE
            begin
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :ctadif, 2);
            CUENTA = ctadif;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 4);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            if (DIFCAMBIO > 0) then
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :difcambio, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            else
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, ABS(:difcambio), 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA + difcambio;
            END
        END
    /* RETENCION FUENTE */
    if ((RTFTE = 'T') or (RTFTE = 'K')) then
      if (VRRTFTE <> 0) then
        BEGIN
        if (RTFTE = 'T') then
            CTARTFTE = TCTARTFTE;
        CUENTA = NULL;
        EXECUTE PROCEDURE VALIDE_CUENTA_C (CTARTFTE) RETURNING_VALUES (:OK);
        IF (OK = 0) THEN
            SELECT CUEN_COD, CUEN_RETENCION, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTARTFTE INTO :CUENTA, :ES_RETENCION, :TIPOCUEN;
        ELSE
            begin
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :CTARTFTE, 2);
            CUENTA = CTARTFTE;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 4);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            if (ES_RETENCION = 'S') then
                BEGIN
                VRBASE = VRTOTAL;
                SELECT PROV_RETEFTE from proveedores where terc_nit = :NIT INTO :PORC;
                END
            ELSE
                BEGIN
                VRBASE = 0;
                PORC = 0;
                END
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, :VRBASE, :PORC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA - VRRTFTE;
            END
        END /* RTFTE */
    /* RETENCION IVA */
    if ((RTIVA = 'T') or (RTIVA = 'K')) then
      if (VRRTIVA <> 0) then
        BEGIN
        if (RTIVA = 'T') then
            CTARTIVA = TCTARTIVA;
        CUENTA = NULL;
        EXECUTE PROCEDURE VALIDE_CUENTA_C (CTARTIVA) RETURNING_VALUES (:OK);
        IF (OK = 0) THEN
            SELECT CUEN_COD, CUEN_RETENCION, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTARTIVA INTO :CUENTA, :ES_RETENCION, :TIPOCUEN;
        ELSE
            begin
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :CTARTIVA, 2);
            CUENTA = CTARTIVA;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 4);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            if (ES_RETENCION = 'S') then
                BEGIN
                VRBASE = VRTOTAL;
                SELECT PROV_RTEIVA from proveedores where terc_nit = :NIT INTO :PORC;
                END
            ELSE
                BEGIN
                VRBASE = 0;
                PORC = 0;
                END
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTIVA, :VRBASE, :PORC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA - VRRTIVA;
            END
        END /* RTIVA */
    /* RETENCION DE ICA */
    if ((RTICA = 'T') or (RTICA = 'K')) then
      if (VRRTICA <> 0) then
        BEGIN
        if (RTICA = 'T') then
            CTARTICA = TCTARTICA;
        CUENTA = NULL;
        EXECUTE PROCEDURE VALIDE_CUENTA_C (CTARTICA) RETURNING_VALUES (:OK);
        IF (OK = 0) THEN
            SELECT CUEN_COD, CUEN_RETENCION, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTARTICA INTO :CUENTA, :ES_RETENCION, :TIPOCUEN;
        ELSE
            begin
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :CTARTICA, 2);
            CUENTA = CTARTICA;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 4);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            if (ES_RETENCION = 'S') then
                BEGIN
                VRBASE = VRTOTAL;
                SELECT PROV_RTEICA from proveedores where terc_nit = :NIT INTO :PORC;
                END
            ELSE
                BEGIN
                VRBASE = 0;
                PORC = 0;
                END
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTICA, :VRBASE, :PORC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA - VRRTICA;
            END
        END /* RTICA */
    /* RECORRA LAS CUENTAS DE EGRESOS_CONTABILIDAD */
    FOR SELECT CUEN_COD, EGCO_NIT, EGCO_PROY, EGCO_CENTRO, EGCO_CONC, EGCO_DEBITOS, EGCO_CREDITOS, EGCO_BASEM, EGCO_PORC
        FROM EGRESOS_CONTABILIDAD WHERE EGRE_ID = :IDDOC ORDER BY EGCO_ITEM
        INTO :CTABASE, :NIT, :PROY, :CENTRO, :CONC, :DEBITO, :CREDITO, :MONTOBASE, :PORC
        DO
        BEGIN
        CUENTA = NULL;
        EXECUTE PROCEDURE VALIDE_CUENTA_C (CTABASE) RETURNING_VALUES (:OK);
        IF (OK = 0) THEN
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTABASE INTO :CUENTA, :TIPOCUEN;
        ELSE
            begin
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :CTABASE, 2);
            CUENTA = CTABASE;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 4);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'N') then
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :DEBITO, :CREDITO, :MONTOBASE, :PORC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
        SUMA = SUMA + DEBITO - CREDITO;
        NROI = NROI + 1;
        END
    /* CIERRE EL COMPROBANTE CONTRA LA CUENTA DEL TERCERO O LA BASE CONSTANTE */
    if (SUMA <> 0) THEN
        BEGIN
        if (SUMA < 0) then
            BEGIN
            DEBITO = SUMA * -1;
            CREDITO = 0;
            END
        ELSE
            BEGIN
            DEBITO = 0;
            CREDITO = SUMA;
            END
        if ((BASE = 'F') or (BASE = 'T') or (BASE = 'K')) then
            BEGIN
            if (BASE = 'T') then
                CTABASE = TCTACLIEN;
            if (BASE = 'F') then
                BEGIN
                SELECT CAJA_CUENTA FROM EGRESOS E, CAJAS C
                    WHERE C.CAJA_ID = E.CAJA_ID AND EGRE_ID = :IDDOC INTO :CTABASE;
                END
            CUENTA = NULL;
            EXECUTE PROCEDURE VALIDE_CUENTA_C (CTABASE) RETURNING_VALUES (:OK);
            IF (OK = 0) THEN
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :CTABASE INTO :CUENTA, :TIPOCUEN;
            ELSE
                begin
                EXECUTE PROCEDURE ERROR (62, :IDDOC, :CTABASE, 2);
                CUENTA = CTABASE;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                /* DEBERIA RECORRER DOCUMENTO POR DOCUMENTO */
                FOR SELECT RCDE_TIPODOC, RCDE_PREFIJO, RCDE_NUMERO, RCDE_ABONO+RCDE_RTFTE+RCDE_RTIVA+RCDE_RTICA+RCDE_DTOF
                    FROM RECIBOS_CAJA_DETALLE WHERE RECA_ID = :IDDOC
                    INTO :TIPOIT, PREFIT, NUMIT, ABONOIT
                    DO
                    BEGIN
                    NUMEROIT = PREFIT || NUMIT;
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :ABONOIT, 0, 0, :NIT, :PROY, :CENTRO, NULL, :NUMEROIT, NULL, NULL, :TIPOIT, 0);
                    NROI = NROI + 1;
                    END
                END
            if (TIPOCUEN = 'N') then
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :DEBITO, :CREDITO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            END /* SUMA EN CARTERA */
        if (BASE = 'D') then
            BEGIN
            execute procedure lee_configuracion('CXPAGAR','SALDOS','DESCONTAR RETENCIONES POR CAUSACION') returning_values (RET);
            CTABASE = NULL;
            FOR SELECT EGDE_TIPODOC, EGDE_IDDOC, EGDE_PREFIJO, EGDE_NUMERO, EGDE_ABONO+EGDE_DTOF, EGDE_RTFTE+EGDE_RTIVA+EGDE_RTICA
                FROM EGRESOS_DETALLE WHERE EGRE_ID = :IDDOC INTO :tipoit, :IDIT, :PREFIT, :NUMIT, :suma, :RTIT
                DO
                BEGIN
                if (TIPOIT <> 55) then
                    SELECT CUEN_COD, PROY_COD, CENT_COD FROM COMPROBANTE_ENCABEZADO E, COMPROBANTE_DETALLE D
                        WHERE E.enco_consec = D.enco_consec AND E.enco_tiporef = :TIPOIT AND E.enco_idref = :IDIT AND
                        SUBSTR(CUEN_COD,1,1) = '2' AND SUBSTR(CUEN_COD,1,3) <> '236' AND SUBSTR(CUEN_COD,1,4) <> '2408'
                        INTO :ctabase, :proy, :centro;
                else
                    /* tome la base de la configuración y el c.costo del prefijo del recibo */
                    execute procedure lee_configuracion('CAJA', 'EGRESOS', 'CUENTA CONTABLE PARA LOS ANTICIPOS A ACREEDORES SI LA INTERFAZ ES POR DOCUMENTO') returning_values (ctabase);

                CUENTA = NULL;
                EXECUTE PROCEDURE VALIDE_CUENTA_C (ctabase) RETURNING_VALUES (:OK);
                IF (OK = 0) THEN
                    SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                        WHERE CUEN_COD = :CTABASE INTO :CUENTA, :TIPOCUEN;
                ELSE
                    begin
                    EXECUTE PROCEDURE ERROR (62, :IDDOC, :CTABASE, 2);
                    CUENTA = CTABASE;
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    end
                if (RET = 'NO') then
                    SUMA = SUMA + RTIT;
                if (SUMA < 0) then
                    BEGIN
                    CREDITO = SUMA * -1;
                    DEBITO = 0;
                    END
                ELSE
                    BEGIN
                    CREDITO = 0;
                    DEBITO = SUMA;
                    END
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    /* DEBERIA RECORRER DOCUMENTO POR DOCUMENTO */
                    NUMEROIT = PREFIT || NUMIT;
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :debito, :credito, 0, 0, :NIT, :PROY, :CENTRO, NULL, :NUMEROIT, NULL, NULL, :TIPOIT, 0);
                    END
                if (TIPOCUEN = 'N') then
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :DEBITO, :CREDITO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                END /* SUMA EN CARTERA */
            END
        END
    /* recorra las cuentas adicionales */
    FOR SELECT INJC_CUENTA, INJC_BASE, INJC_PORC, INJC_VALOR, INJC_DB
        FROM INTERFAZ_CAJA_CTAS
        WHERE INCJ_ID = :IDINTER
        INTO :CTADIC, :BASEADIC, :PORCADIC, :VALORADIC, :DBADIC
        DO
        BEGIN
        if (:BASEADIC = 'TOTAL') then
            VALORADIC = VRTOTAL;
        if (:BASEADIC = 'DESCUENTO') then
            VALORADIC = VRDTO;
        if (:BASEADIC = 'RTFTE') then
            VALORADIC = VRRTFTE;
        if (:BASEADIC = 'RTIVA') then
            VALORADIC = VRRTIVA;
        if (:BASEADIC = 'RTICA') then
            VALORADIC = VRRTICA;
        MONTO = VALORADIC * PORCADIC;
        CUENTA = NULL;
        EXECUTE PROCEDURE VALIDE_CUENTA_C (CTADIC) RETURNING_VALUES (:OK);
        IF (OK = 0) THEN
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTADIC INTO :CUENTA, :TIPOCUEN;
        ELSE
            begin
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :CTADIC, 2);
            CUENTA = CTADIC;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 4);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            if (DBADIC = 'S') then
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTADIC, :CONC, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            ELSE
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTADIC, :CONC, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            END
        NROI = NROI + 1;
        END
    if (ERROR > 0) then
        VER = 'S';
    SUSPEND;
    END /* EXISTE LA INTERFAZ */
  ELSE
    BEGIN
    EXECUTE PROCEDURE ERROR (62, :IDDOC, :PREF, 1);
    ERROR = ERROR + 1;
    VER = 'S';
    SUSPEND;
    END
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE EGRESOS_SIN_CONTABILIDAD(
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    ID INTEGER,
    IDI INTEGER,
    IDC INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    ESTADO VARCHAR(20),
    ERROR INTEGER)
AS
DECLARE VARIABLE VER CHAR(2);
declare variable FECICNT VARCHAR(10);
declare variable FECFCNT VARCHAR(10);
declare variable idref INTEGER;
BEGIN /*$$IBE$$ 
EXECUTE PROCEDURE fecha_a_conta(FECINI) returning_values (FECICNT);
EXECUTE PROCEDURE fecha_a_conta(FECFIN) returning_values (FECFCNT);
FOR SELECT EGRE_ID, PREF_PRE, egre_numero FROM EGRESOS WHERE EGRE_ANULADO = 'N' AND PREF_PRE <> 'R004' AND
    EGRE_FECHA >= :FECINI AND EGRE_FECHA <= :FECFIN ORDER BY EGRE_ID INTO :ID, :PREF, :NUMERO
DO
  BEGIN
  idref = null;
  SELECT ENCO_IDREF FROM COMPROBANTE_ENCABEZADO WHERE ENCO_TIPOREF = 62 AND ENCO_FECHA >= :FECICNT AND ENCO_FECHA <= :FECFCNT and ENCO_IDREF = :ID into :idref;
  if (idref IS NULL) then
  begin
   ESTADO = 'PROCESANDO';
   SUSPEND;
   SELECT MAX(INCJ_ID) FROM INTERFAZ_CAJA WHERE PREF_PRE = :PREF AND TIDO_COD = 62 INTO :IDI;
   EXECUTE PROCEDURE CONTABIL_EGRESO (:ID, :IDI) RETURNING_VALUES (:ERROR, :VER, :IDC);
   IF (ERROR = 0) THEN
      BEGIN
      EXECUTE PROCEDURE CONTABILIZA_PENDIENTE (:IDC);
      ESTADO = 'OK';
      END
   ELSE
    ESTADO = 'ERROR';
   suspend;
  end
  END
 $$IBE$$*/ SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE EGRESOS_SIN_CONTABILIDAD(
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    ID INTEGER,
    IDI INTEGER,
    IDC INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    ESTADO VARCHAR(20),
    ERROR INTEGER)
AS
DECLARE VARIABLE VER CHAR(2);
declare variable FECICNT VARCHAR(10);
declare variable FECFCNT VARCHAR(10);
declare variable idref INTEGER;
BEGIN
EXECUTE PROCEDURE fecha_a_conta(FECINI) returning_values (FECICNT);
EXECUTE PROCEDURE fecha_a_conta(FECFIN) returning_values (FECFCNT);
FOR SELECT EGRE_ID, PREF_PRE, egre_numero FROM EGRESOS WHERE EGRE_ANULADO = 'N' AND PREF_PRE <> 'R004' AND
    EGRE_FECHA >= :FECINI AND EGRE_FECHA <= :FECFIN ORDER BY EGRE_ID INTO :ID, :PREF, :NUMERO
DO
  BEGIN
  idref = null;
  SELECT ENCO_IDREF FROM COMPROBANTE_ENCABEZADO WHERE ENCO_TIPOREF = 62 AND ENCO_FECHA >= :FECICNT AND ENCO_FECHA <= :FECFCNT and ENCO_IDREF = :ID into :idref;
  if (idref IS NULL) then
  begin
   ESTADO = 'PROCESANDO';
   SUSPEND;
   SELECT MAX(INCJ_ID) FROM INTERFAZ_CAJA WHERE PREF_PRE = :PREF AND TIDO_COD = 62 INTO :IDI;
   EXECUTE PROCEDURE CONTABIL_EGRESO (:ID, :IDI) RETURNING_VALUES (:ERROR, :VER, :IDC);
   IF (ERROR = 0) THEN
      BEGIN
      EXECUTE PROCEDURE CONTABILIZA_PENDIENTE (:IDC);
      ESTADO = 'OK';
      END
   ELSE
    ESTADO = 'ERROR';
   suspend;
  end
  END
END

^

SET TERM ; ^


/* 20090415B */
/* no imprimia las notas si agrpa por cobrador */

SET TERM ^ ;

CREATE OR ALTER PROCEDURE REP_CARTERA_CLIENTES(
    DESDE VARCHAR(20),
    HASTA VARCHAR(20),
    GRPINI VARCHAR(5),
    GRPFIN VARCHAR(5),
    FECHA DATE,
    ORDEN CHAR(1),
    AGRUPA CHAR(1),
    SUBEMPRESA INTEGER,
    GRUPCART INTEGER,
    MONEDA INTEGER)
RETURNS (
    NIT VARCHAR(20),
    NOMBRE VARCHAR(60),
    DIR VARCHAR(60),
    TELEFONO VARCHAR(40),
    CIUDAD VARCHAR(40),
    CONTACTO VARCHAR(60),
    EMAIL VARCHAR(100),
    FAX VARCHAR(25),
    CEL VARCHAR(25),
    CODCLI VARCHAR(20),
    CODZONA VARCHAR(2),
    NOMZONA VARCHAR(60),
    CODCOBR INTEGER,
    NOMCOBR VARCHAR(60),
    SUCURSAL VARCHAR(10),
    NOMSUC VARCHAR(60),
    DV CHAR(1),
    CODCIUD CHAR(5),
    NOMCIUD VARCHAR(60),
    TIPO INTEGER,
    ID INTEGER,
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(6),
    CONCEPTO VARCHAR(60),
    SALDO NUMERIC(18,2),
    PROVISIONAL NUMERIC(18,2),
    RTFTE NUMERIC(18,2),
    RTIVA NUMERIC(18,2),
    RTICA NUMERIC(18,2),
    DTOF NUMERIC(18,2),
    TIPONOM VARCHAR(8),
    FECDOC DATE,
    VENCE DATE,
    DIAS INTEGER,
    CUPO NUMERIC(18,2),
    DISPONIBLE NUMERIC(18,2),
    NOTA VARCHAR(256),
    OBS BLOB SUB_TYPE 0 SEGMENT SIZE 80,
    GRUPCOD INTEGER,
    GRUPNOM VARCHAR(30))
AS
DECLARE VARIABLE NITINI VARCHAR(20);
DECLARE VARIABLE NITFIN VARCHAR(20);
DECLARE VARIABLE NOMINI VARCHAR(20);
DECLARE VARIABLE NOMFIN VARCHAR(20);
DECLARE VARIABLE OK CHAR(1);
DECLARE VARIABLE FOV CHAR(11);
DECLARE VARIABLE DTOAPL NUMERIC(18,2);
DECLARE VARIABLE FECDTO DATE;
DECLARE VARIABLE FECNOTA VARCHAR(10);
DECLARE VARIABLE AUXNOTA VARCHAR(256);
DECLARE VARIABLE IDNOTA INTEGER;
declare variable descnt_prov char(2);
declare variable AUTORET VARCHAR(10);
declare variable FAUTORET DATE;
declare variable INCLANTI CHAR(2);
DECLARE VARIABLE TRM NUMERIC(18,2);
BEGIN
if (ORDEN = 'C') then
    BEGIN
    NITINI = DESDE;
    NITFIN = HASTA;
    NOMINI = '';
    NOMFIN = 'zz';
    END
ELSE
    BEGIN
    NOMINI = DESDE;
    NOMFIN = HASTA;
    NITINI = '';
    NITFIN = 'zz';
    END
  EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'DESCONTAR RECIBOS PROVISIONALES EN INFORMES DE CARTERA') RETURNING_VALUES (:descnt_prov);
  EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'INCLUIR ANTICIPOS DE CLIENTES EN REPORTES Y CONSULTAS DE CARTERA') returning_values (INCLANTI);
  EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'FECHA AUTORETENEDOR NO DESCONTAR RETENCIONES DEL SALDO PERO SI CONTABILIZARLAS') returning_values (AUTORET);
  EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'ANALISIS DE CARTERA CON FECHA FACTURA O VENCIMIENTO') RETURNING_VALUES (FOV);
  if (AUTORET <> '') then
    FAUTORET = CAST(AUTORET AS DATE);
  else
    FAUTORET = '9999/12/31';
  /* Ubique el NIT */
  FOR select C.TERC_NIT, TERC_NOM, TERC_DV, CLSU_DIR, CLSU_TEL, CLSU_CIUDAD, S.COBR_COD, S.ZONA_COD, T.CIUD_COD, CLIE_CUPO, CLCU_COD, CLSU_NOMBRE, t.terc_obs, C.GRCA_COD, TERC_CONTACTO, TERC_EMAIL, TERC_FAX, TERC_CEL, CLIE_COD
    from terceros T, CLIENTES C, CLIENTE_SUCURSALES S
    where C.TERC_NIT = T.TERC_NIT AND TERC_CLIE = 'S' AND S.TERC_NIT = C.TERC_NIT AND C.TERC_NIT >= :NITINI AND C.TERC_NIT <= :NITFIN AND
        TERC_NOM >= :NOMINI AND TERC_NOM <= :NOMFIN AND ((:GRUPCART = 0) or (C.GRCA_COD = :GRUPCART))
    INTO :NIT, :NOMBRE, :DV, :DIR, :TELEFONO, :CIUDAD, :CODCOBR, :CODZONA, :CODCIUD, :CUPO, :SUCURSAL, :NOMSUC, :obs, :GRUPCOD, :CONTACTO, :EMAIL, :FAX, :CEL, :CODCLI
    DO  
    BEGIN
    if (CODCOBR IS NOT NULL) then
        SELECT COBR_NOM FROM COBRADORES  WHERE COBR_COD = :CODCOBR INTO :NOMCOBR;
    if (CODZONA IS NOT NULL) then
        SELECT ZONA_NOM FROM ZONAS WHERE ZONA_COD = :CODZONA INTO :NOMZONA;
    if (CODCIUD IS NOT NULL) then
        SELECT CIUD_NOM FROM CIUDADES  WHERE CIUD_COD = :CODCIUD INTO :NOMCIUD;
    SELECT GRCA_NOMBRE FROM GRUPO_CARTERA WHERE GRCA_COD = :GRUPCOD INTO :GRUPNOM;
    DISPONIBLE = CUPO;
    OK = 'N';
    if (AGRUPA = 'Z') then
        BEGIN
        if (GRPINI = '') then
            BEGIN
            if ((CODZONA IS NULL) or (CODZONA >= :GRPINI AND CODZONA <= :GRPFIN)) then
                OK = 'S';
            END
        ELSE
            if (CODZONA >= :GRPINI AND CODZONA <= :GRPFIN) then
                OK = 'S';
        END
    if (AGRUPA = 'I') then
        BEGIN
        if (GRPINI = '') then
            BEGIN
            if ((CODCIUD IS NULL) or (CODCIUD >= :GRPINI AND CODCIUD <= :GRPFIN)) then
                OK = 'S';
            END
        ELSE
            if (CODCIUD >= :GRPINI AND CODCIUD <= :GRPFIN) then
                OK = 'S';
        END
    if (AGRUPA = 'N') then
        OK = 'S';
        
    if (OK = 'S') then
        BEGIN
        /* BUSQUE EN SALDOS_DOC_CARTERA LOS QUE TENGAN SALDO > 0 */
        FOR SELECT MVCL_TIPOREF, MVCL_IDREF, MVCL_PREFREF, MVCL_NUMREF, MVCL_FECHA, MVCL_VENCE, MVCL_CONC
            FROM MOVIMIENTO_CLIENTES WHERE TERC_NIT = :NIT AND MVCL_SUCURSAL = :SUCURSAL AND MVCL_FECHA <= :FECHA AND
            MVCL_ABONO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) AND ((:MONEDA = 0) or (MVCL_TRM <> 1))
            INTO :TIPO, :ID, :PREFIJO, :NUMERO, :FECDOC, :VENCE, :CONCEPTO
            DO
            BEGIN
            if ((inclanti = 'SI') or (TIPO <> 45)) then
                BEGIN
                EXECUTE PROCEDURE saldo_doc_cartera(TIPO, ID, FECHA, MONEDA) returning_values (SALDO);
                if (SALDO <> 0) then
                    BEGIN
                    PROVISIONAL = 0;
                    if (FOV = 'FECHA') then
                       DIAS = FECHA - FECDOC;
                    ELSE
                      DIAS = FECHA - VENCE;
                    DISPONIBLE = DISPONIBLE - SALDO;
                    SELECT TIDO_NOMCORTO FROM TIPO_DOCUMENTO WHERE TIDO_COD = :TIPO INTO :TIPONOM;
                    if (TIPO = 41) then
                        SELECT NDCL_DTOFMONTO, NDCL_FECHADTO, NDCL_TRM FROM NOTAS_DEBITO_CLIENTES
                            WHERE NDCL_ID = :ID INTO :DTOF, :FECDTO, :TRM;
                    if (TIPO = 42) then
                        SELECT 0, :FECDOC, 1 FROM NOTAS_CREDITO_CLIENTES
                            WHERE NCCL_ID = :ID INTO :DTOF, :FECDTO, :TRM;
                    if (TIPO = 45) then
                        SELECT ANCL_DTOFMONTO, ANCL_DTOFECHA, ANCL_TRM FROM ANTICIPOS_CLIENTE
                            WHERE ANCL_ID = :ID INTO :DTOF, :FECDTO, :TRM;
                    if (TIPO = 31) then
                        SELECT FACT_DTOFMONTO, FACT_DTOFFECHA, FACT_TRM FROM FACTURAS
                            WHERE FACT_ID = :ID INTO :DTOF, :FECDTO, :TRM;
                    if (TIPO = 33) then
                        SELECT 0, :FECDOC, 1 FROM devoluciones_ventas
                            WHERE DEVT_ID = :ID INTO :DTOF, :FECDTO, :TRM;
                    if ((MONEDA <> 0) AND (TRM <> 0)) then
                        DTOF = DTOF / TRM;
                    if (DTOF IS NULL) then
                        DTOF = 0;
                    if (DTOF <> 0) then
                        BEGIN
                        SELECT SUM(RCDE_DTOF), MAX(RECA_TRM) FROM RECIBOS_CAJA_DETALLE D, RECIBOS_CAJA R
                            WHERE R.reca_id = D.reca_id AND RCDE_IDDOC = :ID AND RCDE_TIPODOC = :TIPO
                            INTO :DTOAPL, :TRM;
                        if (DTOAPL IS NULL) then
                            DTOAPL = 0;
                        if ((MONEDA <> 0) AND (TRM <> 1)) then
                            DTOAPL = DTOAPL / TRM;
                        DTOF = DTOF - DTOAPL;
                        /* SI YA SE VENCIO DEJELO EN CERO */
                        if (FECDTO < FECHA) then
                            DTOF = 0;
                        END
                    if (MONEDA = 0) then
                        SELECT SUM(SDCA_RTFTE - SDCA_ABRTFTE), SUM(SDCA_RTIVA - SDCA_ABRTIVA), SUM(SDCA_RTICA - SDCA_ABRTICA)
                            FROM SALDOS_DOC_CARTERA WHERE SDCA_TIPOREF = :TIPO AND SDCA_IDREF = :ID
                            INTO :RTFTE, :RTIVA, :RTICA;
                    ELSE
                        SELECT SUM((SDCA_RTFTE - SDCA_ABRTFTE)/SDCA_TRM), SUM((SDCA_RTIVA - SDCA_ABRTIVA)/SDCA_TRM), SUM((SDCA_RTICA - SDCA_ABRTICA)/SDCA_TRM)
                            FROM SALDOS_DOC_CARTERA WHERE SDCA_TIPOREF = :TIPO AND SDCA_IDREF = :ID
                            INTO :RTFTE, :RTIVA, :RTICA;
                    if (RTFTE IS NULL) then
                        RTFTE = 0;
                    if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) THEN
                        BEGIN
                        if (RTFTE > 0) then
                            RTFTE = 0;
                        END
                    ELSE
                        BEGIN
                        if (RTFTE < 0) then
                            RTFTE = 0;
                        END
                    if (RTIVA IS NULL) then
                        RTIVA = 0;
                    if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) THEN
                        BEGIN
                        if (RTIVA > 0) then
                            RTIVA = 0;
                        END
                    ELSE
                        BEGIN
                        if (RTIVA < 0) then
                            RTIVA = 0;
                        END
                    if (RTICA IS NULL) then
                        RTICA = 0;
                    if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) THEN
                        BEGIN
                        if (RTICA > 0) then
                            RTICA = 0;
                        END
                    ELSE
                        BEGIN
                        if (RTICA < 0) then
                            RTICA = 0;
                        END
                    if (FAUTORET <= FECDOC) then
                        RTFTE = 0;
                    /* SI TIENE NOTA AGREGUELA */
                    SELECT MAX(NOCL_ID) FROM NOTAS_CLIENTES WHERE TERC_NIT = :NIT AND CLSU_COD = :SUCURSAL AND NOCL_TIPODOC = :TIPO AND NOCL_IDDOC = :ID INTO :IDNOTA;
                    if (IDNOTA IS NOT NULL) then
                        BEGIN
                        SELECT cast(NOCL_FECHA as char(10)), NOCL_TEXTO FROM NOTAS_CLIENTES
                            WHERE NOCL_ID = :IDNOTA INTO :FECNOTA, :AUXNOTA;
                        if (STRLEN(AUXNOTA) < 244) then
                            NOTA = FECNOTA || ':' || AUXNOTA;
                        ELSE
                            NOTA = AUXNOTA;
                        END
                    else
                        NOTA = '';
                    SUSPEND;
                    END  /* SALDO <> 0 */
                END  /* NO ANTICIPO */
            END  /* FOR */
        /* AGREGUE LOS RECIBOS PROVISIONALES CON SIGNO NEGATIVO */
        FOR SELECT 65, MAX(P.RCPR_ID), MAX(PREF_PRE), MAX(RCPR_NUMERO), MAX(RCPR_FECHA), MAX(RCPR_CONC), SUM(RPDE_ABONO * -1), SUM(RPDE_RTFTE*-1), SUM(RPDE_RTIVA*-1), SUM(RPDE_RTICA*-1), MAX(RCPR_TRM)
            FROM RECIBO_PROVISIONAL P, recibo_provisional_detalle D
            WHERE P.rcpr_id = D.rcpr_id AND P.TERC_NIT = :NIT AND RCPR_FECHA <= :FECHA AND RCPR_ANULADO = 'N' AND
            ((RCPR_FECCRUCE IS NULL) or (RCPR_FECCRUCE > :FECHA)) AND RPDE_SUCURSAL = :SUCURSAL AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY P.rcpr_id
            INTO :TIPO, :ID, :PREFIJO, :NUMERO, :FECDOC, :CONCEPTO, :PROVISIONAL, :rtfte,  :RTIVA, :RTICA, :TRM
            DO
            BEGIN
            if ((MONEDA <> 0) AND (TRM <> 0)) then
                PROVISIONAL = PROVISIONAL / TRM;
            if (:descnt_prov = 'NO') then
              SALDO = 0;
            else
              SALDO = :PROVISIONAL;
            SELECT TIDO_NOMCORTO FROM TIPO_DOCUMENTO WHERE TIDO_COD = :TIPO INTO :TIPONOM;
            /* CALCULE EL VENCIMIENTO DEL ULTIMO DOCUMENTO POSFECHADO */
            SELECT MAX(RPPA_FECHA) FROM recibo_provisional_pago WHERE RCPR_ID = :ID INTO :VENCE;
            DIAS = VENCE - FECHA;
            SUSPEND;
            END
        END
    if (AGRUPA = 'C') then
        BEGIN
        FOR SELECT DISTINCT COBR_COD FROM MOVIMIENTO_CLIENTES
            WHERE TERC_NIT = :NIT AND MVCL_SUCURSAL = :SUCURSAL AND MVCL_FECHA <= :FECHA AND
            MVCL_ABONO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            INTO :codcobr
            DO
            BEGIN
            OK = 'N';
            if (GRPINI = '') then
                BEGIN
                if ((CODCOBR IS NULL) or (CODCOBR >= :GRPINI AND CODCOBR <= :GRPFIN)) then
                    OK = 'S';
                END
            ELSE
                if (CODCOBR >= :GRPINI AND CODCOBR <= :GRPFIN) then
                    OK = 'S';
            if (OK = 'S') then
                BEGIN
                SELECT COBR_NOM FROM COBRADORES  WHERE COBR_COD = :CODCOBR INTO :NOMCOBR;
                /* BUSQUE EN SALDOS_DOC_CARTERA LOS QUE TENGAN SALDO > 0 */
                FOR SELECT MVCL_TIPOREF, MVCL_IDREF, MVCL_PREFREF, MVCL_NUMREF, MVCL_FECHA, MVCL_VENCE, MVCL_CONC
                    FROM MOVIMIENTO_CLIENTES WHERE TERC_NIT = :NIT AND MVCL_SUCURSAL = :SUCURSAL AND MVCL_FECHA <= :FECHA AND
                    MVCL_ABONO = 'N' AND COBR_COD = :codcobr AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) AND
                    ((:MONEDA = 0) or (MVCL_TRM <> 1))
                    INTO :TIPO, :ID, :PREFIJO, :NUMERO, :FECDOC, :VENCE, :CONCEPTO
                    DO
                    BEGIN
                    if ((inclanti = 'SI') or (TIPO <> 45)) then
                        BEGIN
                        EXECUTE PROCEDURE saldo_doc_cartera(TIPO, ID, FECHA, MONEDA) returning_values (SALDO);
                        if (SALDO <> 0) then
                            BEGIN
                            PROVISIONAL = 0;
                            if (FOV = 'FECHA') then
                               DIAS = FECHA - FECDOC;
                            ELSE
                              DIAS = FECHA - VENCE;
                            DISPONIBLE = DISPONIBLE - SALDO;
                            SELECT TIDO_NOMCORTO FROM TIPO_DOCUMENTO WHERE TIDO_COD = :TIPO INTO :TIPONOM;
                            if (TIPO = 41) then
                                SELECT NDCL_DTOFMONTO, NDCL_FECHADTO, NDCL_TRM FROM NOTAS_DEBITO_CLIENTES
                                    WHERE NDCL_ID = :ID INTO :DTOF, :FECDTO, :TRM;
                            if (TIPO = 42) then
                                SELECT 0, :FECDOC, 1 FROM NOTAS_CREDITO_CLIENTES
                                    WHERE NCCL_ID = :ID INTO :DTOF, :FECDTO, :TRM;
                            if (TIPO = 45) then
                                SELECT ANCL_DTOFMONTO, ANCL_DTOFECHA, ANCL_TRM FROM ANTICIPOS_CLIENTE
                                    WHERE ANCL_ID = :ID INTO :DTOF, :FECDTO, :TRM;
                            if (TIPO = 31) then
                                SELECT FACT_DTOFMONTO, FACT_DTOFFECHA, FACT_TRM FROM FACTURAS
                                    WHERE FACT_ID = :ID INTO :DTOF, :FECDTO, :TRM;
                            if (TIPO = 33) then
                                SELECT 0, :FECDOC, 1 FROM devoluciones_ventas
                                    WHERE DEVT_ID = :ID INTO :DTOF, :FECDTO, :TRM;
                            if (DTOF IS NULL) then
                                DTOF = 0;
                            if ((MONEDA <> 0) AND (TRM <> 0)) then
                                DTOF = DTOF / TRM;
                            if (DTOF <> 0) then
                                BEGIN
                                SELECT SUM(RCDE_DTOF) FROM RECIBOS_CAJA_DETALLE WHERE RCDE_IDDOC = :ID AND RCDE_TIPODOC = :TIPO INTO :DTOAPL;
                                if (DTOAPL IS NULL) then
                                    DTOAPL = 0;
                                DTOF = DTOF - DTOAPL;
                                /* SI YA SE VENCIO DEJELO EN CERO */
                                if (FECDTO < FECHA) then
                                    DTOF = 0;
                                END
                            SELECT SUM(SDCA_RTFTE - SDCA_ABRTFTE), SUM(SDCA_RTIVA - SDCA_ABRTIVA), SUM(SDCA_RTICA - SDCA_ABRTICA)
                                FROM SALDOS_DOC_CARTERA WHERE SDCA_TIPOREF = :TIPO AND SDCA_IDREF = :ID INTO :RTFTE, :RTIVA, :RTICA;
                            if (RTFTE IS NULL) then
                                RTFTE = 0;
                            if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) THEN
                                BEGIN
                                if (RTFTE > 0) then
                                    RTFTE = 0;
                                END
                            ELSE
                                BEGIN
                                if (RTFTE < 0) then
                                    RTFTE = 0;
                                END
                            if (FAUTORET <= FECDOC) then
                                RTFTE = 0;
                            if (RTIVA IS NULL) then
                                RTIVA = 0;
                            if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) THEN
                                BEGIN
                                if (RTIVA > 0) then
                                    RTIVA = 0;
                                END
                            ELSE
                                BEGIN
                                if (RTIVA < 0) then
                                    RTIVA = 0;
                                END
                            if (RTICA IS NULL) then
                                RTICA = 0;
                            if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) THEN
                                BEGIN
                                if (RTICA > 0) then
                                    RTICA = 0;
                                END
                            ELSE
                                BEGIN
                                if (RTICA < 0) then
                                    RTICA = 0;
                                END
                            /* SI TIENE NOTA AGREGUELA */
                            SELECT MAX(NOCL_ID) FROM NOTAS_CLIENTES WHERE TERC_NIT = :NIT AND CLSU_COD = :SUCURSAL AND NOCL_TIPODOC = :TIPO AND NOCL_IDDOC = :ID INTO :IDNOTA;
                            if (IDNOTA IS NOT NULL) then
                                BEGIN
                                SELECT cast(NOCL_FECHA as char(10)), NOCL_TEXTO FROM NOTAS_CLIENTES
                                    WHERE NOCL_ID = :IDNOTA INTO :FECNOTA, :AUXNOTA;
                                if (STRLEN(AUXNOTA) < 244) then
                                    NOTA = FECNOTA || ':' || AUXNOTA;
                                ELSE
                                    NOTA = AUXNOTA;
                                END
                            else
                                NOTA = '';
                            SUSPEND;
                            END  /* SALDO <> 0 */
                        END  /* NO ANTICIPO */
                    END  /* FOR */
                /* AGREGUE LOS RECIBOS PROVISIONALES CON SIGNO NEGATIVO */
                FOR SELECT 65, MAX(P.RCPR_ID), MAX(PREF_PRE), MAX(RCPR_NUMERO), MAX(RCPR_FECHA), MAX(RCPR_CONC), SUM(RPDE_ABONO * -1), SUM(RPDE_RTFTE*-1), SUM(RPDE_RTIVA*-1), SUM(RPDE_RTICA*-1), MAX(RCPR_TRM)
                    FROM RECIBO_PROVISIONAL P, recibo_provisional_detalle D
                    WHERE P.rcpr_id = D.rcpr_id AND P.TERC_NIT = :NIT AND P.VEND_COD = :codcobr AND RCPR_FECHA <= :FECHA AND RCPR_ANULADO = 'N' AND
                    ((RCPR_FECCRUCE IS NULL) or (RCPR_FECCRUCE > :FECHA)) AND RPDE_SUCURSAL = :SUCURSAL AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                    GROUP BY P.rcpr_id
                    INTO :TIPO, :ID, :PREFIJO, :NUMERO, :FECDOC, :CONCEPTO, :PROVISIONAL, :rtfte,  :RTIVA, :RTICA, :TRM
                    DO
                    BEGIN
                    if ((MONEDA <> 0) AND (TRM <> 0)) then
                        PROVISIONAL = PROVISIONAL / TRM;
                    if (:descnt_prov = 'NO') then
                      SALDO = 0;
                    else
                      SALDO = :PROVISIONAL;
                    SELECT TIDO_NOMCORTO FROM TIPO_DOCUMENTO WHERE TIDO_COD = :TIPO INTO :TIPONOM;
                    /* CALCULE EL VENCIMIENTO DEL ULTIMO DOCUMENTO POSFECHADO */
                    SELECT MAX(RPPA_FECHA) FROM recibo_provisional_pago WHERE RCPR_ID = :ID INTO :VENCE;
                    DIAS = VENCE - FECHA;
                    SUSPEND;
                    END
                END /* ok */
            END  /* FOR COBR */
        END  /* AGRUPA = C */
    END  /* FOR NIT */
END
^

SET TERM ; ^

/* 20090415C */
/* si la cuenta de anticipos o por documento es null o '' usa la cta del tercero */
SET TERM ^ ;

CREATE OR ALTER PROCEDURE CONTABIL_EGRESO(
    IDDOC INTEGER,
    IDINTER INTEGER)
RETURNS (
    ERROR INTEGER,
    VER CHAR(1),
    IDC INTEGER)
AS
declare variable PREF VARCHAR(4);
declare variable NUM VARCHAR(6);
declare variable FECAUX DATE;
declare variable FECHA CHAR(8);
declare variable CONC CHAR(120);
declare variable VRDTO NUMERIC(18, 2);
declare variable VRRTFTE NUMERIC(18, 2);
declare variable VRRTIVA NUMERIC(18, 2);
declare variable VRRTICA NUMERIC(18, 2);
declare variable VRTOTAL NUMERIC(18, 2);
declare variable TIPOCOMP VARCHAR(3);
declare variable PREFCONT VARCHAR(4);
declare variable BASE CHAR(1);
declare variable CTABASE VARCHAR(20);
declare variable CAJA CHAR(1);
declare variable CTACAJA VARCHAR(20);
declare variable RTFTE CHAR(1);
declare variable CTARTFTE VARCHAR(20);
declare variable RTIVA CHAR(1);
declare variable CTARTIVA VARCHAR(20);
declare variable RTICA CHAR(1);
declare variable CTARTICA VARCHAR(20);
declare variable DTO CHAR(1);
declare variable CTADTO VARCHAR(20);
declare variable EXISTE CHAR(1);
declare variable CUENTA VARCHAR(20);
declare variable MONTO NUMERIC(18,2);
declare variable ES_RETENCION CHAR(1);
declare variable TIPOCUEN CHAR(1);
declare variable NIT VARCHAR(20);
declare variable PROY VARCHAR(4);
declare variable CENTRO VARCHAR(4);
declare variable MONTOBASE NUMERIC(18,2);
declare variable PORC NUMERIC(9,2);
declare variable DEBITO NUMERIC(18,2);
declare variable CREDITO NUMERIC(18,2);
declare variable NROI INTEGER;
declare variable SUMA NUMERIC(18,2);
declare variable TCTACLIEN VARCHAR(20);
declare variable TCTARTFTE VARCHAR(20);
declare variable TCTARTIVA VARCHAR(20);
declare variable TCTARTICA VARCHAR(20);
declare variable TCTACART VARCHAR(20);
declare variable TIPOIT INTEGER;
declare variable IDIT INTEGER;
declare variable PREFIT VARCHAR(4);
declare variable NUMIT VARCHAR(6);
declare variable NUMEROIT VARCHAR(10);
declare variable ABONOIT NUMERIC(18,2);
declare variable CTADIC VARCHAR(20);
declare variable BASEADIC VARCHAR(20);
declare variable PORCADIC NUMERIC(5,2);
declare variable VALORADIC NUMERIC(18,2);
declare variable DBADIC CHAR(1);
declare variable VRBASE NUMERIC(18,2);
declare variable GMF CHAR(1);
declare variable CODBCO INTEGER;
declare variable NUMCHEQ VARCHAR(20);
declare variable CRUCES NUMERIC(18,2);
declare variable VRCAJA NUMERIC(18,2);
declare variable OK INTEGER;
declare variable DIFCAMBIO NUMERIC(18,2);
declare variable CTADIF VARCHAR(20);
declare variable RTFTEC NUMERIC(18,2);
declare variable RTIVAC NUMERIC(18,2);
declare variable RTICAC NUMERIC(18,2);
declare variable RTFTER CHAR(1);
declare variable CTARTFTER VARCHAR(20);
declare variable RTIVAR CHAR(1);
declare variable CTARTIVAR VARCHAR(20);
declare variable RTICAR CHAR(1);
declare variable CTARTICAR VARCHAR(20);
declare variable RET CHAR(2);
declare variable RTIT NUMERIC(18,2);
BEGIN
/* BUSQUE LA INTERFACE */
EXISTE = 'N';
SELECT 'S', TICO_COD, PRCO_PRE, INCJ_BASE, INCJ_DTOPP, INCJ_RTFTE, INCJ_RTIVA, INCJ_RTICA, INCJ_CAJA, INCJ_CTABASE, INCJ_CTADTO, INCJ_CTARTFTE, INCJ_CTARTIVA, INCJ_CTARTICA, INCJ_CTACAJA, INCJ_CONFIRMAR
    FROM INTERFAZ_CAJA
    WHERE INCJ_ID = :IDINTER
    INTO :EXISTE, :TIPOCOMP, :PREFCONT, :BASE, :DTO, :RTFTE, :RTIVA, :RTICA, :CAJA, :CTABASE, :CTADTO, :CTARTFTE, :CTARTIVA, :CTARTICA, :CTACAJA, :VER;
if (EXISTE = 'S') then
    BEGIN
    OK = 0;
    FOR SELECT CNTB_ID FROM CONTABILIZACION WHERE CNTB_TIPOREF = 62 AND CNTB_IDREF = :IDDOC INTO :OK DO
        BEGIN
        DELETE FROM CONTABILIZACION_DET WHERE CNTB_ID = :OK;
        DELETE FROM CONTABILIZACION WHERE CNTB_ID = :OK;
        END

    /* TRAIGA EL ENCABEZADO DEL EGRESO */
    SELECT PREF_PRE, EGRE_NUMERO, EGRE_FECHA, E.TERC_NIT, EGRE_CONC, EGRE_DTOF, EGRE_MONTO, EGRE_RTFTEMONTO, EGRE_RTIVAMONTO, EGRE_RTICAMONTO, TERC_CTARTFTE, TERC_CTARTIVA, TERC_CTARTICA, TERC_CTACLIENTE
        FROM EGRESOS E, TERCEROS T
        WHERE EGRE_ID = :IDDOC AND E.TERC_NIT = T.TERC_NIT
        INTO :PREF, :NUM, :FECAUX, :NIT, :CONC, :VRDTO, :VRTOTAL, :VRRTFTE, :VRRTIVA, :VRRTICA, :TCTARTFTE, TCTARTIVA, TCTARTICA, TCTACLIEN;
    /* SI ES PROVEEDOR, SOBREESCIBE LAS CUENTAS  */
    SELECT PROV_CTAPAGAR, PROV_CTARTFTE, PROV_CTARTIVA, PROV_CTARTICA
        FROM PROVEEDORES WHERE TERC_NIT = :NIT
        INTO TCTACLIEN, TCTARTFTE, TCTARTIVA, TCTARTICA;
    SELECT PREF_CENTRO, PREF_PROY FROM PREFIJOS
        WHERE PREF_PRE = :PREF AND TIDO_COD = 62 INTO :CENTRO, :PROY;
    EXECUTE PROCEDURE FECHA_A_CONTA(:FECAUX) returning_values (:FECHA);
    /* REGISTRE EL ENCABEZADO CONTABLE */
    IDC = GEN_ID(ID_CONTABILIZA, 1);
    INSERT INTO CONTABILIZACION (CNTB_ID, CNTB_TIPOCOMP, CNTB_PREFCNT, CNTB_NUMERO, CNTB_FECHA, CNTB_CONCEPTO, CNTB_REF, CNTB_TIPOREF, CNTB_IDREF, CNTB_PREFREF, CNTB_NUMREF, CNTB_PROCESADO)
        VALUES (:IDC, :TIPOCOMP, :PREFCONT, :NUM, :FECHA, :CONC, '', 62, :IDDOC, :PREF, :NUM, 'N');
    /* SUME LOS CRUCES PARA LLEVARLOS A LA CUENTA X PAGAR Y RESTAR DE LA CAJA */
    SELECT SUM(EGCC_ABONO) FROM EGRESOS_CRUCEC WHERE EGRE_ID = :iddoc INTO :CRUCES;
    if (CRUCES IS NULL) then
        CRUCES = 0;
    VRCAJA = VRTOTAL - CRUCES;
    NROI = 0;
    SUMA = 0;
    ERROR = 0;
    /* EL CREDITO EN LA CAJA O EL BANCO */
    IF ((CAJA = 'K')) THEN
        BEGIN
        if (VRCAJA <> 0) then
            BEGIN
            CUENTA = NULL;
            EXECUTE PROCEDURE VALIDE_CUENTA_C (CTACAJA) RETURNING_VALUES (:OK);
            IF (OK = 0) THEN
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :CTACAJA INTO :CUENTA, :TIPOCUEN;
            ELSE
                begin
                EXECUTE PROCEDURE ERROR (62, :IDDOC, :CTACAJA, 2);
                CUENTA = CTACAJA;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 4);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRCAJA, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - VRCAJA;
                END
            END /* VRCAJA <> 0 */
        END /* CAJA CONSTANTE */
    IF ((CAJA = 'F')) THEN
        BEGIN
        /* mueva la cuenta de la caja o el banco o ambas */
        /* PRIMERO LA CAJA */
        FOR SELECT CAJA_CUENTA, EGCA_MONTO FROM EGRESOS_CAJA E, CAJAS C
            WHERE C.CAJA_ID = E.CAJA_ID AND EGRE_ID = :IDDOC
            INTO :CTACAJA, :MONTO
            DO
            BEGIN
            if (MONTO <> 0) then
                BEGIN
                CUENTA = NULL;
                EXECUTE PROCEDURE VALIDE_CUENTA_C (CTACAJA) RETURNING_VALUES (:OK);
                IF (OK = 0) THEN
                    SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                        WHERE CUEN_COD = :CTACAJA INTO :CUENTA, :TIPOCUEN;
                ELSE
                    begin
                    EXECUTE PROCEDURE ERROR (62, :IDDOC, :CTACAJA, 2);
                    CUENTA = CTACAJA;
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 4);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA - MONTO;
                    END
                END /* MONTO <> 0 */
            END /* DO CAJA */
        /* AHORA EL BANCO */
        MONTO = 0;
        SELECT CUBA_CTACONTA, EGBC_MONTO, EGBC_GMF, E.CUBA_COD, CUBA_GMFPOR, EGBC_NUMERO
            FROM EGRESOS_BANCO E, CUENTAS_BANCO C
            WHERE E.CUBA_COD = C.CUBA_COD AND EGRE_ID = :IDDOC
            INTO :CTACAJA, :MONTO, :GMF, :CODBCO, :PORC, :NUMCHEQ;
        if (MONTO <> 0) then
            BEGIN
            if (MONTO <> 0) then
                BEGIN
                CUENTA = NULL;
                EXECUTE PROCEDURE VALIDE_CUENTA_C (CTACAJA) RETURNING_VALUES (:OK);
                IF (OK = 0) THEN
                    SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                        WHERE CUEN_COD = :CTACAJA INTO :CUENTA, :TIPOCUEN;
                ELSE
                    begin
                    EXECUTE PROCEDURE ERROR (62, :IDDOC, :CTACAJA, 2);
                    CUENTA = CTACAJA;
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 4);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, :NUMCHEQ, 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA - MONTO;
                    END
                /* EL GMF */
                if ((GMF = 'S') AND (PORC <> 0)) then
                    BEGIN
                    EXECUTE procedure REDONDEE(:MONTO * :PORC / 1000, 0) returning_values (MONTO);
                    /* REGISTRE EL GMF EN LA MISMA CUENTA DEL BANCO COMO CREDITO */
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, :NUMCHEQ, 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA - MONTO;

                    /* AHORA LA CUENTA DEL GASTO */
                    SELECT CUBA_CTAGMF FROM CUENTAS_BANCO
                        where CUBA_COD = :CODBCO INTO :CTACAJA;
                    EXECUTE PROCEDURE VALIDE_CUENTA_C (CTACAJA) RETURNING_VALUES (:OK);
                    IF (OK = 0) THEN
                        SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                            WHERE CUEN_COD = :CTACAJA INTO :CUENTA, :TIPOCUEN;
                    ELSE
                        begin
                        EXECUTE PROCEDURE ERROR (62, :IDDOC, :CTACAJA, 2);
                        CUENTA = CTACAJA;
                        TIPOCUEN = 'N';
                        ERROR = ERROR + 1;
                        end
                    if (TIPOCUEN = 'I') then
                        BEGIN
                        EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
                        TIPOCUEN = 'N';
                        ERROR = ERROR + 1;
                        END
                    if (TIPOCUEN = 'C') then
                        BEGIN
                        EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 4);
                        TIPOCUEN = 'N';
                        ERROR = ERROR + 1;
                        END
                    if (TIPOCUEN = 'N') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, :NUMCHEQ, :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NROI = NROI + 1;
                        SUMA = SUMA + MONTO;
                        END
                    END /* GMF */
                END /* MONTO <> 0 */
            END /* EGRESO_BANCO */
        END /* CAJA = F */

    /* LOS CRUCES CON CUENTAS X COBRAR */
    if (CRUCES <> 0) then
        BEGIN
        SELECT TERC_CTACLIENTE FROM TERCEROS WHERE TERC_NIT = :nit INTO :tctacart;
        if (tctacart IS NULL) then
            tctacart = tctaclien;
        CUENTA = NULL;
        EXECUTE PROCEDURE VALIDE_CUENTA_C (tctacart) RETURNING_VALUES (:OK);
        IF (OK = 0) THEN
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :tctacart INTO :CUENTA, :TIPOCUEN;
        ELSE
            begin
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :tctacart, 2);
            CUENTA = tctacart;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            /* DEBERIA RECORRER DOCUMENTO POR DOCUMENTO */
            FOR SELECT EGCC_TIPODOC, EGCC_PREFIJO, EGCC_NUMERO, EGCC_ABONO+EGCC_RTFTE+EGCC_RTIVA+EGCC_RTICA+EGCC_DTOF
                FROM egresos_crucec WHERE EGRE_ID = :IDDOC
                INTO :TIPOIT, PREFIT, NUMIT, ABONOIT
                DO
                BEGIN
                NUMEROIT = PREFIT || NUMIT;
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :ABONOIT, 0, 0, :NIT, :PROY, :CENTRO, NULL, :NUMEROIT, NULL, NULL, :TIPOIT, 0);
                SUMA = SUMA - ABONOIT;
                NROI = NROI + 1;
                END
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :CRUCES, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            SUMA = SUMA - CRUCES;
            NROI = NROI + 1;
            END
        /* LA DIFERENCIA EN CAMBIO */
        SELECT SUM(EGCC_DIFCAMBIO) FROM egresos_crucec WHERE EGRE_ID = :iddoc INTO :DIFCAMBIO;
        IF ((DIFCAMBIO IS NOT NULL) AND (DIFCAMBIO <> 0)) THEN
            BEGIN
            if (DIFCAMBIO > 0) then
                execute procedure lee_configuracion('GENERAL','GENERAL','CUENTA DE INGRESO POR DIFERENCIA EN CAMBIO PARA OPERACIONES EN OTRA MONEDA') returning_values (:ctadif);
            else
                execute procedure lee_configuracion('GENERAL','GENERAL','CUENTA DE GASTO POR DIFERENCIA EN CAMBIO PARA OPERACIONES EN OTRA MONEDA') returning_values (:ctadif);
            CUENTA = NULL;
            EXECUTE PROCEDURE VALIDE_CUENTA_C (ctadif) RETURNING_VALUES (:OK);
            IF (OK = 0) THEN
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :ctadif INTO :CUENTA, :TIPOCUEN;
            ELSE
                begin
                EXECUTE PROCEDURE ERROR (62, :IDDOC, :ctadif, 2);
                CUENTA = ctadif;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 4);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                if (DIFCAMBIO > 0) then
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :difcambio, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                else
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', ABS(:difcambio), 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - difcambio;
                END
            END
        /* RETEFUENTE DEL CRUCE */
        SELECT first 1 INCJ_RTFTE, INCJ_RTIVA, INCJ_RTICA, INCJ_CTARTFTE, INCJ_CTARTIVA, INCJ_CTARTICA
            FROM INTERFAZ_CAJA WHERE tido_cod = 61 into :RTFTER, :RTIVAR, :RTICAR, :CTARTFTER, :CTARTIVAR, :CTARTICAR;
        SELECT SUM(EGCC_RTFTE) FROM egresos_crucec WHERE EGRE_ID = :iddoc INTO :rtftec;
        IF ((rtftec IS NOT NULL) AND (rtftec <> 0)) THEN
            BEGIN
            if ((RTFTER = 'T') or (RTFTER = 'K')) then
                BEGIN
                if (RTFTER = 'T') then
                    SELECT TERC_CTARTFTE FROM TERCEROS WHERE TERC_NIT = :NIT INTO CTARTFTER;
                CUENTA = NULL;
                EXECUTE PROCEDURE VALIDE_CUENTA_C (ctartfter) RETURNING_VALUES (:OK);
                IF (OK = 0) THEN
                    SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                        WHERE CUEN_COD = :ctartfter INTO :CUENTA, :TIPOCUEN;
                ELSE
                    begin
                    EXECUTE PROCEDURE ERROR (62, :IDDOC, :ctartfter, 2);
                    CUENTA = ctartfter;
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 4);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :rtftec, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA + rtftec;
                    END
                END
            END
        /* RETEIVA DEL CRUCE */
        SELECT SUM(EGCC_RTIVA) FROM egresos_crucec WHERE EGRE_ID = :iddoc INTO :rtivac;
        IF ((rtivac IS NOT NULL) AND (rtivac <> 0)) THEN
            BEGIN
            if ((RTIVAR = 'T') or (RTIVAR = 'K')) then
                BEGIN
                if (RTIVAR = 'T') then
                    SELECT TERC_CTARTIVA FROM TERCEROS WHERE TERC_NIT = :NIT INTO CTARTIVAR;
                CUENTA = NULL;
                EXECUTE PROCEDURE VALIDE_CUENTA_C (ctartivar) RETURNING_VALUES (:OK);
                IF (OK = 0) THEN
                    SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                        WHERE CUEN_COD = :ctartivar INTO :CUENTA, :TIPOCUEN;
                ELSE
                    begin
                    EXECUTE PROCEDURE ERROR (62, :IDDOC, :ctartivar, 2);
                    CUENTA = ctartivar;
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 4);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :rtivac, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA + rtivac;
                    END
                END
            END
        /* RETEICA DEL CRUCE */
        SELECT SUM(EGCC_RTICA) FROM egresos_crucec WHERE EGRE_ID = :iddoc INTO :rticac;
        IF ((rticac IS NOT NULL) AND (rtivac <> 0)) THEN
            BEGIN
            if ((RTICAR = 'T') or (RTICAR = 'K')) then
                BEGIN
                if (RTICAR = 'T') then
                    SELECT TERC_CTARTICA FROM TERCEROS WHERE TERC_NIT = :NIT INTO CTARTICAR;
                CUENTA = NULL;
                EXECUTE PROCEDURE VALIDE_CUENTA_C (ctarticar) RETURNING_VALUES (:OK);
                IF (OK = 0) THEN
                    SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                        WHERE CUEN_COD = :ctarticar INTO :CUENTA, :TIPOCUEN;
                ELSE
                    begin
                    EXECUTE PROCEDURE ERROR (62, :IDDOC, :ctarticar, 2);
                    CUENTA = ctarticar;
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 4);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :rticac, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA + rticac;
                    END
                END
            END
        END /* cruces */

    if (DTO = 'K') then /* DTO EN CTA CONSTANTE */
        BEGIN
        if (VRDTO <> 0) then
            BEGIN
            CUENTA = NULL;
            EXECUTE PROCEDURE VALIDE_CUENTA_C (CTADTO) RETURNING_VALUES (:OK);
            IF (OK = 0) THEN
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :CTADTO INTO :CUENTA, :TIPOCUEN;
            ELSE
                begin
                EXECUTE PROCEDURE ERROR (62, :IDDOC, :CTADTO, 2);
                CUENTA = CTADTO;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 4);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRDTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - VRDTO;
                END
            END /* VRDTO <> 0 */
        END /* DTO EN CTA CONSTANTE */

    /* LA DIFERENCIA EN CAMBIO */
    SELECT SUM(EGDE_DIFCAMBIO) FROM egresos_detalle WHERE EGRE_ID = :iddoc INTO :DIFCAMBIO;
    IF ((DIFCAMBIO IS NOT NULL) AND (DIFCAMBIO <> 0)) THEN
        BEGIN
        if (DIFCAMBIO > 0) then
            execute procedure lee_configuracion('GENERAL','GENERAL','CUENTA DE GASTO POR DIFERENCIA EN CAMBIO PARA OPERACIONES EN OTRA MONEDA') returning_values (:ctadif);
        else
            execute procedure lee_configuracion('GENERAL','GENERAL','CUENTA DE INGRESO POR DIFERENCIA EN CAMBIO PARA OPERACIONES EN OTRA MONEDA') returning_values (:ctadif);
        CUENTA = NULL;
        EXECUTE PROCEDURE VALIDE_CUENTA_C (ctadif) RETURNING_VALUES (:OK);
        IF (OK = 0) THEN
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :ctadif INTO :CUENTA, :TIPOCUEN;
        ELSE
            begin
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :ctadif, 2);
            CUENTA = ctadif;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 4);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            if (DIFCAMBIO > 0) then
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :difcambio, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            else
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, ABS(:difcambio), 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA + difcambio;
            END
        END
    /* RETENCION FUENTE */
    if ((RTFTE = 'T') or (RTFTE = 'K')) then
      if (VRRTFTE <> 0) then
        BEGIN
        if (RTFTE = 'T') then
            CTARTFTE = TCTARTFTE;
        CUENTA = NULL;
        EXECUTE PROCEDURE VALIDE_CUENTA_C (CTARTFTE) RETURNING_VALUES (:OK);
        IF (OK = 0) THEN
            SELECT CUEN_COD, CUEN_RETENCION, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTARTFTE INTO :CUENTA, :ES_RETENCION, :TIPOCUEN;
        ELSE
            begin
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :CTARTFTE, 2);
            CUENTA = CTARTFTE;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 4);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            if (ES_RETENCION = 'S') then
                BEGIN
                VRBASE = VRTOTAL;
                SELECT PROV_RETEFTE from proveedores where terc_nit = :NIT INTO :PORC;
                END
            ELSE
                BEGIN
                VRBASE = 0;
                PORC = 0;
                END
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, :VRBASE, :PORC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA - VRRTFTE;
            END
        END /* RTFTE */
    /* RETENCION IVA */
    if ((RTIVA = 'T') or (RTIVA = 'K')) then
      if (VRRTIVA <> 0) then
        BEGIN
        if (RTIVA = 'T') then
            CTARTIVA = TCTARTIVA;
        CUENTA = NULL;
        EXECUTE PROCEDURE VALIDE_CUENTA_C (CTARTIVA) RETURNING_VALUES (:OK);
        IF (OK = 0) THEN
            SELECT CUEN_COD, CUEN_RETENCION, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTARTIVA INTO :CUENTA, :ES_RETENCION, :TIPOCUEN;
        ELSE
            begin
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :CTARTIVA, 2);
            CUENTA = CTARTIVA;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 4);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            if (ES_RETENCION = 'S') then
                BEGIN
                VRBASE = VRTOTAL;
                SELECT PROV_RTEIVA from proveedores where terc_nit = :NIT INTO :PORC;
                END
            ELSE
                BEGIN
                VRBASE = 0;
                PORC = 0;
                END
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTIVA, :VRBASE, :PORC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA - VRRTIVA;
            END
        END /* RTIVA */
    /* RETENCION DE ICA */
    if ((RTICA = 'T') or (RTICA = 'K')) then
      if (VRRTICA <> 0) then
        BEGIN
        if (RTICA = 'T') then
            CTARTICA = TCTARTICA;
        CUENTA = NULL;
        EXECUTE PROCEDURE VALIDE_CUENTA_C (CTARTICA) RETURNING_VALUES (:OK);
        IF (OK = 0) THEN
            SELECT CUEN_COD, CUEN_RETENCION, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTARTICA INTO :CUENTA, :ES_RETENCION, :TIPOCUEN;
        ELSE
            begin
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :CTARTICA, 2);
            CUENTA = CTARTICA;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 4);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            if (ES_RETENCION = 'S') then
                BEGIN
                VRBASE = VRTOTAL;
                SELECT PROV_RTEICA from proveedores where terc_nit = :NIT INTO :PORC;
                END
            ELSE
                BEGIN
                VRBASE = 0;
                PORC = 0;
                END
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTICA, :VRBASE, :PORC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA - VRRTICA;
            END
        END /* RTICA */
    /* RECORRA LAS CUENTAS DE EGRESOS_CONTABILIDAD */
    FOR SELECT CUEN_COD, EGCO_NIT, EGCO_PROY, EGCO_CENTRO, EGCO_CONC, EGCO_DEBITOS, EGCO_CREDITOS, EGCO_BASEM, EGCO_PORC
        FROM EGRESOS_CONTABILIDAD WHERE EGRE_ID = :IDDOC ORDER BY EGCO_ITEM
        INTO :CTABASE, :NIT, :PROY, :CENTRO, :CONC, :DEBITO, :CREDITO, :MONTOBASE, :PORC
        DO
        BEGIN
        CUENTA = NULL;
        EXECUTE PROCEDURE VALIDE_CUENTA_C (CTABASE) RETURNING_VALUES (:OK);
        IF (OK = 0) THEN
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTABASE INTO :CUENTA, :TIPOCUEN;
        ELSE
            begin
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :CTABASE, 2);
            CUENTA = CTABASE;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 4);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'N') then
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :DEBITO, :CREDITO, :MONTOBASE, :PORC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
        SUMA = SUMA + DEBITO - CREDITO;
        NROI = NROI + 1;
        END
    /* CIERRE EL COMPROBANTE CONTRA LA CUENTA DEL TERCERO O LA BASE CONSTANTE */
    if (SUMA <> 0) THEN
        BEGIN
        if (SUMA < 0) then
            BEGIN
            DEBITO = SUMA * -1;
            CREDITO = 0;
            END
        ELSE
            BEGIN
            DEBITO = 0;
            CREDITO = SUMA;
            END
        if ((BASE = 'F') or (BASE = 'T') or (BASE = 'K')) then
            BEGIN
            if (BASE = 'T') then
                CTABASE = TCTACLIEN;
            if (BASE = 'F') then
                BEGIN
                SELECT CAJA_CUENTA FROM EGRESOS E, CAJAS C
                    WHERE C.CAJA_ID = E.CAJA_ID AND EGRE_ID = :IDDOC INTO :CTABASE;
                END
            CUENTA = NULL;
            EXECUTE PROCEDURE VALIDE_CUENTA_C (CTABASE) RETURNING_VALUES (:OK);
            IF (OK = 0) THEN
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :CTABASE INTO :CUENTA, :TIPOCUEN;
            ELSE
                begin
                EXECUTE PROCEDURE ERROR (62, :IDDOC, :CTABASE, 2);
                CUENTA = CTABASE;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                /* DEBERIA RECORRER DOCUMENTO POR DOCUMENTO */
                FOR SELECT RCDE_TIPODOC, RCDE_PREFIJO, RCDE_NUMERO, RCDE_ABONO+RCDE_RTFTE+RCDE_RTIVA+RCDE_RTICA+RCDE_DTOF
                    FROM RECIBOS_CAJA_DETALLE WHERE RECA_ID = :IDDOC
                    INTO :TIPOIT, PREFIT, NUMIT, ABONOIT
                    DO
                    BEGIN
                    NUMEROIT = PREFIT || NUMIT;
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :ABONOIT, 0, 0, :NIT, :PROY, :CENTRO, NULL, :NUMEROIT, NULL, NULL, :TIPOIT, 0);
                    NROI = NROI + 1;
                    END
                END
            if (TIPOCUEN = 'N') then
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :DEBITO, :CREDITO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            END /* SUMA EN CARTERA */
        if (BASE = 'D') then
            BEGIN
            execute procedure lee_configuracion('CXPAGAR','SALDOS','DESCONTAR RETENCIONES POR CAUSACION') returning_values (RET);
            CTABASE = NULL;
            FOR SELECT EGDE_TIPODOC, EGDE_IDDOC, EGDE_PREFIJO, EGDE_NUMERO, EGDE_ABONO+EGDE_DTOF, EGDE_RTFTE+EGDE_RTIVA+EGDE_RTICA
                FROM EGRESOS_DETALLE WHERE EGRE_ID = :IDDOC INTO :tipoit, :IDIT, :PREFIT, :NUMIT, :suma, :RTIT
                DO
                BEGIN
                if (TIPOIT <> 55) then
                    SELECT CUEN_COD, PROY_COD, CENT_COD FROM COMPROBANTE_ENCABEZADO E, COMPROBANTE_DETALLE D
                        WHERE E.enco_consec = D.enco_consec AND E.enco_tiporef = :TIPOIT AND E.enco_idref = :IDIT AND
                        SUBSTR(CUEN_COD,1,1) = '2' AND SUBSTR(CUEN_COD,1,3) <> '236' AND SUBSTR(CUEN_COD,1,4) <> '2408'
                        INTO :ctabase, :proy, :centro;
                else
                    /* tome la base de la configuración y el c.costo del prefijo del recibo */
                    execute procedure lee_configuracion('CAJA', 'EGRESOS', 'CUENTA CONTABLE PARA LOS ANTICIPOS A ACREEDORES SI LA INTERFAZ ES POR DOCUMENTO') returning_values (ctabase);
                if ((ctabase is null) or (ctabase = '')) then
                    CTABASE = TCTACLIEN;
                CUENTA = NULL;
                EXECUTE PROCEDURE VALIDE_CUENTA_C (ctabase) RETURNING_VALUES (:OK);
                IF (OK = 0) THEN
                    SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                        WHERE CUEN_COD = :CTABASE INTO :CUENTA, :TIPOCUEN;
                ELSE
                    begin
                    EXECUTE PROCEDURE ERROR (62, :IDDOC, :CTABASE, 2);
                    CUENTA = CTABASE;
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    end
                if (RET = 'NO') then
                    SUMA = SUMA + RTIT;
                if (SUMA < 0) then
                    BEGIN
                    CREDITO = SUMA * -1;
                    DEBITO = 0;
                    END
                ELSE
                    BEGIN
                    CREDITO = 0;
                    DEBITO = SUMA;
                    END
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    /* DEBERIA RECORRER DOCUMENTO POR DOCUMENTO */
                    NUMEROIT = PREFIT || NUMIT;
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :debito, :credito, 0, 0, :NIT, :PROY, :CENTRO, NULL, :NUMEROIT, NULL, NULL, :TIPOIT, 0);
                    END
                if (TIPOCUEN = 'N') then
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :DEBITO, :CREDITO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                END /* SUMA EN CARTERA */
            END
        END
    /* recorra las cuentas adicionales */
    FOR SELECT INJC_CUENTA, INJC_BASE, INJC_PORC, INJC_VALOR, INJC_DB
        FROM INTERFAZ_CAJA_CTAS
        WHERE INCJ_ID = :IDINTER
        INTO :CTADIC, :BASEADIC, :PORCADIC, :VALORADIC, :DBADIC
        DO
        BEGIN
        if (:BASEADIC = 'TOTAL') then
            VALORADIC = VRTOTAL;
        if (:BASEADIC = 'DESCUENTO') then
            VALORADIC = VRDTO;
        if (:BASEADIC = 'RTFTE') then
            VALORADIC = VRRTFTE;
        if (:BASEADIC = 'RTIVA') then
            VALORADIC = VRRTIVA;
        if (:BASEADIC = 'RTICA') then
            VALORADIC = VRRTICA;
        MONTO = VALORADIC * PORCADIC;
        CUENTA = NULL;
        EXECUTE PROCEDURE VALIDE_CUENTA_C (CTADIC) RETURNING_VALUES (:OK);
        IF (OK = 0) THEN
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTADIC INTO :CUENTA, :TIPOCUEN;
        ELSE
            begin
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :CTADIC, 2);
            CUENTA = CTADIC;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 4);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            if (DBADIC = 'S') then
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTADIC, :CONC, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            ELSE
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTADIC, :CONC, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            END
        NROI = NROI + 1;
        END
    if (ERROR > 0) then
        VER = 'S';
    SUSPEND;
    END /* EXISTE LA INTERFAZ */
  ELSE
    BEGIN
    EXECUTE PROCEDURE ERROR (62, :IDDOC, :PREF, 1);
    ERROR = ERROR + 1;
    VER = 'S';
    SUSPEND;
    END
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE EGRESOS_SIN_CONTABILIDAD(
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    ID INTEGER,
    IDI INTEGER,
    IDC INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    ESTADO VARCHAR(20),
    ERROR INTEGER)
AS
DECLARE VARIABLE VER CHAR(2);
declare variable FECICNT VARCHAR(10);
declare variable FECFCNT VARCHAR(10);
declare variable idref INTEGER;
BEGIN /*$$IBE$$ 
EXECUTE PROCEDURE fecha_a_conta(FECINI) returning_values (FECICNT);
EXECUTE PROCEDURE fecha_a_conta(FECFIN) returning_values (FECFCNT);
FOR SELECT EGRE_ID, PREF_PRE, egre_numero FROM EGRESOS WHERE EGRE_ANULADO = 'N' AND PREF_PRE <> 'R004' AND
    EGRE_FECHA >= :FECINI AND EGRE_FECHA <= :FECFIN ORDER BY EGRE_ID INTO :ID, :PREF, :NUMERO
DO
  BEGIN
  idref = null;
  SELECT ENCO_IDREF FROM COMPROBANTE_ENCABEZADO WHERE ENCO_TIPOREF = 62 AND ENCO_FECHA >= :FECICNT AND ENCO_FECHA <= :FECFCNT and ENCO_IDREF = :ID into :idref;
  if (idref IS NULL) then
  begin
   ESTADO = 'PROCESANDO';
   SUSPEND;
   SELECT MAX(INCJ_ID) FROM INTERFAZ_CAJA WHERE PREF_PRE = :PREF AND TIDO_COD = 62 INTO :IDI;
   EXECUTE PROCEDURE CONTABIL_EGRESO (:ID, :IDI) RETURNING_VALUES (:ERROR, :VER, :IDC);
   IF (ERROR = 0) THEN
      BEGIN
      EXECUTE PROCEDURE CONTABILIZA_PENDIENTE (:IDC);
      ESTADO = 'OK';
      END
   ELSE
    ESTADO = 'ERROR';
   suspend;
  end
  END
 $$IBE$$*/ SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE EGRESOS_SIN_CONTABILIDAD(
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    ID INTEGER,
    IDI INTEGER,
    IDC INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    ESTADO VARCHAR(20),
    ERROR INTEGER)
AS
DECLARE VARIABLE VER CHAR(2);
declare variable FECICNT VARCHAR(10);
declare variable FECFCNT VARCHAR(10);
declare variable idref INTEGER;
BEGIN
EXECUTE PROCEDURE fecha_a_conta(FECINI) returning_values (FECICNT);
EXECUTE PROCEDURE fecha_a_conta(FECFIN) returning_values (FECFCNT);
FOR SELECT EGRE_ID, PREF_PRE, egre_numero FROM EGRESOS WHERE EGRE_ANULADO = 'N' AND PREF_PRE <> 'R004' AND
    EGRE_FECHA >= :FECINI AND EGRE_FECHA <= :FECFIN ORDER BY EGRE_ID INTO :ID, :PREF, :NUMERO
DO
  BEGIN
  idref = null;
  SELECT ENCO_IDREF FROM COMPROBANTE_ENCABEZADO WHERE ENCO_TIPOREF = 62 AND ENCO_FECHA >= :FECICNT AND ENCO_FECHA <= :FECFCNT and ENCO_IDREF = :ID into :idref;
  if (idref IS NULL) then
  begin
   ESTADO = 'PROCESANDO';
   SUSPEND;
   SELECT MAX(INCJ_ID) FROM INTERFAZ_CAJA WHERE PREF_PRE = :PREF AND TIDO_COD = 62 INTO :IDI;
   EXECUTE PROCEDURE CONTABIL_EGRESO (:ID, :IDI) RETURNING_VALUES (:ERROR, :VER, :IDC);
   IF (ERROR = 0) THEN
      BEGIN
      EXECUTE PROCEDURE CONTABILIZA_PENDIENTE (:IDC);
      ESTADO = 'OK';
      END
   ELSE
    ESTADO = 'ERROR';
   suspend;
  end
  END
END

^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER PROCEDURE CONTABIL_RECICAJA(
    IDDOC INTEGER,
    IDINTER INTEGER)
RETURNS (
    ERROR INTEGER,
    VER CHAR(1),
    IDC INTEGER)
AS
declare variable PREF VARCHAR(4);
declare variable NUM VARCHAR(6);
declare variable FECAUX DATE;
declare variable FECHA CHAR(8);
declare variable CONC CHAR(120);
declare variable VRDTO NUMERIC(18,2);
declare variable VRRTFTE NUMERIC(18,2);
declare variable VRRTIVA NUMERIC(18,2);
declare variable VRRTICA NUMERIC(18,2);
declare variable VRTOTAL NUMERIC(18,2);
declare variable TIPOCOMP VARCHAR(3);
declare variable PREFCONT VARCHAR(4);
declare variable BASE CHAR(1);
declare variable CTABASE VARCHAR(20);
declare variable CAJA CHAR(1);
declare variable CTACAJA VARCHAR(20);
declare variable RTFTE CHAR(1);
declare variable CTARTFTE VARCHAR(20);
declare variable RTIVA CHAR(1);
declare variable CTARTIVA VARCHAR(20);
declare variable RTICA CHAR(1);
declare variable CTARTICA VARCHAR(20);
declare variable DTO CHAR(1);
declare variable CTADTO VARCHAR(20);
declare variable EXISTE CHAR(1);
declare variable CUENTA VARCHAR(20);
declare variable MONTO NUMERIC(18,2);
declare variable ES_RETENCION CHAR(1);
declare variable TIPOCUEN CHAR(1);
declare variable NIT VARCHAR(20);
declare variable PROY VARCHAR(4);
declare variable CENTRO VARCHAR(4);
declare variable DEBITO NUMERIC(18,2);
declare variable CREDITO NUMERIC(18,2);
declare variable NROI INTEGER;
declare variable SUMA NUMERIC(18,2);
declare variable TCTACLIEN VARCHAR(20);
declare variable TCTARTFTE VARCHAR(20);
declare variable TCTARTIVA VARCHAR(20);
declare variable TCTARTICA VARCHAR(20);
declare variable TIPOIT INTEGER;
declare variable IDIT INTEGER;
declare variable PREFIT VARCHAR(4);
declare variable NUMIT VARCHAR(6);
declare variable NUMEROIT VARCHAR(10);
declare variable ABONOIT NUMERIC(18,2);
declare variable CTADIC VARCHAR(20);
declare variable BASEADIC VARCHAR(20);
declare variable PORCADIC NUMERIC(5,2);
declare variable VALORADIC NUMERIC(18,2);
declare variable DBADIC CHAR(1);
declare variable ANULADO CHAR(1);
declare variable VRBASE NUMERIC(18,2);
declare variable PORC numeric(9,2);
declare variable OK INTEGER;
declare variable CRUCES NUMERIC(18,2);
declare variable VRCAJA NUMERIC(18,2);
declare variable DIFCAMBIO NUMERIC(18,2);
declare variable CTADIF VARCHAR(20);
declare variable PROVID INTEGER;
declare variable RTFTEC NUMERIC(18,2);
declare variable RTIVAC NUMERIC(18,2);
declare variable RTICAC NUMERIC(18,2);
declare variable RTFTER CHAR(1);
declare variable CTARTFTER VARCHAR(20);
declare variable RTIVAR CHAR(1);
declare variable CTARTIVAR VARCHAR(20);
declare variable RTICAR CHAR(1);
declare variable CTARTICAR VARCHAR(20);
declare variable RET CHAR(2);
declare variable RTIT NUMERIC(18,2);
BEGIN
ERROR = 0;
/* BUSQUE LA INTERFACE */
EXISTE = 'N';
SELECT 'S',TICO_COD,PRCO_PRE,INCJ_BASE,INCJ_DTOPP,INCJ_RTFTE,INCJ_RTIVA,INCJ_RTICA,INCJ_CAJA,INCJ_CTABASE,INCJ_CTADTO,INCJ_CTARTFTE,INCJ_CTARTIVA,INCJ_CTARTICA,INCJ_CTACAJA,INCJ_CONFIRMAR
    FROM INTERFAZ_CAJA
    WHERE INCJ_ID = :IDINTER
    INTO :EXISTE,:TIPOCOMP,:PREFCONT,:BASE,:DTO,:RTFTE,:RTIVA,:RTICA,:CAJA,:CTABASE,:CTADTO,:CTARTFTE,:CTARTIVA,:CTARTICA,:CTACAJA,:VER;
if (EXISTE = 'S') then
  BEGIN
  /* BORRE LA CONTABILIZACION ANTERIOR */
  OK = 0;
  FOR SELECT CNTB_ID FROM CONTABILIZACION WHERE CNTB_TIPOREF = 61 AND CNTB_IDREF = :IDDOC INTO :OK DO
    BEGIN
    DELETE FROM CONTABILIZACION_DET WHERE CNTB_ID = :OK;
    DELETE FROM CONTABILIZACION WHERE CNTB_ID = :OK;
    END
  /* TRAIGA EL ENCABEZADO DEL RECIBO */
  SELECT PREF_PRE,RECA_NUMERO,RECA_FECHA,R.TERC_NIT,RECA_CONC,RECA_DTOF,RECA_MONTO,RECA_RTFTEMONTO,RECA_RTIVAMONTO,RECA_RTICAMONTO,TERC_CTARTFTE,TERC_CTARTIVA,TERC_CTARTICA,TERC_CTACLIENTE,RECA_ANULADO,RECA_PROVID
    FROM RECIBOS_CAJA R,TERCEROS T
    WHERE RECA_ID = :IDDOC AND R.TERC_NIT = T.TERC_NIT
    INTO :PREF,:NUM,:FECAUX,:NIT,:CONC,:VRDTO,:VRTOTAL,:VRRTFTE,:VRRTIVA,:VRRTICA,:TCTARTFTE,TCTARTIVA,TCTARTICA,TCTACLIEN,:ANULADO,:PROVID;
  if (ANULADO = 'N') then
    BEGIN
    SELECT PREF_CENTRO,PREF_PROY FROM PREFIJOS
        WHERE PREF_PRE = :PREF AND TIDO_COD = 61 INTO :CENTRO,:PROY;
    EXECUTE PROCEDURE FECHA_A_CONTA(:FECAUX) returning_values (:FECHA);
    IDC = GEN_ID(ID_CONTABILIZA,1);
    INSERT INTO CONTABILIZACION (CNTB_ID,CNTB_TIPOCOMP,CNTB_PREFCNT,CNTB_NUMERO,CNTB_FECHA,CNTB_CONCEPTO,CNTB_REF,CNTB_TIPOREF,CNTB_IDREF,CNTB_PREFREF,CNTB_NUMREF,CNTB_PROCESADO)
        VALUES (:IDC,:TIPOCOMP,:PREFCONT,:NUM,:FECHA,:CONC,'',61,:IDDOC,:PREF,:NUM,'N');
    NROI = 0;
    SUMA = 0;
    /* SUME LOS CRUCES PARA LLEVARLOS A LA CUENTA X PAGAR Y RESTAR DE LA CAJA */
    SELECT SUM(RCCR_ABONO) FROM RECIBOS_CAJA_CRUCEC WHERE RECA_ID = :iddoc INTO :CRUCES;
    if (CRUCES IS NULL) then
        CRUCES = 0;
    VRCAJA = VRTOTAL - CRUCES;
    IF ((CAJA = 'K')) THEN
        BEGIN
        if (VRCAJA <> 0) then
            BEGIN
            CUENTA = NULL;
            EXECUTE PROCEDURE VALIDE_CUENTA_C (CTACAJA) RETURNING_VALUES (:OK);
            IF (OK = 0) THEN
                SELECT CUEN_COD,CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :CTACAJA INTO :CUENTA,:TIPOCUEN;
            ELSE
                begin
                EXECUTE PROCEDURE ERROR (61,:IDDOC,:CTACAJA,2);
                CUENTA = CTACAJA;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERROR (61,:IDDOC,:CUENTA,3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                EXECUTE PROCEDURE ERROR (61,:IDDOC,:CUENTA,4);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                IF (VRCAJA > 0) THEN
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID,CNDE_ITEM,CNDE_CUENTA,CNDE_CONC,CNDE_REF,CNDE_DEBITOS,CNDE_CREDITOS,CNDE_BASE,CNDE_PORC,CNDE_TERC,CNDE_PROY,CNDE_CENTRO,CNDE_DOCNUMERO,CNDE_DOCAPLICAR,CNDE_DOCVENCE,CNDE_ARTICULO,CNDE_DOCTIPOA,CNDE_DOCTIPON)
                        VALUES (:IDC,:NROI,:CUENTA,:CONC,'',:VRCAJA,0,0,0,:NIT,:PROY,:CENTRO,NULL,NULL,NULL,NULL,0,0);
                    SUMA = SUMA + VRCAJA;
                    END
                ELSE   
                    BEGIN                     
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID,CNDE_ITEM,CNDE_CUENTA,CNDE_CONC,CNDE_REF,CNDE_DEBITOS,CNDE_CREDITOS,CNDE_BASE,CNDE_PORC,CNDE_TERC,CNDE_PROY,CNDE_CENTRO,CNDE_DOCNUMERO,CNDE_DOCAPLICAR,CNDE_DOCVENCE,CNDE_ARTICULO,CNDE_DOCTIPOA,CNDE_DOCTIPON)
                       VALUES (:IDC,:NROI,:CUENTA,:CONC,'',0,ABS(:VRCAJA),0,0,:NIT,:PROY,:CENTRO,NULL,NULL,NULL,NULL,0,0);
                    SUMA = SUMA + VRCAJA;
                    END
                NROI = NROI + 1;
                END
            END
        END
    IF ((CAJA = 'F')) THEN
        BEGIN
        FOR SELECT MAX(FOPA_CTACONTA),SUM(RCPA_MONTO)
            FROM formas_pago F,recibos_caja_pago R
            WHERE R.RECA_ID = :IDDOC AND R.FOPA_ID = F.FOPA_ID
            GROUP BY FOPA_CTACONTA
            INTO :CTACAJA,:MONTO
        DO
            BEGIN
            if (MONTO <> 0) then
                BEGIN
                CUENTA = NULL;
                EXECUTE PROCEDURE VALIDE_CUENTA_C (CTACAJA) RETURNING_VALUES (:OK);
                IF (OK = 0) THEN
                    SELECT CUEN_COD,CUEN_TIPO FROM CUENTAS
                        WHERE CUEN_COD = :CTACAJA INTO :CUENTA,:TIPOCUEN;
                ELSE
                    begin
                    EXECUTE PROCEDURE ERROR (61,:IDDOC,:CTACAJA,2);
                    CUENTA = CTACAJA;
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (61,:IDDOC,:CUENTA,3);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (61,:IDDOC,:CUENTA,4);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    IF (MONTO > 0) THEN
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID,CNDE_ITEM,CNDE_CUENTA,CNDE_CONC,CNDE_REF,CNDE_DEBITOS,CNDE_CREDITOS,CNDE_BASE,CNDE_PORC,CNDE_TERC,CNDE_PROY,CNDE_CENTRO,CNDE_DOCNUMERO,CNDE_DOCAPLICAR,CNDE_DOCVENCE,CNDE_ARTICULO,CNDE_DOCTIPOA,CNDE_DOCTIPON)
                            VALUES (:IDC,:NROI,:CUENTA,:CONC,'',:MONTO,0,0,0,:NIT,:PROY,:CENTRO,NULL,NULL,NULL,NULL,0,0);
                        SUMA = SUMA + MONTO;
                        END
                    ELSE
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID,CNDE_ITEM,CNDE_CUENTA,CNDE_CONC,CNDE_REF,CNDE_DEBITOS,CNDE_CREDITOS,CNDE_BASE,CNDE_PORC,CNDE_TERC,CNDE_PROY,CNDE_CENTRO,CNDE_DOCNUMERO,CNDE_DOCAPLICAR,CNDE_DOCVENCE,CNDE_ARTICULO,CNDE_DOCTIPOA,CNDE_DOCTIPON)
                            VALUES (:IDC,:NROI,:CUENTA,:CONC,'',0,abs(:MONTO),0,0,:NIT,:PROY,:CENTRO,NULL,NULL,NULL,NULL,0,0);
                        SUMA = SUMA + MONTO;
                        END
                    NROI = NROI + 1;
                    END
                END /* MONTO <> 0 */
            END /* DO FORMA_PAGO */
        END /* CAJA = F */
    if (DTO = 'K') then /* DTO EN CTA CONSTANTE */
        BEGIN
        if (VRDTO <> 0) then
            BEGIN
            CUENTA = NULL;
            EXECUTE PROCEDURE VALIDE_CUENTA_C (CTADTO) RETURNING_VALUES (:OK);
            IF (OK = 0) THEN
                SELECT CUEN_COD,CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :CTADTO INTO :CUENTA,:TIPOCUEN;
            ELSE
                begin
                EXECUTE PROCEDURE ERROR (61,:IDDOC,:CTADTO,2);
                CUENTA = CTADTO;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERROR (61,:IDDOC,:CUENTA,3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                EXECUTE PROCEDURE ERROR (61,:IDDOC,:CUENTA,4);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID,CNDE_ITEM,CNDE_CUENTA,CNDE_CONC,CNDE_REF,CNDE_DEBITOS,CNDE_CREDITOS,CNDE_BASE,CNDE_PORC,CNDE_TERC,CNDE_PROY,CNDE_CENTRO,CNDE_DOCNUMERO,CNDE_DOCAPLICAR,CNDE_DOCVENCE,CNDE_ARTICULO,CNDE_DOCTIPOA,CNDE_DOCTIPON)
                    VALUES (:IDC,:NROI,:CUENTA,:CONC,'',:VRDTO,0,0,0,:NIT,:PROY,:CENTRO,NULL,NULL,NULL,NULL,0,0);
                NROI = NROI + 1;
                SUMA = SUMA + VRDTO;
                END
            END /* VRDTO <> 0 */
        END /* DTO EN CTA CONSTANTE */

    /* LA DIFERENCIA EN CAMBIO */
    SELECT SUM(RCDE_DIFCAMBIO) FROM recibos_caja_detalle WHERE RECA_ID = :iddoc INTO :DIFCAMBIO;
    IF ((DIFCAMBIO IS NOT NULL) AND (DIFCAMBIO <> 0)) THEN
        BEGIN
        if (DIFCAMBIO > 0) then
            execute procedure lee_configuracion('GENERAL','GENERAL','CUENTA DE INGRESO POR DIFERENCIA EN CAMBIO PARA OPERACIONES EN OTRA MONEDA') returning_values (:ctadif);
        else
            execute procedure lee_configuracion('GENERAL','GENERAL','CUENTA DE GASTO POR DIFERENCIA EN CAMBIO PARA OPERACIONES EN OTRA MONEDA') returning_values (:ctadif);
        CUENTA = NULL;
        EXECUTE PROCEDURE VALIDE_CUENTA_C (ctadif) RETURNING_VALUES (:OK);
        IF (OK = 0) THEN
            SELECT CUEN_COD,CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :ctadif INTO :CUENTA,:TIPOCUEN;
        ELSE
            begin
            EXECUTE PROCEDURE ERROR (61,:IDDOC,:ctadif,2);
            CUENTA = ctadif;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERROR (61,:IDDOC,:CUENTA,3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERROR (61,:IDDOC,:CUENTA,4);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            if (DIFCAMBIO > 0) then
                INSERT INTO CONTABILIZACION_DET (CNTB_ID,CNDE_ITEM,CNDE_CUENTA,CNDE_CONC,CNDE_REF,CNDE_DEBITOS,CNDE_CREDITOS,CNDE_BASE,CNDE_PORC,CNDE_TERC,CNDE_PROY,CNDE_CENTRO,CNDE_DOCNUMERO,CNDE_DOCAPLICAR,CNDE_DOCVENCE,CNDE_ARTICULO,CNDE_DOCTIPOA,CNDE_DOCTIPON)
                    VALUES (:IDC,:NROI,:CUENTA,:CONC,'',0,:difcambio,0,0,:NIT,:PROY,:CENTRO,NULL,NULL,NULL,NULL,0,0);
            else
                INSERT INTO CONTABILIZACION_DET (CNTB_ID,CNDE_ITEM,CNDE_CUENTA,CNDE_CONC,CNDE_REF,CNDE_DEBITOS,CNDE_CREDITOS,CNDE_BASE,CNDE_PORC,CNDE_TERC,CNDE_PROY,CNDE_CENTRO,CNDE_DOCNUMERO,CNDE_DOCAPLICAR,CNDE_DOCVENCE,CNDE_ARTICULO,CNDE_DOCTIPOA,CNDE_DOCTIPON)
                    VALUES (:IDC,:NROI,:CUENTA,:CONC,'',ABS(:difcambio),0,0,0,:NIT,:PROY,:CENTRO,NULL,NULL,NULL,NULL,0,0);
            NROI = NROI + 1;
            SUMA = SUMA - difcambio;
            END
        END
    /* RETENCION FUENTE */
    if ((RTFTE = 'T') or (RTFTE = 'K')) then
      if (VRRTFTE <> 0) then
        BEGIN
        if (RTFTE = 'T') then
            CTARTFTE = TCTARTFTE;
        CUENTA = NULL;
        EXECUTE PROCEDURE VALIDE_CUENTA_C (CTARTFTE) RETURNING_VALUES (:OK);
        IF (OK = 0) THEN
            SELECT CUEN_COD,CUEN_RETENCION,CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTARTFTE INTO :CUENTA,:ES_RETENCION,:TIPOCUEN;
        ELSE
            begin
            EXECUTE PROCEDURE ERROR (61,:IDDOC,:CTARTFTE,2);
            CUENTA = CTARTFTE;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERROR (61,:IDDOC,:CUENTA,3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERROR (61,:IDDOC,:CUENTA,4);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            if (ES_RETENCION = 'S') then
                BEGIN
                VRBASE = VRTOTAL + VRDTO + vrrtfte + vrrtiva + vrrtica;
                SELECT CLIE_rtefte from clientes where terc_nit = :NIT INTO :PORC;
                END
            ELSE
                BEGIN
                VRBASE = 0;
                PORC = 0;
                END
            INSERT INTO CONTABILIZACION_DET (CNTB_ID,CNDE_ITEM,CNDE_CUENTA,CNDE_CONC,CNDE_REF,CNDE_DEBITOS,CNDE_CREDITOS,CNDE_BASE,CNDE_PORC,CNDE_TERC,CNDE_PROY,CNDE_CENTRO,CNDE_DOCNUMERO,CNDE_DOCAPLICAR,CNDE_DOCVENCE,CNDE_ARTICULO,CNDE_DOCTIPOA,CNDE_DOCTIPON)
                VALUES (:IDC,:NROI,:CUENTA,:CONC,'',:VRRTFTE,0,:VRBASE,:PORC,:NIT,:PROY,:CENTRO,NULL,NULL,NULL,NULL,0,0);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTFTE;
            END
        END /* RTFTE */
    /* RETENCION IVA */
    if ((RTIVA = 'T') or (RTIVA = 'K')) then
      if (VRRTIVA <> 0) then
        BEGIN
        if (RTIVA = 'T') then
            CTARTIVA = TCTARTIVA;
        CUENTA = NULL;
        EXECUTE PROCEDURE VALIDE_CUENTA_C (CTARTIVA) RETURNING_VALUES (:OK);
        IF (OK = 0) THEN
            SELECT CUEN_COD,CUEN_RETENCION,CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTARTIVA INTO :CUENTA,:ES_RETENCION,:TIPOCUEN;
        ELSE
            begin
            EXECUTE PROCEDURE ERROR (61,:IDDOC,:CTARTIVA,2);
            CUENTA = CTARTIVA;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERROR (61,:IDDOC,:CUENTA,3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERROR (61,:IDDOC,:CUENTA,4);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            if (ES_RETENCION = 'S') then
                BEGIN
                VRBASE = VRTOTAL + VRDTO + vrrtfte + vrrtiva + vrrtica;
                SELECT CLIE_RTEIVA from clientes where terc_nit = :NIT INTO :PORC;
                END
            ELSE
                BEGIN
                VRBASE = 0;
                PORC = 0;
                END
            INSERT INTO CONTABILIZACION_DET (CNTB_ID,CNDE_ITEM,CNDE_CUENTA,CNDE_CONC,CNDE_REF,CNDE_DEBITOS,CNDE_CREDITOS,CNDE_BASE,CNDE_PORC,CNDE_TERC,CNDE_PROY,CNDE_CENTRO,CNDE_DOCNUMERO,CNDE_DOCAPLICAR,CNDE_DOCVENCE,CNDE_ARTICULO,CNDE_DOCTIPOA,CNDE_DOCTIPON)
                VALUES (:IDC,:NROI,:CUENTA,:CONC,'',:VRRTIVA,0,:VRBASE,:PORC,:NIT,:PROY,:CENTRO,NULL,NULL,NULL,NULL,0,0);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTIVA;
            END
        END /* RTIVA */
    /* RETENCION DE ICA */
    if ((RTICA = 'T') or (RTICA = 'K')) then
      if (VRRTICA <> 0) then
        BEGIN
        if (RTICA = 'T') then
            CTARTICA = TCTARTICA;
        CUENTA = NULL;
        EXECUTE PROCEDURE VALIDE_CUENTA_C (CTARTICA) RETURNING_VALUES (:OK);
        IF (OK = 0) THEN
            SELECT CUEN_COD,CUEN_RETENCION,CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTARTICA INTO :CUENTA,:ES_RETENCION,:TIPOCUEN;
        ELSE
            begin
            EXECUTE PROCEDURE ERROR (61,:IDDOC,:CTARTICA,2);
            CUENTA = CTARTICA;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERROR (61,:IDDOC,:CUENTA,3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERROR (61,:IDDOC,:CUENTA,4);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            if (ES_RETENCION = 'S') then
                BEGIN
                VRBASE = VRTOTAL + VRDTO + vrrtfte + vrrtiva + vrrtica;
                SELECT CLIE_RTEICA from clientes where terc_nit = :NIT INTO :PORC;
                END
            ELSE
                BEGIN
                VRBASE = 0;
                PORC = 0;
                END
            INSERT INTO CONTABILIZACION_DET (CNTB_ID,CNDE_ITEM,CNDE_CUENTA,CNDE_CONC,CNDE_REF,CNDE_DEBITOS,CNDE_CREDITOS,CNDE_BASE,CNDE_PORC,CNDE_TERC,CNDE_PROY,CNDE_CENTRO,CNDE_DOCNUMERO,CNDE_DOCAPLICAR,CNDE_DOCVENCE,CNDE_ARTICULO,CNDE_DOCTIPOA,CNDE_DOCTIPON)
                VALUES (:IDC,:NROI,:CUENTA,:CONC,'',:VRRTICA,0,0,0,:NIT,:PROY,:CENTRO,NULL,NULL,NULL,NULL,0,0);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTICA;
            END
        END /* RTICA */
    /* CRUCES CON CXP */
    if (CRUCES <> 0) then
        BEGIN
        SELECT PROV_CTAPAGAR FROM PROVEEDORES WHERE TERC_NIT = :nit INTO :ctabase;
        if (CTABASE IS NULL) then
            ctabase = tctaclien;
        CUENTA = NULL;
        EXECUTE PROCEDURE VALIDE_CUENTA_C (CTABASE) RETURNING_VALUES (:OK);
        IF (OK = 0) THEN
            SELECT CUEN_COD,CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTABASE INTO :CUENTA,:TIPOCUEN;
        ELSE
            begin
            EXECUTE PROCEDURE ERROR (61,:IDDOC,:CTABASE,2);
            CUENTA = CTABASE;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERROR (61,:IDDOC,:CUENTA,3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            /* DEBERIA RECORRER DOCUMENTO POR DOCUMENTO */
            FOR SELECT RCCR_TIPODOC,RCCR_PREFIJO,RCCR_NUMERO,RCCR_ABONO+RCCR_RTFTE+RCCR_RTIVA+RCCR_RTICA+RCCR_DTOF
                FROM recibos_caja_crucec WHERE RECA_ID = :IDDOC
                INTO :TIPOIT,PREFIT,NUMIT,ABONOIT
                DO
                BEGIN
                NUMEROIT = PREFIT || NUMIT;
                INSERT INTO CONTABILIZACION_DET (CNTB_ID,CNDE_ITEM,CNDE_CUENTA,CNDE_CONC,CNDE_REF,CNDE_DEBITOS,CNDE_CREDITOS,CNDE_BASE,CNDE_PORC,CNDE_TERC,CNDE_PROY,CNDE_CENTRO,CNDE_DOCNUMERO,CNDE_DOCAPLICAR,CNDE_DOCVENCE,CNDE_ARTICULO,CNDE_DOCTIPOA,CNDE_DOCTIPON)
                    VALUES (:IDC,:NROI,:CUENTA,:CONC,'',:ABONOIT,0,0,0,:NIT,:PROY,:CENTRO,NULL,:NUMEROIT,NULL,NULL,:TIPOIT,0);
                SUMA = SUMA + ABONOIT;
                NROI = NROI + 1;
                END
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID,CNDE_ITEM,CNDE_CUENTA,CNDE_CONC,CNDE_REF,CNDE_DEBITOS,CNDE_CREDITOS,CNDE_BASE,CNDE_PORC,CNDE_TERC,CNDE_PROY,CNDE_CENTRO,CNDE_DOCNUMERO,CNDE_DOCAPLICAR,CNDE_DOCVENCE,CNDE_ARTICULO,CNDE_DOCTIPOA,CNDE_DOCTIPON)
                VALUES (:IDC,:NROI,:CUENTA,:CONC,'',:CRUCES,0,0,0,:NIT,:PROY,:CENTRO,NULL,NULL,NULL,NULL,0,0);
            SUMA = SUMA + CRUCES;
            NROI = NROI + 1;
            END

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

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE RECIBOS_SIN_CONTABILIDAD(
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    ID INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    ESTADO VARCHAR(20),
    IDI INTEGER,
    IDC INTEGER,
    ERROR INTEGER)
AS
DECLARE VARIABLE VER CHAR(2);
declare variable FECICNT VARCHAR(10);
declare variable FECFCNT VARCHAR(10);
declare variable idref INTEGER;
BEGIN /*$$IBE$$ 
EXECUTE PROCEDURE fecha_a_conta(FECINI) returning_values (FECICNT);
EXECUTE PROCEDURE fecha_a_conta(FECFIN) returning_values (FECFCNT);
FOR SELECT RECA_ID, PREF_PRE, RECA_NUMERO FROM RECIBOS_CAJA WHERE RECA_ANULADO = 'N' AND
    RECA_FECHA >= :FECINI AND RECA_FECHA <= :FECFIN and PREF_PRE NOT IN (SELECT AUTO_PREFRDC FROM AUTORIZACIONES) ORDER BY RECA_ID
    INTO :ID, :PREF, :NUMERO
DO
  BEGIN
  idref = null;
  SELECT ENCO_IDREF FROM COMPROBANTE_ENCABEZADO WHERE ENCO_TIPOREF = 61 AND ENCO_FECHA >= :FECICNT AND ENCO_FECHA <= :FECFCNT and ENCO_IDREF = :id into :idref;
  if (idref IS NULL) then
  begin
   ESTADO = 'PROCESANDO';
   SUSPEND;
   SELECT MAX(INCJ_ID) FROM INTERFAZ_CAJA WHERE PREF_PRE = :PREF AND TIDO_COD = 61 INTO :IDI;
   EXECUTE PROCEDURE CONTABIL_RECICAJA (:ID, :IDI) RETURNING_VALUES (:ERROR, :VER, :IDC);
   if (ERROR = 0) then
    BEGIN
    EXECUTE PROCEDURE CONTABILIZA_PENDIENTE (:IDC);
    ESTADO = 'OK';
    END
   ELSE
    ESTADO = 'ERROR';
   suspend;
  end
  END
 $$IBE$$*/ SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE RECIBOS_SIN_CONTABILIDAD(
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    ID INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    ESTADO VARCHAR(20),
    IDI INTEGER,
    IDC INTEGER,
    ERROR INTEGER)
AS
DECLARE VARIABLE VER CHAR(2);
declare variable FECICNT VARCHAR(10);
declare variable FECFCNT VARCHAR(10);
declare variable idref INTEGER;
BEGIN
EXECUTE PROCEDURE fecha_a_conta(FECINI) returning_values (FECICNT);
EXECUTE PROCEDURE fecha_a_conta(FECFIN) returning_values (FECFCNT);
FOR SELECT RECA_ID, PREF_PRE, RECA_NUMERO FROM RECIBOS_CAJA WHERE RECA_ANULADO = 'N' AND
    RECA_FECHA >= :FECINI AND RECA_FECHA <= :FECFIN and PREF_PRE NOT IN (SELECT AUTO_PREFRDC FROM AUTORIZACIONES) ORDER BY RECA_ID
    INTO :ID, :PREF, :NUMERO
DO
  BEGIN
  idref = null;
  SELECT ENCO_IDREF FROM COMPROBANTE_ENCABEZADO WHERE ENCO_TIPOREF = 61 AND ENCO_FECHA >= :FECICNT AND ENCO_FECHA <= :FECFCNT and ENCO_IDREF = :id into :idref;
  if (idref IS NULL) then
  begin
   ESTADO = 'PROCESANDO';
   SUSPEND;
   SELECT MAX(INCJ_ID) FROM INTERFAZ_CAJA WHERE PREF_PRE = :PREF AND TIDO_COD = 61 INTO :IDI;
   EXECUTE PROCEDURE CONTABIL_RECICAJA (:ID, :IDI) RETURNING_VALUES (:ERROR, :VER, :IDC);
   if (ERROR = 0) then
    BEGIN
    EXECUTE PROCEDURE CONTABILIZA_PENDIENTE (:IDC);
    ESTADO = 'OK';
    END
   ELSE
    ESTADO = 'ERROR';
   suspend;
  end
  END
END

^

SET TERM ; ^


/* 20090416 */
grant select, delete, insert, update on mediosmag_cuentas to PUBLIC;
GRANT EXECUTE ON PROCEDURE total_pagos_tercero_ano TO PUBLIC;
grant EXECUTE ON PROCEDURE VENTAS_ARTICULO_ANO TO PUBLIC;

/* SI NO HAY ALTERNATIVAS EL FACTOR PUEDE DAR CERO */
SET TERM ^ ;

CREATE OR ALTER PROCEDURE IMPR_FACTURA(
    ID INTEGER)
RETURNS (
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    VENCE DATE,
    DIASVENCE INTEGER,
    CONTCRED CHAR(17),
    NIT VARCHAR(20),
    NOMTERCERO VARCHAR(60),
    NOMCLIENTE VARCHAR(60),
    VENDEDOR INTEGER,
    NOMVENDEDOR VARCHAR(60),
    PUNTOVTA INTEGER,
    NOMPUNTOVTA VARCHAR(30),
    CODBODEGA VARCHAR(2),
    NOMBODEGA VARCHAR(30),
    AUTORIZACION VARCHAR(20),
    DESPACHO VARCHAR(255),
    TRANSPORTADOR VARCHAR(60),
    COTIZACION VARCHAR(30),
    PEDIDO VARCHAR(30),
    REMISION VARCHAR(30),
    PACIENTE VARCHAR(20),
    NOMPACIENTE VARCHAR(60),
    COMIPORC NUMERIC(9,2),
    COMIMONTO NUMERIC(18,2),
    SUBTOTAL NUMERIC(18,2),
    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),
    EXTRA NUMERIC(18,2),
    DTOFPORC NUMERIC(9,2),
    DTOFMONTO NUMERIC(18,2),
    FECHADTO DATE,
    TOTALFAC NUMERIC(18,2),
    TOTALPAGAR NUMERIC(18,2),
    OBS BLOB SUB_TYPE 1 SEGMENT SIZE 80,
    ITEM INTEGER,
    ARTICULO VARCHAR(15),
    CODBAR VARCHAR(15),
    ARTIDES VARCHAR(60),
    DESCORTA VARCHAR(30),
    CANT NUMERIC(18,4),
    LOTE VARCHAR(15),
    VLOTE DATE,
    UNIDAD VARCHAR(8),
    CAJAS NUMERIC(18,4),
    FACTOR NUMERIC(18,4),
    LISTAPR INTEGER,
    REFITEM VARCHAR(60),
    BODITEM VARCHAR(2),
    STAND VARCHAR(15),
    PRUNIT NUMERIC(18,2),
    DTOITPORC NUMERIC(9,2),
    DTOITMONTO NUMERIC(18,2),
    PRNETO NUMERIC(18,2),
    PRNETOSINIVA NUMERIC(18,2),
    DTOIT1 NUMERIC(9,2),
    DTOIT2 NUMERIC(9,2),
    DTOIT3 NUMERIC(9,2),
    IVAPORC NUMERIC(9,2),
    IVAITMONTO NUMERIC(18,2),
    CONSUMO NUMERIC(18,2),
    SUBTOTIT NUMERIC(18,2),
    TOTAL NUMERIC(18,2),
    CODIGOCL VARCHAR(20),
    ZONACOD VARCHAR(2),
    ZONANOM VARCHAR(60),
    DV CHAR(1),
    DIRECCION VARCHAR(60),
    CIUDAD VARCHAR(40),
    TELEFONO VARCHAR(40),
    CONTACTO VARCHAR(60),
    FAX VARCHAR(25),
    CEL VARCHAR(25),
    GRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    SUBGRUPO VARCHAR(3),
    NOMSUBG VARCHAR(30),
    MARCA VARCHAR(3),
    NOMMARCA VARCHAR(30),
    PESO NUMERIC(18,4),
    ANCHO NUMERIC(18,4),
    ALTO NUMERIC(18,4),
    LARGO NUMERIC(18,4),
    SUMA1 NUMERIC(18,2),
    SUMA2 NUMERIC(18,2),
    SUMA3 NUMERIC(18,2),
    IVA1 NUMERIC(18,2),
    IVA2 NUMERIC(18,2),
    IVA3 NUMERIC(18,2),
    SUMAEX NUMERIC(18,2),
    SUMAGR NUMERIC(18,2),
    TOTCONSUMO NUMERIC(18,2),
    DTOIT1M NUMERIC(18,2),
    DTOIT2M NUMERIC(18,2),
    DTOIT3M NUMERIC(18,2),
    TOTCAJAS NUMERIC(18,2),
    VEHICULO VARCHAR(8),
    RECIBIDO NUMERIC(18,2),
    CAMBIO NUMERIC(18,2),
    HORA TIME,
    FORMAPAGO1 VARCHAR(30),
    MONTOPAGO1 NUMERIC(18,2),
    FORMAPAGO2 VARCHAR(30),
    MONTOPAGO2 NUMERIC(18,2),
    FORMAPAGO3 VARCHAR(30),
    MONTOPAGO3 NUMERIC(18,2),
    PUNTOS INTEGER,
    PUNTOSACUM INTEGER,
    PUNTOSVENC INTEGER,
    FECPTOS DATE,
    OBSITEM BLOB SUB_TYPE 1 SEGMENT SIZE 80,
    SUCUR VARCHAR(10),
    ALTERNATIVAS NUMERIC(18,4),
    PRINCIPALES NUMERIC(18,4))
AS
DECLARE VARIABLE IMPTOS CHAR(1);
DECLARE VARIABLE TARIFA INTEGER;
declare variable DEVUELTO NUMERIC(18,2);
declare variable ORDENCOD CHAR(2);
declare variable IMPRDEV CHAR(2);
declare variable IMPR CHAR(1);
declare variable ITEMFP INTEGER;
declare variable FORMAP VARCHAR(30);
declare variable MONTOP NUMERIC(18,2);
declare variable ICOINC CHAR(2);
declare variable DTOITM1 NUMERIC(18,2);
declare variable DTOITM2 NUMERIC(18,2);
declare variable DTOITM3 NUMERIC(18,2);
declare variable DTOITE3 CHAR(2);
declare variable SUMDTOIT NUMERIC(18,2);
declare variable AUTORET VARCHAR(10);
declare variable FAUTORET DATE;
declare variable FACTCANT NUMERIC(18,4);
BEGIN
execute procedure lee_configuracion('FACTURACION', 'ARTICULOS', 'IMPOCONSUMO INCLUIDO EN EL PRECIO BASE DE VENTA ANTES DE IVA') returning_values (icoinc);
execute procedure lee_configuracion('FACTURACION', 'FACTURAS', 'COLUMNAS DE DESCUENTO POR ITEM ADICIONALES') returning_values (DTOITE3);
SELECT F.PREF_PRE, FACT_NUMERO, FACT_FECHA, FACT_VENCE, F.BODE_COD, BODE_NOM, F.TERC_NIT, FACT_NOMCLIENTE, F.VEND_COD, VEND_NOMBRE, F.PTVT_ID, PTVT_NOM,
    AUTO_NUMERO, FACT_DESPACHO, FACT_TRANSP, FACT_COTIZACI, FACT_PEDIDO, FACT_REMISION, FACT_COMIPORC, FACT_COMIMONTO, FACT_IVAINC, 
    FACT_DTOPOR, FACT_DTOMONTO, FACT_ADICIONAL, FACT_IVAMONTO, FACT_RTFTEPOR, FACT_RTFTEMONTO, FACT_RTIVAPOR, FACT_RTIVAMONTO, FACT_RTICAPOR, FACT_RTICAMONTO, FACT_EXTRA, FACT_DTOFPOR, FACT_DTOFMONTO, FACT_DTOFFECHA, FACT_TOTAL,
    TERC_DIR, TERC_CIU, TERC_TEL, TERC_CONTACTO, TERC_FAX, TERC_DV, TERC_CEL, FACT_DTOIT1, FACT_DTOIT2, FACT_DTOIT3,
    FACT_OBS, VEHI_COD, /*FACT_NROCOPIA,*/ FACT_RECIBIDO, FACT_SUCURSAL, FACT_DETCLI, FACT_DETCLINOM, TERC_NOM
    FROM FACTURAS F, BODEGA B, VENDEDORES V, PUNTO_VENTA P, TERCEROS T
    WHERE F.BODE_COD = B.BODE_COD AND F.VEND_COD = V.VEND_COD AND F.PTVT_ID = P.PTVT_ID AND F.TERC_NIT = T.TERC_NIT AND F.FACT_ID = :ID
    into :PREF, :NUMERO, :FECHA, :VENCE, :CODBODEGA, :NOMBODEGA, :NIT, :NOMTERCERO, :VENDEDOR, :NOMVENDEDOR, :PUNTOVTA, :NOMPUNTOVTA,
    :AUTORIZACION, :DESPACHO, :TRANSPORTADOR, :COTIZACION, :PEDIDO, :REMISION, :COMIPORC, :COMIMONTO, :IMPTOS,
    :DTOPORC, :DTOMONTO, :ADICIONAL, :IVAMONTO, :RTEFTEPORC, :RTEFTEMONTO, :RTEIVAPORC, :RTEIVAMONTO, :RTEICAPORC, :RTEICAMONTO, :EXTRA, :DTOFPORC, :DTOFMONTO, :FECHADTO, :TOTALFAC,
    :DIRECCION, :CIUDAD, :TELEFONO, :CONTACTO, :FAX, :DV, :CEL, :dtoit1m, :dtoit2m, :dtoit3m,
    :OBS, :VEHICULO,/* :NROCOPIA,*/ :RECIBIDO, :SUCUR, :paciente, :nompaciente, :nomcliente;

/* ACUMULE LOS PUNTOS, SE HACE ACA POR SER POSTERIOR AL DETALLE */
EXECUTE PROCEDURE acumula_puntos_cliente (31, :id, :nit, :fecha) returning_values (:PUNTOS);
EXECUTE PROCEDURE consulta_puntos_cliente (:id, :nit, :fecha) returning_values (:puntos, :puntosacum, :puntosvenc, :fecptos);
if (DTOIT1M IS NULL) then
    DTOIT1M = 0;
if (DTOIT2M IS NULL) then
    DTOIT2M = 0;
if (DTOIT3M IS NULL) then
    DTOIT3M = 0;
SELECT CLIE_COD, C.ZONA_COD, ZONA_NOM
    FROM CLIENTES C, ZONAS Z
    WHERE TERC_NIT = :NIT AND C.ZONA_COD = Z.ZONA_COD
    INTO :CODIGOCL, :ZONACOD, :ZONANOM;
SELECT CLSU_DIR, CLSU_CIUDAD, CLSU_TEL FROM CLIENTE_SUCURSALES WHERE TERC_NIT = :NIT AND CLCU_COD = :SUCUR
    INTO :DIRECCION, :CIUDAD, :TELEFONO;
DIASVENCE = VENCE - FECHA;
if (DIASVENCE > 0) then
    CONTCRED = 'CREDITO ' || CAST(DIASVENCE AS VARCHAR(3)) || ' DIAS';
ELSE
    CONTCRED = 'CONTADO';
SUBTOTAL = TOTALFAC - EXTRA - IVAMONTO - ADICIONAL + DTOMONTO;
if (DTOITE3 = 'SI') then
    BEGIN
    SELECT SUM(FADE_DTOMONTO) FROM FACTURAS_DETALLE WHERE FACT_ID = :id INTO :sumdtoit;
    SUBTOTAL = SUBTOTAL + sumdtoit + dtoit1m + dtoit2m + dtoit3m;
    END
EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'FECHA AUTORETENEDOR NO DESCONTAR RETENCIONES DEL SALDO PERO SI CONTABILIZARLAS') returning_values (AUTORET);
if (AUTORET <> '') then
    FAUTORET = CAST(AUTORET AS DATE);
else
    FAUTORET = '9999/12/31';
if (FECHA > fautoret) then
    TOTALPAGAR = TOTALFAC - RTEIVAMONTO - RTEICAMONTO;
ELSE
    TOTALPAGAR = TOTALFAC - RTEFTEMONTO - RTEIVAMONTO - RTEICAMONTO;
if (RECIBIDO <> 0) then
    CAMBIO = RECIBIDO - totalpagar;
ELSE
    CAMBIO = 0;
SUMAEX = 0;
SUMA1 = 0;
SUMA2 = 0;
SUMA3 = 0;
IVA1 = 0;
IVA2 = 0;
IVA3 = 0;
TOTCONSUMO = 0;
MONTOPAGO1 = 0;
SELECT MAX(AUDI_HORA) FROM AUDITORIA WHERE TIDO_COD = 31 AND AUDI_IDDOC = :ID AND AUDI_OPER = 'I' INTO :HORA;
/* AHORA LAS FORMAS DE PAGO, BUSQUE EL ABONO DE HOY A LA FACTURA */
ITEMFP = 1;
MONTOPAGO1 = 0;
MONTOPAGO2 = 0;
MONTOPAGO3 = 0;
FOR SELECT FOPA_NOM, RCPA_MONTO FROM RECIBOS_CAJA_PAGO P, FORMAS_PAGO F, RECIBOS_CAJA R, RECIBOS_CAJA_DETALLE D
    WHERE R.RECA_ID = P.RECA_ID AND R.RECA_ID = D.RECA_ID AND P.FOPA_ID = F.FOPA_ID AND RECA_FECHA = :FECHA AND RCDE_TIPODOC = 31 AND RCDE_IDDOC = :ID
    INTO :formap, :MONTOP
    DO
    BEGIN
    if (ITEMFP = 1) then
        BEGIN
        FORMAPAGO1 = FORMAP;
        MONTOPAGO1 = MONTOP;
        END
    if (ITEMFP = 2) then
        BEGIN
        FORMAPAGO2 = FORMAP;
        MONTOPAGO2 = MONTOP;
        END
    if (ITEMFP = 3) then
        BEGIN
        FORMAPAGO3 = FORMAP;
        MONTOPAGO3 = MONTOP;
        END
    ITEMFP = ITEMFP + 1;
    END
EXECUTE PROCEDURE lee_configuracion ('FACTURACION','DOCUMENTOS','ORDENAR ITEMS POR CODIGO DE ARTICULO') returning_values (:ORDENCOD);
EXECUTE PROCEDURE lee_configuracion ('FACTURACION','POS', 'IMPRIMIR DEVOLUCIONES DE ARTICULOS NEGATIVOS') returning_values (:imprdev);
totcajas = 0;
if (ORDENCOD = 'SI') then
    BEGIN
    FOR SELECT FADE_ITEM, D.ARTI_COD, FADE_CODBAR, SUBSTR(FADE_DESC,1,60), ARTI_DESCORTA, FADE_CANT, FADE_UNIDAD, FADE_FACTOR, BODE_COD, FADE_LOTE, LIPR_COD, FADE_PRUNIT, FADE_DTOPORC, FADE_DTOMONTO, FADE_IVAPORC, FADE_IVAMONTO, FADE_CONSUMO, FADE_TOTAL, FADE_REFERENCIA,
        GRUP_COD, SUBG_COD, MARC_COD, ARTI_PESO, ARTI_ANCHO, ARTI_ALTO, ARTI_LARGO, TAIV_COD, FADE_DEVUELTO, FADE_OBS, FADE_DTO1, FADE_DTO2, FADE_DTO3, FADE_DTOM1, FADE_DTOM2, FADE_DTOM3, FADE_CAJAS
        FROM FACTURAS_DETALLE D, ARTICULO A
        WHERE D.ARTI_COD = A.ARTI_COD AND D.FACT_ID = :ID
        ORDER BY D.ARTI_COD
        INTO :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :DESCORTA, :CANT, :UNIDAD, :FACTOR, :BODITEM, :LOTE, :LISTAPR, :PRUNIT, :DTOITPORC, :DTOITMONTO, :IVAPORC, :IVAITMONTO, :CONSUMO, :TOTAL, :refitem,
        :GRUPO, :SUBGRUPO, :MARCA, :PESO, :ANCHO, :ALTO, :LARGO, :TARIFA, :devuelto, :obsitem, :dtoit1, :dtoit2, :dtoit3, :dtoitm1, :dtoitm2, :dtoitm3, :cajas
        DO
          BEGIN
          if (ARTICULO = CODBAR) then
            SELECT FIRST 1 COBA_COD FROM barras_articulo WHERE ARTI_COD = :articulo INTO :CODBAR;
          if (IMPRDEV <> 'SI') then
            BEGIN
            if ((CANT >= 0) AND (DEVUELTO = 0)) then
                IMPR = 'S';
            ELSE
                IMPR = 'N'; /* ES DEVOLUCION */
            END
          ELSE
            IMPR = 'S';
          if (IMPR = 'S') then
            BEGIN
            prneto = PRUNIT - DTOITMONTO - dtoitm1 - dtoitm2 - dtoitm3;
            if (IMPTOS = 'S') then
                if (cant <> 0) then
                    prnetosiniva = PRUNIT - DTOITMONTO - ((IVAITMONTO+CONSUMO) / CANT) - dtoitm1 - dtoitm2 - dtoitm3;
                else
                    prnetosiniva = PRUNIT - DTOITMONTO - dtoitm1 - dtoitm2 - dtoitm3;
            ELSE
                prnetosiniva = PRUNIT - DTOITMONTO - dtoit1m - dtoit2m - dtoit3m;
            if (ICOINC = 'SI') then
                SUBTOTIT = TOTAL - IVAITMONTO;
            else
                SUBTOTIT = TOTAL - IVAITMONTO - CONSUMO;
            TOTCONSUMO = TOTCONSUMO + CONSUMO;
            SELECT LOTE_VENCE FROM LOTES WHERE LOTE_NRO = :lote AND ARTI_COD = :ARTICULO AND BODE_COD = :boditem INTO :vlote;
            if ((REFITEM <> '.t') or (REFITEM IS NULL)) then
                BEGIN
                /* NO SUME LOS ENSAMBLES */
                if (IVAPORC = 0) then
                    SUMAEX = SUMAEX + TOTAL;
                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;
                END
            if (ANCHO IS NULL) then
                ANCHO = 0;
            if (ALTO IS NULL) then
                ALTO = 0;
            if (LARGO IS NULL) then
                LARGO = 0;
            if (PESO IS NULL) then
                PESO = 0;
            PESO = (PESO / 1000) * CANT * FACTOR;
            totcajas = totcajas + cajas;
            if (substr(ARTICULO,1,2) = '.t') then
                BEGIN
                REFITEM = '';
                TOTAL = 0;
                SUBTOTIT = 0;
                END
            SELECT STAND_COD FROM STANDS WHERE ARTI_COD = :ARTICULO AND STAND_BODEGA = :boditem INTO :stand;
            factcant = NULL;
            SELECT FIRST 1 UNAR_FACCAN FROM unidad_articulo WHERE ARTI_COD = :articulo INTO :factcant;
            if (factcant IS NULL) then
                factcant = 1;
            if (factcant = 1) then
                BEGIN
                ALTERNATIVAS = 0;
                PRINCIPALES = (CANT * FACTOR);
                END
            ELSE
                BEGIN
                ALTERNATIVAS = FLOOR(CANT * factor / factcant);
                PRINCIPALES = (CANT * FACTOR) - (alternativas * factcant);
                END
            SUSPEND;
            END
          END
    END
ELSE
    BEGIN
    FOR SELECT FADE_ITEM, D.ARTI_COD, FADE_CODBAR, SUBSTR(FADE_DESC,1,60), ARTI_DESCORTA, FADE_CANT, FADE_UNIDAD, FADE_FACTOR, BODE_COD, FADE_LOTE, LIPR_COD, FADE_PRUNIT, FADE_DTOPORC, FADE_DTOMONTO, FADE_IVAPORC, FADE_IVAMONTO, FADE_CONSUMO, FADE_TOTAL, FADE_REFERENCIA,
        GRUP_COD, SUBG_COD, MARC_COD, ARTI_PESO, ARTI_ANCHO, ARTI_ALTO, ARTI_LARGO, TAIV_COD, FADE_DEVUELTO, FADE_OBS, FADE_DTO1, FADE_DTO2, FADE_DTO3, FADE_DTOM1, FADE_DTOM2, FADE_DTOM3, FADE_CAJAS
        FROM FACTURAS_DETALLE D, ARTICULO A
        WHERE D.ARTI_COD = A.ARTI_COD AND D.FACT_ID = :ID
        ORDER BY FADE_ITEM
        INTO :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :DESCORTA, :CANT, :UNIDAD, :FACTOR, :BODITEM, :LOTE, :LISTAPR, :PRUNIT, :DTOITPORC, :DTOITMONTO, :IVAPORC, :IVAITMONTO, :CONSUMO, :TOTAL, :refitem,
        :GRUPO, :SUBGRUPO, :MARCA, :PESO, :ANCHO, :ALTO, :LARGO, :TARIFA, :devuelto, :obsitem, :dtoit1, :dtoit2, :dtoit3, :dtoitm1, :dtoitm2, :dtoitm3, :cajas
        DO
          BEGIN
          if (IMPRDEV <> 'SI') then
            BEGIN
            if ((CANT >= 0) AND (DEVUELTO = 0)) then
                IMPR = 'S';
            ELSE
                IMPR = 'N'; /* ES DEVOLUCION */
            END
          ELSE
            IMPR = 'S';
          if (IMPR = 'S') then
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :GRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :MARCA INTO NOMMARCA;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :SUBGRUPO AND GRUP_COD = :GRUPO INTO :NOMSUBG;
            prneto = PRUNIT - DTOITMONTO - dtoitm1 - dtoitm2 - dtoitm3;
            if (IMPTOS = 'S') then
                if (cant <> 0) then
                    prnetosiniva = PRUNIT - DTOITMONTO - ((IVAITMONTO+CONSUMO) / CANT) - dtoit1m - dtoit2m - dtoit3m;
                else
                    prnetosiniva = PRUNIT - DTOITMONTO - dtoitm1 - dtoitm2 - dtoitm3;
            ELSE
                prnetosiniva = PRUNIT - DTOITMONTO - dtoitm1 - dtoitm2 - dtoitm3;
            if (ICOINC = 'SI') then
                SUBTOTIT = TOTAL - IVAITMONTO;
            else
                SUBTOTIT = TOTAL - IVAITMONTO - CONSUMO;
            TOTCONSUMO = TOTCONSUMO + CONSUMO;
            SELECT LOTE_VENCE FROM LOTES WHERE LOTE_NRO = :lote AND ARTI_COD = :ARTICULO AND BODE_COD = :boditem INTO :vlote;
            if ((REFITEM <> '.t') or (REFITEM IS NULL)) then
                BEGIN
                /* NO SUME LOS ENSAMBLES */
                if (IVAPORC = 0) then
                    SUMAEX = SUMAEX + TOTAL;
                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;
                END
            if (ANCHO IS NULL) then
                ANCHO = 0;
            if (ALTO IS NULL) then
                ALTO = 0;
            if (LARGO IS NULL) then
                LARGO = 0;
            if (PESO IS NULL) then
                PESO = 0;
            PESO = (PESO / 1000)* CANT * FACTOR;
            totcajas = totcajas + cajas;
            if (substr(ARTICULO,1,2) = '.t') then
                BEGIN
                REFITEM = '';
                TOTAL = 0;
                SUBTOTIT = 0;
                END
            SELECT STAND_COD FROM STANDS WHERE ARTI_COD = :ARTICULO AND STAND_BODEGA = :boditem INTO :stand;
            factcant = NULL;
            SELECT FIRST 1 UNAR_FACCAN FROM unidad_articulo WHERE ARTI_COD = :articulo INTO :factcant;
            if ((factcant IS NULL) or (FACTCANT = 0)) then
                factcant = 1;
            ALTERNATIVAS = FLOOR(CANT * factor / factcant);
            PRINCIPALES = (CANT * FACTOR) - (alternativas * factcant);
            SUSPEND;
            END
          END
    END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER PROCEDURE IMPR_COTIZACION(
    ID INTEGER)
RETURNS (
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    VALIDEZ INTEGER,
    NIT VARCHAR(20),
    NOMTERCERO VARCHAR(60),
    VENDEDOR INTEGER,
    NOMVENDEDOR VARCHAR(60),
    PUNTOVTA INTEGER,
    NOMPUNTOVTA VARCHAR(60),
    SUBTOTAL NUMERIC(18,2),
    DTOPORC NUMERIC(9,2),
    DTOMONTO NUMERIC(18,2),
    ADICIONAL NUMERIC(18,2),
    IVAMONTO NUMERIC(18,2),
    EXTRA NUMERIC(18,2),
    TOTALFAC NUMERIC(18,2),
    OBS BLOB SUB_TYPE 1 SEGMENT SIZE 80,
    ITEM INTEGER,
    ARTICULO VARCHAR(15),
    CODBAR VARCHAR(15),
    ARTIDES VARCHAR(60),
    CANT NUMERIC(18,4),
    UNIDAD VARCHAR(8),
    FACTOR NUMERIC(18,4),
    LISTAPR INTEGER,
    REFITEM VARCHAR(60),
    PRUNIT NUMERIC(18,2),
    DTOITPORC NUMERIC(9,2),
    DTOITMONTO NUMERIC(18,2),
    PRNETO NUMERIC(18,2),
    PRNETOSINIVA NUMERIC(18,2),
    IVAPORC NUMERIC(9,2),
    IVAITMONTO NUMERIC(18,2),
    CONSUMO NUMERIC(18,2),
    SUBTOTIT NUMERIC(18,2),
    TOTAL NUMERIC(18,2),
    CODIGOCL VARCHAR(20),
    ZONACOD VARCHAR(2),
    ZONANOM VARCHAR(60),
    DV CHAR(1),
    DIRECCION VARCHAR(60),
    CIUDAD VARCHAR(40),
    TELEFONO VARCHAR(40),
    CONTACTO VARCHAR(60),
    FAX VARCHAR(25),
    CEL VARCHAR(25),
    GRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    SUBGRUPO VARCHAR(3),
    NOMSUBG VARCHAR(30),
    MARCA VARCHAR(3),
    NOMMARCA VARCHAR(30),
    PESO NUMERIC(9,4),
    ANCHO NUMERIC(18,4),
    ALTO NUMERIC(18,4),
    LARGO NUMERIC(18,4),
    SUMA1 NUMERIC(18,2),
    SUMA2 NUMERIC(18,2),
    SUMA3 NUMERIC(18,2),
    IVA1 NUMERIC(18,2),
    IVA2 NUMERIC(18,2),
    IVA3 NUMERIC(18,2),
    SUMAEX NUMERIC(18,2),
    SUMAGR NUMERIC(18,2),
    OBSITEM BLOB SUB_TYPE 1 SEGMENT SIZE 80,
    ALTERNATIVAS NUMERIC(18,4),
    PRINCIPALES NUMERIC(18,4))
AS
DECLARE VARIABLE IMPTOS CHAR(1);
DECLARE VARIABLE TARIFA INTEGER;
declare variable ORDENCOD CHAR(2);
declare variable SUCUR VARCHAR(10);
declare variable ICOINC CHAR(2);
declare variable FACTCANT NUMERIC(18,4);
BEGIN
execute procedure lee_configuracion('FACTURACION', 'ARTICULOS', 'IMPOCONSUMO INCLUIDO EN EL PRECIO BASE DE VENTA ANTES DE IVA') returning_values (icoinc);
SELECT F.PREF_PRE, COTI_NUMERO, COTI_FECHA, COTI_VALIDEZ, F.TERC_NIT, COTI_NOMTERC, F.VEND_COD, VEND_NOMBRE, F.PTVT_ID, PTVT_NOM,
    COTI_IMPTOS, COTI_DTOPORC, COTI_DTOMONTO, COTI_ADICIONAL, COTI_IVAMONTO, COTI_EXTRA, COTI_TOTAL,
    TERC_CONTACTO, TERC_FAX, TERC_DV, TERC_CEL, COTI_OBS, COTI_SUCURSAL
    FROM COTIZACIONES F, VENDEDORES V, PUNTO_VENTA P, TERCEROS T
    WHERE F.VEND_COD = V.VEND_COD AND F.PTVT_ID = P.PTVT_ID AND F.TERC_NIT = T.TERC_NIT AND F.COTI_ID = :ID
    into :PREF, :NUMERO, :FECHA, :VALIDEZ, :NIT, :NOMTERCERO, :VENDEDOR, :NOMVENDEDOR, :PUNTOVTA, :NOMPUNTOVTA,
    :IMPTOS, :DTOPORC, :DTOMONTO, :ADICIONAL, :IVAMONTO, :EXTRA, :TOTALFAC,
    :CONTACTO, :FAX, :CEL, :DV, :OBS, :SUCUR;
SUBTOTAL = TOTALFAC - EXTRA - IVAMONTO - ADICIONAL + DTOMONTO;

SELECT CLIE_COD, C.ZONA_COD, ZONA_NOM
    FROM CLIENTES C, ZONAS Z
    WHERE TERC_NIT = :NIT AND C.ZONA_COD = Z.ZONA_COD
    INTO :CODIGOCL, :ZONACOD, :ZONANOM;
SELECT CLSU_DIR, CLSU_CIUDAD, CLSU_TEL FROM CLIENTE_SUCURSALES WHERE TERC_NIT = :NIT AND CLCU_COD = :SUCUR
    INTO :DIRECCION, :CIUDAD, :TELEFONO;
    
SUMAEX = 0;
SUMA1 = 0;
SUMA2 = 0;
SUMA3 = 0;
IVA1 = 0;
IVA2 = 0;
IVA3 = 0;
ITEM = 0;
EXECUTE PROCEDURE lee_configuracion ('FACTURACION','DOCUMENTOS','ORDENAR ITEMS POR CODIGO DE ARTICULO') returning_values (:ORDENCOD);
if (ORDENCOD = 'SI') then
    BEGIN
    FOR SELECT D.ARTI_COD, CTDE_CODBAR, SUBSTR(CTDE_DESC,1,60), CTDE_CANT, CTDE_UNIDAD, LIPR_COD, CTDE_PRUNIT, CTDE_DTOPORC, CTDE_DTOMONTO, CTDE_IVAPORC, CTDE_IVAMONTO, CTDE_CONSUMO, CTDE_TOTAL, CTDE_REFERENCIA,
        GRUP_COD, SUBG_COD, MARC_COD, ARTI_PESO, ARTI_ANCHO, ARTI_ALTO, ARTI_LARGO, TAIV_COD, CTDE_OBS, CTDE_FACTOR
        FROM COTIZACIONES_DETALLE D, ARTICULO A
        WHERE D.ARTI_COD = A.ARTI_COD AND D.COTI_ID = :ID
        ORDER BY CTDE_CODBAR
        INTO :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :LISTAPR, :PRUNIT, :DTOITPORC, :DTOITMONTO, :IVAPORC, :IVAITMONTO, :CONSUMO, :TOTAL, :refitem,
        :GRUPO, :SUBGRUPO, :MARCA, :PESO, :ANCHO, :ALTO, :LARGO, :TARIFA, :obsitem, :FACTOR
        DO
        BEGIN
        if (ICOINC = 'SI') then
            SUBTOTIT = TOTAL - IVAITMONTO;
        else
            SUBTOTIT = TOTAL - IVAITMONTO - CONSUMO;
        if (ARTICULO = CODBAR) then
            SELECT FIRST 1 COBA_COD FROM barras_articulo WHERE ARTI_COD = :articulo INTO :CODBAR;
        SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :GRUPO INTO NOMGRUPO;
        SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :MARCA INTO NOMMARCA;
        SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :SUBGRUPO AND GRUP_COD = :GRUPO INTO :NOMSUBG;
        ITEM = ITEM + 1;
        PRNETO = PRUNIT - DTOITMONTO;
        if (PESO IS NULL) then
            PESO = 0;
        PESO = PESO / 1000 * CANT * FACTOR;
        if (IMPTOS = 'S') then
            if (cant <> 0) then
                prnetosiniva = PRUNIT - DTOITMONTO - ((IVAITMONTO+CONSUMO) / CANT);
            else
                prnetosiniva = PRUNIT - DTOITMONTO;
        ELSE
            prnetosiniva = PRUNIT - DTOITMONTO;
        if (ivaporc = 0) then
            SUMAEX = SUMAEX + TOTAL;
        if (TARIFA = 1) then
            BEGIN
            SUMA1 = SUMA1 + TOTAL - IVAITMONTO;
            IVA1 = IVA1 + IVAITMONTO;
            END
        if (TARIFA = 2) then
            BEGIN
            SUMA2 = SUMA2 + TOTAL - IVAITMONTO;
            IVA2 = IVA2 + IVAITMONTO;
            END
        if (TARIFA = 3) then
            BEGIN
            SUMA3 = SUMA3 + TOTAL - IVAITMONTO;
            IVA3 = IVA3 + IVAITMONTO;
            END
        SUMAGR = SUMA1 + SUMA2 + SUMA3;
        if (IMPTOS = 'N') then
            TOTAL = TOTAL - IVAITMONTO;
        SELECT FIRST 1 UNAR_FACCAN FROM unidad_articulo WHERE ARTI_COD = :articulo INTO :factcant;
        ALTERNATIVAS = FLOOR(CANT / factcant);
        PRINCIPALES = CANT - (alternativas * factcant);
        SUSPEND;
        END
    END
ELSE
    BEGIN
    FOR SELECT D.ARTI_COD, CTDE_CODBAR, SUBSTR(CTDE_DESC,1,60), CTDE_CANT, CTDE_UNIDAD, LIPR_COD, CTDE_PRUNIT, CTDE_DTOPORC, CTDE_DTOMONTO, CTDE_IVAPORC, CTDE_IVAMONTO, CTDE_CONSUMO, CTDE_TOTAL, CTDE_REFERENCIA,
        GRUP_COD, SUBG_COD, MARC_COD, ARTI_PESO, ARTI_ANCHO, ARTI_ALTO, ARTI_LARGO, TAIV_COD, CTDE_OBS, CTDE_FACTOR
        FROM COTIZACIONES_DETALLE D, ARTICULO A
        WHERE D.ARTI_COD = A.ARTI_COD AND D.COTI_ID = :ID
        ORDER BY CTDE_ITEM
        INTO :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :LISTAPR, :PRUNIT, :DTOITPORC, :DTOITMONTO, :IVAPORC, :IVAITMONTO, :CONSUMO, :TOTAL, :refitem,
        :GRUPO, :SUBGRUPO, :MARCA, :PESO, :ANCHO, :ALTO, :LARGO, :TARIFA, :obsitem, :FACTOR
        DO
        BEGIN
        SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :GRUPO INTO NOMGRUPO;
        SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :MARCA INTO NOMMARCA;
        SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :SUBGRUPO AND GRUP_COD = :GRUPO INTO :NOMSUBG;
        ITEM = ITEM + 1;
        if (ICOINC = 'SI') then
            SUBTOTIT = TOTAL - IVAITMONTO;
        else
            SUBTOTIT = TOTAL - IVAITMONTO - CONSUMO;
        PRNETO = PRUNIT - DTOITMONTO;
        if (PESO IS NULL) then
            PESO = 0;
        PESO = PESO / 1000 * CANT * FACTOR;
        if (IMPTOS = 'S') then
            if (cant <> 0) then
                prnetosiniva = PRUNIT - DTOITMONTO - ((IVAITMONTO+CONSUMO) / CANT);
            else
                prnetosiniva = PRUNIT - DTOITMONTO;
        ELSE
            prnetosiniva = PRUNIT - DTOITMONTO;
        if (ivaporc = 0) then
            SUMAEX = SUMAEX + TOTAL;
        if (TARIFA = 1) then
            BEGIN
            SUMA1 = SUMA1 + TOTAL - IVAITMONTO;
            IVA1 = IVA1 + IVAITMONTO;
            END
        if (TARIFA = 2) then
            BEGIN
            SUMA2 = SUMA2 + TOTAL - IVAITMONTO;
            IVA2 = IVA2 + IVAITMONTO;
            END
        if (TARIFA = 3) then
            BEGIN
            SUMA3 = SUMA3 + TOTAL - IVAITMONTO;
            IVA3 = IVA3 + IVAITMONTO;
            END
        SUMAGR = SUMA1 + SUMA2 + SUMA3;
        if (IMPTOS = 'N') then
            TOTAL = TOTAL - IVAITMONTO;
        factcant = NULL;
        SELECT FIRST 1 UNAR_FACCAN FROM unidad_articulo WHERE ARTI_COD = :articulo INTO :factcant;
        if ((factcant IS NULL) or (FACTCANT = 0)) then
            factcant = 1;
        ALTERNATIVAS = FLOOR(CANT / factcant);
        PRINCIPALES = CANT - (alternativas * factcant);
        SUSPEND;
        END
    END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER PROCEDURE IMPR_REMISION(
    ID INTEGER)
RETURNS (
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    NIT VARCHAR(20),
    NOMTERCERO VARCHAR(60),
    VENDEDOR INTEGER,
    NOMVENDEDOR VARCHAR(60),
    PUNTOVTA INTEGER,
    NOMPUNTOVTA VARCHAR(30),
    CODBODEGA VARCHAR(2),
    NOMBODEGA VARCHAR(30),
    COTIZACION VARCHAR(30),
    PEDIDO VARCHAR(30),
    FACTURA VARCHAR(30),
    SUBTOTAL NUMERIC(18,2),
    IVAMONTO NUMERIC(18,2),
    TOTALFAC NUMERIC(18,2),
    DESPACHO VARCHAR(255),
    TRANSPORTADOR VARCHAR(60),
    OBS BLOB SUB_TYPE 1 SEGMENT SIZE 80,
    ITEM INTEGER,
    ARTICULO VARCHAR(15),
    CODBAR VARCHAR(15),
    ARTIDES VARCHAR(60),
    CANT NUMERIC(18,4),
    LOTE VARCHAR(15),
    VLOTE DATE,
    UNIDAD VARCHAR(8),
    FACTOR NUMERIC(18,4),
    CAJAS NUMERIC(18,4),
    DEVUELTO NUMERIC(18,4),
    CONSUMIDO NUMERIC(18,4),
    LISTAPR INTEGER,
    REFITEM VARCHAR(60),
    BODITEM VARCHAR(2),
    STAND VARCHAR(15),
    PRUNIT NUMERIC(18,2),
    DTOITPORC NUMERIC(9,2),
    DTOITMONTO NUMERIC(18,2),
    PRNETOSINIVA NUMERIC(18,2),
    PRNETO NUMERIC(18,2),
    IVAPORC NUMERIC(9,2),
    IVAITMONTO NUMERIC(18,2),
    CONSUMO NUMERIC(18,2),
    SUBTOTIT NUMERIC(18,2),
    TOTAL NUMERIC(18,2),
    CODIGOCL VARCHAR(20),
    ZONACOD VARCHAR(2),
    ZONANOM VARCHAR(60),
    DV CHAR(1),
    DIRECCION VARCHAR(60),
    CIUDAD VARCHAR(40),
    TELEFONO VARCHAR(40),
    CONTACTO VARCHAR(60),
    FAX VARCHAR(25),
    CEL VARCHAR(25),
    GRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    SUBGRUPO VARCHAR(3),
    NOMSUBG VARCHAR(30),
    MARCA VARCHAR(3),
    NOMMARCA VARCHAR(30),
    PESO NUMERIC(9,4),
    ANCHO NUMERIC(18,4),
    ALTO NUMERIC(18,4),
    LARGO NUMERIC(18,4),
    SUMA1 NUMERIC(18,2),
    SUMA2 NUMERIC(18,2),
    SUMA3 NUMERIC(18,2),
    IVA1 NUMERIC(18,2),
    IVA2 NUMERIC(18,2),
    IVA3 NUMERIC(18,2),
    SUMAEX NUMERIC(18,2),
    SUMAGR NUMERIC(18,2),
    TOTCAJAS NUMERIC(18,2),
    OBSITEM BLOB SUB_TYPE 1 SEGMENT SIZE 80,
    ALTERNATIVAS NUMERIC(18,4),
    PRINCIPALES NUMERIC(18,4))
AS
DECLARE VARIABLE IMPTOS CHAR(1);
DECLARE VARIABLE TARIFA INTEGER;
declare variable ORDENCOD CHAR(2);
declare variable SUCUR VARCHAR(10);
declare variable ICOINC CHAR(2);
declare variable FACTCANT NUMERIC(18,4);
BEGIN
execute procedure lee_configuracion('FACTURACION', 'ARTICULOS', 'IMPOCONSUMO INCLUIDO EN EL PRECIO BASE DE VENTA ANTES DE IVA') returning_values (icoinc);
EXECUTE PROCEDURE lee_configuracion ('FACTURACION','DOCUMENTOS','ORDENAR ITEMS POR CODIGO DE ARTICULO') returning_values (:ORDENCOD);
SELECT F.PREF_PRE, REVT_NUMERO, REVT_FECHA, F.BODE_COD, BODE_NOM, F.TERC_NIT, REVT_NOMTERC, F.VEND_COD, VEND_NOMBRE, F.PTVT_ID, PTVT_NOM,
    REVT_COTIZACI, REVT_PEDIDO, REVT_FACTURA, REVT_IVAINC,
    REVT_IVAMONTO, REVT_TOTAL, REVT_DESPACHO, REVT_TRANSP,
    TERC_CONTACTO, TERC_FAX, TERC_DV, TERC_CEL, REVT_OBS, REVT_SUCURSAL
    FROM REMISIONES_VENTA F, BODEGA B, VENDEDORES V, PUNTO_VENTA P, TERCEROS T
    WHERE F.BODE_COD = B.BODE_COD AND F.VEND_COD = V.VEND_COD AND F.PTVT_ID = P.PTVT_ID AND F.TERC_NIT = T.TERC_NIT AND F.REVT_ID = :ID
    into :PREF, :NUMERO, :FECHA, :CODBODEGA, :NOMBODEGA, :NIT, :NOMTERCERO, :VENDEDOR, :NOMVENDEDOR, :PUNTOVTA, :NOMPUNTOVTA,
    :COTIZACION, :PEDIDO, :FACTURA, :IMPTOS,
    :IVAMONTO, :TOTALFAC, :DESPACHO, :transportador, 
    :CONTACTO, :FAX, :DV, :CEL, :OBS, :SUCUR;
SUBTOTAL = TOTALFAC - IVAMONTO;

SELECT CLIE_COD, C.ZONA_COD, ZONA_NOM
    FROM CLIENTES C, ZONAS Z
    WHERE TERC_NIT = :NIT AND C.ZONA_COD = Z.ZONA_COD
    INTO :CODIGOCL, :ZONACOD, :ZONANOM;
SELECT CLSU_DIR, CLSU_CIUDAD, CLSU_TEL FROM CLIENTE_SUCURSALES WHERE TERC_NIT = :NIT AND CLCU_COD = :SUCUR
    INTO :DIRECCION, :CIUDAD, :TELEFONO;
    
SUMAEX = 0;
SUMA1 = 0;
SUMA2 = 0;
SUMA3 = 0;
IVA1 = 0;
IVA2 = 0;
IVA3 = 0;
ITEM = 0;
totcajas = 0;
if (ORDENCOD = 'SI') then
    BEGIN
    FOR SELECT D.ARTI_COD, RVDE_CODBAR, SUBSTR(RVDE_DESC,1,60), RVDE_CANT, RVDE_UNIDAD, BODE_COD, RVDE_LOTE, LIPR_COD, RVDE_PRUNIT, RVDE_DTOPORC, RVDE_DTOMONTO, RVDE_IVAPORC, RVDE_IVAMONTO, RVDE_CONSUMO, RVDE_TOTAL, RVDE_REFERENCIA,
        GRUP_COD, SUBG_COD, MARC_COD, ARTI_PESO, ARTI_ANCHO, ARTI_ALTO, ARTI_LARGO, TAIV_COD, RVDE_DEVUELTO, RVDE_OBS, RVDE_CAJAS, RVDE_FACTOR
        FROM REMISIONES_VENTA_DETALLE D, ARTICULO A
        WHERE D.ARTI_COD = A.ARTI_COD AND D.REVT_ID = :ID
        ORDER BY RVDE_CODBAR
        INTO :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :BODITEM, :LOTE, :LISTAPR, :PRUNIT, :DTOITPORC, :DTOITMONTO, :IVAPORC, :IVAITMONTO, :CONSUMO, :TOTAL, :refitem,
            :GRUPO, :SUBGRUPO, :MARCA, :PESO, :ANCHO, :ALTO, :LARGO, :TARIFA, :DEVUELTO, :obsitem, :CAJAS, :FACTOR
        DO
        BEGIN
        if (ARTICULO = CODBAR) then
            SELECT FIRST 1 COBA_COD FROM barras_articulo WHERE ARTI_COD = :articulo INTO :CODBAR;
        SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :GRUPO INTO NOMGRUPO;
        SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :MARCA INTO NOMMARCA;
        SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :SUBGRUPO AND GRUP_COD = :GRUPO INTO :NOMSUBG;
        SELECT LOTE_VENCE FROM LOTES WHERE LOTE_NRO = :lote AND ARTI_COD = :ARTICULO AND BODE_COD = :boditem INTO :vlote;
        if (ICOINC = 'SI') then
            SUBTOTIT = TOTAL - IVAITMONTO;
        else
            SUBTOTIT = TOTAL - IVAITMONTO - CONSUMO;
        CONSUMIDO = cant * factor - devuelto;
        ITEM = ITEM + 1;
        PRNETO = PRUNIT - DTOITMONTO;
        if (PESO IS NULL) then
            PESO = 0;
        PESO = PESO / 1000 * CANT * FACTOR;
        if (IMPTOS = 'S') then
            if (cant <> 0) then
                prnetosiniva = PRUNIT - DTOITMONTO - ((IVAITMONTO+CONSUMO) / CANT);
            else
                prnetosiniva = PRUNIT - DTOITMONTO;
        ELSE
            prnetosiniva = PRUNIT - DTOITMONTO;
        if (IVAPORC = 0) then
            SUMAEX = SUMAEX + TOTAL;
        if (TARIFA = 1) then
            BEGIN
            SUMA1 = SUMA1 + TOTAL - IVAITMONTO;
            IVA1 = IVA1 + IVAITMONTO;
            END
        if (TARIFA = 2) then
            BEGIN
            SUMA2 = SUMA2 + TOTAL - IVAITMONTO;
            IVA2 = IVA2 + IVAITMONTO;
            END
        if (TARIFA = 3) then
            BEGIN
            SUMA3 = SUMA3 + TOTAL - IVAITMONTO;
            IVA3 = IVA3 + IVAITMONTO;
            END
        SUMAGR = SUMA1 + SUMA2 + SUMA3;

        totcajas = totcajas + cajas;
        SELECT STAND_COD FROM STANDS WHERE ARTI_COD = :ARTICULO AND STAND_BODEGA = :boditem INTO :stand;
        SELECT FIRST 1 UNAR_FACCAN FROM unidad_articulo WHERE ARTI_COD = :articulo INTO :factcant;
        ALTERNATIVAS = FLOOR(CANT / factcant);
        PRINCIPALES = CANT - (alternativas * factcant);
        SUSPEND;
        END
    END
ELSE
    BEGIN
    FOR SELECT RVDE_ITEM, D.ARTI_COD, RVDE_CODBAR, SUBSTR(RVDE_DESC,1,60), RVDE_CANT, RVDE_UNIDAD, BODE_COD, RVDE_LOTE, LIPR_COD, RVDE_PRUNIT, RVDE_DTOPORC, RVDE_DTOMONTO, RVDE_IVAPORC, RVDE_IVAMONTO, RVDE_CONSUMO, RVDE_TOTAL, RVDE_REFERENCIA,
        GRUP_COD, SUBG_COD, MARC_COD, ARTI_PESO, ARTI_ANCHO, ARTI_ALTO, ARTI_LARGO, TAIV_COD, RVDE_DEVUELTO, RVDE_OBS, RVDE_CAJAS, RVDE_FACTOR
        FROM REMISIONES_VENTA_DETALLE D, ARTICULO A
        WHERE D.ARTI_COD = A.ARTI_COD AND D.REVT_ID = :ID
        ORDER BY RVDE_ITEM
        INTO :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :BODITEM, :LOTE, :LISTAPR, :PRUNIT, :DTOITPORC, :DTOITMONTO, :IVAPORC, :IVAITMONTO, :CONSUMO, :TOTAL, :refitem,
            :GRUPO, :SUBGRUPO, :MARCA, :PESO, :ANCHO, :ALTO, :LARGO, :TARIFA, :DEVUELTO, :obsitem, :CAJAS, :FACTOR
        DO
        BEGIN
        SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :GRUPO INTO NOMGRUPO;
        SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :MARCA INTO NOMMARCA;
        SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :SUBGRUPO AND GRUP_COD = :GRUPO INTO :NOMSUBG;
        SELECT LOTE_VENCE FROM LOTES WHERE LOTE_NRO = :lote AND ARTI_COD = :ARTICULO AND BODE_COD = :boditem INTO :vlote;
        if (ICOINC = 'SI') then
            SUBTOTIT = TOTAL - IVAITMONTO;
        else
            SUBTOTIT = TOTAL - IVAITMONTO - CONSUMO;
        CONSUMIDO = cant * factor - devuelto;
        ITEM = ITEM + 1;
        PRNETO = PRUNIT - DTOITMONTO;
        if (PESO IS NULL) then
            PESO = 0;
        PESO = PESO / 1000 * CANT * FACTOR;
        if (IMPTOS = 'S') then
            if (cant <> 0) then
                prnetosiniva = PRUNIT - DTOITMONTO - ((IVAITMONTO+CONSUMO) / CANT);
            else
                prnetosiniva = PRUNIT - DTOITMONTO;
        ELSE
            prnetosiniva = PRUNIT - DTOITMONTO;
        if (IVAPORC = 0) then
            SUMAEX = SUMAEX + TOTAL;
        if (TARIFA = 1) then
            BEGIN
            SUMA1 = SUMA1 + TOTAL - IVAITMONTO;
            IVA1 = IVA1 + IVAITMONTO;
            END
        if (TARIFA = 2) then
            BEGIN
            SUMA2 = SUMA2 + TOTAL - IVAITMONTO;
            IVA2 = IVA2 + IVAITMONTO;
            END
        if (TARIFA = 3) then
            BEGIN
            SUMA3 = SUMA3 + TOTAL - IVAITMONTO;
            IVA3 = IVA3 + IVAITMONTO;
            END
        SUMAGR = SUMA1 + SUMA2 + SUMA3;
        totcajas = totcajas + cajas;
        SELECT STAND_COD FROM STANDS WHERE ARTI_COD = :ARTICULO AND STAND_BODEGA = :boditem INTO :stand;
        factcant = NULL;
        SELECT FIRST 1 UNAR_FACCAN FROM unidad_articulo WHERE ARTI_COD = :articulo INTO :factcant;
        if ((factcant IS NULL) or (FACTCANT = 0)) then
            factcant = 1;
        ALTERNATIVAS = FLOOR(CANT / factcant);
        PRINCIPALES = CANT - (alternativas * factcant);
        SUSPEND;
        END
    END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER PROCEDURE IMPR_PEDIDO(
    ID INTEGER)
RETURNS (
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    VALIDEZ INTEGER,
    NIT VARCHAR(20),
    NOMTERCERO VARCHAR(60),
    VENDEDOR INTEGER,
    NOMVENDEDOR VARCHAR(60),
    PUNTOVTA INTEGER,
    NOMPUNTOVTA VARCHAR(30),
    COTIZACION VARCHAR(30),
    SUBTOTAL NUMERIC(18,2),
    DTOPORC NUMERIC(9,2),
    DTOMONTO NUMERIC(18,2),
    ADICIONAL NUMERIC(18,2),
    IVAMONTO NUMERIC(18,2),
    EXTRA NUMERIC(18,2),
    TOTALFAC NUMERIC(18,2),
    OBS BLOB SUB_TYPE 1 SEGMENT SIZE 80,
    ITEM INTEGER,
    ARTICULO VARCHAR(15),
    CODBAR VARCHAR(15),
    ARTIDES VARCHAR(60),
    BODEGA VARCHAR(2),
    CANT NUMERIC(18,4),
    UNIDAD VARCHAR(8),
    FACTOR NUMERIC(18,4),
    LISTAPR INTEGER,
    REFITEM VARCHAR(60),
    PRUNIT NUMERIC(18,2),
    DTOITPORC NUMERIC(9,2),
    DTOITMONTO NUMERIC(18,2),
    PRNETO NUMERIC(18,2),
    PRNETOSINIVA NUMERIC(18,2),
    DTOIT1 NUMERIC(9,2),
    DTOIT2 NUMERIC(9,2),
    DTOIT3 NUMERIC(9,2),
    IVAPORC NUMERIC(9,2),
    IVAITMONTO NUMERIC(18,2),
    CONSUMO NUMERIC(18,2),
    SUBTOTIT NUMERIC(18,2),
    TOTAL NUMERIC(18,2),
    CODIGOCL VARCHAR(20),
    ZONACOD VARCHAR(2),
    ZONANOM VARCHAR(60),
    DV CHAR(1),
    DIRECCION VARCHAR(60),
    CIUDAD VARCHAR(40),
    TELEFONO VARCHAR(40),
    CONTACTO VARCHAR(60),
    FAX VARCHAR(25),
    CEL VARCHAR(25),
    GRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    SUBGRUPO VARCHAR(3),
    NOMSUBG VARCHAR(30),
    MARCA VARCHAR(3),
    NOMMARCA VARCHAR(30),
    PESO NUMERIC(9,4),
    ANCHO NUMERIC(18,4),
    ALTO NUMERIC(18,4),
    LARGO NUMERIC(18,4),
    SUMA1 NUMERIC(18,2),
    SUMA2 NUMERIC(18,2),
    SUMA3 NUMERIC(18,2),
    IVA1 NUMERIC(18,2),
    IVA2 NUMERIC(18,2),
    IVA3 NUMERIC(18,2),
    SUMAEX NUMERIC(18,2),
    SUMAGR NUMERIC(18,2),
    DTOIT1M NUMERIC(18,2),
    DTOIT2M NUMERIC(18,2),
    DTOIT3M NUMERIC(18,2),
    OBSITEM BLOB SUB_TYPE 1 SEGMENT SIZE 80,
    ALTERNATIVAS NUMERIC(18,4),
    PRINCIPALES NUMERIC(18,4))
AS
DECLARE VARIABLE IMPTOS CHAR(1);
DECLARE VARIABLE TARIFA INTEGER;
declare variable ORDENCOD CHAR(2);
declare variable SUCUR VARCHAR(10);
declare variable ICOINC CHAR(2);
declare variable DTOITM1 NUMERIC(18,2);
declare variable DTOITM2 NUMERIC(18,2);
declare variable DTOITM3 NUMERIC(18,2);
declare variable FACTCANT NUMERIC(18,4);
BEGIN
execute procedure lee_configuracion('FACTURACION', 'ARTICULOS', 'IMPOCONSUMO INCLUIDO EN EL PRECIO BASE DE VENTA ANTES DE IVA') returning_values (icoinc);
SELECT F.PREF_PRE, PEDI_NUMERO, PEDI_FECHA, PEDI_VALIDEZ, F.TERC_NIT, PEDI_NOMTERC, F.VEND_COD, VEND_NOMBRE, F.PTVT_ID, PTVT_NOM, PEDI_COTIZACI,
    PEDI_IVAINC, PEDI_DTOPOR, PEDI_DTOMONTO, PEDI_ADICIONAL, PEDI_IVAMONTO, PEDI_EXTRA, PEDI_TOTAL,
    TERC_CONTACTO, TERC_FAX, TERC_DV, TERC_CEL, PEDI_OBS, PEDI_SUCURSAL, PEDI_DTOIT1, PEDI_DTOIT2, PEDI_DTOIT3
    FROM PEDIDOS F, VENDEDORES V, PUNTO_VENTA P, TERCEROS T
    WHERE F.VEND_COD = V.VEND_COD AND F.PTVT_ID = P.PTVT_ID AND F.TERC_NIT = T.TERC_NIT AND F.PEDI_ID = :ID
    into :PREF, :NUMERO, :FECHA, :VALIDEZ, :NIT, :NOMTERCERO, :VENDEDOR, :NOMVENDEDOR, :PUNTOVTA, :NOMPUNTOVTA, :COTIZACION,
    :IMPTOS, :DTOPORC, :DTOMONTO, :ADICIONAL, :IVAMONTO, :EXTRA, :TOTALFAC,
    :CONTACTO, :FAX, :DV, :CEL, :OBS, :SUCUR, :dtoit1m, :dtoit2m, :dtoit3m;
SUBTOTAL = TOTALFAC - EXTRA - IVAMONTO - ADICIONAL + DTOMONTO;

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

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER PROCEDURE IMPR_DEVOLUCION(
    ID INTEGER)
RETURNS (
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    NIT VARCHAR(20),
    NOMTERCERO VARCHAR(60),
    VENDEDOR INTEGER,
    NOMVENDEDOR VARCHAR(60),
    PUNTOVTA INTEGER,
    NOMPUNTOVTA VARCHAR(30),
    CODBODEGA VARCHAR(2),
    NOMBODEGA VARCHAR(30),
    FACTURA VARCHAR(30),
    REMISION VARCHAR(10),
    COMIPORC NUMERIC(9,2),
    COMIMONTO NUMERIC(18,2),
    SUBTOTAL NUMERIC(18,2),
    DTOPORC NUMERIC(9,2),
    DTOMONTO NUMERIC(18,2),
    ADICIONAL NUMERIC(18,2),
    IVAMONTO NUMERIC(18,2),
    RTEFTEPORC NUMERIC(9,2),
    RTEFTEMONTO NUMERIC(18,2),
    RTEIVAPORC NUMERIC(9,2),
    RTEIVAMONTO NUMERIC(18,2),
    RTEICAPORC NUMERIC(9,2),
    RTEICAMONTO NUMERIC(18,2),
    EXTRA NUMERIC(18,2),
    TOTALFAC NUMERIC(18,2),
    TOTALPAGAR NUMERIC(18,2),
    OBS BLOB SUB_TYPE 1 SEGMENT SIZE 80,
    ITEM INTEGER,
    ARTICULO VARCHAR(15),
    CODBAR VARCHAR(15),
    ARTIDES VARCHAR(60),
    CANT NUMERIC(18,4),
    LOTE VARCHAR(15),
    UNIDAD VARCHAR(8),
    FACTOR NUMERIC(18,4),
    REFITEM VARCHAR(60),
    BODITEM VARCHAR(2),
    PRUNIT NUMERIC(18,2),
    DTOITPORC NUMERIC(9,2),
    DTOITMONTO NUMERIC(18,2),
    PRNETO NUMERIC(18,2),
    PRNETOSINIVA NUMERIC(18,2),
    IVAPORC NUMERIC(9,2),
    IVAITMONTO NUMERIC(18,2),
    CONSUMO NUMERIC(18,2),
    SUBTOTIT NUMERIC(18,2),
    TOTAL NUMERIC(18,2),
    CODIGOCL VARCHAR(20),
    ZONACOD VARCHAR(2),
    ZONANOM VARCHAR(60),
    DV CHAR(1),
    DIRECCION VARCHAR(60),
    CIUDAD VARCHAR(40),
    TELEFONO VARCHAR(40),
    CONTACTO VARCHAR(60),
    FAX VARCHAR(25),
    CEL VARCHAR(25),
    GRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    SUBGRUPO VARCHAR(3),
    NOMSUBG VARCHAR(30),
    MARCA VARCHAR(3),
    NOMMARCA VARCHAR(30),
    PESO NUMERIC(9,4),
    ANCHO NUMERIC(18,4),
    ALTO NUMERIC(18,4),
    LARGO NUMERIC(18,4),
    SUMA1 NUMERIC(18,2),
    SUMA2 NUMERIC(18,2),
    SUMA3 NUMERIC(18,2),
    IVA1 NUMERIC(18,2),
    IVA2 NUMERIC(18,2),
    IVA3 NUMERIC(18,2),
    TOTCONSUMO NUMERIC(18,2),
    SUMAEX NUMERIC(18,2),
    SUMAGR NUMERIC(18,2),
    OBSITEM BLOB SUB_TYPE 1 SEGMENT SIZE 80,
    ALTERNATIVAS NUMERIC(18,4),
    PRINCIPALES NUMERIC(18,4))
AS
DECLARE VARIABLE IMPTOS CHAR(1);
DECLARE VARIABLE TARIFA INTEGER;
declare variable ORDENCOD CHAR(2);
declare variable SUCUR VARCHAR(10);
declare variable PUNTOS NUMERIC(18,4);
declare variable ICOINC CHAR(2);
declare variable FACTCANT NUMERIC(18,4);
BEGIN
execute procedure lee_configuracion('FACTURACION', 'ARTICULOS', 'IMPOCONSUMO INCLUIDO EN EL PRECIO BASE DE VENTA ANTES DE IVA') returning_values (icoinc);
SELECT F.PREF_PRE, DEVT_NUMERO, DEVT_FECHA, F.BODE_COD, BODE_NOM, F.TERC_NIT, DEVT_NOMTERC, F.VEND_COD, VEND_NOMBRE, F.PTVT_ID, PTVT_NOM,
    DEVT_FACTURA, DEVT_COMIPORC, DEVT_COMIMONTO, DEVT_IVAINC,
    DEVT_DTOPOR, DEVT_DTOMONTO, DEVT_ADICIONAL, DEVT_IVAMONTO, DEVT_RTFTEPORC, DEVT_RTFTEMONTO, DEVT_RTIVAPORC, DEVT_RTIVAMONTO, DEVT_RTICAPORC, DEVT_RTICAMONTO, DEVT_EXTRA, DEVT_TOTAL,
    TERC_CONTACTO, TERC_FAX, TERC_DV, TERC_CEL, DEVT_OBS, DEVT_SUCURSAL, DEVT_REMISION
    FROM DEVOLUCIONES_VENTAS F, BODEGA B, VENDEDORES V, PUNTO_VENTA P, TERCEROS T
    WHERE F.BODE_COD = B.BODE_COD AND F.VEND_COD = V.VEND_COD AND F.PTVT_ID = P.PTVT_ID AND F.TERC_NIT = T.TERC_NIT AND F.DEVT_ID = :ID
    into :PREF, :NUMERO, :FECHA, :CODBODEGA, :NOMBODEGA, :NIT, :NOMTERCERO, :VENDEDOR, :NOMVENDEDOR, :PUNTOVTA, :NOMPUNTOVTA,
    :FACTURA, :COMIPORC, :COMIMONTO, :IMPTOS,
    :DTOPORC, :DTOMONTO, :ADICIONAL, :IVAMONTO, :RTEFTEPORC, :RTEFTEMONTO, :RTEIVAPORC, :RTEIVAMONTO, :RTEICAPORC, :RTEICAMONTO, :EXTRA, :TOTALFAC,
    :CONTACTO, :FAX, :DV, :CEL, :OBS, :SUCUR, :REMISION;
SUBTOTAL = TOTALFAC - EXTRA - IVAMONTO - ADICIONAL + DTOMONTO;
TOTALPAGAR = TOTALFAC - RTEFTEMONTO - RTEIVAMONTO - RTEICAMONTO;

EXECUTE PROCEDURE acumula_puntos_cliente (33, :id, :nit, :fecha) returning_values (:PUNTOS);
SELECT CLIE_COD, C.ZONA_COD, ZONA_NOM
    FROM CLIENTES C, ZONAS Z
    WHERE TERC_NIT = :NIT AND C.ZONA_COD = Z.ZONA_COD
    INTO :CODIGOCL, :ZONACOD, :ZONANOM;
SELECT CLSU_DIR, CLSU_CIUDAD, CLSU_TEL FROM CLIENTE_SUCURSALES WHERE TERC_NIT = :NIT AND CLCU_COD = :SUCUR
    INTO :DIRECCION, :CIUDAD, :TELEFONO;
    
SUMAEX = 0;
SUMA1 = 0;
SUMA2 = 0;
SUMA3 = 0;
IVA1 = 0;
IVA2 = 0;
IVA3 = 0;
TOTCONSUMO = 0;
ITEM = 0;
EXECUTE PROCEDURE lee_configuracion ('FACTURACION','DOCUMENTOS','ORDENAR ITEMS POR CODIGO DE ARTICULO') returning_values (:ORDENCOD);
if (ORDENCOD = 'SI') then
    BEGIN
    FOR SELECT D.ARTI_COD, DVDE_CODBAR, SUBSTR(DVDE_DESC,1,60), DVDE_CANT, DVDE_UNIDAD, BODE_COD, DVDE_LOTE, DVDE_PRUNIT, DVDE_DTOPORC, DVDE_DTOMONTO, DVDE_IVAPORC, DVDE_IVAMONTO, DVDE_CONSUMO, DVDE_TOTAL, DVDE_REFERENCIA,
        GRUP_COD, SUBG_COD, MARC_COD, ARTI_PESO, ARTI_ANCHO, ARTI_ALTO, ARTI_LARGO, TAIV_COD, DVDE_OBS, DVDE_FACTOR
        FROM DEVOLUCIONES_VENTAS_DETALLE D, ARTICULO A
        WHERE D.ARTI_COD = A.ARTI_COD AND D.DEVT_ID = :ID
        ORDER BY DVDE_CODBAR
        INTO :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :BODITEM, :LOTE, :PRUNIT, :DTOITPORC, :DTOITMONTO, :IVAPORC, :IVAITMONTO, :CONSUMO, :TOTAL, :REFITEM,
        :GRUPO, :SUBGRUPO, :MARCA, :PESO, :ANCHO, :ALTO, :LARGO, :TARIFA, :obsitem, :FACTOR
        DO
        BEGIN
        if (ARTICULO = CODBAR) then
            SELECT FIRST 1 COBA_COD FROM barras_articulo WHERE ARTI_COD = :articulo INTO :CODBAR;
        ITEM = ITEM + 1;
        if (ICOINC = 'SI') then
            SUBTOTIT = TOTAL - IVAITMONTO;
        else
            SUBTOTIT = TOTAL - IVAITMONTO - CONSUMO;
        PRNETO = PRUNIT - DTOITMONTO;
        if (PESO IS NULL) then
            PESO = 0;
        PESO = PESO / 1000 * CANT * FACTOR;
        if (IMPTOS = 'S') then
            if (cant <> 0) then
                prnetosiniva = PRUNIT - DTOITMONTO - ((IVAITMONTO+CONSUMO) / CANT);
            else
                prnetosiniva = PRUNIT - DTOITMONTO;
        ELSE
            prnetosiniva = PRUNIT - DTOITMONTO;
        TOTCONSUMO = TOTCONSUMO + CONSUMO;
        if ((REFITEM <> '.t') or (REFITEM IS NULL)) then
            BEGIN
            /* NO SUME LOS ENSAMBLES */
            if (IVAPORC = 0) then
                SUMAEX = SUMAEX + TOTAL;
            if (TARIFA = 1) then
                BEGIN
                SUMA1 = SUMA1 + TOTAL - IVAITMONTO;
                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;
            END
        if (substr(ARTICULO,1,2) = '.t') then
            BEGIN
            REFITEM = '';
            TOTAL = 0;
            END
        SELECT FIRST 1 UNAR_FACCAN FROM unidad_articulo WHERE ARTI_COD = :articulo INTO :factcant;
        ALTERNATIVAS = FLOOR(CANT / factcant);
        PRINCIPALES = CANT - (alternativas * factcant);
        SUSPEND;
        END
    END
ELSE
    BEGIN
    FOR SELECT D.ARTI_COD, DVDE_CODBAR, SUBSTR(DVDE_DESC,1,60), DVDE_CANT, DVDE_UNIDAD, BODE_COD, DVDE_LOTE, DVDE_PRUNIT, DVDE_DTOPORC, DVDE_DTOMONTO, DVDE_IVAPORC, DVDE_IVAMONTO, DVDE_CONSUMO, DVDE_TOTAL, DVDE_REFERENCIA,
        GRUP_COD, SUBG_COD, MARC_COD, ARTI_PESO, ARTI_ANCHO, ARTI_ALTO, ARTI_LARGO, TAIV_COD, DVDE_OBS, DVDE_FACTOR
        FROM DEVOLUCIONES_VENTAS_DETALLE D, ARTICULO A
        WHERE D.ARTI_COD = A.ARTI_COD AND D.DEVT_ID = :ID
        ORDER BY DVDE_ITEM
        INTO :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :BODITEM, :LOTE, :PRUNIT, :DTOITPORC, :DTOITMONTO, :IVAPORC, :IVAITMONTO, :CONSUMO, :TOTAL, :REFITEM,
        :GRUPO, :SUBGRUPO, :MARCA, :PESO, :ANCHO, :ALTO, :LARGO, :TARIFA, :obsitem, :FACTOR
        DO
        BEGIN
        if (ARTICULO = CODBAR) then
            SELECT FIRST 1 COBA_COD FROM barras_articulo WHERE ARTI_COD = :articulo INTO :CODBAR;
        SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :GRUPO INTO NOMGRUPO;
        SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :MARCA INTO NOMMARCA;
        SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :SUBGRUPO AND GRUP_COD = :GRUPO INTO :NOMSUBG;
        ITEM = ITEM + 1;
        if (ICOINC = 'SI') then
            SUBTOTIT = TOTAL - IVAITMONTO;
        else
            SUBTOTIT = TOTAL - IVAITMONTO - CONSUMO;
        PRNETO = PRUNIT - DTOITMONTO;
        if (PESO IS NULL) then
            PESO = 0;
        PESO = PESO / 1000 * CANT * FACTOR;
        if (IMPTOS = 'S') then
            if (cant <> 0) then
                prnetosiniva = PRUNIT - DTOITMONTO - ((IVAITMONTO+CONSUMO) / CANT);
            else
                prnetosiniva = PRUNIT - DTOITMONTO;
        ELSE
            prnetosiniva = PRUNIT - DTOITMONTO;
        TOTCONSUMO = TOTCONSUMO + CONSUMO;
        if ((REFITEM <> '.t') or (REFITEM IS NULL)) then
            BEGIN
            /* NO SUME LOS ENSAMBLES */
            if (IVAPORC = 0) then
                SUMAEX = SUMAEX + TOTAL;
            if (TARIFA = 1) then
                BEGIN
                SUMA1 = SUMA1 + TOTAL - IVAITMONTO;
                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;
            END
        if (substr(ARTICULO,1,2) = '.t') then
            BEGIN
            REFITEM = '';
            TOTAL = 0;
            END
        factcant = NULL;
        SELECT FIRST 1 UNAR_FACCAN FROM unidad_articulo WHERE ARTI_COD = :articulo INTO :factcant;
        if ((factcant IS NULL) or (FACTCANT = 0)) then
            factcant = 1;
        ALTERNATIVAS = FLOOR(CANT / factcant);
        PRINCIPALES = CANT - (alternativas * factcant);
        SUSPEND;
        END
    END
END
^

SET TERM ; ^


/* 20090417 */
/* GRANT DE TRIGGER AI DE EGRESOS CRUCE */
GRANT UPDATE,REFERENCES ON EGRESOS_CRUCEC TO TRIGGER EGRESOS_CRUCEC_AI;
GRANT SELECT ON EGRESOS TO TRIGGER EGRESOS_CRUCEC_AI;
GRANT SELECT ON CLIENTE_SUCURSALES TO TRIGGER EGRESOS_CRUCEC_AI;
GRANT EXECUTE ON PROCEDURE SALDO_DOC_CARTERA TO TRIGGER EGRESOS_CRUCEC_AI;
GRANT EXECUTE ON PROCEDURE LEE_CONFIGURACION TO TRIGGER EGRESOS_CRUCEC_AI;
GRANT SELECT,INSERT,UPDATE ON SALDOS_DOC_CARTERA TO TRIGGER EGRESOS_CRUCEC_AI;
GRANT SELECT,INSERT,UPDATE ON MOVIMIENTO_CLIENTES TO TRIGGER EGRESOS_CRUCEC_AI;

/* 20090417B */
/* RETORNE EL CIERRE PARA CAMBIAR EL LAEL DE UTILIDAD O PERDIDA EN EST.RESULTADOS*/
SET TERM ^ ;

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

  IF (SIMULACIERRE = 'S') THEN
    if (CIERRE > 0) then
      BEGIN
      IF (CODIGO = SUBSTR(CTACIERREP, 1, DIG)) then
        DEBITOS = DEBITOS + CIERRE;
      END
    else
      BEGIN
      IF (CODIGO = SUBSTR(CTACIERREU, 1, DIG)) then
        CREDITOS = CREDITOS + (CIERRE * -1);
      END
  FINAL = INICIAL + DEBITOS - CREDITOS;
  SCLASE = 0;
  SGRUPO = 0;
  SSUBGRUPO = 0;
  SCUENTA = 0;
  MOVIMIEN = 0;
  if (NIVEL = 1) then
    BEGIN
    SCLASE = FINAL;
    MOVIMIEN = DEBITOS - CREDITOS;
    END
  if (NIVEL = 2) then
    SGRUPO = FINAL;
  if (NIVEL = 3) then
    SSUBGRUPO = FINAL;
  if (NIVEL > 3) then
    SCUENTA = FINAL;
  if ((SIN_MOV = 'S') or (FINAL <> 0) or (DEBITOS <> 0) or (CREDITOS <> 0))then
      SUSPEND;
  END
END
^

SET TERM ; ^

/* 20090417C */
/* el abono no debe incluir la dif en cambio */

SET TERM ^ ;

CREATE OR ALTER TRIGGER RECIBOS_CAJA_DETALLE_AI FOR RECIBOS_CAJA_DETALLE
ACTIVE AFTER INSERT POSITION 0
AS
declare variable EXISTE CHAR(1);
declare variable FEC DATE;
declare variable NIT VARCHAR(20);
declare variable CONCEPTO VARCHAR(60);
declare variable PREFIJO VARCHAR(4);
declare variable NUMERO VARCHAR(6);
declare variable SALDO NUMERIC(18,2);
declare variable RETES CHAR(2);
declare variable OK CHAR(1);
declare variable RCANTI INTEGER;
declare variable COBR INTEGER;
declare variable ACUMULA CHAR(2);
declare variable DIASMAX INTEGER;
declare variable FACTOR NUMERIC(9,4);
declare variable FACTORD NUMERIC(9,4);
declare variable DIAS INTEGER;
declare variable FECDOC DATE;
declare variable TRM NUMERIC(18,2);
BEGIN
if ((NEW.RECA_ID <> 0) and (new.rcde_anulado = 'N')) then
    BEGIN
    /* Abone el documento referenciado */
    select PREF_PRE, RECA_NUMERO, RECA_fecha, RECA_CONC, TERC_NIT, COBR_COD, RECA_TRM from RECIBOS_CAJA
        where RECA_id = new.RECA_id into :PREFIJO, :NUMERO, :FEC, :CONCEPTO, :NIT, :COBR, :TRM;
    OK = 'N';
    if (new.RCDE_TIPODOC = 45) then
        BEGIN
        /* BUSQUE SI TIENE RECA_ID, SI NO LO ACTUALIZA */
        SELECT RECA_ID FROM ANTICIPOS_CLIENTE WHERE ANCL_ID = NEW.RCDE_IDDOC INTO :RCANTI;
        if (RCANTI = 0) then
            BEGIN
            OK = 'S';
            UPDATE ANTICIPOS_CLIENTE SET RECA_ID = NEW.RECA_ID WHERE ANCL_ID = NEW.RCDE_IDDOC;
            END
        END
    if (OK = 'N') then
        BEGIN
        /* valide que no se pase del saldo */
        execute procedure saldo_doc_cartera(new.rcde_tipodoc, new.rcde_iddoc, '9999/12/31', 0) returning_values(saldo);
        execute procedure lee_configuracion('CARTERA', 'SALDOS', 'DESCONTAR RETENCIONES POR CAUSACION') returning_values (RETES);
        if (SALDO < 0) then
            BEGIN
            if (RETES = 'SI') then
                begin
                if (saldo > (NEW.rcde_abono + NEW.rcde_dtof)) then
                    EXCEPTION DOCUMENTO_ABONO_MAYOR 'EL SALDO DEL DOCUMENTO ' || NEW.rcde_prefijo || NEW.rcde_numero || ' ES INSUFICIENTE.';
                end
            ELSE
                begin
                if (saldo > (NEW.rcde_abono + NEW.rcde_rtfte + NEW.rcde_rtiva + NEW.rcde_rtica + NEW.rcde_dtof)) then
                    EXCEPTION DOCUMENTO_ABONO_MAYOR 'EL SALDO DEL DOCUMENTO ' || NEW.rcde_prefijo || NEW.rcde_numero || ' ES INSUFICIENTE.';
                end
            END
        else
            BEGIN
            if (RETES = 'SI') then
                begin
                if (saldo < (NEW.rcde_abono + NEW.rcde_dtof)) then
                    EXCEPTION DOCUMENTO_ABONO_MAYOR 'EL SALDO DEL DOCUMENTO ' || NEW.rcde_prefijo || NEW.rcde_numero || ' ES INSUFICIENTE.';
                end
            ELSE
                begin
                if (saldo < (NEW.rcde_abono + NEW.rcde_rtfte + NEW.rcde_rtiva + NEW.rcde_rtica + NEW.rcde_dtof)) then
                    EXCEPTION DOCUMENTO_ABONO_MAYOR 'EL SALDO DEL DOCUMENTO ' || NEW.rcde_prefijo || NEW.rcde_numero || ' ES INSUFICIENTE.';
                end
            END
        EXISTE = 'N';
        select 'S' from saldos_doc_cartera where sdca_tiporef = new.rcde_tipodoc and sdca_idref = new.rcde_iddoc and sdca_fecha = :FEC into :EXISTE;
        if (Existe = 'S') then
            begin
            /* actualice el saldo del dia */
            UPDATE saldos_doc_cartera
                SET SDCA_ABONO = SDCA_ABONO + NEW.rcde_abono + new.rcde_dtof,
                SDCA_ABRTFTE = SDCA_ABRTFTE + NEW.rcde_RTFTE,
                SDCA_ABRTIVA = SDCA_ABRTIVA + NEW.rcde_RTIVA,
                SDCA_ABRTICA = SDCA_ABRTICA + NEW.rcde_RTICA,
                SDCA_TRM = :TRM
                WHERE SDCA_TIPOREF = NEW.RCDE_TIPODOC AND SDCA_IDREF = NEW.rcde_IDDOC AND SDCA_FECHA = :FEC;
            END
        ELSE
            BEGIN
            /* Inserte un nuevo saldo diario */
            INSERT INTO SALDOS_DOC_CARTERA (SDCA_TIPOREF, SDCA_IDREF, SDCA_FECHA, TERC_NIT, SDCA_RTFTE, SDCA_RTIVA, SDCA_RTICA, SDCA_ABONO, SDCA_ABRTFTE, SDCA_ABRTIVA, SDCA_ABRTICA, SDCA_DEBITO, SDCA_MONTO, SDCA_TRM)
                VALUES (NEW.RCDE_TIPODOC, NEW.RCDE_IDDOC, :FEC, :NIT, 0, 0, 0, (NEW.rcde_abono+NEW.rcde_dtof), NEW.rcde_rtfte, NEW.rcde_rtiva, NEW.rcde_rtica, 'N', 0, :TRM);
            END
        END
    /* actualice el registro en mov_cliente (por si son varios items) */
    EXISTE = 'N';
    SELECT 'S' FROM MOVIMIENTO_CLIENTES WHERE MVCL_TIPOREF = 61 AND MVCL_IDREF = NEW.RECA_ID AND MVCL_SUCURSAL = NEW.rcde_sucursal INTO :EXISTE;
    if (EXISTE = 'S') then
        begin
        UPDATE movimiento_clientes
            SET MVCL_MONTO = MVCL_MONTO + NEW.rcde_abono + NEW.rcde_dtof,
                MVCL_RTEFTE = MVCL_RTEFTE + NEW.rcde_rtfte,
                MVCL_RTEIVA = MVCL_RTEIVA + NEW.rcde_rtiva,
                MVCL_RTEICA = MVCL_RTEICA + NEW.rcde_rtica,
                MVCL_TRM = :TRM
            WHERE MVCL_TIPOREF = 61 AND MVCL_IDREF = NEW.RECA_ID AND MVCL_SUCURSAL = NEW.rcde_sucursal;
        end
    ELSE
        INSERT INTO MOVIMIENTO_CLIENTES (MVCL_ID, TERC_NIT, MVCL_TIPOREF, MVCL_IDREF, MVCL_FECHA, MVCL_VENCE, MVCL_CONC, MVCL_MONTO, MVCL_RTEFTE, MVCL_RTEIVA, MVCL_RTEICA, MVCL_DEBITO, MVCL_ABONO, MVCL_PREFREF, MVCL_NUMREF, MVCL_SUCURSAL, COBR_COD, MVCL_TRM)
            VALUES (GEN_ID(ID_MOVCLI, 1), :NIT, 61, NEW.RECA_ID, :FEC, :FEC, :CONCEPTO, (NEW.RCDE_ABONO+NEW.RCDE_DTOF), NEW.RCDE_RTFTE, NEW.RCDE_RTIVA, NEW.RCDE_RTICA, 'N', 'S', :PREFIJO, :NUMERO, NEW.rcde_sucursal, :COBR, :TRM);

    /* acumule los puntos del vendedor */
    SELECT MVCL_FECHA FROM MOVIMIENTO_CLIENTES WHERE MVCL_TIPOREF = new.rcde_tipodoc AND MVCL_IDREF = new.rcde_iddoc
        INTO :FECDOC;
    if (FECDOC IS NOT NULL) then
        DIAS = FEC - FECDOC;
    else
        DIAS = 999;
    execute procedure lee_configuracion('FACTURACION', 'FACTURAS', 'ACUMULAR PUNTOS DE VENTAS POR VENDEDOR') returning_values (ACUMULA);
    execute procedure lee_configuracion('FACTURACION', 'FACTURAS', 'DIAS DE RECAUDO MAXIMO PARA ACUMULAR PUNTOS AL VENDEDOR') returning_values (DIASMAX);
    if ((acumula = 'SI') and (diasmax >= dias)) then
        begin
        SELECT COPU_FACTOR FROM comisiones_puntos WHERE COPU_COD = NEW.rcde_comip INTO :FACTOR;
        if ((NEW.rcde_tipodoc = 31) or (NEW.rcde_tipodoc = 41)) then
            begin
            /* recorra la factura acumulando los puntos */
            if (new.rcde_tipodoc = 31) then
                select (fact_total-fact_ivamonto)/fact_total from facturas where fact_id = new.rcde_iddoc into :factord;
            if (new.rcde_tipodoc = 41) then
                select ndcl_monto/(ndcl_monto+ndcl_ivamonto) from notas_debito_clientes where ndcl_id = new.rcde_iddoc into :factord;
            /* inserte el registro de puntos */
            insert into puntos_vendedor (vend_cod, ptvt_fecha, ptvt_tipodoc, ptvt_iddoc, ptvt_db, ptvt_cr)
                values (:cobr, :fec, new.rcde_tipodoc, new.rcde_iddoc, (new.rcde_abono*:factord*:factor), 0);
            end
        if ((new.rcde_tipodoc = 33) or (new.rcde_tipodoc = 42)) then
            begin
            if (new.rcde_tipodoc = 33) then
                select (devt_total-devt_ivamonto)/devt_total from devoluciones_ventas where devt_id = new.rcde_iddoc into :factord;
            if (new.rcde_tipodoc = 42) then
                select nccl_monto/(nccl_monto+nccl_ivamonto) from notas_credito_clientes where nccl_id = new.rcde_iddoc into :factord;
            /* inserte el registro de puntos */
            insert into puntos_vendedor (vend_cod, ptvt_fecha, ptvt_tipodoc, ptvt_iddoc, ptvt_db, ptvt_cr)
                values (:cobr, :fec, new.rcde_tipodoc, new.rcde_iddoc, 0, (new.rcde_abono*:factord*:factor));
            end
        end
    end
END
^

SET TERM ; ^


SET TERM ^ ;

CREATE OR ALTER TRIGGER RECIBOS_CAJA_PAGO_BI FOR RECIBOS_CAJA_PAGO
ACTIVE BEFORE INSERT POSITION 0
as
declare variable CAJA INTEGER;
declare variable NUMROWS INTEGER;
declare variable PREGTASA CHAR(2);
declare variable TRM NUMERIC(18,2);
begin
/* SI TRM <> 1 CONVIERTA A PESOS LOS VALORES */
EXECUTE PROCEDURE LEE_CONFIGURACION('GENERAL', 'GENERAL', 'PREGUNTAR TASA DE CAMBIO EN DOCUMENTOS DE CARTERA') returning_values (:pregtasa);
if (PREGTASA = 'SI') then
    BEGIN
    SELECT RECA_TRM FROM recibos_caja WHERE RECA_ID = NEW.reca_id INTO :TRM;
    NEW.rcpa_monto = NEW.rcpa_monto * :trm;
    END
/* NO PERMITA UNA FORMA DE PAGO REPETIDA */
if (NEW.fopa_id <> 1) then
    BEGIN
    SELECT CAJA_ID FROM recibos_caja WHERE RECA_ID = NEW.reca_id INTO :CAJA;
    SELECT COUNT(*) FROM documentos_pago_caja WHERE caja_id = :CAJA AND fopa_id = new.fopa_id and dpca_banco = NEW.rcpa_banco AND
        dpca_cuenta = NEW.rcpa_cuenta AND dpca_numero = NEW.rcpa_numero AND dpca_tiposal = 0 and dpca_idsal = 0
        INTO :NUMROWS;
    if (numrows > 0) then
        exception documento_pago_salido 'La forma de pago ' || new.rcpa_banco || ' ' || new.rcpa_cuenta || ' ' || new.rcpa_numero || ' ya existe en la caja.';
    END
end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER RECIBOS_CAJA_DETALLE_AU FOR RECIBOS_CAJA_DETALLE
ACTIVE AFTER UPDATE POSITION 0
AS
declare variable EXISTE CHAR(1);
declare variable FEC DATE;
declare variable NIT VARCHAR(20);
declare variable CONCEPTO VARCHAR(60);
declare variable PREFIJO VARCHAR(4);
declare variable NUMERO VARCHAR(6);
declare variable SALDO NUMERIC(18,2);
declare variable RETES char(2);
declare variable OK CHAR(1);
declare variable RCANTI INTEGER;
declare variable COBR INTEGER;
declare variable ACUMULA CHAR(2);
declare variable DIASMAX INTEGER;
declare variable FACTOR NUMERIC(9,4);
declare variable FACTORD NUMERIC(9,4);
declare variable DIAS INTEGER;
declare variable FECDOC DATE;
declare variable TRM NUMERIC(18,2);
BEGIN
execute procedure lee_configuracion('FACTURACION', 'FACTURAS', 'ACUMULAR PUNTOS DE VENTAS POR VENDEDOR') returning_values (ACUMULA);
select PREF_PRE, RECA_NUMERO, reca_fecha, RECA_CONC, TERC_NIT, COBR_COD, RECA_TRM
    from recibos_caja where reca_id = new.reca_id
    into :PREFIJO, :NUMERO, :FEC, :CONCEPTO, :NIT, :COBR, :TRM;
/* Borre el viejo */
if ((old.RECA_ID <> 0) AND (OLD.rcde_anulado = 'N')) then
    BEGIN
    OK = 'N';
    if (OLD.RCDE_TIPODOC = 45) then
        BEGIN
        SELECT RECA_ID FROM ANTICIPOS_CLIENTE WHERE ANCL_ID = OLD.RCDE_IDDOC INTO :RCANTI;
        if (RCANTI = OLD.RECA_ID) then
            begin
            OK = 'S';
            if (NEW.rcde_anulado = 'N') then
                delete from anticipos_cliente where ANCL_ID = OLD.RCDE_IDDOC;
            else
                UPDATE anticipos_cliente SET ANCL_ANULADO = 'S' where ANCL_ID = OLD.RCDE_IDDOC;
            end
        END
    if (OK = 'N') then
        BEGIN
        UPDATE saldos_doc_cartera
            SET SDCA_ABONO = SDCA_ABONO - old.rcde_abono - OLD.RCDE_DTOF,
            SDCA_ABRTFTE = SDCA_ABRTFTE - old.rcde_RTFTE,
            SDCA_ABRTIVA = SDCA_ABRTIVA - old.rcde_RTIVA,
            SDCA_ABRTICA = SDCA_ABRTICA - old.rcde_RTICA
            WHERE SDCA_TIPOREF = old.RCDE_TIPODOC AND SDCA_IDREF = old.rcde_IDDOC AND SDCA_FECHA = :FEC;
        END
    UPDATE movimiento_clientes
        SET MVCL_MONTO = MVCL_MONTO - OLD.rcde_abono - OLD.RCDE_DTOF,
        MVCL_RTEFTE = MVCL_RTEFTE - OLD.rcde_rtfte,
        MVCL_RTEIVA = MVCL_RTEIVA - OLD.rcde_rtiva,
        MVCL_RTEICA = MVCL_RTEICA - OLD.rcde_rtica
        WHERE MVCL_TIPOREF = 61 AND MVCL_IDREF = OLD.RECA_ID;

    /* DESHAGA LOS PUNTOS DEL VENDEDOR */
    if (acumula = 'SI') then
        delete from puntos_vendedor where vend_cod = :cobr and ptvt_tipodoc = old.rcde_tipodoc and ptvt_iddoc = old.rcde_iddoc and ptvt_fecha = :fec;
    END
if ((NEW.RECA_ID <> 0) and (NEW.rcde_anulado = 'N')) then
    BEGIN
    OK = 'N';
    if (new.RCDE_TIPODOC = 45) then
        BEGIN
        /* BUSQUE SI TIENE RECA_ID, SI NO LO ACTUALIZA */
        SELECT RECA_ID FROM ANTICIPOS_CLIENTE WHERE ANCL_ID = NEW.RCDE_IDDOC INTO :RCANTI;
        if (RCANTI = 0) then
            BEGIN
            OK = 'S';
            UPDATE ANTICIPOS_CLIENTE SET RECA_ID = NEW.RECA_ID WHERE ANCL_ID = NEW.RCDE_IDDOC;
            END
        END
    if (OK = 'N') then
        BEGIN
        /* valide que no se pase del saldo */
        execute procedure saldo_doc_cartera(new.rcde_tipodoc, new.rcde_iddoc, '9999/12/31', 0) returning_values(saldo);
        execute procedure lee_configuracion('CARTERA', 'SALDOS', 'DESCONTAR RETENCIONES POR CAUSACION') returning_values (RETES);
        if (SALDO < 0) then
            BEGIN
            if (RETES = 'SI') then
                begin
                if (saldo > (NEW.rcde_abono + NEW.rcde_dtof)) then
                    EXCEPTION DOCUMENTO_ABONO_MAYOR 'EL SALDO DEL DOCUMENTO ' || NEW.rcde_prefijo || NEW.rcde_numero || ' ES INSUFICIENTE.';
                end
            ELSE
                begin
                if (saldo > (NEW.rcde_abono + NEW.rcde_rtfte + NEW.rcde_rtiva + NEW.rcde_rtica + NEW.rcde_dtof)) then
                    EXCEPTION DOCUMENTO_ABONO_MAYOR 'EL SALDO DEL DOCUMENTO ' || NEW.rcde_prefijo || NEW.rcde_numero || ' ES INSUFICIENTE.';
                end
            END
        else
            BEGIN
            if (RETES = 'SI') then
                begin
                if (saldo < (NEW.rcde_abono + NEW.rcde_dtof)) then
                    EXCEPTION DOCUMENTO_ABONO_MAYOR 'EL SALDO DEL DOCUMENTO ' || NEW.rcde_prefijo || NEW.rcde_numero || ' ES INSUFICIENTE.';
                end
            ELSE
                begin
                if (saldo < (NEW.rcde_abono + NEW.rcde_rtfte + NEW.rcde_rtiva + NEW.rcde_rtica + NEW.rcde_dtof)) then
                    EXCEPTION DOCUMENTO_ABONO_MAYOR 'EL SALDO DEL DOCUMENTO ' || NEW.rcde_prefijo || NEW.rcde_numero || ' ES INSUFICIENTE.';
                end
            END
        select 'S' from saldos_doc_cartera where sdca_tiporef = new.rcde_tipodoc and sdca_idref = new.rcde_iddoc and sdca_fecha = :FEC into :EXISTE;
        if (Existe = 'S') then
            /* actualice el saldo del dia */
            UPDATE saldos_doc_cartera
                SET SDCA_ABONO = SDCA_ABONO + NEW.rcde_abono + NEW.RCDE_DTOF,
                    SDCA_ABRTFTE = SDCA_ABRTFTE + NEW.rcde_RTFTE,
                    SDCA_ABRTIVA = SDCA_ABRTIVA + NEW.rcde_RTIVA,
                    SDCA_ABRTICA = SDCA_ABRTICA + NEW.rcde_RTICA,
                    SDCA_TRM = :TRM
                WHERE SDCA_TIPOREF = NEW.RCDE_TIPODOC AND SDCA_IDREF = NEW.rcde_IDDOC AND SDCA_FECHA = :FEC;
        ELSE
            /* Inserte un nuevo saldo diario */
            INSERT INTO SALDOS_DOC_CARTERA (SDCA_TIPOREF, SDCA_IDREF, SDCA_FECHA, TERC_NIT, SDCA_RTFTE, SDCA_RTIVA, SDCA_RTICA, SDCA_ABONO, SDCA_ABRTFTE, SDCA_ABRTIVA, SDCA_ABRTICA, SDCA_DEBITO, SDCA_MONTO, SDCA_TRM)
                VALUES (NEW.RCDE_TIPODOC, NEW.RCDE_IDDOC, :FEC, :NIT, 0, 0, 0, (NEW.rcde_abono+NEW.RCDE_DTOF), NEW.rcde_rtfte, NEW.rcde_rtiva, NEW.rcde_rtica, 'N', 0, :TRM);
        END /* OK = N */
    /* Registre o actualice el registro en movimiento_cliente */
    EXISTE = 'N';
    SELECT 'S' FROM MOVIMIENTO_CLIENTES WHERE MVCL_TIPOREF = 61 AND MVCL_IDREF = NEW.RECA_ID and mvcl_sucursal = new.rcde_sucursal INTO :EXISTE;
    if (EXISTE = 'S') then
        begin
        /* Actualice el nuevo */
        UPDATE movimiento_clientes
            SET MVCL_MONTO = MVCL_MONTO + NEW.rcde_abono + NEW.rcde_dtof,
                MVCL_RTEFTE = MVCL_RTEFTE + NEW.rcde_rtfte,
                MVCL_RTEIVA = MVCL_RTEIVA + NEW.rcde_rtiva,
                MVCL_RTEICA = MVCL_RTEICA + NEW.rcde_rtica,
                MVCL_TRM = :TRM
            WHERE MVCL_TIPOREF = 61 AND MVCL_IDREF = NEW.RECA_ID AND MVCL_SUCURSAL = NEW.rcde_sucursal;
        end
    ELSE
        INSERT INTO MOVIMIENTO_CLIENTES (MVCL_ID, TERC_NIT, MVCL_TIPOREF, MVCL_IDREF, MVCL_FECHA, MVCL_VENCE, MVCL_CONC, MVCL_MONTO, MVCL_RTEFTE, MVCL_RTEIVA, MVCL_RTEICA, MVCL_DEBITO, MVCL_ABONO, MVCL_PREFREF, MVCL_NUMREF, MVCL_SUCURSAL, COBR_COD, MVCL_TRM)
            VALUES (GEN_ID(ID_MOVCLI, 1), :NIT, 61, NEW.RECA_ID, :FEC, :FEC, :CONCEPTO, (NEW.RCDE_ABONO+NEW.RCDE_DTOF), NEW.RCDE_RTFTE, NEW.RCDE_RTIVA, NEW.RCDE_RTICA, 'N', 'S', :PREFIJO, :NUMERO, NEW.rcde_sucursal, :COBR, :TRM);

    /* acumule los puntos del vendedor */
    SELECT MVCL_FECHA FROM MOVIMIENTO_CLIENTES WHERE MVCL_TIPOREF = new.rcde_tipodoc AND MVCL_IDREF = new.rcde_iddoc
        INTO :FECDOC;
    if (FECDOC IS NOT NULL) then
        DIAS = FEC - FECDOC;
    else
        DIAS = 999;
    execute procedure lee_configuracion('FACTURACION', 'FACTURAS', 'DIAS DE RECAUDO MAXIMO PARA ACUMULAR PUNTOS AL VENDEDOR') returning_values (DIASMAX);
    if ((acumula = 'SI') and (diasmax >= dias)) then
        begin
        SELECT COPU_FACTOR FROM comisiones_puntos WHERE COPU_COD = NEW.rcde_comip INTO :FACTOR;
        if ((NEW.rcde_tipodoc = 31) or (NEW.rcde_tipodoc = 41)) then
            begin
            /* recorra la factura acumulando los puntos */
            if (new.rcde_tipodoc = 31) then
                select (fact_total-fact_ivamonto)/fact_total from facturas where fact_id = new.rcde_iddoc into :factord;
            if (new.rcde_tipodoc = 41) then
                select ndcl_monto/(ndcl_monto+ndcl_ivamonto) from notas_debito_clientes where ndcl_id = new.rcde_iddoc into :factord;
            /* inserte el registro de puntos */
            insert into puntos_vendedor (vend_cod, ptvt_fecha, ptvt_tipodoc, ptvt_iddoc, ptvt_db, ptvt_cr)
                values (:cobr, :fec, new.rcde_tipodoc, new.rcde_iddoc, (new.rcde_abono*:factord*:factor), 0);
            end
        if ((new.rcde_tipodoc = 33) or (new.rcde_tipodoc = 42)) then
            begin
            if (new.rcde_tipodoc = 33) then
                select (devt_total-devt_ivamonto)/devt_total from devoluciones_ventas where devt_id = new.rcde_iddoc into :factord;
            if (new.rcde_tipodoc = 42) then
                select nccl_monto/(nccl_monto+nccl_ivamonto) from notas_credito_clientes where nccl_id = new.rcde_iddoc into :factord;
            /* inserte el registro de puntos */
            insert into puntos_vendedor (vend_cod, ptvt_fecha, ptvt_tipodoc, ptvt_iddoc, ptvt_db, ptvt_cr)
                values (:cobr, :fec, new.rcde_tipodoc, new.rcde_iddoc, 0, (new.rcde_abono*:factord*:factor));
            end
        end
    END /* NUEVO */
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER RECIBOS_CAJA_DETALLE_AD FOR RECIBOS_CAJA_DETALLE
ACTIVE AFTER DELETE POSITION 0
AS
declare variable FEC DATE;
declare variable OK CHAR(1);
declare variable RCANTI INTEGER;
declare variable ACUMULA CHAR(2);
declare variable COBR INTEGER;
BEGIN
if (old.RECA_ID <> 0) then
    BEGIN
    execute procedure lee_configuracion('FACTURACION', 'FACTURAS', 'ACUMULAR PUNTOS DE VENTAS POR VENDEDOR') returning_values (ACUMULA);
    select reca_fecha, COBR_COD from recibos_caja where reca_id = OLD.reca_id into :FEC, :COBR;
    OK = 'N';
    if (OLD.RCDE_TIPODOC = 45) then
        BEGIN
        SELECT RECA_ID FROM ANTICIPOS_CLIENTE WHERE ANCL_ID = OLD.RCDE_IDDOC INTO :RCANTI;
        if (RCANTI = OLD.RECA_ID) then
            begin
            OK = 'S';
            delete from anticipos_cliente where ANCL_ID = OLD.RCDE_IDDOC;
            end
        END
    if (OLD.rcde_anulado = 'N') then
     begin
       if (OK = 'N') then
        BEGIN
        UPDATE saldos_doc_cartera
            SET SDCA_ABONO = SDCA_ABONO - old.rcde_abono - OLD.RCDE_DTOF,
            SDCA_ABRTFTE = SDCA_ABRTFTE - old.rcde_RTFTE,
            SDCA_ABRTIVA = SDCA_ABRTIVA - old.rcde_RTIVA,
            SDCA_ABRTICA = SDCA_ABRTICA - old.rcde_RTICA
            WHERE SDCA_TIPOREF = old.RCDE_TIPODOC AND SDCA_IDREF = old.rcde_IDDOC AND SDCA_FECHA = :FEC;
        END
       UPDATE movimiento_clientes
        SET MVCL_MONTO = MVCL_MONTO - OLD.rcde_abono - OLD.RCDE_DTOF,
        MVCL_RTEFTE = MVCL_RTEFTE - OLD.rcde_rtfte,
        MVCL_RTEIVA = MVCL_RTEIVA - OLD.rcde_rtiva,
        MVCL_RTEICA = MVCL_RTEICA - OLD.rcde_rtica
        WHERE MVCL_TIPOREF = 61 AND MVCL_IDREF = OLD.RECA_ID and MVCL_SUCURSAL = OLD.rcde_sucursal;
     end
    /* DESHAGA LOS PUNTOS DEL VENDEDOR */
    if (acumula = 'SI') then
        delete from puntos_vendedor where vend_cod = :cobr and ptvt_tipodoc = old.rcde_tipodoc and ptvt_iddoc = old.rcde_iddoc and ptvt_fecha = :fec;
    END
END
^

SET TERM ; ^

SET TERM ^ ;

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

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

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

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

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

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

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

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

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER RECIBOS_CAJA_BI FOR RECIBOS_CAJA
ACTIVE BEFORE INSERT POSITION 0
AS
declare variable NUMERO VARCHAR(6);
declare variable AUTOM CHAR(1);
declare variable EXISTE CHAR(1);
declare variable PREGTASA CHAR(2);
BEGIN
if ((NEW.reca_trm IS NULL) or (new.reca_trm = 0))  then
    NEW.reca_trm = 1;
EXECUTE PROCEDURE LEE_CONFIGURACION('GENERAL', 'GENERAL', 'PREGUNTAR TASA DE CAMBIO EN DOCUMENTOS DE CARTERA') returning_values (:pregtasa);
if (PREGTASA = 'SI') then
    BEGIN
    NEW.reca_monto = NEW.reca_monto * NEW.reca_trm;
    NEW.reca_rtftemonto = NEW.reca_rtftemonto * NEW.reca_trm;
    NEW.reca_rtivamonto = NEW.reca_rtivamonto * NEW.reca_trm;
    NEW.reca_rticamonto = NEW.reca_rticamonto * NEW.reca_trm;
    NEW.reca_dtof = NEW.reca_dtof * NEW.reca_trm;
    NEW.reca_exedente = NEW.reca_exedente * NEW.reca_trm;
    end
if (NEW.numok = 'N') then
  BEGIN
  /* Actualice el contador del prefijo */
  SELECT PREF_ACTUAL, PREF_AUTO FROM PREFIJOS WHERE TIDO_COD = 61 AND PREF_PRE = NEW.PREF_PRE INTO :NUMERO, :AUTOM;
  /* ACTUALICE EL NUMERO EN EL_ENCABEZADO  */
  if (AUTOM = 'S') then
    BEGIN
    NEW.RECA_NUMERO = NUMERO;
    NUMERO = CAST((CAST(NUMERO AS INTEGER) + 1) AS CHAR(6));
    UPDATE PREFIJOS
      SET PREF_ACTUAL = :NUMERO
    WHERE TIDO_COD = 61 AND PREF_PRE = NEW.PREF_PRE;
    END
  ELSE
    BEGIN
    if (CAST(NUMERO AS INTEGER) = CAST(NEW.RECA_NUMERO AS INTEGER)) then
        UPDATE PREFIJOS
          SET PREF_ACTUAL = CAST((CAST(PREF_ACTUAL AS INTEGER) + 1) AS CHAR(6))
        WHERE TIDO_COD = 61 AND PREF_PRE = NEW.PREF_PRE;
    END
  EXECUTE PROCEDURE COMPLETA_CEROS (NEW.RECA_numero) returning_values (NEW.RECA_numero);
  NEW.numok = 'S';
  END
/* Verifique que el numero no existe previamente */
EXISTE = 'N';
SELECT 'S' FROM RECIBOS_CAJA WHERE PREF_PRE = NEW.PREF_PRE AND RECA_NUMERO = NEW.RECA_NUMERO INTO :EXISTE;
if (EXISTE = 'S') then
    EXCEPTION DOCUMENTO_REGISTRADO 'Ya existe un recibo de caja con el número ' || new.pref_pre || new.reca_numero;
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER EGRESOS_BI FOR EGRESOS
ACTIVE BEFORE INSERT POSITION 0
AS
declare variable NUMERO VARCHAR(6);
declare variable AUTOM CHAR(1);
declare variable EXISTE CHAR(1);
declare variable PREGTASA CHAR(2);
BEGIN
if ((new.egre_trm is null) or (new.egre_trm = 0)) then
    new.egre_trm = 1;
EXECUTE PROCEDURE LEE_CONFIGURACION('GENERAL', 'GENERAL', 'PREGUNTAR TASA DE CAMBIO EN DOCUMENTOS DE CUENTAS POR PAGAR') returning_values (:pregtasa);
if (PREGTASA = 'SI') then
    BEGIN
    NEW.egre_monto = NEW.egre_monto * NEW.egre_trm;
    NEW.egre_rtftemonto = NEW.egre_rtftemonto * NEW.egre_trm;
    NEW.egre_rtivamonto = NEW.egre_rtivamonto * NEW.egre_trm;
    NEW.egre_rticamonto = NEW.egre_rticamonto * NEW.egre_trm;
    NEW.egre_dtof = NEW.egre_dtof * NEW.egre_trm;
    end
if (NEW.numok = 'N') then
  BEGIN
  /* Actualice el contador del prefijo */
  SELECT PREF_ACTUAL, PREF_AUTO FROM PREFIJOS WHERE TIDO_COD = 62 AND PREF_PRE = NEW.PREF_PRE INTO :NUMERO, :AUTOM;
  /* ACTUALICE EL NUMERO EN COMPROBANTE_ENCABEZADO  */
  if (AUTOM = 'S') then
    BEGIN
    NEW.EGRE_NUMERO = NUMERO;
    NUMERO = CAST((CAST(NUMERO AS INTEGER) + 1) AS CHAR(6));
    UPDATE PREFIJOS
      SET PREF_ACTUAL = :NUMERO
    WHERE TIDO_COD = 62 AND PREF_PRE = NEW.PREF_PRE;
    END
  ELSE
    BEGIN
    if (CAST(NUMERO AS INTEGER) = CAST(NEW.EGRE_NUMERO AS INTEGER)) then
        UPDATE PREFIJOS
          SET PREF_ACTUAL = CAST((CAST(PREF_ACTUAL AS INTEGER) + 1) AS CHAR(6))
        WHERE TIDO_COD = 62 AND PREF_PRE = NEW.PREF_PRE;
    END
  EXECUTE PROCEDURE COMPLETA_CEROS (NEW.EGRE_numero) returning_values (NEW.EGRE_numero);
  NEW.numok = 'S';
  END
/* Verifique que el numero no existe previamente */
EXISTE = 'N';
SELECT 'S' FROM EGRESOS WHERE PREF_PRE = NEW.PREF_PRE AND EGRE_NUMERO = NEW.EGRE_NUMERO INTO :EXISTE;
if (EXISTE = 'S') then
    EXCEPTION DOCUMENTO_REGISTRADO 'Ya existe un egreso con el número ' || new.pref_pre || new.egre_numero;
if (new.cleg_id is null) then
    new.cleg_id = 0;
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER EGRESOS_DETALLE_AI FOR EGRESOS_DETALLE
ACTIVE AFTER INSERT POSITION 0
AS
declare variable EXISTE CHAR(1);
declare variable FEC DATE;
declare variable CONC VARCHAR(60);
declare variable NIT VARCHAR(20);
declare variable CONCEPTO VARCHAR(60);
declare variable PREFIJO VARCHAR(4);
declare variable NUMERO VARCHAR(6);
declare variable OK CHAR(1);
declare variable EGANTI INTEGER;
declare variable RETES CHAR(2);
declare variable SALDO NUMERIC(18,2);
declare variable TRM NUMERIC(18,2);
BEGIN
/* Abone el documento referenciado en EGRESOS_DETALLE */
select PREF_PRE, EGRE_NUMERO, EGRE_FECHA, EGRE_CONC, TERC_NIT, EGRE_TRM
    from EGRESOS where EGRE_ID = new.EGRE_ID into :PREFIJO, :NUMERO, :FEC, :CONCEPTO, :NIT, :TRM;
if ((NEW.EGRE_ID <> 0) and (new.egde_anulado = 'N')) then
    BEGIN
    OK = 'N';
    if (new.EGDE_TIPODOC = 55) then
        BEGIN
        /* BUSQUE SI TIENE EGRE_ID, SI NO LO ACTUALIZA */
        SELECT EGRE_ID FROM ANTICIPOS_PROVEEDOR WHERE ANPR_ID = NEW.EGDE_IDDOC INTO :EGANTI;
        if (EGANTI = 0) then
            BEGIN
            OK = 'S';
            UPDATE ANTICIPOS_PROVEEDOR SET EGRE_ID = NEW.EGRE_ID WHERE ANPR_ID = NEW.EGDE_IDDOC;
            END
        END
    /* valide que no se pase del saldo */
    execute procedure saldo_doc_cxpagar(new.egde_tipodoc, new.egde_iddoc, '9999/12/31', 0) returning_values(saldo);
    execute procedure lee_configuracion('CXPAGAR', 'SALDOS', 'DESCONTAR RETENCIONES POR CAUSACION') returning_values (RETES);
    if (SALDO < 0) then
        BEGIN
        if (RETES = 'SI') then
            begin
            if (saldo > (NEW.egde_abono+NEW.egde_dtof)) then
                EXCEPTION DOCUMENTO_ABONO_MAYOR 'EL SALDO DEL DOCUMENTO ' || NEW.egde_prefijo || NEW.egde_numero || ' ES INSUFICIENTE.';
            end
        ELSE
            begin
            if (saldo > (NEW.egde_abono + NEW.egde_rtfte + NEW.egde_rtiva + NEW.egde_rtica + new.egde_dtof)) then
                EXCEPTION DOCUMENTO_ABONO_MAYOR 'EL SALDO DEL DOCUMENTO ' || NEW.egde_prefijo || NEW.egde_numero || ' ES INSUFICIENTE.';
            end
        END
    else
        BEGIN
        if (RETES = 'SI') then
            begin
            if (saldo < (NEW.egde_abono + NEW.egde_dtof)) then
                EXCEPTION DOCUMENTO_ABONO_MAYOR 'EL SALDO DEL DOCUMENTO ' || NEW.egde_prefijo || NEW.egde_numero || ' ES INSUFICIENTE.';
            end
        ELSE
            begin
            if (saldo < (NEW.egde_abono + NEW.egde_rtfte + NEW.egde_rtiva + NEW.egde_rtica + NEW.egde_dtof)) then
                EXCEPTION DOCUMENTO_ABONO_MAYOR 'EL SALDO DEL DOCUMENTO ' || NEW.egde_prefijo || NEW.egde_numero || ' ES INSUFICIENTE.';
            end
        END
    if (OK = 'N') then
        BEGIN
        select 'S' from saldos_doc_cxpagar where sdcp_tiporef = new.egde_tipodoc and
            sdcp_idref = new.egde_iddoc and sdcp_fecha = :FEC into :EXISTE;
        if (Existe = 'S') then
            begin
            /* actualice el saldo del dia */
            UPDATE saldos_doc_cxpagar
                SET SDCP_ABONO = SDCP_ABONO + (NEW.egde_abono + NEW.egde_dtof),
                    SDCP_ABRTFTE = SDCP_ABRTFTE + NEW.egde_RTFTE,
                    SDCP_ABRTIVA = SDCP_ABRTIVA + NEW.egde_RTIVA,
                    SDCP_ABRTICA = SDCP_ABRTICA + NEW.egde_RTICA,
                    SDCP_TRM = :TRM
                WHERE SDCP_TIPOREF = NEW.EGDE_TIPODOC AND SDCP_IDREF = NEW.egde_IDDOC AND SDCP_FECHA = :FEC;
            END
        ELSE
            BEGIN
            /* Inserte un nuevo saldo diario */
            INSERT INTO SALDOS_DOC_CXPAGAR (SDCP_TIPOREF, SDCP_IDREF, SDCP_FECHA, TERC_NIT, SDCP_RTEFTE, SDCP_RTIVA, SDCP_RTICA, SDCP_ABONO, SDCP_ABRTFTE, SDCP_ABRTIVA, SDCP_ABRTICA, SDCP_DEBITO, SDCP_MONTO, SDCP_TRM)
                VALUES (NEW.EGDE_TIPODOC, NEW.EGDE_IDDOC, :FEC, :NIT, 0, 0, 0, (NEW.egde_abono+NEW.egde_dtof), NEW.egde_rtfte, NEW.egde_rtiva, NEW.egde_rtica, 'N', 0, :TRM);
            END
        END
    /* actualice el registro en mov_proveedor (por si son varios items) */
    EXISTE = 'N';
    SELECT 'S' FROM MOVIMIENTO_PROVEEDOR WHERE MVPR_TIPOREF = 62 AND MVPR_IDREF = NEW.EGRE_ID INTO :EXISTE;
    if (EXISTE = 'S') then
        begin
        UPDATE movimiento_proveedor
            SET MVPR_MONTO = MVPR_MONTO + (NEW.egde_abono + NEW.egde_dtof),
                MVPR_RTFTE = MVPR_RTFTE + NEW.egde_rtfte,
                MVPR_RTIVA = MVPR_RTIVA + NEW.egde_rtiva,
                MVPR_RTICA = MVPR_RTICA + NEW.egde_rtica,
                MVPR_TRM = :TRM
            WHERE MVPR_TIPOREF = 62 AND MVPR_IDREF = NEW.EGRE_ID;
        end
    ELSE
        INSERT INTO MOVIMIENTO_PROVEEDOR (MVPR_ID, TERC_NIT, MVPR_TIPOREF, MVPR_IDREF, MVPR_FECHA, MVPR_VENCE, MVPR_CONC, MVPR_MONTO, MVPR_RTFTE, MVPR_RTIVA, MVPR_RTICA, MVPR_DEBITO, MVPR_ABONO, MVPR_PREFIJO, MVPR_NUMERO, MVPR_TRM)
            VALUES (GEN_ID(ID_MOVPROV, 1), :NIT, 62, NEW.EGRE_ID, :FEC, :FEC, :CONCEPTO, (NEW.EGDE_ABONO+NEW.egde_dtof), NEW.EGDE_RTFTE, NEW.EGDE_RTIVA, NEW.EGDE_RTICA, 'N', 'S', :PREFIJO, :NUMERO, :TRM);
    END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER EGRESOS_DETALLE_AU FOR EGRESOS_DETALLE
ACTIVE AFTER UPDATE POSITION 0
AS
declare variable EXISTE CHAR(1);
declare variable FEC DATE;
declare variable NIT VARCHAR(20);
declare variable CONCEPTO VARCHAR(60);
declare variable PREFIJO VARCHAR(4);
declare variable NUMERO VARCHAR(6);
declare variable OK CHAR(1);
declare variable EGANTI INTEGER;
declare variable RETES CHAR(2);
declare variable SALDO NUMERIC(18,2);
declare variable TRM NUMERIC(18,2);
BEGIN
select PREF_PRE, EGRE_NUMERO, EGRE_FECHA, EGRE_CONC, TERC_NIT, EGRE_TRM from EGRESOS
    where egre_id = new.egre_id into :PREFIJO, :NUMERO, :FEC, :CONCEPTO, :NIT, :TRM;
if ((OLD.EGRE_ID <> 0) and (old.egde_anulado = 'N')) then
    BEGIN
    /* BORRE EL ANTICIPO SI FUE EL QUIEN LO CREO */
    OK = 'N';
    if (OLD.EGDE_TIPODOC = 55) then
        BEGIN
        SELECT EGRE_ID FROM ANTICIPOS_PROVEEDOR WHERE ANPR_ID = OLD.EGDE_IDDOC INTO :EGANTI;
        if (EGANTI = old.egre_id) then
            begin
            OK = 'S';
            UPDATE anticipos_proveedor SET ANPR_ANULADO = 'S' where ANPR_ID = OLD.EGDE_IDDOC;
            end
        END
    if (OK = 'N') then
        BEGIN
        EXISTE = 'N';
        select 'S' from saldos_doc_cxpagar where sdcp_tiporef = old.egde_tipodoc and
            sdcp_idref = old.egde_iddoc and sdcp_fecha = :FEC into :EXISTE;
        if (Existe = 'S') then
            begin
            /* Borre el viejo */
            if (old.EGRE_ID <> 0) then
                UPDATE saldos_doc_cxpagar
                    SET SDCP_ABONO = SDCP_ABONO - (old.egde_abono + OLD.egde_dtof),
                    SDCP_ABRTFTE = SDCP_ABRTFTE - old.egde_RTFTE,
                    SDCP_ABRTIVA = SDCP_ABRTIVA - old.egde_RTIVA,
                    SDCP_ABRTICA = SDCP_ABRTICA - old.egde_RTICA
                    WHERE SDCP_TIPOREF = OLD.EGDE_TIPODOC AND SDCP_IDREF = OLD.egde_IDDOC AND SDCP_FECHA = :FEC;
            end
        END
    EXISTE = 'N';
    SELECT 'S' FROM MOVIMIENTO_PROVEEDOR WHERE MVPR_TIPOREF = 62 AND MVPR_IDREF = OLD.EGRE_ID INTO :EXISTE;
    if (EXISTE = 'S') then
        begin
        /* Deshaga el viejo */
        UPDATE movimiento_proveedor
            SET MVPR_MONTO = MVPR_MONTO - (OLD.egde_abono + OLD.egde_dtof),
            MVPR_RTFTE = MVPR_RTFTE - OLD.egde_rtfte,
            MVPR_RTIVA = MVPR_RTIVA - OLD.egde_rtiva,
            MVPR_RTICA = MVPR_RTICA - OLD.egde_rtica
            WHERE MVPR_TIPOREF = 62 AND MVPR_IDREF = OLD.EGRE_ID;
        end
    END /* OLD.EGRE_ID <> 0 */
if ((NEW.EGRE_ID <> 0) and (NEW.egde_anulado = 'N')) then
    BEGIN
    /* valide que no se pase del saldo */
    execute procedure saldo_doc_cxpagar(new.egde_tipodoc, new.egde_iddoc, '9999/12/31', 0) returning_values(saldo);
    execute procedure lee_configuracion('CXPAGAR', 'SALDOS', 'DESCONTAR RETENCIONES POR CAUSACION') returning_values (RETES);
    if (SALDO < 0) then
        BEGIN
        if (RETES = 'SI') then
            begin
            if (saldo > (NEW.egde_abono + NEW.egde_dtof)) then
                EXCEPTION DOCUMENTO_ABONO_MAYOR 'EL SALDO DEL DOCUMENTO ' || NEW.egde_prefijo || NEW.egde_numero || ' ES INSUFICIENTE.';
            end
        ELSE
            begin
            if (saldo > (NEW.egde_abono + NEW.egde_rtfte + NEW.egde_rtiva + NEW.egde_rtica + new.egde_dtof)) then
                EXCEPTION DOCUMENTO_ABONO_MAYOR 'EL SALDO DEL DOCUMENTO ' || NEW.egde_prefijo || NEW.egde_numero || ' ES INSUFICIENTE.';
            end
        END
    else
        BEGIN
        if (RETES = 'SI') then
            begin
            if (saldo < (NEW.egde_abono + NEW.egde_dtof)) then
                EXCEPTION DOCUMENTO_ABONO_MAYOR 'EL SALDO DEL DOCUMENTO ' || NEW.egde_prefijo || NEW.egde_numero || ' ES INSUFICIENTE.';
            end
        ELSE
            begin
            if (saldo < (NEW.egde_abono + NEW.egde_rtfte + NEW.egde_rtiva + NEW.egde_rtica + NEW.egde_dtof)) then
                EXCEPTION DOCUMENTO_ABONO_MAYOR 'EL SALDO DEL DOCUMENTO ' || NEW.egde_prefijo || NEW.egde_numero || ' ES INSUFICIENTE.';
            end
        END
    /* AHORA REGISTRE LO NUEVO */
    OK = 'N';
    if (new.EGDE_TIPODOC = 55) then
        BEGIN
        /* BUSQUE SI TIENE EGRE_ID, SI NO LO ACTUALIZA */
        SELECT EGRE_ID FROM ANTICIPOS_PROVEEDOR WHERE ANPR_ID = NEW.EGDE_IDDOC INTO :EGANTI;
        if (EGANTI = 0) then
            BEGIN
            OK = 'S';
            UPDATE ANTICIPOS_PROVEEDOR SET EGRE_ID = NEW.EGRE_ID WHERE ANPR_ID = NEW.EGDE_IDDOC;
            END
        END
    if (OK = 'N') then
        BEGIN
        EXISTE = 'N';
        select 'S' from saldos_doc_cxpagar where sdcp_tiporef = new.egde_tipodoc and
            sdcp_idref = new.egde_iddoc and sdcp_fecha = :FEC into :EXISTE;
        if (Existe = 'S') then
            /* actualice el saldo del dia */
            UPDATE saldos_doc_cxpagar
                SET SDCP_ABONO = SDCP_ABONO + (NEW.egde_abono + NEW.egde_dtof),
                SDCP_ABRTFTE = SDCP_ABRTFTE + NEW.egde_RTFTE,
                SDCP_ABRTIVA = SDCP_ABRTIVA + NEW.egde_RTIVA,
                SDCP_ABRTICA = SDCP_ABRTICA + NEW.egde_RTICA,
                SDCP_TRM = :TRM
                WHERE SDCP_TIPOREF = NEW.EGDE_TIPODOC AND SDCP_IDREF = NEW.egde_IDDOC AND SDCP_FECHA = :FEC;
        else
            /* Inserte un nuevo saldo diario */
            INSERT INTO SALDOS_DOC_CXPAGAR (SDCP_TIPOREF, SDCP_IDREF, SDCP_FECHA, TERC_NIT, SDCP_RTEFTE, SDCP_RTIVA, SDCP_RTICA, SDCP_ABONO, SDCP_ABRTFTE, SDCP_ABRTIVA, SDCP_ABRTICA, SDCP_DEBITO, SDCP_MONTO, SDCP_TRM)
                VALUES (NEW.EGDE_TIPODOC, NEW.EGDE_IDDOC, :FEC, :NIT, 0, 0, 0, (NEW.egde_abono + NEW.egde_dtof), NEW.egde_rtfte, NEW.egde_rtiva, NEW.egde_rtica, 'N', 0, :TRM);
        END /* ok = n */
    /* Registre o actualice el registro en movimiento_proveedor */
    EXISTE = 'N';
    SELECT 'S' FROM MOVIMIENTO_PROVEEDOR WHERE MVPR_TIPOREF = 62 AND MVPR_IDREF = NEW.EGRE_ID INTO :EXISTE;
    if (EXISTE = 'S') then
        /* Actualice el nuevo */
        UPDATE movimiento_proveedor
            SET MVPR_MONTO = MVPR_MONTO + (NEW.egde_abono + NEW.egde_dtof),
                MVPR_RTFTE = MVPR_RTFTE + NEW.egde_rtfte,
                MVPR_RTIVA = MVPR_RTIVA + NEW.egde_rtiva,
                MVPR_RTICA = MVPR_RTICA + NEW.egde_rtica,
                MVPR_TRM = :TRM
            WHERE MVPR_TIPOREF = 62 AND MVPR_IDREF = NEW.EGRE_ID;
    ELSE
        INSERT INTO MOVIMIENTO_PROVEEDOR (MVPR_ID, TERC_NIT, MVPR_TIPOREF, MVPR_IDREF, MVPR_FECHA, MVPR_VENCE, MVPR_CONC, MVPR_MONTO, MVPR_RTFTE, MVPR_RTIVA, MVPR_RTICA, MVPR_DEBITO, MVPR_ABONO, MVPR_PREFIJO, MVPR_NUMERO, MVPR_TRM)
            VALUES (GEN_ID(ID_MOVPROV, 1), :NIT, 62, NEW.EGRE_ID, :FEC, :FEC, :CONCEPTO, (NEW.EGDE_ABONO + NEW.egde_dtof), NEW.EGDE_RTFTE, NEW.EGDE_RTIVA, NEW.EGDE_RTICA, 'N', 'S', :PREFIJO, :NUMERO, :TRM);
    end
END
^

SET TERM ; ^

SET TERM ^ ;

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

SET TERM ; ^

SET TERM ^ ;

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

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

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

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

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

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

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

FOR SELECT E.EGRE_ID, PREF_PRE, EGRE_NUMERO, EGRE_FECHA, EGRE_CONC, TERC_NIT, EGDE_ABONO+EGDE_DTOF, EGDE_RTFTE, EGDE_RTIVA, EGDE_RTICA, EGRE_TRM
    FROM EGRESOS_DETALLE D, EGRESOS E
    WHERE E.EGRE_ID = D.EGRE_ID AND E.EGRE_ID <> 0 AND EGRE_ANULADO = 'N' AND TERC_NIT >= :PRVINI AND TERC_NIT <= :PRVFIN
    ORDER BY EGRE_FECHA
    INTO :IDR, :PREF, :NUMERO, :FECHA, :CONC, :NIT, :MONTO, :RTFTE, :RTIVA, :RTICA, :TRM
    DO
    BEGIN
    EXISTE = 'N';
    SELECT 'S' FROM MOVIMIENTO_PROVEEDOR WHERE MVPR_TIPOREF = 62 AND MVPR_IDREF = :ID INTO :EXISTE;
    if (EXISTE = 'S') then
        begin
        UPDATE movimiento_proveedor
            SET MVPR_MONTO = MVPR_MONTO + :MONTO,
                MVPR_RTFTE = MVPR_RTFTE + :rtfte,
                MVPR_RTIVA = MVPR_RTIVA + :rtiva,
                MVPR_RTICA = MVPR_RTICA + :rtica
            WHERE MVPR_TIPOREF = 62 AND MVPR_IDREF = :IDR;
        end
    ELSE
        INSERT INTO MOVIMIENTO_PROVEEDOR (MVPR_ID, TERC_NIT, MVPR_TIPOREF, MVPR_IDREF, MVPR_FECHA, MVPR_VENCE, MVPR_CONC, MVPR_MONTO, MVPR_RTFTE, MVPR_RTIVA, MVPR_RTICA, MVPR_DEBITO, MVPR_ABONO, MVPR_PREFIJO, MVPR_NUMERO, MVPR_TRM)
            VALUES (GEN_ID(ID_MOVPROV, 1), :NIT, 62, :IDR, :FECHA, :FECHA, :CONC, :MONTO, :RTFTE, :RTIVA, :RTICA, 'N', 'S', :PREF, :NUMERO, :TRM);
    END
END
^

SET TERM ; ^


/* 20090418 */
/* ARREGLE LOTE MAL AL ESCOGER LOTE */
SET TERM ^ ;

CREATE OR ALTER PROCEDURE CHEQUEO_INVENTARIO(
    ARTINI VARCHAR(20),
    ARTFIN VARCHAR(20))
AS
DECLARE VARIABLE FECHA DATE;
DECLARE VARIABLE CANT NUMERIC(15,4);
DECLARE VARIABLE COSTO NUMERIC(18,2);
DECLARE VARIABLE ENTRADA CHAR(1);
DECLARE VARIABLE BODEGA CHAR(2);
DECLARE VARIABLE ID INTEGER;
DECLARE VARIABLE TIPO INTEGER;
declare variable TIPOEX CHAR(1);
DECLARE VARIABLE LOTE VARCHAR(20);
DECLARE VARIABLE EXISTE INTEGER;
declare variable ARTICULO VARCHAR(20);
declare variable IDL INTEGER;
BEGIN
for select arti_cod from articulo where arti_cod >= :artini and arti_cod <= :artfin into :ARTICULO
  DO
  BEGIN
  DELETE FROM existencia_lote where arti_cod = :articulo;
  DELETE FROM lotes where arti_cod = :articulo;
  delete from costos where arti_cod = :ARTICULO;
  delete from existencia WHERE ARTI_COD = :ARTICULO;
  for select mvar_cons, mvar_fecha, mvar_cant, mvar_costo, mvar_entrada, bode_cod, mvar_tipodoc, mvar_lote
    from movimiento_articulo WHERE ARTI_COD = :ARTICULO
    order by mvar_fecha, mvar_cons
    into :id, :fecha, :cant, :costo, :entrada, :bodega, :tipo, :lote
  do
    begin
    SELECT ARTI_EXIST
        FROM   ARTICULO
        WHERE  ARTICULO.ARTI_COD = :ARTICULO
        INTO :TIPOEX;
    if ((TIPO <> 13)) then
        EXECUTE PROCEDURE actualice_costo(:ARTICULO, :fecha, :costo, :cant, :entrada, 'N', :id, :tipo);
    /* actualice existencias */
    if (:entrada = 'S') then
        begin
        execute procedure sume_existencia(:articulo, :bodega, :fecha, :cant, 'N');
        if (TIPOEX = 'L') then
            begin
            SELECT COUNT(*) FROM LOTES WHERE ARTI_COD = :ARTICULO AND BODE_COD = :BODEGA AND LOTE_NRO = :lote INTO :EXISTE;
            if (EXISTE > 0) then
                UPDATE LOTES
                    set lote_saldo = lote_saldo + :cant
                    where (arti_cod = :ARTICULO) and (BODE_COD = :BODEGA) AND (lote_nro = :lote);
            ELSE
                INSERT INTO LOTES (ARTI_COD, BODE_COD, LOTE_NRO, LOTE_FECHA, LOTE_CANT, LOTE_COSTO, LOTE_SALDO)
                    VALUES (:ARTICULO, :bodega, :lote, :fecha, :cant, :costo, :cant);
            end
        end
    else
        begin
        execute procedure reste_existencia(:articulo, :bodega, :fecha, :cant, 'N');
        if (TIPOEX = 'L') then
            begin
            SELECT COUNT(*) FROM LOTES WHERE ARTI_COD = :ARTICULO AND BODE_COD = :BODEGA AND LOTE_NRO = :lote INTO :EXISTE;
            if (EXISTE > 0) then
                UPDATE LOTES
                    set lote_saldo = lote_saldo - :cant
                    where (arti_cod = :ARTICULO) AND (BODE_COD = :BODEGA) and (lote_nro = :lote);
            ELSE
                BEGIN
                /* ARREGLE EL LOTE YA QUE NO EXISTE */
                SELECT MIN(LOTE_ID) FROM LOTES WHERE ARTI_COD = :articulo AND BODE_COD = :BODEGA AND LOTE_SALDO >= :cant INTO :IDL;
                SELECT LOTE_NRO FROM LOTES WHERE LOTE_ID = :IDL INTO :LOTE;
                UPDATE MOVIMIENTO_ARTICULO SET MVAR_LOTE = :LOTE WHERE MVAR_CONS = :ID;
                UPDATE LOTES
                    set lote_saldo = lote_saldo - :cant
                    where (arti_cod = :ARTICULO) and (BODE_COD = :BODEGA) AND (lote_nro = :lote);
                END
            SELECT COUNT(*) FROM EXISTENCIA_LOTE
                WHERE LOTE_NRO = :LOTE AND EXLO_FECHA = :FECHA AND ARTI_COD = :ARTICULO AND BODE_COD = :bodega
                INTO :EXISTE;
            if (EXISTE > 0) then
                UPDATE EXISTENCIA_LOTE
                       SET EXLO_SAL = EXLO_SAL + :cant
                    WHERE LOTE_NRO = :LOTE AND EXLO_FECHA = :FECHA AND ARTI_COD = :ARTICULO AND BODE_COD = :bodega;
            else
                INSERT INTO EXISTENCIA_LOTE (ARTI_COD, BODE_COD, LOTE_NRO, EXLO_FECHA, EXLO_SAL)
                    VALUES (:ARTICULO, :BODEGA, :LOTE, :FECHA, :CANT);
            end
        end
    END
  END
END
^

SET TERM ; ^


/* 20090420 */
/* Agregar el campo sucursal A REPORTES POR CLIENTE */

SET TERM ^ ;

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

        FOR SELECT MAX(T.TERC_NIT), MAX(TERC_NOM), MAX(TERC_TEL), MAX(TERC_CIU), MAX(ZONA_COD), MAX(D.ARTI_COD), SUM(FADE_CANT * FADE_FACTOR), SUM(FACT_FACTOR*(FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO)),
            SUM(FACT_FACTOR*FADE_IVAMONTO), SUM(FACT_FACTOR*FADE_TOTAL),
            MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD), SUM(COST_SALP), max(f.fact_sucursal)
            FROM FACTURAS_DETALLE D, FACTURAS F, PREFIJOS P, terceros T, CLIENTES C, ARTICULO A, movimiento_articulo m, costos CO
            WHERE C.TERC_NIT = T.TERC_NIT AND TERC_CLIE = 'S' AND F.terc_nit = T.terc_nit AND T.TERC_NIT >= :TERINI AND T.TERC_NIT <= :TERFIN AND
            F.FACT_ID = D.FACT_ID AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND FACT_ANULADO = 'N'
            AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) and substring(D.arti_cod from 1 FOR 2) <> '.t'
            AND D.ARTI_COD = A.arti_cod AND A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN
            AND F.fact_id = M.mvar_idref AND M.mvar_tipodoc = 31 AND M.mvar_item = D.fade_item AND M.mvar_cons = CO.cost_idmov
            GROUP BY T.TERC_NIT, f.fact_sucursal, D.ARTI_COD
            INTO :NIT, :NOMBRE, :TELEFONO, :CIUDAD, :CODZONA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :TOTAL,
            :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :COSTO, :sucursal
            DO
            BEGIN
            SELECT ZONA_NOM FROM ZONAS WHERE ZONA_COD = :CODZONA INTO :NOMZONA;
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            if (CEROS = 'S') then
                INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (3, USER, :ARTICULO);
            SUSPEND;
            END /* FOR */
        if (CEROS = 'S') then
            BEGIN
            COSTO = 0;
            UTILIDAD = 0;
            PORC = 0;
            /* agregue los articulos sin factura */
            FOR SELECT ARTI_COD, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN
                INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                DO
                BEGIN
                SELECT COUNT(REPA_ARTICULO) FROM REPORTES_AUX WHERE REPA_ID = 3 AND REPA_USER = USER AND REPA_ARTICULO = :articulo INTO :numrows;
                if (numrows = 0) then
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        END
    if (BIN_AND(TIPO, 2) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 32 INTO :NOMTIPO;
        /* BORRA LA TABLA AUXILIAR */
        DELETE FROM reportes_aux WHERE REPA_ID = 3 AND REPA_USER = USER;

        FOR SELECT MAX(T.TERC_NIT), MAX(TERC_NOM), MAX(TERC_TEL), MAX(TERC_CIU), MAX(ZONA_COD), MAX(D.ARTI_COD), SUM(RVDE_CANT * RVDE_FACTOR), SUM(RVDE_TOTAL-RVDE_IVAMONTO-RVDE_CONSUMO), SUM(RVDE_IVAMONTO), SUM(RVDE_TOTAL),
            MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD), SUM(COST_SALP), max(r.revt_sucursal)
            FROM REMISIONES_VENTA_DETALLE D, REMISIONES_VENTA R, PREFIJOS P, terceros T, CLIENTES C, ARTICULO A, movimiento_articulo m, costos CO
            WHERE C.TERC_NIT = T.TERC_NIT AND TERC_CLIE = 'S' AND R.terc_nit = T.terc_nit AND T.TERC_NIT >= :TERINI AND T.TERC_NIT <= :TERFIN AND
            R.REVT_ID = D.REVT_ID AND REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN AND REVT_ANULADO = 'N'
            AND P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = 32 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            AND D.ARTI_COD = A.arti_cod AND A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN
            AND R.revt_id = M.mvar_idref AND M.mvar_tipodoc = 32 AND M.mvar_item = D.rvde_item AND M.mvar_cons = CO.cost_idmov
            GROUP BY T.TERC_NIT, r.revt_sucursal, D.ARTI_COD
            INTO :NIT, :NOMBRE, :TELEFONO, :CIUDAD, :CODZONA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :TOTAL,
                :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :COSTO, :sucursal
            DO
                BEGIN
                SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                if (CANTIDAD IS NULL) then
                    CANTIDAD = 0;
                if (BASE IS NULL) then
                    BASE = 0;
                if (IVA IS NULL) then
                    IVA = 0;
                UTILIDAD = BASE - COSTO;
                if (UOM = 'UTILIDAD') then
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                else
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            if (CEROS = 'S') then
                INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (3, USER, :ARTICULO);
            SUSPEND;
            END /* FOR */
        if (CEROS = 'S') then
            BEGIN
            COSTO = 0;
            UTILIDAD = 0;
            PORC = 0;
            /* agregue los articulos sin factura */
            FOR SELECT ARTI_COD, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN
                INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                DO
                BEGIN
                SELECT COUNT(REPA_ARTICULO) FROM REPORTES_AUX WHERE REPA_ID = 3 AND REPA_USER = USER AND REPA_ARTICULO = :articulo INTO :numrows;
                if (numrows = 0) then
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        END
    if (BIN_AND(TIPO, 4) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 33 INTO :NOMTIPO;
        /* BORRA LA TABLA AUXILIAR */
        DELETE FROM reportes_aux WHERE REPA_ID = 3 AND REPA_USER = USER;

        FOR SELECT MAX(T.TERC_NIT), MAX(TERC_NOM), MAX(TERC_TEL), MAX(TERC_CIU), MAX(ZONA_COD), MAX(D.ARTI_COD), SUM(DVDE_CANT * DVDE_FACTOR), SUM(DEVT_FACTOR*(DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO)),
            SUM(DEVT_FACTOR*DVDE_IVAMONTO), SUM(DEVT_FACTOR*DVDE_TOTAL),
            MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD), SUM(COST_ENTP), max(v.devt_sucursal)
            FROM devoluciones_ventas_detalle D, DEVOLUCIONES_VENTAS V, PREFIJOS P, terceros T, CLIENTES C, ARTICULO A, MOVIMIENTO_ARTICULO M, COSTOS CO
            WHERE C.TERC_NIT = T.TERC_NIT AND TERC_CLIE = 'S' AND V.terc_nit = T.terc_nit AND T.TERC_NIT >= :TERINI AND T.TERC_NIT <= :TERFIN AND
            V.DEVT_ID = D.DEVT_ID AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND DEVT_ANULADO = 'N'
            AND P.PREF_PRE = V.PREF_PRE AND P.TIDO_COD = 33 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) and substring(D.arti_cod from 1 FOR 2) <> '.t'
            AND D.ARTI_COD = A.arti_cod AND A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN
            AND V.devt_id = M.mvar_idref AND M.mvar_tipodoc = 33 AND M.mvar_item = D.dvde_item AND M.mvar_cons = CO.cost_idmov
            GROUP BY T.TERC_NIT, v.devt_sucursal, D.ARTI_COD
            INTO :NIT, :NOMBRE, :TELEFONO, :CIUDAD, :CODZONA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :TOTAL,
                :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :COSTO, :sucursal
            DO
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            TOTAL = TOTAL * -1;
            IVA = IVA * -1;
            BASE = BASE * -1;
            CANTIDAD = CANTIDAD * -1;
            COSTO = COSTO * -1;
            UTILIDAD = UTILIDAD * -1;
            if (CEROS = 'S') then
                INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (3, USER, :ARTICULO);
            SUSPEND;
            END /* FOR */
        if (CEROS = 'S') then
            BEGIN
            COSTO = 0;
            UTILIDAD = 0;
            PORC = 0;
            /* agregue los articulos sin factura */
            FOR SELECT ARTI_COD, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN
                INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                DO
                BEGIN
                SELECT COUNT(REPA_ARTICULO) FROM REPORTES_AUX WHERE REPA_ID = 3 AND REPA_USER = USER AND REPA_ARTICULO = :articulo INTO :numrows;
                if (numrows = 0) then
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        END
    if (BIN_AND(TIPO, 8) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 34 INTO :NOMTIPO;
        /* BORRA LA TABLA AUXILIAR */
        DELETE FROM reportes_aux WHERE REPA_ID = 3 AND REPA_USER = USER;

        FOR SELECT MAX(T.TERC_NIT), MAX(TERC_NOM), MAX(TERC_TEL), MAX(TERC_CIU), MAX(ZONA_COD), MAX(ARTI_COD), SUM(PEDE_CANT * PEDE_FACTOR), SUM(PEDI_FACTOR*(PEDE_TOTAL-PEDE_IVAMONTO-PEDE_CONSUMO)),
            SUM(PEDI_FACTOR*PEDE_IVAMONTO), SUM(PEDI_FACTOR*PEDE_TOTAL), max(p.pedi_sucursal)
            FROM PEDIDOS_DETALLE D, PEDIDOS P, PREFIJOS PR, terceros T, CLIENTES C
            WHERE C.TERC_NIT = T.TERC_NIT AND TERC_CLIE = 'S' AND P.terc_nit = T.terc_nit AND T.TERC_NIT >= :TERINI AND T.TERC_NIT <= :TERFIN AND
            P.PEDI_ID = D.PEDI_ID AND PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND PEDI_ANULADO = 'N'
            AND PR.PREF_PRE = P.PREF_PRE AND P.TIDO_COD = 34 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY T.TERC_NIT, p.pedi_sucursal, ARTI_COD
            INTO :NIT, :NOMBRE, :TELEFONO, :CIUDAD, :CODZONA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :TOTAL, :sucursal
            DO
            BEGIN
            SELECT ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                FROM ARTICULO WHERE ARTI_COD = :ARTICULO
                INTO :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC;
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            EXECUTE PROCEDURE costo_promedio (:ARTICULO, :FECFIN) RETURNING_VALUES (:COSTOUNIT);
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            COSTO = CANTIDAD * COSTOUNIT;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            if (CEROS = 'S') then
                INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (3, USER, :ARTICULO);
            SUSPEND;
            END /* FOR */
        if (CEROS = 'S') then
            BEGIN
            COSTO = 0;
            UTILIDAD = 0;
            PORC = 0;
            /* agregue los articulos sin factura */
            FOR SELECT ARTI_COD, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN
                INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                DO
                BEGIN
                SELECT COUNT(REPA_ARTICULO) FROM REPORTES_AUX WHERE REPA_ID = 3 AND REPA_USER = USER AND REPA_ARTICULO = :articulo INTO :numrows;
                if (numrows = 0) then
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        END
    if (BIN_AND(TIPO, 16) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 35 INTO :NOMTIPO;
        /* BORRA LA TABLA AUXILIAR */
        DELETE FROM reportes_aux WHERE REPA_ID = 3 AND REPA_USER = USER;

        FOR SELECT MAX(T.TERC_NIT), MAX(TERC_NOM), MAX(TERC_TEL), MAX(TERC_CIU), MAX(ZONA_COD), MAX(ARTI_COD), SUM(CTDE_CANT * CTDE_FACTOR), SUM(COTI_FACTOR*(CTDE_TOTAL-CTDE_IVAMONTO-CTDE_CONSUMO)),
            SUM(COTI_FACTOR*CTDE_IVAMONTO), SUM(COTI_FACTOR*CTDE_TOTAL), max(ct.coti_sucursal)
            FROM COTIZACIONES_DETALLE D, COTIZACIONES CT, PREFIJOS P, terceros T, CLIENTES C
            WHERE C.TERC_NIT = T.TERC_NIT AND TERC_CLIE = 'S' AND C.terc_nit = T.terc_nit AND T.TERC_NIT >= :TERINI AND T.TERC_NIT <= :TERFIN AND
            CT.COTI_ID = D.COTI_ID AND COTI_FECHA >= :FECINI AND COTI_FECHA <= :FECFIN AND COTI_ANULADO = 'N'
            AND P.PREF_PRE = CT.PREF_PRE AND P.TIDO_COD = 35 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY T.TERC_NIT, ct.coti_sucursal, ARTI_COD
            INTO :NIT, :NOMBRE, :TELEFONO, :CIUDAD, :CODZONA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :TOTAL, :sucursal
            DO
            BEGIN
            SELECT ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                FROM ARTICULO WHERE ARTI_COD = :ARTICULO
                INTO :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC;
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            EXECUTE PROCEDURE costo_promedio (:ARTICULO, :FECFIN) RETURNING_VALUES (:COSTOUNIT);
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            COSTO = CANTIDAD * COSTOUNIT;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            if (CEROS = 'S') then
                INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (3, USER, :ARTICULO);
            SUSPEND;
            END /* FOR */
        if (CEROS = 'S') then
            BEGIN
            COSTO = 0;
            UTILIDAD = 0;
            PORC = 0;
            /* agregue los articulos sin factura */
            FOR SELECT ARTI_COD, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN
                INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                DO
                BEGIN
                SELECT COUNT(REPA_ARTICULO) FROM REPORTES_AUX WHERE REPA_ID = 3 AND REPA_USER = USER AND REPA_ARTICULO = :articulo INTO :numrows;
                if (numrows = 0) then
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        END
    END
ELSE
    BEGIN
    if (BIN_AND(TIPO, 1) <> 0) then
            BEGIN
            SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 31 INTO :NOMTIPO;
            FOR SELECT F.PREF_PRE, FACT_NUMERO, FACT_FECHA, ARTI_COD, FADE_CANT * FADE_FACTOR, (FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO)*FACT_FACTOR,
                FADE_IVAMONTO*FACT_FACTOR, FADE_DTOPORC, FADE_TOTAL*FACT_FACTOR, F.terc_nit, F.fact_nomcliente, f.fact_sucursal
                FROM FACTURAS F, FACTURAS_DETALLE D, PREFIJOS P
                WHERE F.FACT_ID = D.FACT_ID AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND F.TERC_NIT >= :TERINI AND F.TERC_NIT <= :TERFIN AND FACT_ANULADO = 'N'
                 AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) and substring(D.arti_cod from 1 FOR 2) <> '.t'
                ORDER BY f.terc_nit, f.fact_sucursal, ARTI_COD, FACT_FECHA, F.FACT_ID, FADE_ITEM
                INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :DTO, :TOTAL, :NIT, :nombre, :sucursal
                DO
                BEGIN
                SELECT ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO WHERE ARTI_COD = :ARTICULO
                    INTO :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC;
                SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                EXECUTE PROCEDURE costo_promedio (:ARTICULO, :FECHA) RETURNING_VALUES (:COSTOUNIT);
                COSTO = COSTOUNIT * CANTIDAD;
                UTILIDAD = BASE - COSTO;
                if (UOM = 'UTILIDAD') then
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                else
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
                SUSPEND;
                END
            END
    if (BIN_AND(TIPO, 2) <> 0) then
            BEGIN
            SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 32 INTO :NOMTIPO;
            FOR SELECT R.PREF_PRE, REVT_NUMERO, REVT_FECHA, ARTI_COD, RVDE_CANT * RVDE_FACTOR,
                (RVDE_TOTAL - RVDE_IVAMONTO), RVDE_IVAMONTO, RVDE_DTOPORC, RVDE_TOTAL, R.terc_nit, R.revt_nomterc, r.revt_sucursal
                FROM REMISIONES_VENTA R, REMISIONES_VENTA_DETALLE D, PREFIJOS P
                WHERE R.REVT_ID = D.REVT_ID AND REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN AND R.TERC_NIT >= :TERINI AND R.TERC_NIT <= :TERFIN AND REVT_ANULADO = 'N'
                 AND P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = 32 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                ORDER BY r.terc_nit, r.revt_sucursal, ARTI_COD, REVT_FECHA, R.REVT_ID, RVDE_ITEM
                INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :DTO, :TOTAL, :NIT, :nombre, :sucursal
                DO
                BEGIN
                SELECT ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO WHERE ARTI_COD = :ARTICULO
                    INTO :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC;
                SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                EXECUTE PROCEDURE costo_promedio (:ARTICULO, :FECHA) RETURNING_VALUES (:COSTOUNIT);
                COSTO = COSTOUNIT * CANTIDAD;
                UTILIDAD = BASE - COSTO;
                if (UOM = 'UTILIDAD') then
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                else
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
                SUSPEND;
                END
            END
    if (BIN_AND(TIPO, 4) <> 0) then
            BEGIN
            SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 33 INTO :NOMTIPO;
            FOR SELECT V.PREF_PRE, DEVT_NUMERO, DEVT_FECHA, ARTI_COD, DVDE_CANT * DVDE_FACTOR, (DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO)*DEVT_FACTOR,
                DVDE_IVAMONTO*DEVT_FACTOR, DVDE_DTOPORC, DVDE_TOTAL*DEVT_FACTOR, V.terc_nit, V.devt_nomterc, v.devt_sucursal
                FROM DEVOLUCIONES_VENTAS V, DEVOLUCIONES_VENTAS_DETALLE D, PREFIJOS P
                WHERE V.DEVT_ID = D.DEVT_ID AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND V.TERC_NIT >= :TERINI AND V.TERC_NIT <= :TERFIN AND DEVT_ANULADO = 'N'
                 AND P.PREF_PRE = V.PREF_PRE AND P.TIDO_COD = 33 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))  and substring(D.arti_cod from 1 FOR 2) <> '.t'
                ORDER BY v.terc_nit, v.devt_sucursal, ARTI_COD, DEVT_FECHA, D.DEVT_ID, DVDE_ITEM
                INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :DTO, :TOTAL, :NIT, :nombre, :sucursal
                DO
                BEGIN
                SELECT ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO WHERE ARTI_COD = :ARTICULO
                    INTO :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC;
                SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                EXECUTE PROCEDURE costo_promedio (:ARTICULO, :FECHA) RETURNING_VALUES (:COSTOUNIT);
                COSTO = COSTOUNIT * CANTIDAD;
                UTILIDAD = BASE - COSTO;
                if (UOM = 'UTILIDAD') then
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                else
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
                TOTAL = TOTAL * -1;
                IVA = IVA * -1;
                BASE = BASE * -1;
                CANTIDAD = CANTIDAD * -1;
                COSTO = COSTO * -1;
                UTILIDAD = UTILIDAD * -1;
                SUSPEND;
                END
            END
    if (BIN_AND(TIPO, 8) <> 0) then
            BEGIN
            SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 34 INTO :NOMTIPO;
            FOR SELECT P.PREF_PRE, PEDI_NUMERO, PEDI_FECHA, ARTI_COD, PEDE_CANT * PEDE_FACTOR, (PEDE_TOTAL-PEDE_IVAMONTO-PEDE_CONSUMO)*PEDI_FACTOR,
                PEDE_IVAMONTO*PEDI_FACTOR, PEDE_DTOPORC, PEDE_TOTAL*PEDI_FACTOR, P.terc_nit, P.pedi_nomterc, p.pedi_sucursal
                FROM PEDIDOS P, PEDIDOS_DETALLE D, PREFIJOS PR
                WHERE P.PEDI_ID = D.PEDI_ID AND PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND P.TERC_NIT >= :TERINI AND P.TERC_NIT <= :TERFIN AND PEDI_ANULADO = 'N'
                 AND P.PREF_PRE = PR.PREF_PRE AND P.TIDO_COD = 34 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                ORDER BY p.terc_nit, p.pedi_sucursal, ARTI_COD, PEDI_FECHA, P.PEDI_ID, PEDE_ITEM
                INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :DTO, :TOTAL, :NIT, :nombre, :sucursal
                DO
                BEGIN
                SELECT ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO WHERE ARTI_COD = :ARTICULO
                    INTO :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC;
                SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                EXECUTE PROCEDURE costo_promedio (:ARTICULO, :FECHA) RETURNING_VALUES (:COSTOUNIT);
                COSTO = COSTOUNIT * CANTIDAD;
                UTILIDAD = BASE - COSTO;
                if (UOM = 'UTILIDAD') then
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                else
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
                SUSPEND;
                END
            END
    if (BIN_AND(TIPO, 16) <> 0) then
            BEGIN
            SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 35 INTO :NOMTIPO;
            FOR SELECT C.PREF_PRE, COTI_NUMERO, COTI_FECHA, ARTI_COD, CTDE_CANT * CTDE_FACTOR, (CTDE_TOTAL-CTDE_IVAMONTO-CTDE_CONSUMO)*COTI_FACTOR,
                CTDE_IVAMONTO*COTI_FACTOR, CTDE_DTOPORC, CTDE_TOTAL*COTI_FACTOR, C.terc_nit, C.coti_nomterc, c.coti_sucursal
                FROM COTIZACIONES C, COTIZACIONES_DETALLE D, PREFIJOS P
                WHERE C.COTI_ID = D.COTI_ID AND ARTI_COD = :ARTICULO AND COTI_FECHA >= :FECINI AND COTI_FECHA <= :FECFIN AND C.TERC_NIT >= :TERINI AND C.TERC_NIT <= :TERFIN AND COTI_ANULADO = 'N'
                 AND P.PREF_PRE = C.PREF_PRE AND P.TIDO_COD = 35 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                ORDER BY c.terc_nit, c.coti_sucursal, COTI_FECHA, C.COTI_ID, CTDE_ITEM
                INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :DTO, :TOTAL, :NIT, :nombre, :sucursal
                DO
                BEGIN
                SELECT ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO WHERE ARTI_COD = :ARTICULO
                    INTO :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC;
                SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                EXECUTE PROCEDURE costo_promedio (:ARTICULO, :FECHA) RETURNING_VALUES (:COSTOUNIT);
                COSTO = COSTOUNIT * CANTIDAD;
                UTILIDAD = BASE - COSTO;
                if (UOM = 'UTILIDAD') then
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                else
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
                SUSPEND;
                END
            END
    END
END
^

SET TERM ; ^


SET TERM ^ ;

CREATE OR ALTER PROCEDURE REP_ARTICULOS_CLIENTE(
    TIPO INTEGER,
    DETALLE CHAR(1),
    TERINI VARCHAR(20),
    TERFIN VARCHAR(20),
    FECINI DATE,
    FECFIN DATE,
    ARTINI VARCHAR(15),
    ARTFIN VARCHAR(15),
    ORDEN CHAR(1),
    CEROS CHAR(1),
    SUBEMPRESA INTEGER)
RETURNS (
    NIT VARCHAR(20),
    NOMBRE VARCHAR(60),
    SUCURSAL VARCHAR(10),
    DV CHAR(1),
    TELEFONO VARCHAR(40),
    CIUDAD VARCHAR(40),
    CODZONA VARCHAR(2),
    NOMZONA VARCHAR(30),
    NOMTIPO VARCHAR(50),
    ARTICULO VARCHAR(15),
    DESCRIPCION VARCHAR(60),
    CODGRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    CODSUBG VARCHAR(3),
    NOMSUBG VARCHAR(30),
    CODMARC VARCHAR(3),
    NOMMARC VARCHAR(30),
    UNIDAD VARCHAR(8),
    CANTIDAD NUMERIC(18,4),
    BASE NUMERIC(18,2),
    IVA NUMERIC(18,2),
    CONSUMO NUMERIC(18,2),
    TOTAL NUMERIC(18,2),
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    DTO NUMERIC(9,2),
    TIPODOC INTEGER)
AS
declare variable CODINI VARCHAR(15);
declare variable CODFIN VARCHAR(15);
declare variable DESINI VARCHAR(15);
declare variable DESFIN VARCHAR(15);
BEGIN
if (ORDEN = 'C') then
    BEGIN
    CODINI = ARTINI;
    CODFIN = ARTFIN;
    DESINI = '';
    DESFIN = 'zz';
    END
ELSE
    BEGIN
    DESINI = ARTINI;
    DESFIN = ARTFIN;
    CODINI = '';
    CODFIN = 'zz';
    END

SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = :TIPO INTO :NOMTIPO;
if (DETALLE = 'N') then
    BEGIN
    if (BIN_AND(TIPO, 1) <> 0) then
        BEGIN
        TIPODOC = 31;
        FOR SELECT SUM(FADE_CANT * FADE_FACTOR), SUM((FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO)*FACT_FACTOR), SUM(FADE_IVAMONTO*FACT_FACTOR), SUM(FADE_CONSUMO), SUM(FADE_TOTAL*FACT_FACTOR),
            max(D.ARTI_COD), MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD), MAX(TERC_NIT), max(f.fact_sucursal)
            FROM FACTURAS_DETALLE D, FACTURAS F, PREFIJOS P, ARTICULO A
            WHERE F.FACT_ID = D.FACT_ID AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND D.ARTI_COD = A.ARTI_COD AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            TERC_NIT >= :TERINI AND TERC_NIT <= :TERFIN AND FACT_ANULADO = 'N' AND
            FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) and substring(a.arti_cod from 1 FOR 2) <> '.t'
            GROUP BY TERC_NIT, f.fact_sucursal, D.ARTI_COD
            INTO :CANTIDAD, :BASE, :IVA, :CONSUMO, :TOTAL, :ARTICULO, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :NIT, :sucursal
            DO
            BEGIN
            select TERC_NOM, TERC_TEL, TERC_CIU, C.ZONA_COD, TERC_DV from terceros T, CLIENTES C
                where C.TERC_NIT = T.TERC_NIT AND T.TERC_NIT = :NIT
                INTO :NOMBRE, :TELEFONO, :CIUDAD, :CODZONA, :DV;
            SELECT ZONA_NOM FROM ZONAS WHERE ZONA_COD = :CODZONA INTO :NOMZONA;
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            if (CEROS = 'S') then
                SUSPEND;
            ELSE
                if ((BASE <> 0) AND (CANTIDAD <> 0)) then
                    SUSPEND;
            END
        END
    if (BIN_AND(TIPO, 2) <> 0) then
        BEGIN
        TIPODOC = 32;
        FOR SELECT SUM(RVDE_CANT * RVDE_FACTOR), SUM(RVDE_TOTAL-RVDE_IVAMONTO-RVDE_CONSUMO), SUM(RVDE_IVAMONTO), SUM(RVDE_CONSUMO), SUM(RVDE_TOTAL),
            max(D.ARTI_COD), MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD), MAX(TERC_NIT), max(r.revt_sucursal)
            FROM REMISIONES_VENTA_DETALLE D, REMISIONES_VENTA R, PREFIJOS P, ARTICULO A
            WHERE R.REVT_ID = D.REVT_ID AND P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = 32 AND D.ARTI_COD = A.ARTI_COD AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            TERC_NIT >= :TERINI AND TERC_NIT <= :TERFIN AND REVT_FECHA >= :FECINI AND
            REVT_FECHA <= :FECFIN AND REVT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY TERC_NIT, r.revt_sucursal, D.ARTI_COD
            INTO :CANTIDAD, :BASE, :IVA, :CONSUMO, :TOTAL, :ARTICULO, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :NIT, :sucursal
            DO
            BEGIN
            select TERC_NOM, TERC_TEL, TERC_CIU, C.ZONA_COD, TERC_DV from terceros T, CLIENTES C
                where C.TERC_NIT = T.TERC_NIT AND T.TERC_NIT = :NIT
                INTO :NOMBRE, :TELEFONO, :CIUDAD, :CODZONA, :DV;
            SELECT ZONA_NOM FROM ZONAS WHERE ZONA_COD = :CODZONA INTO :NOMZONA;
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            if (CEROS = 'S') then
                SUSPEND;
            ELSE
                if ((BASE <> 0) AND (CANTIDAD <> 0)) then
                    SUSPEND;
            END
        END
    if (BIN_AND(TIPO, 4) <> 0) then
        BEGIN
        TIPODOC = 33;
        FOR SELECT SUM(DVDE_CANT * DVDE_FACTOR), SUM((DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO)*DEVT_FACTOR), SUM(DVDE_IVAMONTO*DEVT_FACTOR), SUM(DVDE_CONSUMO), SUM(DVDE_TOTAL*DEVT_FACTOR),
            max(D.ARTI_COD), MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD), MAX(TERC_NIT), max(v.devt_sucursal)
            FROM devoluciones_ventas_detalle D, DEVOLUCIONES_VENTAS V, PREFIJOS P, ARTICULO A
            WHERE V.DEVT_ID = D.DEVT_ID AND P.PREF_PRE = V.PREF_PRE AND P.TIDO_COD = 33 AND D.ARTI_COD = A.ARTI_COD AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            TERC_NIT >= :TERINI AND TERC_NIT <= :TERFIN AND DEVT_FECHA >= :FECINI AND
            DEVT_FECHA <= :FECFIN AND DEVT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY TERC_NIT, v.devt_sucursal, D.ARTI_COD
            INTO :CANTIDAD, :BASE, :IVA, :CONSUMO, :TOTAL, :ARTICULO, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :NIT, :sucursal
            DO
            BEGIN
            select TERC_NOM, TERC_TEL, TERC_CIU, C.ZONA_COD, TERC_DV from terceros T, CLIENTES C
                where C.TERC_NIT = T.TERC_NIT AND T.TERC_NIT = :NIT
                INTO :NOMBRE, :TELEFONO, :CIUDAD, :CODZONA, :DV;
            SELECT ZONA_NOM FROM ZONAS WHERE ZONA_COD = :CODZONA INTO :NOMZONA;
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            CANTIDAD = CANTIDAD * -1;
            BASE = BASE * -1;
            TOTAL = TOTAL * -1;
            IVA = IVA * -1;
            CONSUMO = CONSUMO * -1;
            if (CEROS = 'S') then
                SUSPEND;
            ELSE
                if ((BASE <> 0) AND (CANTIDAD <> 0)) then
                    SUSPEND;
            END
        END
    if (BIN_AND(TIPO, 8) <> 0) then
        BEGIN
        TIPODOC = 34;
        FOR SELECT SUM(PEDE_CANT * PEDE_FACTOR), SUM((PEDE_TOTAL-PEDE_IVAMONTO-PEDE_CONSUMO)*PEDI_FACTOR), SUM(PEDE_IVAMONTO*PEDI_FACTOR), SUM(PEDE_CONSUMO), SUM(PEDE_TOTAL*PEDI_FACTOR),
            max(D.ARTI_COD), MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD), MAX(TERC_NIT), max(p.pedi_sucursal)
            FROM PEDIDOS_DETALLE D, PEDIDOS P, PREFIJOS R, ARTICULO A
            WHERE P.PEDI_ID = D.PEDI_ID AND R.PREF_PRE = P.PREF_PRE AND R.TIDO_COD = 34 AND D.ARTI_COD = A.ARTI_COD AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            TERC_NIT >= :TERINI AND TERC_NIT <= :TERFIN AND PEDI_FECHA >= :FECINI AND
            PEDI_FECHA <= :FECFIN AND PEDI_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY TERC_NIT, p.pedi_sucursal, D.ARTI_COD
            INTO :CANTIDAD, :BASE, :IVA, :CONSUMO, :TOTAL, :ARTICULO, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :NIT, :sucursal
            DO
            BEGIN
            select TERC_NOM, TERC_TEL, TERC_CIU, C.ZONA_COD, TERC_DV from terceros T, CLIENTES C
                where C.TERC_NIT = T.TERC_NIT AND T.TERC_NIT = :NIT
                INTO :NOMBRE, :TELEFONO, :CIUDAD, :CODZONA, :DV;
            SELECT ZONA_NOM FROM ZONAS WHERE ZONA_COD = :CODZONA INTO :NOMZONA;
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            if (CEROS = 'S') then
                SUSPEND;
            ELSE
                if ((BASE <> 0) AND (CANTIDAD <> 0)) then
                    SUSPEND;
            END
        END
    if (BIN_AND(TIPO, 16) <> 0) then
        BEGIN
        TIPODOC = 35;
        FOR SELECT SUM(CTDE_CANT * CTDE_FACTOR), SUM((CTDE_TOTAL-CTDE_IVAMONTO-CTDE_CONSUMO)*COTI_FACTOR), SUM(CTDE_IVAMONTO*COTI_FACTOR), SUM(CTDE_CONSUMO), SUM(CTDE_TOTAL*COTI_FACTOR),
            max(D.ARTI_COD), MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD), MAX(TERC_NIT), max(c.coti_sucursal)
            FROM COTIZACIONES_DETALLE D, COTIZACIONES C, PREFIJOS P, ARTICULO A
            WHERE C.COTI_ID = D.COTI_ID AND P.PREF_PRE = C.PREF_PRE AND P.TIDO_COD = 35 AND D.ARTI_COD = A.ARTI_COD AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            TERC_NIT >= :TERINI AND TERC_NIT <= :TERFIN AND COTI_FECHA >= :FECINI AND
            COTI_FECHA <= :FECFIN AND COTI_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY TERC_NIT, c.coti_sucursal, D.ARTI_COD
            INTO :CANTIDAD, :BASE, :IVA, :CONSUMO, :TOTAL, :ARTICULO, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :NIT, :sucursal
            DO
            BEGIN
            select TERC_NOM, TERC_TEL, TERC_CIU, C.ZONA_COD, TERC_DV from terceros T, CLIENTES C
                where C.TERC_NIT = T.TERC_NIT AND T.TERC_NIT = :NIT
                INTO :NOMBRE, :TELEFONO, :CIUDAD, :CODZONA, :DV;
            SELECT ZONA_NOM FROM ZONAS WHERE ZONA_COD = :CODZONA INTO :NOMZONA;
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            if (CEROS = 'S') then
                SUSPEND;
            ELSE
                if ((BASE <> 0) AND (CANTIDAD <> 0)) then
                    SUSPEND;
            END
        END
    END
ELSE
    BEGIN
    if (BIN_AND(TIPO, 1) <> 0) then
        BEGIN
        TIPODOC = 31;
        FOR SELECT F.PREF_PRE, FACT_NUMERO, FACT_FECHA, FADE_CANT * FADE_FACTOR, FADE_PRUNIT/FADE_FACTOR*FACT_FACTOR, FADE_IVAMONTO*FACT_FACTOR, FADE_CONSUMO, FADE_DTOPORC, FADE_TOTAL*FACT_FACTOR,
            D.ARTI_COD, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD, TERC_NIT, f.fact_sucursal
            FROM FACTURAS F, FACTURAS_DETALLE D, PREFIJOS P, ARTICULO A
            WHERE F.FACT_ID = D.FACT_ID AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND D.ARTI_COD = A.ARTI_COD AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            TERC_NIT >= :TERINI AND TERC_NIT <= :TERFIN AND FACT_FECHA >= :FECINI AND
            FACT_FECHA <= :FECFIN AND FACT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) and substring(a.arti_cod from 1 FOR 2) <> '.t'
            ORDER BY TERC_NIT, f.fact_sucursal, ARTI_COD, FACT_FECHA
            INTO :PREFIJO, :NUMERO, :FECHA, CANTIDAD, :BASE, :IVA, :CONSUMO, :dto, :TOTAL, :ARTICULO, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :NIT, :sucursal
            DO
            BEGIN
            select TERC_NOM, TERC_TEL, TERC_CIU, C.ZONA_COD, TERC_DV from terceros T, CLIENTES C
                where C.TERC_NIT = T.TERC_NIT AND T.TERC_NIT = :NIT
                INTO :NOMBRE, :TELEFONO, :CIUDAD, :CODZONA, :DV;
            SELECT ZONA_NOM FROM ZONAS WHERE ZONA_COD = :CODZONA INTO :NOMZONA;
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            SUSPEND;
            END
        END
    if (BIN_AND(TIPO, 2) <> 0) then
        BEGIN
        TIPODOC = 32;
        FOR SELECT R.PREF_PRE, REVT_NUMERO, REVT_FECHA, RVDE_CANT * RVDE_FACTOR, RVDE_PRUNIT / RVDE_FACTOR, RVDE_IVAMONTO, RVDE_CONSUMO, RVDE_DTOPORC, RVDE_TOTAL,
            D.ARTI_COD, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD, TERC_NIT, r.revt_sucursal
            FROM REMISIONES_VENTA R, REMISIONES_VENTA_DETALLE D, PREFIJOS P, ARTICULO A
            WHERE R.REVT_ID = D.REVT_ID AND P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = 32 AND D.ARTI_COD = A.ARTI_COD AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            TERC_NIT >= :TERINI AND TERC_NIT <= :TERFIN AND REVT_FECHA >= :FECINI AND
            REVT_FECHA <= :FECFIN AND REVT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            ORDER BY TERC_NIT, r.revt_sucursal, ARTI_COD, REVT_FECHA
            INTO :PREFIJO, :NUMERO, :FECHA, CANTIDAD, :BASE, :IVA, :CONSUMO, :dto, :TOTAL, :ARTICULO, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :NIT, :sucursal
            DO
            BEGIN
            select TERC_NOM, TERC_TEL, TERC_CIU, C.ZONA_COD, TERC_DV from terceros T, CLIENTES C
                where C.TERC_NIT = T.TERC_NIT AND T.TERC_NIT = :NIT
                INTO :NOMBRE, :TELEFONO, :CIUDAD, :CODZONA, :DV;
            SELECT ZONA_NOM FROM ZONAS WHERE ZONA_COD = :CODZONA INTO :NOMZONA;
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            SUSPEND;
            END
        END
    if (BIN_AND(TIPO, 4) <> 0) then
        BEGIN
        TIPODOC = 33;
        FOR SELECT V.PREF_PRE, DEVT_NUMERO, DEVT_FECHA, DVDE_CANT * DVDE_FACTOR, DVDE_PRUNIT/DVDE_FACTOR*DEVT_FACTOR, DVDE_IVAMONTO*DEVT_FACTOR, DVDE_CONSUMO, DVDE_DTOPORC, DVDE_TOTAL*DEVT_FACTOR,
            D.ARTI_COD, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD, TERC_NIT, v.devt_sucursal
            FROM DEVOLUCIONES_VENTAS V, DEVOLUCIONES_VENTAS_DETALLE D, PREFIJOS P, ARTICULO A
            WHERE V.DEVT_ID = D.DEVT_ID AND P.PREF_PRE = V.PREF_PRE AND P.TIDO_COD = 33 AND D.ARTI_COD = A.ARTI_COD AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            TERC_NIT >= :TERINI AND TERC_NIT <= :TERFIN AND DEVT_FECHA >= :FECINI AND
            DEVT_FECHA <= :FECFIN AND DEVT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            ORDER BY TERC_NIT, v.devt_sucursal, ARTI_COD, DEVT_FECHA
            INTO :PREFIJO, :NUMERO, :FECHA, CANTIDAD, :BASE, :IVA, :CONSUMO, :dto, :TOTAL, :ARTICULO, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :NIT, :sucursal
            DO
            BEGIN
            select TERC_NOM, TERC_TEL, TERC_CIU, C.ZONA_COD, TERC_DV from terceros T, CLIENTES C
                where C.TERC_NIT = T.TERC_NIT AND T.TERC_NIT = :NIT
                INTO :NOMBRE, :TELEFONO, :CIUDAD, :CODZONA, :DV;
            SELECT ZONA_NOM FROM ZONAS WHERE ZONA_COD = :CODZONA INTO :NOMZONA;
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            CANTIDAD = CANTIDAD * -1;
            BASE = BASE * -1;
            TOTAL = TOTAL * -1;
            IVA = IVA * -1;
            CONSUMO = CONSUMO * -1;
            SUSPEND;
            END
        END
    if (BIN_AND(TIPO, 8) <> 0) then
        BEGIN
        TIPODOC = 34;
        FOR SELECT P.PREF_PRE, PEDI_NUMERO, PEDI_FECHA, PEDE_CANT * PEDE_FACTOR, PEDE_PRUNIT/PEDE_FACTOR*PEDI_FACTOR, PEDE_IVAMONTO*PEDI_FACTOR, PEDE_CONSUMO, PEDE_DTOPORC, PEDE_TOTAL*PEDI_FACTOR,
            D.ARTI_COD, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD, TERC_NIT, p.pedi_sucursal
            FROM PEDIDOS P, PEDIDOS_DETALLE D, PREFIJOS R, ARTICULO A
            WHERE P.PEDI_ID = D.PEDI_ID AND R.PREF_PRE = P.PREF_PRE AND R.TIDO_COD = 34 AND D.ARTI_COD = A.ARTI_COD AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            TERC_NIT >= :TERINI AND TERC_NIT <= :TERFIN AND PEDI_FECHA >= :FECINI AND
            PEDI_FECHA <= :FECFIN AND PEDI_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            ORDER BY TERC_NIT, p.pedi_sucursal, ARTI_COD, PEDI_FECHA
            INTO :PREFIJO, :NUMERO, :FECHA, CANTIDAD, :BASE, :IVA, :CONSUMO, :dto, :TOTAL, :ARTICULO, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :NIT, :sucursal
            DO
            BEGIN
            select TERC_NOM, TERC_TEL, TERC_CIU, C.ZONA_COD, TERC_DV from terceros T, CLIENTES C
                where C.TERC_NIT = T.TERC_NIT AND T.TERC_NIT = :NIT
                INTO :NOMBRE, :TELEFONO, :CIUDAD, :CODZONA, :DV;
            SELECT ZONA_NOM FROM ZONAS WHERE ZONA_COD = :CODZONA INTO :NOMZONA;
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            SUSPEND;
            END
        END
    if (BIN_AND(TIPO, 16) <> 0) then
        BEGIN
        TIPODOC = 35;
        FOR SELECT C.PREF_PRE, COTI_NUMERO, COTI_FECHA, CTDE_CANT * CTDE_FACTOR, CTDE_PRUNIT/CTDE_FACTOR*COTI_FACTOR, CTDE_IVAMONTO*COTI_FACTOR, CTDE_CONSUMO, CTDE_DTOPORC, CTDE_TOTAL*COTI_FACTOR,
            D.ARTI_COD, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD, TERC_NIT, c.coti_sucursal
            FROM COTIZACIONES C, COTIZACIONES_DETALLE D, PREFIJOS P, ARTICULO A
            WHERE C.COTI_ID = D.COTI_ID AND P.PREF_PRE = C.PREF_PRE AND P.TIDO_COD = 34 AND D.ARTI_COD = A.ARTI_COD AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            TERC_NIT >= :TERINI AND TERC_NIT <= :TERFIN AND COTI_FECHA >= :FECINI AND
            COTI_FECHA <= :FECFIN AND COTI_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            ORDER BY TERC_NIT, c.coti_sucursal, ARTI_COD, COTI_FECHA
            INTO :PREFIJO, :NUMERO, :FECHA, CANTIDAD, :BASE, :IVA, :CONSUMO, :dto, :TOTAL, :ARTICULO, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :NIT, :sucursal
            DO
            BEGIN
            select TERC_NOM, TERC_TEL, TERC_CIU, C.ZONA_COD, TERC_DV from terceros T, CLIENTES C
                where C.TERC_NIT = T.TERC_NIT AND T.TERC_NIT = :NIT
                INTO :NOMBRE, :TELEFONO, :CIUDAD, :CODZONA, :DV;
            SELECT ZONA_NOM FROM ZONAS WHERE ZONA_COD = :CODZONA INTO :NOMZONA;
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            SUSPEND;
            END
        END
    END
END
^

SET TERM ; ^


/* 20090421 */
/* incluir grupo de cartera en el reporte */

SET TERM ^ ;

CREATE OR ALTER PROCEDURE REP_CLIENTES(
    DESDE VARCHAR(20),
    HASTA VARCHAR(20),
    ZONINI VARCHAR(5),
    ZONFIN VARCHAR(5),
    VENINI INTEGER,
    VENFIN INTEGER,
    AGRUPA CHAR(1),
    ORDEN CHAR(1),
    INACTIVOS CHAR(1))
RETURNS (
    NIT VARCHAR(20),
    NOM VARCHAR(60),
    SUC VARCHAR(10),
    DIR VARCHAR(60),
    CIU VARCHAR(40),
    TEL VARCHAR(40),
    CONTACTO VARCHAR(60),
    OBS VARCHAR(255),
    EMAIL VARCHAR(100),
    FAX VARCHAR(25),
    CEL VARCHAR(25),
    CODCLIE VARCHAR(20),
    CODCIU VARCHAR(6),
    ZONA VARCHAR(2),
    ESTADO CHAR(1),
    RTEFTE NUMERIC(9,4),
    RTEIVA NUMERIC(9,4),
    RTEICA NUMERIC(9,4),
    RTFTEBASE NUMERIC(18,2),
    DTOMAX NUMERIC(9,4),
    CUPO NUMERIC(18,2),
    COBR INTEGER,
    VEND INTEGER,
    GRUPOC INTEGER,
    ANIV DATE,
    CLIDESDE DATE,
    LISTA INTEGER,
    DIAS INTEGER,
    DIASBLOQ INTEGER,
    DETALLE CHAR(1),
    NOMLISTA VARCHAR(30),
    NOMVEND VARCHAR(60),
    NOMCOBR VARCHAR(60),
    NOMZONA VARCHAR(60),
    NOMCIUD VARCHAR(60),
    NOMGRP VARCHAR(60),
    CTACLIE VARCHAR(20),
    CTAVNTA VARCHAR(20),
    CTARTFTE VARCHAR(20),
    CTARTIVA VARCHAR(20),
    CTARTICA VARCHAR(20))
AS
declare variable NITINI VARCHAR(20);
declare variable NITFIN VARCHAR(20);
declare variable NOMINI VARCHAR(20);
declare variable NOMFIN VARCHAR(20);
declare variable NUMROWS INTEGER;
begin
if (ORDEN = 'C') then
    BEGIN
    NITINI = DESDE;
    NITFIN = HASTA;
    NOMINI = '';
    NOMFIN = 'zz';
    END
ELSE
    BEGIN
    NOMINI = DESDE;
    NOMFIN = HASTA;
    NITINI = '';
    NITFIN = 'zz';
    END

for select t.terc_nit,terc_nom,terc_dir,terc_ciu,terc_tel,terc_contacto,SUBSTRING(TERC_OBS FROM 1 FOR 255),
    terc_email,terc_fax,terc_cel,c.clie_cod,c.zona_cod,c.clie_estado,c.clie_rtefte,c.clie_rteiva,c.clie_rteica,c.clie_rtftebase,c.clie_dtomax,
    c.clie_cupo,c.vend_cod, c.cobr_cod, c.clie_aniv, c.clie_fecha, c.lipr_cod, c.clie_dias, c.clie_diasbloq, c.clie_detalle,
    terc_ctartfte,terc_ctartiva,terc_ctartica,terc_ctaventa,terc_ctacliente, T.ciud_cod, c.grca_cod
    from terceros t,clientes c where t.terc_nit = c.terc_nit and t.terc_nit >= :nitini and t.terc_nit <= :nitfin and terc_nom >= :nomini and terc_nom <= :nomfin
    into :nit, :nom, :dir, :ciu, :tel, :contacto, :obs,
    :email, :fax, :cel, :codclie, :zona, :estado, :rtefte, :rteiva, :rteica,
    :rtftebase, :dtomax, :cupo, :vend, :cobr, :aniv, :clidesde, :lista, :dias, :diasbloq, :detalle,
    :ctartfte, :ctartiva, :ctartica, :ctavnta, :ctaclie, :codciu, :grupoc
    do
    begin
    if ((inactivos = 'S') or (estado <> 'I'))  then
        begin
        SUC = '';
        nomlista = '';
        select lipr_nom from LISTA_PRECIOS where lipr_cod = :lista into nomlista;
        SELECT COUNT(*) FROM CLIENTE_SUCURSALES WHERE TERC_NIT = :NIT INTO :NUMROWS;
        if (NUMROWS > 1) then
            BEGIN
            FOR SELECT CLCU_COD, CLSU_NOMBRE, CLSU_DIR, CLSU_CIUDAD, CLSU_TEL, SUBSTRING(CLSU_OBS FROM 1 FOR 255), VEND_COD, COBR_COD, ZONA_COD
                FROM cliente_sucursales WHERE TERC_NIT = :NIT ORDER BY CLCU_COD
                INTO :SUC, :nom, :dir, :ciu, :tel, :obs, :vend, :cobr, :zona
                DO
                BEGIN
                nomzona = '';
                nomcobr = '';
                nomciud = '';
                nomvend = '';
                select zona_nom from zonas where zona_cod = :zona into :nomzona;
                select cobr_nom from cobradores where cobr_cod = :cobr into nomcobr;
                select vend_nombre from vendedores where vend_cod = :vend into nomvend;
                select ciud_nom from ciudades where ciud_cod = :codciu into nomciud;
                select GRCA_NOMBRE from grupo_cartera where grca_cod = :grupoc into nomgrp;
                if (AGRUPA = 'V') then
                  begin
                  if ((vend >= :venini) and (vend <= :venfin)) then
                    suspend;
                  end
                else
                  if (AGRUPA = 'B') then
                    begin
                    if ((cobr >= :venini) and (cobr <= :venfin)) then
                        suspend;
                    end
                  else
                    if (AGRUPA = 'Z') then
                      begin
                      if ((zona >= :zonini) and (zona <= :zonfin)) then
                        suspend;
                      end
                    else
                      if (AGRUPA = 'C') then
                        begin
                        if ((codciu >= :zonini) and (codciu <= :zonfin)) then
                          suspend;
                        end
                      else
                        suspend;
                end
            END
        ELSE
            BEGIN
            nomzona = '';
            nomcobr = '';
            nomciud = '';
            nomvend = '';
            select zona_nom from zonas where zona_cod = :zona into :nomzona;
            select cobr_nom from cobradores where cobr_cod = :cobr into nomcobr;
            select vend_nombre from vendedores where vend_cod = :vend into nomvend;
            select ciud_nom from ciudades where ciud_cod = :codciu into nomciud;
            select GRCA_NOMBRE from grupo_cartera where grca_cod = :grupoc into nomgrp;
            if (AGRUPA = 'V') then
                begin
                if ((vend >= :venini) and (vend <= :venfin)) then
                    suspend;
                end
            else
                if (AGRUPA = 'B') then
                    begin
                    if ((cobr >= :venini) and (cobr <= :venfin)) then
                        suspend;
                    end
                else
                    if (AGRUPA = 'Z') then
                      begin
                      if ((zona >= :zonini) and (zona <= :zonfin)) then
                        suspend;
                      end
                    else
                      if (AGRUPA = 'C') then
                        begin
                        if ((codciu >= :zonini) and (codciu <= :zonfin)) then
                          suspend;
                        end
                      else
                        suspend;
            END
        end
    end
end
^

SET TERM ; ^


/* 20090422 */
/* STRING TRUNCATION POR ODEN CAMPOS DV, CEL */
SET TERM ^ ;

CREATE OR ALTER PROCEDURE IMPR_COTIZACION(
    ID INTEGER)
RETURNS (
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    VALIDEZ INTEGER,
    NIT VARCHAR(20),
    NOMTERCERO VARCHAR(60),
    VENDEDOR INTEGER,
    NOMVENDEDOR VARCHAR(60),
    PUNTOVTA INTEGER,
    NOMPUNTOVTA VARCHAR(60),
    SUBTOTAL NUMERIC(18,2),
    DTOPORC NUMERIC(9,2),
    DTOMONTO NUMERIC(18,2),
    ADICIONAL NUMERIC(18,2),
    IVAMONTO NUMERIC(18,2),
    EXTRA NUMERIC(18,2),
    TOTALFAC NUMERIC(18,2),
    OBS BLOB SUB_TYPE 1 SEGMENT SIZE 80,
    ITEM INTEGER,
    ARTICULO VARCHAR(15),
    CODBAR VARCHAR(15),
    ARTIDES VARCHAR(60),
    CANT NUMERIC(18,4),
    UNIDAD VARCHAR(8),
    FACTOR NUMERIC(18,4),
    LISTAPR INTEGER,
    REFITEM VARCHAR(60),
    PRUNIT NUMERIC(18,2),
    DTOITPORC NUMERIC(9,2),
    DTOITMONTO NUMERIC(18,2),
    PRNETO NUMERIC(18,2),
    PRNETOSINIVA NUMERIC(18,2),
    IVAPORC NUMERIC(9,2),
    IVAITMONTO NUMERIC(18,2),
    CONSUMO NUMERIC(18,2),
    SUBTOTIT NUMERIC(18,2),
    TOTAL NUMERIC(18,2),
    CODIGOCL VARCHAR(20),
    ZONACOD VARCHAR(2),
    ZONANOM VARCHAR(60),
    DV CHAR(1),
    DIRECCION VARCHAR(60),
    CIUDAD VARCHAR(40),
    TELEFONO VARCHAR(40),
    CONTACTO VARCHAR(60),
    FAX VARCHAR(25),
    CEL VARCHAR(25),
    GRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    SUBGRUPO VARCHAR(3),
    NOMSUBG VARCHAR(30),
    MARCA VARCHAR(3),
    NOMMARCA VARCHAR(30),
    PESO NUMERIC(9,4),
    ANCHO NUMERIC(18,4),
    ALTO NUMERIC(18,4),
    LARGO NUMERIC(18,4),
    SUMA1 NUMERIC(18,2),
    SUMA2 NUMERIC(18,2),
    SUMA3 NUMERIC(18,2),
    IVA1 NUMERIC(18,2),
    IVA2 NUMERIC(18,2),
    IVA3 NUMERIC(18,2),
    SUMAEX NUMERIC(18,2),
    SUMAGR NUMERIC(18,2),
    OBSITEM BLOB SUB_TYPE 1 SEGMENT SIZE 80,
    ALTERNATIVAS NUMERIC(18,4),
    PRINCIPALES NUMERIC(18,4))
AS
DECLARE VARIABLE IMPTOS CHAR(1);
DECLARE VARIABLE TARIFA INTEGER;
declare variable ORDENCOD CHAR(2);
declare variable SUCUR VARCHAR(10);
declare variable ICOINC CHAR(2);
declare variable FACTCANT NUMERIC(18,4);
BEGIN
execute procedure lee_configuracion('FACTURACION', 'ARTICULOS', 'IMPOCONSUMO INCLUIDO EN EL PRECIO BASE DE VENTA ANTES DE IVA') returning_values (icoinc);
SELECT F.PREF_PRE, COTI_NUMERO, COTI_FECHA, COTI_VALIDEZ, F.TERC_NIT, COTI_NOMTERC, F.VEND_COD, VEND_NOMBRE, F.PTVT_ID, PTVT_NOM,
    COTI_IMPTOS, COTI_DTOPORC, COTI_DTOMONTO, COTI_ADICIONAL, COTI_IVAMONTO, COTI_EXTRA, COTI_TOTAL,
    TERC_CONTACTO, TERC_FAX, TERC_CEL, TERC_DV, COTI_OBS, COTI_SUCURSAL
    FROM COTIZACIONES F, VENDEDORES V, PUNTO_VENTA P, TERCEROS T
    WHERE F.VEND_COD = V.VEND_COD AND F.PTVT_ID = P.PTVT_ID AND F.TERC_NIT = T.TERC_NIT AND F.COTI_ID = :ID
    into :PREF, :NUMERO, :FECHA, :VALIDEZ, :NIT, :NOMTERCERO, :VENDEDOR, :NOMVENDEDOR, :PUNTOVTA, :NOMPUNTOVTA,
    :IMPTOS, :DTOPORC, :DTOMONTO, :ADICIONAL, :IVAMONTO, :EXTRA, :TOTALFAC,
    :CONTACTO, :FAX, :CEL, :DV, :OBS, :SUCUR;
SUBTOTAL = TOTALFAC - EXTRA - IVAMONTO - ADICIONAL + DTOMONTO;

SELECT CLIE_COD, C.ZONA_COD, ZONA_NOM
    FROM CLIENTES C, ZONAS Z
    WHERE TERC_NIT = :NIT AND C.ZONA_COD = Z.ZONA_COD
    INTO :CODIGOCL, :ZONACOD, :ZONANOM;
SELECT CLSU_DIR, CLSU_CIUDAD, CLSU_TEL FROM CLIENTE_SUCURSALES WHERE TERC_NIT = :NIT AND CLCU_COD = :SUCUR
    INTO :DIRECCION, :CIUDAD, :TELEFONO;
    
SUMAEX = 0;
SUMA1 = 0;
SUMA2 = 0;
SUMA3 = 0;
IVA1 = 0;
IVA2 = 0;
IVA3 = 0;
ITEM = 0;
EXECUTE PROCEDURE lee_configuracion ('FACTURACION','DOCUMENTOS','ORDENAR ITEMS POR CODIGO DE ARTICULO') returning_values (:ORDENCOD);
if (ORDENCOD = 'SI') then
    BEGIN
    FOR SELECT D.ARTI_COD, CTDE_CODBAR, SUBSTR(CTDE_DESC,1,60), CTDE_CANT, CTDE_UNIDAD, LIPR_COD, CTDE_PRUNIT, CTDE_DTOPORC, CTDE_DTOMONTO, CTDE_IVAPORC, CTDE_IVAMONTO, CTDE_CONSUMO, CTDE_TOTAL, CTDE_REFERENCIA,
        GRUP_COD, SUBG_COD, MARC_COD, ARTI_PESO, ARTI_ANCHO, ARTI_ALTO, ARTI_LARGO, TAIV_COD, CTDE_OBS, CTDE_FACTOR
        FROM COTIZACIONES_DETALLE D, ARTICULO A
        WHERE D.ARTI_COD = A.ARTI_COD AND D.COTI_ID = :ID
        ORDER BY CTDE_CODBAR
        INTO :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :LISTAPR, :PRUNIT, :DTOITPORC, :DTOITMONTO, :IVAPORC, :IVAITMONTO, :CONSUMO, :TOTAL, :refitem,
        :GRUPO, :SUBGRUPO, :MARCA, :PESO, :ANCHO, :ALTO, :LARGO, :TARIFA, :obsitem, :FACTOR
        DO
        BEGIN
        if (ICOINC = 'SI') then
            SUBTOTIT = TOTAL - IVAITMONTO;
        else
            SUBTOTIT = TOTAL - IVAITMONTO - CONSUMO;
        if (ARTICULO = CODBAR) then
            SELECT FIRST 1 COBA_COD FROM barras_articulo WHERE ARTI_COD = :articulo INTO :CODBAR;
        SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :GRUPO INTO NOMGRUPO;
        SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :MARCA INTO NOMMARCA;
        SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :SUBGRUPO AND GRUP_COD = :GRUPO INTO :NOMSUBG;
        ITEM = ITEM + 1;
        PRNETO = PRUNIT - DTOITMONTO;
        if (PESO IS NULL) then
            PESO = 0;
        PESO = PESO / 1000 * CANT * FACTOR;
        if (IMPTOS = 'S') then
            if (cant <> 0) then
                prnetosiniva = PRUNIT - DTOITMONTO - ((IVAITMONTO+CONSUMO) / CANT);
            else
                prnetosiniva = PRUNIT - DTOITMONTO;
        ELSE
            prnetosiniva = PRUNIT - DTOITMONTO;
        if (ivaporc = 0) then
            SUMAEX = SUMAEX + TOTAL;
        if (TARIFA = 1) then
            BEGIN
            SUMA1 = SUMA1 + TOTAL - IVAITMONTO;
            IVA1 = IVA1 + IVAITMONTO;
            END
        if (TARIFA = 2) then
            BEGIN
            SUMA2 = SUMA2 + TOTAL - IVAITMONTO;
            IVA2 = IVA2 + IVAITMONTO;
            END
        if (TARIFA = 3) then
            BEGIN
            SUMA3 = SUMA3 + TOTAL - IVAITMONTO;
            IVA3 = IVA3 + IVAITMONTO;
            END
        SUMAGR = SUMA1 + SUMA2 + SUMA3;
        if (IMPTOS = 'N') then
            TOTAL = TOTAL - IVAITMONTO;
        factcant = NULL;
        SELECT FIRST 1 UNAR_FACCAN FROM unidad_articulo WHERE ARTI_COD = :articulo INTO :factcant;
        if ((factcant IS NULL) or (FACTCANT = 0)) then
            factcant = 1;
        ALTERNATIVAS = FLOOR(CANT / factcant);
        PRINCIPALES = CANT - (alternativas * factcant);
        SUSPEND;
        END
    END
ELSE
    BEGIN
    FOR SELECT D.ARTI_COD, CTDE_CODBAR, SUBSTR(CTDE_DESC,1,60), CTDE_CANT, CTDE_UNIDAD, LIPR_COD, CTDE_PRUNIT, CTDE_DTOPORC, CTDE_DTOMONTO, CTDE_IVAPORC, CTDE_IVAMONTO, CTDE_CONSUMO, CTDE_TOTAL, CTDE_REFERENCIA,
        GRUP_COD, SUBG_COD, MARC_COD, ARTI_PESO, ARTI_ANCHO, ARTI_ALTO, ARTI_LARGO, TAIV_COD, CTDE_OBS, CTDE_FACTOR
        FROM COTIZACIONES_DETALLE D, ARTICULO A
        WHERE D.ARTI_COD = A.ARTI_COD AND D.COTI_ID = :ID
        ORDER BY CTDE_ITEM
        INTO :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :LISTAPR, :PRUNIT, :DTOITPORC, :DTOITMONTO, :IVAPORC, :IVAITMONTO, :CONSUMO, :TOTAL, :refitem,
        :GRUPO, :SUBGRUPO, :MARCA, :PESO, :ANCHO, :ALTO, :LARGO, :TARIFA, :obsitem, :FACTOR
        DO
        BEGIN
        SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :GRUPO INTO NOMGRUPO;
        SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :MARCA INTO NOMMARCA;
        SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :SUBGRUPO AND GRUP_COD = :GRUPO INTO :NOMSUBG;
        ITEM = ITEM + 1;
        if (ICOINC = 'SI') then
            SUBTOTIT = TOTAL - IVAITMONTO;
        else
            SUBTOTIT = TOTAL - IVAITMONTO - CONSUMO;
        PRNETO = PRUNIT - DTOITMONTO;
        if (PESO IS NULL) then
            PESO = 0;
        PESO = PESO / 1000 * CANT * FACTOR;
        if (IMPTOS = 'S') then
            if (cant <> 0) then
                prnetosiniva = PRUNIT - DTOITMONTO - ((IVAITMONTO+CONSUMO) / CANT);
            else
                prnetosiniva = PRUNIT - DTOITMONTO;
        ELSE
            prnetosiniva = PRUNIT - DTOITMONTO;
        if (ivaporc = 0) then
            SUMAEX = SUMAEX + TOTAL;
        if (TARIFA = 1) then
            BEGIN
            SUMA1 = SUMA1 + TOTAL - IVAITMONTO;
            IVA1 = IVA1 + IVAITMONTO;
            END
        if (TARIFA = 2) then
            BEGIN
            SUMA2 = SUMA2 + TOTAL - IVAITMONTO;
            IVA2 = IVA2 + IVAITMONTO;
            END
        if (TARIFA = 3) then
            BEGIN
            SUMA3 = SUMA3 + TOTAL - IVAITMONTO;
            IVA3 = IVA3 + IVAITMONTO;
            END
        SUMAGR = SUMA1 + SUMA2 + SUMA3;
        if (IMPTOS = 'N') then
            TOTAL = TOTAL - IVAITMONTO;
        factcant = NULL;
        SELECT FIRST 1 UNAR_FACCAN FROM unidad_articulo WHERE ARTI_COD = :articulo INTO :factcant;
        if ((factcant IS NULL) or (FACTCANT = 0)) then
            factcant = 1;
        ALTERNATIVAS = FLOOR(CANT / factcant);
        PRINCIPALES = CANT - (alternativas * factcant);
        SUSPEND;
        END
    END
END
^

SET TERM ; ^

/* 20090422B : OPTIMIZAR CONSULTA Y REPORTE DE EXISTENCIAS */

CREATE INDEX ORDENINVENTARIO_DETALLE_IDX1
ON ORDENINVENTARIO_DETALLE (ARTI_COD);
CREATE INDEX RESERVAS_DETALLE_IDX1
ON RESERVAS_DETALLE (ARTI_COD);
CREATE INDEX ORDENES_INVENTARIO_IDX1
ON ORDENES_INVENTARIO (ORIN_FECHA);
CREATE INDEX ORDENES_INVENTARIO_IDX2
ON ORDENES_INVENTARIO (ORIN_FECLLEGA);
CREATE INDEX RESERVAS_IDX1
ON RESERVAS (RESE_FECHA);
CREATE INDEX RESERVAS_IDX2
ON RESERVAS (RESE_VENCE);

ALTER TABLE ORDENES_COMPRA
ADD ORDC_VENCE DATE;

ALTER TRIGGER ORDENES_COMPRA_AU INACTIVE;

UPDATE ORDENES_COMPRA SET ORDC_VENCE = ORDC_FECHA + ORDC_VALIDEZ;
COMMIT WORK;

ALTER TRIGGER ORDENES_COMPRA_AU ACTIVE;

CREATE INDEX ORDENES_COMPRA_IDX2
ON ORDENES_COMPRA (ORDC_VENCE);
SET TERM ^ ;

CREATE OR ALTER TRIGGER ORDENES_COMPRA_BI FOR ORDENES_COMPRA
ACTIVE BEFORE INSERT POSITION 0
AS
declare variable NUMERO VARCHAR(6);
declare variable AUTOM CHAR(1);
declare variable EXISTE CHAR(1);
BEGIN
NEW.ordc_vence = NEW.ordc_fecha + NEW.ordc_validez;
if (NEW.numok = 'N') then
    BEGIN
    /* Actualice el contador del prefijo */
    SELECT PREF_ACTUAL, PREF_AUTO FROM PREFIJOS WHERE TIDO_COD = 23 AND PREF_PRE = NEW.PREF_PRE INTO :NUMERO, :AUTOM;
    /* ACTUALICE EL NUMERO EN COMPROBANTE_ENCABEZADO  */
    if (AUTOM = 'S') then
        BEGIN
        NEW.ORDC_numero = NUMERO;
        NUMERO = CAST((CAST(NUMERO AS INTEGER) + 1) AS CHAR(6));
        UPDATE PREFIJOS
          SET PREF_ACTUAL = :NUMERO
        WHERE TIDO_COD = 23 AND PREF_PRE = NEW.PREF_PRE;
        END
    ELSE
        BEGIN
        if (CAST(NUMERO AS INTEGER) = CAST(NEW.ORDC_NUMERO AS INTEGER)) then
            UPDATE PREFIJOS
              SET PREF_ACTUAL = CAST((CAST(PREF_ACTUAL AS INTEGER) + 1) AS CHAR(6))
            WHERE TIDO_COD = 23 AND PREF_PRE = NEW.PREF_PRE;
        END
      EXECUTE PROCEDURE COMPLETA_CEROS (NEW.ORDC_numero) returning_values (NEW.ORDC_numero);
  NEW.numok = 'S';
  END
/* Verifique que el numero no existe previamente */
EXISTE = 'N';
SELECT 'S' FROM ORDENES_COMPRA WHERE PREF_PRE = NEW.PREF_PRE AND ORDC_NUMERO = NEW.ORDC_NUMERO INTO :EXISTE;
if (EXISTE = 'S') then
    EXCEPTION DOCUMENTO_REGISTRADO 'Ya existe una orden de compra con el número ' || new.pref_pre || new.ordc_numero;
END
^

SET TERM ; ^

ALTER TABLE PEDIDOS
ADD PEDI_VENCE DATE;

ALTER TRIGGER PEDIDOS_AU INACTIVE;

UPDATE PEDIDOS SET PEDI_VENCE = PEDI_FECHA + PEDI_VALIDEZ;
COMMIT WORK;

ALTER TRIGGER PEDIDOS_AU ACTIVE;

CREATE INDEX PEDIDOS_IDX4
ON PEDIDOS (PEDI_VENCE);

SET TERM ^ ;

CREATE OR ALTER TRIGGER PEDIDOS_BI FOR PEDIDOS
ACTIVE BEFORE INSERT POSITION 0
AS
declare variable NUMERO VARCHAR(6);
declare variable AUTOM CHAR(1);
declare variable EXISTE CHAR(1);
/*DECLARE VARIABLE VALCUPO CHAR(10);*/
declare variable CUPOPED CHAR(10);
declare variable DISPONIBLE NUMERIC(18,2);
declare variable OK CHAR(1);
declare variable FECSERVER CHAR(2);
BEGIN
NEW.pedi_vence = NEW.pedi_fecha + NEW.pedi_validez;

EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION', 'DOCUMENTOS', 'INHABILITAR FECHA EN DOCUMENTOS') returning_values (:fecserver);
if (FECSERVER = 'SI') then
    NEW.pedi_fecha = CAST ('NOW' AS DATE);
OK = 'S';
/*EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'ACCION A TOMAR SI EL CUPO DE CREDITO ES INSUFICIENTE') RETURNING_VALUES (:VALCUPO);*/
EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION','PEDIDOS','VALIDAR CUPO DE CREDITO EN EL PEDIDO') RETURNING_VALUES (:CUPOPED);
IF (CUPOPED = 'PROHIBIR') THEN /*AND (CUPOPED = 'SI')) THEN*/
  BEGIN
  OK = 'N';
  /* VERIFIQUE EL CUPO DE CREDITO */
  execute procedure cupo_disponible(new.TERC_NIT, NEW.pedi_fecha, NEW.pedi_sucursal) returning_values (:DISPONIBLE);
  if (DISPONIBLE >= NEW.pedi_total) then
    OK = 'S';
  END
IF (OK = 'S') THEN
  begin
  if (NEW.NUMOK = 'N') then
    BEGIN
    /* Actualice el contador del prefijo */
    SELECT PREF_ACTUAL, PREF_AUTO FROM PREFIJOS WHERE TIDO_COD = 34 AND PREF_PRE = NEW.PREF_PRE INTO :NUMERO, :AUTOM;
    /* ACTUALICE EL NUMERO EN COMPROBANTE_ENCABEZADO  */
    if (AUTOM = 'S') then
        BEGIN
        NEW.PEDI_NUMERO = NUMERO;
        NUMERO = CAST((CAST(NUMERO AS INTEGER) + 1) AS CHAR(6));
        UPDATE PREFIJOS
          SET PREF_ACTUAL = :NUMERO
          WHERE TIDO_COD = 34 AND PREF_PRE = NEW.PREF_PRE;
        END
    ELSE
        BEGIN
        if (CAST(NUMERO AS INTEGER) = CAST(NEW.PEDI_NUMERO AS INTEGER)) then
            UPDATE PREFIJOS
                SET PREF_ACTUAL = CAST((CAST(PREF_ACTUAL AS INTEGER) + 1) AS CHAR(6))
                WHERE TIDO_COD = 34 AND PREF_PRE = NEW.PREF_PRE;
        END
    EXECUTE PROCEDURE COMPLETA_CEROS (NEW.PEDI_numero) returning_values (NEW.PEDI_numero);
    NEW.NUMOK = 'S';
    END
  /* Verifique que el numero no existe previamente */
  EXISTE = 'N';
  SELECT 'S' FROM PEDIDOS WHERE PREF_PRE = NEW.PREF_PRE AND PEDI_NUMERO = NEW.PEDI_NUMERO INTO :EXISTE;
  if (EXISTE = 'S') then
    EXCEPTION DOCUMENTO_REGISTRADO 'Ya existe un pedido con el número ' || new.pref_pre || new.pedi_numero;
  END
else
  begin
  EXCEPTION CUPO_INSUFICIENTE;
  end
if ((new.PEDI_TOTAL-new.PEDI_IVAMONTO+new.PEDI_DTOMONTO-new.PEDI_ADICIONAL) = 0) then
    NEW.PEDI_FACTOR = 1;
else
    NEW.PEDI_FACTOR = (new.PEDI_TOTAL-new.PEDI_IVAMONTO)/(new.PEDI_TOTAL-new.PEDI_IVAMONTO+new.PEDI_DTOMONTO-new.PEDI_ADICIONAL);
END
^

SET TERM ; ^

CREATE INDEX ARTICULO_IDX1
ON ARTICULO (ARTI_DES);


SET TERM ^ ;

CREATE OR ALTER PROCEDURE EXISTENCIAS_DESDE_HASTA(
    FECHA DATE,
    ARTINI VARCHAR(20),
    ARTFIN VARCHAR(20),
    GRPINI VARCHAR(3),
    GRPFIN VARCHAR(3),
    BODINI VARCHAR(2),
    BODFIN VARCHAR(2),
    ORDEN CHAR(1),
    AGRUPA CHAR(1),
    DETALLE CHAR(1),
    RESERVA CHAR(1),
    ENPESO CHAR(1),
    SUCURSAL INTEGER)
RETURNS (
    CANT NUMERIC(18,4),
    COSTO NUMERIC(18,2),
    COSTO_LOTE NUMERIC(18,2),
    CODIGO VARCHAR(15),
    NOMBRE VARCHAR(60),
    UNIDAD VARCHAR(8),
    STAND VARCHAR(15),
    CODGRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    CODSUBG VARCHAR(3),
    NOMSUBG VARCHAR(30),
    CODMARC VARCHAR(3),
    NOMMARC VARCHAR(30),
    CODBOD VARCHAR(2),
    LOTE VARCHAR(15),
    NOMBOD VARCHAR(30),
    COSTOTOT NUMERIC(18,2),
    ULTCOSTO NUMERIC(18,2),
    FECHACOSTO DATE,
    CONSUMO NUMERIC(18,2),
    RESERVADO NUMERIC(18,4),
    ORDENADO NUMERIC(18,4),
    IVA NUMERIC(9,2),
    PESOUNIT NUMERIC(18,4),
    PESOTOTAL NUMERIC(18,4),
    CODBAR VARCHAR(20))
AS
declare variable exist char(1);
declare variable codini varchar(20);
declare variable codfin varchar(20);
declare variable desini varchar(20);
declare variable desfin varchar(20);
declare variable ordenc numeric(18,4);
declare variable pedido numeric(18,4);
declare variable ok char(1);
declare variable id integer;
declare variable item integer;
declare variable und varchar(8);
declare variable factor numeric(18,4);
declare variable cant2 numeric(18,4);
declare variable PEDAUTO CHAR(2);
BEGIN
if (ORDEN = 'C') then
    BEGIN
    CODINI = ARTINI;
    CODFIN = ARTFIN;
    DESINI = '';
    DESFIN = 'zz';
    END
ELSE
    BEGIN
    DESINI = ARTINI;
    DESFIN = ARTFIN;
    CODINI = '';
    CODFIN = 'zz';
    END
EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION', 'FACTURAS', 'GENERAR PEDIDO AUTOMATICAMENTE CON LA FACTURA') returning_values (pedauto);
if (DETALLE = 'B') then
  BEGIN
  FOR SELECT ARTI_COD, ARTI_DES, ARTI_UNIDAD, ARTI_EXIST, TAIV_PORC, A.GRUP_COD, A.SUBG_COD, A.MARC_COD, BODE_COD, BODE_NOM, ARTI_CONSUMO, ARTI_PESO/1000
      FROM ARTICULO A, BODEGA B, TARIFA_IVA T
      WHERE ARTI_COD >= :CODINI AND ARTI_COD <= :CODFIN AND ARTI_DES >= :DESINI AND ARTI_DES <= :DESFIN AND ESAR_COD <> 'I' AND BODE_COD >= :BODINI AND
      BODE_COD <= :BODFIN AND ((SUCU_ID = :SUCURSAL) or (:SUCURSAL = 0)) AND A.TAIV_COD = T.TAIV_COD
      INTO :CODIGO, :NOMBRE, :UNIDAD, :EXIST, :IVA, :CODGRUPO, :CODSUBG, :CODMARC, :CODBOD, :NOMBOD, :CONSUMO, :pesounit
      DO
        BEGIN
        STAND = '';
        OK = 'N';
        if (AGRUPA = 'G') then
            BEGIN
            if ((CODGRUPO >= GRPINI) AND (CODGRUPO <= GRPFIN)) then
                OK = 'S';
            end
        ELSE
            if (AGRUPA = 'M') then
                BEGIN
                if ((CODMARC >= GRPINI) AND (CODMARC <= GRPFIN)) then
                    OK = 'S';
                END
        if (OK = 'S') then
            BEGIN
            NOMGRUPO = '';
            NOMMARC = '';
            NOMSUBG = '';
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            SELECT MAX(COBA_COD) FROM BARRAS_ARTICULO WHERE ARTI_COD = :codigo AND COBA_UNIDAD = :unidad INTO :codbar;
            if (CODBAR IS NULL) then
                CODBAR = CODIGO;
            if (EXIST <> 'N') then
                BEGIN
                SELECT STAND_COD FROM STANDS WHERE ARTI_COD = :CODIGO AND STAND_BODEGA = :CODBOD INTO :STAND;
                EXECUTE PROCEDURE SALDO_INICIAL_INVENTARIO(CODIGO, FECHA, :CODBOD) returning_values (CANT);
                EXECUTE PROCEDURE COSTO_PROMEDIO_UNIDAD(CODIGO, FECHA, UNIDAD) returning_values (COSTO);
                EXECUTE PROCEDURE ULTIMO_COSTO(CODIGO, FECHA, UNIDAD) returning_values (ULTCOSTO);
                SELECT MAX(MVAR_FECHA) FROM MOVIMIENTO_ARTICULO WHERE ARTI_COD = :CODIGO AND MVAR_ENTRADA = 'S' AND MVAR_FECHA <= :FECHA INTO :FECHACOSTO;
                COSTOTOT = :CANT * :COSTO;
                CONSUMO = CONSUMO * CANT;
                if (RESERVA = 'S') then
                    BEGIN
                    SELECT SUM(ORID_ENTREGAR)
                        FROM ORDENINVENTARIO_DETALLE OD, ordenes_inventario O
                        WHERE O.ORIN_ID = OD.ORIN_ID AND ARTI_COD = :CODIGO AND ORIN_FECHA <= :FECHA AND ORIN_FECLLEGA >= :FECHA AND ORID_ANULADO = 'N' AND OD.BODE_COD = :CODBOD
                        INTO :ORDENADO;
                    if (ORDENADO IS NULL) then
                        ORDENADO = 0;
                    ORDENC = 0;
                    FOR SELECT O.ORDC_ID, OCDE_ITEM, OCDE_CANT * OCDE_FACTOR
                        FROM ORDENES_COMPRA O, ORDENES_COMPRA_DETALLE OD
                        WHERE O.ORDC_ID = OD.ORDC_ID AND OD.ARTI_COD = :CODIGO AND ORDC_VENCE >= :FECHA AND ORDC_FECHA <= :FECHA AND OCDE_ANULADO = 'N' AND OD.BODE_COD = :CODBOD
                        INTO :ID, :ITEM, :CANT2
                        do
                        BEGIN
                        EXECUTE PROCEDURE FALTANTE(23, 21, ID, ITEM) returning_values (PEDIDO, UND, FACTOR);
                        if (PEDIDO * FACTOR = CANT2) then /* SI NO SE HA FACTURADO MIRE A VER SI SE REMISIONO */
                            EXECUTE PROCEDURE FALTANTE(23, 22, ID, ITEM) returning_values (PEDIDO, UND, FACTOR);
                        if (PEDIDO IS NULL) then
                            PEDIDO = 0;
                        ORDENC = ORDENC + PEDIDO * FACTOR;
                        END
                    ORDENADO = ORDENADO + ORDENC;
                    SELECT SUM(RSDE_LIBERAR)
                        FROM RESERVAS_DETALLE RD, RESERVAS R
                        WHERE R.RESE_ID = RD.RESE_ID AND ARTI_COD = :CODIGO AND RESE_FECHA <= :FECHA AND RESE_VENCE >= :FECHA AND RD.BODE_COD = :CODBOD AND RSDE_ANULADO = 'N'
                        INTO :RESERVADO;
                    if (RESERVADO IS NULL) then
                        RESERVADO = 0;
                    PEDIDO = 0;
                    FOR SELECT P.PEDI_ID, PEDE_ITEM, PEDE_CANT * PEDE_FACTOR
                        FROM PEDIDOS P, PEDIDOS_DETALLE PD
                        WHERE P.PEDI_ID = PD.PEDI_ID AND PD.ARTI_COD = :CODIGO AND PEDI_VENCE >= :FECHA AND PEDI_FECHA <= :FECHA AND PEDE_ANULADO = 'N' AND BODE_COD = :CODBOD
                        INTO :ID, :ITEM, :CANT2
                        do
                        BEGIN
                        EXECUTE PROCEDURE FALTANTE(34, 31, ID, ITEM) returning_values (ORDENC, UND, FACTOR);
                        if ((ORDENC * FACTOR = CANT2) or (PEDAUTO = 'SI')) then /* SI NO SE HA FACTURADO MIRE A VER SI SE REMISIONO */
                            EXECUTE PROCEDURE FALTANTE(34, 32, ID, ITEM) returning_values (ORDENC, UND, FACTOR);
                        if (ORDENC IS NULL) then
                            ORDENC = 0;
                        PEDIDO = PEDIDO + ORDENC * FACTOR;
                        END
                    RESERVADO = RESERVADO + PEDIDO;
                    END
                ELSE
                    BEGIN
                    RESERVADO = 0;
                    ORDENADO = 0;
                    END
                if (ENPESO = 'S') then
                    BEGIN
                    if (pesounit IS NULL) then
                        pesounit = 0;
                    if (PESOUNIT <> 0) then
                        BEGIN
                        pesototal = PESOUNIT * cant;
                        SUSPEND;
                        END
                    END
                ELSE
                    SUSPEND;
                END
            END
        END
  END

if (DETALLE = 'L') then
  BEGIN
  FOR SELECT A.ARTI_COD, ARTI_DES, ARTI_UNIDAD, ARTI_EXIST, TAIV_PORC, A.GRUP_COD, A.SUBG_COD, A.MARC_COD, L.lote_nro, L.lote_nro||' - '||L.lote_vence, ARTI_CONSUMO,l.bode_cod, L.lote_saldo,l.lote_costo, ARTI_PESO/1000
      FROM ARTICULO A, LOTES l, TARIFA_IVA T
      WHERE A.ARTI_COD >= '0' AND A.ARTI_COD <= 'zz' AND ARTI_DES >= '' AND ARTI_DES <= 'zz' AND ESAR_COD <> 'I' AND A.TAIV_COD = T.TAIV_COD and a.arti_cod = l.arti_cod
      INTO :CODIGO, :NOMBRE, :UNIDAD, :EXIST, :IVA, :CODGRUPO, :CODSUBG, :CODMARC, :LOTE, :NOMBOD, :CONSUMO, :codbod, :cant, :costo_lote, :pesounit
      DO
        BEGIN
        OK = 'N';
        if (AGRUPA = 'G') then
            BEGIN
            if ((CODGRUPO >= GRPINI) AND (CODGRUPO <= GRPFIN)) then
                OK = 'S';
            end
        ELSE
            if (AGRUPA = 'M') then
                BEGIN
                if ((CODMARC >= GRPINI) AND (CODMARC <= GRPFIN)) then
                    OK = 'S';
                END
        if (OK = 'S') then
            BEGIN
            NOMGRUPO = '';
            NOMMARC = '';
            NOMSUBG = '';
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            SELECT MAX(COBA_COD) FROM BARRAS_ARTICULO WHERE ARTI_COD = :codigo AND COBA_UNIDAD = :unidad INTO :codbar;
            if (CODBAR IS NULL) then
                CODBAR = CODIGO;

            if (EXIST <> 'N') then
                BEGIN
                EXECUTE PROCEDURE COSTO_PROMEDIO_UNIDAD(CODIGO, FECHA, UNIDAD) returning_values (COSTO);
                EXECUTE PROCEDURE ULTIMO_COSTO(CODIGO, FECHA, UNIDAD) returning_values (ULTCOSTO);
                SELECT MAX(MVAR_FECHA) FROM MOVIMIENTO_ARTICULO WHERE ARTI_COD = :CODIGO AND MVAR_ENTRADA = 'S' AND MVAR_FECHA <= :FECHA INTO :FECHACOSTO;
                COSTOTOT = :CANT * :COSTO;
                CONSUMO = CONSUMO * CANT;
                if (RESERVA = 'S') then
                    BEGIN
                    SELECT SUM(ORID_ENTREGAR)
                        FROM ORDENINVENTARIO_DETALLE OD, ordenes_inventario O
                        WHERE O.ORIN_ID = OD.ORIN_ID AND ARTI_COD = :CODIGO AND ORIN_FECHA <= :FECHA AND ORIN_FECLLEGA >= :FECHA AND ORID_ANULADO = 'N'
                        INTO :ORDENADO;
                    if (ORDENADO IS NULL) then
                        ORDENADO = 0;
                    ORDENC = 0;
                    FOR SELECT O.ORDC_ID, OCDE_ITEM, OCDE_CANT * OCDE_FACTOR
                        FROM ORDENES_COMPRA O, ORDENES_COMPRA_DETALLE OD
                        WHERE O.ORDC_ID = OD.ORDC_ID AND OD.ARTI_COD = :CODIGO AND ORDC_VENCE >= :FECHA AND ORDC_FECHA <= :FECHA AND OCDE_ANULADO = 'N'
                        INTO :ID, :ITEM, :CANT2
                        do
                        BEGIN
                        EXECUTE PROCEDURE FALTANTE(23, 21, ID, ITEM) returning_values (PEDIDO, UND, FACTOR);
                        if (PEDIDO * FACTOR = CANT2) then /* SI NO SE HA FACTURADO MIRE A VER SI SE REMISIONO */
                            EXECUTE PROCEDURE FALTANTE(23, 22, ID, ITEM) returning_values (PEDIDO, UND, FACTOR);
                        if (PEDIDO IS NULL) then
                            PEDIDO = 0;
                        ORDENC = ORDENC + PEDIDO * FACTOR;
                        END
                    ORDENADO = ORDENADO + ORDENC;
                    SELECT SUM(RSDE_LIBERAR)
                        FROM RESERVAS_DETALLE RD, RESERVAS R
                        WHERE R.RESE_ID = RD.RESE_ID AND ARTI_COD = :CODIGO AND RESE_FECHA <= :FECHA AND RESE_VENCE >= :FECHA AND RSDE_ANULADO = 'N'
                        INTO :RESERVADO;
                    if (RESERVADO IS NULL) then
                        RESERVADO = 0;
                    PEDIDO = 0;
                    FOR SELECT P.PEDI_ID, PEDE_ITEM, PEDE_CANT * PEDE_FACTOR
                        FROM PEDIDOS P, PEDIDOS_DETALLE PD
                        WHERE P.PEDI_ID = PD.PEDI_ID AND PD.ARTI_COD = :CODIGO AND PEDI_VENCE >= :FECHA AND PEDI_FECHA <= :FECHA AND PEDE_ANULADO = 'N'
                        INTO :ID, :ITEM, :CANT2
                        do
                        BEGIN
                        EXECUTE PROCEDURE FALTANTE(34, 31, ID, ITEM) returning_values (ORDENC, UND, FACTOR);
                        if ((ORDENC * FACTOR = CANT2) or (PEDAUTO = 'SI')) then /* SI NO SE HA FACTURADO MIRE A VER SI SE REMISIONO */
                            EXECUTE PROCEDURE FALTANTE(34, 32, ID, ITEM) returning_values (ORDENC, UND, FACTOR);
                        if (ORDENC IS NULL) then
                            ORDENC = 0;
                        PEDIDO = PEDIDO + ORDENC * FACTOR;
                        END
                    RESERVADO = RESERVADO + PEDIDO;
                    END
                ELSE
                    BEGIN
                    RESERVADO = 0;
                    ORDENADO = 0;
                    END
                if (ENPESO = 'S') then
                    BEGIN
                    if (pesounit IS NULL) then
                        pesounit = 0;
                    if (PESOUNIT <> 0) then
                        BEGIN
                        pesototal = PESOUNIT * cant;
                        SUSPEND;
                        END
                    END
                ELSE
                    SUSPEND;
                END
            END
        END
  end
if (DETALLE = 'N') then
  BEGIN
  FOR SELECT ARTI_COD, ARTI_DES, ARTI_UNIDAD, ARTI_EXIST, TAIV_PORC, A.GRUP_COD, A.SUBG_COD, A.MARC_COD, ARTI_CONSUMO, ARTI_PESO/1000
      FROM ARTICULO A, TARIFA_IVA T
      WHERE ARTI_COD >= :CODINI AND ARTI_COD <= :CODFIN AND ARTI_DES >= :DESINI AND ARTI_DES <= :DESFIN AND ESAR_COD <> 'I' AND A.TAIV_COD = T.TAIV_COD
      INTO :CODIGO, :NOMBRE, :UNIDAD, :EXIST, :IVA, :CODGRUPO, :CODSUBG, :CODMARC, :CONSUMO, :pesounit
      DO
        BEGIN
        OK = 'N';
        if (AGRUPA = 'G') then
            BEGIN
            if ((GRPINI = '0') AND (GRPFIN = 'zz')) then
                OK = 'S';
            else
                if ((CODGRUPO >= GRPINI) AND (CODGRUPO <= GRPFIN)) then
                    OK = 'S';
            end
        ELSE
            if (AGRUPA = 'M') then
                BEGIN
                if ((GRPINI = '0') AND (GRPFIN = 'zzz')) then
                    OK = 'S';
                else
                    if ((CODMARC >= GRPINI) AND (CODMARC <= GRPFIN)) then
                        OK = 'S';
                END
        if (OK = 'S') then
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            SELECT MAX(COBA_COD) FROM BARRAS_ARTICULO WHERE ARTI_COD = :codigo AND COBA_UNIDAD = :unidad INTO :codbar;
            if (CODBAR IS NULL) then
                CODBAR = CODIGO;

            if (EXIST <> 'N') then
                BEGIN
                EXECUTE PROCEDURE SALDO_INICIAL_TOTAL_INV(CODIGO, FECHA) returning_values (CANT);
                EXECUTE PROCEDURE COSTO_PROMEDIO_UNIDAD(CODIGO, FECHA, UNIDAD) returning_values (COSTO);
                EXECUTE PROCEDURE ULTIMO_COSTO(CODIGO, FECHA, UNIDAD) returning_values (ULTCOSTO);
                SELECT MAX(MVAR_FECHA) FROM MOVIMIENTO_ARTICULO WHERE ARTI_COD = :CODIGO AND MVAR_ENTRADA = 'S' AND MVAR_FECHA <= :FECHA INTO :FECHACOSTO;
                COSTOTOT = :CANT * :COSTO;
                CONSUMO = CONSUMO * CANT;
                if (RESERVA = 'S') then
                    BEGIN
                    SELECT SUM(ORID_ENTREGAR)
                        FROM ORDENINVENTARIO_DETALLE OD, ordenes_inventario O
                        WHERE O.ORIN_ID = OD.ORIN_ID AND ARTI_COD = :CODIGO AND ORIN_FECHA <= :FECHA AND ORIN_FECLLEGA >= :FECHA AND ORID_ANULADO = 'N'
                        INTO :ORDENADO;
                        if (ORDENADO IS NULL) then
                            ORDENADO = 0;
                    ORDENC = 0;
                    FOR SELECT O.ORDC_ID, OCDE_ITEM, OCDE_CANT * OCDE_FACTOR
                        FROM ORDENES_COMPRA O, ORDENES_COMPRA_DETALLE OD
                        WHERE O.ORDC_ID = OD.ORDC_ID AND OD.ARTI_COD = :CODIGO AND ORDC_VENCE >= :FECHA AND ORDC_FECHA <= :FECHA AND OCDE_ANULADO = 'N'
                        INTO :ID, :ITEM, :CANT2
                        do
                        BEGIN
                        EXECUTE PROCEDURE FALTANTE(23, 21, ID, ITEM) returning_values (PEDIDO, UND, FACTOR);
                        if (PEDIDO * FACTOR = CANT2) then /* SI NO SE HA FACTURADO MIRE A VER SI SE REMISIONO */
                            EXECUTE PROCEDURE FALTANTE(23, 22, ID, ITEM) returning_values (PEDIDO, UND, FACTOR);
                        if (PEDIDO IS NULL) then
                            PEDIDO = 0;
                        ORDENC = ORDENC + PEDIDO * FACTOR;
                        END
                    ORDENADO = ORDENADO + ORDENC;
                    SELECT SUM(RSDE_LIBERAR)
                        FROM RESERVAS_DETALLE RD, RESERVAS R
                        WHERE R.RESE_ID = RD.RESE_ID AND ARTI_COD = :CODIGO AND RESE_FECHA <= :FECHA AND RESE_VENCE >= :FECHA AND RSDE_ANULADO = 'N'
                        INTO :RESERVADO;
                    if (RESERVADO IS NULL) then
                        RESERVADO = 0;
                    PEDIDO = 0;
                    FOR SELECT P.PEDI_ID, PEDE_ITEM, PEDE_CANT * PEDE_FACTOR
                        FROM PEDIDOS P, PEDIDOS_DETALLE PD, PUNTO_VENTA PT
                        WHERE P.PEDI_ID = PD.PEDI_ID AND PD.ARTI_COD = :CODIGO AND PT.ptvt_id = P.PTVT_ID AND PEDI_VENCE >= :FECHA AND PEDI_FECHA <= :FECHA AND PEDE_ANULADO = 'N'
                        INTO :ID, :ITEM, :CANT2
                        do
                        BEGIN
                        EXECUTE PROCEDURE FALTANTE(34, 31, ID, ITEM) returning_values (ORDENC, UND, FACTOR);
                        if ((ORDENC * FACTOR = CANT2) or (PEDAUTO = 'SI')) then /* SI NO SE HA FACTURADO MIRE A VER SI SE REMISIONO */
                            EXECUTE PROCEDURE FALTANTE(34, 32, ID, ITEM) returning_values (ORDENC, UND, FACTOR);
                        if (ORDENC IS NULL) then
                            ORDENC = 0;
                        PEDIDO = PEDIDO + ORDENC * FACTOR;
                        END
                    if (PEDIDO IS NULL) then
                        PEDIDO = 0;
                    RESERVADO = RESERVADO + PEDIDO;
                    END
                ELSE
                    BEGIN
                    RESERVADO = 0;
                    ORDENADO = 0;
                    END
                if (ENPESO = 'S') then
                    BEGIN
                    if (pesounit IS NULL) then
                        pesounit = 0;
                    if (PESOUNIT <> 0) then
                        BEGIN
                        pesototal = PESOUNIT * cant;
                        SUSPEND;
                        END
                    END
                ELSE
                    SUSPEND;
                END
            END
        END
  END
END
^

SET TERM ; ^


/* 20090423 */
/* MAL BASES SI CONTABILIZA IVA POR TARIFA */

SET TERM ^ ;

CREATE OR ALTER PROCEDURE CONTABIL_NOTADBPR(
    IDDOC INTEGER,
    IDINTER INTEGER)
RETURNS (
    ERROR INTEGER,
    VER CHAR(1),
    IDC INTEGER)
AS
declare variable PREF VARCHAR(4);
declare variable NUM VARCHAR(6);
declare variable NUMERO VARCHAR(10);
declare variable FECAUX DATE;
declare variable FECHA CHAR(8);
declare variable CONC CHAR(120);
declare variable VENCEAUX DATE;
declare variable VENCE CHAR(8);
declare variable VRSUBT NUMERIC(18, 2);
declare variable BASE0 NUMERIC(18, 2);
declare variable BASE1 NUMERIC(18, 2);
declare variable BASE2 NUMERIC(18, 2);
declare variable VRIVA NUMERIC(18, 2);
declare variable IVA1 NUMERIC(18, 2);
declare variable IVA2 NUMERIC(18, 2);
declare variable PRTFTE NUMERIC(9, 2);
declare variable VRRTFTE NUMERIC(18, 2);
declare variable PRTIVA NUMERIC(9, 2);
declare variable VRRTIVA NUMERIC(18, 2);
declare variable PRTICA NUMERIC(9, 2);
declare variable VRRTICA NUMERIC(18, 2);
declare variable VRTOTAL NUMERIC(18, 2);
declare variable TIPOCOMP VARCHAR(3);
declare variable PREFCONT VARCHAR(4);
declare variable BASE CHAR(1);
declare variable CTABASE VARCHAR(20);
declare variable IVA CHAR(1);
declare variable CTAIVA VARCHAR(20);
declare variable CLIE CHAR(1);
declare variable CTACLIE VARCHAR(20);
declare variable RTFTE CHAR(1);
declare variable CTARTFTE VARCHAR(20);
declare variable RTIVA CHAR(1);
declare variable CTARTIVA VARCHAR(20);
declare variable RTICA CHAR(1);
declare variable CTARTICA VARCHAR(20);
declare variable EXISTE CHAR(1);
declare variable CUENTA VARCHAR(20);
declare variable MONTO NUMERIC(18,2);
declare variable ES_RETENCION CHAR(1);
declare variable TIPOCUEN CHAR(1);
declare variable NIT VARCHAR(20);
declare variable PROY VARCHAR(4);
declare variable CENTRO VARCHAR(4);
declare variable MONTOBASE NUMERIC(18,2);
declare variable PORC NUMERIC(5,2);
declare variable DEBITO NUMERIC(18,2);
declare variable CREDITO NUMERIC(18,2);
declare variable NROI INTEGER;
declare variable SUMA NUMERIC(18,2);
declare variable TCTACLIEN VARCHAR(20);
declare variable TCTABASE VARCHAR(20);
declare variable TCTARTFTE VARCHAR(20);
declare variable TCTARTIVA VARCHAR(20);
declare variable TCTARTICA VARCHAR(20);
declare variable CUENTAADIC VARCHAR(20);
declare variable BASEADIC VARCHAR(20);
declare variable PORCADIC NUMERIC(5,2);
declare variable VALORADIC NUMERIC(18,2);
declare variable DBADIC CHAR(1);
declare variable NPROY VARCHAR(4);
declare variable NCENTRO VARCHAR(4);
declare variable ANULADO CHAR(1);
declare variable TARIFA INTEGER;
BEGIN
ERROR = 0;
/* BUSQUE LA INTERFACE */
EXISTE = 'N';
SELECT 'S', TICO_COD, PRCO_PRE, INCP_BASE, INCP_IVA, INCP_RTFTE, INCP_RTIVA, INCP_RTICA, INCP_PROV, INCP_CTABASE, INCP_CTAIVA, INCP_CTARTFTE, INCP_CTARTIVA, INCP_CTARTICA, INCP_CTAPROV, INCP_CONFIRMAR
    FROM INTERFAZ_CXPAGAR
    WHERE INCP_ID = :IDINTER
    INTO :EXISTE, :TIPOCOMP, :PREFCONT, :BASE, :IVA, :RTFTE, :RTIVA, :RTICA, :CLIE, :CTABASE, :CTAIVA, :CTARTFTE, :CTARTIVA, :CTARTICA, :CTACLIE, :VER;

if (EXISTE = 'S') then
  BEGIN
  /* BORRE CUALQUEIR CONTABILIZACION PREVIA */
  DELETE FROM CONTABILIZACION WHERE CNTB_TIPOREF = 51 AND CNTB_IDREF = :IDDOC;
  /* TRAIGA EL ENCABEZADO DE LA NOTA */
  SELECT PREF_PRE, NDPR_NUMERO, NDPR_FECHA, NDPR_VENCE, N.TERC_NIT, NDPR_CONC, NDPR_IVAPORC, NDPR_IVAMONTO, NDPR_MONTO, NDPR_RTFTEPORC, NDPR_RTFTEMONTO, NDPR_RTIVAPORC, NDPR_RTIVAMONTO, NDPR_RTICAPORC, NDPR_RTICAMONTO, TERC_CTAVENTA, TERC_CTARTFTE, TERC_CTARTIVA, TERC_CTARTICA, TERC_CTACLIENTE, NDPR_PROY, NDPR_CENTRO, NDPR_ANULADO, NDPR_BASE0, NDPR_BASE1, NDPR_BASE2, NDPR_IVA1, NDPR_IVA2
        FROM NOTAS_DEBITO_PROVEEDOR N, TERCEROS T
        WHERE NDPR_ID = :IDDOC AND N.TERC_NIT = T.TERC_NIT
        INTO :PREF, :NUM, :FECAUX, :VENCEAUX, :NIT, :CONC, :PORC, :VRIVA, :VRTOTAL, :PRTFTE, :VRRTFTE, :PRTIVA, :VRRTIVA, :PRTICA, :VRRTICA, :TCTABASE, TCTARTFTE, TCTARTIVA, TCTARTICA, TCTACLIEN, NPROY, NCENTRO, ANULADO, :BASE0, BASE1, :BASE2, :IVA1, :IVA2;
  if (ANULADO = 'N') then
    BEGIN
    /* SI ES PROVEEDOR, SOBREESCIBE LAS CUENTAS  */
    SELECT PROV_CTAPAGAR, PROV_CTARTFTE, PROV_CTARTIVA, PROV_CTARTICA, PROV_CTACAUSA
        FROM PROVEEDORES WHERE TERC_NIT = :NIT
        INTO TCTACLIEN, TCTARTFTE, TCTARTIVA, TCTARTICA, TCTABASE;
        
    /* SI EL DOCUMENTO ESPECIFICA ALGUNAS SOBRESCRIBA LAS DEL PROVEEDOR */
    SELECT NDPR_CTAPAGAR, NDPR_CTACAUSA
        FROM NOTAS_DEBITO_PROVEEDOR
        WHERE NDPR_ID = :IDDOC
        INTO :TCTACLIEN, TCTABASE;
    SELECT PREF_CENTRO, PREF_PROY FROM PREFIJOS P, NOTAS_DEBITO_PROVEEDOR N
        WHERE P.PREF_PRE = N.PREF_PRE AND P.TIDO_COD = 51 AND N.NDPR_ID = :IDDOC INTO :CENTRO, :PROY;
    if (NPROY <> '') then
        PROY = NPROY;
    if (NCENTRO <> '') then
        CENTRO = NCENTRO;
    NUMERO = PREF || NUM;
    VRSUBT = VRTOTAL; /* BASE DE RETEFTE Y RETEICA */

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

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

    NROI = 0;
    SUMA = 0;

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

        if (VRSUBT <> 0) then
            BEGIN
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO, CUEN_RETENCION FROM CUENTAS
                WHERE CUEN_COD = :CTABASE INTO :CUENTA, :TIPOCUEN, :ES_RETENCION;
            if (CUENTA IS NULL) then
                begin
                INSERT INTO  ERRORES (ERRO_ITEM, ERRO_TIPODOC, ERRO_IDDOC, ERRO_CODIGO, ERRO_CANT, ERRO_CADENA)
                    VALUES(GEN_ID(id_errores, 1), 51, :IDDOC, 'CUENTA NO EXISTE', 0, :CTABASE);
                CUENTA = CTABASE;
                ERROR = ERROR + 1;
                end
            if (ES_RETENCION = 'S') then
                if ((prtiva <> 0) and (vriva = 0)) then
                    montobase = FLOOR(VRSUBT / prtiva);
                else
                    montobase = VRSUBT;
            else
                montobase = 0;
            if (TIPOCUEN = 'I') then
                BEGIN
                INSERT INTO  ERRORES (ERRO_ITEM, ERRO_TIPODOC, ERRO_IDDOC, ERRO_CODIGO, ERRO_CANT, ERRO_CADENA)
                    VALUES(GEN_ID(id_errores, 1), 51, :IDDOC, 'CUENTA DE INVENTARIO', 0, :CUENTA);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRSUBT, 0, :MONTOBASE, :prtiva, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 41);
                NROI = NROI + 1;
                SUMA = SUMA + VRSUBT;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRSUBT, 0, :MONTOBASE, :prtiva, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA + VRSUBT;
                END
            END /* MONTO <> 0 */
        END /* BASE TERCERO O CONSTANTE */
    IF ((BASE = 'I')) THEN
        BEGIN
        FOR SELECT TAIV_CTACOMP, TAIV_COD FROM TARIFA_IVA WHERE TAIV_COD <= 2 INTO :CTABASE, :tarifa
            DO
            BEGIN
            if (TARIFA = 0) then
                vrsubt = BASE0;
            if (TARIFA = 1) then
                vrsubt = BASE1;
            if (TARIFA = 2) then
                vrsubt = BASE2;
            if (VRSUBT <> 0) then
                BEGIN
                CUENTA = NULL;
                SELECT CUEN_COD, CUEN_TIPO, CUEN_RETENCION FROM CUENTAS
                    WHERE CUEN_COD = :CTABASE INTO :CUENTA, :TIPOCUEN, :ES_RETENCION;
                if (CUENTA IS NULL) then
                    begin
                    INSERT INTO  ERRORES (ERRO_ITEM, ERRO_TIPODOC, ERRO_IDDOC, ERRO_CODIGO, ERRO_CANT, ERRO_CADENA)
                        VALUES(GEN_ID(id_errores, 1), 51, :IDDOC, 'CUENTA NO EXISTE', 0, :CTABASE);
                    CUENTA = CTABASE;
                    ERROR = ERROR + 1;
                    end
                montobase = 0;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    INSERT INTO  ERRORES (ERRO_ITEM, ERRO_TIPODOC, ERRO_IDDOC, ERRO_CODIGO, ERRO_CANT, ERRO_CADENA)
                        VALUES(GEN_ID(id_errores, 1), 51, :IDDOC, 'CUENTA DE INVENTARIO', 0, :CUENTA);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRSUBT, 0, :MONTOBASE, :prtiva, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 41);
                    NROI = NROI + 1;
                    SUMA = SUMA + VRSUBT;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRSUBT, 0, :MONTOBASE, :prtiva, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA + VRSUBT;
                    END
                END /* MONTO <> 0 */
            END
        END /* BASE TARIFA DE IVA */

    if (IVA = 'I') then /* IVA POR TARIFA */
        BEGIN
        FOR SELECT TAIV_CTAIVACMP, TAIV_COD, TAIV_PORC FROM TARIFA_IVA WHERE (TAIV_COD <> 0) AND (TAIV_COD <= 2) INTO :CTAIVA, :tarifa, :PORC
            DO
            BEGIN
            if (TARIFA = 1) then
                BEGIN
                vrsubt = BASE1;
                VRIVA = IVA1;
                END
            if (TARIFA = 2) then
                BEGIN
                VRIVA = IVA2;
                vrsubt = BASE2;
                END
            if (VRIVA <> 0) then
                BEGIN
                CUENTA = NULL;
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :CTAIVA INTO :CUENTA, :TIPOCUEN;
                if (CUENTA IS NULL) then
                    begin
                    INSERT INTO  ERRORES (ERRO_ITEM, ERRO_TIPODOC, ERRO_IDDOC, ERRO_CODIGO, ERRO_CANT, ERRO_CADENA)
                        VALUES(GEN_ID(id_errores, 1), 51, :IDDOC, 'CUENTA NO EXISTE', 0, :CTAIVA);
                    CUENTA = CTAIVA;
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    INSERT INTO  ERRORES (ERRO_ITEM, ERRO_TIPODOC, ERRO_IDDOC, ERRO_CODIGO, ERRO_CANT, ERRO_CADENA)
                        VALUES(GEN_ID(id_errores, 1), 51, :IDDOC, 'CUENTA DE INVENTARIO', 0, :CUENTA);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', :VRIVA, 0, :vrsubt, :porc, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 41);
                    NROI = NROI + 1;
                    SUMA = SUMA + VRIVA;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', :VRIVA, 0, :vrsubt, :porc, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA + VRIVA;
                    END
                END /* VRIVA <> 0 */
            end /* FOR */
        END /* IVA EN CTA CONSTANTE */
        
    VRSUBT = VRTOTAL; /* BASE DE RETEFTE Y RETEICA */
    if (IVA = 'K') then /* IVA EN CTA CONSTANTE */
        BEGIN
        if (VRIVA <> 0) then
            BEGIN
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTAIVA INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                INSERT INTO  ERRORES (ERRO_ITEM, ERRO_TIPODOC, ERRO_IDDOC, ERRO_CODIGO, ERRO_CANT, ERRO_CADENA)
                    VALUES(GEN_ID(id_errores, 1), 51, :IDDOC, 'CUENTA NO EXISTE', 0, :CTAIVA);
                CUENTA = CTAIVA;
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                INSERT INTO  ERRORES (ERRO_ITEM, ERRO_TIPODOC, ERRO_IDDOC, ERRO_CODIGO, ERRO_CANT, ERRO_CADENA)
                    VALUES(GEN_ID(id_errores, 1), 51, :IDDOC, 'CUENTA DE INVENTARIO', 0, :CUENTA);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', :VRIVA, 0, :vrsubt, :porc, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 41);
                NROI = NROI + 1;
                SUMA = SUMA + VRIVA;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', :VRIVA, 0, :vrsubt, :porc, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA + VRIVA;
                END
            END /* VRIVA <> 0 */
        END /* IVA EN CTA CONSTANTE */
        
    /* RETENCION FUENTE */
    if ((RTFTE = 'T') or (RTFTE = 'K')) then
      if (VRRTFTE <> 0) then
        BEGIN
        if (RTFTE = 'T') then
            CTARTFTE = TCTARTFTE;
            
        CUENTA = NULL;
        SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
            WHERE CUEN_COD = :CTARTFTE INTO :CUENTA, :TIPOCUEN;
        if (CUENTA IS NULL) then
            begin
            INSERT INTO  ERRORES (ERRO_ITEM, ERRO_TIPODOC, ERRO_IDDOC, ERRO_CODIGO, ERRO_CANT, ERRO_CADENA)
                VALUES(GEN_ID(id_errores, 1), 51, :IDDOC, 'CUENTA NO EXISTE', 0, :CTARTFTE);
            CUENTA = CTARTFTE;
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            INSERT INTO  ERRORES (ERRO_ITEM, ERRO_TIPODOC, ERRO_IDDOC, ERRO_CODIGO, ERRO_CANT, ERRO_CADENA)
                    VALUES(GEN_ID(id_errores, 1), 51, :IDDOC, 'CUENTA DE INVENTARIO', 0, :CUENTA);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, (:VRSUBT*-1), :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 41);
            NROI = NROI + 1;
            SUMA = SUMA - VRRTFTE;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, (:VRSUBT*-1), :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA - VRRTFTE;
            END
        END /* RTFTE */
        
    /* RETENCION IVA */
    if ((RTIVA = 'T') or (RTIVA = 'K')) then
      if (VRRTIVA <> 0) then
        BEGIN
        if (RTIVA = 'T') then
            CTARTIVA = TCTARTIVA;
            
        CUENTA = NULL;
        SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
            WHERE CUEN_COD = :CTARTIVA INTO :CUENTA, :TIPOCUEN;
        if (CUENTA IS NULL) then
            begin
            INSERT INTO  ERRORES (ERRO_ITEM, ERRO_TIPODOC, ERRO_IDDOC, ERRO_CODIGO, ERRO_CANT, ERRO_CADENA)
                VALUES(GEN_ID(id_errores, 1), 51, :IDDOC, 'CUENTA NO EXISTE', 0, :CTARTIVA);
            CUENTA = CTARTIVA;
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            INSERT INTO  ERRORES (ERRO_ITEM, ERRO_TIPODOC, ERRO_IDDOC, ERRO_CODIGO, ERRO_CANT, ERRO_CADENA)
                VALUES(GEN_ID(id_errores, 1), 51, :IDDOC, 'CUENTA DE INVENTARIO', 0, :CUENTA);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTIVA, (:VRIVA*-1), :prtiva, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 41);
            NROI = NROI + 1;
            SUMA = SUMA - VRRTIVA;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTIVA, (:VRIVA*-1), :prtiva, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA - VRRTIVA;
            END
        END /* RTIVA */
        
    /* RETENCION DE ICA */
    if ((RTICA = 'T') or (RTICA = 'K')) then
      if (VRRTICA <> 0) then
        BEGIN
        if (RTICA = 'T') then
            CTARTICA = TCTARTICA;
            
        CUENTA = NULL;
        SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
            WHERE CUEN_COD = :CTARTICA INTO :CUENTA, :TIPOCUEN;
        if (CUENTA IS NULL) then
            begin
            INSERT INTO  ERRORES (ERRO_ITEM, ERRO_TIPODOC, ERRO_IDDOC, ERRO_CODIGO, ERRO_CANT, ERRO_CADENA)
                    VALUES(GEN_ID(id_errores, 1), 51, :IDDOC, 'CUENTA NO EXISTE', 0, :CTARTICA);
            CUENTA = CTARTICA;
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            INSERT INTO  ERRORES (ERRO_ITEM, ERRO_TIPODOC, ERRO_IDDOC, ERRO_CODIGO, ERRO_CANT, ERRO_CADENA)
                VALUES(GEN_ID(id_errores, 1), 51, :IDDOC, 'CUENTA DE INVENTARIO', 0, :CUENTA);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTICA, (:VRSUBT*-1), :PRTICA, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 41);
            NROI = NROI + 1;
            SUMA = SUMA - VRRTICA;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTICA, (:VRSUBT*-1), :PRTICA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA - VRRTICA;
            END
        END /* RTICA */
        
    /* recorra las cuentas adicionales */
    FOR SELECT INPC_CUENTA, INPC_BASE, INPC_PORC, INPC_VALOR, INPC_DB
        FROM INTERFAZ_CXPAGAR_CTAS
        WHERE INCP_ID = :IDINTER
        INTO :CUENTAADIC, :BASEADIC, :PORCADIC, :VALORADIC, :DBADIC
        DO
        BEGIN
        if (:BASEADIC = 'SUBTOTAL') then
            VALORADIC = VRTOTAL - VRIVA;
        if (:BASEADIC = 'IVA') then
            VALORADIC = VRIVA;
        if (:BASEADIC = 'TOTAL') then
            VALORADIC = VRTOTAL;
        MONTO = VALORADIC * PORCADIC;
        
        /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
        CUENTA = NULL;
        SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
            WHERE CUEN_COD = :CUENTAADIC INTO :CUENTA, :TIPOCUEN;
        IF (CUENTA IS NULL) THEN
            begin
            INSERT INTO  ERRORES (ERRO_ITEM, ERRO_TIPODOC, ERRO_IDDOC, ERRO_CODIGO, ERRO_CANT, ERRO_CADENA)
                    VALUES(GEN_ID(id_errores, 1), 51, :IDDOC, 'CUENTA NO EXISTE', 0, :CUENTAADIC);
            CUENTA = CUENTAADIC;
            ERROR = ERROR + 1;
            end
        /* DEPENDE DEL TIPO DE CUENTA */
        if (TIPOCUEN = 'I') then
            BEGIN
            INSERT INTO  ERRORES (ERRO_ITEM, ERRO_TIPODOC, ERRO_IDDOC, ERRO_CODIGO, ERRO_CANT, ERRO_CADENA)
                VALUES(GEN_ID(id_errores, 1), 51, :IDDOC, 'CUENTA DE INVENTARIO', 0, :CUENTA);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            if (DBADIC = 'S') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTAADIC, :CONC, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 31);
                SUMA = SUMA + MONTO;
                END
            ELSE
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTAADIC, :CONC, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 31);
                SUMA = SUMA - MONTO;
                END
            NROI = NROI + 1;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            if (DBADIC = 'S') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTAADIC, :CONC, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                SUMA = SUMA + MONTO;
                END
            ELSE
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTAADIC, :CONC, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                SUMA = SUMA - MONTO;
                END
            NROI = NROI + 1;
            END
        
        NROI = NROI + 1;
        END
        
    /* CIERRE EL COMPROBANTE CONTRA LA CUENTA DEL TERCERO O LA CONSTANTE */
    if ((SUMA <> 0) and ((CLIE = 'T') or (CLIE = 'K'))) then
        BEGIN
        if (SUMA < 0) then
            BEGIN
            DEBITO = SUMA * -1;
            CREDITO = 0;
            END
        ELSE
            BEGIN
            DEBITO = 0;
            CREDITO = SUMA;
            END
        if (CLIE = 'T') then
            CTACLIE = TCTACLIEN;

        CUENTA = NULL;
        SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
            WHERE CUEN_COD = :CTACLIE INTO :CUENTA, :TIPOCUEN;
        IF (CUENTA IS NULL) then
            begin
            INSERT INTO  ERRORES (ERRO_ITEM, ERRO_TIPODOC, ERRO_IDDOC, ERRO_CODIGO, ERRO_CANT, ERRO_CADENA)
                VALUES(GEN_ID(id_errores, 1), 51, :IDDOC, 'CUENTA NO EXISTE', 0, :CTACLIE);
            CUENTA = CTACLIE;
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            INSERT INTO  ERRORES (ERRO_ITEM, ERRO_TIPODOC, ERRO_IDDOC, ERRO_CODIGO, ERRO_CANT, ERRO_CADENA)
                VALUES(GEN_ID(id_errores, 1), 51, :IDDOC, 'CUENTA DE INVENTARIO', 0, :CUENTA);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :DEBITO, :CREDITO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 41);
        if (TIPOCUEN = 'N') then
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :DEBITO, :CREDITO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
        NROI = NROI + 1;
        END /* SUMA EN CARTERA */
    if (ERROR > 0) then
        VER = 'S';
    SUSPEND;
    END /* ANULADO */
  END /* EXISTE LA INTERFAZ */
ELSE
    BEGIN
    INSERT INTO  ERRORES (ERRO_ITEM, ERRO_TIPODOC, ERRO_IDDOC, ERRO_CODIGO, ERRO_CANT, ERRO_CADENA)
        VALUES(GEN_ID(id_errores, 1), 51, :IDDOC, 'INTERFAZ NO EXISTE', 0, :pref);
    ERROR = ERROR + 1;
    VER = 'S';
    SUSPEND;
    END
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE NOTADBPR_SIN_CONTABILIDAD(
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    ID INTEGER,
    IDI INTEGER,
    IDC INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    ESTADO VARCHAR(20),
    ERROR INTEGER)
AS
DECLARE VARIABLE VER CHAR(2);
declare variable FECICNT VARCHAR(10);
declare variable FECFCNT VARCHAR(10);
declare variable idref INTEGER;
BEGIN /*$$IBE$$ 
EXECUTE PROCEDURE fecha_a_conta(FECINI) returning_values (FECICNT);
EXECUTE PROCEDURE fecha_a_conta(FECFIN) returning_values (FECFCNT);
FOR SELECT NDPR_ID, PREF_PRE, NDPR_NUMERO FROM NOTAS_DEBITO_PROVEEDOR WHERE NDPR_ANULADO = 'N' AND
    NDPR_FECHA >= :FECINI AND NDPR_FECHA <= :FECFIN
    ORDER BY NDPR_ID INTO :ID, :PREF, :NUMERO
DO
  BEGIN
  idref = null;
  SELECT ENCO_IDREF FROM COMPROBANTE_ENCABEZADO WHERE ENCO_TIPOREF = 51 AND ENCO_FECHA >= :FECICNT AND ENCO_FECHA <= :FECFCNT and ENCO_IDREF = :id into :idref;
  if (idref IS NULL) then
  begin
  ESTADO = 'PROCESANDO';
  SUSPEND;
  SELECT MAX(INCA_ID) FROM INTERFAZ_CARTERA WHERE PREF_PRE = :PREF AND TIDO_COD = 51 INTO :IDI;
  if (IDI IS NOT NULL) then
    BEGIN
    EXECUTE PROCEDURE CONTABIL_NOTADBPR (:ID, :IDI) RETURNING_VALUES (:ERROR, :VER, :IDC);
    if (ERROR = 0) then
      BEGIN
      EXECUTE PROCEDURE CONTABILIZA_PENDIENTE (:IDC);
      ESTADO = 'OK';
      END
    ELSE
      ESTADO = 'ERROR';
    suspend;
    END
  end
  END
 $$IBE$$*/ SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE NOTADBPR_SIN_CONTABILIDAD(
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    ID INTEGER,
    IDI INTEGER,
    IDC INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    ESTADO VARCHAR(20),
    ERROR INTEGER)
AS
DECLARE VARIABLE VER CHAR(2);
declare variable FECICNT VARCHAR(10);
declare variable FECFCNT VARCHAR(10);
declare variable idref INTEGER;
BEGIN
EXECUTE PROCEDURE fecha_a_conta(FECINI) returning_values (FECICNT);
EXECUTE PROCEDURE fecha_a_conta(FECFIN) returning_values (FECFCNT);
FOR SELECT NDPR_ID, PREF_PRE, NDPR_NUMERO FROM NOTAS_DEBITO_PROVEEDOR WHERE NDPR_ANULADO = 'N' AND
    NDPR_FECHA >= :FECINI AND NDPR_FECHA <= :FECFIN
    ORDER BY NDPR_ID INTO :ID, :PREF, :NUMERO
DO
  BEGIN
  idref = null;
  SELECT ENCO_IDREF FROM COMPROBANTE_ENCABEZADO WHERE ENCO_TIPOREF = 51 AND ENCO_FECHA >= :FECICNT AND ENCO_FECHA <= :FECFCNT and ENCO_IDREF = :id into :idref;
  if (idref IS NULL) then
  begin
  ESTADO = 'PROCESANDO';
  SUSPEND;
  SELECT MAX(INCA_ID) FROM INTERFAZ_CARTERA WHERE PREF_PRE = :PREF AND TIDO_COD = 51 INTO :IDI;
  if (IDI IS NOT NULL) then
    BEGIN
    EXECUTE PROCEDURE CONTABIL_NOTADBPR (:ID, :IDI) RETURNING_VALUES (:ERROR, :VER, :IDC);
    if (ERROR = 0) then
      BEGIN
      EXECUTE PROCEDURE CONTABILIZA_PENDIENTE (:IDC);
      ESTADO = 'OK';
      END
    ELSE
      ESTADO = 'ERROR';
    suspend;
    END
  end
  END
END

^

SET TERM ; ^


SET TERM ^ ;

CREATE OR ALTER PROCEDURE CONTABIL_NOTACRPR(
    IDDOC INTEGER,
    IDINTER INTEGER)
RETURNS (
    ERROR INTEGER,
    VER CHAR(1),
    IDC INTEGER)
AS
declare variable PREF VARCHAR(4);
declare variable NUM VARCHAR(6);
declare variable NUMERO VARCHAR(10);
declare variable FECAUX DATE;
declare variable FECHA CHAR(8);
declare variable CONC CHAR(120);
declare variable VRSUBT NUMERIC(18, 2);
declare variable BASE0 NUMERIC(18, 2);
declare variable BASE1 NUMERIC(18, 2);
declare variable BASE2 NUMERIC(18, 2);
declare variable VRIVA NUMERIC(18, 2);
declare variable IVA1 NUMERIC(18, 2);
declare variable IVA2 NUMERIC(18, 2);
declare variable PRTFTE NUMERIC(9, 2);
declare variable VRRTFTE NUMERIC(18, 2);
declare variable VRRTIVA NUMERIC(18, 2);
declare variable PRTICA NUMERIC(9, 2);
declare variable VRRTICA NUMERIC(18, 2);
declare variable VRTOTAL NUMERIC(18, 2);
declare variable TIPOCOMP VARCHAR(3);
declare variable PREFCONT VARCHAR(4);
declare variable BASE CHAR(1);
declare variable CTABASE VARCHAR(20);
declare variable IVA CHAR(1);
declare variable CTAIVA VARCHAR(20);
declare variable CLIE CHAR(1);
declare variable CTACLIE VARCHAR(20);
declare variable RTFTE CHAR(1);
declare variable CTARTFTE VARCHAR(20);
declare variable RTIVA CHAR(1);
declare variable CTARTIVA VARCHAR(20);
declare variable RTICA CHAR(1);
declare variable CTARTICA VARCHAR(20);
declare variable EXISTE CHAR(1);
declare variable CUENTA VARCHAR(20);
declare variable MONTO NUMERIC(18,2);
declare variable ES_RETENCION CHAR(1);
declare variable TIPOCUEN CHAR(1);
declare variable NIT VARCHAR(20);
declare variable NOMBRE VARCHAR(60);
declare variable PROY VARCHAR(4);
declare variable CENTRO VARCHAR(4);
declare variable PORC NUMERIC(5,2);
declare variable DEBITO NUMERIC(18,2);
declare variable CREDITO NUMERIC(18,2);
declare variable NROI INTEGER;
declare variable SUMA NUMERIC(18,2);
declare variable TCTACLIEN VARCHAR(20);
declare variable TCTABASE VARCHAR(20);
declare variable TCTARTFTE VARCHAR(20);
declare variable TCTARTIVA VARCHAR(20);
declare variable TCTARTICA VARCHAR(20);
declare variable BASEADIC VARCHAR(20);
declare variable PORCADIC NUMERIC(5,2);
declare variable VALORADIC NUMERIC(18,2);
declare variable DBADIC CHAR(1);
declare variable CUENTAADIC VARCHAR(20);
declare variable ANULADO CHAR(1);
declare variable MONTOBASE NUMERIC(18,2);
declare variable TARIFA INTEGER;
BEGIN
ERROR = 0;
/* BUSQUE LA INTERFACE */
EXISTE = 'N';
SELECT 'S', TICO_COD, PRCO_PRE, INCP_BASE, INCP_IVA, INCP_RTFTE, INCP_RTIVA, INCP_RTICA, INCP_PROV, INCP_CTABASE, INCP_CTAIVA, INCP_CTARTFTE, INCP_CTARTIVA, INCP_CTARTICA, INCP_CTAPROV, INCP_CONFIRMAR
  FROM INTERFAZ_CXPAGAR
  WHERE INCP_ID = :IDINTER
  INTO :EXISTE, :TIPOCOMP, :PREFCONT, :BASE, :IVA, :RTFTE, :RTIVA, :RTICA, :CLIE, :CTABASE, :CTAIVA, :CTARTFTE, :CTARTIVA, :CTARTICA, :CTACLIE, :VER;

if (EXISTE = 'S') then
  BEGIN
  /* BORRE CUALQUEIR CONTABILIZACION PREVIA */
  DELETE FROM CONTABILIZACION WHERE CNTB_TIPOREF = 52 AND CNTB_IDREF = :IDDOC;
  /* TRAIGA EL ENCABEZADO DE LA NOTA */
  SELECT PREF_PRE, NCPR_NUMERO, NCPR_FECHA, N.TERC_NIT, NCPR_CONC, NCPR_IVAMONTO, NCPR_MONTO, NCPR_RTFTEPORC, NCPR_RTFTEMONTO, NCPR_RTIVAPORC, NCPR_RTIVAMONTO, NCPR_RTICAPORC, NCPR_RTICAMONTO, TERC_NOM, TERC_CTAVENTA, TERC_CTARTFTE, TERC_CTARTIVA, TERC_CTARTICA, TERC_CTACLIENTE, NCPR_ANULADO, NCPR_BASE0, NCPR_BASE1, NCPR_BASE2, NCPR_IVA1, NCPR_IVA2
    FROM NOTAS_CREDITO_PROVEEDOR N, TERCEROS T
    WHERE NCPR_ID = :IDDOC AND N.TERC_NIT = T.TERC_NIT
    INTO :PREF, :NUM, :FECAUX, :NIT, :CONC, :VRIVA, :VRTOTAL, :PRTFTE, :VRRTFTE, :PORC, :VRRTIVA, :PRTICA, :VRRTICA, :NOMBRE, TCTABASE, TCTARTFTE, TCTARTIVA, TCTARTICA, TCTACLIEN, ANULADO, :BASE0, BASE1, :BASE2, :IVA1, :IVA2;
  if (ANULADO = 'N') then
    BEGIN
    SELECT PREF_CENTRO, PREF_PROY FROM PREFIJOS P, NOTAS_CREDITO_PROVEEDOR N
        WHERE P.PREF_PRE = N.PREF_PRE AND P.TIDO_COD = 52 AND NCPR_ID = :IDDOC INTO :CENTRO, :PROY;
    /* SI ES PROVEEDOR, SOBREESCIBE LAS CUENTAS  */
    SELECT PROV_CTAPAGAR, PROV_CTARTFTE, PROV_CTARTIVA, PROV_CTARTICA, PROV_CTACAUSA
        FROM PROVEEDORES WHERE TERC_NIT = :NIT
        INTO TCTACLIEN, TCTARTFTE, TCTARTIVA, TCTARTICA, TCTABASE;
        
    /* SI EL DOCUMENTO ESPECIFICA ALGUNAS SOBRESCRIBA LAS DEL PROVEEDOR */
    SELECT NCPR_CTAPAGAR, NCPR_CTACAUSA
        FROM NOTAS_CREDITO_PROVEEDOR N
        WHERE NCPR_ID = :IDDOC
        INTO :TCTACLIEN, TCTABASE;
    NUMERO = PREF || NUM;
    VRSUBT = VRTOTAL; /* BASE DE RETEFTE Y RETEICA */

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

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

    NROI = 0;
    SUMA = 0;

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

        if (VRSUBT <> 0) then
            BEGIN
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO, CUEN_RETENCION FROM CUENTAS
                WHERE CUEN_COD = :CTABASE INTO :CUENTA, :TIPOCUEN, :ES_RETENCION;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERROR (52, :IDDOC, :CTABASE, 2);
                CUENTA = CTABASE;
                ERROR = ERROR + 1;
                end
            if (ES_RETENCION = 'S') then
                if (PORC <> 0) then
                    montobase = FLOOR(VRSUBT / PORC * -1);
                else
                    montobase = VRSUBT * -1;
            else
                montobase = 0;
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERROR (52, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRSUBT, :MONTOBASE, :PORC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 52);
                NROI = NROI + 1;
                SUMA = SUMA - VRSUBT;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRSUBT, :MONTOBASE, :PORC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - VRSUBT;
                END
            END /* MONTO <> 0 */
        END /* BASE TERCERO O CONSTANTE */
    IF ((BASE = 'I')) THEN
        BEGIN
        FOR SELECT TAIV_CTACOMP, TAIV_COD FROM TARIFA_IVA WHERE TAIV_COD <= 2 INTO :CTABASE, :tarifa
            DO
            BEGIN
            if (TARIFA = 0) then
                vrsubt = BASE0;
            if (TARIFA = 1) then
                vrsubt = BASE1;
            if (TARIFA = 2) then
                vrsubt = BASE2;
            if (VRSUBT <> 0) then
                BEGIN
                CUENTA = NULL;
                SELECT CUEN_COD, CUEN_TIPO, CUEN_RETENCION FROM CUENTAS
                    WHERE CUEN_COD = :CTABASE INTO :CUENTA, :TIPOCUEN, :ES_RETENCION;
                if (CUENTA IS NULL) then
                    begin
                    EXECUTE PROCEDURE ERROR (52, :IDDOC, :CTABASE, 2);
                    CUENTA = CTABASE;
                    ERROR = ERROR + 1;
                    end
                montobase = 0;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (52, :IDDOC, :CUENTA, 3);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRSUBT, :MONTOBASE, :PORC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 52);
                    NROI = NROI + 1;
                    SUMA = SUMA - VRSUBT;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRSUBT, :MONTOBASE, :PORC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA - VRSUBT;
                    END
                END /* MONTO <> 0 */
            END /* FOR */
        END /* BASE TARIFA IVA */

    if (IVA = 'I') then /* IVA X TARIFA */
        BEGIN
        FOR SELECT TAIV_CTAIVACMP, TAIV_COD, TAIV_PORC FROM TARIFA_IVA WHERE (TAIV_COD <> 0) AND (TAIV_COD <= 2) INTO :CTAIVA, :tarifa, :PORC
            DO
            BEGIN
            if (TARIFA = 1) then
                BEGIN
                VRIVA = IVA1;
                vrsubt = BASE1 * -1;
                END
            if (TARIFA = 2) then
                BEGIN
                VRIVA = IVA2;
                vrsubt = BASE2 * -1;
                END
            if (VRIVA <> 0) then
                BEGIN
                CUENTA = NULL;
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :CTAIVA INTO :CUENTA, :TIPOCUEN;
                if (CUENTA IS NULL) then
                    begin
                    EXECUTE PROCEDURE ERROR (52, :IDDOC, :CTAIVA, 2);
                    CUENTA = CTAIVA;
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (52, :IDDOC, :CUENTA, 3);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', 0, :VRIVA, :VRSUBT, :PORC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 52);
                    NROI = NROI + 1;
                    SUMA = SUMA - VRIVA;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', 0, :VRIVA, :VRSUBT, :PORC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA - VRIVA;
                    END
                END /* VRIVA <> 0 */
            END /* FOR */
        END /* IVA EN CTA CONSTANTE */
        
    VRSUBT = VRTOTAL; /* BASE DE RETEFTE Y RETEICA */
    if (IVA = 'K') then /* IVA EN CTA CONSTANTE */
        BEGIN
        if (VRIVA <> 0) then
            BEGIN
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTAIVA INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERROR (52, :IDDOC, :CTAIVA, 2);
                CUENTA = CTAIVA;
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERROR (52, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', 0, :VRIVA, :VRSUBT*-1, :PORC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 52);
                NROI = NROI + 1;
                SUMA = SUMA - VRIVA;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', 0, :VRIVA, :VRSUBT*-1, :PORC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - VRIVA;
                END
            END /* VRIVA <> 0 */
        END /* IVA EN CTA CONSTANTE */
        
    /* RETENCION FUENTE */
    if ((RTFTE = 'T') or (RTFTE = 'K')) then
      if (VRRTFTE <> 0) then
        BEGIN
        if (RTFTE = 'T') then
            CTARTFTE = TCTARTFTE;
            
        CUENTA = NULL;
        SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
            WHERE CUEN_COD = :CTARTFTE INTO :CUENTA, :TIPOCUEN;
        if (CUENTA IS NULL) then
            begin
            EXECUTE PROCEDURE ERROR (52, :IDDOC, :CTARTFTE, 2);
            CUENTA = CTARTFTE;
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERROR (52, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :VRSUBT, :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 52);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTFTE;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :VRSUBT, :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTFTE;
            END
        END /* RTFTE */
        
    /* RETENCION IVA */
    if ((RTIVA = 'T') or (RTIVA = 'K')) then
      if (VRRTIVA <> 0) then
        BEGIN
        if (RTIVA = 'T') then
            CTARTIVA = TCTARTIVA;
            
        CUENTA = NULL;
        SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
            WHERE CUEN_COD = :CTARTIVA INTO :CUENTA, :TIPOCUEN;
        if (CUENTA IS NULL) then
            begin
            EXECUTE PROCEDURE ERROR (52, :IDDOC, :CTARTIVA, 2);
            CUENTA = CTARTIVA;
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERROR (52, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTIVA, 0, :VRIVA, :PORC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 52);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTIVA;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTIVA, 0, :VRIVA, :PORC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTIVA;
            END
        END /* RTIVA */
        
    /* RETENCION DE ICA */
    if ((RTICA = 'T') or (RTICA = 'K')) then
      if (VRRTICA <> 0) then
        BEGIN
        if (RTICA = 'T') then
            CTARTICA = TCTARTICA;
            
        CUENTA = NULL;
        SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
            WHERE CUEN_COD = :CTARTICA INTO :CUENTA, :TIPOCUEN;
        if (CUENTA IS NULL) then
            begin
            EXECUTE PROCEDURE ERROR (52, :IDDOC, :CTARTICA, 2);
            CUENTA = CTARTICA;
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERROR (52, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTICA, 0, :VRSUBT, :PRTICA, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 52);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTICA;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTICA, 0, :VRSUBT, :PRTICA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTICA;
            END
        END /* RTICA */
        
    /* recorra las cuentas adicionales */
    FOR SELECT INPC_CUENTA, INPC_BASE, INPC_PORC, INPC_VALOR, INPC_DB
        FROM INTERFAZ_CXPAGAR_CTAS
        WHERE INCP_ID = :IDINTER
        INTO :CUENTAADIC, :BASEADIC, :PORCADIC, :VALORADIC, :DBADIC
        DO
        BEGIN
        if (:BASEADIC = 'SUBTOTAL') then
            VALORADIC = VRTOTAL - VRIVA;
        if (:BASEADIC = 'IVA') then
            VALORADIC = VRIVA;
        if (:BASEADIC = 'TOTAL') then
            VALORADIC = VRTOTAL;
        MONTO = VALORADIC * PORCADIC;
        
        /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
        CUENTA = NULL;
        SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
            WHERE CUEN_COD = :CUENTAADIC INTO :CUENTA, :TIPOCUEN;
        IF (CUENTA IS NULL) THEN
            begin
            EXECUTE PROCEDURE ERROR (52, :IDDOC, :CUENTAADIC, 2);
            CUENTA = CUENTAADIC;
            ERROR = ERROR + 1;
            end
        /* DEPENDE DEL TIPO DE CUENTA */
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERROR (52, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            if (DBADIC = 'S') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTAADIC, :CONC, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 31);
                SUMA = SUMA + MONTO;
                END
            ELSE
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTAADIC, :CONC, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 31);
                SUMA = SUMA - MONTO;
                END
            NROI = NROI + 1;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            if (DBADIC = 'S') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTAADIC, :CONC, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                SUMA = SUMA + MONTO;
                END
            ELSE
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTAADIC, :CONC, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                SUMA = SUMA - MONTO;
                END
            NROI = NROI + 1;
            END
        
        NROI = NROI + 1;
        END
        
    /* CIERRE EL COMPROBANTE CONTRA LA CUENTA DEL TERCERO O LA CONSTANTE */
    if ((SUMA <> 0) and ((CLIE = 'T') or (CLIE = 'K'))) then
        BEGIN
        if (SUMA < 0) then
            BEGIN
            DEBITO = SUMA * -1;
            CREDITO = 0;
            END
        ELSE
            BEGIN
            DEBITO = 0;
            CREDITO = SUMA;
            END
        if (CLIE = 'T') then
            CTACLIE = TCTACLIEN;

        CUENTA = NULL;
        SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
            WHERE CUEN_COD = :CTACLIE INTO :CUENTA, :TIPOCUEN;
        IF (CUENTA IS NULL) then
            begin
            EXECUTE PROCEDURE ERROR (52, :IDDOC, :CTACLIE, 2);
            CUENTA = CTACLIE;
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERROR (52, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :DEBITO, :CREDITO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 52);
        if (TIPOCUEN = 'N') then
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :DEBITO, :CREDITO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
        NROI = NROI + 1;
        END /* SUMA EN CARTERA */
    if (ERROR > 0) then
        VER = 'S';
    SUSPEND;
    END /* NO ANULADO */
  END /* EXISTE LA INTERFAZ */
ELSE
    BEGIN
    EXECUTE PROCEDURE ERROR (52, :IDDOC, :PREF, 1);
    ERROR = ERROR + 1;
    VER = 'S';
    SUSPEND;
    END
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE NOTACRPR_SIN_CONTABILIDAD(
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    ID INTEGER,
    IDI INTEGER,
    IDC INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    ESTADO VARCHAR(20),
    ERROR INTEGER)
AS
DECLARE VARIABLE VER CHAR(2);
declare variable FECICNT VARCHAR(10);
declare variable FECFCNT VARCHAR(10);
declare variable idref INTEGER;
BEGIN /*$$IBE$$ 
EXECUTE PROCEDURE fecha_a_conta(FECINI) returning_values (FECICNT);
EXECUTE PROCEDURE fecha_a_conta(FECFIN) returning_values (FECFCNT);
FOR SELECT NCPR_ID, PREF_PRE, NCPR_NUMERO FROM NOTAS_CREDITO_PROVEEDOR WHERE NCPR_ANULADO = 'N' AND
    NCPR_FECHA >= :FECINI AND NCPR_FECHA <= :FECFIN
    ORDER BY NCPR_ID INTO :ID, :PREF, :NUMERO
DO
  BEGIN
  idref = null;
  SELECT ENCO_IDREF FROM COMPROBANTE_ENCABEZADO WHERE ENCO_TIPOREF = 52 AND ENCO_FECHA >= :FECICNT AND ENCO_FECHA <= :FECFCNT and ENCO_IDREF = :id into :idref;
  if (idref IS NULL) then
  begin
  ESTADO = 'PROCESANDO';
  SUSPEND;
  SELECT MAX(INCA_ID) FROM INTERFAZ_CARTERA WHERE PREF_PRE = :PREF AND TIDO_COD = 52 INTO :IDI;
  if (IDI IS NOT NULL) then
    BEGIN
    EXECUTE PROCEDURE CONTABIL_NOTACRPR (:ID, :IDI) RETURNING_VALUES (:ERROR, :VER, :IDC);
    if (ERROR = 0) then
      BEGIN
      EXECUTE PROCEDURE CONTABILIZA_PENDIENTE (:IDC);
      ESTADO = 'OK';
      END
    ELSE
      ESTADO = 'ERROR';
    suspend;
    END
  end
  END
 $$IBE$$*/ SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE NOTACRPR_SIN_CONTABILIDAD(
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    ID INTEGER,
    IDI INTEGER,
    IDC INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    ESTADO VARCHAR(20),
    ERROR INTEGER)
AS
DECLARE VARIABLE VER CHAR(2);
declare variable FECICNT VARCHAR(10);
declare variable FECFCNT VARCHAR(10);
declare variable idref INTEGER;
BEGIN
EXECUTE PROCEDURE fecha_a_conta(FECINI) returning_values (FECICNT);
EXECUTE PROCEDURE fecha_a_conta(FECFIN) returning_values (FECFCNT);
FOR SELECT NCPR_ID, PREF_PRE, NCPR_NUMERO FROM NOTAS_CREDITO_PROVEEDOR WHERE NCPR_ANULADO = 'N' AND
    NCPR_FECHA >= :FECINI AND NCPR_FECHA <= :FECFIN
    ORDER BY NCPR_ID INTO :ID, :PREF, :NUMERO
DO
  BEGIN
  idref = null;
  SELECT ENCO_IDREF FROM COMPROBANTE_ENCABEZADO WHERE ENCO_TIPOREF = 52 AND ENCO_FECHA >= :FECICNT AND ENCO_FECHA <= :FECFCNT and ENCO_IDREF = :id into :idref;
  if (idref IS NULL) then
  begin
  ESTADO = 'PROCESANDO';
  SUSPEND;
  SELECT MAX(INCA_ID) FROM INTERFAZ_CARTERA WHERE PREF_PRE = :PREF AND TIDO_COD = 52 INTO :IDI;
  if (IDI IS NOT NULL) then
    BEGIN
    EXECUTE PROCEDURE CONTABIL_NOTACRPR (:ID, :IDI) RETURNING_VALUES (:ERROR, :VER, :IDC);
    if (ERROR = 0) then
      BEGIN
      EXECUTE PROCEDURE CONTABILIZA_PENDIENTE (:IDC);
      ESTADO = 'OK';
      END
    ELSE
      ESTADO = 'ERROR';
    suspend;
    END
  end
  END
END

^

SET TERM ; ^

/* 20090423B */
/* LEER ULTIMO COSTO Y PROMEDIO AL TIEMPO */
SET TERM ^ ;

CREATE OR ALTER PROCEDURE COSTO_PROMEDIO_Y_ULTIMO(
    ARTICULO VARCHAR(15),
    FECHA DATE)
RETURNS (
    COSTOP NUMERIC(18,2),
    UCOSTO NUMERIC(18,2))
AS
declare variable saldop numeric(18,2);
declare variable saldoc numeric(15,4);
declare variable entp numeric(18,2);
declare variable entc numeric(15,4);
BEGIN
SELECT first 1 COST_SALDOP, COST_ENTP,COST_SALDOC, COST_ENTC, COST_ULTIMO FROM COSTOS
    WHERE (ARTI_COD = :ARTICULO) AND (COST_FECHA <= :FECHA)
    order by COST_FECHA DESC, cost_item desc
    INTO :SALDOP, ENTP, :SALDOC, ENTC, :UCOSTO;
IF (SALDOC IS NULL) THEN
    COSTOP = 0;
ELSE
    if ((SALDOC < 0) AND (SALDOC+ENTC > 0)) then
        COSTOP = ENTP/ENTC;
    else
        /* Cuando hay existencia calcule el promedio, de otra manera retorne el ultimo */
        if (SALDOC+ENTC > 0) then
            COSTOP = (SALDOP+ENTP) / (SALDOC+ENTC);
        else
            COSTOP = UCOSTO;
SUSPEND;
END
^

SET TERM ; ^

grant EXECUTE ON PROCEDURE costo_promedio_y_ultimo to PUBLIC;

SET TERM ^ ;

CREATE OR ALTER PROCEDURE ACTUALICE_COSTO(
    ARTICULO VARCHAR(15),
    FECHA DATE,
    COSTO NUMERIC(18,2),
    CANTIDAD NUMERIC(18,2),
    ENTRADA CHAR(1),
    ANULAR CHAR(1),
    IDMOV INTEGER,
    TIPO INTEGER)
AS
DECLARE VARIABLE saldo NUMERIC(18,2);
DECLARE VARIABLE COSTOP NUMERIC(18,2);
DECLARE VARIABLE exart CHAR(1);
DECLARE VARIABLE UCOSTO NUMERIC(18,2);
declare variable FECAUX DATE;
declare variable SALDOC NUMERIC(15,4);
declare variable ITEM INTEGER;
declare variable UNIDAD VARCHAR(8);
BEGIN
/* Verfique si el artículo tiene control de existencias */
SELECT arti_exist, ARTI_UNIDAD FROM articulo WHERE arti_COD = :articulo
    INTO :exart, :UNIDAD;
IF (exart <> 'N') THEN
    BEGIN
    if (ANULAR = 'S') then
        BEGIN
        select cost_saldoc, cost_saldop from costos
            WHERE (arti_cod = :articulo) AND (cost_fecha = :fecha) AND (cost_idmov = :IDMOV) AND (COST_TIPO = :TIPO)
            into :SALDOC, :SALDO; /* para dejar inicializadas las 2 variables */
        DELETE FROM COSTOS WHERE (arti_cod = :articulo) AND (cost_fecha = :fecha) AND (cost_idmov = :IDMOV) AND (COST_TIPO = :TIPO);
        /* para inicializar el ultimo costo */
        SELECT MAX(COST_FECHA) FROM costos
            WHERE (arti_cod = :articulo) AND (cost_fecha <= :fecha) INTO :FECAUX;
        if (FECAUX IS NULL) then
            UCOSTO = 0;
        ELSE
            BEGIN
            SELECT MAX(COST_ITEM) FROM costos
                WHERE (arti_cod = :articulo) AND (cost_fecha = :fecaux) INTO :ITEM;
            SELECT COST_ULTIMO FROM costos
                WHERE (arti_cod = :articulo) AND (cost_fecha = :fecaux) AND (cost_item = :ITEM) INTO :UCOSTO;
            END
        END
    ELSE
        BEGIN
        select max(cost_fecha) from costos WHERE (arti_cod = :articulo) AND (cost_fecha <= :fecha) into :fecaux;
        select max(cost_item) from costos WHERE (arti_cod = :articulo) AND (cost_fecha = :fecaux) into :item;
        select (cost_saldoc + cost_entc - cost_salc) from costos WHERE (arti_cod = :articulo) AND (cost_fecha = :fecaux) AND (cost_item = :item) into :saldoc;
        if (saldoc is null) THEN
            SALDOC = 0;
        EXECUTE PROCEDURE costo_promedio_y_ultimo(:articulo, :fecha) RETURNING_VALUES (:costop, :ucosto);
        if (ENTRADA = 'S') then
            if (TIPO = 33) then
                BEGIN
                INSERT INTO COSTOS (arti_cod, cost_fecha,
                    cost_entc, cost_entp, cost_salc, cost_salp,
                    cost_saldoc, cost_saldop, cost_ultimo, cost_idmov, cost_tipo)
                    VALUES (:articulo, :fecha, :cantidad, :cantidad*:costop, 0, 0, :saldoc, :saldoc*:costop, :ucosto, :IDMOV, :TIPO);
                SALDO = (SALDOC * COSTOP) + (CANTIDAD * COSTOP);
                SALDOC = SALDOC + CANTIDAD;
                END
            ELSE
                BEGIN
                UCOSTO = :COSTO;
                INSERT INTO COSTOS (arti_cod, cost_fecha,
                    cost_entc, cost_entp, cost_salc, cost_salp,
                    cost_saldoc, cost_saldop, cost_ultimo, cost_idmov, cost_tipo)
                    VALUES (:articulo, :fecha, :cantidad, :cantidad*:costo, 0, 0, :saldoc, :saldoc*:costop, :costo, :IDMOV, :TIPO);
                SALDO = (SALDOC * COSTOP) + (CANTIDAD * COSTO);
                SALDOC = SALDOC + CANTIDAD;
                END
        ELSE
            BEGIN
            INSERT INTO COSTOS (arti_cod, cost_fecha,
                cost_entc, cost_entp, cost_salc, cost_salp,
                cost_saldoc, cost_saldop, cost_ultimo, cost_idmov, cost_tipo)
                VALUES (:articulo, :fecha, 0, 0, :cantidad, :cantidad*:costop, :saldoc, :saldoc*:costop, :UCOSTO, :IDMOV, :TIPO);
            SALDOC = SALDOC - CANTIDAD;
            SALDO = SALDOC * COSTOP; /* YA ESTA RESTADA LA CANTIDAD */
            END
        END
    END
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE CHEQUEO_COSTOS(
    ARTICULO VARCHAR(20),
    FECHA DATE)
AS
declare variable NUMROWS INTEGER;
DECLARE VARIABLE ID INTEGER;
DECLARE VARIABLE FECMV DATE;
DECLARE VARIABLE CANT NUMERIC(15,4);
DECLARE VARIABLE COSTO NUMERIC(18,2);
DECLARE VARIABLE ENTRADA CHAR(1);
DECLARE VARIABLE TIPO INTEGER;
begin /*$$IBE$$ 
SELECT COUNT(*) FROM COSTOS WHERE ARTI_COD = :ARTICULO AND COST_FECHA > :FECHA INTO :NUMROWS;
if (NUMROWS > 0) then
    BEGIN
    delete from costos where arti_cod = :ARTICULO AND COST_FECHA >= :FECHA;
    for select mvar_cons, mvar_fecha, mvar_cant, mvar_costo, mvar_entrada, mvar_tipodoc
        from movimiento_articulo WHERE ARTI_COD = :ARTICULO AND MVAR_FECHA >= :FECHA
        order by mvar_fecha, mvar_cons  $$IBE$$*/ /* SE HACE ESTRICTAMENTE EN ORDEN DE FECHA Y REGISTRO, SI LO EDITAN CAMBIA EL ORDEN */ /*$$IBE$$ 
        into :id, :fecmv, :cant, :costo, :entrada, :tipo
        do
        if ((TIPO <> 13)) then
            EXECUTE PROCEDURE actualice_costo(:ARTICULO, :fecmv, :costo, :cant, :entrada, 'N', :id, :tipo);
    END
 $$IBE$$*/ EXIT;
end
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE CHEQUEO_INVENTARIO(
    ARTINI VARCHAR(20),
    ARTFIN VARCHAR(20))
AS
DECLARE VARIABLE FECHA DATE;
DECLARE VARIABLE CANT NUMERIC(15,4);
DECLARE VARIABLE COSTO NUMERIC(18,2);
DECLARE VARIABLE ENTRADA CHAR(1);
DECLARE VARIABLE BODEGA CHAR(2);
DECLARE VARIABLE ID INTEGER;
DECLARE VARIABLE TIPO INTEGER;
declare variable TIPOEX CHAR(1);
DECLARE VARIABLE LOTE VARCHAR(20);
DECLARE VARIABLE EXISTE INTEGER;
declare variable ARTICULO VARCHAR(20);
declare variable IDL INTEGER;
BEGIN /*$$IBE$$ 
for select arti_cod from articulo where arti_cod >= :artini and arti_cod <= :artfin into :ARTICULO
  DO
  BEGIN
  DELETE FROM existencia_lote where arti_cod = :articulo;
  DELETE FROM lotes where arti_cod = :articulo;
  delete from costos where arti_cod = :ARTICULO;
  delete from existencia WHERE ARTI_COD = :ARTICULO;
  for select mvar_cons, mvar_fecha, mvar_cant, mvar_costo, mvar_entrada, bode_cod, mvar_tipodoc, mvar_lote
    from movimiento_articulo WHERE ARTI_COD = :ARTICULO
    order by mvar_fecha, mvar_cons
    into :id, :fecha, :cant, :costo, :entrada, :bodega, :tipo, :lote
  do
    begin
    SELECT ARTI_EXIST
        FROM   ARTICULO
        WHERE  ARTICULO.ARTI_COD = :ARTICULO
        INTO :TIPOEX;
    if ((TIPO <> 13)) then
        EXECUTE PROCEDURE actualice_costo(:ARTICULO, :fecha, :costo, :cant, :entrada, 'N', :id, :tipo);
     $$IBE$$*/ /* actualice existencias */ /*$$IBE$$ 
    if (:entrada = 'S') then
        begin
        execute procedure sume_existencia(:articulo, :bodega, :fecha, :cant, 'N');
        if (TIPOEX = 'L') then
            begin
            SELECT COUNT(*) FROM LOTES WHERE ARTI_COD = :ARTICULO AND BODE_COD = :BODEGA AND LOTE_NRO = :lote INTO :EXISTE;
            if (EXISTE > 0) then
                UPDATE LOTES
                    set lote_saldo = lote_saldo + :cant
                    where (arti_cod = :ARTICULO) and (BODE_COD = :BODEGA) AND (lote_nro = :lote);
            ELSE
                INSERT INTO LOTES (ARTI_COD, BODE_COD, LOTE_NRO, LOTE_FECHA, LOTE_CANT, LOTE_COSTO, LOTE_SALDO)
                    VALUES (:ARTICULO, :bodega, :lote, :fecha, :cant, :costo, :cant);
            end
        end
    else
        begin
        execute procedure reste_existencia(:articulo, :bodega, :fecha, :cant, 'N');
        if (TIPOEX = 'L') then
            begin
            SELECT COUNT(*) FROM LOTES WHERE ARTI_COD = :ARTICULO AND BODE_COD = :BODEGA AND LOTE_NRO = :lote INTO :EXISTE;
            if (EXISTE > 0) then
                UPDATE LOTES
                    set lote_saldo = lote_saldo - :cant
                    where (arti_cod = :ARTICULO) AND (BODE_COD = :BODEGA) and (lote_nro = :lote);
            ELSE
                BEGIN
                 $$IBE$$*/ /* ARREGLE EL LOTE YA QUE NO EXISTE */ /*$$IBE$$ 
                SELECT MIN(LOTE_ID) FROM LOTES WHERE ARTI_COD = :articulo AND BODE_COD = :BODEGA AND LOTE_SALDO >= :cant INTO :IDL;
                SELECT LOTE_NRO FROM LOTES WHERE LOTE_ID = :IDL INTO :LOTE;
                UPDATE MOVIMIENTO_ARTICULO SET MVAR_LOTE = :LOTE WHERE MVAR_CONS = :ID;
                UPDATE LOTES
                    set lote_saldo = lote_saldo - :cant
                    where (arti_cod = :ARTICULO) and (BODE_COD = :BODEGA) AND (lote_nro = :lote);
                END
            SELECT COUNT(*) FROM EXISTENCIA_LOTE
                WHERE LOTE_NRO = :LOTE AND EXLO_FECHA = :FECHA AND ARTI_COD = :ARTICULO AND BODE_COD = :bodega
                INTO :EXISTE;
            if (EXISTE > 0) then
                UPDATE EXISTENCIA_LOTE
                       SET EXLO_SAL = EXLO_SAL + :cant
                    WHERE LOTE_NRO = :LOTE AND EXLO_FECHA = :FECHA AND ARTI_COD = :ARTICULO AND BODE_COD = :bodega;
            else
                INSERT INTO EXISTENCIA_LOTE (ARTI_COD, BODE_COD, LOTE_NRO, EXLO_FECHA, EXLO_SAL)
                    VALUES (:ARTICULO, :BODEGA, :LOTE, :FECHA, :CANT);
            end
        end
    END
  END
 $$IBE$$*/ EXIT;
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE CHEQUEO_COSTOS(
    ARTICULO VARCHAR(20),
    FECHA DATE)
AS
declare variable NUMROWS INTEGER;
DECLARE VARIABLE ID INTEGER;
DECLARE VARIABLE FECMV DATE;
DECLARE VARIABLE CANT NUMERIC(15,4);
DECLARE VARIABLE COSTO NUMERIC(18,2);
DECLARE VARIABLE ENTRADA CHAR(1);
DECLARE VARIABLE TIPO INTEGER;
begin
SELECT COUNT(*) FROM COSTOS WHERE ARTI_COD = :ARTICULO AND COST_FECHA > :FECHA INTO :NUMROWS;
if (NUMROWS > 0) then
    BEGIN
    delete from costos where arti_cod = :ARTICULO AND COST_FECHA >= :FECHA;
    for select mvar_cons, mvar_fecha, mvar_cant, mvar_costo, mvar_entrada, mvar_tipodoc
        from movimiento_articulo WHERE ARTI_COD = :ARTICULO AND MVAR_FECHA >= :FECHA
        order by mvar_fecha, mvar_cons /* SE HACE ESTRICTAMENTE EN ORDEN DE FECHA Y REGISTRO, SI LO EDITAN CAMBIA EL ORDEN */
        into :id, :fecmv, :cant, :costo, :entrada, :tipo
        do
        if ((TIPO <> 13)) then
            EXECUTE PROCEDURE actualice_costo(:ARTICULO, :fecmv, :costo, :cant, :entrada, 'N', :id, :tipo);
    END
end

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE CHEQUEO_INVENTARIO(
    ARTINI VARCHAR(20),
    ARTFIN VARCHAR(20))
AS
DECLARE VARIABLE FECHA DATE;
DECLARE VARIABLE CANT NUMERIC(15,4);
DECLARE VARIABLE COSTO NUMERIC(18,2);
DECLARE VARIABLE ENTRADA CHAR(1);
DECLARE VARIABLE BODEGA CHAR(2);
DECLARE VARIABLE ID INTEGER;
DECLARE VARIABLE TIPO INTEGER;
declare variable TIPOEX CHAR(1);
DECLARE VARIABLE LOTE VARCHAR(20);
DECLARE VARIABLE EXISTE INTEGER;
declare variable ARTICULO VARCHAR(20);
declare variable IDL INTEGER;
BEGIN
for select arti_cod from articulo where arti_cod >= :artini and arti_cod <= :artfin into :ARTICULO
  DO
  BEGIN
  DELETE FROM existencia_lote where arti_cod = :articulo;
  DELETE FROM lotes where arti_cod = :articulo;
  delete from costos where arti_cod = :ARTICULO;
  delete from existencia WHERE ARTI_COD = :ARTICULO;
  for select mvar_cons, mvar_fecha, mvar_cant, mvar_costo, mvar_entrada, bode_cod, mvar_tipodoc, mvar_lote
    from movimiento_articulo WHERE ARTI_COD = :ARTICULO
    order by mvar_fecha, mvar_cons
    into :id, :fecha, :cant, :costo, :entrada, :bodega, :tipo, :lote
  do
    begin
    SELECT ARTI_EXIST
        FROM   ARTICULO
        WHERE  ARTICULO.ARTI_COD = :ARTICULO
        INTO :TIPOEX;
    if ((TIPO <> 13)) then
        EXECUTE PROCEDURE actualice_costo(:ARTICULO, :fecha, :costo, :cant, :entrada, 'N', :id, :tipo);
    /* actualice existencias */
    if (:entrada = 'S') then
        begin
        execute procedure sume_existencia(:articulo, :bodega, :fecha, :cant, 'N');
        if (TIPOEX = 'L') then
            begin
            SELECT COUNT(*) FROM LOTES WHERE ARTI_COD = :ARTICULO AND BODE_COD = :BODEGA AND LOTE_NRO = :lote INTO :EXISTE;
            if (EXISTE > 0) then
                UPDATE LOTES
                    set lote_saldo = lote_saldo + :cant
                    where (arti_cod = :ARTICULO) and (BODE_COD = :BODEGA) AND (lote_nro = :lote);
            ELSE
                INSERT INTO LOTES (ARTI_COD, BODE_COD, LOTE_NRO, LOTE_FECHA, LOTE_CANT, LOTE_COSTO, LOTE_SALDO)
                    VALUES (:ARTICULO, :bodega, :lote, :fecha, :cant, :costo, :cant);
            end
        end
    else
        begin
        execute procedure reste_existencia(:articulo, :bodega, :fecha, :cant, 'N');
        if (TIPOEX = 'L') then
            begin
            SELECT COUNT(*) FROM LOTES WHERE ARTI_COD = :ARTICULO AND BODE_COD = :BODEGA AND LOTE_NRO = :lote INTO :EXISTE;
            if (EXISTE > 0) then
                UPDATE LOTES
                    set lote_saldo = lote_saldo - :cant
                    where (arti_cod = :ARTICULO) AND (BODE_COD = :BODEGA) and (lote_nro = :lote);
            ELSE
                BEGIN
                /* ARREGLE EL LOTE YA QUE NO EXISTE */
                SELECT MIN(LOTE_ID) FROM LOTES WHERE ARTI_COD = :articulo AND BODE_COD = :BODEGA AND LOTE_SALDO >= :cant INTO :IDL;
                SELECT LOTE_NRO FROM LOTES WHERE LOTE_ID = :IDL INTO :LOTE;
                UPDATE MOVIMIENTO_ARTICULO SET MVAR_LOTE = :LOTE WHERE MVAR_CONS = :ID;
                UPDATE LOTES
                    set lote_saldo = lote_saldo - :cant
                    where (arti_cod = :ARTICULO) and (BODE_COD = :BODEGA) AND (lote_nro = :lote);
                END
            SELECT COUNT(*) FROM EXISTENCIA_LOTE
                WHERE LOTE_NRO = :LOTE AND EXLO_FECHA = :FECHA AND ARTI_COD = :ARTICULO AND BODE_COD = :bodega
                INTO :EXISTE;
            if (EXISTE > 0) then
                UPDATE EXISTENCIA_LOTE
                       SET EXLO_SAL = EXLO_SAL + :cant
                    WHERE LOTE_NRO = :LOTE AND EXLO_FECHA = :FECHA AND ARTI_COD = :ARTICULO AND BODE_COD = :bodega;
            else
                INSERT INTO EXISTENCIA_LOTE (ARTI_COD, BODE_COD, LOTE_NRO, EXLO_FECHA, EXLO_SAL)
                    VALUES (:ARTICULO, :BODEGA, :LOTE, :FECHA, :CANT);
            end
        end
    END
  END
END

^

SET TERM ; ^

SET TERM ^ ;

ALTER TRIGGER MOVIMIENTO_ARTICULO_AD
AS
declare variable LOTE CHAR(1);
BEGIN
  /* INSERTE EL NUEVO LOTE */
  SELECT ARTI_EXIST
    FROM   ARTICULO
    WHERE  ARTICULO.ARTI_COD = OLD.ARTI_COD
    INTO :LOTE;
  /* BORRE LOS VIEJOS */
  if (old.mvar_tipodoc <> 13) then
      BEGIN
      EXECUTE PROCEDURE actualice_costo(old.arti_cod, old.mvar_fecha, old.mvar_costo, old.mvar_cant, old.mvar_entrada, 'S', OLD.mvar_cons, OLD.mvar_tipodoc);
      EXECUTE PROCEDURE chequeo_costos(old.arti_cod, old.mvar_fecha);
      END
  /* actualice existencias */
  if (old.mvar_entrada = 'S') then
    BEGIN
    execute procedure sume_existencia(old.arti_cod, old.bode_cod, old.mvar_fecha, old.mvar_cant, 'S');
    if (LOTE = 'L') then
        UPDATE LOTES
            set lote_saldo = lote_saldo - old.mvar_cant
            where (arti_cod = old.ARTI_COD) and (bode_cod = old.bode_cod) and (lote_nro = old.mvar_lote);
    END
  else
    BEGIN
    execute procedure reste_existencia(old.arti_cod, old.bode_cod, old.mvar_fecha, old.mvar_cant, 'S');
    if (LOTE = 'L') then
        UPDATE LOTES
            set lote_saldo = lote_saldo + old.mvar_cant
            where (arti_cod = old.ARTI_COD) and (bode_cod = old.bode_cod) and (lote_nro = old.mvar_lote);
    END
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER TRIGGER MOVIMIENTO_ARTICULO_AI
AS
declare variable EXISTE CHAR(1);
declare variable LOTE CHAR(1);
BEGIN
  /* INSERTE EL NUEVO LOTE */
  SELECT ARTI_EXIST FROM ARTICULO WHERE ARTICULO.ARTI_COD = NEW.ARTI_COD INTO :LOTE;
  /* ACTUALICE COSTOS cuando no es transferencia */
  if (new.mvar_tipodoc <> 13) then
      BEGIN
      EXECUTE PROCEDURE actualice_costo(new.arti_cod, new.mvar_fecha, new.mvar_costo, new.mvar_cant, new.mvar_entrada, 'N', new.mvar_cons, new.mvar_tipodoc);
      EXECUTE PROCEDURE chequeo_costos(NEW.arti_cod, NEW.mvar_fecha);
      END
  /* actualice existencias */
  if (new.mvar_entrada = 'S') then
    BEGIN
    execute procedure sume_existencia(new.arti_cod, new.bode_cod, new.mvar_fecha, new.mvar_cant, 'N');
    if (LOTE = 'L') then
        BEGIN
        if (NEW.MVAR_LOTE IS NULL) then
            EXCEPTION LOTE_OBLIGATORIO 'Debe especificar un número de lote para el articulo ' || new.arti_cod;
        ELSE
         BEGIN
         EXISTE = 'N';
         SELECT 'S' FROM LOTES WHERE ARTI_COD = NEW.ARTI_COD AND BODE_COD = NEW.bode_cod AND LOTE_NRO = new.mvar_lote INTO :EXISTE;
         if (EXISTE = 'S') then
            UPDATE LOTES
             set lote_saldo = lote_saldo + new.mvar_cant
              where (arti_cod = NEW.ARTI_COD) and (BODE_COD = NEW.bode_cod) and (lote_nro = new.mvar_lote);
         ELSE
            INSERT INTO LOTES (ARTI_COD, BODE_COD, LOTE_NRO, LOTE_FECHA, LOTE_CANT, LOTE_COSTO, LOTE_SALDO)
                VALUES (NEW.ARTI_COD, NEW.bode_cod, NEW.mvar_lote, NEW.mvar_fecha, NEW.mvar_cant, NEW.mvar_costo, NEW.mvar_cant);
         END
        END
    END
  else
    BEGIN
    execute procedure reste_existencia(new.arti_cod, new.bode_cod, new.mvar_fecha, new.mvar_cant, 'N');
    /* ACTUALICE LA EXISTENCIA DEL LOTE */
    if (LOTE = 'L') then
    if (NEW.mvar_lote IS NULL) then
        EXCEPTION LOTE_NEGATIVO 'Debe indicar un número de lote para el artículo ' || new.arti_cod;
    ELSE
        BEGIN
        /* Actualice el saldo historico del lote */
        EXISTE = 'N';
        SELECT 'S' FROM EXISTENCIA_LOTE WHERE LOTE_NRO = NEW.MVAR_LOTE AND EXLO_FECHA = NEW.MVAR_FECHA AND ARTI_COD = NEW.arti_cod AND BODE_COD = NEW.bode_cod INTO :EXISTE;
        if (EXISTE = 'S') then
            BEGIN
            UPDATE EXISTENCIA_LOTE
                SET EXLO_SAL = EXLO_SAL + NEW.mvar_cant
                WHERE LOTE_NRO = NEW.MVAR_LOTE AND EXLO_FECHA = NEW.MVAR_FECHA AND ARTI_COD = NEW.ARTI_COD AND BODE_COD = NEW.bode_cod;
            END
        ELSE
            BEGIN
            INSERT INTO EXISTENCIA_LOTE (ARTI_COD, BODE_COD, LOTE_NRO, EXLO_FECHA, EXLO_SAL)
                VALUES (NEW.ARTI_COD, NEW.bode_cod, NEW.MVAR_LOTE, NEW.MVAR_FECHA, NEW.MVAR_CANT);
            END
        UPDATE LOTES
            set lote_saldo = lote_saldo - new.mvar_cant
            where (arti_cod = NEW.ARTI_COD) and (BODE_COD = NEW.bode_cod) and (lote_nro = new.mvar_lote);
        END
    END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER PROCEDURE CALCULA_PRECIOS(
    ARTICULO VARCHAR(20),
    FECHA DATE)
AS
declare variable LISTA INTEGER;
declare variable MARGEN NUMERIC(9, 4);
declare variable UTIL NUMERIC(9, 4);
declare variable UNIDAD VARCHAR(8);
declare variable UOR VARCHAR(20);
declare variable COSTOP NUMERIC(18, 2);
declare variable COSTOU NUMERIC(18, 2);
declare variable COSTO NUMERIC(18, 2);
declare variable DIG INTEGER;
declare variable IVAINC CHAR(1);
declare variable TARIVA NUMERIC(9,2);
declare variable AUTOM CHAR(1);
declare variable BASE varchar(10);
declare variable CAMBIO CHAR(7);
BEGIN
EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION','ARTICULOS','CAMBIO DE PRECIOS AUTOMATICO AL CAMBIAR COSTO O PRECIO') returning_values (CAMBIO);
if (CAMBIO = 'COSTO') then
  BEGIN
  FOR SELECT P.LIPR_COD, PRAR_MARGEN, PRAR_UTIL, LIPR_MODIF, PRAR_AUTO
    FROM PRECIOS_ARTICULO P, LISTA_PRECIOS L
    WHERE P.LIPR_COD = L.LIPR_COD AND ARTI_COD = :articulo
    INTO :LISTA, :MARGEN, :UTIL, :IVAINC, :AUTOM
    DO
      if (AUTOM = 'S') then
        BEGIN
        if (UTIL IS NULL) then
            UTIL = 0;
        if (MARGEN IS NULL) then
            MARGEN = 0;
        SELECT ARTI_UNIDAD, TAIV_PORC FROM ARTICULO A, TARIFA_IVA T WHERE A.TAIV_COD = T.TAIV_COD AND ARTI_COD = :ARTICULO INTO :UNIDAD, :TARIVA;
        EXECUTE PROCEDURE lee_configuracion('FACTURACION','ARTICULOS','COSTO BASE PARA CALCULO DE PRECIOS DE VENTA AUTOMATICOS') returning_values (:BASE);
        EXECUTE PROCEDURE costo_promedio_y_ultimo (:ARTICULO, :FECHA) RETURNING_VALUES(:COSTOP, :COSTOU);
        if (base = 'ULTIMO') then
            COSTO = COSTOU;
        ELSE
            BEGIN
            COSTO = COSTOP;
            if (base = 'MAYOR') then
                if (COSTOP < COSTOU) then
                    COSTO = COSTOU;
            END
        if (IVAINC = 'S') then
            COSTO = COSTO * (1 + TARIVA/100);
        EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION', 'ARTICULOS', 'SUGERIR PRECIOS CON PORCENTAJE DE MARGEN O UTILIDAD') RETURNING_VALUES (:UOR);
        EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION', 'ARTICULOS', 'REDONDEO AL MULTIPLO DE DIEZ EN PRECIOS') RETURNING_VALUES (:DIG);
        if (UOR = 'UTILIDAD') then
            BEGIN
            COSTO = COSTO * (1 + :UTIL/100);
            EXECUTE PROCEDURE REDONDEE (COSTO, DIG) returning_values (COSTO);
            UPDATE PRECIOS_ARTICULO
                SET PRAR_FIJO = :COSTO
                WHERE ARTI_COD = :ARTICULO AND LIPR_COD = :LISTA;
            END
        ELSE
            BEGIN
            COSTO = COSTO / (1 - :MARGEN/100);
            EXECUTE PROCEDURE REDONDEE (COSTO, DIG) returning_values (COSTO);
            UPDATE PRECIOS_ARTICULO
                SET PRAR_FIJO = :COSTO
                WHERE ARTI_COD = :ARTICULO AND LIPR_COD = :LISTA;
            END
        END
  END
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE CAMBIO_PRECIOS(
    FECHA DATE)
AS
declare variable ART VARCHAR(20);
BEGIN /*$$IBE$$ 
FOR SELECT ARTI_COD FROM ARTICULO INTO :ART DO
    EXECUTE PROCEDURE CALCULA_PRECIOS(:ART, :FECHA);
  SUSPEND;
 $$IBE$$*/ EXIT;
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE CAMBIO_PRECIOS(
    FECHA DATE)
AS
declare variable ART VARCHAR(20);
BEGIN
FOR SELECT ARTI_COD FROM ARTICULO INTO :ART DO
    EXECUTE PROCEDURE CALCULA_PRECIOS(:ART, :FECHA);
  SUSPEND;
END

^

SET TERM ; ^

SET TERM ^ ;

ALTER TRIGGER DESENSAMBLES_DETALLE_AI
AS
declare variable fec date;
declare variable CONC VARCHAR(60);
declare variable factor numeric(18,4);
declare variable COSTO numeric(18,2);
declare variable Pref varchar(4);
declare variable Num varchar(6);
declare variable CANT NUMERIC(18,2);
declare variable CANTOT CHAR(2);
BEGIN
  if ((NEW.DESE_id <> 0) and (new.dede_anulado = 'N')) then
    begin
    select dese_fecha, dese_conc, pref_pre, dese_numero, dese_cant * dese_factor
        from desensambles where dese_id = new.dese_id into :fec, :conc, :Pref, :Num, :CANT;
    execute procedure factor_unidad_cant(new.arti_cod, new.dede_unidad) returning_values(factor);
    execute procedure costo_promedio(new.arti_cod, :FEC) returning_values (:COSTO);
    EXECUTE PROCEDURE LEE_CONFIGURACION('INVENTARIO', 'ENSAMBLES', 'FORMACIONES CON CANTIDADES TOTALES') returning_values (:CANTOT);
    if (CANTOT <> 'SI') then
        CANT = CANT * factor * new.dede_cant;
    ELSE
        CANT = factor * new.dede_cant;
    INSERT INTO MOVIMIENTO_ARTICULO
      (ARTI_COD, MVAR_CONS, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM)
      VALUES(NEW.ARTI_COD, GEN_ID(ID_MOVARTI,1), NEW.BODE_COD, :FEC, 16, NEW.dese_id,
      :CONC, :CANT, :COSTO, 'S', new.dede_lote, :Pref, :Num, new.dese_item);

    /* RECORRA LAS LISTAS DE PRECIOS Y CAMBIE EL PRECIO */
    EXECUTE PROCEDURE CALCULA_PRECIOS(NEW.ARTI_COD, :fec);
    END
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER TRIGGER DESENSAMBLES_DETALLE_AU
AS
declare variable fec date;
declare variable CONC VARCHAR(60);
declare variable Pref varchar(4);
declare variable Num varchar(6);
declare variable factor numeric(18,4);
declare variable COSTO numeric(18,2);
declare variable CANT NUMERIC(18,2);
declare variable CANTOT CHAR(2);
BEGIN
/* Anule el anterior */
if ((OLD.DESE_ID <> 0) AND (OLD.dede_anulado = 'N')) then
    delete from movimiento_articulo where (mvar_tipodoc = 16) and (mvar_idref = old.DESE_id) and (mvar_item = old.dese_item);
if ((NEW.dese_id <> 0) AND (new.dede_anulado = 'N')) then
    BEGIN
    EXECUTE PROCEDURE LEE_CONFIGURACION('INVENTARIO', 'ENSAMBLES', 'FORMACIONES CON CANTIDADES TOTALES') returning_values (:CANTOT);
    select dese_fecha, dese_conc, pref_pre, dese_numero, dese_cant * dese_factor
        from desensambles where dese_id = new.dese_id into :fec, :conc, :Pref, :Num, :CANT;
    execute procedure factor_unidad_cant(new.arti_cod, new.dede_unidad) returning_values(factor);
    execute procedure costo_promedio(new.arti_cod, :FEC) returning_values (:COSTO);
    if (CANTOT <> 'SI') then
        CANT = CANT * factor * new.dede_cant;
    ELSE
        CANT = factor * new.dede_cant;
    INSERT INTO MOVIMIENTO_ARTICULO
        (ARTI_COD, MVAR_CONS, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM)
        VALUES(NEW.ARTI_COD, GEN_ID(ID_MOVARTI,1), NEW.BODE_COD, :FEC, 16, NEW.dese_id,
        :CONC, :CANT, :COSTO, 'S', new.dede_lote, :Pref, :Num, new.dese_item);

    /* RECORRA LAS LISTAS DE PRECIOS Y CAMBIE EL PRECIO */
    EXECUTE PROCEDURE CALCULA_PRECIOS(NEW.ARTI_COD, :fec);
    END
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER TRIGGER ENSAMBLES_AI
AS
declare variable COSTO NUMERIC(18,2);
BEGIN
if ((NEW.ENSA_id <> 0) and (new.ensa_anulado = 'N')) then
  begin
  COSTO = new.ensa_costo / NEW.ensa_factor;
  INSERT INTO MOVIMIENTO_ARTICULO
    (ARTI_COD, MVAR_CONS, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM)
    VALUES(NEW.ARTI_COD, GEN_ID(ID_MOVARTI,1), new.bode_cod, new.ensa_fecha, 15, NEW.ensa_id,
    new.ensa_conc, NEW.ensa_factor * new.ensa_cant, :COSTO, 'S', new.ensa_lote, new.pref_pre, new.ensa_numero, 0);

  /* RECORRA LAS LISTAS DE PRECIOS Y CAMBIE EL PRECIO */
  EXECUTE PROCEDURE CALCULA_PRECIOS(NEW.ARTI_COD, new.ensa_fecha);

  /* ingrese el retal */
  if ((new.ensa_codretal is not null) and (new.ensa_codretal <> '')) then
      INSERT INTO MOVIMIENTO_ARTICULO
        (ARTI_COD, MVAR_CONS, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM)
        VALUES(NEW.ensa_codretal, GEN_ID(ID_MOVARTI,1), new.bode_cod, new.ensa_fecha, 15, NEW.ensa_id,
        new.ensa_conc, new.ensa_cantretal, :COSTO, 'S', new.ensa_lote, new.pref_pre, new.ensa_numero, 999);

  INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
    VALUES (USER, 15, NEW.ensa_id, 'I', NEW.pref_pre || NEW.ensa_numero);
  end
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER TRIGGER ENSAMBLES_AU
AS
declare variable COSTO NUMERIC(18,2);
declare variable consec INTEGER;
BEGIN
/* BORRE LA CONTABILIZACION */
if (NEW.ensa_anulado = 'S') then
    BEGIN
    select enco_consec from comprobante_encabezado where enco_tiporef = 15 and enco_idref = old.ensa_id into :consec;
    if (NOT consec is null) then
     delete from comprobante_detalle where enco_consec = :consec;
    delete from comprobante_encabezado where enco_tiporef = 15 and enco_idref = old.ensa_id;
    INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
        VALUES (USER, 15, NEW.ensa_id, 'A', NEW.pref_pre || NEW.ensa_numero);
    END

/* BORRE EL ANTERIOR Y GRABE EL NUEVO */
if ((OLD.ensa_id <> 0) AND (OLD.ensa_anulado = 'N')) then
    begin
    delete from movimiento_articulo where (mvar_tipodoc = 15) and (mvar_idref = old.ensa_id) and (mvar_item = 0);
    delete from movimiento_articulo where (mvar_tipodoc = 15) and (mvar_idref = old.ensa_id) and (mvar_item = 999);
    end
if ((new.ensa_id <> 0) AND (NEW.ensa_anulado = 'N')) then
    begin
    COSTO = new.ensa_costo / NEW.ensa_factor;
    INSERT INTO MOVIMIENTO_ARTICULO
        (ARTI_COD, MVAR_CONS, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM)
        VALUES(NEW.ARTI_COD, GEN_ID(ID_MOVARTI,1), new.bode_cod, new.ensa_fecha, 15, NEW.ensa_id,
        new.ensa_conc, NEW.ensa_factor * new.ensa_cant, :COSTO, 'S', new.ensa_lote, new.pref_pre, new.ensa_numero, 0);

    /* RECORRA LAS LISTAS DE PRECIOS Y CAMBIE EL PRECIO */
    EXECUTE PROCEDURE CALCULA_PRECIOS(NEW.ARTI_COD, new.ensa_fecha);

    /* ingrese el retal */
    if ((new.ensa_codretal is not null) and (new.ensa_codretal <> '')) then
      INSERT INTO MOVIMIENTO_ARTICULO
        (ARTI_COD, MVAR_CONS, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM)
        VALUES(NEW.ensa_codretal, GEN_ID(ID_MOVARTI,1), new.bode_cod, new.ensa_fecha, 15, NEW.ensa_id,
        new.ensa_conc, new.ensa_cantretal, :COSTO, 'S', new.ensa_lote, new.pref_pre, new.ensa_numero, 999);

    INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
        VALUES (USER, 15, NEW.ensa_id, 'U', NEW.pref_pre || NEW.ensa_numero);
    end
/* SI CAMBIO LA FECHA ACTUALICE LOS DETALLES */
if ((OLD.pref_pre <> NEW.pref_pre) or
    (OLD.ensa_numero <> NEW.ensa_numero) or
    (OLD.ensa_fecha <> NEW.ensa_fecha) ) then
    UPDATE ENSAMBLES_DETALLE SET ESDE_TRANSMIT = 'N' WHERE ENSA_ID = OLD.ENSA_ID;

if (OLD.ensa_anulado <> NEW.ensa_anulado) then
    UPDATE ENSAMBLES_DETALLE SET ESDE_ANULADO = NEW.ensa_anulado WHERE ENSA_ID = OLD.ENSA_ID;

if (OLD.ensa_transmit <> NEW.ensa_transmit) then
    UPDATE ENSAMBLES_DETALLE SET ESDE_TRANSMIT = NEW.ensa_transmit WHERE ENSA_ID = OLD.ENSA_ID;
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER TRIGGER ENTRADAS_DETALLE_AI
AS
declare variable fec date;
declare variable CONC VARCHAR(60);
declare variable factor numeric(18,4);
declare variable Pref varchar(4);
declare variable Num varchar(6);
declare variable Nit varchar(20);
declare variable IVAINC CHAR(2);
declare variable COSTO NUMERIC(18,2);
BEGIN
  if ((NEW.entr_id <> 0) and (new.ende_anulado = 'N')) then
    BEGIN
    select entr_fecha, entr_conc, pref_pre, entr_numero, terc_nit, entr_imptos
        from entradas where entr_id = new.entr_id
        into :fec, :conc, :Pref, :Num, :Nit, :ivainc;
    execute procedure factor_unidad_cant(new.arti_cod, new.ende_unidad) returning_values(factor);
    COSTO = ((new.ende_costo - NEW.ende_dtomonto) / :factor);
    if (IVAINC = 'S') then
        COSTO = COSTO / (1 + NEW.ende_ivaporc/100);
    INSERT INTO MOVIMIENTO_ARTICULO
      (ARTI_COD, MVAR_CONS, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM, TERC_NIT)
      VALUES(NEW.ARTI_COD, GEN_ID(ID_MOVARTI,1), NEW.BODE_COD, :FEC, 11, NEW.entr_id,
      :CONC, :factor * new.ende_cant, :costo, 'S', new.ende_lote, :Pref, :Num, new.ende_item, :Nit);
    /* RECORRA LAS LISTAS DE PRECIOS Y CAMBIE EL PRECIO */
    EXECUTE PROCEDURE CALCULA_PRECIOS(NEW.ARTI_COD, :FEC);
    /* ACTUALICE EL STAND */
    if (new.ende_stand is not null) then
      if (exists(select stand_cod from stands where arti_cod = new.arti_cod and stand_bodega = new.bode_cod)) then
        UPDATE stands set stand_cod = new.ende_stand where arti_cod = new.arti_cod and stand_bodega = new.bode_cod;
      else
        INSERT INTO stands (ARTI_COD, STAND_BODEGA, STAND_COD) VALUES (NEW.arti_cod, NEW.bode_cod, NEW.ende_stand);
    END
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER TRIGGER ENTRADAS_DETALLE_AU
as
declare variable fec date;
declare variable CONC VARCHAR(60);
declare variable Pref varchar(4);
declare variable Num varchar(6);
declare variable Nit varchar(20);
declare variable factor numeric(18,4);
declare variable IVAINC CHAR(2);
declare variable COSTO NUMERIC(18,2);
BEGIN
if ((OLD.entr_id <> 0) AND (OLD.ende_anulado = 'N')) then
    DELETE FROM MOVIMIENTO_ARTICULO WHERE (mvar_tipodoc = 11) and (mvar_idref = new.entr_id) and (mvar_item = old.ende_item);
if ((NEW.entr_id <> 0) AND (NEW.ende_anulado = 'N')) then
    begin
    select entr_fecha, entr_conc, pref_pre, entr_numero, terc_nit, entr_imptos
        from entradas where entr_id = new.entr_id
        into :fec, :conc, :Pref, :Num, :Nit, :ivainc;
    execute procedure factor_unidad_cant(new.arti_cod, new.ende_unidad) returning_values(factor);
    COSTO = ((new.ende_costo - NEW.ende_dtomonto) / :factor);
    if (IVAINC = 'S') then
        COSTO = COSTO / (1 + NEW.ende_ivaporc/100);
    INSERT INTO MOVIMIENTO_ARTICULO
        (ARTI_COD, MVAR_CONS, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM, TERC_NIT)
        VALUES(NEW.ARTI_COD, GEN_ID(ID_MOVARTI,1), NEW.BODE_COD, :FEC, 11, NEW.entr_id,
        :CONC, :factor * new.ende_cant, :COSTO, 'S', new.ende_lote, :Pref, :Num, new.ende_item, :Nit);
    /* RECORRA LAS LISTAS DE PRECIOS Y CAMBIE EL PRECIO */
    EXECUTE PROCEDURE CALCULA_PRECIOS(NEW.ARTI_COD, :FEC);
    /* ACTUALICE EL STAND */
    if (new.ende_stand is not null) then
      if (exists(select stand_cod from stands where arti_cod = new.arti_cod and stand_bodega = new.bode_cod)) then
        UPDATE stands set stand_cod = new.ende_stand where arti_cod = new.arti_cod and stand_bodega = new.bode_cod;
      else
        INSERT INTO stands (ARTI_COD, STAND_BODEGA, STAND_COD) VALUES (NEW.arti_cod, NEW.bode_cod, NEW.ende_stand);
    END
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER TRIGGER FACTCOMP_DETALLE_AD
AS
declare variable fec date;
declare variable CONSO VARCHAR(2);
declare variable CONSOLIDA INTEGER;
declare variable NUMROWS INTEGER;
declare variable VERIF CHAR(2);
BEGIN
if ((old.fcde_anulado = 'N') and (OLD.faco_id <> 0)) then
    begin
    select faco_fecha, faco_consolida from facturas_compra where faco_id = old.faco_id into :fec, :consolida;
    DELETE FROM MOVIMIENTO_ARTICULO WHERE (mvar_tipodoc = 21) and (mvar_idref = old.faco_id) and (mvar_item = old.fcde_item);
    /* RECORRA LAS LISTAS DE PRECIOS Y CAMBIE EL PRECIO */
    EXECUTE PROCEDURE CALCULA_PRECIOS(old.ARTI_COD, :FEC);
    /* LOS PENDIENTES */
    if (CONSOLIDA <> 0) then
        BEGIN
        UPDATE consolidado_faltantes SET COFA_OK = 'N' WHERE COFA_ID = :consolida AND COFA_ITEM = old.FCDE_ITEM AND ARTI_COD = old.arti_cod;
        SELECT COUNT(CEFA_ITEM) FROM consolide_faltantes WHERE CEFA_ID = :CONSOLIDA INTO :NUMROWS;
        EXECUTE procedure LEE_CONFIGURACION ('COMPRAS','DOCUMENTOS','SUMAR CANTIDADES PENDIENTES AL CONSOLIDAR DOCUMENTOS') returning_values (CONSO);
        /* IGNORE LA CONSOLIDACION SI SE VALIDAN CODIGOS DE LA ORDEN */
        SELECT MIN(CEFA_TIPOORI) FROM consolide_faltantes WHERE CEFA_ID = :CONSOLIDA INTO :NUMROWS;
        if (NUMROWS = 23) then
            BEGIN
            EXECUTE PROCEDURE LEE_CONFIGURACION('COMPRAS', 'FACTURAS', 'VERIFICAR CODIGOS DE LA ORDEN') returning_values (VERIF);
            if (VERIF = 'SI') then
                CONSO = 'NO';
            END
        SELECT COUNT(CEFA_ITEM) FROM consolide_faltantes WHERE CEFA_ID = :CONSOLIDA INTO :NUMROWS;
        if ((CONSO = 'SI') AND (NUMROWS > 1)) then
            UPDATE consolidado_faltantes SET COFA_OK = 'N' WHERE COFA_ID = :consolida;
        END
    enD
END
^

SET TERM ; ^

SET TERM ^ ;

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

        if (COSTO > 0 ) then
         BEGIN
          /* ACTUALICE EL COSTO POR PROVEEDOR */
          SELECT PVAR_FECHA FROM PROVEEDOR_ARTICULO
            WHERE TERC_NIT = :Nit AND ARTI_COD = NEW.ARTI_COD
            INTO :FECAUX;
          if (FECAUX IS NULL) then
            INSERT INTO PROVEEDOR_ARTICULO (TERC_NIT, ARTI_COD, PVAR_COSTO, PVAR_FECHA, PVAR_COD,PVAR_DES)
                VALUES (:Nit, NEW.ARTI_COD, :COSTO, :fec, NEW.fcde_codprov,NEW.fcde_desc);
          else
            UPDATE PROVEEDOR_ARTICULO
                SET PVAR_COSTO = :COSTO, PVAR_FECHA = :fec, PVAR_COD = NEW.fcde_codprov
                WHERE ARTI_COD = NEW.ARTI_COD AND TERC_NIT = :Nit;
         END
        /* RECORRA LAS LISTAS DE PRECIOS Y CAMBIE EL PRECIO */
        EXECUTE PROCEDURE CALCULA_PRECIOS(NEW.ARTI_COD, :FEC);
        END /* AFECTAR INV */
    EXECUTE PROCEDURE lee_configuracion('COMPRAS', 'FACTURAS', 'ACTUALIZAR COSTOS DE LA REMISION RELACIONADA AL GRABAR LA FACTURA') returning_values (:ACTREM);
    if ((ACTREM = 'SI') and (Tipo = 22)) then
        BEGIN
        numrows = 0;
        select mvar_cons, MVAR_ITEM, MVAR_FECHA, MVAR_IDREF, MVAR_CANT, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO
            from movimiento_articulo M, consolidado_faltantes C
            where C.cofa_id = :CONSOLIDA AND mvar_tipodoc = 22 and mvar_idref = C.cofa_idori AND C.cofa_tipoori = 22 and m.arti_cod = new.arti_cod
            into :numrows, :iterem, :fecrem, :idrem, :cantrem, :loterem, :prefrem, :numrem;
        
        if (numrows <> 0) then
            BEGIN
            DELETE FROM MOVIMIENTO_ARTICULO WHERE MVAR_CONS = :numrows;
            INSERT INTO MOVIMIENTO_ARTICULO
                (ARTI_COD, MVAR_CONS, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM, TERC_NIT)
                VALUES(NEW.ARTI_COD, GEN_ID(ID_MOVARTI,1), NEW.BODE_COD, :fecrem, 22, :idrem,
                :CONC, :cantrem, :costo, 'S', :loterem, :prefrem, :numrem, :iterem, :Nit);
        
            if (COSTO > 0 ) then
                BEGIN
                /* ACTUALICE EL COSTO POR PROVEEDOR */
                SELECT PVAR_FECHA FROM PROVEEDOR_ARTICULO
                    WHERE TERC_NIT = :Nit AND ARTI_COD = NEW.ARTI_COD
                    INTO :FECAUX;
                if (FECAUX IS NULL) then
                    INSERT INTO PROVEEDOR_ARTICULO (TERC_NIT, ARTI_COD, PVAR_COSTO, PVAR_FECHA, PVAR_COD,PVAR_DES)
                        VALUES (:Nit, NEW.ARTI_COD, :COSTO, :fec, NEW.fcde_codprov,NEW.fcde_desc);
                else
                    UPDATE PROVEEDOR_ARTICULO
                        SET PVAR_COSTO = :COSTO, PVAR_FECHA = :fec, PVAR_COD = NEW.fcde_codprov
                        WHERE ARTI_COD = NEW.ARTI_COD AND TERC_NIT = :Nit;
                END
            /* RECORRA LAS LISTAS DE PRECIOS Y CAMBIE EL PRECIO */
            EXECUTE PROCEDURE CALCULA_PRECIOS(NEW.ARTI_COD, :FEC);
            END
        END

    /* ACTUALICE EL PENDIENTE  */
    if (CONSOLIDA <> 0) then
        BEGIN
        UPDATE consolidado_faltantes SET COFA_OK = 'S' WHERE COFA_ID = :consolida AND COFA_ITEM = NEW.FCDE_ITEM AND ARTI_COD = NEW.arti_cod;
        EXECUTE procedure LEE_CONFIGURACION ('COMPRAS','DOCUMENTOS','SUMAR CANTIDADES PENDIENTES AL CONSOLIDAR DOCUMENTOS') returning_values (CONSO);
        /* IGNORE LA CONSOLIDACION SI SE VALIDAN CODIGOS DE LA ORDEN */
        SELECT MIN(CEFA_TIPOORI) FROM consolide_faltantes WHERE CEFA_ID = :CONSOLIDA INTO :NUMROWS;
        if (NUMROWS = 23) then
            BEGIN
            EXECUTE PROCEDURE LEE_CONFIGURACION('COMPRAS', 'FACTURAS', 'VERIFICAR CODIGOS DE LA ORDEN') returning_values (MENORV);
            if (MENORV = 'SI') then
                CONSO = 'NO';
            END
        SELECT COUNT(CEFA_ITEM) FROM consolide_faltantes WHERE CEFA_ID = :CONSOLIDA INTO :NUMROWS;
        if ((CONSO = 'SI') AND (NUMROWS > 1)) then
            UPDATE consolidado_faltantes SET COFA_IDDES = NEW.faco_id, COFA_OK = 'S' WHERE COFA_ID = :consolida;
        else
            BEGIN
            /* BUSQUE EL CONSOLIDADO EN EL MISMO ITEM Y SI ES DIFERENTE ACTUALICELO */
            select COFA_CANT * COFA_FACTOR FROM consolidado_faltantes WHERE COFA_ID = :consolida AND COFA_ITEM = NEW.FCDE_ITEM AND ARTI_COD = NEW.arti_cod INTO :CANTREL;
            if (NEW.FCDE_CANT * NEW.FCDE_FACTOR < CANTREL) then
                UPDATE consolidado_faltantes SET COFA_IDDES = NEW.faco_id, COFA_CANT = NEW.FCDE_CANT, COFA_FACTOR = NEW.FCDE_FACTOR
                    WHERE COFA_ID = :consolida AND COFA_ITEM = NEW.FCDE_ITEM AND ARTI_COD = NEW.arti_cod;
            END
        END
    /* ACTUALICE EL STAND */
    if (new.fcde_stand is not null) then
      if (exists(select stand_cod from stands where arti_cod = new.arti_cod and stand_bodega = new.bode_cod)) then
        UPDATE stands set stand_cod = new.fcde_stand where arti_cod = new.arti_cod and stand_bodega = new.bode_cod;
      else
        INSERT INTO stands (ARTI_COD, STAND_BODEGA, STAND_COD) VALUES (NEW.arti_cod, NEW.bode_cod, NEW.fcde_stand);
    END
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER TRIGGER FACTCOMP_DETALLE_AU
as
declare variable fec date;
declare variable fecaux date;
declare variable AUX varchar(90);
declare variable CONC VARCHAR(60);
declare variable Pref varchar(4);
declare variable Num varchar(6);
declare variable Nit varchar(20);
declare variable factor numeric(18,4);
declare variable TIPO INTEGER;
declare variable INVFAC CHAR(2);
declare variable IVAINC CHAR(2);
declare variable COSTO NUMERIC(18,2);
declare variable CANTREL NUMERIC(18,4);
declare variable NUMPROV VARCHAR(10);
declare variable NUMPED VARCHAR(30);
declare variable NUMREM VARCHAR(30);
declare variable CONSO VARCHAR(2);
declare variable CONSOLIDA INTEGER;
declare variable NUMROWS INTEGER;
declare variable DTOPIE NUMERIC(18,2);
declare variable ADICIONAL NUMERIC(18,2);
declare variable TOTAL NUMERIC(18,2);
declare variable IVAMONTO NUMERIC(18,2);
declare variable EXTRA NUMERIC(18,2);
declare variable FACT NUMERIC(18,4);
declare variable MENORV CHAR(2);
declare variable ACTREM CHAR(2);
declare variable FECREM date;
declare variable IDREM INTEGER;
declare variable ITEREM INTEGER;
declare variable CANTREM NUMERIC(18,4);
declare variable LOTEREM VARCHAR(15);
declare variable PREFREM CHAR(4);
BEGIN
if (old.fcde_devuelto = new.fcde_devuelto) then
    begin
    /* deshaga lo viejo */
    if ((old.fcde_anulado = 'N') and (OLD.faco_id <> 0)) then
        begin
        select faco_fecha, faco_consolida from facturas_compra where faco_id = old.faco_id into :fec, :consolida;
        DELETE FROM MOVIMIENTO_ARTICULO WHERE (mvar_tipodoc = 21) and (mvar_idref = old.faco_id) and (mvar_item = old.fcde_item);
        /* RECORRA LAS LISTAS DE PRECIOS Y CAMBIE EL PRECIO */
        EXECUTE PROCEDURE CALCULA_PRECIOS(old.ARTI_COD, :FEC);
        /* LOS PENDIENTES */
        if (CONSOLIDA <> 0) then
            BEGIN
            UPDATE consolidado_faltantes SET COFA_OK = 'N' WHERE COFA_ID = :consolida AND COFA_ITEM = old.FCDE_ITEM AND ARTI_COD = old.arti_cod;
            SELECT COUNT(CEFA_ITEM) FROM consolide_faltantes WHERE CEFA_ID = :CONSOLIDA INTO :NUMROWS;
            EXECUTE procedure LEE_CONFIGURACION ('COMPRAS','DOCUMENTOS','SUMAR CANTIDADES PENDIENTES AL CONSOLIDAR DOCUMENTOS') returning_values (CONSO);
            /* IGNORE LA CONSOLIDACION SI SE VALIDAN CODIGOS DE LA ORDEN */
            SELECT MIN(CEFA_TIPOORI) FROM consolide_faltantes WHERE CEFA_ID = :CONSOLIDA INTO :NUMROWS;
            if (NUMROWS = 23) then
                BEGIN
                EXECUTE PROCEDURE LEE_CONFIGURACION('COMPRAS', 'FACTURAS', 'VERIFICAR CODIGOS DE LA ORDEN') returning_values (MENORV);
                if (MENORV = 'SI') then
                    CONSO = 'NO';
                END
            if (CONSO = 'SI') then
                UPDATE consolidado_faltantes SET COFA_OK = 'N' WHERE COFA_ID = :consolida;
            END
        end
    /* Registre el nuevo */
    if ((new.fcde_anulado = 'N') and (new.faco_id <> 0)) then
        BEGIN
        select faco_fecha, pref_pre, faco_numero, terc_nit, faco_imptos, faco_numprov, faco_remision, faco_orden, faco_consolida, faco_dtomonto, faco_adicional, faco_total, faco_ivamonto, faco_extra
            from facturas_compra where faco_id = new.faco_id
            into :fec, :Pref, :Num, :Nit, :ivainc, :numprov, :numrem, :numped, :consolida, :dtopie, :adicional, :total, :ivamonto, :extra;
        conc = 'FACTURA DE COMPRA No.' || PREF || NUM || '-' || NUMPROV;
        if (NUMREM <> '') then
            BEGIN
            AUX = SUBSTR(NUMREM, 1, 15);
            conc = conc || '-REM:' || AUX;
            END
        else
            if (NUMPED <> '') then
                BEGIN
                AUX = SUBSTR(NUMPED, 1, 15);
                conc = conc || '-ORDEN ' || AUX;
                END
        SELECT MAX(CEFA_TIPOORI) FROM consolide_faltantes WHERE CEFA_ID = :CONSOLIDA INTO :TIPO;
        if (Tipo is null) then
            Tipo = 0;
        execute procedure lee_configuracion('COMPRAS', 'FACTURAS', 'AFECTAR INVENTARIO CON LA FACTURA') returning_values (:INVFAC);
        /* si se hizo con base en una remision no afecte inventario */
        if ((Tipo <> 22) and (INVFAC = 'SI')) then
            begin
            execute procedure factor_unidad_cant(new.arti_cod, new.fcde_unidad) returning_values(factor);
            COSTO = ((new.fcde_prunit - NEW.fcde_dtomonto) / :factor);
            if (IVAINC = 'S') then
                COSTO = COSTO / (1 + NEW.fcde_ivaporc/100);
            EXECUTE PROCEDURE lee_configuracion('COMPRAS','FACTURAS','DESCUENTO Y VALOR ADICIONAL DEL DOCUMENTO COMO MENOR VALOR DEL COSTO') returning_values (:MENORV);
            if (MENORV = 'SI') then
                BEGIN
                FACT = (TOTAL - EXTRA - IVAMONTO);
                if ((FACT - ADICIONAL + DTOPIE) <> 0) then
                    FACT = FACT / (FACT - ADICIONAL + DTOPIE);
                ELSE
                    FACT = 1;
                COSTO = COSTO * FACT;
                END
            INSERT INTO MOVIMIENTO_ARTICULO
                (ARTI_COD, MVAR_CONS, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM, TERC_NIT)
                VALUES(NEW.ARTI_COD, GEN_ID(ID_MOVARTI,1), NEW.BODE_COD, :FEC, 21, NEW.faco_id,
                :CONC, :factor * new.fcde_cant, :COSTO, 'S', new.fcde_lote, :Pref, :Num, NEW.fcde_item, :Nit);
            if (COSTO > 0 ) then
             BEGIN
              /* ACTUALICE EL COSTO POR PROVEEDOR */
              SELECT PVAR_FECHA FROM PROVEEDOR_ARTICULO
                WHERE TERC_NIT = :Nit AND ARTI_COD = NEW.ARTI_COD INTO :FECAUX;
              if (FECAUX IS NULL) then
                INSERT INTO PROVEEDOR_ARTICULO (TERC_NIT, ARTI_COD, PVAR_COSTO, PVAR_FECHA, PVAR_COD,PVAR_DES)
                    VALUES (:Nit, NEW.ARTI_COD, :COSTO, :fec, NEW.fcde_codprov,NEW.fcde_desc);
              else
                UPDATE PROVEEDOR_ARTICULO
                    SET PVAR_COSTO = :COSTO, PVAR_FECHA = :fec, PVAR_COD = NEW.fcde_codprov
                    WHERE ARTI_COD = NEW.ARTI_COD AND TERC_NIT = :Nit;
             END
            /* RECORRA LAS LISTAS DE PRECIOS Y CAMBIE EL PRECIO */
            EXECUTE PROCEDURE CALCULA_PRECIOS(NEW.ARTI_COD, :FEC);
            end
        EXECUTE PROCEDURE lee_configuracion('COMPRAS', 'FACTURAS', 'ACTUALIZAR COSTOS DE LA REMISION RELACIONADA AL GRABAR LA FACTURA') returning_values (:ACTREM);
        if ((ACTREM = 'SI') and (Tipo = 22)) then
            BEGIN
            numrows = 0;
            select mvar_cons, MVAR_ITEM, MVAR_FECHA, MVAR_IDREF, MVAR_CANT, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO
                from movimiento_articulo M, consolidado_faltantes C
                where C.cofa_id = :CONSOLIDA AND mvar_tipodoc = 22 and mvar_idref = C.cofa_idori AND C.cofa_tipoori = 22 and m.arti_cod = new.arti_cod
                into :numrows, :iterem, :fecrem, :idrem, :cantrem, :loterem, :prefrem, :numrem;
            
            if (numrows <> 0) then
                BEGIN
                DELETE FROM MOVIMIENTO_ARTICULO WHERE MVAR_CONS = :numrows;
                INSERT INTO MOVIMIENTO_ARTICULO
                    (ARTI_COD, MVAR_CONS, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM, TERC_NIT)
                    VALUES(NEW.ARTI_COD, GEN_ID(ID_MOVARTI,1), NEW.BODE_COD, :fecrem, 22, :idrem,
                    :CONC, :cantrem, :costo, 'S', :loterem, :prefrem, :numrem, :iterem, :Nit);
        
                if (COSTO > 0 ) then
                    BEGIN
                    /* ACTUALICE EL COSTO POR PROVEEDOR */
                    SELECT PVAR_FECHA FROM PROVEEDOR_ARTICULO
                        WHERE TERC_NIT = :Nit AND ARTI_COD = NEW.ARTI_COD
                        INTO :FECAUX;
                    if (FECAUX IS NULL) then
                        INSERT INTO PROVEEDOR_ARTICULO (TERC_NIT, ARTI_COD, PVAR_COSTO, PVAR_FECHA, PVAR_COD,PVAR_DES)
                            VALUES (:Nit, NEW.ARTI_COD, :COSTO, :fec, NEW.fcde_codprov,NEW.fcde_desc);
                    else
                        UPDATE PROVEEDOR_ARTICULO
                            SET PVAR_COSTO = :COSTO, PVAR_FECHA = :fec, PVAR_COD = NEW.fcde_codprov
                            WHERE ARTI_COD = NEW.ARTI_COD AND TERC_NIT = :Nit;
                    END
                /* RECORRA LAS LISTAS DE PRECIOS Y CAMBIE EL PRECIO */
                EXECUTE PROCEDURE CALCULA_PRECIOS(NEW.ARTI_COD, :FEC);
                END
            END

        if (CONSOLIDA <> 0) then
            begin
            UPDATE consolidado_faltantes SET COFA_OK = 'S' WHERE COFA_ID = :consolida AND COFA_ITEM = NEW.FCDE_ITEM AND ARTI_COD = NEW.arti_cod;
            EXECUTE procedure LEE_CONFIGURACION ('COMPRAS','DOCUMENTOS','SUMAR CANTIDADES PENDIENTES AL CONSOLIDAR DOCUMENTOS') returning_values (CONSO);
            /* IGNORE LA CONSOLIDACION SI SE VALIDAN CODIGOS DE LA ORDEN */
            SELECT MIN(CEFA_TIPOORI) FROM consolide_faltantes WHERE CEFA_ID = :CONSOLIDA INTO :NUMROWS;
            if (NUMROWS = 23) then
                BEGIN
                EXECUTE PROCEDURE LEE_CONFIGURACION('COMPRAS', 'FACTURAS', 'VERIFICAR CODIGOS DE LA ORDEN') returning_values (MENORV);
                if (MENORV = 'SI') then
                    CONSO = 'NO';
                END
            SELECT COUNT(CEFA_ITEM) FROM consolide_faltantes WHERE CEFA_ID = :CONSOLIDA INTO :NUMROWS;
            if ((CONSO = 'SI') AND (NUMROWS > 1)) then
                UPDATE consolidado_faltantes SET COFA_IDDES = NEW.faco_id, COFA_OK = 'S' WHERE COFA_ID = :consolida;
            else
                BEGIN
                /* BUSQUE EL CONSOLIDADO EN EL MISMO ITEM Y SI ES DIFERENTE ACTUALICELO */
                select COFA_CANT * COFA_FACTOR FROM consolidado_faltantes WHERE COFA_ID = :consolida AND COFA_ITEM = NEW.FCDE_ITEM AND ARTI_COD = NEW.arti_cod INTO :CANTREL;
                if (NEW.FCDE_CANT * NEW.FCDE_FACTOR < CANTREL) then
                    UPDATE consolidado_faltantes SET COFA_IDDES = NEW.faco_id, COFA_CANT = NEW.FCDE_CANT, COFA_FACTOR = NEW.FCDE_FACTOR
                        WHERE COFA_ID = :consolida AND COFA_ITEM = NEW.FCDE_ITEM AND ARTI_COD = NEW.arti_cod;
                END
            end
        /* ACTUALICE EL STAND */
        if (new.fcde_stand is not null) then
          if (exists(select stand_cod from stands where arti_cod = new.arti_cod and stand_bodega = new.bode_cod)) then
            UPDATE stands set stand_cod = new.fcde_stand where arti_cod = new.arti_cod and stand_bodega = new.bode_cod;
          else
            INSERT INTO stands (ARTI_COD, STAND_BODEGA, STAND_COD) VALUES (NEW.arti_cod, NEW.bode_cod, NEW.fcde_stand);
        END
    end
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER TRIGGER NOTAS_CREDITO_PROVEEDOR_AI
AS
declare variable COSTO NUMERIC(18,2);
declare variable EXISTENCIA NUMERIC(18,4);
declare variable CODBOD VARCHAR(3);
BEGIN
if ((NEW.NCPR_ID <> 0) and (new.ncpr_anulado = 'N')) then
    BEGIN
    /* Registre el nuevo saldo del documento */
    INSERT INTO SALDOS_DOC_CXPAGAR (SDCP_TIPOREF, SDCP_IDREF, SDCP_FECHA, TERC_NIT, SDCP_RTEFTE, SDCP_RTIVA, SDCP_RTICA, SDCP_ABONO, SDCP_ABRTFTE, SDCP_ABRTIVA, SDCP_ABRTICA, SDCP_DEBITO, SDCP_MONTO, SDCP_TRM)
        VALUES (52, NEW.NCPR_ID, NEW.ncpr_fecha, NEW.terc_nit, (NEW.ncpr_rtftemonto * -1), (NEW.ncpr_rtivamonto * -1), (NEW.ncpr_rticamonto * -1), 0, 0, 0, 0, 'N', (NEW.ncpr_monto+NEW.ncpr_ivamonto)*-1, NEW.ncpr_trm);
    /* Registre el movimiento del proveedor */
    INSERT INTO MOVIMIENTO_PROVEEDOR (MVPR_ID, TERC_NIT, MVPR_TIPOREF, MVPR_IDREF, MVPR_FECHA, MVPR_VENCE, MVPR_CONC, MVPR_MONTO, MVPR_RTFTE, MVPR_RTIVA, MVPR_RTICA, MVPR_DEBITO, MVPR_ABONO, MVPR_PREFIJO, MVPR_NUMERO, MVPR_TRM)
      VALUES (GEN_ID(ID_MOVPROV, 1), NEW.TERC_NIT, 52, NEW.NCPR_ID, NEW.NCPR_FECHA, NEW.NCPR_FECHA, NEW.NCPR_CONC, NEW.NCPR_MONTO+NEW.NCPR_IVAMONTO, NEW.NCPR_RTFTEMONTO, NEW.NCPR_RTIVAMONTO, NEW.NCPR_RTICAMONTO, 'N', 'N', NEW.pref_pre, NEW.ncpr_numero, NEW.ncpr_trm);
    /* afecte el articulo */
    if (new.arti_cod <> '') then
        begin
        /* CALCULE EL NUEVO COSTO */
        execute procedure costo_promedio (new.arti_cod, new.ncpr_fecha) returning_values (:COSTO);
        execute procedure saldo_total_inventario (new.arti_cod, new.ncpr_fecha) returning_values (:EXISTENCIA);
        COSTO = ((COSTO * EXISTENCIA) - NEW.ncpr_monto) / EXISTENCIA;
        FOR SELECT DISTINCT BODE_COD FROM EXISTENCIA WHERE ARTI_COD = NEW.ARTI_COD INTO :CODBOD do
            BEGIN
            execute procedure saldo_inventario (new.arti_cod, :CODBOD, new.ncpr_fecha) returning_values (:EXISTENCIA);
            if (EXISTENCIA <> 0) then
                BEGIN
                /* SAQUE TODO LO QUE TENGA */
                INSERT INTO MOVIMIENTO_ARTICULO
                  (ARTI_COD, MVAR_CONS, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM, TERC_NIT)
                  VALUES(NEW.ARTI_COD, GEN_ID(ID_MOVARTI,1), :CODBOD, new.ncpr_fecha, 52, NEW.ncpr_id,
                  new.ncpr_conc, :EXISTENCIA, 0, 'N', '', new.pref_pre, new.ncpr_numero, 1, new.terc_nit);
                END
            END
        FOR SELECT DISTINCT BODE_COD, MVAR_CANT FROM MOVIMIENTO_ARTICULO WHERE MVAR_TIPODOC = 52 AND MVAR_IDREF = NEW.ncpr_id
            INTO :CODBOD, :existencia do
            BEGIN
            /* META TODO CON EL NUEVO COSTO */
            INSERT INTO MOVIMIENTO_ARTICULO
              (ARTI_COD, MVAR_CONS, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM, TERC_NIT)
              VALUES(NEW.ARTI_COD, GEN_ID(ID_MOVARTI,1), :CODBOD, new.ncpr_fecha, 52, NEW.ncpr_id,
              new.ncpr_conc, :EXISTENCIA, :COSTO, 'S', '', new.pref_pre, new.ncpr_numero, 1, new.terc_nit);
            END
        /* RECORRA LAS LISTAS DE PRECIOS Y CAMBIE EL PRECIO */
        EXECUTE PROCEDURE CALCULA_PRECIOS(NEW.ARTI_COD, new.ncpr_fecha);
        end
    INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
        VALUES (USER, 52, NEW.ncpr_id, 'I', NEW.pref_pre || NEW.ncpr_numero);
    END
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER TRIGGER NOTAS_CREDITO_PROVEEDOR_AU
AS
declare variable ABONOS char(1);
declare variable consec INTEGER;
declare variable COSTO NUMERIC(18,2);
declare variable EXISTENCIA NUMERIC(18,4);
declare variable CODBOD VARCHAR(3);
BEGIN
if (new.ncpr_anulado = 'S') then
    begin
    select enco_consec from comprobante_encabezado where enco_tiporef = 52 and enco_idref = old.ncpr_id into :consec;
    if (NOT consec is null) then
      delete from comprobante_detalle where enco_consec = :consec;
    delete from comprobante_encabezado where enco_tiporef = 52 and enco_idref = old.ncpr_id;
    INSERT INTO AUDITORIA (AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
        VALUES (USER, 52, new.ncpr_id, 'A', NEW.pref_pre || NEW.ncpr_numero);
    end

/* BORRE EL REGISTRO PREVIO */
if ((old.ncpr_id <> 0) and (old.ncpr_anulado = 'N')) then
    begin
    /* Verifique si habia abonos a la nota */
    ABONOS = 'N';
    select 'S' FROM SALDOS_DOC_CXPAGAR WHERE SDCP_TIPOREF = 52 AND SDCP_IDREF = OLD.NCPR_ID AND SDCP_ABONO <> 0 INTO :ABONOS;
    if (ABONOS = 'N') then
        BEGIN
        /* BORRE EL REGISTRO PREVIO */
        delete from saldos_doc_cxpagar where sdcp_tiporef = 52 and sdcp_idref = old.ncpr_id;
        delete from movimiento_PROVEEDOR where (mvpr_tiporef = 52) and (mvpr_idref = old.ncpr_id);
        delete from movimiento_articulo where  (mvar_tipodoc = 52) and (mvar_idref = old.ncpr_id);
        END
    else
        exception DOCUMENTO_CON_ABONOS 'El descuento de proveedor ' || old.pref_pre || old.ncpr_numero || ' tiene abonos registrados.';
    end
if ((new.ncpr_id <> 0) and (new.ncpr_anulado = 'N')) then
    begin
    /* Registre el nuevo saldo del documento */
    INSERT INTO SALDOS_DOC_CXPAGAR (SDCP_TIPOREF, SDCP_IDREF, SDCP_FECHA, TERC_NIT, SDCP_RTEFTE, SDCP_RTIVA, SDCP_RTICA, SDCP_ABONO, SDCP_ABRTFTE, SDCP_ABRTIVA, SDCP_ABRTICA, SDCP_DEBITO, SDCP_MONTO, SDCP_TRM)
        VALUES (52, NEW.NCPR_ID, NEW.ncpr_fecha, NEW.terc_nit, (NEW.ncpr_rtftemonto * -1), (NEW.ncpr_rtivamonto * -1), (NEW.ncpr_rticamonto * -1), 0, 0, 0, 0, 'N', (NEW.ncpr_monto+NEW.ncpr_ivamonto)*-1, NEW.ncpr_trm);
    /* Registre el movimiento del proveedor */
    INSERT INTO MOVIMIENTO_PROVEEDOR (MVPR_ID, TERC_NIT, MVPR_TIPOREF, MVPR_IDREF, MVPR_FECHA, MVPR_VENCE, MVPR_CONC, MVPR_MONTO, MVPR_RTFTE, MVPR_RTIVA, MVPR_RTICA, MVPR_DEBITO, MVPR_ABONO, MVPR_PREFIJO, MVPR_NUMERO, MVPR_TRM)
        VALUES (GEN_ID(ID_MOVPROV, 1), NEW.TERC_NIT, 52, NEW.NCPR_ID, NEW.NCPR_FECHA, NEW.NCPR_FECHA, NEW.NCPR_CONC, NEW.NCPR_MONTO+NEW.ncpr_ivamonto, NEW.NCPR_RTFTEMONTO, NEW.NCPR_RTIVAMONTO, NEW.NCPR_RTICAMONTO, 'N', 'N', NEW.pref_pre, NEW.ncpr_numero, NEW.ncpr_trm);
    /* afecte el articulo */
    if (new.arti_cod <> '') then
        begin
        /* CALCULE EL NUEVO COSTO */
        execute procedure costo_promedio (new.arti_cod, new.ncpr_fecha) returning_values (:COSTO);
        execute procedure saldo_total_inventario (new.arti_cod, new.ncpr_fecha) returning_values (:EXISTENCIA);
        COSTO = ((COSTO * EXISTENCIA) - NEW.ncpr_monto) / EXISTENCIA;
        FOR SELECT DISTINCT BODE_COD FROM EXISTENCIA WHERE ARTI_COD = NEW.ARTI_COD INTO :CODBOD do
            BEGIN
            execute procedure saldo_inventario (new.arti_cod, :CODBOD, new.ncpr_fecha) returning_values (:EXISTENCIA);
            if (EXISTENCIA <> 0) then
                BEGIN
                /* SAQUE TODO LO QUE TENGA */
                INSERT INTO MOVIMIENTO_ARTICULO
                    (ARTI_COD, MVAR_CONS, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM, TERC_NIT)
                    VALUES(NEW.ARTI_COD, GEN_ID(ID_MOVARTI,1), :CODBOD, new.ncpr_fecha, 52, NEW.ncpr_id,
                    new.ncpr_conc, :EXISTENCIA, 0, 'N', '', new.pref_pre, new.ncpr_numero, 1, new.terc_nit);
                end
            END
        FOR SELECT DISTINCT BODE_COD, MVAR_CANT FROM MOVIMIENTO_ARTICULO WHERE MVAR_TIPODOC = 52 AND MVAR_IDREF = NEW.ncpr_id
            INTO :CODBOD, :existencia do
            BEGIN
            /* META TODO CON EL NUEVO COSTO */
            INSERT INTO MOVIMIENTO_ARTICULO
                (ARTI_COD, MVAR_CONS, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM, TERC_NIT)
                VALUES(NEW.ARTI_COD, GEN_ID(ID_MOVARTI,1), :CODBOD, new.ncpr_fecha, 52, NEW.ncpr_id,
                new.ncpr_conc, :EXISTENCIA, :COSTO, 'S', '', new.pref_pre, new.ncpr_numero, 1, new.terc_nit);
            END
        /* RECORRA LAS LISTAS DE PRECIOS Y CAMBIE EL PRECIO */
        EXECUTE PROCEDURE CALCULA_PRECIOS(NEW.ARTI_COD, new.ncpr_fecha);
        end
    INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
        VALUES (USER, 52, NEW.ncpr_id, 'U', NEW.pref_pre || NEW.ncpr_numero);
    end
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER TRIGGER NOTAS_DEBITO_PROVEEDOR_AI
AS
declare variable COSTO NUMERIC(18,2);
declare variable EXISTENCIA NUMERIC(18,4);
declare variable CODBOD VARCHAR(3);
BEGIN
  if ((NEW.NDPR_ID <> 0) and (new.ndpr_anulado = 'N')) then
    BEGIN
    INSERT INTO SALDOS_DOC_CXPAGAR (SDCP_TIPOREF, SDCP_IDREF, SDCP_FECHA, TERC_NIT, SDCP_RTEFTE, SDCP_RTIVA, SDCP_RTICA, SDCP_ABONO, SDCP_ABRTFTE, SDCP_ABRTIVA, SDCP_ABRTICA, SDCP_DEBITO, SDCP_MONTO, SDCP_TRM)
        VALUES (51, NEW.NDPR_ID, NEW.ndpr_fecha, NEW.terc_nit, NEW.ndpr_rtftemonto, NEW.ndpr_rtivamonto, NEW.ndpr_rticamonto, 0, 0, 0, 0, 'S', NEW.ndpr_monto+NEW.ndpr_ivamonto, NEW.ndpr_trm);
    /* Registre el movimiento del proveedor */
    INSERT INTO MOVIMIENTO_PROVEEDOR (MVPR_ID, TERC_NIT, MVPR_TIPOREF, MVPR_IDREF, MVPR_FECHA, MVPR_VENCE, MVPR_CONC, MVPR_MONTO, MVPR_RTFTE, MVPR_RTIVA, MVPR_RTICA, MVPR_DEBITO, MVPR_ABONO, MVPR_PREFIJO, MVPR_NUMERO, MVPR_TRM)
      VALUES (GEN_ID(ID_MOVPROV, 1), NEW.TERC_NIT, 51, NEW.NDPR_ID, NEW.NDPR_FECHA, NEW.NDPR_VENCE, NEW.NDPR_CONC, NEW.NDPR_MONTO+NEW.ndpr_Ivamonto, NEW.NDPR_RTFTEMONTO, NEW.NDPR_RTIVAMONTO, NEW.NDPR_RTICAMONTO, 'S', 'N', NEW.pref_pre, NEW.ndpr_numero, NEW.ndpr_trm);
    /* afecte el articulo */
    if (new.arti_cod <> '') then
        begin
        /* CALCULE EL NUEVO COSTO */
        execute procedure costo_promedio (new.arti_cod, new.ndpr_fecha) returning_values (:COSTO);
        execute procedure saldo_total_inventario (new.arti_cod, new.ndpr_fecha) returning_values (:EXISTENCIA);
        COSTO = (COSTO * EXISTENCIA + (NEW.ndpr_monto)) / EXISTENCIA;
        FOR SELECT DISTINCT BODE_COD FROM EXISTENCIA WHERE ARTI_COD = NEW.ARTI_COD INTO :CODBOD do
            BEGIN
            execute procedure saldo_inventario (new.arti_cod, :CODBOD, new.ndpr_fecha) returning_values (:EXISTENCIA);
            if (existencia <> 0) then
                BEGIN
                /* SAQUE TODO LO QUE TENGA */
                INSERT INTO MOVIMIENTO_ARTICULO
                  (ARTI_COD, MVAR_CONS, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM, TERC_NIT)
                  VALUES(NEW.ARTI_COD, GEN_ID(ID_MOVARTI,1), :CODBOD, new.ndpr_fecha, 51, NEW.ndpr_id,
                  new.ndpr_conc, :EXISTENCIA, 0, 'N', '', new.pref_pre, new.ndpr_numero, 1, new.terc_nit);
                END
            END
        FOR SELECT DISTINCT BODE_COD, MVAR_CANT FROM MOVIMIENTO_ARTICULO WHERE MVAR_TIPODOC = 51 AND MVAR_IDREF = NEW.ndpr_id
            INTO :CODBOD, :existencia do
            BEGIN
            /* META TODO CON EL NUEVO COSTO */
            INSERT INTO MOVIMIENTO_ARTICULO
              (ARTI_COD, MVAR_CONS, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM, TERC_NIT)
              VALUES(NEW.ARTI_COD, GEN_ID(ID_MOVARTI,1), :CODBOD, new.ndpr_fecha, 51, NEW.ndpr_id,
              new.ndpr_conc, :EXISTENCIA, :COSTO, 'S', '', new.pref_pre, new.ndpr_numero, 1, new.terc_nit);
            END
        /* RECORRA LAS LISTAS DE PRECIOS Y CAMBIE EL PRECIO */
        EXECUTE PROCEDURE CALCULA_PRECIOS(NEW.ARTI_COD, new.ndpr_fecha);
        end
    INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
        VALUES (USER, 51, NEW.ndpr_id, 'I', NEW.pref_pre || NEW.ndpr_numero);
    END
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER TRIGGER NOTAS_DEBITO_PROVEEDOR_AU
AS
declare variable ABONOS char(1);
declare variable consec INTEGER;
declare variable COSTO NUMERIC(18,2);
declare variable EXISTENCIA NUMERIC(18,4);
declare variable CODBOD VARCHAR(3);
BEGIN
if (new.ndpr_anulado = 'S') then
    begin
    select enco_consec from comprobante_encabezado where enco_tiporef = 51 and enco_idref = old.ndpr_id into :consec;
    if (NOT consec is null) then
      delete from comprobante_detalle where enco_consec = :consec;
    delete from comprobante_encabezado where enco_tiporef = 51 and enco_idref = old.ndpr_id;
    INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
        VALUES (USER, 51, NEW.ndpr_id, 'A', NEW.pref_pre || NEW.ndpr_numero);
    end

/* BORRE EL REGISTRO PREVIO */
if ((old.ndpr_id <> 0) and (old.ndpr_anulado = 'N')) then
    begin
    /* Verifique si habia abonos a la nota */
    ABONOS = 'N';
    select 'S' FROM SALDOS_DOC_CXPAGAR WHERE SDCP_TIPOREF = 51 AND SDCP_IDREF = OLD.NDPR_ID AND SDCP_ABONO <> 0 INTO :ABONOS;
    if (ABONOS = 'N') then
        BEGIN
        /* BORRE EL REGISTRO PREVIO */
        delete from saldos_doc_cxpagar where sdcp_tiporef = 51 and sdcp_idref = old.ndpr_id;
        delete from movimiento_PROVEEDOR where (mvpr_tiporef = 51) and (mvpr_idref = old.ndpr_id);
        delete from movimiento_articulo where  (mvar_tipodoc = 51) and (mvar_idref = old.ndpr_id);
        END
    else
        exception DOCUMENTO_CON_ABONOS 'El cargo de proveedor ' || old.pref_pre || old.ndpr_numero || ' tiene abonos registrados.';
    end
if ((new.ndpr_id <> 0) and (new.ndpr_anulado = 'N')) then
    begin
    /* Registre el nuevo saldo del documento */
    INSERT INTO SALDOS_DOC_CXPAGAR (SDCP_TIPOREF, SDCP_IDREF, SDCP_FECHA, TERC_NIT, SDCP_RTEFTE, SDCP_RTIVA, SDCP_RTICA, SDCP_ABONO, SDCP_ABRTFTE, SDCP_ABRTIVA, SDCP_ABRTICA, SDCP_DEBITO, SDCP_MONTO, SDCP_TRM)
        VALUES (51, NEW.NDPR_ID, NEW.ndpr_fecha, NEW.terc_nit, NEW.ndpr_rtftemonto, NEW.ndpr_rtivamonto, NEW.ndpr_rticamonto, 0, 0, 0, 0, 'N', NEW.ndpr_monto+NEW.ndpr_ivamonto, NEW.ndpr_trm);
    /* Registre el movimiento del proveedor */
    INSERT INTO MOVIMIENTO_PROVEEDOR (MVPR_ID, TERC_NIT, MVPR_TIPOREF, MVPR_IDREF, MVPR_FECHA, MVPR_VENCE, MVPR_CONC, MVPR_MONTO, MVPR_RTFTE, MVPR_RTIVA, MVPR_RTICA, MVPR_DEBITO, MVPR_ABONO, MVPR_PREFIJO, MVPR_NUMERO, MVPR_TRM)
        VALUES (GEN_ID(ID_MOVPROV, 1), NEW.TERC_NIT, 51, NEW.NDPR_ID, NEW.NDPR_FECHA, NEW.ndpr_vence, NEW.NDPR_CONC, NEW.NDPR_MONTO+NEW.ndpr_ivamonto, NEW.NDPR_RTFTEMONTO, NEW.NDPR_RTIVAMONTO, NEW.NDPR_RTICAMONTO, 'S', 'N', NEW.pref_pre, NEW.ndpr_numero, NEW.ndpr_trm);
    if (new.arti_cod <> '') then
        begin
        /* CALCULE EL NUEVO COSTO */
        execute procedure costo_promedio (new.arti_cod, new.ndpr_fecha) returning_values (:COSTO);
        execute procedure saldo_total_inventario (new.arti_cod, new.ndpr_fecha) returning_values (:EXISTENCIA);
        COSTO = (COSTO * EXISTENCIA + (NEW.ndpr_monto)) / EXISTENCIA;
        FOR SELECT DISTINCT BODE_COD FROM EXISTENCIA WHERE ARTI_COD = NEW.ARTI_COD INTO :CODBOD do
            BEGIN
            execute procedure saldo_inventario (new.arti_cod, :CODBOD, new.ndpr_fecha) returning_values (:EXISTENCIA);
            if (existencia <> 0) then
                BEGIN
                /* SAQUE TODO LO QUE TENGA */
                INSERT INTO MOVIMIENTO_ARTICULO
                  (ARTI_COD, MVAR_CONS, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM, TERC_NIT)
                  VALUES(NEW.ARTI_COD, GEN_ID(ID_MOVARTI,1), :CODBOD, new.ndpr_fecha, 51, NEW.ndpr_id,
                  new.ndpr_conc, :EXISTENCIA, 0, 'N', '', new.pref_pre, new.ndpr_numero, 1, new.terc_nit);
                END
            END
        FOR SELECT DISTINCT BODE_COD, MVAR_CANT FROM MOVIMIENTO_ARTICULO WHERE MVAR_TIPODOC = 51 AND MVAR_IDREF = NEW.ndpr_id
            INTO :CODBOD, :existencia do
            BEGIN
            /* META TODO CON EL NUEVO COSTO */
            INSERT INTO MOVIMIENTO_ARTICULO
              (ARTI_COD, MVAR_CONS, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM, TERC_NIT)
              VALUES(NEW.ARTI_COD, GEN_ID(ID_MOVARTI,1), :CODBOD, new.ndpr_fecha, 51, NEW.ndpr_id,
              new.ndpr_conc, :EXISTENCIA, :COSTO, 'S', '', new.pref_pre, new.ndpr_numero, 1, new.terc_nit);
            END
        /* RECORRA LAS LISTAS DE PRECIOS Y CAMBIE EL PRECIO */
        EXECUTE PROCEDURE CALCULA_PRECIOS(NEW.ARTI_COD, new.ndpr_fecha);
        end
    INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
        VALUES (USER, 51, NEW.ndpr_id, 'U', NEW.pref_pre || NEW.ndpr_numero);
    end
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER TRIGGER REMISION_PROVEEDOR_DET_AI
AS
declare variable fec date;
declare variable CONC VARCHAR(60);
declare variable factor numeric(18,4);
declare variable Pref varchar(4);
declare variable Num varchar(6);
declare variable EXISTE CHAR(1);
declare variable NIT VARCHAR(20);
declare variable NUMPROV VARCHAR(20);
declare variable Tipo Integer;
declare variable idfact integer;
declare variable numrows integer;
declare variable IVAINC CHAR(2);
declare variable COSTO NUMERIC(18,2);
declare variable CANTREL NUMERIC(18,4);
declare variable NUMPED VARCHAR(30);
declare variable CONSO CHAR(2);
declare variable CONSOLIDA INTEGER;
declare variable DTOPIE NUMERIC(18,2);
declare variable ADICIONAL NUMERIC(18,2);
declare variable TOTAL NUMERIC(18,2);
declare variable IVAMONTO NUMERIC(18,2);
declare variable EXTRA NUMERIC(18,2);
declare variable FACT NUMERIC(18,4);
declare variable MENORV CHAR(2);
BEGIN
  if ((NEW.repr_id <> 0) and (new.rpvd_anulado = 'N')) then
    BEGIN
    select max(rprd_tiporel), max(rprd_idrel) from remision_proveedor_docrela
        where repr_id = new.repr_id into :Tipo, :idfact;
    if (Tipo is null) then
        Tipo = 0;
    /* si se hizo con base en una factura que afecto el inventario no afecte inventario */
    numrows = 0;
    if (Tipo = 21) Then
        select count(*) from movimiento_articulo where mvar_tipodoc = 21 and mvar_idref = :idfact into :numrows;
    if (numrows is null) then
        numrows = 0;
    if (numrows = 0) then
        begin
        select repr_fecha, pref_pre, repr_numero, REPR_IMPTOS, terc_nit, REPR_NUMPROV, REPR_ORDEN, REPR_CONSOLIDA, repr_dtomonto, repr_adicional, repr_total, repr_ivamonto, repr_extra
            from remision_proveedor where repr_id = new.repr_id
            into :fec, :Pref, :Num, :IVAINC, :NIT, :NUMPROV, :numped, :CONSOLIDA, :dtopie, :adicional, :total, :ivamonto, :extra;
        execute procedure factor_unidad_cant(new.arti_cod, new.rpvd_unidad) returning_values(factor);
        CONC = 'REMISION PROVEEDOR No.' || PREF || NUM || '-' || NUMPROV;
        if (numped <> '') then
            conc = conc || '-ORDEN ' || NUMPED;
        COSTO = ((new.rpvd_prunit - NEW.rpvd_dtomonto) / :factor);
        if (IVAINC = 'S') then
            COSTO = COSTO / (1 + NEW.rpvd_ivaporc/100);
        EXECUTE PROCEDURE lee_configuracion('COMPRAS','FACTURAS','DESCUENTO Y VALOR ADICIONAL DEL DOCUMENTO COMO MENOR VALOR DEL COSTO') returning_values (:MENORV);
        if (MENORV = 'SI') then
            BEGIN
            FACT = (TOTAL - EXTRA - IVAMONTO);
            if ((FACT - ADICIONAL + DTOPIE) <> 0) then
                FACT = FACT / (FACT - ADICIONAL + DTOPIE);
            ELSE
                FACT = 1;
            COSTO = COSTO * FACT;
            END
        INSERT INTO MOVIMIENTO_ARTICULO
          (ARTI_COD, MVAR_CONS, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM, TERC_NIT)
          VALUES(NEW.ARTI_COD, GEN_ID(ID_MOVARTI,1), NEW.BODE_COD, :FEC, 22, NEW.repr_id,
          :CONC, :factor * new.rpvd_cant, :COSTO, 'S', new.rpvd_lote, :Pref, :Num, new.rpvd_item, :Nit);

        /* RECORRA LAS LISTAS DE PRECIOS Y CAMBIE EL PRECIO */
        EXECUTE PROCEDURE CALCULA_PRECIOS(NEW.ARTI_COD, :FEC);

        if (COSTO > 0 ) then
         BEGIN
          /* GRABE PROV X ARTICULO */
          EXISTE = 'N';
          SELECT 'S' FROM PROVEEDOR_ARTICULO WHERE TERC_NIT = :NIT AND ARTI_COD = NEW.ARTI_COD INTO :EXISTE;
          if (EXISTE = 'S') then
            UPDATE PROVEEDOR_ARTICULO 
                SET PVAR_FECHA = :FEC, PVAR_COSTO = :COSTO, PVAR_COD = NEW.rpvd_codprov
                WHERE TERC_NIT = :NIT AND ARTI_COD = NEW.ARTI_COD;
          ELSE
            INSERT INTO PROVEEDOR_ARTICULO (TERC_NIT, ARTI_COD, PVAR_COSTO, PVAR_FECHA, PVAR_COD,PVAR_DES)
                VALUES (:NIT, NEW.ARTI_COD, :COSTO, :FEC, NEW.rpvd_codprov,NEW.rpvd_desc);
         END
        end

    /* ACTUALICE EL PENDIENTE  */
    if (CONSOLIDA <> 0) then
        BEGIN
        EXECUTE PROCEDURE LEE_CONFIGURACION ('COMPRAS','DOCUMENTOS','SUMAR CANTIDADES PENDIENTES AL CONSOLIDAR DOCUMENTOS') returning_values (CONSO);
        SELECT MIN(CEFA_TIPOORI) FROM consolide_faltantes WHERE CEFA_ID = :CONSOLIDA INTO :NUMROWS;
        if (NUMROWS = 23) then
            BEGIN
            EXECUTE PROCEDURE LEE_CONFIGURACION('COMPRAS', 'REMISIONES', 'VERIFICAR CODIGOS DE LA ORDEN') returning_values (MENORV);
            if (MENORV = 'SI') then
                CONSO = 'NO';
            END
        SELECT COUNT(CEFA_ITEM) FROM consolide_faltantes WHERE CEFA_ID = :CONSOLIDA INTO :NUMROWS;
        if ((CONSO = 'SI') AND (NUMROWS > 1)) then
            UPDATE consolidado_faltantes SET COFA_OK = 'S' WHERE COFA_ID = :consolida;
        ELSE
            BEGIN
            /* BUSQUE EL CONSOLIDADO EN EL MISMO ITEM Y SI ES DIFERENTE ACTUALICELO */
            select COFA_CANT * COFA_FACTOR FROM consolidado_faltantes WHERE COFA_ID = :consolida AND COFA_ITEM = NEW.RPVD_ITEM AND ARTI_COD = NEW.arti_cod INTO :CANTREL;
            if (NEW.RPVD_CANT * NEW.RPVD_FACTOR < CANTREL) then
                UPDATE consolidado_faltantes SET COFA_IDDES = NEW.repr_id, COFA_CANT = NEW.RPVD_CANT, COFA_FACTOR = NEW.RPVD_FACTOR
                    WHERE COFA_ID = :consolida AND COFA_ITEM = NEW.RPVD_ITEM AND ARTI_COD = NEW.arti_cod;
            ELSE
                UPDATE consolidado_faltantes SET COFA_IDDES = NEW.repr_id, COFA_OK = 'S' WHERE COFA_ID = :consolida AND COFA_ITEM = NEW.RPVD_ITEM AND ARTI_COD = NEW.arti_cod;
            END
        END
    /* ACTUALICE EL STAND */
    if (new.rpvd_stand is not null) then
      if (exists(select stand_cod from stands where arti_cod = new.arti_cod and stand_bodega = new.bode_cod)) then
        UPDATE stands set stand_cod = new.rpvd_stand where arti_cod = new.arti_cod and stand_bodega = new.bode_cod;
      else
        INSERT INTO stands (ARTI_COD, STAND_BODEGA, STAND_COD) VALUES (NEW.arti_cod, NEW.bode_cod, NEW.rpvd_stand);
    END
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER TRIGGER REMISION_PROVEEDOR_DET_AU
AS
declare variable fec date;
declare variable CONC VARCHAR(60);
declare variable Pref varchar(4);
declare variable Num varchar(6);
declare variable factor numeric(18,4);
declare variable EXISTE CHAR(1);
declare variable NIT VARCHAR(20);
declare variable NUMPROV VARCHAR(20);
declare variable Tipo integer;
declare variable idfact integer;
declare variable numrows integer;
declare variable IVAINC CHAR(2);
declare variable COSTO NUMERIC(18,2);
declare variable CANTREL NUMERIC(18,4);
declare variable NUMPED VARCHAR(30);
declare variable CONSO CHAR(2);
declare variable CONSOLIDA INTEGER;
declare variable DTOPIE NUMERIC(18,2);
declare variable ADICIONAL NUMERIC(18,2);
declare variable TOTAL NUMERIC(18,2);
declare variable IVAMONTO NUMERIC(18,2);
declare variable EXTRA NUMERIC(18,2);
declare variable FACT NUMERIC(18,4);
declare variable MENORV CHAR(2);
BEGIN
if ((OLD.repr_id <> 0) AND (OLD.rpvd_anulado = 'N')) then
    begin
    DELETE FROM MOVIMIENTO_ARTICULO WHERE (mvar_tipodoc = 22) and (mvar_idref = new.repr_id) and (mvar_item = old.rpvd_item);
    select REPR_CONSOLIDA from remision_proveedor where repr_id = old.repr_id into :CONSOLIDA;
    if (CONSOLIDA <> 0) then
        begin
        EXECUTE PROCEDURE LEE_CONFIGURACION ('COMPRAS','DOCUMENTOS','SUMAR CANTIDADES PENDIENTES AL CONSOLIDAR DOCUMENTOS') returning_values (CONSO);
        SELECT COUNT(CEFA_ITEM) FROM consolide_faltantes WHERE CEFA_ID = :CONSOLIDA INTO :NUMROWS;
        if ((NUMROWS = 1) OR (CONSO = 'NO')) then
            UPDATE consolidado_faltantes SET COFA_OK = 'N' WHERE COFA_ID = :consolida AND COFA_ITEM = old.RPVD_ITEM AND ARTI_COD = old.arti_cod;
        else
            UPDATE consolidado_faltantes SET COFA_OK = 'N' WHERE COFA_ID = :consolida;
        END
    end
/* Registre el nuevo */
if ((new.repr_id <> 0) AND (new.rpvd_anulado = 'N')) then
    begin
    select repr_fecha, pref_pre, repr_numero, repr_imptos, terc_nit, REPR_NUMPROV, REPR_ORDEN, REPR_CONSOLIDA, repr_dtomonto, repr_adicional, repr_total, repr_ivamonto, repr_extra
        from remision_proveedor where repr_id = new.repr_id
        into :fec, :Pref, :Num, :IVAINC, :NIT, :NUMPROV, :numped, :CONSOLIDA, :dtopie, :adicional, :total, :ivamonto, :extra;
    CONC = 'REMISION PROVEEDOR No.' || PREF || NUM || '-' || NUMPROV;
    if (numped <> '') then
        conc = conc || '-ORDEN ' || NUMPED;
    SELECT MAX(CEFA_TIPOORI) FROM consolide_faltantes WHERE CEFA_ID = :CONSOLIDA INTO :TIPO;
    if (Tipo is null) then
        Tipo = 0;
    select FACO_ID from FACTURAS_COMPRA WHERE FACO_CONSOLIDA = :consolida INTO :IDFACT;
    if (Idfact is null) then
        Idfact = 0;
    /* si se hizo con base en una factura que afecto el inventario no afecte inventario */
    numrows = 0;
    if (Tipo = 21) Then
        select count(*) from movimiento_articulo where mvar_tipodoc = 21 and mvar_idref = :idfact into :numrows;
    if (numrows is null) then
        numrows = 0;
    if (numrows = 0) then
        begin
        execute procedure factor_unidad_cant(new.arti_cod, new.rpvd_unidad) returning_values(factor);
        COSTO = ((new.rpvd_prunit - NEW.rpvd_dtomonto) / :factor);
        if (IVAINC = 'S') then
            COSTO = COSTO / (1 + NEW.rpvd_ivaporc/100);
        EXECUTE PROCEDURE lee_configuracion('COMPRAS','FACTURAS','DESCUENTO Y VALOR ADICIONAL DEL DOCUMENTO COMO MENOR VALOR DEL COSTO') returning_values (:MENORV);
        if (MENORV = 'SI') then
            BEGIN
            FACT = (TOTAL - EXTRA - IVAMONTO);
            if ((FACT - ADICIONAL + DTOPIE) <> 0) then
                FACT = FACT / (FACT - ADICIONAL + DTOPIE);
            ELSE
                FACT = 1;
            COSTO = COSTO * FACT;
            END
        INSERT INTO MOVIMIENTO_ARTICULO
            (ARTI_COD, MVAR_CONS, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM, TERC_NIT)
            VALUES(NEW.ARTI_COD, GEN_ID(ID_MOVARTI,1), NEW.BODE_COD, :FEC, 22, NEW.repr_id,
            :CONC, :factor * new.rpvd_cant, :COSTO, 'S', new.rpvd_lote, :Pref, :Num, new.rpvd_item, :Nit);
            
        /* RECORRA LAS LISTAS DE PRECIOS Y CAMBIE EL PRECIO */
        EXECUTE PROCEDURE CALCULA_PRECIOS(NEW.ARTI_COD, :FEC);
          
        if (COSTO > 0 ) then
         BEGIN
          /* GRABE PROV X ARTICULO */
          EXISTE = 'N';
          SELECT 'S' FROM PROVEEDOR_ARTICULO WHERE TERC_NIT = :NIT AND ARTI_COD = NEW.ARTI_COD INTO :EXISTE;
          if (EXISTE = 'S') then
            UPDATE PROVEEDOR_ARTICULO
                SET PVAR_FECHA = :FEC, PVAR_COSTO = :COSTO, PVAR_COD = NEW.rpvd_codprov
                WHERE TERC_NIT = :NIT AND ARTI_COD = NEW.ARTI_COD;
          ELSE
            INSERT INTO PROVEEDOR_ARTICULO (TERC_NIT, ARTI_COD, PVAR_COSTO, PVAR_FECHA, PVAR_COD,PVAR_DES)
                VALUES (:NIT, NEW.ARTI_COD, :COSTO, :FEC, NEW.rpvd_codprov,NEW.rpvd_desc);
         END
        end
    if (CONSOLIDA <> 0) then
        BEGIN
        EXECUTE PROCEDURE LEE_CONFIGURACION ('COMPRAS','DOCUMENTOS','SUMAR CANTIDADES PENDIENTES AL CONSOLIDAR DOCUMENTOS') returning_values (CONSO);
        /* IGNORE LA CONSOLIDACION SI SE VALIDAN CODIGOS DE LA ORDEN */
        SELECT MIN(CEFA_TIPOORI) FROM consolide_faltantes WHERE CEFA_ID = :CONSOLIDA INTO :NUMROWS;
        if (NUMROWS = 23) then
            BEGIN
            EXECUTE PROCEDURE LEE_CONFIGURACION('COMPRAS', 'REMISIONES', 'VERIFICAR CODIGOS DE LA ORDEN') returning_values (MENORV);
            if (MENORV = 'SI') then
                CONSO = 'NO';
            END
        SELECT COUNT(CEFA_ITEM) FROM consolide_faltantes WHERE CEFA_ID = :CONSOLIDA INTO :NUMROWS;
        if ((CONSO = 'SI') AND (NUMROWS > 1)) then
            UPDATE consolidado_faltantes SET COFA_IDDES = NEW.repr_id, COFA_OK = 'S' WHERE COFA_ID = :consolida;
        ELSE
            BEGIN
            /* BUSQUE EL CONSOLIDADO EN EL MISMO ITEM Y SI ES DIFERENTE ACTUALICELO */
            select COFA_CANT * COFA_FACTOR FROM consolidado_faltantes WHERE COFA_ID = :consolida AND COFA_ITEM = NEW.RPVD_ITEM AND ARTI_COD = NEW.arti_cod INTO :CANTREL;
            if (NEW.RPVD_CANT * NEW.RPVD_FACTOR < CANTREL) then
                UPDATE consolidado_faltantes SET COFA_IDDES = NEW.repr_id, COFA_CANT = NEW.RPVD_CANT, COFA_FACTOR = NEW.RPVD_FACTOR
                    WHERE COFA_ID = :consolida AND COFA_ITEM = NEW.RPVD_ITEM AND ARTI_COD = NEW.arti_cod;
            else
                UPDATE consolidado_faltantes SET COFA_IDDES = NEW.repr_id, COFA_OK = 'S' WHERE COFA_ID = :consolida AND COFA_ITEM = NEW.RPVD_ITEM AND ARTI_COD = NEW.arti_cod;
            END
        END
    /* ACTUALICE EL STAND */
    if (new.rpvd_stand is not null) then
      if (exists(select stand_cod from stands where arti_cod = new.arti_cod and stand_bodega = new.bode_cod)) then
        UPDATE stands set stand_cod = new.rpvd_stand where arti_cod = new.arti_cod and stand_bodega = new.bode_cod;
      else
        INSERT INTO stands (ARTI_COD, STAND_BODEGA, STAND_COD) VALUES (NEW.arti_cod, NEW.bode_cod, NEW.rpvd_stand);
    END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER PROCEDURE REP_DISPONIBILIDAD(
    FECHA DATE,
    ARTINI VARCHAR(20),
    ARTFIN VARCHAR(20),
    GRPINI VARCHAR(3),
    GRPFIN VARCHAR(3),
    ORDEN CHAR(1),
    CEROS CHAR(1),
    DETALLE CHAR(1),
    AGRUPA CHAR(1),
    SUCURSAL INTEGER)
RETURNS (
    CODIGO VARCHAR(15),
    NOMBRE VARCHAR(60),
    UNIDAD VARCHAR(8),
    CODGRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    CODSUBG VARCHAR(3),
    NOMSUBG VARCHAR(30),
    CODMARC VARCHAR(3),
    NOMMARC VARCHAR(30),
    CODBOD VARCHAR(2),
    NOMBOD VARCHAR(30),
    EXIST NUMERIC(18,4),
    PROMEDIO NUMERIC(18,4),
    SALIDAS NUMERIC(18,4),
    DISPONIBILIDAD INTEGER,
    DIAS INTEGER,
    PROMEDIADO INTEGER,
    COSTO NUMERIC(18,2),
    COSTOPRO NUMERIC(18,2),
    SUGERIDO NUMERIC(18,4),
    FECCOMPRA DATE)
AS
DECLARE VARIABLE CODINI VARCHAR(20);
DECLARE VARIABLE CODFIN VARCHAR(20);
DECLARE VARIABLE DESINI VARCHAR(20);
DECLARE VARIABLE DESFIN VARCHAR(20);
DECLARE VARIABLE MARINI VARCHAR(20);
DECLARE VARIABLE MARFIN VARCHAR(20);
declare variable DIASC VARCHAR(255);
declare variable DIA_ART VARCHAR(2) CHARACTER SET NONE;
BEGIN
if (ORDEN = 'C') then
    BEGIN
    CODINI = ARTINI;
    CODFIN = ARTFIN;
    DESINI = '';
    DESFIN = 'zz';
    END
ELSE
    BEGIN
    DESINI = ARTINI;
    DESFIN = ARTFIN;
    CODINI = '';
    CODFIN = 'zz';
    END
if (AGRUPA = 'G') then
    BEGIN
    MARINI = '';
    MARFIN = 'zz';
    END
ELSE
    if (AGRUPA = 'M') then
        BEGIN
        MARINI = GRPINI;
        MARFIN = GRPFIN;
        GRPINI = '';
        GRPFIN = 'zz';
        END
if (DETALLE = 'S') then
  BEGIN
  FOR SELECT ARTI_COD, ARTI_DES, ARTI_UNIDAD, ARTI_DIAS, A.GRUP_COD, GRUP_NOM, A.SUBG_COD, A.MARC_COD, BODE_COD, BODE_NOM, ARTI_DIANALIS
      FROM ARTICULO A, GRUPO G, BODEGA B
      WHERE ARTI_COD >= :CODINI AND ARTI_COD <= :CODFIN AND A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :GRPFIN AND ARTI_DES >= :DESINI AND ARTI_DES <= :DESFIN AND
      G.GRUP_COD = A.GRUP_COD AND A.ESAR_COD <> 'I' AND ((SUCU_ID = :SUCURSAL) or (:SUCURSAL = 0)) AND
      (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN)))
      INTO :CODIGO, :NOMBRE, :UNIDAD, :DIAS, :CODGRUPO, :NOMGRUPO, :CODSUBG, :CODMARC, :CODBOD, :NOMBOD, :PROMEDIADO
      DO
        BEGIN
        NOMMARC = '';
        NOMSUBG = '';
        SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO :NOMMARC;
        SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
        EXECUTE PROCEDURE costo_promedio_y_ultimo(:CODIGO, :FECHA) RETURNING_VALUES (:costopro, :COSTO);
        EXECUTE PROCEDURE DISPONIBILIDAD_ARTICULO(CODIGO, FECHA, :CODBOD) returning_values (:DISPONIBILIDAD, :EXIST, :PROMEDIO, :SALIDAS);
        /*ESTABLECER CUAL ES EL VALOR DE DIAS PARA PROMEDIO*/
        EXECUTE PROCEDURE lee_configuracion ('INVENTARIO', 'EXISTENCIAS', 'PROMEDIAR LAS SALIDAS DEL INVENTARIO CON EL NUMERO DE DIAS ASIGNADO A CADA ARTICULO') returning_values (:DIA_ART);
        if (DIA_ART = 'NO') then
          BEGIN
            EXECUTE PROCEDURE lee_configuracion ('INVENTARIO', 'EXISTENCIAS', 'NUMERO DE DIAS PARA PROMEDIO DE SALIDAS POR ARTICULO') returning_values (DIASC);
            PROMEDIADO = CAST(DIASC AS INTEGER);
          END
        if ((DISPONIBILIDAD < DIAS) and (PROMEDIO > 0))then
            SUGERIDO = (DIAS * PROMEDIO) - EXIST;
        ELSE
            SUGERIDO = 0;
        SELECT MAX(FACO_FECHA) FROM FACTURAS_COMPRA F, FACTURAS_COMPRAS_DETALLE D
            WHERE F.FACO_ID = D.faco_id AND D.ARTI_COD = :CODIGO AND FACO_FECHA <= :FECHA AND D.bode_cod = :codbod
            INTO :FECCOMPRA;
        if ((PROMEDIO > 0) or (EXIST <> 0) or (CEROS = 'S')) then
            SUSPEND;
        END
  END
ELSE
  BEGIN
  FOR SELECT ARTI_COD, ARTI_DES, ARTI_UNIDAD, ARTI_DIAS, A.GRUP_COD, GRUP_NOM, A.SUBG_COD, A.MARC_COD, ARTI_DIANALIS
      FROM ARTICULO A, GRUPO G
      WHERE ARTI_COD >= :CODINI AND ARTI_COD <= :CODFIN AND A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :GRPFIN AND ARTI_DES >= :DESINI AND ARTI_DES <= :DESFIN AND G.GRUP_COD = A.GRUP_COD AND
      A.ESAR_COD <> 'I' AND (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN)))
      INTO :CODIGO, :NOMBRE, :UNIDAD, :DIAS, :CODGRUPO, :NOMGRUPO, :CODSUBG, :CODMARC, :PROMEDIADO
      DO
        BEGIN
        NOMMARC = '';
        NOMSUBG = '';
        SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO :NOMMARC;
        SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
        EXECUTE PROCEDURE costo_promedio_y_ultimo(:CODIGO, :FECHA) RETURNING_VALUES (:costopro, :COSTO);
        EXECUTE PROCEDURE DISPONIBILIDAD_TOTAL_ARTICULO(CODIGO, FECHA) returning_values (:DISPONIBILIDAD, :EXIST, :PROMEDIO, :SALIDAS);
        /*ESTABLECER CUAL ES EL VALOR DE DIAS PARA PROMEDIO*/
        EXECUTE PROCEDURE lee_configuracion ('INVENTARIO', 'EXISTENCIAS', 'PROMEDIAR LAS SALIDAS DEL INVENTARIO CON EL NUMERO DE DIAS ASIGNADO A CADA ARTICULO') returning_values (:DIA_ART);
        if (DIA_ART = 'NO') then
          BEGIN
            EXECUTE PROCEDURE lee_configuracion ('INVENTARIO', 'EXISTENCIAS', 'NUMERO DE DIAS PARA PROMEDIO DE SALIDAS POR ARTICULO') returning_values (DIASC);
            PROMEDIADO = CAST(DIASC AS INTEGER);
          END
        if ((DISPONIBILIDAD < DIAS) and (PROMEDIO > 0))then
            SUGERIDO = (DIAS * PROMEDIO) - EXIST;
        ELSE
            SUGERIDO = 0;
        SELECT MAX(FACO_FECHA) FROM FACTURAS_COMPRA F, FACTURAS_COMPRAS_DETALLE D
            WHERE F.FACO_ID = D.faco_id AND D.ARTI_COD = :CODIGO AND FACO_FECHA <= :FECHA
            INTO :FECCOMPRA;
        if ((PROMEDIO > 0) or (EXIST <> 0) or (CEROS = 'S')) then
            SUSPEND;
        END
  END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER PROCEDURE REVISA_PRECIOS(
    LISTA INTEGER,
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    ARTICULO VARCHAR(20),
    DESCR VARCHAR(60),
    GRUPO VARCHAR(2),
    SUBGRUPO VARCHAR(3),
    MARCA VARCHAR(3),
    COSTO NUMERIC(18,2),
    FIJO NUMERIC(18,2),
    UNIDAD VARCHAR(8),
    PORC NUMERIC(9,4),
    SUGERIDO NUMERIC(18,2),
    DIFER NUMERIC(18,2),
    NUEVO NUMERIC(18,2),
    OK CHAR(1))
AS
declare variable marg numeric(9,4);
declare variable UOM VARCHAR(10);
declare variable BASE VARCHAR(10);
declare variable CAMBIO VARCHAR(10);
declare variable COSTOP numeric(18,2);
declare variable COSTOU numeric(18,2);
declare variable DIFMAX numeric(18,2);
declare variable DIG INTEGER;
declare variable TARIVA NUMERIC(9,4);
declare variable IVAINC CHAR(1);
declare variable LISTAREF INTEGER;
begin
execute procedure lee_configuracion ('FACTURACION', 'ARTICULOS', 'SUGERIR PRECIOS CON PORCENTAJE DE MARGEN O UTILIDAD') returning_values (:UOM);
EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION', 'ARTICULOS', 'REDONDEO AL MULTIPLO DE DIEZ EN PRECIOS') RETURNING_VALUES (:DIG);
EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION','ARTICULOS','CAMBIO DE PRECIOS AUTOMATICO AL CAMBIAR COSTO O PRECIO') returning_values (CAMBIO);
EXECUTE PROCEDURE lee_configuracion('FACTURACION','ARTICULOS','COSTO BASE PARA CALCULO DE PRECIOS DE VENTA AUTOMATICOS') returning_values (:BASE);
EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION','ARTICULOS','CODIGO DE LA LISTA DE PRECIOS BASE PARA CAMBIO DE PRECIOS AUTOMATICO') returning_values (LISTAREF);
EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION','ARTICULOS','DIFERENCIA EN PESOS MAXIMA A PERMITIR PARA CAMBIAR PRECIOS') returning_values (DIFMAX);
for select A.arti_cod, A.arti_des, A.grup_cod, A.subg_cod, A.marc_cod, A.arti_unidad, prar_fijo, prar_margen, prar_util, TAIV_PORC
    from precios_articulo p, articulo a, tarifa_iva T
    where a.arti_cod = p.arti_cod and lipr_cod = :lista and a.taiv_cod = t.taiv_cod and exists (select arti_cod from movimiento_articulo m where arti_cod = a.arti_cod and m.mvar_entrada = 'S' and m.mvar_tipodoc <> 33 and m.mvar_tipodoc <> 13 and m.mvar_fecha >= :fecini and m.mvar_fecha <= :fecfin)
    order by A.arti_cod
    into :articulo, descr, :grupo, :subgrupo, :marca, :unidad, :fijo, :marg, :porc, :tariva
    do
    begin
    if (UOM <> 'UTILIDAD') then
        PORC = MARG;
    if (CAMBIO = 'COSTO') then
        BEGIN
        EXECUTE PROCEDURE costo_promedio_y_ultimo (:ARTICULO, :FECFIN) RETURNING_VALUES(:COSTOP, :COSTOU);
        if (base = 'ULTIMO') then
            COSTO = COSTOU;
        ELSE
            BEGIN
            COSTO = COSTOP;
            if (base = 'MAYOR') then
                if (COSTOP < COSTOU) then
                    COSTO = COSTOU;
            END
        SELECT LIPR_MODIF FROM LISTA_PRECIOS WHERE LIPR_COD = :lista INTO :IVAINC;
        if (IVAINC = 'S') then
            COSTO = COSTO * (1 + TARIVA/100);
        if (UOM = 'UTILIDAD') then
            SUGERIDO = COSTO * (1 + :PORC/100);
        ELSE
            SUGERIDO = COSTO / (1 - :PORC/100);
        END
    ELSE
        if (LISTA <> LISTAREF) then
            BEGIN
            SELECT PRAR_FIJO FROM PRECIOS_ARTICULO WHERE ARTI_COD = :articulo AND LIPR_COD = :LISTAREF INTO :SUGERIDO;
            if (IVAINC = 'S') then
                SUGERIDO = SUGERIDO / (1 + TARIVA/100);
            if (UOM = 'UTILIDAD') then
                SUGERIDO = SUGERIDO * (1 + :PORC/100);
            ELSE
                SUGERIDO = SUGERIDO / (1 - :PORC/100);
            END
    EXECUTE PROCEDURE REDONDEE (SUGERIDO, DIG) returning_values (SUGERIDO);
    DIFER = SUGERIDO - FIJO;
    NUEVO = SUGERIDO;
    OK = 'S';
    if ((abs(DIFER) > DIFMAX) and (sugerido <> 0)) then
        suspend;
    end
end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER PRECIOS_ARTICULO_BI FOR PRECIOS_ARTICULO
ACTIVE BEFORE INSERT POSITION 1
AS
declare variable UNIDAD VARCHAR(8);
declare variable UOR VARCHAR(20);
declare variable COSTOP NUMERIC(18, 2);
declare variable COSTOU NUMERIC(18, 2);
declare variable COSTO NUMERIC(18, 2);
declare variable DIG INTEGER;
declare variable IVAINC CHAR(1);
declare variable IVAINC1 CHAR(1);
declare variable TARIVA NUMERIC(9,2);
declare variable BASE varchar(10);
declare variable CAMBIO CHAR(7);
declare variable LISTA INTEGER;
declare variable PRECIO NUMERIC(18, 4);
BEGIN
if (NEW.prar_util IS NULL) then
    NEW.prar_util = 0;
if (NEW.prar_margen IS NULL) then
    NEW.prar_margen = 0;
if (NEW.prar_cantmin IS NULL) then
    NEW.prar_cantmin = 0.01;
if (NEW.prar_auto = 'S') then
    BEGIN
    SELECT LIPR_MODIF FROM LISTA_PRECIOS L
        WHERE LIPR_COD = NEW.LIPR_COD INTO :IVAINC;
    
    SELECT ARTI_UNIDAD, TAIV_PORC FROM ARTICULO A, TARIFA_IVA T
        WHERE ARTI_COD = NEW.ARTI_COD AND A.taiv_cod = T.taiv_cod INTO :UNIDAD, :TARIVA;
    EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION', 'ARTICULOS', 'SUGERIR PRECIOS CON PORCENTAJE DE MARGEN O UTILIDAD') RETURNING_VALUES (:UOR);
    EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION', 'ARTICULOS', 'REDONDEO AL MULTIPLO DE DIEZ EN PRECIOS') RETURNING_VALUES (:DIG);
    EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION','ARTICULOS','CAMBIO DE PRECIOS AUTOMATICO AL CAMBIAR COSTO O PRECIO') returning_values (CAMBIO);
    if (CAMBIO <> 'PRECIO') then
        BEGIN
        EXECUTE PROCEDURE lee_configuracion('FACTURACION','ARTICULOS','COSTO BASE PARA CALCULO DE PRECIOS DE VENTA AUTOMATICOS') returning_values (:BASE);
        EXECUTE PROCEDURE costo_promedio_y_ultimo (NEW.ARTI_COD, 'NOW') RETURNING_VALUES(:COSTOP, :COSTOU);
        if (base = 'ULTIMO') then
            BEGIN
            COSTO = COSTOU;
            END
        ELSE
            BEGIN
            COSTO = COSTOP;
            if (base = 'MAYOR') then
                if (COSTOP < COSTOU) then
                    COSTO = COSTOU;
            END
        if (IVAINC = 'S') then
            COSTO = COSTO * (1 + TARIVA/100);
        if (UOR = 'UTILIDAD') then
            NEW.PRAR_FIJO = (:COSTO * (1 + NEW.prar_util/100));
        ELSE
            NEW.PRAR_FIJO = (:COSTO / (1 - NEW.prar_margen/100));
        EXECUTE PROCEDURE REDONDEE (NEW.prar_fijo, DIG) returning_values (NEW.prar_fijo);
        END
    ELSE
        BEGIN
        /* PRECIO */
        EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION','ARTICULOS','CODIGO DE LA LISTA DE PRECIOS BASE PARA CAMBIO DE PRECIOS AUTOMATICO') returning_values (LISTA);
        if (NEW.lipr_cod <> :LISTA) then
            BEGIN
            SELECT PRAR_FIJO FROM PRECIOS_ARTICULO WHERE LIPR_COD = :LISTA AND ARTI_COD = NEW.arti_cod INTO :PRECIO;
            SELECT LIPR_MODIF FROM LISTA_PRECIOS L
                WHERE LIPR_COD = :lista INTO :IVAINC1;
            if (ivainc = 'S') then
                if (IVAINC1 = 'S') then
                    NEW.prar_fijo = precio;
                else
                    NEW.prar_fijo = precio * (1 + TARIVA/100);
            ELSE
                if (IVAINC1 = 'S') then
                    NEW.prar_fijo = precio / (1 + TARIVA/100);
                else
                    NEW.prar_fijo = precio;
            if (UOR = 'UTILIDAD') then
                NEW.prar_fijo = NEW.prar_fijo * (1 + NEW.prar_util/100);
            ELSE
                NEW.prar_fijo = NEW.prar_fijo / (1 - NEW.prar_margen/100);
            EXECUTE PROCEDURE REDONDEE (NEW.prar_fijo, DIG) returning_values (NEW.prar_fijo);
            END
        END
    END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER PRECIOS_ARTICULO_BU FOR PRECIOS_ARTICULO
ACTIVE BEFORE UPDATE POSITION 0
as
declare variable UNIDAD VARCHAR(8);
declare variable UOR VARCHAR(20);
declare variable DIG INTEGER;
declare variable IVAINC CHAR(1);
declare variable TARIVA NUMERIC(9,4);
declare variable CAMBIO CHAR(7);
declare variable BASE VARCHAR(10);
declare variable REP CHAR(2);
declare variable COSTOP NUMERIC(18, 2);
declare variable COSTOU NUMERIC(18, 2);
declare variable COSTO NUMERIC(18, 2);
declare variable LISTA INTEGER;
declare variable PRECIO NUMERIC(18, 4);
declare variable IVAINC1 CHAR(1);
begin
if (NEW.prar_auto = 'S') then
    BEGIN
    EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION','ARTICULOS','CAMBIO DE PRECIOS AUTOMATICO AL CAMBIAR COSTO O PRECIO') returning_values (CAMBIO);
    EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION', 'ARTICULOS', 'SUGERIR PRECIOS CON PORCENTAJE DE MARGEN O UTILIDAD') RETURNING_VALUES (:UOR);
    EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION', 'ARTICULOS', 'REDONDEO AL MULTIPLO DE DIEZ EN PRECIOS') RETURNING_VALUES (:DIG);
    EXECUTE PROCEDURE LEE_CONFIGURACION('INVENTARIO', 'ARTICULOS', 'REPLICAR CAMBIOS EN ARTICULOS') RETURNING_VALUES (:REP);
    SELECT LIPR_MODIF FROM LISTA_PRECIOS L
        WHERE LIPR_COD = NEW.LIPR_COD INTO :IVAINC;
    
    if (CAMBIO <> 'PRECIO') then
      begin
      if (REP <> 'SI') then
        BEGIN
        SELECT ARTI_UNIDAD, TAIV_PORC FROM ARTICULO A, TARIFA_IVA T WHERE A.TAIV_COD = T.TAIV_COD AND ARTI_COD = NEW.arti_cod INTO :UNIDAD, :TARIVA;
        EXECUTE PROCEDURE lee_configuracion('FACTURACION','ARTICULOS','COSTO BASE PARA CALCULO DE PRECIOS DE VENTA AUTOMATICOS') returning_values (:BASE);
        EXECUTE PROCEDURE costo_promedio_y_ultimo (NEW.arti_cod, 'NOW') RETURNING_VALUES(:COSTOP, :COSTOU);
        if (base = 'ULTIMO') then
            COSTO = COSTOU;
        ELSE
            BEGIN
            COSTO = COSTOP;
            if (base = 'MAYOR') then
                if (COSTOP < COSTOU) then
                    COSTO = COSTOU;
            END
        if (IVAINC = 'S') then
            COSTO = COSTO * (1 + TARIVA/100);
            
        if (UOR = 'UTILIDAD') then
            BEGIN
            COSTO = COSTO * (1 + NEW.prar_util/100);
            EXECUTE PROCEDURE REDONDEE (COSTO, DIG) returning_values (COSTO);
            new.prar_fijo = :COSTO;
            END
        ELSE
            BEGIN
            COSTO = COSTO / (1 - NEW.prar_margen/100);
            EXECUTE PROCEDURE REDONDEE (COSTO, DIG) returning_values (COSTO);
            NEW.PRAR_FIJO = :COSTO;
            END
        END
      end
    else
        begin
        /* PRECIO */
        EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION','ARTICULOS','CODIGO DE LA LISTA DE PRECIOS BASE PARA CAMBIO DE PRECIOS AUTOMATICO') returning_values (LISTA);
        if (NEW.lipr_cod <> :LISTA) then
            BEGIN
            SELECT PRAR_FIJO FROM PRECIOS_ARTICULO WHERE LIPR_COD = :LISTA AND ARTI_COD = NEW.arti_cod INTO :PRECIO;
            SELECT LIPR_MODIF FROM LISTA_PRECIOS L
                WHERE LIPR_COD = :lista INTO :IVAINC1;
            if (ivainc = 'S') then
                if (IVAINC1 = 'S') then
                    NEW.prar_fijo = precio;
                else
                    NEW.prar_fijo = precio * (1 + TARIVA/100);
            ELSE
                if (IVAINC1 = 'S') then
                    NEW.prar_fijo = precio / (1 + TARIVA/100);
                else
                    NEW.prar_fijo = precio;
            if (UOR = 'UTILIDAD') then
                NEW.prar_fijo = NEW.prar_fijo * (1 + NEW.prar_util/100);
            ELSE
                NEW.prar_fijo = NEW.prar_fijo / (1 - NEW.prar_margen/100);
            EXECUTE PROCEDURE REDONDEE (NEW.prar_fijo, DIG) returning_values (NEW.prar_fijo);
            END
        end
    END
end
^

SET TERM ; ^



SET TERM ^ ;

CREATE PROCEDURE COSTO_PROMEDIO_Y_ULTIMO_UNIDAD(
    ARTICULO VARCHAR(15),
    FECHA DATE,
    UNIDAD VARCHAR(8))
RETURNS (
    COSTOP NUMERIC(18,2),
    UCOSTO NUMERIC(18,2))
AS
declare variable saldop numeric(18,2);
declare variable saldoc numeric(15,4);
declare variable entp numeric(18,2);
declare variable entc numeric(15,4);
declare variable FACTOR NUMERIC(15,4);
BEGIN
SELECT first 1 COST_SALDOP, COST_ENTP,COST_SALDOC, COST_ENTC, COST_ULTIMO FROM COSTOS
    WHERE (ARTI_COD = :ARTICULO) AND (COST_FECHA <= :FECHA)
    order by COST_FECHA DESC, cost_item desc
    INTO :SALDOP, ENTP, :SALDOC, ENTC, :UCOSTO;
IF (SALDOC IS NULL) THEN
    COSTOP = 0;
ELSE
    if ((SALDOC < 0) AND (SALDOC+ENTC > 0)) then
        COSTOP = ENTP/ENTC;
    else
        /* Cuando hay existencia calcule el promedio, de otra manera retorne el ultimo */
        if (SALDOC+ENTC > 0) then
            COSTOP = (SALDOP+ENTP) / (SALDOC+ENTC);
        else
            COSTOP = UCOSTO;
EXECUTE PROCEDURE FACTOR_UNIDAD_CANT(ARTICULO, UNIDAD) returning_values (FACTOR);
COSTOP = COSTOP * FACTOR;
UCOSTO = UCOSTO * FACTOR;
SUSPEND;
END
^

SET TERM ; ^

grant EXECUTE on PROCEDURE costo_promedio_y_ultimo_unidad to PUBLIC;

SET TERM ^ ;

ALTER PROCEDURE EXISTENCIAS_DESDE_HASTA(
    FECHA DATE,
    ARTINI VARCHAR(20),
    ARTFIN VARCHAR(20),
    GRPINI VARCHAR(3),
    GRPFIN VARCHAR(3),
    BODINI VARCHAR(2),
    BODFIN VARCHAR(2),
    ORDEN CHAR(1),
    AGRUPA CHAR(1),
    DETALLE CHAR(1),
    RESERVA CHAR(1),
    ENPESO CHAR(1),
    SUCURSAL INTEGER)
RETURNS (
    CANT NUMERIC(18,4),
    COSTO NUMERIC(18,2),
    COSTO_LOTE NUMERIC(18,2),
    CODIGO VARCHAR(15),
    NOMBRE VARCHAR(60),
    UNIDAD VARCHAR(8),
    STAND VARCHAR(15),
    CODGRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    CODSUBG VARCHAR(3),
    NOMSUBG VARCHAR(30),
    CODMARC VARCHAR(3),
    NOMMARC VARCHAR(30),
    CODBOD VARCHAR(2),
    LOTE VARCHAR(15),
    NOMBOD VARCHAR(30),
    COSTOTOT NUMERIC(18,2),
    ULTCOSTO NUMERIC(18,2),
    FECHACOSTO DATE,
    CONSUMO NUMERIC(18,2),
    RESERVADO NUMERIC(18,4),
    ORDENADO NUMERIC(18,4),
    IVA NUMERIC(9,2),
    PESOUNIT NUMERIC(18,4),
    PESOTOTAL NUMERIC(18,4),
    CODBAR VARCHAR(20))
AS
declare variable exist char(1);
declare variable codini varchar(20);
declare variable codfin varchar(20);
declare variable desini varchar(20);
declare variable desfin varchar(20);
declare variable ordenc numeric(18,4);
declare variable pedido numeric(18,4);
declare variable ok char(1);
declare variable id integer;
declare variable item integer;
declare variable und varchar(8);
declare variable factor numeric(18,4);
declare variable cant2 numeric(18,4);
declare variable PEDAUTO CHAR(2);
BEGIN
if (ORDEN = 'C') then
    BEGIN
    CODINI = ARTINI;
    CODFIN = ARTFIN;
    DESINI = '';
    DESFIN = 'zz';
    END
ELSE
    BEGIN
    DESINI = ARTINI;
    DESFIN = ARTFIN;
    CODINI = '';
    CODFIN = 'zz';
    END
EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION', 'FACTURAS', 'GENERAR PEDIDO AUTOMATICAMENTE CON LA FACTURA') returning_values (pedauto);
if (DETALLE = 'B') then
  BEGIN
  FOR SELECT ARTI_COD, ARTI_DES, ARTI_UNIDAD, ARTI_EXIST, TAIV_PORC, A.GRUP_COD, A.SUBG_COD, A.MARC_COD, BODE_COD, BODE_NOM, ARTI_CONSUMO, ARTI_PESO/1000
      FROM ARTICULO A, BODEGA B, TARIFA_IVA T
      WHERE ARTI_COD >= :CODINI AND ARTI_COD <= :CODFIN AND ARTI_DES >= :DESINI AND ARTI_DES <= :DESFIN AND ESAR_COD <> 'I' AND BODE_COD >= :BODINI AND
      BODE_COD <= :BODFIN AND ((SUCU_ID = :SUCURSAL) or (:SUCURSAL = 0)) AND A.TAIV_COD = T.TAIV_COD
      INTO :CODIGO, :NOMBRE, :UNIDAD, :EXIST, :IVA, :CODGRUPO, :CODSUBG, :CODMARC, :CODBOD, :NOMBOD, :CONSUMO, :pesounit
      DO
        BEGIN
        STAND = '';
        OK = 'N';
        if (AGRUPA = 'G') then
            BEGIN
            if ((CODGRUPO >= GRPINI) AND (CODGRUPO <= GRPFIN)) then
                OK = 'S';
            end
        ELSE
            if (AGRUPA = 'M') then
                BEGIN
                if ((CODMARC >= GRPINI) AND (CODMARC <= GRPFIN)) then
                    OK = 'S';
                END
        if (OK = 'S') then
            BEGIN
            NOMGRUPO = '';
            NOMMARC = '';
            NOMSUBG = '';
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            SELECT MAX(COBA_COD) FROM BARRAS_ARTICULO WHERE ARTI_COD = :codigo AND COBA_UNIDAD = :unidad INTO :codbar;
            if (CODBAR IS NULL) then
                CODBAR = CODIGO;
            if (EXIST <> 'N') then
                BEGIN
                SELECT STAND_COD FROM STANDS WHERE ARTI_COD = :CODIGO AND STAND_BODEGA = :CODBOD INTO :STAND;
                EXECUTE PROCEDURE SALDO_INICIAL_INVENTARIO(CODIGO, FECHA, :CODBOD) returning_values (CANT);
                EXECUTE PROCEDURE costo_promedio_y_ultimo_unidad(CODIGO, FECHA, UNIDAD) returning_values (COSTO, ULTCOSTO);
                SELECT MAX(EXIS_FECHA) FROM EXISTENCIA WHERE ARTI_COD = :CODIGO AND EXIS_ENTR <> 0 AND EXIS_FECHA <= :FECHA INTO :FECHACOSTO;
                COSTOTOT = :CANT * :COSTO;
                CONSUMO = CONSUMO * CANT;
                if (RESERVA = 'S') then
                    BEGIN
                    SELECT SUM(ORID_ENTREGAR)
                        FROM ORDENINVENTARIO_DETALLE OD, ordenes_inventario O
                        WHERE O.ORIN_ID = OD.ORIN_ID AND ARTI_COD = :CODIGO AND ORIN_FECHA <= :FECHA AND ORIN_FECLLEGA >= :FECHA AND ORID_ANULADO = 'N' AND OD.BODE_COD = :CODBOD
                        INTO :ORDENADO;
                    if (ORDENADO IS NULL) then
                        ORDENADO = 0;
                    ORDENC = 0;
                    FOR SELECT O.ORDC_ID, OCDE_ITEM, OCDE_CANT * OCDE_FACTOR
                        FROM ORDENES_COMPRA O, ORDENES_COMPRA_DETALLE OD
                        WHERE O.ORDC_ID = OD.ORDC_ID AND OD.ARTI_COD = :CODIGO AND ORDC_VENCE >= :FECHA AND ORDC_FECHA <= :FECHA AND OCDE_ANULADO = 'N' AND OD.BODE_COD = :CODBOD
                        INTO :ID, :ITEM, :CANT2
                        do
                        BEGIN
                        EXECUTE PROCEDURE FALTANTE(23, 21, ID, ITEM) returning_values (PEDIDO, UND, FACTOR);
                        if (PEDIDO * FACTOR = CANT2) then /* SI NO SE HA FACTURADO MIRE A VER SI SE REMISIONO */
                            EXECUTE PROCEDURE FALTANTE(23, 22, ID, ITEM) returning_values (PEDIDO, UND, FACTOR);
                        if (PEDIDO IS NULL) then
                            PEDIDO = 0;
                        ORDENC = ORDENC + PEDIDO * FACTOR;
                        END
                    ORDENADO = ORDENADO + ORDENC;
                    SELECT SUM(RSDE_LIBERAR)
                        FROM RESERVAS_DETALLE RD, RESERVAS R
                        WHERE R.RESE_ID = RD.RESE_ID AND ARTI_COD = :CODIGO AND RESE_FECHA <= :FECHA AND RESE_VENCE >= :FECHA AND RD.BODE_COD = :CODBOD AND RSDE_ANULADO = 'N'
                        INTO :RESERVADO;
                    if (RESERVADO IS NULL) then
                        RESERVADO = 0;
                    PEDIDO = 0;
                    FOR SELECT P.PEDI_ID, PEDE_ITEM, PEDE_CANT * PEDE_FACTOR
                        FROM PEDIDOS P, PEDIDOS_DETALLE PD
                        WHERE P.PEDI_ID = PD.PEDI_ID AND PD.ARTI_COD = :CODIGO AND PEDI_VENCE >= :FECHA AND PEDI_FECHA <= :FECHA AND PEDE_ANULADO = 'N' AND BODE_COD = :CODBOD
                        INTO :ID, :ITEM, :CANT2
                        do
                        BEGIN
                        EXECUTE PROCEDURE FALTANTE(34, 31, ID, ITEM) returning_values (ORDENC, UND, FACTOR);
                        if ((ORDENC * FACTOR = CANT2) or (PEDAUTO = 'SI')) then /* SI NO SE HA FACTURADO MIRE A VER SI SE REMISIONO */
                            EXECUTE PROCEDURE FALTANTE(34, 32, ID, ITEM) returning_values (ORDENC, UND, FACTOR);
                        if (ORDENC IS NULL) then
                            ORDENC = 0;
                        PEDIDO = PEDIDO + ORDENC * FACTOR;
                        END
                    RESERVADO = RESERVADO + PEDIDO;
                    END
                ELSE
                    BEGIN
                    RESERVADO = 0;
                    ORDENADO = 0;
                    END
                if (ENPESO = 'S') then
                    BEGIN
                    if (pesounit IS NULL) then
                        pesounit = 0;
                    if (PESOUNIT <> 0) then
                        BEGIN
                        pesototal = PESOUNIT * cant;
                        SUSPEND;
                        END
                    END
                ELSE
                    SUSPEND;
                END
            END
        END
  END

if (DETALLE = 'L') then
  BEGIN
  FOR SELECT A.ARTI_COD, ARTI_DES, ARTI_UNIDAD, ARTI_EXIST, TAIV_PORC, A.GRUP_COD, A.SUBG_COD, A.MARC_COD, L.lote_nro, L.lote_nro||' - '||L.lote_vence, ARTI_CONSUMO,l.bode_cod, L.lote_saldo,l.lote_costo, ARTI_PESO/1000
      FROM ARTICULO A, LOTES l, TARIFA_IVA T
      WHERE A.ARTI_COD >= '0' AND A.ARTI_COD <= 'zz' AND ARTI_DES >= '' AND ARTI_DES <= 'zz' AND ESAR_COD <> 'I' AND A.TAIV_COD = T.TAIV_COD and a.arti_cod = l.arti_cod
      INTO :CODIGO, :NOMBRE, :UNIDAD, :EXIST, :IVA, :CODGRUPO, :CODSUBG, :CODMARC, :LOTE, :NOMBOD, :CONSUMO, :codbod, :cant, :costo_lote, :pesounit
      DO
        BEGIN
        OK = 'N';
        if (AGRUPA = 'G') then
            BEGIN
            if ((CODGRUPO >= GRPINI) AND (CODGRUPO <= GRPFIN)) then
                OK = 'S';
            end
        ELSE
            if (AGRUPA = 'M') then
                BEGIN
                if ((CODMARC >= GRPINI) AND (CODMARC <= GRPFIN)) then
                    OK = 'S';
                END
        if (OK = 'S') then
            BEGIN
            NOMGRUPO = '';
            NOMMARC = '';
            NOMSUBG = '';
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            SELECT MAX(COBA_COD) FROM BARRAS_ARTICULO WHERE ARTI_COD = :codigo AND COBA_UNIDAD = :unidad INTO :codbar;
            if (CODBAR IS NULL) then
                CODBAR = CODIGO;

            if (EXIST <> 'N') then
                BEGIN
                EXECUTE PROCEDURE COSTO_PROMEDIO_UNIDAD(CODIGO, FECHA, UNIDAD) returning_values (COSTO);
                EXECUTE PROCEDURE ULTIMO_COSTO(CODIGO, FECHA, UNIDAD) returning_values (ULTCOSTO);
                SELECT MAX(MVAR_FECHA) FROM MOVIMIENTO_ARTICULO WHERE ARTI_COD = :CODIGO AND MVAR_ENTRADA = 'S' AND MVAR_FECHA <= :FECHA INTO :FECHACOSTO;
                COSTOTOT = :CANT * :COSTO;
                CONSUMO = CONSUMO * CANT;
                if (RESERVA = 'S') then
                    BEGIN
                    SELECT SUM(ORID_ENTREGAR)
                        FROM ORDENINVENTARIO_DETALLE OD, ordenes_inventario O
                        WHERE O.ORIN_ID = OD.ORIN_ID AND ARTI_COD = :CODIGO AND ORIN_FECHA <= :FECHA AND ORIN_FECLLEGA >= :FECHA AND ORID_ANULADO = 'N'
                        INTO :ORDENADO;
                    if (ORDENADO IS NULL) then
                        ORDENADO = 0;
                    ORDENC = 0;
                    FOR SELECT O.ORDC_ID, OCDE_ITEM, OCDE_CANT * OCDE_FACTOR
                        FROM ORDENES_COMPRA O, ORDENES_COMPRA_DETALLE OD
                        WHERE O.ORDC_ID = OD.ORDC_ID AND OD.ARTI_COD = :CODIGO AND ORDC_VENCE >= :FECHA AND ORDC_FECHA <= :FECHA AND OCDE_ANULADO = 'N'
                        INTO :ID, :ITEM, :CANT2
                        do
                        BEGIN
                        EXECUTE PROCEDURE FALTANTE(23, 21, ID, ITEM) returning_values (PEDIDO, UND, FACTOR);
                        if (PEDIDO * FACTOR = CANT2) then /* SI NO SE HA FACTURADO MIRE A VER SI SE REMISIONO */
                            EXECUTE PROCEDURE FALTANTE(23, 22, ID, ITEM) returning_values (PEDIDO, UND, FACTOR);
                        if (PEDIDO IS NULL) then
                            PEDIDO = 0;
                        ORDENC = ORDENC + PEDIDO * FACTOR;
                        END
                    ORDENADO = ORDENADO + ORDENC;
                    SELECT SUM(RSDE_LIBERAR)
                        FROM RESERVAS_DETALLE RD, RESERVAS R
                        WHERE R.RESE_ID = RD.RESE_ID AND ARTI_COD = :CODIGO AND RESE_FECHA <= :FECHA AND RESE_VENCE >= :FECHA AND RSDE_ANULADO = 'N'
                        INTO :RESERVADO;
                    if (RESERVADO IS NULL) then
                        RESERVADO = 0;
                    PEDIDO = 0;
                    FOR SELECT P.PEDI_ID, PEDE_ITEM, PEDE_CANT * PEDE_FACTOR
                        FROM PEDIDOS P, PEDIDOS_DETALLE PD
                        WHERE P.PEDI_ID = PD.PEDI_ID AND PD.ARTI_COD = :CODIGO AND PEDI_VENCE >= :FECHA AND PEDI_FECHA <= :FECHA AND PEDE_ANULADO = 'N'
                        INTO :ID, :ITEM, :CANT2
                        do
                        BEGIN
                        EXECUTE PROCEDURE FALTANTE(34, 31, ID, ITEM) returning_values (ORDENC, UND, FACTOR);
                        if ((ORDENC * FACTOR = CANT2) or (PEDAUTO = 'SI')) then /* SI NO SE HA FACTURADO MIRE A VER SI SE REMISIONO */
                            EXECUTE PROCEDURE FALTANTE(34, 32, ID, ITEM) returning_values (ORDENC, UND, FACTOR);
                        if (ORDENC IS NULL) then
                            ORDENC = 0;
                        PEDIDO = PEDIDO + ORDENC * FACTOR;
                        END
                    RESERVADO = RESERVADO + PEDIDO;
                    END
                ELSE
                    BEGIN
                    RESERVADO = 0;
                    ORDENADO = 0;
                    END
                if (ENPESO = 'S') then
                    BEGIN
                    if (pesounit IS NULL) then
                        pesounit = 0;
                    if (PESOUNIT <> 0) then
                        BEGIN
                        pesototal = PESOUNIT * cant;
                        SUSPEND;
                        END
                    END
                ELSE
                    SUSPEND;
                END
            END
        END
  end
if (DETALLE = 'N') then
  BEGIN
  FOR SELECT ARTI_COD, ARTI_DES, ARTI_UNIDAD, ARTI_EXIST, TAIV_PORC, A.GRUP_COD, A.SUBG_COD, A.MARC_COD, ARTI_CONSUMO, ARTI_PESO/1000
      FROM ARTICULO A, TARIFA_IVA T
      WHERE ARTI_COD >= :CODINI AND ARTI_COD <= :CODFIN AND ARTI_DES >= :DESINI AND ARTI_DES <= :DESFIN AND ESAR_COD <> 'I' AND A.TAIV_COD = T.TAIV_COD
      INTO :CODIGO, :NOMBRE, :UNIDAD, :EXIST, :IVA, :CODGRUPO, :CODSUBG, :CODMARC, :CONSUMO, :pesounit
      DO
        BEGIN
        OK = 'N';
        if (AGRUPA = 'G') then
            BEGIN
            if ((GRPINI = '0') AND (GRPFIN = 'zz')) then
                OK = 'S';
            else
                if ((CODGRUPO >= GRPINI) AND (CODGRUPO <= GRPFIN)) then
                    OK = 'S';
            end
        ELSE
            if (AGRUPA = 'M') then
                BEGIN
                if ((GRPINI = '0') AND (GRPFIN = 'zzz')) then
                    OK = 'S';
                else
                    if ((CODMARC >= GRPINI) AND (CODMARC <= GRPFIN)) then
                        OK = 'S';
                END
        if (OK = 'S') then
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            SELECT MAX(COBA_COD) FROM BARRAS_ARTICULO WHERE ARTI_COD = :codigo AND COBA_UNIDAD = :unidad INTO :codbar;
            if (CODBAR IS NULL) then
                CODBAR = CODIGO;

            if (EXIST <> 'N') then
                BEGIN
                EXECUTE PROCEDURE SALDO_INICIAL_TOTAL_INV(CODIGO, FECHA) returning_values (CANT);
                EXECUTE PROCEDURE COSTO_PROMEDIO_UNIDAD(CODIGO, FECHA, UNIDAD) returning_values (COSTO);
                EXECUTE PROCEDURE ULTIMO_COSTO(CODIGO, FECHA, UNIDAD) returning_values (ULTCOSTO);
                SELECT MAX(MVAR_FECHA) FROM MOVIMIENTO_ARTICULO WHERE ARTI_COD = :CODIGO AND MVAR_ENTRADA = 'S' AND MVAR_FECHA <= :FECHA INTO :FECHACOSTO;
                COSTOTOT = :CANT * :COSTO;
                CONSUMO = CONSUMO * CANT;
                if (RESERVA = 'S') then
                    BEGIN
                    SELECT SUM(ORID_ENTREGAR)
                        FROM ORDENINVENTARIO_DETALLE OD, ordenes_inventario O
                        WHERE O.ORIN_ID = OD.ORIN_ID AND ARTI_COD = :CODIGO AND ORIN_FECHA <= :FECHA AND ORIN_FECLLEGA >= :FECHA AND ORID_ANULADO = 'N'
                        INTO :ORDENADO;
                        if (ORDENADO IS NULL) then
                            ORDENADO = 0;
                    ORDENC = 0;
                    FOR SELECT O.ORDC_ID, OCDE_ITEM, OCDE_CANT * OCDE_FACTOR
                        FROM ORDENES_COMPRA O, ORDENES_COMPRA_DETALLE OD
                        WHERE O.ORDC_ID = OD.ORDC_ID AND OD.ARTI_COD = :CODIGO AND ORDC_VENCE >= :FECHA AND ORDC_FECHA <= :FECHA AND OCDE_ANULADO = 'N'
                        INTO :ID, :ITEM, :CANT2
                        do
                        BEGIN
                        EXECUTE PROCEDURE FALTANTE(23, 21, ID, ITEM) returning_values (PEDIDO, UND, FACTOR);
                        if (PEDIDO * FACTOR = CANT2) then /* SI NO SE HA FACTURADO MIRE A VER SI SE REMISIONO */
                            EXECUTE PROCEDURE FALTANTE(23, 22, ID, ITEM) returning_values (PEDIDO, UND, FACTOR);
                        if (PEDIDO IS NULL) then
                            PEDIDO = 0;
                        ORDENC = ORDENC + PEDIDO * FACTOR;
                        END
                    ORDENADO = ORDENADO + ORDENC;
                    SELECT SUM(RSDE_LIBERAR)
                        FROM RESERVAS_DETALLE RD, RESERVAS R
                        WHERE R.RESE_ID = RD.RESE_ID AND ARTI_COD = :CODIGO AND RESE_FECHA <= :FECHA AND RESE_VENCE >= :FECHA AND RSDE_ANULADO = 'N'
                        INTO :RESERVADO;
                    if (RESERVADO IS NULL) then
                        RESERVADO = 0;
                    PEDIDO = 0;
                    FOR SELECT P.PEDI_ID, PEDE_ITEM, PEDE_CANT * PEDE_FACTOR
                        FROM PEDIDOS P, PEDIDOS_DETALLE PD, PUNTO_VENTA PT
                        WHERE P.PEDI_ID = PD.PEDI_ID AND PD.ARTI_COD = :CODIGO AND PT.ptvt_id = P.PTVT_ID AND PEDI_VENCE >= :FECHA AND PEDI_FECHA <= :FECHA AND PEDE_ANULADO = 'N'
                        INTO :ID, :ITEM, :CANT2
                        do
                        BEGIN
                        EXECUTE PROCEDURE FALTANTE(34, 31, ID, ITEM) returning_values (ORDENC, UND, FACTOR);
                        if ((ORDENC * FACTOR = CANT2) or (PEDAUTO = 'SI')) then /* SI NO SE HA FACTURADO MIRE A VER SI SE REMISIONO */
                            EXECUTE PROCEDURE FALTANTE(34, 32, ID, ITEM) returning_values (ORDENC, UND, FACTOR);
                        if (ORDENC IS NULL) then
                            ORDENC = 0;
                        PEDIDO = PEDIDO + ORDENC * FACTOR;
                        END
                    if (PEDIDO IS NULL) then
                        PEDIDO = 0;
                    RESERVADO = RESERVADO + PEDIDO;
                    END
                ELSE
                    BEGIN
                    RESERVADO = 0;
                    ORDENADO = 0;
                    END
                if (ENPESO = 'S') then
                    BEGIN
                    if (pesounit IS NULL) then
                        pesounit = 0;
                    if (PESOUNIT <> 0) then
                        BEGIN
                        pesototal = PESOUNIT * cant;
                        SUSPEND;
                        END
                    END
                ELSE
                    SUSPEND;
                END
            END
        END
  END
END
^

SET TERM ; ^


/* 20090423C */
/* IMPRESION DE RUTERO POR ARTICULO */
INSERT INTO TIPO_DOCUMENTO (TIDO_COD, TIDO_NOMCORTO, TIDO_NOMLARGO, TIDO_MODULO, TIDO_INVE, TIDO_CART, TIDO_CXP, TIDO_CAJA, TIDO_BCOS) VALUES (38, 'RUTEROAR', 'RUTERO ARTICULO', 'VENTAS', 'N', 'N', 'N', 'N', 'N');
COMMIT WORK;


/* 20090423D */
/* DEVULETO EN NULL AL HACER CONSIGNACION AUTOMATICA DESDE EL RECIBO */
SET TERM ^ ;

CREATE OR ALTER TRIGGER RECIBOS_CAJA_PAGO_AI FOR RECIBOS_CAJA_PAGO
ACTIVE AFTER INSERT POSITION 0
AS
declare variable Fec DATE;
declare variable Caja integer;
declare variable Conc VARCHAR(60);
declare variable Pref varchar(4);
declare variable Num varchar(6);
declare variable Existe char(1);
declare variable CONS CHAR(1);
declare variable CTABCO INTEGER;
declare variable PREFBCO VARCHAR(4);
declare variable TARJ VARCHAR(3);
declare variable IDCONS INTEGER;
declare variable COMIP NUMERIC(9,2);
declare variable RTFTEP NUMERIC(9,2);
declare variable RTIVAP NUMERIC(9,2);
declare variable RTICAP NUMERIC(9,2);
declare variable COMI NUMERIC(18,2);
declare variable RTFTE NUMERIC(18,2);
declare variable RTIVA NUMERIC(18,2);
declare variable RTICA NUMERIC(18,2);
BEGIN
if ((new.reca_id <> 0) and (new.rcpa_anulado = 'N')) then
  begin
  /* Actualice el total del movimiento en caja */
  select reca_fecha, caja_id, reca_conc, pref_pre, reca_numero
    from recibos_caja where reca_id = new.reca_id
    into :Fec, :Caja, :Conc, :Pref, :Num;
  select 'S' from movimiento_caja where moca_tiporef = 61 and moca_idref = new.reca_id into :Existe;
  if (Existe = 'S') then
    update movimiento_caja
      set moca_debitos = moca_debitos + new.rcpa_monto
      where moca_tiporef = 61 and moca_idref = new.reca_id;
  else
    INSERT INTO MOVIMIENTO_CAJA
        (MOCA_ID, CAJA_ID, MOCA_TIPOREF, MOCA_PREFREF, MOCA_NUMREF, MOCA_FECHA, MOCA_CONC, MOCA_DEBITOS, MOCA_CREDITOS, MOCA_DB, MOCA_IDREF)
        VALUES(GEN_ID(id_movcaja,1), :Caja, 61, :Pref, :Num, :Fec, :Conc, NEW.rcpa_monto, 0, 'S', new.reca_id);
  /* GRABE EL DOCUMENTO DE PAGO EN CAJA */
  if (NEW.FOPA_ID <> 1) then
      INSERT INTO DOCUMENTOS_PAGO_CAJA (DPCA_ID, FOPA_ID, CAJA_ID, DPCA_BANCO, DPCA_CUENTA, DPCA_NUMERO, DPCA_FECHA, DPCA_MONTO, DPCA_TIPOENT, DPCA_IDENT, DPCA_TIPOSAL, DPCA_IDSAL)
        VALUES (GEN_ID(ID_DOCPAGOCAJA, 1), NEW.FOPA_ID, :CAJA, NEW.RCPA_BANCO, NEW.RCPA_CUENTA, NEW.RCPA_NUMERO, NEW.RCPA_FECHA, NEW.RCPA_MONTO, 61, NEW.RECA_ID, 0, 0);
  else
      EXECUTE PROCEDURE SUME_SALDO_EFECTIVO (:CAJA, :FEC, NEW.RCPA_MONTO, 'N');

  /* SI ES DE CONSIGNACION LA FORMA GRABELA */
  SELECT FOPA_CONSIGNA, FOPA_CTABCO, FOPA_PREFBCO, FOPA_TARJETA FROM FORMAS_PAGO
    WHERE FOPA_ID = NEW.fopa_id INTO :CONS, :CTABCO, :PREFBCO, :TARJ;
  if (CONS = 'S') then
    begin
    if ((TARJ IS NULL) OR (TARJ = '')) then
        BEGIN
        if ((CTABCO <> 0) AND (PREFBCO <> '')) then
            BEGIN
            /* CONSIGNACION */
            IDCONS = GEN_ID(ID_CONSIGNA, 1);
            INSERT INTO CONSIGNA (CONS_ID, CUBA_COD, PRBA_PREF, CONS_NUMERO, CONS_FECHA, CONS_CONCEPTO, CONS_ANULADO, CONS_TRANSMIT, NUMOK)
                VALUES (:idcons, :CTABCO, :prefbco, SUBSTR(NEW.rcpa_numero, 1, 6), :fec, :conc, 'N', 'N', 'N');
            INSERT INTO CONSIGNA_DETALLE (CONS_ID, CODE_ITEM2, FOPA_ID, CODE_BANCO, CODE_CUENTA, CODE_NUMERO, CODE_FECHA, CODE_MONTO, CODE_ANULADO, CODE_TRANSMIT, CAJA_ID, CODE_DEVUELTO)
                VALUES (:idcons, 1, new.fopa_id, NEW.rcpa_banco, NEW.rcpa_cuenta, NEW.rcpa_numero, NEW.rcpa_fecha, NEW.rcpa_monto, 'N', 'N', :caja, 'N');

            insert into consolidado_faltantes (cofa_id, cofa_item, cofa_tipoori, cofa_tipodes, cofa_iddes, cofa_idori, cofa_itemori, cofa_ok, cofa_lista, cofa_unidad)
                values (gen_id(id_cons, 1), 1, 61, 71, :idcons, new.reca_id, new.rcpa_item, 'N', :ctabco, :prefbco);
            END
        END
    ELSE
        BEGIN
        /* CONSIGNACION DE TARJETA */
        if ((CTABCO <> 0) AND (PREFBCO <> '')) then
            BEGIN
            select TARJ_COMIPORC, TARJ_RTFTEPORC, TARJ_RTIVAPORC, TARJ_RTICAPORC FROM TARJETAS WHERE TARJ_COD = :tarj
                INTO :comip, :rtftep, :rtivap, :rticap;
            COMI = (NEW.rcpa_monto-NEW.rcpa_ivamonto) * :comip / 100;
            EXECUTE PROCEDURE REDONDEE (COMI,0) returning_values (COMI);
            RTFTE = (NEW.rcpa_monto-NEW.rcpa_ivamonto) * :rtftep / 100;
            EXECUTE PROCEDURE REDONDEE (RTFTE,0) returning_values (RTFTE);
            RTIVA = NEW.rcpa_ivamonto * :rtivap / 100;
            EXECUTE PROCEDURE REDONDEE (RTIVA,0) returning_values (RTIVA);
            RTICA = (NEW.rcpa_monto-NEW.rcpa_ivamonto) * :rticap / 1000;
            EXECUTE PROCEDURE REDONDEE (RTICA,0) returning_values (RTICA);
            IDCONS = GEN_ID(ID_CONSIGNATAR, 1);
            INSERT INTO CONSIGNA_TARJETAS (COTJ_ID, PREF_PRE, COTJ_NUMERO, COTJ_FECHA, COTJ_CONCEPTO, COTJ_CHEQUE, CUBA_COD,
                COTJ_MONTO, COTJ_RTFTE, COTJ_COMISION, COTJ_RTIVA, COTJ_RTICA, COTJ_ANULADO, COTJ_TRANSMIT, NUMOK, CAJA_ID)
                VALUES (:idcons, :prefbco, SUBSTR(NEW.rcpa_numero, 1, 6), :fec, :conc, 'N', :ctabco,
                new.rcpa_monto-:COMI-:RTFTE-:RTIVA-:RTICA, :rtfte, :COMI, :rtiva, :rtica, 'N', 'N', 'N', :caja);
            INSERT INTO CONSIGNA_TARJETAS_DET (COTJ_ID, CTJD_ITEM, TARJ_COD, CTJD_NROTJ, CTJD_COMPROB, CTJD_BASE, CTJD_IVA, CTJD_COMIPORC, CTJD_COMIIVA, CTJD_COMIMONTO,
                CTJD_RTFTEPORC, CTJD_RTFTEMONTO, CTJD_RTIVAPOC, CTJD_RTIVAMONTO, CTJD_ANULADO, CTJD_TRANSMIT, FOPA_ID, CTJD_RTICAPORC, CTJD_RTCAMONTO)
                VALUES (:idcons, 1, NEW.rcpa_banco, NEW.rcpa_cuenta, NEW.rcpa_numero, new.rcpa_monto, NEW.rcpa_ivamonto, :COMIP, 'N', :comi,
                :rtftep, :rtfte, :rtivap, :rtiva, 'N', 'N', new.fopa_id, :rticap, :rtica);

            insert into consolidado_faltantes (cofa_id, cofa_item, cofa_tipoori, cofa_tipodes, cofa_iddes, cofa_idori, cofa_itemori, cofa_ok, cofa_lista, cofa_unidad)
                values (gen_id(id_cons, 1), 1, 61, 64, :idcons, new.reca_id, new.rcpa_item, 'N', :ctabco, :prefbco);
            END
        END
    end
  end
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER RECIBOS_CAJA_PAGO_AU FOR RECIBOS_CAJA_PAGO
ACTIVE AFTER UPDATE POSITION 0
as
declare variable Fec date;
declare variable Caja integer;
declare variable Conc VARCHAR(60);
declare variable Pref varchar(4);
declare variable Num varchar(6);
declare variable Existe char(1);
declare variable TIPOCON INTEGER;
declare variable CONS CHAR(1);
declare variable CTABCO INTEGER;
declare variable PREFBCO VARCHAR(4);
declare variable TARJ VARCHAR(3);
declare variable IDCONS INTEGER;
declare variable COMIP NUMERIC(9,2);
declare variable RTFTEP NUMERIC(9,2);
declare variable RTIVAP NUMERIC(9,2);
declare variable RTICAP NUMERIC(9,2);
declare variable COMI NUMERIC(18,2);
declare variable RTFTE NUMERIC(18,2);
declare variable RTIVA NUMERIC(18,2);
declare variable RTICA NUMERIC(18,2);
BEGIN
select reca_fecha, caja_id, reca_conc, pref_pre, reca_numero
    from recibos_caja where reca_id = new.reca_id
    into :Fec, :Caja, :Conc, :Pref, :Num;
if ((OLD.reca_id <> 0) AND (OLD.rcpa_anulado = 'N')) then
    begin
    /* anule la consignación */
    existe = 'N';
    select 'S', cofa_tipodes, cofa_iddes from consolidado_faltantes
        where cofa_tipoori = 61 and cofa_idori = old.reca_id and cofa_itemori = old.rcpa_item
        into :existe, :tipocon, :idcons;
    if (existe = 'S') then
        begin
        if (:tipocon = 71) then
            BEGIN
            DELETE FROM CONSIGNA_DETALLE WHERE CONS_ID = :idcons;
            DELETE FROM CONSIGNA WHERE CONS_ID = :idcons;
            END
        if (:tipocon = 64) then
            BEGIN
            DELETE FROM consigna_tarjetas_det WHERE COTJ_ID = :idcons;
            DELETE FROM consigna_tarjetas WHERE COTJ_ID = :idcons;
            END
        end
    /* Actualice el total del movimiento caja */
    select 'S' from movimiento_caja where moca_tiporef = 61 and moca_idref = new.reca_id into :Existe;
    if (Existe = 'S') then
        update movimiento_caja
            set moca_debitos = moca_debitos - new.rcpa_monto
            where moca_tiporef = 61 and moca_idref = new.reca_id;
    /* BORRE EL DOCUMENTO EN CAJA */
    if (OLD.FOPA_ID <> 1) then
        DELETE FROM DOCUMENTOS_PAGO_CAJA WHERE DPCA_TIPOENT = 61 AND DPCA_IDENT = OLD.RECA_ID AND
            DPCA_BANCO = OLD.RCPA_BANCO AND DPCA_CUENTA = OLD.RCPA_CUENTA AND DPCA_NUMERO = OLD.RCPA_NUMERO AND DPCA_MONTO = OLD.rcpa_monto;
    ELSE
        EXECUTE PROCEDURE SUME_SALDO_EFECTIVO (:CAJA, :FEC, OLD.RCPA_MONTO, 'S');
    end
if ((new.reca_id <> 0) AND (new.rcpa_anulado = 'N')) then
    begin
    existe = 'N';
    select 'S' from movimiento_caja where moca_tiporef = 61 and moca_idref = new.reca_id into :Existe;
    if (Existe = 'S') then
        update movimiento_caja
            set moca_debitos = moca_debitos + new.rcpa_monto
            where moca_tiporef = 61 and moca_idref = new.reca_id;
    else
        INSERT INTO MOVIMIENTO_CAJA
            (MOCA_ID, CAJA_ID, MOCA_TIPOREF, MOCA_PREFREF, MOCA_NUMREF, MOCA_FECHA, MOCA_CONC, MOCA_DEBITOS, MOCA_CREDITOS, MOCA_DB, MOCA_IDREF)
            VALUES(GEN_ID(id_movcaja,1), :Caja, 61, :Pref, :Num, :Fec, :Conc, NEW.rcpa_monto, 0, 'S', new.reca_id);
                
    /* GRABE EL DOCUMENTO DE PAGO EN CAJA */
    if (NEW.FOPA_ID <> 1) then
        INSERT INTO DOCUMENTOS_PAGO_CAJA (DPCA_ID, FOPA_ID, CAJA_ID, DPCA_BANCO, DPCA_CUENTA, DPCA_NUMERO, DPCA_FECHA, DPCA_MONTO, DPCA_TIPOENT, DPCA_IDENT, DPCA_TIPOSAL, DPCA_IDSAL)
            VALUES (GEN_ID(ID_DOCPAGOCAJA, 1), NEW.FOPA_ID, :CAJA, NEW.RCPA_BANCO, NEW.RCPA_CUENTA, NEW.RCPA_NUMERO, NEW.RCPA_FECHA, NEW.RCPA_MONTO, 61, NEW.RECA_ID, 0, 0);
    ELSE
        EXECUTE PROCEDURE SUME_SALDO_EFECTIVO (:CAJA, :FEC, NEW.RCPA_MONTO, 'N');

    /* SI ES DE CONSIGNACION LA FORMA GRABELA */
    SELECT FOPA_CONSIGNA, FOPA_CTABCO, FOPA_PREFBCO, FOPA_TARJETA FROM FORMAS_PAGO
        WHERE FOPA_ID = NEW.fopa_id INTO :CONS, :CTABCO, :PREFBCO, :TARJ;
    if (CONS = 'S') then
        begin
        if ((TARJ IS NULL) OR (TARJ = '')) then
            BEGIN
            if ((CTABCO <> 0) AND (PREFBCO <> '')) then
                BEGIN
                /* CONSIGNACION */
                IDCONS = GEN_ID(ID_CONSIGNA, 1);
                INSERT INTO CONSIGNA (CONS_ID, CUBA_COD, PRBA_PREF, CONS_NUMERO, CONS_FECHA, CONS_CONCEPTO, CONS_ANULADO, CONS_TRANSMIT, NUMOK)
                    VALUES (:idcons, :ctabco, :prefbco, SUBSTR(NEW.rcpa_numero, 1, 6), :fec, :conc, 'N', 'N', 'N');
                INSERT INTO CONSIGNA_DETALLE (CONS_ID, CODE_ITEM2, FOPA_ID, CODE_BANCO, CODE_CUENTA, CODE_NUMERO, CODE_FECHA, CODE_MONTO, CODE_ANULADO, CODE_TRANSMIT, CAJA_ID, CODE_DEVUELTO)
                    VALUES (:idcons, 1, new.fopa_id, NEW.rcpa_banco, NEW.rcpa_cuenta, NEW.rcpa_numero, NEW.rcpa_fecha, NEW.rcpa_monto, 'N', 'N', :caja, 'N');

                insert into consolidado_faltantes (cofa_id, cofa_item, cofa_tipoori, cofa_tipodes, cofa_iddes, cofa_idori, cofa_itemori, cofa_ok, cofa_lista, cofa_unidad)
                    values (gen_id(id_cons, 1), 1, 61, 71, :idcons, new.reca_id, new.rcpa_item, 'N', :ctabco, :prefbco);
                END
            END
        else
            BEGIN
            /* CONSIGNACION DE TARJETA */
            if ((ctabco <> 0) AND (PREFBCO <> '')) then
                BEGIN
            select TARJ_COMIPORC, TARJ_RTFTEPORC, TARJ_RTIVAPORC, TARJ_RTICAPORC FROM TARJETAS WHERE TARJ_COD = :tarj
                INTO :comip, :rtftep, :rtivap, :rticap;
                COMI = (NEW.rcpa_monto-NEW.rcpa_ivamonto) * :comip / 100;
                EXECUTE PROCEDURE REDONDEE (COMI,0) returning_values (COMI);
                RTFTE = (NEW.rcpa_monto-NEW.rcpa_ivamonto) * :rtftep / 100;
                EXECUTE PROCEDURE REDONDEE (RTFTE,0) returning_values (RTFTE);
                RTIVA = NEW.rcpa_ivamonto * :rtivap / 100;
                EXECUTE PROCEDURE REDONDEE (RTIVA,0) returning_values (RTIVA);
                RTICA = (NEW.rcpa_monto-NEW.rcpa_ivamonto) * :rticap / 1000;
                EXECUTE PROCEDURE REDONDEE (RTICA,0) returning_values (RTICA);
                IDCONS = GEN_ID(ID_CONSIGNATAR, 1);
                INSERT INTO CONSIGNA_TARJETAS (COTJ_ID, PREF_PRE, COTJ_NUMERO, COTJ_FECHA, COTJ_CONCEPTO, COTJ_CHEQUE, CUBA_COD,
                    COTJ_MONTO, COTJ_RTFTE, COTJ_COMISION, COTJ_RTIVA, COTJ_RTICA, COTJ_ANULADO, COTJ_TRANSMIT, NUMOK, CAJA_ID)
                    VALUES (:idcons, :prefbco, SUBSTR(NEW.rcpa_numero, 1, 6), :fec, :conc, 'N', :ctabco,
                    new.rcpa_monto-:COMI-:RTFTE-:RTIVA-:RTICA, :rtfte,  :COMI, :rtiva, :rtica, 'N', 'N', 'N', :caja);
                INSERT INTO CONSIGNA_TARJETAS_DET (COTJ_ID, CTJD_ITEM, TARJ_COD, CTJD_NROTJ, CTJD_COMPROB, CTJD_BASE, CTJD_IVA, CTJD_COMIPORC, CTJD_COMIIVA, CTJD_COMIMONTO,
                    CTJD_RTFTEPORC, CTJD_RTFTEMONTO, CTJD_RTIVAPOC, CTJD_RTIVAMONTO, CTJD_ANULADO, CTJD_TRANSMIT, FOPA_ID, CTJD_RTICAPORC, CTJD_RTCAMONTO)
                    VALUES (:idcons, 1, NEW.rcpa_banco, NEW.rcpa_cuenta, NEW.rcpa_numero, new.rcpa_monto, NEW.rcpa_ivamonto, :COMIP, 'N', :comi,
                    :rtftep, :rtfte, :rtivap, :rtiva, 'N', 'N', new.fopa_id, :rticap, :rtica);
                insert into consolidado_faltantes (cofa_id, cofa_item, cofa_tipoori, cofa_tipodes, cofa_iddes, cofa_idori, cofa_itemori, cofa_ok, cofa_lista, cofa_unidad)
                    values (gen_id(id_cons, 1), 1, 61, 64, :idcons, new.reca_id, new.rcpa_item, 'N', :ctabco, :prefbco);
                END
            END
        end /* consignacion */
    end
END
^

SET TERM ; ^


SET TERM ^ ;

create trigger CONSIGNA_DETALLE_BI for CONSIGNA_DETALLE
active BEFORE INSERT position 0
as
begin
if (NEW.code_devuelto IS NULL) then
    NEW.code_devuelto = 'N';
end
^

SET TERM ; ^

UPDATE CONSIGNA_DETALLE SET CODE_DEVUELTO = 'N' WHERE CODE_DEVUELTO IS NULL;
COMMIT WORK;

/* 20090424 */
/* al anular una entrada del mismo dia del ultimo movimiento no se actualizan los registros de ultimo costo en los mov. de ese dia  */

SET TERM ^ ;

CREATE OR ALTER TRIGGER MOVIMIENTO_ARTICULO_AD FOR MOVIMIENTO_ARTICULO
ACTIVE AFTER DELETE POSITION 0
AS
declare variable LOTE CHAR(1);
BEGIN
  /* INSERTE EL NUEVO LOTE */
  SELECT ARTI_EXIST
    FROM   ARTICULO
    WHERE  ARTICULO.ARTI_COD = OLD.ARTI_COD
    INTO :LOTE;
  /* BORRE LOS VIEJOS */
  if (old.mvar_tipodoc <> 13) then
      BEGIN
      EXECUTE PROCEDURE actualice_costo(old.arti_cod, old.mvar_fecha, old.mvar_costo, old.mvar_cant, old.mvar_entrada, 'S', OLD.mvar_cons, OLD.mvar_tipodoc);
      if (OLD.mvar_entrada = 'S') then
          EXECUTE PROCEDURE chequeo_costos(old.arti_cod, old.mvar_fecha-1); /* PARA OBLIGAR A RECALCULAR LOS MOV. DEL MISMO DIA */
      else
          EXECUTE PROCEDURE chequeo_costos(old.arti_cod, old.mvar_fecha);
      END
  /* actualice existencias */
  if (old.mvar_entrada = 'S') then
    BEGIN
    execute procedure sume_existencia(old.arti_cod, old.bode_cod, old.mvar_fecha, old.mvar_cant, 'S');
    if (LOTE = 'L') then
        UPDATE LOTES
            set lote_saldo = lote_saldo - old.mvar_cant
            where (arti_cod = old.ARTI_COD) and (bode_cod = old.bode_cod) and (lote_nro = old.mvar_lote);
    END
  else
    BEGIN
    execute procedure reste_existencia(old.arti_cod, old.bode_cod, old.mvar_fecha, old.mvar_cant, 'S');
    if (LOTE = 'L') then
        UPDATE LOTES
            set lote_saldo = lote_saldo + old.mvar_cant
            where (arti_cod = old.ARTI_COD) and (bode_cod = old.bode_cod) and (lote_nro = old.mvar_lote);
    END
END
^

SET TERM ; ^

/* 20090425 */
/* PARA RECALCULAR EL IDREF EN CONTABILIDAD CON BASE EN EL NUMERO */
SET TERM ^ ;

CREATE PROCEDURE RECALCULA_IDREF(
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    ID INTEGER,
    CTA INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    TIPOCO VARCHAR(3))
AS
begin
FOR SELECT ENTR_ID, PREF_PRE, ENTR_NUMERO FROM ENTRADAS WHERE ENTR_FECHA >= :FECINI AND ENTR_FECHA <= :FECFIN INTO :ID, :PREF, :NUMERO
    DO
    BEGIN
    SELECT MAX(TICO_COD) FROM interfaz_inventario WHERE tido_cod = 11 AND PREF_PRE = :PREF INTO :TIPOCO;
    if (EXISTS(SELECT ENCO_CONSEC FROM comprobante_encabezado WHERE TICO_COD = :TIPOCO AND PRCO_PREF = :PREF AND ENCO_NUMERO = :numero AND ENCO_TIPOREF = 0)) then
        BEGIN
        UPDATE comprobante_encabezado SET ENCO_TIPOREF = 11, ENCO_IDREF = :ID WHERE TICO_COD = :TIPOCO AND PRCO_PREF = :PREF AND ENCO_NUMERO = :numero AND ENCO_TIPOREF = 0;
        suspend;
        END
    END
FOR SELECT SALI_ID, PREF_PRE, SALI_NUMERO FROM SALIDAS WHERE SALI_FECHA >= :FECINI AND SALI_FECHA <= :FECFIN INTO :ID, :PREF, :NUMERO
    DO
    BEGIN
    SELECT MAX(TICO_COD) FROM interfaz_inventario WHERE tido_cod = 12 AND PREF_PRE = :PREF INTO :TIPOCO;
    if (EXISTS(SELECT ENCO_CONSEC FROM comprobante_encabezado WHERE TICO_COD = :TIPOCO AND PRCO_PREF = :PREF AND ENCO_NUMERO = :numero AND ENCO_TIPOREF = 0)) then
        BEGIN
        UPDATE comprobante_encabezado SET ENCO_TIPOREF = 12, ENCO_IDREF = :ID WHERE TICO_COD = :TIPOCO AND PRCO_PREF = :PREF AND ENCO_NUMERO = :numero AND ENCO_TIPOREF = 0;
        suspend;
        END
    END
FOR SELECT TRAN_ID, PREF_PRE, TRAN_NUMERO FROM trasferencias WHERE TRAN_FECHA >= :FECINI AND TRAN_FECHA <= :FECFIN INTO :ID, :PREF, :NUMERO
    DO
    BEGIN
    SELECT MAX(TICO_COD) FROM interfaz_inventario WHERE tido_cod = 13 AND PREF_PRE = :PREF INTO :TIPOCO;
    if (EXISTS(SELECT ENCO_CONSEC FROM comprobante_encabezado WHERE TICO_COD = :TIPOCO AND PRCO_PREF = :PREF AND ENCO_NUMERO = :numero AND ENCO_TIPOREF = 0)) then
        BEGIN
        UPDATE comprobante_encabezado SET ENCO_TIPOREF = 13, ENCO_IDREF = :ID WHERE TICO_COD = :TIPOCO AND PRCO_PREF = :PREF AND ENCO_NUMERO = :numero AND ENCO_TIPOREF = 0;
        suspend;
        END
    END
FOR SELECT FACT_ID, PREF_PRE, FACT_NUMERO FROM FACTURAS WHERE FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN INTO :ID, :PREF, :NUMERO
    DO
    BEGIN
    SELECT MAX(TICO_COD) FROM interfaz_ventas WHERE tido_cod = 31 AND PREF_PRE = :PREF INTO :TIPOCO;
    if (EXISTS(SELECT ENCO_CONSEC FROM comprobante_encabezado WHERE TICO_COD = :TIPOCO AND PRCO_PREF = :PREF AND ENCO_NUMERO = :numero AND ENCO_TIPOREF = 0)) then
        BEGIN
        UPDATE comprobante_encabezado SET ENCO_TIPOREF = 31, ENCO_IDREF = :ID WHERE TICO_COD = :TIPOCO AND PRCO_PREF = :PREF AND ENCO_NUMERO = :numero AND ENCO_TIPOREF = 0;
        suspend;
        END
    END
FOR SELECT DEVT_ID, PREF_PRE, DEVT_NUMERO FROM devoluciones_ventas WHERE DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN INTO :ID, :PREF, :NUMERO
    DO
    BEGIN
    SELECT MAX(TICO_COD) FROM interfaz_ventas WHERE tido_cod = 33 AND PREF_PRE = :PREF INTO :TIPOCO;
    if (EXISTS(SELECT ENCO_CONSEC FROM comprobante_encabezado WHERE TICO_COD = :TIPOCO AND PRCO_PREF = :PREF AND ENCO_NUMERO = :numero AND ENCO_TIPOREF = 0)) then
        BEGIN
        UPDATE comprobante_encabezado SET ENCO_TIPOREF = 33, ENCO_IDREF = :ID WHERE TICO_COD = :TIPOCO AND PRCO_PREF = :PREF AND ENCO_NUMERO = :numero AND ENCO_TIPOREF = 0;
        suspend;
        END
    END
FOR SELECT RECA_ID, PREF_PRE, RECA_NUMERO FROM recibos_caja WHERE RECA_FECHA >= :FECINI AND RECA_FECHA <= :FECFIN INTO :ID, :PREF, :NUMERO
    DO
    BEGIN
    SELECT MAX(TICO_COD) FROM INTERFAZ_CAJA WHERE tido_cod = 61 AND PREF_PRE = :PREF INTO :TIPOCO;
    if (EXISTS(SELECT ENCO_CONSEC FROM comprobante_encabezado WHERE TICO_COD = :TIPOCO AND PRCO_PREF = :PREF AND ENCO_NUMERO = :numero AND ENCO_TIPOREF = 0)) then
        BEGIN
        UPDATE comprobante_encabezado SET ENCO_TIPOREF = 61, ENCO_IDREF = :ID WHERE TICO_COD = :TIPOCO AND PRCO_PREF = :PREF AND ENCO_NUMERO = :numero AND ENCO_TIPOREF = 0;
        suspend;
        END
    END
FOR SELECT EGRE_ID, PREF_PRE, EGRE_NUMERO FROM EGRESOS WHERE EGRE_FECHA >= :FECINI AND EGRE_FECHA <= :FECFIN INTO :ID, :PREF, :NUMERO
    DO
    BEGIN
    SELECT MAX(TICO_COD) FROM INTERFAZ_CAJA WHERE tido_cod = 62 AND PREF_PRE = :PREF INTO :TIPOCO;
    if (EXISTS(SELECT ENCO_CONSEC FROM comprobante_encabezado WHERE TICO_COD = :TIPOCO AND PRCO_PREF = :PREF AND ENCO_NUMERO = :numero AND ENCO_TIPOREF = 0)) then
        BEGIN
        UPDATE comprobante_encabezado SET ENCO_TIPOREF = 62, ENCO_IDREF = :ID WHERE TICO_COD = :TIPOCO AND PRCO_PREF = :PREF AND ENCO_NUMERO = :numero AND ENCO_TIPOREF = 0;
        suspend;
        END
    END
FOR SELECT CONS_ID, CUBA_COD, PRBA_PREF, CONS_NUMERO FROM CONSIGNA WHERE CONS_FECHA >= :FECINI AND CONS_FECHA <= :FECFIN INTO :ID, :CTA, :PREF, :NUMERO
    DO
    BEGIN
    SELECT MAX(TICO_COD) FROM interfaz_bancos WHERE tido_cod = 71 AND CUBA_COD = :CTA AND PREF_PRE = :PREF INTO :TIPOCO;
    if (EXISTS(SELECT ENCO_CONSEC FROM comprobante_encabezado WHERE TICO_COD = :TIPOCO AND PRCO_PREF = :PREF AND ENCO_NUMERO = :numero AND ENCO_TIPOREF = 0)) then
        BEGIN
        UPDATE comprobante_encabezado SET ENCO_TIPOREF = 71, ENCO_IDREF = :ID WHERE TICO_COD = :TIPOCO AND PRCO_PREF = :PREF AND ENCO_NUMERO = :numero AND ENCO_TIPOREF = 0;
        suspend;
        END
    END
end
^

SET TERM ; ^

/* 20090426 */
/* EL EGRESO QUEDABA SIN MULTIPLICAR POR TRM Y SI CAKA = 'K' EN INTERFAZ SE QUEDABA EN DOLARES */
SET TERM ^ ;

CREATE OR ALTER TRIGGER EGRESOS_BI FOR EGRESOS
ACTIVE BEFORE INSERT POSITION 0
AS
declare variable NUMERO VARCHAR(6);
declare variable AUTOM CHAR(1);
declare variable EXISTE CHAR(1);
declare variable PREGTASA CHAR(2);
BEGIN
if ((new.egre_trm is null) or (new.egre_trm = 0)) then
    new.egre_trm = 1;
EXECUTE PROCEDURE LEE_CONFIGURACION('GENERAL', 'GENERAL', 'PREGUNTAR TASA DE CAMBIO EN DOCUMENTOS DE CUENTAS POR PAGAR') returning_values (:pregtasa);
if (PREGTASA = 'SI') then
    BEGIN
    NEW.egre_monto = NEW.egre_monto * NEW.egre_trm;
    NEW.egre_rtftemonto = NEW.egre_rtftemonto * NEW.egre_trm;
    NEW.egre_rtivamonto = NEW.egre_rtivamonto * NEW.egre_trm;
    NEW.egre_rticamonto = NEW.egre_rticamonto * NEW.egre_trm;
    NEW.egre_dtof = NEW.egre_dtof * NEW.egre_trm;
    end
if (NEW.numok = 'N') then
  BEGIN
  /* Actualice el contador del prefijo */
  SELECT PREF_ACTUAL, PREF_AUTO FROM PREFIJOS WHERE TIDO_COD = 62 AND PREF_PRE = NEW.PREF_PRE INTO :NUMERO, :AUTOM;
  /* ACTUALICE EL NUMERO EN COMPROBANTE_ENCABEZADO  */
  if (AUTOM = 'S') then
    BEGIN
    NEW.EGRE_NUMERO = NUMERO;
    NUMERO = CAST((CAST(NUMERO AS INTEGER) + 1) AS CHAR(6));
    UPDATE PREFIJOS
      SET PREF_ACTUAL = :NUMERO
    WHERE TIDO_COD = 62 AND PREF_PRE = NEW.PREF_PRE;
    END
  ELSE
    BEGIN
    if (CAST(NUMERO AS INTEGER) = CAST(NEW.EGRE_NUMERO AS INTEGER)) then
        UPDATE PREFIJOS
          SET PREF_ACTUAL = CAST((CAST(PREF_ACTUAL AS INTEGER) + 1) AS CHAR(6))
        WHERE TIDO_COD = 62 AND PREF_PRE = NEW.PREF_PRE;
    END
  EXECUTE PROCEDURE COMPLETA_CEROS (NEW.EGRE_numero) returning_values (NEW.EGRE_numero);
  NEW.numok = 'S';
  END
/* Verifique que el numero no existe previamente */
EXISTE = 'N';
SELECT 'S' FROM EGRESOS WHERE PREF_PRE = NEW.PREF_PRE AND EGRE_NUMERO = NEW.EGRE_NUMERO INTO :EXISTE;
if (EXISTE = 'S') then
    EXCEPTION DOCUMENTO_REGISTRADO 'Ya existe un egreso con el número ' || new.pref_pre || new.egre_numero;
if (new.cleg_id is null) then
    new.cleg_id = 0;
END
^

SET TERM ; ^



update revision set revi_FECHA = '2009/04/24';
COMMIT WORK;

/* 20090427: EL EGRESO QUEDABA SIN MULTIPLICAR POR TRM Y SI CAJA = 'K' EN INTERFAZ SE QUEDABA EN DOLARES */
SET TERM ^ ;

CREATE OR ALTER TRIGGER EGRESOS_BI FOR EGRESOS
ACTIVE BEFORE INSERT POSITION 0
AS
declare variable NUMERO VARCHAR(6);
declare variable AUTOM CHAR(1);
declare variable EXISTE CHAR(1);
declare variable PREGTASA CHAR(2);
BEGIN
if ((new.egre_trm is null) or (new.egre_trm = 0)) then
    new.egre_trm = 1;
EXECUTE PROCEDURE LEE_CONFIGURACION('GENERAL', 'GENERAL', 'PREGUNTAR TASA DE CAMBIO EN DOCUMENTOS DE CUENTAS POR PAGAR') returning_values (:pregtasa);
if (PREGTASA = 'SI') then
    BEGIN
    NEW.egre_monto = NEW.egre_monto * NEW.egre_trm;
    NEW.egre_rtftemonto = NEW.egre_rtftemonto * NEW.egre_trm;
    NEW.egre_rtivamonto = NEW.egre_rtivamonto * NEW.egre_trm;
    NEW.egre_rticamonto = NEW.egre_rticamonto * NEW.egre_trm;
    NEW.egre_dtof = NEW.egre_dtof * NEW.egre_trm;
    end
if (NEW.numok = 'N') then
  BEGIN
  /* Actualice el contador del prefijo */
  SELECT PREF_ACTUAL, PREF_AUTO FROM PREFIJOS WHERE TIDO_COD = 62 AND PREF_PRE = NEW.PREF_PRE INTO :NUMERO, :AUTOM;
  /* ACTUALICE EL NUMERO EN COMPROBANTE_ENCABEZADO  */
  if (AUTOM = 'S') then
    BEGIN
    NEW.EGRE_NUMERO = NUMERO;
    NUMERO = CAST((CAST(NUMERO AS INTEGER) + 1) AS CHAR(6));
    UPDATE PREFIJOS
      SET PREF_ACTUAL = :NUMERO
    WHERE TIDO_COD = 62 AND PREF_PRE = NEW.PREF_PRE;
    END
  ELSE
    BEGIN
    if (CAST(NUMERO AS INTEGER) = CAST(NEW.EGRE_NUMERO AS INTEGER)) then
        UPDATE PREFIJOS
          SET PREF_ACTUAL = CAST((CAST(PREF_ACTUAL AS INTEGER) + 1) AS CHAR(6))
        WHERE TIDO_COD = 62 AND PREF_PRE = NEW.PREF_PRE;
    END
  EXECUTE PROCEDURE COMPLETA_CEROS (NEW.EGRE_numero) returning_values (NEW.EGRE_numero);
  NEW.numok = 'S';
  END
/* Verifique que el numero no existe previamente */
EXISTE = 'N';
SELECT 'S' FROM EGRESOS WHERE PREF_PRE = NEW.PREF_PRE AND EGRE_NUMERO = NEW.EGRE_NUMERO INTO :EXISTE;
if (EXISTE = 'S') then
    EXCEPTION DOCUMENTO_REGISTRADO 'Ya existe un egreso con el número ' || new.pref_pre || new.egre_numero;
if (new.cleg_id is null) then
    new.cleg_id = 0;
END
^

SET TERM ; ^



/* 20090427B INTERFAZ DE APLICACIONES NO TOMABA SI NO LOS VALORES POSITIVOS */

SET TERM ^ ;

CREATE OR ALTER PROCEDURE CONTABIL_APLICACL(
    IDDOC INTEGER,
    IDINTER INTEGER)
RETURNS (
    ERROR INTEGER,
    VER CHAR(1),
    IDC INTEGER)
AS
declare variable PREF VARCHAR(4);
declare variable NUM VARCHAR(6);
declare variable NUMERO VARCHAR(10);
declare variable NUMDOC VARCHAR(10);
declare variable FECAUX DATE;
declare variable FECHA CHAR(8);
declare variable CONC CHAR(120);
declare variable VENCE CHAR(8);
declare variable VRSUBT NUMERIC(18, 2);
declare variable TIPOCOMP VARCHAR(3);
declare variable PREFCONT VARCHAR(4);
declare variable BASE CHAR(1);
declare variable CTABASE VARCHAR(20);
declare variable CLIE CHAR(1);
declare variable CTACLIE VARCHAR(20);
declare variable EXISTE CHAR(1);
declare variable CUENTA VARCHAR(20);
declare variable TIPOCUEN CHAR(1);
declare variable NIT VARCHAR(20);
declare variable PROY VARCHAR(4);
declare variable CENTRO VARCHAR(4);
declare variable NROI INTEGER;
declare variable TCTACLIEN VARCHAR(20);
declare variable TCTABASE VARCHAR(20);
declare variable ANULADO CHAR(1);
declare variable TIPODOC INTEGER;
BEGIN
  /* BUSQUE LA INTERFACE */
  EXISTE = 'N';
  SELECT 'S', TICO_COD, PRCO_PRE, INCA_BASE, INCA_CLIE, INCA_CTABASE, INCA_CTACLIE, INCA_CONFIRMAR
    FROM INTERFAZ_CARTERA
    WHERE INCA_ID = :IDINTER
    INTO :EXISTE, :TIPOCOMP, :PREFCONT, :BASE, :CLIE, :CTABASE, :CTACLIE, :VER;
  if (EXISTE = 'S') then
    BEGIN
    /* BORRE CUALQUEIR CONTABILIZACION PREVIA */
    DELETE FROM CONTABILIZACION WHERE CNTB_TIPOREF = 43 AND CNTB_IDREF = :IDDOC;
    /* TRAIGA EL ENCABEZADO DE LA NOTA */
    FOR SELECT PREF_PRE, APCL_NUMERO, APCL_FECHA, N.TERC_NIT, APCL_CONCEPTO, TERC_CTAVENTA,
        TERC_CTACLIENTE, APCL_ANULADO, ACDE_APLICADO+ACDE_RTFTE+ACDE_RTIVA+ACDE_RTICA, ACDE_PREFIJO || ACDE_NUMERO, ACDE_TIPODOC
        FROM aplicacion_cliente N, aplicacion_cliente_detalle D, TERCEROS T
        WHERE N.APCL_ID = :IDDOC AND N.TERC_NIT = T.TERC_NIT AND N.apcl_id = D.apcl_id
        INTO :PREF, :NUM, :FECAUX, :NIT, :CONC, :TCTABASE, :TCTACLIEN, :ANULADO, :vrsubt, :numdoc, :tipodoc
        DO
        BEGIN
        if (ANULADO = 'N') then
          BEGIN
          SELECT PREF_CENTRO, PREF_PROY FROM PREFIJOS P, aplicacion_cliente N
            WHERE P.PREF_PRE = N.PREF_PRE AND P.TIDO_COD = 43 AND APCL_ID = :IDDOC INTO :CENTRO, :PROY;
          NUMERO = PREF || NUM;
          EXECUTE PROCEDURE FECHA_A_CONTA(:FECAUX) returning_values (:FECHA);
          VENCE = FECHA;
          /* REGISTRE EL ENCABEZADO CONTABLE */
          IDC = GEN_ID(ID_CONTABILIZA, 1);
          INSERT INTO CONTABILIZACION (CNTB_ID, CNTB_TIPOCOMP, CNTB_PREFCNT, CNTB_NUMERO, CNTB_FECHA, CNTB_CONCEPTO, CNTB_REF, CNTB_TIPOREF, CNTB_IDREF, CNTB_PREFREF, CNTB_NUMREF, CNTB_PROCESADO)
            VALUES (:IDC, :TIPOCOMP, :PREFCONT, :NUM, :FECHA, :CONC, '', 43, :IDDOC, :PREF, :NUM, 'N');
          NROI = 0;
          ERROR = 0;
          if (VRSUBT <> 0) then
            BEGIN
            IF ((BASE = 'C') OR (BASE = 'K')) THEN
                BEGIN
                IF (BASE = 'C') THEN
                    CTABASE = TCTABASE;
                CUENTA = NULL;
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :CTABASE INTO :CUENTA, :TIPOCUEN;
                if (CUENTA IS NULL) then
                    begin
                    EXECUTE PROCEDURE ERROR (43, :IDDOC, :CTABASE, 2);
                    CUENTA = CTABASE;
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (43, :IDDOC, :CUENTA, 3);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    if (VRSUBT < 0) then
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', ABS(:VRSUBT), 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, :NUMDOC, :VENCE, NULL, :tipodoc, 43);
                    else
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRSUBT, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, :NUMDOC, :VENCE, NULL, :tipodoc, 43);
                    NROI = NROI + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    if (VRSUBT < 0) then
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', ABS(:VRSUBT), 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    else
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, ABS(:VRSUBT), 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    END
                END
            END /* SUBT < 0 */
          if ((VRSUBT <> 0) and ((CLIE = 'C') or (CLIE = 'K'))) then
            BEGIN
            if (CLIE = 'C') then
                CTACLIE = TCTACLIEN;
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTACLIE INTO :CUENTA, :TIPOCUEN;
            IF (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERROR (43, :IDDOC, :CTACLIE, 2);
                CUENTA = CTACLIE;
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERROR (43, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                if (VRSUBT < 0) then
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, abs(:vrsubt), 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, :NUMDOC, :VENCE, NULL, :tipodoc, 42);
                else
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :vrsubt, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, :NUMDOC, :VENCE, NULL, :tipodoc, 42);
                NROI = NROI + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                if (VRSUBT < 0) then
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, abs(:vrsubt), 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                else
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :vrsubt, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                END
            END /* CARTERA */
        END /* NO ANULADO */
      END /* FOR */
    if (ERROR > 0) then
        VER = 'S';
    SUSPEND;
    END
ELSE
    BEGIN
    EXECUTE PROCEDURE ERROR (43, :IDDOC, :PREF, 1);
    ERROR = ERROR + 1;
    VER = 'S';
    SUSPEND;
    END
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE APLICACIONCL_SIN_CONTABILIDAD(
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    ID INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    ESTADO VARCHAR(20),
    IDI INTEGER,
    IDC INTEGER,
    ERROR INTEGER)
AS
DECLARE VARIABLE VER CHAR(2);
declare variable FECICNT VARCHAR(10);
declare variable FECFCNT VARCHAR(10);
declare variable idref INTEGER;
BEGIN /*$$IBE$$ 
EXECUTE PROCEDURE fecha_a_conta(FECINI) returning_values (FECICNT);
EXECUTE PROCEDURE fecha_a_conta(FECFIN) returning_values (FECFCNT);
FOR SELECT APCL_ID, PREF_PRE, APCL_NUMERO FROM aplicacion_cliente WHERE APCL_ANULADO = 'N' AND
    APCL_FECHA >= :FECINI AND APCL_FECHA <= :FECFIN ORDER BY APCL_ID
    INTO :ID, :PREF, :NUMERO
DO
  BEGIN
  idref = null;
  SELECT ENCO_IDREF FROM COMPROBANTE_ENCABEZADO WHERE ENCO_TIPOREF = 43 AND ENCO_FECHA >= :FECICNT AND ENCO_FECHA <= :FECFCNT and ENCO_IDREF = :id into :idref;
  if (idref IS NULL) then
  begin
   ESTADO = 'PROCESANDO';
   SUSPEND;
   SELECT MAX(INCA_ID) FROM INTERFAZ_CARTERA WHERE PREF_PRE = :PREF AND TIDO_COD = 43 INTO :IDI;
   EXECUTE PROCEDURE contabil_aplicacl (:ID, :IDI) RETURNING_VALUES (:ERROR, :VER, :IDC);
   if (ERROR = 0) then
    BEGIN
    EXECUTE PROCEDURE CONTABILIZA_PENDIENTE (:IDC);
    ESTADO = 'OK';
    END
   ELSE
    ESTADO = 'ERROR';
   suspend;
  end
  END
 $$IBE$$*/ SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE APLICACIONCL_SIN_CONTABILIDAD(
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    ID INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    ESTADO VARCHAR(20),
    IDI INTEGER,
    IDC INTEGER,
    ERROR INTEGER)
AS
DECLARE VARIABLE VER CHAR(2);
declare variable FECICNT VARCHAR(10);
declare variable FECFCNT VARCHAR(10);
declare variable idref INTEGER;
BEGIN
EXECUTE PROCEDURE fecha_a_conta(FECINI) returning_values (FECICNT);
EXECUTE PROCEDURE fecha_a_conta(FECFIN) returning_values (FECFCNT);
FOR SELECT APCL_ID, PREF_PRE, APCL_NUMERO FROM aplicacion_cliente WHERE APCL_ANULADO = 'N' AND
    APCL_FECHA >= :FECINI AND APCL_FECHA <= :FECFIN ORDER BY APCL_ID
    INTO :ID, :PREF, :NUMERO
DO
  BEGIN
  idref = null;
  SELECT ENCO_IDREF FROM COMPROBANTE_ENCABEZADO WHERE ENCO_TIPOREF = 43 AND ENCO_FECHA >= :FECICNT AND ENCO_FECHA <= :FECFCNT and ENCO_IDREF = :id into :idref;
  if (idref IS NULL) then
  begin
   ESTADO = 'PROCESANDO';
   SUSPEND;
   SELECT MAX(INCA_ID) FROM INTERFAZ_CARTERA WHERE PREF_PRE = :PREF AND TIDO_COD = 43 INTO :IDI;
   EXECUTE PROCEDURE contabil_aplicacl (:ID, :IDI) RETURNING_VALUES (:ERROR, :VER, :IDC);
   if (ERROR = 0) then
    BEGIN
    EXECUTE PROCEDURE CONTABILIZA_PENDIENTE (:IDC);
    ESTADO = 'OK';
    END
   ELSE
    ESTADO = 'ERROR';
   suspend;
  end
  END
END

^

SET TERM ; ^



/* 20090428 SUCURSAL DEL CLIENTE EN REPORTES POR CLIENTE Y ZONA */
SET TERM ^ ;

CREATE OR ALTER PROCEDURE REP_ARTICULOS_VENDEDOR(
    TIPO INTEGER,
    DETALLE CHAR(1),
    DESDE VARCHAR(20),
    HASTA VARCHAR(20),
    FECINI DATE,
    FECFIN DATE,
    ARTINI VARCHAR(15),
    ARTFIN VARCHAR(15),
    GRPINI VARCHAR(3),
    GRPFIN VARCHAR(3),
    ORDEN CHAR(1),
    AGRUPA CHAR(1),
    ZONA CHAR(1),
    CEROS CHAR(1),
    SUBEMPRESA INTEGER,
    ZONAINI CHAR(2),
    ZONAFIN CHAR(2))
RETURNS (
    CODVEND VARCHAR(20),
    NOMVEND VARCHAR(60),
    NOMTIPO VARCHAR(50),
    ARTICULO VARCHAR(15),
    DESCRIPCION VARCHAR(60),
    CODGRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    CODSUBG VARCHAR(3),
    NOMSUBG VARCHAR(30),
    CODMARC VARCHAR(3),
    NOMMARC VARCHAR(30),
    UNIDAD VARCHAR(8),
    CANTIDAD NUMERIC(18,4),
    BASE NUMERIC(18,2),
    IVA NUMERIC(18,2),
    CONSUMO NUMERIC(18,2),
    TOTAL NUMERIC(18,2),
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    DTO NUMERIC(9,2),
    NIT VARCHAR(20),
    NOMCLIENTE VARCHAR(60),
    SUCURSAL VARCHAR(10),
    CODZONA VARCHAR(2),
    NOMZONA VARCHAR(60))
AS
declare variable codini varchar(15);
declare variable codfin varchar(15);
declare variable desini varchar(15);
declare variable desfin varchar(15);
declare variable marini varchar(3);
declare variable marfin varchar(3);
BEGIN
if (ORDEN = 'C') then
    BEGIN
    CODINI = ARTINI;
    CODFIN = ARTFIN;
    DESINI = '';
    DESFIN = 'zz';
    END
ELSE
    BEGIN
    DESINI = ARTINI;
    DESFIN = ARTFIN;
    CODINI = '';
    CODFIN = 'zz';
    END
if (AGRUPA = 'G') then
    BEGIN
    MARINI = '';
    MARFIN = 'zz';
    END
ELSE
    if (AGRUPA = 'M') then
        BEGIN
        MARINI = GRPINI;
        MARFIN = GRPFIN;
        GRPINI = '';
        GRPFIN = 'zz';
        END
    ELSE
        BEGIN
        MARINI = '';
        MARFIN = 'zz';
        END
if (DETALLE = 'N') then
    BEGIN
    if (BIN_AND(TIPO, 1) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 31 INTO :NOMTIPO;
        FOR SELECT MAX(D.ARTI_COD), MAX(VEND_COD), SUM(FADE_CANT * FADE_FACTOR), SUM((FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO)*FACT_FACTOR), SUM(FADE_IVAMONTO*FACT_FACTOR), SUM(FADE_CONSUMO), SUM(FADE_TOTAL*FACT_FACTOR),
            MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD)
            FROM FACTURAS_DETALLE D, FACTURAS F, PREFIJOS P, ARTICULO A
            WHERE F.FACT_ID = D.FACT_ID AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND D.ARTI_COD = A.arti_cod AND
            VEND_COD >= :DESDE AND VEND_COD <= :HASTA AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            FACT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) and substring(a.arti_cod from 1 FOR 2) <> '.t'
            GROUP BY VEND_COD, D.ARTI_COD
            INTO :ARTICULO, :CODVEND, :CANTIDAD, :BASE, :IVA, :CONSUMO, :TOTAL,
            :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
            DO
            BEGIN
            select VEND_NOMBRE from VENDEDORES where VEND_COD = :CODVEND INTO :NOMVEND;
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            if (CEROS = 'S') then
                SUSPEND;
            ELSE
                if ((BASE <> 0) AND (CANTIDAD <> 0)) then
                    SUSPEND;
            END /* FOR */
        END
    if (BIN_AND(TIPO, 2) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 32 INTO :NOMTIPO;
        FOR SELECT MAX(D.ARTI_COD), MAX(VEND_COD), SUM(RVDE_CANT * RVDE_FACTOR), SUM(RVDE_TOTAL-RVDE_IVAMONTO-RVDE_CONSUMO), SUM(RVDE_IVAMONTO), SUM(RVDE_CONSUMO), SUM(RVDE_TOTAL),
            MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD)
            FROM REMISIONES_VENTA_DETALLE D, REMISIONES_VENTA R, PREFIJOS P, ARTICULO A
            WHERE R.REVT_ID = D.REVT_ID AND P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = 32 AND D.ARTI_COD = A.arti_cod AND
            VEND_COD >= :DESDE AND VEND_COD <= :HASTA AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            REVT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY R.vend_cod, D.ARTI_COD
            INTO :ARTICULO, :CODVEND, :CANTIDAD, :BASE, :IVA, :CONSUMO, :TOTAL,
            :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
            DO
            BEGIN
            select VEND_NOMBRE from VENDEDORES where VEND_COD = :CODVEND INTO :NOMVEND;
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            if (CEROS = 'S') then
                SUSPEND;
            ELSE
                if ((BASE <> 0) AND (CANTIDAD <> 0)) then
                    SUSPEND;
            END /* FOR */
        END
    if (BIN_AND(TIPO, 4) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 33 INTO :NOMTIPO;
        FOR SELECT MAX(D.ARTI_COD), MAX(VEND_COD), SUM(DVDE_CANT * DVDE_FACTOR), SUM((DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO)*DEVT_FACTOR), SUM(DVDE_IVAMONTO*DEVT_FACTOR), SUM(DVDE_CONSUMO), SUM(DVDE_TOTAL*DEVT_FACTOR),
            MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD)
            FROM devoluciones_ventas_detalle D, DEVOLUCIONES_VENTAS V, PREFIJOS P, ARTICULO A
            WHERE V.DEVT_ID = D.DEVT_ID AND P.PREF_PRE = V.PREF_PRE AND P.TIDO_COD = 33 AND D.ARTI_COD = A.arti_cod AND
            VEND_COD >= :DESDE AND VEND_COD <= :HASTA AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            DEVT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY V.vend_cod, D.ARTI_COD
            INTO :ARTICULO, :CODVEND, :CANTIDAD, :BASE, :IVA, :CONSUMO, :TOTAL,
            :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
            DO
            BEGIN
            select VEND_NOMBRE from VENDEDORES where VEND_COD = :CODVEND INTO :NOMVEND;
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            if (CEROS = 'S') then
                SUSPEND;
            ELSE
                if ((BASE <> 0) AND (CANTIDAD <> 0)) then
                    BEGIN
                    BASE = BASE * -1;
                    IVA = IVA * -1;
                    CANTIDAD = CANTIDAD * -1;
                    TOTAL = TOTAL * -1;
                    SUSPEND;
                    END
            END /* FOR */
        END
    if (BIN_AND(TIPO, 8) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 34 INTO :NOMTIPO;
        FOR SELECT MAX(D.ARTI_COD), MAX(VEND_COD), SUM(PEDE_CANT * PEDE_FACTOR), SUM((PEDE_TOTAL-PEDE_IVAMONTO-PEDE_CONSUMO)*PEDI_FACTOR), SUM(PEDE_IVAMONTO*PEDI_FACTOR), SUM(PEDE_CONSUMO), SUM(PEDE_TOTAL*PEDI_FACTOR),
            MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD)
            FROM PEDIDOS_DETALLE D, PEDIDOS P, PREFIJOS R, ARTICULO A
            WHERE P.PEDI_ID = D.PEDI_ID AND P.PREF_PRE = R.PREF_PRE AND R.TIDO_COD = 34 AND D.ARTI_COD = A.arti_cod AND
            VEND_COD >= :DESDE AND VEND_COD <= :HASTA AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            PEDI_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY P.vend_cod, D.ARTI_COD
            INTO :ARTICULO, :CODVEND, :CANTIDAD, :BASE, :IVA, :CONSUMO, :TOTAL,
            :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
            DO
            BEGIN
            select VEND_NOMBRE from VENDEDORES where VEND_COD = :CODVEND INTO :NOMVEND;
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            if (CEROS = 'S') then
                SUSPEND;
            ELSE
                if ((BASE <> 0) AND (CANTIDAD <> 0)) then
                    SUSPEND;
            END /* FOR */
        END
    if (BIN_AND(TIPO, 16) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 35 INTO :NOMTIPO;
        FOR SELECT MAX(D.ARTI_COD), MAX(VEND_COD), SUM(CTDE_CANT * CTDE_FACTOR), SUM((CTDE_TOTAL-CTDE_IVAMONTO-CTDE_CONSUMO)*COTI_FACTOR), SUM(CTDE_IVAMONTO*COTI_FACTOR), SUM(CTDE_CONSUMO), SUM(CTDE_TOTAL*COTI_FACTOR),
            MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD)
            FROM COTIZACIONES_DETALLE D, COTIZACIONES C, PREFIJOS P, ARTICULO A
            WHERE C.COTI_ID = D.COTI_ID AND P.PREF_PRE = C.PREF_PRE AND P.TIDO_COD = 35 AND D.ARTI_COD = A.arti_cod AND
            VEND_COD >= :DESDE AND VEND_COD <= :HASTA AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND COTI_FECHA >= :FECINI AND COTI_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            COTI_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY C.vend_cod, D.ARTI_COD
            INTO :ARTICULO, :CODVEND, :CANTIDAD, :BASE, :IVA, :CONSUMO, :TOTAL,
            :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
            DO
            BEGIN
            select VEND_NOMBRE from VENDEDORES where VEND_COD = :CODVEND INTO :NOMVEND;
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            if (CEROS = 'S') then
                SUSPEND;
            ELSE
                if ((BASE <> 0) AND (CANTIDAD <> 0)) then
                    SUSPEND;
            END /* FOR */
        END
    END
ELSE
  if (DETALLE = 'S') then
    BEGIN
    if (BIN_AND(TIPO, 1) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 31 INTO :NOMTIPO;
        FOR SELECT F.PREF_PRE, FACT_NUMERO, FACT_FECHA, VEND_COD, D.ARTI_COD, FADE_CANT * FADE_FACTOR, (FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO)*FACT_FACTOR, FADE_IVAMONTO*FACT_FACTOR, FADE_CONSUMO, FADE_DTOPORC, FADE_TOTAL*FACT_FACTOR,
            ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD , F.TERC_NIT, F.fact_nomcliente, F.fact_sucursal
            FROM FACTURAS F, FACTURAS_DETALLE D, PREFIJOS P, ARTICULO A
            WHERE F.FACT_ID = D.FACT_ID AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND D.ARTI_COD = A.arti_cod AND
                VEND_COD >= :DESDE AND VEND_COD <= :HASTA AND
                A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
                A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND FACT_FECHA >= :FECINI AND
                (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
                FACT_FECHA <= :FECFIN AND FACT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) and substring(a.arti_cod from 1 FOR 2) <> '.t'
            ORDER BY VEND_COD, D.ARTI_COD, FACT_FECHA, F.FACT_ID, FADE_ITEM
            INTO :PREFIJO, :NUMERO, :FECHA, :CODVEND, :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO, :DTO, :TOTAL,
                :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :NIT, :nomcliente, :sucursal
            DO
            BEGIN
            select VEND_NOMBRE from VENDEDORES where VEND_COD = :CODVEND INTO :NOMVEND;
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            SUSPEND;
            END
        END
    if (BIN_AND(TIPO, 2) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 32 INTO :NOMTIPO;
        FOR SELECT R.PREF_PRE, REVT_NUMERO, REVT_FECHA, VEND_COD, D.ARTI_COD, RVDE_CANT * RVDE_FACTOR, (RVDE_TOTAL-RVDE_IVAMONTO-RVDE_CONSUMO), RVDE_IVAMONTO, RVDE_CONSUMO, RVDE_DTOPORC, RVDE_TOTAL,
            ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD, R.terc_nit, R.revt_nomterc, r.revt_sucursal
            FROM REMISIONES_VENTA R, REMISIONES_VENTA_DETALLE D, PREFIJOS P, ARTICULO A
            WHERE R.REVT_ID = D.REVT_ID AND P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = 32 AND D.ARTI_COD = A.arti_cod AND
                VEND_COD >= :DESDE AND VEND_COD <= :HASTA AND
                A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
                A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN AND
                (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
                REVT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            ORDER BY VEND_COD, D.ARTI_COD, REVT_FECHA, R.REVT_ID, RVDE_ITEM
            INTO :PREFIJO, :NUMERO, :FECHA, :CODVEND, :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO, :DTO, :TOTAL,
                :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :NIT, :nomcliente, :sucursal
            DO
            BEGIN
            select VEND_NOMBRE from VENDEDORES where VEND_COD = :CODVEND INTO :NOMVEND;
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            SUSPEND;
            END
        END
    if (BIN_AND(TIPO, 4) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 33 INTO :NOMTIPO;
        FOR SELECT V.PREF_PRE, DEVT_NUMERO, DEVT_FECHA, VEND_COD, D.ARTI_COD, DVDE_CANT * DVDE_FACTOR, (DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO)*DEVT_FACTOR, DVDE_IVAMONTO*DEVT_FACTOR, DVDE_CONSUMO, DVDE_DTOPORC, DVDE_TOTAL*DEVT_FACTOR,
            ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD, V.terc_nit, V.devt_nomterc, v.devt_sucursal
            FROM DEVOLUCIONES_VENTAS V, DEVOLUCIONES_VENTAS_DETALLE D, PREFIJOS P, ARTICULO A
            WHERE V.DEVT_ID = D.DEVT_ID AND P.PREF_PRE = V.PREF_PRE AND P.TIDO_COD = 33 AND D.ARTI_COD = A.arti_cod AND
                VEND_COD >= :DESDE AND VEND_COD <= :HASTA AND
                A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
                A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND
                (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
                DEVT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            ORDER BY VEND_COD, D.ARTI_COD, DEVT_FECHA, V.DEVT_ID, DVDE_ITEM
            INTO :PREFIJO, :NUMERO, :FECHA, :CODVEND, :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO, :DTO, :TOTAL,
                :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :NIT, :nomcliente, :sucursal
            DO
            BEGIN
            select VEND_NOMBRE from VENDEDORES where VEND_COD = :CODVEND INTO :NOMVEND;
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            SUSPEND;
            END
        END
    if (BIN_AND(TIPO, 8) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 34 INTO :NOMTIPO;
        FOR SELECT P.PREF_PRE, PEDI_NUMERO, PEDI_FECHA, VEND_COD, D.ARTI_COD, PEDE_CANT * PEDE_FACTOR, (PEDE_TOTAL-PEDE_IVAMONTO-PEDE_CONSUMO)*PEDI_FACTOR, PEDE_IVAMONTO*PEDI_FACTOR, PEDE_CONSUMO, PEDE_DTOPORC, PEDE_TOTAL*PEDI_FACTOR,
            ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD, P.terc_nit, P.pedi_nomterc, p.pedi_sucursal
            FROM PEDIDOS P, PEDIDOS_DETALLE D, PREFIJOS R, ARTICULO A
            WHERE P.PEDI_ID = D.PEDI_ID AND P.PREF_PRE = R.PREF_PRE AND R.TIDO_COD = 34 AND D.ARTI_COD = A.arti_cod AND
                VEND_COD >= :DESDE AND VEND_COD <= :HASTA AND
                A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
                A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND
                (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
                PEDI_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            ORDER BY VEND_COD, D.ARTI_COD, PEDI_FECHA, P.PEDI_ID, PEDE_ITEM
            INTO :PREFIJO, :NUMERO, :FECHA, :CODVEND, :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO, :DTO, :TOTAL,
                :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :NIT, :nomcliente, :sucursal
            DO
            BEGIN
            select VEND_NOMBRE from VENDEDORES where VEND_COD = :CODVEND INTO :NOMVEND;
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            SUSPEND;
            END
        END
    if (BIN_AND(TIPO, 16) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 35 INTO :NOMTIPO;
        FOR SELECT C.PREF_PRE, COTI_NUMERO, COTI_FECHA, VEND_COD, D.ARTI_COD, CTDE_CANT * CTDE_FACTOR, (CTDE_TOTAL-CTDE_IVAMONTO-CTDE_CONSUMO)*COTI_FACTOR, CTDE_IVAMONTO*COTI_FACTOR, CTDE_CONSUMO, CTDE_DTOPORC, CTDE_TOTAL*COTI_FACTOR,
            ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD, C.terc_nit, C.coti_nomterc, c.coti_sucursal
            FROM COTIZACIONES C, COTIZACIONES_DETALLE D, PREFIJOS P, ARTICULO A
            WHERE C.COTI_ID = D.COTI_ID AND P.PREF_PRE = C.PREF_PRE AND P.TIDO_COD = 35 AND D.ARTI_COD = A.arti_cod AND
                VEND_COD >= :DESDE AND VEND_COD <= :HASTA AND
                A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
                A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND COTI_FECHA >= :FECINI AND COTI_FECHA <= :FECFIN AND
                (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
                COTI_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            ORDER BY VEND_COD, D.ARTI_COD, COTI_FECHA, C.COTI_ID, CTDE_ITEM
            INTO :PREFIJO, :NUMERO, :FECHA, :CODVEND, :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO, :DTO, :TOTAL,
                :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :NIT, :nomcliente, :sucursal
            DO
            BEGIN
            select VEND_NOMBRE from VENDEDORES where VEND_COD = :CODVEND INTO :NOMVEND;
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            SUSPEND;
            END
        END
    END
  ELSE
if (DETALLE = 'C') then
    BEGIN
    if (BIN_AND(TIPO, 1) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 31 INTO :NOMTIPO;
        FOR SELECT MAX(D.ARTI_COD), MAX(VEND_COD), SUM(FADE_CANT * FADE_FACTOR), SUM((FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO)*FACT_FACTOR), SUM(FADE_IVAMONTO*FACT_FACTOR), SUM(FADE_CONSUMO), SUM(FADE_TOTAL*FACT_FACTOR),
            MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD), MAX(F.terc_nit), MAX(F.fact_nomcliente), MAX(F.fact_sucursal)
            FROM FACTURAS_DETALLE D, FACTURAS F, PREFIJOS P, ARTICULO A
            WHERE F.FACT_ID = D.FACT_ID AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND D.ARTI_COD = A.arti_cod AND
            VEND_COD >= :DESDE AND VEND_COD <= :HASTA AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            FACT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) and substring(a.arti_cod from 1 FOR 2) <> '.t'
            GROUP BY F.VEND_COD, F.TERC_NIT, F.fact_sucursal, D.ARTI_COD
            INTO :ARTICULO, :CODVEND, :CANTIDAD, :BASE, :IVA, :CONSUMO, :TOTAL,
            :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :nit, :nomcliente, :sucursal
            DO
            BEGIN
            select VEND_NOMBRE from VENDEDORES where VEND_COD = :CODVEND INTO :NOMVEND;
            SELECT C.ZONA_COD, ZONA_NOM FROM CLIENTES C, ZONAS Z WHERE C.zona_cod = Z.zona_cod AND C.terc_nit = :nit INTO :codzona, :nomzona;
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            if (CEROS = 'S') then
                SUSPEND;
            ELSE
                if ((BASE <> 0) AND (CANTIDAD <> 0)) then
                    SUSPEND;
            END /* FOR */
        END
    if (BIN_AND(TIPO, 2) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 32 INTO :NOMTIPO;
        FOR SELECT MAX(D.ARTI_COD), MAX(VEND_COD), SUM(RVDE_CANT * RVDE_FACTOR), SUM(RVDE_TOTAL-RVDE_IVAMONTO-RVDE_CONSUMO), SUM(RVDE_IVAMONTO), SUM(RVDE_CONSUMO), SUM(RVDE_TOTAL),
            MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD), MAX(R.terc_nit), MAX(R.revt_nomterc), MAX(R.revt_sucursal)
            FROM REMISIONES_VENTA_DETALLE D, REMISIONES_VENTA R, PREFIJOS P, ARTICULO A
            WHERE R.REVT_ID = D.REVT_ID AND P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = 32 AND D.ARTI_COD = A.arti_cod AND
            VEND_COD >= :DESDE AND VEND_COD <= :HASTA AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            REVT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY R.vend_cod, R.terc_nit, R.revt_sucursal, D.arti_cod
            INTO :ARTICULO, :CODVEND, :CANTIDAD, :BASE, :IVA, :CONSUMO, :TOTAL,
            :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :nit, :nomcliente, :sucursal
            DO
            BEGIN
            SELECT C.ZONA_COD, ZONA_NOM FROM CLIENTES C, ZONAS Z WHERE C.zona_cod = Z.zona_cod AND C.terc_nit = :nit INTO :codzona, :nomzona;
            select VEND_NOMBRE from VENDEDORES where VEND_COD = :CODVEND INTO :NOMVEND;
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            if (CEROS = 'S') then
                SUSPEND;
            ELSE
                if ((BASE <> 0) AND (CANTIDAD <> 0)) then
                    SUSPEND;
            END /* FOR */
        END
    if (BIN_AND(TIPO, 4) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 33 INTO :NOMTIPO;
        FOR SELECT MAX(D.ARTI_COD), MAX(VEND_COD), SUM(DVDE_CANT * DVDE_FACTOR), SUM((DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO)*DEVT_FACTOR), SUM(DVDE_IVAMONTO*DEVT_FACTOR), SUM(DVDE_CONSUMO), SUM(DVDE_TOTAL*DEVT_FACTOR),
            MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD), MAX(V.terc_nit), MAX(V.devt_nomterc), MAX(V.devt_sucursal)
            FROM devoluciones_ventas_detalle D, DEVOLUCIONES_VENTAS V, PREFIJOS P, ARTICULO A
            WHERE V.DEVT_ID = D.DEVT_ID AND P.PREF_PRE = V.PREF_PRE AND P.TIDO_COD = 33 AND D.ARTI_COD = A.arti_cod AND
            VEND_COD >= :DESDE AND VEND_COD <= :HASTA AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            DEVT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY V.vend_cod, V.terc_nit, V.devt_sucursal, D.arti_cod
            INTO :ARTICULO, :CODVEND, :CANTIDAD, :BASE, :IVA, :CONSUMO, :TOTAL,
            :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :nit, :nomcliente, :sucursal
            DO
            BEGIN
            SELECT C.ZONA_COD, ZONA_NOM FROM CLIENTES C, ZONAS Z WHERE C.zona_cod = Z.zona_cod AND C.terc_nit = :nit INTO :codzona, :nomzona;
            select VEND_NOMBRE from VENDEDORES where VEND_COD = :CODVEND INTO :NOMVEND;
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            if (CEROS = 'S') then
                SUSPEND;
            ELSE
                if ((BASE <> 0) AND (CANTIDAD <> 0)) then
                    SUSPEND;
            END /* FOR */
        END
    if (BIN_AND(TIPO, 8) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 34 INTO :NOMTIPO;
        FOR SELECT MAX(D.ARTI_COD), MAX(VEND_COD), SUM(PEDE_CANT * PEDE_FACTOR), SUM((PEDE_TOTAL-PEDE_IVAMONTO-PEDE_CONSUMO)*PEDI_FACTOR), SUM(PEDE_IVAMONTO*PEDI_FACTOR), SUM(PEDE_CONSUMO), SUM(PEDE_TOTAL*PEDI_FACTOR),
            MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD), MAX(P.terc_nit), MAX(P.pedi_nomterc), MAX(P.pedi_sucursal)
            FROM PEDIDOS_DETALLE D, PEDIDOS P, PREFIJOS R, ARTICULO A
            WHERE P.PEDI_ID = D.PEDI_ID AND P.PREF_PRE = R.PREF_PRE AND R.TIDO_COD = 34 AND D.ARTI_COD = A.arti_cod AND
            VEND_COD >= :DESDE AND VEND_COD <= :HASTA AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            PEDI_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY P.vend_cod, P.terc_nit, P.pedi_sucursal, D.arti_cod
            INTO :ARTICULO, :CODVEND, :CANTIDAD, :BASE, :IVA, :CONSUMO, :TOTAL,
            :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :nit, :nomcliente, :sucursal
            DO
            BEGIN
            SELECT C.ZONA_COD, ZONA_NOM FROM CLIENTES C, ZONAS Z WHERE C.zona_cod = Z.zona_cod AND C.terc_nit = :nit INTO :codzona, :nomzona;
            select VEND_NOMBRE from VENDEDORES where VEND_COD = :CODVEND INTO :NOMVEND;
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            if (CEROS = 'S') then
                SUSPEND;
            ELSE
                if ((BASE <> 0) AND (CANTIDAD <> 0)) then
                    SUSPEND;
            END /* FOR */
        END
    if (BIN_AND(TIPO, 16) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 35 INTO :NOMTIPO;
        FOR SELECT MAX(D.ARTI_COD), MAX(VEND_COD), SUM(CTDE_CANT * CTDE_FACTOR), SUM((CTDE_TOTAL-CTDE_IVAMONTO-CTDE_CONSUMO)*COTI_FACTOR), SUM(CTDE_IVAMONTO*COTI_FACTOR), SUM(CTDE_CONSUMO), SUM(CTDE_TOTAL*COTI_FACTOR),
            MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD), MAX(C.terc_nit), MAX(C.coti_nomterc), MAX(C.coti_sucursal)
            FROM COTIZACIONES_DETALLE D, COTIZACIONES C, PREFIJOS P, ARTICULO A
            WHERE C.COTI_ID = D.COTI_ID AND P.PREF_PRE = C.PREF_PRE AND P.TIDO_COD = 35 AND D.ARTI_COD = A.arti_cod AND
            VEND_COD >= :DESDE AND VEND_COD <= :HASTA AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND COTI_FECHA >= :FECINI AND COTI_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            COTI_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY C.vend_cod, C.terc_nit, C.coti_sucursal, D.arti_cod
            INTO :ARTICULO, :CODVEND, :CANTIDAD, :BASE, :IVA, :CONSUMO, :TOTAL,
            :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :nit, :nomcliente, :sucursal
            DO
            BEGIN
            SELECT C.ZONA_COD, ZONA_NOM FROM CLIENTES C, ZONAS Z WHERE C.zona_cod = Z.zona_cod AND C.terc_nit = :nit INTO :codzona, :nomzona;
            select VEND_NOMBRE from VENDEDORES where VEND_COD = :CODVEND INTO :NOMVEND;
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            if (CEROS = 'S') then
                SUSPEND;
            ELSE
                if ((BASE <> 0) AND (CANTIDAD <> 0)) then
                    SUSPEND;
            END /* FOR */
        END
    END
if (zona = 'S') then
    BEGIN
    if (BIN_AND(TIPO, 1) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 31 INTO :NOMTIPO;
        FOR SELECT MAX(D.ARTI_COD), MAX(F.VEND_COD), SUM(FADE_CANT * FADE_FACTOR), SUM((FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO)*FACT_FACTOR), SUM(FADE_IVAMONTO*FACT_FACTOR), SUM(FADE_CONSUMO), SUM(FADE_TOTAL*FACT_FACTOR),
            MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD), MAX(F.terc_nit), MAX(F.fact_nomcliente), MAX(F.fact_sucursal)
            FROM FACTURAS_DETALLE D, FACTURAS F, PREFIJOS P, ARTICULO A, clientes C, ZONAS Z
            WHERE F.FACT_ID = D.FACT_ID AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND D.ARTI_COD = A.arti_cod AND
            F.VEND_COD >= :DESDE AND F.VEND_COD <= :HASTA AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            FACT_ANULADO = 'N' AND ((P.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) AND F.terc_nit = C.terc_nit AND
            Z.zona_cod = C.zona_cod AND C.zona_cod >= :zonaini AND C.zona_cod <= :zonafin and substring(a.arti_cod from 1 FOR 2) <> '.t'
            GROUP BY F.VEND_COD, C.zona_cod ,D.ARTI_COD , C.terc_nit, F.fact_sucursal
            INTO :ARTICULO, :CODVEND, :CANTIDAD, :BASE, :IVA, :CONSUMO, :TOTAL,
            :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :nit, :nomcliente, :sucursal
            DO
            BEGIN
            select VEND_NOMBRE from VENDEDORES where VEND_COD = :CODVEND INTO :NOMVEND;
            SELECT C.ZONA_COD, ZONA_NOM FROM CLIENTES C, ZONAS Z WHERE C.zona_cod = Z.zona_cod AND C.terc_nit = :nit /*AND Z.zona_cod >= :zonaini AND Z.zona_cod >= :zonafin*/ INTO :codzona, :nomzona;
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            if (CEROS = 'S') then
                SUSPEND;
            ELSE
                if ((BASE <> 0) AND (CANTIDAD <> 0)) then
                    SUSPEND;
            END /* FOR */
        END
    if (BIN_AND(TIPO, 2) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 32 INTO :NOMTIPO;
        FOR SELECT MAX(D.ARTI_COD), MAX(R.VEND_COD), SUM(RVDE_CANT * RVDE_FACTOR), SUM(RVDE_TOTAL-RVDE_IVAMONTO-RVDE_CONSUMO), SUM(RVDE_IVAMONTO), SUM(RVDE_CONSUMO), SUM(RVDE_TOTAL),
            MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD), MAX(R.terc_nit), MAX(R.revt_nomterc), MAX(R.revt_sucursal)
            FROM REMISIONES_VENTA_DETALLE D, REMISIONES_VENTA R, PREFIJOS P, ARTICULO A, clientes C, ZONAS Z
            WHERE R.REVT_ID = D.REVT_ID AND P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = 32 AND D.ARTI_COD = A.arti_cod AND
            R.VEND_COD >= :DESDE AND R.VEND_COD <= :HASTA AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            REVT_ANULADO = 'N' AND ((P.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))AND R.terc_nit = C.terc_nit AND
            Z.zona_cod = C.zona_cod AND C.zona_cod >= :zonaini AND C.zona_cod <= :zonafin
            GROUP BY R.vend_cod, c.zona_cod, D.arti_cod , R.terc_nit
            INTO :ARTICULO, :CODVEND, :CANTIDAD, :BASE, :IVA, :CONSUMO, :TOTAL,
            :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :nit, :nomcliente, :sucursal
            DO
            BEGIN
            SELECT C.ZONA_COD, ZONA_NOM FROM CLIENTES C, ZONAS Z WHERE C.zona_cod = Z.zona_cod AND C.terc_nit = :nit INTO :codzona, :nomzona;
            select VEND_NOMBRE from VENDEDORES where VEND_COD = :CODVEND INTO :NOMVEND;
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            if (CEROS = 'S') then
                SUSPEND;
            ELSE
                if ((BASE <> 0) AND (CANTIDAD <> 0)) then
                    SUSPEND;
            END /* FOR */
        END
    if (BIN_AND(TIPO, 4) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 33 INTO :NOMTIPO;
        FOR SELECT MAX(D.ARTI_COD), MAX(V.VEND_COD), SUM(DVDE_CANT * DVDE_FACTOR), SUM((DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO)*DEVT_FACTOR), SUM(DVDE_IVAMONTO*DEVT_FACTOR), SUM(DVDE_CONSUMO), SUM(DVDE_TOTAL*DEVT_FACTOR),
            MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD), MAX(V.terc_nit), MAX(V.devt_nomterc), MAX(V.devt_sucursal)
            FROM devoluciones_ventas_detalle D, DEVOLUCIONES_VENTAS V, PREFIJOS P, ARTICULO A, clientes C, ZONAS Z
            WHERE V.DEVT_ID = D.DEVT_ID AND P.PREF_PRE = V.PREF_PRE AND P.TIDO_COD = 33 AND D.ARTI_COD = A.arti_cod AND
            V.VEND_COD >= :DESDE AND V.VEND_COD <= :HASTA AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            DEVT_ANULADO = 'N' AND ((P.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))AND V.terc_nit = C.terc_nit AND
            Z.zona_cod = C.zona_cod AND C.zona_cod >= :zonaini AND C.zona_cod <= :zonafin
            GROUP BY V.vend_cod, c.zona_cod, D.arti_cod , V.terc_nit
            INTO :ARTICULO, :CODVEND, :CANTIDAD, :BASE, :IVA, :CONSUMO, :TOTAL,
            :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :nit, :nomcliente, :sucursal
            DO
            BEGIN
            SELECT C.ZONA_COD, ZONA_NOM FROM CLIENTES C, ZONAS Z WHERE C.zona_cod = Z.zona_cod AND C.terc_nit = :nit INTO :codzona, :nomzona;
            select VEND_NOMBRE from VENDEDORES where VEND_COD = :CODVEND INTO :NOMVEND;
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            if (CEROS = 'S') then
                SUSPEND;
            ELSE
                if ((BASE <> 0) AND (CANTIDAD <> 0)) then
                    SUSPEND;
            END /* FOR */
        END
    if (BIN_AND(TIPO, 8) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 34 INTO :NOMTIPO;
        FOR SELECT MAX(D.ARTI_COD), MAX(P.VEND_COD), SUM(PEDE_CANT * PEDE_FACTOR), SUM((PEDE_TOTAL-PEDE_IVAMONTO-PEDE_CONSUMO)*PEDI_FACTOR), SUM(PEDE_IVAMONTO*PEDI_FACTOR), SUM(PEDE_CONSUMO), SUM(PEDE_TOTAL*PEDI_FACTOR),
            MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD), MAX(P.terc_nit), MAX(P.pedi_nomterc), MAX(P.pedi_sucursal)
            FROM PEDIDOS_DETALLE D, PEDIDOS P, PREFIJOS R, ARTICULO A, clientes C, ZONAS Z
            WHERE P.PEDI_ID = D.PEDI_ID AND P.PREF_PRE = R.PREF_PRE AND R.TIDO_COD = 34 AND D.ARTI_COD = A.arti_cod AND
            P.VEND_COD >= :DESDE AND P.VEND_COD <= :HASTA AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            PEDI_ANULADO = 'N' AND ((R.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))AND P.terc_nit = C.terc_nit AND
            Z.zona_cod = C.zona_cod AND C.zona_cod >= :zonaini AND C.zona_cod <= :zonafin
            GROUP BY P.vend_cod, c.zona_cod, D.arti_cod , P.terc_nit
            INTO :ARTICULO, :CODVEND, :CANTIDAD, :BASE, :IVA, :CONSUMO, :TOTAL,
            :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :nit, :nomcliente, :sucursal
            DO
            BEGIN
            SELECT C.ZONA_COD, ZONA_NOM FROM CLIENTES C, ZONAS Z WHERE C.zona_cod = Z.zona_cod AND C.terc_nit = :nit INTO :codzona, :nomzona;
            select VEND_NOMBRE from VENDEDORES where VEND_COD = :CODVEND INTO :NOMVEND;
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            if (CEROS = 'S') then
                SUSPEND;
            ELSE
                if ((BASE <> 0) AND (CANTIDAD <> 0)) then
                    SUSPEND;
            END /* FOR */
        END
    if (BIN_AND(TIPO, 16) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 35 INTO :NOMTIPO;
        FOR SELECT MAX(D.ARTI_COD), MAX(C.VEND_COD), SUM(CTDE_CANT * CTDE_FACTOR), SUM((CTDE_TOTAL-CTDE_IVAMONTO-CTDE_CONSUMO)*COTI_FACTOR), SUM(CTDE_IVAMONTO*COTI_FACTOR), SUM(CTDE_CONSUMO), SUM(CTDE_TOTAL*COTI_FACTOR),
            MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD), MAX(C.terc_nit), MAX(C.coti_nomterc), MAX(C.coti_sucursal)
            FROM COTIZACIONES_DETALLE D, COTIZACIONES C, PREFIJOS P, ARTICULO A, clientes T, ZONAS Z
            WHERE C.COTI_ID = D.COTI_ID AND P.PREF_PRE = C.PREF_PRE AND P.TIDO_COD = 35 AND D.ARTI_COD = A.arti_cod AND
            C.VEND_COD >= :DESDE AND C.VEND_COD <= :HASTA AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND COTI_FECHA >= :FECINI AND COTI_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            COTI_ANULADO = 'N' AND ((P.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))AND C.terc_nit = T.terc_nit AND
            Z.zona_cod = T.zona_cod AND T.zona_cod >= :zonaini AND T.zona_cod <= :zonafin
            GROUP BY C.vend_cod, t.zona_cod, D.arti_cod , C.terc_nit
            INTO :ARTICULO, :CODVEND, :CANTIDAD, :BASE, :IVA, :CONSUMO, :TOTAL,
            :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :nit, :nomcliente, :sucursal
            DO
            BEGIN
            SELECT C.ZONA_COD, ZONA_NOM FROM CLIENTES C, ZONAS Z WHERE C.zona_cod = Z.zona_cod AND C.terc_nit = :nit INTO :codzona, :nomzona;
            select VEND_NOMBRE from VENDEDORES where VEND_COD = :CODVEND INTO :NOMVEND;
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            if (CEROS = 'S') then
                SUSPEND;
            ELSE
                if ((BASE <> 0) AND (CANTIDAD <> 0)) then
                    SUSPEND;
            END /* FOR */
        END
    END
END
^

SET TERM ; ^



/* 20090429 PERSISITIA EL ERROR DE IMPRSION DE CAJAS Y UNIDADES POR SEPARADO */
SET TERM ^ ;

CREATE OR ALTER PROCEDURE IMPR_FACTURA(
    ID INTEGER)
RETURNS (
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    VENCE DATE,
    DIASVENCE INTEGER,
    CONTCRED CHAR(17),
    NIT VARCHAR(20),
    NOMTERCERO VARCHAR(60),
    NOMCLIENTE VARCHAR(60),
    VENDEDOR INTEGER,
    NOMVENDEDOR VARCHAR(60),
    PUNTOVTA INTEGER,
    NOMPUNTOVTA VARCHAR(30),
    CODBODEGA VARCHAR(2),
    NOMBODEGA VARCHAR(30),
    AUTORIZACION VARCHAR(20),
    DESPACHO VARCHAR(255),
    TRANSPORTADOR VARCHAR(60),
    COTIZACION VARCHAR(30),
    PEDIDO VARCHAR(30),
    REMISION VARCHAR(30),
    PACIENTE VARCHAR(20),
    NOMPACIENTE VARCHAR(60),
    COMIPORC NUMERIC(9,2),
    COMIMONTO NUMERIC(18,2),
    SUBTOTAL NUMERIC(18,2),
    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),
    EXTRA NUMERIC(18,2),
    DTOFPORC NUMERIC(9,2),
    DTOFMONTO NUMERIC(18,2),
    FECHADTO DATE,
    TOTALFAC NUMERIC(18,2),
    TOTALPAGAR NUMERIC(18,2),
    OBS BLOB SUB_TYPE 1 SEGMENT SIZE 80,
    ITEM INTEGER,
    ARTICULO VARCHAR(15),
    CODBAR VARCHAR(15),
    ARTIDES VARCHAR(60),
    DESCORTA VARCHAR(30),
    CANT NUMERIC(18,4),
    LOTE VARCHAR(15),
    VLOTE DATE,
    UNIDAD VARCHAR(8),
    CAJAS NUMERIC(18,4),
    FACTOR NUMERIC(18,4),
    LISTAPR INTEGER,
    REFITEM VARCHAR(60),
    BODITEM VARCHAR(2),
    STAND VARCHAR(15),
    PRUNIT NUMERIC(18,2),
    DTOITPORC NUMERIC(9,2),
    DTOITMONTO NUMERIC(18,2),
    PRNETO NUMERIC(18,2),
    PRNETOSINIVA NUMERIC(18,2),
    DTOIT1 NUMERIC(9,2),
    DTOIT2 NUMERIC(9,2),
    DTOIT3 NUMERIC(9,2),
    IVAPORC NUMERIC(9,2),
    IVAITMONTO NUMERIC(18,2),
    CONSUMO NUMERIC(18,2),
    SUBTOTIT NUMERIC(18,2),
    TOTAL NUMERIC(18,2),
    CODIGOCL VARCHAR(20),
    ZONACOD VARCHAR(2),
    ZONANOM VARCHAR(60),
    DV CHAR(1),
    DIRECCION VARCHAR(60),
    CIUDAD VARCHAR(40),
    TELEFONO VARCHAR(40),
    CONTACTO VARCHAR(60),
    FAX VARCHAR(25),
    CEL VARCHAR(25),
    GRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    SUBGRUPO VARCHAR(3),
    NOMSUBG VARCHAR(30),
    MARCA VARCHAR(3),
    NOMMARCA VARCHAR(30),
    PESO NUMERIC(18,4),
    ANCHO NUMERIC(18,4),
    ALTO NUMERIC(18,4),
    LARGO NUMERIC(18,4),
    SUMA1 NUMERIC(18,2),
    SUMA2 NUMERIC(18,2),
    SUMA3 NUMERIC(18,2),
    IVA1 NUMERIC(18,2),
    IVA2 NUMERIC(18,2),
    IVA3 NUMERIC(18,2),
    SUMAEX NUMERIC(18,2),
    SUMAGR NUMERIC(18,2),
    TOTCONSUMO NUMERIC(18,2),
    DTOIT1M NUMERIC(18,2),
    DTOIT2M NUMERIC(18,2),
    DTOIT3M NUMERIC(18,2),
    TOTCAJAS NUMERIC(18,2),
    VEHICULO VARCHAR(8),
    RECIBIDO NUMERIC(18,2),
    CAMBIO NUMERIC(18,2),
    HORA TIME,
    FORMAPAGO1 VARCHAR(30),
    MONTOPAGO1 NUMERIC(18,2),
    FORMAPAGO2 VARCHAR(30),
    MONTOPAGO2 NUMERIC(18,2),
    FORMAPAGO3 VARCHAR(30),
    MONTOPAGO3 NUMERIC(18,2),
    PUNTOS INTEGER,
    PUNTOSACUM INTEGER,
    PUNTOSVENC INTEGER,
    FECPTOS DATE,
    OBSITEM BLOB SUB_TYPE 1 SEGMENT SIZE 80,
    SUCUR VARCHAR(10),
    ALTERNATIVAS NUMERIC(18,4),
    PRINCIPALES NUMERIC(18,4))
AS
DECLARE VARIABLE IMPTOS CHAR(1);
DECLARE VARIABLE TARIFA INTEGER;
declare variable DEVUELTO NUMERIC(18,2);
declare variable ORDENCOD CHAR(2);
declare variable IMPRDEV CHAR(2);
declare variable IMPR CHAR(1);
declare variable ITEMFP INTEGER;
declare variable FORMAP VARCHAR(30);
declare variable MONTOP NUMERIC(18,2);
declare variable ICOINC CHAR(2);
declare variable DTOITM1 NUMERIC(18,2);
declare variable DTOITM2 NUMERIC(18,2);
declare variable DTOITM3 NUMERIC(18,2);
declare variable DTOITE3 CHAR(2);
declare variable SUMDTOIT NUMERIC(18,2);
declare variable AUTORET VARCHAR(10);
declare variable FAUTORET DATE;
declare variable FACTCANT NUMERIC(18,4);
BEGIN
execute procedure lee_configuracion('FACTURACION', 'ARTICULOS', 'IMPOCONSUMO INCLUIDO EN EL PRECIO BASE DE VENTA ANTES DE IVA') returning_values (icoinc);
execute procedure lee_configuracion('FACTURACION', 'FACTURAS', 'COLUMNAS DE DESCUENTO POR ITEM ADICIONALES') returning_values (DTOITE3);
SELECT F.PREF_PRE, FACT_NUMERO, FACT_FECHA, FACT_VENCE, F.BODE_COD, BODE_NOM, F.TERC_NIT, FACT_NOMCLIENTE, F.VEND_COD, VEND_NOMBRE, F.PTVT_ID, PTVT_NOM,
    AUTO_NUMERO, FACT_DESPACHO, FACT_TRANSP, FACT_COTIZACI, FACT_PEDIDO, FACT_REMISION, FACT_COMIPORC, FACT_COMIMONTO, FACT_IVAINC, 
    FACT_DTOPOR, FACT_DTOMONTO, FACT_ADICIONAL, FACT_IVAMONTO, FACT_RTFTEPOR, FACT_RTFTEMONTO, FACT_RTIVAPOR, FACT_RTIVAMONTO, FACT_RTICAPOR, FACT_RTICAMONTO, FACT_EXTRA, FACT_DTOFPOR, FACT_DTOFMONTO, FACT_DTOFFECHA, FACT_TOTAL,
    TERC_DIR, TERC_CIU, TERC_TEL, TERC_CONTACTO, TERC_FAX, TERC_DV, TERC_CEL, FACT_DTOIT1, FACT_DTOIT2, FACT_DTOIT3,
    FACT_OBS, VEHI_COD, /*FACT_NROCOPIA,*/ FACT_RECIBIDO, FACT_SUCURSAL, FACT_DETCLI, FACT_DETCLINOM, TERC_NOM
    FROM FACTURAS F, BODEGA B, VENDEDORES V, PUNTO_VENTA P, TERCEROS T
    WHERE F.BODE_COD = B.BODE_COD AND F.VEND_COD = V.VEND_COD AND F.PTVT_ID = P.PTVT_ID AND F.TERC_NIT = T.TERC_NIT AND F.FACT_ID = :ID
    into :PREF, :NUMERO, :FECHA, :VENCE, :CODBODEGA, :NOMBODEGA, :NIT, :NOMTERCERO, :VENDEDOR, :NOMVENDEDOR, :PUNTOVTA, :NOMPUNTOVTA,
    :AUTORIZACION, :DESPACHO, :TRANSPORTADOR, :COTIZACION, :PEDIDO, :REMISION, :COMIPORC, :COMIMONTO, :IMPTOS,
    :DTOPORC, :DTOMONTO, :ADICIONAL, :IVAMONTO, :RTEFTEPORC, :RTEFTEMONTO, :RTEIVAPORC, :RTEIVAMONTO, :RTEICAPORC, :RTEICAMONTO, :EXTRA, :DTOFPORC, :DTOFMONTO, :FECHADTO, :TOTALFAC,
    :DIRECCION, :CIUDAD, :TELEFONO, :CONTACTO, :FAX, :DV, :CEL, :dtoit1m, :dtoit2m, :dtoit3m,
    :OBS, :VEHICULO,/* :NROCOPIA,*/ :RECIBIDO, :SUCUR, :paciente, :nompaciente, :nomcliente;

/* ACUMULE LOS PUNTOS, SE HACE ACA POR SER POSTERIOR AL DETALLE */
EXECUTE PROCEDURE acumula_puntos_cliente (31, :id, :nit, :fecha) returning_values (:PUNTOS);
EXECUTE PROCEDURE consulta_puntos_cliente (:id, :nit, :fecha) returning_values (:puntos, :puntosacum, :puntosvenc, :fecptos);
if (DTOIT1M IS NULL) then
    DTOIT1M = 0;
if (DTOIT2M IS NULL) then
    DTOIT2M = 0;
if (DTOIT3M IS NULL) then
    DTOIT3M = 0;
SELECT CLIE_COD, C.ZONA_COD, ZONA_NOM
    FROM CLIENTES C, ZONAS Z
    WHERE TERC_NIT = :NIT AND C.ZONA_COD = Z.ZONA_COD
    INTO :CODIGOCL, :ZONACOD, :ZONANOM;
SELECT CLSU_DIR, CLSU_CIUDAD, CLSU_TEL FROM CLIENTE_SUCURSALES WHERE TERC_NIT = :NIT AND CLCU_COD = :SUCUR
    INTO :DIRECCION, :CIUDAD, :TELEFONO;
DIASVENCE = VENCE - FECHA;
if (DIASVENCE > 0) then
    CONTCRED = 'CREDITO ' || CAST(DIASVENCE AS VARCHAR(3)) || ' DIAS';
ELSE
    CONTCRED = 'CONTADO';
SUBTOTAL = TOTALFAC - EXTRA - IVAMONTO - ADICIONAL + DTOMONTO;
if (DTOITE3 = 'SI') then
    BEGIN
    SELECT SUM(FADE_DTOMONTO) FROM FACTURAS_DETALLE WHERE FACT_ID = :id INTO :sumdtoit;
    SUBTOTAL = SUBTOTAL + sumdtoit + dtoit1m + dtoit2m + dtoit3m;
    END
EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'FECHA AUTORETENEDOR NO DESCONTAR RETENCIONES DEL SALDO PERO SI CONTABILIZARLAS') returning_values (AUTORET);
if (AUTORET <> '') then
    FAUTORET = CAST(AUTORET AS DATE);
else
    FAUTORET = '9999/12/31';
if (FECHA > fautoret) then
    TOTALPAGAR = TOTALFAC - RTEIVAMONTO - RTEICAMONTO;
ELSE
    TOTALPAGAR = TOTALFAC - RTEFTEMONTO - RTEIVAMONTO - RTEICAMONTO;
if (RECIBIDO <> 0) then
    CAMBIO = RECIBIDO - totalpagar;
ELSE
    CAMBIO = 0;
SUMAEX = 0;
SUMA1 = 0;
SUMA2 = 0;
SUMA3 = 0;
IVA1 = 0;
IVA2 = 0;
IVA3 = 0;
TOTCONSUMO = 0;
MONTOPAGO1 = 0;
SELECT MAX(AUDI_HORA) FROM AUDITORIA WHERE TIDO_COD = 31 AND AUDI_IDDOC = :ID AND AUDI_OPER = 'I' INTO :HORA;
/* AHORA LAS FORMAS DE PAGO, BUSQUE EL ABONO DE HOY A LA FACTURA */
ITEMFP = 1;
MONTOPAGO1 = 0;
MONTOPAGO2 = 0;
MONTOPAGO3 = 0;
FOR SELECT FOPA_NOM, RCPA_MONTO FROM RECIBOS_CAJA_PAGO P, FORMAS_PAGO F, RECIBOS_CAJA R, RECIBOS_CAJA_DETALLE D
    WHERE R.RECA_ID = P.RECA_ID AND R.RECA_ID = D.RECA_ID AND P.FOPA_ID = F.FOPA_ID AND RECA_FECHA = :FECHA AND RCDE_TIPODOC = 31 AND RCDE_IDDOC = :ID
    INTO :formap, :MONTOP
    DO
    BEGIN
    if (ITEMFP = 1) then
        BEGIN
        FORMAPAGO1 = FORMAP;
        MONTOPAGO1 = MONTOP;
        END
    if (ITEMFP = 2) then
        BEGIN
        FORMAPAGO2 = FORMAP;
        MONTOPAGO2 = MONTOP;
        END
    if (ITEMFP = 3) then
        BEGIN
        FORMAPAGO3 = FORMAP;
        MONTOPAGO3 = MONTOP;
        END
    ITEMFP = ITEMFP + 1;
    END
EXECUTE PROCEDURE lee_configuracion ('FACTURACION','DOCUMENTOS','ORDENAR ITEMS POR CODIGO DE ARTICULO') returning_values (:ORDENCOD);
EXECUTE PROCEDURE lee_configuracion ('FACTURACION','POS', 'IMPRIMIR DEVOLUCIONES DE ARTICULOS NEGATIVOS') returning_values (:imprdev);
totcajas = 0;
if (ORDENCOD = 'SI') then
    BEGIN
    FOR SELECT FADE_ITEM, D.ARTI_COD, FADE_CODBAR, SUBSTR(FADE_DESC,1,60), ARTI_DESCORTA, FADE_CANT, FADE_UNIDAD, FADE_FACTOR, BODE_COD, FADE_LOTE, LIPR_COD, FADE_PRUNIT, FADE_DTOPORC, FADE_DTOMONTO, FADE_IVAPORC, FADE_IVAMONTO, FADE_CONSUMO, FADE_TOTAL, FADE_REFERENCIA,
        GRUP_COD, SUBG_COD, MARC_COD, ARTI_PESO, ARTI_ANCHO, ARTI_ALTO, ARTI_LARGO, TAIV_COD, FADE_DEVUELTO, FADE_OBS, FADE_DTO1, FADE_DTO2, FADE_DTO3, FADE_DTOM1, FADE_DTOM2, FADE_DTOM3, FADE_CAJAS
        FROM FACTURAS_DETALLE D, ARTICULO A
        WHERE D.ARTI_COD = A.ARTI_COD AND D.FACT_ID = :ID
        ORDER BY D.ARTI_COD
        INTO :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :DESCORTA, :CANT, :UNIDAD, :FACTOR, :BODITEM, :LOTE, :LISTAPR, :PRUNIT, :DTOITPORC, :DTOITMONTO, :IVAPORC, :IVAITMONTO, :CONSUMO, :TOTAL, :refitem,
        :GRUPO, :SUBGRUPO, :MARCA, :PESO, :ANCHO, :ALTO, :LARGO, :TARIFA, :devuelto, :obsitem, :dtoit1, :dtoit2, :dtoit3, :dtoitm1, :dtoitm2, :dtoitm3, :cajas
        DO
          BEGIN
          if (ARTICULO = CODBAR) then
            SELECT FIRST 1 COBA_COD FROM barras_articulo WHERE ARTI_COD = :articulo INTO :CODBAR;
          if (IMPRDEV <> 'SI') then
            BEGIN
            if ((CANT >= 0) AND (DEVUELTO = 0)) then
                IMPR = 'S';
            ELSE
                IMPR = 'N'; /* ES DEVOLUCION */
            END
          ELSE
            IMPR = 'S';
          if (IMPR = 'S') then
            BEGIN
            prneto = PRUNIT - DTOITMONTO - dtoitm1 - dtoitm2 - dtoitm3;
            if (IMPTOS = 'S') then
                if (cant <> 0) then
                    prnetosiniva = PRUNIT - DTOITMONTO - ((IVAITMONTO+CONSUMO) / CANT) - dtoitm1 - dtoitm2 - dtoitm3;
                else
                    prnetosiniva = PRUNIT - DTOITMONTO - dtoitm1 - dtoitm2 - dtoitm3;
            ELSE
                prnetosiniva = PRUNIT - DTOITMONTO - dtoit1m - dtoit2m - dtoit3m;
            if (ICOINC = 'SI') then
                SUBTOTIT = TOTAL - IVAITMONTO;
            else
                SUBTOTIT = TOTAL - IVAITMONTO - CONSUMO;
            TOTCONSUMO = TOTCONSUMO + CONSUMO;
            SELECT LOTE_VENCE FROM LOTES WHERE LOTE_NRO = :lote AND ARTI_COD = :ARTICULO AND BODE_COD = :boditem INTO :vlote;
            if ((REFITEM <> '.t') or (REFITEM IS NULL)) then
                BEGIN
                /* NO SUME LOS ENSAMBLES */
                if (IVAPORC = 0) then
                    SUMAEX = SUMAEX + TOTAL;
                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;
                END
            if (ANCHO IS NULL) then
                ANCHO = 0;
            if (ALTO IS NULL) then
                ALTO = 0;
            if (LARGO IS NULL) then
                LARGO = 0;
            if (PESO IS NULL) then
                PESO = 0;
            PESO = (PESO / 1000) * CANT * FACTOR;
            totcajas = totcajas + cajas;
            if (substr(ARTICULO,1,2) = '.t') then
                BEGIN
                REFITEM = '';
                TOTAL = 0;
                SUBTOTIT = 0;
                END
            SELECT STAND_COD FROM STANDS WHERE ARTI_COD = :ARTICULO AND STAND_BODEGA = :boditem INTO :stand;
            factcant = NULL;
            SELECT FIRST 1 UNAR_FACCAN FROM unidad_articulo WHERE ARTI_COD = :articulo INTO :factcant;
            if (factcant IS NULL) then
                factcant = 1;
            if (factcant = 1) then
                BEGIN
                ALTERNATIVAS = 0;
                PRINCIPALES = (CANT * FACTOR);
                END
            ELSE
                BEGIN
                ALTERNATIVAS = FLOOR(CANT * factor / factcant);
                PRINCIPALES = (CANT * FACTOR) - (alternativas * factcant);
                END
            SUSPEND;
            END
          END
    END
ELSE
    BEGIN
    FOR SELECT FADE_ITEM, D.ARTI_COD, FADE_CODBAR, SUBSTR(FADE_DESC,1,60), ARTI_DESCORTA, FADE_CANT, FADE_UNIDAD, FADE_FACTOR, BODE_COD, FADE_LOTE, LIPR_COD, FADE_PRUNIT, FADE_DTOPORC, FADE_DTOMONTO, FADE_IVAPORC, FADE_IVAMONTO, FADE_CONSUMO, FADE_TOTAL, FADE_REFERENCIA,
        GRUP_COD, SUBG_COD, MARC_COD, ARTI_PESO, ARTI_ANCHO, ARTI_ALTO, ARTI_LARGO, TAIV_COD, FADE_DEVUELTO, FADE_OBS, FADE_DTO1, FADE_DTO2, FADE_DTO3, FADE_DTOM1, FADE_DTOM2, FADE_DTOM3, FADE_CAJAS
        FROM FACTURAS_DETALLE D, ARTICULO A
        WHERE D.ARTI_COD = A.ARTI_COD AND D.FACT_ID = :ID
        ORDER BY FADE_ITEM
        INTO :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :DESCORTA, :CANT, :UNIDAD, :FACTOR, :BODITEM, :LOTE, :LISTAPR, :PRUNIT, :DTOITPORC, :DTOITMONTO, :IVAPORC, :IVAITMONTO, :CONSUMO, :TOTAL, :refitem,
        :GRUPO, :SUBGRUPO, :MARCA, :PESO, :ANCHO, :ALTO, :LARGO, :TARIFA, :devuelto, :obsitem, :dtoit1, :dtoit2, :dtoit3, :dtoitm1, :dtoitm2, :dtoitm3, :cajas
        DO
          BEGIN
          if (IMPRDEV <> 'SI') then
            BEGIN
            if ((CANT >= 0) AND (DEVUELTO = 0)) then
                IMPR = 'S';
            ELSE
                IMPR = 'N'; /* ES DEVOLUCION */
            END
          ELSE
            IMPR = 'S';
          if (IMPR = 'S') then
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :GRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :MARCA INTO NOMMARCA;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :SUBGRUPO AND GRUP_COD = :GRUPO INTO :NOMSUBG;
            prneto = PRUNIT - DTOITMONTO - dtoitm1 - dtoitm2 - dtoitm3;
            if (IMPTOS = 'S') then
                if (cant <> 0) then
                    prnetosiniva = PRUNIT - DTOITMONTO - ((IVAITMONTO+CONSUMO) / CANT) - dtoit1m - dtoit2m - dtoit3m;
                else
                    prnetosiniva = PRUNIT - DTOITMONTO - dtoitm1 - dtoitm2 - dtoitm3;
            ELSE
                prnetosiniva = PRUNIT - DTOITMONTO - dtoitm1 - dtoitm2 - dtoitm3;
            if (ICOINC = 'SI') then
                SUBTOTIT = TOTAL - IVAITMONTO;
            else
                SUBTOTIT = TOTAL - IVAITMONTO - CONSUMO;
            TOTCONSUMO = TOTCONSUMO + CONSUMO;
            SELECT LOTE_VENCE FROM LOTES WHERE LOTE_NRO = :lote AND ARTI_COD = :ARTICULO AND BODE_COD = :boditem INTO :vlote;
            if ((REFITEM <> '.t') or (REFITEM IS NULL)) then
                BEGIN
                /* NO SUME LOS ENSAMBLES */
                if (IVAPORC = 0) then
                    SUMAEX = SUMAEX + TOTAL;
                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;
                END
            if (ANCHO IS NULL) then
                ANCHO = 0;
            if (ALTO IS NULL) then
                ALTO = 0;
            if (LARGO IS NULL) then
                LARGO = 0;
            if (PESO IS NULL) then
                PESO = 0;
            PESO = (PESO / 1000)* CANT * FACTOR;
            totcajas = totcajas + cajas;
            if (substr(ARTICULO,1,2) = '.t') then
                BEGIN
                REFITEM = '';
                TOTAL = 0;
                SUBTOTIT = 0;
                END
            SELECT STAND_COD FROM STANDS WHERE ARTI_COD = :ARTICULO AND STAND_BODEGA = :boditem INTO :stand;
            factcant = NULL;
            SELECT FIRST 1 UNAR_FACCAN FROM unidad_articulo WHERE ARTI_COD = :articulo INTO :factcant;
            if (factcant IS NULL) then
                factcant = 1;
            if (factcant = 1) then
                BEGIN
                ALTERNATIVAS = 0;
                PRINCIPALES = (CANT * FACTOR);
                END
            ELSE
                BEGIN
                ALTERNATIVAS = FLOOR(CANT * factor / factcant);
                PRINCIPALES = (CANT * FACTOR) - (alternativas * factcant);
                END
            SUSPEND;
            END
          END
    END
END
^

SET TERM ; ^



/* 20090429B centroabastos: pasar por alto la configuracion de precio minimosegun cantidad para algunos clientes */

INSERT INTO CONFIGURACION (CONF_MODULO, CONF_CATEGORIA, CONF_PROPIEDAD, CONF_VALOR, CONF_POSIBLES, CONF_AYUDA) VALUES ('FACTURACION', 'DOCUMENTOS', 'LISTA DE PRECIOS FIJOS SIN TENER EN CUENTA LA CANTIDAD', '0', '', 'Indique el código de la lista de precios fija que pasará por alto las cantidades mínimas configuradas');
commit work;

/* 20090429C IMPORTACION DE DESCRIPCION CORTA */

INSERT INTO IMPORTACION_INVENTARIO (IMIN_TIPO, IMIN_DATO, IMIN_COLUMNA, IMIN_ANCHO) VALUES (0, 'ARTI_DESCORTA', 13, 35);
INSERT INTO NOMBRES_CAMPOS (NOMBRE, DESCRIPCION) VALUES ('ARTI_DESCORTA', 'Descripción corta del artículo');
COMMIT WORK;


/* 20090430 DEVOLUCIONES NO TOMABA LOS DESCUENTOS ADICIONALES EN LA CONTABILIZACION DE BASE Y TOTAL */
SET TERM ^ ;

CREATE OR ALTER PROCEDURE CONTABIL_DEVOLCLI(
    IDDOC INTEGER,
    IDINTER INTEGER)
RETURNS (
    ERROR INTEGER,
    VER CHAR(1),
    IDC INTEGER)
AS
declare variable PREF VARCHAR(4);
declare variable NUM VARCHAR(6);
declare variable NUMERO VARCHAR(10);
declare variable FECAUX DATE;
declare variable FECHA CHAR(8);
declare variable CONC CHAR(120);
declare variable NUMFAC VARCHAR(10);
declare variable VRDTO NUMERIC(18, 2);
declare variable VRADIC NUMERIC(18, 2);
declare variable VRSUBT NUMERIC(18, 2);
declare variable VRIVA NUMERIC(18, 2);
declare variable PRTFTE NUMERIC(9, 2);
declare variable VRRTFTE NUMERIC(18, 2);
declare variable VRRTIVA NUMERIC(18, 2);
declare variable PRTICA NUMERIC(9, 2);
declare variable VRRTICA NUMERIC(18, 2);
declare variable VRTOTAL NUMERIC(18, 2);
declare variable VREXTRA NUMERIC(18, 2);
declare variable TIPOCOMP VARCHAR(3);
declare variable PREFCONT VARCHAR(4);
declare variable VENTAS CHAR(1);
declare variable CTAVENTAS VARCHAR(20);
declare variable IVA CHAR(1);
declare variable CTAIVA VARCHAR(20);
declare variable CONSUMO CHAR(1);
declare variable CTACONSUMO VARCHAR(20);
declare variable CARTERA CHAR(1);
declare variable CTACARTERA VARCHAR(20);
declare variable RTFTE CHAR(1);
declare variable CTARTFTE VARCHAR(20);
declare variable RTIVA CHAR(1);
declare variable CTARTIVA VARCHAR(20);
declare variable RTICA CHAR(1);
declare variable CTARTICA VARCHAR(20);
declare variable INVEN CHAR(1);
declare variable CTAINVEN VARCHAR(20);
declare variable COSTOS CHAR(1);
declare variable CTACOSTOS VARCHAR(20);
declare variable CTADTO VARCHAR(20);
declare variable CTAADIC VARCHAR(20);
declare variable CTAEXTRA VARCHAR(20);
declare variable EXISTE CHAR(1);
declare variable CUENTA VARCHAR(20);
declare variable MONTO NUMERIC(18,2);
declare variable TIPOCUEN CHAR(1);
declare variable NIT VARCHAR(20);
declare variable PROY VARCHAR(4);
declare variable CENTRO VARCHAR(4);
declare variable PORC NUMERIC(5,2);
declare variable DEBITO NUMERIC(18,2);
declare variable CREDITO NUMERIC(18,2);
declare variable NROI INTEGER;
declare variable ART VARCHAR(15);
declare variable IMPINC CHAR(1);
declare variable IMPTOS NUMERIC(18, 2);
declare variable SUMA NUMERIC(18,2);
declare variable PORCIVA NUMERIC(9,2);
declare variable TCTACLIEN VARCHAR(20);
declare variable TCTAVENTA VARCHAR(20);
declare variable TCTARTFTE VARCHAR(20);
declare variable TCTARTIVA VARCHAR(20);
declare variable TCTARTICA VARCHAR(20);
declare variable CTADIC VARCHAR(20);
declare variable BASEADIC VARCHAR(20);
declare variable PORCADIC NUMERIC(5,2);
declare variable VALORADIC NUMERIC(18,2);
declare variable DBADIC CHAR(1);
declare variable PTOVTA INTEGER;
declare variable ANULADO CHAR(1);
declare variable CENT CHAR(1);
DECLARE VARIABLE MERCANCIA NUMERIC(18,2);
declare variable FACTOR DOUBLE PRECISION;
declare variable DIG INTEGER;
DECLARE VARIABLE FOMENTO VARCHAR(2);
DECLARE VARIABLE VRCONSUMO NUMERIC(18,2);
declare variable AUTORET VARCHAR(10);
declare variable FAUTORET DATE;
declare variable IDREM INTEGER;
declare variable DTOXIT CHAR(2);
declare variable ERRORC INTEGER;
BEGIN
EXECUTE PROCEDURE LEE_CONFIGURACION('COMPRAS', 'FACTURAS', 'USAR IMPOCONSUMO COMO PORCENTAJE DE FOMENTO') returning_values (FOMENTO);
EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'FECHA AUTORETENEDOR NO DESCONTAR RETENCIONES DEL SALDO PERO SI CONTABILIZARLAS') returning_values (AUTORET);
if (AUTORET <> '') then
    FAUTORET = CAST(AUTORET AS DATE);
else
    FAUTORET = '9999/12/31';
  /* BUSQUE LA INTERFACE */
  EXISTE = 'N';
  SELECT 'S', TICO_COD, PRCO_PRE, INVE_VENTAS, INVE_IVA, INVE_CONSUMO, INVE_CARTERA, INVE_RTFTE, INVE_RTIVA, INVE_RTICA, INVE_COSTO, INVE_INVEN, INVE_CTAVENTAS, INVE_CTAIVA, INVE_CTACONSUMO, INVE_CTADTO, INVE_CTAADIC, INVE_CTAEXTRA, INVE_CTACARTERA, INVE_CTARTFTE, INVE_CTARTIVA, INVE_CTARTICA, INVE_CTAINVEN, INVE_CTACOSTOS, INVE_CONFIRMAR, INVE_CENTRO
    FROM INTERFAZ_VENTAS
    WHERE INVE_ID = :IDINTER
    INTO :EXISTE, :TIPOCOMP, :PREFCONT, :VENTAS, :IVA, :CONSUMO, :CARTERA, :RTFTE, :RTIVA, :RTICA, :COSTOS, :INVEN, :CTAVENTAS, :CTAIVA, :CTACONSUMO, :CTADTO, :CTAADIC, :CTAEXTRA, :CTACARTERA, :CTARTFTE, :CTARTIVA, :CTARTICA, :CTAINVEN, :CTACOSTOS, :VER, :CENT;
  if (EXISTE = 'S') then
   BEGIN
    /* BORRE CUALQUEIR CONTABILIZACION PREVIA */
    DELETE FROM CONTABILIZACION WHERE CNTB_TIPOREF = 33 AND CNTB_IDREF = :IDDOC;
    /* TRAIGA EL ENCABEZADO DE LA DEVOLUCION */
   SELECT PREF_PRE, DEVT_NUMERO, DEVT_FECHA, F.TERC_NIT, DEVT_IVAINC, PTVT_ID, DEVT_FACTURA, DEVT_DTOMONTO, DEVT_ADICIONAL, DEVT_IVAMONTO, DEVT_EXTRA, DEVT_TOTAL, DEVT_RTFTEPORC, DEVT_RTFTEMONTO, DEVT_RTIVAPORC, DEVT_RTIVAMONTO, DEVT_RTICAPORC, DEVT_RTICAMONTO, TERC_CTARTFTE, TERC_CTARTIVA, TERC_CTARTICA, TERC_CTAVENTA, TERC_CTACLIENTE, DEVT_ANULADO, DEVT_REMID
        FROM DEVOLUCIONES_VENTAS F, TERCEROS T
        WHERE DEVT_ID = :IDDOC AND F.TERC_NIT = T.TERC_NIT
        INTO :PREF, :NUM, :FECAUX, :NIT, :IMPINC, :PTOVTA, :NUMFAC, :VRDTO, :VRADIC, :VRIVA, :VREXTRA, :VRTOTAL, :PRTFTE, :VRRTFTE, :PORC, :VRRTIVA, :PRTICA, :VRRTICA, :TCTARTFTE, TCTARTIVA, TCTARTICA, TCTAVENTA, TCTACLIEN, ANULADO, :IDREM;
   if (idrem is null) Then
    IDREM = 0;
   if ((ANULADO = 'N') AND (IDREM = 0)) then
    BEGIN
    NUMERO = PREF || NUM;
    SELECT SUM(DVDE_CONSUMO) FROM devoluciones_ventas_detalle WHERE DEVT_ID = :iddoc AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL)) INTO :MERCANCIA;
    VRSUBT = VRTOTAL - VREXTRA - VRIVA - MERCANCIA; /* BASE DE RETEFTE Y RETEICA */
    EXECUTE PROCEDURE lee_configuracion ('FACTURACION', 'DEVOLUCIONES', 'DESCUENTO PIE DEVOLUCION IGUAL A SUMA DE DESCUENTOS POR ITEM') returning_values (:DTOXIT);
    if (DTOXIT = 'SI') then
        VRDTO = 0;
    MERCANCIA = VRSUBT - VRADIC + VRDTO;
    IF (CENT = 'B') THEN
        SELECT B.BODE_CENTRO, B.BODE_PROY FROM BODEGA B, DEVOLUCIONES_VENTAS F
            WHERE B.BODE_COD = F.BODE_COD AND F.DEVT_ID = :IDDOC INTO :CENTRO, :PROY;
    IF (CENT = 'V') THEN
        SELECT V.CENT_COD, V.PROY_COD FROM VENDEDORES V, DEVOLUCIONES_VENTAS F
            WHERE V.VEND_COD = F.VEND_COD AND F.DEVT_ID = :IDDOC INTO :CENTRO, :PROY;
    IF (CENT = 'P') THEN
        SELECT P.PREF_CENTRO,P.PREF_PROY  FROM PREFIJOS P, DEVOLUCIONES_VENTAS F
            WHERE P.PREF_PRE = F.PREF_PRE AND F.DEVT_ID = :IDDOC AND P.TIDO_COD = 33 INTO :CENTRO, :PROY;
    EXECUTE PROCEDURE FECHA_A_CONTA(:FECAUX) returning_values (:FECHA);
    /* REGISTRE EL ENCABEZADO CONTABLE */
    IDC = GEN_ID(ID_CONTABILIZA, 1);
    CONC = 'DEVOLUCION VENTAS No. ' || NUMERO || ' EN FACTURA ' || NUMFAC;
    CONC = SUBSTR(CONC, 1, 60);
    INSERT INTO CONTABILIZACION (CNTB_ID, CNTB_TIPOCOMP, CNTB_PREFCNT, CNTB_NUMERO, CNTB_FECHA, CNTB_CONCEPTO, CNTB_REF, CNTB_TIPOREF, CNTB_IDREF, CNTB_PREFREF, CNTB_NUMREF, CNTB_PROCESADO)
        VALUES (:IDC, :TIPOCOMP, :PREFCONT, :NUM, :FECHA, :CONC, '', 33, :IDDOC, :PREF, :NUM, 'N');
    NROI = 0;
    SUMA = 0;
    ERROR = 0;
    /* SI NO HAY CUENTA DE DESCUENTO NI ADICIONAL CALCULE UN FACTOR PARA LAS VENTAS Y EL IVA */
    if (MERCANCIA <> 0) then
        FACTOR = CAST(VRSUBT AS DOUBLE PRECISION) / CAST(MERCANCIA AS DOUBLE PRECISION);
    ELSE
        FACTOR = 1;
    /* TRAIGA EL NUMERO DE DIGITOS PARA EL REDONDEO */
    SELECT CAST(CONF_VALOR AS INTEGER) FROM CONFIGURACION WHERE CONF_MODULO = 'FACTURACION' AND
        CONF_CATEGORIA = 'GENERAL' AND CONF_PROPIEDAD = 'REDONDEO AL MULTIPLO DE DIEZ EN TOTALES' INTO :DIG;
    /* CUENTAS DE VENTAS */
    if (VENTAS = 'A') then
        BEGIN
        FOR SELECT MAX(COAR_CTADEV), SUM(DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO), SUM(DVDE_IVAMONTO), SUM(DVDE_CONSUMO)
            FROM ARTICULO A, CONTABIL_ARTICULO C, DEVOLUCIONES_VENTAS_DETALLE F
            WHERE F.DEVT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
            GROUP BY COAR_CTADEV
            INTO :CTAVENTAS, :MONTO, :IMPTOS, :VRCONSUMO
            DO
            BEGIN
            if (IMPINC = 'S') then
                if (FOMENTO = 'SI') then
                    MONTO = MONTO - IMPTOS;
                ELSE
                    MONTO = MONTO - IMPTOS - VRCONSUMO;
            ELSE
            if (FOMENTO = 'SI') then
            MONTO = MONTO + VRCONSUMO;
            if ((CTADTO IS NULL) OR (CTADTO = '')) then
                MONTO = MONTO * FACTOR;
            execute procedure redondee(MONTO, DIG) returning_values (MONTO);
            if (MONTO <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTAVENTAS, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT F.ARTI_COD, (DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO), (DVDE_IVAMONTO+DVDE_CONSUMO)
                        FROM ARTICULO A, CONTABIL_ARTICULO C, DEVOLUCIONES_VENTAS_DETALLE F
                        WHERE F.DEVT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTAINV = :CUENTA AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
                        INTO :ART, :MONTO, :IMPTOS
                    DO
                        BEGIN
                        if (IMPINC = 'S') then
                            MONTO = MONTO - IMPTOS;
                        if ((CTADTO IS NULL) OR (CTADTO = '')) then
                            MONTO = MONTO * FACTOR;
                        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        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, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                    NROI = NROI + 1;
                    SUMA = SUMA + MONTO;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA + MONTO;
                    END
                END /* MONTO <> 0 */
            END /* FOR */
        END /* VENTAS X ARTICULO */
     IF ((VENTAS = 'C') OR (VENTAS = 'K')) THEN
        BEGIN
        IF (VENTAS = 'C') THEN
            CTAVENTAS = TCTAVENTA;
        SELECT SUM(DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO), SUM(DVDE_IVAMONTO), SUM(DVDE_CONSUMO)
            FROM DEVOLUCIONES_VENTAS_DETALLE F
            WHERE F.DEVT_ID = :IDDOC  AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
            INTO :MONTO, :IMPTOS, :VRCONSUMO;
        if (IMPINC = 'S') then
            if (FOMENTO = 'SI') then
               MONTO = MONTO - IMPTOS;
            ELSE
               MONTO = MONTO - IMPTOS - VRCONSUMO;
        ELSE
         if (FOMENTO = 'SI') then
          MONTO = MONTO + VRCONSUMO;
        if ((CTADTO IS NULL) OR (CTADTO = '')) then
            MONTO = MONTO * FACTOR;
        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
        if (MONTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTAVENTAS, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT F.ARTI_COD, (DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO), (DVDE_IVAMONTO+DVDE_CONSUMO)
                    FROM ARTICULO A, DEVOLUCIONES_VENTAS_DETALLE F
                    WHERE F.DEVT_ID = :IDDOC AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
                    INTO :ART, :MONTO, :IMPTOS
                    DO
                    BEGIN
                    if (IMPINC = 'S') then
                        MONTO = MONTO - IMPTOS;
                    if ((CTADTO IS NULL) OR (CTADTO = '')) then
                        MONTO = MONTO * FACTOR;
                    execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                    NROI = NROI + 1;
                    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, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                NROI = NROI + 1;
                SUMA = SUMA + MONTO;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA + MONTO;
                END
            END /* MONTO <> 0 */
        END /* VENTAS DE CLIENTE O CONSTANTE */
    /* EL IVA EN VENTAS */
    if (IVA = 'A') then
        BEGIN
        FOR SELECT MAX(COAR_CTAIVAV), SUM(DVDE_IVAMONTO), SUM(DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO), SUM(DVDE_CONSUMO)
            FROM ARTICULO A, CONTABIL_ARTICULO C, DEVOLUCIONES_VENTAS_DETALLE F
            WHERE F.DEVT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
            GROUP BY COAR_CTAIVAV
            INTO :CTAIVA, :IMPTOS, :MONTO, :VALORADIC
        DO
            BEGIN
            if (FOMENTO = 'SI') then
                MONTO = MONTO + VALORADIC;
            MONTO = MONTO * -1;
            MONTO = MONTO * FACTOR;
            IMPTOS = IMPTOS * FACTOR;
            execute procedure redondee(MONTO, DIG) returning_values (MONTO);
            execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
            if (IMPTOS <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTAIVA, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT F.ARTI_COD, DVDE_IVAMONTO, (DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO), TAIV_PORC, DVDE_CONSUMO
                        FROM ARTICULO A, CONTABIL_ARTICULO C, DEVOLUCIONES_VENTAS_DETALLE F, TARIFA_IVA T
                        WHERE F.DEVT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND A.TAIV_COD = T.TAIV_COD AND COAR_CTAIVAV = :CUENTA AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
                        INTO :ART, :IMPTOS, :MONTO, :PORCIVA, :VALORADIC
                    DO
                        BEGIN
                        if (IMPINC = 'S') then
                            MONTO = MONTO - IMPTOS - VALORADIC;
                        MONTO = MONTO * -1;
                        MONTO = MONTO * FACTOR;
                        IMPTOS = IMPTOS * FACTOR;
                        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                        execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                        if (IMPTOS <> 0) then
                            BEGIN
                            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :IMPTOS, 0, :MONTO, :PORCIVA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                            NROI = NROI + 1;
                            SUMA = SUMA + IMPTOS;
                            END
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                    NROI = NROI + 1;
                    SUMA = SUMA + IMPTOS;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA + IMPTOS;
                    END
                END   /* IMPTOS <> 0 */
            END /* FOR */
        END /* IVA X ARTICULO */
    if (IVA = 'K') then /* IVA EN CTA CONSTANTE */
        BEGIN
        SELECT SUM(DVDE_IVAMONTO), SUM(DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO), SUM(DVDE_CONSUMO)
            FROM DEVOLUCIONES_VENTAS_DETALLE F
            WHERE F.DEVT_ID = :IDDOC  AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
            INTO :IMPTOS, :MONTO, :VALORADIC;
        if (FOMENTO = 'SI') then
            MONTO = MONTO + VALORADIC;
        MONTO = MONTO * -1;
        MONTO = MONTO * FACTOR;
        IMPTOS = IMPTOS * FACTOR;
        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
        execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
        if (IMPTOS <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTAIVA, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT F.ARTI_COD, (DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO), DVDE_IVAMONTO, TAIV_PORC, DVDE_CONSUMO
                    FROM ARTICULO A, DEVOLUCIONES_VENTAS_DETALLE F, TARIFA_IVA T
                    WHERE F.DEVT_ID = :IDDOC AND A.TAIV_COD = T.TAIV_COD AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
                    INTO :ART, :MONTO, :IMPTOS, :PORCIVA, :VALORADIC
                    DO
                    BEGIN
                    if (IMPINC = 'S') then
                        MONTO = MONTO - IMPTOS - VALORADIC;
                    MONTO = MONTO * -1;
                    MONTO = MONTO * FACTOR;
                    IMPTOS = IMPTOS * FACTOR;
                    execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                    execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                    if (IMPTOS <> 0) then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', :IMPTOS, 0, :MONTO, :PORCIVA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        SUMA = SUMA + IMPTOS;
                        END
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                NROI = NROI + 1;
                SUMA = SUMA + IMPTOS;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA + IMPTOS;
                END
            END /* IMPTOS <> 0 */
        END /* IVA EN CTA CONSTANTE */
    /* EL IMPOCONSUMO */
    if ((CONSUMO = 'A') AND (FOMENTO <> 'SI')) then
        BEGIN
        FOR SELECT MAX(COAR_CTACONS), SUM(DVDE_CONSUMO)
            FROM ARTICULO A, CONTABIL_ARTICULO C, DEVOLUCIONES_VENTAS_DETALLE F
            WHERE F.DEVT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
            GROUP BY COAR_CTACONS
            INTO :CTACONSUMO, :IMPTOS
        DO
            BEGIN
            if (IMPTOS <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTACONSUMO, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, REGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT F.ARTI_COD, DVDE_CONSUMO
                        FROM ARTICULO A, CONTABIL_ARTICULO C, DEVOLUCIONES_VENTAS_DETALLE F
                        WHERE F.DEVT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTACONS = :CUENTA AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
                        INTO :ART, :IMPTOS
                    DO
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 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, :NROI, :CUENTA, :CONC, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                    NROI = NROI + 1;
                    SUMA = SUMA + IMPTOS;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA + IMPTOS;
                    END
                END /* IMPTOS <> 0 */
            END /* FOR */
        END /* CONSUMO X ARTICULO */
    if ((CONSUMO = 'K') AND (FOMENTO <> 'SI')) then
        BEGIN
        SELECT SUM(DVDE_CONSUMO)
            FROM DEVOLUCIONES_VENTAS_DETALLE F
            WHERE F.DEVT_ID = :IDDOC AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
            INTO :IMPTOS;
        if (IMPTOS <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTACONSUMO, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT F.ARTI_COD, DVDE_CONSUMO
                    FROM ARTICULO A, DEVOLUCIONES_VENTAS_DETALLE F
                    WHERE F.DEVT_ID = :IDDOC  AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
                    INTO :ART, :IMPTOS
                    DO
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTACONSUMO, :CONC, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                    NROI = NROI + 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, :NROI, :CTACONSUMO, :CONC, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA + IMPTOS;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTACONSUMO, :CONC, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA + IMPTOS;
                END
            END /* IMPTOS <> 0 */
        END /* CONSUMO EN CTA CONSTANTE */
    /* DESCUENTO */
    if ((CTADTO IS NOT NULL) AND
        (CTADTO <> '') AND
        (VRDTO <> 0)) THEN
        BEGIN
        EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTADTO, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRDTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
            NROI = NROI + 1;
            SUMA = SUMA - VRDTO;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRDTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 33);
            NROI = NROI + 1;
            SUMA = SUMA - VRDTO;
            END
        END /* DESCUENTO */
    /* VALOR ADIC */
    if ((CTAADIC IS NOT NULL) AND
        (CTAADIC <> '') AND
        (VRADIC <> 0)) THEN
        BEGIN
        EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTAADIC, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRADIC, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
            NROI = NROI + 1;
            SUMA = SUMA + VRADIC;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRADIC, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 33);
            NROI = NROI + 1;
            SUMA = SUMA + VRADIC;
            END
        END /* VR. ADIC */
    /* VALOR EXTRA */
    if ((CTAEXTRA IS NOT NULL) AND
        (CTAEXTRA <> '') AND
        (VREXTRA <> 0)) THEN
        BEGIN
        EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTAEXTRA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VREXTRA, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
            NROI = NROI + 1;
            SUMA = SUMA + VREXTRA;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VREXTRA, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 33);
            NROI = NROI + 1;
            SUMA = SUMA + VREXTRA;
            END
        END /* VR. EXTRA */
    /* RETENCION FUENTE */
    if ((RTFTE = 'C') or (RTFTE = 'K')) then
      if (VRRTFTE <> 0) then
        BEGIN
        if (RTFTE = 'C') then
            CTARTFTE = TCTARTFTE;
        EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTARTFTE, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, (:VRSUBT*-1), :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
            NROI = NROI + 1;
            SUMA = SUMA - VRRTFTE;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, (:VRSUBT*-1), :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA - VRRTFTE;
            END
        /* AUTORETENCION */
        if (FAUTORET <= fecaux) then
            BEGIN
            EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'CUENTA DE AUTORETENCION EN LA FUENTE') returning_values (CTARTFTE);
            EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTARTFTE, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :VRSUBT, :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                NROI = NROI + 1;
                SUMA = SUMA + VRRTFTE;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :VRSUBT, :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA + VRRTFTE;
                END
            END
        END /* RTFTE */
    if (RTFTE = 'A') then
      BEGIN
      FOR SELECT MAX(COAR_CTARTFTEV), MAX(COAR_RTFTE), MIN(COAR_RTBASE), SUM(DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO), SUM((DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO)*COAR_RTFTE)
        FROM CONTABIL_ARTICULO C, devoluciones_ventas_detalle F
        WHERE F.devt_id = :IDDOC AND F.ARTI_COD = C.ARTI_COD AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
        GROUP BY COAR_CTARTFTEV
        INTO :CTARTFTE, :PRTFTE, :baseadic, :MONTO, :VRRTFTE
        DO
        BEGIN
        MONTO = MONTO * FACTOR;
        if (MONTO >= BASEADIC) then
            BEGIN
            VRRTFTE = VRRTFTE * FACTOR / 100;
            execute procedure redondee(VRRTFTE, DIG) returning_values (VRRTFTE);
            execute procedure redondee(MONTO, DIG) returning_values (MONTO);
            if (VRRTFTE <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTARTFTE, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, (:MONTO*-1), :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                    NROI = NROI + 1;
                    SUMA = SUMA - VRRTFTE;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, (:MONTO*-1), :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA - VRRTFTE;
                    END
                /* AUTORETENCION */
                if (FAUTORET <= fecaux) then
                    BEGIN
                    EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'CUENTA DE AUTORETENCION EN LA FUENTE') returning_values (CTARTFTE);
                    EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTARTFTE, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
                    if (ERRORC <> 0) then
                        ERROR = ERROR + 1;
                    if (TIPOCUEN = 'C') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :MONTO, :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                        NROI = NROI + 1;
                        SUMA = SUMA + VRRTFTE;
                        END
                    if (TIPOCUEN = 'N') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :MONTO, :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NROI = NROI + 1;
                        SUMA = SUMA + VRRTFTE;
                        END
                    END
                END
            END
        END /* RTFTE */
      END
    /* RETENCION IVA */
    if ((RTIVA = 'C') or (RTIVA = 'K')) then
      if (VRRTIVA <> 0) then
        BEGIN
        if (RTIVA = 'C') then
            CTARTIVA = TCTARTIVA;
        EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTARTIVA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTIVA, (:VRIVA*-1), :PORC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
            NROI = NROI + 1;
            SUMA = SUMA - VRRTIVA;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTIVA, (:VRIVA*-1), :PORC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA - VRRTIVA;
            END
        END /* RTIVA */
    /* RETENCION DE ICA */
    if ((RTICA = 'C') or (RTICA = 'K')) then
      if (VRRTICA <> 0) then
        BEGIN
        if (RTICA = 'C') then
            CTARTICA = TCTARTICA;
        EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTARTICA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTICA, (:VRSUBT*-1), :PRTICA, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
            NROI = NROI + 1;
            SUMA = SUMA - VRRTICA;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTICA, (:VRSUBT*-1), :PRTICA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA - VRRTICA;
            END
        END /* RTICA */
    /* CIERRE EL COMPROBANTE CONTRA LA CUENTA DEL TERCERO O LA CONSTANTE */
    if ((SUMA <> 0) and ((CARTERA = 'C') or (CARTERA = 'K') or (CARTERA = 'J'))) then
        BEGIN
        if (SUMA < 0) then
            BEGIN
            DEBITO = SUMA * -1;
            CREDITO = 0;
            END
        ELSE
            BEGIN
            DEBITO = 0;
            CREDITO = SUMA;
            END
        if (CARTERA = 'C') then
            CTACARTERA = TCTACLIEN;
        if (CARTERA = 'J') then
            BEGIN
            /* BUSQUE LA CUENTA DE LA CAJA */
            SELECT CAJA_CUENTA FROM CAJAS C, PUNTO_VENTA P
                WHERE P.CAJA_ID = C.CAJA_ID AND PTVT_ID = :PTOVTA
                INTO :CTACARTERA;
            END
        EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTACARTERA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :DEBITO, :CREDITO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
        if (TIPOCUEN = 'N') then
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :DEBITO, :CREDITO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
        NROI = NROI + 1;
        END /* SUMA EN CARTERA */
    /* CALCULE COSTOS EN VENTAS */
    EXECUTE PROCEDURE COSTO_EN_VENTAS(33, :IDDOC);
    if (COSTOS = 'A') then
        BEGIN
        FOR SELECT MAX(CTACOS), SUM(cast(CANT as double precision) * COSTO)
            FROM COSTO_VENTAS
            GROUP BY CTACOS
            INTO :CTACOSTOS, :MONTO
        DO
            BEGIN
            if (MONTO <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTACOSTOS, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT ARTI_COD, cast(CANT as double precision) * COSTO
                        FROM COSTO_VENTAS
                        WHERE CTACOS = :CUENTA
                        INTO :ART, :MONTO
                    DO
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                    NROI = NROI + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    END
                END /* MONTO <> 0 */
            END /* FOR */
        END /* COSTOS */
    if (COSTOS = 'K') then
        BEGIN
        SELECT SUM(cast(CANT as double precision) * COSTO)
            FROM COSTO_VENTAS
            INTO :MONTO;
        if (MONTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTACOSTOS, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, REGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT ARTI_COD, cast(CANT as double precision) * COSTO
                    FROM COSTO_VENTAS
                    INTO :ART, :MONTO
                DO
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTACOSTOS, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                    NROI = NROI + 1;
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTACOSTOS, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                NROI = NROI + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTACOSTOS, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                END
            END /* MONTO <> 0 */
        END /* COSTOS = K */
    if (INVEN = 'A') then
        BEGIN
        FOR SELECT MAX(CTAINV), SUM(cast(CANT as double precision) * COSTO)
            FROM COSTO_VENTAS
            GROUP BY CTAINV
            INTO :CTAINVEN, :MONTO
        DO
            BEGIN
            if (MONTO <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTAINVEN, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, REGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT ARTI_COD, cast(CANT as double precision) * COSTO
                        FROM COSTO_VENTAS
                        WHERE CTAINV = :CUENTA
                        INTO :ART, :MONTO
                    DO
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                    NROI = NROI + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    END
                END /* MONTO <> 0 */
            END /* FOR */
        END /* INVEN = A */
    if (INVEN = 'K') then
        BEGIN
        SELECT SUM(cast(CANT as double precision) * COSTO)
            FROM COSTO_VENTAS
            INTO :MONTO;
        if (MONTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTAINVEN, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT ARTI_COD, cast(CANT as double precision) * COSTO
                    FROM COSTO_VENTAS
                    INTO :ART, :MONTO
                DO
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTAINVEN, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                    NROI = NROI + 1;
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAINVEN, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                NROI = NROI + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAINVEN, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                END
            END /* MONTO <> 0 */
        END /* INVEN = K */
    /* recorra las cuentas adicionales */
    FOR SELECT INVC_CUENTA, INVC_BASE, INVC_PORC, INVC_VALOR, INVC_DB
        FROM INTERFAZ_VENTAS_CTAS WHERE INVE_ID = :IDINTER
        INTO :CTADIC, :BASEADIC, :PORCADIC, :VALORADIC, :DBADIC
        DO
        BEGIN
        if (valoradic <> 0) then
            monto = valoradic;
        else
            BEGIN
            if (:BASEADIC = 'SUBTOTAL') then
                VALORADIC = vrsubt;
            if (:BASEADIC = 'DESCUENTO') then
                VALORADIC = VRDTO;
            if (:BASEADIC = 'IVA') then
                VALORADIC = VRIVA;
            if (:BASEADIC = 'ADICIONAL') then
                VALORADIC = VRADIC;
            if (:BASEADIC = 'EXTRA') then
                VALORADIC = VREXTRA;
            if (:BASEADIC = 'TOTAL') then
                VALORADIC = VRTOTAL;
            MONTO = VALORADIC * PORCADIC;
            END
        if (MONTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTADIC, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                if (DBADIC = 'S') then
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                ELSE
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                NROI = NROI + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                if (DBADIC = 'S') then
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                ELSE
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                END
            NROI = NROI + 1;
            END
        END
    if (error > 0) then
        ver = 'S';
    SUSPEND;
    END
   END /* EXISTE LA INTERFAZ */
  ELSE
    BEGIN
    EXECUTE PROCEDURE ERROR (33, :IDDOC, :PREF, 1);
    ERROR = ERROR + 1;
    VER = 'S';
    SUSPEND;
    END
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE DEVOLUCIONES_SIN_CONTABILIDAD(
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    ID INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    ESTADO VARCHAR(20),
    IDI INTEGER,
    IDC INTEGER)
AS
DECLARE VARIABLE VER CHAR(2);
declare variable FECICNT VARCHAR(10);
declare variable FECFCNT VARCHAR(10);
declare variable ERROR INTEGER;
declare variable idref INTEGER;
BEGIN /*$$IBE$$ 
EXECUTE PROCEDURE fecha_a_conta(FECINI) returning_values (FECICNT);
EXECUTE PROCEDURE fecha_a_conta(FECFIN) returning_values (FECFCNT);
FOR SELECT DEVT_ID, PREF_PRE, DEVT_NUMERO FROM devoluciones_ventas WHERE DEVT_ANULADO = 'N' AND
    DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN
    INTO :ID, :PREF, :NUMERO
DO
  BEGIN
  idref = null;
  SELECT ENCO_IDREF FROM COMPROBANTE_ENCABEZADO WHERE ENCO_TIPOREF = 33 AND ENCO_FECHA >= :FECICNT AND ENCO_FECHA <= :FECFCNT and ENCO_IDREF = :id into :idref;
  if (idref IS NULL) then
  begin
   ESTADO = 'PROCESANDO';
   SUSPEND;
   SELECT MAX(INVE_ID) FROM INTERFAZ_VENTAS WHERE PREF_PRE = :PREF AND TIDO_COD = 33 INTO :IDI;
   EXECUTE PROCEDURE contabil_devolcli (:ID, :IDI) RETURNING_VALUES (:ERROR, :VER, :IDC);
   if (ERROR = 0) then
    BEGIN
    EXECUTE PROCEDURE CONTABILIZA_PENDIENTE (:IDC);
    ESTADO = 'OK';
    END
   ELSE
    ESTADO = 'ERROR';
   suspend;
  End
  END
 $$IBE$$*/ SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE DEVOLUCIONES_SIN_CONTABILIDAD(
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    ID INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    ESTADO VARCHAR(20),
    IDI INTEGER,
    IDC INTEGER)
AS
DECLARE VARIABLE VER CHAR(2);
declare variable FECICNT VARCHAR(10);
declare variable FECFCNT VARCHAR(10);
declare variable ERROR INTEGER;
declare variable idref INTEGER;
BEGIN
EXECUTE PROCEDURE fecha_a_conta(FECINI) returning_values (FECICNT);
EXECUTE PROCEDURE fecha_a_conta(FECFIN) returning_values (FECFCNT);
FOR SELECT DEVT_ID, PREF_PRE, DEVT_NUMERO FROM devoluciones_ventas WHERE DEVT_ANULADO = 'N' AND
    DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN
    INTO :ID, :PREF, :NUMERO
DO
  BEGIN
  idref = null;
  SELECT ENCO_IDREF FROM COMPROBANTE_ENCABEZADO WHERE ENCO_TIPOREF = 33 AND ENCO_FECHA >= :FECICNT AND ENCO_FECHA <= :FECFCNT and ENCO_IDREF = :id into :idref;
  if (idref IS NULL) then
  begin
   ESTADO = 'PROCESANDO';
   SUSPEND;
   SELECT MAX(INVE_ID) FROM INTERFAZ_VENTAS WHERE PREF_PRE = :PREF AND TIDO_COD = 33 INTO :IDI;
   EXECUTE PROCEDURE contabil_devolcli (:ID, :IDI) RETURNING_VALUES (:ERROR, :VER, :IDC);
   if (ERROR = 0) then
    BEGIN
    EXECUTE PROCEDURE CONTABILIZA_PENDIENTE (:IDC);
    ESTADO = 'OK';
    END
   ELSE
    ESTADO = 'ERROR';
   suspend;
  End
  END
END

^

SET TERM ; ^



/* 20090502  SI SE IMPRIMIA UN DOCUMENTO ANULADO VOLVIA A ACUMULAR LOS PUNTOS DEL CLIENTE */
SET TERM ^ ;

ALTER PROCEDURE IMPR_DEVOLUCION(
    ID INTEGER)
RETURNS (
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    NIT VARCHAR(20),
    NOMTERCERO VARCHAR(60),
    VENDEDOR INTEGER,
    NOMVENDEDOR VARCHAR(60),
    PUNTOVTA INTEGER,
    NOMPUNTOVTA VARCHAR(30),
    CODBODEGA VARCHAR(2),
    NOMBODEGA VARCHAR(30),
    FACTURA VARCHAR(30),
    REMISION VARCHAR(10),
    COMIPORC NUMERIC(9,2),
    COMIMONTO NUMERIC(18,2),
    SUBTOTAL NUMERIC(18,2),
    DTOPORC NUMERIC(9,2),
    DTOMONTO NUMERIC(18,2),
    ADICIONAL NUMERIC(18,2),
    IVAMONTO NUMERIC(18,2),
    RTEFTEPORC NUMERIC(9,2),
    RTEFTEMONTO NUMERIC(18,2),
    RTEIVAPORC NUMERIC(9,2),
    RTEIVAMONTO NUMERIC(18,2),
    RTEICAPORC NUMERIC(9,2),
    RTEICAMONTO NUMERIC(18,2),
    EXTRA NUMERIC(18,2),
    TOTALFAC NUMERIC(18,2),
    TOTALPAGAR NUMERIC(18,2),
    OBS BLOB SUB_TYPE 1 SEGMENT SIZE 80,
    ITEM INTEGER,
    ARTICULO VARCHAR(15),
    CODBAR VARCHAR(15),
    ARTIDES VARCHAR(60),
    CANT NUMERIC(18,4),
    LOTE VARCHAR(15),
    UNIDAD VARCHAR(8),
    FACTOR NUMERIC(18,4),
    REFITEM VARCHAR(60),
    BODITEM VARCHAR(2),
    PRUNIT NUMERIC(18,2),
    DTOITPORC NUMERIC(9,2),
    DTOITMONTO NUMERIC(18,2),
    PRNETO NUMERIC(18,2),
    PRNETOSINIVA NUMERIC(18,2),
    IVAPORC NUMERIC(9,2),
    IVAITMONTO NUMERIC(18,2),
    CONSUMO NUMERIC(18,2),
    SUBTOTIT NUMERIC(18,2),
    TOTAL NUMERIC(18,2),
    CODIGOCL VARCHAR(20),
    ZONACOD VARCHAR(2),
    ZONANOM VARCHAR(60),
    DV CHAR(1),
    DIRECCION VARCHAR(60),
    CIUDAD VARCHAR(40),
    TELEFONO VARCHAR(40),
    CONTACTO VARCHAR(60),
    FAX VARCHAR(25),
    CEL VARCHAR(25),
    GRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    SUBGRUPO VARCHAR(3),
    NOMSUBG VARCHAR(30),
    MARCA VARCHAR(3),
    NOMMARCA VARCHAR(30),
    PESO NUMERIC(9,4),
    ANCHO NUMERIC(18,4),
    ALTO NUMERIC(18,4),
    LARGO NUMERIC(18,4),
    SUMA1 NUMERIC(18,2),
    SUMA2 NUMERIC(18,2),
    SUMA3 NUMERIC(18,2),
    IVA1 NUMERIC(18,2),
    IVA2 NUMERIC(18,2),
    IVA3 NUMERIC(18,2),
    TOTCONSUMO NUMERIC(18,2),
    SUMAEX NUMERIC(18,2),
    SUMAGR NUMERIC(18,2),
    OBSITEM BLOB SUB_TYPE 1 SEGMENT SIZE 80,
    ALTERNATIVAS NUMERIC(18,4),
    PRINCIPALES NUMERIC(18,4))
AS
DECLARE VARIABLE IMPTOS CHAR(1);
DECLARE VARIABLE TARIFA INTEGER;
declare variable ORDENCOD CHAR(2);
declare variable SUCUR VARCHAR(10);
declare variable PUNTOS NUMERIC(18,4);
declare variable ICOINC CHAR(2);
declare variable FACTCANT NUMERIC(18,4);
declare variable ANULADO CHAR(1);
BEGIN
execute procedure lee_configuracion('FACTURACION', 'ARTICULOS', 'IMPOCONSUMO INCLUIDO EN EL PRECIO BASE DE VENTA ANTES DE IVA') returning_values (icoinc);
SELECT F.PREF_PRE, DEVT_NUMERO, DEVT_FECHA, F.BODE_COD, BODE_NOM, F.TERC_NIT, DEVT_NOMTERC, F.VEND_COD, VEND_NOMBRE, F.PTVT_ID, PTVT_NOM,
    DEVT_FACTURA, DEVT_COMIPORC, DEVT_COMIMONTO, DEVT_IVAINC,
    DEVT_DTOPOR, DEVT_DTOMONTO, DEVT_ADICIONAL, DEVT_IVAMONTO, DEVT_RTFTEPORC, DEVT_RTFTEMONTO, DEVT_RTIVAPORC, DEVT_RTIVAMONTO, DEVT_RTICAPORC, DEVT_RTICAMONTO, DEVT_EXTRA, DEVT_TOTAL,
    TERC_CONTACTO, TERC_FAX, TERC_DV, TERC_CEL, DEVT_OBS, DEVT_SUCURSAL, DEVT_REMISION, DEVT_ANULADO
    FROM DEVOLUCIONES_VENTAS F, BODEGA B, VENDEDORES V, PUNTO_VENTA P, TERCEROS T
    WHERE F.BODE_COD = B.BODE_COD AND F.VEND_COD = V.VEND_COD AND F.PTVT_ID = P.PTVT_ID AND F.TERC_NIT = T.TERC_NIT AND F.DEVT_ID = :ID
    into :PREF, :NUMERO, :FECHA, :CODBODEGA, :NOMBODEGA, :NIT, :NOMTERCERO, :VENDEDOR, :NOMVENDEDOR, :PUNTOVTA, :NOMPUNTOVTA,
    :FACTURA, :COMIPORC, :COMIMONTO, :IMPTOS,
    :DTOPORC, :DTOMONTO, :ADICIONAL, :IVAMONTO, :RTEFTEPORC, :RTEFTEMONTO, :RTEIVAPORC, :RTEIVAMONTO, :RTEICAPORC, :RTEICAMONTO, :EXTRA, :TOTALFAC,
    :CONTACTO, :FAX, :DV, :CEL, :OBS, :SUCUR, :REMISION, :ANULADO;
SUBTOTAL = TOTALFAC - EXTRA - IVAMONTO - ADICIONAL + DTOMONTO;
TOTALPAGAR = TOTALFAC - RTEFTEMONTO - RTEIVAMONTO - RTEICAMONTO;
if (ANULADO = 'N') then
    EXECUTE PROCEDURE acumula_puntos_cliente (33, :id, :nit, :fecha) returning_values (:PUNTOS);
SELECT CLIE_COD, C.ZONA_COD, ZONA_NOM
    FROM CLIENTES C, ZONAS Z
    WHERE TERC_NIT = :NIT AND C.ZONA_COD = Z.ZONA_COD
    INTO :CODIGOCL, :ZONACOD, :ZONANOM;
SELECT CLSU_DIR, CLSU_CIUDAD, CLSU_TEL FROM CLIENTE_SUCURSALES WHERE TERC_NIT = :NIT AND CLCU_COD = :SUCUR
    INTO :DIRECCION, :CIUDAD, :TELEFONO;
    
SUMAEX = 0;
SUMA1 = 0;
SUMA2 = 0;
SUMA3 = 0;
IVA1 = 0;
IVA2 = 0;
IVA3 = 0;
TOTCONSUMO = 0;
ITEM = 0;
EXECUTE PROCEDURE lee_configuracion ('FACTURACION','DOCUMENTOS','ORDENAR ITEMS POR CODIGO DE ARTICULO') returning_values (:ORDENCOD);
if (ORDENCOD = 'SI') then
    BEGIN
    FOR SELECT D.ARTI_COD, DVDE_CODBAR, SUBSTR(DVDE_DESC,1,60), DVDE_CANT, DVDE_UNIDAD, BODE_COD, DVDE_LOTE, DVDE_PRUNIT, DVDE_DTOPORC, DVDE_DTOMONTO, DVDE_IVAPORC, DVDE_IVAMONTO, DVDE_CONSUMO, DVDE_TOTAL, DVDE_REFERENCIA,
        GRUP_COD, SUBG_COD, MARC_COD, ARTI_PESO, ARTI_ANCHO, ARTI_ALTO, ARTI_LARGO, TAIV_COD, DVDE_OBS, DVDE_FACTOR
        FROM DEVOLUCIONES_VENTAS_DETALLE D, ARTICULO A
        WHERE D.ARTI_COD = A.ARTI_COD AND D.DEVT_ID = :ID
        ORDER BY DVDE_CODBAR
        INTO :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :BODITEM, :LOTE, :PRUNIT, :DTOITPORC, :DTOITMONTO, :IVAPORC, :IVAITMONTO, :CONSUMO, :TOTAL, :REFITEM,
        :GRUPO, :SUBGRUPO, :MARCA, :PESO, :ANCHO, :ALTO, :LARGO, :TARIFA, :obsitem, :FACTOR
        DO
        BEGIN
        if (ARTICULO = CODBAR) then
            SELECT FIRST 1 COBA_COD FROM barras_articulo WHERE ARTI_COD = :articulo INTO :CODBAR;
        ITEM = ITEM + 1;
        if (ICOINC = 'SI') then
            SUBTOTIT = TOTAL - IVAITMONTO;
        else
            SUBTOTIT = TOTAL - IVAITMONTO - CONSUMO;
        PRNETO = PRUNIT - DTOITMONTO;
        if (PESO IS NULL) then
            PESO = 0;
        PESO = PESO / 1000 * CANT * FACTOR;
        if (IMPTOS = 'S') then
            if (cant <> 0) then
                prnetosiniva = PRUNIT - DTOITMONTO - ((IVAITMONTO+CONSUMO) / CANT);
            else
                prnetosiniva = PRUNIT - DTOITMONTO;
        ELSE
            prnetosiniva = PRUNIT - DTOITMONTO;
        TOTCONSUMO = TOTCONSUMO + CONSUMO;
        if ((REFITEM <> '.t') or (REFITEM IS NULL)) then
            BEGIN
            /* NO SUME LOS ENSAMBLES */
            if (IVAPORC = 0) then
                SUMAEX = SUMAEX + TOTAL;
            if (TARIFA = 1) then
                BEGIN
                SUMA1 = SUMA1 + TOTAL - IVAITMONTO;
                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;
            END
        if (substr(ARTICULO,1,2) = '.t') then
            BEGIN
            REFITEM = '';
            TOTAL = 0;
            END
        SELECT FIRST 1 UNAR_FACCAN FROM unidad_articulo WHERE ARTI_COD = :articulo INTO :factcant;
        ALTERNATIVAS = FLOOR(CANT / factcant);
        PRINCIPALES = CANT - (alternativas * factcant);
        SUSPEND;
        END
    END
ELSE
    BEGIN
    FOR SELECT D.ARTI_COD, DVDE_CODBAR, SUBSTR(DVDE_DESC,1,60), DVDE_CANT, DVDE_UNIDAD, BODE_COD, DVDE_LOTE, DVDE_PRUNIT, DVDE_DTOPORC, DVDE_DTOMONTO, DVDE_IVAPORC, DVDE_IVAMONTO, DVDE_CONSUMO, DVDE_TOTAL, DVDE_REFERENCIA,
        GRUP_COD, SUBG_COD, MARC_COD, ARTI_PESO, ARTI_ANCHO, ARTI_ALTO, ARTI_LARGO, TAIV_COD, DVDE_OBS, DVDE_FACTOR
        FROM DEVOLUCIONES_VENTAS_DETALLE D, ARTICULO A
        WHERE D.ARTI_COD = A.ARTI_COD AND D.DEVT_ID = :ID
        ORDER BY DVDE_ITEM
        INTO :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :BODITEM, :LOTE, :PRUNIT, :DTOITPORC, :DTOITMONTO, :IVAPORC, :IVAITMONTO, :CONSUMO, :TOTAL, :REFITEM,
        :GRUPO, :SUBGRUPO, :MARCA, :PESO, :ANCHO, :ALTO, :LARGO, :TARIFA, :obsitem, :FACTOR
        DO
        BEGIN
        if (ARTICULO = CODBAR) then
            SELECT FIRST 1 COBA_COD FROM barras_articulo WHERE ARTI_COD = :articulo INTO :CODBAR;
        SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :GRUPO INTO NOMGRUPO;
        SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :MARCA INTO NOMMARCA;
        SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :SUBGRUPO AND GRUP_COD = :GRUPO INTO :NOMSUBG;
        ITEM = ITEM + 1;
        if (ICOINC = 'SI') then
            SUBTOTIT = TOTAL - IVAITMONTO;
        else
            SUBTOTIT = TOTAL - IVAITMONTO - CONSUMO;
        PRNETO = PRUNIT - DTOITMONTO;
        if (PESO IS NULL) then
            PESO = 0;
        PESO = PESO / 1000 * CANT * FACTOR;
        if (IMPTOS = 'S') then
            if (cant <> 0) then
                prnetosiniva = PRUNIT - DTOITMONTO - ((IVAITMONTO+CONSUMO) / CANT);
            else
                prnetosiniva = PRUNIT - DTOITMONTO;
        ELSE
            prnetosiniva = PRUNIT - DTOITMONTO;
        TOTCONSUMO = TOTCONSUMO + CONSUMO;
        if ((REFITEM <> '.t') or (REFITEM IS NULL)) then
            BEGIN
            /* NO SUME LOS ENSAMBLES */
            if (IVAPORC = 0) then
                SUMAEX = SUMAEX + TOTAL;
            if (TARIFA = 1) then
                BEGIN
                SUMA1 = SUMA1 + TOTAL - IVAITMONTO;
                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;
            END
        if (substr(ARTICULO,1,2) = '.t') then
            BEGIN
            REFITEM = '';
            TOTAL = 0;
            END
        SELECT FIRST 1 UNAR_FACCAN FROM unidad_articulo WHERE ARTI_COD = :articulo INTO :factcant;
        ALTERNATIVAS = FLOOR(CANT / factcant);
        PRINCIPALES = CANT - (alternativas * factcant);
        SUSPEND;
        END
    END
END

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE IMPR_FACTURA(
    ID INTEGER)
RETURNS (
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    VENCE DATE,
    DIASVENCE INTEGER,
    CONTCRED CHAR(17),
    NIT VARCHAR(20),
    NOMTERCERO VARCHAR(60),
    NOMCLIENTE VARCHAR(60),
    VENDEDOR INTEGER,
    NOMVENDEDOR VARCHAR(60),
    PUNTOVTA INTEGER,
    NOMPUNTOVTA VARCHAR(30),
    CODBODEGA VARCHAR(2),
    NOMBODEGA VARCHAR(30),
    AUTORIZACION VARCHAR(20),
    DESPACHO VARCHAR(255),
    TRANSPORTADOR VARCHAR(60),
    COTIZACION VARCHAR(30),
    PEDIDO VARCHAR(30),
    REMISION VARCHAR(30),
    PACIENTE VARCHAR(20),
    NOMPACIENTE VARCHAR(60),
    COMIPORC NUMERIC(9,2),
    COMIMONTO NUMERIC(18,2),
    SUBTOTAL NUMERIC(18,2),
    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),
    EXTRA NUMERIC(18,2),
    DTOFPORC NUMERIC(9,2),
    DTOFMONTO NUMERIC(18,2),
    FECHADTO DATE,
    TOTALFAC NUMERIC(18,2),
    TOTALPAGAR NUMERIC(18,2),
    OBS BLOB SUB_TYPE 1 SEGMENT SIZE 80,
    ITEM INTEGER,
    ARTICULO VARCHAR(15),
    CODBAR VARCHAR(15),
    ARTIDES VARCHAR(60),
    DESCORTA VARCHAR(30),
    CANT NUMERIC(18,4),
    LOTE VARCHAR(15),
    VLOTE DATE,
    UNIDAD VARCHAR(8),
    CAJAS NUMERIC(18,4),
    FACTOR NUMERIC(18,4),
    LISTAPR INTEGER,
    REFITEM VARCHAR(60),
    BODITEM VARCHAR(2),
    STAND VARCHAR(15),
    PRUNIT NUMERIC(18,2),
    DTOITPORC NUMERIC(9,2),
    DTOITMONTO NUMERIC(18,2),
    PRNETO NUMERIC(18,2),
    PRNETOSINIVA NUMERIC(18,2),
    DTOIT1 NUMERIC(9,2),
    DTOIT2 NUMERIC(9,2),
    DTOIT3 NUMERIC(9,2),
    IVAPORC NUMERIC(9,2),
    IVAITMONTO NUMERIC(18,2),
    CONSUMO NUMERIC(18,2),
    SUBTOTIT NUMERIC(18,2),
    TOTAL NUMERIC(18,2),
    CODIGOCL VARCHAR(20),
    ZONACOD VARCHAR(2),
    ZONANOM VARCHAR(60),
    DV CHAR(1),
    DIRECCION VARCHAR(60),
    CIUDAD VARCHAR(40),
    TELEFONO VARCHAR(40),
    CONTACTO VARCHAR(60),
    FAX VARCHAR(25),
    CEL VARCHAR(25),
    GRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    SUBGRUPO VARCHAR(3),
    NOMSUBG VARCHAR(30),
    MARCA VARCHAR(3),
    NOMMARCA VARCHAR(30),
    PESO NUMERIC(18,4),
    ANCHO NUMERIC(18,4),
    ALTO NUMERIC(18,4),
    LARGO NUMERIC(18,4),
    SUMA1 NUMERIC(18,2),
    SUMA2 NUMERIC(18,2),
    SUMA3 NUMERIC(18,2),
    IVA1 NUMERIC(18,2),
    IVA2 NUMERIC(18,2),
    IVA3 NUMERIC(18,2),
    SUMAEX NUMERIC(18,2),
    SUMAGR NUMERIC(18,2),
    TOTCONSUMO NUMERIC(18,2),
    DTOIT1M NUMERIC(18,2),
    DTOIT2M NUMERIC(18,2),
    DTOIT3M NUMERIC(18,2),
    TOTCAJAS NUMERIC(18,2),
    VEHICULO VARCHAR(8),
    RECIBIDO NUMERIC(18,2),
    CAMBIO NUMERIC(18,2),
    HORA TIME,
    FORMAPAGO1 VARCHAR(30),
    MONTOPAGO1 NUMERIC(18,2),
    FORMAPAGO2 VARCHAR(30),
    MONTOPAGO2 NUMERIC(18,2),
    FORMAPAGO3 VARCHAR(30),
    MONTOPAGO3 NUMERIC(18,2),
    PUNTOS INTEGER,
    PUNTOSACUM INTEGER,
    PUNTOSVENC INTEGER,
    FECPTOS DATE,
    OBSITEM BLOB SUB_TYPE 1 SEGMENT SIZE 80,
    SUCUR VARCHAR(10),
    ALTERNATIVAS NUMERIC(18,4),
    PRINCIPALES NUMERIC(18,4))
AS
DECLARE VARIABLE IMPTOS CHAR(1);
DECLARE VARIABLE TARIFA INTEGER;
declare variable DEVUELTO NUMERIC(18,2);
declare variable ORDENCOD CHAR(2);
declare variable IMPRDEV CHAR(2);
declare variable IMPR CHAR(1);
declare variable ITEMFP INTEGER;
declare variable FORMAP VARCHAR(30);
declare variable MONTOP NUMERIC(18,2);
declare variable ICOINC CHAR(2);
declare variable DTOITM1 NUMERIC(18,2);
declare variable DTOITM2 NUMERIC(18,2);
declare variable DTOITM3 NUMERIC(18,2);
declare variable DTOITE3 CHAR(2);
declare variable SUMDTOIT NUMERIC(18,2);
declare variable AUTORET VARCHAR(10);
declare variable FAUTORET DATE;
declare variable FACTCANT NUMERIC(18,4);
declare variable ANULADO CHAR(1);
BEGIN
execute procedure lee_configuracion('FACTURACION', 'ARTICULOS', 'IMPOCONSUMO INCLUIDO EN EL PRECIO BASE DE VENTA ANTES DE IVA') returning_values (icoinc);
execute procedure lee_configuracion('FACTURACION', 'FACTURAS', 'COLUMNAS DE DESCUENTO POR ITEM ADICIONALES') returning_values (DTOITE3);
SELECT F.PREF_PRE, FACT_NUMERO, FACT_FECHA, FACT_VENCE, F.BODE_COD, BODE_NOM, F.TERC_NIT, FACT_NOMCLIENTE, F.VEND_COD, VEND_NOMBRE, F.PTVT_ID, PTVT_NOM,
    AUTO_NUMERO, FACT_DESPACHO, FACT_TRANSP, FACT_COTIZACI, FACT_PEDIDO, FACT_REMISION, FACT_COMIPORC, FACT_COMIMONTO, FACT_IVAINC, 
    FACT_DTOPOR, FACT_DTOMONTO, FACT_ADICIONAL, FACT_IVAMONTO, FACT_RTFTEPOR, FACT_RTFTEMONTO, FACT_RTIVAPOR, FACT_RTIVAMONTO, FACT_RTICAPOR, FACT_RTICAMONTO, FACT_EXTRA, FACT_DTOFPOR, FACT_DTOFMONTO, FACT_DTOFFECHA, FACT_TOTAL,
    TERC_DIR, TERC_CIU, TERC_TEL, TERC_CONTACTO, TERC_FAX, TERC_DV, TERC_CEL, FACT_DTOIT1, FACT_DTOIT2, FACT_DTOIT3,
    FACT_OBS, VEHI_COD, /*FACT_NROCOPIA,*/ FACT_RECIBIDO, FACT_SUCURSAL, FACT_DETCLI, FACT_DETCLINOM, TERC_NOM, FACT_ANULADO
    FROM FACTURAS F, BODEGA B, VENDEDORES V, PUNTO_VENTA P, TERCEROS T
    WHERE F.BODE_COD = B.BODE_COD AND F.VEND_COD = V.VEND_COD AND F.PTVT_ID = P.PTVT_ID AND F.TERC_NIT = T.TERC_NIT AND F.FACT_ID = :ID
    into :PREF, :NUMERO, :FECHA, :VENCE, :CODBODEGA, :NOMBODEGA, :NIT, :NOMTERCERO, :VENDEDOR, :NOMVENDEDOR, :PUNTOVTA, :NOMPUNTOVTA,
    :AUTORIZACION, :DESPACHO, :TRANSPORTADOR, :COTIZACION, :PEDIDO, :REMISION, :COMIPORC, :COMIMONTO, :IMPTOS,
    :DTOPORC, :DTOMONTO, :ADICIONAL, :IVAMONTO, :RTEFTEPORC, :RTEFTEMONTO, :RTEIVAPORC, :RTEIVAMONTO, :RTEICAPORC, :RTEICAMONTO, :EXTRA, :DTOFPORC, :DTOFMONTO, :FECHADTO, :TOTALFAC,
    :DIRECCION, :CIUDAD, :TELEFONO, :CONTACTO, :FAX, :DV, :CEL, :dtoit1m, :dtoit2m, :dtoit3m,
    :OBS, :VEHICULO,/* :NROCOPIA,*/ :RECIBIDO, :SUCUR, :paciente, :nompaciente, :nomcliente, :ANULADO;

/* ACUMULE LOS PUNTOS, SE HACE ACA POR SER POSTERIOR AL DETALLE */
if (ANULADO = 'N') then
    EXECUTE PROCEDURE acumula_puntos_cliente (31, :id, :nit, :fecha) returning_values (:PUNTOS);
EXECUTE PROCEDURE consulta_puntos_cliente (:id, :nit, :fecha) returning_values (:puntos, :puntosacum, :puntosvenc, :fecptos);
if (DTOIT1M IS NULL) then
    DTOIT1M = 0;
if (DTOIT2M IS NULL) then
    DTOIT2M = 0;
if (DTOIT3M IS NULL) then
    DTOIT3M = 0;
SELECT CLIE_COD, C.ZONA_COD, ZONA_NOM
    FROM CLIENTES C, ZONAS Z
    WHERE TERC_NIT = :NIT AND C.ZONA_COD = Z.ZONA_COD
    INTO :CODIGOCL, :ZONACOD, :ZONANOM;
SELECT CLSU_DIR, CLSU_CIUDAD, CLSU_TEL FROM CLIENTE_SUCURSALES WHERE TERC_NIT = :NIT AND CLCU_COD = :SUCUR
    INTO :DIRECCION, :CIUDAD, :TELEFONO;
DIASVENCE = VENCE - FECHA;
if (DIASVENCE > 0) then
    CONTCRED = 'CREDITO ' || CAST(DIASVENCE AS VARCHAR(3)) || ' DIAS';
ELSE
    CONTCRED = 'CONTADO';
SUBTOTAL = TOTALFAC - EXTRA - IVAMONTO - ADICIONAL + DTOMONTO;
if (DTOITE3 = 'SI') then
    BEGIN
    SELECT SUM(FADE_DTOMONTO) FROM FACTURAS_DETALLE WHERE FACT_ID = :id INTO :sumdtoit;
    SUBTOTAL = SUBTOTAL + sumdtoit + dtoit1m + dtoit2m + dtoit3m;
    END
EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'FECHA AUTORETENEDOR NO DESCONTAR RETENCIONES DEL SALDO PERO SI CONTABILIZARLAS') returning_values (AUTORET);
if (AUTORET <> '') then
    FAUTORET = CAST(AUTORET AS DATE);
else
    FAUTORET = '9999/12/31';
if (FECHA > fautoret) then
    TOTALPAGAR = TOTALFAC - RTEIVAMONTO - RTEICAMONTO;
ELSE
    TOTALPAGAR = TOTALFAC - RTEFTEMONTO - RTEIVAMONTO - RTEICAMONTO;
if (RECIBIDO <> 0) then
    CAMBIO = RECIBIDO - totalpagar;
ELSE
    CAMBIO = 0;
SUMAEX = 0;
SUMA1 = 0;
SUMA2 = 0;
SUMA3 = 0;
IVA1 = 0;
IVA2 = 0;
IVA3 = 0;
TOTCONSUMO = 0;
MONTOPAGO1 = 0;
SELECT MAX(AUDI_HORA) FROM AUDITORIA WHERE TIDO_COD = 31 AND AUDI_IDDOC = :ID AND AUDI_OPER = 'I' INTO :HORA;
/* AHORA LAS FORMAS DE PAGO, BUSQUE EL ABONO DE HOY A LA FACTURA */
ITEMFP = 1;
MONTOPAGO1 = 0;
MONTOPAGO2 = 0;
MONTOPAGO3 = 0;
FOR SELECT FOPA_NOM, RCPA_MONTO FROM RECIBOS_CAJA_PAGO P, FORMAS_PAGO F, RECIBOS_CAJA R, RECIBOS_CAJA_DETALLE D
    WHERE R.RECA_ID = P.RECA_ID AND R.RECA_ID = D.RECA_ID AND P.FOPA_ID = F.FOPA_ID AND RECA_FECHA = :FECHA AND RCDE_TIPODOC = 31 AND RCDE_IDDOC = :ID
    INTO :formap, :MONTOP
    DO
    BEGIN
    if (ITEMFP = 1) then
        BEGIN
        FORMAPAGO1 = FORMAP;
        MONTOPAGO1 = MONTOP;
        END
    if (ITEMFP = 2) then
        BEGIN
        FORMAPAGO2 = FORMAP;
        MONTOPAGO2 = MONTOP;
        END
    if (ITEMFP = 3) then
        BEGIN
        FORMAPAGO3 = FORMAP;
        MONTOPAGO3 = MONTOP;
        END
    ITEMFP = ITEMFP + 1;
    END
EXECUTE PROCEDURE lee_configuracion ('FACTURACION','DOCUMENTOS','ORDENAR ITEMS POR CODIGO DE ARTICULO') returning_values (:ORDENCOD);
EXECUTE PROCEDURE lee_configuracion ('FACTURACION','POS', 'IMPRIMIR DEVOLUCIONES DE ARTICULOS NEGATIVOS') returning_values (:imprdev);
totcajas = 0;
if (ORDENCOD = 'SI') then
    BEGIN
    FOR SELECT FADE_ITEM, D.ARTI_COD, FADE_CODBAR, SUBSTR(FADE_DESC,1,60), ARTI_DESCORTA, FADE_CANT, FADE_UNIDAD, FADE_FACTOR, BODE_COD, FADE_LOTE, LIPR_COD, FADE_PRUNIT, FADE_DTOPORC, FADE_DTOMONTO, FADE_IVAPORC, FADE_IVAMONTO, FADE_CONSUMO, FADE_TOTAL, FADE_REFERENCIA,
        GRUP_COD, SUBG_COD, MARC_COD, ARTI_PESO, ARTI_ANCHO, ARTI_ALTO, ARTI_LARGO, TAIV_COD, FADE_DEVUELTO, FADE_OBS, FADE_DTO1, FADE_DTO2, FADE_DTO3, FADE_DTOM1, FADE_DTOM2, FADE_DTOM3, FADE_CAJAS
        FROM FACTURAS_DETALLE D, ARTICULO A
        WHERE D.ARTI_COD = A.ARTI_COD AND D.FACT_ID = :ID
        ORDER BY D.ARTI_COD
        INTO :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :DESCORTA, :CANT, :UNIDAD, :FACTOR, :BODITEM, :LOTE, :LISTAPR, :PRUNIT, :DTOITPORC, :DTOITMONTO, :IVAPORC, :IVAITMONTO, :CONSUMO, :TOTAL, :refitem,
        :GRUPO, :SUBGRUPO, :MARCA, :PESO, :ANCHO, :ALTO, :LARGO, :TARIFA, :devuelto, :obsitem, :dtoit1, :dtoit2, :dtoit3, :dtoitm1, :dtoitm2, :dtoitm3, :cajas
        DO
          BEGIN
          if (ARTICULO = CODBAR) then
            SELECT FIRST 1 COBA_COD FROM barras_articulo WHERE ARTI_COD = :articulo INTO :CODBAR;
          if (IMPRDEV <> 'SI') then
            BEGIN
            if ((CANT >= 0) AND (DEVUELTO = 0)) then
                IMPR = 'S';
            ELSE
                IMPR = 'N'; /* ES DEVOLUCION */
            END
          ELSE
            IMPR = 'S';
          if (IMPR = 'S') then
            BEGIN
            prneto = PRUNIT - DTOITMONTO - dtoitm1 - dtoitm2 - dtoitm3;
            if (IMPTOS = 'S') then
                if (cant <> 0) then
                    prnetosiniva = PRUNIT - DTOITMONTO - ((IVAITMONTO+CONSUMO) / CANT) - dtoitm1 - dtoitm2 - dtoitm3;
                else
                    prnetosiniva = PRUNIT - DTOITMONTO - dtoitm1 - dtoitm2 - dtoitm3;
            ELSE
                prnetosiniva = PRUNIT - DTOITMONTO - dtoit1m - dtoit2m - dtoit3m;
            if (ICOINC = 'SI') then
                SUBTOTIT = TOTAL - IVAITMONTO;
            else
                SUBTOTIT = TOTAL - IVAITMONTO - CONSUMO;
            TOTCONSUMO = TOTCONSUMO + CONSUMO;
            SELECT LOTE_VENCE FROM LOTES WHERE LOTE_NRO = :lote AND ARTI_COD = :ARTICULO AND BODE_COD = :boditem INTO :vlote;
            if ((REFITEM <> '.t') or (REFITEM IS NULL)) then
                BEGIN
                /* NO SUME LOS ENSAMBLES */
                if (IVAPORC = 0) then
                    SUMAEX = SUMAEX + TOTAL;
                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;
                END
            if (ANCHO IS NULL) then
                ANCHO = 0;
            if (ALTO IS NULL) then
                ALTO = 0;
            if (LARGO IS NULL) then
                LARGO = 0;
            if (PESO IS NULL) then
                PESO = 0;
            PESO = (PESO / 1000) * CANT * FACTOR;
            totcajas = totcajas + cajas;
            if (substr(ARTICULO,1,2) = '.t') then
                BEGIN
                REFITEM = '';
                TOTAL = 0;
                SUBTOTIT = 0;
                END
            SELECT STAND_COD FROM STANDS WHERE ARTI_COD = :ARTICULO AND STAND_BODEGA = :boditem INTO :stand;
            SELECT FIRST 1 UNAR_FACCAN FROM unidad_articulo WHERE ARTI_COD = :articulo INTO :factcant;
            ALTERNATIVAS = FLOOR(CANT / factcant);
            PRINCIPALES = CANT - (alternativas * factcant);
            SUSPEND;
            END
          END
    END
ELSE
    BEGIN
    FOR SELECT FADE_ITEM, D.ARTI_COD, FADE_CODBAR, SUBSTR(FADE_DESC,1,60), ARTI_DESCORTA, FADE_CANT, FADE_UNIDAD, FADE_FACTOR, BODE_COD, FADE_LOTE, LIPR_COD, FADE_PRUNIT, FADE_DTOPORC, FADE_DTOMONTO, FADE_IVAPORC, FADE_IVAMONTO, FADE_CONSUMO, FADE_TOTAL, FADE_REFERENCIA,
        GRUP_COD, SUBG_COD, MARC_COD, ARTI_PESO, ARTI_ANCHO, ARTI_ALTO, ARTI_LARGO, TAIV_COD, FADE_DEVUELTO, FADE_OBS, FADE_DTO1, FADE_DTO2, FADE_DTO3, FADE_DTOM1, FADE_DTOM2, FADE_DTOM3, FADE_CAJAS
        FROM FACTURAS_DETALLE D, ARTICULO A
        WHERE D.ARTI_COD = A.ARTI_COD AND D.FACT_ID = :ID
        ORDER BY FADE_ITEM
        INTO :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :DESCORTA, :CANT, :UNIDAD, :FACTOR, :BODITEM, :LOTE, :LISTAPR, :PRUNIT, :DTOITPORC, :DTOITMONTO, :IVAPORC, :IVAITMONTO, :CONSUMO, :TOTAL, :refitem,
        :GRUPO, :SUBGRUPO, :MARCA, :PESO, :ANCHO, :ALTO, :LARGO, :TARIFA, :devuelto, :obsitem, :dtoit1, :dtoit2, :dtoit3, :dtoitm1, :dtoitm2, :dtoitm3, :cajas
        DO
          BEGIN
          if (IMPRDEV <> 'SI') then
            BEGIN
            if ((CANT >= 0) AND (DEVUELTO = 0)) then
                IMPR = 'S';
            ELSE
                IMPR = 'N'; /* ES DEVOLUCION */
            END
          ELSE
            IMPR = 'S';
          if (IMPR = 'S') then
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :GRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :MARCA INTO NOMMARCA;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :SUBGRUPO AND GRUP_COD = :GRUPO INTO :NOMSUBG;
            prneto = PRUNIT - DTOITMONTO - dtoitm1 - dtoitm2 - dtoitm3;
            if (IMPTOS = 'S') then
                if (cant <> 0) then
                    prnetosiniva = PRUNIT - DTOITMONTO - ((IVAITMONTO+CONSUMO) / CANT) - dtoit1m - dtoit2m - dtoit3m;
                else
                    prnetosiniva = PRUNIT - DTOITMONTO - dtoitm1 - dtoitm2 - dtoitm3;
            ELSE
                prnetosiniva = PRUNIT - DTOITMONTO - dtoitm1 - dtoitm2 - dtoitm3;
            if (ICOINC = 'SI') then
                SUBTOTIT = TOTAL - IVAITMONTO;
            else
                SUBTOTIT = TOTAL - IVAITMONTO - CONSUMO;
            TOTCONSUMO = TOTCONSUMO + CONSUMO;
            SELECT LOTE_VENCE FROM LOTES WHERE LOTE_NRO = :lote AND ARTI_COD = :ARTICULO AND BODE_COD = :boditem INTO :vlote;
            if ((REFITEM <> '.t') or (REFITEM IS NULL)) then
                BEGIN
                /* NO SUME LOS ENSAMBLES */
                if (IVAPORC = 0) then
                    SUMAEX = SUMAEX + TOTAL;
                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;
                END
            if (ANCHO IS NULL) then
                ANCHO = 0;
            if (ALTO IS NULL) then
                ALTO = 0;
            if (LARGO IS NULL) then
                LARGO = 0;
            if (PESO IS NULL) then
                PESO = 0;
            PESO = (PESO / 1000)* CANT * FACTOR;
            totcajas = totcajas + cajas;
            if (substr(ARTICULO,1,2) = '.t') then
                BEGIN
                REFITEM = '';
                TOTAL = 0;
                SUBTOTIT = 0;
                END
            SELECT STAND_COD FROM STANDS WHERE ARTI_COD = :ARTICULO AND STAND_BODEGA = :boditem INTO :stand;
            SELECT FIRST 1 UNAR_FACCAN FROM unidad_articulo WHERE ARTI_COD = :articulo INTO :factcant;
            ALTERNATIVAS = FLOOR(CANT / factcant);
            PRINCIPALES = CANT - (alternativas * factcant);
            SUSPEND;
            END
          END
    END
END

^

SET TERM ; ^


/* 20090505 UTILIDADES MAS PRECISAS AUN CON MOVIMIENTOS QUE NO AFECTAN EL INVENTARIO */
SET TERM ^ ;

CREATE OR ALTER PROCEDURE COSTO_PROMEDIO(
    ARTICULO VARCHAR(15),
    FECHA DATE)
RETURNS (
    COSTOP NUMERIC(18,2))
AS
declare variable saldop numeric(18,2);
declare variable saldoc numeric(15,4);
declare variable entp numeric(18,2);
declare variable entc numeric(15,4);
BEGIN
SELECT first 1 COST_SALDOP, COST_ENTP,COST_SALDOC, COST_ENTC FROM COSTOS
    WHERE (ARTI_COD = :ARTICULO) AND (COST_FECHA <= :FECHA)
    order by COST_FECHA DESC, cost_item desc
    INTO :SALDOP, ENTP, :SALDOC, ENTC;
IF (SALDOC IS NULL) THEN
    COSTOP = 0;
ELSE
    if ((SALDOC < 0) AND (SALDOC+ENTC > 0)) then
        COSTOP = ENTP/ENTC;
    else
        /* Cuando hay existencia calcule el promedio, de otra manera retorne el ultimo */
        if (SALDOC+ENTC > 0) then
            COSTOP = (SALDOP+ENTP) / (SALDOC+ENTC);
        else
            COSTOP = 0;
SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE COSTO_EN_VENTAS(
    TIPO INTEGER,
    ID INTEGER)
AS
declare variable FECHA DATE;
declare variable ARTICULO VARCHAR(20);
declare variable CANTIDAD NUMERIC(18,4);
declare variable COSTO NUMERIC(18,2);
declare variable CTACOSTO VARCHAR(20);
declare variable CTAINVEN VARCHAR(20);
BEGIN /*$$IBE$$ 
DELETE FROM COSTO_VENTAS;
if (TIPO = 31) then
    BEGIN
     $$IBE$$*/ /* FACTURA DE VENTA */ /*$$IBE$$ 
    FOR SELECT D.ARTI_COD, FADE_CANT * FADE_FACTOR, FACT_FECHA
        FROM ARTICULO A, FACTURAS F, FACTURAS_DETALLE D
        WHERE F.FACT_ID = D.FACT_ID AND A.ARTI_COD = D.ARTI_COD AND F.FACT_ID = :ID AND FACT_ANULADO = 'N'
        INTO :ARTICULO, :CANTIDAD, :FECHA
        DO
        BEGIN
        SELECT COAR_CTACOS, COAR_CTAINV FROM CONTABIL_ARTICULO WHERE ARTI_COD = :articulo INTO :CTACOSTO, :CTAINVEN;
        EXECUTE PROCEDURE COSTO_PROMEDIO(:ARTICULO, :FECHA) returning_values (:COSTO);
        INSERT INTO COSTO_VENTAS VALUES (:ARTICULO, :CANTIDAD, :COSTO, :CTACOSTO, :CTAINVEN);
        END
    END
if (TIPO = 32) then
    BEGIN
     $$IBE$$*/ /* REMISION */ /*$$IBE$$ 
    FOR SELECT D.ARTI_COD, RVDE_CANT * RVDE_FACTOR, REVT_FECHA
        FROM ARTICULO A, REMISIONES_VENTA R, REMISIONES_VENTA_DETALLE D
        WHERE R.REVT_ID = D.REVT_ID AND A.ARTI_COD = D.ARTI_COD AND R.REVT_ID = :ID AND REVT_ANULADO = 'N'
        INTO :ARTICULO, :CANTIDAD, :FECHA
        DO
        BEGIN
        SELECT COAR_CTACOS, COAR_CTAINV FROM CONTABIL_ARTICULO WHERE ARTI_COD = :articulo INTO :CTACOSTO, :CTAINVEN;
        EXECUTE PROCEDURE COSTO_PROMEDIO(:ARTICULO, :FECHA) returning_values (:COSTO);
        INSERT INTO COSTO_VENTAS VALUES (:ARTICULO, :CANTIDAD, :COSTO, :CTACOSTO, :CTAINVEN);
        END
    END
if (TIPO = 33) then
    BEGIN
     $$IBE$$*/ /* DEVOLUCION */ /*$$IBE$$ 
    FOR SELECT D.ARTI_COD, DVDE_CANT * DVDE_FACTOR, DEVT_FECHA
        FROM ARTICULO A, DEVOLUCIONES_VENTAS DV, DEVOLUCIONES_VENTAS_DETALLE D
        WHERE DV.DEVT_ID = D.DEVT_ID AND A.ARTI_COD = D.ARTI_COD AND DV.DEVT_ID = :ID AND DEVT_ANULADO = 'N'
        INTO :ARTICULO, :CANTIDAD, :FECHA
        DO
        BEGIN
        SELECT COAR_CTACOS, COAR_CTAINV FROM CONTABIL_ARTICULO WHERE ARTI_COD = :articulo INTO :CTACOSTO, :CTAINVEN;
        EXECUTE PROCEDURE COSTO_PROMEDIO(:ARTICULO, :FECHA) returning_values (:COSTO);
        INSERT INTO COSTO_VENTAS VALUES (:ARTICULO, :CANTIDAD, :COSTO, :CTACOSTO, :CTAINVEN);
        END
    END
 $$IBE$$*/ EXIT;
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE COSTO_EN_VENTAS_CONTADO(
    FECFAC DATE,
    PREF VARCHAR(4),
    PTVTA INTEGER)
AS
declare variable ARTICULO VARCHAR(20);
declare variable CANTIDAD NUMERIC(18,4);
declare variable COSTO NUMERIC(18,2);
declare variable CTACOSTO VARCHAR(20);
declare variable CTAINVEN VARCHAR(20);
BEGIN /*$$IBE$$ 
    DELETE FROM COSTO_VENTAS;
     $$IBE$$*/ /* FACTURA DE VENTA */ /*$$IBE$$ 
    FOR SELECT MAX(D.ARTI_COD), SUM(FADE_CANT * FADE_FACTOR), MAX(COAR_CTACOS), MAX(COAR_CTAINV)
        FROM ARTICULO A, FACTURAS F, FACTURAS_DETALLE D, CONTABIL_ARTICULO C
        WHERE F.FACT_ID = D.FACT_ID AND A.ARTI_COD = D.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND FACT_ANULADO = 'N' AND FACT_FECHA = :FECFAC AND F.PREF_PRE = :PREF AND F.PTVT_ID = :PTVTA and substring(a.arti_cod from 1 FOR 2) <> '.t'
        GROUP BY D.ARTI_COD
        INTO :ARTICULO, :CANTIDAD, :CTACOSTO, :CTAINVEN
        DO
        BEGIN
        EXECUTE PROCEDURE COSTO_PROMEDIO(:ARTICULO, :FECFAC) returning_values (:COSTO);
        INSERT INTO COSTO_VENTAS VALUES (:ARTICULO, :CANTIDAD, :COSTO * :CANTIDAD, :CTACOSTO, :CTAINVEN);
        END
 $$IBE$$*/ EXIT;
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE COSTO_PROMEDIO_UNIDAD(
    ARTICULO VARCHAR(15),
    FECHA DATE,
    UNIDAD VARCHAR(8))
RETURNS (
    COSTO NUMERIC(18,2))
AS
declare variable FACTOR NUMERIC(15,4);
BEGIN /*$$IBE$$ 
  EXECUTE PROCEDURE COSTO_PROMEDIO(ARTICULO, FECHA) returning_values (COSTO);
  EXECUTE PROCEDURE FACTOR_UNIDAD_CANT(ARTICULO, UNIDAD) returning_values (FACTOR);
  COSTO = COSTO * FACTOR;
  SUSPEND;
 $$IBE$$*/ SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE IMPR_AJUSTE(
    ID INTEGER)
RETURNS (
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    CONCEPTO VARCHAR(60),
    CODBODEGA VARCHAR(2),
    NOMBODEGA VARCHAR(30),
    OBS BLOB SUB_TYPE 1 SEGMENT SIZE 80,
    AJUSTAR CHAR(2),
    ITEM INTEGER,
    ARTICULO VARCHAR(15),
    CODBAR VARCHAR(15),
    ARTIDES VARCHAR(60),
    EXANT NUMERIC(18,4),
    EXNUE NUMERIC(18,4),
    CANT NUMERIC(18,4),
    UNIDAD VARCHAR(8),
    BODITEM VARCHAR(2),
    LOTE VARCHAR(15),
    COSTO NUMERIC(18,2),
    TOTAL NUMERIC(18,2))
AS
BEGIN
  /*  */ /*$$IBE$$ 
  SELECT PREF_PRE, AJUS_NUMERO, AJUS_FECHA, AJUS_CONC, A.BODE_COD, BODE_NOM, AJUS_OBS, AJUS_NOAJUSTAR
    FROM AJUSTES A, BODEGA B WHERE A.BODE_COD = B.BODE_COD AND A.AJUS_ID = :ID into
    :PREF, :NUMERO, :FECHA, :CONCEPTO, :CODBODEGA, :NOMBODEGA, :OBS, :AJUSTAR;
  if (AJUSTAR = 'S') then
    AJUSTAR = 'NO';
  else
    AJUSTAR = 'SI';
  FOR SELECT AJUS_ITEM, A.ARTI_COD, AJUS_CODBAR, AJDE_DESC, AJUS_EXANT, AJUS_UNIDAD, BODE_COD, AJUS_EXNUE, AJUS_LOTE
    FROM AJUSTES_DETALLE D, ARTICULO A
    WHERE D.ARTI_COD = A.ARTI_COD AND D.AJUS_ID = :ID
    ORDER BY AJUS_ITEM
    INTO :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :EXANT, :UNIDAD, :BODITEM, :EXNUE, :LOTE
    DO
      BEGIN
      EXECUTE PROCEDURE COSTO_PROMEDIO(:ARTICULO, :FECHA) returning_values (:COSTO);
      CANT = EXNUE - EXANT;
      TOTAL = CANT * COSTO;
      SUSPEND;
      END
 $$IBE$$*/ SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

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

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE REP_COMPROBANTES_ARTICULO(
    TIPODOC INTEGER,
    DETALLE CHAR(1),
    FECINI DATE,
    FECFIN DATE,
    ARTINI VARCHAR(20),
    ARTFIN VARCHAR(20),
    GRPINI VARCHAR(2),
    GRPFIN VARCHAR(2),
    ORDEN CHAR(1),
    SUBEMPRESA INTEGER)
RETURNS (
    CODIGO VARCHAR(15),
    NOMBRE VARCHAR(60),
    UNIDAD VARCHAR(8),
    CODGRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    CODSUBG VARCHAR(3),
    NOMSUBG VARCHAR(30),
    CODMARC VARCHAR(3),
    NOMMARC VARCHAR(30),
    CODBOD VARCHAR(2),
    NOMTIPO VARCHAR(30),
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    CONCEPTO VARCHAR(60),
    NIT VARCHAR(20),
    NOMTERC VARCHAR(60),
    CONS INTEGER,
    CANT NUMERIC(18,4),
    COSTO NUMERIC(18,2),
    COSTOTOT NUMERIC(18,2))
AS
declare variable ENT CHAR(1);
declare variable ENTRADAS NUMERIC(18,4);
declare variable COSTOENT NUMERIC(18,2);
declare variable SALIDAS NUMERIC(18,4);
declare variable COSTOSAL NUMERIC(18,2);
declare variable CODINI VARCHAR(20);
declare variable CODFIN VARCHAR(20);
declare variable DESINI VARCHAR(20);
declare variable DESFIN VARCHAR(20);
BEGIN /*$$IBE$$ 
  SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = :TIPODOC INTO :NOMTIPO;
  if (ORDEN = 'C') then
    BEGIN
    CODINI = ARTINI;
    CODFIN = ARTFIN;
    DESINI = '';
    DESFIN = 'zz';
    END
  ELSE
    BEGIN
    DESINI = ARTINI;
    DESFIN = ARTFIN;
    CODINI = '';
    CODFIN = 'zz';
    END
  FOR
    SELECT ARTI_COD, ARTI_DES, ARTI_UNIDAD, A.GRUP_COD, A.SUBG_COD, A.MARC_COD
      FROM ARTICULO A
      WHERE ARTI_COD >= :CODINI AND ARTI_COD <= :CODFIN AND A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :GRPFIN AND ARTI_DES >= :DESINI AND ARTI_DES <= :DESFIN
      INTO :CODIGO, :NOMBRE, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
      DO
        BEGIN
        NOMMARC = '';
        NOMSUBG = '';
        SELECT GRUP_NOM FROM GRUPO WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
        SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
        SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
        if (DETALLE = 'N') then
            BEGIN
            CANT = 0;
            COSTOTOT = 0;
             $$IBE$$*/ /* SUME LAS ENTRADAS */ /*$$IBE$$ 
            SELECT SUM(MVAR_CANT), SUM(MVAR_CANT * MVAR_COSTO) FROM MOVIMIENTO_ARTICULO M, PREFIJOS P
              WHERE P.PREF_PRE = M.MVAR_PREF AND P.TIDO_COD = M.mvar_tipodoc AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA)) AND
              (MVAR_FECHA >= :FECINI) AND (MVAR_FECHA < :FECFIN) AND
              (ARTI_COD = :CODIGO) AND (MVAR_ENTRADA = 'S') AND (MVAR_TIPODOC = :TIPODOC)
              INTO :ENTRADAS, :COSTOENT;
            if (ENTRADAS IS NULL) then
              ENTRADAS = 0;
            if (COSTOENT IS NULL) then
              COSTOENT = 0;
             $$IBE$$*/ /* CALCULE LAS SALIDAS A COSTO PROMEDIO */ /*$$IBE$$ 
            SALIDAS = 0;
            COSTOSAL = 0;
            FOR SELECT MVAR_CANT, MVAR_FECHA
                FROM MOVIMIENTO_ARTICULO M, PREFIJOS P
                WHERE P.PREF_PRE = M.MVAR_PREF AND P.TIDO_COD = M.mvar_tipodoc AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA)) AND
                (MVAR_FECHA >= :FECINI) AND (MVAR_FECHA <= :FECFIN) AND
                (ARTI_COD = :CODIGO) AND (MVAR_ENTRADA = 'N') AND (MVAR_TIPODOC = :TIPODOC)
                INTO :CANT, :FECHA
                DO
                    BEGIN
                    EXECUTE PROCEDURE COSTO_PROMEDIO(:CODIGO, :FECHA) returning_values (:COSTO);
                    SALIDAS = SALIDAS + CANT;
                    COSTOSAL = COSTOSAL + (COSTO * CANT);
                    END
            if (SALIDAS IS NULL) then
              SALIDAS = 0;
            if (COSTOSAL IS NULL) then
              COSTOSAL = 0;
            if (ENTRADAS > 0) then
                CANT = ENTRADAS;
            if (SALIDAS > 0) then
                CANT = SALIDAS;
            if (COSTOENT > 0) then
                COSTOTOT = COSTOENT;
            if (COSTOSAL > 0) then
                COSTOTOT = COSTOSAL;
            if (CANT > 0) then
                COSTO = COSTOTOT / CANT;
            ELSE
                COSTO = 0;
            if (CANT <> 0) then
                SUSPEND;
            END
        ELSE
            BEGIN
            FOR SELECT MVAR_ENTRADA, MVAR_PREF, MVAR_NUMERO, MVAR_CANT, MVAR_COSTO, MVAR_CONC, MVAR_FECHA, M.TERC_NIT, TERC_NOM, MVAR_CONS, BODE_COD
                FROM MOVIMIENTO_ARTICULO M, TIPO_DOCUMENTO TD, PREFIJOS P
                LEFT OUTER JOIN TERCEROS T ON (M.TERC_NIT = T.TERC_NIT)
                WHERE TD.TIDO_COD = MVAR_TIPODOC AND P.PREF_PRE = M.MVAR_PREF AND P.TIDO_COD = M.mvar_tipodoc AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA)) AND
                (MVAR_FECHA >= :FECINI) AND (MVAR_FECHA < :FECFIN) AND (ARTI_COD = :CODIGO) AND (MVAR_TIPODOC = :TIPODOC)
                ORDER BY MVAR_FECHA, MVAR_CONS
                INTO :ENT, :PREFIJO, :NUMERO, :CANT, :COSTO, :CONCEPTO, :FECHA, :NIT, :NOMTERC, :CONS, :CODBOD
                DO
                    BEGIN
                    if (ENT = 'S') then
                        BEGIN
                        COSTOTOT = (CANT * COSTO);
                        end
                    ELSE
                        BEGIN
                        EXECUTE PROCEDURE COSTO_PROMEDIO(:CODIGO, :FECHA) returning_values (:COSTO);
                        COSTOTOT = (CANT * COSTO);
                        END
                    SUSPEND;
                    END
            END
        END
 $$IBE$$*/ SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE REP_COMPROBANTES_INV(
    TIPO INTEGER,
    DETALLE CHAR(1),
    FECINI DATE,
    FECFIN DATE,
    PREFIJO VARCHAR(4),
    ANULADOS CHAR(1),
    SUBEMPRESA INTEGER)
RETURNS (
    NOMTIPO VARCHAR(30),
    ID INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    VENCE DATE,
    CONCEPTO VARCHAR(60),
    REFER VARCHAR(60),
    CODBODORI VARCHAR(2),
    NOMBODORI VARCHAR(30),
    CODBODDES VARCHAR(2),
    NOMBODDES VARCHAR(30),
    NOMTERCERO VARCHAR(60),
    PRODCODBAR VARCHAR(15),
    PRODDES VARCHAR(60),
    PRODCANT NUMERIC(18,4),
    PRODUNIDAD VARCHAR(8),
    PRODLOTE VARCHAR(15),
    OBS BLOB SUB_TYPE 0 SEGMENT SIZE 80,
    ITEM INTEGER,
    ARTICULO VARCHAR(15),
    CODBAR VARCHAR(15),
    ARTIDES VARCHAR(60),
    CANT NUMERIC(18,4),
    EXANT NUMERIC(18,4),
    UNIDAD VARCHAR(8),
    BODITEM VARCHAR(2),
    COSTO NUMERIC(18,2),
    DTOPORC NUMERIC(9,2),
    DTOMONTO NUMERIC(18,2),
    IVAPORC NUMERIC(9,2),
    IVAMONTO NUMERIC(18,2),
    CONSUMO NUMERIC(18,2),
    SUBTOTAL NUMERIC(18,2),
    TOTAL NUMERIC(18,2),
    LOTE VARCHAR(15),
    ANULADO CHAR(1),
    OBSITEM BLOB SUB_TYPE 0 SEGMENT SIZE 80)
AS
BEGIN
  /* DETERMINE LA TABLA A EXAMINAR */ /*$$IBE$$ 
  if (BIN_AND(TIPO, 1) <> 0) then
    BEGIN
    SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 11 INTO :NOMTIPO;
    FOR SELECT ENTR_ID, E.PREF_PRE, ENTR_NUMERO, ENTR_FECHA, ENTR_CONC, ENTR_REFER, E.BODE_COD, BODE_NOM, ENTR_NOMTERC, ENTR_OBS, ENTR_ANULADO
    FROM ENTRADAS E, BODEGA B, PREFIJOS P
    WHERE E.BODE_COD = B.BODE_COD AND ENTR_FECHA >= :FECINI AND ENTR_FECHA <= :FECFIN
     AND P.PREF_PRE = E.PREF_PRE AND P.TIDO_COD = 11 AND ((P.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
    ORDER BY ENTR_FECHA, ENTR_ID
    INTO :ID, :PREF, :NUMERO, :FECHA, :CONCEPTO, :REFER, :CODBODORI, :NOMBODORI, :NOMTERCERO, :OBS, :ANULADO
    DO
        BEGIN
        if (((:PREFIJO = '') or (:PREF = :PREFIJO)) AND ((:ANULADOS = 'S') or (:ANULADO = 'N'))) then
            BEGIN
            if (anulado = 'S') then
             BEGIN
              ITEM = 0;
              ARTICULO = '';
              CODBAR = '';
              ARTIDES = '';
              CANT = 0;
              UNIDAD = '';
              BODITEM = '';
              lote = '';
              costo = 0;
              DTOPORC = 0;
              DTOMONTO = 0;
              IVAPORC = 0;
              IVAMONTO = 0;
              CONSUMO = 0;
              TOTAL = 0;
              OBSITEM = null;
              SUBTOTAL = 0;
              SUSPEND;
             END
            ELSE
             BEGIN
              if (DETALLE = 'S') then
                FOR SELECT ENDE_ITEM, A.ARTI_COD, ENDE_CODBAR, ENDE_DESC, ENDE_CANT, ENDE_UNIDAD, BODE_COD, ENDE_COSTO, ENDE_DTOPORC, ENDE_DTOMONTO, ENDE_IVAPORC, ENDE_IVAMONTO, ENDE_CONSUMO, ENDE_TOTAL, ENDE_LOTE, ENDE_OBS
                    FROM ENTRADAS_DETALLE D, ARTICULO A WHERE D.ARTI_COD = A.ARTI_COD AND D.ENTR_ID = :ID INTO
                    :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :BODITEM, :COSTO, :DTOPORC, :DTOMONTO, :IVAPORC, :IVAMONTO, :CONSUMO, :TOTAL, :LOTE, :OBSITEM
                    DO
                    BEGIN
                    SUBTOTAL = TOTAL - IVAMONTO - CONSUMO;
                    SUSPEND;
                    END
              ELSE
                BEGIN
                SELECT SUM(ENDE_IVAMONTO), SUM(ENDE_CONSUMO), SUM(ENDE_TOTAL)
                    FROM ENTRADAS_DETALLE D WHERE D.ENTR_ID = :ID INTO
                    :IVAMONTO, :CONSUMO, :TOTAL;
                SUBTOTAL = TOTAL - IVAMONTO - CONSUMO;
                SUSPEND;
                END
             END
            END
        END
    END
  if (BIN_AND(TIPO, 2) <> 0) then
    BEGIN
    SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 12 INTO :NOMTIPO;
    FOR SELECT SALI_ID, S.PREF_PRE, SALI_NUMERO, SALI_FECHA, SALI_CONC, SALI_REFER, S.BODE_COD, BODE_NOM, SALI_NOMTERC, SALI_OBS, SALI_ANULADO
    FROM SALIDAS S, BODEGA B, PREFIJOS P
    WHERE S.BODE_COD = B.BODE_COD AND SALI_FECHA >= :FECINI AND SALI_FECHA <= :FECFIN 
     AND P.PREF_PRE = S.PREF_PRE AND P.TIDO_COD = 12 AND ((P.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
    ORDER BY SALI_FECHA, SALI_ID
    into :ID, :PREF, :NUMERO, :FECHA, :CONCEPTO, :REFER, :CODBODORI, :NOMBODORI, :NOMTERCERO, :OBS, :ANULADO
    DO
        BEGIN
        if (((:PREFIJO = '') or (:PREF = :PREFIJO)) AND ((:ANULADOS = 'S') or (:ANULADO = 'N'))) then
            BEGIN
            if (anulado = 'S') then
             BEGIN
              ITEM = 0;
              ARTICULO = '';
              CODBAR = '';
              ARTIDES = '';
              CANT = 0;
              UNIDAD = '';
              BODITEM = '';
              lote = '';
              costo = 0;
              DTOPORC = 0;
              DTOMONTO = 0;
              IVAPORC = 0;
              IVAMONTO = 0;
              CONSUMO = 0;
              EXANT = 0;
              TOTAL = 0;
              OBSITEM = null;
              SUBTOTAL = 0;
              SUSPEND;
             END
            ELSE
             BEGIN
              if (DETALLE = 'S') then
                FOR SELECT SADE_ITEM, A.ARTI_COD, SADE_CODBAR, SADE_DESC, SADE_CANT, SADE_UNIDAD, BODE_COD, SADE_COSTO, SADE_IVAPORC, SADE_IVAMONTO, SADE_CONSUMO, SADE_TOTAL, SADE_LOTE, SADE_OBS
                    FROM SALIDAS_DETALLE D, ARTICULO A WHERE D.ARTI_COD = A.ARTI_COD AND D.SALI_ID = :ID INTO
                    :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :BODITEM, :COSTO, :IVAPORC, :IVAMONTO, :CONSUMO, :TOTAL, :LOTE, :OBSITEM
                    DO
                BEGIN
                SUBTOTAL = TOTAL - IVAMONTO - CONSUMO;
                SUSPEND;
                END
              ELSE
                BEGIN
                SELECT SUM(SADE_IVAMONTO), SUM(SADE_CONSUMO), SUM(SADE_TOTAL)
                    FROM SALIDAS_DETALLE D WHERE D.SALI_ID = :ID INTO
                    :IVAMONTO, :CONSUMO, :TOTAL;
                SUBTOTAL = TOTAL - IVAMONTO - CONSUMO;
                SUSPEND;
                END
             END
            END
        END
    END
  if (BIN_AND(TIPO, 4) <> 0) then
    BEGIN
    SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 13 INTO :NOMTIPO;
    FOR SELECT TRAN_ID, T.PREF_PRE, TRAN_NUMERO, TRAN_FECHA, TRAN_CONC, TRAN_REFER, T.BODE_COD, BO.BODE_NOM, TRAN_BODDES, BD.BODE_NOM, TRAN_OBS, TRAN_ANULADO
    FROM TRASFERENCIAS T, BODEGA BO, BODEGA BD, PREFIJOS P
    WHERE T.BODE_COD = BO.BODE_COD AND T.TRAN_BODDES = BD.BODE_COD AND TRAN_FECHA >= :FECINI AND TRAN_FECHA <= :FECFIN 
     AND P.PREF_PRE = T.PREF_PRE AND P.TIDO_COD = 13 AND ((P.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
    ORDER BY TRAN_FECHA, TRAN_ID
    into :ID, :PREF, :NUMERO, :FECHA, :CONCEPTO, :REFER, :CODBODORI, :NOMBODORI, :CODBODDES, :NOMBODDES, :OBS, :ANULADO
    DO
        BEGIN
        if (((:PREFIJO = '') or (:PREF = :PREFIJO)) AND ((:ANULADOS = 'S') or (:ANULADO = 'N'))) then
            BEGIN
            if (anulado = 'S') then
             BEGIN
              ITEM = 0;
              ARTICULO = '';
              CODBAR = '';
              ARTIDES = '';
              CANT = 0;
              UNIDAD = '';
              BODITEM = '';
              lote = '';
              costo = 0;
              DTOPORC = 0;
              DTOMONTO = 0;
              IVAPORC = 0;
              IVAMONTO = 0;
              CONSUMO = 0;
              EXANT = 0;
              TOTAL = 0;
              OBSITEM = null;
              SUBTOTAL = 0;
              SUSPEND;
             END
            ELSE
             BEGIN
              if (DETALLE = 'S') then
                FOR SELECT TRAS_ITEM, A.ARTI_COD, TRAS_CODBAR, TRAS_DESC, TRAS_CANT, TRAS_UNIDAD, TRAS_COSTO, TRAS_IVAPORC, TRAS_IVAMONTO, TRAS_CONSUMO, TRAS_TOTAL, TRAS_LOTE, TRAS_OBS
                    FROM TRASFERENCIAS_DETALLE D, ARTICULO A WHERE D.ARTI_COD = A.ARTI_COD AND D.TRAN_ID = :ID INTO
                    :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :COSTO, :IVAPORC, :IVAMONTO, :CONSUMO, :TOTAL, :LOTE, :OBSITEM
                    DO
                    BEGIN
                    SUBTOTAL = TOTAL - IVAMONTO - CONSUMO;
                    SUSPEND;
                    END
              ELSE
                BEGIN
                SELECT SUM(TRAS_IVAMONTO), SUM(TRAS_CONSUMO), SUM(TRAS_TOTAL) FROM trasferencias_detalle D
                    WHERE D.TRAN_ID = :ID INTO :IVAMONTO, :CONSUMO, :TOTAL;
                SUBTOTAL = TOTAL - IVAMONTO - CONSUMO;
                SUSPEND;
                END
             END
            END
        END
    END
  if (BIN_AND(TIPO, 8) <> 0) then
    BEGIN
    SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 14 INTO :NOMTIPO;
    FOR SELECT AJUS_ID, A.PREF_PRE, AJUS_NUMERO, AJUS_FECHA, AJUS_CONC, A.BODE_COD, BODE_NOM, AJUS_OBS, AJUS_ANULADO
    FROM AJUSTES A, BODEGA B, PREFIJOS P
    WHERE A.BODE_COD = B.BODE_COD AND AJUS_FECHA >= :FECINI AND AJUS_FECHA <= :FECFIN 
     AND P.PREF_PRE = A.PREF_PRE AND P.TIDO_COD = 14 AND ((P.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
    ORDER BY AJUS_FECHA, AJUS_ID
    into :ID, :PREF, :NUMERO, :FECHA, :CONCEPTO, :CODBODORI, :NOMBODORI, :OBS, :ANULADO
    DO
        BEGIN
        if (((:PREFIJO = '') or (:PREF = :PREFIJO)) AND ((:ANULADOS = 'S') or (:ANULADO = 'N'))) then
            BEGIN
            if (anulado = 'S') then
             BEGIN
              ITEM = 0;
              ARTICULO = '';
              CODBAR = '';
              ARTIDES = '';
              CANT = 0;
              UNIDAD = '';
              BODITEM = '';
              lote = '';
              costo = 0;
              DTOPORC = 0;
              DTOMONTO = 0;
              IVAPORC = 0;
              IVAMONTO = 0;
              CONSUMO = 0;
              EXANT = 0;
              TOTAL = 0;
              OBSITEM = null;
              SUBTOTAL = 0;
              SUSPEND;
             END
            ELSE
             BEGIN
              if (DETALLE = 'S') then
                FOR SELECT AJUS_ITEM, A.ARTI_COD, AJUS_CODBAR, AJDE_DESC, AJUS_EXANT, AJUS_UNIDAD, BODE_COD, AJUS_EXNUE, AJUS_LOTE, AJDE_OBS
                    FROM AJUSTES_DETALLE D, ARTICULO A WHERE D.ARTI_COD = A.ARTI_COD AND D.AJUS_ID = :ID INTO
                    :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :EXANT, :UNIDAD, :BODITEM, :CANT, :LOTE, :OBSITEM
                    DO
                      BEGIN
                      EXECUTE PROCEDURE COSTO_PROMEDIO(:ARTICULO, :FECHA) returning_values (:COSTO);
                      TOTAL = (CANT - EXANT) * COSTO;
                      SUBTOTAL = TOTAL;
                      SUSPEND;
                      END
              ELSE
                BEGIN
                TOTAL = 0;
                FOR SELECT ARTI_COD, AJUS_EXNUE, AJUS_EXANT FROM AJUSTES_DETALLE D WHERE D.AJUS_ID = :ID INTO
                    :ARTICULO, :CANT, :EXANT
                    DO
                      BEGIN
                      EXECUTE PROCEDURE COSTO_PROMEDIO(:ARTICULO, :FECHA) returning_values (:COSTO);
                      TOTAL = TOTAL + ((CANT - EXANT) * COSTO);
                      SUBTOTAL = TOTAL;
                      END
                SUSPEND;
                END
             END
            END
        END
    END
  if (BIN_AND(TIPO, 16) <> 0) then
    BEGIN
    SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 15 INTO :NOMTIPO;
    FOR SELECT ENSA_ID, E.PREF_PRE, ENSA_NUMERO, ENSA_FECHA, ENSA_CONC, ENSA_REFER, E.BODE_COD, BODE_NOM, ENSA_CODBAR, ENSA_DESC, ENSA_CANT, ENSA_UNIDAD, ENSA_LOTE, ENSA_OBS, ENSA_ANULADO
    FROM ENSAMBLES E, BODEGA B, PREFIJOS P
    WHERE E.BODE_COD = B.BODE_COD AND E.ENSA_FECHA >= :FECINI AND E.ENSA_FECHA <= :FECFIN
     AND P.PREF_PRE = E.PREF_PRE AND P.TIDO_COD = 15 AND ((P.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
    ORDER BY ENSA_FECHA, ENSA_ID
    into :ID, :PREF, :NUMERO, :FECHA, :CONCEPTO, :REFER, :CODBODORI, :NOMBODORI, :PRODCODBAR, :PRODDES, :PRODCANT, :PRODUNIDAD, :PRODLOTE, :OBS, :ANULADO
    DO
        BEGIN
        if (((:PREFIJO = '') or (:PREF = :PREFIJO)) AND ((:ANULADOS = 'S') or (:ANULADO = 'N'))) then
            BEGIN
            if (anulado = 'S') then
             BEGIN
              ITEM = 0;
              ARTICULO = '';
              CODBAR = '';
              ARTIDES = '';
              CANT = 0;
              UNIDAD = '';
              BODITEM = '';
              lote = '';
              costo = 0;
              DTOPORC = 0;
              DTOMONTO = 0;
              IVAPORC = 0;
              IVAMONTO = 0;
              CONSUMO = 0;
              EXANT = 0;
              TOTAL = 0;
              OBSITEM = null;
              SUBTOTAL = 0;
              SUSPEND;
             END
            ELSE
             BEGIN
              if (DETALLE = 'S') then
                FOR SELECT ESDE_ITEM, A.ARTI_COD, ESDE_CODBAR, ESDE_DESC, ESDE_CANT, ESDE_UNIDAD, BODE_COD, ESDE_COSTO, ESDE_IVAPORC, ESDE_IVAMONTO, ESDE_CONSUMO, ESDE_TOTAL, ESDE_LOTE, ESDE_OBS
                    FROM ensambles_detalle D, ARTICULO A WHERE D.ARTI_COD = A.ARTI_COD AND D.ENSA_ID = :ID INTO
                    :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :BODITEM, :COSTO, :IVAPORC, :IVAMONTO, :CONSUMO, :TOTAL, :LOTE, :OBSITEM
                    DO
                    BEGIN
                    SUBTOTAL = TOTAL - IVAMONTO - CONSUMO;
                    SUSPEND;
                    END
              ELSE
                BEGIN
                SELECT SUM(ESDE_IVAMONTO), SUM(ESDE_CONSUMO), SUM(ESDE_TOTAL) FROM ENSAMBLES_detalle D WHERE D.ENSA_ID = :ID INTO
                    :IVAMONTO, :CONSUMO, :TOTAL;
                SUBTOTAL = TOTAL - IVAMONTO - CONSUMO;
                SUSPEND;
                END
             END
            END
        END
    END
  if (BIN_AND(TIPO, 32) <> 0) then
    BEGIN
    SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 16 INTO :NOMTIPO;
    FOR SELECT DESE_ID, E.PREF_PRE, DESE_NUMERO, DESE_FECHA, DESE_CONC, DESE_REFER, E.BODE_COD, BODE_NOM, DESE_CODBAR, DESE_DESC, DESE_CANT, DESE_UNIDAD, DESE_LOTE, DESE_OBS, DESE_ANULADO
    FROM DESENSAMBLES E, BODEGA B, PREFIJOS P
    WHERE E.BODE_COD = B.BODE_COD AND DESE_FECHA >= :FECINI AND DESE_FECHA <= :FECFIN 
     AND P.PREF_PRE = E.PREF_PRE AND P.TIDO_COD = 16 AND ((P.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
    ORDER BY DESE_FECHA, DESE_ID
    into :ID, PREF, :NUMERO, :FECHA, :CONCEPTO, :REFER, :CODBODORI, :NOMBODORI, :PRODCODBAR, :PRODDES, :PRODCANT, :PRODUNIDAD, :PRODLOTE, :OBS, :ANULADO
    DO
        BEGIN
        if (((:PREFIJO = '') or (:PREF = :PREFIJO)) AND ((:ANULADOS = 'S') or (:ANULADO = 'N'))) then
            BEGIN
            if (anulado = 'S') then
             BEGIN
              ITEM = 0;
              ARTICULO = '';
              CODBAR = '';
              ARTIDES = '';
              CANT = 0;
              UNIDAD = '';
              BODITEM = '';
              lote = '';
              costo = 0;
              DTOPORC = 0;
              DTOMONTO = 0;
              IVAPORC = 0;
              IVAMONTO = 0;
              CONSUMO = 0;
              EXANT = 0;
              TOTAL = 0;
              OBSITEM = null;
              SUBTOTAL = 0;
              SUSPEND;
             END
            ELSE
             BEGIN
              if (DETALLE = 'S') then
                FOR SELECT DESE_ITEM, A.ARTI_COD, DEDE_CODBAR, DEDE_DESC, DEDE_CANT, DEDE_UNIDAD, BODE_COD, DEDE_COSTO, DEDE_IVAPORC, DEDE_IVAMONTO, DEDE_CONSUMO, DEDE_TOTAL, DEDE_LOTE, DEDE_OBS
                    FROM desensambles_detalle D, ARTICULO A WHERE D.ARTI_COD = A.ARTI_COD AND D.DESE_ID = :ID INTO
                    :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :BODITEM, :COSTO, :IVAPORC, :IVAMONTO, :CONSUMO, :TOTAL, :LOTE, :OBSITEM
                    DO
                    BEGIN
                    SUBTOTAL = TOTAL - IVAMONTO - CONSUMO;
                    SUSPEND;
                    END
              ELSE
                BEGIN
                SELECT SUM(DEDE_IVAMONTO), SUM(DEDE_CONSUMO), SUM(DEDE_TOTAL) FROM DESENSAMBLES_detalle D WHERE D.DESE_ID = :ID INTO
                    :IVAMONTO, :CONSUMO, :TOTAL;
                SUBTOTAL = TOTAL - IVAMONTO - CONSUMO;
                SUSPEND;
                END
             END
            END
        END
    END
  if (BIN_AND(TIPO, 64) <> 0) then
    BEGIN
    SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 17 INTO :NOMTIPO;
    FOR SELECT RESE_ID, R.PREF_PRE, RESE_NUMERO, RESE_FECHA, RESE_CONC, RESE_REFER, R.BODE_COD, BODE_NOM, RESE_NOMTERC, RESE_OBS, RESE_ANULADO
    FROM RESERVAS R, BODEGA B, PREFIJOS P
    WHERE R.BODE_COD = B.BODE_COD AND R.RESE_FECHA >= :FECINI AND R.RESE_FECHA <= :FECFIN 
     AND P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = 17 AND ((P.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
    ORDER BY RESE_FECHA, RESE_ID
    into :ID, :PREF, :NUMERO, :FECHA, :CONCEPTO, :REFER, :CODBODORI, :NOMBODORI, :NOMTERCERO, :OBS, :ANULADO
    DO
        BEGIN
        if (((:PREFIJO = '') or (:PREF = :PREFIJO)) AND ((:ANULADOS = 'S') or (:ANULADO = 'N'))) then
            BEGIN
            if (anulado = 'S') then
             BEGIN
              ITEM = 0;
              ARTICULO = '';
              CODBAR = '';
              ARTIDES = '';
              CANT = 0;
              UNIDAD = '';
              BODITEM = '';
              lote = '';
              costo = 0;
              DTOPORC = 0;
              DTOMONTO = 0;
              IVAPORC = 0;
              IVAMONTO = 0;
              CONSUMO = 0;
              EXANT = 0;
              TOTAL = 0;
              OBSITEM = null;
              SUBTOTAL = 0;
              SUSPEND;
             END
            ELSE
             BEGIN
              if (DETALLE = 'S') then
                FOR SELECT RSDE_ITEM, A.ARTI_COD, RSDE_CODBAR, RSDE_DESC, RDSE_CANT, RSDE_UNIDAD, BODE_COD, RSDE_OBS
                    FROM RESERVAS_DETALLE D, ARTICULO A WHERE D.ARTI_COD = A.ARTI_COD AND D.RESE_ID = :ID INTO
                    :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :BODITEM, :OBSITEM
                    DO
                    SUSPEND;
              ELSE
                BEGIN
                SELECT SUM(RDSE_CANT) FROM RESERVAS_detalle D WHERE D.RESE_ID = :ID INTO
                    :CANT;
                SUSPEND;
                END
             END
            END
        END
    END
  if (BIN_AND(TIPO, 128) <> 0) then
    BEGIN
    SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 18 INTO :NOMTIPO;
    FOR SELECT ORIN_ID, O.PREF_PRE, ORIN_NUMERO, ORIN_FECHA, ORIN_FECLLEGA, ORIN_CONC, ORIN_REFER, ORIN_NOMTERC, ORIN_OBS, ORIN_ANULADO
        FROM ORDENES_INVENTARIO O, PREFIJOS P
        WHERE ORIN_FECHA >= :FECINI AND ORIN_FECHA <= :FECFIN 
        AND P.PREF_PRE = O.PREF_PRE AND P.TIDO_COD = 18 AND ((P.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
        ORDER BY ORIN_FECHA, ORIN_ID
        into :ID, PREF, :NUMERO, :FECHA, :VENCE, :CONCEPTO, :REFER, :NOMTERCERO, :OBS, :ANULADO
        DO
        BEGIN
        if (((:PREFIJO = '') or (:PREF = :PREFIJO)) AND ((:ANULADOS = 'S') or (:ANULADO = 'N'))) then
            BEGIN
            if (anulado = 'S') then
             BEGIN
              ITEM = 0;
              ARTICULO = '';
              CODBAR = '';
              ARTIDES = '';
              CANT = 0;
              UNIDAD = '';
              BODITEM = '';
              lote = '';
              costo = 0;
              DTOPORC = 0;
              DTOMONTO = 0;
              IVAPORC = 0;
              IVAMONTO = 0;
              CONSUMO = 0;
              EXANT = 0;
              TOTAL = 0;
              OBSITEM = null;
              SUBTOTAL = 0;
              SUSPEND;
             END
            ELSE
             BEGIN
              if (DETALLE = 'S') then
                FOR SELECT ORID_ITEM, A.ARTI_COD, ORID_CODBAR, ORID_DESC, ORID_CANT, ORID_UNIDAD, ORIN_COSTO, ORID_DTOPORC, ORID_DTOMONTO, ORID_IVAPORC, ORID_IVAMONTO, ORID_CONSUMO, ORID_TOTAL, ORID_OBS, ORID_LOTE
                    FROM ORDENINVENTARIO_DETALLE D, ARTICULO A WHERE D.ARTI_COD = A.ARTI_COD AND D.ORIN_ID = :ID INTO
                    :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :COSTO, :DTOPORC, :DTOMONTO, :IVAPORC, :IVAMONTO, :CONSUMO, :TOTAL, :OBSITEM, :LOTE
                    DO
                    BEGIN
                    SUBTOTAL = TOTAL - IVAMONTO - CONSUMO;
                    SUSPEND;
                    END
              ELSE
                BEGIN
                SELECT SUM(ORID_IVAMONTO), SUM(ORID_CONSUMO), SUM(ORID_TOTAL) FROM ordeninventario_detalle D WHERE D.ORIN_ID = :ID INTO
                    :IVAMONTO, :CONSUMO, :TOTAL;
                SUBTOTAL = TOTAL - IVAMONTO - CONSUMO;
                SUSPEND;
                END
             END
            END
        END
    END
 $$IBE$$*/ SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE REP_CONSECUTIVOS_INV(
    TIPO INTEGER,
    DETALLE CHAR(1),
    PREINI VARCHAR(4),
    PREFIN VARCHAR(4),
    NUMINI VARCHAR(6),
    NUMFIN VARCHAR(6),
    ANULADOS CHAR(1),
    SUBEMPRESA INTEGER)
RETURNS (
    NOMTIPO VARCHAR(30),
    ID INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    VENCE DATE,
    CONCEPTO VARCHAR(60),
    REFER VARCHAR(60),
    CODBODORI VARCHAR(2),
    NOMBODORI VARCHAR(30),
    CODBODDES VARCHAR(2),
    NOMBODDES VARCHAR(30),
    NOMTERCERO VARCHAR(60),
    PRODCODBAR VARCHAR(15),
    PRODDES VARCHAR(60),
    PRODCANT NUMERIC(18,4),
    PRODUNIDAD VARCHAR(8),
    PRODLOTE VARCHAR(15),
    OBS BLOB SUB_TYPE 0 SEGMENT SIZE 80,
    ITEM INTEGER,
    ARTICULO VARCHAR(15),
    CODBAR VARCHAR(15),
    ARTIDES VARCHAR(60),
    CANT NUMERIC(18,4),
    EXANT NUMERIC(18,4),
    UNIDAD VARCHAR(8),
    BODITEM VARCHAR(2),
    COSTO NUMERIC(18,2),
    DTOPORC NUMERIC(9,2),
    DTOMONTO NUMERIC(18,2),
    IVAPORC NUMERIC(9,2),
    IVAMONTO NUMERIC(18,2),
    CONSUMO NUMERIC(18,2),
    SUBTOTAL NUMERIC(18,2),
    TOTAL NUMERIC(18,2),
    LOTE VARCHAR(15),
    ANULADO CHAR(1),
    OBSITEM BLOB SUB_TYPE 0 SEGMENT SIZE 80)
AS
BEGIN
  /* DETERMINE LA TABLA A EXAMINAR */ /*$$IBE$$ 
  if (BIN_AND(TIPO, 1) <> 0) then
    BEGIN
    SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 11 INTO :NOMTIPO;
    FOR SELECT ENTR_ID, E.PREF_PRE, ENTR_NUMERO, ENTR_FECHA, ENTR_CONC, ENTR_REFER, E.BODE_COD, BODE_NOM, ENTR_NOMTERC, ENTR_OBS, ENTR_ANULADO
    FROM ENTRADAS E, BODEGA B, PREFIJOS PR
    WHERE E.BODE_COD = B.BODE_COD AND E.PREF_PRE >= :PREINI AND E.PREF_PRE <= :PREFIN AND ENTR_NUMERO >= :NUMINI AND ENTR_NUMERO <= :NUMFIN
     AND PR.PREF_PRE = E.PREF_PRE AND PR.TIDO_COD = 11 AND ((PR.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
    ORDER BY E.PREF_PRE, ENTR_NUMERO
    INTO :ID, :PREF, :NUMERO, :FECHA, :CONCEPTO, :REFER, :CODBODORI, :NOMBODORI, :NOMTERCERO, :OBS, :ANULADO
    DO
        BEGIN
        if ((:ANULADOS = 'S') or (:ANULADO = 'N')) then
            BEGIN
            if (anulado = 'S') then
             BEGIN
              ITEM = 0;
              ARTICULO = '';
              CODBAR = '';
              ARTIDES = '';
              CANT = 0;
              UNIDAD = '';
              BODITEM = '';
              lote = '';
              costo = 0;
              DTOPORC = 0;
              DTOMONTO = 0;
              IVAPORC = 0;
              IVAMONTO = 0;
              CONSUMO = 0;
              TOTAL = 0;
              OBSITEM = null;
              SUBTOTAL = 0;
              SUSPEND;
             END
            ELSE
             BEGIN
              if (DETALLE = 'S') then
                FOR SELECT ENDE_ITEM, A.ARTI_COD, ENDE_CODBAR, ENDE_DESC, ENDE_CANT, ENDE_UNIDAD, BODE_COD, ENDE_COSTO, ENDE_DTOPORC, ENDE_DTOMONTO, ENDE_IVAPORC, ENDE_IVAMONTO, ENDE_CONSUMO, ENDE_TOTAL, ENDE_LOTE, ENDE_OBS
                    FROM ENTRADAS_DETALLE D, ARTICULO A
                    WHERE D.ARTI_COD = A.ARTI_COD AND D.ENTR_ID = :ID
                    ORDER BY ENDE_ITEM
                    INTO :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :BODITEM, :COSTO, :DTOPORC, :DTOMONTO, :IVAPORC, :IVAMONTO, :CONSUMO, :TOTAL, :LOTE, :OBSITEM
                    DO
                    BEGIN
                    SUBTOTAL = TOTAL - IVAMONTO - CONSUMO;
                    SUSPEND;
                    END
              ELSE
                BEGIN
                SELECT SUM(ENDE_IVAMONTO), SUM(ENDE_CONSUMO), SUM(ENDE_TOTAL) FROM ENTRADAS_DETALLE D WHERE D.ENTR_ID = :ID INTO
                    :IVAMONTO, :CONSUMO, :TOTAL;
                SUBTOTAL = TOTAL - IVAMONTO - CONSUMO;
                SUSPEND;
                END
             END
            END
        END
    END
  if (BIN_AND(TIPO, 2) <> 0) then
    BEGIN
    SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 12 INTO :NOMTIPO;
    FOR SELECT SALI_ID, S.PREF_PRE, SALI_NUMERO, SALI_FECHA, SALI_CONC, SALI_REFER, S.BODE_COD, BODE_NOM, SALI_NOMTERC, SALI_OBS, SALI_ANULADO
    FROM SALIDAS S, BODEGA B, PREFIJOS PR
    WHERE S.BODE_COD = B.BODE_COD AND S.PREF_PRE >= :PREINI AND S.PREF_PRE <= :PREFIN AND SALI_NUMERO >= :NUMINI AND SALI_NUMERO <= :NUMFIN
     AND PR.PREF_PRE = S.PREF_PRE AND PR.TIDO_COD = 12 AND ((PR.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
    ORDER BY S.PREF_PRE, SALI_NUMERO
    into :ID, :PREF, :NUMERO, :FECHA, :CONCEPTO, :REFER, :CODBODORI, :NOMBODORI, :NOMTERCERO, :OBS, :ANULADO
    DO
        BEGIN
        if ((:ANULADOS = 'S') or (:ANULADO = 'N')) then
            BEGIN
            if (anulado = 'S') then
             BEGIN
              ITEM = 0;
              ARTICULO = '';
              CODBAR = '';
              ARTIDES = '';
              CANT = 0;
              UNIDAD = '';
              BODITEM = '';
              lote = '';
              costo = 0;
              DTOPORC = 0;
              DTOMONTO = 0;
              IVAPORC = 0;
              IVAMONTO = 0;
              CONSUMO = 0;
              TOTAL = 0;
              OBSITEM = null;
              SUBTOTAL = 0;
              SUSPEND;
             END
            ELSE
             BEGIN
              if (DETALLE = 'S') then
                FOR SELECT SADE_ITEM, A.ARTI_COD, SADE_CODBAR, SADE_DESC, SADE_CANT, SADE_UNIDAD, BODE_COD, SADE_COSTO, SADE_IVAPORC, SADE_IVAMONTO, SADE_CONSUMO, SADE_TOTAL, SADE_LOTE, SADE_OBS
                FROM SALIDAS_DETALLE D, ARTICULO A
                WHERE D.ARTI_COD = A.ARTI_COD AND D.SALI_ID = :ID
                ORDER BY SADE_ITEM
                INTO :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :BODITEM, :COSTO, :IVAPORC, :IVAMONTO, :CONSUMO, :TOTAL, :LOTE, :OBSITEM
                    DO
                BEGIN
                SUBTOTAL = TOTAL - IVAMONTO - CONSUMO;
                SUSPEND;
                END
              ELSE
                BEGIN
                SELECT SUM(SADE_IVAMONTO), SUM(SADE_CONSUMO), SUM(SADE_TOTAL) FROM SALIDAS_DETALLE D WHERE D.SALI_ID = :ID INTO
                    :IVAMONTO, :CONSUMO, :TOTAL;
                SUBTOTAL = TOTAL - IVAMONTO - CONSUMO;
                SUSPEND;
                END
             END
            END
        END
    END
  if (BIN_AND(TIPO, 4) <> 0) then
    BEGIN
    SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 13 INTO :NOMTIPO;
    FOR SELECT TRAN_ID, T.PREF_PRE, TRAN_NUMERO, TRAN_FECHA, TRAN_CONC, TRAN_REFER, T.BODE_COD, BO.BODE_NOM, TRAN_BODDES, BD.BODE_NOM, TRAN_OBS, TRAN_ANULADO
    FROM TRASFERENCIAS T, BODEGA BO, BODEGA BD, PREFIJOS PR
    WHERE T.BODE_COD = BO.BODE_COD AND T.TRAN_BODDES = BD.BODE_COD AND T.PREF_PRE >= :PREINI AND T.PREF_PRE <= :PREFIN AND TRAN_NUMERO >= :NUMINI AND TRAN_NUMERO <= :NUMFIN
     AND PR.PREF_PRE = T.PREF_PRE AND PR.TIDO_COD = 13 AND ((PR.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
    ORDER BY T.PREF_PRE, TRAN_NUMERO
    into :ID, :PREF, :NUMERO, :FECHA, :CONCEPTO, :REFER, :CODBODORI, :NOMBODORI, :CODBODDES, :NOMBODDES, :OBS, :ANULADO
    DO
        BEGIN
        if ((:ANULADOS = 'S') or (:ANULADO = 'N')) then
            BEGIN
            if (anulado = 'S') then
             BEGIN
              ITEM = 0;
              ARTICULO = '';
              CODBAR = '';
              ARTIDES = '';
              CANT = 0;
              UNIDAD = '';
              BODITEM = '';
              lote = '';
              costo = 0;
              DTOPORC = 0;
              DTOMONTO = 0;
              IVAPORC = 0;
              IVAMONTO = 0;
              CONSUMO = 0;
              TOTAL = 0;
              OBSITEM = null;
              SUBTOTAL = 0;
              SUSPEND;
             END
            ELSE
             BEGIN
              if (DETALLE = 'S') then
                FOR SELECT TRAS_ITEM, A.ARTI_COD, TRAS_CODBAR, TRAS_DESC, TRAS_CANT, TRAS_UNIDAD, TRAS_COSTO, TRAS_IVAPORC, TRAS_IVAMONTO, TRAS_CONSUMO, TRAS_TOTAL, TRAS_LOTE, TRAS_OBS
                FROM TRASFERENCIAS_DETALLE D, ARTICULO A
                WHERE D.ARTI_COD = A.ARTI_COD AND D.TRAN_ID = :ID
                ORDER BY TRAS_ITEM
                INTO :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :COSTO, :IVAPORC, :IVAMONTO, :CONSUMO, :TOTAL, :LOTE, :OBSITEM
                    DO
                    BEGIN
                    SUBTOTAL = TOTAL - IVAMONTO - CONSUMO;
                    SUSPEND;
                    END
              ELSE
                BEGIN
                SELECT SUM(TRAS_IVAMONTO), SUM(TRAS_CONSUMO), SUM(TRAS_TOTAL) FROM trasferencias_detalle D WHERE D.TRAN_ID = :ID INTO
                    :IVAMONTO, :CONSUMO, :TOTAL;
                SUBTOTAL = TOTAL - IVAMONTO - CONSUMO;
                SUSPEND;
                END
             END
            END
        END
    END
  if (BIN_AND(TIPO, 8) <> 0) then
    BEGIN
    SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 14 INTO :NOMTIPO;
    FOR SELECT AJUS_ID, A.PREF_PRE, AJUS_NUMERO, AJUS_FECHA, AJUS_CONC, A.BODE_COD, BODE_NOM, AJUS_OBS, AJUS_ANULADO
    FROM AJUSTES A, BODEGA B, PREFIJOS PR
    WHERE A.BODE_COD = B.BODE_COD AND A.PREF_PRE >= :PREINI AND A.PREF_PRE <= :PREFIN AND AJUS_NUMERO >= :NUMINI AND AJUS_NUMERO <= :NUMFIN
     AND PR.PREF_PRE = A.PREF_PRE AND PR.TIDO_COD = 14 AND ((PR.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
    ORDER BY A.PREF_PRE, AJUS_NUMERO
    into :ID, :PREF, :NUMERO, :FECHA, :CONCEPTO, :CODBODORI, :NOMBODORI, :OBS, :ANULADO
    DO
        BEGIN
        if ((:ANULADOS = 'S') or (:ANULADO = 'N')) then
            BEGIN
            if (anulado = 'S') then
             BEGIN
              ITEM = 0;
              ARTICULO = '';
              CODBAR = '';
              ARTIDES = '';
              CANT = 0;
              UNIDAD = '';
              BODITEM = '';
              lote = '';
              costo = 0;
              DTOPORC = 0;
              DTOMONTO = 0;
              IVAPORC = 0;
              IVAMONTO = 0;
              CONSUMO = 0;
              EXANT = 0;
              TOTAL = 0;
              OBSITEM = null;
              SUBTOTAL = 0;
              SUSPEND;
             END
            ELSE
             BEGIN
              if (DETALLE = 'S') then
                FOR SELECT AJUS_ITEM, A.ARTI_COD, AJUS_CODBAR, AJDE_DESC, AJUS_EXANT, AJUS_UNIDAD, BODE_COD, AJUS_EXNUE, AJUS_LOTE, AJDE_OBS
                FROM AJUSTES_DETALLE D, ARTICULO A
                WHERE D.ARTI_COD = A.ARTI_COD AND D.AJUS_ID = :ID
                ORDER BY AJUS_ITEM
                INTO :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :EXANT, :UNIDAD, :BODITEM, :CANT, :LOTE, :OBSITEM
                    DO
                      BEGIN
                      TOTAL = (CANT - EXANT) * COSTO;
                      SUBTOTAL = TOTAL;
                      SUSPEND;
                      END
              ELSE
                BEGIN
                TOTAL = 0;
                FOR SELECT ARTI_COD, AJUS_EXNUE, AJUS_EXANT FROM AJUSTES_DETALLE D WHERE D.AJUS_ID = :ID INTO
                    :ARTICULO, :CANT, :EXANT
                    DO
                      BEGIN
                      EXECUTE PROCEDURE COSTO_PROMEDIO(:ARTICULO, :FECHA) returning_values (:COSTO);
                      TOTAL = TOTAL + ((CANT - EXANT) * COSTO);
                      SUBTOTAL = TOTAL;
                      END
                SUSPEND;
                END
             END
            END
        END
    END
  if (BIN_AND(TIPO, 16) <> 0) then
    BEGIN
    SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 15 INTO :NOMTIPO;
    FOR SELECT ENSA_ID, E.PREF_PRE, ENSA_NUMERO, ENSA_FECHA, ENSA_CONC, ENSA_REFER, E.BODE_COD, BODE_NOM, ENSA_CODBAR, ENSA_DESC, ENSA_CANT, ENSA_UNIDAD, ENSA_LOTE, ENSA_OBS, ENSA_ANULADO
    FROM ENSAMBLES E, BODEGA B, PREFIJOS PR
    WHERE E.BODE_COD = B.BODE_COD AND E.PREF_PRE >= :PREINI AND E.PREF_PRE <= :PREFIN AND ENSA_NUMERO >= :NUMINI AND ENSA_NUMERO <= :NUMFIN
     AND PR.PREF_PRE = E.PREF_PRE AND PR.TIDO_COD = 15 AND ((PR.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
    ORDER BY E.PREF_PRE, ENSA_NUMERO
    into :ID, :PREF, :NUMERO, :FECHA, :CONCEPTO, :REFER, :CODBODORI, :NOMBODORI, :PRODCODBAR, :PRODDES, :PRODCANT, :PRODUNIDAD, :PRODLOTE, :OBS, :ANULADO
    DO
        BEGIN
        if ((:ANULADOS = 'S') or (:ANULADO = 'N')) then
            BEGIN
            if (anulado = 'S') then
             BEGIN
              ITEM = 0;
              ARTICULO = '';
              CODBAR = '';
              ARTIDES = '';
              CANT = 0;
              UNIDAD = '';
              BODITEM = '';
              lote = '';
              costo = 0;
              DTOPORC = 0;
              DTOMONTO = 0;
              IVAPORC = 0;
              IVAMONTO = 0;
              CONSUMO = 0;
              TOTAL = 0;
              OBSITEM = null;
              SUBTOTAL = 0;
              SUSPEND;
             END
            ELSE
             BEGIN
              if (DETALLE = 'S') then
                FOR SELECT ESDE_ITEM, A.ARTI_COD, ESDE_CODBAR, ESDE_DESC, ESDE_CANT, ESDE_UNIDAD, BODE_COD, ESDE_COSTO, ESDE_IVAPORC, ESDE_IVAMONTO, ESDE_CONSUMO, ESDE_TOTAL, ESDE_LOTE, ESDE_OBS
                FROM ensambles_detalle D, ARTICULO A
                WHERE D.ARTI_COD = A.ARTI_COD AND D.ENSA_ID = :ID
                ORDER BY ESDE_ITEM
                INTO :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :BODITEM, :COSTO, :IVAPORC, :IVAMONTO, :CONSUMO, :TOTAL, :LOTE, :OBSITEM
                    DO
                    BEGIN
                    SUBTOTAL = TOTAL - IVAMONTO - CONSUMO;
                    SUSPEND;
                    END
              ELSE
                BEGIN
                SELECT SUM(ESDE_IVAMONTO), SUM(ESDE_CONSUMO), SUM(ESDE_TOTAL) FROM ENSAMBLES_detalle D WHERE D.ENSA_ID = :ID INTO
                    :IVAMONTO, :CONSUMO, :TOTAL;
                SUBTOTAL = TOTAL - IVAMONTO - CONSUMO;
                SUSPEND;
                END
             END
            END
        END
    END
  if (BIN_AND(TIPO, 32) <> 0) then
    BEGIN
    SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 16 INTO :NOMTIPO;
    FOR SELECT DESE_ID, E.PREF_PRE, DESE_NUMERO, DESE_FECHA, DESE_CONC, DESE_REFER, E.BODE_COD, BODE_NOM, DESE_CODBAR, DESE_DESC, DESE_CANT, DESE_UNIDAD, DESE_LOTE, DESE_OBS, DESE_ANULADO
    FROM DESENSAMBLES E, BODEGA B, PREFIJOS PR
    WHERE E.BODE_COD = B.BODE_COD AND E.PREF_PRE >= :PREINI AND E.PREF_PRE <= :PREFIN AND DESE_NUMERO >= :NUMINI AND DESE_NUMERO <= :NUMFIN
     AND PR.PREF_PRE = E.PREF_PRE AND PR.TIDO_COD = 16 AND ((PR.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
    ORDER BY E.PREF_PRE, DESE_NUMERO
    into :ID, :PREF, :NUMERO, :FECHA, :CONCEPTO, :REFER, :CODBODORI, :NOMBODORI, :PRODCODBAR, :PRODDES, :PRODCANT, :PRODUNIDAD, :PRODLOTE, :OBS, :ANULADO
    DO
        BEGIN
        if ((:ANULADOS = 'S') or (:ANULADO = 'N')) then
            BEGIN
            if (anulado = 'S') then
             BEGIN
              ITEM = 0;
              ARTICULO = '';
              CODBAR = '';
              ARTIDES = '';
              CANT = 0;
              UNIDAD = '';
              BODITEM = '';
              lote = '';
              costo = 0;
              DTOPORC = 0;
              DTOMONTO = 0;
              IVAPORC = 0;
              IVAMONTO = 0;
              CONSUMO = 0;
              TOTAL = 0;
              OBSITEM = null;
              SUBTOTAL = 0;
              SUSPEND;
             END
            ELSE
             BEGIN
              if (DETALLE = 'S') then
                FOR SELECT DESE_ITEM, A.ARTI_COD, DEDE_CODBAR, DEDE_DESC, DEDE_CANT, DEDE_UNIDAD, BODE_COD, DEDE_COSTO, DEDE_IVAPORC, DEDE_IVAMONTO, DEDE_CONSUMO, DEDE_TOTAL, DEDE_LOTE, DEDE_OBS
                FROM DESensambles_detalle D, ARTICULO A
                WHERE D.ARTI_COD = A.ARTI_COD AND D.DESE_ID = :ID
                ORDER BY DESE_ITEM
                INTO
                    :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :BODITEM, :COSTO, :IVAPORC, :IVAMONTO, :CONSUMO, :TOTAL, :LOTE, :OBSITEM
                    DO
                    BEGIN
                    SUBTOTAL = TOTAL - IVAMONTO - CONSUMO;
                    SUSPEND;
                    END
              ELSE
                BEGIN
                SELECT SUM(DEDE_IVAMONTO), SUM(DEDE_CONSUMO), SUM(DEDE_TOTAL) FROM DESENSAMBLES_detalle D WHERE D.DESE_ID = :ID INTO
                    :IVAMONTO, :CONSUMO, :TOTAL;
                SUBTOTAL = TOTAL - IVAMONTO - CONSUMO;
                SUSPEND;
                END
             END
            END
        END
    END
  if (BIN_AND(TIPO, 64) <> 0) then
    BEGIN
    SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 17 INTO :NOMTIPO;
    FOR SELECT RESE_ID, R.PREF_PRE, RESE_NUMERO, RESE_FECHA, RESE_CONC, RESE_REFER, R.BODE_COD, BODE_NOM, RESE_NOMTERC, RESE_OBS, RESE_ANULADO
    FROM RESERVAS R, BODEGA B, PREFIJOS PR
    WHERE R.BODE_COD = B.BODE_COD AND R.PREF_PRE >= :PREINI AND R.PREF_PRE <= :PREFIN AND RESE_NUMERO >= :NUMINI AND RESE_NUMERO <= :NUMFIN
     AND PR.PREF_PRE = R.PREF_PRE AND PR.TIDO_COD = 17 AND ((PR.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
    ORDER BY R.PREF_PRE, RESE_NUMERO
    into :ID, :PREF, :NUMERO, :FECHA, :CONCEPTO, :REFER, :CODBODORI, :NOMBODORI, :NOMTERCERO, :OBS, :ANULADO
    DO
        BEGIN
        if ((:ANULADOS = 'S') or (:ANULADO = 'N')) then
            BEGIN
            if (anulado = 'S') then
             BEGIN
              ITEM = 0;
              ARTICULO = '';
              CODBAR = '';
              ARTIDES = '';
              CANT = 0;
              UNIDAD = '';
              BODITEM = '';
              lote = '';
              costo = 0;
              DTOPORC = 0;
              DTOMONTO = 0;
              IVAPORC = 0;
              IVAMONTO = 0;
              CONSUMO = 0;
              EXANT = 0;
              TOTAL = 0;
              OBSITEM = null;
              SUBTOTAL = 0;
              SUSPEND;
             END
            ELSE
             BEGIN
              if (DETALLE = 'S') then
                FOR SELECT RSDE_ITEM, A.ARTI_COD, RSDE_CODBAR, RSDE_DESC, RDSE_CANT, RSDE_UNIDAD, BODE_COD, RSDE_OBS
                FROM RESERVAS_DETALLE D, ARTICULO A
                WHERE D.ARTI_COD = A.ARTI_COD AND D.RESE_ID = :ID
                ORDER BY RSDE_ITEM
                INTO :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :BODITEM, :OBSITEM
                    DO
                    SUSPEND;
              ELSE
                BEGIN
                SELECT SUM(RDSE_CANT) FROM RESERVAS_detalle D WHERE D.RESE_ID = :ID INTO
                    :CANT;
                SUSPEND;
                END
             END
            END
        END
    END
  if (BIN_AND(TIPO, 128) <> 0) then
    BEGIN
    SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 18 INTO :NOMTIPO;
    FOR SELECT ORIN_ID, O.PREF_PRE, ORIN_NUMERO, ORIN_FECHA, ORIN_FECLLEGA, ORIN_CONC, ORIN_REFER, ORIN_NOMTERC, ORIN_OBS, ORIN_ANULADO
    FROM ORDENES_INVENTARIO O, PREFIJOS PR
    WHERE O.PREF_PRE >= :PREINI AND O.PREF_PRE <= :PREFIN AND ORIN_NUMERO >= :NUMINI AND ORIN_NUMERO <= :NUMFIN
     AND PR.PREF_PRE = O.PREF_PRE AND PR.TIDO_COD = 18 AND ((PR.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
    ORDER BY O.PREF_PRE, ORIN_NUMERO
    into :ID, :PREF, :NUMERO, :FECHA, :VENCE, :CONCEPTO, :REFER, :NOMTERCERO, :OBS, :ANULADO
    DO
        BEGIN
        if ((:ANULADOS = 'S') or (:ANULADO = 'N')) then
            BEGIN
            if (anulado = 'S') then
             BEGIN
              ITEM = 0;
              ARTICULO = '';
              CODBAR = '';
              ARTIDES = '';
              CANT = 0;
              UNIDAD = '';
              BODITEM = '';
              lote = '';
              costo = 0;
              DTOPORC = 0;
              DTOMONTO = 0;
              IVAPORC = 0;
              IVAMONTO = 0;
              CONSUMO = 0;
              EXANT = 0;
              TOTAL = 0;
              OBSITEM = null;
              SUBTOTAL = 0;
              SUSPEND;
             END
            ELSE
             BEGIN
              if (DETALLE = 'S') then
                FOR SELECT ORID_ITEM, A.ARTI_COD, ORID_CODBAR, ORID_DESC, ORID_CANT, ORID_UNIDAD, ORIN_COSTO, ORID_DTOPORC, ORID_DTOMONTO, ORID_IVAPORC, ORID_IVAMONTO, ORID_CONSUMO, ORID_TOTAL, ORID_OBS, ORID_LOTE
                FROM ORDENINVENTARIO_DETALLE D, ARTICULO A
                WHERE D.ARTI_COD = A.ARTI_COD AND D.ORIN_ID = :ID
                ORDER BY ORID_ITEM
                INTO :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :COSTO, :DTOPORC, :DTOMONTO, :IVAPORC, :IVAMONTO, :CONSUMO, :TOTAL, :OBSITEM, :LOTE
                    DO
                    BEGIN
                    SUBTOTAL = TOTAL - IVAMONTO - CONSUMO;
                    SUSPEND;
                    END
              ELSE
                BEGIN
                SELECT SUM(ORID_IVAMONTO), SUM(ORID_CONSUMO), SUM(ORID_TOTAL) FROM ordeninventario_detalle D WHERE D.ORIN_ID = :ID INTO
                    :IVAMONTO, :CONSUMO, :TOTAL;
                SUBTOTAL = TOTAL - IVAMONTO - CONSUMO;
                SUSPEND;
                END
             END
            END
        END
    END
 $$IBE$$*/ SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE REP_KARDEX_ARTICULO(
    DETALLE CHAR(1),
    FECINI DATE,
    FECFIN DATE,
    ARTINI VARCHAR(20),
    ARTFIN VARCHAR(20),
    GRPINI VARCHAR(2),
    GRPFIN VARCHAR(2),
    ORDEN CHAR(1),
    BODEGA VARCHAR(2))
RETURNS (
    CODIGO VARCHAR(15),
    NOMBRE VARCHAR(60),
    UNIDAD VARCHAR(8),
    CODGRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    CODSUBG VARCHAR(3),
    NOMSUBG VARCHAR(30),
    CODMARC VARCHAR(3),
    NOMMARC VARCHAR(30),
    CODBOD VARCHAR(2),
    SALDOINI NUMERIC(18,4),
    COSTOINI NUMERIC(18,2),
    ENTRADAS NUMERIC(18,4),
    COSTOENT NUMERIC(18,2),
    SALIDAS NUMERIC(18,4),
    COSTOSAL NUMERIC(18,2),
    SALDOFIN NUMERIC(18,4),
    COSTOFIN NUMERIC(18,2),
    TIPODOC VARCHAR(8),
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    CONCEPTO VARCHAR(60),
    NIT VARCHAR(20),
    CONS INTEGER,
    CANFINAL NUMERIC(18,4),
    COSFINAL NUMERIC(18,2))
AS
DECLARE VARIABLE ENTRADA CHAR(1);
DECLARE VARIABLE CANT NUMERIC(18,4);
DECLARE VARIABLE COSTO NUMERIC(18,2);
DECLARE VARIABLE CODINI VARCHAR(20);
DECLARE VARIABLE CODFIN VARCHAR(20);
DECLARE VARIABLE DESINI VARCHAR(20);
DECLARE VARIABLE DESFIN VARCHAR(20);
BEGIN /*$$IBE$$ 
if (ORDEN = 'C') then
    BEGIN
    CODINI = ARTINI;
    CODFIN = ARTFIN;
    DESINI = '';
    DESFIN = 'zz';
    END
ELSE
    BEGIN
    DESINI = ARTINI;
    DESFIN = ARTFIN;
    CODINI = '';
    CODFIN = 'zz';
    END
  FOR
    SELECT ARTI_COD, ARTI_DES, ARTI_UNIDAD, A.GRUP_COD, A.SUBG_COD, A.MARC_COD
      FROM ARTICULO A
      WHERE ARTI_COD >= :CODINI AND ARTI_COD <= :CODFIN AND A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :GRPFIN AND ARTI_DES >= :DESINI AND ARTI_DES <= :DESFIN AND A.ESAR_COD <> 'I'
      INTO :CODIGO, :NOMBRE, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
      DO
        BEGIN
        NOMMARC = '';
        NOMSUBG = '';
        SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
        SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
        SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
        if (BODEGA = '') then
            BEGIN
            EXECUTE PROCEDURE SALDO_INICIAL_TOTAL_INV(CODIGO, FECINI) returning_values (:SALDOINI);
            EXECUTE PROCEDURE VALOR_INICIAL_INVENTARIO(CODIGO, FECINI) returning_values (COSTOINI);
            END
        ELSE
            BEGIN
            EXECUTE PROCEDURE SALDO_INICIAL_INVENTARIO(CODIGO, FECINI, :BODEGA) returning_values (SALDOINI);
            EXECUTE PROCEDURE COSTO_PROMEDIO(CODIGO, FECINI-1) returning_values (COSTOINI);
            COSTOINI = COSTOINI * saldoini;
            END
        if (DETALLE = 'N') then
            BEGIN
             $$IBE$$*/ /* SUME LAS ENTRADAS */ /*$$IBE$$ 
            if (BODEGA = '') then
              SELECT SUM(COST_ENTC), SUM(COST_ENTP), SUM(COST_SALC), SUM(COST_SALP) FROM COSTOS
                WHERE (COST_FECHA >= :FECINI) AND (COST_FECHA <= :FECFIN) AND (ARTI_COD = :codigo)
                INTO :ENTRADAS, :COSTOENT, :SALIDAS, :COSTOSAL;
            ELSE
              SELECT SUM(COST_ENTC), SUM(COST_ENTP), SUM(COST_SALC), SUM(COST_SALP)
                FROM COSTOS C, MOVIMIENTO_ARTICULO M
                WHERE (COST_FECHA >= :FECINI) AND (COST_FECHA <= :FECFIN) AND (C.ARTI_COD = :codigo) AND C.cost_idmov = M.mvar_cons AND BODE_COD = :BODEGA
                INTO :ENTRADAS, :COSTOENT, :SALIDAS, :COSTOSAL;

            if (ENTRADAS IS NULL) then
              ENTRADAS = 0;
            if (COSTOENT IS NULL) then
              COSTOENT = 0;
            if (SALIDAS IS NULL) then
              SALIDAS = 0;
            if (COSTOSAL IS NULL) then
              COSTOSAL = 0;
            SALDOFIN = SALDOINI + ENTRADAS - SALIDAS;
            COSTOFIN = COSTOINI + COSTOENT - COSTOSAL;
            if (BODEGA = '') then
                BEGIN
                EXECUTE PROCEDURE SALDO_INICIAL_TOTAL_INV(CODIGO, fecfin+1) returning_values (canfinal);
                EXECUTE PROCEDURE VALOR_INICIAL_INVENTARIO(CODIGO, FECFIN+1) returning_values (cosfinal);
                END
            ELSE
                BEGIN
                EXECUTE PROCEDURE SALDO_INICIAL_INVENTARIO(CODIGO, FECFIN+1, :BODEGA) returning_values (CANFINAL);
                EXECUTE PROCEDURE COSTO_PROMEDIO(CODIGO, FECFIN+1) returning_values (COSFINAL);
                COSFINAL = COSFINAL * CANFINAL;
                END
            SUSPEND;
            END
        ELSE
            BEGIN
            SALDOFIN = SALDOINI;
            COSTOFIN = COSTOINI;
            COSTOENT = 0;
            COSTOSAL = 0;
            FOR SELECT TIDO_NOMCORTO, MVAR_ENTRADA, MVAR_PREF, MVAR_NUMERO, MVAR_CANT, MVAR_COSTO, MVAR_CONC, MVAR_FECHA, M.TERC_NIT, MVAR_CONS, BODE_COD, COST_SALDOP, COST_SALDOC
                FROM MOVIMIENTO_ARTICULO M, TIPO_DOCUMENTO TD, COSTOS C
                WHERE TD.TIDO_COD = MVAR_TIPODOC AND (MVAR_FECHA >= :FECINI) AND (MVAR_FECHA <= :FECFIN) AND (MVAR_TIPODOC <> 13) AND (m.ARTI_COD = :CODIGO) AND M.mvar_cons = C.cost_idmov
                ORDER BY MVAR_FECHA, MVAR_CONS
                INTO :TIPODOC, :ENTRADA, :PREFIJO, :NUMERO, :ENTRADAS, :COSTOENT, :CONCEPTO, :FECHA, :NIT, :CONS, :CODBOD, :costo, :cant
                DO
                    BEGIN
                    if (ENTRADA = 'S') then
                        BEGIN
                        SALIDAS = 0;
                        SALDOFIN = SALDOFIN + ENTRADAS;
                        COSTOFIN = COSTOFIN + (ENTRADAS * COSTOENT);
                        if (CANT > 0) then
                            COSTOSAL = COSTO / CANT;
                        else
                            COSTOSAL = 0;
                        end
                    ELSE
                        BEGIN
                        SALIDAS = ENTRADAS;
                        ENTRADAS = 0;
                        if (CANT > 0) then
                            COSTOSAL = COSTO / CANT;
                        else
                            COSTOSAL = 0;
                        SALDOFIN = SALDOFIN - SALIDAS;
                        COSTOFIN = COSTOFIN - (SALIDAS * costosal);
                        END
                    SUSPEND;
                    END
            END
        END
 $$IBE$$*/ SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE REP_PRODUCTOS(
    ORDEN CHAR(1),
    DESDE VARCHAR(15),
    HASTA VARCHAR(15),
    FECHA DATE)
RETURNS (
    CODIGO VARCHAR(15),
    DESCR VARCHAR(60),
    GRUPCOD VARCHAR(2),
    GRUPNOM VARCHAR(30),
    SUBGCOD VARCHAR(3),
    SUBGNOM VARCHAR(30),
    MARCCOD VARCHAR(3),
    MARCNOM VARCHAR(30),
    ESTADO CHAR(1),
    UNIDAD VARCHAR(8),
    CODCOMP VARCHAR(15),
    DESCOMP VARCHAR(60),
    CANT NUMERIC(18,4),
    UNDCOMP VARCHAR(8),
    CODBARCOMP VARCHAR(15),
    COSTO NUMERIC(18,2),
    TOTAL NUMERIC(18,2))
AS
BEGIN /*$$IBE$$ 
  FOR SELECT ARTI_COD, ARTI_DES, ARTI_UNIDAD, A.GRUP_COD, GRUP_NOM, A.SUBG_COD, A.MARC_COD, A.esar_cod
  FROM ARTICULO A, GRUPO G, estado_articulo E
  WHERE A.GRUP_COD = G.GRUP_COD AND A.ESAR_COD = E.ESAR_COD AND ARTI_COD IN (SELECT DISTINCT ARTI_COD FROM ARTICULOS_PRODUCTO)
  INTO :CODIGO, :DESCR, :unidad, :GRUPCOD, :GRUPNOM, :SUBGCOD, :MARCCOD, :ESTADO
  DO
    if ((ORDEN = 'C' AND CODIGO >= :DESDE AND CODIGO <= :HASTA) OR
        (ORDEN = 'D' AND DESCR >= :DESDE AND DESCR <= :HASTA)) then
        BEGIN
        SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :MARCCOD INTO MARCNOM;
        SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :SUBGCOD AND GRUP_COD = :GRUPCOD INTO :SUBGNOM;
        FOR SELECT ARPR_COMP, ARTI_DES, ARPR_CODBAR, ARPR_CANT, ARPR_UNIDAD
        FROM ARTICULOS_PRODUCTO P, ARTICULO A
        WHERE P.ARTI_COD = :CODIGO AND P.ARPR_COMP = A.ARTI_COD
          INTO :CODCOMP, :DESCOMP, :CODBARCOMP, :CANT, :UNDCOMP
          DO
            begin
            EXECUTE PROCEDURE COSTO_PROMEDIO (:CODCOMP, :FECHA) returning_values (:COSTO);
            EXECUTE PROCEDURE CANTIDAD_POR_FACTOR (:CODCOMP, :CANT, :UNDCOMP) returning_values (:CANT);
            TOTAL = COSTO * CANT;
            SUSPEND;
            END
        END
 $$IBE$$*/ SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE REP_UTILIDAD_CLIENTE(
    TIPO INTEGER,
    DETALLE CHAR(1),
    TERINI VARCHAR(20),
    TERFIN VARCHAR(20),
    FECINI DATE,
    FECFIN DATE,
    ARTINI VARCHAR(15),
    ARTFIN VARCHAR(15),
    ORDEN CHAR(1),
    CEROS CHAR(1),
    SUBEMPRESA INTEGER)
RETURNS (
    NIT VARCHAR(20),
    NOMBRE VARCHAR(60),
    SUCURSAL VARCHAR(10),
    TELEFONO VARCHAR(40),
    CIUDAD VARCHAR(40),
    CODZONA VARCHAR(2),
    NOMZONA VARCHAR(30),
    NOMTIPO VARCHAR(50),
    ARTICULO VARCHAR(15),
    DESCRIPCION VARCHAR(60),
    CODGRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    CODSUBG VARCHAR(3),
    NOMSUBG VARCHAR(30),
    CODMARC VARCHAR(3),
    NOMMARC VARCHAR(30),
    UNIDAD VARCHAR(8),
    CANTIDAD NUMERIC(18,4),
    BASE NUMERIC(18,2),
    IVA NUMERIC(18,2),
    COSTO NUMERIC(18,2),
    UTILIDAD NUMERIC(18,4),
    PORC NUMERIC(9,2),
    TOTAL NUMERIC(18,2),
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    DTO NUMERIC(9,2))
AS
DECLARE VARIABLE COSTOUNIT NUMERIC(18,4);
DECLARE VARIABLE CODINI VARCHAR(15);
DECLARE VARIABLE CODFIN VARCHAR(15);
DECLARE VARIABLE DESINI VARCHAR(15);
DECLARE VARIABLE DESFIN VARCHAR(15);
declare variable UOM VARCHAR(20);
declare variable NUMROWS INTEGER;
BEGIN /*$$IBE$$ 
if (ORDEN = 'C') then
    BEGIN
    CODINI = ARTINI;
    CODFIN = ARTFIN;
    DESINI = '';
    DESFIN = 'zz';
    END
ELSE
    BEGIN
    DESINI = ARTINI;
    DESFIN = ARTFIN;
    CODINI = '';
    CODFIN = 'zz';
    END
EXECUTE PROCEDURE lee_configuracion ('FACTURACION', 'ARTICULOS', 'SUGERIR PRECIOS CON PORCENTAJE DE MARGEN O UTILIDAD') returning_values (:UOM);
SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = :TIPO INTO :NOMTIPO;
if (DETALLE = 'N') then
    BEGIN
    if (BIN_AND(TIPO, 1) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 31 INTO :NOMTIPO;
         $$IBE$$*/ /* BORRA LA TABLA AUXILIAR */ /*$$IBE$$ 
        DELETE FROM reportes_aux WHERE REPA_ID = 3 AND REPA_USER = USER;
        DELETE FROM costo_factura;
         $$IBE$$*/ /* LLENE LOS COSTOS POR FECHA */ /*$$IBE$$ 
        FOR SELECT MAX(FACT_FECHA), MAX(ARTI_COD) FROM FACTURAS F, FACTURAS_DETALLE D
            WHERE F.fact_id = D.fact_id AND TERC_NIT >= :TERINI AND TERC_NIT <= :TERFIN AND FACT_ANULADO = 'N'
            AND ARTI_COD >= :CODINI AND ARTI_COD <= :CODFIN AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN
            GROUP BY FACT_FECHA, ARTI_COD
            INTO :FECHA, :articulo
            DO
            BEGIN
            if (NOT EXISTS (SELECT * FROM COSTO_FACTURA WHERE FECHA = :FECHA AND ARTICULO = :ARTICULO)) then
                BEGIN
                EXECUTE PROCEDURE COSTO_PROMEDIO(:ARTICULO, :FECHA) returning_values (:costounit);
                INSERT INTO COSTO_FACTURA (FECHA, ARTICULO, COSTO) VALUES (:FECHA, :ARTICULO, :costounit);
                END
            END
        FOR SELECT MAX(T.TERC_NIT), MAX(TERC_NOM), MAX(TERC_TEL), MAX(TERC_CIU), MAX(ZONA_COD), MAX(D.ARTI_COD), SUM(FADE_CANT * FADE_FACTOR), SUM(FACT_FACTOR*(FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO)),
            SUM(FACT_FACTOR*FADE_IVAMONTO), SUM(FACT_FACTOR*FADE_TOTAL),
            MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD), SUM(CO.COSTO * FADE_CANT * FADE_FACTOR), max(f.fact_sucursal)
            FROM FACTURAS_DETALLE D, FACTURAS F, PREFIJOS P, terceros T, CLIENTES C, ARTICULO A, costo_factura CO
            WHERE C.TERC_NIT = T.TERC_NIT AND TERC_CLIE = 'S' AND F.terc_nit = T.terc_nit AND T.TERC_NIT >= :TERINI AND T.TERC_NIT <= :TERFIN AND
            F.FACT_ID = D.FACT_ID AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND FACT_ANULADO = 'N'
            AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) and substring(D.arti_cod from 1 FOR 2) <> '.t'
            AND D.ARTI_COD = A.arti_cod AND A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN
            AND F.fact_fecha = CO.fecha AND D.arti_cod = CO.articulo
            GROUP BY T.TERC_NIT, f.fact_sucursal, D.ARTI_COD
            INTO :NIT, :NOMBRE, :TELEFONO, :CIUDAD, :CODZONA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :TOTAL,
            :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :COSTO, :sucursal
            DO
            BEGIN
            SELECT ZONA_NOM FROM ZONAS WHERE ZONA_COD = :CODZONA INTO :NOMZONA;
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            if (CEROS = 'S') then
                INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (3, USER, :ARTICULO);
            SUSPEND;
            END  $$IBE$$*/ /* FOR */ /*$$IBE$$ 
        if (CEROS = 'S') then
            BEGIN
            COSTO = 0;
            UTILIDAD = 0;
            PORC = 0;
             $$IBE$$*/ /* agregue los articulos sin factura */ /*$$IBE$$ 
            FOR SELECT ARTI_COD, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN
                INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                DO
                BEGIN
                SELECT COUNT(REPA_ARTICULO) FROM REPORTES_AUX WHERE REPA_ID = 3 AND REPA_USER = USER AND REPA_ARTICULO = :articulo INTO :numrows;
                if (numrows = 0) then
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        END
    if (BIN_AND(TIPO, 2) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 32 INTO :NOMTIPO;
         $$IBE$$*/ /* BORRA LA TABLA AUXILIAR */ /*$$IBE$$ 
        DELETE FROM reportes_aux WHERE REPA_ID = 3 AND REPA_USER = USER;

        FOR SELECT MAX(T.TERC_NIT), MAX(TERC_NOM), MAX(TERC_TEL), MAX(TERC_CIU), MAX(ZONA_COD), MAX(D.ARTI_COD), SUM(RVDE_CANT * RVDE_FACTOR), SUM(RVDE_TOTAL-RVDE_IVAMONTO-RVDE_CONSUMO), SUM(RVDE_IVAMONTO), SUM(RVDE_TOTAL),
            MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD), SUM(COST_SALP), max(r.revt_sucursal)
            FROM REMISIONES_VENTA_DETALLE D, REMISIONES_VENTA R, PREFIJOS P, terceros T, CLIENTES C, ARTICULO A, movimiento_articulo m, costos CO
            WHERE C.TERC_NIT = T.TERC_NIT AND TERC_CLIE = 'S' AND R.terc_nit = T.terc_nit AND T.TERC_NIT >= :TERINI AND T.TERC_NIT <= :TERFIN AND
            R.REVT_ID = D.REVT_ID AND REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN AND REVT_ANULADO = 'N'
            AND P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = 32 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            AND D.ARTI_COD = A.arti_cod AND A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN
            AND R.revt_id = M.mvar_idref AND M.mvar_tipodoc = 32 AND M.mvar_item = D.rvde_item AND M.mvar_cons = CO.cost_idmov
            GROUP BY T.TERC_NIT, r.revt_sucursal, D.ARTI_COD
            INTO :NIT, :NOMBRE, :TELEFONO, :CIUDAD, :CODZONA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :TOTAL,
                :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :COSTO, :sucursal
            DO
                BEGIN
                SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                if (CANTIDAD IS NULL) then
                    CANTIDAD = 0;
                if (BASE IS NULL) then
                    BASE = 0;
                if (IVA IS NULL) then
                    IVA = 0;
                UTILIDAD = BASE - COSTO;
                if (UOM = 'UTILIDAD') then
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                else
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            if (CEROS = 'S') then
                INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (3, USER, :ARTICULO);
            SUSPEND;
            END  $$IBE$$*/ /* FOR */ /*$$IBE$$ 
        if (CEROS = 'S') then
            BEGIN
            COSTO = 0;
            UTILIDAD = 0;
            PORC = 0;
             $$IBE$$*/ /* agregue los articulos sin factura */ /*$$IBE$$ 
            FOR SELECT ARTI_COD, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN
                INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                DO
                BEGIN
                SELECT COUNT(REPA_ARTICULO) FROM REPORTES_AUX WHERE REPA_ID = 3 AND REPA_USER = USER AND REPA_ARTICULO = :articulo INTO :numrows;
                if (numrows = 0) then
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        END
    if (BIN_AND(TIPO, 4) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 33 INTO :NOMTIPO;
         $$IBE$$*/ /* BORRA LA TABLA AUXILIAR */ /*$$IBE$$ 
        DELETE FROM reportes_aux WHERE REPA_ID = 3 AND REPA_USER = USER;

        FOR SELECT MAX(T.TERC_NIT), MAX(TERC_NOM), MAX(TERC_TEL), MAX(TERC_CIU), MAX(ZONA_COD), MAX(D.ARTI_COD), SUM(DVDE_CANT * DVDE_FACTOR), SUM(DEVT_FACTOR*(DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO)),
            SUM(DEVT_FACTOR*DVDE_IVAMONTO), SUM(DEVT_FACTOR*DVDE_TOTAL),
            MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD), SUM(COST_ENTP), max(v.devt_sucursal)
            FROM devoluciones_ventas_detalle D, DEVOLUCIONES_VENTAS V, PREFIJOS P, terceros T, CLIENTES C, ARTICULO A, MOVIMIENTO_ARTICULO M, COSTOS CO
            WHERE C.TERC_NIT = T.TERC_NIT AND TERC_CLIE = 'S' AND V.terc_nit = T.terc_nit AND T.TERC_NIT >= :TERINI AND T.TERC_NIT <= :TERFIN AND
            V.DEVT_ID = D.DEVT_ID AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND DEVT_ANULADO = 'N'
            AND P.PREF_PRE = V.PREF_PRE AND P.TIDO_COD = 33 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) and substring(D.arti_cod from 1 FOR 2) <> '.t'
            AND D.ARTI_COD = A.arti_cod AND A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN
            AND V.devt_id = M.mvar_idref AND M.mvar_tipodoc = 33 AND M.mvar_item = D.dvde_item AND M.mvar_cons = CO.cost_idmov
            GROUP BY T.TERC_NIT, v.devt_sucursal, D.ARTI_COD
            INTO :NIT, :NOMBRE, :TELEFONO, :CIUDAD, :CODZONA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :TOTAL,
                :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :COSTO, :sucursal
            DO
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            TOTAL = TOTAL * -1;
            IVA = IVA * -1;
            BASE = BASE * -1;
            CANTIDAD = CANTIDAD * -1;
            COSTO = COSTO * -1;
            UTILIDAD = UTILIDAD * -1;
            if (CEROS = 'S') then
                INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (3, USER, :ARTICULO);
            SUSPEND;
            END  $$IBE$$*/ /* FOR */ /*$$IBE$$ 
        if (CEROS = 'S') then
            BEGIN
            COSTO = 0;
            UTILIDAD = 0;
            PORC = 0;
             $$IBE$$*/ /* agregue los articulos sin factura */ /*$$IBE$$ 
            FOR SELECT ARTI_COD, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN
                INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                DO
                BEGIN
                SELECT COUNT(REPA_ARTICULO) FROM REPORTES_AUX WHERE REPA_ID = 3 AND REPA_USER = USER AND REPA_ARTICULO = :articulo INTO :numrows;
                if (numrows = 0) then
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        END
    if (BIN_AND(TIPO, 8) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 34 INTO :NOMTIPO;
         $$IBE$$*/ /* BORRA LA TABLA AUXILIAR */ /*$$IBE$$ 
        DELETE FROM reportes_aux WHERE REPA_ID = 3 AND REPA_USER = USER;

        FOR SELECT MAX(T.TERC_NIT), MAX(TERC_NOM), MAX(TERC_TEL), MAX(TERC_CIU), MAX(ZONA_COD), MAX(ARTI_COD), SUM(PEDE_CANT * PEDE_FACTOR), SUM(PEDI_FACTOR*(PEDE_TOTAL-PEDE_IVAMONTO-PEDE_CONSUMO)),
            SUM(PEDI_FACTOR*PEDE_IVAMONTO), SUM(PEDI_FACTOR*PEDE_TOTAL), max(p.pedi_sucursal)
            FROM PEDIDOS_DETALLE D, PEDIDOS P, PREFIJOS PR, terceros T, CLIENTES C
            WHERE C.TERC_NIT = T.TERC_NIT AND TERC_CLIE = 'S' AND P.terc_nit = T.terc_nit AND T.TERC_NIT >= :TERINI AND T.TERC_NIT <= :TERFIN AND
            P.PEDI_ID = D.PEDI_ID AND PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND PEDI_ANULADO = 'N'
            AND PR.PREF_PRE = P.PREF_PRE AND P.TIDO_COD = 34 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY T.TERC_NIT, p.pedi_sucursal, ARTI_COD
            INTO :NIT, :NOMBRE, :TELEFONO, :CIUDAD, :CODZONA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :TOTAL, :sucursal
            DO
            BEGIN
            SELECT ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                FROM ARTICULO WHERE ARTI_COD = :ARTICULO
                INTO :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC;
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            EXECUTE PROCEDURE costo_promedio (:ARTICULO, :FECFIN) RETURNING_VALUES (:COSTOUNIT);
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            COSTO = CANTIDAD * COSTOUNIT;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            if (CEROS = 'S') then
                INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (3, USER, :ARTICULO);
            SUSPEND;
            END  $$IBE$$*/ /* FOR */ /*$$IBE$$ 
        if (CEROS = 'S') then
            BEGIN
            COSTO = 0;
            UTILIDAD = 0;
            PORC = 0;
             $$IBE$$*/ /* agregue los articulos sin factura */ /*$$IBE$$ 
            FOR SELECT ARTI_COD, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN
                INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                DO
                BEGIN
                SELECT COUNT(REPA_ARTICULO) FROM REPORTES_AUX WHERE REPA_ID = 3 AND REPA_USER = USER AND REPA_ARTICULO = :articulo INTO :numrows;
                if (numrows = 0) then
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        END
    if (BIN_AND(TIPO, 16) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 35 INTO :NOMTIPO;
         $$IBE$$*/ /* BORRA LA TABLA AUXILIAR */ /*$$IBE$$ 
        DELETE FROM reportes_aux WHERE REPA_ID = 3 AND REPA_USER = USER;

        FOR SELECT MAX(T.TERC_NIT), MAX(TERC_NOM), MAX(TERC_TEL), MAX(TERC_CIU), MAX(ZONA_COD), MAX(ARTI_COD), SUM(CTDE_CANT * CTDE_FACTOR), SUM(COTI_FACTOR*(CTDE_TOTAL-CTDE_IVAMONTO-CTDE_CONSUMO)),
            SUM(COTI_FACTOR*CTDE_IVAMONTO), SUM(COTI_FACTOR*CTDE_TOTAL), max(ct.coti_sucursal)
            FROM COTIZACIONES_DETALLE D, COTIZACIONES CT, PREFIJOS P, terceros T, CLIENTES C
            WHERE C.TERC_NIT = T.TERC_NIT AND TERC_CLIE = 'S' AND C.terc_nit = T.terc_nit AND T.TERC_NIT >= :TERINI AND T.TERC_NIT <= :TERFIN AND
            CT.COTI_ID = D.COTI_ID AND COTI_FECHA >= :FECINI AND COTI_FECHA <= :FECFIN AND COTI_ANULADO = 'N'
            AND P.PREF_PRE = CT.PREF_PRE AND P.TIDO_COD = 35 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY T.TERC_NIT, ct.coti_sucursal, ARTI_COD
            INTO :NIT, :NOMBRE, :TELEFONO, :CIUDAD, :CODZONA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :TOTAL, :sucursal
            DO
            BEGIN
            SELECT ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                FROM ARTICULO WHERE ARTI_COD = :ARTICULO
                INTO :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC;
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            EXECUTE PROCEDURE costo_promedio (:ARTICULO, :FECFIN) RETURNING_VALUES (:COSTOUNIT);
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            COSTO = CANTIDAD * COSTOUNIT;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            if (CEROS = 'S') then
                INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (3, USER, :ARTICULO);
            SUSPEND;
            END  $$IBE$$*/ /* FOR */ /*$$IBE$$ 
        if (CEROS = 'S') then
            BEGIN
            COSTO = 0;
            UTILIDAD = 0;
            PORC = 0;
             $$IBE$$*/ /* agregue los articulos sin factura */ /*$$IBE$$ 
            FOR SELECT ARTI_COD, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN
                INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                DO
                BEGIN
                SELECT COUNT(REPA_ARTICULO) FROM REPORTES_AUX WHERE REPA_ID = 3 AND REPA_USER = USER AND REPA_ARTICULO = :articulo INTO :numrows;
                if (numrows = 0) then
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        END
    END
ELSE
    BEGIN
    if (BIN_AND(TIPO, 1) <> 0) then
            BEGIN
            SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 31 INTO :NOMTIPO;
            FOR SELECT F.PREF_PRE, FACT_NUMERO, FACT_FECHA, ARTI_COD, FADE_CANT * FADE_FACTOR, (FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO)*FACT_FACTOR,
                FADE_IVAMONTO*FACT_FACTOR, FADE_DTOPORC, FADE_TOTAL*FACT_FACTOR, F.terc_nit, F.fact_nomcliente, f.fact_sucursal
                FROM FACTURAS F, FACTURAS_DETALLE D, PREFIJOS P
                WHERE F.FACT_ID = D.FACT_ID AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND F.TERC_NIT >= :TERINI AND F.TERC_NIT <= :TERFIN AND FACT_ANULADO = 'N'
                 AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) and substring(D.arti_cod from 1 FOR 2) <> '.t'
                ORDER BY f.terc_nit, f.fact_sucursal, ARTI_COD, FACT_FECHA, F.FACT_ID, FADE_ITEM
                INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :DTO, :TOTAL, :NIT, :nombre, :sucursal
                DO
                BEGIN
                SELECT ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO WHERE ARTI_COD = :ARTICULO
                    INTO :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC;
                SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                EXECUTE PROCEDURE costo_promedio (:ARTICULO, :FECHA) RETURNING_VALUES (:COSTOUNIT);
                COSTO = COSTOUNIT * CANTIDAD;
                UTILIDAD = BASE - COSTO;
                if (UOM = 'UTILIDAD') then
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                else
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
                SUSPEND;
                END
            END
    if (BIN_AND(TIPO, 2) <> 0) then
            BEGIN
            SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 32 INTO :NOMTIPO;
            FOR SELECT R.PREF_PRE, REVT_NUMERO, REVT_FECHA, ARTI_COD, RVDE_CANT * RVDE_FACTOR,
                (RVDE_TOTAL - RVDE_IVAMONTO), RVDE_IVAMONTO, RVDE_DTOPORC, RVDE_TOTAL, R.terc_nit, R.revt_nomterc, r.revt_sucursal
                FROM REMISIONES_VENTA R, REMISIONES_VENTA_DETALLE D, PREFIJOS P
                WHERE R.REVT_ID = D.REVT_ID AND REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN AND R.TERC_NIT >= :TERINI AND R.TERC_NIT <= :TERFIN AND REVT_ANULADO = 'N'
                 AND P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = 32 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                ORDER BY r.terc_nit, r.revt_sucursal, ARTI_COD, REVT_FECHA, R.REVT_ID, RVDE_ITEM
                INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :DTO, :TOTAL, :NIT, :nombre, :sucursal
                DO
                BEGIN
                SELECT ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO WHERE ARTI_COD = :ARTICULO
                    INTO :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC;
                SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                EXECUTE PROCEDURE costo_promedio (:ARTICULO, :FECHA) RETURNING_VALUES (:COSTOUNIT);
                COSTO = COSTOUNIT * CANTIDAD;
                UTILIDAD = BASE - COSTO;
                if (UOM = 'UTILIDAD') then
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                else
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
                SUSPEND;
                END
            END
    if (BIN_AND(TIPO, 4) <> 0) then
            BEGIN
            SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 33 INTO :NOMTIPO;
            FOR SELECT V.PREF_PRE, DEVT_NUMERO, DEVT_FECHA, ARTI_COD, DVDE_CANT * DVDE_FACTOR, (DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO)*DEVT_FACTOR,
                DVDE_IVAMONTO*DEVT_FACTOR, DVDE_DTOPORC, DVDE_TOTAL*DEVT_FACTOR, V.terc_nit, V.devt_nomterc, v.devt_sucursal
                FROM DEVOLUCIONES_VENTAS V, DEVOLUCIONES_VENTAS_DETALLE D, PREFIJOS P
                WHERE V.DEVT_ID = D.DEVT_ID AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND V.TERC_NIT >= :TERINI AND V.TERC_NIT <= :TERFIN AND DEVT_ANULADO = 'N'
                 AND P.PREF_PRE = V.PREF_PRE AND P.TIDO_COD = 33 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))  and substring(D.arti_cod from 1 FOR 2) <> '.t'
                ORDER BY v.terc_nit, v.devt_sucursal, ARTI_COD, DEVT_FECHA, D.DEVT_ID, DVDE_ITEM
                INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :DTO, :TOTAL, :NIT, :nombre, :sucursal
                DO
                BEGIN
                SELECT ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO WHERE ARTI_COD = :ARTICULO
                    INTO :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC;
                SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                EXECUTE PROCEDURE costo_promedio (:ARTICULO, :FECHA) RETURNING_VALUES (:COSTOUNIT);
                COSTO = COSTOUNIT * CANTIDAD;
                UTILIDAD = BASE - COSTO;
                if (UOM = 'UTILIDAD') then
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                else
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
                TOTAL = TOTAL * -1;
                IVA = IVA * -1;
                BASE = BASE * -1;
                CANTIDAD = CANTIDAD * -1;
                COSTO = COSTO * -1;
                UTILIDAD = UTILIDAD * -1;
                SUSPEND;
                END
            END
    if (BIN_AND(TIPO, 8) <> 0) then
            BEGIN
            SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 34 INTO :NOMTIPO;
            FOR SELECT P.PREF_PRE, PEDI_NUMERO, PEDI_FECHA, ARTI_COD, PEDE_CANT * PEDE_FACTOR, (PEDE_TOTAL-PEDE_IVAMONTO-PEDE_CONSUMO)*PEDI_FACTOR,
                PEDE_IVAMONTO*PEDI_FACTOR, PEDE_DTOPORC, PEDE_TOTAL*PEDI_FACTOR, P.terc_nit, P.pedi_nomterc, p.pedi_sucursal
                FROM PEDIDOS P, PEDIDOS_DETALLE D, PREFIJOS PR
                WHERE P.PEDI_ID = D.PEDI_ID AND PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND P.TERC_NIT >= :TERINI AND P.TERC_NIT <= :TERFIN AND PEDI_ANULADO = 'N'
                 AND P.PREF_PRE = PR.PREF_PRE AND P.TIDO_COD = 34 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                ORDER BY p.terc_nit, p.pedi_sucursal, ARTI_COD, PEDI_FECHA, P.PEDI_ID, PEDE_ITEM
                INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :DTO, :TOTAL, :NIT, :nombre, :sucursal
                DO
                BEGIN
                SELECT ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO WHERE ARTI_COD = :ARTICULO
                    INTO :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC;
                SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                EXECUTE PROCEDURE costo_promedio (:ARTICULO, :FECHA) RETURNING_VALUES (:COSTOUNIT);
                COSTO = COSTOUNIT * CANTIDAD;
                UTILIDAD = BASE - COSTO;
                if (UOM = 'UTILIDAD') then
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                else
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
                SUSPEND;
                END
            END
    if (BIN_AND(TIPO, 16) <> 0) then
            BEGIN
            SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 35 INTO :NOMTIPO;
            FOR SELECT C.PREF_PRE, COTI_NUMERO, COTI_FECHA, ARTI_COD, CTDE_CANT * CTDE_FACTOR, (CTDE_TOTAL-CTDE_IVAMONTO-CTDE_CONSUMO)*COTI_FACTOR,
                CTDE_IVAMONTO*COTI_FACTOR, CTDE_DTOPORC, CTDE_TOTAL*COTI_FACTOR, C.terc_nit, C.coti_nomterc, c.coti_sucursal
                FROM COTIZACIONES C, COTIZACIONES_DETALLE D, PREFIJOS P
                WHERE C.COTI_ID = D.COTI_ID AND ARTI_COD = :ARTICULO AND COTI_FECHA >= :FECINI AND COTI_FECHA <= :FECFIN AND C.TERC_NIT >= :TERINI AND C.TERC_NIT <= :TERFIN AND COTI_ANULADO = 'N'
                 AND P.PREF_PRE = C.PREF_PRE AND P.TIDO_COD = 35 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                ORDER BY c.terc_nit, c.coti_sucursal, COTI_FECHA, C.COTI_ID, CTDE_ITEM
                INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :DTO, :TOTAL, :NIT, :nombre, :sucursal
                DO
                BEGIN
                SELECT ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO WHERE ARTI_COD = :ARTICULO
                    INTO :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC;
                SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                EXECUTE PROCEDURE costo_promedio (:ARTICULO, :FECHA) RETURNING_VALUES (:COSTOUNIT);
                COSTO = COSTOUNIT * CANTIDAD;
                UTILIDAD = BASE - COSTO;
                if (UOM = 'UTILIDAD') then
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                else
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
                SUSPEND;
                END
            END
    END
 $$IBE$$*/ SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE REP_UTILIDAD_VENDEDOR(
    TIPO INTEGER,
    DETALLE CHAR(1),
    VENINI VARCHAR(20),
    VENFIN VARCHAR(20),
    FECINI DATE,
    FECFIN DATE,
    ARTINI VARCHAR(15),
    ARTFIN VARCHAR(15),
    ORDEN CHAR(1),
    CEROS CHAR(1),
    SUBEMPRESA INTEGER)
RETURNS (
    CODVEND VARCHAR(20),
    NOMVEND VARCHAR(60),
    NOMTIPO VARCHAR(50),
    ARTICULO VARCHAR(15),
    DESCRIPCION VARCHAR(60),
    CODGRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    CODSUBG VARCHAR(3),
    NOMSUBG VARCHAR(30),
    CODMARC VARCHAR(3),
    NOMMARC VARCHAR(30),
    UNIDAD VARCHAR(8),
    CANTIDAD NUMERIC(18,4),
    BASE NUMERIC(18,2),
    IVA NUMERIC(18,2),
    CONSUMO NUMERIC(18,2),
    COSTO NUMERIC(18,2),
    UTILIDAD NUMERIC(18,4),
    PORC NUMERIC(9,2),
    TOTAL NUMERIC(18,2),
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    DTO NUMERIC(9,2))
AS
DECLARE VARIABLE COSTOUNIT NUMERIC(18,4);
DECLARE VARIABLE CODINI VARCHAR(15);
DECLARE VARIABLE CODFIN VARCHAR(15);
DECLARE VARIABLE DESINI VARCHAR(15);
DECLARE VARIABLE DESFIN VARCHAR(15);
declare variable UOM VARCHAR(20);
BEGIN /*$$IBE$$ 
if (ORDEN = 'C') then
    BEGIN
    CODINI = ARTINI;
    CODFIN = ARTFIN;
    DESINI = '';
    DESFIN = 'zz';
    END
ELSE
    BEGIN
    DESINI = ARTINI;
    DESFIN = ARTFIN;
    CODINI = '';
    CODFIN = 'zz';
    END
  EXECUTE PROCEDURE lee_configuracion ('FACTURACION', 'ARTICULOS', 'SUGERIR PRECIOS CON PORCENTAJE DE MARGEN O UTILIDAD') returning_values (:UOM);
  SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = :TIPO INTO :NOMTIPO;
  FOR select VEND_COD, VEND_NOMBRE
    from VENDEDORES
    where VEND_COD >= :VENINI AND VEND_COD <= :VENFIN
    INTO :CODVEND, :NOMVEND
    DO  
    BEGIN
    if (DETALLE = 'N') then
        BEGIN
        if (BIN_AND(TIPO, 1) <> 0) then
            BEGIN
            SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 31 INTO :NOMTIPO;
             $$IBE$$*/ /* BORRA LA TABLA AUXILIAR */ /*$$IBE$$ 
            DELETE FROM reportes_aux WHERE REPA_ID = 4 AND REPA_USER = USER;
            FOR SELECT MAX(D.ARTI_COD), SUM(FADE_CANT * FADE_FACTOR), SUM(FACT_FACTOR*(FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO)),
                SUM(FACT_FACTOR*FADE_IVAMONTO), SUM(FACT_FACTOR*FADE_TOTAL), SUM(FADE_CONSUMO),
                MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD), SUM(COST_SALP)
                FROM FACTURAS_DETALLE D, FACTURAS F, PREFIJOS P, ARTICULO A, movimiento_articulo m, costos c
                WHERE F.FACT_ID = D.FACT_ID AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND VEND_COD = :CODVEND AND FACT_ANULADO = 'N'
                 AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) and substring(D.arti_cod from 1 FOR 2) <> '.t'
                 AND D.ARTI_COD = A.arti_cod AND A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN
                 AND F.fact_id = M.mvar_idref AND M.mvar_tipodoc = 31 AND M.mvar_item = D.fade_item AND M.mvar_cons = C.cost_idmov
                GROUP BY D.ARTI_COD
                INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :TOTAL, :CONSUMO,
                    :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :COSTO
                DO
                BEGIN
                SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                if (CANTIDAD IS NULL) then
                    CANTIDAD = 0;
                if (BASE IS NULL) then
                    BASE = 0;
                if (IVA IS NULL) then
                    IVA = 0;
                UTILIDAD = BASE - COSTO;
                if (UOM = 'UTILIDAD') then
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                else
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
                if (CEROS = 'S') then
                    begin
                    INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (4, USER, :ARTICULO);
                    SUSPEND;
                    end
                ELSE
                    if ((BASE <> 0) AND (CANTIDAD <> 0)) then
                        SUSPEND;
                END
            if (CEROS = 'S') then
                BEGIN
                COSTO = 0;
                UTILIDAD = 0;
                PORC = 0;
                 $$IBE$$*/ /* agregue los articulos sin factura */ /*$$IBE$$ 
                FOR SELECT ARTI_COD, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN and
                    not exists (select REPA_ARTICULO FROM REPORTES_AUX WHERE REPA_ID = 4 AND REPA_USER = USER AND REPA_ARTICULO = a.arti_cod)
                    INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                    DO
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        if (BIN_AND(TIPO, 2) <> 0) then
            BEGIN
            SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 32 INTO :NOMTIPO;
            FOR SELECT MAX(D.ARTI_COD), SUM(RVDE_CANT * RVDE_FACTOR), SUM(RVDE_TOTAL-RVDE_IVAMONTO-RVDE_CONSUMO), SUM(RVDE_IVAMONTO), SUM(RVDE_TOTAL), SUM(RVDE_CONSUMO),
                MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD), SUM(COST_SALP)
                FROM REMISIONES_VENTA_DETALLE D, REMISIONES_VENTA R, PREFIJOS P, ARTICULO A, movimiento_articulo m, costos c
                WHERE R.REVT_ID = D.REVT_ID AND REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN AND VEND_COD = :CODVEND AND REVT_ANULADO = 'N'
                 AND P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = 32 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                 AND D.ARTI_COD = A.arti_cod AND A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN
                 AND r.revt_id = M.mvar_idref AND M.mvar_tipodoc = 32 AND M.mvar_item = D.rvde_item AND M.mvar_cons = C.cost_idmov
                GROUP BY D.ARTI_COD
                INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :TOTAL, :CONSUMO,
                    :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :COSTO
                DO
                BEGIN
                SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                if (CANTIDAD IS NULL) then
                    CANTIDAD = 0;
                if (BASE IS NULL) then
                    BASE = 0;
                if (IVA IS NULL) then
                    IVA = 0;
                UTILIDAD = BASE - COSTO;
                if (UOM = 'UTILIDAD') then
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                else
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
                if (CEROS = 'S') then
                    begin
                    INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (4, USER, :ARTICULO);
                    SUSPEND;
                    end
                ELSE
                    if ((BASE <> 0) AND (CANTIDAD <> 0)) then
                        SUSPEND;
                END
            if (CEROS = 'S') then
                BEGIN
                COSTO = 0;
                UTILIDAD = 0;
                PORC = 0;
                 $$IBE$$*/ /* agregue los articulos sin factura */ /*$$IBE$$ 
                FOR SELECT ARTI_COD, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN and
                    not exists (select REPA_ARTICULO FROM REPORTES_AUX WHERE REPA_ID = 4 AND REPA_USER = USER AND REPA_ARTICULO = a.arti_cod)
                    INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                    DO
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        if (BIN_AND(TIPO, 4) <> 0) then
            BEGIN
            SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 33 INTO :NOMTIPO;
            FOR SELECT MAX(D.ARTI_COD), SUM(DVDE_CANT * DVDE_FACTOR), SUM(DEVT_FACTOR*(DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO)),
                SUM(DEVT_FACTOR*DVDE_IVAMONTO), SUM(DEVT_FACTOR*DVDE_TOTAL), SUM(DVDE_CONSUMO),
                MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD), SUM(COST_ENTP)
                FROM devoluciones_ventas_detalle D, DEVOLUCIONES_VENTAS V, PREFIJOS P, ARTICULO A, MOVIMIENTO_ARTICULO M, COSTOS C
                WHERE V.DEVT_ID = D.DEVT_ID AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND VEND_COD = :CODVEND AND DEVT_ANULADO = 'N'
                 AND P.PREF_PRE = V.PREF_PRE AND P.TIDO_COD = 33 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) and substring(D.arti_cod from 1 FOR 2) <> '.t'
                 AND D.ARTI_COD = A.arti_cod AND A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN
                 AND V.devt_id = M.mvar_idref AND M.mvar_tipodoc = 33 AND M.mvar_item = D.dvde_item AND M.mvar_cons = C.cost_idmov
                GROUP BY D.ARTI_COD
                INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :TOTAL, :CONSUMO,
                    :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :COSTO
                DO
                BEGIN
                SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                if (CANTIDAD IS NULL) then
                    CANTIDAD = 0;
                if (BASE IS NULL) then
                    BASE = 0;
                if (IVA IS NULL) then
                    IVA = 0;
                UTILIDAD = BASE - COSTO;
                if (UOM = 'UTILIDAD') then
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                else
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
                TOTAL = TOTAL * -1;
                IVA = IVA * -1;
                BASE = BASE * -1;
                CANTIDAD = CANTIDAD * -1;
                COSTO = COSTO * -1;
                UTILIDAD = UTILIDAD * -1;
                if (CEROS = 'S') then
                    begin
                    INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (4, USER, :ARTICULO);
                    SUSPEND;
                    end
                ELSE
                    if ((BASE <> 0) AND (CANTIDAD <> 0)) then
                        SUSPEND;
                END
            if (CEROS = 'S') then
                BEGIN
                COSTO = 0;
                UTILIDAD = 0;
                PORC = 0;
                 $$IBE$$*/ /* agregue los articulos sin factura */ /*$$IBE$$ 
                FOR SELECT ARTI_COD, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN and
                    not exists (select REPA_ARTICULO FROM REPORTES_AUX WHERE REPA_ID = 4 AND REPA_USER = USER AND REPA_ARTICULO = a.arti_cod)
                    INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                    DO
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        if (BIN_AND(TIPO, 8) <> 0) then
            BEGIN
            SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 34 INTO :NOMTIPO;
            FOR SELECT MAX(ARTI_COD), SUM(PEDE_CANT * PEDE_FACTOR), SUM(PEDI_FACTOR*(PEDE_TOTAL-PEDE_IVAMONTO-PEDE_CONSUMO)),
                SUM(PEDI_FACTOR*PEDE_IVAMONTO), SUM(PEDI_FACTOR*PEDE_TOTAL), SUM(PEDE_CONSUMO)
                FROM PEDIDOS_DETALLE D, PEDIDOS P, PREFIJOS PR
                WHERE P.PEDI_ID = D.PEDI_ID AND PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND VEND_COD = :CODVEND AND PEDI_ANULADO = 'N'
                 AND PR.PREF_PRE = P.PREF_PRE AND P.TIDO_COD = 34 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                GROUP BY ARTI_COD
                INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :TOTAL, :CONSUMO
                DO
                BEGIN
                SELECT ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO WHERE ARTI_COD = :ARTICULO
                    INTO :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC;
                SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                EXECUTE PROCEDURE costo_promedio (:ARTICULO, :FECFIN) RETURNING_VALUES (:COSTOUNIT);
                if (CANTIDAD IS NULL) then
                    CANTIDAD = 0;
                if (BASE IS NULL) then
                    BASE = 0;
                if (IVA IS NULL) then
                    IVA = 0;
                COSTO = CANTIDAD * COSTOUNIT;
                UTILIDAD = BASE - COSTO;
                if (UOM = 'UTILIDAD') then
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                else
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
                if (CEROS = 'S') then
                    begin
                    INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (4, USER, :ARTICULO);
                    SUSPEND;
                    end
                ELSE
                    if ((BASE <> 0) AND (CANTIDAD <> 0)) then
                        SUSPEND;
                END
            if (CEROS = 'S') then
                BEGIN
                COSTO = 0;
                UTILIDAD = 0;
                PORC = 0;
                 $$IBE$$*/ /* agregue los articulos sin factura */ /*$$IBE$$ 
                FOR SELECT ARTI_COD, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN and
                    not exists (select REPA_ARTICULO FROM REPORTES_AUX WHERE REPA_ID = 4 AND REPA_USER = USER AND REPA_ARTICULO = a.arti_cod)
                    INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                    DO
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        if (BIN_AND(TIPO, 16) <> 0) then
            BEGIN
            SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 35 INTO :NOMTIPO;
            FOR SELECT MAX(ARTI_COD), SUM(CTDE_CANT * CTDE_FACTOR), SUM(COTI_FACTOR*(CTDE_TOTAL-CTDE_IVAMONTO-CTDE_CONSUMO)),
                SUM(COTI_FACTOR*CTDE_IVAMONTO), SUM(COTI_FACTOR*CTDE_TOTAL), SUM(CTDE_CONSUMO)
                FROM COTIZACIONES_DETALLE D, COTIZACIONES C, PREFIJOS P
                WHERE C.COTI_ID = D.COTI_ID AND COTI_FECHA >= :FECINI AND COTI_FECHA <= :FECFIN AND VEND_COD = :CODVEND AND COTI_ANULADO = 'N'
                 AND P.PREF_PRE = C.PREF_PRE AND P.TIDO_COD = 35 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                GROUP BY ARTI_COD
                INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :TOTAL, :CONSUMO
                DO
                BEGIN
                SELECT ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO WHERE ARTI_COD = :ARTICULO
                    INTO :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC;
                SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                EXECUTE PROCEDURE costo_promedio (:ARTICULO, :FECFIN) RETURNING_VALUES (:COSTOUNIT);
                if (CANTIDAD IS NULL) then
                    CANTIDAD = 0;
                if (BASE IS NULL) then
                    BASE = 0;
                if (IVA IS NULL) then
                    IVA = 0;
                COSTO = CANTIDAD * COSTOUNIT;
                UTILIDAD = BASE - COSTO;
                if (UOM = 'UTILIDAD') then
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                else
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
                if (CEROS = 'S') then
                    begin
                    INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (4, USER, :ARTICULO);
                    SUSPEND;
                    end
                ELSE
                    if ((BASE <> 0) AND (CANTIDAD <> 0)) then
                        SUSPEND;
                END
            if (CEROS = 'S') then
                BEGIN
                COSTO = 0;
                UTILIDAD = 0;
                PORC = 0;
                 $$IBE$$*/ /* agregue los articulos sin factura */ /*$$IBE$$ 
                FOR SELECT ARTI_COD, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN and
                    not exists (select REPA_ARTICULO FROM REPORTES_AUX WHERE REPA_ID = 4 AND REPA_USER = USER AND REPA_ARTICULO = a.arti_cod)
                    INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                    DO
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        END
    ELSE
        BEGIN
        if (BIN_AND(TIPO, 1) <> 0) then
            BEGIN
            SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 31 INTO :NOMTIPO;
            FOR SELECT F.PREF_PRE, FACT_NUMERO, FACT_FECHA, ARTI_COD, FADE_CANT * FADE_FACTOR, (FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO)*FACT_FACTOR,
                FADE_IVAMONTO*FACT_FACTOR, FADE_DTOPORC, FADE_TOTAL*FACT_FACTOR, FADE_CONSUMO
                FROM FACTURAS F, FACTURAS_DETALLE D, PREFIJOS P
                WHERE F.FACT_ID = D.FACT_ID AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND VEND_COD = :CODVEND AND FACT_ANULADO = 'N'
                 AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) and substring(D.arti_cod from 1 FOR 2) <> '.t'
                ORDER BY ARTI_COD, FACT_FECHA, F.FACT_ID, FADE_ITEM
                INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :DTO, :TOTAL, :CONSUMO
                DO
                BEGIN
                SELECT ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO WHERE ARTI_COD = :ARTICULO
                    INTO :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC;
                SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                EXECUTE PROCEDURE costo_promedio (:ARTICULO, :FECHA) RETURNING_VALUES (:COSTOUNIT);
                COSTO = COSTOUNIT * CANTIDAD;
                UTILIDAD = BASE - COSTO;
                if (UOM = 'UTILIDAD') then
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                else
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
                if (CEROS = 'S') then
                    INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (4, USER, :ARTICULO);
                SUSPEND;
                END
            if (CEROS = 'S') then
                BEGIN
                COSTO = 0;
                UTILIDAD = 0;
                PORC = 0;
                 $$IBE$$*/ /* agregue los articulos sin factura */ /*$$IBE$$ 
                FOR SELECT ARTI_COD, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN and
                    not exists (select REPA_ARTICULO FROM REPORTES_AUX WHERE REPA_ID = 4 AND REPA_USER = USER AND REPA_ARTICULO = a.arti_cod)
                    INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                    DO
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        if (BIN_AND(TIPO, 2) <> 0) then
            BEGIN
            SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 32 INTO :NOMTIPO;
            FOR SELECT R.PREF_PRE, REVT_NUMERO, REVT_FECHA, ARTI_COD, RVDE_CANT * RVDE_FACTOR, (RVDE_TOTAL - RVDE_IVAMONTO), RVDE_IVAMONTO, RVDE_DTOPORC, RVDE_TOTAL, RVDE_CONSUMO
                FROM REMISIONES_VENTA R, REMISIONES_VENTA_DETALLE D, PREFIJOS P
                WHERE R.REVT_ID = D.REVT_ID AND REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN AND VEND_COD = :CODVEND AND REVT_ANULADO = 'N'
                 AND P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = 32 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) and substring(D.arti_cod from 1 FOR 2) <> '.t'
                ORDER BY ARTI_COD, REVT_FECHA, R.REVT_ID, RVDE_ITEM
                INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :DTO, :TOTAL, :CONSUMO
                DO
                BEGIN
                SELECT ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO WHERE ARTI_COD = :ARTICULO
                    INTO :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC;
                SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                EXECUTE PROCEDURE costo_promedio (:ARTICULO, :FECHA) RETURNING_VALUES (:COSTOUNIT);
                COSTO = COSTOUNIT * CANTIDAD;
                UTILIDAD = BASE - COSTO;
                if (UOM = 'UTILIDAD') then
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                else
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
                if (CEROS = 'S') then
                    INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (4, USER, :ARTICULO);
                SUSPEND;
                END
            if (CEROS = 'S') then
                BEGIN
                COSTO = 0;
                UTILIDAD = 0;
                PORC = 0;
                 $$IBE$$*/ /* agregue los articulos sin factura */ /*$$IBE$$ 
                FOR SELECT ARTI_COD, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN and
                    not exists (select REPA_ARTICULO FROM REPORTES_AUX WHERE REPA_ID = 4 AND REPA_USER = USER AND REPA_ARTICULO = a.arti_cod)
                    INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                    DO
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        if (BIN_AND(TIPO, 4) <> 0) then
            BEGIN
            SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 33 INTO :NOMTIPO;
            FOR SELECT V.PREF_PRE, DEVT_NUMERO, DEVT_FECHA, ARTI_COD, DVDE_CANT * DVDE_FACTOR, (DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO)*DEVT_FACTOR,
                DVDE_IVAMONTO*DEVT_FACTOR, DVDE_DTOPORC, DVDE_TOTAL*DEVT_FACTOR, DVDE_CONSUMO
                FROM DEVOLUCIONES_VENTAS V, DEVOLUCIONES_VENTAS_DETALLE D, PREFIJOS P
                WHERE V.DEVT_ID = D.DEVT_ID AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND VEND_COD = :CODVEND AND DEVT_ANULADO = 'N'
                 AND P.PREF_PRE = V.PREF_PRE AND P.TIDO_COD = 33 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) and substring(D.arti_cod from 1 FOR 2) <> '.t'
                ORDER BY ARTI_COD, DEVT_FECHA, D.DEVT_ID, DVDE_ITEM
                INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :DTO, :TOTAL, :CONSUMO
                DO
                BEGIN
                SELECT ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO WHERE ARTI_COD = :ARTICULO
                    INTO :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC;
                SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                EXECUTE PROCEDURE costo_promedio (:ARTICULO, :FECHA) RETURNING_VALUES (:COSTOUNIT);
                COSTO = COSTOUNIT * CANTIDAD;
                UTILIDAD = BASE - COSTO;
                if (UOM = 'UTILIDAD') then
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                else
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
                TOTAL = TOTAL * -1;
                IVA = IVA * -1;
                BASE = BASE * -1;
                CANTIDAD = CANTIDAD * -1;
                COSTO = COSTO * -1;
                UTILIDAD = UTILIDAD * -1;
                if (CEROS = 'S') then
                    INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (4, USER, :ARTICULO);
                SUSPEND;
                END
            if (CEROS = 'S') then
                BEGIN
                COSTO = 0;
                UTILIDAD = 0;
                PORC = 0;
                 $$IBE$$*/ /* agregue los articulos sin factura */ /*$$IBE$$ 
                FOR SELECT ARTI_COD, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN and
                    not exists (select REPA_ARTICULO FROM REPORTES_AUX WHERE REPA_ID = 4 AND REPA_USER = USER AND REPA_ARTICULO = a.arti_cod)
                    INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                    DO
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        if (BIN_AND(TIPO, 8) <> 0) then
            BEGIN
            SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 34 INTO :NOMTIPO;
            FOR SELECT P.PREF_PRE, PEDI_NUMERO, PEDI_FECHA, ARTI_COD, PEDE_CANT * PEDE_FACTOR, (PEDE_TOTAL-PEDE_IVAMONTO-PEDE_CONSUMO)*PEDI_FACTOR,
                PEDE_IVAMONTO*PEDI_FACTOR, PEDE_DTOPORC, PEDE_TOTAL*PEDI_FACTOR, PEDE_CONSUMO
                FROM PEDIDOS P, PEDIDOS_DETALLE D, PREFIJOS PR
                WHERE P.PEDI_ID = D.PEDI_ID AND PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND VEND_COD = :CODVEND AND PEDI_ANULADO = 'N'
                 AND P.PREF_PRE = PR.PREF_PRE AND P.TIDO_COD = 34 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                ORDER BY ARTI_COD, PEDI_FECHA, P.PEDI_ID, PEDE_ITEM
                INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :DTO, :TOTAL, :CONSUMO
                DO
                BEGIN
                SELECT ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO WHERE ARTI_COD = :ARTICULO
                    INTO :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC;
                SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                EXECUTE PROCEDURE costo_promedio (:ARTICULO, :FECHA) RETURNING_VALUES (:COSTOUNIT);
                COSTO = COSTOUNIT * CANTIDAD;
                UTILIDAD = BASE - COSTO;
                if (UOM = 'UTILIDAD') then
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                else
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
                if (CEROS = 'S') then
                    INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (4, USER, :ARTICULO);
                SUSPEND;
                END
            if (CEROS = 'S') then
                BEGIN
                COSTO = 0;
                UTILIDAD = 0;
                PORC = 0;
                 $$IBE$$*/ /* agregue los articulos sin factura */ /*$$IBE$$ 
                FOR SELECT ARTI_COD, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN and
                    not exists (select REPA_ARTICULO FROM REPORTES_AUX WHERE REPA_ID = 4 AND REPA_USER = USER AND REPA_ARTICULO = a.arti_cod)
                    INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                    DO
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        if (BIN_AND(TIPO, 16) <> 0) then
            BEGIN
            SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 35 INTO :NOMTIPO;
            FOR SELECT C.PREF_PRE, COTI_NUMERO, COTI_FECHA, ARTI_COD, CTDE_CANT * CTDE_FACTOR, (CTDE_TOTAL-CTDE_IVAMONTO-CTDE_CONSUMO)*COTI_FACTOR,
                CTDE_IVAMONTO*COTI_FACTOR, CTDE_DTOPORC, CTDE_TOTAL*COTI_FACTOR, CTDE_CONSUMO
                FROM COTIZACIONES C, COTIZACIONES_DETALLE D, PREFIJOS P
                WHERE C.COTI_ID = D.COTI_ID AND ARTI_COD = :ARTICULO AND COTI_FECHA >= :FECINI AND COTI_FECHA <= :FECFIN AND VEND_COD = :CODVEND AND COTI_ANULADO = 'N'
                 AND P.PREF_PRE = C.PREF_PRE AND P.TIDO_COD = 35 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                ORDER BY COTI_FECHA, C.COTI_ID, CTDE_ITEM
                INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :DTO, :TOTAL, :CONSUMO
                DO
                BEGIN
                SELECT ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO WHERE ARTI_COD = :ARTICULO
                    INTO :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC;
                SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                EXECUTE PROCEDURE costo_promedio (:ARTICULO, :FECHA) RETURNING_VALUES (:COSTOUNIT);
                COSTO = COSTOUNIT * CANTIDAD;
                UTILIDAD = BASE - COSTO;
                if (UOM = 'UTILIDAD') then
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                else
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
                if (CEROS = 'S') then
                    INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (4, USER, :ARTICULO);
                SUSPEND;
                END
            if (CEROS = 'S') then
                BEGIN
                COSTO = 0;
                UTILIDAD = 0;
                PORC = 0;
                 $$IBE$$*/ /* agregue los articulos sin factura */ /*$$IBE$$ 
                FOR SELECT ARTI_COD, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN and
                    not exists (select REPA_ARTICULO FROM REPORTES_AUX WHERE REPA_ID = 4 AND REPA_USER = USER AND REPA_ARTICULO = a.arti_cod)
                    INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                    DO
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        END
    END
 $$IBE$$*/ SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE REP_UTILIDAD_VENTAS(
    TIPO INTEGER,
    DETALLE CHAR(1),
    FECINI DATE,
    FECFIN DATE,
    ARTINI VARCHAR(15),
    ARTFIN VARCHAR(15),
    GRPINI VARCHAR(3),
    GRPFIN VARCHAR(3),
    ORDEN CHAR(1),
    AGRUPA CHAR(1),
    CEROS CHAR(1),
    SUBEMPRESA INTEGER)
RETURNS (
    ARTICULO VARCHAR(15),
    DESCRIPCION VARCHAR(60),
    CODGRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    CODSUBG VARCHAR(3),
    NOMSUBG VARCHAR(30),
    CODMARC VARCHAR(3),
    NOMMARC VARCHAR(30),
    UNIDAD VARCHAR(8),
    CANTIDAD NUMERIC(18,4),
    BASE NUMERIC(18,4),
    COSTO NUMERIC(18,4),
    UTILIDAD NUMERIC(18,4),
    PORC NUMERIC(9,2),
    IVA NUMERIC(18,4),
    CONSUMO NUMERIC(18,4),
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    TIPODOC INTEGER)
AS
DECLARE VARIABLE COSTOUNIT NUMERIC(18,4);
declare variable CODINI VARCHAR(15);
declare variable CODFIN VARCHAR(15);
declare variable DESINI VARCHAR(15);
declare variable DESFIN VARCHAR(15);
declare variable MARINI VARCHAR(3);
declare variable MARFIN VARCHAR(3);
declare variable UOM VARCHAR(20);
declare variable NUMROWS INTEGER;
BEGIN /*$$IBE$$ 
if (ORDEN = 'C') then
    BEGIN
    CODINI = ARTINI;
    CODFIN = ARTFIN;
    DESINI = '';
    DESFIN = 'zz';
    END
ELSE
    BEGIN
    DESINI = ARTINI;
    DESFIN = ARTFIN;
    CODINI = '';
    CODFIN = 'zz';
    END
if (AGRUPA = 'G') then
    BEGIN
    MARINI = '';
    MARFIN = 'zz';
    END
ELSE
    if (AGRUPA = 'M') then
        BEGIN
        MARINI = GRPINI;
        MARFIN = GRPFIN;
        GRPINI = '';
        GRPFIN = 'zz';
        END
    ELSE
        BEGIN
        MARINI = '';
        MARFIN = 'zz';
        GRPINI = '';
        GRPFIN = 'zz';
        END
EXECUTE PROCEDURE lee_configuracion ('FACTURACION', 'ARTICULOS', 'SUGERIR PRECIOS CON PORCENTAJE DE MARGEN O UTILIDAD') returning_values (:UOM);
if (DETALLE = 'N') then
    BEGIN
    if (BIN_AND(TIPO, 1) <> 0) then
        BEGIN
        TIPODOC = 31;
         $$IBE$$*/ /* BORRA LA TABLA AUXILIAR */ /*$$IBE$$ 
        DELETE FROM reportes_aux WHERE REPA_ID = 2 AND REPA_USER = USER;

        FOR SELECT MAX(D.ARTI_COD), SUM(FADE_CANT * FADE_FACTOR), SUM((FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO)*FACT_FACTOR), SUM(FADE_IVAMONTO*FACT_FACTOR), SUM(FADE_CONSUMO),
            MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD), SUM(COST_SALP)
            FROM FACTURAS_DETALLE D, FACTURAS F, PREFIJOS P, ARTICULO A, movimiento_articulo m, costos c
            WHERE F.FACT_ID = D.FACT_ID AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND D.ARTI_COD = A.arti_cod AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            F.fact_id = M.mvar_idref AND M.mvar_tipodoc = 31 AND M.mvar_item = D.fade_item AND M.mvar_cons = C.cost_idmov AND
            FACT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) and substring(a.arti_cod from 1 FOR 2) <> '.t'
            GROUP BY D.ARTI_COD
            INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,
            :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :COSTO
            DO
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
 $$IBE$$*/ /*            EXECUTE PROCEDURE costo_promedio (:ARTICULO, :FECFIN) RETURNING_VALUES (:COSTOUNIT);*/ /*$$IBE$$ 
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
 $$IBE$$*/ /*            COSTO = cantidad * COSTOUNIT;*/ /*$$IBE$$ 
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                if (COSTO > 0) then
                    PORC = UTILIDAD * 100 / COSTO;
                ELSE
                    PORC = 100;
            else
                if (BASE > 0) then
                    PORC = UTILIDAD * 100 / BASE;
                ELSE
                    PORC = 0;
            if (CEROS = 'S') then
                INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (2, USER, :ARTICULO);
            SUSPEND;
            END  $$IBE$$*/ /* FOR */ /*$$IBE$$ 
        if (CEROS = 'S') then
            BEGIN
            COSTO = 0;
            UTILIDAD = 0;
            PORC = 0;
             $$IBE$$*/ /* agregue los articulos sin factura */ /*$$IBE$$ 
            FOR SELECT ARTI_COD, 0, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND
                    A.ARTI_DES <= :DESFIN AND A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND
                    (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN)))
                INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,:DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                DO
                BEGIN
                SELECT COUNT(REPA_ARTICULO) FROM REPORTES_AUX WHERE REPA_ID = 2 AND REPA_USER = USER AND REPA_ARTICULO = :articulo INTO :numrows;
                if (numrows = 0) then
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        END
    if (BIN_AND(TIPO, 2) <> 0) then
        BEGIN
        TIPODOC = 32;
         $$IBE$$*/ /* BORRA LA TABLA AUXILIAR */ /*$$IBE$$ 
        DELETE FROM reportes_aux WHERE REPA_ID = 2 AND REPA_USER = USER;

        FOR SELECT MAX(D.ARTI_COD), SUM(RVDE_CANT * RVDE_FACTOR), SUM(RVDE_TOTAL-RVDE_IVAMONTO-RVDE_CONSUMO), SUM(RVDE_IVAMONTO), SUM(RVDE_CONSUMO),
            MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD), SUM(COST_SALP)
            FROM REMISIONES_VENTA_DETALLE D, REMISIONES_VENTA R, PREFIJOS P, ARTICULO A, movimiento_articulo m, costos c
            WHERE R.REVT_ID = D.REVT_ID AND P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = 32 AND D.ARTI_COD = A.arti_cod AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            R.revt_id = M.mvar_idref AND M.mvar_tipodoc = 32 AND M.mvar_item = D.rvde_item AND M.mvar_cons = C.cost_idmov AND
            REVT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY D.ARTI_COD
            INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,
            :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :COSTO
            DO
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
 $$IBE$$*/ /*            EXECUTE PROCEDURE costo_promedio (:ARTICULO, :FECFIN) RETURNING_VALUES (:COSTOUNIT); */
/*            COSTO = cantidad * COSTOUNIT;*/ /*$$IBE$$ 
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                if (COSTO > 0) then
                    PORC = UTILIDAD * 100 / COSTO;
                ELSE
                    PORC = 100;
            else
                if (BASE > 0) then
                    PORC = UTILIDAD * 100 / BASE;
                ELSE
                    PORC = 0;
            if (CEROS = 'S') then
                INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (2, USER, :ARTICULO);
            SUSPEND;
            END  $$IBE$$*/ /* FOR */ /*$$IBE$$ 
        if (CEROS = 'S') then
            BEGIN
            COSTO = 0;
            UTILIDAD = 0;
            PORC = 0;
             $$IBE$$*/ /* agregue los articulos sin factura */ /*$$IBE$$ 
            FOR SELECT ARTI_COD, 0, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND
                    A.ARTI_DES <= :DESFIN AND A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND
                    (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN)))
                INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,:DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                DO
                BEGIN
                SELECT COUNT(REPA_ARTICULO) FROM REPORTES_AUX WHERE REPA_ID = 2 AND REPA_USER = USER AND REPA_ARTICULO = :articulo INTO :numrows;
                if (numrows = 0) then
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        END
    if (BIN_AND(TIPO, 4) <> 0) then
        BEGIN
        TIPODOC = 33;
         $$IBE$$*/ /* BORRA LA TABLA AUXILIAR */ /*$$IBE$$ 
        DELETE FROM reportes_aux WHERE REPA_ID = 2 AND REPA_USER = USER;

        FOR SELECT MAX(D.ARTI_COD), SUM(DVDE_CANT * DVDE_FACTOR), SUM((DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO)*DEVT_FACTOR), SUM(DVDE_IVAMONTO*DEVT_FACTOR), SUM(DVDE_CONSUMO),
            MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD), SUM(COST_ENTP)
            FROM devoluciones_ventas_detalle D, DEVOLUCIONES_VENTAS V, PREFIJOS P, ARTICULO A, MOVIMIENTO_ARTICULO M, COSTOS C
            WHERE V.DEVT_ID = D.DEVT_ID AND P.PREF_PRE = V.PREF_PRE AND P.TIDO_COD = 33 AND D.ARTI_COD = A.arti_cod AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            V.devt_id = M.mvar_idref AND M.mvar_tipodoc = 33 AND M.mvar_item = D.dvde_item AND M.mvar_cons = C.cost_idmov AND
            DEVT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY D.ARTI_COD
            INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,
            :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :COSTO
            DO
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            else
                CANTIDAD = CANTIDAD * -1;
            if (BASE IS NULL) then
                BASE = 0;
            else
                BASE = BASE * -1;
            if (IVA IS NULL) then
                IVA = 0;
            else
                IVA = IVA * -1;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            else
                CONSUMO = CONSUMO * -1;
 $$IBE$$*/ /*            EXECUTE PROCEDURE costo_promedio (:ARTICULO, :FECFIN) RETURNING_VALUES (:COSTOUNIT);*/
/*            COSTO = cantidad * COSTOUNIT;*/ /*$$IBE$$ 
            COSTO = costo * -1;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                if (COSTO < 0) then
                    PORC = UTILIDAD * 100 / COSTO;
                ELSE
                    PORC = 100;
            else
                if (BASE < 0) then
                    PORC = UTILIDAD * 100 / BASE;
                ELSE
                    PORC = 0;
            if (CEROS = 'S') then
                INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (2, USER, :ARTICULO);
            SUSPEND;
            END  $$IBE$$*/ /* FOR */ /*$$IBE$$ 
        if (CEROS = 'S') then
            BEGIN
            COSTO = 0;
            UTILIDAD = 0;
            PORC = 0;
             $$IBE$$*/ /* agregue los articulos sin factura */ /*$$IBE$$ 
            FOR SELECT ARTI_COD, 0, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND
                    A.ARTI_DES <= :DESFIN AND A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND
                    (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN)))
                INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,:DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                DO
                BEGIN
                SELECT COUNT(REPA_ARTICULO) FROM REPORTES_AUX WHERE REPA_ID = 2 AND REPA_USER = USER AND REPA_ARTICULO = :articulo INTO :numrows;
                if (numrows = 0) then
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        END
    if (BIN_AND(TIPO, 8) <> 0) then
        BEGIN
        TIPODOC = 34;
         $$IBE$$*/ /* BORRA LA TABLA AUXILIAR */ /*$$IBE$$ 
        DELETE FROM reportes_aux WHERE REPA_ID = 2 AND REPA_USER = USER;

        FOR SELECT MAX(D.ARTI_COD), SUM(PEDE_CANT * PEDE_FACTOR), SUM((PEDE_TOTAL-PEDE_IVAMONTO-PEDE_CONSUMO)*PEDI_FACTOR), SUM(PEDE_IVAMONTO*PEDI_FACTOR), SUM(PEDE_CONSUMO),
            MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD)
            FROM PEDIDOS_DETALLE D, PEDIDOS P, PREFIJOS R, ARTICULO A
            WHERE P.PEDI_ID = D.PEDI_ID AND P.PREF_PRE = R.PREF_PRE AND R.TIDO_COD = 34 AND D.ARTI_COD = A.arti_cod AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            PEDI_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY D.ARTI_COD
            INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,
            :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
            DO
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            EXECUTE PROCEDURE costo_promedio (:ARTICULO, :FECFIN) RETURNING_VALUES (:COSTOUNIT);
            COSTO = cantidad * COSTOUNIT;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                if (COSTO > 0) then
                    PORC = UTILIDAD * 100 / COSTO;
                ELSE
                    PORC = 100;
            else
                if (BASE > 0) then
                    PORC = UTILIDAD * 100 / BASE;
                ELSE
                    PORC = 0;
            if (CEROS = 'S') then
                INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (2, USER, :ARTICULO);
            SUSPEND;
            END  $$IBE$$*/ /* FOR */ /*$$IBE$$ 
        if (CEROS = 'S') then
            BEGIN
            COSTO = 0;
            UTILIDAD = 0;
            PORC = 0;
             $$IBE$$*/ /* agregue los articulos sin factura */ /*$$IBE$$ 
            FOR SELECT ARTI_COD, 0, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND
                    A.ARTI_DES <= :DESFIN AND A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND
                    (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN)))
                INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,:DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                DO
                BEGIN
                SELECT COUNT(REPA_ARTICULO) FROM REPORTES_AUX WHERE REPA_ID = 2 AND REPA_USER = USER AND REPA_ARTICULO = :articulo INTO :numrows;
                if (numrows = 0) then
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        END
    if (BIN_AND(TIPO, 16) <> 0) then
        BEGIN
        TIPODOC = 35;
         $$IBE$$*/ /* BORRA LA TABLA AUXILIAR */ /*$$IBE$$ 
        DELETE FROM reportes_aux WHERE REPA_ID = 2 AND REPA_USER = USER;

        FOR SELECT MAX(D.ARTI_COD), SUM(CTDE_CANT * CTDE_FACTOR), SUM((CTDE_TOTAL-CTDE_IVAMONTO-CTDE_CONSUMO)*COTI_FACTOR), SUM(CTDE_IVAMONTO), SUM(CTDE_CONSUMO),
            MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD)
            FROM COTIZACIONES_DETALLE D, COTIZACIONES C, PREFIJOS P, ARTICULO A
            WHERE C.COTI_ID = D.COTI_ID AND P.PREF_PRE = C.PREF_PRE AND P.TIDO_COD = 35 AND D.ARTI_COD = A.arti_cod AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND COTI_FECHA >= :FECINI AND COTI_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            COTI_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY D.ARTI_COD
            INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,
            :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
            DO
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            EXECUTE PROCEDURE costo_promedio (:ARTICULO, :FECFIN) RETURNING_VALUES (:COSTOUNIT);
            COSTO = cantidad * COSTOUNIT;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                if (COSTO > 0) then
                    PORC = UTILIDAD * 100 / COSTO;
                ELSE
                    PORC = 100;
            else
                if (BASE > 0) then
                    PORC = UTILIDAD * 100 / BASE;
                ELSE
                    PORC = 0;
            if (CEROS = 'S') then
                INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (2, USER, :ARTICULO);
            SUSPEND;
            END  $$IBE$$*/ /* FOR */ /*$$IBE$$ 
        if (CEROS = 'S') then
            BEGIN
            COSTO = 0;
            UTILIDAD = 0;
            PORC = 0;
             $$IBE$$*/ /* agregue los articulos sin factura */ /*$$IBE$$ 
            FOR SELECT ARTI_COD, 0, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND
                    A.ARTI_DES <= :DESFIN AND A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND
                    (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN)))
                INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,:DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                DO
                BEGIN
                SELECT COUNT(REPA_ARTICULO) FROM REPORTES_AUX WHERE REPA_ID = 2 AND REPA_USER = USER AND REPA_ARTICULO = :articulo INTO :numrows;
                if (numrows = 0) then
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        END
    END
ELSE
    BEGIN
    if (BIN_AND(TIPO, 1) <> 0) then
        BEGIN
        TIPODOC = 31;
        FOR SELECT F.PREF_PRE, FACT_NUMERO, FACT_FECHA, D.ARTI_COD, FADE_CANT * FADE_FACTOR, (FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO)*FACT_FACTOR, FADE_IVAMONTO*FACT_FACTOR, FADE_CONSUMO,
            ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD, COST_SALP
            FROM FACTURAS F, FACTURAS_DETALLE D, PREFIJOS P, ARTICULO A, MOVIMIENTO_ARTICULO M, COSTOS C
            WHERE F.FACT_ID = D.FACT_ID AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND D.ARTI_COD = A.arti_cod AND
                A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
                A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND FACT_FECHA >= :FECINI AND
                (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
                F.fact_id = M.mvar_idref AND M.mvar_tipodoc = 31 AND M.mvar_item = D.fade_item AND M.mvar_cons = C.cost_idmov AND
                FACT_FECHA <= :FECFIN AND FACT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) and substring(a.arti_cod from 1 FOR 2) <> '.t'
            ORDER BY D.ARTI_COD, FACT_FECHA, F.FACT_ID, FADE_ITEM
            INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,
                :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :COSTO
            DO
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
 $$IBE$$*/ /*            EXECUTE PROCEDURE costo_promedio (:ARTICULO, :FECHA) RETURNING_VALUES (:COSTOUNIT);*/
/*            COSTO = COSTOUNIT * CANTIDAD;*/ /*$$IBE$$ 
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                if (COSTO > 0) then
                    PORC = UTILIDAD * 100 / COSTO;
                ELSE
                    PORC = 100;
            else
                if (BASE > 0) then
                    PORC = UTILIDAD * 100 / BASE;
                ELSE
                    PORC = 0;
            SUSPEND;
            END
        END
    if (BIN_AND(TIPO, 2) <> 0) then
        BEGIN
        TIPODOC = 32;
        FOR SELECT R.PREF_PRE, REVT_NUMERO, REVT_FECHA, D.ARTI_COD, RVDE_CANT * RVDE_FACTOR, RVDE_TOTAL-RVDE_IVAMONTO-RVDE_CONSUMO, RVDE_IVAMONTO, RVDE_CONSUMO,
            ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD, COST_SALP
            FROM REMISIONES_VENTA R, REMISIONES_VENTA_DETALLE D, PREFIJOS P, ARTICULO A, MOVIMIENTO_ARTICULO M, COSTOS C
            WHERE R.REVT_ID = D.REVT_ID AND P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = 32 AND D.ARTI_COD = A.arti_cod AND
                A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
                A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN AND
                R.revt_id = M.mvar_idref AND M.mvar_tipodoc = 32 AND M.mvar_item = D.rvde_item AND M.mvar_cons = C.cost_idmov AND
                (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
                REVT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            ORDER BY D.ARTI_COD, REVT_FECHA, R.REVT_ID, RVDE_ITEM
            INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,
                :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :COSTO
            DO
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            EXECUTE PROCEDURE costo_promedio (:ARTICULO, :FECHA) RETURNING_VALUES (:COSTOUNIT);
            COSTO = COSTOUNIT * CANTIDAD;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                if (COSTO > 0) then
                    PORC = UTILIDAD * 100 / COSTO;
                ELSE
                    PORC = 100;
            else
                if (BASE > 0) then
                    PORC = UTILIDAD * 100 / BASE;
                ELSE
                    PORC = 0;
            SUSPEND;
            END
        END
    if (BIN_AND(TIPO, 4) <> 0) then
        BEGIN
        TIPODOC = 33;
        FOR SELECT V.PREF_PRE, DEVT_NUMERO, DEVT_FECHA, D.ARTI_COD, DVDE_CANT * DVDE_FACTOR, (DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO)*DEVT_FACTOR, DVDE_IVAMONTO*DEVT_FACTOR, DVDE_CONSUMO,
            ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD, COST_ENTP
            FROM DEVOLUCIONES_VENTAS V, DEVOLUCIONES_VENTAS_DETALLE D, PREFIJOS P, ARTICULO A, MOVIMIENTO_ARTICULO M, COSTOS C
            WHERE V.DEVT_ID = D.DEVT_ID AND P.PREF_PRE = V.PREF_PRE AND P.TIDO_COD = 33 AND D.ARTI_COD = A.arti_cod AND
                A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
                A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND
                (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
                V.devt_id = M.mvar_idref AND M.mvar_tipodoc = 33 AND M.mvar_item = D.dvde_item AND M.mvar_cons = C.cost_idmov AND
                DEVT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            ORDER BY D.ARTI_COD, DEVT_FECHA, V.DEVT_ID, DVDE_ITEM
            INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,
                :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :COSTO
            DO
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            EXECUTE PROCEDURE costo_promedio (:ARTICULO, :FECHA) RETURNING_VALUES (:COSTOUNIT);
            BASE = BASE * -1;
            CANTIDAD = CANTIDAD * -1;
            IVA = IVA * -1;
            CONSUMO = CONSUMO * -1;
            COSTO = COSTOUNIT * CANTIDAD;
            COSTO = COSTO * -1;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                if (COSTO > 0) then
                    PORC = UTILIDAD * 100 / COSTO;
                ELSE
                    PORC = 100;
            else
                if (BASE > 0) then
                    PORC = UTILIDAD * 100 / BASE;
                ELSE
                    PORC = 0;
            SUSPEND;
            END
        END
    if (BIN_AND(TIPO, 8) <> 0) then
        BEGIN
        TIPODOC = 34;
        FOR SELECT P.PREF_PRE, PEDI_NUMERO, PEDI_FECHA, D.ARTI_COD, PEDE_CANT * PEDE_FACTOR, (PEDE_TOTAL-PEDE_IVAMONTO-PEDE_CONSUMO)*PEDI_FACTOR, PEDE_IVAMONTO*PEDI_FACTOR, PEDE_CONSUMO,
            ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD 
            FROM PEDIDOS P, PEDIDOS_DETALLE D, PREFIJOS R, ARTICULO A
            WHERE P.PEDI_ID = D.PEDI_ID AND P.PREF_PRE = R.PREF_PRE AND R.TIDO_COD = 34 AND D.ARTI_COD = A.arti_cod AND
                A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
                A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND
                (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
                PEDI_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            ORDER BY D.ARTI_COD, PEDI_FECHA, P.PEDI_ID, PEDE_ITEM
            INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,
                :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
            DO
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            EXECUTE PROCEDURE costo_promedio (:ARTICULO, :FECHA) RETURNING_VALUES (:COSTOUNIT);
            COSTO = COSTOUNIT * CANTIDAD;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                if (COSTO > 0) then
                    PORC = UTILIDAD * 100 / COSTO;
                ELSE
                    PORC = 100;
            else
                if (BASE > 0) then
                    PORC = UTILIDAD * 100 / BASE;
                ELSE
                    PORC = 0;
            SUSPEND;
            END
        END
    if (BIN_AND(TIPO, 16) <> 0) then
        BEGIN
        TIPODOC = 35;
        FOR SELECT C.PREF_PRE, COTI_NUMERO, COTI_FECHA, D.ARTI_COD, CTDE_CANT * CTDE_FACTOR, (CTDE_TOTAL-CTDE_IVAMONTO-CTDE_CONSUMO)*COTI_FACTOR, CTDE_IVAMONTO*COTI_FACTOR, CTDE_CONSUMO,
            ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD 
            FROM COTIZACIONES C, COTIZACIONES_DETALLE D, PREFIJOS P, ARTICULO A
            WHERE C.COTI_ID = D.COTI_ID AND P.PREF_PRE = C.PREF_PRE AND P.TIDO_COD = 35 AND D.ARTI_COD = A.arti_cod AND
                A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
                A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND COTI_FECHA >= :FECINI AND COTI_FECHA <= :FECFIN AND
                (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
                COTI_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            ORDER BY D.ARTI_COD, COTI_FECHA, C.COTI_ID, CTDE_ITEM
            INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,
                :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
            DO
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            EXECUTE PROCEDURE costo_promedio (:ARTICULO, :FECHA) RETURNING_VALUES (:COSTOUNIT);
            COSTO = COSTOUNIT * CANTIDAD;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                if (COSTO > 0) then
                    PORC = UTILIDAD * 100 / COSTO;
                ELSE
                    PORC = 100;
            else
                if (BASE > 0) then
                    PORC = UTILIDAD * 100 / BASE;
                ELSE
                    PORC = 0;
            SUSPEND;
            END
        END
    END
 $$IBE$$*/ SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

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

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE TARIFAS_ENSAMBLE(
    PRODUCTO VARCHAR(20),
    PRECIO NUMERIC(18,2),
    FECHA DATE)
RETURNS (
    T0 NUMERIC(18,2),
    T1 NUMERIC(18,2),
    T2 NUMERIC(18,2),
    T3 NUMERIC(18,2),
    T4 NUMERIC(18,2),
    TC NUMERIC(18,2))
AS
declare variable COSTO NUMERIC(18,2);
declare variable TOTAL NUMERIC(18,2);
declare variable TARIFA INTEGER;
declare variable COMPON VARCHAR(20);
declare variable CANT NUMERIC(18,4);
declare variable UNIDAD VARCHAR(8);
declare variable CONSUMO NUMERIC(18,2);
begin /*$$IBE$$ 
T0 = 0;
T1 = 0;
T2 = 0;
T3 = 0;
T4 = 0;
TC = 0;
TOTAL = 0;
FOR SELECT ARPR_COMP, ARPR_CANT, ARPR_UNIDAD, TAIV_COD, ARTI_CONSUMO
    FROM articulos_producto P, ARTICULO A WHERE P.ARTI_COD = :PRODUCTO AND P.arpr_comp = A.arti_cod
    INTO :COMPON, :CANT, :UNIDAD, :TARIFA, :CONSUMO
    DO
    BEGIN
    EXECUTE PROCEDURE cantidad_por_factor (:COMPON, :CANT, :UNIDAD) returning_values (:cant);
    EXECUTE PROCEDURE costo_promedio (:COMPON, :FECHA) returning_values (:COSTO);
    TOTAL = TOTAL + COSTO * CANT;
    TC = TC + CONSUMO * CANT;
    if (TARIFA = 0) then
        T0 = T0 + COSTO * CANT;
    if (TARIFA = 1) then
        T1 = T1 + COSTO * CANT;
    if (TARIFA = 2) then
        T2 = T2 + COSTO * CANT;
    if (TARIFA = 3) then
        T3 = T3 + COSTO * CANT;
    if (TARIFA = 4) then
        T4 = T4 + COSTO * CANT;
    END
if (TOTAL <> 0) then
    BEGIN
    T0 = T0 * PRECIO / TOTAL;
    T1 = T1 * PRECIO / TOTAL;
    T2 = T2 * PRECIO / TOTAL;
    T3 = T3 * PRECIO / TOTAL;
    T4 = T4 * PRECIO / TOTAL;
    END
ELSE
    BEGIN
    T0 = 0;
    T1 = 0;
    T2 = 0;
    T3 = 0;
    T4 = 0;
    END
suspend;
 $$IBE$$*/ SUSPEND;
end
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE UTILIDAD_VENTAS(
    TIPO INTEGER,
    DETALLE CHAR(1),
    FECINI DATE,
    FECFIN DATE,
    PREFIJO VARCHAR(4),
    SUBEMPRESA INTEGER)
RETURNS (
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    PTVTID INTEGER,
    VENDCOD INTEGER,
    NIT VARCHAR(20),
    NOMTERCERO VARCHAR(60),
    ARTICULO VARCHAR(15),
    ARTIDES VARCHAR(60),
    CANT NUMERIC(18,4),
    UNIDAD VARCHAR(8),
    PRECIO NUMERIC(18,2),
    COSTO NUMERIC(18,2),
    UTILIDAD NUMERIC(18,2),
    PORC NUMERIC(9,2))
AS
declare variable IMPTOS CHAR(1);
declare variable ID INTEGER;
declare variable IVA NUMERIC(18,2);
declare variable COSTOT NUMERIC(18,2);
declare variable PRECIOT NUMERIC(18,2);
declare variable UOM VARCHAR(20);
declare variable icoinc char(2);
declare variable consumo NUMERIC(18,2);
declare variable factor NUMERIC(18,4);
BEGIN /*$$IBE$$ 
EXECUTE PROCEDURE lee_configuracion ('FACTURACION', 'ARTICULOS', 'SUGERIR PRECIOS CON PORCENTAJE DE MARGEN O UTILIDAD') returning_values (:UOM);
EXECUTE PROCEDURE lee_configuracion ('FACTURACION', 'ARTICULOS', 'IMPOCONSUMO INCLUIDO EN EL PRECIO BASE DE VENTA ANTES DE IVA') returning_values (:icoinc);
 $$IBE$$*/ /* DETERMINE LA TABLA A EXAMINAR */ /*$$IBE$$ 
if (TIPO = 31) then
    BEGIN
     $$IBE$$*/ /* FACTURA */ /*$$IBE$$ 
    FOR SELECT FACT_ID, F.PREF_PRE, FACT_NUMERO, FACT_FECHA, PTVT_ID, VEND_COD, TERC_NIT, FACT_NOMCLIENTE, FACT_IVAINC, fact_factor
        FROM FACTURAS F, PREFIJOS P
        WHERE FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND FACT_ANULADO = 'N'
         AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = :TIPO AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
        ORDER BY FACT_FECHA, F.PREF_PRE, FACT_NUMERO
        INTO :ID, :PREF, :NUMERO, :FECHA, :PTVTID, :VENDCOD, :NIT, :NOMTERCERO, :IMPTOS, :factor
        DO
        if ((PREFIJO = '') or (PREFIJO = PREF)) then
          BEGIN
          COSTOT = 0;
          PRECIOT = 0;
          FOR SELECT D.ARTI_COD, SUBSTR(FADE_DESC,1,60), FADE_CANT * FADE_FACTOR, FADE_UNIDAD, (FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO)*:FACTOR, FADE_IVAMONTO, fade_consumo
            FROM FACTURAS_DETALLE D
            WHERE FACT_ID = :ID and substring(D.arti_cod from 1 FOR 2) <> '.t'
            INTO :ARTICULO, :ARTIDES, :CANT, :UNIDAD, :PRECIO, :IVA, :consumo
            DO
                BEGIN
                EXECUTE PROCEDURE COSTO_PROMEDIO(:ARTICULO, :FECHA) returning_values (:COSTO);
                COSTO = COSTO * CANT;
                if (DETALLE = 'S') then
                    BEGIN
                    UTILIDAD = PRECIO - COSTO;
                    if (UOM = 'UTILIDAD') then
                        EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                    else
                        EXECUTE PROCEDURE PORCENTAJE (utilidad,  PRECIO, 'S') returning_values (PORC);
                    SUSPEND;
                    END
                ELSE
                    BEGIN
                    COSTOT = COSTOT + COSTO;
                    PRECIOT = PRECIOT + PRECIO;
                    END
                END
          if (DETALLE <> 'S') then
            BEGIN
            COSTO = COSTOT;
            PRECIO = PRECIOT;
            UTILIDAD = PRECIO - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  PRECIO, 'S') returning_values (PORC);
            SUSPEND;
            END
          END
    END
  if (TIPO = 32) then
    BEGIN
     $$IBE$$*/ /* REMISION */ /*$$IBE$$ 
    FOR SELECT REVT_ID, R.PREF_PRE, REVT_NUMERO, REVT_FECHA, PTVT_ID, VEND_COD, TERC_NIT, REVT_NOMTERC, REVT_IVAINC
        FROM REMISIONES_VENTA R, PREFIJOS P
        WHERE REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN AND REVT_ANULADO = 'N'
         AND P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = :TIPO AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
        ORDER BY REVT_FECHA, R.PREF_PRE, REVT_NUMERO
        INTO :ID, :PREF, :NUMERO, :FECHA, :PTVTID, :VENDCOD, :NIT, :NOMTERCERO, :IMPTOS
        DO
        if ((PREFIJO = '') or (PREFIJO = PREF)) then
          BEGIN
          COSTOT = 0;
          PRECIOT = 0;
          FOR SELECT D.ARTI_COD, SUBSTR(RVDE_DESC,1,60), RVDE_CANT * RVDE_FACTOR, RVDE_UNIDAD, (RVDE_TOTAL-RVDE_IVAMONTO-RVDE_CONSUMO), RVDE_IVAMONTO, rvde_consumo
            FROM REMISIONES_VENTA_DETALLE D
            WHERE REVT_ID = :ID and substring(D.arti_cod from 1 FOR 2) <> '.t'
            INTO :ARTICULO, :ARTIDES, :CANT, :UNIDAD, :PRECIO, :IVA, :consumo
            DO
                BEGIN
                EXECUTE PROCEDURE COSTO_PROMEDIO(:ARTICULO, :FECHA) returning_values (:COSTO);
                COSTO = COSTO * CANT;
                if (DETALLE = 'S') then
                    BEGIN
                    UTILIDAD = PRECIO - COSTO;
                    if (UOM = 'UTILIDAD') then
                        EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                    else
                        EXECUTE PROCEDURE PORCENTAJE (utilidad,  PRECIO, 'S') returning_values (PORC);
                    SUSPEND;
                    END
                ELSE
                    BEGIN
                    COSTOT = COSTOT + COSTO;
                    PRECIOT = PRECIOT + PRECIO;
                    END
                END
          if (DETALLE <> 'S') then
            BEGIN
            COSTO = COSTOT;
            PRECIO = PRECIOT;
            UTILIDAD = PRECIO - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  PRECIO, 'S') returning_values (PORC);
            SUSPEND;
            END
          END
    END
  if (TIPO = 33) then
    BEGIN
     $$IBE$$*/ /* DEVOLUCION */ /*$$IBE$$ 
    FOR SELECT DEVT_ID, D.PREF_PRE, DEVT_NUMERO, DEVT_FECHA, PTVT_ID, VEND_COD, TERC_NIT, DEVT_NOMTERC, DEVT_IVAINC, DEVT_FACTOR
        FROM DEVOLUCIONES_VENTAS D, PREFIJOS P
        WHERE DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND DEVT_ANULADO = 'N'
         AND P.PREF_PRE = D.PREF_PRE AND P.TIDO_COD = :TIPO AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
        ORDER BY DEVT_FECHA, D.PREF_PRE, DEVT_NUMERO
        INTO :ID, :PREF, :NUMERO, :FECHA, :PTVTID, :VENDCOD, :NIT, :NOMTERCERO, :IMPTOS, :FACTOR
        DO
        if ((PREFIJO = '') or (PREFIJO = PREF)) then
          BEGIN
          COSTOT = 0;
          PRECIOT = 0;
          FOR SELECT D.ARTI_COD, SUBSTR(DVDE_DESC,1,60), DVDE_CANT * DVDE_FACTOR, DVDE_UNIDAD, (DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO)*:FACTOR, DVDE_IVAMONTO, dvde_consumo
            FROM DEVOLUCIONES_VENTAS_DETALLE D
            WHERE DEVT_ID = :ID and substring(D.arti_cod from 1 FOR 2) <> '.t'
            INTO :ARTICULO, :ARTIDES, :CANT, :UNIDAD, :PRECIO, :IVA, :consumo
            DO
                BEGIN
                EXECUTE PROCEDURE COSTO_PROMEDIO(:ARTICULO, :FECHA) returning_values (:COSTO);
                COSTO = COSTO * CANT;
                if (DETALLE = 'S') then
                    BEGIN
                    UTILIDAD = PRECIO - COSTO;
                    if (UOM = 'UTILIDAD') then
                        EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                    else
                        EXECUTE PROCEDURE PORCENTAJE (utilidad,  PRECIO, 'S') returning_values (PORC);
                    SUSPEND;
                    END
                ELSE
                    BEGIN
                    COSTOT = COSTOT + COSTO;
                    PRECIOT = PRECIOT + PRECIO;
                    END
                END
        if (DETALLE <> 'S') then
            BEGIN
            COSTO = COSTOT;
            PRECIO = PRECIOT;
            UTILIDAD = PRECIO - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  PRECIO, 'S') returning_values (PORC);
            SUSPEND;
            END
        END
    END
  if (TIPO = 34) then
    BEGIN
     $$IBE$$*/ /* PEDIDO */ /*$$IBE$$ 
    FOR SELECT PEDI_ID, P.PREF_PRE, PEDI_NUMERO, PEDI_FECHA, PTVT_ID, VEND_COD, TERC_NIT, PEDI_NOMTERC, PEDI_IVAINC, PEDI_FACTOR
        FROM PEDIDOS P, PREFIJOS R
        WHERE PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND PEDI_ANULADO = 'N'
         AND P.PREF_PRE = R.PREF_PRE AND R.TIDO_COD = :TIPO AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
        ORDER BY PEDI_FECHA, P.PREF_PRE, PEDI_NUMERO
        INTO :ID, :PREF, :NUMERO, :FECHA, :PTVTID, :VENDCOD, :NIT, :NOMTERCERO, :IMPTOS, :FACTOR
        DO
        if ((PREFIJO = '') or (PREFIJO = PREF)) then
          BEGIN
          COSTOT = 0;
          PRECIOT = 0;
          FOR SELECT ARTI_COD, SUBSTR(PEDE_DESC,1,60), PEDE_CANT * PEDE_FACTOR, PEDE_UNIDAD, (PEDE_TOTAL-PEDE_IVAMONTO-PEDE_CONSUMO)*:FACTOR, PEDE_IVAMONTO, pede_consumo
            FROM PEDIDOS_DETALLE
            WHERE PEDI_ID = :ID
            INTO :ARTICULO, :ARTIDES, :CANT, :UNIDAD, :PRECIO, :IVA, :consumo
            DO
                BEGIN
                EXECUTE PROCEDURE COSTO_PROMEDIO(:ARTICULO, :FECHA) returning_values (:COSTO);
                COSTO = COSTO * CANT;
                if (DETALLE = 'S') then
                    BEGIN
                    UTILIDAD = PRECIO - COSTO;
                    if (UOM = 'UTILIDAD') then
                        EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                    else
                        EXECUTE PROCEDURE PORCENTAJE (utilidad,  PRECIO, 'S') returning_values (PORC);
                    SUSPEND;
                    END
                ELSE
                    BEGIN
                    COSTOT = COSTOT + COSTO;
                    PRECIOT = PRECIOT + PRECIO;
                    END
                END
        if (DETALLE <> 'S') then
            BEGIN
            COSTO = COSTOT;
            PRECIO = PRECIOT;
            UTILIDAD = PRECIO - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  PRECIO, 'S') returning_values (PORC);
            SUSPEND;
            END
        END
    END
  if (TIPO = 35) then
    BEGIN
     $$IBE$$*/ /* COTIZACION */ /*$$IBE$$ 
    FOR SELECT COTI_ID, C.PREF_PRE, COTI_NUMERO, COTI_FECHA, PTVT_ID, VEND_COD, TERC_NIT, COTI_NOMTERC, COTI_IMPTOS, COTI_FACTOR
        FROM COTIZACIONES C, PREFIJOS P
        WHERE COTI_FECHA >= :FECINI AND COTI_FECHA <= :FECFIN AND COTI_ANULADO = 'N'
         AND P.PREF_PRE = C.PREF_PRE AND P.TIDO_COD = :TIPO AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
        ORDER BY COTI_FECHA, C.PREF_PRE, COTI_NUMERO
        INTO :ID, :PREF, :NUMERO, :FECHA, :PTVTID, :VENDCOD, :NIT, :NOMTERCERO, :IMPTOS, :FACTOR
        DO
        if ((PREFIJO = '') or (PREFIJO = PREF)) then
          BEGIN
          COSTOT = 0;
          PRECIOT = 0;
          FOR SELECT ARTI_COD, SUBSTR(CTDE_DESC,1,60), CTDE_CANT * CTDE_FACTOR, CTDE_UNIDAD, (CTDE_TOTAL-CTDE_IVAMONTO-CTDE_CONSUMO)*:FACTOR, CTDE_IVAMONTO, ctde_consumo
            FROM COTIZACIONES_DETALLE
            WHERE COTI_ID = :ID
            INTO :ARTICULO, :ARTIDES, :CANT, :UNIDAD, :PRECIO, :IVA, :consumo
            DO
                BEGIN
                EXECUTE PROCEDURE COSTO_PROMEDIO(:ARTICULO, :FECHA) returning_values (:COSTO);
                COSTO = COSTO * CANT;
                if (DETALLE = 'S') then
                    BEGIN
                    UTILIDAD = PRECIO - COSTO;
                    if (UOM = 'UTILIDAD') then
                        EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                    else
                        EXECUTE PROCEDURE PORCENTAJE (utilidad,  PRECIO, 'S') returning_values (PORC);
                    SUSPEND;
                    END
                ELSE
                    BEGIN
                    COSTOT = COSTOT + COSTO;
                    PRECIOT = PRECIOT + PRECIO;
                    END
                END
        if (DETALLE <> 'S') then
            BEGIN
            COSTO = COSTOT;
            PRECIO = PRECIOT;
            UTILIDAD = PRECIO - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  PRECIO, 'S') returning_values (PORC);
            SUSPEND;
            END
        END
    END
 $$IBE$$*/ SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE CONTABILICE_COSTO_VENTAS(
    ID INTEGER,
    IDINTER INTEGER)
RETURNS (
    IDC INTEGER)
AS
declare variable PREF VARCHAR(4);
declare variable NUM VARCHAR(6);
declare variable NUMERO VARCHAR(10);
declare variable INVEN CHAR(1);
declare variable CTAINVEN VARCHAR(20);
declare variable COSTOS CHAR(1);
declare variable CTACOSTOS VARCHAR(20);
declare variable EXISTE CHAR(1);
declare variable CUENTA VARCHAR(20);
declare variable MONTO NUMERIC(18,2);
declare variable TIPOCUEN CHAR(1);
declare variable NIT VARCHAR(20);
declare variable PROY VARCHAR(4);
declare variable CENTRO VARCHAR(4);
declare variable ART VARCHAR(15);
declare variable ANULADO CHAR(1);
declare variable NROI INTEGER;
declare variable NUMROWS INTEGER;
declare variable CONC CHAR(120);
declare variable VENCEAUX DATE;
declare variable VENCE CHAR(8);
begin
/* TRAIGA EL ID DEL ENCABEZADO DEL COMPROBANTE CONTABLE */ /*$$IBE$$ 
SELECT ENCO_CONSEC FROM COMPROBANTE_ENCABEZADO WHERE ENCO_TIPOREF = 31 AND ENCO_IDREF = :ID INTO :IDC;
SELECT MAX(CODE_ITEM) FROM COMPROBANTE_DETALLE WHERE ENCO_CONSEC = :idc INTO :NROI;
NROI = NROI + 1;
 $$IBE$$*/ /* EJECUTE LA PARTE DE CONTABIL_FACTURA QUE CORRESPONDE A LOS COSTOS */ /*$$IBE$$ 
EXISTE = 'N';
SELECT 'S', INVE_COSTO, INVE_INVEN, INVE_CTAINVEN, INVE_CTACOSTOS
    FROM INTERFAZ_VENTAS
    WHERE INVE_ID = :IDINTER
    INTO :EXISTE, :COSTOS, :INVEN, :CTAINVEN, :CTACOSTOS;
if (EXISTE = 'S') then
  BEGIN
  SELECT FACT_ANULADO, PREF_PRE, FACT_NUMERO, FACT_VENCE, TERC_NIT FROM FACTURAS F
        WHERE FACT_ID = :ID INTO :ANULADO, :PREF, :NUMERO, :VENCEAUX, :NIT;
  NUMERO = PREF || NUM;
  CONC = 'COSTO EN VENTAS FACTURA ' || :NUMERO;
  EXECUTE PROCEDURE FECHA_A_CONTA(:VENCEAUX) returning_values (:VENCE);
  if (ANULADO = 'N') then
    BEGIN
    SELECT BODE_CENTRO, BODE_PROY FROM BODEGA B, FACTURAS F, PUNTO_VENTA P
        WHERE B.BODE_COD = P.BODE_COD AND P.PTVT_ID = F.PTVT_ID AND F.FACT_ID = :ID INTO :CENTRO, :PROY;
     $$IBE$$*/ /* SE ASUME QUE NO HAN CAMBIADO LAS CUENTAS DE COSTOS, POR ESO SE HACE UPDATE A LOS MOVIMIENTOS DE ESAS CUENTAS */ /*$$IBE$$ 
    EXECUTE PROCEDURE COSTO_EN_VENTAS(31, :ID);
    if (COSTOS = 'A') then
        BEGIN
        FOR SELECT MAX(CTACOS), SUM(CANT * COSTO)
            FROM COSTO_VENTAS
            GROUP BY CTACOS
            INTO :CTACOSTOS, :MONTO
        DO
            BEGIN
            if (MONTO <> 0) then
                BEGIN
                CUENTA = NULL;
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :CTACOSTOS INTO :CUENTA, :TIPOCUEN;
                IF (CUENTA IS NULL) THEN
                    begin
                    EXCEPTION CUENTA_NO_EXISTE 'La cuenta ' || :ctacostos || ' no existe.';
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                     $$IBE$$*/ /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */ /*$$IBE$$ 
                    FOR SELECT ARTI_COD, CANT * COSTO
                        FROM COSTO_VENTAS
                        WHERE CTACOS = :CUENTA
                        INTO :ART, :MONTO
                    DO
                        BEGIN
                        SELECT COUNT(*) FROM COMPROBANTE_DETALLE WHERE CUEN_COD = :CUENTA AND ENCO_CONSEC = :IDC AND ARTI_COD = :ART INTO :NUMROWS;
                        if (NUMROWS = 0) then
                            BEGIN
                            INSERT INTO comprobante_detalle (ENCO_CONSEC, CODE_ITEM, CUEN_COD, CODE_CONCEPTO, CODE_REFER, CODE_DEBITO, CODE_CREDITO, CODE_BASE, CODE_PORC, TERC_NIT, PROY_COD, CENT_COD, CNDE_DOCNUMERO, CNDE_DOCAPLICA, DOCO_VENCE, ARTI_COD, CODE_TIPOAPL, CODE_TIPONUE)
                                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                            NROI = NROI + 1;
                            END
                        ELSE
                            UPDATE COMPROBANTE_DETALLE
                                SET CODE_DEBITO = :MONTO
                            WHERE CUEN_COD = :CUENTA AND ENCO_CONSEC = :IDC AND ARTI_COD = :ART;
                        END
                    END
                ELSE
                    BEGIN
                    SELECT COUNT(*) FROM COMPROBANTE_DETALLE WHERE CUEN_COD = :CUENTA AND ENCO_CONSEC = :IDC INTO :NUMROWS;
                    if (NUMROWS = 0) then
                        BEGIN
                        if (TIPOCUEN = 'C') then
                            INSERT INTO comprobante_detalle (ENCO_CONSEC, CODE_ITEM, CUEN_COD, CODE_CONCEPTO, CODE_REFER, CODE_DEBITO, CODE_CREDITO, CODE_BASE, CODE_PORC, TERC_NIT, PROY_COD, CENT_COD, CNDE_DOCNUMERO, CNDE_DOCAPLICA, DOCO_VENCE, ARTI_COD, CODE_TIPOAPL, CODE_TIPONUE)
                                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                        ELSE
                            INSERT INTO comprobante_detalle (ENCO_CONSEC, CODE_ITEM, CUEN_COD, CODE_CONCEPTO, CODE_REFER, CODE_DEBITO, CODE_CREDITO, CODE_BASE, CODE_PORC, TERC_NIT, PROY_COD, CENT_COD, CNDE_DOCNUMERO, CNDE_DOCAPLICA, DOCO_VENCE, ARTI_COD, CODE_TIPOAPL, CODE_TIPONUE)
                                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NROI = NROI + 1;
                        END
                    ELSE
                        UPDATE COMPROBANTE_DETALLE
                            SET CODE_DEBITO = :MONTO
                        WHERE CUEN_COD = :CUENTA AND ENCO_CONSEC = :IDC;
                    END
                END  $$IBE$$*/ /* MONTO <> 0 */ /*$$IBE$$ 
            END  $$IBE$$*/ /* FOR */ /*$$IBE$$ 
        END  $$IBE$$*/ /* COSTOS */ /*$$IBE$$ 
    if (COSTOS = 'K') then
        BEGIN
        SELECT SUM(CANT * COSTO)
            FROM COSTO_VENTAS
            INTO :MONTO;
        if (MONTO <> 0) then
            BEGIN
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTACOSTOS INTO :CUENTA, :TIPOCUEN;
            IF (CUENTA IS NULL) THEN
                begin
                EXCEPTION CUENTA_NO_EXISTE 'La cuenta ' || :ctacostos || ' no existe.';
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                 $$IBE$$*/ /* ES UNA CUENTA DE INVENTARIO, REGISTRE UNO A UNO LOS ARTICULOS */ /*$$IBE$$ 
                FOR SELECT ARTI_COD, CANT * COSTO
                    FROM COSTO_VENTAS
                    INTO :ART, :MONTO
                DO
                    BEGIN
                    SELECT COUNT(*) FROM COMPROBANTE_DETALLE WHERE CUEN_COD = :CUENTA AND ENCO_CONSEC = :IDC AND ARTI_COD = :ART INTO :NUMROWS;
                    if (NUMROWS = 0) then
                        BEGIN
                            INSERT INTO comprobante_detalle (ENCO_CONSEC, CODE_ITEM, CUEN_COD, CODE_CONCEPTO, CODE_REFER, CODE_DEBITO, CODE_CREDITO, CODE_BASE, CODE_PORC, TERC_NIT, PROY_COD, CENT_COD, CNDE_DOCNUMERO, CNDE_DOCAPLICA, DOCO_VENCE, ARTI_COD, CODE_TIPOAPL, CODE_TIPONUE)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        END
                    ELSE
                        UPDATE COMPROBANTE_DETALLE
                            SET CODE_DEBITO = :MONTO
                        WHERE CUEN_COD = :CUENTA AND ENCO_CONSEC = :IDC AND ARTI_COD = :ART;
                    END
                END
            ELSE
                BEGIN
                SELECT COUNT(*) FROM COMPROBANTE_DETALLE WHERE CUEN_COD = :CUENTA AND ENCO_CONSEC = :IDC INTO :NUMROWS;
                if (NUMROWS = 0) then
                    BEGIN
                    if (TIPOCUEN = 'C') then
                        INSERT INTO comprobante_detalle (ENCO_CONSEC, CODE_ITEM, CUEN_COD, CODE_CONCEPTO, CODE_REFER, CODE_DEBITO, CODE_CREDITO, CODE_BASE, CODE_PORC, TERC_NIT, PROY_COD, CENT_COD, CNDE_DOCNUMERO, CNDE_DOCAPLICA, DOCO_VENCE, ARTI_COD, CODE_TIPOAPL, CODE_TIPONUE)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    ELSE
                        INSERT INTO comprobante_detalle (ENCO_CONSEC, CODE_ITEM, CUEN_COD, CODE_CONCEPTO, CODE_REFER, CODE_DEBITO, CODE_CREDITO, CODE_BASE, CODE_PORC, TERC_NIT, PROY_COD, CENT_COD, CNDE_DOCNUMERO, CNDE_DOCAPLICA, DOCO_VENCE, ARTI_COD, CODE_TIPOAPL, CODE_TIPONUE)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    END
                ELSE
                    UPDATE COMPROBANTE_DETALLE
                        SET CODE_DEBITO = :MONTO
                    WHERE CUEN_COD = :CUENTA AND ENCO_CONSEC = :IDC;
                END
            END  $$IBE$$*/ /* MONTO <> 0 */ /*$$IBE$$ 
        END  $$IBE$$*/ /* COSTOS = K */ /*$$IBE$$ 
    if (INVEN = 'A') then
        BEGIN
        FOR SELECT MAX(CTAINV), SUM(CANT * COSTO)
            FROM COSTO_VENTAS
            GROUP BY CTAINV
            INTO :CTAINVEN, :MONTO
        DO
            BEGIN
            if (MONTO <> 0) then
                BEGIN
                CUENTA = NULL;
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :CTAINVEN INTO :CUENTA, :TIPOCUEN;
                IF (CUENTA IS NULL) THEN
                    begin
                    EXCEPTION CUENTA_NO_EXISTE 'La cuenta ' || :ctainven || ' no existe.';
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                     $$IBE$$*/ /* ES UNA CUENTA DE INVENTARIO, REGISTRE UNO A UNO LOS ARTICULOS */ /*$$IBE$$ 
                    FOR SELECT ARTI_COD, CANT * COSTO
                        FROM COSTO_VENTAS
                        WHERE CTAINV = :CUENTA
                        INTO :ART, :MONTO
                    DO
                        BEGIN
                        SELECT COUNT(*) FROM COMPROBANTE_DETALLE WHERE CUEN_COD = :CUENTA AND ENCO_CONSEC = :IDC AND ARTI_COD = :ART INTO :NUMROWS;
                        if (NUMROWS = 0) then
                            BEGIN
                            INSERT INTO comprobante_detalle (ENCO_CONSEC, CODE_ITEM, CUEN_COD, CODE_CONCEPTO, CODE_REFER, CODE_DEBITO, CODE_CREDITO, CODE_BASE, CODE_PORC, TERC_NIT, PROY_COD, CENT_COD, CNDE_DOCNUMERO, CNDE_DOCAPLICA, DOCO_VENCE, ARTI_COD, CODE_TIPOAPL, CODE_TIPONUE)
                                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                            NROI = NROI + 1;
                            END
                        ELSE
                            UPDATE COMPROBANTE_DETALLE
                                SET CODE_CREDITO = :MONTO
                            WHERE CUEN_COD = :CUENTA AND ENCO_CONSEC = :IDC AND ARTI_COD = :ART;
                        END
                    END
                ELSE
                    BEGIN
                    SELECT COUNT(*) FROM COMPROBANTE_DETALLE WHERE CUEN_COD = :CUENTA AND ENCO_CONSEC = :IDC INTO :NUMROWS;
                    if (NUMROWS = 0) then
                        BEGIN
                        if (TIPOCUEN = 'C') then
                            INSERT INTO comprobante_detalle (ENCO_CONSEC, CODE_ITEM, CUEN_COD, CODE_CONCEPTO, CODE_REFER, CODE_DEBITO, CODE_CREDITO, CODE_BASE, CODE_PORC, TERC_NIT, PROY_COD, CENT_COD, CNDE_DOCNUMERO, CNDE_DOCAPLICA, DOCO_VENCE, ARTI_COD, CODE_TIPOAPL, CODE_TIPONUE)
                                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                        ELSE
                            INSERT INTO comprobante_detalle (ENCO_CONSEC, CODE_ITEM, CUEN_COD, CODE_CONCEPTO, CODE_REFER, CODE_DEBITO, CODE_CREDITO, CODE_BASE, CODE_PORC, TERC_NIT, PROY_COD, CENT_COD, CNDE_DOCNUMERO, CNDE_DOCAPLICA, DOCO_VENCE, ARTI_COD, CODE_TIPOAPL, CODE_TIPONUE)
                                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NROI = NROI + 1;
                        END
                    ELSE
                        UPDATE COMPROBANTE_DETALLE
                            SET CODE_CREDITO = :MONTO
                        WHERE CUEN_COD = :CUENTA AND ENCO_CONSEC = :IDC;
                    END
                END  $$IBE$$*/ /* MONTO <> 0 */ /*$$IBE$$ 
            END  $$IBE$$*/ /* FOR */ /*$$IBE$$ 
        END  $$IBE$$*/ /* INVEN = A */ /*$$IBE$$ 
    if (INVEN = 'K') then
        BEGIN
        SELECT SUM(CANT * COSTO)
            FROM COSTO_VENTAS
            INTO :MONTO;
        if (MONTO <> 0) then
            BEGIN
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTAINVEN INTO :CUENTA, :TIPOCUEN;
            IF (CUENTA IS NULL) THEN
                begin
                EXCEPTION CUENTA_NO_EXISTE 'La cuenta ' || :ctainven || ' no existe.';
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                 $$IBE$$*/ /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */ /*$$IBE$$ 
                FOR SELECT ARTI_COD, CANT * COSTO
                    FROM COSTO_VENTAS
                    INTO :ART, :MONTO
                DO
                    BEGIN
                    SELECT COUNT(*) FROM COMPROBANTE_DETALLE WHERE CUEN_COD = :CUENTA AND ENCO_CONSEC = :IDC AND ARTI_COD = :ART INTO :NUMROWS;
                    if (NUMROWS = 0) then
                        BEGIN
                        INSERT INTO comprobante_detalle (ENCO_CONSEC, CODE_ITEM, CUEN_COD, CODE_CONCEPTO, CODE_REFER, CODE_DEBITO, CODE_CREDITO, CODE_BASE, CODE_PORC, TERC_NIT, PROY_COD, CENT_COD, CNDE_DOCNUMERO, CNDE_DOCAPLICA, DOCO_VENCE, ARTI_COD, CODE_TIPOAPL, CODE_TIPONUE)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        END
                    ELSE
                        UPDATE COMPROBANTE_DETALLE
                            SET CODE_CREDITO = :MONTO
                        WHERE CUEN_COD = :CUENTA AND ENCO_CONSEC = :IDC AND ARTI_COD = :ART;
                    END
                END
            ELSE
                BEGIN
                SELECT COUNT(*) FROM COMPROBANTE_DETALLE WHERE CUEN_COD = :CUENTA AND ENCO_CONSEC = :IDC INTO :NUMROWS;
                if (NUMROWS = 0) then
                    BEGIN
                    if (TIPOCUEN = 'C') then
                        INSERT INTO comprobante_detalle (ENCO_CONSEC, CODE_ITEM, CUEN_COD, CODE_CONCEPTO, CODE_REFER, CODE_DEBITO, CODE_CREDITO, CODE_BASE, CODE_PORC, TERC_NIT, PROY_COD, CENT_COD, CNDE_DOCNUMERO, CNDE_DOCAPLICA, DOCO_VENCE, ARTI_COD, CODE_TIPOAPL, CODE_TIPONUE)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    ELSE
                        INSERT INTO comprobante_detalle (ENCO_CONSEC, CODE_ITEM, CUEN_COD, CODE_CONCEPTO, CODE_REFER, CODE_DEBITO, CODE_CREDITO, CODE_BASE, CODE_PORC, TERC_NIT, PROY_COD, CENT_COD, CNDE_DOCNUMERO, CNDE_DOCAPLICA, DOCO_VENCE, ARTI_COD, CODE_TIPOAPL, CODE_TIPONUE)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    END
                ELSE
                    UPDATE COMPROBANTE_DETALLE
                        SET CODE_CREDITO = :MONTO
                    WHERE CUEN_COD = :CUENTA AND ENCO_CONSEC = :IDC;
                END
            END  $$IBE$$*/ /* MONTO <> 0 */ /*$$IBE$$ 
        END  $$IBE$$*/ /* INVEN = K */ /*$$IBE$$ 
    END
  END
 $$IBE$$*/ SUSPEND;
end
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE CONTABIL_DEVOLCLI(
    IDDOC INTEGER,
    IDINTER INTEGER)
RETURNS (
    ERROR INTEGER,
    VER CHAR(1),
    IDC INTEGER)
AS
declare variable PREF VARCHAR(4);
declare variable NUM VARCHAR(6);
declare variable NUMERO VARCHAR(10);
declare variable FECAUX DATE;
declare variable FECHA CHAR(8);
declare variable CONC CHAR(120);
declare variable NUMFAC VARCHAR(10);
declare variable VRDTO NUMERIC(18, 2);
declare variable VRADIC NUMERIC(18, 2);
declare variable VRSUBT NUMERIC(18, 2);
declare variable VRIVA NUMERIC(18, 2);
declare variable PRTFTE NUMERIC(9, 2);
declare variable VRRTFTE NUMERIC(18, 2);
declare variable VRRTIVA NUMERIC(18, 2);
declare variable PRTICA NUMERIC(9, 2);
declare variable VRRTICA NUMERIC(18, 2);
declare variable VRTOTAL NUMERIC(18, 2);
declare variable VREXTRA NUMERIC(18, 2);
declare variable TIPOCOMP VARCHAR(3);
declare variable PREFCONT VARCHAR(4);
declare variable VENTAS CHAR(1);
declare variable CTAVENTAS VARCHAR(20);
declare variable IVA CHAR(1);
declare variable CTAIVA VARCHAR(20);
declare variable CONSUMO CHAR(1);
declare variable CTACONSUMO VARCHAR(20);
declare variable CARTERA CHAR(1);
declare variable CTACARTERA VARCHAR(20);
declare variable RTFTE CHAR(1);
declare variable CTARTFTE VARCHAR(20);
declare variable RTIVA CHAR(1);
declare variable CTARTIVA VARCHAR(20);
declare variable RTICA CHAR(1);
declare variable CTARTICA VARCHAR(20);
declare variable INVEN CHAR(1);
declare variable CTAINVEN VARCHAR(20);
declare variable COSTOS CHAR(1);
declare variable CTACOSTOS VARCHAR(20);
declare variable CTADTO VARCHAR(20);
declare variable CTAADIC VARCHAR(20);
declare variable CTAEXTRA VARCHAR(20);
declare variable EXISTE CHAR(1);
declare variable CUENTA VARCHAR(20);
declare variable MONTO NUMERIC(18,2);
declare variable TIPOCUEN CHAR(1);
declare variable NIT VARCHAR(20);
declare variable PROY VARCHAR(4);
declare variable CENTRO VARCHAR(4);
declare variable PORC NUMERIC(5,2);
declare variable DEBITO NUMERIC(18,2);
declare variable CREDITO NUMERIC(18,2);
declare variable NROI INTEGER;
declare variable ART VARCHAR(15);
declare variable IMPINC CHAR(1);
declare variable IMPTOS NUMERIC(18, 2);
declare variable SUMA NUMERIC(18,2);
declare variable PORCIVA NUMERIC(9,2);
declare variable TCTACLIEN VARCHAR(20);
declare variable TCTAVENTA VARCHAR(20);
declare variable TCTARTFTE VARCHAR(20);
declare variable TCTARTIVA VARCHAR(20);
declare variable TCTARTICA VARCHAR(20);
declare variable CTADIC VARCHAR(20);
declare variable BASEADIC VARCHAR(20);
declare variable PORCADIC NUMERIC(5,2);
declare variable VALORADIC NUMERIC(18,2);
declare variable DBADIC CHAR(1);
declare variable PTOVTA INTEGER;
declare variable ANULADO CHAR(1);
declare variable CENT CHAR(1);
DECLARE VARIABLE MERCANCIA NUMERIC(18,2);
declare variable FACTOR DOUBLE PRECISION;
declare variable DIG INTEGER;
DECLARE VARIABLE FOMENTO VARCHAR(2);
DECLARE VARIABLE VRCONSUMO NUMERIC(18,2);
declare variable AUTORET VARCHAR(10);
declare variable FAUTORET DATE;
declare variable IDREM INTEGER;
declare variable DTOXIT CHAR(2);
declare variable ERRORC INTEGER;
BEGIN /*$$IBE$$ 
EXECUTE PROCEDURE LEE_CONFIGURACION('COMPRAS', 'FACTURAS', 'USAR IMPOCONSUMO COMO PORCENTAJE DE FOMENTO') returning_values (FOMENTO);
EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'FECHA AUTORETENEDOR NO DESCONTAR RETENCIONES DEL SALDO PERO SI CONTABILIZARLAS') returning_values (AUTORET);
if (AUTORET <> '') then
    FAUTORET = CAST(AUTORET AS DATE);
else
    FAUTORET = '9999/12/31';
   $$IBE$$*/ /* BUSQUE LA INTERFACE */ /*$$IBE$$ 
  EXISTE = 'N';
  SELECT 'S', TICO_COD, PRCO_PRE, INVE_VENTAS, INVE_IVA, INVE_CONSUMO, INVE_CARTERA, INVE_RTFTE, INVE_RTIVA, INVE_RTICA, INVE_COSTO, INVE_INVEN, INVE_CTAVENTAS, INVE_CTAIVA, INVE_CTACONSUMO, INVE_CTADTO, INVE_CTAADIC, INVE_CTAEXTRA, INVE_CTACARTERA, INVE_CTARTFTE, INVE_CTARTIVA, INVE_CTARTICA, INVE_CTAINVEN, INVE_CTACOSTOS, INVE_CONFIRMAR, INVE_CENTRO
    FROM INTERFAZ_VENTAS
    WHERE INVE_ID = :IDINTER
    INTO :EXISTE, :TIPOCOMP, :PREFCONT, :VENTAS, :IVA, :CONSUMO, :CARTERA, :RTFTE, :RTIVA, :RTICA, :COSTOS, :INVEN, :CTAVENTAS, :CTAIVA, :CTACONSUMO, :CTADTO, :CTAADIC, :CTAEXTRA, :CTACARTERA, :CTARTFTE, :CTARTIVA, :CTARTICA, :CTAINVEN, :CTACOSTOS, :VER, :CENT;
  if (EXISTE = 'S') then
   BEGIN
     $$IBE$$*/ /* BORRE CUALQUEIR CONTABILIZACION PREVIA */ /*$$IBE$$ 
    DELETE FROM CONTABILIZACION WHERE CNTB_TIPOREF = 33 AND CNTB_IDREF = :IDDOC;
     $$IBE$$*/ /* TRAIGA EL ENCABEZADO DE LA DEVOLUCION */ /*$$IBE$$ 
   SELECT PREF_PRE, DEVT_NUMERO, DEVT_FECHA, F.TERC_NIT, DEVT_IVAINC, PTVT_ID, DEVT_FACTURA, DEVT_DTOMONTO, DEVT_ADICIONAL, DEVT_IVAMONTO, DEVT_EXTRA, DEVT_TOTAL, DEVT_RTFTEPORC, DEVT_RTFTEMONTO, DEVT_RTIVAPORC, DEVT_RTIVAMONTO, DEVT_RTICAPORC, DEVT_RTICAMONTO, TERC_CTARTFTE, TERC_CTARTIVA, TERC_CTARTICA, TERC_CTAVENTA, TERC_CTACLIENTE, DEVT_ANULADO, DEVT_REMID
        FROM DEVOLUCIONES_VENTAS F, TERCEROS T
        WHERE DEVT_ID = :IDDOC AND F.TERC_NIT = T.TERC_NIT
        INTO :PREF, :NUM, :FECAUX, :NIT, :IMPINC, :PTOVTA, :NUMFAC, :VRDTO, :VRADIC, :VRIVA, :VREXTRA, :VRTOTAL, :PRTFTE, :VRRTFTE, :PORC, :VRRTIVA, :PRTICA, :VRRTICA, :TCTARTFTE, TCTARTIVA, TCTARTICA, TCTAVENTA, TCTACLIEN, ANULADO, :IDREM;
   if (idrem is null) Then
    IDREM = 0;
   if ((ANULADO = 'N') AND (IDREM = 0)) then
    BEGIN
    NUMERO = PREF || NUM;
    SELECT SUM(DVDE_CONSUMO) FROM devoluciones_ventas_detalle WHERE DEVT_ID = :iddoc AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL)) INTO :MERCANCIA;
    VRSUBT = VRTOTAL - VREXTRA - VRIVA - MERCANCIA;  $$IBE$$*/ /* BASE DE RETEFTE Y RETEICA */ /*$$IBE$$ 
    EXECUTE PROCEDURE lee_configuracion ('FACTURACION', 'DEVOLUCIONES', 'DESCUENTO PIE DEVOLUCION IGUAL A SUMA DE DESCUENTOS POR ITEM') returning_values (:DTOXIT);
    if (DTOXIT = 'SI') then
        VRDTO = 0;
    MERCANCIA = VRSUBT - VRADIC + VRDTO;
    IF (CENT = 'B') THEN
        SELECT B.BODE_CENTRO, B.BODE_PROY FROM BODEGA B, DEVOLUCIONES_VENTAS F
            WHERE B.BODE_COD = F.BODE_COD AND F.DEVT_ID = :IDDOC INTO :CENTRO, :PROY;
    IF (CENT = 'V') THEN
        SELECT V.CENT_COD, V.PROY_COD FROM VENDEDORES V, DEVOLUCIONES_VENTAS F
            WHERE V.VEND_COD = F.VEND_COD AND F.DEVT_ID = :IDDOC INTO :CENTRO, :PROY;
    IF (CENT = 'P') THEN
        SELECT P.PREF_CENTRO,P.PREF_PROY  FROM PREFIJOS P, DEVOLUCIONES_VENTAS F
            WHERE P.PREF_PRE = F.PREF_PRE AND F.DEVT_ID = :IDDOC AND P.TIDO_COD = 33 INTO :CENTRO, :PROY;
    EXECUTE PROCEDURE FECHA_A_CONTA(:FECAUX) returning_values (:FECHA);
     $$IBE$$*/ /* REGISTRE EL ENCABEZADO CONTABLE */ /*$$IBE$$ 
    IDC = GEN_ID(ID_CONTABILIZA, 1);
    CONC = 'DEVOLUCION VENTAS No. ' || NUMERO || ' EN FACTURA ' || NUMFAC;
    CONC = SUBSTR(CONC, 1, 60);
    INSERT INTO CONTABILIZACION (CNTB_ID, CNTB_TIPOCOMP, CNTB_PREFCNT, CNTB_NUMERO, CNTB_FECHA, CNTB_CONCEPTO, CNTB_REF, CNTB_TIPOREF, CNTB_IDREF, CNTB_PREFREF, CNTB_NUMREF, CNTB_PROCESADO)
        VALUES (:IDC, :TIPOCOMP, :PREFCONT, :NUM, :FECHA, :CONC, '', 33, :IDDOC, :PREF, :NUM, 'N');
    NROI = 0;
    SUMA = 0;
    ERROR = 0;
     $$IBE$$*/ /* SI NO HAY CUENTA DE DESCUENTO NI ADICIONAL CALCULE UN FACTOR PARA LAS VENTAS Y EL IVA */ /*$$IBE$$ 
    if (MERCANCIA <> 0) then
        FACTOR = CAST(VRSUBT AS DOUBLE PRECISION) / CAST(MERCANCIA AS DOUBLE PRECISION);
    ELSE
        FACTOR = 1;
     $$IBE$$*/ /* TRAIGA EL NUMERO DE DIGITOS PARA EL REDONDEO */ /*$$IBE$$ 
    SELECT CAST(CONF_VALOR AS INTEGER) FROM CONFIGURACION WHERE CONF_MODULO = 'FACTURACION' AND
        CONF_CATEGORIA = 'GENERAL' AND CONF_PROPIEDAD = 'REDONDEO AL MULTIPLO DE DIEZ EN TOTALES' INTO :DIG;
     $$IBE$$*/ /* CUENTAS DE VENTAS */ /*$$IBE$$ 
    if (VENTAS = 'A') then
        BEGIN
        FOR SELECT MAX(COAR_CTADEV), SUM(DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO), SUM(DVDE_IVAMONTO), SUM(DVDE_CONSUMO)
            FROM ARTICULO A, CONTABIL_ARTICULO C, DEVOLUCIONES_VENTAS_DETALLE F
            WHERE F.DEVT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
            GROUP BY COAR_CTADEV
            INTO :CTAVENTAS, :MONTO, :IMPTOS, :VRCONSUMO
            DO
            BEGIN
            if (IMPINC = 'S') then
                if (FOMENTO = 'SI') then
                    MONTO = MONTO - IMPTOS;
                ELSE
                    MONTO = MONTO - IMPTOS - VRCONSUMO;
            ELSE
            if (FOMENTO = 'SI') then
            MONTO = MONTO + VRCONSUMO;
            if ((CTADTO IS NULL) OR (CTADTO = '')) then
                MONTO = MONTO * FACTOR;
            execute procedure redondee(MONTO, DIG) returning_values (MONTO);
            if (MONTO <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTAVENTAS, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                     $$IBE$$*/ /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */ /*$$IBE$$ 
                    FOR SELECT F.ARTI_COD, (DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO), (DVDE_IVAMONTO+DVDE_CONSUMO)
                        FROM ARTICULO A, CONTABIL_ARTICULO C, DEVOLUCIONES_VENTAS_DETALLE F
                        WHERE F.DEVT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTAINV = :CUENTA AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
                        INTO :ART, :MONTO, :IMPTOS
                    DO
                        BEGIN
                        if (IMPINC = 'S') then
                            MONTO = MONTO - IMPTOS;
                        if ((CTADTO IS NULL) OR (CTADTO = '')) then
                            MONTO = MONTO * FACTOR;
                        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        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, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                    NROI = NROI + 1;
                    SUMA = SUMA + MONTO;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA + MONTO;
                    END
                END  $$IBE$$*/ /* MONTO <> 0 */ /*$$IBE$$ 
            END  $$IBE$$*/ /* FOR */ /*$$IBE$$ 
        END  $$IBE$$*/ /* VENTAS X ARTICULO */ /*$$IBE$$ 
     IF ((VENTAS = 'C') OR (VENTAS = 'K')) THEN
        BEGIN
        IF (VENTAS = 'C') THEN
            CTAVENTAS = TCTAVENTA;
        SELECT SUM(DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO), SUM(DVDE_IVAMONTO), SUM(DVDE_CONSUMO)
            FROM DEVOLUCIONES_VENTAS_DETALLE F
            WHERE F.DEVT_ID = :IDDOC  AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
            INTO :MONTO, :IMPTOS, :VRCONSUMO;
        if (IMPINC = 'S') then
            if (FOMENTO = 'SI') then
               MONTO = MONTO - IMPTOS;
            ELSE
               MONTO = MONTO - IMPTOS - VRCONSUMO;
        ELSE
         if (FOMENTO = 'SI') then
          MONTO = MONTO + VRCONSUMO;
        if ((CTADTO IS NULL) OR (CTADTO = '')) then
            MONTO = MONTO * FACTOR;
        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
        if (MONTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTAVENTAS, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'I') then
                BEGIN
                 $$IBE$$*/ /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */ /*$$IBE$$ 
                FOR SELECT F.ARTI_COD, (DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO), (DVDE_IVAMONTO+DVDE_CONSUMO)
                    FROM ARTICULO A, DEVOLUCIONES_VENTAS_DETALLE F
                    WHERE F.DEVT_ID = :IDDOC AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
                    INTO :ART, :MONTO, :IMPTOS
                    DO
                    BEGIN
                    if (IMPINC = 'S') then
                        MONTO = MONTO - IMPTOS;
                    if ((CTADTO IS NULL) OR (CTADTO = '')) then
                        MONTO = MONTO * FACTOR;
                    execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                    NROI = NROI + 1;
                    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, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                NROI = NROI + 1;
                SUMA = SUMA + MONTO;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA + MONTO;
                END
            END  $$IBE$$*/ /* MONTO <> 0 */ /*$$IBE$$ 
        END  $$IBE$$*/ /* VENTAS DE CLIENTE O CONSTANTE */
    /* EL IVA EN VENTAS */ /*$$IBE$$ 
    if (IVA = 'A') then
        BEGIN
        FOR SELECT MAX(COAR_CTAIVAV), SUM(DVDE_IVAMONTO), SUM(DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO), SUM(DVDE_CONSUMO)
            FROM ARTICULO A, CONTABIL_ARTICULO C, DEVOLUCIONES_VENTAS_DETALLE F
            WHERE F.DEVT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
            GROUP BY COAR_CTAIVAV
            INTO :CTAIVA, :IMPTOS, :MONTO, :VALORADIC
        DO
            BEGIN
            if (FOMENTO = 'SI') then
                MONTO = MONTO + VALORADIC;
            MONTO = MONTO * -1;
            MONTO = MONTO * FACTOR;
            IMPTOS = IMPTOS * FACTOR;
            execute procedure redondee(MONTO, DIG) returning_values (MONTO);
            execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
            if (IMPTOS <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTAIVA, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                     $$IBE$$*/ /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */ /*$$IBE$$ 
                    FOR SELECT F.ARTI_COD, DVDE_IVAMONTO, (DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO), TAIV_PORC, DVDE_CONSUMO
                        FROM ARTICULO A, CONTABIL_ARTICULO C, DEVOLUCIONES_VENTAS_DETALLE F, TARIFA_IVA T
                        WHERE F.DEVT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND A.TAIV_COD = T.TAIV_COD AND COAR_CTAIVAV = :CUENTA AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
                        INTO :ART, :IMPTOS, :MONTO, :PORCIVA, :VALORADIC
                    DO
                        BEGIN
                        if (IMPINC = 'S') then
                            MONTO = MONTO - IMPTOS - VALORADIC;
                        MONTO = MONTO * -1;
                        MONTO = MONTO * FACTOR;
                        IMPTOS = IMPTOS * FACTOR;
                        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                        execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                        if (IMPTOS <> 0) then
                            BEGIN
                            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :IMPTOS, 0, :MONTO, :PORCIVA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                            NROI = NROI + 1;
                            SUMA = SUMA + IMPTOS;
                            END
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                    NROI = NROI + 1;
                    SUMA = SUMA + IMPTOS;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA + IMPTOS;
                    END
                END    $$IBE$$*/ /* IMPTOS <> 0 */ /*$$IBE$$ 
            END  $$IBE$$*/ /* FOR */ /*$$IBE$$ 
        END  $$IBE$$*/ /* IVA X ARTICULO */ /*$$IBE$$ 
    if (IVA = 'K') then  $$IBE$$*/ /* IVA EN CTA CONSTANTE */ /*$$IBE$$ 
        BEGIN
        SELECT SUM(DVDE_IVAMONTO), SUM(DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO), SUM(DVDE_CONSUMO)
            FROM DEVOLUCIONES_VENTAS_DETALLE F
            WHERE F.DEVT_ID = :IDDOC  AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
            INTO :IMPTOS, :MONTO, :VALORADIC;
        if (FOMENTO = 'SI') then
            MONTO = MONTO + VALORADIC;
        MONTO = MONTO * -1;
        MONTO = MONTO * FACTOR;
        IMPTOS = IMPTOS * FACTOR;
        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
        execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
        if (IMPTOS <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTAIVA, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'I') then
                BEGIN
                 $$IBE$$*/ /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */ /*$$IBE$$ 
                FOR SELECT F.ARTI_COD, (DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO), DVDE_IVAMONTO, TAIV_PORC, DVDE_CONSUMO
                    FROM ARTICULO A, DEVOLUCIONES_VENTAS_DETALLE F, TARIFA_IVA T
                    WHERE F.DEVT_ID = :IDDOC AND A.TAIV_COD = T.TAIV_COD AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
                    INTO :ART, :MONTO, :IMPTOS, :PORCIVA, :VALORADIC
                    DO
                    BEGIN
                    if (IMPINC = 'S') then
                        MONTO = MONTO - IMPTOS - VALORADIC;
                    MONTO = MONTO * -1;
                    MONTO = MONTO * FACTOR;
                    IMPTOS = IMPTOS * FACTOR;
                    execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                    execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                    if (IMPTOS <> 0) then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', :IMPTOS, 0, :MONTO, :PORCIVA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        SUMA = SUMA + IMPTOS;
                        END
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                NROI = NROI + 1;
                SUMA = SUMA + IMPTOS;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA + IMPTOS;
                END
            END  $$IBE$$*/ /* IMPTOS <> 0 */ /*$$IBE$$ 
        END  $$IBE$$*/ /* IVA EN CTA CONSTANTE */
    /* EL IMPOCONSUMO */ /*$$IBE$$ 
    if ((CONSUMO = 'A') AND (FOMENTO <> 'SI')) then
        BEGIN
        FOR SELECT MAX(COAR_CTACONS), SUM(DVDE_CONSUMO)
            FROM ARTICULO A, CONTABIL_ARTICULO C, DEVOLUCIONES_VENTAS_DETALLE F
            WHERE F.DEVT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
            GROUP BY COAR_CTACONS
            INTO :CTACONSUMO, :IMPTOS
        DO
            BEGIN
            if (IMPTOS <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTACONSUMO, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                     $$IBE$$*/ /* ES UNA CUENTA DE INVENTARIO, REGISTRE UNO A UNO LOS ARTICULOS */ /*$$IBE$$ 
                    FOR SELECT F.ARTI_COD, DVDE_CONSUMO
                        FROM ARTICULO A, CONTABIL_ARTICULO C, DEVOLUCIONES_VENTAS_DETALLE F
                        WHERE F.DEVT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTACONS = :CUENTA AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
                        INTO :ART, :IMPTOS
                    DO
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 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, :NROI, :CUENTA, :CONC, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                    NROI = NROI + 1;
                    SUMA = SUMA + IMPTOS;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA + IMPTOS;
                    END
                END  $$IBE$$*/ /* IMPTOS <> 0 */ /*$$IBE$$ 
            END  $$IBE$$*/ /* FOR */ /*$$IBE$$ 
        END  $$IBE$$*/ /* CONSUMO X ARTICULO */ /*$$IBE$$ 
    if ((CONSUMO = 'K') AND (FOMENTO <> 'SI')) then
        BEGIN
        SELECT SUM(DVDE_CONSUMO)
            FROM DEVOLUCIONES_VENTAS_DETALLE F
            WHERE F.DEVT_ID = :IDDOC AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
            INTO :IMPTOS;
        if (IMPTOS <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTACONSUMO, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'I') then
                BEGIN
                 $$IBE$$*/ /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */ /*$$IBE$$ 
                FOR SELECT F.ARTI_COD, DVDE_CONSUMO
                    FROM ARTICULO A, DEVOLUCIONES_VENTAS_DETALLE F
                    WHERE F.DEVT_ID = :IDDOC  AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
                    INTO :ART, :IMPTOS
                    DO
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTACONSUMO, :CONC, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                    NROI = NROI + 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, :NROI, :CTACONSUMO, :CONC, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA + IMPTOS;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTACONSUMO, :CONC, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA + IMPTOS;
                END
            END  $$IBE$$*/ /* IMPTOS <> 0 */ /*$$IBE$$ 
        END  $$IBE$$*/ /* CONSUMO EN CTA CONSTANTE */
    /* DESCUENTO */ /*$$IBE$$ 
    if ((CTADTO IS NOT NULL) AND
        (CTADTO <> '') AND
        (VRDTO <> 0)) THEN
        BEGIN
        EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTADTO, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRDTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
            NROI = NROI + 1;
            SUMA = SUMA - VRDTO;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRDTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 33);
            NROI = NROI + 1;
            SUMA = SUMA - VRDTO;
            END
        END  $$IBE$$*/ /* DESCUENTO */
    /* VALOR ADIC */ /*$$IBE$$ 
    if ((CTAADIC IS NOT NULL) AND
        (CTAADIC <> '') AND
        (VRADIC <> 0)) THEN
        BEGIN
        EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTAADIC, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRADIC, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
            NROI = NROI + 1;
            SUMA = SUMA + VRADIC;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRADIC, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 33);
            NROI = NROI + 1;
            SUMA = SUMA + VRADIC;
            END
        END  $$IBE$$*/ /* VR. ADIC */
    /* VALOR EXTRA */ /*$$IBE$$ 
    if ((CTAEXTRA IS NOT NULL) AND
        (CTAEXTRA <> '') AND
        (VREXTRA <> 0)) THEN
        BEGIN
        EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTAEXTRA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VREXTRA, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
            NROI = NROI + 1;
            SUMA = SUMA + VREXTRA;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VREXTRA, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 33);
            NROI = NROI + 1;
            SUMA = SUMA + VREXTRA;
            END
        END  $$IBE$$*/ /* VR. EXTRA */
    /* RETENCION FUENTE */ /*$$IBE$$ 
    if ((RTFTE = 'C') or (RTFTE = 'K')) then
      if (VRRTFTE <> 0) then
        BEGIN
        if (RTFTE = 'C') then
            CTARTFTE = TCTARTFTE;
        EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTARTFTE, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, (:VRSUBT*-1), :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
            NROI = NROI + 1;
            SUMA = SUMA - VRRTFTE;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, (:VRSUBT*-1), :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA - VRRTFTE;
            END
         $$IBE$$*/ /* AUTORETENCION */ /*$$IBE$$ 
        if (FAUTORET <= fecaux) then
            BEGIN
            EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'CUENTA DE AUTORETENCION EN LA FUENTE') returning_values (CTARTFTE);
            EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTARTFTE, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :VRSUBT, :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                NROI = NROI + 1;
                SUMA = SUMA + VRRTFTE;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :VRSUBT, :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA + VRRTFTE;
                END
            END
        END  $$IBE$$*/ /* RTFTE */ /*$$IBE$$ 
    if (RTFTE = 'A') then
      BEGIN
      FOR SELECT MAX(COAR_CTARTFTEV), MAX(COAR_RTFTE), MIN(COAR_RTBASE), SUM(DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO), SUM((DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO)*COAR_RTFTE)
        FROM CONTABIL_ARTICULO C, devoluciones_ventas_detalle F
        WHERE F.devt_id = :IDDOC AND F.ARTI_COD = C.ARTI_COD AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
        GROUP BY COAR_CTARTFTEV
        INTO :CTARTFTE, :PRTFTE, :baseadic, :MONTO, :VRRTFTE
        DO
        BEGIN
        MONTO = MONTO * FACTOR;
        if (MONTO >= BASEADIC) then
            BEGIN
            VRRTFTE = VRRTFTE * FACTOR / 100;
            execute procedure redondee(VRRTFTE, DIG) returning_values (VRRTFTE);
            execute procedure redondee(MONTO, DIG) returning_values (MONTO);
            if (VRRTFTE <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTARTFTE, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, (:MONTO*-1), :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                    NROI = NROI + 1;
                    SUMA = SUMA - VRRTFTE;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, (:MONTO*-1), :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA - VRRTFTE;
                    END
                 $$IBE$$*/ /* AUTORETENCION */ /*$$IBE$$ 
                if (FAUTORET <= fecaux) then
                    BEGIN
                    EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'CUENTA DE AUTORETENCION EN LA FUENTE') returning_values (CTARTFTE);
                    EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTARTFTE, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
                    if (ERRORC <> 0) then
                        ERROR = ERROR + 1;
                    if (TIPOCUEN = 'C') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :MONTO, :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                        NROI = NROI + 1;
                        SUMA = SUMA + VRRTFTE;
                        END
                    if (TIPOCUEN = 'N') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :MONTO, :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NROI = NROI + 1;
                        SUMA = SUMA + VRRTFTE;
                        END
                    END
                END
            END
        END  $$IBE$$*/ /* RTFTE */ /*$$IBE$$ 
      END
     $$IBE$$*/ /* RETENCION IVA */ /*$$IBE$$ 
    if ((RTIVA = 'C') or (RTIVA = 'K')) then
      if (VRRTIVA <> 0) then
        BEGIN
        if (RTIVA = 'C') then
            CTARTIVA = TCTARTIVA;
        EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTARTIVA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTIVA, (:VRIVA*-1), :PORC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
            NROI = NROI + 1;
            SUMA = SUMA - VRRTIVA;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTIVA, (:VRIVA*-1), :PORC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA - VRRTIVA;
            END
        END  $$IBE$$*/ /* RTIVA */
    /* RETENCION DE ICA */ /*$$IBE$$ 
    if ((RTICA = 'C') or (RTICA = 'K')) then
      if (VRRTICA <> 0) then
        BEGIN
        if (RTICA = 'C') then
            CTARTICA = TCTARTICA;
        EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTARTICA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTICA, (:VRSUBT*-1), :PRTICA, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
            NROI = NROI + 1;
            SUMA = SUMA - VRRTICA;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTICA, (:VRSUBT*-1), :PRTICA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA - VRRTICA;
            END
        END  $$IBE$$*/ /* RTICA */
    /* CIERRE EL COMPROBANTE CONTRA LA CUENTA DEL TERCERO O LA CONSTANTE */ /*$$IBE$$ 
    if ((SUMA <> 0) and ((CARTERA = 'C') or (CARTERA = 'K') or (CARTERA = 'J'))) then
        BEGIN
        if (SUMA < 0) then
            BEGIN
            DEBITO = SUMA * -1;
            CREDITO = 0;
            END
        ELSE
            BEGIN
            DEBITO = 0;
            CREDITO = SUMA;
            END
        if (CARTERA = 'C') then
            CTACARTERA = TCTACLIEN;
        if (CARTERA = 'J') then
            BEGIN
             $$IBE$$*/ /* BUSQUE LA CUENTA DE LA CAJA */ /*$$IBE$$ 
            SELECT CAJA_CUENTA FROM CAJAS C, PUNTO_VENTA P
                WHERE P.CAJA_ID = C.CAJA_ID AND PTVT_ID = :PTOVTA
                INTO :CTACARTERA;
            END
        EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTACARTERA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :DEBITO, :CREDITO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
        if (TIPOCUEN = 'N') then
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :DEBITO, :CREDITO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
        NROI = NROI + 1;
        END  $$IBE$$*/ /* SUMA EN CARTERA */
    /* CALCULE COSTOS EN VENTAS */ /*$$IBE$$ 
    EXECUTE PROCEDURE COSTO_EN_VENTAS(33, :IDDOC);
    if (COSTOS = 'A') then
        BEGIN
        FOR SELECT MAX(CTACOS), SUM(cast(CANT as double precision) * COSTO)
            FROM COSTO_VENTAS
            GROUP BY CTACOS
            INTO :CTACOSTOS, :MONTO
        DO
            BEGIN
            if (MONTO <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTACOSTOS, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                     $$IBE$$*/ /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */ /*$$IBE$$ 
                    FOR SELECT ARTI_COD, cast(CANT as double precision) * COSTO
                        FROM COSTO_VENTAS
                        WHERE CTACOS = :CUENTA
                        INTO :ART, :MONTO
                    DO
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                    NROI = NROI + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    END
                END  $$IBE$$*/ /* MONTO <> 0 */ /*$$IBE$$ 
            END  $$IBE$$*/ /* FOR */ /*$$IBE$$ 
        END  $$IBE$$*/ /* COSTOS */ /*$$IBE$$ 
    if (COSTOS = 'K') then
        BEGIN
        SELECT SUM(cast(CANT as double precision) * COSTO)
            FROM COSTO_VENTAS
            INTO :MONTO;
        if (MONTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTACOSTOS, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'I') then
                BEGIN
                 $$IBE$$*/ /* ES UNA CUENTA DE INVENTARIO, REGISTRE UNO A UNO LOS ARTICULOS */ /*$$IBE$$ 
                FOR SELECT ARTI_COD, cast(CANT as double precision) * COSTO
                    FROM COSTO_VENTAS
                    INTO :ART, :MONTO
                DO
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTACOSTOS, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                    NROI = NROI + 1;
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTACOSTOS, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                NROI = NROI + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTACOSTOS, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                END
            END  $$IBE$$*/ /* MONTO <> 0 */ /*$$IBE$$ 
        END  $$IBE$$*/ /* COSTOS = K */ /*$$IBE$$ 
    if (INVEN = 'A') then
        BEGIN
        FOR SELECT MAX(CTAINV), SUM(cast(CANT as double precision) * COSTO)
            FROM COSTO_VENTAS
            GROUP BY CTAINV
            INTO :CTAINVEN, :MONTO
        DO
            BEGIN
            if (MONTO <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTAINVEN, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                     $$IBE$$*/ /* ES UNA CUENTA DE INVENTARIO, REGISTRE UNO A UNO LOS ARTICULOS */ /*$$IBE$$ 
                    FOR SELECT ARTI_COD, cast(CANT as double precision) * COSTO
                        FROM COSTO_VENTAS
                        WHERE CTAINV = :CUENTA
                        INTO :ART, :MONTO
                    DO
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                    NROI = NROI + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    END
                END  $$IBE$$*/ /* MONTO <> 0 */ /*$$IBE$$ 
            END  $$IBE$$*/ /* FOR */ /*$$IBE$$ 
        END  $$IBE$$*/ /* INVEN = A */ /*$$IBE$$ 
    if (INVEN = 'K') then
        BEGIN
        SELECT SUM(cast(CANT as double precision) * COSTO)
            FROM COSTO_VENTAS
            INTO :MONTO;
        if (MONTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTAINVEN, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'I') then
                BEGIN
                 $$IBE$$*/ /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */ /*$$IBE$$ 
                FOR SELECT ARTI_COD, cast(CANT as double precision) * COSTO
                    FROM COSTO_VENTAS
                    INTO :ART, :MONTO
                DO
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTAINVEN, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                    NROI = NROI + 1;
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAINVEN, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                NROI = NROI + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAINVEN, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                END
            END  $$IBE$$*/ /* MONTO <> 0 */ /*$$IBE$$ 
        END  $$IBE$$*/ /* INVEN = K */
    /* recorra las cuentas adicionales */ /*$$IBE$$ 
    FOR SELECT INVC_CUENTA, INVC_BASE, INVC_PORC, INVC_VALOR, INVC_DB
        FROM INTERFAZ_VENTAS_CTAS WHERE INVE_ID = :IDINTER
        INTO :CTADIC, :BASEADIC, :PORCADIC, :VALORADIC, :DBADIC
        DO
        BEGIN
        if (valoradic <> 0) then
            monto = valoradic;
        else
            BEGIN
            if (:BASEADIC = 'SUBTOTAL') then
                VALORADIC = vrsubt;
            if (:BASEADIC = 'DESCUENTO') then
                VALORADIC = VRDTO;
            if (:BASEADIC = 'IVA') then
                VALORADIC = VRIVA;
            if (:BASEADIC = 'ADICIONAL') then
                VALORADIC = VRADIC;
            if (:BASEADIC = 'EXTRA') then
                VALORADIC = VREXTRA;
            if (:BASEADIC = 'TOTAL') then
                VALORADIC = VRTOTAL;
            MONTO = VALORADIC * PORCADIC;
            END
        if (MONTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTADIC, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                if (DBADIC = 'S') then
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                ELSE
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                NROI = NROI + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                if (DBADIC = 'S') then
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                ELSE
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                END
            NROI = NROI + 1;
            END
        END
    if (error > 0) then
        ver = 'S';
    SUSPEND;
    END
   END  $$IBE$$*/ /* EXISTE LA INTERFAZ */ /*$$IBE$$ 
  ELSE
    BEGIN
    EXECUTE PROCEDURE ERROR (33, :IDDOC, :PREF, 1);
    ERROR = ERROR + 1;
    VER = 'S';
    SUSPEND;
    END
 $$IBE$$*/ SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE CONTABIL_FACTURA(
    IDDOC INTEGER,
    IDINTER INTEGER)
RETURNS (
    ERROR INTEGER,
    VER CHAR(1),
    IDC INTEGER)
AS
declare variable pref varchar(4);
declare variable num varchar(6);
declare variable numero varchar(10);
declare variable fecaux date;
declare variable fecha char(8);
declare variable conc varchar(60);
declare variable venceaux date;
declare variable vence char(8);
declare variable vrdto numeric(18,2);
declare variable vradic numeric(18,2);
declare variable vrsubt numeric(18,2);
declare variable vriva numeric(18,2);
declare variable prtfte numeric(9,2);
declare variable vrrtfte numeric(18,2);
declare variable vrrtiva numeric(18,2);
declare variable prtica numeric(9,2);
declare variable vrrtica numeric(18,2);
declare variable vrtotal numeric(18,2);
declare variable vrextra numeric(18,2);
declare variable tipocomp varchar(3);
declare variable prefcont varchar(4);
declare variable ventas char(1);
declare variable ctaventas varchar(20);
declare variable iva char(1);
declare variable ctaiva varchar(20);
declare variable consumo char(1);
declare variable ctaconsumo varchar(20);
declare variable cartera char(1);
declare variable ctacartera varchar(20);
declare variable rtfte char(1);
declare variable ctartfte varchar(20);
declare variable rtiva char(1);
declare variable ctartiva varchar(20);
declare variable rtica char(1);
declare variable ctartica varchar(20);
declare variable inven char(1);
declare variable ctainven varchar(20);
declare variable costos char(1);
declare variable ctacostos varchar(20);
declare variable ctadto varchar(20);
declare variable ctaadic varchar(20);
declare variable ctaextra varchar(20);
declare variable existe char(1);
declare variable cuenta varchar(20);
declare variable monto numeric(18,2);
declare variable tipocuen char(1);
declare variable nit varchar(20);
declare variable nombre varchar(60);
declare variable proy varchar(4);
declare variable centro varchar(4);
declare variable porc numeric(5,2);
declare variable debito numeric(18,2);
declare variable credito numeric(18,2);
declare variable nroi integer;
declare variable art varchar(15);
declare variable imptos numeric(18,2);
declare variable suma numeric(18,2);
declare variable porciva numeric(9,2);
declare variable tctaclien varchar(20);
declare variable tctaventa varchar(20);
declare variable tctartfte varchar(20);
declare variable tctartiva varchar(20);
declare variable tctartica varchar(20);
declare variable ctadic varchar(20);
declare variable baseadic varchar(20);
declare variable porcadic numeric(5,2);
declare variable valoradic numeric(18,2);
declare variable dbadic char(1);
declare variable ptovta integer;
declare variable anulado char(1);
declare variable dig integer;
declare variable mercancia numeric(18,2);
declare variable fomento varchar(2);
declare variable DTOXIT varchar(2);
declare variable vrconsumo numeric(18,2);
declare variable factor double precision;
declare variable cent char(1);
declare variable AUTORET VARCHAR(10);
declare variable FAUTORET DATE;
declare variable ERRORC INTEGER;
BEGIN /*$$IBE$$ 
EXECUTE PROCEDURE LEE_CONFIGURACION('COMPRAS', 'FACTURAS', 'USAR IMPOCONSUMO COMO PORCENTAJE DE FOMENTO') returning_values (FOMENTO);
EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'FECHA AUTORETENEDOR NO DESCONTAR RETENCIONES DEL SALDO PERO SI CONTABILIZARLAS') returning_values (AUTORET);
if (AUTORET <> '') then
    FAUTORET = CAST(AUTORET AS DATE);
else
    FAUTORET = '9999/12/31';
 $$IBE$$*/ /* BUSQUE LA INTERFACE */ /*$$IBE$$ 
EXISTE = 'N';
SELECT 'S', TICO_COD, PRCO_PRE, INVE_VENTAS, INVE_IVA, INVE_CONSUMO, INVE_CARTERA, INVE_RTFTE, INVE_RTIVA, INVE_RTICA, INVE_COSTO, INVE_INVEN, INVE_CTAVENTAS, INVE_CTAIVA, INVE_CTACONSUMO, INVE_CTADTO, INVE_CTAADIC, INVE_CTAEXTRA, INVE_CTACARTERA, INVE_CTARTFTE, INVE_CTARTIVA, INVE_CTARTICA, INVE_CTAINVEN, INVE_CTACOSTOS, INVE_CONFIRMAR, INVE_CENTRO
    FROM INTERFAZ_VENTAS
    WHERE INVE_ID = :IDINTER
    INTO :EXISTE, :TIPOCOMP, :PREFCONT, :VENTAS, :IVA, :CONSUMO, :CARTERA, :RTFTE, :RTIVA, :RTICA, :COSTOS, :INVEN, :CTAVENTAS, :CTAIVA, :CTACONSUMO, :CTADTO, :CTAADIC, :CTAEXTRA, :CTACARTERA, :CTARTFTE, :CTARTIVA, :CTARTICA, :CTAINVEN, :CTACOSTOS, :VER, :CENT;
if (EXISTE = 'S') then
  BEGIN
     $$IBE$$*/ /* BORRE CUALQUEIR CONTABILIZACION PREVIA */ /*$$IBE$$ 
    DELETE FROM CONTABILIZACION WHERE CNTB_TIPOREF = 31 AND CNTB_IDREF = :IDDOC;

   $$IBE$$*/ /* TRAIGA EL ENCABEZADO DE LA FACTURA */ /*$$IBE$$ 
  SELECT PREF_PRE, FACT_NUMERO, FACT_FECHA, F.TERC_NIT, PTVT_ID, FACT_VENCE, FACT_DTOMONTO, FACT_ADICIONAL, FACT_IVAMONTO, FACT_EXTRA, FACT_TOTAL, FACT_RTFTEPOR, FACT_RTFTEMONTO, FACT_RTIVAPOR, FACT_RTIVAMONTO, FACT_RTICAPOR, FACT_RTICAMONTO, FACT_NOMCLIENTE, TERC_CTARTFTE, TERC_CTARTIVA, TERC_CTARTICA, TERC_CTAVENTA, TERC_CTACLIENTE, FACT_ANULADO
        FROM FACTURAS F, TERCEROS T
        WHERE FACT_ID = :IDDOC AND F.TERC_NIT = T.TERC_NIT
        INTO :PREF, :NUM, :FECAUX, :NIT, :PTOVTA, :VENCEAUX, :VRDTO, :VRADIC, :VRIVA, :VREXTRA, :VRTOTAL, :PRTFTE, :VRRTFTE, :PORC, :VRRTIVA, :PRTICA, :VRRTICA, :NOMBRE, TCTARTFTE, TCTARTIVA, TCTARTICA, TCTAVENTA, TCTACLIEN, ANULADO;
  if (ANULADO = 'N') then
    BEGIN
     $$IBE$$*/ /* BUSQUE EL CENTRO DEL PUNTO, LA BODEGA, O EL PREFIJO  */ /*$$IBE$$ 
    IF (CENT = 'B') THEN
        SELECT B.BODE_CENTRO, B.BODE_PROY FROM BODEGA B, FACTURAS F
            WHERE B.BODE_COD = F.BODE_COD AND F.FACT_ID = :IDDOC INTO :CENTRO, :PROY;
    IF (CENT = 'V') THEN
        SELECT V.CENT_COD, V.PROY_COD FROM VENDEDORES V, FACTURAS F
            WHERE V.VEND_COD = F.VEND_COD AND F.FACT_ID = :IDDOC INTO :CENTRO, :PROY;
    IF (CENT = 'P') THEN
        SELECT P.PREF_CENTRO,P.PREF_PROY  FROM PREFIJOS P, FACTURAS F
            WHERE P.PREF_PRE = F.PREF_PRE AND F.FACT_ID = :IDDOC AND P.TIDO_COD = 31 INTO :CENTRO, :PROY;
    NUMERO = PREF || NUM;
    SELECT SUM (FADE_CONSUMO) FROM FACTURAS_DETALLE WHERE FACT_ID = :IDDOC  AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
        INTO MERCANCIA;
    VRSUBT = VRTOTAL - VREXTRA - VRIVA - MERCANCIA;  $$IBE$$*/ /* BASE DE RETEFTE Y RETEICA */ /*$$IBE$$ 

    EXECUTE PROCEDURE lee_configuracion ('FACTURACION', 'FACTURAS', 'DESCUENTO PIE FACTURA IGUAL A SUMA DE DESCUENTOS POR ITEM') returning_values (:DTOXIT);
    if (DTOXIT = 'SI') then
        VRDTO = 0;
    MERCANCIA = VRSUBT - VRADIC + VRDTO;
    EXECUTE PROCEDURE FECHA_A_CONTA(:FECAUX) returning_values (:FECHA);
    EXECUTE PROCEDURE FECHA_A_CONTA(:VENCEAUX) returning_values (:VENCE);
     $$IBE$$*/ /* REGISTRE EL ENCABEZADO CONTABLE */ /*$$IBE$$ 
    IDC = GEN_ID(ID_CONTABILIZA, 1);
    if (STRLEN(NOMBRE)> 43 ) then
      CONC = 'FV No.' || NUMERO || '-' || SUBSTR(NOMBRE,1,43);
    ELSE
      CONC = 'FV No.' || NUMERO || '-' || NOMBRE;
    INSERT INTO CONTABILIZACION (CNTB_ID, CNTB_TIPOCOMP, CNTB_PREFCNT, CNTB_NUMERO, CNTB_FECHA, CNTB_CONCEPTO, CNTB_REF, CNTB_TIPOREF, CNTB_IDREF, CNTB_PREFREF, CNTB_NUMREF, CNTB_PROCESADO)
        VALUES (:IDC, :TIPOCOMP, :PREFCONT, :NUM, :FECHA, :CONC, '', 31, :IDDOC, :PREF, :NUM, 'N');
    NROI = 0;
    SUMA = 0;
    ERROR = 0;
     $$IBE$$*/ /* SI NO HAY CUENTA DE DESCUENTO NI ADICIONAL CALCULE UN FACTOR PARA LAS VENTAS Y EL IVA */ /*$$IBE$$ 
    if (MERCANCIA <> 0) then
        FACTOR = CAST(VRSUBT AS DOUBLE PRECISION) / CAST(MERCANCIA AS DOUBLE PRECISION);
    ELSE
        FACTOR = 1;
     $$IBE$$*/ /* TRAIGA EL NUMERO DE DIGITOS PARA EL REDONDEO */ /*$$IBE$$ 
    SELECT CAST(CONF_VALOR AS INTEGER) FROM CONFIGURACION WHERE CONF_MODULO = 'FACTURACION' AND
        CONF_CATEGORIA = 'GENERAL' AND CONF_PROPIEDAD = 'REDONDEO AL MULTIPLO DE DIEZ EN TOTALES' INTO :DIG;
     $$IBE$$*/ /* CUENTAS DE VENTAS */ /*$$IBE$$ 
    if (VENTAS = 'A') then
        BEGIN
        FOR SELECT MAX(COAR_CTAVNT), SUM(FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), SUM(FADE_IVAMONTO), SUM(FADE_CONSUMO)
            FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_DETALLE F
            WHERE F.FACT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
            GROUP BY COAR_CTAVNT
            INTO :CTAVENTAS, :MONTO, :IMPTOS, :VRCONSUMO
            DO
            BEGIN
            if (FOMENTO = 'SI') then
                MONTO = MONTO + VRCONSUMO;
            if ((CTADTO IS NULL) OR (CTADTO = '')) then
                MONTO = MONTO * FACTOR;
            execute procedure redondee(MONTO, DIG) returning_values (MONTO);
            if (MONTO <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTAVENTAS, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                     $$IBE$$*/ /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */ /*$$IBE$$ 
                    FOR SELECT F.ARTI_COD, (FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), FADE_CONSUMO
                        FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_DETALLE F
                        WHERE F.FACT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTAINV = :CUENTA AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
                        INTO :ART, :MONTO, :IMPTOS
                    DO
                        BEGIN
                        if (FOMENTO = 'SI') then
                            MONTO = MONTO + IMPTOS;
                        if ((CTADTO IS NULL) OR (CTADTO = '')) then
                            MONTO = MONTO * FACTOR;
                        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                        if (MONTO <> 0) then
                            BEGIN
                            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                            NROI = NROI + 1;
                            SUMA = SUMA - MONTO;
                            END
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    NROI = NROI + 1;
                    SUMA = SUMA - MONTO;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA - MONTO;
                    END
                END  $$IBE$$*/ /* MONTO <> 0 */ /*$$IBE$$ 
            END  $$IBE$$*/ /* FOR */ /*$$IBE$$ 
        END  $$IBE$$*/ /* VENTAS X ARTICULO */ /*$$IBE$$ 
     IF ((VENTAS = 'C') OR (VENTAS = 'K')) THEN
        BEGIN
        IF (VENTAS = 'C') THEN
            CTAVENTAS = TCTAVENTA;
        SELECT SUM(FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), SUM(FADE_IVAMONTO), SUM (FADE_CONSUMO)
            FROM FACTURAS_DETALLE F
            WHERE F.FACT_ID = :IDDOC AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
            INTO :MONTO, :IMPTOS, :VRCONSUMO;
        if (FOMENTO = 'SI') then
            MONTO = MONTO + VRCONSUMO;
        if ((CTADTO IS NULL) OR (CTADTO = '')) then
            MONTO = MONTO * FACTOR;
        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
        if (MONTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTAVENTAS, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'I') then
                BEGIN
                 $$IBE$$*/ /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */ /*$$IBE$$ 
                FOR SELECT F.ARTI_COD, (FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), FADE_CONSUMO
                    FROM ARTICULO A, FACTURAS_DETALLE F
                    WHERE F.FACT_ID = :IDDOC AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
                    INTO :ART, :MONTO, :IMPTOS
                    DO
                    BEGIN
                    if (FOMENTO = 'SI') then
                        MONTO = MONTO + VRCONSUMO;
                    if ((CTADTO IS NULL) OR (CTADTO = '')) then
                        MONTO = MONTO * FACTOR;
                    execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                    if (MONTO <> 0) then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        SUMA = SUMA - MONTO;
                        END
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - MONTO;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - MONTO;
                END
            END  $$IBE$$*/ /* MONTO <> 0 */ /*$$IBE$$ 
        END  $$IBE$$*/ /* VENTAS DE CLIENTE O CONSTANTE */
    /* EL IVA EN VENTAS */ /*$$IBE$$ 
    if (IVA = 'A') then
        BEGIN
        FOR SELECT MAX(COAR_CTAIVAV), SUM(FADE_IVAMONTO), SUM(FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), sum(FADE_CONSUMO)
            FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_DETALLE F
            WHERE F.FACT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
            GROUP BY COAR_CTAIVAV
            INTO :CTAIVA, :IMPTOS, :MONTO, :VALORADIC
        DO
            BEGIN
            if (FOMENTO = 'SI') then
                MONTO = MONTO + VALORADIC;
            MONTO = MONTO * -1;
            MONTO = MONTO * FACTOR;
            IMPTOS = IMPTOS * FACTOR;
            execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
            execute procedure redondee(MONTO, DIG) returning_values (MONTO);
            if (IMPTOS <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTAIVA, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                     $$IBE$$*/ /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */ /*$$IBE$$ 
                    FOR SELECT F.ARTI_COD, FADE_IVAMONTO, (FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), TAIV_PORC, FADE_CONSUMO
                        FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_DETALLE F, TARIFA_IVA T
                        WHERE F.FACT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTAIVAV = :CUENTA AND A.TAIV_COD = T.TAIV_COD AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
                        INTO :ART, :IMPTOS, :MONTO, :PORCIVA, :VALORADIC
                    DO
                        BEGIN
                        if (FOMENTO = 'SI') then
                            MONTO = MONTO + VALORADIC;
                        MONTO = MONTO * -1;
                        MONTO = MONTO * FACTOR;
                        IMPTOS = IMPTOS * FACTOR;
                        execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                        if (IMPTOS <> 0) then
                            BEGIN
                            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, :MONTO, :PORCIVA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                            NROI = NROI + 1;
                            SUMA = SUMA + DEBITO - CREDITO;
                            END
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, :MONTO, ABS(:IMPTOS*100/:MONTO), :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    NROI = NROI + 1;
                    SUMA = SUMA - IMPTOS;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, :MONTO, ABS(:IMPTOS*100/:MONTO), :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA - IMPTOS;
                    END
                END    $$IBE$$*/ /* IMPTOS <> 0 */ /*$$IBE$$ 
            END  $$IBE$$*/ /* FOR */ /*$$IBE$$ 
        END  $$IBE$$*/ /* IVA X ARTICULO */ /*$$IBE$$ 
    if (IVA = 'K') then  $$IBE$$*/ /* IVA EN CTA CONSTANTE */ /*$$IBE$$ 
        BEGIN
        SELECT SUM(FADE_IVAMONTO), SUM(FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), SUM(FADE_CONSUMO)
            FROM FACTURAS_DETALLE F
            WHERE F.FACT_ID = :IDDOC and FADE_IVAMONTO <> 0 AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
            INTO :IMPTOS, :MONTO, :valoradic;
        if (FOMENTO = 'SI') then
            MONTO = MONTO + VALORADIC;
        MONTO = MONTO * -1;
        MONTO = MONTO * FACTOR;
        IMPTOS = IMPTOS * FACTOR;
        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
        execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
        if (IMPTOS <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTAIVA, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'I') then
                BEGIN
                 $$IBE$$*/ /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */ /*$$IBE$$ 
                FOR SELECT F.ARTI_COD, (FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), FADE_IVAMONTO, TAIV_PORC, FADE_CONSUMO
                    FROM ARTICULO A, FACTURAS_DETALLE F, TARIFA_IVA T
                    WHERE F.FACT_ID = :IDDOC AND A.TAIV_COD = T.TAIV_COD AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
                    INTO :ART, :MONTO, :IMPTOS, :PORCIVA, :VALORADIC
                    DO
                    BEGIN
                    if (FOMENTO = 'SI') then
                        MONTO = MONTO + VALORADIC;
                    MONTO = MONTO * -1;
                    MONTO = MONTO * FACTOR;
                    IMPTOS = IMPTOS * FACTOR;
                    execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                    execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                    if (IMPTOS <> 0) then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', 0, :IMPTOS, :MONTO, :PORCIVA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        SUMA = SUMA - IMPTOS;
                        END
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', 0, :IMPTOS, :MONTO, ABS(:IMPTOS*100/:MONTO), :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - IMPTOS;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', 0, :IMPTOS, :MONTO, ABS(:IMPTOS*100/:MONTO), :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - IMPTOS;
                END
            END  $$IBE$$*/ /* IMPTOS <> 0 */ /*$$IBE$$ 
        END  $$IBE$$*/ /* IVA EN CTA CONSTANTE */
    /* EL IMPOCONSUMO */ /*$$IBE$$ 
    if ((CONSUMO = 'A') AND (FOMENTO <> 'SI')) then
        BEGIN
        FOR SELECT MAX(COAR_CTACONS), SUM(FADE_CONSUMO)
            FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_DETALLE F
            WHERE F.FACT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
            GROUP BY COAR_CTACONS
            INTO :CTACONSUMO, :IMPTOS
        DO
            BEGIN
            execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
            if (IMPTOS <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTACONSUMO, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                     $$IBE$$*/ /* ES UNA CUENTA DE INVENTARIO, REGISTRE UNO A UNO LOS ARTICULOS */ /*$$IBE$$ 
                    FOR SELECT F.ARTI_COD, FADE_CONSUMO
                        FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_DETALLE F
                        WHERE F.FACT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTACONS = :CUENTA AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
                        INTO :ART, :IMPTOS
                    DO
                        BEGIN
                        execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                        if (IMPTOS <> 0) then
                            BEGIN
                            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                            NROI = NROI + 1;
                            SUMA = SUMA - IMPTOS;
                            END
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    NROI = NROI + 1;
                    SUMA = SUMA - IMPTOS;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA - IMPTOS;
                    END
                END  $$IBE$$*/ /* IMPTOS <> 0 */ /*$$IBE$$ 
            END  $$IBE$$*/ /* FOR */ /*$$IBE$$ 
        END  $$IBE$$*/ /* CONSUMO X ARTICULO */ /*$$IBE$$ 
    if ((CONSUMO = 'K') AND (FOMENTO <> 'SI')) then  $$IBE$$*/ /* CONSUMO EN CTA CONSTANTE */ /*$$IBE$$ 
        BEGIN
        SELECT SUM(FADE_CONSUMO)
            FROM FACTURAS_DETALLE F
            WHERE F.FACT_ID = :IDDOC AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
            INTO :IMPTOS;
        execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
        if (IMPTOS <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTACONSUMO, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'I') then
                BEGIN
                 $$IBE$$*/ /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */ /*$$IBE$$ 
                FOR SELECT F.ARTI_COD, FADE_CONSUMO
                    FROM ARTICULO A, FACTURAS_DETALLE F
                    WHERE F.FACT_ID = :IDDOC AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
                    INTO :ART, :IMPTOS
                    DO
                    BEGIN
                    execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                    if (IMPTOS <> 0) then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CTACONSUMO, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        SUMA = SUMA - IMPTOS;
                        END
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTACONSUMO, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - IMPTOS;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTACONSUMO, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - IMPTOS;
                END
            END  $$IBE$$*/ /* IMPTOS <> 0 */ /*$$IBE$$ 
        END  $$IBE$$*/ /* CONSUMO EN CTA CONSTANTE */
    /* DESCUENTO */ /*$$IBE$$ 
    if ((CTADTO IS NOT NULL) AND (CTADTO <> '')) then
        BEGIN
        execute procedure redondee(VRDTO, DIG) returning_values (VRDTO);
        if (VRDTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTADTO, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRDTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA + VRDTO;
                END
            if (TIPOCUEN = 'N') then
                    BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRDTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA + VRDTO;
                END
            END
        END  $$IBE$$*/ /* DESCUENTO */
    /* VALOR ADIC */ /*$$IBE$$ 
    if ((CTAADIC IS NOT NULL) AND (CTAADIC <> '')) then
        BEGIN
        execute procedure redondee(VRADIC, DIG) returning_values (VRADIC);
        if (VRADIC <> 0) THEN
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTAADIC, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRADIC, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - VRADIC;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRADIC, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - VRADIC;
                END
            END
        END  $$IBE$$*/ /* VR. ADIC */
    /* VALOR EXTRA */ /*$$IBE$$ 
    if ((CTAEXTRA IS NOT NULL) AND (CTAEXTRA <> '')) THEN
        BEGIN
        execute procedure redondee(VREXTRA, DIG) returning_values (VREXTRA);
        if (VREXTRA <> 0) THEN
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTAEXTRA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VREXTRA, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - VREXTRA;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VREXTRA, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - VREXTRA;
                END
            END
        END  $$IBE$$*/ /* VR. EXTRA */
    /* DESCUENTE EL IMPOCONSUMO */ /*$$IBE$$ 
    SELECT SUM(FADE_CONSUMO)
        FROM FACTURAS_DETALLE F WHERE F.FACT_ID = :IDDOC AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL)) INTO :IMPTOS;
    vrsubt = vrsubt - IMPTOS;
     $$IBE$$*/ /* RETENCION FUENTE */ /*$$IBE$$ 
    if ((RTFTE = 'C') or (RTFTE = 'K')) then
      BEGIN
      execute procedure redondee(VRRTFTE, DIG) returning_values (VRRTFTE);
      if (VRRTFTE <> 0) then
        BEGIN
        if (RTFTE = 'C') then
            CTARTFTE = TCTARTFTE;
        EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTARTFTE, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :VRSUBT, :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTFTE;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :VRSUBT, :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTFTE;
            END
         $$IBE$$*/ /* AUTORETENCION */ /*$$IBE$$ 
        if (FAUTORET <= fecaux) then
            BEGIN
            EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'CUENTA DE AUTORETENCION EN LA FUENTE') returning_values (CTARTFTE);
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTARTFTE INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERROR (31, :IDDOC, :CTARTFTE, 2);
                CUENTA = CTARTFTE;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                begin
                EXECUTE PROCEDURE ERROR (31, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, (:VRSUBT*-1), :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - VRRTFTE;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, (:VRSUBT*-1), :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - VRRTFTE;
                END
            END
        END  $$IBE$$*/ /* RTFTE */ /*$$IBE$$ 
      END
    if (RTFTE = 'A') then
      BEGIN
      FOR SELECT MAX(COAR_CTARTFTEV), MAX(COAR_RTFTE), MIN(COAR_RTBASE), SUM(FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), SUM((FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO)*COAR_RTFTE)
        FROM CONTABIL_ARTICULO C, FACTURAS_DETALLE F
        WHERE F.FACT_ID = :IDDOC AND F.ARTI_COD = C.ARTI_COD AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
        GROUP BY COAR_CTARTFTEV
        INTO :CTARTFTE, :PRTFTE, :baseadic, :MONTO, :VRRTFTE
        DO
        BEGIN
        MONTO = MONTO * FACTOR;
        if (MONTO >= BASEADIC) then
            BEGIN
            VRRTFTE = VRRTFTE * FACTOR / 100;
            execute procedure redondee(VRRTFTE, DIG) returning_values (VRRTFTE);
            execute procedure redondee(MONTO, DIG) returning_values (MONTO);
            if (VRRTFTE <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTARTFTE, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :MONTO, :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    NROI = NROI + 1;
                    SUMA = SUMA + VRRTFTE;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :MONTO, :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA + VRRTFTE;
                    END
                 $$IBE$$*/ /* AUTORETENCION */ /*$$IBE$$ 
                if (FAUTORET <= fecaux) then
                    BEGIN
                    EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'CUENTA DE AUTORETENCION EN LA FUENTE') returning_values (CTARTFTE);
                    EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTARTFTE, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
                    if (ERRORC <> 0) then
                        ERROR = ERROR + 1;
                    if (TIPOCUEN = 'C') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, (:MONTO*-1), :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                        NROI = NROI + 1;
                        SUMA = SUMA - VRRTFTE;
                        END
                    if (TIPOCUEN = 'N') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, (:MONTO*-1), :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NROI = NROI + 1;
                        SUMA = SUMA - VRRTFTE;
                        END
                    END
                END
            END
        END  $$IBE$$*/ /* RTFTE */ /*$$IBE$$ 
      END
     $$IBE$$*/ /* RETENCION IVA */ /*$$IBE$$ 
    if ((RTIVA = 'C') or (RTIVA = 'K')) then
      BEGIN
      execute procedure redondee(VRRTIVA, DIG) returning_values (VRRTIVA);
      if (VRRTIVA <> 0) then
        BEGIN
        if (RTIVA = 'C') then
            CTARTIVA = TCTARTIVA;
        EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTARTIVA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTIVA, 0, :VRIVA, :PORC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTIVA;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTIVA, 0, :VRIVA, :PORC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTIVA;
            END
        END  $$IBE$$*/ /* RTIVA */ /*$$IBE$$ 
      END
     $$IBE$$*/ /* RETENCION DE ICA */ /*$$IBE$$ 
    if ((RTICA = 'C') or (RTICA = 'K')) then
      BEGIN
      execute procedure redondee(VRRTICA, DIG) returning_values (VRRTICA);
      if (VRRTICA <> 0) then
        BEGIN
        if (RTICA = 'C') then
            CTARTICA = TCTARTICA;
        EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTARTICA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTICA, 0, :VRSUBT, :PRTICA, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTICA;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTICA, 0, :VRSUBT, :PRTICA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTICA;
            END
        END  $$IBE$$*/ /* RTICA */ /*$$IBE$$ 
      END
     $$IBE$$*/ /* CIERRE EL COMPROBANTE CONTRA LA CUENTA DEL TERCERO O LA CONSTANTE */ /*$$IBE$$ 
    if ((SUMA <> 0) and ((CARTERA = 'C') or (CARTERA = 'K') or (CARTERA = 'J'))) then
        BEGIN
        if (SUMA < 0) then
            BEGIN
            DEBITO = SUMA * -1;
            CREDITO = 0;
            END
        ELSE
            BEGIN
            DEBITO = 0;
            CREDITO = SUMA;
            END
        if (CARTERA = 'C') then
            CTACARTERA = TCTACLIEN;
        if (CARTERA = 'J') then
            BEGIN
             $$IBE$$*/ /* BUSQUE LA CUENTA DE LA CAJA */ /*$$IBE$$ 
            SELECT CAJA_CUENTA FROM CAJAS C, PUNTO_VENTA P
                WHERE P.CAJA_ID = C.CAJA_ID AND PTVT_ID = :PTOVTA
                INTO :CTACARTERA;
            END
        EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTACARTERA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :DEBITO, :CREDITO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
        if (TIPOCUEN = 'N') then
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :DEBITO, :CREDITO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
        NROI = NROI + 1;
        END  $$IBE$$*/ /* SUMA EN CARTERA */
    /* CALCULE COSTOS EN VENTAS */ /*$$IBE$$ 
    EXECUTE PROCEDURE COSTO_EN_VENTAS(31, :IDDOC);
    if (COSTOS = 'A') then
        BEGIN
        FOR SELECT MAX(CTACOS), SUM(CAST(CANT AS DOUBLE PRECISION) * COSTO)
            FROM COSTO_VENTAS
            GROUP BY CTACOS
            INTO :CTACOSTOS, :MONTO
        DO
            BEGIN
            if (MONTO <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTACOSTOS, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                     $$IBE$$*/ /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */ /*$$IBE$$ 
                    FOR SELECT ARTI_COD, CANT * COSTO
                        FROM COSTO_VENTAS
                        WHERE CTACOS = :CUENTA
                        INTO :ART, :MONTO
                    DO
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    NROI = NROI + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    END
                END  $$IBE$$*/ /* MONTO <> 0 */ /*$$IBE$$ 
            END  $$IBE$$*/ /* FOR */ /*$$IBE$$ 
        END  $$IBE$$*/ /* COSTOS */ /*$$IBE$$ 
    if (COSTOS = 'K') then
        BEGIN
        SELECT SUM(CAST(CANT AS DOUBLE PRECISION) * COSTO)
            FROM COSTO_VENTAS
            INTO :MONTO;
        if (MONTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTACOSTOS, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'I') then
                BEGIN
                 $$IBE$$*/ /* ES UNA CUENTA DE INVENTARIO, REGISTRE UNO A UNO LOS ARTICULOS */ /*$$IBE$$ 
                FOR SELECT ARTI_COD, CANT * COSTO
                    FROM COSTO_VENTAS
                    INTO :ART, :MONTO
                DO
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTACOSTOS, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                    NROI = NROI + 1;
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTACOSTOS, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTACOSTOS, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                END
            END  $$IBE$$*/ /* MONTO <> 0 */ /*$$IBE$$ 
        END  $$IBE$$*/ /* COSTOS = K */ /*$$IBE$$ 
    if (INVEN = 'A') then
        BEGIN
        FOR SELECT MAX(CTAINV), SUM(CAST(CANT AS DOUBLE PRECISION) * COSTO)
            FROM COSTO_VENTAS
            GROUP BY CTAINV
            INTO :CTAINVEN, :MONTO
        DO
            BEGIN
            if (MONTO <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTAINVEN, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                     $$IBE$$*/ /* ES UNA CUENTA DE INVENTARIO, REGISTRE UNO A UNO LOS ARTICULOS */ /*$$IBE$$ 
                    FOR SELECT ARTI_COD, CANT * COSTO
                        FROM COSTO_VENTAS
                        WHERE CTAINV = :CUENTA
                        INTO :ART, :MONTO
                    DO
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    NROI = NROI + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    END
                END  $$IBE$$*/ /* MONTO <> 0 */ /*$$IBE$$ 
            END  $$IBE$$*/ /* FOR */ /*$$IBE$$ 
        END  $$IBE$$*/ /* INVEN = A */ /*$$IBE$$ 
    if (INVEN = 'K') then
        BEGIN
        SELECT SUM(CAST(CANT AS DOUBLE PRECISION) * COSTO)
            FROM COSTO_VENTAS
            INTO :MONTO;
        if (MONTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTAINVEN, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'I') then
                BEGIN
                 $$IBE$$*/ /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */ /*$$IBE$$ 
                FOR SELECT ARTI_COD, CANT * COSTO
                    FROM COSTO_VENTAS
                    INTO :ART, :MONTO
                DO
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTAINVEN, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                    NROI = NROI + 1;
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAINVEN, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAINVEN, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                END
            END  $$IBE$$*/ /* MONTO <> 0 */ /*$$IBE$$ 
        END  $$IBE$$*/ /* INVEN = K */
    /* recorra las cuentas adicionales */ /*$$IBE$$ 
    FOR SELECT INVC_CUENTA, INVC_BASE, INVC_PORC, INVC_VALOR, INVC_DB
        FROM INTERFAZ_VENTAS_CTAS
        WHERE INVE_ID = :IDINTER
        INTO :CTADIC, :BASEADIC, :PORCADIC, :VALORADIC, :DBADIC
        DO
        BEGIN
        if (VALORADIC <> 0) then
            MONTO = VALORADIC;
        ELSE
            BEGIN
            if (:BASEADIC = 'SUBTOTAL') then
                VALORADIC = vrsubt;
            if (:BASEADIC = 'DESCUENTO') then
                VALORADIC = VRDTO;
            if (:BASEADIC = 'IVA') then
                VALORADIC = VRIVA;
            if (:BASEADIC = 'ADICIONAL') then
                VALORADIC = VRADIC;
            if (:BASEADIC = 'EXTRA') then
                VALORADIC = VREXTRA;
            if (:BASEADIC = 'TOTAL') then
                VALORADIC = VRTOTAL;
            MONTO = VALORADIC * PORCADIC / 100;
            END
        if (MONTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTADIC, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                if (DBADIC = 'S') then
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                ELSE
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                if (DBADIC = 'S') then
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                ELSE
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                END
            NROI = NROI + 1;
            END
        END
    if (ERROR > 0) then
        VER = 'S';
    SUSPEND;
    END  $$IBE$$*/ /* NO ANULADO */ /*$$IBE$$ 
  END  $$IBE$$*/ /* EXISTE LA INTERFAZ */ /*$$IBE$$ 
ELSE
    BEGIN
    EXECUTE PROCEDURE ERROR (31, :IDDOC, :PREF, 1);
    ERROR = ERROR + 1;
    VER = 'S';
    SUSPEND;
    END
 $$IBE$$*/ SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE CONTABIL_FACTURA_IVA(
    IDDOC INTEGER,
    IDINTER INTEGER)
RETURNS (
    ERROR INTEGER,
    VER CHAR(1),
    IDC INTEGER)
AS
declare variable pref varchar(4);
declare variable num varchar(6);
declare variable numero varchar(10);
declare variable fecaux date;
declare variable fecha char(8);
declare variable conc varchar(60);
declare variable venceaux date;
declare variable vence char(8);
declare variable vrdto numeric(18,2);
declare variable vradic numeric(18,2);
declare variable vrsubt numeric(18,2);
declare variable vriva numeric(18,2);
declare variable prtfte numeric(9,2);
declare variable vrrtfte numeric(18,2);
declare variable vrrtiva numeric(18,2);
declare variable prtica numeric(9,2);
declare variable vrrtica numeric(18,2);
declare variable vrtotal numeric(18,2);
declare variable vrextra numeric(18,2);
declare variable tipocomp varchar(3);
declare variable prefcont varchar(4);
declare variable ventas char(1);
declare variable ctaventas varchar(20);
declare variable iva char(1);
declare variable ctaiva varchar(20);
declare variable consumo char(1);
declare variable ctaconsumo varchar(20);
declare variable cartera char(1);
declare variable ctacartera varchar(20);
declare variable rtfte char(1);
declare variable ctartfte varchar(20);
declare variable rtiva char(1);
declare variable ctartiva varchar(20);
declare variable rtica char(1);
declare variable ctartica varchar(20);
declare variable inven char(1);
declare variable ctainven varchar(20);
declare variable costos char(1);
declare variable ctacostos varchar(20);
declare variable ctadto varchar(20);
declare variable ctaadic varchar(20);
declare variable ctaextra varchar(20);
declare variable existe char(1);
declare variable cuenta varchar(20);
declare variable monto numeric(18,2);
declare variable tipocuen char(1);
declare variable nit varchar(20);
declare variable nombre varchar(60);
declare variable proy varchar(4);
declare variable centro varchar(4);
declare variable porc numeric(5,2);
declare variable debito numeric(18,2);
declare variable credito numeric(18,2);
declare variable nroi integer;
declare variable art varchar(15);
declare variable imptos numeric(18,2);
declare variable suma numeric(18,2);
declare variable porciva numeric(9,2);
declare variable tctaclien varchar(20);
declare variable tctaventa varchar(20);
declare variable tctartfte varchar(20);
declare variable tctartiva varchar(20);
declare variable tctartica varchar(20);
declare variable ctadic varchar(20);
declare variable baseadic varchar(20);
declare variable porcadic numeric(5,2);
declare variable valoradic numeric(18,2);
declare variable dbadic char(1);
declare variable ptovta integer;
declare variable anulado char(1);
declare variable dig integer;
declare variable mercancia numeric(18,2);
declare variable fomento varchar(2);
declare variable DTOXIT varchar(2);
declare variable vrconsumo numeric(18,2);
declare variable factor double precision;
declare variable cent char(1);
declare variable AUTORET VARCHAR(10);
declare variable FAUTORET DATE;
declare variable ERRORC INTEGER;
BEGIN /*$$IBE$$ 
EXECUTE PROCEDURE LEE_CONFIGURACION('COMPRAS', 'FACTURAS', 'USAR IMPOCONSUMO COMO PORCENTAJE DE FOMENTO') returning_values (FOMENTO);
EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'FECHA AUTORETENEDOR NO DESCONTAR RETENCIONES DEL SALDO PERO SI CONTABILIZARLAS') returning_values (AUTORET);
if (AUTORET <> '') then
    FAUTORET = CAST(AUTORET AS DATE);
else
    FAUTORET = '9999/12/31';
 $$IBE$$*/ /* BUSQUE LA INTERFACE */ /*$$IBE$$ 
EXISTE = 'N';
SELECT 'S', TICO_COD, PRCO_PRE, INVE_VENTAS, INVE_IVA, INVE_CONSUMO, INVE_CARTERA, INVE_RTFTE, INVE_RTIVA, INVE_RTICA, INVE_COSTO, INVE_INVEN, INVE_CTAVENTAS, INVE_CTAIVA, INVE_CTACONSUMO, INVE_CTADTO, INVE_CTAADIC, INVE_CTAEXTRA, INVE_CTACARTERA, INVE_CTARTFTE, INVE_CTARTIVA, INVE_CTARTICA, INVE_CTAINVEN, INVE_CTACOSTOS, INVE_CONFIRMAR, INVE_CENTRO
    FROM INTERFAZ_VENTAS
    WHERE INVE_ID = :IDINTER
    INTO :EXISTE, :TIPOCOMP, :PREFCONT, :VENTAS, :IVA, :CONSUMO, :CARTERA, :RTFTE, :RTIVA, :RTICA, :COSTOS, :INVEN, :CTAVENTAS, :CTAIVA, :CTACONSUMO, :CTADTO, :CTAADIC, :CTAEXTRA, :CTACARTERA, :CTARTFTE, :CTARTIVA, :CTARTICA, :CTAINVEN, :CTACOSTOS, :VER, :CENT;
if (EXISTE = 'S') then
  BEGIN
     $$IBE$$*/ /* BORRE CUALQUEIR CONTABILIZACION PREVIA */ /*$$IBE$$ 
    DELETE FROM CONTABILIZACION WHERE CNTB_TIPOREF = 31 AND CNTB_IDREF = :IDDOC;

   $$IBE$$*/ /* TRAIGA EL ENCABEZADO DE LA FACTURA */ /*$$IBE$$ 
  SELECT PREF_PRE, FACT_NUMERO, FACT_FECHA, F.TERC_NIT, PTVT_ID, FACT_VENCE, FACT_DTOMONTO, FACT_ADICIONAL, FACT_IVAMONTO, FACT_EXTRA, FACT_TOTAL, FACT_RTFTEPOR, FACT_RTFTEMONTO, FACT_RTIVAPOR, FACT_RTIVAMONTO, FACT_RTICAPOR, FACT_RTICAMONTO, FACT_NOMCLIENTE, TERC_CTARTFTE, TERC_CTARTIVA, TERC_CTARTICA, TERC_CTAVENTA, TERC_CTACLIENTE, FACT_ANULADO
        FROM FACTURAS F, TERCEROS T
        WHERE FACT_ID = :IDDOC AND F.TERC_NIT = T.TERC_NIT
        INTO :PREF, :NUM, :FECAUX, :NIT, :PTOVTA, :VENCEAUX, :VRDTO, :VRADIC, :VRIVA, :VREXTRA, :VRTOTAL, :PRTFTE, :VRRTFTE, :PORC, :VRRTIVA, :PRTICA, :VRRTICA, :NOMBRE, TCTARTFTE, TCTARTIVA, TCTARTICA, TCTAVENTA, TCTACLIEN, ANULADO;
  if (ANULADO = 'N') then
    BEGIN
     $$IBE$$*/ /* BUSQUE EL CENTRO DEL PUNTO, LA BODEGA, O EL PREFIJO  */ /*$$IBE$$ 
    IF (CENT = 'B') THEN
        SELECT B.BODE_CENTRO, B.BODE_PROY FROM BODEGA B, FACTURAS F
            WHERE B.BODE_COD = F.BODE_COD AND F.FACT_ID = :IDDOC INTO :CENTRO, :PROY;
    IF (CENT = 'V') THEN
        SELECT V.CENT_COD, V.PROY_COD FROM VENDEDORES V, FACTURAS F
            WHERE V.VEND_COD = F.VEND_COD AND F.FACT_ID = :IDDOC INTO :CENTRO, :PROY;
    IF (CENT = 'P') THEN
        SELECT P.PREF_CENTRO,P.PREF_PROY  FROM PREFIJOS P, FACTURAS F
            WHERE P.PREF_PRE = F.PREF_PRE AND F.FACT_ID = :IDDOC AND P.TIDO_COD = 31 INTO :CENTRO, :PROY;
    NUMERO = PREF || NUM;
    SELECT SUM (FADE_CONSUMO) FROM FACTURAS_DETALLE WHERE FACT_ID = :IDDOC  AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
        INTO MERCANCIA;
    VRSUBT = VRTOTAL - VREXTRA - VRIVA - MERCANCIA;  $$IBE$$*/ /* BASE DE RETEFTE Y RETEICA */ /*$$IBE$$ 

    EXECUTE PROCEDURE lee_configuracion ('FACTURACION', 'FACTURAS', 'DESCUENTO PIE FACTURA IGUAL A SUMA DE DESCUENTOS POR ITEM') returning_values (:DTOXIT);
    if (DTOXIT = 'SI') then
        VRDTO = 0;
    MERCANCIA = VRSUBT - VRADIC + VRDTO;
    EXECUTE PROCEDURE FECHA_A_CONTA(:FECAUX) returning_values (:FECHA);
    EXECUTE PROCEDURE FECHA_A_CONTA(:VENCEAUX) returning_values (:VENCE);
     $$IBE$$*/ /* REGISTRE EL ENCABEZADO CONTABLE */ /*$$IBE$$ 
    IDC = GEN_ID(ID_CONTABILIZA, 1);
    if (STRLEN(NOMBRE)> 43 ) then
      CONC = 'FV No.' || NUMERO || '-' || SUBSTR(NOMBRE,1,43);
    ELSE
      CONC = 'FV No.' || NUMERO || '-' || NOMBRE;
    INSERT INTO CONTABILIZACION (CNTB_ID, CNTB_TIPOCOMP, CNTB_PREFCNT, CNTB_NUMERO, CNTB_FECHA, CNTB_CONCEPTO, CNTB_REF, CNTB_TIPOREF, CNTB_IDREF, CNTB_PREFREF, CNTB_NUMREF, CNTB_PROCESADO)
        VALUES (:IDC, :TIPOCOMP, :PREFCONT, :NUM, :FECHA, :CONC, '', 31, :IDDOC, :PREF, :NUM, 'N');
    NROI = 0;
    SUMA = 0;
    ERROR = 0;
     $$IBE$$*/ /* SI NO HAY CUENTA DE DESCUENTO NI ADICIONAL CALCULE UN FACTOR PARA LAS VENTAS Y EL IVA */ /*$$IBE$$ 
    if (MERCANCIA <> 0) then
        FACTOR = CAST(VRSUBT AS DOUBLE PRECISION) / CAST(MERCANCIA AS DOUBLE PRECISION);
    ELSE
        FACTOR = 1;
     $$IBE$$*/ /* TRAIGA EL NUMERO DE DIGITOS PARA EL REDONDEO */ /*$$IBE$$ 
    SELECT CAST(CONF_VALOR AS INTEGER) FROM CONFIGURACION WHERE CONF_MODULO = 'FACTURACION' AND
        CONF_CATEGORIA = 'GENERAL' AND CONF_PROPIEDAD = 'REDONDEO AL MULTIPLO DE DIEZ EN TOTALES' INTO :DIG;
     $$IBE$$*/ /* CUENTAS DE VENTAS */ /*$$IBE$$ 
    if (VENTAS = 'A') then
        BEGIN
        FOR SELECT MAX(TAIV_CTAVTA), SUM(FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), SUM(FADE_IVAMONTO), SUM(FADE_CONSUMO)
            FROM TARIFA_IVA T, FACTURAS_DETALLE F
            WHERE F.FACT_ID = :IDDOC AND F.fade_ivaporc = T.taiv_porc AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
            GROUP BY TAIV_CTAVTA
            INTO :CTAVENTAS, :MONTO, :IMPTOS, :VRCONSUMO
            DO
            BEGIN
            if (FOMENTO = 'SI') then
                MONTO = MONTO + VRCONSUMO;
            if ((CTADTO IS NULL) OR (CTADTO = '')) then
                MONTO = MONTO * FACTOR;
            execute procedure redondee(MONTO, DIG) returning_values (MONTO);
            if (MONTO <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTAVENTAS, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                     $$IBE$$*/ /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */ /*$$IBE$$ 
                    FOR SELECT F.ARTI_COD, (FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), FADE_CONSUMO
                        FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_DETALLE F
                        WHERE F.FACT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTAINV = :CUENTA AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
                        INTO :ART, :MONTO, :IMPTOS
                    DO
                        BEGIN
                        if (FOMENTO = 'SI') then
                            MONTO = MONTO + IMPTOS;
                        if ((CTADTO IS NULL) OR (CTADTO = '')) then
                            MONTO = MONTO * FACTOR;
                        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                        if (MONTO <> 0) then
                            BEGIN
                            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                            NROI = NROI + 1;
                            SUMA = SUMA - MONTO;
                            END
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    NROI = NROI + 1;
                    SUMA = SUMA - MONTO;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA - MONTO;
                    END
                END  $$IBE$$*/ /* MONTO <> 0 */ /*$$IBE$$ 
            END  $$IBE$$*/ /* FOR */ /*$$IBE$$ 
        END  $$IBE$$*/ /* VENTAS X ARTICULO */ /*$$IBE$$ 
     IF ((VENTAS = 'C') OR (VENTAS = 'K')) THEN
        BEGIN
        IF (VENTAS = 'C') THEN
            CTAVENTAS = TCTAVENTA;
        SELECT SUM(FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), SUM(FADE_IVAMONTO), SUM (FADE_CONSUMO)
            FROM FACTURAS_DETALLE F
            WHERE F.FACT_ID = :IDDOC AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
            INTO :MONTO, :IMPTOS, :VRCONSUMO;
        if (FOMENTO = 'SI') then
            MONTO = MONTO + VRCONSUMO;
        if ((CTADTO IS NULL) OR (CTADTO = '')) then
            MONTO = MONTO * FACTOR;
        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
        if (MONTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTAVENTAS, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'I') then
                BEGIN
                 $$IBE$$*/ /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */ /*$$IBE$$ 
                FOR SELECT F.ARTI_COD, (FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), FADE_CONSUMO
                    FROM ARTICULO A, FACTURAS_DETALLE F
                    WHERE F.FACT_ID = :IDDOC AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
                    INTO :ART, :MONTO, :IMPTOS
                    DO
                    BEGIN
                    if (FOMENTO = 'SI') then
                        MONTO = MONTO + VRCONSUMO;
                    if ((CTADTO IS NULL) OR (CTADTO = '')) then
                        MONTO = MONTO * FACTOR;
                    execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                    if (MONTO <> 0) then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        SUMA = SUMA - MONTO;
                        END
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - MONTO;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - MONTO;
                END
            END  $$IBE$$*/ /* MONTO <> 0 */ /*$$IBE$$ 
        END  $$IBE$$*/ /* VENTAS DE CLIENTE O CONSTANTE */
    /* EL IVA EN VENTAS */ /*$$IBE$$ 
    if (IVA = 'A') then
        BEGIN
        FOR SELECT MAX(TAIV_CTAIVAVNT), SUM(FADE_IVAMONTO), SUM(FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), sum(FADE_CONSUMO)
            FROM TARIFA_IVA T, FACTURAS_DETALLE F
            WHERE F.FACT_ID = :IDDOC AND F.fade_ivaporc = T.taiv_porc AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
            GROUP BY TAIV_CTAIVAVNT
            INTO :CTAIVA, :IMPTOS, :MONTO, :VALORADIC
        DO
            BEGIN
            if (FOMENTO = 'SI') then
                MONTO = MONTO + VALORADIC;
            MONTO = MONTO * -1;
            MONTO = MONTO * FACTOR;
            IMPTOS = IMPTOS * FACTOR;
            execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
            execute procedure redondee(MONTO, DIG) returning_values (MONTO);
            if (IMPTOS <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTAIVA, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                     $$IBE$$*/ /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */ /*$$IBE$$ 
                    FOR SELECT F.ARTI_COD, FADE_IVAMONTO, (FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), TAIV_PORC, FADE_CONSUMO
                        FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_DETALLE F, TARIFA_IVA T
                        WHERE F.FACT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTAIVAV = :CUENTA AND A.TAIV_COD = T.TAIV_COD AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
                        INTO :ART, :IMPTOS, :MONTO, :PORCIVA, :VALORADIC
                    DO
                        BEGIN
                        if (FOMENTO = 'SI') then
                            MONTO = MONTO + VALORADIC;
                        MONTO = MONTO * -1;
                        MONTO = MONTO * FACTOR;
                        IMPTOS = IMPTOS * FACTOR;
                        execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                        if (IMPTOS <> 0) then
                            BEGIN
                            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, :MONTO, :PORCIVA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                            NROI = NROI + 1;
                            SUMA = SUMA + DEBITO - CREDITO;
                            END
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, :MONTO, ABS(:IMPTOS*100/:MONTO), :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    NROI = NROI + 1;
                    SUMA = SUMA - IMPTOS;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, :MONTO, ABS(:IMPTOS*100/:MONTO), :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA - IMPTOS;
                    END
                END    $$IBE$$*/ /* IMPTOS <> 0 */ /*$$IBE$$ 
            END  $$IBE$$*/ /* FOR */ /*$$IBE$$ 
        END  $$IBE$$*/ /* IVA X ARTICULO */ /*$$IBE$$ 
    if (IVA = 'K') then  $$IBE$$*/ /* IVA EN CTA CONSTANTE */ /*$$IBE$$ 
        BEGIN
        SELECT SUM(FADE_IVAMONTO), SUM(FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), SUM(FADE_CONSUMO)
            FROM FACTURAS_DETALLE F
            WHERE F.FACT_ID = :IDDOC and FADE_IVAMONTO <> 0 AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
            INTO :IMPTOS, :MONTO, :valoradic;
        if (FOMENTO = 'SI') then
            MONTO = MONTO + VALORADIC;
        MONTO = MONTO * -1;
        MONTO = MONTO * FACTOR;
        IMPTOS = IMPTOS * FACTOR;
        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
        execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
        if (IMPTOS <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTAIVA, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'I') then
                BEGIN
                 $$IBE$$*/ /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */ /*$$IBE$$ 
                FOR SELECT F.ARTI_COD, (FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), FADE_IVAMONTO, TAIV_PORC, FADE_CONSUMO
                    FROM ARTICULO A, FACTURAS_DETALLE F, TARIFA_IVA T
                    WHERE F.FACT_ID = :IDDOC AND A.TAIV_COD = T.TAIV_COD AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
                    INTO :ART, :MONTO, :IMPTOS, :PORCIVA, :VALORADIC
                    DO
                    BEGIN
                    if (FOMENTO = 'SI') then
                        MONTO = MONTO + VALORADIC;
                    MONTO = MONTO * -1;
                    MONTO = MONTO * FACTOR;
                    IMPTOS = IMPTOS * FACTOR;
                    execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                    execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                    if (IMPTOS <> 0) then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', 0, :IMPTOS, :MONTO, :PORCIVA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        SUMA = SUMA - IMPTOS;
                        END
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', 0, :IMPTOS, :MONTO, ABS(:IMPTOS*100/:MONTO), :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - IMPTOS;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', 0, :IMPTOS, :MONTO, ABS(:IMPTOS*100/:MONTO), :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - IMPTOS;
                END
            END  $$IBE$$*/ /* IMPTOS <> 0 */ /*$$IBE$$ 
        END  $$IBE$$*/ /* IVA EN CTA CONSTANTE */
    /* EL IMPOCONSUMO */ /*$$IBE$$ 
    if ((CONSUMO = 'A') AND (FOMENTO <> 'SI')) then
        BEGIN
        FOR SELECT MAX(COAR_CTACONS), SUM(FADE_CONSUMO)
            FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_DETALLE F
            WHERE F.FACT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
            GROUP BY COAR_CTACONS
            INTO :CTACONSUMO, :IMPTOS
        DO
            BEGIN
            execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
            if (IMPTOS <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTACONSUMO, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                     $$IBE$$*/ /* ES UNA CUENTA DE INVENTARIO, REGISTRE UNO A UNO LOS ARTICULOS */ /*$$IBE$$ 
                    FOR SELECT F.ARTI_COD, FADE_CONSUMO
                        FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_DETALLE F
                        WHERE F.FACT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTACONS = :CUENTA AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
                        INTO :ART, :IMPTOS
                    DO
                        BEGIN
                        execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                        if (IMPTOS <> 0) then
                            BEGIN
                            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                            NROI = NROI + 1;
                            SUMA = SUMA - IMPTOS;
                            END
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    NROI = NROI + 1;
                    SUMA = SUMA - IMPTOS;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA - IMPTOS;
                    END
                END  $$IBE$$*/ /* IMPTOS <> 0 */ /*$$IBE$$ 
            END  $$IBE$$*/ /* FOR */ /*$$IBE$$ 
        END  $$IBE$$*/ /* CONSUMO X ARTICULO */ /*$$IBE$$ 
    if ((CONSUMO = 'K') AND (FOMENTO <> 'SI')) then  $$IBE$$*/ /* CONSUMO EN CTA CONSTANTE */ /*$$IBE$$ 
        BEGIN
        SELECT SUM(FADE_CONSUMO)
            FROM FACTURAS_DETALLE F
            WHERE F.FACT_ID = :IDDOC AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
            INTO :IMPTOS;
        execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
        if (IMPTOS <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTACONSUMO, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'I') then
                BEGIN
                 $$IBE$$*/ /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */ /*$$IBE$$ 
                FOR SELECT F.ARTI_COD, FADE_CONSUMO
                    FROM ARTICULO A, FACTURAS_DETALLE F
                    WHERE F.FACT_ID = :IDDOC AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
                    INTO :ART, :IMPTOS
                    DO
                    BEGIN
                    execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                    if (IMPTOS <> 0) then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CTACONSUMO, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        SUMA = SUMA - IMPTOS;
                        END
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTACONSUMO, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - IMPTOS;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTACONSUMO, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - IMPTOS;
                END
            END  $$IBE$$*/ /* IMPTOS <> 0 */ /*$$IBE$$ 
        END  $$IBE$$*/ /* CONSUMO EN CTA CONSTANTE */
    /* DESCUENTO */ /*$$IBE$$ 
    if ((CTADTO IS NOT NULL) AND (CTADTO <> '')) then
        BEGIN
        execute procedure redondee(VRDTO, DIG) returning_values (VRDTO);
        if (VRDTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTADTO, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRDTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA + VRDTO;
                END
            if (TIPOCUEN = 'N') then
                    BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRDTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA + VRDTO;
                END
            END
        END  $$IBE$$*/ /* DESCUENTO */
    /* VALOR ADIC */ /*$$IBE$$ 
    if ((CTAADIC IS NOT NULL) AND (CTAADIC <> '')) then
        BEGIN
        execute procedure redondee(VRADIC, DIG) returning_values (VRADIC);
        if (VRADIC <> 0) THEN
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTAADIC, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRADIC, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - VRADIC;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRADIC, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - VRADIC;
                END
            END
        END  $$IBE$$*/ /* VR. ADIC */
    /* VALOR EXTRA */ /*$$IBE$$ 
    if ((CTAEXTRA IS NOT NULL) AND (CTAEXTRA <> '')) THEN
        BEGIN
        execute procedure redondee(VREXTRA, DIG) returning_values (VREXTRA);
        if (VREXTRA <> 0) THEN
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTAEXTRA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VREXTRA, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - VREXTRA;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VREXTRA, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - VREXTRA;
                END
            END
        END  $$IBE$$*/ /* VR. EXTRA */
    /* DESCUENTE EL IMPOCONSUMO */ /*$$IBE$$ 
    SELECT SUM(FADE_CONSUMO)
        FROM FACTURAS_DETALLE F WHERE F.FACT_ID = :IDDOC AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL)) INTO :IMPTOS;
    vrsubt = vrsubt - IMPTOS;
     $$IBE$$*/ /* RETENCION FUENTE */ /*$$IBE$$ 
    if ((RTFTE = 'C') or (RTFTE = 'K')) then
      BEGIN
      execute procedure redondee(VRRTFTE, DIG) returning_values (VRRTFTE);
      if (VRRTFTE <> 0) then
        BEGIN
        if (RTFTE = 'C') then
            CTARTFTE = TCTARTFTE;
        EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTARTFTE, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :VRSUBT, :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTFTE;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :VRSUBT, :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTFTE;
            END
         $$IBE$$*/ /* AUTORETENCION */ /*$$IBE$$ 
        if (FAUTORET <= fecaux) then
            BEGIN
            EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'CUENTA DE AUTORETENCION EN LA FUENTE') returning_values (CTARTFTE);
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTARTFTE INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERROR (31, :IDDOC, :CTARTFTE, 2);
                CUENTA = CTARTFTE;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                begin
                EXECUTE PROCEDURE ERROR (31, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, (:VRSUBT*-1), :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - VRRTFTE;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, (:VRSUBT*-1), :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - VRRTFTE;
                END
            END
        END  $$IBE$$*/ /* RTFTE */ /*$$IBE$$ 
      END
    if (RTFTE = 'A') then
      BEGIN
      FOR SELECT MAX(COAR_CTARTFTEV), MAX(COAR_RTFTE), MIN(COAR_RTBASE), SUM(FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), SUM((FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO)*COAR_RTFTE)
        FROM CONTABIL_ARTICULO C, FACTURAS_DETALLE F
        WHERE F.FACT_ID = :IDDOC AND F.ARTI_COD = C.ARTI_COD AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
        GROUP BY COAR_CTARTFTEV
        INTO :CTARTFTE, :PRTFTE, :baseadic, :MONTO, :VRRTFTE
        DO
        BEGIN
        MONTO = MONTO * FACTOR;
        if (MONTO >= BASEADIC) then
            BEGIN
            VRRTFTE = VRRTFTE * FACTOR / 100;
            execute procedure redondee(VRRTFTE, DIG) returning_values (VRRTFTE);
            execute procedure redondee(MONTO, DIG) returning_values (MONTO);
            if (VRRTFTE <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTARTFTE, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :MONTO, :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    NROI = NROI + 1;
                    SUMA = SUMA + VRRTFTE;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :MONTO, :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA + VRRTFTE;
                    END
                 $$IBE$$*/ /* AUTORETENCION */ /*$$IBE$$ 
                if (FAUTORET <= fecaux) then
                    BEGIN
                    EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'CUENTA DE AUTORETENCION EN LA FUENTE') returning_values (CTARTFTE);
                    EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTARTFTE, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
                    if (ERRORC <> 0) then
                        ERROR = ERROR + 1;
                    if (TIPOCUEN = 'C') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, (:MONTO*-1), :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                        NROI = NROI + 1;
                        SUMA = SUMA - VRRTFTE;
                        END
                    if (TIPOCUEN = 'N') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, (:MONTO*-1), :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NROI = NROI + 1;
                        SUMA = SUMA - VRRTFTE;
                        END
                    END
                END
            END
        END  $$IBE$$*/ /* RTFTE */ /*$$IBE$$ 
      END
     $$IBE$$*/ /* RETENCION IVA */ /*$$IBE$$ 
    if ((RTIVA = 'C') or (RTIVA = 'K')) then
      BEGIN
      execute procedure redondee(VRRTIVA, DIG) returning_values (VRRTIVA);
      if (VRRTIVA <> 0) then
        BEGIN
        if (RTIVA = 'C') then
            CTARTIVA = TCTARTIVA;
        EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTARTIVA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTIVA, 0, :VRIVA, :PORC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTIVA;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTIVA, 0, :VRIVA, :PORC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTIVA;
            END
        END  $$IBE$$*/ /* RTIVA */ /*$$IBE$$ 
      END
     $$IBE$$*/ /* RETENCION DE ICA */ /*$$IBE$$ 
    if ((RTICA = 'C') or (RTICA = 'K')) then
      BEGIN
      execute procedure redondee(VRRTICA, DIG) returning_values (VRRTICA);
      if (VRRTICA <> 0) then
        BEGIN
        if (RTICA = 'C') then
            CTARTICA = TCTARTICA;
        EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTARTICA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTICA, 0, :VRSUBT, :PRTICA, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTICA;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTICA, 0, :VRSUBT, :PRTICA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTICA;
            END
        END  $$IBE$$*/ /* RTICA */ /*$$IBE$$ 
      END
     $$IBE$$*/ /* CIERRE EL COMPROBANTE CONTRA LA CUENTA DEL TERCERO O LA CONSTANTE */ /*$$IBE$$ 
    if ((SUMA <> 0) and ((CARTERA = 'C') or (CARTERA = 'K') or (CARTERA = 'J'))) then
        BEGIN
        if (SUMA < 0) then
            BEGIN
            DEBITO = SUMA * -1;
            CREDITO = 0;
            END
        ELSE
            BEGIN
            DEBITO = 0;
            CREDITO = SUMA;
            END
        if (CARTERA = 'C') then
            CTACARTERA = TCTACLIEN;
        if (CARTERA = 'J') then
            BEGIN
             $$IBE$$*/ /* BUSQUE LA CUENTA DE LA CAJA */ /*$$IBE$$ 
            SELECT CAJA_CUENTA FROM CAJAS C, PUNTO_VENTA P
                WHERE P.CAJA_ID = C.CAJA_ID AND PTVT_ID = :PTOVTA
                INTO :CTACARTERA;
            END
        EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTACARTERA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :DEBITO, :CREDITO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
        if (TIPOCUEN = 'N') then
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :DEBITO, :CREDITO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
        NROI = NROI + 1;
        END  $$IBE$$*/ /* SUMA EN CARTERA */
    /* CALCULE COSTOS EN VENTAS */ /*$$IBE$$ 
    EXECUTE PROCEDURE COSTO_EN_VENTAS(31, :IDDOC);
    if (COSTOS = 'A') then
        BEGIN
        FOR SELECT MAX(CTACOS), SUM(CAST(CANT AS DOUBLE PRECISION) * COSTO)
            FROM COSTO_VENTAS
            GROUP BY CTACOS
            INTO :CTACOSTOS, :MONTO
        DO
            BEGIN
            if (MONTO <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTACOSTOS, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                     $$IBE$$*/ /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */ /*$$IBE$$ 
                    FOR SELECT ARTI_COD, CANT * COSTO
                        FROM COSTO_VENTAS
                        WHERE CTACOS = :CUENTA
                        INTO :ART, :MONTO
                    DO
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    NROI = NROI + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    END
                END  $$IBE$$*/ /* MONTO <> 0 */ /*$$IBE$$ 
            END  $$IBE$$*/ /* FOR */ /*$$IBE$$ 
        END  $$IBE$$*/ /* COSTOS */ /*$$IBE$$ 
    if (COSTOS = 'K') then
        BEGIN
        SELECT SUM(CAST(CANT AS DOUBLE PRECISION) * COSTO)
            FROM COSTO_VENTAS
            INTO :MONTO;
        if (MONTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTACOSTOS, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'I') then
                BEGIN
                 $$IBE$$*/ /* ES UNA CUENTA DE INVENTARIO, REGISTRE UNO A UNO LOS ARTICULOS */ /*$$IBE$$ 
                FOR SELECT ARTI_COD, CANT * COSTO
                    FROM COSTO_VENTAS
                    INTO :ART, :MONTO
                DO
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTACOSTOS, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                    NROI = NROI + 1;
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTACOSTOS, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTACOSTOS, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                END
            END  $$IBE$$*/ /* MONTO <> 0 */ /*$$IBE$$ 
        END  $$IBE$$*/ /* COSTOS = K */ /*$$IBE$$ 
    if (INVEN = 'A') then
        BEGIN
        FOR SELECT MAX(CTAINV), SUM(CAST(CANT AS DOUBLE PRECISION) * COSTO)
            FROM COSTO_VENTAS
            GROUP BY CTAINV
            INTO :CTAINVEN, :MONTO
        DO
            BEGIN
            if (MONTO <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTAINVEN, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                     $$IBE$$*/ /* ES UNA CUENTA DE INVENTARIO, REGISTRE UNO A UNO LOS ARTICULOS */ /*$$IBE$$ 
                    FOR SELECT ARTI_COD, CANT * COSTO
                        FROM COSTO_VENTAS
                        WHERE CTAINV = :CUENTA
                        INTO :ART, :MONTO
                    DO
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    NROI = NROI + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    END
                END  $$IBE$$*/ /* MONTO <> 0 */ /*$$IBE$$ 
            END  $$IBE$$*/ /* FOR */ /*$$IBE$$ 
        END  $$IBE$$*/ /* INVEN = A */ /*$$IBE$$ 
    if (INVEN = 'K') then
        BEGIN
        SELECT SUM(CAST(CANT AS DOUBLE PRECISION) * COSTO)
            FROM COSTO_VENTAS
            INTO :MONTO;
        if (MONTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTAINVEN, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'I') then
                BEGIN
                 $$IBE$$*/ /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */ /*$$IBE$$ 
                FOR SELECT ARTI_COD, CANT * COSTO
                    FROM COSTO_VENTAS
                    INTO :ART, :MONTO
                DO
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTAINVEN, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                    NROI = NROI + 1;
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAINVEN, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAINVEN, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                END
            END  $$IBE$$*/ /* MONTO <> 0 */ /*$$IBE$$ 
        END  $$IBE$$*/ /* INVEN = K */
    /* recorra las cuentas adicionales */ /*$$IBE$$ 
    FOR SELECT INVC_CUENTA, INVC_BASE, INVC_PORC, INVC_VALOR, INVC_DB
        FROM INTERFAZ_VENTAS_CTAS
        WHERE INVE_ID = :IDINTER
        INTO :CTADIC, :BASEADIC, :PORCADIC, :VALORADIC, :DBADIC
        DO
        BEGIN
        if (VALORADIC <> 0) then
            MONTO = VALORADIC;
        ELSE
            BEGIN
            if (:BASEADIC = 'SUBTOTAL') then
                VALORADIC = vrsubt;
            if (:BASEADIC = 'DESCUENTO') then
                VALORADIC = VRDTO;
            if (:BASEADIC = 'IVA') then
                VALORADIC = VRIVA;
            if (:BASEADIC = 'ADICIONAL') then
                VALORADIC = VRADIC;
            if (:BASEADIC = 'EXTRA') then
                VALORADIC = VREXTRA;
            if (:BASEADIC = 'TOTAL') then
                VALORADIC = VRTOTAL;
            MONTO = VALORADIC * PORCADIC / 100;
            END
        if (MONTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTADIC, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                if (DBADIC = 'S') then
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                ELSE
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                if (DBADIC = 'S') then
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                ELSE
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                END
            NROI = NROI + 1;
            END
        END
    if (ERROR > 0) then
        VER = 'S';
    SUSPEND;
    END  $$IBE$$*/ /* NO ANULADO */ /*$$IBE$$ 
  END  $$IBE$$*/ /* EXISTE LA INTERFAZ */ /*$$IBE$$ 
ELSE
    BEGIN
    EXECUTE PROCEDURE ERROR (31, :IDDOC, :PREF, 1);
    ERROR = ERROR + 1;
    VER = 'S';
    SUSPEND;
    END
 $$IBE$$*/ SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

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

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE CONTABIL_FACTURAS_CONTADO(
    FECFAC DATE,
    NIT VARCHAR(20),
    PREF VARCHAR(4),
    PTVTA INTEGER,
    IDINTER INTEGER)
RETURNS (
    ERROR INTEGER,
    VER CHAR(1),
    IDC INTEGER)
AS
declare variable num varchar(8);
declare variable numero varchar(10);
declare variable fecha char(8);
declare variable conc char(120);
declare variable vence char(8);
declare variable vrdto numeric(18,2);
declare variable vradic numeric(18,2);
declare variable vrsubt numeric(18,2);
declare variable vriva numeric(18,2);
declare variable prtfte numeric(9,2);
declare variable vrrtfte numeric(18,2);
declare variable vrrtiva numeric(18,2);
declare variable prtica numeric(9,2);
declare variable vrrtica numeric(18,2);
declare variable vrtotal numeric(18,2);
declare variable vrextra numeric(18,2);
declare variable tipocomp varchar(3);
declare variable prefcont varchar(4);
declare variable ventas char(1);
declare variable ctaventas varchar(20);
declare variable iva char(1);
declare variable ctaiva varchar(20);
declare variable consumo char(1);
declare variable ctaconsumo varchar(20);
declare variable cartera char(1);
declare variable ctacartera varchar(20);
declare variable rtfte char(1);
declare variable ctartfte varchar(20);
declare variable rtiva char(1);
declare variable ctartiva varchar(20);
declare variable rtica char(1);
declare variable ctartica varchar(20);
declare variable inven char(1);
declare variable ctainven varchar(20);
declare variable costos char(1);
declare variable ctacostos varchar(20);
declare variable ctadto varchar(20);
declare variable ctaadic varchar(20);
declare variable ctaextra varchar(20);
declare variable existe char(1);
declare variable cuenta varchar(20);
declare variable monto numeric(18,2);
declare variable tipocuen char(1);
declare variable nombre varchar(60);
declare variable proy varchar(4);
declare variable centro varchar(4);
declare variable porc numeric(5,2);
declare variable debito numeric(18,2);
declare variable credito numeric(18,2);
declare variable nroi integer;
declare variable art varchar(15);
declare variable impinc char(1);
declare variable imptos numeric(18,2);
declare variable suma numeric(18,2);
declare variable porciva numeric(9,2);
declare variable tctaclien varchar(20);
declare variable tctaventa varchar(20);
declare variable tctartfte varchar(20);
declare variable tctartiva varchar(20);
declare variable tctartica varchar(20);
declare variable ctadic varchar(20);
declare variable baseadic varchar(20);
declare variable porcadic numeric(5,2);
declare variable valoradic numeric(18,2);
declare variable dbadic char(1);
declare variable ptovta integer;
declare variable dig integer;
declare variable mercancia numeric(18,2);
declare variable factor double precision;
declare variable cent char(1);
BEGIN
/* BUSQUE LA INTERFACE */ /*$$IBE$$ 
EXISTE = 'N';
SELECT 'S', TICO_COD, PRCO_PRE, INVE_VENTAS, INVE_IVA, INVE_CONSUMO, INVE_CARTERA, INVE_RTFTE, INVE_RTIVA, INVE_RTICA, INVE_COSTO, INVE_INVEN, INVE_CTAVENTAS, INVE_CTAIVA, INVE_CTACONSUMO, INVE_CTADTO, INVE_CTAADIC, INVE_CTAEXTRA, INVE_CTACARTERA, INVE_CTARTFTE, INVE_CTARTIVA, INVE_CTARTICA, INVE_CTAINVEN, INVE_CTACOSTOS, INVE_CONFIRMAR, INVE_CENTRO
    FROM INTERFAZ_VENTAS
    WHERE INVE_ID = :IDINTER
    INTO :EXISTE, :TIPOCOMP, :PREFCONT, :VENTAS, :IVA, :CONSUMO, :CARTERA, :RTFTE, :RTIVA, :RTICA, :COSTOS, :INVEN, :CTAVENTAS, :CTAIVA, :CTACONSUMO, :CTADTO, :CTAADIC, :CTAEXTRA, :CTACARTERA, :CTARTFTE, :CTARTIVA, :CTARTICA, :CTAINVEN, :CTACOSTOS, :VER, :CENT;
if (EXISTE = 'S') then
  BEGIN
   $$IBE$$*/ /* BORRE CUALQUEIR CONTABILIZACION PREVIA */
/*  DELETE FROM CONTABILIZACION WHERE CNTB_TIPOREF = 31 AND CNTB_IDREF = 0;
  /* BUSQUE EL CENTRO DEL PUNTO, LA BODEGA, O EL PREFIJO  */ /*$$IBE$$ 
  IF (CENT = 'B') THEN
    SELECT B.BODE_CENTRO, B.BODE_PROY FROM BODEGA B, PUNTO_VENTA P
        WHERE B.BODE_COD = P.BODE_COD AND P.ptvt_id = :ptvta INTO :CENTRO, :PROY;
  IF (CENT = 'V') THEN
    SELECT MAX(V.CENT_COD), MAX(V.PROY_COD) FROM VENDEDORES V
        WHERE V.PTVT_ID = :PTVTA INTO :CENTRO, :PROY;
  IF (CENT = 'P') THEN
    SELECT P.PREF_PROY, P.PREF_CENTRO FROM PREFIJOS P
        WHERE P.PREF_PRE = :PREF AND P.TIDO_COD = 31 INTO :CENTRO, :PROY;
   $$IBE$$*/ /* TRAIGA LOS DATOS DEL CLIENTE */ /*$$IBE$$ 
  SELECT TERC_NOM, TERC_CTARTFTE, TERC_CTARTIVA, TERC_CTARTICA, TERC_CTAVENTA, TERC_CTACLIENTE
        FROM TERCEROS T WHERE TERC_NIT = :NIT
        INTO :NOMBRE, TCTARTFTE, TCTARTIVA, TCTARTICA, TCTAVENTA, TCTACLIEN;
  SELECT SUM(FACT_DTOMONTO), SUM(FACT_ADICIONAL), SUM(FACT_IVAMONTO), SUM(FACT_EXTRA), SUM(FACT_TOTAL), SUM(FACT_RTFTEMONTO), SUM(FACT_RTIVAMONTO), SUM(FACT_RTICAMONTO), MAX(FACT_IVAINC)
        FROM FACTURAS F WHERE FACT_FECHA = :FECFAC AND FACT_ANULADO = 'N' AND PTVT_ID = :ptvta AND PREF_PRE = :PREF
        INTO :VRDTO, :VRADIC, :VRIVA, :VREXTRA, :VRTOTAL, :VRRTFTE, :VRRTIVA, :VRRTICA, :impinc;
  VRSUBT = VRTOTAL - VREXTRA - VRIVA;  $$IBE$$*/ /* BASE DE RETEFTE Y RETEICA */ /*$$IBE$$ 
  MERCANCIA = VRSUBT - VRADIC + VRDTO;
  EXECUTE PROCEDURE FECHA_A_CONTA(:FECFAC) returning_values (:FECHA);
  VENCE = FECHA;
   $$IBE$$*/ /* REGISTRE EL ENCABEZADO CONTABLE */ /*$$IBE$$ 
  IDC = GEN_ID(ID_CONTABILIZA, 1);
  CONC = 'RESUMEN VENTAS ' || FECHA;
  NUM = SUBSTR(FECHA, 3, 8);
  INSERT INTO CONTABILIZACION (CNTB_ID, CNTB_TIPOCOMP, CNTB_PREFCNT, CNTB_NUMERO, CNTB_FECHA, CNTB_CONCEPTO, CNTB_REF, CNTB_TIPOREF, CNTB_IDREF, CNTB_PREFREF, CNTB_NUMREF, CNTB_PROCESADO)
        VALUES (:IDC, :TIPOCOMP, :PREFCONT, :NUM, :FECHA, :CONC, '', 0, 0, :PREF, :NUM, 'N');
  NROI = 0;
  SUMA = 0;
  ERROR = 0;
   $$IBE$$*/ /* SI NO HAY CUENTA DE DESCUENTO NI ADICIONAL CALCULE UN FACTOR PARA LAS VENTAS Y EL IVA */ /*$$IBE$$ 
  if (MERCANCIA <> 0) then
    FACTOR = CAST(VRSUBT AS DOUBLE PRECISION) / CAST(MERCANCIA AS DOUBLE PRECISION);
  ELSE
    FACTOR = 1;
   $$IBE$$*/ /* TRAIGA EL NUMERO DE DIGITOS PARA EL REDONDEO */ /*$$IBE$$ 
  SELECT CAST(CONF_VALOR AS INTEGER) FROM CONFIGURACION WHERE CONF_MODULO = 'FACTURACION' AND
        CONF_CATEGORIA = 'GENERAL' AND CONF_PROPIEDAD = 'REDONDEO AL MULTIPLO DE DIEZ EN TOTALES' INTO :DIG;
   $$IBE$$*/ /* CUENTAS DE VENTAS */ /*$$IBE$$ 
  if (VENTAS = 'A') then
        BEGIN
        FOR SELECT MAX(COAR_CTAVNT), SUM(CAST(FADE_CANT AS DOUBLE PRECISION) * (FADE_PRUNIT-FADE_DTOMONTO)), SUM(FADE_IVAMONTO+FADE_CONSUMO)
            FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_DETALLE FD, FACTURAS F
            WHERE F.FACT_ID = FD.FACT_ID AND FACT_FECHA = :FECFAC AND FD.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND F.PREF_PRE = :PREF AND F.PTVT_ID = :PTVTA AND FACT_ANULADO = 'N' AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
            GROUP BY COAR_CTAVNT
            INTO :CTAVENTAS, :MONTO, :IMPTOS
            DO
            BEGIN
            if (IMPINC = 'S') then
                MONTO = MONTO - IMPTOS;
            if ((CTADTO IS NULL) OR (CTADTO = '')) then
                MONTO = MONTO * FACTOR;
            execute procedure redondee(MONTO, DIG) returning_values (MONTO);
            if (MONTO <> 0) then
                BEGIN
                CUENTA = NULL;
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :CTAVENTAS INTO :CUENTA, :TIPOCUEN;
                if (CUENTA IS NULL) then
                    begin
                    EXECUTE PROCEDURE ERROR (31, 0, :CTAVENTAS, 2);
                    CUENTA = CTAVENTAS;
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                     $$IBE$$*/ /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */ /*$$IBE$$ 
                    FOR SELECT FD.ARTI_COD, (CAST(FADE_CANT AS DOUBLE PRECISION) * (FADE_PRUNIT-FADE_DTOMONTO)), (FADE_IVAMONTO+FADE_CONSUMO)
                        FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_DETALLE FD, FACTURAS F
                        WHERE F.FACT_ID = FD.FACT_ID AND FACT_FECHA = :FECFAC AND F.PREF_PRE = :PREF AND F.PTVT_ID = :PTVTA AND FD.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTAINV = :CUENTA AND FACT_ANULADO = 'N' AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
                        INTO :ART, :MONTO, :IMPTOS
                    DO
                        BEGIN
                        if (IMPINC = 'S') then
                            MONTO = MONTO - IMPTOS;
                        if ((CTADTO IS NULL) OR (CTADTO = '')) then
                            MONTO = MONTO * FACTOR;
                        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                        if (MONTO <> 0) then
                            BEGIN
                            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                            NROI = NROI + 1;
                            SUMA = SUMA - MONTO;
                            END
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    NROI = NROI + 1;
                    SUMA = SUMA - MONTO;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA - MONTO;
                    END
                END  $$IBE$$*/ /* MONTO <> 0 */ /*$$IBE$$ 
            END  $$IBE$$*/ /* FOR */ /*$$IBE$$ 
        END  $$IBE$$*/ /* VENTAS X ARTICULO */ /*$$IBE$$ 
     IF ((VENTAS = 'C') OR (VENTAS = 'K')) THEN
        BEGIN
        IF (VENTAS = 'C') THEN
            CTAVENTAS = TCTAVENTA;
        SELECT SUM(CAST(FADE_CANT AS DOUBLE PRECISION) * (FADE_PRUNIT-FADE_DTOMONTO)), SUM(FADE_IVAMONTO+FADE_CONSUMO)
            FROM FACTURAS_DETALLE FD, FACTURAS F
            WHERE F.FACT_ID = FD.FACT_ID AND FACT_FECHA = :FECFAC AND F.PREF_PRE = :PREF AND F.PTVT_ID = :PTVTA AND FACT_ANULADO = 'N' AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
            INTO :MONTO, :IMPTOS;
        if (IMPINC = 'S') then
            MONTO = MONTO - IMPTOS;
        if ((CTADTO IS NULL) OR (CTADTO = '')) then
            MONTO = MONTO * FACTOR;
        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
        if (MONTO <> 0) then
            BEGIN
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTAVENTAS INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERROR (31, 0, :CTAVENTAS, 2);
                CUENTA = CTAVENTAS;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                 $$IBE$$*/ /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */ /*$$IBE$$ 
                FOR SELECT FD.ARTI_COD, (CAST(FADE_CANT AS DOUBLE PRECISION) * (FADE_PRUNIT-FADE_DTOMONTO)), (FADE_IVAMONTO+FADE_CONSUMO)
                    FROM  $$IBE$$*/ /*ARTICULO A,*/ /*$$IBE$$  FACTURAS_DETALLE FD, FACTURAS F
                    WHERE F.FACT_ID = FD.FACT_ID AND FACT_FECHA = :FECFAC AND F.PREF_PRE = :PREF AND F.PTVT_ID = :PTVTA AND FACT_ANULADO = 'N' AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
                    INTO :ART, :MONTO, :IMPTOS
                    DO
                    BEGIN
                    if (IMPINC = 'S') then
                        MONTO = MONTO - IMPTOS;
                    if ((CTADTO IS NULL) OR (CTADTO = '')) then
                        MONTO = MONTO * FACTOR;
                    execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                    if (MONTO <> 0) then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        SUMA = SUMA - MONTO;
                        END
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - MONTO;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - MONTO;
                END
            END  $$IBE$$*/ /* MONTO <> 0 */ /*$$IBE$$ 
        END  $$IBE$$*/ /* VENTAS DE CLIENTE O CONSTANTE */
    /* EL IVA EN VENTAS */ /*$$IBE$$ 
    if (IVA = 'A') then
        BEGIN
        FOR SELECT MAX(COAR_CTAIVAV), SUM(FADE_IVAMONTO), SUM(CAST(FADE_CANT AS DOUBLE PRECISION) * (FADE_PRUNIT-FADE_DTOMONTO)), sum(FADE_CONSUMO)
            FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_DETALLE FD, FACTURAS F
            WHERE F.FACT_ID = FD.FACT_ID AND FACT_FECHA = :FECFAC AND F.PREF_PRE = :PREF AND F.PTVT_ID = :PTVTA AND FD.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND FACT_ANULADO = 'N' AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
            GROUP BY COAR_CTAIVAV
            INTO :CTAIVA, :IMPTOS, :MONTO, :VALORADIC
        DO
            BEGIN
            if (IMPINC = 'S') then
                MONTO = MONTO - IMPTOS - VALORADIC;
            MONTO = MONTO * -1;
            MONTO = MONTO * FACTOR;
            IMPTOS = IMPTOS * FACTOR;
            execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
            execute procedure redondee(MONTO, DIG) returning_values (MONTO);
            if (IMPTOS <> 0) then
                BEGIN
                CUENTA = NULL;
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :CTAIVA INTO :CUENTA, :TIPOCUEN;
                if (CUENTA IS NULL) then
                    begin
                    EXECUTE PROCEDURE ERROR (31, 0, :CTAIVA, 2);
                    CUENTA = CTAIVA;
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                     $$IBE$$*/ /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */ /*$$IBE$$ 
                    FOR SELECT FD.ARTI_COD, FADE_IVAMONTO, (CAST(FADE_CANT AS DOUBLE PRECISION) * (FADE_PRUNIT-FADE_DTOMONTO)), TAIV_PORC, FADE_CONSUMO
                        FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_DETALLE FD, FACTURAS F, TARIFA_IVA T
                        WHERE F.FACT_ID = FD.FACT_ID AND FACT_FECHA = :FECFAC AND F.PREF_PRE = :PREF AND F.PTVT_ID = :PTVTA AND FD.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTAIVAV = :CUENTA AND A.TAIV_COD = T.TAIV_COD AND FACT_ANULADO = 'N' AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
                        INTO :ART, :IMPTOS, :MONTO, :PORCIVA, :VALORADIC
                    DO
                        BEGIN
                        if (IMPINC = 'S') then
                            MONTO = MONTO - IMPTOS - VALORADIC;
                        MONTO = MONTO * -1;
                        MONTO = MONTO * FACTOR;
                        IMPTOS = IMPTOS * FACTOR;
                        execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                        if (IMPTOS <> 0) then
                            BEGIN
                            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, :MONTO, :PORCIVA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                            NROI = NROI + 1;
                            SUMA = SUMA + DEBITO - CREDITO;
                            END
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, :MONTO, ABS(:IMPTOS*100/:MONTO), :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    NROI = NROI + 1;
                    SUMA = SUMA - IMPTOS;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, :MONTO, ABS(:IMPTOS*100/:MONTO), :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA - IMPTOS;
                    END
                END    $$IBE$$*/ /* IMPTOS <> 0 */ /*$$IBE$$ 
            END  $$IBE$$*/ /* FOR */ /*$$IBE$$ 
        END  $$IBE$$*/ /* IVA X ARTICULO */ /*$$IBE$$ 
    if (IVA = 'K') then  $$IBE$$*/ /* IVA EN CTA CONSTANTE */ /*$$IBE$$ 
        BEGIN
        SELECT SUM(FADE_IVAMONTO), SUM(CAST(FADE_CANT AS DOUBLE PRECISION) * (FADE_PRUNIT-FADE_DTOMONTO)), SUM(FADE_CONSUMO)
            FROM FACTURAS_DETALLE FD, FACTURAS F
            WHERE F.FACT_ID = FD.FACT_ID AND FACT_FECHA = :FECFAC AND F.PREF_PRE = :PREF AND F.PTVT_ID = :PTVTA AND FACT_ANULADO = 'N' AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
            INTO :IMPTOS, :MONTO, :valoradic;
        if (IMPINC = 'S') then
            MONTO = MONTO - IMPTOS - VALORADIC;
        MONTO = MONTO * -1;
        MONTO = MONTO * FACTOR;
        IMPTOS = IMPTOS * FACTOR;
        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
        execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
        if (IMPTOS <> 0) then
            BEGIN
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTAIVA INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERROR (31, 0, :CTAIVA, 2);
                CUENTA = CTAIVA;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                 $$IBE$$*/ /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */ /*$$IBE$$ 
                FOR SELECT FD.ARTI_COD, (CAST(FADE_CANT AS DOUBLE PRECISION) * (FADE_PRUNIT-FADE_DTOMONTO)), FADE_IVAMONTO, TAIV_PORC, FADE_CONSUMO
                    FROM ARTICULO A, FACTURAS_DETALLE FD, FACTURAS F, TARIFA_IVA T
                    WHERE F.FACT_ID = FD.FACT_ID AND FACT_FECHA = :FECFAC AND F.PREF_PRE = :PREF AND F.PTVT_ID = :PTVTA AND FD.arti_cod = A.arti_cod AND T.TAIV_COD=A.TAIV_COD AND FACT_ANULADO = 'N' AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
                    INTO :ART, :MONTO, :IMPTOS, :PORCIVA, :VALORADIC
                    DO
                    BEGIN
                    if (IMPINC = 'S') then
                        MONTO = MONTO - IMPTOS - VALORADIC;
                    MONTO = MONTO * -1;
                    MONTO = MONTO * FACTOR;
                    IMPTOS = IMPTOS * FACTOR;
                    execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                    execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                    if (IMPTOS <> 0) then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', 0, :IMPTOS, :MONTO, :PORCIVA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        SUMA = SUMA - IMPTOS;
                        END
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', 0, :IMPTOS, :MONTO, ABS(:IMPTOS*100/:MONTO), :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - IMPTOS;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', 0, :IMPTOS, :MONTO, ABS(:IMPTOS*100/:MONTO), :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - IMPTOS;
                END
            END  $$IBE$$*/ /* IMPTOS <> 0 */ /*$$IBE$$ 
        END  $$IBE$$*/ /* IVA EN CTA CONSTANTE */
    /* EL IMPOCONSUMO */ /*$$IBE$$ 
    if (CONSUMO = 'A') then
        BEGIN
        FOR SELECT MAX(COAR_CTACONS), SUM(FADE_CONSUMO)
            FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_DETALLE FD, FACTURAS F
            WHERE F.FACT_ID = FD.FACT_ID AND FACT_FECHA = :FECFAC AND F.PREF_PRE = :PREF AND F.PTVT_ID = :PTVTA AND FD.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND FACT_ANULADO = 'N' AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
            GROUP BY COAR_CTACONS
            INTO :CTACONSUMO, :IMPTOS
        DO
            BEGIN
            execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
            if (IMPTOS <> 0) then
                BEGIN
                CUENTA = NULL;
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :CTACONSUMO INTO :CUENTA, :TIPOCUEN;
                if (CUENTA IS NULL) then
                    begin
                    EXECUTE PROCEDURE ERROR (31, 0, :CTACONSUMO, 2);
                    CUENTA = CTACONSUMO;
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                     $$IBE$$*/ /* ES UNA CUENTA DE INVENTARIO, REGISTRE UNO A UNO LOS ARTICULOS */ /*$$IBE$$ 
                    FOR SELECT FD.ARTI_COD, FADE_CONSUMO
                        FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_DETALLE FD, FACTURAS F
                        WHERE F.FACT_ID = FD.FACT_ID AND FACT_FECHA = :FECFAC AND F.PREF_PRE = :PREF AND F.PTVT_ID = :PTVTA AND FD.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTACONS = :CUENTA AND FACT_ANULADO = 'N' AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
                        INTO :ART, :IMPTOS
                    DO
                        BEGIN
                        execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                        if (IMPTOS <> 0) then
                            BEGIN
                            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                            NROI = NROI + 1;
                            SUMA = SUMA - IMPTOS;
                            END
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    NROI = NROI + 1;
                    SUMA = SUMA - IMPTOS;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA - CREDITO;
                    END
                END  $$IBE$$*/ /* IMPTOS <> 0 */ /*$$IBE$$ 
            END  $$IBE$$*/ /* FOR */ /*$$IBE$$ 
        END  $$IBE$$*/ /* CONSUMO X ARTICULO */ /*$$IBE$$ 
    if (CONSUMO = 'K') then  $$IBE$$*/ /* CONSUMO EN CTA CONSTANTE */ /*$$IBE$$ 
        BEGIN
        SELECT SUM(FADE_CONSUMO)
            FROM FACTURAS_DETALLE FD, FACTURAS F
            WHERE F.FACT_ID = FD.FACT_ID AND FACT_FECHA = :FECFAC AND F.PREF_PRE = :PREF AND F.PTVT_ID = :PTVTA AND FACT_ANULADO = 'N' AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
            INTO :IMPTOS;
        execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
        if (IMPTOS <> 0) then
            BEGIN
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTACONSUMO INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERROR (31, 0, :CTACONSUMO, 2);
                CUENTA = CTACONSUMO;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                 $$IBE$$*/ /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */ /*$$IBE$$ 
                FOR SELECT FD.ARTI_COD, FADE_CONSUMO
                    FROM  $$IBE$$*/ /*ARTICULO A,*/ /*$$IBE$$  FACTURAS_DETALLE FD, FACTURAS F
                    WHERE F.FACT_ID = FD.FACT_ID AND FACT_FECHA = :FECFAC AND F.PREF_PRE = :PREF AND F.PTVT_ID = :PTVTA AND FACT_ANULADO = 'N' AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
                    INTO :ART, :IMPTOS
                    DO
                    BEGIN
                    execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                    if (IMPTOS <> 0) then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CTACONSUMO, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        SUMA = SUMA - IMPTOS;
                        END
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTACONSUMO, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - IMPTOS;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTACONSUMO, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - IMPTOS;
                END
            END  $$IBE$$*/ /* IMPTOS <> 0 */ /*$$IBE$$ 
        END  $$IBE$$*/ /* CONSUMO EN CTA CONSTANTE */
    /* DESCUENTO */ /*$$IBE$$ 
    if ((CTADTO IS NOT NULL) AND (CTADTO <> '')) then
        BEGIN
        execute procedure redondee(VRDTO, DIG) returning_values (VRDTO);
        if (VRDTO <> 0) then
            BEGIN
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTADTO INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERROR (31, 0, :CTADTO, 2);
                CUENTA = CTADTO;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                begin
                EXECUTE PROCEDURE ERROR (31, 0, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRDTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA + VRDTO;
                END
            if (TIPOCUEN = 'N') then
                    BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRDTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA + VRDTO;
                END
            END
        END  $$IBE$$*/ /* DESCUENTO */
    /* VALOR ADIC */ /*$$IBE$$ 
    if ((CTAADIC IS NOT NULL) AND (CTAADIC <> '')) then
        BEGIN
        execute procedure redondee(VRADIC, DIG) returning_values (VRADIC);
        if (VRADIC <> 0) THEN
            BEGIN
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTAADIC INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERROR (31, 0, :CTAADIC, 2);
                CUENTA = CTAADIC;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                begin
                EXECUTE PROCEDURE ERROR (31, 0, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRADIC, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - VRADIC;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRADIC, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - VRADIC;
                END
            END
        END  $$IBE$$*/ /* VR. ADIC */
    /* VALOR EXTRA */ /*$$IBE$$ 
    if ((CTAEXTRA IS NOT NULL) AND (CTAEXTRA <> '')) THEN
        BEGIN
        execute procedure redondee(VREXTRA, DIG) returning_values (VREXTRA);
        if (VREXTRA <> 0) THEN
            BEGIN
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTAEXTRA INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERROR (31, 0, :CTAEXTRA, 2);
                CUENTA = CTAEXTRA;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                begin
                EXECUTE PROCEDURE ERROR (31, 0, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VREXTRA, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - VREXTRA;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VREXTRA, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - VREXTRA;
                END
            END
        END  $$IBE$$*/ /* VR. EXTRA */
    /* RETENCION FUENTE */ /*$$IBE$$ 
    if ((RTFTE = 'C') or (RTFTE = 'K')) then
      BEGIN
      execute procedure redondee(VRRTFTE, DIG) returning_values (VRRTFTE);
      if (VRRTFTE <> 0) then
        BEGIN
        if (RTFTE = 'C') then
            CTARTFTE = TCTARTFTE;
        CUENTA = NULL;
        SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
            WHERE CUEN_COD = :CTARTFTE INTO :CUENTA, :TIPOCUEN;
        if (CUENTA IS NULL) then
            begin
            EXECUTE PROCEDURE ERROR (31, 0, :CTARTFTE, 2);
            CUENTA = CTARTFTE;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            begin
            EXECUTE PROCEDURE ERROR (31, 0, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :VRSUBT, :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTFTE;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :VRSUBT, :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTFTE;
            END
        END  $$IBE$$*/ /* RTFTE */ /*$$IBE$$ 
      END
     $$IBE$$*/ /* RETENCION IVA */ /*$$IBE$$ 
    if ((RTIVA = 'C') or (RTIVA = 'K')) then
      BEGIN
      execute procedure redondee(VRRTIVA, DIG) returning_values (VRRTIVA);
      if (VRRTIVA <> 0) then
        BEGIN
        if (RTIVA = 'C') then
            CTARTIVA = TCTARTIVA;
        CUENTA = NULL;
        SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
            WHERE CUEN_COD = :CTARTIVA INTO :CUENTA, :TIPOCUEN;
        if (CUENTA IS NULL) then
            begin
            EXECUTE PROCEDURE ERROR (31, 0, :CTARTIVA, 2);
            CUENTA = CTARTIVA;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            begin
            EXECUTE PROCEDURE ERROR (31, 0, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTIVA, 0, :VRIVA, :PORC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTIVA;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTIVA, 0, :VRIVA, :PORC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTIVA;
            END
        END  $$IBE$$*/ /* RTIVA */ /*$$IBE$$ 
      END
     $$IBE$$*/ /* RETENCION DE ICA */ /*$$IBE$$ 
    if ((RTICA = 'C') or (RTICA = 'K')) then
      BEGIN
      execute procedure redondee(VRRTICA, DIG) returning_values (VRRTICA);
      if (VRRTICA <> 0) then
        BEGIN
        if (RTICA = 'C') then
            CTARTICA = TCTARTICA;
        CUENTA = NULL;
        SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
            WHERE CUEN_COD = :CTARTICA INTO :CUENTA, :TIPOCUEN;
        if (CUENTA IS NULL) then
            begin
            EXECUTE PROCEDURE ERROR (31, 0, :CTARTICA, 2);
            CUENTA = CTARTICA;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            begin
            EXECUTE PROCEDURE ERROR (31, 0, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTICA, 0, :VRSUBT, :PRTICA, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTICA;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTICA, 0, :VRSUBT, :PRTICA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTICA;
            END
        END  $$IBE$$*/ /* RTICA */ /*$$IBE$$ 
      END
     $$IBE$$*/ /* CIERRE EL COMPROBANTE CONTRA LA CUENTA DEL TERCERO O LA CONSTANTE */ /*$$IBE$$ 
    if ((SUMA <> 0) and ((CARTERA = 'C') or (CARTERA = 'K') or (CARTERA = 'J'))) then
        BEGIN
        if (SUMA < 0) then
            BEGIN
            DEBITO = SUMA * -1;
            CREDITO = 0;
            END
        ELSE
            BEGIN
            DEBITO = 0;
            CREDITO = SUMA;
            END
        if (CARTERA = 'C') then
            CTACARTERA = TCTACLIEN;
        if (CARTERA = 'J') then
            BEGIN
             $$IBE$$*/ /* BUSQUE LA CUENTA DE LA CAJA */ /*$$IBE$$ 
            SELECT CAJA_CUENTA FROM CAJAS C, PUNTO_VENTA P
                WHERE P.CAJA_ID = C.CAJA_ID AND PTVT_ID = :PTOVTA
                INTO :CTACARTERA;
            END
        CUENTA = NULL;
        SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
            WHERE CUEN_COD = :CTACARTERA INTO :CUENTA, :TIPOCUEN;
        if (CUENTA IS NULL) then
            begin
            EXECUTE PROCEDURE ERROR (31, 0, :CTACARTERA, 2);
            CUENTA = CTACARTERA;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            begin
            EXECUTE PROCEDURE ERROR (31, 0, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'C') then
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :DEBITO, :CREDITO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
        if (TIPOCUEN = 'N') then
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :DEBITO, :CREDITO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
        NROI = NROI + 1;
        END  $$IBE$$*/ /* SUMA EN CARTERA */
    /* CALCULE LOS COSTOS */ /*$$IBE$$ 
    EXECUTE PROCEDURE costo_en_ventas_contado(:fecfac,  :pref, :ptvta);
    if (COSTOS = 'A') then
        BEGIN
        FOR SELECT MAX(CTACOS), SUM(COSTO)
            FROM COSTO_VENTAS
            GROUP BY CTACOS
            INTO :CTACOSTOS, :MONTO
        DO
            BEGIN
            if (MONTO <> 0) then
                BEGIN
                CUENTA = NULL;
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :CTACOSTOS INTO :CUENTA, :TIPOCUEN;
                IF (CUENTA IS NULL) THEN
                    begin
                    EXECUTE PROCEDURE ERROR (31, 0, :CTACOSTOS, 2);
                    CUENTA = CTARTFTE;
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                     $$IBE$$*/ /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */ /*$$IBE$$ 
                    FOR SELECT ARTI_COD, CANT * COSTO
                        FROM COSTO_VENTAS
                        WHERE CTACOS = :CUENTA
                        INTO :ART, :MONTO
                    DO
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    NROI = NROI + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    END
                END  $$IBE$$*/ /* MONTO <> 0 */ /*$$IBE$$ 
            END  $$IBE$$*/ /* FOR */ /*$$IBE$$ 
        END  $$IBE$$*/ /* COSTOS */ /*$$IBE$$ 
    if (COSTOS = 'K') then
        BEGIN
        SELECT SUM(COSTO)
            FROM COSTO_VENTAS
            INTO :MONTO;
        if (MONTO <> 0) then
            BEGIN
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTACOSTOS INTO :CUENTA, :TIPOCUEN;
            IF (CUENTA IS NULL) THEN
                begin
                EXECUTE PROCEDURE ERROR (31, 0, :CTACOSTOS, 2);
                CUENTA = CTARTFTE;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                 $$IBE$$*/ /* ES UNA CUENTA DE INVENTARIO, REGISTRE UNO A UNO LOS ARTICULOS */ /*$$IBE$$ 
                FOR SELECT ARTI_COD, CANT * COSTO
                    FROM COSTO_VENTAS
                    INTO :ART, :MONTO
                DO
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTACOSTOS, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                    NROI = NROI + 1;
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTACOSTOS, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTACOSTOS, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                END
            END  $$IBE$$*/ /* MONTO <> 0 */ /*$$IBE$$ 
        END  $$IBE$$*/ /* COSTOS = K */ /*$$IBE$$ 
    if (INVEN = 'A') then
        BEGIN
        FOR SELECT MAX(CTAINV), SUM(COSTO)
            FROM COSTO_VENTAS
            GROUP BY CTAINV
            INTO :CTAINVEN, :MONTO
        DO
            BEGIN
            if (MONTO <> 0) then
                BEGIN
                CUENTA = NULL;
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :CTAINVEN INTO :CUENTA, :TIPOCUEN;
                IF (CUENTA IS NULL) THEN
                    begin
                    EXECUTE PROCEDURE ERROR (31, 0, :CTAINVEN, 2);
                    CUENTA = CTAINVEN;
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                     $$IBE$$*/ /* ES UNA CUENTA DE INVENTARIO, REGISTRE UNO A UNO LOS ARTICULOS */ /*$$IBE$$ 
                    FOR SELECT ARTI_COD, CANT * COSTO
                        FROM COSTO_VENTAS
                        WHERE CTAINV = :CUENTA
                        INTO :ART, :MONTO
                    DO
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    NROI = NROI + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    END
                END  $$IBE$$*/ /* MONTO <> 0 */ /*$$IBE$$ 
            END  $$IBE$$*/ /* FOR */ /*$$IBE$$ 
        END  $$IBE$$*/ /* INVEN = A */ /*$$IBE$$ 
    if (INVEN = 'K') then
        BEGIN
        SELECT SUM(COSTO)
            FROM COSTO_VENTAS
            INTO :MONTO;
        if (MONTO <> 0) then
            BEGIN
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTAINVEN INTO :CUENTA, :TIPOCUEN;
            IF (CUENTA IS NULL) THEN
                begin
                EXECUTE PROCEDURE ERROR (31, 0, :CTAINVEN, 2);
                CUENTA = CTAINVEN;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                 $$IBE$$*/ /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */ /*$$IBE$$ 
                FOR SELECT ARTI_COD, CANT * COSTO
                    FROM COSTO_VENTAS
                    INTO :ART, :MONTO
                DO
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTAINVEN, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                    NROI = NROI + 1;
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAINVEN, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAINVEN, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                END
            END  $$IBE$$*/ /* MONTO <> 0 */ /*$$IBE$$ 
        END  $$IBE$$*/ /* INVEN = K */
    /* recorra las cuentas adicionales */ /*$$IBE$$ 
    FOR SELECT INVC_CUENTA, INVC_BASE, INVC_PORC, INVC_VALOR, INVC_DB
        FROM INTERFAZ_VENTAS_CTAS
        WHERE INVE_ID = :IDINTER
        INTO :CTADIC, :BASEADIC, :PORCADIC, :VALORADIC, :DBADIC
        DO
        BEGIN
        if (VALORADIC <> 0) then
            MONTO = VALORADIC;
        ELSE
            BEGIN
            if (:BASEADIC = 'SUBTOTAL') then
                VALORADIC = vrsubt;
            if (:BASEADIC = 'DESCUENTO') then
                VALORADIC = VRDTO;
            if (:BASEADIC = 'IVA') then
                VALORADIC = VRIVA;
            if (:BASEADIC = 'ADICIONAL') then
                VALORADIC = VRADIC;
            if (:BASEADIC = 'EXTRA') then
                VALORADIC = VREXTRA;
            if (:BASEADIC = 'TOTAL') then
                VALORADIC = VRTOTAL;
            MONTO = VALORADIC * PORCADIC / 100;
            END
        if (MONTO <> 0) then
            BEGIN
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTADIC INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERROR (31, 0, :CTADIC, 2);
                CUENTA = CTADIC;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                begin
                EXECUTE PROCEDURE ERROR (31, 0, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'C') then
                BEGIN
                if (DBADIC = 'S') then
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                ELSE
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                if (DBADIC = 'S') then
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                ELSE
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                END
            NROI = NROI + 1;
            END
        END
    if (ERROR > 0) then
        VER = 'S';
    SUSPEND;
    END  $$IBE$$*/ /* EXISTE LA INTERFAZ */ /*$$IBE$$ 
ELSE
    BEGIN
    EXECUTE PROCEDURE ERROR (31, 0, :PREF, 1);
    ERROR = ERROR + 1;
    VER = 'S';
    SUSPEND;
    END
 $$IBE$$*/ SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE EXISTENCIAS_DESDE_HASTA(
    FECHA DATE,
    ARTINI VARCHAR(20),
    ARTFIN VARCHAR(20),
    GRPINI VARCHAR(3),
    GRPFIN VARCHAR(3),
    BODINI VARCHAR(2),
    BODFIN VARCHAR(2),
    ORDEN CHAR(1),
    AGRUPA CHAR(1),
    DETALLE CHAR(1),
    RESERVA CHAR(1),
    ENPESO CHAR(1),
    SUCURSAL INTEGER)
RETURNS (
    CANT NUMERIC(18,4),
    COSTO NUMERIC(18,2),
    COSTO_LOTE NUMERIC(18,2),
    CODIGO VARCHAR(15),
    NOMBRE VARCHAR(60),
    UNIDAD VARCHAR(8),
    STAND VARCHAR(15),
    CODGRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    CODSUBG VARCHAR(3),
    NOMSUBG VARCHAR(30),
    CODMARC VARCHAR(3),
    NOMMARC VARCHAR(30),
    CODBOD VARCHAR(2),
    LOTE VARCHAR(15),
    NOMBOD VARCHAR(30),
    COSTOTOT NUMERIC(18,2),
    ULTCOSTO NUMERIC(18,2),
    FECHACOSTO DATE,
    CONSUMO NUMERIC(18,2),
    RESERVADO NUMERIC(18,4),
    ORDENADO NUMERIC(18,4),
    IVA NUMERIC(9,2),
    PESOUNIT NUMERIC(18,4),
    PESOTOTAL NUMERIC(18,4),
    CODBAR VARCHAR(20))
AS
declare variable exist char(1);
declare variable codini varchar(20);
declare variable codfin varchar(20);
declare variable desini varchar(20);
declare variable desfin varchar(20);
declare variable ordenc numeric(18,4);
declare variable pedido numeric(18,4);
declare variable ok char(1);
declare variable id integer;
declare variable item integer;
declare variable und varchar(8);
declare variable factor numeric(18,4);
declare variable cant2 numeric(18,4);
declare variable PEDAUTO CHAR(2);
BEGIN /*$$IBE$$ 
if (ORDEN = 'C') then
    BEGIN
    CODINI = ARTINI;
    CODFIN = ARTFIN;
    DESINI = '';
    DESFIN = 'zz';
    END
ELSE
    BEGIN
    DESINI = ARTINI;
    DESFIN = ARTFIN;
    CODINI = '';
    CODFIN = 'zz';
    END
EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION', 'FACTURAS', 'GENERAR PEDIDO AUTOMATICAMENTE CON LA FACTURA') returning_values (pedauto);
if (DETALLE = 'B') then
  BEGIN
  FOR SELECT ARTI_COD, ARTI_DES, ARTI_UNIDAD, ARTI_EXIST, TAIV_PORC, A.GRUP_COD, A.SUBG_COD, A.MARC_COD, BODE_COD, BODE_NOM, ARTI_CONSUMO, ARTI_PESO/1000
      FROM ARTICULO A, BODEGA B, TARIFA_IVA T
      WHERE ARTI_COD >= :CODINI AND ARTI_COD <= :CODFIN AND ARTI_DES >= :DESINI AND ARTI_DES <= :DESFIN AND ESAR_COD <> 'I' AND BODE_COD >= :BODINI AND
      BODE_COD <= :BODFIN AND ((SUCU_ID = :SUCURSAL) or (:SUCURSAL = 0)) AND A.TAIV_COD = T.TAIV_COD
      INTO :CODIGO, :NOMBRE, :UNIDAD, :EXIST, :IVA, :CODGRUPO, :CODSUBG, :CODMARC, :CODBOD, :NOMBOD, :CONSUMO, :pesounit
      DO
        BEGIN
        STAND = '';
        OK = 'N';
        if (AGRUPA = 'G') then
            BEGIN
            if ((CODGRUPO >= GRPINI) AND (CODGRUPO <= GRPFIN)) then
                OK = 'S';
            end
        ELSE
            if (AGRUPA = 'M') then
                BEGIN
                if ((CODMARC >= GRPINI) AND (CODMARC <= GRPFIN)) then
                    OK = 'S';
                END
        if (OK = 'S') then
            BEGIN
            NOMGRUPO = '';
            NOMMARC = '';
            NOMSUBG = '';
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            SELECT MAX(COBA_COD) FROM BARRAS_ARTICULO WHERE ARTI_COD = :codigo AND COBA_UNIDAD = :unidad INTO :codbar;
            if (CODBAR IS NULL) then
                CODBAR = CODIGO;
            if (EXIST <> 'N') then
                BEGIN
                SELECT STAND_COD FROM STANDS WHERE ARTI_COD = :CODIGO AND STAND_BODEGA = :CODBOD INTO :STAND;
                EXECUTE PROCEDURE SALDO_INICIAL_INVENTARIO(CODIGO, FECHA, :CODBOD) returning_values (CANT);
                EXECUTE PROCEDURE costo_promedio_y_ultimo_unidad(CODIGO, FECHA, UNIDAD) returning_values (COSTO, ULTCOSTO);
                SELECT MAX(EXIS_FECHA) FROM EXISTENCIA WHERE ARTI_COD = :CODIGO AND EXIS_ENTR <> 0 AND EXIS_FECHA <= :FECHA INTO :FECHACOSTO;
                COSTOTOT = :CANT * :COSTO;
                CONSUMO = CONSUMO * CANT;
                if (RESERVA = 'S') then
                    BEGIN
                    SELECT SUM(ORID_ENTREGAR)
                        FROM ORDENINVENTARIO_DETALLE OD, ordenes_inventario O
                        WHERE O.ORIN_ID = OD.ORIN_ID AND ARTI_COD = :CODIGO AND ORIN_FECHA <= :FECHA AND ORIN_FECLLEGA >= :FECHA AND ORID_ANULADO = 'N' AND OD.BODE_COD = :CODBOD
                        INTO :ORDENADO;
                    if (ORDENADO IS NULL) then
                        ORDENADO = 0;
                    ORDENC = 0;
                    FOR SELECT O.ORDC_ID, OCDE_ITEM, OCDE_CANT * OCDE_FACTOR
                        FROM ORDENES_COMPRA O, ORDENES_COMPRA_DETALLE OD
                        WHERE O.ORDC_ID = OD.ORDC_ID AND OD.ARTI_COD = :CODIGO AND ORDC_VENCE >= :FECHA AND ORDC_FECHA <= :FECHA AND OCDE_ANULADO = 'N' AND OD.BODE_COD = :CODBOD
                        INTO :ID, :ITEM, :CANT2
                        do
                        BEGIN
                        EXECUTE PROCEDURE FALTANTE(23, 21, ID, ITEM) returning_values (PEDIDO, UND, FACTOR);
                        if (PEDIDO * FACTOR = CANT2) then  $$IBE$$*/ /* SI NO SE HA FACTURADO MIRE A VER SI SE REMISIONO */ /*$$IBE$$ 
                            EXECUTE PROCEDURE FALTANTE(23, 22, ID, ITEM) returning_values (PEDIDO, UND, FACTOR);
                        if (PEDIDO IS NULL) then
                            PEDIDO = 0;
                        ORDENC = ORDENC + PEDIDO * FACTOR;
                        END
                    ORDENADO = ORDENADO + ORDENC;
                    SELECT SUM(RSDE_LIBERAR)
                        FROM RESERVAS_DETALLE RD, RESERVAS R
                        WHERE R.RESE_ID = RD.RESE_ID AND ARTI_COD = :CODIGO AND RESE_FECHA <= :FECHA AND RESE_VENCE >= :FECHA AND RD.BODE_COD = :CODBOD AND RSDE_ANULADO = 'N'
                        INTO :RESERVADO;
                    if (RESERVADO IS NULL) then
                        RESERVADO = 0;
                    PEDIDO = 0;
                    FOR SELECT P.PEDI_ID, PEDE_ITEM, PEDE_CANT * PEDE_FACTOR
                        FROM PEDIDOS P, PEDIDOS_DETALLE PD
                        WHERE P.PEDI_ID = PD.PEDI_ID AND PD.ARTI_COD = :CODIGO AND PEDI_VENCE >= :FECHA AND PEDI_FECHA <= :FECHA AND PEDE_ANULADO = 'N' AND BODE_COD = :CODBOD
                        INTO :ID, :ITEM, :CANT2
                        do
                        BEGIN
                        EXECUTE PROCEDURE FALTANTE(34, 31, ID, ITEM) returning_values (ORDENC, UND, FACTOR);
                        if ((ORDENC * FACTOR = CANT2) or (PEDAUTO = 'SI')) then  $$IBE$$*/ /* SI NO SE HA FACTURADO MIRE A VER SI SE REMISIONO */ /*$$IBE$$ 
                            EXECUTE PROCEDURE FALTANTE(34, 32, ID, ITEM) returning_values (ORDENC, UND, FACTOR);
                        if (ORDENC IS NULL) then
                            ORDENC = 0;
                        PEDIDO = PEDIDO + ORDENC * FACTOR;
                        END
                    RESERVADO = RESERVADO + PEDIDO;
                    END
                ELSE
                    BEGIN
                    RESERVADO = 0;
                    ORDENADO = 0;
                    END
                if (ENPESO = 'S') then
                    BEGIN
                    if (pesounit IS NULL) then
                        pesounit = 0;
                    if (PESOUNIT <> 0) then
                        BEGIN
                        pesototal = PESOUNIT * cant;
                        SUSPEND;
                        END
                    END
                ELSE
                    SUSPEND;
                END
            END
        END
  END

if (DETALLE = 'L') then
  BEGIN
  FOR SELECT A.ARTI_COD, ARTI_DES, ARTI_UNIDAD, ARTI_EXIST, TAIV_PORC, A.GRUP_COD, A.SUBG_COD, A.MARC_COD, L.lote_nro, L.lote_nro||' - '||L.lote_vence, ARTI_CONSUMO,l.bode_cod, L.lote_saldo,l.lote_costo, ARTI_PESO/1000
      FROM ARTICULO A, LOTES l, TARIFA_IVA T
      WHERE A.ARTI_COD >= '0' AND A.ARTI_COD <= 'zz' AND ARTI_DES >= '' AND ARTI_DES <= 'zz' AND ESAR_COD <> 'I' AND A.TAIV_COD = T.TAIV_COD and a.arti_cod = l.arti_cod
      INTO :CODIGO, :NOMBRE, :UNIDAD, :EXIST, :IVA, :CODGRUPO, :CODSUBG, :CODMARC, :LOTE, :NOMBOD, :CONSUMO, :codbod, :cant, :costo_lote, :pesounit
      DO
        BEGIN
        OK = 'N';
        if (AGRUPA = 'G') then
            BEGIN
            if ((CODGRUPO >= GRPINI) AND (CODGRUPO <= GRPFIN)) then
                OK = 'S';
            end
        ELSE
            if (AGRUPA = 'M') then
                BEGIN
                if ((CODMARC >= GRPINI) AND (CODMARC <= GRPFIN)) then
                    OK = 'S';
                END
        if (OK = 'S') then
            BEGIN
            NOMGRUPO = '';
            NOMMARC = '';
            NOMSUBG = '';
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            SELECT MAX(COBA_COD) FROM BARRAS_ARTICULO WHERE ARTI_COD = :codigo AND COBA_UNIDAD = :unidad INTO :codbar;
            if (CODBAR IS NULL) then
                CODBAR = CODIGO;

            if (EXIST <> 'N') then
                BEGIN
                EXECUTE PROCEDURE COSTO_PROMEDIO_UNIDAD(CODIGO, FECHA, UNIDAD) returning_values (COSTO);
                EXECUTE PROCEDURE ULTIMO_COSTO(CODIGO, FECHA, UNIDAD) returning_values (ULTCOSTO);
                SELECT MAX(MVAR_FECHA) FROM MOVIMIENTO_ARTICULO WHERE ARTI_COD = :CODIGO AND MVAR_ENTRADA = 'S' AND MVAR_FECHA <= :FECHA INTO :FECHACOSTO;
                COSTOTOT = :CANT * :COSTO;
                CONSUMO = CONSUMO * CANT;
                if (RESERVA = 'S') then
                    BEGIN
                    SELECT SUM(ORID_ENTREGAR)
                        FROM ORDENINVENTARIO_DETALLE OD, ordenes_inventario O
                        WHERE O.ORIN_ID = OD.ORIN_ID AND ARTI_COD = :CODIGO AND ORIN_FECHA <= :FECHA AND ORIN_FECLLEGA >= :FECHA AND ORID_ANULADO = 'N'
                        INTO :ORDENADO;
                    if (ORDENADO IS NULL) then
                        ORDENADO = 0;
                    ORDENC = 0;
                    FOR SELECT O.ORDC_ID, OCDE_ITEM, OCDE_CANT * OCDE_FACTOR
                        FROM ORDENES_COMPRA O, ORDENES_COMPRA_DETALLE OD
                        WHERE O.ORDC_ID = OD.ORDC_ID AND OD.ARTI_COD = :CODIGO AND ORDC_VENCE >= :FECHA AND ORDC_FECHA <= :FECHA AND OCDE_ANULADO = 'N'
                        INTO :ID, :ITEM, :CANT2
                        do
                        BEGIN
                        EXECUTE PROCEDURE FALTANTE(23, 21, ID, ITEM) returning_values (PEDIDO, UND, FACTOR);
                        if (PEDIDO * FACTOR = CANT2) then  $$IBE$$*/ /* SI NO SE HA FACTURADO MIRE A VER SI SE REMISIONO */ /*$$IBE$$ 
                            EXECUTE PROCEDURE FALTANTE(23, 22, ID, ITEM) returning_values (PEDIDO, UND, FACTOR);
                        if (PEDIDO IS NULL) then
                            PEDIDO = 0;
                        ORDENC = ORDENC + PEDIDO * FACTOR;
                        END
                    ORDENADO = ORDENADO + ORDENC;
                    SELECT SUM(RSDE_LIBERAR)
                        FROM RESERVAS_DETALLE RD, RESERVAS R
                        WHERE R.RESE_ID = RD.RESE_ID AND ARTI_COD = :CODIGO AND RESE_FECHA <= :FECHA AND RESE_VENCE >= :FECHA AND RSDE_ANULADO = 'N'
                        INTO :RESERVADO;
                    if (RESERVADO IS NULL) then
                        RESERVADO = 0;
                    PEDIDO = 0;
                    FOR SELECT P.PEDI_ID, PEDE_ITEM, PEDE_CANT * PEDE_FACTOR
                        FROM PEDIDOS P, PEDIDOS_DETALLE PD
                        WHERE P.PEDI_ID = PD.PEDI_ID AND PD.ARTI_COD = :CODIGO AND PEDI_VENCE >= :FECHA AND PEDI_FECHA <= :FECHA AND PEDE_ANULADO = 'N'
                        INTO :ID, :ITEM, :CANT2
                        do
                        BEGIN
                        EXECUTE PROCEDURE FALTANTE(34, 31, ID, ITEM) returning_values (ORDENC, UND, FACTOR);
                        if ((ORDENC * FACTOR = CANT2) or (PEDAUTO = 'SI')) then  $$IBE$$*/ /* SI NO SE HA FACTURADO MIRE A VER SI SE REMISIONO */ /*$$IBE$$ 
                            EXECUTE PROCEDURE FALTANTE(34, 32, ID, ITEM) returning_values (ORDENC, UND, FACTOR);
                        if (ORDENC IS NULL) then
                            ORDENC = 0;
                        PEDIDO = PEDIDO + ORDENC * FACTOR;
                        END
                    RESERVADO = RESERVADO + PEDIDO;
                    END
                ELSE
                    BEGIN
                    RESERVADO = 0;
                    ORDENADO = 0;
                    END
                if (ENPESO = 'S') then
                    BEGIN
                    if (pesounit IS NULL) then
                        pesounit = 0;
                    if (PESOUNIT <> 0) then
                        BEGIN
                        pesototal = PESOUNIT * cant;
                        SUSPEND;
                        END
                    END
                ELSE
                    SUSPEND;
                END
            END
        END
  end
if (DETALLE = 'N') then
  BEGIN
  FOR SELECT ARTI_COD, ARTI_DES, ARTI_UNIDAD, ARTI_EXIST, TAIV_PORC, A.GRUP_COD, A.SUBG_COD, A.MARC_COD, ARTI_CONSUMO, ARTI_PESO/1000
      FROM ARTICULO A, TARIFA_IVA T
      WHERE ARTI_COD >= :CODINI AND ARTI_COD <= :CODFIN AND ARTI_DES >= :DESINI AND ARTI_DES <= :DESFIN AND ESAR_COD <> 'I' AND A.TAIV_COD = T.TAIV_COD
      INTO :CODIGO, :NOMBRE, :UNIDAD, :EXIST, :IVA, :CODGRUPO, :CODSUBG, :CODMARC, :CONSUMO, :pesounit
      DO
        BEGIN
        OK = 'N';
        if (AGRUPA = 'G') then
            BEGIN
            if ((GRPINI = '0') AND (GRPFIN = 'zz')) then
                OK = 'S';
            else
                if ((CODGRUPO >= GRPINI) AND (CODGRUPO <= GRPFIN)) then
                    OK = 'S';
            end
        ELSE
            if (AGRUPA = 'M') then
                BEGIN
                if ((GRPINI = '0') AND (GRPFIN = 'zzz')) then
                    OK = 'S';
                else
                    if ((CODMARC >= GRPINI) AND (CODMARC <= GRPFIN)) then
                        OK = 'S';
                END
        if (OK = 'S') then
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            SELECT MAX(COBA_COD) FROM BARRAS_ARTICULO WHERE ARTI_COD = :codigo AND COBA_UNIDAD = :unidad INTO :codbar;
            if (CODBAR IS NULL) then
                CODBAR = CODIGO;

            if (EXIST <> 'N') then
                BEGIN
                EXECUTE PROCEDURE SALDO_INICIAL_TOTAL_INV(CODIGO, FECHA) returning_values (CANT);
                EXECUTE PROCEDURE COSTO_PROMEDIO_UNIDAD(CODIGO, FECHA, UNIDAD) returning_values (COSTO);
                EXECUTE PROCEDURE ULTIMO_COSTO(CODIGO, FECHA, UNIDAD) returning_values (ULTCOSTO);
                SELECT MAX(MVAR_FECHA) FROM MOVIMIENTO_ARTICULO WHERE ARTI_COD = :CODIGO AND MVAR_ENTRADA = 'S' AND MVAR_FECHA <= :FECHA INTO :FECHACOSTO;
                COSTOTOT = :CANT * :COSTO;
                CONSUMO = CONSUMO * CANT;
                if (RESERVA = 'S') then
                    BEGIN
                    SELECT SUM(ORID_ENTREGAR)
                        FROM ORDENINVENTARIO_DETALLE OD, ordenes_inventario O
                        WHERE O.ORIN_ID = OD.ORIN_ID AND ARTI_COD = :CODIGO AND ORIN_FECHA <= :FECHA AND ORIN_FECLLEGA >= :FECHA AND ORID_ANULADO = 'N'
                        INTO :ORDENADO;
                        if (ORDENADO IS NULL) then
                            ORDENADO = 0;
                    ORDENC = 0;
                    FOR SELECT O.ORDC_ID, OCDE_ITEM, OCDE_CANT * OCDE_FACTOR
                        FROM ORDENES_COMPRA O, ORDENES_COMPRA_DETALLE OD
                        WHERE O.ORDC_ID = OD.ORDC_ID AND OD.ARTI_COD = :CODIGO AND ORDC_VENCE >= :FECHA AND ORDC_FECHA <= :FECHA AND OCDE_ANULADO = 'N'
                        INTO :ID, :ITEM, :CANT2
                        do
                        BEGIN
                        EXECUTE PROCEDURE FALTANTE(23, 21, ID, ITEM) returning_values (PEDIDO, UND, FACTOR);
                        if (PEDIDO * FACTOR = CANT2) then  $$IBE$$*/ /* SI NO SE HA FACTURADO MIRE A VER SI SE REMISIONO */ /*$$IBE$$ 
                            EXECUTE PROCEDURE FALTANTE(23, 22, ID, ITEM) returning_values (PEDIDO, UND, FACTOR);
                        if (PEDIDO IS NULL) then
                            PEDIDO = 0;
                        ORDENC = ORDENC + PEDIDO * FACTOR;
                        END
                    ORDENADO = ORDENADO + ORDENC;
                    SELECT SUM(RSDE_LIBERAR)
                        FROM RESERVAS_DETALLE RD, RESERVAS R
                        WHERE R.RESE_ID = RD.RESE_ID AND ARTI_COD = :CODIGO AND RESE_FECHA <= :FECHA AND RESE_VENCE >= :FECHA AND RSDE_ANULADO = 'N'
                        INTO :RESERVADO;
                    if (RESERVADO IS NULL) then
                        RESERVADO = 0;
                    PEDIDO = 0;
                    FOR SELECT P.PEDI_ID, PEDE_ITEM, PEDE_CANT * PEDE_FACTOR
                        FROM PEDIDOS P, PEDIDOS_DETALLE PD, PUNTO_VENTA PT
                        WHERE P.PEDI_ID = PD.PEDI_ID AND PD.ARTI_COD = :CODIGO AND PT.ptvt_id = P.PTVT_ID AND PEDI_VENCE >= :FECHA AND PEDI_FECHA <= :FECHA AND PEDE_ANULADO = 'N'
                        INTO :ID, :ITEM, :CANT2
                        do
                        BEGIN
                        EXECUTE PROCEDURE FALTANTE(34, 31, ID, ITEM) returning_values (ORDENC, UND, FACTOR);
                        if ((ORDENC * FACTOR = CANT2) or (PEDAUTO = 'SI')) then  $$IBE$$*/ /* SI NO SE HA FACTURADO MIRE A VER SI SE REMISIONO */ /*$$IBE$$ 
                            EXECUTE PROCEDURE FALTANTE(34, 32, ID, ITEM) returning_values (ORDENC, UND, FACTOR);
                        if (ORDENC IS NULL) then
                            ORDENC = 0;
                        PEDIDO = PEDIDO + ORDENC * FACTOR;
                        END
                    if (PEDIDO IS NULL) then
                        PEDIDO = 0;
                    RESERVADO = RESERVADO + PEDIDO;
                    END
                ELSE
                    BEGIN
                    RESERVADO = 0;
                    ORDENADO = 0;
                    END
                if (ENPESO = 'S') then
                    BEGIN
                    if (pesounit IS NULL) then
                        pesounit = 0;
                    if (PESOUNIT <> 0) then
                        BEGIN
                        pesototal = PESOUNIT * cant;
                        SUSPEND;
                        END
                    END
                ELSE
                    SUSPEND;
                END
            END
        END
  END
 $$IBE$$*/ SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE INVENTARIO_FAMILIA(
    FECHA DATE,
    FAMILIA VARCHAR(20))
RETURNS (
    ARTICULO VARCHAR(20),
    INTERNO VARCHAR(20),
    DESCRIPCION VARCHAR(60),
    CANTIDAD NUMERIC(18,2),
    UNIDAD VARCHAR(8),
    TOTAL NUMERIC(18,2))
AS
declare variable COSTO NUMERIC(18,4);
begin /*$$IBE$$ 
FOR SELECT A.ARTI_COD, ARTI_DES, ARTI_UNIDAD, p.pvar_cod FROM ARTICULO A, PROVEEDOR_ARTICULO P
    WHERE ESAR_COD <> 'I' AND A.arti_cod = P.arti_cod AND P.terc_nit = :FAMILIA
    INTO :ARTICULO, :descripcion, :UNIDAD, :INTERNO
    DO
    BEGIN
    EXECUTE PROCEDURE SALDO_INICIAL_TOTAL_INV(ARTICULO, FECHA) returning_values (cantidad);
    EXECUTE PROCEDURE COSTO_PROMEDIO_UNIDAD(ARTICULO, FECHA, UNIDAD) returning_values (COSTO);
    TOTAL = COSTO * CANTIDAD;
    suspend;
    END
 $$IBE$$*/ SUSPEND;
end
^

SET TERM ; ^

SET TERM ^ ;

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

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE DEVOLUCIONES_SIN_CONTABILIDAD(
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    ID INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    ESTADO VARCHAR(20),
    IDI INTEGER,
    IDC INTEGER)
AS
DECLARE VARIABLE VER CHAR(2);
declare variable FECICNT VARCHAR(10);
declare variable FECFCNT VARCHAR(10);
declare variable ERROR INTEGER;
declare variable idref INTEGER;
BEGIN /*$$IBE$$ 
EXECUTE PROCEDURE fecha_a_conta(FECINI) returning_values (FECICNT);
EXECUTE PROCEDURE fecha_a_conta(FECFIN) returning_values (FECFCNT);
FOR SELECT DEVT_ID, PREF_PRE, DEVT_NUMERO FROM devoluciones_ventas WHERE DEVT_ANULADO = 'N' AND
    DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN
    INTO :ID, :PREF, :NUMERO
DO
  BEGIN
  idref = null;
  SELECT ENCO_IDREF FROM COMPROBANTE_ENCABEZADO WHERE ENCO_TIPOREF = 33 AND ENCO_FECHA >= :FECICNT AND ENCO_FECHA <= :FECFCNT and ENCO_IDREF = :id into :idref;
  if (idref IS NULL) then
  begin
   ESTADO = 'PROCESANDO';
   SUSPEND;
   SELECT MAX(INVE_ID) FROM INTERFAZ_VENTAS WHERE PREF_PRE = :PREF AND TIDO_COD = 33 INTO :IDI;
   EXECUTE PROCEDURE contabil_devolcli (:ID, :IDI) RETURNING_VALUES (:ERROR, :VER, :IDC);
   if (ERROR = 0) then
    BEGIN
    EXECUTE PROCEDURE CONTABILIZA_PENDIENTE (:IDC);
    ESTADO = 'OK';
    END
   ELSE
    ESTADO = 'ERROR';
   suspend;
  End
  END
 $$IBE$$*/ SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE FACTURAS_SIN_CONTABILIDAD(
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    ID INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    ESTADO VARCHAR(20),
    IDI INTEGER,
    IDC INTEGER)
AS
DECLARE VARIABLE VER CHAR(2);
declare variable FECICNT VARCHAR(10);
declare variable FECFCNT VARCHAR(10);
declare variable ERROR INTEGER;
declare variable idref INTEGER;
BEGIN /*$$IBE$$ 
EXECUTE PROCEDURE fecha_a_conta(FECINI) returning_values (FECICNT);
EXECUTE PROCEDURE fecha_a_conta(FECFIN) returning_values (FECFCNT);
FOR SELECT FACT_ID, PREF_PRE, FACT_NUMERO FROM FACTURAS WHERE FACT_ANULADO = 'N' AND
    FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN INTO :ID, :PREF, :NUMERO
DO
  BEGIN
  idref = null;
  SELECT ENCO_IDREF FROM COMPROBANTE_ENCABEZADO WHERE ENCO_TIPOREF = 31 AND ENCO_FECHA >= :FECICNT AND ENCO_FECHA <= :FECFCNT and ENCO_IDREF = :ID into :idref;
  if (idref IS NULL) then
  begin
   ESTADO = 'PROCESANDO';
   ERROR = NULL;
   SUSPEND;
   SELECT MAX(INVE_ID) FROM INTERFAZ_VENTAS WHERE PREF_PRE = :PREF AND TIDO_COD = 31 INTO :IDI;
   EXECUTE PROCEDURE CONTABIL_FACTURA (:ID, :IDI) RETURNING_VALUES (:ERROR, VER, :IDC);
   if ((ERROR = 0) or (error IS NULL)) then
    BEGIN
    EXECUTE PROCEDURE CONTABILIZA_PENDIENTE (:IDC);
    ESTADO = 'OK';
    END
   ELSE
    ESTADO = 'ERROR';
   suspend;
  end
  END
 $$IBE$$*/ SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE COSTO_EN_VENTAS(
    TIPO INTEGER,
    ID INTEGER)
AS
declare variable FECHA DATE;
declare variable ARTICULO VARCHAR(20);
declare variable CANTIDAD NUMERIC(18,4);
declare variable COSTO NUMERIC(18,2);
declare variable CTACOSTO VARCHAR(20);
declare variable CTAINVEN VARCHAR(20);
BEGIN
DELETE FROM COSTO_VENTAS;
if (TIPO = 31) then
    BEGIN
    /* FACTURA DE VENTA */
    FOR SELECT D.ARTI_COD, FADE_CANT * FADE_FACTOR, FACT_FECHA
        FROM ARTICULO A, FACTURAS F, FACTURAS_DETALLE D
        WHERE F.FACT_ID = D.FACT_ID AND A.ARTI_COD = D.ARTI_COD AND F.FACT_ID = :ID AND FACT_ANULADO = 'N'
        INTO :ARTICULO, :CANTIDAD, :FECHA
        DO
        BEGIN
        SELECT COAR_CTACOS, COAR_CTAINV FROM CONTABIL_ARTICULO WHERE ARTI_COD = :articulo INTO :CTACOSTO, :CTAINVEN;
        EXECUTE PROCEDURE COSTO_PROMEDIO(:ARTICULO, :FECHA) returning_values (:COSTO);
        INSERT INTO COSTO_VENTAS VALUES (:ARTICULO, :CANTIDAD, :COSTO, :CTACOSTO, :CTAINVEN);
        END
    END
if (TIPO = 32) then
    BEGIN
    /* REMISION */
    FOR SELECT D.ARTI_COD, RVDE_CANT * RVDE_FACTOR, REVT_FECHA
        FROM ARTICULO A, REMISIONES_VENTA R, REMISIONES_VENTA_DETALLE D
        WHERE R.REVT_ID = D.REVT_ID AND A.ARTI_COD = D.ARTI_COD AND R.REVT_ID = :ID AND REVT_ANULADO = 'N'
        INTO :ARTICULO, :CANTIDAD, :FECHA
        DO
        BEGIN
        SELECT COAR_CTACOS, COAR_CTAINV FROM CONTABIL_ARTICULO WHERE ARTI_COD = :articulo INTO :CTACOSTO, :CTAINVEN;
        EXECUTE PROCEDURE COSTO_PROMEDIO(:ARTICULO, :FECHA) returning_values (:COSTO);
        INSERT INTO COSTO_VENTAS VALUES (:ARTICULO, :CANTIDAD, :COSTO, :CTACOSTO, :CTAINVEN);
        END
    END
if (TIPO = 33) then
    BEGIN
    /* DEVOLUCION */
    FOR SELECT D.ARTI_COD, DVDE_CANT * DVDE_FACTOR, DEVT_FECHA
        FROM ARTICULO A, DEVOLUCIONES_VENTAS DV, DEVOLUCIONES_VENTAS_DETALLE D
        WHERE DV.DEVT_ID = D.DEVT_ID AND A.ARTI_COD = D.ARTI_COD AND DV.DEVT_ID = :ID AND DEVT_ANULADO = 'N'
        INTO :ARTICULO, :CANTIDAD, :FECHA
        DO
        BEGIN
        SELECT COAR_CTACOS, COAR_CTAINV FROM CONTABIL_ARTICULO WHERE ARTI_COD = :articulo INTO :CTACOSTO, :CTAINVEN;
        EXECUTE PROCEDURE COSTO_PROMEDIO(:ARTICULO, :FECHA) returning_values (:COSTO);
        INSERT INTO COSTO_VENTAS VALUES (:ARTICULO, :CANTIDAD, :COSTO, :CTACOSTO, :CTAINVEN);
        END
    END
END

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE COSTO_EN_VENTAS_CONTADO(
    FECFAC DATE,
    PREF VARCHAR(4),
    PTVTA INTEGER)
AS
declare variable ARTICULO VARCHAR(20);
declare variable CANTIDAD NUMERIC(18,4);
declare variable COSTO NUMERIC(18,2);
declare variable CTACOSTO VARCHAR(20);
declare variable CTAINVEN VARCHAR(20);
BEGIN
    DELETE FROM COSTO_VENTAS;
    /* FACTURA DE VENTA */
    FOR SELECT MAX(D.ARTI_COD), SUM(FADE_CANT * FADE_FACTOR), MAX(COAR_CTACOS), MAX(COAR_CTAINV)
        FROM ARTICULO A, FACTURAS F, FACTURAS_DETALLE D, CONTABIL_ARTICULO C
        WHERE F.FACT_ID = D.FACT_ID AND A.ARTI_COD = D.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND FACT_ANULADO = 'N' AND FACT_FECHA = :FECFAC AND F.PREF_PRE = :PREF AND F.PTVT_ID = :PTVTA and substring(a.arti_cod from 1 FOR 2) <> '.t'
        GROUP BY D.ARTI_COD
        INTO :ARTICULO, :CANTIDAD, :CTACOSTO, :CTAINVEN
        DO
        BEGIN
        EXECUTE PROCEDURE COSTO_PROMEDIO(:ARTICULO, :FECFAC) returning_values (:COSTO);
        INSERT INTO COSTO_VENTAS VALUES (:ARTICULO, :CANTIDAD, :COSTO * :CANTIDAD, :CTACOSTO, :CTAINVEN);
        END
END

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE COSTO_PROMEDIO_UNIDAD(
    ARTICULO VARCHAR(15),
    FECHA DATE,
    UNIDAD VARCHAR(8))
RETURNS (
    COSTO NUMERIC(18,2))
AS
declare variable FACTOR NUMERIC(15,4);
BEGIN
  EXECUTE PROCEDURE COSTO_PROMEDIO(ARTICULO, FECHA) returning_values (COSTO);
  EXECUTE PROCEDURE FACTOR_UNIDAD_CANT(ARTICULO, UNIDAD) returning_values (FACTOR);
  COSTO = COSTO * FACTOR;
  SUSPEND;
END

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE IMPR_AJUSTE(
    ID INTEGER)
RETURNS (
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    CONCEPTO VARCHAR(60),
    CODBODEGA VARCHAR(2),
    NOMBODEGA VARCHAR(30),
    OBS BLOB SUB_TYPE 1 SEGMENT SIZE 80,
    AJUSTAR CHAR(2),
    ITEM INTEGER,
    ARTICULO VARCHAR(15),
    CODBAR VARCHAR(15),
    ARTIDES VARCHAR(60),
    EXANT NUMERIC(18,4),
    EXNUE NUMERIC(18,4),
    CANT NUMERIC(18,4),
    UNIDAD VARCHAR(8),
    BODITEM VARCHAR(2),
    LOTE VARCHAR(15),
    COSTO NUMERIC(18,2),
    TOTAL NUMERIC(18,2))
AS
BEGIN
  /*  */
  SELECT PREF_PRE, AJUS_NUMERO, AJUS_FECHA, AJUS_CONC, A.BODE_COD, BODE_NOM, AJUS_OBS, AJUS_NOAJUSTAR
    FROM AJUSTES A, BODEGA B WHERE A.BODE_COD = B.BODE_COD AND A.AJUS_ID = :ID into
    :PREF, :NUMERO, :FECHA, :CONCEPTO, :CODBODEGA, :NOMBODEGA, :OBS, :AJUSTAR;
  if (AJUSTAR = 'S') then
    AJUSTAR = 'NO';
  else
    AJUSTAR = 'SI';
  FOR SELECT AJUS_ITEM, A.ARTI_COD, AJUS_CODBAR, AJDE_DESC, AJUS_EXANT, AJUS_UNIDAD, BODE_COD, AJUS_EXNUE, AJUS_LOTE
    FROM AJUSTES_DETALLE D, ARTICULO A
    WHERE D.ARTI_COD = A.ARTI_COD AND D.AJUS_ID = :ID
    ORDER BY AJUS_ITEM
    INTO :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :EXANT, :UNIDAD, :BODITEM, :EXNUE, :LOTE
    DO
      BEGIN
      EXECUTE PROCEDURE COSTO_PROMEDIO(:ARTICULO, :FECHA) returning_values (:COSTO);
      CANT = EXNUE - EXANT;
      TOTAL = CANT * COSTO;
      SUSPEND;
      END
END

^

SET TERM ; ^

SET TERM ^ ;

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

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE REP_COMPROBANTES_ARTICULO(
    TIPODOC INTEGER,
    DETALLE CHAR(1),
    FECINI DATE,
    FECFIN DATE,
    ARTINI VARCHAR(20),
    ARTFIN VARCHAR(20),
    GRPINI VARCHAR(2),
    GRPFIN VARCHAR(2),
    ORDEN CHAR(1),
    SUBEMPRESA INTEGER)
RETURNS (
    CODIGO VARCHAR(15),
    NOMBRE VARCHAR(60),
    UNIDAD VARCHAR(8),
    CODGRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    CODSUBG VARCHAR(3),
    NOMSUBG VARCHAR(30),
    CODMARC VARCHAR(3),
    NOMMARC VARCHAR(30),
    CODBOD VARCHAR(2),
    NOMTIPO VARCHAR(30),
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    CONCEPTO VARCHAR(60),
    NIT VARCHAR(20),
    NOMTERC VARCHAR(60),
    CONS INTEGER,
    CANT NUMERIC(18,4),
    COSTO NUMERIC(18,2),
    COSTOTOT NUMERIC(18,2))
AS
declare variable ENT CHAR(1);
declare variable ENTRADAS NUMERIC(18,4);
declare variable COSTOENT NUMERIC(18,2);
declare variable SALIDAS NUMERIC(18,4);
declare variable COSTOSAL NUMERIC(18,2);
declare variable CODINI VARCHAR(20);
declare variable CODFIN VARCHAR(20);
declare variable DESINI VARCHAR(20);
declare variable DESFIN VARCHAR(20);
BEGIN
  SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = :TIPODOC INTO :NOMTIPO;
  if (ORDEN = 'C') then
    BEGIN
    CODINI = ARTINI;
    CODFIN = ARTFIN;
    DESINI = '';
    DESFIN = 'zz';
    END
  ELSE
    BEGIN
    DESINI = ARTINI;
    DESFIN = ARTFIN;
    CODINI = '';
    CODFIN = 'zz';
    END
  FOR
    SELECT ARTI_COD, ARTI_DES, ARTI_UNIDAD, A.GRUP_COD, A.SUBG_COD, A.MARC_COD
      FROM ARTICULO A
      WHERE ARTI_COD >= :CODINI AND ARTI_COD <= :CODFIN AND A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :GRPFIN AND ARTI_DES >= :DESINI AND ARTI_DES <= :DESFIN
      INTO :CODIGO, :NOMBRE, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
      DO
        BEGIN
        NOMMARC = '';
        NOMSUBG = '';
        SELECT GRUP_NOM FROM GRUPO WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
        SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
        SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
        if (DETALLE = 'N') then
            BEGIN
            CANT = 0;
            COSTOTOT = 0;
            /* SUME LAS ENTRADAS */
            SELECT SUM(MVAR_CANT), SUM(MVAR_CANT * MVAR_COSTO) FROM MOVIMIENTO_ARTICULO M, PREFIJOS P
              WHERE P.PREF_PRE = M.MVAR_PREF AND P.TIDO_COD = M.mvar_tipodoc AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA)) AND
              (MVAR_FECHA >= :FECINI) AND (MVAR_FECHA < :FECFIN) AND
              (ARTI_COD = :CODIGO) AND (MVAR_ENTRADA = 'S') AND (MVAR_TIPODOC = :TIPODOC)
              INTO :ENTRADAS, :COSTOENT;
            if (ENTRADAS IS NULL) then
              ENTRADAS = 0;
            if (COSTOENT IS NULL) then
              COSTOENT = 0;
            /* CALCULE LAS SALIDAS A COSTO PROMEDIO */
            SALIDAS = 0;
            COSTOSAL = 0;
            FOR SELECT MVAR_CANT, MVAR_FECHA
                FROM MOVIMIENTO_ARTICULO M, PREFIJOS P
                WHERE P.PREF_PRE = M.MVAR_PREF AND P.TIDO_COD = M.mvar_tipodoc AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA)) AND
                (MVAR_FECHA >= :FECINI) AND (MVAR_FECHA <= :FECFIN) AND
                (ARTI_COD = :CODIGO) AND (MVAR_ENTRADA = 'N') AND (MVAR_TIPODOC = :TIPODOC)
                INTO :CANT, :FECHA
                DO
                    BEGIN
                    EXECUTE PROCEDURE COSTO_PROMEDIO(:CODIGO, :FECHA) returning_values (:COSTO);
                    SALIDAS = SALIDAS + CANT;
                    COSTOSAL = COSTOSAL + (COSTO * CANT);
                    END
            if (SALIDAS IS NULL) then
              SALIDAS = 0;
            if (COSTOSAL IS NULL) then
              COSTOSAL = 0;
            if (ENTRADAS > 0) then
                CANT = ENTRADAS;
            if (SALIDAS > 0) then
                CANT = SALIDAS;
            if (COSTOENT > 0) then
                COSTOTOT = COSTOENT;
            if (COSTOSAL > 0) then
                COSTOTOT = COSTOSAL;
            if (CANT > 0) then
                COSTO = COSTOTOT / CANT;
            ELSE
                COSTO = 0;
            if (CANT <> 0) then
                SUSPEND;
            END
        ELSE
            BEGIN
            FOR SELECT MVAR_ENTRADA, MVAR_PREF, MVAR_NUMERO, MVAR_CANT, MVAR_COSTO, MVAR_CONC, MVAR_FECHA, M.TERC_NIT, TERC_NOM, MVAR_CONS, BODE_COD
                FROM MOVIMIENTO_ARTICULO M, TIPO_DOCUMENTO TD, PREFIJOS P
                LEFT OUTER JOIN TERCEROS T ON (M.TERC_NIT = T.TERC_NIT)
                WHERE TD.TIDO_COD = MVAR_TIPODOC AND P.PREF_PRE = M.MVAR_PREF AND P.TIDO_COD = M.mvar_tipodoc AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA)) AND
                (MVAR_FECHA >= :FECINI) AND (MVAR_FECHA < :FECFIN) AND (ARTI_COD = :CODIGO) AND (MVAR_TIPODOC = :TIPODOC)
                ORDER BY MVAR_FECHA, MVAR_CONS
                INTO :ENT, :PREFIJO, :NUMERO, :CANT, :COSTO, :CONCEPTO, :FECHA, :NIT, :NOMTERC, :CONS, :CODBOD
                DO
                    BEGIN
                    if (ENT = 'S') then
                        BEGIN
                        COSTOTOT = (CANT * COSTO);
                        end
                    ELSE
                        BEGIN
                        EXECUTE PROCEDURE COSTO_PROMEDIO(:CODIGO, :FECHA) returning_values (:COSTO);
                        COSTOTOT = (CANT * COSTO);
                        END
                    SUSPEND;
                    END
            END
        END
END

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE REP_COMPROBANTES_INV(
    TIPO INTEGER,
    DETALLE CHAR(1),
    FECINI DATE,
    FECFIN DATE,
    PREFIJO VARCHAR(4),
    ANULADOS CHAR(1),
    SUBEMPRESA INTEGER)
RETURNS (
    NOMTIPO VARCHAR(30),
    ID INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    VENCE DATE,
    CONCEPTO VARCHAR(60),
    REFER VARCHAR(60),
    CODBODORI VARCHAR(2),
    NOMBODORI VARCHAR(30),
    CODBODDES VARCHAR(2),
    NOMBODDES VARCHAR(30),
    NOMTERCERO VARCHAR(60),
    PRODCODBAR VARCHAR(15),
    PRODDES VARCHAR(60),
    PRODCANT NUMERIC(18,4),
    PRODUNIDAD VARCHAR(8),
    PRODLOTE VARCHAR(15),
    OBS BLOB SUB_TYPE 0 SEGMENT SIZE 80,
    ITEM INTEGER,
    ARTICULO VARCHAR(15),
    CODBAR VARCHAR(15),
    ARTIDES VARCHAR(60),
    CANT NUMERIC(18,4),
    EXANT NUMERIC(18,4),
    UNIDAD VARCHAR(8),
    BODITEM VARCHAR(2),
    COSTO NUMERIC(18,2),
    DTOPORC NUMERIC(9,2),
    DTOMONTO NUMERIC(18,2),
    IVAPORC NUMERIC(9,2),
    IVAMONTO NUMERIC(18,2),
    CONSUMO NUMERIC(18,2),
    SUBTOTAL NUMERIC(18,2),
    TOTAL NUMERIC(18,2),
    LOTE VARCHAR(15),
    ANULADO CHAR(1),
    OBSITEM BLOB SUB_TYPE 0 SEGMENT SIZE 80)
AS
BEGIN
  /* DETERMINE LA TABLA A EXAMINAR */
  if (BIN_AND(TIPO, 1) <> 0) then
    BEGIN
    SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 11 INTO :NOMTIPO;
    FOR SELECT ENTR_ID, E.PREF_PRE, ENTR_NUMERO, ENTR_FECHA, ENTR_CONC, ENTR_REFER, E.BODE_COD, BODE_NOM, ENTR_NOMTERC, ENTR_OBS, ENTR_ANULADO
    FROM ENTRADAS E, BODEGA B, PREFIJOS P
    WHERE E.BODE_COD = B.BODE_COD AND ENTR_FECHA >= :FECINI AND ENTR_FECHA <= :FECFIN
     AND P.PREF_PRE = E.PREF_PRE AND P.TIDO_COD = 11 AND ((P.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
    ORDER BY ENTR_FECHA, ENTR_ID
    INTO :ID, :PREF, :NUMERO, :FECHA, :CONCEPTO, :REFER, :CODBODORI, :NOMBODORI, :NOMTERCERO, :OBS, :ANULADO
    DO
        BEGIN
        if (((:PREFIJO = '') or (:PREF = :PREFIJO)) AND ((:ANULADOS = 'S') or (:ANULADO = 'N'))) then
            BEGIN
            if (anulado = 'S') then
             BEGIN
              ITEM = 0;
              ARTICULO = '';
              CODBAR = '';
              ARTIDES = '';
              CANT = 0;
              UNIDAD = '';
              BODITEM = '';
              lote = '';
              costo = 0;
              DTOPORC = 0;
              DTOMONTO = 0;
              IVAPORC = 0;
              IVAMONTO = 0;
              CONSUMO = 0;
              TOTAL = 0;
              OBSITEM = null;
              SUBTOTAL = 0;
              SUSPEND;
             END
            ELSE
             BEGIN
              if (DETALLE = 'S') then
                FOR SELECT ENDE_ITEM, A.ARTI_COD, ENDE_CODBAR, ENDE_DESC, ENDE_CANT, ENDE_UNIDAD, BODE_COD, ENDE_COSTO, ENDE_DTOPORC, ENDE_DTOMONTO, ENDE_IVAPORC, ENDE_IVAMONTO, ENDE_CONSUMO, ENDE_TOTAL, ENDE_LOTE, ENDE_OBS
                    FROM ENTRADAS_DETALLE D, ARTICULO A WHERE D.ARTI_COD = A.ARTI_COD AND D.ENTR_ID = :ID INTO
                    :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :BODITEM, :COSTO, :DTOPORC, :DTOMONTO, :IVAPORC, :IVAMONTO, :CONSUMO, :TOTAL, :LOTE, :OBSITEM
                    DO
                    BEGIN
                    SUBTOTAL = TOTAL - IVAMONTO - CONSUMO;
                    SUSPEND;
                    END
              ELSE
                BEGIN
                SELECT SUM(ENDE_IVAMONTO), SUM(ENDE_CONSUMO), SUM(ENDE_TOTAL)
                    FROM ENTRADAS_DETALLE D WHERE D.ENTR_ID = :ID INTO
                    :IVAMONTO, :CONSUMO, :TOTAL;
                SUBTOTAL = TOTAL - IVAMONTO - CONSUMO;
                SUSPEND;
                END
             END
            END
        END
    END
  if (BIN_AND(TIPO, 2) <> 0) then
    BEGIN
    SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 12 INTO :NOMTIPO;
    FOR SELECT SALI_ID, S.PREF_PRE, SALI_NUMERO, SALI_FECHA, SALI_CONC, SALI_REFER, S.BODE_COD, BODE_NOM, SALI_NOMTERC, SALI_OBS, SALI_ANULADO
    FROM SALIDAS S, BODEGA B, PREFIJOS P
    WHERE S.BODE_COD = B.BODE_COD AND SALI_FECHA >= :FECINI AND SALI_FECHA <= :FECFIN 
     AND P.PREF_PRE = S.PREF_PRE AND P.TIDO_COD = 12 AND ((P.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
    ORDER BY SALI_FECHA, SALI_ID
    into :ID, :PREF, :NUMERO, :FECHA, :CONCEPTO, :REFER, :CODBODORI, :NOMBODORI, :NOMTERCERO, :OBS, :ANULADO
    DO
        BEGIN
        if (((:PREFIJO = '') or (:PREF = :PREFIJO)) AND ((:ANULADOS = 'S') or (:ANULADO = 'N'))) then
            BEGIN
            if (anulado = 'S') then
             BEGIN
              ITEM = 0;
              ARTICULO = '';
              CODBAR = '';
              ARTIDES = '';
              CANT = 0;
              UNIDAD = '';
              BODITEM = '';
              lote = '';
              costo = 0;
              DTOPORC = 0;
              DTOMONTO = 0;
              IVAPORC = 0;
              IVAMONTO = 0;
              CONSUMO = 0;
              EXANT = 0;
              TOTAL = 0;
              OBSITEM = null;
              SUBTOTAL = 0;
              SUSPEND;
             END
            ELSE
             BEGIN
              if (DETALLE = 'S') then
                FOR SELECT SADE_ITEM, A.ARTI_COD, SADE_CODBAR, SADE_DESC, SADE_CANT, SADE_UNIDAD, BODE_COD, SADE_COSTO, SADE_IVAPORC, SADE_IVAMONTO, SADE_CONSUMO, SADE_TOTAL, SADE_LOTE, SADE_OBS
                    FROM SALIDAS_DETALLE D, ARTICULO A WHERE D.ARTI_COD = A.ARTI_COD AND D.SALI_ID = :ID INTO
                    :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :BODITEM, :COSTO, :IVAPORC, :IVAMONTO, :CONSUMO, :TOTAL, :LOTE, :OBSITEM
                    DO
                BEGIN
                SUBTOTAL = TOTAL - IVAMONTO - CONSUMO;
                SUSPEND;
                END
              ELSE
                BEGIN
                SELECT SUM(SADE_IVAMONTO), SUM(SADE_CONSUMO), SUM(SADE_TOTAL)
                    FROM SALIDAS_DETALLE D WHERE D.SALI_ID = :ID INTO
                    :IVAMONTO, :CONSUMO, :TOTAL;
                SUBTOTAL = TOTAL - IVAMONTO - CONSUMO;
                SUSPEND;
                END
             END
            END
        END
    END
  if (BIN_AND(TIPO, 4) <> 0) then
    BEGIN
    SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 13 INTO :NOMTIPO;
    FOR SELECT TRAN_ID, T.PREF_PRE, TRAN_NUMERO, TRAN_FECHA, TRAN_CONC, TRAN_REFER, T.BODE_COD, BO.BODE_NOM, TRAN_BODDES, BD.BODE_NOM, TRAN_OBS, TRAN_ANULADO
    FROM TRASFERENCIAS T, BODEGA BO, BODEGA BD, PREFIJOS P
    WHERE T.BODE_COD = BO.BODE_COD AND T.TRAN_BODDES = BD.BODE_COD AND TRAN_FECHA >= :FECINI AND TRAN_FECHA <= :FECFIN 
     AND P.PREF_PRE = T.PREF_PRE AND P.TIDO_COD = 13 AND ((P.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
    ORDER BY TRAN_FECHA, TRAN_ID
    into :ID, :PREF, :NUMERO, :FECHA, :CONCEPTO, :REFER, :CODBODORI, :NOMBODORI, :CODBODDES, :NOMBODDES, :OBS, :ANULADO
    DO
        BEGIN
        if (((:PREFIJO = '') or (:PREF = :PREFIJO)) AND ((:ANULADOS = 'S') or (:ANULADO = 'N'))) then
            BEGIN
            if (anulado = 'S') then
             BEGIN
              ITEM = 0;
              ARTICULO = '';
              CODBAR = '';
              ARTIDES = '';
              CANT = 0;
              UNIDAD = '';
              BODITEM = '';
              lote = '';
              costo = 0;
              DTOPORC = 0;
              DTOMONTO = 0;
              IVAPORC = 0;
              IVAMONTO = 0;
              CONSUMO = 0;
              EXANT = 0;
              TOTAL = 0;
              OBSITEM = null;
              SUBTOTAL = 0;
              SUSPEND;
             END
            ELSE
             BEGIN
              if (DETALLE = 'S') then
                FOR SELECT TRAS_ITEM, A.ARTI_COD, TRAS_CODBAR, TRAS_DESC, TRAS_CANT, TRAS_UNIDAD, TRAS_COSTO, TRAS_IVAPORC, TRAS_IVAMONTO, TRAS_CONSUMO, TRAS_TOTAL, TRAS_LOTE, TRAS_OBS
                    FROM TRASFERENCIAS_DETALLE D, ARTICULO A WHERE D.ARTI_COD = A.ARTI_COD AND D.TRAN_ID = :ID INTO
                    :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :COSTO, :IVAPORC, :IVAMONTO, :CONSUMO, :TOTAL, :LOTE, :OBSITEM
                    DO
                    BEGIN
                    SUBTOTAL = TOTAL - IVAMONTO - CONSUMO;
                    SUSPEND;
                    END
              ELSE
                BEGIN
                SELECT SUM(TRAS_IVAMONTO), SUM(TRAS_CONSUMO), SUM(TRAS_TOTAL) FROM trasferencias_detalle D
                    WHERE D.TRAN_ID = :ID INTO :IVAMONTO, :CONSUMO, :TOTAL;
                SUBTOTAL = TOTAL - IVAMONTO - CONSUMO;
                SUSPEND;
                END
             END
            END
        END
    END
  if (BIN_AND(TIPO, 8) <> 0) then
    BEGIN
    SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 14 INTO :NOMTIPO;
    FOR SELECT AJUS_ID, A.PREF_PRE, AJUS_NUMERO, AJUS_FECHA, AJUS_CONC, A.BODE_COD, BODE_NOM, AJUS_OBS, AJUS_ANULADO
    FROM AJUSTES A, BODEGA B, PREFIJOS P
    WHERE A.BODE_COD = B.BODE_COD AND AJUS_FECHA >= :FECINI AND AJUS_FECHA <= :FECFIN 
     AND P.PREF_PRE = A.PREF_PRE AND P.TIDO_COD = 14 AND ((P.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
    ORDER BY AJUS_FECHA, AJUS_ID
    into :ID, :PREF, :NUMERO, :FECHA, :CONCEPTO, :CODBODORI, :NOMBODORI, :OBS, :ANULADO
    DO
        BEGIN
        if (((:PREFIJO = '') or (:PREF = :PREFIJO)) AND ((:ANULADOS = 'S') or (:ANULADO = 'N'))) then
            BEGIN
            if (anulado = 'S') then
             BEGIN
              ITEM = 0;
              ARTICULO = '';
              CODBAR = '';
              ARTIDES = '';
              CANT = 0;
              UNIDAD = '';
              BODITEM = '';
              lote = '';
              costo = 0;
              DTOPORC = 0;
              DTOMONTO = 0;
              IVAPORC = 0;
              IVAMONTO = 0;
              CONSUMO = 0;
              EXANT = 0;
              TOTAL = 0;
              OBSITEM = null;
              SUBTOTAL = 0;
              SUSPEND;
             END
            ELSE
             BEGIN
              if (DETALLE = 'S') then
                FOR SELECT AJUS_ITEM, A.ARTI_COD, AJUS_CODBAR, AJDE_DESC, AJUS_EXANT, AJUS_UNIDAD, BODE_COD, AJUS_EXNUE, AJUS_LOTE, AJDE_OBS
                    FROM AJUSTES_DETALLE D, ARTICULO A WHERE D.ARTI_COD = A.ARTI_COD AND D.AJUS_ID = :ID INTO
                    :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :EXANT, :UNIDAD, :BODITEM, :CANT, :LOTE, :OBSITEM
                    DO
                      BEGIN
                      EXECUTE PROCEDURE COSTO_PROMEDIO(:ARTICULO, :FECHA) returning_values (:COSTO);
                      TOTAL = (CANT - EXANT) * COSTO;
                      SUBTOTAL = TOTAL;
                      SUSPEND;
                      END
              ELSE
                BEGIN
                TOTAL = 0;
                FOR SELECT ARTI_COD, AJUS_EXNUE, AJUS_EXANT FROM AJUSTES_DETALLE D WHERE D.AJUS_ID = :ID INTO
                    :ARTICULO, :CANT, :EXANT
                    DO
                      BEGIN
                      EXECUTE PROCEDURE COSTO_PROMEDIO(:ARTICULO, :FECHA) returning_values (:COSTO);
                      TOTAL = TOTAL + ((CANT - EXANT) * COSTO);
                      SUBTOTAL = TOTAL;
                      END
                SUSPEND;
                END
             END
            END
        END
    END
  if (BIN_AND(TIPO, 16) <> 0) then
    BEGIN
    SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 15 INTO :NOMTIPO;
    FOR SELECT ENSA_ID, E.PREF_PRE, ENSA_NUMERO, ENSA_FECHA, ENSA_CONC, ENSA_REFER, E.BODE_COD, BODE_NOM, ENSA_CODBAR, ENSA_DESC, ENSA_CANT, ENSA_UNIDAD, ENSA_LOTE, ENSA_OBS, ENSA_ANULADO
    FROM ENSAMBLES E, BODEGA B, PREFIJOS P
    WHERE E.BODE_COD = B.BODE_COD AND E.ENSA_FECHA >= :FECINI AND E.ENSA_FECHA <= :FECFIN
     AND P.PREF_PRE = E.PREF_PRE AND P.TIDO_COD = 15 AND ((P.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
    ORDER BY ENSA_FECHA, ENSA_ID
    into :ID, :PREF, :NUMERO, :FECHA, :CONCEPTO, :REFER, :CODBODORI, :NOMBODORI, :PRODCODBAR, :PRODDES, :PRODCANT, :PRODUNIDAD, :PRODLOTE, :OBS, :ANULADO
    DO
        BEGIN
        if (((:PREFIJO = '') or (:PREF = :PREFIJO)) AND ((:ANULADOS = 'S') or (:ANULADO = 'N'))) then
            BEGIN
            if (anulado = 'S') then
             BEGIN
              ITEM = 0;
              ARTICULO = '';
              CODBAR = '';
              ARTIDES = '';
              CANT = 0;
              UNIDAD = '';
              BODITEM = '';
              lote = '';
              costo = 0;
              DTOPORC = 0;
              DTOMONTO = 0;
              IVAPORC = 0;
              IVAMONTO = 0;
              CONSUMO = 0;
              EXANT = 0;
              TOTAL = 0;
              OBSITEM = null;
              SUBTOTAL = 0;
              SUSPEND;
             END
            ELSE
             BEGIN
              if (DETALLE = 'S') then
                FOR SELECT ESDE_ITEM, A.ARTI_COD, ESDE_CODBAR, ESDE_DESC, ESDE_CANT, ESDE_UNIDAD, BODE_COD, ESDE_COSTO, ESDE_IVAPORC, ESDE_IVAMONTO, ESDE_CONSUMO, ESDE_TOTAL, ESDE_LOTE, ESDE_OBS
                    FROM ensambles_detalle D, ARTICULO A WHERE D.ARTI_COD = A.ARTI_COD AND D.ENSA_ID = :ID INTO
                    :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :BODITEM, :COSTO, :IVAPORC, :IVAMONTO, :CONSUMO, :TOTAL, :LOTE, :OBSITEM
                    DO
                    BEGIN
                    SUBTOTAL = TOTAL - IVAMONTO - CONSUMO;
                    SUSPEND;
                    END
              ELSE
                BEGIN
                SELECT SUM(ESDE_IVAMONTO), SUM(ESDE_CONSUMO), SUM(ESDE_TOTAL) FROM ENSAMBLES_detalle D WHERE D.ENSA_ID = :ID INTO
                    :IVAMONTO, :CONSUMO, :TOTAL;
                SUBTOTAL = TOTAL - IVAMONTO - CONSUMO;
                SUSPEND;
                END
             END
            END
        END
    END
  if (BIN_AND(TIPO, 32) <> 0) then
    BEGIN
    SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 16 INTO :NOMTIPO;
    FOR SELECT DESE_ID, E.PREF_PRE, DESE_NUMERO, DESE_FECHA, DESE_CONC, DESE_REFER, E.BODE_COD, BODE_NOM, DESE_CODBAR, DESE_DESC, DESE_CANT, DESE_UNIDAD, DESE_LOTE, DESE_OBS, DESE_ANULADO
    FROM DESENSAMBLES E, BODEGA B, PREFIJOS P
    WHERE E.BODE_COD = B.BODE_COD AND DESE_FECHA >= :FECINI AND DESE_FECHA <= :FECFIN 
     AND P.PREF_PRE = E.PREF_PRE AND P.TIDO_COD = 16 AND ((P.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
    ORDER BY DESE_FECHA, DESE_ID
    into :ID, PREF, :NUMERO, :FECHA, :CONCEPTO, :REFER, :CODBODORI, :NOMBODORI, :PRODCODBAR, :PRODDES, :PRODCANT, :PRODUNIDAD, :PRODLOTE, :OBS, :ANULADO
    DO
        BEGIN
        if (((:PREFIJO = '') or (:PREF = :PREFIJO)) AND ((:ANULADOS = 'S') or (:ANULADO = 'N'))) then
            BEGIN
            if (anulado = 'S') then
             BEGIN
              ITEM = 0;
              ARTICULO = '';
              CODBAR = '';
              ARTIDES = '';
              CANT = 0;
              UNIDAD = '';
              BODITEM = '';
              lote = '';
              costo = 0;
              DTOPORC = 0;
              DTOMONTO = 0;
              IVAPORC = 0;
              IVAMONTO = 0;
              CONSUMO = 0;
              EXANT = 0;
              TOTAL = 0;
              OBSITEM = null;
              SUBTOTAL = 0;
              SUSPEND;
             END
            ELSE
             BEGIN
              if (DETALLE = 'S') then
                FOR SELECT DESE_ITEM, A.ARTI_COD, DEDE_CODBAR, DEDE_DESC, DEDE_CANT, DEDE_UNIDAD, BODE_COD, DEDE_COSTO, DEDE_IVAPORC, DEDE_IVAMONTO, DEDE_CONSUMO, DEDE_TOTAL, DEDE_LOTE, DEDE_OBS
                    FROM desensambles_detalle D, ARTICULO A WHERE D.ARTI_COD = A.ARTI_COD AND D.DESE_ID = :ID INTO
                    :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :BODITEM, :COSTO, :IVAPORC, :IVAMONTO, :CONSUMO, :TOTAL, :LOTE, :OBSITEM
                    DO
                    BEGIN
                    SUBTOTAL = TOTAL - IVAMONTO - CONSUMO;
                    SUSPEND;
                    END
              ELSE
                BEGIN
                SELECT SUM(DEDE_IVAMONTO), SUM(DEDE_CONSUMO), SUM(DEDE_TOTAL) FROM DESENSAMBLES_detalle D WHERE D.DESE_ID = :ID INTO
                    :IVAMONTO, :CONSUMO, :TOTAL;
                SUBTOTAL = TOTAL - IVAMONTO - CONSUMO;
                SUSPEND;
                END
             END
            END
        END
    END
  if (BIN_AND(TIPO, 64) <> 0) then
    BEGIN
    SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 17 INTO :NOMTIPO;
    FOR SELECT RESE_ID, R.PREF_PRE, RESE_NUMERO, RESE_FECHA, RESE_CONC, RESE_REFER, R.BODE_COD, BODE_NOM, RESE_NOMTERC, RESE_OBS, RESE_ANULADO
    FROM RESERVAS R, BODEGA B, PREFIJOS P
    WHERE R.BODE_COD = B.BODE_COD AND R.RESE_FECHA >= :FECINI AND R.RESE_FECHA <= :FECFIN 
     AND P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = 17 AND ((P.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
    ORDER BY RESE_FECHA, RESE_ID
    into :ID, :PREF, :NUMERO, :FECHA, :CONCEPTO, :REFER, :CODBODORI, :NOMBODORI, :NOMTERCERO, :OBS, :ANULADO
    DO
        BEGIN
        if (((:PREFIJO = '') or (:PREF = :PREFIJO)) AND ((:ANULADOS = 'S') or (:ANULADO = 'N'))) then
            BEGIN
            if (anulado = 'S') then
             BEGIN
              ITEM = 0;
              ARTICULO = '';
              CODBAR = '';
              ARTIDES = '';
              CANT = 0;
              UNIDAD = '';
              BODITEM = '';
              lote = '';
              costo = 0;
              DTOPORC = 0;
              DTOMONTO = 0;
              IVAPORC = 0;
              IVAMONTO = 0;
              CONSUMO = 0;
              EXANT = 0;
              TOTAL = 0;
              OBSITEM = null;
              SUBTOTAL = 0;
              SUSPEND;
             END
            ELSE
             BEGIN
              if (DETALLE = 'S') then
                FOR SELECT RSDE_ITEM, A.ARTI_COD, RSDE_CODBAR, RSDE_DESC, RDSE_CANT, RSDE_UNIDAD, BODE_COD, RSDE_OBS
                    FROM RESERVAS_DETALLE D, ARTICULO A WHERE D.ARTI_COD = A.ARTI_COD AND D.RESE_ID = :ID INTO
                    :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :BODITEM, :OBSITEM
                    DO
                    SUSPEND;
              ELSE
                BEGIN
                SELECT SUM(RDSE_CANT) FROM RESERVAS_detalle D WHERE D.RESE_ID = :ID INTO
                    :CANT;
                SUSPEND;
                END
             END
            END
        END
    END
  if (BIN_AND(TIPO, 128) <> 0) then
    BEGIN
    SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 18 INTO :NOMTIPO;
    FOR SELECT ORIN_ID, O.PREF_PRE, ORIN_NUMERO, ORIN_FECHA, ORIN_FECLLEGA, ORIN_CONC, ORIN_REFER, ORIN_NOMTERC, ORIN_OBS, ORIN_ANULADO
        FROM ORDENES_INVENTARIO O, PREFIJOS P
        WHERE ORIN_FECHA >= :FECINI AND ORIN_FECHA <= :FECFIN 
        AND P.PREF_PRE = O.PREF_PRE AND P.TIDO_COD = 18 AND ((P.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
        ORDER BY ORIN_FECHA, ORIN_ID
        into :ID, PREF, :NUMERO, :FECHA, :VENCE, :CONCEPTO, :REFER, :NOMTERCERO, :OBS, :ANULADO
        DO
        BEGIN
        if (((:PREFIJO = '') or (:PREF = :PREFIJO)) AND ((:ANULADOS = 'S') or (:ANULADO = 'N'))) then
            BEGIN
            if (anulado = 'S') then
             BEGIN
              ITEM = 0;
              ARTICULO = '';
              CODBAR = '';
              ARTIDES = '';
              CANT = 0;
              UNIDAD = '';
              BODITEM = '';
              lote = '';
              costo = 0;
              DTOPORC = 0;
              DTOMONTO = 0;
              IVAPORC = 0;
              IVAMONTO = 0;
              CONSUMO = 0;
              EXANT = 0;
              TOTAL = 0;
              OBSITEM = null;
              SUBTOTAL = 0;
              SUSPEND;
             END
            ELSE
             BEGIN
              if (DETALLE = 'S') then
                FOR SELECT ORID_ITEM, A.ARTI_COD, ORID_CODBAR, ORID_DESC, ORID_CANT, ORID_UNIDAD, ORIN_COSTO, ORID_DTOPORC, ORID_DTOMONTO, ORID_IVAPORC, ORID_IVAMONTO, ORID_CONSUMO, ORID_TOTAL, ORID_OBS, ORID_LOTE
                    FROM ORDENINVENTARIO_DETALLE D, ARTICULO A WHERE D.ARTI_COD = A.ARTI_COD AND D.ORIN_ID = :ID INTO
                    :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :COSTO, :DTOPORC, :DTOMONTO, :IVAPORC, :IVAMONTO, :CONSUMO, :TOTAL, :OBSITEM, :LOTE
                    DO
                    BEGIN
                    SUBTOTAL = TOTAL - IVAMONTO - CONSUMO;
                    SUSPEND;
                    END
              ELSE
                BEGIN
                SELECT SUM(ORID_IVAMONTO), SUM(ORID_CONSUMO), SUM(ORID_TOTAL) FROM ordeninventario_detalle D WHERE D.ORIN_ID = :ID INTO
                    :IVAMONTO, :CONSUMO, :TOTAL;
                SUBTOTAL = TOTAL - IVAMONTO - CONSUMO;
                SUSPEND;
                END
             END
            END
        END
    END
END

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE REP_CONSECUTIVOS_INV(
    TIPO INTEGER,
    DETALLE CHAR(1),
    PREINI VARCHAR(4),
    PREFIN VARCHAR(4),
    NUMINI VARCHAR(6),
    NUMFIN VARCHAR(6),
    ANULADOS CHAR(1),
    SUBEMPRESA INTEGER)
RETURNS (
    NOMTIPO VARCHAR(30),
    ID INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    VENCE DATE,
    CONCEPTO VARCHAR(60),
    REFER VARCHAR(60),
    CODBODORI VARCHAR(2),
    NOMBODORI VARCHAR(30),
    CODBODDES VARCHAR(2),
    NOMBODDES VARCHAR(30),
    NOMTERCERO VARCHAR(60),
    PRODCODBAR VARCHAR(15),
    PRODDES VARCHAR(60),
    PRODCANT NUMERIC(18,4),
    PRODUNIDAD VARCHAR(8),
    PRODLOTE VARCHAR(15),
    OBS BLOB SUB_TYPE 0 SEGMENT SIZE 80,
    ITEM INTEGER,
    ARTICULO VARCHAR(15),
    CODBAR VARCHAR(15),
    ARTIDES VARCHAR(60),
    CANT NUMERIC(18,4),
    EXANT NUMERIC(18,4),
    UNIDAD VARCHAR(8),
    BODITEM VARCHAR(2),
    COSTO NUMERIC(18,2),
    DTOPORC NUMERIC(9,2),
    DTOMONTO NUMERIC(18,2),
    IVAPORC NUMERIC(9,2),
    IVAMONTO NUMERIC(18,2),
    CONSUMO NUMERIC(18,2),
    SUBTOTAL NUMERIC(18,2),
    TOTAL NUMERIC(18,2),
    LOTE VARCHAR(15),
    ANULADO CHAR(1),
    OBSITEM BLOB SUB_TYPE 0 SEGMENT SIZE 80)
AS
BEGIN
  /* DETERMINE LA TABLA A EXAMINAR */
  if (BIN_AND(TIPO, 1) <> 0) then
    BEGIN
    SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 11 INTO :NOMTIPO;
    FOR SELECT ENTR_ID, E.PREF_PRE, ENTR_NUMERO, ENTR_FECHA, ENTR_CONC, ENTR_REFER, E.BODE_COD, BODE_NOM, ENTR_NOMTERC, ENTR_OBS, ENTR_ANULADO
    FROM ENTRADAS E, BODEGA B, PREFIJOS PR
    WHERE E.BODE_COD = B.BODE_COD AND E.PREF_PRE >= :PREINI AND E.PREF_PRE <= :PREFIN AND ENTR_NUMERO >= :NUMINI AND ENTR_NUMERO <= :NUMFIN
     AND PR.PREF_PRE = E.PREF_PRE AND PR.TIDO_COD = 11 AND ((PR.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
    ORDER BY E.PREF_PRE, ENTR_NUMERO
    INTO :ID, :PREF, :NUMERO, :FECHA, :CONCEPTO, :REFER, :CODBODORI, :NOMBODORI, :NOMTERCERO, :OBS, :ANULADO
    DO
        BEGIN
        if ((:ANULADOS = 'S') or (:ANULADO = 'N')) then
            BEGIN
            if (anulado = 'S') then
             BEGIN
              ITEM = 0;
              ARTICULO = '';
              CODBAR = '';
              ARTIDES = '';
              CANT = 0;
              UNIDAD = '';
              BODITEM = '';
              lote = '';
              costo = 0;
              DTOPORC = 0;
              DTOMONTO = 0;
              IVAPORC = 0;
              IVAMONTO = 0;
              CONSUMO = 0;
              TOTAL = 0;
              OBSITEM = null;
              SUBTOTAL = 0;
              SUSPEND;
             END
            ELSE
             BEGIN
              if (DETALLE = 'S') then
                FOR SELECT ENDE_ITEM, A.ARTI_COD, ENDE_CODBAR, ENDE_DESC, ENDE_CANT, ENDE_UNIDAD, BODE_COD, ENDE_COSTO, ENDE_DTOPORC, ENDE_DTOMONTO, ENDE_IVAPORC, ENDE_IVAMONTO, ENDE_CONSUMO, ENDE_TOTAL, ENDE_LOTE, ENDE_OBS
                    FROM ENTRADAS_DETALLE D, ARTICULO A
                    WHERE D.ARTI_COD = A.ARTI_COD AND D.ENTR_ID = :ID
                    ORDER BY ENDE_ITEM
                    INTO :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :BODITEM, :COSTO, :DTOPORC, :DTOMONTO, :IVAPORC, :IVAMONTO, :CONSUMO, :TOTAL, :LOTE, :OBSITEM
                    DO
                    BEGIN
                    SUBTOTAL = TOTAL - IVAMONTO - CONSUMO;
                    SUSPEND;
                    END
              ELSE
                BEGIN
                SELECT SUM(ENDE_IVAMONTO), SUM(ENDE_CONSUMO), SUM(ENDE_TOTAL) FROM ENTRADAS_DETALLE D WHERE D.ENTR_ID = :ID INTO
                    :IVAMONTO, :CONSUMO, :TOTAL;
                SUBTOTAL = TOTAL - IVAMONTO - CONSUMO;
                SUSPEND;
                END
             END
            END
        END
    END
  if (BIN_AND(TIPO, 2) <> 0) then
    BEGIN
    SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 12 INTO :NOMTIPO;
    FOR SELECT SALI_ID, S.PREF_PRE, SALI_NUMERO, SALI_FECHA, SALI_CONC, SALI_REFER, S.BODE_COD, BODE_NOM, SALI_NOMTERC, SALI_OBS, SALI_ANULADO
    FROM SALIDAS S, BODEGA B, PREFIJOS PR
    WHERE S.BODE_COD = B.BODE_COD AND S.PREF_PRE >= :PREINI AND S.PREF_PRE <= :PREFIN AND SALI_NUMERO >= :NUMINI AND SALI_NUMERO <= :NUMFIN
     AND PR.PREF_PRE = S.PREF_PRE AND PR.TIDO_COD = 12 AND ((PR.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
    ORDER BY S.PREF_PRE, SALI_NUMERO
    into :ID, :PREF, :NUMERO, :FECHA, :CONCEPTO, :REFER, :CODBODORI, :NOMBODORI, :NOMTERCERO, :OBS, :ANULADO
    DO
        BEGIN
        if ((:ANULADOS = 'S') or (:ANULADO = 'N')) then
            BEGIN
            if (anulado = 'S') then
             BEGIN
              ITEM = 0;
              ARTICULO = '';
              CODBAR = '';
              ARTIDES = '';
              CANT = 0;
              UNIDAD = '';
              BODITEM = '';
              lote = '';
              costo = 0;
              DTOPORC = 0;
              DTOMONTO = 0;
              IVAPORC = 0;
              IVAMONTO = 0;
              CONSUMO = 0;
              TOTAL = 0;
              OBSITEM = null;
              SUBTOTAL = 0;
              SUSPEND;
             END
            ELSE
             BEGIN
              if (DETALLE = 'S') then
                FOR SELECT SADE_ITEM, A.ARTI_COD, SADE_CODBAR, SADE_DESC, SADE_CANT, SADE_UNIDAD, BODE_COD, SADE_COSTO, SADE_IVAPORC, SADE_IVAMONTO, SADE_CONSUMO, SADE_TOTAL, SADE_LOTE, SADE_OBS
                FROM SALIDAS_DETALLE D, ARTICULO A
                WHERE D.ARTI_COD = A.ARTI_COD AND D.SALI_ID = :ID
                ORDER BY SADE_ITEM
                INTO :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :BODITEM, :COSTO, :IVAPORC, :IVAMONTO, :CONSUMO, :TOTAL, :LOTE, :OBSITEM
                    DO
                BEGIN
                SUBTOTAL = TOTAL - IVAMONTO - CONSUMO;
                SUSPEND;
                END
              ELSE
                BEGIN
                SELECT SUM(SADE_IVAMONTO), SUM(SADE_CONSUMO), SUM(SADE_TOTAL) FROM SALIDAS_DETALLE D WHERE D.SALI_ID = :ID INTO
                    :IVAMONTO, :CONSUMO, :TOTAL;
                SUBTOTAL = TOTAL - IVAMONTO - CONSUMO;
                SUSPEND;
                END
             END
            END
        END
    END
  if (BIN_AND(TIPO, 4) <> 0) then
    BEGIN
    SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 13 INTO :NOMTIPO;
    FOR SELECT TRAN_ID, T.PREF_PRE, TRAN_NUMERO, TRAN_FECHA, TRAN_CONC, TRAN_REFER, T.BODE_COD, BO.BODE_NOM, TRAN_BODDES, BD.BODE_NOM, TRAN_OBS, TRAN_ANULADO
    FROM TRASFERENCIAS T, BODEGA BO, BODEGA BD, PREFIJOS PR
    WHERE T.BODE_COD = BO.BODE_COD AND T.TRAN_BODDES = BD.BODE_COD AND T.PREF_PRE >= :PREINI AND T.PREF_PRE <= :PREFIN AND TRAN_NUMERO >= :NUMINI AND TRAN_NUMERO <= :NUMFIN
     AND PR.PREF_PRE = T.PREF_PRE AND PR.TIDO_COD = 13 AND ((PR.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
    ORDER BY T.PREF_PRE, TRAN_NUMERO
    into :ID, :PREF, :NUMERO, :FECHA, :CONCEPTO, :REFER, :CODBODORI, :NOMBODORI, :CODBODDES, :NOMBODDES, :OBS, :ANULADO
    DO
        BEGIN
        if ((:ANULADOS = 'S') or (:ANULADO = 'N')) then
            BEGIN
            if (anulado = 'S') then
             BEGIN
              ITEM = 0;
              ARTICULO = '';
              CODBAR = '';
              ARTIDES = '';
              CANT = 0;
              UNIDAD = '';
              BODITEM = '';
              lote = '';
              costo = 0;
              DTOPORC = 0;
              DTOMONTO = 0;
              IVAPORC = 0;
              IVAMONTO = 0;
              CONSUMO = 0;
              TOTAL = 0;
              OBSITEM = null;
              SUBTOTAL = 0;
              SUSPEND;
             END
            ELSE
             BEGIN
              if (DETALLE = 'S') then
                FOR SELECT TRAS_ITEM, A.ARTI_COD, TRAS_CODBAR, TRAS_DESC, TRAS_CANT, TRAS_UNIDAD, TRAS_COSTO, TRAS_IVAPORC, TRAS_IVAMONTO, TRAS_CONSUMO, TRAS_TOTAL, TRAS_LOTE, TRAS_OBS
                FROM TRASFERENCIAS_DETALLE D, ARTICULO A
                WHERE D.ARTI_COD = A.ARTI_COD AND D.TRAN_ID = :ID
                ORDER BY TRAS_ITEM
                INTO :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :COSTO, :IVAPORC, :IVAMONTO, :CONSUMO, :TOTAL, :LOTE, :OBSITEM
                    DO
                    BEGIN
                    SUBTOTAL = TOTAL - IVAMONTO - CONSUMO;
                    SUSPEND;
                    END
              ELSE
                BEGIN
                SELECT SUM(TRAS_IVAMONTO), SUM(TRAS_CONSUMO), SUM(TRAS_TOTAL) FROM trasferencias_detalle D WHERE D.TRAN_ID = :ID INTO
                    :IVAMONTO, :CONSUMO, :TOTAL;
                SUBTOTAL = TOTAL - IVAMONTO - CONSUMO;
                SUSPEND;
                END
             END
            END
        END
    END
  if (BIN_AND(TIPO, 8) <> 0) then
    BEGIN
    SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 14 INTO :NOMTIPO;
    FOR SELECT AJUS_ID, A.PREF_PRE, AJUS_NUMERO, AJUS_FECHA, AJUS_CONC, A.BODE_COD, BODE_NOM, AJUS_OBS, AJUS_ANULADO
    FROM AJUSTES A, BODEGA B, PREFIJOS PR
    WHERE A.BODE_COD = B.BODE_COD AND A.PREF_PRE >= :PREINI AND A.PREF_PRE <= :PREFIN AND AJUS_NUMERO >= :NUMINI AND AJUS_NUMERO <= :NUMFIN
     AND PR.PREF_PRE = A.PREF_PRE AND PR.TIDO_COD = 14 AND ((PR.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
    ORDER BY A.PREF_PRE, AJUS_NUMERO
    into :ID, :PREF, :NUMERO, :FECHA, :CONCEPTO, :CODBODORI, :NOMBODORI, :OBS, :ANULADO
    DO
        BEGIN
        if ((:ANULADOS = 'S') or (:ANULADO = 'N')) then
            BEGIN
            if (anulado = 'S') then
             BEGIN
              ITEM = 0;
              ARTICULO = '';
              CODBAR = '';
              ARTIDES = '';
              CANT = 0;
              UNIDAD = '';
              BODITEM = '';
              lote = '';
              costo = 0;
              DTOPORC = 0;
              DTOMONTO = 0;
              IVAPORC = 0;
              IVAMONTO = 0;
              CONSUMO = 0;
              EXANT = 0;
              TOTAL = 0;
              OBSITEM = null;
              SUBTOTAL = 0;
              SUSPEND;
             END
            ELSE
             BEGIN
              if (DETALLE = 'S') then
                FOR SELECT AJUS_ITEM, A.ARTI_COD, AJUS_CODBAR, AJDE_DESC, AJUS_EXANT, AJUS_UNIDAD, BODE_COD, AJUS_EXNUE, AJUS_LOTE, AJDE_OBS
                FROM AJUSTES_DETALLE D, ARTICULO A
                WHERE D.ARTI_COD = A.ARTI_COD AND D.AJUS_ID = :ID
                ORDER BY AJUS_ITEM
                INTO :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :EXANT, :UNIDAD, :BODITEM, :CANT, :LOTE, :OBSITEM
                    DO
                      BEGIN
                      TOTAL = (CANT - EXANT) * COSTO;
                      SUBTOTAL = TOTAL;
                      SUSPEND;
                      END
              ELSE
                BEGIN
                TOTAL = 0;
                FOR SELECT ARTI_COD, AJUS_EXNUE, AJUS_EXANT FROM AJUSTES_DETALLE D WHERE D.AJUS_ID = :ID INTO
                    :ARTICULO, :CANT, :EXANT
                    DO
                      BEGIN
                      EXECUTE PROCEDURE COSTO_PROMEDIO(:ARTICULO, :FECHA) returning_values (:COSTO);
                      TOTAL = TOTAL + ((CANT - EXANT) * COSTO);
                      SUBTOTAL = TOTAL;
                      END
                SUSPEND;
                END
             END
            END
        END
    END
  if (BIN_AND(TIPO, 16) <> 0) then
    BEGIN
    SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 15 INTO :NOMTIPO;
    FOR SELECT ENSA_ID, E.PREF_PRE, ENSA_NUMERO, ENSA_FECHA, ENSA_CONC, ENSA_REFER, E.BODE_COD, BODE_NOM, ENSA_CODBAR, ENSA_DESC, ENSA_CANT, ENSA_UNIDAD, ENSA_LOTE, ENSA_OBS, ENSA_ANULADO
    FROM ENSAMBLES E, BODEGA B, PREFIJOS PR
    WHERE E.BODE_COD = B.BODE_COD AND E.PREF_PRE >= :PREINI AND E.PREF_PRE <= :PREFIN AND ENSA_NUMERO >= :NUMINI AND ENSA_NUMERO <= :NUMFIN
     AND PR.PREF_PRE = E.PREF_PRE AND PR.TIDO_COD = 15 AND ((PR.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
    ORDER BY E.PREF_PRE, ENSA_NUMERO
    into :ID, :PREF, :NUMERO, :FECHA, :CONCEPTO, :REFER, :CODBODORI, :NOMBODORI, :PRODCODBAR, :PRODDES, :PRODCANT, :PRODUNIDAD, :PRODLOTE, :OBS, :ANULADO
    DO
        BEGIN
        if ((:ANULADOS = 'S') or (:ANULADO = 'N')) then
            BEGIN
            if (anulado = 'S') then
             BEGIN
              ITEM = 0;
              ARTICULO = '';
              CODBAR = '';
              ARTIDES = '';
              CANT = 0;
              UNIDAD = '';
              BODITEM = '';
              lote = '';
              costo = 0;
              DTOPORC = 0;
              DTOMONTO = 0;
              IVAPORC = 0;
              IVAMONTO = 0;
              CONSUMO = 0;
              TOTAL = 0;
              OBSITEM = null;
              SUBTOTAL = 0;
              SUSPEND;
             END
            ELSE
             BEGIN
              if (DETALLE = 'S') then
                FOR SELECT ESDE_ITEM, A.ARTI_COD, ESDE_CODBAR, ESDE_DESC, ESDE_CANT, ESDE_UNIDAD, BODE_COD, ESDE_COSTO, ESDE_IVAPORC, ESDE_IVAMONTO, ESDE_CONSUMO, ESDE_TOTAL, ESDE_LOTE, ESDE_OBS
                FROM ensambles_detalle D, ARTICULO A
                WHERE D.ARTI_COD = A.ARTI_COD AND D.ENSA_ID = :ID
                ORDER BY ESDE_ITEM
                INTO :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :BODITEM, :COSTO, :IVAPORC, :IVAMONTO, :CONSUMO, :TOTAL, :LOTE, :OBSITEM
                    DO
                    BEGIN
                    SUBTOTAL = TOTAL - IVAMONTO - CONSUMO;
                    SUSPEND;
                    END
              ELSE
                BEGIN
                SELECT SUM(ESDE_IVAMONTO), SUM(ESDE_CONSUMO), SUM(ESDE_TOTAL) FROM ENSAMBLES_detalle D WHERE D.ENSA_ID = :ID INTO
                    :IVAMONTO, :CONSUMO, :TOTAL;
                SUBTOTAL = TOTAL - IVAMONTO - CONSUMO;
                SUSPEND;
                END
             END
            END
        END
    END
  if (BIN_AND(TIPO, 32) <> 0) then
    BEGIN
    SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 16 INTO :NOMTIPO;
    FOR SELECT DESE_ID, E.PREF_PRE, DESE_NUMERO, DESE_FECHA, DESE_CONC, DESE_REFER, E.BODE_COD, BODE_NOM, DESE_CODBAR, DESE_DESC, DESE_CANT, DESE_UNIDAD, DESE_LOTE, DESE_OBS, DESE_ANULADO
    FROM DESENSAMBLES E, BODEGA B, PREFIJOS PR
    WHERE E.BODE_COD = B.BODE_COD AND E.PREF_PRE >= :PREINI AND E.PREF_PRE <= :PREFIN AND DESE_NUMERO >= :NUMINI AND DESE_NUMERO <= :NUMFIN
     AND PR.PREF_PRE = E.PREF_PRE AND PR.TIDO_COD = 16 AND ((PR.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
    ORDER BY E.PREF_PRE, DESE_NUMERO
    into :ID, :PREF, :NUMERO, :FECHA, :CONCEPTO, :REFER, :CODBODORI, :NOMBODORI, :PRODCODBAR, :PRODDES, :PRODCANT, :PRODUNIDAD, :PRODLOTE, :OBS, :ANULADO
    DO
        BEGIN
        if ((:ANULADOS = 'S') or (:ANULADO = 'N')) then
            BEGIN
            if (anulado = 'S') then
             BEGIN
              ITEM = 0;
              ARTICULO = '';
              CODBAR = '';
              ARTIDES = '';
              CANT = 0;
              UNIDAD = '';
              BODITEM = '';
              lote = '';
              costo = 0;
              DTOPORC = 0;
              DTOMONTO = 0;
              IVAPORC = 0;
              IVAMONTO = 0;
              CONSUMO = 0;
              TOTAL = 0;
              OBSITEM = null;
              SUBTOTAL = 0;
              SUSPEND;
             END
            ELSE
             BEGIN
              if (DETALLE = 'S') then
                FOR SELECT DESE_ITEM, A.ARTI_COD, DEDE_CODBAR, DEDE_DESC, DEDE_CANT, DEDE_UNIDAD, BODE_COD, DEDE_COSTO, DEDE_IVAPORC, DEDE_IVAMONTO, DEDE_CONSUMO, DEDE_TOTAL, DEDE_LOTE, DEDE_OBS
                FROM DESensambles_detalle D, ARTICULO A
                WHERE D.ARTI_COD = A.ARTI_COD AND D.DESE_ID = :ID
                ORDER BY DESE_ITEM
                INTO
                    :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :BODITEM, :COSTO, :IVAPORC, :IVAMONTO, :CONSUMO, :TOTAL, :LOTE, :OBSITEM
                    DO
                    BEGIN
                    SUBTOTAL = TOTAL - IVAMONTO - CONSUMO;
                    SUSPEND;
                    END
              ELSE
                BEGIN
                SELECT SUM(DEDE_IVAMONTO), SUM(DEDE_CONSUMO), SUM(DEDE_TOTAL) FROM DESENSAMBLES_detalle D WHERE D.DESE_ID = :ID INTO
                    :IVAMONTO, :CONSUMO, :TOTAL;
                SUBTOTAL = TOTAL - IVAMONTO - CONSUMO;
                SUSPEND;
                END
             END
            END
        END
    END
  if (BIN_AND(TIPO, 64) <> 0) then
    BEGIN
    SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 17 INTO :NOMTIPO;
    FOR SELECT RESE_ID, R.PREF_PRE, RESE_NUMERO, RESE_FECHA, RESE_CONC, RESE_REFER, R.BODE_COD, BODE_NOM, RESE_NOMTERC, RESE_OBS, RESE_ANULADO
    FROM RESERVAS R, BODEGA B, PREFIJOS PR
    WHERE R.BODE_COD = B.BODE_COD AND R.PREF_PRE >= :PREINI AND R.PREF_PRE <= :PREFIN AND RESE_NUMERO >= :NUMINI AND RESE_NUMERO <= :NUMFIN
     AND PR.PREF_PRE = R.PREF_PRE AND PR.TIDO_COD = 17 AND ((PR.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
    ORDER BY R.PREF_PRE, RESE_NUMERO
    into :ID, :PREF, :NUMERO, :FECHA, :CONCEPTO, :REFER, :CODBODORI, :NOMBODORI, :NOMTERCERO, :OBS, :ANULADO
    DO
        BEGIN
        if ((:ANULADOS = 'S') or (:ANULADO = 'N')) then
            BEGIN
            if (anulado = 'S') then
             BEGIN
              ITEM = 0;
              ARTICULO = '';
              CODBAR = '';
              ARTIDES = '';
              CANT = 0;
              UNIDAD = '';
              BODITEM = '';
              lote = '';
              costo = 0;
              DTOPORC = 0;
              DTOMONTO = 0;
              IVAPORC = 0;
              IVAMONTO = 0;
              CONSUMO = 0;
              EXANT = 0;
              TOTAL = 0;
              OBSITEM = null;
              SUBTOTAL = 0;
              SUSPEND;
             END
            ELSE
             BEGIN
              if (DETALLE = 'S') then
                FOR SELECT RSDE_ITEM, A.ARTI_COD, RSDE_CODBAR, RSDE_DESC, RDSE_CANT, RSDE_UNIDAD, BODE_COD, RSDE_OBS
                FROM RESERVAS_DETALLE D, ARTICULO A
                WHERE D.ARTI_COD = A.ARTI_COD AND D.RESE_ID = :ID
                ORDER BY RSDE_ITEM
                INTO :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :BODITEM, :OBSITEM
                    DO
                    SUSPEND;
              ELSE
                BEGIN
                SELECT SUM(RDSE_CANT) FROM RESERVAS_detalle D WHERE D.RESE_ID = :ID INTO
                    :CANT;
                SUSPEND;
                END
             END
            END
        END
    END
  if (BIN_AND(TIPO, 128) <> 0) then
    BEGIN
    SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 18 INTO :NOMTIPO;
    FOR SELECT ORIN_ID, O.PREF_PRE, ORIN_NUMERO, ORIN_FECHA, ORIN_FECLLEGA, ORIN_CONC, ORIN_REFER, ORIN_NOMTERC, ORIN_OBS, ORIN_ANULADO
    FROM ORDENES_INVENTARIO O, PREFIJOS PR
    WHERE O.PREF_PRE >= :PREINI AND O.PREF_PRE <= :PREFIN AND ORIN_NUMERO >= :NUMINI AND ORIN_NUMERO <= :NUMFIN
     AND PR.PREF_PRE = O.PREF_PRE AND PR.TIDO_COD = 18 AND ((PR.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
    ORDER BY O.PREF_PRE, ORIN_NUMERO
    into :ID, :PREF, :NUMERO, :FECHA, :VENCE, :CONCEPTO, :REFER, :NOMTERCERO, :OBS, :ANULADO
    DO
        BEGIN
        if ((:ANULADOS = 'S') or (:ANULADO = 'N')) then
            BEGIN
            if (anulado = 'S') then
             BEGIN
              ITEM = 0;
              ARTICULO = '';
              CODBAR = '';
              ARTIDES = '';
              CANT = 0;
              UNIDAD = '';
              BODITEM = '';
              lote = '';
              costo = 0;
              DTOPORC = 0;
              DTOMONTO = 0;
              IVAPORC = 0;
              IVAMONTO = 0;
              CONSUMO = 0;
              EXANT = 0;
              TOTAL = 0;
              OBSITEM = null;
              SUBTOTAL = 0;
              SUSPEND;
             END
            ELSE
             BEGIN
              if (DETALLE = 'S') then
                FOR SELECT ORID_ITEM, A.ARTI_COD, ORID_CODBAR, ORID_DESC, ORID_CANT, ORID_UNIDAD, ORIN_COSTO, ORID_DTOPORC, ORID_DTOMONTO, ORID_IVAPORC, ORID_IVAMONTO, ORID_CONSUMO, ORID_TOTAL, ORID_OBS, ORID_LOTE
                FROM ORDENINVENTARIO_DETALLE D, ARTICULO A
                WHERE D.ARTI_COD = A.ARTI_COD AND D.ORIN_ID = :ID
                ORDER BY ORID_ITEM
                INTO :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :COSTO, :DTOPORC, :DTOMONTO, :IVAPORC, :IVAMONTO, :CONSUMO, :TOTAL, :OBSITEM, :LOTE
                    DO
                    BEGIN
                    SUBTOTAL = TOTAL - IVAMONTO - CONSUMO;
                    SUSPEND;
                    END
              ELSE
                BEGIN
                SELECT SUM(ORID_IVAMONTO), SUM(ORID_CONSUMO), SUM(ORID_TOTAL) FROM ordeninventario_detalle D WHERE D.ORIN_ID = :ID INTO
                    :IVAMONTO, :CONSUMO, :TOTAL;
                SUBTOTAL = TOTAL - IVAMONTO - CONSUMO;
                SUSPEND;
                END
             END
            END
        END
    END
END

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE REP_KARDEX_ARTICULO(
    DETALLE CHAR(1),
    FECINI DATE,
    FECFIN DATE,
    ARTINI VARCHAR(20),
    ARTFIN VARCHAR(20),
    GRPINI VARCHAR(2),
    GRPFIN VARCHAR(2),
    ORDEN CHAR(1),
    BODEGA VARCHAR(2))
RETURNS (
    CODIGO VARCHAR(15),
    NOMBRE VARCHAR(60),
    UNIDAD VARCHAR(8),
    CODGRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    CODSUBG VARCHAR(3),
    NOMSUBG VARCHAR(30),
    CODMARC VARCHAR(3),
    NOMMARC VARCHAR(30),
    CODBOD VARCHAR(2),
    SALDOINI NUMERIC(18,4),
    COSTOINI NUMERIC(18,2),
    ENTRADAS NUMERIC(18,4),
    COSTOENT NUMERIC(18,2),
    SALIDAS NUMERIC(18,4),
    COSTOSAL NUMERIC(18,2),
    SALDOFIN NUMERIC(18,4),
    COSTOFIN NUMERIC(18,2),
    TIPODOC VARCHAR(8),
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    CONCEPTO VARCHAR(60),
    NIT VARCHAR(20),
    CONS INTEGER,
    CANFINAL NUMERIC(18,4),
    COSFINAL NUMERIC(18,2))
AS
DECLARE VARIABLE ENTRADA CHAR(1);
DECLARE VARIABLE CANT NUMERIC(18,4);
DECLARE VARIABLE COSTO NUMERIC(18,2);
DECLARE VARIABLE CODINI VARCHAR(20);
DECLARE VARIABLE CODFIN VARCHAR(20);
DECLARE VARIABLE DESINI VARCHAR(20);
DECLARE VARIABLE DESFIN VARCHAR(20);
BEGIN
if (ORDEN = 'C') then
    BEGIN
    CODINI = ARTINI;
    CODFIN = ARTFIN;
    DESINI = '';
    DESFIN = 'zz';
    END
ELSE
    BEGIN
    DESINI = ARTINI;
    DESFIN = ARTFIN;
    CODINI = '';
    CODFIN = 'zz';
    END
  FOR
    SELECT ARTI_COD, ARTI_DES, ARTI_UNIDAD, A.GRUP_COD, A.SUBG_COD, A.MARC_COD
      FROM ARTICULO A
      WHERE ARTI_COD >= :CODINI AND ARTI_COD <= :CODFIN AND A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :GRPFIN AND ARTI_DES >= :DESINI AND ARTI_DES <= :DESFIN AND A.ESAR_COD <> 'I'
      INTO :CODIGO, :NOMBRE, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
      DO
        BEGIN
        NOMMARC = '';
        NOMSUBG = '';
        SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
        SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
        SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
        if (BODEGA = '') then
            BEGIN
            EXECUTE PROCEDURE SALDO_INICIAL_TOTAL_INV(CODIGO, FECINI) returning_values (:SALDOINI);
            EXECUTE PROCEDURE VALOR_INICIAL_INVENTARIO(CODIGO, FECINI) returning_values (COSTOINI);
            END
        ELSE
            BEGIN
            EXECUTE PROCEDURE SALDO_INICIAL_INVENTARIO(CODIGO, FECINI, :BODEGA) returning_values (SALDOINI);
            EXECUTE PROCEDURE COSTO_PROMEDIO(CODIGO, FECINI-1) returning_values (COSTOINI);
            COSTOINI = COSTOINI * saldoini;
            END
        if (DETALLE = 'N') then
            BEGIN
            /* SUME LAS ENTRADAS */
            if (BODEGA = '') then
              SELECT SUM(COST_ENTC), SUM(COST_ENTP), SUM(COST_SALC), SUM(COST_SALP) FROM COSTOS
                WHERE (COST_FECHA >= :FECINI) AND (COST_FECHA <= :FECFIN) AND (ARTI_COD = :codigo)
                INTO :ENTRADAS, :COSTOENT, :SALIDAS, :COSTOSAL;
            ELSE
              SELECT SUM(COST_ENTC), SUM(COST_ENTP), SUM(COST_SALC), SUM(COST_SALP)
                FROM COSTOS C, MOVIMIENTO_ARTICULO M
                WHERE (COST_FECHA >= :FECINI) AND (COST_FECHA <= :FECFIN) AND (C.ARTI_COD = :codigo) AND C.cost_idmov = M.mvar_cons AND BODE_COD = :BODEGA
                INTO :ENTRADAS, :COSTOENT, :SALIDAS, :COSTOSAL;

            if (ENTRADAS IS NULL) then
              ENTRADAS = 0;
            if (COSTOENT IS NULL) then
              COSTOENT = 0;
            if (SALIDAS IS NULL) then
              SALIDAS = 0;
            if (COSTOSAL IS NULL) then
              COSTOSAL = 0;
            SALDOFIN = SALDOINI + ENTRADAS - SALIDAS;
            COSTOFIN = COSTOINI + COSTOENT - COSTOSAL;
            if (BODEGA = '') then
                BEGIN
                EXECUTE PROCEDURE SALDO_INICIAL_TOTAL_INV(CODIGO, fecfin+1) returning_values (canfinal);
                EXECUTE PROCEDURE VALOR_INICIAL_INVENTARIO(CODIGO, FECFIN+1) returning_values (cosfinal);
                END
            ELSE
                BEGIN
                EXECUTE PROCEDURE SALDO_INICIAL_INVENTARIO(CODIGO, FECFIN+1, :BODEGA) returning_values (CANFINAL);
                EXECUTE PROCEDURE COSTO_PROMEDIO(CODIGO, FECFIN+1) returning_values (COSFINAL);
                COSFINAL = COSFINAL * CANFINAL;
                END
            SUSPEND;
            END
        ELSE
            BEGIN
            SALDOFIN = SALDOINI;
            COSTOFIN = COSTOINI;
            COSTOENT = 0;
            COSTOSAL = 0;
            FOR SELECT TIDO_NOMCORTO, MVAR_ENTRADA, MVAR_PREF, MVAR_NUMERO, MVAR_CANT, MVAR_COSTO, MVAR_CONC, MVAR_FECHA, M.TERC_NIT, MVAR_CONS, BODE_COD, COST_SALDOP, COST_SALDOC
                FROM MOVIMIENTO_ARTICULO M, TIPO_DOCUMENTO TD, COSTOS C
                WHERE TD.TIDO_COD = MVAR_TIPODOC AND (MVAR_FECHA >= :FECINI) AND (MVAR_FECHA <= :FECFIN) AND (MVAR_TIPODOC <> 13) AND (m.ARTI_COD = :CODIGO) AND M.mvar_cons = C.cost_idmov
                ORDER BY MVAR_FECHA, MVAR_CONS
                INTO :TIPODOC, :ENTRADA, :PREFIJO, :NUMERO, :ENTRADAS, :COSTOENT, :CONCEPTO, :FECHA, :NIT, :CONS, :CODBOD, :costo, :cant
                DO
                    BEGIN
                    if (ENTRADA = 'S') then
                        BEGIN
                        SALIDAS = 0;
                        SALDOFIN = SALDOFIN + ENTRADAS;
                        COSTOFIN = COSTOFIN + (ENTRADAS * COSTOENT);
                        if (CANT > 0) then
                            COSTOSAL = COSTO / CANT;
                        else
                            COSTOSAL = 0;
                        end
                    ELSE
                        BEGIN
                        SALIDAS = ENTRADAS;
                        ENTRADAS = 0;
                        if (CANT > 0) then
                            COSTOSAL = COSTO / CANT;
                        else
                            COSTOSAL = 0;
                        SALDOFIN = SALDOFIN - SALIDAS;
                        COSTOFIN = COSTOFIN - (SALIDAS * costosal);
                        END
                    SUSPEND;
                    END
            END
        END
END

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE REP_PRODUCTOS(
    ORDEN CHAR(1),
    DESDE VARCHAR(15),
    HASTA VARCHAR(15),
    FECHA DATE)
RETURNS (
    CODIGO VARCHAR(15),
    DESCR VARCHAR(60),
    GRUPCOD VARCHAR(2),
    GRUPNOM VARCHAR(30),
    SUBGCOD VARCHAR(3),
    SUBGNOM VARCHAR(30),
    MARCCOD VARCHAR(3),
    MARCNOM VARCHAR(30),
    ESTADO CHAR(1),
    UNIDAD VARCHAR(8),
    CODCOMP VARCHAR(15),
    DESCOMP VARCHAR(60),
    CANT NUMERIC(18,4),
    UNDCOMP VARCHAR(8),
    CODBARCOMP VARCHAR(15),
    COSTO NUMERIC(18,2),
    TOTAL NUMERIC(18,2))
AS
BEGIN
  FOR SELECT ARTI_COD, ARTI_DES, ARTI_UNIDAD, A.GRUP_COD, GRUP_NOM, A.SUBG_COD, A.MARC_COD, A.esar_cod
  FROM ARTICULO A, GRUPO G, estado_articulo E
  WHERE A.GRUP_COD = G.GRUP_COD AND A.ESAR_COD = E.ESAR_COD AND ARTI_COD IN (SELECT DISTINCT ARTI_COD FROM ARTICULOS_PRODUCTO)
  INTO :CODIGO, :DESCR, :unidad, :GRUPCOD, :GRUPNOM, :SUBGCOD, :MARCCOD, :ESTADO
  DO
    if ((ORDEN = 'C' AND CODIGO >= :DESDE AND CODIGO <= :HASTA) OR
        (ORDEN = 'D' AND DESCR >= :DESDE AND DESCR <= :HASTA)) then
        BEGIN
        SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :MARCCOD INTO MARCNOM;
        SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :SUBGCOD AND GRUP_COD = :GRUPCOD INTO :SUBGNOM;
        FOR SELECT ARPR_COMP, ARTI_DES, ARPR_CODBAR, ARPR_CANT, ARPR_UNIDAD
        FROM ARTICULOS_PRODUCTO P, ARTICULO A
        WHERE P.ARTI_COD = :CODIGO AND P.ARPR_COMP = A.ARTI_COD
          INTO :CODCOMP, :DESCOMP, :CODBARCOMP, :CANT, :UNDCOMP
          DO
            begin
            EXECUTE PROCEDURE COSTO_PROMEDIO (:CODCOMP, :FECHA) returning_values (:COSTO);
            EXECUTE PROCEDURE CANTIDAD_POR_FACTOR (:CODCOMP, :CANT, :UNDCOMP) returning_values (:CANT);
            TOTAL = COSTO * CANT;
            SUSPEND;
            END
        END
END

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE REP_UTILIDAD_VENDEDOR(
    TIPO INTEGER,
    DETALLE CHAR(1),
    VENINI VARCHAR(20),
    VENFIN VARCHAR(20),
    FECINI DATE,
    FECFIN DATE,
    ARTINI VARCHAR(15),
    ARTFIN VARCHAR(15),
    ORDEN CHAR(1),
    CEROS CHAR(1),
    SUBEMPRESA INTEGER)
RETURNS (
    CODVEND VARCHAR(20),
    NOMVEND VARCHAR(60),
    NOMTIPO VARCHAR(50),
    ARTICULO VARCHAR(15),
    DESCRIPCION VARCHAR(60),
    CODGRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    CODSUBG VARCHAR(3),
    NOMSUBG VARCHAR(30),
    CODMARC VARCHAR(3),
    NOMMARC VARCHAR(30),
    UNIDAD VARCHAR(8),
    CANTIDAD NUMERIC(18,4),
    BASE NUMERIC(18,2),
    IVA NUMERIC(18,2),
    CONSUMO NUMERIC(18,2),
    COSTO NUMERIC(18,2),
    UTILIDAD NUMERIC(18,4),
    PORC NUMERIC(9,2),
    TOTAL NUMERIC(18,2),
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    DTO NUMERIC(9,2))
AS
DECLARE VARIABLE COSTOUNIT NUMERIC(18,4);
DECLARE VARIABLE CODINI VARCHAR(15);
DECLARE VARIABLE CODFIN VARCHAR(15);
DECLARE VARIABLE DESINI VARCHAR(15);
DECLARE VARIABLE DESFIN VARCHAR(15);
declare variable UOM VARCHAR(20);
BEGIN
if (ORDEN = 'C') then
    BEGIN
    CODINI = ARTINI;
    CODFIN = ARTFIN;
    DESINI = '';
    DESFIN = 'zz';
    END
ELSE
    BEGIN
    DESINI = ARTINI;
    DESFIN = ARTFIN;
    CODINI = '';
    CODFIN = 'zz';
    END
  EXECUTE PROCEDURE lee_configuracion ('FACTURACION', 'ARTICULOS', 'SUGERIR PRECIOS CON PORCENTAJE DE MARGEN O UTILIDAD') returning_values (:UOM);
  SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = :TIPO INTO :NOMTIPO;
  FOR select VEND_COD, VEND_NOMBRE
    from VENDEDORES
    where VEND_COD >= :VENINI AND VEND_COD <= :VENFIN
    INTO :CODVEND, :NOMVEND
    DO  
    BEGIN
    if (DETALLE = 'N') then
        BEGIN
        if (BIN_AND(TIPO, 1) <> 0) then
            BEGIN
            SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 31 INTO :NOMTIPO;
            /* BORRA LA TABLA AUXILIAR */
            DELETE FROM reportes_aux WHERE REPA_ID = 4 AND REPA_USER = USER;
            FOR SELECT MAX(D.ARTI_COD), SUM(FADE_CANT * FADE_FACTOR), SUM(FACT_FACTOR*(FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO)),
                SUM(FACT_FACTOR*FADE_IVAMONTO), SUM(FACT_FACTOR*FADE_TOTAL), SUM(FADE_CONSUMO),
                MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD), SUM(COST_SALP)
                FROM FACTURAS_DETALLE D, FACTURAS F, PREFIJOS P, ARTICULO A, movimiento_articulo m, costos c
                WHERE F.FACT_ID = D.FACT_ID AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND VEND_COD = :CODVEND AND FACT_ANULADO = 'N'
                 AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) and substring(D.arti_cod from 1 FOR 2) <> '.t'
                 AND D.ARTI_COD = A.arti_cod AND A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN
                 AND F.fact_id = M.mvar_idref AND M.mvar_tipodoc = 31 AND M.mvar_item = D.fade_item AND M.mvar_cons = C.cost_idmov
                GROUP BY D.ARTI_COD
                INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :TOTAL, :CONSUMO,
                    :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :COSTO
                DO
                BEGIN
                SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                if (CANTIDAD IS NULL) then
                    CANTIDAD = 0;
                if (BASE IS NULL) then
                    BASE = 0;
                if (IVA IS NULL) then
                    IVA = 0;
                UTILIDAD = BASE - COSTO;
                if (UOM = 'UTILIDAD') then
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                else
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
                if (CEROS = 'S') then
                    begin
                    INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (4, USER, :ARTICULO);
                    SUSPEND;
                    end
                ELSE
                    if ((BASE <> 0) AND (CANTIDAD <> 0)) then
                        SUSPEND;
                END
            if (CEROS = 'S') then
                BEGIN
                COSTO = 0;
                UTILIDAD = 0;
                PORC = 0;
                /* agregue los articulos sin factura */
                FOR SELECT ARTI_COD, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN and
                    not exists (select REPA_ARTICULO FROM REPORTES_AUX WHERE REPA_ID = 4 AND REPA_USER = USER AND REPA_ARTICULO = a.arti_cod)
                    INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                    DO
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        if (BIN_AND(TIPO, 2) <> 0) then
            BEGIN
            SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 32 INTO :NOMTIPO;
            FOR SELECT MAX(D.ARTI_COD), SUM(RVDE_CANT * RVDE_FACTOR), SUM(RVDE_TOTAL-RVDE_IVAMONTO-RVDE_CONSUMO), SUM(RVDE_IVAMONTO), SUM(RVDE_TOTAL), SUM(RVDE_CONSUMO),
                MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD), SUM(COST_SALP)
                FROM REMISIONES_VENTA_DETALLE D, REMISIONES_VENTA R, PREFIJOS P, ARTICULO A, movimiento_articulo m, costos c
                WHERE R.REVT_ID = D.REVT_ID AND REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN AND VEND_COD = :CODVEND AND REVT_ANULADO = 'N'
                 AND P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = 32 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                 AND D.ARTI_COD = A.arti_cod AND A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN
                 AND r.revt_id = M.mvar_idref AND M.mvar_tipodoc = 32 AND M.mvar_item = D.rvde_item AND M.mvar_cons = C.cost_idmov
                GROUP BY D.ARTI_COD
                INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :TOTAL, :CONSUMO,
                    :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :COSTO
                DO
                BEGIN
                SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                if (CANTIDAD IS NULL) then
                    CANTIDAD = 0;
                if (BASE IS NULL) then
                    BASE = 0;
                if (IVA IS NULL) then
                    IVA = 0;
                UTILIDAD = BASE - COSTO;
                if (UOM = 'UTILIDAD') then
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                else
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
                if (CEROS = 'S') then
                    begin
                    INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (4, USER, :ARTICULO);
                    SUSPEND;
                    end
                ELSE
                    if ((BASE <> 0) AND (CANTIDAD <> 0)) then
                        SUSPEND;
                END
            if (CEROS = 'S') then
                BEGIN
                COSTO = 0;
                UTILIDAD = 0;
                PORC = 0;
                /* agregue los articulos sin factura */
                FOR SELECT ARTI_COD, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN and
                    not exists (select REPA_ARTICULO FROM REPORTES_AUX WHERE REPA_ID = 4 AND REPA_USER = USER AND REPA_ARTICULO = a.arti_cod)
                    INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                    DO
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        if (BIN_AND(TIPO, 4) <> 0) then
            BEGIN
            SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 33 INTO :NOMTIPO;
            FOR SELECT MAX(D.ARTI_COD), SUM(DVDE_CANT * DVDE_FACTOR), SUM(DEVT_FACTOR*(DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO)),
                SUM(DEVT_FACTOR*DVDE_IVAMONTO), SUM(DEVT_FACTOR*DVDE_TOTAL), SUM(DVDE_CONSUMO),
                MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD), SUM(COST_ENTP)
                FROM devoluciones_ventas_detalle D, DEVOLUCIONES_VENTAS V, PREFIJOS P, ARTICULO A, MOVIMIENTO_ARTICULO M, COSTOS C
                WHERE V.DEVT_ID = D.DEVT_ID AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND VEND_COD = :CODVEND AND DEVT_ANULADO = 'N'
                 AND P.PREF_PRE = V.PREF_PRE AND P.TIDO_COD = 33 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) and substring(D.arti_cod from 1 FOR 2) <> '.t'
                 AND D.ARTI_COD = A.arti_cod AND A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN
                 AND V.devt_id = M.mvar_idref AND M.mvar_tipodoc = 33 AND M.mvar_item = D.dvde_item AND M.mvar_cons = C.cost_idmov
                GROUP BY D.ARTI_COD
                INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :TOTAL, :CONSUMO,
                    :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :COSTO
                DO
                BEGIN
                SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                if (CANTIDAD IS NULL) then
                    CANTIDAD = 0;
                if (BASE IS NULL) then
                    BASE = 0;
                if (IVA IS NULL) then
                    IVA = 0;
                UTILIDAD = BASE - COSTO;
                if (UOM = 'UTILIDAD') then
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                else
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
                TOTAL = TOTAL * -1;
                IVA = IVA * -1;
                BASE = BASE * -1;
                CANTIDAD = CANTIDAD * -1;
                COSTO = COSTO * -1;
                UTILIDAD = UTILIDAD * -1;
                if (CEROS = 'S') then
                    begin
                    INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (4, USER, :ARTICULO);
                    SUSPEND;
                    end
                ELSE
                    if ((BASE <> 0) AND (CANTIDAD <> 0)) then
                        SUSPEND;
                END
            if (CEROS = 'S') then
                BEGIN
                COSTO = 0;
                UTILIDAD = 0;
                PORC = 0;
                /* agregue los articulos sin factura */
                FOR SELECT ARTI_COD, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN and
                    not exists (select REPA_ARTICULO FROM REPORTES_AUX WHERE REPA_ID = 4 AND REPA_USER = USER AND REPA_ARTICULO = a.arti_cod)
                    INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                    DO
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        if (BIN_AND(TIPO, 8) <> 0) then
            BEGIN
            SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 34 INTO :NOMTIPO;
            FOR SELECT MAX(ARTI_COD), SUM(PEDE_CANT * PEDE_FACTOR), SUM(PEDI_FACTOR*(PEDE_TOTAL-PEDE_IVAMONTO-PEDE_CONSUMO)),
                SUM(PEDI_FACTOR*PEDE_IVAMONTO), SUM(PEDI_FACTOR*PEDE_TOTAL), SUM(PEDE_CONSUMO)
                FROM PEDIDOS_DETALLE D, PEDIDOS P, PREFIJOS PR
                WHERE P.PEDI_ID = D.PEDI_ID AND PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND VEND_COD = :CODVEND AND PEDI_ANULADO = 'N'
                 AND PR.PREF_PRE = P.PREF_PRE AND P.TIDO_COD = 34 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                GROUP BY ARTI_COD
                INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :TOTAL, :CONSUMO
                DO
                BEGIN
                SELECT ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO WHERE ARTI_COD = :ARTICULO
                    INTO :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC;
                SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                EXECUTE PROCEDURE costo_promedio (:ARTICULO, :FECFIN) RETURNING_VALUES (:COSTOUNIT);
                if (CANTIDAD IS NULL) then
                    CANTIDAD = 0;
                if (BASE IS NULL) then
                    BASE = 0;
                if (IVA IS NULL) then
                    IVA = 0;
                COSTO = CANTIDAD * COSTOUNIT;
                UTILIDAD = BASE - COSTO;
                if (UOM = 'UTILIDAD') then
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                else
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
                if (CEROS = 'S') then
                    begin
                    INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (4, USER, :ARTICULO);
                    SUSPEND;
                    end
                ELSE
                    if ((BASE <> 0) AND (CANTIDAD <> 0)) then
                        SUSPEND;
                END
            if (CEROS = 'S') then
                BEGIN
                COSTO = 0;
                UTILIDAD = 0;
                PORC = 0;
                /* agregue los articulos sin factura */
                FOR SELECT ARTI_COD, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN and
                    not exists (select REPA_ARTICULO FROM REPORTES_AUX WHERE REPA_ID = 4 AND REPA_USER = USER AND REPA_ARTICULO = a.arti_cod)
                    INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                    DO
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        if (BIN_AND(TIPO, 16) <> 0) then
            BEGIN
            SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 35 INTO :NOMTIPO;
            FOR SELECT MAX(ARTI_COD), SUM(CTDE_CANT * CTDE_FACTOR), SUM(COTI_FACTOR*(CTDE_TOTAL-CTDE_IVAMONTO-CTDE_CONSUMO)),
                SUM(COTI_FACTOR*CTDE_IVAMONTO), SUM(COTI_FACTOR*CTDE_TOTAL), SUM(CTDE_CONSUMO)
                FROM COTIZACIONES_DETALLE D, COTIZACIONES C, PREFIJOS P
                WHERE C.COTI_ID = D.COTI_ID AND COTI_FECHA >= :FECINI AND COTI_FECHA <= :FECFIN AND VEND_COD = :CODVEND AND COTI_ANULADO = 'N'
                 AND P.PREF_PRE = C.PREF_PRE AND P.TIDO_COD = 35 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                GROUP BY ARTI_COD
                INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :TOTAL, :CONSUMO
                DO
                BEGIN
                SELECT ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO WHERE ARTI_COD = :ARTICULO
                    INTO :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC;
                SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                EXECUTE PROCEDURE costo_promedio (:ARTICULO, :FECFIN) RETURNING_VALUES (:COSTOUNIT);
                if (CANTIDAD IS NULL) then
                    CANTIDAD = 0;
                if (BASE IS NULL) then
                    BASE = 0;
                if (IVA IS NULL) then
                    IVA = 0;
                COSTO = CANTIDAD * COSTOUNIT;
                UTILIDAD = BASE - COSTO;
                if (UOM = 'UTILIDAD') then
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                else
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
                if (CEROS = 'S') then
                    begin
                    INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (4, USER, :ARTICULO);
                    SUSPEND;
                    end
                ELSE
                    if ((BASE <> 0) AND (CANTIDAD <> 0)) then
                        SUSPEND;
                END
            if (CEROS = 'S') then
                BEGIN
                COSTO = 0;
                UTILIDAD = 0;
                PORC = 0;
                /* agregue los articulos sin factura */
                FOR SELECT ARTI_COD, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN and
                    not exists (select REPA_ARTICULO FROM REPORTES_AUX WHERE REPA_ID = 4 AND REPA_USER = USER AND REPA_ARTICULO = a.arti_cod)
                    INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                    DO
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        END
    ELSE
        BEGIN
        if (BIN_AND(TIPO, 1) <> 0) then
            BEGIN
            SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 31 INTO :NOMTIPO;
            FOR SELECT F.PREF_PRE, FACT_NUMERO, FACT_FECHA, ARTI_COD, FADE_CANT * FADE_FACTOR, (FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO)*FACT_FACTOR,
                FADE_IVAMONTO*FACT_FACTOR, FADE_DTOPORC, FADE_TOTAL*FACT_FACTOR, FADE_CONSUMO
                FROM FACTURAS F, FACTURAS_DETALLE D, PREFIJOS P
                WHERE F.FACT_ID = D.FACT_ID AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND VEND_COD = :CODVEND AND FACT_ANULADO = 'N'
                 AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) and substring(D.arti_cod from 1 FOR 2) <> '.t'
                ORDER BY ARTI_COD, FACT_FECHA, F.FACT_ID, FADE_ITEM
                INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :DTO, :TOTAL, :CONSUMO
                DO
                BEGIN
                SELECT ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO WHERE ARTI_COD = :ARTICULO
                    INTO :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC;
                SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                EXECUTE PROCEDURE costo_promedio (:ARTICULO, :FECHA) RETURNING_VALUES (:COSTOUNIT);
                COSTO = COSTOUNIT * CANTIDAD;
                UTILIDAD = BASE - COSTO;
                if (UOM = 'UTILIDAD') then
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                else
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
                if (CEROS = 'S') then
                    INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (4, USER, :ARTICULO);
                SUSPEND;
                END
            if (CEROS = 'S') then
                BEGIN
                COSTO = 0;
                UTILIDAD = 0;
                PORC = 0;
                /* agregue los articulos sin factura */
                FOR SELECT ARTI_COD, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN and
                    not exists (select REPA_ARTICULO FROM REPORTES_AUX WHERE REPA_ID = 4 AND REPA_USER = USER AND REPA_ARTICULO = a.arti_cod)
                    INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                    DO
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        if (BIN_AND(TIPO, 2) <> 0) then
            BEGIN
            SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 32 INTO :NOMTIPO;
            FOR SELECT R.PREF_PRE, REVT_NUMERO, REVT_FECHA, ARTI_COD, RVDE_CANT * RVDE_FACTOR, (RVDE_TOTAL - RVDE_IVAMONTO), RVDE_IVAMONTO, RVDE_DTOPORC, RVDE_TOTAL, RVDE_CONSUMO
                FROM REMISIONES_VENTA R, REMISIONES_VENTA_DETALLE D, PREFIJOS P
                WHERE R.REVT_ID = D.REVT_ID AND REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN AND VEND_COD = :CODVEND AND REVT_ANULADO = 'N'
                 AND P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = 32 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) and substring(D.arti_cod from 1 FOR 2) <> '.t'
                ORDER BY ARTI_COD, REVT_FECHA, R.REVT_ID, RVDE_ITEM
                INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :DTO, :TOTAL, :CONSUMO
                DO
                BEGIN
                SELECT ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO WHERE ARTI_COD = :ARTICULO
                    INTO :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC;
                SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                EXECUTE PROCEDURE costo_promedio (:ARTICULO, :FECHA) RETURNING_VALUES (:COSTOUNIT);
                COSTO = COSTOUNIT * CANTIDAD;
                UTILIDAD = BASE - COSTO;
                if (UOM = 'UTILIDAD') then
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                else
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
                if (CEROS = 'S') then
                    INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (4, USER, :ARTICULO);
                SUSPEND;
                END
            if (CEROS = 'S') then
                BEGIN
                COSTO = 0;
                UTILIDAD = 0;
                PORC = 0;
                /* agregue los articulos sin factura */
                FOR SELECT ARTI_COD, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN and
                    not exists (select REPA_ARTICULO FROM REPORTES_AUX WHERE REPA_ID = 4 AND REPA_USER = USER AND REPA_ARTICULO = a.arti_cod)
                    INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                    DO
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        if (BIN_AND(TIPO, 4) <> 0) then
            BEGIN
            SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 33 INTO :NOMTIPO;
            FOR SELECT V.PREF_PRE, DEVT_NUMERO, DEVT_FECHA, ARTI_COD, DVDE_CANT * DVDE_FACTOR, (DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO)*DEVT_FACTOR,
                DVDE_IVAMONTO*DEVT_FACTOR, DVDE_DTOPORC, DVDE_TOTAL*DEVT_FACTOR, DVDE_CONSUMO
                FROM DEVOLUCIONES_VENTAS V, DEVOLUCIONES_VENTAS_DETALLE D, PREFIJOS P
                WHERE V.DEVT_ID = D.DEVT_ID AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND VEND_COD = :CODVEND AND DEVT_ANULADO = 'N'
                 AND P.PREF_PRE = V.PREF_PRE AND P.TIDO_COD = 33 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) and substring(D.arti_cod from 1 FOR 2) <> '.t'
                ORDER BY ARTI_COD, DEVT_FECHA, D.DEVT_ID, DVDE_ITEM
                INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :DTO, :TOTAL, :CONSUMO
                DO
                BEGIN
                SELECT ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO WHERE ARTI_COD = :ARTICULO
                    INTO :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC;
                SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                EXECUTE PROCEDURE costo_promedio (:ARTICULO, :FECHA) RETURNING_VALUES (:COSTOUNIT);
                COSTO = COSTOUNIT * CANTIDAD;
                UTILIDAD = BASE - COSTO;
                if (UOM = 'UTILIDAD') then
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                else
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
                TOTAL = TOTAL * -1;
                IVA = IVA * -1;
                BASE = BASE * -1;
                CANTIDAD = CANTIDAD * -1;
                COSTO = COSTO * -1;
                UTILIDAD = UTILIDAD * -1;
                if (CEROS = 'S') then
                    INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (4, USER, :ARTICULO);
                SUSPEND;
                END
            if (CEROS = 'S') then
                BEGIN
                COSTO = 0;
                UTILIDAD = 0;
                PORC = 0;
                /* agregue los articulos sin factura */
                FOR SELECT ARTI_COD, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN and
                    not exists (select REPA_ARTICULO FROM REPORTES_AUX WHERE REPA_ID = 4 AND REPA_USER = USER AND REPA_ARTICULO = a.arti_cod)
                    INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                    DO
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        if (BIN_AND(TIPO, 8) <> 0) then
            BEGIN
            SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 34 INTO :NOMTIPO;
            FOR SELECT P.PREF_PRE, PEDI_NUMERO, PEDI_FECHA, ARTI_COD, PEDE_CANT * PEDE_FACTOR, (PEDE_TOTAL-PEDE_IVAMONTO-PEDE_CONSUMO)*PEDI_FACTOR,
                PEDE_IVAMONTO*PEDI_FACTOR, PEDE_DTOPORC, PEDE_TOTAL*PEDI_FACTOR, PEDE_CONSUMO
                FROM PEDIDOS P, PEDIDOS_DETALLE D, PREFIJOS PR
                WHERE P.PEDI_ID = D.PEDI_ID AND PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND VEND_COD = :CODVEND AND PEDI_ANULADO = 'N'
                 AND P.PREF_PRE = PR.PREF_PRE AND P.TIDO_COD = 34 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                ORDER BY ARTI_COD, PEDI_FECHA, P.PEDI_ID, PEDE_ITEM
                INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :DTO, :TOTAL, :CONSUMO
                DO
                BEGIN
                SELECT ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO WHERE ARTI_COD = :ARTICULO
                    INTO :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC;
                SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                EXECUTE PROCEDURE costo_promedio (:ARTICULO, :FECHA) RETURNING_VALUES (:COSTOUNIT);
                COSTO = COSTOUNIT * CANTIDAD;
                UTILIDAD = BASE - COSTO;
                if (UOM = 'UTILIDAD') then
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                else
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
                if (CEROS = 'S') then
                    INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (4, USER, :ARTICULO);
                SUSPEND;
                END
            if (CEROS = 'S') then
                BEGIN
                COSTO = 0;
                UTILIDAD = 0;
                PORC = 0;
                /* agregue los articulos sin factura */
                FOR SELECT ARTI_COD, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN and
                    not exists (select REPA_ARTICULO FROM REPORTES_AUX WHERE REPA_ID = 4 AND REPA_USER = USER AND REPA_ARTICULO = a.arti_cod)
                    INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                    DO
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        if (BIN_AND(TIPO, 16) <> 0) then
            BEGIN
            SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 35 INTO :NOMTIPO;
            FOR SELECT C.PREF_PRE, COTI_NUMERO, COTI_FECHA, ARTI_COD, CTDE_CANT * CTDE_FACTOR, (CTDE_TOTAL-CTDE_IVAMONTO-CTDE_CONSUMO)*COTI_FACTOR,
                CTDE_IVAMONTO*COTI_FACTOR, CTDE_DTOPORC, CTDE_TOTAL*COTI_FACTOR, CTDE_CONSUMO
                FROM COTIZACIONES C, COTIZACIONES_DETALLE D, PREFIJOS P
                WHERE C.COTI_ID = D.COTI_ID AND ARTI_COD = :ARTICULO AND COTI_FECHA >= :FECINI AND COTI_FECHA <= :FECFIN AND VEND_COD = :CODVEND AND COTI_ANULADO = 'N'
                 AND P.PREF_PRE = C.PREF_PRE AND P.TIDO_COD = 35 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                ORDER BY COTI_FECHA, C.COTI_ID, CTDE_ITEM
                INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :DTO, :TOTAL, :CONSUMO
                DO
                BEGIN
                SELECT ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO WHERE ARTI_COD = :ARTICULO
                    INTO :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC;
                SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                EXECUTE PROCEDURE costo_promedio (:ARTICULO, :FECHA) RETURNING_VALUES (:COSTOUNIT);
                COSTO = COSTOUNIT * CANTIDAD;
                UTILIDAD = BASE - COSTO;
                if (UOM = 'UTILIDAD') then
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                else
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
                if (CEROS = 'S') then
                    INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (4, USER, :ARTICULO);
                SUSPEND;
                END
            if (CEROS = 'S') then
                BEGIN
                COSTO = 0;
                UTILIDAD = 0;
                PORC = 0;
                /* agregue los articulos sin factura */
                FOR SELECT ARTI_COD, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN and
                    not exists (select REPA_ARTICULO FROM REPORTES_AUX WHERE REPA_ID = 4 AND REPA_USER = USER AND REPA_ARTICULO = a.arti_cod)
                    INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                    DO
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        END
    END
END

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE REP_UTILIDAD_VENTAS(
    TIPO INTEGER,
    DETALLE CHAR(1),
    FECINI DATE,
    FECFIN DATE,
    ARTINI VARCHAR(15),
    ARTFIN VARCHAR(15),
    GRPINI VARCHAR(3),
    GRPFIN VARCHAR(3),
    ORDEN CHAR(1),
    AGRUPA CHAR(1),
    CEROS CHAR(1),
    SUBEMPRESA INTEGER)
RETURNS (
    ARTICULO VARCHAR(15),
    DESCRIPCION VARCHAR(60),
    CODGRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    CODSUBG VARCHAR(3),
    NOMSUBG VARCHAR(30),
    CODMARC VARCHAR(3),
    NOMMARC VARCHAR(30),
    UNIDAD VARCHAR(8),
    CANTIDAD NUMERIC(18,4),
    BASE NUMERIC(18,4),
    COSTO NUMERIC(18,4),
    UTILIDAD NUMERIC(18,4),
    PORC NUMERIC(9,2),
    IVA NUMERIC(18,4),
    CONSUMO NUMERIC(18,4),
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    TIPODOC INTEGER)
AS
DECLARE VARIABLE COSTOUNIT NUMERIC(18,4);
declare variable CODINI VARCHAR(15);
declare variable CODFIN VARCHAR(15);
declare variable DESINI VARCHAR(15);
declare variable DESFIN VARCHAR(15);
declare variable MARINI VARCHAR(3);
declare variable MARFIN VARCHAR(3);
declare variable UOM VARCHAR(20);
declare variable NUMROWS INTEGER;
BEGIN
if (ORDEN = 'C') then
    BEGIN
    CODINI = ARTINI;
    CODFIN = ARTFIN;
    DESINI = '';
    DESFIN = 'zz';
    END
ELSE
    BEGIN
    DESINI = ARTINI;
    DESFIN = ARTFIN;
    CODINI = '';
    CODFIN = 'zz';
    END
if (AGRUPA = 'G') then
    BEGIN
    MARINI = '';
    MARFIN = 'zz';
    END
ELSE
    if (AGRUPA = 'M') then
        BEGIN
        MARINI = GRPINI;
        MARFIN = GRPFIN;
        GRPINI = '';
        GRPFIN = 'zz';
        END
    ELSE
        BEGIN
        MARINI = '';
        MARFIN = 'zz';
        GRPINI = '';
        GRPFIN = 'zz';
        END
EXECUTE PROCEDURE lee_configuracion ('FACTURACION', 'ARTICULOS', 'SUGERIR PRECIOS CON PORCENTAJE DE MARGEN O UTILIDAD') returning_values (:UOM);
if (DETALLE = 'N') then
    BEGIN
    if (BIN_AND(TIPO, 1) <> 0) then
        BEGIN
        TIPODOC = 31;
        /* BORRA LA TABLA AUXILIAR */
        DELETE FROM reportes_aux WHERE REPA_ID = 2 AND REPA_USER = USER;

        FOR SELECT MAX(D.ARTI_COD), SUM(FADE_CANT * FADE_FACTOR), SUM((FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO)*FACT_FACTOR), SUM(FADE_IVAMONTO*FACT_FACTOR), SUM(FADE_CONSUMO),
            MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD), SUM(COST_SALP)
            FROM FACTURAS_DETALLE D, FACTURAS F, PREFIJOS P, ARTICULO A, movimiento_articulo m, costos c
            WHERE F.FACT_ID = D.FACT_ID AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND D.ARTI_COD = A.arti_cod AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            F.fact_id = M.mvar_idref AND M.mvar_tipodoc = 31 AND M.mvar_item = D.fade_item AND M.mvar_cons = C.cost_idmov AND
            FACT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) and substring(a.arti_cod from 1 FOR 2) <> '.t'
            GROUP BY D.ARTI_COD
            INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,
            :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :COSTO
            DO
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
/*            EXECUTE PROCEDURE costo_promedio (:ARTICULO, :FECFIN) RETURNING_VALUES (:COSTOUNIT);*/
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
/*            COSTO = cantidad * COSTOUNIT;*/
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                if (COSTO > 0) then
                    PORC = UTILIDAD * 100 / COSTO;
                ELSE
                    PORC = 100;
            else
                if (BASE > 0) then
                    PORC = UTILIDAD * 100 / BASE;
                ELSE
                    PORC = 0;
            if (CEROS = 'S') then
                INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (2, USER, :ARTICULO);
            SUSPEND;
            END /* FOR */
        if (CEROS = 'S') then
            BEGIN
            COSTO = 0;
            UTILIDAD = 0;
            PORC = 0;
            /* agregue los articulos sin factura */
            FOR SELECT ARTI_COD, 0, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND
                    A.ARTI_DES <= :DESFIN AND A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND
                    (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN)))
                INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,:DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                DO
                BEGIN
                SELECT COUNT(REPA_ARTICULO) FROM REPORTES_AUX WHERE REPA_ID = 2 AND REPA_USER = USER AND REPA_ARTICULO = :articulo INTO :numrows;
                if (numrows = 0) then
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        END
    if (BIN_AND(TIPO, 2) <> 0) then
        BEGIN
        TIPODOC = 32;
        /* BORRA LA TABLA AUXILIAR */
        DELETE FROM reportes_aux WHERE REPA_ID = 2 AND REPA_USER = USER;

        FOR SELECT MAX(D.ARTI_COD), SUM(RVDE_CANT * RVDE_FACTOR), SUM(RVDE_TOTAL-RVDE_IVAMONTO-RVDE_CONSUMO), SUM(RVDE_IVAMONTO), SUM(RVDE_CONSUMO),
            MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD), SUM(COST_SALP)
            FROM REMISIONES_VENTA_DETALLE D, REMISIONES_VENTA R, PREFIJOS P, ARTICULO A, movimiento_articulo m, costos c
            WHERE R.REVT_ID = D.REVT_ID AND P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = 32 AND D.ARTI_COD = A.arti_cod AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            R.revt_id = M.mvar_idref AND M.mvar_tipodoc = 32 AND M.mvar_item = D.rvde_item AND M.mvar_cons = C.cost_idmov AND
            REVT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY D.ARTI_COD
            INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,
            :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :COSTO
            DO
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
/*            EXECUTE PROCEDURE costo_promedio (:ARTICULO, :FECFIN) RETURNING_VALUES (:COSTOUNIT); */
/*            COSTO = cantidad * COSTOUNIT;*/
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                if (COSTO > 0) then
                    PORC = UTILIDAD * 100 / COSTO;
                ELSE
                    PORC = 100;
            else
                if (BASE > 0) then
                    PORC = UTILIDAD * 100 / BASE;
                ELSE
                    PORC = 0;
            if (CEROS = 'S') then
                INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (2, USER, :ARTICULO);
            SUSPEND;
            END /* FOR */
        if (CEROS = 'S') then
            BEGIN
            COSTO = 0;
            UTILIDAD = 0;
            PORC = 0;
            /* agregue los articulos sin factura */
            FOR SELECT ARTI_COD, 0, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND
                    A.ARTI_DES <= :DESFIN AND A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND
                    (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN)))
                INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,:DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                DO
                BEGIN
                SELECT COUNT(REPA_ARTICULO) FROM REPORTES_AUX WHERE REPA_ID = 2 AND REPA_USER = USER AND REPA_ARTICULO = :articulo INTO :numrows;
                if (numrows = 0) then
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        END
    if (BIN_AND(TIPO, 4) <> 0) then
        BEGIN
        TIPODOC = 33;
        /* BORRA LA TABLA AUXILIAR */
        DELETE FROM reportes_aux WHERE REPA_ID = 2 AND REPA_USER = USER;

        FOR SELECT MAX(D.ARTI_COD), SUM(DVDE_CANT * DVDE_FACTOR), SUM((DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO)*DEVT_FACTOR), SUM(DVDE_IVAMONTO*DEVT_FACTOR), SUM(DVDE_CONSUMO),
            MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD), SUM(COST_ENTP)
            FROM devoluciones_ventas_detalle D, DEVOLUCIONES_VENTAS V, PREFIJOS P, ARTICULO A, MOVIMIENTO_ARTICULO M, COSTOS C
            WHERE V.DEVT_ID = D.DEVT_ID AND P.PREF_PRE = V.PREF_PRE AND P.TIDO_COD = 33 AND D.ARTI_COD = A.arti_cod AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            V.devt_id = M.mvar_idref AND M.mvar_tipodoc = 33 AND M.mvar_item = D.dvde_item AND M.mvar_cons = C.cost_idmov AND
            DEVT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY D.ARTI_COD
            INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,
            :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :COSTO
            DO
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            else
                CANTIDAD = CANTIDAD * -1;
            if (BASE IS NULL) then
                BASE = 0;
            else
                BASE = BASE * -1;
            if (IVA IS NULL) then
                IVA = 0;
            else
                IVA = IVA * -1;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            else
                CONSUMO = CONSUMO * -1;
/*            EXECUTE PROCEDURE costo_promedio (:ARTICULO, :FECFIN) RETURNING_VALUES (:COSTOUNIT);*/
/*            COSTO = cantidad * COSTOUNIT;*/
            COSTO = costo * -1;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                if (COSTO < 0) then
                    PORC = UTILIDAD * 100 / COSTO;
                ELSE
                    PORC = 100;
            else
                if (BASE < 0) then
                    PORC = UTILIDAD * 100 / BASE;
                ELSE
                    PORC = 0;
            if (CEROS = 'S') then
                INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (2, USER, :ARTICULO);
            SUSPEND;
            END /* FOR */
        if (CEROS = 'S') then
            BEGIN
            COSTO = 0;
            UTILIDAD = 0;
            PORC = 0;
            /* agregue los articulos sin factura */
            FOR SELECT ARTI_COD, 0, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND
                    A.ARTI_DES <= :DESFIN AND A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND
                    (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN)))
                INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,:DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                DO
                BEGIN
                SELECT COUNT(REPA_ARTICULO) FROM REPORTES_AUX WHERE REPA_ID = 2 AND REPA_USER = USER AND REPA_ARTICULO = :articulo INTO :numrows;
                if (numrows = 0) then
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        END
    if (BIN_AND(TIPO, 8) <> 0) then
        BEGIN
        TIPODOC = 34;
        /* BORRA LA TABLA AUXILIAR */
        DELETE FROM reportes_aux WHERE REPA_ID = 2 AND REPA_USER = USER;

        FOR SELECT MAX(D.ARTI_COD), SUM(PEDE_CANT * PEDE_FACTOR), SUM((PEDE_TOTAL-PEDE_IVAMONTO-PEDE_CONSUMO)*PEDI_FACTOR), SUM(PEDE_IVAMONTO*PEDI_FACTOR), SUM(PEDE_CONSUMO),
            MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD)
            FROM PEDIDOS_DETALLE D, PEDIDOS P, PREFIJOS R, ARTICULO A
            WHERE P.PEDI_ID = D.PEDI_ID AND P.PREF_PRE = R.PREF_PRE AND R.TIDO_COD = 34 AND D.ARTI_COD = A.arti_cod AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            PEDI_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY D.ARTI_COD
            INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,
            :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
            DO
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            EXECUTE PROCEDURE costo_promedio (:ARTICULO, :FECFIN) RETURNING_VALUES (:COSTOUNIT);
            COSTO = cantidad * COSTOUNIT;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                if (COSTO > 0) then
                    PORC = UTILIDAD * 100 / COSTO;
                ELSE
                    PORC = 100;
            else
                if (BASE > 0) then
                    PORC = UTILIDAD * 100 / BASE;
                ELSE
                    PORC = 0;
            if (CEROS = 'S') then
                INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (2, USER, :ARTICULO);
            SUSPEND;
            END /* FOR */
        if (CEROS = 'S') then
            BEGIN
            COSTO = 0;
            UTILIDAD = 0;
            PORC = 0;
            /* agregue los articulos sin factura */
            FOR SELECT ARTI_COD, 0, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND
                    A.ARTI_DES <= :DESFIN AND A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND
                    (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN)))
                INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,:DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                DO
                BEGIN
                SELECT COUNT(REPA_ARTICULO) FROM REPORTES_AUX WHERE REPA_ID = 2 AND REPA_USER = USER AND REPA_ARTICULO = :articulo INTO :numrows;
                if (numrows = 0) then
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        END
    if (BIN_AND(TIPO, 16) <> 0) then
        BEGIN
        TIPODOC = 35;
        /* BORRA LA TABLA AUXILIAR */
        DELETE FROM reportes_aux WHERE REPA_ID = 2 AND REPA_USER = USER;

        FOR SELECT MAX(D.ARTI_COD), SUM(CTDE_CANT * CTDE_FACTOR), SUM((CTDE_TOTAL-CTDE_IVAMONTO-CTDE_CONSUMO)*COTI_FACTOR), SUM(CTDE_IVAMONTO), SUM(CTDE_CONSUMO),
            MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD)
            FROM COTIZACIONES_DETALLE D, COTIZACIONES C, PREFIJOS P, ARTICULO A
            WHERE C.COTI_ID = D.COTI_ID AND P.PREF_PRE = C.PREF_PRE AND P.TIDO_COD = 35 AND D.ARTI_COD = A.arti_cod AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND COTI_FECHA >= :FECINI AND COTI_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            COTI_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY D.ARTI_COD
            INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,
            :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
            DO
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            EXECUTE PROCEDURE costo_promedio (:ARTICULO, :FECFIN) RETURNING_VALUES (:COSTOUNIT);
            COSTO = cantidad * COSTOUNIT;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                if (COSTO > 0) then
                    PORC = UTILIDAD * 100 / COSTO;
                ELSE
                    PORC = 100;
            else
                if (BASE > 0) then
                    PORC = UTILIDAD * 100 / BASE;
                ELSE
                    PORC = 0;
            if (CEROS = 'S') then
                INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (2, USER, :ARTICULO);
            SUSPEND;
            END /* FOR */
        if (CEROS = 'S') then
            BEGIN
            COSTO = 0;
            UTILIDAD = 0;
            PORC = 0;
            /* agregue los articulos sin factura */
            FOR SELECT ARTI_COD, 0, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND
                    A.ARTI_DES <= :DESFIN AND A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND
                    (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN)))
                INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,:DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                DO
                BEGIN
                SELECT COUNT(REPA_ARTICULO) FROM REPORTES_AUX WHERE REPA_ID = 2 AND REPA_USER = USER AND REPA_ARTICULO = :articulo INTO :numrows;
                if (numrows = 0) then
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        END
    END
ELSE
    BEGIN
    if (BIN_AND(TIPO, 1) <> 0) then
        BEGIN
        TIPODOC = 31;
        FOR SELECT F.PREF_PRE, FACT_NUMERO, FACT_FECHA, D.ARTI_COD, FADE_CANT * FADE_FACTOR, (FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO)*FACT_FACTOR, FADE_IVAMONTO*FACT_FACTOR, FADE_CONSUMO,
            ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD, COST_SALP
            FROM FACTURAS F, FACTURAS_DETALLE D, PREFIJOS P, ARTICULO A, MOVIMIENTO_ARTICULO M, COSTOS C
            WHERE F.FACT_ID = D.FACT_ID AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND D.ARTI_COD = A.arti_cod AND
                A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
                A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND FACT_FECHA >= :FECINI AND
                (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
                F.fact_id = M.mvar_idref AND M.mvar_tipodoc = 31 AND M.mvar_item = D.fade_item AND M.mvar_cons = C.cost_idmov AND
                FACT_FECHA <= :FECFIN AND FACT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) and substring(a.arti_cod from 1 FOR 2) <> '.t'
            ORDER BY D.ARTI_COD, FACT_FECHA, F.FACT_ID, FADE_ITEM
            INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,
                :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :COSTO
            DO
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
/*            EXECUTE PROCEDURE costo_promedio (:ARTICULO, :FECHA) RETURNING_VALUES (:COSTOUNIT);*/
/*            COSTO = COSTOUNIT * CANTIDAD;*/
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                if (COSTO > 0) then
                    PORC = UTILIDAD * 100 / COSTO;
                ELSE
                    PORC = 100;
            else
                if (BASE > 0) then
                    PORC = UTILIDAD * 100 / BASE;
                ELSE
                    PORC = 0;
            SUSPEND;
            END
        END
    if (BIN_AND(TIPO, 2) <> 0) then
        BEGIN
        TIPODOC = 32;
        FOR SELECT R.PREF_PRE, REVT_NUMERO, REVT_FECHA, D.ARTI_COD, RVDE_CANT * RVDE_FACTOR, RVDE_TOTAL-RVDE_IVAMONTO-RVDE_CONSUMO, RVDE_IVAMONTO, RVDE_CONSUMO,
            ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD, COST_SALP
            FROM REMISIONES_VENTA R, REMISIONES_VENTA_DETALLE D, PREFIJOS P, ARTICULO A, MOVIMIENTO_ARTICULO M, COSTOS C
            WHERE R.REVT_ID = D.REVT_ID AND P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = 32 AND D.ARTI_COD = A.arti_cod AND
                A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
                A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN AND
                R.revt_id = M.mvar_idref AND M.mvar_tipodoc = 32 AND M.mvar_item = D.rvde_item AND M.mvar_cons = C.cost_idmov AND
                (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
                REVT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            ORDER BY D.ARTI_COD, REVT_FECHA, R.REVT_ID, RVDE_ITEM
            INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,
                :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :COSTO
            DO
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            EXECUTE PROCEDURE costo_promedio (:ARTICULO, :FECHA) RETURNING_VALUES (:COSTOUNIT);
            COSTO = COSTOUNIT * CANTIDAD;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                if (COSTO > 0) then
                    PORC = UTILIDAD * 100 / COSTO;
                ELSE
                    PORC = 100;
            else
                if (BASE > 0) then
                    PORC = UTILIDAD * 100 / BASE;
                ELSE
                    PORC = 0;
            SUSPEND;
            END
        END
    if (BIN_AND(TIPO, 4) <> 0) then
        BEGIN
        TIPODOC = 33;
        FOR SELECT V.PREF_PRE, DEVT_NUMERO, DEVT_FECHA, D.ARTI_COD, DVDE_CANT * DVDE_FACTOR, (DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO)*DEVT_FACTOR, DVDE_IVAMONTO*DEVT_FACTOR, DVDE_CONSUMO,
            ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD, COST_ENTP
            FROM DEVOLUCIONES_VENTAS V, DEVOLUCIONES_VENTAS_DETALLE D, PREFIJOS P, ARTICULO A, MOVIMIENTO_ARTICULO M, COSTOS C
            WHERE V.DEVT_ID = D.DEVT_ID AND P.PREF_PRE = V.PREF_PRE AND P.TIDO_COD = 33 AND D.ARTI_COD = A.arti_cod AND
                A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
                A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND
                (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
                V.devt_id = M.mvar_idref AND M.mvar_tipodoc = 33 AND M.mvar_item = D.dvde_item AND M.mvar_cons = C.cost_idmov AND
                DEVT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            ORDER BY D.ARTI_COD, DEVT_FECHA, V.DEVT_ID, DVDE_ITEM
            INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,
                :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :COSTO
            DO
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            EXECUTE PROCEDURE costo_promedio (:ARTICULO, :FECHA) RETURNING_VALUES (:COSTOUNIT);
            BASE = BASE * -1;
            CANTIDAD = CANTIDAD * -1;
            IVA = IVA * -1;
            CONSUMO = CONSUMO * -1;
            COSTO = COSTOUNIT * CANTIDAD;
            COSTO = COSTO * -1;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                if (COSTO > 0) then
                    PORC = UTILIDAD * 100 / COSTO;
                ELSE
                    PORC = 100;
            else
                if (BASE > 0) then
                    PORC = UTILIDAD * 100 / BASE;
                ELSE
                    PORC = 0;
            SUSPEND;
            END
        END
    if (BIN_AND(TIPO, 8) <> 0) then
        BEGIN
        TIPODOC = 34;
        FOR SELECT P.PREF_PRE, PEDI_NUMERO, PEDI_FECHA, D.ARTI_COD, PEDE_CANT * PEDE_FACTOR, (PEDE_TOTAL-PEDE_IVAMONTO-PEDE_CONSUMO)*PEDI_FACTOR, PEDE_IVAMONTO*PEDI_FACTOR, PEDE_CONSUMO,
            ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD 
            FROM PEDIDOS P, PEDIDOS_DETALLE D, PREFIJOS R, ARTICULO A
            WHERE P.PEDI_ID = D.PEDI_ID AND P.PREF_PRE = R.PREF_PRE AND R.TIDO_COD = 34 AND D.ARTI_COD = A.arti_cod AND
                A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
                A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND
                (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
                PEDI_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            ORDER BY D.ARTI_COD, PEDI_FECHA, P.PEDI_ID, PEDE_ITEM
            INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,
                :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
            DO
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            EXECUTE PROCEDURE costo_promedio (:ARTICULO, :FECHA) RETURNING_VALUES (:COSTOUNIT);
            COSTO = COSTOUNIT * CANTIDAD;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                if (COSTO > 0) then
                    PORC = UTILIDAD * 100 / COSTO;
                ELSE
                    PORC = 100;
            else
                if (BASE > 0) then
                    PORC = UTILIDAD * 100 / BASE;
                ELSE
                    PORC = 0;
            SUSPEND;
            END
        END
    if (BIN_AND(TIPO, 16) <> 0) then
        BEGIN
        TIPODOC = 35;
        FOR SELECT C.PREF_PRE, COTI_NUMERO, COTI_FECHA, D.ARTI_COD, CTDE_CANT * CTDE_FACTOR, (CTDE_TOTAL-CTDE_IVAMONTO-CTDE_CONSUMO)*COTI_FACTOR, CTDE_IVAMONTO*COTI_FACTOR, CTDE_CONSUMO,
            ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD 
            FROM COTIZACIONES C, COTIZACIONES_DETALLE D, PREFIJOS P, ARTICULO A
            WHERE C.COTI_ID = D.COTI_ID AND P.PREF_PRE = C.PREF_PRE AND P.TIDO_COD = 35 AND D.ARTI_COD = A.arti_cod AND
                A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
                A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND COTI_FECHA >= :FECINI AND COTI_FECHA <= :FECFIN AND
                (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
                COTI_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            ORDER BY D.ARTI_COD, COTI_FECHA, C.COTI_ID, CTDE_ITEM
            INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,
                :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
            DO
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            EXECUTE PROCEDURE costo_promedio (:ARTICULO, :FECHA) RETURNING_VALUES (:COSTOUNIT);
            COSTO = COSTOUNIT * CANTIDAD;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                if (COSTO > 0) then
                    PORC = UTILIDAD * 100 / COSTO;
                ELSE
                    PORC = 100;
            else
                if (BASE > 0) then
                    PORC = UTILIDAD * 100 / BASE;
                ELSE
                    PORC = 0;
            SUSPEND;
            END
        END
    END
END

^

SET TERM ; ^

SET TERM ^ ;

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

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE TARIFAS_ENSAMBLE(
    PRODUCTO VARCHAR(20),
    PRECIO NUMERIC(18,2),
    FECHA DATE)
RETURNS (
    T0 NUMERIC(18,2),
    T1 NUMERIC(18,2),
    T2 NUMERIC(18,2),
    T3 NUMERIC(18,2),
    T4 NUMERIC(18,2),
    TC NUMERIC(18,2))
AS
declare variable COSTO NUMERIC(18,2);
declare variable TOTAL NUMERIC(18,2);
declare variable TARIFA INTEGER;
declare variable COMPON VARCHAR(20);
declare variable CANT NUMERIC(18,4);
declare variable UNIDAD VARCHAR(8);
declare variable CONSUMO NUMERIC(18,2);
begin
T0 = 0;
T1 = 0;
T2 = 0;
T3 = 0;
T4 = 0;
TC = 0;
TOTAL = 0;
FOR SELECT ARPR_COMP, ARPR_CANT, ARPR_UNIDAD, TAIV_COD, ARTI_CONSUMO
    FROM articulos_producto P, ARTICULO A WHERE P.ARTI_COD = :PRODUCTO AND P.arpr_comp = A.arti_cod
    INTO :COMPON, :CANT, :UNIDAD, :TARIFA, :CONSUMO
    DO
    BEGIN
    EXECUTE PROCEDURE cantidad_por_factor (:COMPON, :CANT, :UNIDAD) returning_values (:cant);
    EXECUTE PROCEDURE costo_promedio (:COMPON, :FECHA) returning_values (:COSTO);
    TOTAL = TOTAL + COSTO * CANT;
    TC = TC + CONSUMO * CANT;
    if (TARIFA = 0) then
        T0 = T0 + COSTO * CANT;
    if (TARIFA = 1) then
        T1 = T1 + COSTO * CANT;
    if (TARIFA = 2) then
        T2 = T2 + COSTO * CANT;
    if (TARIFA = 3) then
        T3 = T3 + COSTO * CANT;
    if (TARIFA = 4) then
        T4 = T4 + COSTO * CANT;
    END
if (TOTAL <> 0) then
    BEGIN
    T0 = T0 * PRECIO / TOTAL;
    T1 = T1 * PRECIO / TOTAL;
    T2 = T2 * PRECIO / TOTAL;
    T3 = T3 * PRECIO / TOTAL;
    T4 = T4 * PRECIO / TOTAL;
    END
ELSE
    BEGIN
    T0 = 0;
    T1 = 0;
    T2 = 0;
    T3 = 0;
    T4 = 0;
    END
suspend;
end

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE UTILIDAD_VENTAS(
    TIPO INTEGER,
    DETALLE CHAR(1),
    FECINI DATE,
    FECFIN DATE,
    PREFIJO VARCHAR(4),
    SUBEMPRESA INTEGER)
RETURNS (
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    PTVTID INTEGER,
    VENDCOD INTEGER,
    NIT VARCHAR(20),
    NOMTERCERO VARCHAR(60),
    ARTICULO VARCHAR(15),
    ARTIDES VARCHAR(60),
    CANT NUMERIC(18,4),
    UNIDAD VARCHAR(8),
    PRECIO NUMERIC(18,2),
    COSTO NUMERIC(18,2),
    UTILIDAD NUMERIC(18,2),
    PORC NUMERIC(9,2))
AS
declare variable IMPTOS CHAR(1);
declare variable ID INTEGER;
declare variable IVA NUMERIC(18,2);
declare variable COSTOT NUMERIC(18,2);
declare variable PRECIOT NUMERIC(18,2);
declare variable UOM VARCHAR(20);
declare variable icoinc char(2);
declare variable consumo NUMERIC(18,2);
declare variable factor NUMERIC(18,4);
BEGIN
EXECUTE PROCEDURE lee_configuracion ('FACTURACION', 'ARTICULOS', 'SUGERIR PRECIOS CON PORCENTAJE DE MARGEN O UTILIDAD') returning_values (:UOM);
EXECUTE PROCEDURE lee_configuracion ('FACTURACION', 'ARTICULOS', 'IMPOCONSUMO INCLUIDO EN EL PRECIO BASE DE VENTA ANTES DE IVA') returning_values (:icoinc);
/* DETERMINE LA TABLA A EXAMINAR */
if (TIPO = 31) then
    BEGIN
    /* FACTURA */
    FOR SELECT FACT_ID, F.PREF_PRE, FACT_NUMERO, FACT_FECHA, PTVT_ID, VEND_COD, TERC_NIT, FACT_NOMCLIENTE, FACT_IVAINC, fact_factor
        FROM FACTURAS F, PREFIJOS P
        WHERE FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND FACT_ANULADO = 'N'
         AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = :TIPO AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
        ORDER BY FACT_FECHA, F.PREF_PRE, FACT_NUMERO
        INTO :ID, :PREF, :NUMERO, :FECHA, :PTVTID, :VENDCOD, :NIT, :NOMTERCERO, :IMPTOS, :factor
        DO
        if ((PREFIJO = '') or (PREFIJO = PREF)) then
          BEGIN
          COSTOT = 0;
          PRECIOT = 0;
          FOR SELECT D.ARTI_COD, SUBSTR(FADE_DESC,1,60), FADE_CANT * FADE_FACTOR, FADE_UNIDAD, (FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO)*:FACTOR, FADE_IVAMONTO, fade_consumo
            FROM FACTURAS_DETALLE D
            WHERE FACT_ID = :ID and substring(D.arti_cod from 1 FOR 2) <> '.t'
            INTO :ARTICULO, :ARTIDES, :CANT, :UNIDAD, :PRECIO, :IVA, :consumo
            DO
                BEGIN
                EXECUTE PROCEDURE COSTO_PROMEDIO(:ARTICULO, :FECHA) returning_values (:COSTO);
                COSTO = COSTO * CANT;
                if (DETALLE = 'S') then
                    BEGIN
                    UTILIDAD = PRECIO - COSTO;
                    if (UOM = 'UTILIDAD') then
                        EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                    else
                        EXECUTE PROCEDURE PORCENTAJE (utilidad,  PRECIO, 'S') returning_values (PORC);
                    SUSPEND;
                    END
                ELSE
                    BEGIN
                    COSTOT = COSTOT + COSTO;
                    PRECIOT = PRECIOT + PRECIO;
                    END
                END
          if (DETALLE <> 'S') then
            BEGIN
            COSTO = COSTOT;
            PRECIO = PRECIOT;
            UTILIDAD = PRECIO - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  PRECIO, 'S') returning_values (PORC);
            SUSPEND;
            END
          END
    END
  if (TIPO = 32) then
    BEGIN
    /* REMISION */
    FOR SELECT REVT_ID, R.PREF_PRE, REVT_NUMERO, REVT_FECHA, PTVT_ID, VEND_COD, TERC_NIT, REVT_NOMTERC, REVT_IVAINC
        FROM REMISIONES_VENTA R, PREFIJOS P
        WHERE REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN AND REVT_ANULADO = 'N'
         AND P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = :TIPO AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
        ORDER BY REVT_FECHA, R.PREF_PRE, REVT_NUMERO
        INTO :ID, :PREF, :NUMERO, :FECHA, :PTVTID, :VENDCOD, :NIT, :NOMTERCERO, :IMPTOS
        DO
        if ((PREFIJO = '') or (PREFIJO = PREF)) then
          BEGIN
          COSTOT = 0;
          PRECIOT = 0;
          FOR SELECT D.ARTI_COD, SUBSTR(RVDE_DESC,1,60), RVDE_CANT * RVDE_FACTOR, RVDE_UNIDAD, (RVDE_TOTAL-RVDE_IVAMONTO-RVDE_CONSUMO), RVDE_IVAMONTO, rvde_consumo
            FROM REMISIONES_VENTA_DETALLE D
            WHERE REVT_ID = :ID and substring(D.arti_cod from 1 FOR 2) <> '.t'
            INTO :ARTICULO, :ARTIDES, :CANT, :UNIDAD, :PRECIO, :IVA, :consumo
            DO
                BEGIN
                EXECUTE PROCEDURE COSTO_PROMEDIO(:ARTICULO, :FECHA) returning_values (:COSTO);
                COSTO = COSTO * CANT;
                if (DETALLE = 'S') then
                    BEGIN
                    UTILIDAD = PRECIO - COSTO;
                    if (UOM = 'UTILIDAD') then
                        EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                    else
                        EXECUTE PROCEDURE PORCENTAJE (utilidad,  PRECIO, 'S') returning_values (PORC);
                    SUSPEND;
                    END
                ELSE
                    BEGIN
                    COSTOT = COSTOT + COSTO;
                    PRECIOT = PRECIOT + PRECIO;
                    END
                END
          if (DETALLE <> 'S') then
            BEGIN
            COSTO = COSTOT;
            PRECIO = PRECIOT;
            UTILIDAD = PRECIO - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  PRECIO, 'S') returning_values (PORC);
            SUSPEND;
            END
          END
    END
  if (TIPO = 33) then
    BEGIN
    /* DEVOLUCION */
    FOR SELECT DEVT_ID, D.PREF_PRE, DEVT_NUMERO, DEVT_FECHA, PTVT_ID, VEND_COD, TERC_NIT, DEVT_NOMTERC, DEVT_IVAINC, DEVT_FACTOR
        FROM DEVOLUCIONES_VENTAS D, PREFIJOS P
        WHERE DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND DEVT_ANULADO = 'N'
         AND P.PREF_PRE = D.PREF_PRE AND P.TIDO_COD = :TIPO AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
        ORDER BY DEVT_FECHA, D.PREF_PRE, DEVT_NUMERO
        INTO :ID, :PREF, :NUMERO, :FECHA, :PTVTID, :VENDCOD, :NIT, :NOMTERCERO, :IMPTOS, :FACTOR
        DO
        if ((PREFIJO = '') or (PREFIJO = PREF)) then
          BEGIN
          COSTOT = 0;
          PRECIOT = 0;
          FOR SELECT D.ARTI_COD, SUBSTR(DVDE_DESC,1,60), DVDE_CANT * DVDE_FACTOR, DVDE_UNIDAD, (DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO)*:FACTOR, DVDE_IVAMONTO, dvde_consumo
            FROM DEVOLUCIONES_VENTAS_DETALLE D
            WHERE DEVT_ID = :ID and substring(D.arti_cod from 1 FOR 2) <> '.t'
            INTO :ARTICULO, :ARTIDES, :CANT, :UNIDAD, :PRECIO, :IVA, :consumo
            DO
                BEGIN
                EXECUTE PROCEDURE COSTO_PROMEDIO(:ARTICULO, :FECHA) returning_values (:COSTO);
                COSTO = COSTO * CANT;
                if (DETALLE = 'S') then
                    BEGIN
                    UTILIDAD = PRECIO - COSTO;
                    if (UOM = 'UTILIDAD') then
                        EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                    else
                        EXECUTE PROCEDURE PORCENTAJE (utilidad,  PRECIO, 'S') returning_values (PORC);
                    SUSPEND;
                    END
                ELSE
                    BEGIN
                    COSTOT = COSTOT + COSTO;
                    PRECIOT = PRECIOT + PRECIO;
                    END
                END
        if (DETALLE <> 'S') then
            BEGIN
            COSTO = COSTOT;
            PRECIO = PRECIOT;
            UTILIDAD = PRECIO - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  PRECIO, 'S') returning_values (PORC);
            SUSPEND;
            END
        END
    END
  if (TIPO = 34) then
    BEGIN
    /* PEDIDO */
    FOR SELECT PEDI_ID, P.PREF_PRE, PEDI_NUMERO, PEDI_FECHA, PTVT_ID, VEND_COD, TERC_NIT, PEDI_NOMTERC, PEDI_IVAINC, PEDI_FACTOR
        FROM PEDIDOS P, PREFIJOS R
        WHERE PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND PEDI_ANULADO = 'N'
         AND P.PREF_PRE = R.PREF_PRE AND R.TIDO_COD = :TIPO AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
        ORDER BY PEDI_FECHA, P.PREF_PRE, PEDI_NUMERO
        INTO :ID, :PREF, :NUMERO, :FECHA, :PTVTID, :VENDCOD, :NIT, :NOMTERCERO, :IMPTOS, :FACTOR
        DO
        if ((PREFIJO = '') or (PREFIJO = PREF)) then
          BEGIN
          COSTOT = 0;
          PRECIOT = 0;
          FOR SELECT ARTI_COD, SUBSTR(PEDE_DESC,1,60), PEDE_CANT * PEDE_FACTOR, PEDE_UNIDAD, (PEDE_TOTAL-PEDE_IVAMONTO-PEDE_CONSUMO)*:FACTOR, PEDE_IVAMONTO, pede_consumo
            FROM PEDIDOS_DETALLE
            WHERE PEDI_ID = :ID
            INTO :ARTICULO, :ARTIDES, :CANT, :UNIDAD, :PRECIO, :IVA, :consumo
            DO
                BEGIN
                EXECUTE PROCEDURE COSTO_PROMEDIO(:ARTICULO, :FECHA) returning_values (:COSTO);
                COSTO = COSTO * CANT;
                if (DETALLE = 'S') then
                    BEGIN
                    UTILIDAD = PRECIO - COSTO;
                    if (UOM = 'UTILIDAD') then
                        EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                    else
                        EXECUTE PROCEDURE PORCENTAJE (utilidad,  PRECIO, 'S') returning_values (PORC);
                    SUSPEND;
                    END
                ELSE
                    BEGIN
                    COSTOT = COSTOT + COSTO;
                    PRECIOT = PRECIOT + PRECIO;
                    END
                END
        if (DETALLE <> 'S') then
            BEGIN
            COSTO = COSTOT;
            PRECIO = PRECIOT;
            UTILIDAD = PRECIO - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  PRECIO, 'S') returning_values (PORC);
            SUSPEND;
            END
        END
    END
  if (TIPO = 35) then
    BEGIN
    /* COTIZACION */
    FOR SELECT COTI_ID, C.PREF_PRE, COTI_NUMERO, COTI_FECHA, PTVT_ID, VEND_COD, TERC_NIT, COTI_NOMTERC, COTI_IMPTOS, COTI_FACTOR
        FROM COTIZACIONES C, PREFIJOS P
        WHERE COTI_FECHA >= :FECINI AND COTI_FECHA <= :FECFIN AND COTI_ANULADO = 'N'
         AND P.PREF_PRE = C.PREF_PRE AND P.TIDO_COD = :TIPO AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
        ORDER BY COTI_FECHA, C.PREF_PRE, COTI_NUMERO
        INTO :ID, :PREF, :NUMERO, :FECHA, :PTVTID, :VENDCOD, :NIT, :NOMTERCERO, :IMPTOS, :FACTOR
        DO
        if ((PREFIJO = '') or (PREFIJO = PREF)) then
          BEGIN
          COSTOT = 0;
          PRECIOT = 0;
          FOR SELECT ARTI_COD, SUBSTR(CTDE_DESC,1,60), CTDE_CANT * CTDE_FACTOR, CTDE_UNIDAD, (CTDE_TOTAL-CTDE_IVAMONTO-CTDE_CONSUMO)*:FACTOR, CTDE_IVAMONTO, ctde_consumo
            FROM COTIZACIONES_DETALLE
            WHERE COTI_ID = :ID
            INTO :ARTICULO, :ARTIDES, :CANT, :UNIDAD, :PRECIO, :IVA, :consumo
            DO
                BEGIN
                EXECUTE PROCEDURE COSTO_PROMEDIO(:ARTICULO, :FECHA) returning_values (:COSTO);
                COSTO = COSTO * CANT;
                if (DETALLE = 'S') then
                    BEGIN
                    UTILIDAD = PRECIO - COSTO;
                    if (UOM = 'UTILIDAD') then
                        EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                    else
                        EXECUTE PROCEDURE PORCENTAJE (utilidad,  PRECIO, 'S') returning_values (PORC);
                    SUSPEND;
                    END
                ELSE
                    BEGIN
                    COSTOT = COSTOT + COSTO;
                    PRECIOT = PRECIOT + PRECIO;
                    END
                END
        if (DETALLE <> 'S') then
            BEGIN
            COSTO = COSTOT;
            PRECIO = PRECIOT;
            UTILIDAD = PRECIO - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  PRECIO, 'S') returning_values (PORC);
            SUSPEND;
            END
        END
    END
END

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE CONTABILICE_COSTO_VENTAS(
    ID INTEGER,
    IDINTER INTEGER)
RETURNS (
    IDC INTEGER)
AS
declare variable PREF VARCHAR(4);
declare variable NUM VARCHAR(6);
declare variable NUMERO VARCHAR(10);
declare variable INVEN CHAR(1);
declare variable CTAINVEN VARCHAR(20);
declare variable COSTOS CHAR(1);
declare variable CTACOSTOS VARCHAR(20);
declare variable EXISTE CHAR(1);
declare variable CUENTA VARCHAR(20);
declare variable MONTO NUMERIC(18,2);
declare variable TIPOCUEN CHAR(1);
declare variable NIT VARCHAR(20);
declare variable PROY VARCHAR(4);
declare variable CENTRO VARCHAR(4);
declare variable ART VARCHAR(15);
declare variable ANULADO CHAR(1);
declare variable NROI INTEGER;
declare variable NUMROWS INTEGER;
declare variable CONC CHAR(120);
declare variable VENCEAUX DATE;
declare variable VENCE CHAR(8);
begin
/* TRAIGA EL ID DEL ENCABEZADO DEL COMPROBANTE CONTABLE */
SELECT ENCO_CONSEC FROM COMPROBANTE_ENCABEZADO WHERE ENCO_TIPOREF = 31 AND ENCO_IDREF = :ID INTO :IDC;
SELECT MAX(CODE_ITEM) FROM COMPROBANTE_DETALLE WHERE ENCO_CONSEC = :idc INTO :NROI;
NROI = NROI + 1;
/* EJECUTE LA PARTE DE CONTABIL_FACTURA QUE CORRESPONDE A LOS COSTOS */
EXISTE = 'N';
SELECT 'S', INVE_COSTO, INVE_INVEN, INVE_CTAINVEN, INVE_CTACOSTOS
    FROM INTERFAZ_VENTAS
    WHERE INVE_ID = :IDINTER
    INTO :EXISTE, :COSTOS, :INVEN, :CTAINVEN, :CTACOSTOS;
if (EXISTE = 'S') then
  BEGIN
  SELECT FACT_ANULADO, PREF_PRE, FACT_NUMERO, FACT_VENCE, TERC_NIT FROM FACTURAS F
        WHERE FACT_ID = :ID INTO :ANULADO, :PREF, :NUMERO, :VENCEAUX, :NIT;
  NUMERO = PREF || NUM;
  CONC = 'COSTO EN VENTAS FACTURA ' || :NUMERO;
  EXECUTE PROCEDURE FECHA_A_CONTA(:VENCEAUX) returning_values (:VENCE);
  if (ANULADO = 'N') then
    BEGIN
    SELECT BODE_CENTRO, BODE_PROY FROM BODEGA B, FACTURAS F, PUNTO_VENTA P
        WHERE B.BODE_COD = P.BODE_COD AND P.PTVT_ID = F.PTVT_ID AND F.FACT_ID = :ID INTO :CENTRO, :PROY;
    /* SE ASUME QUE NO HAN CAMBIADO LAS CUENTAS DE COSTOS, POR ESO SE HACE UPDATE A LOS MOVIMIENTOS DE ESAS CUENTAS */
    EXECUTE PROCEDURE COSTO_EN_VENTAS(31, :ID);
    if (COSTOS = 'A') then
        BEGIN
        FOR SELECT MAX(CTACOS), SUM(CANT * COSTO)
            FROM COSTO_VENTAS
            GROUP BY CTACOS
            INTO :CTACOSTOS, :MONTO
        DO
            BEGIN
            if (MONTO <> 0) then
                BEGIN
                CUENTA = NULL;
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :CTACOSTOS INTO :CUENTA, :TIPOCUEN;
                IF (CUENTA IS NULL) THEN
                    begin
                    EXCEPTION CUENTA_NO_EXISTE 'La cuenta ' || :ctacostos || ' no existe.';
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT ARTI_COD, CANT * COSTO
                        FROM COSTO_VENTAS
                        WHERE CTACOS = :CUENTA
                        INTO :ART, :MONTO
                    DO
                        BEGIN
                        SELECT COUNT(*) FROM COMPROBANTE_DETALLE WHERE CUEN_COD = :CUENTA AND ENCO_CONSEC = :IDC AND ARTI_COD = :ART INTO :NUMROWS;
                        if (NUMROWS = 0) then
                            BEGIN
                            INSERT INTO comprobante_detalle (ENCO_CONSEC, CODE_ITEM, CUEN_COD, CODE_CONCEPTO, CODE_REFER, CODE_DEBITO, CODE_CREDITO, CODE_BASE, CODE_PORC, TERC_NIT, PROY_COD, CENT_COD, CNDE_DOCNUMERO, CNDE_DOCAPLICA, DOCO_VENCE, ARTI_COD, CODE_TIPOAPL, CODE_TIPONUE)
                                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                            NROI = NROI + 1;
                            END
                        ELSE
                            UPDATE COMPROBANTE_DETALLE
                                SET CODE_DEBITO = :MONTO
                            WHERE CUEN_COD = :CUENTA AND ENCO_CONSEC = :IDC AND ARTI_COD = :ART;
                        END
                    END
                ELSE
                    BEGIN
                    SELECT COUNT(*) FROM COMPROBANTE_DETALLE WHERE CUEN_COD = :CUENTA AND ENCO_CONSEC = :IDC INTO :NUMROWS;
                    if (NUMROWS = 0) then
                        BEGIN
                        if (TIPOCUEN = 'C') then
                            INSERT INTO comprobante_detalle (ENCO_CONSEC, CODE_ITEM, CUEN_COD, CODE_CONCEPTO, CODE_REFER, CODE_DEBITO, CODE_CREDITO, CODE_BASE, CODE_PORC, TERC_NIT, PROY_COD, CENT_COD, CNDE_DOCNUMERO, CNDE_DOCAPLICA, DOCO_VENCE, ARTI_COD, CODE_TIPOAPL, CODE_TIPONUE)
                                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                        ELSE
                            INSERT INTO comprobante_detalle (ENCO_CONSEC, CODE_ITEM, CUEN_COD, CODE_CONCEPTO, CODE_REFER, CODE_DEBITO, CODE_CREDITO, CODE_BASE, CODE_PORC, TERC_NIT, PROY_COD, CENT_COD, CNDE_DOCNUMERO, CNDE_DOCAPLICA, DOCO_VENCE, ARTI_COD, CODE_TIPOAPL, CODE_TIPONUE)
                                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NROI = NROI + 1;
                        END
                    ELSE
                        UPDATE COMPROBANTE_DETALLE
                            SET CODE_DEBITO = :MONTO
                        WHERE CUEN_COD = :CUENTA AND ENCO_CONSEC = :IDC;
                    END
                END /* MONTO <> 0 */
            END /* FOR */
        END /* COSTOS */
    if (COSTOS = 'K') then
        BEGIN
        SELECT SUM(CANT * COSTO)
            FROM COSTO_VENTAS
            INTO :MONTO;
        if (MONTO <> 0) then
            BEGIN
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTACOSTOS INTO :CUENTA, :TIPOCUEN;
            IF (CUENTA IS NULL) THEN
                begin
                EXCEPTION CUENTA_NO_EXISTE 'La cuenta ' || :ctacostos || ' no existe.';
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, REGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT ARTI_COD, CANT * COSTO
                    FROM COSTO_VENTAS
                    INTO :ART, :MONTO
                DO
                    BEGIN
                    SELECT COUNT(*) FROM COMPROBANTE_DETALLE WHERE CUEN_COD = :CUENTA AND ENCO_CONSEC = :IDC AND ARTI_COD = :ART INTO :NUMROWS;
                    if (NUMROWS = 0) then
                        BEGIN
                            INSERT INTO comprobante_detalle (ENCO_CONSEC, CODE_ITEM, CUEN_COD, CODE_CONCEPTO, CODE_REFER, CODE_DEBITO, CODE_CREDITO, CODE_BASE, CODE_PORC, TERC_NIT, PROY_COD, CENT_COD, CNDE_DOCNUMERO, CNDE_DOCAPLICA, DOCO_VENCE, ARTI_COD, CODE_TIPOAPL, CODE_TIPONUE)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        END
                    ELSE
                        UPDATE COMPROBANTE_DETALLE
                            SET CODE_DEBITO = :MONTO
                        WHERE CUEN_COD = :CUENTA AND ENCO_CONSEC = :IDC AND ARTI_COD = :ART;
                    END
                END
            ELSE
                BEGIN
                SELECT COUNT(*) FROM COMPROBANTE_DETALLE WHERE CUEN_COD = :CUENTA AND ENCO_CONSEC = :IDC INTO :NUMROWS;
                if (NUMROWS = 0) then
                    BEGIN
                    if (TIPOCUEN = 'C') then
                        INSERT INTO comprobante_detalle (ENCO_CONSEC, CODE_ITEM, CUEN_COD, CODE_CONCEPTO, CODE_REFER, CODE_DEBITO, CODE_CREDITO, CODE_BASE, CODE_PORC, TERC_NIT, PROY_COD, CENT_COD, CNDE_DOCNUMERO, CNDE_DOCAPLICA, DOCO_VENCE, ARTI_COD, CODE_TIPOAPL, CODE_TIPONUE)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    ELSE
                        INSERT INTO comprobante_detalle (ENCO_CONSEC, CODE_ITEM, CUEN_COD, CODE_CONCEPTO, CODE_REFER, CODE_DEBITO, CODE_CREDITO, CODE_BASE, CODE_PORC, TERC_NIT, PROY_COD, CENT_COD, CNDE_DOCNUMERO, CNDE_DOCAPLICA, DOCO_VENCE, ARTI_COD, CODE_TIPOAPL, CODE_TIPONUE)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    END
                ELSE
                    UPDATE COMPROBANTE_DETALLE
                        SET CODE_DEBITO = :MONTO
                    WHERE CUEN_COD = :CUENTA AND ENCO_CONSEC = :IDC;
                END
            END /* MONTO <> 0 */
        END /* COSTOS = K */
    if (INVEN = 'A') then
        BEGIN
        FOR SELECT MAX(CTAINV), SUM(CANT * COSTO)
            FROM COSTO_VENTAS
            GROUP BY CTAINV
            INTO :CTAINVEN, :MONTO
        DO
            BEGIN
            if (MONTO <> 0) then
                BEGIN
                CUENTA = NULL;
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :CTAINVEN INTO :CUENTA, :TIPOCUEN;
                IF (CUENTA IS NULL) THEN
                    begin
                    EXCEPTION CUENTA_NO_EXISTE 'La cuenta ' || :ctainven || ' no existe.';
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, REGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT ARTI_COD, CANT * COSTO
                        FROM COSTO_VENTAS
                        WHERE CTAINV = :CUENTA
                        INTO :ART, :MONTO
                    DO
                        BEGIN
                        SELECT COUNT(*) FROM COMPROBANTE_DETALLE WHERE CUEN_COD = :CUENTA AND ENCO_CONSEC = :IDC AND ARTI_COD = :ART INTO :NUMROWS;
                        if (NUMROWS = 0) then
                            BEGIN
                            INSERT INTO comprobante_detalle (ENCO_CONSEC, CODE_ITEM, CUEN_COD, CODE_CONCEPTO, CODE_REFER, CODE_DEBITO, CODE_CREDITO, CODE_BASE, CODE_PORC, TERC_NIT, PROY_COD, CENT_COD, CNDE_DOCNUMERO, CNDE_DOCAPLICA, DOCO_VENCE, ARTI_COD, CODE_TIPOAPL, CODE_TIPONUE)
                                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                            NROI = NROI + 1;
                            END
                        ELSE
                            UPDATE COMPROBANTE_DETALLE
                                SET CODE_CREDITO = :MONTO
                            WHERE CUEN_COD = :CUENTA AND ENCO_CONSEC = :IDC AND ARTI_COD = :ART;
                        END
                    END
                ELSE
                    BEGIN
                    SELECT COUNT(*) FROM COMPROBANTE_DETALLE WHERE CUEN_COD = :CUENTA AND ENCO_CONSEC = :IDC INTO :NUMROWS;
                    if (NUMROWS = 0) then
                        BEGIN
                        if (TIPOCUEN = 'C') then
                            INSERT INTO comprobante_detalle (ENCO_CONSEC, CODE_ITEM, CUEN_COD, CODE_CONCEPTO, CODE_REFER, CODE_DEBITO, CODE_CREDITO, CODE_BASE, CODE_PORC, TERC_NIT, PROY_COD, CENT_COD, CNDE_DOCNUMERO, CNDE_DOCAPLICA, DOCO_VENCE, ARTI_COD, CODE_TIPOAPL, CODE_TIPONUE)
                                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                        ELSE
                            INSERT INTO comprobante_detalle (ENCO_CONSEC, CODE_ITEM, CUEN_COD, CODE_CONCEPTO, CODE_REFER, CODE_DEBITO, CODE_CREDITO, CODE_BASE, CODE_PORC, TERC_NIT, PROY_COD, CENT_COD, CNDE_DOCNUMERO, CNDE_DOCAPLICA, DOCO_VENCE, ARTI_COD, CODE_TIPOAPL, CODE_TIPONUE)
                                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NROI = NROI + 1;
                        END
                    ELSE
                        UPDATE COMPROBANTE_DETALLE
                            SET CODE_CREDITO = :MONTO
                        WHERE CUEN_COD = :CUENTA AND ENCO_CONSEC = :IDC;
                    END
                END /* MONTO <> 0 */
            END /* FOR */
        END /* INVEN = A */
    if (INVEN = 'K') then
        BEGIN
        SELECT SUM(CANT * COSTO)
            FROM COSTO_VENTAS
            INTO :MONTO;
        if (MONTO <> 0) then
            BEGIN
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTAINVEN INTO :CUENTA, :TIPOCUEN;
            IF (CUENTA IS NULL) THEN
                begin
                EXCEPTION CUENTA_NO_EXISTE 'La cuenta ' || :ctainven || ' no existe.';
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT ARTI_COD, CANT * COSTO
                    FROM COSTO_VENTAS
                    INTO :ART, :MONTO
                DO
                    BEGIN
                    SELECT COUNT(*) FROM COMPROBANTE_DETALLE WHERE CUEN_COD = :CUENTA AND ENCO_CONSEC = :IDC AND ARTI_COD = :ART INTO :NUMROWS;
                    if (NUMROWS = 0) then
                        BEGIN
                        INSERT INTO comprobante_detalle (ENCO_CONSEC, CODE_ITEM, CUEN_COD, CODE_CONCEPTO, CODE_REFER, CODE_DEBITO, CODE_CREDITO, CODE_BASE, CODE_PORC, TERC_NIT, PROY_COD, CENT_COD, CNDE_DOCNUMERO, CNDE_DOCAPLICA, DOCO_VENCE, ARTI_COD, CODE_TIPOAPL, CODE_TIPONUE)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        END
                    ELSE
                        UPDATE COMPROBANTE_DETALLE
                            SET CODE_CREDITO = :MONTO
                        WHERE CUEN_COD = :CUENTA AND ENCO_CONSEC = :IDC AND ARTI_COD = :ART;
                    END
                END
            ELSE
                BEGIN
                SELECT COUNT(*) FROM COMPROBANTE_DETALLE WHERE CUEN_COD = :CUENTA AND ENCO_CONSEC = :IDC INTO :NUMROWS;
                if (NUMROWS = 0) then
                    BEGIN
                    if (TIPOCUEN = 'C') then
                        INSERT INTO comprobante_detalle (ENCO_CONSEC, CODE_ITEM, CUEN_COD, CODE_CONCEPTO, CODE_REFER, CODE_DEBITO, CODE_CREDITO, CODE_BASE, CODE_PORC, TERC_NIT, PROY_COD, CENT_COD, CNDE_DOCNUMERO, CNDE_DOCAPLICA, DOCO_VENCE, ARTI_COD, CODE_TIPOAPL, CODE_TIPONUE)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    ELSE
                        INSERT INTO comprobante_detalle (ENCO_CONSEC, CODE_ITEM, CUEN_COD, CODE_CONCEPTO, CODE_REFER, CODE_DEBITO, CODE_CREDITO, CODE_BASE, CODE_PORC, TERC_NIT, PROY_COD, CENT_COD, CNDE_DOCNUMERO, CNDE_DOCAPLICA, DOCO_VENCE, ARTI_COD, CODE_TIPOAPL, CODE_TIPONUE)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    END
                ELSE
                    UPDATE COMPROBANTE_DETALLE
                        SET CODE_CREDITO = :MONTO
                    WHERE CUEN_COD = :CUENTA AND ENCO_CONSEC = :IDC;
                END
            END /* MONTO <> 0 */
        END /* INVEN = K */
    END
  END
end

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE CONTABIL_DEVOLCLI(
    IDDOC INTEGER,
    IDINTER INTEGER)
RETURNS (
    ERROR INTEGER,
    VER CHAR(1),
    IDC INTEGER)
AS
declare variable PREF VARCHAR(4);
declare variable NUM VARCHAR(6);
declare variable NUMERO VARCHAR(10);
declare variable FECAUX DATE;
declare variable FECHA CHAR(8);
declare variable CONC CHAR(120);
declare variable NUMFAC VARCHAR(10);
declare variable VRDTO NUMERIC(18, 2);
declare variable VRADIC NUMERIC(18, 2);
declare variable VRSUBT NUMERIC(18, 2);
declare variable VRIVA NUMERIC(18, 2);
declare variable PRTFTE NUMERIC(9, 2);
declare variable VRRTFTE NUMERIC(18, 2);
declare variable VRRTIVA NUMERIC(18, 2);
declare variable PRTICA NUMERIC(9, 2);
declare variable VRRTICA NUMERIC(18, 2);
declare variable VRTOTAL NUMERIC(18, 2);
declare variable VREXTRA NUMERIC(18, 2);
declare variable TIPOCOMP VARCHAR(3);
declare variable PREFCONT VARCHAR(4);
declare variable VENTAS CHAR(1);
declare variable CTAVENTAS VARCHAR(20);
declare variable IVA CHAR(1);
declare variable CTAIVA VARCHAR(20);
declare variable CONSUMO CHAR(1);
declare variable CTACONSUMO VARCHAR(20);
declare variable CARTERA CHAR(1);
declare variable CTACARTERA VARCHAR(20);
declare variable RTFTE CHAR(1);
declare variable CTARTFTE VARCHAR(20);
declare variable RTIVA CHAR(1);
declare variable CTARTIVA VARCHAR(20);
declare variable RTICA CHAR(1);
declare variable CTARTICA VARCHAR(20);
declare variable INVEN CHAR(1);
declare variable CTAINVEN VARCHAR(20);
declare variable COSTOS CHAR(1);
declare variable CTACOSTOS VARCHAR(20);
declare variable CTADTO VARCHAR(20);
declare variable CTAADIC VARCHAR(20);
declare variable CTAEXTRA VARCHAR(20);
declare variable EXISTE CHAR(1);
declare variable CUENTA VARCHAR(20);
declare variable MONTO NUMERIC(18,2);
declare variable TIPOCUEN CHAR(1);
declare variable NIT VARCHAR(20);
declare variable PROY VARCHAR(4);
declare variable CENTRO VARCHAR(4);
declare variable PORC NUMERIC(5,2);
declare variable DEBITO NUMERIC(18,2);
declare variable CREDITO NUMERIC(18,2);
declare variable NROI INTEGER;
declare variable ART VARCHAR(15);
declare variable IMPINC CHAR(1);
declare variable IMPTOS NUMERIC(18, 2);
declare variable SUMA NUMERIC(18,2);
declare variable PORCIVA NUMERIC(9,2);
declare variable TCTACLIEN VARCHAR(20);
declare variable TCTAVENTA VARCHAR(20);
declare variable TCTARTFTE VARCHAR(20);
declare variable TCTARTIVA VARCHAR(20);
declare variable TCTARTICA VARCHAR(20);
declare variable CTADIC VARCHAR(20);
declare variable BASEADIC VARCHAR(20);
declare variable PORCADIC NUMERIC(5,2);
declare variable VALORADIC NUMERIC(18,2);
declare variable DBADIC CHAR(1);
declare variable PTOVTA INTEGER;
declare variable ANULADO CHAR(1);
declare variable CENT CHAR(1);
DECLARE VARIABLE MERCANCIA NUMERIC(18,2);
declare variable FACTOR DOUBLE PRECISION;
declare variable DIG INTEGER;
DECLARE VARIABLE FOMENTO VARCHAR(2);
DECLARE VARIABLE VRCONSUMO NUMERIC(18,2);
declare variable AUTORET VARCHAR(10);
declare variable FAUTORET DATE;
declare variable IDREM INTEGER;
declare variable DTOXIT CHAR(2);
declare variable ERRORC INTEGER;
BEGIN
EXECUTE PROCEDURE LEE_CONFIGURACION('COMPRAS', 'FACTURAS', 'USAR IMPOCONSUMO COMO PORCENTAJE DE FOMENTO') returning_values (FOMENTO);
EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'FECHA AUTORETENEDOR NO DESCONTAR RETENCIONES DEL SALDO PERO SI CONTABILIZARLAS') returning_values (AUTORET);
if (AUTORET <> '') then
    FAUTORET = CAST(AUTORET AS DATE);
else
    FAUTORET = '9999/12/31';
  /* BUSQUE LA INTERFACE */
  EXISTE = 'N';
  SELECT 'S', TICO_COD, PRCO_PRE, INVE_VENTAS, INVE_IVA, INVE_CONSUMO, INVE_CARTERA, INVE_RTFTE, INVE_RTIVA, INVE_RTICA, INVE_COSTO, INVE_INVEN, INVE_CTAVENTAS, INVE_CTAIVA, INVE_CTACONSUMO, INVE_CTADTO, INVE_CTAADIC, INVE_CTAEXTRA, INVE_CTACARTERA, INVE_CTARTFTE, INVE_CTARTIVA, INVE_CTARTICA, INVE_CTAINVEN, INVE_CTACOSTOS, INVE_CONFIRMAR, INVE_CENTRO
    FROM INTERFAZ_VENTAS
    WHERE INVE_ID = :IDINTER
    INTO :EXISTE, :TIPOCOMP, :PREFCONT, :VENTAS, :IVA, :CONSUMO, :CARTERA, :RTFTE, :RTIVA, :RTICA, :COSTOS, :INVEN, :CTAVENTAS, :CTAIVA, :CTACONSUMO, :CTADTO, :CTAADIC, :CTAEXTRA, :CTACARTERA, :CTARTFTE, :CTARTIVA, :CTARTICA, :CTAINVEN, :CTACOSTOS, :VER, :CENT;
  if (EXISTE = 'S') then
   BEGIN
    /* BORRE CUALQUEIR CONTABILIZACION PREVIA */
    DELETE FROM CONTABILIZACION WHERE CNTB_TIPOREF = 33 AND CNTB_IDREF = :IDDOC;
    /* TRAIGA EL ENCABEZADO DE LA DEVOLUCION */
   SELECT PREF_PRE, DEVT_NUMERO, DEVT_FECHA, F.TERC_NIT, DEVT_IVAINC, PTVT_ID, DEVT_FACTURA, DEVT_DTOMONTO, DEVT_ADICIONAL, DEVT_IVAMONTO, DEVT_EXTRA, DEVT_TOTAL, DEVT_RTFTEPORC, DEVT_RTFTEMONTO, DEVT_RTIVAPORC, DEVT_RTIVAMONTO, DEVT_RTICAPORC, DEVT_RTICAMONTO, TERC_CTARTFTE, TERC_CTARTIVA, TERC_CTARTICA, TERC_CTAVENTA, TERC_CTACLIENTE, DEVT_ANULADO, DEVT_REMID
        FROM DEVOLUCIONES_VENTAS F, TERCEROS T
        WHERE DEVT_ID = :IDDOC AND F.TERC_NIT = T.TERC_NIT
        INTO :PREF, :NUM, :FECAUX, :NIT, :IMPINC, :PTOVTA, :NUMFAC, :VRDTO, :VRADIC, :VRIVA, :VREXTRA, :VRTOTAL, :PRTFTE, :VRRTFTE, :PORC, :VRRTIVA, :PRTICA, :VRRTICA, :TCTARTFTE, TCTARTIVA, TCTARTICA, TCTAVENTA, TCTACLIEN, ANULADO, :IDREM;
   if (idrem is null) Then
    IDREM = 0;
   if ((ANULADO = 'N') AND (IDREM = 0)) then
    BEGIN
    NUMERO = PREF || NUM;
    SELECT SUM(DVDE_CONSUMO) FROM devoluciones_ventas_detalle WHERE DEVT_ID = :iddoc AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL)) INTO :MERCANCIA;
    VRSUBT = VRTOTAL - VREXTRA - VRIVA - MERCANCIA; /* BASE DE RETEFTE Y RETEICA */
    EXECUTE PROCEDURE lee_configuracion ('FACTURACION', 'DEVOLUCIONES', 'DESCUENTO PIE DEVOLUCION IGUAL A SUMA DE DESCUENTOS POR ITEM') returning_values (:DTOXIT);
    if (DTOXIT = 'SI') then
        VRDTO = 0;
    MERCANCIA = VRSUBT - VRADIC + VRDTO;
    IF (CENT = 'B') THEN
        SELECT B.BODE_CENTRO, B.BODE_PROY FROM BODEGA B, DEVOLUCIONES_VENTAS F
            WHERE B.BODE_COD = F.BODE_COD AND F.DEVT_ID = :IDDOC INTO :CENTRO, :PROY;
    IF (CENT = 'V') THEN
        SELECT V.CENT_COD, V.PROY_COD FROM VENDEDORES V, DEVOLUCIONES_VENTAS F
            WHERE V.VEND_COD = F.VEND_COD AND F.DEVT_ID = :IDDOC INTO :CENTRO, :PROY;
    IF (CENT = 'P') THEN
        SELECT P.PREF_CENTRO,P.PREF_PROY  FROM PREFIJOS P, DEVOLUCIONES_VENTAS F
            WHERE P.PREF_PRE = F.PREF_PRE AND F.DEVT_ID = :IDDOC AND P.TIDO_COD = 33 INTO :CENTRO, :PROY;
    EXECUTE PROCEDURE FECHA_A_CONTA(:FECAUX) returning_values (:FECHA);
    /* REGISTRE EL ENCABEZADO CONTABLE */
    IDC = GEN_ID(ID_CONTABILIZA, 1);
    CONC = 'DEVOLUCION VENTAS No. ' || NUMERO || ' EN FACTURA ' || NUMFAC;
    CONC = SUBSTR(CONC, 1, 60);
    INSERT INTO CONTABILIZACION (CNTB_ID, CNTB_TIPOCOMP, CNTB_PREFCNT, CNTB_NUMERO, CNTB_FECHA, CNTB_CONCEPTO, CNTB_REF, CNTB_TIPOREF, CNTB_IDREF, CNTB_PREFREF, CNTB_NUMREF, CNTB_PROCESADO)
        VALUES (:IDC, :TIPOCOMP, :PREFCONT, :NUM, :FECHA, :CONC, '', 33, :IDDOC, :PREF, :NUM, 'N');
    NROI = 0;
    SUMA = 0;
    ERROR = 0;
    /* SI NO HAY CUENTA DE DESCUENTO NI ADICIONAL CALCULE UN FACTOR PARA LAS VENTAS Y EL IVA */
    if (MERCANCIA <> 0) then
        FACTOR = CAST(VRSUBT AS DOUBLE PRECISION) / CAST(MERCANCIA AS DOUBLE PRECISION);
    ELSE
        FACTOR = 1;
    /* TRAIGA EL NUMERO DE DIGITOS PARA EL REDONDEO */
    SELECT CAST(CONF_VALOR AS INTEGER) FROM CONFIGURACION WHERE CONF_MODULO = 'FACTURACION' AND
        CONF_CATEGORIA = 'GENERAL' AND CONF_PROPIEDAD = 'REDONDEO AL MULTIPLO DE DIEZ EN TOTALES' INTO :DIG;
    /* CUENTAS DE VENTAS */
    if (VENTAS = 'A') then
        BEGIN
        FOR SELECT MAX(COAR_CTADEV), SUM(DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO), SUM(DVDE_IVAMONTO), SUM(DVDE_CONSUMO)
            FROM ARTICULO A, CONTABIL_ARTICULO C, DEVOLUCIONES_VENTAS_DETALLE F
            WHERE F.DEVT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
            GROUP BY COAR_CTADEV
            INTO :CTAVENTAS, :MONTO, :IMPTOS, :VRCONSUMO
            DO
            BEGIN
            if (IMPINC = 'S') then
                if (FOMENTO = 'SI') then
                    MONTO = MONTO - IMPTOS;
                ELSE
                    MONTO = MONTO - IMPTOS - VRCONSUMO;
            ELSE
            if (FOMENTO = 'SI') then
            MONTO = MONTO + VRCONSUMO;
            if ((CTADTO IS NULL) OR (CTADTO = '')) then
                MONTO = MONTO * FACTOR;
            execute procedure redondee(MONTO, DIG) returning_values (MONTO);
            if (MONTO <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTAVENTAS, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT F.ARTI_COD, (DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO), (DVDE_IVAMONTO+DVDE_CONSUMO)
                        FROM ARTICULO A, CONTABIL_ARTICULO C, DEVOLUCIONES_VENTAS_DETALLE F
                        WHERE F.DEVT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTAINV = :CUENTA AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
                        INTO :ART, :MONTO, :IMPTOS
                    DO
                        BEGIN
                        if (IMPINC = 'S') then
                            MONTO = MONTO - IMPTOS;
                        if ((CTADTO IS NULL) OR (CTADTO = '')) then
                            MONTO = MONTO * FACTOR;
                        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        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, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                    NROI = NROI + 1;
                    SUMA = SUMA + MONTO;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA + MONTO;
                    END
                END /* MONTO <> 0 */
            END /* FOR */
        END /* VENTAS X ARTICULO */
     IF ((VENTAS = 'C') OR (VENTAS = 'K')) THEN
        BEGIN
        IF (VENTAS = 'C') THEN
            CTAVENTAS = TCTAVENTA;
        SELECT SUM(DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO), SUM(DVDE_IVAMONTO), SUM(DVDE_CONSUMO)
            FROM DEVOLUCIONES_VENTAS_DETALLE F
            WHERE F.DEVT_ID = :IDDOC  AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
            INTO :MONTO, :IMPTOS, :VRCONSUMO;
        if (IMPINC = 'S') then
            if (FOMENTO = 'SI') then
               MONTO = MONTO - IMPTOS;
            ELSE
               MONTO = MONTO - IMPTOS - VRCONSUMO;
        ELSE
         if (FOMENTO = 'SI') then
          MONTO = MONTO + VRCONSUMO;
        if ((CTADTO IS NULL) OR (CTADTO = '')) then
            MONTO = MONTO * FACTOR;
        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
        if (MONTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTAVENTAS, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT F.ARTI_COD, (DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO), (DVDE_IVAMONTO+DVDE_CONSUMO)
                    FROM ARTICULO A, DEVOLUCIONES_VENTAS_DETALLE F
                    WHERE F.DEVT_ID = :IDDOC AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
                    INTO :ART, :MONTO, :IMPTOS
                    DO
                    BEGIN
                    if (IMPINC = 'S') then
                        MONTO = MONTO - IMPTOS;
                    if ((CTADTO IS NULL) OR (CTADTO = '')) then
                        MONTO = MONTO * FACTOR;
                    execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                    NROI = NROI + 1;
                    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, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                NROI = NROI + 1;
                SUMA = SUMA + MONTO;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA + MONTO;
                END
            END /* MONTO <> 0 */
        END /* VENTAS DE CLIENTE O CONSTANTE */
    /* EL IVA EN VENTAS */
    if (IVA = 'A') then
        BEGIN
        FOR SELECT MAX(COAR_CTAIVAV), SUM(DVDE_IVAMONTO), SUM(DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO), SUM(DVDE_CONSUMO)
            FROM ARTICULO A, CONTABIL_ARTICULO C, DEVOLUCIONES_VENTAS_DETALLE F
            WHERE F.DEVT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
            GROUP BY COAR_CTAIVAV
            INTO :CTAIVA, :IMPTOS, :MONTO, :VALORADIC
        DO
            BEGIN
            if (FOMENTO = 'SI') then
                MONTO = MONTO + VALORADIC;
            MONTO = MONTO * -1;
            MONTO = MONTO * FACTOR;
            IMPTOS = IMPTOS * FACTOR;
            execute procedure redondee(MONTO, DIG) returning_values (MONTO);
            execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
            if (IMPTOS <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTAIVA, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT F.ARTI_COD, DVDE_IVAMONTO, (DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO), TAIV_PORC, DVDE_CONSUMO
                        FROM ARTICULO A, CONTABIL_ARTICULO C, DEVOLUCIONES_VENTAS_DETALLE F, TARIFA_IVA T
                        WHERE F.DEVT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND A.TAIV_COD = T.TAIV_COD AND COAR_CTAIVAV = :CUENTA AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
                        INTO :ART, :IMPTOS, :MONTO, :PORCIVA, :VALORADIC
                    DO
                        BEGIN
                        if (IMPINC = 'S') then
                            MONTO = MONTO - IMPTOS - VALORADIC;
                        MONTO = MONTO * -1;
                        MONTO = MONTO * FACTOR;
                        IMPTOS = IMPTOS * FACTOR;
                        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                        execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                        if (IMPTOS <> 0) then
                            BEGIN
                            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :IMPTOS, 0, :MONTO, :PORCIVA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                            NROI = NROI + 1;
                            SUMA = SUMA + IMPTOS;
                            END
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                    NROI = NROI + 1;
                    SUMA = SUMA + IMPTOS;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA + IMPTOS;
                    END
                END   /* IMPTOS <> 0 */
            END /* FOR */
        END /* IVA X ARTICULO */
    if (IVA = 'K') then /* IVA EN CTA CONSTANTE */
        BEGIN
        SELECT SUM(DVDE_IVAMONTO), SUM(DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO), SUM(DVDE_CONSUMO)
            FROM DEVOLUCIONES_VENTAS_DETALLE F
            WHERE F.DEVT_ID = :IDDOC  AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
            INTO :IMPTOS, :MONTO, :VALORADIC;
        if (FOMENTO = 'SI') then
            MONTO = MONTO + VALORADIC;
        MONTO = MONTO * -1;
        MONTO = MONTO * FACTOR;
        IMPTOS = IMPTOS * FACTOR;
        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
        execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
        if (IMPTOS <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTAIVA, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT F.ARTI_COD, (DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO), DVDE_IVAMONTO, TAIV_PORC, DVDE_CONSUMO
                    FROM ARTICULO A, DEVOLUCIONES_VENTAS_DETALLE F, TARIFA_IVA T
                    WHERE F.DEVT_ID = :IDDOC AND A.TAIV_COD = T.TAIV_COD AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
                    INTO :ART, :MONTO, :IMPTOS, :PORCIVA, :VALORADIC
                    DO
                    BEGIN
                    if (IMPINC = 'S') then
                        MONTO = MONTO - IMPTOS - VALORADIC;
                    MONTO = MONTO * -1;
                    MONTO = MONTO * FACTOR;
                    IMPTOS = IMPTOS * FACTOR;
                    execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                    execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                    if (IMPTOS <> 0) then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', :IMPTOS, 0, :MONTO, :PORCIVA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        SUMA = SUMA + IMPTOS;
                        END
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                NROI = NROI + 1;
                SUMA = SUMA + IMPTOS;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA + IMPTOS;
                END
            END /* IMPTOS <> 0 */
        END /* IVA EN CTA CONSTANTE */
    /* EL IMPOCONSUMO */
    if ((CONSUMO = 'A') AND (FOMENTO <> 'SI')) then
        BEGIN
        FOR SELECT MAX(COAR_CTACONS), SUM(DVDE_CONSUMO)
            FROM ARTICULO A, CONTABIL_ARTICULO C, DEVOLUCIONES_VENTAS_DETALLE F
            WHERE F.DEVT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
            GROUP BY COAR_CTACONS
            INTO :CTACONSUMO, :IMPTOS
        DO
            BEGIN
            if (IMPTOS <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTACONSUMO, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, REGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT F.ARTI_COD, DVDE_CONSUMO
                        FROM ARTICULO A, CONTABIL_ARTICULO C, DEVOLUCIONES_VENTAS_DETALLE F
                        WHERE F.DEVT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTACONS = :CUENTA AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
                        INTO :ART, :IMPTOS
                    DO
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 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, :NROI, :CUENTA, :CONC, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                    NROI = NROI + 1;
                    SUMA = SUMA + IMPTOS;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA + IMPTOS;
                    END
                END /* IMPTOS <> 0 */
            END /* FOR */
        END /* CONSUMO X ARTICULO */
    if ((CONSUMO = 'K') AND (FOMENTO <> 'SI')) then
        BEGIN
        SELECT SUM(DVDE_CONSUMO)
            FROM DEVOLUCIONES_VENTAS_DETALLE F
            WHERE F.DEVT_ID = :IDDOC AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
            INTO :IMPTOS;
        if (IMPTOS <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTACONSUMO, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT F.ARTI_COD, DVDE_CONSUMO
                    FROM ARTICULO A, DEVOLUCIONES_VENTAS_DETALLE F
                    WHERE F.DEVT_ID = :IDDOC  AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
                    INTO :ART, :IMPTOS
                    DO
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTACONSUMO, :CONC, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                    NROI = NROI + 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, :NROI, :CTACONSUMO, :CONC, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA + IMPTOS;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTACONSUMO, :CONC, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA + IMPTOS;
                END
            END /* IMPTOS <> 0 */
        END /* CONSUMO EN CTA CONSTANTE */
    /* DESCUENTO */
    if ((CTADTO IS NOT NULL) AND
        (CTADTO <> '') AND
        (VRDTO <> 0)) THEN
        BEGIN
        EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTADTO, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRDTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
            NROI = NROI + 1;
            SUMA = SUMA - VRDTO;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRDTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 33);
            NROI = NROI + 1;
            SUMA = SUMA - VRDTO;
            END
        END /* DESCUENTO */
    /* VALOR ADIC */
    if ((CTAADIC IS NOT NULL) AND
        (CTAADIC <> '') AND
        (VRADIC <> 0)) THEN
        BEGIN
        EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTAADIC, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRADIC, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
            NROI = NROI + 1;
            SUMA = SUMA + VRADIC;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRADIC, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 33);
            NROI = NROI + 1;
            SUMA = SUMA + VRADIC;
            END
        END /* VR. ADIC */
    /* VALOR EXTRA */
    if ((CTAEXTRA IS NOT NULL) AND
        (CTAEXTRA <> '') AND
        (VREXTRA <> 0)) THEN
        BEGIN
        EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTAEXTRA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VREXTRA, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
            NROI = NROI + 1;
            SUMA = SUMA + VREXTRA;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VREXTRA, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 33);
            NROI = NROI + 1;
            SUMA = SUMA + VREXTRA;
            END
        END /* VR. EXTRA */
    /* RETENCION FUENTE */
    if ((RTFTE = 'C') or (RTFTE = 'K')) then
      if (VRRTFTE <> 0) then
        BEGIN
        if (RTFTE = 'C') then
            CTARTFTE = TCTARTFTE;
        EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTARTFTE, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, (:VRSUBT*-1), :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
            NROI = NROI + 1;
            SUMA = SUMA - VRRTFTE;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, (:VRSUBT*-1), :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA - VRRTFTE;
            END
        /* AUTORETENCION */
        if (FAUTORET <= fecaux) then
            BEGIN
            EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'CUENTA DE AUTORETENCION EN LA FUENTE') returning_values (CTARTFTE);
            EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTARTFTE, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :VRSUBT, :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                NROI = NROI + 1;
                SUMA = SUMA + VRRTFTE;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :VRSUBT, :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA + VRRTFTE;
                END
            END
        END /* RTFTE */
    if (RTFTE = 'A') then
      BEGIN
      FOR SELECT MAX(COAR_CTARTFTEV), MAX(COAR_RTFTE), MIN(COAR_RTBASE), SUM(DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO), SUM((DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO)*COAR_RTFTE)
        FROM CONTABIL_ARTICULO C, devoluciones_ventas_detalle F
        WHERE F.devt_id = :IDDOC AND F.ARTI_COD = C.ARTI_COD AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
        GROUP BY COAR_CTARTFTEV
        INTO :CTARTFTE, :PRTFTE, :baseadic, :MONTO, :VRRTFTE
        DO
        BEGIN
        MONTO = MONTO * FACTOR;
        if (MONTO >= BASEADIC) then
            BEGIN
            VRRTFTE = VRRTFTE * FACTOR / 100;
            execute procedure redondee(VRRTFTE, DIG) returning_values (VRRTFTE);
            execute procedure redondee(MONTO, DIG) returning_values (MONTO);
            if (VRRTFTE <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTARTFTE, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, (:MONTO*-1), :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                    NROI = NROI + 1;
                    SUMA = SUMA - VRRTFTE;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, (:MONTO*-1), :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA - VRRTFTE;
                    END
                /* AUTORETENCION */
                if (FAUTORET <= fecaux) then
                    BEGIN
                    EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'CUENTA DE AUTORETENCION EN LA FUENTE') returning_values (CTARTFTE);
                    EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTARTFTE, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
                    if (ERRORC <> 0) then
                        ERROR = ERROR + 1;
                    if (TIPOCUEN = 'C') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :MONTO, :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                        NROI = NROI + 1;
                        SUMA = SUMA + VRRTFTE;
                        END
                    if (TIPOCUEN = 'N') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :MONTO, :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NROI = NROI + 1;
                        SUMA = SUMA + VRRTFTE;
                        END
                    END
                END
            END
        END /* RTFTE */
      END
    /* RETENCION IVA */
    if ((RTIVA = 'C') or (RTIVA = 'K')) then
      if (VRRTIVA <> 0) then
        BEGIN
        if (RTIVA = 'C') then
            CTARTIVA = TCTARTIVA;
        EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTARTIVA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTIVA, (:VRIVA*-1), :PORC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
            NROI = NROI + 1;
            SUMA = SUMA - VRRTIVA;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTIVA, (:VRIVA*-1), :PORC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA - VRRTIVA;
            END
        END /* RTIVA */
    /* RETENCION DE ICA */
    if ((RTICA = 'C') or (RTICA = 'K')) then
      if (VRRTICA <> 0) then
        BEGIN
        if (RTICA = 'C') then
            CTARTICA = TCTARTICA;
        EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTARTICA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTICA, (:VRSUBT*-1), :PRTICA, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
            NROI = NROI + 1;
            SUMA = SUMA - VRRTICA;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTICA, (:VRSUBT*-1), :PRTICA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA - VRRTICA;
            END
        END /* RTICA */
    /* CIERRE EL COMPROBANTE CONTRA LA CUENTA DEL TERCERO O LA CONSTANTE */
    if ((SUMA <> 0) and ((CARTERA = 'C') or (CARTERA = 'K') or (CARTERA = 'J'))) then
        BEGIN
        if (SUMA < 0) then
            BEGIN
            DEBITO = SUMA * -1;
            CREDITO = 0;
            END
        ELSE
            BEGIN
            DEBITO = 0;
            CREDITO = SUMA;
            END
        if (CARTERA = 'C') then
            CTACARTERA = TCTACLIEN;
        if (CARTERA = 'J') then
            BEGIN
            /* BUSQUE LA CUENTA DE LA CAJA */
            SELECT CAJA_CUENTA FROM CAJAS C, PUNTO_VENTA P
                WHERE P.CAJA_ID = C.CAJA_ID AND PTVT_ID = :PTOVTA
                INTO :CTACARTERA;
            END
        EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTACARTERA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :DEBITO, :CREDITO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
        if (TIPOCUEN = 'N') then
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :DEBITO, :CREDITO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
        NROI = NROI + 1;
        END /* SUMA EN CARTERA */
    /* CALCULE COSTOS EN VENTAS */
    EXECUTE PROCEDURE COSTO_EN_VENTAS(33, :IDDOC);
    if (COSTOS = 'A') then
        BEGIN
        FOR SELECT MAX(CTACOS), SUM(cast(CANT as double precision) * COSTO)
            FROM COSTO_VENTAS
            GROUP BY CTACOS
            INTO :CTACOSTOS, :MONTO
        DO
            BEGIN
            if (MONTO <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTACOSTOS, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT ARTI_COD, cast(CANT as double precision) * COSTO
                        FROM COSTO_VENTAS
                        WHERE CTACOS = :CUENTA
                        INTO :ART, :MONTO
                    DO
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                    NROI = NROI + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    END
                END /* MONTO <> 0 */
            END /* FOR */
        END /* COSTOS */
    if (COSTOS = 'K') then
        BEGIN
        SELECT SUM(cast(CANT as double precision) * COSTO)
            FROM COSTO_VENTAS
            INTO :MONTO;
        if (MONTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTACOSTOS, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, REGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT ARTI_COD, cast(CANT as double precision) * COSTO
                    FROM COSTO_VENTAS
                    INTO :ART, :MONTO
                DO
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTACOSTOS, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                    NROI = NROI + 1;
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTACOSTOS, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                NROI = NROI + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTACOSTOS, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                END
            END /* MONTO <> 0 */
        END /* COSTOS = K */
    if (INVEN = 'A') then
        BEGIN
        FOR SELECT MAX(CTAINV), SUM(cast(CANT as double precision) * COSTO)
            FROM COSTO_VENTAS
            GROUP BY CTAINV
            INTO :CTAINVEN, :MONTO
        DO
            BEGIN
            if (MONTO <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTAINVEN, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, REGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT ARTI_COD, cast(CANT as double precision) * COSTO
                        FROM COSTO_VENTAS
                        WHERE CTAINV = :CUENTA
                        INTO :ART, :MONTO
                    DO
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                    NROI = NROI + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    END
                END /* MONTO <> 0 */
            END /* FOR */
        END /* INVEN = A */
    if (INVEN = 'K') then
        BEGIN
        SELECT SUM(cast(CANT as double precision) * COSTO)
            FROM COSTO_VENTAS
            INTO :MONTO;
        if (MONTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTAINVEN, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT ARTI_COD, cast(CANT as double precision) * COSTO
                    FROM COSTO_VENTAS
                    INTO :ART, :MONTO
                DO
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTAINVEN, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                    NROI = NROI + 1;
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAINVEN, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                NROI = NROI + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAINVEN, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                END
            END /* MONTO <> 0 */
        END /* INVEN = K */
    /* recorra las cuentas adicionales */
    FOR SELECT INVC_CUENTA, INVC_BASE, INVC_PORC, INVC_VALOR, INVC_DB
        FROM INTERFAZ_VENTAS_CTAS WHERE INVE_ID = :IDINTER
        INTO :CTADIC, :BASEADIC, :PORCADIC, :VALORADIC, :DBADIC
        DO
        BEGIN
        if (valoradic <> 0) then
            monto = valoradic;
        else
            BEGIN
            if (:BASEADIC = 'SUBTOTAL') then
                VALORADIC = vrsubt;
            if (:BASEADIC = 'DESCUENTO') then
                VALORADIC = VRDTO;
            if (:BASEADIC = 'IVA') then
                VALORADIC = VRIVA;
            if (:BASEADIC = 'ADICIONAL') then
                VALORADIC = VRADIC;
            if (:BASEADIC = 'EXTRA') then
                VALORADIC = VREXTRA;
            if (:BASEADIC = 'TOTAL') then
                VALORADIC = VRTOTAL;
            MONTO = VALORADIC * PORCADIC;
            END
        if (MONTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTADIC, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                if (DBADIC = 'S') then
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                ELSE
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                NROI = NROI + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                if (DBADIC = 'S') then
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                ELSE
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                END
            NROI = NROI + 1;
            END
        END
    if (error > 0) then
        ver = 'S';
    SUSPEND;
    END
   END /* EXISTE LA INTERFAZ */
  ELSE
    BEGIN
    EXECUTE PROCEDURE ERROR (33, :IDDOC, :PREF, 1);
    ERROR = ERROR + 1;
    VER = 'S';
    SUSPEND;
    END
END

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE CONTABIL_FACTURA(
    IDDOC INTEGER,
    IDINTER INTEGER)
RETURNS (
    ERROR INTEGER,
    VER CHAR(1),
    IDC INTEGER)
AS
declare variable pref varchar(4);
declare variable num varchar(6);
declare variable numero varchar(10);
declare variable fecaux date;
declare variable fecha char(8);
declare variable conc varchar(60);
declare variable venceaux date;
declare variable vence char(8);
declare variable vrdto numeric(18,2);
declare variable vradic numeric(18,2);
declare variable vrsubt numeric(18,2);
declare variable vriva numeric(18,2);
declare variable prtfte numeric(9,2);
declare variable vrrtfte numeric(18,2);
declare variable vrrtiva numeric(18,2);
declare variable prtica numeric(9,2);
declare variable vrrtica numeric(18,2);
declare variable vrtotal numeric(18,2);
declare variable vrextra numeric(18,2);
declare variable tipocomp varchar(3);
declare variable prefcont varchar(4);
declare variable ventas char(1);
declare variable ctaventas varchar(20);
declare variable iva char(1);
declare variable ctaiva varchar(20);
declare variable consumo char(1);
declare variable ctaconsumo varchar(20);
declare variable cartera char(1);
declare variable ctacartera varchar(20);
declare variable rtfte char(1);
declare variable ctartfte varchar(20);
declare variable rtiva char(1);
declare variable ctartiva varchar(20);
declare variable rtica char(1);
declare variable ctartica varchar(20);
declare variable inven char(1);
declare variable ctainven varchar(20);
declare variable costos char(1);
declare variable ctacostos varchar(20);
declare variable ctadto varchar(20);
declare variable ctaadic varchar(20);
declare variable ctaextra varchar(20);
declare variable existe char(1);
declare variable cuenta varchar(20);
declare variable monto numeric(18,2);
declare variable tipocuen char(1);
declare variable nit varchar(20);
declare variable nombre varchar(60);
declare variable proy varchar(4);
declare variable centro varchar(4);
declare variable porc numeric(5,2);
declare variable debito numeric(18,2);
declare variable credito numeric(18,2);
declare variable nroi integer;
declare variable art varchar(15);
declare variable imptos numeric(18,2);
declare variable suma numeric(18,2);
declare variable porciva numeric(9,2);
declare variable tctaclien varchar(20);
declare variable tctaventa varchar(20);
declare variable tctartfte varchar(20);
declare variable tctartiva varchar(20);
declare variable tctartica varchar(20);
declare variable ctadic varchar(20);
declare variable baseadic varchar(20);
declare variable porcadic numeric(5,2);
declare variable valoradic numeric(18,2);
declare variable dbadic char(1);
declare variable ptovta integer;
declare variable anulado char(1);
declare variable dig integer;
declare variable mercancia numeric(18,2);
declare variable fomento varchar(2);
declare variable DTOXIT varchar(2);
declare variable vrconsumo numeric(18,2);
declare variable factor double precision;
declare variable cent char(1);
declare variable AUTORET VARCHAR(10);
declare variable FAUTORET DATE;
declare variable ERRORC INTEGER;
BEGIN
EXECUTE PROCEDURE LEE_CONFIGURACION('COMPRAS', 'FACTURAS', 'USAR IMPOCONSUMO COMO PORCENTAJE DE FOMENTO') returning_values (FOMENTO);
EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'FECHA AUTORETENEDOR NO DESCONTAR RETENCIONES DEL SALDO PERO SI CONTABILIZARLAS') returning_values (AUTORET);
if (AUTORET <> '') then
    FAUTORET = CAST(AUTORET AS DATE);
else
    FAUTORET = '9999/12/31';
/* BUSQUE LA INTERFACE */
EXISTE = 'N';
SELECT 'S', TICO_COD, PRCO_PRE, INVE_VENTAS, INVE_IVA, INVE_CONSUMO, INVE_CARTERA, INVE_RTFTE, INVE_RTIVA, INVE_RTICA, INVE_COSTO, INVE_INVEN, INVE_CTAVENTAS, INVE_CTAIVA, INVE_CTACONSUMO, INVE_CTADTO, INVE_CTAADIC, INVE_CTAEXTRA, INVE_CTACARTERA, INVE_CTARTFTE, INVE_CTARTIVA, INVE_CTARTICA, INVE_CTAINVEN, INVE_CTACOSTOS, INVE_CONFIRMAR, INVE_CENTRO
    FROM INTERFAZ_VENTAS
    WHERE INVE_ID = :IDINTER
    INTO :EXISTE, :TIPOCOMP, :PREFCONT, :VENTAS, :IVA, :CONSUMO, :CARTERA, :RTFTE, :RTIVA, :RTICA, :COSTOS, :INVEN, :CTAVENTAS, :CTAIVA, :CTACONSUMO, :CTADTO, :CTAADIC, :CTAEXTRA, :CTACARTERA, :CTARTFTE, :CTARTIVA, :CTARTICA, :CTAINVEN, :CTACOSTOS, :VER, :CENT;
if (EXISTE = 'S') then
  BEGIN
    /* BORRE CUALQUEIR CONTABILIZACION PREVIA */
    DELETE FROM CONTABILIZACION WHERE CNTB_TIPOREF = 31 AND CNTB_IDREF = :IDDOC;

  /* TRAIGA EL ENCABEZADO DE LA FACTURA */
  SELECT PREF_PRE, FACT_NUMERO, FACT_FECHA, F.TERC_NIT, PTVT_ID, FACT_VENCE, FACT_DTOMONTO, FACT_ADICIONAL, FACT_IVAMONTO, FACT_EXTRA, FACT_TOTAL, FACT_RTFTEPOR, FACT_RTFTEMONTO, FACT_RTIVAPOR, FACT_RTIVAMONTO, FACT_RTICAPOR, FACT_RTICAMONTO, FACT_NOMCLIENTE, TERC_CTARTFTE, TERC_CTARTIVA, TERC_CTARTICA, TERC_CTAVENTA, TERC_CTACLIENTE, FACT_ANULADO
        FROM FACTURAS F, TERCEROS T
        WHERE FACT_ID = :IDDOC AND F.TERC_NIT = T.TERC_NIT
        INTO :PREF, :NUM, :FECAUX, :NIT, :PTOVTA, :VENCEAUX, :VRDTO, :VRADIC, :VRIVA, :VREXTRA, :VRTOTAL, :PRTFTE, :VRRTFTE, :PORC, :VRRTIVA, :PRTICA, :VRRTICA, :NOMBRE, TCTARTFTE, TCTARTIVA, TCTARTICA, TCTAVENTA, TCTACLIEN, ANULADO;
  if (ANULADO = 'N') then
    BEGIN
    /* BUSQUE EL CENTRO DEL PUNTO, LA BODEGA, O EL PREFIJO  */
    IF (CENT = 'B') THEN
        SELECT B.BODE_CENTRO, B.BODE_PROY FROM BODEGA B, FACTURAS F
            WHERE B.BODE_COD = F.BODE_COD AND F.FACT_ID = :IDDOC INTO :CENTRO, :PROY;
    IF (CENT = 'V') THEN
        SELECT V.CENT_COD, V.PROY_COD FROM VENDEDORES V, FACTURAS F
            WHERE V.VEND_COD = F.VEND_COD AND F.FACT_ID = :IDDOC INTO :CENTRO, :PROY;
    IF (CENT = 'P') THEN
        SELECT P.PREF_CENTRO,P.PREF_PROY  FROM PREFIJOS P, FACTURAS F
            WHERE P.PREF_PRE = F.PREF_PRE AND F.FACT_ID = :IDDOC AND P.TIDO_COD = 31 INTO :CENTRO, :PROY;
    NUMERO = PREF || NUM;
    SELECT SUM (FADE_CONSUMO) FROM FACTURAS_DETALLE WHERE FACT_ID = :IDDOC  AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
        INTO MERCANCIA;
    VRSUBT = VRTOTAL - VREXTRA - VRIVA - MERCANCIA; /* BASE DE RETEFTE Y RETEICA */

    EXECUTE PROCEDURE lee_configuracion ('FACTURACION', 'FACTURAS', 'DESCUENTO PIE FACTURA IGUAL A SUMA DE DESCUENTOS POR ITEM') returning_values (:DTOXIT);
    if (DTOXIT = 'SI') then
        VRDTO = 0;
    MERCANCIA = VRSUBT - VRADIC + VRDTO;
    EXECUTE PROCEDURE FECHA_A_CONTA(:FECAUX) returning_values (:FECHA);
    EXECUTE PROCEDURE FECHA_A_CONTA(:VENCEAUX) returning_values (:VENCE);
    /* REGISTRE EL ENCABEZADO CONTABLE */
    IDC = GEN_ID(ID_CONTABILIZA, 1);
    if (STRLEN(NOMBRE)> 43 ) then
      CONC = 'FV No.' || NUMERO || '-' || SUBSTR(NOMBRE,1,43);
    ELSE
      CONC = 'FV No.' || NUMERO || '-' || NOMBRE;
    INSERT INTO CONTABILIZACION (CNTB_ID, CNTB_TIPOCOMP, CNTB_PREFCNT, CNTB_NUMERO, CNTB_FECHA, CNTB_CONCEPTO, CNTB_REF, CNTB_TIPOREF, CNTB_IDREF, CNTB_PREFREF, CNTB_NUMREF, CNTB_PROCESADO)
        VALUES (:IDC, :TIPOCOMP, :PREFCONT, :NUM, :FECHA, :CONC, '', 31, :IDDOC, :PREF, :NUM, 'N');
    NROI = 0;
    SUMA = 0;
    ERROR = 0;
    /* SI NO HAY CUENTA DE DESCUENTO NI ADICIONAL CALCULE UN FACTOR PARA LAS VENTAS Y EL IVA */
    if (MERCANCIA <> 0) then
        FACTOR = CAST(VRSUBT AS DOUBLE PRECISION) / CAST(MERCANCIA AS DOUBLE PRECISION);
    ELSE
        FACTOR = 1;
    /* TRAIGA EL NUMERO DE DIGITOS PARA EL REDONDEO */
    SELECT CAST(CONF_VALOR AS INTEGER) FROM CONFIGURACION WHERE CONF_MODULO = 'FACTURACION' AND
        CONF_CATEGORIA = 'GENERAL' AND CONF_PROPIEDAD = 'REDONDEO AL MULTIPLO DE DIEZ EN TOTALES' INTO :DIG;
    /* CUENTAS DE VENTAS */
    if (VENTAS = 'A') then
        BEGIN
        FOR SELECT MAX(COAR_CTAVNT), SUM(FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), SUM(FADE_IVAMONTO), SUM(FADE_CONSUMO)
            FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_DETALLE F
            WHERE F.FACT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
            GROUP BY COAR_CTAVNT
            INTO :CTAVENTAS, :MONTO, :IMPTOS, :VRCONSUMO
            DO
            BEGIN
            if (FOMENTO = 'SI') then
                MONTO = MONTO + VRCONSUMO;
            if ((CTADTO IS NULL) OR (CTADTO = '')) then
                MONTO = MONTO * FACTOR;
            execute procedure redondee(MONTO, DIG) returning_values (MONTO);
            if (MONTO <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTAVENTAS, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT F.ARTI_COD, (FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), FADE_CONSUMO
                        FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_DETALLE F
                        WHERE F.FACT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTAINV = :CUENTA AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
                        INTO :ART, :MONTO, :IMPTOS
                    DO
                        BEGIN
                        if (FOMENTO = 'SI') then
                            MONTO = MONTO + IMPTOS;
                        if ((CTADTO IS NULL) OR (CTADTO = '')) then
                            MONTO = MONTO * FACTOR;
                        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                        if (MONTO <> 0) then
                            BEGIN
                            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                            NROI = NROI + 1;
                            SUMA = SUMA - MONTO;
                            END
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    NROI = NROI + 1;
                    SUMA = SUMA - MONTO;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA - MONTO;
                    END
                END /* MONTO <> 0 */
            END /* FOR */
        END /* VENTAS X ARTICULO */
     IF ((VENTAS = 'C') OR (VENTAS = 'K')) THEN
        BEGIN
        IF (VENTAS = 'C') THEN
            CTAVENTAS = TCTAVENTA;
        SELECT SUM(FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), SUM(FADE_IVAMONTO), SUM (FADE_CONSUMO)
            FROM FACTURAS_DETALLE F
            WHERE F.FACT_ID = :IDDOC AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
            INTO :MONTO, :IMPTOS, :VRCONSUMO;
        if (FOMENTO = 'SI') then
            MONTO = MONTO + VRCONSUMO;
        if ((CTADTO IS NULL) OR (CTADTO = '')) then
            MONTO = MONTO * FACTOR;
        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
        if (MONTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTAVENTAS, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT F.ARTI_COD, (FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), FADE_CONSUMO
                    FROM ARTICULO A, FACTURAS_DETALLE F
                    WHERE F.FACT_ID = :IDDOC AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
                    INTO :ART, :MONTO, :IMPTOS
                    DO
                    BEGIN
                    if (FOMENTO = 'SI') then
                        MONTO = MONTO + VRCONSUMO;
                    if ((CTADTO IS NULL) OR (CTADTO = '')) then
                        MONTO = MONTO * FACTOR;
                    execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                    if (MONTO <> 0) then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        SUMA = SUMA - MONTO;
                        END
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - MONTO;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - MONTO;
                END
            END /* MONTO <> 0 */
        END /* VENTAS DE CLIENTE O CONSTANTE */
    /* EL IVA EN VENTAS */
    if (IVA = 'A') then
        BEGIN
        FOR SELECT MAX(COAR_CTAIVAV), SUM(FADE_IVAMONTO), SUM(FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), sum(FADE_CONSUMO)
            FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_DETALLE F
            WHERE F.FACT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
            GROUP BY COAR_CTAIVAV
            INTO :CTAIVA, :IMPTOS, :MONTO, :VALORADIC
        DO
            BEGIN
            if (FOMENTO = 'SI') then
                MONTO = MONTO + VALORADIC;
            MONTO = MONTO * -1;
            MONTO = MONTO * FACTOR;
            IMPTOS = IMPTOS * FACTOR;
            execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
            execute procedure redondee(MONTO, DIG) returning_values (MONTO);
            if (IMPTOS <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTAIVA, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT F.ARTI_COD, FADE_IVAMONTO, (FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), TAIV_PORC, FADE_CONSUMO
                        FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_DETALLE F, TARIFA_IVA T
                        WHERE F.FACT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTAIVAV = :CUENTA AND A.TAIV_COD = T.TAIV_COD AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
                        INTO :ART, :IMPTOS, :MONTO, :PORCIVA, :VALORADIC
                    DO
                        BEGIN
                        if (FOMENTO = 'SI') then
                            MONTO = MONTO + VALORADIC;
                        MONTO = MONTO * -1;
                        MONTO = MONTO * FACTOR;
                        IMPTOS = IMPTOS * FACTOR;
                        execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                        if (IMPTOS <> 0) then
                            BEGIN
                            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, :MONTO, :PORCIVA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                            NROI = NROI + 1;
                            SUMA = SUMA + DEBITO - CREDITO;
                            END
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, :MONTO, ABS(:IMPTOS*100/:MONTO), :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    NROI = NROI + 1;
                    SUMA = SUMA - IMPTOS;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, :MONTO, ABS(:IMPTOS*100/:MONTO), :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA - IMPTOS;
                    END
                END   /* IMPTOS <> 0 */
            END /* FOR */
        END /* IVA X ARTICULO */
    if (IVA = 'K') then /* IVA EN CTA CONSTANTE */
        BEGIN
        SELECT SUM(FADE_IVAMONTO), SUM(FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), SUM(FADE_CONSUMO)
            FROM FACTURAS_DETALLE F
            WHERE F.FACT_ID = :IDDOC and FADE_IVAMONTO <> 0 AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
            INTO :IMPTOS, :MONTO, :valoradic;
        if (FOMENTO = 'SI') then
            MONTO = MONTO + VALORADIC;
        MONTO = MONTO * -1;
        MONTO = MONTO * FACTOR;
        IMPTOS = IMPTOS * FACTOR;
        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
        execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
        if (IMPTOS <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTAIVA, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT F.ARTI_COD, (FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), FADE_IVAMONTO, TAIV_PORC, FADE_CONSUMO
                    FROM ARTICULO A, FACTURAS_DETALLE F, TARIFA_IVA T
                    WHERE F.FACT_ID = :IDDOC AND A.TAIV_COD = T.TAIV_COD AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
                    INTO :ART, :MONTO, :IMPTOS, :PORCIVA, :VALORADIC
                    DO
                    BEGIN
                    if (FOMENTO = 'SI') then
                        MONTO = MONTO + VALORADIC;
                    MONTO = MONTO * -1;
                    MONTO = MONTO * FACTOR;
                    IMPTOS = IMPTOS * FACTOR;
                    execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                    execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                    if (IMPTOS <> 0) then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', 0, :IMPTOS, :MONTO, :PORCIVA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        SUMA = SUMA - IMPTOS;
                        END
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', 0, :IMPTOS, :MONTO, ABS(:IMPTOS*100/:MONTO), :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - IMPTOS;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', 0, :IMPTOS, :MONTO, ABS(:IMPTOS*100/:MONTO), :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - IMPTOS;
                END
            END /* IMPTOS <> 0 */
        END /* IVA EN CTA CONSTANTE */
    /* EL IMPOCONSUMO */
    if ((CONSUMO = 'A') AND (FOMENTO <> 'SI')) then
        BEGIN
        FOR SELECT MAX(COAR_CTACONS), SUM(FADE_CONSUMO)
            FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_DETALLE F
            WHERE F.FACT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
            GROUP BY COAR_CTACONS
            INTO :CTACONSUMO, :IMPTOS
        DO
            BEGIN
            execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
            if (IMPTOS <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTACONSUMO, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, REGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT F.ARTI_COD, FADE_CONSUMO
                        FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_DETALLE F
                        WHERE F.FACT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTACONS = :CUENTA AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
                        INTO :ART, :IMPTOS
                    DO
                        BEGIN
                        execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                        if (IMPTOS <> 0) then
                            BEGIN
                            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                            NROI = NROI + 1;
                            SUMA = SUMA - IMPTOS;
                            END
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    NROI = NROI + 1;
                    SUMA = SUMA - IMPTOS;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA - IMPTOS;
                    END
                END /* IMPTOS <> 0 */
            END /* FOR */
        END /* CONSUMO X ARTICULO */
    if ((CONSUMO = 'K') AND (FOMENTO <> 'SI')) then /* CONSUMO EN CTA CONSTANTE */
        BEGIN
        SELECT SUM(FADE_CONSUMO)
            FROM FACTURAS_DETALLE F
            WHERE F.FACT_ID = :IDDOC AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
            INTO :IMPTOS;
        execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
        if (IMPTOS <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTACONSUMO, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT F.ARTI_COD, FADE_CONSUMO
                    FROM ARTICULO A, FACTURAS_DETALLE F
                    WHERE F.FACT_ID = :IDDOC AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
                    INTO :ART, :IMPTOS
                    DO
                    BEGIN
                    execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                    if (IMPTOS <> 0) then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CTACONSUMO, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        SUMA = SUMA - IMPTOS;
                        END
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTACONSUMO, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - IMPTOS;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTACONSUMO, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - IMPTOS;
                END
            END /* IMPTOS <> 0 */
        END /* CONSUMO EN CTA CONSTANTE */
    /* DESCUENTO */
    if ((CTADTO IS NOT NULL) AND (CTADTO <> '')) then
        BEGIN
        execute procedure redondee(VRDTO, DIG) returning_values (VRDTO);
        if (VRDTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTADTO, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRDTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA + VRDTO;
                END
            if (TIPOCUEN = 'N') then
                    BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRDTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA + VRDTO;
                END
            END
        END /* DESCUENTO */
    /* VALOR ADIC */
    if ((CTAADIC IS NOT NULL) AND (CTAADIC <> '')) then
        BEGIN
        execute procedure redondee(VRADIC, DIG) returning_values (VRADIC);
        if (VRADIC <> 0) THEN
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTAADIC, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRADIC, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - VRADIC;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRADIC, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - VRADIC;
                END
            END
        END /* VR. ADIC */
    /* VALOR EXTRA */
    if ((CTAEXTRA IS NOT NULL) AND (CTAEXTRA <> '')) THEN
        BEGIN
        execute procedure redondee(VREXTRA, DIG) returning_values (VREXTRA);
        if (VREXTRA <> 0) THEN
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTAEXTRA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VREXTRA, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - VREXTRA;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VREXTRA, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - VREXTRA;
                END
            END
        END /* VR. EXTRA */
    /* DESCUENTE EL IMPOCONSUMO */
    SELECT SUM(FADE_CONSUMO)
        FROM FACTURAS_DETALLE F WHERE F.FACT_ID = :IDDOC AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL)) INTO :IMPTOS;
    vrsubt = vrsubt - IMPTOS;
    /* RETENCION FUENTE */
    if ((RTFTE = 'C') or (RTFTE = 'K')) then
      BEGIN
      execute procedure redondee(VRRTFTE, DIG) returning_values (VRRTFTE);
      if (VRRTFTE <> 0) then
        BEGIN
        if (RTFTE = 'C') then
            CTARTFTE = TCTARTFTE;
        EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTARTFTE, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :VRSUBT, :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTFTE;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :VRSUBT, :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTFTE;
            END
        /* AUTORETENCION */
        if (FAUTORET <= fecaux) then
            BEGIN
            EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'CUENTA DE AUTORETENCION EN LA FUENTE') returning_values (CTARTFTE);
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTARTFTE INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERROR (31, :IDDOC, :CTARTFTE, 2);
                CUENTA = CTARTFTE;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                begin
                EXECUTE PROCEDURE ERROR (31, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, (:VRSUBT*-1), :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - VRRTFTE;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, (:VRSUBT*-1), :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - VRRTFTE;
                END
            END
        END /* RTFTE */
      END
    if (RTFTE = 'A') then
      BEGIN
      FOR SELECT MAX(COAR_CTARTFTEV), MAX(COAR_RTFTE), MIN(COAR_RTBASE), SUM(FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), SUM((FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO)*COAR_RTFTE)
        FROM CONTABIL_ARTICULO C, FACTURAS_DETALLE F
        WHERE F.FACT_ID = :IDDOC AND F.ARTI_COD = C.ARTI_COD AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
        GROUP BY COAR_CTARTFTEV
        INTO :CTARTFTE, :PRTFTE, :baseadic, :MONTO, :VRRTFTE
        DO
        BEGIN
        MONTO = MONTO * FACTOR;
        if (MONTO >= BASEADIC) then
            BEGIN
            VRRTFTE = VRRTFTE * FACTOR / 100;
            execute procedure redondee(VRRTFTE, DIG) returning_values (VRRTFTE);
            execute procedure redondee(MONTO, DIG) returning_values (MONTO);
            if (VRRTFTE <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTARTFTE, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :MONTO, :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    NROI = NROI + 1;
                    SUMA = SUMA + VRRTFTE;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :MONTO, :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA + VRRTFTE;
                    END
                /* AUTORETENCION */
                if (FAUTORET <= fecaux) then
                    BEGIN
                    EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'CUENTA DE AUTORETENCION EN LA FUENTE') returning_values (CTARTFTE);
                    EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTARTFTE, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
                    if (ERRORC <> 0) then
                        ERROR = ERROR + 1;
                    if (TIPOCUEN = 'C') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, (:MONTO*-1), :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                        NROI = NROI + 1;
                        SUMA = SUMA - VRRTFTE;
                        END
                    if (TIPOCUEN = 'N') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, (:MONTO*-1), :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NROI = NROI + 1;
                        SUMA = SUMA - VRRTFTE;
                        END
                    END
                END
            END
        END /* RTFTE */
      END
    /* RETENCION IVA */
    if ((RTIVA = 'C') or (RTIVA = 'K')) then
      BEGIN
      execute procedure redondee(VRRTIVA, DIG) returning_values (VRRTIVA);
      if (VRRTIVA <> 0) then
        BEGIN
        if (RTIVA = 'C') then
            CTARTIVA = TCTARTIVA;
        EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTARTIVA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTIVA, 0, :VRIVA, :PORC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTIVA;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTIVA, 0, :VRIVA, :PORC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTIVA;
            END
        END /* RTIVA */
      END
    /* RETENCION DE ICA */
    if ((RTICA = 'C') or (RTICA = 'K')) then
      BEGIN
      execute procedure redondee(VRRTICA, DIG) returning_values (VRRTICA);
      if (VRRTICA <> 0) then
        BEGIN
        if (RTICA = 'C') then
            CTARTICA = TCTARTICA;
        EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTARTICA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTICA, 0, :VRSUBT, :PRTICA, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTICA;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTICA, 0, :VRSUBT, :PRTICA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTICA;
            END
        END /* RTICA */
      END
    /* CIERRE EL COMPROBANTE CONTRA LA CUENTA DEL TERCERO O LA CONSTANTE */
    if ((SUMA <> 0) and ((CARTERA = 'C') or (CARTERA = 'K') or (CARTERA = 'J'))) then
        BEGIN
        if (SUMA < 0) then
            BEGIN
            DEBITO = SUMA * -1;
            CREDITO = 0;
            END
        ELSE
            BEGIN
            DEBITO = 0;
            CREDITO = SUMA;
            END
        if (CARTERA = 'C') then
            CTACARTERA = TCTACLIEN;
        if (CARTERA = 'J') then
            BEGIN
            /* BUSQUE LA CUENTA DE LA CAJA */
            SELECT CAJA_CUENTA FROM CAJAS C, PUNTO_VENTA P
                WHERE P.CAJA_ID = C.CAJA_ID AND PTVT_ID = :PTOVTA
                INTO :CTACARTERA;
            END
        EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTACARTERA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :DEBITO, :CREDITO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
        if (TIPOCUEN = 'N') then
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :DEBITO, :CREDITO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
        NROI = NROI + 1;
        END /* SUMA EN CARTERA */
    /* CALCULE COSTOS EN VENTAS */
    EXECUTE PROCEDURE COSTO_EN_VENTAS(31, :IDDOC);
    if (COSTOS = 'A') then
        BEGIN
        FOR SELECT MAX(CTACOS), SUM(CAST(CANT AS DOUBLE PRECISION) * COSTO)
            FROM COSTO_VENTAS
            GROUP BY CTACOS
            INTO :CTACOSTOS, :MONTO
        DO
            BEGIN
            if (MONTO <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTACOSTOS, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT ARTI_COD, CANT * COSTO
                        FROM COSTO_VENTAS
                        WHERE CTACOS = :CUENTA
                        INTO :ART, :MONTO
                    DO
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    NROI = NROI + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    END
                END /* MONTO <> 0 */
            END /* FOR */
        END /* COSTOS */
    if (COSTOS = 'K') then
        BEGIN
        SELECT SUM(CAST(CANT AS DOUBLE PRECISION) * COSTO)
            FROM COSTO_VENTAS
            INTO :MONTO;
        if (MONTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTACOSTOS, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, REGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT ARTI_COD, CANT * COSTO
                    FROM COSTO_VENTAS
                    INTO :ART, :MONTO
                DO
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTACOSTOS, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                    NROI = NROI + 1;
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTACOSTOS, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTACOSTOS, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                END
            END /* MONTO <> 0 */
        END /* COSTOS = K */
    if (INVEN = 'A') then
        BEGIN
        FOR SELECT MAX(CTAINV), SUM(CAST(CANT AS DOUBLE PRECISION) * COSTO)
            FROM COSTO_VENTAS
            GROUP BY CTAINV
            INTO :CTAINVEN, :MONTO
        DO
            BEGIN
            if (MONTO <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTAINVEN, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, REGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT ARTI_COD, CANT * COSTO
                        FROM COSTO_VENTAS
                        WHERE CTAINV = :CUENTA
                        INTO :ART, :MONTO
                    DO
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    NROI = NROI + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    END
                END /* MONTO <> 0 */
            END /* FOR */
        END /* INVEN = A */
    if (INVEN = 'K') then
        BEGIN
        SELECT SUM(CAST(CANT AS DOUBLE PRECISION) * COSTO)
            FROM COSTO_VENTAS
            INTO :MONTO;
        if (MONTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTAINVEN, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT ARTI_COD, CANT * COSTO
                    FROM COSTO_VENTAS
                    INTO :ART, :MONTO
                DO
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTAINVEN, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                    NROI = NROI + 1;
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAINVEN, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAINVEN, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                END
            END /* MONTO <> 0 */
        END /* INVEN = K */
    /* recorra las cuentas adicionales */
    FOR SELECT INVC_CUENTA, INVC_BASE, INVC_PORC, INVC_VALOR, INVC_DB
        FROM INTERFAZ_VENTAS_CTAS
        WHERE INVE_ID = :IDINTER
        INTO :CTADIC, :BASEADIC, :PORCADIC, :VALORADIC, :DBADIC
        DO
        BEGIN
        if (VALORADIC <> 0) then
            MONTO = VALORADIC;
        ELSE
            BEGIN
            if (:BASEADIC = 'SUBTOTAL') then
                VALORADIC = vrsubt;
            if (:BASEADIC = 'DESCUENTO') then
                VALORADIC = VRDTO;
            if (:BASEADIC = 'IVA') then
                VALORADIC = VRIVA;
            if (:BASEADIC = 'ADICIONAL') then
                VALORADIC = VRADIC;
            if (:BASEADIC = 'EXTRA') then
                VALORADIC = VREXTRA;
            if (:BASEADIC = 'TOTAL') then
                VALORADIC = VRTOTAL;
            MONTO = VALORADIC * PORCADIC / 100;
            END
        if (MONTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTADIC, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                if (DBADIC = 'S') then
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                ELSE
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                if (DBADIC = 'S') then
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                ELSE
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                END
            NROI = NROI + 1;
            END
        END
    if (ERROR > 0) then
        VER = 'S';
    SUSPEND;
    END /* NO ANULADO */
  END /* EXISTE LA INTERFAZ */
ELSE
    BEGIN
    EXECUTE PROCEDURE ERROR (31, :IDDOC, :PREF, 1);
    ERROR = ERROR + 1;
    VER = 'S';
    SUSPEND;
    END
END

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE CONTABIL_FACTURA_IVA(
    IDDOC INTEGER,
    IDINTER INTEGER)
RETURNS (
    ERROR INTEGER,
    VER CHAR(1),
    IDC INTEGER)
AS
declare variable pref varchar(4);
declare variable num varchar(6);
declare variable numero varchar(10);
declare variable fecaux date;
declare variable fecha char(8);
declare variable conc varchar(60);
declare variable venceaux date;
declare variable vence char(8);
declare variable vrdto numeric(18,2);
declare variable vradic numeric(18,2);
declare variable vrsubt numeric(18,2);
declare variable vriva numeric(18,2);
declare variable prtfte numeric(9,2);
declare variable vrrtfte numeric(18,2);
declare variable vrrtiva numeric(18,2);
declare variable prtica numeric(9,2);
declare variable vrrtica numeric(18,2);
declare variable vrtotal numeric(18,2);
declare variable vrextra numeric(18,2);
declare variable tipocomp varchar(3);
declare variable prefcont varchar(4);
declare variable ventas char(1);
declare variable ctaventas varchar(20);
declare variable iva char(1);
declare variable ctaiva varchar(20);
declare variable consumo char(1);
declare variable ctaconsumo varchar(20);
declare variable cartera char(1);
declare variable ctacartera varchar(20);
declare variable rtfte char(1);
declare variable ctartfte varchar(20);
declare variable rtiva char(1);
declare variable ctartiva varchar(20);
declare variable rtica char(1);
declare variable ctartica varchar(20);
declare variable inven char(1);
declare variable ctainven varchar(20);
declare variable costos char(1);
declare variable ctacostos varchar(20);
declare variable ctadto varchar(20);
declare variable ctaadic varchar(20);
declare variable ctaextra varchar(20);
declare variable existe char(1);
declare variable cuenta varchar(20);
declare variable monto numeric(18,2);
declare variable tipocuen char(1);
declare variable nit varchar(20);
declare variable nombre varchar(60);
declare variable proy varchar(4);
declare variable centro varchar(4);
declare variable porc numeric(5,2);
declare variable debito numeric(18,2);
declare variable credito numeric(18,2);
declare variable nroi integer;
declare variable art varchar(15);
declare variable imptos numeric(18,2);
declare variable suma numeric(18,2);
declare variable porciva numeric(9,2);
declare variable tctaclien varchar(20);
declare variable tctaventa varchar(20);
declare variable tctartfte varchar(20);
declare variable tctartiva varchar(20);
declare variable tctartica varchar(20);
declare variable ctadic varchar(20);
declare variable baseadic varchar(20);
declare variable porcadic numeric(5,2);
declare variable valoradic numeric(18,2);
declare variable dbadic char(1);
declare variable ptovta integer;
declare variable anulado char(1);
declare variable dig integer;
declare variable mercancia numeric(18,2);
declare variable fomento varchar(2);
declare variable DTOXIT varchar(2);
declare variable vrconsumo numeric(18,2);
declare variable factor double precision;
declare variable cent char(1);
declare variable AUTORET VARCHAR(10);
declare variable FAUTORET DATE;
declare variable ERRORC INTEGER;
BEGIN
EXECUTE PROCEDURE LEE_CONFIGURACION('COMPRAS', 'FACTURAS', 'USAR IMPOCONSUMO COMO PORCENTAJE DE FOMENTO') returning_values (FOMENTO);
EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'FECHA AUTORETENEDOR NO DESCONTAR RETENCIONES DEL SALDO PERO SI CONTABILIZARLAS') returning_values (AUTORET);
if (AUTORET <> '') then
    FAUTORET = CAST(AUTORET AS DATE);
else
    FAUTORET = '9999/12/31';
/* BUSQUE LA INTERFACE */
EXISTE = 'N';
SELECT 'S', TICO_COD, PRCO_PRE, INVE_VENTAS, INVE_IVA, INVE_CONSUMO, INVE_CARTERA, INVE_RTFTE, INVE_RTIVA, INVE_RTICA, INVE_COSTO, INVE_INVEN, INVE_CTAVENTAS, INVE_CTAIVA, INVE_CTACONSUMO, INVE_CTADTO, INVE_CTAADIC, INVE_CTAEXTRA, INVE_CTACARTERA, INVE_CTARTFTE, INVE_CTARTIVA, INVE_CTARTICA, INVE_CTAINVEN, INVE_CTACOSTOS, INVE_CONFIRMAR, INVE_CENTRO
    FROM INTERFAZ_VENTAS
    WHERE INVE_ID = :IDINTER
    INTO :EXISTE, :TIPOCOMP, :PREFCONT, :VENTAS, :IVA, :CONSUMO, :CARTERA, :RTFTE, :RTIVA, :RTICA, :COSTOS, :INVEN, :CTAVENTAS, :CTAIVA, :CTACONSUMO, :CTADTO, :CTAADIC, :CTAEXTRA, :CTACARTERA, :CTARTFTE, :CTARTIVA, :CTARTICA, :CTAINVEN, :CTACOSTOS, :VER, :CENT;
if (EXISTE = 'S') then
  BEGIN
    /* BORRE CUALQUEIR CONTABILIZACION PREVIA */
    DELETE FROM CONTABILIZACION WHERE CNTB_TIPOREF = 31 AND CNTB_IDREF = :IDDOC;

  /* TRAIGA EL ENCABEZADO DE LA FACTURA */
  SELECT PREF_PRE, FACT_NUMERO, FACT_FECHA, F.TERC_NIT, PTVT_ID, FACT_VENCE, FACT_DTOMONTO, FACT_ADICIONAL, FACT_IVAMONTO, FACT_EXTRA, FACT_TOTAL, FACT_RTFTEPOR, FACT_RTFTEMONTO, FACT_RTIVAPOR, FACT_RTIVAMONTO, FACT_RTICAPOR, FACT_RTICAMONTO, FACT_NOMCLIENTE, TERC_CTARTFTE, TERC_CTARTIVA, TERC_CTARTICA, TERC_CTAVENTA, TERC_CTACLIENTE, FACT_ANULADO
        FROM FACTURAS F, TERCEROS T
        WHERE FACT_ID = :IDDOC AND F.TERC_NIT = T.TERC_NIT
        INTO :PREF, :NUM, :FECAUX, :NIT, :PTOVTA, :VENCEAUX, :VRDTO, :VRADIC, :VRIVA, :VREXTRA, :VRTOTAL, :PRTFTE, :VRRTFTE, :PORC, :VRRTIVA, :PRTICA, :VRRTICA, :NOMBRE, TCTARTFTE, TCTARTIVA, TCTARTICA, TCTAVENTA, TCTACLIEN, ANULADO;
  if (ANULADO = 'N') then
    BEGIN
    /* BUSQUE EL CENTRO DEL PUNTO, LA BODEGA, O EL PREFIJO  */
    IF (CENT = 'B') THEN
        SELECT B.BODE_CENTRO, B.BODE_PROY FROM BODEGA B, FACTURAS F
            WHERE B.BODE_COD = F.BODE_COD AND F.FACT_ID = :IDDOC INTO :CENTRO, :PROY;
    IF (CENT = 'V') THEN
        SELECT V.CENT_COD, V.PROY_COD FROM VENDEDORES V, FACTURAS F
            WHERE V.VEND_COD = F.VEND_COD AND F.FACT_ID = :IDDOC INTO :CENTRO, :PROY;
    IF (CENT = 'P') THEN
        SELECT P.PREF_CENTRO,P.PREF_PROY  FROM PREFIJOS P, FACTURAS F
            WHERE P.PREF_PRE = F.PREF_PRE AND F.FACT_ID = :IDDOC AND P.TIDO_COD = 31 INTO :CENTRO, :PROY;
    NUMERO = PREF || NUM;
    SELECT SUM (FADE_CONSUMO) FROM FACTURAS_DETALLE WHERE FACT_ID = :IDDOC  AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
        INTO MERCANCIA;
    VRSUBT = VRTOTAL - VREXTRA - VRIVA - MERCANCIA; /* BASE DE RETEFTE Y RETEICA */

    EXECUTE PROCEDURE lee_configuracion ('FACTURACION', 'FACTURAS', 'DESCUENTO PIE FACTURA IGUAL A SUMA DE DESCUENTOS POR ITEM') returning_values (:DTOXIT);
    if (DTOXIT = 'SI') then
        VRDTO = 0;
    MERCANCIA = VRSUBT - VRADIC + VRDTO;
    EXECUTE PROCEDURE FECHA_A_CONTA(:FECAUX) returning_values (:FECHA);
    EXECUTE PROCEDURE FECHA_A_CONTA(:VENCEAUX) returning_values (:VENCE);
    /* REGISTRE EL ENCABEZADO CONTABLE */
    IDC = GEN_ID(ID_CONTABILIZA, 1);
    if (STRLEN(NOMBRE)> 43 ) then
      CONC = 'FV No.' || NUMERO || '-' || SUBSTR(NOMBRE,1,43);
    ELSE
      CONC = 'FV No.' || NUMERO || '-' || NOMBRE;
    INSERT INTO CONTABILIZACION (CNTB_ID, CNTB_TIPOCOMP, CNTB_PREFCNT, CNTB_NUMERO, CNTB_FECHA, CNTB_CONCEPTO, CNTB_REF, CNTB_TIPOREF, CNTB_IDREF, CNTB_PREFREF, CNTB_NUMREF, CNTB_PROCESADO)
        VALUES (:IDC, :TIPOCOMP, :PREFCONT, :NUM, :FECHA, :CONC, '', 31, :IDDOC, :PREF, :NUM, 'N');
    NROI = 0;
    SUMA = 0;
    ERROR = 0;
    /* SI NO HAY CUENTA DE DESCUENTO NI ADICIONAL CALCULE UN FACTOR PARA LAS VENTAS Y EL IVA */
    if (MERCANCIA <> 0) then
        FACTOR = CAST(VRSUBT AS DOUBLE PRECISION) / CAST(MERCANCIA AS DOUBLE PRECISION);
    ELSE
        FACTOR = 1;
    /* TRAIGA EL NUMERO DE DIGITOS PARA EL REDONDEO */
    SELECT CAST(CONF_VALOR AS INTEGER) FROM CONFIGURACION WHERE CONF_MODULO = 'FACTURACION' AND
        CONF_CATEGORIA = 'GENERAL' AND CONF_PROPIEDAD = 'REDONDEO AL MULTIPLO DE DIEZ EN TOTALES' INTO :DIG;
    /* CUENTAS DE VENTAS */
    if (VENTAS = 'A') then
        BEGIN
        FOR SELECT MAX(TAIV_CTAVTA), SUM(FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), SUM(FADE_IVAMONTO), SUM(FADE_CONSUMO)
            FROM TARIFA_IVA T, FACTURAS_DETALLE F
            WHERE F.FACT_ID = :IDDOC AND F.fade_ivaporc = T.taiv_porc AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
            GROUP BY TAIV_CTAVTA
            INTO :CTAVENTAS, :MONTO, :IMPTOS, :VRCONSUMO
            DO
            BEGIN
            if (FOMENTO = 'SI') then
                MONTO = MONTO + VRCONSUMO;
            if ((CTADTO IS NULL) OR (CTADTO = '')) then
                MONTO = MONTO * FACTOR;
            execute procedure redondee(MONTO, DIG) returning_values (MONTO);
            if (MONTO <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTAVENTAS, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT F.ARTI_COD, (FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), FADE_CONSUMO
                        FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_DETALLE F
                        WHERE F.FACT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTAINV = :CUENTA AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
                        INTO :ART, :MONTO, :IMPTOS
                    DO
                        BEGIN
                        if (FOMENTO = 'SI') then
                            MONTO = MONTO + IMPTOS;
                        if ((CTADTO IS NULL) OR (CTADTO = '')) then
                            MONTO = MONTO * FACTOR;
                        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                        if (MONTO <> 0) then
                            BEGIN
                            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                            NROI = NROI + 1;
                            SUMA = SUMA - MONTO;
                            END
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    NROI = NROI + 1;
                    SUMA = SUMA - MONTO;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA - MONTO;
                    END
                END /* MONTO <> 0 */
            END /* FOR */
        END /* VENTAS X ARTICULO */
     IF ((VENTAS = 'C') OR (VENTAS = 'K')) THEN
        BEGIN
        IF (VENTAS = 'C') THEN
            CTAVENTAS = TCTAVENTA;
        SELECT SUM(FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), SUM(FADE_IVAMONTO), SUM (FADE_CONSUMO)
            FROM FACTURAS_DETALLE F
            WHERE F.FACT_ID = :IDDOC AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
            INTO :MONTO, :IMPTOS, :VRCONSUMO;
        if (FOMENTO = 'SI') then
            MONTO = MONTO + VRCONSUMO;
        if ((CTADTO IS NULL) OR (CTADTO = '')) then
            MONTO = MONTO * FACTOR;
        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
        if (MONTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTAVENTAS, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT F.ARTI_COD, (FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), FADE_CONSUMO
                    FROM ARTICULO A, FACTURAS_DETALLE F
                    WHERE F.FACT_ID = :IDDOC AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
                    INTO :ART, :MONTO, :IMPTOS
                    DO
                    BEGIN
                    if (FOMENTO = 'SI') then
                        MONTO = MONTO + VRCONSUMO;
                    if ((CTADTO IS NULL) OR (CTADTO = '')) then
                        MONTO = MONTO * FACTOR;
                    execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                    if (MONTO <> 0) then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        SUMA = SUMA - MONTO;
                        END
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - MONTO;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - MONTO;
                END
            END /* MONTO <> 0 */
        END /* VENTAS DE CLIENTE O CONSTANTE */
    /* EL IVA EN VENTAS */
    if (IVA = 'A') then
        BEGIN
        FOR SELECT MAX(TAIV_CTAIVAVNT), SUM(FADE_IVAMONTO), SUM(FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), sum(FADE_CONSUMO)
            FROM TARIFA_IVA T, FACTURAS_DETALLE F
            WHERE F.FACT_ID = :IDDOC AND F.fade_ivaporc = T.taiv_porc AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
            GROUP BY TAIV_CTAIVAVNT
            INTO :CTAIVA, :IMPTOS, :MONTO, :VALORADIC
        DO
            BEGIN
            if (FOMENTO = 'SI') then
                MONTO = MONTO + VALORADIC;
            MONTO = MONTO * -1;
            MONTO = MONTO * FACTOR;
            IMPTOS = IMPTOS * FACTOR;
            execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
            execute procedure redondee(MONTO, DIG) returning_values (MONTO);
            if (IMPTOS <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTAIVA, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT F.ARTI_COD, FADE_IVAMONTO, (FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), TAIV_PORC, FADE_CONSUMO
                        FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_DETALLE F, TARIFA_IVA T
                        WHERE F.FACT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTAIVAV = :CUENTA AND A.TAIV_COD = T.TAIV_COD AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
                        INTO :ART, :IMPTOS, :MONTO, :PORCIVA, :VALORADIC
                    DO
                        BEGIN
                        if (FOMENTO = 'SI') then
                            MONTO = MONTO + VALORADIC;
                        MONTO = MONTO * -1;
                        MONTO = MONTO * FACTOR;
                        IMPTOS = IMPTOS * FACTOR;
                        execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                        if (IMPTOS <> 0) then
                            BEGIN
                            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, :MONTO, :PORCIVA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                            NROI = NROI + 1;
                            SUMA = SUMA + DEBITO - CREDITO;
                            END
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, :MONTO, ABS(:IMPTOS*100/:MONTO), :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    NROI = NROI + 1;
                    SUMA = SUMA - IMPTOS;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, :MONTO, ABS(:IMPTOS*100/:MONTO), :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA - IMPTOS;
                    END
                END   /* IMPTOS <> 0 */
            END /* FOR */
        END /* IVA X ARTICULO */
    if (IVA = 'K') then /* IVA EN CTA CONSTANTE */
        BEGIN
        SELECT SUM(FADE_IVAMONTO), SUM(FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), SUM(FADE_CONSUMO)
            FROM FACTURAS_DETALLE F
            WHERE F.FACT_ID = :IDDOC and FADE_IVAMONTO <> 0 AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
            INTO :IMPTOS, :MONTO, :valoradic;
        if (FOMENTO = 'SI') then
            MONTO = MONTO + VALORADIC;
        MONTO = MONTO * -1;
        MONTO = MONTO * FACTOR;
        IMPTOS = IMPTOS * FACTOR;
        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
        execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
        if (IMPTOS <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTAIVA, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT F.ARTI_COD, (FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), FADE_IVAMONTO, TAIV_PORC, FADE_CONSUMO
                    FROM ARTICULO A, FACTURAS_DETALLE F, TARIFA_IVA T
                    WHERE F.FACT_ID = :IDDOC AND A.TAIV_COD = T.TAIV_COD AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
                    INTO :ART, :MONTO, :IMPTOS, :PORCIVA, :VALORADIC
                    DO
                    BEGIN
                    if (FOMENTO = 'SI') then
                        MONTO = MONTO + VALORADIC;
                    MONTO = MONTO * -1;
                    MONTO = MONTO * FACTOR;
                    IMPTOS = IMPTOS * FACTOR;
                    execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                    execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                    if (IMPTOS <> 0) then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', 0, :IMPTOS, :MONTO, :PORCIVA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        SUMA = SUMA - IMPTOS;
                        END
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', 0, :IMPTOS, :MONTO, ABS(:IMPTOS*100/:MONTO), :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - IMPTOS;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', 0, :IMPTOS, :MONTO, ABS(:IMPTOS*100/:MONTO), :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - IMPTOS;
                END
            END /* IMPTOS <> 0 */
        END /* IVA EN CTA CONSTANTE */
    /* EL IMPOCONSUMO */
    if ((CONSUMO = 'A') AND (FOMENTO <> 'SI')) then
        BEGIN
        FOR SELECT MAX(COAR_CTACONS), SUM(FADE_CONSUMO)
            FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_DETALLE F
            WHERE F.FACT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
            GROUP BY COAR_CTACONS
            INTO :CTACONSUMO, :IMPTOS
        DO
            BEGIN
            execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
            if (IMPTOS <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTACONSUMO, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, REGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT F.ARTI_COD, FADE_CONSUMO
                        FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_DETALLE F
                        WHERE F.FACT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTACONS = :CUENTA AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
                        INTO :ART, :IMPTOS
                    DO
                        BEGIN
                        execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                        if (IMPTOS <> 0) then
                            BEGIN
                            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                            NROI = NROI + 1;
                            SUMA = SUMA - IMPTOS;
                            END
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    NROI = NROI + 1;
                    SUMA = SUMA - IMPTOS;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA - IMPTOS;
                    END
                END /* IMPTOS <> 0 */
            END /* FOR */
        END /* CONSUMO X ARTICULO */
    if ((CONSUMO = 'K') AND (FOMENTO <> 'SI')) then /* CONSUMO EN CTA CONSTANTE */
        BEGIN
        SELECT SUM(FADE_CONSUMO)
            FROM FACTURAS_DETALLE F
            WHERE F.FACT_ID = :IDDOC AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
            INTO :IMPTOS;
        execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
        if (IMPTOS <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTACONSUMO, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT F.ARTI_COD, FADE_CONSUMO
                    FROM ARTICULO A, FACTURAS_DETALLE F
                    WHERE F.FACT_ID = :IDDOC AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
                    INTO :ART, :IMPTOS
                    DO
                    BEGIN
                    execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                    if (IMPTOS <> 0) then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CTACONSUMO, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        SUMA = SUMA - IMPTOS;
                        END
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTACONSUMO, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - IMPTOS;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTACONSUMO, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - IMPTOS;
                END
            END /* IMPTOS <> 0 */
        END /* CONSUMO EN CTA CONSTANTE */
    /* DESCUENTO */
    if ((CTADTO IS NOT NULL) AND (CTADTO <> '')) then
        BEGIN
        execute procedure redondee(VRDTO, DIG) returning_values (VRDTO);
        if (VRDTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTADTO, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRDTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA + VRDTO;
                END
            if (TIPOCUEN = 'N') then
                    BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRDTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA + VRDTO;
                END
            END
        END /* DESCUENTO */
    /* VALOR ADIC */
    if ((CTAADIC IS NOT NULL) AND (CTAADIC <> '')) then
        BEGIN
        execute procedure redondee(VRADIC, DIG) returning_values (VRADIC);
        if (VRADIC <> 0) THEN
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTAADIC, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRADIC, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - VRADIC;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRADIC, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - VRADIC;
                END
            END
        END /* VR. ADIC */
    /* VALOR EXTRA */
    if ((CTAEXTRA IS NOT NULL) AND (CTAEXTRA <> '')) THEN
        BEGIN
        execute procedure redondee(VREXTRA, DIG) returning_values (VREXTRA);
        if (VREXTRA <> 0) THEN
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTAEXTRA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VREXTRA, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - VREXTRA;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VREXTRA, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - VREXTRA;
                END
            END
        END /* VR. EXTRA */
    /* DESCUENTE EL IMPOCONSUMO */
    SELECT SUM(FADE_CONSUMO)
        FROM FACTURAS_DETALLE F WHERE F.FACT_ID = :IDDOC AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL)) INTO :IMPTOS;
    vrsubt = vrsubt - IMPTOS;
    /* RETENCION FUENTE */
    if ((RTFTE = 'C') or (RTFTE = 'K')) then
      BEGIN
      execute procedure redondee(VRRTFTE, DIG) returning_values (VRRTFTE);
      if (VRRTFTE <> 0) then
        BEGIN
        if (RTFTE = 'C') then
            CTARTFTE = TCTARTFTE;
        EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTARTFTE, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :VRSUBT, :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTFTE;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :VRSUBT, :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTFTE;
            END
        /* AUTORETENCION */
        if (FAUTORET <= fecaux) then
            BEGIN
            EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'CUENTA DE AUTORETENCION EN LA FUENTE') returning_values (CTARTFTE);
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTARTFTE INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERROR (31, :IDDOC, :CTARTFTE, 2);
                CUENTA = CTARTFTE;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                begin
                EXECUTE PROCEDURE ERROR (31, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, (:VRSUBT*-1), :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - VRRTFTE;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, (:VRSUBT*-1), :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - VRRTFTE;
                END
            END
        END /* RTFTE */
      END
    if (RTFTE = 'A') then
      BEGIN
      FOR SELECT MAX(COAR_CTARTFTEV), MAX(COAR_RTFTE), MIN(COAR_RTBASE), SUM(FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), SUM((FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO)*COAR_RTFTE)
        FROM CONTABIL_ARTICULO C, FACTURAS_DETALLE F
        WHERE F.FACT_ID = :IDDOC AND F.ARTI_COD = C.ARTI_COD AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
        GROUP BY COAR_CTARTFTEV
        INTO :CTARTFTE, :PRTFTE, :baseadic, :MONTO, :VRRTFTE
        DO
        BEGIN
        MONTO = MONTO * FACTOR;
        if (MONTO >= BASEADIC) then
            BEGIN
            VRRTFTE = VRRTFTE * FACTOR / 100;
            execute procedure redondee(VRRTFTE, DIG) returning_values (VRRTFTE);
            execute procedure redondee(MONTO, DIG) returning_values (MONTO);
            if (VRRTFTE <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTARTFTE, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :MONTO, :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    NROI = NROI + 1;
                    SUMA = SUMA + VRRTFTE;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :MONTO, :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA + VRRTFTE;
                    END
                /* AUTORETENCION */
                if (FAUTORET <= fecaux) then
                    BEGIN
                    EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'CUENTA DE AUTORETENCION EN LA FUENTE') returning_values (CTARTFTE);
                    EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTARTFTE, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
                    if (ERRORC <> 0) then
                        ERROR = ERROR + 1;
                    if (TIPOCUEN = 'C') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, (:MONTO*-1), :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                        NROI = NROI + 1;
                        SUMA = SUMA - VRRTFTE;
                        END
                    if (TIPOCUEN = 'N') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, (:MONTO*-1), :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NROI = NROI + 1;
                        SUMA = SUMA - VRRTFTE;
                        END
                    END
                END
            END
        END /* RTFTE */
      END
    /* RETENCION IVA */
    if ((RTIVA = 'C') or (RTIVA = 'K')) then
      BEGIN
      execute procedure redondee(VRRTIVA, DIG) returning_values (VRRTIVA);
      if (VRRTIVA <> 0) then
        BEGIN
        if (RTIVA = 'C') then
            CTARTIVA = TCTARTIVA;
        EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTARTIVA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTIVA, 0, :VRIVA, :PORC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTIVA;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTIVA, 0, :VRIVA, :PORC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTIVA;
            END
        END /* RTIVA */
      END
    /* RETENCION DE ICA */
    if ((RTICA = 'C') or (RTICA = 'K')) then
      BEGIN
      execute procedure redondee(VRRTICA, DIG) returning_values (VRRTICA);
      if (VRRTICA <> 0) then
        BEGIN
        if (RTICA = 'C') then
            CTARTICA = TCTARTICA;
        EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTARTICA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTICA, 0, :VRSUBT, :PRTICA, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTICA;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTICA, 0, :VRSUBT, :PRTICA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTICA;
            END
        END /* RTICA */
      END
    /* CIERRE EL COMPROBANTE CONTRA LA CUENTA DEL TERCERO O LA CONSTANTE */
    if ((SUMA <> 0) and ((CARTERA = 'C') or (CARTERA = 'K') or (CARTERA = 'J'))) then
        BEGIN
        if (SUMA < 0) then
            BEGIN
            DEBITO = SUMA * -1;
            CREDITO = 0;
            END
        ELSE
            BEGIN
            DEBITO = 0;
            CREDITO = SUMA;
            END
        if (CARTERA = 'C') then
            CTACARTERA = TCTACLIEN;
        if (CARTERA = 'J') then
            BEGIN
            /* BUSQUE LA CUENTA DE LA CAJA */
            SELECT CAJA_CUENTA FROM CAJAS C, PUNTO_VENTA P
                WHERE P.CAJA_ID = C.CAJA_ID AND PTVT_ID = :PTOVTA
                INTO :CTACARTERA;
            END
        EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTACARTERA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :DEBITO, :CREDITO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
        if (TIPOCUEN = 'N') then
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :DEBITO, :CREDITO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
        NROI = NROI + 1;
        END /* SUMA EN CARTERA */
    /* CALCULE COSTOS EN VENTAS */
    EXECUTE PROCEDURE COSTO_EN_VENTAS(31, :IDDOC);
    if (COSTOS = 'A') then
        BEGIN
        FOR SELECT MAX(CTACOS), SUM(CAST(CANT AS DOUBLE PRECISION) * COSTO)
            FROM COSTO_VENTAS
            GROUP BY CTACOS
            INTO :CTACOSTOS, :MONTO
        DO
            BEGIN
            if (MONTO <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTACOSTOS, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT ARTI_COD, CANT * COSTO
                        FROM COSTO_VENTAS
                        WHERE CTACOS = :CUENTA
                        INTO :ART, :MONTO
                    DO
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    NROI = NROI + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    END
                END /* MONTO <> 0 */
            END /* FOR */
        END /* COSTOS */
    if (COSTOS = 'K') then
        BEGIN
        SELECT SUM(CAST(CANT AS DOUBLE PRECISION) * COSTO)
            FROM COSTO_VENTAS
            INTO :MONTO;
        if (MONTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTACOSTOS, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, REGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT ARTI_COD, CANT * COSTO
                    FROM COSTO_VENTAS
                    INTO :ART, :MONTO
                DO
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTACOSTOS, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                    NROI = NROI + 1;
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTACOSTOS, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTACOSTOS, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                END
            END /* MONTO <> 0 */
        END /* COSTOS = K */
    if (INVEN = 'A') then
        BEGIN
        FOR SELECT MAX(CTAINV), SUM(CAST(CANT AS DOUBLE PRECISION) * COSTO)
            FROM COSTO_VENTAS
            GROUP BY CTAINV
            INTO :CTAINVEN, :MONTO
        DO
            BEGIN
            if (MONTO <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTAINVEN, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, REGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT ARTI_COD, CANT * COSTO
                        FROM COSTO_VENTAS
                        WHERE CTAINV = :CUENTA
                        INTO :ART, :MONTO
                    DO
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    NROI = NROI + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    END
                END /* MONTO <> 0 */
            END /* FOR */
        END /* INVEN = A */
    if (INVEN = 'K') then
        BEGIN
        SELECT SUM(CAST(CANT AS DOUBLE PRECISION) * COSTO)
            FROM COSTO_VENTAS
            INTO :MONTO;
        if (MONTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTAINVEN, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT ARTI_COD, CANT * COSTO
                    FROM COSTO_VENTAS
                    INTO :ART, :MONTO
                DO
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTAINVEN, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                    NROI = NROI + 1;
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAINVEN, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAINVEN, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                END
            END /* MONTO <> 0 */
        END /* INVEN = K */
    /* recorra las cuentas adicionales */
    FOR SELECT INVC_CUENTA, INVC_BASE, INVC_PORC, INVC_VALOR, INVC_DB
        FROM INTERFAZ_VENTAS_CTAS
        WHERE INVE_ID = :IDINTER
        INTO :CTADIC, :BASEADIC, :PORCADIC, :VALORADIC, :DBADIC
        DO
        BEGIN
        if (VALORADIC <> 0) then
            MONTO = VALORADIC;
        ELSE
            BEGIN
            if (:BASEADIC = 'SUBTOTAL') then
                VALORADIC = vrsubt;
            if (:BASEADIC = 'DESCUENTO') then
                VALORADIC = VRDTO;
            if (:BASEADIC = 'IVA') then
                VALORADIC = VRIVA;
            if (:BASEADIC = 'ADICIONAL') then
                VALORADIC = VRADIC;
            if (:BASEADIC = 'EXTRA') then
                VALORADIC = VREXTRA;
            if (:BASEADIC = 'TOTAL') then
                VALORADIC = VRTOTAL;
            MONTO = VALORADIC * PORCADIC / 100;
            END
        if (MONTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTADIC, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                if (DBADIC = 'S') then
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                ELSE
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                if (DBADIC = 'S') then
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                ELSE
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                END
            NROI = NROI + 1;
            END
        END
    if (ERROR > 0) then
        VER = 'S';
    SUSPEND;
    END /* NO ANULADO */
  END /* EXISTE LA INTERFAZ */
ELSE
    BEGIN
    EXECUTE PROCEDURE ERROR (31, :IDDOC, :PREF, 1);
    ERROR = ERROR + 1;
    VER = 'S';
    SUSPEND;
    END
END

^

SET TERM ; ^

SET TERM ^ ;

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

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE CONTABIL_FACTURAS_CONTADO(
    FECFAC DATE,
    NIT VARCHAR(20),
    PREF VARCHAR(4),
    PTVTA INTEGER,
    IDINTER INTEGER)
RETURNS (
    ERROR INTEGER,
    VER CHAR(1),
    IDC INTEGER)
AS
declare variable num varchar(8);
declare variable numero varchar(10);
declare variable fecha char(8);
declare variable conc char(120);
declare variable vence char(8);
declare variable vrdto numeric(18,2);
declare variable vradic numeric(18,2);
declare variable vrsubt numeric(18,2);
declare variable vriva numeric(18,2);
declare variable prtfte numeric(9,2);
declare variable vrrtfte numeric(18,2);
declare variable vrrtiva numeric(18,2);
declare variable prtica numeric(9,2);
declare variable vrrtica numeric(18,2);
declare variable vrtotal numeric(18,2);
declare variable vrextra numeric(18,2);
declare variable tipocomp varchar(3);
declare variable prefcont varchar(4);
declare variable ventas char(1);
declare variable ctaventas varchar(20);
declare variable iva char(1);
declare variable ctaiva varchar(20);
declare variable consumo char(1);
declare variable ctaconsumo varchar(20);
declare variable cartera char(1);
declare variable ctacartera varchar(20);
declare variable rtfte char(1);
declare variable ctartfte varchar(20);
declare variable rtiva char(1);
declare variable ctartiva varchar(20);
declare variable rtica char(1);
declare variable ctartica varchar(20);
declare variable inven char(1);
declare variable ctainven varchar(20);
declare variable costos char(1);
declare variable ctacostos varchar(20);
declare variable ctadto varchar(20);
declare variable ctaadic varchar(20);
declare variable ctaextra varchar(20);
declare variable existe char(1);
declare variable cuenta varchar(20);
declare variable monto numeric(18,2);
declare variable tipocuen char(1);
declare variable nombre varchar(60);
declare variable proy varchar(4);
declare variable centro varchar(4);
declare variable porc numeric(5,2);
declare variable debito numeric(18,2);
declare variable credito numeric(18,2);
declare variable nroi integer;
declare variable art varchar(15);
declare variable impinc char(1);
declare variable imptos numeric(18,2);
declare variable suma numeric(18,2);
declare variable porciva numeric(9,2);
declare variable tctaclien varchar(20);
declare variable tctaventa varchar(20);
declare variable tctartfte varchar(20);
declare variable tctartiva varchar(20);
declare variable tctartica varchar(20);
declare variable ctadic varchar(20);
declare variable baseadic varchar(20);
declare variable porcadic numeric(5,2);
declare variable valoradic numeric(18,2);
declare variable dbadic char(1);
declare variable ptovta integer;
declare variable dig integer;
declare variable mercancia numeric(18,2);
declare variable factor double precision;
declare variable cent char(1);
BEGIN
/* BUSQUE LA INTERFACE */
EXISTE = 'N';
SELECT 'S', TICO_COD, PRCO_PRE, INVE_VENTAS, INVE_IVA, INVE_CONSUMO, INVE_CARTERA, INVE_RTFTE, INVE_RTIVA, INVE_RTICA, INVE_COSTO, INVE_INVEN, INVE_CTAVENTAS, INVE_CTAIVA, INVE_CTACONSUMO, INVE_CTADTO, INVE_CTAADIC, INVE_CTAEXTRA, INVE_CTACARTERA, INVE_CTARTFTE, INVE_CTARTIVA, INVE_CTARTICA, INVE_CTAINVEN, INVE_CTACOSTOS, INVE_CONFIRMAR, INVE_CENTRO
    FROM INTERFAZ_VENTAS
    WHERE INVE_ID = :IDINTER
    INTO :EXISTE, :TIPOCOMP, :PREFCONT, :VENTAS, :IVA, :CONSUMO, :CARTERA, :RTFTE, :RTIVA, :RTICA, :COSTOS, :INVEN, :CTAVENTAS, :CTAIVA, :CTACONSUMO, :CTADTO, :CTAADIC, :CTAEXTRA, :CTACARTERA, :CTARTFTE, :CTARTIVA, :CTARTICA, :CTAINVEN, :CTACOSTOS, :VER, :CENT;
if (EXISTE = 'S') then
  BEGIN
  /* BORRE CUALQUEIR CONTABILIZACION PREVIA */
/*  DELETE FROM CONTABILIZACION WHERE CNTB_TIPOREF = 31 AND CNTB_IDREF = 0;
  /* BUSQUE EL CENTRO DEL PUNTO, LA BODEGA, O EL PREFIJO  */
  IF (CENT = 'B') THEN
    SELECT B.BODE_CENTRO, B.BODE_PROY FROM BODEGA B, PUNTO_VENTA P
        WHERE B.BODE_COD = P.BODE_COD AND P.ptvt_id = :ptvta INTO :CENTRO, :PROY;
  IF (CENT = 'V') THEN
    SELECT MAX(V.CENT_COD), MAX(V.PROY_COD) FROM VENDEDORES V
        WHERE V.PTVT_ID = :PTVTA INTO :CENTRO, :PROY;
  IF (CENT = 'P') THEN
    SELECT P.PREF_PROY, P.PREF_CENTRO FROM PREFIJOS P
        WHERE P.PREF_PRE = :PREF AND P.TIDO_COD = 31 INTO :CENTRO, :PROY;
  /* TRAIGA LOS DATOS DEL CLIENTE */
  SELECT TERC_NOM, TERC_CTARTFTE, TERC_CTARTIVA, TERC_CTARTICA, TERC_CTAVENTA, TERC_CTACLIENTE
        FROM TERCEROS T WHERE TERC_NIT = :NIT
        INTO :NOMBRE, TCTARTFTE, TCTARTIVA, TCTARTICA, TCTAVENTA, TCTACLIEN;
  SELECT SUM(FACT_DTOMONTO), SUM(FACT_ADICIONAL), SUM(FACT_IVAMONTO), SUM(FACT_EXTRA), SUM(FACT_TOTAL), SUM(FACT_RTFTEMONTO), SUM(FACT_RTIVAMONTO), SUM(FACT_RTICAMONTO), MAX(FACT_IVAINC)
        FROM FACTURAS F WHERE FACT_FECHA = :FECFAC AND FACT_ANULADO = 'N' AND PTVT_ID = :ptvta AND PREF_PRE = :PREF
        INTO :VRDTO, :VRADIC, :VRIVA, :VREXTRA, :VRTOTAL, :VRRTFTE, :VRRTIVA, :VRRTICA, :impinc;
  VRSUBT = VRTOTAL - VREXTRA - VRIVA; /* BASE DE RETEFTE Y RETEICA */
  MERCANCIA = VRSUBT - VRADIC + VRDTO;
  EXECUTE PROCEDURE FECHA_A_CONTA(:FECFAC) returning_values (:FECHA);
  VENCE = FECHA;
  /* REGISTRE EL ENCABEZADO CONTABLE */
  IDC = GEN_ID(ID_CONTABILIZA, 1);
  CONC = 'RESUMEN VENTAS ' || FECHA;
  NUM = SUBSTR(FECHA, 3, 8);
  INSERT INTO CONTABILIZACION (CNTB_ID, CNTB_TIPOCOMP, CNTB_PREFCNT, CNTB_NUMERO, CNTB_FECHA, CNTB_CONCEPTO, CNTB_REF, CNTB_TIPOREF, CNTB_IDREF, CNTB_PREFREF, CNTB_NUMREF, CNTB_PROCESADO)
        VALUES (:IDC, :TIPOCOMP, :PREFCONT, :NUM, :FECHA, :CONC, '', 0, 0, :PREF, :NUM, 'N');
  NROI = 0;
  SUMA = 0;
  ERROR = 0;
  /* SI NO HAY CUENTA DE DESCUENTO NI ADICIONAL CALCULE UN FACTOR PARA LAS VENTAS Y EL IVA */
  if (MERCANCIA <> 0) then
    FACTOR = CAST(VRSUBT AS DOUBLE PRECISION) / CAST(MERCANCIA AS DOUBLE PRECISION);
  ELSE
    FACTOR = 1;
  /* TRAIGA EL NUMERO DE DIGITOS PARA EL REDONDEO */
  SELECT CAST(CONF_VALOR AS INTEGER) FROM CONFIGURACION WHERE CONF_MODULO = 'FACTURACION' AND
        CONF_CATEGORIA = 'GENERAL' AND CONF_PROPIEDAD = 'REDONDEO AL MULTIPLO DE DIEZ EN TOTALES' INTO :DIG;
  /* CUENTAS DE VENTAS */
  if (VENTAS = 'A') then
        BEGIN
        FOR SELECT MAX(COAR_CTAVNT), SUM(CAST(FADE_CANT AS DOUBLE PRECISION) * (FADE_PRUNIT-FADE_DTOMONTO)), SUM(FADE_IVAMONTO+FADE_CONSUMO)
            FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_DETALLE FD, FACTURAS F
            WHERE F.FACT_ID = FD.FACT_ID AND FACT_FECHA = :FECFAC AND FD.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND F.PREF_PRE = :PREF AND F.PTVT_ID = :PTVTA AND FACT_ANULADO = 'N' AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
            GROUP BY COAR_CTAVNT
            INTO :CTAVENTAS, :MONTO, :IMPTOS
            DO
            BEGIN
            if (IMPINC = 'S') then
                MONTO = MONTO - IMPTOS;
            if ((CTADTO IS NULL) OR (CTADTO = '')) then
                MONTO = MONTO * FACTOR;
            execute procedure redondee(MONTO, DIG) returning_values (MONTO);
            if (MONTO <> 0) then
                BEGIN
                CUENTA = NULL;
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :CTAVENTAS INTO :CUENTA, :TIPOCUEN;
                if (CUENTA IS NULL) then
                    begin
                    EXECUTE PROCEDURE ERROR (31, 0, :CTAVENTAS, 2);
                    CUENTA = CTAVENTAS;
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT FD.ARTI_COD, (CAST(FADE_CANT AS DOUBLE PRECISION) * (FADE_PRUNIT-FADE_DTOMONTO)), (FADE_IVAMONTO+FADE_CONSUMO)
                        FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_DETALLE FD, FACTURAS F
                        WHERE F.FACT_ID = FD.FACT_ID AND FACT_FECHA = :FECFAC AND F.PREF_PRE = :PREF AND F.PTVT_ID = :PTVTA AND FD.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTAINV = :CUENTA AND FACT_ANULADO = 'N' AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
                        INTO :ART, :MONTO, :IMPTOS
                    DO
                        BEGIN
                        if (IMPINC = 'S') then
                            MONTO = MONTO - IMPTOS;
                        if ((CTADTO IS NULL) OR (CTADTO = '')) then
                            MONTO = MONTO * FACTOR;
                        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                        if (MONTO <> 0) then
                            BEGIN
                            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                            NROI = NROI + 1;
                            SUMA = SUMA - MONTO;
                            END
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    NROI = NROI + 1;
                    SUMA = SUMA - MONTO;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA - MONTO;
                    END
                END /* MONTO <> 0 */
            END /* FOR */
        END /* VENTAS X ARTICULO */
     IF ((VENTAS = 'C') OR (VENTAS = 'K')) THEN
        BEGIN
        IF (VENTAS = 'C') THEN
            CTAVENTAS = TCTAVENTA;
        SELECT SUM(CAST(FADE_CANT AS DOUBLE PRECISION) * (FADE_PRUNIT-FADE_DTOMONTO)), SUM(FADE_IVAMONTO+FADE_CONSUMO)
            FROM FACTURAS_DETALLE FD, FACTURAS F
            WHERE F.FACT_ID = FD.FACT_ID AND FACT_FECHA = :FECFAC AND F.PREF_PRE = :PREF AND F.PTVT_ID = :PTVTA AND FACT_ANULADO = 'N' AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
            INTO :MONTO, :IMPTOS;
        if (IMPINC = 'S') then
            MONTO = MONTO - IMPTOS;
        if ((CTADTO IS NULL) OR (CTADTO = '')) then
            MONTO = MONTO * FACTOR;
        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
        if (MONTO <> 0) then
            BEGIN
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTAVENTAS INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERROR (31, 0, :CTAVENTAS, 2);
                CUENTA = CTAVENTAS;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT FD.ARTI_COD, (CAST(FADE_CANT AS DOUBLE PRECISION) * (FADE_PRUNIT-FADE_DTOMONTO)), (FADE_IVAMONTO+FADE_CONSUMO)
                    FROM /*ARTICULO A,*/ FACTURAS_DETALLE FD, FACTURAS F
                    WHERE F.FACT_ID = FD.FACT_ID AND FACT_FECHA = :FECFAC AND F.PREF_PRE = :PREF AND F.PTVT_ID = :PTVTA AND FACT_ANULADO = 'N' AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
                    INTO :ART, :MONTO, :IMPTOS
                    DO
                    BEGIN
                    if (IMPINC = 'S') then
                        MONTO = MONTO - IMPTOS;
                    if ((CTADTO IS NULL) OR (CTADTO = '')) then
                        MONTO = MONTO * FACTOR;
                    execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                    if (MONTO <> 0) then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        SUMA = SUMA - MONTO;
                        END
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - MONTO;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - MONTO;
                END
            END /* MONTO <> 0 */
        END /* VENTAS DE CLIENTE O CONSTANTE */
    /* EL IVA EN VENTAS */
    if (IVA = 'A') then
        BEGIN
        FOR SELECT MAX(COAR_CTAIVAV), SUM(FADE_IVAMONTO), SUM(CAST(FADE_CANT AS DOUBLE PRECISION) * (FADE_PRUNIT-FADE_DTOMONTO)), sum(FADE_CONSUMO)
            FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_DETALLE FD, FACTURAS F
            WHERE F.FACT_ID = FD.FACT_ID AND FACT_FECHA = :FECFAC AND F.PREF_PRE = :PREF AND F.PTVT_ID = :PTVTA AND FD.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND FACT_ANULADO = 'N' AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
            GROUP BY COAR_CTAIVAV
            INTO :CTAIVA, :IMPTOS, :MONTO, :VALORADIC
        DO
            BEGIN
            if (IMPINC = 'S') then
                MONTO = MONTO - IMPTOS - VALORADIC;
            MONTO = MONTO * -1;
            MONTO = MONTO * FACTOR;
            IMPTOS = IMPTOS * FACTOR;
            execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
            execute procedure redondee(MONTO, DIG) returning_values (MONTO);
            if (IMPTOS <> 0) then
                BEGIN
                CUENTA = NULL;
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :CTAIVA INTO :CUENTA, :TIPOCUEN;
                if (CUENTA IS NULL) then
                    begin
                    EXECUTE PROCEDURE ERROR (31, 0, :CTAIVA, 2);
                    CUENTA = CTAIVA;
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT FD.ARTI_COD, FADE_IVAMONTO, (CAST(FADE_CANT AS DOUBLE PRECISION) * (FADE_PRUNIT-FADE_DTOMONTO)), TAIV_PORC, FADE_CONSUMO
                        FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_DETALLE FD, FACTURAS F, TARIFA_IVA T
                        WHERE F.FACT_ID = FD.FACT_ID AND FACT_FECHA = :FECFAC AND F.PREF_PRE = :PREF AND F.PTVT_ID = :PTVTA AND FD.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTAIVAV = :CUENTA AND A.TAIV_COD = T.TAIV_COD AND FACT_ANULADO = 'N' AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
                        INTO :ART, :IMPTOS, :MONTO, :PORCIVA, :VALORADIC
                    DO
                        BEGIN
                        if (IMPINC = 'S') then
                            MONTO = MONTO - IMPTOS - VALORADIC;
                        MONTO = MONTO * -1;
                        MONTO = MONTO * FACTOR;
                        IMPTOS = IMPTOS * FACTOR;
                        execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                        if (IMPTOS <> 0) then
                            BEGIN
                            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, :MONTO, :PORCIVA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                            NROI = NROI + 1;
                            SUMA = SUMA + DEBITO - CREDITO;
                            END
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, :MONTO, ABS(:IMPTOS*100/:MONTO), :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    NROI = NROI + 1;
                    SUMA = SUMA - IMPTOS;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, :MONTO, ABS(:IMPTOS*100/:MONTO), :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA - IMPTOS;
                    END
                END   /* IMPTOS <> 0 */
            END /* FOR */
        END /* IVA X ARTICULO */
    if (IVA = 'K') then /* IVA EN CTA CONSTANTE */
        BEGIN
        SELECT SUM(FADE_IVAMONTO), SUM(CAST(FADE_CANT AS DOUBLE PRECISION) * (FADE_PRUNIT-FADE_DTOMONTO)), SUM(FADE_CONSUMO)
            FROM FACTURAS_DETALLE FD, FACTURAS F
            WHERE F.FACT_ID = FD.FACT_ID AND FACT_FECHA = :FECFAC AND F.PREF_PRE = :PREF AND F.PTVT_ID = :PTVTA AND FACT_ANULADO = 'N' AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
            INTO :IMPTOS, :MONTO, :valoradic;
        if (IMPINC = 'S') then
            MONTO = MONTO - IMPTOS - VALORADIC;
        MONTO = MONTO * -1;
        MONTO = MONTO * FACTOR;
        IMPTOS = IMPTOS * FACTOR;
        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
        execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
        if (IMPTOS <> 0) then
            BEGIN
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTAIVA INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERROR (31, 0, :CTAIVA, 2);
                CUENTA = CTAIVA;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT FD.ARTI_COD, (CAST(FADE_CANT AS DOUBLE PRECISION) * (FADE_PRUNIT-FADE_DTOMONTO)), FADE_IVAMONTO, TAIV_PORC, FADE_CONSUMO
                    FROM ARTICULO A, FACTURAS_DETALLE FD, FACTURAS F, TARIFA_IVA T
                    WHERE F.FACT_ID = FD.FACT_ID AND FACT_FECHA = :FECFAC AND F.PREF_PRE = :PREF AND F.PTVT_ID = :PTVTA AND FD.arti_cod = A.arti_cod AND T.TAIV_COD=A.TAIV_COD AND FACT_ANULADO = 'N' AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
                    INTO :ART, :MONTO, :IMPTOS, :PORCIVA, :VALORADIC
                    DO
                    BEGIN
                    if (IMPINC = 'S') then
                        MONTO = MONTO - IMPTOS - VALORADIC;
                    MONTO = MONTO * -1;
                    MONTO = MONTO * FACTOR;
                    IMPTOS = IMPTOS * FACTOR;
                    execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                    execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                    if (IMPTOS <> 0) then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', 0, :IMPTOS, :MONTO, :PORCIVA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        SUMA = SUMA - IMPTOS;
                        END
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', 0, :IMPTOS, :MONTO, ABS(:IMPTOS*100/:MONTO), :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - IMPTOS;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', 0, :IMPTOS, :MONTO, ABS(:IMPTOS*100/:MONTO), :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - IMPTOS;
                END
            END /* IMPTOS <> 0 */
        END /* IVA EN CTA CONSTANTE */
    /* EL IMPOCONSUMO */
    if (CONSUMO = 'A') then
        BEGIN
        FOR SELECT MAX(COAR_CTACONS), SUM(FADE_CONSUMO)
            FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_DETALLE FD, FACTURAS F
            WHERE F.FACT_ID = FD.FACT_ID AND FACT_FECHA = :FECFAC AND F.PREF_PRE = :PREF AND F.PTVT_ID = :PTVTA AND FD.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND FACT_ANULADO = 'N' AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
            GROUP BY COAR_CTACONS
            INTO :CTACONSUMO, :IMPTOS
        DO
            BEGIN
            execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
            if (IMPTOS <> 0) then
                BEGIN
                CUENTA = NULL;
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :CTACONSUMO INTO :CUENTA, :TIPOCUEN;
                if (CUENTA IS NULL) then
                    begin
                    EXECUTE PROCEDURE ERROR (31, 0, :CTACONSUMO, 2);
                    CUENTA = CTACONSUMO;
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, REGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT FD.ARTI_COD, FADE_CONSUMO
                        FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_DETALLE FD, FACTURAS F
                        WHERE F.FACT_ID = FD.FACT_ID AND FACT_FECHA = :FECFAC AND F.PREF_PRE = :PREF AND F.PTVT_ID = :PTVTA AND FD.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTACONS = :CUENTA AND FACT_ANULADO = 'N' AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
                        INTO :ART, :IMPTOS
                    DO
                        BEGIN
                        execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                        if (IMPTOS <> 0) then
                            BEGIN
                            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                            NROI = NROI + 1;
                            SUMA = SUMA - IMPTOS;
                            END
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    NROI = NROI + 1;
                    SUMA = SUMA - IMPTOS;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA - CREDITO;
                    END
                END /* IMPTOS <> 0 */
            END /* FOR */
        END /* CONSUMO X ARTICULO */
    if (CONSUMO = 'K') then /* CONSUMO EN CTA CONSTANTE */
        BEGIN
        SELECT SUM(FADE_CONSUMO)
            FROM FACTURAS_DETALLE FD, FACTURAS F
            WHERE F.FACT_ID = FD.FACT_ID AND FACT_FECHA = :FECFAC AND F.PREF_PRE = :PREF AND F.PTVT_ID = :PTVTA AND FACT_ANULADO = 'N' AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
            INTO :IMPTOS;
        execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
        if (IMPTOS <> 0) then
            BEGIN
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTACONSUMO INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERROR (31, 0, :CTACONSUMO, 2);
                CUENTA = CTACONSUMO;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT FD.ARTI_COD, FADE_CONSUMO
                    FROM /*ARTICULO A,*/ FACTURAS_DETALLE FD, FACTURAS F
                    WHERE F.FACT_ID = FD.FACT_ID AND FACT_FECHA = :FECFAC AND F.PREF_PRE = :PREF AND F.PTVT_ID = :PTVTA AND FACT_ANULADO = 'N' AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
                    INTO :ART, :IMPTOS
                    DO
                    BEGIN
                    execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                    if (IMPTOS <> 0) then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CTACONSUMO, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        SUMA = SUMA - IMPTOS;
                        END
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTACONSUMO, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - IMPTOS;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTACONSUMO, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - IMPTOS;
                END
            END /* IMPTOS <> 0 */
        END /* CONSUMO EN CTA CONSTANTE */
    /* DESCUENTO */
    if ((CTADTO IS NOT NULL) AND (CTADTO <> '')) then
        BEGIN
        execute procedure redondee(VRDTO, DIG) returning_values (VRDTO);
        if (VRDTO <> 0) then
            BEGIN
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTADTO INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERROR (31, 0, :CTADTO, 2);
                CUENTA = CTADTO;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                begin
                EXECUTE PROCEDURE ERROR (31, 0, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRDTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA + VRDTO;
                END
            if (TIPOCUEN = 'N') then
                    BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRDTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA + VRDTO;
                END
            END
        END /* DESCUENTO */
    /* VALOR ADIC */
    if ((CTAADIC IS NOT NULL) AND (CTAADIC <> '')) then
        BEGIN
        execute procedure redondee(VRADIC, DIG) returning_values (VRADIC);
        if (VRADIC <> 0) THEN
            BEGIN
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTAADIC INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERROR (31, 0, :CTAADIC, 2);
                CUENTA = CTAADIC;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                begin
                EXECUTE PROCEDURE ERROR (31, 0, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRADIC, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - VRADIC;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRADIC, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - VRADIC;
                END
            END
        END /* VR. ADIC */
    /* VALOR EXTRA */
    if ((CTAEXTRA IS NOT NULL) AND (CTAEXTRA <> '')) THEN
        BEGIN
        execute procedure redondee(VREXTRA, DIG) returning_values (VREXTRA);
        if (VREXTRA <> 0) THEN
            BEGIN
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTAEXTRA INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERROR (31, 0, :CTAEXTRA, 2);
                CUENTA = CTAEXTRA;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                begin
                EXECUTE PROCEDURE ERROR (31, 0, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VREXTRA, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - VREXTRA;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VREXTRA, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - VREXTRA;
                END
            END
        END /* VR. EXTRA */
    /* RETENCION FUENTE */
    if ((RTFTE = 'C') or (RTFTE = 'K')) then
      BEGIN
      execute procedure redondee(VRRTFTE, DIG) returning_values (VRRTFTE);
      if (VRRTFTE <> 0) then
        BEGIN
        if (RTFTE = 'C') then
            CTARTFTE = TCTARTFTE;
        CUENTA = NULL;
        SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
            WHERE CUEN_COD = :CTARTFTE INTO :CUENTA, :TIPOCUEN;
        if (CUENTA IS NULL) then
            begin
            EXECUTE PROCEDURE ERROR (31, 0, :CTARTFTE, 2);
            CUENTA = CTARTFTE;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            begin
            EXECUTE PROCEDURE ERROR (31, 0, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :VRSUBT, :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTFTE;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :VRSUBT, :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTFTE;
            END
        END /* RTFTE */
      END
    /* RETENCION IVA */
    if ((RTIVA = 'C') or (RTIVA = 'K')) then
      BEGIN
      execute procedure redondee(VRRTIVA, DIG) returning_values (VRRTIVA);
      if (VRRTIVA <> 0) then
        BEGIN
        if (RTIVA = 'C') then
            CTARTIVA = TCTARTIVA;
        CUENTA = NULL;
        SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
            WHERE CUEN_COD = :CTARTIVA INTO :CUENTA, :TIPOCUEN;
        if (CUENTA IS NULL) then
            begin
            EXECUTE PROCEDURE ERROR (31, 0, :CTARTIVA, 2);
            CUENTA = CTARTIVA;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            begin
            EXECUTE PROCEDURE ERROR (31, 0, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTIVA, 0, :VRIVA, :PORC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTIVA;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTIVA, 0, :VRIVA, :PORC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTIVA;
            END
        END /* RTIVA */
      END
    /* RETENCION DE ICA */
    if ((RTICA = 'C') or (RTICA = 'K')) then
      BEGIN
      execute procedure redondee(VRRTICA, DIG) returning_values (VRRTICA);
      if (VRRTICA <> 0) then
        BEGIN
        if (RTICA = 'C') then
            CTARTICA = TCTARTICA;
        CUENTA = NULL;
        SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
            WHERE CUEN_COD = :CTARTICA INTO :CUENTA, :TIPOCUEN;
        if (CUENTA IS NULL) then
            begin
            EXECUTE PROCEDURE ERROR (31, 0, :CTARTICA, 2);
            CUENTA = CTARTICA;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            begin
            EXECUTE PROCEDURE ERROR (31, 0, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTICA, 0, :VRSUBT, :PRTICA, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTICA;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTICA, 0, :VRSUBT, :PRTICA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTICA;
            END
        END /* RTICA */
      END
    /* CIERRE EL COMPROBANTE CONTRA LA CUENTA DEL TERCERO O LA CONSTANTE */
    if ((SUMA <> 0) and ((CARTERA = 'C') or (CARTERA = 'K') or (CARTERA = 'J'))) then
        BEGIN
        if (SUMA < 0) then
            BEGIN
            DEBITO = SUMA * -1;
            CREDITO = 0;
            END
        ELSE
            BEGIN
            DEBITO = 0;
            CREDITO = SUMA;
            END
        if (CARTERA = 'C') then
            CTACARTERA = TCTACLIEN;
        if (CARTERA = 'J') then
            BEGIN
            /* BUSQUE LA CUENTA DE LA CAJA */
            SELECT CAJA_CUENTA FROM CAJAS C, PUNTO_VENTA P
                WHERE P.CAJA_ID = C.CAJA_ID AND PTVT_ID = :PTOVTA
                INTO :CTACARTERA;
            END
        CUENTA = NULL;
        SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
            WHERE CUEN_COD = :CTACARTERA INTO :CUENTA, :TIPOCUEN;
        if (CUENTA IS NULL) then
            begin
            EXECUTE PROCEDURE ERROR (31, 0, :CTACARTERA, 2);
            CUENTA = CTACARTERA;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            begin
            EXECUTE PROCEDURE ERROR (31, 0, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'C') then
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :DEBITO, :CREDITO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
        if (TIPOCUEN = 'N') then
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :DEBITO, :CREDITO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
        NROI = NROI + 1;
        END /* SUMA EN CARTERA */
    /* CALCULE LOS COSTOS */
    EXECUTE PROCEDURE costo_en_ventas_contado(:fecfac,  :pref, :ptvta);
    if (COSTOS = 'A') then
        BEGIN
        FOR SELECT MAX(CTACOS), SUM(COSTO)
            FROM COSTO_VENTAS
            GROUP BY CTACOS
            INTO :CTACOSTOS, :MONTO
        DO
            BEGIN
            if (MONTO <> 0) then
                BEGIN
                CUENTA = NULL;
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :CTACOSTOS INTO :CUENTA, :TIPOCUEN;
                IF (CUENTA IS NULL) THEN
                    begin
                    EXECUTE PROCEDURE ERROR (31, 0, :CTACOSTOS, 2);
                    CUENTA = CTARTFTE;
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT ARTI_COD, CANT * COSTO
                        FROM COSTO_VENTAS
                        WHERE CTACOS = :CUENTA
                        INTO :ART, :MONTO
                    DO
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    NROI = NROI + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    END
                END /* MONTO <> 0 */
            END /* FOR */
        END /* COSTOS */
    if (COSTOS = 'K') then
        BEGIN
        SELECT SUM(COSTO)
            FROM COSTO_VENTAS
            INTO :MONTO;
        if (MONTO <> 0) then
            BEGIN
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTACOSTOS INTO :CUENTA, :TIPOCUEN;
            IF (CUENTA IS NULL) THEN
                begin
                EXECUTE PROCEDURE ERROR (31, 0, :CTACOSTOS, 2);
                CUENTA = CTARTFTE;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, REGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT ARTI_COD, CANT * COSTO
                    FROM COSTO_VENTAS
                    INTO :ART, :MONTO
                DO
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTACOSTOS, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                    NROI = NROI + 1;
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTACOSTOS, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTACOSTOS, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                END
            END /* MONTO <> 0 */
        END /* COSTOS = K */
    if (INVEN = 'A') then
        BEGIN
        FOR SELECT MAX(CTAINV), SUM(COSTO)
            FROM COSTO_VENTAS
            GROUP BY CTAINV
            INTO :CTAINVEN, :MONTO
        DO
            BEGIN
            if (MONTO <> 0) then
                BEGIN
                CUENTA = NULL;
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :CTAINVEN INTO :CUENTA, :TIPOCUEN;
                IF (CUENTA IS NULL) THEN
                    begin
                    EXECUTE PROCEDURE ERROR (31, 0, :CTAINVEN, 2);
                    CUENTA = CTAINVEN;
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, REGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT ARTI_COD, CANT * COSTO
                        FROM COSTO_VENTAS
                        WHERE CTAINV = :CUENTA
                        INTO :ART, :MONTO
                    DO
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    NROI = NROI + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    END
                END /* MONTO <> 0 */
            END /* FOR */
        END /* INVEN = A */
    if (INVEN = 'K') then
        BEGIN
        SELECT SUM(COSTO)
            FROM COSTO_VENTAS
            INTO :MONTO;
        if (MONTO <> 0) then
            BEGIN
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTAINVEN INTO :CUENTA, :TIPOCUEN;
            IF (CUENTA IS NULL) THEN
                begin
                EXECUTE PROCEDURE ERROR (31, 0, :CTAINVEN, 2);
                CUENTA = CTAINVEN;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT ARTI_COD, CANT * COSTO
                    FROM COSTO_VENTAS
                    INTO :ART, :MONTO
                DO
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTAINVEN, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                    NROI = NROI + 1;
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAINVEN, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAINVEN, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                END
            END /* MONTO <> 0 */
        END /* INVEN = K */
    /* recorra las cuentas adicionales */
    FOR SELECT INVC_CUENTA, INVC_BASE, INVC_PORC, INVC_VALOR, INVC_DB
        FROM INTERFAZ_VENTAS_CTAS
        WHERE INVE_ID = :IDINTER
        INTO :CTADIC, :BASEADIC, :PORCADIC, :VALORADIC, :DBADIC
        DO
        BEGIN
        if (VALORADIC <> 0) then
            MONTO = VALORADIC;
        ELSE
            BEGIN
            if (:BASEADIC = 'SUBTOTAL') then
                VALORADIC = vrsubt;
            if (:BASEADIC = 'DESCUENTO') then
                VALORADIC = VRDTO;
            if (:BASEADIC = 'IVA') then
                VALORADIC = VRIVA;
            if (:BASEADIC = 'ADICIONAL') then
                VALORADIC = VRADIC;
            if (:BASEADIC = 'EXTRA') then
                VALORADIC = VREXTRA;
            if (:BASEADIC = 'TOTAL') then
                VALORADIC = VRTOTAL;
            MONTO = VALORADIC * PORCADIC / 100;
            END
        if (MONTO <> 0) then
            BEGIN
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTADIC INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERROR (31, 0, :CTADIC, 2);
                CUENTA = CTADIC;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                begin
                EXECUTE PROCEDURE ERROR (31, 0, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'C') then
                BEGIN
                if (DBADIC = 'S') then
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                ELSE
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                if (DBADIC = 'S') then
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                ELSE
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                END
            NROI = NROI + 1;
            END
        END
    if (ERROR > 0) then
        VER = 'S';
    SUSPEND;
    END /* EXISTE LA INTERFAZ */
ELSE
    BEGIN
    EXECUTE PROCEDURE ERROR (31, 0, :PREF, 1);
    ERROR = ERROR + 1;
    VER = 'S';
    SUSPEND;
    END
END

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE EXISTENCIAS_DESDE_HASTA(
    FECHA DATE,
    ARTINI VARCHAR(20),
    ARTFIN VARCHAR(20),
    GRPINI VARCHAR(3),
    GRPFIN VARCHAR(3),
    BODINI VARCHAR(2),
    BODFIN VARCHAR(2),
    ORDEN CHAR(1),
    AGRUPA CHAR(1),
    DETALLE CHAR(1),
    RESERVA CHAR(1),
    ENPESO CHAR(1),
    SUCURSAL INTEGER)
RETURNS (
    CANT NUMERIC(18,4),
    COSTO NUMERIC(18,2),
    COSTO_LOTE NUMERIC(18,2),
    CODIGO VARCHAR(15),
    NOMBRE VARCHAR(60),
    UNIDAD VARCHAR(8),
    STAND VARCHAR(15),
    CODGRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    CODSUBG VARCHAR(3),
    NOMSUBG VARCHAR(30),
    CODMARC VARCHAR(3),
    NOMMARC VARCHAR(30),
    CODBOD VARCHAR(2),
    LOTE VARCHAR(15),
    NOMBOD VARCHAR(30),
    COSTOTOT NUMERIC(18,2),
    ULTCOSTO NUMERIC(18,2),
    FECHACOSTO DATE,
    CONSUMO NUMERIC(18,2),
    RESERVADO NUMERIC(18,4),
    ORDENADO NUMERIC(18,4),
    IVA NUMERIC(9,2),
    PESOUNIT NUMERIC(18,4),
    PESOTOTAL NUMERIC(18,4),
    CODBAR VARCHAR(20))
AS
declare variable exist char(1);
declare variable codini varchar(20);
declare variable codfin varchar(20);
declare variable desini varchar(20);
declare variable desfin varchar(20);
declare variable ordenc numeric(18,4);
declare variable pedido numeric(18,4);
declare variable ok char(1);
declare variable id integer;
declare variable item integer;
declare variable und varchar(8);
declare variable factor numeric(18,4);
declare variable cant2 numeric(18,4);
declare variable PEDAUTO CHAR(2);
BEGIN
if (ORDEN = 'C') then
    BEGIN
    CODINI = ARTINI;
    CODFIN = ARTFIN;
    DESINI = '';
    DESFIN = 'zz';
    END
ELSE
    BEGIN
    DESINI = ARTINI;
    DESFIN = ARTFIN;
    CODINI = '';
    CODFIN = 'zz';
    END
EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION', 'FACTURAS', 'GENERAR PEDIDO AUTOMATICAMENTE CON LA FACTURA') returning_values (pedauto);
if (DETALLE = 'B') then
  BEGIN
  FOR SELECT ARTI_COD, ARTI_DES, ARTI_UNIDAD, ARTI_EXIST, TAIV_PORC, A.GRUP_COD, A.SUBG_COD, A.MARC_COD, BODE_COD, BODE_NOM, ARTI_CONSUMO, ARTI_PESO/1000
      FROM ARTICULO A, BODEGA B, TARIFA_IVA T
      WHERE ARTI_COD >= :CODINI AND ARTI_COD <= :CODFIN AND ARTI_DES >= :DESINI AND ARTI_DES <= :DESFIN AND ESAR_COD <> 'I' AND BODE_COD >= :BODINI AND
      BODE_COD <= :BODFIN AND ((SUCU_ID = :SUCURSAL) or (:SUCURSAL = 0)) AND A.TAIV_COD = T.TAIV_COD
      INTO :CODIGO, :NOMBRE, :UNIDAD, :EXIST, :IVA, :CODGRUPO, :CODSUBG, :CODMARC, :CODBOD, :NOMBOD, :CONSUMO, :pesounit
      DO
        BEGIN
        STAND = '';
        OK = 'N';
        if (AGRUPA = 'G') then
            BEGIN
            if ((CODGRUPO >= GRPINI) AND (CODGRUPO <= GRPFIN)) then
                OK = 'S';
            end
        ELSE
            if (AGRUPA = 'M') then
                BEGIN
                if ((CODMARC >= GRPINI) AND (CODMARC <= GRPFIN)) then
                    OK = 'S';
                END
        if (OK = 'S') then
            BEGIN
            NOMGRUPO = '';
            NOMMARC = '';
            NOMSUBG = '';
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            SELECT MAX(COBA_COD) FROM BARRAS_ARTICULO WHERE ARTI_COD = :codigo AND COBA_UNIDAD = :unidad INTO :codbar;
            if (CODBAR IS NULL) then
                CODBAR = CODIGO;
            if (EXIST <> 'N') then
                BEGIN
                SELECT STAND_COD FROM STANDS WHERE ARTI_COD = :CODIGO AND STAND_BODEGA = :CODBOD INTO :STAND;
                EXECUTE PROCEDURE SALDO_INICIAL_INVENTARIO(CODIGO, FECHA, :CODBOD) returning_values (CANT);
                EXECUTE PROCEDURE costo_promedio_y_ultimo_unidad(CODIGO, FECHA, UNIDAD) returning_values (COSTO, ULTCOSTO);
                SELECT MAX(EXIS_FECHA) FROM EXISTENCIA WHERE ARTI_COD = :CODIGO AND EXIS_ENTR <> 0 AND EXIS_FECHA <= :FECHA INTO :FECHACOSTO;
                COSTOTOT = :CANT * :COSTO;
                CONSUMO = CONSUMO * CANT;
                if (RESERVA = 'S') then
                    BEGIN
                    SELECT SUM(ORID_ENTREGAR)
                        FROM ORDENINVENTARIO_DETALLE OD, ordenes_inventario O
                        WHERE O.ORIN_ID = OD.ORIN_ID AND ARTI_COD = :CODIGO AND ORIN_FECHA <= :FECHA AND ORIN_FECLLEGA >= :FECHA AND ORID_ANULADO = 'N' AND OD.BODE_COD = :CODBOD
                        INTO :ORDENADO;
                    if (ORDENADO IS NULL) then
                        ORDENADO = 0;
                    ORDENC = 0;
                    FOR SELECT O.ORDC_ID, OCDE_ITEM, OCDE_CANT * OCDE_FACTOR
                        FROM ORDENES_COMPRA O, ORDENES_COMPRA_DETALLE OD
                        WHERE O.ORDC_ID = OD.ORDC_ID AND OD.ARTI_COD = :CODIGO AND ORDC_VENCE >= :FECHA AND ORDC_FECHA <= :FECHA AND OCDE_ANULADO = 'N' AND OD.BODE_COD = :CODBOD
                        INTO :ID, :ITEM, :CANT2
                        do
                        BEGIN
                        EXECUTE PROCEDURE FALTANTE(23, 21, ID, ITEM) returning_values (PEDIDO, UND, FACTOR);
                        if (PEDIDO * FACTOR = CANT2) then /* SI NO SE HA FACTURADO MIRE A VER SI SE REMISIONO */
                            EXECUTE PROCEDURE FALTANTE(23, 22, ID, ITEM) returning_values (PEDIDO, UND, FACTOR);
                        if (PEDIDO IS NULL) then
                            PEDIDO = 0;
                        ORDENC = ORDENC + PEDIDO * FACTOR;
                        END
                    ORDENADO = ORDENADO + ORDENC;
                    SELECT SUM(RSDE_LIBERAR)
                        FROM RESERVAS_DETALLE RD, RESERVAS R
                        WHERE R.RESE_ID = RD.RESE_ID AND ARTI_COD = :CODIGO AND RESE_FECHA <= :FECHA AND RESE_VENCE >= :FECHA AND RD.BODE_COD = :CODBOD AND RSDE_ANULADO = 'N'
                        INTO :RESERVADO;
                    if (RESERVADO IS NULL) then
                        RESERVADO = 0;
                    PEDIDO = 0;
                    FOR SELECT P.PEDI_ID, PEDE_ITEM, PEDE_CANT * PEDE_FACTOR
                        FROM PEDIDOS P, PEDIDOS_DETALLE PD
                        WHERE P.PEDI_ID = PD.PEDI_ID AND PD.ARTI_COD = :CODIGO AND PEDI_VENCE >= :FECHA AND PEDI_FECHA <= :FECHA AND PEDE_ANULADO = 'N' AND BODE_COD = :CODBOD
                        INTO :ID, :ITEM, :CANT2
                        do
                        BEGIN
                        EXECUTE PROCEDURE FALTANTE(34, 31, ID, ITEM) returning_values (ORDENC, UND, FACTOR);
                        if ((ORDENC * FACTOR = CANT2) or (PEDAUTO = 'SI')) then /* SI NO SE HA FACTURADO MIRE A VER SI SE REMISIONO */
                            EXECUTE PROCEDURE FALTANTE(34, 32, ID, ITEM) returning_values (ORDENC, UND, FACTOR);
                        if (ORDENC IS NULL) then
                            ORDENC = 0;
                        PEDIDO = PEDIDO + ORDENC * FACTOR;
                        END
                    RESERVADO = RESERVADO + PEDIDO;
                    END
                ELSE
                    BEGIN
                    RESERVADO = 0;
                    ORDENADO = 0;
                    END
                if (ENPESO = 'S') then
                    BEGIN
                    if (pesounit IS NULL) then
                        pesounit = 0;
                    if (PESOUNIT <> 0) then
                        BEGIN
                        pesototal = PESOUNIT * cant;
                        SUSPEND;
                        END
                    END
                ELSE
                    SUSPEND;
                END
            END
        END
  END

if (DETALLE = 'L') then
  BEGIN
  FOR SELECT A.ARTI_COD, ARTI_DES, ARTI_UNIDAD, ARTI_EXIST, TAIV_PORC, A.GRUP_COD, A.SUBG_COD, A.MARC_COD, L.lote_nro, L.lote_nro||' - '||L.lote_vence, ARTI_CONSUMO,l.bode_cod, L.lote_saldo,l.lote_costo, ARTI_PESO/1000
      FROM ARTICULO A, LOTES l, TARIFA_IVA T
      WHERE A.ARTI_COD >= '0' AND A.ARTI_COD <= 'zz' AND ARTI_DES >= '' AND ARTI_DES <= 'zz' AND ESAR_COD <> 'I' AND A.TAIV_COD = T.TAIV_COD and a.arti_cod = l.arti_cod
      INTO :CODIGO, :NOMBRE, :UNIDAD, :EXIST, :IVA, :CODGRUPO, :CODSUBG, :CODMARC, :LOTE, :NOMBOD, :CONSUMO, :codbod, :cant, :costo_lote, :pesounit
      DO
        BEGIN
        OK = 'N';
        if (AGRUPA = 'G') then
            BEGIN
            if ((CODGRUPO >= GRPINI) AND (CODGRUPO <= GRPFIN)) then
                OK = 'S';
            end
        ELSE
            if (AGRUPA = 'M') then
                BEGIN
                if ((CODMARC >= GRPINI) AND (CODMARC <= GRPFIN)) then
                    OK = 'S';
                END
        if (OK = 'S') then
            BEGIN
            NOMGRUPO = '';
            NOMMARC = '';
            NOMSUBG = '';
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            SELECT MAX(COBA_COD) FROM BARRAS_ARTICULO WHERE ARTI_COD = :codigo AND COBA_UNIDAD = :unidad INTO :codbar;
            if (CODBAR IS NULL) then
                CODBAR = CODIGO;

            if (EXIST <> 'N') then
                BEGIN
                EXECUTE PROCEDURE COSTO_PROMEDIO_UNIDAD(CODIGO, FECHA, UNIDAD) returning_values (COSTO);
                EXECUTE PROCEDURE ULTIMO_COSTO(CODIGO, FECHA, UNIDAD) returning_values (ULTCOSTO);
                SELECT MAX(MVAR_FECHA) FROM MOVIMIENTO_ARTICULO WHERE ARTI_COD = :CODIGO AND MVAR_ENTRADA = 'S' AND MVAR_FECHA <= :FECHA INTO :FECHACOSTO;
                COSTOTOT = :CANT * :COSTO;
                CONSUMO = CONSUMO * CANT;
                if (RESERVA = 'S') then
                    BEGIN
                    SELECT SUM(ORID_ENTREGAR)
                        FROM ORDENINVENTARIO_DETALLE OD, ordenes_inventario O
                        WHERE O.ORIN_ID = OD.ORIN_ID AND ARTI_COD = :CODIGO AND ORIN_FECHA <= :FECHA AND ORIN_FECLLEGA >= :FECHA AND ORID_ANULADO = 'N'
                        INTO :ORDENADO;
                    if (ORDENADO IS NULL) then
                        ORDENADO = 0;
                    ORDENC = 0;
                    FOR SELECT O.ORDC_ID, OCDE_ITEM, OCDE_CANT * OCDE_FACTOR
                        FROM ORDENES_COMPRA O, ORDENES_COMPRA_DETALLE OD
                        WHERE O.ORDC_ID = OD.ORDC_ID AND OD.ARTI_COD = :CODIGO AND ORDC_VENCE >= :FECHA AND ORDC_FECHA <= :FECHA AND OCDE_ANULADO = 'N'
                        INTO :ID, :ITEM, :CANT2
                        do
                        BEGIN
                        EXECUTE PROCEDURE FALTANTE(23, 21, ID, ITEM) returning_values (PEDIDO, UND, FACTOR);
                        if (PEDIDO * FACTOR = CANT2) then /* SI NO SE HA FACTURADO MIRE A VER SI SE REMISIONO */
                            EXECUTE PROCEDURE FALTANTE(23, 22, ID, ITEM) returning_values (PEDIDO, UND, FACTOR);
                        if (PEDIDO IS NULL) then
                            PEDIDO = 0;
                        ORDENC = ORDENC + PEDIDO * FACTOR;
                        END
                    ORDENADO = ORDENADO + ORDENC;
                    SELECT SUM(RSDE_LIBERAR)
                        FROM RESERVAS_DETALLE RD, RESERVAS R
                        WHERE R.RESE_ID = RD.RESE_ID AND ARTI_COD = :CODIGO AND RESE_FECHA <= :FECHA AND RESE_VENCE >= :FECHA AND RSDE_ANULADO = 'N'
                        INTO :RESERVADO;
                    if (RESERVADO IS NULL) then
                        RESERVADO = 0;
                    PEDIDO = 0;
                    FOR SELECT P.PEDI_ID, PEDE_ITEM, PEDE_CANT * PEDE_FACTOR
                        FROM PEDIDOS P, PEDIDOS_DETALLE PD
                        WHERE P.PEDI_ID = PD.PEDI_ID AND PD.ARTI_COD = :CODIGO AND PEDI_VENCE >= :FECHA AND PEDI_FECHA <= :FECHA AND PEDE_ANULADO = 'N'
                        INTO :ID, :ITEM, :CANT2
                        do
                        BEGIN
                        EXECUTE PROCEDURE FALTANTE(34, 31, ID, ITEM) returning_values (ORDENC, UND, FACTOR);
                        if ((ORDENC * FACTOR = CANT2) or (PEDAUTO = 'SI')) then /* SI NO SE HA FACTURADO MIRE A VER SI SE REMISIONO */
                            EXECUTE PROCEDURE FALTANTE(34, 32, ID, ITEM) returning_values (ORDENC, UND, FACTOR);
                        if (ORDENC IS NULL) then
                            ORDENC = 0;
                        PEDIDO = PEDIDO + ORDENC * FACTOR;
                        END
                    RESERVADO = RESERVADO + PEDIDO;
                    END
                ELSE
                    BEGIN
                    RESERVADO = 0;
                    ORDENADO = 0;
                    END
                if (ENPESO = 'S') then
                    BEGIN
                    if (pesounit IS NULL) then
                        pesounit = 0;
                    if (PESOUNIT <> 0) then
                        BEGIN
                        pesototal = PESOUNIT * cant;
                        SUSPEND;
                        END
                    END
                ELSE
                    SUSPEND;
                END
            END
        END
  end
if (DETALLE = 'N') then
  BEGIN
  FOR SELECT ARTI_COD, ARTI_DES, ARTI_UNIDAD, ARTI_EXIST, TAIV_PORC, A.GRUP_COD, A.SUBG_COD, A.MARC_COD, ARTI_CONSUMO, ARTI_PESO/1000
      FROM ARTICULO A, TARIFA_IVA T
      WHERE ARTI_COD >= :CODINI AND ARTI_COD <= :CODFIN AND ARTI_DES >= :DESINI AND ARTI_DES <= :DESFIN AND ESAR_COD <> 'I' AND A.TAIV_COD = T.TAIV_COD
      INTO :CODIGO, :NOMBRE, :UNIDAD, :EXIST, :IVA, :CODGRUPO, :CODSUBG, :CODMARC, :CONSUMO, :pesounit
      DO
        BEGIN
        OK = 'N';
        if (AGRUPA = 'G') then
            BEGIN
            if ((GRPINI = '0') AND (GRPFIN = 'zz')) then
                OK = 'S';
            else
                if ((CODGRUPO >= GRPINI) AND (CODGRUPO <= GRPFIN)) then
                    OK = 'S';
            end
        ELSE
            if (AGRUPA = 'M') then
                BEGIN
                if ((GRPINI = '0') AND (GRPFIN = 'zzz')) then
                    OK = 'S';
                else
                    if ((CODMARC >= GRPINI) AND (CODMARC <= GRPFIN)) then
                        OK = 'S';
                END
        if (OK = 'S') then
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            SELECT MAX(COBA_COD) FROM BARRAS_ARTICULO WHERE ARTI_COD = :codigo AND COBA_UNIDAD = :unidad INTO :codbar;
            if (CODBAR IS NULL) then
                CODBAR = CODIGO;

            if (EXIST <> 'N') then
                BEGIN
                EXECUTE PROCEDURE SALDO_INICIAL_TOTAL_INV(CODIGO, FECHA) returning_values (CANT);
                EXECUTE PROCEDURE COSTO_PROMEDIO_UNIDAD(CODIGO, FECHA, UNIDAD) returning_values (COSTO);
                EXECUTE PROCEDURE ULTIMO_COSTO(CODIGO, FECHA, UNIDAD) returning_values (ULTCOSTO);
                SELECT MAX(MVAR_FECHA) FROM MOVIMIENTO_ARTICULO WHERE ARTI_COD = :CODIGO AND MVAR_ENTRADA = 'S' AND MVAR_FECHA <= :FECHA INTO :FECHACOSTO;
                COSTOTOT = :CANT * :COSTO;
                CONSUMO = CONSUMO * CANT;
                if (RESERVA = 'S') then
                    BEGIN
                    SELECT SUM(ORID_ENTREGAR)
                        FROM ORDENINVENTARIO_DETALLE OD, ordenes_inventario O
                        WHERE O.ORIN_ID = OD.ORIN_ID AND ARTI_COD = :CODIGO AND ORIN_FECHA <= :FECHA AND ORIN_FECLLEGA >= :FECHA AND ORID_ANULADO = 'N'
                        INTO :ORDENADO;
                        if (ORDENADO IS NULL) then
                            ORDENADO = 0;
                    ORDENC = 0;
                    FOR SELECT O.ORDC_ID, OCDE_ITEM, OCDE_CANT * OCDE_FACTOR
                        FROM ORDENES_COMPRA O, ORDENES_COMPRA_DETALLE OD
                        WHERE O.ORDC_ID = OD.ORDC_ID AND OD.ARTI_COD = :CODIGO AND ORDC_VENCE >= :FECHA AND ORDC_FECHA <= :FECHA AND OCDE_ANULADO = 'N'
                        INTO :ID, :ITEM, :CANT2
                        do
                        BEGIN
                        EXECUTE PROCEDURE FALTANTE(23, 21, ID, ITEM) returning_values (PEDIDO, UND, FACTOR);
                        if (PEDIDO * FACTOR = CANT2) then /* SI NO SE HA FACTURADO MIRE A VER SI SE REMISIONO */
                            EXECUTE PROCEDURE FALTANTE(23, 22, ID, ITEM) returning_values (PEDIDO, UND, FACTOR);
                        if (PEDIDO IS NULL) then
                            PEDIDO = 0;
                        ORDENC = ORDENC + PEDIDO * FACTOR;
                        END
                    ORDENADO = ORDENADO + ORDENC;
                    SELECT SUM(RSDE_LIBERAR)
                        FROM RESERVAS_DETALLE RD, RESERVAS R
                        WHERE R.RESE_ID = RD.RESE_ID AND ARTI_COD = :CODIGO AND RESE_FECHA <= :FECHA AND RESE_VENCE >= :FECHA AND RSDE_ANULADO = 'N'
                        INTO :RESERVADO;
                    if (RESERVADO IS NULL) then
                        RESERVADO = 0;
                    PEDIDO = 0;
                    FOR SELECT P.PEDI_ID, PEDE_ITEM, PEDE_CANT * PEDE_FACTOR
                        FROM PEDIDOS P, PEDIDOS_DETALLE PD, PUNTO_VENTA PT
                        WHERE P.PEDI_ID = PD.PEDI_ID AND PD.ARTI_COD = :CODIGO AND PT.ptvt_id = P.PTVT_ID AND PEDI_VENCE >= :FECHA AND PEDI_FECHA <= :FECHA AND PEDE_ANULADO = 'N'
                        INTO :ID, :ITEM, :CANT2
                        do
                        BEGIN
                        EXECUTE PROCEDURE FALTANTE(34, 31, ID, ITEM) returning_values (ORDENC, UND, FACTOR);
                        if ((ORDENC * FACTOR = CANT2) or (PEDAUTO = 'SI')) then /* SI NO SE HA FACTURADO MIRE A VER SI SE REMISIONO */
                            EXECUTE PROCEDURE FALTANTE(34, 32, ID, ITEM) returning_values (ORDENC, UND, FACTOR);
                        if (ORDENC IS NULL) then
                            ORDENC = 0;
                        PEDIDO = PEDIDO + ORDENC * FACTOR;
                        END
                    if (PEDIDO IS NULL) then
                        PEDIDO = 0;
                    RESERVADO = RESERVADO + PEDIDO;
                    END
                ELSE
                    BEGIN
                    RESERVADO = 0;
                    ORDENADO = 0;
                    END
                if (ENPESO = 'S') then
                    BEGIN
                    if (pesounit IS NULL) then
                        pesounit = 0;
                    if (PESOUNIT <> 0) then
                        BEGIN
                        pesototal = PESOUNIT * cant;
                        SUSPEND;
                        END
                    END
                ELSE
                    SUSPEND;
                END
            END
        END
  END
END

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE INVENTARIO_FAMILIA(
    FECHA DATE,
    FAMILIA VARCHAR(20))
RETURNS (
    ARTICULO VARCHAR(20),
    INTERNO VARCHAR(20),
    DESCRIPCION VARCHAR(60),
    CANTIDAD NUMERIC(18,2),
    UNIDAD VARCHAR(8),
    TOTAL NUMERIC(18,2))
AS
declare variable COSTO NUMERIC(18,4);
begin
FOR SELECT A.ARTI_COD, ARTI_DES, ARTI_UNIDAD, p.pvar_cod FROM ARTICULO A, PROVEEDOR_ARTICULO P
    WHERE ESAR_COD <> 'I' AND A.arti_cod = P.arti_cod AND P.terc_nit = :FAMILIA
    INTO :ARTICULO, :descripcion, :UNIDAD, :INTERNO
    DO
    BEGIN
    EXECUTE PROCEDURE SALDO_INICIAL_TOTAL_INV(ARTICULO, FECHA) returning_values (cantidad);
    EXECUTE PROCEDURE COSTO_PROMEDIO_UNIDAD(ARTICULO, FECHA, UNIDAD) returning_values (COSTO);
    TOTAL = COSTO * CANTIDAD;
    suspend;
    END
end

^

SET TERM ; ^

SET TERM ^ ;

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

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE DEVOLUCIONES_SIN_CONTABILIDAD(
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    ID INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    ESTADO VARCHAR(20),
    IDI INTEGER,
    IDC INTEGER)
AS
DECLARE VARIABLE VER CHAR(2);
declare variable FECICNT VARCHAR(10);
declare variable FECFCNT VARCHAR(10);
declare variable ERROR INTEGER;
declare variable idref INTEGER;
BEGIN
EXECUTE PROCEDURE fecha_a_conta(FECINI) returning_values (FECICNT);
EXECUTE PROCEDURE fecha_a_conta(FECFIN) returning_values (FECFCNT);
FOR SELECT DEVT_ID, PREF_PRE, DEVT_NUMERO FROM devoluciones_ventas WHERE DEVT_ANULADO = 'N' AND
    DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN
    INTO :ID, :PREF, :NUMERO
DO
  BEGIN
  idref = null;
  SELECT ENCO_IDREF FROM COMPROBANTE_ENCABEZADO WHERE ENCO_TIPOREF = 33 AND ENCO_FECHA >= :FECICNT AND ENCO_FECHA <= :FECFCNT and ENCO_IDREF = :id into :idref;
  if (idref IS NULL) then
  begin
   ESTADO = 'PROCESANDO';
   SUSPEND;
   SELECT MAX(INVE_ID) FROM INTERFAZ_VENTAS WHERE PREF_PRE = :PREF AND TIDO_COD = 33 INTO :IDI;
   EXECUTE PROCEDURE contabil_devolcli (:ID, :IDI) RETURNING_VALUES (:ERROR, :VER, :IDC);
   if (ERROR = 0) then
    BEGIN
    EXECUTE PROCEDURE CONTABILIZA_PENDIENTE (:IDC);
    ESTADO = 'OK';
    END
   ELSE
    ESTADO = 'ERROR';
   suspend;
  End
  END
END

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE FACTURAS_SIN_CONTABILIDAD(
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    ID INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    ESTADO VARCHAR(20),
    IDI INTEGER,
    IDC INTEGER)
AS
DECLARE VARIABLE VER CHAR(2);
declare variable FECICNT VARCHAR(10);
declare variable FECFCNT VARCHAR(10);
declare variable ERROR INTEGER;
declare variable idref INTEGER;
BEGIN
EXECUTE PROCEDURE fecha_a_conta(FECINI) returning_values (FECICNT);
EXECUTE PROCEDURE fecha_a_conta(FECFIN) returning_values (FECFCNT);
FOR SELECT FACT_ID, PREF_PRE, FACT_NUMERO FROM FACTURAS WHERE FACT_ANULADO = 'N' AND
    FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN INTO :ID, :PREF, :NUMERO
DO
  BEGIN
  idref = null;
  SELECT ENCO_IDREF FROM COMPROBANTE_ENCABEZADO WHERE ENCO_TIPOREF = 31 AND ENCO_FECHA >= :FECICNT AND ENCO_FECHA <= :FECFCNT and ENCO_IDREF = :ID into :idref;
  if (idref IS NULL) then
  begin
   ESTADO = 'PROCESANDO';
   ERROR = NULL;
   SUSPEND;
   SELECT MAX(INVE_ID) FROM INTERFAZ_VENTAS WHERE PREF_PRE = :PREF AND TIDO_COD = 31 INTO :IDI;
   EXECUTE PROCEDURE CONTABIL_FACTURA (:ID, :IDI) RETURNING_VALUES (:ERROR, VER, :IDC);
   if ((ERROR = 0) or (error IS NULL)) then
    BEGIN
    EXECUTE PROCEDURE CONTABILIZA_PENDIENTE (:IDC);
    ESTADO = 'OK';
    END
   ELSE
    ESTADO = 'ERROR';
   suspend;
  end
  END
END

^

SET TERM ; ^

SET TERM ^ ;

ALTER TRIGGER AJUSTES_DETALLE_AI
AS
declare variable fec date;
declare variable CONC VARCHAR(60);
declare variable Pref varchar(4);
declare variable Num varchar(6);
declare variable CANTAJ numeric(18,4);
declare variable COSTO NUMERIC(18,2);
declare variable factor numeric(18,4);
declare variable NOAJUSTAR CHAR(1);
BEGIN
  if ((NEW.AJUS_ID <> 0) and (new.ajde_anulado = 'N')) then
    BEGIN
    select AJUS_fecha, AJUS_conc, AJUS_NUMERO, PREF_PRE, AJUS_NOAJUSTAR
        from AJUSTES where AJUS_id = new.AJUS_id into :fec, :conc, :Num, :Pref, :noajustar;
    if (noajustar = 'N') then
        begin
        execute procedure factor_unidad_cant(new.arti_cod, new.ajus_unidad) returning_values(factor);
        CANTAJ = NEW.ajus_exant - (NEW.ajus_exnue * :factor);
        /* CUANDO CAMBIA LA EXISTENCIA REGISTRE EL MOV. */

        if (CANTAJ > 0) then
          BEGIN
          /* ES UNA SALIDA */
          INSERT INTO MOVIMIENTO_ARTICULO
            (ARTI_COD, MVAR_CONS, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM)
            VALUES(NEW.ARTI_COD, GEN_ID(ID_MOVARTI,1), NEW.BODE_COD, :FEC, 14, NEW.AJUS_id,
            :CONC, :cantaj, 0, 'N', NEW.ajus_lote, :Pref, :Num, NEW.ajus_item);
          END
        ELSE
          BEGIN
          /* ES UNA ENTRADA */
          EXECUTE PROCEDURE costo_promedio(NEW.arti_cod, :FEC) returning_values (:COSTO);
          INSERT INTO MOVIMIENTO_ARTICULO
            (ARTI_COD, MVAR_CONS, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM)
            VALUES(NEW.ARTI_COD, GEN_ID(ID_MOVARTI,1), NEW.BODE_COD, :FEC, 14, NEW.AJUS_id,
            :CONC, abs(:cantaj), :COSTO, 'S', NEW.ajus_lote, :Pref, :Num, NEW.ajus_item);
          END
        end
    END
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER TRIGGER AJUSTES_DETALLE_AU
as
declare variable fec date;
declare variable CONC VARCHAR(60);
declare variable cantaj numeric(18,4);
declare variable Pref varchar(4);
declare variable Num varchar(6);
declare variable COSTO NUMERIC(18,2);
declare variable factor numeric(18,4);
declare variable NOAJUSTAR CHAR(1);
BEGIN
if ((old.ajus_id <> 0) and (old.ajde_anulado = 'N')) then
    DELETE FROM MOVIMIENTO_ARTICULO WHERE (mvar_tipodoc = 14) and (mvar_idref = new.ajus_id) and (mvar_item = new.ajus_item);
if ((NEW.AJUS_id <> 0) and (NEW.ajde_anulado = 'N')) then
    begin
    select AJUS_fecha, AJUS_conc, AJUS_NUMERO, PREF_PRE, AJUS_NOAJUSTAR
        from AJUSTES where AJUS_id = new.AJUS_id into :fec, :conc, :Num, :Pref, :NOAJUSTAR;
    if (NOAJUSTAR = 'N') then
        BEGIN
        execute procedure factor_unidad_cant(new.arti_cod, new.ajus_unidad) returning_values(factor);
        CANTAJ = NEW.ajus_exant - (NEW.ajus_exnue * :factor);
        /* CUANDO CAMBIA LA EXISTENCIA REGISTRE EL MOV. */
        if (CANTAJ > 0) then
            BEGIN
            /* ES UNA SALIDA */
            INSERT INTO MOVIMIENTO_ARTICULO
                (ARTI_COD, MVAR_CONS, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM)
                VALUES(NEW.ARTI_COD, GEN_ID(ID_MOVARTI,1), NEW.BODE_COD, :FEC, 14, NEW.AJUS_id,
                :CONC, :cantaj, 0, 'N', NEW.ajus_lote, :Pref, :Num, new.ajus_item);
            END
        ELSE
            BEGIN
            /* ES UNA ENTRADA */
            EXECUTE PROCEDURE costo_promedio(NEW.arti_cod, :FEC) returning_values (:COSTO);
            INSERT INTO MOVIMIENTO_ARTICULO
                (ARTI_COD, MVAR_CONS, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM)
                VALUES(NEW.ARTI_COD, GEN_ID(ID_MOVARTI,1), NEW.BODE_COD, :FEC, 14, NEW.AJUS_id,
                :CONC, abs(:cantaj), :costo, 'S', NEW.ajus_lote, :Pref, :Num, new.ajus_item);
            END
        END
    END
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER TRIGGER AJUSTES_DETALLE_BI
as
declare variable FECHA DATE;
begin
/* COLOQUE EL COSTO PROMEDIO */
SELECT AJUS_FECHA FROM AJUSTES WHERE AJUS_ID = NEW.ajus_id INTO :FECHA;
EXECUTE PROCEDURE costo_promedio(NEW.arti_cod, :FECHA) returning_values (NEW.ajde_costo);
end
^

SET TERM ; ^

SET TERM ^ ;

ALTER TRIGGER DESENSAMBLES_DETALLE_AI
AS
declare variable fec date;
declare variable CONC VARCHAR(60);
declare variable factor numeric(18,4);
declare variable COSTO numeric(18,2);
declare variable Pref varchar(4);
declare variable Num varchar(6);
declare variable CANT NUMERIC(18,2);
declare variable CANTOT CHAR(2);
BEGIN
  if ((NEW.DESE_id <> 0) and (new.dede_anulado = 'N')) then
    begin
    select dese_fecha, dese_conc, pref_pre, dese_numero, dese_cant * dese_factor
        from desensambles where dese_id = new.dese_id into :fec, :conc, :Pref, :Num, :CANT;
    execute procedure factor_unidad_cant(new.arti_cod, new.dede_unidad) returning_values(factor);
    execute procedure costo_promedio(new.arti_cod, :FEC) returning_values (:COSTO);
    EXECUTE PROCEDURE LEE_CONFIGURACION('INVENTARIO', 'ENSAMBLES', 'FORMACIONES CON CANTIDADES TOTALES') returning_values (:CANTOT);
    if (CANTOT <> 'SI') then
        CANT = CANT * factor * new.dede_cant;
    ELSE
        CANT = factor * new.dede_cant;
    INSERT INTO MOVIMIENTO_ARTICULO
      (ARTI_COD, MVAR_CONS, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM)
      VALUES(NEW.ARTI_COD, GEN_ID(ID_MOVARTI,1), NEW.BODE_COD, :FEC, 16, NEW.dese_id,
      :CONC, :CANT, :COSTO, 'S', new.dede_lote, :Pref, :Num, new.dese_item);

    /* RECORRA LAS LISTAS DE PRECIOS Y CAMBIE EL PRECIO */
    EXECUTE PROCEDURE CALCULA_PRECIOS(NEW.ARTI_COD, :fec);
    END
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER TRIGGER DESENSAMBLES_DETALLE_AU
AS
declare variable fec date;
declare variable CONC VARCHAR(60);
declare variable Pref varchar(4);
declare variable Num varchar(6);
declare variable factor numeric(18,4);
declare variable COSTO numeric(18,2);
declare variable CANT NUMERIC(18,2);
declare variable CANTOT CHAR(2);
BEGIN
/* Anule el anterior */
if ((OLD.DESE_ID <> 0) AND (OLD.dede_anulado = 'N')) then
    delete from movimiento_articulo where (mvar_tipodoc = 16) and (mvar_idref = old.DESE_id) and (mvar_item = old.dese_item);
if ((NEW.dese_id <> 0) AND (new.dede_anulado = 'N')) then
    BEGIN
    EXECUTE PROCEDURE LEE_CONFIGURACION('INVENTARIO', 'ENSAMBLES', 'FORMACIONES CON CANTIDADES TOTALES') returning_values (:CANTOT);
    select dese_fecha, dese_conc, pref_pre, dese_numero, dese_cant * dese_factor
        from desensambles where dese_id = new.dese_id into :fec, :conc, :Pref, :Num, :CANT;
    execute procedure factor_unidad_cant(new.arti_cod, new.dede_unidad) returning_values(factor);
    execute procedure costo_promedio(new.arti_cod, :FEC) returning_values (:COSTO);
    if (CANTOT <> 'SI') then
        CANT = CANT * factor * new.dede_cant;
    ELSE
        CANT = factor * new.dede_cant;
    INSERT INTO MOVIMIENTO_ARTICULO
        (ARTI_COD, MVAR_CONS, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM)
        VALUES(NEW.ARTI_COD, GEN_ID(ID_MOVARTI,1), NEW.BODE_COD, :FEC, 16, NEW.dese_id,
        :CONC, :CANT, :COSTO, 'S', new.dede_lote, :Pref, :Num, new.dese_item);

    /* RECORRA LAS LISTAS DE PRECIOS Y CAMBIE EL PRECIO */
    EXECUTE PROCEDURE CALCULA_PRECIOS(NEW.ARTI_COD, :fec);
    END
END
^

SET TERM ; ^

SET TERM ^ ;

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

SET TERM ; ^

SET TERM ^ ;

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

SET TERM ; ^

SET TERM ^ ;

ALTER TRIGGER NOTAS_CREDITO_PROVEEDOR_AI
AS
declare variable COSTO NUMERIC(18,2);
declare variable EXISTENCIA NUMERIC(18,4);
declare variable CODBOD VARCHAR(3);
BEGIN
if ((NEW.NCPR_ID <> 0) and (new.ncpr_anulado = 'N')) then
    BEGIN
    /* Registre el nuevo saldo del documento */
    INSERT INTO SALDOS_DOC_CXPAGAR (SDCP_TIPOREF, SDCP_IDREF, SDCP_FECHA, TERC_NIT, SDCP_RTEFTE, SDCP_RTIVA, SDCP_RTICA, SDCP_ABONO, SDCP_ABRTFTE, SDCP_ABRTIVA, SDCP_ABRTICA, SDCP_DEBITO, SDCP_MONTO, SDCP_TRM)
        VALUES (52, NEW.NCPR_ID, NEW.ncpr_fecha, NEW.terc_nit, (NEW.ncpr_rtftemonto * -1), (NEW.ncpr_rtivamonto * -1), (NEW.ncpr_rticamonto * -1), 0, 0, 0, 0, 'N', (NEW.ncpr_monto+NEW.ncpr_ivamonto)*-1, NEW.ncpr_trm);
    /* Registre el movimiento del proveedor */
    INSERT INTO MOVIMIENTO_PROVEEDOR (MVPR_ID, TERC_NIT, MVPR_TIPOREF, MVPR_IDREF, MVPR_FECHA, MVPR_VENCE, MVPR_CONC, MVPR_MONTO, MVPR_RTFTE, MVPR_RTIVA, MVPR_RTICA, MVPR_DEBITO, MVPR_ABONO, MVPR_PREFIJO, MVPR_NUMERO, MVPR_TRM)
      VALUES (GEN_ID(ID_MOVPROV, 1), NEW.TERC_NIT, 52, NEW.NCPR_ID, NEW.NCPR_FECHA, NEW.NCPR_FECHA, NEW.NCPR_CONC, NEW.NCPR_MONTO+NEW.NCPR_IVAMONTO, NEW.NCPR_RTFTEMONTO, NEW.NCPR_RTIVAMONTO, NEW.NCPR_RTICAMONTO, 'N', 'N', NEW.pref_pre, NEW.ncpr_numero, NEW.ncpr_trm);
    /* afecte el articulo */
    if (new.arti_cod <> '') then
        begin
        /* CALCULE EL NUEVO COSTO */
        execute procedure costo_promedio (new.arti_cod, new.ncpr_fecha) returning_values (:COSTO);
        execute procedure saldo_total_inventario (new.arti_cod, new.ncpr_fecha) returning_values (:EXISTENCIA);
        COSTO = ((COSTO * EXISTENCIA) - NEW.ncpr_monto) / EXISTENCIA;
        FOR SELECT DISTINCT BODE_COD FROM EXISTENCIA WHERE ARTI_COD = NEW.ARTI_COD INTO :CODBOD do
            BEGIN
            execute procedure saldo_inventario (new.arti_cod, :CODBOD, new.ncpr_fecha) returning_values (:EXISTENCIA);
            if (EXISTENCIA <> 0) then
                BEGIN
                /* SAQUE TODO LO QUE TENGA */
                INSERT INTO MOVIMIENTO_ARTICULO
                  (ARTI_COD, MVAR_CONS, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM, TERC_NIT)
                  VALUES(NEW.ARTI_COD, GEN_ID(ID_MOVARTI,1), :CODBOD, new.ncpr_fecha, 52, NEW.ncpr_id,
                  new.ncpr_conc, :EXISTENCIA, 0, 'N', '', new.pref_pre, new.ncpr_numero, 1, new.terc_nit);
                END
            END
        FOR SELECT DISTINCT BODE_COD, MVAR_CANT FROM MOVIMIENTO_ARTICULO WHERE MVAR_TIPODOC = 52 AND MVAR_IDREF = NEW.ncpr_id
            INTO :CODBOD, :existencia do
            BEGIN
            /* META TODO CON EL NUEVO COSTO */
            INSERT INTO MOVIMIENTO_ARTICULO
              (ARTI_COD, MVAR_CONS, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM, TERC_NIT)
              VALUES(NEW.ARTI_COD, GEN_ID(ID_MOVARTI,1), :CODBOD, new.ncpr_fecha, 52, NEW.ncpr_id,
              new.ncpr_conc, :EXISTENCIA, :COSTO, 'S', '', new.pref_pre, new.ncpr_numero, 1, new.terc_nit);
            END
        /* RECORRA LAS LISTAS DE PRECIOS Y CAMBIE EL PRECIO */
        EXECUTE PROCEDURE CALCULA_PRECIOS(NEW.ARTI_COD, new.ncpr_fecha);
        end
    INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
        VALUES (USER, 52, NEW.ncpr_id, 'I', NEW.pref_pre || NEW.ncpr_numero);
    END
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER TRIGGER NOTAS_CREDITO_PROVEEDOR_AU
AS
declare variable ABONOS char(1);
declare variable consec INTEGER;
declare variable COSTO NUMERIC(18,2);
declare variable EXISTENCIA NUMERIC(18,4);
declare variable CODBOD VARCHAR(3);
BEGIN
if (new.ncpr_anulado = 'S') then
    begin
    select enco_consec from comprobante_encabezado where enco_tiporef = 52 and enco_idref = old.ncpr_id into :consec;
    if (NOT consec is null) then
      delete from comprobante_detalle where enco_consec = :consec;
    delete from comprobante_encabezado where enco_tiporef = 52 and enco_idref = old.ncpr_id;
    INSERT INTO AUDITORIA (AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
        VALUES (USER, 52, new.ncpr_id, 'A', NEW.pref_pre || NEW.ncpr_numero);
    end

/* BORRE EL REGISTRO PREVIO */
if ((old.ncpr_id <> 0) and (old.ncpr_anulado = 'N')) then
    begin
    /* Verifique si habia abonos a la nota */
    ABONOS = 'N';
    select 'S' FROM SALDOS_DOC_CXPAGAR WHERE SDCP_TIPOREF = 52 AND SDCP_IDREF = OLD.NCPR_ID AND SDCP_ABONO <> 0 INTO :ABONOS;
    if (ABONOS = 'N') then
        BEGIN
        /* BORRE EL REGISTRO PREVIO */
        delete from saldos_doc_cxpagar where sdcp_tiporef = 52 and sdcp_idref = old.ncpr_id;
        delete from movimiento_PROVEEDOR where (mvpr_tiporef = 52) and (mvpr_idref = old.ncpr_id);
        delete from movimiento_articulo where  (mvar_tipodoc = 52) and (mvar_idref = old.ncpr_id);
        END
    else
        exception DOCUMENTO_CON_ABONOS 'El descuento de proveedor ' || old.pref_pre || old.ncpr_numero || ' tiene abonos registrados.';
    end
if ((new.ncpr_id <> 0) and (new.ncpr_anulado = 'N')) then
    begin
    /* Registre el nuevo saldo del documento */
    INSERT INTO SALDOS_DOC_CXPAGAR (SDCP_TIPOREF, SDCP_IDREF, SDCP_FECHA, TERC_NIT, SDCP_RTEFTE, SDCP_RTIVA, SDCP_RTICA, SDCP_ABONO, SDCP_ABRTFTE, SDCP_ABRTIVA, SDCP_ABRTICA, SDCP_DEBITO, SDCP_MONTO, SDCP_TRM)
        VALUES (52, NEW.NCPR_ID, NEW.ncpr_fecha, NEW.terc_nit, (NEW.ncpr_rtftemonto * -1), (NEW.ncpr_rtivamonto * -1), (NEW.ncpr_rticamonto * -1), 0, 0, 0, 0, 'N', (NEW.ncpr_monto+NEW.ncpr_ivamonto)*-1, NEW.ncpr_trm);
    /* Registre el movimiento del proveedor */
    INSERT INTO MOVIMIENTO_PROVEEDOR (MVPR_ID, TERC_NIT, MVPR_TIPOREF, MVPR_IDREF, MVPR_FECHA, MVPR_VENCE, MVPR_CONC, MVPR_MONTO, MVPR_RTFTE, MVPR_RTIVA, MVPR_RTICA, MVPR_DEBITO, MVPR_ABONO, MVPR_PREFIJO, MVPR_NUMERO, MVPR_TRM)
        VALUES (GEN_ID(ID_MOVPROV, 1), NEW.TERC_NIT, 52, NEW.NCPR_ID, NEW.NCPR_FECHA, NEW.NCPR_FECHA, NEW.NCPR_CONC, NEW.NCPR_MONTO+NEW.ncpr_ivamonto, NEW.NCPR_RTFTEMONTO, NEW.NCPR_RTIVAMONTO, NEW.NCPR_RTICAMONTO, 'N', 'N', NEW.pref_pre, NEW.ncpr_numero, NEW.ncpr_trm);
    /* afecte el articulo */
    if (new.arti_cod <> '') then
        begin
        /* CALCULE EL NUEVO COSTO */
        execute procedure costo_promedio (new.arti_cod, new.ncpr_fecha) returning_values (:COSTO);
        execute procedure saldo_total_inventario (new.arti_cod, new.ncpr_fecha) returning_values (:EXISTENCIA);
        COSTO = ((COSTO * EXISTENCIA) - NEW.ncpr_monto) / EXISTENCIA;
        FOR SELECT DISTINCT BODE_COD FROM EXISTENCIA WHERE ARTI_COD = NEW.ARTI_COD INTO :CODBOD do
            BEGIN
            execute procedure saldo_inventario (new.arti_cod, :CODBOD, new.ncpr_fecha) returning_values (:EXISTENCIA);
            if (EXISTENCIA <> 0) then
                BEGIN
                /* SAQUE TODO LO QUE TENGA */
                INSERT INTO MOVIMIENTO_ARTICULO
                    (ARTI_COD, MVAR_CONS, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM, TERC_NIT)
                    VALUES(NEW.ARTI_COD, GEN_ID(ID_MOVARTI,1), :CODBOD, new.ncpr_fecha, 52, NEW.ncpr_id,
                    new.ncpr_conc, :EXISTENCIA, 0, 'N', '', new.pref_pre, new.ncpr_numero, 1, new.terc_nit);
                end
            END
        FOR SELECT DISTINCT BODE_COD, MVAR_CANT FROM MOVIMIENTO_ARTICULO WHERE MVAR_TIPODOC = 52 AND MVAR_IDREF = NEW.ncpr_id
            INTO :CODBOD, :existencia do
            BEGIN
            /* META TODO CON EL NUEVO COSTO */
            INSERT INTO MOVIMIENTO_ARTICULO
                (ARTI_COD, MVAR_CONS, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM, TERC_NIT)
                VALUES(NEW.ARTI_COD, GEN_ID(ID_MOVARTI,1), :CODBOD, new.ncpr_fecha, 52, NEW.ncpr_id,
                new.ncpr_conc, :EXISTENCIA, :COSTO, 'S', '', new.pref_pre, new.ncpr_numero, 1, new.terc_nit);
            END
        /* RECORRA LAS LISTAS DE PRECIOS Y CAMBIE EL PRECIO */
        EXECUTE PROCEDURE CALCULA_PRECIOS(NEW.ARTI_COD, new.ncpr_fecha);
        end
    INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
        VALUES (USER, 52, NEW.ncpr_id, 'U', NEW.pref_pre || NEW.ncpr_numero);
    end
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER TRIGGER NOTAS_DEBITO_PROVEEDOR_AI
AS
declare variable COSTO NUMERIC(18,2);
declare variable EXISTENCIA NUMERIC(18,4);
declare variable CODBOD VARCHAR(3);
BEGIN
  if ((NEW.NDPR_ID <> 0) and (new.ndpr_anulado = 'N')) then
    BEGIN
    INSERT INTO SALDOS_DOC_CXPAGAR (SDCP_TIPOREF, SDCP_IDREF, SDCP_FECHA, TERC_NIT, SDCP_RTEFTE, SDCP_RTIVA, SDCP_RTICA, SDCP_ABONO, SDCP_ABRTFTE, SDCP_ABRTIVA, SDCP_ABRTICA, SDCP_DEBITO, SDCP_MONTO, SDCP_TRM)
        VALUES (51, NEW.NDPR_ID, NEW.ndpr_fecha, NEW.terc_nit, NEW.ndpr_rtftemonto, NEW.ndpr_rtivamonto, NEW.ndpr_rticamonto, 0, 0, 0, 0, 'S', NEW.ndpr_monto+NEW.ndpr_ivamonto, NEW.ndpr_trm);
    /* Registre el movimiento del proveedor */
    INSERT INTO MOVIMIENTO_PROVEEDOR (MVPR_ID, TERC_NIT, MVPR_TIPOREF, MVPR_IDREF, MVPR_FECHA, MVPR_VENCE, MVPR_CONC, MVPR_MONTO, MVPR_RTFTE, MVPR_RTIVA, MVPR_RTICA, MVPR_DEBITO, MVPR_ABONO, MVPR_PREFIJO, MVPR_NUMERO, MVPR_TRM)
      VALUES (GEN_ID(ID_MOVPROV, 1), NEW.TERC_NIT, 51, NEW.NDPR_ID, NEW.NDPR_FECHA, NEW.NDPR_VENCE, NEW.NDPR_CONC, NEW.NDPR_MONTO+NEW.ndpr_Ivamonto, NEW.NDPR_RTFTEMONTO, NEW.NDPR_RTIVAMONTO, NEW.NDPR_RTICAMONTO, 'S', 'N', NEW.pref_pre, NEW.ndpr_numero, NEW.ndpr_trm);
    /* afecte el articulo */
    if (new.arti_cod <> '') then
        begin
        /* CALCULE EL NUEVO COSTO */
        execute procedure costo_promedio (new.arti_cod, new.ndpr_fecha) returning_values (:COSTO);
        execute procedure saldo_total_inventario (new.arti_cod, new.ndpr_fecha) returning_values (:EXISTENCIA);
        COSTO = (COSTO * EXISTENCIA + (NEW.ndpr_monto)) / EXISTENCIA;
        FOR SELECT DISTINCT BODE_COD FROM EXISTENCIA WHERE ARTI_COD = NEW.ARTI_COD INTO :CODBOD do
            BEGIN
            execute procedure saldo_inventario (new.arti_cod, :CODBOD, new.ndpr_fecha) returning_values (:EXISTENCIA);
            if (existencia <> 0) then
                BEGIN
                /* SAQUE TODO LO QUE TENGA */
                INSERT INTO MOVIMIENTO_ARTICULO
                  (ARTI_COD, MVAR_CONS, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM, TERC_NIT)
                  VALUES(NEW.ARTI_COD, GEN_ID(ID_MOVARTI,1), :CODBOD, new.ndpr_fecha, 51, NEW.ndpr_id,
                  new.ndpr_conc, :EXISTENCIA, 0, 'N', '', new.pref_pre, new.ndpr_numero, 1, new.terc_nit);
                END
            END
        FOR SELECT DISTINCT BODE_COD, MVAR_CANT FROM MOVIMIENTO_ARTICULO WHERE MVAR_TIPODOC = 51 AND MVAR_IDREF = NEW.ndpr_id
            INTO :CODBOD, :existencia do
            BEGIN
            /* META TODO CON EL NUEVO COSTO */
            INSERT INTO MOVIMIENTO_ARTICULO
              (ARTI_COD, MVAR_CONS, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM, TERC_NIT)
              VALUES(NEW.ARTI_COD, GEN_ID(ID_MOVARTI,1), :CODBOD, new.ndpr_fecha, 51, NEW.ndpr_id,
              new.ndpr_conc, :EXISTENCIA, :COSTO, 'S', '', new.pref_pre, new.ndpr_numero, 1, new.terc_nit);
            END
        /* RECORRA LAS LISTAS DE PRECIOS Y CAMBIE EL PRECIO */
        EXECUTE PROCEDURE CALCULA_PRECIOS(NEW.ARTI_COD, new.ndpr_fecha);
        end
    INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
        VALUES (USER, 51, NEW.ndpr_id, 'I', NEW.pref_pre || NEW.ndpr_numero);
    END
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER TRIGGER NOTAS_DEBITO_PROVEEDOR_AU
AS
declare variable ABONOS char(1);
declare variable consec INTEGER;
declare variable COSTO NUMERIC(18,2);
declare variable EXISTENCIA NUMERIC(18,4);
declare variable CODBOD VARCHAR(3);
BEGIN
if (new.ndpr_anulado = 'S') then
    begin
    select enco_consec from comprobante_encabezado where enco_tiporef = 51 and enco_idref = old.ndpr_id into :consec;
    if (NOT consec is null) then
      delete from comprobante_detalle where enco_consec = :consec;
    delete from comprobante_encabezado where enco_tiporef = 51 and enco_idref = old.ndpr_id;
    INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
        VALUES (USER, 51, NEW.ndpr_id, 'A', NEW.pref_pre || NEW.ndpr_numero);
    end

/* BORRE EL REGISTRO PREVIO */
if ((old.ndpr_id <> 0) and (old.ndpr_anulado = 'N')) then
    begin
    /* Verifique si habia abonos a la nota */
    ABONOS = 'N';
    select 'S' FROM SALDOS_DOC_CXPAGAR WHERE SDCP_TIPOREF = 51 AND SDCP_IDREF = OLD.NDPR_ID AND SDCP_ABONO <> 0 INTO :ABONOS;
    if (ABONOS = 'N') then
        BEGIN
        /* BORRE EL REGISTRO PREVIO */
        delete from saldos_doc_cxpagar where sdcp_tiporef = 51 and sdcp_idref = old.ndpr_id;
        delete from movimiento_PROVEEDOR where (mvpr_tiporef = 51) and (mvpr_idref = old.ndpr_id);
        delete from movimiento_articulo where  (mvar_tipodoc = 51) and (mvar_idref = old.ndpr_id);
        END
    else
        exception DOCUMENTO_CON_ABONOS 'El cargo de proveedor ' || old.pref_pre || old.ndpr_numero || ' tiene abonos registrados.';
    end
if ((new.ndpr_id <> 0) and (new.ndpr_anulado = 'N')) then
    begin
    /* Registre el nuevo saldo del documento */
    INSERT INTO SALDOS_DOC_CXPAGAR (SDCP_TIPOREF, SDCP_IDREF, SDCP_FECHA, TERC_NIT, SDCP_RTEFTE, SDCP_RTIVA, SDCP_RTICA, SDCP_ABONO, SDCP_ABRTFTE, SDCP_ABRTIVA, SDCP_ABRTICA, SDCP_DEBITO, SDCP_MONTO, SDCP_TRM)
        VALUES (51, NEW.NDPR_ID, NEW.ndpr_fecha, NEW.terc_nit, NEW.ndpr_rtftemonto, NEW.ndpr_rtivamonto, NEW.ndpr_rticamonto, 0, 0, 0, 0, 'N', NEW.ndpr_monto+NEW.ndpr_ivamonto, NEW.ndpr_trm);
    /* Registre el movimiento del proveedor */
    INSERT INTO MOVIMIENTO_PROVEEDOR (MVPR_ID, TERC_NIT, MVPR_TIPOREF, MVPR_IDREF, MVPR_FECHA, MVPR_VENCE, MVPR_CONC, MVPR_MONTO, MVPR_RTFTE, MVPR_RTIVA, MVPR_RTICA, MVPR_DEBITO, MVPR_ABONO, MVPR_PREFIJO, MVPR_NUMERO, MVPR_TRM)
        VALUES (GEN_ID(ID_MOVPROV, 1), NEW.TERC_NIT, 51, NEW.NDPR_ID, NEW.NDPR_FECHA, NEW.ndpr_vence, NEW.NDPR_CONC, NEW.NDPR_MONTO+NEW.ndpr_ivamonto, NEW.NDPR_RTFTEMONTO, NEW.NDPR_RTIVAMONTO, NEW.NDPR_RTICAMONTO, 'S', 'N', NEW.pref_pre, NEW.ndpr_numero, NEW.ndpr_trm);
    if (new.arti_cod <> '') then
        begin
        /* CALCULE EL NUEVO COSTO */
        execute procedure costo_promedio (new.arti_cod, new.ndpr_fecha) returning_values (:COSTO);
        execute procedure saldo_total_inventario (new.arti_cod, new.ndpr_fecha) returning_values (:EXISTENCIA);
        COSTO = (COSTO * EXISTENCIA + (NEW.ndpr_monto)) / EXISTENCIA;
        FOR SELECT DISTINCT BODE_COD FROM EXISTENCIA WHERE ARTI_COD = NEW.ARTI_COD INTO :CODBOD do
            BEGIN
            execute procedure saldo_inventario (new.arti_cod, :CODBOD, new.ndpr_fecha) returning_values (:EXISTENCIA);
            if (existencia <> 0) then
                BEGIN
                /* SAQUE TODO LO QUE TENGA */
                INSERT INTO MOVIMIENTO_ARTICULO
                  (ARTI_COD, MVAR_CONS, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM, TERC_NIT)
                  VALUES(NEW.ARTI_COD, GEN_ID(ID_MOVARTI,1), :CODBOD, new.ndpr_fecha, 51, NEW.ndpr_id,
                  new.ndpr_conc, :EXISTENCIA, 0, 'N', '', new.pref_pre, new.ndpr_numero, 1, new.terc_nit);
                END
            END
        FOR SELECT DISTINCT BODE_COD, MVAR_CANT FROM MOVIMIENTO_ARTICULO WHERE MVAR_TIPODOC = 51 AND MVAR_IDREF = NEW.ndpr_id
            INTO :CODBOD, :existencia do
            BEGIN
            /* META TODO CON EL NUEVO COSTO */
            INSERT INTO MOVIMIENTO_ARTICULO
              (ARTI_COD, MVAR_CONS, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM, TERC_NIT)
              VALUES(NEW.ARTI_COD, GEN_ID(ID_MOVARTI,1), :CODBOD, new.ndpr_fecha, 51, NEW.ndpr_id,
              new.ndpr_conc, :EXISTENCIA, :COSTO, 'S', '', new.pref_pre, new.ndpr_numero, 1, new.terc_nit);
            END
        /* RECORRA LAS LISTAS DE PRECIOS Y CAMBIE EL PRECIO */
        EXECUTE PROCEDURE CALCULA_PRECIOS(NEW.ARTI_COD, new.ndpr_fecha);
        end
    INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
        VALUES (USER, 51, NEW.ndpr_id, 'U', NEW.pref_pre || NEW.ndpr_numero);
    end
END
^

SET TERM ; ^


/* utilidad con costo promedio diario */
SET TERM ^ ;

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

        FOR SELECT MAX(T.TERC_NIT), MAX(TERC_NOM), MAX(TERC_TEL), MAX(TERC_CIU), MAX(ZONA_COD), MAX(D.ARTI_COD), SUM(FADE_CANT * FADE_FACTOR), SUM(FACT_FACTOR*(FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO)),
            SUM(FACT_FACTOR*FADE_IVAMONTO), SUM(FACT_FACTOR*FADE_TOTAL),
            MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD), max(f.fact_sucursal)
            FROM FACTURAS_DETALLE D, FACTURAS F, PREFIJOS P, terceros T, CLIENTES C, ARTICULO A
            WHERE C.TERC_NIT = T.TERC_NIT AND TERC_CLIE = 'S' AND F.terc_nit = T.terc_nit AND T.TERC_NIT >= :TERINI AND T.TERC_NIT <= :TERFIN AND
            F.FACT_ID = D.FACT_ID AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND FACT_ANULADO = 'N'
            AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) and substring(D.arti_cod from 1 FOR 2) <> '.t'
            AND D.ARTI_COD = A.arti_cod AND A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN
            GROUP BY T.TERC_NIT, f.fact_sucursal, D.ARTI_COD
            INTO :NIT, :NOMBRE, :TELEFONO, :CIUDAD, :CODZONA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :TOTAL,
            :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :sucursal
            DO
            BEGIN
            COSTO = 0;
            FOR SELECT FADE_CANT * FADE_FACTOR, FACT_FECHA FROM FACTURAS_DETALLE D, FACTURAS F, PREFIJOS P
                WHERE F.TERC_NIT = :NIT AND F.FACT_ID = D.FACT_ID AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND
                FACT_ANULADO = 'N' AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                and D.ARTI_COD = :articulo  INTO :cantdet, :fecha
                DO
                BEGIN
                EXECUTE PROCEDURE COSTO_PROMEDIO(:ARTICULO, :FECHA) returning_values (:costounit);
                COSTO = COSTO + costounit * cantdet;
                END
            SELECT ZONA_NOM FROM ZONAS WHERE ZONA_COD = :CODZONA INTO :NOMZONA;
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            if (CEROS = 'S') then
                INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (3, USER, :ARTICULO);
            SUSPEND;
            END /* FOR */
        if (CEROS = 'S') then
            BEGIN
            COSTO = 0;
            UTILIDAD = 0;
            PORC = 0;
            /* agregue los articulos sin factura */
            FOR SELECT ARTI_COD, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN
                INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                DO
                BEGIN
                SELECT COUNT(REPA_ARTICULO) FROM REPORTES_AUX WHERE REPA_ID = 3 AND REPA_USER = USER AND REPA_ARTICULO = :articulo INTO :numrows;
                if (numrows = 0) then
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        END
    if (BIN_AND(TIPO, 2) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 32 INTO :NOMTIPO;
        /* BORRA LA TABLA AUXILIAR */
        DELETE FROM reportes_aux WHERE REPA_ID = 3 AND REPA_USER = USER;

        FOR SELECT MAX(T.TERC_NIT), MAX(TERC_NOM), MAX(TERC_TEL), MAX(TERC_CIU), MAX(ZONA_COD), MAX(D.ARTI_COD), SUM(RVDE_CANT * RVDE_FACTOR), SUM(RVDE_TOTAL-RVDE_IVAMONTO-RVDE_CONSUMO), SUM(RVDE_IVAMONTO), SUM(RVDE_TOTAL),
            MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD), max(r.revt_sucursal)
            FROM REMISIONES_VENTA_DETALLE D, REMISIONES_VENTA R, PREFIJOS P, terceros T, CLIENTES C, ARTICULO A
            WHERE C.TERC_NIT = T.TERC_NIT AND TERC_CLIE = 'S' AND R.terc_nit = T.terc_nit AND T.TERC_NIT >= :TERINI AND T.TERC_NIT <= :TERFIN AND
            R.REVT_ID = D.REVT_ID AND REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN AND REVT_ANULADO = 'N'
            AND P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = 32 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            AND D.ARTI_COD = A.arti_cod AND A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN
            GROUP BY T.TERC_NIT, r.revt_sucursal, D.ARTI_COD
            INTO :NIT, :NOMBRE, :TELEFONO, :CIUDAD, :CODZONA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :TOTAL,
                :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :sucursal
            DO
                BEGIN
                COSTO = 0;
                FOR SELECT RVDE_CANT * RVDE_FACTOR, REVT_FECHA
                    FROM REMISIONES_VENTA_DETALLE D, REMISIONES_VENTA R, PREFIJOS P
                    WHERE R.terc_nit = :nit AND R.REVT_ID = D.REVT_ID AND REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN AND REVT_ANULADO = 'N'
                    AND P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = 32 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                    AND D.ARTI_COD = :articulo INTO :cantdet, :fecha
                    DO
                    BEGIN
                    EXECUTE PROCEDURE COSTO_PROMEDIO(:ARTICULO, :FECHA) returning_values (:costounit);
                    COSTO = COSTO + costounit * cantdet;
                    END
                SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                if (CANTIDAD IS NULL) then
                    CANTIDAD = 0;
                if (BASE IS NULL) then
                    BASE = 0;
                if (IVA IS NULL) then
                    IVA = 0;
                UTILIDAD = BASE - COSTO;
                if (UOM = 'UTILIDAD') then
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                else
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            if (CEROS = 'S') then
                INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (3, USER, :ARTICULO);
            SUSPEND;
            END /* FOR */
        if (CEROS = 'S') then
            BEGIN
            COSTO = 0;
            UTILIDAD = 0;
            PORC = 0;
            /* agregue los articulos sin factura */
            FOR SELECT ARTI_COD, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN
                INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                DO
                BEGIN
                SELECT COUNT(REPA_ARTICULO) FROM REPORTES_AUX WHERE REPA_ID = 3 AND REPA_USER = USER AND REPA_ARTICULO = :articulo INTO :numrows;
                if (numrows = 0) then
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        END
    if (BIN_AND(TIPO, 4) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 33 INTO :NOMTIPO;
        /* BORRA LA TABLA AUXILIAR */
        DELETE FROM reportes_aux WHERE REPA_ID = 3 AND REPA_USER = USER;

        FOR SELECT MAX(T.TERC_NIT), MAX(TERC_NOM), MAX(TERC_TEL), MAX(TERC_CIU), MAX(ZONA_COD), MAX(D.ARTI_COD), SUM(DVDE_CANT * DVDE_FACTOR), SUM(DEVT_FACTOR*(DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO)),
            SUM(DEVT_FACTOR*DVDE_IVAMONTO), SUM(DEVT_FACTOR*DVDE_TOTAL),
            MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD), max(v.devt_sucursal)
            FROM devoluciones_ventas_detalle D, DEVOLUCIONES_VENTAS V, PREFIJOS P, terceros T, CLIENTES C, ARTICULO A
            WHERE C.TERC_NIT = T.TERC_NIT AND TERC_CLIE = 'S' AND V.terc_nit = T.terc_nit AND T.TERC_NIT >= :TERINI AND T.TERC_NIT <= :TERFIN AND
            V.DEVT_ID = D.DEVT_ID AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND DEVT_ANULADO = 'N'
            AND P.PREF_PRE = V.PREF_PRE AND P.TIDO_COD = 33 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) and substring(D.arti_cod from 1 FOR 2) <> '.t'
            AND D.ARTI_COD = A.arti_cod AND A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN
            GROUP BY T.TERC_NIT, v.devt_sucursal, D.ARTI_COD
            INTO :NIT, :NOMBRE, :TELEFONO, :CIUDAD, :CODZONA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :TOTAL,
                :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :sucursal
            DO
            BEGIN
            COSTO = 0;
            FOR SELECT DVDE_CANT * DVDE_FACTOR, DEVT_FECHA
                FROM devoluciones_ventas_detalle D, DEVOLUCIONES_VENTAS V, PREFIJOS P
                WHERE V.terc_nit = :nit AND V.DEVT_ID = D.DEVT_ID AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND DEVT_ANULADO = 'N'
                AND P.PREF_PRE = V.PREF_PRE AND P.TIDO_COD = 33 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                AND D.ARTI_COD = :articulo INTO :cantdet, :fecha
                DO
                BEGIN
                EXECUTE PROCEDURE COSTO_PROMEDIO(:ARTICULO, :FECHA) returning_values (:costounit);
                COSTO = COSTO + costounit * cantdet;
                END
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            TOTAL = TOTAL * -1;
            IVA = IVA * -1;
            BASE = BASE * -1;
            CANTIDAD = CANTIDAD * -1;
            COSTO = COSTO * -1;
            UTILIDAD = UTILIDAD * -1;
            if (CEROS = 'S') then
                INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (3, USER, :ARTICULO);
            SUSPEND;
            END /* FOR */
        if (CEROS = 'S') then
            BEGIN
            COSTO = 0;
            UTILIDAD = 0;
            PORC = 0;
            /* agregue los articulos sin factura */
            FOR SELECT ARTI_COD, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN
                INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                DO
                BEGIN
                SELECT COUNT(REPA_ARTICULO) FROM REPORTES_AUX WHERE REPA_ID = 3 AND REPA_USER = USER AND REPA_ARTICULO = :articulo INTO :numrows;
                if (numrows = 0) then
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        END
    if (BIN_AND(TIPO, 8) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 34 INTO :NOMTIPO;
        /* BORRA LA TABLA AUXILIAR */
        DELETE FROM reportes_aux WHERE REPA_ID = 3 AND REPA_USER = USER;

        FOR SELECT MAX(T.TERC_NIT), MAX(TERC_NOM), MAX(TERC_TEL), MAX(TERC_CIU), MAX(ZONA_COD), MAX(D.ARTI_COD), SUM(PEDE_CANT * PEDE_FACTOR),
            SUM(PEDI_FACTOR*(PEDE_TOTAL-PEDE_IVAMONTO-PEDE_CONSUMO)), SUM(PEDI_FACTOR*PEDE_IVAMONTO), SUM(PEDI_FACTOR*PEDE_TOTAL),
            MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD), max(p.pedi_sucursal)
            FROM PEDIDOS_DETALLE D, PEDIDOS P, PREFIJOS PR, terceros T, CLIENTES C, ARTICULO A
            WHERE C.TERC_NIT = T.TERC_NIT AND TERC_CLIE = 'S' AND P.terc_nit = T.terc_nit AND T.TERC_NIT >= :TERINI AND T.TERC_NIT <= :TERFIN AND
            P.PEDI_ID = D.PEDI_ID AND PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND PEDI_ANULADO = 'N'
            AND PR.PREF_PRE = P.PREF_PRE AND P.TIDO_COD = 34 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY T.TERC_NIT, p.pedi_sucursal, D.ARTI_COD
            INTO :NIT, :NOMBRE, :TELEFONO, :CIUDAD, :CODZONA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :TOTAL,
                :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :sucursal
            DO
            BEGIN
            COSTO = 0;
            FOR SELECT PEDE_CANT * PEDE_FACTOR, PEDI_FECHA
                FROM PEDIDOS_DETALLE D, PEDIDOS PE, PREFIJOS P
                WHERE PE.terc_nit = :nit AND PE.PEDI_ID = D.PEDI_ID AND PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND PEDI_ANULADO = 'N'
                AND P.PREF_PRE = PE.PREF_PRE AND P.TIDO_COD = 34 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                AND D.ARTI_COD = :articulo INTO :cantdet, :fecha
                DO
                BEGIN
                EXECUTE PROCEDURE COSTO_PROMEDIO(:ARTICULO, :FECHA) returning_values (:costounit);
                COSTO = COSTO + costounit * cantdet;
                END
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            if (CEROS = 'S') then
                INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (3, USER, :ARTICULO);
            SUSPEND;
            END /* FOR */
        if (CEROS = 'S') then
            BEGIN
            COSTO = 0;
            UTILIDAD = 0;
            PORC = 0;
            /* agregue los articulos sin factura */
            FOR SELECT ARTI_COD, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN
                INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                DO
                BEGIN
                SELECT COUNT(REPA_ARTICULO) FROM REPORTES_AUX WHERE REPA_ID = 3 AND REPA_USER = USER AND REPA_ARTICULO = :articulo INTO :numrows;
                if (numrows = 0) then
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        END
    if (BIN_AND(TIPO, 16) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 35 INTO :NOMTIPO;
        /* BORRA LA TABLA AUXILIAR */
        DELETE FROM reportes_aux WHERE REPA_ID = 3 AND REPA_USER = USER;

        FOR SELECT MAX(T.TERC_NIT), MAX(TERC_NOM), MAX(TERC_TEL), MAX(TERC_CIU), MAX(ZONA_COD), MAX(D.ARTI_COD), SUM(CTDE_CANT * CTDE_FACTOR),
            SUM(COTI_FACTOR*(CTDE_TOTAL-CTDE_IVAMONTO-CTDE_CONSUMO)), SUM(COTI_FACTOR*CTDE_IVAMONTO), SUM(COTI_FACTOR*CTDE_TOTAL),
            MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD), max(ct.coti_sucursal)
            FROM COTIZACIONES_DETALLE D, COTIZACIONES CT, PREFIJOS P, terceros T, CLIENTES C, ARTICULO A
            WHERE C.TERC_NIT = T.TERC_NIT AND TERC_CLIE = 'S' AND C.terc_nit = T.terc_nit AND T.TERC_NIT >= :TERINI AND T.TERC_NIT <= :TERFIN AND
            CT.COTI_ID = D.COTI_ID AND COTI_FECHA >= :FECINI AND COTI_FECHA <= :FECFIN AND COTI_ANULADO = 'N'
            AND P.PREF_PRE = CT.PREF_PRE AND P.TIDO_COD = 35 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY T.TERC_NIT, ct.coti_sucursal, D.ARTI_COD
            INTO :NIT, :NOMBRE, :TELEFONO, :CIUDAD, :CODZONA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :TOTAL,
                :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :sucursal
            DO
            BEGIN
            COSTO = 0;
            FOR SELECT CTDE_CANT * CTDE_FACTOR, COTI_FECHA
                FROM COTIZACIONES_DETALLE D, COTIZACIONES C, PREFIJOS P
                WHERE C.terc_nit = :nit AND C.COTI_ID = D.coti_id AND COTI_FECHA >= :FECINI AND COTI_FECHA <= :FECFIN AND COTI_ANULADO = 'N'
                AND P.PREF_PRE = C.PREF_PRE AND P.TIDO_COD = 35 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                AND D.ARTI_COD = :articulo INTO :cantdet, :fecha
                DO
                BEGIN
                EXECUTE PROCEDURE COSTO_PROMEDIO(:ARTICULO, :FECHA) returning_values (:costounit);
                COSTO = COSTO + costounit * cantdet;
                END
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            EXECUTE PROCEDURE costo_promedio (:ARTICULO, :FECFIN) RETURNING_VALUES (:COSTOUNIT);
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            if (CEROS = 'S') then
                INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (3, USER, :ARTICULO);
            SUSPEND;
            END /* FOR */
        if (CEROS = 'S') then
            BEGIN
            COSTO = 0;
            UTILIDAD = 0;
            PORC = 0;
            /* agregue los articulos sin factura */
            FOR SELECT ARTI_COD, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN
                INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                DO
                BEGIN
                SELECT COUNT(REPA_ARTICULO) FROM REPORTES_AUX WHERE REPA_ID = 3 AND REPA_USER = USER AND REPA_ARTICULO = :articulo INTO :numrows;
                if (numrows = 0) then
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        END
    END
ELSE
    BEGIN
    if (BIN_AND(TIPO, 1) <> 0) then
            BEGIN
            SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 31 INTO :NOMTIPO;
            FOR SELECT F.PREF_PRE, FACT_NUMERO, FACT_FECHA, ARTI_COD, FADE_CANT * FADE_FACTOR, (FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO)*FACT_FACTOR,
                FADE_IVAMONTO*FACT_FACTOR, FADE_DTOPORC, FADE_TOTAL*FACT_FACTOR, F.terc_nit, F.fact_nomcliente, f.fact_sucursal
                FROM FACTURAS F, FACTURAS_DETALLE D, PREFIJOS P
                WHERE F.FACT_ID = D.FACT_ID AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND F.TERC_NIT >= :TERINI AND F.TERC_NIT <= :TERFIN AND FACT_ANULADO = 'N'
                 AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) and substring(D.arti_cod from 1 FOR 2) <> '.t'
                ORDER BY f.terc_nit, f.fact_sucursal, ARTI_COD, FACT_FECHA, F.FACT_ID, FADE_ITEM
                INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :DTO, :TOTAL, :NIT, :nombre, :sucursal
                DO
                BEGIN
                SELECT ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO WHERE ARTI_COD = :ARTICULO
                    INTO :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC;
                SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                EXECUTE PROCEDURE costo_promedio (:ARTICULO, :FECHA) RETURNING_VALUES (:COSTOUNIT);
                COSTO = COSTOUNIT * CANTIDAD;
                UTILIDAD = BASE - COSTO;
                if (UOM = 'UTILIDAD') then
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                else
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
                SUSPEND;
                END
            END
    if (BIN_AND(TIPO, 2) <> 0) then
            BEGIN
            SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 32 INTO :NOMTIPO;
            FOR SELECT R.PREF_PRE, REVT_NUMERO, REVT_FECHA, ARTI_COD, RVDE_CANT * RVDE_FACTOR,
                (RVDE_TOTAL - RVDE_IVAMONTO), RVDE_IVAMONTO, RVDE_DTOPORC, RVDE_TOTAL, R.terc_nit, R.revt_nomterc, r.revt_sucursal
                FROM REMISIONES_VENTA R, REMISIONES_VENTA_DETALLE D, PREFIJOS P
                WHERE R.REVT_ID = D.REVT_ID AND REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN AND R.TERC_NIT >= :TERINI AND R.TERC_NIT <= :TERFIN AND REVT_ANULADO = 'N'
                 AND P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = 32 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                ORDER BY r.terc_nit, r.revt_sucursal, ARTI_COD, REVT_FECHA, R.REVT_ID, RVDE_ITEM
                INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :DTO, :TOTAL, :NIT, :nombre, :sucursal
                DO
                BEGIN
                SELECT ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO WHERE ARTI_COD = :ARTICULO
                    INTO :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC;
                SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                EXECUTE PROCEDURE costo_promedio (:ARTICULO, :FECHA) RETURNING_VALUES (:COSTOUNIT);
                COSTO = COSTOUNIT * CANTIDAD;
                UTILIDAD = BASE - COSTO;
                if (UOM = 'UTILIDAD') then
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                else
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
                SUSPEND;
                END
            END
    if (BIN_AND(TIPO, 4) <> 0) then
            BEGIN
            SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 33 INTO :NOMTIPO;
            FOR SELECT V.PREF_PRE, DEVT_NUMERO, DEVT_FECHA, ARTI_COD, DVDE_CANT * DVDE_FACTOR, (DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO)*DEVT_FACTOR,
                DVDE_IVAMONTO*DEVT_FACTOR, DVDE_DTOPORC, DVDE_TOTAL*DEVT_FACTOR, V.terc_nit, V.devt_nomterc, v.devt_sucursal
                FROM DEVOLUCIONES_VENTAS V, DEVOLUCIONES_VENTAS_DETALLE D, PREFIJOS P
                WHERE V.DEVT_ID = D.DEVT_ID AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND V.TERC_NIT >= :TERINI AND V.TERC_NIT <= :TERFIN AND DEVT_ANULADO = 'N'
                 AND P.PREF_PRE = V.PREF_PRE AND P.TIDO_COD = 33 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))  and substring(D.arti_cod from 1 FOR 2) <> '.t'
                ORDER BY v.terc_nit, v.devt_sucursal, ARTI_COD, DEVT_FECHA, D.DEVT_ID, DVDE_ITEM
                INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :DTO, :TOTAL, :NIT, :nombre, :sucursal
                DO
                BEGIN
                SELECT ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO WHERE ARTI_COD = :ARTICULO
                    INTO :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC;
                SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                EXECUTE PROCEDURE costo_promedio (:ARTICULO, :FECHA) RETURNING_VALUES (:COSTOUNIT);
                COSTO = COSTOUNIT * CANTIDAD;
                UTILIDAD = BASE - COSTO;
                if (UOM = 'UTILIDAD') then
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                else
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
                TOTAL = TOTAL * -1;
                IVA = IVA * -1;
                BASE = BASE * -1;
                CANTIDAD = CANTIDAD * -1;
                COSTO = COSTO * -1;
                UTILIDAD = UTILIDAD * -1;
                SUSPEND;
                END
            END
    if (BIN_AND(TIPO, 8) <> 0) then
            BEGIN
            SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 34 INTO :NOMTIPO;
            FOR SELECT P.PREF_PRE, PEDI_NUMERO, PEDI_FECHA, ARTI_COD, PEDE_CANT * PEDE_FACTOR, (PEDE_TOTAL-PEDE_IVAMONTO-PEDE_CONSUMO)*PEDI_FACTOR,
                PEDE_IVAMONTO*PEDI_FACTOR, PEDE_DTOPORC, PEDE_TOTAL*PEDI_FACTOR, P.terc_nit, P.pedi_nomterc, p.pedi_sucursal
                FROM PEDIDOS P, PEDIDOS_DETALLE D, PREFIJOS PR
                WHERE P.PEDI_ID = D.PEDI_ID AND PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND P.TERC_NIT >= :TERINI AND P.TERC_NIT <= :TERFIN AND PEDI_ANULADO = 'N'
                 AND P.PREF_PRE = PR.PREF_PRE AND P.TIDO_COD = 34 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                ORDER BY p.terc_nit, p.pedi_sucursal, ARTI_COD, PEDI_FECHA, P.PEDI_ID, PEDE_ITEM
                INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :DTO, :TOTAL, :NIT, :nombre, :sucursal
                DO
                BEGIN
                SELECT ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO WHERE ARTI_COD = :ARTICULO
                    INTO :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC;
                SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                EXECUTE PROCEDURE costo_promedio (:ARTICULO, :FECHA) RETURNING_VALUES (:COSTOUNIT);
                COSTO = COSTOUNIT * CANTIDAD;
                UTILIDAD = BASE - COSTO;
                if (UOM = 'UTILIDAD') then
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                else
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
                SUSPEND;
                END
            END
    if (BIN_AND(TIPO, 16) <> 0) then
            BEGIN
            SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 35 INTO :NOMTIPO;
            FOR SELECT C.PREF_PRE, COTI_NUMERO, COTI_FECHA, ARTI_COD, CTDE_CANT * CTDE_FACTOR, (CTDE_TOTAL-CTDE_IVAMONTO-CTDE_CONSUMO)*COTI_FACTOR,
                CTDE_IVAMONTO*COTI_FACTOR, CTDE_DTOPORC, CTDE_TOTAL*COTI_FACTOR, C.terc_nit, C.coti_nomterc, c.coti_sucursal
                FROM COTIZACIONES C, COTIZACIONES_DETALLE D, PREFIJOS P
                WHERE C.COTI_ID = D.COTI_ID AND ARTI_COD = :ARTICULO AND COTI_FECHA >= :FECINI AND COTI_FECHA <= :FECFIN AND C.TERC_NIT >= :TERINI AND C.TERC_NIT <= :TERFIN AND COTI_ANULADO = 'N'
                 AND P.PREF_PRE = C.PREF_PRE AND P.TIDO_COD = 35 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                ORDER BY c.terc_nit, c.coti_sucursal, COTI_FECHA, C.COTI_ID, CTDE_ITEM
                INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :DTO, :TOTAL, :NIT, :nombre, :sucursal
                DO
                BEGIN
                SELECT ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO WHERE ARTI_COD = :ARTICULO
                    INTO :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC;
                SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                EXECUTE PROCEDURE costo_promedio (:ARTICULO, :FECHA) RETURNING_VALUES (:COSTOUNIT);
                COSTO = COSTOUNIT * CANTIDAD;
                UTILIDAD = BASE - COSTO;
                if (UOM = 'UTILIDAD') then
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                else
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
                SUSPEND;
                END
            END
    END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER PROCEDURE REP_UTILIDAD_VENDEDOR(
    TIPO INTEGER,
    DETALLE CHAR(1),
    VENINI VARCHAR(20),
    VENFIN VARCHAR(20),
    FECINI DATE,
    FECFIN DATE,
    ARTINI VARCHAR(15),
    ARTFIN VARCHAR(15),
    ORDEN CHAR(1),
    CEROS CHAR(1),
    SUBEMPRESA INTEGER)
RETURNS (
    CODVEND VARCHAR(20),
    NOMVEND VARCHAR(60),
    NOMTIPO VARCHAR(50),
    ARTICULO VARCHAR(15),
    DESCRIPCION VARCHAR(60),
    CODGRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    CODSUBG VARCHAR(3),
    NOMSUBG VARCHAR(30),
    CODMARC VARCHAR(3),
    NOMMARC VARCHAR(30),
    UNIDAD VARCHAR(8),
    CANTIDAD NUMERIC(18,4),
    BASE NUMERIC(18,2),
    IVA NUMERIC(18,2),
    CONSUMO NUMERIC(18,2),
    COSTO NUMERIC(18,2),
    UTILIDAD NUMERIC(18,4),
    PORC NUMERIC(9,2),
    TOTAL NUMERIC(18,2),
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    DTO NUMERIC(9,2))
AS
DECLARE VARIABLE COSTOUNIT NUMERIC(18,4);
DECLARE VARIABLE CANTDET NUMERIC(18,4);
DECLARE VARIABLE CODINI VARCHAR(15);
DECLARE VARIABLE CODFIN VARCHAR(15);
DECLARE VARIABLE DESINI VARCHAR(15);
DECLARE VARIABLE DESFIN VARCHAR(15);
declare variable UOM VARCHAR(20);
BEGIN
if (ORDEN = 'C') then
    BEGIN
    CODINI = ARTINI;
    CODFIN = ARTFIN;
    DESINI = '';
    DESFIN = 'zz';
    END
ELSE
    BEGIN
    DESINI = ARTINI;
    DESFIN = ARTFIN;
    CODINI = '';
    CODFIN = 'zz';
    END
  EXECUTE PROCEDURE lee_configuracion ('FACTURACION', 'ARTICULOS', 'SUGERIR PRECIOS CON PORCENTAJE DE MARGEN O UTILIDAD') returning_values (:UOM);
  SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = :TIPO INTO :NOMTIPO;
  FOR select VEND_COD, VEND_NOMBRE
    from VENDEDORES
    where VEND_COD >= :VENINI AND VEND_COD <= :VENFIN
    INTO :CODVEND, :NOMVEND
    DO  
    BEGIN
    if (DETALLE = 'N') then
        BEGIN
        if (BIN_AND(TIPO, 1) <> 0) then
            BEGIN
            SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 31 INTO :NOMTIPO;
            /* BORRA LA TABLA AUXILIAR */
            DELETE FROM reportes_aux WHERE REPA_ID = 4 AND REPA_USER = USER;
            FOR SELECT MAX(D.ARTI_COD), SUM(FADE_CANT * FADE_FACTOR), SUM(FACT_FACTOR*(FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO)),
                SUM(FACT_FACTOR*FADE_IVAMONTO), SUM(FACT_FACTOR*FADE_TOTAL), SUM(FADE_CONSUMO),
                MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD)
                FROM FACTURAS_DETALLE D, FACTURAS F, PREFIJOS P, ARTICULO A
                WHERE F.FACT_ID = D.FACT_ID AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND VEND_COD = :CODVEND AND FACT_ANULADO = 'N'
                 AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) and substring(D.arti_cod from 1 FOR 2) <> '.t'
                 AND D.ARTI_COD = A.arti_cod AND A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN
                GROUP BY D.ARTI_COD
                INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :TOTAL, :CONSUMO,
                    :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                DO
                BEGIN
                COSTO = 0;
                FOR SELECT FADE_CANT * FADE_FACTOR, FACT_FECHA FROM FACTURAS_DETALLE D, FACTURAS F, PREFIJOS P
                    WHERE F.VEND_COD = :codvend AND F.FACT_ID = D.FACT_ID AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND
                    FACT_ANULADO = 'N' AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                    and D.ARTI_COD = :articulo  INTO :cantdet, :fecha
                    DO
                    BEGIN
                    EXECUTE PROCEDURE COSTO_PROMEDIO(:ARTICULO, :FECHA) returning_values (:costounit);
                    COSTO = COSTO + costounit * cantdet;
                    END
                SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                if (CANTIDAD IS NULL) then
                    CANTIDAD = 0;
                if (BASE IS NULL) then
                    BASE = 0;
                if (IVA IS NULL) then
                    IVA = 0;
                UTILIDAD = BASE - COSTO;
                if (UOM = 'UTILIDAD') then
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                else
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
                if (CEROS = 'S') then
                    begin
                    INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (4, USER, :ARTICULO);
                    SUSPEND;
                    end
                ELSE
                    if ((BASE <> 0) AND (CANTIDAD <> 0)) then
                        SUSPEND;
                END
            if (CEROS = 'S') then
                BEGIN
                COSTO = 0;
                UTILIDAD = 0;
                PORC = 0;
                /* agregue los articulos sin factura */
                FOR SELECT ARTI_COD, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN and
                    not exists (select REPA_ARTICULO FROM REPORTES_AUX WHERE REPA_ID = 4 AND REPA_USER = USER AND REPA_ARTICULO = a.arti_cod)
                    INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                    DO
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        if (BIN_AND(TIPO, 2) <> 0) then
            BEGIN
            SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 32 INTO :NOMTIPO;
            FOR SELECT MAX(D.ARTI_COD), SUM(RVDE_CANT * RVDE_FACTOR), SUM(RVDE_TOTAL-RVDE_IVAMONTO-RVDE_CONSUMO), SUM(RVDE_IVAMONTO), SUM(RVDE_TOTAL), SUM(RVDE_CONSUMO),
                MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD)
                FROM REMISIONES_VENTA_DETALLE D, REMISIONES_VENTA R, PREFIJOS P, ARTICULO A
                WHERE R.REVT_ID = D.REVT_ID AND REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN AND VEND_COD = :CODVEND AND REVT_ANULADO = 'N'
                 AND P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = 32 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                 AND D.ARTI_COD = A.arti_cod AND A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN
                GROUP BY D.ARTI_COD
                INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :TOTAL, :CONSUMO,
                    :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                DO
                BEGIN
                COSTO = 0;
                FOR SELECT RVDE_CANT * RVDE_FACTOR, REVT_FECHA FROM remisiones_venta_detalle D, remisiones_venta F, PREFIJOS P
                    WHERE F.VEND_COD = :codvend AND F.revt_id = D.revt_id AND REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN AND
                    REVT_ANULADO = 'N' AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 32 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                    and D.ARTI_COD = :articulo  INTO :cantdet, :fecha
                    DO
                    BEGIN
                    EXECUTE PROCEDURE COSTO_PROMEDIO(:ARTICULO, :FECHA) returning_values (:costounit);
                    COSTO = COSTO + costounit * cantdet;
                    END
                SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                if (CANTIDAD IS NULL) then
                    CANTIDAD = 0;
                if (BASE IS NULL) then
                    BASE = 0;
                if (IVA IS NULL) then
                    IVA = 0;
                UTILIDAD = BASE - COSTO;
                if (UOM = 'UTILIDAD') then
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                else
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
                if (CEROS = 'S') then
                    begin
                    INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (4, USER, :ARTICULO);
                    SUSPEND;
                    end
                ELSE
                    if ((BASE <> 0) AND (CANTIDAD <> 0)) then
                        SUSPEND;
                END
            if (CEROS = 'S') then
                BEGIN
                COSTO = 0;
                UTILIDAD = 0;
                PORC = 0;
                /* agregue los articulos sin factura */
                FOR SELECT ARTI_COD, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN and
                    not exists (select REPA_ARTICULO FROM REPORTES_AUX WHERE REPA_ID = 4 AND REPA_USER = USER AND REPA_ARTICULO = a.arti_cod)
                    INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                    DO
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        if (BIN_AND(TIPO, 4) <> 0) then
            BEGIN
            SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 33 INTO :NOMTIPO;
            FOR SELECT MAX(D.ARTI_COD), SUM(DVDE_CANT * DVDE_FACTOR), SUM(DEVT_FACTOR*(DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO)),
                SUM(DEVT_FACTOR*DVDE_IVAMONTO), SUM(DEVT_FACTOR*DVDE_TOTAL), SUM(DVDE_CONSUMO),
                MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD)
                FROM devoluciones_ventas_detalle D, DEVOLUCIONES_VENTAS V, PREFIJOS P, ARTICULO A
                WHERE V.DEVT_ID = D.DEVT_ID AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND VEND_COD = :CODVEND AND DEVT_ANULADO = 'N'
                 AND P.PREF_PRE = V.PREF_PRE AND P.TIDO_COD = 33 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) and substring(D.arti_cod from 1 FOR 2) <> '.t'
                 AND D.ARTI_COD = A.arti_cod AND A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN
                GROUP BY D.ARTI_COD
                INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :TOTAL, :CONSUMO,
                    :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                DO
                BEGIN
                COSTO = 0;
                FOR SELECT DVDE_CANT * DVDE_FACTOR, DEVT_FECHA FROM devoluciones_ventas_detalle D, devoluciones_ventas F, PREFIJOS P
                    WHERE F.VEND_COD = :codvend AND F.devt_id = D.devt_id AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND
                    DEVT_ANULADO = 'N' AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 33 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                    and D.ARTI_COD = :articulo  INTO :cantdet, :fecha
                    DO
                    BEGIN
                    EXECUTE PROCEDURE COSTO_PROMEDIO(:ARTICULO, :FECHA) returning_values (:costounit);
                    COSTO = COSTO + costounit * cantdet;
                    END
                SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                if (CANTIDAD IS NULL) then
                    CANTIDAD = 0;
                if (BASE IS NULL) then
                    BASE = 0;
                if (IVA IS NULL) then
                    IVA = 0;
                UTILIDAD = BASE - COSTO;
                if (UOM = 'UTILIDAD') then
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                else
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
                TOTAL = TOTAL * -1;
                IVA = IVA * -1;
                BASE = BASE * -1;
                CANTIDAD = CANTIDAD * -1;
                COSTO = COSTO * -1;
                UTILIDAD = UTILIDAD * -1;
                if (CEROS = 'S') then
                    begin
                    INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (4, USER, :ARTICULO);
                    SUSPEND;
                    end
                ELSE
                    if ((BASE <> 0) AND (CANTIDAD <> 0)) then
                        SUSPEND;
                END
            if (CEROS = 'S') then
                BEGIN
                COSTO = 0;
                UTILIDAD = 0;
                PORC = 0;
                /* agregue los articulos sin factura */
                FOR SELECT ARTI_COD, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN and
                    not exists (select REPA_ARTICULO FROM REPORTES_AUX WHERE REPA_ID = 4 AND REPA_USER = USER AND REPA_ARTICULO = a.arti_cod)
                    INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                    DO
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        if (BIN_AND(TIPO, 8) <> 0) then
            BEGIN
            SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 34 INTO :NOMTIPO;
            FOR SELECT MAX(D.ARTI_COD), SUM(PEDE_CANT * PEDE_FACTOR), SUM(PEDI_FACTOR*(PEDE_TOTAL-PEDE_IVAMONTO-PEDE_CONSUMO)),
                SUM(PEDI_FACTOR*PEDE_IVAMONTO), SUM(PEDI_FACTOR*PEDE_TOTAL), SUM(PEDE_CONSUMO),
                MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD)
                FROM PEDIDOS_DETALLE D, PEDIDOS P, PREFIJOS PR, articulo A
                WHERE P.PEDI_ID = D.PEDI_ID AND PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND VEND_COD = :CODVEND AND PEDI_ANULADO = 'N'
                 AND PR.PREF_PRE = P.PREF_PRE AND P.TIDO_COD = 34 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                 AND D.ARTI_COD = A.arti_cod AND A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN
                GROUP BY D.ARTI_COD
                INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :TOTAL, :CONSUMO,
                    :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                DO
                BEGIN
                COSTO = 0;
                FOR SELECT PEDE_CANT * PEDE_FACTOR, PEDI_FECHA FROM pedidos_detalle D, PEDIDOS F, PREFIJOS P
                    WHERE F.VEND_COD = :codvend AND F.pedi_id = D.pedi_id AND PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND
                    PEDI_ANULADO = 'N' AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 34 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                    and D.ARTI_COD = :articulo  INTO :cantdet, :fecha
                    DO
                    BEGIN
                    EXECUTE PROCEDURE COSTO_PROMEDIO(:ARTICULO, :FECHA) returning_values (:costounit);
                    COSTO = COSTO + costounit * cantdet;
                    END
                SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                if (CANTIDAD IS NULL) then
                    CANTIDAD = 0;
                if (BASE IS NULL) then
                    BASE = 0;
                if (IVA IS NULL) then
                    IVA = 0;
                UTILIDAD = BASE - COSTO;
                if (UOM = 'UTILIDAD') then
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                else
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
                if (CEROS = 'S') then
                    begin
                    INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (4, USER, :ARTICULO);
                    SUSPEND;
                    end
                ELSE
                    if ((BASE <> 0) AND (CANTIDAD <> 0)) then
                        SUSPEND;
                END
            if (CEROS = 'S') then
                BEGIN
                COSTO = 0;
                UTILIDAD = 0;
                PORC = 0;
                /* agregue los articulos sin factura */
                FOR SELECT ARTI_COD, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN and
                    not exists (select REPA_ARTICULO FROM REPORTES_AUX WHERE REPA_ID = 4 AND REPA_USER = USER AND REPA_ARTICULO = a.arti_cod)
                    INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                    DO
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        if (BIN_AND(TIPO, 16) <> 0) then
            BEGIN
            SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 35 INTO :NOMTIPO;
            FOR SELECT MAX(D.ARTI_COD), SUM(CTDE_CANT * CTDE_FACTOR), SUM(COTI_FACTOR*(CTDE_TOTAL-CTDE_IVAMONTO-CTDE_CONSUMO)),
                SUM(COTI_FACTOR*CTDE_IVAMONTO), SUM(COTI_FACTOR*CTDE_TOTAL), SUM(CTDE_CONSUMO),
                MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD)
                FROM COTIZACIONES_DETALLE D, COTIZACIONES C, PREFIJOS P, ARTICULO A
                WHERE C.COTI_ID = D.COTI_ID AND COTI_FECHA >= :FECINI AND COTI_FECHA <= :FECFIN AND VEND_COD = :CODVEND AND COTI_ANULADO = 'N'
                 AND P.PREF_PRE = C.PREF_PRE AND P.TIDO_COD = 35 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                 AND D.ARTI_COD = A.arti_cod AND A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN
                GROUP BY D.ARTI_COD
                INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :TOTAL, :CONSUMO,
                    :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                DO
                BEGIN
                COSTO = 0;
                FOR SELECT PEDE_CANT * PEDE_FACTOR, PEDI_FECHA FROM pedidos_detalle D, PEDIDOS F, PREFIJOS P
                    WHERE F.VEND_COD = :codvend AND F.pedi_id = D.pedi_id AND PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND
                    PEDI_ANULADO = 'N' AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 34 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                    and D.ARTI_COD = :articulo  INTO :cantdet, :fecha
                    DO
                    BEGIN
                    EXECUTE PROCEDURE COSTO_PROMEDIO(:ARTICULO, :FECHA) returning_values (:costounit);
                    COSTO = COSTO + costounit * cantdet;
                    END
                SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                if (CANTIDAD IS NULL) then
                    CANTIDAD = 0;
                if (BASE IS NULL) then
                    BASE = 0;
                if (IVA IS NULL) then
                    IVA = 0;
                COSTO = CANTIDAD * COSTOUNIT;
                UTILIDAD = BASE - COSTO;
                if (UOM = 'UTILIDAD') then
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                else
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
                if (CEROS = 'S') then
                    begin
                    INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (4, USER, :ARTICULO);
                    SUSPEND;
                    end
                ELSE
                    if ((BASE <> 0) AND (CANTIDAD <> 0)) then
                        SUSPEND;
                END
            if (CEROS = 'S') then
                BEGIN
                COSTO = 0;
                UTILIDAD = 0;
                PORC = 0;
                /* agregue los articulos sin factura */
                FOR SELECT ARTI_COD, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN and
                    not exists (select REPA_ARTICULO FROM REPORTES_AUX WHERE REPA_ID = 4 AND REPA_USER = USER AND REPA_ARTICULO = a.arti_cod)
                    INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                    DO
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        END
    ELSE
        BEGIN
        if (BIN_AND(TIPO, 1) <> 0) then
            BEGIN
            SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 31 INTO :NOMTIPO;
            FOR SELECT F.PREF_PRE, FACT_NUMERO, FACT_FECHA, ARTI_COD, FADE_CANT * FADE_FACTOR, (FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO)*FACT_FACTOR,
                FADE_IVAMONTO*FACT_FACTOR, FADE_DTOPORC, FADE_TOTAL*FACT_FACTOR, FADE_CONSUMO
                FROM FACTURAS F, FACTURAS_DETALLE D, PREFIJOS P
                WHERE F.FACT_ID = D.FACT_ID AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND VEND_COD = :CODVEND AND FACT_ANULADO = 'N'
                 AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) and substring(D.arti_cod from 1 FOR 2) <> '.t'
                ORDER BY ARTI_COD, FACT_FECHA, F.FACT_ID, FADE_ITEM
                INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :DTO, :TOTAL, :CONSUMO
                DO
                BEGIN
                SELECT ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO WHERE ARTI_COD = :ARTICULO
                    INTO :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC;
                SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                EXECUTE PROCEDURE costo_promedio (:ARTICULO, :FECHA) RETURNING_VALUES (:COSTOUNIT);
                COSTO = COSTOUNIT * CANTIDAD;
                UTILIDAD = BASE - COSTO;
                if (UOM = 'UTILIDAD') then
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                else
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
                if (CEROS = 'S') then
                    INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (4, USER, :ARTICULO);
                SUSPEND;
                END
            if (CEROS = 'S') then
                BEGIN
                COSTO = 0;
                UTILIDAD = 0;
                PORC = 0;
                /* agregue los articulos sin factura */
                FOR SELECT ARTI_COD, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN and
                    not exists (select REPA_ARTICULO FROM REPORTES_AUX WHERE REPA_ID = 4 AND REPA_USER = USER AND REPA_ARTICULO = a.arti_cod)
                    INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                    DO
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        if (BIN_AND(TIPO, 2) <> 0) then
            BEGIN
            SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 32 INTO :NOMTIPO;
            FOR SELECT R.PREF_PRE, REVT_NUMERO, REVT_FECHA, ARTI_COD, RVDE_CANT * RVDE_FACTOR, (RVDE_TOTAL - RVDE_IVAMONTO), RVDE_IVAMONTO, RVDE_DTOPORC, RVDE_TOTAL, RVDE_CONSUMO
                FROM REMISIONES_VENTA R, REMISIONES_VENTA_DETALLE D, PREFIJOS P
                WHERE R.REVT_ID = D.REVT_ID AND REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN AND VEND_COD = :CODVEND AND REVT_ANULADO = 'N'
                 AND P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = 32 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) and substring(D.arti_cod from 1 FOR 2) <> '.t'
                ORDER BY ARTI_COD, REVT_FECHA, R.REVT_ID, RVDE_ITEM
                INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :DTO, :TOTAL, :CONSUMO
                DO
                BEGIN
                SELECT ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO WHERE ARTI_COD = :ARTICULO
                    INTO :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC;
                SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                EXECUTE PROCEDURE costo_promedio (:ARTICULO, :FECHA) RETURNING_VALUES (:COSTOUNIT);
                COSTO = COSTOUNIT * CANTIDAD;
                UTILIDAD = BASE - COSTO;
                if (UOM = 'UTILIDAD') then
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                else
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
                if (CEROS = 'S') then
                    INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (4, USER, :ARTICULO);
                SUSPEND;
                END
            if (CEROS = 'S') then
                BEGIN
                COSTO = 0;
                UTILIDAD = 0;
                PORC = 0;
                /* agregue los articulos sin factura */
                FOR SELECT ARTI_COD, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN and
                    not exists (select REPA_ARTICULO FROM REPORTES_AUX WHERE REPA_ID = 4 AND REPA_USER = USER AND REPA_ARTICULO = a.arti_cod)
                    INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                    DO
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        if (BIN_AND(TIPO, 4) <> 0) then
            BEGIN
            SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 33 INTO :NOMTIPO;
            FOR SELECT V.PREF_PRE, DEVT_NUMERO, DEVT_FECHA, ARTI_COD, DVDE_CANT * DVDE_FACTOR, (DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO)*DEVT_FACTOR,
                DVDE_IVAMONTO*DEVT_FACTOR, DVDE_DTOPORC, DVDE_TOTAL*DEVT_FACTOR, DVDE_CONSUMO
                FROM DEVOLUCIONES_VENTAS V, DEVOLUCIONES_VENTAS_DETALLE D, PREFIJOS P
                WHERE V.DEVT_ID = D.DEVT_ID AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND VEND_COD = :CODVEND AND DEVT_ANULADO = 'N'
                 AND P.PREF_PRE = V.PREF_PRE AND P.TIDO_COD = 33 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) and substring(D.arti_cod from 1 FOR 2) <> '.t'
                ORDER BY ARTI_COD, DEVT_FECHA, D.DEVT_ID, DVDE_ITEM
                INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :DTO, :TOTAL, :CONSUMO
                DO
                BEGIN
                SELECT ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO WHERE ARTI_COD = :ARTICULO
                    INTO :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC;
                SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                EXECUTE PROCEDURE costo_promedio (:ARTICULO, :FECHA) RETURNING_VALUES (:COSTOUNIT);
                COSTO = COSTOUNIT * CANTIDAD;
                UTILIDAD = BASE - COSTO;
                if (UOM = 'UTILIDAD') then
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                else
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
                TOTAL = TOTAL * -1;
                IVA = IVA * -1;
                BASE = BASE * -1;
                CANTIDAD = CANTIDAD * -1;
                COSTO = COSTO * -1;
                UTILIDAD = UTILIDAD * -1;
                if (CEROS = 'S') then
                    INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (4, USER, :ARTICULO);
                SUSPEND;
                END
            if (CEROS = 'S') then
                BEGIN
                COSTO = 0;
                UTILIDAD = 0;
                PORC = 0;
                /* agregue los articulos sin factura */
                FOR SELECT ARTI_COD, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN and
                    not exists (select REPA_ARTICULO FROM REPORTES_AUX WHERE REPA_ID = 4 AND REPA_USER = USER AND REPA_ARTICULO = a.arti_cod)
                    INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                    DO
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        if (BIN_AND(TIPO, 8) <> 0) then
            BEGIN
            SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 34 INTO :NOMTIPO;
            FOR SELECT P.PREF_PRE, PEDI_NUMERO, PEDI_FECHA, ARTI_COD, PEDE_CANT * PEDE_FACTOR, (PEDE_TOTAL-PEDE_IVAMONTO-PEDE_CONSUMO)*PEDI_FACTOR,
                PEDE_IVAMONTO*PEDI_FACTOR, PEDE_DTOPORC, PEDE_TOTAL*PEDI_FACTOR, PEDE_CONSUMO
                FROM PEDIDOS P, PEDIDOS_DETALLE D, PREFIJOS PR
                WHERE P.PEDI_ID = D.PEDI_ID AND PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND VEND_COD = :CODVEND AND PEDI_ANULADO = 'N'
                 AND P.PREF_PRE = PR.PREF_PRE AND P.TIDO_COD = 34 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                ORDER BY ARTI_COD, PEDI_FECHA, P.PEDI_ID, PEDE_ITEM
                INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :DTO, :TOTAL, :CONSUMO
                DO
                BEGIN
                SELECT ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO WHERE ARTI_COD = :ARTICULO
                    INTO :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC;
                SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                EXECUTE PROCEDURE costo_promedio (:ARTICULO, :FECHA) RETURNING_VALUES (:COSTOUNIT);
                COSTO = COSTOUNIT * CANTIDAD;
                UTILIDAD = BASE - COSTO;
                if (UOM = 'UTILIDAD') then
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                else
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
                if (CEROS = 'S') then
                    INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (4, USER, :ARTICULO);
                SUSPEND;
                END
            if (CEROS = 'S') then
                BEGIN
                COSTO = 0;
                UTILIDAD = 0;
                PORC = 0;
                /* agregue los articulos sin factura */
                FOR SELECT ARTI_COD, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN and
                    not exists (select REPA_ARTICULO FROM REPORTES_AUX WHERE REPA_ID = 4 AND REPA_USER = USER AND REPA_ARTICULO = a.arti_cod)
                    INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                    DO
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        if (BIN_AND(TIPO, 16) <> 0) then
            BEGIN
            SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 35 INTO :NOMTIPO;
            FOR SELECT C.PREF_PRE, COTI_NUMERO, COTI_FECHA, ARTI_COD, CTDE_CANT * CTDE_FACTOR, (CTDE_TOTAL-CTDE_IVAMONTO-CTDE_CONSUMO)*COTI_FACTOR,
                CTDE_IVAMONTO*COTI_FACTOR, CTDE_DTOPORC, CTDE_TOTAL*COTI_FACTOR, CTDE_CONSUMO
                FROM COTIZACIONES C, COTIZACIONES_DETALLE D, PREFIJOS P
                WHERE C.COTI_ID = D.COTI_ID AND ARTI_COD = :ARTICULO AND COTI_FECHA >= :FECINI AND COTI_FECHA <= :FECFIN AND VEND_COD = :CODVEND AND COTI_ANULADO = 'N'
                 AND P.PREF_PRE = C.PREF_PRE AND P.TIDO_COD = 35 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                ORDER BY COTI_FECHA, C.COTI_ID, CTDE_ITEM
                INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :DTO, :TOTAL, :CONSUMO
                DO
                BEGIN
                SELECT ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO WHERE ARTI_COD = :ARTICULO
                    INTO :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC;
                SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                EXECUTE PROCEDURE costo_promedio (:ARTICULO, :FECHA) RETURNING_VALUES (:COSTOUNIT);
                COSTO = COSTOUNIT * CANTIDAD;
                UTILIDAD = BASE - COSTO;
                if (UOM = 'UTILIDAD') then
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                else
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
                if (CEROS = 'S') then
                    INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (4, USER, :ARTICULO);
                SUSPEND;
                END
            if (CEROS = 'S') then
                BEGIN
                COSTO = 0;
                UTILIDAD = 0;
                PORC = 0;
                /* agregue los articulos sin factura */
                FOR SELECT ARTI_COD, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN and
                    not exists (select REPA_ARTICULO FROM REPORTES_AUX WHERE REPA_ID = 4 AND REPA_USER = USER AND REPA_ARTICULO = a.arti_cod)
                    INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                    DO
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        END
    END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER PROCEDURE REP_UTILIDAD_VENTAS(
    TIPO INTEGER,
    DETALLE CHAR(1),
    FECINI DATE,
    FECFIN DATE,
    ARTINI VARCHAR(15),
    ARTFIN VARCHAR(15),
    GRPINI VARCHAR(3),
    GRPFIN VARCHAR(3),
    ORDEN CHAR(1),
    AGRUPA CHAR(1),
    CEROS CHAR(1),
    SUBEMPRESA INTEGER)
RETURNS (
    ARTICULO VARCHAR(15),
    DESCRIPCION VARCHAR(60),
    CODGRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    CODSUBG VARCHAR(3),
    NOMSUBG VARCHAR(30),
    CODMARC VARCHAR(3),
    NOMMARC VARCHAR(30),
    UNIDAD VARCHAR(8),
    CANTIDAD NUMERIC(18,4),
    BASE NUMERIC(18,4),
    COSTO NUMERIC(18,4),
    UTILIDAD NUMERIC(18,4),
    PORC NUMERIC(9,2),
    IVA NUMERIC(18,4),
    CONSUMO NUMERIC(18,4),
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    TIPODOC INTEGER)
AS
DECLARE VARIABLE COSTOUNIT NUMERIC(18,4);
DECLARE VARIABLE CANTDET NUMERIC(18,4);
declare variable CODINI VARCHAR(15);
declare variable CODFIN VARCHAR(15);
declare variable DESINI VARCHAR(15);
declare variable DESFIN VARCHAR(15);
declare variable MARINI VARCHAR(3);
declare variable MARFIN VARCHAR(3);
declare variable UOM VARCHAR(20);
declare variable NUMROWS INTEGER;
BEGIN
if (ORDEN = 'C') then
    BEGIN
    CODINI = ARTINI;
    CODFIN = ARTFIN;
    DESINI = '';
    DESFIN = 'zz';
    END
ELSE
    BEGIN
    DESINI = ARTINI;
    DESFIN = ARTFIN;
    CODINI = '';
    CODFIN = 'zz';
    END
if (AGRUPA = 'G') then
    BEGIN
    MARINI = '';
    MARFIN = 'zz';
    END
ELSE
    if (AGRUPA = 'M') then
        BEGIN
        MARINI = GRPINI;
        MARFIN = GRPFIN;
        GRPINI = '';
        GRPFIN = 'zz';
        END
    ELSE
        BEGIN
        MARINI = '';
        MARFIN = 'zz';
        GRPINI = '';
        GRPFIN = 'zz';
        END
EXECUTE PROCEDURE lee_configuracion ('FACTURACION', 'ARTICULOS', 'SUGERIR PRECIOS CON PORCENTAJE DE MARGEN O UTILIDAD') returning_values (:UOM);
if (DETALLE = 'N') then
    BEGIN
    if (BIN_AND(TIPO, 1) <> 0) then
        BEGIN
        TIPODOC = 31;
        /* BORRA LA TABLA AUXILIAR */
        DELETE FROM reportes_aux WHERE REPA_ID = 2 AND REPA_USER = USER;

        FOR SELECT MAX(D.ARTI_COD), SUM(FADE_CANT * FADE_FACTOR), SUM((FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO)*FACT_FACTOR), SUM(FADE_IVAMONTO*FACT_FACTOR), SUM(FADE_CONSUMO),
            MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD)
            FROM FACTURAS_DETALLE D, FACTURAS F, PREFIJOS P, ARTICULO A
            WHERE F.FACT_ID = D.FACT_ID AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND D.ARTI_COD = A.arti_cod AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            FACT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) and substring(a.arti_cod from 1 FOR 2) <> '.t'
            GROUP BY D.ARTI_COD
            INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,
            :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
            DO
            BEGIN
            COSTO = 0;
            FOR SELECT FADE_CANT * FADE_FACTOR, FACT_FECHA FROM FACTURAS_DETALLE D, FACTURAS F, PREFIJOS P
                WHERE F.FACT_ID = D.FACT_ID AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND
                FACT_ANULADO = 'N' AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                and D.ARTI_COD = :articulo  INTO :cantdet, :fecha
                DO
                BEGIN
                EXECUTE PROCEDURE COSTO_PROMEDIO(:ARTICULO, :FECHA) returning_values (:costounit);
                COSTO = COSTO + costounit * cantdet;
                END
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                if (COSTO > 0) then
                    PORC = UTILIDAD * 100 / COSTO;
                ELSE
                    PORC = 100;
            else
                if (BASE > 0) then
                    PORC = UTILIDAD * 100 / BASE;
                ELSE
                    PORC = 0;
            if (CEROS = 'S') then
                INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (2, USER, :ARTICULO);
            SUSPEND;
            END /* FOR */
        if (CEROS = 'S') then
            BEGIN
            COSTO = 0;
            UTILIDAD = 0;
            PORC = 0;
            /* agregue los articulos sin factura */
            FOR SELECT ARTI_COD, 0, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND
                    A.ARTI_DES <= :DESFIN AND A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND
                    (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN)))
                INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,:DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                DO
                BEGIN
                SELECT COUNT(REPA_ARTICULO) FROM REPORTES_AUX WHERE REPA_ID = 2 AND REPA_USER = USER AND REPA_ARTICULO = :articulo INTO :numrows;
                if (numrows = 0) then
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        END
    if (BIN_AND(TIPO, 2) <> 0) then
        BEGIN
        TIPODOC = 32;
        /* BORRA LA TABLA AUXILIAR */
        DELETE FROM reportes_aux WHERE REPA_ID = 2 AND REPA_USER = USER;

        FOR SELECT MAX(D.ARTI_COD), SUM(RVDE_CANT * RVDE_FACTOR), SUM(RVDE_TOTAL-RVDE_IVAMONTO-RVDE_CONSUMO), SUM(RVDE_IVAMONTO), SUM(RVDE_CONSUMO),
            MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD)
            FROM REMISIONES_VENTA_DETALLE D, REMISIONES_VENTA R, PREFIJOS P, ARTICULO A
            WHERE R.REVT_ID = D.REVT_ID AND P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = 32 AND D.ARTI_COD = A.arti_cod AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            REVT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY D.ARTI_COD
            INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,
            :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
            DO
            BEGIN
            COSTO = 0;
            FOR SELECT RVDE_CANT * RVDE_FACTOR, REVT_FECHA FROM remisiones_venta_detalle D, remisiones_venta F, PREFIJOS P
                WHERE F.revt_id = D.revt_id AND REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN AND
                REVT_ANULADO = 'N' AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 32 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                and D.ARTI_COD = :articulo  INTO :cantdet, :fecha
                DO
                BEGIN
                EXECUTE PROCEDURE COSTO_PROMEDIO(:ARTICULO, :FECHA) returning_values (:costounit);
                COSTO = COSTO + costounit * cantdet;
                END
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                if (COSTO > 0) then
                    PORC = UTILIDAD * 100 / COSTO;
                ELSE
                    PORC = 100;
            else
                if (BASE > 0) then
                    PORC = UTILIDAD * 100 / BASE;
                ELSE
                    PORC = 0;
            if (CEROS = 'S') then
                INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (2, USER, :ARTICULO);
            SUSPEND;
            END /* FOR */
        if (CEROS = 'S') then
            BEGIN
            COSTO = 0;
            UTILIDAD = 0;
            PORC = 0;
            /* agregue los articulos sin factura */
            FOR SELECT ARTI_COD, 0, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND
                    A.ARTI_DES <= :DESFIN AND A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND
                    (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN)))
                INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,:DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                DO
                BEGIN
                SELECT COUNT(REPA_ARTICULO) FROM REPORTES_AUX WHERE REPA_ID = 2 AND REPA_USER = USER AND REPA_ARTICULO = :articulo INTO :numrows;
                if (numrows = 0) then
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        END
    if (BIN_AND(TIPO, 4) <> 0) then
        BEGIN
        TIPODOC = 33;
        /* BORRA LA TABLA AUXILIAR */
        DELETE FROM reportes_aux WHERE REPA_ID = 2 AND REPA_USER = USER;

        FOR SELECT MAX(D.ARTI_COD), SUM(DVDE_CANT * DVDE_FACTOR), SUM((DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO)*DEVT_FACTOR), SUM(DVDE_IVAMONTO*DEVT_FACTOR), SUM(DVDE_CONSUMO),
            MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD)
            FROM devoluciones_ventas_detalle D, DEVOLUCIONES_VENTAS V, PREFIJOS P, ARTICULO A
            WHERE V.DEVT_ID = D.DEVT_ID AND P.PREF_PRE = V.PREF_PRE AND P.TIDO_COD = 33 AND D.ARTI_COD = A.arti_cod AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            DEVT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY D.ARTI_COD
            INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,
            :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
            DO
            BEGIN
            COSTO = 0;
            FOR SELECT DVDE_CANT * DVDE_FACTOR, DEVT_FECHA FROM devoluciones_ventas_detalle D, devoluciones_ventas F, PREFIJOS P
                WHERE F.devt_id = D.devt_id AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND
                DEVT_ANULADO = 'N' AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 33 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                and D.ARTI_COD = :articulo  INTO :cantdet, :fecha
                DO
                BEGIN
                EXECUTE PROCEDURE COSTO_PROMEDIO(:ARTICULO, :FECHA) returning_values (:costounit);
                COSTO = COSTO + costounit * cantdet;
                END
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            else
                CANTIDAD = CANTIDAD * -1;
            if (BASE IS NULL) then
                BASE = 0;
            else
                BASE = BASE * -1;
            if (IVA IS NULL) then
                IVA = 0;
            else
                IVA = IVA * -1;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            else
                CONSUMO = CONSUMO * -1;
            COSTO = costo * -1;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                if (COSTO < 0) then
                    PORC = UTILIDAD * 100 / COSTO;
                ELSE
                    PORC = 100;
            else
                if (BASE < 0) then
                    PORC = UTILIDAD * 100 / BASE;
                ELSE
                    PORC = 0;
            if (CEROS = 'S') then
                INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (2, USER, :ARTICULO);
            SUSPEND;
            END /* FOR */
        if (CEROS = 'S') then
            BEGIN
            COSTO = 0;
            UTILIDAD = 0;
            PORC = 0;
            /* agregue los articulos sin factura */
            FOR SELECT ARTI_COD, 0, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND
                    A.ARTI_DES <= :DESFIN AND A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND
                    (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN)))
                INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,:DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                DO
                BEGIN
                SELECT COUNT(REPA_ARTICULO) FROM REPORTES_AUX WHERE REPA_ID = 2 AND REPA_USER = USER AND REPA_ARTICULO = :articulo INTO :numrows;
                if (numrows = 0) then
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        END
    if (BIN_AND(TIPO, 8) <> 0) then
        BEGIN
        TIPODOC = 34;
        /* BORRA LA TABLA AUXILIAR */
        DELETE FROM reportes_aux WHERE REPA_ID = 2 AND REPA_USER = USER;

        FOR SELECT MAX(D.ARTI_COD), SUM(PEDE_CANT * PEDE_FACTOR), SUM((PEDE_TOTAL-PEDE_IVAMONTO-PEDE_CONSUMO)*PEDI_FACTOR), SUM(PEDE_IVAMONTO*PEDI_FACTOR), SUM(PEDE_CONSUMO),
            MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD)
            FROM PEDIDOS_DETALLE D, PEDIDOS P, PREFIJOS R, ARTICULO A
            WHERE P.PEDI_ID = D.PEDI_ID AND P.PREF_PRE = R.PREF_PRE AND R.TIDO_COD = 34 AND D.ARTI_COD = A.arti_cod AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            PEDI_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY D.ARTI_COD
            INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,
            :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
            DO
            BEGIN
            COSTO = 0;
            FOR SELECT PEDE_CANT * PEDE_FACTOR, PEDI_FECHA FROM pedidos_detalle D, pedidos F, PREFIJOS P
                WHERE F.pedi_id = D.pedi_id AND PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND
                PEDI_ANULADO = 'N' AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                and D.ARTI_COD = :articulo  INTO :cantdet, :fecha
                DO
                BEGIN
                EXECUTE PROCEDURE COSTO_PROMEDIO(:ARTICULO, :FECHA) returning_values (:costounit);
                COSTO = COSTO + costounit * cantdet;
                END
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                if (COSTO > 0) then
                    PORC = UTILIDAD * 100 / COSTO;
                ELSE
                    PORC = 100;
            else
                if (BASE > 0) then
                    PORC = UTILIDAD * 100 / BASE;
                ELSE
                    PORC = 0;
            if (CEROS = 'S') then
                INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (2, USER, :ARTICULO);
            SUSPEND;
            END /* FOR */
        if (CEROS = 'S') then
            BEGIN
            COSTO = 0;
            UTILIDAD = 0;
            PORC = 0;
            /* agregue los articulos sin factura */
            FOR SELECT ARTI_COD, 0, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND
                    A.ARTI_DES <= :DESFIN AND A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND
                    (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN)))
                INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,:DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                DO
                BEGIN
                SELECT COUNT(REPA_ARTICULO) FROM REPORTES_AUX WHERE REPA_ID = 2 AND REPA_USER = USER AND REPA_ARTICULO = :articulo INTO :numrows;
                if (numrows = 0) then
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        END
    if (BIN_AND(TIPO, 16) <> 0) then
        BEGIN
        TIPODOC = 35;
        /* BORRA LA TABLA AUXILIAR */
        DELETE FROM reportes_aux WHERE REPA_ID = 2 AND REPA_USER = USER;

        FOR SELECT MAX(D.ARTI_COD), SUM(CTDE_CANT * CTDE_FACTOR), SUM((CTDE_TOTAL-CTDE_IVAMONTO-CTDE_CONSUMO)*COTI_FACTOR), SUM(CTDE_IVAMONTO), SUM(CTDE_CONSUMO),
            MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD)
            FROM COTIZACIONES_DETALLE D, COTIZACIONES C, PREFIJOS P, ARTICULO A
            WHERE C.COTI_ID = D.COTI_ID AND P.PREF_PRE = C.PREF_PRE AND P.TIDO_COD = 35 AND D.ARTI_COD = A.arti_cod AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND COTI_FECHA >= :FECINI AND COTI_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            COTI_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY D.ARTI_COD
            INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,
            :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
            DO
            BEGIN
            COSTO = 0;
            FOR SELECT CTDE_CANT * CTDE_FACTOR, COTI_FECHA FROM cotizaciones_detalle D, cotizaciones F, PREFIJOS P
                WHERE F.coti_id = D.coti_id AND COTI_FECHA >= :FECINI AND COTI_FECHA <= :FECFIN AND
                COTI_ANULADO = 'N' AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                and D.ARTI_COD = :articulo  INTO :cantdet, :fecha
                DO
                BEGIN
                EXECUTE PROCEDURE COSTO_PROMEDIO(:ARTICULO, :FECHA) returning_values (:costounit);
                COSTO = COSTO + costounit * cantdet;
                END
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                if (COSTO > 0) then
                    PORC = UTILIDAD * 100 / COSTO;
                ELSE
                    PORC = 100;
            else
                if (BASE > 0) then
                    PORC = UTILIDAD * 100 / BASE;
                ELSE
                    PORC = 0;
            if (CEROS = 'S') then
                INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (2, USER, :ARTICULO);
            SUSPEND;
            END /* FOR */
        if (CEROS = 'S') then
            BEGIN
            COSTO = 0;
            UTILIDAD = 0;
            PORC = 0;
            /* agregue los articulos sin factura */
            FOR SELECT ARTI_COD, 0, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND
                    A.ARTI_DES <= :DESFIN AND A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND
                    (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN)))
                INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,:DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                DO
                BEGIN
                SELECT COUNT(REPA_ARTICULO) FROM REPORTES_AUX WHERE REPA_ID = 2 AND REPA_USER = USER AND REPA_ARTICULO = :articulo INTO :numrows;
                if (numrows = 0) then
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        END
    END
ELSE
    BEGIN
    if (BIN_AND(TIPO, 1) <> 0) then
        BEGIN
        TIPODOC = 31;
        FOR SELECT F.PREF_PRE, FACT_NUMERO, FACT_FECHA, D.ARTI_COD, FADE_CANT * FADE_FACTOR, (FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO)*FACT_FACTOR, FADE_IVAMONTO*FACT_FACTOR, FADE_CONSUMO,
            ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
            FROM FACTURAS F, FACTURAS_DETALLE D, PREFIJOS P, ARTICULO A
            WHERE F.FACT_ID = D.FACT_ID AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND D.ARTI_COD = A.arti_cod AND
                A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
                A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND FACT_FECHA >= :FECINI AND
                (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
                FACT_FECHA <= :FECFIN AND FACT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) and substring(a.arti_cod from 1 FOR 2) <> '.t'
            ORDER BY D.ARTI_COD, FACT_FECHA, F.FACT_ID, FADE_ITEM
            INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,
                :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
            DO
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            EXECUTE PROCEDURE costo_promedio (:ARTICULO, :FECHA) RETURNING_VALUES (:COSTOUNIT);
            COSTO = COSTOUNIT * CANTIDAD;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                if (COSTO > 0) then
                    PORC = UTILIDAD * 100 / COSTO;
                ELSE
                    PORC = 100;
            else
                if (BASE > 0) then
                    PORC = UTILIDAD * 100 / BASE;
                ELSE
                    PORC = 0;
            SUSPEND;
            END
        END
    if (BIN_AND(TIPO, 2) <> 0) then
        BEGIN
        TIPODOC = 32;
        FOR SELECT R.PREF_PRE, REVT_NUMERO, REVT_FECHA, D.ARTI_COD, RVDE_CANT * RVDE_FACTOR, RVDE_TOTAL-RVDE_IVAMONTO-RVDE_CONSUMO, RVDE_IVAMONTO, RVDE_CONSUMO,
            ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
            FROM REMISIONES_VENTA R, REMISIONES_VENTA_DETALLE D, PREFIJOS P, ARTICULO A
            WHERE R.REVT_ID = D.REVT_ID AND P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = 32 AND D.ARTI_COD = A.arti_cod AND
                A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
                A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN AND
                (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
                REVT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            ORDER BY D.ARTI_COD, REVT_FECHA, R.REVT_ID, RVDE_ITEM
            INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,
                :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
            DO
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            EXECUTE PROCEDURE costo_promedio (:ARTICULO, :FECHA) RETURNING_VALUES (:COSTOUNIT);
            COSTO = COSTOUNIT * CANTIDAD;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                if (COSTO > 0) then
                    PORC = UTILIDAD * 100 / COSTO;
                ELSE
                    PORC = 100;
            else
                if (BASE > 0) then
                    PORC = UTILIDAD * 100 / BASE;
                ELSE
                    PORC = 0;
            SUSPEND;
            END
        END
    if (BIN_AND(TIPO, 4) <> 0) then
        BEGIN
        TIPODOC = 33;
        FOR SELECT V.PREF_PRE, DEVT_NUMERO, DEVT_FECHA, D.ARTI_COD, DVDE_CANT * DVDE_FACTOR, (DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO)*DEVT_FACTOR, DVDE_IVAMONTO*DEVT_FACTOR, DVDE_CONSUMO,
            ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
            FROM DEVOLUCIONES_VENTAS V, DEVOLUCIONES_VENTAS_DETALLE D, PREFIJOS P, ARTICULO A
            WHERE V.DEVT_ID = D.DEVT_ID AND P.PREF_PRE = V.PREF_PRE AND P.TIDO_COD = 33 AND D.ARTI_COD = A.arti_cod AND
                A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
                A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND
                (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
                DEVT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            ORDER BY D.ARTI_COD, DEVT_FECHA, V.DEVT_ID, DVDE_ITEM
            INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,
                :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
            DO
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            EXECUTE PROCEDURE costo_promedio (:ARTICULO, :FECHA) RETURNING_VALUES (:COSTOUNIT);
            BASE = BASE * -1;
            CANTIDAD = CANTIDAD * -1;
            IVA = IVA * -1;
            CONSUMO = CONSUMO * -1;
            COSTO = COSTOUNIT * CANTIDAD;
            COSTO = COSTO * -1;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                if (COSTO > 0) then
                    PORC = UTILIDAD * 100 / COSTO;
                ELSE
                    PORC = 100;
            else
                if (BASE > 0) then
                    PORC = UTILIDAD * 100 / BASE;
                ELSE
                    PORC = 0;
            SUSPEND;
            END
        END
    if (BIN_AND(TIPO, 8) <> 0) then
        BEGIN
        TIPODOC = 34;
        FOR SELECT P.PREF_PRE, PEDI_NUMERO, PEDI_FECHA, D.ARTI_COD, PEDE_CANT * PEDE_FACTOR, (PEDE_TOTAL-PEDE_IVAMONTO-PEDE_CONSUMO)*PEDI_FACTOR, PEDE_IVAMONTO*PEDI_FACTOR, PEDE_CONSUMO,
            ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD 
            FROM PEDIDOS P, PEDIDOS_DETALLE D, PREFIJOS R, ARTICULO A
            WHERE P.PEDI_ID = D.PEDI_ID AND P.PREF_PRE = R.PREF_PRE AND R.TIDO_COD = 34 AND D.ARTI_COD = A.arti_cod AND
                A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
                A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND
                (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
                PEDI_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            ORDER BY D.ARTI_COD, PEDI_FECHA, P.PEDI_ID, PEDE_ITEM
            INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,
                :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
            DO
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            EXECUTE PROCEDURE costo_promedio (:ARTICULO, :FECHA) RETURNING_VALUES (:COSTOUNIT);
            COSTO = COSTOUNIT * CANTIDAD;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                if (COSTO > 0) then
                    PORC = UTILIDAD * 100 / COSTO;
                ELSE
                    PORC = 100;
            else
                if (BASE > 0) then
                    PORC = UTILIDAD * 100 / BASE;
                ELSE
                    PORC = 0;
            SUSPEND;
            END
        END
    if (BIN_AND(TIPO, 16) <> 0) then
        BEGIN
        TIPODOC = 35;
        FOR SELECT C.PREF_PRE, COTI_NUMERO, COTI_FECHA, D.ARTI_COD, CTDE_CANT * CTDE_FACTOR, (CTDE_TOTAL-CTDE_IVAMONTO-CTDE_CONSUMO)*COTI_FACTOR, CTDE_IVAMONTO*COTI_FACTOR, CTDE_CONSUMO,
            ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD 
            FROM COTIZACIONES C, COTIZACIONES_DETALLE D, PREFIJOS P, ARTICULO A
            WHERE C.COTI_ID = D.COTI_ID AND P.PREF_PRE = C.PREF_PRE AND P.TIDO_COD = 35 AND D.ARTI_COD = A.arti_cod AND
                A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
                A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND COTI_FECHA >= :FECINI AND COTI_FECHA <= :FECFIN AND
                (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
                COTI_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            ORDER BY D.ARTI_COD, COTI_FECHA, C.COTI_ID, CTDE_ITEM
            INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,
                :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
            DO
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            EXECUTE PROCEDURE costo_promedio (:ARTICULO, :FECHA) RETURNING_VALUES (:COSTOUNIT);
            COSTO = COSTOUNIT * CANTIDAD;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                if (COSTO > 0) then
                    PORC = UTILIDAD * 100 / COSTO;
                ELSE
                    PORC = 100;
            else
                if (BASE > 0) then
                    PORC = UTILIDAD * 100 / BASE;
                ELSE
                    PORC = 0;
            SUSPEND;
            END
        END
    END
END
^

SET TERM ; ^



/* 20090506B RECALCULO DE IDS EN RECIBOS Y EGRESOS INCLUIA LOS ANULADOS */

SET TERM ^ ;

CREATE OR ALTER PROCEDURE IDS_CORTE(
    FECHA DATE,
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    OPER INTEGER,
    NIT VARCHAR(20),
    FECHAREC DATE,
    PREFREC VARCHAR(4),
    NUMREC VARCHAR(6),
    ID INTEGER,
    ITEM INTEGER,
    TIPO INTEGER,
    DOC INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    IDNUEVO INTEGER)
AS
begin
OPER = 61;
FOR SELECT RECA_FECHA, PREF_PRE, RECA_NUMERO, R.RECA_ID, RCDE_ITEM, RCDE_TIPODOC, RCDE_IDDOC, RCDE_PREFIJO, RCDE_NUMERO, TERC_NIT
    FROM RECIBOS_CAJA_DETALLE D, RECIBOS_CAJA R
    WHERE R.reca_id = d.reca_id AND RECA_FECHA >= :FECINI AND RECA_FECHA <= :FECFIN AND RECA_ANULADO = 'N' AND
        NOT EXISTS(SELECT MVCL_ID FROM movimiento_clientes WHERE MVCL_TIPOREF = D.rcde_tipodoc AND MVCL_IDREF = D.rcde_iddoc AND TERC_NIT = R.terc_nit)
    ORDER BY r.RECA_ID, RCDE_ITEM
    INTO :FECHAREC, :PREFREC, :NUMREC, :ID, :ITEM, :TIPO, :DOC, :PREF, :NUMERO, :NIT
    DO
    BEGIN
    /* BUSQUELO COMO NOTA */
    if ((TIPO = 31) or (TIPO = 41) or (TIPO = 77)) then
        BEGIN
        IDNUEVO = 0;
        SELECT FIRST 1 MVCL_IDREF FROM movimiento_clientes
        WHERE MVCL_PREFREF = :PREF AND MVCL_NUMREF = :NUMERO AND MVCL_TIPOREF = 41 AND MVCL_FECHA <= :FECHA AND TERC_NIT = :NIT
        INTO :IDNUEVO;
        if ((IDNUEVO <> 0) AND (IDNUEVO IS NOT NULL)) then
            UPDATE RECIBOS_CAJA_DETALLE SET RCDE_TIPODOC = 41, RCDE_IDDOC = :IDNUEVO, RCDE_PREFIJO = :PREF WHERE RECA_ID = :ID AND RCDE_ITEM = :ITEM;
        else
            begin
            if (STRLEN(PREF) < 4) then
                PREF = 'C' || pref;
            SELECT MVCL_IDREF FROM movimiento_clientes WHERE MVCL_PREFREF = :PREF AND MVCL_NUMREF = :NUMERO AND MVCL_TIPOREF = 41 AND MVCL_FECHA <= :FECHA AND TERC_NIT = :NIT
                INTO :IDNUEVO;
            if ((IDNUEVO <> 0) AND (IDNUEVO IS NOT NULL)) then
                UPDATE RECIBOS_CAJA_DETALLE SET RCDE_TIPODOC = 41, RCDE_IDDOC = :IDNUEVO, RCDE_PREFIJO = :PREF WHERE RECA_ID = :ID AND RCDE_ITEM = :ITEM;
            end
        end
    ELSE
        BEGIN
        IDNUEVO = 0;
        SELECT FIRST 1 MVCL_IDREF FROM movimiento_clientes WHERE MVCL_PREFREF = :PREF AND MVCL_NUMREF = :NUMERO AND MVCL_TIPOREF = 42 AND MVCL_FECHA <= :FECHA AND TERC_NIT = :NIT
            INTO :IDNUEVO;
        if ((IDNUEVO <> 0) AND (IDNUEVO IS NOT NULL)) then
            UPDATE RECIBOS_CAJA_DETALLE SET RCDE_TIPODOC = 42, RCDE_IDDOC = :IDNUEVO, RCDE_PREFIJO = :PREF  WHERE RECA_ID = :ID AND RCDE_ITEM = :ITEM;
        else
            begin
            if (STRLEN(PREF) < 4) then
                PREF = 'C' || pref;
            SELECT MVCL_IDREF FROM movimiento_clientes WHERE MVCL_PREFREF = :PREF AND MVCL_NUMREF = :NUMERO AND MVCL_TIPOREF = 42 AND MVCL_FECHA <= :FECHA AND TERC_NIT = :NIT
                INTO :IDNUEVO;
            if ((IDNUEVO <> 0) AND (IDNUEVO IS NOT NULL)) then
                UPDATE RECIBOS_CAJA_DETALLE SET RCDE_TIPODOC = 42, RCDE_IDDOC = :IDNUEVO, RCDE_PREFIJO = :PREF  WHERE RECA_ID = :ID AND RCDE_ITEM = :ITEM;
            end
        END
    suspend;
    END
OPER = 43;
FOR SELECT APCL_FECHA, PREF_PRE, APCL_NUMERO, A.APCL_ID, ACDE_ITEM, ACDE_TIPODOC, ACDE_IDDOC, ACDE_PREFIJO, ACDE_NUMERO, TERC_NIT
    FROM aplicacion_cliente_detalle d, aplicacion_cliente a where a.apcl_id = d.apcl_id AND APCL_FECHA >= :FECINI AND APCL_FECHA <= :FECFIN AND APCL_ANULADO = 'N' AND
        NOT EXISTS(SELECT MVCL_ID FROM movimiento_clientes WHERE MVCL_TIPOREF = D.acde_tipodoc AND MVCL_IDREF = D.acde_iddoc AND TERC_NIT = A.terc_nit)
    ORDER BY a.APCL_ID, ACDE_ITEM
    INTO :FECHAREC, :PREFREC, :NUMREC, :ID, :ITEM, :TIPO, :DOC, :PREF, :NUMERO, :NIT
    DO
    BEGIN
    /* BUSQUELO COMO NOTA */
    if ((TIPO = 31) or (TIPO = 41) or (TIPO = 77)) then
        BEGIN
        IDNUEVO = 0;
        SELECT FIRST 1 MVCL_IDREF FROM movimiento_clientes WHERE MVCL_PREFREF = :PREF AND MVCL_NUMREF = :NUMERO AND MVCL_TIPOREF = 41 AND MVCL_FECHA <= :FECHA AND TERC_NIT = :NIT
            INTO :IDNUEVO;
        if ((IDNUEVO <> 0) AND (IDNUEVO IS NOT NULL)) then
            UPDATE aplicacion_cliente_detalle SET ACDE_TIPODOC = 41, ACDE_IDDOC = :IDNUEVO, ACDE_PREFIJO = :PREF  WHERE APCL_ID = :ID AND ACDE_ITEM = :ITEM;
        else
            begin
            if (STRLEN(PREF) < 4) then
                PREF = 'C' || pref;
            SELECT MVCL_IDREF FROM movimiento_clientes WHERE MVCL_PREFREF = :PREF AND MVCL_NUMREF = :NUMERO AND MVCL_TIPOREF = 41 AND MVCL_FECHA <= :FECHA AND TERC_NIT = :NIT
                INTO :IDNUEVO;
            if ((IDNUEVO <> 0) AND (IDNUEVO IS NOT NULL)) then
                UPDATE aplicacion_cliente_detalle SET ACDE_TIPODOC = 41, ACDE_IDDOC = :IDNUEVO, ACDE_PREFIJO = :PREF  WHERE APCL_ID = :ID AND ACDE_ITEM = :ITEM;
            end
        end
    ELSE
        BEGIN
        IDNUEVO = 0;
        SELECT FIRST 1 MVCL_IDREF FROM movimiento_clientes WHERE MVCL_PREFREF = :PREF AND MVCL_NUMREF = :NUMERO AND MVCL_TIPOREF = 42 AND MVCL_FECHA <= :FECHA AND TERC_NIT = :NIT
        INTO :IDNUEVO;
        if ((IDNUEVO <> 0) AND (IDNUEVO IS NOT NULL)) then
            UPDATE aplicacion_cliente_detalle SET ACDE_TIPODOC = 42, ACDE_IDDOC = :IDNUEVO, ACDE_PREFIJO = :PREF  WHERE APCL_ID = :ID AND ACDE_ITEM = :ITEM;
        else
            begin
            if (STRLEN(PREF) < 4) then
                PREF = 'C' || pref;
            SELECT MVCL_IDREF FROM movimiento_clientes WHERE MVCL_PREFREF = :PREF AND MVCL_NUMREF = :NUMERO AND MVCL_TIPOREF = 42 AND MVCL_FECHA <= :FECHA AND TERC_NIT = :NIT
                INTO :IDNUEVO;
            if ((IDNUEVO <> 0) AND (IDNUEVO IS NOT NULL)) then
                UPDATE aplicacion_cliente_detalle SET ACDE_TIPODOC = 42, ACDE_IDDOC = :IDNUEVO, ACDE_PREFIJO = :PREF  WHERE APCL_ID = :ID AND ACDE_ITEM = :ITEM;
            end
        END
    suspend;
    END
OPER = 62;
FOR SELECT EGRE_FECHA, PREF_PRE, EGRE_NUMERO, E.EGRE_ID, EGDE_ITEM, EGDE_TIPODOC, EGDE_IDDOC, EGDE_PREFIJO, EGDE_NUMERO, TERC_NIT
    FROM EGRESOS_DETALLE D, EGRESOS E WHERE D.egre_id = E.egre_id AND EGRE_FECHA >= :FECINI AND EGRE_FECHA <= :FECFIN AND EGRE_ANULADO = 'N' AND
        NOT EXISTS(SELECT MVPR_ID FROM movimiento_proveedor WHERE MVPR_TIPOREF = D.egde_tipodoc AND MVPR_IDREF = D.egde_iddoc AND TERC_NIT = E.terc_nit)
    ORDER BY E.EGRE_ID, EGDE_ITEM
    INTO :FECHAREC, :PREFREC, :NUMREC, :ID, :ITEM, :TIPO, :DOC, :PREF, :NUMERO, :NIT
    DO
    BEGIN
    /* BUSQUELO COMO NOTA */
    if ((TIPO = 21) or (TIPO = 51)) then
        BEGIN
        IDNUEVO = 0;
        SELECT FIRST 1 MVPR_IDREF FROM movimiento_proveedor WHERE MVPR_PREFIJO = :PREF AND MVPR_NUMERO = :NUMERO AND MVPR_TIPOREF = 51 AND MVPR_FECHA <= :FECHA AND TERC_NIT = :NIT
            INTO :IDNUEVO;
        if ((IDNUEVO <> 0) AND (IDNUEVO IS NOT NULL)) then
            UPDATE EGRESOS_DETALLE SET EGDE_TIPODOC = 51, EGDE_IDDOC = :IDNUEVO, EGDE_PREFIJO = :PREF  WHERE EGRE_ID = :ID AND EGDE_ITEM = :ITEM;
        else
            begin
            if (STRLEN(PREF) < 4) then
                PREF = 'C' || pref;
            SELECT MVPR_IDREF FROM movimiento_proveedor WHERE MVPR_PREFIJO = :PREF AND MVPR_NUMERO = :NUMERO AND MVPR_TIPOREF = 51 AND MVPR_FECHA <= :FECHA AND TERC_NIT = :NIT
                INTO :IDNUEVO;
            if ((IDNUEVO <> 0) AND (IDNUEVO IS NOT NULL)) then
                UPDATE EGRESOS_DETALLE SET EGDE_TIPODOC = 51, EGDE_IDDOC = :IDNUEVO, EGDE_PREFIJO = :PREF  WHERE EGRE_ID = :ID AND EGDE_ITEM = :ITEM;
            end
        end
    ELSE
        BEGIN
        IDNUEVO = 0;
        SELECT FIRST 1 MVPR_IDREF FROM movimiento_proveedor WHERE MVPR_PREFIJO = :PREF AND MVPR_NUMERO = :NUMERO AND MVPR_TIPOREF = 52 AND MVPR_FECHA <= :FECHA AND TERC_NIT = :NIT
            INTO :IDNUEVO;
        if ((IDNUEVO <> 0) AND (IDNUEVO IS NOT NULL)) then
            UPDATE EGRESOS_DETALLE SET EGDE_TIPODOC = 52, EGDE_IDDOC = :IDNUEVO, EGDE_PREFIJO = :PREF  WHERE EGRE_ID = :ID AND EGDE_ITEM = :ITEM;
        else
            begin
            if (STRLEN(PREF) < 4) then
                PREF = 'C' || pref;
            SELECT MVPR_IDREF FROM movimiento_proveedor WHERE MVPR_PREFIJO = :PREF AND MVPR_NUMERO = :NUMERO AND MVPR_TIPOREF = 52 AND MVPR_FECHA <= :FECHA AND TERC_NIT = :NIT
                INTO :IDNUEVO;
            if ((IDNUEVO <> 0) AND (IDNUEVO IS NOT NULL)) then
                UPDATE EGRESOS_DETALLE SET EGDE_TIPODOC = 52, EGDE_IDDOC = :IDNUEVO, EGDE_PREFIJO = :PREF  WHERE EGRE_ID = :ID AND EGDE_ITEM = :ITEM;
            end
        END
    suspend;
    END
OPER = 53;
FOR SELECT APPR_FECHA, pref_pre, APPR_numero, A.APPR_ID, APPD_ITEM, APPD_TIPODOC, APPD_IDDOC, APPD_PREFIJO, APPD_NUMERO
    FROM aplicacion_proveedor_detalle d, aplicacion_provedor a where a.appr_id = d.appr_id AND APPR_FECHA >= :FECINI AND APPR_FECHA <= :FECFIN AND APPR_ANULADO = 'N' AND
        NOT EXISTS(SELECT MVPR_ID FROM movimiento_proveedor WHERE MVPR_TIPOREF = D.appd_tipodoc AND MVPR_IDREF = D.appd_iddoc AND TERC_NIT = A.terc_nit)
    ORDER BY a.APPR_ID, APPD_ITEM
    INTO :FECHAREC, :PREFREC, :NUMREC, :ID, :ITEM, :TIPO, :DOC, :PREF, :NUMERO
    DO
    BEGIN
    /* BUSQUELO COMO NOTA */
    if ((TIPO = 21) or (TIPO = 51)) then
        BEGIN
        IDNUEVO = 0;
        SELECT FIRST 1 MVPR_IDREF FROM movimiento_proveedor WHERE MVPR_PREFIJO = :PREF AND MVPR_NUMERO = :NUMERO AND MVPR_TIPOREF = 51 AND MVPR_FECHA <= :FECHA AND TERC_NIT = :NIT
            INTO :IDNUEVO;
        if ((IDNUEVO <> 0) AND (IDNUEVO IS NOT NULL)) then
            UPDATE aplicacion_proveedor_detalle SET APPD_TIPODOC = 51, APPD_IDDOC = :IDNUEVO, APPD_PREFIJO = :PREF  WHERE APPR_ID = :ID AND APPD_ITEM = :ITEM;
        else
            begin
            if (STRLEN(PREF) < 4) then
                PREF = 'C' || pref;
            SELECT MVPR_IDREF FROM movimiento_proveedor WHERE MVPR_PREFIJO = :PREF AND MVPR_NUMERO = :NUMERO AND MVPR_TIPOREF = 51 AND MVPR_FECHA <= :FECHA AND TERC_NIT = :NIT
                INTO :IDNUEVO;
            if ((IDNUEVO <> 0) AND (IDNUEVO IS NOT NULL)) then
                UPDATE aplicacion_proveedor_detalle SET APPD_TIPODOC = 51, APPD_IDDOC = :IDNUEVO, APPD_PREFIJO = :PREF  WHERE APPR_ID = :ID AND APPD_ITEM = :ITEM;
            end
        end
    ELSE
        BEGIN
        IDNUEVO = 0;
        SELECT FIRST 1 MVPR_IDREF FROM movimiento_proveedor WHERE MVPR_PREFIJO = :PREF AND MVPR_NUMERO = :NUMERO AND MVPR_TIPOREF = 52 AND MVPR_FECHA <= :FECHA AND TERC_NIT = :NIT
            INTO :IDNUEVO;
        if ((IDNUEVO <> 0) AND (IDNUEVO IS NOT NULL)) then
            UPDATE aplicacion_proveedor_detalle SET APPD_TIPODOC = 52, APPD_IDDOC = :IDNUEVO, APPD_PREFIJO = :PREF  WHERE APPR_ID = :ID AND APPD_ITEM = :ITEM;
        else
            begin
            if (STRLEN(PREF) < 4) then
                PREF = 'C' || pref;
            SELECT MVPR_IDREF FROM movimiento_proveedor WHERE MVPR_PREFIJO = :PREF AND MVPR_NUMERO = :NUMERO AND MVPR_TIPOREF = 52 AND MVPR_FECHA <= :FECHA AND TERC_NIT = :NIT
                INTO :IDNUEVO;
            if ((IDNUEVO <> 0) AND (IDNUEVO IS NOT NULL)) then
                UPDATE aplicacion_proveedor_detalle SET APPD_TIPODOC = 52, APPD_IDDOC = :IDNUEVO, APPD_PREFIJO = :PREF  WHERE APPR_ID = :ID AND APPD_ITEM = :ITEM;
            end
        END
    suspend;
    END
end
^

SET TERM ; ^



/* 20090507 EGRESOS: NIT DEL BANCO PARA CONTABILIZAR EL GMF */
SET TERM ^ ;

CREATE OR ALTER PROCEDURE CONTABIL_EGRESO(
    IDDOC INTEGER,
    IDINTER INTEGER)
RETURNS (
    ERROR INTEGER,
    VER CHAR(1),
    IDC INTEGER)
AS
declare variable PREF VARCHAR(4);
declare variable NUM VARCHAR(6);
declare variable FECAUX DATE;
declare variable FECHA CHAR(8);
declare variable CONC CHAR(120);
declare variable VRDTO NUMERIC(18, 2);
declare variable VRRTFTE NUMERIC(18, 2);
declare variable VRRTIVA NUMERIC(18, 2);
declare variable VRRTICA NUMERIC(18, 2);
declare variable VRTOTAL NUMERIC(18, 2);
declare variable TIPOCOMP VARCHAR(3);
declare variable PREFCONT VARCHAR(4);
declare variable BASE CHAR(1);
declare variable CTABASE VARCHAR(20);
declare variable CAJA CHAR(1);
declare variable CTACAJA VARCHAR(20);
declare variable RTFTE CHAR(1);
declare variable CTARTFTE VARCHAR(20);
declare variable RTIVA CHAR(1);
declare variable CTARTIVA VARCHAR(20);
declare variable RTICA CHAR(1);
declare variable CTARTICA VARCHAR(20);
declare variable DTO CHAR(1);
declare variable CTADTO VARCHAR(20);
declare variable EXISTE CHAR(1);
declare variable CUENTA VARCHAR(20);
declare variable MONTO NUMERIC(18,2);
declare variable ES_RETENCION CHAR(1);
declare variable TIPOCUEN CHAR(1);
declare variable NIT VARCHAR(20);
declare variable PROY VARCHAR(4);
declare variable CENTRO VARCHAR(4);
declare variable MONTOBASE NUMERIC(18,2);
declare variable PORC NUMERIC(9,2);
declare variable DEBITO NUMERIC(18,2);
declare variable CREDITO NUMERIC(18,2);
declare variable NROI INTEGER;
declare variable SUMA NUMERIC(18,2);
declare variable TCTACLIEN VARCHAR(20);
declare variable TCTARTFTE VARCHAR(20);
declare variable TCTARTIVA VARCHAR(20);
declare variable TCTARTICA VARCHAR(20);
declare variable TCTACART VARCHAR(20);
declare variable TIPOIT INTEGER;
declare variable IDIT INTEGER;
declare variable PREFIT VARCHAR(4);
declare variable NUMIT VARCHAR(6);
declare variable NUMEROIT VARCHAR(10);
declare variable ABONOIT NUMERIC(18,2);
declare variable CTADIC VARCHAR(20);
declare variable BASEADIC VARCHAR(20);
declare variable PORCADIC NUMERIC(5,2);
declare variable VALORADIC NUMERIC(18,2);
declare variable DBADIC CHAR(1);
declare variable VRBASE NUMERIC(18,2);
declare variable GMF CHAR(1);
declare variable CODBCO INTEGER;
declare variable NUMCHEQ VARCHAR(20);
declare variable CRUCES NUMERIC(18,2);
declare variable VRCAJA NUMERIC(18,2);
declare variable OK INTEGER;
declare variable DIFCAMBIO NUMERIC(18,2);
declare variable CTADIF VARCHAR(20);
declare variable RTFTEC NUMERIC(18,2);
declare variable RTIVAC NUMERIC(18,2);
declare variable RTICAC NUMERIC(18,2);
declare variable RTFTER CHAR(1);
declare variable CTARTFTER VARCHAR(20);
declare variable RTIVAR CHAR(1);
declare variable CTARTIVAR VARCHAR(20);
declare variable RTICAR CHAR(1);
declare variable CTARTICAR VARCHAR(20);
declare variable RET CHAR(2);
declare variable RTIT NUMERIC(18,2);
declare variable NITBCO VARCHAR(20);
BEGIN
/* BUSQUE LA INTERFACE */
EXISTE = 'N';
SELECT 'S', TICO_COD, PRCO_PRE, INCJ_BASE, INCJ_DTOPP, INCJ_RTFTE, INCJ_RTIVA, INCJ_RTICA, INCJ_CAJA, INCJ_CTABASE, INCJ_CTADTO, INCJ_CTARTFTE, INCJ_CTARTIVA, INCJ_CTARTICA, INCJ_CTACAJA, INCJ_CONFIRMAR
    FROM INTERFAZ_CAJA
    WHERE INCJ_ID = :IDINTER
    INTO :EXISTE, :TIPOCOMP, :PREFCONT, :BASE, :DTO, :RTFTE, :RTIVA, :RTICA, :CAJA, :CTABASE, :CTADTO, :CTARTFTE, :CTARTIVA, :CTARTICA, :CTACAJA, :VER;
if (EXISTE = 'S') then
    BEGIN
    OK = 0;
    FOR SELECT CNTB_ID FROM CONTABILIZACION WHERE CNTB_TIPOREF = 62 AND CNTB_IDREF = :IDDOC INTO :OK DO
        BEGIN
        DELETE FROM CONTABILIZACION_DET WHERE CNTB_ID = :OK;
        DELETE FROM CONTABILIZACION WHERE CNTB_ID = :OK;
        END

    /* TRAIGA EL ENCABEZADO DEL EGRESO */
    SELECT PREF_PRE, EGRE_NUMERO, EGRE_FECHA, E.TERC_NIT, EGRE_CONC, EGRE_DTOF, EGRE_MONTO, EGRE_RTFTEMONTO, EGRE_RTIVAMONTO, EGRE_RTICAMONTO, TERC_CTARTFTE, TERC_CTARTIVA, TERC_CTARTICA, TERC_CTACLIENTE
        FROM EGRESOS E, TERCEROS T
        WHERE EGRE_ID = :IDDOC AND E.TERC_NIT = T.TERC_NIT
        INTO :PREF, :NUM, :FECAUX, :NIT, :CONC, :VRDTO, :VRTOTAL, :VRRTFTE, :VRRTIVA, :VRRTICA, :TCTARTFTE, TCTARTIVA, TCTARTICA, TCTACLIEN;
    /* SI ES PROVEEDOR, SOBREESCIBE LAS CUENTAS  */
    SELECT PROV_CTAPAGAR, PROV_CTARTFTE, PROV_CTARTIVA, PROV_CTARTICA
        FROM PROVEEDORES WHERE TERC_NIT = :NIT
        INTO TCTACLIEN, TCTARTFTE, TCTARTIVA, TCTARTICA;
    SELECT PREF_CENTRO, PREF_PROY FROM PREFIJOS
        WHERE PREF_PRE = :PREF AND TIDO_COD = 62 INTO :CENTRO, :PROY;
    EXECUTE PROCEDURE FECHA_A_CONTA(:FECAUX) returning_values (:FECHA);
    /* REGISTRE EL ENCABEZADO CONTABLE */
    IDC = GEN_ID(ID_CONTABILIZA, 1);
    INSERT INTO CONTABILIZACION (CNTB_ID, CNTB_TIPOCOMP, CNTB_PREFCNT, CNTB_NUMERO, CNTB_FECHA, CNTB_CONCEPTO, CNTB_REF, CNTB_TIPOREF, CNTB_IDREF, CNTB_PREFREF, CNTB_NUMREF, CNTB_PROCESADO)
        VALUES (:IDC, :TIPOCOMP, :PREFCONT, :NUM, :FECHA, :CONC, '', 62, :IDDOC, :PREF, :NUM, 'N');
    /* SUME LOS CRUCES PARA LLEVARLOS A LA CUENTA X PAGAR Y RESTAR DE LA CAJA */
    SELECT SUM(EGCC_ABONO) FROM EGRESOS_CRUCEC WHERE EGRE_ID = :iddoc INTO :CRUCES;
    if (CRUCES IS NULL) then
        CRUCES = 0;
    VRCAJA = VRTOTAL - CRUCES;
    NROI = 0;
    SUMA = 0;
    ERROR = 0;
    /* EL CREDITO EN LA CAJA O EL BANCO */
    IF ((CAJA = 'K')) THEN
        BEGIN
        if (VRCAJA <> 0) then
            BEGIN
            CUENTA = NULL;
            EXECUTE PROCEDURE VALIDE_CUENTA_C (CTACAJA) RETURNING_VALUES (:OK);
            IF (OK = 0) THEN
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :CTACAJA INTO :CUENTA, :TIPOCUEN;
            ELSE
                begin
                EXECUTE PROCEDURE ERROR (62, :IDDOC, :CTACAJA, 2);
                CUENTA = CTACAJA;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 4);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRCAJA, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - VRCAJA;
                END
            END /* VRCAJA <> 0 */
        END /* CAJA CONSTANTE */
    IF ((CAJA = 'F')) THEN
        BEGIN
        /* mueva la cuenta de la caja o el banco o ambas */
        /* PRIMERO LA CAJA */
        FOR SELECT CAJA_CUENTA, EGCA_MONTO FROM EGRESOS_CAJA E, CAJAS C
            WHERE C.CAJA_ID = E.CAJA_ID AND EGRE_ID = :IDDOC
            INTO :CTACAJA, :MONTO
            DO
            BEGIN
            if (MONTO <> 0) then
                BEGIN
                CUENTA = NULL;
                EXECUTE PROCEDURE VALIDE_CUENTA_C (CTACAJA) RETURNING_VALUES (:OK);
                IF (OK = 0) THEN
                    SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                        WHERE CUEN_COD = :CTACAJA INTO :CUENTA, :TIPOCUEN;
                ELSE
                    begin
                    EXECUTE PROCEDURE ERROR (62, :IDDOC, :CTACAJA, 2);
                    CUENTA = CTACAJA;
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 4);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA - MONTO;
                    END
                END /* MONTO <> 0 */
            END /* DO CAJA */
        /* AHORA EL BANCO */
        MONTO = 0;
        SELECT CUBA_CTACONTA, EGBC_MONTO, EGBC_GMF, E.CUBA_COD, CUBA_GMFPOR, EGBC_NUMERO, BANC_NIT
            FROM EGRESOS_BANCO E, CUENTAS_BANCO C, BANCOS B
            WHERE E.CUBA_COD = C.CUBA_COD AND EGRE_ID = :IDDOC AND B.banc_cod = C.banc_cod
            INTO :CTACAJA, :MONTO, :GMF, :CODBCO, :PORC, :NUMCHEQ, :nitbco;
        if (MONTO <> 0) then
            BEGIN
            if (MONTO <> 0) then
                BEGIN
                CUENTA = NULL;
                EXECUTE PROCEDURE VALIDE_CUENTA_C (CTACAJA) RETURNING_VALUES (:OK);
                IF (OK = 0) THEN
                    SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                        WHERE CUEN_COD = :CTACAJA INTO :CUENTA, :TIPOCUEN;
                ELSE
                    begin
                    EXECUTE PROCEDURE ERROR (62, :IDDOC, :CTACAJA, 2);
                    CUENTA = CTACAJA;
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 4);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, :NUMCHEQ, 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA - MONTO;
                    END
                /* EL GMF */
                if ((GMF = 'S') AND (PORC <> 0)) then
                    BEGIN
                    if (NITBCO IS NULL) then
                        NITBCO = NIT;
                    EXECUTE procedure REDONDEE(:MONTO * :PORC / 1000, 0) returning_values (MONTO);
                    /* REGISTRE EL GMF EN LA MISMA CUENTA DEL BANCO COMO CREDITO */
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, :NUMCHEQ, 0, :MONTO, 0, 0, :NITBCO, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA - MONTO;

                    /* AHORA LA CUENTA DEL GASTO */
                    SELECT CUBA_CTAGMF FROM CUENTAS_BANCO
                        where CUBA_COD = :CODBCO INTO :CTACAJA;
                    EXECUTE PROCEDURE VALIDE_CUENTA_C (CTACAJA) RETURNING_VALUES (:OK);
                    IF (OK = 0) THEN
                        SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                            WHERE CUEN_COD = :CTACAJA INTO :CUENTA, :TIPOCUEN;
                    ELSE
                        begin
                        EXECUTE PROCEDURE ERROR (62, :IDDOC, :CTACAJA, 2);
                        CUENTA = CTACAJA;
                        TIPOCUEN = 'N';
                        ERROR = ERROR + 1;
                        end
                    if (TIPOCUEN = 'I') then
                        BEGIN
                        EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
                        TIPOCUEN = 'N';
                        ERROR = ERROR + 1;
                        END
                    if (TIPOCUEN = 'C') then
                        BEGIN
                        EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 4);
                        TIPOCUEN = 'N';
                        ERROR = ERROR + 1;
                        END
                    if (TIPOCUEN = 'N') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, :NUMCHEQ, :MONTO, 0, 0, 0, :NITBCO, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NROI = NROI + 1;
                        SUMA = SUMA + MONTO;
                        END
                    END /* GMF */
                END /* MONTO <> 0 */
            END /* EGRESO_BANCO */
        END /* CAJA = F */

    /* LOS CRUCES CON CUENTAS X COBRAR */
    if (CRUCES <> 0) then
        BEGIN
        SELECT TERC_CTACLIENTE FROM TERCEROS WHERE TERC_NIT = :nit INTO :tctacart;
        if (tctacart IS NULL) then
            tctacart = tctaclien;
        CUENTA = NULL;
        EXECUTE PROCEDURE VALIDE_CUENTA_C (tctacart) RETURNING_VALUES (:OK);
        IF (OK = 0) THEN
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :tctacart INTO :CUENTA, :TIPOCUEN;
        ELSE
            begin
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :tctacart, 2);
            CUENTA = tctacart;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            /* DEBERIA RECORRER DOCUMENTO POR DOCUMENTO */
            FOR SELECT EGCC_TIPODOC, EGCC_PREFIJO, EGCC_NUMERO, EGCC_ABONO+EGCC_RTFTE+EGCC_RTIVA+EGCC_RTICA+EGCC_DTOF
                FROM egresos_crucec WHERE EGRE_ID = :IDDOC
                INTO :TIPOIT, PREFIT, NUMIT, ABONOIT
                DO
                BEGIN
                NUMEROIT = PREFIT || NUMIT;
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :ABONOIT, 0, 0, :NIT, :PROY, :CENTRO, NULL, :NUMEROIT, NULL, NULL, :TIPOIT, 0);
                SUMA = SUMA - ABONOIT;
                NROI = NROI + 1;
                END
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :CRUCES, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            SUMA = SUMA - CRUCES;
            NROI = NROI + 1;
            END
        /* LA DIFERENCIA EN CAMBIO */
        SELECT SUM(EGCC_DIFCAMBIO) FROM egresos_crucec WHERE EGRE_ID = :iddoc INTO :DIFCAMBIO;
        IF ((DIFCAMBIO IS NOT NULL) AND (DIFCAMBIO <> 0)) THEN
            BEGIN
            if (DIFCAMBIO > 0) then
                execute procedure lee_configuracion('GENERAL','GENERAL','CUENTA DE INGRESO POR DIFERENCIA EN CAMBIO PARA OPERACIONES EN OTRA MONEDA') returning_values (:ctadif);
            else
                execute procedure lee_configuracion('GENERAL','GENERAL','CUENTA DE GASTO POR DIFERENCIA EN CAMBIO PARA OPERACIONES EN OTRA MONEDA') returning_values (:ctadif);
            CUENTA = NULL;
            EXECUTE PROCEDURE VALIDE_CUENTA_C (ctadif) RETURNING_VALUES (:OK);
            IF (OK = 0) THEN
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :ctadif INTO :CUENTA, :TIPOCUEN;
            ELSE
                begin
                EXECUTE PROCEDURE ERROR (62, :IDDOC, :ctadif, 2);
                CUENTA = ctadif;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 4);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                if (DIFCAMBIO > 0) then
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :difcambio, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                else
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', ABS(:difcambio), 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - difcambio;
                END
            END
        /* RETEFUENTE DEL CRUCE */
        SELECT first 1 INCJ_RTFTE, INCJ_RTIVA, INCJ_RTICA, INCJ_CTARTFTE, INCJ_CTARTIVA, INCJ_CTARTICA
            FROM INTERFAZ_CAJA WHERE tido_cod = 61 into :RTFTER, :RTIVAR, :RTICAR, :CTARTFTER, :CTARTIVAR, :CTARTICAR;
        SELECT SUM(EGCC_RTFTE) FROM egresos_crucec WHERE EGRE_ID = :iddoc INTO :rtftec;
        IF ((rtftec IS NOT NULL) AND (rtftec <> 0)) THEN
            BEGIN
            if ((RTFTER = 'T') or (RTFTER = 'K')) then
                BEGIN
                if (RTFTER = 'T') then
                    SELECT TERC_CTARTFTE FROM TERCEROS WHERE TERC_NIT = :NIT INTO CTARTFTER;
                CUENTA = NULL;
                EXECUTE PROCEDURE VALIDE_CUENTA_C (ctartfter) RETURNING_VALUES (:OK);
                IF (OK = 0) THEN
                    SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                        WHERE CUEN_COD = :ctartfter INTO :CUENTA, :TIPOCUEN;
                ELSE
                    begin
                    EXECUTE PROCEDURE ERROR (62, :IDDOC, :ctartfter, 2);
                    CUENTA = ctartfter;
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 4);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :rtftec, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA + rtftec;
                    END
                END
            END
        /* RETEIVA DEL CRUCE */
        SELECT SUM(EGCC_RTIVA) FROM egresos_crucec WHERE EGRE_ID = :iddoc INTO :rtivac;
        IF ((rtivac IS NOT NULL) AND (rtivac <> 0)) THEN
            BEGIN
            if ((RTIVAR = 'T') or (RTIVAR = 'K')) then
                BEGIN
                if (RTIVAR = 'T') then
                    SELECT TERC_CTARTIVA FROM TERCEROS WHERE TERC_NIT = :NIT INTO CTARTIVAR;
                CUENTA = NULL;
                EXECUTE PROCEDURE VALIDE_CUENTA_C (ctartivar) RETURNING_VALUES (:OK);
                IF (OK = 0) THEN
                    SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                        WHERE CUEN_COD = :ctartivar INTO :CUENTA, :TIPOCUEN;
                ELSE
                    begin
                    EXECUTE PROCEDURE ERROR (62, :IDDOC, :ctartivar, 2);
                    CUENTA = ctartivar;
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 4);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :rtivac, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA + rtivac;
                    END
                END
            END
        /* RETEICA DEL CRUCE */
        SELECT SUM(EGCC_RTICA) FROM egresos_crucec WHERE EGRE_ID = :iddoc INTO :rticac;
        IF ((rticac IS NOT NULL) AND (rtivac <> 0)) THEN
            BEGIN
            if ((RTICAR = 'T') or (RTICAR = 'K')) then
                BEGIN
                if (RTICAR = 'T') then
                    SELECT TERC_CTARTICA FROM TERCEROS WHERE TERC_NIT = :NIT INTO CTARTICAR;
                CUENTA = NULL;
                EXECUTE PROCEDURE VALIDE_CUENTA_C (ctarticar) RETURNING_VALUES (:OK);
                IF (OK = 0) THEN
                    SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                        WHERE CUEN_COD = :ctarticar INTO :CUENTA, :TIPOCUEN;
                ELSE
                    begin
                    EXECUTE PROCEDURE ERROR (62, :IDDOC, :ctarticar, 2);
                    CUENTA = ctarticar;
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 4);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :rticac, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA + rticac;
                    END
                END
            END
        END /* cruces */

    if (DTO = 'K') then /* DTO EN CTA CONSTANTE */
        BEGIN
        if (VRDTO <> 0) then
            BEGIN
            CUENTA = NULL;
            EXECUTE PROCEDURE VALIDE_CUENTA_C (CTADTO) RETURNING_VALUES (:OK);
            IF (OK = 0) THEN
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :CTADTO INTO :CUENTA, :TIPOCUEN;
            ELSE
                begin
                EXECUTE PROCEDURE ERROR (62, :IDDOC, :CTADTO, 2);
                CUENTA = CTADTO;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 4);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRDTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - VRDTO;
                END
            END /* VRDTO <> 0 */
        END /* DTO EN CTA CONSTANTE */

    /* LA DIFERENCIA EN CAMBIO */
    SELECT SUM(EGDE_DIFCAMBIO) FROM egresos_detalle WHERE EGRE_ID = :iddoc INTO :DIFCAMBIO;
    IF ((DIFCAMBIO IS NOT NULL) AND (DIFCAMBIO <> 0)) THEN
        BEGIN
        if (DIFCAMBIO > 0) then
            execute procedure lee_configuracion('GENERAL','GENERAL','CUENTA DE GASTO POR DIFERENCIA EN CAMBIO PARA OPERACIONES EN OTRA MONEDA') returning_values (:ctadif);
        else
            execute procedure lee_configuracion('GENERAL','GENERAL','CUENTA DE INGRESO POR DIFERENCIA EN CAMBIO PARA OPERACIONES EN OTRA MONEDA') returning_values (:ctadif);
        CUENTA = NULL;
        EXECUTE PROCEDURE VALIDE_CUENTA_C (ctadif) RETURNING_VALUES (:OK);
        IF (OK = 0) THEN
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :ctadif INTO :CUENTA, :TIPOCUEN;
        ELSE
            begin
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :ctadif, 2);
            CUENTA = ctadif;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 4);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            if (DIFCAMBIO > 0) then
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :difcambio, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            else
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, ABS(:difcambio), 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA + difcambio;
            END
        END
    /* RETENCION FUENTE */
    if ((RTFTE = 'T') or (RTFTE = 'K')) then
      if (VRRTFTE <> 0) then
        BEGIN
        if (RTFTE = 'T') then
            CTARTFTE = TCTARTFTE;
        CUENTA = NULL;
        EXECUTE PROCEDURE VALIDE_CUENTA_C (CTARTFTE) RETURNING_VALUES (:OK);
        IF (OK = 0) THEN
            SELECT CUEN_COD, CUEN_RETENCION, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTARTFTE INTO :CUENTA, :ES_RETENCION, :TIPOCUEN;
        ELSE
            begin
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :CTARTFTE, 2);
            CUENTA = CTARTFTE;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 4);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            if (ES_RETENCION = 'S') then
                BEGIN
                VRBASE = VRTOTAL;
                SELECT PROV_RETEFTE from proveedores where terc_nit = :NIT INTO :PORC;
                END
            ELSE
                BEGIN
                VRBASE = 0;
                PORC = 0;
                END
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, :VRBASE, :PORC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA - VRRTFTE;
            END
        END /* RTFTE */
    /* RETENCION IVA */
    if ((RTIVA = 'T') or (RTIVA = 'K')) then
      if (VRRTIVA <> 0) then
        BEGIN
        if (RTIVA = 'T') then
            CTARTIVA = TCTARTIVA;
        CUENTA = NULL;
        EXECUTE PROCEDURE VALIDE_CUENTA_C (CTARTIVA) RETURNING_VALUES (:OK);
        IF (OK = 0) THEN
            SELECT CUEN_COD, CUEN_RETENCION, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTARTIVA INTO :CUENTA, :ES_RETENCION, :TIPOCUEN;
        ELSE
            begin
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :CTARTIVA, 2);
            CUENTA = CTARTIVA;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 4);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            if (ES_RETENCION = 'S') then
                BEGIN
                VRBASE = VRTOTAL;
                SELECT PROV_RTEIVA from proveedores where terc_nit = :NIT INTO :PORC;
                END
            ELSE
                BEGIN
                VRBASE = 0;
                PORC = 0;
                END
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTIVA, :VRBASE, :PORC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA - VRRTIVA;
            END
        END /* RTIVA */
    /* RETENCION DE ICA */
    if ((RTICA = 'T') or (RTICA = 'K')) then
      if (VRRTICA <> 0) then
        BEGIN
        if (RTICA = 'T') then
            CTARTICA = TCTARTICA;
        CUENTA = NULL;
        EXECUTE PROCEDURE VALIDE_CUENTA_C (CTARTICA) RETURNING_VALUES (:OK);
        IF (OK = 0) THEN
            SELECT CUEN_COD, CUEN_RETENCION, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTARTICA INTO :CUENTA, :ES_RETENCION, :TIPOCUEN;
        ELSE
            begin
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :CTARTICA, 2);
            CUENTA = CTARTICA;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 4);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            if (ES_RETENCION = 'S') then
                BEGIN
                VRBASE = VRTOTAL;
                SELECT PROV_RTEICA from proveedores where terc_nit = :NIT INTO :PORC;
                END
            ELSE
                BEGIN
                VRBASE = 0;
                PORC = 0;
                END
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTICA, :VRBASE, :PORC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA - VRRTICA;
            END
        END /* RTICA */
    /* RECORRA LAS CUENTAS DE EGRESOS_CONTABILIDAD */
    FOR SELECT CUEN_COD, EGCO_NIT, EGCO_PROY, EGCO_CENTRO, EGCO_CONC, EGCO_DEBITOS, EGCO_CREDITOS, EGCO_BASEM, EGCO_PORC
        FROM EGRESOS_CONTABILIDAD WHERE EGRE_ID = :IDDOC ORDER BY EGCO_ITEM
        INTO :CTABASE, :NIT, :PROY, :CENTRO, :CONC, :DEBITO, :CREDITO, :MONTOBASE, :PORC
        DO
        BEGIN
        CUENTA = NULL;
        EXECUTE PROCEDURE VALIDE_CUENTA_C (CTABASE) RETURNING_VALUES (:OK);
        IF (OK = 0) THEN
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTABASE INTO :CUENTA, :TIPOCUEN;
        ELSE
            begin
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :CTABASE, 2);
            CUENTA = CTABASE;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 4);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'N') then
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :DEBITO, :CREDITO, :MONTOBASE, :PORC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
        SUMA = SUMA + DEBITO - CREDITO;
        NROI = NROI + 1;
        END
    /* CIERRE EL COMPROBANTE CONTRA LA CUENTA DEL TERCERO O LA BASE CONSTANTE */
    if (SUMA <> 0) THEN
        BEGIN
        if (SUMA < 0) then
            BEGIN
            DEBITO = SUMA * -1;
            CREDITO = 0;
            END
        ELSE
            BEGIN
            DEBITO = 0;
            CREDITO = SUMA;
            END
        if ((BASE = 'F') or (BASE = 'T') or (BASE = 'K')) then
            BEGIN
            if (BASE = 'T') then
                CTABASE = TCTACLIEN;
            if (BASE = 'F') then
                BEGIN
                SELECT CAJA_CUENTA FROM EGRESOS E, CAJAS C
                    WHERE C.CAJA_ID = E.CAJA_ID AND EGRE_ID = :IDDOC INTO :CTABASE;
                END
            CUENTA = NULL;
            EXECUTE PROCEDURE VALIDE_CUENTA_C (CTABASE) RETURNING_VALUES (:OK);
            IF (OK = 0) THEN
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :CTABASE INTO :CUENTA, :TIPOCUEN;
            ELSE
                begin
                EXECUTE PROCEDURE ERROR (62, :IDDOC, :CTABASE, 2);
                CUENTA = CTABASE;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                /* DEBERIA RECORRER DOCUMENTO POR DOCUMENTO */
                FOR SELECT RCDE_TIPODOC, RCDE_PREFIJO, RCDE_NUMERO, RCDE_ABONO+RCDE_RTFTE+RCDE_RTIVA+RCDE_RTICA+RCDE_DTOF
                    FROM RECIBOS_CAJA_DETALLE WHERE RECA_ID = :IDDOC
                    INTO :TIPOIT, PREFIT, NUMIT, ABONOIT
                    DO
                    BEGIN
                    NUMEROIT = PREFIT || NUMIT;
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :ABONOIT, 0, 0, :NIT, :PROY, :CENTRO, NULL, :NUMEROIT, NULL, NULL, :TIPOIT, 0);
                    NROI = NROI + 1;
                    END
                END
            if (TIPOCUEN = 'N') then
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :DEBITO, :CREDITO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            END /* SUMA EN CARTERA */
        if (BASE = 'D') then
            BEGIN
            execute procedure lee_configuracion('CXPAGAR','SALDOS','DESCONTAR RETENCIONES POR CAUSACION') returning_values (RET);
            CTABASE = NULL;
            FOR SELECT EGDE_TIPODOC, EGDE_IDDOC, EGDE_PREFIJO, EGDE_NUMERO, EGDE_ABONO+EGDE_DTOF, EGDE_RTFTE+EGDE_RTIVA+EGDE_RTICA
                FROM EGRESOS_DETALLE WHERE EGRE_ID = :IDDOC INTO :tipoit, :IDIT, :PREFIT, :NUMIT, :suma, :RTIT
                DO
                BEGIN
                if (TIPOIT <> 55) then
                    SELECT CUEN_COD, PROY_COD, CENT_COD FROM COMPROBANTE_ENCABEZADO E, COMPROBANTE_DETALLE D
                        WHERE E.enco_consec = D.enco_consec AND E.enco_tiporef = :TIPOIT AND E.enco_idref = :IDIT AND
                        SUBSTR(CUEN_COD,1,1) = '2' AND SUBSTR(CUEN_COD,1,3) <> '236' AND SUBSTR(CUEN_COD,1,4) <> '2408'
                        INTO :ctabase, :proy, :centro;
                else
                    /* tome la base de la configuración y el c.costo del prefijo del recibo */
                    execute procedure lee_configuracion('CAJA', 'EGRESOS', 'CUENTA CONTABLE PARA LOS ANTICIPOS A ACREEDORES SI LA INTERFAZ ES POR DOCUMENTO') returning_values (ctabase);
                if ((ctabase is null) or (ctabase = '')) then
                    CTABASE = TCTACLIEN;
                CUENTA = NULL;
                EXECUTE PROCEDURE VALIDE_CUENTA_C (ctabase) RETURNING_VALUES (:OK);
                IF (OK = 0) THEN
                    SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                        WHERE CUEN_COD = :CTABASE INTO :CUENTA, :TIPOCUEN;
                ELSE
                    begin
                    EXECUTE PROCEDURE ERROR (62, :IDDOC, :CTABASE, 2);
                    CUENTA = CTABASE;
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    end
                if (RET = 'NO') then
                    SUMA = SUMA + RTIT;
                if (SUMA < 0) then
                    BEGIN
                    CREDITO = SUMA * -1;
                    DEBITO = 0;
                    END
                ELSE
                    BEGIN
                    CREDITO = 0;
                    DEBITO = SUMA;
                    END
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    /* DEBERIA RECORRER DOCUMENTO POR DOCUMENTO */
                    NUMEROIT = PREFIT || NUMIT;
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :debito, :credito, 0, 0, :NIT, :PROY, :CENTRO, NULL, :NUMEROIT, NULL, NULL, :TIPOIT, 0);
                    END
                if (TIPOCUEN = 'N') then
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :DEBITO, :CREDITO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                END /* SUMA EN CARTERA */
            END
        END
    /* recorra las cuentas adicionales */
    FOR SELECT INJC_CUENTA, INJC_BASE, INJC_PORC, INJC_VALOR, INJC_DB
        FROM INTERFAZ_CAJA_CTAS
        WHERE INCJ_ID = :IDINTER
        INTO :CTADIC, :BASEADIC, :PORCADIC, :VALORADIC, :DBADIC
        DO
        BEGIN
        if (:BASEADIC = 'TOTAL') then
            VALORADIC = VRTOTAL;
        if (:BASEADIC = 'DESCUENTO') then
            VALORADIC = VRDTO;
        if (:BASEADIC = 'RTFTE') then
            VALORADIC = VRRTFTE;
        if (:BASEADIC = 'RTIVA') then
            VALORADIC = VRRTIVA;
        if (:BASEADIC = 'RTICA') then
            VALORADIC = VRRTICA;
        MONTO = VALORADIC * PORCADIC;
        CUENTA = NULL;
        EXECUTE PROCEDURE VALIDE_CUENTA_C (CTADIC) RETURNING_VALUES (:OK);
        IF (OK = 0) THEN
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTADIC INTO :CUENTA, :TIPOCUEN;
        ELSE
            begin
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :CTADIC, 2);
            CUENTA = CTADIC;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 4);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            if (DBADIC = 'S') then
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTADIC, :CONC, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            ELSE
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTADIC, :CONC, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            END
        NROI = NROI + 1;
        END
    if (ERROR > 0) then
        VER = 'S';
    SUSPEND;
    END /* EXISTE LA INTERFAZ */
  ELSE
    BEGIN
    EXECUTE PROCEDURE ERROR (62, :IDDOC, :PREF, 1);
    ERROR = ERROR + 1;
    VER = 'S';
    SUSPEND;
    END
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE EGRESOS_SIN_CONTABILIDAD(
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    ID INTEGER,
    IDI INTEGER,
    IDC INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    ESTADO VARCHAR(20),
    ERROR INTEGER)
AS
DECLARE VARIABLE VER CHAR(2);
declare variable FECICNT VARCHAR(10);
declare variable FECFCNT VARCHAR(10);
declare variable idref INTEGER;
BEGIN /*$$IBE$$ 
EXECUTE PROCEDURE fecha_a_conta(FECINI) returning_values (FECICNT);
EXECUTE PROCEDURE fecha_a_conta(FECFIN) returning_values (FECFCNT);
FOR SELECT EGRE_ID, PREF_PRE, egre_numero FROM EGRESOS WHERE EGRE_ANULADO = 'N' AND PREF_PRE <> 'R004' AND
    EGRE_FECHA >= :FECINI AND EGRE_FECHA <= :FECFIN ORDER BY EGRE_ID INTO :ID, :PREF, :NUMERO
DO
  BEGIN
  idref = null;
  SELECT ENCO_IDREF FROM COMPROBANTE_ENCABEZADO WHERE ENCO_TIPOREF = 62 AND ENCO_FECHA >= :FECICNT AND ENCO_FECHA <= :FECFCNT and ENCO_IDREF = :ID into :idref;
  if (idref IS NULL) then
  begin
   ESTADO = 'PROCESANDO';
   SUSPEND;
   SELECT MAX(INCJ_ID) FROM INTERFAZ_CAJA WHERE PREF_PRE = :PREF AND TIDO_COD = 62 INTO :IDI;
   EXECUTE PROCEDURE CONTABIL_EGRESO (:ID, :IDI) RETURNING_VALUES (:ERROR, :VER, :IDC);
   IF (ERROR = 0) THEN
      BEGIN
      EXECUTE PROCEDURE CONTABILIZA_PENDIENTE (:IDC);
      ESTADO = 'OK';
      END
   ELSE
    ESTADO = 'ERROR';
   suspend;
  end
  END
 $$IBE$$*/ SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE EGRESOS_SIN_CONTABILIDAD(
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    ID INTEGER,
    IDI INTEGER,
    IDC INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    ESTADO VARCHAR(20),
    ERROR INTEGER)
AS
DECLARE VARIABLE VER CHAR(2);
declare variable FECICNT VARCHAR(10);
declare variable FECFCNT VARCHAR(10);
declare variable idref INTEGER;
BEGIN
EXECUTE PROCEDURE fecha_a_conta(FECINI) returning_values (FECICNT);
EXECUTE PROCEDURE fecha_a_conta(FECFIN) returning_values (FECFCNT);
FOR SELECT EGRE_ID, PREF_PRE, egre_numero FROM EGRESOS WHERE EGRE_ANULADO = 'N' AND PREF_PRE <> 'R004' AND
    EGRE_FECHA >= :FECINI AND EGRE_FECHA <= :FECFIN ORDER BY EGRE_ID INTO :ID, :PREF, :NUMERO
DO
  BEGIN
  idref = null;
  SELECT ENCO_IDREF FROM COMPROBANTE_ENCABEZADO WHERE ENCO_TIPOREF = 62 AND ENCO_FECHA >= :FECICNT AND ENCO_FECHA <= :FECFCNT and ENCO_IDREF = :ID into :idref;
  if (idref IS NULL) then
  begin
   ESTADO = 'PROCESANDO';
   SUSPEND;
   SELECT MAX(INCJ_ID) FROM INTERFAZ_CAJA WHERE PREF_PRE = :PREF AND TIDO_COD = 62 INTO :IDI;
   EXECUTE PROCEDURE CONTABIL_EGRESO (:ID, :IDI) RETURNING_VALUES (:ERROR, :VER, :IDC);
   IF (ERROR = 0) THEN
      BEGIN
      EXECUTE PROCEDURE CONTABILIZA_PENDIENTE (:IDC);
      ESTADO = 'OK';
      END
   ELSE
    ESTADO = 'ERROR';
   suspend;
  end
  END
END

^

SET TERM ; ^



/* 20090507B : VERDADERO BLOQUEO DE FECHAS ANTERIORES AL BLOQUEO */
SET TERM ^ ;

create trigger SALDOS_CUENTAS_BI for SALDOS_CUENTAS
active BEFORE INSERT position 0
as
declare variable FECBLO CHAR(10);
begin
EXECUTE PROCEDURE LEE_CONFIGURACION ('CONTABILIDAD', 'GENERAL', 'FECHA DE BLOQUEO') RETURNING_VALUES (:FECBLO); 
IF (NEW.sacu_fecha < FECBLO) THEN
    EXCEPTION CONTABILIDAD_BLOQUEADA 'La contabilidad esta bloqueada a ' || :fecblo;
end
^

SET TERM ; ^


SET TERM ^ ;

create trigger SALDOS_CUENTAS_BU for SALDOS_CUENTAS
active BEFORE UPDATE position 0
as
declare variable FECBLO CHAR(10);
begin
EXECUTE PROCEDURE LEE_CONFIGURACION ('CONTABILIDAD', 'GENERAL', 'FECHA DE BLOQUEO') RETURNING_VALUES (:FECBLO); 
IF (NEW.sacu_fecha < FECBLO) THEN
    EXCEPTION CONTABILIDAD_BLOQUEADA 'La contabilidad esta bloqueada a ' || :fecblo;
end
^

SET TERM ; ^

SET TERM ^ ;

create trigger SALDOS_CUENTAS_BD for SALDOS_CUENTAS
active BEFORE DELETE position 0
as
declare variable FECBLO CHAR(10);
begin
EXECUTE PROCEDURE LEE_CONFIGURACION ('CONTABILIDAD', 'GENERAL', 'FECHA DE BLOQUEO') RETURNING_VALUES (:FECBLO); 
IF (OLD.sacu_fecha < FECBLO) THEN
    EXCEPTION CONTABILIDAD_BLOQUEADA 'La contabilidad esta bloqueada a ' || :fecblo;
end

^

SET TERM ; ^

/* 20090508 AL CAMBIAR LA CAJA NO DISPARABA LOS TRIGGERS DEL PAGO */

SET TERM ^ ;

CREATE OR ALTER TRIGGER RECIBOS_CAJA_AU FOR RECIBOS_CAJA
ACTIVE AFTER UPDATE POSITION 0
AS
declare variable consec INTEGER;
BEGIN
/* Borre la contabilizacion */
if (new.reca_anulado = 'S') then
    begin
    select enco_consec from comprobante_encabezado where enco_tiporef = 61 and enco_idref = old.reca_id into :consec;
    if (NOT consec is null) then
      delete from comprobante_detalle where enco_consec = :consec;
    delete from comprobante_encabezado where enco_tiporef = 61 and enco_idref = old.reca_id;
    INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
        VALUES (USER, 61, NEW.reca_id, 'A', NEW.pref_pre || NEW.reca_numero);
    end

/* si existia un recibo provisional borrelo */
if ((old.reca_id <> 0) and (old.reca_anulado = 'N')) then
    if ((old.reca_provid is not null) and (old.reca_provid <> 0)) then
        update recibo_provisional set rcpr_idcruce = 0, rcpr_feccruce = null where rcpr_id = old.reca_provid;
if ((new.reca_id <> 0) and (new.reca_anulado = 'N')) then
    BEGIN
    if ((new.reca_provid is not null) and (new.reca_provid <> 0)) then
        update recibo_provisional set rcpr_idcruce = new.reca_id, rcpr_feccruce = new.reca_fecha where rcpr_id = new.reca_provid;
    INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
        VALUES (USER, 61, NEW.reca_id, 'U', NEW.pref_pre || NEW.reca_numero);
    END
/* si cambio fecha o numero actualice detalles */
if ((OLD.pref_pre <> NEW.pref_pre) or
    (OLD.reca_numero <> NEW.reca_numero) or
    (OLD.caja_id <> NEW.caja_id) or
    (OLD.reca_fecha <> NEW.reca_fecha)) then
    BEGIN
    UPDATE recibos_caja_pago SET RCPA_TRANSMIT = 'N' WHERE RECA_ID = NEW.RECA_ID;
    UPDATE recibos_caja_detalle SET RCDE_TRANSMIT = 'N' WHERE RECA_ID = NEW.RECA_ID;
    UPDATE recibos_caja_crucec SET RCCR_TRANSMIT = 'N' WHERE RECA_ID = NEW.RECA_ID;
    END
/* ACTUALICE EL ANULADO EN LOS DETALLES */
if (OLD.RECA_anulado <> NEW.RECA_anulado) then
    BEGIN
    UPDATE recibos_caja_pago SET RCPA_ANULADO = NEW.RECA_anulado WHERE RECA_ID = NEW.RECA_ID;
    UPDATE recibos_caja_detalle SET RCDE_ANULADO = NEW.RECA_anulado WHERE RECA_ID = NEW.RECA_ID;
    UPDATE recibos_caja_crucec SET RCCR_ANULADO = NEW.RECA_anulado WHERE RECA_ID = NEW.RECA_ID;
    END
if (OLD.reca_transmit <> NEW.reca_transmit) then
    BEGIN
    UPDATE recibos_caja_pago SET RCPA_TRANSMIT = NEW.reca_transmit WHERE RECA_ID = NEW.RECA_ID;
    UPDATE recibos_caja_detalle SET RCDE_TRANSMIT = NEW.reca_transmit WHERE RECA_ID = NEW.RECA_ID;
    UPDATE recibos_caja_crucec SET RCCR_TRANSMIT = NEW.reca_transmit WHERE RECA_ID = NEW.RECA_ID;
    END
END
^

SET TERM ; ^

/* 20090511  NUEVO PARAMETRO PARA QUE AL GRABAR REMISIONES PROVISIONAL QUE SE ACTUALIZARAN CON LA FACTURA EL COSTO NO QUEDE NUNCA ENC ERO SI NO EN EL PROMEDIO */

INSERT INTO CONFIGURACION (CONF_MODULO, CONF_CATEGORIA, CONF_PROPIEDAD, CONF_VALOR, CONF_POSIBLES, CONF_AYUDA) VALUES ('COMPRAS', 'REMISIONES', 'PERMITIR CEROS EN COSTOS DE MERCANCIA', 'SI', 'SI,NO', 'NO: si el parámetro ''COMPRAS'', ''FACTURAS'', ''ACTUALIZAR COSTOS DE LA REMISION RELACIONADA AL GRABAR LA FACTURA'' es activo y se deje en cero el costo para registrar entradas provisionales se graban con costo promedio');
commit work;

SET TERM ^ ;

CREATE OR ALTER TRIGGER REMISION_PROVEEDOR_DET_AI FOR REMISION_PROVEEDOR_DET
ACTIVE AFTER INSERT POSITION 0
AS
declare variable fec date;
declare variable CONC VARCHAR(60);
declare variable factor numeric(18,4);
declare variable Pref varchar(4);
declare variable Num varchar(6);
declare variable EXISTE CHAR(1);
declare variable NIT VARCHAR(20);
declare variable NUMPROV VARCHAR(20);
declare variable Tipo Integer;
declare variable idfact integer;
declare variable numrows integer;
declare variable IVAINC CHAR(2);
declare variable COSTO NUMERIC(18,2);
declare variable CANTREL NUMERIC(18,4);
declare variable NUMPED VARCHAR(30);
declare variable CONSO CHAR(2);
declare variable CONSOLIDA INTEGER;
declare variable DTOPIE NUMERIC(18,2);
declare variable ADICIONAL NUMERIC(18,2);
declare variable TOTAL NUMERIC(18,2);
declare variable IVAMONTO NUMERIC(18,2);
declare variable EXTRA NUMERIC(18,2);
declare variable FACT NUMERIC(18,4);
declare variable MENORV CHAR(2);
declare variable CEROS CHAR(2);
declare variable ACTREM CHAR(2);
BEGIN
  if ((NEW.repr_id <> 0) and (new.rpvd_anulado = 'N')) then
    BEGIN
    select max(rprd_tiporel), max(rprd_idrel) from remision_proveedor_docrela
        where repr_id = new.repr_id into :Tipo, :idfact;
    if (Tipo is null) then
        Tipo = 0;
    /* si se hizo con base en una factura que afecto el inventario no afecte inventario */
    numrows = 0;
    if (Tipo = 21) Then
        select count(*) from movimiento_articulo where mvar_tipodoc = 21 and mvar_idref = :idfact into :numrows;
    if (numrows is null) then
        numrows = 0;
    if (numrows = 0) then
        begin
        select repr_fecha, pref_pre, repr_numero, REPR_IMPTOS, terc_nit, REPR_NUMPROV, REPR_ORDEN, REPR_CONSOLIDA, repr_dtomonto, repr_adicional, repr_total, repr_ivamonto, repr_extra
            from remision_proveedor where repr_id = new.repr_id
            into :fec, :Pref, :Num, :IVAINC, :NIT, :NUMPROV, :numped, :CONSOLIDA, :dtopie, :adicional, :total, :ivamonto, :extra;
        execute procedure factor_unidad_cant(new.arti_cod, new.rpvd_unidad) returning_values(factor);
        CONC = 'REMISION PROVEEDOR No.' || PREF || NUM || '-' || NUMPROV;
        if (numped <> '') then
            conc = conc || '-ORDEN ' || NUMPED;
        COSTO = ((new.rpvd_prunit - NEW.rpvd_dtomonto) / :factor);
        if (IVAINC = 'S') then
            COSTO = COSTO / (1 + NEW.rpvd_ivaporc/100);
        EXECUTE PROCEDURE lee_configuracion('COMPRAS','FACTURAS','DESCUENTO Y VALOR ADICIONAL DEL DOCUMENTO COMO MENOR VALOR DEL COSTO') returning_values (:MENORV);
        if (MENORV = 'SI') then
            BEGIN
            FACT = (TOTAL - EXTRA - IVAMONTO);
            if ((FACT - ADICIONAL + DTOPIE) <> 0) then
                FACT = FACT / (FACT - ADICIONAL + DTOPIE);
            ELSE
                FACT = 1;
            COSTO = COSTO * FACT;
            END
        if (COSTO = 0) then
            BEGIN
            EXECUTE PROCEDURE lee_configuracion('COMPRAS', 'REMISIONES', 'PERMITIR CEROS EN COSTOS DE MERCANCIA') returning_values (:ceros);
            EXECUTE PROCEDURE lee_configuracion('COMPRAS', 'FACTURAS', 'ACTUALIZAR COSTOS DE LA REMISION RELACIONADA AL GRABAR LA FACTURA') returning_values (:ACTREM);
            if ((ACTREM = 'SI') and (CEROS = 'NO')) then
                execute procedure costo_promedio(NEW.arti_cod, :fec) returning_values (:COSTO);
            END
        INSERT INTO MOVIMIENTO_ARTICULO
          (ARTI_COD, MVAR_CONS, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM, TERC_NIT)
          VALUES(NEW.ARTI_COD, GEN_ID(ID_MOVARTI,1), NEW.BODE_COD, :FEC, 22, NEW.repr_id,
          :CONC, :factor * new.rpvd_cant, :COSTO, 'S', new.rpvd_lote, :Pref, :Num, new.rpvd_item, :Nit);

        /* RECORRA LAS LISTAS DE PRECIOS Y CAMBIE EL PRECIO */
        EXECUTE PROCEDURE CALCULA_PRECIOS(NEW.ARTI_COD, :FEC);

        if (COSTO > 0 ) then
         BEGIN
          /* GRABE PROV X ARTICULO */
          EXISTE = 'N';
          SELECT 'S' FROM PROVEEDOR_ARTICULO WHERE TERC_NIT = :NIT AND ARTI_COD = NEW.ARTI_COD INTO :EXISTE;
          if (EXISTE = 'S') then
            UPDATE PROVEEDOR_ARTICULO 
                SET PVAR_FECHA = :FEC, PVAR_COSTO = :COSTO, PVAR_COD = NEW.rpvd_codprov
                WHERE TERC_NIT = :NIT AND ARTI_COD = NEW.ARTI_COD;
          ELSE
            INSERT INTO PROVEEDOR_ARTICULO (TERC_NIT, ARTI_COD, PVAR_COSTO, PVAR_FECHA, PVAR_COD,PVAR_DES)
                VALUES (:NIT, NEW.ARTI_COD, :COSTO, :FEC, NEW.rpvd_codprov,NEW.rpvd_desc);
         END
        end

    /* ACTUALICE EL PENDIENTE  */
    if (CONSOLIDA <> 0) then
        BEGIN
        EXECUTE PROCEDURE LEE_CONFIGURACION ('COMPRAS','DOCUMENTOS','SUMAR CANTIDADES PENDIENTES AL CONSOLIDAR DOCUMENTOS') returning_values (CONSO);
        SELECT MIN(CEFA_TIPOORI) FROM consolide_faltantes WHERE CEFA_ID = :CONSOLIDA INTO :NUMROWS;
        if (NUMROWS = 23) then
            BEGIN
            EXECUTE PROCEDURE LEE_CONFIGURACION('COMPRAS', 'REMISIONES', 'VERIFICAR CODIGOS DE LA ORDEN') returning_values (MENORV);
            if (MENORV = 'SI') then
                CONSO = 'NO';
            END
        SELECT COUNT(CEFA_ITEM) FROM consolide_faltantes WHERE CEFA_ID = :CONSOLIDA INTO :NUMROWS;
        if ((CONSO = 'SI') AND (NUMROWS > 1)) then
            UPDATE consolidado_faltantes SET COFA_OK = 'S' WHERE COFA_ID = :consolida;
        ELSE
            BEGIN
            /* BUSQUE EL CONSOLIDADO EN EL MISMO ITEM Y SI ES DIFERENTE ACTUALICELO */
            select COFA_CANT * COFA_FACTOR FROM consolidado_faltantes WHERE COFA_ID = :consolida AND COFA_ITEM = NEW.RPVD_ITEM AND ARTI_COD = NEW.arti_cod INTO :CANTREL;
            if (NEW.RPVD_CANT * NEW.RPVD_FACTOR < CANTREL) then
                UPDATE consolidado_faltantes SET COFA_IDDES = NEW.repr_id, COFA_CANT = NEW.RPVD_CANT, COFA_FACTOR = NEW.RPVD_FACTOR
                    WHERE COFA_ID = :consolida AND COFA_ITEM = NEW.RPVD_ITEM AND ARTI_COD = NEW.arti_cod;
            ELSE
                UPDATE consolidado_faltantes SET COFA_IDDES = NEW.repr_id, COFA_OK = 'S' WHERE COFA_ID = :consolida AND COFA_ITEM = NEW.RPVD_ITEM AND ARTI_COD = NEW.arti_cod;
            END
        END
    /* ACTUALICE EL STAND */
    if (new.rpvd_stand is not null) then
      if (exists(select stand_cod from stands where arti_cod = new.arti_cod and stand_bodega = new.bode_cod)) then
        UPDATE stands set stand_cod = new.rpvd_stand where arti_cod = new.arti_cod and stand_bodega = new.bode_cod;
      else
        INSERT INTO stands (ARTI_COD, STAND_BODEGA, STAND_COD) VALUES (NEW.arti_cod, NEW.bode_cod, NEW.rpvd_stand);
    END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER REMISION_PROVEEDOR_DET_AU FOR REMISION_PROVEEDOR_DET
ACTIVE AFTER UPDATE POSITION 0
AS
declare variable fec date;
declare variable CONC VARCHAR(60);
declare variable Pref varchar(4);
declare variable Num varchar(6);
declare variable factor numeric(18,4);
declare variable EXISTE CHAR(1);
declare variable NIT VARCHAR(20);
declare variable NUMPROV VARCHAR(20);
declare variable Tipo integer;
declare variable idfact integer;
declare variable numrows integer;
declare variable IVAINC CHAR(2);
declare variable COSTO NUMERIC(18,2);
declare variable CANTREL NUMERIC(18,4);
declare variable NUMPED VARCHAR(30);
declare variable CONSO CHAR(2);
declare variable CONSOLIDA INTEGER;
declare variable DTOPIE NUMERIC(18,2);
declare variable ADICIONAL NUMERIC(18,2);
declare variable TOTAL NUMERIC(18,2);
declare variable IVAMONTO NUMERIC(18,2);
declare variable EXTRA NUMERIC(18,2);
declare variable FACT NUMERIC(18,4);
declare variable MENORV CHAR(2);
declare variable CEROS CHAR(2);
declare variable ACTREM CHAR(2);
BEGIN
if ((OLD.repr_id <> 0) AND (OLD.rpvd_anulado = 'N')) then
    begin
    DELETE FROM MOVIMIENTO_ARTICULO WHERE (mvar_tipodoc = 22) and (mvar_idref = new.repr_id) and (mvar_item = old.rpvd_item);
    select REPR_CONSOLIDA from remision_proveedor where repr_id = old.repr_id into :CONSOLIDA;
    if (CONSOLIDA <> 0) then
        begin
        EXECUTE PROCEDURE LEE_CONFIGURACION ('COMPRAS','DOCUMENTOS','SUMAR CANTIDADES PENDIENTES AL CONSOLIDAR DOCUMENTOS') returning_values (CONSO);
        SELECT COUNT(CEFA_ITEM) FROM consolide_faltantes WHERE CEFA_ID = :CONSOLIDA INTO :NUMROWS;
        if ((NUMROWS = 1) OR (CONSO = 'NO')) then
            UPDATE consolidado_faltantes SET COFA_OK = 'N' WHERE COFA_ID = :consolida AND COFA_ITEM = old.RPVD_ITEM AND ARTI_COD = old.arti_cod;
        else
            UPDATE consolidado_faltantes SET COFA_OK = 'N' WHERE COFA_ID = :consolida;
        END
    end
/* Registre el nuevo */
if ((new.repr_id <> 0) AND (new.rpvd_anulado = 'N')) then
    begin
    select repr_fecha, pref_pre, repr_numero, repr_imptos, terc_nit, REPR_NUMPROV, REPR_ORDEN, REPR_CONSOLIDA, repr_dtomonto, repr_adicional, repr_total, repr_ivamonto, repr_extra
        from remision_proveedor where repr_id = new.repr_id
        into :fec, :Pref, :Num, :IVAINC, :NIT, :NUMPROV, :numped, :CONSOLIDA, :dtopie, :adicional, :total, :ivamonto, :extra;
    CONC = 'REMISION PROVEEDOR No.' || PREF || NUM || '-' || NUMPROV;
    if (numped <> '') then
        conc = conc || '-ORDEN ' || NUMPED;
    SELECT MAX(CEFA_TIPOORI) FROM consolide_faltantes WHERE CEFA_ID = :CONSOLIDA INTO :TIPO;
    if (Tipo is null) then
        Tipo = 0;
    select FACO_ID from FACTURAS_COMPRA WHERE FACO_CONSOLIDA = :consolida INTO :IDFACT;
    if (Idfact is null) then
        Idfact = 0;
    /* si se hizo con base en una factura que afecto el inventario no afecte inventario */
    numrows = 0;
    if (Tipo = 21) Then
        select count(*) from movimiento_articulo where mvar_tipodoc = 21 and mvar_idref = :idfact into :numrows;
    if (numrows is null) then
        numrows = 0;
    if (numrows = 0) then
        begin
        execute procedure factor_unidad_cant(new.arti_cod, new.rpvd_unidad) returning_values(factor);
        COSTO = ((new.rpvd_prunit - NEW.rpvd_dtomonto) / :factor);
        if (IVAINC = 'S') then
            COSTO = COSTO / (1 + NEW.rpvd_ivaporc/100);
        EXECUTE PROCEDURE lee_configuracion('COMPRAS','FACTURAS','DESCUENTO Y VALOR ADICIONAL DEL DOCUMENTO COMO MENOR VALOR DEL COSTO') returning_values (:MENORV);
        if (MENORV = 'SI') then
            BEGIN
            FACT = (TOTAL - EXTRA - IVAMONTO);
            if ((FACT - ADICIONAL + DTOPIE) <> 0) then
                FACT = FACT / (FACT - ADICIONAL + DTOPIE);
            ELSE
                FACT = 1;
            COSTO = COSTO * FACT;
            END
        if (COSTO = 0) then
            BEGIN
            EXECUTE PROCEDURE lee_configuracion('COMPRAS', 'REMISIONES', 'PERMITIR CEROS EN COSTOS DE MERCANCIA') returning_values (:ceros);
            EXECUTE PROCEDURE lee_configuracion('COMPRAS', 'FACTURAS', 'ACTUALIZAR COSTOS DE LA REMISION RELACIONADA AL GRABAR LA FACTURA') returning_values (:ACTREM);
            if ((ACTREM = 'SI') and (CEROS = 'NO')) then
                execute procedure costo_promedio(NEW.arti_cod, :fec) returning_values (:COSTO);
            END
        INSERT INTO MOVIMIENTO_ARTICULO
            (ARTI_COD, MVAR_CONS, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM, TERC_NIT)
            VALUES(NEW.ARTI_COD, GEN_ID(ID_MOVARTI,1), NEW.BODE_COD, :FEC, 22, NEW.repr_id,
            :CONC, :factor * new.rpvd_cant, :COSTO, 'S', new.rpvd_lote, :Pref, :Num, new.rpvd_item, :Nit);
            
        /* RECORRA LAS LISTAS DE PRECIOS Y CAMBIE EL PRECIO */
        EXECUTE PROCEDURE CALCULA_PRECIOS(NEW.ARTI_COD, :FEC);
          
        if (COSTO > 0 ) then
         BEGIN
          /* GRABE PROV X ARTICULO */
          EXISTE = 'N';
          SELECT 'S' FROM PROVEEDOR_ARTICULO WHERE TERC_NIT = :NIT AND ARTI_COD = NEW.ARTI_COD INTO :EXISTE;
          if (EXISTE = 'S') then
            UPDATE PROVEEDOR_ARTICULO
                SET PVAR_FECHA = :FEC, PVAR_COSTO = :COSTO, PVAR_COD = NEW.rpvd_codprov
                WHERE TERC_NIT = :NIT AND ARTI_COD = NEW.ARTI_COD;
          ELSE
            INSERT INTO PROVEEDOR_ARTICULO (TERC_NIT, ARTI_COD, PVAR_COSTO, PVAR_FECHA, PVAR_COD,PVAR_DES)
                VALUES (:NIT, NEW.ARTI_COD, :COSTO, :FEC, NEW.rpvd_codprov,NEW.rpvd_desc);
         END
        end
    if (CONSOLIDA <> 0) then
        BEGIN
        EXECUTE PROCEDURE LEE_CONFIGURACION ('COMPRAS','DOCUMENTOS','SUMAR CANTIDADES PENDIENTES AL CONSOLIDAR DOCUMENTOS') returning_values (CONSO);
        /* IGNORE LA CONSOLIDACION SI SE VALIDAN CODIGOS DE LA ORDEN */
        SELECT MIN(CEFA_TIPOORI) FROM consolide_faltantes WHERE CEFA_ID = :CONSOLIDA INTO :NUMROWS;
        if (NUMROWS = 23) then
            BEGIN
            EXECUTE PROCEDURE LEE_CONFIGURACION('COMPRAS', 'REMISIONES', 'VERIFICAR CODIGOS DE LA ORDEN') returning_values (MENORV);
            if (MENORV = 'SI') then
                CONSO = 'NO';
            END
        SELECT COUNT(CEFA_ITEM) FROM consolide_faltantes WHERE CEFA_ID = :CONSOLIDA INTO :NUMROWS;
        if ((CONSO = 'SI') AND (NUMROWS > 1)) then
            UPDATE consolidado_faltantes SET COFA_IDDES = NEW.repr_id, COFA_OK = 'S' WHERE COFA_ID = :consolida;
        ELSE
            BEGIN
            /* BUSQUE EL CONSOLIDADO EN EL MISMO ITEM Y SI ES DIFERENTE ACTUALICELO */
            select COFA_CANT * COFA_FACTOR FROM consolidado_faltantes WHERE COFA_ID = :consolida AND COFA_ITEM = NEW.RPVD_ITEM AND ARTI_COD = NEW.arti_cod INTO :CANTREL;
            if (NEW.RPVD_CANT * NEW.RPVD_FACTOR < CANTREL) then
                UPDATE consolidado_faltantes SET COFA_IDDES = NEW.repr_id, COFA_CANT = NEW.RPVD_CANT, COFA_FACTOR = NEW.RPVD_FACTOR
                    WHERE COFA_ID = :consolida AND COFA_ITEM = NEW.RPVD_ITEM AND ARTI_COD = NEW.arti_cod;
            else
                UPDATE consolidado_faltantes SET COFA_IDDES = NEW.repr_id, COFA_OK = 'S' WHERE COFA_ID = :consolida AND COFA_ITEM = NEW.RPVD_ITEM AND ARTI_COD = NEW.arti_cod;
            END
        END
    /* ACTUALICE EL STAND */
    if (new.rpvd_stand is not null) then
      if (exists(select stand_cod from stands where arti_cod = new.arti_cod and stand_bodega = new.bode_cod)) then
        UPDATE stands set stand_cod = new.rpvd_stand where arti_cod = new.arti_cod and stand_bodega = new.bode_cod;
      else
        INSERT INTO stands (ARTI_COD, STAND_BODEGA, STAND_COD) VALUES (NEW.arti_cod, NEW.bode_cod, NEW.rpvd_stand);
    END
END
^

SET TERM ; ^


/* 20090512 */
/* PARA EVITAR PROBLEMAS EN PANTALLA AL PRESENTAR EXISTENCIAS DE MAS DE DOS DECIMALES SE DEJO EXISTENCIA CON 2 DECIMALES */
SET TERM ^ ;

CREATE OR ALTER PROCEDURE CONSULTA_ARTICULOS_VTAS(
    FECHA DATE,
    INACTIVOS CHAR(1),
    MODULO VARCHAR(20),
    BUSCAR VARCHAR(100),
    CUALQUIERA CHAR(1),
    COLUMNA INTEGER,
    BUSCAR2 VARCHAR(30),
    BUSCAR3 VARCHAR(30),
    BUSCAR4 VARCHAR(30),
    BUSCAR5 VARCHAR(30))
RETURNS (
    CODIGO VARCHAR(20),
    DES VARCHAR(60),
    REF VARCHAR(20),
    GRUPO VARCHAR(30),
    MARCA VARCHAR(30),
    UNIDAD VARCHAR(8),
    ESTADO VARCHAR(30),
    IVA NUMERIC(9,2),
    EXISTEN NUMERIC(18,2),
    PRECIO NUMERIC(18,2),
    CLASE CHAR(1))
AS
DECLARE VARIABLE LISTA INTEGER;
DECLARE VARIABLE EXIST CHAR(2);
DECLARE VARIABLE SINEXIST CHAR(2);
declare variable DIG INTEGER;
declare variable OK CHAR(1);
BEGIN
EXISTEN = 0;
EXECUTE PROCEDURE lee_configuracion ('FACTURACION','ARTICULOS', 'VER EXISTENCIA EN CONSULTA ARTICULOS') returning_values (:EXIST);
EXECUTE PROCEDURE lee_configuracion ('FACTURACION','FACTURAS', 'CODIGO DE LA LISTA DE PRECIOS A MOSTRAR EN ARTICULOS') returning_values (:LISTA);
if (modulo = 'FACTURACION') then
  EXECUTE PROCEDURE lee_configuracion ('FACTURACION','ARTICULOS','VER ARTICULOS SIN EXISTENCIA EN CONSULTA DE ARTICULOS') returning_values (:sinexist);
else
  sinexist = 'SI';
EXECUTE PROCEDURE LEE_CONFIGURACION ('FACTURACION', 'ARTICULOS', 'REDONDEO AL MULTIPLO DE DIEZ EN PRECIOS') returning_values (DIG);
if (LISTA > 0) then
    BEGIN
    if ((BUSCAR IS NOT NULL) AND (BUSCAR <> '')) then
        FOR select a.arti_cod, arti_des, grup_cod, arti_unidad, esar_cod, taiv_porc, marc_cod,arti_clase
            from articulo a, tarifa_iva t
            where a.taiv_cod = t.taiv_cod and substring(a.arti_cod from 1 FOR 2) <> '.t' and
            ((:INACTIVOS = 'S') or (esar_cod = 'A') or ((:INACTIVOS = 'C') AND (esar_cod = 'N'))) AND
            ((:COLUMNA <> 0) or (upper(A.ARTI_COD) like upper(:buscar))) AND
            ((:columna <> 1) or (upper(A.ARTI_DES) like upper(:buscar))) AND
            ((:columna <> 2) or (upper(A.ARTI_OBS) like upper(:buscar)) or (upper(A.ARTI_DES) like upper(:buscar)))
            INTO :CODIGO, :DES, :GRUPO, :UNIDAD, :ESTADO, :IVA, :MARCA, :CLASE
            do
            begin
            select first 1 coba_cod from barras_articulo where arti_cod = :codigo into :ref;
            if ((COLUMNA <> 3) or (upper(REF) like upper(:buscar))) then
                BEGIN
                OK = 'N';
                PRECIO = 0;
                SELECT prar_fijo PRECIO FROM precios_articulo WHERE arti_cod = :CODIGO and lipr_cod = :LISTA INTO :PRECIO;
                EXECUTE PROCEDURE redondee(PRECIO, DIG) returning_values (PRECIO);
                if (EXIST = 'SI') then
                    BEGIN
                    SELECT FIRST 1 COST_SALDOC+COST_ENTC-COST_SALC
                        FROM COSTOS WHERE ARTI_COD = :codigo AND COST_FECHA <= :FECHA
                        ORDER BY COST_FECHA DESC,COST_ITEM DESC
                        INTO :existen;
                    if (existen is null) then
                        existen = 0;
/*                    EXECUTE PROCEDURE saldo_total_inventario (:CODIGO, :FECHA) returning_values (:EXISTEN);*/
                    if ((SINEXIST = 'SI')  or (existen <> 0)) then
                        OK = 'S';
                    END
                ELSE
                    OK = 'S';
                if (ok = 'S') then
                    if (CUALQUIERA = 'S') then
                        SUSPEND;
                    ELSE
                        if (BUSCAR2 <> '') then
                            BEGIN
                            IF (NOT EXISTS (SELECT ARTI_COD FROM ARTICULO WHERE ARTI_COD = :CODIGO AND ((upper(ARTI_DES) like upper(:BUSCAR2)) or (UPPER(ARTI_OBS) LIKE UPPER(:BUSCAR2))))) THEN
                                OK = 'N';
                            if ((OK = 'S') AND (BUSCAR3 <> '')) then
                                IF (NOT EXISTS (SELECT ARTI_COD FROM ARTICULO WHERE ARTI_COD = :CODIGO AND ((upper(ARTI_DES) like upper(:BUSCAR3)) or (UPPER(ARTI_OBS) LIKE UPPER(:BUSCAR3))))) THEN
                                    OK = 'N';
                            if ((OK = 'S') AND (BUSCAR4 <> '')) then
                                IF (NOT EXISTS (SELECT ARTI_COD FROM ARTICULO WHERE ARTI_COD = :CODIGO AND ((upper(ARTI_DES) like upper(:BUSCAR4)) or (UPPER(ARTI_OBS) LIKE UPPER(:BUSCAR4))))) THEN
                                    OK = 'N';
                            if ((OK = 'S') AND (BUSCAR4 <> '')) then
                                IF (NOT EXISTS (SELECT ARTI_COD FROM ARTICULO WHERE ARTI_COD = :CODIGO AND ((upper(ARTI_DES) like upper(:BUSCAR4)) or (UPPER(ARTI_OBS) LIKE UPPER(:BUSCAR4))))) THEN
                                    OK = 'N';
                            if ((OK = 'S') AND (BUSCAR5 <> '')) then
                                IF (NOT EXISTS (SELECT ARTI_COD FROM ARTICULO WHERE ARTI_COD = :CODIGO AND ((upper(ARTI_DES) like upper(:BUSCAR5)) or (UPPER(ARTI_OBS) LIKE UPPER(:BUSCAR5))))) THEN
                                    OK = 'N';
                            if (OK = 'S') then
                                SUSPEND;
                            END
                        ELSE
                            SUSPEND;
                END
            end
    ELSE
        FOR select a.arti_cod, arti_des, grup_cod, arti_unidad, esar_cod, taiv_porc, marc_cod,arti_clase
            from articulo a, tarifa_iva t
            where a.taiv_cod = t.taiv_cod and substring(a.arti_cod from 1 FOR 2) <> '.t' and
            ((:INACTIVOS = 'S') or (esar_cod = 'A') or ((:INACTIVOS = 'C') AND (esar_cod = 'N')))
            INTO :CODIGO, :DES, :GRUPO, :UNIDAD, :ESTADO, :IVA, :MARCA, :CLASE
            do
            begin
            select first 1 coba_cod from barras_articulo where arti_cod = :codigo into :ref;
            PRECIO = 0;
            SELECT prar_fijo PRECIO FROM precios_articulo WHERE arti_cod = :CODIGO and lipr_cod = :LISTA INTO :PRECIO;
            EXECUTE PROCEDURE redondee(PRECIO, DIG) returning_values (PRECIO);
            if (EXIST = 'SI') then
                BEGIN
                SELECT FIRST 1 COST_SALDOC+COST_ENTC-COST_SALC
                    FROM COSTOS WHERE ARTI_COD = :codigo AND COST_FECHA <= :FECHA
                    ORDER BY COST_FECHA DESC,COST_ITEM DESC
                    INTO :existen;
                if (existen is null) then
                    existen = 0;
/*                EXECUTE PROCEDURE saldo_total_inventario (:CODIGO, :FECHA) returning_values (:EXISTEN);*/
                if ((SINEXIST = 'SI')  or (existen <> 0)) then
                    SUSPEND;
                END
            ELSE
                SUSPEND;
            END
    END
ELSE
    if ((BUSCAR IS NOT NULL) AND (BUSCAR <> '')) then
        FOR select arti_cod, arti_des, grup_cod, arti_unidad, esar_cod, taiv_porc, arti_precio, marc_cod, arti_clase
            from articulo a, tarifa_iva t
            where a.taiv_cod = t.taiv_cod and substring(a.arti_cod from 1 FOR 2) <> '.t' and
            ((:INACTIVOS = 'S') or (esar_cod = 'A') or ((:INACTIVOS = 'C') AND (esar_cod = 'N'))) AND
            ((:COLUMNA <> 0) or (upper(A.ARTI_COD) like upper(:buscar))) AND
            ((:columna <> 1) or (upper(A.ARTI_DES) like upper(:buscar))) AND
            ((:columna <> 2) or (upper(A.ARTI_OBS) like upper(:buscar)) or (upper(A.ARTI_DES) like upper(:buscar)))
            INTO :CODIGO, :DES, :GRUPO, :UNIDAD, :ESTADO, :IVA, :PRECIO, :MARCA, :CLASE
            do
            begin
            select first 1 coba_cod from barras_articulo where arti_cod = :codigo into :ref;
            if ((COLUMNA <> 3) or (upper(REF) like upper(:buscar))) then
                BEGIN
                if (EXIST = 'SI') then
                    BEGIN
                    SELECT FIRST 1 COST_SALDOC+COST_ENTC-COST_SALC
                        FROM COSTOS WHERE ARTI_COD = :codigo AND COST_FECHA <= :FECHA
                        ORDER BY COST_FECHA DESC,COST_ITEM DESC
                        INTO :existen;
                    if (existen is null) then
                        existen = 0;
/*                    EXECUTE PROCEDURE saldo_total_inventario (:CODIGO, :FECHA) returning_values (:EXISTEN);*/
                    if ((SINEXIST = 'SI') or (existen <> 0)) then
                        OK = 'S';
                    END
                ELSE
                    OK = 'S';
                if (ok = 'S') then
                    if (CUALQUIERA = 'S') then
                        SUSPEND;
                    ELSE
                        if (BUSCAR2 <> '') then
                            BEGIN
                            IF (NOT EXISTS (SELECT ARTI_COD FROM ARTICULO WHERE ARTI_COD = :CODIGO AND ((upper(ARTI_DES) like upper(:BUSCAR2)) or (UPPER(ARTI_OBS) LIKE UPPER(:BUSCAR2))))) THEN
                                OK = 'N';
                            if ((OK = 'S') AND (BUSCAR3 <> '')) then
                                IF (NOT EXISTS (SELECT ARTI_COD FROM ARTICULO WHERE ARTI_COD = :CODIGO AND ((upper(ARTI_DES) like upper(:BUSCAR3)) or (UPPER(ARTI_OBS) LIKE UPPER(:BUSCAR3))))) THEN
                                    OK = 'N';
                            if ((OK = 'S') AND (BUSCAR4 <> '')) then
                                IF (NOT EXISTS (SELECT ARTI_COD FROM ARTICULO WHERE ARTI_COD = :CODIGO AND ((upper(ARTI_DES) like upper(:BUSCAR4)) or (UPPER(ARTI_OBS) LIKE UPPER(:BUSCAR4))))) THEN
                                    OK = 'N';
                            if ((OK = 'S') AND (BUSCAR4 <> '')) then
                                IF (NOT EXISTS (SELECT ARTI_COD FROM ARTICULO WHERE ARTI_COD = :CODIGO AND ((upper(ARTI_DES) like upper(:BUSCAR4)) or (UPPER(ARTI_OBS) LIKE UPPER(:BUSCAR4))))) THEN
                                    OK = 'N';
                            if ((OK = 'S') AND (BUSCAR5 <> '')) then
                                IF (NOT EXISTS (SELECT ARTI_COD FROM ARTICULO WHERE ARTI_COD = :CODIGO AND ((upper(ARTI_DES) like upper(:BUSCAR5)) or (UPPER(ARTI_OBS) LIKE UPPER(:BUSCAR5))))) THEN
                                    OK = 'N';
                            if (OK = 'S') then
                                SUSPEND;
                            END
                        ELSE
                            SUSPEND;
                END
            end
    ELSE
        FOR select arti_cod, arti_des, grup_cod, arti_unidad, esar_cod, taiv_porc, arti_precio, marc_cod, arti_clase
            from articulo a, tarifa_iva t
            where a.taiv_cod = t.taiv_cod and substring(a.arti_cod from 1 FOR 2) <> '.t' and
            ((:INACTIVOS = 'S') or (esar_cod = 'A') or ((:INACTIVOS = 'C') AND (esar_cod = 'N')))
            INTO :CODIGO, :DES, :GRUPO, :UNIDAD, :ESTADO, :IVA, :PRECIO, :MARCA, :CLASE
            do
            begin
            select first 1 coba_cod from barras_articulo where arti_cod = :codigo into :ref;
            if (EXIST = 'SI') then
                BEGIN
                SELECT FIRST 1 COST_SALDOC+COST_ENTC-COST_SALC
                    FROM COSTOS WHERE ARTI_COD = :codigo AND COST_FECHA <= :FECHA
                    ORDER BY COST_FECHA DESC,COST_ITEM DESC
                    INTO :existen;
                if (existen is null) then
                    existen = 0;
/*                EXECUTE PROCEDURE saldo_total_inventario (:CODIGO, :FECHA) returning_values (:EXISTEN);*/
                if ((SINEXIST = 'SI') or (existen <> 0)) then
                    SUSPEND;
                END
            ELSE
                SUSPEND;
            end
END
^

SET TERM ; ^

SET TERM ^ ;

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

SET TERM ; ^


/* 20090512B */
/* SE QUITO EL ORDENAMIENTO POR CAJA YA QUE CONFUNDIA MUCHO */

SET TERM ^ ;

CREATE OR ALTER PROCEDURE REP_CONSECUTIVOS_CAJA(
    TIPO INTEGER,
    PREFINI VARCHAR(4),
    PREFFIN VARCHAR(4),
    NUMINI VARCHAR(6),
    NUMFIN VARCHAR(6),
    CODCAJA VARCHAR(4),
    DETALLE CHAR(1),
    ANULADOS CHAR(1),
    SUBEMPRESA INTEGER)
RETURNS (
    NOMTIPO VARCHAR(30),
    CAJA INTEGER,
    NOMCAJA VARCHAR(60),
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(8),
    FECHA DATE,
    CONCEPTO VARCHAR(60),
    BENEFICIARIO VARCHAR(60),
    NUMREL VARCHAR(10),
    MONTO NUMERIC(18,2),
    DESCUENTO NUMERIC(18,2),
    RTFTE NUMERIC(18,2),
    RTIVA NUMERIC(18,2),
    RTICA NUMERIC(18,2),
    FORMAPAGO VARCHAR(30),
    FPBANCO VARCHAR(3),
    FPCUENTA VARCHAR(20),
    FPNUMERO VARCHAR(20),
    FPFECHA DATE,
    ANULADO CHAR(1),
    MONTOCAJA NUMERIC(18,2),
    MONTOCHEQ NUMERIC(18,2))
AS
declare variable ID INTEGER;
declare variable IDCAJA INTEGER;
declare variable IDCRUCE INTEGER;
declare variable NUMROWS INTEGER;
BEGIN
  if (BIN_AND(TIPO, 1) <> 0) then
    BEGIN
    IDCAJA = CAST(CODCAJA AS INTEGER);
    /* RECIBO CAJA */
    FOR SELECT RECA_ID, TIDO_NOMLARGO, PREF_PRE, RECA_NUMERO, RECA_FECHA, RECA_CONC, RECA_NOMTERC, R.CAJA_ID, CAJA_NOMBRE, RECA_MONTO, RECA_DTOF, RECA_RTFTEMONTO, RECA_RTIVAMONTO, RECA_RTICAMONTO, RECA_ANULADO, RECA_PROVISIONAL
        FROM RECIBOS_CAJA R, TIPO_DOCUMENTO T, CAJAS C
        WHERE C.CAJA_ID = R.CAJA_ID AND T.TIDO_COD = 61 AND PREF_PRE >= :PREFINI AND PREF_PRE <= :PREFFIN AND RECA_NUMERO >= :NUMINI AND RECA_NUMERO <= :NUMFIN
         AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
        ORDER BY pref_pre, reca_numero, RECA_ID
        INTO :ID, :NOMTIPO, :PREFIJO, :NUMERO, :FECHA, :CONCEPTO, :BENEFICIARIO, :CAJA, :NOMCAJA, :MONTO, :DESCUENTO, :RTFTE, :RTIVA, :RTICA, :ANULADO, :NUMREL
        DO
          if ((IDCAJA = 0) or (IDCAJA = CAJA)) then
            BEGIN
            if ((ANULADOS = 'S') or (ANULADO = 'N')) then
              if (ANULADO = 'S') then
                BEGIN
                FORMAPAGO = '';
                FPBANCO = '';
                FPCUENTA = '';
                FPNUMERO = '';
                FPFECHA = FECHA;
                MONTO = 0;
                DESCUENTO = 0;
                RTFTE = 0;
                RTIVA = 0;
                RTICA = 0;
                MONTOCAJA = 0;
                montocheq = 0;
                SUSPEND;
                END
              ELSE
                BEGIN
                if (DETALLE = 'S') then
                    FOR SELECT FOPA_NOM, RCPA_BANCO, RCPA_CUENTA, RCPA_NUMERO, RCPA_FECHA, RCPA_MONTO
                        FROM RECIBOS_CAJA_PAGO D, FORMAS_PAGO F
                        WHERE F.FOPA_ID = D.FOPA_ID AND RECA_ID = :ID
                        ORDER BY RCPA_ITEM
                        INTO :FORMAPAGO, :FPBANCO, :FPCUENTA, :FPNUMERO, :FPFECHA, :MONTO
                        DO
                        BEGIN
                        if (FORMAPAGO = 'EFECTIVO') then
                            BEGIN
                            MONTOCAJA = MONTO;
                            MONTOCHEQ = 0;
                            END
                        ELSE
                            BEGIN
                            MONTOCHEQ = MONTO;
                            MONTOCAJA = 0;
                            END
                        SUSPEND;
                        END
                ELSE
                    BEGIN
                    SELECT SUM(RCPA_MONTO) FROM RECIBOS_CAJA_PAGO 
                        WHERE FOPA_ID = 1 AND RECA_ID = :ID INTO :MONTOCAJA;
                    SELECT SUM(RCPA_MONTO) FROM RECIBOS_CAJA_PAGO 
                        WHERE FOPA_ID <> 1 AND RECA_ID = :ID INTO :MONTOCHEQ;
                    SUSPEND;
                    END
                END
            END
    END
if (BIN_AND(TIPO, 2) <> 0) then
    BEGIN
    /* EGRESO */
    FOR SELECT EGRE_ID, TIDO_NOMLARGO, E.PREF_PRE, EGRE_NUMERO, EGRE_FECHA, EGRE_CONC, EGRE_NOMTERC, EGRE_MONTO, EGRE_DTOF, EGRE_RTFTEMONTO, EGRE_RTIVAMONTO, EGRE_RTICAMONTO, EGRE_ANULADO
        FROM EGRESOS E, TIPO_DOCUMENTO T, PREFIJOS P
        WHERE T.TIDO_COD = 62 AND E.PREF_PRE >= :PREFINI AND E.PREF_PRE <= :PREFFIN AND EGRE_NUMERO >= :NUMINI AND EGRE_NUMERO <= :NUMFIN
         AND P.PREF_PRE = E.PREF_PRE AND P.TIDO_COD = 62 AND ((P.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
        ORDER BY E.PREF_PRE, EGRE_NUMERO
        INTO :ID, :NOMTIPO, :PREFIJO, :NUMERO, :FECHA, :CONCEPTO, :BENEFICIARIO, :MONTO, :DESCUENTO, :RTFTE, :RTIVA, :RTICA, :ANULADO
        do
        BEGIN
        if ((ANULADOS = 'S') or (ANULADO = 'N')) then
            if (ANULADO = 'S') then
                BEGIN
                FORMAPAGO = '';
                FPBANCO = '';
                FPCUENTA = '';
                FPNUMERO = '';
                FPFECHA = FECHA;
                MONTO = 0;
                DESCUENTO = 0;
                RTFTE = 0;
                RTIVA = 0;
                RTICA = 0;
                MONTOCAJA = 0;
                montocheq = 0;
                SUSPEND;
                END
            ELSE
                BEGIN
                MONTOCAJA = 0;
                MONTOCHEQ = 0;
                NUMREL = '';
                SELECT COUNT(*), MAX(CAJA_ID) FROM EGRESOS_CAJA
                    WHERE EGRE_ID = :ID INTO :NUMROWS, :CAJA;
                if (NUMROWS > 0) then
                    BEGIN
                    /* ES DE CAJA */
                    IDCAJA = CAST(CODCAJA AS INTEGER);
                    if ((IDCAJA = 0) or (IDCAJA = CAJA)) then
                        BEGIN
                        if (DETALLE = 'S') then
                            FOR SELECT FOPA_NOM, EGCA_BANCO, EGCA_CUENTA, EGCA_NUMERO, EGCA_FECHA, EGCA_MONTO
                                FROM EGRESOS_CAJA D, FORMAS_PAGO F
                                WHERE F.FOPA_ID = D.FOPA_ID AND EGRE_ID = :ID
                                ORDER BY EGCA_ITEM
                                INTO :FORMAPAGO, :FPBANCO, :FPCUENTA, :FPNUMERO, :FPFECHA, :MONTOCAJA
                                DO
                                    SUSPEND;
                        ELSE
                            BEGIN
                            SELECT SUM(EGCA_MONTO) FROM EGRESOS_CAJA
                                WHERE EGRE_ID = :ID INTO :MONTOCAJA;
                            if (MONTOCAJA IS NULL) then
                                MONTOCAJA = 0;
                            END
                        END
                    END
                /* ES DE BANCO */
                IDCAJA = 0;
                SELECT CUBA_COD FROM CUENTAS_BANCO WHERE CUBA_CODCTA = :CODCAJA INTO :IDCAJA;
                SELECT CUBA_COD, SUBSTR(EGBC_NUMERO,1,10) FROM EGRESOS_BANCO WHERE EGRE_ID = :ID INTO :CAJA, :NUMREL;
                if ((IDCAJA = 0) or (IDCAJA = CAJA)) then
                    BEGIN
                    if (DETALLE = 'S') then
                        begin
                        FOR SELECT TIDO_NOMCORTO, CUBA_CODCTA, CUBA_NUMERO, EGBC_NUMERO, EGBC_FECHA, EGBC_MONTO
                            FROM EGRESOS_BANCO E, TIPO_DOCUMENTO T, CUENTAS_BANCO C
                            WHERE E.EGRE_ID = :ID AND E.EGBC_TIPOBCO = T.TIDO_COD AND E.CUBA_COD = C.CUBA_COD
                            INTO :FORMAPAGO, :FPBANCO, :FPCUENTA, :FPNUMERO, :FPFECHA, :MONTOCHEQ
                            DO
                            SUSPEND;
                        END
                    ELSE
                        BEGIN
                        SELECT SUM(EGBC_MONTO) FROM EGRESOS_BANCO WHERE EGRE_ID = :ID INTO :MONTOCHEQ;
                        if (MONTOCHEQ IS NULL) then
                            MONTOCHEQ = 0;
                        END
                    END
                if (detalle = 'N') then
                    SUSPEND;
                END
        END
    END
if (BIN_AND(TIPO, 4) <> 0) then
    BEGIN
    IDCAJA = CAST(CODCAJA AS INTEGER);
    /* CAMBIO DOC */
    FOR SELECT CADO_ID, TIDO_NOMLARGO, PREF_PRE, CADO_NUMERO, CADO_FECHA, CADO_CONC, '', D.CAJA_ID, CAJA_NOMBRE, 0, CADO_ANULADO
        FROM CAMBIO_DOCUMENTOS D, TIPO_DOCUMENTO T, CAJAS C
        WHERE D.CAJA_ID = C.CAJA_ID AND T.TIDO_COD = 63  AND PREF_PRE >= :PREFINI AND PREF_PRE <= :PREFFIN AND CADO_NUMERO >= :NUMINI AND CADO_NUMERO <= :NUMFIN
         AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
        ORDER BY PREF_PRE, CADO_NUMERO
        INTO :ID, :NOMTIPO, :PREFIJO, :NUMERO, :FECHA, :CONCEPTO, :BENEFICIARIO, :CAJA, :NOMCAJA, :MONTO, :ANULADO
        DO
        if ((IDCAJA = 0) or (IDCAJA = CAJA)) then
            if ((ANULADOS = 'S') or (ANULADO = 'N')) then
                BEGIN
                if (ANULADO = 'S') then
                    BEGIN
                    FORMAPAGO = '';
                    FPBANCO = '';
                    FPCUENTA = '';
                    FPNUMERO = '';
                    FPFECHA = FECHA;
                    MONTO = 0;
                    DESCUENTO = 0;
                    RTFTE = 0;
                    RTIVA = 0;
                    RTICA = 0;
                    MONTOCAJA = 0;
                    montocheq = 0;
                    SUSPEND;
                    END
                ELSE
                    BEGIN
                    NUMREL = '';
                    if (DETALLE = 'S') then
                        BEGIN
                        FOR SELECT FOPA_NOM, CDSA_BANCO, CDSA_CUENTA, CDSA_NUMERO, CDSA_FECHA, CDSA_MONTO * -1
                            FROM CAMBIODOC_SALIDAS D, FORMAS_PAGO F
                            WHERE F.FOPA_ID = D.FOPA_ID AND CADO_ID = :ID
                            ORDER BY CDSA_ITEM
                            INTO :FORMAPAGO, :FPBANCO, :FPCUENTA, :FPNUMERO, :FPFECHA, :MONTO
                            DO
                            BEGIN
                            if (FORMAPAGO = 'EFECTIVO') then
                                BEGIN
                                MONTOCAJA = MONTO;
                                MONTOCHEQ = 0;
                                END
                            ELSE
                                BEGIN
                                MONTOCHEQ = MONTO;
                                MONTOCAJA = 0;
                                END
                            END
                        FOR SELECT FOPA_NOM, CDEN_BANCO, CDEN_CUENTA, CDEN_NUMERO, CDEN_FECHA, CDEN_MONTO
                            FROM CAMBIODOC_ENTRADAS D, FORMAS_PAGO F
                            WHERE F.FOPA_ID = D.FOPA_ID AND CADO_ID = :ID
                            ORDER BY CDEN_ITEM
                            INTO :FORMAPAGO, :FPBANCO, :FPCUENTA, :FPNUMERO, :FPFECHA, :MONTO
                            DO
                            BEGIN
                            if (FORMAPAGO = 'EFECTIVO') then
                                BEGIN
                                MONTOCAJA = MONTO;
                                MONTOCHEQ = 0;
                                END
                            ELSE
                                BEGIN
                                MONTOCHEQ = MONTO;
                                MONTOCAJA = 0;
                                END
                            SUSPEND;
                            END
                        END
                    ELSE
                        BEGIN
                        SELECT SUM(CDSA_MONTO) FROM CAMBIODOC_SALIDAS
                            WHERE FOPA_ID = 1 AND CADO_ID = :ID INTO :MONTO;
                        if (MONTO IS NULL) then
                            MONTO = 0;
                        SELECT SUM(CDEN_MONTO) FROM CAMBIODOC_ENTRADAS
                            WHERE FOPA_ID = 1 AND CADO_ID = :ID INTO :MONTOCAJA;
                        if (MONTOCAJA IS NULL) then
                            MONTOCAJA = 0;
                        MONTOCAJA = MONTO + MONTOCAJA;
                        MONTO = 0;
                        SELECT SUM(CDSA_MONTO) FROM CAMBIODOC_SALIDAS
                            WHERE FOPA_ID <> 1 AND CADO_ID = :ID INTO :MONTO;
                        if (MONTO IS NULL) then
                            MONTO = 0;
                        SELECT SUM(CDEN_MONTO) FROM CAMBIODOC_ENTRADAS
                            WHERE FOPA_ID <> 1 AND CADO_ID = :ID INTO :MONTOCHEQ;
                        if (MONTOCHEQ IS NULL) then
                            MONTOCHEQ = 0;
                        MONTOCHEQ = MONTO + MONTOCHEQ;
                        MONTO = MONTOCAJA + MONTOCHEQ;
                        SUSPEND;
                        END
                    END
                END
    END
if (BIN_AND(TIPO, 8) <> 0) then
    BEGIN
    IDCAJA = CAST(CODCAJA AS INTEGER);
    /* CONSIGNA TARJETAS */
    FOR SELECT COTJ_ID, TIDO_NOMLARGO, PREF_PRE, COTJ_NUMERO, COTJ_FECHA, '', '', J.CAJA_ID, CAJA_NOMBRE, COTJ_ANULADO
        FROM CONSIGNA_TARJETAS J, TIPO_DOCUMENTO T, CAJAS C
        WHERE J.CAJA_ID = C.CAJA_ID AND T.TIDO_COD = 64 AND PREF_PRE >= :PREFINI AND PREF_PRE <= :PREFFIN AND COTJ_NUMERO >= :NUMINI AND COTJ_NUMERO <= :NUMFIN
         AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
        ORDER BY PREF_PRE, COTJ_NUMERO
        INTO :ID, :NOMTIPO, :PREFIJO, :NUMERO, :FECHA, :CONCEPTO, :BENEFICIARIO, :CAJA, :NOMCAJA, :ANULADO
        DO
          BEGIN
          if ((ANULADOS = 'S') or (ANULADO = 'N')) then
            BEGIN
            if (ANULADO = 'S') then
                BEGIN
                FORMAPAGO = '';
                FPBANCO = '';
                FPCUENTA = '';
                FPNUMERO = '';
                FPFECHA = FECHA;
                MONTO = 0;
                DESCUENTO = 0;
                RTFTE = 0;
                RTIVA = 0;
                RTICA = 0;
                MONTOCAJA = 0;
                montocheq = 0;
                SUSPEND;
                END
            ELSE
                BEGIN
                MONTOCAJA = 0;
                MONTOCHEQ = MONTO;
                NUMREL = '';
                SELECT SUM(CTJD_BASE), SUM(CTJD_RTFTEMONTO), SUM(CTJD_RTIVAMONTO), SUM(CTJD_COMIMONTO)
                    FROM CONSIGNA_TARJETAS_DET WHERE COTJ_ID = :ID
                    INTO :MONTO, :RTFTE, :RTIVA, :DESCUENTO;
                if ((IDCAJA = 0) or (IDCAJA = CAJA)) then
                    BEGIN
                    if (DETALLE = 'S') then
                        BEGIN
                        FOR SELECT 'TARJETA', TARJ_COD, CTJD_NROTJ, CTJD_COMPROB, :FECHA, CTJD_BASE
                            FROM CONSIGNA_TARJETAS_DET D
                            WHERE COTJ_ID = :ID
                            ORDER BY CTJD_ITEM
                            INTO :FORMAPAGO, :FPBANCO, :FPCUENTA, :FPNUMERO, :FPFECHA, :MONTO
                            DO
                            BEGIN
                            if (FORMAPAGO = 'EFECTIVO') then
                                BEGIN
                                MONTOCAJA = MONTO;
                                MONTOCHEQ = 0;
                                END
                            ELSE
                                BEGIN
                                MONTOCHEQ = MONTO;
                                MONTOCAJA = 0;
                                END
                            SUSPEND;
                            END
                        END
                    ELSE
                        BEGIN
                        MONTOCAJA = 0;
                        MONTOCHEQ = MONTO;
                        SUSPEND;
                        END
                    END
                END
            END
          END
    END
  if (BIN_AND(TIPO, 16) <> 0) then
    BEGIN
    IDCAJA = CAST(CODCAJA AS INTEGER);
    /* RECIBO PROVISIONAL */
    FOR SELECT RCPR_ID, TIDO_NOMLARGO, PREF_PRE, RCPR_NUMERO, RCPR_FECHA, RCPR_CONC, RCPR_NOMTERC, R.CAJA_ID, CAJA_NOMBRE, RCPR_MONTO, RCPR_DTOF, RCPR_RTFTE, RCPR_RTIVA, RCPR_RTICA, RCPR_ANULADO, RCPR_IDCRUCE
        FROM RECIBO_PROVISIONAL R, TIPO_DOCUMENTO T, CAJAS C
        WHERE C.CAJA_ID = R.CAJA_ID AND T.TIDO_COD = 65  AND PREF_PRE >= :PREFINI AND PREF_PRE <= :PREFFIN AND RCPR_NUMERO >= :NUMINI AND RCPR_NUMERO <= :NUMFIN
         AND ((R.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
        ORDER BY PREF_PRE, RCPR_NUMERO
        INTO :ID, :NOMTIPO, :PREFIJO, :NUMERO, :FECHA, :CONCEPTO, :BENEFICIARIO, :CAJA, :NOMCAJA, :MONTO, :DESCUENTO, :RTFTE, :RTIVA, :RTICA, :ANULADO, :IDCRUCE
        DO
          if ((IDCAJA = 0) or (IDCAJA = CAJA)) then
            BEGIN
            if ((ANULADOS = 'S') or (ANULADO = 'N')) then
                if (ANULADO = 'S') then
                    BEGIN
                    FORMAPAGO = '';
                    FPBANCO = '';
                    FPCUENTA = '';
                    FPNUMERO = '';
                    FPFECHA = FECHA;
                    MONTO = 0;
                    DESCUENTO = 0;
                    RTFTE = 0;
                    RTIVA = 0;
                    RTICA = 0;
                    MONTOCAJA = 0;
                    montocheq = 0;
                    SUSPEND;
                    END
                ELSE
                    BEGIN
                    if (IDCRUCE <> 0) then
                        SELECT PREF_PRE || RECA_NUMERO FROM RECIBOS_CAJA WHERE RECA_ID = :idcruce INTO :NUMREL;
                    else
                        NUMREL = '';
                    if (DETALLE = 'S') then
                        FOR SELECT FOPA_NOM, RPPA_BANCO, RPPA_CUENTA, RPPA_NUMERO, RPPA_FECHA, RPPA_MONTO
                            FROM RECIBO_PROVISIONAL_PAGO D, FORMAS_PAGO F
                            WHERE F.FOPA_ID = D.FOPA_ID AND RCPR_ID = :ID
                            ORDER BY RPPA_ITEM
                            INTO :FORMAPAGO, :FPBANCO, :FPCUENTA, :FPNUMERO, :FPFECHA, :MONTO
                            DO
                            BEGIN
                            if (FORMAPAGO = 'EFECTIVO') then
                                BEGIN
                                MONTOCAJA = MONTO;
                                MONTOCHEQ = 0;
                                END
                            ELSE
                                BEGIN
                                MONTOCHEQ = MONTO;
                                MONTOCAJA = 0;
                                END
                            SUSPEND;
                            END
                    ELSE
                        BEGIN
                        SELECT SUM(RPPA_MONTO) FROM RECIBO_PROVISIONAL_PAGO
                            WHERE FOPA_ID = 1 AND RCPR_ID = :ID INTO :MONTOCAJA;
                        if (MONTOCAJA IS NULL) then
                            MONTOCAJA = 0;
                        SELECT SUM(RPPA_MONTO) FROM RECIBO_PROVISIONAL_PAGO
                            WHERE FOPA_ID <> 1 AND RCPR_ID = :ID INTO :MONTOCHEQ;
                        if (MONTOCHEQ IS NULL) then
                            MONTOCHEQ = 0;
                        MONTO = MONTOCAJA + MONTOCHEQ;
                        SUSPEND;
                        END
                    END
            END
    END
if (BIN_AND(TIPO, 32) <> 0) then
    BEGIN
    IDCAJA = CAST(CODCAJA AS INTEGER);
    /* TRASLADOS */
    FOR SELECT TRCJ_ID, TIDO_NOMLARGO, PREF_PRE, TRCJ_NUMERO, TRCJ_FECHA, TRCJ_CONC, C2.CAJA_NOMBRE, C.CAJA_ID, C.CAJA_NOMBRE, TRCJ_ANULADO
        FROM TRASLADOS_CAJA TR, TIPO_DOCUMENTO T, CAJAS C, CAJAS C2
        WHERE TR.CAJA_ID = C.CAJA_ID AND T.TIDO_COD = 66  AND PREF_PRE >= :PREFINI AND PREF_PRE <= :PREFFIN AND TRCJ_NUMERO >= :NUMINI AND TRCJ_NUMERO <= :NUMFIN AND C2.CAJA_ID = TRCJ_DESTINO
         AND ((C.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
        ORDER BY PREF_PRE, TRCJ_NUMERO
        INTO :ID, :NOMTIPO, :PREFIJO, :NUMERO, :FECHA, :CONCEPTO, :BENEFICIARIO, :CAJA, :NOMCAJA, :ANULADO
        DO
          if ((IDCAJA = 0) or (IDCAJA = CAJA)) then
            if ((ANULADOS = 'S') or (ANULADO = 'N')) then
            BEGIN
            if (ANULADO = 'S') then
                BEGIN
                FORMAPAGO = '';
                FPBANCO = '';
                FPCUENTA = '';
                FPNUMERO = '';
                FPFECHA = FECHA;
                MONTO = 0;
                DESCUENTO = 0;
                RTFTE = 0;
                RTIVA = 0;
                RTICA = 0;
                MONTOCAJA = 0;
                montocheq = 0;
                SUSPEND;
                END
            ELSE
                BEGIN
                NUMREL = '';
                if (DETALLE = 'S') then
                    FOR SELECT FOPA_NOM, TRCD_BANCO, TRCD_CUENTA, TRCD_NUMERO, TRCD_FECHA, TRCD_MONTO
                        FROM TRASLADOS_CAJA_DET D, FORMAS_PAGO F
                        WHERE F.FOPA_ID = D.FOPA_ID AND TRCJ_ID = :ID
                        ORDER BY TRCD_ITEM
                        INTO :FORMAPAGO, :FPBANCO, :FPCUENTA, :FPNUMERO, :FPFECHA, :MONTO
                        DO
                        BEGIN
                        if (FORMAPAGO = 'EFECTIVO') then
                            BEGIN
                            MONTOCAJA = MONTO;
                            MONTOCHEQ = 0;
                            END
                        ELSE
                            BEGIN
                            MONTOCHEQ = MONTO;
                            MONTOCAJA = 0;
                            END
                        SUSPEND;
                        END
                ELSE
                    BEGIN
                    SELECT SUM(TRCD_MONTO) FROM TRASLADOS_CAJA_DET D
                        WHERE TRCJ_ID = :ID AND FOPA_ID = 1 INTO :MONTOCAJA;
                    if (MONTOCAJA IS NULL) then
                        MONTOCAJA = 0;
                    SELECT SUM(TRCD_MONTO) FROM TRASLADOS_CAJA_DET D
                        WHERE TRCJ_ID = :ID AND FOPA_ID <> 1 INTO :MONTOCHEQ;
                    if (MONTOCHEQ IS NULL) then
                        MONTOCHEQ = 0;
                    MONTO = MONTOCAJA + MONTOCHEQ;
                    SUSPEND;
                    END
                END
            END
    END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER PROCEDURE REP_COMPROBANTES_CAJA(
    TIPO INTEGER,
    FECINI DATE,
    FECFIN DATE,
    PREF_INI VARCHAR(4),
    PREF_FIN VARCHAR(4),
    CODCAJA VARCHAR(4),
    DETALLE CHAR(1),
    ANULADOS CHAR(1),
    SUBEMPRESA INTEGER)
RETURNS (
    NOMTIPO VARCHAR(30),
    CAJA INTEGER,
    NOMCAJA VARCHAR(60),
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(8),
    FECHA DATE,
    CONCEPTO VARCHAR(60),
    BENEFICIARIO VARCHAR(60),
    NUMREL VARCHAR(10),
    MONTO NUMERIC(18,2),
    DESCUENTO NUMERIC(18,2),
    RTFTE NUMERIC(18,2),
    RTIVA NUMERIC(18,2),
    RTICA NUMERIC(18,2),
    FORMAPAGO VARCHAR(30),
    FPBANCO VARCHAR(3),
    FPCUENTA VARCHAR(20),
    FPNUMERO VARCHAR(20),
    FPFECHA DATE,
    ANULADO CHAR(1),
    MONTOCAJA NUMERIC(18,2),
    MONTOCHEQ NUMERIC(18,2))
AS
declare variable ID INTEGER;
declare variable IDCAJA INTEGER;
declare variable NUMROWS INTEGER;
declare variable IDCRUCE INTEGER;
BEGIN
if (BIN_AND(TIPO, 1) <> 0) then
    BEGIN
    /* RECIBO CAJA */
    IDCAJA = CAST(CODCAJA AS INTEGER);
    FOR SELECT RECA_ID, TIDO_NOMLARGO, PREF_PRE, RECA_NUMERO, RECA_FECHA, RECA_CONC, RECA_NOMTERC, R.CAJA_ID, CAJA_NOMBRE, RECA_MONTO, RECA_DTOF, RECA_RTFTEMONTO, RECA_RTIVAMONTO, RECA_RTICAMONTO, RECA_ANULADO, RECA_PROVISIONAL
        FROM RECIBOS_CAJA R, TIPO_DOCUMENTO T, CAJAS C
        WHERE C.CAJA_ID = R.CAJA_ID AND T.TIDO_COD = 61 AND RECA_FECHA >= :FECINI AND RECA_FECHA <= :FECFIN AND ((:PREF_INI IS NULL) or (:PREF_INI = '') or (PREF_PRE >= :PREF_INI AND PREF_PRE <=:PREF_FIN)) AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
        ORDER BY RECA_FECHA, RECA_ID
        INTO :ID, :NOMTIPO, :PREFIJO, :NUMERO, :FECHA, :CONCEPTO, :BENEFICIARIO, :CAJA, :NOMCAJA, :MONTO, :DESCUENTO, :RTFTE, :RTIVA, :RTICA, :ANULADO, :numrel
        DO
        if ((IDCAJA = 0) or (IDCAJA = CAJA)) then
            BEGIN
            if ((ANULADOS = 'S') or (ANULADO = 'N')) then
              BEGIN
              if (ANULADO = 'S') then
                BEGIN
                FORMAPAGO = '';
                FPBANCO = '';
                FPCUENTA = '';
                FPNUMERO = '';
                FPFECHA = FECHA;
                MONTO = 0;
                DESCUENTO = 0;
                RTFTE = 0;
                RTIVA = 0;
                RTICA = 0;
                MONTOCAJA = 0;
                montocheq = 0;
                SUSPEND;
                END
              ELSE
                BEGIN
                if (numrel is null) then
                    numrel = '';
                if (DETALLE = 'S') then
                    FOR SELECT FOPA_NOM, RCPA_BANCO, RCPA_CUENTA, RCPA_NUMERO, RCPA_FECHA, RCPA_MONTO
                        FROM RECIBOS_CAJA_PAGO D, FORMAS_PAGO F
                        WHERE F.FOPA_ID = D.FOPA_ID AND RECA_ID = :ID
                        ORDER BY RCPA_ITEM
                        INTO :FORMAPAGO, :FPBANCO, :FPCUENTA, :FPNUMERO, :FPFECHA, :MONTO
                        DO
                        BEGIN
                        if (FORMAPAGO = 'EFECTIVO') then
                            BEGIN
                            MONTOCAJA = MONTO;
                            MONTOCHEQ = 0;
                            END
                        ELSE
                            BEGIN
                            MONTOCHEQ = MONTO;
                            MONTOCAJA = 0;
                            END
                        SUSPEND;
                        END
                ELSE
                    BEGIN
                    SELECT SUM(RCPA_MONTO) FROM RECIBOS_CAJA_PAGO 
                        WHERE FOPA_ID = 1 AND RECA_ID = :ID INTO :MONTOCAJA;
                    SELECT SUM(RCPA_MONTO) FROM RECIBOS_CAJA_PAGO 
                        WHERE FOPA_ID <> 1 AND RECA_ID = :ID INTO :MONTOCHEQ;
                    SUSPEND;
                    END
                END
              END
            END
    END
if (BIN_AND(TIPO, 2) <> 0) then
    BEGIN
    /* EGRESO */
    FOR SELECT EGRE_ID, TIDO_NOMLARGO, E.PREF_PRE, EGRE_NUMERO, EGRE_FECHA, EGRE_CONC, EGRE_NOMTERC, EGRE_MONTO, EGRE_DTOF, EGRE_RTFTEMONTO, EGRE_RTIVAMONTO, EGRE_RTICAMONTO, EGRE_ANULADO
        FROM EGRESOS E, TIPO_DOCUMENTO T, PREFIJOS P
        WHERE T.TIDO_COD = 62 AND EGRE_FECHA >= :FECINI AND EGRE_FECHA <= :FECFIN AND ((:PREF_INI IS NULL) or (:PREF_INI = '') or (E.PREF_PRE >= :PREF_INI AND E.PREF_PRE <=:PREF_FIN)) AND P.PREF_PRE = E.PREF_PRE AND P.TIDO_COD = 62 AND ((P.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
        ORDER BY EGRE_FECHA, EGRE_ID
        INTO :ID, :NOMTIPO, :PREFIJO, :NUMERO, :FECHA, :CONCEPTO, :BENEFICIARIO, :MONTO, :DESCUENTO, :RTFTE, :RTIVA, :RTICA, :ANULADO
        do
            BEGIN
            if ((ANULADOS = 'S') or (ANULADO = 'N')) then
                BEGIN
                if (ANULADO = 'S') then
                    BEGIN
                    FORMAPAGO = '';
                    FPBANCO = '';
                    FPCUENTA = '';
                    FPNUMERO = '';
                    FPFECHA = FECHA;
                    MONTO = 0;
                    DESCUENTO = 0;
                    RTFTE = 0;
                    RTIVA = 0;
                    RTICA = 0;
                    MONTOCAJA = 0;
                    montocheq = 0;
                    SUSPEND;
                    END
                ELSE
                    BEGIN
                    NUMREL = '';
                    SELECT COUNT(EGCA_ITEM), MAX(CAJA_ID) FROM EGRESOS_CAJA
                        WHERE EGRE_ID = :ID INTO :NUMROWS, :CAJA;
                    MONTOCAJA = 0;
                    MONTOCHEQ = 0;
                    if (NUMROWS > 0) then
                        BEGIN
                        /* ES DE CAJA */
                        IDCAJA = CAST(CODCAJA AS INTEGER);
                        if ((IDCAJA = 0) or (IDCAJA = CAJA)) then
                            BEGIN
                            if (DETALLE = 'S') then
                                FOR SELECT FOPA_NOM, EGCA_BANCO, EGCA_CUENTA, EGCA_NUMERO, EGCA_FECHA, EGCA_MONTO
                                    FROM EGRESOS_CAJA D, FORMAS_PAGO F
                                    WHERE F.FOPA_ID = D.FOPA_ID AND EGRE_ID = :ID
                                    ORDER BY EGCA_ITEM
                                    INTO :FORMAPAGO, :FPBANCO, :FPCUENTA, :FPNUMERO, :FPFECHA, :MONTOCAJA
                                    DO
                                    SUSPEND;
                            ELSE
                                BEGIN
                                SELECT SUM(EGCA_MONTO) FROM EGRESOS_CAJA
                                    WHERE EGRE_ID = :ID INTO :MONTOCAJA;
                                if (MONTOCAJA IS NULL) then
                                    MONTOCAJA = 0;
                                END
                            END
                        END
                    /* ES DE BANCO */
                    IDCAJA = 0;
                    SELECT CUBA_COD FROM CUENTAS_BANCO WHERE CUBA_CODCTA = :CODCAJA INTO :IDCAJA;
                    SELECT CUBA_COD, SUBSTR(EGBC_NUMERO,1,10) FROM EGRESOS_BANCO WHERE EGRE_ID = :ID INTO :CAJA, :NUMREL;
                    if ((IDCAJA = 0) or (IDCAJA = CAJA)) then
                        BEGIN
                        if (DETALLE = 'S') then
                            begin
                            MONTOCAJA = 0;
                            FOR SELECT TIDO_NOMCORTO, CUBA_CODCTA, CUBA_NUMERO, EGBC_NUMERO, EGBC_FECHA, EGBC_MONTO
                                FROM EGRESOS_BANCO E, TIPO_DOCUMENTO T, CUENTAS_BANCO C
                                WHERE E.EGRE_ID = :ID AND E.EGBC_TIPOBCO = T.TIDO_COD AND E.CUBA_COD = C.CUBA_COD
                                INTO :FORMAPAGO, :FPBANCO, :FPCUENTA, :FPNUMERO, :FPFECHA, :MONTOCHEQ
                                DO
                                SUSPEND;
                            END
                        ELSE
                            BEGIN
                            SELECT SUM(EGBC_MONTO) FROM EGRESOS_BANCO WHERE EGRE_ID = :ID INTO :MONTOCHEQ;
                            if (MONTOCHEQ IS NULL) then
                                MONTOCHEQ = 0;
                            END
                        END
                    if (detalle = 'N') then
                        SUSPEND;
                    END
                END
            END
    END
if (BIN_AND(TIPO, 4) <> 0) then
    BEGIN
    IDCAJA = CAST(CODCAJA AS INTEGER);
    NUMREL = '';
    /* CAMBIO DOC */
    FOR SELECT CADO_ID, TIDO_NOMLARGO, PREF_PRE, CADO_NUMERO, CADO_FECHA, CADO_CONC, '', D.CAJA_ID, CAJA_NOMBRE, 0, CADO_ANULADO
        FROM CAMBIO_DOCUMENTOS D, TIPO_DOCUMENTO T, CAJAS C
        WHERE D.CAJA_ID = C.CAJA_ID AND T.TIDO_COD = 63 AND CADO_FECHA >= :FECINI AND CADO_FECHA <= :FECFIN AND ((:PREF_INI IS NULL) or (:PREF_INI = '') or (PREF_PRE >= :PREF_INI AND PREF_PRE <=:PREF_FIN)) AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
        ORDER BY CADO_FECHA, CADO_ID
        INTO :ID, :NOMTIPO, :PREFIJO, :NUMERO, :FECHA, :CONCEPTO, :BENEFICIARIO, :CAJA, :NOMCAJA, :MONTO, :ANULADO
        DO
          if ((IDCAJA = 0) or (IDCAJA = CAJA)) then
            BEGIN
            if ((ANULADOS = 'S') or (ANULADO = 'N')) then
            if (ANULADO = 'S') then
                BEGIN
                FORMAPAGO = '';
                FPBANCO = '';
                FPCUENTA = '';
                FPNUMERO = '';
                FPFECHA = FECHA;
                MONTO = 0;
                DESCUENTO = 0;
                RTFTE = 0;
                RTIVA = 0;
                RTICA = 0;
                MONTOCAJA = 0;
                montocheq = 0;
                SUSPEND;
                END
            ELSE
                BEGIN
                if (DETALLE = 'S') then
                    BEGIN
                    FOR SELECT FOPA_NOM, CDSA_BANCO, CDSA_CUENTA, CDSA_NUMERO, CDSA_FECHA, CDSA_MONTO * -1
                        FROM CAMBIODOC_SALIDAS D, FORMAS_PAGO F
                        WHERE F.FOPA_ID = D.FOPA_ID AND CADO_ID = :ID
                        ORDER BY CDSA_ITEM
                        INTO :FORMAPAGO, :FPBANCO, :FPCUENTA, :FPNUMERO, :FPFECHA, :MONTO
                        DO
                        BEGIN
                        if (FORMAPAGO = 'EFECTIVO') then
                            BEGIN
                            MONTOCAJA = MONTO;
                            MONTOCHEQ = 0;
                            END
                        ELSE
                            BEGIN
                            MONTOCHEQ = MONTO;
                            MONTOCAJA = 0;
                            END
                        SUSPEND;
                        END
                    FOR SELECT FOPA_NOM, CDEN_BANCO, CDEN_CUENTA, CDEN_NUMERO, CDEN_FECHA, CDEN_MONTO
                        FROM CAMBIODOC_ENTRADAS D, FORMAS_PAGO F
                        WHERE F.FOPA_ID = D.FOPA_ID AND CADO_ID = :ID
                        ORDER BY CDEN_ITEM
                        INTO :FORMAPAGO, :FPBANCO, :FPCUENTA, :FPNUMERO, :FPFECHA, :MONTO
                        DO
                        BEGIN
                        if (FORMAPAGO = 'EFECTIVO') then
                            BEGIN
                            MONTOCAJA = MONTO;
                            MONTOCHEQ = 0;
                            END
                        ELSE
                            BEGIN
                            MONTOCHEQ = MONTO;
                            MONTOCAJA = 0;
                            END
                        SUSPEND;
                        END
                    END
                ELSE
                    BEGIN
                    SELECT SUM(CDSA_MONTO) FROM CAMBIODOC_SALIDAS
                        WHERE FOPA_ID = 1 AND CADO_ID = :ID INTO :MONTO;
                    if (MONTO IS NULL) then
                        MONTO = 0;
                    SELECT SUM(CDEN_MONTO) FROM CAMBIODOC_ENTRADAS
                        WHERE FOPA_ID = 1 AND CADO_ID = :ID INTO :MONTOCAJA;
                    if (MONTOCAJA IS NULL) then
                        MONTOCAJA = 0;
                    MONTOCAJA = MONTO + MONTOCAJA;
                    MONTO = 0;
                    SELECT SUM(CDSA_MONTO) FROM CAMBIODOC_SALIDAS
                        WHERE FOPA_ID <> 1 AND CADO_ID = :ID INTO :MONTO;
                    if (MONTO IS NULL) then
                        MONTO = 0;
                    SELECT SUM(CDEN_MONTO) FROM CAMBIODOC_ENTRADAS
                        WHERE FOPA_ID <> 1 AND CADO_ID = :ID INTO :MONTOCHEQ;
                    if (MONTOCHEQ IS NULL) then
                        MONTOCHEQ = 0;
                    MONTOCHEQ = MONTO + MONTOCHEQ;
                    MONTO = MONTOCAJA + MONTOCHEQ;
                    SUSPEND;
                    END
                END
            END
    END
if (BIN_AND(TIPO, 8) <> 0) then
    BEGIN
    IDCAJA = CAST(CODCAJA AS INTEGER);
    NUMREL = '';
    /* CONSIGNA TARJETAS */
    FOR SELECT COTJ_ID, TIDO_NOMLARGO, PREF_PRE, COTJ_NUMERO, COTJ_FECHA, '', '', J.CAJA_ID, CAJA_NOMBRE, COTJ_ANULADO
        FROM CONSIGNA_TARJETAS J, TIPO_DOCUMENTO T, CAJAS C
        WHERE J.CAJA_ID = C.CAJA_ID AND T.TIDO_COD = 64 AND COTJ_FECHA >= :FECINI AND COTJ_FECHA <= :FECFIN AND ((:PREF_INI IS NULL) or (:PREF_INI = '') or (PREF_PRE >= :PREF_INI AND PREF_PRE <=:PREF_FIN)) AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
        ORDER BY COTJ_FECHA, COTJ_ID
        INTO :ID, :NOMTIPO, :PREFIJO, :NUMERO, :FECHA, :CONCEPTO, :BENEFICIARIO, :CAJA, :NOMCAJA, :ANULADO
        DO
          BEGIN
          SELECT SUM(CTJD_BASE), SUM(CTJD_RTFTEMONTO), SUM(CTJD_RTIVAMONTO), SUM(CTJD_COMIMONTO)
            FROM CONSIGNA_TARJETAS_DET WHERE COTJ_ID = :ID
            INTO :MONTO, :RTFTE, :RTIVA, :DESCUENTO;
          if ((IDCAJA = 0) or (IDCAJA = CAJA)) then
            BEGIN
            MONTOCAJA = 0;
            MONTOCHEQ = MONTO;
            if ((ANULADOS = 'S') or (ANULADO = 'N')) then
            if (ANULADO = 'S') then
                BEGIN
                FORMAPAGO = '';
                FPBANCO = '';
                FPCUENTA = '';
                FPNUMERO = '';
                FPFECHA = FECHA;
                MONTO = 0;
                DESCUENTO = 0;
                RTFTE = 0;
                RTIVA = 0;
                RTICA = 0;
                MONTOCAJA = 0;
                montocheq = 0;
                SUSPEND;
                END
            ELSE
                BEGIN
                if (DETALLE = 'S') then
                    BEGIN
                    FOR SELECT 'TARJETA', TARJ_COD, CTJD_NROTJ, CTJD_COMPROB, :FECHA, CTJD_BASE
                        FROM CONSIGNA_TARJETAS_DET D
                        WHERE COTJ_ID = :ID
                        ORDER BY CTJD_ITEM
                        INTO :FORMAPAGO, :FPBANCO, :FPCUENTA, :FPNUMERO, :FPFECHA, :MONTO
                        DO
                        BEGIN
                        if (FORMAPAGO = 'EFECTIVO') then
                            BEGIN
                            MONTOCAJA = MONTO;
                            MONTOCHEQ = 0;
                            END
                        ELSE
                            BEGIN
                            MONTOCHEQ = MONTO;
                            MONTOCAJA = 0;
                            END
                        SUSPEND;
                        END
                    END
                ELSE
                    BEGIN
                    MONTOCAJA = 0;
                    MONTOCHEQ = MONTO;
                    SUSPEND;
                    END
                END
            END
          END
    END
if (BIN_AND(TIPO, 16) <> 0) then
    BEGIN
    IDCAJA = CAST(CODCAJA AS INTEGER);
    /* RECIBO PROVISIONAL */
    FOR SELECT RCPR_ID, TIDO_NOMLARGO, PREF_PRE, RCPR_NUMERO, RCPR_FECHA, RCPR_CONC, RCPR_NOMTERC, R.CAJA_ID, CAJA_NOMBRE, RCPR_MONTO, RCPR_DTOF, RCPR_RTFTE, RCPR_RTIVA, RCPR_RTICA, RCPR_ANULADO, RCPR_IDCRUCE
        FROM RECIBO_PROVISIONAL R, TIPO_DOCUMENTO T, CAJAS C
        WHERE C.CAJA_ID = R.CAJA_ID AND T.TIDO_COD = 65 AND RCPR_FECHA >= :FECINI AND RCPR_FECHA <= :FECFIN AND ((:PREF_INI IS NULL) or (:PREF_INI = '') or (PREF_PRE >= :PREF_INI AND PREF_PRE <=:PREF_FIN)) AND ((R.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
        ORDER BY RCPR_FECHA, RCPR_ID
        INTO :ID, :NOMTIPO, :PREFIJO, :NUMERO, :FECHA, :CONCEPTO, :BENEFICIARIO, :CAJA, :NOMCAJA, :MONTO, :DESCUENTO, :RTFTE, :RTIVA, :RTICA, :ANULADO, :IDCRUCE
        DO
        if ((IDCAJA = 0) or (IDCAJA = CAJA)) then
            BEGIN
            if ((ANULADOS = 'S') or (ANULADO = 'N')) then
              if (ANULADO = 'S') then
                BEGIN
                FORMAPAGO = '';
                FPBANCO = '';
                FPCUENTA = '';
                FPNUMERO = '';
                FPFECHA = FECHA;
                MONTO = 0;
                DESCUENTO = 0;
                RTFTE = 0;
                RTIVA = 0;
                RTICA = 0;
                MONTOCAJA = 0;
                montocheq = 0;
                SUSPEND;
                END
              ELSE
                BEGIN
                if (IDCRUCE <> 0) then
                    SELECT PREF_PRE || RECA_NUMERO FROM RECIBOS_CAJA WHERE RECA_ID = :idcruce INTO :NUMREL;
                else
                    NUMREL = '';
                if (DETALLE = 'S') then
                    FOR SELECT FOPA_NOM, RPPA_BANCO, RPPA_CUENTA, RPPA_NUMERO, RPPA_FECHA, RPPA_MONTO
                        FROM RECIBO_PROVISIONAL_PAGO D, FORMAS_PAGO F
                        WHERE F.FOPA_ID = D.FOPA_ID AND RCPR_ID = :ID
                        ORDER BY RPPA_ITEM
                        INTO :FORMAPAGO, :FPBANCO, :FPCUENTA, :FPNUMERO, :FPFECHA, :MONTO
                        DO
                        BEGIN
                        if (FORMAPAGO = 'EFECTIVO') then
                            BEGIN
                            MONTOCAJA = MONTO;
                            MONTOCHEQ = 0;
                            END
                        ELSE
                            BEGIN
                            MONTOCHEQ = MONTO;
                            MONTOCAJA = 0;
                            END
                        SUSPEND;
                        END
                ELSE
                    BEGIN
                    SELECT SUM(RPPA_MONTO) FROM RECIBO_PROVISIONAL_PAGO
                        WHERE FOPA_ID = 1 AND RCPR_ID = :ID INTO :MONTOCAJA;
                    if (MONTOCAJA IS NULL) then
                        MONTOCAJA = 0;
                    SELECT SUM(RPPA_MONTO) FROM RECIBO_PROVISIONAL_PAGO
                        WHERE FOPA_ID <> 1 AND RCPR_ID = :ID INTO :MONTOCHEQ;
                    if (MONTOCHEQ IS NULL) then
                        MONTOCHEQ = 0;
                    MONTO = MONTOCAJA + MONTOCHEQ;
                    SUSPEND;
                    END
                END
            END
    END
if (BIN_AND(TIPO, 32) <> 0) then
    BEGIN
    IDCAJA = CAST(CODCAJA AS INTEGER);
    NUMREL = '';
    /* TRASLADOS */
    FOR SELECT TRCJ_ID, TIDO_NOMLARGO, PREF_PRE, TRCJ_NUMERO, TRCJ_FECHA, TRCJ_CONC, C2.CAJA_NOMBRE, C.CAJA_ID, C.CAJA_NOMBRE, TRCJ_ANULADO
        FROM TRASLADOS_CAJA TR, TIPO_DOCUMENTO T, CAJAS C, CAJAS C2
        WHERE TR.CAJA_ID = C.CAJA_ID AND T.TIDO_COD = 66 AND TRCJ_FECHA >= :FECINI AND TRCJ_FECHA <= :FECFIN AND C2.CAJA_ID = TRCJ_DESTINO AND ((:PREF_INI IS NULL) or (:PREF_INI = '') or (PREF_PRE >= :PREF_INI AND PREF_PRE <=:PREF_FIN)) AND ((C.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
        ORDER BY TRCJ_FECHA, TRCJ_ID
        INTO :ID, :NOMTIPO, :PREFIJO, :NUMERO, :FECHA, :CONCEPTO, :BENEFICIARIO, :CAJA, :NOMCAJA, :ANULADO
        DO
        if ((IDCAJA = 0) or (IDCAJA = CAJA)) then
            BEGIN
            if ((ANULADOS = 'S') or (ANULADO = 'N')) then
              if (ANULADO = 'S') then
                BEGIN
                FORMAPAGO = '';
                FPBANCO = '';
                FPCUENTA = '';
                FPNUMERO = '';
                FPFECHA = FECHA;
                MONTO = 0;
                DESCUENTO = 0;
                RTFTE = 0;
                RTIVA = 0;
                RTICA = 0;
                MONTOCAJA = 0;
                montocheq = 0;
                SUSPEND;
                END
              ELSE
                BEGIN
                if (DETALLE = 'S') then
                    FOR SELECT FOPA_NOM, TRCD_BANCO, TRCD_CUENTA, TRCD_NUMERO, TRCD_FECHA, TRCD_MONTO
                        FROM TRASLADOS_CAJA_DET D, FORMAS_PAGO F
                        WHERE F.FOPA_ID = D.FOPA_ID AND TRCJ_ID = :ID
                        ORDER BY TRCD_ITEM
                        INTO :FORMAPAGO, :FPBANCO, :FPCUENTA, :FPNUMERO, :FPFECHA, :MONTO
                        DO
                        BEGIN
                        if (FORMAPAGO = 'EFECTIVO') then
                            BEGIN
                            MONTOCAJA = MONTO;
                            MONTOCHEQ = 0;
                            END
                        ELSE
                            BEGIN
                            MONTOCHEQ = MONTO;
                            MONTOCAJA = 0;
                            END
                        SUSPEND;
                        END
                ELSE
                    BEGIN
                    SELECT SUM(TRCD_MONTO) FROM TRASLADOS_CAJA_DET D
                        WHERE TRCJ_ID = :ID AND FOPA_ID = 1 INTO :MONTOCAJA;
                    if (MONTOCAJA IS NULL) then
                        MONTOCAJA = 0;
                    SELECT SUM(TRCD_MONTO) FROM TRASLADOS_CAJA_DET D
                        WHERE TRCJ_ID = :ID AND FOPA_ID <> 1 INTO :MONTOCHEQ;
                    if (MONTOCHEQ IS NULL) then
                        MONTOCHEQ = 0;
                    MONTO = MONTOCAJA + MONTOCHEQ;
                    SUSPEND;
                    END
                END
            END
    END
END
^

SET TERM ; ^


/* 20090512C */
/* NO INCLUIA EL ULTIMO DIA DEL PERIODO EN LAS CONSULTA DE INVENTARIO */ 
SET TERM ^ ;

CREATE OR ALTER PROCEDURE MOVIMIENTO_ARTICULO_MES(
    ARTICULO VARCHAR(15),
    FECINI DATE,
    FECFIN DATE,
    BODEGA CHAR(2))
RETURNS (
    INICIAL NUMERIC(18,4),
    ENTC NUMERIC(18,4),
    SALC NUMERIC(18,4))
AS
BEGIN
  EXECUTE PROCEDURE SALDO_INICIAL_INVENTARIO(ARTICULO, FECINI, BODEGA) returning_values (INICIAL);
  SELECT SUM(MVAR_CANT) FROM MOVIMIENTO_ARTICULO
    WHERE (MVAR_FECHA >= :FECINI) AND (MVAR_FECHA <= :FECFIN) AND
          (ARTI_COD = :ARTICULO) AND (BODE_COD = :BODEGA) AND (MVAR_ENTRADA = 'S') INTO :ENTC;
  if (ENTC IS NULL) then
    ENTC = 0;
  SELECT SUM(MVAR_CANT) FROM MOVIMIENTO_ARTICULO
    WHERE (MVAR_FECHA >= :FECINI) AND (MVAR_FECHA <= :FECFIN) AND
          (ARTI_COD = :ARTICULO) AND (BODE_COD = :BODEGA) AND (MVAR_ENTRADA = 'N') INTO :SALC;
  if (SALC IS NULL) then
    SALC = 0;
  SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE MOVIMIENTO_TOTAL_ARTICULO_MES(
    ARTICULO VARCHAR(15),
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    INICIAL NUMERIC(18,4),
    ENTRADA NUMERIC(18,4),
    SALIDA NUMERIC(18,4))
AS
declare variable BOD CHAR(2);
declare variable INI NUMERIC(15,4);
declare variable ENTC NUMERIC(15,4);
declare variable SALC NUMERIC(15,4);
BEGIN /*$$IBE$$ 
  INICIAL = 0;
  ENTRADA = 0;
  SALIDA = 0;
  FOR SELECT BODE_COD FROM BODEGA INTO :BOD
  DO
    BEGIN
    EXECUTE PROCEDURE MOVIMIENTO_ARTICULO_MES(:ARTICULO, :FECINI, :FECFIN, :BOD) returning_values (INI, ENTC, SALC);
    INICIAL = INICIAL + INI;
    ENTRADA = ENTRADA + ENTC;
    SALIDA = SALIDA + SALC;
    END
  SUSPEND;
 $$IBE$$*/ SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE MOVIMIENTO_INVENTARIO_MES(
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    CODIGO VARCHAR(15),
    DESCRIPCION VARCHAR(60),
    CODGRP VARCHAR(2),
    CODSUBG VARCHAR(3),
    CODMARCA VARCHAR(3),
    UNIDAD VARCHAR(8),
    IVA NUMERIC(9,2),
    INICIAL NUMERIC(18,4),
    ENTRADA NUMERIC(18,4),
    SALIDA NUMERIC(18,4),
    FINAL NUMERIC(18,4))
AS
BEGIN /*$$IBE$$ 
  for select arti_cod, arti_des, GRUP_COD, SUBG_COD, MARC_COD, ARTI_UNIDAD, TAIV_PORC
    from articulo A, tarifa_iva T where A.taiv_cod = T.taiv_cod AND substring(arti_cod from 1 FOR 2) <> '.t'
    into :CODIGO, :DESCRIPCION, :CODGRP, :CODSUBG, :codmarca, :UNIDAD, :IVA
  DO
    BEGIN
    EXECUTE PROCEDURE MOVIMIENTO_TOTAL_ARTICULO_MES(CODIGO, FECINI, FECFIN) returning_values (:INICIAL, :ENTRADA, :SALIDA);
    FINAL = INICIAL + ENTRADA - SALIDA;
    SUSPEND;
    END
 $$IBE$$*/ SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE MOVIMIENTO_TOTAL_ARTICULO_MES(
    ARTICULO VARCHAR(15),
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    INICIAL NUMERIC(18,4),
    ENTRADA NUMERIC(18,4),
    SALIDA NUMERIC(18,4))
AS
declare variable BOD CHAR(2);
declare variable INI NUMERIC(15,4);
declare variable ENTC NUMERIC(15,4);
declare variable SALC NUMERIC(15,4);
BEGIN
  INICIAL = 0;
  ENTRADA = 0;
  SALIDA = 0;
  FOR SELECT BODE_COD FROM BODEGA INTO :BOD
  DO
    BEGIN
    EXECUTE PROCEDURE MOVIMIENTO_ARTICULO_MES(:ARTICULO, :FECINI, :FECFIN, :BOD) returning_values (INI, ENTC, SALC);
    INICIAL = INICIAL + INI;
    ENTRADA = ENTRADA + ENTC;
    SALIDA = SALIDA + SALC;
    END
  SUSPEND;
END

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE MOVIMIENTO_INVENTARIO_MES(
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    CODIGO VARCHAR(15),
    DESCRIPCION VARCHAR(60),
    CODGRP VARCHAR(2),
    CODSUBG VARCHAR(3),
    CODMARCA VARCHAR(3),
    UNIDAD VARCHAR(8),
    IVA NUMERIC(9,2),
    INICIAL NUMERIC(18,2),
    ENTRADA NUMERIC(18,2),
    SALIDA NUMERIC(18,2),
    FINAL NUMERIC(18,2))
AS
BEGIN
  for select arti_cod, arti_des, GRUP_COD, SUBG_COD, MARC_COD, ARTI_UNIDAD, TAIV_PORC
    from articulo A, tarifa_iva T where A.taiv_cod = T.taiv_cod AND substring(arti_cod from 1 FOR 2) <> '.t'
    into :CODIGO, :DESCRIPCION, :CODGRP, :CODSUBG, :codmarca, :UNIDAD, :IVA
  DO
    BEGIN
    EXECUTE PROCEDURE MOVIMIENTO_TOTAL_ARTICULO_MES(CODIGO, FECINI, FECFIN) returning_values (:INICIAL, :ENTRADA, :SALIDA);
    FINAL = INICIAL + ENTRADA - SALIDA;
    SUSPEND;
    END
END

^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER PROCEDURE KARDEX_ARTICULO_MES(
    ARTICULO VARCHAR(15),
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    INICIAL NUMERIC(18,2),
    ENTRADA NUMERIC(18,2),
    SALIDA NUMERIC(18,2))
AS
BEGIN
  EXECUTE PROCEDURE VALOR_INICIAL_INVENTARIO(ARTICULO, FECINI) returning_values (INICIAL);
  SELECT SUM(COST_ENTP) FROM COSTOS
    WHERE (COST_FECHA >= :FECINI) AND (COST_FECHA <= :FECFIN) AND
          (ARTI_COD = :ARTICULO) INTO :ENTRADA;
  if (ENTRADA IS NULL) then
    ENTRADA = 0;
  SELECT SUM(COST_SALP) FROM COSTOS
    WHERE (COST_FECHA >= :FECINI) AND (COST_FECHA <= :FECFIN) AND
          (ARTI_COD = :ARTICULO) INTO :SALIDA;
  if (SALIDA IS NULL) then
    SALIDA = 0;
  SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE KARDEX_INVENTARIO_MES(
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    CODIGO VARCHAR(15),
    DESCRIPCION VARCHAR(60),
    CODGRP VARCHAR(2),
    CODSUBG VARCHAR(3),
    CODMARCA VARCHAR(3),
    UNIDAD VARCHAR(8),
    IVA NUMERIC(9,2),
    INICIAL NUMERIC(18,2),
    ENTRADA NUMERIC(18,2),
    SALIDA NUMERIC(18,2),
    FINAL NUMERIC(18,2))
AS
BEGIN /*$$IBE$$ 
  for select arti_cod, arti_des, GRUP_COD, SUBG_COD, MARC_COD, ARTI_UNIDAD, TAIV_PORC
    from articulo A, tarifa_iva T where A.taiv_cod = T.taiv_cod AND substring(arti_cod from 1 FOR 2) <> '.t'
    into :CODIGO, :DESCRIPCION, :CODGRP, :CODSUBG, :codmarca, :UNIDAD, :IVA
  DO
    BEGIN
    EXECUTE PROCEDURE KARDEX_ARTICULO_MES(CODIGO, FECINI, FECFIN) returning_values (:INICIAL, :ENTRADA, :SALIDA);
    FINAL = INICIAL + ENTRADA - SALIDA;
    SUSPEND;
    END
 $$IBE$$*/ SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE KARDEX_INVENTARIO_MES(
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    CODIGO VARCHAR(15),
    DESCRIPCION VARCHAR(60),
    CODGRP VARCHAR(2),
    CODSUBG VARCHAR(3),
    CODMARCA VARCHAR(3),
    UNIDAD VARCHAR(8),
    IVA NUMERIC(9,2),
    INICIAL NUMERIC(18,2),
    ENTRADA NUMERIC(18,2),
    SALIDA NUMERIC(18,2),
    FINAL NUMERIC(18,2))
AS
BEGIN
  for select arti_cod, arti_des, GRUP_COD, SUBG_COD, MARC_COD, ARTI_UNIDAD, TAIV_PORC
    from articulo A, tarifa_iva T where A.taiv_cod = T.taiv_cod AND substring(arti_cod from 1 FOR 2) <> '.t'
    into :CODIGO, :DESCRIPCION, :CODGRP, :CODSUBG, :codmarca, :UNIDAD, :IVA
  DO
    BEGIN
    EXECUTE PROCEDURE KARDEX_ARTICULO_MES(CODIGO, FECINI, FECFIN) returning_values (:INICIAL, :ENTRADA, :SALIDA);
    FINAL = INICIAL + ENTRADA - SALIDA;
    SUSPEND;
    END
END

^

SET TERM ; ^

/* 20090512D */
/* ELIMINAR INDICES POR EL CAMPO ANULADO EMPEORAN EL RENDIMIENTO */
DROP INDEX NOTAS_DEBITO_PROVEEDOR_IDX2;
CREATE INDEX NOTAS_DEBITO_PROVEEDOR_IDX2
ON NOTAS_DEBITO_PROVEEDOR (NDPR_NUMERO);
DROP INDEX EGRESOS_IDX2;
CREATE INDEX EGRESOS_IDX2
ON EGRESOS (EGRE_NUMERO);
DROP INDEX AJUSTES_IDX1;
CREATE INDEX AJUSTES_IDX1
ON AJUSTES (AJUS_NUMERO);
DROP INDEX CAMBIO_DOCUMENTOS_IDX1;
CREATE INDEX CAMBIO_DOCUMENTOS_IDX1
ON CAMBIO_DOCUMENTOS (CADO_NUMERO);
DROP INDEX CONSIGNA_IDX1;
CREATE INDEX CONSIGNA_IDX1
ON CONSIGNA (PRBA_PREF,CONS_NUMERO);
CREATE INDEX CONSIGNA_IDX2
ON CONSIGNA (CUBA_COD);
DROP INDEX CONSIGNA_TARJETAS_IDX2;
CREATE INDEX CONSIGNA_TARJETAS_IDX2
ON CONSIGNA_TARJETAS (PREF_PRE,COTJ_NUMERO);
DROP INDEX DESENSAMBLES_IDX1;
CREATE INDEX DESENSAMBLES_IDX1
ON DESENSAMBLES (DESE_NUMERO);
DROP INDEX DEVOLUCIONES_COMPRAS_IDX2;
CREATE INDEX DEVOLUCIONES_COMPRAS_IDX2
ON DEVOLUCIONES_COMPRAS (DVCO_NUMERO);
DROP INDEX DEVOLUCIONES_VENTAS_IDX5;
DROP INDEX DEVOLUCION_CHEQUES_IDX1;
CREATE INDEX DEVOLUCION_CHEQUES_IDX3
ON DEVOLUCION_CHEQUES (DVCH_FECHA);
CREATE INDEX DEVOLUCION_CHEQUES_IDX1
ON DEVOLUCION_CHEQUES (PRBA_PREF,DVCH_NUMDOC);
DROP INDEX ENSAMBLES_IDX1;
CREATE INDEX ENSAMBLES_IDX1
ON ENSAMBLES (ENSA_NUMERO);
DROP INDEX ENTRADAS_IDX1;
CREATE INDEX ENTRADAS_IDX1
ON ENTRADAS (ENTR_NUMERO);
DROP INDEX NOTAS_CREDITO_IDX2;
CREATE INDEX NOTAS_CREDITO_IDX3
ON NOTAS_CREDITO (CUBA_COD);
CREATE INDEX NOTAS_CREDITO_IDX2
ON NOTAS_CREDITO (PRBA_PREF,NCBC_NUMERO);
DROP INDEX NOTAS_CREDITO_CLIENTES_IDX3;
CREATE INDEX NOTAS_CREDITO_CLIENTES_IDX3
ON NOTAS_CREDITO_CLIENTES (NCCL_NUMERO);
DROP INDEX NOTAS_CREDITO_PROVEEDOR_IDX2;
CREATE INDEX NOTAS_CREDITO_PROVEEDOR_IDX2
ON NOTAS_CREDITO_PROVEEDOR (NCPR_NUMERO);
DROP INDEX NOTAS_DEBITO_IDX2;
CREATE INDEX NOTAS_DEBITO_IDX2
ON NOTAS_DEBITO (PRBA_PREF,NDBC_NUMERO);
CREATE INDEX NOTAS_DEBITO_IDX3
ON NOTAS_DEBITO (CUBA_COD);
DROP INDEX NOTAS_DEBITO_CLIENTES_IDX2;
CREATE INDEX NOTAS_DEBITO_CLIENTES_IDX2
ON NOTAS_DEBITO_CLIENTES (NDCL_NUMERO);
DROP INDEX PEDIDOS_IDX3;
DROP INDEX RECIBOS_CAJA_IDX3;
CREATE INDEX RECIBOS_CAJA_IDX3
ON RECIBOS_CAJA (RECA_NUMERO);
DROP INDEX SALIDAS_IDX1;
CREATE INDEX SALIDAS_IDX1
ON SALIDAS (SALI_NUMERO);
DROP INDEX TRASLADOS_IDX2;
CREATE INDEX TRASLADOS_IDX3
ON TRASLADOS (CUBA_COD);
CREATE INDEX TRASLADOS_IDX2
ON TRASLADOS (PRBA_PREF,TRAS_NUMERO);
DROP INDEX TRASLADOS_CAJA_IDX1;
CREATE INDEX TRASLADOS_CAJA_IDX2
ON TRASLADOS_CAJA (TRCJ_FECHA);
CREATE INDEX TRASLADOS_CAJA_IDX1
ON TRASLADOS_CAJA (PREF_PRE,TRCJ_NUMERO);


/* 20090512E */
/* NO INICIALIZABA LA FECHA DE LA ULTIMA COMPRA Y POR TANTO SE REPETIA DE UNA BODEGA A OTRA */
SET TERM ^ ;

CREATE OR ALTER PROCEDURE EXISTENCIAS_COMPRAS(
    ARTICULO VARCHAR(15),
    FECHA DATE,
    UNIDAD VARCHAR(8))
RETURNS (
    BODEGA VARCHAR(2),
    EXISTENCIA NUMERIC(18,2),
    RESERVADO NUMERIC(18,2),
    ORDENADO NUMERIC(18,2),
    PROMEDIO NUMERIC(18,2),
    VENTAMES NUMERIC(18,2),
    FECHACMP DATE,
    CANTCMP NUMERIC(18,2),
    DIAS INTEGER,
    SUGERIDO NUMERIC(18,2),
    STAND VARCHAR(15))
AS
declare variable FACTOR NUMERIC(15,4);
declare variable ORDENC NUMERIC(18,4);
declare variable PEDIDO NUMERIC(18,4);
declare variable ITEM INTEGER;
declare variable ID INTEGER;
declare variable UND VARCHAR(8);
declare variable CANT NUMERIC(18,4);
declare variable FACTOR2 NUMERIC(18,4);
declare variable fecini DATE;
declare variable FECHAAUX VARCHAR(10);
declare variable AGENCIA INTEGER;
declare variable DEVMES NUMERIC(18,2);
declare variable MFAC INTEGER;
declare variable MDEV INTEGER;
declare variable IVAF NUMERIC(18,2);
declare variable IVAD NUMERIC(18,2);
declare variable DIA_ART VARCHAR(2) CHARACTER SET NONE;
declare variable DIASC VARCHAR(255);
declare variable PEDAUTO CHAR(2);
declare variable SALIDAS NUMERIC(18,4);
BEGIN
  for select bode_cod, SUCU_ID from bodega into :bodega, :agencia
    do
    begin
    execute procedure saldo_inventario (:articulo, :bodega, :fecha) returning_values (:Existencia);
    EXECUTE PROCEDURE FACTOR_UNIDAD_CANT(:ARTICULO, :UNIDAD) returning_values (:FACTOR);
    if (FACTOR <> 0) then
        EXISTENCIA = EXISTENCIA / FACTOR;
    else
        EXISTENCIA = 0;
    STAND = '';
    SELECT STAND_COD FROM STANDS WHERE ARTI_COD = :ARTICULO AND STAND_BODEGA = :BODEGA INTO :stand;
    EXECUTE PROCEDURE promedio_salidas_articulo (:ARTICULO, :FECHA, :BODEGA) returning_values (:PROMEDIO, :SALIDAS);
    EXECUTE PROCEDURE lee_configuracion ('INVENTARIO', 'EXISTENCIAS', 'PROMEDIAR LAS SALIDAS DEL INVENTARIO CON EL NUMERO DE DIAS ASIGNADO A CADA ARTICULO') returning_values (:DIA_ART);
    if (DIA_ART = 'NO') then
        BEGIN
        EXECUTE PROCEDURE lee_configuracion ('INVENTARIO', 'EXISTENCIAS', 'NUMERO DE DIAS PARA PROMEDIO DE SALIDAS POR ARTICULO') returning_values (DIASC);
        DIAS = CAST(DIASC AS INTEGER);
        END
    ELSE
        SELECT ARTI_DIAS FROM ARTICULO WHERE ARTI_COD = :ARTICULO INTO :DIAS;
    if (DIAS is null) then
        DIAS = 0;
    PROMEDIO = DIAS * PROMEDIO;
    if (FACTOR <> 0) then
        PROMEDIO = PROMEDIO / FACTOR;
    SUGERIDO = PROMEDIO - EXISTENCIA;
    SELECT SUM(ORID_ENTREGAR)
      FROM ORDENINVENTARIO_DETALLE OD, ordenes_inventario O
      WHERE O.ORIN_ID = OD.ORIN_ID AND ARTI_COD = :ARTICULO AND ORIN_FECHA <= :FECHA AND ORIN_FECLLEGA >= :FECHA AND ORID_ANULADO = 'N' AND OD.BODE_COD = :BODEGA
      INTO :ORDENADO;
    if (ORDENADO IS NULL) then
        ORDENADO = 0;
    ORDENC = 0;
    FOR SELECT O.ORDC_ID, OCDE_ITEM, OCDE_CANT * OCDE_FACTOR
        FROM ORDENES_COMPRA O, ORDENES_COMPRA_DETALLE OD
        WHERE O.ORDC_ID = OD.ORDC_ID AND OD.ARTI_COD = :ARTICULO AND (ORDC_FECHA+ORDC_VALIDEZ) >= :FECHA AND ORDC_FECHA <= :FECHA AND OCDE_ANULADO = 'N' AND OD.BODE_COD = :BODEGA
        INTO :ID, :ITEM, :CANT
        do
        BEGIN
        EXECUTE PROCEDURE FALTANTE(23, 21, ID, ITEM) returning_values (PEDIDO, UND, FACTOR2);
        if (PEDIDO * FACTOR2 = CANT) then /* SI NO SE HA FACTURADO MIRE A VER SI SE REMISIONO */
            EXECUTE PROCEDURE FALTANTE(23, 22, ID, ITEM) returning_values (PEDIDO, UND, FACTOR2);
        if (PEDIDO IS NULL) then
            PEDIDO = 0;
        ORDENC = ORDENC + PEDIDO * FACTOR2;
        END
    ORDENADO = ORDENADO + ORDENC;
    if (FACTOR <> 0) then
        ORDENADO = ORDENADO / FACTOR;
    SELECT SUM(RSDE_LIBERAR)
      FROM RESERVAS_DETALLE RD, RESERVAS R
      WHERE R.RESE_ID = RD.RESE_ID AND ARTI_COD = :ARTICULO AND RESE_FECHA <= :FECHA AND RESE_VENCE >= :FECHA AND RD.BODE_COD = :BODEGA AND RSDE_ANULADO = 'N'
      INTO :RESERVADO;
    if (RESERVADO IS NULL) then
        RESERVADO = 0;
    PEDIDO = 0;
    FOR SELECT P.PEDI_ID, PEDE_ITEM, PEDE_CANT * PEDE_FACTOR
        FROM PEDIDOS P, PEDIDOS_DETALLE PD
        WHERE P.PEDI_ID = PD.PEDI_ID AND PD.ARTI_COD = :ARTICULO AND (PEDI_FECHA+PEDI_VALIDEZ) >= :FECHA AND PEDI_FECHA <= :FECHA AND PEDE_ANULADO = 'N' AND BODE_COD = :BODEGA
        INTO :ID, :ITEM, :CANT
        do
        BEGIN
        EXECUTE PROCEDURE FALTANTE(34, 31, ID, ITEM) returning_values (ORDENC, UND, FACTOR2);
        EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION', 'FACTURAS', 'GENERAR PEDIDO AUTOMATICAMENTE CON LA FACTURA') returning_values (pedauto);
        if ((ORDENC * FACTOR2 = CANT) or (PEDAUTO = 'SI')) then /* SI NO SE HA FACTURADO MIRE A VER SI SE REMISIONO */
            EXECUTE PROCEDURE FALTANTE(34, 32, ID, ITEM) returning_values (ORDENC, UND, FACTOR2);
        if (ORDENC IS NULL) then
            ORDENC = 0;
        PEDIDO = PEDIDO + ORDENC * FACTOR2;
        END
    RESERVADO = RESERVADO + PEDIDO;
    if (FACTOR <> 0) then
        RESERVADO = RESERVADO / FACTOR;
    /* VENTAS MES */
    FECHAAUX = CAST (FECHA AS VARCHAR(10));
    FECHAAUX = SUBSTR(FECHAAUX, 1, 7) || '/01';
    FECINI = CAST (FECHAAUX AS DATE);
    EXECUTE PROCEDURE ventas_articulo (:ARTICULO, :FECINI, :FECHA, :agencia) returning_values (:ventames, :mfac, :devmes, :mdev, :ivaf, :ivad);
    ventames = ventames - devmes;
    if (FACTOR <> 0) then
        ventames = ventames / FACTOR;
    /* FECHA COMPRA */
    fechacmp = null;
    cantcmp = 0;
    SELECT FIRST 1 FACO_FECHA, FCDE_CANT * FCDE_FACTOR FROM FACTURAS_COMPRA F, FACTURAS_COMPRAS_DETALLE D
        WHERE F.FACO_ID = D.faco_id AND D.ARTI_COD = :articulo AND FACO_FECHA <= :FECHA AND D.bode_cod = :BODEGA
        ORDER BY FACO_FECHA DESC, F.FACO_ID DESC
        INTO :fechacmp, :cantcmp;
    SUSPEND;
    end
END
^

SET TERM ; ^

/* 20090512F */
/* STRING TRUNCATION CON PORCENTAJES MUY GRANDES */
SET TERM ^ ;

CREATE OR ALTER PROCEDURE REP_UTILIDAD_VENTAS(
    TIPO INTEGER,
    DETALLE CHAR(1),
    FECINI DATE,
    FECFIN DATE,
    ARTINI VARCHAR(15),
    ARTFIN VARCHAR(15),
    GRPINI VARCHAR(3),
    GRPFIN VARCHAR(3),
    ORDEN CHAR(1),
    AGRUPA CHAR(1),
    CEROS CHAR(1),
    SUBEMPRESA INTEGER)
RETURNS (
    ARTICULO VARCHAR(15),
    DESCRIPCION VARCHAR(60),
    CODGRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    CODSUBG VARCHAR(3),
    NOMSUBG VARCHAR(30),
    CODMARC VARCHAR(3),
    NOMMARC VARCHAR(30),
    UNIDAD VARCHAR(8),
    CANTIDAD NUMERIC(18,4),
    BASE NUMERIC(18,4),
    COSTO NUMERIC(18,4),
    UTILIDAD NUMERIC(18,4),
    PORC NUMERIC(9,2),
    IVA NUMERIC(18,4),
    CONSUMO NUMERIC(18,4),
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    TIPODOC INTEGER)
AS
DECLARE VARIABLE COSTOUNIT NUMERIC(18,4);
DECLARE VARIABLE CANTDET NUMERIC(18,4);
declare variable CODINI VARCHAR(15);
declare variable CODFIN VARCHAR(15);
declare variable DESINI VARCHAR(15);
declare variable DESFIN VARCHAR(15);
declare variable MARINI VARCHAR(3);
declare variable MARFIN VARCHAR(3);
declare variable UOM VARCHAR(20);
declare variable NUMROWS INTEGER;
BEGIN
if (ORDEN = 'C') then
    BEGIN
    CODINI = ARTINI;
    CODFIN = ARTFIN;
    DESINI = '';
    DESFIN = 'zz';
    END
ELSE
    BEGIN
    DESINI = ARTINI;
    DESFIN = ARTFIN;
    CODINI = '';
    CODFIN = 'zz';
    END
if (AGRUPA = 'G') then
    BEGIN
    MARINI = '';
    MARFIN = 'zz';
    END
ELSE
    if (AGRUPA = 'M') then
        BEGIN
        MARINI = GRPINI;
        MARFIN = GRPFIN;
        GRPINI = '';
        GRPFIN = 'zz';
        END
    ELSE
        BEGIN
        MARINI = '';
        MARFIN = 'zz';
        GRPINI = '';
        GRPFIN = 'zz';
        END
EXECUTE PROCEDURE lee_configuracion ('FACTURACION', 'ARTICULOS', 'SUGERIR PRECIOS CON PORCENTAJE DE MARGEN O UTILIDAD') returning_values (:UOM);
if (DETALLE = 'N') then
    BEGIN
    if (BIN_AND(TIPO, 1) <> 0) then
        BEGIN
        TIPODOC = 31;
        /* BORRA LA TABLA AUXILIAR */
        DELETE FROM reportes_aux WHERE REPA_ID = 2 AND REPA_USER = USER;

        FOR SELECT MAX(D.ARTI_COD), SUM(FADE_CANT * FADE_FACTOR), SUM((FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO)*FACT_FACTOR), SUM(FADE_IVAMONTO*FACT_FACTOR), SUM(FADE_CONSUMO),
            MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD)
            FROM FACTURAS_DETALLE D, FACTURAS F, PREFIJOS P, ARTICULO A
            WHERE F.FACT_ID = D.FACT_ID AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND D.ARTI_COD = A.arti_cod AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            FACT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) and substring(a.arti_cod from 1 FOR 2) <> '.t'
            GROUP BY D.ARTI_COD
            INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,
            :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
            DO
            BEGIN
            COSTO = 0;
            FOR SELECT FADE_CANT * FADE_FACTOR, FACT_FECHA FROM FACTURAS_DETALLE D, FACTURAS F, PREFIJOS P
                WHERE F.FACT_ID = D.FACT_ID AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND
                FACT_ANULADO = 'N' AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                and D.ARTI_COD = :articulo  INTO :cantdet, :fecha
                DO
                BEGIN
                EXECUTE PROCEDURE COSTO_PROMEDIO(:ARTICULO, :FECHA) returning_values (:costounit);
                COSTO = COSTO + costounit * cantdet;
                END
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            if (CEROS = 'S') then
                INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (2, USER, :ARTICULO);
            SUSPEND;
            END /* FOR */
        if (CEROS = 'S') then
            BEGIN
            COSTO = 0;
            UTILIDAD = 0;
            PORC = 0;
            /* agregue los articulos sin factura */
            FOR SELECT ARTI_COD, 0, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND
                    A.ARTI_DES <= :DESFIN AND A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND
                    (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN)))
                INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,:DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                DO
                BEGIN
                SELECT COUNT(REPA_ARTICULO) FROM REPORTES_AUX WHERE REPA_ID = 2 AND REPA_USER = USER AND REPA_ARTICULO = :articulo INTO :numrows;
                if (numrows = 0) then
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        END
    if (BIN_AND(TIPO, 2) <> 0) then
        BEGIN
        TIPODOC = 32;
        /* BORRA LA TABLA AUXILIAR */
        DELETE FROM reportes_aux WHERE REPA_ID = 2 AND REPA_USER = USER;

        FOR SELECT MAX(D.ARTI_COD), SUM(RVDE_CANT * RVDE_FACTOR), SUM(RVDE_TOTAL-RVDE_IVAMONTO-RVDE_CONSUMO), SUM(RVDE_IVAMONTO), SUM(RVDE_CONSUMO),
            MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD)
            FROM REMISIONES_VENTA_DETALLE D, REMISIONES_VENTA R, PREFIJOS P, ARTICULO A
            WHERE R.REVT_ID = D.REVT_ID AND P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = 32 AND D.ARTI_COD = A.arti_cod AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            REVT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY D.ARTI_COD
            INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,
            :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
            DO
            BEGIN
            COSTO = 0;
            FOR SELECT RVDE_CANT * RVDE_FACTOR, REVT_FECHA FROM remisiones_venta_detalle D, remisiones_venta F, PREFIJOS P
                WHERE F.revt_id = D.revt_id AND REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN AND
                REVT_ANULADO = 'N' AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 32 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                and D.ARTI_COD = :articulo  INTO :cantdet, :fecha
                DO
                BEGIN
                EXECUTE PROCEDURE COSTO_PROMEDIO(:ARTICULO, :FECHA) returning_values (:costounit);
                COSTO = COSTO + costounit * cantdet;
                END
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            if (CEROS = 'S') then
                INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (2, USER, :ARTICULO);
            SUSPEND;
            END /* FOR */
        if (CEROS = 'S') then
            BEGIN
            COSTO = 0;
            UTILIDAD = 0;
            PORC = 0;
            /* agregue los articulos sin factura */
            FOR SELECT ARTI_COD, 0, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND
                    A.ARTI_DES <= :DESFIN AND A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND
                    (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN)))
                INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,:DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                DO
                BEGIN
                SELECT COUNT(REPA_ARTICULO) FROM REPORTES_AUX WHERE REPA_ID = 2 AND REPA_USER = USER AND REPA_ARTICULO = :articulo INTO :numrows;
                if (numrows = 0) then
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        END
    if (BIN_AND(TIPO, 4) <> 0) then
        BEGIN
        TIPODOC = 33;
        /* BORRA LA TABLA AUXILIAR */
        DELETE FROM reportes_aux WHERE REPA_ID = 2 AND REPA_USER = USER;

        FOR SELECT MAX(D.ARTI_COD), SUM(DVDE_CANT * DVDE_FACTOR), SUM((DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO)*DEVT_FACTOR), SUM(DVDE_IVAMONTO*DEVT_FACTOR), SUM(DVDE_CONSUMO),
            MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD)
            FROM devoluciones_ventas_detalle D, DEVOLUCIONES_VENTAS V, PREFIJOS P, ARTICULO A
            WHERE V.DEVT_ID = D.DEVT_ID AND P.PREF_PRE = V.PREF_PRE AND P.TIDO_COD = 33 AND D.ARTI_COD = A.arti_cod AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            DEVT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY D.ARTI_COD
            INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,
            :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
            DO
            BEGIN
            COSTO = 0;
            FOR SELECT DVDE_CANT * DVDE_FACTOR, DEVT_FECHA FROM devoluciones_ventas_detalle D, devoluciones_ventas F, PREFIJOS P
                WHERE F.devt_id = D.devt_id AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND
                DEVT_ANULADO = 'N' AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 33 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                and D.ARTI_COD = :articulo  INTO :cantdet, :fecha
                DO
                BEGIN
                EXECUTE PROCEDURE COSTO_PROMEDIO(:ARTICULO, :FECHA) returning_values (:costounit);
                COSTO = COSTO + costounit * cantdet;
                END
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            else
                CANTIDAD = CANTIDAD * -1;
            if (BASE IS NULL) then
                BASE = 0;
            else
                BASE = BASE * -1;
            if (IVA IS NULL) then
                IVA = 0;
            else
                IVA = IVA * -1;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            else
                CONSUMO = CONSUMO * -1;
            COSTO = costo * -1;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            if (CEROS = 'S') then
                INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (2, USER, :ARTICULO);
            SUSPEND;
            END /* FOR */
        if (CEROS = 'S') then
            BEGIN
            COSTO = 0;
            UTILIDAD = 0;
            PORC = 0;
            /* agregue los articulos sin factura */
            FOR SELECT ARTI_COD, 0, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND
                    A.ARTI_DES <= :DESFIN AND A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND
                    (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN)))
                INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,:DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                DO
                BEGIN
                SELECT COUNT(REPA_ARTICULO) FROM REPORTES_AUX WHERE REPA_ID = 2 AND REPA_USER = USER AND REPA_ARTICULO = :articulo INTO :numrows;
                if (numrows = 0) then
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        END
    if (BIN_AND(TIPO, 8) <> 0) then
        BEGIN
        TIPODOC = 34;
        /* BORRA LA TABLA AUXILIAR */
        DELETE FROM reportes_aux WHERE REPA_ID = 2 AND REPA_USER = USER;

        FOR SELECT MAX(D.ARTI_COD), SUM(PEDE_CANT * PEDE_FACTOR), SUM((PEDE_TOTAL-PEDE_IVAMONTO-PEDE_CONSUMO)*PEDI_FACTOR), SUM(PEDE_IVAMONTO*PEDI_FACTOR), SUM(PEDE_CONSUMO),
            MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD)
            FROM PEDIDOS_DETALLE D, PEDIDOS P, PREFIJOS R, ARTICULO A
            WHERE P.PEDI_ID = D.PEDI_ID AND P.PREF_PRE = R.PREF_PRE AND R.TIDO_COD = 34 AND D.ARTI_COD = A.arti_cod AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            PEDI_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY D.ARTI_COD
            INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,
            :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
            DO
            BEGIN
            COSTO = 0;
            FOR SELECT PEDE_CANT * PEDE_FACTOR, PEDI_FECHA FROM pedidos_detalle D, pedidos F, PREFIJOS P
                WHERE F.pedi_id = D.pedi_id AND PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND
                PEDI_ANULADO = 'N' AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                and D.ARTI_COD = :articulo  INTO :cantdet, :fecha
                DO
                BEGIN
                EXECUTE PROCEDURE COSTO_PROMEDIO(:ARTICULO, :FECHA) returning_values (:costounit);
                COSTO = COSTO + costounit * cantdet;
                END
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            if (CEROS = 'S') then
                INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (2, USER, :ARTICULO);
            SUSPEND;
            END /* FOR */
        if (CEROS = 'S') then
            BEGIN
            COSTO = 0;
            UTILIDAD = 0;
            PORC = 0;
            /* agregue los articulos sin factura */
            FOR SELECT ARTI_COD, 0, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND
                    A.ARTI_DES <= :DESFIN AND A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND
                    (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN)))
                INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,:DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                DO
                BEGIN
                SELECT COUNT(REPA_ARTICULO) FROM REPORTES_AUX WHERE REPA_ID = 2 AND REPA_USER = USER AND REPA_ARTICULO = :articulo INTO :numrows;
                if (numrows = 0) then
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        END
    if (BIN_AND(TIPO, 16) <> 0) then
        BEGIN
        TIPODOC = 35;
        /* BORRA LA TABLA AUXILIAR */
        DELETE FROM reportes_aux WHERE REPA_ID = 2 AND REPA_USER = USER;

        FOR SELECT MAX(D.ARTI_COD), SUM(CTDE_CANT * CTDE_FACTOR), SUM((CTDE_TOTAL-CTDE_IVAMONTO-CTDE_CONSUMO)*COTI_FACTOR), SUM(CTDE_IVAMONTO), SUM(CTDE_CONSUMO),
            MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD)
            FROM COTIZACIONES_DETALLE D, COTIZACIONES C, PREFIJOS P, ARTICULO A
            WHERE C.COTI_ID = D.COTI_ID AND P.PREF_PRE = C.PREF_PRE AND P.TIDO_COD = 35 AND D.ARTI_COD = A.arti_cod AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND COTI_FECHA >= :FECINI AND COTI_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            COTI_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY D.ARTI_COD
            INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,
            :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
            DO
            BEGIN
            COSTO = 0;
            FOR SELECT CTDE_CANT * CTDE_FACTOR, COTI_FECHA FROM cotizaciones_detalle D, cotizaciones F, PREFIJOS P
                WHERE F.coti_id = D.coti_id AND COTI_FECHA >= :FECINI AND COTI_FECHA <= :FECFIN AND
                COTI_ANULADO = 'N' AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                and D.ARTI_COD = :articulo  INTO :cantdet, :fecha
                DO
                BEGIN
                EXECUTE PROCEDURE COSTO_PROMEDIO(:ARTICULO, :FECHA) returning_values (:costounit);
                COSTO = COSTO + costounit * cantdet;
                END
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            if (CEROS = 'S') then
                INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (2, USER, :ARTICULO);
            SUSPEND;
            END /* FOR */
        if (CEROS = 'S') then
            BEGIN
            COSTO = 0;
            UTILIDAD = 0;
            PORC = 0;
            /* agregue los articulos sin factura */
            FOR SELECT ARTI_COD, 0, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND
                    A.ARTI_DES <= :DESFIN AND A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND
                    (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN)))
                INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,:DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                DO
                BEGIN
                SELECT COUNT(REPA_ARTICULO) FROM REPORTES_AUX WHERE REPA_ID = 2 AND REPA_USER = USER AND REPA_ARTICULO = :articulo INTO :numrows;
                if (numrows = 0) then
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        END
    END
ELSE
    BEGIN
    if (BIN_AND(TIPO, 1) <> 0) then
        BEGIN
        TIPODOC = 31;
        FOR SELECT F.PREF_PRE, FACT_NUMERO, FACT_FECHA, D.ARTI_COD, FADE_CANT * FADE_FACTOR, (FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO)*FACT_FACTOR, FADE_IVAMONTO*FACT_FACTOR, FADE_CONSUMO,
            ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
            FROM FACTURAS F, FACTURAS_DETALLE D, PREFIJOS P, ARTICULO A
            WHERE F.FACT_ID = D.FACT_ID AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND D.ARTI_COD = A.arti_cod AND
                A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
                A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND FACT_FECHA >= :FECINI AND
                (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
                FACT_FECHA <= :FECFIN AND FACT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) and substring(a.arti_cod from 1 FOR 2) <> '.t'
            ORDER BY D.ARTI_COD, FACT_FECHA, F.FACT_ID, FADE_ITEM
            INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,
                :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
            DO
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            EXECUTE PROCEDURE costo_promedio (:ARTICULO, :FECHA) RETURNING_VALUES (:COSTOUNIT);
            COSTO = COSTOUNIT * CANTIDAD;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            SUSPEND;
            END
        END
    if (BIN_AND(TIPO, 2) <> 0) then
        BEGIN
        TIPODOC = 32;
        FOR SELECT R.PREF_PRE, REVT_NUMERO, REVT_FECHA, D.ARTI_COD, RVDE_CANT * RVDE_FACTOR, RVDE_TOTAL-RVDE_IVAMONTO-RVDE_CONSUMO, RVDE_IVAMONTO, RVDE_CONSUMO,
            ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
            FROM REMISIONES_VENTA R, REMISIONES_VENTA_DETALLE D, PREFIJOS P, ARTICULO A
            WHERE R.REVT_ID = D.REVT_ID AND P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = 32 AND D.ARTI_COD = A.arti_cod AND
                A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
                A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN AND
                (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
                REVT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            ORDER BY D.ARTI_COD, REVT_FECHA, R.REVT_ID, RVDE_ITEM
            INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,
                :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
            DO
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            EXECUTE PROCEDURE costo_promedio (:ARTICULO, :FECHA) RETURNING_VALUES (:COSTOUNIT);
            COSTO = COSTOUNIT * CANTIDAD;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            SUSPEND;
            END
        END
    if (BIN_AND(TIPO, 4) <> 0) then
        BEGIN
        TIPODOC = 33;
        FOR SELECT V.PREF_PRE, DEVT_NUMERO, DEVT_FECHA, D.ARTI_COD, DVDE_CANT * DVDE_FACTOR, (DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO)*DEVT_FACTOR, DVDE_IVAMONTO*DEVT_FACTOR, DVDE_CONSUMO,
            ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
            FROM DEVOLUCIONES_VENTAS V, DEVOLUCIONES_VENTAS_DETALLE D, PREFIJOS P, ARTICULO A
            WHERE V.DEVT_ID = D.DEVT_ID AND P.PREF_PRE = V.PREF_PRE AND P.TIDO_COD = 33 AND D.ARTI_COD = A.arti_cod AND
                A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
                A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND
                (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
                DEVT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            ORDER BY D.ARTI_COD, DEVT_FECHA, V.DEVT_ID, DVDE_ITEM
            INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,
                :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
            DO
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            EXECUTE PROCEDURE costo_promedio (:ARTICULO, :FECHA) RETURNING_VALUES (:COSTOUNIT);
            BASE = BASE * -1;
            CANTIDAD = CANTIDAD * -1;
            IVA = IVA * -1;
            CONSUMO = CONSUMO * -1;
            COSTO = COSTOUNIT * CANTIDAD;
            COSTO = COSTO * -1;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            SUSPEND;
            END
        END
    if (BIN_AND(TIPO, 8) <> 0) then
        BEGIN
        TIPODOC = 34;
        FOR SELECT P.PREF_PRE, PEDI_NUMERO, PEDI_FECHA, D.ARTI_COD, PEDE_CANT * PEDE_FACTOR, (PEDE_TOTAL-PEDE_IVAMONTO-PEDE_CONSUMO)*PEDI_FACTOR, PEDE_IVAMONTO*PEDI_FACTOR, PEDE_CONSUMO,
            ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD 
            FROM PEDIDOS P, PEDIDOS_DETALLE D, PREFIJOS R, ARTICULO A
            WHERE P.PEDI_ID = D.PEDI_ID AND P.PREF_PRE = R.PREF_PRE AND R.TIDO_COD = 34 AND D.ARTI_COD = A.arti_cod AND
                A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
                A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND
                (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
                PEDI_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            ORDER BY D.ARTI_COD, PEDI_FECHA, P.PEDI_ID, PEDE_ITEM
            INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,
                :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
            DO
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            EXECUTE PROCEDURE costo_promedio (:ARTICULO, :FECHA) RETURNING_VALUES (:COSTOUNIT);
            COSTO = COSTOUNIT * CANTIDAD;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            SUSPEND;
            END
        END
    if (BIN_AND(TIPO, 16) <> 0) then
        BEGIN
        TIPODOC = 35;
        FOR SELECT C.PREF_PRE, COTI_NUMERO, COTI_FECHA, D.ARTI_COD, CTDE_CANT * CTDE_FACTOR, (CTDE_TOTAL-CTDE_IVAMONTO-CTDE_CONSUMO)*COTI_FACTOR, CTDE_IVAMONTO*COTI_FACTOR, CTDE_CONSUMO,
            ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD 
            FROM COTIZACIONES C, COTIZACIONES_DETALLE D, PREFIJOS P, ARTICULO A
            WHERE C.COTI_ID = D.COTI_ID AND P.PREF_PRE = C.PREF_PRE AND P.TIDO_COD = 35 AND D.ARTI_COD = A.arti_cod AND
                A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
                A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND COTI_FECHA >= :FECINI AND COTI_FECHA <= :FECFIN AND
                (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
                COTI_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            ORDER BY D.ARTI_COD, COTI_FECHA, C.COTI_ID, CTDE_ITEM
            INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,
                :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
            DO
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            EXECUTE PROCEDURE costo_promedio (:ARTICULO, :FECHA) RETURNING_VALUES (:COSTOUNIT);
            COSTO = COSTOUNIT * CANTIDAD;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            SUSPEND;
            END
        END
    END
END
^

SET TERM ; ^

/* 20090513 */
/* NO INCLUIA LOS ANTICIPOS EN EL RECAUDO */
SET TERM ^ ;

ALTER PROCEDURE ANALISIS_VENTAS_VENDEDOR(
    AGENCIA INTEGER,
    VENDINI INTEGER,
    VENDFIN INTEGER,
    FECHA DATE)
RETURNS (
    CODVEND INTEGER,
    NOMVEND VARCHAR(60),
    CODAGENCIA INTEGER,
    NOMAGENCIA VARCHAR(60),
    PRESUPUESTO NUMERIC(18,2),
    VENTAS NUMERIC(18,2),
    VENTADIA NUMERIC(18,2),
    PENDIENTE NUMERIC(18,2),
    FALTANTE NUMERIC(18,2),
    FALTANTEDIA NUMERIC(18,2),
    PORCENTAJE NUMERIC(9,2),
    PROMEDIO NUMERIC(18,2),
    ESPERADO NUMERIC(18,2),
    RECAUDO NUMERIC(18,2),
    RECAUDODIA NUMERIC(18,2),
    PENDIENTER NUMERIC(18,2),
    MOSTRADORV NUMERIC(18,2),
    MOSTRADORR NUMERIC(18,2),
    MAXIMAVTA NUMERIC(18,2),
    MESMAXIMO VARCHAR(8),
    VENTAANOP NUMERIC(18,2),
    DEBERIAIR NUMERIC(9,2))
AS
DECLARE VARIABLE FECAUX VARCHAR(10);
DECLARE VARIABLE FECINI VARCHAR(10);
DECLARE VARIABLE FEC DATE;
DECLARE VARIABLE ANO INTEGER;
DECLARE VARIABLE MES INTEGER;
DECLARE VARIABLE TIPODOC INTEGER;
DECLARE VARIABLE ID INTEGER;
DECLARE VARIABLE ABONO NUMERIC(18,2);
DECLARE VARIABLE SUBTOTAL NUMERIC(18,2);
DECLARE VARIABLE IVAMONTO NUMERIC(18,2);
DECLARE VARIABLE TOTAL NUMERIC(18,2);
DECLARE VARIABLE ESCONTADO CHAR(1);
DECLARE VARIABLE DIAS INTEGER;
DECLARE VARIABLE AGEN_ANT INTEGER;
DECLARE VARIABLE TOTAL_SUC NUMERIC(18,2);
declare variable DIA INTEGER;
begin
MOSTRADORV = 0;
MOSTRADORR = 0;
AGEN_ANT = 0;
total_suc = 0;
FECAUX = CAST (FECHA AS VARCHAR(10));
ANO = CAST(SUBSTR(FECAUX, 1, 4) AS INTEGER);
MES = CAST(SUBSTR(FECAUX, 6, 7) AS INTEGER);
FECINI = SUBSTR(FECAUX, 1, 8) || '01';
DIA = extract (DAY FROM FECHA);
/*SELECT PRVM_DIAS FROM PRESUPUESTO_VENTAS_MESES WHERE PRVM_ANO = :ANO AND PRVM_MES = :MES INTO :DIAS; */
DIAS = EXTRACT(DAY FROM (FECHA - EXTRACT(DAY FROM FECHA) + 32 - EXTRACT(DAY FROM FECHA - EXTRACT(DAY FROM FECHA) + 32)));
FOR SELECT VEND_COD, VEND_NOMBRE, SUCU_ID, VEND_CONTADO FROM VENDEDORES WHERE VEND_COD >= :VENDINI AND VEND_COD <= :VENDFIN  AND
    ((SUCU_ID = :AGENCIA) or (:AGENCIA = 0)) ORDER BY SUCU_ID, VEND_COD
    INTO :CODVEND, :NOMVEND, :CODAGENCIA, :ESCONTADO
    DO
    BEGIN
    if (CODAGENCIA <> 0) then
        BEGIN
        SELECT SUCU_NOMBRE FROM SUCURSALES WHERE SUCU_ID = :CODAGENCIA INTO :NOMAGENCIA;
        MAXIMAVTA = 0;
        MESMAXIMO = '';
        VENTAANOP = 0;
        /* LA MAXIMA VENTA Y EL MES EN QUE OCURRIO */
        SELECT MAX(HIVE_VENTA) FROM historico_ventas WHERE SUCU_ID = :codagencia INTO maximavta;
        SELECT MAX(CAST(HIVE_MES AS CHAR(2)) || '/' || CAST(HIVE_ANO AS CHAR(4))) FROM
            historico_ventas WHERE HIVE_VENTA = :maximavta AND SUCU_ID = :codagencia INTO :mesmaximo;
        /* LA VENTA DEL MISMO MES EL ANO ANTERIOR */
        SELECT HIVE_VENTA FROM historico_ventas WHERE HIVE_ANO = :ANO-1 AND HIVE_MES = :MES AND SUCU_ID = :codagencia INTO :ventaanop;
        END
    /* TRAIGA EL PRESUPUESTO DEL MES */
    PRESUPUESTO = 0;
    PENDIENTE = 0;
    PENDIENTER = 0;
    SELECT PRVE_VENTA, PRVE_PENDIENTE, PRVE_PENDRECA FROM PRESUPUESTO_VENTAS
        WHERE VEND_COD = :CODVEND AND PRVE_ANO = :ANO AND PRVE_MES = :MES
        INTO :PRESUPUESTO, :PENDIENTE, :PENDIENTER;

    /* CALCULE LAS VENTAS */
    SELECT SUM(FACT_TOTAL-FACT_IVAMONTO) FROM FACTURAS F, PREFIJOS P
        WHERE VEND_COD = :CODVEND AND FACT_FECHA = :FECHA AND FACT_ANULADO = 'N'
        AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND ((SUCU_ID = :AGENCIA) or (:AGENCIA = 0))
        INTO :VENTADIA;
    if (VENTADIA is null) then
        VENTADIA = 0;
    SELECT SUM(FACT_TOTAL-FACT_IVAMONTO) FROM FACTURAS F, PREFIJOS P
        WHERE VEND_COD = :CODVEND AND FACT_FECHA >= :FECINI AND FACT_FECHA < :FECHA AND FACT_ANULADO = 'N'
        AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND ((SUCU_ID = :AGENCIA) or (:AGENCIA = 0))
        INTO :SUBTOTAL;
    if (subtotal is null) then
        ventas = VENTADIA;
    else
        VENTAS = SUBTOTAL + VENTADIA;
    /* CALCULE LAS DEVOLUCIONES */
    SELECT SUM(DEVT_TOTAL-DEVT_IVAMONTO) FROM devoluciones_ventas F, PREFIJOS P
        WHERE VEND_COD = :CODVEND AND DEVT_FECHA = :FECHA AND DEVT_ANULADO = 'N'
        AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 33 AND ((SUCU_ID = :AGENCIA) or (:AGENCIA = 0))
        INTO :SUBTOTAL;
    if (subtotal is not null) then
        BEGIN
        VENTADIA = VENTADIA - SUBTOTAL;
        VENTAS = VENTAS - SUBTOTAL;
        END
    SELECT SUM(DEVT_TOTAL-DEVT_IVAMONTO) FROM devoluciones_ventas F, PREFIJOS P
        WHERE VEND_COD = :CODVEND AND DEVT_FECHA >= :FECINI AND DEVT_FECHA < :FECHA AND DEVT_ANULADO = 'N'
        AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 33 AND ((SUCU_ID = :AGENCIA) or (:AGENCIA = 0))
        INTO :SUBTOTAL;
    if (subtotal is not null) then
        VENTAS = VENTAS - SUBTOTAL;
    /* CALCULE LAS NOTAS CREDITO */
    SELECT SUM(NCCL_MONTO) FROM NOTAS_CREDITO_CLIENTES F, PREFIJOS P
        WHERE VEND_COD = :CODVEND AND NCCL_FECHA = :FECHA AND NCCL_ANULADO = 'N'
        AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 42 AND ((SUCU_ID = :AGENCIA) or (:AGENCIA = 0))
        INTO :SUBTOTAL;
    if (subtotal is not null) then
        BEGIN
        VENTADIA = VENTADIA - SUBTOTAL;
        VENTAS = VENTAS - SUBTOTAL;
        END
    SELECT SUM(NCCL_MONTO) FROM NOTAS_CREDITO_CLIENTES F, PREFIJOS P
        WHERE VEND_COD = :CODVEND AND NCCL_FECHA >= :FECINI AND NCCL_FECHA < :FECHA AND NCCL_ANULADO = 'N'
        AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 42 AND ((SUCU_ID = :AGENCIA) or (:AGENCIA = 0))
        INTO :SUBTOTAL;
    if (subtotal is not null) then
        VENTAS = VENTAS - SUBTOTAL;
    FALTANTE = PRESUPUESTO - VENTAS;
    if (DIAS - DIA > 0) then
        FALTANTEDIA = FALTANTE / (DIAS - DIA);
    ELSE
        FALTANTEDIA = FALTANTE;
    if (PRESUPUESTO <> 0) then
        PORCENTAJE = VENTAS / PRESUPUESTO * 100;
    ELSE
        PORCENTAJE = 0;
    PROMEDIO = (VENTAS + PENDIENTE) / DIA;
    ESPERADO = PROMEDIO * DIAS;
    DEBERIAIR = DIA * 100/ dias;
    RECAUDO = 0;
    RECAUDODIA = 0;
    /* CALCULE EL RECAUDO DEL MES EXCLUYENDO EL IVA */
    FOR SELECT RECA_FECHA, RCDE_TIPODOC, RCDE_IDDOC, (RCDE_ABONO+RCDE_RTFTE+RCDE_RTIVA+RCDE_RTICA)
        FROM RECIBOS_CAJA R, RECIBOS_CAJA_DETALLE RD
        WHERE R.RECA_ID = RD.RECA_ID AND
        RECA_FECHA >= :FECINI AND RECA_FECHA <= :FECHA AND RECA_ANULADO = 'N' AND COBR_COD = :CODVEND
        ORDER BY RECA_FECHA
        INTO :FEC, :TIPODOC, :ID, :ABONO
        DO
        BEGIN
        /* TRAIGA EL DOCUMENTO Y CALCULE LA BASE */
        if (TIPODOC = 31) then
                SELECT FACT_TOTAL,FACT_IVAMONTO FROM FACTURAS WHERE FACT_ID = :ID INTO :TOTAL, :IVAMONTO;
        if (TIPODOC = 33) then
                SELECT DEVT_TOTAL*-1,DEVT_IVAMONTO*-1 FROM DEVOLUCIONES_VENTAS WHERE DEVT_ID = :ID INTO :TOTAL, :IVAMONTO;
        if (TIPODOC = 41) then
                SELECT NDCL_MONTO,NDCL_IVAMONTO FROM NOTAS_DEBITO_CLIENTES WHERE NDCL_ID = :ID INTO :TOTAL, :IVAMONTO;
        if (TIPODOC = 42) then
                SELECT NCCL_MONTO*-1,NCCL_IVAMONTO*-1 FROM NOTAS_CREDITO_CLIENTES WHERE NCCL_ID = :ID INTO :TOTAL, :IVAMONTO;
        if (TIPODOC = 45) then
                SELECT ANCL_BASE*-1,0 FROM ANTICIPOS_CLIENTE WHERE ANCL_ID = :ID INTO :TOTAL, :IVAMONTO;
        if (TIPODOC = 77) then
                SELECT DVCH_MONTO,0 FROM DEVOLUCION_CHEQUES WHERE DVCH_ID = :ID INTO :TOTAL, :IVAMONTO;
        if (TOTAL <> 0) then
            SUBTOTAL = (ABONO / TOTAL) * (TOTAL - IVAMONTO);
        RECAUDO = RECAUDO + SUBTOTAL;
        if (FEC = FECHA) then
            RECAUDODIA = RECAUDODIA + SUBTOTAL;
        END
    if (ESCONTADO = 'S') then
        BEGIN
        MOSTRADORV = MOSTRADORV + VENTAS;
        MOSTRADORR = MOSTRADORR + RECAUDO;
        END
    /* actualice el historico */
    if (AGEN_ANT <> codagencia)  then
        BEGIN
        if (AGEN_ANT <> 0) THEN
            BEGIN
            TOTAL = null;
            SELECT HIVE_VENTA FROM historico_ventas WHERE HIVE_ANO = :ANO AND HIVE_MES = :MES AND SUCU_ID = :AGEN_ANT INTO :TOTAL;
            if (TOTAL is not null) then
                BEGIN
                if (TOTAL_SUC <> 0) then
                    UPDATE historico_ventas SET HIVE_VENTA = (:total_suc)  WHERE HIVE_ANO = :ANO AND HIVE_MES = :MES AND SUCU_ID = :AGEN_ANT;
                END
            ELSE
                INSERT INTO historico_ventas (HIVE_ANO, HIVE_MES, SUCU_ID, HIVE_VENTA) VALUES (:ANO, :MES, :AGEN_ANT, :TOTAL_SUC);
            END
        total_suc = VENTAS;
        END
    ELSE
        BEGIN
        total_suc = :total_suc + :VENTAS;
        END
    AGEN_ANT = :codagencia;
    if ((VENTAS <> 0) or (RECAUDO <> 0) or (:presupuesto <> 0)) then
        suspend;
    END
end
^

SET TERM ; ^


/* 20090513B */
/* COMO AL GRABAR EL RECIBO VALIDA INCLUYENDO LA CAJA, QUE AL SACAR LA FORMA DE PAGO VALIDE IGUAL */
SET TERM ^ ;

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

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

SET TERM ; ^


SET TERM ^ ;

CREATE OR ALTER TRIGGER CONSIGNA_DETALLE_AU FOR CONSIGNA_DETALLE
ACTIVE AFTER UPDATE POSITION 0
AS
declare variable Fec date;
declare variable Cuenta integer;
declare variable Conc VARCHAR(60);
declare variable Pref varchar(4);
declare variable Num varchar(6);
declare variable Existe char(1);
BEGIN
if ((old.cons_id <> 0) and (old.code_anulado = 'N')) then
    begin
    /* Actualice el total del movimiento del banco */
    select cons_fecha, cuba_cod, cons_concepto, prba_pref, cons_numero from consigna where cons_id = new.cons_id into :Fec, :Cuenta, :Conc, :Pref, :Num;
    Existe = 'N';
    select 'S' from movimiento_banco where moba_tipodoc = 71 and moba_idref = new.cons_id into :Existe;
    if (Existe = 'S') then
        update movimiento_banco
            set moba_concepto = 'ANULADO', moba_total = moba_total - new.code_monto
            where moba_tipodoc = 71 and moba_idref = new.cons_id;
    /* afecte la caja */
    select cons_fecha, cons_concepto, prba_pref, cons_numero from consigna
        where cons_id = new.cons_id into :Fec, :Conc, :Pref, :Num;
    Existe = 'N';
    select 'S' from movimiento_caja where moca_tiporef = 71 and moca_idref = new.cons_id and caja_id = new.caja_id into :Existe;
    if (Existe = 'S') then
        update movimiento_caja
            set moca_creditos = moca_creditos - new.code_monto
            where moca_tiporef = 71 and moca_idref = new.cons_id and caja_id = new.caja_id;
    /* ANULE LA SALIDA DEL DOCUMENTO DE PAGO */
    if (OLD.FOPA_ID <> 1) then
        UPDATE DOCUMENTOS_PAGO_CAJA
            SET DPCA_TIPOSAL = 0, DPCA_IDSAL = 0
            WHERE caja_id = OLD.caja_id AND FOPA_ID = OLD.FOPA_ID AND DPCA_BANCO = OLD.CODE_BANCO AND
            DPCA_CUENTA = OLD.CODE_CUENTA AND DPCA_NUMERO = OLD.CODE_NUMERO AND
            DPCA_TIPOSAL = 71 AND DPCA_IDSAL = OLD.CONS_ID AND DPCA_MONTO = OLD.code_monto;
    ELSE
        EXECUTE PROCEDURE RESTE_SALDO_EFECTIVO(OLD.CAJA_ID, :FEC, OLD.CODE_MONTO, 'S');
    end
if ((new.cons_id <> 0) and (new.code_anulado = 'N')) then
    begin
    /* Actualice el total del movimiento del banco */
    select cons_fecha, cuba_cod, cons_concepto, prba_pref, cons_numero
        from consigna where cons_id = new.cons_id
        into :Fec, :Cuenta, :Conc, :Pref, :Num;
    Existe = 'N';
    select 'S' from movimiento_banco where moba_tipodoc = 71 and moba_idref = new.cons_id into :Existe;
    if (Existe = 'S') then
        update movimiento_banco
            set moba_concepto = :conc, moba_total = moba_total + new.code_monto
            where moba_tipodoc = 71 and moba_idref = new.cons_id;
    else
        INSERT INTO MOVIMIENTO_BANCO
            (MOBA_ID, CUBA_COD, MOBA_TIPODOC, MOBA_PREF, MOBA_NUMERO, MOBA_FECHA, MOBA_CONCEPTO, MOBA_TOTAL, MOBA_DB, MOBA_IDREF, MOBA_TIPOREF)
            VALUES(GEN_ID(ID_MOVBANCO,1), :Cuenta, 71, :Pref, :Num, :Fec, :Conc, NEW.code_monto, 'S', new.cons_id, 71);
    /* afecte la caja */
    select cons_fecha, cons_concepto, prba_pref, cons_numero from consigna
        where cons_id = new.cons_id into :Fec, :Conc, :Pref, :Num;
    Existe = 'N';
    select 'S' from movimiento_caja where moca_tiporef = 71 and moca_idref = new.cons_id and caja_id = new.caja_id into :Existe;
    if (Existe = 'S') then
        update movimiento_caja
            set moca_creditos = moca_creditos + new.code_monto
            where moca_tiporef = 71 and moca_idref = new.cons_id and caja_id = new.caja_id;
    else
        INSERT INTO MOVIMIENTO_CAJA
            (MOCA_ID, CAJA_ID, MOCA_TIPOREF, MOCA_PREFREF, MOCA_NUMREF, MOCA_FECHA, MOCA_CONC, MOCA_DEBITOS, MOCA_CREDITOS, MOCA_DB, MOCA_IDREF)
            VALUES(GEN_ID(ID_MOVCAJA,1), NEW.CAJA_ID, 71, :Pref, :Num, :Fec, :Conc, 0, NEW.code_monto, 'N', new.cons_id);
    /* ACTUALICE LA SALIDA DEL DOCUMENTO DE PAGO */
    if (NEW.FOPA_ID <> 1) then
        UPDATE DOCUMENTOS_PAGO_CAJA
            SET DPCA_TIPOSAL = 71, DPCA_IDSAL = NEW.cons_id
            WHERE caja_id = NEW.caja_id AND FOPA_ID = NEW.FOPA_ID AND DPCA_BANCO = NEW.CODE_BANCO AND DPCA_CUENTA = NEW.CODE_CUENTA AND
            DPCA_NUMERO = NEW.CODE_NUMERO AND DPCA_TIPOSAL = 0 AND DPCA_IDSAL = 0;
    ELSE
        EXECUTE PROCEDURE RESTE_SALDO_EFECTIVO(NEW.CAJA_ID, :FEC, NEW.CODE_MONTO, 'N');
    end
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER CONSIGNA_DETALLE_AD FOR CONSIGNA_DETALLE
ACTIVE AFTER DELETE POSITION 0
AS
declare variable Existe CHAR(1);
declare variable FEC DATE;
BEGIN
if ((OLD.cons_id <> 0) AND (OLD.code_anulado = 'N')) then
    BEGIN
    SELECT CONS_FECHA FROM CONSIGNA WHERE CONS_ID = OLD.CONS_ID INTO :FEC;
    /* Actualice el total del movimiento del banco */
    select 'S' from movimiento_banco where moba_tipodoc = 71 and moba_idref = old.cons_id into :Existe;
    if (Existe = 'S') then
        update movimiento_banco
            set moba_total = moba_total - old.code_monto
            where moba_tipodoc = 71 and moba_idref = old.cons_id;
    /* afecte la caja */
    select 'S' from movimiento_caja where moca_tiporef = 71 and moca_idref = old.cons_id and caja_id = old.caja_id into :Existe;
    if (Existe = 'S') then
        update movimiento_caja
            set moca_creditos = moca_creditos - old.code_monto
        where moca_tiporef = 71 and moca_idref = old.cons_id and caja_id = old.caja_id;
    /* ANULE LA SALIDA DEL DOCUMENTO DE PAGO */
    if (OLD.FOPA_ID <> 1) then
        UPDATE DOCUMENTOS_PAGO_CAJA
            SET DPCA_TIPOSAL = 0, DPCA_IDSAL = 0
            WHERE CAJA_ID = OLD.caja_id AND FOPA_ID = OLD.FOPA_ID AND DPCA_BANCO = OLD.CODE_BANCO AND
            DPCA_CUENTA = OLD.CODE_CUENTA AND DPCA_NUMERO = OLD.CODE_NUMERO AND
            DPCA_TIPOSAL = 71 AND DPCA_IDSAL = OLD.CONS_ID AND DPCA_MONTO = OLD.code_monto;
    ELSE
        EXECUTE PROCEDURE RESTE_SALDO_EFECTIVO(OLD.CAJA_ID, :FEC, OLD.CODE_MONTO, 'S');
    END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER CAMBIODOC_ENTRADAS_AI FOR CAMBIODOC_ENTRADAS
ACTIVE AFTER INSERT POSITION 0
AS
declare variable PREF VARCHAR(4);
declare variable NUMERO VARCHAR(6);
declare variable CAJA INTEGER;
declare variable FEC DATE;
declare variable CONC VARCHAR(60);
declare variable EXISTE CHAR(1);
declare variable VALFP char(2);
BEGIN
if ((NEW.CADO_ID <> 0) AND (NEW.CDEN_ANULADO = 'N')) then
    BEGIN
    EXECUTE PROCEDURE LEE_CONFIGURACION('BANCOS','CONSIGNACIONES','VALIDAR FORMAS DE PAGO EN CAJA') RETURNING_VALUES (VALFP);
    SELECT PREF_PRE, CADO_NUMERO, CADO_FECHA, CADO_CONC, CAJA_ID
        FROM CAMBIO_DOCUMENTOS WHERE CADO_ID = NEW.CADO_ID INTO :PREF, :numero, :FEC, :CONC, :CAJA;
    select 'S' from movimiento_caja where moca_tiporef = 63 and moca_idref = new.cado_id and caja_id = :CAJA into :Existe;
    if (Existe = 'S') then
        begin
        update movimiento_caja
            set moca_creditos = moca_creditos + new.cden_monto
            where moca_tiporef = 63 and moca_idref = new.cado_id and caja_id = :CAJA;
        end
    else
        INSERT INTO MOVIMIENTO_CAJA
            (MOCA_ID, CAJA_ID, MOCA_TIPOREF, MOCA_PREFREF, MOCA_NUMREF, MOCA_FECHA, MOCA_CONC, MOCA_DEBITOS, MOCA_CREDITOS, MOCA_DB, MOCA_IDREF)
            VALUES(GEN_ID(ID_MOVCAJA,1), :CAJA, 63, :Pref, :Numero, :Fec, :Conc, 0, NEW.cden_monto, 'N', new.cado_id);
        
    /* ACTUALICE LA SALIDA DEL DOCUMENTO */
    if (NEW.FOPA_ID <> 1) then
      BEGIN
      EXISTE = 'N';
      SELECT 'S' FROM DOCUMENTOS_PAGO_CAJA WHERE CAJA_ID = :CAJA AND NEW. FOPA_ID = NEW.FOPA_ID AND DPCA_BANCO = NEW.CDEN_BANCO AND DPCA_CUENTA = NEW.CDEN_CUENTA AND
            DPCA_NUMERO = NEW.CDEN_NUMERO AND DPCA_TIPOSAL = 0 AND DPCA_IDSAL = 0 INTO :EXISTE;
      if (EXISTE = 'S') then
        UPDATE DOCUMENTOS_PAGO_CAJA
            SET DPCA_TIPOSAL = 63, DPCA_IDSAL = NEW.cado_id
            WHERE CAJA_ID = :CAJA AND FOPA_ID = NEW.FOPA_ID AND DPCA_BANCO = NEW.CDEN_BANCO AND DPCA_CUENTA = NEW.CDEN_CUENTA AND
            DPCA_NUMERO = NEW.CDEN_NUMERO AND DPCA_TIPOSAL = 0 AND DPCA_IDSAL = 0 AND DPCA_MONTO = NEW.cden_monto;
      ELSE
        IF (VALFP = 'SI') THEN
          EXCEPTION documento_pago_salido 'La forma de pago ' || new.cden_banco || ' ' || new.cden_cuenta || ' ' || new.cden_numero || ' no se encuentra en la caja.';
      END
    ELSE
        EXECUTE PROCEDURE RESTE_SALDO_EFECTIVO(:CAJA, :FEC, NEW.CDEN_MONTO, 'N');
    END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER CAMBIODOC_ENTRADAS_AU FOR CAMBIODOC_ENTRADAS
ACTIVE AFTER UPDATE POSITION 0
AS
declare variable PREF VARCHAR(4);
declare variable NUMERO VARCHAR(6);
declare variable CAJA INTEGER;
declare variable FEC DATE;
declare variable CONC VARCHAR(60);
declare variable EXISTE CHAR(1);
BEGIN
SELECT CAJA_ID, CADO_FECHA FROM CAMBIO_DOCUMENTOS WHERE CADO_ID = OLD.CADO_ID INTO :CAJA, :FEC;
if ((OLD.CADO_ID <> 0) and (old.cden_anulado = 'N')) then
    begin
    update movimiento_caja
        set moca_creditos = moca_creditos - OLD.cden_monto
        where moca_tiporef = 63 and moca_idref = OLD.cado_id and caja_id = :CAJA;

    /* ANULE EL CAMBIO ANTERIOR */
    if (OLD.FOPA_ID <> 1) then
        UPDATE DOCUMENTOS_PAGO_CAJA
            SET DPCA_TIPOSAL = 0, DPCA_IDSAL = 0
            WHERE CAJA_ID = :CAJA AND FOPA_ID = OLD.FOPA_ID AND DPCA_BANCO = OLD.CDEN_BANCO AND
            DPCA_CUENTA = OLD.CDEN_CUENTA AND DPCA_NUMERO = OLD.CDEN_NUMERO AND
            DPCA_TIPOSAL = 63 AND DPCA_IDSAL = OLD.CADO_ID AND DPCA_MONTO = OLD.cden_monto;
    ELSE
        EXECUTE PROCEDURE RESTE_SALDO_EFECTIVO(:CAJA, :FEC, OLD.CDEN_MONTO, 'S');
    end
            
if ((NEW.CADO_ID <> 0) and (NEW.cden_anulado = 'N')) then
    BEGIN
    SELECT PREF_PRE, CADO_NUMERO, CADO_FECHA, CADO_CONC, CAJA_ID
        FROM CAMBIO_DOCUMENTOS WHERE CADO_ID = NEW.CADO_ID INTO :PREF, :numero, :FEC, :CONC, :CAJA;
    select 'S' from movimiento_caja where moca_tiporef = 63 and moca_idref = new.cado_id and caja_id = :CAJA into :Existe;
    if (Existe = 'S') then
        begin
        update movimiento_caja
            set moca_creditos = moca_creditos + new.cden_monto
            where moca_tiporef = 63 and moca_idref = new.cado_id and caja_id = :CAJA;
        end
    else
        INSERT INTO MOVIMIENTO_CAJA
            (MOCA_ID, CAJA_ID, MOCA_TIPOREF, MOCA_PREFREF, MOCA_NUMREF, MOCA_FECHA, MOCA_CONC, MOCA_DEBITOS, MOCA_CREDITOS, MOCA_DB, MOCA_IDREF)
            VALUES(GEN_ID(ID_MOVCAJA,1), :CAJA, 63, :Pref, :Numero, :Fec, :Conc, 0, NEW.cden_monto, 'N', new.cado_id);
        
    /* ACTUALICE LA SALIDA DEL DOCUMENTO */
    if (NEW.FOPA_ID <> 1) then
        UPDATE DOCUMENTOS_PAGO_CAJA
            SET DPCA_TIPOSAL = 63, DPCA_IDSAL = NEW.cado_id
            WHERE CAJA_ID = :CAJA AND FOPA_ID = NEW.FOPA_ID AND DPCA_BANCO = NEW.CDEN_BANCO AND DPCA_CUENTA = NEW.CDEN_CUENTA AND
            DPCA_NUMERO = NEW.CDEN_NUMERO AND DPCA_TIPOSAL = 0 AND DPCA_IDSAL = 0 AND DPCA_MONTO = NEW.cden_monto;
    ELSE
        EXECUTE PROCEDURE RESTE_SALDO_EFECTIVO(:CAJA, :FEC, NEW.CDEN_MONTO, 'N');
    END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER CAMBIODOC_ENTRADAS_AD FOR CAMBIODOC_ENTRADAS
ACTIVE AFTER DELETE POSITION 0
AS
declare variable CAJA INTEGER;
declare variable FEC DATE;
BEGIN
if ((OLD.CADO_ID <> 0) AND (OLD.cden_anulado = 'N')) then
    BEGIN
    SELECT CAJA_ID, CADO_FECHA FROM CAMBIO_DOCUMENTOS WHERE CADO_ID = OLD.CADO_ID INTO :CAJA, :FEC;
    update movimiento_caja
        set moca_creditos = moca_creditos - OLD.cden_monto
        where moca_tiporef = 63 and moca_idref = OLD.cado_id and caja_id = :CAJA;

    /* ANULE EL CAMBIO ANTERIOR */
    if (OLD.FOPA_ID <> 1) then
        UPDATE DOCUMENTOS_PAGO_CAJA
            SET DPCA_TIPOSAL = 0, DPCA_IDSAL = 0
            WHERE CAJA_ID = :CAJA AND FOPA_ID = OLD.FOPA_ID AND DPCA_BANCO = OLD.CDEN_BANCO AND
            DPCA_CUENTA = OLD.CDEN_CUENTA AND DPCA_NUMERO = OLD.CDEN_NUMERO AND
            DPCA_TIPOSAL = 63 AND DPCA_IDSAL = OLD.CADO_ID AND DPCA_MONTO = OLD.cden_monto;
    ELSE
        EXECUTE PROCEDURE RESTE_SALDO_EFECTIVO(:CAJA, :FEC, OLD.CDEN_MONTO, 'S');
    END
END
^

SET TERM ; ^

SET TERM ^ ;

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

SET TERM ; ^

SET TERM ^ ;

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

SET TERM ; ^

SET TERM ^ ;

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

SET TERM ; ^


/* 20090513C */
/* PARA AGILIZAR LA CONSULTA DE CARTERA EN CLIENTES DE CONTADO VER SOLO UN CIERTO NUMERO DE DIAS ATRAS */
INSERT INTO CONFIGURACION (CONF_MODULO, CONF_CATEGORIA, CONF_PROPIEDAD, CONF_VALOR, CONF_POSIBLES, CONF_AYUDA) VALUES ('CARTERA', 'SALDOS', 'NUMERO DE DIAS PARA CONSULTA DE CARTERA DE CLIENTES DE CONTADO', '0', '0,30,90,365', 'Indique el máximo número de días a revisar la cartera para minimizar la demora en consulta de cartera de clientes de contado. Si se deja en 0 revisa toda la historia del cliente');
commit work;

SET TERM ^ ;

CREATE OR ALTER PROCEDURE CARTERA_CLIENTE(
    NIT VARCHAR(20),
    FECHA DATE,
    SUCURSAL VARCHAR(10),
    MONEDA INTEGER,
    SOLOPESOS CHAR(1))
RETURNS (
    TIPO INTEGER,
    ID INTEGER,
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(6),
    CONCEPTO VARCHAR(60),
    SALDO NUMERIC(18,2),
    RTFTE NUMERIC(18,2),
    RTIVA NUMERIC(18,2),
    RTICA NUMERIC(18,2),
    DTOF NUMERIC(18,2),
    TIPONOM VARCHAR(8),
    VENCE DATE,
    FECDOC DATE,
    DIAS INTEGER,
    RECPROV_ID INTEGER,
    RECIPROV CHAR(1),
    NOTA VARCHAR(256),
    TRMDOC NUMERIC(18,2))
AS
declare variable FEC DATE;
declare variable DESC_RTES CHAR(2);
declare variable DTOAPL NUMERIC(18,2);
declare variable TRMREC NUMERIC(18,2);
declare variable IDNOTA INTEGER;
declare variable AUTORET VARCHAR(10);
declare variable FAUTORET DATE;
declare variable DIASCONT INTEGER;
BEGIN
EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'FECHA AUTORETENEDOR NO DESCONTAR RETENCIONES DEL SALDO PERO SI CONTABILIZARLAS') returning_values (AUTORET);
if (AUTORET <> '') then
    FAUTORET = CAST(AUTORET AS DATE);
else
    FAUTORET = '9999/12/31';
EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'NUMERO DE DIAS PARA CONSULTA DE CARTERA DE CLIENTES DE CONTADO') returning_values (:diascont);
if ((DIASCONT <> 0) AND (NOT EXISTS (select ptvt_id from punto_venta where terc_nit = :nit))) then
    DIASCONT = 0;
EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'DESCONTAR RETENCIONES POR CAUSACION') returning_values (DESC_RTES);
  /* BUSQUE EN SALDOS_DOC_CARTERA LOS QUE TENGAN SALDO > 0 */
  FOR SELECT MVCL_TIPOREF, MVCL_IDREF, MVCL_FECHA, MVCL_VENCE, MVCL_PREFREF, MVCL_NUMREF, MVCL_CONC, MVCL_TRM
  FROM MOVIMIENTO_CLIENTES
  WHERE TERC_NIT = :NIT AND mvcl_sucursal = :sucursal and MVCL_FECHA <= :FECHA AND MVCL_ABONO = 'N' AND
    ((:MONEDA = 0) or (MVCL_TRM <> 1)) AND ((MVCL_FECHA >= (:FECHA - :DIASCONT)) or (:DIASCONT = 0))
  INTO :TIPO, :ID, :FECDOC, :VENCE, :PREFIJO, :NUMERO, :CONCEPTO, :TRMDOC
    DO
    BEGIN
    DIAS = (FECHA -VENCE );
    EXECUTE PROCEDURE saldo_doc_cartera(TIPO, ID, FECHA, MONEDA) returning_values (SALDO);
    if (SALDO <> 0) then
        BEGIN
        SELECT TIDO_NOMCORTO FROM TIPO_DOCUMENTO WHERE TIDO_COD = :TIPO INTO :TIPONOM;
        if (TIPO = 41) then
            SELECT NDCL_DTOFMONTO, NDCL_FECHADTO FROM NOTAS_DEBITO_CLIENTES WHERE NDCL_ID = :ID INTO :DTOF, :FEC;
        if (TIPO = 42) then
            SELECT 0, NCCL_FECHA FROM NOTAS_CREDITO_CLIENTES WHERE NCCL_ID = :ID INTO :DTOF, :FEC;
        if (TIPO = 45) then
            SELECT ANCL_DTOFMONTO, ANCL_DTOFECHA FROM ANTICIPOS_CLIENTE WHERE ANCL_ID = :ID INTO :DTOF, :FEC;
        if (TIPO = 31) then
            SELECT FACT_DTOFMONTO, FACT_DTOFFECHA FROM FACTURAS WHERE FACT_ID = :ID INTO :DTOF, :FEC;
        if (TIPO = 33) then
            SELECT 0, :FECHA FROM devoluciones_ventas WHERE DEVT_ID = :ID INTO :DTOF, :FEC;
        if ((MONEDA <> 0) AND (TRMDOC <> 0)) then
            DTOF = DTOF / TRMDOC;

        /* POR WILLIAM IDENTIFICAR SI EL DOCUMENTO TIENE RECIBO PROVISIONAL*/
        recprov_id = 0;
        SELECT max(RCPR_ID) FROM recibo_provisional_detalle WHERE RPDE_IDDOC = :ID AND RPDE_TIPODOC = :TIPO and RPDE_ANULADO = 'N' INTO :recprov_id;
        if /*(recprov_id = 0) or */(recprov_id is null) then
           BEGIN
           reciprov = 'N';
           end 
        ELSE
          begin 
           reciprov = 'S';
          END
        /*FIN WILLIAM*/
        if (FECHA > FEC) then
            DTOF = 0;
        if (DTOF IS NULL) then
            DTOF = 0;
        if (DTOF <> 0) then
            BEGIN
            SELECT SUM(RCDE_DTOF), MAX(RECA_TRM) FROM RECIBOS_CAJA_DETALLE D, RECIBOS_CAJA R
                WHERE R.reca_id = D.reca_id AND RCDE_IDDOC = :ID AND RCDE_TIPODOC = :TIPO
                INTO :DTOAPL, :TRMREC;
            if (DTOAPL IS NULL) then
                DTOAPL = 0;
            if ((MONEDA <> 0) AND (TRMREC <> 0)) then
                DTOAPL = DTOAPL / TRMREC;
            DTOF = DTOF - DTOAPL;
            END
        if (MONEDA = 0) then
            SELECT SUM(SDCA_RTFTE - SDCA_ABRTFTE), SUM(SDCA_RTIVA - SDCA_ABRTIVA), SUM(SDCA_RTICA - SDCA_ABRTICA)
                FROM SALDOS_DOC_CARTERA WHERE SDCA_TIPOREF = :TIPO AND SDCA_IDREF = :ID
                INTO :RTFTE, :RTIVA, :RTICA;
        ELSE
            SELECT SUM((SDCA_RTFTE - SDCA_ABRTFTE)/SDCA_TRM), SUM((SDCA_RTIVA - SDCA_ABRTIVA)/SDCA_TRM), SUM((SDCA_RTICA - SDCA_ABRTICA)/SDCA_TRM)
                FROM SALDOS_DOC_CARTERA WHERE SDCA_TIPOREF = :TIPO AND SDCA_IDREF = :ID
                INTO :RTFTE, :RTIVA, :RTICA;
        if (RTFTE IS NULL) then
            RTFTE = 0;
        if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) THEN
            BEGIN
            if (RTFTE > 0) then
                RTFTE = 0;
            END
        ELSE
            BEGIN
            if (RTFTE < 0) then
                RTFTE = 0;
            END

        if (RTIVA IS NULL) then
            RTIVA = 0;
        if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) THEN
            BEGIN
            if (RTIVA > 0) then
                RTIVA = 0;
            END
        ELSE
            BEGIN
            if (RTIVA < 0) then
                RTIVA = 0;
            END

        if (RTICA IS NULL) then
            RTICA = 0;
        if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) THEN
            BEGIN
            if (RTICA > 0) then
                RTICA = 0;
            END
        ELSE
            BEGIN
            if (RTICA < 0) then
                RTICA = 0;
            END

        if (FAUTORET <= FECDOC) then
            BEGIN
            RTFTE = 0;
            RTIVA = 0;
            RTICA = 0;
            END
        /* RESTE LAS RETENCIONES YA QUE SE SUGERIRAN */
        if (DESC_RTES = 'NO') then
            SALDO = SALDO - RTFTE - RTIVA - RTICA;
        /* SI TIENE NOTA AGREGUELA */
        SELECT MAX(NOCL_ID) FROM NOTAS_CLIENTES WHERE TERC_NIT = :NIT AND CLSU_COD = :SUCURSAL AND NOCL_TIPODOC = :TIPO AND NOCL_IDDOC = :ID INTO :IDNOTA;
        if (IDNOTA IS NOT NULL) then
            SELECT NOCL_TEXTO FROM NOTAS_CLIENTES WHERE NOCL_ID = :IDNOTA INTO :NOTA;
        else
            NOTA = '';
        if ((SOLOPESOS = 'N') or (TRMDOC = 1)) then
            SUSPEND;
        END
    END
END
^

SET TERM ; ^

/* 20090513D */
/* COMPANIA PAPELERA: PREGUNTAR CLAVE ANTES DE NOTAS, DEVOLUCIONES, RECIBOS */
INSERT INTO CONFIGURACION (CONF_MODULO, CONF_CATEGORIA, CONF_PROPIEDAD, CONF_VALOR, CONF_POSIBLES, CONF_AYUDA) VALUES ('FACTURACION', 'DEVOLUCIONES', 'PREGUNTAR CLAVE DE USUARIO AL ENTRAR A REGISTRAR DEVOLUCIONES', 'NO', 'NO,SI', 'SI: Cada vez que se ingresa a la opción de devoluciones se pregunta nuevamente la clave del usuario para validar su identidad');
INSERT INTO CONFIGURACION (CONF_MODULO, CONF_CATEGORIA, CONF_PROPIEDAD, CONF_VALOR, CONF_POSIBLES, CONF_AYUDA) VALUES ('CARTERA', 'DOCUMENTOS', 'PREGUNTAR CLAVE DE USUARIO AL ENTRAR A REGISTRAR NOTAS DE CARTERA', 'NO', 'NO,SI', 'SI: Cada vez que se ingresa a la opción de notas débito o crédito se pregunta nuevamente la clave del usuario para validar su identidad');
INSERT INTO CONFIGURACION (CONF_MODULO, CONF_CATEGORIA, CONF_PROPIEDAD, CONF_VALOR, CONF_POSIBLES, CONF_AYUDA) VALUES ('CAJA', 'RECIBOS', 'PREGUNTAR CLAVE DE USUARIO AL ENTRAR A REGISTRAR RECIBOS DE CAJA', 'NO', 'NO,SI', 'SI: Cada vez que se ingresa a la opción de recibos de caja se pregunta nuevamente la clave del usuario para validar su identidad');

commit WORK;

/* COMPANIA PAPELERA: ACUMULAR PUNTOS DE CLIENTES POR RECAUDO */
UPDATE CONFIGURACION
SET CONF_POSIBLES = 'VENTA,RECAUDO,NO',
    CONF_AYUDA = 'VENTA: Activa el plan de fidelización de clientes acumulando un punto por cada cierto valor de ventas dependiendo del factor indicado. RECAUDO: Acumula puntos al registrar los recibos de caja dependiendo de la letra indicada. Requiere puntos vendedor'
WHERE (CONF_MODULO = 'FACTURACION') AND (CONF_CATEGORIA = 'FACTURAS') AND (CONF_PROPIEDAD = 'ACUMULAR PUNTOS POR VENTAS A CLIENTE REGULARES');

UPDATE CONFIGURACION
SET CONF_VALOR = 'VENTA'
WHERE (CONF_MODULO = 'FACTURACION') AND (CONF_CATEGORIA = 'FACTURAS') AND (CONF_PROPIEDAD = 'ACUMULAR PUNTOS POR VENTAS A CLIENTE REGULARES') AND (CONF_VALOR = 'SI');

UPDATE CONFIGURACION
SET CONF_AYUDA = 'SI: Activa el plan de liquidación de puntos para vendedores y para clientes por recaudo'
WHERE (CONF_MODULO = 'FACTURACION') AND (CONF_CATEGORIA = 'FACTURAS') AND (CONF_PROPIEDAD = 'ACUMULAR PUNTOS DE VENTAS POR VENDEDOR');

INSERT INTO CONFIGURACION (CONF_MODULO, CONF_CATEGORIA, CONF_PROPIEDAD, CONF_VALOR, CONF_POSIBLES, CONF_AYUDA)
    VALUES ('FACTURACION', 'FACTURAS', 'FECHA A PARTIR DE LA CUAL ACUMULAR PUNTOS A CLIENTES POR RECAUDO', '', '', 'Indique la fecha en formato AAAA/MM/DD a partir los documentos de ventas acumularán puntos por recaudo para el cliente');

commit WORK;

ALTER TABLE COMISIONES_PUNTOS
ADD COPU_FACTORCL T_PORCENTAJE;


SET TERM ^ ;

CREATE OR ALTER PROCEDURE ACUMULA_PUNTOS_CLIENTE(
    TIPO INTEGER,
    IDDOC INTEGER,
    CLIENTE VARCHAR(20),
    FECHA DATE)
RETURNS (
    PUNTOS INTEGER)
AS
declare variable numrows integer;
declare variable fecaux date;
declare variable IDP INTEGER;
declare variable ok integer;
declare variable ACUMULA CHAR(10);
declare variable FACTOR INTEGER;
declare variable ARTICULO VARCHAR(15);
declare variable FACTORART INTEGER;
declare variable ptos INTEGER;
declare variable HORA TIME;
declare variable HORINI TIME;
declare variable HORFIN TIME;
begin
ok = 1;
execute procedure lee_configuracion('FACTURACION', 'FACTURAS', 'ACUMULAR PUNTOS POR VENTAS A CLIENTE REGULARES') returning_values (ACUMULA);
if (acumula = 'VENTA') then
    begin
    execute procedure lee_configuracion('FACTURACION', 'FACTURAS', 'FACTOR DE CONVERSION DE PUNTOS') returning_values (FACTOR);
    if (IDDOC <> 0) then
        begin
        if (tipo = 31) then
            begin
            select count(ptcl_id) from puntos_cliente where ptcl_nit = :cliente and ptcl_tipodoc = 31 and ptcl_iddoc = :iddoc into :numrows;
            if (numrows = 0) then
                begin
                PUNTOS = 0;
                /* recorra la factura acumulando los puntos */
                for select arti_cod, CAST((fade_total-fade_ivamonto-fade_consumo)/:factor AS INTEGER) from facturas_detalle
                    where fact_id = :iddoc and substring(arti_cod from 1 FOR 2) <> '.t' into :articulo, :ptos
                    do
                    begin
                    factorart = 1;
                    select ptar_factor from puntos_articulos where PTAR_COD = :articulo into :factorart;
                    PUNTOS = PUNTOS + (ptos * factorart);
                    end
                /* SI ES UN DIA ESPECIAL APLIQUE EL FACTOR */
                SELECT FACT_FECHA FROM FACTURAS WHERE FACT_ID = :iddoc INTO :fecaux;
                FOR SELECT PTDE_ID FROM puntos_diasespecial WHERE PTDE_FECINI <= :fecaux AND PTDE_FECFIN >= :fecaux INTO :idp
                    DO
                    BEGIN
                    SELECT PTDE_HORINI, PTDE_HORFIN, PTDE_FACTOR FROM puntos_diasespecial
                        WHERE PTDE_ID = :IDP INTO :HORINI, :HORFIN, :factorart;
                    SELECT AUDI_HORA FROM AUDITORIA WHERE TIDO_COD = 31 AND AUDI_IDDOC = :iddoc INTO HORA;
                    if ((horini <= HORA) AND (horfin >= HORA)) then
                        PUNTOS = PUNTOS * factorart;
                    END
                /* inserte el registro de puntos */
                insert into puntos_cliente (ptcl_nit, ptcl_fecha, ptcl_tipodoc, ptcl_iddoc, ptcl_db, ptcl_cr)
                    values (:cliente, :fecha,  31, :iddoc, :puntos, 0);
                end
            end
        if (tipo = 33) then
            begin
            select count(ptcl_id) from puntos_cliente where ptcl_nit = :cliente and ptcl_tipodoc = 33 and ptcl_iddoc = :iddoc into :numrows;
            if (numrows = 0) then
                begin
                PUNTOS = 0;
                /* recorra la DEVOLUCION acumulando los puntos */
                for select arti_cod, CAST((dvde_total-dvde_ivamonto-dvde_consumo)/:factor AS INTEGER) from devoluciones_ventas_detalle
                    where devt_id = :iddoc and substring(arti_cod from 1 FOR 2) <> '.t' into :articulo, :ptos
                    do
                    begin
                    factorart = 1;
                    select ptar_factor from puntos_articulos where PTAR_COD = :articulo into :factorart;
                    PUNTOS = PUNTOS + (ptos * factorart);
                    end
                /* SI ES UN DIA ESPECIAL APLIQUE EL FACTOR */
                SELECT DEVT_FECHA FROM devoluciones_ventas WHERE DEVT_ID = :iddoc INTO :fecaux;
                FOR SELECT PTDE_ID FROM puntos_diasespecial WHERE PTDE_FECINI <= :fecaux AND PTDE_FECFIN >= :fecaux INTO :idp
                    DO
                    BEGIN
                    SELECT PTDE_HORINI, PTDE_HORFIN, PTDE_FACTOR FROM puntos_diasespecial
                        WHERE PTDE_ID = :IDP INTO :HORINI, :HORFIN, :factorart;
                    SELECT AUDI_HORA FROM AUDITORIA WHERE TIDO_COD = 33 AND AUDI_IDDOC = :iddoc INTO HORA;
                    if ((horini <= HORA) AND (horfin >= HORA)) then
                        PUNTOS = PUNTOS * factorart;
                    END
                /* inserte el registro de puntos */
                insert into puntos_cliente (ptcl_nit, ptcl_fecha, ptcl_tipodoc, ptcl_iddoc, ptcl_db, ptcl_cr)
                    values (:cliente, :fecha,  33, :iddoc, 0, :puntos);
                end
            end

        suspend;
        end
    end
end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER PROCEDURE IMPR_FACTURA(
    ID INTEGER)
RETURNS (
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    VENCE DATE,
    DIASVENCE INTEGER,
    CONTCRED CHAR(17),
    NIT VARCHAR(20),
    NOMTERCERO VARCHAR(60),
    NOMCLIENTE VARCHAR(60),
    VENDEDOR INTEGER,
    NOMVENDEDOR VARCHAR(60),
    PUNTOVTA INTEGER,
    NOMPUNTOVTA VARCHAR(30),
    CODBODEGA VARCHAR(2),
    NOMBODEGA VARCHAR(30),
    AUTORIZACION VARCHAR(20),
    DESPACHO VARCHAR(255),
    TRANSPORTADOR VARCHAR(60),
    COTIZACION VARCHAR(30),
    PEDIDO VARCHAR(30),
    REMISION VARCHAR(30),
    PACIENTE VARCHAR(20),
    NOMPACIENTE VARCHAR(60),
    COMIPORC NUMERIC(9,2),
    COMIMONTO NUMERIC(18,2),
    SUBTOTAL NUMERIC(18,2),
    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),
    EXTRA NUMERIC(18,2),
    DTOFPORC NUMERIC(9,2),
    DTOFMONTO NUMERIC(18,2),
    FECHADTO DATE,
    TOTALFAC NUMERIC(18,2),
    TOTALPAGAR NUMERIC(18,2),
    OBS BLOB SUB_TYPE 1 SEGMENT SIZE 80,
    ITEM INTEGER,
    ARTICULO VARCHAR(15),
    CODBAR VARCHAR(15),
    ARTIDES VARCHAR(60),
    DESCORTA VARCHAR(30),
    CANT NUMERIC(18,4),
    LOTE VARCHAR(15),
    VLOTE DATE,
    UNIDAD VARCHAR(8),
    CAJAS NUMERIC(18,4),
    FACTOR NUMERIC(18,4),
    LISTAPR INTEGER,
    REFITEM VARCHAR(60),
    BODITEM VARCHAR(2),
    STAND VARCHAR(15),
    PRUNIT NUMERIC(18,2),
    DTOITPORC NUMERIC(9,2),
    DTOITMONTO NUMERIC(18,2),
    PRNETO NUMERIC(18,2),
    PRNETOSINIVA NUMERIC(18,2),
    DTOIT1 NUMERIC(9,2),
    DTOIT2 NUMERIC(9,2),
    DTOIT3 NUMERIC(9,2),
    IVAPORC NUMERIC(9,2),
    IVAITMONTO NUMERIC(18,2),
    CONSUMO NUMERIC(18,2),
    SUBTOTIT NUMERIC(18,2),
    TOTAL NUMERIC(18,2),
    CODIGOCL VARCHAR(20),
    ZONACOD VARCHAR(2),
    ZONANOM VARCHAR(60),
    DV CHAR(1),
    DIRECCION VARCHAR(60),
    CIUDAD VARCHAR(40),
    TELEFONO VARCHAR(40),
    CONTACTO VARCHAR(60),
    FAX VARCHAR(25),
    CEL VARCHAR(25),
    GRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    SUBGRUPO VARCHAR(3),
    NOMSUBG VARCHAR(30),
    MARCA VARCHAR(3),
    NOMMARCA VARCHAR(30),
    PESO NUMERIC(18,4),
    ANCHO NUMERIC(18,4),
    ALTO NUMERIC(18,4),
    LARGO NUMERIC(18,4),
    SUMA1 NUMERIC(18,2),
    SUMA2 NUMERIC(18,2),
    SUMA3 NUMERIC(18,2),
    IVA1 NUMERIC(18,2),
    IVA2 NUMERIC(18,2),
    IVA3 NUMERIC(18,2),
    SUMAEX NUMERIC(18,2),
    SUMAGR NUMERIC(18,2),
    TOTCONSUMO NUMERIC(18,2),
    DTOIT1M NUMERIC(18,2),
    DTOIT2M NUMERIC(18,2),
    DTOIT3M NUMERIC(18,2),
    TOTCAJAS NUMERIC(18,2),
    VEHICULO VARCHAR(8),
    RECIBIDO NUMERIC(18,2),
    CAMBIO NUMERIC(18,2),
    HORA TIME,
    FORMAPAGO1 VARCHAR(30),
    MONTOPAGO1 NUMERIC(18,2),
    FORMAPAGO2 VARCHAR(30),
    MONTOPAGO2 NUMERIC(18,2),
    FORMAPAGO3 VARCHAR(30),
    MONTOPAGO3 NUMERIC(18,2),
    PUNTOS INTEGER,
    PUNTOSACUM INTEGER,
    PUNTOSVENC INTEGER,
    FECPTOS DATE,
    OBSITEM BLOB SUB_TYPE 1 SEGMENT SIZE 80,
    SUCUR VARCHAR(10),
    ALTERNATIVAS NUMERIC(18,4),
    PRINCIPALES NUMERIC(18,4))
AS
DECLARE VARIABLE IMPTOS CHAR(1);
DECLARE VARIABLE TARIFA INTEGER;
declare variable DEVUELTO NUMERIC(18,2);
declare variable ORDENCOD CHAR(2);
declare variable IMPRDEV CHAR(2);
declare variable IMPR CHAR(1);
declare variable ITEMFP INTEGER;
declare variable FORMAP VARCHAR(30);
declare variable MONTOP NUMERIC(18,2);
declare variable ICOINC CHAR(2);
declare variable DTOITM1 NUMERIC(18,2);
declare variable DTOITM2 NUMERIC(18,2);
declare variable DTOITM3 NUMERIC(18,2);
declare variable DTOITE3 CHAR(2);
declare variable SUMDTOIT NUMERIC(18,2);
declare variable AUTORET VARCHAR(10);
declare variable FAUTORET DATE;
declare variable FACTCANT NUMERIC(18,4);
declare variable ANULADO CHAR(1);
BEGIN
execute procedure lee_configuracion('FACTURACION', 'ARTICULOS', 'IMPOCONSUMO INCLUIDO EN EL PRECIO BASE DE VENTA ANTES DE IVA') returning_values (icoinc);
execute procedure lee_configuracion('FACTURACION', 'FACTURAS', 'COLUMNAS DE DESCUENTO POR ITEM ADICIONALES') returning_values (DTOITE3);
SELECT F.PREF_PRE, FACT_NUMERO, FACT_FECHA, FACT_VENCE, F.BODE_COD, BODE_NOM, F.TERC_NIT, FACT_NOMCLIENTE, F.VEND_COD, VEND_NOMBRE, F.PTVT_ID, PTVT_NOM,
    AUTO_NUMERO, FACT_DESPACHO, FACT_TRANSP, FACT_COTIZACI, FACT_PEDIDO, FACT_REMISION, FACT_COMIPORC, FACT_COMIMONTO, FACT_IVAINC, 
    FACT_DTOPOR, FACT_DTOMONTO, FACT_ADICIONAL, FACT_IVAMONTO, FACT_RTFTEPOR, FACT_RTFTEMONTO, FACT_RTIVAPOR, FACT_RTIVAMONTO, FACT_RTICAPOR, FACT_RTICAMONTO, FACT_EXTRA, FACT_DTOFPOR, FACT_DTOFMONTO, FACT_DTOFFECHA, FACT_TOTAL,
    TERC_DIR, TERC_CIU, TERC_TEL, TERC_CONTACTO, TERC_FAX, TERC_DV, TERC_CEL, FACT_DTOIT1, FACT_DTOIT2, FACT_DTOIT3,
    FACT_OBS, VEHI_COD, /*FACT_NROCOPIA,*/ FACT_RECIBIDO, FACT_SUCURSAL, FACT_DETCLI, FACT_DETCLINOM, TERC_NOM, FACT_ANULADO
    FROM FACTURAS F, BODEGA B, VENDEDORES V, PUNTO_VENTA P, TERCEROS T
    WHERE F.BODE_COD = B.BODE_COD AND F.VEND_COD = V.VEND_COD AND F.PTVT_ID = P.PTVT_ID AND F.TERC_NIT = T.TERC_NIT AND F.FACT_ID = :ID
    into :PREF, :NUMERO, :FECHA, :VENCE, :CODBODEGA, :NOMBODEGA, :NIT, :NOMTERCERO, :VENDEDOR, :NOMVENDEDOR, :PUNTOVTA, :NOMPUNTOVTA,
    :AUTORIZACION, :DESPACHO, :TRANSPORTADOR, :COTIZACION, :PEDIDO, :REMISION, :COMIPORC, :COMIMONTO, :IMPTOS,
    :DTOPORC, :DTOMONTO, :ADICIONAL, :IVAMONTO, :RTEFTEPORC, :RTEFTEMONTO, :RTEIVAPORC, :RTEIVAMONTO, :RTEICAPORC, :RTEICAMONTO, :EXTRA, :DTOFPORC, :DTOFMONTO, :FECHADTO, :TOTALFAC,
    :DIRECCION, :CIUDAD, :TELEFONO, :CONTACTO, :FAX, :DV, :CEL, :dtoit1m, :dtoit2m, :dtoit3m,
    :OBS, :VEHICULO,/* :NROCOPIA,*/ :RECIBIDO, :SUCUR, :paciente, :nompaciente, :nomcliente, :ANULADO;

/* ACUMULE LOS PUNTOS, SE HACE ACA POR SER POSTERIOR AL DETALLE */
if (ANULADO = 'N') then
    EXECUTE PROCEDURE acumula_puntos_cliente (31, :id, :nit, :fecha) returning_values (:PUNTOS);
EXECUTE PROCEDURE consulta_puntos_cliente (:id, :nit, :fecha) returning_values (:puntos, :puntosacum, :puntosvenc, :fecptos);
if (DTOIT1M IS NULL) then
    DTOIT1M = 0;
if (DTOIT2M IS NULL) then
    DTOIT2M = 0;
if (DTOIT3M IS NULL) then
    DTOIT3M = 0;
SELECT CLIE_COD, C.ZONA_COD, ZONA_NOM
    FROM CLIENTES C, ZONAS Z
    WHERE TERC_NIT = :NIT AND C.ZONA_COD = Z.ZONA_COD
    INTO :CODIGOCL, :ZONACOD, :ZONANOM;
SELECT CLSU_DIR, CLSU_CIUDAD, CLSU_TEL FROM CLIENTE_SUCURSALES WHERE TERC_NIT = :NIT AND CLCU_COD = :SUCUR
    INTO :DIRECCION, :CIUDAD, :TELEFONO;
DIASVENCE = VENCE - FECHA;
if (DIASVENCE > 0) then
    CONTCRED = 'CREDITO ' || CAST(DIASVENCE AS VARCHAR(3)) || ' DIAS';
ELSE
    CONTCRED = 'CONTADO';
SUBTOTAL = TOTALFAC - EXTRA - IVAMONTO - ADICIONAL + DTOMONTO;
if (DTOITE3 = 'SI') then
    BEGIN
    SELECT SUM(FADE_DTOMONTO) FROM FACTURAS_DETALLE WHERE FACT_ID = :id INTO :sumdtoit;
    SUBTOTAL = SUBTOTAL + sumdtoit + dtoit1m + dtoit2m + dtoit3m;
    END
EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'FECHA AUTORETENEDOR NO DESCONTAR RETENCIONES DEL SALDO PERO SI CONTABILIZARLAS') returning_values (AUTORET);
if (AUTORET <> '') then
    FAUTORET = CAST(AUTORET AS DATE);
else
    FAUTORET = '9999/12/31';
if (FECHA > fautoret) then
    TOTALPAGAR = TOTALFAC - RTEIVAMONTO - RTEICAMONTO;
ELSE
    TOTALPAGAR = TOTALFAC - RTEFTEMONTO - RTEIVAMONTO - RTEICAMONTO;
if (RECIBIDO <> 0) then
    CAMBIO = RECIBIDO - totalpagar;
ELSE
    CAMBIO = 0;
SUMAEX = 0;
SUMA1 = 0;
SUMA2 = 0;
SUMA3 = 0;
IVA1 = 0;
IVA2 = 0;
IVA3 = 0;
TOTCONSUMO = 0;
MONTOPAGO1 = 0;
SELECT MAX(AUDI_HORA) FROM AUDITORIA WHERE TIDO_COD = 31 AND AUDI_IDDOC = :ID AND AUDI_OPER = 'I' INTO :HORA;
/* AHORA LAS FORMAS DE PAGO, BUSQUE EL ABONO DE HOY A LA FACTURA */
ITEMFP = 1;
MONTOPAGO1 = 0;
MONTOPAGO2 = 0;
MONTOPAGO3 = 0;
FOR SELECT FOPA_NOM, RCPA_MONTO FROM RECIBOS_CAJA_PAGO P, FORMAS_PAGO F, RECIBOS_CAJA R, RECIBOS_CAJA_DETALLE D
    WHERE R.RECA_ID = P.RECA_ID AND R.RECA_ID = D.RECA_ID AND P.FOPA_ID = F.FOPA_ID AND RECA_FECHA = :FECHA AND RCDE_TIPODOC = 31 AND RCDE_IDDOC = :ID
    INTO :formap, :MONTOP
    DO
    BEGIN
    if (ITEMFP = 1) then
        BEGIN
        FORMAPAGO1 = FORMAP;
        MONTOPAGO1 = MONTOP;
        END
    if (ITEMFP = 2) then
        BEGIN
        FORMAPAGO2 = FORMAP;
        MONTOPAGO2 = MONTOP;
        END
    if (ITEMFP = 3) then
        BEGIN
        FORMAPAGO3 = FORMAP;
        MONTOPAGO3 = MONTOP;
        END
    ITEMFP = ITEMFP + 1;
    END
EXECUTE PROCEDURE lee_configuracion ('FACTURACION','DOCUMENTOS','ORDENAR ITEMS POR CODIGO DE ARTICULO') returning_values (:ORDENCOD);
EXECUTE PROCEDURE lee_configuracion ('FACTURACION','POS', 'IMPRIMIR DEVOLUCIONES DE ARTICULOS NEGATIVOS') returning_values (:imprdev);
totcajas = 0;
if (ORDENCOD = 'SI') then
    BEGIN
    FOR SELECT FADE_ITEM, D.ARTI_COD, FADE_CODBAR, SUBSTR(FADE_DESC,1,60), ARTI_DESCORTA, FADE_CANT, FADE_UNIDAD, FADE_FACTOR, BODE_COD, FADE_LOTE, LIPR_COD, FADE_PRUNIT, FADE_DTOPORC, FADE_DTOMONTO, FADE_IVAPORC, FADE_IVAMONTO, FADE_CONSUMO, FADE_TOTAL, FADE_REFERENCIA,
        GRUP_COD, SUBG_COD, MARC_COD, ARTI_PESO, ARTI_ANCHO, ARTI_ALTO, ARTI_LARGO, TAIV_COD, FADE_DEVUELTO, FADE_OBS, FADE_DTO1, FADE_DTO2, FADE_DTO3, FADE_DTOM1, FADE_DTOM2, FADE_DTOM3, FADE_CAJAS
        FROM FACTURAS_DETALLE D, ARTICULO A
        WHERE D.ARTI_COD = A.ARTI_COD AND D.FACT_ID = :ID
        ORDER BY D.ARTI_COD
        INTO :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :DESCORTA, :CANT, :UNIDAD, :FACTOR, :BODITEM, :LOTE, :LISTAPR, :PRUNIT, :DTOITPORC, :DTOITMONTO, :IVAPORC, :IVAITMONTO, :CONSUMO, :TOTAL, :refitem,
        :GRUPO, :SUBGRUPO, :MARCA, :PESO, :ANCHO, :ALTO, :LARGO, :TARIFA, :devuelto, :obsitem, :dtoit1, :dtoit2, :dtoit3, :dtoitm1, :dtoitm2, :dtoitm3, :cajas
        DO
          BEGIN
          if (ARTICULO = CODBAR) then
            SELECT FIRST 1 COBA_COD FROM barras_articulo WHERE ARTI_COD = :articulo INTO :CODBAR;
          if (IMPRDEV <> 'SI') then
            BEGIN
            if ((CANT >= 0) AND (DEVUELTO = 0)) then
                IMPR = 'S';
            ELSE
                IMPR = 'N'; /* ES DEVOLUCION */
            END
          ELSE
            IMPR = 'S';
          if (IMPR = 'S') then
            BEGIN
            prneto = PRUNIT - DTOITMONTO - dtoitm1 - dtoitm2 - dtoitm3;
            if (IMPTOS = 'S') then
                if (cant <> 0) then
                    prnetosiniva = PRUNIT - DTOITMONTO - ((IVAITMONTO+CONSUMO) / CANT) - dtoitm1 - dtoitm2 - dtoitm3;
                else
                    prnetosiniva = PRUNIT - DTOITMONTO - dtoitm1 - dtoitm2 - dtoitm3;
            ELSE
                prnetosiniva = PRUNIT - DTOITMONTO - dtoit1m - dtoit2m - dtoit3m;
            if (ICOINC = 'SI') then
                SUBTOTIT = TOTAL - IVAITMONTO;
            else
                SUBTOTIT = TOTAL - IVAITMONTO - CONSUMO;
            TOTCONSUMO = TOTCONSUMO + CONSUMO;
            SELECT LOTE_VENCE FROM LOTES WHERE LOTE_NRO = :lote AND ARTI_COD = :ARTICULO AND BODE_COD = :boditem INTO :vlote;
            if ((REFITEM <> '.t') or (REFITEM IS NULL)) then
                BEGIN
                /* NO SUME LOS ENSAMBLES */
                if (IVAPORC = 0) then
                    SUMAEX = SUMAEX + TOTAL;
                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;
                END
            if (ANCHO IS NULL) then
                ANCHO = 0;
            if (ALTO IS NULL) then
                ALTO = 0;
            if (LARGO IS NULL) then
                LARGO = 0;
            if (PESO IS NULL) then
                PESO = 0;
            PESO = (PESO / 1000) * CANT * FACTOR;
            totcajas = totcajas + cajas;
            if (substr(ARTICULO,1,2) = '.t') then
                BEGIN
                REFITEM = '';
                TOTAL = 0;
                SUBTOTIT = 0;
                END
            SELECT STAND_COD FROM STANDS WHERE ARTI_COD = :ARTICULO AND STAND_BODEGA = :boditem INTO :stand;
            factcant = NULL;
            SELECT FIRST 1 UNAR_FACCAN FROM unidad_articulo WHERE ARTI_COD = :articulo INTO :factcant;
            if (factcant IS NULL) then
                factcant = 1;
            if (factcant = 1) then
                BEGIN
                ALTERNATIVAS = 0;
                PRINCIPALES = (CANT * FACTOR);
                END
            ELSE
                BEGIN
                ALTERNATIVAS = FLOOR(CANT * factor / factcant);
                PRINCIPALES = (CANT * FACTOR) - (alternativas * factcant);
                END
            SUSPEND;
            END
          END
    END
ELSE
    BEGIN
    FOR SELECT FADE_ITEM, D.ARTI_COD, FADE_CODBAR, SUBSTR(FADE_DESC,1,60), ARTI_DESCORTA, FADE_CANT, FADE_UNIDAD, FADE_FACTOR, BODE_COD, FADE_LOTE, LIPR_COD, FADE_PRUNIT, FADE_DTOPORC, FADE_DTOMONTO, FADE_IVAPORC, FADE_IVAMONTO, FADE_CONSUMO, FADE_TOTAL, FADE_REFERENCIA,
        GRUP_COD, SUBG_COD, MARC_COD, ARTI_PESO, ARTI_ANCHO, ARTI_ALTO, ARTI_LARGO, TAIV_COD, FADE_DEVUELTO, FADE_OBS, FADE_DTO1, FADE_DTO2, FADE_DTO3, FADE_DTOM1, FADE_DTOM2, FADE_DTOM3, FADE_CAJAS
        FROM FACTURAS_DETALLE D, ARTICULO A
        WHERE D.ARTI_COD = A.ARTI_COD AND D.FACT_ID = :ID
        ORDER BY FADE_ITEM
        INTO :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :DESCORTA, :CANT, :UNIDAD, :FACTOR, :BODITEM, :LOTE, :LISTAPR, :PRUNIT, :DTOITPORC, :DTOITMONTO, :IVAPORC, :IVAITMONTO, :CONSUMO, :TOTAL, :refitem,
        :GRUPO, :SUBGRUPO, :MARCA, :PESO, :ANCHO, :ALTO, :LARGO, :TARIFA, :devuelto, :obsitem, :dtoit1, :dtoit2, :dtoit3, :dtoitm1, :dtoitm2, :dtoitm3, :cajas
        DO
          BEGIN
          if (IMPRDEV <> 'SI') then
            BEGIN
            if ((CANT >= 0) AND (DEVUELTO = 0)) then
                IMPR = 'S';
            ELSE
                IMPR = 'N'; /* ES DEVOLUCION */
            END
          ELSE
            IMPR = 'S';
          if (IMPR = 'S') then
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :GRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :MARCA INTO NOMMARCA;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :SUBGRUPO AND GRUP_COD = :GRUPO INTO :NOMSUBG;
            prneto = PRUNIT - DTOITMONTO - dtoitm1 - dtoitm2 - dtoitm3;
            if (IMPTOS = 'S') then
                if (cant <> 0) then
                    prnetosiniva = PRUNIT - DTOITMONTO - ((IVAITMONTO+CONSUMO) / CANT) - dtoit1m - dtoit2m - dtoit3m;
                else
                    prnetosiniva = PRUNIT - DTOITMONTO - dtoitm1 - dtoitm2 - dtoitm3;
            ELSE
                prnetosiniva = PRUNIT - DTOITMONTO - dtoitm1 - dtoitm2 - dtoitm3;
            if (ICOINC = 'SI') then
                SUBTOTIT = TOTAL - IVAITMONTO;
            else
                SUBTOTIT = TOTAL - IVAITMONTO - CONSUMO;
            TOTCONSUMO = TOTCONSUMO + CONSUMO;
            SELECT LOTE_VENCE FROM LOTES WHERE LOTE_NRO = :lote AND ARTI_COD = :ARTICULO AND BODE_COD = :boditem INTO :vlote;
            if ((REFITEM <> '.t') or (REFITEM IS NULL)) then
                BEGIN
                /* NO SUME LOS ENSAMBLES */
                if (IVAPORC = 0) then
                    SUMAEX = SUMAEX + TOTAL;
                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;
                END
            if (ANCHO IS NULL) then
                ANCHO = 0;
            if (ALTO IS NULL) then
                ALTO = 0;
            if (LARGO IS NULL) then
                LARGO = 0;
            if (PESO IS NULL) then
                PESO = 0;
            PESO = (PESO / 1000)* CANT * FACTOR;
            totcajas = totcajas + cajas;
            if (substr(ARTICULO,1,2) = '.t') then
                BEGIN
                REFITEM = '';
                TOTAL = 0;
                SUBTOTIT = 0;
                END
            SELECT STAND_COD FROM STANDS WHERE ARTI_COD = :ARTICULO AND STAND_BODEGA = :boditem INTO :stand;
            factcant = NULL;
            SELECT FIRST 1 UNAR_FACCAN FROM unidad_articulo WHERE ARTI_COD = :articulo INTO :factcant;
            if (factcant IS NULL) then
                factcant = 1;
            if (factcant = 1) then
                BEGIN
                ALTERNATIVAS = 0;
                PRINCIPALES = (CANT * FACTOR);
                END
            ELSE
                BEGIN
                ALTERNATIVAS = FLOOR(CANT * factor / factcant);
                PRINCIPALES = (CANT * FACTOR) - (alternativas * factcant);
                END
            SUSPEND;
            END
          END
    END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER PROCEDURE IMPR_DEVOLUCION(
    ID INTEGER)
RETURNS (
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    NIT VARCHAR(20),
    NOMTERCERO VARCHAR(60),
    VENDEDOR INTEGER,
    NOMVENDEDOR VARCHAR(60),
    PUNTOVTA INTEGER,
    NOMPUNTOVTA VARCHAR(30),
    CODBODEGA VARCHAR(2),
    NOMBODEGA VARCHAR(30),
    FACTURA VARCHAR(30),
    REMISION VARCHAR(10),
    COMIPORC NUMERIC(9,2),
    COMIMONTO NUMERIC(18,2),
    SUBTOTAL NUMERIC(18,2),
    DTOPORC NUMERIC(9,2),
    DTOMONTO NUMERIC(18,2),
    ADICIONAL NUMERIC(18,2),
    IVAMONTO NUMERIC(18,2),
    RTEFTEPORC NUMERIC(9,2),
    RTEFTEMONTO NUMERIC(18,2),
    RTEIVAPORC NUMERIC(9,2),
    RTEIVAMONTO NUMERIC(18,2),
    RTEICAPORC NUMERIC(9,2),
    RTEICAMONTO NUMERIC(18,2),
    EXTRA NUMERIC(18,2),
    TOTALFAC NUMERIC(18,2),
    TOTALPAGAR NUMERIC(18,2),
    OBS BLOB SUB_TYPE 1 SEGMENT SIZE 80,
    ITEM INTEGER,
    ARTICULO VARCHAR(15),
    CODBAR VARCHAR(15),
    ARTIDES VARCHAR(60),
    CANT NUMERIC(18,4),
    LOTE VARCHAR(15),
    UNIDAD VARCHAR(8),
    FACTOR NUMERIC(18,4),
    REFITEM VARCHAR(60),
    BODITEM VARCHAR(2),
    PRUNIT NUMERIC(18,2),
    DTOITPORC NUMERIC(9,2),
    DTOITMONTO NUMERIC(18,2),
    PRNETO NUMERIC(18,2),
    PRNETOSINIVA NUMERIC(18,2),
    IVAPORC NUMERIC(9,2),
    IVAITMONTO NUMERIC(18,2),
    CONSUMO NUMERIC(18,2),
    SUBTOTIT NUMERIC(18,2),
    TOTAL NUMERIC(18,2),
    CODIGOCL VARCHAR(20),
    ZONACOD VARCHAR(2),
    ZONANOM VARCHAR(60),
    DV CHAR(1),
    DIRECCION VARCHAR(60),
    CIUDAD VARCHAR(40),
    TELEFONO VARCHAR(40),
    CONTACTO VARCHAR(60),
    FAX VARCHAR(25),
    CEL VARCHAR(25),
    GRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    SUBGRUPO VARCHAR(3),
    NOMSUBG VARCHAR(30),
    MARCA VARCHAR(3),
    NOMMARCA VARCHAR(30),
    PESO NUMERIC(9,4),
    ANCHO NUMERIC(18,4),
    ALTO NUMERIC(18,4),
    LARGO NUMERIC(18,4),
    SUMA1 NUMERIC(18,2),
    SUMA2 NUMERIC(18,2),
    SUMA3 NUMERIC(18,2),
    IVA1 NUMERIC(18,2),
    IVA2 NUMERIC(18,2),
    IVA3 NUMERIC(18,2),
    TOTCONSUMO NUMERIC(18,2),
    SUMAEX NUMERIC(18,2),
    SUMAGR NUMERIC(18,2),
    OBSITEM BLOB SUB_TYPE 1 SEGMENT SIZE 80,
    ALTERNATIVAS NUMERIC(18,4),
    PRINCIPALES NUMERIC(18,4))
AS
DECLARE VARIABLE IMPTOS CHAR(1);
DECLARE VARIABLE TARIFA INTEGER;
declare variable ORDENCOD CHAR(2);
declare variable SUCUR VARCHAR(10);
declare variable PUNTOS NUMERIC(18,4);
declare variable ICOINC CHAR(2);
declare variable FACTCANT NUMERIC(18,4);
declare variable ANULADO CHAR(1);
BEGIN
execute procedure lee_configuracion('FACTURACION', 'ARTICULOS', 'IMPOCONSUMO INCLUIDO EN EL PRECIO BASE DE VENTA ANTES DE IVA') returning_values (icoinc);
SELECT F.PREF_PRE, DEVT_NUMERO, DEVT_FECHA, F.BODE_COD, BODE_NOM, F.TERC_NIT, DEVT_NOMTERC, F.VEND_COD, VEND_NOMBRE, F.PTVT_ID, PTVT_NOM,
    DEVT_FACTURA, DEVT_COMIPORC, DEVT_COMIMONTO, DEVT_IVAINC,
    DEVT_DTOPOR, DEVT_DTOMONTO, DEVT_ADICIONAL, DEVT_IVAMONTO, DEVT_RTFTEPORC, DEVT_RTFTEMONTO, DEVT_RTIVAPORC, DEVT_RTIVAMONTO, DEVT_RTICAPORC, DEVT_RTICAMONTO, DEVT_EXTRA, DEVT_TOTAL,
    TERC_CONTACTO, TERC_FAX, TERC_DV, TERC_CEL, DEVT_OBS, DEVT_SUCURSAL, DEVT_REMISION, DEVT_ANULADO
    FROM DEVOLUCIONES_VENTAS F, BODEGA B, VENDEDORES V, PUNTO_VENTA P, TERCEROS T
    WHERE F.BODE_COD = B.BODE_COD AND F.VEND_COD = V.VEND_COD AND F.PTVT_ID = P.PTVT_ID AND F.TERC_NIT = T.TERC_NIT AND F.DEVT_ID = :ID
    into :PREF, :NUMERO, :FECHA, :CODBODEGA, :NOMBODEGA, :NIT, :NOMTERCERO, :VENDEDOR, :NOMVENDEDOR, :PUNTOVTA, :NOMPUNTOVTA,
    :FACTURA, :COMIPORC, :COMIMONTO, :IMPTOS,
    :DTOPORC, :DTOMONTO, :ADICIONAL, :IVAMONTO, :RTEFTEPORC, :RTEFTEMONTO, :RTEIVAPORC, :RTEIVAMONTO, :RTEICAPORC, :RTEICAMONTO, :EXTRA, :TOTALFAC,
    :CONTACTO, :FAX, :DV, :CEL, :OBS, :SUCUR, :REMISION, :ANULADO;
SUBTOTAL = TOTALFAC - EXTRA - IVAMONTO - ADICIONAL + DTOMONTO;
TOTALPAGAR = TOTALFAC - RTEFTEMONTO - RTEIVAMONTO - RTEICAMONTO;
if (ANULADO = 'N') then
    EXECUTE PROCEDURE acumula_puntos_cliente (33, :id, :nit, :fecha) returning_values (:PUNTOS);
SELECT CLIE_COD, C.ZONA_COD, ZONA_NOM
    FROM CLIENTES C, ZONAS Z
    WHERE TERC_NIT = :NIT AND C.ZONA_COD = Z.ZONA_COD
    INTO :CODIGOCL, :ZONACOD, :ZONANOM;
SELECT CLSU_DIR, CLSU_CIUDAD, CLSU_TEL FROM CLIENTE_SUCURSALES WHERE TERC_NIT = :NIT AND CLCU_COD = :SUCUR
    INTO :DIRECCION, :CIUDAD, :TELEFONO;
    
SUMAEX = 0;
SUMA1 = 0;
SUMA2 = 0;
SUMA3 = 0;
IVA1 = 0;
IVA2 = 0;
IVA3 = 0;
TOTCONSUMO = 0;
ITEM = 0;
EXECUTE PROCEDURE lee_configuracion ('FACTURACION','DOCUMENTOS','ORDENAR ITEMS POR CODIGO DE ARTICULO') returning_values (:ORDENCOD);
if (ORDENCOD = 'SI') then
    BEGIN
    FOR SELECT D.ARTI_COD, DVDE_CODBAR, SUBSTR(DVDE_DESC,1,60), DVDE_CANT, DVDE_UNIDAD, BODE_COD, DVDE_LOTE, DVDE_PRUNIT, DVDE_DTOPORC, DVDE_DTOMONTO, DVDE_IVAPORC, DVDE_IVAMONTO, DVDE_CONSUMO, DVDE_TOTAL, DVDE_REFERENCIA,
        GRUP_COD, SUBG_COD, MARC_COD, ARTI_PESO, ARTI_ANCHO, ARTI_ALTO, ARTI_LARGO, TAIV_COD, DVDE_OBS, DVDE_FACTOR
        FROM DEVOLUCIONES_VENTAS_DETALLE D, ARTICULO A
        WHERE D.ARTI_COD = A.ARTI_COD AND D.DEVT_ID = :ID
        ORDER BY DVDE_CODBAR
        INTO :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :BODITEM, :LOTE, :PRUNIT, :DTOITPORC, :DTOITMONTO, :IVAPORC, :IVAITMONTO, :CONSUMO, :TOTAL, :REFITEM,
        :GRUPO, :SUBGRUPO, :MARCA, :PESO, :ANCHO, :ALTO, :LARGO, :TARIFA, :obsitem, :FACTOR
        DO
        BEGIN
        if (ARTICULO = CODBAR) then
            SELECT FIRST 1 COBA_COD FROM barras_articulo WHERE ARTI_COD = :articulo INTO :CODBAR;
        ITEM = ITEM + 1;
        if (ICOINC = 'SI') then
            SUBTOTIT = TOTAL - IVAITMONTO;
        else
            SUBTOTIT = TOTAL - IVAITMONTO - CONSUMO;
        PRNETO = PRUNIT - DTOITMONTO;
        if (PESO IS NULL) then
            PESO = 0;
        PESO = PESO / 1000 * CANT * FACTOR;
        if (IMPTOS = 'S') then
            if (cant <> 0) then
                prnetosiniva = PRUNIT - DTOITMONTO - ((IVAITMONTO+CONSUMO) / CANT);
            else
                prnetosiniva = PRUNIT - DTOITMONTO;
        ELSE
            prnetosiniva = PRUNIT - DTOITMONTO;
        TOTCONSUMO = TOTCONSUMO + CONSUMO;
        if ((REFITEM <> '.t') or (REFITEM IS NULL)) then
            BEGIN
            /* NO SUME LOS ENSAMBLES */
            if (IVAPORC = 0) then
                SUMAEX = SUMAEX + TOTAL;
            if (TARIFA = 1) then
                BEGIN
                SUMA1 = SUMA1 + TOTAL - IVAITMONTO;
                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;
            END
        if (substr(ARTICULO,1,2) = '.t') then
            BEGIN
            REFITEM = '';
            TOTAL = 0;
            END
        SELECT FIRST 1 UNAR_FACCAN FROM unidad_articulo WHERE ARTI_COD = :articulo INTO :factcant;
        ALTERNATIVAS = FLOOR(CANT / factcant);
        PRINCIPALES = CANT - (alternativas * factcant);
        SUSPEND;
        END
    END
ELSE
    BEGIN
    FOR SELECT D.ARTI_COD, DVDE_CODBAR, SUBSTR(DVDE_DESC,1,60), DVDE_CANT, DVDE_UNIDAD, BODE_COD, DVDE_LOTE, DVDE_PRUNIT, DVDE_DTOPORC, DVDE_DTOMONTO, DVDE_IVAPORC, DVDE_IVAMONTO, DVDE_CONSUMO, DVDE_TOTAL, DVDE_REFERENCIA,
        GRUP_COD, SUBG_COD, MARC_COD, ARTI_PESO, ARTI_ANCHO, ARTI_ALTO, ARTI_LARGO, TAIV_COD, DVDE_OBS, DVDE_FACTOR
        FROM DEVOLUCIONES_VENTAS_DETALLE D, ARTICULO A
        WHERE D.ARTI_COD = A.ARTI_COD AND D.DEVT_ID = :ID
        ORDER BY DVDE_ITEM
        INTO :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :BODITEM, :LOTE, :PRUNIT, :DTOITPORC, :DTOITMONTO, :IVAPORC, :IVAITMONTO, :CONSUMO, :TOTAL, :REFITEM,
        :GRUPO, :SUBGRUPO, :MARCA, :PESO, :ANCHO, :ALTO, :LARGO, :TARIFA, :obsitem, :FACTOR
        DO
        BEGIN
        if (ARTICULO = CODBAR) then
            SELECT FIRST 1 COBA_COD FROM barras_articulo WHERE ARTI_COD = :articulo INTO :CODBAR;
        SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :GRUPO INTO NOMGRUPO;
        SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :MARCA INTO NOMMARCA;
        SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :SUBGRUPO AND GRUP_COD = :GRUPO INTO :NOMSUBG;
        ITEM = ITEM + 1;
        if (ICOINC = 'SI') then
            SUBTOTIT = TOTAL - IVAITMONTO;
        else
            SUBTOTIT = TOTAL - IVAITMONTO - CONSUMO;
        PRNETO = PRUNIT - DTOITMONTO;
        if (PESO IS NULL) then
            PESO = 0;
        PESO = PESO / 1000 * CANT * FACTOR;
        if (IMPTOS = 'S') then
            if (cant <> 0) then
                prnetosiniva = PRUNIT - DTOITMONTO - ((IVAITMONTO+CONSUMO) / CANT);
            else
                prnetosiniva = PRUNIT - DTOITMONTO;
        ELSE
            prnetosiniva = PRUNIT - DTOITMONTO;
        TOTCONSUMO = TOTCONSUMO + CONSUMO;
        if ((REFITEM <> '.t') or (REFITEM IS NULL)) then
            BEGIN
            /* NO SUME LOS ENSAMBLES */
            if (IVAPORC = 0) then
                SUMAEX = SUMAEX + TOTAL;
            if (TARIFA = 1) then
                BEGIN
                SUMA1 = SUMA1 + TOTAL - IVAITMONTO;
                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;
            END
        if (substr(ARTICULO,1,2) = '.t') then
            BEGIN
            REFITEM = '';
            TOTAL = 0;
            END
        factcant = NULL;
        SELECT FIRST 1 UNAR_FACCAN FROM unidad_articulo WHERE ARTI_COD = :articulo INTO :factcant;
        if (factcant IS NULL) then
            factcant = 1;
        if (factcant = 1) then
            BEGIN
            ALTERNATIVAS = 0;
            PRINCIPALES = (CANT * FACTOR);
            END
        ELSE
            BEGIN
            ALTERNATIVAS = FLOOR(CANT * factor / factcant);
            PRINCIPALES = (CANT * FACTOR) - (alternativas * factcant);
            END
        SUSPEND;
        END
    END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER PROCEDURE IMPR_COTIZACION(
    ID INTEGER)
RETURNS (
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    VALIDEZ INTEGER,
    NIT VARCHAR(20),
    NOMTERCERO VARCHAR(60),
    VENDEDOR INTEGER,
    NOMVENDEDOR VARCHAR(60),
    PUNTOVTA INTEGER,
    NOMPUNTOVTA VARCHAR(60),
    SUBTOTAL NUMERIC(18,2),
    DTOPORC NUMERIC(9,2),
    DTOMONTO NUMERIC(18,2),
    ADICIONAL NUMERIC(18,2),
    IVAMONTO NUMERIC(18,2),
    EXTRA NUMERIC(18,2),
    TOTALFAC NUMERIC(18,2),
    OBS BLOB SUB_TYPE 1 SEGMENT SIZE 80,
    ITEM INTEGER,
    ARTICULO VARCHAR(15),
    CODBAR VARCHAR(15),
    ARTIDES VARCHAR(60),
    CANT NUMERIC(18,4),
    UNIDAD VARCHAR(8),
    FACTOR NUMERIC(18,4),
    LISTAPR INTEGER,
    REFITEM VARCHAR(60),
    PRUNIT NUMERIC(18,2),
    DTOITPORC NUMERIC(9,2),
    DTOITMONTO NUMERIC(18,2),
    PRNETO NUMERIC(18,2),
    PRNETOSINIVA NUMERIC(18,2),
    IVAPORC NUMERIC(9,2),
    IVAITMONTO NUMERIC(18,2),
    CONSUMO NUMERIC(18,2),
    SUBTOTIT NUMERIC(18,2),
    TOTAL NUMERIC(18,2),
    CODIGOCL VARCHAR(20),
    ZONACOD VARCHAR(2),
    ZONANOM VARCHAR(60),
    DV CHAR(1),
    DIRECCION VARCHAR(60),
    CIUDAD VARCHAR(40),
    TELEFONO VARCHAR(40),
    CONTACTO VARCHAR(60),
    FAX VARCHAR(25),
    CEL VARCHAR(25),
    GRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    SUBGRUPO VARCHAR(3),
    NOMSUBG VARCHAR(30),
    MARCA VARCHAR(3),
    NOMMARCA VARCHAR(30),
    PESO NUMERIC(9,4),
    ANCHO NUMERIC(18,4),
    ALTO NUMERIC(18,4),
    LARGO NUMERIC(18,4),
    SUMA1 NUMERIC(18,2),
    SUMA2 NUMERIC(18,2),
    SUMA3 NUMERIC(18,2),
    IVA1 NUMERIC(18,2),
    IVA2 NUMERIC(18,2),
    IVA3 NUMERIC(18,2),
    SUMAEX NUMERIC(18,2),
    SUMAGR NUMERIC(18,2),
    OBSITEM BLOB SUB_TYPE 1 SEGMENT SIZE 80,
    ALTERNATIVAS NUMERIC(18,4),
    PRINCIPALES NUMERIC(18,4))
AS
DECLARE VARIABLE IMPTOS CHAR(1);
DECLARE VARIABLE TARIFA INTEGER;
declare variable ORDENCOD CHAR(2);
declare variable SUCUR VARCHAR(10);
declare variable ICOINC CHAR(2);
declare variable FACTCANT NUMERIC(18,4);
BEGIN
execute procedure lee_configuracion('FACTURACION', 'ARTICULOS', 'IMPOCONSUMO INCLUIDO EN EL PRECIO BASE DE VENTA ANTES DE IVA') returning_values (icoinc);
SELECT F.PREF_PRE, COTI_NUMERO, COTI_FECHA, COTI_VALIDEZ, F.TERC_NIT, COTI_NOMTERC, F.VEND_COD, VEND_NOMBRE, F.PTVT_ID, PTVT_NOM,
    COTI_IMPTOS, COTI_DTOPORC, COTI_DTOMONTO, COTI_ADICIONAL, COTI_IVAMONTO, COTI_EXTRA, COTI_TOTAL,
    TERC_CONTACTO, TERC_FAX, TERC_CEL, TERC_DV, COTI_OBS, COTI_SUCURSAL
    FROM COTIZACIONES F, VENDEDORES V, PUNTO_VENTA P, TERCEROS T
    WHERE F.VEND_COD = V.VEND_COD AND F.PTVT_ID = P.PTVT_ID AND F.TERC_NIT = T.TERC_NIT AND F.COTI_ID = :ID
    into :PREF, :NUMERO, :FECHA, :VALIDEZ, :NIT, :NOMTERCERO, :VENDEDOR, :NOMVENDEDOR, :PUNTOVTA, :NOMPUNTOVTA,
    :IMPTOS, :DTOPORC, :DTOMONTO, :ADICIONAL, :IVAMONTO, :EXTRA, :TOTALFAC,
    :CONTACTO, :FAX, :CEL, :DV, :OBS, :SUCUR;
SUBTOTAL = TOTALFAC - EXTRA - IVAMONTO - ADICIONAL + DTOMONTO;

SELECT CLIE_COD, C.ZONA_COD, ZONA_NOM
    FROM CLIENTES C, ZONAS Z
    WHERE TERC_NIT = :NIT AND C.ZONA_COD = Z.ZONA_COD
    INTO :CODIGOCL, :ZONACOD, :ZONANOM;
SELECT CLSU_DIR, CLSU_CIUDAD, CLSU_TEL FROM CLIENTE_SUCURSALES WHERE TERC_NIT = :NIT AND CLCU_COD = :SUCUR
    INTO :DIRECCION, :CIUDAD, :TELEFONO;
    
SUMAEX = 0;
SUMA1 = 0;
SUMA2 = 0;
SUMA3 = 0;
IVA1 = 0;
IVA2 = 0;
IVA3 = 0;
ITEM = 0;
EXECUTE PROCEDURE lee_configuracion ('FACTURACION','DOCUMENTOS','ORDENAR ITEMS POR CODIGO DE ARTICULO') returning_values (:ORDENCOD);
if (ORDENCOD = 'SI') then
    BEGIN
    FOR SELECT D.ARTI_COD, CTDE_CODBAR, SUBSTR(CTDE_DESC,1,60), CTDE_CANT, CTDE_UNIDAD, LIPR_COD, CTDE_PRUNIT, CTDE_DTOPORC, CTDE_DTOMONTO, CTDE_IVAPORC, CTDE_IVAMONTO, CTDE_CONSUMO, CTDE_TOTAL, CTDE_REFERENCIA,
        GRUP_COD, SUBG_COD, MARC_COD, ARTI_PESO, ARTI_ANCHO, ARTI_ALTO, ARTI_LARGO, TAIV_COD, CTDE_OBS, CTDE_FACTOR
        FROM COTIZACIONES_DETALLE D, ARTICULO A
        WHERE D.ARTI_COD = A.ARTI_COD AND D.COTI_ID = :ID
        ORDER BY CTDE_CODBAR
        INTO :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :LISTAPR, :PRUNIT, :DTOITPORC, :DTOITMONTO, :IVAPORC, :IVAITMONTO, :CONSUMO, :TOTAL, :refitem,
        :GRUPO, :SUBGRUPO, :MARCA, :PESO, :ANCHO, :ALTO, :LARGO, :TARIFA, :obsitem, :FACTOR
        DO
        BEGIN
        if (ICOINC = 'SI') then
            SUBTOTIT = TOTAL - IVAITMONTO;
        else
            SUBTOTIT = TOTAL - IVAITMONTO - CONSUMO;
        if (ARTICULO = CODBAR) then
            SELECT FIRST 1 COBA_COD FROM barras_articulo WHERE ARTI_COD = :articulo INTO :CODBAR;
        SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :GRUPO INTO NOMGRUPO;
        SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :MARCA INTO NOMMARCA;
        SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :SUBGRUPO AND GRUP_COD = :GRUPO INTO :NOMSUBG;
        ITEM = ITEM + 1;
        PRNETO = PRUNIT - DTOITMONTO;
        if (PESO IS NULL) then
            PESO = 0;
        PESO = PESO / 1000 * CANT * FACTOR;
        if (IMPTOS = 'S') then
            if (cant <> 0) then
                prnetosiniva = PRUNIT - DTOITMONTO - ((IVAITMONTO+CONSUMO) / CANT);
            else
                prnetosiniva = PRUNIT - DTOITMONTO;
        ELSE
            prnetosiniva = PRUNIT - DTOITMONTO;
        if (ivaporc = 0) then
            SUMAEX = SUMAEX + TOTAL;
        if (TARIFA = 1) then
            BEGIN
            SUMA1 = SUMA1 + TOTAL - IVAITMONTO;
            IVA1 = IVA1 + IVAITMONTO;
            END
        if (TARIFA = 2) then
            BEGIN
            SUMA2 = SUMA2 + TOTAL - IVAITMONTO;
            IVA2 = IVA2 + IVAITMONTO;
            END
        if (TARIFA = 3) then
            BEGIN
            SUMA3 = SUMA3 + TOTAL - IVAITMONTO;
            IVA3 = IVA3 + IVAITMONTO;
            END
        SUMAGR = SUMA1 + SUMA2 + SUMA3;
        if (IMPTOS = 'N') then
            TOTAL = TOTAL - IVAITMONTO;
        factcant = NULL;
        SELECT FIRST 1 UNAR_FACCAN FROM unidad_articulo WHERE ARTI_COD = :articulo INTO :factcant;
        if (factcant IS NULL) then
            factcant = 1;
        if (factcant = 1) then
            BEGIN
            ALTERNATIVAS = 0;
            PRINCIPALES = (CANT * FACTOR);
            END
        ELSE
            BEGIN
            ALTERNATIVAS = FLOOR(CANT * factor / factcant);
            PRINCIPALES = (CANT * FACTOR) - (alternativas * factcant);
            END
        SUSPEND;
        END
    END
ELSE
    BEGIN
    FOR SELECT D.ARTI_COD, CTDE_CODBAR, SUBSTR(CTDE_DESC,1,60), CTDE_CANT, CTDE_UNIDAD, LIPR_COD, CTDE_PRUNIT, CTDE_DTOPORC, CTDE_DTOMONTO, CTDE_IVAPORC, CTDE_IVAMONTO, CTDE_CONSUMO, CTDE_TOTAL, CTDE_REFERENCIA,
        GRUP_COD, SUBG_COD, MARC_COD, ARTI_PESO, ARTI_ANCHO, ARTI_ALTO, ARTI_LARGO, TAIV_COD, CTDE_OBS, CTDE_FACTOR
        FROM COTIZACIONES_DETALLE D, ARTICULO A
        WHERE D.ARTI_COD = A.ARTI_COD AND D.COTI_ID = :ID
        ORDER BY CTDE_ITEM
        INTO :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :LISTAPR, :PRUNIT, :DTOITPORC, :DTOITMONTO, :IVAPORC, :IVAITMONTO, :CONSUMO, :TOTAL, :refitem,
        :GRUPO, :SUBGRUPO, :MARCA, :PESO, :ANCHO, :ALTO, :LARGO, :TARIFA, :obsitem, :FACTOR
        DO
        BEGIN
        SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :GRUPO INTO NOMGRUPO;
        SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :MARCA INTO NOMMARCA;
        SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :SUBGRUPO AND GRUP_COD = :GRUPO INTO :NOMSUBG;
        ITEM = ITEM + 1;
        if (ICOINC = 'SI') then
            SUBTOTIT = TOTAL - IVAITMONTO;
        else
            SUBTOTIT = TOTAL - IVAITMONTO - CONSUMO;
        PRNETO = PRUNIT - DTOITMONTO;
        if (PESO IS NULL) then
            PESO = 0;
        PESO = PESO / 1000 * CANT * FACTOR;
        if (IMPTOS = 'S') then
            if (cant <> 0) then
                prnetosiniva = PRUNIT - DTOITMONTO - ((IVAITMONTO+CONSUMO) / CANT);
            else
                prnetosiniva = PRUNIT - DTOITMONTO;
        ELSE
            prnetosiniva = PRUNIT - DTOITMONTO;
        if (ivaporc = 0) then
            SUMAEX = SUMAEX + TOTAL;
        if (TARIFA = 1) then
            BEGIN
            SUMA1 = SUMA1 + TOTAL - IVAITMONTO;
            IVA1 = IVA1 + IVAITMONTO;
            END
        if (TARIFA = 2) then
            BEGIN
            SUMA2 = SUMA2 + TOTAL - IVAITMONTO;
            IVA2 = IVA2 + IVAITMONTO;
            END
        if (TARIFA = 3) then
            BEGIN
            SUMA3 = SUMA3 + TOTAL - IVAITMONTO;
            IVA3 = IVA3 + IVAITMONTO;
            END
        SUMAGR = SUMA1 + SUMA2 + SUMA3;
        if (IMPTOS = 'N') then
            TOTAL = TOTAL - IVAITMONTO;
        factcant = NULL;
        SELECT FIRST 1 UNAR_FACCAN FROM unidad_articulo WHERE ARTI_COD = :articulo INTO :factcant;
        if (factcant IS NULL) then
            factcant = 1;
        if (factcant = 1) then
            BEGIN
            ALTERNATIVAS = 0;
            PRINCIPALES = (CANT * FACTOR);
            END
        ELSE
            BEGIN
            ALTERNATIVAS = FLOOR(CANT * factor / factcant);
            PRINCIPALES = (CANT * FACTOR) - (alternativas * factcant);
            END
        SUSPEND;
        END
    END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER PROCEDURE IMPR_PEDIDO(
    ID INTEGER)
RETURNS (
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    VALIDEZ INTEGER,
    NIT VARCHAR(20),
    NOMTERCERO VARCHAR(60),
    VENDEDOR INTEGER,
    NOMVENDEDOR VARCHAR(60),
    PUNTOVTA INTEGER,
    NOMPUNTOVTA VARCHAR(30),
    COTIZACION VARCHAR(30),
    SUBTOTAL NUMERIC(18,2),
    DTOPORC NUMERIC(9,2),
    DTOMONTO NUMERIC(18,2),
    ADICIONAL NUMERIC(18,2),
    IVAMONTO NUMERIC(18,2),
    EXTRA NUMERIC(18,2),
    TOTALFAC NUMERIC(18,2),
    OBS BLOB SUB_TYPE 1 SEGMENT SIZE 80,
    ITEM INTEGER,
    ARTICULO VARCHAR(15),
    CODBAR VARCHAR(15),
    ARTIDES VARCHAR(60),
    BODEGA VARCHAR(2),
    CANT NUMERIC(18,4),
    UNIDAD VARCHAR(8),
    FACTOR NUMERIC(18,4),
    LISTAPR INTEGER,
    REFITEM VARCHAR(60),
    PRUNIT NUMERIC(18,2),
    DTOITPORC NUMERIC(9,2),
    DTOITMONTO NUMERIC(18,2),
    PRNETO NUMERIC(18,2),
    PRNETOSINIVA NUMERIC(18,2),
    DTOIT1 NUMERIC(9,2),
    DTOIT2 NUMERIC(9,2),
    DTOIT3 NUMERIC(9,2),
    IVAPORC NUMERIC(9,2),
    IVAITMONTO NUMERIC(18,2),
    CONSUMO NUMERIC(18,2),
    SUBTOTIT NUMERIC(18,2),
    TOTAL NUMERIC(18,2),
    CODIGOCL VARCHAR(20),
    ZONACOD VARCHAR(2),
    ZONANOM VARCHAR(60),
    DV CHAR(1),
    DIRECCION VARCHAR(60),
    CIUDAD VARCHAR(40),
    TELEFONO VARCHAR(40),
    CONTACTO VARCHAR(60),
    FAX VARCHAR(25),
    CEL VARCHAR(25),
    GRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    SUBGRUPO VARCHAR(3),
    NOMSUBG VARCHAR(30),
    MARCA VARCHAR(3),
    NOMMARCA VARCHAR(30),
    PESO NUMERIC(9,4),
    ANCHO NUMERIC(18,4),
    ALTO NUMERIC(18,4),
    LARGO NUMERIC(18,4),
    SUMA1 NUMERIC(18,2),
    SUMA2 NUMERIC(18,2),
    SUMA3 NUMERIC(18,2),
    IVA1 NUMERIC(18,2),
    IVA2 NUMERIC(18,2),
    IVA3 NUMERIC(18,2),
    SUMAEX NUMERIC(18,2),
    SUMAGR NUMERIC(18,2),
    DTOIT1M NUMERIC(18,2),
    DTOIT2M NUMERIC(18,2),
    DTOIT3M NUMERIC(18,2),
    OBSITEM BLOB SUB_TYPE 1 SEGMENT SIZE 80,
    ALTERNATIVAS NUMERIC(18,4),
    PRINCIPALES NUMERIC(18,4))
AS
DECLARE VARIABLE IMPTOS CHAR(1);
DECLARE VARIABLE TARIFA INTEGER;
declare variable ORDENCOD CHAR(2);
declare variable SUCUR VARCHAR(10);
declare variable ICOINC CHAR(2);
declare variable DTOITM1 NUMERIC(18,2);
declare variable DTOITM2 NUMERIC(18,2);
declare variable DTOITM3 NUMERIC(18,2);
declare variable FACTCANT NUMERIC(18,4);
BEGIN
execute procedure lee_configuracion('FACTURACION', 'ARTICULOS', 'IMPOCONSUMO INCLUIDO EN EL PRECIO BASE DE VENTA ANTES DE IVA') returning_values (icoinc);
SELECT F.PREF_PRE, PEDI_NUMERO, PEDI_FECHA, PEDI_VALIDEZ, F.TERC_NIT, PEDI_NOMTERC, F.VEND_COD, VEND_NOMBRE, F.PTVT_ID, PTVT_NOM, PEDI_COTIZACI,
    PEDI_IVAINC, PEDI_DTOPOR, PEDI_DTOMONTO, PEDI_ADICIONAL, PEDI_IVAMONTO, PEDI_EXTRA, PEDI_TOTAL,
    TERC_CONTACTO, TERC_FAX, TERC_DV, TERC_CEL, PEDI_OBS, PEDI_SUCURSAL, PEDI_DTOIT1, PEDI_DTOIT2, PEDI_DTOIT3
    FROM PEDIDOS F, VENDEDORES V, PUNTO_VENTA P, TERCEROS T
    WHERE F.VEND_COD = V.VEND_COD AND F.PTVT_ID = P.PTVT_ID AND F.TERC_NIT = T.TERC_NIT AND F.PEDI_ID = :ID
    into :PREF, :NUMERO, :FECHA, :VALIDEZ, :NIT, :NOMTERCERO, :VENDEDOR, :NOMVENDEDOR, :PUNTOVTA, :NOMPUNTOVTA, :COTIZACION,
    :IMPTOS, :DTOPORC, :DTOMONTO, :ADICIONAL, :IVAMONTO, :EXTRA, :TOTALFAC,
    :CONTACTO, :FAX, :DV, :CEL, :OBS, :SUCUR, :dtoit1m, :dtoit2m, :dtoit3m;
SUBTOTAL = TOTALFAC - EXTRA - IVAMONTO - ADICIONAL + DTOMONTO;

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

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER PROCEDURE IMPR_REMISION(
    ID INTEGER)
RETURNS (
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    NIT VARCHAR(20),
    NOMTERCERO VARCHAR(60),
    VENDEDOR INTEGER,
    NOMVENDEDOR VARCHAR(60),
    PUNTOVTA INTEGER,
    NOMPUNTOVTA VARCHAR(30),
    CODBODEGA VARCHAR(2),
    NOMBODEGA VARCHAR(30),
    COTIZACION VARCHAR(30),
    PEDIDO VARCHAR(30),
    FACTURA VARCHAR(30),
    SUBTOTAL NUMERIC(18,2),
    IVAMONTO NUMERIC(18,2),
    TOTALFAC NUMERIC(18,2),
    DESPACHO VARCHAR(255),
    TRANSPORTADOR VARCHAR(60),
    OBS BLOB SUB_TYPE 1 SEGMENT SIZE 80,
    ITEM INTEGER,
    ARTICULO VARCHAR(15),
    CODBAR VARCHAR(15),
    ARTIDES VARCHAR(60),
    CANT NUMERIC(18,4),
    LOTE VARCHAR(15),
    VLOTE DATE,
    UNIDAD VARCHAR(8),
    FACTOR NUMERIC(18,4),
    CAJAS NUMERIC(18,4),
    DEVUELTO NUMERIC(18,4),
    CONSUMIDO NUMERIC(18,4),
    LISTAPR INTEGER,
    REFITEM VARCHAR(60),
    BODITEM VARCHAR(2),
    STAND VARCHAR(15),
    PRUNIT NUMERIC(18,2),
    DTOITPORC NUMERIC(9,2),
    DTOITMONTO NUMERIC(18,2),
    PRNETOSINIVA NUMERIC(18,2),
    PRNETO NUMERIC(18,2),
    IVAPORC NUMERIC(9,2),
    IVAITMONTO NUMERIC(18,2),
    CONSUMO NUMERIC(18,2),
    SUBTOTIT NUMERIC(18,2),
    TOTAL NUMERIC(18,2),
    CODIGOCL VARCHAR(20),
    ZONACOD VARCHAR(2),
    ZONANOM VARCHAR(60),
    DV CHAR(1),
    DIRECCION VARCHAR(60),
    CIUDAD VARCHAR(40),
    TELEFONO VARCHAR(40),
    CONTACTO VARCHAR(60),
    FAX VARCHAR(25),
    CEL VARCHAR(25),
    GRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    SUBGRUPO VARCHAR(3),
    NOMSUBG VARCHAR(30),
    MARCA VARCHAR(3),
    NOMMARCA VARCHAR(30),
    PESO NUMERIC(9,4),
    ANCHO NUMERIC(18,4),
    ALTO NUMERIC(18,4),
    LARGO NUMERIC(18,4),
    SUMA1 NUMERIC(18,2),
    SUMA2 NUMERIC(18,2),
    SUMA3 NUMERIC(18,2),
    IVA1 NUMERIC(18,2),
    IVA2 NUMERIC(18,2),
    IVA3 NUMERIC(18,2),
    SUMAEX NUMERIC(18,2),
    SUMAGR NUMERIC(18,2),
    TOTCAJAS NUMERIC(18,2),
    OBSITEM BLOB SUB_TYPE 1 SEGMENT SIZE 80,
    ALTERNATIVAS NUMERIC(18,4),
    PRINCIPALES NUMERIC(18,4))
AS
DECLARE VARIABLE IMPTOS CHAR(1);
DECLARE VARIABLE TARIFA INTEGER;
declare variable ORDENCOD CHAR(2);
declare variable SUCUR VARCHAR(10);
declare variable ICOINC CHAR(2);
declare variable FACTCANT NUMERIC(18,4);
BEGIN
execute procedure lee_configuracion('FACTURACION', 'ARTICULOS', 'IMPOCONSUMO INCLUIDO EN EL PRECIO BASE DE VENTA ANTES DE IVA') returning_values (icoinc);
EXECUTE PROCEDURE lee_configuracion ('FACTURACION','DOCUMENTOS','ORDENAR ITEMS POR CODIGO DE ARTICULO') returning_values (:ORDENCOD);
SELECT F.PREF_PRE, REVT_NUMERO, REVT_FECHA, F.BODE_COD, BODE_NOM, F.TERC_NIT, REVT_NOMTERC, F.VEND_COD, VEND_NOMBRE, F.PTVT_ID, PTVT_NOM,
    REVT_COTIZACI, REVT_PEDIDO, REVT_FACTURA, REVT_IVAINC,
    REVT_IVAMONTO, REVT_TOTAL, REVT_DESPACHO, REVT_TRANSP,
    TERC_CONTACTO, TERC_FAX, TERC_DV, TERC_CEL, REVT_OBS, REVT_SUCURSAL
    FROM REMISIONES_VENTA F, BODEGA B, VENDEDORES V, PUNTO_VENTA P, TERCEROS T
    WHERE F.BODE_COD = B.BODE_COD AND F.VEND_COD = V.VEND_COD AND F.PTVT_ID = P.PTVT_ID AND F.TERC_NIT = T.TERC_NIT AND F.REVT_ID = :ID
    into :PREF, :NUMERO, :FECHA, :CODBODEGA, :NOMBODEGA, :NIT, :NOMTERCERO, :VENDEDOR, :NOMVENDEDOR, :PUNTOVTA, :NOMPUNTOVTA,
    :COTIZACION, :PEDIDO, :FACTURA, :IMPTOS,
    :IVAMONTO, :TOTALFAC, :DESPACHO, :transportador, 
    :CONTACTO, :FAX, :DV, :CEL, :OBS, :SUCUR;
SUBTOTAL = TOTALFAC - IVAMONTO;

SELECT CLIE_COD, C.ZONA_COD, ZONA_NOM
    FROM CLIENTES C, ZONAS Z
    WHERE TERC_NIT = :NIT AND C.ZONA_COD = Z.ZONA_COD
    INTO :CODIGOCL, :ZONACOD, :ZONANOM;
SELECT CLSU_DIR, CLSU_CIUDAD, CLSU_TEL FROM CLIENTE_SUCURSALES WHERE TERC_NIT = :NIT AND CLCU_COD = :SUCUR
    INTO :DIRECCION, :CIUDAD, :TELEFONO;
    
SUMAEX = 0;
SUMA1 = 0;
SUMA2 = 0;
SUMA3 = 0;
IVA1 = 0;
IVA2 = 0;
IVA3 = 0;
ITEM = 0;
totcajas = 0;
if (ORDENCOD = 'SI') then
    BEGIN
    FOR SELECT D.ARTI_COD, RVDE_CODBAR, SUBSTR(RVDE_DESC,1,60), RVDE_CANT, RVDE_UNIDAD, BODE_COD, RVDE_LOTE, LIPR_COD, RVDE_PRUNIT, RVDE_DTOPORC, RVDE_DTOMONTO, RVDE_IVAPORC, RVDE_IVAMONTO, RVDE_CONSUMO, RVDE_TOTAL, RVDE_REFERENCIA,
        GRUP_COD, SUBG_COD, MARC_COD, ARTI_PESO, ARTI_ANCHO, ARTI_ALTO, ARTI_LARGO, TAIV_COD, RVDE_DEVUELTO, RVDE_OBS, RVDE_CAJAS, RVDE_FACTOR
        FROM REMISIONES_VENTA_DETALLE D, ARTICULO A
        WHERE D.ARTI_COD = A.ARTI_COD AND D.REVT_ID = :ID
        ORDER BY RVDE_CODBAR
        INTO :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :BODITEM, :LOTE, :LISTAPR, :PRUNIT, :DTOITPORC, :DTOITMONTO, :IVAPORC, :IVAITMONTO, :CONSUMO, :TOTAL, :refitem,
            :GRUPO, :SUBGRUPO, :MARCA, :PESO, :ANCHO, :ALTO, :LARGO, :TARIFA, :DEVUELTO, :obsitem, :CAJAS, :FACTOR
        DO
        BEGIN
        if (ARTICULO = CODBAR) then
            SELECT FIRST 1 COBA_COD FROM barras_articulo WHERE ARTI_COD = :articulo INTO :CODBAR;
        SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :GRUPO INTO NOMGRUPO;
        SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :MARCA INTO NOMMARCA;
        SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :SUBGRUPO AND GRUP_COD = :GRUPO INTO :NOMSUBG;
        SELECT LOTE_VENCE FROM LOTES WHERE LOTE_NRO = :lote AND ARTI_COD = :ARTICULO AND BODE_COD = :boditem INTO :vlote;
        if (ICOINC = 'SI') then
            SUBTOTIT = TOTAL - IVAITMONTO;
        else
            SUBTOTIT = TOTAL - IVAITMONTO - CONSUMO;
        CONSUMIDO = cant * factor - devuelto;
        ITEM = ITEM + 1;
        PRNETO = PRUNIT - DTOITMONTO;
        if (PESO IS NULL) then
            PESO = 0;
        PESO = PESO / 1000 * CANT * FACTOR;
        if (IMPTOS = 'S') then
            if (cant <> 0) then
                prnetosiniva = PRUNIT - DTOITMONTO - ((IVAITMONTO+CONSUMO) / CANT);
            else
                prnetosiniva = PRUNIT - DTOITMONTO;
        ELSE
            prnetosiniva = PRUNIT - DTOITMONTO;
        if (IVAPORC = 0) then
            SUMAEX = SUMAEX + TOTAL;
        if (TARIFA = 1) then
            BEGIN
            SUMA1 = SUMA1 + TOTAL - IVAITMONTO;
            IVA1 = IVA1 + IVAITMONTO;
            END
        if (TARIFA = 2) then
            BEGIN
            SUMA2 = SUMA2 + TOTAL - IVAITMONTO;
            IVA2 = IVA2 + IVAITMONTO;
            END
        if (TARIFA = 3) then
            BEGIN
            SUMA3 = SUMA3 + TOTAL - IVAITMONTO;
            IVA3 = IVA3 + IVAITMONTO;
            END
        SUMAGR = SUMA1 + SUMA2 + SUMA3;

        totcajas = totcajas + cajas;
        SELECT STAND_COD FROM STANDS WHERE ARTI_COD = :ARTICULO AND STAND_BODEGA = :boditem INTO :stand;
        factcant = NULL;
        SELECT FIRST 1 UNAR_FACCAN FROM unidad_articulo WHERE ARTI_COD = :articulo INTO :factcant;
        if (factcant IS NULL) then
            factcant = 1;
        if (factcant = 1) then
            BEGIN
            ALTERNATIVAS = 0;
            PRINCIPALES = (CANT * FACTOR);
            END
        ELSE
            BEGIN
            ALTERNATIVAS = FLOOR(CANT * factor / factcant);
            PRINCIPALES = (CANT * FACTOR) - (alternativas * factcant);
            END
        SUSPEND;
        END
    END
ELSE
    BEGIN
    FOR SELECT RVDE_ITEM, D.ARTI_COD, RVDE_CODBAR, SUBSTR(RVDE_DESC,1,60), RVDE_CANT, RVDE_UNIDAD, BODE_COD, RVDE_LOTE, LIPR_COD, RVDE_PRUNIT, RVDE_DTOPORC, RVDE_DTOMONTO, RVDE_IVAPORC, RVDE_IVAMONTO, RVDE_CONSUMO, RVDE_TOTAL, RVDE_REFERENCIA,
        GRUP_COD, SUBG_COD, MARC_COD, ARTI_PESO, ARTI_ANCHO, ARTI_ALTO, ARTI_LARGO, TAIV_COD, RVDE_DEVUELTO, RVDE_OBS, RVDE_CAJAS, RVDE_FACTOR
        FROM REMISIONES_VENTA_DETALLE D, ARTICULO A
        WHERE D.ARTI_COD = A.ARTI_COD AND D.REVT_ID = :ID
        ORDER BY RVDE_ITEM
        INTO :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :BODITEM, :LOTE, :LISTAPR, :PRUNIT, :DTOITPORC, :DTOITMONTO, :IVAPORC, :IVAITMONTO, :CONSUMO, :TOTAL, :refitem,
            :GRUPO, :SUBGRUPO, :MARCA, :PESO, :ANCHO, :ALTO, :LARGO, :TARIFA, :DEVUELTO, :obsitem, :CAJAS, :FACTOR
        DO
        BEGIN
        SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :GRUPO INTO NOMGRUPO;
        SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :MARCA INTO NOMMARCA;
        SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :SUBGRUPO AND GRUP_COD = :GRUPO INTO :NOMSUBG;
        SELECT LOTE_VENCE FROM LOTES WHERE LOTE_NRO = :lote AND ARTI_COD = :ARTICULO AND BODE_COD = :boditem INTO :vlote;
        if (ICOINC = 'SI') then
            SUBTOTIT = TOTAL - IVAITMONTO;
        else
            SUBTOTIT = TOTAL - IVAITMONTO - CONSUMO;
        CONSUMIDO = cant * factor - devuelto;
        ITEM = ITEM + 1;
        PRNETO = PRUNIT - DTOITMONTO;
        if (PESO IS NULL) then
            PESO = 0;
        PESO = PESO / 1000 * CANT * FACTOR;
        if (IMPTOS = 'S') then
            if (cant <> 0) then
                prnetosiniva = PRUNIT - DTOITMONTO - ((IVAITMONTO+CONSUMO) / CANT);
            else
                prnetosiniva = PRUNIT - DTOITMONTO;
        ELSE
            prnetosiniva = PRUNIT - DTOITMONTO;
        if (IVAPORC = 0) then
            SUMAEX = SUMAEX + TOTAL;
        if (TARIFA = 1) then
            BEGIN
            SUMA1 = SUMA1 + TOTAL - IVAITMONTO;
            IVA1 = IVA1 + IVAITMONTO;
            END
        if (TARIFA = 2) then
            BEGIN
            SUMA2 = SUMA2 + TOTAL - IVAITMONTO;
            IVA2 = IVA2 + IVAITMONTO;
            END
        if (TARIFA = 3) then
            BEGIN
            SUMA3 = SUMA3 + TOTAL - IVAITMONTO;
            IVA3 = IVA3 + IVAITMONTO;
            END
        SUMAGR = SUMA1 + SUMA2 + SUMA3;
        totcajas = totcajas + cajas;
        SELECT STAND_COD FROM STANDS WHERE ARTI_COD = :ARTICULO AND STAND_BODEGA = :boditem INTO :stand;
        factcant = NULL;
        SELECT FIRST 1 UNAR_FACCAN FROM unidad_articulo WHERE ARTI_COD = :articulo INTO :factcant;
        if (factcant IS NULL) then
            factcant = 1;
        if (factcant = 1) then
            BEGIN
            ALTERNATIVAS = 0;
            PRINCIPALES = (CANT * FACTOR);
            END
        ELSE
            BEGIN
            ALTERNATIVAS = FLOOR(CANT * factor / factcant);
            PRINCIPALES = (CANT * FACTOR) - (alternativas * factcant);
            END
        SUSPEND;
        END
    END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER RECIBOS_CAJA_DETALLE_AI FOR RECIBOS_CAJA_DETALLE
ACTIVE AFTER INSERT POSITION 0
AS
declare variable EXISTE CHAR(1);
declare variable FEC DATE;
declare variable NIT VARCHAR(20);
declare variable CONCEPTO VARCHAR(60);
declare variable PREFIJO VARCHAR(4);
declare variable NUMERO VARCHAR(6);
declare variable SALDO NUMERIC(18,2);
declare variable RETES CHAR(2);
declare variable OK CHAR(1);
declare variable RCANTI INTEGER;
declare variable COBR INTEGER;
declare variable ACUMULA CHAR(8);
declare variable DIASMAX INTEGER;
declare variable FACTOR NUMERIC(9,4);
declare variable FACTORD NUMERIC(9,4);
declare variable DIAS INTEGER;
declare variable FECDOC DATE;
declare variable FECMIN DATE;
declare variable FECMINS VARCHAR(10);
declare variable TRM NUMERIC(18,2);
BEGIN
if ((NEW.RECA_ID <> 0) and (new.rcde_anulado = 'N')) then
    BEGIN
    /* Abone el documento referenciado */
    select PREF_PRE, RECA_NUMERO, RECA_fecha, RECA_CONC, TERC_NIT, COBR_COD, RECA_TRM from RECIBOS_CAJA
        where RECA_id = new.RECA_id into :PREFIJO, :NUMERO, :FEC, :CONCEPTO, :NIT, :COBR, :TRM;
    OK = 'N';
    if (new.RCDE_TIPODOC = 45) then
        BEGIN
        /* BUSQUE SI TIENE RECA_ID, SI NO LO ACTUALIZA */
        SELECT RECA_ID FROM ANTICIPOS_CLIENTE WHERE ANCL_ID = NEW.RCDE_IDDOC INTO :RCANTI;
        if (RCANTI = 0) then
            BEGIN
            OK = 'S';
            UPDATE ANTICIPOS_CLIENTE SET RECA_ID = NEW.RECA_ID WHERE ANCL_ID = NEW.RCDE_IDDOC;
            END
        END
    if (OK = 'N') then
        BEGIN
        /* valide que no se pase del saldo */
        execute procedure saldo_doc_cartera(new.rcde_tipodoc, new.rcde_iddoc, '9999/12/31', 0) returning_values(saldo);
        execute procedure lee_configuracion('CARTERA', 'SALDOS', 'DESCONTAR RETENCIONES POR CAUSACION') returning_values (RETES);
        if (SALDO < 0) then
            BEGIN
            if (RETES = 'SI') then
                begin
                if (saldo > (NEW.rcde_abono + NEW.rcde_dtof)) then
                    EXCEPTION DOCUMENTO_ABONO_MAYOR 'EL SALDO DEL DOCUMENTO ' || NEW.rcde_prefijo || NEW.rcde_numero || ' ES INSUFICIENTE.';
                end
            ELSE
                begin
                if (saldo > (NEW.rcde_abono + NEW.rcde_rtfte + NEW.rcde_rtiva + NEW.rcde_rtica + NEW.rcde_dtof)) then
                    EXCEPTION DOCUMENTO_ABONO_MAYOR 'EL SALDO DEL DOCUMENTO ' || NEW.rcde_prefijo || NEW.rcde_numero || ' ES INSUFICIENTE.';
                end
            END
        else
            BEGIN
            if (RETES = 'SI') then
                begin
                if (saldo < (NEW.rcde_abono + NEW.rcde_dtof)) then
                    EXCEPTION DOCUMENTO_ABONO_MAYOR 'EL SALDO DEL DOCUMENTO ' || NEW.rcde_prefijo || NEW.rcde_numero || ' ES INSUFICIENTE.';
                end
            ELSE
                begin
                if (saldo < (NEW.rcde_abono + NEW.rcde_rtfte + NEW.rcde_rtiva + NEW.rcde_rtica + NEW.rcde_dtof)) then
                    EXCEPTION DOCUMENTO_ABONO_MAYOR 'EL SALDO DEL DOCUMENTO ' || NEW.rcde_prefijo || NEW.rcde_numero || ' ES INSUFICIENTE.';
                end
            END
        EXISTE = 'N';
        select 'S' from saldos_doc_cartera where sdca_tiporef = new.rcde_tipodoc and sdca_idref = new.rcde_iddoc and sdca_fecha = :FEC into :EXISTE;
        if (Existe = 'S') then
            begin
            /* actualice el saldo del dia */
            UPDATE saldos_doc_cartera
                SET SDCA_ABONO = SDCA_ABONO + NEW.rcde_abono + new.rcde_dtof,
                SDCA_ABRTFTE = SDCA_ABRTFTE + NEW.rcde_RTFTE,
                SDCA_ABRTIVA = SDCA_ABRTIVA + NEW.rcde_RTIVA,
                SDCA_ABRTICA = SDCA_ABRTICA + NEW.rcde_RTICA,
                SDCA_TRM = :TRM
                WHERE SDCA_TIPOREF = NEW.RCDE_TIPODOC AND SDCA_IDREF = NEW.rcde_IDDOC AND SDCA_FECHA = :FEC;
            END
        ELSE
            BEGIN
            /* Inserte un nuevo saldo diario */
            INSERT INTO SALDOS_DOC_CARTERA (SDCA_TIPOREF, SDCA_IDREF, SDCA_FECHA, TERC_NIT, SDCA_RTFTE, SDCA_RTIVA, SDCA_RTICA, SDCA_ABONO, SDCA_ABRTFTE, SDCA_ABRTIVA, SDCA_ABRTICA, SDCA_DEBITO, SDCA_MONTO, SDCA_TRM)
                VALUES (NEW.RCDE_TIPODOC, NEW.RCDE_IDDOC, :FEC, :NIT, 0, 0, 0, (NEW.rcde_abono+NEW.rcde_dtof), NEW.rcde_rtfte, NEW.rcde_rtiva, NEW.rcde_rtica, 'N', 0, :TRM);
            END
        END
    /* actualice el registro en mov_cliente (por si son varios items) */
    EXISTE = 'N';
    SELECT 'S' FROM MOVIMIENTO_CLIENTES WHERE MVCL_TIPOREF = 61 AND MVCL_IDREF = NEW.RECA_ID AND MVCL_SUCURSAL = NEW.rcde_sucursal INTO :EXISTE;
    if (EXISTE = 'S') then
        begin
        UPDATE movimiento_clientes
            SET MVCL_MONTO = MVCL_MONTO + NEW.rcde_abono + NEW.rcde_dtof,
                MVCL_RTEFTE = MVCL_RTEFTE + NEW.rcde_rtfte,
                MVCL_RTEIVA = MVCL_RTEIVA + NEW.rcde_rtiva,
                MVCL_RTEICA = MVCL_RTEICA + NEW.rcde_rtica,
                MVCL_TRM = :TRM
            WHERE MVCL_TIPOREF = 61 AND MVCL_IDREF = NEW.RECA_ID AND MVCL_SUCURSAL = NEW.rcde_sucursal;
        end
    ELSE
        INSERT INTO MOVIMIENTO_CLIENTES (MVCL_ID, TERC_NIT, MVCL_TIPOREF, MVCL_IDREF, MVCL_FECHA, MVCL_VENCE, MVCL_CONC, MVCL_MONTO, MVCL_RTEFTE, MVCL_RTEIVA, MVCL_RTEICA, MVCL_DEBITO, MVCL_ABONO, MVCL_PREFREF, MVCL_NUMREF, MVCL_SUCURSAL, COBR_COD, MVCL_TRM)
            VALUES (GEN_ID(ID_MOVCLI, 1), :NIT, 61, NEW.RECA_ID, :FEC, :FEC, :CONCEPTO, (NEW.RCDE_ABONO+NEW.RCDE_DTOF), NEW.RCDE_RTFTE, NEW.RCDE_RTIVA, NEW.RCDE_RTICA, 'N', 'S', :PREFIJO, :NUMERO, NEW.rcde_sucursal, :COBR, :TRM);

    /* acumule los puntos del vendedor */
    SELECT MVCL_FECHA FROM MOVIMIENTO_CLIENTES WHERE MVCL_TIPOREF = new.rcde_tipodoc AND MVCL_IDREF = new.rcde_iddoc
        INTO :FECDOC;
    if (FECDOC IS NOT NULL) then
        DIAS = FEC - FECDOC;
    else
        DIAS = 999;
    execute procedure lee_configuracion('FACTURACION', 'FACTURAS', 'ACUMULAR PUNTOS DE VENTAS POR VENDEDOR') returning_values (ACUMULA);
    execute procedure lee_configuracion('FACTURACION', 'FACTURAS', 'DIAS DE RECAUDO MAXIMO PARA ACUMULAR PUNTOS AL VENDEDOR') returning_values (DIASMAX);
    if ((acumula = 'SI') and (diasmax >= dias)) then
        begin
        SELECT COPU_FACTOR FROM comisiones_puntos WHERE COPU_COD = NEW.rcde_comip INTO :FACTOR;
        if ((NEW.rcde_tipodoc = 31) or (NEW.rcde_tipodoc = 41)) then
            begin
            /* recorra la factura acumulando los puntos */
            if (new.rcde_tipodoc = 31) then
                select (fact_total-fact_ivamonto)/fact_total from facturas where fact_id = new.rcde_iddoc into :factord;
            if (new.rcde_tipodoc = 41) then
                select ndcl_monto/(ndcl_monto+ndcl_ivamonto) from notas_debito_clientes where ndcl_id = new.rcde_iddoc into :factord;
            /* inserte el registro de puntos */
            insert into puntos_vendedor (vend_cod, ptvt_fecha, ptvt_tipodoc, ptvt_iddoc, ptvt_db, ptvt_cr)
                values (:cobr, :fec, new.rcde_tipodoc, new.rcde_iddoc, (new.rcde_abono*:factord*:factor), 0);
            end
        if ((new.rcde_tipodoc = 33) or (new.rcde_tipodoc = 42)) then
            begin
            if (new.rcde_tipodoc = 33) then
                select (devt_total-devt_ivamonto)/devt_total from devoluciones_ventas where devt_id = new.rcde_iddoc into :factord;
            if (new.rcde_tipodoc = 42) then
                select nccl_monto/(nccl_monto+nccl_ivamonto) from notas_credito_clientes where nccl_id = new.rcde_iddoc into :factord;
            /* inserte el registro de puntos */
            insert into puntos_vendedor (vend_cod, ptvt_fecha, ptvt_tipodoc, ptvt_iddoc, ptvt_db, ptvt_cr)
                values (:cobr, :fec, new.rcde_tipodoc, new.rcde_iddoc, 0, (new.rcde_abono*:factord*:factor));
            end

        execute procedure lee_configuracion('FACTURACION', 'FACTURAS', 'ACUMULAR PUNTOS POR VENTAS A CLIENTE REGULARES') returning_values (ACUMULA);
        execute procedure lee_configuracion('FACTURACION', 'FACTURAS', 'FECHA A PARTIR DE LA CUAL ACUMULAR PUNTOS A CLIENTES POR RECAUDO') returning_values (FECMINS);
        if (FECMINS <> '') then
            FECMIN = CAST(FECMINS AS DATE);
        else
            FECMIN = '2009/01/01';
        if ((acumula = 'RECAUDO') and (:fecdoc >= :fecmin)) then
            BEGIN
            SELECT COPU_FACTORCL FROM comisiones_puntos WHERE COPU_COD = NEW.rcde_comip INTO :FACTOR;
            if ((NEW.rcde_tipodoc = 31) or (NEW.rcde_tipodoc = 41)) then
                begin
                /* recorra la factura acumulando los puntos */
                if (new.rcde_tipodoc = 31) then
                    select (fact_total-fact_ivamonto)/fact_total from facturas where fact_id = new.rcde_iddoc into :factord;
                if (new.rcde_tipodoc = 41) then
                    select ndcl_monto/(ndcl_monto+ndcl_ivamonto) from notas_debito_clientes where ndcl_id = new.rcde_iddoc into :factord;
                /* inserte el registro de puntos */
                insert into puntos_cliente (ptcl_nit, ptcl_fecha, ptcl_tipodoc, ptcl_iddoc, ptcl_db, ptcl_cr)
                    values (:nit, :fec, new.rcde_tipodoc, new.rcde_iddoc, (new.rcde_abono*:factord*:factor), 0);
                end
            if ((new.rcde_tipodoc = 33) or (new.rcde_tipodoc = 42)) then
                begin
                if (new.rcde_tipodoc = 33) then
                    select (devt_total-devt_ivamonto)/devt_total from devoluciones_ventas where devt_id = new.rcde_iddoc into :factord;
                if (new.rcde_tipodoc = 42) then
                    select nccl_monto/(nccl_monto+nccl_ivamonto) from notas_credito_clientes where nccl_id = new.rcde_iddoc into :factord;
                /* inserte el registro de puntos */
                insert into puntos_cliente (ptcl_nit, ptcl_fecha, ptcl_tipodoc, ptcl_iddoc, ptcl_db, ptcl_cr)
                    values (:nit, :fec, new.rcde_tipodoc, new.rcde_iddoc, 0, (new.rcde_abono*:factord*:factor));
                end
            END
        end
    end
END
^

SET TERM ; ^


SET TERM ^ ;

CREATE OR ALTER TRIGGER RECIBOS_CAJA_DETALLE_AU FOR RECIBOS_CAJA_DETALLE
ACTIVE AFTER UPDATE POSITION 0
AS
declare variable EXISTE CHAR(1);
declare variable FEC DATE;
declare variable NIT VARCHAR(20);
declare variable CONCEPTO VARCHAR(60);
declare variable PREFIJO VARCHAR(4);
declare variable NUMERO VARCHAR(6);
declare variable SALDO NUMERIC(18,2);
declare variable RETES char(2);
declare variable OK CHAR(1);
declare variable RCANTI INTEGER;
declare variable COBR INTEGER;
declare variable ACUMULA CHAR(8);
declare variable DIASMAX INTEGER;
declare variable FACTOR NUMERIC(9,4);
declare variable FACTORD NUMERIC(9,4);
declare variable DIAS INTEGER;
declare variable FECDOC DATE;
declare variable FECMIN DATE;
declare variable FECMINS VARCHAR(10);
declare variable TRM NUMERIC(18,2);
BEGIN
execute procedure lee_configuracion('FACTURACION', 'FACTURAS', 'ACUMULAR PUNTOS DE VENTAS POR VENDEDOR') returning_values (ACUMULA);
select PREF_PRE, RECA_NUMERO, reca_fecha, RECA_CONC, TERC_NIT, COBR_COD, RECA_TRM
    from recibos_caja where reca_id = new.reca_id
    into :PREFIJO, :NUMERO, :FEC, :CONCEPTO, :NIT, :COBR, :TRM;
/* Borre el viejo */
if ((old.RECA_ID <> 0) AND (OLD.rcde_anulado = 'N')) then
    BEGIN
    OK = 'N';
    if (OLD.RCDE_TIPODOC = 45) then
        BEGIN
        SELECT RECA_ID FROM ANTICIPOS_CLIENTE WHERE ANCL_ID = OLD.RCDE_IDDOC INTO :RCANTI;
        if (RCANTI = OLD.RECA_ID) then
            begin
            OK = 'S';
            if (NEW.rcde_anulado = 'N') then
                delete from anticipos_cliente where ANCL_ID = OLD.RCDE_IDDOC;
            else
                UPDATE anticipos_cliente SET ANCL_ANULADO = 'S' where ANCL_ID = OLD.RCDE_IDDOC;
            end
        END
    if (OK = 'N') then
        BEGIN
        UPDATE saldos_doc_cartera
            SET SDCA_ABONO = SDCA_ABONO - old.rcde_abono - OLD.RCDE_DTOF,
            SDCA_ABRTFTE = SDCA_ABRTFTE - old.rcde_RTFTE,
            SDCA_ABRTIVA = SDCA_ABRTIVA - old.rcde_RTIVA,
            SDCA_ABRTICA = SDCA_ABRTICA - old.rcde_RTICA
            WHERE SDCA_TIPOREF = old.RCDE_TIPODOC AND SDCA_IDREF = old.rcde_IDDOC AND SDCA_FECHA = :FEC;
        END
    UPDATE movimiento_clientes
        SET MVCL_MONTO = MVCL_MONTO - OLD.rcde_abono - OLD.RCDE_DTOF,
        MVCL_RTEFTE = MVCL_RTEFTE - OLD.rcde_rtfte,
        MVCL_RTEIVA = MVCL_RTEIVA - OLD.rcde_rtiva,
        MVCL_RTEICA = MVCL_RTEICA - OLD.rcde_rtica
        WHERE MVCL_TIPOREF = 61 AND MVCL_IDREF = OLD.RECA_ID;

    /* DESHAGA LOS PUNTOS DEL VENDEDOR */
    if (acumula = 'SI') then
        delete from puntos_vendedor where vend_cod = :cobr and ptvt_tipodoc = old.rcde_tipodoc and ptvt_iddoc = old.rcde_iddoc and ptvt_fecha = :fec;
    execute procedure lee_configuracion('FACTURACION', 'FACTURAS', 'ACUMULAR PUNTOS POR VENTAS A CLIENTE REGULARES') returning_values (ACUMULA);
    if (acumula = 'RECAUDO') then
        delete from puntos_cliente where PTCL_NIT = :nit and ptcl_tipodoc = old.rcde_tipodoc and ptcl_iddoc = old.rcde_iddoc and ptcl_fecha = :fec;
    END
if ((NEW.RECA_ID <> 0) and (NEW.rcde_anulado = 'N')) then
    BEGIN
    OK = 'N';
    if (new.RCDE_TIPODOC = 45) then
        BEGIN
        /* BUSQUE SI TIENE RECA_ID, SI NO LO ACTUALIZA */
        SELECT RECA_ID FROM ANTICIPOS_CLIENTE WHERE ANCL_ID = NEW.RCDE_IDDOC INTO :RCANTI;
        if (RCANTI = 0) then
            BEGIN
            OK = 'S';
            UPDATE ANTICIPOS_CLIENTE SET RECA_ID = NEW.RECA_ID WHERE ANCL_ID = NEW.RCDE_IDDOC;
            END
        END
    if (OK = 'N') then
        BEGIN
        /* valide que no se pase del saldo */
        execute procedure saldo_doc_cartera(new.rcde_tipodoc, new.rcde_iddoc, '9999/12/31', 0) returning_values(saldo);
        execute procedure lee_configuracion('CARTERA', 'SALDOS', 'DESCONTAR RETENCIONES POR CAUSACION') returning_values (RETES);
        if (SALDO < 0) then
            BEGIN
            if (RETES = 'SI') then
                begin
                if (saldo > (NEW.rcde_abono + NEW.rcde_dtof)) then
                    EXCEPTION DOCUMENTO_ABONO_MAYOR 'EL SALDO DEL DOCUMENTO ' || NEW.rcde_prefijo || NEW.rcde_numero || ' ES INSUFICIENTE.';
                end
            ELSE
                begin
                if (saldo > (NEW.rcde_abono + NEW.rcde_rtfte + NEW.rcde_rtiva + NEW.rcde_rtica + NEW.rcde_dtof)) then
                    EXCEPTION DOCUMENTO_ABONO_MAYOR 'EL SALDO DEL DOCUMENTO ' || NEW.rcde_prefijo || NEW.rcde_numero || ' ES INSUFICIENTE.';
                end
            END
        else
            BEGIN
            if (RETES = 'SI') then
                begin
                if (saldo < (NEW.rcde_abono + NEW.rcde_dtof)) then
                    EXCEPTION DOCUMENTO_ABONO_MAYOR 'EL SALDO DEL DOCUMENTO ' || NEW.rcde_prefijo || NEW.rcde_numero || ' ES INSUFICIENTE.';
                end
            ELSE
                begin
                if (saldo < (NEW.rcde_abono + NEW.rcde_rtfte + NEW.rcde_rtiva + NEW.rcde_rtica + NEW.rcde_dtof)) then
                    EXCEPTION DOCUMENTO_ABONO_MAYOR 'EL SALDO DEL DOCUMENTO ' || NEW.rcde_prefijo || NEW.rcde_numero || ' ES INSUFICIENTE.';
                end
            END
        select 'S' from saldos_doc_cartera where sdca_tiporef = new.rcde_tipodoc and sdca_idref = new.rcde_iddoc and sdca_fecha = :FEC into :EXISTE;
        if (Existe = 'S') then
            /* actualice el saldo del dia */
            UPDATE saldos_doc_cartera
                SET SDCA_ABONO = SDCA_ABONO + NEW.rcde_abono + NEW.RCDE_DTOF,
                    SDCA_ABRTFTE = SDCA_ABRTFTE + NEW.rcde_RTFTE,
                    SDCA_ABRTIVA = SDCA_ABRTIVA + NEW.rcde_RTIVA,
                    SDCA_ABRTICA = SDCA_ABRTICA + NEW.rcde_RTICA,
                    SDCA_TRM = :TRM
                WHERE SDCA_TIPOREF = NEW.RCDE_TIPODOC AND SDCA_IDREF = NEW.rcde_IDDOC AND SDCA_FECHA = :FEC;
        ELSE
            /* Inserte un nuevo saldo diario */
            INSERT INTO SALDOS_DOC_CARTERA (SDCA_TIPOREF, SDCA_IDREF, SDCA_FECHA, TERC_NIT, SDCA_RTFTE, SDCA_RTIVA, SDCA_RTICA, SDCA_ABONO, SDCA_ABRTFTE, SDCA_ABRTIVA, SDCA_ABRTICA, SDCA_DEBITO, SDCA_MONTO, SDCA_TRM)
                VALUES (NEW.RCDE_TIPODOC, NEW.RCDE_IDDOC, :FEC, :NIT, 0, 0, 0, (NEW.rcde_abono+NEW.RCDE_DTOF), NEW.rcde_rtfte, NEW.rcde_rtiva, NEW.rcde_rtica, 'N', 0, :TRM);
        END /* OK = N */
    /* Registre o actualice el registro en movimiento_cliente */
    EXISTE = 'N';
    SELECT 'S' FROM MOVIMIENTO_CLIENTES WHERE MVCL_TIPOREF = 61 AND MVCL_IDREF = NEW.RECA_ID and mvcl_sucursal = new.rcde_sucursal INTO :EXISTE;
    if (EXISTE = 'S') then
        begin
        /* Actualice el nuevo */
        UPDATE movimiento_clientes
            SET MVCL_MONTO = MVCL_MONTO + NEW.rcde_abono + NEW.rcde_dtof,
                MVCL_RTEFTE = MVCL_RTEFTE + NEW.rcde_rtfte,
                MVCL_RTEIVA = MVCL_RTEIVA + NEW.rcde_rtiva,
                MVCL_RTEICA = MVCL_RTEICA + NEW.rcde_rtica,
                MVCL_TRM = :TRM
            WHERE MVCL_TIPOREF = 61 AND MVCL_IDREF = NEW.RECA_ID AND MVCL_SUCURSAL = NEW.rcde_sucursal;
        end
    ELSE
        INSERT INTO MOVIMIENTO_CLIENTES (MVCL_ID, TERC_NIT, MVCL_TIPOREF, MVCL_IDREF, MVCL_FECHA, MVCL_VENCE, MVCL_CONC, MVCL_MONTO, MVCL_RTEFTE, MVCL_RTEIVA, MVCL_RTEICA, MVCL_DEBITO, MVCL_ABONO, MVCL_PREFREF, MVCL_NUMREF, MVCL_SUCURSAL, COBR_COD, MVCL_TRM)
            VALUES (GEN_ID(ID_MOVCLI, 1), :NIT, 61, NEW.RECA_ID, :FEC, :FEC, :CONCEPTO, (NEW.RCDE_ABONO+NEW.RCDE_DTOF), NEW.RCDE_RTFTE, NEW.RCDE_RTIVA, NEW.RCDE_RTICA, 'N', 'S', :PREFIJO, :NUMERO, NEW.rcde_sucursal, :COBR, :TRM);

    /* acumule los puntos del vendedor */
    SELECT MVCL_FECHA FROM MOVIMIENTO_CLIENTES WHERE MVCL_TIPOREF = new.rcde_tipodoc AND MVCL_IDREF = new.rcde_iddoc
        INTO :FECDOC;
    if (FECDOC IS NOT NULL) then
        DIAS = FEC - FECDOC;
    else
        DIAS = 999;
    execute procedure lee_configuracion('FACTURACION', 'FACTURAS', 'DIAS DE RECAUDO MAXIMO PARA ACUMULAR PUNTOS AL VENDEDOR') returning_values (DIASMAX);
    if ((acumula = 'SI') and (diasmax >= dias)) then
        begin
        SELECT COPU_FACTOR FROM comisiones_puntos WHERE COPU_COD = NEW.rcde_comip INTO :FACTOR;
        if ((NEW.rcde_tipodoc = 31) or (NEW.rcde_tipodoc = 41)) then
            begin
            /* recorra la factura acumulando los puntos */
            if (new.rcde_tipodoc = 31) then
                select (fact_total-fact_ivamonto)/fact_total from facturas where fact_id = new.rcde_iddoc into :factord;
            if (new.rcde_tipodoc = 41) then
                select ndcl_monto/(ndcl_monto+ndcl_ivamonto) from notas_debito_clientes where ndcl_id = new.rcde_iddoc into :factord;
            /* inserte el registro de puntos */
            insert into puntos_vendedor (vend_cod, ptvt_fecha, ptvt_tipodoc, ptvt_iddoc, ptvt_db, ptvt_cr)
                values (:cobr, :fec, new.rcde_tipodoc, new.rcde_iddoc, (new.rcde_abono*:factord*:factor), 0);
            end
        if ((new.rcde_tipodoc = 33) or (new.rcde_tipodoc = 42)) then
            begin
            if (new.rcde_tipodoc = 33) then
                select (devt_total-devt_ivamonto)/devt_total from devoluciones_ventas where devt_id = new.rcde_iddoc into :factord;
            if (new.rcde_tipodoc = 42) then
                select nccl_monto/(nccl_monto+nccl_ivamonto) from notas_credito_clientes where nccl_id = new.rcde_iddoc into :factord;
            /* inserte el registro de puntos */
            insert into puntos_vendedor (vend_cod, ptvt_fecha, ptvt_tipodoc, ptvt_iddoc, ptvt_db, ptvt_cr)
                values (:cobr, :fec, new.rcde_tipodoc, new.rcde_iddoc, 0, (new.rcde_abono*:factord*:factor));
            end

        execute procedure lee_configuracion('FACTURACION', 'FACTURAS', 'ACUMULAR PUNTOS POR VENTAS A CLIENTE REGULARES') returning_values (ACUMULA);
        execute procedure lee_configuracion('FACTURACION', 'FACTURAS', 'FECHA A PARTIR DE LA CUAL ACUMULAR PUNTOS A CLIENTES POR RECAUDO') returning_values (FECMINS);
        if (FECMINS <> '') then
            FECMIN = CAST(FECMINS AS DATE);
        else
            FECMIN = '2009/01/01';
        if ((acumula = 'RECAUDO') and (:fecdoc >= :fecmin)) then
            BEGIN
            SELECT COPU_FACTORCL FROM comisiones_puntos WHERE COPU_COD = NEW.rcde_comip INTO :FACTOR;
            if ((NEW.rcde_tipodoc = 31) or (NEW.rcde_tipodoc = 41)) then
                begin
                /* recorra la factura acumulando los puntos */
                if (new.rcde_tipodoc = 31) then
                    select (fact_total-fact_ivamonto)/fact_total from facturas where fact_id = new.rcde_iddoc into :factord;
                if (new.rcde_tipodoc = 41) then
                    select ndcl_monto/(ndcl_monto+ndcl_ivamonto) from notas_debito_clientes where ndcl_id = new.rcde_iddoc into :factord;
                /* inserte el registro de puntos */
                insert into puntos_cliente (ptcl_nit, ptcl_fecha, ptcl_tipodoc, ptcl_iddoc, ptcl_db, ptcl_cr)
                    values (:nit, :fec, new.rcde_tipodoc, new.rcde_iddoc, (new.rcde_abono*:factord*:factor), 0);
                end
            if ((new.rcde_tipodoc = 33) or (new.rcde_tipodoc = 42)) then
                begin
                if (new.rcde_tipodoc = 33) then
                    select (devt_total-devt_ivamonto)/devt_total from devoluciones_ventas where devt_id = new.rcde_iddoc into :factord;
                if (new.rcde_tipodoc = 42) then
                    select nccl_monto/(nccl_monto+nccl_ivamonto) from notas_credito_clientes where nccl_id = new.rcde_iddoc into :factord;
                /* inserte el registro de puntos */
                insert into puntos_cliente (ptcl_nit, ptcl_fecha, ptcl_tipodoc, ptcl_iddoc, ptcl_db, ptcl_cr)
                    values (:nit, :fec, new.rcde_tipodoc, new.rcde_iddoc, 0, (new.rcde_abono*:factord*:factor));
                end
            END
        end
    END /* NUEVO */
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER RECIBOS_CAJA_DETALLE_AD FOR RECIBOS_CAJA_DETALLE
ACTIVE AFTER DELETE POSITION 0
AS
declare variable FEC DATE;
declare variable OK CHAR(1);
declare variable RCANTI INTEGER;
declare variable ACUMULA CHAR(8);
declare variable COBR INTEGER;
declare variable NIT VARCHAR(20);
BEGIN
if (old.RECA_ID <> 0) then
    BEGIN
    execute procedure lee_configuracion('FACTURACION', 'FACTURAS', 'ACUMULAR PUNTOS DE VENTAS POR VENDEDOR') returning_values (ACUMULA);
    select reca_fecha, COBR_COD, TERC_NIT from recibos_caja where reca_id = OLD.reca_id into :FEC, :COBR, :NIT;
    OK = 'N';
    if (OLD.RCDE_TIPODOC = 45) then
        BEGIN
        SELECT RECA_ID FROM ANTICIPOS_CLIENTE WHERE ANCL_ID = OLD.RCDE_IDDOC INTO :RCANTI;
        if (RCANTI = OLD.RECA_ID) then
            begin
            OK = 'S';
            delete from anticipos_cliente where ANCL_ID = OLD.RCDE_IDDOC;
            end
        END
    if (OLD.rcde_anulado = 'N') then
     begin
       if (OK = 'N') then
        BEGIN
        UPDATE saldos_doc_cartera
            SET SDCA_ABONO = SDCA_ABONO - old.rcde_abono - OLD.RCDE_DTOF,
            SDCA_ABRTFTE = SDCA_ABRTFTE - old.rcde_RTFTE,
            SDCA_ABRTIVA = SDCA_ABRTIVA - old.rcde_RTIVA,
            SDCA_ABRTICA = SDCA_ABRTICA - old.rcde_RTICA
            WHERE SDCA_TIPOREF = old.RCDE_TIPODOC AND SDCA_IDREF = old.rcde_IDDOC AND SDCA_FECHA = :FEC;
        END
       UPDATE movimiento_clientes
        SET MVCL_MONTO = MVCL_MONTO - OLD.rcde_abono - OLD.RCDE_DTOF,
        MVCL_RTEFTE = MVCL_RTEFTE - OLD.rcde_rtfte,
        MVCL_RTEIVA = MVCL_RTEIVA - OLD.rcde_rtiva,
        MVCL_RTEICA = MVCL_RTEICA - OLD.rcde_rtica
        WHERE MVCL_TIPOREF = 61 AND MVCL_IDREF = OLD.RECA_ID and MVCL_SUCURSAL = OLD.rcde_sucursal;
     end
    /* DESHAGA LOS PUNTOS DEL VENDEDOR */
    if (acumula = 'SI') then
        delete from puntos_vendedor where vend_cod = :cobr and ptvt_tipodoc = old.rcde_tipodoc and ptvt_iddoc = old.rcde_iddoc and ptvt_fecha = :fec;
    execute procedure lee_configuracion('FACTURACION', 'FACTURAS', 'ACUMULAR PUNTOS POR VENTAS A CLIENTE REGULARES') returning_values (ACUMULA);
    if (acumula = 'RECAUDO') then
        delete from puntos_cliente where PTCL_NIT = :nit and ptcl_tipodoc = old.rcde_tipodoc and ptcl_iddoc = old.rcde_iddoc and ptcl_fecha = :fec;
    END
END
^

SET TERM ; ^


/* 20090513E */
/* FILTRE LOS CLIENTES POR AGENCIA */
INSERT INTO CONFIGURACION (CONF_MODULO, CONF_CATEGORIA, CONF_PROPIEDAD, CONF_VALOR, CONF_POSIBLES, CONF_AYUDA) VALUES ('CARTERA', 'GENERAL', 'MOSTRAR SOLO LOS CLIENTES DE LA AGENCIA DEPENDIENDO DE LA ZONA', 'NO', 'SI,NO', 'SI: Sólo aparecen en el catálogo de clientes los clientes de las zonas correspondientes a la agencia. NO: Todos los clientes están disponibles en todas las agencias');
commit work;

/* falto inicializar existencia, se repite del articulo anterior */
SET TERM ^ ;

CREATE OR ALTER PROCEDURE CONSULTA_ARTICULOS_VTAS(
    FECHA DATE,
    INACTIVOS CHAR(1),
    MODULO VARCHAR(20),
    BUSCAR VARCHAR(100),
    CUALQUIERA CHAR(1),
    COLUMNA INTEGER,
    BUSCAR2 VARCHAR(30),
    BUSCAR3 VARCHAR(30),
    BUSCAR4 VARCHAR(30),
    BUSCAR5 VARCHAR(30))
RETURNS (
    CODIGO VARCHAR(20),
    DES VARCHAR(60),
    REF VARCHAR(20),
    GRUPO VARCHAR(30),
    MARCA VARCHAR(30),
    UNIDAD VARCHAR(8),
    ESTADO VARCHAR(30),
    IVA NUMERIC(9,2),
    EXISTEN NUMERIC(18,2),
    PRECIO NUMERIC(18,2),
    CLASE CHAR(1))
AS
DECLARE VARIABLE LISTA INTEGER;
DECLARE VARIABLE EXIST CHAR(2);
DECLARE VARIABLE SINEXIST CHAR(2);
declare variable DIG INTEGER;
declare variable OK CHAR(1);
BEGIN
EXISTEN = 0;
EXECUTE PROCEDURE lee_configuracion ('FACTURACION','ARTICULOS', 'VER EXISTENCIA EN CONSULTA ARTICULOS') returning_values (:EXIST);
EXECUTE PROCEDURE lee_configuracion ('FACTURACION','FACTURAS', 'CODIGO DE LA LISTA DE PRECIOS A MOSTRAR EN ARTICULOS') returning_values (:LISTA);
if (modulo = 'FACTURACION') then
  EXECUTE PROCEDURE lee_configuracion ('FACTURACION','ARTICULOS','VER ARTICULOS SIN EXISTENCIA EN CONSULTA DE ARTICULOS') returning_values (:sinexist);
else
  sinexist = 'SI';
EXECUTE PROCEDURE LEE_CONFIGURACION ('FACTURACION', 'ARTICULOS', 'REDONDEO AL MULTIPLO DE DIEZ EN PRECIOS') returning_values (DIG);
if (LISTA > 0) then
    BEGIN
    if ((BUSCAR IS NOT NULL) AND (BUSCAR <> '')) then
        FOR select a.arti_cod, arti_des, grup_cod, arti_unidad, esar_cod, taiv_porc, marc_cod,arti_clase
            from articulo a, tarifa_iva t
            where a.taiv_cod = t.taiv_cod and substring(a.arti_cod from 1 FOR 2) <> '.t' and
            ((:INACTIVOS = 'S') or (esar_cod = 'A') or ((:INACTIVOS = 'C') AND (esar_cod = 'N'))) AND
            ((:COLUMNA <> 0) or (upper(A.ARTI_COD) like upper(:buscar))) AND
            ((:columna <> 1) or (upper(A.ARTI_DES) like upper(:buscar))) AND
            ((:columna <> 2) or (upper(A.ARTI_OBS) like upper(:buscar)) or (upper(A.ARTI_DES) like upper(:buscar)))
            INTO :CODIGO, :DES, :GRUPO, :UNIDAD, :ESTADO, :IVA, :MARCA, :CLASE
            do
            begin
            select first 1 coba_cod from barras_articulo where arti_cod = :codigo into :ref;
            if ((COLUMNA <> 3) or (upper(REF) like upper(:buscar))) then
                BEGIN
                OK = 'N';
                PRECIO = 0;
                SELECT prar_fijo PRECIO FROM precios_articulo WHERE arti_cod = :CODIGO and lipr_cod = :LISTA INTO :PRECIO;
                EXECUTE PROCEDURE redondee(PRECIO, DIG) returning_values (PRECIO);
                if (EXIST = 'SI') then
                    BEGIN
                    existen = 0;
                    SELECT FIRST 1 COST_SALDOC+COST_ENTC-COST_SALC
                        FROM COSTOS WHERE ARTI_COD = :codigo AND COST_FECHA <= :FECHA
                        ORDER BY COST_FECHA DESC,COST_ITEM DESC
                        INTO :existen;
                    if (existen is null) then
                        existen = 0;
/*                    EXECUTE PROCEDURE saldo_total_inventario (:CODIGO, :FECHA) returning_values (:EXISTEN);*/
                    if ((SINEXIST = 'SI')  or (existen <> 0)) then
                        OK = 'S';
                    END
                ELSE
                    OK = 'S';
                if (ok = 'S') then
                    if (CUALQUIERA = 'S') then
                        SUSPEND;
                    ELSE
                        if (BUSCAR2 <> '') then
                            BEGIN
                            IF (NOT EXISTS (SELECT ARTI_COD FROM ARTICULO WHERE ARTI_COD = :CODIGO AND ((upper(ARTI_DES) like upper(:BUSCAR2)) or (UPPER(ARTI_OBS) LIKE UPPER(:BUSCAR2))))) THEN
                                OK = 'N';
                            if ((OK = 'S') AND (BUSCAR3 <> '')) then
                                IF (NOT EXISTS (SELECT ARTI_COD FROM ARTICULO WHERE ARTI_COD = :CODIGO AND ((upper(ARTI_DES) like upper(:BUSCAR3)) or (UPPER(ARTI_OBS) LIKE UPPER(:BUSCAR3))))) THEN
                                    OK = 'N';
                            if ((OK = 'S') AND (BUSCAR4 <> '')) then
                                IF (NOT EXISTS (SELECT ARTI_COD FROM ARTICULO WHERE ARTI_COD = :CODIGO AND ((upper(ARTI_DES) like upper(:BUSCAR4)) or (UPPER(ARTI_OBS) LIKE UPPER(:BUSCAR4))))) THEN
                                    OK = 'N';
                            if ((OK = 'S') AND (BUSCAR4 <> '')) then
                                IF (NOT EXISTS (SELECT ARTI_COD FROM ARTICULO WHERE ARTI_COD = :CODIGO AND ((upper(ARTI_DES) like upper(:BUSCAR4)) or (UPPER(ARTI_OBS) LIKE UPPER(:BUSCAR4))))) THEN
                                    OK = 'N';
                            if ((OK = 'S') AND (BUSCAR5 <> '')) then
                                IF (NOT EXISTS (SELECT ARTI_COD FROM ARTICULO WHERE ARTI_COD = :CODIGO AND ((upper(ARTI_DES) like upper(:BUSCAR5)) or (UPPER(ARTI_OBS) LIKE UPPER(:BUSCAR5))))) THEN
                                    OK = 'N';
                            if (OK = 'S') then
                                SUSPEND;
                            END
                        ELSE
                            SUSPEND;
                END
            end
    ELSE
        FOR select a.arti_cod, arti_des, grup_cod, arti_unidad, esar_cod, taiv_porc, marc_cod,arti_clase
            from articulo a, tarifa_iva t
            where a.taiv_cod = t.taiv_cod and substring(a.arti_cod from 1 FOR 2) <> '.t' and
            ((:INACTIVOS = 'S') or (esar_cod = 'A') or ((:INACTIVOS = 'C') AND (esar_cod = 'N')))
            INTO :CODIGO, :DES, :GRUPO, :UNIDAD, :ESTADO, :IVA, :MARCA, :CLASE
            do
            begin
            select first 1 coba_cod from barras_articulo where arti_cod = :codigo into :ref;
            PRECIO = 0;
            SELECT prar_fijo PRECIO FROM precios_articulo WHERE arti_cod = :CODIGO and lipr_cod = :LISTA INTO :PRECIO;
            EXECUTE PROCEDURE redondee(PRECIO, DIG) returning_values (PRECIO);
            if (EXIST = 'SI') then
                BEGIN
                existen = 0;
                SELECT FIRST 1 COST_SALDOC+COST_ENTC-COST_SALC
                    FROM COSTOS WHERE ARTI_COD = :codigo AND COST_FECHA <= :FECHA
                    ORDER BY COST_FECHA DESC,COST_ITEM DESC
                    INTO :existen;
                if (existen is null) then
                    existen = 0;
/*                EXECUTE PROCEDURE saldo_total_inventario (:CODIGO, :FECHA) returning_values (:EXISTEN);*/
                if ((SINEXIST = 'SI')  or (existen <> 0)) then
                    SUSPEND;
                END
            ELSE
                SUSPEND;
            END
    END
ELSE
    if ((BUSCAR IS NOT NULL) AND (BUSCAR <> '')) then
        FOR select arti_cod, arti_des, grup_cod, arti_unidad, esar_cod, taiv_porc, arti_precio, marc_cod, arti_clase
            from articulo a, tarifa_iva t
            where a.taiv_cod = t.taiv_cod and substring(a.arti_cod from 1 FOR 2) <> '.t' and
            ((:INACTIVOS = 'S') or (esar_cod = 'A') or ((:INACTIVOS = 'C') AND (esar_cod = 'N'))) AND
            ((:COLUMNA <> 0) or (upper(A.ARTI_COD) like upper(:buscar))) AND
            ((:columna <> 1) or (upper(A.ARTI_DES) like upper(:buscar))) AND
            ((:columna <> 2) or (upper(A.ARTI_OBS) like upper(:buscar)) or (upper(A.ARTI_DES) like upper(:buscar)))
            INTO :CODIGO, :DES, :GRUPO, :UNIDAD, :ESTADO, :IVA, :PRECIO, :MARCA, :CLASE
            do
            begin
            select first 1 coba_cod from barras_articulo where arti_cod = :codigo into :ref;
            if ((COLUMNA <> 3) or (upper(REF) like upper(:buscar))) then
                BEGIN
                if (EXIST = 'SI') then
                    BEGIN
                    existen = 0;
                    SELECT FIRST 1 COST_SALDOC+COST_ENTC-COST_SALC
                        FROM COSTOS WHERE ARTI_COD = :codigo AND COST_FECHA <= :FECHA
                        ORDER BY COST_FECHA DESC,COST_ITEM DESC
                        INTO :existen;
                    if (existen is null) then
                        existen = 0;
/*                    EXECUTE PROCEDURE saldo_total_inventario (:CODIGO, :FECHA) returning_values (:EXISTEN);*/
                    if ((SINEXIST = 'SI') or (existen <> 0)) then
                        OK = 'S';
                    END
                ELSE
                    OK = 'S';
                if (ok = 'S') then
                    if (CUALQUIERA = 'S') then
                        SUSPEND;
                    ELSE
                        if (BUSCAR2 <> '') then
                            BEGIN
                            IF (NOT EXISTS (SELECT ARTI_COD FROM ARTICULO WHERE ARTI_COD = :CODIGO AND ((upper(ARTI_DES) like upper(:BUSCAR2)) or (UPPER(ARTI_OBS) LIKE UPPER(:BUSCAR2))))) THEN
                                OK = 'N';
                            if ((OK = 'S') AND (BUSCAR3 <> '')) then
                                IF (NOT EXISTS (SELECT ARTI_COD FROM ARTICULO WHERE ARTI_COD = :CODIGO AND ((upper(ARTI_DES) like upper(:BUSCAR3)) or (UPPER(ARTI_OBS) LIKE UPPER(:BUSCAR3))))) THEN
                                    OK = 'N';
                            if ((OK = 'S') AND (BUSCAR4 <> '')) then
                                IF (NOT EXISTS (SELECT ARTI_COD FROM ARTICULO WHERE ARTI_COD = :CODIGO AND ((upper(ARTI_DES) like upper(:BUSCAR4)) or (UPPER(ARTI_OBS) LIKE UPPER(:BUSCAR4))))) THEN
                                    OK = 'N';
                            if ((OK = 'S') AND (BUSCAR4 <> '')) then
                                IF (NOT EXISTS (SELECT ARTI_COD FROM ARTICULO WHERE ARTI_COD = :CODIGO AND ((upper(ARTI_DES) like upper(:BUSCAR4)) or (UPPER(ARTI_OBS) LIKE UPPER(:BUSCAR4))))) THEN
                                    OK = 'N';
                            if ((OK = 'S') AND (BUSCAR5 <> '')) then
                                IF (NOT EXISTS (SELECT ARTI_COD FROM ARTICULO WHERE ARTI_COD = :CODIGO AND ((upper(ARTI_DES) like upper(:BUSCAR5)) or (UPPER(ARTI_OBS) LIKE UPPER(:BUSCAR5))))) THEN
                                    OK = 'N';
                            if (OK = 'S') then
                                SUSPEND;
                            END
                        ELSE
                            SUSPEND;
                END
            end
    ELSE
        FOR select arti_cod, arti_des, grup_cod, arti_unidad, esar_cod, taiv_porc, arti_precio, marc_cod, arti_clase
            from articulo a, tarifa_iva t
            where a.taiv_cod = t.taiv_cod and substring(a.arti_cod from 1 FOR 2) <> '.t' and
            ((:INACTIVOS = 'S') or (esar_cod = 'A') or ((:INACTIVOS = 'C') AND (esar_cod = 'N')))
            INTO :CODIGO, :DES, :GRUPO, :UNIDAD, :ESTADO, :IVA, :PRECIO, :MARCA, :CLASE
            do
            begin
            select first 1 coba_cod from barras_articulo where arti_cod = :codigo into :ref;
            if (EXIST = 'SI') then
                BEGIN
                existen = 0;
                SELECT FIRST 1 COST_SALDOC+COST_ENTC-COST_SALC
                    FROM COSTOS WHERE ARTI_COD = :codigo AND COST_FECHA <= :FECHA
                    ORDER BY COST_FECHA DESC,COST_ITEM DESC
                    INTO :existen;
                if (existen is null) then
                    existen = 0;
/*                EXECUTE PROCEDURE saldo_total_inventario (:CODIGO, :FECHA) returning_values (:EXISTEN);*/
                if ((SINEXIST = 'SI') or (existen <> 0)) then
                    SUSPEND;
                END
            ELSE
                SUSPEND;
            end
END
^

SET TERM ; ^


/* 20090514 */
/* INSERTE PRIMERO EN AUDITORIA Y LUEGO SI HAGA LAS IMPLICACIONES EN OTRAS TABLAS */
SET TERM ^ ;

CREATE OR ALTER TRIGGER ARTICULO_AI FOR ARTICULO
ACTIVE AFTER INSERT POSITION 0
AS
declare variable OK CHAR(2);
declare variable LISTA INTEGER;
declare variable UTIL NUMERIC(9,2);
declare variable MARGEN NUMERIC(9,2);
declare variable GRUP_TIVA CHAR(10);
declare variable AUTOM CHAR(1);
BEGIN
INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
    VALUES (USER, 101, 1, 'I', NEW.arti_cod);
EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION', 'ARTICULOS', 'CREAR PRECIOS AL CREAR ARTICULOS') RETURNING_VALUES (:OK);
IF (OK = 'SI') THEN
  BEGIN
  /* INSERTE PRECIOS */
  FOR SELECT LIPR_COD, LIPR_UTIL, LIPR_MARGEN, LIPR_AUTO FROM LISTA_PRECIOS
    INTO :LISTA, :UTIL, :MARGEN, :AUTOM
    do
    BEGIN
    INSERT INTO PRECIOS_ARTICULO (ARTI_COD, LIPR_COD, PRAR_AUTO, PRAR_UTIL, PRAR_MARGEN, PRAR_FIJO, PRAR_CANTMIN)
        VALUES (NEW.ARTI_COD, :LISTA, :AUTOM, :UTIL, :MARGEN, 0, 0.1);
    END
  END
/* INSERTE LA CONTABILIZACION DEL GRUPO O TARIFA DE IVA SEGUN PARAMETRO*/
EXECUTE PROCEDURE LEE_CONFIGURACION('INVENTARIO', 'ARTICULOS', 'OPCION PARA CAMBIAR AUTOMATICAMENTE LAS CTAS CONTABLES DEL ARTICULO') RETURNING_VALUES (:GRUP_TIVA);
if (GRUP_TIVA = 'GRUPOS') then
  INSERT INTO CONTABIL_ARTICULO (ARTI_COD, COAR_CTAINV, COAR_CTAIVAC, COAR_CTAIVAV, COAR_CTAVNT, COAR_CTACOS, COAR_CTADEV, COAR_CTACOMP, COAR_CTARTFTE, COAR_CTARTFTEV, COAR_RTBASE, COAR_RTFTE)
    SELECT NEW.ARTI_COD, GRUP_CTAINVENT, GRUP_CTAIVACMP, GRUP_CTAIVAVNT, GRUP_CTAVENTAS, GRUP_CTACOSTOS, GRUP_CTADEV, GRUP_CTACOMP, GRUP_CTARTFTEC, GRUP_CTARTFTEV, GRUP_RTFTEB, GRUP_RTFTEP
    FROM GRUPO G
    WHERE GRUP_COD = NEW.GRUP_COD;
if (GRUP_TIVA = 'TARIFA IVA') then
  INSERT INTO CONTABIL_ARTICULO (ARTI_COD, COAR_CTAINV, COAR_CTAIVAC, COAR_CTAIVAV, COAR_CTAVNT, COAR_CTACOS, COAR_CTADEV, COAR_CTACOMP)
    SELECT NEW.ARTI_COD, TAIV_CTAINV, TAIV_CTAIVACMP, TAIV_CTAIVAVNT, TAIV_CTAVTA, TAIV_CTACOSTO, TAIV_CTADEV, TAIV_CTACOMP
    FROM TARIFA_IVA T
    WHERE TAIV_COD = NEW.taiv_cod;
END
^

SET TERM ; ^


SET TERM ^ ;

CREATE OR ALTER TRIGGER ARTICULO_AU FOR ARTICULO
ACTIVE AFTER UPDATE POSITION 0
as
declare variable GRUP_TIVA CHAR(10);
declare variable VTA CHAR(20);
declare variable IVAC CHAR(20);
declare variable IVAV CHAR(20);
declare variable INV CHAR(20);
declare variable COSTO CHAR(20);
declare variable DEV CHAR(20);
declare variable COMP CHAR(20);
declare variable RETC CHAR(20);
declare variable RETV CHAR(20);
declare variable RETB NUMERIC(18,2);
declare variable RETP NUMERIC(9,4);
begin
INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
    VALUES (USER, 101, 1, 'U', NEW.arti_cod);
EXECUTE PROCEDURE LEE_CONFIGURACION('INVENTARIO', 'ARTICULOS', 'OPCION PARA CAMBIAR AUTOMATICAMENTE LAS CTAS CONTABLES DEL ARTICULO') RETURNING_VALUES (:GRUP_TIVA);
if (new.grup_cod <> old.grup_cod) then
 begin
  if (GRUP_TIVA = 'GRUPOS') then
   BEGIN
    SELECT GRUP_CTAINVENT, GRUP_CTAIVACMP, GRUP_CTAIVAVNT, GRUP_CTAVENTAS, GRUP_CTACOSTOS, GRUP_CTADEV, GRUP_CTACOMP, GRUP_CTARTFTEC, GRUP_CTARTFTEV, GRUP_RTFTEB, GRUP_RTFTEP
      FROM GRUPO G
      WHERE GRUP_COD = NEW.GRUP_COD
      into :INV, :IVAC, :IVAV, :VTA, :COSTO, :DEV, :COMP, :retc, :retv, :retb, :retp;
      update CONTABIL_ARTICULO
       SET COAR_CTAINV = :INV,
           COAR_CTAIVAC = :IVAC,
           COAR_CTAIVAV = :IVAV,
           COAR_CTAVNT = :VTA,
           COAR_CTACOS = :COSTO,
           COAR_CTADEV = :DEV,
           COAR_CTACOMP = :COMP,
           COAR_CTARTFTE = :retc,
           COAR_CTARTFTEV = :retv,
           COAR_RTFTE = :retp,
           COAR_RTBASE = :retb
        WHERE ARTI_COD = NEW.ARTI_COD;
   END
 end
if (new.taiv_cod <> old.taiv_cod) then
 begin
  if (GRUP_TIVA = 'TARIFA IVA') then
   BEGIN
    SELECT TAIV_CTAINV, TAIV_CTAIVACMP, TAIV_CTAIVAVNT, TAIV_CTAVTA, TAIV_CTACOSTO, TAIV_CTACOMP, TAIV_CTADEV
      FROM TARIFA_IVA T
      WHERE TAIV_COD = NEW.taiv_cod
      into :INV, :IVAC, :IVAV, :VTA, :COSTO, :COMP, :DEV;
      update CONTABIL_ARTICULO
       SET COAR_CTAINV = :INV,
           COAR_CTAIVAC = :IVAC,
           COAR_CTAIVAV = :IVAV,
           COAR_CTAVNT = :VTA,
           COAR_CTACOS = :COSTO,
           COAR_CTADEV = :DEV,
           COAR_CTACOMP = :COMP
        WHERE ARTI_COD = NEW.ARTI_COD;
   END
 end
end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER TERCEROS_AU FOR TERCEROS
ACTIVE AFTER UPDATE POSITION 0
as
declare variable NUMROWS INTEGER;
begin
INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
    VALUES (USER, 102, 1, 'U', NEW.terc_nit);
/* SI ES CLIENTE Y SE INACTIVA LO INACTIVA COMO CLIENTE */
if ((NEW.terc_estado = 'N') AND (OLD.terc_estado = 'S')) then
    UPDATE CLIENTES SET CLIE_ESTADO = 'I' WHERE TERC_NIT = NEW.terc_nit;

/* SI TIENE UNA SOLA SUCURSAL ACTUALICELA AL CAMBIAR EL PRINCIPAL */
SELECT COUNT(CLCU_COD) FROM CLIENTE_SUCURSALES WHERE TERC_NIT = NEW.terc_nit INTO :NUMROWS;
if (NUMROWS = 1) then
    BEGIN
    UPDATE cliente_sucursales
        SET CLSU_NOMBRE = new.terc_nom,
            CLSU_DIR = new.terc_dir,
            CLSU_CIUDAD = new.terc_ciu,
            CLSU_TEL = new.terc_tel
        WHERE TERC_NIT = NEW.TERC_NIT AND CLCU_COD = '01';
    END
end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER CLIENTES_AI FOR CLIENTES
ACTIVE AFTER INSERT POSITION 0
as
declare variable NOMBRE VARCHAR(60);
declare variable DIR VARCHAR(60);
declare variable CIU VARCHAR(40);
declare variable TEL VARCHAR(40);
begin
INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
    VALUES (USER, 103, 1, 'I', NEW.terc_nit);
/* INSERTE LA PRIMERA SUCURSAL */
SELECT TERC_NOM, TERC_DIR, TERC_CIU, TERC_TEL FROM TERCEROS WHERE TERC_NIT = NEW.terc_nit
    INTO :NOMBRE, :DIR, :CIU, :TEL;
INSERT INTO cliente_sucursales (TERC_NIT, CLCU_COD, CLSU_NOMBRE, CLSU_DIR, CLSU_CIUDAD, CLSU_TEL, VEND_COD, COBR_COD, ZONA_COD)
    VALUES (NEW.TERC_NIT, '01', :NOMBRE, :DIR, :CIU, :TEL, NEW.vend_cod, NEW.cobr_cod, NEW.zona_cod);
end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER CLIENTES_AU FOR CLIENTES
ACTIVE AFTER UPDATE POSITION 0
as
declare variable NUMROWS INTEGER;
begin
/* SI TIENE UNA SOLA SUCURSAL ACTUALICELA AL CAMBIAR EL PRINCIPAL */
INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
    VALUES (USER, 103, 1, 'U', NEW.terc_nit);
SELECT COUNT(CLCU_COD) FROM CLIENTE_SUCURSALES WHERE TERC_NIT = NEW.terc_nit INTO :NUMROWS;
if (NUMROWS = 1) then
    BEGIN
    UPDATE cliente_sucursales
        SET VEND_COD = NEW.vend_cod,
            COBR_COD = NEW.cobr_cod,
            ZONA_COD = NEW.zona_cod
        WHERE TERC_NIT = NEW.TERC_NIT AND CLCU_COD = '01';
    END
end
^

SET TERM ; ^

/* AUDITORIA EN TABLAS QUE FALTAN */
SET TERM ^ ;

create trigger ZONAS_AI for ZONAS
active AFTER INSERT position 0
as
begin
INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
    VALUES (USER, 108, 1, 'I', NEW.zona_cod);
end
^

SET TERM ; ^

SET TERM ^ ;

create trigger ZONAS_AU for ZONAS
active AFTER UPDATE position 0
as
begin
INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
    VALUES (USER, 108, 1, 'U', NEW.zona_cod);
end
^

SET TERM ; ^

SET TERM ^ ;

create trigger ZONAS_AD for ZONAS
active AFTER DELETE position 0
as
begin
INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
    VALUES (USER, 108, 1, 'D', OLD.zona_cod);
end
^

SET TERM ; ^

SET TERM ^ ;

create trigger GRUPO_CARTERA_AI for GRUPO_CARTERA
active AFTER INSERT position 0
as
begin
INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
    VALUES (USER, 108, 1, 'I', NEW.grca_cod);
end
^

SET TERM ; ^

SET TERM ^ ;

create trigger GRUPO_CARTERA_AU for GRUPO_CARTERA
active AFTER UPDATE position 0
as
begin
INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
    VALUES (USER, 108, 1, 'U', NEW.grca_cod);
end
^

SET TERM ; ^

SET TERM ^ ;

create trigger GRUPO_CARTERA_AD for GRUPO_CARTERA
active AFTER DELETE position 0
as
begin
INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
    VALUES (USER, 108, 1, 'D', OLD.grca_cod);
end
^

SET TERM ; ^

SET TERM ^ ;

create trigger GRUPOS_PROVEEDORES_AI for GRUPOS_PROVEEDORES
active AFTER INSERT position 0
as
begin
INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
    VALUES (USER, 108, 1, 'I', NEW.grpr_cod);
end
^

SET TERM ; ^

SET TERM ^ ;

create trigger GRUPOS_PROVEEDORES_AU for GRUPOS_PROVEEDORES
active AFTER UPDATE position 0
as
begin
INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
    VALUES (USER, 108, 1, 'U', NEW.grpr_cod);
end
^

SET TERM ; ^

SET TERM ^ ;

create trigger GRUPOS_PROVEEDORES_AD for GRUPOS_PROVEEDORES
active AFTER DELETE position 0
as
begin
INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
    VALUES (USER, 108, 1, 'D', OLD.grpr_cod);
end
^

SET TERM ; ^

/* 20090515 */
/* IMPRIMIR EL CIERRE DESDE FACTURACION SIN PREFIJO OPCIONAL */
SET TERM ^ ;

CREATE OR ALTER PROCEDURE CIERRE_FACTURACION(
    FECHA DATE,
    PUNTO INTEGER,
    PREFIJO VARCHAR(4))
RETURNS (
    PREF VARCHAR(4),
    AUTORIZA VARCHAR(20),
    PUNTOVTA VARCHAR(60),
    NUMINI VARCHAR(6),
    NUMFIN VARCHAR(6),
    NROFAC INTEGER,
    HORAINI TIME,
    HORAFIN TIME,
    BASEFAC NUMERIC(18,2),
    IVAFAC NUMERIC(18,2),
    TOTALFAC NUMERIC(18,2),
    NROITE INTEGER,
    NRODEV INTEGER,
    BASEDEV NUMERIC(18,2),
    IVADEV NUMERIC(18,2),
    TOTALDEV NUMERIC(18,2),
    BASENETO NUMERIC(18,2),
    IVANETO NUMERIC(18,2),
    TOTALNETO NUMERIC(18,2),
    BASEF0 NUMERIC(18,2),
    IVAF0 NUMERIC(18,2),
    TOTALF0 NUMERIC(18,2),
    BASED0 NUMERIC(18,2),
    IVAD0 NUMERIC(18,2),
    TOTALD0 NUMERIC(18,2),
    BASEF1 NUMERIC(18,2),
    IVAF1 NUMERIC(18,2),
    TOTALF1 NUMERIC(18,2),
    BASED1 NUMERIC(18,2),
    IVAD1 NUMERIC(18,2),
    TOTALD1 NUMERIC(18,2),
    BASEF2 NUMERIC(18,2),
    IVAF2 NUMERIC(18,2),
    TOTALF2 NUMERIC(18,2),
    BASED2 NUMERIC(18,2),
    IVAD2 NUMERIC(18,2),
    TOTALD2 NUMERIC(18,2),
    BASEF3 NUMERIC(18,2),
    IVAF3 NUMERIC(18,2),
    TOTALF3 NUMERIC(18,2),
    BASED3 NUMERIC(18,2),
    IVAD3 NUMERIC(18,2),
    TOTALD3 NUMERIC(18,2),
    BASEF4 NUMERIC(18,2),
    IVAF4 NUMERIC(18,2),
    TOTALF4 NUMERIC(18,2),
    BASED4 NUMERIC(18,2),
    IVAD4 NUMERIC(18,2),
    TOTALD4 NUMERIC(18,2),
    FORMAP1 NUMERIC(18,2),
    FORMAP2 NUMERIC(18,2),
    FORMAP3 NUMERIC(18,2),
    FORMAP4 NUMERIC(18,2),
    FORMAP5 NUMERIC(18,2),
    CARTERA NUMERIC(18,2),
    VENDEDOR1 VARCHAR(60),
    VTAVEND1 NUMERIC(18,2),
    VENDEDOR2 VARCHAR(60),
    VTAVEND2 NUMERIC(18,2),
    VENDEDOR3 VARCHAR(60),
    VTAVEND3 NUMERIC(18,2),
    VENDEDOR4 VARCHAR(60),
    VTAVEND4 NUMERIC(18,2),
    VENDEDOR5 VARCHAR(60),
    VTAVEND5 NUMERIC(18,2),
    NROFACTANUL INTEGER,
    IVANUL NUMERIC(18,2),
    TOTALFACANUL NUMERIC(18,2))
AS
declare variable tarifa NUMERIC(9,2);
declare variable BASEF NUMERIC(18,2);
declare variable IVAF NUMERIC(18,2);
declare variable TOTALF NUMERIC(18,2);
declare variable BASEDv NUMERIC(18,2);
declare variable IVAD NUMERIC(18,2);
declare variable TOTALD NUMERIC(18,2);
declare variable I INTEGER;
declare variable CODVEN INTEGER;
declare variable VENDED VARCHAR(60);
declare variable R_IDDOC INTEGER;
declare variable F_ID INTEGER;
declare variable F_TOTAL NUMERIC(18,2);
begin
if (PREFIJO <> '') then
  SELECT PREF_PRE, AUTO_NUMERO FROM AUTORIZACIONES WHERE PREF_PRE = :PREFIJO INTO :PREF, :autoriza;
SELECT PTVT_NOM FROM PUNTO_VENTA WHERE PTVT_ID = :punto INTO :puntovta;
SELECT MIN(AUDI_HORA) FROM AUDITORIA WHERE TIDO_COD = 131 AND AUDI_FECHA = :FECHA INTO :HORAINI;
HORAFIN = CAST('NOW' AS TIME);
  /* LAS VENTAS */
  SELECT MIN(FACT_NUMERO), MAX(FACT_NUMERO), COUNT(FACT_NUMERO), SUM(FACT_TOTAL - FACT_IVAMONTO), SUM(FACT_IVAMONTO), SUM(FACT_TOTAL)
    FROM FACTURAS WHERE FACT_FECHA = :FECHA AND PTVT_ID = :PUNTO AND ((PREF_PRE = :PREFIJO) or (:PREFIJO = '')) and FACT_ANULADO = 'N'
    INTO :NUMINI, :NUMFIN, :NROFAC, :BASENETO, :IVANETO, :TOTALNETO;
  SELECT COUNT(FADE_ITEM), SUM(FADE_TOTAL-FADE_IVAMONTO), SUM(FADE_IVAMONTO), SUM(FADE_TOTAL) FROM facturas_detalle D, FACTURAS F
    WHERE D.FACT_ID = F.FACT_ID AND FACT_FECHA = :FECHA AND PTVT_ID = :PUNTO AND ((PREF_PRE = :PREFIJO) or (:PREFIJO = '')) AND FADE_CANT > 0 and FACT_ANULADO = 'N' and substring(d.arti_cod from 1 FOR 2) <> '.t'
    INTO :nroite, :BASEFAC, :IVAFAC, :TOTALFAC;
  SELECT COUNT(FADE_ITEM), SUM(FADE_TOTAL-FADE_IVAMONTO), SUM(FADE_IVAMONTO), SUM(FADE_TOTAL) FROM facturas_detalle D, FACTURAS F
    WHERE D.FACT_ID = F.FACT_ID AND FACT_FECHA = :FECHA AND PTVT_ID = :PUNTO AND ((PREF_PRE = :PREFIJO) or (:PREFIJO = '')) AND FADE_CANT < 0 and FACT_ANULADO = 'N' and substring(d.arti_cod from 1 FOR 2) <> '.t'
    INTO :NRODEV, :BASEDEV, :IVADEV, :TOTALDEV;
  SELECT COUNT(DVDE_ITEM), SUM(DVDE_TOTAL-DVDE_IVAMONTO), SUM(DVDE_IVAMONTO), SUM(DVDE_TOTAL) FROM devoluciones_ventas_detalle D, devoluciones_ventas F
    WHERE D.DEVT_ID = F.DEVT_ID AND DEVT_FECHA = :FECHA AND PTVT_ID = :PUNTO AND ((PREF_PRE = :PREFIJO) or (:PREFIJO = '')) AND DEVT_ANULADO = 'N' and substring(d.arti_cod from 1 FOR 2) <> '.t'
    INTO :I, :BASEDV, :IVAD, :TOTALD;
  SELECT COUNT(FACT_NUMERO),SUM(FACT_TOTAL - FACT_IVAMONTO), SUM(FACT_IVAMONTO) FROM FACTURAS
    WHERE FACT_FECHA = :FECHA AND PTVT_ID = :PUNTO AND ((PREF_PRE = :PREFIJO) or (:PREFIJO = '')) and FACT_ANULADO = 'S'
    INTO :NROFACTANUL, :TOTALFACANUL, :IVANUL;
  if (nrofac is null) then
    nrofac = 0;
  if (NROFACTANUL is null) then
    NROFACTANUL = 0;
  if (TOTALFACANUL is null) then
    TOTALFACANUL = 0;
  if (IVANUL is null) then
    IVANUL = 0;
  if (baseneto is null) then
    baseneto = 0;
  if (ivaneto is null) then
    ivaneto = 0;
  if (totalneto is null) then
    totalneto = 0;
  if (nroite is null) then
    nroite = 0;
  if (basefac is null) then
    basefac = 0;
  if (ivafac is null) then
    ivafac = 0;
  if (totalfac is null) then
    totalfac = 0;
  if (nrodev is null) then
    nrodev = 0;
  if (basedev is null) then
    basedev = 0;
  if (ivadev is null) then
    ivadev = 0;
  if (totaldev is null) then
    totaldev = 0;
  if (I is null) then
    I = 0;
  if (basedv is null) then
    basedv = 0;
  if (ivad is null) then
    ivad = 0;
  if (totald is null) then
    totald = 0;
  NRODEV = NRODEV + I;
  BASEDEV = BASEDEV + BASEDV;
  IVADEV = IVADEV + IVAD;
  TOTALDEV = TOTALDEV + TOTALD;

  /* POR TARIFA DE IVA */
  I = 0;
  BASEF0 = 0;
  BASED0 = 0;
  IVAF0 = 0;
  IVAD0 = 0;
  TOTALF0 = 0;
  TOTALD0 = 0;
  BASEF1 = 0;
  BASED1 = 0;
  IVAF1 = 0;
  IVAD1 = 0;
  TOTALF1 = 0;
  TOTALD1 = 0;
  BASEF2 = 0;
  BASED2 = 0;
  IVAF2 = 0;
  IVAD2 = 0;
  TOTALF2 = 0;
  TOTALD2 = 0;
  BASEF3 = 0;
  BASED3 = 0;
  IVAF3 = 0;
  IVAD3 = 0;
  TOTALF3 = 0;
  TOTALD3 = 0;
  BASEF4 = 0;
  BASED4 = 0;
  IVAF4 = 0;
  IVAD4 = 0;
  TOTALF4 = 0;
  TOTALD4 = 0;
  vtavend1 = 0;
  vtavend2 = 0;
  vtavend3 = 0;
  vtavend4 = 0;
  vtavend5 = 0;
  FOR SELECT TAIV_PORC FROM TARIFA_IVA ORDER BY TAIV_PORC INTO :TARIFA DO
    BEGIN
    I = I + 1;
    SELECT SUM(FADE_TOTAL-FADE_IVAMONTO), SUM(FADE_IVAMONTO), SUM(FADE_TOTAL) FROM facturas_detalle D, FACTURAS F
        WHERE D.FACT_ID = F.FACT_ID AND FACT_FECHA = :FECHA AND PTVT_ID = :PUNTO AND ((PREF_PRE = :PREFIJO) or (:PREFIJO = '')) AND FADE_CANT > 0 AND FADE_IVAPORC = :TARIFA and FACT_ANULADO = 'N'
        INTO :BASEF, :IVAF, :TOTALF;
    SELECT SUM(FADE_TOTAL-FADE_IVAMONTO), SUM(FADE_IVAMONTO), SUM(FADE_TOTAL) FROM facturas_detalle D, FACTURAS F
        WHERE D.FACT_ID = F.FACT_ID AND FACT_FECHA = :FECHA AND PTVT_ID = :PUNTO AND ((PREF_PRE = :PREFIJO) or (:PREFIJO = '')) AND FADE_CANT < 0 AND FADE_IVAPORC = :TARIFA and FACT_ANULADO = 'N'
        INTO :BASEDV, :IVAD, :TOTALD;
    if (basef is null) then
        basef = 0;
    if (ivaf is null) then
        ivaf = 0;
    if (totalf is null) then
        totalf = 0;
    if (basedv is null) then
        basedv = 0;
    if (ivad is null) then
        ivad = 0;
    if (totald is null) then
        totald = 0;
    if (I = 1) then
        BEGIN
        BASEF0 = BASEF;
        BASED0 = :BASEDV;
        IVAF0 = IVAF;
        IVAD0 = IVAD;
        TOTALF0 = TOTALF;
        TOTALD0 = TOTALD;
        SELECT SUM(DVDE_TOTAL-DVDE_IVAMONTO), SUM(DVDE_IVAMONTO), SUM(DVDE_TOTAL) FROM devoluciones_ventas_detalle D, devoluciones_ventas F
            WHERE D.DEVT_ID = F.DEVT_ID AND DEVT_FECHA = :FECHA AND PTVT_ID = :PUNTO AND ((PREF_PRE = :PREFIJO) or (:PREFIJO = '')) AND DVDE_IVAPORC = :TARIFA and DEVT_ANULADO = 'N'
            INTO :BASEDV, :IVAD, :TOTALD;
        if (basedv is null) then
            basedv = 0;
        if (ivad is null) then
            ivad = 0;
        if (totald is null) then
            totald = 0;
        BASED0 = BASED0 + BASEDV;
        IVAD0 = IVAD0 + IVAD;
        TOTALD0 = TOTALD0 + TOTALD;
        END
    if (I = 2) then
        BEGIN
        BASEF1 = BASEF;
        BASED1 = :BASEDV;
        IVAF1 = IVAF;
        IVAD1 = IVAD;
        TOTALF1 = TOTALF;
        TOTALD1 = TOTALD;
        SELECT SUM(DVDE_TOTAL-DVDE_IVAMONTO), SUM(DVDE_IVAMONTO), SUM(DVDE_TOTAL) FROM devoluciones_ventas_detalle D, devoluciones_ventas F
            WHERE D.DEVT_ID = F.DEVT_ID AND DEVT_FECHA = :FECHA AND PTVT_ID = :PUNTO AND ((PREF_PRE = :PREFIJO) or (:PREFIJO = '')) AND DVDE_IVAPORC = :TARIFA and DEVT_ANULADO = 'N'
            INTO :BASEDV, :IVAD, :TOTALD;
        if (basedv is null) then
            basedv = 0;
        if (ivad is null) then
            ivad = 0;
        if (totald is null) then
            totald = 0;
        BASED1 = BASED1 + BASEDV;
        IVAD1 = IVAD1 + IVAD;
        TOTALD1 = TOTALD1 + TOTALD;
        END
    if (I = 3) then
        BEGIN
        BASEF2 = BASEF;
        BASED2 = :BASEDV;
        IVAF2 = IVAF;
        IVAD2 = IVAD;
        TOTALF2 = TOTALF;
        TOTALD2 = TOTALD;
        SELECT SUM(DVDE_TOTAL-DVDE_IVAMONTO), SUM(DVDE_IVAMONTO), SUM(DVDE_TOTAL) FROM devoluciones_ventas_detalle D, devoluciones_ventas F
            WHERE D.DEVT_ID = F.DEVT_ID AND DEVT_FECHA = :FECHA AND PTVT_ID = :PUNTO AND ((PREF_PRE = :PREFIJO) or (:PREFIJO = '')) AND DVDE_IVAPORC = :TARIFA and DEVT_ANULADO = 'N'
            INTO :BASEDV, :IVAD, :TOTALD;
        if (basedv is null) then
            basedv = 0;
        if (ivad is null) then
            ivad = 0;
        if (totald is null) then
            totald = 0;
        BASED2 = BASED2 + BASEDV;
        IVAD2 = IVAD2 + IVAD;
        TOTALD2 = TOTALD2 + TOTALD;
        END
    if (I = 4) then
        BEGIN
        BASEF3 = BASEF;
        BASED3 = :BASEDV;
        IVAF3 = IVAF;
        IVAD3 = IVAD;
        TOTALF3 = TOTALF;
        TOTALD3 = TOTALD;
        SELECT SUM(DVDE_TOTAL-DVDE_IVAMONTO), SUM(DVDE_IVAMONTO), SUM(DVDE_TOTAL) FROM devoluciones_ventas_detalle D, devoluciones_ventas F
            WHERE D.DEVT_ID = F.DEVT_ID AND DEVT_FECHA = :FECHA AND PTVT_ID = :PUNTO AND ((PREF_PRE = :PREFIJO) or (:PREFIJO = '')) AND DVDE_IVAPORC = :TARIFA and DEVT_ANULADO = 'N'
            INTO :BASEDV, :IVAD, :TOTALD;
        if (basedv is null) then
            basedv = 0;
        if (ivad is null) then
            ivad = 0;
        if (totald is null) then
            totald = 0;
        BASED3 = BASED3 + BASEDV;
        IVAD3 = IVAD3 + IVAD;
        TOTALD3 = TOTALD3 + TOTALD;
        END
    if (I = 5) then
        BEGIN
        BASEF4 = BASEF;
        BASED4 = :BASEDV;
        IVAF4 = IVAF;
        IVAD4 = IVAD;
        TOTALF4 = TOTALF;
        TOTALD4 = TOTALD;
        SELECT SUM(DVDE_TOTAL-DVDE_IVAMONTO), SUM(DVDE_IVAMONTO), SUM(DVDE_TOTAL) FROM devoluciones_ventas_detalle D, devoluciones_ventas F
            WHERE D.DEVT_ID = F.DEVT_ID AND DEVT_FECHA = :FECHA AND PTVT_ID = :PUNTO AND ((PREF_PRE = :PREFIJO) or (:PREFIJO = '')) AND DVDE_IVAPORC = :TARIFA and DEVT_ANULADO = 'N'
            INTO :BASEDV, :IVAD, :TOTALD;
        if (basedv is null) then
            basedv = 0;
        if (ivad is null) then
            ivad = 0;
        if (totald is null) then
            totald = 0;
        BASED4 = BASED4 + BASEDV;
        IVAD4 = IVAD4 + IVAD;
        TOTALD4 = TOTALD4 + TOTALD;
        END
    END
  /* POR FORMA DE PAGO */
  SELECT SUM(RCPA_MONTO) FROM RECIBOS_CAJA_PAGO P, RECIBOS_CAJA R, PUNTO_VENTA PT
    WHERE R.RECA_ID = P.RECA_ID AND PT.PTVT_ID = :punto AND RECA_FECHA = :FECHA AND PT.caja_id = R.caja_id AND ((PT.PREF_PRE = :PREFIJO) or (:PREFIJO = '')) AND FOPA_ID = 1 and RECA_ANULADO = 'N'
    INTO :FORMAP1;
  SELECT SUM(RCPA_MONTO) FROM RECIBOS_CAJA_PAGO P, RECIBOS_CAJA R, PUNTO_VENTA PT
    WHERE R.RECA_ID = P.RECA_ID AND PT.PTVT_ID = :punto AND RECA_FECHA = :FECHA AND PT.caja_id = R.caja_id AND ((PT.PREF_PRE = :PREFIJO) or (:PREFIJO = '')) AND FOPA_ID = 2 and RECA_ANULADO = 'N'
    INTO :FORMAP2;
  SELECT SUM(RCPA_MONTO) FROM RECIBOS_CAJA_PAGO P, RECIBOS_CAJA R, PUNTO_VENTA PT
    WHERE R.RECA_ID = P.RECA_ID AND PT.PTVT_ID = :punto AND RECA_FECHA = :FECHA AND PT.caja_id = R.caja_id AND ((PT.PREF_PRE = :PREFIJO) or (:PREFIJO = '')) AND FOPA_ID = 3 and RECA_ANULADO = 'N'
    INTO :FORMAP3;
  SELECT SUM(RCPA_MONTO) FROM RECIBOS_CAJA_PAGO P, RECIBOS_CAJA R, PUNTO_VENTA PT
    WHERE R.RECA_ID = P.RECA_ID AND PT.PTVT_ID = :punto AND RECA_FECHA = :FECHA AND PT.caja_id = R.caja_id AND ((PT.PREF_PRE = :PREFIJO) or (:PREFIJO = '')) AND FOPA_ID = 4 and RECA_ANULADO = 'N'
    INTO :FORMAP4;
  SELECT SUM(RCPA_MONTO) FROM RECIBOS_CAJA_PAGO P, RECIBOS_CAJA R, PUNTO_VENTA PT
    WHERE R.RECA_ID = P.RECA_ID AND PT.PTVT_ID = :punto AND RECA_FECHA = :FECHA AND PT.caja_id = R.caja_id AND ((PT.PREF_PRE = :PREFIJO) or (:PREFIJO = '')) AND FOPA_ID = 5 and RECA_ANULADO = 'N'
    INTO :FORMAP5;

  cartera = 0;
  for SELECT FACT_ID,FACT_TOTAL FROM FACTURAS WHERE FACT_FECHA = :FECHA AND PTVT_ID = :PUNTO AND ((PREF_PRE = :PREFIJO) or (:PREFIJO = '')) and FACT_ANULADO = 'N' into :f_id,:F_TOTAL
    do
    begin
     Select COUNT(D.RECA_ID) FROM recibos_caja_detalle D, RECIBOS_CAJA R where R.RECA_ID = D.RECA_ID AND R.RECA_FECHA = :FECHA AND RECA_ANULADO = 'N' and D.RCDE_tipodoc = 31 and D.RCDE_IDDOC = :f_id into :r_iddoc;
     if (r_iddoc = 0) then
       CARTERA = :cartera + :F_TOTAL;
    end
  if (formap1 is null) then
    formap1 = 0;
  if (formap2 is null) then
    formap2 = 0;
  if (formap3 is null) then
    formap3 = 0;
  if (formap4 is null) then
    formap4 = 0;
  if (formap5 is null) then
    formap5 = 0;
  if (cartera is null) then
    cartera = 0;
  I = 0;
  FOR SELECT MAX(F.VEND_COD), MAX(VEND_NOMBRE), SUM(FACT_TOTAL - FACT_IVAMONTO) FROM FACTURAS F, VENDEDORES V
    WHERE F.VEND_COD = V.VEND_COD AND FACT_FECHA = :FECHA AND F.PTVT_ID = :PUNTO AND ((PREF_PRE = :PREFIJO) or (:PREFIJO = '')) and FACT_ANULADO = 'N'
    GROUP BY F.VEND_COD ORDER BY F.VEND_COD
    INTO :CODVEN, :VENDED, :TOTALF
    DO
    BEGIN
    if (totalf IS NULL) then
        TOTALF = 0;
    SELECT SUM(DEVT_TOTAL - DEVT_IVAMONTO) FROM DEVOLUCIONES_VENTAS
        WHERE VEND_COD = :CODVEN AND DEVT_FECHA = :FECHA AND PTVT_ID = :PUNTO AND ((PREF_PRE = :PREFIJO) or (:PREFIJO = '')) and DEVT_ANULADO = 'N'
        INTO :totald;
    if (TOTALD IS NULL) then
        TOTALD = 0;
    if (I = 0) then
        BEGIN
        vendedor1 = VENDED;
        vtavend1 = TOTALF - TOTALD;
        END
    if (I = 1) then
        BEGIN
        vendedor2 = VENDED;
        vtavend2 = TOTALF - TOTALD;
        END
    if (I = 2) then
        BEGIN
        vendedor3 = VENDED;
        vtavend3 = TOTALF - TOTALD;
        END
    if (I = 3) then
        BEGIN
        vendedor4 = VENDED;
        vtavend4 = TOTALF - TOTALD;
        END
    if (I = 4) then
        BEGIN
        vendedor5 = VENDED;
        vtavend5 = TOTALF - TOTALD;
        END
    I = I + 1;
    END
  INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
    VALUES (USER, 123, :punto, 'I', (:formap1+:formap2+:formap3+:formap4+:formap5+:CARTERA));
  suspend;
end
^

SET TERM ; ^

/* 20090515B AJUSTES AL CIERRE DE VENTAS Y A IMPUESTOS EN VENTAS */

CREATE TABLE AJUSTE_CIERRE (
    AJCI_ID T_ID NOT NULL,
    AJCI_FECINI DATE,
    AJCI_FECFIN DATE,
    AJCI_PORC T_PORCENTAJE,
    AJCI_FACTOR T_PORCENTAJE);
alter table AJUSTE_CIERRE
add constraint PK_AJUSTE_CIERRE
primary key (AJCI_ID);

CREATE SEQUENCE ID_AJUSTECIE;

GRANT ALL ON AJUSTE_CIERRE TO PUBLIC;

SET TERM ^ ;

create trigger AJUSTE_CIERRE_BI for AJUSTE_CIERRE
active BEFORE INSERT position 0
as
begin
NEW.ajci_id = GEN_ID(id_ajustecie, 1);
end
^

SET TERM ; ^

INSERT INTO AJUSTE_CIERRE (AJCI_FECFIN, AJCI_FECINI, AJCI_PORC, AJCI_FACTOR) VALUES ('30-JUN-2008', '1-MAY-2008', 0, 0.4528);
INSERT INTO AJUSTE_CIERRE (AJCI_FECFIN, AJCI_FECINI, AJCI_PORC, AJCI_FACTOR) VALUES ('30-JUN-2008', '1-MAY-2008', 10, 1.3644);
INSERT INTO AJUSTE_CIERRE (AJCI_FECFIN, AJCI_FECINI, AJCI_PORC, AJCI_FACTOR) VALUES ('30-JUN-2008', '1-MAY-2008', 16, 0.8109);
INSERT INTO AJUSTE_CIERRE (AJCI_FECFIN, AJCI_FECINI, AJCI_PORC, AJCI_FACTOR) VALUES ('30-JUN-2008', '1-MAY-2008', 7, 1);

INSERT INTO AJUSTE_CIERRE (AJCI_FECFIN, AJCI_FECINI, AJCI_PORC, AJCI_FACTOR) VALUES ('31-AUG-2008', '1-JUL-2008', 0, 0.8962);
INSERT INTO AJUSTE_CIERRE (AJCI_FECFIN, AJCI_FECINI, AJCI_PORC, AJCI_FACTOR) VALUES ('31-AUG-2008', '1-JUL-2008', 10, 1.272);
INSERT INTO AJUSTE_CIERRE (AJCI_FECFIN, AJCI_FECINI, AJCI_PORC, AJCI_FACTOR) VALUES ('31-AUG-2008', '1-JUL-2008', 16, 0.7273);
INSERT INTO AJUSTE_CIERRE (AJCI_FECFIN, AJCI_FECINI, AJCI_PORC, AJCI_FACTOR) VALUES ('31-AUG-2008', '1-JUL-2008', 7, 1);
COMMIT WORK;

SET TERM ^ ;

CREATE OR ALTER PROCEDURE CIERRE_FACTURACION(
    FECHA DATE,
    PUNTO INTEGER,
    PREFIJO VARCHAR(4))
RETURNS (
    PREF VARCHAR(4),
    AUTORIZA VARCHAR(20),
    PUNTOVTA VARCHAR(60),
    NUMINI VARCHAR(6),
    NUMFIN VARCHAR(6),
    NROFAC INTEGER,
    HORAINI TIME,
    HORAFIN TIME,
    BASEFAC NUMERIC(18,2),
    IVAFAC NUMERIC(18,2),
    TOTALFAC NUMERIC(18,2),
    NROITE INTEGER,
    NRODEV INTEGER,
    BASEDEV NUMERIC(18,2),
    IVADEV NUMERIC(18,2),
    TOTALDEV NUMERIC(18,2),
    BASENETO NUMERIC(18,2),
    IVANETO NUMERIC(18,2),
    TOTALNETO NUMERIC(18,2),
    BASEF0 NUMERIC(18,2),
    IVAF0 NUMERIC(18,2),
    TOTALF0 NUMERIC(18,2),
    BASED0 NUMERIC(18,2),
    IVAD0 NUMERIC(18,2),
    TOTALD0 NUMERIC(18,2),
    BASEF1 NUMERIC(18,2),
    IVAF1 NUMERIC(18,2),
    TOTALF1 NUMERIC(18,2),
    BASED1 NUMERIC(18,2),
    IVAD1 NUMERIC(18,2),
    TOTALD1 NUMERIC(18,2),
    BASEF2 NUMERIC(18,2),
    IVAF2 NUMERIC(18,2),
    TOTALF2 NUMERIC(18,2),
    BASED2 NUMERIC(18,2),
    IVAD2 NUMERIC(18,2),
    TOTALD2 NUMERIC(18,2),
    BASEF3 NUMERIC(18,2),
    IVAF3 NUMERIC(18,2),
    TOTALF3 NUMERIC(18,2),
    BASED3 NUMERIC(18,2),
    IVAD3 NUMERIC(18,2),
    TOTALD3 NUMERIC(18,2),
    BASEF4 NUMERIC(18,2),
    IVAF4 NUMERIC(18,2),
    TOTALF4 NUMERIC(18,2),
    BASED4 NUMERIC(18,2),
    IVAD4 NUMERIC(18,2),
    TOTALD4 NUMERIC(18,2),
    FORMAP1 NUMERIC(18,2),
    FORMAP2 NUMERIC(18,2),
    FORMAP3 NUMERIC(18,2),
    FORMAP4 NUMERIC(18,2),
    FORMAP5 NUMERIC(18,2),
    CARTERA NUMERIC(18,2),
    VENDEDOR1 VARCHAR(60),
    VTAVEND1 NUMERIC(18,2),
    VENDEDOR2 VARCHAR(60),
    VTAVEND2 NUMERIC(18,2),
    VENDEDOR3 VARCHAR(60),
    VTAVEND3 NUMERIC(18,2),
    VENDEDOR4 VARCHAR(60),
    VTAVEND4 NUMERIC(18,2),
    VENDEDOR5 VARCHAR(60),
    VTAVEND5 NUMERIC(18,2),
    NROFACTANUL INTEGER,
    IVANUL NUMERIC(18,2),
    TOTALFACANUL NUMERIC(18,2))
AS
declare variable tarifa NUMERIC(9,2);
declare variable BASEF NUMERIC(18,2);
declare variable IVAF NUMERIC(18,2);
declare variable TOTALF NUMERIC(18,2);
declare variable BASEDv NUMERIC(18,2);
declare variable IVAD NUMERIC(18,2);
declare variable TOTALD NUMERIC(18,2);
declare variable I INTEGER;
declare variable CODVEN INTEGER;
declare variable VENDED VARCHAR(60);
declare variable R_IDDOC INTEGER;
declare variable F_ID INTEGER;
declare variable F_TOTAL NUMERIC(18,2);
declare variable FACTOR NUMERIC(18,4);
declare variable AJUSTE INTEGER;
begin
if (PREFIJO <> '') then
  SELECT PREF_PRE, AUTO_NUMERO FROM AUTORIZACIONES WHERE PREF_PRE = :PREFIJO INTO :PREF, :autoriza;
SELECT PTVT_NOM FROM PUNTO_VENTA WHERE PTVT_ID = :punto INTO :puntovta;
SELECT MIN(AUDI_HORA) FROM AUDITORIA WHERE TIDO_COD = 131 AND AUDI_FECHA = :FECHA INTO :HORAINI;
HORAFIN = CAST('NOW' AS TIME);
  /* LAS VENTAS */
  SELECT MIN(FACT_NUMERO), MAX(FACT_NUMERO), COUNT(FACT_NUMERO), SUM(FACT_TOTAL - FACT_IVAMONTO), SUM(FACT_IVAMONTO), SUM(FACT_TOTAL)
    FROM FACTURAS WHERE FACT_FECHA = :FECHA AND PTVT_ID = :PUNTO AND ((PREF_PRE = :PREFIJO) or (:PREFIJO = '')) and FACT_ANULADO = 'N'
    INTO :NUMINI, :NUMFIN, :NROFAC, :BASENETO, :IVANETO, :TOTALNETO;
  SELECT COUNT(FADE_ITEM), SUM(FADE_TOTAL-FADE_IVAMONTO), SUM(FADE_IVAMONTO), SUM(FADE_TOTAL) FROM facturas_detalle D, FACTURAS F
    WHERE D.FACT_ID = F.FACT_ID AND FACT_FECHA = :FECHA AND PTVT_ID = :PUNTO AND ((PREF_PRE = :PREFIJO) or (:PREFIJO = '')) AND FADE_CANT > 0 and FACT_ANULADO = 'N' and substring(d.arti_cod from 1 FOR 2) <> '.t'
    INTO :nroite, :BASEFAC, :IVAFAC, :TOTALFAC;
  SELECT COUNT(FADE_ITEM), SUM(FADE_TOTAL-FADE_IVAMONTO), SUM(FADE_IVAMONTO), SUM(FADE_TOTAL) FROM facturas_detalle D, FACTURAS F
    WHERE D.FACT_ID = F.FACT_ID AND FACT_FECHA = :FECHA AND PTVT_ID = :PUNTO AND ((PREF_PRE = :PREFIJO) or (:PREFIJO = '')) AND FADE_CANT < 0 and FACT_ANULADO = 'N' and substring(d.arti_cod from 1 FOR 2) <> '.t'
    INTO :NRODEV, :BASEDEV, :IVADEV, :TOTALDEV;
  SELECT COUNT(DVDE_ITEM), SUM(DVDE_TOTAL-DVDE_IVAMONTO), SUM(DVDE_IVAMONTO), SUM(DVDE_TOTAL) FROM devoluciones_ventas_detalle D, devoluciones_ventas F
    WHERE D.DEVT_ID = F.DEVT_ID AND DEVT_FECHA = :FECHA AND PTVT_ID = :PUNTO AND ((PREF_PRE = :PREFIJO) or (:PREFIJO = '')) AND DEVT_ANULADO = 'N' and substring(d.arti_cod from 1 FOR 2) <> '.t'
    INTO :I, :BASEDV, :IVAD, :TOTALD;
  SELECT COUNT(FACT_NUMERO),SUM(FACT_TOTAL - FACT_IVAMONTO), SUM(FACT_IVAMONTO) FROM FACTURAS
    WHERE FACT_FECHA = :FECHA AND PTVT_ID = :PUNTO AND ((PREF_PRE = :PREFIJO) or (:PREFIJO = '')) and FACT_ANULADO = 'S'
    INTO :NROFACTANUL, :TOTALFACANUL, :IVANUL;
  if (nrofac is null) then
    nrofac = 0;
  if (NROFACTANUL is null) then
    NROFACTANUL = 0;
  if (TOTALFACANUL is null) then
    TOTALFACANUL = 0;
  if (IVANUL is null) then
    IVANUL = 0;
  if (baseneto is null) then
    baseneto = 0;
  if (ivaneto is null) then
    ivaneto = 0;
  if (totalneto is null) then
    totalneto = 0;
  if (nroite is null) then
    nroite = 0;
  if (basefac is null) then
    basefac = 0;
  if (ivafac is null) then
    ivafac = 0;
  if (totalfac is null) then
    totalfac = 0;
  if (nrodev is null) then
    nrodev = 0;
  if (basedev is null) then
    basedev = 0;
  if (ivadev is null) then
    ivadev = 0;
  if (totaldev is null) then
    totaldev = 0;
  if (I is null) then
    I = 0;
  if (basedv is null) then
    basedv = 0;
  if (ivad is null) then
    ivad = 0;
  if (totald is null) then
    totald = 0;
  NRODEV = NRODEV + I;
  BASEDEV = BASEDEV + BASEDV;
  IVADEV = IVADEV + IVAD;
  TOTALDEV = TOTALDEV + TOTALD;

  /* POR TARIFA DE IVA */
  I = 0;
  BASEF0 = 0;
  BASED0 = 0;
  IVAF0 = 0;
  IVAD0 = 0;
  TOTALF0 = 0;
  TOTALD0 = 0;
  BASEF1 = 0;
  BASED1 = 0;
  IVAF1 = 0;
  IVAD1 = 0;
  TOTALF1 = 0;
  TOTALD1 = 0;
  BASEF2 = 0;
  BASED2 = 0;
  IVAF2 = 0;
  IVAD2 = 0;
  TOTALF2 = 0;
  TOTALD2 = 0;
  BASEF3 = 0;
  BASED3 = 0;
  IVAF3 = 0;
  IVAD3 = 0;
  TOTALF3 = 0;
  TOTALD3 = 0;
  BASEF4 = 0;
  BASED4 = 0;
  IVAF4 = 0;
  IVAD4 = 0;
  TOTALF4 = 0;
  TOTALD4 = 0;
  vtavend1 = 0;
  vtavend2 = 0;
  vtavend3 = 0;
  vtavend4 = 0;
  vtavend5 = 0;
  FOR SELECT TAIV_PORC FROM TARIFA_IVA ORDER BY TAIV_PORC INTO :TARIFA DO
    BEGIN
    I = I + 1;
    SELECT SUM(FADE_TOTAL-FADE_IVAMONTO), SUM(FADE_IVAMONTO), SUM(FADE_TOTAL) FROM facturas_detalle D, FACTURAS F
        WHERE D.FACT_ID = F.FACT_ID AND FACT_FECHA = :FECHA AND PTVT_ID = :PUNTO AND ((PREF_PRE = :PREFIJO) or (:PREFIJO = '')) AND FADE_CANT > 0 AND FADE_IVAPORC = :TARIFA and FACT_ANULADO = 'N'
        INTO :BASEF, :IVAF, :TOTALF;
    SELECT SUM(FADE_TOTAL-FADE_IVAMONTO), SUM(FADE_IVAMONTO), SUM(FADE_TOTAL) FROM facturas_detalle D, FACTURAS F
        WHERE D.FACT_ID = F.FACT_ID AND FACT_FECHA = :FECHA AND PTVT_ID = :PUNTO AND ((PREF_PRE = :PREFIJO) or (:PREFIJO = '')) AND FADE_CANT < 0 AND FADE_IVAPORC = :TARIFA and FACT_ANULADO = 'N'
        INTO :BASEDV, :IVAD, :TOTALD;
    if (basef is null) then
        basef = 0;
    if (ivaf is null) then
        ivaf = 0;
    if (totalf is null) then
        totalf = 0;
    if (basedv is null) then
        basedv = 0;
    if (ivad is null) then
        ivad = 0;
    if (totald is null) then
        totald = 0;

    FACTOR = 1;
    SELECT AJCI_FACTOR FROM ajuste_cierre WHERE AJCI_PORC = :TARIFA AND AJCI_FECINI <= :FECHA AND AJCI_FECFIN >= :FECHA INTO :FACTOR;
    if (FACTOR IS null) then
        FACTOR = 1;
    if (FACTOR <> 1) then
        AJUSTE = 1;
    BASEF = BASEF * FACTOR;
    BASEDV = BASEDV * FACTOR;
    IVAF = IVAF * FACTOR;
    IVAD = IVAD * FACTOR;
    TOTALF = TOTALF * FACTOR;
    TOTALD = TOTALD * FACTOR;

    if (I = 1) then
        BEGIN
        BASEF0 = BASEF;
        BASED0 = :BASEDV;
        IVAF0 = IVAF;
        IVAD0 = IVAD;
        TOTALF0 = TOTALF;
        TOTALD0 = TOTALD;
        SELECT SUM(DVDE_TOTAL-DVDE_IVAMONTO), SUM(DVDE_IVAMONTO), SUM(DVDE_TOTAL) FROM devoluciones_ventas_detalle D, devoluciones_ventas F
            WHERE D.DEVT_ID = F.DEVT_ID AND DEVT_FECHA = :FECHA AND PTVT_ID = :PUNTO AND ((PREF_PRE = :PREFIJO) or (:PREFIJO = '')) AND DVDE_IVAPORC = :TARIFA and DEVT_ANULADO = 'N'
            INTO :BASEDV, :IVAD, :TOTALD;
        if (basedv is null) then
            basedv = 0;
        if (ivad is null) then
            ivad = 0;
        if (totald is null) then
            totald = 0;
        BASED0 = BASED0 + BASEDV;
        IVAD0 = IVAD0 + IVAD;
        TOTALD0 = TOTALD0 + TOTALD;
        END
    if (I = 2) then
        BEGIN
        BASEF1 = BASEF;
        BASED1 = :BASEDV;
        IVAF1 = IVAF;
        IVAD1 = IVAD;
        TOTALF1 = TOTALF;
        TOTALD1 = TOTALD;
        SELECT SUM(DVDE_TOTAL-DVDE_IVAMONTO), SUM(DVDE_IVAMONTO), SUM(DVDE_TOTAL) FROM devoluciones_ventas_detalle D, devoluciones_ventas F
            WHERE D.DEVT_ID = F.DEVT_ID AND DEVT_FECHA = :FECHA AND PTVT_ID = :PUNTO AND ((PREF_PRE = :PREFIJO) or (:PREFIJO = '')) AND DVDE_IVAPORC = :TARIFA and DEVT_ANULADO = 'N'
            INTO :BASEDV, :IVAD, :TOTALD;
        if (basedv is null) then
            basedv = 0;
        if (ivad is null) then
            ivad = 0;
        if (totald is null) then
            totald = 0;
        BASED1 = BASED1 + BASEDV;
        IVAD1 = IVAD1 + IVAD;
        TOTALD1 = TOTALD1 + TOTALD;
        END
    if (I = 3) then
        BEGIN
        BASEF2 = BASEF;
        BASED2 = :BASEDV;
        IVAF2 = IVAF;
        IVAD2 = IVAD;
        TOTALF2 = TOTALF;
        TOTALD2 = TOTALD;
        SELECT SUM(DVDE_TOTAL-DVDE_IVAMONTO), SUM(DVDE_IVAMONTO), SUM(DVDE_TOTAL) FROM devoluciones_ventas_detalle D, devoluciones_ventas F
            WHERE D.DEVT_ID = F.DEVT_ID AND DEVT_FECHA = :FECHA AND PTVT_ID = :PUNTO AND ((PREF_PRE = :PREFIJO) or (:PREFIJO = '')) AND DVDE_IVAPORC = :TARIFA and DEVT_ANULADO = 'N'
            INTO :BASEDV, :IVAD, :TOTALD;
        if (basedv is null) then
            basedv = 0;
        if (ivad is null) then
            ivad = 0;
        if (totald is null) then
            totald = 0;
        BASED2 = BASED2 + BASEDV;
        IVAD2 = IVAD2 + IVAD;
        TOTALD2 = TOTALD2 + TOTALD;
        END
    if (I = 4) then
        BEGIN
        BASEF3 = BASEF;
        BASED3 = :BASEDV;
        IVAF3 = IVAF;
        IVAD3 = IVAD;
        TOTALF3 = TOTALF;
        TOTALD3 = TOTALD;
        SELECT SUM(DVDE_TOTAL-DVDE_IVAMONTO), SUM(DVDE_IVAMONTO), SUM(DVDE_TOTAL) FROM devoluciones_ventas_detalle D, devoluciones_ventas F
            WHERE D.DEVT_ID = F.DEVT_ID AND DEVT_FECHA = :FECHA AND PTVT_ID = :PUNTO AND ((PREF_PRE = :PREFIJO) or (:PREFIJO = '')) AND DVDE_IVAPORC = :TARIFA and DEVT_ANULADO = 'N'
            INTO :BASEDV, :IVAD, :TOTALD;
        if (basedv is null) then
            basedv = 0;
        if (ivad is null) then
            ivad = 0;
        if (totald is null) then
            totald = 0;
        BASED3 = BASED3 + BASEDV;
        IVAD3 = IVAD3 + IVAD;
        TOTALD3 = TOTALD3 + TOTALD;
        END
    if (I = 5) then
        BEGIN
        BASEF4 = BASEF;
        BASED4 = :BASEDV;
        IVAF4 = IVAF;
        IVAD4 = IVAD;
        TOTALF4 = TOTALF;
        TOTALD4 = TOTALD;
        SELECT SUM(DVDE_TOTAL-DVDE_IVAMONTO), SUM(DVDE_IVAMONTO), SUM(DVDE_TOTAL) FROM devoluciones_ventas_detalle D, devoluciones_ventas F
            WHERE D.DEVT_ID = F.DEVT_ID AND DEVT_FECHA = :FECHA AND PTVT_ID = :PUNTO AND ((PREF_PRE = :PREFIJO) or (:PREFIJO = '')) AND DVDE_IVAPORC = :TARIFA and DEVT_ANULADO = 'N'
            INTO :BASEDV, :IVAD, :TOTALD;
        if (basedv is null) then
            basedv = 0;
        if (ivad is null) then
            ivad = 0;
        if (totald is null) then
            totald = 0;
        BASED4 = BASED4 + BASEDV;
        IVAD4 = IVAD4 + IVAD;
        TOTALD4 = TOTALD4 + TOTALD;
        END
    END
  /* POR FORMA DE PAGO */
  SELECT SUM(RCPA_MONTO) FROM RECIBOS_CAJA_PAGO P, RECIBOS_CAJA R, PUNTO_VENTA PT
    WHERE R.RECA_ID = P.RECA_ID AND PT.PTVT_ID = :punto AND RECA_FECHA = :FECHA AND PT.caja_id = R.caja_id AND ((PT.PREF_PRE = :PREFIJO) or (:PREFIJO = '')) AND FOPA_ID = 1 and RECA_ANULADO = 'N'
    INTO :FORMAP1;
  SELECT SUM(RCPA_MONTO) FROM RECIBOS_CAJA_PAGO P, RECIBOS_CAJA R, PUNTO_VENTA PT
    WHERE R.RECA_ID = P.RECA_ID AND PT.PTVT_ID = :punto AND RECA_FECHA = :FECHA AND PT.caja_id = R.caja_id AND ((PT.PREF_PRE = :PREFIJO) or (:PREFIJO = '')) AND FOPA_ID = 2 and RECA_ANULADO = 'N'
    INTO :FORMAP2;
  SELECT SUM(RCPA_MONTO) FROM RECIBOS_CAJA_PAGO P, RECIBOS_CAJA R, PUNTO_VENTA PT
    WHERE R.RECA_ID = P.RECA_ID AND PT.PTVT_ID = :punto AND RECA_FECHA = :FECHA AND PT.caja_id = R.caja_id AND ((PT.PREF_PRE = :PREFIJO) or (:PREFIJO = '')) AND FOPA_ID = 3 and RECA_ANULADO = 'N'
    INTO :FORMAP3;
  SELECT SUM(RCPA_MONTO) FROM RECIBOS_CAJA_PAGO P, RECIBOS_CAJA R, PUNTO_VENTA PT
    WHERE R.RECA_ID = P.RECA_ID AND PT.PTVT_ID = :punto AND RECA_FECHA = :FECHA AND PT.caja_id = R.caja_id AND ((PT.PREF_PRE = :PREFIJO) or (:PREFIJO = '')) AND FOPA_ID = 4 and RECA_ANULADO = 'N'
    INTO :FORMAP4;
  SELECT SUM(RCPA_MONTO) FROM RECIBOS_CAJA_PAGO P, RECIBOS_CAJA R, PUNTO_VENTA PT
    WHERE R.RECA_ID = P.RECA_ID AND PT.PTVT_ID = :punto AND RECA_FECHA = :FECHA AND PT.caja_id = R.caja_id AND ((PT.PREF_PRE = :PREFIJO) or (:PREFIJO = '')) AND FOPA_ID = 5 and RECA_ANULADO = 'N'
    INTO :FORMAP5;

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

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER PROCEDURE IMPUESTOS_VENTAS(
    FECINI DATE,
    FECFIN DATE,
    PREFIJO VARCHAR(4),
    PTOINI INTEGER,
    PTOFIN INTEGER,
    ANULADOS CHAR(1),
    SUBEMPRESA INTEGER)
RETURNS (
    TIPO INTEGER,
    NOMTIPO VARCHAR(30),
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    NIT VARCHAR(20),
    NOMTERCERO VARCHAR(60),
    SUBTOTAL NUMERIC(18,2),
    DTOMONTO NUMERIC(18,2),
    ADICIONAL NUMERIC(18,2),
    IVAMONTO NUMERIC(18,2),
    CONSUMO NUMERIC(18,2),
    EXENTOS NUMERIC(18,2),
    GRAVADOS1 NUMERIC(18,2),
    GRAVADOS2 NUMERIC(18,2),
    GRAVADOS3 NUMERIC(18,2),
    IVA1 NUMERIC(18,2),
    IVA2 NUMERIC(18,2),
    IVA3 NUMERIC(18,2),
    EXTRA NUMERIC(18,2),
    TOTAL NUMERIC(18,2),
    RTFTEMONTO NUMERIC(18,2),
    RTIVAMONTO NUMERIC(18,2),
    RTICAMONTO 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 NUMERIC(18,4);
declare variable NUEVO NUMERIC(18,2);
BEGIN
/* FACTURA */
TIPO = 31;
SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 31 INTO :NOMTIPO;

FOR SELECT FACT_ID, F.PREF_PRE, FACT_NUMERO, FACT_FECHA, TERC_NIT, FACT_NOMCLIENTE, FACT_ADICIONAL-FACT_DTOMONTO, FACT_IVAMONTO, FACT_RTFTEMONTO, FACT_RTIVAMONTO, FACT_RTICAMONTO, FACT_EXTRA, FACT_TOTAL, FACT_ANULADO
    FROM FACTURAS F, PREFIJOS PR WHERE PTVT_ID >= :PTOINI AND PTVT_ID <= :PTOFIN AND
    FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND ((:PREFIJO = '') or (:PREFIJO IS NULL) or (F.PREF_PRE = :PREFIJO))
    AND PR.PREF_PRE = F.PREF_PRE AND PR.TIDO_COD = 31 AND ((PR.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
    ORDER BY FACT_FECHA, F.PREF_PRE, FACT_NUMERO
    INTO :ID, :PREF, :NUMERO, :FECHA, :NIT, :NOMTERCERO, :DTOMONTO, :IVAMONTO, :RTFTEMONTO, :RTIVAMONTO, :RTICAMONTO, :EXTRA, :TOTAL, :ANULADO
    DO
    BEGIN
    SELECT TERC_EXENTO FROM TERCEROS WHERE TERC_NIT = :NIT INTO :TER_EXENTO;
    if ((ANULADOS = 'S') or (ANULADO = 'N')) then
        BEGIN
        if (ANULADO = 'S') then
            BEGIN
            EXENTOS = 0;
            GRAVADOS1 = 0;
            GRAVADOS2 = 0;
            GRAVADOS3 = 0;
            CONSUMO = 0;
            SUBTOTAL = 0;
            TOTAL = 0;
            EXTRA = 0;
            IVAMONTO = 0;
            DTOMONTO = 0;
            NETO = 0;
            RTFTEMONTO = 0;
            RTIVAMONTO = 0;
            RTICAMONTO = 0;
            END
        else
            BEGIN
            /* CALCULE LAS DIFERENTES TARIFAS */
            if (TER_EXENTO = 'S') then
                BEGIN
                SELECT SUM(FADE_TOTAL - FADE_IVAMONTO - FADE_CONSUMO) FROM FACTURAS_DETALLE D WHERE FACT_ID = :ID AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL)) INTO :EXENTOS;
                GRAVADOS1 = 0;
                GRAVADOS2 = 0;
                GRAVADOS3 = 0;
                end
            else
                begin
                SELECT SUM(FADE_TOTAL - FADE_IVAMONTO - FADE_CONSUMO) FROM FACTURAS_DETALLE D WHERE FACT_ID = :ID AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL)) AND FADE_IVAPORC = 0 INTO :EXENTOS;
                SELECT SUM(FADE_TOTAL - FADE_IVAMONTO - FADE_CONSUMO), SUM(FADE_IVAMONTO) FROM FACTURAS_DETALLE D, TARIFA_IVA T WHERE FACT_ID = :ID AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL)) AND FADE_IVAPORC = TAIV_PORC AND TAIV_COD = 1 INTO :GRAVADOS1, :IVA1;
                SELECT SUM(FADE_TOTAL - FADE_IVAMONTO - FADE_CONSUMO), SUM(FADE_IVAMONTO) FROM FACTURAS_DETALLE D, TARIFA_IVA T WHERE FACT_ID = :ID AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL)) AND FADE_IVAPORC = TAIV_PORC AND TAIV_COD = 2 INTO :GRAVADOS2, :IVA2;
                SELECT SUM(FADE_TOTAL - FADE_IVAMONTO - FADE_CONSUMO), SUM(FADE_IVAMONTO) FROM FACTURAS_DETALLE D, TARIFA_IVA T WHERE FACT_ID = :ID AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL)) AND FADE_IVAPORC = TAIV_PORC AND TAIV_COD = 3 INTO :GRAVADOS3, :IVA3;
                end
            if (iva1 is null) then
                iva1 = 0;
            if (iva2 is null) then
                iva2 = 0;
            if (iva3 is null) then
                iva3 = 0;
            IVAMONTO = IVA1 + IVA2 + IVA3;
            SELECT SUM(FADE_CONSUMO) FROM FACTURAS_DETALLE WHERE FACT_ID = :ID AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL)) INTO :CONSUMO;
            SUBTOTAL = TOTAL - EXTRA - IVAMONTO - DTOMONTO;
            NETO = TOTAL - RTFTEMONTO - RTIVAMONTO - RTICAMONTO;
            END
        if (exentos is null) then
            exentos = 0;
        if (gravados1 is null) then
            gravados1 = 0;
        if (gravados2 is null) then
            gravados2 = 0;
        if (gravados3 is null) then
            gravados3 = 0;
        if (consumo is null) then
            consumo = 0;
        FACTOR = 1;
        SELECT AJCI_FACTOR FROM ajuste_cierre WHERE AJCI_PORC = 0 AND AJCI_FECINI <= :FECHA AND AJCI_FECFIN >= :FECHA INTO :FACTOR;
        if (FACTOR IS null) then
            FACTOR = 1;
        EXENTOS = EXENTOS * FACTOR;
        ivamonto = 0;
        FACTOR = 1;
        SELECT AJCI_FACTOR FROM ajuste_cierre WHERE AJCI_PORC = 16 AND AJCI_FECINI <= :FECHA AND AJCI_FECFIN >= :FECHA INTO :FACTOR;
        if (FACTOR IS null) then
            FACTOR = 1;
        gravados1 = GRAVADOS1 * FACTOR;
        IVA1 = IVA1 * FACTOR;
        ivamonto = ivamonto + IVA1;
        FACTOR = 1;
        SELECT AJCI_FACTOR FROM ajuste_cierre WHERE AJCI_PORC = 10 AND AJCI_FECINI <= :FECHA AND AJCI_FECFIN >= :FECHA INTO :FACTOR;
        if (FACTOR IS null) then
            FACTOR = 1;
        gravados2 = GRAVADOS2 * FACTOR;
        IVA2 = IVA2 * FACTOR;
        ivamonto = ivamonto + IVA2;
        FACTOR = 1;
        SELECT AJCI_FACTOR FROM ajuste_cierre WHERE AJCI_PORC = 7 AND AJCI_FECINI <= :FECHA AND AJCI_FECFIN >= :FECHA INTO :FACTOR;
        if (FACTOR IS null) then
            FACTOR = 1;
        gravados3 = GRAVADOS3 * FACTOR;
        IVA3 = IVA3 * FACTOR;
        ivamonto = ivamonto + IVA3;
        NUEVO = exentos + gravados1 + gravados2 + gravados3;
        if (TOTAL <> 0) then
            BEGIN
            CONSUMO = CONSUMO * (NUEVO+ivamonto) / TOTAL;
            SUBTOTAL = SUBTOTAL * (NUEVO+ivamonto) / TOTAL;
            NETO = NETO * (NUEVO+ivamonto) / TOTAL;
            rtftemonto = rtftemonto * (NUEVO+ivamonto) / TOTAL;
            rticamonto = rticamonto * (NUEVO+ivamonto) / TOTAL;
            rtivamonto = rtivamonto * (NUEVO+ivamonto) / TOTAL;
            dtomonto = dtomonto * (NUEVO+ivamonto) / TOTAL;
            adicional = adicional * (NUEVO+ivamonto) / TOTAL;
            total = total * (NUEVO+ivamonto) / TOTAL;
            END
        SUSPEND;
        END
    END
    
TIPO = 33;
SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 33 INTO :NOMTIPO;
/* DEVOLUCIONES */
FOR SELECT DEVT_ID, D.PREF_PRE, DEVT_NUMERO, DEVT_FECHA, TERC_NIT, DEVT_NOMTERC, DEVT_ADICIONAL-DEVT_DTOMONTO, DEVT_IVAMONTO, DEVT_RTFTEMONTO, DEVT_RTIVAMONTO, DEVT_RTICAMONTO, DEVT_EXTRA, DEVT_TOTAL, DEVT_ANULADO
    FROM DEVOLUCIONES_VENTAS D, PREFIJOS PR WHERE PTVT_ID >= :PTOINI AND PTVT_ID <= :PTOFIN AND
    DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND ((:PREFIJO = '') or (:PREFIJO IS NULL) or (D.PREF_PRE = :PREFIJO))
    AND PR.PREF_PRE = D.PREF_PRE AND PR.TIDO_COD = 33 AND ((PR.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) AND ((DEVT_REMID = 0) or (DEVT_REMID IS NULL))
    ORDER BY DEVT_FECHA, D.PREF_PRE, DEVT_NUMERO
    INTO :ID, :PREF, :NUMERO, :FECHA, :NIT, :NOMTERCERO, :DTOMONTO, :IVAMONTO, :RTFTEMONTO, :RTIVAMONTO, :RTICAMONTO, :EXTRA, :TOTAL, :ANULADO
    DO
    BEGIN
    SELECT TERC_EXENTO FROM TERCEROS WHERE TERC_NIT = :NIT INTO :TER_EXENTO;
    if ((ANULADOS = 'S') or (ANULADO = 'N')) then
        BEGIN
        if (ANULADO = 'S') then
            BEGIN
            EXENTOS = 0;
            GRAVADOS1 = 0;
            GRAVADOS2 = 0;
            GRAVADOS3 = 0;
            CONSUMO = 0;
            SUBTOTAL = 0;
            TOTAL = 0;
            EXTRA = 0;
            IVAMONTO = 0;
            DTOMONTO = 0;
            NETO = 0;
            RTFTEMONTO = 0;
            RTIVAMONTO = 0;
            RTICAMONTO = 0;
            END
        else
            BEGIN
            DTOMONTO = DTOMONTO * -1;
            ADICIONAL = ADICIONAL * -1;
            IVAMONTO = IVAMONTO * -1;
            EXTRA = EXTRA * -1;
            TOTAL = TOTAL * -1;
            RTFTEMONTO = RTFTEMONTO * -1;
            RTIVAMONTO = RTIVAMONTO * -1;
            RTICAMONTO = RTICAMONTO * -1;
            /* CALCULE LAS DIFERENTES TARIFAS */
            if (TER_EXENTO = 'S') then
             BEGIN
              SELECT SUM(DVDE_TOTAL - DVDE_IVAMONTO - DVDE_CONSUMO) FROM DEVOLUCIONES_VENTAS_DETALLE D WHERE DEVT_ID = :ID AND DVDE_REFERENCIA <> '.t' INTO :EXENTOS;
              GRAVADOS1 = 0;
              GRAVADOS2 = 0;
              GRAVADOS3 = 0;
             end
            else
             begin
              SELECT SUM(DVDE_TOTAL - DVDE_IVAMONTO - DVDE_CONSUMO) FROM DEVOLUCIONES_VENTAS_DETALLE D WHERE DEVT_ID = :ID AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL)) AND DVDE_IVAPORC = 0 INTO :EXENTOS;
              SELECT SUM(DVDE_TOTAL - DVDE_IVAMONTO - DVDE_CONSUMO), SUM(DVDE_IVAMONTO) FROM DEVOLUCIONES_VENTAS_DETALLE D, TARIFA_IVA T WHERE DEVT_ID = :ID AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL)) AND DVDE_IVAPORC = TAIV_PORC AND TAIV_COD = 1 INTO :GRAVADOS1, :IVA1;
              SELECT SUM(DVDE_TOTAL - DVDE_IVAMONTO - DVDE_CONSUMO), SUM(DVDE_IVAMONTO) FROM DEVOLUCIONES_VENTAS_DETALLE D, TARIFA_IVA T WHERE DEVT_ID = :ID AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL)) AND DVDE_IVAPORC = TAIV_PORC AND TAIV_COD = 2 INTO :GRAVADOS2, :IVA2;
              SELECT SUM(DVDE_TOTAL - DVDE_IVAMONTO - DVDE_CONSUMO), SUM(DVDE_IVAMONTO) FROM DEVOLUCIONES_VENTAS_DETALLE D, TARIFA_IVA T WHERE DEVT_ID = :ID AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL)) AND DVDE_IVAPORC = TAIV_PORC AND TAIV_COD = 3 INTO :GRAVADOS3, :IVA3;
             end
            if (iva1 is null) then
                iva1 = 0;
            if (iva2 is null) then
                iva2 = 0;
            if (iva3 is null) then
                iva3 = 0;
            IVAMONTO = IVA1 + IVA2 + IVA3;
            SELECT SUM(DVDE_CONSUMO) FROM DEVOLUCIONES_VENTAS_DETALLE WHERE DEVT_ID = :ID AND DVDE_REFERENCIA <> '.t' INTO :CONSUMO;
            EXENTOS = EXENTOS * -1;
            GRAVADOS1 = GRAVADOS1 * -1;
            GRAVADOS2 = GRAVADOS2 * -1;
            GRAVADOS3 = GRAVADOS3 * -1;
            CONSUMO = CONSUMO * -1;
            IVA1 = IVA1 * -1;
            IVA2 = IVA2 * -1;
            IVA3 = IVA3 * -1;
            IVAMONTO = IVAMONTO * -1;
            SUBTOTAL = TOTAL - EXTRA - IVAMONTO - DTOMONTO;
            NETO = TOTAL - RTFTEMONTO - RTIVAMONTO - RTICAMONTO;
            END
        if (exentos is null) then
            exentos = 0;
        if (gravados1 is null) then
            gravados1 = 0;
        if (gravados2 is null) then
            gravados2 = 0;
        if (gravados3 is null) then
            gravados3 = 0;
        if (consumo is null) then
            consumo = 0;
        FACTOR = 1;
        SELECT AJCI_FACTOR FROM ajuste_cierre WHERE AJCI_PORC = 0 AND AJCI_FECINI <= :FECHA AND AJCI_FECFIN >= :FECHA INTO :FACTOR;
        if (FACTOR IS null) then
            FACTOR = 1;
        EXENTOS = EXENTOS * FACTOR;
        ivamonto = 0;
        FACTOR = 1;
        SELECT AJCI_FACTOR FROM ajuste_cierre WHERE AJCI_PORC = 16 AND AJCI_FECINI <= :FECHA AND AJCI_FECFIN >= :FECHA INTO :FACTOR;
        if (FACTOR IS null) then
            FACTOR = 1;
        gravados1 = GRAVADOS1 * FACTOR;
        IVA1 = IVA1 * FACTOR;
        ivamonto = ivamonto + IVA1;
        FACTOR = 1;
        SELECT AJCI_FACTOR FROM ajuste_cierre WHERE AJCI_PORC = 10 AND AJCI_FECINI <= :FECHA AND AJCI_FECFIN >= :FECHA INTO :FACTOR;
        if (FACTOR IS null) then
            FACTOR = 1;
        gravados2 = GRAVADOS2 * FACTOR;
        IVA2 = IVA2 * FACTOR;
        ivamonto = ivamonto + IVA2;
        FACTOR = 1;
        SELECT AJCI_FACTOR FROM ajuste_cierre WHERE AJCI_PORC = 7 AND AJCI_FECINI <= :FECHA AND AJCI_FECFIN >= :FECHA INTO :FACTOR;
        if (FACTOR IS null) then
            FACTOR = 1;
        gravados3 = GRAVADOS3 * FACTOR;
        IVA3 = IVA3 * FACTOR;
        ivamonto = ivamonto + IVA3;
        NUEVO = exentos + gravados1 + gravados2 + gravados3;
        if (TOTAL <> 0) then
            BEGIN
            CONSUMO = CONSUMO * (NUEVO+ivamonto) / TOTAL;
            SUBTOTAL = SUBTOTAL * (NUEVO+ivamonto) / TOTAL;
            NETO = NETO * (NUEVO+ivamonto) / TOTAL;
            rtftemonto = rtftemonto * (NUEVO+ivamonto) / TOTAL;
            rticamonto = rticamonto * (NUEVO+ivamonto) / TOTAL;
            rtivamonto = rtivamonto * (NUEVO+ivamonto) / TOTAL;
            dtomonto = dtomonto * (NUEVO+ivamonto) / TOTAL;
            adicional = adicional * (NUEVO+ivamonto) / TOTAL;
            total = total * (NUEVO+ivamonto) / TOTAL;
            END
        SUSPEND;
        END
    END
execute procedure lee_configuracion ('FACTURACION', 'DOCUMENTOS', 'INCLUIR NOTAS DE CARTERA EN REPORTE DE IMPUESTOS EN VENTAS') returning_values (:NOTAS);
if (NOTAS = 'SI') then
    BEGIN
    TIPO = 41;
    SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 41 INTO :NOMTIPO;
    FOR SELECT NDCL_ID, N.PREF_PRE, NDCL_NUMERO, NDCL_FECHA, N.TERC_NIT, TERC_NOM, 0, NDCL_IVAMONTO, NDCL_RTFTEMONTO, NDCL_RTIVAMONTO, NDCL_RTICAMONTO, 0, NDCL_MONTO+NDCL_IVAMONTO, NDCL_ANULADO
        FROM NOTAS_DEBITO_CLIENTES N, TERCEROS T, PREFIJOS PR WHERE N.TERC_NIT = T.TERC_NIT AND
        NDCL_FECHA >= :FECINI AND NDCL_FECHA <= :FECFIN AND ((:PREFIJO = '') or (:PREFIJO IS NULL) or (N.PREF_PRE = :PREFIJO))
        AND PR.PREF_PRE = N.PREF_PRE AND PR.TIDO_COD = 41 AND ((PR.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
        ORDER BY NDCL_FECHA, N.PREF_PRE, NDCL_NUMERO
        INTO :ID, :PREF, :NUMERO, :FECHA, :NIT, :NOMTERCERO, :DTOMONTO, :IVAMONTO, :RTFTEMONTO, :RTIVAMONTO, :RTICAMONTO, :EXTRA, :TOTAL, :ANULADO
        DO
        BEGIN
        GRAVADOS2 = 0;
        GRAVADOS3 = 0;
        IVA2 = 0;
        IVA3 = 0;
        CONSUMO = 0;
        if (ANULADO = 'S') then
            BEGIN
            EXENTOS = 0;
            GRAVADOS1 = 0;
            SUBTOTAL = 0;
            TOTAL = 0;
            EXTRA = 0;
            IVAMONTO = 0;
            DTOMONTO = 0;
            NETO = 0;
            RTFTEMONTO = 0;
            RTIVAMONTO = 0;
            RTICAMONTO = 0;
            END
        ELSE
            BEGIN
            if (IVAMONTO <> 0) then
                BEGIN
                GRAVADOS1 = TOTAL-IVAMONTO;
                IVA1 = IVAMONTO;
                exentos = 0;
                END
            ELSE
                BEGIN
                GRAVADOS1 = 0;
                IVA1 = 0;
                exentos = TOTAL;
                END
            SUBTOTAL = TOTAL - EXTRA - IVAMONTO - DTOMONTO;
            NETO = TOTAL - RTFTEMONTO - RTIVAMONTO - RTICAMONTO;
            END
        SUSPEND;
        END

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

SET TERM ; ^


/* 20090515C */
/* MULTIPLE ROWS AL ACTUALIZAR LOS COSTOS DE LA REMISION DE VARIOS ITEMS */
SET TERM ^ ;

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

        if (COSTO > 0 ) then
         BEGIN
          /* ACTUALICE EL COSTO POR PROVEEDOR */
          SELECT PVAR_FECHA FROM PROVEEDOR_ARTICULO
            WHERE TERC_NIT = :Nit AND ARTI_COD = NEW.ARTI_COD
            INTO :FECAUX;
          if (FECAUX IS NULL) then
            INSERT INTO PROVEEDOR_ARTICULO (TERC_NIT, ARTI_COD, PVAR_COSTO, PVAR_FECHA, PVAR_COD,PVAR_DES)
                VALUES (:Nit, NEW.ARTI_COD, :COSTO, :fec, NEW.fcde_codprov,NEW.fcde_desc);
          else
            UPDATE PROVEEDOR_ARTICULO
                SET PVAR_COSTO = :COSTO, PVAR_FECHA = :fec, PVAR_COD = NEW.fcde_codprov
                WHERE ARTI_COD = NEW.ARTI_COD AND TERC_NIT = :Nit;
         END
        /* RECORRA LAS LISTAS DE PRECIOS Y CAMBIE EL PRECIO */
        EXECUTE PROCEDURE CALCULA_PRECIOS(NEW.ARTI_COD, :FEC);
        END /* AFECTAR INV */
    EXECUTE PROCEDURE lee_configuracion('COMPRAS', 'FACTURAS', 'ACTUALIZAR COSTOS DE LA REMISION RELACIONADA AL GRABAR LA FACTURA') returning_values (:ACTREM);
    if ((ACTREM = 'SI') and (Tipo = 22)) then
        BEGIN
        numrows = 0;
        select mvar_cons, MVAR_ITEM, MVAR_FECHA, MVAR_IDREF, MVAR_CANT, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO
            from movimiento_articulo M, consolidado_faltantes C
            where C.cofa_id = :CONSOLIDA AND mvar_tipodoc = 22 and mvar_idref = C.cofa_idori AND C.cofa_tipoori = 22 and m.arti_cod = new.arti_cod and m.mvar_item = c.cofa_itemori
            into :numrows, :iterem, :fecrem, :idrem, :cantrem, :loterem, :prefrem, :numrem;
        
        if (numrows <> 0) then
            BEGIN
            INSERT INTO MOVIMIENTO_ARTICULO
                (ARTI_COD, MVAR_CONS, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM, TERC_NIT)
                VALUES(NEW.ARTI_COD, GEN_ID(ID_MOVARTI,1), NEW.BODE_COD, :fecrem, 22, :idrem,
                :CONC, :cantrem, :costo, 'S', :loterem, :prefrem, :numrem, :iterem, :Nit);
            DELETE FROM MOVIMIENTO_ARTICULO WHERE MVAR_CONS = :numrows;
        
            if (COSTO > 0 ) then
                BEGIN
                /* ACTUALICE EL COSTO POR PROVEEDOR */
                SELECT PVAR_FECHA FROM PROVEEDOR_ARTICULO
                    WHERE TERC_NIT = :Nit AND ARTI_COD = NEW.ARTI_COD
                    INTO :FECAUX;
                if (FECAUX IS NULL) then
                    INSERT INTO PROVEEDOR_ARTICULO (TERC_NIT, ARTI_COD, PVAR_COSTO, PVAR_FECHA, PVAR_COD,PVAR_DES)
                        VALUES (:Nit, NEW.ARTI_COD, :COSTO, :fec, NEW.fcde_codprov,NEW.fcde_desc);
                else
                    UPDATE PROVEEDOR_ARTICULO
                        SET PVAR_COSTO = :COSTO, PVAR_FECHA = :fec, PVAR_COD = NEW.fcde_codprov
                        WHERE ARTI_COD = NEW.ARTI_COD AND TERC_NIT = :Nit;
                END
            /* RECORRA LAS LISTAS DE PRECIOS Y CAMBIE EL PRECIO */
            EXECUTE PROCEDURE CALCULA_PRECIOS(NEW.ARTI_COD, :FEC);
            END
        END

    /* ACTUALICE EL PENDIENTE  */
    if (CONSOLIDA <> 0) then
        BEGIN
        UPDATE consolidado_faltantes SET COFA_OK = 'S' WHERE COFA_ID = :consolida AND COFA_ITEM = NEW.FCDE_ITEM AND ARTI_COD = NEW.arti_cod;
        EXECUTE procedure LEE_CONFIGURACION ('COMPRAS','DOCUMENTOS','SUMAR CANTIDADES PENDIENTES AL CONSOLIDAR DOCUMENTOS') returning_values (CONSO);
        /* IGNORE LA CONSOLIDACION SI SE VALIDAN CODIGOS DE LA ORDEN */
        SELECT MIN(CEFA_TIPOORI) FROM consolide_faltantes WHERE CEFA_ID = :CONSOLIDA INTO :NUMROWS;
        if (NUMROWS = 23) then
            BEGIN
            EXECUTE PROCEDURE LEE_CONFIGURACION('COMPRAS', 'FACTURAS', 'VERIFICAR CODIGOS DE LA ORDEN') returning_values (MENORV);
            if (MENORV = 'SI') then
                CONSO = 'NO';
            END
        SELECT COUNT(CEFA_ITEM) FROM consolide_faltantes WHERE CEFA_ID = :CONSOLIDA INTO :NUMROWS;
        if ((CONSO = 'SI') AND (NUMROWS > 1)) then
            UPDATE consolidado_faltantes SET COFA_IDDES = NEW.faco_id, COFA_OK = 'S' WHERE COFA_ID = :consolida;
        else
            BEGIN
            /* BUSQUE EL CONSOLIDADO EN EL MISMO ITEM Y SI ES DIFERENTE ACTUALICELO */
            select COFA_CANT * COFA_FACTOR FROM consolidado_faltantes WHERE COFA_ID = :consolida AND COFA_ITEM = NEW.FCDE_ITEM AND ARTI_COD = NEW.arti_cod INTO :CANTREL;
            if (NEW.FCDE_CANT * NEW.FCDE_FACTOR < CANTREL) then
                UPDATE consolidado_faltantes SET COFA_IDDES = NEW.faco_id, COFA_CANT = NEW.FCDE_CANT, COFA_FACTOR = NEW.FCDE_FACTOR
                    WHERE COFA_ID = :consolida AND COFA_ITEM = NEW.FCDE_ITEM AND ARTI_COD = NEW.arti_cod;
            END
        END
    /* ACTUALICE EL STAND */
    if (new.fcde_stand is not null) then
      if (exists(select stand_cod from stands where arti_cod = new.arti_cod and stand_bodega = new.bode_cod)) then
        UPDATE stands set stand_cod = new.fcde_stand where arti_cod = new.arti_cod and stand_bodega = new.bode_cod;
      else
        INSERT INTO stands (ARTI_COD, STAND_BODEGA, STAND_COD) VALUES (NEW.arti_cod, NEW.bode_cod, NEW.fcde_stand);
    END
END
^

SET TERM ; ^


/* 20090516 */
/* PRECIO DE REFERENCIA EN EXISTENCIAS Y COSTOS */
SET TERM ^ ;

CREATE OR ALTER PROCEDURE EXISTENCIAS_DESDE_HASTA(
    FECHA DATE,
    ARTINI VARCHAR(20),
    ARTFIN VARCHAR(20),
    GRPINI VARCHAR(3),
    GRPFIN VARCHAR(3),
    BODINI VARCHAR(2),
    BODFIN VARCHAR(2),
    ORDEN CHAR(1),
    AGRUPA CHAR(1),
    DETALLE CHAR(1),
    RESERVA CHAR(1),
    ENPESO CHAR(1),
    SUCURSAL INTEGER)
RETURNS (
    CANT NUMERIC(18,4),
    COSTO NUMERIC(18,2),
    COSTO_LOTE NUMERIC(18,2),
    CODIGO VARCHAR(15),
    NOMBRE VARCHAR(60),
    UNIDAD VARCHAR(8),
    STAND VARCHAR(15),
    CODGRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    CODSUBG VARCHAR(3),
    NOMSUBG VARCHAR(30),
    CODMARC VARCHAR(3),
    NOMMARC VARCHAR(30),
    CODBOD VARCHAR(2),
    LOTE VARCHAR(15),
    NOMBOD VARCHAR(30),
    COSTOTOT NUMERIC(18,2),
    ULTCOSTO NUMERIC(18,2),
    FECHACOSTO DATE,
    CONSUMO NUMERIC(18,2),
    RESERVADO NUMERIC(18,4),
    ORDENADO NUMERIC(18,4),
    IVA NUMERIC(9,2),
    PESOUNIT NUMERIC(18,4),
    PESOTOTAL NUMERIC(18,4),
    PRECIO  NUMERIC(18,2),
    CODBAR VARCHAR(20))
AS
declare variable exist char(1);
declare variable codini varchar(20);
declare variable codfin varchar(20);
declare variable desini varchar(20);
declare variable desfin varchar(20);
declare variable ordenc numeric(18,4);
declare variable pedido numeric(18,4);
declare variable ok char(1);
declare variable id integer;
declare variable item integer;
declare variable und varchar(8);
declare variable factor numeric(18,4);
declare variable cant2 numeric(18,4);
declare variable PEDAUTO CHAR(2);
DECLARE VARIABLE LISTA INTEGER;
BEGIN
EXECUTE PROCEDURE lee_configuracion ('FACTURACION','FACTURAS', 'CODIGO DE LA LISTA DE PRECIOS A MOSTRAR EN ARTICULOS') returning_values (:LISTA);
if (ORDEN = 'C') then
    BEGIN
    CODINI = ARTINI;
    CODFIN = ARTFIN;
    DESINI = '';
    DESFIN = 'zz';
    END
ELSE
    BEGIN
    DESINI = ARTINI;
    DESFIN = ARTFIN;
    CODINI = '';
    CODFIN = 'zz';
    END
EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION', 'FACTURAS', 'GENERAR PEDIDO AUTOMATICAMENTE CON LA FACTURA') returning_values (pedauto);
if (DETALLE = 'B') then
  BEGIN
  FOR SELECT ARTI_COD, ARTI_DES, ARTI_UNIDAD, ARTI_EXIST, TAIV_PORC, A.GRUP_COD, A.SUBG_COD, A.MARC_COD, BODE_COD, BODE_NOM, ARTI_CONSUMO, ARTI_PESO/1000
      FROM ARTICULO A, BODEGA B, TARIFA_IVA T
      WHERE ARTI_COD >= :CODINI AND ARTI_COD <= :CODFIN AND ARTI_DES >= :DESINI AND ARTI_DES <= :DESFIN AND ESAR_COD <> 'I' AND BODE_COD >= :BODINI AND
      BODE_COD <= :BODFIN AND ((SUCU_ID = :SUCURSAL) or (:SUCURSAL = 0)) AND A.TAIV_COD = T.TAIV_COD
      INTO :CODIGO, :NOMBRE, :UNIDAD, :EXIST, :IVA, :CODGRUPO, :CODSUBG, :CODMARC, :CODBOD, :NOMBOD, :CONSUMO, :pesounit
      DO
        BEGIN
        STAND = '';
        OK = 'N';
        if (AGRUPA = 'G') then
            BEGIN
            if ((CODGRUPO >= GRPINI) AND (CODGRUPO <= GRPFIN)) then
                OK = 'S';
            end
        ELSE
            if (AGRUPA = 'M') then
                BEGIN
                if ((CODMARC >= GRPINI) AND (CODMARC <= GRPFIN)) then
                    OK = 'S';
                END
        if (OK = 'S') then
            BEGIN
            NOMGRUPO = '';
            NOMMARC = '';
            NOMSUBG = '';
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            SELECT MAX(COBA_COD) FROM BARRAS_ARTICULO WHERE ARTI_COD = :codigo AND COBA_UNIDAD = :unidad INTO :codbar;
            if (CODBAR IS NULL) then
                CODBAR = CODIGO;
            if (EXIST <> 'N') then
                BEGIN
                SELECT STAND_COD FROM STANDS WHERE ARTI_COD = :CODIGO AND STAND_BODEGA = :CODBOD INTO :STAND;
                EXECUTE PROCEDURE SALDO_INICIAL_INVENTARIO(CODIGO, FECHA, :CODBOD) returning_values (CANT);
                EXECUTE PROCEDURE costo_promedio_y_ultimo_unidad(CODIGO, FECHA, UNIDAD) returning_values (COSTO, ULTCOSTO);
                SELECT MAX(EXIS_FECHA) FROM EXISTENCIA WHERE ARTI_COD = :CODIGO AND EXIS_ENTR <> 0 AND EXIS_FECHA <= :FECHA INTO :FECHACOSTO;
                COSTOTOT = :CANT * :COSTO;
                CONSUMO = CONSUMO * CANT;
                if (RESERVA = 'S') then
                    BEGIN
                    SELECT SUM(ORID_ENTREGAR)
                        FROM ORDENINVENTARIO_DETALLE OD, ordenes_inventario O
                        WHERE O.ORIN_ID = OD.ORIN_ID AND ARTI_COD = :CODIGO AND ORIN_FECHA <= :FECHA AND ORIN_FECLLEGA >= :FECHA AND ORID_ANULADO = 'N' AND OD.BODE_COD = :CODBOD
                        INTO :ORDENADO;
                    if (ORDENADO IS NULL) then
                        ORDENADO = 0;
                    ORDENC = 0;
                    FOR SELECT O.ORDC_ID, OCDE_ITEM, OCDE_CANT * OCDE_FACTOR
                        FROM ORDENES_COMPRA O, ORDENES_COMPRA_DETALLE OD
                        WHERE O.ORDC_ID = OD.ORDC_ID AND OD.ARTI_COD = :CODIGO AND ORDC_VENCE >= :FECHA AND ORDC_FECHA <= :FECHA AND OCDE_ANULADO = 'N' AND OD.BODE_COD = :CODBOD
                        INTO :ID, :ITEM, :CANT2
                        do
                        BEGIN
                        EXECUTE PROCEDURE FALTANTE(23, 21, ID, ITEM) returning_values (PEDIDO, UND, FACTOR);
                        if (PEDIDO * FACTOR = CANT2) then /* SI NO SE HA FACTURADO MIRE A VER SI SE REMISIONO */
                            EXECUTE PROCEDURE FALTANTE(23, 22, ID, ITEM) returning_values (PEDIDO, UND, FACTOR);
                        if (PEDIDO IS NULL) then
                            PEDIDO = 0;
                        ORDENC = ORDENC + PEDIDO * FACTOR;
                        END
                    ORDENADO = ORDENADO + ORDENC;
                    SELECT SUM(RSDE_LIBERAR)
                        FROM RESERVAS_DETALLE RD, RESERVAS R
                        WHERE R.RESE_ID = RD.RESE_ID AND ARTI_COD = :CODIGO AND RESE_FECHA <= :FECHA AND RESE_VENCE >= :FECHA AND RD.BODE_COD = :CODBOD AND RSDE_ANULADO = 'N'
                        INTO :RESERVADO;
                    if (RESERVADO IS NULL) then
                        RESERVADO = 0;
                    PEDIDO = 0;
                    FOR SELECT P.PEDI_ID, PEDE_ITEM, PEDE_CANT * PEDE_FACTOR
                        FROM PEDIDOS P, PEDIDOS_DETALLE PD
                        WHERE P.PEDI_ID = PD.PEDI_ID AND PD.ARTI_COD = :CODIGO AND PEDI_VENCE >= :FECHA AND PEDI_FECHA <= :FECHA AND PEDE_ANULADO = 'N' AND BODE_COD = :CODBOD
                        INTO :ID, :ITEM, :CANT2
                        do
                        BEGIN
                        EXECUTE PROCEDURE FALTANTE(34, 31, ID, ITEM) returning_values (ORDENC, UND, FACTOR);
                        if ((ORDENC * FACTOR = CANT2) or (PEDAUTO = 'SI')) then /* SI NO SE HA FACTURADO MIRE A VER SI SE REMISIONO */
                            EXECUTE PROCEDURE FALTANTE(34, 32, ID, ITEM) returning_values (ORDENC, UND, FACTOR);
                        if (ORDENC IS NULL) then
                            ORDENC = 0;
                        PEDIDO = PEDIDO + ORDENC * FACTOR;
                        END
                    RESERVADO = RESERVADO + PEDIDO;
                    END
                ELSE
                    BEGIN
                    RESERVADO = 0;
                    ORDENADO = 0;
                    END
                if (LISTA > 0) then
                    SELECT prar_fijo FROM precios_articulo WHERE arti_cod = :CODIGO and lipr_cod = :LISTA INTO :PRECIO;
                if (ENPESO = 'S') then
                    BEGIN
                    if (pesounit IS NULL) then
                        pesounit = 0;
                    if (PESOUNIT <> 0) then
                        BEGIN
                        pesototal = PESOUNIT * cant;
                        SUSPEND;
                        END
                    END
                ELSE
                    SUSPEND;
                END
            END
        END
  END

if (DETALLE = 'L') then
  BEGIN
  FOR SELECT A.ARTI_COD, ARTI_DES, ARTI_UNIDAD, ARTI_EXIST, TAIV_PORC, A.GRUP_COD, A.SUBG_COD, A.MARC_COD, L.lote_nro, L.lote_nro||' - '||L.lote_vence, ARTI_CONSUMO,l.bode_cod, L.lote_saldo,l.lote_costo, ARTI_PESO/1000
      FROM ARTICULO A, LOTES l, TARIFA_IVA T
      WHERE A.ARTI_COD >= '0' AND A.ARTI_COD <= 'zz' AND ARTI_DES >= '' AND ARTI_DES <= 'zz' AND ESAR_COD <> 'I' AND A.TAIV_COD = T.TAIV_COD and a.arti_cod = l.arti_cod
      INTO :CODIGO, :NOMBRE, :UNIDAD, :EXIST, :IVA, :CODGRUPO, :CODSUBG, :CODMARC, :LOTE, :NOMBOD, :CONSUMO, :codbod, :cant, :costo_lote, :pesounit
      DO
        BEGIN
        OK = 'N';
        if (AGRUPA = 'G') then
            BEGIN
            if ((CODGRUPO >= GRPINI) AND (CODGRUPO <= GRPFIN)) then
                OK = 'S';
            end
        ELSE
            if (AGRUPA = 'M') then
                BEGIN
                if ((CODMARC >= GRPINI) AND (CODMARC <= GRPFIN)) then
                    OK = 'S';
                END
        if (OK = 'S') then
            BEGIN
            NOMGRUPO = '';
            NOMMARC = '';
            NOMSUBG = '';
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            SELECT MAX(COBA_COD) FROM BARRAS_ARTICULO WHERE ARTI_COD = :codigo AND COBA_UNIDAD = :unidad INTO :codbar;
            if (CODBAR IS NULL) then
                CODBAR = CODIGO;

            if (EXIST <> 'N') then
                BEGIN
                EXECUTE PROCEDURE COSTO_PROMEDIO_UNIDAD(CODIGO, FECHA, UNIDAD) returning_values (COSTO);
                EXECUTE PROCEDURE ULTIMO_COSTO(CODIGO, FECHA, UNIDAD) returning_values (ULTCOSTO);
                SELECT MAX(MVAR_FECHA) FROM MOVIMIENTO_ARTICULO WHERE ARTI_COD = :CODIGO AND MVAR_ENTRADA = 'S' AND MVAR_FECHA <= :FECHA INTO :FECHACOSTO;
                COSTOTOT = :CANT * :COSTO;
                CONSUMO = CONSUMO * CANT;
                if (RESERVA = 'S') then
                    BEGIN
                    SELECT SUM(ORID_ENTREGAR)
                        FROM ORDENINVENTARIO_DETALLE OD, ordenes_inventario O
                        WHERE O.ORIN_ID = OD.ORIN_ID AND ARTI_COD = :CODIGO AND ORIN_FECHA <= :FECHA AND ORIN_FECLLEGA >= :FECHA AND ORID_ANULADO = 'N'
                        INTO :ORDENADO;
                    if (ORDENADO IS NULL) then
                        ORDENADO = 0;
                    ORDENC = 0;
                    FOR SELECT O.ORDC_ID, OCDE_ITEM, OCDE_CANT * OCDE_FACTOR
                        FROM ORDENES_COMPRA O, ORDENES_COMPRA_DETALLE OD
                        WHERE O.ORDC_ID = OD.ORDC_ID AND OD.ARTI_COD = :CODIGO AND ORDC_VENCE >= :FECHA AND ORDC_FECHA <= :FECHA AND OCDE_ANULADO = 'N'
                        INTO :ID, :ITEM, :CANT2
                        do
                        BEGIN
                        EXECUTE PROCEDURE FALTANTE(23, 21, ID, ITEM) returning_values (PEDIDO, UND, FACTOR);
                        if (PEDIDO * FACTOR = CANT2) then /* SI NO SE HA FACTURADO MIRE A VER SI SE REMISIONO */
                            EXECUTE PROCEDURE FALTANTE(23, 22, ID, ITEM) returning_values (PEDIDO, UND, FACTOR);
                        if (PEDIDO IS NULL) then
                            PEDIDO = 0;
                        ORDENC = ORDENC + PEDIDO * FACTOR;
                        END
                    ORDENADO = ORDENADO + ORDENC;
                    SELECT SUM(RSDE_LIBERAR)
                        FROM RESERVAS_DETALLE RD, RESERVAS R
                        WHERE R.RESE_ID = RD.RESE_ID AND ARTI_COD = :CODIGO AND RESE_FECHA <= :FECHA AND RESE_VENCE >= :FECHA AND RSDE_ANULADO = 'N'
                        INTO :RESERVADO;
                    if (RESERVADO IS NULL) then
                        RESERVADO = 0;
                    PEDIDO = 0;
                    FOR SELECT P.PEDI_ID, PEDE_ITEM, PEDE_CANT * PEDE_FACTOR
                        FROM PEDIDOS P, PEDIDOS_DETALLE PD
                        WHERE P.PEDI_ID = PD.PEDI_ID AND PD.ARTI_COD = :CODIGO AND PEDI_VENCE >= :FECHA AND PEDI_FECHA <= :FECHA AND PEDE_ANULADO = 'N'
                        INTO :ID, :ITEM, :CANT2
                        do
                        BEGIN
                        EXECUTE PROCEDURE FALTANTE(34, 31, ID, ITEM) returning_values (ORDENC, UND, FACTOR);
                        if ((ORDENC * FACTOR = CANT2) or (PEDAUTO = 'SI')) then /* SI NO SE HA FACTURADO MIRE A VER SI SE REMISIONO */
                            EXECUTE PROCEDURE FALTANTE(34, 32, ID, ITEM) returning_values (ORDENC, UND, FACTOR);
                        if (ORDENC IS NULL) then
                            ORDENC = 0;
                        PEDIDO = PEDIDO + ORDENC * FACTOR;
                        END
                    RESERVADO = RESERVADO + PEDIDO;
                    END
                ELSE
                    BEGIN
                    RESERVADO = 0;
                    ORDENADO = 0;
                    END
                if (LISTA > 0) then
                    SELECT prar_fijo FROM precios_articulo WHERE arti_cod = :CODIGO and lipr_cod = :LISTA INTO :PRECIO;
                if (ENPESO = 'S') then
                    BEGIN
                    if (pesounit IS NULL) then
                        pesounit = 0;
                    if (PESOUNIT <> 0) then
                        BEGIN
                        pesototal = PESOUNIT * cant;
                        SUSPEND;
                        END
                    END
                ELSE
                    SUSPEND;
                END
            END
        END
  end
if (DETALLE = 'N') then
  BEGIN
  FOR SELECT ARTI_COD, ARTI_DES, ARTI_UNIDAD, ARTI_EXIST, TAIV_PORC, A.GRUP_COD, A.SUBG_COD, A.MARC_COD, ARTI_CONSUMO, ARTI_PESO/1000
      FROM ARTICULO A, TARIFA_IVA T
      WHERE ARTI_COD >= :CODINI AND ARTI_COD <= :CODFIN AND ARTI_DES >= :DESINI AND ARTI_DES <= :DESFIN AND ESAR_COD <> 'I' AND A.TAIV_COD = T.TAIV_COD
      INTO :CODIGO, :NOMBRE, :UNIDAD, :EXIST, :IVA, :CODGRUPO, :CODSUBG, :CODMARC, :CONSUMO, :pesounit
      DO
        BEGIN
        OK = 'N';
        if (AGRUPA = 'G') then
            BEGIN
            if ((GRPINI = '0') AND (GRPFIN = 'zz')) then
                OK = 'S';
            else
                if ((CODGRUPO >= GRPINI) AND (CODGRUPO <= GRPFIN)) then
                    OK = 'S';
            end
        ELSE
            if (AGRUPA = 'M') then
                BEGIN
                if ((GRPINI = '0') AND (GRPFIN = 'zzz')) then
                    OK = 'S';
                else
                    if ((CODMARC >= GRPINI) AND (CODMARC <= GRPFIN)) then
                        OK = 'S';
                END
        if (OK = 'S') then
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            SELECT MAX(COBA_COD) FROM BARRAS_ARTICULO WHERE ARTI_COD = :codigo AND COBA_UNIDAD = :unidad INTO :codbar;
            if (CODBAR IS NULL) then
                CODBAR = CODIGO;

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

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

SET TERM ; ^


/* 20090515D */
/* falto inicializar existencia, se repite del articulo anterior */
SET TERM ^ ;

CREATE OR ALTER PROCEDURE CONSULTA_ARTICULOS_VTAS(
    FECHA DATE,
    INACTIVOS CHAR(1),
    MODULO VARCHAR(20),
    BUSCAR VARCHAR(100),
    CUALQUIERA CHAR(1),
    COLUMNA INTEGER,
    BUSCAR2 VARCHAR(30),
    BUSCAR3 VARCHAR(30),
    BUSCAR4 VARCHAR(30),
    BUSCAR5 VARCHAR(30))
RETURNS (
    CODIGO VARCHAR(20),
    DES VARCHAR(60),
    REF VARCHAR(20),
    GRUPO VARCHAR(30),
    MARCA VARCHAR(30),
    UNIDAD VARCHAR(8),
    ESTADO VARCHAR(30),
    IVA NUMERIC(9,2),
    EXISTEN NUMERIC(18,2),
    PRECIO NUMERIC(18,2),
    CLASE CHAR(1))
AS
DECLARE VARIABLE LISTA INTEGER;
DECLARE VARIABLE EXIST CHAR(2);
DECLARE VARIABLE SINEXIST CHAR(2);
declare variable DIG INTEGER;
declare variable OK CHAR(1);
BEGIN
EXISTEN = 0;
EXECUTE PROCEDURE lee_configuracion ('FACTURACION','ARTICULOS', 'VER EXISTENCIA EN CONSULTA ARTICULOS') returning_values (:EXIST);
EXECUTE PROCEDURE lee_configuracion ('FACTURACION','FACTURAS', 'CODIGO DE LA LISTA DE PRECIOS A MOSTRAR EN ARTICULOS') returning_values (:LISTA);
if (modulo = 'FACTURACION') then
  EXECUTE PROCEDURE lee_configuracion ('FACTURACION','ARTICULOS','VER ARTICULOS SIN EXISTENCIA EN CONSULTA DE ARTICULOS') returning_values (:sinexist);
else
  sinexist = 'SI';
EXECUTE PROCEDURE LEE_CONFIGURACION ('FACTURACION', 'ARTICULOS', 'REDONDEO AL MULTIPLO DE DIEZ EN PRECIOS') returning_values (DIG);
if (LISTA > 0) then
    BEGIN
    if ((BUSCAR IS NOT NULL) AND (BUSCAR <> '')) then
        FOR select a.arti_cod, arti_des, grup_cod, arti_unidad, esar_cod, taiv_porc, marc_cod,arti_clase
            from articulo a, tarifa_iva t
            where a.taiv_cod = t.taiv_cod and substring(a.arti_cod from 1 FOR 2) <> '.t' and
            ((:INACTIVOS = 'S') or (esar_cod = 'A') or ((:INACTIVOS = 'C') AND (esar_cod = 'N'))) AND
            ((:COLUMNA <> 0) or (upper(A.ARTI_COD) like upper(:buscar))) AND
            ((:columna <> 1) or (upper(A.ARTI_DES) like upper(:buscar))) AND
            ((:columna <> 2) or (upper(A.ARTI_OBS) like upper(:buscar)) or (upper(A.ARTI_DES) like upper(:buscar)))
            INTO :CODIGO, :DES, :GRUPO, :UNIDAD, :ESTADO, :IVA, :MARCA, :CLASE
            do
            begin
            select first 1 coba_cod from barras_articulo where arti_cod = :codigo into :ref;
            if ((COLUMNA <> 3) or (upper(REF) like upper(:buscar))) then
                BEGIN
                OK = 'N';
                PRECIO = 0;
                SELECT prar_fijo PRECIO FROM precios_articulo WHERE arti_cod = :CODIGO and lipr_cod = :LISTA INTO :PRECIO;
                EXECUTE PROCEDURE redondee(PRECIO, DIG) returning_values (PRECIO);
                if (EXIST = 'SI') then
                    BEGIN
/*                    existen = 0;
                    SELECT FIRST 1 COST_SALDOC+COST_ENTC-COST_SALC
                        FROM COSTOS WHERE ARTI_COD = :codigo AND COST_FECHA <= :FECHA
                        ORDER BY COST_FECHA DESC,COST_ITEM DESC
                        INTO :existen;
                    if (existen is null) then
                        existen = 0;*/
                    EXECUTE PROCEDURE saldo_total_inventario (:CODIGO, :FECHA) returning_values (:EXISTEN);
                    if ((SINEXIST = 'SI')  or (existen <> 0)) then
                        OK = 'S';
                    END
                ELSE
                    OK = 'S';
                if (ok = 'S') then
                    if (CUALQUIERA = 'S') then
                        SUSPEND;
                    ELSE
                        if (BUSCAR2 <> '') then
                            BEGIN
                            IF (NOT EXISTS (SELECT ARTI_COD FROM ARTICULO WHERE ARTI_COD = :CODIGO AND ((upper(ARTI_DES) like upper(:BUSCAR2)) or (UPPER(ARTI_OBS) LIKE UPPER(:BUSCAR2))))) THEN
                                OK = 'N';
                            if ((OK = 'S') AND (BUSCAR3 <> '')) then
                                IF (NOT EXISTS (SELECT ARTI_COD FROM ARTICULO WHERE ARTI_COD = :CODIGO AND ((upper(ARTI_DES) like upper(:BUSCAR3)) or (UPPER(ARTI_OBS) LIKE UPPER(:BUSCAR3))))) THEN
                                    OK = 'N';
                            if ((OK = 'S') AND (BUSCAR4 <> '')) then
                                IF (NOT EXISTS (SELECT ARTI_COD FROM ARTICULO WHERE ARTI_COD = :CODIGO AND ((upper(ARTI_DES) like upper(:BUSCAR4)) or (UPPER(ARTI_OBS) LIKE UPPER(:BUSCAR4))))) THEN
                                    OK = 'N';
                            if ((OK = 'S') AND (BUSCAR4 <> '')) then
                                IF (NOT EXISTS (SELECT ARTI_COD FROM ARTICULO WHERE ARTI_COD = :CODIGO AND ((upper(ARTI_DES) like upper(:BUSCAR4)) or (UPPER(ARTI_OBS) LIKE UPPER(:BUSCAR4))))) THEN
                                    OK = 'N';
                            if ((OK = 'S') AND (BUSCAR5 <> '')) then
                                IF (NOT EXISTS (SELECT ARTI_COD FROM ARTICULO WHERE ARTI_COD = :CODIGO AND ((upper(ARTI_DES) like upper(:BUSCAR5)) or (UPPER(ARTI_OBS) LIKE UPPER(:BUSCAR5))))) THEN
                                    OK = 'N';
                            if (OK = 'S') then
                                SUSPEND;
                            END
                        ELSE
                            SUSPEND;
                END
            end
    ELSE
        FOR select a.arti_cod, arti_des, grup_cod, arti_unidad, esar_cod, taiv_porc, marc_cod,arti_clase
            from articulo a, tarifa_iva t
            where a.taiv_cod = t.taiv_cod and substring(a.arti_cod from 1 FOR 2) <> '.t' and
            ((:INACTIVOS = 'S') or (esar_cod = 'A') or ((:INACTIVOS = 'C') AND (esar_cod = 'N')))
            INTO :CODIGO, :DES, :GRUPO, :UNIDAD, :ESTADO, :IVA, :MARCA, :CLASE
            do
            begin
            select first 1 coba_cod from barras_articulo where arti_cod = :codigo into :ref;
            PRECIO = 0;
            SELECT prar_fijo PRECIO FROM precios_articulo WHERE arti_cod = :CODIGO and lipr_cod = :LISTA INTO :PRECIO;
            EXECUTE PROCEDURE redondee(PRECIO, DIG) returning_values (PRECIO);
            if (EXIST = 'SI') then
                BEGIN
/*                existen = 0;
                SELECT FIRST 1 COST_SALDOC+COST_ENTC-COST_SALC
                    FROM COSTOS WHERE ARTI_COD = :codigo AND COST_FECHA <= :FECHA
                    ORDER BY COST_FECHA DESC,COST_ITEM DESC
                    INTO :existen;
                if (existen is null) then
                    existen = 0;*/
                EXECUTE PROCEDURE saldo_total_inventario (:CODIGO, :FECHA) returning_values (:EXISTEN);
                if ((SINEXIST = 'SI')  or (existen <> 0)) then
                    SUSPEND;
                END
            ELSE
                SUSPEND;
            END
    END
ELSE
    if ((BUSCAR IS NOT NULL) AND (BUSCAR <> '')) then
        FOR select arti_cod, arti_des, grup_cod, arti_unidad, esar_cod, taiv_porc, arti_precio, marc_cod, arti_clase
            from articulo a, tarifa_iva t
            where a.taiv_cod = t.taiv_cod and substring(a.arti_cod from 1 FOR 2) <> '.t' and
            ((:INACTIVOS = 'S') or (esar_cod = 'A') or ((:INACTIVOS = 'C') AND (esar_cod = 'N'))) AND
            ((:COLUMNA <> 0) or (upper(A.ARTI_COD) like upper(:buscar))) AND
            ((:columna <> 1) or (upper(A.ARTI_DES) like upper(:buscar))) AND
            ((:columna <> 2) or (upper(A.ARTI_OBS) like upper(:buscar)) or (upper(A.ARTI_DES) like upper(:buscar)))
            INTO :CODIGO, :DES, :GRUPO, :UNIDAD, :ESTADO, :IVA, :PRECIO, :MARCA, :CLASE
            do
            begin
            select first 1 coba_cod from barras_articulo where arti_cod = :codigo into :ref;
            if ((COLUMNA <> 3) or (upper(REF) like upper(:buscar))) then
                BEGIN
                if (EXIST = 'SI') then
                    BEGIN
/*                    existen = 0;
                    SELECT FIRST 1 COST_SALDOC+COST_ENTC-COST_SALC
                        FROM COSTOS WHERE ARTI_COD = :codigo AND COST_FECHA <= :FECHA
                        ORDER BY COST_FECHA DESC,COST_ITEM DESC
                        INTO :existen;
                    if (existen is null) then
                        existen = 0;*/
                    EXECUTE PROCEDURE saldo_total_inventario (:CODIGO, :FECHA) returning_values (:EXISTEN);
                    if ((SINEXIST = 'SI') or (existen <> 0)) then
                        OK = 'S';
                    END
                ELSE
                    OK = 'S';
                if (ok = 'S') then
                    if (CUALQUIERA = 'S') then
                        SUSPEND;
                    ELSE
                        if (BUSCAR2 <> '') then
                            BEGIN
                            IF (NOT EXISTS (SELECT ARTI_COD FROM ARTICULO WHERE ARTI_COD = :CODIGO AND ((upper(ARTI_DES) like upper(:BUSCAR2)) or (UPPER(ARTI_OBS) LIKE UPPER(:BUSCAR2))))) THEN
                                OK = 'N';
                            if ((OK = 'S') AND (BUSCAR3 <> '')) then
                                IF (NOT EXISTS (SELECT ARTI_COD FROM ARTICULO WHERE ARTI_COD = :CODIGO AND ((upper(ARTI_DES) like upper(:BUSCAR3)) or (UPPER(ARTI_OBS) LIKE UPPER(:BUSCAR3))))) THEN
                                    OK = 'N';
                            if ((OK = 'S') AND (BUSCAR4 <> '')) then
                                IF (NOT EXISTS (SELECT ARTI_COD FROM ARTICULO WHERE ARTI_COD = :CODIGO AND ((upper(ARTI_DES) like upper(:BUSCAR4)) or (UPPER(ARTI_OBS) LIKE UPPER(:BUSCAR4))))) THEN
                                    OK = 'N';
                            if ((OK = 'S') AND (BUSCAR4 <> '')) then
                                IF (NOT EXISTS (SELECT ARTI_COD FROM ARTICULO WHERE ARTI_COD = :CODIGO AND ((upper(ARTI_DES) like upper(:BUSCAR4)) or (UPPER(ARTI_OBS) LIKE UPPER(:BUSCAR4))))) THEN
                                    OK = 'N';
                            if ((OK = 'S') AND (BUSCAR5 <> '')) then
                                IF (NOT EXISTS (SELECT ARTI_COD FROM ARTICULO WHERE ARTI_COD = :CODIGO AND ((upper(ARTI_DES) like upper(:BUSCAR5)) or (UPPER(ARTI_OBS) LIKE UPPER(:BUSCAR5))))) THEN
                                    OK = 'N';
                            if (OK = 'S') then
                                SUSPEND;
                            END
                        ELSE
                            SUSPEND;
                END
            end
    ELSE
        FOR select arti_cod, arti_des, grup_cod, arti_unidad, esar_cod, taiv_porc, arti_precio, marc_cod, arti_clase
            from articulo a, tarifa_iva t
            where a.taiv_cod = t.taiv_cod and substring(a.arti_cod from 1 FOR 2) <> '.t' and
            ((:INACTIVOS = 'S') or (esar_cod = 'A') or ((:INACTIVOS = 'C') AND (esar_cod = 'N')))
            INTO :CODIGO, :DES, :GRUPO, :UNIDAD, :ESTADO, :IVA, :PRECIO, :MARCA, :CLASE
            do
            begin
            select first 1 coba_cod from barras_articulo where arti_cod = :codigo into :ref;
            if (EXIST = 'SI') then
                BEGIN
/*                existen = 0;
                SELECT FIRST 1 COST_SALDOC+COST_ENTC-COST_SALC
                    FROM COSTOS WHERE ARTI_COD = :codigo AND COST_FECHA <= :FECHA
                    ORDER BY COST_FECHA DESC,COST_ITEM DESC
                    INTO :existen;
                if (existen is null) then
                    existen = 0;*/
                EXECUTE PROCEDURE saldo_total_inventario (:CODIGO, :FECHA) returning_values (:EXISTEN);
                if ((SINEXIST = 'SI') or (existen <> 0)) then
                    SUSPEND;
                END
            ELSE
                SUSPEND;
            end
END
^

SET TERM ; ^

/* 20090519 */
/* PARA AGREGAR UNA CUENTA QUE AJUSTE EL COMPROBANTE CONTABLE */

SET TERM ^ ;

CREATE or ALTER PROCEDURE CUADRE_COMPROBANTES_CONTABLES(
    FECINI CHAR(8),
    FECFIN CHAR(8),
    TIPOCOMP CHAR(3))
RETURNS (
    ID INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA CHAR(8),
    ITEM INTEGER,
    DIF NUMERIC(18,2))
AS
declare variable CTAADIC VARCHAR(20);
declare variable CONCEPTO VARCHAR(60);
begin
EXECUTE PROCEDURE lee_configuracion ('CONTABILIDAD','GENERAL','CUENTA PARA CUADRAR COMPROBANTES DESCUADRADOS DE INTERFAZ') returning_values (:ctaadic);
FOR SELECT ENCO_CONSEC, ENCO_FECHA, PRCO_PREF, ENCO_NUMERO FROM comprobante_encabezado
    WHERE ENCO_FECHA >= :FECINI AND ENCO_FECHA <= :FECFIN AND TICO_COD = :TIPOCOMP
    INTO :ID, :FECHA, :PREF, :NUMERO
    DO
    BEGIN
    SELECT MAX(CODE_ITEM), SUM(CODE_DEBITO-CODE_CREDITO), MIN(CODE_CONCEPTO)
        FROM comprobante_detalle WHERE ENCO_CONSEC = :ID
        INTO :ITEM, :DIF, :CONCEPTO;
    if (DIF <> 0) then
        begin
        ITEM = ITEM + 1;
        if (DIF > 0) then
            INSERT INTO comprobante_detalle (ENCO_CONSEC, CODE_ITEM, CUEN_COD, CODE_CONCEPTO, CODE_REFER, CODE_DEBITO, CODE_CREDITO, CODE_BASE, CODE_PORC, TERC_NIT, PROY_COD, CENT_COD, CNDE_DOCNUMERO, CNDE_DOCAPLICA, DOCO_VENCE, ARTI_COD, CODE_TIPOAPL, CODE_TIPONUE, CONC_COD)
                VALUES (:ID, :ITEM, :CTAADIC, :CONCEPTO, '', 0, :DIF, 0, 0, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0, 0, NULL);
        else
            INSERT INTO comprobante_detalle (ENCO_CONSEC, CODE_ITEM, CUEN_COD, CODE_CONCEPTO, CODE_REFER, CODE_DEBITO, CODE_CREDITO, CODE_BASE, CODE_PORC, TERC_NIT, PROY_COD, CENT_COD, CNDE_DOCNUMERO, CNDE_DOCAPLICA, DOCO_VENCE, ARTI_COD, CODE_TIPOAPL, CODE_TIPONUE, CONC_COD)
                VALUES (:ID, :ITEM, :CTAADIC, :CONCEPTO, '', abs(:DIF), 0, 0, 0, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0, 0, NULL);
        suspend;
        END
    END
end
^

SET TERM ; ^

/* 20090519B */
/* STRING TRUNCATION SI FACTOR UNIDAD ES CERO, ADEMAS TRUNCAR PUNTOS DE CLIENTE EN LUGAR DE REDONDEAR */

SET TERM ^ ;

CREATE OR ALTER PROCEDURE ACUMULA_PUNTOS_CLIENTE(
    TIPO INTEGER,
    IDDOC INTEGER,
    CLIENTE VARCHAR(20),
    FECHA DATE)
RETURNS (
    PUNTOS INTEGER)
AS
declare variable numrows integer;
declare variable fecaux date;
declare variable IDP INTEGER;
declare variable ok integer;
declare variable ACUMULA CHAR(10);
declare variable FACTOR INTEGER;
declare variable ARTICULO VARCHAR(15);
declare variable FACTORART INTEGER;
declare variable ptos INTEGER;
declare variable HORA TIME;
declare variable HORINI TIME;
declare variable HORFIN TIME;
begin
ok = 1;
execute procedure lee_configuracion('FACTURACION', 'FACTURAS', 'ACUMULAR PUNTOS POR VENTAS A CLIENTE REGULARES') returning_values (ACUMULA);
if (acumula = 'VENTA') then
    begin
    execute procedure lee_configuracion('FACTURACION', 'FACTURAS', 'FACTOR DE CONVERSION DE PUNTOS') returning_values (FACTOR);
    if (IDDOC <> 0) then
        begin
        if (tipo = 31) then
            begin
            select count(ptcl_id) from puntos_cliente where ptcl_nit = :cliente and ptcl_tipodoc = 31 and ptcl_iddoc = :iddoc into :numrows;
            if (numrows = 0) then
                begin
                PUNTOS = 0;
                /* recorra la factura acumulando los puntos */
                for select arti_cod, floor((fade_total-fade_ivamonto-fade_consumo)/:factor) from facturas_detalle
                    where fact_id = :iddoc and substring(arti_cod from 1 FOR 2) <> '.t' into :articulo, :ptos
                    do
                    begin
                    factorart = 1;
                    select ptar_factor from puntos_articulos where PTAR_COD = :articulo into :factorart;
                    PUNTOS = PUNTOS + (ptos * factorart);
                    end
                /* SI ES UN DIA ESPECIAL APLIQUE EL FACTOR */
                SELECT FACT_FECHA FROM FACTURAS WHERE FACT_ID = :iddoc INTO :fecaux;
                FOR SELECT PTDE_ID FROM puntos_diasespecial WHERE PTDE_FECINI <= :fecaux AND PTDE_FECFIN >= :fecaux INTO :idp
                    DO
                    BEGIN
                    SELECT PTDE_HORINI, PTDE_HORFIN, PTDE_FACTOR FROM puntos_diasespecial
                        WHERE PTDE_ID = :IDP INTO :HORINI, :HORFIN, :factorart;
                    SELECT AUDI_HORA FROM AUDITORIA WHERE TIDO_COD = 31 AND AUDI_IDDOC = :iddoc INTO HORA;
                    if ((horini <= HORA) AND (horfin >= HORA)) then
                        PUNTOS = PUNTOS * factorart;
                    END
                /* inserte el registro de puntos */
                insert into puntos_cliente (ptcl_nit, ptcl_fecha, ptcl_tipodoc, ptcl_iddoc, ptcl_db, ptcl_cr)
                    values (:cliente, :fecha,  31, :iddoc, :puntos, 0);
                end
            end
        if (tipo = 33) then
            begin
            select count(ptcl_id) from puntos_cliente where ptcl_nit = :cliente and ptcl_tipodoc = 33 and ptcl_iddoc = :iddoc into :numrows;
            if (numrows = 0) then
                begin
                PUNTOS = 0;
                /* recorra la DEVOLUCION acumulando los puntos */
                for select arti_cod, floor((dvde_total-dvde_ivamonto-dvde_consumo)/:factor) from devoluciones_ventas_detalle
                    where devt_id = :iddoc and substring(arti_cod from 1 FOR 2) <> '.t' into :articulo, :ptos
                    do
                    begin
                    factorart = 1;
                    select ptar_factor from puntos_articulos where PTAR_COD = :articulo into :factorart;
                    PUNTOS = PUNTOS + (ptos * factorart);
                    end
                /* SI ES UN DIA ESPECIAL APLIQUE EL FACTOR */
                SELECT DEVT_FECHA FROM devoluciones_ventas WHERE DEVT_ID = :iddoc INTO :fecaux;
                FOR SELECT PTDE_ID FROM puntos_diasespecial WHERE PTDE_FECINI <= :fecaux AND PTDE_FECFIN >= :fecaux INTO :idp
                    DO
                    BEGIN
                    SELECT PTDE_HORINI, PTDE_HORFIN, PTDE_FACTOR FROM puntos_diasespecial
                        WHERE PTDE_ID = :IDP INTO :HORINI, :HORFIN, :factorart;
                    SELECT AUDI_HORA FROM AUDITORIA WHERE TIDO_COD = 33 AND AUDI_IDDOC = :iddoc INTO HORA;
                    if ((horini <= HORA) AND (horfin >= HORA)) then
                        PUNTOS = PUNTOS * factorart;
                    END
                /* inserte el registro de puntos */
                insert into puntos_cliente (ptcl_nit, ptcl_fecha, ptcl_tipodoc, ptcl_iddoc, ptcl_db, ptcl_cr)
                    values (:cliente, :fecha,  33, :iddoc, 0, :puntos);
                end
            end

        suspend;
        end
    end
end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER PROCEDURE IMPR_FACTURA(
    ID INTEGER)
RETURNS (
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    VENCE DATE,
    DIASVENCE INTEGER,
    CONTCRED CHAR(17),
    NIT VARCHAR(20),
    NOMTERCERO VARCHAR(60),
    NOMCLIENTE VARCHAR(60),
    VENDEDOR INTEGER,
    NOMVENDEDOR VARCHAR(60),
    PUNTOVTA INTEGER,
    NOMPUNTOVTA VARCHAR(30),
    CODBODEGA VARCHAR(2),
    NOMBODEGA VARCHAR(30),
    AUTORIZACION VARCHAR(20),
    DESPACHO VARCHAR(255),
    TRANSPORTADOR VARCHAR(60),
    COTIZACION VARCHAR(30),
    PEDIDO VARCHAR(30),
    REMISION VARCHAR(30),
    PACIENTE VARCHAR(20),
    NOMPACIENTE VARCHAR(60),
    COMIPORC NUMERIC(9,2),
    COMIMONTO NUMERIC(18,2),
    SUBTOTAL NUMERIC(18,2),
    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),
    EXTRA NUMERIC(18,2),
    DTOFPORC NUMERIC(9,2),
    DTOFMONTO NUMERIC(18,2),
    FECHADTO DATE,
    TOTALFAC NUMERIC(18,2),
    TOTALPAGAR NUMERIC(18,2),
    OBS BLOB SUB_TYPE 1 SEGMENT SIZE 80,
    ITEM INTEGER,
    ARTICULO VARCHAR(15),
    CODBAR VARCHAR(15),
    ARTIDES VARCHAR(60),
    DESCORTA VARCHAR(30),
    CANT NUMERIC(18,4),
    LOTE VARCHAR(15),
    VLOTE DATE,
    UNIDAD VARCHAR(8),
    CAJAS NUMERIC(18,4),
    FACTOR NUMERIC(18,4),
    LISTAPR INTEGER,
    REFITEM VARCHAR(60),
    BODITEM VARCHAR(2),
    STAND VARCHAR(15),
    PRUNIT NUMERIC(18,2),
    DTOITPORC NUMERIC(9,2),
    DTOITMONTO NUMERIC(18,2),
    PRNETO NUMERIC(18,2),
    PRNETOSINIVA NUMERIC(18,2),
    DTOIT1 NUMERIC(9,2),
    DTOIT2 NUMERIC(9,2),
    DTOIT3 NUMERIC(9,2),
    IVAPORC NUMERIC(9,2),
    IVAITMONTO NUMERIC(18,2),
    CONSUMO NUMERIC(18,2),
    SUBTOTIT NUMERIC(18,2),
    TOTAL NUMERIC(18,2),
    CODIGOCL VARCHAR(20),
    ZONACOD VARCHAR(2),
    ZONANOM VARCHAR(60),
    DV CHAR(1),
    DIRECCION VARCHAR(60),
    CIUDAD VARCHAR(40),
    TELEFONO VARCHAR(40),
    CONTACTO VARCHAR(60),
    FAX VARCHAR(25),
    CEL VARCHAR(25),
    GRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    SUBGRUPO VARCHAR(3),
    NOMSUBG VARCHAR(30),
    MARCA VARCHAR(3),
    NOMMARCA VARCHAR(30),
    PESO NUMERIC(18,4),
    ANCHO NUMERIC(18,4),
    ALTO NUMERIC(18,4),
    LARGO NUMERIC(18,4),
    SUMA1 NUMERIC(18,2),
    SUMA2 NUMERIC(18,2),
    SUMA3 NUMERIC(18,2),
    IVA1 NUMERIC(18,2),
    IVA2 NUMERIC(18,2),
    IVA3 NUMERIC(18,2),
    SUMAEX NUMERIC(18,2),
    SUMAGR NUMERIC(18,2),
    TOTCONSUMO NUMERIC(18,2),
    DTOIT1M NUMERIC(18,2),
    DTOIT2M NUMERIC(18,2),
    DTOIT3M NUMERIC(18,2),
    TOTCAJAS NUMERIC(18,2),
    VEHICULO VARCHAR(8),
    RECIBIDO NUMERIC(18,2),
    CAMBIO NUMERIC(18,2),
    HORA TIME,
    FORMAPAGO1 VARCHAR(30),
    MONTOPAGO1 NUMERIC(18,2),
    FORMAPAGO2 VARCHAR(30),
    MONTOPAGO2 NUMERIC(18,2),
    FORMAPAGO3 VARCHAR(30),
    MONTOPAGO3 NUMERIC(18,2),
    PUNTOS INTEGER,
    PUNTOSACUM INTEGER,
    PUNTOSVENC INTEGER,
    FECPTOS DATE,
    OBSITEM BLOB SUB_TYPE 1 SEGMENT SIZE 80,
    SUCUR VARCHAR(10),
    ALTERNATIVAS NUMERIC(18,4),
    PRINCIPALES NUMERIC(18,4))
AS
DECLARE VARIABLE IMPTOS CHAR(1);
DECLARE VARIABLE TARIFA INTEGER;
declare variable DEVUELTO NUMERIC(18,2);
declare variable ORDENCOD CHAR(2);
declare variable IMPRDEV CHAR(2);
declare variable IMPR CHAR(1);
declare variable ITEMFP INTEGER;
declare variable FORMAP VARCHAR(30);
declare variable MONTOP NUMERIC(18,2);
declare variable ICOINC CHAR(2);
declare variable DTOITM1 NUMERIC(18,2);
declare variable DTOITM2 NUMERIC(18,2);
declare variable DTOITM3 NUMERIC(18,2);
declare variable DTOITE3 CHAR(2);
declare variable SUMDTOIT NUMERIC(18,2);
declare variable AUTORET VARCHAR(10);
declare variable FAUTORET DATE;
declare variable FACTCANT NUMERIC(18,4);
declare variable ANULADO CHAR(1);
BEGIN
execute procedure lee_configuracion('FACTURACION', 'ARTICULOS', 'IMPOCONSUMO INCLUIDO EN EL PRECIO BASE DE VENTA ANTES DE IVA') returning_values (icoinc);
execute procedure lee_configuracion('FACTURACION', 'FACTURAS', 'COLUMNAS DE DESCUENTO POR ITEM ADICIONALES') returning_values (DTOITE3);
SELECT F.PREF_PRE, FACT_NUMERO, FACT_FECHA, FACT_VENCE, F.BODE_COD, BODE_NOM, F.TERC_NIT, FACT_NOMCLIENTE, F.VEND_COD, VEND_NOMBRE, F.PTVT_ID, PTVT_NOM,
    AUTO_NUMERO, FACT_DESPACHO, FACT_TRANSP, FACT_COTIZACI, FACT_PEDIDO, FACT_REMISION, FACT_COMIPORC, FACT_COMIMONTO, FACT_IVAINC, 
    FACT_DTOPOR, FACT_DTOMONTO, FACT_ADICIONAL, FACT_IVAMONTO, FACT_RTFTEPOR, FACT_RTFTEMONTO, FACT_RTIVAPOR, FACT_RTIVAMONTO, FACT_RTICAPOR, FACT_RTICAMONTO, FACT_EXTRA, FACT_DTOFPOR, FACT_DTOFMONTO, FACT_DTOFFECHA, FACT_TOTAL,
    TERC_DIR, TERC_CIU, TERC_TEL, TERC_CONTACTO, TERC_FAX, TERC_DV, TERC_CEL, FACT_DTOIT1, FACT_DTOIT2, FACT_DTOIT3,
    FACT_OBS, VEHI_COD, /*FACT_NROCOPIA,*/ FACT_RECIBIDO, FACT_SUCURSAL, FACT_DETCLI, FACT_DETCLINOM, TERC_NOM, FACT_ANULADO
    FROM FACTURAS F, BODEGA B, VENDEDORES V, PUNTO_VENTA P, TERCEROS T
    WHERE F.BODE_COD = B.BODE_COD AND F.VEND_COD = V.VEND_COD AND F.PTVT_ID = P.PTVT_ID AND F.TERC_NIT = T.TERC_NIT AND F.FACT_ID = :ID
    into :PREF, :NUMERO, :FECHA, :VENCE, :CODBODEGA, :NOMBODEGA, :NIT, :NOMTERCERO, :VENDEDOR, :NOMVENDEDOR, :PUNTOVTA, :NOMPUNTOVTA,
    :AUTORIZACION, :DESPACHO, :TRANSPORTADOR, :COTIZACION, :PEDIDO, :REMISION, :COMIPORC, :COMIMONTO, :IMPTOS,
    :DTOPORC, :DTOMONTO, :ADICIONAL, :IVAMONTO, :RTEFTEPORC, :RTEFTEMONTO, :RTEIVAPORC, :RTEIVAMONTO, :RTEICAPORC, :RTEICAMONTO, :EXTRA, :DTOFPORC, :DTOFMONTO, :FECHADTO, :TOTALFAC,
    :DIRECCION, :CIUDAD, :TELEFONO, :CONTACTO, :FAX, :DV, :CEL, :dtoit1m, :dtoit2m, :dtoit3m,
    :OBS, :VEHICULO,/* :NROCOPIA,*/ :RECIBIDO, :SUCUR, :paciente, :nompaciente, :nomcliente, :ANULADO;

/* ACUMULE LOS PUNTOS, SE HACE ACA POR SER POSTERIOR AL DETALLE */
if (ANULADO = 'N') then
    EXECUTE PROCEDURE acumula_puntos_cliente (31, :id, :nit, :fecha) returning_values (:PUNTOS);
EXECUTE PROCEDURE consulta_puntos_cliente (:id, :nit, :fecha) returning_values (:puntos, :puntosacum, :puntosvenc, :fecptos);
if (DTOIT1M IS NULL) then
    DTOIT1M = 0;
if (DTOIT2M IS NULL) then
    DTOIT2M = 0;
if (DTOIT3M IS NULL) then
    DTOIT3M = 0;
SELECT CLIE_COD, C.ZONA_COD, ZONA_NOM
    FROM CLIENTES C, ZONAS Z
    WHERE TERC_NIT = :NIT AND C.ZONA_COD = Z.ZONA_COD
    INTO :CODIGOCL, :ZONACOD, :ZONANOM;
SELECT CLSU_DIR, CLSU_CIUDAD, CLSU_TEL FROM CLIENTE_SUCURSALES WHERE TERC_NIT = :NIT AND CLCU_COD = :SUCUR
    INTO :DIRECCION, :CIUDAD, :TELEFONO;
DIASVENCE = VENCE - FECHA;
if (DIASVENCE > 0) then
    CONTCRED = 'CREDITO ' || CAST(DIASVENCE AS VARCHAR(3)) || ' DIAS';
ELSE
    CONTCRED = 'CONTADO';
SUBTOTAL = TOTALFAC - EXTRA - IVAMONTO - ADICIONAL + DTOMONTO;
if (DTOITE3 = 'SI') then
    BEGIN
    SELECT SUM(FADE_DTOMONTO) FROM FACTURAS_DETALLE WHERE FACT_ID = :id INTO :sumdtoit;
    SUBTOTAL = SUBTOTAL + sumdtoit + dtoit1m + dtoit2m + dtoit3m;
    END
EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'FECHA AUTORETENEDOR NO DESCONTAR RETENCIONES DEL SALDO PERO SI CONTABILIZARLAS') returning_values (AUTORET);
if (AUTORET <> '') then
    FAUTORET = CAST(AUTORET AS DATE);
else
    FAUTORET = '9999/12/31';
if (FECHA > fautoret) then
    TOTALPAGAR = TOTALFAC - RTEIVAMONTO - RTEICAMONTO;
ELSE
    TOTALPAGAR = TOTALFAC - RTEFTEMONTO - RTEIVAMONTO - RTEICAMONTO;
if (RECIBIDO <> 0) then
    CAMBIO = RECIBIDO - totalpagar;
ELSE
    CAMBIO = 0;
SUMAEX = 0;
SUMA1 = 0;
SUMA2 = 0;
SUMA3 = 0;
IVA1 = 0;
IVA2 = 0;
IVA3 = 0;
TOTCONSUMO = 0;
MONTOPAGO1 = 0;
SELECT MAX(AUDI_HORA) FROM AUDITORIA WHERE TIDO_COD = 31 AND AUDI_IDDOC = :ID AND AUDI_OPER = 'I' INTO :HORA;
/* AHORA LAS FORMAS DE PAGO, BUSQUE EL ABONO DE HOY A LA FACTURA */
ITEMFP = 1;
MONTOPAGO1 = 0;
MONTOPAGO2 = 0;
MONTOPAGO3 = 0;
FOR SELECT FOPA_NOM, RCPA_MONTO FROM RECIBOS_CAJA_PAGO P, FORMAS_PAGO F, RECIBOS_CAJA R, RECIBOS_CAJA_DETALLE D
    WHERE R.RECA_ID = P.RECA_ID AND R.RECA_ID = D.RECA_ID AND P.FOPA_ID = F.FOPA_ID AND RECA_FECHA = :FECHA AND RCDE_TIPODOC = 31 AND RCDE_IDDOC = :ID
    INTO :formap, :MONTOP
    DO
    BEGIN
    if (ITEMFP = 1) then
        BEGIN
        FORMAPAGO1 = FORMAP;
        MONTOPAGO1 = MONTOP;
        END
    if (ITEMFP = 2) then
        BEGIN
        FORMAPAGO2 = FORMAP;
        MONTOPAGO2 = MONTOP;
        END
    if (ITEMFP = 3) then
        BEGIN
        FORMAPAGO3 = FORMAP;
        MONTOPAGO3 = MONTOP;
        END
    ITEMFP = ITEMFP + 1;
    END
EXECUTE PROCEDURE lee_configuracion ('FACTURACION','DOCUMENTOS','ORDENAR ITEMS POR CODIGO DE ARTICULO') returning_values (:ORDENCOD);
EXECUTE PROCEDURE lee_configuracion ('FACTURACION','POS', 'IMPRIMIR DEVOLUCIONES DE ARTICULOS NEGATIVOS') returning_values (:imprdev);
totcajas = 0;
if (ORDENCOD = 'SI') then
    BEGIN
    FOR SELECT FADE_ITEM, D.ARTI_COD, FADE_CODBAR, SUBSTR(FADE_DESC,1,60), ARTI_DESCORTA, FADE_CANT, FADE_UNIDAD, FADE_FACTOR, BODE_COD, FADE_LOTE, LIPR_COD, FADE_PRUNIT, FADE_DTOPORC, FADE_DTOMONTO, FADE_IVAPORC, FADE_IVAMONTO, FADE_CONSUMO, FADE_TOTAL, FADE_REFERENCIA,
        GRUP_COD, SUBG_COD, MARC_COD, ARTI_PESO, ARTI_ANCHO, ARTI_ALTO, ARTI_LARGO, TAIV_COD, FADE_DEVUELTO, FADE_OBS, FADE_DTO1, FADE_DTO2, FADE_DTO3, FADE_DTOM1, FADE_DTOM2, FADE_DTOM3, FADE_CAJAS
        FROM FACTURAS_DETALLE D, ARTICULO A
        WHERE D.ARTI_COD = A.ARTI_COD AND D.FACT_ID = :ID
        ORDER BY D.ARTI_COD
        INTO :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :DESCORTA, :CANT, :UNIDAD, :FACTOR, :BODITEM, :LOTE, :LISTAPR, :PRUNIT, :DTOITPORC, :DTOITMONTO, :IVAPORC, :IVAITMONTO, :CONSUMO, :TOTAL, :refitem,
        :GRUPO, :SUBGRUPO, :MARCA, :PESO, :ANCHO, :ALTO, :LARGO, :TARIFA, :devuelto, :obsitem, :dtoit1, :dtoit2, :dtoit3, :dtoitm1, :dtoitm2, :dtoitm3, :cajas
        DO
          BEGIN
          if (ARTICULO = CODBAR) then
            SELECT FIRST 1 COBA_COD FROM barras_articulo WHERE ARTI_COD = :articulo INTO :CODBAR;
          if (IMPRDEV <> 'SI') then
            BEGIN
            if ((CANT >= 0) AND (DEVUELTO = 0)) then
                IMPR = 'S';
            ELSE
                IMPR = 'N'; /* ES DEVOLUCION */
            END
          ELSE
            IMPR = 'S';
          if (IMPR = 'S') then
            BEGIN
            prneto = PRUNIT - DTOITMONTO - dtoitm1 - dtoitm2 - dtoitm3;
            if (IMPTOS = 'S') then
                if (cant <> 0) then
                    prnetosiniva = PRUNIT - DTOITMONTO - ((IVAITMONTO+CONSUMO) / CANT) - dtoitm1 - dtoitm2 - dtoitm3;
                else
                    prnetosiniva = PRUNIT - DTOITMONTO - dtoitm1 - dtoitm2 - dtoitm3;
            ELSE
                prnetosiniva = PRUNIT - DTOITMONTO - dtoit1m - dtoit2m - dtoit3m;
            if (ICOINC = 'SI') then
                SUBTOTIT = TOTAL - IVAITMONTO;
            else
                SUBTOTIT = TOTAL - IVAITMONTO - CONSUMO;
            TOTCONSUMO = TOTCONSUMO + CONSUMO;
            SELECT LOTE_VENCE FROM LOTES WHERE LOTE_NRO = :lote AND ARTI_COD = :ARTICULO AND BODE_COD = :boditem INTO :vlote;
            if ((REFITEM <> '.t') or (REFITEM IS NULL)) then
                BEGIN
                /* NO SUME LOS ENSAMBLES */
                if (IVAPORC = 0) then
                    SUMAEX = SUMAEX + TOTAL;
                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;
                END
            if (ANCHO IS NULL) then
                ANCHO = 0;
            if (ALTO IS NULL) then
                ALTO = 0;
            if (LARGO IS NULL) then
                LARGO = 0;
            if (PESO IS NULL) then
                PESO = 0;
            PESO = (PESO / 1000) * CANT * FACTOR;
            totcajas = totcajas + cajas;
            if (substr(ARTICULO,1,2) = '.t') then
                BEGIN
                REFITEM = '';
                TOTAL = 0;
                SUBTOTIT = 0;
                END
            SELECT STAND_COD FROM STANDS WHERE ARTI_COD = :ARTICULO AND STAND_BODEGA = :boditem INTO :stand;
            factcant = NULL;
            SELECT FIRST 1 UNAR_FACCAN FROM unidad_articulo WHERE ARTI_COD = :articulo INTO :factcant;
            if (factcant IS NULL) then
                factcant = 1;
            if ((factcant = 1) or (factcant = 0)) then
                BEGIN
                ALTERNATIVAS = 0;
                PRINCIPALES = (CANT * FACTOR);
                END
            ELSE
                BEGIN
                ALTERNATIVAS = FLOOR(CANT * factor / factcant);
                PRINCIPALES = (CANT * FACTOR) - (alternativas * factcant);
                END
            SUSPEND;
            END
          END
    END
ELSE
    BEGIN
    FOR SELECT FADE_ITEM, D.ARTI_COD, FADE_CODBAR, SUBSTR(FADE_DESC,1,60), ARTI_DESCORTA, FADE_CANT, FADE_UNIDAD, FADE_FACTOR, BODE_COD, FADE_LOTE, LIPR_COD, FADE_PRUNIT, FADE_DTOPORC, FADE_DTOMONTO, FADE_IVAPORC, FADE_IVAMONTO, FADE_CONSUMO, FADE_TOTAL, FADE_REFERENCIA,
        GRUP_COD, SUBG_COD, MARC_COD, ARTI_PESO, ARTI_ANCHO, ARTI_ALTO, ARTI_LARGO, TAIV_COD, FADE_DEVUELTO, FADE_OBS, FADE_DTO1, FADE_DTO2, FADE_DTO3, FADE_DTOM1, FADE_DTOM2, FADE_DTOM3, FADE_CAJAS
        FROM FACTURAS_DETALLE D, ARTICULO A
        WHERE D.ARTI_COD = A.ARTI_COD AND D.FACT_ID = :ID
        ORDER BY FADE_ITEM
        INTO :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :DESCORTA, :CANT, :UNIDAD, :FACTOR, :BODITEM, :LOTE, :LISTAPR, :PRUNIT, :DTOITPORC, :DTOITMONTO, :IVAPORC, :IVAITMONTO, :CONSUMO, :TOTAL, :refitem,
        :GRUPO, :SUBGRUPO, :MARCA, :PESO, :ANCHO, :ALTO, :LARGO, :TARIFA, :devuelto, :obsitem, :dtoit1, :dtoit2, :dtoit3, :dtoitm1, :dtoitm2, :dtoitm3, :cajas
        DO
          BEGIN
          if (IMPRDEV <> 'SI') then
            BEGIN
            if ((CANT >= 0) AND (DEVUELTO = 0)) then
                IMPR = 'S';
            ELSE
                IMPR = 'N'; /* ES DEVOLUCION */
            END
          ELSE
            IMPR = 'S';
          if (IMPR = 'S') then
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :GRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :MARCA INTO NOMMARCA;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :SUBGRUPO AND GRUP_COD = :GRUPO INTO :NOMSUBG;
            prneto = PRUNIT - DTOITMONTO - dtoitm1 - dtoitm2 - dtoitm3;
            if (IMPTOS = 'S') then
                if (cant <> 0) then
                    prnetosiniva = PRUNIT - DTOITMONTO - ((IVAITMONTO+CONSUMO) / CANT) - dtoit1m - dtoit2m - dtoit3m;
                else
                    prnetosiniva = PRUNIT - DTOITMONTO - dtoitm1 - dtoitm2 - dtoitm3;
            ELSE
                prnetosiniva = PRUNIT - DTOITMONTO - dtoitm1 - dtoitm2 - dtoitm3;
            if (ICOINC = 'SI') then
                SUBTOTIT = TOTAL - IVAITMONTO;
            else
                SUBTOTIT = TOTAL - IVAITMONTO - CONSUMO;
            TOTCONSUMO = TOTCONSUMO + CONSUMO;
            SELECT LOTE_VENCE FROM LOTES WHERE LOTE_NRO = :lote AND ARTI_COD = :ARTICULO AND BODE_COD = :boditem INTO :vlote;
            if ((REFITEM <> '.t') or (REFITEM IS NULL)) then
                BEGIN
                /* NO SUME LOS ENSAMBLES */
                if (IVAPORC = 0) then
                    SUMAEX = SUMAEX + TOTAL;
                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;
                END
            if (ANCHO IS NULL) then
                ANCHO = 0;
            if (ALTO IS NULL) then
                ALTO = 0;
            if (LARGO IS NULL) then
                LARGO = 0;
            if (PESO IS NULL) then
                PESO = 0;
            PESO = (PESO / 1000)* CANT * FACTOR;
            totcajas = totcajas + cajas;
            if (substr(ARTICULO,1,2) = '.t') then
                BEGIN
                REFITEM = '';
                TOTAL = 0;
                SUBTOTIT = 0;
                END
            SELECT STAND_COD FROM STANDS WHERE ARTI_COD = :ARTICULO AND STAND_BODEGA = :boditem INTO :stand;            factcant = NULL;
            SELECT FIRST 1 UNAR_FACCAN FROM unidad_articulo WHERE ARTI_COD = :articulo INTO :factcant;
            if (factcant IS NULL) then
                factcant = 1;
            if ((factcant = 1) or (factcant = 0)) then
                BEGIN
                ALTERNATIVAS = 0;
                PRINCIPALES = (CANT * FACTOR);
                END
            ELSE
                BEGIN
                ALTERNATIVAS = FLOOR(CANT * factor / factcant);
                PRINCIPALES = (CANT * FACTOR) - (alternativas * factcant);
                END
            SUSPEND;
            END
          END
    END
END
^

SET TERM ; ^


SET TERM ^ ;

CREATE OR ALTER PROCEDURE IMPR_COTIZACION(
    ID INTEGER)
RETURNS (
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    VALIDEZ INTEGER,
    NIT VARCHAR(20),
    NOMTERCERO VARCHAR(60),
    VENDEDOR INTEGER,
    NOMVENDEDOR VARCHAR(60),
    PUNTOVTA INTEGER,
    NOMPUNTOVTA VARCHAR(60),
    SUBTOTAL NUMERIC(18,2),
    DTOPORC NUMERIC(9,2),
    DTOMONTO NUMERIC(18,2),
    ADICIONAL NUMERIC(18,2),
    IVAMONTO NUMERIC(18,2),
    EXTRA NUMERIC(18,2),
    TOTALFAC NUMERIC(18,2),
    OBS BLOB SUB_TYPE 1 SEGMENT SIZE 80,
    ITEM INTEGER,
    ARTICULO VARCHAR(15),
    CODBAR VARCHAR(15),
    ARTIDES VARCHAR(60),
    CANT NUMERIC(18,4),
    UNIDAD VARCHAR(8),
    FACTOR NUMERIC(18,4),
    LISTAPR INTEGER,
    REFITEM VARCHAR(60),
    PRUNIT NUMERIC(18,2),
    DTOITPORC NUMERIC(9,2),
    DTOITMONTO NUMERIC(18,2),
    PRNETO NUMERIC(18,2),
    PRNETOSINIVA NUMERIC(18,2),
    IVAPORC NUMERIC(9,2),
    IVAITMONTO NUMERIC(18,2),
    CONSUMO NUMERIC(18,2),
    SUBTOTIT NUMERIC(18,2),
    TOTAL NUMERIC(18,2),
    CODIGOCL VARCHAR(20),
    ZONACOD VARCHAR(2),
    ZONANOM VARCHAR(60),
    DV CHAR(1),
    DIRECCION VARCHAR(60),
    CIUDAD VARCHAR(40),
    TELEFONO VARCHAR(40),
    CONTACTO VARCHAR(60),
    FAX VARCHAR(25),
    CEL VARCHAR(25),
    GRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    SUBGRUPO VARCHAR(3),
    NOMSUBG VARCHAR(30),
    MARCA VARCHAR(3),
    NOMMARCA VARCHAR(30),
    PESO NUMERIC(9,4),
    ANCHO NUMERIC(18,4),
    ALTO NUMERIC(18,4),
    LARGO NUMERIC(18,4),
    SUMA1 NUMERIC(18,2),
    SUMA2 NUMERIC(18,2),
    SUMA3 NUMERIC(18,2),
    IVA1 NUMERIC(18,2),
    IVA2 NUMERIC(18,2),
    IVA3 NUMERIC(18,2),
    SUMAEX NUMERIC(18,2),
    SUMAGR NUMERIC(18,2),
    OBSITEM BLOB SUB_TYPE 1 SEGMENT SIZE 80,
    ALTERNATIVAS NUMERIC(18,4),
    PRINCIPALES NUMERIC(18,4))
AS
DECLARE VARIABLE IMPTOS CHAR(1);
DECLARE VARIABLE TARIFA INTEGER;
declare variable ORDENCOD CHAR(2);
declare variable SUCUR VARCHAR(10);
declare variable ICOINC CHAR(2);
declare variable FACTCANT NUMERIC(18,4);
BEGIN
execute procedure lee_configuracion('FACTURACION', 'ARTICULOS', 'IMPOCONSUMO INCLUIDO EN EL PRECIO BASE DE VENTA ANTES DE IVA') returning_values (icoinc);
SELECT F.PREF_PRE, COTI_NUMERO, COTI_FECHA, COTI_VALIDEZ, F.TERC_NIT, COTI_NOMTERC, F.VEND_COD, VEND_NOMBRE, F.PTVT_ID, PTVT_NOM,
    COTI_IMPTOS, COTI_DTOPORC, COTI_DTOMONTO, COTI_ADICIONAL, COTI_IVAMONTO, COTI_EXTRA, COTI_TOTAL,
    TERC_CONTACTO, TERC_FAX, TERC_CEL, TERC_DV, COTI_OBS, COTI_SUCURSAL
    FROM COTIZACIONES F, VENDEDORES V, PUNTO_VENTA P, TERCEROS T
    WHERE F.VEND_COD = V.VEND_COD AND F.PTVT_ID = P.PTVT_ID AND F.TERC_NIT = T.TERC_NIT AND F.COTI_ID = :ID
    into :PREF, :NUMERO, :FECHA, :VALIDEZ, :NIT, :NOMTERCERO, :VENDEDOR, :NOMVENDEDOR, :PUNTOVTA, :NOMPUNTOVTA,
    :IMPTOS, :DTOPORC, :DTOMONTO, :ADICIONAL, :IVAMONTO, :EXTRA, :TOTALFAC,
    :CONTACTO, :FAX, :CEL, :DV, :OBS, :SUCUR;
SUBTOTAL = TOTALFAC - EXTRA - IVAMONTO - ADICIONAL + DTOMONTO;

SELECT CLIE_COD, C.ZONA_COD, ZONA_NOM
    FROM CLIENTES C, ZONAS Z
    WHERE TERC_NIT = :NIT AND C.ZONA_COD = Z.ZONA_COD
    INTO :CODIGOCL, :ZONACOD, :ZONANOM;
SELECT CLSU_DIR, CLSU_CIUDAD, CLSU_TEL FROM CLIENTE_SUCURSALES WHERE TERC_NIT = :NIT AND CLCU_COD = :SUCUR
    INTO :DIRECCION, :CIUDAD, :TELEFONO;
    
SUMAEX = 0;
SUMA1 = 0;
SUMA2 = 0;
SUMA3 = 0;
IVA1 = 0;
IVA2 = 0;
IVA3 = 0;
ITEM = 0;
EXECUTE PROCEDURE lee_configuracion ('FACTURACION','DOCUMENTOS','ORDENAR ITEMS POR CODIGO DE ARTICULO') returning_values (:ORDENCOD);
if (ORDENCOD = 'SI') then
    BEGIN
    FOR SELECT D.ARTI_COD, CTDE_CODBAR, SUBSTR(CTDE_DESC,1,60), CTDE_CANT, CTDE_UNIDAD, LIPR_COD, CTDE_PRUNIT, CTDE_DTOPORC, CTDE_DTOMONTO, CTDE_IVAPORC, CTDE_IVAMONTO, CTDE_CONSUMO, CTDE_TOTAL, CTDE_REFERENCIA,
        GRUP_COD, SUBG_COD, MARC_COD, ARTI_PESO, ARTI_ANCHO, ARTI_ALTO, ARTI_LARGO, TAIV_COD, CTDE_OBS, CTDE_FACTOR
        FROM COTIZACIONES_DETALLE D, ARTICULO A
        WHERE D.ARTI_COD = A.ARTI_COD AND D.COTI_ID = :ID
        ORDER BY CTDE_CODBAR
        INTO :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :LISTAPR, :PRUNIT, :DTOITPORC, :DTOITMONTO, :IVAPORC, :IVAITMONTO, :CONSUMO, :TOTAL, :refitem,
        :GRUPO, :SUBGRUPO, :MARCA, :PESO, :ANCHO, :ALTO, :LARGO, :TARIFA, :obsitem, :FACTOR
        DO
        BEGIN
        if (ICOINC = 'SI') then
            SUBTOTIT = TOTAL - IVAITMONTO;
        else
            SUBTOTIT = TOTAL - IVAITMONTO - CONSUMO;
        if (ARTICULO = CODBAR) then
            SELECT FIRST 1 COBA_COD FROM barras_articulo WHERE ARTI_COD = :articulo INTO :CODBAR;
        SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :GRUPO INTO NOMGRUPO;
        SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :MARCA INTO NOMMARCA;
        SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :SUBGRUPO AND GRUP_COD = :GRUPO INTO :NOMSUBG;
        ITEM = ITEM + 1;
        PRNETO = PRUNIT - DTOITMONTO;
        if (PESO IS NULL) then
            PESO = 0;
        PESO = PESO / 1000 * CANT * FACTOR;
        if (IMPTOS = 'S') then
            if (cant <> 0) then
                prnetosiniva = PRUNIT - DTOITMONTO - ((IVAITMONTO+CONSUMO) / CANT);
            else
                prnetosiniva = PRUNIT - DTOITMONTO;
        ELSE
            prnetosiniva = PRUNIT - DTOITMONTO;
        if (ivaporc = 0) then
            SUMAEX = SUMAEX + TOTAL;
        if (TARIFA = 1) then
            BEGIN
            SUMA1 = SUMA1 + TOTAL - IVAITMONTO;
            IVA1 = IVA1 + IVAITMONTO;
            END
        if (TARIFA = 2) then
            BEGIN
            SUMA2 = SUMA2 + TOTAL - IVAITMONTO;
            IVA2 = IVA2 + IVAITMONTO;
            END
        if (TARIFA = 3) then
            BEGIN
            SUMA3 = SUMA3 + TOTAL - IVAITMONTO;
            IVA3 = IVA3 + IVAITMONTO;
            END
        SUMAGR = SUMA1 + SUMA2 + SUMA3;
        if (IMPTOS = 'N') then
            TOTAL = TOTAL - IVAITMONTO;
        factcant = NULL;
        SELECT FIRST 1 UNAR_FACCAN FROM unidad_articulo WHERE ARTI_COD = :articulo INTO :factcant;
        if (factcant IS NULL) then
            factcant = 1;
        if ((factcant = 1) or (factcant = 0)) then
            BEGIN
            ALTERNATIVAS = 0;
            PRINCIPALES = (CANT * FACTOR);
            END
        ELSE
            BEGIN
            ALTERNATIVAS = FLOOR(CANT * factor / factcant);
            PRINCIPALES = (CANT * FACTOR) - (alternativas * factcant);
            END
        SUSPEND;
        END
    END
ELSE
    BEGIN
    FOR SELECT D.ARTI_COD, CTDE_CODBAR, SUBSTR(CTDE_DESC,1,60), CTDE_CANT, CTDE_UNIDAD, LIPR_COD, CTDE_PRUNIT, CTDE_DTOPORC, CTDE_DTOMONTO, CTDE_IVAPORC, CTDE_IVAMONTO, CTDE_CONSUMO, CTDE_TOTAL, CTDE_REFERENCIA,
        GRUP_COD, SUBG_COD, MARC_COD, ARTI_PESO, ARTI_ANCHO, ARTI_ALTO, ARTI_LARGO, TAIV_COD, CTDE_OBS, CTDE_FACTOR
        FROM COTIZACIONES_DETALLE D, ARTICULO A
        WHERE D.ARTI_COD = A.ARTI_COD AND D.COTI_ID = :ID
        ORDER BY CTDE_ITEM
        INTO :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :LISTAPR, :PRUNIT, :DTOITPORC, :DTOITMONTO, :IVAPORC, :IVAITMONTO, :CONSUMO, :TOTAL, :refitem,
        :GRUPO, :SUBGRUPO, :MARCA, :PESO, :ANCHO, :ALTO, :LARGO, :TARIFA, :obsitem, :FACTOR
        DO
        BEGIN
        SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :GRUPO INTO NOMGRUPO;
        SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :MARCA INTO NOMMARCA;
        SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :SUBGRUPO AND GRUP_COD = :GRUPO INTO :NOMSUBG;
        ITEM = ITEM + 1;
        if (ICOINC = 'SI') then
            SUBTOTIT = TOTAL - IVAITMONTO;
        else
            SUBTOTIT = TOTAL - IVAITMONTO - CONSUMO;
        PRNETO = PRUNIT - DTOITMONTO;
        if (PESO IS NULL) then
            PESO = 0;
        PESO = PESO / 1000 * CANT * FACTOR;
        if (IMPTOS = 'S') then
            if (cant <> 0) then
                prnetosiniva = PRUNIT - DTOITMONTO - ((IVAITMONTO+CONSUMO) / CANT);
            else
                prnetosiniva = PRUNIT - DTOITMONTO;
        ELSE
            prnetosiniva = PRUNIT - DTOITMONTO;
        if (ivaporc = 0) then
            SUMAEX = SUMAEX + TOTAL;
        if (TARIFA = 1) then
            BEGIN
            SUMA1 = SUMA1 + TOTAL - IVAITMONTO;
            IVA1 = IVA1 + IVAITMONTO;
            END
        if (TARIFA = 2) then
            BEGIN
            SUMA2 = SUMA2 + TOTAL - IVAITMONTO;
            IVA2 = IVA2 + IVAITMONTO;
            END
        if (TARIFA = 3) then
            BEGIN
            SUMA3 = SUMA3 + TOTAL - IVAITMONTO;
            IVA3 = IVA3 + IVAITMONTO;
            END
        SUMAGR = SUMA1 + SUMA2 + SUMA3;
        if (IMPTOS = 'N') then
            TOTAL = TOTAL - IVAITMONTO;
        factcant = NULL;
        SELECT FIRST 1 UNAR_FACCAN FROM unidad_articulo WHERE ARTI_COD = :articulo INTO :factcant;
        if (factcant IS NULL) then
            factcant = 1;
        if ((factcant = 1) or (factcant = 0)) then
            BEGIN
            ALTERNATIVAS = 0;
            PRINCIPALES = (CANT * FACTOR);
            END
        ELSE
            BEGIN
            ALTERNATIVAS = FLOOR(CANT * factor / factcant);
            PRINCIPALES = (CANT * FACTOR) - (alternativas * factcant);
            END
        SUSPEND;
        END
    END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER PROCEDURE IMPR_DEVOLUCION(
    ID INTEGER)
RETURNS (
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    NIT VARCHAR(20),
    NOMTERCERO VARCHAR(60),
    VENDEDOR INTEGER,
    NOMVENDEDOR VARCHAR(60),
    PUNTOVTA INTEGER,
    NOMPUNTOVTA VARCHAR(30),
    CODBODEGA VARCHAR(2),
    NOMBODEGA VARCHAR(30),
    FACTURA VARCHAR(30),
    REMISION VARCHAR(10),
    COMIPORC NUMERIC(9,2),
    COMIMONTO NUMERIC(18,2),
    SUBTOTAL NUMERIC(18,2),
    DTOPORC NUMERIC(9,2),
    DTOMONTO NUMERIC(18,2),
    ADICIONAL NUMERIC(18,2),
    IVAMONTO NUMERIC(18,2),
    RTEFTEPORC NUMERIC(9,2),
    RTEFTEMONTO NUMERIC(18,2),
    RTEIVAPORC NUMERIC(9,2),
    RTEIVAMONTO NUMERIC(18,2),
    RTEICAPORC NUMERIC(9,2),
    RTEICAMONTO NUMERIC(18,2),
    EXTRA NUMERIC(18,2),
    TOTALFAC NUMERIC(18,2),
    TOTALPAGAR NUMERIC(18,2),
    OBS BLOB SUB_TYPE 1 SEGMENT SIZE 80,
    ITEM INTEGER,
    ARTICULO VARCHAR(15),
    CODBAR VARCHAR(15),
    ARTIDES VARCHAR(60),
    CANT NUMERIC(18,4),
    LOTE VARCHAR(15),
    UNIDAD VARCHAR(8),
    FACTOR NUMERIC(18,4),
    REFITEM VARCHAR(60),
    BODITEM VARCHAR(2),
    PRUNIT NUMERIC(18,2),
    DTOITPORC NUMERIC(9,2),
    DTOITMONTO NUMERIC(18,2),
    PRNETO NUMERIC(18,2),
    PRNETOSINIVA NUMERIC(18,2),
    IVAPORC NUMERIC(9,2),
    IVAITMONTO NUMERIC(18,2),
    CONSUMO NUMERIC(18,2),
    SUBTOTIT NUMERIC(18,2),
    TOTAL NUMERIC(18,2),
    CODIGOCL VARCHAR(20),
    ZONACOD VARCHAR(2),
    ZONANOM VARCHAR(60),
    DV CHAR(1),
    DIRECCION VARCHAR(60),
    CIUDAD VARCHAR(40),
    TELEFONO VARCHAR(40),
    CONTACTO VARCHAR(60),
    FAX VARCHAR(25),
    CEL VARCHAR(25),
    GRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    SUBGRUPO VARCHAR(3),
    NOMSUBG VARCHAR(30),
    MARCA VARCHAR(3),
    NOMMARCA VARCHAR(30),
    PESO NUMERIC(9,4),
    ANCHO NUMERIC(18,4),
    ALTO NUMERIC(18,4),
    LARGO NUMERIC(18,4),
    SUMA1 NUMERIC(18,2),
    SUMA2 NUMERIC(18,2),
    SUMA3 NUMERIC(18,2),
    IVA1 NUMERIC(18,2),
    IVA2 NUMERIC(18,2),
    IVA3 NUMERIC(18,2),
    TOTCONSUMO NUMERIC(18,2),
    SUMAEX NUMERIC(18,2),
    SUMAGR NUMERIC(18,2),
    OBSITEM BLOB SUB_TYPE 1 SEGMENT SIZE 80,
    ALTERNATIVAS NUMERIC(18,4),
    PRINCIPALES NUMERIC(18,4))
AS
DECLARE VARIABLE IMPTOS CHAR(1);
DECLARE VARIABLE TARIFA INTEGER;
declare variable ORDENCOD CHAR(2);
declare variable SUCUR VARCHAR(10);
declare variable PUNTOS NUMERIC(18,4);
declare variable ICOINC CHAR(2);
declare variable FACTCANT NUMERIC(18,4);
declare variable ANULADO CHAR(1);
BEGIN
execute procedure lee_configuracion('FACTURACION', 'ARTICULOS', 'IMPOCONSUMO INCLUIDO EN EL PRECIO BASE DE VENTA ANTES DE IVA') returning_values (icoinc);
SELECT F.PREF_PRE, DEVT_NUMERO, DEVT_FECHA, F.BODE_COD, BODE_NOM, F.TERC_NIT, DEVT_NOMTERC, F.VEND_COD, VEND_NOMBRE, F.PTVT_ID, PTVT_NOM,
    DEVT_FACTURA, DEVT_COMIPORC, DEVT_COMIMONTO, DEVT_IVAINC,
    DEVT_DTOPOR, DEVT_DTOMONTO, DEVT_ADICIONAL, DEVT_IVAMONTO, DEVT_RTFTEPORC, DEVT_RTFTEMONTO, DEVT_RTIVAPORC, DEVT_RTIVAMONTO, DEVT_RTICAPORC, DEVT_RTICAMONTO, DEVT_EXTRA, DEVT_TOTAL,
    TERC_CONTACTO, TERC_FAX, TERC_DV, TERC_CEL, DEVT_OBS, DEVT_SUCURSAL, DEVT_REMISION, DEVT_ANULADO
    FROM DEVOLUCIONES_VENTAS F, BODEGA B, VENDEDORES V, PUNTO_VENTA P, TERCEROS T
    WHERE F.BODE_COD = B.BODE_COD AND F.VEND_COD = V.VEND_COD AND F.PTVT_ID = P.PTVT_ID AND F.TERC_NIT = T.TERC_NIT AND F.DEVT_ID = :ID
    into :PREF, :NUMERO, :FECHA, :CODBODEGA, :NOMBODEGA, :NIT, :NOMTERCERO, :VENDEDOR, :NOMVENDEDOR, :PUNTOVTA, :NOMPUNTOVTA,
    :FACTURA, :COMIPORC, :COMIMONTO, :IMPTOS,
    :DTOPORC, :DTOMONTO, :ADICIONAL, :IVAMONTO, :RTEFTEPORC, :RTEFTEMONTO, :RTEIVAPORC, :RTEIVAMONTO, :RTEICAPORC, :RTEICAMONTO, :EXTRA, :TOTALFAC,
    :CONTACTO, :FAX, :DV, :CEL, :OBS, :SUCUR, :REMISION, :ANULADO;
SUBTOTAL = TOTALFAC - EXTRA - IVAMONTO - ADICIONAL + DTOMONTO;
TOTALPAGAR = TOTALFAC - RTEFTEMONTO - RTEIVAMONTO - RTEICAMONTO;
if (ANULADO = 'N') then
    EXECUTE PROCEDURE acumula_puntos_cliente (33, :id, :nit, :fecha) returning_values (:PUNTOS);
SELECT CLIE_COD, C.ZONA_COD, ZONA_NOM
    FROM CLIENTES C, ZONAS Z
    WHERE TERC_NIT = :NIT AND C.ZONA_COD = Z.ZONA_COD
    INTO :CODIGOCL, :ZONACOD, :ZONANOM;
SELECT CLSU_DIR, CLSU_CIUDAD, CLSU_TEL FROM CLIENTE_SUCURSALES WHERE TERC_NIT = :NIT AND CLCU_COD = :SUCUR
    INTO :DIRECCION, :CIUDAD, :TELEFONO;
    
SUMAEX = 0;
SUMA1 = 0;
SUMA2 = 0;
SUMA3 = 0;
IVA1 = 0;
IVA2 = 0;
IVA3 = 0;
TOTCONSUMO = 0;
ITEM = 0;
EXECUTE PROCEDURE lee_configuracion ('FACTURACION','DOCUMENTOS','ORDENAR ITEMS POR CODIGO DE ARTICULO') returning_values (:ORDENCOD);
if (ORDENCOD = 'SI') then
    BEGIN
    FOR SELECT D.ARTI_COD, DVDE_CODBAR, SUBSTR(DVDE_DESC,1,60), DVDE_CANT, DVDE_UNIDAD, BODE_COD, DVDE_LOTE, DVDE_PRUNIT, DVDE_DTOPORC, DVDE_DTOMONTO, DVDE_IVAPORC, DVDE_IVAMONTO, DVDE_CONSUMO, DVDE_TOTAL, DVDE_REFERENCIA,
        GRUP_COD, SUBG_COD, MARC_COD, ARTI_PESO, ARTI_ANCHO, ARTI_ALTO, ARTI_LARGO, TAIV_COD, DVDE_OBS, DVDE_FACTOR
        FROM DEVOLUCIONES_VENTAS_DETALLE D, ARTICULO A
        WHERE D.ARTI_COD = A.ARTI_COD AND D.DEVT_ID = :ID
        ORDER BY DVDE_CODBAR
        INTO :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :BODITEM, :LOTE, :PRUNIT, :DTOITPORC, :DTOITMONTO, :IVAPORC, :IVAITMONTO, :CONSUMO, :TOTAL, :REFITEM,
        :GRUPO, :SUBGRUPO, :MARCA, :PESO, :ANCHO, :ALTO, :LARGO, :TARIFA, :obsitem, :FACTOR
        DO
        BEGIN
        if (ARTICULO = CODBAR) then
            SELECT FIRST 1 COBA_COD FROM barras_articulo WHERE ARTI_COD = :articulo INTO :CODBAR;
        ITEM = ITEM + 1;
        if (ICOINC = 'SI') then
            SUBTOTIT = TOTAL - IVAITMONTO;
        else
            SUBTOTIT = TOTAL - IVAITMONTO - CONSUMO;
        PRNETO = PRUNIT - DTOITMONTO;
        if (PESO IS NULL) then
            PESO = 0;
        PESO = PESO / 1000 * CANT * FACTOR;
        if (IMPTOS = 'S') then
            if (cant <> 0) then
                prnetosiniva = PRUNIT - DTOITMONTO - ((IVAITMONTO+CONSUMO) / CANT);
            else
                prnetosiniva = PRUNIT - DTOITMONTO;
        ELSE
            prnetosiniva = PRUNIT - DTOITMONTO;
        TOTCONSUMO = TOTCONSUMO + CONSUMO;
        if ((REFITEM <> '.t') or (REFITEM IS NULL)) then
            BEGIN
            /* NO SUME LOS ENSAMBLES */
            if (IVAPORC = 0) then
                SUMAEX = SUMAEX + TOTAL;
            if (TARIFA = 1) then
                BEGIN
                SUMA1 = SUMA1 + TOTAL - IVAITMONTO;
                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;
            END
        if (substr(ARTICULO,1,2) = '.t') then
            BEGIN
            REFITEM = '';
            TOTAL = 0;
            END
        factcant = NULL;
        SELECT FIRST 1 UNAR_FACCAN FROM unidad_articulo WHERE ARTI_COD = :articulo INTO :factcant;
        if (factcant IS NULL) then
            factcant = 1;
        if ((factcant = 1) or (factcant = 0)) then
            BEGIN
            ALTERNATIVAS = 0;
            PRINCIPALES = (CANT * FACTOR);
            END
        ELSE
            BEGIN
            ALTERNATIVAS = FLOOR(CANT * factor / factcant);
            PRINCIPALES = (CANT * FACTOR) - (alternativas * factcant);
            END
        SUSPEND;
        END
    END
ELSE
    BEGIN
    FOR SELECT D.ARTI_COD, DVDE_CODBAR, SUBSTR(DVDE_DESC,1,60), DVDE_CANT, DVDE_UNIDAD, BODE_COD, DVDE_LOTE, DVDE_PRUNIT, DVDE_DTOPORC, DVDE_DTOMONTO, DVDE_IVAPORC, DVDE_IVAMONTO, DVDE_CONSUMO, DVDE_TOTAL, DVDE_REFERENCIA,
        GRUP_COD, SUBG_COD, MARC_COD, ARTI_PESO, ARTI_ANCHO, ARTI_ALTO, ARTI_LARGO, TAIV_COD, DVDE_OBS, DVDE_FACTOR
        FROM DEVOLUCIONES_VENTAS_DETALLE D, ARTICULO A
        WHERE D.ARTI_COD = A.ARTI_COD AND D.DEVT_ID = :ID
        ORDER BY DVDE_ITEM
        INTO :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :BODITEM, :LOTE, :PRUNIT, :DTOITPORC, :DTOITMONTO, :IVAPORC, :IVAITMONTO, :CONSUMO, :TOTAL, :REFITEM,
        :GRUPO, :SUBGRUPO, :MARCA, :PESO, :ANCHO, :ALTO, :LARGO, :TARIFA, :obsitem, :FACTOR
        DO
        BEGIN
        if (ARTICULO = CODBAR) then
            SELECT FIRST 1 COBA_COD FROM barras_articulo WHERE ARTI_COD = :articulo INTO :CODBAR;
        SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :GRUPO INTO NOMGRUPO;
        SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :MARCA INTO NOMMARCA;
        SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :SUBGRUPO AND GRUP_COD = :GRUPO INTO :NOMSUBG;
        ITEM = ITEM + 1;
        if (ICOINC = 'SI') then
            SUBTOTIT = TOTAL - IVAITMONTO;
        else
            SUBTOTIT = TOTAL - IVAITMONTO - CONSUMO;
        PRNETO = PRUNIT - DTOITMONTO;
        if (PESO IS NULL) then
            PESO = 0;
        PESO = PESO / 1000 * CANT * FACTOR;
        if (IMPTOS = 'S') then
            if (cant <> 0) then
                prnetosiniva = PRUNIT - DTOITMONTO - ((IVAITMONTO+CONSUMO) / CANT);
            else
                prnetosiniva = PRUNIT - DTOITMONTO;
        ELSE
            prnetosiniva = PRUNIT - DTOITMONTO;
        TOTCONSUMO = TOTCONSUMO + CONSUMO;
        if ((REFITEM <> '.t') or (REFITEM IS NULL)) then
            BEGIN
            /* NO SUME LOS ENSAMBLES */
            if (IVAPORC = 0) then
                SUMAEX = SUMAEX + TOTAL;
            if (TARIFA = 1) then
                BEGIN
                SUMA1 = SUMA1 + TOTAL - IVAITMONTO;
                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;
            END
        if (substr(ARTICULO,1,2) = '.t') then
            BEGIN
            REFITEM = '';
            TOTAL = 0;
            END
        factcant = NULL;
        SELECT FIRST 1 UNAR_FACCAN FROM unidad_articulo WHERE ARTI_COD = :articulo INTO :factcant;
        if (factcant IS NULL) then
            factcant = 1;
        if ((factcant = 1) or (factcant = 0)) then
            BEGIN
            ALTERNATIVAS = 0;
            PRINCIPALES = (CANT * FACTOR);
            END
        ELSE
            BEGIN
            ALTERNATIVAS = FLOOR(CANT * factor / factcant);
            PRINCIPALES = (CANT * FACTOR) - (alternativas * factcant);
            END
        SUSPEND;
        END
    END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER PROCEDURE IMPR_REMISION(
    ID INTEGER)
RETURNS (
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    NIT VARCHAR(20),
    NOMTERCERO VARCHAR(60),
    VENDEDOR INTEGER,
    NOMVENDEDOR VARCHAR(60),
    PUNTOVTA INTEGER,
    NOMPUNTOVTA VARCHAR(30),
    CODBODEGA VARCHAR(2),
    NOMBODEGA VARCHAR(30),
    COTIZACION VARCHAR(30),
    PEDIDO VARCHAR(30),
    FACTURA VARCHAR(30),
    SUBTOTAL NUMERIC(18,2),
    IVAMONTO NUMERIC(18,2),
    TOTALFAC NUMERIC(18,2),
    DESPACHO VARCHAR(255),
    TRANSPORTADOR VARCHAR(60),
    OBS BLOB SUB_TYPE 1 SEGMENT SIZE 80,
    ITEM INTEGER,
    ARTICULO VARCHAR(15),
    CODBAR VARCHAR(15),
    ARTIDES VARCHAR(60),
    CANT NUMERIC(18,4),
    LOTE VARCHAR(15),
    VLOTE DATE,
    UNIDAD VARCHAR(8),
    FACTOR NUMERIC(18,4),
    CAJAS NUMERIC(18,4),
    DEVUELTO NUMERIC(18,4),
    CONSUMIDO NUMERIC(18,4),
    LISTAPR INTEGER,
    REFITEM VARCHAR(60),
    BODITEM VARCHAR(2),
    STAND VARCHAR(15),
    PRUNIT NUMERIC(18,2),
    DTOITPORC NUMERIC(9,2),
    DTOITMONTO NUMERIC(18,2),
    PRNETOSINIVA NUMERIC(18,2),
    PRNETO NUMERIC(18,2),
    IVAPORC NUMERIC(9,2),
    IVAITMONTO NUMERIC(18,2),
    CONSUMO NUMERIC(18,2),
    SUBTOTIT NUMERIC(18,2),
    TOTAL NUMERIC(18,2),
    CODIGOCL VARCHAR(20),
    ZONACOD VARCHAR(2),
    ZONANOM VARCHAR(60),
    DV CHAR(1),
    DIRECCION VARCHAR(60),
    CIUDAD VARCHAR(40),
    TELEFONO VARCHAR(40),
    CONTACTO VARCHAR(60),
    FAX VARCHAR(25),
    CEL VARCHAR(25),
    GRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    SUBGRUPO VARCHAR(3),
    NOMSUBG VARCHAR(30),
    MARCA VARCHAR(3),
    NOMMARCA VARCHAR(30),
    PESO NUMERIC(9,4),
    ANCHO NUMERIC(18,4),
    ALTO NUMERIC(18,4),
    LARGO NUMERIC(18,4),
    SUMA1 NUMERIC(18,2),
    SUMA2 NUMERIC(18,2),
    SUMA3 NUMERIC(18,2),
    IVA1 NUMERIC(18,2),
    IVA2 NUMERIC(18,2),
    IVA3 NUMERIC(18,2),
    SUMAEX NUMERIC(18,2),
    SUMAGR NUMERIC(18,2),
    TOTCAJAS NUMERIC(18,2),
    OBSITEM BLOB SUB_TYPE 1 SEGMENT SIZE 80,
    ALTERNATIVAS NUMERIC(18,4),
    PRINCIPALES NUMERIC(18,4))
AS
DECLARE VARIABLE IMPTOS CHAR(1);
DECLARE VARIABLE TARIFA INTEGER;
declare variable ORDENCOD CHAR(2);
declare variable SUCUR VARCHAR(10);
declare variable ICOINC CHAR(2);
declare variable FACTCANT NUMERIC(18,4);
BEGIN
execute procedure lee_configuracion('FACTURACION', 'ARTICULOS', 'IMPOCONSUMO INCLUIDO EN EL PRECIO BASE DE VENTA ANTES DE IVA') returning_values (icoinc);
EXECUTE PROCEDURE lee_configuracion ('FACTURACION','DOCUMENTOS','ORDENAR ITEMS POR CODIGO DE ARTICULO') returning_values (:ORDENCOD);
SELECT F.PREF_PRE, REVT_NUMERO, REVT_FECHA, F.BODE_COD, BODE_NOM, F.TERC_NIT, REVT_NOMTERC, F.VEND_COD, VEND_NOMBRE, F.PTVT_ID, PTVT_NOM,
    REVT_COTIZACI, REVT_PEDIDO, REVT_FACTURA, REVT_IVAINC,
    REVT_IVAMONTO, REVT_TOTAL, REVT_DESPACHO, REVT_TRANSP,
    TERC_CONTACTO, TERC_FAX, TERC_DV, TERC_CEL, REVT_OBS, REVT_SUCURSAL
    FROM REMISIONES_VENTA F, BODEGA B, VENDEDORES V, PUNTO_VENTA P, TERCEROS T
    WHERE F.BODE_COD = B.BODE_COD AND F.VEND_COD = V.VEND_COD AND F.PTVT_ID = P.PTVT_ID AND F.TERC_NIT = T.TERC_NIT AND F.REVT_ID = :ID
    into :PREF, :NUMERO, :FECHA, :CODBODEGA, :NOMBODEGA, :NIT, :NOMTERCERO, :VENDEDOR, :NOMVENDEDOR, :PUNTOVTA, :NOMPUNTOVTA,
    :COTIZACION, :PEDIDO, :FACTURA, :IMPTOS,
    :IVAMONTO, :TOTALFAC, :DESPACHO, :transportador, 
    :CONTACTO, :FAX, :DV, :CEL, :OBS, :SUCUR;
SUBTOTAL = TOTALFAC - IVAMONTO;

SELECT CLIE_COD, C.ZONA_COD, ZONA_NOM
    FROM CLIENTES C, ZONAS Z
    WHERE TERC_NIT = :NIT AND C.ZONA_COD = Z.ZONA_COD
    INTO :CODIGOCL, :ZONACOD, :ZONANOM;
SELECT CLSU_DIR, CLSU_CIUDAD, CLSU_TEL FROM CLIENTE_SUCURSALES WHERE TERC_NIT = :NIT AND CLCU_COD = :SUCUR
    INTO :DIRECCION, :CIUDAD, :TELEFONO;
    
SUMAEX = 0;
SUMA1 = 0;
SUMA2 = 0;
SUMA3 = 0;
IVA1 = 0;
IVA2 = 0;
IVA3 = 0;
ITEM = 0;
totcajas = 0;
if (ORDENCOD = 'SI') then
    BEGIN
    FOR SELECT D.ARTI_COD, RVDE_CODBAR, SUBSTR(RVDE_DESC,1,60), RVDE_CANT, RVDE_UNIDAD, BODE_COD, RVDE_LOTE, LIPR_COD, RVDE_PRUNIT, RVDE_DTOPORC, RVDE_DTOMONTO, RVDE_IVAPORC, RVDE_IVAMONTO, RVDE_CONSUMO, RVDE_TOTAL, RVDE_REFERENCIA,
        GRUP_COD, SUBG_COD, MARC_COD, ARTI_PESO, ARTI_ANCHO, ARTI_ALTO, ARTI_LARGO, TAIV_COD, RVDE_DEVUELTO, RVDE_OBS, RVDE_CAJAS, RVDE_FACTOR
        FROM REMISIONES_VENTA_DETALLE D, ARTICULO A
        WHERE D.ARTI_COD = A.ARTI_COD AND D.REVT_ID = :ID
        ORDER BY RVDE_CODBAR
        INTO :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :BODITEM, :LOTE, :LISTAPR, :PRUNIT, :DTOITPORC, :DTOITMONTO, :IVAPORC, :IVAITMONTO, :CONSUMO, :TOTAL, :refitem,
            :GRUPO, :SUBGRUPO, :MARCA, :PESO, :ANCHO, :ALTO, :LARGO, :TARIFA, :DEVUELTO, :obsitem, :CAJAS, :FACTOR
        DO
        BEGIN
        if (ARTICULO = CODBAR) then
            SELECT FIRST 1 COBA_COD FROM barras_articulo WHERE ARTI_COD = :articulo INTO :CODBAR;
        SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :GRUPO INTO NOMGRUPO;
        SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :MARCA INTO NOMMARCA;
        SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :SUBGRUPO AND GRUP_COD = :GRUPO INTO :NOMSUBG;
        SELECT LOTE_VENCE FROM LOTES WHERE LOTE_NRO = :lote AND ARTI_COD = :ARTICULO AND BODE_COD = :boditem INTO :vlote;
        if (ICOINC = 'SI') then
            SUBTOTIT = TOTAL - IVAITMONTO;
        else
            SUBTOTIT = TOTAL - IVAITMONTO - CONSUMO;
        CONSUMIDO = cant * factor - devuelto;
        ITEM = ITEM + 1;
        PRNETO = PRUNIT - DTOITMONTO;
        if (PESO IS NULL) then
            PESO = 0;
        PESO = PESO / 1000 * CANT * FACTOR;
        if (IMPTOS = 'S') then
            if (cant <> 0) then
                prnetosiniva = PRUNIT - DTOITMONTO - ((IVAITMONTO+CONSUMO) / CANT);
            else
                prnetosiniva = PRUNIT - DTOITMONTO;
        ELSE
            prnetosiniva = PRUNIT - DTOITMONTO;
        if (IVAPORC = 0) then
            SUMAEX = SUMAEX + TOTAL;
        if (TARIFA = 1) then
            BEGIN
            SUMA1 = SUMA1 + TOTAL - IVAITMONTO;
            IVA1 = IVA1 + IVAITMONTO;
            END
        if (TARIFA = 2) then
            BEGIN
            SUMA2 = SUMA2 + TOTAL - IVAITMONTO;
            IVA2 = IVA2 + IVAITMONTO;
            END
        if (TARIFA = 3) then
            BEGIN
            SUMA3 = SUMA3 + TOTAL - IVAITMONTO;
            IVA3 = IVA3 + IVAITMONTO;
            END
        SUMAGR = SUMA1 + SUMA2 + SUMA3;

        totcajas = totcajas + cajas;
        SELECT STAND_COD FROM STANDS WHERE ARTI_COD = :ARTICULO AND STAND_BODEGA = :boditem INTO :stand;
        factcant = NULL;
        SELECT FIRST 1 UNAR_FACCAN FROM unidad_articulo WHERE ARTI_COD = :articulo INTO :factcant;
        if (factcant IS NULL) then
            factcant = 1;
        if ((factcant = 1) or (factcant = 0)) then
            BEGIN
            ALTERNATIVAS = 0;
            PRINCIPALES = (CANT * FACTOR);
            END
        ELSE
            BEGIN
            ALTERNATIVAS = FLOOR(CANT * factor / factcant);
            PRINCIPALES = (CANT * FACTOR) - (alternativas * factcant);
            END
        SUSPEND;
        END
    END
ELSE
    BEGIN
    FOR SELECT RVDE_ITEM, D.ARTI_COD, RVDE_CODBAR, SUBSTR(RVDE_DESC,1,60), RVDE_CANT, RVDE_UNIDAD, BODE_COD, RVDE_LOTE, LIPR_COD, RVDE_PRUNIT, RVDE_DTOPORC, RVDE_DTOMONTO, RVDE_IVAPORC, RVDE_IVAMONTO, RVDE_CONSUMO, RVDE_TOTAL, RVDE_REFERENCIA,
        GRUP_COD, SUBG_COD, MARC_COD, ARTI_PESO, ARTI_ANCHO, ARTI_ALTO, ARTI_LARGO, TAIV_COD, RVDE_DEVUELTO, RVDE_OBS, RVDE_CAJAS, RVDE_FACTOR
        FROM REMISIONES_VENTA_DETALLE D, ARTICULO A
        WHERE D.ARTI_COD = A.ARTI_COD AND D.REVT_ID = :ID
        ORDER BY RVDE_ITEM
        INTO :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :BODITEM, :LOTE, :LISTAPR, :PRUNIT, :DTOITPORC, :DTOITMONTO, :IVAPORC, :IVAITMONTO, :CONSUMO, :TOTAL, :refitem,
            :GRUPO, :SUBGRUPO, :MARCA, :PESO, :ANCHO, :ALTO, :LARGO, :TARIFA, :DEVUELTO, :obsitem, :CAJAS, :FACTOR
        DO
        BEGIN
        SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :GRUPO INTO NOMGRUPO;
        SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :MARCA INTO NOMMARCA;
        SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :SUBGRUPO AND GRUP_COD = :GRUPO INTO :NOMSUBG;
        SELECT LOTE_VENCE FROM LOTES WHERE LOTE_NRO = :lote AND ARTI_COD = :ARTICULO AND BODE_COD = :boditem INTO :vlote;
        if (ICOINC = 'SI') then
            SUBTOTIT = TOTAL - IVAITMONTO;
        else
            SUBTOTIT = TOTAL - IVAITMONTO - CONSUMO;
        CONSUMIDO = cant * factor - devuelto;
        ITEM = ITEM + 1;
        PRNETO = PRUNIT - DTOITMONTO;
        if (PESO IS NULL) then
            PESO = 0;
        PESO = PESO / 1000 * CANT * FACTOR;
        if (IMPTOS = 'S') then
            if (cant <> 0) then
                prnetosiniva = PRUNIT - DTOITMONTO - ((IVAITMONTO+CONSUMO) / CANT);
            else
                prnetosiniva = PRUNIT - DTOITMONTO;
        ELSE
            prnetosiniva = PRUNIT - DTOITMONTO;
        if (IVAPORC = 0) then
            SUMAEX = SUMAEX + TOTAL;
        if (TARIFA = 1) then
            BEGIN
            SUMA1 = SUMA1 + TOTAL - IVAITMONTO;
            IVA1 = IVA1 + IVAITMONTO;
            END
        if (TARIFA = 2) then
            BEGIN
            SUMA2 = SUMA2 + TOTAL - IVAITMONTO;
            IVA2 = IVA2 + IVAITMONTO;
            END
        if (TARIFA = 3) then
            BEGIN
            SUMA3 = SUMA3 + TOTAL - IVAITMONTO;
            IVA3 = IVA3 + IVAITMONTO;
            END
        SUMAGR = SUMA1 + SUMA2 + SUMA3;
        totcajas = totcajas + cajas;
        SELECT STAND_COD FROM STANDS WHERE ARTI_COD = :ARTICULO AND STAND_BODEGA = :boditem INTO :stand;
        factcant = NULL;
        SELECT FIRST 1 UNAR_FACCAN FROM unidad_articulo WHERE ARTI_COD = :articulo INTO :factcant;
        if (factcant IS NULL) then
            factcant = 1;
        if ((factcant = 1) or (factcant = 0)) then
            BEGIN
            ALTERNATIVAS = 0;
            PRINCIPALES = (CANT * FACTOR);
            END
        ELSE
            BEGIN
            ALTERNATIVAS = FLOOR(CANT * factor / factcant);
            PRINCIPALES = (CANT * FACTOR) - (alternativas * factcant);
            END
        SUSPEND;
        END
    END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER PROCEDURE IMPR_PEDIDO(
    ID INTEGER)
RETURNS (
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    VALIDEZ INTEGER,
    NIT VARCHAR(20),
    NOMTERCERO VARCHAR(60),
    VENDEDOR INTEGER,
    NOMVENDEDOR VARCHAR(60),
    PUNTOVTA INTEGER,
    NOMPUNTOVTA VARCHAR(30),
    COTIZACION VARCHAR(30),
    SUBTOTAL NUMERIC(18,2),
    DTOPORC NUMERIC(9,2),
    DTOMONTO NUMERIC(18,2),
    ADICIONAL NUMERIC(18,2),
    IVAMONTO NUMERIC(18,2),
    EXTRA NUMERIC(18,2),
    TOTALFAC NUMERIC(18,2),
    OBS BLOB SUB_TYPE 1 SEGMENT SIZE 80,
    ITEM INTEGER,
    ARTICULO VARCHAR(15),
    CODBAR VARCHAR(15),
    ARTIDES VARCHAR(60),
    BODEGA VARCHAR(2),
    CANT NUMERIC(18,4),
    UNIDAD VARCHAR(8),
    FACTOR NUMERIC(18,4),
    LISTAPR INTEGER,
    REFITEM VARCHAR(60),
    PRUNIT NUMERIC(18,2),
    DTOITPORC NUMERIC(9,2),
    DTOITMONTO NUMERIC(18,2),
    PRNETO NUMERIC(18,2),
    PRNETOSINIVA NUMERIC(18,2),
    DTOIT1 NUMERIC(9,2),
    DTOIT2 NUMERIC(9,2),
    DTOIT3 NUMERIC(9,2),
    IVAPORC NUMERIC(9,2),
    IVAITMONTO NUMERIC(18,2),
    CONSUMO NUMERIC(18,2),
    SUBTOTIT NUMERIC(18,2),
    TOTAL NUMERIC(18,2),
    CODIGOCL VARCHAR(20),
    ZONACOD VARCHAR(2),
    ZONANOM VARCHAR(60),
    DV CHAR(1),
    DIRECCION VARCHAR(60),
    CIUDAD VARCHAR(40),
    TELEFONO VARCHAR(40),
    CONTACTO VARCHAR(60),
    FAX VARCHAR(25),
    CEL VARCHAR(25),
    GRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    SUBGRUPO VARCHAR(3),
    NOMSUBG VARCHAR(30),
    MARCA VARCHAR(3),
    NOMMARCA VARCHAR(30),
    PESO NUMERIC(9,4),
    ANCHO NUMERIC(18,4),
    ALTO NUMERIC(18,4),
    LARGO NUMERIC(18,4),
    SUMA1 NUMERIC(18,2),
    SUMA2 NUMERIC(18,2),
    SUMA3 NUMERIC(18,2),
    IVA1 NUMERIC(18,2),
    IVA2 NUMERIC(18,2),
    IVA3 NUMERIC(18,2),
    SUMAEX NUMERIC(18,2),
    SUMAGR NUMERIC(18,2),
    DTOIT1M NUMERIC(18,2),
    DTOIT2M NUMERIC(18,2),
    DTOIT3M NUMERIC(18,2),
    OBSITEM BLOB SUB_TYPE 1 SEGMENT SIZE 80,
    ALTERNATIVAS NUMERIC(18,4),
    PRINCIPALES NUMERIC(18,4))
AS
DECLARE VARIABLE IMPTOS CHAR(1);
DECLARE VARIABLE TARIFA INTEGER;
declare variable ORDENCOD CHAR(2);
declare variable SUCUR VARCHAR(10);
declare variable ICOINC CHAR(2);
declare variable DTOITM1 NUMERIC(18,2);
declare variable DTOITM2 NUMERIC(18,2);
declare variable DTOITM3 NUMERIC(18,2);
declare variable FACTCANT NUMERIC(18,4);
BEGIN
execute procedure lee_configuracion('FACTURACION', 'ARTICULOS', 'IMPOCONSUMO INCLUIDO EN EL PRECIO BASE DE VENTA ANTES DE IVA') returning_values (icoinc);
SELECT F.PREF_PRE, PEDI_NUMERO, PEDI_FECHA, PEDI_VALIDEZ, F.TERC_NIT, PEDI_NOMTERC, F.VEND_COD, VEND_NOMBRE, F.PTVT_ID, PTVT_NOM, PEDI_COTIZACI,
    PEDI_IVAINC, PEDI_DTOPOR, PEDI_DTOMONTO, PEDI_ADICIONAL, PEDI_IVAMONTO, PEDI_EXTRA, PEDI_TOTAL,
    TERC_CONTACTO, TERC_FAX, TERC_DV, TERC_CEL, PEDI_OBS, PEDI_SUCURSAL, PEDI_DTOIT1, PEDI_DTOIT2, PEDI_DTOIT3
    FROM PEDIDOS F, VENDEDORES V, PUNTO_VENTA P, TERCEROS T
    WHERE F.VEND_COD = V.VEND_COD AND F.PTVT_ID = P.PTVT_ID AND F.TERC_NIT = T.TERC_NIT AND F.PEDI_ID = :ID
    into :PREF, :NUMERO, :FECHA, :VALIDEZ, :NIT, :NOMTERCERO, :VENDEDOR, :NOMVENDEDOR, :PUNTOVTA, :NOMPUNTOVTA, :COTIZACION,
    :IMPTOS, :DTOPORC, :DTOMONTO, :ADICIONAL, :IVAMONTO, :EXTRA, :TOTALFAC,
    :CONTACTO, :FAX, :DV, :CEL, :OBS, :SUCUR, :dtoit1m, :dtoit2m, :dtoit3m;
SUBTOTAL = TOTALFAC - EXTRA - IVAMONTO - ADICIONAL + DTOMONTO;

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

SET TERM ; ^

/* 20090519c */
/* COSTO_VENTAS CON TIPO E ID PARA EVITAR QUE DOS TRANSACCIONES AFECTEN LOS MISMOS REGISTROS DANDO UN ERROR 'NO PUEDO ACTUALIZAR UN REGISTRO BORRADO'  */

delete from costo_ventas;
COMMIT WORK;

ALTER TABLE COSTO_VENTAS ADD COVE_ID T_ID NOT NULL ;
ALTER TABLE COSTO_VENTAS ADD TIDO_COD INTEGER NOT NULL ;
ALTER TABLE COSTO_VENTAS DROP CONSTRAINT PK_COSTO_VENTAS;

ALTER TABLE COSTO_VENTAS
ADD COVE_ITEM T_ID NOT NULL ;

alter table COSTO_VENTAS
add constraint PK_COSTO_VENTAS
primary key (TIDO_COD,COVE_ID,COVE_ITEM);

SET TERM ^ ;

create trigger COSTO_VENTAS_BI for COSTO_VENTAS
active BEFORE INSERT position 0
as
declare variable ITEM INTEGER;
begin
ITEM = 0;
SELECT MAX(COVE_ITEM) FROM COSTO_VENTAS WHERE TIDO_COD = NEW.tido_cod AND COVE_ID = NEW.cove_id INTO :item;
if ((ITEM IS NULL) or (ITEM = 0)) then
    NEW.cove_item = 1;
ELSE
    NEW.cove_item = ITEM + 1;
end
^

SET TERM ; ^


SET TERM ^ ;

ALTER PROCEDURE COSTO_EN_VENTAS(
    TIPO INTEGER,
    ID INTEGER)
AS
declare variable FECHA DATE;
declare variable ARTICULO VARCHAR(20);
declare variable CANTIDAD NUMERIC(18,4);
declare variable COSTO NUMERIC(18,2);
declare variable CTACOSTO VARCHAR(20);
declare variable CTAINVEN VARCHAR(20);
BEGIN
DELETE FROM COSTO_VENTAS WHERE TIDO_COD = :TIPO AND COVE_ID = :ID;
if (TIPO = 31) then
    BEGIN
    /* FACTURA DE VENTA */
    FOR SELECT D.ARTI_COD, FADE_CANT * FADE_FACTOR, FACT_FECHA
        FROM ARTICULO A, FACTURAS F, FACTURAS_DETALLE D
        WHERE F.FACT_ID = D.FACT_ID AND A.ARTI_COD = D.ARTI_COD AND F.FACT_ID = :ID AND FACT_ANULADO = 'N'
        INTO :ARTICULO, :CANTIDAD, :FECHA
        DO
        BEGIN
        SELECT COAR_CTACOS, COAR_CTAINV FROM CONTABIL_ARTICULO WHERE ARTI_COD = :articulo INTO :CTACOSTO, :CTAINVEN;
        EXECUTE PROCEDURE COSTO_PROMEDIO(:ARTICULO, :FECHA) returning_values (:COSTO);
        INSERT INTO COSTO_VENTAS (TIDO_COD, COVE_ID, ARTI_COD, CANT, COSTO,  CTACOS, CTAINV)
            VALUES (:TIPO, :ID, :ARTICULO, :CANTIDAD, :COSTO, :CTACOSTO, :CTAINVEN);
        END
    END
if (TIPO = 32) then
    BEGIN
    /* REMISION */
    FOR SELECT D.ARTI_COD, RVDE_CANT * RVDE_FACTOR, REVT_FECHA
        FROM ARTICULO A, REMISIONES_VENTA R, REMISIONES_VENTA_DETALLE D
        WHERE R.REVT_ID = D.REVT_ID AND A.ARTI_COD = D.ARTI_COD AND R.REVT_ID = :ID AND REVT_ANULADO = 'N'
        INTO :ARTICULO, :CANTIDAD, :FECHA
        DO
        BEGIN
        SELECT COAR_CTACOS, COAR_CTAINV FROM CONTABIL_ARTICULO WHERE ARTI_COD = :articulo INTO :CTACOSTO, :CTAINVEN;
        EXECUTE PROCEDURE COSTO_PROMEDIO(:ARTICULO, :FECHA) returning_values (:COSTO);
        INSERT INTO COSTO_VENTAS (TIDO_COD, COVE_ID, ARTI_COD, CANT, COSTO,  CTACOS, CTAINV)
            VALUES (:TIPO, :ID, :ARTICULO, :CANTIDAD, :COSTO, :CTACOSTO, :CTAINVEN);
        END
    END
if (TIPO = 33) then
    BEGIN
    /* DEVOLUCION */
    FOR SELECT D.ARTI_COD, DVDE_CANT * DVDE_FACTOR, DEVT_FECHA
        FROM ARTICULO A, DEVOLUCIONES_VENTAS DV, DEVOLUCIONES_VENTAS_DETALLE D
        WHERE DV.DEVT_ID = D.DEVT_ID AND A.ARTI_COD = D.ARTI_COD AND DV.DEVT_ID = :ID AND DEVT_ANULADO = 'N'
        INTO :ARTICULO, :CANTIDAD, :FECHA
        DO
        BEGIN
        SELECT COAR_CTACOS, COAR_CTAINV FROM CONTABIL_ARTICULO WHERE ARTI_COD = :articulo INTO :CTACOSTO, :CTAINVEN;
        EXECUTE PROCEDURE COSTO_PROMEDIO(:ARTICULO, :FECHA) returning_values (:COSTO);
        INSERT INTO COSTO_VENTAS (TIDO_COD, COVE_ID, ARTI_COD, CANT, COSTO,  CTACOS, CTAINV)
            VALUES (:TIPO, :ID, :ARTICULO, :CANTIDAD, :COSTO, :CTACOSTO, :CTAINVEN);
        END
    END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER PROCEDURE CONTABILICE_COSTO_VENTAS(
    ID INTEGER,
    IDINTER INTEGER)
RETURNS (
    IDC INTEGER)
AS
declare variable PREF VARCHAR(4);
declare variable NUM VARCHAR(6);
declare variable NUMERO VARCHAR(10);
declare variable INVEN CHAR(1);
declare variable CTAINVEN VARCHAR(20);
declare variable COSTOS CHAR(1);
declare variable CTACOSTOS VARCHAR(20);
declare variable EXISTE CHAR(1);
declare variable CUENTA VARCHAR(20);
declare variable MONTO NUMERIC(18,2);
declare variable TIPOCUEN CHAR(1);
declare variable NIT VARCHAR(20);
declare variable PROY VARCHAR(4);
declare variable CENTRO VARCHAR(4);
declare variable ART VARCHAR(15);
declare variable ANULADO CHAR(1);
declare variable NROI INTEGER;
declare variable NUMROWS INTEGER;
declare variable CONC CHAR(120);
declare variable VENCEAUX DATE;
declare variable VENCE CHAR(8);
begin
/* TRAIGA EL ID DEL ENCABEZADO DEL COMPROBANTE CONTABLE */
SELECT ENCO_CONSEC FROM COMPROBANTE_ENCABEZADO WHERE ENCO_TIPOREF = 31 AND ENCO_IDREF = :ID INTO :IDC;
SELECT MAX(CODE_ITEM) FROM COMPROBANTE_DETALLE WHERE ENCO_CONSEC = :idc INTO :NROI;
NROI = NROI + 1;
/* EJECUTE LA PARTE DE CONTABIL_FACTURA QUE CORRESPONDE A LOS COSTOS */
EXISTE = 'N';
SELECT 'S', INVE_COSTO, INVE_INVEN, INVE_CTAINVEN, INVE_CTACOSTOS
    FROM INTERFAZ_VENTAS
    WHERE INVE_ID = :IDINTER
    INTO :EXISTE, :COSTOS, :INVEN, :CTAINVEN, :CTACOSTOS;
if (EXISTE = 'S') then
  BEGIN
  SELECT FACT_ANULADO, PREF_PRE, FACT_NUMERO, FACT_VENCE, TERC_NIT FROM FACTURAS F
        WHERE FACT_ID = :ID INTO :ANULADO, :PREF, :NUMERO, :VENCEAUX, :NIT;
  NUMERO = PREF || NUM;
  CONC = 'COSTO EN VENTAS FACTURA ' || :NUMERO;
  EXECUTE PROCEDURE FECHA_A_CONTA(:VENCEAUX) returning_values (:VENCE);
  if (ANULADO = 'N') then
    BEGIN
    SELECT BODE_CENTRO, BODE_PROY FROM BODEGA B, FACTURAS F, PUNTO_VENTA P
        WHERE B.BODE_COD = P.BODE_COD AND P.PTVT_ID = F.PTVT_ID AND F.FACT_ID = :ID INTO :CENTRO, :PROY;
    /* SE ASUME QUE NO HAN CAMBIADO LAS CUENTAS DE COSTOS, POR ESO SE HACE UPDATE A LOS MOVIMIENTOS DE ESAS CUENTAS */
    EXECUTE PROCEDURE COSTO_EN_VENTAS(31, :ID);
    if (COSTOS = 'A') then
        BEGIN
        FOR SELECT MAX(CTACOS), SUM(CANT * COSTO)
            FROM COSTO_VENTAS WHERE TIDO_COD = 31 AND COVE_ID = :ID
            GROUP BY CTACOS
            INTO :CTACOSTOS, :MONTO
        DO
            BEGIN
            if (MONTO <> 0) then
                BEGIN
                CUENTA = NULL;
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :CTACOSTOS INTO :CUENTA, :TIPOCUEN;
                IF (CUENTA IS NULL) THEN
                    begin
                    EXCEPTION CUENTA_NO_EXISTE 'La cuenta ' || :ctacostos || ' no existe.';
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT ARTI_COD, CANT * COSTO
                        FROM COSTO_VENTAS WHERE TIDO_COD = 31 AND COVE_ID = :ID AND CTACOS = :CUENTA
                        INTO :ART, :MONTO
                    DO
                        BEGIN
                        SELECT COUNT(*) FROM COMPROBANTE_DETALLE WHERE CUEN_COD = :CUENTA AND ENCO_CONSEC = :IDC AND ARTI_COD = :ART INTO :NUMROWS;
                        if (NUMROWS = 0) then
                            BEGIN
                            INSERT INTO comprobante_detalle (ENCO_CONSEC, CODE_ITEM, CUEN_COD, CODE_CONCEPTO, CODE_REFER, CODE_DEBITO, CODE_CREDITO, CODE_BASE, CODE_PORC, TERC_NIT, PROY_COD, CENT_COD, CNDE_DOCNUMERO, CNDE_DOCAPLICA, DOCO_VENCE, ARTI_COD, CODE_TIPOAPL, CODE_TIPONUE)
                                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                            NROI = NROI + 1;
                            END
                        ELSE
                            UPDATE COMPROBANTE_DETALLE
                                SET CODE_DEBITO = :MONTO
                            WHERE CUEN_COD = :CUENTA AND ENCO_CONSEC = :IDC AND ARTI_COD = :ART;
                        END
                    END
                ELSE
                    BEGIN
                    SELECT COUNT(*) FROM COMPROBANTE_DETALLE WHERE CUEN_COD = :CUENTA AND ENCO_CONSEC = :IDC INTO :NUMROWS;
                    if (NUMROWS = 0) then
                        BEGIN
                        if (TIPOCUEN = 'C') then
                            INSERT INTO comprobante_detalle (ENCO_CONSEC, CODE_ITEM, CUEN_COD, CODE_CONCEPTO, CODE_REFER, CODE_DEBITO, CODE_CREDITO, CODE_BASE, CODE_PORC, TERC_NIT, PROY_COD, CENT_COD, CNDE_DOCNUMERO, CNDE_DOCAPLICA, DOCO_VENCE, ARTI_COD, CODE_TIPOAPL, CODE_TIPONUE)
                                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                        ELSE
                            INSERT INTO comprobante_detalle (ENCO_CONSEC, CODE_ITEM, CUEN_COD, CODE_CONCEPTO, CODE_REFER, CODE_DEBITO, CODE_CREDITO, CODE_BASE, CODE_PORC, TERC_NIT, PROY_COD, CENT_COD, CNDE_DOCNUMERO, CNDE_DOCAPLICA, DOCO_VENCE, ARTI_COD, CODE_TIPOAPL, CODE_TIPONUE)
                                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NROI = NROI + 1;
                        END
                    ELSE
                        UPDATE COMPROBANTE_DETALLE
                            SET CODE_DEBITO = :MONTO
                        WHERE CUEN_COD = :CUENTA AND ENCO_CONSEC = :IDC;
                    END
                END /* MONTO <> 0 */
            END /* FOR */
        END /* COSTOS */
    if (COSTOS = 'K') then
        BEGIN
        SELECT SUM(CANT * COSTO)
            FROM COSTO_VENTAS WHERE TIDO_COD = 31 AND COVE_ID = :ID
            INTO :MONTO;
        if (MONTO <> 0) then
            BEGIN
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTACOSTOS INTO :CUENTA, :TIPOCUEN;
            IF (CUENTA IS NULL) THEN
                begin
                EXCEPTION CUENTA_NO_EXISTE 'La cuenta ' || :ctacostos || ' no existe.';
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, REGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT ARTI_COD, CANT * COSTO
                    FROM COSTO_VENTAS WHERE TIDO_COD = 31 AND COVE_ID = :ID
                    INTO :ART, :MONTO
                DO
                    BEGIN
                    SELECT COUNT(*) FROM COMPROBANTE_DETALLE WHERE CUEN_COD = :CUENTA AND ENCO_CONSEC = :IDC AND ARTI_COD = :ART INTO :NUMROWS;
                    if (NUMROWS = 0) then
                        BEGIN
                            INSERT INTO comprobante_detalle (ENCO_CONSEC, CODE_ITEM, CUEN_COD, CODE_CONCEPTO, CODE_REFER, CODE_DEBITO, CODE_CREDITO, CODE_BASE, CODE_PORC, TERC_NIT, PROY_COD, CENT_COD, CNDE_DOCNUMERO, CNDE_DOCAPLICA, DOCO_VENCE, ARTI_COD, CODE_TIPOAPL, CODE_TIPONUE)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        END
                    ELSE
                        UPDATE COMPROBANTE_DETALLE
                            SET CODE_DEBITO = :MONTO
                        WHERE CUEN_COD = :CUENTA AND ENCO_CONSEC = :IDC AND ARTI_COD = :ART;
                    END
                END
            ELSE
                BEGIN
                SELECT COUNT(*) FROM COMPROBANTE_DETALLE WHERE CUEN_COD = :CUENTA AND ENCO_CONSEC = :IDC INTO :NUMROWS;
                if (NUMROWS = 0) then
                    BEGIN
                    if (TIPOCUEN = 'C') then
                        INSERT INTO comprobante_detalle (ENCO_CONSEC, CODE_ITEM, CUEN_COD, CODE_CONCEPTO, CODE_REFER, CODE_DEBITO, CODE_CREDITO, CODE_BASE, CODE_PORC, TERC_NIT, PROY_COD, CENT_COD, CNDE_DOCNUMERO, CNDE_DOCAPLICA, DOCO_VENCE, ARTI_COD, CODE_TIPOAPL, CODE_TIPONUE)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    ELSE
                        INSERT INTO comprobante_detalle (ENCO_CONSEC, CODE_ITEM, CUEN_COD, CODE_CONCEPTO, CODE_REFER, CODE_DEBITO, CODE_CREDITO, CODE_BASE, CODE_PORC, TERC_NIT, PROY_COD, CENT_COD, CNDE_DOCNUMERO, CNDE_DOCAPLICA, DOCO_VENCE, ARTI_COD, CODE_TIPOAPL, CODE_TIPONUE)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    END
                ELSE
                    UPDATE COMPROBANTE_DETALLE
                        SET CODE_DEBITO = :MONTO
                    WHERE CUEN_COD = :CUENTA AND ENCO_CONSEC = :IDC;
                END
            END /* MONTO <> 0 */
        END /* COSTOS = K */
    if (INVEN = 'A') then
        BEGIN
        FOR SELECT MAX(CTAINV), SUM(CANT * COSTO)
            FROM COSTO_VENTAS WHERE TIDO_COD = 31 AND COVE_ID = :ID
            GROUP BY CTAINV
            INTO :CTAINVEN, :MONTO
        DO
            BEGIN
            if (MONTO <> 0) then
                BEGIN
                CUENTA = NULL;
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :CTAINVEN INTO :CUENTA, :TIPOCUEN;
                IF (CUENTA IS NULL) THEN
                    begin
                    EXCEPTION CUENTA_NO_EXISTE 'La cuenta ' || :ctainven || ' no existe.';
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, REGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT ARTI_COD, CANT * COSTO
                        FROM COSTO_VENTAS WHERE TIDO_COD = 31 AND COVE_ID = :ID AND CTAINV = :CUENTA
                        INTO :ART, :MONTO
                    DO
                        BEGIN
                        SELECT COUNT(*) FROM COMPROBANTE_DETALLE WHERE CUEN_COD = :CUENTA AND ENCO_CONSEC = :IDC AND ARTI_COD = :ART INTO :NUMROWS;
                        if (NUMROWS = 0) then
                            BEGIN
                            INSERT INTO comprobante_detalle (ENCO_CONSEC, CODE_ITEM, CUEN_COD, CODE_CONCEPTO, CODE_REFER, CODE_DEBITO, CODE_CREDITO, CODE_BASE, CODE_PORC, TERC_NIT, PROY_COD, CENT_COD, CNDE_DOCNUMERO, CNDE_DOCAPLICA, DOCO_VENCE, ARTI_COD, CODE_TIPOAPL, CODE_TIPONUE)
                                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                            NROI = NROI + 1;
                            END
                        ELSE
                            UPDATE COMPROBANTE_DETALLE
                                SET CODE_CREDITO = :MONTO
                            WHERE CUEN_COD = :CUENTA AND ENCO_CONSEC = :IDC AND ARTI_COD = :ART;
                        END
                    END
                ELSE
                    BEGIN
                    SELECT COUNT(*) FROM COMPROBANTE_DETALLE WHERE CUEN_COD = :CUENTA AND ENCO_CONSEC = :IDC INTO :NUMROWS;
                    if (NUMROWS = 0) then
                        BEGIN
                        if (TIPOCUEN = 'C') then
                            INSERT INTO comprobante_detalle (ENCO_CONSEC, CODE_ITEM, CUEN_COD, CODE_CONCEPTO, CODE_REFER, CODE_DEBITO, CODE_CREDITO, CODE_BASE, CODE_PORC, TERC_NIT, PROY_COD, CENT_COD, CNDE_DOCNUMERO, CNDE_DOCAPLICA, DOCO_VENCE, ARTI_COD, CODE_TIPOAPL, CODE_TIPONUE)
                                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                        ELSE
                            INSERT INTO comprobante_detalle (ENCO_CONSEC, CODE_ITEM, CUEN_COD, CODE_CONCEPTO, CODE_REFER, CODE_DEBITO, CODE_CREDITO, CODE_BASE, CODE_PORC, TERC_NIT, PROY_COD, CENT_COD, CNDE_DOCNUMERO, CNDE_DOCAPLICA, DOCO_VENCE, ARTI_COD, CODE_TIPOAPL, CODE_TIPONUE)
                                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NROI = NROI + 1;
                        END
                    ELSE
                        UPDATE COMPROBANTE_DETALLE
                            SET CODE_CREDITO = :MONTO
                        WHERE CUEN_COD = :CUENTA AND ENCO_CONSEC = :IDC;
                    END
                END /* MONTO <> 0 */
            END /* FOR */
        END /* INVEN = A */
    if (INVEN = 'K') then
        BEGIN
        SELECT SUM(CANT * COSTO)
            FROM COSTO_VENTAS WHERE TIDO_COD = 31 AND COVE_ID = :ID
            INTO :MONTO;
        if (MONTO <> 0) then
            BEGIN
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTAINVEN INTO :CUENTA, :TIPOCUEN;
            IF (CUENTA IS NULL) THEN
                begin
                EXCEPTION CUENTA_NO_EXISTE 'La cuenta ' || :ctainven || ' no existe.';
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT ARTI_COD, CANT * COSTO
                    FROM COSTO_VENTAS WHERE TIDO_COD = 31 AND COVE_ID = :ID
                    INTO :ART, :MONTO
                DO
                    BEGIN
                    SELECT COUNT(*) FROM COMPROBANTE_DETALLE WHERE CUEN_COD = :CUENTA AND ENCO_CONSEC = :IDC AND ARTI_COD = :ART INTO :NUMROWS;
                    if (NUMROWS = 0) then
                        BEGIN
                        INSERT INTO comprobante_detalle (ENCO_CONSEC, CODE_ITEM, CUEN_COD, CODE_CONCEPTO, CODE_REFER, CODE_DEBITO, CODE_CREDITO, CODE_BASE, CODE_PORC, TERC_NIT, PROY_COD, CENT_COD, CNDE_DOCNUMERO, CNDE_DOCAPLICA, DOCO_VENCE, ARTI_COD, CODE_TIPOAPL, CODE_TIPONUE)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        END
                    ELSE
                        UPDATE COMPROBANTE_DETALLE
                            SET CODE_CREDITO = :MONTO
                        WHERE CUEN_COD = :CUENTA AND ENCO_CONSEC = :IDC AND ARTI_COD = :ART;
                    END
                END
            ELSE
                BEGIN
                SELECT COUNT(*) FROM COMPROBANTE_DETALLE WHERE CUEN_COD = :CUENTA AND ENCO_CONSEC = :IDC INTO :NUMROWS;
                if (NUMROWS = 0) then
                    BEGIN
                    if (TIPOCUEN = 'C') then
                        INSERT INTO comprobante_detalle (ENCO_CONSEC, CODE_ITEM, CUEN_COD, CODE_CONCEPTO, CODE_REFER, CODE_DEBITO, CODE_CREDITO, CODE_BASE, CODE_PORC, TERC_NIT, PROY_COD, CENT_COD, CNDE_DOCNUMERO, CNDE_DOCAPLICA, DOCO_VENCE, ARTI_COD, CODE_TIPOAPL, CODE_TIPONUE)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    ELSE
                        INSERT INTO comprobante_detalle (ENCO_CONSEC, CODE_ITEM, CUEN_COD, CODE_CONCEPTO, CODE_REFER, CODE_DEBITO, CODE_CREDITO, CODE_BASE, CODE_PORC, TERC_NIT, PROY_COD, CENT_COD, CNDE_DOCNUMERO, CNDE_DOCAPLICA, DOCO_VENCE, ARTI_COD, CODE_TIPOAPL, CODE_TIPONUE)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    END
                ELSE
                    UPDATE COMPROBANTE_DETALLE
                        SET CODE_CREDITO = :MONTO
                    WHERE CUEN_COD = :CUENTA AND ENCO_CONSEC = :IDC;
                END
            END /* MONTO <> 0 */
        END /* INVEN = K */
    END
  END
end
^

SET TERM ; ^

SET TERM ^ ;

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

^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER PROCEDURE CONTABIL_DEVOLCLI(
    IDDOC INTEGER,
    IDINTER INTEGER)
RETURNS (
    ERROR INTEGER,
    VER CHAR(1),
    IDC INTEGER)
AS
declare variable PREF VARCHAR(4);
declare variable NUM VARCHAR(6);
declare variable NUMERO VARCHAR(10);
declare variable FECAUX DATE;
declare variable FECHA CHAR(8);
declare variable CONC CHAR(120);
declare variable NUMFAC VARCHAR(10);
declare variable VRDTO NUMERIC(18, 2);
declare variable VRADIC NUMERIC(18, 2);
declare variable VRSUBT NUMERIC(18, 2);
declare variable VRIVA NUMERIC(18, 2);
declare variable PRTFTE NUMERIC(9, 2);
declare variable VRRTFTE NUMERIC(18, 2);
declare variable VRRTIVA NUMERIC(18, 2);
declare variable PRTICA NUMERIC(9, 2);
declare variable VRRTICA NUMERIC(18, 2);
declare variable VRTOTAL NUMERIC(18, 2);
declare variable VREXTRA NUMERIC(18, 2);
declare variable TIPOCOMP VARCHAR(3);
declare variable PREFCONT VARCHAR(4);
declare variable VENTAS CHAR(1);
declare variable CTAVENTAS VARCHAR(20);
declare variable IVA CHAR(1);
declare variable CTAIVA VARCHAR(20);
declare variable CONSUMO CHAR(1);
declare variable CTACONSUMO VARCHAR(20);
declare variable CARTERA CHAR(1);
declare variable CTACARTERA VARCHAR(20);
declare variable RTFTE CHAR(1);
declare variable CTARTFTE VARCHAR(20);
declare variable RTIVA CHAR(1);
declare variable CTARTIVA VARCHAR(20);
declare variable RTICA CHAR(1);
declare variable CTARTICA VARCHAR(20);
declare variable INVEN CHAR(1);
declare variable CTAINVEN VARCHAR(20);
declare variable COSTOS CHAR(1);
declare variable CTACOSTOS VARCHAR(20);
declare variable CTADTO VARCHAR(20);
declare variable CTAADIC VARCHAR(20);
declare variable CTAEXTRA VARCHAR(20);
declare variable EXISTE CHAR(1);
declare variable CUENTA VARCHAR(20);
declare variable MONTO NUMERIC(18,2);
declare variable TIPOCUEN CHAR(1);
declare variable NIT VARCHAR(20);
declare variable PROY VARCHAR(4);
declare variable CENTRO VARCHAR(4);
declare variable PORC NUMERIC(5,2);
declare variable DEBITO NUMERIC(18,2);
declare variable CREDITO NUMERIC(18,2);
declare variable NROI INTEGER;
declare variable ART VARCHAR(15);
declare variable IMPINC CHAR(1);
declare variable IMPTOS NUMERIC(18, 2);
declare variable SUMA NUMERIC(18,2);
declare variable PORCIVA NUMERIC(9,2);
declare variable TCTACLIEN VARCHAR(20);
declare variable TCTAVENTA VARCHAR(20);
declare variable TCTARTFTE VARCHAR(20);
declare variable TCTARTIVA VARCHAR(20);
declare variable TCTARTICA VARCHAR(20);
declare variable CTADIC VARCHAR(20);
declare variable BASEADIC VARCHAR(20);
declare variable PORCADIC NUMERIC(5,2);
declare variable VALORADIC NUMERIC(18,2);
declare variable DBADIC CHAR(1);
declare variable PTOVTA INTEGER;
declare variable ANULADO CHAR(1);
declare variable CENT CHAR(1);
DECLARE VARIABLE MERCANCIA NUMERIC(18,2);
declare variable FACTOR DOUBLE PRECISION;
declare variable DIG INTEGER;
DECLARE VARIABLE FOMENTO VARCHAR(2);
DECLARE VARIABLE VRCONSUMO NUMERIC(18,2);
declare variable AUTORET VARCHAR(10);
declare variable FAUTORET DATE;
declare variable IDREM INTEGER;
declare variable DTOXIT CHAR(2);
declare variable ERRORC INTEGER;
BEGIN
EXECUTE PROCEDURE LEE_CONFIGURACION('COMPRAS', 'FACTURAS', 'USAR IMPOCONSUMO COMO PORCENTAJE DE FOMENTO') returning_values (FOMENTO);
EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'FECHA AUTORETENEDOR NO DESCONTAR RETENCIONES DEL SALDO PERO SI CONTABILIZARLAS') returning_values (AUTORET);
if (AUTORET <> '') then
    FAUTORET = CAST(AUTORET AS DATE);
else
    FAUTORET = '9999/12/31';
  /* BUSQUE LA INTERFACE */
  EXISTE = 'N';
  SELECT 'S', TICO_COD, PRCO_PRE, INVE_VENTAS, INVE_IVA, INVE_CONSUMO, INVE_CARTERA, INVE_RTFTE, INVE_RTIVA, INVE_RTICA, INVE_COSTO, INVE_INVEN, INVE_CTAVENTAS, INVE_CTAIVA, INVE_CTACONSUMO, INVE_CTADTO, INVE_CTAADIC, INVE_CTAEXTRA, INVE_CTACARTERA, INVE_CTARTFTE, INVE_CTARTIVA, INVE_CTARTICA, INVE_CTAINVEN, INVE_CTACOSTOS, INVE_CONFIRMAR, INVE_CENTRO
    FROM INTERFAZ_VENTAS
    WHERE INVE_ID = :IDINTER
    INTO :EXISTE, :TIPOCOMP, :PREFCONT, :VENTAS, :IVA, :CONSUMO, :CARTERA, :RTFTE, :RTIVA, :RTICA, :COSTOS, :INVEN, :CTAVENTAS, :CTAIVA, :CTACONSUMO, :CTADTO, :CTAADIC, :CTAEXTRA, :CTACARTERA, :CTARTFTE, :CTARTIVA, :CTARTICA, :CTAINVEN, :CTACOSTOS, :VER, :CENT;
  if (EXISTE = 'S') then
   BEGIN
    /* BORRE CUALQUEIR CONTABILIZACION PREVIA */
    DELETE FROM CONTABILIZACION WHERE CNTB_TIPOREF = 33 AND CNTB_IDREF = :IDDOC;
    /* TRAIGA EL ENCABEZADO DE LA DEVOLUCION */
   SELECT PREF_PRE, DEVT_NUMERO, DEVT_FECHA, F.TERC_NIT, DEVT_IVAINC, PTVT_ID, DEVT_FACTURA, DEVT_DTOMONTO, DEVT_ADICIONAL, DEVT_IVAMONTO, DEVT_EXTRA, DEVT_TOTAL, DEVT_RTFTEPORC, DEVT_RTFTEMONTO, DEVT_RTIVAPORC, DEVT_RTIVAMONTO, DEVT_RTICAPORC, DEVT_RTICAMONTO, TERC_CTARTFTE, TERC_CTARTIVA, TERC_CTARTICA, TERC_CTAVENTA, TERC_CTACLIENTE, DEVT_ANULADO, DEVT_REMID
        FROM DEVOLUCIONES_VENTAS F, TERCEROS T
        WHERE DEVT_ID = :IDDOC AND F.TERC_NIT = T.TERC_NIT
        INTO :PREF, :NUM, :FECAUX, :NIT, :IMPINC, :PTOVTA, :NUMFAC, :VRDTO, :VRADIC, :VRIVA, :VREXTRA, :VRTOTAL, :PRTFTE, :VRRTFTE, :PORC, :VRRTIVA, :PRTICA, :VRRTICA, :TCTARTFTE, TCTARTIVA, TCTARTICA, TCTAVENTA, TCTACLIEN, ANULADO, :IDREM;
   if (idrem is null) Then
    IDREM = 0;
   if ((ANULADO = 'N') AND (IDREM = 0)) then
    BEGIN
    NUMERO = PREF || NUM;
    SELECT SUM(DVDE_CONSUMO) FROM devoluciones_ventas_detalle WHERE DEVT_ID = :iddoc AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL)) INTO :MERCANCIA;
    VRSUBT = VRTOTAL - VREXTRA - VRIVA - MERCANCIA; /* BASE DE RETEFTE Y RETEICA */
    EXECUTE PROCEDURE lee_configuracion ('FACTURACION', 'DEVOLUCIONES', 'DESCUENTO PIE DEVOLUCION IGUAL A SUMA DE DESCUENTOS POR ITEM') returning_values (:DTOXIT);
    if (DTOXIT = 'SI') then
        VRDTO = 0;
    MERCANCIA = VRSUBT - VRADIC + VRDTO;
    IF (CENT = 'B') THEN
        SELECT B.BODE_CENTRO, B.BODE_PROY FROM BODEGA B, DEVOLUCIONES_VENTAS F
            WHERE B.BODE_COD = F.BODE_COD AND F.DEVT_ID = :IDDOC INTO :CENTRO, :PROY;
    IF (CENT = 'V') THEN
        SELECT V.CENT_COD, V.PROY_COD FROM VENDEDORES V, DEVOLUCIONES_VENTAS F
            WHERE V.VEND_COD = F.VEND_COD AND F.DEVT_ID = :IDDOC INTO :CENTRO, :PROY;
    IF (CENT = 'P') THEN
        SELECT P.PREF_CENTRO,P.PREF_PROY  FROM PREFIJOS P, DEVOLUCIONES_VENTAS F
            WHERE P.PREF_PRE = F.PREF_PRE AND F.DEVT_ID = :IDDOC AND P.TIDO_COD = 33 INTO :CENTRO, :PROY;
    EXECUTE PROCEDURE FECHA_A_CONTA(:FECAUX) returning_values (:FECHA);
    /* REGISTRE EL ENCABEZADO CONTABLE */
    IDC = GEN_ID(ID_CONTABILIZA, 1);
    CONC = 'DEVOLUCION VENTAS No. ' || NUMERO || ' EN FACTURA ' || NUMFAC;
    CONC = SUBSTR(CONC, 1, 60);
    INSERT INTO CONTABILIZACION (CNTB_ID, CNTB_TIPOCOMP, CNTB_PREFCNT, CNTB_NUMERO, CNTB_FECHA, CNTB_CONCEPTO, CNTB_REF, CNTB_TIPOREF, CNTB_IDREF, CNTB_PREFREF, CNTB_NUMREF, CNTB_PROCESADO)
        VALUES (:IDC, :TIPOCOMP, :PREFCONT, :NUM, :FECHA, :CONC, '', 33, :IDDOC, :PREF, :NUM, 'N');
    NROI = 0;
    SUMA = 0;
    ERROR = 0;
    /* SI NO HAY CUENTA DE DESCUENTO NI ADICIONAL CALCULE UN FACTOR PARA LAS VENTAS Y EL IVA */
    if (MERCANCIA <> 0) then
        FACTOR = CAST(VRSUBT AS DOUBLE PRECISION) / CAST(MERCANCIA AS DOUBLE PRECISION);
    ELSE
        FACTOR = 1;
    /* TRAIGA EL NUMERO DE DIGITOS PARA EL REDONDEO */
    SELECT CAST(CONF_VALOR AS INTEGER) FROM CONFIGURACION WHERE CONF_MODULO = 'FACTURACION' AND
        CONF_CATEGORIA = 'GENERAL' AND CONF_PROPIEDAD = 'REDONDEO AL MULTIPLO DE DIEZ EN TOTALES' INTO :DIG;
    /* CUENTAS DE VENTAS */
    if (VENTAS = 'A') then
        BEGIN
        FOR SELECT MAX(COAR_CTADEV), SUM(DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO), SUM(DVDE_IVAMONTO), SUM(DVDE_CONSUMO)
            FROM ARTICULO A, CONTABIL_ARTICULO C, DEVOLUCIONES_VENTAS_DETALLE F
            WHERE F.DEVT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
            GROUP BY COAR_CTADEV
            INTO :CTAVENTAS, :MONTO, :IMPTOS, :VRCONSUMO
            DO
            BEGIN
            if (IMPINC = 'S') then
                if (FOMENTO = 'SI') then
                    MONTO = MONTO - IMPTOS;
                ELSE
                    MONTO = MONTO - IMPTOS - VRCONSUMO;
            ELSE
            if (FOMENTO = 'SI') then
            MONTO = MONTO + VRCONSUMO;
            if ((CTADTO IS NULL) OR (CTADTO = '')) then
                MONTO = MONTO * FACTOR;
            execute procedure redondee(MONTO, DIG) returning_values (MONTO);
            if (MONTO <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTAVENTAS, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT F.ARTI_COD, (DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO), (DVDE_IVAMONTO+DVDE_CONSUMO)
                        FROM ARTICULO A, CONTABIL_ARTICULO C, DEVOLUCIONES_VENTAS_DETALLE F
                        WHERE F.DEVT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTAINV = :CUENTA AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
                        INTO :ART, :MONTO, :IMPTOS
                    DO
                        BEGIN
                        if (IMPINC = 'S') then
                            MONTO = MONTO - IMPTOS;
                        if ((CTADTO IS NULL) OR (CTADTO = '')) then
                            MONTO = MONTO * FACTOR;
                        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        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, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                    NROI = NROI + 1;
                    SUMA = SUMA + MONTO;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA + MONTO;
                    END
                END /* MONTO <> 0 */
            END /* FOR */
        END /* VENTAS X ARTICULO */
     IF ((VENTAS = 'C') OR (VENTAS = 'K')) THEN
        BEGIN
        IF (VENTAS = 'C') THEN
            CTAVENTAS = TCTAVENTA;
        SELECT SUM(DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO), SUM(DVDE_IVAMONTO), SUM(DVDE_CONSUMO)
            FROM DEVOLUCIONES_VENTAS_DETALLE F
            WHERE F.DEVT_ID = :IDDOC  AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
            INTO :MONTO, :IMPTOS, :VRCONSUMO;
        if (IMPINC = 'S') then
            if (FOMENTO = 'SI') then
               MONTO = MONTO - IMPTOS;
            ELSE
               MONTO = MONTO - IMPTOS - VRCONSUMO;
        ELSE
         if (FOMENTO = 'SI') then
          MONTO = MONTO + VRCONSUMO;
        if ((CTADTO IS NULL) OR (CTADTO = '')) then
            MONTO = MONTO * FACTOR;
        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
        if (MONTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTAVENTAS, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT F.ARTI_COD, (DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO), (DVDE_IVAMONTO+DVDE_CONSUMO)
                    FROM ARTICULO A, DEVOLUCIONES_VENTAS_DETALLE F
                    WHERE F.DEVT_ID = :IDDOC AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
                    INTO :ART, :MONTO, :IMPTOS
                    DO
                    BEGIN
                    if (IMPINC = 'S') then
                        MONTO = MONTO - IMPTOS;
                    if ((CTADTO IS NULL) OR (CTADTO = '')) then
                        MONTO = MONTO * FACTOR;
                    execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                    NROI = NROI + 1;
                    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, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                NROI = NROI + 1;
                SUMA = SUMA + MONTO;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA + MONTO;
                END
            END /* MONTO <> 0 */
        END /* VENTAS DE CLIENTE O CONSTANTE */
    /* EL IVA EN VENTAS */
    if (IVA = 'A') then
        BEGIN
        FOR SELECT MAX(COAR_CTAIVAV), SUM(DVDE_IVAMONTO), SUM(DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO), SUM(DVDE_CONSUMO)
            FROM ARTICULO A, CONTABIL_ARTICULO C, DEVOLUCIONES_VENTAS_DETALLE F
            WHERE F.DEVT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
            GROUP BY COAR_CTAIVAV
            INTO :CTAIVA, :IMPTOS, :MONTO, :VALORADIC
        DO
            BEGIN
            if (FOMENTO = 'SI') then
                MONTO = MONTO + VALORADIC;
            MONTO = MONTO * -1;
            MONTO = MONTO * FACTOR;
            IMPTOS = IMPTOS * FACTOR;
            execute procedure redondee(MONTO, DIG) returning_values (MONTO);
            execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
            if (IMPTOS <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTAIVA, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT F.ARTI_COD, DVDE_IVAMONTO, (DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO), TAIV_PORC, DVDE_CONSUMO
                        FROM ARTICULO A, CONTABIL_ARTICULO C, DEVOLUCIONES_VENTAS_DETALLE F, TARIFA_IVA T
                        WHERE F.DEVT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND A.TAIV_COD = T.TAIV_COD AND COAR_CTAIVAV = :CUENTA AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
                        INTO :ART, :IMPTOS, :MONTO, :PORCIVA, :VALORADIC
                    DO
                        BEGIN
                        if (IMPINC = 'S') then
                            MONTO = MONTO - IMPTOS - VALORADIC;
                        MONTO = MONTO * -1;
                        MONTO = MONTO * FACTOR;
                        IMPTOS = IMPTOS * FACTOR;
                        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                        execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                        if (IMPTOS <> 0) then
                            BEGIN
                            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :IMPTOS, 0, :MONTO, :PORCIVA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                            NROI = NROI + 1;
                            SUMA = SUMA + IMPTOS;
                            END
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                    NROI = NROI + 1;
                    SUMA = SUMA + IMPTOS;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA + IMPTOS;
                    END
                END   /* IMPTOS <> 0 */
            END /* FOR */
        END /* IVA X ARTICULO */
    if (IVA = 'K') then /* IVA EN CTA CONSTANTE */
        BEGIN
        SELECT SUM(DVDE_IVAMONTO), SUM(DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO), SUM(DVDE_CONSUMO)
            FROM DEVOLUCIONES_VENTAS_DETALLE F
            WHERE F.DEVT_ID = :IDDOC  AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
            INTO :IMPTOS, :MONTO, :VALORADIC;
        if (FOMENTO = 'SI') then
            MONTO = MONTO + VALORADIC;
        MONTO = MONTO * -1;
        MONTO = MONTO * FACTOR;
        IMPTOS = IMPTOS * FACTOR;
        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
        execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
        if (IMPTOS <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTAIVA, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT F.ARTI_COD, (DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO), DVDE_IVAMONTO, TAIV_PORC, DVDE_CONSUMO
                    FROM ARTICULO A, DEVOLUCIONES_VENTAS_DETALLE F, TARIFA_IVA T
                    WHERE F.DEVT_ID = :IDDOC AND A.TAIV_COD = T.TAIV_COD AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
                    INTO :ART, :MONTO, :IMPTOS, :PORCIVA, :VALORADIC
                    DO
                    BEGIN
                    if (IMPINC = 'S') then
                        MONTO = MONTO - IMPTOS - VALORADIC;
                    MONTO = MONTO * -1;
                    MONTO = MONTO * FACTOR;
                    IMPTOS = IMPTOS * FACTOR;
                    execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                    execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                    if (IMPTOS <> 0) then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', :IMPTOS, 0, :MONTO, :PORCIVA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        SUMA = SUMA + IMPTOS;
                        END
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                NROI = NROI + 1;
                SUMA = SUMA + IMPTOS;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA + IMPTOS;
                END
            END /* IMPTOS <> 0 */
        END /* IVA EN CTA CONSTANTE */
    /* EL IMPOCONSUMO */
    if ((CONSUMO = 'A') AND (FOMENTO <> 'SI')) then
        BEGIN
        FOR SELECT MAX(COAR_CTACONS), SUM(DVDE_CONSUMO)
            FROM ARTICULO A, CONTABIL_ARTICULO C, DEVOLUCIONES_VENTAS_DETALLE F
            WHERE F.DEVT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
            GROUP BY COAR_CTACONS
            INTO :CTACONSUMO, :IMPTOS
        DO
            BEGIN
            if (IMPTOS <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTACONSUMO, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, REGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT F.ARTI_COD, DVDE_CONSUMO
                        FROM ARTICULO A, CONTABIL_ARTICULO C, DEVOLUCIONES_VENTAS_DETALLE F
                        WHERE F.DEVT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTACONS = :CUENTA AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
                        INTO :ART, :IMPTOS
                    DO
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 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, :NROI, :CUENTA, :CONC, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                    NROI = NROI + 1;
                    SUMA = SUMA + IMPTOS;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA + IMPTOS;
                    END
                END /* IMPTOS <> 0 */
            END /* FOR */
        END /* CONSUMO X ARTICULO */
    if ((CONSUMO = 'K') AND (FOMENTO <> 'SI')) then
        BEGIN
        SELECT SUM(DVDE_CONSUMO)
            FROM DEVOLUCIONES_VENTAS_DETALLE F
            WHERE F.DEVT_ID = :IDDOC AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
            INTO :IMPTOS;
        if (IMPTOS <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTACONSUMO, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT F.ARTI_COD, DVDE_CONSUMO
                    FROM ARTICULO A, DEVOLUCIONES_VENTAS_DETALLE F
                    WHERE F.DEVT_ID = :IDDOC  AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
                    INTO :ART, :IMPTOS
                    DO
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTACONSUMO, :CONC, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                    NROI = NROI + 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, :NROI, :CTACONSUMO, :CONC, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA + IMPTOS;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTACONSUMO, :CONC, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA + IMPTOS;
                END
            END /* IMPTOS <> 0 */
        END /* CONSUMO EN CTA CONSTANTE */
    /* DESCUENTO */
    if ((CTADTO IS NOT NULL) AND
        (CTADTO <> '') AND
        (VRDTO <> 0)) THEN
        BEGIN
        EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTADTO, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRDTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
            NROI = NROI + 1;
            SUMA = SUMA - VRDTO;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRDTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 33);
            NROI = NROI + 1;
            SUMA = SUMA - VRDTO;
            END
        END /* DESCUENTO */
    /* VALOR ADIC */
    if ((CTAADIC IS NOT NULL) AND
        (CTAADIC <> '') AND
        (VRADIC <> 0)) THEN
        BEGIN
        EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTAADIC, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRADIC, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
            NROI = NROI + 1;
            SUMA = SUMA + VRADIC;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRADIC, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 33);
            NROI = NROI + 1;
            SUMA = SUMA + VRADIC;
            END
        END /* VR. ADIC */
    /* VALOR EXTRA */
    if ((CTAEXTRA IS NOT NULL) AND
        (CTAEXTRA <> '') AND
        (VREXTRA <> 0)) THEN
        BEGIN
        EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTAEXTRA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VREXTRA, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
            NROI = NROI + 1;
            SUMA = SUMA + VREXTRA;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VREXTRA, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 33);
            NROI = NROI + 1;
            SUMA = SUMA + VREXTRA;
            END
        END /* VR. EXTRA */
    /* RETENCION FUENTE */
    if ((RTFTE = 'C') or (RTFTE = 'K')) then
      if (VRRTFTE <> 0) then
        BEGIN
        if (RTFTE = 'C') then
            CTARTFTE = TCTARTFTE;
        EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTARTFTE, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, (:VRSUBT*-1), :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
            NROI = NROI + 1;
            SUMA = SUMA - VRRTFTE;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, (:VRSUBT*-1), :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA - VRRTFTE;
            END
        /* AUTORETENCION */
        if (FAUTORET <= fecaux) then
            BEGIN
            EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'CUENTA DE AUTORETENCION EN LA FUENTE') returning_values (CTARTFTE);
            EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTARTFTE, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :VRSUBT, :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                NROI = NROI + 1;
                SUMA = SUMA + VRRTFTE;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :VRSUBT, :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA + VRRTFTE;
                END
            END
        END /* RTFTE */
    if (RTFTE = 'A') then
      BEGIN
      FOR SELECT MAX(COAR_CTARTFTEV), MAX(COAR_RTFTE), MIN(COAR_RTBASE), SUM(DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO), SUM((DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO)*COAR_RTFTE)
        FROM CONTABIL_ARTICULO C, devoluciones_ventas_detalle F
        WHERE F.devt_id = :IDDOC AND F.ARTI_COD = C.ARTI_COD AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
        GROUP BY COAR_CTARTFTEV
        INTO :CTARTFTE, :PRTFTE, :baseadic, :MONTO, :VRRTFTE
        DO
        BEGIN
        MONTO = MONTO * FACTOR;
        if (MONTO >= BASEADIC) then
            BEGIN
            VRRTFTE = VRRTFTE * FACTOR / 100;
            execute procedure redondee(VRRTFTE, DIG) returning_values (VRRTFTE);
            execute procedure redondee(MONTO, DIG) returning_values (MONTO);
            if (VRRTFTE <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTARTFTE, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, (:MONTO*-1), :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                    NROI = NROI + 1;
                    SUMA = SUMA - VRRTFTE;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, (:MONTO*-1), :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA - VRRTFTE;
                    END
                /* AUTORETENCION */
                if (FAUTORET <= fecaux) then
                    BEGIN
                    EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'CUENTA DE AUTORETENCION EN LA FUENTE') returning_values (CTARTFTE);
                    EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTARTFTE, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
                    if (ERRORC <> 0) then
                        ERROR = ERROR + 1;
                    if (TIPOCUEN = 'C') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :MONTO, :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                        NROI = NROI + 1;
                        SUMA = SUMA + VRRTFTE;
                        END
                    if (TIPOCUEN = 'N') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :MONTO, :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NROI = NROI + 1;
                        SUMA = SUMA + VRRTFTE;
                        END
                    END
                END
            END
        END /* RTFTE */
      END
    /* RETENCION IVA */
    if ((RTIVA = 'C') or (RTIVA = 'K')) then
      if (VRRTIVA <> 0) then
        BEGIN
        if (RTIVA = 'C') then
            CTARTIVA = TCTARTIVA;
        EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTARTIVA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTIVA, (:VRIVA*-1), :PORC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
            NROI = NROI + 1;
            SUMA = SUMA - VRRTIVA;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTIVA, (:VRIVA*-1), :PORC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA - VRRTIVA;
            END
        END /* RTIVA */
    /* RETENCION DE ICA */
    if ((RTICA = 'C') or (RTICA = 'K')) then
      if (VRRTICA <> 0) then
        BEGIN
        if (RTICA = 'C') then
            CTARTICA = TCTARTICA;
        EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTARTICA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTICA, (:VRSUBT*-1), :PRTICA, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
            NROI = NROI + 1;
            SUMA = SUMA - VRRTICA;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTICA, (:VRSUBT*-1), :PRTICA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA - VRRTICA;
            END
        END /* RTICA */
    /* CIERRE EL COMPROBANTE CONTRA LA CUENTA DEL TERCERO O LA CONSTANTE */
    if ((SUMA <> 0) and ((CARTERA = 'C') or (CARTERA = 'K') or (CARTERA = 'J'))) then
        BEGIN
        if (SUMA < 0) then
            BEGIN
            DEBITO = SUMA * -1;
            CREDITO = 0;
            END
        ELSE
            BEGIN
            DEBITO = 0;
            CREDITO = SUMA;
            END
        if (CARTERA = 'C') then
            CTACARTERA = TCTACLIEN;
        if (CARTERA = 'J') then
            BEGIN
            /* BUSQUE LA CUENTA DE LA CAJA */
            SELECT CAJA_CUENTA FROM CAJAS C, PUNTO_VENTA P
                WHERE P.CAJA_ID = C.CAJA_ID AND PTVT_ID = :PTOVTA
                INTO :CTACARTERA;
            END
        EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTACARTERA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :DEBITO, :CREDITO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
        if (TIPOCUEN = 'N') then
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :DEBITO, :CREDITO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
        NROI = NROI + 1;
        END /* SUMA EN CARTERA */
    /* CALCULE COSTOS EN VENTAS */
    EXECUTE PROCEDURE COSTO_EN_VENTAS(33, :IDDOC);
    if (COSTOS = 'A') then
        BEGIN
        FOR SELECT MAX(CTACOS), SUM(cast(CANT as double precision) * COSTO)
            FROM COSTO_VENTAS WHERE TIDO_COD = 33 AND COVE_ID = :IDDOC
            GROUP BY CTACOS
            INTO :CTACOSTOS, :MONTO
        DO
            BEGIN
            if (MONTO <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTACOSTOS, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT ARTI_COD, cast(CANT as double precision) * COSTO
                        FROM COSTO_VENTAS WHERE TIDO_COD = 33 AND COVE_ID = :IDDOC AND CTACOS = :CUENTA
                        INTO :ART, :MONTO
                    DO
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                    NROI = NROI + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    END
                END /* MONTO <> 0 */
            END /* FOR */
        END /* COSTOS */
    if (COSTOS = 'K') then
        BEGIN
        SELECT SUM(cast(CANT as double precision) * COSTO)
            FROM COSTO_VENTAS WHERE TIDO_COD = 33 AND COVE_ID = :IDDOC
            INTO :MONTO;
        if (MONTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTACOSTOS, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, REGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT ARTI_COD, cast(CANT as double precision) * COSTO
                    FROM COSTO_VENTAS WHERE TIDO_COD = 33 AND COVE_ID = :IDDOC
                    INTO :ART, :MONTO
                DO
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTACOSTOS, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                    NROI = NROI + 1;
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTACOSTOS, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                NROI = NROI + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTACOSTOS, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                END
            END /* MONTO <> 0 */
        END /* COSTOS = K */
    if (INVEN = 'A') then
        BEGIN
        FOR SELECT MAX(CTAINV), SUM(cast(CANT as double precision) * COSTO)
            FROM COSTO_VENTAS WHERE TIDO_COD = 33 AND COVE_ID = :IDDOC
            GROUP BY CTAINV
            INTO :CTAINVEN, :MONTO
        DO
            BEGIN
            if (MONTO <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTAINVEN, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, REGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT ARTI_COD, cast(CANT as double precision) * COSTO
                        FROM COSTO_VENTAS WHERE TIDO_COD = 33 AND COVE_ID = :IDDOC AND CTAINV = :CUENTA
                        INTO :ART, :MONTO
                    DO
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                    NROI = NROI + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    END
                END /* MONTO <> 0 */
            END /* FOR */
        END /* INVEN = A */
    if (INVEN = 'K') then
        BEGIN
        SELECT SUM(cast(CANT as double precision) * COSTO)
            FROM COSTO_VENTAS WHERE TIDO_COD = 33 AND COVE_ID = :IDDOC
            INTO :MONTO;
        if (MONTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTAINVEN, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT ARTI_COD, cast(CANT as double precision) * COSTO
                    FROM COSTO_VENTAS WHERE TIDO_COD = 33 AND COVE_ID = :IDDOC
                    INTO :ART, :MONTO
                DO
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTAINVEN, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                    NROI = NROI + 1;
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAINVEN, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                NROI = NROI + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAINVEN, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                END
            END /* MONTO <> 0 */
        END /* INVEN = K */
    /* recorra las cuentas adicionales */
    FOR SELECT INVC_CUENTA, INVC_BASE, INVC_PORC, INVC_VALOR, INVC_DB
        FROM INTERFAZ_VENTAS_CTAS WHERE INVE_ID = :IDINTER
        INTO :CTADIC, :BASEADIC, :PORCADIC, :VALORADIC, :DBADIC
        DO
        BEGIN
        if (valoradic <> 0) then
            monto = valoradic;
        else
            BEGIN
            if (:BASEADIC = 'SUBTOTAL') then
                VALORADIC = vrsubt;
            if (:BASEADIC = 'DESCUENTO') then
                VALORADIC = VRDTO;
            if (:BASEADIC = 'IVA') then
                VALORADIC = VRIVA;
            if (:BASEADIC = 'ADICIONAL') then
                VALORADIC = VRADIC;
            if (:BASEADIC = 'EXTRA') then
                VALORADIC = VREXTRA;
            if (:BASEADIC = 'TOTAL') then
                VALORADIC = VRTOTAL;
            MONTO = VALORADIC * PORCADIC;
            END
        if (MONTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTADIC, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                if (DBADIC = 'S') then
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                ELSE
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                NROI = NROI + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                if (DBADIC = 'S') then
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                ELSE
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                END
            NROI = NROI + 1;
            END
        END
    if (error > 0) then
        ver = 'S';
    SUSPEND;
    END
   END /* EXISTE LA INTERFAZ */
  ELSE
    BEGIN
    EXECUTE PROCEDURE ERROR (33, :IDDOC, :PREF, 1);
    ERROR = ERROR + 1;
    VER = 'S';
    SUSPEND;
    END
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE DEVOLUCIONES_SIN_CONTABILIDAD(
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    ID INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    ESTADO VARCHAR(20),
    IDI INTEGER,
    IDC INTEGER)
AS
DECLARE VARIABLE VER CHAR(2);
declare variable FECICNT VARCHAR(10);
declare variable FECFCNT VARCHAR(10);
declare variable ERROR INTEGER;
declare variable idref INTEGER;
BEGIN
EXECUTE PROCEDURE fecha_a_conta(FECINI) returning_values (FECICNT);
EXECUTE PROCEDURE fecha_a_conta(FECFIN) returning_values (FECFCNT);
FOR SELECT DEVT_ID, PREF_PRE, DEVT_NUMERO FROM devoluciones_ventas WHERE DEVT_ANULADO = 'N' AND
    DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN
    INTO :ID, :PREF, :NUMERO
DO
  BEGIN
  idref = null;
  SELECT ENCO_IDREF FROM COMPROBANTE_ENCABEZADO WHERE ENCO_TIPOREF = 33 AND ENCO_FECHA >= :FECICNT AND ENCO_FECHA <= :FECFCNT and ENCO_IDREF = :id into :idref;
  if (idref IS NULL) then
  begin
   ESTADO = 'PROCESANDO';
   SUSPEND;
   SELECT MAX(INVE_ID) FROM INTERFAZ_VENTAS WHERE PREF_PRE = :PREF AND TIDO_COD = 33 INTO :IDI;
   EXECUTE PROCEDURE contabil_devolcli (:ID, :IDI) RETURNING_VALUES (:ERROR, :VER, :IDC);
   if (ERROR = 0) then
    BEGIN
    EXECUTE PROCEDURE CONTABILIZA_PENDIENTE (:IDC);
    ESTADO = 'OK';
    END
   ELSE
    ESTADO = 'ERROR';
   suspend;
  End
  END
END

^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER PROCEDURE CONTABIL_FACTURA(
    IDDOC INTEGER,
    IDINTER INTEGER)
RETURNS (
    ERROR INTEGER,
    VER CHAR(1),
    IDC INTEGER)
AS
declare variable pref varchar(4);
declare variable num varchar(6);
declare variable numero varchar(10);
declare variable fecaux date;
declare variable fecha char(8);
declare variable conc varchar(60);
declare variable venceaux date;
declare variable vence char(8);
declare variable vrdto numeric(18,2);
declare variable vradic numeric(18,2);
declare variable vrsubt numeric(18,2);
declare variable vriva numeric(18,2);
declare variable prtfte numeric(9,2);
declare variable vrrtfte numeric(18,2);
declare variable vrrtiva numeric(18,2);
declare variable prtica numeric(9,2);
declare variable vrrtica numeric(18,2);
declare variable vrtotal numeric(18,2);
declare variable vrextra numeric(18,2);
declare variable tipocomp varchar(3);
declare variable prefcont varchar(4);
declare variable ventas char(1);
declare variable ctaventas varchar(20);
declare variable iva char(1);
declare variable ctaiva varchar(20);
declare variable consumo char(1);
declare variable ctaconsumo varchar(20);
declare variable cartera char(1);
declare variable ctacartera varchar(20);
declare variable rtfte char(1);
declare variable ctartfte varchar(20);
declare variable rtiva char(1);
declare variable ctartiva varchar(20);
declare variable rtica char(1);
declare variable ctartica varchar(20);
declare variable inven char(1);
declare variable ctainven varchar(20);
declare variable costos char(1);
declare variable ctacostos varchar(20);
declare variable ctadto varchar(20);
declare variable ctaadic varchar(20);
declare variable ctaextra varchar(20);
declare variable existe char(1);
declare variable cuenta varchar(20);
declare variable monto numeric(18,2);
declare variable tipocuen char(1);
declare variable nit varchar(20);
declare variable nombre varchar(60);
declare variable proy varchar(4);
declare variable centro varchar(4);
declare variable porc numeric(5,2);
declare variable debito numeric(18,2);
declare variable credito numeric(18,2);
declare variable nroi integer;
declare variable art varchar(15);
declare variable imptos numeric(18,2);
declare variable suma numeric(18,2);
declare variable porciva numeric(9,2);
declare variable tctaclien varchar(20);
declare variable tctaventa varchar(20);
declare variable tctartfte varchar(20);
declare variable tctartiva varchar(20);
declare variable tctartica varchar(20);
declare variable ctadic varchar(20);
declare variable baseadic varchar(20);
declare variable porcadic numeric(5,2);
declare variable valoradic numeric(18,2);
declare variable dbadic char(1);
declare variable ptovta integer;
declare variable anulado char(1);
declare variable dig integer;
declare variable mercancia numeric(18,2);
declare variable fomento varchar(2);
declare variable DTOXIT varchar(2);
declare variable vrconsumo numeric(18,2);
declare variable factor double precision;
declare variable cent char(1);
declare variable AUTORET VARCHAR(10);
declare variable FAUTORET DATE;
declare variable ERRORC INTEGER;
BEGIN
EXECUTE PROCEDURE LEE_CONFIGURACION('COMPRAS', 'FACTURAS', 'USAR IMPOCONSUMO COMO PORCENTAJE DE FOMENTO') returning_values (FOMENTO);
EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'FECHA AUTORETENEDOR NO DESCONTAR RETENCIONES DEL SALDO PERO SI CONTABILIZARLAS') returning_values (AUTORET);
if (AUTORET <> '') then
    FAUTORET = CAST(AUTORET AS DATE);
else
    FAUTORET = '9999/12/31';
/* BUSQUE LA INTERFACE */
EXISTE = 'N';
SELECT 'S', TICO_COD, PRCO_PRE, INVE_VENTAS, INVE_IVA, INVE_CONSUMO, INVE_CARTERA, INVE_RTFTE, INVE_RTIVA, INVE_RTICA, INVE_COSTO, INVE_INVEN, INVE_CTAVENTAS, INVE_CTAIVA, INVE_CTACONSUMO, INVE_CTADTO, INVE_CTAADIC, INVE_CTAEXTRA, INVE_CTACARTERA, INVE_CTARTFTE, INVE_CTARTIVA, INVE_CTARTICA, INVE_CTAINVEN, INVE_CTACOSTOS, INVE_CONFIRMAR, INVE_CENTRO
    FROM INTERFAZ_VENTAS
    WHERE INVE_ID = :IDINTER
    INTO :EXISTE, :TIPOCOMP, :PREFCONT, :VENTAS, :IVA, :CONSUMO, :CARTERA, :RTFTE, :RTIVA, :RTICA, :COSTOS, :INVEN, :CTAVENTAS, :CTAIVA, :CTACONSUMO, :CTADTO, :CTAADIC, :CTAEXTRA, :CTACARTERA, :CTARTFTE, :CTARTIVA, :CTARTICA, :CTAINVEN, :CTACOSTOS, :VER, :CENT;
if (EXISTE = 'S') then
  BEGIN
    /* BORRE CUALQUEIR CONTABILIZACION PREVIA */
    DELETE FROM CONTABILIZACION WHERE CNTB_TIPOREF = 31 AND CNTB_IDREF = :IDDOC;

  /* TRAIGA EL ENCABEZADO DE LA FACTURA */
  SELECT PREF_PRE, FACT_NUMERO, FACT_FECHA, F.TERC_NIT, PTVT_ID, FACT_VENCE, FACT_DTOMONTO, FACT_ADICIONAL, FACT_IVAMONTO, FACT_EXTRA, FACT_TOTAL, FACT_RTFTEPOR, FACT_RTFTEMONTO, FACT_RTIVAPOR, FACT_RTIVAMONTO, FACT_RTICAPOR, FACT_RTICAMONTO, FACT_NOMCLIENTE, TERC_CTARTFTE, TERC_CTARTIVA, TERC_CTARTICA, TERC_CTAVENTA, TERC_CTACLIENTE, FACT_ANULADO
        FROM FACTURAS F, TERCEROS T
        WHERE FACT_ID = :IDDOC AND F.TERC_NIT = T.TERC_NIT
        INTO :PREF, :NUM, :FECAUX, :NIT, :PTOVTA, :VENCEAUX, :VRDTO, :VRADIC, :VRIVA, :VREXTRA, :VRTOTAL, :PRTFTE, :VRRTFTE, :PORC, :VRRTIVA, :PRTICA, :VRRTICA, :NOMBRE, TCTARTFTE, TCTARTIVA, TCTARTICA, TCTAVENTA, TCTACLIEN, ANULADO;
  if (ANULADO = 'N') then
    BEGIN
    /* BUSQUE EL CENTRO DEL PUNTO, LA BODEGA, O EL PREFIJO  */
    IF (CENT = 'B') THEN
        SELECT B.BODE_CENTRO, B.BODE_PROY FROM BODEGA B, FACTURAS F
            WHERE B.BODE_COD = F.BODE_COD AND F.FACT_ID = :IDDOC INTO :CENTRO, :PROY;
    IF (CENT = 'V') THEN
        SELECT V.CENT_COD, V.PROY_COD FROM VENDEDORES V, FACTURAS F
            WHERE V.VEND_COD = F.VEND_COD AND F.FACT_ID = :IDDOC INTO :CENTRO, :PROY;
    IF (CENT = 'P') THEN
        SELECT P.PREF_CENTRO,P.PREF_PROY  FROM PREFIJOS P, FACTURAS F
            WHERE P.PREF_PRE = F.PREF_PRE AND F.FACT_ID = :IDDOC AND P.TIDO_COD = 31 INTO :CENTRO, :PROY;
    NUMERO = PREF || NUM;
    SELECT SUM (FADE_CONSUMO) FROM FACTURAS_DETALLE WHERE FACT_ID = :IDDOC  AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
        INTO MERCANCIA;
    VRSUBT = VRTOTAL - VREXTRA - VRIVA - MERCANCIA; /* BASE DE RETEFTE Y RETEICA */

    EXECUTE PROCEDURE lee_configuracion ('FACTURACION', 'FACTURAS', 'DESCUENTO PIE FACTURA IGUAL A SUMA DE DESCUENTOS POR ITEM') returning_values (:DTOXIT);
    if (DTOXIT = 'SI') then
        VRDTO = 0;
    MERCANCIA = VRSUBT - VRADIC + VRDTO;
    EXECUTE PROCEDURE FECHA_A_CONTA(:FECAUX) returning_values (:FECHA);
    EXECUTE PROCEDURE FECHA_A_CONTA(:VENCEAUX) returning_values (:VENCE);
    /* REGISTRE EL ENCABEZADO CONTABLE */
    IDC = GEN_ID(ID_CONTABILIZA, 1);
    if (STRLEN(NOMBRE)> 43 ) then
      CONC = 'FV No.' || NUMERO || '-' || SUBSTR(NOMBRE,1,43);
    ELSE
      CONC = 'FV No.' || NUMERO || '-' || NOMBRE;
    INSERT INTO CONTABILIZACION (CNTB_ID, CNTB_TIPOCOMP, CNTB_PREFCNT, CNTB_NUMERO, CNTB_FECHA, CNTB_CONCEPTO, CNTB_REF, CNTB_TIPOREF, CNTB_IDREF, CNTB_PREFREF, CNTB_NUMREF, CNTB_PROCESADO)
        VALUES (:IDC, :TIPOCOMP, :PREFCONT, :NUM, :FECHA, :CONC, '', 31, :IDDOC, :PREF, :NUM, 'N');
    NROI = 0;
    SUMA = 0;
    ERROR = 0;
    /* SI NO HAY CUENTA DE DESCUENTO NI ADICIONAL CALCULE UN FACTOR PARA LAS VENTAS Y EL IVA */
    if (MERCANCIA <> 0) then
        FACTOR = CAST(VRSUBT AS DOUBLE PRECISION) / CAST(MERCANCIA AS DOUBLE PRECISION);
    ELSE
        FACTOR = 1;
    /* TRAIGA EL NUMERO DE DIGITOS PARA EL REDONDEO */
    SELECT CAST(CONF_VALOR AS INTEGER) FROM CONFIGURACION WHERE CONF_MODULO = 'FACTURACION' AND
        CONF_CATEGORIA = 'GENERAL' AND CONF_PROPIEDAD = 'REDONDEO AL MULTIPLO DE DIEZ EN TOTALES' INTO :DIG;
    /* CUENTAS DE VENTAS */
    if (VENTAS = 'A') then
        BEGIN
        FOR SELECT MAX(COAR_CTAVNT), SUM(FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), SUM(FADE_IVAMONTO), SUM(FADE_CONSUMO)
            FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_DETALLE F
            WHERE F.FACT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
            GROUP BY COAR_CTAVNT
            INTO :CTAVENTAS, :MONTO, :IMPTOS, :VRCONSUMO
            DO
            BEGIN
            if (FOMENTO = 'SI') then
                MONTO = MONTO + VRCONSUMO;
            if ((CTADTO IS NULL) OR (CTADTO = '')) then
                MONTO = MONTO * FACTOR;
            execute procedure redondee(MONTO, DIG) returning_values (MONTO);
            if (MONTO <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTAVENTAS, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT F.ARTI_COD, (FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), FADE_CONSUMO
                        FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_DETALLE F
                        WHERE F.FACT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTAINV = :CUENTA AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
                        INTO :ART, :MONTO, :IMPTOS
                    DO
                        BEGIN
                        if (FOMENTO = 'SI') then
                            MONTO = MONTO + IMPTOS;
                        if ((CTADTO IS NULL) OR (CTADTO = '')) then
                            MONTO = MONTO * FACTOR;
                        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                        if (MONTO <> 0) then
                            BEGIN
                            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                            NROI = NROI + 1;
                            SUMA = SUMA - MONTO;
                            END
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    NROI = NROI + 1;
                    SUMA = SUMA - MONTO;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA - MONTO;
                    END
                END /* MONTO <> 0 */
            END /* FOR */
        END /* VENTAS X ARTICULO */
     IF ((VENTAS = 'C') OR (VENTAS = 'K')) THEN
        BEGIN
        IF (VENTAS = 'C') THEN
            CTAVENTAS = TCTAVENTA;
        SELECT SUM(FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), SUM(FADE_IVAMONTO), SUM (FADE_CONSUMO)
            FROM FACTURAS_DETALLE F
            WHERE F.FACT_ID = :IDDOC AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
            INTO :MONTO, :IMPTOS, :VRCONSUMO;
        if (FOMENTO = 'SI') then
            MONTO = MONTO + VRCONSUMO;
        if ((CTADTO IS NULL) OR (CTADTO = '')) then
            MONTO = MONTO * FACTOR;
        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
        if (MONTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTAVENTAS, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT F.ARTI_COD, (FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), FADE_CONSUMO
                    FROM ARTICULO A, FACTURAS_DETALLE F
                    WHERE F.FACT_ID = :IDDOC AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
                    INTO :ART, :MONTO, :IMPTOS
                    DO
                    BEGIN
                    if (FOMENTO = 'SI') then
                        MONTO = MONTO + VRCONSUMO;
                    if ((CTADTO IS NULL) OR (CTADTO = '')) then
                        MONTO = MONTO * FACTOR;
                    execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                    if (MONTO <> 0) then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        SUMA = SUMA - MONTO;
                        END
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - MONTO;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - MONTO;
                END
            END /* MONTO <> 0 */
        END /* VENTAS DE CLIENTE O CONSTANTE */
    /* EL IVA EN VENTAS */
    if (IVA = 'A') then
        BEGIN
        FOR SELECT MAX(COAR_CTAIVAV), SUM(FADE_IVAMONTO), SUM(FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), sum(FADE_CONSUMO)
            FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_DETALLE F
            WHERE F.FACT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
            GROUP BY COAR_CTAIVAV
            INTO :CTAIVA, :IMPTOS, :MONTO, :VALORADIC
        DO
            BEGIN
            if (FOMENTO = 'SI') then
                MONTO = MONTO + VALORADIC;
            MONTO = MONTO * -1;
            MONTO = MONTO * FACTOR;
            IMPTOS = IMPTOS * FACTOR;
            execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
            execute procedure redondee(MONTO, DIG) returning_values (MONTO);
            if (IMPTOS <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTAIVA, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT F.ARTI_COD, FADE_IVAMONTO, (FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), TAIV_PORC, FADE_CONSUMO
                        FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_DETALLE F, TARIFA_IVA T
                        WHERE F.FACT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTAIVAV = :CUENTA AND A.TAIV_COD = T.TAIV_COD AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
                        INTO :ART, :IMPTOS, :MONTO, :PORCIVA, :VALORADIC
                    DO
                        BEGIN
                        if (FOMENTO = 'SI') then
                            MONTO = MONTO + VALORADIC;
                        MONTO = MONTO * -1;
                        MONTO = MONTO * FACTOR;
                        IMPTOS = IMPTOS * FACTOR;
                        execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                        if (IMPTOS <> 0) then
                            BEGIN
                            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, :MONTO, :PORCIVA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                            NROI = NROI + 1;
                            SUMA = SUMA + DEBITO - CREDITO;
                            END
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, :MONTO, ABS(:IMPTOS*100/:MONTO), :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    NROI = NROI + 1;
                    SUMA = SUMA - IMPTOS;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, :MONTO, ABS(:IMPTOS*100/:MONTO), :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA - IMPTOS;
                    END
                END   /* IMPTOS <> 0 */
            END /* FOR */
        END /* IVA X ARTICULO */
    if (IVA = 'K') then /* IVA EN CTA CONSTANTE */
        BEGIN
        SELECT SUM(FADE_IVAMONTO), SUM(FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), SUM(FADE_CONSUMO)
            FROM FACTURAS_DETALLE F
            WHERE F.FACT_ID = :IDDOC and FADE_IVAMONTO <> 0 AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
            INTO :IMPTOS, :MONTO, :valoradic;
        if (FOMENTO = 'SI') then
            MONTO = MONTO + VALORADIC;
        MONTO = MONTO * -1;
        MONTO = MONTO * FACTOR;
        IMPTOS = IMPTOS * FACTOR;
        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
        execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
        if (IMPTOS <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTAIVA, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT F.ARTI_COD, (FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), FADE_IVAMONTO, TAIV_PORC, FADE_CONSUMO
                    FROM ARTICULO A, FACTURAS_DETALLE F, TARIFA_IVA T
                    WHERE F.FACT_ID = :IDDOC AND A.TAIV_COD = T.TAIV_COD AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
                    INTO :ART, :MONTO, :IMPTOS, :PORCIVA, :VALORADIC
                    DO
                    BEGIN
                    if (FOMENTO = 'SI') then
                        MONTO = MONTO + VALORADIC;
                    MONTO = MONTO * -1;
                    MONTO = MONTO * FACTOR;
                    IMPTOS = IMPTOS * FACTOR;
                    execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                    execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                    if (IMPTOS <> 0) then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', 0, :IMPTOS, :MONTO, :PORCIVA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        SUMA = SUMA - IMPTOS;
                        END
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', 0, :IMPTOS, :MONTO, ABS(:IMPTOS*100/:MONTO), :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - IMPTOS;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', 0, :IMPTOS, :MONTO, ABS(:IMPTOS*100/:MONTO), :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - IMPTOS;
                END
            END /* IMPTOS <> 0 */
        END /* IVA EN CTA CONSTANTE */
    /* EL IMPOCONSUMO */
    if ((CONSUMO = 'A') AND (FOMENTO <> 'SI')) then
        BEGIN
        FOR SELECT MAX(COAR_CTACONS), SUM(FADE_CONSUMO)
            FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_DETALLE F
            WHERE F.FACT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
            GROUP BY COAR_CTACONS
            INTO :CTACONSUMO, :IMPTOS
        DO
            BEGIN
            execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
            if (IMPTOS <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTACONSUMO, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, REGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT F.ARTI_COD, FADE_CONSUMO
                        FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_DETALLE F
                        WHERE F.FACT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTACONS = :CUENTA AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
                        INTO :ART, :IMPTOS
                    DO
                        BEGIN
                        execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                        if (IMPTOS <> 0) then
                            BEGIN
                            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                            NROI = NROI + 1;
                            SUMA = SUMA - IMPTOS;
                            END
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    NROI = NROI + 1;
                    SUMA = SUMA - IMPTOS;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA - IMPTOS;
                    END
                END /* IMPTOS <> 0 */
            END /* FOR */
        END /* CONSUMO X ARTICULO */
    if ((CONSUMO = 'K') AND (FOMENTO <> 'SI')) then /* CONSUMO EN CTA CONSTANTE */
        BEGIN
        SELECT SUM(FADE_CONSUMO)
            FROM FACTURAS_DETALLE F
            WHERE F.FACT_ID = :IDDOC AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
            INTO :IMPTOS;
        execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
        if (IMPTOS <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTACONSUMO, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT F.ARTI_COD, FADE_CONSUMO
                    FROM ARTICULO A, FACTURAS_DETALLE F
                    WHERE F.FACT_ID = :IDDOC AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
                    INTO :ART, :IMPTOS
                    DO
                    BEGIN
                    execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                    if (IMPTOS <> 0) then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CTACONSUMO, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        SUMA = SUMA - IMPTOS;
                        END
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTACONSUMO, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - IMPTOS;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTACONSUMO, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - IMPTOS;
                END
            END /* IMPTOS <> 0 */
        END /* CONSUMO EN CTA CONSTANTE */
    /* DESCUENTO */
    if ((CTADTO IS NOT NULL) AND (CTADTO <> '')) then
        BEGIN
        execute procedure redondee(VRDTO, DIG) returning_values (VRDTO);
        if (VRDTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTADTO, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRDTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA + VRDTO;
                END
            if (TIPOCUEN = 'N') then
                    BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRDTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA + VRDTO;
                END
            END
        END /* DESCUENTO */
    /* VALOR ADIC */
    if ((CTAADIC IS NOT NULL) AND (CTAADIC <> '')) then
        BEGIN
        execute procedure redondee(VRADIC, DIG) returning_values (VRADIC);
        if (VRADIC <> 0) THEN
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTAADIC, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRADIC, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - VRADIC;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRADIC, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - VRADIC;
                END
            END
        END /* VR. ADIC */
    /* VALOR EXTRA */
    if ((CTAEXTRA IS NOT NULL) AND (CTAEXTRA <> '')) THEN
        BEGIN
        execute procedure redondee(VREXTRA, DIG) returning_values (VREXTRA);
        if (VREXTRA <> 0) THEN
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTAEXTRA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VREXTRA, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - VREXTRA;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VREXTRA, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - VREXTRA;
                END
            END
        END /* VR. EXTRA */
    /* DESCUENTE EL IMPOCONSUMO */
    SELECT SUM(FADE_CONSUMO)
        FROM FACTURAS_DETALLE F WHERE F.FACT_ID = :IDDOC AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL)) INTO :IMPTOS;
    vrsubt = vrsubt - IMPTOS;
    /* RETENCION FUENTE */
    if ((RTFTE = 'C') or (RTFTE = 'K')) then
      BEGIN
      execute procedure redondee(VRRTFTE, DIG) returning_values (VRRTFTE);
      if (VRRTFTE <> 0) then
        BEGIN
        if (RTFTE = 'C') then
            CTARTFTE = TCTARTFTE;
        EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTARTFTE, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :VRSUBT, :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTFTE;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :VRSUBT, :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTFTE;
            END
        /* AUTORETENCION */
        if (FAUTORET <= fecaux) then
            BEGIN
            EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'CUENTA DE AUTORETENCION EN LA FUENTE') returning_values (CTARTFTE);
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTARTFTE INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERROR (31, :IDDOC, :CTARTFTE, 2);
                CUENTA = CTARTFTE;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                begin
                EXECUTE PROCEDURE ERROR (31, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, (:VRSUBT*-1), :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - VRRTFTE;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, (:VRSUBT*-1), :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - VRRTFTE;
                END
            END
        END /* RTFTE */
      END
    if (RTFTE = 'A') then
      BEGIN
      FOR SELECT MAX(COAR_CTARTFTEV), MAX(COAR_RTFTE), MIN(COAR_RTBASE), SUM(FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), SUM((FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO)*COAR_RTFTE)
        FROM CONTABIL_ARTICULO C, FACTURAS_DETALLE F
        WHERE F.FACT_ID = :IDDOC AND F.ARTI_COD = C.ARTI_COD AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
        GROUP BY COAR_CTARTFTEV
        INTO :CTARTFTE, :PRTFTE, :baseadic, :MONTO, :VRRTFTE
        DO
        BEGIN
        MONTO = MONTO * FACTOR;
        if (MONTO >= BASEADIC) then
            BEGIN
            VRRTFTE = VRRTFTE * FACTOR / 100;
            execute procedure redondee(VRRTFTE, DIG) returning_values (VRRTFTE);
            execute procedure redondee(MONTO, DIG) returning_values (MONTO);
            if (VRRTFTE <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTARTFTE, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :MONTO, :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    NROI = NROI + 1;
                    SUMA = SUMA + VRRTFTE;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :MONTO, :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA + VRRTFTE;
                    END
                /* AUTORETENCION */
                if (FAUTORET <= fecaux) then
                    BEGIN
                    EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'CUENTA DE AUTORETENCION EN LA FUENTE') returning_values (CTARTFTE);
                    EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTARTFTE, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
                    if (ERRORC <> 0) then
                        ERROR = ERROR + 1;
                    if (TIPOCUEN = 'C') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, (:MONTO*-1), :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                        NROI = NROI + 1;
                        SUMA = SUMA - VRRTFTE;
                        END
                    if (TIPOCUEN = 'N') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, (:MONTO*-1), :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NROI = NROI + 1;
                        SUMA = SUMA - VRRTFTE;
                        END
                    END
                END
            END
        END /* RTFTE */
      END
    /* RETENCION IVA */
    if ((RTIVA = 'C') or (RTIVA = 'K')) then
      BEGIN
      execute procedure redondee(VRRTIVA, DIG) returning_values (VRRTIVA);
      if (VRRTIVA <> 0) then
        BEGIN
        if (RTIVA = 'C') then
            CTARTIVA = TCTARTIVA;
        EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTARTIVA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTIVA, 0, :VRIVA, :PORC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTIVA;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTIVA, 0, :VRIVA, :PORC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTIVA;
            END
        END /* RTIVA */
      END
    /* RETENCION DE ICA */
    if ((RTICA = 'C') or (RTICA = 'K')) then
      BEGIN
      execute procedure redondee(VRRTICA, DIG) returning_values (VRRTICA);
      if (VRRTICA <> 0) then
        BEGIN
        if (RTICA = 'C') then
            CTARTICA = TCTARTICA;
        EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTARTICA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTICA, 0, :VRSUBT, :PRTICA, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTICA;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTICA, 0, :VRSUBT, :PRTICA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTICA;
            END
        END /* RTICA */
      END
    /* CIERRE EL COMPROBANTE CONTRA LA CUENTA DEL TERCERO O LA CONSTANTE */
    if ((SUMA <> 0) and ((CARTERA = 'C') or (CARTERA = 'K') or (CARTERA = 'J'))) then
        BEGIN
        if (SUMA < 0) then
            BEGIN
            DEBITO = SUMA * -1;
            CREDITO = 0;
            END
        ELSE
            BEGIN
            DEBITO = 0;
            CREDITO = SUMA;
            END
        if (CARTERA = 'C') then
            CTACARTERA = TCTACLIEN;
        if (CARTERA = 'J') then
            BEGIN
            /* BUSQUE LA CUENTA DE LA CAJA */
            SELECT CAJA_CUENTA FROM CAJAS C, PUNTO_VENTA P
                WHERE P.CAJA_ID = C.CAJA_ID AND PTVT_ID = :PTOVTA
                INTO :CTACARTERA;
            END
        EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTACARTERA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :DEBITO, :CREDITO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
        if (TIPOCUEN = 'N') then
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :DEBITO, :CREDITO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
        NROI = NROI + 1;
        END /* SUMA EN CARTERA */
    /* CALCULE COSTOS EN VENTAS */
    EXECUTE PROCEDURE COSTO_EN_VENTAS(31, :IDDOC);
    if (COSTOS = 'A') then
        BEGIN
        FOR SELECT MAX(CTACOS), SUM(CAST(CANT AS DOUBLE PRECISION) * COSTO)
            FROM COSTO_VENTAS WHERE TIDO_COD = 31 AND COVE_ID = :iddoc
            GROUP BY CTACOS
            INTO :CTACOSTOS, :MONTO
        DO
            BEGIN
            if (MONTO <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTACOSTOS, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT ARTI_COD, CANT * COSTO
                        FROM COSTO_VENTAS WHERE TIDO_COD = 31 AND COVE_ID = :iddoc AND CTACOS = :CUENTA
                        INTO :ART, :MONTO
                    DO
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    NROI = NROI + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    END
                END /* MONTO <> 0 */
            END /* FOR */
        END /* COSTOS */
    if (COSTOS = 'K') then
        BEGIN
        SELECT SUM(CAST(CANT AS DOUBLE PRECISION) * COSTO)
            FROM COSTO_VENTAS WHERE TIDO_COD = 31 AND COVE_ID = :iddoc
            INTO :MONTO;
        if (MONTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTACOSTOS, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, REGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT ARTI_COD, CANT * COSTO
                    FROM COSTO_VENTAS WHERE TIDO_COD = 31 AND COVE_ID = :iddoc
                    INTO :ART, :MONTO
                DO
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTACOSTOS, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                    NROI = NROI + 1;
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTACOSTOS, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTACOSTOS, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                END
            END /* MONTO <> 0 */
        END /* COSTOS = K */
    if (INVEN = 'A') then
        BEGIN
        FOR SELECT MAX(CTAINV), SUM(CAST(CANT AS DOUBLE PRECISION) * COSTO)
            FROM COSTO_VENTAS WHERE TIDO_COD = 31 AND COVE_ID = :iddoc
            GROUP BY CTAINV
            INTO :CTAINVEN, :MONTO
        DO
            BEGIN
            if (MONTO <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTAINVEN, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, REGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT ARTI_COD, CANT * COSTO
                        FROM COSTO_VENTAS WHERE TIDO_COD = 31 AND COVE_ID = :iddoc AND CTAINV = :CUENTA
                        INTO :ART, :MONTO
                    DO
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    NROI = NROI + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    END
                END /* MONTO <> 0 */
            END /* FOR */
        END /* INVEN = A */
    if (INVEN = 'K') then
        BEGIN
        SELECT SUM(CAST(CANT AS DOUBLE PRECISION) * COSTO)
            FROM COSTO_VENTAS WHERE TIDO_COD = 31 AND COVE_ID = :iddoc
            INTO :MONTO;
        if (MONTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTAINVEN, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT ARTI_COD, CANT * COSTO
                    FROM COSTO_VENTAS WHERE TIDO_COD = 31 AND COVE_ID = :iddoc
                    INTO :ART, :MONTO
                DO
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTAINVEN, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                    NROI = NROI + 1;
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAINVEN, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAINVEN, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                END
            END /* MONTO <> 0 */
        END /* INVEN = K */
    /* recorra las cuentas adicionales */
    FOR SELECT INVC_CUENTA, INVC_BASE, INVC_PORC, INVC_VALOR, INVC_DB
        FROM INTERFAZ_VENTAS_CTAS
        WHERE INVE_ID = :IDINTER
        INTO :CTADIC, :BASEADIC, :PORCADIC, :VALORADIC, :DBADIC
        DO
        BEGIN
        if (VALORADIC <> 0) then
            MONTO = VALORADIC;
        ELSE
            BEGIN
            if (:BASEADIC = 'SUBTOTAL') then
                VALORADIC = vrsubt;
            if (:BASEADIC = 'DESCUENTO') then
                VALORADIC = VRDTO;
            if (:BASEADIC = 'IVA') then
                VALORADIC = VRIVA;
            if (:BASEADIC = 'ADICIONAL') then
                VALORADIC = VRADIC;
            if (:BASEADIC = 'EXTRA') then
                VALORADIC = VREXTRA;
            if (:BASEADIC = 'TOTAL') then
                VALORADIC = VRTOTAL;
            MONTO = VALORADIC * PORCADIC / 100;
            END
        if (MONTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTADIC, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                if (DBADIC = 'S') then
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                ELSE
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                if (DBADIC = 'S') then
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                ELSE
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                END
            NROI = NROI + 1;
            END
        END
    if (ERROR > 0) then
        VER = 'S';
    SUSPEND;
    END /* NO ANULADO */
  END /* EXISTE LA INTERFAZ */
ELSE
    BEGIN
    EXECUTE PROCEDURE ERROR (31, :IDDOC, :PREF, 1);
    ERROR = ERROR + 1;
    VER = 'S';
    SUSPEND;
    END
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE FACTURAS_SIN_CONTABILIDAD(
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    ID INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    ESTADO VARCHAR(20),
    IDI INTEGER,
    IDC INTEGER)
AS
DECLARE VARIABLE VER CHAR(2);
declare variable FECICNT VARCHAR(10);
declare variable FECFCNT VARCHAR(10);
declare variable ERROR INTEGER;
declare variable idref INTEGER;
BEGIN
EXECUTE PROCEDURE fecha_a_conta(FECINI) returning_values (FECICNT);
EXECUTE PROCEDURE fecha_a_conta(FECFIN) returning_values (FECFCNT);
FOR SELECT FACT_ID, PREF_PRE, FACT_NUMERO FROM FACTURAS WHERE FACT_ANULADO = 'N' AND
    FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN INTO :ID, :PREF, :NUMERO
DO
  BEGIN
  idref = null;
  SELECT ENCO_IDREF FROM COMPROBANTE_ENCABEZADO WHERE ENCO_TIPOREF = 31 AND ENCO_FECHA >= :FECICNT AND ENCO_FECHA <= :FECFCNT and ENCO_IDREF = :ID into :idref;
  if (idref IS NULL) then
  begin
   ESTADO = 'PROCESANDO';
   ERROR = NULL;
   SUSPEND;
   SELECT MAX(INVE_ID) FROM INTERFAZ_VENTAS WHERE PREF_PRE = :PREF AND TIDO_COD = 31 INTO :IDI;
   EXECUTE PROCEDURE CONTABIL_FACTURA (:ID, :IDI) RETURNING_VALUES (:ERROR, VER, :IDC);
   if ((ERROR = 0) or (error IS NULL)) then
    BEGIN
    EXECUTE PROCEDURE CONTABILIZA_PENDIENTE (:IDC);
    ESTADO = 'OK';
    END
   ELSE
    ESTADO = 'ERROR';
   suspend;
  end
  END
END

^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER PROCEDURE CONTABIL_FACTURA_IVA(
    IDDOC INTEGER,
    IDINTER INTEGER)
RETURNS (
    ERROR INTEGER,
    VER CHAR(1),
    IDC INTEGER)
AS
declare variable pref varchar(4);
declare variable num varchar(6);
declare variable numero varchar(10);
declare variable fecaux date;
declare variable fecha char(8);
declare variable conc varchar(60);
declare variable venceaux date;
declare variable vence char(8);
declare variable vrdto numeric(18,2);
declare variable vradic numeric(18,2);
declare variable vrsubt numeric(18,2);
declare variable vriva numeric(18,2);
declare variable prtfte numeric(9,2);
declare variable vrrtfte numeric(18,2);
declare variable vrrtiva numeric(18,2);
declare variable prtica numeric(9,2);
declare variable vrrtica numeric(18,2);
declare variable vrtotal numeric(18,2);
declare variable vrextra numeric(18,2);
declare variable tipocomp varchar(3);
declare variable prefcont varchar(4);
declare variable ventas char(1);
declare variable ctaventas varchar(20);
declare variable iva char(1);
declare variable ctaiva varchar(20);
declare variable consumo char(1);
declare variable ctaconsumo varchar(20);
declare variable cartera char(1);
declare variable ctacartera varchar(20);
declare variable rtfte char(1);
declare variable ctartfte varchar(20);
declare variable rtiva char(1);
declare variable ctartiva varchar(20);
declare variable rtica char(1);
declare variable ctartica varchar(20);
declare variable inven char(1);
declare variable ctainven varchar(20);
declare variable costos char(1);
declare variable ctacostos varchar(20);
declare variable ctadto varchar(20);
declare variable ctaadic varchar(20);
declare variable ctaextra varchar(20);
declare variable existe char(1);
declare variable cuenta varchar(20);
declare variable monto numeric(18,2);
declare variable tipocuen char(1);
declare variable nit varchar(20);
declare variable nombre varchar(60);
declare variable proy varchar(4);
declare variable centro varchar(4);
declare variable porc numeric(5,2);
declare variable debito numeric(18,2);
declare variable credito numeric(18,2);
declare variable nroi integer;
declare variable art varchar(15);
declare variable imptos numeric(18,2);
declare variable suma numeric(18,2);
declare variable porciva numeric(9,2);
declare variable tctaclien varchar(20);
declare variable tctaventa varchar(20);
declare variable tctartfte varchar(20);
declare variable tctartiva varchar(20);
declare variable tctartica varchar(20);
declare variable ctadic varchar(20);
declare variable baseadic varchar(20);
declare variable porcadic numeric(5,2);
declare variable valoradic numeric(18,2);
declare variable dbadic char(1);
declare variable ptovta integer;
declare variable anulado char(1);
declare variable dig integer;
declare variable mercancia numeric(18,2);
declare variable fomento varchar(2);
declare variable DTOXIT varchar(2);
declare variable vrconsumo numeric(18,2);
declare variable factor double precision;
declare variable cent char(1);
declare variable AUTORET VARCHAR(10);
declare variable FAUTORET DATE;
declare variable ERRORC INTEGER;
BEGIN
EXECUTE PROCEDURE LEE_CONFIGURACION('COMPRAS', 'FACTURAS', 'USAR IMPOCONSUMO COMO PORCENTAJE DE FOMENTO') returning_values (FOMENTO);
EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'FECHA AUTORETENEDOR NO DESCONTAR RETENCIONES DEL SALDO PERO SI CONTABILIZARLAS') returning_values (AUTORET);
if (AUTORET <> '') then
    FAUTORET = CAST(AUTORET AS DATE);
else
    FAUTORET = '9999/12/31';
/* BUSQUE LA INTERFACE */
EXISTE = 'N';
SELECT 'S', TICO_COD, PRCO_PRE, INVE_VENTAS, INVE_IVA, INVE_CONSUMO, INVE_CARTERA, INVE_RTFTE, INVE_RTIVA, INVE_RTICA, INVE_COSTO, INVE_INVEN, INVE_CTAVENTAS, INVE_CTAIVA, INVE_CTACONSUMO, INVE_CTADTO, INVE_CTAADIC, INVE_CTAEXTRA, INVE_CTACARTERA, INVE_CTARTFTE, INVE_CTARTIVA, INVE_CTARTICA, INVE_CTAINVEN, INVE_CTACOSTOS, INVE_CONFIRMAR, INVE_CENTRO
    FROM INTERFAZ_VENTAS
    WHERE INVE_ID = :IDINTER
    INTO :EXISTE, :TIPOCOMP, :PREFCONT, :VENTAS, :IVA, :CONSUMO, :CARTERA, :RTFTE, :RTIVA, :RTICA, :COSTOS, :INVEN, :CTAVENTAS, :CTAIVA, :CTACONSUMO, :CTADTO, :CTAADIC, :CTAEXTRA, :CTACARTERA, :CTARTFTE, :CTARTIVA, :CTARTICA, :CTAINVEN, :CTACOSTOS, :VER, :CENT;
if (EXISTE = 'S') then
  BEGIN
    /* BORRE CUALQUEIR CONTABILIZACION PREVIA */
    DELETE FROM CONTABILIZACION WHERE CNTB_TIPOREF = 31 AND CNTB_IDREF = :IDDOC;

  /* TRAIGA EL ENCABEZADO DE LA FACTURA */
  SELECT PREF_PRE, FACT_NUMERO, FACT_FECHA, F.TERC_NIT, PTVT_ID, FACT_VENCE, FACT_DTOMONTO, FACT_ADICIONAL, FACT_IVAMONTO, FACT_EXTRA, FACT_TOTAL, FACT_RTFTEPOR, FACT_RTFTEMONTO, FACT_RTIVAPOR, FACT_RTIVAMONTO, FACT_RTICAPOR, FACT_RTICAMONTO, FACT_NOMCLIENTE, TERC_CTARTFTE, TERC_CTARTIVA, TERC_CTARTICA, TERC_CTAVENTA, TERC_CTACLIENTE, FACT_ANULADO
        FROM FACTURAS F, TERCEROS T
        WHERE FACT_ID = :IDDOC AND F.TERC_NIT = T.TERC_NIT
        INTO :PREF, :NUM, :FECAUX, :NIT, :PTOVTA, :VENCEAUX, :VRDTO, :VRADIC, :VRIVA, :VREXTRA, :VRTOTAL, :PRTFTE, :VRRTFTE, :PORC, :VRRTIVA, :PRTICA, :VRRTICA, :NOMBRE, TCTARTFTE, TCTARTIVA, TCTARTICA, TCTAVENTA, TCTACLIEN, ANULADO;
  if (ANULADO = 'N') then
    BEGIN
    /* BUSQUE EL CENTRO DEL PUNTO, LA BODEGA, O EL PREFIJO  */
    IF (CENT = 'B') THEN
        SELECT B.BODE_CENTRO, B.BODE_PROY FROM BODEGA B, FACTURAS F
            WHERE B.BODE_COD = F.BODE_COD AND F.FACT_ID = :IDDOC INTO :CENTRO, :PROY;
    IF (CENT = 'V') THEN
        SELECT V.CENT_COD, V.PROY_COD FROM VENDEDORES V, FACTURAS F
            WHERE V.VEND_COD = F.VEND_COD AND F.FACT_ID = :IDDOC INTO :CENTRO, :PROY;
    IF (CENT = 'P') THEN
        SELECT P.PREF_CENTRO,P.PREF_PROY  FROM PREFIJOS P, FACTURAS F
            WHERE P.PREF_PRE = F.PREF_PRE AND F.FACT_ID = :IDDOC AND P.TIDO_COD = 31 INTO :CENTRO, :PROY;
    NUMERO = PREF || NUM;
    SELECT SUM (FADE_CONSUMO) FROM FACTURAS_DETALLE WHERE FACT_ID = :IDDOC  AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
        INTO MERCANCIA;
    VRSUBT = VRTOTAL - VREXTRA - VRIVA - MERCANCIA; /* BASE DE RETEFTE Y RETEICA */

    EXECUTE PROCEDURE lee_configuracion ('FACTURACION', 'FACTURAS', 'DESCUENTO PIE FACTURA IGUAL A SUMA DE DESCUENTOS POR ITEM') returning_values (:DTOXIT);
    if (DTOXIT = 'SI') then
        VRDTO = 0;
    MERCANCIA = VRSUBT - VRADIC + VRDTO;
    EXECUTE PROCEDURE FECHA_A_CONTA(:FECAUX) returning_values (:FECHA);
    EXECUTE PROCEDURE FECHA_A_CONTA(:VENCEAUX) returning_values (:VENCE);
    /* REGISTRE EL ENCABEZADO CONTABLE */
    IDC = GEN_ID(ID_CONTABILIZA, 1);
    if (STRLEN(NOMBRE)> 43 ) then
      CONC = 'FV No.' || NUMERO || '-' || SUBSTR(NOMBRE,1,43);
    ELSE
      CONC = 'FV No.' || NUMERO || '-' || NOMBRE;
    INSERT INTO CONTABILIZACION (CNTB_ID, CNTB_TIPOCOMP, CNTB_PREFCNT, CNTB_NUMERO, CNTB_FECHA, CNTB_CONCEPTO, CNTB_REF, CNTB_TIPOREF, CNTB_IDREF, CNTB_PREFREF, CNTB_NUMREF, CNTB_PROCESADO)
        VALUES (:IDC, :TIPOCOMP, :PREFCONT, :NUM, :FECHA, :CONC, '', 31, :IDDOC, :PREF, :NUM, 'N');
    NROI = 0;
    SUMA = 0;
    ERROR = 0;
    /* SI NO HAY CUENTA DE DESCUENTO NI ADICIONAL CALCULE UN FACTOR PARA LAS VENTAS Y EL IVA */
    if (MERCANCIA <> 0) then
        FACTOR = CAST(VRSUBT AS DOUBLE PRECISION) / CAST(MERCANCIA AS DOUBLE PRECISION);
    ELSE
        FACTOR = 1;
    /* TRAIGA EL NUMERO DE DIGITOS PARA EL REDONDEO */
    SELECT CAST(CONF_VALOR AS INTEGER) FROM CONFIGURACION WHERE CONF_MODULO = 'FACTURACION' AND
        CONF_CATEGORIA = 'GENERAL' AND CONF_PROPIEDAD = 'REDONDEO AL MULTIPLO DE DIEZ EN TOTALES' INTO :DIG;
    /* CUENTAS DE VENTAS */
    if (VENTAS = 'A') then
        BEGIN
        FOR SELECT MAX(TAIV_CTAVTA), SUM(FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), SUM(FADE_IVAMONTO), SUM(FADE_CONSUMO)
            FROM TARIFA_IVA T, FACTURAS_DETALLE F
            WHERE F.FACT_ID = :IDDOC AND F.fade_ivaporc = T.taiv_porc AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
            GROUP BY TAIV_CTAVTA
            INTO :CTAVENTAS, :MONTO, :IMPTOS, :VRCONSUMO
            DO
            BEGIN
            if (FOMENTO = 'SI') then
                MONTO = MONTO + VRCONSUMO;
            if ((CTADTO IS NULL) OR (CTADTO = '')) then
                MONTO = MONTO * FACTOR;
            execute procedure redondee(MONTO, DIG) returning_values (MONTO);
            if (MONTO <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTAVENTAS, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT F.ARTI_COD, (FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), FADE_CONSUMO
                        FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_DETALLE F
                        WHERE F.FACT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTAINV = :CUENTA AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
                        INTO :ART, :MONTO, :IMPTOS
                    DO
                        BEGIN
                        if (FOMENTO = 'SI') then
                            MONTO = MONTO + IMPTOS;
                        if ((CTADTO IS NULL) OR (CTADTO = '')) then
                            MONTO = MONTO * FACTOR;
                        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                        if (MONTO <> 0) then
                            BEGIN
                            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                            NROI = NROI + 1;
                            SUMA = SUMA - MONTO;
                            END
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    NROI = NROI + 1;
                    SUMA = SUMA - MONTO;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA - MONTO;
                    END
                END /* MONTO <> 0 */
            END /* FOR */
        END /* VENTAS X ARTICULO */
     IF ((VENTAS = 'C') OR (VENTAS = 'K')) THEN
        BEGIN
        IF (VENTAS = 'C') THEN
            CTAVENTAS = TCTAVENTA;
        SELECT SUM(FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), SUM(FADE_IVAMONTO), SUM (FADE_CONSUMO)
            FROM FACTURAS_DETALLE F
            WHERE F.FACT_ID = :IDDOC AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
            INTO :MONTO, :IMPTOS, :VRCONSUMO;
        if (FOMENTO = 'SI') then
            MONTO = MONTO + VRCONSUMO;
        if ((CTADTO IS NULL) OR (CTADTO = '')) then
            MONTO = MONTO * FACTOR;
        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
        if (MONTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTAVENTAS, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT F.ARTI_COD, (FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), FADE_CONSUMO
                    FROM ARTICULO A, FACTURAS_DETALLE F
                    WHERE F.FACT_ID = :IDDOC AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
                    INTO :ART, :MONTO, :IMPTOS
                    DO
                    BEGIN
                    if (FOMENTO = 'SI') then
                        MONTO = MONTO + VRCONSUMO;
                    if ((CTADTO IS NULL) OR (CTADTO = '')) then
                        MONTO = MONTO * FACTOR;
                    execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                    if (MONTO <> 0) then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        SUMA = SUMA - MONTO;
                        END
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - MONTO;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - MONTO;
                END
            END /* MONTO <> 0 */
        END /* VENTAS DE CLIENTE O CONSTANTE */
    /* EL IVA EN VENTAS */
    if (IVA = 'A') then
        BEGIN
        FOR SELECT MAX(TAIV_CTAIVAVNT), SUM(FADE_IVAMONTO), SUM(FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), sum(FADE_CONSUMO)
            FROM TARIFA_IVA T, FACTURAS_DETALLE F
            WHERE F.FACT_ID = :IDDOC AND F.fade_ivaporc = T.taiv_porc AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
            GROUP BY TAIV_CTAIVAVNT
            INTO :CTAIVA, :IMPTOS, :MONTO, :VALORADIC
        DO
            BEGIN
            if (FOMENTO = 'SI') then
                MONTO = MONTO + VALORADIC;
            MONTO = MONTO * -1;
            MONTO = MONTO * FACTOR;
            IMPTOS = IMPTOS * FACTOR;
            execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
            execute procedure redondee(MONTO, DIG) returning_values (MONTO);
            if (IMPTOS <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTAIVA, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT F.ARTI_COD, FADE_IVAMONTO, (FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), TAIV_PORC, FADE_CONSUMO
                        FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_DETALLE F, TARIFA_IVA T
                        WHERE F.FACT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTAIVAV = :CUENTA AND A.TAIV_COD = T.TAIV_COD AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
                        INTO :ART, :IMPTOS, :MONTO, :PORCIVA, :VALORADIC
                    DO
                        BEGIN
                        if (FOMENTO = 'SI') then
                            MONTO = MONTO + VALORADIC;
                        MONTO = MONTO * -1;
                        MONTO = MONTO * FACTOR;
                        IMPTOS = IMPTOS * FACTOR;
                        execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                        if (IMPTOS <> 0) then
                            BEGIN
                            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, :MONTO, :PORCIVA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                            NROI = NROI + 1;
                            SUMA = SUMA + DEBITO - CREDITO;
                            END
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, :MONTO, ABS(:IMPTOS*100/:MONTO), :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    NROI = NROI + 1;
                    SUMA = SUMA - IMPTOS;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, :MONTO, ABS(:IMPTOS*100/:MONTO), :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA - IMPTOS;
                    END
                END   /* IMPTOS <> 0 */
            END /* FOR */
        END /* IVA X ARTICULO */
    if (IVA = 'K') then /* IVA EN CTA CONSTANTE */
        BEGIN
        SELECT SUM(FADE_IVAMONTO), SUM(FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), SUM(FADE_CONSUMO)
            FROM FACTURAS_DETALLE F
            WHERE F.FACT_ID = :IDDOC and FADE_IVAMONTO <> 0 AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
            INTO :IMPTOS, :MONTO, :valoradic;
        if (FOMENTO = 'SI') then
            MONTO = MONTO + VALORADIC;
        MONTO = MONTO * -1;
        MONTO = MONTO * FACTOR;
        IMPTOS = IMPTOS * FACTOR;
        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
        execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
        if (IMPTOS <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTAIVA, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT F.ARTI_COD, (FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), FADE_IVAMONTO, TAIV_PORC, FADE_CONSUMO
                    FROM ARTICULO A, FACTURAS_DETALLE F, TARIFA_IVA T
                    WHERE F.FACT_ID = :IDDOC AND A.TAIV_COD = T.TAIV_COD AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
                    INTO :ART, :MONTO, :IMPTOS, :PORCIVA, :VALORADIC
                    DO
                    BEGIN
                    if (FOMENTO = 'SI') then
                        MONTO = MONTO + VALORADIC;
                    MONTO = MONTO * -1;
                    MONTO = MONTO * FACTOR;
                    IMPTOS = IMPTOS * FACTOR;
                    execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                    execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                    if (IMPTOS <> 0) then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', 0, :IMPTOS, :MONTO, :PORCIVA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        SUMA = SUMA - IMPTOS;
                        END
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', 0, :IMPTOS, :MONTO, ABS(:IMPTOS*100/:MONTO), :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - IMPTOS;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', 0, :IMPTOS, :MONTO, ABS(:IMPTOS*100/:MONTO), :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - IMPTOS;
                END
            END /* IMPTOS <> 0 */
        END /* IVA EN CTA CONSTANTE */
    /* EL IMPOCONSUMO */
    if ((CONSUMO = 'A') AND (FOMENTO <> 'SI')) then
        BEGIN
        FOR SELECT MAX(COAR_CTACONS), SUM(FADE_CONSUMO)
            FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_DETALLE F
            WHERE F.FACT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
            GROUP BY COAR_CTACONS
            INTO :CTACONSUMO, :IMPTOS
        DO
            BEGIN
            execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
            if (IMPTOS <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTACONSUMO, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, REGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT F.ARTI_COD, FADE_CONSUMO
                        FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_DETALLE F
                        WHERE F.FACT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTACONS = :CUENTA AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
                        INTO :ART, :IMPTOS
                    DO
                        BEGIN
                        execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                        if (IMPTOS <> 0) then
                            BEGIN
                            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                            NROI = NROI + 1;
                            SUMA = SUMA - IMPTOS;
                            END
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    NROI = NROI + 1;
                    SUMA = SUMA - IMPTOS;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA - IMPTOS;
                    END
                END /* IMPTOS <> 0 */
            END /* FOR */
        END /* CONSUMO X ARTICULO */
    if ((CONSUMO = 'K') AND (FOMENTO <> 'SI')) then /* CONSUMO EN CTA CONSTANTE */
        BEGIN
        SELECT SUM(FADE_CONSUMO)
            FROM FACTURAS_DETALLE F
            WHERE F.FACT_ID = :IDDOC AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
            INTO :IMPTOS;
        execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
        if (IMPTOS <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTACONSUMO, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT F.ARTI_COD, FADE_CONSUMO
                    FROM ARTICULO A, FACTURAS_DETALLE F
                    WHERE F.FACT_ID = :IDDOC AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
                    INTO :ART, :IMPTOS
                    DO
                    BEGIN
                    execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                    if (IMPTOS <> 0) then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CTACONSUMO, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        SUMA = SUMA - IMPTOS;
                        END
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTACONSUMO, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - IMPTOS;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTACONSUMO, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - IMPTOS;
                END
            END /* IMPTOS <> 0 */
        END /* CONSUMO EN CTA CONSTANTE */
    /* DESCUENTO */
    if ((CTADTO IS NOT NULL) AND (CTADTO <> '')) then
        BEGIN
        execute procedure redondee(VRDTO, DIG) returning_values (VRDTO);
        if (VRDTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTADTO, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRDTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA + VRDTO;
                END
            if (TIPOCUEN = 'N') then
                    BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRDTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA + VRDTO;
                END
            END
        END /* DESCUENTO */
    /* VALOR ADIC */
    if ((CTAADIC IS NOT NULL) AND (CTAADIC <> '')) then
        BEGIN
        execute procedure redondee(VRADIC, DIG) returning_values (VRADIC);
        if (VRADIC <> 0) THEN
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTAADIC, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRADIC, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - VRADIC;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRADIC, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - VRADIC;
                END
            END
        END /* VR. ADIC */
    /* VALOR EXTRA */
    if ((CTAEXTRA IS NOT NULL) AND (CTAEXTRA <> '')) THEN
        BEGIN
        execute procedure redondee(VREXTRA, DIG) returning_values (VREXTRA);
        if (VREXTRA <> 0) THEN
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTAEXTRA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VREXTRA, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - VREXTRA;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VREXTRA, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - VREXTRA;
                END
            END
        END /* VR. EXTRA */
    /* DESCUENTE EL IMPOCONSUMO */
    SELECT SUM(FADE_CONSUMO)
        FROM FACTURAS_DETALLE F WHERE F.FACT_ID = :IDDOC AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL)) INTO :IMPTOS;
    vrsubt = vrsubt - IMPTOS;
    /* RETENCION FUENTE */
    if ((RTFTE = 'C') or (RTFTE = 'K')) then
      BEGIN
      execute procedure redondee(VRRTFTE, DIG) returning_values (VRRTFTE);
      if (VRRTFTE <> 0) then
        BEGIN
        if (RTFTE = 'C') then
            CTARTFTE = TCTARTFTE;
        EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTARTFTE, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :VRSUBT, :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTFTE;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :VRSUBT, :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTFTE;
            END
        /* AUTORETENCION */
        if (FAUTORET <= fecaux) then
            BEGIN
            EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'CUENTA DE AUTORETENCION EN LA FUENTE') returning_values (CTARTFTE);
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTARTFTE INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERROR (31, :IDDOC, :CTARTFTE, 2);
                CUENTA = CTARTFTE;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                begin
                EXECUTE PROCEDURE ERROR (31, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, (:VRSUBT*-1), :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - VRRTFTE;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, (:VRSUBT*-1), :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - VRRTFTE;
                END
            END
        END /* RTFTE */
      END
    if (RTFTE = 'A') then
      BEGIN
      FOR SELECT MAX(COAR_CTARTFTEV), MAX(COAR_RTFTE), MIN(COAR_RTBASE), SUM(FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), SUM((FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO)*COAR_RTFTE)
        FROM CONTABIL_ARTICULO C, FACTURAS_DETALLE F
        WHERE F.FACT_ID = :IDDOC AND F.ARTI_COD = C.ARTI_COD AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
        GROUP BY COAR_CTARTFTEV
        INTO :CTARTFTE, :PRTFTE, :baseadic, :MONTO, :VRRTFTE
        DO
        BEGIN
        MONTO = MONTO * FACTOR;
        if (MONTO >= BASEADIC) then
            BEGIN
            VRRTFTE = VRRTFTE * FACTOR / 100;
            execute procedure redondee(VRRTFTE, DIG) returning_values (VRRTFTE);
            execute procedure redondee(MONTO, DIG) returning_values (MONTO);
            if (VRRTFTE <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTARTFTE, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :MONTO, :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    NROI = NROI + 1;
                    SUMA = SUMA + VRRTFTE;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :MONTO, :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA + VRRTFTE;
                    END
                /* AUTORETENCION */
                if (FAUTORET <= fecaux) then
                    BEGIN
                    EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'CUENTA DE AUTORETENCION EN LA FUENTE') returning_values (CTARTFTE);
                    EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTARTFTE, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
                    if (ERRORC <> 0) then
                        ERROR = ERROR + 1;
                    if (TIPOCUEN = 'C') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, (:MONTO*-1), :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                        NROI = NROI + 1;
                        SUMA = SUMA - VRRTFTE;
                        END
                    if (TIPOCUEN = 'N') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, (:MONTO*-1), :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NROI = NROI + 1;
                        SUMA = SUMA - VRRTFTE;
                        END
                    END
                END
            END
        END /* RTFTE */
      END
    /* RETENCION IVA */
    if ((RTIVA = 'C') or (RTIVA = 'K')) then
      BEGIN
      execute procedure redondee(VRRTIVA, DIG) returning_values (VRRTIVA);
      if (VRRTIVA <> 0) then
        BEGIN
        if (RTIVA = 'C') then
            CTARTIVA = TCTARTIVA;
        EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTARTIVA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTIVA, 0, :VRIVA, :PORC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTIVA;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTIVA, 0, :VRIVA, :PORC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTIVA;
            END
        END /* RTIVA */
      END
    /* RETENCION DE ICA */
    if ((RTICA = 'C') or (RTICA = 'K')) then
      BEGIN
      execute procedure redondee(VRRTICA, DIG) returning_values (VRRTICA);
      if (VRRTICA <> 0) then
        BEGIN
        if (RTICA = 'C') then
            CTARTICA = TCTARTICA;
        EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTARTICA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTICA, 0, :VRSUBT, :PRTICA, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTICA;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTICA, 0, :VRSUBT, :PRTICA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTICA;
            END
        END /* RTICA */
      END
    /* CIERRE EL COMPROBANTE CONTRA LA CUENTA DEL TERCERO O LA CONSTANTE */
    if ((SUMA <> 0) and ((CARTERA = 'C') or (CARTERA = 'K') or (CARTERA = 'J'))) then
        BEGIN
        if (SUMA < 0) then
            BEGIN
            DEBITO = SUMA * -1;
            CREDITO = 0;
            END
        ELSE
            BEGIN
            DEBITO = 0;
            CREDITO = SUMA;
            END
        if (CARTERA = 'C') then
            CTACARTERA = TCTACLIEN;
        if (CARTERA = 'J') then
            BEGIN
            /* BUSQUE LA CUENTA DE LA CAJA */
            SELECT CAJA_CUENTA FROM CAJAS C, PUNTO_VENTA P
                WHERE P.CAJA_ID = C.CAJA_ID AND PTVT_ID = :PTOVTA
                INTO :CTACARTERA;
            END
        EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTACARTERA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :DEBITO, :CREDITO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
        if (TIPOCUEN = 'N') then
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :DEBITO, :CREDITO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
        NROI = NROI + 1;
        END /* SUMA EN CARTERA */
    /* CALCULE COSTOS EN VENTAS */
    EXECUTE PROCEDURE COSTO_EN_VENTAS(31, :IDDOC);
    if (COSTOS = 'A') then
        BEGIN
        FOR SELECT MAX(CTACOS), SUM(CAST(CANT AS DOUBLE PRECISION) * COSTO)
            FROM COSTO_VENTAS WHERE TIDO_COD = 31 AND COVE_ID = :IDDOC
            GROUP BY CTACOS
            INTO :CTACOSTOS, :MONTO
        DO
            BEGIN
            if (MONTO <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTACOSTOS, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT ARTI_COD, CANT * COSTO
                        FROM COSTO_VENTAS WHERE TIDO_COD = 31 AND COVE_ID = :IDDOC AND CTACOS = :CUENTA
                        INTO :ART, :MONTO
                    DO
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    NROI = NROI + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    END
                END /* MONTO <> 0 */
            END /* FOR */
        END /* COSTOS */
    if (COSTOS = 'K') then
        BEGIN
        SELECT SUM(CAST(CANT AS DOUBLE PRECISION) * COSTO)
            FROM COSTO_VENTAS WHERE TIDO_COD = 31 AND COVE_ID = :IDDOC
            INTO :MONTO;
        if (MONTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTACOSTOS, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, REGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT ARTI_COD, CANT * COSTO
                    FROM COSTO_VENTAS WHERE TIDO_COD = 31 AND COVE_ID = :IDDOC
                    INTO :ART, :MONTO
                DO
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTACOSTOS, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                    NROI = NROI + 1;
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTACOSTOS, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTACOSTOS, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                END
            END /* MONTO <> 0 */
        END /* COSTOS = K */
    if (INVEN = 'A') then
        BEGIN
        FOR SELECT MAX(CTAINV), SUM(CAST(CANT AS DOUBLE PRECISION) * COSTO)
            FROM COSTO_VENTAS WHERE TIDO_COD = 31 AND COVE_ID = :IDDOC
            GROUP BY CTAINV
            INTO :CTAINVEN, :MONTO
        DO
            BEGIN
            if (MONTO <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTAINVEN, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, REGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT ARTI_COD, CANT * COSTO
                        FROM COSTO_VENTAS WHERE TIDO_COD = 31 AND COVE_ID = :IDDOC AND CTAINV = :CUENTA
                        INTO :ART, :MONTO
                    DO
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    NROI = NROI + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    END
                END /* MONTO <> 0 */
            END /* FOR */
        END /* INVEN = A */
    if (INVEN = 'K') then
        BEGIN
        SELECT SUM(CAST(CANT AS DOUBLE PRECISION) * COSTO)
            FROM COSTO_VENTAS WHERE TIDO_COD = 31 AND COVE_ID = :IDDOC
            INTO :MONTO;
        if (MONTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTAINVEN, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT ARTI_COD, CANT * COSTO
                    FROM COSTO_VENTAS WHERE TIDO_COD = 31 AND COVE_ID = :IDDOC
                    INTO :ART, :MONTO
                DO
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTAINVEN, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                    NROI = NROI + 1;
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAINVEN, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAINVEN, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                END
            END /* MONTO <> 0 */
        END /* INVEN = K */
    /* recorra las cuentas adicionales */
    FOR SELECT INVC_CUENTA, INVC_BASE, INVC_PORC, INVC_VALOR, INVC_DB
        FROM INTERFAZ_VENTAS_CTAS
        WHERE INVE_ID = :IDINTER
        INTO :CTADIC, :BASEADIC, :PORCADIC, :VALORADIC, :DBADIC
        DO
        BEGIN
        if (VALORADIC <> 0) then
            MONTO = VALORADIC;
        ELSE
            BEGIN
            if (:BASEADIC = 'SUBTOTAL') then
                VALORADIC = vrsubt;
            if (:BASEADIC = 'DESCUENTO') then
                VALORADIC = VRDTO;
            if (:BASEADIC = 'IVA') then
                VALORADIC = VRIVA;
            if (:BASEADIC = 'ADICIONAL') then
                VALORADIC = VRADIC;
            if (:BASEADIC = 'EXTRA') then
                VALORADIC = VREXTRA;
            if (:BASEADIC = 'TOTAL') then
                VALORADIC = VRTOTAL;
            MONTO = VALORADIC * PORCADIC / 100;
            END
        if (MONTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTADIC, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                if (DBADIC = 'S') then
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                ELSE
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                if (DBADIC = 'S') then
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                ELSE
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                END
            NROI = NROI + 1;
            END
        END
    if (ERROR > 0) then
        VER = 'S';
    SUSPEND;
    END /* NO ANULADO */
  END /* EXISTE LA INTERFAZ */
ELSE
    BEGIN
    EXECUTE PROCEDURE ERROR (31, :IDDOC, :PREF, 1);
    ERROR = ERROR + 1;
    VER = 'S';
    SUSPEND;
    END
END
^

SET TERM ; ^

SET TERM ^ ;

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

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER PROCEDURE COSTO_EN_VENTAS_CONTADO(
    FECFAC DATE,
    PREF VARCHAR(4),
    PTVTA INTEGER)
AS
declare variable ARTICULO VARCHAR(20);
declare variable CANTIDAD NUMERIC(18,4);
declare variable COSTO NUMERIC(18,2);
declare variable CTACOSTO VARCHAR(20);
declare variable CTAINVEN VARCHAR(20);
BEGIN
DELETE FROM COSTO_VENTAS WHERE TIDO_COD = 31 AND COVE_ID = 0;
    /* FACTURA DE VENTA */
    FOR SELECT MAX(D.ARTI_COD), SUM(FADE_CANT * FADE_FACTOR), MAX(COAR_CTACOS), MAX(COAR_CTAINV)
        FROM ARTICULO A, FACTURAS F, FACTURAS_DETALLE D, CONTABIL_ARTICULO C
        WHERE F.FACT_ID = D.FACT_ID AND A.ARTI_COD = D.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND FACT_ANULADO = 'N' AND FACT_FECHA = :FECFAC AND F.PREF_PRE = :PREF AND F.PTVT_ID = :PTVTA and substring(a.arti_cod from 1 FOR 2) <> '.t'
        GROUP BY D.ARTI_COD
        INTO :ARTICULO, :CANTIDAD, :CTACOSTO, :CTAINVEN
        DO
        BEGIN
        EXECUTE PROCEDURE COSTO_PROMEDIO(:ARTICULO, :FECFAC) returning_values (:COSTO);
        INSERT INTO COSTO_VENTAS (TIDO_COD, COVE_ID, ARTI_COD, CANT, COSTO,  CTACOS, CTAINV)
            VALUES (31, 0, :ARTICULO, :CANTIDAD, :COSTO * :CANTIDAD, :CTACOSTO, :CTAINVEN);
        END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER PROCEDURE CONTABIL_FACTURAS_CONTADO(
    FECFAC DATE,
    NIT VARCHAR(20),
    PREF VARCHAR(4),
    PTVTA INTEGER,
    IDINTER INTEGER)
RETURNS (
    ERROR INTEGER,
    VER CHAR(1),
    IDC INTEGER)
AS
declare variable num varchar(8);
declare variable numero varchar(10);
declare variable fecha char(8);
declare variable conc char(120);
declare variable vence char(8);
declare variable vrdto numeric(18,2);
declare variable vradic numeric(18,2);
declare variable vrsubt numeric(18,2);
declare variable vriva numeric(18,2);
declare variable prtfte numeric(9,2);
declare variable vrrtfte numeric(18,2);
declare variable vrrtiva numeric(18,2);
declare variable prtica numeric(9,2);
declare variable vrrtica numeric(18,2);
declare variable vrtotal numeric(18,2);
declare variable vrextra numeric(18,2);
declare variable tipocomp varchar(3);
declare variable prefcont varchar(4);
declare variable ventas char(1);
declare variable ctaventas varchar(20);
declare variable iva char(1);
declare variable ctaiva varchar(20);
declare variable consumo char(1);
declare variable ctaconsumo varchar(20);
declare variable cartera char(1);
declare variable ctacartera varchar(20);
declare variable rtfte char(1);
declare variable ctartfte varchar(20);
declare variable rtiva char(1);
declare variable ctartiva varchar(20);
declare variable rtica char(1);
declare variable ctartica varchar(20);
declare variable inven char(1);
declare variable ctainven varchar(20);
declare variable costos char(1);
declare variable ctacostos varchar(20);
declare variable ctadto varchar(20);
declare variable ctaadic varchar(20);
declare variable ctaextra varchar(20);
declare variable existe char(1);
declare variable cuenta varchar(20);
declare variable monto numeric(18,2);
declare variable tipocuen char(1);
declare variable nombre varchar(60);
declare variable proy varchar(4);
declare variable centro varchar(4);
declare variable porc numeric(5,2);
declare variable debito numeric(18,2);
declare variable credito numeric(18,2);
declare variable nroi integer;
declare variable art varchar(15);
declare variable impinc char(1);
declare variable imptos numeric(18,2);
declare variable suma numeric(18,2);
declare variable porciva numeric(9,2);
declare variable tctaclien varchar(20);
declare variable tctaventa varchar(20);
declare variable tctartfte varchar(20);
declare variable tctartiva varchar(20);
declare variable tctartica varchar(20);
declare variable ctadic varchar(20);
declare variable baseadic varchar(20);
declare variable porcadic numeric(5,2);
declare variable valoradic numeric(18,2);
declare variable dbadic char(1);
declare variable ptovta integer;
declare variable dig integer;
declare variable mercancia numeric(18,2);
declare variable factor double precision;
declare variable cent char(1);
BEGIN
/* BUSQUE LA INTERFACE */
EXISTE = 'N';
SELECT 'S', TICO_COD, PRCO_PRE, INVE_VENTAS, INVE_IVA, INVE_CONSUMO, INVE_CARTERA, INVE_RTFTE, INVE_RTIVA, INVE_RTICA, INVE_COSTO, INVE_INVEN, INVE_CTAVENTAS, INVE_CTAIVA, INVE_CTACONSUMO, INVE_CTADTO, INVE_CTAADIC, INVE_CTAEXTRA, INVE_CTACARTERA, INVE_CTARTFTE, INVE_CTARTIVA, INVE_CTARTICA, INVE_CTAINVEN, INVE_CTACOSTOS, INVE_CONFIRMAR, INVE_CENTRO
    FROM INTERFAZ_VENTAS
    WHERE INVE_ID = :IDINTER
    INTO :EXISTE, :TIPOCOMP, :PREFCONT, :VENTAS, :IVA, :CONSUMO, :CARTERA, :RTFTE, :RTIVA, :RTICA, :COSTOS, :INVEN, :CTAVENTAS, :CTAIVA, :CTACONSUMO, :CTADTO, :CTAADIC, :CTAEXTRA, :CTACARTERA, :CTARTFTE, :CTARTIVA, :CTARTICA, :CTAINVEN, :CTACOSTOS, :VER, :CENT;
if (EXISTE = 'S') then
  BEGIN
  /* BORRE CUALQUEIR CONTABILIZACION PREVIA */
/*  DELETE FROM CONTABILIZACION WHERE CNTB_TIPOREF = 31 AND CNTB_IDREF = 0;
  /* BUSQUE EL CENTRO DEL PUNTO, LA BODEGA, O EL PREFIJO  */
  IF (CENT = 'B') THEN
    SELECT B.BODE_CENTRO, B.BODE_PROY FROM BODEGA B, PUNTO_VENTA P
        WHERE B.BODE_COD = P.BODE_COD AND P.ptvt_id = :ptvta INTO :CENTRO, :PROY;
  IF (CENT = 'V') THEN
    SELECT MAX(V.CENT_COD), MAX(V.PROY_COD) FROM VENDEDORES V
        WHERE V.PTVT_ID = :PTVTA INTO :CENTRO, :PROY;
  IF (CENT = 'P') THEN
    SELECT P.PREF_PROY, P.PREF_CENTRO FROM PREFIJOS P
        WHERE P.PREF_PRE = :PREF AND P.TIDO_COD = 31 INTO :CENTRO, :PROY;
  /* TRAIGA LOS DATOS DEL CLIENTE */
  SELECT TERC_NOM, TERC_CTARTFTE, TERC_CTARTIVA, TERC_CTARTICA, TERC_CTAVENTA, TERC_CTACLIENTE
        FROM TERCEROS T WHERE TERC_NIT = :NIT
        INTO :NOMBRE, TCTARTFTE, TCTARTIVA, TCTARTICA, TCTAVENTA, TCTACLIEN;
  SELECT SUM(FACT_DTOMONTO), SUM(FACT_ADICIONAL), SUM(FACT_IVAMONTO), SUM(FACT_EXTRA), SUM(FACT_TOTAL), SUM(FACT_RTFTEMONTO), SUM(FACT_RTIVAMONTO), SUM(FACT_RTICAMONTO), MAX(FACT_IVAINC)
        FROM FACTURAS F WHERE FACT_FECHA = :FECFAC AND FACT_ANULADO = 'N' AND PTVT_ID = :ptvta AND PREF_PRE = :PREF
        INTO :VRDTO, :VRADIC, :VRIVA, :VREXTRA, :VRTOTAL, :VRRTFTE, :VRRTIVA, :VRRTICA, :impinc;
  VRSUBT = VRTOTAL - VREXTRA - VRIVA; /* BASE DE RETEFTE Y RETEICA */
  MERCANCIA = VRSUBT - VRADIC + VRDTO;
  EXECUTE PROCEDURE FECHA_A_CONTA(:FECFAC) returning_values (:FECHA);
  VENCE = FECHA;
  /* REGISTRE EL ENCABEZADO CONTABLE */
  IDC = GEN_ID(ID_CONTABILIZA, 1);
  CONC = 'RESUMEN VENTAS ' || FECHA;
  NUM = SUBSTR(FECHA, 3, 8);
  INSERT INTO CONTABILIZACION (CNTB_ID, CNTB_TIPOCOMP, CNTB_PREFCNT, CNTB_NUMERO, CNTB_FECHA, CNTB_CONCEPTO, CNTB_REF, CNTB_TIPOREF, CNTB_IDREF, CNTB_PREFREF, CNTB_NUMREF, CNTB_PROCESADO)
        VALUES (:IDC, :TIPOCOMP, :PREFCONT, :NUM, :FECHA, :CONC, '', 0, 0, :PREF, :NUM, 'N');
  NROI = 0;
  SUMA = 0;
  ERROR = 0;
  /* SI NO HAY CUENTA DE DESCUENTO NI ADICIONAL CALCULE UN FACTOR PARA LAS VENTAS Y EL IVA */
  if (MERCANCIA <> 0) then
    FACTOR = CAST(VRSUBT AS DOUBLE PRECISION) / CAST(MERCANCIA AS DOUBLE PRECISION);
  ELSE
    FACTOR = 1;
  /* TRAIGA EL NUMERO DE DIGITOS PARA EL REDONDEO */
  SELECT CAST(CONF_VALOR AS INTEGER) FROM CONFIGURACION WHERE CONF_MODULO = 'FACTURACION' AND
        CONF_CATEGORIA = 'GENERAL' AND CONF_PROPIEDAD = 'REDONDEO AL MULTIPLO DE DIEZ EN TOTALES' INTO :DIG;
  /* CUENTAS DE VENTAS */
  if (VENTAS = 'A') then
        BEGIN
        FOR SELECT MAX(COAR_CTAVNT), SUM(CAST(FADE_CANT AS DOUBLE PRECISION) * (FADE_PRUNIT-FADE_DTOMONTO)), SUM(FADE_IVAMONTO+FADE_CONSUMO)
            FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_DETALLE FD, FACTURAS F
            WHERE F.FACT_ID = FD.FACT_ID AND FACT_FECHA = :FECFAC AND FD.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND F.PREF_PRE = :PREF AND F.PTVT_ID = :PTVTA AND FACT_ANULADO = 'N' AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
            GROUP BY COAR_CTAVNT
            INTO :CTAVENTAS, :MONTO, :IMPTOS
            DO
            BEGIN
            if (IMPINC = 'S') then
                MONTO = MONTO - IMPTOS;
            if ((CTADTO IS NULL) OR (CTADTO = '')) then
                MONTO = MONTO * FACTOR;
            execute procedure redondee(MONTO, DIG) returning_values (MONTO);
            if (MONTO <> 0) then
                BEGIN
                CUENTA = NULL;
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :CTAVENTAS INTO :CUENTA, :TIPOCUEN;
                if (CUENTA IS NULL) then
                    begin
                    EXECUTE PROCEDURE ERROR (31, 0, :CTAVENTAS, 2);
                    CUENTA = CTAVENTAS;
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT FD.ARTI_COD, (CAST(FADE_CANT AS DOUBLE PRECISION) * (FADE_PRUNIT-FADE_DTOMONTO)), (FADE_IVAMONTO+FADE_CONSUMO)
                        FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_DETALLE FD, FACTURAS F
                        WHERE F.FACT_ID = FD.FACT_ID AND FACT_FECHA = :FECFAC AND F.PREF_PRE = :PREF AND F.PTVT_ID = :PTVTA AND FD.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTAINV = :CUENTA AND FACT_ANULADO = 'N' AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
                        INTO :ART, :MONTO, :IMPTOS
                    DO
                        BEGIN
                        if (IMPINC = 'S') then
                            MONTO = MONTO - IMPTOS;
                        if ((CTADTO IS NULL) OR (CTADTO = '')) then
                            MONTO = MONTO * FACTOR;
                        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                        if (MONTO <> 0) then
                            BEGIN
                            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                            NROI = NROI + 1;
                            SUMA = SUMA - MONTO;
                            END
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    NROI = NROI + 1;
                    SUMA = SUMA - MONTO;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA - MONTO;
                    END
                END /* MONTO <> 0 */
            END /* FOR */
        END /* VENTAS X ARTICULO */
     IF ((VENTAS = 'C') OR (VENTAS = 'K')) THEN
        BEGIN
        IF (VENTAS = 'C') THEN
            CTAVENTAS = TCTAVENTA;
        SELECT SUM(CAST(FADE_CANT AS DOUBLE PRECISION) * (FADE_PRUNIT-FADE_DTOMONTO)), SUM(FADE_IVAMONTO+FADE_CONSUMO)
            FROM FACTURAS_DETALLE FD, FACTURAS F
            WHERE F.FACT_ID = FD.FACT_ID AND FACT_FECHA = :FECFAC AND F.PREF_PRE = :PREF AND F.PTVT_ID = :PTVTA AND FACT_ANULADO = 'N' AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
            INTO :MONTO, :IMPTOS;
        if (IMPINC = 'S') then
            MONTO = MONTO - IMPTOS;
        if ((CTADTO IS NULL) OR (CTADTO = '')) then
            MONTO = MONTO * FACTOR;
        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
        if (MONTO <> 0) then
            BEGIN
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTAVENTAS INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERROR (31, 0, :CTAVENTAS, 2);
                CUENTA = CTAVENTAS;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT FD.ARTI_COD, (CAST(FADE_CANT AS DOUBLE PRECISION) * (FADE_PRUNIT-FADE_DTOMONTO)), (FADE_IVAMONTO+FADE_CONSUMO)
                    FROM /*ARTICULO A,*/ FACTURAS_DETALLE FD, FACTURAS F
                    WHERE F.FACT_ID = FD.FACT_ID AND FACT_FECHA = :FECFAC AND F.PREF_PRE = :PREF AND F.PTVT_ID = :PTVTA AND FACT_ANULADO = 'N' AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
                    INTO :ART, :MONTO, :IMPTOS
                    DO
                    BEGIN
                    if (IMPINC = 'S') then
                        MONTO = MONTO - IMPTOS;
                    if ((CTADTO IS NULL) OR (CTADTO = '')) then
                        MONTO = MONTO * FACTOR;
                    execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                    if (MONTO <> 0) then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        SUMA = SUMA - MONTO;
                        END
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - MONTO;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - MONTO;
                END
            END /* MONTO <> 0 */
        END /* VENTAS DE CLIENTE O CONSTANTE */
    /* EL IVA EN VENTAS */
    if (IVA = 'A') then
        BEGIN
        FOR SELECT MAX(COAR_CTAIVAV), SUM(FADE_IVAMONTO), SUM(CAST(FADE_CANT AS DOUBLE PRECISION) * (FADE_PRUNIT-FADE_DTOMONTO)), sum(FADE_CONSUMO)
            FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_DETALLE FD, FACTURAS F
            WHERE F.FACT_ID = FD.FACT_ID AND FACT_FECHA = :FECFAC AND F.PREF_PRE = :PREF AND F.PTVT_ID = :PTVTA AND FD.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND FACT_ANULADO = 'N' AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
            GROUP BY COAR_CTAIVAV
            INTO :CTAIVA, :IMPTOS, :MONTO, :VALORADIC
        DO
            BEGIN
            if (IMPINC = 'S') then
                MONTO = MONTO - IMPTOS - VALORADIC;
            MONTO = MONTO * -1;
            MONTO = MONTO * FACTOR;
            IMPTOS = IMPTOS * FACTOR;
            execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
            execute procedure redondee(MONTO, DIG) returning_values (MONTO);
            if (IMPTOS <> 0) then
                BEGIN
                CUENTA = NULL;
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :CTAIVA INTO :CUENTA, :TIPOCUEN;
                if (CUENTA IS NULL) then
                    begin
                    EXECUTE PROCEDURE ERROR (31, 0, :CTAIVA, 2);
                    CUENTA = CTAIVA;
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT FD.ARTI_COD, FADE_IVAMONTO, (CAST(FADE_CANT AS DOUBLE PRECISION) * (FADE_PRUNIT-FADE_DTOMONTO)), TAIV_PORC, FADE_CONSUMO
                        FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_DETALLE FD, FACTURAS F, TARIFA_IVA T
                        WHERE F.FACT_ID = FD.FACT_ID AND FACT_FECHA = :FECFAC AND F.PREF_PRE = :PREF AND F.PTVT_ID = :PTVTA AND FD.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTAIVAV = :CUENTA AND A.TAIV_COD = T.TAIV_COD AND FACT_ANULADO = 'N' AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
                        INTO :ART, :IMPTOS, :MONTO, :PORCIVA, :VALORADIC
                    DO
                        BEGIN
                        if (IMPINC = 'S') then
                            MONTO = MONTO - IMPTOS - VALORADIC;
                        MONTO = MONTO * -1;
                        MONTO = MONTO * FACTOR;
                        IMPTOS = IMPTOS * FACTOR;
                        execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                        if (IMPTOS <> 0) then
                            BEGIN
                            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, :MONTO, :PORCIVA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                            NROI = NROI + 1;
                            SUMA = SUMA + DEBITO - CREDITO;
                            END
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, :MONTO, ABS(:IMPTOS*100/:MONTO), :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    NROI = NROI + 1;
                    SUMA = SUMA - IMPTOS;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, :MONTO, ABS(:IMPTOS*100/:MONTO), :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA - IMPTOS;
                    END
                END   /* IMPTOS <> 0 */
            END /* FOR */
        END /* IVA X ARTICULO */
    if (IVA = 'K') then /* IVA EN CTA CONSTANTE */
        BEGIN
        SELECT SUM(FADE_IVAMONTO), SUM(CAST(FADE_CANT AS DOUBLE PRECISION) * (FADE_PRUNIT-FADE_DTOMONTO)), SUM(FADE_CONSUMO)
            FROM FACTURAS_DETALLE FD, FACTURAS F
            WHERE F.FACT_ID = FD.FACT_ID AND FACT_FECHA = :FECFAC AND F.PREF_PRE = :PREF AND F.PTVT_ID = :PTVTA AND FACT_ANULADO = 'N' AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
            INTO :IMPTOS, :MONTO, :valoradic;
        if (IMPINC = 'S') then
            MONTO = MONTO - IMPTOS - VALORADIC;
        MONTO = MONTO * -1;
        MONTO = MONTO * FACTOR;
        IMPTOS = IMPTOS * FACTOR;
        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
        execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
        if (IMPTOS <> 0) then
            BEGIN
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTAIVA INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERROR (31, 0, :CTAIVA, 2);
                CUENTA = CTAIVA;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT FD.ARTI_COD, (CAST(FADE_CANT AS DOUBLE PRECISION) * (FADE_PRUNIT-FADE_DTOMONTO)), FADE_IVAMONTO, TAIV_PORC, FADE_CONSUMO
                    FROM ARTICULO A, FACTURAS_DETALLE FD, FACTURAS F, TARIFA_IVA T
                    WHERE F.FACT_ID = FD.FACT_ID AND FACT_FECHA = :FECFAC AND F.PREF_PRE = :PREF AND F.PTVT_ID = :PTVTA AND FD.arti_cod = A.arti_cod AND T.TAIV_COD=A.TAIV_COD AND FACT_ANULADO = 'N' AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
                    INTO :ART, :MONTO, :IMPTOS, :PORCIVA, :VALORADIC
                    DO
                    BEGIN
                    if (IMPINC = 'S') then
                        MONTO = MONTO - IMPTOS - VALORADIC;
                    MONTO = MONTO * -1;
                    MONTO = MONTO * FACTOR;
                    IMPTOS = IMPTOS * FACTOR;
                    execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                    execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                    if (IMPTOS <> 0) then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', 0, :IMPTOS, :MONTO, :PORCIVA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        SUMA = SUMA - IMPTOS;
                        END
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', 0, :IMPTOS, :MONTO, ABS(:IMPTOS*100/:MONTO), :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - IMPTOS;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', 0, :IMPTOS, :MONTO, ABS(:IMPTOS*100/:MONTO), :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - IMPTOS;
                END
            END /* IMPTOS <> 0 */
        END /* IVA EN CTA CONSTANTE */
    /* EL IMPOCONSUMO */
    if (CONSUMO = 'A') then
        BEGIN
        FOR SELECT MAX(COAR_CTACONS), SUM(FADE_CONSUMO)
            FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_DETALLE FD, FACTURAS F
            WHERE F.FACT_ID = FD.FACT_ID AND FACT_FECHA = :FECFAC AND F.PREF_PRE = :PREF AND F.PTVT_ID = :PTVTA AND FD.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND FACT_ANULADO = 'N' AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
            GROUP BY COAR_CTACONS
            INTO :CTACONSUMO, :IMPTOS
        DO
            BEGIN
            execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
            if (IMPTOS <> 0) then
                BEGIN
                CUENTA = NULL;
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :CTACONSUMO INTO :CUENTA, :TIPOCUEN;
                if (CUENTA IS NULL) then
                    begin
                    EXECUTE PROCEDURE ERROR (31, 0, :CTACONSUMO, 2);
                    CUENTA = CTACONSUMO;
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, REGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT FD.ARTI_COD, FADE_CONSUMO
                        FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_DETALLE FD, FACTURAS F
                        WHERE F.FACT_ID = FD.FACT_ID AND FACT_FECHA = :FECFAC AND F.PREF_PRE = :PREF AND F.PTVT_ID = :PTVTA AND FD.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTACONS = :CUENTA AND FACT_ANULADO = 'N' AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
                        INTO :ART, :IMPTOS
                    DO
                        BEGIN
                        execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                        if (IMPTOS <> 0) then
                            BEGIN
                            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                            NROI = NROI + 1;
                            SUMA = SUMA - IMPTOS;
                            END
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    NROI = NROI + 1;
                    SUMA = SUMA - IMPTOS;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA - CREDITO;
                    END
                END /* IMPTOS <> 0 */
            END /* FOR */
        END /* CONSUMO X ARTICULO */
    if (CONSUMO = 'K') then /* CONSUMO EN CTA CONSTANTE */
        BEGIN
        SELECT SUM(FADE_CONSUMO)
            FROM FACTURAS_DETALLE FD, FACTURAS F
            WHERE F.FACT_ID = FD.FACT_ID AND FACT_FECHA = :FECFAC AND F.PREF_PRE = :PREF AND F.PTVT_ID = :PTVTA AND FACT_ANULADO = 'N' AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
            INTO :IMPTOS;
        execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
        if (IMPTOS <> 0) then
            BEGIN
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTACONSUMO INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERROR (31, 0, :CTACONSUMO, 2);
                CUENTA = CTACONSUMO;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT FD.ARTI_COD, FADE_CONSUMO
                    FROM /*ARTICULO A,*/ FACTURAS_DETALLE FD, FACTURAS F
                    WHERE F.FACT_ID = FD.FACT_ID AND FACT_FECHA = :FECFAC AND F.PREF_PRE = :PREF AND F.PTVT_ID = :PTVTA AND FACT_ANULADO = 'N' AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
                    INTO :ART, :IMPTOS
                    DO
                    BEGIN
                    execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                    if (IMPTOS <> 0) then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CTACONSUMO, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        SUMA = SUMA - IMPTOS;
                        END
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTACONSUMO, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - IMPTOS;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTACONSUMO, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - IMPTOS;
                END
            END /* IMPTOS <> 0 */
        END /* CONSUMO EN CTA CONSTANTE */
    /* DESCUENTO */
    if ((CTADTO IS NOT NULL) AND (CTADTO <> '')) then
        BEGIN
        execute procedure redondee(VRDTO, DIG) returning_values (VRDTO);
        if (VRDTO <> 0) then
            BEGIN
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTADTO INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERROR (31, 0, :CTADTO, 2);
                CUENTA = CTADTO;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                begin
                EXECUTE PROCEDURE ERROR (31, 0, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRDTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA + VRDTO;
                END
            if (TIPOCUEN = 'N') then
                    BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRDTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA + VRDTO;
                END
            END
        END /* DESCUENTO */
    /* VALOR ADIC */
    if ((CTAADIC IS NOT NULL) AND (CTAADIC <> '')) then
        BEGIN
        execute procedure redondee(VRADIC, DIG) returning_values (VRADIC);
        if (VRADIC <> 0) THEN
            BEGIN
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTAADIC INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERROR (31, 0, :CTAADIC, 2);
                CUENTA = CTAADIC;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                begin
                EXECUTE PROCEDURE ERROR (31, 0, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRADIC, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - VRADIC;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRADIC, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - VRADIC;
                END
            END
        END /* VR. ADIC */
    /* VALOR EXTRA */
    if ((CTAEXTRA IS NOT NULL) AND (CTAEXTRA <> '')) THEN
        BEGIN
        execute procedure redondee(VREXTRA, DIG) returning_values (VREXTRA);
        if (VREXTRA <> 0) THEN
            BEGIN
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTAEXTRA INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERROR (31, 0, :CTAEXTRA, 2);
                CUENTA = CTAEXTRA;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                begin
                EXECUTE PROCEDURE ERROR (31, 0, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VREXTRA, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - VREXTRA;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VREXTRA, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - VREXTRA;
                END
            END
        END /* VR. EXTRA */
    /* RETENCION FUENTE */
    if ((RTFTE = 'C') or (RTFTE = 'K')) then
      BEGIN
      execute procedure redondee(VRRTFTE, DIG) returning_values (VRRTFTE);
      if (VRRTFTE <> 0) then
        BEGIN
        if (RTFTE = 'C') then
            CTARTFTE = TCTARTFTE;
        CUENTA = NULL;
        SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
            WHERE CUEN_COD = :CTARTFTE INTO :CUENTA, :TIPOCUEN;
        if (CUENTA IS NULL) then
            begin
            EXECUTE PROCEDURE ERROR (31, 0, :CTARTFTE, 2);
            CUENTA = CTARTFTE;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            begin
            EXECUTE PROCEDURE ERROR (31, 0, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :VRSUBT, :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTFTE;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :VRSUBT, :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTFTE;
            END
        END /* RTFTE */
      END
    /* RETENCION IVA */
    if ((RTIVA = 'C') or (RTIVA = 'K')) then
      BEGIN
      execute procedure redondee(VRRTIVA, DIG) returning_values (VRRTIVA);
      if (VRRTIVA <> 0) then
        BEGIN
        if (RTIVA = 'C') then
            CTARTIVA = TCTARTIVA;
        CUENTA = NULL;
        SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
            WHERE CUEN_COD = :CTARTIVA INTO :CUENTA, :TIPOCUEN;
        if (CUENTA IS NULL) then
            begin
            EXECUTE PROCEDURE ERROR (31, 0, :CTARTIVA, 2);
            CUENTA = CTARTIVA;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            begin
            EXECUTE PROCEDURE ERROR (31, 0, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTIVA, 0, :VRIVA, :PORC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTIVA;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTIVA, 0, :VRIVA, :PORC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTIVA;
            END
        END /* RTIVA */
      END
    /* RETENCION DE ICA */
    if ((RTICA = 'C') or (RTICA = 'K')) then
      BEGIN
      execute procedure redondee(VRRTICA, DIG) returning_values (VRRTICA);
      if (VRRTICA <> 0) then
        BEGIN
        if (RTICA = 'C') then
            CTARTICA = TCTARTICA;
        CUENTA = NULL;
        SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
            WHERE CUEN_COD = :CTARTICA INTO :CUENTA, :TIPOCUEN;
        if (CUENTA IS NULL) then
            begin
            EXECUTE PROCEDURE ERROR (31, 0, :CTARTICA, 2);
            CUENTA = CTARTICA;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            begin
            EXECUTE PROCEDURE ERROR (31, 0, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTICA, 0, :VRSUBT, :PRTICA, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTICA;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTICA, 0, :VRSUBT, :PRTICA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTICA;
            END
        END /* RTICA */
      END
    /* CIERRE EL COMPROBANTE CONTRA LA CUENTA DEL TERCERO O LA CONSTANTE */
    if ((SUMA <> 0) and ((CARTERA = 'C') or (CARTERA = 'K') or (CARTERA = 'J'))) then
        BEGIN
        if (SUMA < 0) then
            BEGIN
            DEBITO = SUMA * -1;
            CREDITO = 0;
            END
        ELSE
            BEGIN
            DEBITO = 0;
            CREDITO = SUMA;
            END
        if (CARTERA = 'C') then
            CTACARTERA = TCTACLIEN;
        if (CARTERA = 'J') then
            BEGIN
            /* BUSQUE LA CUENTA DE LA CAJA */
            SELECT CAJA_CUENTA FROM CAJAS C, PUNTO_VENTA P
                WHERE P.CAJA_ID = C.CAJA_ID AND PTVT_ID = :PTOVTA
                INTO :CTACARTERA;
            END
        CUENTA = NULL;
        SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
            WHERE CUEN_COD = :CTACARTERA INTO :CUENTA, :TIPOCUEN;
        if (CUENTA IS NULL) then
            begin
            EXECUTE PROCEDURE ERROR (31, 0, :CTACARTERA, 2);
            CUENTA = CTACARTERA;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            begin
            EXECUTE PROCEDURE ERROR (31, 0, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'C') then
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :DEBITO, :CREDITO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
        if (TIPOCUEN = 'N') then
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :DEBITO, :CREDITO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
        NROI = NROI + 1;
        END /* SUMA EN CARTERA */
    /* CALCULE LOS COSTOS */
    EXECUTE PROCEDURE costo_en_ventas_contado(:fecfac,  :pref, :ptvta);
    if (COSTOS = 'A') then
        BEGIN
        FOR SELECT MAX(CTACOS), SUM(COSTO)
            FROM COSTO_VENTAS WHERE TIDO_COD = 31 AND COVE_ID = 0
            GROUP BY CTACOS
            INTO :CTACOSTOS, :MONTO
        DO
            BEGIN
            if (MONTO <> 0) then
                BEGIN
                CUENTA = NULL;
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :CTACOSTOS INTO :CUENTA, :TIPOCUEN;
                IF (CUENTA IS NULL) THEN
                    begin
                    EXECUTE PROCEDURE ERROR (31, 0, :CTACOSTOS, 2);
                    CUENTA = CTARTFTE;
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT ARTI_COD, CANT * COSTO
                        FROM COSTO_VENTAS WHERE TIDO_COD = 31 AND COVE_ID = 0 AND CTACOS = :CUENTA
                        INTO :ART, :MONTO
                    DO
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    NROI = NROI + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    END
                END /* MONTO <> 0 */
            END /* FOR */
        END /* COSTOS */
    if (COSTOS = 'K') then
        BEGIN
        SELECT SUM(COSTO)
            FROM COSTO_VENTAS  WHERE TIDO_COD = 31 AND COVE_ID = 0
            INTO :MONTO;
        if (MONTO <> 0) then
            BEGIN
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTACOSTOS INTO :CUENTA, :TIPOCUEN;
            IF (CUENTA IS NULL) THEN
                begin
                EXECUTE PROCEDURE ERROR (31, 0, :CTACOSTOS, 2);
                CUENTA = CTARTFTE;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, REGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT ARTI_COD, CANT * COSTO
                    FROM COSTO_VENTAS WHERE TIDO_COD = 31 AND COVE_ID = 0
                    INTO :ART, :MONTO
                DO
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTACOSTOS, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                    NROI = NROI + 1;
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTACOSTOS, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTACOSTOS, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                END
            END /* MONTO <> 0 */
        END /* COSTOS = K */
    if (INVEN = 'A') then
        BEGIN
        FOR SELECT MAX(CTAINV), SUM(COSTO)
            FROM COSTO_VENTAS  WHERE TIDO_COD = 31 AND COVE_ID = 0
            GROUP BY CTAINV
            INTO :CTAINVEN, :MONTO
        DO
            BEGIN
            if (MONTO <> 0) then
                BEGIN
                CUENTA = NULL;
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :CTAINVEN INTO :CUENTA, :TIPOCUEN;
                IF (CUENTA IS NULL) THEN
                    begin
                    EXECUTE PROCEDURE ERROR (31, 0, :CTAINVEN, 2);
                    CUENTA = CTAINVEN;
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, REGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT ARTI_COD, CANT * COSTO
                        FROM COSTO_VENTAS WHERE TIDO_COD = 31 AND COVE_ID = 0 AND CTAINV = :CUENTA
                        INTO :ART, :MONTO
                    DO
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    NROI = NROI + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    END
                END /* MONTO <> 0 */
            END /* FOR */
        END /* INVEN = A */
    if (INVEN = 'K') then
        BEGIN
        SELECT SUM(COSTO)
            FROM COSTO_VENTAS WHERE TIDO_COD = 31 AND COVE_ID = 0
            INTO :MONTO;
        if (MONTO <> 0) then
            BEGIN
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTAINVEN INTO :CUENTA, :TIPOCUEN;
            IF (CUENTA IS NULL) THEN
                begin
                EXECUTE PROCEDURE ERROR (31, 0, :CTAINVEN, 2);
                CUENTA = CTAINVEN;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT ARTI_COD, CANT * COSTO
                    FROM COSTO_VENTAS  WHERE TIDO_COD = 31 AND COVE_ID = 0
                    INTO :ART, :MONTO
                DO
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTAINVEN, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                    NROI = NROI + 1;
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAINVEN, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAINVEN, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                END
            END /* MONTO <> 0 */
        END /* INVEN = K */
    /* recorra las cuentas adicionales */
    FOR SELECT INVC_CUENTA, INVC_BASE, INVC_PORC, INVC_VALOR, INVC_DB
        FROM INTERFAZ_VENTAS_CTAS
        WHERE INVE_ID = :IDINTER
        INTO :CTADIC, :BASEADIC, :PORCADIC, :VALORADIC, :DBADIC
        DO
        BEGIN
        if (VALORADIC <> 0) then
            MONTO = VALORADIC;
        ELSE
            BEGIN
            if (:BASEADIC = 'SUBTOTAL') then
                VALORADIC = vrsubt;
            if (:BASEADIC = 'DESCUENTO') then
                VALORADIC = VRDTO;
            if (:BASEADIC = 'IVA') then
                VALORADIC = VRIVA;
            if (:BASEADIC = 'ADICIONAL') then
                VALORADIC = VRADIC;
            if (:BASEADIC = 'EXTRA') then
                VALORADIC = VREXTRA;
            if (:BASEADIC = 'TOTAL') then
                VALORADIC = VRTOTAL;
            MONTO = VALORADIC * PORCADIC / 100;
            END
        if (MONTO <> 0) then
            BEGIN
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTADIC INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERROR (31, 0, :CTADIC, 2);
                CUENTA = CTADIC;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                begin
                EXECUTE PROCEDURE ERROR (31, 0, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'C') then
                BEGIN
                if (DBADIC = 'S') then
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                ELSE
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                if (DBADIC = 'S') then
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                ELSE
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                END
            NROI = NROI + 1;
            END
        END
    if (ERROR > 0) then
        VER = 'S';
    SUSPEND;
    END /* EXISTE LA INTERFAZ */
ELSE
    BEGIN
    EXECUTE PROCEDURE ERROR (31, 0, :PREF, 1);
    ERROR = ERROR + 1;
    VER = 'S';
    SUSPEND;
    END
END
^

SET TERM ; ^

/* 20090519d */
/* DEBITOS Y CREDITOS POR SEPARADO AL CONTABILZAR */

SET TERM ^ ;

CREATE OR ALTER PROCEDURE CONTABIL_AJUSTE(
    IDDOC INTEGER,
    IDINTER INTEGER)
RETURNS (
    ERROR INTEGER,
    VER CHAR(1),
    IDC INTEGER)
AS
declare variable PREFIJO VARCHAR(4);
declare variable NUMERO VARCHAR(6);
declare variable FECAUX DATE;
declare variable FECHA CHAR(8);
declare variable CONCEPTO CHAR(60);
declare variable TIPOCOMP VARCHAR(3);
declare variable PREFCONT VARCHAR(4);
declare variable BASE CHAR(1);
declare variable IVAV CHAR(1);
declare variable CONSUMO CHAR(1);
declare variable TOTAL CHAR(1);
declare variable CTABASE VARCHAR(20);
declare variable CTAIVA VARCHAR(20);
declare variable CTACONSUMO VARCHAR(20);
declare variable CTACIERRE VARCHAR(20);
declare variable EXISTE CHAR(1);
declare variable CUENTA VARCHAR(20);
declare variable MONTO NUMERIC(18,2);
declare variable ES_TERCERO CHAR(1);
declare variable ES_CENTRO CHAR(1);
declare variable TIPOCUEN CHAR(1);
declare variable NIT VARCHAR(20);
declare variable NITDET VARCHAR(20);
declare variable PROY VARCHAR(4);
declare variable CENTRO VARCHAR(4);
declare variable DEBITO NUMERIC(18,2);
declare variable CREDITO NUMERIC(18,2);
declare variable NUMITEMS INTEGER;
declare variable ARTICULO VARCHAR(15);
declare variable SUMA NUMERIC(18,2);
declare variable VRBASE NUMERIC(18,2);
declare variable CUENTAADIC VARCHAR(20);
declare variable BASEADIC VARCHAR(20);
declare variable PORCADIC NUMERIC(5,2);
declare variable VALORADIC NUMERIC(18,2);
declare variable DBADIC CHAR(1);
declare variable ANULADO CHAR(1);
declare variable CENT CHAR(1);
BEGIN
  /* BUSQUE LA INTERFACE */
  EXISTE = 'N';
  SELECT 'S', PREF_PRE, TICO_COD, PRCO_PREF, ININ_BASE, ININ_IVAV, ININ_CONSUMO, ININ_TOTAL, ININ_CTABASE, ININ_CTAIVA, ININ_CTACONSUMO, ININ_CTACIERRE, ININ_CONFIRMAR, ININ_CENTRO
    FROM INTERFAZ_INVENTARIO
    WHERE ININ_ID = :IDINTER
    INTO :EXISTE, :PREFIJO, :TIPOCOMP, :PREFCONT, :BASE, :IVAV, :CONSUMO, :TOTAL, :CTABASE, :CTAIVA, :CTACONSUMO, :CTACIERRE, :VER, :CENT;

  if (EXISTE = 'S') then
    BEGIN
    DELETE FROM contabilizacion WHERE CNTB_TIPOREF = 14 AND CNTB_IDREF = :IDDOC;

    /* TRAIGA EL ENCABEZADO DEL AJUSTE */
    SELECT PREF_PRE, AJUS_NUMERO, AJUS_FECHA, AJUS_CONC, AJUS_ANULADO
        FROM AJUSTES
        WHERE AJUS_ID = :IDDOC
        INTO :PREFIJO, :NUMERO, :FECAUX, :CONCEPTO, :ANULADO;
    if (ANULADO = 'N') then
        BEGIN
        if (CENT = 'B') then
           SELECT BODE_CENTRO, BODE_PROY FROM BODEGA B, AJUSTES A
              WHERE A.BODE_COD = B.BODE_COD AND A.AJUS_ID = :IDDOC INTO :CENTRO, :PROY;
        ELSE
            SELECT PREF_CENTRO, PREF_PROY FROM PREFIJOS P, AJUSTES A
                WHERE P.PREF_PRE = A.PREF_PRE AND P.TIDO_COD = 14 AND A.AJUS_ID = :IDDOC INTO :CENTRO, :PROY;
        /* CONVIERTA LA FECHA A CADENA */
        EXECUTE PROCEDURE FECHA_A_CONTA(:FECAUX) returning_values (:FECHA);
        IDC = GEN_ID(ID_CONTABILIZA, 1);
        /* REGISTRE EL ENCABEZADO CONTABLE */
        INSERT INTO CONTABILIZACION (CNTB_ID, CNTB_TIPOCOMP, CNTB_PREFCNT, CNTB_NUMERO, CNTB_FECHA, CNTB_CONCEPTO, CNTB_REF, CNTB_TIPOREF, CNTB_IDREF, CNTB_PREFREF, CNTB_NUMREF, CNTB_PROCESADO)
            VALUES (:IDC, :TIPOCOMP, :PREFCONT, :NUMERO, :FECHA, :CONCEPTO, '', 14, :IDDOC, :PREFIJO, :NUMERO, 'N');
        NUMITEMS = 0;
        SUMA = 0;
        /* PRIMERO LA BASE */
        if (BASE = 'A') then
            BEGIN
            /* SUME LOS AJUSTES POSITIVOS */
            FOR SELECT MAX(COAR_CTAINV), SUM((AJUS_EXNUE-AJUS_EXANT) * AJDE_COSTO)
                FROM ARTICULO A, CONTABIL_ARTICULO C, AJUSTES_DETALLE E
                WHERE E.AJUS_ID = :IDDOC AND E.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND AJUS_EXNUE > AJUS_EXANT
                GROUP BY COAR_CTAINV
                INTO :CTABASE, :MONTO
                DO
                BEGIN
                if (MONTO <> 0) then
                    BEGIN
                    VRBASE = MONTO;
                    /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
                    SELECT CUEN_COD, CUEN_TERCERO, CUEN_CENTRO, CUEN_TIPO
                        FROM CUENTAS
                        WHERE CUEN_COD = :CTABASE
                        INTO :CUENTA, :ES_TERCERO, :ES_CENTRO, :TIPOCUEN;
                    if (CUENTA IS NULL) then
                        begin
                        EXECUTE PROCEDURE ERROR (14, :IDDOC, :CTABASE, 2);
                        CUENTA = CTABASE;
                        ERROR = ERROR + 1;
                        end
                    /* DEFINA EL TERCERO */
                    NITDET = NIT;
                    /* DEPENDE DEL TIPO DE CUENTA */
                    if (TIPOCUEN = 'I') then
                        BEGIN
                        /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                        FOR SELECT E.ARTI_COD, ((AJUS_EXNUE-AJUS_EXANT) * AJDE_COSTO)
                            FROM ARTICULO A, CONTABIL_ARTICULO C, AJUSTES_DETALLE E
                            WHERE E.AJUS_ID = :IDDOC AND E.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTAINV = :CUENTA AND AJUS_EXNUE > AJUS_EXANT
                            INTO :ARTICULO, :MONTO
                            DO
                            BEGIN
                            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :MONTO, 0, 0, 0, :NITDET, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                            NUMITEMS = NUMITEMS + 1;
                            SUMA = SUMA + MONTO;
                            END
                        END
                    if (TIPOCUEN = 'C') then
                        BEGIN
                        EXECUTE PROCEDURE ERROR (14, :IDDOC, :CUENTA, 4);
                        TIPOCUEN = 'N';
                        ERROR = ERROR + 1;
                        END
                    if (TIPOCUEN = 'N') then
                        BEGIN
                        /* INSERTE EL REGISTRO DE LA BASE */
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :MONTO, 0, 0, 0, :NITDET, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NUMITEMS = NUMITEMS + 1;
                        SUMA = SUMA + MONTO;
                        END
                    END
                END /* FOR */
            /* LOS AJUSTES NEGATIVOS */
            FOR SELECT MAX(COAR_CTAINV), SUM((AJUS_EXANT-AJUS_EXNUE) * AJDE_COSTO)
                FROM ARTICULO A, CONTABIL_ARTICULO C, AJUSTES_DETALLE E
                WHERE E.AJUS_ID = :IDDOC AND E.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND AJUS_EXNUE < AJUS_EXANT
                GROUP BY COAR_CTAINV
                INTO :CTABASE, :MONTO
                DO
                BEGIN
                if (MONTO <> 0) then
                    BEGIN
                    VRBASE = MONTO;
                    /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
                    SELECT CUEN_COD, CUEN_TERCERO, CUEN_CENTRO, CUEN_TIPO
                        FROM CUENTAS
                        WHERE CUEN_COD = :CTABASE
                        INTO :CUENTA, :ES_TERCERO, :ES_CENTRO, :TIPOCUEN;
                    if (CUENTA IS NULL) then
                        begin
                        EXECUTE PROCEDURE ERROR (14, :IDDOC, :CTABASE, 2);
                        CUENTA = CTABASE;
                        ERROR = ERROR + 1;
                        end
                    /* DEFINA EL TERCERO */
                    NITDET = NIT;
                    /* DEPENDE DEL TIPO DE CUENTA */
                    if (TIPOCUEN = 'I') then
                        BEGIN
                        /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                        FOR SELECT E.ARTI_COD, ((AJUS_EXANT-AJUS_EXNUE) * AJDE_COSTO)
                            FROM ARTICULO A, CONTABIL_ARTICULO C, AJUSTES_DETALLE E
                            WHERE E.AJUS_ID = :IDDOC AND E.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTAINV = :CUENTA AND AJUS_EXNUE < AJUS_EXANT
                            INTO :ARTICULO, :MONTO
                            DO
                            BEGIN
                            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :MONTO, 0, 0, :NITDET, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                            NUMITEMS = NUMITEMS + 1;
                            SUMA = SUMA - MONTO;
                            END
                        END
                    if (TIPOCUEN = 'C') then
                        BEGIN
                        EXECUTE PROCEDURE ERROR (14, :IDDOC, :CUENTA, 4);
                        TIPOCUEN = 'N';
                        ERROR = ERROR + 1;
                        END
                    if (TIPOCUEN = 'N') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :MONTO, 0, 0, :NITDET, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NUMITEMS = NUMITEMS + 1;
                        SUMA = SUMA - MONTO;
                        END
                    END
                END /* FOR */
            END /* BASE */
        if (BASE = 'K') then
            BEGIN
            CUENTA = :ctabase;
            /* SUME LAS BASES DE LOS ARTICULOS DEL DOCUMENTO */
            SELECT SUM((AJUS_EXNUE-AJUS_EXANT) * AJDE_COSTO) FROM AJUSTES_DETALLE E
                WHERE E.AJUS_ID = :IDDOC AND AJUS_EXNUE > AJUS_EXANT INTO :MONTO;
        
            if (MONTO <> 0) then
                BEGIN
                /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
                SELECT CUEN_COD, CUEN_TERCERO, CUEN_CENTRO, CUEN_TIPO
                    FROM CUENTAS
                    WHERE CUEN_COD = :CTABASE
                    INTO :CUENTA, :ES_TERCERO, :ES_CENTRO, :TIPOCUEN;
                if (CUENTA IS NULL) then
                    begin
                    EXECUTE PROCEDURE ERROR (14, :IDDOC, :CTABASE, 2);
                    CUENTA = CTABASE;
                    ERROR = ERROR + 1;
                    end
                /* DEFINA EL TERCERO */
                NITDET = NIT;
                /* DEPENDE DEL TIPO DE CUENTA */
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT E.ARTI_COD, ((AJUS_EXNUE-AJUS_EXANT) * AJDE_COSTO)
                        FROM ARTICULO A, CONTABIL_ARTICULO C, AJUSTES_DETALLE E
                        WHERE E.AJUS_ID = :IDDOC AND E.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTAINV = :CUENTA AND AJUS_EXNUE > AJUS_EXANT 
                        INTO :ARTICULO, :MONTO
                        DO
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :MONTO, 0, 0, 0, :NITDET, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                        NUMITEMS = NUMITEMS + 1;
                        SUMA = SUMA + MONTO;
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (14, :IDDOC, :CUENTA, 4);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    /* INSERTE EL REGISTRO DE LA BASE */
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :MONTO, 0, 0, 0, :NITDET, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NUMITEMS = NUMITEMS + 1;
                    SUMA = SUMA + MONTO;
                    END
                END
            CUENTA = :ctabase;
            /* SUME LAS BASES DE LOS ARTICULOS DEL DOCUMENTO */
            SELECT SUM((AJUS_EXANT-AJUS_EXNUE) * AJDE_COSTO) FROM AJUSTES_DETALLE E
                WHERE E.AJUS_ID = :IDDOC AND AJUS_EXNUE < AJUS_EXANT INTO :MONTO;
        
            if (MONTO <> 0) then
                BEGIN
                /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
                SELECT CUEN_COD, CUEN_TERCERO, CUEN_CENTRO, CUEN_TIPO
                    FROM CUENTAS
                    WHERE CUEN_COD = :CTABASE
                    INTO :CUENTA, :ES_TERCERO, :ES_CENTRO, :TIPOCUEN;
                if (CUENTA IS NULL) then
                    begin
                    EXECUTE PROCEDURE ERROR (14, :IDDOC, :CTABASE, 2);
                    CUENTA = CTABASE;
                    ERROR = ERROR + 1;
                    end
                /* DEFINA EL TERCERO */
                NITDET = NIT;
                /* DEPENDE DEL TIPO DE CUENTA */
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT E.ARTI_COD, ((AJUS_EXANT-AJUS_EXNUE) * AJDE_COSTO)
                        FROM ARTICULO A, CONTABIL_ARTICULO C, AJUSTES_DETALLE E
                        WHERE E.AJUS_ID = :IDDOC AND E.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTAINV = :CUENTA AND AJUS_EXNUE < AJUS_EXANT
                        INTO :ARTICULO, :MONTO
                        DO
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :MONTO, 0, 0, :NITDET, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                        NUMITEMS = NUMITEMS + 1;
                        SUMA = SUMA - MONTO;
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (14, :IDDOC, :CUENTA, 4);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    /* INSERTE EL REGISTRO DE LA BASE */
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :MONTO, 0, 0, :NITDET, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NUMITEMS = NUMITEMS + 1;
                    SUMA = SUMA - MONTO;
                    END
                END
            END /* BASE K O T */
        /* recorra las cuentas adicionales */
        FOR SELECT INIC_CUENTA, INIC_BASE, INIC_PORC, INIC_VALOR, INIC_DB
            FROM INTERFAZ_INVENTARIO_CTAS
            WHERE ININ_ID = :IDINTER
            INTO :CUENTAADIC, :BASEADIC, :PORCADIC, :VALORADIC, :DBADIC
            DO
            BEGIN
            if (VALORADIC <> 0) then
                MONTO = VALORADIC;
            ELSE
                BEGIN
                if ((:BASEADIC = 'SUBTOTAL') or (:BASEADIC = 'TOTAL')) then
                    SELECT SUM((AJUS_EXNUE-AJUS_EXANT) * AJDE_COSTO) FROM
                        AJUSTES_DETALLE WHERE AJUS_ID = :iddoc INTO :VALORADIC;
                MONTO = ABS(VALORADIC * PORCADIC / 100);
                END
            if (monto <> 0) then
                begin
                /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
                CUENTA = NULL;
                SELECT CUEN_COD, CUEN_TERCERO, CUEN_CENTRO, CUEN_TIPO
                    FROM CUENTAS
                    WHERE CUEN_COD = :CUENTAADIC
                    INTO :CUENTA, :ES_TERCERO, :ES_CENTRO, :TIPOCUEN;
                if (CUENTA IS NULL) then
                    begin
                    EXECUTE PROCEDURE ERROR (14, :IDDOC, :CUENTAADIC, 2);
                    CUENTA = CUENTAADIC;
                    ERROR = ERROR + 1;
                    end
                /* DEFINA EL TERCERO */
                NITDET = NIT;
                /* DEPENDE DEL TIPO DE CUENTA */
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (14, :IDDOC, :CUENTA, 3);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (14, :IDDOC, :CUENTA, 4);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    if (DBADIC = 'S') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTAADIC, :CONCEPTO, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NITDET, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        SUMA = SUMA + MONTO;
                        END
                    ELSE
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTAADIC, :CONCEPTO, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NITDET, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        SUMA = SUMA - MONTO;
                        END
                    NUMITEMS = NUMITEMS + 1;
                    END
                end
            END
        /* CIERRE EL COMPROBANTE CONTRA LA CUENTA DEL TERCERO O LA CONSTANTE */
        if (SUMA <> 0) then
            BEGIN
            if (SUMA > 0) then
                BEGIN
                DEBITO = 0;
                CREDITO = SUMA;
                END
            ELSE
                BEGIN
                DEBITO = SUMA * -1;
                CREDITO = 0;
                END
            /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
            SELECT CUEN_COD, CUEN_TERCERO, CUEN_CENTRO, CUEN_TIPO
                FROM CUENTAS
                WHERE CUEN_COD = :CTACIERRE
                INTO :CUENTA, :ES_TERCERO, :ES_CENTRO, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERROR (14, :IDDOC, :CTACIERRE, 2);
                CUENTA = CTACIERRE;
                ERROR = ERROR + 1;
                end
            /* DEFINA EL TERCERO */
            NITDET = NIT;
            /* DEPENDE DEL TIPO DE CUENTA */
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERROR (14, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                EXECUTE PROCEDURE ERROR (14, :IDDOC, :CUENTA, 4);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'N') then
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :DEBITO, :CREDITO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            END /* SUMA */
        if (ERROR > 0) then
            VER = 'S';
        END /* EXISTE LA INTERFAZ */
      END
  ELSE
    BEGIN
    EXECUTE PROCEDURE ERROR (14, :IDDOC, :PREFIJO, 1);
    ERROR = ERROR + 1;
    VER = 'S';
    END
SUSPEND;
END
^

SET TERM ; ^


UPDATE CAJAS SET CAJA_ACTIVA = 'S' WHERE CAJA_ACTIVA IS NULL;
COMMIT WORK;

update revision set revi_FECHA = '2009/05/19';
COMMIT WORK;

SET TERM ^ ;

CREATE OR ALTER PROCEDURE CONSULTA_ARTICULOS_VTAS(
    FECHA DATE,
    INACTIVOS CHAR(1),
    MODULO VARCHAR(20),
    BUSCAR VARCHAR(100),
    CUALQUIERA CHAR(1),
    COLUMNA INTEGER,
    BUSCAR2 VARCHAR(30),
    BUSCAR3 VARCHAR(30),
    BUSCAR4 VARCHAR(30),
    BUSCAR5 VARCHAR(30))
RETURNS (
    CODIGO VARCHAR(20),
    DES VARCHAR(60),
    REF VARCHAR(20),
    GRUPO VARCHAR(30),
    MARCA VARCHAR(30),
    UNIDAD VARCHAR(8),
    ESTADO VARCHAR(30),
    IVA NUMERIC(9,2),
    EXISTEN NUMERIC(18,2),
    PRECIO NUMERIC(18,2),
    CLASE CHAR(1))
AS
DECLARE VARIABLE LISTA INTEGER;
DECLARE VARIABLE EXIST CHAR(2);
DECLARE VARIABLE SINEXIST CHAR(2);
declare variable DIG INTEGER;
declare variable OK CHAR(1);
BEGIN
EXISTEN = 0;
EXECUTE PROCEDURE lee_configuracion ('FACTURACION','ARTICULOS', 'VER EXISTENCIA EN CONSULTA ARTICULOS') returning_values (:EXIST);
EXECUTE PROCEDURE lee_configuracion ('FACTURACION','FACTURAS', 'CODIGO DE LA LISTA DE PRECIOS A MOSTRAR EN ARTICULOS') returning_values (:LISTA);
if (modulo = 'FACTURACION') then
  EXECUTE PROCEDURE lee_configuracion ('FACTURACION','ARTICULOS','VER ARTICULOS SIN EXISTENCIA EN CONSULTA DE ARTICULOS') returning_values (:sinexist);
else
  sinexist = 'SI';
EXECUTE PROCEDURE LEE_CONFIGURACION ('FACTURACION', 'ARTICULOS', 'REDONDEO AL MULTIPLO DE DIEZ EN PRECIOS') returning_values (DIG);
if (LISTA > 0) then
    BEGIN
    if ((BUSCAR IS NOT NULL) AND (BUSCAR <> '')) then
        FOR select a.arti_cod, arti_des, grup_cod, arti_unidad, esar_cod, taiv_porc, marc_cod,arti_clase
            from articulo a, tarifa_iva t
            where a.taiv_cod = t.taiv_cod and substring(a.arti_cod from 1 FOR 2) <> '.t' and
            ((:INACTIVOS = 'S') or (esar_cod = 'A') or ((:INACTIVOS = 'C') AND (esar_cod = 'N'))) AND
            ((:COLUMNA <> 0) or (upper(A.ARTI_COD) like upper(:buscar))) AND
            ((:columna <> 1) or (upper(A.ARTI_DES) like upper(:buscar))) AND
            ((:columna <> 2) or (upper(A.ARTI_OBS) like upper(:buscar)) or (upper(A.ARTI_DES) like upper(:buscar)))
            INTO :CODIGO, :DES, :GRUPO, :UNIDAD, :ESTADO, :IVA, :MARCA, :CLASE
            do
            begin
            select first 1 coba_cod from barras_articulo where arti_cod = :codigo into :ref;
            if ((COLUMNA <> 3) or (upper(REF) like upper(:buscar))) then
                BEGIN
                OK = 'N';
                PRECIO = 0;
                SELECT prar_fijo PRECIO FROM precios_articulo WHERE arti_cod = :CODIGO and lipr_cod = :LISTA INTO :PRECIO;
                EXECUTE PROCEDURE redondee(PRECIO, DIG) returning_values (PRECIO);
                if (EXIST = 'SI') then
                    BEGIN
/*                    existen = 0;
                    SELECT FIRST 1 COST_SALDOC+COST_ENTC-COST_SALC
                        FROM COSTOS WHERE ARTI_COD = :codigo AND COST_FECHA <= :FECHA
                        ORDER BY COST_FECHA DESC,COST_ITEM DESC
                        INTO :existen;
                    if (existen is null) then
                        existen = 0;*/
                    EXECUTE PROCEDURE saldo_total_inventario (:CODIGO, :FECHA) returning_values (:EXISTEN);
                    if ((SINEXIST = 'SI')  or (existen <> 0)) then
                        OK = 'S';
                    END
                ELSE
                    OK = 'S';
                if (ok = 'S') then
                    if (CUALQUIERA = 'S') then
                        SUSPEND;
                    ELSE
                        if (BUSCAR2 <> '') then
                            BEGIN
                            IF (NOT EXISTS (SELECT ARTI_COD FROM ARTICULO WHERE ARTI_COD = :CODIGO AND ((upper(ARTI_DES) like upper(:BUSCAR2)) or (UPPER(ARTI_OBS) LIKE UPPER(:BUSCAR2))))) THEN
                                OK = 'N';
                            if ((OK = 'S') AND (BUSCAR3 <> '')) then
                                IF (NOT EXISTS (SELECT ARTI_COD FROM ARTICULO WHERE ARTI_COD = :CODIGO AND ((upper(ARTI_DES) like upper(:BUSCAR3)) or (UPPER(ARTI_OBS) LIKE UPPER(:BUSCAR3))))) THEN
                                    OK = 'N';
                            if ((OK = 'S') AND (BUSCAR4 <> '')) then
                                IF (NOT EXISTS (SELECT ARTI_COD FROM ARTICULO WHERE ARTI_COD = :CODIGO AND ((upper(ARTI_DES) like upper(:BUSCAR4)) or (UPPER(ARTI_OBS) LIKE UPPER(:BUSCAR4))))) THEN
                                    OK = 'N';
                            if ((OK = 'S') AND (BUSCAR4 <> '')) then
                                IF (NOT EXISTS (SELECT ARTI_COD FROM ARTICULO WHERE ARTI_COD = :CODIGO AND ((upper(ARTI_DES) like upper(:BUSCAR4)) or (UPPER(ARTI_OBS) LIKE UPPER(:BUSCAR4))))) THEN
                                    OK = 'N';
                            if ((OK = 'S') AND (BUSCAR5 <> '')) then
                                IF (NOT EXISTS (SELECT ARTI_COD FROM ARTICULO WHERE ARTI_COD = :CODIGO AND ((upper(ARTI_DES) like upper(:BUSCAR5)) or (UPPER(ARTI_OBS) LIKE UPPER(:BUSCAR5))))) THEN
                                    OK = 'N';
                            if (OK = 'S') then
                                SUSPEND;
                            END
                        ELSE
                            SUSPEND;
                END
            end
    ELSE
        FOR select a.arti_cod, arti_des, grup_cod, arti_unidad, esar_cod, taiv_porc, marc_cod,arti_clase
            from articulo a, tarifa_iva t
            where a.taiv_cod = t.taiv_cod and substring(a.arti_cod from 1 FOR 2) <> '.t' and
            ((:INACTIVOS = 'S') or (esar_cod = 'A') or ((:INACTIVOS = 'C') AND (esar_cod = 'N')))
            INTO :CODIGO, :DES, :GRUPO, :UNIDAD, :ESTADO, :IVA, :MARCA, :CLASE
            do
            begin
            select first 1 coba_cod from barras_articulo where arti_cod = :codigo into :ref;
            PRECIO = 0;
            SELECT prar_fijo PRECIO FROM precios_articulo WHERE arti_cod = :CODIGO and lipr_cod = :LISTA INTO :PRECIO;
            EXECUTE PROCEDURE redondee(PRECIO, DIG) returning_values (PRECIO);
            if (EXIST = 'SI') then
                BEGIN
/*                existen = 0;
                SELECT FIRST 1 COST_SALDOC+COST_ENTC-COST_SALC
                    FROM COSTOS WHERE ARTI_COD = :codigo AND COST_FECHA <= :FECHA
                    ORDER BY COST_FECHA DESC,COST_ITEM DESC
                    INTO :existen;
                if (existen is null) then
                    existen = 0;*/
                EXECUTE PROCEDURE saldo_total_inventario (:CODIGO, :FECHA) returning_values (:EXISTEN);
                if ((SINEXIST = 'SI')  or (existen <> 0)) then
                    SUSPEND;
                END
            ELSE
                SUSPEND;
            END
    END
ELSE
    if ((BUSCAR IS NOT NULL) AND (BUSCAR <> '')) then
        FOR select arti_cod, arti_des, grup_cod, arti_unidad, esar_cod, taiv_porc, arti_precio, marc_cod, arti_clase
            from articulo a, tarifa_iva t
            where a.taiv_cod = t.taiv_cod and substring(a.arti_cod from 1 FOR 2) <> '.t' and
            ((:INACTIVOS = 'S') or (esar_cod = 'A') or ((:INACTIVOS = 'C') AND (esar_cod = 'N'))) AND
            ((:COLUMNA <> 0) or (upper(A.ARTI_COD) like upper(:buscar))) AND
            ((:columna <> 1) or (upper(A.ARTI_DES) like upper(:buscar))) AND
            ((:columna <> 2) or (upper(A.ARTI_OBS) like upper(:buscar)) or (upper(A.ARTI_DES) like upper(:buscar)))
            INTO :CODIGO, :DES, :GRUPO, :UNIDAD, :ESTADO, :IVA, :PRECIO, :MARCA, :CLASE
            do
            begin
            select first 1 coba_cod from barras_articulo where arti_cod = :codigo into :ref;
            if ((COLUMNA <> 3) or (upper(REF) like upper(:buscar))) then
                BEGIN
                if (EXIST = 'SI') then
                    BEGIN
/*                    existen = 0;
                    SELECT FIRST 1 COST_SALDOC+COST_ENTC-COST_SALC
                        FROM COSTOS WHERE ARTI_COD = :codigo AND COST_FECHA <= :FECHA
                        ORDER BY COST_FECHA DESC,COST_ITEM DESC
                        INTO :existen;
                    if (existen is null) then
                        existen = 0;*/
                    EXECUTE PROCEDURE saldo_total_inventario (:CODIGO, :FECHA) returning_values (:EXISTEN);
                    if ((SINEXIST = 'SI') or (existen <> 0)) then
                        OK = 'S';
                    END
                ELSE
                    OK = 'S';
                if (ok = 'S') then
                    if (CUALQUIERA = 'S') then
                        SUSPEND;
                    ELSE
                        if (BUSCAR2 <> '') then
                            BEGIN
                            IF (NOT EXISTS (SELECT ARTI_COD FROM ARTICULO WHERE ARTI_COD = :CODIGO AND ((upper(ARTI_DES) like upper(:BUSCAR2)) or (UPPER(ARTI_OBS) LIKE UPPER(:BUSCAR2))))) THEN
                                OK = 'N';
                            if ((OK = 'S') AND (BUSCAR3 <> '')) then
                                IF (NOT EXISTS (SELECT ARTI_COD FROM ARTICULO WHERE ARTI_COD = :CODIGO AND ((upper(ARTI_DES) like upper(:BUSCAR3)) or (UPPER(ARTI_OBS) LIKE UPPER(:BUSCAR3))))) THEN
                                    OK = 'N';
                            if ((OK = 'S') AND (BUSCAR4 <> '')) then
                                IF (NOT EXISTS (SELECT ARTI_COD FROM ARTICULO WHERE ARTI_COD = :CODIGO AND ((upper(ARTI_DES) like upper(:BUSCAR4)) or (UPPER(ARTI_OBS) LIKE UPPER(:BUSCAR4))))) THEN
                                    OK = 'N';
                            if ((OK = 'S') AND (BUSCAR4 <> '')) then
                                IF (NOT EXISTS (SELECT ARTI_COD FROM ARTICULO WHERE ARTI_COD = :CODIGO AND ((upper(ARTI_DES) like upper(:BUSCAR4)) or (UPPER(ARTI_OBS) LIKE UPPER(:BUSCAR4))))) THEN
                                    OK = 'N';
                            if ((OK = 'S') AND (BUSCAR5 <> '')) then
                                IF (NOT EXISTS (SELECT ARTI_COD FROM ARTICULO WHERE ARTI_COD = :CODIGO AND ((upper(ARTI_DES) like upper(:BUSCAR5)) or (UPPER(ARTI_OBS) LIKE UPPER(:BUSCAR5))))) THEN
                                    OK = 'N';
                            if (OK = 'S') then
                                SUSPEND;
                            END
                        ELSE
                            SUSPEND;
                END
            end
    ELSE
        FOR select arti_cod, arti_des, grup_cod, arti_unidad, esar_cod, taiv_porc, arti_precio, marc_cod, arti_clase
            from articulo a, tarifa_iva t
            where a.taiv_cod = t.taiv_cod and substring(a.arti_cod from 1 FOR 2) <> '.t' and
            ((:INACTIVOS = 'S') or (esar_cod = 'A') or ((:INACTIVOS = 'C') AND (esar_cod = 'N')))
            INTO :CODIGO, :DES, :GRUPO, :UNIDAD, :ESTADO, :IVA, :PRECIO, :MARCA, :CLASE
            do
            begin
            select first 1 coba_cod from barras_articulo where arti_cod = :codigo into :ref;
            if (EXIST = 'SI') then
                BEGIN
/*                existen = 0;
                SELECT FIRST 1 COST_SALDOC+COST_ENTC-COST_SALC
                    FROM COSTOS WHERE ARTI_COD = :codigo AND COST_FECHA <= :FECHA
                    ORDER BY COST_FECHA DESC,COST_ITEM DESC
                    INTO :existen;
                if (existen is null) then
                    existen = 0;*/
                EXECUTE PROCEDURE saldo_total_inventario (:CODIGO, :FECHA) returning_values (:EXISTEN);
                if ((SINEXIST = 'SI') or (existen <> 0)) then
                    SUSPEND;
                END
            ELSE
                SUSPEND;
            end
END
^

SET TERM ; ^

/* 20090518 */ 
INSERT INTO CONFIGURACION (CONF_MODULO, CONF_CATEGORIA, CONF_PROPIEDAD, CONF_VALOR, CONF_POSIBLES, CONF_AYUDA) VALUES ('INVENTARIO', 'EXISTENCIAS', 'REPLICAR MOVIMIENTOS DE INVENTARIO EN COMPAÑIA DE EXISTENCIAS', 'NO', 'SI,NO', 'SI: Genera entradas y salidas de mercancia en la compañia de consulta de existencias por cada compra o venta');
commit work;

/* 20090520 */
/* NO INCLUIA LOS CRUCES POR RECIBO DE CAJA */

SET TERM ^ ;

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

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

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

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

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

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

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

FOR SELECT E.EGRE_ID, PREF_PRE, EGRE_NUMERO, EGRE_FECHA, EGRE_CONC, TERC_NIT, EGDE_ABONO+EGDE_DTOF, EGDE_RTFTE, EGDE_RTIVA, EGDE_RTICA
    FROM EGRESOS_DETALLE D, EGRESOS E
    WHERE E.EGRE_ID = D.EGRE_ID AND E.EGRE_ID <> 0 AND EGRE_ANULADO = 'N' AND TERC_NIT >= :PRVINI AND TERC_NIT <= :PRVFIN
    ORDER BY EGRE_FECHA
    INTO :IDR, :PREF, :NUMERO, :FECHA, :CONC, :NIT, :MONTO, :RTFTE, :RTIVA, :RTICA
    DO
    BEGIN
    EXISTE = 'N';
    SELECT 'S' FROM MOVIMIENTO_PROVEEDOR WHERE MVPR_TIPOREF = 62 AND MVPR_IDREF = :ID INTO :EXISTE;
    if (EXISTE = 'S') then
        begin
        UPDATE movimiento_proveedor
            SET MVPR_MONTO = MVPR_MONTO + :MONTO,
                MVPR_RTFTE = MVPR_RTFTE + :rtfte,
                MVPR_RTIVA = MVPR_RTIVA + :rtiva,
                MVPR_RTICA = MVPR_RTICA + :rtica
            WHERE MVPR_TIPOREF = 62 AND MVPR_IDREF = :IDR;
        end
    ELSE
        INSERT INTO MOVIMIENTO_PROVEEDOR (MVPR_ID, TERC_NIT, MVPR_TIPOREF, MVPR_IDREF, MVPR_FECHA, MVPR_VENCE, MVPR_CONC, MVPR_MONTO, MVPR_RTFTE, MVPR_RTIVA, MVPR_RTICA, MVPR_DEBITO, MVPR_ABONO, MVPR_PREFIJO, MVPR_NUMERO)
            VALUES (GEN_ID(ID_MOVPROV, 1), :NIT, 62, :IDR, :FECHA, :FECHA, :CONC, :MONTO, :RTFTE, :RTIVA, :RTICA, 'N', 'S', :PREF, :NUMERO);
    END

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

SET TERM ; ^


SET TERM ^ ;

CREATE OR ALTER PROCEDURE CHEQUEO_SALDOS_DOC_CXPAGAR(
    PRVINI VARCHAR(20),
    PRVFIN VARCHAR(20))
RETURNS (
    ERROR VARCHAR(60),
    TIPO INTEGER,
    ID INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(6))
AS
declare variable FECHA DATE;
declare variable NIT VARCHAR(20);
declare variable RTFTE NUMERIC(18, 2);
declare variable RTIVA NUMERIC(18, 2);
declare variable RTICA NUMERIC(18, 2);
declare variable MONTO NUMERIC(18, 2);
declare variable EXISTE CHAR(1);
declare variable IDR INTEGER;
declare variable EGREID INTEGER;
declare variable TRM NUMERIC(18, 2);
BEGIN
DELETE FROM anticipos_proveedor WHERE EGRE_ID = 0;
DELETE FROM saldos_doc_cxpagar WHERE TERC_NIT >= :PRVINI AND TERC_NIT <= :PRVFIN;

FOR SELECT FACO_ID, FACO_FECHA, TERC_NIT, FACO_RTFTEMONTO, FACO_rtivamonto, FACO_rticamonto, FACO_TOTAL, FACO_TRM
    FROM FACTURAS_COMPRA WHERE FACO_ID <> 0 and faco_anulado = 'N' AND TERC_NIT >= :PRVINI AND TERC_NIT <= :PRVFIN
    ORDER BY FACO_FECHA
    INTO :ID, :FECHA, :nit,  :RTFTE, :RTIVA, :RTICA, :MONTO, :TRM
    DO
    INSERT INTO saldos_doc_cxpagar (SDCP_TIPOREF, SDCP_IDREF, SDCP_FECHA, TERC_NIT, SDCP_RTEFTE, SDCP_RTIVA, SDCP_RTICA, SDCP_ABONO, SDCP_ABRTFTE, SDCP_ABRTIVA, SDCP_ABRTICA, SDCP_DEBITO, SDCP_MONTO, SDCP_TRM)
        VALUES (21, :ID, :fecha, :nit, :rtfte, :rtiva, :rtica, 0, 0, 0, 0, 'S', :MONTO, :TRM);

FOR SELECT NDPR_ID, NDPR_FECHA, TERC_NIT, NDPR_RTFTEMONTO, NDPR_rtivamonto, NDPR_rticamonto, ndpr_monto+ndpr_ivamonto, NDPR_TRM
    FROM notas_debito_proveedor WHERE NDPR_ID <> 0 and NDPR_anulado = 'N' AND TERC_NIT >= :PRVINI AND TERC_NIT <= :PRVFIN
    ORDER BY NDPR_FECHA
    INTO :ID, :FECHA, :nit,  :RTFTE, :RTIVA, :RTICA, :MONTO, :TRM
    DO
    INSERT INTO saldos_doc_cxpagar (SDCP_TIPOREF, SDCP_IDREF, SDCP_FECHA, TERC_NIT, SDCP_RTEFTE, SDCP_RTIVA, SDCP_RTICA, SDCP_ABONO, SDCP_ABRTFTE, SDCP_ABRTIVA, SDCP_ABRTICA, SDCP_DEBITO, SDCP_MONTO, SDCP_TRM)
        VALUES (51, :ID, :fecha, :nit, :rtfte, :rtiva, :rtica, 0, 0, 0, 0, 'S', :MONTO, :TRM);

FOR SELECT DVCO_ID, DVCO_FECHA, TERC_NIT, DVCO_RTFTEMONTO, DVCO_rtivamonto, DVCO_rticamonto, dvco_total, DVCO_TRM
    FROM devoluciones_compras WHERE DVCO_ID <> 0 and DVCO_anulado = 'N' AND TERC_NIT >= :PRVINI AND TERC_NIT <= :PRVFIN
    ORDER BY DVCO_FECHA
    INTO :ID, :FECHA, :nit,  :RTFTE, :RTIVA, :RTICA, :MONTO, :TRM
    DO
    INSERT INTO saldos_doc_cxpagar (SDCP_TIPOREF, SDCP_IDREF, SDCP_FECHA, TERC_NIT, SDCP_RTEFTE, SDCP_RTIVA, SDCP_RTICA, SDCP_ABONO, SDCP_ABRTFTE, SDCP_ABRTIVA, SDCP_ABRTICA, SDCP_DEBITO, SDCP_MONTO, SDCP_TRM)
        VALUES (24, :ID, :fecha, :nit, :rtfte*-1, :rtiva*-1, :rtica*-1, 0, 0, 0, 0, 'N', :MONTO * -1, :TRM);

FOR SELECT NCPR_ID, NCPR_FECHA, TERC_NIT, NCPR_RTFTEMONTO, NCPR_rtivamonto, NCPR_rticamonto, ncpr_monto+ncpr_ivamonto, NCPR_TRM
    FROM notas_credito_proveedor WHERE NCPR_ID <> 0 and NCPR_anulado = 'N' AND TERC_NIT >= :PRVINI AND TERC_NIT <= :PRVFIN
    ORDER BY NCPR_FECHA
    INTO :ID, :FECHA, :nit,  :RTFTE, :RTIVA, :RTICA, :MONTO, :TRM
    DO
    INSERT INTO saldos_doc_cxpagar (SDCP_TIPOREF, SDCP_IDREF, SDCP_FECHA, TERC_NIT, SDCP_RTEFTE, SDCP_RTIVA, SDCP_RTICA, SDCP_ABONO, SDCP_ABRTFTE, SDCP_ABRTIVA, SDCP_ABRTICA, SDCP_DEBITO, SDCP_MONTO, SDCP_TRM)
        VALUES (52, :ID, :fecha, :nit, :rtfte*-1, :rtiva*-1, :rtica*-1, 0, 0, 0, 0, 'N', :MONTO * -1, :TRM);

FOR SELECT ANPR_ID, ANPR_FECHA, TERC_NIT, ANPR_RTFTEMONTO, ANPR_rtivamonto, ANPR_rticamonto, anpr_base+anpr_ivamonto, ANPR_TRM
    FROM anticipos_proveedor WHERE ANPR_ID <> 0 and ANPR_anulado = 'N' AND TERC_NIT >= :PRVINI AND TERC_NIT <= :PRVFIN
    ORDER BY ANPR_FECHA
    INTO :ID, :FECHA, :nit,  :RTFTE, :RTIVA, :RTICA, :MONTO, :TRM
    DO
    INSERT INTO saldos_doc_cxpagar (SDCP_TIPOREF, SDCP_IDREF, SDCP_FECHA, TERC_NIT, SDCP_RTEFTE, SDCP_RTIVA, SDCP_RTICA, SDCP_ABONO, SDCP_ABRTFTE, SDCP_ABRTIVA, SDCP_ABRTICA, SDCP_DEBITO, SDCP_MONTO, SDCP_TRM)
        VALUES (55, :ID, :fecha, :nit, :rtfte*-1, :rtiva*-1, :rtica*-1, 0, 0, 0, 0, 'N', :MONTO * -1, :TRM);

FOR SELECT APPD_TIPODOC, APPD_IDDOC, APPR_FECHA, TERC_NIT, APPD_APLICADO, APPD_RTFTE, APPD_RTIVA, APPD_RTICA, APPR_TRM
    FROM APLICACION_PROVEEDOR_DETALLE D, aplicacion_provedor A
    WHERE A.APPR_ID = D.appr_id AND A.APPR_ID <> 0 AND APPR_ANULADO = 'N' AND TERC_NIT >= :PRVINI AND TERC_NIT <= :PRVFIN
    ORDER BY APPR_FECHA
    INTO :TIPO, :ID, :FECHA, :NIT, :MONTO, :RTFTE, :RTIVA, :RTICA, :TRM
    DO
    BEGIN
    EXISTE = 'N';
    select 'S' from saldos_doc_cxpagar where sdcp_tiporef = :TIPO and sdcp_idref = :ID and sdcp_fecha = :fecha into :EXISTE;
    if (Existe = 'S') then
        begin
        /* actualice el saldo del dia */
        UPDATE saldos_doc_cxpagar
            SET SDCP_ABONO = SDCP_ABONO + :MONTO,
                SDCP_ABRTFTE = SDCP_ABRTFTE + :RTFTE,
                SDCP_ABRTIVA = SDCP_ABRTIVA + :RTIVA,
                SDCP_ABRTICA = SDCP_ABRTICA + :RTICA,
                SDCP_TRM = :TRM
            WHERE SDCP_TIPOREF = :TIPO AND SDCP_IDREF = :ID AND SDCP_FECHA = :fecha;
        END
    ELSE
        BEGIN
        /* Inserte un nuevo saldo diario */
        INSERT INTO saldos_doc_cxpagar (SDCP_TIPOREF, SDCP_IDREF, SDCP_FECHA, TERC_NIT, SDCP_RTEFTE, SDCP_RTIVA, SDCP_RTICA, SDCP_ABONO, SDCP_ABRTFTE, SDCP_ABRTIVA, SDCP_ABRTICA, SDCP_DEBITO, SDCP_MONTO, SDCP_TRM)
            VALUES (:TIPO, :ID, :fecha, :NIT, 0, 0, 0, :MONTO, :rtfte, :rtiva, :rtica, 'N', 0, :TRM);
        END
    END

FOR SELECT E.EGRE_ID, EGDE_TIPODOC, EGDE_IDDOC, EGRE_FECHA, TERC_NIT, EGDE_ABONO+EGDE_DTOF, EGDE_RTFTE, EGDE_RTIVA, EGDE_RTICA, EGRE_TRM
    FROM EGRESOS_DETALLE D, EGRESOS E
    WHERE E.EGRE_ID = D.EGRE_ID AND E.EGRE_ID <> 0 AND EGRE_ANULADO = 'N' AND TERC_NIT >= :PRVINI AND TERC_NIT <= :PRVFIN
    ORDER BY EGRE_FECHA
    INTO :IDR, :TIPO, :ID, :FECHA, :NIT, :MONTO, :RTFTE, :RTIVA, :RTICA, :TRM
    DO
    BEGIN
    EXISTE = 'N';
    if (TIPO = 55) then
        BEGIN
        SELECT EGRE_ID FROM anticipos_proveedor WHERE ANPR_ID = :ID INTO :EGREID;
        if (EGREID = IDR) then
            EXISTE = 'S';
        END
    if (EXISTE = 'N') then
        BEGIN
        select 'S' from saldos_doc_cxpagar where sdcp_tiporef = :TIPO and sdcp_idref = :ID and sdcp_fecha = :fecha into :EXISTE;
        if (Existe = 'S') then
            begin
            /* actualice el saldo del dia */
            UPDATE saldos_doc_cxpagar
                SET SDCP_ABONO = SDCP_ABONO + :MONTO,
                    SDCP_ABRTFTE = SDCP_ABRTFTE + :RTFTE,
                    SDCP_ABRTIVA = SDCP_ABRTIVA + :RTIVA,
                    SDCP_ABRTICA = SDCP_ABRTICA + :RTICA,
                    SDCP_TRM = :TRM
                WHERE SDCP_TIPOREF = :TIPO AND SDCP_IDREF = :ID AND SDCP_FECHA = :fecha;
            END
        ELSE
            BEGIN
            /* Inserte un nuevo saldo diario */
            INSERT INTO saldos_doc_cxpagar (SDCP_TIPOREF, SDCP_IDREF, SDCP_FECHA, TERC_NIT, SDCP_RTEFTE, SDCP_RTIVA, SDCP_RTICA, SDCP_ABONO, SDCP_ABRTFTE, SDCP_ABRTIVA, SDCP_ABRTICA, SDCP_DEBITO, SDCP_MONTO, SDCP_TRM)
                VALUES (:TIPO, :ID, :fecha, :NIT, 0, 0, 0, :MONTO, :rtfte, :rtiva, :rtica, 'N', 0, :TRM);
            END
        END
    END

FOR SELECT R.reca_id, D.rccr_tipodoc, D.rccr_iddoc, RECA_FECHA, TERC_NIT, D.rccr_abono+D.rccr_dtof, D.rccr_rtfte, D.rccr_rtiva, D.rccr_rtica, RECA_TRM
    FROM recibos_caja_crucec D, recibos_caja R
    WHERE R.reca_id = D.reca_id AND R.reca_id <> 0 AND RECA_ANULADO = 'N' AND TERC_NIT >= :PRVINI AND TERC_NIT <= :PRVFIN
    ORDER BY RECA_FECHA
    INTO :IDR, :TIPO, :ID, :FECHA, :NIT, :MONTO, :RTFTE, :RTIVA, :RTICA, :TRM
    DO
    BEGIN
    EXISTE = 'N';
    select 'S' from saldos_doc_cxpagar where sdcp_tiporef = :TIPO and sdcp_idref = :ID and sdcp_fecha = :fecha into :EXISTE;
    if (Existe = 'S') then
        begin
        /* actualice el saldo del dia */
        UPDATE saldos_doc_cxpagar
            SET SDCP_ABONO = SDCP_ABONO + :MONTO,
            SDCP_ABRTFTE = SDCP_ABRTFTE + :RTFTE,
            SDCP_ABRTIVA = SDCP_ABRTIVA + :RTIVA,
            SDCP_ABRTICA = SDCP_ABRTICA + :RTICA,
            SDCP_TRM = :TRM
            WHERE SDCP_TIPOREF = :TIPO AND SDCP_IDREF = :ID AND SDCP_FECHA = :fecha;
        END
    ELSE
        BEGIN
        /* Inserte un nuevo saldo diario */
        INSERT INTO saldos_doc_cxpagar (SDCP_TIPOREF, SDCP_IDREF, SDCP_FECHA, TERC_NIT, SDCP_RTEFTE, SDCP_RTIVA, SDCP_RTICA, SDCP_ABONO, SDCP_ABRTFTE, SDCP_ABRTIVA, SDCP_ABRTICA, SDCP_DEBITO, SDCP_MONTO, SDCP_TRM)
            VALUES (:TIPO, :ID, :fecha, :NIT, 0, 0, 0, :MONTO, :rtfte, :rtiva, :rtica, 'N', 0, :TRM);
        END
    END

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

SET TERM ; ^


/* 20090520b */
/* ASIGNAR VENCE = FECHA SI LA AUTORIZACION ESTA COMO DE CONTADO */
SET TERM ^ ;

CREATE OR ALTER TRIGGER FACTURAS_BI FOR FACTURAS
ACTIVE BEFORE INSERT POSITION 0
AS
declare variable NUMERO VARCHAR(6);
declare variable AUTOM CHAR(1);
declare variable EXISTE CHAR(1);
DECLARE VARIABLE VALCUPO CHAR(10);
declare variable DISPONIBLE NUMERIC(18,2);
declare variable OK CHAR(1);
declare variable SITOT CHAR(2);
declare variable CODCOBR INTEGER;
declare variable CODVEND INTEGER;
declare variable contado char(1);
declare variable BLOQAUTO CHAR(2);
declare variable FECCONTA VARCHAR(8);
declare variable FECBLO VARCHAR(8);
declare variable FECSERVER CHAR(2);
declare variable PREGTASA CHAR(2);
BEGIN
EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION', 'DOCUMENTOS', 'INHABILITAR FECHA EN DOCUMENTOS') returning_values (:fecserver);
if (FECSERVER = 'SI') then
    NEW.fact_fecha = CAST ('NOW' AS DATE);
/* doble moneda */
if ((NEW.fact_trm IS NULL) or (NEW.fact_trm = 0)) then
    NEW.fact_trm = 1;
EXECUTE PROCEDURE LEE_CONFIGURACION('GENERAL', 'GENERAL', 'PREGUNTAR TASA DE CAMBIO EN DOCUMENTOS DE CARTERA') returning_values (:pregtasa);
if (PREGTASA = 'SI') then
    BEGIN
    NEW.fact_dtomonto = NEW.fact_dtomonto * NEW.fact_trm;
    NEW.fact_comimonto = NEW.fact_comimonto * NEW.fact_trm;
    NEW.fact_adicional = NEW.fact_adicional * NEW.fact_trm;
    NEW.fact_ivamonto = NEW.fact_ivamonto * NEW.fact_trm;
    NEW.fact_rtftemonto = NEW.fact_rtftemonto * NEW.fact_trm;
    NEW.fact_rtivamonto = NEW.fact_rtivamonto * NEW.fact_trm;
    NEW.fact_rticamonto = NEW.fact_rticamonto * NEW.fact_trm;
    NEW.fact_extra = NEW.fact_extra * NEW.fact_trm;
    NEW.fact_dtofmonto = NEW.fact_dtofmonto * NEW.fact_trm;
    NEW.fact_total = NEW.fact_total * NEW.fact_trm;
    NEW.fact_dtoit1 = NEW.fact_dtoit1 * NEW.fact_trm;
    NEW.fact_dtoit2 = NEW.fact_dtoit2 * NEW.fact_trm;
    NEW.fact_dtoit3 = NEW.fact_dtoit3 * NEW.fact_trm;
    END
EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION', 'POS', 'CAMBIAR FECHA DE BLOQUEO AUTOMATICAMENTE AL CAMBIAR FECHA DE LA FACTURA') RETURNING_VALUES (:bloqauto);
if (bloqauto = 'SI') then
    BEGIN
    EXECUTE PROCEDURE LEE_CONFIGURACION ('CONTABILIDAD', 'GENERAL', 'FECHA DE BLOQUEO') RETURNING_VALUES (:FECBLO);
    EXECUTE PROCEDURE fecha_a_conta (NEW.fact_fecha) returning_values (:FECCONTA);
    if (FECBLO > FECCONTA) then
        EXCEPTION CONTABILIDAD_BLOQUEADA 'La contabilidad esta bloqueada a ' || :fecblo;
    if (FECBLO < FECCONTA) then
        UPDATE CONFIGURACION
            SET CONF_VALOR = :FECCONTA
            WHERE (CONF_MODULO = 'CONTABILIDAD') AND (CONF_CATEGORIA = 'GENERAL') AND (CONF_PROPIEDAD = 'FECHA DE BLOQUEO');
    END
OK = 'S';
EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'ACCION A TOMAR SI EL CUPO DE CREDITO ES INSUFICIENTE') RETURNING_VALUES (:VALCUPO);
select auto_contado, auto_numero from autorizaciones
    where pref_pre = new.pref_pre and tido_cod = 31 AND auto_inicial <= new.fact_numero and auto_final >= new.fact_numero and auto_fecha <= new.fact_fecha and auto_vence >= new.fact_fecha
    into :contado, new.auto_numero;
if (contado='N') then
    BEGIN
    IF (VALCUPO = 'PROHIBIR') THEN
        BEGIN
        OK = 'N';
        /* VERIFIQUE EL CUPO DE CREDITO */
        execute procedure cupo_disponible(new.TERC_NIT, NEW.fact_fecha, NEW.fact_sucursal) returning_values (:DISPONIBLE);
        if (DISPONIBLE >= (NEW.FACT_TOTAL-NEW.fact_recibido)) then
            OK = 'S';
        END
    END
else
    BEGIN
    /* ASEGURECE QUE QUEDA SIN DIAS DE CREDITO */
    NEW.fact_vence = NEW.fact_fecha;
    END
IF (OK = 'S') THEN
  begin
  /* calcule la comision */
  EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION', 'VENDEDORES', 'COMISIONES EN VENTA INCLUYENDO IMPUESTOS') returning_values (:SITOT);
  if ((NEW.fact_comiporc IS NULL) or (NEW.fact_comiporc = 0)) THEN
    BEGIN
    if (SITOT = 'SI') then
      SELECT MAX(COMI_PORC) FROM comisiones WHERE VEND_COD = NEW.vend_cod AND
        COMI_INICIAL <= NEW.fact_total AND COMI_FINAL >= NEW.fact_total
        INTO NEW.fact_comiporc;
    else
      SELECT MAX(COMI_PORC) FROM comisiones WHERE VEND_COD = NEW.vend_cod AND
        COMI_INICIAL <= (NEW.fact_total -NEW.fact_ivamonto) AND COMI_FINAL >= (NEW.fact_total -NEW.fact_ivamonto)
        INTO NEW.fact_comiporc;
    if (NEW.fact_comiporc IS NULL) then
        NEW.fact_comiporc = 0;
    END
  if (SITOT = 'SI') then
      NEW.fact_comimonto = NEW.fact_total * NEW.fact_comiporc / 100;
  ELSE
      NEW.fact_comimonto = (NEW.fact_total -NEW.fact_ivamonto) * NEW.fact_comiporc / 100;

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

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

SET TERM ; ^



/* 20090520c */
SET TERM ^ ;

CREATE OR ALTER TRIGGER CLIENTES_AI FOR CLIENTES
ACTIVE AFTER INSERT POSITION 0
as
declare variable NOMBRE VARCHAR(60);
declare variable DIR VARCHAR(60);
declare variable CIU VARCHAR(40);
declare variable TEL VARCHAR(40);
begin
/* INSERTE LA PRIMERA SUCURSAL */
SELECT TERC_NOM, TERC_DIR, TERC_CIU, TERC_TEL FROM TERCEROS WHERE TERC_NIT = NEW.terc_nit
    INTO :NOMBRE, :DIR, :CIU, :TEL;
INSERT INTO cliente_sucursales (TERC_NIT, CLCU_COD, CLSU_NOMBRE, CLSU_DIR, CLSU_CIUDAD, CLSU_TEL, VEND_COD, COBR_COD, ZONA_COD, LIPR_COD)
    VALUES (NEW.TERC_NIT, '01', :NOMBRE, :DIR, :CIU, :TEL, NEW.vend_cod, NEW.cobr_cod, NEW.zona_cod, NEW.lipr_cod);
INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
    VALUES (USER, 103, 1, 'I', NEW.terc_nit);
end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER CLIENTES_AU FOR CLIENTES
ACTIVE AFTER UPDATE POSITION 0
as
declare variable NUMROWS INTEGER;
begin
/* SI TIENE UNA SOLA SUCURSAL ACTUALICELA AL CAMBIAR EL PRINCIPAL */
SELECT COUNT(CLCU_COD) FROM CLIENTE_SUCURSALES WHERE TERC_NIT = NEW.terc_nit INTO :NUMROWS;
if (NUMROWS = 1) then
    BEGIN
    UPDATE cliente_sucursales
        SET VEND_COD = NEW.vend_cod,
            COBR_COD = NEW.cobr_cod,
            ZONA_COD = NEW.zona_cod,
            LIPR_COD = NEW.lipr_cod
        WHERE TERC_NIT = NEW.TERC_NIT AND CLCU_COD = '01';
    END
INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
    VALUES (USER, 103, 1, 'U', NEW.terc_nit);
end
^

SET TERM ; ^



/* 20090520d */
/* CUENTA DE ANTICIPOS EN INTERFAZ POR DOCUMENTO LEIDA DE LA ZONA EN LUGAR DEL PARAMETRO DE CONFIGURACION */
ALTER TABLE ZONAS
ADD ZONA_CTAANTI T_CTA_CONTABLE;


UPDATE ZONAS SET ZONA_CTAANTI = (SELECT CONF_VALOR FROM CONFIGURACION WHERE (CONF_MODULO = 'CAJA') AND
    (CONF_CATEGORIA = 'RECIBOS') AND (CONF_PROPIEDAD = 'CUENTA CONTABLE PARA LOS ANTICIPOS DE CLIENTES SI LA INTERFAZ ES POR DOCUMENTO'));

DELETE FROM  CONFIGURACION
    WHERE (CONF_MODULO = 'CAJA') AND (CONF_CATEGORIA = 'RECIBOS') AND (CONF_PROPIEDAD = 'CUENTA CONTABLE PARA LOS ANTICIPOS DE CLIENTES SI LA INTERFAZ ES POR DOCUMENTO');
COMMIT WORK;


SET TERM ^ ;

CREATE OR ALTER PROCEDURE CONTABIL_RECICAJA(
    IDDOC INTEGER,
    IDINTER INTEGER)
RETURNS (
    ERROR INTEGER,
    VER CHAR(1),
    IDC INTEGER)
AS
declare variable PREF VARCHAR(4);
declare variable NUM VARCHAR(6);
declare variable FECAUX DATE;
declare variable FECHA CHAR(8);
declare variable CONC CHAR(120);
declare variable VRDTO NUMERIC(18,2);
declare variable VRRTFTE NUMERIC(18,2);
declare variable VRRTIVA NUMERIC(18,2);
declare variable VRRTICA NUMERIC(18,2);
declare variable VRTOTAL NUMERIC(18,2);
declare variable TIPOCOMP VARCHAR(3);
declare variable PREFCONT VARCHAR(4);
declare variable BASE CHAR(1);
declare variable CTABASE VARCHAR(20);
declare variable CAJA CHAR(1);
declare variable CTACAJA VARCHAR(20);
declare variable RTFTE CHAR(1);
declare variable CTARTFTE VARCHAR(20);
declare variable RTIVA CHAR(1);
declare variable CTARTIVA VARCHAR(20);
declare variable RTICA CHAR(1);
declare variable CTARTICA VARCHAR(20);
declare variable DTO CHAR(1);
declare variable CTADTO VARCHAR(20);
declare variable EXISTE CHAR(1);
declare variable CUENTA VARCHAR(20);
declare variable MONTO NUMERIC(18,2);
declare variable ES_RETENCION CHAR(1);
declare variable TIPOCUEN CHAR(1);
declare variable NIT VARCHAR(20);
declare variable PROY VARCHAR(4);
declare variable CENTRO VARCHAR(4);
declare variable DEBITO NUMERIC(18,2);
declare variable CREDITO NUMERIC(18,2);
declare variable NROI INTEGER;
declare variable SUMA NUMERIC(18,2);
declare variable TCTACLIEN VARCHAR(20);
declare variable TCTARTFTE VARCHAR(20);
declare variable TCTARTIVA VARCHAR(20);
declare variable TCTARTICA VARCHAR(20);
declare variable TIPOIT INTEGER;
declare variable IDIT INTEGER;
declare variable PREFIT VARCHAR(4);
declare variable NUMIT VARCHAR(6);
declare variable NUMEROIT VARCHAR(10);
declare variable ABONOIT NUMERIC(18,2);
declare variable CTADIC VARCHAR(20);
declare variable BASEADIC VARCHAR(20);
declare variable PORCADIC NUMERIC(5,2);
declare variable VALORADIC NUMERIC(18,2);
declare variable DBADIC CHAR(1);
declare variable ANULADO CHAR(1);
declare variable VRBASE NUMERIC(18,2);
declare variable PORC numeric(9,2);
declare variable OK INTEGER;
declare variable CRUCES NUMERIC(18,2);
declare variable VRCAJA NUMERIC(18,2);
declare variable DIFCAMBIO NUMERIC(18,2);
declare variable CTADIF VARCHAR(20);
declare variable PROVID INTEGER;
declare variable RTFTEC NUMERIC(18,2);
declare variable RTIVAC NUMERIC(18,2);
declare variable RTICAC NUMERIC(18,2);
declare variable RTFTER CHAR(1);
declare variable CTARTFTER VARCHAR(20);
declare variable RTIVAR CHAR(1);
declare variable CTARTIVAR VARCHAR(20);
declare variable RTICAR CHAR(1);
declare variable CTARTICAR VARCHAR(20);
declare variable RET CHAR(2);
declare variable RTIT NUMERIC(18,2);
BEGIN
ERROR = 0;
/* BUSQUE LA INTERFACE */
EXISTE = 'N';
SELECT 'S',TICO_COD,PRCO_PRE,INCJ_BASE,INCJ_DTOPP,INCJ_RTFTE,INCJ_RTIVA,INCJ_RTICA,INCJ_CAJA,INCJ_CTABASE,INCJ_CTADTO,INCJ_CTARTFTE,INCJ_CTARTIVA,INCJ_CTARTICA,INCJ_CTACAJA,INCJ_CONFIRMAR
    FROM INTERFAZ_CAJA
    WHERE INCJ_ID = :IDINTER
    INTO :EXISTE,:TIPOCOMP,:PREFCONT,:BASE,:DTO,:RTFTE,:RTIVA,:RTICA,:CAJA,:CTABASE,:CTADTO,:CTARTFTE,:CTARTIVA,:CTARTICA,:CTACAJA,:VER;
if (EXISTE = 'S') then
  BEGIN
  /* BORRE LA CONTABILIZACION ANTERIOR */
  OK = 0;
  FOR SELECT CNTB_ID FROM CONTABILIZACION WHERE CNTB_TIPOREF = 61 AND CNTB_IDREF = :IDDOC INTO :OK DO
    BEGIN
    DELETE FROM CONTABILIZACION_DET WHERE CNTB_ID = :OK;
    DELETE FROM CONTABILIZACION WHERE CNTB_ID = :OK;
    END
  /* TRAIGA EL ENCABEZADO DEL RECIBO */
  SELECT PREF_PRE,RECA_NUMERO,RECA_FECHA,R.TERC_NIT,RECA_CONC,RECA_DTOF,RECA_MONTO,RECA_RTFTEMONTO,RECA_RTIVAMONTO,RECA_RTICAMONTO,TERC_CTARTFTE,TERC_CTARTIVA,TERC_CTARTICA,TERC_CTACLIENTE,RECA_ANULADO,RECA_PROVID
    FROM RECIBOS_CAJA R,TERCEROS T
    WHERE RECA_ID = :IDDOC AND R.TERC_NIT = T.TERC_NIT
    INTO :PREF,:NUM,:FECAUX,:NIT,:CONC,:VRDTO,:VRTOTAL,:VRRTFTE,:VRRTIVA,:VRRTICA,:TCTARTFTE,TCTARTIVA,TCTARTICA,TCTACLIEN,:ANULADO,:PROVID;
  if (ANULADO = 'N') then
    BEGIN
    SELECT PREF_CENTRO,PREF_PROY FROM PREFIJOS
        WHERE PREF_PRE = :PREF AND TIDO_COD = 61 INTO :CENTRO,:PROY;
    EXECUTE PROCEDURE FECHA_A_CONTA(:FECAUX) returning_values (:FECHA);
    IDC = GEN_ID(ID_CONTABILIZA,1);
    INSERT INTO CONTABILIZACION (CNTB_ID,CNTB_TIPOCOMP,CNTB_PREFCNT,CNTB_NUMERO,CNTB_FECHA,CNTB_CONCEPTO,CNTB_REF,CNTB_TIPOREF,CNTB_IDREF,CNTB_PREFREF,CNTB_NUMREF,CNTB_PROCESADO)
        VALUES (:IDC,:TIPOCOMP,:PREFCONT,:NUM,:FECHA,:CONC,'',61,:IDDOC,:PREF,:NUM,'N');
    NROI = 0;
    SUMA = 0;
    /* SUME LOS CRUCES PARA LLEVARLOS A LA CUENTA X PAGAR Y RESTAR DE LA CAJA */
    SELECT SUM(RCCR_ABONO) FROM RECIBOS_CAJA_CRUCEC WHERE RECA_ID = :iddoc INTO :CRUCES;
    if (CRUCES IS NULL) then
        CRUCES = 0;
    VRCAJA = VRTOTAL - CRUCES;
    IF ((CAJA = 'K')) THEN
        BEGIN
        if (VRCAJA <> 0) then
            BEGIN
            CUENTA = NULL;
            EXECUTE PROCEDURE VALIDE_CUENTA_C (CTACAJA) RETURNING_VALUES (:OK);
            IF (OK = 0) THEN
                SELECT CUEN_COD,CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :CTACAJA INTO :CUENTA,:TIPOCUEN;
            ELSE
                begin
                EXECUTE PROCEDURE ERROR (61,:IDDOC,:CTACAJA,2);
                CUENTA = CTACAJA;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERROR (61,:IDDOC,:CUENTA,3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                EXECUTE PROCEDURE ERROR (61,:IDDOC,:CUENTA,4);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                IF (VRCAJA > 0) THEN
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID,CNDE_ITEM,CNDE_CUENTA,CNDE_CONC,CNDE_REF,CNDE_DEBITOS,CNDE_CREDITOS,CNDE_BASE,CNDE_PORC,CNDE_TERC,CNDE_PROY,CNDE_CENTRO,CNDE_DOCNUMERO,CNDE_DOCAPLICAR,CNDE_DOCVENCE,CNDE_ARTICULO,CNDE_DOCTIPOA,CNDE_DOCTIPON)
                        VALUES (:IDC,:NROI,:CUENTA,:CONC,'',:VRCAJA,0,0,0,:NIT,:PROY,:CENTRO,NULL,NULL,NULL,NULL,0,0);
                    SUMA = SUMA + VRCAJA;
                    END
                ELSE   
                    BEGIN                     
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID,CNDE_ITEM,CNDE_CUENTA,CNDE_CONC,CNDE_REF,CNDE_DEBITOS,CNDE_CREDITOS,CNDE_BASE,CNDE_PORC,CNDE_TERC,CNDE_PROY,CNDE_CENTRO,CNDE_DOCNUMERO,CNDE_DOCAPLICAR,CNDE_DOCVENCE,CNDE_ARTICULO,CNDE_DOCTIPOA,CNDE_DOCTIPON)
                       VALUES (:IDC,:NROI,:CUENTA,:CONC,'',0,ABS(:VRCAJA),0,0,:NIT,:PROY,:CENTRO,NULL,NULL,NULL,NULL,0,0);
                    SUMA = SUMA + VRCAJA;
                    END
                NROI = NROI + 1;
                END
            END
        END
    IF ((CAJA = 'F')) THEN
        BEGIN
        FOR SELECT MAX(FOPA_CTACONTA),SUM(RCPA_MONTO)
            FROM formas_pago F,recibos_caja_pago R
            WHERE R.RECA_ID = :IDDOC AND R.FOPA_ID = F.FOPA_ID
            GROUP BY FOPA_CTACONTA
            INTO :CTACAJA,:MONTO
        DO
            BEGIN
            if (MONTO <> 0) then
                BEGIN
                CUENTA = NULL;
                EXECUTE PROCEDURE VALIDE_CUENTA_C (CTACAJA) RETURNING_VALUES (:OK);
                IF (OK = 0) THEN
                    SELECT CUEN_COD,CUEN_TIPO FROM CUENTAS
                        WHERE CUEN_COD = :CTACAJA INTO :CUENTA,:TIPOCUEN;
                ELSE
                    begin
                    EXECUTE PROCEDURE ERROR (61,:IDDOC,:CTACAJA,2);
                    CUENTA = CTACAJA;
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (61,:IDDOC,:CUENTA,3);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (61,:IDDOC,:CUENTA,4);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    IF (MONTO > 0) THEN
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID,CNDE_ITEM,CNDE_CUENTA,CNDE_CONC,CNDE_REF,CNDE_DEBITOS,CNDE_CREDITOS,CNDE_BASE,CNDE_PORC,CNDE_TERC,CNDE_PROY,CNDE_CENTRO,CNDE_DOCNUMERO,CNDE_DOCAPLICAR,CNDE_DOCVENCE,CNDE_ARTICULO,CNDE_DOCTIPOA,CNDE_DOCTIPON)
                            VALUES (:IDC,:NROI,:CUENTA,:CONC,'',:MONTO,0,0,0,:NIT,:PROY,:CENTRO,NULL,NULL,NULL,NULL,0,0);
                        SUMA = SUMA + MONTO;
                        END
                    ELSE
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID,CNDE_ITEM,CNDE_CUENTA,CNDE_CONC,CNDE_REF,CNDE_DEBITOS,CNDE_CREDITOS,CNDE_BASE,CNDE_PORC,CNDE_TERC,CNDE_PROY,CNDE_CENTRO,CNDE_DOCNUMERO,CNDE_DOCAPLICAR,CNDE_DOCVENCE,CNDE_ARTICULO,CNDE_DOCTIPOA,CNDE_DOCTIPON)
                            VALUES (:IDC,:NROI,:CUENTA,:CONC,'',0,abs(:MONTO),0,0,:NIT,:PROY,:CENTRO,NULL,NULL,NULL,NULL,0,0);
                        SUMA = SUMA + MONTO;
                        END
                    NROI = NROI + 1;
                    END
                END /* MONTO <> 0 */
            END /* DO FORMA_PAGO */
        END /* CAJA = F */
    if (DTO = 'K') then /* DTO EN CTA CONSTANTE */
        BEGIN
        if (VRDTO <> 0) then
            BEGIN
            CUENTA = NULL;
            EXECUTE PROCEDURE VALIDE_CUENTA_C (CTADTO) RETURNING_VALUES (:OK);
            IF (OK = 0) THEN
                SELECT CUEN_COD,CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :CTADTO INTO :CUENTA,:TIPOCUEN;
            ELSE
                begin
                EXECUTE PROCEDURE ERROR (61,:IDDOC,:CTADTO,2);
                CUENTA = CTADTO;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERROR (61,:IDDOC,:CUENTA,3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                EXECUTE PROCEDURE ERROR (61,:IDDOC,:CUENTA,4);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID,CNDE_ITEM,CNDE_CUENTA,CNDE_CONC,CNDE_REF,CNDE_DEBITOS,CNDE_CREDITOS,CNDE_BASE,CNDE_PORC,CNDE_TERC,CNDE_PROY,CNDE_CENTRO,CNDE_DOCNUMERO,CNDE_DOCAPLICAR,CNDE_DOCVENCE,CNDE_ARTICULO,CNDE_DOCTIPOA,CNDE_DOCTIPON)
                    VALUES (:IDC,:NROI,:CUENTA,:CONC,'',:VRDTO,0,0,0,:NIT,:PROY,:CENTRO,NULL,NULL,NULL,NULL,0,0);
                NROI = NROI + 1;
                SUMA = SUMA + VRDTO;
                END
            END /* VRDTO <> 0 */
        END /* DTO EN CTA CONSTANTE */

    /* LA DIFERENCIA EN CAMBIO */
    SELECT SUM(RCDE_DIFCAMBIO) FROM recibos_caja_detalle WHERE RECA_ID = :iddoc INTO :DIFCAMBIO;
    IF ((DIFCAMBIO IS NOT NULL) AND (DIFCAMBIO <> 0)) THEN
        BEGIN
        if (DIFCAMBIO > 0) then
            execute procedure lee_configuracion('GENERAL','GENERAL','CUENTA DE INGRESO POR DIFERENCIA EN CAMBIO PARA OPERACIONES EN OTRA MONEDA') returning_values (:ctadif);
        else
            execute procedure lee_configuracion('GENERAL','GENERAL','CUENTA DE GASTO POR DIFERENCIA EN CAMBIO PARA OPERACIONES EN OTRA MONEDA') returning_values (:ctadif);
        CUENTA = NULL;
        EXECUTE PROCEDURE VALIDE_CUENTA_C (ctadif) RETURNING_VALUES (:OK);
        IF (OK = 0) THEN
            SELECT CUEN_COD,CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :ctadif INTO :CUENTA,:TIPOCUEN;
        ELSE
            begin
            EXECUTE PROCEDURE ERROR (61,:IDDOC,:ctadif,2);
            CUENTA = ctadif;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERROR (61,:IDDOC,:CUENTA,3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERROR (61,:IDDOC,:CUENTA,4);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            if (DIFCAMBIO > 0) then
                INSERT INTO CONTABILIZACION_DET (CNTB_ID,CNDE_ITEM,CNDE_CUENTA,CNDE_CONC,CNDE_REF,CNDE_DEBITOS,CNDE_CREDITOS,CNDE_BASE,CNDE_PORC,CNDE_TERC,CNDE_PROY,CNDE_CENTRO,CNDE_DOCNUMERO,CNDE_DOCAPLICAR,CNDE_DOCVENCE,CNDE_ARTICULO,CNDE_DOCTIPOA,CNDE_DOCTIPON)
                    VALUES (:IDC,:NROI,:CUENTA,:CONC,'',0,:difcambio,0,0,:NIT,:PROY,:CENTRO,NULL,NULL,NULL,NULL,0,0);
            else
                INSERT INTO CONTABILIZACION_DET (CNTB_ID,CNDE_ITEM,CNDE_CUENTA,CNDE_CONC,CNDE_REF,CNDE_DEBITOS,CNDE_CREDITOS,CNDE_BASE,CNDE_PORC,CNDE_TERC,CNDE_PROY,CNDE_CENTRO,CNDE_DOCNUMERO,CNDE_DOCAPLICAR,CNDE_DOCVENCE,CNDE_ARTICULO,CNDE_DOCTIPOA,CNDE_DOCTIPON)
                    VALUES (:IDC,:NROI,:CUENTA,:CONC,'',ABS(:difcambio),0,0,0,:NIT,:PROY,:CENTRO,NULL,NULL,NULL,NULL,0,0);
            NROI = NROI + 1;
            SUMA = SUMA - difcambio;
            END
        END
    /* RETENCION FUENTE */
    if ((RTFTE = 'T') or (RTFTE = 'K')) then
      if (VRRTFTE <> 0) then
        BEGIN
        if (RTFTE = 'T') then
            CTARTFTE = TCTARTFTE;
        CUENTA = NULL;
        EXECUTE PROCEDURE VALIDE_CUENTA_C (CTARTFTE) RETURNING_VALUES (:OK);
        IF (OK = 0) THEN
            SELECT CUEN_COD,CUEN_RETENCION,CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTARTFTE INTO :CUENTA,:ES_RETENCION,:TIPOCUEN;
        ELSE
            begin
            EXECUTE PROCEDURE ERROR (61,:IDDOC,:CTARTFTE,2);
            CUENTA = CTARTFTE;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERROR (61,:IDDOC,:CUENTA,3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERROR (61,:IDDOC,:CUENTA,4);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            if (ES_RETENCION = 'S') then
                BEGIN
                VRBASE = VRTOTAL + VRDTO + vrrtfte + vrrtiva + vrrtica;
                SELECT CLIE_rtefte from clientes where terc_nit = :NIT INTO :PORC;
                END
            ELSE
                BEGIN
                VRBASE = 0;
                PORC = 0;
                END
            INSERT INTO CONTABILIZACION_DET (CNTB_ID,CNDE_ITEM,CNDE_CUENTA,CNDE_CONC,CNDE_REF,CNDE_DEBITOS,CNDE_CREDITOS,CNDE_BASE,CNDE_PORC,CNDE_TERC,CNDE_PROY,CNDE_CENTRO,CNDE_DOCNUMERO,CNDE_DOCAPLICAR,CNDE_DOCVENCE,CNDE_ARTICULO,CNDE_DOCTIPOA,CNDE_DOCTIPON)
                VALUES (:IDC,:NROI,:CUENTA,:CONC,'',:VRRTFTE,0,:VRBASE,:PORC,:NIT,:PROY,:CENTRO,NULL,NULL,NULL,NULL,0,0);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTFTE;
            END
        END /* RTFTE */
    /* RETENCION IVA */
    if ((RTIVA = 'T') or (RTIVA = 'K')) then
      if (VRRTIVA <> 0) then
        BEGIN
        if (RTIVA = 'T') then
            CTARTIVA = TCTARTIVA;
        CUENTA = NULL;
        EXECUTE PROCEDURE VALIDE_CUENTA_C (CTARTIVA) RETURNING_VALUES (:OK);
        IF (OK = 0) THEN
            SELECT CUEN_COD,CUEN_RETENCION,CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTARTIVA INTO :CUENTA,:ES_RETENCION,:TIPOCUEN;
        ELSE
            begin
            EXECUTE PROCEDURE ERROR (61,:IDDOC,:CTARTIVA,2);
            CUENTA = CTARTIVA;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERROR (61,:IDDOC,:CUENTA,3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERROR (61,:IDDOC,:CUENTA,4);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            if (ES_RETENCION = 'S') then
                BEGIN
                VRBASE = VRTOTAL + VRDTO + vrrtfte + vrrtiva + vrrtica;
                SELECT CLIE_RTEIVA from clientes where terc_nit = :NIT INTO :PORC;
                END
            ELSE
                BEGIN
                VRBASE = 0;
                PORC = 0;
                END
            INSERT INTO CONTABILIZACION_DET (CNTB_ID,CNDE_ITEM,CNDE_CUENTA,CNDE_CONC,CNDE_REF,CNDE_DEBITOS,CNDE_CREDITOS,CNDE_BASE,CNDE_PORC,CNDE_TERC,CNDE_PROY,CNDE_CENTRO,CNDE_DOCNUMERO,CNDE_DOCAPLICAR,CNDE_DOCVENCE,CNDE_ARTICULO,CNDE_DOCTIPOA,CNDE_DOCTIPON)
                VALUES (:IDC,:NROI,:CUENTA,:CONC,'',:VRRTIVA,0,:VRBASE,:PORC,:NIT,:PROY,:CENTRO,NULL,NULL,NULL,NULL,0,0);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTIVA;
            END
        END /* RTIVA */
    /* RETENCION DE ICA */
    if ((RTICA = 'T') or (RTICA = 'K')) then
      if (VRRTICA <> 0) then
        BEGIN
        if (RTICA = 'T') then
            CTARTICA = TCTARTICA;
        CUENTA = NULL;
        EXECUTE PROCEDURE VALIDE_CUENTA_C (CTARTICA) RETURNING_VALUES (:OK);
        IF (OK = 0) THEN
            SELECT CUEN_COD,CUEN_RETENCION,CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTARTICA INTO :CUENTA,:ES_RETENCION,:TIPOCUEN;
        ELSE
            begin
            EXECUTE PROCEDURE ERROR (61,:IDDOC,:CTARTICA,2);
            CUENTA = CTARTICA;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERROR (61,:IDDOC,:CUENTA,3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERROR (61,:IDDOC,:CUENTA,4);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            if (ES_RETENCION = 'S') then
                BEGIN
                VRBASE = VRTOTAL + VRDTO + vrrtfte + vrrtiva + vrrtica;
                SELECT CLIE_RTEICA from clientes where terc_nit = :NIT INTO :PORC;
                END
            ELSE
                BEGIN
                VRBASE = 0;
                PORC = 0;
                END
            INSERT INTO CONTABILIZACION_DET (CNTB_ID,CNDE_ITEM,CNDE_CUENTA,CNDE_CONC,CNDE_REF,CNDE_DEBITOS,CNDE_CREDITOS,CNDE_BASE,CNDE_PORC,CNDE_TERC,CNDE_PROY,CNDE_CENTRO,CNDE_DOCNUMERO,CNDE_DOCAPLICAR,CNDE_DOCVENCE,CNDE_ARTICULO,CNDE_DOCTIPOA,CNDE_DOCTIPON)
                VALUES (:IDC,:NROI,:CUENTA,:CONC,'',:VRRTICA,0,0,0,:NIT,:PROY,:CENTRO,NULL,NULL,NULL,NULL,0,0);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTICA;
            END
        END /* RTICA */
    /* CRUCES CON CXP */
    if (CRUCES <> 0) then
        BEGIN
        SELECT PROV_CTAPAGAR FROM PROVEEDORES WHERE TERC_NIT = :nit INTO :ctabase;
        if (CTABASE IS NULL) then
            ctabase = tctaclien;
        CUENTA = NULL;
        EXECUTE PROCEDURE VALIDE_CUENTA_C (CTABASE) RETURNING_VALUES (:OK);
        IF (OK = 0) THEN
            SELECT CUEN_COD,CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTABASE INTO :CUENTA,:TIPOCUEN;
        ELSE
            begin
            EXECUTE PROCEDURE ERROR (61,:IDDOC,:CTABASE,2);
            CUENTA = CTABASE;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERROR (61,:IDDOC,:CUENTA,3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            /* DEBERIA RECORRER DOCUMENTO POR DOCUMENTO */
            FOR SELECT RCCR_TIPODOC,RCCR_PREFIJO,RCCR_NUMERO,RCCR_ABONO+RCCR_RTFTE+RCCR_RTIVA+RCCR_RTICA+RCCR_DTOF
                FROM recibos_caja_crucec WHERE RECA_ID = :IDDOC
                INTO :TIPOIT,PREFIT,NUMIT,ABONOIT
                DO
                BEGIN
                NUMEROIT = PREFIT || NUMIT;
                INSERT INTO CONTABILIZACION_DET (CNTB_ID,CNDE_ITEM,CNDE_CUENTA,CNDE_CONC,CNDE_REF,CNDE_DEBITOS,CNDE_CREDITOS,CNDE_BASE,CNDE_PORC,CNDE_TERC,CNDE_PROY,CNDE_CENTRO,CNDE_DOCNUMERO,CNDE_DOCAPLICAR,CNDE_DOCVENCE,CNDE_ARTICULO,CNDE_DOCTIPOA,CNDE_DOCTIPON)
                    VALUES (:IDC,:NROI,:CUENTA,:CONC,'',:ABONOIT,0,0,0,:NIT,:PROY,:CENTRO,NULL,:NUMEROIT,NULL,NULL,:TIPOIT,0);
                SUMA = SUMA + ABONOIT;
                NROI = NROI + 1;
                END
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID,CNDE_ITEM,CNDE_CUENTA,CNDE_CONC,CNDE_REF,CNDE_DEBITOS,CNDE_CREDITOS,CNDE_BASE,CNDE_PORC,CNDE_TERC,CNDE_PROY,CNDE_CENTRO,CNDE_DOCNUMERO,CNDE_DOCAPLICAR,CNDE_DOCVENCE,CNDE_ARTICULO,CNDE_DOCTIPOA,CNDE_DOCTIPON)
                VALUES (:IDC,:NROI,:CUENTA,:CONC,'',:CRUCES,0,0,0,:NIT,:PROY,:CENTRO,NULL,NULL,NULL,NULL,0,0);
            SUMA = SUMA + CRUCES;
            NROI = NROI + 1;
            END

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

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE RECIBOS_SIN_CONTABILIDAD(
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    ID INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    ESTADO VARCHAR(20),
    IDI INTEGER,
    IDC INTEGER,
    ERROR INTEGER)
AS
DECLARE VARIABLE VER CHAR(2);
declare variable FECICNT VARCHAR(10);
declare variable FECFCNT VARCHAR(10);
declare variable idref INTEGER;
BEGIN
EXECUTE PROCEDURE fecha_a_conta(FECINI) returning_values (FECICNT);
EXECUTE PROCEDURE fecha_a_conta(FECFIN) returning_values (FECFCNT);
FOR SELECT RECA_ID, PREF_PRE, RECA_NUMERO FROM RECIBOS_CAJA WHERE RECA_ANULADO = 'N' AND
    RECA_FECHA >= :FECINI AND RECA_FECHA <= :FECFIN and PREF_PRE NOT IN (SELECT AUTO_PREFRDC FROM AUTORIZACIONES) ORDER BY RECA_ID
    INTO :ID, :PREF, :NUMERO
DO
  BEGIN
  idref = null;
  SELECT ENCO_IDREF FROM COMPROBANTE_ENCABEZADO WHERE ENCO_TIPOREF = 61 AND ENCO_FECHA >= :FECICNT AND ENCO_FECHA <= :FECFCNT and ENCO_IDREF = :id into :idref;
  if (idref IS NULL) then
  begin
   ESTADO = 'PROCESANDO';
   SUSPEND;
   SELECT MAX(INCJ_ID) FROM INTERFAZ_CAJA WHERE PREF_PRE = :PREF AND TIDO_COD = 61 INTO :IDI;
   EXECUTE PROCEDURE CONTABIL_RECICAJA (:ID, :IDI) RETURNING_VALUES (:ERROR, :VER, :IDC);
   if (ERROR = 0) then
    BEGIN
    EXECUTE PROCEDURE CONTABILIZA_PENDIENTE (:IDC);
    ESTADO = 'OK';
    END
   ELSE
    ESTADO = 'ERROR';
   suspend;
  end
  END
END

^

SET TERM ; ^



/* 20090521 */
/* HABILITE EL CALCULO EN LA FORMA CON RET. POR ARTICULO */
INSERT INTO CONFIGURACION (CONF_MODULO, CONF_CATEGORIA, CONF_PROPIEDAD, CONF_VALOR, CONF_POSIBLES, CONF_AYUDA) VALUES ('COMPRAS', 'DOCUMENTOS', 'CALCULAR RETENCIONES POR ARTICULO', 'NO', 'SI,NO', 'SI: Calcula la retención en la fuente con base en los artículos sin usar el porcentaje del pie del documento ni la tarifa y base del proveedor. NO: Calcula las retención de acuerdo a las tarifas y bases del proveedor');
COMMIT WORK;


/* 20090521b */

INSERT INTO TIPO_DOCUMENTO (TIDO_COD, TIDO_NOMCORTO, TIDO_NOMLARGO, TIDO_MODULO, TIDO_INVE, TIDO_CART, TIDO_CXP, TIDO_CAJA, TIDO_BCOS) VALUES (82, 'CERTRTFV', 'CERTIFICADO RETENCION FUENTE', 'VENTAS', 'N', 'N', 'N', 'N', 'N');
INSERT INTO TIPO_DOCUMENTO (TIDO_COD, TIDO_NOMCORTO, TIDO_NOMLARGO, TIDO_MODULO, TIDO_INVE, TIDO_CART, TIDO_CXP, TIDO_CAJA, TIDO_BCOS) VALUES (83, 'CERTRTFC', 'CERTIFICADO RETENCION COMPRAS', 'COMPRAS', 'N', 'N', 'N', 'N', 'N');

INSERT INTO CONFIGURACION (CONF_MODULO, CONF_CATEGORIA, CONF_PROPIEDAD, CONF_VALOR, CONF_POSIBLES, CONF_AYUDA) VALUES ('FACTURACION', 'FACTURAS', 'IMPRIMIR ADICIONALMENTE CERTIFICADO DE RETENCION AL IMPRIMIR FACTURAS CON RETENCION EN LA FUENTE', 'NO', 'SI,NO', 'SI: Imprime un formato predefinido de retención en a fuente a continuación de la factura, no se recomienda para formas personalizadas ya que implica cambiar el papel');

INSERT INTO PREFIJOS (TIDO_COD, PREF_PRE, PREF_ACTUAL, PREF_AUTO, PREF_IVAINC, PREF_PROY, PREF_CENTRO, PREF_ACTIVO, PREF_USUARIO, TICO_COD, SUCU_ID) VALUES (82, '0000', '000001', 'S', 'N', NULL, NULL, 'S', NULL, NULL, NULL);
commit work;

SET TERM ^ ;

CREATE OR ALTER PROCEDURE IMPR_CERTRETE(
    ID INTEGER)
RETURNS (
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    NIT VARCHAR(20),
    NOMTERCERO VARCHAR(60),
    SUCURSAL VARCHAR(10),
    SUBTOTAL NUMERIC(18,2),
    RTEFTEPORC NUMERIC(9,2),
    RTEFTEMONTO NUMERIC(18,2),
    DV CHAR(1),
    DIRECCION VARCHAR(60),
    CIUDAD VARCHAR(40),
    TELEFONO VARCHAR(40),
    CONTACTO VARCHAR(60),
    FAX VARCHAR(25),
    CEL VARCHAR(25))
AS
BEGIN
SELECT F.PREF_PRE, FACT_NUMERO, FACT_FECHA, F.TERC_NIT, TERC_NOM, FACT_RTFTEPOR, FACT_RTFTEMONTO, FACT_TOTAL-FACT_IVAMONTO-FACT_EXTRA,
    TERC_DIR, TERC_CIU, TERC_TEL, TERC_CONTACTO, TERC_FAX, TERC_DV, TERC_CEL, FACT_SUCURSAL
    FROM FACTURAS F, TERCEROS T
    WHERE F.TERC_NIT = T.TERC_NIT AND F.FACT_ID = :ID
    into :PREF, :NUMERO, :FECHA, :NIT, :NOMTERCERO, :RTEFTEPORC, :RTEFTEMONTO, SUBTOTAL,
    :DIRECCION, :CIUDAD, :TELEFONO, :CONTACTO, :FAX, :DV, :CEL, :SUCURSAL;

SELECT CLSU_DIR, CLSU_CIUDAD, CLSU_TEL FROM CLIENTE_SUCURSALES WHERE TERC_NIT = :NIT AND CLCU_COD = :SUCURSAL
    INTO :DIRECCION, :CIUDAD, :TELEFONO;
SUSPEND;
END
^

SET TERM ; ^

grant EXECUTE on PROCEDURE impr_certrete to PUBLIC;


INSERT INTO FORMATOS (TIDO_COD, PREF_PRE, FORM_IMPRE, FORM_NROITEMS, FORM_PAGINAS, FORM_ENTRELINEA, FORM_FONT, FORM_FSIZE, FORM_PAPELAN, FORM_PAPELAL) VALUES (82, '0000', '', NULL, 'S', 50, 'Arial', 8, NULL, NULL);

COMMIT WORK;

INSERT INTO FORMATO_DATOS (TIDO_COD, PREF_PRE, DAFO_DATO, DAFO_IMPRIME, DAFO_POSX, DAFO_POSY, DAFO_FORMATO, DAFO_LONG, DAFO_REPITE, DAFO_FONT, DAFO_FSIZE, DAFO_LIQUIDA, DAFO_POSYVAR, DAFO_ITEM, DAFO_INI, DAFO_CORTARPALABRAS, DAFO_JUSTIFICA) VALUES (82, '0000', 'NIT', 'S', 300, 300, NULL, 20, 'N', 'Arial', 8, 'N', 'N', 1, 1, 'S', 'I');
INSERT INTO FORMATO_DATOS (TIDO_COD, PREF_PRE, DAFO_DATO, DAFO_IMPRIME, DAFO_POSX, DAFO_POSY, DAFO_FORMATO, DAFO_LONG, DAFO_REPITE, DAFO_FONT, DAFO_FSIZE, DAFO_LIQUIDA, DAFO_POSYVAR, DAFO_ITEM, DAFO_INI, DAFO_CORTARPALABRAS, DAFO_JUSTIFICA) VALUES (82, '0000', 'TERCERO NOMBRE', 'S', 300, 250, NULL, 60, 'N', 'Arial', 8, 'N', 'N', 2, 1, 'S', 'I');
INSERT INTO FORMATO_DATOS (TIDO_COD, PREF_PRE, DAFO_DATO, DAFO_IMPRIME, DAFO_POSX, DAFO_POSY, DAFO_FORMATO, DAFO_LONG, DAFO_REPITE, DAFO_FONT, DAFO_FSIZE, DAFO_LIQUIDA, DAFO_POSYVAR, DAFO_ITEM, DAFO_INI, DAFO_CORTARPALABRAS, DAFO_JUSTIFICA) VALUES (82, '0000', 'TERCERO DIRECCION', 'S', 300, 350, NULL, 60, 'N', 'Arial', 8, 'N', 'N', 3, 1, 'S', 'I');
INSERT INTO FORMATO_DATOS (TIDO_COD, PREF_PRE, DAFO_DATO, DAFO_IMPRIME, DAFO_POSX, DAFO_POSY, DAFO_FORMATO, DAFO_LONG, DAFO_REPITE, DAFO_FONT, DAFO_FSIZE, DAFO_LIQUIDA, DAFO_POSYVAR, DAFO_ITEM, DAFO_INI, DAFO_CORTARPALABRAS, DAFO_JUSTIFICA) VALUES (82, '0000', 'TERCERO CIUDAD', 'S', 300, 400, NULL, 40, 'N', 'Arial', 8, 'N', 'N', 4, 1, 'S', 'I');
INSERT INTO FORMATO_DATOS (TIDO_COD, PREF_PRE, DAFO_DATO, DAFO_IMPRIME, DAFO_POSX, DAFO_POSY, DAFO_FORMATO, DAFO_LONG, DAFO_REPITE, DAFO_FONT, DAFO_FSIZE, DAFO_LIQUIDA, DAFO_POSYVAR, DAFO_ITEM, DAFO_INI, DAFO_CORTARPALABRAS, DAFO_JUSTIFICA) VALUES (82, '0000', 'TERCERO TELEFONO', 'S', 300, 450, NULL, 40, 'N', 'Arial', 8, 'N', 'N', 5, 1, 'S', 'I');
INSERT INTO FORMATO_DATOS (TIDO_COD, PREF_PRE, DAFO_DATO, DAFO_IMPRIME, DAFO_POSX, DAFO_POSY, DAFO_FORMATO, DAFO_LONG, DAFO_REPITE, DAFO_FONT, DAFO_FSIZE, DAFO_LIQUIDA, DAFO_POSYVAR, DAFO_ITEM, DAFO_INI, DAFO_CORTARPALABRAS, DAFO_JUSTIFICA) VALUES (82, '0000', 'PREFIJO', 'S', 500, 850, NULL, 4, 'N', 'Arial', 8, 'N', 'N', 6, 1, 'S', 'I');
INSERT INTO FORMATO_DATOS (TIDO_COD, PREF_PRE, DAFO_DATO, DAFO_IMPRIME, DAFO_POSX, DAFO_POSY, DAFO_FORMATO, DAFO_LONG, DAFO_REPITE, DAFO_FONT, DAFO_FSIZE, DAFO_LIQUIDA, DAFO_POSYVAR, DAFO_ITEM, DAFO_INI, DAFO_CORTARPALABRAS, DAFO_JUSTIFICA) VALUES (82, '0000', 'NUMERO', 'S', 580, 850, NULL, 6, 'N', 'Arial', 8, 'N', 'N', 7, 1, 'S', 'I');
INSERT INTO FORMATO_DATOS (TIDO_COD, PREF_PRE, DAFO_DATO, DAFO_IMPRIME, DAFO_POSX, DAFO_POSY, DAFO_FORMATO, DAFO_LONG, DAFO_REPITE, DAFO_FONT, DAFO_FSIZE, DAFO_LIQUIDA, DAFO_POSYVAR, DAFO_ITEM, DAFO_INI, DAFO_CORTARPALABRAS, DAFO_JUSTIFICA) VALUES (82, '0000', 'FECHA', 'S', 1300, 850, NULL, 4, 'N', 'Arial', 8, 'N', 'N', 8, 1, 'S', 'I');
INSERT INTO FORMATO_DATOS (TIDO_COD, PREF_PRE, DAFO_DATO, DAFO_IMPRIME, DAFO_POSX, DAFO_POSY, DAFO_FORMATO, DAFO_LONG, DAFO_REPITE, DAFO_FONT, DAFO_FSIZE, DAFO_LIQUIDA, DAFO_POSYVAR, DAFO_ITEM, DAFO_INI, DAFO_CORTARPALABRAS, DAFO_JUSTIFICA) VALUES (82, '0000', 'TOTAL LETRAS', 'S', 150, 1200, NULL, 100, 'N', 'Arial', 8, 'N', 'N', 9, 1, 'S', 'I');
INSERT INTO FORMATO_DATOS (TIDO_COD, PREF_PRE, DAFO_DATO, DAFO_IMPRIME, DAFO_POSX, DAFO_POSY, DAFO_FORMATO, DAFO_LONG, DAFO_REPITE, DAFO_FONT, DAFO_FSIZE, DAFO_LIQUIDA, DAFO_POSYVAR, DAFO_ITEM, DAFO_INI, DAFO_CORTARPALABRAS, DAFO_JUSTIFICA) VALUES (82, '0000', 'TOTAL LETRAS', 'S', 150, 1250, NULL, 100, 'N', 'Arial', 8, 'N', 'N', 10, 101, 'S', 'I');
INSERT INTO FORMATO_DATOS (TIDO_COD, PREF_PRE, DAFO_DATO, DAFO_IMPRIME, DAFO_POSX, DAFO_POSY, DAFO_FORMATO, DAFO_LONG, DAFO_REPITE, DAFO_FONT, DAFO_FSIZE, DAFO_LIQUIDA, DAFO_POSYVAR, DAFO_ITEM, DAFO_INI, DAFO_CORTARPALABRAS, DAFO_JUSTIFICA) VALUES (82, '0000', 'FECHA LETRAS', 'S', 250, 150, NULL, 50, 'N', 'Arial', 8, 'N', 'N', 11, 1, 'S', 'I');
INSERT INTO FORMATO_DATOS (TIDO_COD, PREF_PRE, DAFO_DATO, DAFO_IMPRIME, DAFO_POSX, DAFO_POSY, DAFO_FORMATO, DAFO_LONG, DAFO_REPITE, DAFO_FONT, DAFO_FSIZE, DAFO_LIQUIDA, DAFO_POSYVAR, DAFO_ITEM, DAFO_INI, DAFO_CORTARPALABRAS, DAFO_JUSTIFICA) VALUES (82, '0000', 'SUBTOTAL', 'S', 650, 1060, NULL, NULL, 'N', 'Arial', 8, 'N', 'N', 12, 1, 'S', 'I');
INSERT INTO FORMATO_DATOS (TIDO_COD, PREF_PRE, DAFO_DATO, DAFO_IMPRIME, DAFO_POSX, DAFO_POSY, DAFO_FORMATO, DAFO_LONG, DAFO_REPITE, DAFO_FONT, DAFO_FSIZE, DAFO_LIQUIDA, DAFO_POSYVAR, DAFO_ITEM, DAFO_INI, DAFO_CORTARPALABRAS, DAFO_JUSTIFICA) VALUES (82, '0000', 'RETEFUENTE PORCENTAJE', 'S', 1100, 1060, NULL, NULL, 'N', 'Arial', 8, 'N', 'N', 13, 1, 'S', 'I');
INSERT INTO FORMATO_DATOS (TIDO_COD, PREF_PRE, DAFO_DATO, DAFO_IMPRIME, DAFO_POSX, DAFO_POSY, DAFO_FORMATO, DAFO_LONG, DAFO_REPITE, DAFO_FONT, DAFO_FSIZE, DAFO_LIQUIDA, DAFO_POSYVAR, DAFO_ITEM, DAFO_INI, DAFO_CORTARPALABRAS, DAFO_JUSTIFICA) VALUES (82, '0000', 'RETEFUENTE MONTO', 'S', 1350, 1060, NULL, NULL, 'N', 'Arial', 8, 'N', 'N', 14, 1, 'S', 'I');
INSERT INTO FORMATO_DATOS (TIDO_COD, PREF_PRE, DAFO_DATO, DAFO_IMPRIME, DAFO_POSX, DAFO_POSY, DAFO_FORMATO, DAFO_LONG, DAFO_REPITE, DAFO_FONT, DAFO_FSIZE, DAFO_LIQUIDA, DAFO_POSYVAR, DAFO_ITEM, DAFO_INI, DAFO_CORTARPALABRAS, DAFO_JUSTIFICA) VALUES (82, '0000', 'NOMBRE COMPANIA', 'S', 300, 550, NULL, 60, 'N', 'Arial', 8, 'N', 'N', 15, 1, 'S', 'I');
INSERT INTO FORMATO_DATOS (TIDO_COD, PREF_PRE, DAFO_DATO, DAFO_IMPRIME, DAFO_POSX, DAFO_POSY, DAFO_FORMATO, DAFO_LONG, DAFO_REPITE, DAFO_FONT, DAFO_FSIZE, DAFO_LIQUIDA, DAFO_POSYVAR, DAFO_ITEM, DAFO_INI, DAFO_CORTARPALABRAS, DAFO_JUSTIFICA) VALUES (82, '0000', 'NIT COMPANIA', 'S', 300, 600, NULL, 10, 'N', 'Arial', 8, 'N', 'N', 16, 1, 'S', 'I');
INSERT INTO FORMATO_DATOS (TIDO_COD, PREF_PRE, DAFO_DATO, DAFO_IMPRIME, DAFO_POSX, DAFO_POSY, DAFO_FORMATO, DAFO_LONG, DAFO_REPITE, DAFO_FONT, DAFO_FSIZE, DAFO_LIQUIDA, DAFO_POSYVAR, DAFO_ITEM, DAFO_INI, DAFO_CORTARPALABRAS, DAFO_JUSTIFICA) VALUES (82, '0000', 'DIRECCION COMPANIA', 'S', 300, 650, NULL, 60, 'N', 'Arial', 8, 'N', 'N', 17, 1, 'S', 'I');
INSERT INTO FORMATO_DATOS (TIDO_COD, PREF_PRE, DAFO_DATO, DAFO_IMPRIME, DAFO_POSX, DAFO_POSY, DAFO_FORMATO, DAFO_LONG, DAFO_REPITE, DAFO_FONT, DAFO_FSIZE, DAFO_LIQUIDA, DAFO_POSYVAR, DAFO_ITEM, DAFO_INI, DAFO_CORTARPALABRAS, DAFO_JUSTIFICA) VALUES (82, '0000', 'TELEFONO COMPANIA', 'S', 300, 700, NULL, 60, 'N', 'Arial', 8, 'N', 'N', 18, 1, 'S', 'I');

COMMIT WORK;

INSERT INTO FORMATO_LINEAS (TIDO_COD, PREF_PRE, FOLI_ITEM, FOLI_TIPO, FOLI_X, FOLI_Y, FOLI_POSX, FOLI_POSY, FOLI_CADENA, FOLI_FONT, FOLI_FSIZE, FOLI_LIQUIDA) VALUES (82, '0000', 1, 'T', NULL, NULL, 400, 100, 'CERTIFICADO DE RETENCION EN LA FUENTE', 'Arial', 12, 'N');
INSERT INTO FORMATO_LINEAS (TIDO_COD, PREF_PRE, FOLI_ITEM, FOLI_TIPO, FOLI_X, FOLI_Y, FOLI_POSX, FOLI_POSY, FOLI_CADENA, FOLI_FONT, FOLI_FSIZE, FOLI_LIQUIDA) VALUES (82, '0000', 2, 'T', NULL, NULL, 100, 250, 'Razón Social:', 'Arial', 9, 'N');
INSERT INTO FORMATO_LINEAS (TIDO_COD, PREF_PRE, FOLI_ITEM, FOLI_TIPO, FOLI_X, FOLI_Y, FOLI_POSX, FOLI_POSY, FOLI_CADENA, FOLI_FONT, FOLI_FSIZE, FOLI_LIQUIDA) VALUES (82, '0000', 3, 'T', NULL, NULL, 100, 300, 'NIT:', 'Arial', 9, 'N');
INSERT INTO FORMATO_LINEAS (TIDO_COD, PREF_PRE, FOLI_ITEM, FOLI_TIPO, FOLI_X, FOLI_Y, FOLI_POSX, FOLI_POSY, FOLI_CADENA, FOLI_FONT, FOLI_FSIZE, FOLI_LIQUIDA) VALUES (82, '0000', 4, 'T', NULL, NULL, 100, 350, 'Dirección:', 'Arial', 9, 'N');
INSERT INTO FORMATO_LINEAS (TIDO_COD, PREF_PRE, FOLI_ITEM, FOLI_TIPO, FOLI_X, FOLI_Y, FOLI_POSX, FOLI_POSY, FOLI_CADENA, FOLI_FONT, FOLI_FSIZE, FOLI_LIQUIDA) VALUES (82, '0000', 5, 'T', NULL, NULL, 100, 400, 'Ciudad:', 'Arial', 9, 'N');
INSERT INTO FORMATO_LINEAS (TIDO_COD, PREF_PRE, FOLI_ITEM, FOLI_TIPO, FOLI_X, FOLI_Y, FOLI_POSX, FOLI_POSY, FOLI_CADENA, FOLI_FONT, FOLI_FSIZE, FOLI_LIQUIDA) VALUES (82, '0000', 6, 'T', NULL, NULL, 100, 450, 'Teléfonos:', 'Arial', 9, 'N');
INSERT INTO FORMATO_LINEAS (TIDO_COD, PREF_PRE, FOLI_ITEM, FOLI_TIPO, FOLI_X, FOLI_Y, FOLI_POSX, FOLI_POSY, FOLI_CADENA, FOLI_FONT, FOLI_FSIZE, FOLI_LIQUIDA) VALUES (82, '0000', 7, 'T', NULL, NULL, 100, 800, 'Con el fin de dar cumplimiento a las disposiciones vigentes', 'Arial', 9, 'N');
INSERT INTO FORMATO_LINEAS (TIDO_COD, PREF_PRE, FOLI_ITEM, FOLI_TIPO, FOLI_X, FOLI_Y, FOLI_POSX, FOLI_POSY, FOLI_CADENA, FOLI_FONT, FOLI_FSIZE, FOLI_LIQUIDA) VALUES (82, '0000', 8, 'T', NULL, NULL, 750, 800, 'sobre RETENCION EN LA FUENTE', 'Arial', 9, 'N');
INSERT INTO FORMATO_LINEAS (TIDO_COD, PREF_PRE, FOLI_ITEM, FOLI_TIPO, FOLI_X, FOLI_Y, FOLI_POSX, FOLI_POSY, FOLI_CADENA, FOLI_FONT, FOLI_FSIZE, FOLI_LIQUIDA) VALUES (82, '0000', 9, 'T', NULL, NULL, 100, 850, 'certificamos que sobre la factura No.', 'Arial', 9, 'N');
INSERT INTO FORMATO_LINEAS (TIDO_COD, PREF_PRE, FOLI_ITEM, FOLI_TIPO, FOLI_X, FOLI_Y, FOLI_POSX, FOLI_POSY, FOLI_CADENA, FOLI_FONT, FOLI_FSIZE, FOLI_LIQUIDA) VALUES (82, '0000', 10, 'T', NULL, NULL, 900, 850, 'en el año gravable', 'Arial', 9, 'N');
INSERT INTO FORMATO_LINEAS (TIDO_COD, PREF_PRE, FOLI_ITEM, FOLI_TIPO, FOLI_X, FOLI_Y, FOLI_POSX, FOLI_POSY, FOLI_CADENA, FOLI_FONT, FOLI_FSIZE, FOLI_LIQUIDA) VALUES (82, '0000', 11, 'T', NULL, NULL, 100, 900, 'hemos prácticado las siguientes retenciones:', 'Arial', 9, 'N');
INSERT INTO FORMATO_LINEAS (TIDO_COD, PREF_PRE, FOLI_ITEM, FOLI_TIPO, FOLI_X, FOLI_Y, FOLI_POSX, FOLI_POSY, FOLI_CADENA, FOLI_FONT, FOLI_FSIZE, FOLI_LIQUIDA) VALUES (82, '0000', 13, 'T', NULL, NULL, 100, 200, 'RETENEDOR', 'Arial', 11, 'N');
INSERT INTO FORMATO_LINEAS (TIDO_COD, PREF_PRE, FOLI_ITEM, FOLI_TIPO, FOLI_X, FOLI_Y, FOLI_POSX, FOLI_POSY, FOLI_CADENA, FOLI_FONT, FOLI_FSIZE, FOLI_LIQUIDA) VALUES (82, '0000', 14, 'T', NULL, NULL, 100, 500, 'CONTRIBUYENTE', 'Arial', 11, 'N');
INSERT INTO FORMATO_LINEAS (TIDO_COD, PREF_PRE, FOLI_ITEM, FOLI_TIPO, FOLI_X, FOLI_Y, FOLI_POSX, FOLI_POSY, FOLI_CADENA, FOLI_FONT, FOLI_FSIZE, FOLI_LIQUIDA) VALUES (82, '0000', 15, 'T', NULL, NULL, 100, 550, 'Razón Social:', 'Arial', 9, 'N');
INSERT INTO FORMATO_LINEAS (TIDO_COD, PREF_PRE, FOLI_ITEM, FOLI_TIPO, FOLI_X, FOLI_Y, FOLI_POSX, FOLI_POSY, FOLI_CADENA, FOLI_FONT, FOLI_FSIZE, FOLI_LIQUIDA) VALUES (82, '0000', 16, 'T', NULL, NULL, 100, 600, 'NIT:', 'Arial', 9, 'N');
INSERT INTO FORMATO_LINEAS (TIDO_COD, PREF_PRE, FOLI_ITEM, FOLI_TIPO, FOLI_X, FOLI_Y, FOLI_POSX, FOLI_POSY, FOLI_CADENA, FOLI_FONT, FOLI_FSIZE, FOLI_LIQUIDA) VALUES (82, '0000', 17, 'T', NULL, NULL, 100, 650, 'Dirección:', 'Arial', 9, 'N');
INSERT INTO FORMATO_LINEAS (TIDO_COD, PREF_PRE, FOLI_ITEM, FOLI_TIPO, FOLI_X, FOLI_Y, FOLI_POSX, FOLI_POSY, FOLI_CADENA, FOLI_FONT, FOLI_FSIZE, FOLI_LIQUIDA) VALUES (82, '0000', 18, 'T', NULL, NULL, 100, 700, 'Teléfonos:', 'Arial', 9, 'N');
INSERT INTO FORMATO_LINEAS (TIDO_COD, PREF_PRE, FOLI_ITEM, FOLI_TIPO, FOLI_X, FOLI_Y, FOLI_POSX, FOLI_POSY, FOLI_CADENA, FOLI_FONT, FOLI_FSIZE, FOLI_LIQUIDA) VALUES (82, '0000', 19, 'T', NULL, NULL, 100, 1000, 'Concepto', 'Arial', 9, 'N');
INSERT INTO FORMATO_LINEAS (TIDO_COD, PREF_PRE, FOLI_ITEM, FOLI_TIPO, FOLI_X, FOLI_Y, FOLI_POSX, FOLI_POSY, FOLI_CADENA, FOLI_FONT, FOLI_FSIZE, FOLI_LIQUIDA) VALUES (82, '0000', 20, 'T', NULL, NULL, 100, 1040, '---------------', 'Arial', 9, 'N');
INSERT INTO FORMATO_LINEAS (TIDO_COD, PREF_PRE, FOLI_ITEM, FOLI_TIPO, FOLI_X, FOLI_Y, FOLI_POSX, FOLI_POSY, FOLI_CADENA, FOLI_FONT, FOLI_FSIZE, FOLI_LIQUIDA) VALUES (82, '0000', 21, 'T', NULL, NULL, 500, 1000, 'Base retención', 'Arial', 9, 'N');
INSERT INTO FORMATO_LINEAS (TIDO_COD, PREF_PRE, FOLI_ITEM, FOLI_TIPO, FOLI_X, FOLI_Y, FOLI_POSX, FOLI_POSY, FOLI_CADENA, FOLI_FONT, FOLI_FSIZE, FOLI_LIQUIDA) VALUES (82, '0000', 22, 'T', NULL, NULL, 500, 1040, '-------------------------', 'Arial', 9, 'N');
INSERT INTO FORMATO_LINEAS (TIDO_COD, PREF_PRE, FOLI_ITEM, FOLI_TIPO, FOLI_X, FOLI_Y, FOLI_POSX, FOLI_POSY, FOLI_CADENA, FOLI_FONT, FOLI_FSIZE, FOLI_LIQUIDA) VALUES (82, '0000', 23, 'T', NULL, NULL, 1000, 1000, 'Porcentaje', 'Arial', 9, 'N');
INSERT INTO FORMATO_LINEAS (TIDO_COD, PREF_PRE, FOLI_ITEM, FOLI_TIPO, FOLI_X, FOLI_Y, FOLI_POSX, FOLI_POSY, FOLI_CADENA, FOLI_FONT, FOLI_FSIZE, FOLI_LIQUIDA) VALUES (82, '0000', 24, 'T', NULL, NULL, 1000, 1040, '------------------', 'Arial', 9, 'N');
INSERT INTO FORMATO_LINEAS (TIDO_COD, PREF_PRE, FOLI_ITEM, FOLI_TIPO, FOLI_X, FOLI_Y, FOLI_POSX, FOLI_POSY, FOLI_CADENA, FOLI_FONT, FOLI_FSIZE, FOLI_LIQUIDA) VALUES (82, '0000', 25, 'T', NULL, NULL, 1200, 1000, 'Valor retenido', 'Arial', 9, 'N');
INSERT INTO FORMATO_LINEAS (TIDO_COD, PREF_PRE, FOLI_ITEM, FOLI_TIPO, FOLI_X, FOLI_Y, FOLI_POSX, FOLI_POSY, FOLI_CADENA, FOLI_FONT, FOLI_FSIZE, FOLI_LIQUIDA) VALUES (82, '0000', 26, 'T', NULL, NULL, 1200, 1040, '----------------------', 'Arial', 9, 'N');
INSERT INTO FORMATO_LINEAS (TIDO_COD, PREF_PRE, FOLI_ITEM, FOLI_TIPO, FOLI_X, FOLI_Y, FOLI_POSX, FOLI_POSY, FOLI_CADENA, FOLI_FONT, FOLI_FSIZE, FOLI_LIQUIDA) VALUES (82, '0000', 27, 'T', NULL, NULL, 100, 1060, 'COMPRAS', 'Arial', 9, 'N');
INSERT INTO FORMATO_LINEAS (TIDO_COD, PREF_PRE, FOLI_ITEM, FOLI_TIPO, FOLI_X, FOLI_Y, FOLI_POSX, FOLI_POSY, FOLI_CADENA, FOLI_FONT, FOLI_FSIZE, FOLI_LIQUIDA) VALUES (82, '0000', 28, 'L', 1300, NULL, 100, 1150, NULL, 'Arial', 9, 'N');
INSERT INTO FORMATO_LINEAS (TIDO_COD, PREF_PRE, FOLI_ITEM, FOLI_TIPO, FOLI_X, FOLI_Y, FOLI_POSX, FOLI_POSY, FOLI_CADENA, FOLI_FONT, FOLI_FSIZE, FOLI_LIQUIDA) VALUES (82, '0000', 29, 'T', NULL, NULL, 100, 1300, 'El valor retenido fue oportunamente consignado a la', 'Arial', 9, 'N');
INSERT INTO FORMATO_LINEAS (TIDO_COD, PREF_PRE, FOLI_ITEM, FOLI_TIPO, FOLI_X, FOLI_Y, FOLI_POSX, FOLI_POSY, FOLI_CADENA, FOLI_FONT, FOLI_FSIZE, FOLI_LIQUIDA) VALUES (82, '0000', 30, 'T', NULL, NULL, 700, 1300, 'Direccion de Impuestos y Aduanas DIAN.', 'Arial', 9, 'N');
INSERT INTO FORMATO_LINEAS (TIDO_COD, PREF_PRE, FOLI_ITEM, FOLI_TIPO, FOLI_X, FOLI_Y, FOLI_POSX, FOLI_POSY, FOLI_CADENA, FOLI_FONT, FOLI_FSIZE, FOLI_LIQUIDA) VALUES (82, '0000', 31, 'T', NULL, NULL, 100, 1200, 'Son:', 'Arial', 9, 'N');
INSERT INTO FORMATO_LINEAS (TIDO_COD, PREF_PRE, FOLI_ITEM, FOLI_TIPO, FOLI_X, FOLI_Y, FOLI_POSX, FOLI_POSY, FOLI_CADENA, FOLI_FONT, FOLI_FSIZE, FOLI_LIQUIDA) VALUES (82, '0000', 33, 'T', NULL, NULL, 100, 1550, 'Nombre y sello del agente retenedor', 'Arial', 9, 'N');
INSERT INTO FORMATO_LINEAS (TIDO_COD, PREF_PRE, FOLI_ITEM, FOLI_TIPO, FOLI_X, FOLI_Y, FOLI_POSX, FOLI_POSY, FOLI_CADENA, FOLI_FONT, FOLI_FSIZE, FOLI_LIQUIDA) VALUES (82, '0000', 34, 'T', NULL, NULL, 100, 1500, '__________________________________', 'Arial', 9, 'N');
INSERT INTO FORMATO_LINEAS (TIDO_COD, PREF_PRE, FOLI_ITEM, FOLI_TIPO, FOLI_X, FOLI_Y, FOLI_POSX, FOLI_POSY, FOLI_CADENA, FOLI_FONT, FOLI_FSIZE, FOLI_LIQUIDA) VALUES (82, '0000', 35, 'T', NULL, NULL, 100, 150, 'Bogotá D. C.,', 'Arial', 9, 'N');

COMMIT WORK;


/* 20090526 */
/* REPORTE DE VENTAS POR HORA CON DIA DE LA SEMANA */
SET TERM ^ ;

CREATE OR ALTER PROCEDURE VENTAS_POR_HORA(
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    FECHA DATE,
    DIASEM VARCHAR(15),
    HORA INTEGER,
    SUBTOTAL NUMERIC(18,2))
AS
declare variable DIA INTEGER;
begin
FOR SELECT MAX(FACT_FECHA), MAX(EXTRACT(HOUR from AUDI_HORA)), SUM(FACT_TOTAL-FACT_IVAMONTO), MAX(EXTRACT(WEEKDAY from FACT_FECHA))
    FROM FACTURAS F, auditoria A
    WHERE F.fact_id = A.audi_iddoc AND A.tido_cod = 31 AND A.audi_oper = 'I' AND F.fact_fecha >= :FECINI AND F.fact_fecha <= :FECFIN
    GROUP BY F.fact_fecha, EXTRACT(HOUR FROM A.audi_hora)
    INTO :FECHA, :HORA, :SUBTOTAL, :DIA
    DO
    BEGIN
    if (DIA = 0) then
        DIASEM = 'DOMINGO';
    if (DIA = 1) then
        DIASEM = 'LUNES';
    if (DIA = 2) then
        DIASEM = 'MARTES';
    if (DIA = 3) then
        DIASEM = 'MIERCOLES';
    if (DIA = 4) then
        DIASEM = 'JUEVES';
    if (DIA = 5) then
        DIASEM = 'VIERNES';
    if (DIA = 6) then
        DIASEM = 'SABADO';
    SUSPEND;
    END
end
^

SET TERM ; ^


/* 20090527 */
ALTER TABLE AJUSTES
ADD AJUS_STAND VARCHAR(20);

INSERT INTO CONFIGURACION (CONF_MODULO, CONF_CATEGORIA, CONF_PROPIEDAD, CONF_VALOR, CONF_POSIBLES, CONF_AYUDA) VALUES ('INVENTARIO', 'AJUSTES', 'HACER AJUSTES POR CONTEO FISICO POR STAND', 'NO', 'SI,NO', 'SI: Pregunta el Stand a contar y trae automáticamente los artículos asignados a este stand para ingresar la cantidad contada. NO:Permite diigtar cualquier artículo en el ajuste sin importar su ubicación');
INSERT INTO CONFIGURACION (CONF_MODULO, CONF_CATEGORIA, CONF_PROPIEDAD, CONF_VALOR, CONF_POSIBLES, CONF_AYUDA) VALUES ('INVENTARIO', 'AJUSTES', 'VER EXISTENCIA ANTERIOR AL HACER AJUSTES DE INVENTARIO', 'SI', 'SI,NO', 'SI: Muestra una columna con la existencia del sistema y suguiere ese valor al digitar la nueva cantidad. NO: No permite ver la existencia anterior para garantizar mayor imparcialidad en la digitación');

COMMIT WORK;


/* 20090527B */
/* ANTICIPO EN FACTURA DE VENTA E INGRESO PARA TERCEROS */

INSERT INTO CONFIGURACION (CONF_MODULO, CONF_CATEGORIA, CONF_PROPIEDAD, CONF_VALOR, CONF_POSIBLES, CONF_AYUDA) VALUES ('FACTURACION', 'FACTURAS', 'CRUZAR ANTICIPOS DE CLIENTES EN LA LIQUIDACION DE LA FACTURA', 'NO', 'SI,NO', 'Permite cruzar automáticamente anticipos previamente registrados con el cliente desde la factura de venta empezando por los más antiguos');
INSERT INTO CONFIGURACION (CONF_MODULO, CONF_CATEGORIA, CONF_PROPIEDAD, CONF_VALOR, CONF_POSIBLES, CONF_AYUDA) VALUES ('FACTURACION', 'FACTURAS', 'GRUPO DE MERCANCIA PARA INGRESOS DE TERCEROS', '', '', 'Indique el código del grupo de mercancía para los ingresos de terceros que no generan impuestos');
commit work;

ALTER TABLE FACTURAS
ADD FACT_ANTICIPO T_MONTO;

ALTER TRIGGER FACTURAS_AU INACTIVE;

UPDATE FACTURAS SET FACT_ANTICIPO = 0 WHERE FACT_ANTICIPO IS NULL;

ALTER TRIGGER FACTURAS_AU ACTIVE;

SET TERM ^ ;

CREATE OR ALTER TRIGGER FACTURAS_BI FOR FACTURAS
ACTIVE BEFORE INSERT POSITION 0
AS
declare variable NUMERO VARCHAR(6);
declare variable AUTOM CHAR(1);
declare variable EXISTE CHAR(1);
DECLARE VARIABLE VALCUPO CHAR(10);
declare variable DISPONIBLE NUMERIC(18,2);
declare variable OK CHAR(1);
declare variable SITOT CHAR(2);
declare variable CODCOBR INTEGER;
declare variable CODVEND INTEGER;
declare variable contado char(1);
declare variable BLOQAUTO CHAR(2);
declare variable FECCONTA VARCHAR(8);
declare variable FECBLO VARCHAR(8);
declare variable FECSERVER CHAR(2);
declare variable PREGTASA CHAR(2);
BEGIN
EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION', 'DOCUMENTOS', 'INHABILITAR FECHA EN DOCUMENTOS') returning_values (:fecserver);
if (FECSERVER = 'SI') then
    NEW.fact_fecha = CAST ('NOW' AS DATE);
if (NEW.fact_anticipo IS NULL) then
    NEW.fact_anticipo = 0;
/* doble moneda */
if ((NEW.fact_trm IS NULL) or (NEW.fact_trm = 0)) then
    NEW.fact_trm = 1;
EXECUTE PROCEDURE LEE_CONFIGURACION('GENERAL', 'GENERAL', 'PREGUNTAR TASA DE CAMBIO EN DOCUMENTOS DE CARTERA') returning_values (:pregtasa);
if (PREGTASA = 'SI') then
    BEGIN
    NEW.fact_dtomonto = NEW.fact_dtomonto * NEW.fact_trm;
    NEW.fact_comimonto = NEW.fact_comimonto * NEW.fact_trm;
    NEW.fact_adicional = NEW.fact_adicional * NEW.fact_trm;
    NEW.fact_ivamonto = NEW.fact_ivamonto * NEW.fact_trm;
    NEW.fact_rtftemonto = NEW.fact_rtftemonto * NEW.fact_trm;
    NEW.fact_rtivamonto = NEW.fact_rtivamonto * NEW.fact_trm;
    NEW.fact_rticamonto = NEW.fact_rticamonto * NEW.fact_trm;
    NEW.fact_extra = NEW.fact_extra * NEW.fact_trm;
    NEW.fact_dtofmonto = NEW.fact_dtofmonto * NEW.fact_trm;
    NEW.fact_total = NEW.fact_total * NEW.fact_trm;
    NEW.fact_dtoit1 = NEW.fact_dtoit1 * NEW.fact_trm;
    NEW.fact_dtoit2 = NEW.fact_dtoit2 * NEW.fact_trm;
    NEW.fact_dtoit3 = NEW.fact_dtoit3 * NEW.fact_trm;
    END
EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION', 'POS', 'CAMBIAR FECHA DE BLOQUEO AUTOMATICAMENTE AL CAMBIAR FECHA DE LA FACTURA') RETURNING_VALUES (:bloqauto);
if (bloqauto = 'SI') then
    BEGIN
    EXECUTE PROCEDURE LEE_CONFIGURACION ('CONTABILIDAD', 'GENERAL', 'FECHA DE BLOQUEO') RETURNING_VALUES (:FECBLO);
    EXECUTE PROCEDURE fecha_a_conta (NEW.fact_fecha) returning_values (:FECCONTA);
    if (FECBLO > FECCONTA) then
        EXCEPTION CONTABILIDAD_BLOQUEADA 'La contabilidad esta bloqueada a ' || :fecblo;
    if (FECBLO < FECCONTA) then
        UPDATE CONFIGURACION
            SET CONF_VALOR = :FECCONTA
            WHERE (CONF_MODULO = 'CONTABILIDAD') AND (CONF_CATEGORIA = 'GENERAL') AND (CONF_PROPIEDAD = 'FECHA DE BLOQUEO');
    END
OK = 'S';
EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'ACCION A TOMAR SI EL CUPO DE CREDITO ES INSUFICIENTE') RETURNING_VALUES (:VALCUPO);
select auto_contado, auto_numero from autorizaciones
    where pref_pre = new.pref_pre and tido_cod = 31 AND auto_inicial <= new.fact_numero and auto_final >= new.fact_numero and auto_fecha <= new.fact_fecha and auto_vence >= new.fact_fecha
    into :contado, new.auto_numero;
if (contado='N') then
    BEGIN
    IF (VALCUPO = 'PROHIBIR') THEN
        BEGIN
        OK = 'N';
        /* VERIFIQUE EL CUPO DE CREDITO */
        execute procedure cupo_disponible(new.TERC_NIT, NEW.fact_fecha, NEW.fact_sucursal) returning_values (:DISPONIBLE);
        if (DISPONIBLE >= (NEW.FACT_TOTAL-NEW.fact_recibido)) then
            OK = 'S';
        END
    END
else
    BEGIN
    /* ASEGURECE QUE QUEDA SIN DIAS DE CREDITO */
    NEW.fact_vence = NEW.fact_fecha;
    END
IF (OK = 'S') THEN
  begin
  /* calcule la comision */
  EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION', 'VENDEDORES', 'COMISIONES EN VENTA INCLUYENDO IMPUESTOS') returning_values (:SITOT);
  if ((NEW.fact_comiporc IS NULL) or (NEW.fact_comiporc = 0)) THEN
    BEGIN
    if (SITOT = 'SI') then
      SELECT MAX(COMI_PORC) FROM comisiones WHERE VEND_COD = NEW.vend_cod AND
        COMI_INICIAL <= NEW.fact_total AND COMI_FINAL >= NEW.fact_total
        INTO NEW.fact_comiporc;
    else
      SELECT MAX(COMI_PORC) FROM comisiones WHERE VEND_COD = NEW.vend_cod AND
        COMI_INICIAL <= (NEW.fact_total -NEW.fact_ivamonto) AND COMI_FINAL >= (NEW.fact_total -NEW.fact_ivamonto)
        INTO NEW.fact_comiporc;
    if (NEW.fact_comiporc IS NULL) then
        NEW.fact_comiporc = 0;
    END
  if (SITOT = 'SI') then
      NEW.fact_comimonto = NEW.fact_total * NEW.fact_comiporc / 100;
  ELSE
      NEW.fact_comimonto = (NEW.fact_total -NEW.fact_ivamonto) * NEW.fact_comiporc / 100;

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

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

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER PROCEDURE IMPR_FACTURA(
    ID INTEGER)
RETURNS (
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    VENCE DATE,
    DIASVENCE INTEGER,
    CONTCRED CHAR(17),
    NIT VARCHAR(20),
    NOMTERCERO VARCHAR(60),
    NOMCLIENTE VARCHAR(60),
    VENDEDOR INTEGER,
    NOMVENDEDOR VARCHAR(60),
    PUNTOVTA INTEGER,
    NOMPUNTOVTA VARCHAR(30),
    CODBODEGA VARCHAR(2),
    NOMBODEGA VARCHAR(30),
    AUTORIZACION VARCHAR(20),
    DESPACHO VARCHAR(255),
    TRANSPORTADOR VARCHAR(60),
    COTIZACION VARCHAR(30),
    PEDIDO VARCHAR(30),
    REMISION VARCHAR(30),
    PACIENTE VARCHAR(20),
    NOMPACIENTE VARCHAR(60),
    COMIPORC NUMERIC(9,2),
    COMIMONTO NUMERIC(18,2),
    SUBTOTAL NUMERIC(18,2),
    INGTERCEROS NUMERIC(18,2),
    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),
    EXTRA NUMERIC(18,2),
    DTOFPORC NUMERIC(9,2),
    DTOFMONTO NUMERIC(18,2),
    FECHADTO DATE,
    ANTICIPO NUMERIC(18,2),
    TOTALFAC NUMERIC(18,2),
    TOTALPAGAR NUMERIC(18,2),
    OBS BLOB SUB_TYPE 1 SEGMENT SIZE 80,
    ITEM INTEGER,
    ARTICULO VARCHAR(15),
    CODBAR VARCHAR(15),
    ARTIDES VARCHAR(60),
    DESCORTA VARCHAR(30),
    CANT NUMERIC(18,4),
    LOTE VARCHAR(15),
    VLOTE DATE,
    UNIDAD VARCHAR(8),
    CAJAS NUMERIC(18,4),
    FACTOR NUMERIC(18,4),
    LISTAPR INTEGER,
    REFITEM VARCHAR(60),
    BODITEM VARCHAR(2),
    STAND VARCHAR(15),
    PRUNIT NUMERIC(18,2),
    DTOITPORC NUMERIC(9,2),
    DTOITMONTO NUMERIC(18,2),
    PRNETO NUMERIC(18,2),
    PRNETOSINIVA NUMERIC(18,2),
    DTOIT1 NUMERIC(9,2),
    DTOIT2 NUMERIC(9,2),
    DTOIT3 NUMERIC(9,2),
    IVAPORC NUMERIC(9,2),
    IVAITMONTO NUMERIC(18,2),
    CONSUMO NUMERIC(18,2),
    SUBTOTIT NUMERIC(18,2),
    TOTAL NUMERIC(18,2),
    CODIGOCL VARCHAR(20),
    ZONACOD VARCHAR(2),
    ZONANOM VARCHAR(60),
    DV CHAR(1),
    DIRECCION VARCHAR(60),
    CIUDAD VARCHAR(40),
    TELEFONO VARCHAR(40),
    CONTACTO VARCHAR(60),
    FAX VARCHAR(25),
    CEL VARCHAR(25),
    GRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    SUBGRUPO VARCHAR(3),
    NOMSUBG VARCHAR(30),
    MARCA VARCHAR(3),
    NOMMARCA VARCHAR(30),
    PESO NUMERIC(18,4),
    ANCHO NUMERIC(18,4),
    ALTO NUMERIC(18,4),
    LARGO NUMERIC(18,4),
    SUMA1 NUMERIC(18,2),
    SUMA2 NUMERIC(18,2),
    SUMA3 NUMERIC(18,2),
    IVA1 NUMERIC(18,2),
    IVA2 NUMERIC(18,2),
    IVA3 NUMERIC(18,2),
    SUMAEX NUMERIC(18,2),
    SUMAGR NUMERIC(18,2),
    TOTCONSUMO NUMERIC(18,2),
    DTOIT1M NUMERIC(18,2),
    DTOIT2M NUMERIC(18,2),
    DTOIT3M NUMERIC(18,2),
    TOTCAJAS NUMERIC(18,2),
    VEHICULO VARCHAR(8),
    RECIBIDO NUMERIC(18,2),
    CAMBIO NUMERIC(18,2),
    HORA TIME,
    FORMAPAGO1 VARCHAR(30),
    MONTOPAGO1 NUMERIC(18,2),
    FORMAPAGO2 VARCHAR(30),
    MONTOPAGO2 NUMERIC(18,2),
    FORMAPAGO3 VARCHAR(30),
    MONTOPAGO3 NUMERIC(18,2),
    PUNTOS INTEGER,
    PUNTOSACUM INTEGER,
    PUNTOSVENC INTEGER,
    FECPTOS DATE,
    OBSITEM BLOB SUB_TYPE 1 SEGMENT SIZE 80,
    SUCUR VARCHAR(10),
    ALTERNATIVAS NUMERIC(18,4),
    PRINCIPALES NUMERIC(18,4))
AS
DECLARE VARIABLE IMPTOS CHAR(1);
DECLARE VARIABLE TARIFA INTEGER;
declare variable DEVUELTO NUMERIC(18,2);
declare variable ORDENCOD CHAR(2);
declare variable IMPRDEV CHAR(2);
declare variable IMPR CHAR(1);
declare variable ITEMFP INTEGER;
declare variable FORMAP VARCHAR(30);
declare variable MONTOP NUMERIC(18,2);
declare variable ICOINC CHAR(2);
declare variable DTOITM1 NUMERIC(18,2);
declare variable DTOITM2 NUMERIC(18,2);
declare variable DTOITM3 NUMERIC(18,2);
declare variable DTOITE3 CHAR(2);
declare variable SUMDTOIT NUMERIC(18,2);
declare variable AUTORET VARCHAR(10);
declare variable FAUTORET DATE;
declare variable FACTCANT NUMERIC(18,4);
declare variable ANULADO CHAR(1);
declare variable INGTER CHAR(2);
BEGIN
execute procedure lee_configuracion('FACTURACION', 'ARTICULOS', 'IMPOCONSUMO INCLUIDO EN EL PRECIO BASE DE VENTA ANTES DE IVA') returning_values (icoinc);
execute procedure lee_configuracion('FACTURACION', 'FACTURAS', 'COLUMNAS DE DESCUENTO POR ITEM ADICIONALES') returning_values (DTOITE3);
execute procedure lee_configuracion('FACTURACION', 'FACTURAS', 'GRUPO DE MERCANCIA PARA INGRESOS DE TERCEROS') returning_values (INGTER);
SELECT F.PREF_PRE, FACT_NUMERO, FACT_FECHA, FACT_VENCE, F.BODE_COD, BODE_NOM, F.TERC_NIT, FACT_NOMCLIENTE, F.VEND_COD, VEND_NOMBRE, F.PTVT_ID, PTVT_NOM,
    AUTO_NUMERO, FACT_DESPACHO, FACT_TRANSP, FACT_COTIZACI, FACT_PEDIDO, FACT_REMISION, FACT_COMIPORC, FACT_COMIMONTO, FACT_IVAINC, 
    FACT_DTOPOR, FACT_DTOMONTO, FACT_ADICIONAL, FACT_IVAMONTO, FACT_RTFTEPOR, FACT_RTFTEMONTO, FACT_RTIVAPOR, FACT_RTIVAMONTO, FACT_RTICAPOR, FACT_RTICAMONTO, FACT_EXTRA, FACT_DTOFPOR, FACT_DTOFMONTO, FACT_DTOFFECHA, FACT_TOTAL,
    TERC_DIR, TERC_CIU, TERC_TEL, TERC_CONTACTO, TERC_FAX, TERC_DV, TERC_CEL, FACT_DTOIT1, FACT_DTOIT2, FACT_DTOIT3,
    FACT_OBS, VEHI_COD, /*FACT_NROCOPIA,*/ FACT_RECIBIDO, FACT_SUCURSAL, FACT_DETCLI, FACT_DETCLINOM, TERC_NOM, FACT_ANULADO, FACT_ANTICIPO
    FROM FACTURAS F, BODEGA B, VENDEDORES V, PUNTO_VENTA P, TERCEROS T
    WHERE F.BODE_COD = B.BODE_COD AND F.VEND_COD = V.VEND_COD AND F.PTVT_ID = P.PTVT_ID AND F.TERC_NIT = T.TERC_NIT AND F.FACT_ID = :ID
    into :PREF, :NUMERO, :FECHA, :VENCE, :CODBODEGA, :NOMBODEGA, :NIT, :NOMTERCERO, :VENDEDOR, :NOMVENDEDOR, :PUNTOVTA, :NOMPUNTOVTA,
    :AUTORIZACION, :DESPACHO, :TRANSPORTADOR, :COTIZACION, :PEDIDO, :REMISION, :COMIPORC, :COMIMONTO, :IMPTOS,
    :DTOPORC, :DTOMONTO, :ADICIONAL, :IVAMONTO, :RTEFTEPORC, :RTEFTEMONTO, :RTEIVAPORC, :RTEIVAMONTO, :RTEICAPORC, :RTEICAMONTO, :EXTRA, :DTOFPORC, :DTOFMONTO, :FECHADTO, :TOTALFAC,
    :DIRECCION, :CIUDAD, :TELEFONO, :CONTACTO, :FAX, :DV, :CEL, :dtoit1m, :dtoit2m, :dtoit3m,
    :OBS, :VEHICULO,/* :NROCOPIA,*/ :RECIBIDO, :SUCUR, :paciente, :nompaciente, :nomcliente, :ANULADO, :anticipo;

/* ACUMULE LOS PUNTOS, SE HACE ACA POR SER POSTERIOR AL DETALLE */
if (ANULADO = 'N') then
    EXECUTE PROCEDURE acumula_puntos_cliente (31, :id, :nit, :fecha) returning_values (:PUNTOS);
EXECUTE PROCEDURE consulta_puntos_cliente (:id, :nit, :fecha) returning_values (:puntos, :puntosacum, :puntosvenc, :fecptos);
if (DTOIT1M IS NULL) then
    DTOIT1M = 0;
if (DTOIT2M IS NULL) then
    DTOIT2M = 0;
if (DTOIT3M IS NULL) then
    DTOIT3M = 0;
SELECT CLIE_COD, C.ZONA_COD, ZONA_NOM
    FROM CLIENTES C, ZONAS Z
    WHERE TERC_NIT = :NIT AND C.ZONA_COD = Z.ZONA_COD
    INTO :CODIGOCL, :ZONACOD, :ZONANOM;
SELECT CLSU_DIR, CLSU_CIUDAD, CLSU_TEL FROM CLIENTE_SUCURSALES WHERE TERC_NIT = :NIT AND CLCU_COD = :SUCUR
    INTO :DIRECCION, :CIUDAD, :TELEFONO;
DIASVENCE = VENCE - FECHA;
if (DIASVENCE > 0) then
    CONTCRED = 'CREDITO ' || CAST(DIASVENCE AS VARCHAR(3)) || ' DIAS';
ELSE
    CONTCRED = 'CONTADO';
SUBTOTAL = TOTALFAC - EXTRA - IVAMONTO - ADICIONAL + DTOMONTO;
if (DTOITE3 = 'SI') then
    BEGIN
    SELECT SUM(FADE_DTOMONTO) FROM FACTURAS_DETALLE WHERE FACT_ID = :id INTO :sumdtoit;
    SUBTOTAL = SUBTOTAL + sumdtoit + dtoit1m + dtoit2m + dtoit3m;
    END
if (INGTER <> '') then
    BEGIN
    SELECT SUM(FADE_TOTAL) FROM FACTURAS_DETALLE D, ARTICULO A WHERE A.arti_cod = D.arti_cod AND FACT_ID = :id AND GRUP_COD = :ingter
        INTO :ingterceros;
    END
EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'FECHA AUTORETENEDOR NO DESCONTAR RETENCIONES DEL SALDO PERO SI CONTABILIZARLAS') returning_values (AUTORET);
if (AUTORET <> '') then
    FAUTORET = CAST(AUTORET AS DATE);
else
    FAUTORET = '9999/12/31';
if (FECHA > fautoret) then
    TOTALPAGAR = TOTALFAC - RTEIVAMONTO - RTEICAMONTO - ANTICIPO;
ELSE
    TOTALPAGAR = TOTALFAC - RTEFTEMONTO - RTEIVAMONTO - RTEICAMONTO - ANTICIPO;
if (RECIBIDO <> 0) then
    CAMBIO = RECIBIDO - totalpagar;
ELSE
    CAMBIO = 0;
SUMAEX = 0;
SUMA1 = 0;
SUMA2 = 0;
SUMA3 = 0;
IVA1 = 0;
IVA2 = 0;
IVA3 = 0;
TOTCONSUMO = 0;
MONTOPAGO1 = 0;
SELECT MAX(AUDI_HORA) FROM AUDITORIA WHERE TIDO_COD = 31 AND AUDI_IDDOC = :ID AND AUDI_OPER = 'I' INTO :HORA;
/* AHORA LAS FORMAS DE PAGO, BUSQUE EL ABONO DE HOY A LA FACTURA */
ITEMFP = 1;
MONTOPAGO1 = 0;
MONTOPAGO2 = 0;
MONTOPAGO3 = 0;
FOR SELECT FOPA_NOM, RCPA_MONTO FROM RECIBOS_CAJA_PAGO P, FORMAS_PAGO F, RECIBOS_CAJA R, RECIBOS_CAJA_DETALLE D
    WHERE R.RECA_ID = P.RECA_ID AND R.RECA_ID = D.RECA_ID AND P.FOPA_ID = F.FOPA_ID AND RECA_FECHA = :FECHA AND RCDE_TIPODOC = 31 AND RCDE_IDDOC = :ID
    INTO :formap, :MONTOP
    DO
    BEGIN
    if (ITEMFP = 1) then
        BEGIN
        FORMAPAGO1 = FORMAP;
        MONTOPAGO1 = MONTOP;
        END
    if (ITEMFP = 2) then
        BEGIN
        FORMAPAGO2 = FORMAP;
        MONTOPAGO2 = MONTOP;
        END
    if (ITEMFP = 3) then
        BEGIN
        FORMAPAGO3 = FORMAP;
        MONTOPAGO3 = MONTOP;
        END
    ITEMFP = ITEMFP + 1;
    END
EXECUTE PROCEDURE lee_configuracion ('FACTURACION','DOCUMENTOS','ORDENAR ITEMS POR CODIGO DE ARTICULO') returning_values (:ORDENCOD);
EXECUTE PROCEDURE lee_configuracion ('FACTURACION','POS', 'IMPRIMIR DEVOLUCIONES DE ARTICULOS NEGATIVOS') returning_values (:imprdev);
totcajas = 0;
if (ORDENCOD = 'SI') then
    BEGIN
    FOR SELECT FADE_ITEM, D.ARTI_COD, FADE_CODBAR, SUBSTR(FADE_DESC,1,60), ARTI_DESCORTA, FADE_CANT, FADE_UNIDAD, FADE_FACTOR, BODE_COD, FADE_LOTE, LIPR_COD, FADE_PRUNIT, FADE_DTOPORC, FADE_DTOMONTO, FADE_IVAPORC, FADE_IVAMONTO, FADE_CONSUMO, FADE_TOTAL, FADE_REFERENCIA,
        GRUP_COD, SUBG_COD, MARC_COD, ARTI_PESO, ARTI_ANCHO, ARTI_ALTO, ARTI_LARGO, TAIV_COD, FADE_DEVUELTO, FADE_OBS, FADE_DTO1, FADE_DTO2, FADE_DTO3, FADE_DTOM1, FADE_DTOM2, FADE_DTOM3, FADE_CAJAS
        FROM FACTURAS_DETALLE D, ARTICULO A
        WHERE D.ARTI_COD = A.ARTI_COD AND D.FACT_ID = :ID
        ORDER BY D.ARTI_COD
        INTO :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :DESCORTA, :CANT, :UNIDAD, :FACTOR, :BODITEM, :LOTE, :LISTAPR, :PRUNIT, :DTOITPORC, :DTOITMONTO, :IVAPORC, :IVAITMONTO, :CONSUMO, :TOTAL, :refitem,
        :GRUPO, :SUBGRUPO, :MARCA, :PESO, :ANCHO, :ALTO, :LARGO, :TARIFA, :devuelto, :obsitem, :dtoit1, :dtoit2, :dtoit3, :dtoitm1, :dtoitm2, :dtoitm3, :cajas
        DO
          BEGIN
          if (ARTICULO = CODBAR) then
            SELECT FIRST 1 COBA_COD FROM barras_articulo WHERE ARTI_COD = :articulo INTO :CODBAR;
          if (IMPRDEV <> 'SI') then
            BEGIN
            if ((CANT >= 0) AND (DEVUELTO = 0)) then
                IMPR = 'S';
            ELSE
                IMPR = 'N'; /* ES DEVOLUCION */
            END
          ELSE
            IMPR = 'S';
          if (IMPR = 'S') then
            BEGIN
            prneto = PRUNIT - DTOITMONTO - dtoitm1 - dtoitm2 - dtoitm3;
            if (IMPTOS = 'S') then
                if (cant <> 0) then
                    prnetosiniva = PRUNIT - DTOITMONTO - ((IVAITMONTO+CONSUMO) / CANT) - dtoitm1 - dtoitm2 - dtoitm3;
                else
                    prnetosiniva = PRUNIT - DTOITMONTO - dtoitm1 - dtoitm2 - dtoitm3;
            ELSE
                prnetosiniva = PRUNIT - DTOITMONTO - dtoit1m - dtoit2m - dtoit3m;
            if (ICOINC = 'SI') then
                SUBTOTIT = TOTAL - IVAITMONTO;
            else
                SUBTOTIT = TOTAL - IVAITMONTO - CONSUMO;
            TOTCONSUMO = TOTCONSUMO + CONSUMO;
            SELECT LOTE_VENCE FROM LOTES WHERE LOTE_NRO = :lote AND ARTI_COD = :ARTICULO AND BODE_COD = :boditem INTO :vlote;
            if ((REFITEM <> '.t') or (REFITEM IS NULL)) then
                BEGIN
                /* NO SUME LOS ENSAMBLES */
                if (IVAPORC = 0) then
                    SUMAEX = SUMAEX + TOTAL;
                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;
                END
            if (ANCHO IS NULL) then
                ANCHO = 0;
            if (ALTO IS NULL) then
                ALTO = 0;
            if (LARGO IS NULL) then
                LARGO = 0;
            if (PESO IS NULL) then
                PESO = 0;
            PESO = (PESO / 1000) * CANT * FACTOR;
            totcajas = totcajas + cajas;
            if (substr(ARTICULO,1,2) = '.t') then
                BEGIN
                REFITEM = '';
                TOTAL = 0;
                SUBTOTIT = 0;
                END
            SELECT STAND_COD FROM STANDS WHERE ARTI_COD = :ARTICULO AND STAND_BODEGA = :boditem INTO :stand;
            factcant = NULL;
            SELECT FIRST 1 UNAR_FACCAN FROM unidad_articulo WHERE ARTI_COD = :articulo INTO :factcant;
            if (factcant IS NULL) then
                factcant = 1;
            if ((factcant = 1) or (factcant = 0)) then
                BEGIN
                ALTERNATIVAS = 0;
                PRINCIPALES = (CANT * FACTOR);
                END
            ELSE
                BEGIN
                ALTERNATIVAS = FLOOR(CANT * factor / factcant);
                PRINCIPALES = (CANT * FACTOR) - (alternativas * factcant);
                END
            SUSPEND;
            END
          END
    END
ELSE
    BEGIN
    FOR SELECT FADE_ITEM, D.ARTI_COD, FADE_CODBAR, SUBSTR(FADE_DESC,1,60), ARTI_DESCORTA, FADE_CANT, FADE_UNIDAD, FADE_FACTOR, BODE_COD, FADE_LOTE, LIPR_COD, FADE_PRUNIT, FADE_DTOPORC, FADE_DTOMONTO, FADE_IVAPORC, FADE_IVAMONTO, FADE_CONSUMO, FADE_TOTAL, FADE_REFERENCIA,
        GRUP_COD, SUBG_COD, MARC_COD, ARTI_PESO, ARTI_ANCHO, ARTI_ALTO, ARTI_LARGO, TAIV_COD, FADE_DEVUELTO, FADE_OBS, FADE_DTO1, FADE_DTO2, FADE_DTO3, FADE_DTOM1, FADE_DTOM2, FADE_DTOM3, FADE_CAJAS
        FROM FACTURAS_DETALLE D, ARTICULO A
        WHERE D.ARTI_COD = A.ARTI_COD AND D.FACT_ID = :ID
        ORDER BY FADE_ITEM
        INTO :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :DESCORTA, :CANT, :UNIDAD, :FACTOR, :BODITEM, :LOTE, :LISTAPR, :PRUNIT, :DTOITPORC, :DTOITMONTO, :IVAPORC, :IVAITMONTO, :CONSUMO, :TOTAL, :refitem,
        :GRUPO, :SUBGRUPO, :MARCA, :PESO, :ANCHO, :ALTO, :LARGO, :TARIFA, :devuelto, :obsitem, :dtoit1, :dtoit2, :dtoit3, :dtoitm1, :dtoitm2, :dtoitm3, :cajas
        DO
          BEGIN
          if (IMPRDEV <> 'SI') then
            BEGIN
            if ((CANT >= 0) AND (DEVUELTO = 0)) then
                IMPR = 'S';
            ELSE
                IMPR = 'N'; /* ES DEVOLUCION */
            END
          ELSE
            IMPR = 'S';
          if (IMPR = 'S') then
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :GRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :MARCA INTO NOMMARCA;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :SUBGRUPO AND GRUP_COD = :GRUPO INTO :NOMSUBG;
            prneto = PRUNIT - DTOITMONTO - dtoitm1 - dtoitm2 - dtoitm3;
            if (IMPTOS = 'S') then
                if (cant <> 0) then
                    prnetosiniva = PRUNIT - DTOITMONTO - ((IVAITMONTO+CONSUMO) / CANT) - dtoit1m - dtoit2m - dtoit3m;
                else
                    prnetosiniva = PRUNIT - DTOITMONTO - dtoitm1 - dtoitm2 - dtoitm3;
            ELSE
                prnetosiniva = PRUNIT - DTOITMONTO - dtoitm1 - dtoitm2 - dtoitm3;
            if (ICOINC = 'SI') then
                SUBTOTIT = TOTAL - IVAITMONTO;
            else
                SUBTOTIT = TOTAL - IVAITMONTO - CONSUMO;
            TOTCONSUMO = TOTCONSUMO + CONSUMO;
            SELECT LOTE_VENCE FROM LOTES WHERE LOTE_NRO = :lote AND ARTI_COD = :ARTICULO AND BODE_COD = :boditem INTO :vlote;
            if ((REFITEM <> '.t') or (REFITEM IS NULL)) then
                BEGIN
                /* NO SUME LOS ENSAMBLES */
                if (IVAPORC = 0) then
                    SUMAEX = SUMAEX + TOTAL;
                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;
                END
            if (ANCHO IS NULL) then
                ANCHO = 0;
            if (ALTO IS NULL) then
                ALTO = 0;
            if (LARGO IS NULL) then
                LARGO = 0;
            if (PESO IS NULL) then
                PESO = 0;
            PESO = (PESO / 1000)* CANT * FACTOR;
            totcajas = totcajas + cajas;
            if (substr(ARTICULO,1,2) = '.t') then
                BEGIN
                REFITEM = '';
                TOTAL = 0;
                SUBTOTIT = 0;
                END
            SELECT STAND_COD FROM STANDS WHERE ARTI_COD = :ARTICULO AND STAND_BODEGA = :boditem INTO :stand;            factcant = NULL;
            SELECT FIRST 1 UNAR_FACCAN FROM unidad_articulo WHERE ARTI_COD = :articulo INTO :factcant;
            if (factcant IS NULL) then
                factcant = 1;
            if ((factcant = 1) or (factcant = 0)) then
                BEGIN
                ALTERNATIVAS = 0;
                PRINCIPALES = (CANT * FACTOR);
                END
            ELSE
                BEGIN
                ALTERNATIVAS = FLOOR(CANT * factor / factcant);
                PRINCIPALES = (CANT * FACTOR) - (alternativas * factcant);
                END
            SUSPEND;
            END
          END
    END
END
^

SET TERM ; ^


/* 2009/05/28 : CONFIRMAR DIRECCION DEL CLIENTE */
INSERT INTO CONFIGURACION (CONF_MODULO, CONF_CATEGORIA, CONF_PROPIEDAD, CONF_VALOR, CONF_POSIBLES, CONF_AYUDA) VALUES ('FACTURACION', 'FACTURAS', 'VERIFICAR DIRECCION DEL CLIENTE AL FACTURAR', 'NO', 'SI,NO', 'SI: Se muestran los datos de ubicación de la sucursal del cliente al facturar para que el vendedor confirme dichos datos.');
INSERT INTO CONFIGURACION (CONF_MODULO, CONF_CATEGORIA, CONF_PROPIEDAD, CONF_VALOR, CONF_POSIBLES, CONF_AYUDA) VALUES ('FACTURACION', 'REMISIONES', 'VERIFICAR DIRECCION DEL CLIENTE AL REMISIONAR', 'NO', 'SI,NO', 'SI: Se muestran los datos de ubicación de la sucursal del cliente al facturar para que el vendedor confirme dichos datos.');
INSERT INTO CONFIGURACION (CONF_MODULO, CONF_CATEGORIA, CONF_PROPIEDAD, CONF_VALOR, CONF_POSIBLES, CONF_AYUDA) VALUES ('FACTURACION', 'PEDIDOS', 'VERIFICAR DIRECCION DEL CLIENTE AL HACER PEDIDOS', 'NO', 'SI,NO', 'SI: Se muestran los datos de ubicación de la sucursal del cliente al facturar para que el vendedor confirme dichos datos.');
INSERT INTO CONFIGURACION (CONF_MODULO, CONF_CATEGORIA, CONF_PROPIEDAD, CONF_VALOR, CONF_POSIBLES, CONF_AYUDA) VALUES ('FACTURACION', 'COTIZACIONES', 'VERIFICAR DIRECCION DEL CLIENTE AL COTIZAR', 'NO', 'SI,NO', 'SI: Se muestran los datos de ubicación de la sucursal del cliente al facturar para que el vendedor confirme dichos datos.');
COMMIT WORK;

UPDATE CAJAS SET CAJA_ACTIVA = 'S' WHERE CAJA_ACTIVA IS NULL;
COMMIT WORK;

/* 20090528b */
/* se demoraba mucho trayendo la fecha del costo de la tabla de existencias */
SET TERM ^ ;

CREATE OR ALTER PROCEDURE EXISTENCIAS_DESDE_HASTA(
    FECHA DATE,
    ARTINI VARCHAR(20),
    ARTFIN VARCHAR(20),
    GRPINI VARCHAR(3),
    GRPFIN VARCHAR(3),
    BODINI VARCHAR(2),
    BODFIN VARCHAR(2),
    ORDEN CHAR(1),
    AGRUPA CHAR(1),
    DETALLE CHAR(1),
    RESERVA CHAR(1),
    ENPESO CHAR(1),
    SUCURSAL INTEGER)
RETURNS (
    CANT NUMERIC(18,4),
    COSTO NUMERIC(18,2),
    COSTO_LOTE NUMERIC(18,2),
    CODIGO VARCHAR(15),
    NOMBRE VARCHAR(60),
    UNIDAD VARCHAR(8),
    STAND VARCHAR(15),
    CODGRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    CODSUBG VARCHAR(3),
    NOMSUBG VARCHAR(30),
    CODMARC VARCHAR(3),
    NOMMARC VARCHAR(30),
    CODBOD VARCHAR(2),
    LOTE VARCHAR(15),
    NOMBOD VARCHAR(30),
    COSTOTOT NUMERIC(18,2),
    ULTCOSTO NUMERIC(18,2),
    FECHACOSTO DATE,
    CONSUMO NUMERIC(18,2),
    RESERVADO NUMERIC(18,4),
    ORDENADO NUMERIC(18,4),
    IVA NUMERIC(9,2),
    PESOUNIT NUMERIC(18,4),
    PESOTOTAL NUMERIC(18,4),
    PRECIO NUMERIC(18,2),
    CODBAR VARCHAR(20))
AS
declare variable exist char(1);
declare variable codini varchar(20);
declare variable codfin varchar(20);
declare variable desini varchar(20);
declare variable desfin varchar(20);
declare variable ordenc numeric(18,4);
declare variable pedido numeric(18,4);
declare variable ok char(1);
declare variable id integer;
declare variable item integer;
declare variable und varchar(8);
declare variable factor numeric(18,4);
declare variable cant2 numeric(18,4);
declare variable PEDAUTO CHAR(2);
DECLARE VARIABLE LISTA INTEGER;
BEGIN
EXECUTE PROCEDURE lee_configuracion ('FACTURACION','FACTURAS', 'CODIGO DE LA LISTA DE PRECIOS A MOSTRAR EN ARTICULOS') returning_values (:LISTA);
if (ORDEN = 'C') then
    BEGIN
    CODINI = ARTINI;
    CODFIN = ARTFIN;
    DESINI = '';
    DESFIN = 'zz';
    END
ELSE
    BEGIN
    DESINI = ARTINI;
    DESFIN = ARTFIN;
    CODINI = '';
    CODFIN = 'zz';
    END
EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION', 'FACTURAS', 'GENERAR PEDIDO AUTOMATICAMENTE CON LA FACTURA') returning_values (pedauto);
if (DETALLE = 'B') then
  BEGIN
  FOR SELECT ARTI_COD, ARTI_DES, ARTI_UNIDAD, ARTI_EXIST, TAIV_PORC, A.GRUP_COD, A.SUBG_COD, A.MARC_COD, BODE_COD, BODE_NOM, ARTI_CONSUMO, ARTI_PESO/1000
      FROM ARTICULO A, BODEGA B, TARIFA_IVA T
      WHERE ARTI_COD >= :CODINI AND ARTI_COD <= :CODFIN AND ARTI_DES >= :DESINI AND ARTI_DES <= :DESFIN AND ESAR_COD <> 'I' AND BODE_COD >= :BODINI AND
      BODE_COD <= :BODFIN AND ((SUCU_ID = :SUCURSAL) or (:SUCURSAL = 0)) AND A.TAIV_COD = T.TAIV_COD
      INTO :CODIGO, :NOMBRE, :UNIDAD, :EXIST, :IVA, :CODGRUPO, :CODSUBG, :CODMARC, :CODBOD, :NOMBOD, :CONSUMO, :pesounit
      DO
        BEGIN
        STAND = '';
        OK = 'N';
        if (AGRUPA = 'G') then
            BEGIN
            if ((CODGRUPO >= GRPINI) AND (CODGRUPO <= GRPFIN)) then
                OK = 'S';
            end
        ELSE
            if (AGRUPA = 'M') then
                BEGIN
                if ((CODMARC >= GRPINI) AND (CODMARC <= GRPFIN)) then
                    OK = 'S';
                END
        if (OK = 'S') then
            BEGIN
            NOMGRUPO = '';
            NOMMARC = '';
            NOMSUBG = '';
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            SELECT MAX(COBA_COD) FROM BARRAS_ARTICULO WHERE ARTI_COD = :codigo AND COBA_UNIDAD = :unidad INTO :codbar;
            if (CODBAR IS NULL) then
                CODBAR = CODIGO;
            if (EXIST <> 'N') then
                BEGIN
                SELECT STAND_COD FROM STANDS WHERE ARTI_COD = :CODIGO AND STAND_BODEGA = :CODBOD INTO :STAND;
                EXECUTE PROCEDURE SALDO_INICIAL_INVENTARIO(CODIGO, FECHA, :CODBOD) returning_values (CANT);
                EXECUTE PROCEDURE costo_promedio_y_ultimo_unidad(CODIGO, FECHA, UNIDAD) returning_values (COSTO, ULTCOSTO);
                SELECT MAX(MVAR_FECHA) FROM MOVIMIENTO_ARTICULO WHERE ARTI_COD = :CODIGO AND MVAR_ENTRADA = 'S' AND MVAR_FECHA <= :FECHA INTO :FECHACOSTO;
                COSTOTOT = :CANT * :COSTO;
                CONSUMO = CONSUMO * CANT;
                if (RESERVA = 'S') then
                    BEGIN
                    SELECT SUM(ORID_ENTREGAR)
                        FROM ORDENINVENTARIO_DETALLE OD, ordenes_inventario O
                        WHERE O.ORIN_ID = OD.ORIN_ID AND ARTI_COD = :CODIGO AND ORIN_FECHA <= :FECHA AND ORIN_FECLLEGA >= :FECHA AND ORID_ANULADO = 'N' AND OD.BODE_COD = :CODBOD
                        INTO :ORDENADO;
                    if (ORDENADO IS NULL) then
                        ORDENADO = 0;
                    ORDENC = 0;
                    FOR SELECT O.ORDC_ID, OCDE_ITEM, OCDE_CANT * OCDE_FACTOR
                        FROM ORDENES_COMPRA O, ORDENES_COMPRA_DETALLE OD
                        WHERE O.ORDC_ID = OD.ORDC_ID AND OD.ARTI_COD = :CODIGO AND ORDC_VENCE >= :FECHA AND ORDC_FECHA <= :FECHA AND OCDE_ANULADO = 'N' AND OD.BODE_COD = :CODBOD
                        INTO :ID, :ITEM, :CANT2
                        do
                        BEGIN
                        EXECUTE PROCEDURE FALTANTE(23, 21, ID, ITEM) returning_values (PEDIDO, UND, FACTOR);
                        if (PEDIDO * FACTOR = CANT2) then /* SI NO SE HA FACTURADO MIRE A VER SI SE REMISIONO */
                            EXECUTE PROCEDURE FALTANTE(23, 22, ID, ITEM) returning_values (PEDIDO, UND, FACTOR);
                        if (PEDIDO IS NULL) then
                            PEDIDO = 0;
                        ORDENC = ORDENC + PEDIDO * FACTOR;
                        END
                    ORDENADO = ORDENADO + ORDENC;
                    SELECT SUM(RSDE_LIBERAR)
                        FROM RESERVAS_DETALLE RD, RESERVAS R
                        WHERE R.RESE_ID = RD.RESE_ID AND ARTI_COD = :CODIGO AND RESE_FECHA <= :FECHA AND RESE_VENCE >= :FECHA AND RD.BODE_COD = :CODBOD AND RSDE_ANULADO = 'N'
                        INTO :RESERVADO;
                    if (RESERVADO IS NULL) then
                        RESERVADO = 0;
                    PEDIDO = 0;
                    FOR SELECT P.PEDI_ID, PEDE_ITEM, PEDE_CANT * PEDE_FACTOR
                        FROM PEDIDOS P, PEDIDOS_DETALLE PD
                        WHERE P.PEDI_ID = PD.PEDI_ID AND PD.ARTI_COD = :CODIGO AND PEDI_VENCE >= :FECHA AND PEDI_FECHA <= :FECHA AND PEDE_ANULADO = 'N' AND BODE_COD = :CODBOD
                        INTO :ID, :ITEM, :CANT2
                        do
                        BEGIN
                        EXECUTE PROCEDURE FALTANTE(34, 31, ID, ITEM) returning_values (ORDENC, UND, FACTOR);
                        if ((ORDENC * FACTOR = CANT2) or (PEDAUTO = 'SI')) then /* SI NO SE HA FACTURADO MIRE A VER SI SE REMISIONO */
                            EXECUTE PROCEDURE FALTANTE(34, 32, ID, ITEM) returning_values (ORDENC, UND, FACTOR);
                        if (ORDENC IS NULL) then
                            ORDENC = 0;
                        PEDIDO = PEDIDO + ORDENC * FACTOR;
                        END
                    RESERVADO = RESERVADO + PEDIDO;
                    END
                ELSE
                    BEGIN
                    RESERVADO = 0;
                    ORDENADO = 0;
                    END
                if (LISTA > 0) then
                    SELECT prar_fijo FROM precios_articulo WHERE arti_cod = :CODIGO and lipr_cod = :LISTA INTO :PRECIO;
                if (ENPESO = 'S') then
                    BEGIN
                    if (pesounit IS NULL) then
                        pesounit = 0;
                    if (PESOUNIT <> 0) then
                        BEGIN
                        pesototal = PESOUNIT * cant;
                        SUSPEND;
                        END
                    END
                ELSE
                    SUSPEND;
                END
            END
        END
  END

if (DETALLE = 'L') then
  BEGIN
  FOR SELECT A.ARTI_COD, ARTI_DES, ARTI_UNIDAD, ARTI_EXIST, TAIV_PORC, A.GRUP_COD, A.SUBG_COD, A.MARC_COD, L.lote_nro, L.lote_nro||' - '||L.lote_vence, ARTI_CONSUMO,l.bode_cod, L.lote_saldo,l.lote_costo, ARTI_PESO/1000
      FROM ARTICULO A, LOTES l, TARIFA_IVA T
      WHERE A.ARTI_COD >= '0' AND A.ARTI_COD <= 'zz' AND ARTI_DES >= '' AND ARTI_DES <= 'zz' AND ESAR_COD <> 'I' AND A.TAIV_COD = T.TAIV_COD and a.arti_cod = l.arti_cod
      INTO :CODIGO, :NOMBRE, :UNIDAD, :EXIST, :IVA, :CODGRUPO, :CODSUBG, :CODMARC, :LOTE, :NOMBOD, :CONSUMO, :codbod, :cant, :costo_lote, :pesounit
      DO
        BEGIN
        OK = 'N';
        if (AGRUPA = 'G') then
            BEGIN
            if ((CODGRUPO >= GRPINI) AND (CODGRUPO <= GRPFIN)) then
                OK = 'S';
            end
        ELSE
            if (AGRUPA = 'M') then
                BEGIN
                if ((CODMARC >= GRPINI) AND (CODMARC <= GRPFIN)) then
                    OK = 'S';
                END
        if (OK = 'S') then
            BEGIN
            NOMGRUPO = '';
            NOMMARC = '';
            NOMSUBG = '';
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            SELECT MAX(COBA_COD) FROM BARRAS_ARTICULO WHERE ARTI_COD = :codigo AND COBA_UNIDAD = :unidad INTO :codbar;
            if (CODBAR IS NULL) then
                CODBAR = CODIGO;

            if (EXIST <> 'N') then
                BEGIN
                EXECUTE PROCEDURE COSTO_PROMEDIO_UNIDAD(CODIGO, FECHA, UNIDAD) returning_values (COSTO);
                EXECUTE PROCEDURE ULTIMO_COSTO(CODIGO, FECHA, UNIDAD) returning_values (ULTCOSTO);
                SELECT MAX(MVAR_FECHA) FROM MOVIMIENTO_ARTICULO WHERE ARTI_COD = :CODIGO AND MVAR_ENTRADA = 'S' AND MVAR_FECHA <= :FECHA INTO :FECHACOSTO;
                COSTOTOT = :CANT * :COSTO;
                CONSUMO = CONSUMO * CANT;
                if (RESERVA = 'S') then
                    BEGIN
                    SELECT SUM(ORID_ENTREGAR)
                        FROM ORDENINVENTARIO_DETALLE OD, ordenes_inventario O
                        WHERE O.ORIN_ID = OD.ORIN_ID AND ARTI_COD = :CODIGO AND ORIN_FECHA <= :FECHA AND ORIN_FECLLEGA >= :FECHA AND ORID_ANULADO = 'N'
                        INTO :ORDENADO;
                    if (ORDENADO IS NULL) then
                        ORDENADO = 0;
                    ORDENC = 0;
                    FOR SELECT O.ORDC_ID, OCDE_ITEM, OCDE_CANT * OCDE_FACTOR
                        FROM ORDENES_COMPRA O, ORDENES_COMPRA_DETALLE OD
                        WHERE O.ORDC_ID = OD.ORDC_ID AND OD.ARTI_COD = :CODIGO AND ORDC_VENCE >= :FECHA AND ORDC_FECHA <= :FECHA AND OCDE_ANULADO = 'N'
                        INTO :ID, :ITEM, :CANT2
                        do
                        BEGIN
                        EXECUTE PROCEDURE FALTANTE(23, 21, ID, ITEM) returning_values (PEDIDO, UND, FACTOR);
                        if (PEDIDO * FACTOR = CANT2) then /* SI NO SE HA FACTURADO MIRE A VER SI SE REMISIONO */
                            EXECUTE PROCEDURE FALTANTE(23, 22, ID, ITEM) returning_values (PEDIDO, UND, FACTOR);
                        if (PEDIDO IS NULL) then
                            PEDIDO = 0;
                        ORDENC = ORDENC + PEDIDO * FACTOR;
                        END
                    ORDENADO = ORDENADO + ORDENC;
                    SELECT SUM(RSDE_LIBERAR)
                        FROM RESERVAS_DETALLE RD, RESERVAS R
                        WHERE R.RESE_ID = RD.RESE_ID AND ARTI_COD = :CODIGO AND RESE_FECHA <= :FECHA AND RESE_VENCE >= :FECHA AND RSDE_ANULADO = 'N'
                        INTO :RESERVADO;
                    if (RESERVADO IS NULL) then
                        RESERVADO = 0;
                    PEDIDO = 0;
                    FOR SELECT P.PEDI_ID, PEDE_ITEM, PEDE_CANT * PEDE_FACTOR
                        FROM PEDIDOS P, PEDIDOS_DETALLE PD
                        WHERE P.PEDI_ID = PD.PEDI_ID AND PD.ARTI_COD = :CODIGO AND PEDI_VENCE >= :FECHA AND PEDI_FECHA <= :FECHA AND PEDE_ANULADO = 'N'
                        INTO :ID, :ITEM, :CANT2
                        do
                        BEGIN
                        EXECUTE PROCEDURE FALTANTE(34, 31, ID, ITEM) returning_values (ORDENC, UND, FACTOR);
                        if ((ORDENC * FACTOR = CANT2) or (PEDAUTO = 'SI')) then /* SI NO SE HA FACTURADO MIRE A VER SI SE REMISIONO */
                            EXECUTE PROCEDURE FALTANTE(34, 32, ID, ITEM) returning_values (ORDENC, UND, FACTOR);
                        if (ORDENC IS NULL) then
                            ORDENC = 0;
                        PEDIDO = PEDIDO + ORDENC * FACTOR;
                        END
                    RESERVADO = RESERVADO + PEDIDO;
                    END
                ELSE
                    BEGIN
                    RESERVADO = 0;
                    ORDENADO = 0;
                    END
                if (LISTA > 0) then
                    SELECT prar_fijo FROM precios_articulo WHERE arti_cod = :CODIGO and lipr_cod = :LISTA INTO :PRECIO;
                if (ENPESO = 'S') then
                    BEGIN
                    if (pesounit IS NULL) then
                        pesounit = 0;
                    if (PESOUNIT <> 0) then
                        BEGIN
                        pesototal = PESOUNIT * cant;
                        SUSPEND;
                        END
                    END
                ELSE
                    SUSPEND;
                END
            END
        END
  end
if (DETALLE = 'N') then
  BEGIN
  FOR SELECT ARTI_COD, ARTI_DES, ARTI_UNIDAD, ARTI_EXIST, TAIV_PORC, A.GRUP_COD, A.SUBG_COD, A.MARC_COD, ARTI_CONSUMO, ARTI_PESO/1000
      FROM ARTICULO A, TARIFA_IVA T
      WHERE ARTI_COD >= :CODINI AND ARTI_COD <= :CODFIN AND ARTI_DES >= :DESINI AND ARTI_DES <= :DESFIN AND ESAR_COD <> 'I' AND A.TAIV_COD = T.TAIV_COD
      INTO :CODIGO, :NOMBRE, :UNIDAD, :EXIST, :IVA, :CODGRUPO, :CODSUBG, :CODMARC, :CONSUMO, :pesounit
      DO
        BEGIN
        OK = 'N';
        if (AGRUPA = 'G') then
            BEGIN
            if ((GRPINI = '0') AND (GRPFIN = 'zz')) then
                OK = 'S';
            else
                if ((CODGRUPO >= GRPINI) AND (CODGRUPO <= GRPFIN)) then
                    OK = 'S';
            end
        ELSE
            if (AGRUPA = 'M') then
                BEGIN
                if ((GRPINI = '0') AND (GRPFIN = 'zzz')) then
                    OK = 'S';
                else
                    if ((CODMARC >= GRPINI) AND (CODMARC <= GRPFIN)) then
                        OK = 'S';
                END
        if (OK = 'S') then
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            SELECT MAX(COBA_COD) FROM BARRAS_ARTICULO WHERE ARTI_COD = :codigo AND COBA_UNIDAD = :unidad INTO :codbar;
            if (CODBAR IS NULL) then
                CODBAR = CODIGO;

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

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

SET TERM ; ^

/* 20090530 */
/* 20090530 */
/* NO INICIALIZABA LA META */

CREATE TABLE PRESUPUESTO_VENTAS_GRUPO (
    VEND_COD   INTEGER NOT NULL,
    GRUP_COD   VARCHAR(2) CHARACTER SET NONE NOT NULL,
    SUBG_COD   VARCHAR(3) CHARACTER SET NONE NOT NULL,
    PRVG_ANO   CHAR(4) CHARACTER SET NONE NOT NULL,
    PRVG_MES   INTEGER NOT NULL,
    PRVG_META  T_CANTIDAD
);

ALTER TABLE PRESUPUESTO_VENTAS_GRUPO ADD CONSTRAINT PK_PRESUPUESTO_VENTAS_GRUPO PRIMARY KEY (VEND_COD, GRUP_COD, SUBG_COD, PRVG_ANO, PRVG_MES);

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

SET TERM ^ ;

CREATE PROCEDURE REP_GRUPOS_VENDEDOR(
    DESDE VARCHAR(20),
    HASTA VARCHAR(20),
    FECINI DATE,
    FECFIN DATE,
    GRPINI VARCHAR(2),
    GRPFIN VARCHAR(2),
    SUBINI VARCHAR(3),
    SUBFIN VARCHAR(3),
    CEROS CHAR(1),
    SUBEMPRESA INTEGER)
RETURNS (
    CODVEND VARCHAR(20),
    NOMVEND VARCHAR(60),
    CODGRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    CODSUBG VARCHAR(3),
    NOMSUBG VARCHAR(30),
    UNIDADES NUMERIC(18,4),
    CAJAS NUMERIC(18,4),
    BASE NUMERIC(18,2),
    META NUMERIC(18,4),
    PORC NUMERIC(9,2))
AS
declare variable ARTIC VARCHAR(20);
declare variable CANTAUX NUMERIC(18,4);
declare variable FACTOR NUMERIC(18,4);
declare variable CAJASA NUMERIC(18,4);
declare variable UNIDADESA NUMERIC(18,4);
declare variable ANO INTEGER;
declare variable MES INTEGER;
BEGIN
FOR SELECT MAX(VEND_COD), SUM((FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO)*FACT_FACTOR),
    MAX(GRUP_COD), MAX(SUBG_COD)
    FROM FACTURAS_DETALLE D, FACTURAS F, PREFIJOS P, ARTICULO A
    WHERE F.FACT_ID = D.FACT_ID AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND D.ARTI_COD = A.arti_cod AND
    VEND_COD >= :DESDE AND VEND_COD <= :HASTA AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND
    A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND A.subg_cod >= :SUBINI AND A.subg_cod <= :subfin AND
    FACT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) and substring(a.arti_cod from 1 FOR 2) <> '.t'
    GROUP BY VEND_COD, A.grup_cod, A.subg_cod
    INTO :CODVEND, :BASE, :CODGRUPO, :CODSUBG
    DO
    BEGIN
    CAJAS = 0;
    UNIDADES = 0;
    FOR SELECT SUM(FADE_CANT * FADE_FACTOR), MAX(d.arti_cod)
        FROM FACTURAS_DETALLE D, FACTURAS F, PREFIJOS P, ARTICULO A
        WHERE F.FACT_ID = D.FACT_ID AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND D.ARTI_COD = A.arti_cod AND
        VEND_COD = :codvend AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND
        A.GRUP_COD = :codgrupo AND A.subg_cod = :codsubg AND FACT_ANULADO = 'N' AND 
        ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) and substring(a.arti_cod from 1 FOR 2) <> '.t'
        GROUP BY A.arti_cod
        INTO :cantaux, :artic
        DO
        BEGIN
        FACTOR = 1;
        select max(unar_faccan) from unidad_articulo where arti_cod = :artic into :factor;
        if (factor IS NULL) then
            factor = 1;
        cajasa = floor(cantaux / factor);
        unidadesa = cantaux - cajasa * factor;
        CAJAS = CAJAS + CAJASA;
        UNIDADES = UNIDADES + UNIDADESA;
        END
    if (BASE IS NULL) then
        BASE = 0;
    select VEND_NOMBRE from VENDEDORES where VEND_COD = :CODVEND INTO :NOMVEND;
    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
    /* EL PRESUPUESTO */
    ANO = EXTRACT(YEAR FROM (:fecfin));
    MES = EXTRACT(MONTH FROM (:fecfin));
    META = 0;
    SELECT PRVG_META FROM presupuesto_ventas_grupo WHERE VEND_COD = :codvend AND GRUP_COD = :codgrupo AND SUBG_COD = :codsubg AND
        PRVG_ANO = :ANO AND PRVG_MES = :MES INTO :META;
    if (META IS NULL) then
        META = 0;
    if (META <> 0) then
        PORC = CAJAS * 100 / META;
    else
        PORC = 0;
    if (CEROS = 'S') then
        SUSPEND;
    ELSE
        if ((BASE <> 0) OR (cajas <> 0) or (unidades <> 0) ) then
            SUSPEND;
    END /* FOR */
END
^

SET TERM ; ^


/* 20090531 */
/* NO INICIALIZABA LA META */
SET TERM ^ ;

CREATE or ALTER PROCEDURE REP_PRESUPUESTO_GRUPOS(
    ANO CHAR(4),
    GRPINI VARCHAR(2),
    GRPFIN VARCHAR(2))
RETURNS (
    CODGRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    CODSUBG VARCHAR(3),
    NOMSUBG VARCHAR(30),
    MES INTEGER,
    META NUMERIC(18,4),
    PORC NUMERIC(9,2))
AS
declare variable ARTIC VARCHAR(20);
declare variable CANTAUX NUMERIC(18,4);
declare variable FACTOR NUMERIC(18,4);
declare variable CAJASA NUMERIC(18,4);
declare variable UNIDADESA NUMERIC(18,4);
BEGIN
FOR SELECT GRUP_COD, SUBG_COD FROM subgrupo WHERE GRUP_COD >= :GRPINI AND GRUP_COD <= :GRPFIN INTO :CODGRUPO, :CODSUBG
    DO
    FOR SELECT SUM(PRVG_META) FROM presupuesto_ventas_grupo WHERE GRUP_COD = :codgrupo AND SUBG_COD = :codsubg AND
        PRVG_ANO = :ANO GROUP BY PRVG_MES INTO :META
        DO
        BEGIN
        if (META IS NULL) then
            META = 0;
        SUSPEND;
        END
END
^

SET TERM ; ^

grant EXECUTE on PROCEDURE rep_presupuesto_grupos to PUBLIC;


/* 20090601 */
/* al aplicar la proporcion no incluia el consumo */
SET TERM ^ ;

CREATE OR ALTER PROCEDURE IMPUESTOS_VENTAS(
    FECINI DATE,
    FECFIN DATE,
    PREFIJO VARCHAR(4),
    PTOINI INTEGER,
    PTOFIN INTEGER,
    ANULADOS CHAR(1),
    SUBEMPRESA INTEGER)
RETURNS (
    TIPO INTEGER,
    NOMTIPO VARCHAR(30),
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    NIT VARCHAR(20),
    NOMTERCERO VARCHAR(60),
    SUBTOTAL NUMERIC(18,2),
    DTOMONTO NUMERIC(18,2),
    ADICIONAL NUMERIC(18,2),
    IVAMONTO NUMERIC(18,2),
    CONSUMO NUMERIC(18,2),
    EXENTOS NUMERIC(18,2),
    GRAVADOS1 NUMERIC(18,2),
    GRAVADOS2 NUMERIC(18,2),
    GRAVADOS3 NUMERIC(18,2),
    IVA1 NUMERIC(18,2),
    IVA2 NUMERIC(18,2),
    IVA3 NUMERIC(18,2),
    EXTRA NUMERIC(18,2),
    TOTAL NUMERIC(18,2),
    RTFTEMONTO NUMERIC(18,2),
    RTIVAMONTO NUMERIC(18,2),
    RTICAMONTO 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 NUMERIC(18,4);
declare variable NUEVO NUMERIC(18,2);
BEGIN
/* FACTURA */
TIPO = 31;
SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 31 INTO :NOMTIPO;

FOR SELECT FACT_ID, F.PREF_PRE, FACT_NUMERO, FACT_FECHA, TERC_NIT, FACT_NOMCLIENTE, FACT_ADICIONAL-FACT_DTOMONTO, FACT_IVAMONTO, FACT_RTFTEMONTO, FACT_RTIVAMONTO, FACT_RTICAMONTO, FACT_EXTRA, FACT_TOTAL, FACT_ANULADO
    FROM FACTURAS F, PREFIJOS PR WHERE PTVT_ID >= :PTOINI AND PTVT_ID <= :PTOFIN AND
    FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND ((:PREFIJO = '') or (:PREFIJO IS NULL) or (F.PREF_PRE = :PREFIJO))
    AND PR.PREF_PRE = F.PREF_PRE AND PR.TIDO_COD = 31 AND ((PR.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
    ORDER BY FACT_FECHA, F.PREF_PRE, FACT_NUMERO
    INTO :ID, :PREF, :NUMERO, :FECHA, :NIT, :NOMTERCERO, :DTOMONTO, :IVAMONTO, :RTFTEMONTO, :RTIVAMONTO, :RTICAMONTO, :EXTRA, :TOTAL, :ANULADO
    DO
    BEGIN
    SELECT TERC_EXENTO FROM TERCEROS WHERE TERC_NIT = :NIT INTO :TER_EXENTO;
    if ((ANULADOS = 'S') or (ANULADO = 'N')) then
        BEGIN
        if (ANULADO = 'S') then
            BEGIN
            EXENTOS = 0;
            GRAVADOS1 = 0;
            GRAVADOS2 = 0;
            GRAVADOS3 = 0;
            CONSUMO = 0;
            SUBTOTAL = 0;
            TOTAL = 0;
            EXTRA = 0;
            IVAMONTO = 0;
            DTOMONTO = 0;
            NETO = 0;
            RTFTEMONTO = 0;
            RTIVAMONTO = 0;
            RTICAMONTO = 0;
            END
        else
            BEGIN
            /* CALCULE LAS DIFERENTES TARIFAS */
            if (TER_EXENTO = 'S') then
                BEGIN
                SELECT SUM(FADE_TOTAL - FADE_IVAMONTO - FADE_CONSUMO) FROM FACTURAS_DETALLE D WHERE FACT_ID = :ID AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL)) INTO :EXENTOS;
                GRAVADOS1 = 0;
                GRAVADOS2 = 0;
                GRAVADOS3 = 0;
                end
            else
                begin
                SELECT SUM(FADE_TOTAL - FADE_IVAMONTO - FADE_CONSUMO) FROM FACTURAS_DETALLE D WHERE FACT_ID = :ID AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL)) AND FADE_IVAPORC = 0 INTO :EXENTOS;
                SELECT SUM(FADE_TOTAL - FADE_IVAMONTO - FADE_CONSUMO), SUM(FADE_IVAMONTO) FROM FACTURAS_DETALLE D, TARIFA_IVA T WHERE FACT_ID = :ID AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL)) AND FADE_IVAPORC = TAIV_PORC AND TAIV_COD = 1 INTO :GRAVADOS1, :IVA1;
                SELECT SUM(FADE_TOTAL - FADE_IVAMONTO - FADE_CONSUMO), SUM(FADE_IVAMONTO) FROM FACTURAS_DETALLE D, TARIFA_IVA T WHERE FACT_ID = :ID AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL)) AND FADE_IVAPORC = TAIV_PORC AND TAIV_COD = 2 INTO :GRAVADOS2, :IVA2;
                SELECT SUM(FADE_TOTAL - FADE_IVAMONTO - FADE_CONSUMO), SUM(FADE_IVAMONTO) FROM FACTURAS_DETALLE D, TARIFA_IVA T WHERE FACT_ID = :ID AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL)) AND FADE_IVAPORC = TAIV_PORC AND TAIV_COD = 3 INTO :GRAVADOS3, :IVA3;
                end
            if (iva1 is null) then
                iva1 = 0;
            if (iva2 is null) then
                iva2 = 0;
            if (iva3 is null) then
                iva3 = 0;
            IVAMONTO = IVA1 + IVA2 + IVA3;
            SELECT SUM(FADE_CONSUMO) FROM FACTURAS_DETALLE WHERE FACT_ID = :ID AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL)) INTO :CONSUMO;
            SUBTOTAL = TOTAL - EXTRA - IVAMONTO - DTOMONTO;
            NETO = TOTAL - RTFTEMONTO - RTIVAMONTO - RTICAMONTO;
            END
        if (exentos is null) then
            exentos = 0;
        if (gravados1 is null) then
            gravados1 = 0;
        if (gravados2 is null) then
            gravados2 = 0;
        if (gravados3 is null) then
            gravados3 = 0;
        if (consumo is null) then
            consumo = 0;
        FACTOR = 1;
        SELECT AJCI_FACTOR FROM ajuste_cierre WHERE AJCI_PORC = 0 AND AJCI_FECINI <= :FECHA AND AJCI_FECFIN >= :FECHA INTO :FACTOR;
        if (FACTOR IS null) then
            FACTOR = 1;
        EXENTOS = EXENTOS * FACTOR;
        ivamonto = 0;
        FACTOR = 1;
        SELECT AJCI_FACTOR FROM ajuste_cierre WHERE AJCI_PORC = 16 AND AJCI_FECINI <= :FECHA AND AJCI_FECFIN >= :FECHA INTO :FACTOR;
        if (FACTOR IS null) then
            FACTOR = 1;
        gravados1 = GRAVADOS1 * FACTOR;
        IVA1 = IVA1 * FACTOR;
        ivamonto = ivamonto + IVA1;
        FACTOR = 1;
        SELECT AJCI_FACTOR FROM ajuste_cierre WHERE AJCI_PORC = 10 AND AJCI_FECINI <= :FECHA AND AJCI_FECFIN >= :FECHA INTO :FACTOR;
        if (FACTOR IS null) then
            FACTOR = 1;
        gravados2 = GRAVADOS2 * FACTOR;
        IVA2 = IVA2 * FACTOR;
        ivamonto = ivamonto + IVA2;
        FACTOR = 1;
        SELECT AJCI_FACTOR FROM ajuste_cierre WHERE AJCI_PORC = 7 AND AJCI_FECINI <= :FECHA AND AJCI_FECFIN >= :FECHA INTO :FACTOR;
        if (FACTOR IS null) then
            FACTOR = 1;
        gravados3 = GRAVADOS3 * FACTOR;
        IVA3 = IVA3 * FACTOR;
        ivamonto = ivamonto + IVA3;
        NUEVO = exentos + gravados1 + gravados2 + gravados3;
        if (TOTAL <> 0) then
            BEGIN
            CONSUMO = CONSUMO * (NUEVO+ivamonto+consumo) / TOTAL;
            SUBTOTAL = SUBTOTAL * (NUEVO+ivamonto+consumo) / TOTAL;
            NETO = NETO * (NUEVO+ivamonto+consumo) / TOTAL;
            rtftemonto = rtftemonto * (NUEVO+ivamonto+consumo) / TOTAL;
            rticamonto = rticamonto * (NUEVO+ivamonto+consumo) / TOTAL;
            rtivamonto = rtivamonto * (NUEVO+ivamonto+consumo) / TOTAL;
            dtomonto = dtomonto * (NUEVO+ivamonto+consumo) / TOTAL;
            adicional = adicional * (NUEVO+ivamonto+consumo) / TOTAL;
            total = total * (NUEVO+ivamonto+consumo) / TOTAL;
            END
        SUSPEND;
        END
    END
    
TIPO = 33;
SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 33 INTO :NOMTIPO;
/* DEVOLUCIONES */
FOR SELECT DEVT_ID, D.PREF_PRE, DEVT_NUMERO, DEVT_FECHA, TERC_NIT, DEVT_NOMTERC, DEVT_ADICIONAL-DEVT_DTOMONTO, DEVT_IVAMONTO, DEVT_RTFTEMONTO, DEVT_RTIVAMONTO, DEVT_RTICAMONTO, DEVT_EXTRA, DEVT_TOTAL, DEVT_ANULADO
    FROM DEVOLUCIONES_VENTAS D, PREFIJOS PR WHERE PTVT_ID >= :PTOINI AND PTVT_ID <= :PTOFIN AND
    DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND ((:PREFIJO = '') or (:PREFIJO IS NULL) or (D.PREF_PRE = :PREFIJO))
    AND PR.PREF_PRE = D.PREF_PRE AND PR.TIDO_COD = 33 AND ((PR.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) AND ((DEVT_REMID = 0) or (DEVT_REMID IS NULL))
    ORDER BY DEVT_FECHA, D.PREF_PRE, DEVT_NUMERO
    INTO :ID, :PREF, :NUMERO, :FECHA, :NIT, :NOMTERCERO, :DTOMONTO, :IVAMONTO, :RTFTEMONTO, :RTIVAMONTO, :RTICAMONTO, :EXTRA, :TOTAL, :ANULADO
    DO
    BEGIN
    SELECT TERC_EXENTO FROM TERCEROS WHERE TERC_NIT = :NIT INTO :TER_EXENTO;
    if ((ANULADOS = 'S') or (ANULADO = 'N')) then
        BEGIN
        if (ANULADO = 'S') then
            BEGIN
            EXENTOS = 0;
            GRAVADOS1 = 0;
            GRAVADOS2 = 0;
            GRAVADOS3 = 0;
            CONSUMO = 0;
            SUBTOTAL = 0;
            TOTAL = 0;
            EXTRA = 0;
            IVAMONTO = 0;
            DTOMONTO = 0;
            NETO = 0;
            RTFTEMONTO = 0;
            RTIVAMONTO = 0;
            RTICAMONTO = 0;
            END
        else
            BEGIN
            DTOMONTO = DTOMONTO * -1;
            ADICIONAL = ADICIONAL * -1;
            IVAMONTO = IVAMONTO * -1;
            EXTRA = EXTRA * -1;
            TOTAL = TOTAL * -1;
            RTFTEMONTO = RTFTEMONTO * -1;
            RTIVAMONTO = RTIVAMONTO * -1;
            RTICAMONTO = RTICAMONTO * -1;
            /* CALCULE LAS DIFERENTES TARIFAS */
            if (TER_EXENTO = 'S') then
             BEGIN
              SELECT SUM(DVDE_TOTAL - DVDE_IVAMONTO - DVDE_CONSUMO) FROM DEVOLUCIONES_VENTAS_DETALLE D WHERE DEVT_ID = :ID AND DVDE_REFERENCIA <> '.t' INTO :EXENTOS;
              GRAVADOS1 = 0;
              GRAVADOS2 = 0;
              GRAVADOS3 = 0;
             end
            else
             begin
              SELECT SUM(DVDE_TOTAL - DVDE_IVAMONTO - DVDE_CONSUMO) FROM DEVOLUCIONES_VENTAS_DETALLE D WHERE DEVT_ID = :ID AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL)) AND DVDE_IVAPORC = 0 INTO :EXENTOS;
              SELECT SUM(DVDE_TOTAL - DVDE_IVAMONTO - DVDE_CONSUMO), SUM(DVDE_IVAMONTO) FROM DEVOLUCIONES_VENTAS_DETALLE D, TARIFA_IVA T WHERE DEVT_ID = :ID AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL)) AND DVDE_IVAPORC = TAIV_PORC AND TAIV_COD = 1 INTO :GRAVADOS1, :IVA1;
              SELECT SUM(DVDE_TOTAL - DVDE_IVAMONTO - DVDE_CONSUMO), SUM(DVDE_IVAMONTO) FROM DEVOLUCIONES_VENTAS_DETALLE D, TARIFA_IVA T WHERE DEVT_ID = :ID AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL)) AND DVDE_IVAPORC = TAIV_PORC AND TAIV_COD = 2 INTO :GRAVADOS2, :IVA2;
              SELECT SUM(DVDE_TOTAL - DVDE_IVAMONTO - DVDE_CONSUMO), SUM(DVDE_IVAMONTO) FROM DEVOLUCIONES_VENTAS_DETALLE D, TARIFA_IVA T WHERE DEVT_ID = :ID AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL)) AND DVDE_IVAPORC = TAIV_PORC AND TAIV_COD = 3 INTO :GRAVADOS3, :IVA3;
             end
            if (iva1 is null) then
                iva1 = 0;
            if (iva2 is null) then
                iva2 = 0;
            if (iva3 is null) then
                iva3 = 0;
            IVAMONTO = IVA1 + IVA2 + IVA3;
            SELECT SUM(DVDE_CONSUMO) FROM DEVOLUCIONES_VENTAS_DETALLE WHERE DEVT_ID = :ID AND DVDE_REFERENCIA <> '.t' INTO :CONSUMO;
            EXENTOS = EXENTOS * -1;
            GRAVADOS1 = GRAVADOS1 * -1;
            GRAVADOS2 = GRAVADOS2 * -1;
            GRAVADOS3 = GRAVADOS3 * -1;
            CONSUMO = CONSUMO * -1;
            IVA1 = IVA1 * -1;
            IVA2 = IVA2 * -1;
            IVA3 = IVA3 * -1;
            IVAMONTO = IVAMONTO * -1;
            SUBTOTAL = TOTAL - EXTRA - IVAMONTO - DTOMONTO;
            NETO = TOTAL - RTFTEMONTO - RTIVAMONTO - RTICAMONTO;
            END
        if (exentos is null) then
            exentos = 0;
        if (gravados1 is null) then
            gravados1 = 0;
        if (gravados2 is null) then
            gravados2 = 0;
        if (gravados3 is null) then
            gravados3 = 0;
        if (consumo is null) then
            consumo = 0;
        FACTOR = 1;
        SELECT AJCI_FACTOR FROM ajuste_cierre WHERE AJCI_PORC = 0 AND AJCI_FECINI <= :FECHA AND AJCI_FECFIN >= :FECHA INTO :FACTOR;
        if (FACTOR IS null) then
            FACTOR = 1;
        EXENTOS = EXENTOS * FACTOR;
        ivamonto = 0;
        FACTOR = 1;
        SELECT AJCI_FACTOR FROM ajuste_cierre WHERE AJCI_PORC = 16 AND AJCI_FECINI <= :FECHA AND AJCI_FECFIN >= :FECHA INTO :FACTOR;
        if (FACTOR IS null) then
            FACTOR = 1;
        gravados1 = GRAVADOS1 * FACTOR;
        IVA1 = IVA1 * FACTOR;
        ivamonto = ivamonto + IVA1;
        FACTOR = 1;
        SELECT AJCI_FACTOR FROM ajuste_cierre WHERE AJCI_PORC = 10 AND AJCI_FECINI <= :FECHA AND AJCI_FECFIN >= :FECHA INTO :FACTOR;
        if (FACTOR IS null) then
            FACTOR = 1;
        gravados2 = GRAVADOS2 * FACTOR;
        IVA2 = IVA2 * FACTOR;
        ivamonto = ivamonto + IVA2;
        FACTOR = 1;
        SELECT AJCI_FACTOR FROM ajuste_cierre WHERE AJCI_PORC = 7 AND AJCI_FECINI <= :FECHA AND AJCI_FECFIN >= :FECHA INTO :FACTOR;
        if (FACTOR IS null) then
            FACTOR = 1;
        gravados3 = GRAVADOS3 * FACTOR;
        IVA3 = IVA3 * FACTOR;
        ivamonto = ivamonto + IVA3;
        NUEVO = exentos + gravados1 + gravados2 + gravados3;
        if (TOTAL <> 0) then
            BEGIN
            CONSUMO = CONSUMO * (NUEVO+ivamonto+consumo) / TOTAL;
            SUBTOTAL = SUBTOTAL * (NUEVO+ivamonto+consumo) / TOTAL;
            NETO = NETO * (NUEVO+ivamonto+consumo) / TOTAL;
            rtftemonto = rtftemonto * (NUEVO+ivamonto+consumo) / TOTAL;
            rticamonto = rticamonto * (NUEVO+ivamonto+consumo) / TOTAL;
            rtivamonto = rtivamonto * (NUEVO+ivamonto+consumo) / TOTAL;
            dtomonto = dtomonto * (NUEVO+ivamonto+consumo) / TOTAL;
            adicional = adicional * (NUEVO+ivamonto+consumo) / TOTAL;
            total = total * (NUEVO+ivamonto+consumo) / TOTAL;
            END
        SUSPEND;
        END
    END
execute procedure lee_configuracion ('FACTURACION', 'DOCUMENTOS', 'INCLUIR NOTAS DE CARTERA EN REPORTE DE IMPUESTOS EN VENTAS') returning_values (:NOTAS);
if (NOTAS = 'SI') then
    BEGIN
    TIPO = 41;
    SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 41 INTO :NOMTIPO;
    FOR SELECT NDCL_ID, N.PREF_PRE, NDCL_NUMERO, NDCL_FECHA, N.TERC_NIT, TERC_NOM, 0, NDCL_IVAMONTO, NDCL_RTFTEMONTO, NDCL_RTIVAMONTO, NDCL_RTICAMONTO, 0, NDCL_MONTO+NDCL_IVAMONTO, NDCL_ANULADO
        FROM NOTAS_DEBITO_CLIENTES N, TERCEROS T, PREFIJOS PR WHERE N.TERC_NIT = T.TERC_NIT AND
        NDCL_FECHA >= :FECINI AND NDCL_FECHA <= :FECFIN AND ((:PREFIJO = '') or (:PREFIJO IS NULL) or (N.PREF_PRE = :PREFIJO))
        AND PR.PREF_PRE = N.PREF_PRE AND PR.TIDO_COD = 41 AND ((PR.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
        ORDER BY NDCL_FECHA, N.PREF_PRE, NDCL_NUMERO
        INTO :ID, :PREF, :NUMERO, :FECHA, :NIT, :NOMTERCERO, :DTOMONTO, :IVAMONTO, :RTFTEMONTO, :RTIVAMONTO, :RTICAMONTO, :EXTRA, :TOTAL, :ANULADO
        DO
        BEGIN
        GRAVADOS2 = 0;
        GRAVADOS3 = 0;
        IVA2 = 0;
        IVA3 = 0;
        CONSUMO = 0;
        if (ANULADO = 'S') then
            BEGIN
            EXENTOS = 0;
            GRAVADOS1 = 0;
            SUBTOTAL = 0;
            TOTAL = 0;
            EXTRA = 0;
            IVAMONTO = 0;
            DTOMONTO = 0;
            NETO = 0;
            RTFTEMONTO = 0;
            RTIVAMONTO = 0;
            RTICAMONTO = 0;
            END
        ELSE
            BEGIN
            if (IVAMONTO <> 0) then
                BEGIN
                GRAVADOS1 = TOTAL-IVAMONTO;
                IVA1 = IVAMONTO;
                exentos = 0;
                END
            ELSE
                BEGIN
                GRAVADOS1 = 0;
                IVA1 = 0;
                exentos = TOTAL;
                END
            SUBTOTAL = TOTAL - EXTRA - IVAMONTO - DTOMONTO;
            NETO = TOTAL - RTFTEMONTO - RTIVAMONTO - RTICAMONTO;
            END
        SUSPEND;
        END

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

SET TERM ; ^



/* 20090601b */
/* grabe la base en Mayusculas */
SET TERM ^ ;

create trigger INTERFAZ_BANCOS_CTAS_BI for INTERFAZ_BANCOS_CTAS
active BEFORE INSERT position 0
as
begin
NEW.inbc_base = UPPER(NEW.inbc_base);
end
^

SET TERM ; ^

SET TERM ^ ;

create trigger INTERFAZ_BANCOS_CTAS_BU for INTERFAZ_BANCOS_CTAS
active BEFORE UPDATE position 0
as
begin
NEW.inbc_base = UPPER(NEW.inbc_base);
end
^

SET TERM ; ^

SET TERM ^ ;

create trigger INTERFAZ_CAJA_CTAS_BI for INTERFAZ_CAJA_CTAS
active BEFORE INSERT position 0
as
begin
new.injc_base = upper(new.injc_base);
end
^

SET TERM ; ^


SET TERM ^ ;

create trigger INTERFAZ_CAJA_CTAS_BU for INTERFAZ_CAJA_CTAS
active BEFORE UPDATE position 0
as
begin
new.injc_base = upper(new.injc_base);
end
^

SET TERM ; ^

SET TERM ^ ;

create trigger INTERFAZ_CARTERA_CTAS_BI for INTERFAZ_CARTERA_CTAS
active BEFORE INSERT position 0
as
begin
new.incd_base = upper(new.incd_base);
end
^

SET TERM ; ^

SET TERM ^ ;

create trigger INTERFAZ_CARTERA_CTAS_BU for INTERFAZ_CARTERA_CTAS
active BEFORE UPDATE position 0
as
begin
new.incd_base = upper(new.incd_base);
end
^

SET TERM ; ^

SET TERM ^ ;

create trigger INTERFAZ_COMPRAS_CTAS_BI for INTERFAZ_COMPRAS_CTAS
active BEFORE INSERT position 0
as
begin
new.incc_base = upper(new.incc_base);
end
^

SET TERM ; ^

SET TERM ^ ;

create trigger INTERFAZ_COMPRAS_CTAS_BU for INTERFAZ_COMPRAS_CTAS
active BEFORE UPDATE position 0
as
begin
new.incc_base = upper(new.incc_base);
end
^

SET TERM ; ^

SET TERM ^ ;

create trigger INTERFAZ_CXPAGAR_CTAS_BI for INTERFAZ_CXPAGAR_CTAS
active BEFORE INSERT position 0
as
begin
new.inpc_base = upper(new.inpc_base);
end
^

SET TERM ; ^

SET TERM ^ ;

create trigger INTERFAZ_CXPAGAR_CTAS_BU for INTERFAZ_CXPAGAR_CTAS
active BEFORE UPDATE position 0
as
begin
new.inpc_base = upper(new.inpc_base);
end
^

SET TERM ; ^

SET TERM ^ ;

create trigger INTERFAZ_INVENTARIO_CTAS_BI for INTERFAZ_INVENTARIO_CTAS
active BEFORE INSERT position 0
as
begin
new.inic_base = upper(new.inic_base);
end
^

SET TERM ; ^

SET TERM ^ ;

create trigger INTERFAZ_INVENTARIO_CTAS_BU for INTERFAZ_INVENTARIO_CTAS
active BEFORE UPDATE position 0
as
begin
new.inic_base = upper(new.inic_base);
end
^

SET TERM ; ^

SET TERM ^ ;

create trigger INTERFAZ_VENTAS_CTAS_BI for INTERFAZ_VENTAS_CTAS
active BEFORE INSERT position 0
as
begin
new.invc_base = upper(new.invc_base);
end
^

SET TERM ; ^

SET TERM ^ ;

create trigger INTERFAZ_VENTAS_CTAS_BU for INTERFAZ_VENTAS_CTAS
active BEFORE UPDATE position 0
as
begin
new.invc_base = upper(new.invc_base);
end
^

SET TERM ; ^


/* 20090602 */

INSERT INTO CONFIGURACION (CONF_MODULO, CONF_CATEGORIA, CONF_PROPIEDAD, CONF_VALOR, CONF_POSIBLES, CONF_AYUDA) VALUES ('INVENTARIO', 'AJUSTES', 'TRAER AUTOMATICAMENTE LOS ARTICULOS DEL STAND', 'SI', 'SI,NO', 'SI: Al hacer conteo por stand se traen automáticamente los artículos con esa ubicación para digitar solamente las cantidades contadas.');

INSERT INTO CONFIGURACION (CONF_MODULO, CONF_CATEGORIA, CONF_PROPIEDAD, CONF_VALOR, CONF_POSIBLES, CONF_AYUDA) VALUES ('INVENTARIO', 'AJUSTES', 'VER EXISTENCIA DE ARTICULOS DESDE LOS AJUSTES', 'SI', 'SI,NO', 'SI: Permite ver los datos completo de los artículos con F9 desde los ajustes incluyendo la existencia. NO: Permite ver solamente código y descripción del artículo con F9');

COMMIT WORK;

/* 20090602b */
/* SI SE PIDE UN AUXILIAR DE ANTES DEL INICIO SE GENERA DESDE LA FECHA DE INICIO */
SET TERM ^ ;

CREATE OR ALTER PROCEDURE FECHA_DESDE_CONTA(
    FECINI CHAR(8))
RETURNS (
    FECHA CHAR(8))
AS
declare variable ANO CHAR(4);
declare variable mes INTEGER;
declare variable dia INTEGER;
declare variable ANOINI CHAR(4);
declare variable MESINI CHAR(2);
begin
ANO = SUBSTR(FECINI,  1, 4);
MES = CAST(SUBSTR(FECINI,  5, 6) AS INTEGER);
DIA = CAST(SUBSTR(FECINI,  7, 8) AS INTEGER);
EXECUTE PROCEDURE LEE_CONFIGURACION ('CONTABILIDAD', 'GENERAL', 'AÑO DE INICIO') RETURNING_VALUES (:ANOINI);
EXECUTE PROCEDURE LEE_CONFIGURACION ('CONTABILIDAD', 'GENERAL', 'MES DE INICIO') RETURNING_VALUES (:MESINI);
if (:ANOINI > :ANO) then
    BEGIN
    ANO = ANOINI;
    MES = CAST(MESINI AS INTEGER);
    DIA = 1;
    END
if (:ANOINI = :ANO) then
    BEGIN
    if (CAST(MESINI AS INTEGER) > MES) then
        BEGIN
        MES = CAST(MESINI AS INTEGER);
        DIA = 1;
        END
    END
execute procedure compone_fecha_conta (:ANO, CAST(:MES AS INTEGER), DIA) returning_values (FECHA);
suspend;
end
^

SET TERM ; ^

grant EXECUTE on PROCEDURE fecha_desde_conta to PUBLIC;

SET TERM ^ ;

CREATE OR ALTER PROCEDURE AUXILIAR_DESDE_HASTA(
    CUENTAINI VARCHAR(20),
    CUENTAFIN VARCHAR(20),
    DESDE CHAR(8),
    HASTA CHAR(8),
    PROYINI VARCHAR(4),
    PROYFIN VARCHAR(4),
    CENTINI VARCHAR(4),
    CENTFIN VARCHAR(4),
    CEROS CHAR(1))
RETURNS (
    ID INTEGER,
    CUENTA VARCHAR(20),
    TIPOCOMP VARCHAR(3),
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA CHAR(8),
    CONCEPTO VARCHAR(60),
    NIT VARCHAR(15),
    REF VARCHAR(20),
    BASE NUMERIC(18,2),
    PORC NUMERIC(9,4),
    INICIAL NUMERIC(18,2),
    DEBITO NUMERIC(18,2),
    CREDITO NUMERIC(18,2),
    PROYECTO VARCHAR(4),
    CENTRO VARCHAR(4),
    TIPOREF INTEGER,
    IDREF INTEGER,
    NOMCUENTA VARCHAR(60),
    SALDO NUMERIC(18,2),
    CATEGORIA VARCHAR(4))
AS
declare variable NUMROWS INTEGER;
BEGIN
EXECUTE PROCEDURE fecha_desde_conta (:DESDE) returning_values (:DESDE);
for SELECT CUEN_COD, CUEN_NOM
    FROM CUENTAS
    WHERE CUEN_COD >= :CUENTAINI AND CUEN_COD <= :CUENTAFIN
     ORDER BY CUEN_COD
    INTO :CUENTA, :NOMCUENTA
    DO
        BEGIN
        EXECUTE PROCEDURE saldo_cuenta(:CUENTA, :DESDE) RETURNING_VALUES (:INICIAL);
        SALDO = INICIAL;
        SELECT COUNT(CUEN_COD) FROM COMPROBANTE_ENCABEZADO E, COMPROBANTE_DETALLE D
            WHERE E.ENCO_CONSEC = D.ENCO_CONSEC AND D.CUEN_COD = :CUENTA AND ENCO_FECHA >= :DESDE AND ENCO_FECHA <= :HASTA
            INTO :NUMROWS;
        if (NUMROWS > 0) then
            BEGIN
            /* TRAE LOS MOV. DE LA CUENTA DADA */
            FOR SELECT E.ENCO_CONSEC, TICO_COD, PRCO_PREF, ENCO_NUMERO, ENCO_FECHA, CODE_CONCEPTO, D.TERC_NIT, CODE_REFER, CODE_BASE, CODE_PORC, CODE_DEBITO, CODE_CREDITO, D.PROY_COD, D.CENT_COD, ENCO_TIPOREF, ENCO_IDREF, CONC_COD
                FROM COMPROBANTE_ENCABEZADO E, COMPROBANTE_DETALLE D, PROYECTOS P, CENTROS CE
                WHERE E.ENCO_CONSEC = D.ENCO_CONSEC AND D.CUEN_COD = :CUENTA AND ENCO_FECHA >= :DESDE AND ENCO_FECHA <= :HASTA AND D.PROY_COD = P.PROY_COD AND D.CENT_COD = CE.CENT_COD AND D.PROY_COD >= :PROYINI AND D.PROY_COD <= :PROYFIN AND D.CENT_COD >= :CENTINI AND D.CENT_COD <= :CENTFIN AND P.proy_cod = CE.proy_cod
                ORDER BY ENCO_FECHA, PRCO_PREF, ENCO_NUMERO
                INTO :ID, :TIPOCOMP, :PREFIJO, :NUMERO, :FECHA, :CONCEPTO, :NIT, :REF, :BASE, :PORC, :DEBITO, :CREDITO, :PROYECTO, :centro, :TIPOREF, :IDREF, :CATEGORIA
                DO
                    BEGIN
                    SALDO = SALDO + DEBITO - CREDITO;
                    SUSPEND;
                    END
            END
        ELSE
          if (CEROS = 'S') then
            BEGIN
            ID = NULL;
            TIPOCOMP = NULL;
            PREFIJO = NULL;
            NUMERO = NULL;
            FECHA = NULL;
            CONCEPTO = NULL;
            NIT = NULL;
            REF = NULL;
            BASE = 0;
            PORC = 0;
            DEBITO = 0;
            CREDITO = 0;
            PROYECTO = NULL;
            CENTRO = NULL;
            TIPOREF = 0;
            IDREF = 0;
            SUSPEND;
            END
        END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER PROCEDURE AUXILIAR_CENTRO_DESDE_HASTA(
    CUENTAINI VARCHAR(20),
    CUENTAFIN VARCHAR(20),
    PROYINI VARCHAR(4),
    PROYFIN VARCHAR(4),
    CENTINI VARCHAR(4),
    CENTFIN VARCHAR(4),
    DESDE CHAR(8),
    HASTA CHAR(8))
RETURNS (
    ID INTEGER,
    CUENTA VARCHAR(20),
    TIPOCOMP VARCHAR(3),
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA CHAR(8),
    CONCEPTO VARCHAR(60),
    NIT VARCHAR(15),
    TERCERO VARCHAR(60),
    REF VARCHAR(20),
    BASE NUMERIC(18,2),
    PORC NUMERIC(9,4),
    DEBITO NUMERIC(18,2),
    CREDITO NUMERIC(18,2),
    SALDO NUMERIC(18,2),
    PROYECTO VARCHAR(4),
    CENTRO VARCHAR(4),
    TIPOREF INTEGER,
    IDREF INTEGER,
    NOMCUENTA VARCHAR(60),
    NOMPROY VARCHAR(60),
    NOMCENT VARCHAR(60),
    CTAPROY VARCHAR(24),
    CTAPROYCENT VARCHAR(28))
AS
DECLARE VARIABLE FEC CHAR(8);
BEGIN
EXECUTE PROCEDURE fecha_desde_conta (:DESDE) returning_values (:DESDE);
/* TRAE LOS MOV. DE LA CUENTA Y TERCERO DADOS */
FOR SELECT E.ENCO_CONSEC, TICO_COD, PRCO_PREF, ENCO_NUMERO, ENCO_FECHA, D.CUEN_COD, CODE_CONCEPTO, D.TERC_NIT,TERC_NOM, CODE_REFER, CODE_BASE, CODE_PORC, CODE_DEBITO, CODE_CREDITO, D.PROY_COD, D.CENT_COD, ENCO_TIPOREF, ENCO_IDREF, CUEN_NOM, PROY_NOM, CENT_NOM
    FROM COMPROBANTE_ENCABEZADO E, COMPROBANTE_DETALLE D, CUENTAS C, PROYECTOS P, CENTROS CE, terceros T
    WHERE E.ENCO_CONSEC = D.ENCO_CONSEC AND D.CUEN_COD = C.CUEN_COD AND D.PROY_COD = P.PROY_COD AND D.CENT_COD = CE.CENT_COD AND D.terc_nit=T.terc_nit AND D.CUEN_COD >= :CUENTAINI AND D.CUEN_COD <= :CUENTAFIN AND ENCO_FECHA >= :DESDE AND ENCO_FECHA <= :HASTA AND D.PROY_COD >= :PROYINI AND D.PROY_COD <= :PROYFIN AND D.CENT_COD >= :CENTINI AND D.CENT_COD <= :CENTFIN AND P.proy_cod = CE.proy_cod
    ORDER BY D.CUEN_COD, D.proy_cod, D.cent_cod, ENCO_FECHA
    INTO :ID, :TIPOCOMP, :PREFIJO, :NUMERO, :FECHA, :CUENTA, :CONCEPTO, :NIT, :TERCERO, :REF, :BASE, :PORC, :DEBITO, :CREDITO, :PROYECTO, :centro, :TIPOREF, :IDREF, :NOMCUENTA, :NOMPROY, :NOMCENT
    DO
        BEGIN
        /* Busca la fecha del último movimiento de la cuenta-CENTRO antes de la fecha */
        SELECT  MAX(SACU_FECHA) FROM SALDOS_CENTROS
            WHERE (CUEN_COD = :CUENTA) AND (PROY_COD = :PROYECTO) AND (CENT_COD = :CENTRO) AND (SACU_FECHA <= :FECHA) INTO :FEC;
        IF (FEC IS NULL) THEN
          SALDO = 0;
        ELSE
          /* Con la fecha máxima calcule el nuevo saldo */
          if (FEC = FECHA) then
            SELECT SACE_SALDO FROM SALDOS_CENTROS
                WHERE (CUEN_COD = :CUENTA) AND (PROY_COD = :PROYECTO) AND (CENT_COD = :CENTRO) AND (SACU_FECHA = :FEC) INTO :SALDO;
          ELSE
            SELECT SACE_SALDO + SACE_DEBITO - SACE_CREDITO FROM SALDOS_CENTROS
                WHERE (CUEN_COD = :CUENTA) AND (PROY_COD = :PROYECTO) AND (CENT_COD = :CENTRO) AND (SACU_FECHA = :FEC) INTO :SALDO;
        CTAPROY = CUENTA || PROYECTO;
        CTAPROYCENT = CUENTA || PROYECTO || CENTRO;
        SUSPEND;
        END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER PROCEDURE AUXILIAR_TERCERO_DESDE_HASTA(
    CUENTAINI VARCHAR(20),
    CUENTAFIN VARCHAR(20),
    TERCINI VARCHAR(20),
    TERCFIN VARCHAR(20),
    DESDE CHAR(8),
    HASTA CHAR(8),
    PROYINI VARCHAR(4),
    PROYFIN VARCHAR(4),
    CENTINI VARCHAR(4),
    CENTFIN VARCHAR(4),
    CEROS CHAR(1))
RETURNS (
    ID INTEGER,
    CUENTA VARCHAR(20),
    TIPOCOMP VARCHAR(3),
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA CHAR(8),
    CONCEPTO VARCHAR(60),
    NIT VARCHAR(15),
    DV CHAR(1),
    REF VARCHAR(20),
    BASE NUMERIC(18,2),
    PORC NUMERIC(9,4),
    DEBITO NUMERIC(18,2),
    CREDITO NUMERIC(18,2),
    PROYECTO VARCHAR(4),
    CENTRO VARCHAR(4),
    TIPOREF INTEGER,
    IDREF INTEGER,
    SALDO NUMERIC(18,2),
    NOMCUENTA VARCHAR(60),
    NOMTERCERO VARCHAR(60),
    CUENTANIT VARCHAR(40),
    SALDOFIN NUMERIC(18,2),
    SALDOCTA NUMERIC(18,2),
    SALDOCTAF NUMERIC(18,2))
AS
DECLARE VARIABLE FEC CHAR(8);
declare variable NUMROWS INTEGER;
BEGIN
EXECUTE PROCEDURE fecha_desde_conta (:DESDE) returning_values (:DESDE);
for SELECT CUEN_COD, CUEN_NOM
    FROM CUENTAS
    WHERE CUEN_COD >= :CUENTAINI AND CUEN_COD <= :CUENTAFIN
     ORDER BY CUEN_COD
    INTO :CUENTA, :NOMCUENTA
    DO
        BEGIN
        EXECUTE PROCEDURE saldo_cuenta(:CUENTA, :DESDE) RETURNING_VALUES (:SALDOCTA);
        SALDOCTAF = SALDOCTA;
        FOR SELECT distinct TERC_NIT FROM saldos_terceros WHERE CUEN_COD = :CUENTA AND
            TERC_NIT >= :TERCINI AND TERC_NIT <= :TERCFIN ORDER BY TERC_NIT INTO :NIT
            DO
            BEGIN
            /* Busca la fecha del último movimiento de la cuenta-NIT antes de la fecha */
            SELECT  MAX(SACU_FECHA) FROM SALDOS_TERCEROS
                WHERE (CUEN_COD = :CUENTA) AND (TERC_NIT = :NIT) AND (SACU_FECHA <= :DESDE) INTO :FEC;
            IF (FEC IS NULL) THEN
                SALDO = 0;
            ELSE
                /* Con la fecha máxima calcule el nuevo saldo */
                if (FEC = DESDE) then
                    SELECT SATE_SALDO FROM SALDOS_TERCEROS
                        WHERE (CUEN_COD = :CUENTA) AND (TERC_NIT = :NIT) AND (SACU_FECHA = :FEC) INTO :SALDO;
                ELSE
                    SELECT SATE_SALDO+SATE_DEBITO-SATE_CREDITO FROM SALDOS_TERCEROS
                        WHERE (CUEN_COD = :CUENTA) AND (TERC_NIT = :NIT) AND (SACU_FECHA = :FEC) INTO :SALDO;
            CUENTANIT = CUENTA || NIT;
            SALDOFIN = SALDO;
            SELECT TERC_NOM, TERC_DV FROM TERCEROS WHERE TERC_NIT = :nit INTO :NOMTERCERO, :DV;
            NUMROWS = 0;
            /* TRAE LOS MOV. DE LA CUENTA Y TERCERO DADOS */
            FOR SELECT E.ENCO_CONSEC, TICO_COD, PRCO_PREF, ENCO_NUMERO, ENCO_FECHA, D.CUEN_COD, CODE_CONCEPTO, D.TERC_NIT, CODE_REFER, CODE_BASE, CODE_PORC, CODE_DEBITO, CODE_CREDITO, D.PROY_COD, D.CENT_COD, ENCO_TIPOREF, ENCO_IDREF
                FROM COMPROBANTE_ENCABEZADO E, COMPROBANTE_DETALLE D, PROYECTOS P, CENTROS CE
                WHERE E.ENCO_CONSEC = D.ENCO_CONSEC AND D.CUEN_COD = :CUENTA AND ENCO_FECHA >= :DESDE AND ENCO_FECHA <= :HASTA AND D.TERC_NIT = :NIT AND D.PROY_COD = P.PROY_COD AND D.CENT_COD = CE.CENT_COD AND D.PROY_COD >= :PROYINI AND D.PROY_COD <= :PROYFIN AND D.CENT_COD >= :CENTINI AND D.CENT_COD <= :CENTFIN AND P.proy_cod = CE.proy_cod
                ORDER BY D.CUEN_COD, D.TERC_NIT, ENCO_FECHA, PRCO_PREF, ENCO_NUMERO
                INTO :ID, :TIPOCOMP, :PREFIJO, :NUMERO, :FECHA, :CUENTA, :CONCEPTO, :NIT, :REF, :BASE, :PORC, :DEBITO, :CREDITO, :PROYECTO, :centro, :TIPOREF, :IDREF
                DO
                BEGIN
                SALDOFIN = SALDOFIN + DEBITO - CREDITO;
                SALDOCTAF = SALDOCTAF + DEBITO - CREDITO;
                NUMROWS = NUMROWS + 1;
                SUSPEND;
                END
            if ((CEROS = 'S') AND (NUMROWS = 0)) then
                BEGIN
                SALDOFIN = SALDO;
                if (SALDO <> 0) then
                    BEGIN
                    ID = NULL;
                    TIPOCOMP = NULL;
                    PREFIJO = NULL;
                    NUMERO = NULL;
                    FECHA = NULL;
                    CONCEPTO = NULL;
                    REF = NULL;
                    BASE = 0;
                    PORC = 0;
                    DEBITO = 0;
                    CREDITO = 0;
                    PROYECTO = NULL;
                    CENTRO = NULL;
                    TIPOREF = 0;
                    IDREF = 0;
                    SUSPEND;
                    END
                END
            END
        END
END
^

SET TERM ; ^

/* 20090602c */
/* NO DEJAR EN NULL LA CANT RETAL */
SET TERM ^ ;

CREATE OR ALTER TRIGGER ENSAMBLES_BI FOR ENSAMBLES
ACTIVE BEFORE INSERT POSITION 0
AS
declare variable NUMERO VARCHAR(8);
declare variable AUTOM CHAR(1);
declare variable EXISTE CHAR(1);
BEGIN
if (NEW.ensa_cantretal IS NULL) then
    NEW.ensa_cantretal = 0;
if (NEW.numok = 'N') then
  BEGIN
  /* Actualice el contador del prefijo */
  SELECT PREF_ACTUAL, PREF_AUTO FROM PREFIJOS WHERE TIDO_COD = NEW.TIDO_COD AND PREF_PRE = NEW.PREF_PRE INTO :NUMERO, :AUTOM;
  if (AUTOM = 'S') then
    BEGIN
    /* ACTUALICE EL NUMERO EN COMPROBANTE_ENCABEZADO  */
    NEW.ENSA_NUMERO = NUMERO;
    NUMERO = CAST((CAST(NUMERO AS INTEGER) + 1) AS CHAR(6));
    UPDATE PREFIJOS
      SET PREF_ACTUAL = :NUMERO
    WHERE TIDO_COD = NEW.TIDO_COD AND PREF_PRE = NEW.PREF_PRE;
    END
  ELSE
    begin
    if (CAST(NUMERO AS INTEGER) = CAST(NEW.ENSA_NUMERO AS INTEGER)) then
        UPDATE PREFIJOS
          SET PREF_ACTUAL = CAST((CAST(PREF_ACTUAL AS INTEGER) + 1) AS CHAR(6))
        WHERE TIDO_COD = NEW.TIDO_COD AND PREF_PRE = NEW.PREF_PRE;
    end
  EXECUTE PROCEDURE COMPLETA_CEROS (NEW.ENSA_numero) returning_values (NEW.ENSA_numero);
  NEW.numok = 'S';
  END
/* Verifique que el numero no existe previamente */
EXISTE = 'N';
SELECT 'S' FROM ensambles WHERE PREF_PRE = NEW.PREF_PRE AND ENSA_NUMERO = NEW.ENSA_NUMERO INTO :EXISTE;
if (EXISTE = 'S') then
    EXCEPTION DOCUMENTO_REGISTRADO 'Ya existe un ensamble con el número ' || new.pref_pre || new.ensa_numero;
END
^

SET TERM ; ^



/* 20090603 */
/* POR LA REPLICACION DE INV. CALCULE EL COSTO EN EL TRIGGER E IGNORE LO QUE LLEGA EN EL DATASET */

SET TERM ^ ;

create or alter trigger SALIDAS_DETALLE_BI for SALIDAS_DETALLE
active BEFORE INSERT position 0
as
declare variable FEC DATE;
declare variable IVAINC CHAR(1);
declare variable SUBT double precision;
begin
SELECT SALI_FECHA, SALI_IMPTOS FROM SALIDAS WHERE SALI_ID = NEW.sali_id INTO :FEC, :IVAINC;
execute procedure costo_promedio_unidad (NEW.arti_cod, :fec,  NEW.sade_unidad) returning_values (NEW.sade_costo);
SUBT = NEW.sade_cant * NEW.sade_costo;
if (IVAINC = 'S') then
    BEGIN
    NEW.sade_ivamonto = (:SUBT - (NEW.sade_consumo * NEW.sade_cant * NEW.sade_factor)) * NEW.sade_ivaporc / 100;
    NEW.sade_total = :SUBT + NEW.sade_ivamonto;
    END
ELSE
    BEGIN
    NEW.sade_total = :subt;
    NEW.sade_ivamonto = (:SUBT - (NEW.sade_consumo * NEW.sade_cant * NEW.sade_factor)) / (100 + NEW.sade_ivaporc) * NEW.sade_ivaporc;
    END
end
^

SET TERM ; ^


SET TERM ^ ;

create or alter trigger SALIDAS_DETALLE_BU for SALIDAS_DETALLE
active BEFORE UPDATE position 0
as
declare variable FEC DATE;
declare variable IVAINC CHAR(1);
declare variable SUBT double precision;
begin
SELECT SALI_FECHA, SALI_IMPTOS FROM SALIDAS WHERE SALI_ID = NEW.sali_id INTO :FEC, :IVAINC;
execute procedure costo_promedio_unidad (NEW.arti_cod, :fec,  NEW.sade_unidad) returning_values (NEW.sade_costo);
SUBT = NEW.sade_cant * NEW.sade_costo;
if (IVAINC = 'S') then
    BEGIN
    NEW.sade_ivamonto = (:SUBT - (NEW.sade_consumo * NEW.sade_cant * NEW.sade_factor)) * NEW.sade_ivaporc / 100;
    NEW.sade_total = :SUBT + NEW.sade_ivamonto;
    END
ELSE
    BEGIN
    NEW.sade_total = :subt;
    NEW.sade_ivamonto = (:SUBT - (NEW.sade_consumo * NEW.sade_cant * NEW.sade_factor)) / (100 + NEW.sade_ivaporc) * NEW.sade_ivaporc;
    END
end
^

SET TERM ; ^


/* 20090604 */
/* consumo en devoluciones fallaba a veces */
SET TERM ^ ;

CREATE OR ALTER PROCEDURE IMPUESTOS_VENTAS(
    FECINI DATE,
    FECFIN DATE,
    PREFIJO VARCHAR(4),
    PTOINI INTEGER,
    PTOFIN INTEGER,
    ANULADOS CHAR(1),
    SUBEMPRESA INTEGER)
RETURNS (
    TIPO INTEGER,
    NOMTIPO VARCHAR(30),
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    NIT VARCHAR(20),
    NOMTERCERO VARCHAR(60),
    SUBTOTAL NUMERIC(18,2),
    DTOMONTO NUMERIC(18,2),
    ADICIONAL NUMERIC(18,2),
    IVAMONTO NUMERIC(18,2),
    CONSUMO NUMERIC(18,2),
    EXENTOS NUMERIC(18,2),
    GRAVADOS1 NUMERIC(18,2),
    GRAVADOS2 NUMERIC(18,2),
    GRAVADOS3 NUMERIC(18,2),
    IVA1 NUMERIC(18,2),
    IVA2 NUMERIC(18,2),
    IVA3 NUMERIC(18,2),
    EXTRA NUMERIC(18,2),
    TOTAL NUMERIC(18,2),
    RTFTEMONTO NUMERIC(18,2),
    RTIVAMONTO NUMERIC(18,2),
    RTICAMONTO 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 NUMERIC(18,4);
declare variable NUEVO NUMERIC(18,2);
BEGIN
/* FACTURA */
TIPO = 31;
SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 31 INTO :NOMTIPO;

FOR SELECT FACT_ID, F.PREF_PRE, FACT_NUMERO, FACT_FECHA, TERC_NIT, FACT_NOMCLIENTE, FACT_ADICIONAL-FACT_DTOMONTO, FACT_IVAMONTO, FACT_RTFTEMONTO, FACT_RTIVAMONTO, FACT_RTICAMONTO, FACT_EXTRA, FACT_TOTAL, FACT_ANULADO
    FROM FACTURAS F, PREFIJOS PR WHERE PTVT_ID >= :PTOINI AND PTVT_ID <= :PTOFIN AND
    FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND ((:PREFIJO = '') or (:PREFIJO IS NULL) or (F.PREF_PRE = :PREFIJO))
    AND PR.PREF_PRE = F.PREF_PRE AND PR.TIDO_COD = 31 AND ((PR.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
    ORDER BY FACT_FECHA, F.PREF_PRE, FACT_NUMERO
    INTO :ID, :PREF, :NUMERO, :FECHA, :NIT, :NOMTERCERO, :DTOMONTO, :IVAMONTO, :RTFTEMONTO, :RTIVAMONTO, :RTICAMONTO, :EXTRA, :TOTAL, :ANULADO
    DO
    BEGIN
    SELECT TERC_EXENTO FROM TERCEROS WHERE TERC_NIT = :NIT INTO :TER_EXENTO;
    if ((ANULADOS = 'S') or (ANULADO = 'N')) then
        BEGIN
        if (ANULADO = 'S') then
            BEGIN
            EXENTOS = 0;
            GRAVADOS1 = 0;
            GRAVADOS2 = 0;
            GRAVADOS3 = 0;
            CONSUMO = 0;
            SUBTOTAL = 0;
            TOTAL = 0;
            EXTRA = 0;
            IVAMONTO = 0;
            DTOMONTO = 0;
            NETO = 0;
            RTFTEMONTO = 0;
            RTIVAMONTO = 0;
            RTICAMONTO = 0;
            END
        else
            BEGIN
            /* CALCULE LAS DIFERENTES TARIFAS */
            if (TER_EXENTO = 'S') then
                BEGIN
                SELECT SUM(FADE_TOTAL - FADE_IVAMONTO - FADE_CONSUMO) FROM FACTURAS_DETALLE D WHERE FACT_ID = :ID AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL)) INTO :EXENTOS;
                GRAVADOS1 = 0;
                GRAVADOS2 = 0;
                GRAVADOS3 = 0;
                end
            else
                begin
                SELECT SUM(FADE_TOTAL - FADE_IVAMONTO - FADE_CONSUMO) FROM FACTURAS_DETALLE D WHERE FACT_ID = :ID AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL)) AND FADE_IVAPORC = 0 INTO :EXENTOS;
                SELECT SUM(FADE_TOTAL - FADE_IVAMONTO - FADE_CONSUMO), SUM(FADE_IVAMONTO) FROM FACTURAS_DETALLE D, TARIFA_IVA T WHERE FACT_ID = :ID AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL)) AND FADE_IVAPORC = TAIV_PORC AND TAIV_COD = 1 INTO :GRAVADOS1, :IVA1;
                SELECT SUM(FADE_TOTAL - FADE_IVAMONTO - FADE_CONSUMO), SUM(FADE_IVAMONTO) FROM FACTURAS_DETALLE D, TARIFA_IVA T WHERE FACT_ID = :ID AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL)) AND FADE_IVAPORC = TAIV_PORC AND TAIV_COD = 2 INTO :GRAVADOS2, :IVA2;
                SELECT SUM(FADE_TOTAL - FADE_IVAMONTO - FADE_CONSUMO), SUM(FADE_IVAMONTO) FROM FACTURAS_DETALLE D, TARIFA_IVA T WHERE FACT_ID = :ID AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL)) AND FADE_IVAPORC = TAIV_PORC AND TAIV_COD = 3 INTO :GRAVADOS3, :IVA3;
                end
            if (iva1 is null) then
                iva1 = 0;
            if (iva2 is null) then
                iva2 = 0;
            if (iva3 is null) then
                iva3 = 0;
            IVAMONTO = IVA1 + IVA2 + IVA3;
            SELECT SUM(FADE_CONSUMO) FROM FACTURAS_DETALLE WHERE FACT_ID = :ID AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL)) INTO :CONSUMO;
            SUBTOTAL = TOTAL - EXTRA - IVAMONTO - DTOMONTO;
            NETO = TOTAL - RTFTEMONTO - RTIVAMONTO - RTICAMONTO;
            END
        if (exentos is null) then
            exentos = 0;
        if (gravados1 is null) then
            gravados1 = 0;
        if (gravados2 is null) then
            gravados2 = 0;
        if (gravados3 is null) then
            gravados3 = 0;
        if (consumo is null) then
            consumo = 0;
        FACTOR = 1;
        SELECT AJCI_FACTOR FROM ajuste_cierre WHERE AJCI_PORC = 0 AND AJCI_FECINI <= :FECHA AND AJCI_FECFIN >= :FECHA INTO :FACTOR;
        if (FACTOR IS null) then
            FACTOR = 1;
        EXENTOS = EXENTOS * FACTOR;
        ivamonto = 0;
        FACTOR = 1;
        SELECT AJCI_FACTOR FROM ajuste_cierre WHERE AJCI_PORC = 16 AND AJCI_FECINI <= :FECHA AND AJCI_FECFIN >= :FECHA INTO :FACTOR;
        if (FACTOR IS null) then
            FACTOR = 1;
        gravados1 = GRAVADOS1 * FACTOR;
        IVA1 = IVA1 * FACTOR;
        ivamonto = ivamonto + IVA1;
        FACTOR = 1;
        SELECT AJCI_FACTOR FROM ajuste_cierre WHERE AJCI_PORC = 10 AND AJCI_FECINI <= :FECHA AND AJCI_FECFIN >= :FECHA INTO :FACTOR;
        if (FACTOR IS null) then
            FACTOR = 1;
        gravados2 = GRAVADOS2 * FACTOR;
        IVA2 = IVA2 * FACTOR;
        ivamonto = ivamonto + IVA2;
        FACTOR = 1;
        SELECT AJCI_FACTOR FROM ajuste_cierre WHERE AJCI_PORC = 7 AND AJCI_FECINI <= :FECHA AND AJCI_FECFIN >= :FECHA INTO :FACTOR;
        if (FACTOR IS null) then
            FACTOR = 1;
        gravados3 = GRAVADOS3 * FACTOR;
        IVA3 = IVA3 * FACTOR;
        ivamonto = ivamonto + IVA3;
        NUEVO = exentos + gravados1 + gravados2 + gravados3;
        if (TOTAL <> 0) then
            BEGIN
            CONSUMO = CONSUMO * (NUEVO+ivamonto+consumo) / TOTAL;
            SUBTOTAL = SUBTOTAL * (NUEVO+ivamonto+consumo) / TOTAL;
            NETO = NETO * (NUEVO+ivamonto+consumo) / TOTAL;
            rtftemonto = rtftemonto * (NUEVO+ivamonto+consumo) / TOTAL;
            rticamonto = rticamonto * (NUEVO+ivamonto+consumo) / TOTAL;
            rtivamonto = rtivamonto * (NUEVO+ivamonto+consumo) / TOTAL;
            dtomonto = dtomonto * (NUEVO+ivamonto+consumo) / TOTAL;
            adicional = adicional * (NUEVO+ivamonto+consumo) / TOTAL;
            total = total * (NUEVO+ivamonto+consumo) / TOTAL;
            END
        SUSPEND;
        END
    END
    
TIPO = 33;
SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 33 INTO :NOMTIPO;
/* DEVOLUCIONES */
FOR SELECT DEVT_ID, D.PREF_PRE, DEVT_NUMERO, DEVT_FECHA, TERC_NIT, DEVT_NOMTERC, DEVT_ADICIONAL-DEVT_DTOMONTO, DEVT_IVAMONTO, DEVT_RTFTEMONTO, DEVT_RTIVAMONTO, DEVT_RTICAMONTO, DEVT_EXTRA, DEVT_TOTAL, DEVT_ANULADO
    FROM DEVOLUCIONES_VENTAS D, PREFIJOS PR WHERE PTVT_ID >= :PTOINI AND PTVT_ID <= :PTOFIN AND
    DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND ((:PREFIJO = '') or (:PREFIJO IS NULL) or (D.PREF_PRE = :PREFIJO))
    AND PR.PREF_PRE = D.PREF_PRE AND PR.TIDO_COD = 33 AND ((PR.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) AND ((DEVT_REMID = 0) or (DEVT_REMID IS NULL))
    ORDER BY DEVT_FECHA, D.PREF_PRE, DEVT_NUMERO
    INTO :ID, :PREF, :NUMERO, :FECHA, :NIT, :NOMTERCERO, :DTOMONTO, :IVAMONTO, :RTFTEMONTO, :RTIVAMONTO, :RTICAMONTO, :EXTRA, :TOTAL, :ANULADO
    DO
    BEGIN
    SELECT TERC_EXENTO FROM TERCEROS WHERE TERC_NIT = :NIT INTO :TER_EXENTO;
    if ((ANULADOS = 'S') or (ANULADO = 'N')) then
        BEGIN
        if (ANULADO = 'S') then
            BEGIN
            EXENTOS = 0;
            GRAVADOS1 = 0;
            GRAVADOS2 = 0;
            GRAVADOS3 = 0;
            CONSUMO = 0;
            SUBTOTAL = 0;
            TOTAL = 0;
            EXTRA = 0;
            IVAMONTO = 0;
            DTOMONTO = 0;
            NETO = 0;
            RTFTEMONTO = 0;
            RTIVAMONTO = 0;
            RTICAMONTO = 0;
            END
        else
            BEGIN
            DTOMONTO = DTOMONTO * -1;
            ADICIONAL = ADICIONAL * -1;
            IVAMONTO = IVAMONTO * -1;
            EXTRA = EXTRA * -1;
            TOTAL = TOTAL * -1;
            RTFTEMONTO = RTFTEMONTO * -1;
            RTIVAMONTO = RTIVAMONTO * -1;
            RTICAMONTO = RTICAMONTO * -1;
            /* CALCULE LAS DIFERENTES TARIFAS */
            if (TER_EXENTO = 'S') then
             BEGIN
              SELECT SUM(DVDE_TOTAL - DVDE_IVAMONTO - DVDE_CONSUMO) FROM DEVOLUCIONES_VENTAS_DETALLE D WHERE DEVT_ID = :ID AND DVDE_REFERENCIA <> '.t' INTO :EXENTOS;
              GRAVADOS1 = 0;
              GRAVADOS2 = 0;
              GRAVADOS3 = 0;
             end
            else
             begin
              SELECT SUM(DVDE_TOTAL - DVDE_IVAMONTO - DVDE_CONSUMO) FROM DEVOLUCIONES_VENTAS_DETALLE D WHERE DEVT_ID = :ID AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL)) AND DVDE_IVAPORC = 0 INTO :EXENTOS;
              SELECT SUM(DVDE_TOTAL - DVDE_IVAMONTO - DVDE_CONSUMO), SUM(DVDE_IVAMONTO) FROM DEVOLUCIONES_VENTAS_DETALLE D, TARIFA_IVA T WHERE DEVT_ID = :ID AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL)) AND DVDE_IVAPORC = TAIV_PORC AND TAIV_COD = 1 INTO :GRAVADOS1, :IVA1;
              SELECT SUM(DVDE_TOTAL - DVDE_IVAMONTO - DVDE_CONSUMO), SUM(DVDE_IVAMONTO) FROM DEVOLUCIONES_VENTAS_DETALLE D, TARIFA_IVA T WHERE DEVT_ID = :ID AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL)) AND DVDE_IVAPORC = TAIV_PORC AND TAIV_COD = 2 INTO :GRAVADOS2, :IVA2;
              SELECT SUM(DVDE_TOTAL - DVDE_IVAMONTO - DVDE_CONSUMO), SUM(DVDE_IVAMONTO) FROM DEVOLUCIONES_VENTAS_DETALLE D, TARIFA_IVA T WHERE DEVT_ID = :ID AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL)) AND DVDE_IVAPORC = TAIV_PORC AND TAIV_COD = 3 INTO :GRAVADOS3, :IVA3;
             end
            if (iva1 is null) then
                iva1 = 0;
            if (iva2 is null) then
                iva2 = 0;
            if (iva3 is null) then
                iva3 = 0;
            IVAMONTO = IVA1 + IVA2 + IVA3;
            SELECT SUM(DVDE_CONSUMO) FROM DEVOLUCIONES_VENTAS_DETALLE WHERE DEVT_ID = :ID AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL)) INTO :CONSUMO;
            EXENTOS = EXENTOS * -1;
            GRAVADOS1 = GRAVADOS1 * -1;
            GRAVADOS2 = GRAVADOS2 * -1;
            GRAVADOS3 = GRAVADOS3 * -1;
            CONSUMO = CONSUMO * -1;
            IVA1 = IVA1 * -1;
            IVA2 = IVA2 * -1;
            IVA3 = IVA3 * -1;
            IVAMONTO = IVAMONTO * -1;
            SUBTOTAL = TOTAL - EXTRA - IVAMONTO - DTOMONTO;
            NETO = TOTAL - RTFTEMONTO - RTIVAMONTO - RTICAMONTO;
            END
        if (exentos is null) then
            exentos = 0;
        if (gravados1 is null) then
            gravados1 = 0;
        if (gravados2 is null) then
            gravados2 = 0;
        if (gravados3 is null) then
            gravados3 = 0;
        if (consumo is null) then
            consumo = 0;
        FACTOR = 1;
        SELECT AJCI_FACTOR FROM ajuste_cierre WHERE AJCI_PORC = 0 AND AJCI_FECINI <= :FECHA AND AJCI_FECFIN >= :FECHA INTO :FACTOR;
        if (FACTOR IS null) then
            FACTOR = 1;
        EXENTOS = EXENTOS * FACTOR;
        ivamonto = 0;
        FACTOR = 1;
        SELECT AJCI_FACTOR FROM ajuste_cierre WHERE AJCI_PORC = 16 AND AJCI_FECINI <= :FECHA AND AJCI_FECFIN >= :FECHA INTO :FACTOR;
        if (FACTOR IS null) then
            FACTOR = 1;
        gravados1 = GRAVADOS1 * FACTOR;
        IVA1 = IVA1 * FACTOR;
        ivamonto = ivamonto + IVA1;
        FACTOR = 1;
        SELECT AJCI_FACTOR FROM ajuste_cierre WHERE AJCI_PORC = 10 AND AJCI_FECINI <= :FECHA AND AJCI_FECFIN >= :FECHA INTO :FACTOR;
        if (FACTOR IS null) then
            FACTOR = 1;
        gravados2 = GRAVADOS2 * FACTOR;
        IVA2 = IVA2 * FACTOR;
        ivamonto = ivamonto + IVA2;
        FACTOR = 1;
        SELECT AJCI_FACTOR FROM ajuste_cierre WHERE AJCI_PORC = 7 AND AJCI_FECINI <= :FECHA AND AJCI_FECFIN >= :FECHA INTO :FACTOR;
        if (FACTOR IS null) then
            FACTOR = 1;
        gravados3 = GRAVADOS3 * FACTOR;
        IVA3 = IVA3 * FACTOR;
        ivamonto = ivamonto + IVA3;
        NUEVO = exentos + gravados1 + gravados2 + gravados3;
        if (TOTAL <> 0) then
            BEGIN
            CONSUMO = CONSUMO * (NUEVO+ivamonto+consumo) / TOTAL;
            SUBTOTAL = SUBTOTAL * (NUEVO+ivamonto+consumo) / TOTAL;
            NETO = NETO * (NUEVO+ivamonto+consumo) / TOTAL;
            rtftemonto = rtftemonto * (NUEVO+ivamonto+consumo) / TOTAL;
            rticamonto = rticamonto * (NUEVO+ivamonto+consumo) / TOTAL;
            rtivamonto = rtivamonto * (NUEVO+ivamonto+consumo) / TOTAL;
            dtomonto = dtomonto * (NUEVO+ivamonto+consumo) / TOTAL;
            adicional = adicional * (NUEVO+ivamonto+consumo) / TOTAL;
            total = total * (NUEVO+ivamonto+consumo) / TOTAL;
            END
        SUSPEND;
        END
    END
execute procedure lee_configuracion ('FACTURACION', 'DOCUMENTOS', 'INCLUIR NOTAS DE CARTERA EN REPORTE DE IMPUESTOS EN VENTAS') returning_values (:NOTAS);
if (NOTAS = 'SI') then
    BEGIN
    TIPO = 41;
    SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 41 INTO :NOMTIPO;
    FOR SELECT NDCL_ID, N.PREF_PRE, NDCL_NUMERO, NDCL_FECHA, N.TERC_NIT, TERC_NOM, 0, NDCL_IVAMONTO, NDCL_RTFTEMONTO, NDCL_RTIVAMONTO, NDCL_RTICAMONTO, 0, NDCL_MONTO+NDCL_IVAMONTO, NDCL_ANULADO
        FROM NOTAS_DEBITO_CLIENTES N, TERCEROS T, PREFIJOS PR WHERE N.TERC_NIT = T.TERC_NIT AND
        NDCL_FECHA >= :FECINI AND NDCL_FECHA <= :FECFIN AND ((:PREFIJO = '') or (:PREFIJO IS NULL) or (N.PREF_PRE = :PREFIJO))
        AND PR.PREF_PRE = N.PREF_PRE AND PR.TIDO_COD = 41 AND ((PR.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
        ORDER BY NDCL_FECHA, N.PREF_PRE, NDCL_NUMERO
        INTO :ID, :PREF, :NUMERO, :FECHA, :NIT, :NOMTERCERO, :DTOMONTO, :IVAMONTO, :RTFTEMONTO, :RTIVAMONTO, :RTICAMONTO, :EXTRA, :TOTAL, :ANULADO
        DO
        BEGIN
        GRAVADOS2 = 0;
        GRAVADOS3 = 0;
        IVA2 = 0;
        IVA3 = 0;
        CONSUMO = 0;
        if (ANULADO = 'S') then
            BEGIN
            EXENTOS = 0;
            GRAVADOS1 = 0;
            SUBTOTAL = 0;
            TOTAL = 0;
            EXTRA = 0;
            IVAMONTO = 0;
            DTOMONTO = 0;
            NETO = 0;
            RTFTEMONTO = 0;
            RTIVAMONTO = 0;
            RTICAMONTO = 0;
            END
        ELSE
            BEGIN
            if (IVAMONTO <> 0) then
                BEGIN
                GRAVADOS1 = TOTAL-IVAMONTO;
                IVA1 = IVAMONTO;
                exentos = 0;
                END
            ELSE
                BEGIN
                GRAVADOS1 = 0;
                IVA1 = 0;
                exentos = TOTAL;
                END
            SUBTOTAL = TOTAL - EXTRA - IVAMONTO - DTOMONTO;
            NETO = TOTAL - RTFTEMONTO - RTIVAMONTO - RTICAMONTO;
            END
        SUSPEND;
        END

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

SET TERM ; ^

/* 20090605 */
/* EN ALGUNAS MAQUINAS NO SIEMPRE ACTUAILZABA LA TABLA DE SALDOS POR NO HACER NUNCA EL INSERT */
SET TERM ^ ;

CREATE OR ALTER PROCEDURE SUME_SALDO_CAJA(
    CAJA INTEGER,
    FECHA DATE,
    MONTO NUMERIC(18,2),
    ANULAR CHAR(1))
AS
DECLARE VARIABLE saldo NUMERIC(15,4);
declare variable sumar integer;
BEGIN
  if (ANULAR = 'S') then
    sumar = -1;
  else
    sumar = 1;
  /*  Si en SALDO_CAJA existe el registro CAJA-fecha le suma
        a los debitos el monto, si no, crea un nuevo registro       */
  IF (NOT EXISTS (SELECT CAJA_ID FROM SALDO_CAJA WHERE (CAJA_ID = :CAJA) AND
      (SACA_FECHA = :FECHA))) THEN
      BEGIN
      /*  No existe movimiento en esa fecha, traiga el saldo anterior y
          registre uno nuevo */
      EXECUTE PROCEDURE SALDO_EN_CAJA(:CAJA, :fecha)
        RETURNING_VALUES :saldo;
      INSERT INTO SALDO_CAJA (CAJA_ID, SACA_FECHA,
        SACA_DEBITOS, SACA_CREDITOS, SACA_SALDO)
        VALUES (:CAJA, :FECHA, (:MONTO * :sumar), 0, :saldo);
      END /* if existe */
  ELSE
      BEGIN
      /* Ya existe un registro en la fecha */
      UPDATE SALDO_CAJA
          SET SACA_DEBITOS = SACA_DEBITOS + (:MONTO * :sumar)
          WHERE (CAJA_ID = :CAJA) AND
            (SACA_FECHA = :fecha);
      END
    /*  Recorra los registros de fechas posteriores actualizando el saldo
        anterior */
    UPDATE SALDO_CAJA
        SET SACA_SALDO = SACA_SALDO + (:MONTO * :sumar)
        WHERE (CAJA_ID = :CAJA) AND
            (SACA_FECHA > :fecha);
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER TRIGGER MOVIMIENTO_CAJA_AD
AS
BEGIN
  /* actualice el saldo */
  execute procedure sume_saldo_caja(old.caja_id, old.moca_fecha, old.moca_debitos, 'S');
  execute procedure reste_saldo_caja(old.caja_id, old.moca_fecha, old.moca_creditos, 'S');
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER TRIGGER MOVIMIENTO_CAJA_AI
AS
BEGIN
  /* actualice SALDO EN LA CAJA */
  execute procedure sume_saldo_caja(new.caja_id, new.moca_fecha, new.moca_debitos, 'N');
  execute procedure reste_saldo_caja(new.caja_id, new.moca_fecha, new.moca_creditos, 'N');
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER TRIGGER MOVIMIENTO_CAJA_AU
AS
BEGIN
  /* deshaga lo viejo */
  execute procedure sume_saldo_caja(old.caja_id, old.moca_fecha, old.moca_debitos, 'S');
  execute procedure reste_saldo_caja(old.caja_id, old.moca_fecha, old.moca_creditos, 'S');
  /* actualice SALDO DEL BANCO */
  execute procedure sume_saldo_caja(new.caja_id, new.moca_fecha, new.moca_debitos, 'N');
  execute procedure reste_saldo_caja(new.caja_id, new.moca_fecha, new.moca_creditos, 'N');

/* SI QUEDO EN CEROS EL MONTO ELIMINE EL REGISTRO */
if ((new.moca_debitos = 0) and (new.moca_creditos = 0)) then
    DELETE FROM movimiento_caja WHERE MOCA_ID = new.moca_id;
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER PROCEDURE RESTE_SALDO_CAJA(
    CAJA INTEGER,
    FECHA DATE,
    MONTO NUMERIC(18,2),
    ANULAR CHAR(1))
AS
DECLARE VARIABLE saldo NUMERIC(15,4);
declare variable sumar integer;
BEGIN
  if (ANULAR = 'S') then
    sumar = -1;
  else
    sumar = 1;
  /*  Si en SALDO_CAJA existe el registro CAJA-fecha le suma
        a los debitos el monto, si no, crea un nuevo registro       */
  IF (NOT EXISTS (SELECT CAJA_ID FROM SALDO_CAJA WHERE (CAJA_ID = :CAJA) AND
      (SACA_FECHA = :FECHA))) THEN
      BEGIN
      /*  No existe movimiento en esa fecha, traiga el saldo anterior y
          registre uno nuevo */
      EXECUTE PROCEDURE SALDO_EN_CAJA(:CAJA, :fecha)
        RETURNING_VALUES :saldo;
      INSERT INTO SALDO_CAJA (CAJA_ID, SACA_FECHA,
        SACA_DEBITOS, SACA_CREDITOS, SACA_SALDO)
        VALUES (:CAJA, :FECHA, 0, (:MONTO * :sumar), :saldo);
      END /* if existe */
  ELSE
      BEGIN
      /* Ya existe un registro en la fecha */
      UPDATE SALDO_CAJA
          SET SACA_CREDITOS = SACA_CREDITOS + (:MONTO * :sumar)
          WHERE (CAJA_ID = :CAJA) AND
            (SACA_FECHA = :fecha);
      END
    /*  Recorra los registros de fechas posteriores actualizando el saldo
        anterior */
    UPDATE SALDO_CAJA
        SET SACA_SALDO = SACA_SALDO - (:MONTO * :sumar)
        WHERE (CAJA_ID = :CAJA) AND
            (SACA_FECHA > :fecha);
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER TRIGGER MOVIMIENTO_CAJA_AD
AS
BEGIN
  /* actualice el saldo */
  execute procedure sume_saldo_caja(old.caja_id, old.moca_fecha, old.moca_debitos, 'S');
  execute procedure reste_saldo_caja(old.caja_id, old.moca_fecha, old.moca_creditos, 'S');
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER TRIGGER MOVIMIENTO_CAJA_AI
AS
BEGIN
  /* actualice SALDO EN LA CAJA */
  execute procedure sume_saldo_caja(new.caja_id, new.moca_fecha, new.moca_debitos, 'N');
  execute procedure reste_saldo_caja(new.caja_id, new.moca_fecha, new.moca_creditos, 'N');
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER TRIGGER MOVIMIENTO_CAJA_AU
AS
BEGIN
  /* deshaga lo viejo */
  execute procedure sume_saldo_caja(old.caja_id, old.moca_fecha, old.moca_debitos, 'S');
  execute procedure reste_saldo_caja(old.caja_id, old.moca_fecha, old.moca_creditos, 'S');
  /* actualice SALDO DEL BANCO */
  execute procedure sume_saldo_caja(new.caja_id, new.moca_fecha, new.moca_debitos, 'N');
  execute procedure reste_saldo_caja(new.caja_id, new.moca_fecha, new.moca_creditos, 'N');

/* SI QUEDO EN CEROS EL MONTO ELIMINE EL REGISTRO */
if ((new.moca_debitos = 0) and (new.moca_creditos = 0)) then
    DELETE FROM movimiento_caja WHERE MOCA_ID = new.moca_id;
END
^

SET TERM ; ^



/* 20090606 */
/* detallado en devoluciones el costo quedaba positivo */
SET TERM ^ ;

CREATE OR ALTER PROCEDURE REP_UTILIDAD_VENTAS(
    TIPO INTEGER,
    DETALLE CHAR(1),
    FECINI DATE,
    FECFIN DATE,
    ARTINI VARCHAR(15),
    ARTFIN VARCHAR(15),
    GRPINI VARCHAR(3),
    GRPFIN VARCHAR(3),
    ORDEN CHAR(1),
    AGRUPA CHAR(1),
    CEROS CHAR(1),
    SUBEMPRESA INTEGER)
RETURNS (
    ARTICULO VARCHAR(15),
    DESCRIPCION VARCHAR(60),
    CODGRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    CODSUBG VARCHAR(3),
    NOMSUBG VARCHAR(30),
    CODMARC VARCHAR(3),
    NOMMARC VARCHAR(30),
    UNIDAD VARCHAR(8),
    CANTIDAD NUMERIC(18,4),
    BASE NUMERIC(18,4),
    COSTO NUMERIC(18,4),
    UTILIDAD NUMERIC(18,4),
    PORC NUMERIC(9,2),
    IVA NUMERIC(18,4),
    CONSUMO NUMERIC(18,4),
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    TIPODOC INTEGER)
AS
DECLARE VARIABLE COSTOUNIT NUMERIC(18,4);
DECLARE VARIABLE CANTDET NUMERIC(18,4);
declare variable CODINI VARCHAR(15);
declare variable CODFIN VARCHAR(15);
declare variable DESINI VARCHAR(15);
declare variable DESFIN VARCHAR(15);
declare variable MARINI VARCHAR(3);
declare variable MARFIN VARCHAR(3);
declare variable UOM VARCHAR(20);
declare variable NUMROWS INTEGER;
BEGIN
if (ORDEN = 'C') then
    BEGIN
    CODINI = ARTINI;
    CODFIN = ARTFIN;
    DESINI = '';
    DESFIN = 'zz';
    END
ELSE
    BEGIN
    DESINI = ARTINI;
    DESFIN = ARTFIN;
    CODINI = '';
    CODFIN = 'zz';
    END
if (AGRUPA = 'G') then
    BEGIN
    MARINI = '';
    MARFIN = 'zz';
    END
ELSE
    if (AGRUPA = 'M') then
        BEGIN
        MARINI = GRPINI;
        MARFIN = GRPFIN;
        GRPINI = '';
        GRPFIN = 'zz';
        END
    ELSE
        BEGIN
        MARINI = '';
        MARFIN = 'zz';
        GRPINI = '';
        GRPFIN = 'zz';
        END
EXECUTE PROCEDURE lee_configuracion ('FACTURACION', 'ARTICULOS', 'SUGERIR PRECIOS CON PORCENTAJE DE MARGEN O UTILIDAD') returning_values (:UOM);
if (DETALLE = 'N') then
    BEGIN
    if (BIN_AND(TIPO, 1) <> 0) then
        BEGIN
        TIPODOC = 31;
        /* BORRA LA TABLA AUXILIAR */
        DELETE FROM reportes_aux WHERE REPA_ID = 2 AND REPA_USER = USER;

        FOR SELECT MAX(D.ARTI_COD), SUM(FADE_CANT * FADE_FACTOR), SUM((FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO)*FACT_FACTOR), SUM(FADE_IVAMONTO*FACT_FACTOR), SUM(FADE_CONSUMO),
            MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD)
            FROM FACTURAS_DETALLE D, FACTURAS F, PREFIJOS P, ARTICULO A
            WHERE F.FACT_ID = D.FACT_ID AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND D.ARTI_COD = A.arti_cod AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            FACT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) and substring(a.arti_cod from 1 FOR 2) <> '.t'
            GROUP BY D.ARTI_COD
            INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,
            :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
            DO
            BEGIN
            COSTO = 0;
            FOR SELECT FADE_CANT * FADE_FACTOR, FACT_FECHA FROM FACTURAS_DETALLE D, FACTURAS F, PREFIJOS P
                WHERE F.FACT_ID = D.FACT_ID AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND
                FACT_ANULADO = 'N' AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                and D.ARTI_COD = :articulo  INTO :cantdet, :fecha
                DO
                BEGIN
                EXECUTE PROCEDURE COSTO_PROMEDIO(:ARTICULO, :FECHA) returning_values (:costounit);
                COSTO = COSTO + costounit * cantdet;
                END
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            if (CEROS = 'S') then
                INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (2, USER, :ARTICULO);
            SUSPEND;
            END /* FOR */
        if (CEROS = 'S') then
            BEGIN
            COSTO = 0;
            UTILIDAD = 0;
            PORC = 0;
            /* agregue los articulos sin factura */
            FOR SELECT ARTI_COD, 0, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND
                    A.ARTI_DES <= :DESFIN AND A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND
                    (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN)))
                INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,:DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                DO
                BEGIN
                SELECT COUNT(REPA_ARTICULO) FROM REPORTES_AUX WHERE REPA_ID = 2 AND REPA_USER = USER AND REPA_ARTICULO = :articulo INTO :numrows;
                if (numrows = 0) then
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        END
    if (BIN_AND(TIPO, 2) <> 0) then
        BEGIN
        TIPODOC = 32;
        /* BORRA LA TABLA AUXILIAR */
        DELETE FROM reportes_aux WHERE REPA_ID = 2 AND REPA_USER = USER;

        FOR SELECT MAX(D.ARTI_COD), SUM(RVDE_CANT * RVDE_FACTOR), SUM(RVDE_TOTAL-RVDE_IVAMONTO-RVDE_CONSUMO), SUM(RVDE_IVAMONTO), SUM(RVDE_CONSUMO),
            MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD)
            FROM REMISIONES_VENTA_DETALLE D, REMISIONES_VENTA R, PREFIJOS P, ARTICULO A
            WHERE R.REVT_ID = D.REVT_ID AND P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = 32 AND D.ARTI_COD = A.arti_cod AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            REVT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY D.ARTI_COD
            INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,
            :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
            DO
            BEGIN
            COSTO = 0;
            FOR SELECT RVDE_CANT * RVDE_FACTOR, REVT_FECHA FROM remisiones_venta_detalle D, remisiones_venta F, PREFIJOS P
                WHERE F.revt_id = D.revt_id AND REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN AND
                REVT_ANULADO = 'N' AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 32 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                and D.ARTI_COD = :articulo  INTO :cantdet, :fecha
                DO
                BEGIN
                EXECUTE PROCEDURE COSTO_PROMEDIO(:ARTICULO, :FECHA) returning_values (:costounit);
                COSTO = COSTO + costounit * cantdet;
                END
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            if (CEROS = 'S') then
                INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (2, USER, :ARTICULO);
            SUSPEND;
            END /* FOR */
        if (CEROS = 'S') then
            BEGIN
            COSTO = 0;
            UTILIDAD = 0;
            PORC = 0;
            /* agregue los articulos sin factura */
            FOR SELECT ARTI_COD, 0, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND
                    A.ARTI_DES <= :DESFIN AND A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND
                    (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN)))
                INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,:DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                DO
                BEGIN
                SELECT COUNT(REPA_ARTICULO) FROM REPORTES_AUX WHERE REPA_ID = 2 AND REPA_USER = USER AND REPA_ARTICULO = :articulo INTO :numrows;
                if (numrows = 0) then
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        END
    if (BIN_AND(TIPO, 4) <> 0) then
        BEGIN
        TIPODOC = 33;
        /* BORRA LA TABLA AUXILIAR */
        DELETE FROM reportes_aux WHERE REPA_ID = 2 AND REPA_USER = USER;

        FOR SELECT MAX(D.ARTI_COD), SUM(DVDE_CANT * DVDE_FACTOR), SUM((DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO)*DEVT_FACTOR), SUM(DVDE_IVAMONTO*DEVT_FACTOR), SUM(DVDE_CONSUMO),
            MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD)
            FROM devoluciones_ventas_detalle D, DEVOLUCIONES_VENTAS V, PREFIJOS P, ARTICULO A
            WHERE V.DEVT_ID = D.DEVT_ID AND P.PREF_PRE = V.PREF_PRE AND P.TIDO_COD = 33 AND D.ARTI_COD = A.arti_cod AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            DEVT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY D.ARTI_COD
            INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,
            :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
            DO
            BEGIN
            COSTO = 0;
            FOR SELECT DVDE_CANT * DVDE_FACTOR, DEVT_FECHA FROM devoluciones_ventas_detalle D, devoluciones_ventas F, PREFIJOS P
                WHERE F.devt_id = D.devt_id AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND
                DEVT_ANULADO = 'N' AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 33 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                and D.ARTI_COD = :articulo  INTO :cantdet, :fecha
                DO
                BEGIN
                EXECUTE PROCEDURE COSTO_PROMEDIO(:ARTICULO, :FECHA) returning_values (:costounit);
                COSTO = COSTO + costounit * cantdet;
                END
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            else
                CANTIDAD = CANTIDAD * -1;
            if (BASE IS NULL) then
                BASE = 0;
            else
                BASE = BASE * -1;
            if (IVA IS NULL) then
                IVA = 0;
            else
                IVA = IVA * -1;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            else
                CONSUMO = CONSUMO * -1;
            COSTO = costo * -1;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            if (CEROS = 'S') then
                INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (2, USER, :ARTICULO);
            SUSPEND;
            END /* FOR */
        if (CEROS = 'S') then
            BEGIN
            COSTO = 0;
            UTILIDAD = 0;
            PORC = 0;
            /* agregue los articulos sin factura */
            FOR SELECT ARTI_COD, 0, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND
                    A.ARTI_DES <= :DESFIN AND A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND
                    (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN)))
                INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,:DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                DO
                BEGIN
                SELECT COUNT(REPA_ARTICULO) FROM REPORTES_AUX WHERE REPA_ID = 2 AND REPA_USER = USER AND REPA_ARTICULO = :articulo INTO :numrows;
                if (numrows = 0) then
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        END
    if (BIN_AND(TIPO, 8) <> 0) then
        BEGIN
        TIPODOC = 34;
        /* BORRA LA TABLA AUXILIAR */
        DELETE FROM reportes_aux WHERE REPA_ID = 2 AND REPA_USER = USER;

        FOR SELECT MAX(D.ARTI_COD), SUM(PEDE_CANT * PEDE_FACTOR), SUM((PEDE_TOTAL-PEDE_IVAMONTO-PEDE_CONSUMO)*PEDI_FACTOR), SUM(PEDE_IVAMONTO*PEDI_FACTOR), SUM(PEDE_CONSUMO),
            MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD)
            FROM PEDIDOS_DETALLE D, PEDIDOS P, PREFIJOS R, ARTICULO A
            WHERE P.PEDI_ID = D.PEDI_ID AND P.PREF_PRE = R.PREF_PRE AND R.TIDO_COD = 34 AND D.ARTI_COD = A.arti_cod AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            PEDI_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY D.ARTI_COD
            INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,
            :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
            DO
            BEGIN
            COSTO = 0;
            FOR SELECT PEDE_CANT * PEDE_FACTOR, PEDI_FECHA FROM pedidos_detalle D, pedidos F, PREFIJOS P
                WHERE F.pedi_id = D.pedi_id AND PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND
                PEDI_ANULADO = 'N' AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                and D.ARTI_COD = :articulo  INTO :cantdet, :fecha
                DO
                BEGIN
                EXECUTE PROCEDURE COSTO_PROMEDIO(:ARTICULO, :FECHA) returning_values (:costounit);
                COSTO = COSTO + costounit * cantdet;
                END
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            if (CEROS = 'S') then
                INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (2, USER, :ARTICULO);
            SUSPEND;
            END /* FOR */
        if (CEROS = 'S') then
            BEGIN
            COSTO = 0;
            UTILIDAD = 0;
            PORC = 0;
            /* agregue los articulos sin factura */
            FOR SELECT ARTI_COD, 0, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND
                    A.ARTI_DES <= :DESFIN AND A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND
                    (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN)))
                INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,:DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                DO
                BEGIN
                SELECT COUNT(REPA_ARTICULO) FROM REPORTES_AUX WHERE REPA_ID = 2 AND REPA_USER = USER AND REPA_ARTICULO = :articulo INTO :numrows;
                if (numrows = 0) then
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        END
    if (BIN_AND(TIPO, 16) <> 0) then
        BEGIN
        TIPODOC = 35;
        /* BORRA LA TABLA AUXILIAR */
        DELETE FROM reportes_aux WHERE REPA_ID = 2 AND REPA_USER = USER;

        FOR SELECT MAX(D.ARTI_COD), SUM(CTDE_CANT * CTDE_FACTOR), SUM((CTDE_TOTAL-CTDE_IVAMONTO-CTDE_CONSUMO)*COTI_FACTOR), SUM(CTDE_IVAMONTO), SUM(CTDE_CONSUMO),
            MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD)
            FROM COTIZACIONES_DETALLE D, COTIZACIONES C, PREFIJOS P, ARTICULO A
            WHERE C.COTI_ID = D.COTI_ID AND P.PREF_PRE = C.PREF_PRE AND P.TIDO_COD = 35 AND D.ARTI_COD = A.arti_cod AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND COTI_FECHA >= :FECINI AND COTI_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            COTI_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY D.ARTI_COD
            INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,
            :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
            DO
            BEGIN
            COSTO = 0;
            FOR SELECT CTDE_CANT * CTDE_FACTOR, COTI_FECHA FROM cotizaciones_detalle D, cotizaciones F, PREFIJOS P
                WHERE F.coti_id = D.coti_id AND COTI_FECHA >= :FECINI AND COTI_FECHA <= :FECFIN AND
                COTI_ANULADO = 'N' AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                and D.ARTI_COD = :articulo  INTO :cantdet, :fecha
                DO
                BEGIN
                EXECUTE PROCEDURE COSTO_PROMEDIO(:ARTICULO, :FECHA) returning_values (:costounit);
                COSTO = COSTO + costounit * cantdet;
                END
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            if (CEROS = 'S') then
                INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (2, USER, :ARTICULO);
            SUSPEND;
            END /* FOR */
        if (CEROS = 'S') then
            BEGIN
            COSTO = 0;
            UTILIDAD = 0;
            PORC = 0;
            /* agregue los articulos sin factura */
            FOR SELECT ARTI_COD, 0, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND
                    A.ARTI_DES <= :DESFIN AND A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND
                    (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN)))
                INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,:DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                DO
                BEGIN
                SELECT COUNT(REPA_ARTICULO) FROM REPORTES_AUX WHERE REPA_ID = 2 AND REPA_USER = USER AND REPA_ARTICULO = :articulo INTO :numrows;
                if (numrows = 0) then
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        END
    END
ELSE
    BEGIN
    if (BIN_AND(TIPO, 1) <> 0) then
        BEGIN
        TIPODOC = 31;
        FOR SELECT F.PREF_PRE, FACT_NUMERO, FACT_FECHA, D.ARTI_COD, FADE_CANT * FADE_FACTOR, (FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO)*FACT_FACTOR, FADE_IVAMONTO*FACT_FACTOR, FADE_CONSUMO,
            ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
            FROM FACTURAS F, FACTURAS_DETALLE D, PREFIJOS P, ARTICULO A
            WHERE F.FACT_ID = D.FACT_ID AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND D.ARTI_COD = A.arti_cod AND
                A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
                A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND FACT_FECHA >= :FECINI AND
                (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
                FACT_FECHA <= :FECFIN AND FACT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) and substring(a.arti_cod from 1 FOR 2) <> '.t'
            ORDER BY D.ARTI_COD, FACT_FECHA, F.FACT_ID, FADE_ITEM
            INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,
                :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
            DO
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            EXECUTE PROCEDURE costo_promedio (:ARTICULO, :FECHA) RETURNING_VALUES (:COSTOUNIT);
            COSTO = COSTOUNIT * CANTIDAD;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            SUSPEND;
            END
        END
    if (BIN_AND(TIPO, 2) <> 0) then
        BEGIN
        TIPODOC = 32;
        FOR SELECT R.PREF_PRE, REVT_NUMERO, REVT_FECHA, D.ARTI_COD, RVDE_CANT * RVDE_FACTOR, RVDE_TOTAL-RVDE_IVAMONTO-RVDE_CONSUMO, RVDE_IVAMONTO, RVDE_CONSUMO,
            ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
            FROM REMISIONES_VENTA R, REMISIONES_VENTA_DETALLE D, PREFIJOS P, ARTICULO A
            WHERE R.REVT_ID = D.REVT_ID AND P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = 32 AND D.ARTI_COD = A.arti_cod AND
                A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
                A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN AND
                (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
                REVT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            ORDER BY D.ARTI_COD, REVT_FECHA, R.REVT_ID, RVDE_ITEM
            INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,
                :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
            DO
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            EXECUTE PROCEDURE costo_promedio (:ARTICULO, :FECHA) RETURNING_VALUES (:COSTOUNIT);
            COSTO = COSTOUNIT * CANTIDAD;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            SUSPEND;
            END
        END
    if (BIN_AND(TIPO, 4) <> 0) then
        BEGIN
        TIPODOC = 33;
        FOR SELECT V.PREF_PRE, DEVT_NUMERO, DEVT_FECHA, D.ARTI_COD, DVDE_CANT * DVDE_FACTOR, (DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO)*DEVT_FACTOR, DVDE_IVAMONTO*DEVT_FACTOR, DVDE_CONSUMO,
            ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
            FROM DEVOLUCIONES_VENTAS V, DEVOLUCIONES_VENTAS_DETALLE D, PREFIJOS P, ARTICULO A
            WHERE V.DEVT_ID = D.DEVT_ID AND P.PREF_PRE = V.PREF_PRE AND P.TIDO_COD = 33 AND D.ARTI_COD = A.arti_cod AND
                A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
                A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND
                (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
                DEVT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            ORDER BY D.ARTI_COD, DEVT_FECHA, V.DEVT_ID, DVDE_ITEM
            INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,
                :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
            DO
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            EXECUTE PROCEDURE costo_promedio (:ARTICULO, :FECHA) RETURNING_VALUES (:COSTOUNIT);
            BASE = BASE * -1;
            CANTIDAD = CANTIDAD * -1;
            IVA = IVA * -1;
            CONSUMO = CONSUMO * -1;
            COSTO = COSTOUNIT * CANTIDAD;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            SUSPEND;
            END
        END
    if (BIN_AND(TIPO, 8) <> 0) then
        BEGIN
        TIPODOC = 34;
        FOR SELECT P.PREF_PRE, PEDI_NUMERO, PEDI_FECHA, D.ARTI_COD, PEDE_CANT * PEDE_FACTOR, (PEDE_TOTAL-PEDE_IVAMONTO-PEDE_CONSUMO)*PEDI_FACTOR, PEDE_IVAMONTO*PEDI_FACTOR, PEDE_CONSUMO,
            ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD 
            FROM PEDIDOS P, PEDIDOS_DETALLE D, PREFIJOS R, ARTICULO A
            WHERE P.PEDI_ID = D.PEDI_ID AND P.PREF_PRE = R.PREF_PRE AND R.TIDO_COD = 34 AND D.ARTI_COD = A.arti_cod AND
                A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
                A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND
                (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
                PEDI_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            ORDER BY D.ARTI_COD, PEDI_FECHA, P.PEDI_ID, PEDE_ITEM
            INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,
                :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
            DO
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            EXECUTE PROCEDURE costo_promedio (:ARTICULO, :FECHA) RETURNING_VALUES (:COSTOUNIT);
            COSTO = COSTOUNIT * CANTIDAD;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            SUSPEND;
            END
        END
    if (BIN_AND(TIPO, 16) <> 0) then
        BEGIN
        TIPODOC = 35;
        FOR SELECT C.PREF_PRE, COTI_NUMERO, COTI_FECHA, D.ARTI_COD, CTDE_CANT * CTDE_FACTOR, (CTDE_TOTAL-CTDE_IVAMONTO-CTDE_CONSUMO)*COTI_FACTOR, CTDE_IVAMONTO*COTI_FACTOR, CTDE_CONSUMO,
            ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD 
            FROM COTIZACIONES C, COTIZACIONES_DETALLE D, PREFIJOS P, ARTICULO A
            WHERE C.COTI_ID = D.COTI_ID AND P.PREF_PRE = C.PREF_PRE AND P.TIDO_COD = 35 AND D.ARTI_COD = A.arti_cod AND
                A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
                A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND COTI_FECHA >= :FECINI AND COTI_FECHA <= :FECFIN AND
                (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
                COTI_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            ORDER BY D.ARTI_COD, COTI_FECHA, C.COTI_ID, CTDE_ITEM
            INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,
                :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
            DO
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            EXECUTE PROCEDURE costo_promedio (:ARTICULO, :FECHA) RETURNING_VALUES (:COSTOUNIT);
            COSTO = COSTOUNIT * CANTIDAD;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            SUSPEND;
            END
        END
    END
END
^

SET TERM ; ^



/* 20090608 */
/* NO INICIALIZABA EL TOTAL DEL PESO Y VOLUMEN */
SET TERM ^ ;

CREATE OR ALTER PROCEDURE IMPR_SALIDA(
    ID INTEGER)
RETURNS (
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    CONCEPTO VARCHAR(60),
    REFER VARCHAR(60),
    CODBODEGA VARCHAR(2),
    NOMBODEGA VARCHAR(30),
    NOMTERCERO VARCHAR(60),
    OBS BLOB SUB_TYPE 0 SEGMENT SIZE 80,
    ITEM INTEGER,
    ARTICULO VARCHAR(15),
    CODBAR VARCHAR(15),
    ARTIDES VARCHAR(60),
    CANT NUMERIC(18,4),
    UNIDAD VARCHAR(8),
    BODITEM VARCHAR(2),
    STAND VARCHAR(15),
    COSTO NUMERIC(18,2),
    IVAPORC NUMERIC(9,2),
    IVAMONTO NUMERIC(18,2),
    CONSUMO NUMERIC(18,2),
    TOTAL NUMERIC(18,2),
    TOTALITEM NUMERIC(18,2),
    PRECIO NUMERIC(18,2),
    LOTE VARCHAR(15),
    PESOUNIT NUMERIC(18,4),
    PESOTOT NUMERIC(18,4),
    VOLUMUNIT NUMERIC(18,4),
    VOLUMTOT NUMERIC(18,4),
    TOTALDOC NUMERIC(18,2),
    ULTIMO NUMERIC(18,2),
    TOTALULT NUMERIC(18,2),
    CONSUMODOC NUMERIC(18,2),
    TOTALMASIMP NUMERIC(18,2))
AS
declare variable IMPTOS CHAR(1);
declare variable LARGO NUMERIC(18,4);
declare variable ANCHO NUMERIC(18,4);
declare variable ALTO NUMERIC(18,4);
declare variable LISTA CHAR(3);
BEGIN
  PESOTOT = 0;
  VOLUMTOT = 0;
  SELECT PREF_PRE, SALI_NUMERO, SALI_FECHA, SALI_CONC, SALI_REFER, S.BODE_COD, BODE_NOM, SALI_NOMTERC, SALI_IMPTOS, SALI_OBS
    FROM SALIDAS S, BODEGA B WHERE S.BODE_COD = B.BODE_COD AND S.SALI_ID = :ID into
    :PREF, :NUMERO, :FECHA, :CONCEPTO, :REFER, :CODBODEGA, :NOMBODEGA, :NOMTERCERO, :IMPTOS, :OBS;
  SELECT SUM(SADE_TOTAL), SUM(SADE_IVAMONTO), SUM(SADE_CONSUMO*SADE_CANT*SADE_FACTOR) FROM SALIDAS_DETALLE
    WHERE SALI_ID = :ID INTO :TOTALDOC, :IVAMONTO, :CONSUMODOC;
  TOTALMASIMP = TOTALDOC + CONSUMODOC;
  if (IMPTOS = 'N') then
    TOTALDOC = TOTALDOC - IVAMONTO;
  FOR SELECT SADE_ITEM, A.ARTI_COD, SADE_CODBAR, SADE_DESC, SADE_CANT, SADE_UNIDAD, BODE_COD, SADE_COSTO, SADE_IVAPORC, SADE_IVAMONTO, SADE_CONSUMO, SADE_TOTAL, SADE_LOTE,
    (ARTI_PESO / 1000 * SADE_CANT * SADE_FACTOR), (ARTI_LARGO / 100 * SADE_FACTOR), (ARTI_ANCHO / 100 * SADE_FACTOR), (ARTI_ALTO / 100 * SADE_FACTOR)
    FROM SALIDAS_DETALLE D, ARTICULO A
    WHERE D.ARTI_COD = A.ARTI_COD AND D.SALI_ID = :ID
    ORDER BY SADE_ITEM
    INTO :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :BODITEM, :COSTO, :IVAPORC, :IVAMONTO, :CONSUMO, :TOTAL, :LOTE, :PESOUNIT, :LARGO, :ANCHO, :ALTO
    DO
      BEGIN
      EXECUTE PROCEDURE LEE_CONFIGURACION('INVENTARIO','DOCUMENTOS','CODIGO DE LISTA DE PRECIOS A IMPRIMIR EN DOCUMENTOS') returning_values (:LISTA);
      if (NOT lista IS NULL) then
          SELECT PRAR_FIJO FROM PRECIOS_ARTICULO WHERE ARTI_COD = :articulo AND LIPR_COD = :LISTA INTO :PRECIO;
      EXECUTE PROCEDURE ultimo_costo(:articulo, :fecha,  :unidad) returning_values (:ultimo);
      TOTALULT = CANT * ULTIMO;
      TOTALITEM = COSTO + IVAMONTO + CONSUMO;
      if (IMPTOS = 'N') then
        TOTAL = TOTAL - IVAMONTO;
      if (PESOUNIT IS NULL) then
        PESOUNIT = 0;
      PESOTOT = PESOTOT + PESOUNIT;
      VOLUMUNIT = ANCHO * ALTO * LARGO;
      volumunit = VOLUMUNIT * CANT;
      if (VOLUMUNIT IS NULL) then
        VOLUMUNIT = 0;
      VOLUMTOT = VOLUMTOT + VOLUMUNIT;
      SELECT STAND_COD FROM STANDS WHERE ARTI_COD = :ARTICULO AND STAND_BODEGA = :boditem INTO :stand;
      SUSPEND;
      END
END
^

SET TERM ; ^



/* 20090608b */
/* NO INCLUIA LOS MOVIMIENTOS DEL ULTIMO DIA */
SET TERM ^ ;

CREATE OR ALTER PROCEDURE REP_COMPROBANTES_ARTICULO(
    TIPODOC INTEGER,
    DETALLE CHAR(1),
    FECINI DATE,
    FECFIN DATE,
    ARTINI VARCHAR(20),
    ARTFIN VARCHAR(20),
    GRPINI VARCHAR(2),
    GRPFIN VARCHAR(2),
    ORDEN CHAR(1),
    SUBEMPRESA INTEGER)
RETURNS (
    CODIGO VARCHAR(15),
    NOMBRE VARCHAR(60),
    UNIDAD VARCHAR(8),
    CODGRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    CODSUBG VARCHAR(3),
    NOMSUBG VARCHAR(30),
    CODMARC VARCHAR(3),
    NOMMARC VARCHAR(30),
    CODBOD VARCHAR(2),
    NOMTIPO VARCHAR(30),
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    CONCEPTO VARCHAR(60),
    NIT VARCHAR(20),
    NOMTERC VARCHAR(60),
    CONS INTEGER,
    CANT NUMERIC(18,4),
    COSTO NUMERIC(18,2),
    COSTOTOT NUMERIC(18,2))
AS
declare variable ENT CHAR(1);
declare variable ENTRADAS NUMERIC(18,4);
declare variable COSTOENT NUMERIC(18,2);
declare variable SALIDAS NUMERIC(18,4);
declare variable COSTOSAL NUMERIC(18,2);
declare variable CODINI VARCHAR(20);
declare variable CODFIN VARCHAR(20);
declare variable DESINI VARCHAR(20);
declare variable DESFIN VARCHAR(20);
BEGIN
  SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = :TIPODOC INTO :NOMTIPO;
  if (ORDEN = 'C') then
    BEGIN
    CODINI = ARTINI;
    CODFIN = ARTFIN;
    DESINI = '';
    DESFIN = 'zz';
    END
  ELSE
    BEGIN
    DESINI = ARTINI;
    DESFIN = ARTFIN;
    CODINI = '';
    CODFIN = 'zz';
    END
  FOR
    SELECT ARTI_COD, ARTI_DES, ARTI_UNIDAD, A.GRUP_COD, A.SUBG_COD, A.MARC_COD
      FROM ARTICULO A
      WHERE ARTI_COD >= :CODINI AND ARTI_COD <= :CODFIN AND A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :GRPFIN AND ARTI_DES >= :DESINI AND ARTI_DES <= :DESFIN
      INTO :CODIGO, :NOMBRE, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
      DO
        BEGIN
        NOMMARC = '';
        NOMSUBG = '';
        SELECT GRUP_NOM FROM GRUPO WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
        SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
        SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
        if (DETALLE = 'N') then
            BEGIN
            CANT = 0;
            COSTOTOT = 0;
            /* SUME LAS ENTRADAS */
            SELECT SUM(MVAR_CANT), SUM(MVAR_CANT * MVAR_COSTO) FROM MOVIMIENTO_ARTICULO M, PREFIJOS P
              WHERE P.PREF_PRE = M.MVAR_PREF AND P.TIDO_COD = M.mvar_tipodoc AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA)) AND
              (MVAR_FECHA >= :FECINI) AND (MVAR_FECHA <= :FECFIN) AND
              (ARTI_COD = :CODIGO) AND (MVAR_ENTRADA = 'S') AND (MVAR_TIPODOC = :TIPODOC)
              INTO :ENTRADAS, :COSTOENT;
            if (ENTRADAS IS NULL) then
              ENTRADAS = 0;
            if (COSTOENT IS NULL) then
              COSTOENT = 0;
            /* CALCULE LAS SALIDAS A COSTO PROMEDIO */
            SALIDAS = 0;
            COSTOSAL = 0;
            FOR SELECT MVAR_CANT, MVAR_FECHA
                FROM MOVIMIENTO_ARTICULO M, PREFIJOS P
                WHERE P.PREF_PRE = M.MVAR_PREF AND P.TIDO_COD = M.mvar_tipodoc AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA)) AND
                (MVAR_FECHA >= :FECINI) AND (MVAR_FECHA <= :FECFIN) AND
                (ARTI_COD = :CODIGO) AND (MVAR_ENTRADA = 'N') AND (MVAR_TIPODOC = :TIPODOC)
                INTO :CANT, :FECHA
                DO
                    BEGIN
                    EXECUTE PROCEDURE COSTO_PROMEDIO(:CODIGO, :FECHA) returning_values (:COSTO);
                    SALIDAS = SALIDAS + CANT;
                    COSTOSAL = COSTOSAL + (COSTO * CANT);
                    END
            if (SALIDAS IS NULL) then
              SALIDAS = 0;
            if (COSTOSAL IS NULL) then
              COSTOSAL = 0;
            if (ENTRADAS > 0) then
                CANT = ENTRADAS;
            if (SALIDAS > 0) then
                CANT = SALIDAS;
            if (COSTOENT > 0) then
                COSTOTOT = COSTOENT;
            if (COSTOSAL > 0) then
                COSTOTOT = COSTOSAL;
            if (CANT > 0) then
                COSTO = COSTOTOT / CANT;
            ELSE
                COSTO = 0;
            if (CANT <> 0) then
                SUSPEND;
            END
        ELSE
            BEGIN
            FOR SELECT MVAR_ENTRADA, MVAR_PREF, MVAR_NUMERO, MVAR_CANT, MVAR_COSTO, MVAR_CONC, MVAR_FECHA, M.TERC_NIT, TERC_NOM, MVAR_CONS, BODE_COD
                FROM MOVIMIENTO_ARTICULO M, TIPO_DOCUMENTO TD, PREFIJOS P
                LEFT OUTER JOIN TERCEROS T ON (M.TERC_NIT = T.TERC_NIT)
                WHERE TD.TIDO_COD = MVAR_TIPODOC AND P.PREF_PRE = M.MVAR_PREF AND P.TIDO_COD = M.mvar_tipodoc AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA)) AND
                (MVAR_FECHA >= :FECINI) AND (MVAR_FECHA <= :FECFIN) AND (ARTI_COD = :CODIGO) AND (MVAR_TIPODOC = :TIPODOC)
                ORDER BY MVAR_FECHA, MVAR_CONS
                INTO :ENT, :PREFIJO, :NUMERO, :CANT, :COSTO, :CONCEPTO, :FECHA, :NIT, :NOMTERC, :CONS, :CODBOD
                DO
                    BEGIN
                    if (ENT = 'S') then
                        BEGIN
                        COSTOTOT = (CANT * COSTO);
                        end
                    ELSE
                        BEGIN
                        EXECUTE PROCEDURE COSTO_PROMEDIO(:CODIGO, :FECHA) returning_values (:COSTO);
                        COSTOTOT = (CANT * COSTO);
                        END
                    SUSPEND;
                    END
            END
        END
END
^

SET TERM ; ^



/* 20090609 */
/* MEJORA EL RENDIMIENTO DE LOS RECALCULOS */
SET TERM ^ ;

CREATE OR ALTER PROCEDURE RESTE_SALDO_CAJA(
    CAJA INTEGER,
    FECHA DATE,
    MONTO NUMERIC(18,2),
    ANULAR CHAR(1))
AS
DECLARE VARIABLE saldo NUMERIC(15,4);
declare variable sumar integer;
BEGIN
if (MONTO <> 0) then
  BEGIN
  if (ANULAR = 'S') then
    sumar = -1;
  else
    sumar = 1;
  /*  Si en SALDO_CAJA existe el registro CAJA-fecha le suma
        a los debitos el monto, si no, crea un nuevo registro       */
  IF (NOT EXISTS (SELECT CAJA_ID FROM SALDO_CAJA WHERE (CAJA_ID = :CAJA) AND
      (SACA_FECHA = :FECHA))) THEN
      BEGIN
      /*  No existe movimiento en esa fecha, traiga el saldo anterior y
          registre uno nuevo */
      EXECUTE PROCEDURE SALDO_EN_CAJA(:CAJA, :fecha)
        RETURNING_VALUES :saldo;
      INSERT INTO SALDO_CAJA (CAJA_ID, SACA_FECHA,
        SACA_DEBITOS, SACA_CREDITOS, SACA_SALDO)
        VALUES (:CAJA, :FECHA, 0, (:MONTO * :sumar), :saldo);
      END /* if existe */
  ELSE
      BEGIN
      /* Ya existe un registro en la fecha */
      UPDATE SALDO_CAJA
          SET SACA_CREDITOS = SACA_CREDITOS + (:MONTO * :sumar)
          WHERE (CAJA_ID = :CAJA) AND
            (SACA_FECHA = :fecha);
      END
    /*  Recorra los registros de fechas posteriores actualizando el saldo
        anterior */
    UPDATE SALDO_CAJA
        SET SACA_SALDO = SACA_SALDO - (:MONTO * :sumar)
        WHERE (CAJA_ID = :CAJA) AND
            (SACA_FECHA > :fecha);
  END
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER TRIGGER MOVIMIENTO_CAJA_AD
AS
BEGIN
  /* actualice el saldo */
  execute procedure sume_saldo_caja(old.caja_id, old.moca_fecha, old.moca_debitos, 'S');
  execute procedure reste_saldo_caja(old.caja_id, old.moca_fecha, old.moca_creditos, 'S');
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER TRIGGER MOVIMIENTO_CAJA_AI
AS
BEGIN
  /* actualice SALDO EN LA CAJA */
  execute procedure sume_saldo_caja(new.caja_id, new.moca_fecha, new.moca_debitos, 'N');
  execute procedure reste_saldo_caja(new.caja_id, new.moca_fecha, new.moca_creditos, 'N');
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER TRIGGER MOVIMIENTO_CAJA_AU
AS
BEGIN
  /* deshaga lo viejo */
  execute procedure sume_saldo_caja(old.caja_id, old.moca_fecha, old.moca_debitos, 'S');
  execute procedure reste_saldo_caja(old.caja_id, old.moca_fecha, old.moca_creditos, 'S');
  /* actualice SALDO DEL BANCO */
  execute procedure sume_saldo_caja(new.caja_id, new.moca_fecha, new.moca_debitos, 'N');
  execute procedure reste_saldo_caja(new.caja_id, new.moca_fecha, new.moca_creditos, 'N');

/* SI QUEDO EN CEROS EL MONTO ELIMINE EL REGISTRO */
if ((new.moca_debitos = 0) and (new.moca_creditos = 0)) then
    DELETE FROM movimiento_caja WHERE MOCA_ID = new.moca_id;
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER PROCEDURE SUME_SALDO_CAJA(
    CAJA INTEGER,
    FECHA DATE,
    MONTO NUMERIC(18,2),
    ANULAR CHAR(1))
AS
DECLARE VARIABLE saldo NUMERIC(15,4);
declare variable sumar integer;
BEGIN
if (MONTO <> 0) then
  BEGIN
  if (ANULAR = 'S') then
    sumar = -1;
  else
    sumar = 1;
  /*  Si en SALDO_CAJA existe el registro CAJA-fecha le suma
        a los debitos el monto, si no, crea un nuevo registro       */
  IF (NOT EXISTS (SELECT CAJA_ID FROM SALDO_CAJA WHERE (CAJA_ID = :CAJA) AND
      (SACA_FECHA = :FECHA))) THEN
      BEGIN
      /*  No existe movimiento en esa fecha, traiga el saldo anterior y
          registre uno nuevo */
      EXECUTE PROCEDURE SALDO_EN_CAJA(:CAJA, :fecha)
        RETURNING_VALUES :saldo;
      INSERT INTO SALDO_CAJA (CAJA_ID, SACA_FECHA,
        SACA_DEBITOS, SACA_CREDITOS, SACA_SALDO)
        VALUES (:CAJA, :FECHA, (:MONTO * :sumar), 0, :saldo);
      END /* if existe */
  ELSE
      BEGIN
      /* Ya existe un registro en la fecha */
      UPDATE SALDO_CAJA
          SET SACA_DEBITOS = SACA_DEBITOS + (:MONTO * :sumar)
          WHERE (CAJA_ID = :CAJA) AND
            (SACA_FECHA = :fecha);
      END
    /*  Recorra los registros de fechas posteriores actualizando el saldo
        anterior */
    UPDATE SALDO_CAJA
        SET SACA_SALDO = SACA_SALDO + (:MONTO * :sumar)
        WHERE (CAJA_ID = :CAJA) AND
            (SACA_FECHA > :fecha);
  END
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER TRIGGER MOVIMIENTO_CAJA_AD
AS
BEGIN
  /* actualice el saldo */
  execute procedure sume_saldo_caja(old.caja_id, old.moca_fecha, old.moca_debitos, 'S');
  execute procedure reste_saldo_caja(old.caja_id, old.moca_fecha, old.moca_creditos, 'S');
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER TRIGGER MOVIMIENTO_CAJA_AI
AS
BEGIN
  /* actualice SALDO EN LA CAJA */
  execute procedure sume_saldo_caja(new.caja_id, new.moca_fecha, new.moca_debitos, 'N');
  execute procedure reste_saldo_caja(new.caja_id, new.moca_fecha, new.moca_creditos, 'N');
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER TRIGGER MOVIMIENTO_CAJA_AU
AS
BEGIN
  /* deshaga lo viejo */
  execute procedure sume_saldo_caja(old.caja_id, old.moca_fecha, old.moca_debitos, 'S');
  execute procedure reste_saldo_caja(old.caja_id, old.moca_fecha, old.moca_creditos, 'S');
  /* actualice SALDO DEL BANCO */
  execute procedure sume_saldo_caja(new.caja_id, new.moca_fecha, new.moca_debitos, 'N');
  execute procedure reste_saldo_caja(new.caja_id, new.moca_fecha, new.moca_creditos, 'N');

/* SI QUEDO EN CEROS EL MONTO ELIMINE EL REGISTRO */
if ((new.moca_debitos = 0) and (new.moca_creditos = 0)) then
    DELETE FROM movimiento_caja WHERE MOCA_ID = new.moca_id;
END
^

SET TERM ; ^



/* 20090609b */
/* MEJORA EN RENDIMIENTO Y RESULEVE PROBLEMA DE REPORTE CON CUENTAS CONTABLES */
SET TERM ^ ;

CREATE OR ALTER PROCEDURE REP_ARTICULOS_CONTABIL(
    ARTINI VARCHAR(15),
    ARTFIN VARCHAR(15),
    INACTIVOS CHAR(1),
    ORDEN CHAR(1),
    GRPINI VARCHAR(3),
    GRPFIN VARCHAR(3),
    MARINI VARCHAR(3),
    MARFIN VARCHAR(3),
    SUBINI VARCHAR(3),
    SUBFIN VARCHAR(3))
RETURNS (
    ARTI_COD VARCHAR(15),
    ARTI_DES VARCHAR(60),
    GRUP_COD VARCHAR(2),
    GRUP_NOM VARCHAR(30),
    SUBG_COD VARCHAR(3),
    SUBG_NOM VARCHAR(30),
    MARC_COD VARCHAR(3),
    MARC_NOM VARCHAR(30),
    ARTI_IVA NUMERIC(9,4),
    ARTI_UNIDAD VARCHAR(8),
    ESAR_NOM VARCHAR(20),
    ARTI_EXIST CHAR(1),
    ARTI_FOTO BLOB SUB_TYPE 0 SEGMENT SIZE 80,
    ARTI_OBS BLOB SUB_TYPE 1 SEGMENT SIZE 80,
    ARTI_PESO NUMERIC(18,2),
    ARTI_ALTO NUMERIC(18,2),
    ARTI_ANCHO NUMERIC(18,2),
    ARTI_LARGO NUMERIC(18,2),
    ARTI_CONSUMO NUMERIC(18,2),
    ARTI_FECHA DATE,
    UNAR_UNIDAD VARCHAR(8),
    UNAR_FACCAN NUMERIC(18,2),
    COBA_COD VARCHAR(20),
    COAR_CTAINV VARCHAR(20),
    COAR_CTACOMP VARCHAR(20),
    COAR_CTAIVAC VARCHAR(20),
    COAR_CTAIVAV VARCHAR(20),
    COAR_CTAVNT VARCHAR(20),
    COAR_CTADEV VARCHAR(20),
    COAR_CTACONS VARCHAR(20),
    COAR_CTACOS VARCHAR(20))
AS
DECLARE VARIABLE CODINI VARCHAR(20);
DECLARE VARIABLE CODFIN VARCHAR(20);
DECLARE VARIABLE DESINI VARCHAR(20);
DECLARE VARIABLE DESFIN VARCHAR(20);
begin
if (ORDEN = 'C') then
    BEGIN
    CODINI = ARTINI;
    CODFIN = ARTFIN;
    DESINI = '0';
    DESFIN = 'zz';
    END
ELSE
    BEGIN
    DESINI = ARTINI;
    DESFIN = ARTFIN;
    CODINI = '0';
    CODFIN = 'zz';
    END

FOR select a.arti_cod, arti_des, a.grup_cod, A.subg_cod, A.marc_cod, taiv_porc, arti_unidad, esar_nom, arti_exist,
    arti_foto, arti_obs, arti_peso, arti_ancho, arti_alto, arti_largo, arti_consumo, arti_fecha
    from articulo a, tarifa_iva t, estado_articulo E where A.esar_cod = E.esar_cod AND
    a.arti_cod >= :codini and a.arti_cod <= :codfin and a.ARTI_DES >= :DESINI AND a.ARTI_DES <= :DESFIN
    and a.taiv_cod = t.taiv_cod and ((a.marc_cod is null) or (a.marc_cod >= :MARINI and a.marc_cod <= :MARFIN))
    and ((a.grup_cod is null) or (a.grup_cod >= :GRPINI and a.grup_cod <= :GRPFIN))
    and ((a.subg_cod is null) or (a.subg_cod >= :SUBINI and a.subg_cod <= :SUBFIN)) and a.esar_cod <> :INACTIVOS
    into  :ARTI_COD, :ARTI_DES, :GRUP_COD, :SUBG_COD, :MARC_COD, :ARTI_IVA, :ARTI_UNIDAD, esar_nom, arti_exist,
    arti_foto, arti_obs, arti_peso, arti_ancho, arti_alto, arti_largo, arti_consumo, arti_fecha
    DO
    BEGIN
    GRUP_NOM = NULL;
    MARC_NOM = NULL;
    SUBG_NOM = NULL;
    SELECT GRUP_NOM FROM GRUPO WHERE GRUP_COD = :GRUP_COD INTO :GRUP_NOM;
    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :SUBG_COD AND GRUP_COD = :GRUP_COD INTO :SUBG_NOM;
    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :MARC_COD INTO :MARC_NOM;
    SELECT coar_ctainv, coar_ctacomp, coar_ctaivac, coar_ctaivav, coar_ctavnt, coar_ctadev, coar_ctacons, coar_ctacos
        FROM contabil_articulo c WHERE arti_cod = :arti_cod INTO
        :COAR_CTAINV, :COAR_CTACOMP, :COAR_CTAIVAC, :COAR_CTAIVAV, :COAR_CTAVNT, :COAR_CTADEV, :COAR_CTACONS, :COAR_CTACOS;
    SELECT FIRST 1 coba_cod FROM BARRAS_ARTICULO WHERE arti_cod = :arti_cod AND COBA_UNIDAD = :arti_unidad INTO :coba_cod;
    select FIRST 1 unar_unidad, unar_faccan FROM unidad_articulo WHERE ARTI_COD = :arti_cod INTO unar_unidad, unar_faccan;
    SUSPEND;
    END
end
^

SET TERM ; ^


/* 20090609c */
/* ESTABAN INVERTIDOS LOS SIGNOS DE CARGOS Y DESCUENTOS */
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(6),
    FECHA DATE,
    NIT VARCHAR(20),
    NUMPROV VARCHAR(10),
    NOMTERCERO VARCHAR(60),
    SUBTOTAL NUMERIC(18,2),
    DTOMONTO NUMERIC(18,2),
    ADICIONAL NUMERIC(18,2),
    IVAMONTO NUMERIC(18,2),
    CONSUMO NUMERIC(18,2),
    EXENTOS NUMERIC(18,2),
    IVA1 NUMERIC(18,2),
    IVA2 NUMERIC(18,2),
    IVA3 NUMERIC(18,2),
    GRAVADOS1 NUMERIC(18,2),
    GRAVADOS2 NUMERIC(18,2),
    GRAVADOS3 NUMERIC(18,2),
    EXTRA NUMERIC(18,2),
    TOTAL NUMERIC(18,2),
    RTFTEMONTO NUMERIC(18,2),
    RTIVAMONTO NUMERIC(18,2),
    RTICAMONTO 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);
BEGIN
/* FACTURA */
TIPO = 21;
SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 21 INTO :NOMTIPO;

FOR SELECT FACO_ID, PREF_PRE, FACO_NUMERO, FACO_FECHA, TERC_NIT, FACO_ADICIONAL-FACO_DTOMONTO, FACO_IVAMONTO, FACO_RTFTEMONTO, FACO_RTIVAMONTO, FACO_RTICAMONTO, FACO_EXTRA, FACO_TOTAL, FACO_ANULADO, FACO_NUMPROV
    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, :EXTRA, :TOTAL, :ANULADO, :numprov
    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
        if ((ANULADOS = 'S') or (ANULADO = 'N')) then
            BEGIN
            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;
              END
            ELSE
              BEGIN
              SELECT SUM(FCDE_TOTAL - FCDE_IVAMONTO - FCDE_CONSUMO) FROM FACTURAS_COMPRAS_DETALLE D WHERE FACO_ID = :ID AND FCDE_IVAPORC = 0 INTO :EXENTOS;
              SELECT SUM(FCDE_TOTAL - FCDE_IVAMONTO - FCDE_CONSUMO), SUM(FCDE_IVAMONTO) FROM FACTURAS_COMPRAS_DETALLE D, TARIFA_IVA T WHERE FACO_ID = :ID AND FCDE_IVAPORC = TAIV_PORC AND TAIV_COD = 1 INTO :GRAVADOS1, :IVA1;
              SELECT SUM(FCDE_TOTAL - FCDE_IVAMONTO - FCDE_CONSUMO), SUM(FCDE_IVAMONTO) FROM FACTURAS_COMPRAS_DETALLE D, TARIFA_IVA T WHERE FACO_ID = :ID AND FCDE_IVAPORC = TAIV_PORC AND TAIV_COD = 2 INTO :GRAVADOS2, :IVA2;
              SELECT SUM(FCDE_TOTAL - FCDE_IVAMONTO - FCDE_CONSUMO), SUM(FCDE_IVAMONTO) FROM FACTURAS_COMPRAS_DETALLE D, TARIFA_IVA T WHERE FACO_ID = :ID AND FCDE_IVAPORC = TAIV_PORC AND TAIV_COD = 3 INTO :GRAVADOS3, :IVA3;

              SELECT SUM(FCDE_CONSUMO) FROM FACTURAS_COMPRAS_DETALLE WHERE FACO_ID = :ID INTO :CONSUMO;
              SUBTOTAL = TOTAL - EXTRA - IVAMONTO - DTOMONTO;
              NETO = TOTAL - RTFTEMONTO - RTIVAMONTO - RTICAMONTO;
              END
            if (exentos is null) then
                exentos = 0;
            if (gravados1 is null) then
                gravados1 = 0;
            if (gravados2 is null) then
                gravados2 = 0;
            if (gravados3 is null) then
                gravados3 = 0;
            if (iva1 is null) then
                iva1 = 0;
            if (iva2 is null) then
                iva2 = 0;
            if (iva3 is null) then
                iva3 = 0;
            if (consumo is null) then
                consumo = 0;
            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, TERC_NIT, DVCO_ADICIONAL-DVCO_DTOMONTO, DVCO_IVAMONTO, DVCO_RTFTEMONTO, DVCO_RTIVAMONTO, DVCO_RTICAMONTO, DVCO_EXTRA, DVCO_TOTAL, DVCO_ANULADO, ''
    FROM DEVOLUCIONES_COMPRAS
    WHERE DVCO_FECHA >= :FECINI AND DVCO_FECHA <= :FECFIN ORDER BY DVCO_FECHA, PREF_PRE, DVCO_NUMERO
    INTO :ID, :PREF, :NUMERO, :FECHA, :NIT, :DTOMONTO, :IVAMONTO, :RTFTEMONTO, :RTIVAMONTO, :RTICAMONTO, :EXTRA, :TOTAL, :ANULADO, :numprov
    DO
    BEGIN
    if ((PREFIJO = '') or (PREFIJO IS NULL) or (PREF = PREFIJO)) then
        if ((ANULADOS = 'S') or (ANULADO = 'N')) then
            BEGIN
            SELECT TERC_NOM, TERC_EXENTO FROM TERCEROS WHERE TERC_NIT = :NIT INTO :NOMTERCERO, :TER_EXENTO;
            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;
             END
            ELSE
             BEGIN
              DTOMONTO = DTOMONTO * -1;
              ADICIONAL = ADICIONAL * -1;
              IVAMONTO = IVAMONTO * -1;
              EXTRA = EXTRA * -1;
              TOTAL = TOTAL * -1;
              RTFTEMONTO = RTFTEMONTO * -1;
              RTIVAMONTO = RTIVAMONTO * -1;
              RTICAMONTO = RTICAMONTO * -1;
              /* CALCULE LAS DIFERENTES TARIFAS */
               SELECT SUM(DVCD_TOTAL - DVCD_IVAMONTO - DVCD_CONSUMO) FROM DEVOLUCIONES_COMPRAS_DET D WHERE DVCO_ID = :ID AND DVCD_IVAPORC = 0 INTO :EXENTOS;
               SELECT SUM(DVCD_TOTAL - DVCD_IVAMONTO - DVCD_CONSUMO), SUM(DVCD_IVAMONTO) FROM DEVOLUCIONES_COMPRAS_DET D, TARIFA_IVA T WHERE DVCO_ID = :ID AND DVCD_IVAPORC = TAIV_PORC AND TAIV_COD = 1 INTO :GRAVADOS1, :IVA1;
               SELECT SUM(DVCD_TOTAL - DVCD_IVAMONTO - DVCD_CONSUMO), SUM(DVCD_IVAMONTO) FROM DEVOLUCIONES_COMPRAS_DET D, TARIFA_IVA T WHERE DVCO_ID = :ID AND DVCD_IVAPORC = TAIV_PORC AND TAIV_COD = 2 INTO :GRAVADOS2, :IVA2;
               SELECT SUM(DVCD_TOTAL - DVCD_IVAMONTO - DVCD_CONSUMO), SUM(DVCD_IVAMONTO) FROM DEVOLUCIONES_COMPRAS_DET D, TARIFA_IVA T WHERE DVCO_ID = :ID AND DVCD_IVAPORC = TAIV_PORC AND TAIV_COD = 3 INTO :GRAVADOS3, :IVA3;

              SELECT SUM(DVCD_CONSUMO) FROM DEVOLUCIONES_COMPRAS_DET WHERE DVCO_ID = :ID INTO :CONSUMO;
              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;
              SUBTOTAL = TOTAL - EXTRA - IVAMONTO - DTOMONTO;
              NETO = TOTAL - RTFTEMONTO - RTIVAMONTO - RTICAMONTO;
             END
            if (iva1 is null) then
                iva1 = 0;
            if (iva2 is null) then
                iva2 = 0;
            if (iva3 is null) then
                iva3 = 0;
            if (consumo is null) then
                consumo = 0;
            SUSPEND;
            END
    END

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, 0, NCPR_MONTO + NCPR_IVAMONTO, NCPR_ANULADO, '', NCPR_BASE0, NCPR_BASE1, NCPR_BASE2, NCPR_IVA1, NCPR_IVA2
       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, :EXTRA, :TOTAL, :ANULADO, :numprov, :exentos, :gravados1, :gravados2, :iva1, :iva2
       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
          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;
           END
          ELSE
           BEGIN
            if (GRAVADOS1 is NULL) then
              GRAVADOS1 = 0;
            ELSE
              GRAVADOS1 = GRAVADOS1 * -1;
            if (GRAVADOS2 is NULL) then
              GRAVADOS2 = 0;
            ELSE
              GRAVADOS2 = GRAVADOS2 * -1;
            if (iva1 is NULL) then
              iva1 = 0;
            ELSE
              iva1 = iva1 * -1;
            if (iva2 is NULL) then
              iva2 = 0;
            ELSE
              iva2 = iva2 * -1;
            GRAVADOS3 = 0;
            IVA3 = 0;
            DTOMONTO = DTOMONTO * -1;
            ADICIONAL = ADICIONAL * -1;
            IVAMONTO = IVAMONTO * -1;
            EXTRA = EXTRA * -1;
            TOTAL = TOTAL * -1;
            RTFTEMONTO = RTFTEMONTO * -1;
            RTIVAMONTO = RTIVAMONTO * -1;
            RTICAMONTO = RTICAMONTO * -1;
            CONSUMO = 0;
            SUBTOTAL = TOTAL - EXTRA - IVAMONTO - DTOMONTO;
            NETO = TOTAL - RTFTEMONTO - RTIVAMONTO - RTICAMONTO;
           END
         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, 0, NDPR_MONTO + NDPR_IVAMONTO, NDPR_ANULADO, NDPR_NUMPROV, NDPR_BASE0, NDPR_BASE1, NDPR_BASE2, NDPR_IVA1, NDPR_IVA2 
       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, :EXTRA, :TOTAL, :ANULADO, :numprov, :exentos, :gravados1, :gravados2, :iva1, :iva2
       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
          GRAVADOS3 = 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;
           END
          ELSE
           BEGIN
            GRAVADOS3 = 0;
            IVA3 = 0;
            SUBTOTAL = TOTAL - EXTRA - IVAMONTO - DTOMONTO;
            NETO = TOTAL - RTFTEMONTO - RTIVAMONTO - RTICAMONTO;
           END
         suspend;
         END
       END
    END
END
^

SET TERM ; ^



/* 20090609d */
/* la contabilización repetia el ajuste en las cuentas db y cr */

SET TERM ^ ;

CREATE OR ALTER PROCEDURE CONTABIL_APLICACL(
    IDDOC INTEGER,
    IDINTER INTEGER)
RETURNS (
    ERROR INTEGER,
    VER CHAR(1),
    IDC INTEGER)
AS
declare variable PREF VARCHAR(4);
declare variable NUM VARCHAR(6);
declare variable NUMERO VARCHAR(10);
declare variable NUMDOC VARCHAR(10);
declare variable FECAUX DATE;
declare variable FECHA CHAR(8);
declare variable CONC CHAR(120);
declare variable VENCE CHAR(8);
declare variable VRSUBT NUMERIC(18, 2);
declare variable TIPOCOMP VARCHAR(3);
declare variable PREFCONT VARCHAR(4);
declare variable BASE CHAR(1);
declare variable CTABASE VARCHAR(20);
declare variable CLIE CHAR(1);
declare variable CTACLIE VARCHAR(20);
declare variable EXISTE CHAR(1);
declare variable CUENTA VARCHAR(20);
declare variable TIPOCUEN CHAR(1);
declare variable NIT VARCHAR(20);
declare variable PROY VARCHAR(4);
declare variable CENTRO VARCHAR(4);
declare variable NROI INTEGER;
declare variable TCTACLIEN VARCHAR(20);
declare variable TCTABASE VARCHAR(20);
declare variable ANULADO CHAR(1);
declare variable TIPODOC INTEGER;
BEGIN
/* BUSQUE LA INTERFACE */
EXISTE = 'N';
SELECT 'S', TICO_COD, PRCO_PRE, INCA_BASE, INCA_CLIE, INCA_CTABASE, INCA_CTACLIE, INCA_CONFIRMAR
    FROM INTERFAZ_CARTERA
    WHERE INCA_ID = :IDINTER
    INTO :EXISTE, :TIPOCOMP, :PREFCONT, :BASE, :CLIE, :CTABASE, :CTACLIE, :VER;
if (EXISTE = 'S') then
    BEGIN
    /* BORRE CUALQUEIR CONTABILIZACION PREVIA */
    DELETE FROM CONTABILIZACION WHERE CNTB_TIPOREF = 43 AND CNTB_IDREF = :IDDOC;
    /* TRAIGA EL ENCABEZADO DE LA NOTA */
    SELECT PREF_PRE, APCL_NUMERO, APCL_FECHA, N.TERC_NIT, APCL_CONCEPTO, TERC_CTAVENTA,
        TERC_CTACLIENTE, APCL_ANULADO
        FROM aplicacion_cliente N, TERCEROS T
        WHERE N.APCL_ID = :IDDOC AND N.TERC_NIT = T.TERC_NIT
        INTO :PREF, :NUM, :FECAUX, :NIT, :CONC, :TCTABASE, :TCTACLIEN, :ANULADO;

    if (ANULADO = 'N') then
        BEGIN
        SELECT PREF_CENTRO, PREF_PROY FROM PREFIJOS P, aplicacion_cliente N
            WHERE P.PREF_PRE = N.PREF_PRE AND P.TIDO_COD = 43 AND APCL_ID = :IDDOC INTO :CENTRO, :PROY;
        NUMERO = PREF || NUM;
        EXECUTE PROCEDURE FECHA_A_CONTA(:FECAUX) returning_values (:FECHA);
        VENCE = FECHA;
        /* REGISTRE EL ENCABEZADO CONTABLE */
        IDC = GEN_ID(ID_CONTABILIZA, 1);
        INSERT INTO CONTABILIZACION (CNTB_ID, CNTB_TIPOCOMP, CNTB_PREFCNT, CNTB_NUMERO, CNTB_FECHA, CNTB_CONCEPTO, CNTB_REF, CNTB_TIPOREF, CNTB_IDREF, CNTB_PREFREF, CNTB_NUMREF, CNTB_PROCESADO)
            VALUES (:IDC, :TIPOCOMP, :PREFCONT, :NUM, :FECHA, :CONC, '', 43, :IDDOC, :PREF, :NUM, 'N');
        NROI = 0;
        ERROR = 0;
        FOR SELECT ACDE_APLICADO+ACDE_RTFTE+ACDE_RTIVA+ACDE_RTICA, ACDE_PREFIJO || ACDE_NUMERO, ACDE_TIPODOC
            FROM aplicacion_cliente_detalle WHERE APCL_ID = :IDDOC
            INTO :vrsubt, :numdoc, :tipodoc
            DO
            BEGIN
            if (VRSUBT < 0) then
                BEGIN
                IF ((BASE = 'C') OR (BASE = 'K')) THEN
                    BEGIN
                    IF (BASE = 'C') THEN
                        CTABASE = TCTABASE;
                    CUENTA = NULL;
                    SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                        WHERE CUEN_COD = :CTABASE INTO :CUENTA, :TIPOCUEN;
                    if (CUENTA IS NULL) then
                        begin
                        EXECUTE PROCEDURE ERROR (43, :IDDOC, :CTABASE, 2);
                        CUENTA = CTABASE;
                        TIPOCUEN = 'N';
                        ERROR = ERROR + 1;
                        end
                    if (TIPOCUEN = 'I') then
                        BEGIN
                        EXECUTE PROCEDURE ERROR (43, :IDDOC, :CUENTA, 3);
                        TIPOCUEN = 'N';
                        ERROR = ERROR + 1;
                        END
                    if (TIPOCUEN = 'C') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRSUBT, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, :NUMDOC, :VENCE, NULL, :tipodoc, 43);
                        NROI = NROI + 1;
                        END
                    if (TIPOCUEN = 'N') then
                        BEGIN
                            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', ABS(:VRSUBT), 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NROI = NROI + 1;
                        END
                    END
                END /* SUBT < 0 */
            if ((VRSUBT > 0) and ((CLIE = 'C') or (CLIE = 'K'))) then
                BEGIN
                if (CLIE = 'C') then
                    CTACLIE = TCTACLIEN;
                CUENTA = NULL;
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :CTACLIE INTO :CUENTA, :TIPOCUEN;
                IF (CUENTA IS NULL) then
                    begin
                    EXECUTE PROCEDURE ERROR (43, :IDDOC, :CTACLIE, 2);
                    CUENTA = CTACLIE;
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (43, :IDDOC, :CUENTA, 3);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :vrsubt, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, :NUMDOC, :VENCE, NULL, :tipodoc, 42);
                    NROI = NROI + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :vrsubt, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    END
                end
            END /* for */
        END /* NO ANULADO */
    if (ERROR > 0) then
        VER = 'S';
    SUSPEND;
    END
ELSE
    BEGIN
    EXECUTE PROCEDURE ERROR (43, :IDDOC, :PREF, 1);
    ERROR = ERROR + 1;
    VER = 'S';
    SUSPEND;
    END
END
^

SET TERM ; ^


SET TERM ^ ;

ALTER PROCEDURE APLICACIONCL_SIN_CONTABILIDAD(
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    ID INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    ESTADO VARCHAR(20),
    IDI INTEGER,
    IDC INTEGER,
    ERROR INTEGER)
AS
DECLARE VARIABLE VER CHAR(2);
declare variable FECICNT VARCHAR(10);
declare variable FECFCNT VARCHAR(10);
declare variable idref INTEGER;
BEGIN /*$$IBE$$ 
EXECUTE PROCEDURE fecha_a_conta(FECINI) returning_values (FECICNT);
EXECUTE PROCEDURE fecha_a_conta(FECFIN) returning_values (FECFCNT);
FOR SELECT APCL_ID, PREF_PRE, APCL_NUMERO FROM aplicacion_cliente WHERE APCL_ANULADO = 'N' AND
    APCL_FECHA >= :FECINI AND APCL_FECHA <= :FECFIN ORDER BY APCL_ID
    INTO :ID, :PREF, :NUMERO
DO
  BEGIN
  idref = null;
  SELECT ENCO_IDREF FROM COMPROBANTE_ENCABEZADO WHERE ENCO_TIPOREF = 43 AND ENCO_FECHA >= :FECICNT AND ENCO_FECHA <= :FECFCNT and ENCO_IDREF = :id into :idref;
  if (idref IS NULL) then
  begin
   ESTADO = 'PROCESANDO';
   SUSPEND;
   SELECT MAX(INCA_ID) FROM INTERFAZ_CARTERA WHERE PREF_PRE = :PREF AND TIDO_COD = 43 INTO :IDI;
   EXECUTE PROCEDURE contabil_aplicacl (:ID, :IDI) RETURNING_VALUES (:ERROR, :VER, :IDC);
   if (ERROR = 0) then
    BEGIN
    EXECUTE PROCEDURE CONTABILIZA_PENDIENTE (:IDC);
    ESTADO = 'OK';
    END
   ELSE
    ESTADO = 'ERROR';
   suspend;
  end
  END
 $$IBE$$*/ SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE APLICACIONCL_SIN_CONTABILIDAD(
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    ID INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    ESTADO VARCHAR(20),
    IDI INTEGER,
    IDC INTEGER,
    ERROR INTEGER)
AS
DECLARE VARIABLE VER CHAR(2);
declare variable FECICNT VARCHAR(10);
declare variable FECFCNT VARCHAR(10);
declare variable idref INTEGER;
BEGIN
EXECUTE PROCEDURE fecha_a_conta(FECINI) returning_values (FECICNT);
EXECUTE PROCEDURE fecha_a_conta(FECFIN) returning_values (FECFCNT);
FOR SELECT APCL_ID, PREF_PRE, APCL_NUMERO FROM aplicacion_cliente WHERE APCL_ANULADO = 'N' AND
    APCL_FECHA >= :FECINI AND APCL_FECHA <= :FECFIN ORDER BY APCL_ID
    INTO :ID, :PREF, :NUMERO
DO
  BEGIN
  idref = null;
  SELECT ENCO_IDREF FROM COMPROBANTE_ENCABEZADO WHERE ENCO_TIPOREF = 43 AND ENCO_FECHA >= :FECICNT AND ENCO_FECHA <= :FECFCNT and ENCO_IDREF = :id into :idref;
  if (idref IS NULL) then
  begin
   ESTADO = 'PROCESANDO';
   SUSPEND;
   SELECT MAX(INCA_ID) FROM INTERFAZ_CARTERA WHERE PREF_PRE = :PREF AND TIDO_COD = 43 INTO :IDI;
   EXECUTE PROCEDURE contabil_aplicacl (:ID, :IDI) RETURNING_VALUES (:ERROR, :VER, :IDC);
   if (ERROR = 0) then
    BEGIN
    EXECUTE PROCEDURE CONTABILIZA_PENDIENTE (:IDC);
    ESTADO = 'OK';
    END
   ELSE
    ESTADO = 'ERROR';
   suspend;
  end
  END
END

^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER PROCEDURE CONTABIL_APLICAPR(
    IDDOC INTEGER,
    IDINTER INTEGER)
RETURNS (
    ERROR INTEGER,
    VER CHAR(1),
    IDC INTEGER)
AS
declare variable PREF VARCHAR(4);
declare variable NUM VARCHAR(6);
declare variable NUMERO VARCHAR(10);
declare variable NUMDOC VARCHAR(10);
declare variable FECAUX DATE;
declare variable FECHA CHAR(8);
declare variable CONC CHAR(120);
declare variable VRSUBT NUMERIC(18, 2);
declare variable TIPOCOMP VARCHAR(3);
declare variable PREFCONT VARCHAR(4);
declare variable BASE CHAR(1);
declare variable CTABASE VARCHAR(20);
declare variable CLIE CHAR(1);
declare variable CTACLIE VARCHAR(20);
declare variable EXISTE CHAR(1);
declare variable CUENTA VARCHAR(20);
declare variable TIPOCUEN CHAR(1);
declare variable NIT VARCHAR(20);
declare variable PROY VARCHAR(4);
declare variable CENTRO VARCHAR(4);
declare variable NROI INTEGER;
declare variable TCTACLIEN VARCHAR(20);
declare variable TCTABASE VARCHAR(20);
declare variable ANULADO CHAR(1);
declare variable TIPODOC INTEGER;
BEGIN
ERROR = 0;
/* BUSQUE LA INTERFACE */
EXISTE = 'N';
SELECT 'S', TICO_COD, PRCO_PRE, INCP_BASE, INCP_PROV, INCP_CTABASE, INCP_CTAPROV, INCP_CONFIRMAR
  FROM INTERFAZ_CXPAGAR
  WHERE INCP_ID = :IDINTER
  INTO :EXISTE, :TIPOCOMP, :PREFCONT, :BASE, :CLIE, :CTABASE, :CTACLIE, :VER;

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

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

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

    FOR SELECT APPD_APLICADO+APPD_RTFTE+APPD_RTIVA+APPD_RTICA, APPD_PREFIJO || APPD_NUMERO, APPD_TIPODOC
        FROM aplicacion_proveedor_detalle
        WHERE APPR_ID = :IDDOC
        INTO :vrsubt, :numdoc, :tipodoc
        DO
        BEGIN
        IF ((VRSUBT < 0) AND ((BASE = 'T') OR (BASE = 'K'))) THEN
            BEGIN
            IF (BASE = 'T') THEN
                CTABASE = TCTABASE;
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTABASE INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERROR (53, :IDDOC, :CTABASE, 2);
                CUENTA = CTABASE;
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERROR (53, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', ABS(:VRSUBT), 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, :numdoc, :FECHA, NULL, :tipodoc, 43);
                NROI = NROI + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', ABS(:VRSUBT), 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                END
            END /* MONTO <> 0 */
        if ((VRSUBT > 0) and ((CLIE = 'T') or (CLIE = 'K'))) then
            BEGIN
            if (CLIE = 'T') then
                CTACLIE = TCTACLIEN;
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTACLIE INTO :CUENTA, :TIPOCUEN;
            IF (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERROR (53, :IDDOC, :CTACLIE, 2);
                CUENTA = CTACLIE;
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERROR (53, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :vrsubt, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, :numdoc, :FECHA, NULL, :tipodoc, 43);
            if (TIPOCUEN = 'N') then
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :vrsubt, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            END /* CARTERA */
        END /* DO */
    END
  if (ERROR > 0) then
    VER = 'S';
  SUSPEND;
  END /* EXISTE LA INTERFAZ */
ELSE
    BEGIN
    EXECUTE PROCEDURE ERROR (53, :IDDOC, :PREF, 1);
    ERROR = ERROR + 1;
    VER = 'S';
    SUSPEND;
    END
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE APLICACIONPR_SIN_CONTABILIDAD(
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    ID INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    ESTADO VARCHAR(20),
    IDI INTEGER,
    IDC INTEGER,
    ERROR INTEGER)
AS
DECLARE VARIABLE VER CHAR(2);
declare variable FECICNT VARCHAR(10);
declare variable FECFCNT VARCHAR(10);
declare variable idref INTEGER;
BEGIN /*$$IBE$$ 
EXECUTE PROCEDURE fecha_a_conta(FECINI) returning_values (FECICNT);
EXECUTE PROCEDURE fecha_a_conta(FECFIN) returning_values (FECFCNT);
FOR SELECT APPR_ID, PREF_PRE, APPR_NUMERO FROM aplicacion_provedor WHERE APPR_ANULADO = 'N' AND
    APPR_FECHA >= :FECINI AND APPR_FECHA <= :FECFIN ORDER BY APPR_ID
    INTO :ID, :PREF, :NUMERO
DO
  BEGIN
  idref = null;
  SELECT ENCO_IDREF FROM COMPROBANTE_ENCABEZADO WHERE ENCO_TIPOREF = 53 AND ENCO_FECHA >= :FECICNT AND ENCO_FECHA <= :FECFCNT and ENCO_IDREF = :id into :idref;
  if (idref IS NULL) then
  begin
   ESTADO = 'PROCESANDO';
   SUSPEND;
   SELECT MAX(INCP_ID) FROM interfaz_cxpagar WHERE PREF_PRE = :PREF AND TIDO_COD = 53 INTO :IDI;
   EXECUTE PROCEDURE contabil_aplicapr (:ID, :IDI) RETURNING_VALUES (:ERROR, :VER, :IDC);
   if (ERROR = 0) then
    BEGIN
    EXECUTE PROCEDURE CONTABILIZA_PENDIENTE (:IDC);
    ESTADO = 'OK';
    END
   ELSE
    ESTADO = 'ERROR';
   suspend;
  end
  END
 $$IBE$$*/ SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE APLICACIONPR_SIN_CONTABILIDAD(
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    ID INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    ESTADO VARCHAR(20),
    IDI INTEGER,
    IDC INTEGER,
    ERROR INTEGER)
AS
DECLARE VARIABLE VER CHAR(2);
declare variable FECICNT VARCHAR(10);
declare variable FECFCNT VARCHAR(10);
declare variable idref INTEGER;
BEGIN
EXECUTE PROCEDURE fecha_a_conta(FECINI) returning_values (FECICNT);
EXECUTE PROCEDURE fecha_a_conta(FECFIN) returning_values (FECFCNT);
FOR SELECT APPR_ID, PREF_PRE, APPR_NUMERO FROM aplicacion_provedor WHERE APPR_ANULADO = 'N' AND
    APPR_FECHA >= :FECINI AND APPR_FECHA <= :FECFIN ORDER BY APPR_ID
    INTO :ID, :PREF, :NUMERO
DO
  BEGIN
  idref = null;
  SELECT ENCO_IDREF FROM COMPROBANTE_ENCABEZADO WHERE ENCO_TIPOREF = 53 AND ENCO_FECHA >= :FECICNT AND ENCO_FECHA <= :FECFCNT and ENCO_IDREF = :id into :idref;
  if (idref IS NULL) then
  begin
   ESTADO = 'PROCESANDO';
   SUSPEND;
   SELECT MAX(INCP_ID) FROM interfaz_cxpagar WHERE PREF_PRE = :PREF AND TIDO_COD = 53 INTO :IDI;
   EXECUTE PROCEDURE contabil_aplicapr (:ID, :IDI) RETURNING_VALUES (:ERROR, :VER, :IDC);
   if (ERROR = 0) then
    BEGIN
    EXECUTE PROCEDURE CONTABILIZA_PENDIENTE (:IDC);
    ESTADO = 'OK';
    END
   ELSE
    ESTADO = 'ERROR';
   suspend;
  end
  END
END

^

SET TERM ; ^

/* 20090611 */
ALTER TABLE TARIFA_IVA
ADD TAIV_NOMBRE VARCHAR(20);


UPDATE TARIFA_IVA
SET TAIV_NOMBRE = 'Exentos'
WHERE (TAIV_COD = 0);


UPDATE TARIFA_IVA
SET TAIV_NOMBRE = 'Gravados 16'
WHERE (TAIV_COD = 1);


UPDATE TARIFA_IVA
SET TAIV_NOMBRE = 'Gravados 10'
WHERE (TAIV_COD = 2);

COMMIT WORK;

/* 20090613 : CONFIGURACION BASE Y PORCENTAJE EN FACTURA EN LUGAR DE CANTIDAD Y PRECIO */

ALTER TABLE FACTURAS_DETALLE
ADD FADE_BASE T_MONTO;
ALTER TABLE FACTURAS_DETALLE
ADD FADE_PORCBASE T_MONTO;

INSERT INTO CONFIGURACION (CONF_MODULO, CONF_CATEGORIA, CONF_PROPIEDAD, CONF_VALOR, CONF_POSIBLES, CONF_AYUDA) VALUES ('FACTURACION', 'FACTURAS', 'PREFIJO DE FACTURA QUE PREGUNTA BASE Y PORCENTAJE PARA EL CALCULO DEL TOTAL POR ITEM', '', '', 'El prefijo de factura indicado preguntará base y porcentaje en lugar de precio unitario y descuento para el cálculo del total por item');
commit work;

SET TERM ^ ;

CREATE OR ALTER PROCEDURE IMPR_FACTURA(
    ID INTEGER)
RETURNS (
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    VENCE DATE,
    DIASVENCE INTEGER,
    CONTCRED CHAR(17),
    NIT VARCHAR(20),
    NOMTERCERO VARCHAR(60),
    NOMCLIENTE VARCHAR(60),
    VENDEDOR INTEGER,
    NOMVENDEDOR VARCHAR(60),
    PUNTOVTA INTEGER,
    NOMPUNTOVTA VARCHAR(30),
    CODBODEGA VARCHAR(2),
    NOMBODEGA VARCHAR(30),
    AUTORIZACION VARCHAR(20),
    DESPACHO VARCHAR(255),
    TRANSPORTADOR VARCHAR(60),
    COTIZACION VARCHAR(30),
    PEDIDO VARCHAR(30),
    REMISION VARCHAR(30),
    PACIENTE VARCHAR(20),
    NOMPACIENTE VARCHAR(60),
    COMIPORC NUMERIC(9,2),
    COMIMONTO NUMERIC(18,2),
    SUBTOTAL NUMERIC(18,2),
    INGTERCEROS NUMERIC(18,2),
    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),
    EXTRA NUMERIC(18,2),
    DTOFPORC NUMERIC(9,2),
    DTOFMONTO NUMERIC(18,2),
    FECHADTO DATE,
    ANTICIPO NUMERIC(18,2),
    TOTALFAC NUMERIC(18,2),
    TOTALPAGAR NUMERIC(18,2),
    OBS BLOB SUB_TYPE 1 SEGMENT SIZE 80,
    ITEM INTEGER,
    ARTICULO VARCHAR(15),
    CODBAR VARCHAR(15),
    ARTIDES VARCHAR(60),
    DESCORTA VARCHAR(30),
    CANT NUMERIC(18,4),
    LOTE VARCHAR(15),
    VLOTE DATE,
    UNIDAD VARCHAR(8),
    CAJAS NUMERIC(18,4),
    FACTOR NUMERIC(18,4),
    LISTAPR INTEGER,
    REFITEM VARCHAR(60),
    BODITEM VARCHAR(2),
    STAND VARCHAR(15),
    PRUNIT NUMERIC(18,2),
    DTOITPORC NUMERIC(9,2),
    DTOITMONTO NUMERIC(18,2),
    PRNETO NUMERIC(18,2),
    PRNETOSINIVA NUMERIC(18,2),
    BASE NUMERIC(18,2),
    PORCBASE NUMERIC(9,2),
    DTOIT1 NUMERIC(9,2),
    DTOIT2 NUMERIC(9,2),
    DTOIT3 NUMERIC(9,2),
    IVAPORC NUMERIC(9,2),
    IVAITMONTO NUMERIC(18,2),
    CONSUMO NUMERIC(18,2),
    SUBTOTIT NUMERIC(18,2),
    TOTAL NUMERIC(18,2),
    CODIGOCL VARCHAR(20),
    ZONACOD VARCHAR(2),
    ZONANOM VARCHAR(60),
    DV CHAR(1),
    DIRECCION VARCHAR(60),
    CIUDAD VARCHAR(40),
    TELEFONO VARCHAR(40),
    CONTACTO VARCHAR(60),
    FAX VARCHAR(25),
    CEL VARCHAR(25),
    GRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    SUBGRUPO VARCHAR(3),
    NOMSUBG VARCHAR(30),
    MARCA VARCHAR(3),
    NOMMARCA VARCHAR(30),
    PESO NUMERIC(18,4),
    ANCHO NUMERIC(18,4),
    ALTO NUMERIC(18,4),
    LARGO NUMERIC(18,4),
    SUMA1 NUMERIC(18,2),
    SUMA2 NUMERIC(18,2),
    SUMA3 NUMERIC(18,2),
    IVA1 NUMERIC(18,2),
    IVA2 NUMERIC(18,2),
    IVA3 NUMERIC(18,2),
    SUMAEX NUMERIC(18,2),
    SUMAGR NUMERIC(18,2),
    TOTCONSUMO NUMERIC(18,2),
    DTOIT1M NUMERIC(18,2),
    DTOIT2M NUMERIC(18,2),
    DTOIT3M NUMERIC(18,2),
    TOTCAJAS NUMERIC(18,2),
    TOTBASE NUMERIC(18,2),
    VEHICULO VARCHAR(8),
    RECIBIDO NUMERIC(18,2),
    CAMBIO NUMERIC(18,2),
    HORA TIME,
    FORMAPAGO1 VARCHAR(30),
    MONTOPAGO1 NUMERIC(18,2),
    FORMAPAGO2 VARCHAR(30),
    MONTOPAGO2 NUMERIC(18,2),
    FORMAPAGO3 VARCHAR(30),
    MONTOPAGO3 NUMERIC(18,2),
    PUNTOS INTEGER,
    PUNTOSACUM INTEGER,
    PUNTOSVENC INTEGER,
    FECPTOS DATE,
    OBSITEM BLOB SUB_TYPE 1 SEGMENT SIZE 80,
    SUCUR VARCHAR(10),
    ALTERNATIVAS NUMERIC(18,4),
    PRINCIPALES NUMERIC(18,4))
AS
DECLARE VARIABLE IMPTOS CHAR(1);
DECLARE VARIABLE TARIFA INTEGER;
declare variable DEVUELTO NUMERIC(18,2);
declare variable ORDENCOD CHAR(2);
declare variable IMPRDEV CHAR(2);
declare variable IMPR CHAR(1);
declare variable ITEMFP INTEGER;
declare variable FORMAP VARCHAR(30);
declare variable MONTOP NUMERIC(18,2);
declare variable ICOINC CHAR(2);
declare variable DTOITM1 NUMERIC(18,2);
declare variable DTOITM2 NUMERIC(18,2);
declare variable DTOITM3 NUMERIC(18,2);
declare variable DTOITE3 CHAR(2);
declare variable SUMDTOIT NUMERIC(18,2);
declare variable AUTORET VARCHAR(10);
declare variable FAUTORET DATE;
declare variable FACTCANT NUMERIC(18,4);
declare variable ANULADO CHAR(1);
declare variable INGTER CHAR(2);
BEGIN
execute procedure lee_configuracion('FACTURACION', 'ARTICULOS', 'IMPOCONSUMO INCLUIDO EN EL PRECIO BASE DE VENTA ANTES DE IVA') returning_values (icoinc);
execute procedure lee_configuracion('FACTURACION', 'FACTURAS', 'COLUMNAS DE DESCUENTO POR ITEM ADICIONALES') returning_values (DTOITE3);
execute procedure lee_configuracion('FACTURACION', 'FACTURAS', 'GRUPO DE MERCANCIA PARA INGRESOS DE TERCEROS') returning_values (INGTER);
SELECT F.PREF_PRE, FACT_NUMERO, FACT_FECHA, FACT_VENCE, F.BODE_COD, BODE_NOM, F.TERC_NIT, FACT_NOMCLIENTE, F.VEND_COD, VEND_NOMBRE, F.PTVT_ID, PTVT_NOM,
    AUTO_NUMERO, FACT_DESPACHO, FACT_TRANSP, FACT_COTIZACI, FACT_PEDIDO, FACT_REMISION, FACT_COMIPORC, FACT_COMIMONTO, FACT_IVAINC, 
    FACT_DTOPOR, FACT_DTOMONTO, FACT_ADICIONAL, FACT_IVAMONTO, FACT_RTFTEPOR, FACT_RTFTEMONTO, FACT_RTIVAPOR, FACT_RTIVAMONTO, FACT_RTICAPOR, FACT_RTICAMONTO, FACT_EXTRA, FACT_DTOFPOR, FACT_DTOFMONTO, FACT_DTOFFECHA, FACT_TOTAL,
    TERC_DIR, TERC_CIU, TERC_TEL, TERC_CONTACTO, TERC_FAX, TERC_DV, TERC_CEL, FACT_DTOIT1, FACT_DTOIT2, FACT_DTOIT3,
    FACT_OBS, VEHI_COD, /*FACT_NROCOPIA,*/ FACT_RECIBIDO, FACT_SUCURSAL, FACT_DETCLI, FACT_DETCLINOM, TERC_NOM, FACT_ANULADO, FACT_ANTICIPO
    FROM FACTURAS F, BODEGA B, VENDEDORES V, PUNTO_VENTA P, TERCEROS T
    WHERE F.BODE_COD = B.BODE_COD AND F.VEND_COD = V.VEND_COD AND F.PTVT_ID = P.PTVT_ID AND F.TERC_NIT = T.TERC_NIT AND F.FACT_ID = :ID
    into :PREF, :NUMERO, :FECHA, :VENCE, :CODBODEGA, :NOMBODEGA, :NIT, :NOMTERCERO, :VENDEDOR, :NOMVENDEDOR, :PUNTOVTA, :NOMPUNTOVTA,
    :AUTORIZACION, :DESPACHO, :TRANSPORTADOR, :COTIZACION, :PEDIDO, :REMISION, :COMIPORC, :COMIMONTO, :IMPTOS,
    :DTOPORC, :DTOMONTO, :ADICIONAL, :IVAMONTO, :RTEFTEPORC, :RTEFTEMONTO, :RTEIVAPORC, :RTEIVAMONTO, :RTEICAPORC, :RTEICAMONTO, :EXTRA, :DTOFPORC, :DTOFMONTO, :FECHADTO, :TOTALFAC,
    :DIRECCION, :CIUDAD, :TELEFONO, :CONTACTO, :FAX, :DV, :CEL, :dtoit1m, :dtoit2m, :dtoit3m,
    :OBS, :VEHICULO,/* :NROCOPIA,*/ :RECIBIDO, :SUCUR, :paciente, :nompaciente, :nomcliente, :ANULADO, :anticipo;

/* ACUMULE LOS PUNTOS, SE HACE ACA POR SER POSTERIOR AL DETALLE */
if (ANULADO = 'N') then
    EXECUTE PROCEDURE acumula_puntos_cliente (31, :id, :nit, :fecha) returning_values (:PUNTOS);
EXECUTE PROCEDURE consulta_puntos_cliente (:id, :nit, :fecha) returning_values (:puntos, :puntosacum, :puntosvenc, :fecptos);
if (DTOIT1M IS NULL) then
    DTOIT1M = 0;
if (DTOIT2M IS NULL) then
    DTOIT2M = 0;
if (DTOIT3M IS NULL) then
    DTOIT3M = 0;
SELECT CLIE_COD, C.ZONA_COD, ZONA_NOM
    FROM CLIENTES C, ZONAS Z
    WHERE TERC_NIT = :NIT AND C.ZONA_COD = Z.ZONA_COD
    INTO :CODIGOCL, :ZONACOD, :ZONANOM;
SELECT CLSU_DIR, CLSU_CIUDAD, CLSU_TEL FROM CLIENTE_SUCURSALES WHERE TERC_NIT = :NIT AND CLCU_COD = :SUCUR
    INTO :DIRECCION, :CIUDAD, :TELEFONO;
DIASVENCE = VENCE - FECHA;
if (DIASVENCE > 0) then
    CONTCRED = 'CREDITO ' || CAST(DIASVENCE AS VARCHAR(3)) || ' DIAS';
ELSE
    CONTCRED = 'CONTADO';
SUBTOTAL = TOTALFAC - EXTRA - IVAMONTO - ADICIONAL + DTOMONTO;
if (DTOITE3 = 'SI') then
    BEGIN
    SELECT SUM(FADE_DTOMONTO) FROM FACTURAS_DETALLE WHERE FACT_ID = :id INTO :sumdtoit;
    SUBTOTAL = SUBTOTAL + sumdtoit + dtoit1m + dtoit2m + dtoit3m;
    END
if (INGTER <> '') then
    BEGIN
    SELECT SUM(FADE_TOTAL) FROM FACTURAS_DETALLE D, ARTICULO A WHERE A.arti_cod = D.arti_cod AND FACT_ID = :id AND GRUP_COD = :ingter
        INTO :ingterceros;
    END
EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'FECHA AUTORETENEDOR NO DESCONTAR RETENCIONES DEL SALDO PERO SI CONTABILIZARLAS') returning_values (AUTORET);
if (AUTORET <> '') then
    FAUTORET = CAST(AUTORET AS DATE);
else
    FAUTORET = '9999/12/31';
if (FECHA > fautoret) then
    TOTALPAGAR = TOTALFAC - RTEIVAMONTO - RTEICAMONTO - ANTICIPO;
ELSE
    TOTALPAGAR = TOTALFAC - RTEFTEMONTO - RTEIVAMONTO - RTEICAMONTO - ANTICIPO;
if (RECIBIDO <> 0) then
    CAMBIO = RECIBIDO - totalpagar;
ELSE
    CAMBIO = 0;
SUMAEX = 0;
SUMA1 = 0;
SUMA2 = 0;
SUMA3 = 0;
IVA1 = 0;
IVA2 = 0;
IVA3 = 0;
TOTCONSUMO = 0;
MONTOPAGO1 = 0;
SELECT MAX(AUDI_HORA) FROM AUDITORIA WHERE TIDO_COD = 31 AND AUDI_IDDOC = :ID AND AUDI_OPER = 'I' INTO :HORA;
/* AHORA LAS FORMAS DE PAGO, BUSQUE EL ABONO DE HOY A LA FACTURA */
ITEMFP = 1;
MONTOPAGO1 = 0;
MONTOPAGO2 = 0;
MONTOPAGO3 = 0;
FOR SELECT FOPA_NOM, RCPA_MONTO FROM RECIBOS_CAJA_PAGO P, FORMAS_PAGO F, RECIBOS_CAJA R, RECIBOS_CAJA_DETALLE D
    WHERE R.RECA_ID = P.RECA_ID AND R.RECA_ID = D.RECA_ID AND P.FOPA_ID = F.FOPA_ID AND RECA_FECHA = :FECHA AND RCDE_TIPODOC = 31 AND RCDE_IDDOC = :ID
    INTO :formap, :MONTOP
    DO
    BEGIN
    if (ITEMFP = 1) then
        BEGIN
        FORMAPAGO1 = FORMAP;
        MONTOPAGO1 = MONTOP;
        END
    if (ITEMFP = 2) then
        BEGIN
        FORMAPAGO2 = FORMAP;
        MONTOPAGO2 = MONTOP;
        END
    if (ITEMFP = 3) then
        BEGIN
        FORMAPAGO3 = FORMAP;
        MONTOPAGO3 = MONTOP;
        END
    ITEMFP = ITEMFP + 1;
    END
EXECUTE PROCEDURE lee_configuracion ('FACTURACION','DOCUMENTOS','ORDENAR ITEMS POR CODIGO DE ARTICULO') returning_values (:ORDENCOD);
EXECUTE PROCEDURE lee_configuracion ('FACTURACION','POS', 'IMPRIMIR DEVOLUCIONES DE ARTICULOS NEGATIVOS') returning_values (:imprdev);
totcajas = 0;
totbase = 0;
if (ORDENCOD = 'SI') then
    BEGIN
    FOR SELECT FADE_ITEM, D.ARTI_COD, FADE_CODBAR, SUBSTR(FADE_DESC,1,60), ARTI_DESCORTA, FADE_CANT, FADE_UNIDAD, FADE_FACTOR, BODE_COD, FADE_LOTE, LIPR_COD, FADE_PRUNIT, FADE_DTOPORC, FADE_DTOMONTO, FADE_IVAPORC, FADE_IVAMONTO, FADE_CONSUMO, FADE_TOTAL, FADE_REFERENCIA,
        GRUP_COD, SUBG_COD, MARC_COD, ARTI_PESO, ARTI_ANCHO, ARTI_ALTO, ARTI_LARGO, TAIV_COD, FADE_DEVUELTO, FADE_OBS, FADE_DTO1, FADE_DTO2, FADE_DTO3, FADE_DTOM1, FADE_DTOM2, FADE_DTOM3, FADE_CAJAS, FADE_BASE, FADE_PORCBASE
        FROM FACTURAS_DETALLE D, ARTICULO A
        WHERE D.ARTI_COD = A.ARTI_COD AND D.FACT_ID = :ID
        ORDER BY D.ARTI_COD
        INTO :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :DESCORTA, :CANT, :UNIDAD, :FACTOR, :BODITEM, :LOTE, :LISTAPR, :PRUNIT, :DTOITPORC, :DTOITMONTO, :IVAPORC, :IVAITMONTO, :CONSUMO, :TOTAL, :refitem,
        :GRUPO, :SUBGRUPO, :MARCA, :PESO, :ANCHO, :ALTO, :LARGO, :TARIFA, :devuelto, :obsitem, :dtoit1, :dtoit2, :dtoit3, :dtoitm1, :dtoitm2, :dtoitm3, :cajas, :base, :porcbase
        DO
          BEGIN
          if (ARTICULO = CODBAR) then
            SELECT FIRST 1 COBA_COD FROM barras_articulo WHERE ARTI_COD = :articulo INTO :CODBAR;
          if (IMPRDEV <> 'SI') then
            BEGIN
            if ((CANT >= 0) AND (DEVUELTO = 0)) then
                IMPR = 'S';
            ELSE
                IMPR = 'N'; /* ES DEVOLUCION */
            END
          ELSE
            IMPR = 'S';
          if (IMPR = 'S') then
            BEGIN
            prneto = PRUNIT - DTOITMONTO - dtoitm1 - dtoitm2 - dtoitm3;
            if (IMPTOS = 'S') then
                if (cant <> 0) then
                    prnetosiniva = PRUNIT - DTOITMONTO - ((IVAITMONTO+CONSUMO) / CANT) - dtoitm1 - dtoitm2 - dtoitm3;
                else
                    prnetosiniva = PRUNIT - DTOITMONTO - dtoitm1 - dtoitm2 - dtoitm3;
            ELSE
                prnetosiniva = PRUNIT - DTOITMONTO - dtoit1m - dtoit2m - dtoit3m;
            if (ICOINC = 'SI') then
                SUBTOTIT = TOTAL - IVAITMONTO;
            else
                SUBTOTIT = TOTAL - IVAITMONTO - CONSUMO;
            TOTCONSUMO = TOTCONSUMO + CONSUMO;
            TOTBASE = TOTBASE + BASE;
            SELECT LOTE_VENCE FROM LOTES WHERE LOTE_NRO = :lote AND ARTI_COD = :ARTICULO AND BODE_COD = :boditem INTO :vlote;
            if ((REFITEM <> '.t') or (REFITEM IS NULL)) then
                BEGIN
                /* NO SUME LOS ENSAMBLES */
                if (IVAPORC = 0) then
                    SUMAEX = SUMAEX + TOTAL;
                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;
                END
            if (ANCHO IS NULL) then
                ANCHO = 0;
            if (ALTO IS NULL) then
                ALTO = 0;
            if (LARGO IS NULL) then
                LARGO = 0;
            if (PESO IS NULL) then
                PESO = 0;
            PESO = (PESO / 1000) * CANT * FACTOR;
            totcajas = totcajas + cajas;
            if (substr(ARTICULO,1,2) = '.t') then
                BEGIN
                REFITEM = '';
                TOTAL = 0;
                SUBTOTIT = 0;
                END
            SELECT STAND_COD FROM STANDS WHERE ARTI_COD = :ARTICULO AND STAND_BODEGA = :boditem INTO :stand;
            factcant = NULL;
            SELECT FIRST 1 UNAR_FACCAN FROM unidad_articulo WHERE ARTI_COD = :articulo INTO :factcant;
            if (factcant IS NULL) then
                factcant = 1;
            if ((factcant = 1) or (factcant = 0)) then
                BEGIN
                ALTERNATIVAS = 0;
                PRINCIPALES = (CANT * FACTOR);
                END
            ELSE
                BEGIN
                ALTERNATIVAS = FLOOR(CANT * factor / factcant);
                PRINCIPALES = (CANT * FACTOR) - (alternativas * factcant);
                END
            SUSPEND;
            END
          END
    END
ELSE
    BEGIN
    FOR SELECT FADE_ITEM, D.ARTI_COD, FADE_CODBAR, SUBSTR(FADE_DESC,1,60), ARTI_DESCORTA, FADE_CANT, FADE_UNIDAD, FADE_FACTOR, BODE_COD, FADE_LOTE, LIPR_COD, FADE_PRUNIT, FADE_DTOPORC, FADE_DTOMONTO, FADE_IVAPORC, FADE_IVAMONTO, FADE_CONSUMO, FADE_TOTAL, FADE_REFERENCIA,
        GRUP_COD, SUBG_COD, MARC_COD, ARTI_PESO, ARTI_ANCHO, ARTI_ALTO, ARTI_LARGO, TAIV_COD, FADE_DEVUELTO, FADE_OBS, FADE_DTO1, FADE_DTO2, FADE_DTO3, FADE_DTOM1, FADE_DTOM2, FADE_DTOM3, FADE_CAJAS, FADE_BASE, FADE_PORCBASE
        FROM FACTURAS_DETALLE D, ARTICULO A
        WHERE D.ARTI_COD = A.ARTI_COD AND D.FACT_ID = :ID
        ORDER BY FADE_ITEM
        INTO :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :DESCORTA, :CANT, :UNIDAD, :FACTOR, :BODITEM, :LOTE, :LISTAPR, :PRUNIT, :DTOITPORC, :DTOITMONTO, :IVAPORC, :IVAITMONTO, :CONSUMO, :TOTAL, :refitem,
        :GRUPO, :SUBGRUPO, :MARCA, :PESO, :ANCHO, :ALTO, :LARGO, :TARIFA, :devuelto, :obsitem, :dtoit1, :dtoit2, :dtoit3, :dtoitm1, :dtoitm2, :dtoitm3, :cajas, :base, :porcbase
        DO
          BEGIN
          if (IMPRDEV <> 'SI') then
            BEGIN
            if ((CANT >= 0) AND (DEVUELTO = 0)) then
                IMPR = 'S';
            ELSE
                IMPR = 'N'; /* ES DEVOLUCION */
            END
          ELSE
            IMPR = 'S';
          if (IMPR = 'S') then
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :GRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :MARCA INTO NOMMARCA;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :SUBGRUPO AND GRUP_COD = :GRUPO INTO :NOMSUBG;
            prneto = PRUNIT - DTOITMONTO - dtoitm1 - dtoitm2 - dtoitm3;
            if (IMPTOS = 'S') then
                if (cant <> 0) then
                    prnetosiniva = PRUNIT - DTOITMONTO - ((IVAITMONTO+CONSUMO) / CANT) - dtoit1m - dtoit2m - dtoit3m;
                else
                    prnetosiniva = PRUNIT - DTOITMONTO - dtoitm1 - dtoitm2 - dtoitm3;
            ELSE
                prnetosiniva = PRUNIT - DTOITMONTO - dtoitm1 - dtoitm2 - dtoitm3;
            if (ICOINC = 'SI') then
                SUBTOTIT = TOTAL - IVAITMONTO;
            else
                SUBTOTIT = TOTAL - IVAITMONTO - CONSUMO;
            TOTCONSUMO = TOTCONSUMO + CONSUMO;
            TOTBASE = TOTBASE + BASE;
            SELECT LOTE_VENCE FROM LOTES WHERE LOTE_NRO = :lote AND ARTI_COD = :ARTICULO AND BODE_COD = :boditem INTO :vlote;
            if ((REFITEM <> '.t') or (REFITEM IS NULL)) then
                BEGIN
                /* NO SUME LOS ENSAMBLES */
                if (IVAPORC = 0) then
                    SUMAEX = SUMAEX + TOTAL;
                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;
                END
            if (ANCHO IS NULL) then
                ANCHO = 0;
            if (ALTO IS NULL) then
                ALTO = 0;
            if (LARGO IS NULL) then
                LARGO = 0;
            if (PESO IS NULL) then
                PESO = 0;
            PESO = (PESO / 1000)* CANT * FACTOR;
            totcajas = totcajas + cajas;
            if (substr(ARTICULO,1,2) = '.t') then
                BEGIN
                REFITEM = '';
                TOTAL = 0;
                SUBTOTIT = 0;
                END
            SELECT STAND_COD FROM STANDS WHERE ARTI_COD = :ARTICULO AND STAND_BODEGA = :boditem INTO :stand;            factcant = NULL;
            SELECT FIRST 1 UNAR_FACCAN FROM unidad_articulo WHERE ARTI_COD = :articulo INTO :factcant;
            if (factcant IS NULL) then
                factcant = 1;
            if ((factcant = 1) or (factcant = 0)) then
                BEGIN
                ALTERNATIVAS = 0;
                PRINCIPALES = (CANT * FACTOR);
                END
            ELSE
                BEGIN
                ALTERNATIVAS = FLOOR(CANT * factor / factcant);
                PRINCIPALES = (CANT * FACTOR) - (alternativas * factcant);
                END
            SUSPEND;
            END
          END
    END
END
^

SET TERM ; ^


INSERT INTO FORMATO_DATOS (TIDO_COD, PREF_PRE, DAFO_DATO, DAFO_IMPRIME, DAFO_POSX, DAFO_POSY, DAFO_FORMATO, DAFO_LONG, DAFO_REPITE, DAFO_FONT, DAFO_FSIZE, DAFO_LIQUIDA, DAFO_POSYVAR, DAFO_ITEM, DAFO_INI, DAFO_CORTARPALABRAS, DAFO_JUSTIFICA) VALUES (31, '0000', 'BASE ITEM', 'S', 100, 100, NULL, NULL, 'S', 'Arial', 9, 'N', 'N', 4669, 1, 'S', 'I');
INSERT INTO FORMATO_DATOS (TIDO_COD, PREF_PRE, DAFO_DATO, DAFO_IMPRIME, DAFO_POSX, DAFO_POSY, DAFO_FORMATO, DAFO_LONG, DAFO_REPITE, DAFO_FONT, DAFO_FSIZE, DAFO_LIQUIDA, DAFO_POSYVAR, DAFO_ITEM, DAFO_INI, DAFO_CORTARPALABRAS, DAFO_JUSTIFICA) VALUES (31, '0000', 'PORCENTAJE ITEM', 'S', 300, 100, NULL, NULL, 'S', 'Arial', 9, 'N', 'N', 4670, 1, 'S', 'I');
INSERT INTO FORMATO_DATOS (TIDO_COD, PREF_PRE, DAFO_DATO, DAFO_IMPRIME, DAFO_POSX, DAFO_POSY, DAFO_FORMATO, DAFO_LONG, DAFO_REPITE, DAFO_FONT, DAFO_FSIZE, DAFO_LIQUIDA, DAFO_POSYVAR, DAFO_ITEM, DAFO_INI, DAFO_CORTARPALABRAS, DAFO_JUSTIFICA) VALUES (31, '0000', 'TOTAL BASE', 'S', 500, 100, NULL, NULL, 'N', 'Arial', 9, 'S', 'N', 4671, 1, 'S', 'I');
COMMIT WORK;

/* 20090614 : dias de plazo al tomar el pedido que luego se copie a la factura */
ALTER TABLE PEDIDOS
ADD PEDI_DIASCR SMALLINT;


UPDATE IMPORTACION_INVENTARIO
SET IMIN_COLUMNA = 24,
    IMIN_ANCHO = 10
WHERE (IMIN_TIPO = 23) AND (IMIN_DATO = 'PEDI_DTOFFECHA');


INSERT INTO IMPORTACION_INVENTARIO (IMIN_TIPO, IMIN_DATO, IMIN_COLUMNA, IMIN_ANCHO) VALUES (23, 'PEDI_CREDITO', 17, 10);
COMMIT WORK;

/* 20090613b : PERMITIR CRUCES CON OTROS INGRESOS/EGRESOS */

SET TERM ^ ;

CREATE OR ALTER PROCEDURE CONTABIL_RECICAJA(
    IDDOC INTEGER,
    IDINTER INTEGER)
RETURNS (
    ERROR INTEGER,
    VER CHAR(1),
    IDC INTEGER)
AS
declare variable PREF VARCHAR(4);
declare variable NUM VARCHAR(6);
declare variable FECAUX DATE;
declare variable FECHA CHAR(8);
declare variable CONC CHAR(120);
declare variable VRDTO NUMERIC(18,2);
declare variable VRRTFTE NUMERIC(18,2);
declare variable VRRTIVA NUMERIC(18,2);
declare variable VRRTICA NUMERIC(18,2);
declare variable VRTOTAL NUMERIC(18,2);
declare variable TIPOCOMP VARCHAR(3);
declare variable PREFCONT VARCHAR(4);
declare variable BASE CHAR(1);
declare variable CTABASE VARCHAR(20);
declare variable CAJA CHAR(1);
declare variable CTACAJA VARCHAR(20);
declare variable RTFTE CHAR(1);
declare variable CTARTFTE VARCHAR(20);
declare variable RTIVA CHAR(1);
declare variable CTARTIVA VARCHAR(20);
declare variable RTICA CHAR(1);
declare variable CTARTICA VARCHAR(20);
declare variable DTO CHAR(1);
declare variable CTADTO VARCHAR(20);
declare variable EXISTE CHAR(1);
declare variable CUENTA VARCHAR(20);
declare variable MONTO NUMERIC(18,2);
declare variable ES_RETENCION CHAR(1);
declare variable TIPOCUEN CHAR(1);
declare variable NIT VARCHAR(20);
declare variable PROY VARCHAR(4);
declare variable CENTRO VARCHAR(4);
declare variable DEBITO NUMERIC(18,2);
declare variable CREDITO NUMERIC(18,2);
declare variable NROI INTEGER;
declare variable SUMA NUMERIC(18,2);
declare variable TCTACLIEN VARCHAR(20);
declare variable TCTAPROV VARCHAR(20);
declare variable TCTARTFTE VARCHAR(20);
declare variable TCTARTIVA VARCHAR(20);
declare variable TCTARTICA VARCHAR(20);
declare variable TIPOIT INTEGER;
declare variable IDIT INTEGER;
declare variable PREFIT VARCHAR(4);
declare variable NUMIT VARCHAR(6);
declare variable NUMEROIT VARCHAR(10);
declare variable ABONOIT NUMERIC(18,2);
declare variable CTADIC VARCHAR(20);
declare variable BASEADIC VARCHAR(20);
declare variable PORCADIC NUMERIC(5,2);
declare variable VALORADIC NUMERIC(18,2);
declare variable DBADIC CHAR(1);
declare variable ANULADO CHAR(1);
declare variable VRBASE NUMERIC(18,2);
declare variable PORC numeric(9,2);
declare variable OK INTEGER;
declare variable CRUCES NUMERIC(18,2);
declare variable VRCAJA NUMERIC(18,2);
declare variable DIFCAMBIO NUMERIC(18,2);
declare variable CTADIF VARCHAR(20);
declare variable PROVID INTEGER;
declare variable RTFTEC NUMERIC(18,2);
declare variable RTIVAC NUMERIC(18,2);
declare variable RTICAC NUMERIC(18,2);
declare variable RTFTER CHAR(1);
declare variable CTARTFTER VARCHAR(20);
declare variable RTIVAR CHAR(1);
declare variable CTARTIVAR VARCHAR(20);
declare variable RTICAR CHAR(1);
declare variable CTARTICAR VARCHAR(20);
declare variable RET CHAR(2);
declare variable RTIT NUMERIC(18,2);
BEGIN
ERROR = 0;
/* BUSQUE LA INTERFACE */
EXISTE = 'N';
SELECT 'S',TICO_COD,PRCO_PRE,INCJ_BASE,INCJ_DTOPP,INCJ_RTFTE,INCJ_RTIVA,INCJ_RTICA,INCJ_CAJA,INCJ_CTABASE,INCJ_CTADTO,INCJ_CTARTFTE,INCJ_CTARTIVA,INCJ_CTARTICA,INCJ_CTACAJA,INCJ_CONFIRMAR
    FROM INTERFAZ_CAJA
    WHERE INCJ_ID = :IDINTER
    INTO :EXISTE,:TIPOCOMP,:PREFCONT,:BASE,:DTO,:RTFTE,:RTIVA,:RTICA,:CAJA,:CTABASE,:CTADTO,:CTARTFTE,:CTARTIVA,:CTARTICA,:CTACAJA,:VER;
if (EXISTE = 'S') then
  BEGIN
  /* BORRE LA CONTABILIZACION ANTERIOR */
  OK = 0;
  FOR SELECT CNTB_ID FROM CONTABILIZACION WHERE CNTB_TIPOREF = 61 AND CNTB_IDREF = :IDDOC INTO :OK DO
    BEGIN
    DELETE FROM CONTABILIZACION_DET WHERE CNTB_ID = :OK;
    DELETE FROM CONTABILIZACION WHERE CNTB_ID = :OK;
    END
  /* TRAIGA EL ENCABEZADO DEL RECIBO */
  SELECT PREF_PRE,RECA_NUMERO,RECA_FECHA,R.TERC_NIT,RECA_CONC,RECA_DTOF,RECA_MONTO,RECA_RTFTEMONTO,RECA_RTIVAMONTO,RECA_RTICAMONTO,TERC_CTARTFTE,TERC_CTARTIVA,TERC_CTARTICA,TERC_CTACLIENTE,RECA_ANULADO,RECA_PROVID
    FROM RECIBOS_CAJA R,TERCEROS T
    WHERE RECA_ID = :IDDOC AND R.TERC_NIT = T.TERC_NIT
    INTO :PREF,:NUM,:FECAUX,:NIT,:CONC,:VRDTO,:VRTOTAL,:VRRTFTE,:VRRTIVA,:VRRTICA,:TCTARTFTE,TCTARTIVA,TCTARTICA,TCTACLIEN,:ANULADO,:PROVID;
  if (ANULADO = 'N') then
    BEGIN
    SELECT PREF_CENTRO,PREF_PROY FROM PREFIJOS
        WHERE PREF_PRE = :PREF AND TIDO_COD = 61 INTO :CENTRO,:PROY;
    EXECUTE PROCEDURE FECHA_A_CONTA(:FECAUX) returning_values (:FECHA);
    IDC = GEN_ID(ID_CONTABILIZA,1);
    INSERT INTO CONTABILIZACION (CNTB_ID,CNTB_TIPOCOMP,CNTB_PREFCNT,CNTB_NUMERO,CNTB_FECHA,CNTB_CONCEPTO,CNTB_REF,CNTB_TIPOREF,CNTB_IDREF,CNTB_PREFREF,CNTB_NUMREF,CNTB_PROCESADO)
        VALUES (:IDC,:TIPOCOMP,:PREFCONT,:NUM,:FECHA,:CONC,'',61,:IDDOC,:PREF,:NUM,'N');
    NROI = 0;
    SUMA = 0;
    /* SUME LOS CRUCES PARA LLEVARLOS A LA CUENTA X PAGAR Y RESTAR DE LA CAJA */
    SELECT SUM(RCCR_ABONO) FROM RECIBOS_CAJA_CRUCEC WHERE RECA_ID = :iddoc INTO :CRUCES;
    if (CRUCES IS NULL) then
        CRUCES = 0;
    VRCAJA = VRTOTAL;
    IF ((CAJA = 'K')) THEN
        BEGIN
        if (VRCAJA <> 0) then
            BEGIN
            CUENTA = NULL;
            EXECUTE PROCEDURE VALIDE_CUENTA_C (CTACAJA) RETURNING_VALUES (:OK);
            IF (OK = 0) THEN
                SELECT CUEN_COD,CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :CTACAJA INTO :CUENTA,:TIPOCUEN;
            ELSE
                begin
                EXECUTE PROCEDURE ERROR (61,:IDDOC,:CTACAJA,2);
                CUENTA = CTACAJA;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERROR (61,:IDDOC,:CUENTA,3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                EXECUTE PROCEDURE ERROR (61,:IDDOC,:CUENTA,4);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                IF (VRCAJA > 0) THEN
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID,CNDE_ITEM,CNDE_CUENTA,CNDE_CONC,CNDE_REF,CNDE_DEBITOS,CNDE_CREDITOS,CNDE_BASE,CNDE_PORC,CNDE_TERC,CNDE_PROY,CNDE_CENTRO,CNDE_DOCNUMERO,CNDE_DOCAPLICAR,CNDE_DOCVENCE,CNDE_ARTICULO,CNDE_DOCTIPOA,CNDE_DOCTIPON)
                        VALUES (:IDC,:NROI,:CUENTA,:CONC,'',:VRCAJA,0,0,0,:NIT,:PROY,:CENTRO,NULL,NULL,NULL,NULL,0,0);
                    SUMA = SUMA + VRCAJA;
                    END
                ELSE   
                    BEGIN                     
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID,CNDE_ITEM,CNDE_CUENTA,CNDE_CONC,CNDE_REF,CNDE_DEBITOS,CNDE_CREDITOS,CNDE_BASE,CNDE_PORC,CNDE_TERC,CNDE_PROY,CNDE_CENTRO,CNDE_DOCNUMERO,CNDE_DOCAPLICAR,CNDE_DOCVENCE,CNDE_ARTICULO,CNDE_DOCTIPOA,CNDE_DOCTIPON)
                       VALUES (:IDC,:NROI,:CUENTA,:CONC,'',0,ABS(:VRCAJA),0,0,:NIT,:PROY,:CENTRO,NULL,NULL,NULL,NULL,0,0);
                    SUMA = SUMA + VRCAJA;
                    END
                NROI = NROI + 1;
                END
            END
        END
    IF ((CAJA = 'F')) THEN
        BEGIN
        FOR SELECT MAX(FOPA_CTACONTA),SUM(RCPA_MONTO)
            FROM formas_pago F,recibos_caja_pago R
            WHERE R.RECA_ID = :IDDOC AND R.FOPA_ID = F.FOPA_ID
            GROUP BY FOPA_CTACONTA
            INTO :CTACAJA,:MONTO
        DO
            BEGIN
            if (MONTO <> 0) then
                BEGIN
                CUENTA = NULL;
                EXECUTE PROCEDURE VALIDE_CUENTA_C (CTACAJA) RETURNING_VALUES (:OK);
                IF (OK = 0) THEN
                    SELECT CUEN_COD,CUEN_TIPO FROM CUENTAS
                        WHERE CUEN_COD = :CTACAJA INTO :CUENTA,:TIPOCUEN;
                ELSE
                    begin
                    EXECUTE PROCEDURE ERROR (61,:IDDOC,:CTACAJA,2);
                    CUENTA = CTACAJA;
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (61,:IDDOC,:CUENTA,3);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (61,:IDDOC,:CUENTA,4);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    IF (MONTO > 0) THEN
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID,CNDE_ITEM,CNDE_CUENTA,CNDE_CONC,CNDE_REF,CNDE_DEBITOS,CNDE_CREDITOS,CNDE_BASE,CNDE_PORC,CNDE_TERC,CNDE_PROY,CNDE_CENTRO,CNDE_DOCNUMERO,CNDE_DOCAPLICAR,CNDE_DOCVENCE,CNDE_ARTICULO,CNDE_DOCTIPOA,CNDE_DOCTIPON)
                            VALUES (:IDC,:NROI,:CUENTA,:CONC,'',:MONTO,0,0,0,:NIT,:PROY,:CENTRO,NULL,NULL,NULL,NULL,0,0);
                        SUMA = SUMA + MONTO;
                        END
                    ELSE
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID,CNDE_ITEM,CNDE_CUENTA,CNDE_CONC,CNDE_REF,CNDE_DEBITOS,CNDE_CREDITOS,CNDE_BASE,CNDE_PORC,CNDE_TERC,CNDE_PROY,CNDE_CENTRO,CNDE_DOCNUMERO,CNDE_DOCAPLICAR,CNDE_DOCVENCE,CNDE_ARTICULO,CNDE_DOCTIPOA,CNDE_DOCTIPON)
                            VALUES (:IDC,:NROI,:CUENTA,:CONC,'',0,abs(:MONTO),0,0,:NIT,:PROY,:CENTRO,NULL,NULL,NULL,NULL,0,0);
                        SUMA = SUMA + MONTO;
                        END
                    NROI = NROI + 1;
                    END
                END /* MONTO <> 0 */
            END /* DO FORMA_PAGO */
        END /* CAJA = F */
    if (DTO = 'K') then /* DTO EN CTA CONSTANTE */
        BEGIN
        if (VRDTO <> 0) then
            BEGIN
            CUENTA = NULL;
            EXECUTE PROCEDURE VALIDE_CUENTA_C (CTADTO) RETURNING_VALUES (:OK);
            IF (OK = 0) THEN
                SELECT CUEN_COD,CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :CTADTO INTO :CUENTA,:TIPOCUEN;
            ELSE
                begin
                EXECUTE PROCEDURE ERROR (61,:IDDOC,:CTADTO,2);
                CUENTA = CTADTO;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERROR (61,:IDDOC,:CUENTA,3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                EXECUTE PROCEDURE ERROR (61,:IDDOC,:CUENTA,4);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID,CNDE_ITEM,CNDE_CUENTA,CNDE_CONC,CNDE_REF,CNDE_DEBITOS,CNDE_CREDITOS,CNDE_BASE,CNDE_PORC,CNDE_TERC,CNDE_PROY,CNDE_CENTRO,CNDE_DOCNUMERO,CNDE_DOCAPLICAR,CNDE_DOCVENCE,CNDE_ARTICULO,CNDE_DOCTIPOA,CNDE_DOCTIPON)
                    VALUES (:IDC,:NROI,:CUENTA,:CONC,'',:VRDTO,0,0,0,:NIT,:PROY,:CENTRO,NULL,NULL,NULL,NULL,0,0);
                NROI = NROI + 1;
                SUMA = SUMA + VRDTO;
                END
            END /* VRDTO <> 0 */
        END /* DTO EN CTA CONSTANTE */

    /* LA DIFERENCIA EN CAMBIO */
    SELECT SUM(RCDE_DIFCAMBIO) FROM recibos_caja_detalle WHERE RECA_ID = :iddoc INTO :DIFCAMBIO;
    IF ((DIFCAMBIO IS NOT NULL) AND (DIFCAMBIO <> 0)) THEN
        BEGIN
        if (DIFCAMBIO > 0) then
            execute procedure lee_configuracion('GENERAL','GENERAL','CUENTA DE INGRESO POR DIFERENCIA EN CAMBIO PARA OPERACIONES EN OTRA MONEDA') returning_values (:ctadif);
        else
            execute procedure lee_configuracion('GENERAL','GENERAL','CUENTA DE GASTO POR DIFERENCIA EN CAMBIO PARA OPERACIONES EN OTRA MONEDA') returning_values (:ctadif);
        CUENTA = NULL;
        EXECUTE PROCEDURE VALIDE_CUENTA_C (ctadif) RETURNING_VALUES (:OK);
        IF (OK = 0) THEN
            SELECT CUEN_COD,CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :ctadif INTO :CUENTA,:TIPOCUEN;
        ELSE
            begin
            EXECUTE PROCEDURE ERROR (61,:IDDOC,:ctadif,2);
            CUENTA = ctadif;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERROR (61,:IDDOC,:CUENTA,3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERROR (61,:IDDOC,:CUENTA,4);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            if (DIFCAMBIO > 0) then
                INSERT INTO CONTABILIZACION_DET (CNTB_ID,CNDE_ITEM,CNDE_CUENTA,CNDE_CONC,CNDE_REF,CNDE_DEBITOS,CNDE_CREDITOS,CNDE_BASE,CNDE_PORC,CNDE_TERC,CNDE_PROY,CNDE_CENTRO,CNDE_DOCNUMERO,CNDE_DOCAPLICAR,CNDE_DOCVENCE,CNDE_ARTICULO,CNDE_DOCTIPOA,CNDE_DOCTIPON)
                    VALUES (:IDC,:NROI,:CUENTA,:CONC,'',0,:difcambio,0,0,:NIT,:PROY,:CENTRO,NULL,NULL,NULL,NULL,0,0);
            else
                INSERT INTO CONTABILIZACION_DET (CNTB_ID,CNDE_ITEM,CNDE_CUENTA,CNDE_CONC,CNDE_REF,CNDE_DEBITOS,CNDE_CREDITOS,CNDE_BASE,CNDE_PORC,CNDE_TERC,CNDE_PROY,CNDE_CENTRO,CNDE_DOCNUMERO,CNDE_DOCAPLICAR,CNDE_DOCVENCE,CNDE_ARTICULO,CNDE_DOCTIPOA,CNDE_DOCTIPON)
                    VALUES (:IDC,:NROI,:CUENTA,:CONC,'',ABS(:difcambio),0,0,0,:NIT,:PROY,:CENTRO,NULL,NULL,NULL,NULL,0,0);
            NROI = NROI + 1;
            SUMA = SUMA - difcambio;
            END
        END
    /* RETENCION FUENTE */
    if ((RTFTE = 'T') or (RTFTE = 'K')) then
      if (VRRTFTE <> 0) then
        BEGIN
        if (RTFTE = 'T') then
            CTARTFTE = TCTARTFTE;
        CUENTA = NULL;
        EXECUTE PROCEDURE VALIDE_CUENTA_C (CTARTFTE) RETURNING_VALUES (:OK);
        IF (OK = 0) THEN
            SELECT CUEN_COD,CUEN_RETENCION,CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTARTFTE INTO :CUENTA,:ES_RETENCION,:TIPOCUEN;
        ELSE
            begin
            EXECUTE PROCEDURE ERROR (61,:IDDOC,:CTARTFTE,2);
            CUENTA = CTARTFTE;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERROR (61,:IDDOC,:CUENTA,3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERROR (61,:IDDOC,:CUENTA,4);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            if (ES_RETENCION = 'S') then
                BEGIN
                VRBASE = VRTOTAL + VRDTO + vrrtfte + vrrtiva + vrrtica;
                SELECT CLIE_rtefte from clientes where terc_nit = :NIT INTO :PORC;
                END
            ELSE
                BEGIN
                VRBASE = 0;
                PORC = 0;
                END
            INSERT INTO CONTABILIZACION_DET (CNTB_ID,CNDE_ITEM,CNDE_CUENTA,CNDE_CONC,CNDE_REF,CNDE_DEBITOS,CNDE_CREDITOS,CNDE_BASE,CNDE_PORC,CNDE_TERC,CNDE_PROY,CNDE_CENTRO,CNDE_DOCNUMERO,CNDE_DOCAPLICAR,CNDE_DOCVENCE,CNDE_ARTICULO,CNDE_DOCTIPOA,CNDE_DOCTIPON)
                VALUES (:IDC,:NROI,:CUENTA,:CONC,'',:VRRTFTE,0,:VRBASE,:PORC,:NIT,:PROY,:CENTRO,NULL,NULL,NULL,NULL,0,0);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTFTE;
            END
        END /* RTFTE */
    /* RETENCION IVA */
    if ((RTIVA = 'T') or (RTIVA = 'K')) then
      if (VRRTIVA <> 0) then
        BEGIN
        if (RTIVA = 'T') then
            CTARTIVA = TCTARTIVA;
        CUENTA = NULL;
        EXECUTE PROCEDURE VALIDE_CUENTA_C (CTARTIVA) RETURNING_VALUES (:OK);
        IF (OK = 0) THEN
            SELECT CUEN_COD,CUEN_RETENCION,CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTARTIVA INTO :CUENTA,:ES_RETENCION,:TIPOCUEN;
        ELSE
            begin
            EXECUTE PROCEDURE ERROR (61,:IDDOC,:CTARTIVA,2);
            CUENTA = CTARTIVA;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERROR (61,:IDDOC,:CUENTA,3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERROR (61,:IDDOC,:CUENTA,4);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            if (ES_RETENCION = 'S') then
                BEGIN
                VRBASE = VRTOTAL + VRDTO + vrrtfte + vrrtiva + vrrtica;
                SELECT CLIE_RTEIVA from clientes where terc_nit = :NIT INTO :PORC;
                END
            ELSE
                BEGIN
                VRBASE = 0;
                PORC = 0;
                END
            INSERT INTO CONTABILIZACION_DET (CNTB_ID,CNDE_ITEM,CNDE_CUENTA,CNDE_CONC,CNDE_REF,CNDE_DEBITOS,CNDE_CREDITOS,CNDE_BASE,CNDE_PORC,CNDE_TERC,CNDE_PROY,CNDE_CENTRO,CNDE_DOCNUMERO,CNDE_DOCAPLICAR,CNDE_DOCVENCE,CNDE_ARTICULO,CNDE_DOCTIPOA,CNDE_DOCTIPON)
                VALUES (:IDC,:NROI,:CUENTA,:CONC,'',:VRRTIVA,0,:VRBASE,:PORC,:NIT,:PROY,:CENTRO,NULL,NULL,NULL,NULL,0,0);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTIVA;
            END
        END /* RTIVA */
    /* RETENCION DE ICA */
    if ((RTICA = 'T') or (RTICA = 'K')) then
      if (VRRTICA <> 0) then
        BEGIN
        if (RTICA = 'T') then
            CTARTICA = TCTARTICA;
        CUENTA = NULL;
        EXECUTE PROCEDURE VALIDE_CUENTA_C (CTARTICA) RETURNING_VALUES (:OK);
        IF (OK = 0) THEN
            SELECT CUEN_COD,CUEN_RETENCION,CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTARTICA INTO :CUENTA,:ES_RETENCION,:TIPOCUEN;
        ELSE
            begin
            EXECUTE PROCEDURE ERROR (61,:IDDOC,:CTARTICA,2);
            CUENTA = CTARTICA;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERROR (61,:IDDOC,:CUENTA,3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERROR (61,:IDDOC,:CUENTA,4);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            if (ES_RETENCION = 'S') then
                BEGIN
                VRBASE = VRTOTAL + VRDTO + vrrtfte + vrrtiva + vrrtica;
                SELECT CLIE_RTEICA from clientes where terc_nit = :NIT INTO :PORC;
                END
            ELSE
                BEGIN
                VRBASE = 0;
                PORC = 0;
                END
            INSERT INTO CONTABILIZACION_DET (CNTB_ID,CNDE_ITEM,CNDE_CUENTA,CNDE_CONC,CNDE_REF,CNDE_DEBITOS,CNDE_CREDITOS,CNDE_BASE,CNDE_PORC,CNDE_TERC,CNDE_PROY,CNDE_CENTRO,CNDE_DOCNUMERO,CNDE_DOCAPLICAR,CNDE_DOCVENCE,CNDE_ARTICULO,CNDE_DOCTIPOA,CNDE_DOCTIPON)
                VALUES (:IDC,:NROI,:CUENTA,:CONC,'',:VRRTICA,0,0,0,:NIT,:PROY,:CENTRO,NULL,NULL,NULL,NULL,0,0);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTICA;
            END
        END /* RTICA */
    /* CRUCES CON CXP */
    if (CRUCES <> 0) then
        BEGIN
        SELECT PROV_CTAPAGAR FROM PROVEEDORES WHERE TERC_NIT = :nit INTO :TCTAPROV;
        if (TCTAPROV IS NULL) then
            TCTAPROV = tctaclien;
        CUENTA = NULL;
        EXECUTE PROCEDURE VALIDE_CUENTA_C (TCTAPROV) RETURNING_VALUES (:OK);
        IF (OK = 0) THEN
            SELECT CUEN_COD,CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :TCTAPROV INTO :CUENTA,:TIPOCUEN;
        ELSE
            begin
            EXECUTE PROCEDURE ERROR (61,:IDDOC,:TCTAPROV,2);
            CUENTA = TCTAPROV;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERROR (61,:IDDOC,:CUENTA,3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            /* DEBERIA RECORRER DOCUMENTO POR DOCUMENTO */
            FOR SELECT RCCR_TIPODOC,RCCR_PREFIJO,RCCR_NUMERO,RCCR_ABONO+RCCR_RTFTE+RCCR_RTIVA+RCCR_RTICA+RCCR_DTOF
                FROM recibos_caja_crucec WHERE RECA_ID = :IDDOC
                INTO :TIPOIT,PREFIT,NUMIT,ABONOIT
                DO
                BEGIN
                NUMEROIT = PREFIT || NUMIT;
                if (ABONOIT > 0) then
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID,CNDE_ITEM,CNDE_CUENTA,CNDE_CONC,CNDE_REF,CNDE_DEBITOS,CNDE_CREDITOS,CNDE_BASE,CNDE_PORC,CNDE_TERC,CNDE_PROY,CNDE_CENTRO,CNDE_DOCNUMERO,CNDE_DOCAPLICAR,CNDE_DOCVENCE,CNDE_ARTICULO,CNDE_DOCTIPOA,CNDE_DOCTIPON)
                        VALUES (:IDC,:NROI,:CUENTA,:CONC,'',:ABONOIT,0,0,0,:NIT,:PROY,:CENTRO,NULL,:NUMEROIT,NULL,NULL,:TIPOIT,0);
                else
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID,CNDE_ITEM,CNDE_CUENTA,CNDE_CONC,CNDE_REF,CNDE_DEBITOS,CNDE_CREDITOS,CNDE_BASE,CNDE_PORC,CNDE_TERC,CNDE_PROY,CNDE_CENTRO,CNDE_DOCNUMERO,CNDE_DOCAPLICAR,CNDE_DOCVENCE,CNDE_ARTICULO,CNDE_DOCTIPOA,CNDE_DOCTIPON)
                        VALUES (:IDC,:NROI,:CUENTA,:CONC,'',0, ABS(:ABONOIT),0,0,:NIT,:PROY,:CENTRO,NULL,:NUMEROIT,NULL,NULL,:TIPOIT,0);
                SUMA = SUMA + ABONOIT;
                NROI = NROI + 1;
                END
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            if (CRUCES > 0) then
                INSERT INTO CONTABILIZACION_DET (CNTB_ID,CNDE_ITEM,CNDE_CUENTA,CNDE_CONC,CNDE_REF,CNDE_DEBITOS,CNDE_CREDITOS,CNDE_BASE,CNDE_PORC,CNDE_TERC,CNDE_PROY,CNDE_CENTRO,CNDE_DOCNUMERO,CNDE_DOCAPLICAR,CNDE_DOCVENCE,CNDE_ARTICULO,CNDE_DOCTIPOA,CNDE_DOCTIPON)
                    VALUES (:IDC,:NROI,:CUENTA,:CONC,'',:CRUCES,0,0,0,:NIT,:PROY,:CENTRO,NULL,NULL,NULL,NULL,0,0);
            else
                INSERT INTO CONTABILIZACION_DET (CNTB_ID,CNDE_ITEM,CNDE_CUENTA,CNDE_CONC,CNDE_REF,CNDE_DEBITOS,CNDE_CREDITOS,CNDE_BASE,CNDE_PORC,CNDE_TERC,CNDE_PROY,CNDE_CENTRO,CNDE_DOCNUMERO,CNDE_DOCAPLICAR,CNDE_DOCVENCE,CNDE_ARTICULO,CNDE_DOCTIPOA,CNDE_DOCTIPON)
                    VALUES (:IDC,:NROI,:CUENTA,:CONC,'',0,ABS(:CRUCES),0,0,:NIT,:PROY,:CENTRO,NULL,NULL,NULL,NULL,0,0);
            SUMA = SUMA + CRUCES;
            NROI = NROI + 1;
            END

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

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE RECIBOS_SIN_CONTABILIDAD(
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    ID INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    ESTADO VARCHAR(20),
    IDI INTEGER,
    IDC INTEGER,
    ERROR INTEGER)
AS
DECLARE VARIABLE VER CHAR(2);
declare variable FECICNT VARCHAR(10);
declare variable FECFCNT VARCHAR(10);
declare variable idref INTEGER;
BEGIN /*$$IBE$$ 
EXECUTE PROCEDURE fecha_a_conta(FECINI) returning_values (FECICNT);
EXECUTE PROCEDURE fecha_a_conta(FECFIN) returning_values (FECFCNT);
FOR SELECT RECA_ID, PREF_PRE, RECA_NUMERO FROM RECIBOS_CAJA WHERE RECA_ANULADO = 'N' AND
    RECA_FECHA >= :FECINI AND RECA_FECHA <= :FECFIN and PREF_PRE NOT IN (SELECT AUTO_PREFRDC FROM AUTORIZACIONES) ORDER BY RECA_ID
    INTO :ID, :PREF, :NUMERO
DO
  BEGIN
  idref = null;
  SELECT ENCO_IDREF FROM COMPROBANTE_ENCABEZADO WHERE ENCO_TIPOREF = 61 AND ENCO_FECHA >= :FECICNT AND ENCO_FECHA <= :FECFCNT and ENCO_IDREF = :id into :idref;
  if (idref IS NULL) then
  begin
   ESTADO = 'PROCESANDO';
   SUSPEND;
   SELECT MAX(INCJ_ID) FROM INTERFAZ_CAJA WHERE PREF_PRE = :PREF AND TIDO_COD = 61 INTO :IDI;
   EXECUTE PROCEDURE CONTABIL_RECICAJA (:ID, :IDI) RETURNING_VALUES (:ERROR, :VER, :IDC);
   if (ERROR = 0) then
    BEGIN
    EXECUTE PROCEDURE CONTABILIZA_PENDIENTE (:IDC);
    ESTADO = 'OK';
    END
   ELSE
    ESTADO = 'ERROR';
   suspend;
  end
  END
 $$IBE$$*/ SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE RECIBOS_SIN_CONTABILIDAD(
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    ID INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    ESTADO VARCHAR(20),
    IDI INTEGER,
    IDC INTEGER,
    ERROR INTEGER)
AS
DECLARE VARIABLE VER CHAR(2);
declare variable FECICNT VARCHAR(10);
declare variable FECFCNT VARCHAR(10);
declare variable idref INTEGER;
BEGIN
EXECUTE PROCEDURE fecha_a_conta(FECINI) returning_values (FECICNT);
EXECUTE PROCEDURE fecha_a_conta(FECFIN) returning_values (FECFCNT);
FOR SELECT RECA_ID, PREF_PRE, RECA_NUMERO FROM RECIBOS_CAJA WHERE RECA_ANULADO = 'N' AND
    RECA_FECHA >= :FECINI AND RECA_FECHA <= :FECFIN and PREF_PRE NOT IN (SELECT AUTO_PREFRDC FROM AUTORIZACIONES) ORDER BY RECA_ID
    INTO :ID, :PREF, :NUMERO
DO
  BEGIN
  idref = null;
  SELECT ENCO_IDREF FROM COMPROBANTE_ENCABEZADO WHERE ENCO_TIPOREF = 61 AND ENCO_FECHA >= :FECICNT AND ENCO_FECHA <= :FECFCNT and ENCO_IDREF = :id into :idref;
  if (idref IS NULL) then
  begin
   ESTADO = 'PROCESANDO';
   SUSPEND;
   SELECT MAX(INCJ_ID) FROM INTERFAZ_CAJA WHERE PREF_PRE = :PREF AND TIDO_COD = 61 INTO :IDI;
   EXECUTE PROCEDURE CONTABIL_RECICAJA (:ID, :IDI) RETURNING_VALUES (:ERROR, :VER, :IDC);
   if (ERROR = 0) then
    BEGIN
    EXECUTE PROCEDURE CONTABILIZA_PENDIENTE (:IDC);
    ESTADO = 'OK';
    END
   ELSE
    ESTADO = 'ERROR';
   suspend;
  end
  END
END

^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER PROCEDURE CONTABIL_EGRESO(
    IDDOC INTEGER,
    IDINTER INTEGER)
RETURNS (
    ERROR INTEGER,
    VER CHAR(1),
    IDC INTEGER)
AS
declare variable PREF VARCHAR(4);
declare variable NUM VARCHAR(6);
declare variable FECAUX DATE;
declare variable FECHA CHAR(8);
declare variable CONC CHAR(120);
declare variable VRDTO NUMERIC(18, 2);
declare variable VRRTFTE NUMERIC(18, 2);
declare variable VRRTIVA NUMERIC(18, 2);
declare variable VRRTICA NUMERIC(18, 2);
declare variable VRTOTAL NUMERIC(18, 2);
declare variable TIPOCOMP VARCHAR(3);
declare variable PREFCONT VARCHAR(4);
declare variable BASE CHAR(1);
declare variable CTABASE VARCHAR(20);
declare variable CAJA CHAR(1);
declare variable CTACAJA VARCHAR(20);
declare variable RTFTE CHAR(1);
declare variable CTARTFTE VARCHAR(20);
declare variable RTIVA CHAR(1);
declare variable CTARTIVA VARCHAR(20);
declare variable RTICA CHAR(1);
declare variable CTARTICA VARCHAR(20);
declare variable DTO CHAR(1);
declare variable CTADTO VARCHAR(20);
declare variable EXISTE CHAR(1);
declare variable CUENTA VARCHAR(20);
declare variable MONTO NUMERIC(18,2);
declare variable ES_RETENCION CHAR(1);
declare variable TIPOCUEN CHAR(1);
declare variable NIT VARCHAR(20);
declare variable PROY VARCHAR(4);
declare variable CENTRO VARCHAR(4);
declare variable MONTOBASE NUMERIC(18,2);
declare variable PORC NUMERIC(9,2);
declare variable DEBITO NUMERIC(18,2);
declare variable CREDITO NUMERIC(18,2);
declare variable NROI INTEGER;
declare variable SUMA NUMERIC(18,2);
declare variable TCTACLIEN VARCHAR(20);
declare variable TCTARTFTE VARCHAR(20);
declare variable TCTARTIVA VARCHAR(20);
declare variable TCTARTICA VARCHAR(20);
declare variable TCTACART VARCHAR(20);
declare variable TIPOIT INTEGER;
declare variable IDIT INTEGER;
declare variable PREFIT VARCHAR(4);
declare variable NUMIT VARCHAR(6);
declare variable NUMEROIT VARCHAR(10);
declare variable ABONOIT NUMERIC(18,2);
declare variable CTADIC VARCHAR(20);
declare variable BASEADIC VARCHAR(20);
declare variable PORCADIC NUMERIC(5,2);
declare variable VALORADIC NUMERIC(18,2);
declare variable DBADIC CHAR(1);
declare variable VRBASE NUMERIC(18,2);
declare variable GMF CHAR(1);
declare variable CODBCO INTEGER;
declare variable NUMCHEQ VARCHAR(20);
declare variable CRUCES NUMERIC(18,2);
declare variable VRCAJA NUMERIC(18,2);
declare variable OK INTEGER;
declare variable DIFCAMBIO NUMERIC(18,2);
declare variable CTADIF VARCHAR(20);
declare variable RTFTEC NUMERIC(18,2);
declare variable RTIVAC NUMERIC(18,2);
declare variable RTICAC NUMERIC(18,2);
declare variable RTFTER CHAR(1);
declare variable CTARTFTER VARCHAR(20);
declare variable RTIVAR CHAR(1);
declare variable CTARTIVAR VARCHAR(20);
declare variable RTICAR CHAR(1);
declare variable CTARTICAR VARCHAR(20);
declare variable RET CHAR(2);
declare variable RTIT NUMERIC(18,2);
declare variable NITBCO VARCHAR(20);
BEGIN
/* BUSQUE LA INTERFACE */
EXISTE = 'N';
SELECT 'S', TICO_COD, PRCO_PRE, INCJ_BASE, INCJ_DTOPP, INCJ_RTFTE, INCJ_RTIVA, INCJ_RTICA, INCJ_CAJA, INCJ_CTABASE, INCJ_CTADTO, INCJ_CTARTFTE, INCJ_CTARTIVA, INCJ_CTARTICA, INCJ_CTACAJA, INCJ_CONFIRMAR
    FROM INTERFAZ_CAJA
    WHERE INCJ_ID = :IDINTER
    INTO :EXISTE, :TIPOCOMP, :PREFCONT, :BASE, :DTO, :RTFTE, :RTIVA, :RTICA, :CAJA, :CTABASE, :CTADTO, :CTARTFTE, :CTARTIVA, :CTARTICA, :CTACAJA, :VER;
if (EXISTE = 'S') then
    BEGIN
    OK = 0;
    FOR SELECT CNTB_ID FROM CONTABILIZACION WHERE CNTB_TIPOREF = 62 AND CNTB_IDREF = :IDDOC INTO :OK DO
        BEGIN
        DELETE FROM CONTABILIZACION_DET WHERE CNTB_ID = :OK;
        DELETE FROM CONTABILIZACION WHERE CNTB_ID = :OK;
        END

    /* TRAIGA EL ENCABEZADO DEL EGRESO */
    SELECT PREF_PRE, EGRE_NUMERO, EGRE_FECHA, E.TERC_NIT, EGRE_CONC, EGRE_DTOF, EGRE_MONTO, EGRE_RTFTEMONTO, EGRE_RTIVAMONTO, EGRE_RTICAMONTO, TERC_CTARTFTE, TERC_CTARTIVA, TERC_CTARTICA, TERC_CTACLIENTE
        FROM EGRESOS E, TERCEROS T
        WHERE EGRE_ID = :IDDOC AND E.TERC_NIT = T.TERC_NIT
        INTO :PREF, :NUM, :FECAUX, :NIT, :CONC, :VRDTO, :VRTOTAL, :VRRTFTE, :VRRTIVA, :VRRTICA, :TCTARTFTE, TCTARTIVA, TCTARTICA, TCTACLIEN;
    /* SI ES PROVEEDOR, SOBREESCIBE LAS CUENTAS  */
    SELECT PROV_CTAPAGAR, PROV_CTARTFTE, PROV_CTARTIVA, PROV_CTARTICA
        FROM PROVEEDORES WHERE TERC_NIT = :NIT
        INTO TCTACLIEN, TCTARTFTE, TCTARTIVA, TCTARTICA;
    SELECT PREF_CENTRO, PREF_PROY FROM PREFIJOS
        WHERE PREF_PRE = :PREF AND TIDO_COD = 62 INTO :CENTRO, :PROY;
    EXECUTE PROCEDURE FECHA_A_CONTA(:FECAUX) returning_values (:FECHA);
    /* REGISTRE EL ENCABEZADO CONTABLE */
    IDC = GEN_ID(ID_CONTABILIZA, 1);
    INSERT INTO CONTABILIZACION (CNTB_ID, CNTB_TIPOCOMP, CNTB_PREFCNT, CNTB_NUMERO, CNTB_FECHA, CNTB_CONCEPTO, CNTB_REF, CNTB_TIPOREF, CNTB_IDREF, CNTB_PREFREF, CNTB_NUMREF, CNTB_PROCESADO)
        VALUES (:IDC, :TIPOCOMP, :PREFCONT, :NUM, :FECHA, :CONC, '', 62, :IDDOC, :PREF, :NUM, 'N');
    /* SUME LOS CRUCES PARA LLEVARLOS A LA CUENTA X PAGAR Y RESTAR DE LA CAJA */
    SELECT SUM(EGCC_ABONO) FROM EGRESOS_CRUCEC WHERE EGRE_ID = :iddoc INTO :CRUCES;
    if (CRUCES IS NULL) then
        CRUCES = 0;
    VRCAJA = VRTOTAL;
    NROI = 0;
    SUMA = 0;
    ERROR = 0;
    /* EL CREDITO EN LA CAJA O EL BANCO */
    IF ((CAJA = 'K')) THEN
        BEGIN
        if (VRCAJA <> 0) then
            BEGIN
            CUENTA = NULL;
            EXECUTE PROCEDURE VALIDE_CUENTA_C (CTACAJA) RETURNING_VALUES (:OK);
            IF (OK = 0) THEN
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :CTACAJA INTO :CUENTA, :TIPOCUEN;
            ELSE
                begin
                EXECUTE PROCEDURE ERROR (62, :IDDOC, :CTACAJA, 2);
                CUENTA = CTACAJA;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 4);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRCAJA, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - VRCAJA;
                END
            END /* VRCAJA <> 0 */
        END /* CAJA CONSTANTE */
    IF ((CAJA = 'F')) THEN
        BEGIN
        /* mueva la cuenta de la caja o el banco o ambas */
        /* PRIMERO LA CAJA */
        FOR SELECT CAJA_CUENTA, EGCA_MONTO FROM EGRESOS_CAJA E, CAJAS C
            WHERE C.CAJA_ID = E.CAJA_ID AND EGRE_ID = :IDDOC
            INTO :CTACAJA, :MONTO
            DO
            BEGIN
            if (MONTO <> 0) then
                BEGIN
                CUENTA = NULL;
                EXECUTE PROCEDURE VALIDE_CUENTA_C (CTACAJA) RETURNING_VALUES (:OK);
                IF (OK = 0) THEN
                    SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                        WHERE CUEN_COD = :CTACAJA INTO :CUENTA, :TIPOCUEN;
                ELSE
                    begin
                    EXECUTE PROCEDURE ERROR (62, :IDDOC, :CTACAJA, 2);
                    CUENTA = CTACAJA;
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 4);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA - MONTO;
                    END
                END /* MONTO <> 0 */
            END /* DO CAJA */
        /* AHORA EL BANCO */
        MONTO = 0;
        SELECT CUBA_CTACONTA, EGBC_MONTO, EGBC_GMF, E.CUBA_COD, CUBA_GMFPOR, EGBC_NUMERO, BANC_NIT
            FROM EGRESOS_BANCO E, CUENTAS_BANCO C, BANCOS B
            WHERE E.CUBA_COD = C.CUBA_COD AND EGRE_ID = :IDDOC AND B.banc_cod = C.banc_cod
            INTO :CTACAJA, :MONTO, :GMF, :CODBCO, :PORC, :NUMCHEQ, :nitbco;
        if (MONTO <> 0) then
            BEGIN
            if (MONTO <> 0) then
                BEGIN
                CUENTA = NULL;
                EXECUTE PROCEDURE VALIDE_CUENTA_C (CTACAJA) RETURNING_VALUES (:OK);
                IF (OK = 0) THEN
                    SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                        WHERE CUEN_COD = :CTACAJA INTO :CUENTA, :TIPOCUEN;
                ELSE
                    begin
                    EXECUTE PROCEDURE ERROR (62, :IDDOC, :CTACAJA, 2);
                    CUENTA = CTACAJA;
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 4);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, :NUMCHEQ, 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA - MONTO;
                    END
                /* EL GMF */
                if ((GMF = 'S') AND (PORC <> 0)) then
                    BEGIN
                    if (NITBCO IS NULL) then
                        NITBCO = NIT;
                    EXECUTE procedure REDONDEE(:MONTO * :PORC / 1000, 0) returning_values (MONTO);
                    /* REGISTRE EL GMF EN LA MISMA CUENTA DEL BANCO COMO CREDITO */
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, :NUMCHEQ, 0, :MONTO, 0, 0, :NITBCO, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA - MONTO;

                    /* AHORA LA CUENTA DEL GASTO */
                    SELECT CUBA_CTAGMF FROM CUENTAS_BANCO
                        where CUBA_COD = :CODBCO INTO :CTACAJA;
                    EXECUTE PROCEDURE VALIDE_CUENTA_C (CTACAJA) RETURNING_VALUES (:OK);
                    IF (OK = 0) THEN
                        SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                            WHERE CUEN_COD = :CTACAJA INTO :CUENTA, :TIPOCUEN;
                    ELSE
                        begin
                        EXECUTE PROCEDURE ERROR (62, :IDDOC, :CTACAJA, 2);
                        CUENTA = CTACAJA;
                        TIPOCUEN = 'N';
                        ERROR = ERROR + 1;
                        end
                    if (TIPOCUEN = 'I') then
                        BEGIN
                        EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
                        TIPOCUEN = 'N';
                        ERROR = ERROR + 1;
                        END
                    if (TIPOCUEN = 'C') then
                        BEGIN
                        EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 4);
                        TIPOCUEN = 'N';
                        ERROR = ERROR + 1;
                        END
                    if (TIPOCUEN = 'N') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, :NUMCHEQ, :MONTO, 0, 0, 0, :NITBCO, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NROI = NROI + 1;
                        SUMA = SUMA + MONTO;
                        END
                    END /* GMF */
                END /* MONTO <> 0 */
            END /* EGRESO_BANCO */
        END /* CAJA = F */

    /* LOS CRUCES CON CUENTAS X COBRAR */
    if (CRUCES <> 0) then
        BEGIN
        SELECT TERC_CTACLIENTE FROM TERCEROS WHERE TERC_NIT = :nit INTO :tctacart;
        if (tctacart IS NULL) then
            tctacart = tctaclien;
        CUENTA = NULL;
        EXECUTE PROCEDURE VALIDE_CUENTA_C (tctacart) RETURNING_VALUES (:OK);
        IF (OK = 0) THEN
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :tctacart INTO :CUENTA, :TIPOCUEN;
        ELSE
            begin
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :tctacart, 2);
            CUENTA = tctacart;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            /* DEBERIA RECORRER DOCUMENTO POR DOCUMENTO */
            FOR SELECT EGCC_TIPODOC, EGCC_PREFIJO, EGCC_NUMERO, EGCC_ABONO+EGCC_RTFTE+EGCC_RTIVA+EGCC_RTICA+EGCC_DTOF
                FROM egresos_crucec WHERE EGRE_ID = :IDDOC
                INTO :TIPOIT, PREFIT, NUMIT, ABONOIT
                DO
                BEGIN
                NUMEROIT = PREFIT || NUMIT;
                if (ABONOIT > 0) then
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :ABONOIT, 0, 0, :NIT, :PROY, :CENTRO, NULL, :NUMEROIT, NULL, NULL, :TIPOIT, 0);
                else
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', abs(:ABONOIT), 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, :NUMEROIT, NULL, NULL, :TIPOIT, 0);
                SUMA = SUMA - ABONOIT;
                NROI = NROI + 1;
                END
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            if (CRUCES > 0) then
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :CRUCES, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            else
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', abs(:CRUCES), 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            SUMA = SUMA - CRUCES;
            NROI = NROI + 1;
            END
        /* LA DIFERENCIA EN CAMBIO */
        SELECT SUM(EGCC_DIFCAMBIO) FROM egresos_crucec WHERE EGRE_ID = :iddoc INTO :DIFCAMBIO;
        IF ((DIFCAMBIO IS NOT NULL) AND (DIFCAMBIO <> 0)) THEN
            BEGIN
            if (DIFCAMBIO > 0) then
                execute procedure lee_configuracion('GENERAL','GENERAL','CUENTA DE INGRESO POR DIFERENCIA EN CAMBIO PARA OPERACIONES EN OTRA MONEDA') returning_values (:ctadif);
            else
                execute procedure lee_configuracion('GENERAL','GENERAL','CUENTA DE GASTO POR DIFERENCIA EN CAMBIO PARA OPERACIONES EN OTRA MONEDA') returning_values (:ctadif);
            CUENTA = NULL;
            EXECUTE PROCEDURE VALIDE_CUENTA_C (ctadif) RETURNING_VALUES (:OK);
            IF (OK = 0) THEN
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :ctadif INTO :CUENTA, :TIPOCUEN;
            ELSE
                begin
                EXECUTE PROCEDURE ERROR (62, :IDDOC, :ctadif, 2);
                CUENTA = ctadif;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 4);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                if (DIFCAMBIO > 0) then
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :difcambio, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                else
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', ABS(:difcambio), 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - difcambio;
                END
            END
        /* RETEFUENTE DEL CRUCE */
        SELECT first 1 INCJ_RTFTE, INCJ_RTIVA, INCJ_RTICA, INCJ_CTARTFTE, INCJ_CTARTIVA, INCJ_CTARTICA
            FROM INTERFAZ_CAJA WHERE tido_cod = 61 into :RTFTER, :RTIVAR, :RTICAR, :CTARTFTER, :CTARTIVAR, :CTARTICAR;
        SELECT SUM(EGCC_RTFTE) FROM egresos_crucec WHERE EGRE_ID = :iddoc INTO :rtftec;
        IF ((rtftec IS NOT NULL) AND (rtftec <> 0)) THEN
            BEGIN
            if ((RTFTER = 'T') or (RTFTER = 'K')) then
                BEGIN
                if (RTFTER = 'T') then
                    SELECT TERC_CTARTFTE FROM TERCEROS WHERE TERC_NIT = :NIT INTO CTARTFTER;
                CUENTA = NULL;
                EXECUTE PROCEDURE VALIDE_CUENTA_C (ctartfter) RETURNING_VALUES (:OK);
                IF (OK = 0) THEN
                    SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                        WHERE CUEN_COD = :ctartfter INTO :CUENTA, :TIPOCUEN;
                ELSE
                    begin
                    EXECUTE PROCEDURE ERROR (62, :IDDOC, :ctartfter, 2);
                    CUENTA = ctartfter;
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 4);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    if (rtftec > 0) then
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :rtftec, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    else
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, abs(:rtftec), 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA + rtftec;
                    END
                END
            END
        /* RETEIVA DEL CRUCE */
        SELECT SUM(EGCC_RTIVA) FROM egresos_crucec WHERE EGRE_ID = :iddoc INTO :rtivac;
        IF ((rtivac IS NOT NULL) AND (rtivac <> 0)) THEN
            BEGIN
            if ((RTIVAR = 'T') or (RTIVAR = 'K')) then
                BEGIN
                if (RTIVAR = 'T') then
                    SELECT TERC_CTARTIVA FROM TERCEROS WHERE TERC_NIT = :NIT INTO CTARTIVAR;
                CUENTA = NULL;
                EXECUTE PROCEDURE VALIDE_CUENTA_C (ctartivar) RETURNING_VALUES (:OK);
                IF (OK = 0) THEN
                    SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                        WHERE CUEN_COD = :ctartivar INTO :CUENTA, :TIPOCUEN;
                ELSE
                    begin
                    EXECUTE PROCEDURE ERROR (62, :IDDOC, :ctartivar, 2);
                    CUENTA = ctartivar;
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 4);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    if (rtivac > 0) then
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :rtivac, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    else
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, abs(:rtivac), 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA + rtivac;
                    END
                END
            END
        /* RETEICA DEL CRUCE */
        SELECT SUM(EGCC_RTICA) FROM egresos_crucec WHERE EGRE_ID = :iddoc INTO :rticac;
        IF ((rticac IS NOT NULL) AND (rtivac <> 0)) THEN
            BEGIN
            if ((RTICAR = 'T') or (RTICAR = 'K')) then
                BEGIN
                if (RTICAR = 'T') then
                    SELECT TERC_CTARTICA FROM TERCEROS WHERE TERC_NIT = :NIT INTO CTARTICAR;
                CUENTA = NULL;
                EXECUTE PROCEDURE VALIDE_CUENTA_C (ctarticar) RETURNING_VALUES (:OK);
                IF (OK = 0) THEN
                    SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                        WHERE CUEN_COD = :ctarticar INTO :CUENTA, :TIPOCUEN;
                ELSE
                    begin
                    EXECUTE PROCEDURE ERROR (62, :IDDOC, :ctarticar, 2);
                    CUENTA = ctarticar;
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 4);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    if (rticac > 0) then
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :rticac, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    else
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, abs(:rticac), 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA + rticac;
                    END
                END
            END
        END /* cruces */

    if (DTO = 'K') then /* DTO EN CTA CONSTANTE */
        BEGIN
        if (VRDTO <> 0) then
            BEGIN
            CUENTA = NULL;
            EXECUTE PROCEDURE VALIDE_CUENTA_C (CTADTO) RETURNING_VALUES (:OK);
            IF (OK = 0) THEN
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :CTADTO INTO :CUENTA, :TIPOCUEN;
            ELSE
                begin
                EXECUTE PROCEDURE ERROR (62, :IDDOC, :CTADTO, 2);
                CUENTA = CTADTO;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 4);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRDTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - VRDTO;
                END
            END /* VRDTO <> 0 */
        END /* DTO EN CTA CONSTANTE */

    /* LA DIFERENCIA EN CAMBIO */
    SELECT SUM(EGDE_DIFCAMBIO) FROM egresos_detalle WHERE EGRE_ID = :iddoc INTO :DIFCAMBIO;
    IF ((DIFCAMBIO IS NOT NULL) AND (DIFCAMBIO <> 0)) THEN
        BEGIN
        if (DIFCAMBIO > 0) then
            execute procedure lee_configuracion('GENERAL','GENERAL','CUENTA DE GASTO POR DIFERENCIA EN CAMBIO PARA OPERACIONES EN OTRA MONEDA') returning_values (:ctadif);
        else
            execute procedure lee_configuracion('GENERAL','GENERAL','CUENTA DE INGRESO POR DIFERENCIA EN CAMBIO PARA OPERACIONES EN OTRA MONEDA') returning_values (:ctadif);
        CUENTA = NULL;
        EXECUTE PROCEDURE VALIDE_CUENTA_C (ctadif) RETURNING_VALUES (:OK);
        IF (OK = 0) THEN
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :ctadif INTO :CUENTA, :TIPOCUEN;
        ELSE
            begin
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :ctadif, 2);
            CUENTA = ctadif;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 4);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            if (DIFCAMBIO > 0) then
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :difcambio, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            else
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, ABS(:difcambio), 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA + difcambio;
            END
        END
    /* RETENCION FUENTE */
    if ((RTFTE = 'T') or (RTFTE = 'K')) then
      if (VRRTFTE <> 0) then
        BEGIN
        if (RTFTE = 'T') then
            CTARTFTE = TCTARTFTE;
        CUENTA = NULL;
        EXECUTE PROCEDURE VALIDE_CUENTA_C (CTARTFTE) RETURNING_VALUES (:OK);
        IF (OK = 0) THEN
            SELECT CUEN_COD, CUEN_RETENCION, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTARTFTE INTO :CUENTA, :ES_RETENCION, :TIPOCUEN;
        ELSE
            begin
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :CTARTFTE, 2);
            CUENTA = CTARTFTE;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 4);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            if (ES_RETENCION = 'S') then
                BEGIN
                VRBASE = VRTOTAL;
                SELECT PROV_RETEFTE from proveedores where terc_nit = :NIT INTO :PORC;
                END
            ELSE
                BEGIN
                VRBASE = 0;
                PORC = 0;
                END
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, :VRBASE, :PORC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA - VRRTFTE;
            END
        END /* RTFTE */
    /* RETENCION IVA */
    if ((RTIVA = 'T') or (RTIVA = 'K')) then
      if (VRRTIVA <> 0) then
        BEGIN
        if (RTIVA = 'T') then
            CTARTIVA = TCTARTIVA;
        CUENTA = NULL;
        EXECUTE PROCEDURE VALIDE_CUENTA_C (CTARTIVA) RETURNING_VALUES (:OK);
        IF (OK = 0) THEN
            SELECT CUEN_COD, CUEN_RETENCION, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTARTIVA INTO :CUENTA, :ES_RETENCION, :TIPOCUEN;
        ELSE
            begin
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :CTARTIVA, 2);
            CUENTA = CTARTIVA;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 4);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            if (ES_RETENCION = 'S') then
                BEGIN
                VRBASE = VRTOTAL;
                SELECT PROV_RTEIVA from proveedores where terc_nit = :NIT INTO :PORC;
                END
            ELSE
                BEGIN
                VRBASE = 0;
                PORC = 0;
                END
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTIVA, :VRBASE, :PORC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA - VRRTIVA;
            END
        END /* RTIVA */
    /* RETENCION DE ICA */
    if ((RTICA = 'T') or (RTICA = 'K')) then
      if (VRRTICA <> 0) then
        BEGIN
        if (RTICA = 'T') then
            CTARTICA = TCTARTICA;
        CUENTA = NULL;
        EXECUTE PROCEDURE VALIDE_CUENTA_C (CTARTICA) RETURNING_VALUES (:OK);
        IF (OK = 0) THEN
            SELECT CUEN_COD, CUEN_RETENCION, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTARTICA INTO :CUENTA, :ES_RETENCION, :TIPOCUEN;
        ELSE
            begin
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :CTARTICA, 2);
            CUENTA = CTARTICA;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 4);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            if (ES_RETENCION = 'S') then
                BEGIN
                VRBASE = VRTOTAL;
                SELECT PROV_RTEICA from proveedores where terc_nit = :NIT INTO :PORC;
                END
            ELSE
                BEGIN
                VRBASE = 0;
                PORC = 0;
                END
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTICA, :VRBASE, :PORC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA - VRRTICA;
            END
        END /* RTICA */
    /* RECORRA LAS CUENTAS DE EGRESOS_CONTABILIDAD */
    FOR SELECT CUEN_COD, EGCO_NIT, EGCO_PROY, EGCO_CENTRO, EGCO_CONC, EGCO_DEBITOS, EGCO_CREDITOS, EGCO_BASEM, EGCO_PORC
        FROM EGRESOS_CONTABILIDAD WHERE EGRE_ID = :IDDOC ORDER BY EGCO_ITEM
        INTO :CTABASE, :NIT, :PROY, :CENTRO, :CONC, :DEBITO, :CREDITO, :MONTOBASE, :PORC
        DO
        BEGIN
        CUENTA = NULL;
        EXECUTE PROCEDURE VALIDE_CUENTA_C (CTABASE) RETURNING_VALUES (:OK);
        IF (OK = 0) THEN
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTABASE INTO :CUENTA, :TIPOCUEN;
        ELSE
            begin
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :CTABASE, 2);
            CUENTA = CTABASE;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 4);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'N') then
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :DEBITO, :CREDITO, :MONTOBASE, :PORC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
        SUMA = SUMA + DEBITO - CREDITO;
        NROI = NROI + 1;
        END
    /* CIERRE EL COMPROBANTE CONTRA LA CUENTA DEL TERCERO O LA BASE CONSTANTE */
    if (SUMA <> 0) THEN
        BEGIN
        if (SUMA < 0) then
            BEGIN
            DEBITO = SUMA * -1;
            CREDITO = 0;
            END
        ELSE
            BEGIN
            DEBITO = 0;
            CREDITO = SUMA;
            END
        if ((BASE = 'F') or (BASE = 'T') or (BASE = 'K')) then
            BEGIN
            if (BASE = 'T') then
                CTABASE = TCTACLIEN;
            if (BASE = 'F') then
                BEGIN
                SELECT CAJA_CUENTA FROM EGRESOS E, CAJAS C
                    WHERE C.CAJA_ID = E.CAJA_ID AND EGRE_ID = :IDDOC INTO :CTABASE;
                END
            CUENTA = NULL;
            EXECUTE PROCEDURE VALIDE_CUENTA_C (CTABASE) RETURNING_VALUES (:OK);
            IF (OK = 0) THEN
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :CTABASE INTO :CUENTA, :TIPOCUEN;
            ELSE
                begin
                EXECUTE PROCEDURE ERROR (62, :IDDOC, :CTABASE, 2);
                CUENTA = CTABASE;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                /* DEBERIA RECORRER DOCUMENTO POR DOCUMENTO */
                FOR SELECT RCDE_TIPODOC, RCDE_PREFIJO, RCDE_NUMERO, RCDE_ABONO+RCDE_RTFTE+RCDE_RTIVA+RCDE_RTICA+RCDE_DTOF
                    FROM RECIBOS_CAJA_DETALLE WHERE RECA_ID = :IDDOC
                    INTO :TIPOIT, PREFIT, NUMIT, ABONOIT
                    DO
                    BEGIN
                    NUMEROIT = PREFIT || NUMIT;
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :ABONOIT, 0, 0, :NIT, :PROY, :CENTRO, NULL, :NUMEROIT, NULL, NULL, :TIPOIT, 0);
                    NROI = NROI + 1;
                    END
                END
            if (TIPOCUEN = 'N') then
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :DEBITO, :CREDITO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            END /* SUMA EN CARTERA */
        if (BASE = 'D') then
            BEGIN
            execute procedure lee_configuracion('CXPAGAR','SALDOS','DESCONTAR RETENCIONES POR CAUSACION') returning_values (RET);
            CTABASE = NULL;
            FOR SELECT EGDE_TIPODOC, EGDE_IDDOC, EGDE_PREFIJO, EGDE_NUMERO, EGDE_ABONO+EGDE_DTOF, EGDE_RTFTE+EGDE_RTIVA+EGDE_RTICA
                FROM EGRESOS_DETALLE WHERE EGRE_ID = :IDDOC INTO :tipoit, :IDIT, :PREFIT, :NUMIT, :suma, :RTIT
                DO
                BEGIN
                if (TIPOIT <> 55) then
                    SELECT CUEN_COD, PROY_COD, CENT_COD FROM COMPROBANTE_ENCABEZADO E, COMPROBANTE_DETALLE D
                        WHERE E.enco_consec = D.enco_consec AND E.enco_tiporef = :TIPOIT AND E.enco_idref = :IDIT AND
                        SUBSTR(CUEN_COD,1,1) = '2' AND SUBSTR(CUEN_COD,1,3) <> '236' AND SUBSTR(CUEN_COD,1,4) <> '2408'
                        INTO :ctabase, :proy, :centro;
                else
                    /* tome la base de la configuración y el c.costo del prefijo del recibo */
                    execute procedure lee_configuracion('CAJA', 'EGRESOS', 'CUENTA CONTABLE PARA LOS ANTICIPOS A ACREEDORES SI LA INTERFAZ ES POR DOCUMENTO') returning_values (ctabase);
                if ((ctabase is null) or (ctabase = '')) then
                    CTABASE = TCTACLIEN;
                CUENTA = NULL;
                EXECUTE PROCEDURE VALIDE_CUENTA_C (ctabase) RETURNING_VALUES (:OK);
                IF (OK = 0) THEN
                    SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                        WHERE CUEN_COD = :CTABASE INTO :CUENTA, :TIPOCUEN;
                ELSE
                    begin
                    EXECUTE PROCEDURE ERROR (62, :IDDOC, :CTABASE, 2);
                    CUENTA = CTABASE;
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    end
                if (RET = 'NO') then
                    SUMA = SUMA + RTIT;
                if (SUMA < 0) then
                    BEGIN
                    CREDITO = SUMA * -1;
                    DEBITO = 0;
                    END
                ELSE
                    BEGIN
                    CREDITO = 0;
                    DEBITO = SUMA;
                    END
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    /* DEBERIA RECORRER DOCUMENTO POR DOCUMENTO */
                    NUMEROIT = PREFIT || NUMIT;
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :debito, :credito, 0, 0, :NIT, :PROY, :CENTRO, NULL, :NUMEROIT, NULL, NULL, :TIPOIT, 0);
                    END
                if (TIPOCUEN = 'N') then
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :DEBITO, :CREDITO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                END /* SUMA EN CARTERA */
            END
        END
    /* recorra las cuentas adicionales */
    FOR SELECT INJC_CUENTA, INJC_BASE, INJC_PORC, INJC_VALOR, INJC_DB
        FROM INTERFAZ_CAJA_CTAS
        WHERE INCJ_ID = :IDINTER
        INTO :CTADIC, :BASEADIC, :PORCADIC, :VALORADIC, :DBADIC
        DO
        BEGIN
        if (:BASEADIC = 'TOTAL') then
            VALORADIC = VRTOTAL;
        if (:BASEADIC = 'DESCUENTO') then
            VALORADIC = VRDTO;
        if (:BASEADIC = 'RTFTE') then
            VALORADIC = VRRTFTE;
        if (:BASEADIC = 'RTIVA') then
            VALORADIC = VRRTIVA;
        if (:BASEADIC = 'RTICA') then
            VALORADIC = VRRTICA;
        MONTO = VALORADIC * PORCADIC;
        CUENTA = NULL;
        EXECUTE PROCEDURE VALIDE_CUENTA_C (CTADIC) RETURNING_VALUES (:OK);
        IF (OK = 0) THEN
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTADIC INTO :CUENTA, :TIPOCUEN;
        ELSE
            begin
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :CTADIC, 2);
            CUENTA = CTADIC;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 4);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            if (DBADIC = 'S') then
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTADIC, :CONC, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            ELSE
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTADIC, :CONC, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            END
        NROI = NROI + 1;
        END
    if (ERROR > 0) then
        VER = 'S';
    SUSPEND;
    END /* EXISTE LA INTERFAZ */
  ELSE
    BEGIN
    EXECUTE PROCEDURE ERROR (62, :IDDOC, :PREF, 1);
    ERROR = ERROR + 1;
    VER = 'S';
    SUSPEND;
    END
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE EGRESOS_SIN_CONTABILIDAD(
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    ID INTEGER,
    IDI INTEGER,
    IDC INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    ESTADO VARCHAR(20),
    ERROR INTEGER)
AS
DECLARE VARIABLE VER CHAR(2);
declare variable FECICNT VARCHAR(10);
declare variable FECFCNT VARCHAR(10);
declare variable idref INTEGER;
BEGIN /*$$IBE$$ 
EXECUTE PROCEDURE fecha_a_conta(FECINI) returning_values (FECICNT);
EXECUTE PROCEDURE fecha_a_conta(FECFIN) returning_values (FECFCNT);
FOR SELECT EGRE_ID, PREF_PRE, egre_numero FROM EGRESOS WHERE EGRE_ANULADO = 'N' AND PREF_PRE <> 'R004' AND
    EGRE_FECHA >= :FECINI AND EGRE_FECHA <= :FECFIN ORDER BY EGRE_ID INTO :ID, :PREF, :NUMERO
DO
  BEGIN
  idref = null;
  SELECT ENCO_IDREF FROM COMPROBANTE_ENCABEZADO WHERE ENCO_TIPOREF = 62 AND ENCO_FECHA >= :FECICNT AND ENCO_FECHA <= :FECFCNT and ENCO_IDREF = :ID into :idref;
  if (idref IS NULL) then
  begin
   ESTADO = 'PROCESANDO';
   SUSPEND;
   SELECT MAX(INCJ_ID) FROM INTERFAZ_CAJA WHERE PREF_PRE = :PREF AND TIDO_COD = 62 INTO :IDI;
   EXECUTE PROCEDURE CONTABIL_EGRESO (:ID, :IDI) RETURNING_VALUES (:ERROR, :VER, :IDC);
   IF (ERROR = 0) THEN
      BEGIN
      EXECUTE PROCEDURE CONTABILIZA_PENDIENTE (:IDC);
      ESTADO = 'OK';
      END
   ELSE
    ESTADO = 'ERROR';
   suspend;
  end
  END
 $$IBE$$*/ SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE EGRESOS_SIN_CONTABILIDAD(
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    ID INTEGER,
    IDI INTEGER,
    IDC INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    ESTADO VARCHAR(20),
    ERROR INTEGER)
AS
DECLARE VARIABLE VER CHAR(2);
declare variable FECICNT VARCHAR(10);
declare variable FECFCNT VARCHAR(10);
declare variable idref INTEGER;
BEGIN
EXECUTE PROCEDURE fecha_a_conta(FECINI) returning_values (FECICNT);
EXECUTE PROCEDURE fecha_a_conta(FECFIN) returning_values (FECFCNT);
FOR SELECT EGRE_ID, PREF_PRE, egre_numero FROM EGRESOS WHERE EGRE_ANULADO = 'N' AND PREF_PRE <> 'R004' AND
    EGRE_FECHA >= :FECINI AND EGRE_FECHA <= :FECFIN ORDER BY EGRE_ID INTO :ID, :PREF, :NUMERO
DO
  BEGIN
  idref = null;
  SELECT ENCO_IDREF FROM COMPROBANTE_ENCABEZADO WHERE ENCO_TIPOREF = 62 AND ENCO_FECHA >= :FECICNT AND ENCO_FECHA <= :FECFCNT and ENCO_IDREF = :ID into :idref;
  if (idref IS NULL) then
  begin
   ESTADO = 'PROCESANDO';
   SUSPEND;
   SELECT MAX(INCJ_ID) FROM INTERFAZ_CAJA WHERE PREF_PRE = :PREF AND TIDO_COD = 62 INTO :IDI;
   EXECUTE PROCEDURE CONTABIL_EGRESO (:ID, :IDI) RETURNING_VALUES (:ERROR, :VER, :IDC);
   IF (ERROR = 0) THEN
      BEGIN
      EXECUTE PROCEDURE CONTABILIZA_PENDIENTE (:IDC);
      ESTADO = 'OK';
      END
   ELSE
    ESTADO = 'ERROR';
   suspend;
  end
  END
END

^

SET TERM ; ^

/* 20090613C */
/* deshabilitar la digitación del descuento en pesos */
INSERT INTO CONFIGURACION (CONF_MODULO, CONF_CATEGORIA, CONF_PROPIEDAD, CONF_VALOR, CONF_POSIBLES, CONF_AYUDA) VALUES ('FACTURACION', 'DOCUMENTOS', 'PERMITIR DESCUENTO DE PIE DE DOCUMENTO EN PESOS', 'SI', 'SI,NO', 'NO: Solo permite digitar el porcentaje de descuento si la configuración lo indica pero no el modificar el monto del descuento en pesos');
commit work;

/* 20090613D */
/* agregar zona, vendedor y cobrador */
SET TERM ^ ;

CREATE OR ALTER PROCEDURE MOVIMIENTO_CARTERA_MES(
    FECINI DATE,
    FECFIN DATE,
    SUBEMPRESA INTEGER,
    CONTADO CHAR(1),
    MONEDA INTEGER)
RETURNS (
    NIT VARCHAR(20),
    NOMBRE VARCHAR(60),
    ZONA VARCHAR(2),
    VENDEDOR INTEGER,
    COBRADOR INTEGER,
    CONTACTO VARCHAR(60),
    DIASMAX INTEGER,
    TELEFONO VARCHAR(40),
    INICIAL NUMERIC(18,2),
    DEBITOS NUMERIC(18,2),
    CREDITOS NUMERIC(18,2),
    ABONOS NUMERIC(18,2),
    FINAL NUMERIC(18,2))
AS
declare variable RETES CHAR(2);
declare variable TIPODOC INTEGER;
declare variable IDDOC INTEGER;
declare variable SALDO NUMERIC(18,2);
declare variable NUMROWS INTEGER;
declare variable DIASF INTEGER;
declare variable DIAS INTEGER;
DECLARE VARIABLE FOV CHAR(11);
BEGIN
EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'ANALISIS DE CARTERA CON FECHA FACTURA O VENCIMIENTO') RETURNING_VALUES (FOV);
for select T.TERC_NIT, TERC_NOM, TERC_CONTACTO, TERC_TEL, ZONA_COD, VEND_COD, COBR_COD
    from TERCEROS T, CLIENTES C WHERE T.terc_nit = C.terc_nit AND TERC_CLIE = 'S'
    into :NIT, :NOMBRE, :CONTACTO, :TELEFONO, :zona, :vendedor, :cobrador
  DO
    BEGIN
    diasmax = 0;
    SELECT COUNT(*) FROM AUTORIZACIONES WHERE AUTO_NITCONTADO = :NIT INTO :numrows;
    IF ((CONTADO = 'S') or (numrows = 0)) THEN
        BEGIN
        FECINI = FECINI - 1;
        INICIAL = 0;
        FOR SELECT MVCL_TIPOREF, MVCL_IDREF, (:FECFIN-MVCL_FECHA), (:FECFIN-MVCL_VENCE) FROM MOVIMIENTO_CLIENTES
            WHERE TERC_NIT = :NIT AND MVCL_FECHA <= :FECINI AND
            MVCL_ABONO = 'N' AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA)) AND
            ((:moneda = 0) or (MVCL_TRM <> 1))
            INTO :TIPODOC, :IDDOC, :DIASF, DIAS
            DO
            BEGIN
            EXECUTE PROCEDURE saldo_doc_cartera(TIPODOC, IDDOC, FECINI, MONEDA) returning_values (SALDO);
            if (SALDO <> 0) then
                BEGIN
                INICIAL = INICIAL + SALDO;
                if (FOV = 'FECHA') then
                    BEGIN
                    if ((SALDO > 0) AND (DIASMAX < DIASF)) then
                        DIASMAX = DIASF;
                    END
                ELSE
                    BEGIN
                    if ((SALDO > 0) AND (DIASMAX < DIAS)) then
                        DIASMAX = DIAS;
                    END
                END
            END
        EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'DESCONTAR RETENCIONES POR CAUSACION') returning_values(:RETES);
        FECINI = FECINI + 1;
        if (RETES = 'SI') then
            BEGIN
            if (MONEDA = 0) then
                BEGIN
                SELECT SUM(MVCL_MONTO-MVCL_RTEFTE-MVCL_RTEIVA-MVCL_RTEICA), MAX(:FECFIN-MVCL_FECHA), MAX(:FECFIN-MVCL_VENCE) FROM movimiento_clientes
                    WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND MVCL_FECHA <= :FECFIN
                    AND MVCL_DEBITO = 'S' AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA))
                    INTO :DEBITOS, :diasf, :dias;
                SELECT SUM(MVCL_MONTO-MVCL_RTEFTE-MVCL_RTEIVA-MVCL_RTEICA) FROM movimiento_clientes
                    WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND MVCL_FECHA <= :FECFIN
                    AND MVCL_DEBITO = 'N' AND MVCL_ABONO = 'N' and MVCL_TIPOREF <> 45 AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA))
                    INTO :CREDITOS;
                SELECT SUM(MVCL_MONTO) FROM movimiento_clientes
                    WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND MVCL_FECHA <= :FECFIN
                    AND MVCL_ABONO = 'S' AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA))
                    INTO :ABONOS;
                END
            ELSE
                BEGIN
                SELECT SUM((MVCL_MONTO-MVCL_RTEFTE-MVCL_RTEIVA-MVCL_RTEICA)/MVCL_TRM), MAX(:FECFIN-MVCL_FECHA), MAX(:FECFIN-MVCL_VENCE) FROM movimiento_clientes
                    WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND MVCL_FECHA <= :FECFIN
                    AND MVCL_DEBITO = 'S' AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA))
                    INTO :DEBITOS, :diasf, :dias;
                SELECT SUM((MVCL_MONTO-MVCL_RTEFTE-MVCL_RTEIVA-MVCL_RTEICA)/MVCL_TRM) FROM movimiento_clientes
                    WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND MVCL_FECHA <= :FECFIN
                    AND MVCL_DEBITO = 'N' AND MVCL_ABONO = 'N' and MVCL_TIPOREF <> 45 AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA))
                    INTO :CREDITOS;
                SELECT SUM(MVCL_MONTO/MVCL_TRM) FROM movimiento_clientes
                    WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND MVCL_FECHA <= :FECFIN
                    AND MVCL_ABONO = 'S' AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA))
                    INTO :ABONOS;
                END
            END
        ELSE
            BEGIN
            if (MONEDA = 0) then
                BEGIN
                SELECT SUM(MVCL_MONTO), MAX(:FECFIN-MVCL_FECHA), MAX(:FECFIN-MVCL_VENCE) FROM movimiento_clientes
                    WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND MVCL_FECHA <= :FECFIN
                    AND MVCL_DEBITO = 'S' AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA))
                    INTO :DEBITOS, :diasf, :dias;
                SELECT SUM(MVCL_MONTO) FROM movimiento_clientes
                    WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND MVCL_FECHA <= :FECFIN
                    AND MVCL_DEBITO = 'N' AND MVCL_ABONO = 'N' and MVCL_TIPOREF <> 45 AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA))
                    INTO :CREDITOS;
                SELECT SUM(MVCL_MONTO+MVCL_RTEFTE+MVCL_RTEIVA+MVCL_RTEICA) FROM movimiento_clientes
                    WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND MVCL_FECHA <= :FECFIN
                    AND MVCL_ABONO = 'S' AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA))
                    INTO :ABONOS;
                END
            ELSE
                BEGIN
                SELECT SUM(MVCL_MONTO/MVCL_TRM), MAX(:FECFIN-MVCL_FECHA), MAX(:FECFIN-MVCL_VENCE) FROM movimiento_clientes
                    WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND MVCL_FECHA <= :FECFIN
                    AND MVCL_DEBITO = 'S' AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA))
                    INTO :DEBITOS, :diasf, :dias;
                SELECT SUM(MVCL_MONTO/MVCL_TRM) FROM movimiento_clientes
                    WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND MVCL_FECHA <= :FECFIN
                    AND MVCL_DEBITO = 'N' AND MVCL_ABONO = 'N' and MVCL_TIPOREF <> 45 AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA))
                    INTO :CREDITOS;
                SELECT SUM((MVCL_MONTO+MVCL_RTEFTE+MVCL_RTEIVA+MVCL_RTEICA)/MVCL_TRM) FROM movimiento_clientes
                    WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND MVCL_FECHA <= :FECFIN
                    AND MVCL_ABONO = 'S' AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA))
                    INTO :ABONOS;
                END
            END
        if (FOV = 'FECHA') then
            BEGIN
            if ((DIASMAX < DIASF) AND (DIASF IS NOT NULL)) then
                DIASMAX = DIASF;
            END
        ELSE
            BEGIN
            if ((DIASMAX < DIAS) AND (DIAS IS NOT NULL)) then
                DIASMAX = DIAS;
            END
        if (DEBITOS IS NULL) then
            DEBITOS = 0;
        if (CREDITOS IS NULL) then
            CREDITOS = 0;
        if (ABONOS IS NULL) then
            ABONOS = 0;
        FINAL = INICIAL + DEBITOS - CREDITOS - ABONOS;
        SUSPEND;
        END
    END
END
^

SET TERM ; ^


/* 20090613E */
/* liquidar utilidad por articulo y x documento a ultimo costo */

SET TERM ^ ;

CREATE OR ALTER PROCEDURE REP_UTILIDAD_VENTAS(
    TIPO INTEGER,
    DETALLE CHAR(1),
    FECINI DATE,
    FECFIN DATE,
    ARTINI VARCHAR(15),
    ARTFIN VARCHAR(15),
    GRPINI VARCHAR(3),
    GRPFIN VARCHAR(3),
    ORDEN CHAR(1),
    AGRUPA CHAR(1),
    ULTIMO CHAR(1),
    CEROS CHAR(1),
    SUBEMPRESA INTEGER)
RETURNS (
    ARTICULO VARCHAR(15),
    DESCRIPCION VARCHAR(60),
    CODGRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    CODSUBG VARCHAR(3),
    NOMSUBG VARCHAR(30),
    CODMARC VARCHAR(3),
    NOMMARC VARCHAR(30),
    UNIDAD VARCHAR(8),
    CANTIDAD NUMERIC(18,4),
    BASE NUMERIC(18,4),
    COSTO NUMERIC(18,4),
    UTILIDAD NUMERIC(18,4),
    PORC NUMERIC(9,2),
    IVA NUMERIC(18,4),
    CONSUMO NUMERIC(18,4),
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    TIPODOC INTEGER)
AS
DECLARE VARIABLE COSTOUNIT NUMERIC(18,4);
DECLARE VARIABLE CANTDET NUMERIC(18,4);
declare variable CODINI VARCHAR(15);
declare variable CODFIN VARCHAR(15);
declare variable DESINI VARCHAR(15);
declare variable DESFIN VARCHAR(15);
declare variable MARINI VARCHAR(3);
declare variable MARFIN VARCHAR(3);
declare variable UOM VARCHAR(20);
declare variable NUMROWS INTEGER;
declare variable ULTCOS NUMERIC(18,2);
BEGIN
if (ORDEN = 'C') then
    BEGIN
    CODINI = ARTINI;
    CODFIN = ARTFIN;
    DESINI = '';
    DESFIN = 'zz';
    END
ELSE
    BEGIN
    DESINI = ARTINI;
    DESFIN = ARTFIN;
    CODINI = '';
    CODFIN = 'zz';
    END
if (AGRUPA = 'G') then
    BEGIN
    MARINI = '';
    MARFIN = 'zz';
    END
ELSE
    if (AGRUPA = 'M') then
        BEGIN
        MARINI = GRPINI;
        MARFIN = GRPFIN;
        GRPINI = '';
        GRPFIN = 'zz';
        END
    ELSE
        BEGIN
        MARINI = '';
        MARFIN = 'zz';
        GRPINI = '';
        GRPFIN = 'zz';
        END
EXECUTE PROCEDURE lee_configuracion ('FACTURACION', 'ARTICULOS', 'SUGERIR PRECIOS CON PORCENTAJE DE MARGEN O UTILIDAD') returning_values (:UOM);
if (DETALLE = 'N') then
    BEGIN
    if (BIN_AND(TIPO, 1) <> 0) then
        BEGIN
        TIPODOC = 31;
        /* BORRA LA TABLA AUXILIAR */
        DELETE FROM reportes_aux WHERE REPA_ID = 2 AND REPA_USER = USER;

        FOR SELECT MAX(D.ARTI_COD), SUM(FADE_CANT * FADE_FACTOR), SUM((FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO)*FACT_FACTOR), SUM(FADE_IVAMONTO*FACT_FACTOR), SUM(FADE_CONSUMO),
            MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD)
            FROM FACTURAS_DETALLE D, FACTURAS F, PREFIJOS P, ARTICULO A
            WHERE F.FACT_ID = D.FACT_ID AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND D.ARTI_COD = A.arti_cod AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            FACT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) and substring(a.arti_cod from 1 FOR 2) <> '.t'
            GROUP BY D.ARTI_COD
            INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,
            :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
            DO
            BEGIN
            COSTO = 0;
            FOR SELECT FADE_CANT * FADE_FACTOR, FACT_FECHA FROM FACTURAS_DETALLE D, FACTURAS F, PREFIJOS P
                WHERE F.FACT_ID = D.FACT_ID AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND
                FACT_ANULADO = 'N' AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                and D.ARTI_COD = :articulo  INTO :cantdet, :fecha
                DO
                BEGIN
                EXECUTE PROCEDURE costo_promedio_y_ultimo(:ARTICULO, :FECHA) returning_values (:costounit, :ultcos);
                if (ULTIMO = 'S') then
                    COSTO = COSTO + ultcos * cantdet;
                else
                    COSTO = COSTO + costounit * cantdet;
                END
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            if (CEROS = 'S') then
                INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (2, USER, :ARTICULO);
            SUSPEND;
            END /* FOR */
        if (CEROS = 'S') then
            BEGIN
            COSTO = 0;
            UTILIDAD = 0;
            PORC = 0;
            /* agregue los articulos sin factura */
            FOR SELECT ARTI_COD, 0, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND
                    A.ARTI_DES <= :DESFIN AND A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND
                    (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN)))
                INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,:DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                DO
                BEGIN
                SELECT COUNT(REPA_ARTICULO) FROM REPORTES_AUX WHERE REPA_ID = 2 AND REPA_USER = USER AND REPA_ARTICULO = :articulo INTO :numrows;
                if (numrows = 0) then
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        END
    if (BIN_AND(TIPO, 2) <> 0) then
        BEGIN
        TIPODOC = 32;
        /* BORRA LA TABLA AUXILIAR */
        DELETE FROM reportes_aux WHERE REPA_ID = 2 AND REPA_USER = USER;

        FOR SELECT MAX(D.ARTI_COD), SUM(RVDE_CANT * RVDE_FACTOR), SUM(RVDE_TOTAL-RVDE_IVAMONTO-RVDE_CONSUMO), SUM(RVDE_IVAMONTO), SUM(RVDE_CONSUMO),
            MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD)
            FROM REMISIONES_VENTA_DETALLE D, REMISIONES_VENTA R, PREFIJOS P, ARTICULO A
            WHERE R.REVT_ID = D.REVT_ID AND P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = 32 AND D.ARTI_COD = A.arti_cod AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            REVT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY D.ARTI_COD
            INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,
            :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
            DO
            BEGIN
            COSTO = 0;
            FOR SELECT RVDE_CANT * RVDE_FACTOR, REVT_FECHA FROM remisiones_venta_detalle D, remisiones_venta F, PREFIJOS P
                WHERE F.revt_id = D.revt_id AND REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN AND
                REVT_ANULADO = 'N' AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 32 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                and D.ARTI_COD = :articulo  INTO :cantdet, :fecha
                DO
                BEGIN
                EXECUTE PROCEDURE costo_promedio_y_ultimo(:ARTICULO, :FECHA) returning_values (:costounit, :ultcos);
                if (ULTIMO = 'S') then
                    COSTO = COSTO + ultcos * cantdet;
                else
                    COSTO = COSTO + costounit * cantdet;
                END
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            if (CEROS = 'S') then
                INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (2, USER, :ARTICULO);
            SUSPEND;
            END /* FOR */
        if (CEROS = 'S') then
            BEGIN
            COSTO = 0;
            UTILIDAD = 0;
            PORC = 0;
            /* agregue los articulos sin factura */
            FOR SELECT ARTI_COD, 0, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND
                    A.ARTI_DES <= :DESFIN AND A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND
                    (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN)))
                INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,:DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                DO
                BEGIN
                SELECT COUNT(REPA_ARTICULO) FROM REPORTES_AUX WHERE REPA_ID = 2 AND REPA_USER = USER AND REPA_ARTICULO = :articulo INTO :numrows;
                if (numrows = 0) then
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        END
    if (BIN_AND(TIPO, 4) <> 0) then
        BEGIN
        TIPODOC = 33;
        /* BORRA LA TABLA AUXILIAR */
        DELETE FROM reportes_aux WHERE REPA_ID = 2 AND REPA_USER = USER;

        FOR SELECT MAX(D.ARTI_COD), SUM(DVDE_CANT * DVDE_FACTOR), SUM((DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO)*DEVT_FACTOR), SUM(DVDE_IVAMONTO*DEVT_FACTOR), SUM(DVDE_CONSUMO),
            MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD)
            FROM devoluciones_ventas_detalle D, DEVOLUCIONES_VENTAS V, PREFIJOS P, ARTICULO A
            WHERE V.DEVT_ID = D.DEVT_ID AND P.PREF_PRE = V.PREF_PRE AND P.TIDO_COD = 33 AND D.ARTI_COD = A.arti_cod AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            DEVT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY D.ARTI_COD
            INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,
            :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
            DO
            BEGIN
            COSTO = 0;
            FOR SELECT DVDE_CANT * DVDE_FACTOR, DEVT_FECHA FROM devoluciones_ventas_detalle D, devoluciones_ventas F, PREFIJOS P
                WHERE F.devt_id = D.devt_id AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND
                DEVT_ANULADO = 'N' AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 33 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                and D.ARTI_COD = :articulo  INTO :cantdet, :fecha
                DO
                BEGIN
                EXECUTE PROCEDURE costo_promedio_y_ultimo(:ARTICULO, :FECHA) returning_values (:costounit, :ultcos);
                if (ULTIMO = 'S') then
                    COSTO = COSTO + ultcos * cantdet;
                else
                    COSTO = COSTO + costounit * cantdet;
                END
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            else
                CANTIDAD = CANTIDAD * -1;
            if (BASE IS NULL) then
                BASE = 0;
            else
                BASE = BASE * -1;
            if (IVA IS NULL) then
                IVA = 0;
            else
                IVA = IVA * -1;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            else
                CONSUMO = CONSUMO * -1;
            COSTO = costo * -1;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            if (CEROS = 'S') then
                INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (2, USER, :ARTICULO);
            SUSPEND;
            END /* FOR */
        if (CEROS = 'S') then
            BEGIN
            COSTO = 0;
            UTILIDAD = 0;
            PORC = 0;
            /* agregue los articulos sin factura */
            FOR SELECT ARTI_COD, 0, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND
                    A.ARTI_DES <= :DESFIN AND A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND
                    (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN)))
                INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,:DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                DO
                BEGIN
                SELECT COUNT(REPA_ARTICULO) FROM REPORTES_AUX WHERE REPA_ID = 2 AND REPA_USER = USER AND REPA_ARTICULO = :articulo INTO :numrows;
                if (numrows = 0) then
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        END
    if (BIN_AND(TIPO, 8) <> 0) then
        BEGIN
        TIPODOC = 34;
        /* BORRA LA TABLA AUXILIAR */
        DELETE FROM reportes_aux WHERE REPA_ID = 2 AND REPA_USER = USER;

        FOR SELECT MAX(D.ARTI_COD), SUM(PEDE_CANT * PEDE_FACTOR), SUM((PEDE_TOTAL-PEDE_IVAMONTO-PEDE_CONSUMO)*PEDI_FACTOR), SUM(PEDE_IVAMONTO*PEDI_FACTOR), SUM(PEDE_CONSUMO),
            MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD)
            FROM PEDIDOS_DETALLE D, PEDIDOS P, PREFIJOS R, ARTICULO A
            WHERE P.PEDI_ID = D.PEDI_ID AND P.PREF_PRE = R.PREF_PRE AND R.TIDO_COD = 34 AND D.ARTI_COD = A.arti_cod AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            PEDI_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY D.ARTI_COD
            INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,
            :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
            DO
            BEGIN
            COSTO = 0;
            FOR SELECT PEDE_CANT * PEDE_FACTOR, PEDI_FECHA FROM pedidos_detalle D, pedidos F, PREFIJOS P
                WHERE F.pedi_id = D.pedi_id AND PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND
                PEDI_ANULADO = 'N' AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                and D.ARTI_COD = :articulo  INTO :cantdet, :fecha
                DO
                BEGIN
                EXECUTE PROCEDURE costo_promedio_y_ultimo(:ARTICULO, :FECHA) returning_values (:costounit, :ultcos);
                if (ULTIMO = 'S') then
                    COSTO = COSTO + ultcos * cantdet;
                else
                    COSTO = COSTO + costounit * cantdet;
                END
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            if (CEROS = 'S') then
                INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (2, USER, :ARTICULO);
            SUSPEND;
            END /* FOR */
        if (CEROS = 'S') then
            BEGIN
            COSTO = 0;
            UTILIDAD = 0;
            PORC = 0;
            /* agregue los articulos sin factura */
            FOR SELECT ARTI_COD, 0, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND
                    A.ARTI_DES <= :DESFIN AND A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND
                    (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN)))
                INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,:DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                DO
                BEGIN
                SELECT COUNT(REPA_ARTICULO) FROM REPORTES_AUX WHERE REPA_ID = 2 AND REPA_USER = USER AND REPA_ARTICULO = :articulo INTO :numrows;
                if (numrows = 0) then
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        END
    if (BIN_AND(TIPO, 16) <> 0) then
        BEGIN
        TIPODOC = 35;
        /* BORRA LA TABLA AUXILIAR */
        DELETE FROM reportes_aux WHERE REPA_ID = 2 AND REPA_USER = USER;

        FOR SELECT MAX(D.ARTI_COD), SUM(CTDE_CANT * CTDE_FACTOR), SUM((CTDE_TOTAL-CTDE_IVAMONTO-CTDE_CONSUMO)*COTI_FACTOR), SUM(CTDE_IVAMONTO), SUM(CTDE_CONSUMO),
            MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD)
            FROM COTIZACIONES_DETALLE D, COTIZACIONES C, PREFIJOS P, ARTICULO A
            WHERE C.COTI_ID = D.COTI_ID AND P.PREF_PRE = C.PREF_PRE AND P.TIDO_COD = 35 AND D.ARTI_COD = A.arti_cod AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND COTI_FECHA >= :FECINI AND COTI_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            COTI_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY D.ARTI_COD
            INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,
            :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
            DO
            BEGIN
            COSTO = 0;
            FOR SELECT CTDE_CANT * CTDE_FACTOR, COTI_FECHA FROM cotizaciones_detalle D, cotizaciones F, PREFIJOS P
                WHERE F.coti_id = D.coti_id AND COTI_FECHA >= :FECINI AND COTI_FECHA <= :FECFIN AND
                COTI_ANULADO = 'N' AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                and D.ARTI_COD = :articulo  INTO :cantdet, :fecha
                DO
                BEGIN
                EXECUTE PROCEDURE costo_promedio_y_ultimo(:ARTICULO, :FECHA) returning_values (:costounit, :ultcos);
                if (ULTIMO = 'S') then
                    COSTO = COSTO + ultcos * cantdet;
                else
                    COSTO = COSTO + costounit * cantdet;
                END
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            if (CEROS = 'S') then
                INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (2, USER, :ARTICULO);
            SUSPEND;
            END /* FOR */
        if (CEROS = 'S') then
            BEGIN
            COSTO = 0;
            UTILIDAD = 0;
            PORC = 0;
            /* agregue los articulos sin factura */
            FOR SELECT ARTI_COD, 0, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND
                    A.ARTI_DES <= :DESFIN AND A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND
                    (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN)))
                INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,:DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                DO
                BEGIN
                SELECT COUNT(REPA_ARTICULO) FROM REPORTES_AUX WHERE REPA_ID = 2 AND REPA_USER = USER AND REPA_ARTICULO = :articulo INTO :numrows;
                if (numrows = 0) then
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        END
    END
ELSE
    BEGIN
    if (BIN_AND(TIPO, 1) <> 0) then
        BEGIN
        TIPODOC = 31;
        FOR SELECT F.PREF_PRE, FACT_NUMERO, FACT_FECHA, D.ARTI_COD, FADE_CANT * FADE_FACTOR, (FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO)*FACT_FACTOR, FADE_IVAMONTO*FACT_FACTOR, FADE_CONSUMO,
            ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
            FROM FACTURAS F, FACTURAS_DETALLE D, PREFIJOS P, ARTICULO A
            WHERE F.FACT_ID = D.FACT_ID AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND D.ARTI_COD = A.arti_cod AND
                A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
                A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND FACT_FECHA >= :FECINI AND
                (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
                FACT_FECHA <= :FECFIN AND FACT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) and substring(a.arti_cod from 1 FOR 2) <> '.t'
            ORDER BY D.ARTI_COD, FACT_FECHA, F.FACT_ID, FADE_ITEM
            INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,
                :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
            DO
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            EXECUTE PROCEDURE costo_promedio_y_ultimo(:ARTICULO, :FECHA) returning_values (:costounit, :ultcos);
            if (ULTIMO = 'S') then
                COSTO = ultcos * cantidad;
            else
                COSTO = costounit * cantidad;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            SUSPEND;
            END
        END
    if (BIN_AND(TIPO, 2) <> 0) then
        BEGIN
        TIPODOC = 32;
        FOR SELECT R.PREF_PRE, REVT_NUMERO, REVT_FECHA, D.ARTI_COD, RVDE_CANT * RVDE_FACTOR, RVDE_TOTAL-RVDE_IVAMONTO-RVDE_CONSUMO, RVDE_IVAMONTO, RVDE_CONSUMO,
            ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
            FROM REMISIONES_VENTA R, REMISIONES_VENTA_DETALLE D, PREFIJOS P, ARTICULO A
            WHERE R.REVT_ID = D.REVT_ID AND P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = 32 AND D.ARTI_COD = A.arti_cod AND
                A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
                A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN AND
                (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
                REVT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            ORDER BY D.ARTI_COD, REVT_FECHA, R.REVT_ID, RVDE_ITEM
            INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,
                :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
            DO
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            EXECUTE PROCEDURE costo_promedio_y_ultimo(:ARTICULO, :FECHA) returning_values (:costounit, :ultcos);
            if (ULTIMO = 'S') then
                COSTO = ultcos * cantidad;
            else
                COSTO = costounit * cantidad;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            SUSPEND;
            END
        END
    if (BIN_AND(TIPO, 4) <> 0) then
        BEGIN
        TIPODOC = 33;
        FOR SELECT V.PREF_PRE, DEVT_NUMERO, DEVT_FECHA, D.ARTI_COD, DVDE_CANT * DVDE_FACTOR, (DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO)*DEVT_FACTOR, DVDE_IVAMONTO*DEVT_FACTOR, DVDE_CONSUMO,
            ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
            FROM DEVOLUCIONES_VENTAS V, DEVOLUCIONES_VENTAS_DETALLE D, PREFIJOS P, ARTICULO A
            WHERE V.DEVT_ID = D.DEVT_ID AND P.PREF_PRE = V.PREF_PRE AND P.TIDO_COD = 33 AND D.ARTI_COD = A.arti_cod AND
                A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
                A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND
                (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
                DEVT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            ORDER BY D.ARTI_COD, DEVT_FECHA, V.DEVT_ID, DVDE_ITEM
            INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,
                :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
            DO
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            CANTIDAD = CANTIDAD * -1;
            EXECUTE PROCEDURE costo_promedio_y_ultimo(:ARTICULO, :FECHA) returning_values (:costounit, :ultcos);
            if (ULTIMO = 'S') then
                COSTO = ultcos * cantidad;
            else
                COSTO = costounit * cantidad;
            BASE = BASE * -1;
            IVA = IVA * -1;
            CONSUMO = CONSUMO * -1;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            SUSPEND;
            END
        END
    if (BIN_AND(TIPO, 8) <> 0) then
        BEGIN
        TIPODOC = 34;
        FOR SELECT P.PREF_PRE, PEDI_NUMERO, PEDI_FECHA, D.ARTI_COD, PEDE_CANT * PEDE_FACTOR, (PEDE_TOTAL-PEDE_IVAMONTO-PEDE_CONSUMO)*PEDI_FACTOR, PEDE_IVAMONTO*PEDI_FACTOR, PEDE_CONSUMO,
            ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD 
            FROM PEDIDOS P, PEDIDOS_DETALLE D, PREFIJOS R, ARTICULO A
            WHERE P.PEDI_ID = D.PEDI_ID AND P.PREF_PRE = R.PREF_PRE AND R.TIDO_COD = 34 AND D.ARTI_COD = A.arti_cod AND
                A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
                A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND
                (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
                PEDI_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            ORDER BY D.ARTI_COD, PEDI_FECHA, P.PEDI_ID, PEDE_ITEM
            INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,
                :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
            DO
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            EXECUTE PROCEDURE costo_promedio_y_ultimo(:ARTICULO, :FECHA) returning_values (:costounit, :ultcos);
            if (ULTIMO = 'S') then
                COSTO = ultcos * cantidad;
            else
                COSTO = costounit * cantidad;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            SUSPEND;
            END
        END
    if (BIN_AND(TIPO, 16) <> 0) then
        BEGIN
        TIPODOC = 35;
        FOR SELECT C.PREF_PRE, COTI_NUMERO, COTI_FECHA, D.ARTI_COD, CTDE_CANT * CTDE_FACTOR, (CTDE_TOTAL-CTDE_IVAMONTO-CTDE_CONSUMO)*COTI_FACTOR, CTDE_IVAMONTO*COTI_FACTOR, CTDE_CONSUMO,
            ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD 
            FROM COTIZACIONES C, COTIZACIONES_DETALLE D, PREFIJOS P, ARTICULO A
            WHERE C.COTI_ID = D.COTI_ID AND P.PREF_PRE = C.PREF_PRE AND P.TIDO_COD = 35 AND D.ARTI_COD = A.arti_cod AND
                A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
                A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND COTI_FECHA >= :FECINI AND COTI_FECHA <= :FECFIN AND
                (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
                COTI_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            ORDER BY D.ARTI_COD, COTI_FECHA, C.COTI_ID, CTDE_ITEM
            INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,
                :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
            DO
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            EXECUTE PROCEDURE costo_promedio_y_ultimo(:ARTICULO, :FECHA) returning_values (:costounit, :ultcos);
            if (ULTIMO = 'S') then
                COSTO = ultcos * cantidad;
            else
                COSTO = costounit * cantidad;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            SUSPEND;
            END
        END
    END
END
^

SET TERM ; ^


SET TERM ^ ;

CREATE OR ALTER PROCEDURE UTILIDAD_VENTAS(
    TIPO INTEGER,
    DETALLE CHAR(1),
    FECINI DATE,
    FECFIN DATE,
    PREFIJO VARCHAR(4),
    ULTIMO CHAR(1),
    SUBEMPRESA INTEGER)
RETURNS (
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    PTVTID INTEGER,
    VENDCOD INTEGER,
    NIT VARCHAR(20),
    NOMTERCERO VARCHAR(60),
    ARTICULO VARCHAR(15),
    ARTIDES VARCHAR(60),
    CANT NUMERIC(18,4),
    UNIDAD VARCHAR(8),
    PRECIO NUMERIC(18,2),
    COSTO NUMERIC(18,2),
    UTILIDAD NUMERIC(18,2),
    PORC NUMERIC(9,2))
AS
declare variable IMPTOS CHAR(1);
declare variable ID INTEGER;
declare variable IVA NUMERIC(18,2);
declare variable COSTOT NUMERIC(18,2);
declare variable ULTCOS NUMERIC(18,2);
declare variable PRECIOT NUMERIC(18,2);
declare variable UOM VARCHAR(20);
declare variable icoinc char(2);
declare variable consumo NUMERIC(18,2);
declare variable factor NUMERIC(18,4);
BEGIN
EXECUTE PROCEDURE lee_configuracion ('FACTURACION', 'ARTICULOS', 'SUGERIR PRECIOS CON PORCENTAJE DE MARGEN O UTILIDAD') returning_values (:UOM);
EXECUTE PROCEDURE lee_configuracion ('FACTURACION', 'ARTICULOS', 'IMPOCONSUMO INCLUIDO EN EL PRECIO BASE DE VENTA ANTES DE IVA') returning_values (:icoinc);
/* DETERMINE LA TABLA A EXAMINAR */
if (TIPO = 31) then
    BEGIN
    /* FACTURA */
    FOR SELECT FACT_ID, F.PREF_PRE, FACT_NUMERO, FACT_FECHA, PTVT_ID, VEND_COD, TERC_NIT, FACT_NOMCLIENTE, FACT_IVAINC, fact_factor
        FROM FACTURAS F, PREFIJOS P
        WHERE FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND FACT_ANULADO = 'N'
         AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = :TIPO AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
        ORDER BY FACT_FECHA, F.PREF_PRE, FACT_NUMERO
        INTO :ID, :PREF, :NUMERO, :FECHA, :PTVTID, :VENDCOD, :NIT, :NOMTERCERO, :IMPTOS, :factor
        DO
        if ((PREFIJO = '') or (PREFIJO = PREF)) then
          BEGIN
          COSTOT = 0;
          PRECIOT = 0;
          FOR SELECT D.ARTI_COD, SUBSTR(FADE_DESC,1,60), FADE_CANT * FADE_FACTOR, FADE_UNIDAD, (FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO)*:FACTOR, FADE_IVAMONTO, fade_consumo
            FROM FACTURAS_DETALLE D
            WHERE FACT_ID = :ID and substring(D.arti_cod from 1 FOR 2) <> '.t'
            INTO :ARTICULO, :ARTIDES, :CANT, :UNIDAD, :PRECIO, :IVA, :consumo
            DO
                BEGIN
                EXECUTE PROCEDURE costo_promedio_y_ultimo(:ARTICULO, :FECHA) returning_values (:COSTO, :ultcos);
                if (ULTIMO = 'S') then
                    COSTO = ultcos * CANT;
                else
                    COSTO = COSTO * CANT;
                if (DETALLE = 'S') then
                    BEGIN
                    UTILIDAD = PRECIO - COSTO;
                    if (UOM = 'UTILIDAD') then
                        EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                    else
                        EXECUTE PROCEDURE PORCENTAJE (utilidad,  PRECIO, 'S') returning_values (PORC);
                    SUSPEND;
                    END
                ELSE
                    BEGIN
                    COSTOT = COSTOT + COSTO;
                    PRECIOT = PRECIOT + PRECIO;
                    END
                END
          if (DETALLE <> 'S') then
            BEGIN
            COSTO = COSTOT;
            PRECIO = PRECIOT;
            UTILIDAD = PRECIO - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  PRECIO, 'S') returning_values (PORC);
            SUSPEND;
            END
          END
    END
  if (TIPO = 32) then
    BEGIN
    /* REMISION */
    FOR SELECT REVT_ID, R.PREF_PRE, REVT_NUMERO, REVT_FECHA, PTVT_ID, VEND_COD, TERC_NIT, REVT_NOMTERC, REVT_IVAINC
        FROM REMISIONES_VENTA R, PREFIJOS P
        WHERE REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN AND REVT_ANULADO = 'N'
         AND P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = :TIPO AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
        ORDER BY REVT_FECHA, R.PREF_PRE, REVT_NUMERO
        INTO :ID, :PREF, :NUMERO, :FECHA, :PTVTID, :VENDCOD, :NIT, :NOMTERCERO, :IMPTOS
        DO
        if ((PREFIJO = '') or (PREFIJO = PREF)) then
          BEGIN
          COSTOT = 0;
          PRECIOT = 0;
          FOR SELECT D.ARTI_COD, SUBSTR(RVDE_DESC,1,60), RVDE_CANT * RVDE_FACTOR, RVDE_UNIDAD, (RVDE_TOTAL-RVDE_IVAMONTO-RVDE_CONSUMO), RVDE_IVAMONTO, rvde_consumo
            FROM REMISIONES_VENTA_DETALLE D
            WHERE REVT_ID = :ID and substring(D.arti_cod from 1 FOR 2) <> '.t'
            INTO :ARTICULO, :ARTIDES, :CANT, :UNIDAD, :PRECIO, :IVA, :consumo
            DO
                BEGIN
                EXECUTE PROCEDURE costo_promedio_y_ultimo(:ARTICULO, :FECHA) returning_values (:COSTO, :ultcos);
                if (ULTIMO = 'S') then
                    COSTO = ultcos * CANT;
                else
                    COSTO = COSTO * CANT;
                if (DETALLE = 'S') then
                    BEGIN
                    UTILIDAD = PRECIO - COSTO;
                    if (UOM = 'UTILIDAD') then
                        EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                    else
                        EXECUTE PROCEDURE PORCENTAJE (utilidad,  PRECIO, 'S') returning_values (PORC);
                    SUSPEND;
                    END
                ELSE
                    BEGIN
                    COSTOT = COSTOT + COSTO;
                    PRECIOT = PRECIOT + PRECIO;
                    END
                END
          if (DETALLE <> 'S') then
            BEGIN
            COSTO = COSTOT;
            PRECIO = PRECIOT;
            UTILIDAD = PRECIO - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  PRECIO, 'S') returning_values (PORC);
            SUSPEND;
            END
          END
    END
  if (TIPO = 33) then
    BEGIN
    /* DEVOLUCION */
    FOR SELECT DEVT_ID, D.PREF_PRE, DEVT_NUMERO, DEVT_FECHA, PTVT_ID, VEND_COD, TERC_NIT, DEVT_NOMTERC, DEVT_IVAINC, DEVT_FACTOR
        FROM DEVOLUCIONES_VENTAS D, PREFIJOS P
        WHERE DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND DEVT_ANULADO = 'N'
         AND P.PREF_PRE = D.PREF_PRE AND P.TIDO_COD = :TIPO AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
        ORDER BY DEVT_FECHA, D.PREF_PRE, DEVT_NUMERO
        INTO :ID, :PREF, :NUMERO, :FECHA, :PTVTID, :VENDCOD, :NIT, :NOMTERCERO, :IMPTOS, :FACTOR
        DO
        if ((PREFIJO = '') or (PREFIJO = PREF)) then
          BEGIN
          COSTOT = 0;
          PRECIOT = 0;
          FOR SELECT D.ARTI_COD, SUBSTR(DVDE_DESC,1,60), DVDE_CANT * DVDE_FACTOR, DVDE_UNIDAD, (DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO)*:FACTOR, DVDE_IVAMONTO, dvde_consumo
            FROM DEVOLUCIONES_VENTAS_DETALLE D
            WHERE DEVT_ID = :ID and substring(D.arti_cod from 1 FOR 2) <> '.t'
            INTO :ARTICULO, :ARTIDES, :CANT, :UNIDAD, :PRECIO, :IVA, :consumo
            DO
                BEGIN
                EXECUTE PROCEDURE costo_promedio_y_ultimo(:ARTICULO, :FECHA) returning_values (:COSTO, :ultcos);
                if (ULTIMO = 'S') then
                    COSTO = ultcos * CANT;
                else
                    COSTO = COSTO * CANT;
                if (DETALLE = 'S') then
                    BEGIN
                    UTILIDAD = PRECIO - COSTO;
                    if (UOM = 'UTILIDAD') then
                        EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                    else
                        EXECUTE PROCEDURE PORCENTAJE (utilidad,  PRECIO, 'S') returning_values (PORC);
                    SUSPEND;
                    END
                ELSE
                    BEGIN
                    COSTOT = COSTOT + COSTO;
                    PRECIOT = PRECIOT + PRECIO;
                    END
                END
        if (DETALLE <> 'S') then
            BEGIN
            COSTO = COSTOT;
            PRECIO = PRECIOT;
            UTILIDAD = PRECIO - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  PRECIO, 'S') returning_values (PORC);
            SUSPEND;
            END
        END
    END
  if (TIPO = 34) then
    BEGIN
    /* PEDIDO */
    FOR SELECT PEDI_ID, P.PREF_PRE, PEDI_NUMERO, PEDI_FECHA, PTVT_ID, VEND_COD, TERC_NIT, PEDI_NOMTERC, PEDI_IVAINC, PEDI_FACTOR
        FROM PEDIDOS P, PREFIJOS R
        WHERE PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND PEDI_ANULADO = 'N'
         AND P.PREF_PRE = R.PREF_PRE AND R.TIDO_COD = :TIPO AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
        ORDER BY PEDI_FECHA, P.PREF_PRE, PEDI_NUMERO
        INTO :ID, :PREF, :NUMERO, :FECHA, :PTVTID, :VENDCOD, :NIT, :NOMTERCERO, :IMPTOS, :FACTOR
        DO
        if ((PREFIJO = '') or (PREFIJO = PREF)) then
          BEGIN
          COSTOT = 0;
          PRECIOT = 0;
          FOR SELECT ARTI_COD, SUBSTR(PEDE_DESC,1,60), PEDE_CANT * PEDE_FACTOR, PEDE_UNIDAD, (PEDE_TOTAL-PEDE_IVAMONTO-PEDE_CONSUMO)*:FACTOR, PEDE_IVAMONTO, pede_consumo
            FROM PEDIDOS_DETALLE
            WHERE PEDI_ID = :ID
            INTO :ARTICULO, :ARTIDES, :CANT, :UNIDAD, :PRECIO, :IVA, :consumo
            DO
                BEGIN
                EXECUTE PROCEDURE costo_promedio_y_ultimo(:ARTICULO, :FECHA) returning_values (:COSTO, :ultcos);
                if (ULTIMO = 'S') then
                    COSTO = ultcos * CANT;
                else
                    COSTO = COSTO * CANT;
                if (DETALLE = 'S') then
                    BEGIN
                    UTILIDAD = PRECIO - COSTO;
                    if (UOM = 'UTILIDAD') then
                        EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                    else
                        EXECUTE PROCEDURE PORCENTAJE (utilidad,  PRECIO, 'S') returning_values (PORC);
                    SUSPEND;
                    END
                ELSE
                    BEGIN
                    COSTOT = COSTOT + COSTO;
                    PRECIOT = PRECIOT + PRECIO;
                    END
                END
        if (DETALLE <> 'S') then
            BEGIN
            COSTO = COSTOT;
            PRECIO = PRECIOT;
            UTILIDAD = PRECIO - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  PRECIO, 'S') returning_values (PORC);
            SUSPEND;
            END
        END
    END
  if (TIPO = 35) then
    BEGIN
    /* COTIZACION */
    FOR SELECT COTI_ID, C.PREF_PRE, COTI_NUMERO, COTI_FECHA, PTVT_ID, VEND_COD, TERC_NIT, COTI_NOMTERC, COTI_IMPTOS, COTI_FACTOR
        FROM COTIZACIONES C, PREFIJOS P
        WHERE COTI_FECHA >= :FECINI AND COTI_FECHA <= :FECFIN AND COTI_ANULADO = 'N'
         AND P.PREF_PRE = C.PREF_PRE AND P.TIDO_COD = :TIPO AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
        ORDER BY COTI_FECHA, C.PREF_PRE, COTI_NUMERO
        INTO :ID, :PREF, :NUMERO, :FECHA, :PTVTID, :VENDCOD, :NIT, :NOMTERCERO, :IMPTOS, :FACTOR
        DO
        if ((PREFIJO = '') or (PREFIJO = PREF)) then
          BEGIN
          COSTOT = 0;
          PRECIOT = 0;
          FOR SELECT ARTI_COD, SUBSTR(CTDE_DESC,1,60), CTDE_CANT * CTDE_FACTOR, CTDE_UNIDAD, (CTDE_TOTAL-CTDE_IVAMONTO-CTDE_CONSUMO)*:FACTOR, CTDE_IVAMONTO, ctde_consumo
            FROM COTIZACIONES_DETALLE
            WHERE COTI_ID = :ID
            INTO :ARTICULO, :ARTIDES, :CANT, :UNIDAD, :PRECIO, :IVA, :consumo
            DO
                BEGIN
                EXECUTE PROCEDURE costo_promedio_y_ultimo(:ARTICULO, :FECHA) returning_values (:COSTO, :ultcos);
                if (ULTIMO = 'S') then
                    COSTO = ultcos * CANT;
                else
                    COSTO = COSTO * CANT;
                if (DETALLE = 'S') then
                    BEGIN
                    UTILIDAD = PRECIO - COSTO;
                    if (UOM = 'UTILIDAD') then
                        EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                    else
                        EXECUTE PROCEDURE PORCENTAJE (utilidad,  PRECIO, 'S') returning_values (PORC);
                    SUSPEND;
                    END
                ELSE
                    BEGIN
                    COSTOT = COSTOT + COSTO;
                    PRECIOT = PRECIOT + PRECIO;
                    END
                END
        if (DETALLE <> 'S') then
            BEGIN
            COSTO = COSTOT;
            PRECIO = PRECIOT;
            UTILIDAD = PRECIO - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  PRECIO, 'S') returning_values (PORC);
            SUSPEND;
            END
        END
    END
END
^

SET TERM ; ^


/* 20090614b */
/* CORRECCION FORMATO 1011 */

SET TERM ^ ;

CREATE OR ALTER procedure MM_1011 (
    INICIO char(8),
    FINAL char(8))
AS
declare variable CONCEPTO INTEGER;
declare variable SALDO NUMERIC(18,0);
declare variable SALDOAUX NUMERIC(18,0);
declare variable ITEM INTEGER;
declare variable ANO CHAR(4);
declare variable CUENTA VARCHAR(20);
begin
ITEM = 1;
ANO = SUBSTR(INICIO,1,4);
FOR SELECT COME_ITEM, COME_RESPUESTA FROM CONFIGURA_MEDIOSMAG
    WHERE COME_FORMATO = '1011'
    ORDER BY COME_RESPUESTA INTO :ITEM, :CONCEPTO
    DO
    BEGIN
    SALDO = 0;
    FOR SELECT mmcu_cuenta FROM mediosmag_cuentas
        WHERE mmcu_item = :item INTO :cuenta
        DO
        BEGIN
        EXECUTE PROCEDURE saldo_cuenta (CUENTA, FINAL) returning_values (SALDOAUX);
        SALDO = SALDO + SALDOAUX;
        END
    if (saldo <> 0) then
        begin
        insert into medios_magneticos_datos (memg_formato, memg_ano, memg_item, memg_concepto, memg_pago)
            values (1011, :ANO, :item,  :concepto, ABS(:SALDO));
        ITEM = ITEM + 1;
        end
    END
end
^

SET TERM ; ^

INSERT INTO CONFIGURA_MEDIOSMAG (COME_ITEM, COME_DESCRIPCION, COME_RESPUESTA, COME_CUENTA, COME_FORMATO, COME_MINIMO, COME_NATUR) VALUES (206, 'CONCEPTOS DEDUCCION DEPRECIACION, AMORTIZACION Y AGOTAMIENTO', '8206', NULL, 1011, 0, NULL);
COMMIT WORK;


update revision set revi_FECHA = '2009/06/14';
COMMIT WORK;


/* 20090615: ESPERABA LA BASE > MINIMA PERO AL SER NEGATIVA NO HACIA NADA */
SET TERM ^ ;

CREATE OR ALTER procedure CONTABIL_FACTCOMP (
    IDDOC integer,
    IDINTER integer)
returns (
    ERROR integer,
    VER char(1),
    IDC integer)
AS
DECLARE VARIABLE PREFIJO VARCHAR(4);
DECLARE VARIABLE NUM VARCHAR(6);
DECLARE VARIABLE NUMERO VARCHAR(10);
DECLARE VARIABLE FECAUX DATE;
DECLARE VARIABLE FECHA CHAR(8);
DECLARE VARIABLE CONCEPTO CHAR(60);
DECLARE VARIABLE VENCEAUX DATE;
DECLARE VARIABLE VENCE CHAR(8);
DECLARE VARIABLE VRDTO NUMERIC(18,2);
DECLARE VARIABLE VRADIC NUMERIC(18,2);
DECLARE VARIABLE VRSUBT NUMERIC(18,2);
DECLARE VARIABLE VRIVA NUMERIC(18,2);
DECLARE VARIABLE PRTFTE NUMERIC(9,2);
DECLARE VARIABLE VRRTFTE NUMERIC(18,2);
DECLARE VARIABLE VRRTIVA NUMERIC(18,2);
DECLARE VARIABLE PRTICA NUMERIC(9,2);
DECLARE VARIABLE VRRTICA NUMERIC(18,2);
DECLARE VARIABLE VRTOTAL NUMERIC(18,2);
DECLARE VARIABLE VREXTRA NUMERIC(18,2);
DECLARE VARIABLE TIPOCOMP VARCHAR(3);
DECLARE VARIABLE PREFCONT VARCHAR(4);
DECLARE VARIABLE INVEN CHAR(1);
DECLARE VARIABLE CTAINVEN VARCHAR(20);
DECLARE VARIABLE IVA CHAR(1);
DECLARE VARIABLE CTAIVA VARCHAR(20);
DECLARE VARIABLE CONSUMO CHAR(1);
DECLARE VARIABLE CTACONSUMO VARCHAR(20);
DECLARE VARIABLE CXP CHAR(1);
DECLARE VARIABLE CTACXP VARCHAR(20);
DECLARE VARIABLE RTFTE CHAR(1);
DECLARE VARIABLE CTARTFTE VARCHAR(20);
DECLARE VARIABLE RTIVA CHAR(1);
DECLARE VARIABLE CTARTIVA VARCHAR(20);
DECLARE VARIABLE RTICA CHAR(1);
DECLARE VARIABLE CTARTICA VARCHAR(20);
DECLARE VARIABLE CTADTO VARCHAR(20);
DECLARE VARIABLE CTAADIC VARCHAR(20);
DECLARE VARIABLE CTAEXTRA VARCHAR(20);
DECLARE VARIABLE EXISTE CHAR(1);
DECLARE VARIABLE CUENTA VARCHAR(20);
DECLARE VARIABLE MONTO NUMERIC(18,2);
DECLARE VARIABLE TIPOCUEN CHAR(1);
DECLARE VARIABLE NIT VARCHAR(20);
DECLARE VARIABLE NOMBRE VARCHAR(60);
DECLARE VARIABLE PROY VARCHAR(4);
DECLARE VARIABLE CENTRO VARCHAR(4);
DECLARE VARIABLE PROYDET VARCHAR(4);
DECLARE VARIABLE CENTRODET VARCHAR(4);
DECLARE VARIABLE PORC NUMERIC(5,2);
DECLARE VARIABLE NUMITEMS INTEGER;
DECLARE VARIABLE ARTICULO VARCHAR(15);
DECLARE VARIABLE IMPINC CHAR(1);
DECLARE VARIABLE IMPTOS NUMERIC(18,2);
DECLARE VARIABLE SUMA NUMERIC(18,2);
DECLARE VARIABLE PORCIVA NUMERIC(9,2);
DECLARE VARIABLE TCTAPROV VARCHAR(20);
DECLARE VARIABLE TCTARTFTE VARCHAR(20);
DECLARE VARIABLE TCTARTIVA VARCHAR(20);
DECLARE VARIABLE TCTARTICA VARCHAR(20);
DECLARE VARIABLE CUENTAADIC VARCHAR(20);
DECLARE VARIABLE BASEADIC VARCHAR(20);
DECLARE VARIABLE PORCADIC NUMERIC(5,2);
DECLARE VARIABLE VALORADIC NUMERIC(18,2);
DECLARE VARIABLE DBADIC CHAR(1);
DECLARE VARIABLE FOMENTO CHAR(2);
DECLARE VARIABLE BODE_DET CHAR(2);
DECLARE VARIABLE NUMPROV VARCHAR(10);
DECLARE VARIABLE MERCANCIA NUMERIC(18,2);
declare variable FACTOR DOUBLE PRECISION;
DECLARE VARIABLE MENORV CHAR(2);
declare variable DIG INTEGER;
declare variable NETO NUMERIC(18,2);
declare variable CENT CHAR(1);
declare variable ANULADO CHAR(1);
declare variable ERRORC INTEGER;
BEGIN
  /* INTERFACE */
  EXISTE = 'N';
  SELECT 'S', TICO_COD, PRCO_PRE, INCO_INVEN, INCO_IVA, INCO_CONSUMO, INCO_CXP, INCO_RTFTE, INCO_RTIVA, INCO_RTICA, INCO_CTAINVEN, INCO_CTAIVA, INCO_CTACONSUMO, INCO_CTADTO, INCO_CTAADIC, INCO_CTAEXTRA, INCO_CTACXP, INCO_CTARTFTE, INCO_CTARTIVA, INCO_CTARTICA, INCO_CONFIRMAR, INCO_CENTRO
    FROM INTERFAZ_COMPRAS WHERE INCO_ID = :IDINTER INTO :EXISTE, :TIPOCOMP, :PREFCONT, :INVEN, :IVA, :CONSUMO, :CXP, :RTFTE, :RTIVA, :RTICA, :CTAINVEN, :CTAIVA, :CTACONSUMO, :CTADTO, :CTAADIC, :CTAEXTRA, :CTACXP, :CTARTFTE, :CTARTIVA, :CTARTICA, :VER, :CENT;
  if (EXISTE = 'S') then
    BEGIN
    /* BORRE CONTABILIZACION PREVIA */
    DELETE FROM CONTABILIZACION WHERE CNTB_TIPOREF = 21 AND CNTB_IDREF = :IDDOC;
    /* ENCABEZADO DE LA FACTURA */
    SELECT PREF_PRE, FACO_NUMERO, FACO_FECHA, F.TERC_NIT, FACO_IMPTOS, FACO_VENCE, FACO_DTOMONTO, FACO_ADICIONAL, FACO_IVAMONTO, FACO_EXTRA, FACO_TOTAL, FACO_RTFTEPORC, FACO_RTFTEMONTO, FACO_RTIVAPOR, FACO_RTIVAMONTO, FACO_RTICAPOR, FACO_RTICAMONTO, TERC_NOM, PROV_CTARTFTE, PROV_CTARTIVA, PROV_CTARTICA, PROV_CTAPAGAR, FACO_NUMPROV, FACO_ANULADO
        FROM FACTURAS_COMPRA F, TERCEROS T, PROVEEDORES P WHERE FACO_ID = :IDDOC AND F.TERC_NIT = T.TERC_NIT AND T.TERC_NIT = P.TERC_NIT
        INTO :PREFIJO, :NUM, :FECAUX, :NIT, :IMPINC, :VENCEAUX, :VRDTO, :VRADIC, :VRIVA, :VREXTRA, :VRTOTAL, :PRTFTE, :VRRTFTE, :PORC, :VRRTIVA, :PRTICA, :VRRTICA, :NOMBRE, TCTARTFTE, TCTARTIVA, TCTARTICA, TCTAPROV, :NUMPROV, :ANULADO;
    /* CENTRO DE LA BODEGA */
    IF (CENT = 'B') THEN
        SELECT BODE_CENTRO, BODE_PROY FROM BODEGA B, FACTURAS_COMPRA F WHERE B.BODE_COD = F.BODE_COD AND F.FACO_ID = :IDDOC INTO :CENTRO, :PROY;
    ELSE
        SELECT PREF_CENTRO,PREF_PROY  FROM PREFIJOS P, FACTURAS_COMPRA F WHERE P.PREF_PRE = F.PREF_PRE AND F.FACO_ID = :IDDOC AND P.TIDO_COD = 21 INTO :CENTRO, :PROY;
    if (ANULADO = 'N') then
        BEGIN
        NUMERO = PREFIJO || NUM;
        VRSUBT = VRTOTAL - VREXTRA - VRIVA;
        MERCANCIA = VRSUBT - VRADIC + VRDTO;
        EXECUTE PROCEDURE FECHA_A_CONTA(:FECAUX) returning_values (:FECHA);
        EXECUTE PROCEDURE FECHA_A_CONTA(:VENCEAUX) returning_values (:VENCE);
        if (NUMPROV IS NULL) then
            NUMPROV = NUMERO;
        CONCEPTO = 'FC No.' || NUMERO || '-' || SUBSTR(NOMBRE,1,26) || '-NPROV.' || NUMPROV;
        IDC = GEN_ID(ID_CONTABILIZA, 1);
        INSERT INTO CONTABILIZACION (CNTB_ID, CNTB_TIPOCOMP, CNTB_PREFCNT, CNTB_NUMERO, CNTB_FECHA, CNTB_CONCEPTO, CNTB_REF, CNTB_TIPOREF, CNTB_IDREF, CNTB_PREFREF, CNTB_NUMREF, CNTB_PROCESADO)
            VALUES (:IDC, :TIPOCOMP, :PREFCONT, :NUM, :FECHA, :CONCEPTO, '', 21, :IDDOC, :PREFIJO, :NUM, 'N');
        NUMITEMS = 0;
        SUMA = 0;
        NETO = 0;
        ERROR = 0;
        EXECUTE PROCEDURE LEE_CONFIGURACION('COMPRAS', 'FACTURAS', 'USAR IMPOCONSUMO COMO PORCENTAJE DE FOMENTO') RETURNING_VALUES (FOMENTO);
        EXECUTE PROCEDURE lee_configuracion('COMPRAS','FACTURAS','DESCUENTO Y VALOR ADICIONAL DEL DOCUMENTO COMO MENOR VALOR DEL COSTO') returning_values (:MENORV);
        SELECT SUM(FCDE_consumo) from facturas_compras_detalle where faco_id = :IDDOC into :valoradic;
        if (MENORV = 'SI') then
            if (MERCANCIA <> 0) then
                FACTOR = (CAST(VRSUBT AS DOUBLE PRECISION) - VALORADIC) / (CAST(MERCANCIA AS DOUBLE PRECISION) - VALORADIC);
            ELSE
                FACTOR = 1;
        ELSE
           FACTOR = 1;
        SELECT CAST(CONF_VALOR AS INTEGER) FROM CONFIGURACION WHERE CONF_MODULO = 'COMPRAS' AND CONF_CATEGORIA = 'GENERAL' AND CONF_PROPIEDAD = 'REDONDEO AL MULTIPLO DE DIEZ EN TOTALES' INTO :DIG;
        if (INVEN = 'A') then
            BEGIN
            FOR SELECT MAX(COAR_CTAINV), SUM(CAST(FCDE_CANT AS DOUBLE PRECISION) * (FCDE_PRUNIT-FCDE_DTOMONTO)), SUM(FCDE_IVAMONTO), SUM(FCDE_CONSUMO), MAX(F.BODE_COD)
                FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_COMPRAS_DETALLE F WHERE F.FACO_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD
                GROUP BY COAR_CTAINV, F.BODE_COD INTO :CTAINVEN, :MONTO, :IMPTOS, :VALORADIC, :BODE_DET DO
                BEGIN
                IF (CENT = 'B') THEN
                  SELECT BODE_CENTRO, BODE_PROY FROM BODEGA WHERE BODE_COD = :BODE_DET INTO :CENTRODET, :PROYDET;
                if (IMPINC = 'S') then
                    BEGIN
                    MONTO = MONTO - IMPTOS;
                    if (FOMENTO <> 'SI' ) then
                        MONTO = MONTO - VALORADIC;
                    END
                MONTO = MONTO * FACTOR;
                execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                EXECUTE PROCEDURE CUENTA_INTERFAZ(21, :IDDOC, :CTAINVEN, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    FOR SELECT F.ARTI_COD, (FCDE_CANT * (FCDE_PRUNIT-FCDE_DTOMONTO)), FCDE_IVAMONTO, FCDE_CONSUMO
                        FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_COMPRAS_DETALLE F WHERE F.FACO_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTAINV = :CUENTA
                        INTO :ARTICULO, :MONTO, :IMPTOS, :VALORADIC DO
                        BEGIN
                        if (IMPINC = 'S') then
                            BEGIN
                            MONTO = MONTO - IMPTOS;
                            if (FOMENTO <> 'SI' ) then
                                MONTO = MONTO - VALORADIC;
                            END
                        MONTO = MONTO * FACTOR;
                        execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                        IF (CENT = 'B') THEN
                           INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                               VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROYDET, :CENTRODET, NULL, NULL, NULL, :ARTICULO, 0, 0);
                        ELSE
                           INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                               VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                        NUMITEMS = NUMITEMS + 1;
                        NETO = NETO + MONTO;
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    IF (CENT = 'B') THEN
                       INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                           VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROYDET, :CENTRODET, :NUMERO, NULL, :VENCE, NULL, 0, 21);
                    ELSE
                       INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                           VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 21);
                    NUMITEMS = NUMITEMS + 1;
                    NETO = NETO + MONTO;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    IF (CENT = 'B') THEN
                       INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                           VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROYDET, :CENTRODET, NULL, NULL, NULL, NULL, 0, 0);
                    ELSE
                       INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                           VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NUMITEMS = NUMITEMS + 1;
                    NETO = NETO + MONTO;
                    END
                END
            END
        if (INVEN = 'K') then
            BEGIN
            FOR SELECT SUM(CAST(FCDE_CANT AS DOUBLE PRECISION) * (FCDE_PRUNIT-FCDE_DTOMONTO)), SUM(FCDE_IVAMONTO), SUM(FCDE_CONSUMO), MAX(BODE_COD)
                FROM FACTURAS_COMPRAS_DETALLE WHERE FACO_ID = :IDDOC GROUP BY BODE_COD INTO :MONTO, :IMPTOS, :VALORADIC, :BODE_DET Do
                BEGIN
                  IF (CENT = 'B') THEN
                    SELECT BODE_CENTRO, BODE_PROY FROM BODEGA WHERE BODE_COD = :BODE_DET INTO :CENTRODET, :PROYDET;
                  if (IMPINC = 'S') then
                   BEGIN
                    MONTO = MONTO - IMPTOS;
                    if (FOMENTO <> 'SI' ) then
                      MONTO = MONTO - VALORADIC;
                   END
                  MONTO = MONTO * FACTOR;
                  execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                  execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                  EXECUTE PROCEDURE CUENTA_INTERFAZ(21, :IDDOC, :CTAINVEN, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                  if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                  if (TIPOCUEN = 'I') then
                   BEGIN
                    FOR SELECT ARTI_COD, (FCDE_CANT * (FCDE_PRUNIT-FCDE_DTOMONTO)), FCDE_IVAMONTO, FCDE_CONSUMO
                      FROM FACTURAS_COMPRAS_DETALLE WHERE FACO_ID = :IDDOC INTO :ARTICULO, :MONTO, :IMPTOS, :VALORADIC DO
                       BEGIN
                       if (IMPINC = 'S') then
                        BEGIN
                         MONTO = MONTO - IMPTOS;
                         if (FOMENTO <> 'SI' ) then
                            MONTO = MONTO - VALORADIC;
                        END
                       MONTO = MONTO * FACTOR;
                       execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                       execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                       IF (CENT = 'B') THEN
                          INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                             VALUES (:IDC, :NUMITEMS, :CTAINVEN, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROYDET, :CENTRODET, NULL, NULL, NULL, :ARTICULO, 0, 0);
                       ELSE
                          INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                             VALUES (:IDC, :NUMITEMS, :CTAINVEN, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                       NUMITEMS = NUMITEMS + 1;
                       NETO = NETO + MONTO;
                       END
                   END
                  if (TIPOCUEN = 'C') then
                   BEGIN
                    IF (CENT = 'B') THEN
                       INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                         VALUES (:IDC, :NUMITEMS, :CTAINVEN, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROYDET, :CENTRODET, :NUMERO, NULL, :VENCE, NULL, 0, 21);
                    ELSE
                       INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                         VALUES (:IDC, :NUMITEMS, :CTAINVEN, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 21);
                    NUMITEMS = NUMITEMS + 1;
                    NETO = NETO + MONTO;
                   END
                  if (TIPOCUEN = 'N') then
                   BEGIN
                    IF (CENT = 'B') THEN
                       INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                          VALUES (:IDC, :NUMITEMS, :CTAINVEN, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROYDET, :CENTRODET, NULL, NULL, NULL, NULL, 0, 0);
                    ELSE
                       INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                          VALUES (:IDC, :NUMITEMS, :CTAINVEN, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NUMITEMS = NUMITEMS + 1;
                    NETO = NETO + MONTO;
                   END
                END
            END
        /* EL IVA */
        if (IVA = 'A') then
            BEGIN
            FOR SELECT MAX(COAR_CTAIVAC), SUM(FCDE_IVAMONTO), SUM(CAST(FCDE_CANT AS DOUBLE PRECISION) * (FCDE_PRUNIT-FCDE_DTOMONTO)), SUM(FCDE_CONSUMO)
                FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_COMPRAS_DETALLE F
                WHERE F.FACO_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND FCDE_IVAMONTO <> 0
                GROUP BY COAR_CTAIVAC
                INTO :CTAIVA, :IMPTOS, :MONTO, :VALORADIC DO
              if (IMPTOS <> 0) then
                BEGIN
                IMPTOS = CAST(IMPTOS AS DOUBLE PRECISION) * VRSUBT / MERCANCIA;
                if (IMPINC = 'S') then
                    BEGIN
                    MONTO = MONTO - IMPTOS;
                    if (FOMENTO <> 'SI' ) then
                        MONTO = MONTO - VALORADIC;
                    END
                MONTO = CAST(MONTO AS DOUBLE PRECISION) * VRSUBT / MERCANCIA;
                execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                EXECUTE PROCEDURE CUENTA_INTERFAZ(21, :IDDOC, :CTAIVA, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    FOR SELECT F.ARTI_COD, FCDE_IVAMONTO, (FCDE_CANT * (FCDE_PRUNIT-FCDE_DTOMONTO)), TAIV_PORC, FCDE_CONSUMO
                        FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_COMPRAS_DETALLE F, TARIFA_IVA T WHERE F.FACO_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTAIVAV = :CUENTA AND A.TAIV_COD = T.TAIV_COD
                        INTO :ARTICULO, :IMPTOS, :MONTO, :PORCIVA, :VALORADIC
                    DO
                        BEGIN
                        IMPTOS = CAST(IMPTOS AS DOUBLE PRECISION) * VRSUBT / MERCANCIA;
                        if (IMPINC = 'S') then
                            BEGIN
                            MONTO = MONTO - IMPTOS;
                            if (FOMENTO <> 'SI' ) then
                                MONTO = MONTO - VALORADIC;
                            END
                        MONTO = CAST(MONTO AS DOUBLE PRECISION) * VRSUBT / MERCANCIA;
                        execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :IMPTOS, 0, :MONTO, :PORCIVA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                        NUMITEMS = NUMITEMS + 1;
                        NETO = NETO + IMPTOS;
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :IMPTOS, 0, :MONTO, :IMPTOS*100/:MONTO, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 21);
                    NUMITEMS = NUMITEMS + 1;
                    NETO = NETO + IMPTOS;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :IMPTOS, 0, :MONTO, CAST(:IMPTOS AS DOUBLE PRECISION)*100/CAST(:MONTO AS DOUBLE PRECISION), :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NUMITEMS = NUMITEMS + 1;
                    NETO = NETO + IMPTOS;
                    END
                END
            END
        if (IVA = 'K') then /* IVA EN CTA CONSTANTE */
            BEGIN
            SELECT SUM(FCDE_IVAMONTO), SUM(CAST(FCDE_CANT AS DOUBLE PRECISION) * (FCDE_PRUNIT-FCDE_DTOMONTO)), SUM(FCDE_CONSUMO)
                FROM FACTURAS_COMPRAS_DETALLE F
                WHERE F.FACO_ID = :IDDOC  AND FCDE_IVAMONTO <> 0
                INTO :IMPTOS, :MONTO, :VALORADIC;
            if (IMPTOS <> 0) then
                BEGIN
                IMPTOS = CAST(IMPTOS AS DOUBLE PRECISION) * VRSUBT / MERCANCIA;
                if (IMPINC = 'S') then
                    BEGIN
                    MONTO = MONTO - IMPTOS;
                    if (FOMENTO <> 'SI' ) then
                        MONTO = MONTO - VALORADIC;
                    END
                MONTO = CAST(MONTO AS DOUBLE PRECISION) * VRSUBT / MERCANCIA;
                execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                EXECUTE PROCEDURE CUENTA_INTERFAZ(21, :IDDOC, :CTAIVA, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    FOR SELECT F.ARTI_COD, (FCDE_CANT * (FCDE_PRUNIT-FCDE_DTOMONTO)), FCDE_IVAMONTO, TAIV_PORC, FCDE_CONSUMO
                        FROM ARTICULO A, FACTURAS_COMPRAS_DETALLE F, TARIFA_IVA T WHERE F.FACO_ID = :IDDOC AND A.TAIV_COD = T.TAIV_COD
                        INTO :ARTICULO, :MONTO, :IMPTOS, :PORCIVA, :VALORADIC DO
                        BEGIN
                        IMPTOS = CAST(IMPTOS AS DOUBLE PRECISION) * VRSUBT / MERCANCIA;
                        if (IMPINC = 'S') then
                            BEGIN
                            MONTO = MONTO - IMPTOS;
                            if (FOMENTO <> 'SI' ) then
                                MONTO = MONTO - VALORADIC;
                            END
                        MONTO = CAST(MONTO AS DOUBLE PRECISION) * VRSUBT / MERCANCIA;
                        execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                        if (IMPTOS <> 0) then
                            BEGIN
                            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                VALUES (:IDC, :NUMITEMS, :CTAIVA, :CONCEPTO, '', :IMPTOS, 0, :MONTO, :PORCIVA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                            NUMITEMS = NUMITEMS + 1;
                            NETO = NETO + IMPTOS;
                            END
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NUMITEMS, :CTAIVA, :CONCEPTO, '', :IMPTOS, 0, :MONTO, :IMPTOS*100/:MONTO, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 21);
                    NUMITEMS = NUMITEMS + 1;
                    NETO = NETO + IMPTOS;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NUMITEMS, :CTAIVA, :CONCEPTO, '', :IMPTOS, 0, :MONTO, :IMPTOS*100/:MONTO, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NUMITEMS = NUMITEMS + 1;
                    NETO = NETO + IMPTOS;
                    END
                END
            END
        /* EL IMPOCONSUMO */
        if (CONSUMO = 'A') then
            BEGIN
            FOR SELECT MAX(COAR_CTACONS), SUM(FCDE_CONSUMO) FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_COMPRAS_DETALLE F
                WHERE F.FACO_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD GROUP BY COAR_CTACONS INTO :CTACONSUMO, :IMPTOS
            DO
              if (IMPTOS <> 0) then
                BEGIN
                execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                EXECUTE PROCEDURE CUENTA_INTERFAZ(21, :IDDOC, :CTACONSUMO, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (FOMENTO <> 'SI') then
                    BEGIN
                    if (TIPOCUEN = 'I') then
                        BEGIN
                        FOR SELECT F.ARTI_COD, FCDE_CONSUMO FROM ARTICULO A, FACTURAS_COMPRAS_DETALLE F WHERE F.FACO_ID = :IDDOC INTO :ARTICULO, :IMPTOS
                            DO
                            BEGIN
                            if (IMPTOS <> 0) then
                                BEGIN
                                execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                    VALUES (:IDC, :NUMITEMS, :CTACONSUMO, :CONCEPTO, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                                NUMITEMS = NUMITEMS + 1;
                                NETO = NETO + IMPTOS;
                                END
                            END
                        END
                    if (TIPOCUEN = 'C') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CTACONSUMO, :CONCEPTO, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                        NUMITEMS = NUMITEMS + 1;
                        NETO = NETO + IMPTOS;
                        END
                    if (TIPOCUEN = 'N') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CTACONSUMO, :CONCEPTO, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NUMITEMS = NUMITEMS + 1;
                        NETO = NETO + IMPTOS;
                        END
                    END
                ELSE
                    BEGIN
                    if (TIPOCUEN = 'I') then
                        BEGIN
                        FOR SELECT F.ARTI_COD, FCDE_CONSUMO FROM ARTICULO A, FACTURAS_COMPRAS_DETALLE F WHERE F.FACO_ID = :IDDOC INTO :ARTICULO, :IMPTOS
                            DO
                            BEGIN
                            if (IMPTOS <> 0) then
                                BEGIN
                                execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                    VALUES (:IDC, :NUMITEMS, :CTACONSUMO, :CONCEPTO, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                                NUMITEMS = NUMITEMS + 1;
                                NETO = NETO - IMPTOS;
                                END
                            END
                        END
                    if (TIPOCUEN = 'C') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CTACONSUMO, :CONCEPTO, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                        NUMITEMS = NUMITEMS + 1;
                        NETO = NETO - IMPTOS;
                        END
                    if (TIPOCUEN = 'N') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CTACONSUMO, :CONCEPTO, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NUMITEMS = NUMITEMS + 1;
                        NETO = NETO - IMPTOS;
                        END
                    END
                END
            END
        if (CONSUMO = 'K') then /* CONSUMO EN CTA CONSTANTE */
            BEGIN
            SELECT SUM(FCDE_CONSUMO) FROM FACTURAS_COMPRAS_DETALLE F WHERE F.FACO_ID = :IDDOC INTO :IMPTOS;
            if (IMPTOS <> 0) then
              BEGIN
              execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
              /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
              EXECUTE PROCEDURE CUENTA_INTERFAZ(21, :IDDOC, :CTACONSUMO, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
              if (ERRORC <> 0) then
                ERROR = ERROR + 1;
              if (FOMENTO <> 'SI') then
                BEGIN
                /* DEPENDE DEL TIPO DE CUENTA */
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT F.ARTI_COD, FCDE_CONSUMO FROM ARTICULO A, FACTURAS_COMPRAS_DETALLE F WHERE F.FACO_ID = :IDDOC INTO :ARTICULO, :IMPTOS
                        DO
                        BEGIN
                        if (IMPTOS <> 0) then
                            BEGIN
                            execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                VALUES (:IDC, :NUMITEMS, :CTACONSUMO, :CONCEPTO, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                            NUMITEMS = NUMITEMS + 1;
                            NETO = NETO + IMPTOS;
                            END
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    /* INSERTE EL REGISTRO DE LA BASE */
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NUMITEMS, :CTACONSUMO, :CONCEPTO, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    NUMITEMS = NUMITEMS + 1;
                    NETO = NETO + IMPTOS;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NUMITEMS, :CTACONSUMO, :CONCEPTO, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NUMITEMS = NUMITEMS + 1;
                    NETO = NETO + IMPTOS;
                    END
                END
              ELSE
                BEGIN
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT F.ARTI_COD, FCDE_CONSUMO FROM ARTICULO A, FACTURAS_COMPRAS_DETALLE F WHERE F.FACO_ID = :IDDOC INTO :ARTICULO, :IMPTOS
                        DO
                        BEGIN
                        if (IMPTOS <> 0) then
                            BEGIN
                           execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                           INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                VALUES (:IDC, :NUMITEMS, :CTACONSUMO, :CONCEPTO, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                            NUMITEMS = NUMITEMS + 1;
                            NETO = NETO - IMPTOS;
                            END
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    /* INSERTE EL REGISTRO DE LA BASE */
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NUMITEMS, :CTACONSUMO, :CONCEPTO, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    NUMITEMS = NUMITEMS + 1;
                    NETO = NETO - IMPTOS;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NUMITEMS, :CTACONSUMO, :CONCEPTO, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NUMITEMS = NUMITEMS + 1;
                    NETO = NETO - IMPTOS;
                    END
                END
              end
            END
        /* DESCUENTO */
        if ((CTADTO IS NOT NULL) AND
            (CTADTO <> '')) THEN
          BEGIN
          execute procedure redondee(VRDTO, DIG) returning_values (VRDTO);
          if (VRDTO <> 0) then
            begin
            /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
            EXECUTE PROCEDURE CUENTA_INTERFAZ(21, :IDDOC, :CTADTO, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :VRDTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 21);
                NUMITEMS = NUMITEMS + 1;
                NETO = NETO - VRDTO;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                /* INSERTE EL REGISTRO DE LA BASE */
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :VRDTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NUMITEMS = NUMITEMS + 1;
                NETO = NETO - VRDTO;
                END
            end
          END
        /* VALOR ADIC */
        if ((CTAADIC IS NOT NULL) AND
            (CTAADIC <> '')) THEN
          BEGIN
          execute procedure redondee(VRADIC, DIG) returning_values (VRADIC);
          if (VRADIC <> 0) then
            begin
            /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
            EXECUTE PROCEDURE CUENTA_INTERFAZ(21, :IDDOC, :CTAADIC, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :VRADIC, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 21);
                NUMITEMS = NUMITEMS + 1;
                NETO = NETO + VRADIC;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :VRADIC, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NUMITEMS = NUMITEMS + 1;
                NETO = NETO + VRADIC;
                END
            end
          END
        /* VALOR EXTRA */
        if ((CTAEXTRA IS NOT NULL) AND
            (CTAEXTRA <> '')) THEN
          BEGIN
          execute procedure redondee(VREXTRA, DIG) returning_values (VREXTRA);
          if (VREXTRA <> 0) then
            begin
            /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
            EXECUTE PROCEDURE CUENTA_INTERFAZ(21, :IDDOC, :CTAEXTRA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :VREXTRA, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 21);
                NUMITEMS = NUMITEMS + 1;
                NETO = NETO + VREXTRA;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :VREXTRA, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NUMITEMS = NUMITEMS + 1;
                NETO = NETO + VREXTRA;
                END
            end
          END

        /* DESCUENTE EL IMPOCONSUMO */
        SELECT SUM(FCDE_CONSUMO) FROM FACTURAS_COMPRAS_DETALLE F WHERE F.FACO_ID = :IDDOC INTO :IMPTOS;
        if (IMPTOS IS NULL) then
            IMPTOS = 0;
        vrsubt = vrsubt - IMPTOS;
        /* RETENCION FUENTE */
        if ((RTFTE = 'P') or (RTFTE = 'K')) then
          BEGIN
          execute procedure redondee(VRRTFTE, DIG) returning_values (VRRTFTE);
          if (VRRTFTE <> 0) then
            begin
            if (RTFTE = 'P') then
                CTARTFTE = TCTARTFTE;
            EXECUTE PROCEDURE CUENTA_INTERFAZ(21, :IDDOC, :CTARTFTE, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :VRRTFTE, (:VRSUBT*-1), :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NUMITEMS = NUMITEMS + 1;
                NETO = NETO - VRRTFTE;
                SUMA = VRRTFTE;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :VRRTFTE, (:VRSUBT*-1), :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NUMITEMS = NUMITEMS + 1;
                NETO = NETO - VRRTFTE;
                SUMA = VRRTFTE;
                END
            end
          END
        if (RTFTE = 'A') then
          BEGIN
          FOR SELECT MAX(COAR_CTARTFTE), MAX(COAR_RTFTE), MIN(COAR_RTBASE), SUM(FCDE_TOTAL-FCDE_IVAMONTO-FCDE_CONSUMO), SUM((FCDE_TOTAL-FCDE_IVAMONTO-FCDE_CONSUMO)*COAR_RTFTE)
            FROM CONTABIL_ARTICULO C, FACTURAS_COMPRAS_DETALLE F
            WHERE F.faco_id = :IDDOC AND F.ARTI_COD = C.ARTI_COD
            GROUP BY COAR_CTARTFTE
            INTO :CTARTFTE, :PRTFTE, :baseadic,  :MONTO, :VRRTFTE
            DO
            BEGIN
            MONTO = MONTO * FACTOR * -1;
            if (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, :VRSUBT, :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                        NUMITEMS = NUMITEMS + 1;
                        NETO = NETO - VRRTFTE;
                        SUMA = VRRTFTE;
                        END
                    if (TIPOCUEN = 'N') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :VRRTFTE, :VRSUBT, :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NUMITEMS = NUMITEMS + 1;
                        NETO = NETO - VRRTFTE;
                        SUMA = VRRTFTE;
                        END
                    end
                end
              END
          END
        /* RETENCION IVA */
        if ((RTIVA = 'P') or (RTIVA = 'K')) then
          BEGIN
          execute procedure redondee(VRRTIVA, DIG) returning_values (VRRTIVA);
          if (VRRTIVA <> 0) then
            begin
            if (RTIVA = 'P') then
                CTARTIVA = TCTARTIVA;
            EXECUTE PROCEDURE CUENTA_INTERFAZ(21, :IDDOC, :CTARTIVA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :VRRTIVA, (:VRIVA*-1), :PORC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 21);
                NUMITEMS = NUMITEMS + 1;
                NETO = NETO - VRRTIVA;
                SUMA = SUMA + VRRTIVA;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :VRRTIVA, (:VRIVA*-1), :PORC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NUMITEMS = NUMITEMS + 1;
                NETO = NETO - VRRTIVA;
                SUMA = SUMA + VRRTIVA;
                END
            end
          END
        /* RETENCION DE ICA */
        if ((RTICA = 'P') or (RTICA = 'K')) then
          BEGIN
          execute procedure redondee(VRRTICA, DIG) returning_values (VRRTICA);
          if (VRRTICA <> 0) then
            begin
            if (RTICA = 'P') then
                CTARTICA = TCTARTICA;
            EXECUTE PROCEDURE CUENTA_INTERFAZ(21, :IDDOC, :CTARTICA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :VRRTICA, (:VRSUBT*-1), :PRTICA, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 21);
                NUMITEMS = NUMITEMS + 1;
                NETO = NETO - VRRTICA;
                SUMA = SUMA + VRRTICA;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :VRRTICA, (:VRSUBT*-1), :PRTICA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NUMITEMS = NUMITEMS + 1;
                NETO = NETO - VRRTICA;
                SUMA = SUMA + VRRTICA;
                END
            end
          END
        /* CIERRE EL COMPROBANTE CONTRA LA CUENTA DEL TERCERO O LA CONSTANTE */
        if ((CXP = 'P') or (CXP = 'K')) then
            BEGIN
            SUMA = VRTOTAL - SUMA;
            execute procedure redondee(SUMA, DIG) returning_values (SUMA);
            if (CXP = 'P') then
                CTACXP = TCTAPROV;
            EXECUTE PROCEDURE CUENTA_INTERFAZ(21, :IDDOC, :CTACXP, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :SUMA, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 21);
            if (TIPOCUEN = 'N') then
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :SUMA, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NETO = NETO - SUMA;
            NUMITEMS = NUMITEMS + 1;
            END
        /* recorra las cuentas adicionales */
        FOR SELECT INCC_CUENTA, INCC_BASE, INCC_PORC, INCC_VALOR, INCC_DB FROM INTERFAZ_COMPRAS_CTAS
            WHERE INCO_ID = :IDINTER INTO :CUENTAADIC, :BASEADIC, :PORCADIC, :VALORADIC, :DBADIC
            DO
            BEGIN
            if (VALORADIC <> 0) then
                MONTO = VALORADIC;
            ELSE
                BEGIN
                if (:BASEADIC = 'SUBTOTAL') then
                    VALORADIC = VRTOTAL - VREXTRA - VRIVA - VRADIC + VRDTO;
                if (:BASEADIC = 'DESCUENTO') then
                    VALORADIC = VRDTO;
                if (:BASEADIC = 'IVA') then
                    VALORADIC = VRIVA;
                if (:BASEADIC = 'CONSUMO') then
                    SELECT SUM(FCDE_CONSUMO) FROM FACTURAS_COMPRAS_DETALLE F WHERE F.FACO_ID = :IDDOC INTO :VALORADIC;
                if (:BASEADIC = 'ADICIONAL') then
                    VALORADIC = VRADIC;
                if (:BASEADIC = 'EXTRA') then
                    VALORADIC = VREXTRA;
                if (:BASEADIC = 'TOTAL') then
                    VALORADIC = VRTOTAL;
                MONTO = CAST(VALORADIC AS DOUBLE PRECISION) * PORCADIC / 100;
                END
            if (MONTO <> 0) then
                BEGIN
                execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                EXECUTE PROCEDURE CUENTA_INTERFAZ(21, :IDDOC, :CUENTAADIC, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'C') then
                    BEGIN
                    if (DBADIC = 'S') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTAADIC, :CONCEPTO, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                        SUMA = SUMA + MONTO;
                        NETO = NETO + MONTO;
                        END
                    ELSE
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTAADIC, :CONCEPTO, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                        SUMA = SUMA - MONTO;
                        NETO = NETO - MONTO;
                        END
                    NUMITEMS = NUMITEMS + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    if (DBADIC = 'S') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTAADIC, :CONCEPTO, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        SUMA = SUMA + MONTO;
                        NETO = NETO + MONTO;
                        END
                    ELSE
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTAADIC, :CONCEPTO, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        SUMA = SUMA - MONTO;
                        NETO = NETO - MONTO;
                        END
                    NUMITEMS = NUMITEMS + 1;
                    END
                END
            END
        if (NETO <> 0) then
            BEGIN
            EXECUTE PROCEDURE lee_configuracion ('CONTABILIDAD','GENERAL','CUENTA PARA CUADRAR COMPROBANTES DESCUADRADOS DE INTERFAZ') returning_values (:ctaadic);
            if (ctaadic <> '') then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(21, :IDDOC, :CTAADIC, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'C') then
                    BEGIN
                    if (NETO < 0) then
                        BEGIN
                        NETO = NETO * -1;
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :NETO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                        END
                    ELSE
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :NETO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                        END
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    if (NETO < 0) then
                        BEGIN
                        NETO = NETO * -1;
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :NETO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        END
                    ELSE
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :NETO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        END
                    END
                END
            END
        END
    if (ERROR > 0) then
        VER = 'S';
    SUSPEND;
    END
ELSE
    BEGIN
    EXECUTE PROCEDURE ERROR (21, :IDDOC, :PREFIJO, 1);
    ERROR = ERROR + 1;
    VER = 'S';
    SUSPEND;
    END
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE CONTABILICE_COMP_SIMPLIFICADO(
    IDI INTEGER)
RETURNS (
    ID INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    ESTADO VARCHAR(20),
    IDC INTEGER)
AS
 /*$$IBE$$ DECLARE VARIABLE VER CHAR(2);
declare variable ERROR INTEGER; $$IBE$$*/ 
BEGIN /*$$IBE$$ 
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;
   $$IBE$$*/ /* 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; */ /*$$IBE$$ 
  EXECUTE PROCEDURE CONTABIL_FACTCOMP (:ID, :IDI) RETURNING_VALUES (:ERROR, VER, :IDC);
  if (ERROR = 0) then
    BEGIN
 $$IBE$$*/ /*    EXECUTE PROCEDURE CONTABILIZA_PENDIENTE (:IDC); */ /*$$IBE$$ 
    ESTADO = 'OK';
    END
  ELSE
    ESTADO = 'ERROR';
  suspend;
  END
 $$IBE$$*/ SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE FACTCOMP_SIN_CONTABILIDAD(
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    ID INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    ESTADO VARCHAR(20),
    IDI INTEGER,
    IDC INTEGER)
AS
 /*$$IBE$$ DECLARE VARIABLE VER CHAR(2);
declare variable FECICNT VARCHAR(10);
declare variable FECFCNT VARCHAR(10);
declare variable ERROR INTEGER;
declare variable idref INTEGER; $$IBE$$*/ 
BEGIN /*$$IBE$$ 
EXECUTE PROCEDURE fecha_a_conta(FECINI) returning_values (FECICNT);
EXECUTE PROCEDURE fecha_a_conta(FECFIN) returning_values (FECFCNT);
FOR SELECT FACO_ID, PREF_PRE, FACO_NUMERO FROM FACTURAS_COMPRA WHERE FACO_ANULADO = 'N' AND
    FACO_FECHA >= :FECINI AND FACO_FECHA <= :FECFIN ORDER BY FACO_ID
    INTO :ID, :PREF, :NUMERO
DO
  BEGIN
  idref = null;
  SELECT ENCO_IDREF FROM COMPROBANTE_ENCABEZADO WHERE ENCO_TIPOREF = 21 AND ENCO_FECHA >= :FECICNT AND ENCO_FECHA <= :FECFCNT and ENCO_IDREF = :id into :idref;
  if (idref IS NULL) then
  begin
   ESTADO = 'PROCESANDO';
   SUSPEND;
   SELECT MAX(INCO_ID) FROM INTERFAZ_COMPRAS WHERE PREF_PRE = :PREF AND TIDO_COD = 21 INTO :IDI;
   EXECUTE PROCEDURE CONTABIL_FACTCOMP (:ID, :IDI) RETURNING_VALUES (:ERROR, VER, :IDC);
   if (ERROR = 0) then
    BEGIN
    EXECUTE PROCEDURE CONTABILIZA_PENDIENTE (:IDC);
    ESTADO = 'OK';
    END
   ELSE
    ESTADO = 'ERROR';
   suspend;
  End
  END
 $$IBE$$*/ SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

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

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE FACTCOMP_SIN_CONTABILIDAD(
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    ID INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    ESTADO VARCHAR(20),
    IDI INTEGER,
    IDC INTEGER)
AS
DECLARE VARIABLE VER CHAR(2);
declare variable FECICNT VARCHAR(10);
declare variable FECFCNT VARCHAR(10);
declare variable ERROR INTEGER;
declare variable idref INTEGER;
BEGIN
EXECUTE PROCEDURE fecha_a_conta(FECINI) returning_values (FECICNT);
EXECUTE PROCEDURE fecha_a_conta(FECFIN) returning_values (FECFCNT);
FOR SELECT FACO_ID, PREF_PRE, FACO_NUMERO FROM FACTURAS_COMPRA WHERE FACO_ANULADO = 'N' AND
    FACO_FECHA >= :FECINI AND FACO_FECHA <= :FECFIN ORDER BY FACO_ID
    INTO :ID, :PREF, :NUMERO
DO
  BEGIN
  idref = null;
  SELECT ENCO_IDREF FROM COMPROBANTE_ENCABEZADO WHERE ENCO_TIPOREF = 21 AND ENCO_FECHA >= :FECICNT AND ENCO_FECHA <= :FECFCNT and ENCO_IDREF = :id into :idref;
  if (idref IS NULL) then
  begin
   ESTADO = 'PROCESANDO';
   SUSPEND;
   SELECT MAX(INCO_ID) FROM INTERFAZ_COMPRAS WHERE PREF_PRE = :PREF AND TIDO_COD = 21 INTO :IDI;
   EXECUTE PROCEDURE CONTABIL_FACTCOMP (:ID, :IDI) RETURNING_VALUES (:ERROR, VER, :IDC);
   if (ERROR = 0) then
    BEGIN
    EXECUTE PROCEDURE CONTABILIZA_PENDIENTE (:IDC);
    ESTADO = 'OK';
    END
   ELSE
    ESTADO = 'ERROR';
   suspend;
  End
  END
END

^

SET TERM ; ^


/* 20090616 : REPORTE DE AJUSTES DE INVENTARIO */
SET TERM ^ ;

CREATE OR ALTER procedure REP_AJUSTES_ARTICULO (
    DETALLE char(1),
    FECINI date,
    FECFIN date,
    ARTINI varchar(20),
    ARTFIN varchar(20),
    GRPINI varchar(2),
    GRPFIN varchar(2),
    ORDEN char(1),
    SUBEMPRESA integer)
returns (
    CODIGO varchar(15),
    NOMBRE varchar(60),
    UNIDAD varchar(8),
    CODGRUPO varchar(2),
    NOMGRUPO varchar(30),
    CODSUBG varchar(3),
    NOMSUBG varchar(30),
    CODMARC varchar(3),
    NOMMARC varchar(30),
    CODBOD varchar(2),
    STAND varchar(20),
    PREFIJO varchar(4),
    NUMERO varchar(6),
    FECHA date,
    CANTANT numeric(18,4),
    CANTNUE numeric(18,4),
    AJUSCANT numeric(18,4),
    COSTO numeric(18,2),
    AJUSTOT numeric(18,2),
    PORCENTA numeric(9,2))
AS
declare variable CODINI VARCHAR(20);
declare variable CODFIN VARCHAR(20);
declare variable DESINI VARCHAR(20);
declare variable DESFIN VARCHAR(20);
BEGIN
if (ORDEN = 'C') then
    BEGIN
    CODINI = ARTINI;
    CODFIN = ARTFIN;
    DESINI = '';
    DESFIN = 'zz';
    END
ELSE
    BEGIN
    DESINI = ARTINI;
    DESFIN = ARTFIN;
    CODINI = '';
    CODFIN = 'zz';
    END
if (DETALLE = 'S') then
    FOR SELECT A.ARTI_COD, ARTI_DES, ARTI_UNIDAD, A.GRUP_COD, A.SUBG_COD, A.MARC_COD, j.bode_cod, j.ajus_stand,
        J.pref_pre, J.ajus_numero, J.ajus_fecha, D.ajus_exant, D.ajus_exnue, (ajus_exnue-ajus_exant), D.ajde_costo
      FROM ARTICULO A, AJUSTES J, AJUSTES_DETALLE D, prefijos p
      WHERE A.arti_cod = D.arti_cod AND J.ajus_id = D.ajus_id AND J.ajus_fecha >= :fecini AND J.ajus_fecha <= :fecfin AND J.ajus_anulado = 'N' AND
      A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :GRPFIN AND ARTI_DES >= :DESINI AND ARTI_DES <= :DESFIN and
      j.pref_pre = p.pref_pre and p.tido_cod = 14 and ((:subempresa = 0) or (p.sucu_id = :subempresa))
      INTO :CODIGO, :NOMBRE, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :codbod, :stand,
        :PREFIJO, :NUMERO, :FECHA, :cantant, :cantnue, :ajuscant, :costo
      DO
        BEGIN
        NOMMARC = '';
        NOMSUBG = '';
        SELECT GRUP_NOM FROM GRUPO WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
        SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
        SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
        ajustot = ajuscant * COSTO;
        if ((cantant <> 0) AND (costo <> 0)) then
            PORCENTA = ajustot / (cantant * costo) * 100;
        else
            PORCENTA = 0;
        SUSPEND;
        END
ELSE
    FOR SELECT MAX(A.ARTI_COD), MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(A.GRUP_COD), MAX(A.SUBG_COD), MAX(A.MARC_COD),
        SUM(D.ajus_exant), SUM(D.ajus_exnue), SUM(ajus_exnue-ajus_exant), SUM((ajus_exnue-ajus_exant)*ajde_costo), SUM(AJUS_EXANT*AJDE_COSTO)
      FROM ARTICULO A, AJUSTES J, AJUSTES_DETALLE D, prefijos p
      WHERE A.arti_cod = D.arti_cod AND J.ajus_id = D.ajus_id AND J.ajus_fecha >= :fecini AND J.ajus_fecha <= :fecfin AND J.ajus_anulado = 'N' AND
      A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :GRPFIN AND ARTI_DES >= :DESINI AND ARTI_DES <= :DESFIN and
      j.pref_pre = p.pref_pre and p.tido_cod = 14 and ((:subempresa = 0) or (p.sucu_id = :subempresa))
      GROUP BY J.bode_cod,  A.arti_cod
      INTO :CODIGO, :NOMBRE, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :cantant, :cantnue, :ajuscant, :ajustot, :COSTO
      DO
        BEGIN
        NOMMARC = '';
        NOMSUBG = '';
        SELECT GRUP_NOM FROM GRUPO WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
        SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
        SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
        ajustot = ajuscant * COSTO;
        if (costo <> 0) then
            PORCENTA = ajustot / costo * 100;
        else
            PORCENTA = 0;
        SUSPEND;
        END

END
^

SET TERM ; ^

GRANT EXECUTE ON PROCEDURE rep_ajustes_articulo TO PUBLIC;

SET TERM ^ ;

CREATE OR ALTER procedure REP_COMPROBANTES_ARTICULO (
    TIPODOC integer,
    DETALLE char(1),
    FECINI date,
    FECFIN date,
    ARTINI varchar(20),
    ARTFIN varchar(20),
    GRPINI varchar(2),
    GRPFIN varchar(2),
    ORDEN char(1),
    SUBEMPRESA integer)
returns (
    CODIGO varchar(15),
    NOMBRE varchar(60),
    UNIDAD varchar(8),
    CODGRUPO varchar(2),
    NOMGRUPO varchar(30),
    CODSUBG varchar(3),
    NOMSUBG varchar(30),
    CODMARC varchar(3),
    NOMMARC varchar(30),
    CODBOD varchar(2),
    NOMTIPO varchar(30),
    PREFIJO varchar(4),
    NUMERO varchar(6),
    FECHA date,
    CONCEPTO varchar(60),
    NIT varchar(20),
    NOMTERC varchar(60),
    CONS integer,
    CANT numeric(18,4),
    COSTO numeric(18,2),
    COSTOTOT numeric(18,2))
AS
declare variable ENT CHAR(1);
declare variable ENTRADAS NUMERIC(18,4);
declare variable COSTOENT NUMERIC(18,2);
declare variable SALIDAS NUMERIC(18,4);
declare variable COSTOSAL NUMERIC(18,2);
declare variable CODINI VARCHAR(20);
declare variable CODFIN VARCHAR(20);
declare variable DESINI VARCHAR(20);
declare variable DESFIN VARCHAR(20);
BEGIN
  SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = :TIPODOC INTO :NOMTIPO;
  if (ORDEN = 'C') then
    BEGIN
    CODINI = ARTINI;
    CODFIN = ARTFIN;
    DESINI = '';
    DESFIN = 'zz';
    END
  ELSE
    BEGIN
    DESINI = ARTINI;
    DESFIN = ARTFIN;
    CODINI = '';
    CODFIN = 'zz';
    END
  FOR
    SELECT ARTI_COD, ARTI_DES, ARTI_UNIDAD, A.GRUP_COD, A.SUBG_COD, A.MARC_COD
      FROM ARTICULO A
      WHERE ARTI_COD >= :CODINI AND ARTI_COD <= :CODFIN AND A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :GRPFIN AND ARTI_DES >= :DESINI AND ARTI_DES <= :DESFIN
      INTO :CODIGO, :NOMBRE, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
      DO
        BEGIN
        NOMMARC = '';
        NOMSUBG = '';
        SELECT GRUP_NOM FROM GRUPO WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
        SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
        SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
        if (DETALLE = 'N') then
            BEGIN
            CANT = 0;
            COSTOTOT = 0;
            /* SUME LAS ENTRADAS */
            SELECT SUM(MVAR_CANT), SUM(MVAR_CANT * MVAR_COSTO) FROM MOVIMIENTO_ARTICULO M, PREFIJOS P
              WHERE P.PREF_PRE = M.MVAR_PREF AND P.TIDO_COD = M.mvar_tipodoc AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA)) AND
              (MVAR_FECHA >= :FECINI) AND (MVAR_FECHA < :FECFIN) AND
              (ARTI_COD = :CODIGO) AND (MVAR_ENTRADA = 'S') AND (MVAR_TIPODOC = :TIPODOC)
              INTO :ENTRADAS, :COSTOENT;
            if (ENTRADAS IS NULL) then
              ENTRADAS = 0;
            if (COSTOENT IS NULL) then
              COSTOENT = 0;
            /* CALCULE LAS SALIDAS A COSTO PROMEDIO */
            SALIDAS = 0;
            COSTOSAL = 0;
            FOR SELECT MVAR_CANT, MVAR_FECHA
                FROM MOVIMIENTO_ARTICULO M, PREFIJOS P
                WHERE P.PREF_PRE = M.MVAR_PREF AND P.TIDO_COD = M.mvar_tipodoc AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA)) AND
                (MVAR_FECHA >= :FECINI) AND (MVAR_FECHA <= :FECFIN) AND
                (ARTI_COD = :CODIGO) AND (MVAR_ENTRADA = 'N') AND (MVAR_TIPODOC = :TIPODOC)
                INTO :CANT, :FECHA
                DO
                    BEGIN
                    EXECUTE PROCEDURE COSTO_PROMEDIO(:CODIGO, :FECHA) returning_values (:COSTO);
                    SALIDAS = SALIDAS + CANT;
                    COSTOSAL = COSTOSAL + (COSTO * CANT);
                    END
            if (SALIDAS IS NULL) then
              SALIDAS = 0;
            if (COSTOSAL IS NULL) then
              COSTOSAL = 0;
            if (ENTRADAS > 0) then
                CANT = ENTRADAS;
            if (SALIDAS > 0) then
                CANT = SALIDAS;
            if (COSTOENT > 0) then
                COSTOTOT = COSTOENT;
            if (COSTOSAL > 0) then
                COSTOTOT = COSTOSAL;
            if (CANT > 0) then
                COSTO = COSTOTOT / CANT;
            ELSE
                COSTO = 0;
            if (CANT <> 0) then
                SUSPEND;
            END
        ELSE
            BEGIN
            FOR SELECT MVAR_ENTRADA, MVAR_PREF, MVAR_NUMERO, MVAR_CANT, MVAR_COSTO, MVAR_CONC, MVAR_FECHA, M.TERC_NIT, MVAR_CONS, BODE_COD
                FROM MOVIMIENTO_ARTICULO M, TIPO_DOCUMENTO TD, PREFIJOS P
                WHERE TD.TIDO_COD = MVAR_TIPODOC AND P.PREF_PRE = M.MVAR_PREF AND P.TIDO_COD = M.mvar_tipodoc AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA)) AND
                (MVAR_FECHA >= :FECINI) AND (MVAR_FECHA < :FECFIN) AND (ARTI_COD = :CODIGO) AND (MVAR_TIPODOC = :TIPODOC)
                ORDER BY MVAR_FECHA, MVAR_CONS
                INTO :ENT, :PREFIJO, :NUMERO, :CANT, :COSTO, :CONCEPTO, :FECHA, :NIT, :CONS, :CODBOD
                DO
                    BEGIN
                    select TERC_NOM from TERCEROS where TERC_NIT = :NIT into :NOMTERC;
                    if (ENT = 'S') then
                        BEGIN
                        COSTOTOT = (CANT * COSTO);
                        end
                    ELSE
                        BEGIN
                        EXECUTE PROCEDURE COSTO_PROMEDIO(:CODIGO, :FECHA) returning_values (:COSTO);
                        COSTOTOT = (CANT * COSTO);
                        END
                    SUSPEND;
                    END
            END
        END
END
^

SET TERM ; ^


/* 20090626 */

SET TERM ^ ;

CREATE or ALTER PROCEDURE CONCILIA_BANCO (
    id integer)
as
declare variable fecini date;
declare variable fecfin date;
declare variable item integer;
declare variable db char(1);
declare variable cuenta integer;
declare variable tipodoc integer;
declare variable iddoc integer;
declare variable prefijo varchar(4);
declare variable numero varchar(6);
declare variable fecha date;
declare variable concepto varchar(60);
declare variable monto numeric(18,2);
begin
select CUBA_COD, COBN_FECINI, COBN_FECFIN FROM conciliacion_encabezado WHERE COBN_ID = :ID INTO :CUENTA, :FECINI, :FECFIN;
/* COMPARE LA TABLA CON LOS MOVIMIENTOS DEL BANCO */
FOR SELECT COBN_ITEM, ABS(COBN_MONTO), COBN_FEC, COBN_TIPODOC, COBN_DB, COBN_CONC
    FROM CONCILIACION_BANCARIA
    WHERE COBN_ID = :ID AND ((COBN_IDDOC = 0) or (cobn_iddoc is null))
    INTO :ITEM, :MONTO, :FECHA, :TIPODOC, :DB, :concepto
    DO
    BEGIN
    PREFIJO = '';
    NUMERO = '';
    IDDOC = 0;
    /* BUSQUE LA OPERACION  */
    if (TIPODOC <> 0) then
        BEGIN
        SELECT FIRST 1 MOBA_PREF, MOBA_NUMERO, MOBA_IDREF
            FROM movimiento_banco M WHERE MOBA_TIPODOC = :tipodoc AND MOBA_TOTAL = :MONTO AND M.cuba_cod = :cuenta AND MOBA_FECHA >= :FECINI AND MOBA_FECHA <= :FECFIN  AND
                NOT EXISTS (SELECT COBN_ITEM FROM CONCILIACION_BANCARIA WHERE COBN_IDDOC = m.moba_idref AND COBN_TIPODOC = :tipodoc)
            ORDER BY ABS(MOBA_FECHA - :FECHA)
            INTO :prefijo, :numero, :IDDOC;
        if (PREFIJO <> '') then
            BEGIN
            UPDATE conciliacion_bancaria SET COBN_PREFIJO = :PREFIJO, COBN_NUMERO = :NUMERO, COBN_IDDOC = :iddoc, COBN_OK = 'S', COBN_CLASE = '0'
                WHERE COBN_ID = :ID AND COBN_ITEM = :ITEM;
            END
        ELSE
            BEGIN
            /* BUSQUELO COMO DEBITO O CREDITO SIN IMPORTAR EL TIPO */
            SELECT FIRST 1 MOBA_PREF, MOBA_NUMERO, MOBA_IDREF
                FROM movimiento_banco M WHERE MOBA_DB = :DB AND MOBA_TOTAL = :MONTO AND M.cuba_cod = :cuenta AND MOBA_FECHA >= :FECINI AND MOBA_FECHA <= :FECFIN AND
                    NOT EXISTS (SELECT COBN_ITEM FROM CONCILIACION_BANCARIA WHERE COBN_IDDOC = m.moba_idref AND COBN_TIPODOC = :tipodoc)
                ORDER BY ABS(MOBA_FECHA - :FECHA)
                INTO :prefijo, :numero, :IDDOC;
            if (PREFIJO <> '') then
                BEGIN
                UPDATE conciliacion_bancaria SET COBN_PREFIJO = :PREFIJO, COBN_NUMERO = :NUMERO, COBN_IDDOC = :iddoc, COBN_OK = 'S', COBN_CLASE = '0'
                    WHERE COBN_ID = :ID AND COBN_ITEM = :ITEM;
                END
            ELSE
                BEGIN
                if (DB = 'N') then
                    UPDATE conciliacion_bancaria SET COBN_OK = 'N', COBN_CLASE = '2'
                        WHERE COBN_ID = :ID AND COBN_ITEM = :ITEM;
                else
                    UPDATE conciliacion_bancaria SET COBN_OK = 'N', COBN_CLASE = '1'
                        WHERE COBN_ID = :ID AND COBN_ITEM = :ITEM;
                END
            END
        END
    ELSE
        BEGIN
        /* BUSQUELO COMO DEBITO O CREDITO SIN IMPORTAR EL TIPO */
        SELECT FIRST 1 MOBA_PREF, MOBA_NUMERO, MOBA_IDREF, MOBA_TIPODOC
            FROM movimiento_banco M WHERE MOBA_DB = :DB AND MOBA_TOTAL = :MONTO AND M.cuba_cod = :cuenta AND MOBA_FECHA >= :FECINI AND MOBA_FECHA <= :FECFIN AND
                NOT EXISTS (SELECT COBN_ITEM FROM CONCILIACION_BANCARIA WHERE COBN_IDDOC = m.moba_idref AND COBN_DB = :DB)
            ORDER BY ABS(MOBA_FECHA - :FECHA)
            INTO :prefijo, :numero, :IDDOC, :TIPODOC;
        if (PREFIJO <> '') then
            BEGIN
            UPDATE conciliacion_bancaria SET COBN_PREFIJO = :PREFIJO, COBN_NUMERO = :NUMERO, COBN_IDDOC = :iddoc, COBN_TIPODOC = :TIPODOC, COBN_OK = 'S', COBN_CLASE = '0'
                WHERE COBN_ID = :ID AND COBN_ITEM = :ITEM;
            END
        ELSE
            BEGIN
            if (DB = 'N') then
                UPDATE conciliacion_bancaria SET COBN_OK = 'N', COBN_CLASE = '2'
                    WHERE COBN_ID = :ID AND COBN_ITEM = :ITEM;
            else
                UPDATE conciliacion_bancaria SET COBN_OK = 'N', COBN_CLASE = '1'
                    WHERE COBN_ID = :ID AND COBN_ITEM = :ITEM;
            END
        END
    END
/* AGREGUE LOS DOCUMENTOS SIN UBICAR */
SELECT MAX(COBN_ITEM) FROM conciliacion_bancaria WHERE COBN_ID = :ID INTO :item;
FOR SELECT MOBA_PREF, MOBA_NUMERO, MOBA_FECHA, MOBA_TOTAL, MOBA_CONCEPTO, MOBA_TIPODOC, MOBA_IDREF, MOBA_DB
    FROM MOVIMIENTO_BANCO M
    WHERE MOBA_FECHA >= :FECINI AND MOBA_FECHA <= :FECFIN  AND M.cuba_cod = :cuenta AND
        NOT EXISTS (SELECT COBN_ITEM FROM conciliacion_bancaria WHERE COBN_TIPODOC = M.moba_tipodoc AND COBN_IDDOC = M.moba_idref)
    INTO :prefijo, :numero, :fecha, :monto, :concepto, :tipodoc, :iddoc, :DB
    DO
    BEGIN
    ITEM = ITEM + 1;
    if (DB = 'N') then
        INSERT INTO conciliacion_bancaria (CUBA_COD, COBN_ID, COBN_ITEM, COBN_FEC, COBN_PREFIJO, COBN_NUMERO, COBN_MONTO, COBN_TIPODOC, COBN_ANULADO, COBN_OK, COBN_CONC, COBN_IDDOC, COBN_DB, COBN_CLASE)
            VALUES (:CUENTA, :ID, :ITEM, :FECHA, :PREFIJO, :NUMERO, :monto, :TIPODOC, 'N', 'N', :concepto, :iddoc, :DB, '4');
    else
        INSERT INTO conciliacion_bancaria (CUBA_COD, COBN_ID, COBN_ITEM, COBN_FEC, COBN_PREFIJO, COBN_NUMERO, COBN_MONTO, COBN_TIPODOC, COBN_ANULADO, COBN_OK, COBN_CONC, COBN_IDDOC, COBN_DB, COBN_CLASE)
            VALUES (:CUENTA, :ID, :ITEM, :FECHA, :PREFIJO, :NUMERO, :monto, :TIPODOC, 'N', 'N', :concepto, :iddoc, :DB, '3');
    END
end^

SET TERM ; ^



/* 20090630 : se basaba en el factir para la unidad alternativa */
SET TERM ^ ;

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

/* ACUMULE LOS PUNTOS, SE HACE ACA POR SER POSTERIOR AL DETALLE */
if (ANULADO = 'N') then
    EXECUTE PROCEDURE acumula_puntos_cliente (31, :id, :nit, :fecha) returning_values (:PUNTOS);
EXECUTE PROCEDURE consulta_puntos_cliente (:id, :nit, :fecha) returning_values (:puntos, :puntosacum, :puntosvenc, :fecptos);
if (DTOIT1M IS NULL) then
    DTOIT1M = 0;
if (DTOIT2M IS NULL) then
    DTOIT2M = 0;
if (DTOIT3M IS NULL) then
    DTOIT3M = 0;
SELECT CLIE_COD, C.ZONA_COD, ZONA_NOM
    FROM CLIENTES C, ZONAS Z
    WHERE TERC_NIT = :NIT AND C.ZONA_COD = Z.ZONA_COD
    INTO :CODIGOCL, :ZONACOD, :ZONANOM;
SELECT CLSU_DIR, CLSU_CIUDAD, CLSU_TEL FROM CLIENTE_SUCURSALES WHERE TERC_NIT = :NIT AND CLCU_COD = :SUCUR
    INTO :DIRECCION, :CIUDAD, :TELEFONO;
DIASVENCE = VENCE - FECHA;
if (DIASVENCE > 0) then
    CONTCRED = 'CREDITO ' || CAST(DIASVENCE AS VARCHAR(3)) || ' DIAS';
ELSE
    CONTCRED = 'CONTADO';
SUBTOTAL = TOTALFAC - EXTRA - IVAMONTO - ADICIONAL + DTOMONTO;
if (DTOITE3 = 'SI') then
    BEGIN
    SELECT SUM(FADE_DTOMONTO) FROM FACTURAS_DETALLE WHERE FACT_ID = :id INTO :sumdtoit;
    SUBTOTAL = SUBTOTAL + sumdtoit + dtoit1m + dtoit2m + dtoit3m;
    END
if (INGTER <> '') then
    BEGIN
    SELECT SUM(FADE_TOTAL) FROM FACTURAS_DETALLE D, ARTICULO A WHERE A.arti_cod = D.arti_cod AND FACT_ID = :id AND GRUP_COD = :ingter
        INTO :ingterceros;
    END
EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'FECHA AUTORETENEDOR NO DESCONTAR RETENCIONES DEL SALDO PERO SI CONTABILIZARLAS') returning_values (AUTORET);
if (AUTORET <> '') then
    FAUTORET = CAST(AUTORET AS DATE);
else
    FAUTORET = '9999/12/31';
if (FECHA > fautoret) then
    TOTALPAGAR = TOTALFAC - RTEIVAMONTO - RTEICAMONTO - ANTICIPO;
ELSE
    TOTALPAGAR = TOTALFAC - RTEFTEMONTO - RTEIVAMONTO - RTEICAMONTO - ANTICIPO;
if (RECIBIDO <> 0) then
    CAMBIO = RECIBIDO - totalpagar;
ELSE
    CAMBIO = 0;
SUMAEX = 0;
SUMA1 = 0;
SUMA2 = 0;
SUMA3 = 0;
IVA1 = 0;
IVA2 = 0;
IVA3 = 0;
TOTCONSUMO = 0;
MONTOPAGO1 = 0;
SELECT MAX(AUDI_HORA) FROM AUDITORIA WHERE TIDO_COD = 31 AND AUDI_IDDOC = :ID AND AUDI_OPER = 'I' INTO :HORA;
/* AHORA LAS FORMAS DE PAGO, BUSQUE EL ABONO DE HOY A LA FACTURA */
ITEMFP = 1;
MONTOPAGO1 = 0;
MONTOPAGO2 = 0;
MONTOPAGO3 = 0;
FOR SELECT FOPA_NOM, RCPA_MONTO FROM RECIBOS_CAJA_PAGO P, FORMAS_PAGO F, RECIBOS_CAJA R, RECIBOS_CAJA_DETALLE D
    WHERE R.RECA_ID = P.RECA_ID AND R.RECA_ID = D.RECA_ID AND P.FOPA_ID = F.FOPA_ID AND RECA_FECHA = :FECHA AND RCDE_TIPODOC = 31 AND RCDE_IDDOC = :ID
    INTO :formap, :MONTOP
    DO
    BEGIN
    if (ITEMFP = 1) then
        BEGIN
        FORMAPAGO1 = FORMAP;
        MONTOPAGO1 = MONTOP;
        END
    if (ITEMFP = 2) then
        BEGIN
        FORMAPAGO2 = FORMAP;
        MONTOPAGO2 = MONTOP;
        END
    if (ITEMFP = 3) then
        BEGIN
        FORMAPAGO3 = FORMAP;
        MONTOPAGO3 = MONTOP;
        END
    ITEMFP = ITEMFP + 1;
    END
EXECUTE PROCEDURE lee_configuracion ('FACTURACION','DOCUMENTOS','ORDENAR ITEMS POR CODIGO DE ARTICULO') returning_values (:ORDENCOD);
EXECUTE PROCEDURE lee_configuracion ('FACTURACION','POS', 'IMPRIMIR DEVOLUCIONES DE ARTICULOS NEGATIVOS') returning_values (:imprdev);
totcajas = 0;
totbase = 0;
if (ORDENCOD = 'SI') then
    BEGIN
    FOR SELECT FADE_ITEM, D.ARTI_COD, FADE_CODBAR, SUBSTR(FADE_DESC,1,60), ARTI_DESCORTA, FADE_CANT, FADE_UNIDAD, FADE_FACTOR, BODE_COD, FADE_LOTE, LIPR_COD, FADE_PRUNIT, FADE_DTOPORC, FADE_DTOMONTO, FADE_IVAPORC, FADE_IVAMONTO, FADE_CONSUMO, FADE_TOTAL, FADE_REFERENCIA,
        GRUP_COD, SUBG_COD, MARC_COD, ARTI_PESO, ARTI_ANCHO, ARTI_ALTO, ARTI_LARGO, TAIV_COD, FADE_DEVUELTO, FADE_OBS, FADE_DTO1, FADE_DTO2, FADE_DTO3, FADE_DTOM1, FADE_DTOM2, FADE_DTOM3, FADE_CAJAS, FADE_BASE, FADE_PORCBASE
        FROM FACTURAS_DETALLE D, ARTICULO A
        WHERE D.ARTI_COD = A.ARTI_COD AND D.FACT_ID = :ID
        ORDER BY D.ARTI_COD
        INTO :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :DESCORTA, :CANT, :UNIDAD, :FACTOR, :BODITEM, :LOTE, :LISTAPR, :PRUNIT, :DTOITPORC, :DTOITMONTO, :IVAPORC, :IVAITMONTO, :CONSUMO, :TOTAL, :refitem,
        :GRUPO, :SUBGRUPO, :MARCA, :PESO, :ANCHO, :ALTO, :LARGO, :TARIFA, :devuelto, :obsitem, :dtoit1, :dtoit2, :dtoit3, :dtoitm1, :dtoitm2, :dtoitm3, :cajas, :base, :porcbase
        DO
          BEGIN
          if (ARTICULO = CODBAR) then
            SELECT FIRST 1 COBA_COD FROM barras_articulo WHERE ARTI_COD = :articulo INTO :CODBAR;
          if (IMPRDEV <> 'SI') then
            BEGIN
            if ((CANT >= 0) AND (DEVUELTO = 0)) then
                IMPR = 'S';
            ELSE
                IMPR = 'N'; /* ES DEVOLUCION */
            END
          ELSE
            IMPR = 'S';
          if (IMPR = 'S') then
            BEGIN
            prneto = PRUNIT - DTOITMONTO - dtoitm1 - dtoitm2 - dtoitm3;
            if (IMPTOS = 'S') then
                if (cant <> 0) then
                    prnetosiniva = PRUNIT - DTOITMONTO - ((IVAITMONTO+CONSUMO) / CANT) - dtoitm1 - dtoitm2 - dtoitm3;
                else
                    prnetosiniva = PRUNIT - DTOITMONTO - dtoitm1 - dtoitm2 - dtoitm3;
            ELSE
                prnetosiniva = PRUNIT - DTOITMONTO - dtoit1m - dtoit2m - dtoit3m;
            if (ICOINC = 'SI') then
                SUBTOTIT = TOTAL - IVAITMONTO;
            else
                SUBTOTIT = TOTAL - IVAITMONTO - CONSUMO;
            TOTCONSUMO = TOTCONSUMO + CONSUMO;
            TOTBASE = TOTBASE + BASE;
            SELECT LOTE_VENCE FROM LOTES WHERE LOTE_NRO = :lote AND ARTI_COD = :ARTICULO AND BODE_COD = :boditem INTO :vlote;
            if ((REFITEM <> '.t') or (REFITEM IS NULL)) then
                BEGIN
                /* NO SUME LOS ENSAMBLES */
                if (IVAPORC = 0) then
                    SUMAEX = SUMAEX + TOTAL;
                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;
                END
            if (ANCHO IS NULL) then
                ANCHO = 0;
            if (ALTO IS NULL) then
                ALTO = 0;
            if (LARGO IS NULL) then
                LARGO = 0;
            if (PESO IS NULL) then
                PESO = 0;
            PESO = (PESO / 1000) * CANT * FACTOR;
            totcajas = totcajas + cajas;
            if (substr(ARTICULO,1,2) = '.t') then
                BEGIN
                REFITEM = '';
                TOTAL = 0;
                SUBTOTIT = 0;
                END
            SELECT STAND_COD FROM STANDS WHERE ARTI_COD = :ARTICULO AND STAND_BODEGA = :boditem INTO :stand;
            factcant = NULL;
            SELECT FIRST 1 UNAR_FACCAN FROM unidad_articulo WHERE ARTI_COD = :articulo INTO :factcant;
            if (factcant IS NULL) then
                BEGIN
                ALTERNATIVAS = 0;
                PRINCIPALES = (CANT * FACTOR);
                END
            ELSE
                BEGIN
                ALTERNATIVAS = FLOOR(CANT * factor / factcant);
                PRINCIPALES = (CANT * FACTOR) - (alternativas * factcant);
                END
            SUSPEND;
            END
          END
    END
ELSE
    BEGIN
    FOR SELECT FADE_ITEM, D.ARTI_COD, FADE_CODBAR, SUBSTR(FADE_DESC,1,60), ARTI_DESCORTA, FADE_CANT, FADE_UNIDAD, FADE_FACTOR, BODE_COD, FADE_LOTE, LIPR_COD, FADE_PRUNIT, FADE_DTOPORC, FADE_DTOMONTO, FADE_IVAPORC, FADE_IVAMONTO, FADE_CONSUMO, FADE_TOTAL, FADE_REFERENCIA,
        GRUP_COD, SUBG_COD, MARC_COD, ARTI_PESO, ARTI_ANCHO, ARTI_ALTO, ARTI_LARGO, TAIV_COD, FADE_DEVUELTO, FADE_OBS, FADE_DTO1, FADE_DTO2, FADE_DTO3, FADE_DTOM1, FADE_DTOM2, FADE_DTOM3, FADE_CAJAS, FADE_BASE, FADE_PORCBASE
        FROM FACTURAS_DETALLE D, ARTICULO A
        WHERE D.ARTI_COD = A.ARTI_COD AND D.FACT_ID = :ID
        ORDER BY FADE_ITEM
        INTO :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :DESCORTA, :CANT, :UNIDAD, :FACTOR, :BODITEM, :LOTE, :LISTAPR, :PRUNIT, :DTOITPORC, :DTOITMONTO, :IVAPORC, :IVAITMONTO, :CONSUMO, :TOTAL, :refitem,
        :GRUPO, :SUBGRUPO, :MARCA, :PESO, :ANCHO, :ALTO, :LARGO, :TARIFA, :devuelto, :obsitem, :dtoit1, :dtoit2, :dtoit3, :dtoitm1, :dtoitm2, :dtoitm3, :cajas, :base, :porcbase
        DO
          BEGIN
          if (IMPRDEV <> 'SI') then
            BEGIN
            if ((CANT >= 0) AND (DEVUELTO = 0)) then
                IMPR = 'S';
            ELSE
                IMPR = 'N'; /* ES DEVOLUCION */
            END
          ELSE
            IMPR = 'S';
          if (IMPR = 'S') then
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :GRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :MARCA INTO NOMMARCA;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :SUBGRUPO AND GRUP_COD = :GRUPO INTO :NOMSUBG;
            prneto = PRUNIT - DTOITMONTO - dtoitm1 - dtoitm2 - dtoitm3;
            if (IMPTOS = 'S') then
                if (cant <> 0) then
                    prnetosiniva = PRUNIT - DTOITMONTO - ((IVAITMONTO+CONSUMO) / CANT) - dtoit1m - dtoit2m - dtoit3m;
                else
                    prnetosiniva = PRUNIT - DTOITMONTO - dtoitm1 - dtoitm2 - dtoitm3;
            ELSE
                prnetosiniva = PRUNIT - DTOITMONTO - dtoitm1 - dtoitm2 - dtoitm3;
            if (ICOINC = 'SI') then
                SUBTOTIT = TOTAL - IVAITMONTO;
            else
                SUBTOTIT = TOTAL - IVAITMONTO - CONSUMO;
            TOTCONSUMO = TOTCONSUMO + CONSUMO;
            TOTBASE = TOTBASE + BASE;
            SELECT LOTE_VENCE FROM LOTES WHERE LOTE_NRO = :lote AND ARTI_COD = :ARTICULO AND BODE_COD = :boditem INTO :vlote;
            if ((REFITEM <> '.t') or (REFITEM IS NULL)) then
                BEGIN
                /* NO SUME LOS ENSAMBLES */
                if (IVAPORC = 0) then
                    SUMAEX = SUMAEX + TOTAL;
                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;
                END
            if (ANCHO IS NULL) then
                ANCHO = 0;
            if (ALTO IS NULL) then
                ALTO = 0;
            if (LARGO IS NULL) then
                LARGO = 0;
            if (PESO IS NULL) then
                PESO = 0;
            PESO = (PESO / 1000)* CANT * FACTOR;
            totcajas = totcajas + cajas;
            if (substr(ARTICULO,1,2) = '.t') then
                BEGIN
                REFITEM = '';
                TOTAL = 0;
                SUBTOTIT = 0;
                END
            SELECT STAND_COD FROM STANDS WHERE ARTI_COD = :ARTICULO AND STAND_BODEGA = :boditem INTO :stand;
            factcant = NULL;
            SELECT FIRST 1 UNAR_FACCAN FROM unidad_articulo WHERE ARTI_COD = :articulo INTO :factcant;
            if (factcant IS NULL) then
                BEGIN
                ALTERNATIVAS = 0;
                PRINCIPALES = (CANT * FACTOR);
                END
            ELSE
                BEGIN
                ALTERNATIVAS = FLOOR(CANT * factor / factcant);
                PRINCIPALES = (CANT * FACTOR) - (alternativas * factcant);
                END
            SUSPEND;
            END
          END
    END
END
^

SET TERM ; ^



/* 20090630b : NO PERMITIA REPETIR UNA CONCILIACION DE LA MISMA CUENTA */
SET TERM ^ ;

ALTER PROCEDURE CONCILIA_BANCO (
    id integer)
as
declare variable fecini date;
declare variable fecfin date;
declare variable item integer;
declare variable db char(1);
declare variable cuenta integer;
declare variable tipodoc integer;
declare variable iddoc integer;
declare variable prefijo varchar(4);
declare variable numero varchar(6);
declare variable fecha date;
declare variable concepto varchar(60);
declare variable monto numeric(18,2);
begin
select CUBA_COD, COBN_FECINI, COBN_FECFIN FROM conciliacion_encabezado WHERE COBN_ID = :ID INTO :CUENTA, :FECINI, :FECFIN;
/* COMPARE LA TABLA CON LOS MOVIMIENTOS DEL BANCO */
FOR SELECT COBN_ITEM, ABS(COBN_MONTO), COBN_FEC, COBN_TIPODOC, COBN_DB, COBN_CONC
    FROM CONCILIACION_BANCARIA
    WHERE COBN_ID = :ID AND ((COBN_IDDOC = 0) or (cobn_iddoc is null))
    INTO :ITEM, :MONTO, :FECHA, :TIPODOC, :DB, :concepto
    DO
    BEGIN
    PREFIJO = '';
    NUMERO = '';
    IDDOC = 0;
    /* BUSQUE LA OPERACION  */
    if (TIPODOC <> 0) then
        BEGIN
        SELECT FIRST 1 MOBA_PREF, MOBA_NUMERO, MOBA_IDREF
            FROM movimiento_banco M WHERE MOBA_TIPODOC = :tipodoc AND MOBA_TOTAL = :MONTO AND M.cuba_cod = :cuenta AND MOBA_FECHA >= :FECINI AND MOBA_FECHA <= :FECFIN  AND
                NOT EXISTS (SELECT COBN_ITEM FROM CONCILIACION_BANCARIA WHERE COBN_IDDOC = m.moba_idref AND COBN_TIPODOC = :tipodoc and COBN_ID = :ID)
            ORDER BY ABS(MOBA_FECHA - :FECHA)
            INTO :prefijo, :numero, :IDDOC;
        if (PREFIJO <> '') then
            BEGIN
            UPDATE conciliacion_bancaria SET COBN_PREFIJO = :PREFIJO, COBN_NUMERO = :NUMERO, COBN_IDDOC = :iddoc, COBN_OK = 'S', COBN_CLASE = '0'
                WHERE COBN_ID = :ID AND COBN_ITEM = :ITEM;
            END
        ELSE
            BEGIN
            /* BUSQUELO COMO DEBITO O CREDITO SIN IMPORTAR EL TIPO */
            SELECT FIRST 1 MOBA_PREF, MOBA_NUMERO, MOBA_IDREF
                FROM movimiento_banco M WHERE MOBA_DB = :DB AND MOBA_TOTAL = :MONTO AND M.cuba_cod = :cuenta AND MOBA_FECHA >= :FECINI AND MOBA_FECHA <= :FECFIN AND
                    NOT EXISTS (SELECT COBN_ITEM FROM CONCILIACION_BANCARIA WHERE COBN_IDDOC = m.moba_idref AND COBN_TIPODOC = :tipodoc and COBN_ID = :ID)
                ORDER BY ABS(MOBA_FECHA - :FECHA)
                INTO :prefijo, :numero, :IDDOC;
            if (PREFIJO <> '') then
                BEGIN
                UPDATE conciliacion_bancaria SET COBN_PREFIJO = :PREFIJO, COBN_NUMERO = :NUMERO, COBN_IDDOC = :iddoc, COBN_OK = 'S', COBN_CLASE = '0'
                    WHERE COBN_ID = :ID AND COBN_ITEM = :ITEM;
                END
            ELSE
                BEGIN
                if (DB = 'N') then
                    UPDATE conciliacion_bancaria SET COBN_OK = 'N', COBN_CLASE = '2'
                        WHERE COBN_ID = :ID AND COBN_ITEM = :ITEM;
                else
                    UPDATE conciliacion_bancaria SET COBN_OK = 'N', COBN_CLASE = '1'
                        WHERE COBN_ID = :ID AND COBN_ITEM = :ITEM;
                END
            END
        END
    ELSE
        BEGIN
        /* BUSQUELO COMO DEBITO O CREDITO SIN IMPORTAR EL TIPO */
        SELECT FIRST 1 MOBA_PREF, MOBA_NUMERO, MOBA_IDREF, MOBA_TIPODOC
            FROM movimiento_banco M WHERE MOBA_DB = :DB AND MOBA_TOTAL = :MONTO AND M.cuba_cod = :cuenta AND MOBA_FECHA >= :FECINI AND MOBA_FECHA <= :FECFIN AND
                NOT EXISTS (SELECT COBN_ITEM FROM CONCILIACION_BANCARIA WHERE COBN_IDDOC = m.moba_idref AND COBN_DB = :DB and COBN_ID = :ID)
            ORDER BY ABS(MOBA_FECHA - :FECHA)
            INTO :prefijo, :numero, :IDDOC, :TIPODOC;
        if (PREFIJO <> '') then
            BEGIN
            UPDATE conciliacion_bancaria SET COBN_PREFIJO = :PREFIJO, COBN_NUMERO = :NUMERO, COBN_IDDOC = :iddoc, COBN_TIPODOC = :TIPODOC, COBN_OK = 'S', COBN_CLASE = '0'
                WHERE COBN_ID = :ID AND COBN_ITEM = :ITEM;
            END
        ELSE
            BEGIN
            if (DB = 'N') then
                UPDATE conciliacion_bancaria SET COBN_OK = 'N', COBN_CLASE = '2'
                    WHERE COBN_ID = :ID AND COBN_ITEM = :ITEM;
            else
                UPDATE conciliacion_bancaria SET COBN_OK = 'N', COBN_CLASE = '1'
                    WHERE COBN_ID = :ID AND COBN_ITEM = :ITEM;
            END
        END
    END
/* AGREGUE LOS DOCUMENTOS SIN UBICAR */
SELECT MAX(COBN_ITEM) FROM conciliacion_bancaria WHERE COBN_ID = :ID INTO :item;
FOR SELECT MOBA_PREF, MOBA_NUMERO, MOBA_FECHA, MOBA_TOTAL, MOBA_CONCEPTO, MOBA_TIPODOC, MOBA_IDREF, MOBA_DB
    FROM MOVIMIENTO_BANCO M
    WHERE MOBA_FECHA >= :FECINI AND MOBA_FECHA <= :FECFIN  AND M.cuba_cod = :cuenta AND
        NOT EXISTS (SELECT COBN_ITEM FROM conciliacion_bancaria WHERE COBN_TIPODOC = M.moba_tipodoc AND COBN_IDDOC = M.moba_idref and COBN_ID = :ID)
    INTO :prefijo, :numero, :fecha, :monto, :concepto, :tipodoc, :iddoc, :DB
    DO
    BEGIN
    ITEM = ITEM + 1;
    if (DB = 'N') then
        INSERT INTO conciliacion_bancaria (CUBA_COD, COBN_ID, COBN_ITEM, COBN_FEC, COBN_PREFIJO, COBN_NUMERO, COBN_MONTO, COBN_TIPODOC, COBN_ANULADO, COBN_OK, COBN_CONC, COBN_IDDOC, COBN_DB, COBN_CLASE)
            VALUES (:CUENTA, :ID, :ITEM, :FECHA, :PREFIJO, :NUMERO, :monto, :TIPODOC, 'N', 'N', :concepto, :iddoc, :DB, '4');
    else
        INSERT INTO conciliacion_bancaria (CUBA_COD, COBN_ID, COBN_ITEM, COBN_FEC, COBN_PREFIJO, COBN_NUMERO, COBN_MONTO, COBN_TIPODOC, COBN_ANULADO, COBN_OK, COBN_CONC, COBN_IDDOC, COBN_DB, COBN_CLASE)
            VALUES (:CUENTA, :ID, :ITEM, :FECHA, :PREFIJO, :NUMERO, :monto, :TIPODOC, 'N', 'N', :concepto, :iddoc, :DB, '3');
    END
end
^

SET TERM ; ^



/* 20090701 : stands estaban de 15c y es de 20c, ademas faltaba en ajustes */
SET TERM ^ ;

CREATE OR ALTER procedure EXISTENCIAS_COMPRAS (
    ARTICULO varchar(15),
    FECHA date,
    UNIDAD varchar(8))
returns (
    BODEGA varchar(2),
    EXISTENCIA numeric(18,2),
    RESERVADO numeric(18,2),
    ORDENADO numeric(18,2),
    PROMEDIO numeric(18,2),
    VENTAMES numeric(18,2),
    FECHACMP date,
    CANTCMP numeric(18,2),
    DIAS integer,
    SUGERIDO numeric(18,2),
    STAND varchar(20))
AS
declare variable FACTOR NUMERIC(15,4);
declare variable ORDENC NUMERIC(18,4);
declare variable PEDIDO NUMERIC(18,4);
declare variable ITEM INTEGER;
declare variable ID INTEGER;
declare variable UND VARCHAR(8);
declare variable CANT NUMERIC(18,4);
declare variable FACTOR2 NUMERIC(18,4);
declare variable fecini DATE;
declare variable FECHAAUX VARCHAR(10);
declare variable AGENCIA INTEGER;
declare variable DEVMES NUMERIC(18,2);
declare variable MFAC INTEGER;
declare variable MDEV INTEGER;
declare variable IVAF NUMERIC(18,2);
declare variable IVAD NUMERIC(18,2);
declare variable DIA_ART VARCHAR(2) CHARACTER SET NONE;
declare variable DIASC VARCHAR(255);
declare variable PEDAUTO CHAR(2);
declare variable SALIDAS NUMERIC(18,4);
BEGIN
  for select bode_cod, SUCU_ID from bodega into :bodega, :agencia
    do
    begin
    execute procedure saldo_inventario (:articulo, :bodega, :fecha) returning_values (:Existencia);
    EXECUTE PROCEDURE FACTOR_UNIDAD_CANT(:ARTICULO, :UNIDAD) returning_values (:FACTOR);
    if (FACTOR <> 0) then
        EXISTENCIA = EXISTENCIA / FACTOR;
    else
        EXISTENCIA = 0;
    STAND = '';
    SELECT STAND_COD FROM STANDS WHERE ARTI_COD = :ARTICULO AND STAND_BODEGA = :BODEGA INTO :stand;
    EXECUTE PROCEDURE promedio_salidas_articulo (:ARTICULO, :FECHA, :BODEGA) returning_values (:PROMEDIO, :SALIDAS);
    EXECUTE PROCEDURE lee_configuracion ('INVENTARIO', 'EXISTENCIAS', 'PROMEDIAR LAS SALIDAS DEL INVENTARIO CON EL NUMERO DE DIAS ASIGNADO A CADA ARTICULO') returning_values (:DIA_ART);
    if (DIA_ART = 'NO') then
        BEGIN
        EXECUTE PROCEDURE lee_configuracion ('INVENTARIO', 'EXISTENCIAS', 'NUMERO DE DIAS PARA PROMEDIO DE SALIDAS POR ARTICULO') returning_values (DIASC);
        DIAS = CAST(DIASC AS INTEGER);
        END
    ELSE
        SELECT ARTI_DIAS FROM ARTICULO WHERE ARTI_COD = :ARTICULO INTO :DIAS;
    if (DIAS is null) then
        DIAS = 0;
    PROMEDIO = DIAS * PROMEDIO;
    if (FACTOR <> 0) then
        PROMEDIO = PROMEDIO / FACTOR;
    SUGERIDO = PROMEDIO - EXISTENCIA;
    SELECT SUM(ORID_ENTREGAR)
      FROM ORDENINVENTARIO_DETALLE OD, ordenes_inventario O
      WHERE O.ORIN_ID = OD.ORIN_ID AND ARTI_COD = :ARTICULO AND ORIN_FECHA <= :FECHA AND ORIN_FECLLEGA >= :FECHA AND ORID_ANULADO = 'N' AND OD.BODE_COD = :BODEGA
      INTO :ORDENADO;
    if (ORDENADO IS NULL) then
        ORDENADO = 0;
    ORDENC = 0;
    FOR SELECT O.ORDC_ID, OCDE_ITEM, OCDE_CANT * OCDE_FACTOR
        FROM ORDENES_COMPRA O, ORDENES_COMPRA_DETALLE OD
        WHERE O.ORDC_ID = OD.ORDC_ID AND OD.ARTI_COD = :ARTICULO AND (ORDC_FECHA+ORDC_VALIDEZ) >= :FECHA AND ORDC_FECHA <= :FECHA AND OCDE_ANULADO = 'N' AND OD.BODE_COD = :BODEGA
        INTO :ID, :ITEM, :CANT
        do
        BEGIN
        EXECUTE PROCEDURE FALTANTE(23, 21, ID, ITEM) returning_values (PEDIDO, UND, FACTOR2);
        if (PEDIDO * FACTOR2 = CANT) then /* SI NO SE HA FACTURADO MIRE A VER SI SE REMISIONO */
            EXECUTE PROCEDURE FALTANTE(23, 22, ID, ITEM) returning_values (PEDIDO, UND, FACTOR2);
        if (PEDIDO IS NULL) then
            PEDIDO = 0;
        ORDENC = ORDENC + PEDIDO * FACTOR2;
        END
    ORDENADO = ORDENADO + ORDENC;
    if (FACTOR <> 0) then
        ORDENADO = ORDENADO / FACTOR;
    SELECT SUM(RSDE_LIBERAR)
      FROM RESERVAS_DETALLE RD, RESERVAS R
      WHERE R.RESE_ID = RD.RESE_ID AND ARTI_COD = :ARTICULO AND RESE_FECHA <= :FECHA AND RESE_VENCE >= :FECHA AND RD.BODE_COD = :BODEGA AND RSDE_ANULADO = 'N'
      INTO :RESERVADO;
    if (RESERVADO IS NULL) then
        RESERVADO = 0;
    PEDIDO = 0;
    FOR SELECT P.PEDI_ID, PEDE_ITEM, PEDE_CANT * PEDE_FACTOR
        FROM PEDIDOS P, PEDIDOS_DETALLE PD
        WHERE P.PEDI_ID = PD.PEDI_ID AND PD.ARTI_COD = :ARTICULO AND (PEDI_FECHA+PEDI_VALIDEZ) >= :FECHA AND PEDI_FECHA <= :FECHA AND PEDE_ANULADO = 'N' AND BODE_COD = :BODEGA
        INTO :ID, :ITEM, :CANT
        do
        BEGIN
        EXECUTE PROCEDURE FALTANTE(34, 31, ID, ITEM) returning_values (ORDENC, UND, FACTOR2);
        EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION', 'FACTURAS', 'GENERAR PEDIDO AUTOMATICAMENTE CON LA FACTURA') returning_values (pedauto);
        if ((ORDENC * FACTOR2 = CANT) or (PEDAUTO = 'SI')) then /* SI NO SE HA FACTURADO MIRE A VER SI SE REMISIONO */
            EXECUTE PROCEDURE FALTANTE(34, 32, ID, ITEM) returning_values (ORDENC, UND, FACTOR2);
        if (ORDENC IS NULL) then
            ORDENC = 0;
        PEDIDO = PEDIDO + ORDENC * FACTOR2;
        END
    RESERVADO = RESERVADO + PEDIDO;
    if (FACTOR <> 0) then
        RESERVADO = RESERVADO / FACTOR;
    /* VENTAS MES */
    FECHAAUX = CAST (FECHA AS VARCHAR(10));
    FECHAAUX = SUBSTR(FECHAAUX, 1, 7) || '/01';
    FECINI = CAST (FECHAAUX AS DATE);
    EXECUTE PROCEDURE ventas_articulo (:ARTICULO, :FECINI, :FECHA, :agencia) returning_values (:ventames, :mfac, :devmes, :mdev, :ivaf, :ivad);
    ventames = ventames - devmes;
    if (FACTOR <> 0) then
        ventames = ventames / FACTOR;
    /* FECHA COMPRA */
    fechacmp = null;
    cantcmp = 0;
    SELECT FIRST 1 FACO_FECHA, FCDE_CANT * FCDE_FACTOR FROM FACTURAS_COMPRA F, FACTURAS_COMPRAS_DETALLE D
        WHERE F.FACO_ID = D.faco_id AND D.ARTI_COD = :articulo AND FACO_FECHA <= :FECHA AND D.bode_cod = :BODEGA
        ORDER BY FACO_FECHA DESC, F.FACO_ID DESC
        INTO :fechacmp, :cantcmp;
    SUSPEND;
    end
END
^

SET TERM ; ^

SET TERM ^ ;

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

SET TERM ; ^


SET TERM ^ ;

CREATE OR ALTER procedure EXISTENCIAS (
    ARTICULO varchar(15),
    FECHA date)
returns (
    BODEGA varchar(2),
    STAND varchar(20),
    EXISTENCIA numeric(18,4))
AS
BEGIN
  for select bode_cod from bodega into :bodega
    do
    begin
    SELECT MAX(EXIS_STAND) FROM EXISTENCIA WHERE ARTI_COD = :ARTICULO AND BODE_COD = :BODEGA INTO :STAND;
    execute procedure saldo_inventario (:articulo, :bodega, :fecha) returning_values (:Existencia);
    SUSPEND;
    end
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure EXISTENCIAS_BAJO_MINIMO (
    FECHA date,
    ARTINI varchar(20),
    ARTFIN varchar(20),
    GRPINI varchar(2),
    GRPFIN varchar(2),
    ORDEN char(1))
returns (
    CODIGO varchar(15),
    NOMBRE varchar(60),
    CANT numeric(18,4),
    UNIDAD varchar(8),
    CODGRUPO varchar(2),
    NOMGRUPO varchar(30),
    CODSUBG varchar(3),
    NOMSUBG varchar(30),
    CODMARC varchar(3),
    NOMMARC varchar(30),
    CODBOD varchar(2),
    NOMBOD varchar(30),
    STAND varchar(20),
    MINIMO numeric(18,4),
    FALTANTE numeric(18,4),
    ULTCOSTO numeric(18,2),
    FECHACOSTO date)
AS
declare variable CODINI VARCHAR(20);
declare variable CODFIN VARCHAR(20);
declare variable DESINI VARCHAR(20);
declare variable DESFIN VARCHAR(20);
BEGIN
if (ORDEN = 'C') then
    BEGIN
    CODINI = ARTINI;
    CODFIN = ARTFIN;
    DESINI = '';
    DESFIN = 'zz';
    END
ELSE
    BEGIN
    DESINI = ARTINI;
    DESFIN = ARTFIN;
    CODINI = '';
    CODFIN = 'zz';
    END
  FOR
    SELECT ARTI_COD, ARTI_DES, ARTI_UNIDAD, A.GRUP_COD, A.SUBG_COD, A.MARC_COD, BODE_COD, BODE_NOM, ARTI_MIN
      FROM ARTICULO A, BODEGA B
      WHERE ARTI_COD >= :CODINI AND ARTI_COD <= :CODFIN AND A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :GRPFIN AND ARTI_DES >= :DESINI AND ARTI_DES <= :DESFIN
      INTO :CODIGO, :NOMBRE, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :CODBOD, :NOMBOD, :MINIMO
      DO
        BEGIN
        SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
        SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
        SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
        EXECUTE PROCEDURE SALDO_INVENTARIO(CODIGO, :CODBOD, FECHA) returning_values (CANT);
        if (CANT < MINIMO) then
            BEGIN
            SELECT MAX(EXIS_STAND) FROM EXISTENCIA WHERE ARTI_COD = :CODIGO AND BODE_COD = :CODBOD INTO :STAND;
            EXECUTE PROCEDURE ULTIMO_COSTO(CODIGO, FECHA, UNIDAD) returning_values (ULTCOSTO);
            SELECT MAX(MVAR_FECHA) FROM MOVIMIENTO_ARTICULO WHERE ARTI_COD = :CODIGO AND MVAR_ENTRADA = 'S' AND MVAR_FECHA <= :FECHA INTO :FECHACOSTO;
            FALTANTE = MINIMO - CANT;
            SUSPEND;
            END
        END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure EXISTENCIAS_DESDE_HASTA (
    FECHA date,
    ARTINI varchar(20),
    ARTFIN varchar(20),
    GRPINI varchar(3),
    GRPFIN varchar(3),
    BODINI varchar(2),
    BODFIN varchar(2),
    ORDEN char(1),
    AGRUPA char(1),
    DETALLE char(1),
    RESERVA char(1),
    ENPESO char(1),
    SUCURSAL integer)
returns (
    CANT numeric(18,4),
    COSTO numeric(18,2),
    COSTO_LOTE numeric(18,2),
    CODIGO varchar(15),
    NOMBRE varchar(60),
    UNIDAD varchar(8),
    STAND varchar(20),
    CODGRUPO varchar(2),
    NOMGRUPO varchar(30),
    CODSUBG varchar(3),
    NOMSUBG varchar(30),
    CODMARC varchar(3),
    NOMMARC varchar(30),
    CODBOD varchar(2),
    LOTE varchar(15),
    NOMBOD varchar(30),
    COSTOTOT numeric(18,2),
    ULTCOSTO numeric(18,2),
    FECHACOSTO date,
    CONSUMO numeric(18,2),
    RESERVADO numeric(18,4),
    ORDENADO numeric(18,4),
    IVA numeric(9,2),
    PESOUNIT numeric(18,4),
    PESOTOTAL numeric(18,4),
    PRECIO numeric(18,2),
    CODBAR varchar(20))
AS
declare variable exist char(1);
declare variable codini varchar(20);
declare variable codfin varchar(20);
declare variable desini varchar(20);
declare variable desfin varchar(20);
declare variable ordenc numeric(18,4);
declare variable pedido numeric(18,4);
declare variable ok char(1);
declare variable id integer;
declare variable item integer;
declare variable und varchar(8);
declare variable factor numeric(18,4);
declare variable cant2 numeric(18,4);
declare variable PEDAUTO CHAR(2);
DECLARE VARIABLE LISTA INTEGER;
BEGIN
EXECUTE PROCEDURE lee_configuracion ('FACTURACION','FACTURAS', 'CODIGO DE LA LISTA DE PRECIOS A MOSTRAR EN ARTICULOS') returning_values (:LISTA);
if (ORDEN = 'C') then
    BEGIN
    CODINI = ARTINI;
    CODFIN = ARTFIN;
    DESINI = '';
    DESFIN = 'zz';
    END
ELSE
    BEGIN
    DESINI = ARTINI;
    DESFIN = ARTFIN;
    CODINI = '';
    CODFIN = 'zz';
    END
EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION', 'FACTURAS', 'GENERAR PEDIDO AUTOMATICAMENTE CON LA FACTURA') returning_values (pedauto);
if (DETALLE = 'B') then
  BEGIN
  FOR SELECT ARTI_COD, ARTI_DES, ARTI_UNIDAD, ARTI_EXIST, TAIV_PORC, A.GRUP_COD, A.SUBG_COD, A.MARC_COD, BODE_COD, BODE_NOM, ARTI_CONSUMO, ARTI_PESO/1000
      FROM ARTICULO A, BODEGA B, TARIFA_IVA T
      WHERE ARTI_COD >= :CODINI AND ARTI_COD <= :CODFIN AND ARTI_DES >= :DESINI AND ARTI_DES <= :DESFIN AND ESAR_COD <> 'I' AND BODE_COD >= :BODINI AND
      BODE_COD <= :BODFIN AND ((SUCU_ID = :SUCURSAL) or (:SUCURSAL = 0)) AND A.TAIV_COD = T.TAIV_COD
      INTO :CODIGO, :NOMBRE, :UNIDAD, :EXIST, :IVA, :CODGRUPO, :CODSUBG, :CODMARC, :CODBOD, :NOMBOD, :CONSUMO, :pesounit
      DO
        BEGIN
        STAND = '';
        OK = 'N';
        if (AGRUPA = 'G') then
            BEGIN
            if ((CODGRUPO >= GRPINI) AND (CODGRUPO <= GRPFIN)) then
                OK = 'S';
            end
        ELSE
            if (AGRUPA = 'M') then
                BEGIN
                if ((CODMARC >= GRPINI) AND (CODMARC <= GRPFIN)) then
                    OK = 'S';
                END
        if (OK = 'S') then
            BEGIN
            NOMGRUPO = '';
            NOMMARC = '';
            NOMSUBG = '';
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            SELECT MAX(COBA_COD) FROM BARRAS_ARTICULO WHERE ARTI_COD = :codigo AND COBA_UNIDAD = :unidad INTO :codbar;
            if (CODBAR IS NULL) then
                CODBAR = CODIGO;
            if (EXIST <> 'N') then
                BEGIN
                SELECT STAND_COD FROM STANDS WHERE ARTI_COD = :CODIGO AND STAND_BODEGA = :CODBOD INTO :STAND;
                EXECUTE PROCEDURE SALDO_INICIAL_INVENTARIO(CODIGO, FECHA, :CODBOD) returning_values (CANT);
                EXECUTE PROCEDURE costo_promedio_y_ultimo_unidad(CODIGO, FECHA, UNIDAD) returning_values (COSTO, ULTCOSTO);
                SELECT MAX(MVAR_FECHA) FROM MOVIMIENTO_ARTICULO WHERE ARTI_COD = :CODIGO AND MVAR_ENTRADA = 'S' AND MVAR_FECHA <= :FECHA INTO :FECHACOSTO;
                COSTOTOT = :CANT * :COSTO;
                CONSUMO = CONSUMO * CANT;
                if (RESERVA = 'S') then
                    BEGIN
                    SELECT SUM(ORID_ENTREGAR)
                        FROM ORDENINVENTARIO_DETALLE OD, ordenes_inventario O
                        WHERE O.ORIN_ID = OD.ORIN_ID AND ARTI_COD = :CODIGO AND ORIN_FECHA <= :FECHA AND ORIN_FECLLEGA >= :FECHA AND ORID_ANULADO = 'N' AND OD.BODE_COD = :CODBOD
                        INTO :ORDENADO;
                    if (ORDENADO IS NULL) then
                        ORDENADO = 0;
                    ORDENC = 0;
                    FOR SELECT O.ORDC_ID, OCDE_ITEM, OCDE_CANT * OCDE_FACTOR
                        FROM ORDENES_COMPRA O, ORDENES_COMPRA_DETALLE OD
                        WHERE O.ORDC_ID = OD.ORDC_ID AND OD.ARTI_COD = :CODIGO AND ORDC_VENCE >= :FECHA AND ORDC_FECHA <= :FECHA AND OCDE_ANULADO = 'N' AND OD.BODE_COD = :CODBOD
                        INTO :ID, :ITEM, :CANT2
                        do
                        BEGIN
                        EXECUTE PROCEDURE FALTANTE(23, 21, ID, ITEM) returning_values (PEDIDO, UND, FACTOR);
                        if (PEDIDO * FACTOR = CANT2) then /* SI NO SE HA FACTURADO MIRE A VER SI SE REMISIONO */
                            EXECUTE PROCEDURE FALTANTE(23, 22, ID, ITEM) returning_values (PEDIDO, UND, FACTOR);
                        if (PEDIDO IS NULL) then
                            PEDIDO = 0;
                        ORDENC = ORDENC + PEDIDO * FACTOR;
                        END
                    ORDENADO = ORDENADO + ORDENC;
                    SELECT SUM(RSDE_LIBERAR)
                        FROM RESERVAS_DETALLE RD, RESERVAS R
                        WHERE R.RESE_ID = RD.RESE_ID AND ARTI_COD = :CODIGO AND RESE_FECHA <= :FECHA AND RESE_VENCE >= :FECHA AND RD.BODE_COD = :CODBOD AND RSDE_ANULADO = 'N'
                        INTO :RESERVADO;
                    if (RESERVADO IS NULL) then
                        RESERVADO = 0;
                    PEDIDO = 0;
                    FOR SELECT P.PEDI_ID, PEDE_ITEM, PEDE_CANT * PEDE_FACTOR
                        FROM PEDIDOS P, PEDIDOS_DETALLE PD
                        WHERE P.PEDI_ID = PD.PEDI_ID AND PD.ARTI_COD = :CODIGO AND PEDI_VENCE >= :FECHA AND PEDI_FECHA <= :FECHA AND PEDE_ANULADO = 'N' AND BODE_COD = :CODBOD
                        INTO :ID, :ITEM, :CANT2
                        do
                        BEGIN
                        EXECUTE PROCEDURE FALTANTE(34, 31, ID, ITEM) returning_values (ORDENC, UND, FACTOR);
                        if ((ORDENC * FACTOR = CANT2) or (PEDAUTO = 'SI')) then /* SI NO SE HA FACTURADO MIRE A VER SI SE REMISIONO */
                            EXECUTE PROCEDURE FALTANTE(34, 32, ID, ITEM) returning_values (ORDENC, UND, FACTOR);
                        if (ORDENC IS NULL) then
                            ORDENC = 0;
                        PEDIDO = PEDIDO + ORDENC * FACTOR;
                        END
                    RESERVADO = RESERVADO + PEDIDO;
                    END
                ELSE
                    BEGIN
                    RESERVADO = 0;
                    ORDENADO = 0;
                    END
                if (LISTA > 0) then
                    SELECT prar_fijo FROM precios_articulo WHERE arti_cod = :CODIGO and lipr_cod = :LISTA INTO :PRECIO;
                if (ENPESO = 'S') then
                    BEGIN
                    if (pesounit IS NULL) then
                        pesounit = 0;
                    if (PESOUNIT <> 0) then
                        BEGIN
                        pesototal = PESOUNIT * cant;
                        SUSPEND;
                        END
                    END
                ELSE
                    SUSPEND;
                END
            END
        END
  END

if (DETALLE = 'L') then
  BEGIN
  FOR SELECT A.ARTI_COD, ARTI_DES, ARTI_UNIDAD, ARTI_EXIST, TAIV_PORC, A.GRUP_COD, A.SUBG_COD, A.MARC_COD, L.lote_nro, L.lote_nro||' - '||L.lote_vence, ARTI_CONSUMO,l.bode_cod, L.lote_saldo,l.lote_costo, ARTI_PESO/1000
      FROM ARTICULO A, LOTES l, TARIFA_IVA T
      WHERE A.ARTI_COD >= '0' AND A.ARTI_COD <= 'zz' AND ARTI_DES >= '' AND ARTI_DES <= 'zz' AND ESAR_COD <> 'I' AND A.TAIV_COD = T.TAIV_COD and a.arti_cod = l.arti_cod
      INTO :CODIGO, :NOMBRE, :UNIDAD, :EXIST, :IVA, :CODGRUPO, :CODSUBG, :CODMARC, :LOTE, :NOMBOD, :CONSUMO, :codbod, :cant, :costo_lote, :pesounit
      DO
        BEGIN
        OK = 'N';
        if (AGRUPA = 'G') then
            BEGIN
            if ((CODGRUPO >= GRPINI) AND (CODGRUPO <= GRPFIN)) then
                OK = 'S';
            end
        ELSE
            if (AGRUPA = 'M') then
                BEGIN
                if ((CODMARC >= GRPINI) AND (CODMARC <= GRPFIN)) then
                    OK = 'S';
                END
        if (OK = 'S') then
            BEGIN
            NOMGRUPO = '';
            NOMMARC = '';
            NOMSUBG = '';
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            SELECT MAX(COBA_COD) FROM BARRAS_ARTICULO WHERE ARTI_COD = :codigo AND COBA_UNIDAD = :unidad INTO :codbar;
            if (CODBAR IS NULL) then
                CODBAR = CODIGO;

            if (EXIST <> 'N') then
                BEGIN
                EXECUTE PROCEDURE COSTO_PROMEDIO_UNIDAD(CODIGO, FECHA, UNIDAD) returning_values (COSTO);
                EXECUTE PROCEDURE ULTIMO_COSTO(CODIGO, FECHA, UNIDAD) returning_values (ULTCOSTO);
                SELECT MAX(MVAR_FECHA) FROM MOVIMIENTO_ARTICULO WHERE ARTI_COD = :CODIGO AND MVAR_ENTRADA = 'S' AND MVAR_FECHA <= :FECHA INTO :FECHACOSTO;
                COSTOTOT = :CANT * :COSTO;
                CONSUMO = CONSUMO * CANT;
                if (RESERVA = 'S') then
                    BEGIN
                    SELECT SUM(ORID_ENTREGAR)
                        FROM ORDENINVENTARIO_DETALLE OD, ordenes_inventario O
                        WHERE O.ORIN_ID = OD.ORIN_ID AND ARTI_COD = :CODIGO AND ORIN_FECHA <= :FECHA AND ORIN_FECLLEGA >= :FECHA AND ORID_ANULADO = 'N'
                        INTO :ORDENADO;
                    if (ORDENADO IS NULL) then
                        ORDENADO = 0;
                    ORDENC = 0;
                    FOR SELECT O.ORDC_ID, OCDE_ITEM, OCDE_CANT * OCDE_FACTOR
                        FROM ORDENES_COMPRA O, ORDENES_COMPRA_DETALLE OD
                        WHERE O.ORDC_ID = OD.ORDC_ID AND OD.ARTI_COD = :CODIGO AND ORDC_VENCE >= :FECHA AND ORDC_FECHA <= :FECHA AND OCDE_ANULADO = 'N'
                        INTO :ID, :ITEM, :CANT2
                        do
                        BEGIN
                        EXECUTE PROCEDURE FALTANTE(23, 21, ID, ITEM) returning_values (PEDIDO, UND, FACTOR);
                        if (PEDIDO * FACTOR = CANT2) then /* SI NO SE HA FACTURADO MIRE A VER SI SE REMISIONO */
                            EXECUTE PROCEDURE FALTANTE(23, 22, ID, ITEM) returning_values (PEDIDO, UND, FACTOR);
                        if (PEDIDO IS NULL) then
                            PEDIDO = 0;
                        ORDENC = ORDENC + PEDIDO * FACTOR;
                        END
                    ORDENADO = ORDENADO + ORDENC;
                    SELECT SUM(RSDE_LIBERAR)
                        FROM RESERVAS_DETALLE RD, RESERVAS R
                        WHERE R.RESE_ID = RD.RESE_ID AND ARTI_COD = :CODIGO AND RESE_FECHA <= :FECHA AND RESE_VENCE >= :FECHA AND RSDE_ANULADO = 'N'
                        INTO :RESERVADO;
                    if (RESERVADO IS NULL) then
                        RESERVADO = 0;
                    PEDIDO = 0;
                    FOR SELECT P.PEDI_ID, PEDE_ITEM, PEDE_CANT * PEDE_FACTOR
                        FROM PEDIDOS P, PEDIDOS_DETALLE PD
                        WHERE P.PEDI_ID = PD.PEDI_ID AND PD.ARTI_COD = :CODIGO AND PEDI_VENCE >= :FECHA AND PEDI_FECHA <= :FECHA AND PEDE_ANULADO = 'N'
                        INTO :ID, :ITEM, :CANT2
                        do
                        BEGIN
                        EXECUTE PROCEDURE FALTANTE(34, 31, ID, ITEM) returning_values (ORDENC, UND, FACTOR);
                        if ((ORDENC * FACTOR = CANT2) or (PEDAUTO = 'SI')) then /* SI NO SE HA FACTURADO MIRE A VER SI SE REMISIONO */
                            EXECUTE PROCEDURE FALTANTE(34, 32, ID, ITEM) returning_values (ORDENC, UND, FACTOR);
                        if (ORDENC IS NULL) then
                            ORDENC = 0;
                        PEDIDO = PEDIDO + ORDENC * FACTOR;
                        END
                    RESERVADO = RESERVADO + PEDIDO;
                    END
                ELSE
                    BEGIN
                    RESERVADO = 0;
                    ORDENADO = 0;
                    END
                if (LISTA > 0) then
                    SELECT prar_fijo FROM precios_articulo WHERE arti_cod = :CODIGO and lipr_cod = :LISTA INTO :PRECIO;
                if (ENPESO = 'S') then
                    BEGIN
                    if (pesounit IS NULL) then
                        pesounit = 0;
                    if (PESOUNIT <> 0) then
                        BEGIN
                        pesototal = PESOUNIT * cant;
                        SUSPEND;
                        END
                    END
                ELSE
                    SUSPEND;
                END
            END
        END
  end
if (DETALLE = 'N') then
  BEGIN
  FOR SELECT ARTI_COD, ARTI_DES, ARTI_UNIDAD, ARTI_EXIST, TAIV_PORC, A.GRUP_COD, A.SUBG_COD, A.MARC_COD, ARTI_CONSUMO, ARTI_PESO/1000
      FROM ARTICULO A, TARIFA_IVA T
      WHERE ARTI_COD >= :CODINI AND ARTI_COD <= :CODFIN AND ARTI_DES >= :DESINI AND ARTI_DES <= :DESFIN AND ESAR_COD <> 'I' AND A.TAIV_COD = T.TAIV_COD
      INTO :CODIGO, :NOMBRE, :UNIDAD, :EXIST, :IVA, :CODGRUPO, :CODSUBG, :CODMARC, :CONSUMO, :pesounit
      DO
        BEGIN
        OK = 'N';
        if (AGRUPA = 'G') then
            BEGIN
            if ((GRPINI = '0') AND (GRPFIN = 'zz')) then
                OK = 'S';
            else
                if ((CODGRUPO >= GRPINI) AND (CODGRUPO <= GRPFIN)) then
                    OK = 'S';
            end
        ELSE
            if (AGRUPA = 'M') then
                BEGIN
                if ((GRPINI = '0') AND (GRPFIN = 'zzz')) then
                    OK = 'S';
                else
                    if ((CODMARC >= GRPINI) AND (CODMARC <= GRPFIN)) then
                        OK = 'S';
                END
        if (OK = 'S') then
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            SELECT MAX(COBA_COD) FROM BARRAS_ARTICULO WHERE ARTI_COD = :codigo AND COBA_UNIDAD = :unidad INTO :codbar;
            if (CODBAR IS NULL) then
                CODBAR = CODIGO;

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

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

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure IMPR_ENTRADA (
    ID integer)
returns (
    PREF varchar(4),
    NUMERO varchar(6),
    FECHA date,
    CONCEPTO varchar(60),
    REFER varchar(60),
    CODBODEGA varchar(2),
    NOMBODEGA varchar(30),
    NOMTERCERO varchar(60),
    OBS blob sub_type 1 segment size 80,
    ITEM integer,
    ARTICULO varchar(15),
    CODBAR varchar(15),
    ARTIDES varchar(60),
    CANT numeric(18,4),
    UNIDAD varchar(8),
    BODITEM varchar(2),
    STAND varchar(20),
    COSTO numeric(18,2),
    DTOPORC numeric(9,2),
    DTOMONTO numeric(18,2),
    IVAPORC numeric(9,2),
    IVAMONTO numeric(18,2),
    CONSUMO numeric(18,2),
    TOTAL numeric(18,2),
    PRECIO numeric(18,2),
    LOTE varchar(15),
    PESOUNIT numeric(18,4),
    PESOTOT numeric(18,4),
    VOLUMUNIT numeric(18,4),
    VOLUMTOT numeric(18,4),
    TOTALDOC numeric(18,2),
    CONSUMODOC numeric(18,2),
    TOTALMASIMP numeric(18,2))
AS
declare variable IMPTOS CHAR(1);
declare variable LARGO NUMERIC(18,4);
declare variable ANCHO NUMERIC(18,4);
declare variable ALTO NUMERIC(18,4);
declare variable LISTA CHAR(3);
BEGIN
  /*  */
  PESOTOT = 0;
  VOLUMTOT = 0;
  SELECT PREF_PRE, ENTR_NUMERO, ENTR_FECHA, ENTR_CONC, ENTR_REFER, E.BODE_COD, BODE_NOM, ENTR_NOMTERC, ENTR_IMPTOS, ENTR_OBS
    FROM ENTRADAS E, BODEGA B
    WHERE E.BODE_COD = B.BODE_COD AND E.ENTR_ID = :ID
    into :PREF, :NUMERO, :FECHA, :CONCEPTO, :REFER, :CODBODEGA, :NOMBODEGA, :NOMTERCERO, :IMPTOS, :OBS;
  SELECT SUM(ENDE_TOTAL), SUM(ENDE_IVAMONTO), SUM(ENDE_CONSUMO*ENDE_CANT*ENDE_FACTOR) FROM ENTRADAS_DETALLE
    WHERE ENTR_ID = :ID INTO :TOTALDOC, :IVAMONTO, :CONSUMODOC;
  TOTALMASIMP = TOTALDOC + CONSUMODOC;
  if (IMPTOS = 'N') then
    TOTALDOC = TOTALDOC - IVAMONTO;
    
  FOR SELECT ENDE_ITEM, A.ARTI_COD, ENDE_CODBAR, SUBSTR(ENDE_DESC,1,60), ENDE_CANT, ENDE_UNIDAD, BODE_COD, ENDE_COSTO, ENDE_DTOPORC, ENDE_DTOMONTO, ENDE_IVAPORC, ENDE_IVAMONTO, ENDE_CONSUMO, ENDE_TOTAL, ENDE_LOTE,
    (ARTI_PESO / 1000 * ENDE_CANT * ENDE_FACTOR), (ARTI_LARGO / 100 * ENDE_FACTOR), (ARTI_ANCHO / 100 * ENDE_FACTOR), (ARTI_ALTO / 100 * ENDE_FACTOR)
    FROM ENTRADAS_DETALLE D, ARTICULO A
    WHERE D.ARTI_COD = A.ARTI_COD AND D.ENTR_ID = :ID
    ORDER BY ENDE_ITEM
    INTO :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :BODITEM, :COSTO, :DTOPORC, :DTOMONTO, :IVAPORC, :IVAMONTO, :CONSUMO, :TOTAL, :LOTE, :PESOUNIT, :LARGO, :ANCHO, :ALTO
    DO
      BEGIN
      EXECUTE PROCEDURE LEE_CONFIGURACION('INVENTARIO','DOCUMENTOS','CODIGO DE LISTA DE PRECIOS A IMPRIMIR EN DOCUMENTOS') returning_values (:LISTA);
      if (NOT lista IS NULL) then
          SELECT PRAR_FIJO FROM PRECIOS_ARTICULO WHERE ARTI_COD = :articulo AND LIPR_COD = :LISTA INTO :PRECIO;
      if (PESOUNIT IS NULL) then
        PESOUNIT = 0;
      PESOTOT = PESOTOT + PESOUNIT;
      VOLUMUNIT = ANCHO * ALTO * LARGO;
      volumunit = VOLUMUNIT * CANT;
      if (VOLUMUNIT IS NULL) then
        VOLUMUNIT = 0;
      VOLUMTOT = VOLUMTOT + VOLUMUNIT;
      if (IMPTOS = 'N') then
        TOTAL = TOTAL - IVAMONTO;
      SELECT STAND_COD FROM STANDS WHERE ARTI_COD = :ARTICULO AND STAND_BODEGA = :boditem INTO :stand;
      SUSPEND;
      END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure IMPR_FACTCOMP (
    ID integer)
returns (
    PREF varchar(4),
    NUMERO varchar(6),
    FECHA date,
    VENCE date,
    DIASVENCE integer,
    NIT varchar(20),
    NOMTERCERO varchar(60),
    SIMPLIFICADO varchar(15),
    CODBODEGA varchar(2),
    NOMBODEGA varchar(30),
    NUMPROV varchar(10),
    COTIZACION varchar(30),
    PEDIDO varchar(30),
    REMISION varchar(30),
    SUBTOTAL numeric(18,2),
    DTOPORC numeric(9,2),
    DTOMONTO numeric(18,2),
    ADICIONAL numeric(18,2),
    IVAMONTO numeric(18,2),
    RTEFTEPORC numeric(9,2),
    RTEFTEMONTO numeric(18,2),
    RTEIVAPORC numeric(9,2),
    RTEIVAMONTO numeric(18,2),
    RTEICAPORC numeric(9,2),
    RTEICAMONTO numeric(18,2),
    EXTRA numeric(18,2),
    DTOFPORC numeric(9,2),
    DTOFMONTO numeric(18,2),
    FECHADTO date,
    TOTALFAC numeric(18,2),
    TOTALPAGAR numeric(18,2),
    OBS blob sub_type 1 segment size 80,
    ITEM integer,
    ARTICULO varchar(15),
    CODBAR varchar(15),
    ARTIDES varchar(60),
    ARTIPROV varchar(15),
    CANT numeric(18,4),
    LOTE varchar(15),
    UNIDAD varchar(8),
    REFITEM varchar(60),
    BODITEM varchar(2),
    STAND varchar(20),
    PRUNIT numeric(18,2),
    DTOITPORC numeric(9,2),
    DTOITMONTO numeric(18,2),
    PRNETO numeric(18,2),
    IVAPORC numeric(9,2),
    IVAITMONTO numeric(18,2),
    CONSUMO numeric(18,2),
    SUBTOTIT numeric(18,2),
    SUBTOTITCON numeric(18,2),
    TOTAL numeric(18,2),
    CODIGOPR varchar(20),
    ZONACOD varchar(2),
    ZONANOM varchar(60),
    DV char(1),
    DIRECCION varchar(60),
    CIUDAD varchar(40),
    TELEFONO varchar(40),
    CONTACTO varchar(60),
    FAX varchar(25),
    GRUPO varchar(2),
    SUBGRUPO varchar(3),
    MARCA varchar(3),
    PESO numeric(9,4),
    ANCHO numeric(18,4),
    ALTO numeric(18,4),
    LARGO numeric(18,4),
    SUMA1 numeric(18,2),
    SUMA2 numeric(18,2),
    SUMA3 numeric(18,2),
    IVA1 numeric(18,2),
    IVA2 numeric(18,2),
    IVA3 numeric(18,2),
    TOTCONSUMO numeric(18,2),
    SUMAEX numeric(18,2),
    SUMAGR numeric(18,2))
AS
declare variable IMPTOS CHAR(1);
declare variable TARIFA INTEGER;
declare variable SIMPLIFICA CHAR(1);
declare variable orden char(2);
BEGIN
  SELECT PREF_PRE, FACO_NUMERO, FACO_FECHA, FACO_VENCE, F.BODE_COD, BODE_NOM, F.TERC_NIT, TERC_NOM, FACO_NUMPROV, FACO_COTIZACI, FACO_ORDEN, FACO_REMISION, FACO_IMPTOS,
    FACO_DTOPORC, FACO_DTOMONTO, FACO_ADICIONAL, FACO_IVAMONTO, FACO_RTFTEPORC, FACO_RTFTEMONTO, FACO_RTIVAPOR, FACO_RTIVAMONTO, FACO_RTICAPOR, FACO_RTICAMONTO,
    FACO_EXTRA, FACO_DTOFPOR, FACO_DTOFMONTO, FACO_DTOFFECHA, FACO_TOTAL, TERC_DIR, TERC_CIU, TERC_TEL, TERC_CONTACTO, TERC_FAX, TERC_DV,
    FACO_OBS, FACO_SIMPLIFICADO
    FROM FACTURAS_COMPRA F, BODEGA B, TERCEROS T
    WHERE F.BODE_COD = B.BODE_COD AND F.TERC_NIT = T.TERC_NIT AND F.FACO_ID = :ID
    into :PREF, :NUMERO, :FECHA, :VENCE, :CODBODEGA, :NOMBODEGA, :NIT, :NOMTERCERO, :NUMPROV, :COTIZACION, :PEDIDO, :REMISION, :IMPTOS,
    :DTOPORC, :DTOMONTO, :ADICIONAL, :IVAMONTO, :RTEFTEPORC, :RTEFTEMONTO, :RTEIVAPORC, :RTEIVAMONTO, :RTEICAPORC, :RTEICAMONTO, :EXTRA, :DTOFPORC, :DTOFMONTO, :FECHADTO, :TOTALFAC,
    :DIRECCION, :CIUDAD, :TELEFONO, :CONTACTO, :FAX, :DV, :OBS, :SIMPLIFICA;
    
    if (SIMPLIFICA = 'N') then
         SIMPLIFICADO = 'COMUN';
    ELSE
        SIMPLIFICADO = 'SIMPLIFICADO';

  SELECT PROV_COD, P.GRPR_COD, GRPR_NOM
    FROM PROVEEDORES P, GRUPOS_PROVEEDORES G
    WHERE TERC_NIT = :NIT AND G.GRPR_COD = P.GRPR_COD
    INTO :CODIGOPR, :ZONACOD, :ZONANOM;

  DIASVENCE = VENCE - FECHA;
  SUBTOTAL = TOTALFAC - EXTRA - IVAMONTO - ADICIONAL + DTOMONTO;
  TOTALPAGAR = TOTALFAC - RTEFTEMONTO - RTEIVAMONTO - RTEICAMONTO;
  SUMAEX = 0;
  SUMA1 = 0;
  SUMA2 = 0;
  SUMA3 = 0;
  IVA1 = 0;
  IVA2 = 0;
  IVA3 = 0;
  TOTCONSUMO = 0;

execute procedure lee_configuracion('COMPRAS', 'DOCUMENTOS', 'ORDENAR ITEMS POR BODEGA AL IMPRIMIR DOCUMENTOS') returning_values (:Orden);
if (orden = 'NO') then
  BEGIN
  FOR SELECT FCDE_ITEM, D.ARTI_COD, FCDE_CODBAR, SUBSTR(FCDE_DESC,1,60), FCDE_CANT, FCDE_UNIDAD, BODE_COD, FCDE_LOTE, FCDE_PRUNIT,
    FCDE_DTOPORC, FCDE_DTOMONTO, FCDE_IVAPORC, FCDE_IVAMONTO, FCDE_CONSUMO, FCDE_TOTAL,
    GRUP_COD, SUBG_COD, MARC_COD, ARTI_PESO, ARTI_ANCHO, ARTI_ALTO, ARTI_LARGO, TAIV_COD, FCDE_CODPROV, FCDE_REFERENCIA
    FROM FACTURAS_COMPRAS_DETALLE D, ARTICULO A
    WHERE D.ARTI_COD = A.ARTI_COD AND D.FACO_ID = :ID
    ORDER BY FCDE_ITEM
    INTO :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :BODITEM, :LOTE, :PRUNIT,
    :DTOITPORC, :DTOITMONTO, :IVAPORC, :IVAITMONTO, :CONSUMO, :TOTAL,
    :GRUPO, :SUBGRUPO, :MARCA, :PESO, :ANCHO, :ALTO, :LARGO, :TARIFA, :ARTIPROV, :REFITEM
    DO
      BEGIN
      PRNETO = PRUNIT - DTOITMONTO - ((IVAITMONTO+CONSUMO) / CANT);
      SUBTOTIT = TOTAL - IVAITMONTO - CONSUMO;
      SUBTOTITCON = TOTAL;
      TOTCONSUMO = TOTCONSUMO + CONSUMO;
      if (IVAPORC = 0) then
        SUMAEX = SUMAEX + TOTAL;
      if (TARIFA = 1) then
        BEGIN
        SUMA1 = SUMA1 + TOTAL - IVAITMONTO;
        IVA1 = IVA1 + IVAITMONTO;
        END
      if (TARIFA = 2) then
        BEGIN
        SUMA2 = SUMA2 + TOTAL - IVAITMONTO;
        IVA2 = IVA2 + IVAITMONTO;
        END
      if (TARIFA = 3) then
        BEGIN
        SUMA3 = SUMA3 + TOTAL - IVAITMONTO;
        IVA3 = IVA3 + IVAITMONTO;
        END
      SUMAGR = SUMA1 + SUMA2 + SUMA3;
      if (IMPTOS = 'N') then
        TOTAL = TOTAL - IVAITMONTO - CONSUMO;
      SELECT STAND_COD FROM STANDS WHERE ARTI_COD = :ARTICULO AND STAND_BODEGA = :boditem INTO :stand;
      SUSPEND;
      END
  END
ELSE
  BEGIN
  FOR SELECT FCDE_ITEM, D.ARTI_COD, FCDE_CODBAR, SUBSTR(FCDE_DESC,1,60), FCDE_CANT, FCDE_UNIDAD, BODE_COD, FCDE_LOTE, FCDE_PRUNIT,
    FCDE_DTOPORC, FCDE_DTOMONTO, FCDE_IVAPORC, FCDE_IVAMONTO, FCDE_CONSUMO, FCDE_TOTAL,
    GRUP_COD, SUBG_COD, MARC_COD, ARTI_PESO, ARTI_ANCHO, ARTI_ALTO, ARTI_LARGO, TAIV_COD, FCDE_CODPROV, FCDE_REFERENCIA
    FROM FACTURAS_COMPRAS_DETALLE D, ARTICULO A
    WHERE D.ARTI_COD = A.ARTI_COD AND D.FACO_ID = :ID
    ORDER BY D.bode_cod, FCDE_ITEM
    INTO :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :BODITEM, :LOTE, :PRUNIT,
    :DTOITPORC, :DTOITMONTO, :IVAPORC, :IVAITMONTO, :CONSUMO, :TOTAL,
    :GRUPO, :SUBGRUPO, :MARCA, :PESO, :ANCHO, :ALTO, :LARGO, :TARIFA, :ARTIPROV, :REFITEM
    DO
      BEGIN
      PRNETO = PRUNIT - DTOITMONTO - ((IVAITMONTO+CONSUMO) / CANT);
      SUBTOTIT = TOTAL - IVAITMONTO - CONSUMO;
      SUBTOTITCON = TOTAL;
      TOTCONSUMO = TOTCONSUMO + CONSUMO;
      if (IVAPORC = 0) then
        SUMAEX = SUMAEX + TOTAL;
      if (TARIFA = 1) then
        BEGIN
        SUMA1 = SUMA1 + TOTAL - IVAITMONTO;
        IVA1 = IVA1 + IVAITMONTO;
        END
      if (TARIFA = 2) then
        BEGIN
        SUMA2 = SUMA2 + TOTAL - IVAITMONTO;
        IVA2 = IVA2 + IVAITMONTO;
        END
      if (TARIFA = 3) then
        BEGIN
        SUMA3 = SUMA3 + TOTAL - IVAITMONTO;
        IVA3 = IVA3 + IVAITMONTO;
        END
      SUMAGR = SUMA1 + SUMA2 + SUMA3;
      if (IMPTOS = 'N') then
        TOTAL = TOTAL - IVAITMONTO - CONSUMO;
      SELECT STAND_COD FROM STANDS WHERE ARTI_COD = :ARTICULO AND STAND_BODEGA = :boditem INTO :stand;
      SUSPEND;
      END
  END
END
^

SET TERM ; ^

SET TERM ^ ;

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

/* ACUMULE LOS PUNTOS, SE HACE ACA POR SER POSTERIOR AL DETALLE */
if (ANULADO = 'N') then
    EXECUTE PROCEDURE acumula_puntos_cliente (31, :id, :nit, :fecha) returning_values (:PUNTOS);
EXECUTE PROCEDURE consulta_puntos_cliente (:id, :nit, :fecha) returning_values (:puntos, :puntosacum, :puntosvenc, :fecptos);
if (DTOIT1M IS NULL) then
    DTOIT1M = 0;
if (DTOIT2M IS NULL) then
    DTOIT2M = 0;
if (DTOIT3M IS NULL) then
    DTOIT3M = 0;
SELECT CLIE_COD, C.ZONA_COD, ZONA_NOM
    FROM CLIENTES C, ZONAS Z
    WHERE TERC_NIT = :NIT AND C.ZONA_COD = Z.ZONA_COD
    INTO :CODIGOCL, :ZONACOD, :ZONANOM;
SELECT CLSU_DIR, CLSU_CIUDAD, CLSU_TEL FROM CLIENTE_SUCURSALES WHERE TERC_NIT = :NIT AND CLCU_COD = :SUCUR
    INTO :DIRECCION, :CIUDAD, :TELEFONO;
DIASVENCE = VENCE - FECHA;
if (DIASVENCE > 0) then
    CONTCRED = 'CREDITO ' || CAST(DIASVENCE AS VARCHAR(3)) || ' DIAS';
ELSE
    CONTCRED = 'CONTADO';
SUBTOTAL = TOTALFAC - EXTRA - IVAMONTO - ADICIONAL + DTOMONTO;
if (DTOITE3 = 'SI') then
    BEGIN
    SELECT SUM(FADE_DTOMONTO) FROM FACTURAS_DETALLE WHERE FACT_ID = :id INTO :sumdtoit;
    SUBTOTAL = SUBTOTAL + sumdtoit + dtoit1m + dtoit2m + dtoit3m;
    END
if (INGTER <> '') then
    BEGIN
    SELECT SUM(FADE_TOTAL) FROM FACTURAS_DETALLE D, ARTICULO A WHERE A.arti_cod = D.arti_cod AND FACT_ID = :id AND GRUP_COD = :ingter
        INTO :ingterceros;
    END
EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'FECHA AUTORETENEDOR NO DESCONTAR RETENCIONES DEL SALDO PERO SI CONTABILIZARLAS') returning_values (AUTORET);
if (AUTORET <> '') then
    FAUTORET = CAST(AUTORET AS DATE);
else
    FAUTORET = '9999/12/31';
if (FECHA > fautoret) then
    TOTALPAGAR = TOTALFAC - RTEIVAMONTO - RTEICAMONTO - ANTICIPO;
ELSE
    TOTALPAGAR = TOTALFAC - RTEFTEMONTO - RTEIVAMONTO - RTEICAMONTO - ANTICIPO;
if (RECIBIDO <> 0) then
    CAMBIO = RECIBIDO - totalpagar;
ELSE
    CAMBIO = 0;
SUMAEX = 0;
SUMA1 = 0;
SUMA2 = 0;
SUMA3 = 0;
IVA1 = 0;
IVA2 = 0;
IVA3 = 0;
TOTCONSUMO = 0;
MONTOPAGO1 = 0;
SELECT MAX(AUDI_HORA) FROM AUDITORIA WHERE TIDO_COD = 31 AND AUDI_IDDOC = :ID AND AUDI_OPER = 'I' INTO :HORA;
/* AHORA LAS FORMAS DE PAGO, BUSQUE EL ABONO DE HOY A LA FACTURA */
ITEMFP = 1;
MONTOPAGO1 = 0;
MONTOPAGO2 = 0;
MONTOPAGO3 = 0;
FOR SELECT FOPA_NOM, RCPA_MONTO FROM RECIBOS_CAJA_PAGO P, FORMAS_PAGO F, RECIBOS_CAJA R, RECIBOS_CAJA_DETALLE D
    WHERE R.RECA_ID = P.RECA_ID AND R.RECA_ID = D.RECA_ID AND P.FOPA_ID = F.FOPA_ID AND RECA_FECHA = :FECHA AND RCDE_TIPODOC = 31 AND RCDE_IDDOC = :ID
    INTO :formap, :MONTOP
    DO
    BEGIN
    if (ITEMFP = 1) then
        BEGIN
        FORMAPAGO1 = FORMAP;
        MONTOPAGO1 = MONTOP;
        END
    if (ITEMFP = 2) then
        BEGIN
        FORMAPAGO2 = FORMAP;
        MONTOPAGO2 = MONTOP;
        END
    if (ITEMFP = 3) then
        BEGIN
        FORMAPAGO3 = FORMAP;
        MONTOPAGO3 = MONTOP;
        END
    ITEMFP = ITEMFP + 1;
    END
EXECUTE PROCEDURE lee_configuracion ('FACTURACION','DOCUMENTOS','ORDENAR ITEMS POR CODIGO DE ARTICULO') returning_values (:ORDENCOD);
EXECUTE PROCEDURE lee_configuracion ('FACTURACION','POS', 'IMPRIMIR DEVOLUCIONES DE ARTICULOS NEGATIVOS') returning_values (:imprdev);
totcajas = 0;
totbase = 0;
if (ORDENCOD = 'SI') then
    BEGIN
    FOR SELECT FADE_ITEM, D.ARTI_COD, FADE_CODBAR, SUBSTR(FADE_DESC,1,60), ARTI_DESCORTA, FADE_CANT, FADE_UNIDAD, FADE_FACTOR, BODE_COD, FADE_LOTE, LIPR_COD, FADE_PRUNIT, FADE_DTOPORC, FADE_DTOMONTO, FADE_IVAPORC, FADE_IVAMONTO, FADE_CONSUMO, FADE_TOTAL, FADE_REFERENCIA,
        GRUP_COD, SUBG_COD, MARC_COD, ARTI_PESO, ARTI_ANCHO, ARTI_ALTO, ARTI_LARGO, TAIV_COD, FADE_DEVUELTO, FADE_OBS, FADE_DTO1, FADE_DTO2, FADE_DTO3, FADE_DTOM1, FADE_DTOM2, FADE_DTOM3, FADE_CAJAS, FADE_BASE, FADE_PORCBASE
        FROM FACTURAS_DETALLE D, ARTICULO A
        WHERE D.ARTI_COD = A.ARTI_COD AND D.FACT_ID = :ID
        ORDER BY D.ARTI_COD
        INTO :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :DESCORTA, :CANT, :UNIDAD, :FACTOR, :BODITEM, :LOTE, :LISTAPR, :PRUNIT, :DTOITPORC, :DTOITMONTO, :IVAPORC, :IVAITMONTO, :CONSUMO, :TOTAL, :refitem,
        :GRUPO, :SUBGRUPO, :MARCA, :PESO, :ANCHO, :ALTO, :LARGO, :TARIFA, :devuelto, :obsitem, :dtoit1, :dtoit2, :dtoit3, :dtoitm1, :dtoitm2, :dtoitm3, :cajas, :base, :porcbase
        DO
          BEGIN
          if (ARTICULO = CODBAR) then
            SELECT FIRST 1 COBA_COD FROM barras_articulo WHERE ARTI_COD = :articulo INTO :CODBAR;
          if (IMPRDEV <> 'SI') then
            BEGIN
            if ((CANT >= 0) AND (DEVUELTO = 0)) then
                IMPR = 'S';
            ELSE
                IMPR = 'N'; /* ES DEVOLUCION */
            END
          ELSE
            IMPR = 'S';
          if (IMPR = 'S') then
            BEGIN
            prneto = PRUNIT - DTOITMONTO - dtoitm1 - dtoitm2 - dtoitm3;
            if (IMPTOS = 'S') then
                if (cant <> 0) then
                    prnetosiniva = PRUNIT - DTOITMONTO - ((IVAITMONTO+CONSUMO) / CANT) - dtoitm1 - dtoitm2 - dtoitm3;
                else
                    prnetosiniva = PRUNIT - DTOITMONTO - dtoitm1 - dtoitm2 - dtoitm3;
            ELSE
                prnetosiniva = PRUNIT - DTOITMONTO - dtoit1m - dtoit2m - dtoit3m;
            if (ICOINC = 'SI') then
                SUBTOTIT = TOTAL - IVAITMONTO;
            else
                SUBTOTIT = TOTAL - IVAITMONTO - CONSUMO;
            TOTCONSUMO = TOTCONSUMO + CONSUMO;
            TOTBASE = TOTBASE + BASE;
            SELECT LOTE_VENCE FROM LOTES WHERE LOTE_NRO = :lote AND ARTI_COD = :ARTICULO AND BODE_COD = :boditem INTO :vlote;
            if ((REFITEM <> '.t') or (REFITEM IS NULL)) then
                BEGIN
                /* NO SUME LOS ENSAMBLES */
                if (IVAPORC = 0) then
                    SUMAEX = SUMAEX + TOTAL;
                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;
                END
            if (ANCHO IS NULL) then
                ANCHO = 0;
            if (ALTO IS NULL) then
                ALTO = 0;
            if (LARGO IS NULL) then
                LARGO = 0;
            if (PESO IS NULL) then
                PESO = 0;
            PESO = (PESO / 1000) * CANT * FACTOR;
            totcajas = totcajas + cajas;
            if (substr(ARTICULO,1,2) = '.t') then
                BEGIN
                REFITEM = '';
                TOTAL = 0;
                SUBTOTIT = 0;
                END
            SELECT STAND_COD FROM STANDS WHERE ARTI_COD = :ARTICULO AND STAND_BODEGA = :boditem INTO :stand;
            factcant = NULL;
            SELECT FIRST 1 UNAR_FACCAN FROM unidad_articulo WHERE ARTI_COD = :articulo INTO :factcant;
            if (factcant IS NULL) then
                BEGIN
                ALTERNATIVAS = 0;
                PRINCIPALES = (CANT * FACTOR);
                END
            ELSE
                BEGIN
                ALTERNATIVAS = FLOOR(CANT * factor / factcant);
                PRINCIPALES = (CANT * FACTOR) - (alternativas * factcant);
                END
            SUSPEND;
            END
          END
    END
ELSE
    BEGIN
    FOR SELECT FADE_ITEM, D.ARTI_COD, FADE_CODBAR, SUBSTR(FADE_DESC,1,60), ARTI_DESCORTA, FADE_CANT, FADE_UNIDAD, FADE_FACTOR, BODE_COD, FADE_LOTE, LIPR_COD, FADE_PRUNIT, FADE_DTOPORC, FADE_DTOMONTO, FADE_IVAPORC, FADE_IVAMONTO, FADE_CONSUMO, FADE_TOTAL, FADE_REFERENCIA,
        GRUP_COD, SUBG_COD, MARC_COD, ARTI_PESO, ARTI_ANCHO, ARTI_ALTO, ARTI_LARGO, TAIV_COD, FADE_DEVUELTO, FADE_OBS, FADE_DTO1, FADE_DTO2, FADE_DTO3, FADE_DTOM1, FADE_DTOM2, FADE_DTOM3, FADE_CAJAS, FADE_BASE, FADE_PORCBASE
        FROM FACTURAS_DETALLE D, ARTICULO A
        WHERE D.ARTI_COD = A.ARTI_COD AND D.FACT_ID = :ID
        ORDER BY FADE_ITEM
        INTO :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :DESCORTA, :CANT, :UNIDAD, :FACTOR, :BODITEM, :LOTE, :LISTAPR, :PRUNIT, :DTOITPORC, :DTOITMONTO, :IVAPORC, :IVAITMONTO, :CONSUMO, :TOTAL, :refitem,
        :GRUPO, :SUBGRUPO, :MARCA, :PESO, :ANCHO, :ALTO, :LARGO, :TARIFA, :devuelto, :obsitem, :dtoit1, :dtoit2, :dtoit3, :dtoitm1, :dtoitm2, :dtoitm3, :cajas, :base, :porcbase
        DO
          BEGIN
          if (IMPRDEV <> 'SI') then
            BEGIN
            if ((CANT >= 0) AND (DEVUELTO = 0)) then
                IMPR = 'S';
            ELSE
                IMPR = 'N'; /* ES DEVOLUCION */
            END
          ELSE
            IMPR = 'S';
          if (IMPR = 'S') then
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :GRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :MARCA INTO NOMMARCA;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :SUBGRUPO AND GRUP_COD = :GRUPO INTO :NOMSUBG;
            prneto = PRUNIT - DTOITMONTO - dtoitm1 - dtoitm2 - dtoitm3;
            if (IMPTOS = 'S') then
                if (cant <> 0) then
                    prnetosiniva = PRUNIT - DTOITMONTO - ((IVAITMONTO+CONSUMO) / CANT) - dtoit1m - dtoit2m - dtoit3m;
                else
                    prnetosiniva = PRUNIT - DTOITMONTO - dtoitm1 - dtoitm2 - dtoitm3;
            ELSE
                prnetosiniva = PRUNIT - DTOITMONTO - dtoitm1 - dtoitm2 - dtoitm3;
            if (ICOINC = 'SI') then
                SUBTOTIT = TOTAL - IVAITMONTO;
            else
                SUBTOTIT = TOTAL - IVAITMONTO - CONSUMO;
            TOTCONSUMO = TOTCONSUMO + CONSUMO;
            TOTBASE = TOTBASE + BASE;
            SELECT LOTE_VENCE FROM LOTES WHERE LOTE_NRO = :lote AND ARTI_COD = :ARTICULO AND BODE_COD = :boditem INTO :vlote;
            if ((REFITEM <> '.t') or (REFITEM IS NULL)) then
                BEGIN
                /* NO SUME LOS ENSAMBLES */
                if (IVAPORC = 0) then
                    SUMAEX = SUMAEX + TOTAL;
                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;
                END
            if (ANCHO IS NULL) then
                ANCHO = 0;
            if (ALTO IS NULL) then
                ALTO = 0;
            if (LARGO IS NULL) then
                LARGO = 0;
            if (PESO IS NULL) then
                PESO = 0;
            PESO = (PESO / 1000)* CANT * FACTOR;
            totcajas = totcajas + cajas;
            if (substr(ARTICULO,1,2) = '.t') then
                BEGIN
                REFITEM = '';
                TOTAL = 0;
                SUBTOTIT = 0;
                END
            SELECT STAND_COD FROM STANDS WHERE ARTI_COD = :ARTICULO AND STAND_BODEGA = :boditem INTO :stand;
            factcant = NULL;
            SELECT FIRST 1 UNAR_FACCAN FROM unidad_articulo WHERE ARTI_COD = :articulo INTO :factcant;
            if (factcant IS NULL) then
                BEGIN
                ALTERNATIVAS = 0;
                PRINCIPALES = (CANT * FACTOR);
                END
            ELSE
                BEGIN
                ALTERNATIVAS = FLOOR(CANT * factor / factcant);
                PRINCIPALES = (CANT * FACTOR) - (alternativas * factcant);
                END
            SUSPEND;
            END
          END
    END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure IMPR_REMIPROV (
    ID integer)
returns (
    PREF varchar(4),
    NUMERO varchar(6),
    FECHA date,
    NIT varchar(20),
    NOMTERCERO varchar(60),
    CODBODEGA varchar(2),
    NOMBODEGA varchar(30),
    NUMPROV varchar(10),
    COTIZACION varchar(30),
    PEDIDO varchar(30),
    SUBTOTAL numeric(18,2),
    DTOPORC numeric(9,2),
    DTOMONTO numeric(18,2),
    ADICIONAL numeric(18,2),
    IVAMONTO numeric(18,2),
    EXTRA numeric(18,2),
    TOTALFAC numeric(18,2),
    OBS blob sub_type 1 segment size 80,
    ITEM integer,
    ARTICULO varchar(15),
    CODBAR varchar(15),
    ARTIDES varchar(60),
    ARTIPROV varchar(15),
    CANT numeric(18,4),
    LOTE varchar(15),
    UNIDAD varchar(8),
    BODITEM varchar(2),
    STAND varchar(20),
    PRUNIT numeric(18,2),
    DTOITPORC numeric(9,2),
    DTOITMONTO numeric(18,2),
    PRNETO numeric(18,2),
    IVAPORC numeric(9,2),
    IVAITMONTO numeric(18,2),
    CONSUMO numeric(18,2),
    TOTAL numeric(18,2),
    CODIGOPR varchar(20),
    ZONACOD varchar(2),
    ZONANOM varchar(30),
    DV char(1),
    DIRECCION varchar(60),
    CIUDAD varchar(40),
    TELEFONO varchar(40),
    CONTACTO varchar(60),
    FAX varchar(25),
    GRUPO varchar(2),
    SUBGRUPO varchar(3),
    MARCA varchar(3),
    PESO numeric(9,4),
    ANCHO numeric(18,4),
    ALTO numeric(18,4),
    LARGO numeric(18,4),
    SUMA1 numeric(18,2),
    SUMA2 numeric(18,2),
    SUMA3 numeric(18,2),
    IVA1 numeric(18,2),
    IVA2 numeric(18,2),
    IVA3 numeric(18,2),
    SUMAEX numeric(18,2),
    SUMAGR numeric(18,2))
AS
declare variable IMPTOS CHAR(1);
declare variable TARIFA INTEGER;
declare variable orden char(2);
BEGIN
  SELECT PREF_PRE, REPR_NUMERO, REPR_FECHA, F.BODE_COD, BODE_NOM, REPR_NUMPROV, REPR_COTIZACI, REPR_ORDEN, REPR_IMPTOS, 
    REPR_DTOPORC, REPR_DTOMONTO, REPR_ADICIONAL, REPR_IVAMONTO, REPR_EXTRA, REPR_TOTAL,
    F.TERC_NIT, TERC_NOM, TERC_DIR, TERC_CIU, TERC_TEL, TERC_CONTACTO, TERC_FAX, TERC_DV,
    REPR_OBS
    FROM REMISION_PROVEEDOR F, BODEGA B, TERCEROS T
    WHERE F.BODE_COD = B.BODE_COD AND F.TERC_NIT = T.TERC_NIT AND F.REPR_ID = :ID
    into :PREF, :NUMERO, :FECHA, :CODBODEGA, :NOMBODEGA, :NUMPROV, :COTIZACION, :PEDIDO, :IMPTOS, 
    :DTOPORC, :DTOMONTO, :ADICIONAL, :IVAMONTO, :EXTRA, :TOTALFAC,
    :NIT, :NOMTERCERO, :DIRECCION, :CIUDAD, :TELEFONO, :CONTACTO, :FAX, :DV,
    :OBS;
    
  SELECT PROV_COD, P.GRPR_COD, GRPR_NOM
    FROM PROVEEDORES P, GRUPOS_PROVEEDORES G
    WHERE TERC_NIT = :NIT AND G.GRPR_COD = P.GRPR_COD
    INTO :CODIGOPR, :ZONACOD, :ZONANOM;
    
  SUBTOTAL = TOTALFAC - EXTRA - IVAMONTO - ADICIONAL + DTOMONTO;
  SUMAEX = 0;
  SUMA1 = 0;
  SUMA2 = 0;
  SUMA3 = 0;
  IVA1 = 0;
  IVA2 = 0;
  IVA3 = 0;

execute procedure lee_configuracion('COMPRAS', 'DOCUMENTOS', 'ORDENAR ITEMS POR BODEGA AL IMPRIMIR DOCUMENTOS') returning_values (:Orden);
if (orden = 'NO') then
  BEGIN
  FOR SELECT RPVD_ITEM, D.ARTI_COD, RPVD_CODBAR, SUBSTR(RPVD_DESC,1,60), RPVD_CANT, RPVD_UNIDAD, BODE_COD, RPVD_LOTE, RPVD_PRUNIT,
    RPVD_DTOPORC, RPVD_DTOMONTO, RPVD_IVAPORC, RPVD_IVAMONTO, RPVD_CONSUMO, RPVD_TOTAL,
    GRUP_COD, SUBG_COD, MARC_COD, ARTI_PESO, ARTI_ANCHO, ARTI_ALTO, ARTI_LARGO, TAIV_COD, RPVD_CODPROV
    FROM REMISION_PROVEEDOR_DET D, ARTICULO A
    WHERE D.ARTI_COD = A.ARTI_COD AND D.REPR_ID = :ID
    ORDER BY RPVD_ITEM
    INTO :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :BODITEM, :LOTE, :PRUNIT,
    :DTOITPORC, :DTOITMONTO, :IVAPORC, :IVAITMONTO, :CONSUMO, :TOTAL,
    :GRUPO, :SUBGRUPO, :MARCA, :PESO, :ANCHO, :ALTO, :LARGO, :TARIFA, :ARTIPROV
    DO
      BEGIN
      PRNETO = PRUNIT - DTOITMONTO;
      if (IVAPORC = 0) then
        SUMAEX = SUMAEX + TOTAL;
      if (TARIFA = 1) then
        BEGIN
        SUMA1 = SUMA1 + TOTAL - IVAITMONTO;
        IVA1 = IVA1 + IVAITMONTO;
        END
      if (TARIFA = 2) then
        BEGIN
        SUMA2 = SUMA2 + TOTAL - IVAITMONTO;
        IVA2 = IVA2 + IVAITMONTO;
        END
      if (TARIFA = 3) then
        BEGIN
        SUMA3 = SUMA3 + TOTAL - IVAITMONTO;
        IVA3 = IVA3 + IVAITMONTO;
        END
      SUMAGR = SUMA1 + SUMA2 + SUMA3;
      if (IMPTOS = 'N') then
        TOTAL = TOTAL - IVAITMONTO;
      SELECT STAND_COD FROM STANDS WHERE ARTI_COD = :ARTICULO AND STAND_BODEGA = :boditem INTO :stand;
      SUSPEND;
      END
  END
ELSE
  BEGIN
  FOR SELECT RPVD_ITEM, D.ARTI_COD, RPVD_CODBAR, SUBSTR(RPVD_DESC,1,60), RPVD_CANT, RPVD_UNIDAD, BODE_COD, RPVD_LOTE, RPVD_PRUNIT,
    RPVD_DTOPORC, RPVD_DTOMONTO, RPVD_IVAPORC, RPVD_IVAMONTO, RPVD_CONSUMO, RPVD_TOTAL,
    GRUP_COD, SUBG_COD, MARC_COD, ARTI_PESO, ARTI_ANCHO, ARTI_ALTO, ARTI_LARGO, TAIV_COD, RPVD_CODPROV
    FROM REMISION_PROVEEDOR_DET D, ARTICULO A
    WHERE D.ARTI_COD = A.ARTI_COD AND D.REPR_ID = :ID
    ORDER BY D.bode_cod, RPVD_ITEM
    INTO :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :BODITEM, :LOTE, :PRUNIT,
    :DTOITPORC, :DTOITMONTO, :IVAPORC, :IVAITMONTO, :CONSUMO, :TOTAL,
    :GRUPO, :SUBGRUPO, :MARCA, :PESO, :ANCHO, :ALTO, :LARGO, :TARIFA, :ARTIPROV
    DO
      BEGIN
      PRNETO = PRUNIT - DTOITMONTO;
      if (IVAPORC = 0) then
        SUMAEX = SUMAEX + TOTAL;
      if (TARIFA = 1) then
        BEGIN
        SUMA1 = SUMA1 + TOTAL - IVAITMONTO;
        IVA1 = IVA1 + IVAITMONTO;
        END
      if (TARIFA = 2) then
        BEGIN
        SUMA2 = SUMA2 + TOTAL - IVAITMONTO;
        IVA2 = IVA2 + IVAITMONTO;
        END
      if (TARIFA = 3) then
        BEGIN
        SUMA3 = SUMA3 + TOTAL - IVAITMONTO;
        IVA3 = IVA3 + IVAITMONTO;
        END
      SUMAGR = SUMA1 + SUMA2 + SUMA3;
      if (IMPTOS = 'N') then
        TOTAL = TOTAL - IVAITMONTO;
      SELECT STAND_COD FROM STANDS WHERE ARTI_COD = :ARTICULO AND STAND_BODEGA = :boditem INTO :stand;
      SUSPEND;
      END
  END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure IMPR_REMISION (
    ID integer)
returns (
    PREF varchar(4),
    NUMERO varchar(6),
    FECHA date,
    NIT varchar(20),
    NOMTERCERO varchar(60),
    VENDEDOR integer,
    NOMVENDEDOR varchar(60),
    PUNTOVTA integer,
    NOMPUNTOVTA varchar(30),
    CODBODEGA varchar(2),
    NOMBODEGA varchar(30),
    COTIZACION varchar(30),
    PEDIDO varchar(30),
    FACTURA varchar(30),
    SUBTOTAL numeric(18,2),
    IVAMONTO numeric(18,2),
    TOTALFAC numeric(18,2),
    DESPACHO varchar(255),
    TRANSPORTADOR varchar(60),
    OBS blob sub_type 1 segment size 80,
    ITEM integer,
    ARTICULO varchar(15),
    CODBAR varchar(15),
    ARTIDES varchar(60),
    CANT numeric(18,4),
    LOTE varchar(15),
    VLOTE date,
    UNIDAD varchar(8),
    FACTOR numeric(18,4),
    CAJAS numeric(18,4),
    DEVUELTO numeric(18,4),
    CONSUMIDO numeric(18,4),
    LISTAPR integer,
    REFITEM varchar(60),
    BODITEM varchar(2),
    STAND varchar(20),
    PRUNIT numeric(18,2),
    DTOITPORC numeric(9,2),
    DTOITMONTO numeric(18,2),
    PRNETOSINIVA numeric(18,2),
    PRNETO numeric(18,2),
    IVAPORC numeric(9,2),
    IVAITMONTO numeric(18,2),
    CONSUMO numeric(18,2),
    SUBTOTIT numeric(18,2),
    TOTAL numeric(18,2),
    CODIGOCL varchar(20),
    ZONACOD varchar(2),
    ZONANOM varchar(60),
    DV char(1),
    DIRECCION varchar(60),
    CIUDAD varchar(40),
    TELEFONO varchar(40),
    CONTACTO varchar(60),
    FAX varchar(25),
    CEL varchar(25),
    GRUPO varchar(2),
    NOMGRUPO varchar(30),
    SUBGRUPO varchar(3),
    NOMSUBG varchar(30),
    MARCA varchar(3),
    NOMMARCA varchar(30),
    PESO numeric(9,4),
    ANCHO numeric(18,4),
    ALTO numeric(18,4),
    LARGO numeric(18,4),
    SUMA1 numeric(18,2),
    SUMA2 numeric(18,2),
    SUMA3 numeric(18,2),
    IVA1 numeric(18,2),
    IVA2 numeric(18,2),
    IVA3 numeric(18,2),
    SUMAEX numeric(18,2),
    SUMAGR numeric(18,2),
    TOTCAJAS numeric(18,2),
    OBSITEM blob sub_type 1 segment size 80,
    ALTERNATIVAS numeric(18,4),
    PRINCIPALES numeric(18,4))
AS
DECLARE VARIABLE IMPTOS CHAR(1);
DECLARE VARIABLE TARIFA INTEGER;
declare variable ORDENCOD CHAR(2);
declare variable SUCUR VARCHAR(10);
declare variable ICOINC CHAR(2);
declare variable FACTCANT NUMERIC(18,4);
BEGIN
execute procedure lee_configuracion('FACTURACION', 'ARTICULOS', 'IMPOCONSUMO INCLUIDO EN EL PRECIO BASE DE VENTA ANTES DE IVA') returning_values (icoinc);
EXECUTE PROCEDURE lee_configuracion ('FACTURACION','DOCUMENTOS','ORDENAR ITEMS POR CODIGO DE ARTICULO') returning_values (:ORDENCOD);
SELECT F.PREF_PRE, REVT_NUMERO, REVT_FECHA, F.BODE_COD, BODE_NOM, F.TERC_NIT, REVT_NOMTERC, F.VEND_COD, VEND_NOMBRE, F.PTVT_ID, PTVT_NOM,
    REVT_COTIZACI, REVT_PEDIDO, REVT_FACTURA, REVT_IVAINC,
    REVT_IVAMONTO, REVT_TOTAL, REVT_DESPACHO, REVT_TRANSP,
    TERC_CONTACTO, TERC_FAX, TERC_DV, TERC_CEL, REVT_OBS, REVT_SUCURSAL
    FROM REMISIONES_VENTA F, BODEGA B, VENDEDORES V, PUNTO_VENTA P, TERCEROS T
    WHERE F.BODE_COD = B.BODE_COD AND F.VEND_COD = V.VEND_COD AND F.PTVT_ID = P.PTVT_ID AND F.TERC_NIT = T.TERC_NIT AND F.REVT_ID = :ID
    into :PREF, :NUMERO, :FECHA, :CODBODEGA, :NOMBODEGA, :NIT, :NOMTERCERO, :VENDEDOR, :NOMVENDEDOR, :PUNTOVTA, :NOMPUNTOVTA,
    :COTIZACION, :PEDIDO, :FACTURA, :IMPTOS,
    :IVAMONTO, :TOTALFAC, :DESPACHO, :transportador, 
    :CONTACTO, :FAX, :DV, :CEL, :OBS, :SUCUR;
SUBTOTAL = TOTALFAC - IVAMONTO;

SELECT CLIE_COD, C.ZONA_COD, ZONA_NOM
    FROM CLIENTES C, ZONAS Z
    WHERE TERC_NIT = :NIT AND C.ZONA_COD = Z.ZONA_COD
    INTO :CODIGOCL, :ZONACOD, :ZONANOM;
SELECT CLSU_DIR, CLSU_CIUDAD, CLSU_TEL FROM CLIENTE_SUCURSALES WHERE TERC_NIT = :NIT AND CLCU_COD = :SUCUR
    INTO :DIRECCION, :CIUDAD, :TELEFONO;
    
SUMAEX = 0;
SUMA1 = 0;
SUMA2 = 0;
SUMA3 = 0;
IVA1 = 0;
IVA2 = 0;
IVA3 = 0;
ITEM = 0;
totcajas = 0;
if (ORDENCOD = 'SI') then
    BEGIN
    FOR SELECT D.ARTI_COD, RVDE_CODBAR, SUBSTR(RVDE_DESC,1,60), RVDE_CANT, RVDE_UNIDAD, BODE_COD, RVDE_LOTE, LIPR_COD, RVDE_PRUNIT, RVDE_DTOPORC, RVDE_DTOMONTO, RVDE_IVAPORC, RVDE_IVAMONTO, RVDE_CONSUMO, RVDE_TOTAL, RVDE_REFERENCIA,
        GRUP_COD, SUBG_COD, MARC_COD, ARTI_PESO, ARTI_ANCHO, ARTI_ALTO, ARTI_LARGO, TAIV_COD, RVDE_DEVUELTO, RVDE_OBS, RVDE_CAJAS, RVDE_FACTOR
        FROM REMISIONES_VENTA_DETALLE D, ARTICULO A
        WHERE D.ARTI_COD = A.ARTI_COD AND D.REVT_ID = :ID
        ORDER BY RVDE_CODBAR
        INTO :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :BODITEM, :LOTE, :LISTAPR, :PRUNIT, :DTOITPORC, :DTOITMONTO, :IVAPORC, :IVAITMONTO, :CONSUMO, :TOTAL, :refitem,
            :GRUPO, :SUBGRUPO, :MARCA, :PESO, :ANCHO, :ALTO, :LARGO, :TARIFA, :DEVUELTO, :obsitem, :CAJAS, :FACTOR
        DO
        BEGIN
        if (ARTICULO = CODBAR) then
            SELECT FIRST 1 COBA_COD FROM barras_articulo WHERE ARTI_COD = :articulo INTO :CODBAR;
        SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :GRUPO INTO NOMGRUPO;
        SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :MARCA INTO NOMMARCA;
        SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :SUBGRUPO AND GRUP_COD = :GRUPO INTO :NOMSUBG;
        SELECT LOTE_VENCE FROM LOTES WHERE LOTE_NRO = :lote AND ARTI_COD = :ARTICULO AND BODE_COD = :boditem INTO :vlote;
        if (ICOINC = 'SI') then
            SUBTOTIT = TOTAL - IVAITMONTO;
        else
            SUBTOTIT = TOTAL - IVAITMONTO - CONSUMO;
        CONSUMIDO = cant * factor - devuelto;
        ITEM = ITEM + 1;
        PRNETO = PRUNIT - DTOITMONTO;
        if (PESO IS NULL) then
            PESO = 0;
        PESO = PESO / 1000 * CANT * FACTOR;
        if (IMPTOS = 'S') then
            if (cant <> 0) then
                prnetosiniva = PRUNIT - DTOITMONTO - ((IVAITMONTO+CONSUMO) / CANT);
            else
                prnetosiniva = PRUNIT - DTOITMONTO;
        ELSE
            prnetosiniva = PRUNIT - DTOITMONTO;
        if (IVAPORC = 0) then
            SUMAEX = SUMAEX + TOTAL;
        if (TARIFA = 1) then
            BEGIN
            SUMA1 = SUMA1 + TOTAL - IVAITMONTO;
            IVA1 = IVA1 + IVAITMONTO;
            END
        if (TARIFA = 2) then
            BEGIN
            SUMA2 = SUMA2 + TOTAL - IVAITMONTO;
            IVA2 = IVA2 + IVAITMONTO;
            END
        if (TARIFA = 3) then
            BEGIN
            SUMA3 = SUMA3 + TOTAL - IVAITMONTO;
            IVA3 = IVA3 + IVAITMONTO;
            END
        SUMAGR = SUMA1 + SUMA2 + SUMA3;

        totcajas = totcajas + cajas;
        SELECT STAND_COD FROM STANDS WHERE ARTI_COD = :ARTICULO AND STAND_BODEGA = :boditem INTO :stand;
        factcant = NULL;
        SELECT FIRST 1 UNAR_FACCAN FROM unidad_articulo WHERE ARTI_COD = :articulo INTO :factcant;
        if (factcant IS NULL) then
            factcant = 1;
        if ((factcant = 1) or (factcant = 0)) then
            BEGIN
            ALTERNATIVAS = 0;
            PRINCIPALES = (CANT * FACTOR);
            END
        ELSE
            BEGIN
            ALTERNATIVAS = FLOOR(CANT * factor / factcant);
            PRINCIPALES = (CANT * FACTOR) - (alternativas * factcant);
            END
        SUSPEND;
        END
    END
ELSE
    BEGIN
    FOR SELECT RVDE_ITEM, D.ARTI_COD, RVDE_CODBAR, SUBSTR(RVDE_DESC,1,60), RVDE_CANT, RVDE_UNIDAD, BODE_COD, RVDE_LOTE, LIPR_COD, RVDE_PRUNIT, RVDE_DTOPORC, RVDE_DTOMONTO, RVDE_IVAPORC, RVDE_IVAMONTO, RVDE_CONSUMO, RVDE_TOTAL, RVDE_REFERENCIA,
        GRUP_COD, SUBG_COD, MARC_COD, ARTI_PESO, ARTI_ANCHO, ARTI_ALTO, ARTI_LARGO, TAIV_COD, RVDE_DEVUELTO, RVDE_OBS, RVDE_CAJAS, RVDE_FACTOR
        FROM REMISIONES_VENTA_DETALLE D, ARTICULO A
        WHERE D.ARTI_COD = A.ARTI_COD AND D.REVT_ID = :ID
        ORDER BY RVDE_ITEM
        INTO :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :BODITEM, :LOTE, :LISTAPR, :PRUNIT, :DTOITPORC, :DTOITMONTO, :IVAPORC, :IVAITMONTO, :CONSUMO, :TOTAL, :refitem,
            :GRUPO, :SUBGRUPO, :MARCA, :PESO, :ANCHO, :ALTO, :LARGO, :TARIFA, :DEVUELTO, :obsitem, :CAJAS, :FACTOR
        DO
        BEGIN
        SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :GRUPO INTO NOMGRUPO;
        SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :MARCA INTO NOMMARCA;
        SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :SUBGRUPO AND GRUP_COD = :GRUPO INTO :NOMSUBG;
        SELECT LOTE_VENCE FROM LOTES WHERE LOTE_NRO = :lote AND ARTI_COD = :ARTICULO AND BODE_COD = :boditem INTO :vlote;
        if (ICOINC = 'SI') then
            SUBTOTIT = TOTAL - IVAITMONTO;
        else
            SUBTOTIT = TOTAL - IVAITMONTO - CONSUMO;
        CONSUMIDO = cant * factor - devuelto;
        ITEM = ITEM + 1;
        PRNETO = PRUNIT - DTOITMONTO;
        if (PESO IS NULL) then
            PESO = 0;
        PESO = PESO / 1000 * CANT * FACTOR;
        if (IMPTOS = 'S') then
            if (cant <> 0) then
                prnetosiniva = PRUNIT - DTOITMONTO - ((IVAITMONTO+CONSUMO) / CANT);
            else
                prnetosiniva = PRUNIT - DTOITMONTO;
        ELSE
            prnetosiniva = PRUNIT - DTOITMONTO;
        if (IVAPORC = 0) then
            SUMAEX = SUMAEX + TOTAL;
        if (TARIFA = 1) then
            BEGIN
            SUMA1 = SUMA1 + TOTAL - IVAITMONTO;
            IVA1 = IVA1 + IVAITMONTO;
            END
        if (TARIFA = 2) then
            BEGIN
            SUMA2 = SUMA2 + TOTAL - IVAITMONTO;
            IVA2 = IVA2 + IVAITMONTO;
            END
        if (TARIFA = 3) then
            BEGIN
            SUMA3 = SUMA3 + TOTAL - IVAITMONTO;
            IVA3 = IVA3 + IVAITMONTO;
            END
        SUMAGR = SUMA1 + SUMA2 + SUMA3;
        totcajas = totcajas + cajas;
        SELECT STAND_COD FROM STANDS WHERE ARTI_COD = :ARTICULO AND STAND_BODEGA = :boditem INTO :stand;
        factcant = NULL;
        SELECT FIRST 1 UNAR_FACCAN FROM unidad_articulo WHERE ARTI_COD = :articulo INTO :factcant;
        if (factcant IS NULL) then
            factcant = 1;
        if ((factcant = 1) or (factcant = 0)) then
            BEGIN
            ALTERNATIVAS = 0;
            PRINCIPALES = (CANT * FACTOR);
            END
        ELSE
            BEGIN
            ALTERNATIVAS = FLOOR(CANT * factor / factcant);
            PRINCIPALES = (CANT * FACTOR) - (alternativas * factcant);
            END
        SUSPEND;
        END
    END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure IMPR_SALIDA (
    ID integer)
returns (
    PREF varchar(4),
    NUMERO varchar(6),
    FECHA date,
    CONCEPTO varchar(60),
    REFER varchar(60),
    CODBODEGA varchar(2),
    NOMBODEGA varchar(30),
    NOMTERCERO varchar(60),
    OBS blob sub_type 0 segment size 80,
    ITEM integer,
    ARTICULO varchar(15),
    CODBAR varchar(15),
    ARTIDES varchar(60),
    CANT numeric(18,4),
    UNIDAD varchar(8),
    BODITEM varchar(2),
    STAND varchar(20),
    COSTO numeric(18,2),
    IVAPORC numeric(9,2),
    IVAMONTO numeric(18,2),
    CONSUMO numeric(18,2),
    TOTAL numeric(18,2),
    TOTALITEM numeric(18,2),
    PRECIO numeric(18,2),
    LOTE varchar(15),
    PESOUNIT numeric(18,4),
    PESOTOT numeric(18,4),
    VOLUMUNIT numeric(18,4),
    VOLUMTOT numeric(18,4),
    TOTALDOC numeric(18,2),
    ULTIMO numeric(18,2),
    TOTALULT numeric(18,2),
    CONSUMODOC numeric(18,2),
    TOTALMASIMP numeric(18,2))
AS
declare variable IMPTOS CHAR(1);
declare variable LARGO NUMERIC(18,4);
declare variable ANCHO NUMERIC(18,4);
declare variable ALTO NUMERIC(18,4);
declare variable LISTA CHAR(3);
BEGIN
  PESOTOT = 0;
  VOLUMTOT = 0;
  SELECT PREF_PRE, SALI_NUMERO, SALI_FECHA, SALI_CONC, SALI_REFER, S.BODE_COD, BODE_NOM, SALI_NOMTERC, SALI_IMPTOS, SALI_OBS
    FROM SALIDAS S, BODEGA B WHERE S.BODE_COD = B.BODE_COD AND S.SALI_ID = :ID into
    :PREF, :NUMERO, :FECHA, :CONCEPTO, :REFER, :CODBODEGA, :NOMBODEGA, :NOMTERCERO, :IMPTOS, :OBS;
  SELECT SUM(SADE_TOTAL), SUM(SADE_IVAMONTO), SUM(SADE_CONSUMO*SADE_CANT*SADE_FACTOR) FROM SALIDAS_DETALLE
    WHERE SALI_ID = :ID INTO :TOTALDOC, :IVAMONTO, :CONSUMODOC;
  TOTALMASIMP = TOTALDOC + CONSUMODOC;
  if (IMPTOS = 'N') then
    TOTALDOC = TOTALDOC - IVAMONTO;
  FOR SELECT SADE_ITEM, A.ARTI_COD, SADE_CODBAR, SADE_DESC, SADE_CANT, SADE_UNIDAD, BODE_COD, SADE_COSTO, SADE_IVAPORC, SADE_IVAMONTO, SADE_CONSUMO, SADE_TOTAL, SADE_LOTE,
    (ARTI_PESO / 1000 * SADE_CANT * SADE_FACTOR), (ARTI_LARGO / 100 * SADE_FACTOR), (ARTI_ANCHO / 100 * SADE_FACTOR), (ARTI_ALTO / 100 * SADE_FACTOR)
    FROM SALIDAS_DETALLE D, ARTICULO A
    WHERE D.ARTI_COD = A.ARTI_COD AND D.SALI_ID = :ID
    ORDER BY SADE_ITEM
    INTO :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :BODITEM, :COSTO, :IVAPORC, :IVAMONTO, :CONSUMO, :TOTAL, :LOTE, :PESOUNIT, :LARGO, :ANCHO, :ALTO
    DO
      BEGIN
      EXECUTE PROCEDURE LEE_CONFIGURACION('INVENTARIO','DOCUMENTOS','CODIGO DE LISTA DE PRECIOS A IMPRIMIR EN DOCUMENTOS') returning_values (:LISTA);
      if (NOT lista IS NULL) then
          SELECT PRAR_FIJO FROM PRECIOS_ARTICULO WHERE ARTI_COD = :articulo AND LIPR_COD = :LISTA INTO :PRECIO;
      EXECUTE PROCEDURE ultimo_costo(:articulo, :fecha,  :unidad) returning_values (:ultimo);
      TOTALULT = CANT * ULTIMO;
      TOTALITEM = COSTO + IVAMONTO + CONSUMO;
      if (IMPTOS = 'N') then
        TOTAL = TOTAL - IVAMONTO;
      if (PESOUNIT IS NULL) then
        PESOUNIT = 0;
      PESOTOT = PESOTOT + PESOUNIT;
      VOLUMUNIT = ANCHO * ALTO * LARGO;
      volumunit = VOLUMUNIT * CANT;
      if (VOLUMUNIT IS NULL) then
        VOLUMUNIT = 0;
      VOLUMTOT = VOLUMTOT + VOLUMUNIT;
      SELECT STAND_COD FROM STANDS WHERE ARTI_COD = :ARTICULO AND STAND_BODEGA = :boditem INTO :stand;
      SUSPEND;
      END
END
^

SET TERM ; ^

SET TERM ^ ;

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

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure IMPR_AJUSTE (
    ID integer)
returns (
    PREF varchar(4),
    NUMERO varchar(6),
    FECHA date,
    CONCEPTO varchar(60),
    CODBODEGA varchar(2),
    NOMBODEGA varchar(30),
    OBS blob sub_type 1 segment size 80,
    AJUSTAR char(2),
    STAND VARCHAR(20),
    ITEM integer,
    ARTICULO varchar(15),
    CODBAR varchar(15),
    ARTIDES varchar(60),
    EXANT numeric(18,4),
    EXNUE numeric(18,4),
    CANT numeric(18,4),
    UNIDAD varchar(8),
    BODITEM varchar(2),
    LOTE varchar(15),
    COSTO numeric(18,2),
    TOTAL numeric(18,2))
AS
BEGIN
  /*  */
  SELECT PREF_PRE, AJUS_NUMERO, AJUS_FECHA, AJUS_CONC, A.BODE_COD, BODE_NOM, AJUS_OBS, AJUS_NOAJUSTAR, AJUS_STAND
    FROM AJUSTES A, BODEGA B WHERE A.BODE_COD = B.BODE_COD AND A.AJUS_ID = :ID into
    :PREF, :NUMERO, :FECHA, :CONCEPTO, :CODBODEGA, :NOMBODEGA, :OBS, :AJUSTAR, :STAND;
  if (AJUSTAR = 'S') then
    AJUSTAR = 'NO';
  else
    AJUSTAR = 'SI';
  FOR SELECT AJUS_ITEM, A.ARTI_COD, AJUS_CODBAR, AJDE_DESC, AJUS_EXANT, AJUS_UNIDAD, BODE_COD, AJUS_EXNUE, AJUS_LOTE
    FROM AJUSTES_DETALLE D, ARTICULO A
    WHERE D.ARTI_COD = A.ARTI_COD AND D.AJUS_ID = :ID
    ORDER BY AJUS_ITEM
    INTO :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :EXANT, :UNIDAD, :BODITEM, :EXNUE, :LOTE
    DO
      BEGIN
      EXECUTE PROCEDURE COSTO_PROMEDIO(:ARTICULO, :FECHA) returning_values (:COSTO);
      CANT = EXNUE - EXANT;
      TOTAL = CANT * COSTO;
      SUSPEND;
      END
END
^

SET TERM ; ^

/* 20090701b : CONCILIA DEV.VENTAS SEGUN DEFINICION DE INTERFAZ */
SET TERM ^ ;

CREATE OR ALTER PROCEDURE CONCILIA_DEVVENTAS(
    FECINI DATE,
    FECFIN DATE,
    SOLODIF CHAR(1),
    NULO1 CHAR(1),
    NULO2 CHAR(2))
RETURNS (
    IDF INTEGER,
    IDC INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    COMPROBA VARCHAR(3),
    NUMCNT VARCHAR(6),
    CTAVENTAS VARCHAR(20),
    MONTO NUMERIC(18,2),
    MONTOC NUMERIC(18,2))
AS
declare variable dig integer;
declare variable mercancia numeric(18,2);
declare variable factor double precision;
declare variable vrdto numeric(18,2);
declare variable vradic numeric(18,2);
declare variable vrsubt numeric(18,2);
declare variable vriva numeric(18,2);
declare variable vrtotal numeric(18,2);
declare variable vrextra numeric(18,2);
declare variable ventas char(1);
declare variable ctadto varchar(20);
begin
SELECT CAST(CONF_VALOR AS INTEGER) FROM CONFIGURACION WHERE CONF_MODULO = 'FACTURACION' AND
    CONF_CATEGORIA = 'GENERAL' AND CONF_PROPIEDAD = 'REDONDEO AL MULTIPLO DE DIEZ EN TOTALES' INTO :DIG;

for select devt_id, pref_pre, devt_numero, devt_fecha, DEVT_DTOMONTO, DEVT_ADICIONAL, DEVT_IVAMONTO, DEVT_EXTRA, DEVT_TOTAL
    from devoluciones_ventas f
    where devt_fecha >= :fecini and devt_fecha <= :fecfin and devt_anulado = 'N'
    into :idf, :pref, :numero, :fecha, :VRDTO, :VRADIC, :VRIVA, :VREXTRA, :VRTOTAL
    do
    begin
    idc = 0;
    montoc = 0;
    numcnt = '';
    select enco_consec, TICO_COD, ENCO_NUMERO
    from comprobante_encabezado where enco_idref = :idf and enco_tiporef = 33
    into :idc, :comproba, :numcnt;

    SELECT SUM (DVDE_CONSUMO) FROM devoluciones_ventas_detalle WHERE DEVT_ID = :idf INTO MERCANCIA;
    VRSUBT = VRTOTAL - VREXTRA - VRIVA - MERCANCIA; /* BASE DE RETEFTE Y RETEICA */
    MERCANCIA = VRSUBT - VRADIC + VRDTO;
    if (MERCANCIA <> 0) then
        FACTOR = CAST(VRSUBT AS DOUBLE PRECISION) / CAST(MERCANCIA AS DOUBLE PRECISION);
    ELSE
        FACTOR = 1;
    SELECT MAX(INVE_VENTAS), MAX(INVE_CTAVENTAS), MAX(INVE_CTADTO) FROM INTERFAZ_VENTAS WHERE TIDO_COD = 31 AND PREF_PRE = :pref
        INTO :VENTAS, :CTAVENTAS, :CTADTO;
    if (VENTAS = 'A') then
        BEGIN
        FOR SELECT MAX(COAR_CTADEV), SUM(DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO)
            FROM ARTICULO A, CONTABIL_ARTICULO C, devoluciones_ventas_detalle F
            WHERE F.DEVT_ID = :idf AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
            GROUP BY COAR_CTADEV
            INTO :CTAVENTAS, :MONTO
            DO
            BEGIN
            if ((CTADTO IS NULL) OR (CTADTO = '')) then
                MONTO = MONTO * FACTOR;
            execute procedure redondee(MONTO, DIG) returning_values (MONTO);
            select SUM(code_debito - code_credito) from comprobante_detalle
                where enco_consec = :idc and cuen_cod = :ctaventas into MONTOC;
            if (montoc is null) then
                montoc = 0;
            if ((SOLODIF = 'N') or (MONTO <> MONTOC)) then
                SUSPEND;
            END
        END
    if (VENTAS = 'K') then
        BEGIN
        SELECT SUM(DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO)
            FROM devoluciones_ventas_detalle F
            WHERE F.devt_id = :idf AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
            INTO :MONTO;
        if ((CTADTO IS NULL) OR (CTADTO = '')) then
            MONTO = MONTO * FACTOR;
        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
        select SUM(code_debito-code_credito) from comprobante_detalle
            where enco_consec = :idc and cuen_cod = :ctaventas into MONTOC;
        if (montoc is null) then
            montoc = 0;
        if ((SOLODIF = 'N') or (MONTO <> MONTOC)) then
            SUSPEND;
        END
    end
end
^

SET TERM ; ^



/* 20090702 *//* se habia perdido el inicializar el codigo de barras */
SET TERM ^ ;

CREATE OR ALTER procedure CONSULTA_ARTICULOS_VTAS (
    FECHA date,
    INACTIVOS char(1),
    MODULO varchar(20),
    BUSCAR varchar(100),
    CUALQUIERA char(1),
    COLUMNA integer,
    BUSCAR2 varchar(30),
    BUSCAR3 varchar(30),
    BUSCAR4 varchar(30),
    BUSCAR5 varchar(30))
returns (
    CODIGO varchar(20),
    DES varchar(60),
    REF varchar(20),
    GRUPO varchar(30),
    MARCA varchar(30),
    UNIDAD varchar(8),
    ESTADO varchar(30),
    IVA numeric(9,2),
    EXISTEN numeric(18,2),
    PRECIO numeric(18,2),
    CLASE char(1))
AS
DECLARE VARIABLE LISTA INTEGER;
DECLARE VARIABLE EXIST CHAR(2);
DECLARE VARIABLE SINEXIST CHAR(2);
declare variable DIG INTEGER;
declare variable OK CHAR(1);
BEGIN
EXISTEN = 0;
EXECUTE PROCEDURE lee_configuracion ('FACTURACION','ARTICULOS', 'VER EXISTENCIA EN CONSULTA ARTICULOS') returning_values (:EXIST);
EXECUTE PROCEDURE lee_configuracion ('FACTURACION','FACTURAS', 'CODIGO DE LA LISTA DE PRECIOS A MOSTRAR EN ARTICULOS') returning_values (:LISTA);
if (modulo = 'FACTURACION') then
  EXECUTE PROCEDURE lee_configuracion ('FACTURACION','ARTICULOS','VER ARTICULOS SIN EXISTENCIA EN CONSULTA DE ARTICULOS') returning_values (:sinexist);
else
  sinexist = 'SI';
EXECUTE PROCEDURE LEE_CONFIGURACION ('FACTURACION', 'ARTICULOS', 'REDONDEO AL MULTIPLO DE DIEZ EN PRECIOS') returning_values (DIG);
if (LISTA > 0) then
    BEGIN
    if ((BUSCAR IS NOT NULL) AND (BUSCAR <> '')) then
        FOR select a.arti_cod, arti_des, grup_cod, arti_unidad, esar_cod, taiv_porc, marc_cod,arti_clase
            from articulo a, tarifa_iva t
            where a.taiv_cod = t.taiv_cod and substring(a.arti_cod from 1 FOR 2) <> '.t' and
            ((:INACTIVOS = 'S') or (esar_cod = 'A') or ((:INACTIVOS = 'C') AND (esar_cod = 'N'))) AND
            ((:COLUMNA <> 0) or (upper(A.ARTI_COD) like upper(:buscar))) AND
            ((:columna <> 1) or (upper(A.ARTI_DES) like upper(:buscar))) AND
            ((:columna <> 2) or (upper(A.ARTI_OBS) like upper(:buscar)) or (upper(A.ARTI_DES) like upper(:buscar)))
            INTO :CODIGO, :DES, :GRUPO, :UNIDAD, :ESTADO, :IVA, :MARCA, :CLASE
            do
            begin
            ref = '';
            select first 1 coba_cod from barras_articulo where arti_cod = :codigo into :ref;
            if ((COLUMNA <> 3) or (upper(REF) like upper(:buscar))) then
                BEGIN
                OK = 'N';
                PRECIO = 0;
                SELECT prar_fijo PRECIO FROM precios_articulo WHERE arti_cod = :CODIGO and lipr_cod = :LISTA INTO :PRECIO;
                EXECUTE PROCEDURE redondee(PRECIO, DIG) returning_values (PRECIO);
                if (EXIST = 'SI') then
                    BEGIN
                    existen = 0;
                    SELECT FIRST 1 COST_SALDOC+COST_ENTC-COST_SALC
                        FROM COSTOS WHERE ARTI_COD = :codigo AND COST_FECHA <= :FECHA
                        ORDER BY COST_FECHA DESC,COST_ITEM DESC
                        INTO :existen;
                    if (existen is null) then
                        existen = 0;
/*                    EXECUTE PROCEDURE saldo_total_inventario (:CODIGO, :FECHA) returning_values (:EXISTEN);*/
                    if ((SINEXIST = 'SI')  or (existen <> 0)) then
                        OK = 'S';
                    END
                ELSE
                    OK = 'S';
                if (ok = 'S') then
                    if (CUALQUIERA = 'S') then
                        SUSPEND;
                    ELSE
                        if (BUSCAR2 <> '') then
                            BEGIN
                            IF (NOT EXISTS (SELECT ARTI_COD FROM ARTICULO WHERE ARTI_COD = :CODIGO AND ((upper(ARTI_DES) like upper(:BUSCAR2)) or (UPPER(ARTI_OBS) LIKE UPPER(:BUSCAR2))))) THEN
                                OK = 'N';
                            if ((OK = 'S') AND (BUSCAR3 <> '')) then
                                IF (NOT EXISTS (SELECT ARTI_COD FROM ARTICULO WHERE ARTI_COD = :CODIGO AND ((upper(ARTI_DES) like upper(:BUSCAR3)) or (UPPER(ARTI_OBS) LIKE UPPER(:BUSCAR3))))) THEN
                                    OK = 'N';
                            if ((OK = 'S') AND (BUSCAR4 <> '')) then
                                IF (NOT EXISTS (SELECT ARTI_COD FROM ARTICULO WHERE ARTI_COD = :CODIGO AND ((upper(ARTI_DES) like upper(:BUSCAR4)) or (UPPER(ARTI_OBS) LIKE UPPER(:BUSCAR4))))) THEN
                                    OK = 'N';
                            if ((OK = 'S') AND (BUSCAR4 <> '')) then
                                IF (NOT EXISTS (SELECT ARTI_COD FROM ARTICULO WHERE ARTI_COD = :CODIGO AND ((upper(ARTI_DES) like upper(:BUSCAR4)) or (UPPER(ARTI_OBS) LIKE UPPER(:BUSCAR4))))) THEN
                                    OK = 'N';
                            if ((OK = 'S') AND (BUSCAR5 <> '')) then
                                IF (NOT EXISTS (SELECT ARTI_COD FROM ARTICULO WHERE ARTI_COD = :CODIGO AND ((upper(ARTI_DES) like upper(:BUSCAR5)) or (UPPER(ARTI_OBS) LIKE UPPER(:BUSCAR5))))) THEN
                                    OK = 'N';
                            if (OK = 'S') then
                                SUSPEND;
                            END
                        ELSE
                            SUSPEND;
                END
            end
    ELSE
        FOR select a.arti_cod, arti_des, grup_cod, arti_unidad, esar_cod, taiv_porc, marc_cod,arti_clase
            from articulo a, tarifa_iva t
            where a.taiv_cod = t.taiv_cod and substring(a.arti_cod from 1 FOR 2) <> '.t' and
            ((:INACTIVOS = 'S') or (esar_cod = 'A') or ((:INACTIVOS = 'C') AND (esar_cod = 'N')))
            INTO :CODIGO, :DES, :GRUPO, :UNIDAD, :ESTADO, :IVA, :MARCA, :CLASE
            do
            begin
            ref = '';
            select first 1 coba_cod from barras_articulo where arti_cod = :codigo into :ref;
            PRECIO = 0;
            SELECT prar_fijo PRECIO FROM precios_articulo WHERE arti_cod = :CODIGO and lipr_cod = :LISTA INTO :PRECIO;
            EXECUTE PROCEDURE redondee(PRECIO, DIG) returning_values (PRECIO);
            if (EXIST = 'SI') then
                BEGIN
                existen = 0;
                SELECT FIRST 1 COST_SALDOC+COST_ENTC-COST_SALC
                    FROM COSTOS WHERE ARTI_COD = :codigo AND COST_FECHA <= :FECHA
                    ORDER BY COST_FECHA DESC,COST_ITEM DESC
                    INTO :existen;
                if (existen is null) then
                    existen = 0;
/*                EXECUTE PROCEDURE saldo_total_inventario (:CODIGO, :FECHA) returning_values (:EXISTEN);*/
                if ((SINEXIST = 'SI')  or (existen <> 0)) then
                    SUSPEND;
                END
            ELSE
                SUSPEND;
            END
    END
ELSE
    if ((BUSCAR IS NOT NULL) AND (BUSCAR <> '')) then
        FOR select arti_cod, arti_des, grup_cod, arti_unidad, esar_cod, taiv_porc, arti_precio, marc_cod, arti_clase
            from articulo a, tarifa_iva t
            where a.taiv_cod = t.taiv_cod and substring(a.arti_cod from 1 FOR 2) <> '.t' and
            ((:INACTIVOS = 'S') or (esar_cod = 'A') or ((:INACTIVOS = 'C') AND (esar_cod = 'N'))) AND
            ((:COLUMNA <> 0) or (upper(A.ARTI_COD) like upper(:buscar))) AND
            ((:columna <> 1) or (upper(A.ARTI_DES) like upper(:buscar))) AND
            ((:columna <> 2) or (upper(A.ARTI_OBS) like upper(:buscar)) or (upper(A.ARTI_DES) like upper(:buscar)))
            INTO :CODIGO, :DES, :GRUPO, :UNIDAD, :ESTADO, :IVA, :PRECIO, :MARCA, :CLASE
            do
            begin
            ref = '';
            select first 1 coba_cod from barras_articulo where arti_cod = :codigo into :ref;
            if ((COLUMNA <> 3) or (upper(REF) like upper(:buscar))) then
                BEGIN
                if (EXIST = 'SI') then
                    BEGIN
                    existen = 0;
                    SELECT FIRST 1 COST_SALDOC+COST_ENTC-COST_SALC
                        FROM COSTOS WHERE ARTI_COD = :codigo AND COST_FECHA <= :FECHA
                        ORDER BY COST_FECHA DESC,COST_ITEM DESC
                        INTO :existen;
                    if (existen is null) then
                        existen = 0;
/*                    EXECUTE PROCEDURE saldo_total_inventario (:CODIGO, :FECHA) returning_values (:EXISTEN);*/
                    if ((SINEXIST = 'SI') or (existen <> 0)) then
                        OK = 'S';
                    END
                ELSE
                    OK = 'S';
                if (ok = 'S') then
                    if (CUALQUIERA = 'S') then
                        SUSPEND;
                    ELSE
                        if (BUSCAR2 <> '') then
                            BEGIN
                            IF (NOT EXISTS (SELECT ARTI_COD FROM ARTICULO WHERE ARTI_COD = :CODIGO AND ((upper(ARTI_DES) like upper(:BUSCAR2)) or (UPPER(ARTI_OBS) LIKE UPPER(:BUSCAR2))))) THEN
                                OK = 'N';
                            if ((OK = 'S') AND (BUSCAR3 <> '')) then
                                IF (NOT EXISTS (SELECT ARTI_COD FROM ARTICULO WHERE ARTI_COD = :CODIGO AND ((upper(ARTI_DES) like upper(:BUSCAR3)) or (UPPER(ARTI_OBS) LIKE UPPER(:BUSCAR3))))) THEN
                                    OK = 'N';
                            if ((OK = 'S') AND (BUSCAR4 <> '')) then
                                IF (NOT EXISTS (SELECT ARTI_COD FROM ARTICULO WHERE ARTI_COD = :CODIGO AND ((upper(ARTI_DES) like upper(:BUSCAR4)) or (UPPER(ARTI_OBS) LIKE UPPER(:BUSCAR4))))) THEN
                                    OK = 'N';
                            if ((OK = 'S') AND (BUSCAR4 <> '')) then
                                IF (NOT EXISTS (SELECT ARTI_COD FROM ARTICULO WHERE ARTI_COD = :CODIGO AND ((upper(ARTI_DES) like upper(:BUSCAR4)) or (UPPER(ARTI_OBS) LIKE UPPER(:BUSCAR4))))) THEN
                                    OK = 'N';
                            if ((OK = 'S') AND (BUSCAR5 <> '')) then
                                IF (NOT EXISTS (SELECT ARTI_COD FROM ARTICULO WHERE ARTI_COD = :CODIGO AND ((upper(ARTI_DES) like upper(:BUSCAR5)) or (UPPER(ARTI_OBS) LIKE UPPER(:BUSCAR5))))) THEN
                                    OK = 'N';
                            if (OK = 'S') then
                                SUSPEND;
                            END
                        ELSE
                            SUSPEND;
                END
            end
    ELSE
        FOR select arti_cod, arti_des, grup_cod, arti_unidad, esar_cod, taiv_porc, arti_precio, marc_cod, arti_clase
            from articulo a, tarifa_iva t
            where a.taiv_cod = t.taiv_cod and substring(a.arti_cod from 1 FOR 2) <> '.t' and
            ((:INACTIVOS = 'S') or (esar_cod = 'A') or ((:INACTIVOS = 'C') AND (esar_cod = 'N')))
            INTO :CODIGO, :DES, :GRUPO, :UNIDAD, :ESTADO, :IVA, :PRECIO, :MARCA, :CLASE
            do
            begin
            ref = '';
            select first 1 coba_cod from barras_articulo where arti_cod = :codigo into :ref;
            if (EXIST = 'SI') then
                BEGIN
                existen = 0;
                SELECT FIRST 1 COST_SALDOC+COST_ENTC-COST_SALC
                    FROM COSTOS WHERE ARTI_COD = :codigo AND COST_FECHA <= :FECHA
                    ORDER BY COST_FECHA DESC,COST_ITEM DESC
                    INTO :existen;
                if (existen is null) then
                    existen = 0;
/*                EXECUTE PROCEDURE saldo_total_inventario (:CODIGO, :FECHA) returning_values (:EXISTEN);*/
                if ((SINEXIST = 'SI') or (existen <> 0)) then
                    SUSPEND;
                END
            ELSE
                SUSPEND;
            end
END
^

SET TERM ; ^



/* 20090702b *//* DESCUENTE ING.TERCEROS DEL SUBTOTAL */
SET TERM ^ ;

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

/* ACUMULE LOS PUNTOS, SE HACE ACA POR SER POSTERIOR AL DETALLE */
if (ANULADO = 'N') then
    EXECUTE PROCEDURE acumula_puntos_cliente (31, :id, :nit, :fecha) returning_values (:PUNTOS);
EXECUTE PROCEDURE consulta_puntos_cliente (:id, :nit, :fecha) returning_values (:puntos, :puntosacum, :puntosvenc, :fecptos);
if (DTOIT1M IS NULL) then
    DTOIT1M = 0;
if (DTOIT2M IS NULL) then
    DTOIT2M = 0;
if (DTOIT3M IS NULL) then
    DTOIT3M = 0;
SELECT CLIE_COD, C.ZONA_COD, ZONA_NOM
    FROM CLIENTES C, ZONAS Z
    WHERE TERC_NIT = :NIT AND C.ZONA_COD = Z.ZONA_COD
    INTO :CODIGOCL, :ZONACOD, :ZONANOM;
SELECT CLSU_DIR, CLSU_CIUDAD, CLSU_TEL FROM CLIENTE_SUCURSALES WHERE TERC_NIT = :NIT AND CLCU_COD = :SUCUR
    INTO :DIRECCION, :CIUDAD, :TELEFONO;
DIASVENCE = VENCE - FECHA;
if (DIASVENCE > 0) then
    CONTCRED = 'CREDITO ' || CAST(DIASVENCE AS VARCHAR(3)) || ' DIAS';
ELSE
    CONTCRED = 'CONTADO';
SUBTOTAL = TOTALFAC - EXTRA - IVAMONTO - ADICIONAL + DTOMONTO;
if (DTOITE3 = 'SI') then
    BEGIN
    SELECT SUM(FADE_DTOMONTO) FROM FACTURAS_DETALLE WHERE FACT_ID = :id INTO :sumdtoit;
    SUBTOTAL = SUBTOTAL + sumdtoit + dtoit1m + dtoit2m + dtoit3m;
    END
if (INGTER <> '') then
    BEGIN
    SELECT SUM(FADE_TOTAL) FROM FACTURAS_DETALLE D, ARTICULO A WHERE A.arti_cod = D.arti_cod AND FACT_ID = :id AND GRUP_COD = :ingter
        INTO :ingterceros;
    SUBTOTAL = SUBTOTAL - INGTERCEROS;
    END
EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'FECHA AUTORETENEDOR NO DESCONTAR RETENCIONES DEL SALDO PERO SI CONTABILIZARLAS') returning_values (AUTORET);
if (AUTORET <> '') then
    FAUTORET = CAST(AUTORET AS DATE);
else
    FAUTORET = '9999/12/31';
if (FECHA > fautoret) then
    TOTALPAGAR = TOTALFAC - RTEIVAMONTO - RTEICAMONTO - ANTICIPO;
ELSE
    TOTALPAGAR = TOTALFAC - RTEFTEMONTO - RTEIVAMONTO - RTEICAMONTO - ANTICIPO;
if (RECIBIDO <> 0) then
    CAMBIO = RECIBIDO - totalpagar;
ELSE
    CAMBIO = 0;
SUMAEX = 0;
SUMA1 = 0;
SUMA2 = 0;
SUMA3 = 0;
IVA1 = 0;
IVA2 = 0;
IVA3 = 0;
TOTCONSUMO = 0;
MONTOPAGO1 = 0;
SELECT MAX(AUDI_HORA) FROM AUDITORIA WHERE TIDO_COD = 31 AND AUDI_IDDOC = :ID AND AUDI_OPER = 'I' INTO :HORA;
/* AHORA LAS FORMAS DE PAGO, BUSQUE EL ABONO DE HOY A LA FACTURA */
ITEMFP = 1;
MONTOPAGO1 = 0;
MONTOPAGO2 = 0;
MONTOPAGO3 = 0;
FOR SELECT FOPA_NOM, RCPA_MONTO FROM RECIBOS_CAJA_PAGO P, FORMAS_PAGO F, RECIBOS_CAJA R, RECIBOS_CAJA_DETALLE D
    WHERE R.RECA_ID = P.RECA_ID AND R.RECA_ID = D.RECA_ID AND P.FOPA_ID = F.FOPA_ID AND RECA_FECHA = :FECHA AND RCDE_TIPODOC = 31 AND RCDE_IDDOC = :ID
    INTO :formap, :MONTOP
    DO
    BEGIN
    if (ITEMFP = 1) then
        BEGIN
        FORMAPAGO1 = FORMAP;
        MONTOPAGO1 = MONTOP;
        END
    if (ITEMFP = 2) then
        BEGIN
        FORMAPAGO2 = FORMAP;
        MONTOPAGO2 = MONTOP;
        END
    if (ITEMFP = 3) then
        BEGIN
        FORMAPAGO3 = FORMAP;
        MONTOPAGO3 = MONTOP;
        END
    ITEMFP = ITEMFP + 1;
    END
EXECUTE PROCEDURE lee_configuracion ('FACTURACION','DOCUMENTOS','ORDENAR ITEMS POR CODIGO DE ARTICULO') returning_values (:ORDENCOD);
EXECUTE PROCEDURE lee_configuracion ('FACTURACION','POS', 'IMPRIMIR DEVOLUCIONES DE ARTICULOS NEGATIVOS') returning_values (:imprdev);
totcajas = 0;
totbase = 0;
if (ORDENCOD = 'SI') then
    BEGIN
    FOR SELECT FADE_ITEM, D.ARTI_COD, FADE_CODBAR, SUBSTR(FADE_DESC,1,60), ARTI_DESCORTA, FADE_CANT, FADE_UNIDAD, FADE_FACTOR, BODE_COD, FADE_LOTE, LIPR_COD, FADE_PRUNIT, FADE_DTOPORC, FADE_DTOMONTO, FADE_IVAPORC, FADE_IVAMONTO, FADE_CONSUMO, FADE_TOTAL, FADE_REFERENCIA,
        GRUP_COD, SUBG_COD, MARC_COD, ARTI_PESO, ARTI_ANCHO, ARTI_ALTO, ARTI_LARGO, TAIV_COD, FADE_DEVUELTO, FADE_OBS, FADE_DTO1, FADE_DTO2, FADE_DTO3, FADE_DTOM1, FADE_DTOM2, FADE_DTOM3, FADE_CAJAS, FADE_BASE, FADE_PORCBASE
        FROM FACTURAS_DETALLE D, ARTICULO A
        WHERE D.ARTI_COD = A.ARTI_COD AND D.FACT_ID = :ID
        ORDER BY D.ARTI_COD
        INTO :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :DESCORTA, :CANT, :UNIDAD, :FACTOR, :BODITEM, :LOTE, :LISTAPR, :PRUNIT, :DTOITPORC, :DTOITMONTO, :IVAPORC, :IVAITMONTO, :CONSUMO, :TOTAL, :refitem,
        :GRUPO, :SUBGRUPO, :MARCA, :PESO, :ANCHO, :ALTO, :LARGO, :TARIFA, :devuelto, :obsitem, :dtoit1, :dtoit2, :dtoit3, :dtoitm1, :dtoitm2, :dtoitm3, :cajas, :base, :porcbase
        DO
          BEGIN
          if (ARTICULO = CODBAR) then
            SELECT FIRST 1 COBA_COD FROM barras_articulo WHERE ARTI_COD = :articulo INTO :CODBAR;
          if (IMPRDEV <> 'SI') then
            BEGIN
            if ((CANT >= 0) AND (DEVUELTO = 0)) then
                IMPR = 'S';
            ELSE
                IMPR = 'N'; /* ES DEVOLUCION */
            END
          ELSE
            IMPR = 'S';
          if (IMPR = 'S') then
            BEGIN
            prneto = PRUNIT - DTOITMONTO - dtoitm1 - dtoitm2 - dtoitm3;
            if (IMPTOS = 'S') then
                if (cant <> 0) then
                    prnetosiniva = PRUNIT - DTOITMONTO - ((IVAITMONTO+CONSUMO) / CANT) - dtoitm1 - dtoitm2 - dtoitm3;
                else
                    prnetosiniva = PRUNIT - DTOITMONTO - dtoitm1 - dtoitm2 - dtoitm3;
            ELSE
                prnetosiniva = PRUNIT - DTOITMONTO - dtoit1m - dtoit2m - dtoit3m;
            if (ICOINC = 'SI') then
                SUBTOTIT = TOTAL - IVAITMONTO;
            else
                SUBTOTIT = TOTAL - IVAITMONTO - CONSUMO;
            TOTCONSUMO = TOTCONSUMO + CONSUMO;
            TOTBASE = TOTBASE + BASE;
            SELECT LOTE_VENCE FROM LOTES WHERE LOTE_NRO = :lote AND ARTI_COD = :ARTICULO AND BODE_COD = :boditem INTO :vlote;
            if ((REFITEM <> '.t') or (REFITEM IS NULL)) then
                BEGIN
                /* NO SUME LOS ENSAMBLES */
                if (IVAPORC = 0) then
                    SUMAEX = SUMAEX + TOTAL;
                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;
                END
            if (ANCHO IS NULL) then
                ANCHO = 0;
            if (ALTO IS NULL) then
                ALTO = 0;
            if (LARGO IS NULL) then
                LARGO = 0;
            if (PESO IS NULL) then
                PESO = 0;
            PESO = (PESO / 1000) * CANT * FACTOR;
            totcajas = totcajas + cajas;
            if (substr(ARTICULO,1,2) = '.t') then
                BEGIN
                REFITEM = '';
                TOTAL = 0;
                SUBTOTIT = 0;
                END
            SELECT STAND_COD FROM STANDS WHERE ARTI_COD = :ARTICULO AND STAND_BODEGA = :boditem INTO :stand;
            factcant = NULL;
            SELECT FIRST 1 UNAR_FACCAN FROM unidad_articulo WHERE ARTI_COD = :articulo INTO :factcant;
            if (factcant IS NULL) then
                BEGIN
                ALTERNATIVAS = 0;
                PRINCIPALES = (CANT * FACTOR);
                END
            ELSE
                BEGIN
                ALTERNATIVAS = FLOOR(CANT * factor / factcant);
                PRINCIPALES = (CANT * FACTOR) - (alternativas * factcant);
                END
            SUSPEND;
            END
          END
    END
ELSE
    BEGIN
    FOR SELECT FADE_ITEM, D.ARTI_COD, FADE_CODBAR, SUBSTR(FADE_DESC,1,60), ARTI_DESCORTA, FADE_CANT, FADE_UNIDAD, FADE_FACTOR, BODE_COD, FADE_LOTE, LIPR_COD, FADE_PRUNIT, FADE_DTOPORC, FADE_DTOMONTO, FADE_IVAPORC, FADE_IVAMONTO, FADE_CONSUMO, FADE_TOTAL, FADE_REFERENCIA,
        GRUP_COD, SUBG_COD, MARC_COD, ARTI_PESO, ARTI_ANCHO, ARTI_ALTO, ARTI_LARGO, TAIV_COD, FADE_DEVUELTO, FADE_OBS, FADE_DTO1, FADE_DTO2, FADE_DTO3, FADE_DTOM1, FADE_DTOM2, FADE_DTOM3, FADE_CAJAS, FADE_BASE, FADE_PORCBASE
        FROM FACTURAS_DETALLE D, ARTICULO A
        WHERE D.ARTI_COD = A.ARTI_COD AND D.FACT_ID = :ID
        ORDER BY FADE_ITEM
        INTO :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :DESCORTA, :CANT, :UNIDAD, :FACTOR, :BODITEM, :LOTE, :LISTAPR, :PRUNIT, :DTOITPORC, :DTOITMONTO, :IVAPORC, :IVAITMONTO, :CONSUMO, :TOTAL, :refitem,
        :GRUPO, :SUBGRUPO, :MARCA, :PESO, :ANCHO, :ALTO, :LARGO, :TARIFA, :devuelto, :obsitem, :dtoit1, :dtoit2, :dtoit3, :dtoitm1, :dtoitm2, :dtoitm3, :cajas, :base, :porcbase
        DO
          BEGIN
          if (IMPRDEV <> 'SI') then
            BEGIN
            if ((CANT >= 0) AND (DEVUELTO = 0)) then
                IMPR = 'S';
            ELSE
                IMPR = 'N'; /* ES DEVOLUCION */
            END
          ELSE
            IMPR = 'S';
          if (IMPR = 'S') then
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :GRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :MARCA INTO NOMMARCA;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :SUBGRUPO AND GRUP_COD = :GRUPO INTO :NOMSUBG;
            prneto = PRUNIT - DTOITMONTO - dtoitm1 - dtoitm2 - dtoitm3;
            if (IMPTOS = 'S') then
                if (cant <> 0) then
                    prnetosiniva = PRUNIT - DTOITMONTO - ((IVAITMONTO+CONSUMO) / CANT) - dtoit1m - dtoit2m - dtoit3m;
                else
                    prnetosiniva = PRUNIT - DTOITMONTO - dtoitm1 - dtoitm2 - dtoitm3;
            ELSE
                prnetosiniva = PRUNIT - DTOITMONTO - dtoitm1 - dtoitm2 - dtoitm3;
            if (ICOINC = 'SI') then
                SUBTOTIT = TOTAL - IVAITMONTO;
            else
                SUBTOTIT = TOTAL - IVAITMONTO - CONSUMO;
            TOTCONSUMO = TOTCONSUMO + CONSUMO;
            TOTBASE = TOTBASE + BASE;
            SELECT LOTE_VENCE FROM LOTES WHERE LOTE_NRO = :lote AND ARTI_COD = :ARTICULO AND BODE_COD = :boditem INTO :vlote;
            if ((REFITEM <> '.t') or (REFITEM IS NULL)) then
                BEGIN
                /* NO SUME LOS ENSAMBLES */
                if (IVAPORC = 0) then
                    SUMAEX = SUMAEX + TOTAL;
                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;
                END
            if (ANCHO IS NULL) then
                ANCHO = 0;
            if (ALTO IS NULL) then
                ALTO = 0;
            if (LARGO IS NULL) then
                LARGO = 0;
            if (PESO IS NULL) then
                PESO = 0;
            PESO = (PESO / 1000)* CANT * FACTOR;
            totcajas = totcajas + cajas;
            if (substr(ARTICULO,1,2) = '.t') then
                BEGIN
                REFITEM = '';
                TOTAL = 0;
                SUBTOTIT = 0;
                END
            SELECT STAND_COD FROM STANDS WHERE ARTI_COD = :ARTICULO AND STAND_BODEGA = :boditem INTO :stand;
            factcant = NULL;
            SELECT FIRST 1 UNAR_FACCAN FROM unidad_articulo WHERE ARTI_COD = :articulo INTO :factcant;
            if (factcant IS NULL) then
                BEGIN
                ALTERNATIVAS = 0;
                PRINCIPALES = (CANT * FACTOR);
                END
            ELSE
                BEGIN
                ALTERNATIVAS = FLOOR(CANT * factor / factcant);
                PRINCIPALES = (CANT * FACTOR) - (alternativas * factcant);
                END
            SUSPEND;
            END
          END
    END
END
^

SET TERM ; ^



/* 20090702c */SET TERM ^ ;

ALTER PROCEDURE IMPUESTOS_VENTAS(
    FECINI DATE,
    FECFIN DATE,
    PREFIJO VARCHAR(4),
    PTOINI INTEGER,
    PTOFIN INTEGER,
    ANULADOS CHAR(1),
    SUBEMPRESA INTEGER)
RETURNS (
    TIPO INTEGER,
    NOMTIPO VARCHAR(30),
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    NIT VARCHAR(20),
    NOMTERCERO VARCHAR(60),
    SUBTOTAL NUMERIC(18,2),
    DTOMONTO NUMERIC(18,2),
    ADICIONAL NUMERIC(18,2),
    IVAMONTO NUMERIC(18,2),
    CONSUMO NUMERIC(18,2),
    EXENTOS NUMERIC(18,2),
    GRAVADOS1 NUMERIC(18,2),
    GRAVADOS2 NUMERIC(18,2),
    GRAVADOS3 NUMERIC(18,2),
    IVA1 NUMERIC(18,2),
    IVA2 NUMERIC(18,2),
    IVA3 NUMERIC(18,2),
    EXTRA NUMERIC(18,2),
    TOTAL NUMERIC(18,2),
    RTFTEMONTO NUMERIC(18,2),
    RTIVAMONTO NUMERIC(18,2),
    RTICAMONTO NUMERIC(18,2),
    NETO NUMERIC(18,2),
    ANULADO CHAR(1))
AS
declare variable ID INTEGER;
declare variable TER_exento CHAR(1);
declare variable NOTAS CHAR(2);
declare variable ajustar CHAR(1);
declare variable FACTOR NUMERIC(18,4);
declare variable NUEVO NUMERIC(18,2);
declare variable FACTENC NUMERIC(18,2);
BEGIN
/* FACTURA */
TIPO = 31;
SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 31 INTO :NOMTIPO;
ajustar = 'N';
FOR SELECT FACT_ID, F.PREF_PRE, FACT_NUMERO, FACT_FECHA, TERC_NIT, FACT_NOMCLIENTE, FACT_ADICIONAL-FACT_DTOMONTO, FACT_IVAMONTO, FACT_RTFTEMONTO, FACT_RTIVAMONTO, FACT_RTICAMONTO, FACT_EXTRA, FACT_TOTAL, FACT_ANULADO, fact_factor
    FROM FACTURAS F, PREFIJOS PR WHERE PTVT_ID >= :PTOINI AND PTVT_ID <= :PTOFIN AND
    FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND ((:PREFIJO = '') or (:PREFIJO IS NULL) or (F.PREF_PRE = :PREFIJO))
    AND PR.PREF_PRE = F.PREF_PRE AND PR.TIDO_COD = 31 AND ((PR.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
    ORDER BY FACT_FECHA, F.PREF_PRE, FACT_NUMERO
    INTO :ID, :PREF, :NUMERO, :FECHA, :NIT, :NOMTERCERO, :DTOMONTO, :IVAMONTO, :RTFTEMONTO, :RTIVAMONTO, :RTICAMONTO, :EXTRA, :TOTAL, :ANULADO, :FACTENC
    DO
    BEGIN
    SELECT TERC_EXENTO FROM TERCEROS WHERE TERC_NIT = :NIT INTO :TER_EXENTO;
    if ((ANULADOS = 'S') or (ANULADO = 'N')) then
        BEGIN
        if (ANULADO = 'S') then
            BEGIN
            EXENTOS = 0;
            GRAVADOS1 = 0;
            GRAVADOS2 = 0;
            GRAVADOS3 = 0;
            CONSUMO = 0;
            SUBTOTAL = 0;
            TOTAL = 0;
            EXTRA = 0;
            IVAMONTO = 0;
            DTOMONTO = 0;
            NETO = 0;
            RTFTEMONTO = 0;
            RTIVAMONTO = 0;
            RTICAMONTO = 0;
            END
        else
            BEGIN
            /* CALCULE LAS DIFERENTES TARIFAS */
            if (TER_EXENTO = 'S') then
                BEGIN
                SELECT SUM(FADE_TOTAL - FADE_IVAMONTO - FADE_CONSUMO) FROM FACTURAS_DETALLE D WHERE FACT_ID = :ID AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL)) INTO :EXENTOS;
                GRAVADOS1 = 0;
                GRAVADOS2 = 0;
                GRAVADOS3 = 0;
                end
            else
                begin
                SELECT SUM((FADE_TOTAL - FADE_IVAMONTO - FADE_CONSUMO)*:FACTENC) FROM FACTURAS_DETALLE D WHERE FACT_ID = :ID AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL)) AND FADE_IVAPORC = 0 INTO :EXENTOS;
                SELECT SUM((FADE_TOTAL - FADE_IVAMONTO - FADE_CONSUMO)*:FACTENC), SUM(FADE_IVAMONTO*:FACTENC) FROM FACTURAS_DETALLE D, TARIFA_IVA T WHERE FACT_ID = :ID AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL)) AND FADE_IVAPORC = TAIV_PORC AND TAIV_COD = 1 INTO :GRAVADOS1, :IVA1;
                SELECT SUM((FADE_TOTAL - FADE_IVAMONTO - FADE_CONSUMO)*:FACTENC), SUM(FADE_IVAMONTO*:FACTENC) FROM FACTURAS_DETALLE D, TARIFA_IVA T WHERE FACT_ID = :ID AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL)) AND FADE_IVAPORC = TAIV_PORC AND TAIV_COD = 2 INTO :GRAVADOS2, :IVA2;
                SELECT SUM((FADE_TOTAL - FADE_IVAMONTO - FADE_CONSUMO)*:FACTENC), SUM(FADE_IVAMONTO*:FACTENC) FROM FACTURAS_DETALLE D, TARIFA_IVA T WHERE FACT_ID = :ID AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL)) AND FADE_IVAPORC = TAIV_PORC AND TAIV_COD = 3 INTO :GRAVADOS3, :IVA3;
                end
            if (iva1 is null) then
                iva1 = 0;
            if (iva2 is null) then
                iva2 = 0;
            if (iva3 is null) then
                iva3 = 0;
            SELECT SUM(FADE_CONSUMO) FROM FACTURAS_DETALLE WHERE FACT_ID = :ID AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL)) INTO :CONSUMO;
            SUBTOTAL = TOTAL - EXTRA - IVAMONTO - DTOMONTO;
            NETO = TOTAL - RTFTEMONTO - RTIVAMONTO - RTICAMONTO;
            END
        if (exentos is null) then
            exentos = 0;
        if (gravados1 is null) then
            gravados1 = 0;
        if (gravados2 is null) then
            gravados2 = 0;
        if (gravados3 is null) then
            gravados3 = 0;
        if (consumo is null) then
            consumo = 0;
        FACTOR = 1;
        SELECT AJCI_FACTOR FROM ajuste_cierre WHERE AJCI_PORC = 0 AND AJCI_FECINI <= :FECHA AND AJCI_FECFIN >= :FECHA INTO :FACTOR;
        if (FACTOR IS null) then
            FACTOR = 1;
        if (factor <> 1) then
            ajustar = 'S';
        EXENTOS = EXENTOS * FACTOR;
        FACTOR = 1;
        SELECT AJCI_FACTOR FROM ajuste_cierre WHERE AJCI_PORC = 16 AND AJCI_FECINI <= :FECHA AND AJCI_FECFIN >= :FECHA INTO :FACTOR;
        if (FACTOR IS null) then
            FACTOR = 1;
        if (factor <> 1) then
            ajustar = 'S';
        gravados1 = GRAVADOS1 * FACTOR;
        IVA1 = IVA1 * FACTOR;
        FACTOR = 1;
        SELECT AJCI_FACTOR FROM ajuste_cierre WHERE AJCI_PORC = 10 AND AJCI_FECINI <= :FECHA AND AJCI_FECFIN >= :FECHA INTO :FACTOR;
        if (FACTOR IS null) then
            FACTOR = 1;
        if (factor <> 1) then
            ajustar = 'S';
        gravados2 = GRAVADOS2 * FACTOR;
        IVA2 = IVA2 * FACTOR;
        FACTOR = 1;
        SELECT AJCI_FACTOR FROM ajuste_cierre WHERE AJCI_PORC = 7 AND AJCI_FECINI <= :FECHA AND AJCI_FECFIN >= :FECHA INTO :FACTOR;
        if (FACTOR IS null) then
            FACTOR = 1;
        if (factor <> 1) then
            ajustar = 'S';
        gravados3 = GRAVADOS3 * FACTOR;
        IVA3 = IVA3 * FACTOR;
        NUEVO = exentos + gravados1 + gravados2 + gravados3;
        if ((TOTAL <> 0) and (ajustar = 'S')) then
            BEGIN
            IVAMONTO = IVA1 + IVA2 + IVA3;
            CONSUMO = CONSUMO / TOTAL * (NUEVO+ivamonto+consumo);
            SUBTOTAL = SUBTOTAL / TOTAL * (NUEVO+ivamonto+consumo);
            NETO = NETO / TOTAL * (NUEVO+ivamonto+consumo);
            rtftemonto = rtftemonto / TOTAL * (NUEVO+ivamonto+consumo);
            rticamonto = rticamonto / TOTAL * (NUEVO+ivamonto+consumo);
            rtivamonto = rtivamonto / TOTAL * (NUEVO+ivamonto+consumo);
            dtomonto = dtomonto / TOTAL * (NUEVO+ivamonto+consumo);
            adicional = adicional / TOTAL * (NUEVO+ivamonto+consumo);
            total = (NUEVO+ivamonto+consumo);
            END
        SUSPEND;
        END
    END
    
TIPO = 33;
ajustar = 'N';
SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 33 INTO :NOMTIPO;
/* DEVOLUCIONES */
FOR SELECT DEVT_ID, D.PREF_PRE, DEVT_NUMERO, DEVT_FECHA, TERC_NIT, DEVT_NOMTERC, DEVT_ADICIONAL-DEVT_DTOMONTO, DEVT_IVAMONTO, DEVT_RTFTEMONTO, DEVT_RTIVAMONTO, DEVT_RTICAMONTO, DEVT_EXTRA, DEVT_TOTAL, DEVT_ANULADO, DEVT_FACTOR
    FROM DEVOLUCIONES_VENTAS D, PREFIJOS PR WHERE PTVT_ID >= :PTOINI AND PTVT_ID <= :PTOFIN AND
    DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND ((:PREFIJO = '') or (:PREFIJO IS NULL) or (D.PREF_PRE = :PREFIJO))
    AND PR.PREF_PRE = D.PREF_PRE AND PR.TIDO_COD = 33 AND ((PR.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) AND ((DEVT_REMID = 0) or (DEVT_REMID IS NULL))
    ORDER BY DEVT_FECHA, D.PREF_PRE, DEVT_NUMERO
    INTO :ID, :PREF, :NUMERO, :FECHA, :NIT, :NOMTERCERO, :DTOMONTO, :IVAMONTO, :RTFTEMONTO, :RTIVAMONTO, :RTICAMONTO, :EXTRA, :TOTAL, :ANULADO, :FACTENC
    DO
    BEGIN
    SELECT TERC_EXENTO FROM TERCEROS WHERE TERC_NIT = :NIT INTO :TER_EXENTO;
    if ((ANULADOS = 'S') or (ANULADO = 'N')) then
        BEGIN
        if (ANULADO = 'S') then
            BEGIN
            EXENTOS = 0;
            GRAVADOS1 = 0;
            GRAVADOS2 = 0;
            GRAVADOS3 = 0;
            CONSUMO = 0;
            SUBTOTAL = 0;
            TOTAL = 0;
            EXTRA = 0;
            IVAMONTO = 0;
            DTOMONTO = 0;
            NETO = 0;
            RTFTEMONTO = 0;
            RTIVAMONTO = 0;
            RTICAMONTO = 0;
            END
        else
            BEGIN
            DTOMONTO = DTOMONTO * -1;
            ADICIONAL = ADICIONAL * -1;
            IVAMONTO = IVAMONTO * -1;
            EXTRA = EXTRA * -1;
            TOTAL = TOTAL * -1;
            RTFTEMONTO = RTFTEMONTO * -1;
            RTIVAMONTO = RTIVAMONTO * -1;
            RTICAMONTO = RTICAMONTO * -1;
            /* CALCULE LAS DIFERENTES TARIFAS */
            if (TER_EXENTO = 'S') then
             BEGIN
              SELECT SUM(DVDE_TOTAL - DVDE_IVAMONTO - DVDE_CONSUMO) FROM DEVOLUCIONES_VENTAS_DETALLE D WHERE DEVT_ID = :ID AND DVDE_REFERENCIA <> '.t' INTO :EXENTOS;
              GRAVADOS1 = 0;
              GRAVADOS2 = 0;
              GRAVADOS3 = 0;
             end
            else
             begin
              SELECT SUM((DVDE_TOTAL - DVDE_IVAMONTO - DVDE_CONSUMO)*:FACTENC) FROM DEVOLUCIONES_VENTAS_DETALLE D WHERE DEVT_ID = :ID AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL)) AND DVDE_IVAPORC = 0 INTO :EXENTOS;
              SELECT SUM((DVDE_TOTAL - DVDE_IVAMONTO - DVDE_CONSUMO)*:FACTENC), SUM(DVDE_IVAMONTO*:FACTENC) FROM DEVOLUCIONES_VENTAS_DETALLE D, TARIFA_IVA T WHERE DEVT_ID = :ID AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL)) AND DVDE_IVAPORC = TAIV_PORC AND TAIV_COD = 1 INTO :GRAVADOS1, :IVA1;
              SELECT SUM((DVDE_TOTAL - DVDE_IVAMONTO - DVDE_CONSUMO)*:FACTENC), SUM(DVDE_IVAMONTO*:FACTENC) FROM DEVOLUCIONES_VENTAS_DETALLE D, TARIFA_IVA T WHERE DEVT_ID = :ID AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL)) AND DVDE_IVAPORC = TAIV_PORC AND TAIV_COD = 2 INTO :GRAVADOS2, :IVA2;
              SELECT SUM((DVDE_TOTAL - DVDE_IVAMONTO - DVDE_CONSUMO)*:FACTENC), SUM(DVDE_IVAMONTO*:FACTENC) FROM DEVOLUCIONES_VENTAS_DETALLE D, TARIFA_IVA T WHERE DEVT_ID = :ID AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL)) AND DVDE_IVAPORC = TAIV_PORC AND TAIV_COD = 3 INTO :GRAVADOS3, :IVA3;
             end
            if (iva1 is null) then
                iva1 = 0;
            if (iva2 is null) then
                iva2 = 0;
            if (iva3 is null) then
                iva3 = 0;
            SELECT SUM(DVDE_CONSUMO) FROM DEVOLUCIONES_VENTAS_DETALLE WHERE DEVT_ID = :ID AND DVDE_REFERENCIA <> '.t' INTO :CONSUMO;
            EXENTOS = EXENTOS * -1;
            GRAVADOS1 = GRAVADOS1 * -1;
            GRAVADOS2 = GRAVADOS2 * -1;
            GRAVADOS3 = GRAVADOS3 * -1;
            CONSUMO = CONSUMO * -1;
            IVA1 = IVA1 * -1;
            IVA2 = IVA2 * -1;
            IVA3 = IVA3 * -1;
            IVAMONTO = IVAMONTO * -1;
            SUBTOTAL = TOTAL - EXTRA - IVAMONTO - DTOMONTO;
            NETO = TOTAL - RTFTEMONTO - RTIVAMONTO - RTICAMONTO;
            END
        if (exentos is null) then
            exentos = 0;
        if (gravados1 is null) then
            gravados1 = 0;
        if (gravados2 is null) then
            gravados2 = 0;
        if (gravados3 is null) then
            gravados3 = 0;
        if (consumo is null) then
            consumo = 0;
        FACTOR = 1;
        SELECT AJCI_FACTOR FROM ajuste_cierre WHERE AJCI_PORC = 0 AND AJCI_FECINI <= :FECHA AND AJCI_FECFIN >= :FECHA INTO :FACTOR;
        if (FACTOR IS null) then
            FACTOR = 1;
        if (factor <> 1) then
            ajustar = 'S';
        EXENTOS = EXENTOS * FACTOR;
        ivamonto = 0;
        FACTOR = 1;
        SELECT AJCI_FACTOR FROM ajuste_cierre WHERE AJCI_PORC = 16 AND AJCI_FECINI <= :FECHA AND AJCI_FECFIN >= :FECHA INTO :FACTOR;
        if (FACTOR IS null) then
            FACTOR = 1;
        if (factor <> 1) then
            ajustar = 'S';
        gravados1 = GRAVADOS1 * FACTOR;
        IVA1 = IVA1 * FACTOR;
        ivamonto = ivamonto + IVA1;
        FACTOR = 1;
        SELECT AJCI_FACTOR FROM ajuste_cierre WHERE AJCI_PORC = 10 AND AJCI_FECINI <= :FECHA AND AJCI_FECFIN >= :FECHA INTO :FACTOR;
        if (FACTOR IS null) then
            FACTOR = 1;
        if (factor <> 1) then
            ajustar = 'S';
        gravados2 = GRAVADOS2 * FACTOR;
        IVA2 = IVA2 * FACTOR;
        ivamonto = ivamonto + IVA2;
        FACTOR = 1;
        SELECT AJCI_FACTOR FROM ajuste_cierre WHERE AJCI_PORC = 7 AND AJCI_FECINI <= :FECHA AND AJCI_FECFIN >= :FECHA INTO :FACTOR;
        if (FACTOR IS null) then
            FACTOR = 1;
        if (factor <> 1) then
            ajustar = 'S';
        gravados3 = GRAVADOS3 * FACTOR;
        IVA3 = IVA3 * FACTOR;
        ivamonto = ivamonto + IVA3;
        NUEVO = exentos + gravados1 + gravados2 + gravados3;
        if ((TOTAL <> 0) and (ajustar = 'S')) then
            BEGIN
            IVAMONTO = IVA1 + IVA2 + IVA3;
            CONSUMO = CONSUMO / TOTAL * (NUEVO+ivamonto+consumo);
            SUBTOTAL = SUBTOTAL / TOTAL * (NUEVO+ivamonto+consumo);
            NETO = NETO / TOTAL * (NUEVO+ivamonto+consumo);
            rtftemonto = rtftemonto / TOTAL * (NUEVO+ivamonto+consumo);
            rticamonto = rticamonto / TOTAL * (NUEVO+ivamonto+consumo);
            rtivamonto = rtivamonto / TOTAL * (NUEVO+ivamonto+consumo);
            dtomonto = dtomonto / TOTAL * (NUEVO+ivamonto+consumo);
            adicional = adicional / TOTAL * (NUEVO+ivamonto+consumo);
            total = (NUEVO+ivamonto+consumo);
            END
        SUSPEND;
        END
    END
execute procedure lee_configuracion ('FACTURACION', 'DOCUMENTOS', 'INCLUIR NOTAS DE CARTERA EN REPORTE DE IMPUESTOS EN VENTAS') returning_values (:NOTAS);
if (NOTAS = 'SI') then
    BEGIN
    TIPO = 41;
    SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 41 INTO :NOMTIPO;
    FOR SELECT NDCL_ID, N.PREF_PRE, NDCL_NUMERO, NDCL_FECHA, N.TERC_NIT, TERC_NOM, 0, NDCL_IVAMONTO, NDCL_RTFTEMONTO, NDCL_RTIVAMONTO, NDCL_RTICAMONTO, 0, NDCL_MONTO+NDCL_IVAMONTO, NDCL_ANULADO
        FROM NOTAS_DEBITO_CLIENTES N, TERCEROS T, PREFIJOS PR WHERE N.TERC_NIT = T.TERC_NIT AND
        NDCL_FECHA >= :FECINI AND NDCL_FECHA <= :FECFIN AND ((:PREFIJO = '') or (:PREFIJO IS NULL) or (N.PREF_PRE = :PREFIJO))
        AND PR.PREF_PRE = N.PREF_PRE AND PR.TIDO_COD = 41 AND ((PR.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
        ORDER BY NDCL_FECHA, N.PREF_PRE, NDCL_NUMERO
        INTO :ID, :PREF, :NUMERO, :FECHA, :NIT, :NOMTERCERO, :DTOMONTO, :IVAMONTO, :RTFTEMONTO, :RTIVAMONTO, :RTICAMONTO, :EXTRA, :TOTAL, :ANULADO
        DO
        BEGIN
        GRAVADOS2 = 0;
        GRAVADOS3 = 0;
        IVA2 = 0;
        IVA3 = 0;
        CONSUMO = 0;
        if (ANULADO = 'S') then
            BEGIN
            EXENTOS = 0;
            GRAVADOS1 = 0;
            SUBTOTAL = 0;
            TOTAL = 0;
            EXTRA = 0;
            IVAMONTO = 0;
            DTOMONTO = 0;
            NETO = 0;
            RTFTEMONTO = 0;
            RTIVAMONTO = 0;
            RTICAMONTO = 0;
            END
        ELSE
            BEGIN
            if (IVAMONTO <> 0) then
                BEGIN
                GRAVADOS1 = TOTAL-IVAMONTO;
                IVA1 = IVAMONTO;
                exentos = 0;
                END
            ELSE
                BEGIN
                GRAVADOS1 = 0;
                IVA1 = 0;
                exentos = TOTAL;
                END
            SUBTOTAL = TOTAL - EXTRA - IVAMONTO - DTOMONTO;
            NETO = TOTAL - RTFTEMONTO - RTIVAMONTO - RTICAMONTO;
            END
        SUSPEND;
        END

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

SET TERM ; ^

/* 20090703 *//* NO LIMITAR LA FECHA INICIAL */
SET TERM ^ ;

CREATE OR ALTER procedure CONCILIA_BANCO (
    ID integer)
AS
declare variable fecini date;
declare variable fecfin date;
declare variable item integer;
declare variable db char(1);
declare variable cuenta integer;
declare variable tipodoc integer;
declare variable iddoc integer;
declare variable prefijo varchar(4);
declare variable numero varchar(6);
declare variable fecha date;
declare variable concepto varchar(60);
declare variable monto numeric(18,2);
begin
select CUBA_COD, COBN_FECINI, COBN_FECFIN FROM conciliacion_encabezado WHERE COBN_ID = :ID INTO :CUENTA, :FECINI, :FECFIN;
/* COMPARE LA TABLA CON LOS MOVIMIENTOS DEL BANCO */
FOR SELECT COBN_ITEM, ABS(COBN_MONTO), COBN_FEC, COBN_TIPODOC, COBN_DB, COBN_CONC
    FROM CONCILIACION_BANCARIA
    WHERE COBN_ID = :ID AND ((COBN_IDDOC = 0) or (cobn_iddoc is null))
    INTO :ITEM, :MONTO, :FECHA, :TIPODOC, :DB, :concepto
    DO
    BEGIN
    PREFIJO = '';
    NUMERO = '';
    IDDOC = 0;
    /* BUSQUE LA OPERACION  */
    if (TIPODOC <> 0) then
        BEGIN
        SELECT FIRST 1 MOBA_PREF, MOBA_NUMERO, MOBA_IDREF
            FROM movimiento_banco M WHERE MOBA_TIPODOC = :tipodoc AND MOBA_TOTAL = :MONTO AND M.cuba_cod = :cuenta AND MOBA_FECHA <= :FECFIN  AND
                NOT EXISTS (SELECT COBN_ITEM FROM CONCILIACION_BANCARIA WHERE COBN_IDDOC = m.moba_idref AND COBN_TIPODOC = :tipodoc and COBN_OK = 'S')
            ORDER BY ABS(MOBA_FECHA - :FECHA)
            INTO :prefijo, :numero, :IDDOC;
        if (PREFIJO <> '') then
            BEGIN
            UPDATE conciliacion_bancaria SET COBN_PREFIJO = :PREFIJO, COBN_NUMERO = :NUMERO, COBN_IDDOC = :iddoc, COBN_OK = 'S', COBN_CLASE = '0'
                WHERE COBN_ID = :ID AND COBN_ITEM = :ITEM;
            END
        ELSE
            BEGIN
            /* BUSQUELO COMO DEBITO O CREDITO SIN IMPORTAR EL TIPO */
            SELECT FIRST 1 MOBA_PREF, MOBA_NUMERO, MOBA_IDREF, MOBA_TIPODOC
                FROM movimiento_banco M WHERE MOBA_DB = :DB AND MOBA_TOTAL = :MONTO AND M.cuba_cod = :cuenta AND MOBA_FECHA <= :FECFIN AND
                    NOT EXISTS (SELECT COBN_ITEM FROM CONCILIACION_BANCARIA WHERE COBN_IDDOC = m.moba_idref AND COBN_TIPODOC = :tipodoc and COBN_OK = 'S')
                ORDER BY ABS(MOBA_FECHA - :FECHA)
                INTO :prefijo, :numero, :IDDOC, :tipodoc;
            if (PREFIJO <> '') then
                BEGIN
                UPDATE conciliacion_bancaria SET COBN_PREFIJO = :PREFIJO, COBN_NUMERO = :NUMERO, COBN_IDDOC = :iddoc, COBN_OK = 'S', COBN_CLASE = '0', COBN_TIPODOC = :TIPODOC
                    WHERE COBN_ID = :ID AND COBN_ITEM = :ITEM;
                END
            ELSE
                BEGIN
                if (DB = 'N') then
                    UPDATE conciliacion_bancaria SET COBN_OK = 'N', COBN_CLASE = '2'
                        WHERE COBN_ID = :ID AND COBN_ITEM = :ITEM;
                else
                    UPDATE conciliacion_bancaria SET COBN_OK = 'N', COBN_CLASE = '1'
                        WHERE COBN_ID = :ID AND COBN_ITEM = :ITEM;
                END
            END
        END
    ELSE
        BEGIN
        /* BUSQUELO COMO DEBITO O CREDITO SIN IMPORTAR EL TIPO */
        SELECT FIRST 1 MOBA_PREF, MOBA_NUMERO, MOBA_IDREF, MOBA_TIPODOC
            FROM movimiento_banco M WHERE MOBA_DB = :DB AND MOBA_TOTAL = :MONTO AND M.cuba_cod = :cuenta AND MOBA_FECHA <= :FECFIN AND
                NOT EXISTS (SELECT COBN_ITEM FROM CONCILIACION_BANCARIA WHERE COBN_IDDOC = m.moba_idref AND COBN_DB = :DB and COBN_OK = 'S')
            ORDER BY ABS(MOBA_FECHA - :FECHA)
            INTO :prefijo, :numero, :IDDOC, :TIPODOC;
        if (PREFIJO <> '') then
            BEGIN
            UPDATE conciliacion_bancaria SET COBN_PREFIJO = :PREFIJO, COBN_NUMERO = :NUMERO, COBN_IDDOC = :iddoc, COBN_TIPODOC = :TIPODOC, COBN_OK = 'S', COBN_CLASE = '0'
                WHERE COBN_ID = :ID AND COBN_ITEM = :ITEM;
            END
        ELSE
            BEGIN
            if (DB = 'N') then
                UPDATE conciliacion_bancaria SET COBN_OK = 'N', COBN_CLASE = '2'
                    WHERE COBN_ID = :ID AND COBN_ITEM = :ITEM;
            else
                UPDATE conciliacion_bancaria SET COBN_OK = 'N', COBN_CLASE = '1'
                    WHERE COBN_ID = :ID AND COBN_ITEM = :ITEM;
            END
        END
    END
/* AGREGUE LOS DOCUMENTOS SIN UBICAR */
SELECT MAX(COBN_ITEM) FROM conciliacion_bancaria WHERE COBN_ID = :ID INTO :item;
FOR SELECT MOBA_PREF, MOBA_NUMERO, MOBA_FECHA, MOBA_TOTAL, MOBA_CONCEPTO, MOBA_TIPODOC, MOBA_IDREF, MOBA_DB
    FROM MOVIMIENTO_BANCO M
    WHERE MOBA_FECHA <= :FECFIN  AND M.cuba_cod = :cuenta AND
        NOT EXISTS (SELECT COBN_ITEM FROM conciliacion_bancaria WHERE COBN_TIPODOC = M.moba_tipodoc AND COBN_IDDOC = M.moba_idref and COBN_OK = 'S')
    INTO :prefijo, :numero, :fecha, :monto, :concepto, :tipodoc, :iddoc, :DB
    DO
    BEGIN
    ITEM = ITEM + 1;
    if (DB = 'N') then
        INSERT INTO conciliacion_bancaria (CUBA_COD, COBN_ID, COBN_ITEM, COBN_FEC, COBN_PREFIJO, COBN_NUMERO, COBN_MONTO, COBN_TIPODOC, COBN_ANULADO, COBN_OK, COBN_CONC, COBN_IDDOC, COBN_DB, COBN_CLASE)
            VALUES (:CUENTA, :ID, :ITEM, :FECHA, :PREFIJO, :NUMERO, :monto, :TIPODOC, 'N', 'N', :concepto, :iddoc, :DB, '4');
    else
        INSERT INTO conciliacion_bancaria (CUBA_COD, COBN_ID, COBN_ITEM, COBN_FEC, COBN_PREFIJO, COBN_NUMERO, COBN_MONTO, COBN_TIPODOC, COBN_ANULADO, COBN_OK, COBN_CONC, COBN_IDDOC, COBN_DB, COBN_CLASE)
            VALUES (:CUENTA, :ID, :ITEM, :FECHA, :PREFIJO, :NUMERO, :monto, :TIPODOC, 'N', 'N', :concepto, :iddoc, :DB, '3');
    END
end
^

SET TERM ; ^



/* 20090703b *//* INGRESOS PROPIOS POR SEPARADO */

SET TERM ^ ;

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

/* ACUMULE LOS PUNTOS, SE HACE ACA POR SER POSTERIOR AL DETALLE */
if (ANULADO = 'N') then
    EXECUTE PROCEDURE acumula_puntos_cliente (31, :id, :nit, :fecha) returning_values (:PUNTOS);
EXECUTE PROCEDURE consulta_puntos_cliente (:id, :nit, :fecha) returning_values (:puntos, :puntosacum, :puntosvenc, :fecptos);
if (DTOIT1M IS NULL) then
    DTOIT1M = 0;
if (DTOIT2M IS NULL) then
    DTOIT2M = 0;
if (DTOIT3M IS NULL) then
    DTOIT3M = 0;
SELECT CLIE_COD, C.ZONA_COD, ZONA_NOM
    FROM CLIENTES C, ZONAS Z
    WHERE TERC_NIT = :NIT AND C.ZONA_COD = Z.ZONA_COD
    INTO :CODIGOCL, :ZONACOD, :ZONANOM;
SELECT CLSU_DIR, CLSU_CIUDAD, CLSU_TEL FROM CLIENTE_SUCURSALES WHERE TERC_NIT = :NIT AND CLCU_COD = :SUCUR
    INTO :DIRECCION, :CIUDAD, :TELEFONO;
DIASVENCE = VENCE - FECHA;
if (DIASVENCE > 0) then
    CONTCRED = 'CREDITO ' || CAST(DIASVENCE AS VARCHAR(3)) || ' DIAS';
ELSE
    CONTCRED = 'CONTADO';
SUBTOTAL = TOTALFAC - EXTRA - IVAMONTO - ADICIONAL + DTOMONTO;
if (DTOITE3 = 'SI') then
    BEGIN
    SELECT SUM(FADE_DTOMONTO) FROM FACTURAS_DETALLE WHERE FACT_ID = :id INTO :sumdtoit;
    SUBTOTAL = SUBTOTAL + sumdtoit + dtoit1m + dtoit2m + dtoit3m;
    END
if (INGTER <> '') then
    BEGIN
    SELECT SUM(FADE_TOTAL) FROM FACTURAS_DETALLE D, ARTICULO A WHERE A.arti_cod = D.arti_cod AND FACT_ID = :id AND GRUP_COD = :ingter
        INTO :ingterceros;
    INGPROPIOS = SUBTOTAL - INGTERCEROS;
    END
EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'FECHA AUTORETENEDOR NO DESCONTAR RETENCIONES DEL SALDO PERO SI CONTABILIZARLAS') returning_values (AUTORET);
if (AUTORET <> '') then
    FAUTORET = CAST(AUTORET AS DATE);
else
    FAUTORET = '9999/12/31';
if (FECHA > fautoret) then
    TOTALPAGAR = TOTALFAC - RTEIVAMONTO - RTEICAMONTO - ANTICIPO;
ELSE
    TOTALPAGAR = TOTALFAC - RTEFTEMONTO - RTEIVAMONTO - RTEICAMONTO - ANTICIPO;
if (RECIBIDO <> 0) then
    CAMBIO = RECIBIDO - totalpagar;
ELSE
    CAMBIO = 0;
SUMAEX = 0;
SUMA1 = 0;
SUMA2 = 0;
SUMA3 = 0;
IVA1 = 0;
IVA2 = 0;
IVA3 = 0;
TOTCONSUMO = 0;
MONTOPAGO1 = 0;
SELECT MAX(AUDI_HORA) FROM AUDITORIA WHERE TIDO_COD = 31 AND AUDI_IDDOC = :ID AND AUDI_OPER = 'I' INTO :HORA;
/* AHORA LAS FORMAS DE PAGO, BUSQUE EL ABONO DE HOY A LA FACTURA */
ITEMFP = 1;
MONTOPAGO1 = 0;
MONTOPAGO2 = 0;
MONTOPAGO3 = 0;
FOR SELECT FOPA_NOM, RCPA_MONTO FROM RECIBOS_CAJA_PAGO P, FORMAS_PAGO F, RECIBOS_CAJA R, RECIBOS_CAJA_DETALLE D
    WHERE R.RECA_ID = P.RECA_ID AND R.RECA_ID = D.RECA_ID AND P.FOPA_ID = F.FOPA_ID AND RECA_FECHA = :FECHA AND RCDE_TIPODOC = 31 AND RCDE_IDDOC = :ID
    INTO :formap, :MONTOP
    DO
    BEGIN
    if (ITEMFP = 1) then
        BEGIN
        FORMAPAGO1 = FORMAP;
        MONTOPAGO1 = MONTOP;
        END
    if (ITEMFP = 2) then
        BEGIN
        FORMAPAGO2 = FORMAP;
        MONTOPAGO2 = MONTOP;
        END
    if (ITEMFP = 3) then
        BEGIN
        FORMAPAGO3 = FORMAP;
        MONTOPAGO3 = MONTOP;
        END
    ITEMFP = ITEMFP + 1;
    END
EXECUTE PROCEDURE lee_configuracion ('FACTURACION','DOCUMENTOS','ORDENAR ITEMS POR CODIGO DE ARTICULO') returning_values (:ORDENCOD);
EXECUTE PROCEDURE lee_configuracion ('FACTURACION','POS', 'IMPRIMIR DEVOLUCIONES DE ARTICULOS NEGATIVOS') returning_values (:imprdev);
totcajas = 0;
totbase = 0;
if (ORDENCOD = 'SI') then
    BEGIN
    FOR SELECT FADE_ITEM, D.ARTI_COD, FADE_CODBAR, SUBSTR(FADE_DESC,1,60), ARTI_DESCORTA, FADE_CANT, FADE_UNIDAD, FADE_FACTOR, BODE_COD, FADE_LOTE, LIPR_COD, FADE_PRUNIT, FADE_DTOPORC, FADE_DTOMONTO, FADE_IVAPORC, FADE_IVAMONTO, FADE_CONSUMO, FADE_TOTAL, FADE_REFERENCIA,
        GRUP_COD, SUBG_COD, MARC_COD, ARTI_PESO, ARTI_ANCHO, ARTI_ALTO, ARTI_LARGO, TAIV_COD, FADE_DEVUELTO, FADE_OBS, FADE_DTO1, FADE_DTO2, FADE_DTO3, FADE_DTOM1, FADE_DTOM2, FADE_DTOM3, FADE_CAJAS, FADE_BASE, FADE_PORCBASE
        FROM FACTURAS_DETALLE D, ARTICULO A
        WHERE D.ARTI_COD = A.ARTI_COD AND D.FACT_ID = :ID
        ORDER BY D.ARTI_COD
        INTO :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :DESCORTA, :CANT, :UNIDAD, :FACTOR, :BODITEM, :LOTE, :LISTAPR, :PRUNIT, :DTOITPORC, :DTOITMONTO, :IVAPORC, :IVAITMONTO, :CONSUMO, :TOTAL, :refitem,
        :GRUPO, :SUBGRUPO, :MARCA, :PESO, :ANCHO, :ALTO, :LARGO, :TARIFA, :devuelto, :obsitem, :dtoit1, :dtoit2, :dtoit3, :dtoitm1, :dtoitm2, :dtoitm3, :cajas, :base, :porcbase
        DO
          BEGIN
          if (ARTICULO = CODBAR) then
            SELECT FIRST 1 COBA_COD FROM barras_articulo WHERE ARTI_COD = :articulo INTO :CODBAR;
          if (IMPRDEV <> 'SI') then
            BEGIN
            if ((CANT >= 0) AND (DEVUELTO = 0)) then
                IMPR = 'S';
            ELSE
                IMPR = 'N'; /* ES DEVOLUCION */
            END
          ELSE
            IMPR = 'S';
          if (IMPR = 'S') then
            BEGIN
            prneto = PRUNIT - DTOITMONTO - dtoitm1 - dtoitm2 - dtoitm3;
            if (IMPTOS = 'S') then
                if (cant <> 0) then
                    prnetosiniva = PRUNIT - DTOITMONTO - ((IVAITMONTO+CONSUMO) / CANT) - dtoitm1 - dtoitm2 - dtoitm3;
                else
                    prnetosiniva = PRUNIT - DTOITMONTO - dtoitm1 - dtoitm2 - dtoitm3;
            ELSE
                prnetosiniva = PRUNIT - DTOITMONTO - dtoit1m - dtoit2m - dtoit3m;
            if (ICOINC = 'SI') then
                SUBTOTIT = TOTAL - IVAITMONTO;
            else
                SUBTOTIT = TOTAL - IVAITMONTO - CONSUMO;
            TOTCONSUMO = TOTCONSUMO + CONSUMO;
            TOTBASE = TOTBASE + BASE;
            SELECT LOTE_VENCE FROM LOTES WHERE LOTE_NRO = :lote AND ARTI_COD = :ARTICULO AND BODE_COD = :boditem INTO :vlote;
            if ((REFITEM <> '.t') or (REFITEM IS NULL)) then
                BEGIN
                /* NO SUME LOS ENSAMBLES */
                if (IVAPORC = 0) then
                    SUMAEX = SUMAEX + TOTAL;
                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;
                END
            if (ANCHO IS NULL) then
                ANCHO = 0;
            if (ALTO IS NULL) then
                ALTO = 0;
            if (LARGO IS NULL) then
                LARGO = 0;
            if (PESO IS NULL) then
                PESO = 0;
            PESO = (PESO / 1000) * CANT * FACTOR;
            totcajas = totcajas + cajas;
            if (substr(ARTICULO,1,2) = '.t') then
                BEGIN
                REFITEM = '';
                TOTAL = 0;
                SUBTOTIT = 0;
                END
            SELECT STAND_COD FROM STANDS WHERE ARTI_COD = :ARTICULO AND STAND_BODEGA = :boditem INTO :stand;
            factcant = NULL;
            SELECT FIRST 1 UNAR_FACCAN FROM unidad_articulo WHERE ARTI_COD = :articulo INTO :factcant;
            if (factcant IS NULL) then
                BEGIN
                ALTERNATIVAS = 0;
                PRINCIPALES = (CANT * FACTOR);
                END
            ELSE
                BEGIN
                ALTERNATIVAS = FLOOR(CANT * factor / factcant);
                PRINCIPALES = (CANT * FACTOR) - (alternativas * factcant);
                END
            SUSPEND;
            END
          END
    END
ELSE
    BEGIN
    FOR SELECT FADE_ITEM, D.ARTI_COD, FADE_CODBAR, SUBSTR(FADE_DESC,1,60), ARTI_DESCORTA, FADE_CANT, FADE_UNIDAD, FADE_FACTOR, BODE_COD, FADE_LOTE, LIPR_COD, FADE_PRUNIT, FADE_DTOPORC, FADE_DTOMONTO, FADE_IVAPORC, FADE_IVAMONTO, FADE_CONSUMO, FADE_TOTAL, FADE_REFERENCIA,
        GRUP_COD, SUBG_COD, MARC_COD, ARTI_PESO, ARTI_ANCHO, ARTI_ALTO, ARTI_LARGO, TAIV_COD, FADE_DEVUELTO, FADE_OBS, FADE_DTO1, FADE_DTO2, FADE_DTO3, FADE_DTOM1, FADE_DTOM2, FADE_DTOM3, FADE_CAJAS, FADE_BASE, FADE_PORCBASE
        FROM FACTURAS_DETALLE D, ARTICULO A
        WHERE D.ARTI_COD = A.ARTI_COD AND D.FACT_ID = :ID
        ORDER BY FADE_ITEM
        INTO :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :DESCORTA, :CANT, :UNIDAD, :FACTOR, :BODITEM, :LOTE, :LISTAPR, :PRUNIT, :DTOITPORC, :DTOITMONTO, :IVAPORC, :IVAITMONTO, :CONSUMO, :TOTAL, :refitem,
        :GRUPO, :SUBGRUPO, :MARCA, :PESO, :ANCHO, :ALTO, :LARGO, :TARIFA, :devuelto, :obsitem, :dtoit1, :dtoit2, :dtoit3, :dtoitm1, :dtoitm2, :dtoitm3, :cajas, :base, :porcbase
        DO
          BEGIN
          if (IMPRDEV <> 'SI') then
            BEGIN
            if ((CANT >= 0) AND (DEVUELTO = 0)) then
                IMPR = 'S';
            ELSE
                IMPR = 'N'; /* ES DEVOLUCION */
            END
          ELSE
            IMPR = 'S';
          if (IMPR = 'S') then
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :GRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :MARCA INTO NOMMARCA;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :SUBGRUPO AND GRUP_COD = :GRUPO INTO :NOMSUBG;
            prneto = PRUNIT - DTOITMONTO - dtoitm1 - dtoitm2 - dtoitm3;
            if (IMPTOS = 'S') then
                if (cant <> 0) then
                    prnetosiniva = PRUNIT - DTOITMONTO - ((IVAITMONTO+CONSUMO) / CANT) - dtoit1m - dtoit2m - dtoit3m;
                else
                    prnetosiniva = PRUNIT - DTOITMONTO - dtoitm1 - dtoitm2 - dtoitm3;
            ELSE
                prnetosiniva = PRUNIT - DTOITMONTO - dtoitm1 - dtoitm2 - dtoitm3;
            if (ICOINC = 'SI') then
                SUBTOTIT = TOTAL - IVAITMONTO;
            else
                SUBTOTIT = TOTAL - IVAITMONTO - CONSUMO;
            TOTCONSUMO = TOTCONSUMO + CONSUMO;
            TOTBASE = TOTBASE + BASE;
            SELECT LOTE_VENCE FROM LOTES WHERE LOTE_NRO = :lote AND ARTI_COD = :ARTICULO AND BODE_COD = :boditem INTO :vlote;
            if ((REFITEM <> '.t') or (REFITEM IS NULL)) then
                BEGIN
                /* NO SUME LOS ENSAMBLES */
                if (IVAPORC = 0) then
                    SUMAEX = SUMAEX + TOTAL;
                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;
                END
            if (ANCHO IS NULL) then
                ANCHO = 0;
            if (ALTO IS NULL) then
                ALTO = 0;
            if (LARGO IS NULL) then
                LARGO = 0;
            if (PESO IS NULL) then
                PESO = 0;
            PESO = (PESO / 1000)* CANT * FACTOR;
            totcajas = totcajas + cajas;
            if (substr(ARTICULO,1,2) = '.t') then
                BEGIN
                REFITEM = '';
                TOTAL = 0;
                SUBTOTIT = 0;
                END
            SELECT STAND_COD FROM STANDS WHERE ARTI_COD = :ARTICULO AND STAND_BODEGA = :boditem INTO :stand;
            factcant = NULL;
            SELECT FIRST 1 UNAR_FACCAN FROM unidad_articulo WHERE ARTI_COD = :articulo INTO :factcant;
            if (factcant IS NULL) then
                BEGIN
                ALTERNATIVAS = 0;
                PRINCIPALES = (CANT * FACTOR);
                END
            ELSE
                BEGIN
                ALTERNATIVAS = FLOOR(CANT * factor / factcant);
                PRINCIPALES = (CANT * FACTOR) - (alternativas * factcant);
                END
            SUSPEND;
            END
          END
    END
END
^

SET TERM ; ^



/* 20090703c *//* CONSOLIDACION DE ARTICULOS EN AJUSTES */
SET TERM ^ ;

create or alter procedure CONSOLIDA_ITEMS_AJUSTE (
    FECINI DATE,
    FECFIN DATE)
returns (
    ID INTEGER,
    ITEM1 INTEGER,
    ITEM2 INTEGER,
    ARTIC VARCHAR(20),
    CANT NUMERIC(18,2))
as
begin
FOR SELECT a.ajus_id, A1.AJUS_ITEM, A2.ajus_item, A1.arti_cod, A2.ajus_exnue * A2.ajus_factor
    FROM AJUSTES_DETALLE A1, AJUSTES_DETALLE A2, ajustes a
    WHERE AJUS_FECHA >= :FECINI AND AJUS_FECHA <= :fecfin AND AJUS_ANULADO = 'N' and A1.ajus_id = a.ajus_id AND
    A2.ajus_id = a.ajus_id and a1.arti_cod = a2.arti_cod and a1.ajus_item <> a2.ajus_item
    INTO :ID, :ITEM1, :ITEM2, :artic, :cant
    DO
    BEGIN
    UPDATE ajustes_detalle SET AJUS_EXNUE = AJUS_EXNUE + :CANT
        WHERE AJUS_ID = :ID AND AJUS_ITEM = :ITEM1;
    DELETE FROM ajustes_detalle WHERE AJUS_ID = :ID AND AJUS_ITEM = :ITEM2;
    suspend;
    END
end
^

SET TERM ; ^



/* 20090704 *//* SOBRABA UN  BUSCAR4 */
SET TERM ^ ;

CREATE OR ALTER procedure CONSULTA_ARTICULOS_VTAS (
    FECHA date,
    INACTIVOS char(1),
    MODULO varchar(20),
    BUSCAR varchar(100),
    CUALQUIERA char(1),
    COLUMNA integer,
    BUSCAR2 varchar(30),
    BUSCAR3 varchar(30),
    BUSCAR4 varchar(30),
    BUSCAR5 varchar(30))
returns (
    CODIGO varchar(20),
    DES varchar(60),
    REF varchar(20),
    GRUPO varchar(30),
    MARCA varchar(30),
    UNIDAD varchar(8),
    ESTADO varchar(30),
    IVA numeric(9,2),
    EXISTEN numeric(18,2),
    PRECIO numeric(18,2),
    CLASE char(1))
AS
DECLARE VARIABLE LISTA INTEGER;
DECLARE VARIABLE EXIST CHAR(2);
DECLARE VARIABLE SINEXIST CHAR(2);
declare variable DIG INTEGER;
declare variable OK CHAR(1);
BEGIN
EXISTEN = 0;
EXECUTE PROCEDURE lee_configuracion ('FACTURACION','ARTICULOS', 'VER EXISTENCIA EN CONSULTA ARTICULOS') returning_values (:EXIST);
EXECUTE PROCEDURE lee_configuracion ('FACTURACION','FACTURAS', 'CODIGO DE LA LISTA DE PRECIOS A MOSTRAR EN ARTICULOS') returning_values (:LISTA);
if (modulo = 'FACTURACION') then
  EXECUTE PROCEDURE lee_configuracion ('FACTURACION','ARTICULOS','VER ARTICULOS SIN EXISTENCIA EN CONSULTA DE ARTICULOS') returning_values (:sinexist);
else
  sinexist = 'SI';
EXECUTE PROCEDURE LEE_CONFIGURACION ('FACTURACION', 'ARTICULOS', 'REDONDEO AL MULTIPLO DE DIEZ EN PRECIOS') returning_values (DIG);
if (LISTA > 0) then
    BEGIN
    if ((BUSCAR IS NOT NULL) AND (BUSCAR <> '')) then
        FOR select a.arti_cod, arti_des, grup_cod, arti_unidad, esar_cod, taiv_porc, marc_cod,arti_clase
            from articulo a, tarifa_iva t
            where a.taiv_cod = t.taiv_cod and substring(a.arti_cod from 1 FOR 2) <> '.t' and
            ((:INACTIVOS = 'S') or (esar_cod = 'A') or ((:INACTIVOS = 'C') AND (esar_cod = 'N'))) AND
            ((:COLUMNA <> 0) or (upper(A.ARTI_COD) like upper(:buscar))) AND
            ((:columna <> 1) or (upper(A.ARTI_DES) like upper(:buscar))) AND
            ((:columna <> 2) or (upper(A.ARTI_OBS) like upper(:buscar)) or (upper(A.ARTI_DES) like upper(:buscar)))
            INTO :CODIGO, :DES, :GRUPO, :UNIDAD, :ESTADO, :IVA, :MARCA, :CLASE
            do
            begin
            select first 1 coba_cod from barras_articulo where arti_cod = :codigo into :ref;
            if ((COLUMNA <> 3) or (upper(REF) like upper(:buscar))) then
                BEGIN
                OK = 'N';
                PRECIO = 0;
                SELECT prar_fijo PRECIO FROM precios_articulo WHERE arti_cod = :CODIGO and lipr_cod = :LISTA INTO :PRECIO;
                EXECUTE PROCEDURE redondee(PRECIO, DIG) returning_values (PRECIO);
                if (EXIST = 'SI') then
                    BEGIN
/*                    existen = 0;
                    SELECT FIRST 1 COST_SALDOC+COST_ENTC-COST_SALC
                        FROM COSTOS WHERE ARTI_COD = :codigo AND COST_FECHA <= :FECHA
                        ORDER BY COST_FECHA DESC,COST_ITEM DESC
                        INTO :existen;
                    if (existen is null) then
                        existen = 0;*/
                    EXECUTE PROCEDURE saldo_total_inventario (:CODIGO, :FECHA) returning_values (:EXISTEN);
                    if ((SINEXIST = 'SI')  or (existen <> 0)) then
                        OK = 'S';
                    END
                ELSE
                    OK = 'S';
                if (ok = 'S') then
                    if (CUALQUIERA = 'S') then
                        SUSPEND;
                    ELSE
                        if (BUSCAR2 <> '') then
                            BEGIN
                            IF (NOT EXISTS (SELECT ARTI_COD FROM ARTICULO WHERE ARTI_COD = :CODIGO AND ((upper(ARTI_DES) like upper(:BUSCAR2)) or (UPPER(ARTI_OBS) LIKE UPPER(:BUSCAR2))))) THEN
                                OK = 'N';
                            if ((OK = 'S') AND (BUSCAR3 <> '')) then
                                IF (NOT EXISTS (SELECT ARTI_COD FROM ARTICULO WHERE ARTI_COD = :CODIGO AND ((upper(ARTI_DES) like upper(:BUSCAR3)) or (UPPER(ARTI_OBS) LIKE UPPER(:BUSCAR3))))) THEN
                                    OK = 'N';
                            if ((OK = 'S') AND (BUSCAR4 <> '')) then
                                IF (NOT EXISTS (SELECT ARTI_COD FROM ARTICULO WHERE ARTI_COD = :CODIGO AND ((upper(ARTI_DES) like upper(:BUSCAR4)) or (UPPER(ARTI_OBS) LIKE UPPER(:BUSCAR4))))) THEN
                                    OK = 'N';
                            if ((OK = 'S') AND (BUSCAR5 <> '')) then
                                IF (NOT EXISTS (SELECT ARTI_COD FROM ARTICULO WHERE ARTI_COD = :CODIGO AND ((upper(ARTI_DES) like upper(:BUSCAR5)) or (UPPER(ARTI_OBS) LIKE UPPER(:BUSCAR5))))) THEN
                                    OK = 'N';
                            if (OK = 'S') then
                                SUSPEND;
                            END
                        ELSE
                            SUSPEND;
                END
            end
    ELSE
        FOR select a.arti_cod, arti_des, grup_cod, arti_unidad, esar_cod, taiv_porc, marc_cod,arti_clase
            from articulo a, tarifa_iva t
            where a.taiv_cod = t.taiv_cod and substring(a.arti_cod from 1 FOR 2) <> '.t' and
            ((:INACTIVOS = 'S') or (esar_cod = 'A') or ((:INACTIVOS = 'C') AND (esar_cod = 'N')))
            INTO :CODIGO, :DES, :GRUPO, :UNIDAD, :ESTADO, :IVA, :MARCA, :CLASE
            do
            begin
            select first 1 coba_cod from barras_articulo where arti_cod = :codigo into :ref;
            PRECIO = 0;
            SELECT prar_fijo PRECIO FROM precios_articulo WHERE arti_cod = :CODIGO and lipr_cod = :LISTA INTO :PRECIO;
            EXECUTE PROCEDURE redondee(PRECIO, DIG) returning_values (PRECIO);
            if (EXIST = 'SI') then
                BEGIN
/*                existen = 0;
                SELECT FIRST 1 COST_SALDOC+COST_ENTC-COST_SALC
                    FROM COSTOS WHERE ARTI_COD = :codigo AND COST_FECHA <= :FECHA
                    ORDER BY COST_FECHA DESC,COST_ITEM DESC
                    INTO :existen;
                if (existen is null) then
                    existen = 0;*/
                EXECUTE PROCEDURE saldo_total_inventario (:CODIGO, :FECHA) returning_values (:EXISTEN);
                if ((SINEXIST = 'SI')  or (existen <> 0)) then
                    SUSPEND;
                END
            ELSE
                SUSPEND;
            END
    END
ELSE
    if ((BUSCAR IS NOT NULL) AND (BUSCAR <> '')) then
        FOR select arti_cod, arti_des, grup_cod, arti_unidad, esar_cod, taiv_porc, arti_precio, marc_cod, arti_clase
            from articulo a, tarifa_iva t
            where a.taiv_cod = t.taiv_cod and substring(a.arti_cod from 1 FOR 2) <> '.t' and
            ((:INACTIVOS = 'S') or (esar_cod = 'A') or ((:INACTIVOS = 'C') AND (esar_cod = 'N'))) AND
            ((:COLUMNA <> 0) or (upper(A.ARTI_COD) like upper(:buscar))) AND
            ((:columna <> 1) or (upper(A.ARTI_DES) like upper(:buscar))) AND
            ((:columna <> 2) or (upper(A.ARTI_OBS) like upper(:buscar)) or (upper(A.ARTI_DES) like upper(:buscar)))
            INTO :CODIGO, :DES, :GRUPO, :UNIDAD, :ESTADO, :IVA, :PRECIO, :MARCA, :CLASE
            do
            begin
            select first 1 coba_cod from barras_articulo where arti_cod = :codigo into :ref;
            if ((COLUMNA <> 3) or (upper(REF) like upper(:buscar))) then
                BEGIN
                if (EXIST = 'SI') then
                    BEGIN
/*                    existen = 0;
                    SELECT FIRST 1 COST_SALDOC+COST_ENTC-COST_SALC
                        FROM COSTOS WHERE ARTI_COD = :codigo AND COST_FECHA <= :FECHA
                        ORDER BY COST_FECHA DESC,COST_ITEM DESC
                        INTO :existen;
                    if (existen is null) then
                        existen = 0;*/
                    EXECUTE PROCEDURE saldo_total_inventario (:CODIGO, :FECHA) returning_values (:EXISTEN);
                    if ((SINEXIST = 'SI') or (existen <> 0)) then
                        OK = 'S';
                    END
                ELSE
                    OK = 'S';
                if (ok = 'S') then
                    if (CUALQUIERA = 'S') then
                        SUSPEND;
                    ELSE
                        if (BUSCAR2 <> '') then
                            BEGIN
                            IF (NOT EXISTS (SELECT ARTI_COD FROM ARTICULO WHERE ARTI_COD = :CODIGO AND ((upper(ARTI_DES) like upper(:BUSCAR2)) or (UPPER(ARTI_OBS) LIKE UPPER(:BUSCAR2))))) THEN
                                OK = 'N';
                            if ((OK = 'S') AND (BUSCAR3 <> '')) then
                                IF (NOT EXISTS (SELECT ARTI_COD FROM ARTICULO WHERE ARTI_COD = :CODIGO AND ((upper(ARTI_DES) like upper(:BUSCAR3)) or (UPPER(ARTI_OBS) LIKE UPPER(:BUSCAR3))))) THEN
                                    OK = 'N';
                            if ((OK = 'S') AND (BUSCAR4 <> '')) then
                                IF (NOT EXISTS (SELECT ARTI_COD FROM ARTICULO WHERE ARTI_COD = :CODIGO AND ((upper(ARTI_DES) like upper(:BUSCAR4)) or (UPPER(ARTI_OBS) LIKE UPPER(:BUSCAR4))))) THEN
                                    OK = 'N';
                            if ((OK = 'S') AND (BUSCAR5 <> '')) then
                                IF (NOT EXISTS (SELECT ARTI_COD FROM ARTICULO WHERE ARTI_COD = :CODIGO AND ((upper(ARTI_DES) like upper(:BUSCAR5)) or (UPPER(ARTI_OBS) LIKE UPPER(:BUSCAR5))))) THEN
                                    OK = 'N';
                            if (OK = 'S') then
                                SUSPEND;
                            END
                        ELSE
                            SUSPEND;
                END
            end
    ELSE
        FOR select arti_cod, arti_des, grup_cod, arti_unidad, esar_cod, taiv_porc, arti_precio, marc_cod, arti_clase
            from articulo a, tarifa_iva t
            where a.taiv_cod = t.taiv_cod and substring(a.arti_cod from 1 FOR 2) <> '.t' and
            ((:INACTIVOS = 'S') or (esar_cod = 'A') or ((:INACTIVOS = 'C') AND (esar_cod = 'N')))
            INTO :CODIGO, :DES, :GRUPO, :UNIDAD, :ESTADO, :IVA, :PRECIO, :MARCA, :CLASE
            do
            begin
            select first 1 coba_cod from barras_articulo where arti_cod = :codigo into :ref;
            if (EXIST = 'SI') then
                BEGIN
/*                existen = 0;
                SELECT FIRST 1 COST_SALDOC+COST_ENTC-COST_SALC
                    FROM COSTOS WHERE ARTI_COD = :codigo AND COST_FECHA <= :FECHA
                    ORDER BY COST_FECHA DESC,COST_ITEM DESC
                    INTO :existen;
                if (existen is null) then
                    existen = 0;*/
                EXECUTE PROCEDURE saldo_total_inventario (:CODIGO, :FECHA) returning_values (:EXISTEN);
                if ((SINEXIST = 'SI') or (existen <> 0)) then
                    SUSPEND;
                END
            ELSE
                SUSPEND;
            end
END
^

SET TERM ; ^



/* 20090704b *//* EL ULTIMO COSTO QUEDABA NULL SI NO HABIA REGISTROS EN COSTOS, POR EJEMPLO CUANDO EL 1ER MOV. ES UNA SALIDA */
SET TERM ^ ;

CREATE OR ALTER procedure COSTO_PROMEDIO_Y_ULTIMO (
    ARTICULO varchar(15),
    FECHA date)
returns (
    COSTOP numeric(18,2),
    UCOSTO numeric(18,2))
AS
declare variable saldop numeric(18,2);
declare variable saldoc numeric(15,4);
declare variable entp numeric(18,2);
declare variable entc numeric(15,4);
BEGIN
SELECT first 1 COST_SALDOP, COST_ENTP,COST_SALDOC, COST_ENTC, COST_ULTIMO FROM COSTOS
    WHERE (ARTI_COD = :ARTICULO) AND (COST_FECHA <= :FECHA)
    order by COST_FECHA DESC, cost_item desc
    INTO :SALDOP, ENTP, :SALDOC, ENTC, :UCOSTO;
IF (SALDOC IS NULL) THEN
    BEGIN
    COSTOP = 0;
    UCOSTO = 0;
    END
ELSE
    if ((SALDOC < 0) AND (SALDOC+ENTC > 0)) then
        COSTOP = ENTP/ENTC;
    else
        /* Cuando hay existencia calcule el promedio, de otra manera retorne el ultimo */
        if (SALDOC+ENTC > 0) then
            COSTOP = (SALDOP+ENTP) / (SALDOC+ENTC);
        else
            COSTOP = UCOSTO;
SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE ACTUALICE_COSTO(
    ARTICULO VARCHAR(15),
    FECHA DATE,
    COSTO NUMERIC(18,2),
    CANTIDAD NUMERIC(18,2),
    ENTRADA CHAR(1),
    ANULAR CHAR(1),
    IDMOV INTEGER,
    TIPO INTEGER)
AS
 /*$$IBE$$ DECLARE VARIABLE saldo NUMERIC(18,2);
DECLARE VARIABLE COSTOP NUMERIC(18,2);
DECLARE VARIABLE exart CHAR(1);
DECLARE VARIABLE UCOSTO NUMERIC(18,2);
declare variable FECAUX DATE;
declare variable SALDOC NUMERIC(15,4);
declare variable ITEM INTEGER;
declare variable UNIDAD VARCHAR(8); $$IBE$$*/ 
BEGIN
/* Verfique si el artículo tiene control de existencias */ /*$$IBE$$ 
SELECT arti_exist, ARTI_UNIDAD FROM articulo WHERE arti_COD = :articulo
    INTO :exart, :UNIDAD;
IF (exart <> 'N') THEN
    BEGIN
    if (ANULAR = 'S') then
        BEGIN
        select cost_saldoc, cost_saldop from costos
            WHERE (arti_cod = :articulo) AND (cost_fecha = :fecha) AND (cost_idmov = :IDMOV) AND (COST_TIPO = :TIPO)
            into :SALDOC, :SALDO;  $$IBE$$*/ /* para dejar inicializadas las 2 variables */ /*$$IBE$$ 
        DELETE FROM COSTOS WHERE (arti_cod = :articulo) AND (cost_fecha = :fecha) AND (cost_idmov = :IDMOV) AND (COST_TIPO = :TIPO);
         $$IBE$$*/ /* para inicializar el ultimo costo */ /*$$IBE$$ 
        SELECT MAX(COST_FECHA) FROM costos
            WHERE (arti_cod = :articulo) AND (cost_fecha <= :fecha) INTO :FECAUX;
        if (FECAUX IS NULL) then
            UCOSTO = 0;
        ELSE
            BEGIN
            SELECT MAX(COST_ITEM) FROM costos
                WHERE (arti_cod = :articulo) AND (cost_fecha = :fecaux) INTO :ITEM;
            SELECT COST_ULTIMO FROM costos
                WHERE (arti_cod = :articulo) AND (cost_fecha = :fecaux) AND (cost_item = :ITEM) INTO :UCOSTO;
            END
        END
    ELSE
        BEGIN
        select max(cost_fecha) from costos WHERE (arti_cod = :articulo) AND (cost_fecha <= :fecha) into :fecaux;
        select max(cost_item) from costos WHERE (arti_cod = :articulo) AND (cost_fecha = :fecaux) into :item;
        select (cost_saldoc + cost_entc - cost_salc) from costos WHERE (arti_cod = :articulo) AND (cost_fecha = :fecaux) AND (cost_item = :item) into :saldoc;
        if (saldoc is null) THEN
            SALDOC = 0;
        EXECUTE PROCEDURE costo_promedio_y_ultimo(:articulo, :fecha) RETURNING_VALUES (:costop, :ucosto);
        if (ENTRADA = 'S') then
            if (TIPO = 33) then
                BEGIN
                INSERT INTO COSTOS (arti_cod, cost_fecha,
                    cost_entc, cost_entp, cost_salc, cost_salp,
                    cost_saldoc, cost_saldop, cost_ultimo, cost_idmov, cost_tipo)
                    VALUES (:articulo, :fecha, :cantidad, :cantidad*:costop, 0, 0, :saldoc, :saldoc*:costop, :ucosto, :IDMOV, :TIPO);
                SALDO = (SALDOC * COSTOP) + (CANTIDAD * COSTOP);
                SALDOC = SALDOC + CANTIDAD;
                END
            ELSE
                BEGIN
                UCOSTO = :COSTO;
                INSERT INTO COSTOS (arti_cod, cost_fecha,
                    cost_entc, cost_entp, cost_salc, cost_salp,
                    cost_saldoc, cost_saldop, cost_ultimo, cost_idmov, cost_tipo)
                    VALUES (:articulo, :fecha, :cantidad, :cantidad*:costo, 0, 0, :saldoc, :saldoc*:costop, :costo, :IDMOV, :TIPO);
                SALDO = (SALDOC * COSTOP) + (CANTIDAD * COSTO);
                SALDOC = SALDOC + CANTIDAD;
                END
        ELSE
            BEGIN
            INSERT INTO COSTOS (arti_cod, cost_fecha,
                cost_entc, cost_entp, cost_salc, cost_salp,
                cost_saldoc, cost_saldop, cost_ultimo, cost_idmov, cost_tipo)
                VALUES (:articulo, :fecha, 0, 0, :cantidad, :cantidad*:costop, :saldoc, :saldoc*:costop, :UCOSTO, :IDMOV, :TIPO);
            SALDOC = SALDOC - CANTIDAD;
            SALDO = SALDOC * COSTOP;  $$IBE$$*/ /* YA ESTA RESTADA LA CANTIDAD */ /*$$IBE$$ 
            END
        END
    END
 $$IBE$$*/ EXIT;
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE CALCULA_PRECIOS(
    ARTICULO VARCHAR(20),
    FECHA DATE)
AS
 /*$$IBE$$ declare variable LISTA INTEGER;
declare variable MARGEN NUMERIC(9, 4);
declare variable UTIL NUMERIC(9, 4);
declare variable UNIDAD VARCHAR(8);
declare variable UOR VARCHAR(20);
declare variable COSTOP NUMERIC(18, 2);
declare variable COSTOU NUMERIC(18, 2);
declare variable COSTO NUMERIC(18, 2);
declare variable DIG INTEGER;
declare variable IVAINC CHAR(1);
declare variable TARIVA NUMERIC(9,2);
declare variable AUTOM CHAR(1);
declare variable BASE varchar(10);
declare variable CAMBIO CHAR(7); $$IBE$$*/ 
BEGIN /*$$IBE$$ 
EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION','ARTICULOS','CAMBIO DE PRECIOS AUTOMATICO AL CAMBIAR COSTO O PRECIO') returning_values (CAMBIO);
if (CAMBIO = 'COSTO') then
  BEGIN
  FOR SELECT P.LIPR_COD, PRAR_MARGEN, PRAR_UTIL, LIPR_MODIF, PRAR_AUTO
    FROM PRECIOS_ARTICULO P, LISTA_PRECIOS L
    WHERE P.LIPR_COD = L.LIPR_COD AND ARTI_COD = :articulo
    INTO :LISTA, :MARGEN, :UTIL, :IVAINC, :AUTOM
    DO
      if (AUTOM = 'S') then
        BEGIN
        if (UTIL IS NULL) then
            UTIL = 0;
        if (MARGEN IS NULL) then
            MARGEN = 0;
        SELECT ARTI_UNIDAD, TAIV_PORC FROM ARTICULO A, TARIFA_IVA T WHERE A.TAIV_COD = T.TAIV_COD AND ARTI_COD = :ARTICULO INTO :UNIDAD, :TARIVA;
        EXECUTE PROCEDURE lee_configuracion('FACTURACION','ARTICULOS','COSTO BASE PARA CALCULO DE PRECIOS DE VENTA AUTOMATICOS') returning_values (:BASE);
        EXECUTE PROCEDURE costo_promedio_y_ultimo (:ARTICULO, :FECHA) RETURNING_VALUES(:COSTOP, :COSTOU);
        if (base = 'ULTIMO') then
            COSTO = COSTOU;
        ELSE
            BEGIN
            COSTO = COSTOP;
            if (base = 'MAYOR') then
                if (COSTOP < COSTOU) then
                    COSTO = COSTOU;
            END
        if (IVAINC = 'S') then
            COSTO = COSTO * (1 + TARIVA/100);
        EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION', 'ARTICULOS', 'SUGERIR PRECIOS CON PORCENTAJE DE MARGEN O UTILIDAD') RETURNING_VALUES (:UOR);
        EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION', 'ARTICULOS', 'REDONDEO AL MULTIPLO DE DIEZ EN PRECIOS') RETURNING_VALUES (:DIG);
        if (UOR = 'UTILIDAD') then
            BEGIN
            COSTO = COSTO * (1 + :UTIL/100);
            EXECUTE PROCEDURE REDONDEE (COSTO, DIG) returning_values (COSTO);
            UPDATE PRECIOS_ARTICULO
                SET PRAR_FIJO = :COSTO
                WHERE ARTI_COD = :ARTICULO AND LIPR_COD = :LISTA;
            END
        ELSE
            BEGIN
            COSTO = COSTO / (1 - :MARGEN/100);
            EXECUTE PROCEDURE REDONDEE (COSTO, DIG) returning_values (COSTO);
            UPDATE PRECIOS_ARTICULO
                SET PRAR_FIJO = :COSTO
                WHERE ARTI_COD = :ARTICULO AND LIPR_COD = :LISTA;
            END
        END
  END
 $$IBE$$*/ EXIT;
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE REP_DISPONIBILIDAD(
    FECHA DATE,
    ARTINI VARCHAR(20),
    ARTFIN VARCHAR(20),
    GRPINI VARCHAR(3),
    GRPFIN VARCHAR(3),
    ORDEN CHAR(1),
    CEROS CHAR(1),
    DETALLE CHAR(1),
    AGRUPA CHAR(1),
    SUCURSAL INTEGER)
RETURNS (
    CODIGO VARCHAR(15),
    NOMBRE VARCHAR(60),
    UNIDAD VARCHAR(8),
    CODGRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    CODSUBG VARCHAR(3),
    NOMSUBG VARCHAR(30),
    CODMARC VARCHAR(3),
    NOMMARC VARCHAR(30),
    CODBOD VARCHAR(2),
    NOMBOD VARCHAR(30),
    EXIST NUMERIC(18,4),
    PROMEDIO NUMERIC(18,4),
    SALIDAS NUMERIC(18,4),
    DISPONIBILIDAD INTEGER,
    DIAS INTEGER,
    PROMEDIADO INTEGER,
    COSTO NUMERIC(18,2),
    COSTOPRO NUMERIC(18,2),
    SUGERIDO NUMERIC(18,4),
    FECCOMPRA DATE)
AS
 /*$$IBE$$ DECLARE VARIABLE CODINI VARCHAR(20);
DECLARE VARIABLE CODFIN VARCHAR(20);
DECLARE VARIABLE DESINI VARCHAR(20);
DECLARE VARIABLE DESFIN VARCHAR(20);
DECLARE VARIABLE MARINI VARCHAR(20);
DECLARE VARIABLE MARFIN VARCHAR(20);
declare variable DIASC VARCHAR(255);
declare variable DIA_ART VARCHAR(2) CHARACTER SET NONE; $$IBE$$*/ 
BEGIN /*$$IBE$$ 
if (ORDEN = 'C') then
    BEGIN
    CODINI = ARTINI;
    CODFIN = ARTFIN;
    DESINI = '';
    DESFIN = 'zz';
    END
ELSE
    BEGIN
    DESINI = ARTINI;
    DESFIN = ARTFIN;
    CODINI = '';
    CODFIN = 'zz';
    END
if (AGRUPA = 'G') then
    BEGIN
    MARINI = '';
    MARFIN = 'zz';
    END
ELSE
    if (AGRUPA = 'M') then
        BEGIN
        MARINI = GRPINI;
        MARFIN = GRPFIN;
        GRPINI = '';
        GRPFIN = 'zz';
        END
if (DETALLE = 'S') then
  BEGIN
  FOR SELECT ARTI_COD, ARTI_DES, ARTI_UNIDAD, ARTI_DIAS, A.GRUP_COD, GRUP_NOM, A.SUBG_COD, A.MARC_COD, BODE_COD, BODE_NOM, ARTI_DIANALIS
      FROM ARTICULO A, GRUPO G, BODEGA B
      WHERE ARTI_COD >= :CODINI AND ARTI_COD <= :CODFIN AND A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :GRPFIN AND ARTI_DES >= :DESINI AND ARTI_DES <= :DESFIN AND
      G.GRUP_COD = A.GRUP_COD AND A.ESAR_COD <> 'I' AND ((SUCU_ID = :SUCURSAL) or (:SUCURSAL = 0)) AND
      (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN)))
      INTO :CODIGO, :NOMBRE, :UNIDAD, :DIAS, :CODGRUPO, :NOMGRUPO, :CODSUBG, :CODMARC, :CODBOD, :NOMBOD, :PROMEDIADO
      DO
        BEGIN
        NOMMARC = '';
        NOMSUBG = '';
        SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO :NOMMARC;
        SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
        EXECUTE PROCEDURE costo_promedio_y_ultimo(:CODIGO, :FECHA) RETURNING_VALUES (:costopro, :COSTO);
        EXECUTE PROCEDURE DISPONIBILIDAD_ARTICULO(CODIGO, FECHA, :CODBOD) returning_values (:DISPONIBILIDAD, :EXIST, :PROMEDIO, :SALIDAS);
         $$IBE$$*/ /*ESTABLECER CUAL ES EL VALOR DE DIAS PARA PROMEDIO*/ /*$$IBE$$ 
        EXECUTE PROCEDURE lee_configuracion ('INVENTARIO', 'EXISTENCIAS', 'PROMEDIAR LAS SALIDAS DEL INVENTARIO CON EL NUMERO DE DIAS ASIGNADO A CADA ARTICULO') returning_values (:DIA_ART);
        if (DIA_ART = 'NO') then
          BEGIN
            EXECUTE PROCEDURE lee_configuracion ('INVENTARIO', 'EXISTENCIAS', 'NUMERO DE DIAS PARA PROMEDIO DE SALIDAS POR ARTICULO') returning_values (DIASC);
            PROMEDIADO = CAST(DIASC AS INTEGER);
          END
        if ((DISPONIBILIDAD < DIAS) and (PROMEDIO > 0))then
            SUGERIDO = (DIAS * PROMEDIO) - EXIST;
        ELSE
            SUGERIDO = 0;
        SELECT MAX(FACO_FECHA) FROM FACTURAS_COMPRA F, FACTURAS_COMPRAS_DETALLE D
            WHERE F.FACO_ID = D.faco_id AND D.ARTI_COD = :CODIGO AND FACO_FECHA <= :FECHA AND D.bode_cod = :codbod
            INTO :FECCOMPRA;
        if ((PROMEDIO > 0) or (EXIST <> 0) or (CEROS = 'S')) then
            SUSPEND;
        END
  END
ELSE
  BEGIN
  FOR SELECT ARTI_COD, ARTI_DES, ARTI_UNIDAD, ARTI_DIAS, A.GRUP_COD, GRUP_NOM, A.SUBG_COD, A.MARC_COD, ARTI_DIANALIS
      FROM ARTICULO A, GRUPO G
      WHERE ARTI_COD >= :CODINI AND ARTI_COD <= :CODFIN AND A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :GRPFIN AND ARTI_DES >= :DESINI AND ARTI_DES <= :DESFIN AND G.GRUP_COD = A.GRUP_COD AND
      A.ESAR_COD <> 'I' AND (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN)))
      INTO :CODIGO, :NOMBRE, :UNIDAD, :DIAS, :CODGRUPO, :NOMGRUPO, :CODSUBG, :CODMARC, :PROMEDIADO
      DO
        BEGIN
        NOMMARC = '';
        NOMSUBG = '';
        SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO :NOMMARC;
        SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
        EXECUTE PROCEDURE costo_promedio_y_ultimo(:CODIGO, :FECHA) RETURNING_VALUES (:costopro, :COSTO);
        EXECUTE PROCEDURE DISPONIBILIDAD_TOTAL_ARTICULO(CODIGO, FECHA) returning_values (:DISPONIBILIDAD, :EXIST, :PROMEDIO, :SALIDAS);
         $$IBE$$*/ /*ESTABLECER CUAL ES EL VALOR DE DIAS PARA PROMEDIO*/ /*$$IBE$$ 
        EXECUTE PROCEDURE lee_configuracion ('INVENTARIO', 'EXISTENCIAS', 'PROMEDIAR LAS SALIDAS DEL INVENTARIO CON EL NUMERO DE DIAS ASIGNADO A CADA ARTICULO') returning_values (:DIA_ART);
        if (DIA_ART = 'NO') then
          BEGIN
            EXECUTE PROCEDURE lee_configuracion ('INVENTARIO', 'EXISTENCIAS', 'NUMERO DE DIAS PARA PROMEDIO DE SALIDAS POR ARTICULO') returning_values (DIASC);
            PROMEDIADO = CAST(DIASC AS INTEGER);
          END
        if ((DISPONIBILIDAD < DIAS) and (PROMEDIO > 0))then
            SUGERIDO = (DIAS * PROMEDIO) - EXIST;
        ELSE
            SUGERIDO = 0;
        SELECT MAX(FACO_FECHA) FROM FACTURAS_COMPRA F, FACTURAS_COMPRAS_DETALLE D
            WHERE F.FACO_ID = D.faco_id AND D.ARTI_COD = :CODIGO AND FACO_FECHA <= :FECHA
            INTO :FECCOMPRA;
        if ((PROMEDIO > 0) or (EXIST <> 0) or (CEROS = 'S')) then
            SUSPEND;
        END
  END
 $$IBE$$*/ SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE REP_UTILIDAD_VENTAS(
    TIPO INTEGER,
    DETALLE CHAR(1),
    FECINI DATE,
    FECFIN DATE,
    ARTINI VARCHAR(15),
    ARTFIN VARCHAR(15),
    GRPINI VARCHAR(3),
    GRPFIN VARCHAR(3),
    ORDEN CHAR(1),
    AGRUPA CHAR(1),
    ULTIMO CHAR(1),
    CEROS CHAR(1),
    SUBEMPRESA INTEGER)
RETURNS (
    ARTICULO VARCHAR(15),
    DESCRIPCION VARCHAR(60),
    CODGRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    CODSUBG VARCHAR(3),
    NOMSUBG VARCHAR(30),
    CODMARC VARCHAR(3),
    NOMMARC VARCHAR(30),
    UNIDAD VARCHAR(8),
    CANTIDAD NUMERIC(18,4),
    BASE NUMERIC(18,4),
    COSTO NUMERIC(18,4),
    UTILIDAD NUMERIC(18,4),
    PORC NUMERIC(9,2),
    IVA NUMERIC(18,4),
    CONSUMO NUMERIC(18,4),
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    TIPODOC INTEGER)
AS
 /*$$IBE$$ DECLARE VARIABLE COSTOUNIT NUMERIC(18,4);
DECLARE VARIABLE CANTDET NUMERIC(18,4);
declare variable CODINI VARCHAR(15);
declare variable CODFIN VARCHAR(15);
declare variable DESINI VARCHAR(15);
declare variable DESFIN VARCHAR(15);
declare variable MARINI VARCHAR(3);
declare variable MARFIN VARCHAR(3);
declare variable UOM VARCHAR(20);
declare variable NUMROWS INTEGER;
declare variable ULTCOS NUMERIC(18,2); $$IBE$$*/ 
BEGIN /*$$IBE$$ 
if (ORDEN = 'C') then
    BEGIN
    CODINI = ARTINI;
    CODFIN = ARTFIN;
    DESINI = '';
    DESFIN = 'zz';
    END
ELSE
    BEGIN
    DESINI = ARTINI;
    DESFIN = ARTFIN;
    CODINI = '';
    CODFIN = 'zz';
    END
if (AGRUPA = 'G') then
    BEGIN
    MARINI = '';
    MARFIN = 'zz';
    END
ELSE
    if (AGRUPA = 'M') then
        BEGIN
        MARINI = GRPINI;
        MARFIN = GRPFIN;
        GRPINI = '';
        GRPFIN = 'zz';
        END
    ELSE
        BEGIN
        MARINI = '';
        MARFIN = 'zz';
        GRPINI = '';
        GRPFIN = 'zz';
        END
EXECUTE PROCEDURE lee_configuracion ('FACTURACION', 'ARTICULOS', 'SUGERIR PRECIOS CON PORCENTAJE DE MARGEN O UTILIDAD') returning_values (:UOM);
if (DETALLE = 'N') then
    BEGIN
    if (BIN_AND(TIPO, 1) <> 0) then
        BEGIN
        TIPODOC = 31;
         $$IBE$$*/ /* BORRA LA TABLA AUXILIAR */ /*$$IBE$$ 
        DELETE FROM reportes_aux WHERE REPA_ID = 2 AND REPA_USER = USER;

        FOR SELECT MAX(D.ARTI_COD), SUM(FADE_CANT * FADE_FACTOR), SUM((FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO)*FACT_FACTOR), SUM(FADE_IVAMONTO*FACT_FACTOR), SUM(FADE_CONSUMO),
            MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD)
            FROM FACTURAS_DETALLE D, FACTURAS F, PREFIJOS P, ARTICULO A
            WHERE F.FACT_ID = D.FACT_ID AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND D.ARTI_COD = A.arti_cod AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            FACT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) and substring(a.arti_cod from 1 FOR 2) <> '.t'
            GROUP BY D.ARTI_COD
            INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,
            :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
            DO
            BEGIN
            COSTO = 0;
            FOR SELECT FADE_CANT * FADE_FACTOR, FACT_FECHA FROM FACTURAS_DETALLE D, FACTURAS F, PREFIJOS P
                WHERE F.FACT_ID = D.FACT_ID AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND
                FACT_ANULADO = 'N' AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                and D.ARTI_COD = :articulo  INTO :cantdet, :fecha
                DO
                BEGIN
                EXECUTE PROCEDURE costo_promedio_y_ultimo(:ARTICULO, :FECHA) returning_values (:costounit, :ultcos);
                if (ULTIMO = 'S') then
                    COSTO = COSTO + ultcos * cantdet;
                else
                    COSTO = COSTO + costounit * cantdet;
                END
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            if (CEROS = 'S') then
                INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (2, USER, :ARTICULO);
            SUSPEND;
            END  $$IBE$$*/ /* FOR */ /*$$IBE$$ 
        if (CEROS = 'S') then
            BEGIN
            COSTO = 0;
            UTILIDAD = 0;
            PORC = 0;
             $$IBE$$*/ /* agregue los articulos sin factura */ /*$$IBE$$ 
            FOR SELECT ARTI_COD, 0, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND
                    A.ARTI_DES <= :DESFIN AND A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND
                    (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN)))
                INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,:DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                DO
                BEGIN
                SELECT COUNT(REPA_ARTICULO) FROM REPORTES_AUX WHERE REPA_ID = 2 AND REPA_USER = USER AND REPA_ARTICULO = :articulo INTO :numrows;
                if (numrows = 0) then
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        END
    if (BIN_AND(TIPO, 2) <> 0) then
        BEGIN
        TIPODOC = 32;
         $$IBE$$*/ /* BORRA LA TABLA AUXILIAR */ /*$$IBE$$ 
        DELETE FROM reportes_aux WHERE REPA_ID = 2 AND REPA_USER = USER;

        FOR SELECT MAX(D.ARTI_COD), SUM(RVDE_CANT * RVDE_FACTOR), SUM(RVDE_TOTAL-RVDE_IVAMONTO-RVDE_CONSUMO), SUM(RVDE_IVAMONTO), SUM(RVDE_CONSUMO),
            MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD)
            FROM REMISIONES_VENTA_DETALLE D, REMISIONES_VENTA R, PREFIJOS P, ARTICULO A
            WHERE R.REVT_ID = D.REVT_ID AND P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = 32 AND D.ARTI_COD = A.arti_cod AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            REVT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY D.ARTI_COD
            INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,
            :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
            DO
            BEGIN
            COSTO = 0;
            FOR SELECT RVDE_CANT * RVDE_FACTOR, REVT_FECHA FROM remisiones_venta_detalle D, remisiones_venta F, PREFIJOS P
                WHERE F.revt_id = D.revt_id AND REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN AND
                REVT_ANULADO = 'N' AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 32 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                and D.ARTI_COD = :articulo  INTO :cantdet, :fecha
                DO
                BEGIN
                EXECUTE PROCEDURE costo_promedio_y_ultimo(:ARTICULO, :FECHA) returning_values (:costounit, :ultcos);
                if (ULTIMO = 'S') then
                    COSTO = COSTO + ultcos * cantdet;
                else
                    COSTO = COSTO + costounit * cantdet;
                END
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            if (CEROS = 'S') then
                INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (2, USER, :ARTICULO);
            SUSPEND;
            END  $$IBE$$*/ /* FOR */ /*$$IBE$$ 
        if (CEROS = 'S') then
            BEGIN
            COSTO = 0;
            UTILIDAD = 0;
            PORC = 0;
             $$IBE$$*/ /* agregue los articulos sin factura */ /*$$IBE$$ 
            FOR SELECT ARTI_COD, 0, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND
                    A.ARTI_DES <= :DESFIN AND A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND
                    (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN)))
                INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,:DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                DO
                BEGIN
                SELECT COUNT(REPA_ARTICULO) FROM REPORTES_AUX WHERE REPA_ID = 2 AND REPA_USER = USER AND REPA_ARTICULO = :articulo INTO :numrows;
                if (numrows = 0) then
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        END
    if (BIN_AND(TIPO, 4) <> 0) then
        BEGIN
        TIPODOC = 33;
         $$IBE$$*/ /* BORRA LA TABLA AUXILIAR */ /*$$IBE$$ 
        DELETE FROM reportes_aux WHERE REPA_ID = 2 AND REPA_USER = USER;

        FOR SELECT MAX(D.ARTI_COD), SUM(DVDE_CANT * DVDE_FACTOR), SUM((DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO)*DEVT_FACTOR), SUM(DVDE_IVAMONTO*DEVT_FACTOR), SUM(DVDE_CONSUMO),
            MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD)
            FROM devoluciones_ventas_detalle D, DEVOLUCIONES_VENTAS V, PREFIJOS P, ARTICULO A
            WHERE V.DEVT_ID = D.DEVT_ID AND P.PREF_PRE = V.PREF_PRE AND P.TIDO_COD = 33 AND D.ARTI_COD = A.arti_cod AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            DEVT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY D.ARTI_COD
            INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,
            :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
            DO
            BEGIN
            COSTO = 0;
            FOR SELECT DVDE_CANT * DVDE_FACTOR, DEVT_FECHA FROM devoluciones_ventas_detalle D, devoluciones_ventas F, PREFIJOS P
                WHERE F.devt_id = D.devt_id AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND
                DEVT_ANULADO = 'N' AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 33 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                and D.ARTI_COD = :articulo  INTO :cantdet, :fecha
                DO
                BEGIN
                EXECUTE PROCEDURE costo_promedio_y_ultimo(:ARTICULO, :FECHA) returning_values (:costounit, :ultcos);
                if (ULTIMO = 'S') then
                    COSTO = COSTO + ultcos * cantdet;
                else
                    COSTO = COSTO + costounit * cantdet;
                END
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            else
                CANTIDAD = CANTIDAD * -1;
            if (BASE IS NULL) then
                BASE = 0;
            else
                BASE = BASE * -1;
            if (IVA IS NULL) then
                IVA = 0;
            else
                IVA = IVA * -1;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            else
                CONSUMO = CONSUMO * -1;
            COSTO = costo * -1;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            if (CEROS = 'S') then
                INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (2, USER, :ARTICULO);
            SUSPEND;
            END  $$IBE$$*/ /* FOR */ /*$$IBE$$ 
        if (CEROS = 'S') then
            BEGIN
            COSTO = 0;
            UTILIDAD = 0;
            PORC = 0;
             $$IBE$$*/ /* agregue los articulos sin factura */ /*$$IBE$$ 
            FOR SELECT ARTI_COD, 0, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND
                    A.ARTI_DES <= :DESFIN AND A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND
                    (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN)))
                INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,:DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                DO
                BEGIN
                SELECT COUNT(REPA_ARTICULO) FROM REPORTES_AUX WHERE REPA_ID = 2 AND REPA_USER = USER AND REPA_ARTICULO = :articulo INTO :numrows;
                if (numrows = 0) then
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        END
    if (BIN_AND(TIPO, 8) <> 0) then
        BEGIN
        TIPODOC = 34;
         $$IBE$$*/ /* BORRA LA TABLA AUXILIAR */ /*$$IBE$$ 
        DELETE FROM reportes_aux WHERE REPA_ID = 2 AND REPA_USER = USER;

        FOR SELECT MAX(D.ARTI_COD), SUM(PEDE_CANT * PEDE_FACTOR), SUM((PEDE_TOTAL-PEDE_IVAMONTO-PEDE_CONSUMO)*PEDI_FACTOR), SUM(PEDE_IVAMONTO*PEDI_FACTOR), SUM(PEDE_CONSUMO),
            MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD)
            FROM PEDIDOS_DETALLE D, PEDIDOS P, PREFIJOS R, ARTICULO A
            WHERE P.PEDI_ID = D.PEDI_ID AND P.PREF_PRE = R.PREF_PRE AND R.TIDO_COD = 34 AND D.ARTI_COD = A.arti_cod AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            PEDI_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY D.ARTI_COD
            INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,
            :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
            DO
            BEGIN
            COSTO = 0;
            FOR SELECT PEDE_CANT * PEDE_FACTOR, PEDI_FECHA FROM pedidos_detalle D, pedidos F, PREFIJOS P
                WHERE F.pedi_id = D.pedi_id AND PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND
                PEDI_ANULADO = 'N' AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                and D.ARTI_COD = :articulo  INTO :cantdet, :fecha
                DO
                BEGIN
                EXECUTE PROCEDURE costo_promedio_y_ultimo(:ARTICULO, :FECHA) returning_values (:costounit, :ultcos);
                if (ULTIMO = 'S') then
                    COSTO = COSTO + ultcos * cantdet;
                else
                    COSTO = COSTO + costounit * cantdet;
                END
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            if (CEROS = 'S') then
                INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (2, USER, :ARTICULO);
            SUSPEND;
            END  $$IBE$$*/ /* FOR */ /*$$IBE$$ 
        if (CEROS = 'S') then
            BEGIN
            COSTO = 0;
            UTILIDAD = 0;
            PORC = 0;
             $$IBE$$*/ /* agregue los articulos sin factura */ /*$$IBE$$ 
            FOR SELECT ARTI_COD, 0, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND
                    A.ARTI_DES <= :DESFIN AND A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND
                    (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN)))
                INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,:DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                DO
                BEGIN
                SELECT COUNT(REPA_ARTICULO) FROM REPORTES_AUX WHERE REPA_ID = 2 AND REPA_USER = USER AND REPA_ARTICULO = :articulo INTO :numrows;
                if (numrows = 0) then
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        END
    if (BIN_AND(TIPO, 16) <> 0) then
        BEGIN
        TIPODOC = 35;
         $$IBE$$*/ /* BORRA LA TABLA AUXILIAR */ /*$$IBE$$ 
        DELETE FROM reportes_aux WHERE REPA_ID = 2 AND REPA_USER = USER;

        FOR SELECT MAX(D.ARTI_COD), SUM(CTDE_CANT * CTDE_FACTOR), SUM((CTDE_TOTAL-CTDE_IVAMONTO-CTDE_CONSUMO)*COTI_FACTOR), SUM(CTDE_IVAMONTO), SUM(CTDE_CONSUMO),
            MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD)
            FROM COTIZACIONES_DETALLE D, COTIZACIONES C, PREFIJOS P, ARTICULO A
            WHERE C.COTI_ID = D.COTI_ID AND P.PREF_PRE = C.PREF_PRE AND P.TIDO_COD = 35 AND D.ARTI_COD = A.arti_cod AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND COTI_FECHA >= :FECINI AND COTI_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            COTI_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY D.ARTI_COD
            INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,
            :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
            DO
            BEGIN
            COSTO = 0;
            FOR SELECT CTDE_CANT * CTDE_FACTOR, COTI_FECHA FROM cotizaciones_detalle D, cotizaciones F, PREFIJOS P
                WHERE F.coti_id = D.coti_id AND COTI_FECHA >= :FECINI AND COTI_FECHA <= :FECFIN AND
                COTI_ANULADO = 'N' AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                and D.ARTI_COD = :articulo  INTO :cantdet, :fecha
                DO
                BEGIN
                EXECUTE PROCEDURE costo_promedio_y_ultimo(:ARTICULO, :FECHA) returning_values (:costounit, :ultcos);
                if (ULTIMO = 'S') then
                    COSTO = COSTO + ultcos * cantdet;
                else
                    COSTO = COSTO + costounit * cantdet;
                END
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            if (CEROS = 'S') then
                INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (2, USER, :ARTICULO);
            SUSPEND;
            END  $$IBE$$*/ /* FOR */ /*$$IBE$$ 
        if (CEROS = 'S') then
            BEGIN
            COSTO = 0;
            UTILIDAD = 0;
            PORC = 0;
             $$IBE$$*/ /* agregue los articulos sin factura */ /*$$IBE$$ 
            FOR SELECT ARTI_COD, 0, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND
                    A.ARTI_DES <= :DESFIN AND A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND
                    (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN)))
                INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,:DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                DO
                BEGIN
                SELECT COUNT(REPA_ARTICULO) FROM REPORTES_AUX WHERE REPA_ID = 2 AND REPA_USER = USER AND REPA_ARTICULO = :articulo INTO :numrows;
                if (numrows = 0) then
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        END
    END
ELSE
    BEGIN
    if (BIN_AND(TIPO, 1) <> 0) then
        BEGIN
        TIPODOC = 31;
        FOR SELECT F.PREF_PRE, FACT_NUMERO, FACT_FECHA, D.ARTI_COD, FADE_CANT * FADE_FACTOR, (FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO)*FACT_FACTOR, FADE_IVAMONTO*FACT_FACTOR, FADE_CONSUMO,
            ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
            FROM FACTURAS F, FACTURAS_DETALLE D, PREFIJOS P, ARTICULO A
            WHERE F.FACT_ID = D.FACT_ID AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND D.ARTI_COD = A.arti_cod AND
                A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
                A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND FACT_FECHA >= :FECINI AND
                (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
                FACT_FECHA <= :FECFIN AND FACT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) and substring(a.arti_cod from 1 FOR 2) <> '.t'
            ORDER BY D.ARTI_COD, FACT_FECHA, F.FACT_ID, FADE_ITEM
            INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,
                :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
            DO
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            EXECUTE PROCEDURE costo_promedio_y_ultimo(:ARTICULO, :FECHA) returning_values (:costounit, :ultcos);
            if (ULTIMO = 'S') then
                COSTO = ultcos * cantidad;
            else
                COSTO = costounit * cantidad;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            SUSPEND;
            END
        END
    if (BIN_AND(TIPO, 2) <> 0) then
        BEGIN
        TIPODOC = 32;
        FOR SELECT R.PREF_PRE, REVT_NUMERO, REVT_FECHA, D.ARTI_COD, RVDE_CANT * RVDE_FACTOR, RVDE_TOTAL-RVDE_IVAMONTO-RVDE_CONSUMO, RVDE_IVAMONTO, RVDE_CONSUMO,
            ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
            FROM REMISIONES_VENTA R, REMISIONES_VENTA_DETALLE D, PREFIJOS P, ARTICULO A
            WHERE R.REVT_ID = D.REVT_ID AND P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = 32 AND D.ARTI_COD = A.arti_cod AND
                A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
                A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN AND
                (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
                REVT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            ORDER BY D.ARTI_COD, REVT_FECHA, R.REVT_ID, RVDE_ITEM
            INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,
                :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
            DO
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            EXECUTE PROCEDURE costo_promedio_y_ultimo(:ARTICULO, :FECHA) returning_values (:costounit, :ultcos);
            if (ULTIMO = 'S') then
                COSTO = ultcos * cantidad;
            else
                COSTO = costounit * cantidad;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            SUSPEND;
            END
        END
    if (BIN_AND(TIPO, 4) <> 0) then
        BEGIN
        TIPODOC = 33;
        FOR SELECT V.PREF_PRE, DEVT_NUMERO, DEVT_FECHA, D.ARTI_COD, DVDE_CANT * DVDE_FACTOR, (DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO)*DEVT_FACTOR, DVDE_IVAMONTO*DEVT_FACTOR, DVDE_CONSUMO,
            ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
            FROM DEVOLUCIONES_VENTAS V, DEVOLUCIONES_VENTAS_DETALLE D, PREFIJOS P, ARTICULO A
            WHERE V.DEVT_ID = D.DEVT_ID AND P.PREF_PRE = V.PREF_PRE AND P.TIDO_COD = 33 AND D.ARTI_COD = A.arti_cod AND
                A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
                A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND
                (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
                DEVT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            ORDER BY D.ARTI_COD, DEVT_FECHA, V.DEVT_ID, DVDE_ITEM
            INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,
                :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
            DO
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            CANTIDAD = CANTIDAD * -1;
            EXECUTE PROCEDURE costo_promedio_y_ultimo(:ARTICULO, :FECHA) returning_values (:costounit, :ultcos);
            if (ULTIMO = 'S') then
                COSTO = ultcos * cantidad;
            else
                COSTO = costounit * cantidad;
            BASE = BASE * -1;
            IVA = IVA * -1;
            CONSUMO = CONSUMO * -1;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            SUSPEND;
            END
        END
    if (BIN_AND(TIPO, 8) <> 0) then
        BEGIN
        TIPODOC = 34;
        FOR SELECT P.PREF_PRE, PEDI_NUMERO, PEDI_FECHA, D.ARTI_COD, PEDE_CANT * PEDE_FACTOR, (PEDE_TOTAL-PEDE_IVAMONTO-PEDE_CONSUMO)*PEDI_FACTOR, PEDE_IVAMONTO*PEDI_FACTOR, PEDE_CONSUMO,
            ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD 
            FROM PEDIDOS P, PEDIDOS_DETALLE D, PREFIJOS R, ARTICULO A
            WHERE P.PEDI_ID = D.PEDI_ID AND P.PREF_PRE = R.PREF_PRE AND R.TIDO_COD = 34 AND D.ARTI_COD = A.arti_cod AND
                A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
                A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND
                (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
                PEDI_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            ORDER BY D.ARTI_COD, PEDI_FECHA, P.PEDI_ID, PEDE_ITEM
            INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,
                :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
            DO
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            EXECUTE PROCEDURE costo_promedio_y_ultimo(:ARTICULO, :FECHA) returning_values (:costounit, :ultcos);
            if (ULTIMO = 'S') then
                COSTO = ultcos * cantidad;
            else
                COSTO = costounit * cantidad;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            SUSPEND;
            END
        END
    if (BIN_AND(TIPO, 16) <> 0) then
        BEGIN
        TIPODOC = 35;
        FOR SELECT C.PREF_PRE, COTI_NUMERO, COTI_FECHA, D.ARTI_COD, CTDE_CANT * CTDE_FACTOR, (CTDE_TOTAL-CTDE_IVAMONTO-CTDE_CONSUMO)*COTI_FACTOR, CTDE_IVAMONTO*COTI_FACTOR, CTDE_CONSUMO,
            ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD 
            FROM COTIZACIONES C, COTIZACIONES_DETALLE D, PREFIJOS P, ARTICULO A
            WHERE C.COTI_ID = D.COTI_ID AND P.PREF_PRE = C.PREF_PRE AND P.TIDO_COD = 35 AND D.ARTI_COD = A.arti_cod AND
                A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
                A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND COTI_FECHA >= :FECINI AND COTI_FECHA <= :FECFIN AND
                (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
                COTI_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            ORDER BY D.ARTI_COD, COTI_FECHA, C.COTI_ID, CTDE_ITEM
            INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,
                :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
            DO
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            EXECUTE PROCEDURE costo_promedio_y_ultimo(:ARTICULO, :FECHA) returning_values (:costounit, :ultcos);
            if (ULTIMO = 'S') then
                COSTO = ultcos * cantidad;
            else
                COSTO = costounit * cantidad;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            SUSPEND;
            END
        END
    END
 $$IBE$$*/ SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE REVISA_PRECIOS(
    LISTA INTEGER,
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    ARTICULO VARCHAR(20),
    DESCR VARCHAR(60),
    GRUPO VARCHAR(2),
    SUBGRUPO VARCHAR(3),
    MARCA VARCHAR(3),
    COSTO NUMERIC(18,2),
    FIJO NUMERIC(18,2),
    UNIDAD VARCHAR(8),
    PORC NUMERIC(9,4),
    SUGERIDO NUMERIC(18,2),
    DIFER NUMERIC(18,2),
    NUEVO NUMERIC(18,2),
    OK CHAR(1))
AS
 /*$$IBE$$ declare variable marg numeric(9,4);
declare variable UOM VARCHAR(10);
declare variable BASE VARCHAR(10);
declare variable CAMBIO VARCHAR(10);
declare variable COSTOP numeric(18,2);
declare variable COSTOU numeric(18,2);
declare variable DIFMAX numeric(18,2);
declare variable DIG INTEGER;
declare variable TARIVA NUMERIC(9,4);
declare variable IVAINC CHAR(1);
declare variable LISTAREF INTEGER; $$IBE$$*/ 
begin /*$$IBE$$ 
execute procedure lee_configuracion ('FACTURACION', 'ARTICULOS', 'SUGERIR PRECIOS CON PORCENTAJE DE MARGEN O UTILIDAD') returning_values (:UOM);
EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION', 'ARTICULOS', 'REDONDEO AL MULTIPLO DE DIEZ EN PRECIOS') RETURNING_VALUES (:DIG);
EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION','ARTICULOS','CAMBIO DE PRECIOS AUTOMATICO AL CAMBIAR COSTO O PRECIO') returning_values (CAMBIO);
EXECUTE PROCEDURE lee_configuracion('FACTURACION','ARTICULOS','COSTO BASE PARA CALCULO DE PRECIOS DE VENTA AUTOMATICOS') returning_values (:BASE);
EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION','ARTICULOS','CODIGO DE LA LISTA DE PRECIOS BASE PARA CAMBIO DE PRECIOS AUTOMATICO') returning_values (LISTAREF);
EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION','ARTICULOS','DIFERENCIA EN PESOS MAXIMA A PERMITIR PARA CAMBIAR PRECIOS') returning_values (DIFMAX);
for select A.arti_cod, A.arti_des, A.grup_cod, A.subg_cod, A.marc_cod, A.arti_unidad, prar_fijo, prar_margen, prar_util, TAIV_PORC
    from precios_articulo p, articulo a, tarifa_iva T
    where a.arti_cod = p.arti_cod and lipr_cod = :lista and a.taiv_cod = t.taiv_cod and exists (select arti_cod from movimiento_articulo m where arti_cod = a.arti_cod and m.mvar_entrada = 'S' and m.mvar_tipodoc <> 33 and m.mvar_tipodoc <> 13 and m.mvar_fecha >= :fecini and m.mvar_fecha <= :fecfin)
    order by A.arti_cod
    into :articulo, descr, :grupo, :subgrupo, :marca, :unidad, :fijo, :marg, :porc, :tariva
    do
    begin
    if (UOM <> 'UTILIDAD') then
        PORC = MARG;
    if (CAMBIO = 'COSTO') then
        BEGIN
        EXECUTE PROCEDURE costo_promedio_y_ultimo (:ARTICULO, :FECFIN) RETURNING_VALUES(:COSTOP, :COSTOU);
        if (base = 'ULTIMO') then
            COSTO = COSTOU;
        ELSE
            BEGIN
            COSTO = COSTOP;
            if (base = 'MAYOR') then
                if (COSTOP < COSTOU) then
                    COSTO = COSTOU;
            END
        SELECT LIPR_MODIF FROM LISTA_PRECIOS WHERE LIPR_COD = :lista INTO :IVAINC;
        if (IVAINC = 'S') then
            COSTO = COSTO * (1 + TARIVA/100);
        if (UOM = 'UTILIDAD') then
            SUGERIDO = COSTO * (1 + :PORC/100);
        ELSE
            SUGERIDO = COSTO / (1 - :PORC/100);
        END
    ELSE
        if (LISTA <> LISTAREF) then
            BEGIN
            SELECT PRAR_FIJO FROM PRECIOS_ARTICULO WHERE ARTI_COD = :articulo AND LIPR_COD = :LISTAREF INTO :SUGERIDO;
            if (IVAINC = 'S') then
                SUGERIDO = SUGERIDO / (1 + TARIVA/100);
            if (UOM = 'UTILIDAD') then
                SUGERIDO = SUGERIDO * (1 + :PORC/100);
            ELSE
                SUGERIDO = SUGERIDO / (1 - :PORC/100);
            END
    EXECUTE PROCEDURE REDONDEE (SUGERIDO, DIG) returning_values (SUGERIDO);
    DIFER = SUGERIDO - FIJO;
    NUEVO = SUGERIDO;
    OK = 'S';
    if ((abs(DIFER) > DIFMAX) and (sugerido <> 0)) then
        suspend;
    end
 $$IBE$$*/ SUSPEND;
end
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE UTILIDAD_VENTAS(
    TIPO INTEGER,
    DETALLE CHAR(1),
    FECINI DATE,
    FECFIN DATE,
    PREFIJO VARCHAR(4),
    ULTIMO CHAR(1),
    SUBEMPRESA INTEGER)
RETURNS (
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    PTVTID INTEGER,
    VENDCOD INTEGER,
    NIT VARCHAR(20),
    NOMTERCERO VARCHAR(60),
    ARTICULO VARCHAR(15),
    ARTIDES VARCHAR(60),
    CANT NUMERIC(18,4),
    UNIDAD VARCHAR(8),
    PRECIO NUMERIC(18,2),
    COSTO NUMERIC(18,2),
    UTILIDAD NUMERIC(18,2),
    PORC NUMERIC(9,2))
AS
 /*$$IBE$$ declare variable IMPTOS CHAR(1);
declare variable ID INTEGER;
declare variable IVA NUMERIC(18,2);
declare variable COSTOT NUMERIC(18,2);
declare variable ULTCOS NUMERIC(18,2);
declare variable PRECIOT NUMERIC(18,2);
declare variable UOM VARCHAR(20);
declare variable icoinc char(2);
declare variable consumo NUMERIC(18,2);
declare variable factor NUMERIC(18,4); $$IBE$$*/ 
BEGIN /*$$IBE$$ 
EXECUTE PROCEDURE lee_configuracion ('FACTURACION', 'ARTICULOS', 'SUGERIR PRECIOS CON PORCENTAJE DE MARGEN O UTILIDAD') returning_values (:UOM);
EXECUTE PROCEDURE lee_configuracion ('FACTURACION', 'ARTICULOS', 'IMPOCONSUMO INCLUIDO EN EL PRECIO BASE DE VENTA ANTES DE IVA') returning_values (:icoinc);
 $$IBE$$*/ /* DETERMINE LA TABLA A EXAMINAR */ /*$$IBE$$ 
if (TIPO = 31) then
    BEGIN
     $$IBE$$*/ /* FACTURA */ /*$$IBE$$ 
    FOR SELECT FACT_ID, F.PREF_PRE, FACT_NUMERO, FACT_FECHA, PTVT_ID, VEND_COD, TERC_NIT, FACT_NOMCLIENTE, FACT_IVAINC, fact_factor
        FROM FACTURAS F, PREFIJOS P
        WHERE FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND FACT_ANULADO = 'N'
         AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = :TIPO AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
        ORDER BY FACT_FECHA, F.PREF_PRE, FACT_NUMERO
        INTO :ID, :PREF, :NUMERO, :FECHA, :PTVTID, :VENDCOD, :NIT, :NOMTERCERO, :IMPTOS, :factor
        DO
        if ((PREFIJO = '') or (PREFIJO = PREF)) then
          BEGIN
          COSTOT = 0;
          PRECIOT = 0;
          FOR SELECT D.ARTI_COD, SUBSTR(FADE_DESC,1,60), FADE_CANT * FADE_FACTOR, FADE_UNIDAD, (FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO)*:FACTOR, FADE_IVAMONTO, fade_consumo
            FROM FACTURAS_DETALLE D
            WHERE FACT_ID = :ID and substring(D.arti_cod from 1 FOR 2) <> '.t'
            INTO :ARTICULO, :ARTIDES, :CANT, :UNIDAD, :PRECIO, :IVA, :consumo
            DO
                BEGIN
                EXECUTE PROCEDURE costo_promedio_y_ultimo(:ARTICULO, :FECHA) returning_values (:COSTO, :ultcos);
                if (ULTIMO = 'S') then
                    COSTO = ultcos * CANT;
                else
                    COSTO = COSTO * CANT;
                if (DETALLE = 'S') then
                    BEGIN
                    UTILIDAD = PRECIO - COSTO;
                    if (UOM = 'UTILIDAD') then
                        EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                    else
                        EXECUTE PROCEDURE PORCENTAJE (utilidad,  PRECIO, 'S') returning_values (PORC);
                    SUSPEND;
                    END
                ELSE
                    BEGIN
                    COSTOT = COSTOT + COSTO;
                    PRECIOT = PRECIOT + PRECIO;
                    END
                END
          if (DETALLE <> 'S') then
            BEGIN
            COSTO = COSTOT;
            PRECIO = PRECIOT;
            UTILIDAD = PRECIO - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  PRECIO, 'S') returning_values (PORC);
            SUSPEND;
            END
          END
    END
  if (TIPO = 32) then
    BEGIN
     $$IBE$$*/ /* REMISION */ /*$$IBE$$ 
    FOR SELECT REVT_ID, R.PREF_PRE, REVT_NUMERO, REVT_FECHA, PTVT_ID, VEND_COD, TERC_NIT, REVT_NOMTERC, REVT_IVAINC
        FROM REMISIONES_VENTA R, PREFIJOS P
        WHERE REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN AND REVT_ANULADO = 'N'
         AND P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = :TIPO AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
        ORDER BY REVT_FECHA, R.PREF_PRE, REVT_NUMERO
        INTO :ID, :PREF, :NUMERO, :FECHA, :PTVTID, :VENDCOD, :NIT, :NOMTERCERO, :IMPTOS
        DO
        if ((PREFIJO = '') or (PREFIJO = PREF)) then
          BEGIN
          COSTOT = 0;
          PRECIOT = 0;
          FOR SELECT D.ARTI_COD, SUBSTR(RVDE_DESC,1,60), RVDE_CANT * RVDE_FACTOR, RVDE_UNIDAD, (RVDE_TOTAL-RVDE_IVAMONTO-RVDE_CONSUMO), RVDE_IVAMONTO, rvde_consumo
            FROM REMISIONES_VENTA_DETALLE D
            WHERE REVT_ID = :ID and substring(D.arti_cod from 1 FOR 2) <> '.t'
            INTO :ARTICULO, :ARTIDES, :CANT, :UNIDAD, :PRECIO, :IVA, :consumo
            DO
                BEGIN
                EXECUTE PROCEDURE costo_promedio_y_ultimo(:ARTICULO, :FECHA) returning_values (:COSTO, :ultcos);
                if (ULTIMO = 'S') then
                    COSTO = ultcos * CANT;
                else
                    COSTO = COSTO * CANT;
                if (DETALLE = 'S') then
                    BEGIN
                    UTILIDAD = PRECIO - COSTO;
                    if (UOM = 'UTILIDAD') then
                        EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                    else
                        EXECUTE PROCEDURE PORCENTAJE (utilidad,  PRECIO, 'S') returning_values (PORC);
                    SUSPEND;
                    END
                ELSE
                    BEGIN
                    COSTOT = COSTOT + COSTO;
                    PRECIOT = PRECIOT + PRECIO;
                    END
                END
          if (DETALLE <> 'S') then
            BEGIN
            COSTO = COSTOT;
            PRECIO = PRECIOT;
            UTILIDAD = PRECIO - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  PRECIO, 'S') returning_values (PORC);
            SUSPEND;
            END
          END
    END
  if (TIPO = 33) then
    BEGIN
     $$IBE$$*/ /* DEVOLUCION */ /*$$IBE$$ 
    FOR SELECT DEVT_ID, D.PREF_PRE, DEVT_NUMERO, DEVT_FECHA, PTVT_ID, VEND_COD, TERC_NIT, DEVT_NOMTERC, DEVT_IVAINC, DEVT_FACTOR
        FROM DEVOLUCIONES_VENTAS D, PREFIJOS P
        WHERE DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND DEVT_ANULADO = 'N'
         AND P.PREF_PRE = D.PREF_PRE AND P.TIDO_COD = :TIPO AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
        ORDER BY DEVT_FECHA, D.PREF_PRE, DEVT_NUMERO
        INTO :ID, :PREF, :NUMERO, :FECHA, :PTVTID, :VENDCOD, :NIT, :NOMTERCERO, :IMPTOS, :FACTOR
        DO
        if ((PREFIJO = '') or (PREFIJO = PREF)) then
          BEGIN
          COSTOT = 0;
          PRECIOT = 0;
          FOR SELECT D.ARTI_COD, SUBSTR(DVDE_DESC,1,60), DVDE_CANT * DVDE_FACTOR, DVDE_UNIDAD, (DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO)*:FACTOR, DVDE_IVAMONTO, dvde_consumo
            FROM DEVOLUCIONES_VENTAS_DETALLE D
            WHERE DEVT_ID = :ID and substring(D.arti_cod from 1 FOR 2) <> '.t'
            INTO :ARTICULO, :ARTIDES, :CANT, :UNIDAD, :PRECIO, :IVA, :consumo
            DO
                BEGIN
                EXECUTE PROCEDURE costo_promedio_y_ultimo(:ARTICULO, :FECHA) returning_values (:COSTO, :ultcos);
                if (ULTIMO = 'S') then
                    COSTO = ultcos * CANT;
                else
                    COSTO = COSTO * CANT;
                if (DETALLE = 'S') then
                    BEGIN
                    UTILIDAD = PRECIO - COSTO;
                    if (UOM = 'UTILIDAD') then
                        EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                    else
                        EXECUTE PROCEDURE PORCENTAJE (utilidad,  PRECIO, 'S') returning_values (PORC);
                    SUSPEND;
                    END
                ELSE
                    BEGIN
                    COSTOT = COSTOT + COSTO;
                    PRECIOT = PRECIOT + PRECIO;
                    END
                END
        if (DETALLE <> 'S') then
            BEGIN
            COSTO = COSTOT;
            PRECIO = PRECIOT;
            UTILIDAD = PRECIO - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  PRECIO, 'S') returning_values (PORC);
            SUSPEND;
            END
        END
    END
  if (TIPO = 34) then
    BEGIN
     $$IBE$$*/ /* PEDIDO */ /*$$IBE$$ 
    FOR SELECT PEDI_ID, P.PREF_PRE, PEDI_NUMERO, PEDI_FECHA, PTVT_ID, VEND_COD, TERC_NIT, PEDI_NOMTERC, PEDI_IVAINC, PEDI_FACTOR
        FROM PEDIDOS P, PREFIJOS R
        WHERE PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND PEDI_ANULADO = 'N'
         AND P.PREF_PRE = R.PREF_PRE AND R.TIDO_COD = :TIPO AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
        ORDER BY PEDI_FECHA, P.PREF_PRE, PEDI_NUMERO
        INTO :ID, :PREF, :NUMERO, :FECHA, :PTVTID, :VENDCOD, :NIT, :NOMTERCERO, :IMPTOS, :FACTOR
        DO
        if ((PREFIJO = '') or (PREFIJO = PREF)) then
          BEGIN
          COSTOT = 0;
          PRECIOT = 0;
          FOR SELECT ARTI_COD, SUBSTR(PEDE_DESC,1,60), PEDE_CANT * PEDE_FACTOR, PEDE_UNIDAD, (PEDE_TOTAL-PEDE_IVAMONTO-PEDE_CONSUMO)*:FACTOR, PEDE_IVAMONTO, pede_consumo
            FROM PEDIDOS_DETALLE
            WHERE PEDI_ID = :ID
            INTO :ARTICULO, :ARTIDES, :CANT, :UNIDAD, :PRECIO, :IVA, :consumo
            DO
                BEGIN
                EXECUTE PROCEDURE costo_promedio_y_ultimo(:ARTICULO, :FECHA) returning_values (:COSTO, :ultcos);
                if (ULTIMO = 'S') then
                    COSTO = ultcos * CANT;
                else
                    COSTO = COSTO * CANT;
                if (DETALLE = 'S') then
                    BEGIN
                    UTILIDAD = PRECIO - COSTO;
                    if (UOM = 'UTILIDAD') then
                        EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                    else
                        EXECUTE PROCEDURE PORCENTAJE (utilidad,  PRECIO, 'S') returning_values (PORC);
                    SUSPEND;
                    END
                ELSE
                    BEGIN
                    COSTOT = COSTOT + COSTO;
                    PRECIOT = PRECIOT + PRECIO;
                    END
                END
        if (DETALLE <> 'S') then
            BEGIN
            COSTO = COSTOT;
            PRECIO = PRECIOT;
            UTILIDAD = PRECIO - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  PRECIO, 'S') returning_values (PORC);
            SUSPEND;
            END
        END
    END
  if (TIPO = 35) then
    BEGIN
     $$IBE$$*/ /* COTIZACION */ /*$$IBE$$ 
    FOR SELECT COTI_ID, C.PREF_PRE, COTI_NUMERO, COTI_FECHA, PTVT_ID, VEND_COD, TERC_NIT, COTI_NOMTERC, COTI_IMPTOS, COTI_FACTOR
        FROM COTIZACIONES C, PREFIJOS P
        WHERE COTI_FECHA >= :FECINI AND COTI_FECHA <= :FECFIN AND COTI_ANULADO = 'N'
         AND P.PREF_PRE = C.PREF_PRE AND P.TIDO_COD = :TIPO AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
        ORDER BY COTI_FECHA, C.PREF_PRE, COTI_NUMERO
        INTO :ID, :PREF, :NUMERO, :FECHA, :PTVTID, :VENDCOD, :NIT, :NOMTERCERO, :IMPTOS, :FACTOR
        DO
        if ((PREFIJO = '') or (PREFIJO = PREF)) then
          BEGIN
          COSTOT = 0;
          PRECIOT = 0;
          FOR SELECT ARTI_COD, SUBSTR(CTDE_DESC,1,60), CTDE_CANT * CTDE_FACTOR, CTDE_UNIDAD, (CTDE_TOTAL-CTDE_IVAMONTO-CTDE_CONSUMO)*:FACTOR, CTDE_IVAMONTO, ctde_consumo
            FROM COTIZACIONES_DETALLE
            WHERE COTI_ID = :ID
            INTO :ARTICULO, :ARTIDES, :CANT, :UNIDAD, :PRECIO, :IVA, :consumo
            DO
                BEGIN
                EXECUTE PROCEDURE costo_promedio_y_ultimo(:ARTICULO, :FECHA) returning_values (:COSTO, :ultcos);
                if (ULTIMO = 'S') then
                    COSTO = ultcos * CANT;
                else
                    COSTO = COSTO * CANT;
                if (DETALLE = 'S') then
                    BEGIN
                    UTILIDAD = PRECIO - COSTO;
                    if (UOM = 'UTILIDAD') then
                        EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                    else
                        EXECUTE PROCEDURE PORCENTAJE (utilidad,  PRECIO, 'S') returning_values (PORC);
                    SUSPEND;
                    END
                ELSE
                    BEGIN
                    COSTOT = COSTOT + COSTO;
                    PRECIOT = PRECIOT + PRECIO;
                    END
                END
        if (DETALLE <> 'S') then
            BEGIN
            COSTO = COSTOT;
            PRECIO = PRECIOT;
            UTILIDAD = PRECIO - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  PRECIO, 'S') returning_values (PORC);
            SUSPEND;
            END
        END
    END
 $$IBE$$*/ SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE CHEQUEO_COSTOS(
    ARTICULO VARCHAR(20),
    FECHA DATE)
AS
 /*$$IBE$$ declare variable NUMROWS INTEGER;
DECLARE VARIABLE ID INTEGER;
DECLARE VARIABLE FECMV DATE;
DECLARE VARIABLE CANT NUMERIC(15,4);
DECLARE VARIABLE COSTO NUMERIC(18,2);
DECLARE VARIABLE ENTRADA CHAR(1);
DECLARE VARIABLE TIPO INTEGER; $$IBE$$*/ 
begin /*$$IBE$$ 
SELECT COUNT(*) FROM COSTOS WHERE ARTI_COD = :ARTICULO AND COST_FECHA > :FECHA INTO :NUMROWS;
if (NUMROWS > 0) then
    BEGIN
    delete from costos where arti_cod = :ARTICULO AND COST_FECHA >= :FECHA;
    for select mvar_cons, mvar_fecha, mvar_cant, mvar_costo, mvar_entrada, mvar_tipodoc
        from movimiento_articulo WHERE ARTI_COD = :ARTICULO AND MVAR_FECHA >= :FECHA
        order by mvar_fecha, mvar_cons  $$IBE$$*/ /* SE HACE ESTRICTAMENTE EN ORDEN DE FECHA Y REGISTRO, SI LO EDITAN CAMBIA EL ORDEN */ /*$$IBE$$ 
        into :id, :fecmv, :cant, :costo, :entrada, :tipo
        do
        if ((TIPO <> 13)) then
            EXECUTE PROCEDURE actualice_costo(:ARTICULO, :fecmv, :costo, :cant, :entrada, 'N', :id, :tipo);
    END
 $$IBE$$*/ EXIT;
end
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE CHEQUEO_INVENTARIO(
    ARTINI VARCHAR(20),
    ARTFIN VARCHAR(20))
AS
 /*$$IBE$$ DECLARE VARIABLE FECHA DATE;
DECLARE VARIABLE CANT NUMERIC(15,4);
DECLARE VARIABLE COSTO NUMERIC(18,2);
DECLARE VARIABLE ENTRADA CHAR(1);
DECLARE VARIABLE BODEGA CHAR(2);
DECLARE VARIABLE ID INTEGER;
DECLARE VARIABLE TIPO INTEGER;
declare variable TIPOEX CHAR(1);
DECLARE VARIABLE LOTE VARCHAR(20);
DECLARE VARIABLE EXISTE INTEGER;
declare variable ARTICULO VARCHAR(20);
declare variable IDL INTEGER; $$IBE$$*/ 
BEGIN /*$$IBE$$ 
for select arti_cod from articulo where arti_cod >= :artini and arti_cod <= :artfin into :ARTICULO
  DO
  BEGIN
  DELETE FROM existencia_lote where arti_cod = :articulo;
  DELETE FROM lotes where arti_cod = :articulo;
  delete from costos where arti_cod = :ARTICULO;
  delete from existencia WHERE ARTI_COD = :ARTICULO;
  for select mvar_cons, mvar_fecha, mvar_cant, mvar_costo, mvar_entrada, bode_cod, mvar_tipodoc, mvar_lote
    from movimiento_articulo WHERE ARTI_COD = :ARTICULO
    order by mvar_fecha, mvar_cons
    into :id, :fecha, :cant, :costo, :entrada, :bodega, :tipo, :lote
  do
    begin
    SELECT ARTI_EXIST
        FROM   ARTICULO
        WHERE  ARTICULO.ARTI_COD = :ARTICULO
        INTO :TIPOEX;
    if ((TIPO <> 13)) then
        EXECUTE PROCEDURE actualice_costo(:ARTICULO, :fecha, :costo, :cant, :entrada, 'N', :id, :tipo);
     $$IBE$$*/ /* actualice existencias */ /*$$IBE$$ 
    if (:entrada = 'S') then
        begin
        execute procedure sume_existencia(:articulo, :bodega, :fecha, :cant, 'N');
        if (TIPOEX = 'L') then
            begin
            SELECT COUNT(*) FROM LOTES WHERE ARTI_COD = :ARTICULO AND BODE_COD = :BODEGA AND LOTE_NRO = :lote INTO :EXISTE;
            if (EXISTE > 0) then
                UPDATE LOTES
                    set lote_saldo = lote_saldo + :cant
                    where (arti_cod = :ARTICULO) and (BODE_COD = :BODEGA) AND (lote_nro = :lote);
            ELSE
                INSERT INTO LOTES (ARTI_COD, BODE_COD, LOTE_NRO, LOTE_FECHA, LOTE_CANT, LOTE_COSTO, LOTE_SALDO)
                    VALUES (:ARTICULO, :bodega, :lote, :fecha, :cant, :costo, :cant);
            end
        end
    else
        begin
        execute procedure reste_existencia(:articulo, :bodega, :fecha, :cant, 'N');
        if (TIPOEX = 'L') then
            begin
            SELECT COUNT(*) FROM LOTES WHERE ARTI_COD = :ARTICULO AND BODE_COD = :BODEGA AND LOTE_NRO = :lote INTO :EXISTE;
            if (EXISTE > 0) then
                UPDATE LOTES
                    set lote_saldo = lote_saldo - :cant
                    where (arti_cod = :ARTICULO) AND (BODE_COD = :BODEGA) and (lote_nro = :lote);
            ELSE
                BEGIN
                 $$IBE$$*/ /* ARREGLE EL LOTE YA QUE NO EXISTE */ /*$$IBE$$ 
                SELECT MIN(LOTE_ID) FROM LOTES WHERE ARTI_COD = :articulo AND BODE_COD = :BODEGA AND LOTE_SALDO >= :cant INTO :IDL;
                SELECT LOTE_NRO FROM LOTES WHERE LOTE_ID = :IDL INTO :LOTE;
                UPDATE MOVIMIENTO_ARTICULO SET MVAR_LOTE = :LOTE WHERE MVAR_CONS = :ID;
                UPDATE LOTES
                    set lote_saldo = lote_saldo - :cant
                    where (arti_cod = :ARTICULO) and (BODE_COD = :BODEGA) AND (lote_nro = :lote);
                END
            SELECT COUNT(*) FROM EXISTENCIA_LOTE
                WHERE LOTE_NRO = :LOTE AND EXLO_FECHA = :FECHA AND ARTI_COD = :ARTICULO AND BODE_COD = :bodega
                INTO :EXISTE;
            if (EXISTE > 0) then
                UPDATE EXISTENCIA_LOTE
                       SET EXLO_SAL = EXLO_SAL + :cant
                    WHERE LOTE_NRO = :LOTE AND EXLO_FECHA = :FECHA AND ARTI_COD = :ARTICULO AND BODE_COD = :bodega;
            else
                INSERT INTO EXISTENCIA_LOTE (ARTI_COD, BODE_COD, LOTE_NRO, EXLO_FECHA, EXLO_SAL)
                    VALUES (:ARTICULO, :BODEGA, :LOTE, :FECHA, :CANT);
            end
        end
    END
  END
 $$IBE$$*/ EXIT;
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE CAMBIO_PRECIOS(
    FECHA DATE)
AS
 /*$$IBE$$ declare variable ART VARCHAR(20); $$IBE$$*/ 
BEGIN /*$$IBE$$ 
FOR SELECT ARTI_COD FROM ARTICULO INTO :ART DO
    EXECUTE PROCEDURE CALCULA_PRECIOS(:ART, :FECHA);
  SUSPEND;
 $$IBE$$*/ EXIT;
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE ACTUALICE_COSTO(
    ARTICULO VARCHAR(15),
    FECHA DATE,
    COSTO NUMERIC(18,2),
    CANTIDAD NUMERIC(18,2),
    ENTRADA CHAR(1),
    ANULAR CHAR(1),
    IDMOV INTEGER,
    TIPO INTEGER)
AS
DECLARE VARIABLE saldo NUMERIC(18,2);
DECLARE VARIABLE COSTOP NUMERIC(18,2);
DECLARE VARIABLE exart CHAR(1);
DECLARE VARIABLE UCOSTO NUMERIC(18,2);
declare variable FECAUX DATE;
declare variable SALDOC NUMERIC(15,4);
declare variable ITEM INTEGER;
declare variable UNIDAD VARCHAR(8);
BEGIN
/* Verfique si el artículo tiene control de existencias */
SELECT arti_exist, ARTI_UNIDAD FROM articulo WHERE arti_COD = :articulo
    INTO :exart, :UNIDAD;
IF (exart <> 'N') THEN
    BEGIN
    if (ANULAR = 'S') then
        BEGIN
        select cost_saldoc, cost_saldop from costos
            WHERE (arti_cod = :articulo) AND (cost_fecha = :fecha) AND (cost_idmov = :IDMOV) AND (COST_TIPO = :TIPO)
            into :SALDOC, :SALDO; /* para dejar inicializadas las 2 variables */
        DELETE FROM COSTOS WHERE (arti_cod = :articulo) AND (cost_fecha = :fecha) AND (cost_idmov = :IDMOV) AND (COST_TIPO = :TIPO);
        /* para inicializar el ultimo costo */
        SELECT MAX(COST_FECHA) FROM costos
            WHERE (arti_cod = :articulo) AND (cost_fecha <= :fecha) INTO :FECAUX;
        if (FECAUX IS NULL) then
            UCOSTO = 0;
        ELSE
            BEGIN
            SELECT MAX(COST_ITEM) FROM costos
                WHERE (arti_cod = :articulo) AND (cost_fecha = :fecaux) INTO :ITEM;
            SELECT COST_ULTIMO FROM costos
                WHERE (arti_cod = :articulo) AND (cost_fecha = :fecaux) AND (cost_item = :ITEM) INTO :UCOSTO;
            END
        END
    ELSE
        BEGIN
        select max(cost_fecha) from costos WHERE (arti_cod = :articulo) AND (cost_fecha <= :fecha) into :fecaux;
        select max(cost_item) from costos WHERE (arti_cod = :articulo) AND (cost_fecha = :fecaux) into :item;
        select (cost_saldoc + cost_entc - cost_salc) from costos WHERE (arti_cod = :articulo) AND (cost_fecha = :fecaux) AND (cost_item = :item) into :saldoc;
        if (saldoc is null) THEN
            SALDOC = 0;
        EXECUTE PROCEDURE costo_promedio_y_ultimo(:articulo, :fecha) RETURNING_VALUES (:costop, :ucosto);
        if (ENTRADA = 'S') then
            if (TIPO = 33) then
                BEGIN
                INSERT INTO COSTOS (arti_cod, cost_fecha,
                    cost_entc, cost_entp, cost_salc, cost_salp,
                    cost_saldoc, cost_saldop, cost_ultimo, cost_idmov, cost_tipo)
                    VALUES (:articulo, :fecha, :cantidad, :cantidad*:costop, 0, 0, :saldoc, :saldoc*:costop, :ucosto, :IDMOV, :TIPO);
                SALDO = (SALDOC * COSTOP) + (CANTIDAD * COSTOP);
                SALDOC = SALDOC + CANTIDAD;
                END
            ELSE
                BEGIN
                UCOSTO = :COSTO;
                INSERT INTO COSTOS (arti_cod, cost_fecha,
                    cost_entc, cost_entp, cost_salc, cost_salp,
                    cost_saldoc, cost_saldop, cost_ultimo, cost_idmov, cost_tipo)
                    VALUES (:articulo, :fecha, :cantidad, :cantidad*:costo, 0, 0, :saldoc, :saldoc*:costop, :costo, :IDMOV, :TIPO);
                SALDO = (SALDOC * COSTOP) + (CANTIDAD * COSTO);
                SALDOC = SALDOC + CANTIDAD;
                END
        ELSE
            BEGIN
            INSERT INTO COSTOS (arti_cod, cost_fecha,
                cost_entc, cost_entp, cost_salc, cost_salp,
                cost_saldoc, cost_saldop, cost_ultimo, cost_idmov, cost_tipo)
                VALUES (:articulo, :fecha, 0, 0, :cantidad, :cantidad*:costop, :saldoc, :saldoc*:costop, :UCOSTO, :IDMOV, :TIPO);
            SALDOC = SALDOC - CANTIDAD;
            SALDO = SALDOC * COSTOP; /* YA ESTA RESTADA LA CANTIDAD */
            END
        END
    END
END

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE CALCULA_PRECIOS(
    ARTICULO VARCHAR(20),
    FECHA DATE)
AS
declare variable LISTA INTEGER;
declare variable MARGEN NUMERIC(9, 4);
declare variable UTIL NUMERIC(9, 4);
declare variable UNIDAD VARCHAR(8);
declare variable UOR VARCHAR(20);
declare variable COSTOP NUMERIC(18, 2);
declare variable COSTOU NUMERIC(18, 2);
declare variable COSTO NUMERIC(18, 2);
declare variable DIG INTEGER;
declare variable IVAINC CHAR(1);
declare variable TARIVA NUMERIC(9,2);
declare variable AUTOM CHAR(1);
declare variable BASE varchar(10);
declare variable CAMBIO CHAR(7);
BEGIN
EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION','ARTICULOS','CAMBIO DE PRECIOS AUTOMATICO AL CAMBIAR COSTO O PRECIO') returning_values (CAMBIO);
if (CAMBIO = 'COSTO') then
  BEGIN
  FOR SELECT P.LIPR_COD, PRAR_MARGEN, PRAR_UTIL, LIPR_MODIF, PRAR_AUTO
    FROM PRECIOS_ARTICULO P, LISTA_PRECIOS L
    WHERE P.LIPR_COD = L.LIPR_COD AND ARTI_COD = :articulo
    INTO :LISTA, :MARGEN, :UTIL, :IVAINC, :AUTOM
    DO
      if (AUTOM = 'S') then
        BEGIN
        if (UTIL IS NULL) then
            UTIL = 0;
        if (MARGEN IS NULL) then
            MARGEN = 0;
        SELECT ARTI_UNIDAD, TAIV_PORC FROM ARTICULO A, TARIFA_IVA T WHERE A.TAIV_COD = T.TAIV_COD AND ARTI_COD = :ARTICULO INTO :UNIDAD, :TARIVA;
        EXECUTE PROCEDURE lee_configuracion('FACTURACION','ARTICULOS','COSTO BASE PARA CALCULO DE PRECIOS DE VENTA AUTOMATICOS') returning_values (:BASE);
        EXECUTE PROCEDURE costo_promedio_y_ultimo (:ARTICULO, :FECHA) RETURNING_VALUES(:COSTOP, :COSTOU);
        if (base = 'ULTIMO') then
            COSTO = COSTOU;
        ELSE
            BEGIN
            COSTO = COSTOP;
            if (base = 'MAYOR') then
                if (COSTOP < COSTOU) then
                    COSTO = COSTOU;
            END
        if (IVAINC = 'S') then
            COSTO = COSTO * (1 + TARIVA/100);
        EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION', 'ARTICULOS', 'SUGERIR PRECIOS CON PORCENTAJE DE MARGEN O UTILIDAD') RETURNING_VALUES (:UOR);
        EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION', 'ARTICULOS', 'REDONDEO AL MULTIPLO DE DIEZ EN PRECIOS') RETURNING_VALUES (:DIG);
        if (UOR = 'UTILIDAD') then
            BEGIN
            COSTO = COSTO * (1 + :UTIL/100);
            EXECUTE PROCEDURE REDONDEE (COSTO, DIG) returning_values (COSTO);
            UPDATE PRECIOS_ARTICULO
                SET PRAR_FIJO = :COSTO
                WHERE ARTI_COD = :ARTICULO AND LIPR_COD = :LISTA;
            END
        ELSE
            BEGIN
            COSTO = COSTO / (1 - :MARGEN/100);
            EXECUTE PROCEDURE REDONDEE (COSTO, DIG) returning_values (COSTO);
            UPDATE PRECIOS_ARTICULO
                SET PRAR_FIJO = :COSTO
                WHERE ARTI_COD = :ARTICULO AND LIPR_COD = :LISTA;
            END
        END
  END
END

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE REP_DISPONIBILIDAD(
    FECHA DATE,
    ARTINI VARCHAR(20),
    ARTFIN VARCHAR(20),
    GRPINI VARCHAR(3),
    GRPFIN VARCHAR(3),
    ORDEN CHAR(1),
    CEROS CHAR(1),
    DETALLE CHAR(1),
    AGRUPA CHAR(1),
    SUCURSAL INTEGER)
RETURNS (
    CODIGO VARCHAR(15),
    NOMBRE VARCHAR(60),
    UNIDAD VARCHAR(8),
    CODGRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    CODSUBG VARCHAR(3),
    NOMSUBG VARCHAR(30),
    CODMARC VARCHAR(3),
    NOMMARC VARCHAR(30),
    CODBOD VARCHAR(2),
    NOMBOD VARCHAR(30),
    EXIST NUMERIC(18,4),
    PROMEDIO NUMERIC(18,4),
    SALIDAS NUMERIC(18,4),
    DISPONIBILIDAD INTEGER,
    DIAS INTEGER,
    PROMEDIADO INTEGER,
    COSTO NUMERIC(18,2),
    COSTOPRO NUMERIC(18,2),
    SUGERIDO NUMERIC(18,4),
    FECCOMPRA DATE)
AS
DECLARE VARIABLE CODINI VARCHAR(20);
DECLARE VARIABLE CODFIN VARCHAR(20);
DECLARE VARIABLE DESINI VARCHAR(20);
DECLARE VARIABLE DESFIN VARCHAR(20);
DECLARE VARIABLE MARINI VARCHAR(20);
DECLARE VARIABLE MARFIN VARCHAR(20);
declare variable DIASC VARCHAR(255);
declare variable DIA_ART VARCHAR(2) CHARACTER SET NONE;
BEGIN
if (ORDEN = 'C') then
    BEGIN
    CODINI = ARTINI;
    CODFIN = ARTFIN;
    DESINI = '';
    DESFIN = 'zz';
    END
ELSE
    BEGIN
    DESINI = ARTINI;
    DESFIN = ARTFIN;
    CODINI = '';
    CODFIN = 'zz';
    END
if (AGRUPA = 'G') then
    BEGIN
    MARINI = '';
    MARFIN = 'zz';
    END
ELSE
    if (AGRUPA = 'M') then
        BEGIN
        MARINI = GRPINI;
        MARFIN = GRPFIN;
        GRPINI = '';
        GRPFIN = 'zz';
        END
if (DETALLE = 'S') then
  BEGIN
  FOR SELECT ARTI_COD, ARTI_DES, ARTI_UNIDAD, ARTI_DIAS, A.GRUP_COD, GRUP_NOM, A.SUBG_COD, A.MARC_COD, BODE_COD, BODE_NOM, ARTI_DIANALIS
      FROM ARTICULO A, GRUPO G, BODEGA B
      WHERE ARTI_COD >= :CODINI AND ARTI_COD <= :CODFIN AND A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :GRPFIN AND ARTI_DES >= :DESINI AND ARTI_DES <= :DESFIN AND
      G.GRUP_COD = A.GRUP_COD AND A.ESAR_COD <> 'I' AND ((SUCU_ID = :SUCURSAL) or (:SUCURSAL = 0)) AND
      (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN)))
      INTO :CODIGO, :NOMBRE, :UNIDAD, :DIAS, :CODGRUPO, :NOMGRUPO, :CODSUBG, :CODMARC, :CODBOD, :NOMBOD, :PROMEDIADO
      DO
        BEGIN
        NOMMARC = '';
        NOMSUBG = '';
        SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO :NOMMARC;
        SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
        EXECUTE PROCEDURE costo_promedio_y_ultimo(:CODIGO, :FECHA) RETURNING_VALUES (:costopro, :COSTO);
        EXECUTE PROCEDURE DISPONIBILIDAD_ARTICULO(CODIGO, FECHA, :CODBOD) returning_values (:DISPONIBILIDAD, :EXIST, :PROMEDIO, :SALIDAS);
        /*ESTABLECER CUAL ES EL VALOR DE DIAS PARA PROMEDIO*/
        EXECUTE PROCEDURE lee_configuracion ('INVENTARIO', 'EXISTENCIAS', 'PROMEDIAR LAS SALIDAS DEL INVENTARIO CON EL NUMERO DE DIAS ASIGNADO A CADA ARTICULO') returning_values (:DIA_ART);
        if (DIA_ART = 'NO') then
          BEGIN
            EXECUTE PROCEDURE lee_configuracion ('INVENTARIO', 'EXISTENCIAS', 'NUMERO DE DIAS PARA PROMEDIO DE SALIDAS POR ARTICULO') returning_values (DIASC);
            PROMEDIADO = CAST(DIASC AS INTEGER);
          END
        if ((DISPONIBILIDAD < DIAS) and (PROMEDIO > 0))then
            SUGERIDO = (DIAS * PROMEDIO) - EXIST;
        ELSE
            SUGERIDO = 0;
        SELECT MAX(FACO_FECHA) FROM FACTURAS_COMPRA F, FACTURAS_COMPRAS_DETALLE D
            WHERE F.FACO_ID = D.faco_id AND D.ARTI_COD = :CODIGO AND FACO_FECHA <= :FECHA AND D.bode_cod = :codbod
            INTO :FECCOMPRA;
        if ((PROMEDIO > 0) or (EXIST <> 0) or (CEROS = 'S')) then
            SUSPEND;
        END
  END
ELSE
  BEGIN
  FOR SELECT ARTI_COD, ARTI_DES, ARTI_UNIDAD, ARTI_DIAS, A.GRUP_COD, GRUP_NOM, A.SUBG_COD, A.MARC_COD, ARTI_DIANALIS
      FROM ARTICULO A, GRUPO G
      WHERE ARTI_COD >= :CODINI AND ARTI_COD <= :CODFIN AND A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :GRPFIN AND ARTI_DES >= :DESINI AND ARTI_DES <= :DESFIN AND G.GRUP_COD = A.GRUP_COD AND
      A.ESAR_COD <> 'I' AND (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN)))
      INTO :CODIGO, :NOMBRE, :UNIDAD, :DIAS, :CODGRUPO, :NOMGRUPO, :CODSUBG, :CODMARC, :PROMEDIADO
      DO
        BEGIN
        NOMMARC = '';
        NOMSUBG = '';
        SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO :NOMMARC;
        SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
        EXECUTE PROCEDURE costo_promedio_y_ultimo(:CODIGO, :FECHA) RETURNING_VALUES (:costopro, :COSTO);
        EXECUTE PROCEDURE DISPONIBILIDAD_TOTAL_ARTICULO(CODIGO, FECHA) returning_values (:DISPONIBILIDAD, :EXIST, :PROMEDIO, :SALIDAS);
        /*ESTABLECER CUAL ES EL VALOR DE DIAS PARA PROMEDIO*/
        EXECUTE PROCEDURE lee_configuracion ('INVENTARIO', 'EXISTENCIAS', 'PROMEDIAR LAS SALIDAS DEL INVENTARIO CON EL NUMERO DE DIAS ASIGNADO A CADA ARTICULO') returning_values (:DIA_ART);
        if (DIA_ART = 'NO') then
          BEGIN
            EXECUTE PROCEDURE lee_configuracion ('INVENTARIO', 'EXISTENCIAS', 'NUMERO DE DIAS PARA PROMEDIO DE SALIDAS POR ARTICULO') returning_values (DIASC);
            PROMEDIADO = CAST(DIASC AS INTEGER);
          END
        if ((DISPONIBILIDAD < DIAS) and (PROMEDIO > 0))then
            SUGERIDO = (DIAS * PROMEDIO) - EXIST;
        ELSE
            SUGERIDO = 0;
        SELECT MAX(FACO_FECHA) FROM FACTURAS_COMPRA F, FACTURAS_COMPRAS_DETALLE D
            WHERE F.FACO_ID = D.faco_id AND D.ARTI_COD = :CODIGO AND FACO_FECHA <= :FECHA
            INTO :FECCOMPRA;
        if ((PROMEDIO > 0) or (EXIST <> 0) or (CEROS = 'S')) then
            SUSPEND;
        END
  END
END

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE REP_UTILIDAD_VENTAS(
    TIPO INTEGER,
    DETALLE CHAR(1),
    FECINI DATE,
    FECFIN DATE,
    ARTINI VARCHAR(15),
    ARTFIN VARCHAR(15),
    GRPINI VARCHAR(3),
    GRPFIN VARCHAR(3),
    ORDEN CHAR(1),
    AGRUPA CHAR(1),
    ULTIMO CHAR(1),
    CEROS CHAR(1),
    SUBEMPRESA INTEGER)
RETURNS (
    ARTICULO VARCHAR(15),
    DESCRIPCION VARCHAR(60),
    CODGRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    CODSUBG VARCHAR(3),
    NOMSUBG VARCHAR(30),
    CODMARC VARCHAR(3),
    NOMMARC VARCHAR(30),
    UNIDAD VARCHAR(8),
    CANTIDAD NUMERIC(18,4),
    BASE NUMERIC(18,4),
    COSTO NUMERIC(18,4),
    UTILIDAD NUMERIC(18,4),
    PORC NUMERIC(9,2),
    IVA NUMERIC(18,4),
    CONSUMO NUMERIC(18,4),
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    TIPODOC INTEGER)
AS
DECLARE VARIABLE COSTOUNIT NUMERIC(18,4);
DECLARE VARIABLE CANTDET NUMERIC(18,4);
declare variable CODINI VARCHAR(15);
declare variable CODFIN VARCHAR(15);
declare variable DESINI VARCHAR(15);
declare variable DESFIN VARCHAR(15);
declare variable MARINI VARCHAR(3);
declare variable MARFIN VARCHAR(3);
declare variable UOM VARCHAR(20);
declare variable NUMROWS INTEGER;
declare variable ULTCOS NUMERIC(18,2);
BEGIN
if (ORDEN = 'C') then
    BEGIN
    CODINI = ARTINI;
    CODFIN = ARTFIN;
    DESINI = '';
    DESFIN = 'zz';
    END
ELSE
    BEGIN
    DESINI = ARTINI;
    DESFIN = ARTFIN;
    CODINI = '';
    CODFIN = 'zz';
    END
if (AGRUPA = 'G') then
    BEGIN
    MARINI = '';
    MARFIN = 'zz';
    END
ELSE
    if (AGRUPA = 'M') then
        BEGIN
        MARINI = GRPINI;
        MARFIN = GRPFIN;
        GRPINI = '';
        GRPFIN = 'zz';
        END
    ELSE
        BEGIN
        MARINI = '';
        MARFIN = 'zz';
        GRPINI = '';
        GRPFIN = 'zz';
        END
EXECUTE PROCEDURE lee_configuracion ('FACTURACION', 'ARTICULOS', 'SUGERIR PRECIOS CON PORCENTAJE DE MARGEN O UTILIDAD') returning_values (:UOM);
if (DETALLE = 'N') then
    BEGIN
    if (BIN_AND(TIPO, 1) <> 0) then
        BEGIN
        TIPODOC = 31;
        /* BORRA LA TABLA AUXILIAR */
        DELETE FROM reportes_aux WHERE REPA_ID = 2 AND REPA_USER = USER;

        FOR SELECT MAX(D.ARTI_COD), SUM(FADE_CANT * FADE_FACTOR), SUM((FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO)*FACT_FACTOR), SUM(FADE_IVAMONTO*FACT_FACTOR), SUM(FADE_CONSUMO),
            MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD)
            FROM FACTURAS_DETALLE D, FACTURAS F, PREFIJOS P, ARTICULO A
            WHERE F.FACT_ID = D.FACT_ID AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND D.ARTI_COD = A.arti_cod AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            FACT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) and substring(a.arti_cod from 1 FOR 2) <> '.t'
            GROUP BY D.ARTI_COD
            INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,
            :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
            DO
            BEGIN
            COSTO = 0;
            FOR SELECT FADE_CANT * FADE_FACTOR, FACT_FECHA FROM FACTURAS_DETALLE D, FACTURAS F, PREFIJOS P
                WHERE F.FACT_ID = D.FACT_ID AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND
                FACT_ANULADO = 'N' AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                and D.ARTI_COD = :articulo  INTO :cantdet, :fecha
                DO
                BEGIN
                EXECUTE PROCEDURE costo_promedio_y_ultimo(:ARTICULO, :FECHA) returning_values (:costounit, :ultcos);
                if (ULTIMO = 'S') then
                    COSTO = COSTO + ultcos * cantdet;
                else
                    COSTO = COSTO + costounit * cantdet;
                END
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            if (CEROS = 'S') then
                INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (2, USER, :ARTICULO);
            SUSPEND;
            END /* FOR */
        if (CEROS = 'S') then
            BEGIN
            COSTO = 0;
            UTILIDAD = 0;
            PORC = 0;
            /* agregue los articulos sin factura */
            FOR SELECT ARTI_COD, 0, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND
                    A.ARTI_DES <= :DESFIN AND A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND
                    (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN)))
                INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,:DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                DO
                BEGIN
                SELECT COUNT(REPA_ARTICULO) FROM REPORTES_AUX WHERE REPA_ID = 2 AND REPA_USER = USER AND REPA_ARTICULO = :articulo INTO :numrows;
                if (numrows = 0) then
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        END
    if (BIN_AND(TIPO, 2) <> 0) then
        BEGIN
        TIPODOC = 32;
        /* BORRA LA TABLA AUXILIAR */
        DELETE FROM reportes_aux WHERE REPA_ID = 2 AND REPA_USER = USER;

        FOR SELECT MAX(D.ARTI_COD), SUM(RVDE_CANT * RVDE_FACTOR), SUM(RVDE_TOTAL-RVDE_IVAMONTO-RVDE_CONSUMO), SUM(RVDE_IVAMONTO), SUM(RVDE_CONSUMO),
            MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD)
            FROM REMISIONES_VENTA_DETALLE D, REMISIONES_VENTA R, PREFIJOS P, ARTICULO A
            WHERE R.REVT_ID = D.REVT_ID AND P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = 32 AND D.ARTI_COD = A.arti_cod AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            REVT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY D.ARTI_COD
            INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,
            :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
            DO
            BEGIN
            COSTO = 0;
            FOR SELECT RVDE_CANT * RVDE_FACTOR, REVT_FECHA FROM remisiones_venta_detalle D, remisiones_venta F, PREFIJOS P
                WHERE F.revt_id = D.revt_id AND REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN AND
                REVT_ANULADO = 'N' AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 32 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                and D.ARTI_COD = :articulo  INTO :cantdet, :fecha
                DO
                BEGIN
                EXECUTE PROCEDURE costo_promedio_y_ultimo(:ARTICULO, :FECHA) returning_values (:costounit, :ultcos);
                if (ULTIMO = 'S') then
                    COSTO = COSTO + ultcos * cantdet;
                else
                    COSTO = COSTO + costounit * cantdet;
                END
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            if (CEROS = 'S') then
                INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (2, USER, :ARTICULO);
            SUSPEND;
            END /* FOR */
        if (CEROS = 'S') then
            BEGIN
            COSTO = 0;
            UTILIDAD = 0;
            PORC = 0;
            /* agregue los articulos sin factura */
            FOR SELECT ARTI_COD, 0, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND
                    A.ARTI_DES <= :DESFIN AND A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND
                    (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN)))
                INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,:DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                DO
                BEGIN
                SELECT COUNT(REPA_ARTICULO) FROM REPORTES_AUX WHERE REPA_ID = 2 AND REPA_USER = USER AND REPA_ARTICULO = :articulo INTO :numrows;
                if (numrows = 0) then
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        END
    if (BIN_AND(TIPO, 4) <> 0) then
        BEGIN
        TIPODOC = 33;
        /* BORRA LA TABLA AUXILIAR */
        DELETE FROM reportes_aux WHERE REPA_ID = 2 AND REPA_USER = USER;

        FOR SELECT MAX(D.ARTI_COD), SUM(DVDE_CANT * DVDE_FACTOR), SUM((DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO)*DEVT_FACTOR), SUM(DVDE_IVAMONTO*DEVT_FACTOR), SUM(DVDE_CONSUMO),
            MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD)
            FROM devoluciones_ventas_detalle D, DEVOLUCIONES_VENTAS V, PREFIJOS P, ARTICULO A
            WHERE V.DEVT_ID = D.DEVT_ID AND P.PREF_PRE = V.PREF_PRE AND P.TIDO_COD = 33 AND D.ARTI_COD = A.arti_cod AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            DEVT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY D.ARTI_COD
            INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,
            :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
            DO
            BEGIN
            COSTO = 0;
            FOR SELECT DVDE_CANT * DVDE_FACTOR, DEVT_FECHA FROM devoluciones_ventas_detalle D, devoluciones_ventas F, PREFIJOS P
                WHERE F.devt_id = D.devt_id AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND
                DEVT_ANULADO = 'N' AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 33 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                and D.ARTI_COD = :articulo  INTO :cantdet, :fecha
                DO
                BEGIN
                EXECUTE PROCEDURE costo_promedio_y_ultimo(:ARTICULO, :FECHA) returning_values (:costounit, :ultcos);
                if (ULTIMO = 'S') then
                    COSTO = COSTO + ultcos * cantdet;
                else
                    COSTO = COSTO + costounit * cantdet;
                END
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            else
                CANTIDAD = CANTIDAD * -1;
            if (BASE IS NULL) then
                BASE = 0;
            else
                BASE = BASE * -1;
            if (IVA IS NULL) then
                IVA = 0;
            else
                IVA = IVA * -1;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            else
                CONSUMO = CONSUMO * -1;
            COSTO = costo * -1;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            if (CEROS = 'S') then
                INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (2, USER, :ARTICULO);
            SUSPEND;
            END /* FOR */
        if (CEROS = 'S') then
            BEGIN
            COSTO = 0;
            UTILIDAD = 0;
            PORC = 0;
            /* agregue los articulos sin factura */
            FOR SELECT ARTI_COD, 0, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND
                    A.ARTI_DES <= :DESFIN AND A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND
                    (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN)))
                INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,:DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                DO
                BEGIN
                SELECT COUNT(REPA_ARTICULO) FROM REPORTES_AUX WHERE REPA_ID = 2 AND REPA_USER = USER AND REPA_ARTICULO = :articulo INTO :numrows;
                if (numrows = 0) then
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        END
    if (BIN_AND(TIPO, 8) <> 0) then
        BEGIN
        TIPODOC = 34;
        /* BORRA LA TABLA AUXILIAR */
        DELETE FROM reportes_aux WHERE REPA_ID = 2 AND REPA_USER = USER;

        FOR SELECT MAX(D.ARTI_COD), SUM(PEDE_CANT * PEDE_FACTOR), SUM((PEDE_TOTAL-PEDE_IVAMONTO-PEDE_CONSUMO)*PEDI_FACTOR), SUM(PEDE_IVAMONTO*PEDI_FACTOR), SUM(PEDE_CONSUMO),
            MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD)
            FROM PEDIDOS_DETALLE D, PEDIDOS P, PREFIJOS R, ARTICULO A
            WHERE P.PEDI_ID = D.PEDI_ID AND P.PREF_PRE = R.PREF_PRE AND R.TIDO_COD = 34 AND D.ARTI_COD = A.arti_cod AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            PEDI_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY D.ARTI_COD
            INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,
            :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
            DO
            BEGIN
            COSTO = 0;
            FOR SELECT PEDE_CANT * PEDE_FACTOR, PEDI_FECHA FROM pedidos_detalle D, pedidos F, PREFIJOS P
                WHERE F.pedi_id = D.pedi_id AND PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND
                PEDI_ANULADO = 'N' AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                and D.ARTI_COD = :articulo  INTO :cantdet, :fecha
                DO
                BEGIN
                EXECUTE PROCEDURE costo_promedio_y_ultimo(:ARTICULO, :FECHA) returning_values (:costounit, :ultcos);
                if (ULTIMO = 'S') then
                    COSTO = COSTO + ultcos * cantdet;
                else
                    COSTO = COSTO + costounit * cantdet;
                END
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            if (CEROS = 'S') then
                INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (2, USER, :ARTICULO);
            SUSPEND;
            END /* FOR */
        if (CEROS = 'S') then
            BEGIN
            COSTO = 0;
            UTILIDAD = 0;
            PORC = 0;
            /* agregue los articulos sin factura */
            FOR SELECT ARTI_COD, 0, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND
                    A.ARTI_DES <= :DESFIN AND A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND
                    (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN)))
                INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,:DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                DO
                BEGIN
                SELECT COUNT(REPA_ARTICULO) FROM REPORTES_AUX WHERE REPA_ID = 2 AND REPA_USER = USER AND REPA_ARTICULO = :articulo INTO :numrows;
                if (numrows = 0) then
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        END
    if (BIN_AND(TIPO, 16) <> 0) then
        BEGIN
        TIPODOC = 35;
        /* BORRA LA TABLA AUXILIAR */
        DELETE FROM reportes_aux WHERE REPA_ID = 2 AND REPA_USER = USER;

        FOR SELECT MAX(D.ARTI_COD), SUM(CTDE_CANT * CTDE_FACTOR), SUM((CTDE_TOTAL-CTDE_IVAMONTO-CTDE_CONSUMO)*COTI_FACTOR), SUM(CTDE_IVAMONTO), SUM(CTDE_CONSUMO),
            MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD)
            FROM COTIZACIONES_DETALLE D, COTIZACIONES C, PREFIJOS P, ARTICULO A
            WHERE C.COTI_ID = D.COTI_ID AND P.PREF_PRE = C.PREF_PRE AND P.TIDO_COD = 35 AND D.ARTI_COD = A.arti_cod AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND COTI_FECHA >= :FECINI AND COTI_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            COTI_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY D.ARTI_COD
            INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,
            :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
            DO
            BEGIN
            COSTO = 0;
            FOR SELECT CTDE_CANT * CTDE_FACTOR, COTI_FECHA FROM cotizaciones_detalle D, cotizaciones F, PREFIJOS P
                WHERE F.coti_id = D.coti_id AND COTI_FECHA >= :FECINI AND COTI_FECHA <= :FECFIN AND
                COTI_ANULADO = 'N' AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                and D.ARTI_COD = :articulo  INTO :cantdet, :fecha
                DO
                BEGIN
                EXECUTE PROCEDURE costo_promedio_y_ultimo(:ARTICULO, :FECHA) returning_values (:costounit, :ultcos);
                if (ULTIMO = 'S') then
                    COSTO = COSTO + ultcos * cantdet;
                else
                    COSTO = COSTO + costounit * cantdet;
                END
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            if (CEROS = 'S') then
                INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (2, USER, :ARTICULO);
            SUSPEND;
            END /* FOR */
        if (CEROS = 'S') then
            BEGIN
            COSTO = 0;
            UTILIDAD = 0;
            PORC = 0;
            /* agregue los articulos sin factura */
            FOR SELECT ARTI_COD, 0, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND
                    A.ARTI_DES <= :DESFIN AND A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND
                    (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN)))
                INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,:DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                DO
                BEGIN
                SELECT COUNT(REPA_ARTICULO) FROM REPORTES_AUX WHERE REPA_ID = 2 AND REPA_USER = USER AND REPA_ARTICULO = :articulo INTO :numrows;
                if (numrows = 0) then
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        END
    END
ELSE
    BEGIN
    if (BIN_AND(TIPO, 1) <> 0) then
        BEGIN
        TIPODOC = 31;
        FOR SELECT F.PREF_PRE, FACT_NUMERO, FACT_FECHA, D.ARTI_COD, FADE_CANT * FADE_FACTOR, (FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO)*FACT_FACTOR, FADE_IVAMONTO*FACT_FACTOR, FADE_CONSUMO,
            ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
            FROM FACTURAS F, FACTURAS_DETALLE D, PREFIJOS P, ARTICULO A
            WHERE F.FACT_ID = D.FACT_ID AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND D.ARTI_COD = A.arti_cod AND
                A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
                A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND FACT_FECHA >= :FECINI AND
                (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
                FACT_FECHA <= :FECFIN AND FACT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) and substring(a.arti_cod from 1 FOR 2) <> '.t'
            ORDER BY D.ARTI_COD, FACT_FECHA, F.FACT_ID, FADE_ITEM
            INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,
                :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
            DO
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            EXECUTE PROCEDURE costo_promedio_y_ultimo(:ARTICULO, :FECHA) returning_values (:costounit, :ultcos);
            if (ULTIMO = 'S') then
                COSTO = ultcos * cantidad;
            else
                COSTO = costounit * cantidad;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            SUSPEND;
            END
        END
    if (BIN_AND(TIPO, 2) <> 0) then
        BEGIN
        TIPODOC = 32;
        FOR SELECT R.PREF_PRE, REVT_NUMERO, REVT_FECHA, D.ARTI_COD, RVDE_CANT * RVDE_FACTOR, RVDE_TOTAL-RVDE_IVAMONTO-RVDE_CONSUMO, RVDE_IVAMONTO, RVDE_CONSUMO,
            ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
            FROM REMISIONES_VENTA R, REMISIONES_VENTA_DETALLE D, PREFIJOS P, ARTICULO A
            WHERE R.REVT_ID = D.REVT_ID AND P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = 32 AND D.ARTI_COD = A.arti_cod AND
                A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
                A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN AND
                (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
                REVT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            ORDER BY D.ARTI_COD, REVT_FECHA, R.REVT_ID, RVDE_ITEM
            INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,
                :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
            DO
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            EXECUTE PROCEDURE costo_promedio_y_ultimo(:ARTICULO, :FECHA) returning_values (:costounit, :ultcos);
            if (ULTIMO = 'S') then
                COSTO = ultcos * cantidad;
            else
                COSTO = costounit * cantidad;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            SUSPEND;
            END
        END
    if (BIN_AND(TIPO, 4) <> 0) then
        BEGIN
        TIPODOC = 33;
        FOR SELECT V.PREF_PRE, DEVT_NUMERO, DEVT_FECHA, D.ARTI_COD, DVDE_CANT * DVDE_FACTOR, (DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO)*DEVT_FACTOR, DVDE_IVAMONTO*DEVT_FACTOR, DVDE_CONSUMO,
            ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
            FROM DEVOLUCIONES_VENTAS V, DEVOLUCIONES_VENTAS_DETALLE D, PREFIJOS P, ARTICULO A
            WHERE V.DEVT_ID = D.DEVT_ID AND P.PREF_PRE = V.PREF_PRE AND P.TIDO_COD = 33 AND D.ARTI_COD = A.arti_cod AND
                A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
                A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND
                (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
                DEVT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            ORDER BY D.ARTI_COD, DEVT_FECHA, V.DEVT_ID, DVDE_ITEM
            INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,
                :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
            DO
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            CANTIDAD = CANTIDAD * -1;
            EXECUTE PROCEDURE costo_promedio_y_ultimo(:ARTICULO, :FECHA) returning_values (:costounit, :ultcos);
            if (ULTIMO = 'S') then
                COSTO = ultcos * cantidad;
            else
                COSTO = costounit * cantidad;
            BASE = BASE * -1;
            IVA = IVA * -1;
            CONSUMO = CONSUMO * -1;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            SUSPEND;
            END
        END
    if (BIN_AND(TIPO, 8) <> 0) then
        BEGIN
        TIPODOC = 34;
        FOR SELECT P.PREF_PRE, PEDI_NUMERO, PEDI_FECHA, D.ARTI_COD, PEDE_CANT * PEDE_FACTOR, (PEDE_TOTAL-PEDE_IVAMONTO-PEDE_CONSUMO)*PEDI_FACTOR, PEDE_IVAMONTO*PEDI_FACTOR, PEDE_CONSUMO,
            ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD 
            FROM PEDIDOS P, PEDIDOS_DETALLE D, PREFIJOS R, ARTICULO A
            WHERE P.PEDI_ID = D.PEDI_ID AND P.PREF_PRE = R.PREF_PRE AND R.TIDO_COD = 34 AND D.ARTI_COD = A.arti_cod AND
                A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
                A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND
                (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
                PEDI_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            ORDER BY D.ARTI_COD, PEDI_FECHA, P.PEDI_ID, PEDE_ITEM
            INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,
                :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
            DO
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            EXECUTE PROCEDURE costo_promedio_y_ultimo(:ARTICULO, :FECHA) returning_values (:costounit, :ultcos);
            if (ULTIMO = 'S') then
                COSTO = ultcos * cantidad;
            else
                COSTO = costounit * cantidad;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            SUSPEND;
            END
        END
    if (BIN_AND(TIPO, 16) <> 0) then
        BEGIN
        TIPODOC = 35;
        FOR SELECT C.PREF_PRE, COTI_NUMERO, COTI_FECHA, D.ARTI_COD, CTDE_CANT * CTDE_FACTOR, (CTDE_TOTAL-CTDE_IVAMONTO-CTDE_CONSUMO)*COTI_FACTOR, CTDE_IVAMONTO*COTI_FACTOR, CTDE_CONSUMO,
            ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD 
            FROM COTIZACIONES C, COTIZACIONES_DETALLE D, PREFIJOS P, ARTICULO A
            WHERE C.COTI_ID = D.COTI_ID AND P.PREF_PRE = C.PREF_PRE AND P.TIDO_COD = 35 AND D.ARTI_COD = A.arti_cod AND
                A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
                A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND COTI_FECHA >= :FECINI AND COTI_FECHA <= :FECFIN AND
                (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
                COTI_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            ORDER BY D.ARTI_COD, COTI_FECHA, C.COTI_ID, CTDE_ITEM
            INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,
                :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
            DO
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            EXECUTE PROCEDURE costo_promedio_y_ultimo(:ARTICULO, :FECHA) returning_values (:costounit, :ultcos);
            if (ULTIMO = 'S') then
                COSTO = ultcos * cantidad;
            else
                COSTO = costounit * cantidad;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            SUSPEND;
            END
        END
    END
END

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE REVISA_PRECIOS(
    LISTA INTEGER,
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    ARTICULO VARCHAR(20),
    DESCR VARCHAR(60),
    GRUPO VARCHAR(2),
    SUBGRUPO VARCHAR(3),
    MARCA VARCHAR(3),
    COSTO NUMERIC(18,2),
    FIJO NUMERIC(18,2),
    UNIDAD VARCHAR(8),
    PORC NUMERIC(9,4),
    SUGERIDO NUMERIC(18,2),
    DIFER NUMERIC(18,2),
    NUEVO NUMERIC(18,2),
    OK CHAR(1))
AS
declare variable marg numeric(9,4);
declare variable UOM VARCHAR(10);
declare variable BASE VARCHAR(10);
declare variable CAMBIO VARCHAR(10);
declare variable COSTOP numeric(18,2);
declare variable COSTOU numeric(18,2);
declare variable DIFMAX numeric(18,2);
declare variable DIG INTEGER;
declare variable TARIVA NUMERIC(9,4);
declare variable IVAINC CHAR(1);
declare variable LISTAREF INTEGER;
begin
execute procedure lee_configuracion ('FACTURACION', 'ARTICULOS', 'SUGERIR PRECIOS CON PORCENTAJE DE MARGEN O UTILIDAD') returning_values (:UOM);
EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION', 'ARTICULOS', 'REDONDEO AL MULTIPLO DE DIEZ EN PRECIOS') RETURNING_VALUES (:DIG);
EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION','ARTICULOS','CAMBIO DE PRECIOS AUTOMATICO AL CAMBIAR COSTO O PRECIO') returning_values (CAMBIO);
EXECUTE PROCEDURE lee_configuracion('FACTURACION','ARTICULOS','COSTO BASE PARA CALCULO DE PRECIOS DE VENTA AUTOMATICOS') returning_values (:BASE);
EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION','ARTICULOS','CODIGO DE LA LISTA DE PRECIOS BASE PARA CAMBIO DE PRECIOS AUTOMATICO') returning_values (LISTAREF);
EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION','ARTICULOS','DIFERENCIA EN PESOS MAXIMA A PERMITIR PARA CAMBIAR PRECIOS') returning_values (DIFMAX);
for select A.arti_cod, A.arti_des, A.grup_cod, A.subg_cod, A.marc_cod, A.arti_unidad, prar_fijo, prar_margen, prar_util, TAIV_PORC
    from precios_articulo p, articulo a, tarifa_iva T
    where a.arti_cod = p.arti_cod and lipr_cod = :lista and a.taiv_cod = t.taiv_cod and exists (select arti_cod from movimiento_articulo m where arti_cod = a.arti_cod and m.mvar_entrada = 'S' and m.mvar_tipodoc <> 33 and m.mvar_tipodoc <> 13 and m.mvar_fecha >= :fecini and m.mvar_fecha <= :fecfin)
    order by A.arti_cod
    into :articulo, descr, :grupo, :subgrupo, :marca, :unidad, :fijo, :marg, :porc, :tariva
    do
    begin
    if (UOM <> 'UTILIDAD') then
        PORC = MARG;
    if (CAMBIO = 'COSTO') then
        BEGIN
        EXECUTE PROCEDURE costo_promedio_y_ultimo (:ARTICULO, :FECFIN) RETURNING_VALUES(:COSTOP, :COSTOU);
        if (base = 'ULTIMO') then
            COSTO = COSTOU;
        ELSE
            BEGIN
            COSTO = COSTOP;
            if (base = 'MAYOR') then
                if (COSTOP < COSTOU) then
                    COSTO = COSTOU;
            END
        SELECT LIPR_MODIF FROM LISTA_PRECIOS WHERE LIPR_COD = :lista INTO :IVAINC;
        if (IVAINC = 'S') then
            COSTO = COSTO * (1 + TARIVA/100);
        if (UOM = 'UTILIDAD') then
            SUGERIDO = COSTO * (1 + :PORC/100);
        ELSE
            SUGERIDO = COSTO / (1 - :PORC/100);
        END
    ELSE
        if (LISTA <> LISTAREF) then
            BEGIN
            SELECT PRAR_FIJO FROM PRECIOS_ARTICULO WHERE ARTI_COD = :articulo AND LIPR_COD = :LISTAREF INTO :SUGERIDO;
            if (IVAINC = 'S') then
                SUGERIDO = SUGERIDO / (1 + TARIVA/100);
            if (UOM = 'UTILIDAD') then
                SUGERIDO = SUGERIDO * (1 + :PORC/100);
            ELSE
                SUGERIDO = SUGERIDO / (1 - :PORC/100);
            END
    EXECUTE PROCEDURE REDONDEE (SUGERIDO, DIG) returning_values (SUGERIDO);
    DIFER = SUGERIDO - FIJO;
    NUEVO = SUGERIDO;
    OK = 'S';
    if ((abs(DIFER) > DIFMAX) and (sugerido <> 0)) then
        suspend;
    end
end

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE UTILIDAD_VENTAS(
    TIPO INTEGER,
    DETALLE CHAR(1),
    FECINI DATE,
    FECFIN DATE,
    PREFIJO VARCHAR(4),
    ULTIMO CHAR(1),
    SUBEMPRESA INTEGER)
RETURNS (
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    PTVTID INTEGER,
    VENDCOD INTEGER,
    NIT VARCHAR(20),
    NOMTERCERO VARCHAR(60),
    ARTICULO VARCHAR(15),
    ARTIDES VARCHAR(60),
    CANT NUMERIC(18,4),
    UNIDAD VARCHAR(8),
    PRECIO NUMERIC(18,2),
    COSTO NUMERIC(18,2),
    UTILIDAD NUMERIC(18,2),
    PORC NUMERIC(9,2))
AS
declare variable IMPTOS CHAR(1);
declare variable ID INTEGER;
declare variable IVA NUMERIC(18,2);
declare variable COSTOT NUMERIC(18,2);
declare variable ULTCOS NUMERIC(18,2);
declare variable PRECIOT NUMERIC(18,2);
declare variable UOM VARCHAR(20);
declare variable icoinc char(2);
declare variable consumo NUMERIC(18,2);
declare variable factor NUMERIC(18,4);
BEGIN
EXECUTE PROCEDURE lee_configuracion ('FACTURACION', 'ARTICULOS', 'SUGERIR PRECIOS CON PORCENTAJE DE MARGEN O UTILIDAD') returning_values (:UOM);
EXECUTE PROCEDURE lee_configuracion ('FACTURACION', 'ARTICULOS', 'IMPOCONSUMO INCLUIDO EN EL PRECIO BASE DE VENTA ANTES DE IVA') returning_values (:icoinc);
/* DETERMINE LA TABLA A EXAMINAR */
if (TIPO = 31) then
    BEGIN
    /* FACTURA */
    FOR SELECT FACT_ID, F.PREF_PRE, FACT_NUMERO, FACT_FECHA, PTVT_ID, VEND_COD, TERC_NIT, FACT_NOMCLIENTE, FACT_IVAINC, fact_factor
        FROM FACTURAS F, PREFIJOS P
        WHERE FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND FACT_ANULADO = 'N'
         AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = :TIPO AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
        ORDER BY FACT_FECHA, F.PREF_PRE, FACT_NUMERO
        INTO :ID, :PREF, :NUMERO, :FECHA, :PTVTID, :VENDCOD, :NIT, :NOMTERCERO, :IMPTOS, :factor
        DO
        if ((PREFIJO = '') or (PREFIJO = PREF)) then
          BEGIN
          COSTOT = 0;
          PRECIOT = 0;
          FOR SELECT D.ARTI_COD, SUBSTR(FADE_DESC,1,60), FADE_CANT * FADE_FACTOR, FADE_UNIDAD, (FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO)*:FACTOR, FADE_IVAMONTO, fade_consumo
            FROM FACTURAS_DETALLE D
            WHERE FACT_ID = :ID and substring(D.arti_cod from 1 FOR 2) <> '.t'
            INTO :ARTICULO, :ARTIDES, :CANT, :UNIDAD, :PRECIO, :IVA, :consumo
            DO
                BEGIN
                EXECUTE PROCEDURE costo_promedio_y_ultimo(:ARTICULO, :FECHA) returning_values (:COSTO, :ultcos);
                if (ULTIMO = 'S') then
                    COSTO = ultcos * CANT;
                else
                    COSTO = COSTO * CANT;
                if (DETALLE = 'S') then
                    BEGIN
                    UTILIDAD = PRECIO - COSTO;
                    if (UOM = 'UTILIDAD') then
                        EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                    else
                        EXECUTE PROCEDURE PORCENTAJE (utilidad,  PRECIO, 'S') returning_values (PORC);
                    SUSPEND;
                    END
                ELSE
                    BEGIN
                    COSTOT = COSTOT + COSTO;
                    PRECIOT = PRECIOT + PRECIO;
                    END
                END
          if (DETALLE <> 'S') then
            BEGIN
            COSTO = COSTOT;
            PRECIO = PRECIOT;
            UTILIDAD = PRECIO - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  PRECIO, 'S') returning_values (PORC);
            SUSPEND;
            END
          END
    END
  if (TIPO = 32) then
    BEGIN
    /* REMISION */
    FOR SELECT REVT_ID, R.PREF_PRE, REVT_NUMERO, REVT_FECHA, PTVT_ID, VEND_COD, TERC_NIT, REVT_NOMTERC, REVT_IVAINC
        FROM REMISIONES_VENTA R, PREFIJOS P
        WHERE REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN AND REVT_ANULADO = 'N'
         AND P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = :TIPO AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
        ORDER BY REVT_FECHA, R.PREF_PRE, REVT_NUMERO
        INTO :ID, :PREF, :NUMERO, :FECHA, :PTVTID, :VENDCOD, :NIT, :NOMTERCERO, :IMPTOS
        DO
        if ((PREFIJO = '') or (PREFIJO = PREF)) then
          BEGIN
          COSTOT = 0;
          PRECIOT = 0;
          FOR SELECT D.ARTI_COD, SUBSTR(RVDE_DESC,1,60), RVDE_CANT * RVDE_FACTOR, RVDE_UNIDAD, (RVDE_TOTAL-RVDE_IVAMONTO-RVDE_CONSUMO), RVDE_IVAMONTO, rvde_consumo
            FROM REMISIONES_VENTA_DETALLE D
            WHERE REVT_ID = :ID and substring(D.arti_cod from 1 FOR 2) <> '.t'
            INTO :ARTICULO, :ARTIDES, :CANT, :UNIDAD, :PRECIO, :IVA, :consumo
            DO
                BEGIN
                EXECUTE PROCEDURE costo_promedio_y_ultimo(:ARTICULO, :FECHA) returning_values (:COSTO, :ultcos);
                if (ULTIMO = 'S') then
                    COSTO = ultcos * CANT;
                else
                    COSTO = COSTO * CANT;
                if (DETALLE = 'S') then
                    BEGIN
                    UTILIDAD = PRECIO - COSTO;
                    if (UOM = 'UTILIDAD') then
                        EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                    else
                        EXECUTE PROCEDURE PORCENTAJE (utilidad,  PRECIO, 'S') returning_values (PORC);
                    SUSPEND;
                    END
                ELSE
                    BEGIN
                    COSTOT = COSTOT + COSTO;
                    PRECIOT = PRECIOT + PRECIO;
                    END
                END
          if (DETALLE <> 'S') then
            BEGIN
            COSTO = COSTOT;
            PRECIO = PRECIOT;
            UTILIDAD = PRECIO - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  PRECIO, 'S') returning_values (PORC);
            SUSPEND;
            END
          END
    END
  if (TIPO = 33) then
    BEGIN
    /* DEVOLUCION */
    FOR SELECT DEVT_ID, D.PREF_PRE, DEVT_NUMERO, DEVT_FECHA, PTVT_ID, VEND_COD, TERC_NIT, DEVT_NOMTERC, DEVT_IVAINC, DEVT_FACTOR
        FROM DEVOLUCIONES_VENTAS D, PREFIJOS P
        WHERE DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND DEVT_ANULADO = 'N'
         AND P.PREF_PRE = D.PREF_PRE AND P.TIDO_COD = :TIPO AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
        ORDER BY DEVT_FECHA, D.PREF_PRE, DEVT_NUMERO
        INTO :ID, :PREF, :NUMERO, :FECHA, :PTVTID, :VENDCOD, :NIT, :NOMTERCERO, :IMPTOS, :FACTOR
        DO
        if ((PREFIJO = '') or (PREFIJO = PREF)) then
          BEGIN
          COSTOT = 0;
          PRECIOT = 0;
          FOR SELECT D.ARTI_COD, SUBSTR(DVDE_DESC,1,60), DVDE_CANT * DVDE_FACTOR, DVDE_UNIDAD, (DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO)*:FACTOR, DVDE_IVAMONTO, dvde_consumo
            FROM DEVOLUCIONES_VENTAS_DETALLE D
            WHERE DEVT_ID = :ID and substring(D.arti_cod from 1 FOR 2) <> '.t'
            INTO :ARTICULO, :ARTIDES, :CANT, :UNIDAD, :PRECIO, :IVA, :consumo
            DO
                BEGIN
                EXECUTE PROCEDURE costo_promedio_y_ultimo(:ARTICULO, :FECHA) returning_values (:COSTO, :ultcos);
                if (ULTIMO = 'S') then
                    COSTO = ultcos * CANT;
                else
                    COSTO = COSTO * CANT;
                if (DETALLE = 'S') then
                    BEGIN
                    UTILIDAD = PRECIO - COSTO;
                    if (UOM = 'UTILIDAD') then
                        EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                    else
                        EXECUTE PROCEDURE PORCENTAJE (utilidad,  PRECIO, 'S') returning_values (PORC);
                    SUSPEND;
                    END
                ELSE
                    BEGIN
                    COSTOT = COSTOT + COSTO;
                    PRECIOT = PRECIOT + PRECIO;
                    END
                END
        if (DETALLE <> 'S') then
            BEGIN
            COSTO = COSTOT;
            PRECIO = PRECIOT;
            UTILIDAD = PRECIO - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  PRECIO, 'S') returning_values (PORC);
            SUSPEND;
            END
        END
    END
  if (TIPO = 34) then
    BEGIN
    /* PEDIDO */
    FOR SELECT PEDI_ID, P.PREF_PRE, PEDI_NUMERO, PEDI_FECHA, PTVT_ID, VEND_COD, TERC_NIT, PEDI_NOMTERC, PEDI_IVAINC, PEDI_FACTOR
        FROM PEDIDOS P, PREFIJOS R
        WHERE PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND PEDI_ANULADO = 'N'
         AND P.PREF_PRE = R.PREF_PRE AND R.TIDO_COD = :TIPO AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
        ORDER BY PEDI_FECHA, P.PREF_PRE, PEDI_NUMERO
        INTO :ID, :PREF, :NUMERO, :FECHA, :PTVTID, :VENDCOD, :NIT, :NOMTERCERO, :IMPTOS, :FACTOR
        DO
        if ((PREFIJO = '') or (PREFIJO = PREF)) then
          BEGIN
          COSTOT = 0;
          PRECIOT = 0;
          FOR SELECT ARTI_COD, SUBSTR(PEDE_DESC,1,60), PEDE_CANT * PEDE_FACTOR, PEDE_UNIDAD, (PEDE_TOTAL-PEDE_IVAMONTO-PEDE_CONSUMO)*:FACTOR, PEDE_IVAMONTO, pede_consumo
            FROM PEDIDOS_DETALLE
            WHERE PEDI_ID = :ID
            INTO :ARTICULO, :ARTIDES, :CANT, :UNIDAD, :PRECIO, :IVA, :consumo
            DO
                BEGIN
                EXECUTE PROCEDURE costo_promedio_y_ultimo(:ARTICULO, :FECHA) returning_values (:COSTO, :ultcos);
                if (ULTIMO = 'S') then
                    COSTO = ultcos * CANT;
                else
                    COSTO = COSTO * CANT;
                if (DETALLE = 'S') then
                    BEGIN
                    UTILIDAD = PRECIO - COSTO;
                    if (UOM = 'UTILIDAD') then
                        EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                    else
                        EXECUTE PROCEDURE PORCENTAJE (utilidad,  PRECIO, 'S') returning_values (PORC);
                    SUSPEND;
                    END
                ELSE
                    BEGIN
                    COSTOT = COSTOT + COSTO;
                    PRECIOT = PRECIOT + PRECIO;
                    END
                END
        if (DETALLE <> 'S') then
            BEGIN
            COSTO = COSTOT;
            PRECIO = PRECIOT;
            UTILIDAD = PRECIO - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  PRECIO, 'S') returning_values (PORC);
            SUSPEND;
            END
        END
    END
  if (TIPO = 35) then
    BEGIN
    /* COTIZACION */
    FOR SELECT COTI_ID, C.PREF_PRE, COTI_NUMERO, COTI_FECHA, PTVT_ID, VEND_COD, TERC_NIT, COTI_NOMTERC, COTI_IMPTOS, COTI_FACTOR
        FROM COTIZACIONES C, PREFIJOS P
        WHERE COTI_FECHA >= :FECINI AND COTI_FECHA <= :FECFIN AND COTI_ANULADO = 'N'
         AND P.PREF_PRE = C.PREF_PRE AND P.TIDO_COD = :TIPO AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
        ORDER BY COTI_FECHA, C.PREF_PRE, COTI_NUMERO
        INTO :ID, :PREF, :NUMERO, :FECHA, :PTVTID, :VENDCOD, :NIT, :NOMTERCERO, :IMPTOS, :FACTOR
        DO
        if ((PREFIJO = '') or (PREFIJO = PREF)) then
          BEGIN
          COSTOT = 0;
          PRECIOT = 0;
          FOR SELECT ARTI_COD, SUBSTR(CTDE_DESC,1,60), CTDE_CANT * CTDE_FACTOR, CTDE_UNIDAD, (CTDE_TOTAL-CTDE_IVAMONTO-CTDE_CONSUMO)*:FACTOR, CTDE_IVAMONTO, ctde_consumo
            FROM COTIZACIONES_DETALLE
            WHERE COTI_ID = :ID
            INTO :ARTICULO, :ARTIDES, :CANT, :UNIDAD, :PRECIO, :IVA, :consumo
            DO
                BEGIN
                EXECUTE PROCEDURE costo_promedio_y_ultimo(:ARTICULO, :FECHA) returning_values (:COSTO, :ultcos);
                if (ULTIMO = 'S') then
                    COSTO = ultcos * CANT;
                else
                    COSTO = COSTO * CANT;
                if (DETALLE = 'S') then
                    BEGIN
                    UTILIDAD = PRECIO - COSTO;
                    if (UOM = 'UTILIDAD') then
                        EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                    else
                        EXECUTE PROCEDURE PORCENTAJE (utilidad,  PRECIO, 'S') returning_values (PORC);
                    SUSPEND;
                    END
                ELSE
                    BEGIN
                    COSTOT = COSTOT + COSTO;
                    PRECIOT = PRECIOT + PRECIO;
                    END
                END
        if (DETALLE <> 'S') then
            BEGIN
            COSTO = COSTOT;
            PRECIO = PRECIOT;
            UTILIDAD = PRECIO - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  PRECIO, 'S') returning_values (PORC);
            SUSPEND;
            END
        END
    END
END

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE CHEQUEO_COSTOS(
    ARTICULO VARCHAR(20),
    FECHA DATE)
AS
declare variable NUMROWS INTEGER;
DECLARE VARIABLE ID INTEGER;
DECLARE VARIABLE FECMV DATE;
DECLARE VARIABLE CANT NUMERIC(15,4);
DECLARE VARIABLE COSTO NUMERIC(18,2);
DECLARE VARIABLE ENTRADA CHAR(1);
DECLARE VARIABLE TIPO INTEGER;
begin
SELECT COUNT(*) FROM COSTOS WHERE ARTI_COD = :ARTICULO AND COST_FECHA > :FECHA INTO :NUMROWS;
if (NUMROWS > 0) then
    BEGIN
    delete from costos where arti_cod = :ARTICULO AND COST_FECHA >= :FECHA;
    for select mvar_cons, mvar_fecha, mvar_cant, mvar_costo, mvar_entrada, mvar_tipodoc
        from movimiento_articulo WHERE ARTI_COD = :ARTICULO AND MVAR_FECHA >= :FECHA
        order by mvar_fecha, mvar_cons /* SE HACE ESTRICTAMENTE EN ORDEN DE FECHA Y REGISTRO, SI LO EDITAN CAMBIA EL ORDEN */
        into :id, :fecmv, :cant, :costo, :entrada, :tipo
        do
        if ((TIPO <> 13)) then
            EXECUTE PROCEDURE actualice_costo(:ARTICULO, :fecmv, :costo, :cant, :entrada, 'N', :id, :tipo);
    END
end

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE CHEQUEO_INVENTARIO(
    ARTINI VARCHAR(20),
    ARTFIN VARCHAR(20))
AS
DECLARE VARIABLE FECHA DATE;
DECLARE VARIABLE CANT NUMERIC(15,4);
DECLARE VARIABLE COSTO NUMERIC(18,2);
DECLARE VARIABLE ENTRADA CHAR(1);
DECLARE VARIABLE BODEGA CHAR(2);
DECLARE VARIABLE ID INTEGER;
DECLARE VARIABLE TIPO INTEGER;
declare variable TIPOEX CHAR(1);
DECLARE VARIABLE LOTE VARCHAR(20);
DECLARE VARIABLE EXISTE INTEGER;
declare variable ARTICULO VARCHAR(20);
declare variable IDL INTEGER;
BEGIN
for select arti_cod from articulo where arti_cod >= :artini and arti_cod <= :artfin into :ARTICULO
  DO
  BEGIN
  DELETE FROM existencia_lote where arti_cod = :articulo;
  DELETE FROM lotes where arti_cod = :articulo;
  delete from costos where arti_cod = :ARTICULO;
  delete from existencia WHERE ARTI_COD = :ARTICULO;
  for select mvar_cons, mvar_fecha, mvar_cant, mvar_costo, mvar_entrada, bode_cod, mvar_tipodoc, mvar_lote
    from movimiento_articulo WHERE ARTI_COD = :ARTICULO
    order by mvar_fecha, mvar_cons
    into :id, :fecha, :cant, :costo, :entrada, :bodega, :tipo, :lote
  do
    begin
    SELECT ARTI_EXIST
        FROM   ARTICULO
        WHERE  ARTICULO.ARTI_COD = :ARTICULO
        INTO :TIPOEX;
    if ((TIPO <> 13)) then
        EXECUTE PROCEDURE actualice_costo(:ARTICULO, :fecha, :costo, :cant, :entrada, 'N', :id, :tipo);
    /* actualice existencias */
    if (:entrada = 'S') then
        begin
        execute procedure sume_existencia(:articulo, :bodega, :fecha, :cant, 'N');
        if (TIPOEX = 'L') then
            begin
            SELECT COUNT(*) FROM LOTES WHERE ARTI_COD = :ARTICULO AND BODE_COD = :BODEGA AND LOTE_NRO = :lote INTO :EXISTE;
            if (EXISTE > 0) then
                UPDATE LOTES
                    set lote_saldo = lote_saldo + :cant
                    where (arti_cod = :ARTICULO) and (BODE_COD = :BODEGA) AND (lote_nro = :lote);
            ELSE
                INSERT INTO LOTES (ARTI_COD, BODE_COD, LOTE_NRO, LOTE_FECHA, LOTE_CANT, LOTE_COSTO, LOTE_SALDO)
                    VALUES (:ARTICULO, :bodega, :lote, :fecha, :cant, :costo, :cant);
            end
        end
    else
        begin
        execute procedure reste_existencia(:articulo, :bodega, :fecha, :cant, 'N');
        if (TIPOEX = 'L') then
            begin
            SELECT COUNT(*) FROM LOTES WHERE ARTI_COD = :ARTICULO AND BODE_COD = :BODEGA AND LOTE_NRO = :lote INTO :EXISTE;
            if (EXISTE > 0) then
                UPDATE LOTES
                    set lote_saldo = lote_saldo - :cant
                    where (arti_cod = :ARTICULO) AND (BODE_COD = :BODEGA) and (lote_nro = :lote);
            ELSE
                BEGIN
                /* ARREGLE EL LOTE YA QUE NO EXISTE */
                SELECT MIN(LOTE_ID) FROM LOTES WHERE ARTI_COD = :articulo AND BODE_COD = :BODEGA AND LOTE_SALDO >= :cant INTO :IDL;
                SELECT LOTE_NRO FROM LOTES WHERE LOTE_ID = :IDL INTO :LOTE;
                UPDATE MOVIMIENTO_ARTICULO SET MVAR_LOTE = :LOTE WHERE MVAR_CONS = :ID;
                UPDATE LOTES
                    set lote_saldo = lote_saldo - :cant
                    where (arti_cod = :ARTICULO) and (BODE_COD = :BODEGA) AND (lote_nro = :lote);
                END
            SELECT COUNT(*) FROM EXISTENCIA_LOTE
                WHERE LOTE_NRO = :LOTE AND EXLO_FECHA = :FECHA AND ARTI_COD = :ARTICULO AND BODE_COD = :bodega
                INTO :EXISTE;
            if (EXISTE > 0) then
                UPDATE EXISTENCIA_LOTE
                       SET EXLO_SAL = EXLO_SAL + :cant
                    WHERE LOTE_NRO = :LOTE AND EXLO_FECHA = :FECHA AND ARTI_COD = :ARTICULO AND BODE_COD = :bodega;
            else
                INSERT INTO EXISTENCIA_LOTE (ARTI_COD, BODE_COD, LOTE_NRO, EXLO_FECHA, EXLO_SAL)
                    VALUES (:ARTICULO, :BODEGA, :LOTE, :FECHA, :CANT);
            end
        end
    END
  END
END

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE CAMBIO_PRECIOS(
    FECHA DATE)
AS
declare variable ART VARCHAR(20);
BEGIN
FOR SELECT ARTI_COD FROM ARTICULO INTO :ART DO
    EXECUTE PROCEDURE CALCULA_PRECIOS(:ART, :FECHA);
  SUSPEND;
END

^

SET TERM ; ^

SET TERM ^ ;

ALTER TRIGGER PRECIOS_ARTICULO_BI
AS
declare variable UNIDAD VARCHAR(8);
declare variable UOR VARCHAR(20);
declare variable COSTOP NUMERIC(18, 2);
declare variable COSTOU NUMERIC(18, 2);
declare variable COSTO NUMERIC(18, 2);
declare variable DIG INTEGER;
declare variable IVAINC CHAR(1);
declare variable IVAINC1 CHAR(1);
declare variable TARIVA NUMERIC(9,2);
declare variable BASE varchar(10);
declare variable CAMBIO CHAR(7);
declare variable LISTA INTEGER;
declare variable PRECIO NUMERIC(18, 4);
BEGIN
if (NEW.prar_util IS NULL) then
    NEW.prar_util = 0;
if (NEW.prar_margen IS NULL) then
    NEW.prar_margen = 0;
if (NEW.prar_cantmin IS NULL) then
    NEW.prar_cantmin = 0.01;
if (NEW.prar_auto = 'S') then
    BEGIN
    SELECT LIPR_MODIF FROM LISTA_PRECIOS L
        WHERE LIPR_COD = NEW.LIPR_COD INTO :IVAINC;
    
    SELECT ARTI_UNIDAD, TAIV_PORC FROM ARTICULO A, TARIFA_IVA T
        WHERE ARTI_COD = NEW.ARTI_COD AND A.taiv_cod = T.taiv_cod INTO :UNIDAD, :TARIVA;
    EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION', 'ARTICULOS', 'SUGERIR PRECIOS CON PORCENTAJE DE MARGEN O UTILIDAD') RETURNING_VALUES (:UOR);
    EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION', 'ARTICULOS', 'REDONDEO AL MULTIPLO DE DIEZ EN PRECIOS') RETURNING_VALUES (:DIG);
    EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION','ARTICULOS','CAMBIO DE PRECIOS AUTOMATICO AL CAMBIAR COSTO O PRECIO') returning_values (CAMBIO);
    if (CAMBIO <> 'PRECIO') then
        BEGIN
        EXECUTE PROCEDURE lee_configuracion('FACTURACION','ARTICULOS','COSTO BASE PARA CALCULO DE PRECIOS DE VENTA AUTOMATICOS') returning_values (:BASE);
        EXECUTE PROCEDURE costo_promedio_y_ultimo (NEW.ARTI_COD, 'NOW') RETURNING_VALUES(:COSTOP, :COSTOU);
        if (base = 'ULTIMO') then
            BEGIN
            COSTO = COSTOU;
            END
        ELSE
            BEGIN
            COSTO = COSTOP;
            if (base = 'MAYOR') then
                if (COSTOP < COSTOU) then
                    COSTO = COSTOU;
            END
        if (IVAINC = 'S') then
            COSTO = COSTO * (1 + TARIVA/100);
        if (UOR = 'UTILIDAD') then
            NEW.PRAR_FIJO = (:COSTO * (1 + NEW.prar_util/100));
        ELSE
            NEW.PRAR_FIJO = (:COSTO / (1 - NEW.prar_margen/100));
        EXECUTE PROCEDURE REDONDEE (NEW.prar_fijo, DIG) returning_values (NEW.prar_fijo);
        END
    ELSE
        BEGIN
        /* PRECIO */
        EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION','ARTICULOS','CODIGO DE LA LISTA DE PRECIOS BASE PARA CAMBIO DE PRECIOS AUTOMATICO') returning_values (LISTA);
        if (NEW.lipr_cod <> :LISTA) then
            BEGIN
            SELECT PRAR_FIJO FROM PRECIOS_ARTICULO WHERE LIPR_COD = :LISTA AND ARTI_COD = NEW.arti_cod INTO :PRECIO;
            SELECT LIPR_MODIF FROM LISTA_PRECIOS L
                WHERE LIPR_COD = :lista INTO :IVAINC1;
            if (ivainc = 'S') then
                if (IVAINC1 = 'S') then
                    NEW.prar_fijo = precio;
                else
                    NEW.prar_fijo = precio * (1 + TARIVA/100);
            ELSE
                if (IVAINC1 = 'S') then
                    NEW.prar_fijo = precio / (1 + TARIVA/100);
                else
                    NEW.prar_fijo = precio;
            if (UOR = 'UTILIDAD') then
                NEW.prar_fijo = NEW.prar_fijo * (1 + NEW.prar_util/100);
            ELSE
                NEW.prar_fijo = NEW.prar_fijo / (1 - NEW.prar_margen/100);
            EXECUTE PROCEDURE REDONDEE (NEW.prar_fijo, DIG) returning_values (NEW.prar_fijo);
            END
        END
    END
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER TRIGGER PRECIOS_ARTICULO_BU
as
declare variable UNIDAD VARCHAR(8);
declare variable UOR VARCHAR(20);
declare variable DIG INTEGER;
declare variable IVAINC CHAR(1);
declare variable TARIVA NUMERIC(9,4);
declare variable CAMBIO CHAR(7);
declare variable BASE VARCHAR(10);
declare variable REP CHAR(2);
declare variable COSTOP NUMERIC(18, 2);
declare variable COSTOU NUMERIC(18, 2);
declare variable COSTO NUMERIC(18, 2);
declare variable LISTA INTEGER;
declare variable PRECIO NUMERIC(18, 4);
declare variable IVAINC1 CHAR(1);
begin
if (NEW.prar_auto = 'S') then
    BEGIN
    EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION','ARTICULOS','CAMBIO DE PRECIOS AUTOMATICO AL CAMBIAR COSTO O PRECIO') returning_values (CAMBIO);
    EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION', 'ARTICULOS', 'SUGERIR PRECIOS CON PORCENTAJE DE MARGEN O UTILIDAD') RETURNING_VALUES (:UOR);
    EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION', 'ARTICULOS', 'REDONDEO AL MULTIPLO DE DIEZ EN PRECIOS') RETURNING_VALUES (:DIG);
    EXECUTE PROCEDURE LEE_CONFIGURACION('INVENTARIO', 'ARTICULOS', 'REPLICAR CAMBIOS EN ARTICULOS') RETURNING_VALUES (:REP);
    SELECT LIPR_MODIF FROM LISTA_PRECIOS L
        WHERE LIPR_COD = NEW.LIPR_COD INTO :IVAINC;
    
    if (CAMBIO <> 'PRECIO') then
      begin
      if (REP <> 'SI') then
        BEGIN
        SELECT ARTI_UNIDAD, TAIV_PORC FROM ARTICULO A, TARIFA_IVA T WHERE A.TAIV_COD = T.TAIV_COD AND ARTI_COD = NEW.arti_cod INTO :UNIDAD, :TARIVA;
        EXECUTE PROCEDURE lee_configuracion('FACTURACION','ARTICULOS','COSTO BASE PARA CALCULO DE PRECIOS DE VENTA AUTOMATICOS') returning_values (:BASE);
        EXECUTE PROCEDURE costo_promedio_y_ultimo (NEW.arti_cod, 'NOW') RETURNING_VALUES(:COSTOP, :COSTOU);
        if (base = 'ULTIMO') then
            COSTO = COSTOU;
        ELSE
            BEGIN
            COSTO = COSTOP;
            if (base = 'MAYOR') then
                if (COSTOP < COSTOU) then
                    COSTO = COSTOU;
            END
        if (IVAINC = 'S') then
            COSTO = COSTO * (1 + TARIVA/100);
            
        if (UOR = 'UTILIDAD') then
            BEGIN
            COSTO = COSTO * (1 + NEW.prar_util/100);
            EXECUTE PROCEDURE REDONDEE (COSTO, DIG) returning_values (COSTO);
            new.prar_fijo = :COSTO;
            END
        ELSE
            BEGIN
            COSTO = COSTO / (1 - NEW.prar_margen/100);
            EXECUTE PROCEDURE REDONDEE (COSTO, DIG) returning_values (COSTO);
            NEW.PRAR_FIJO = :COSTO;
            END
        END
      end
    else
        begin
        /* PRECIO */
        EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION','ARTICULOS','CODIGO DE LA LISTA DE PRECIOS BASE PARA CAMBIO DE PRECIOS AUTOMATICO') returning_values (LISTA);
        if (NEW.lipr_cod <> :LISTA) then
            BEGIN
            SELECT PRAR_FIJO FROM PRECIOS_ARTICULO WHERE LIPR_COD = :LISTA AND ARTI_COD = NEW.arti_cod INTO :PRECIO;
            SELECT LIPR_MODIF FROM LISTA_PRECIOS L
                WHERE LIPR_COD = :lista INTO :IVAINC1;
            if (ivainc = 'S') then
                if (IVAINC1 = 'S') then
                    NEW.prar_fijo = precio;
                else
                    NEW.prar_fijo = precio * (1 + TARIVA/100);
            ELSE
                if (IVAINC1 = 'S') then
                    NEW.prar_fijo = precio / (1 + TARIVA/100);
                else
                    NEW.prar_fijo = precio;
            if (UOR = 'UTILIDAD') then
                NEW.prar_fijo = NEW.prar_fijo * (1 + NEW.prar_util/100);
            ELSE
                NEW.prar_fijo = NEW.prar_fijo / (1 - NEW.prar_margen/100);
            EXECUTE PROCEDURE REDONDEE (NEW.prar_fijo, DIG) returning_values (NEW.prar_fijo);
            END
        end
    END
end
^

SET TERM ; ^

SET TERM ^ ;

ALTER TRIGGER MOVIMIENTO_ARTICULO_AD
AS
declare variable LOTE CHAR(1);
BEGIN
  /* INSERTE EL NUEVO LOTE */
  SELECT ARTI_EXIST
    FROM   ARTICULO
    WHERE  ARTICULO.ARTI_COD = OLD.ARTI_COD
    INTO :LOTE;
  /* BORRE LOS VIEJOS */
  if (old.mvar_tipodoc <> 13) then
      BEGIN
      EXECUTE PROCEDURE actualice_costo(old.arti_cod, old.mvar_fecha, old.mvar_costo, old.mvar_cant, old.mvar_entrada, 'S', OLD.mvar_cons, OLD.mvar_tipodoc);
      if (OLD.mvar_entrada = 'S') then
          EXECUTE PROCEDURE chequeo_costos(old.arti_cod, old.mvar_fecha-1); /* PARA OBLIGAR A RECALCULAR LOS MOV. DEL MISMO DIA */
      else
          EXECUTE PROCEDURE chequeo_costos(old.arti_cod, old.mvar_fecha);
      END
  /* actualice existencias */
  if (old.mvar_entrada = 'S') then
    BEGIN
    execute procedure sume_existencia(old.arti_cod, old.bode_cod, old.mvar_fecha, old.mvar_cant, 'S');
    if (LOTE = 'L') then
        UPDATE LOTES
            set lote_saldo = lote_saldo - old.mvar_cant
            where (arti_cod = old.ARTI_COD) and (bode_cod = old.bode_cod) and (lote_nro = old.mvar_lote);
    END
  else
    BEGIN
    execute procedure reste_existencia(old.arti_cod, old.bode_cod, old.mvar_fecha, old.mvar_cant, 'S');
    if (LOTE = 'L') then
        UPDATE LOTES
            set lote_saldo = lote_saldo + old.mvar_cant
            where (arti_cod = old.ARTI_COD) and (bode_cod = old.bode_cod) and (lote_nro = old.mvar_lote);
    END
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER TRIGGER MOVIMIENTO_ARTICULO_AI
AS
declare variable EXISTE CHAR(1);
declare variable LOTE CHAR(1);
BEGIN
  /* INSERTE EL NUEVO LOTE */
  SELECT ARTI_EXIST FROM ARTICULO WHERE ARTICULO.ARTI_COD = NEW.ARTI_COD INTO :LOTE;
  /* ACTUALICE COSTOS cuando no es transferencia */
  if (new.mvar_tipodoc <> 13) then
      BEGIN
      EXECUTE PROCEDURE actualice_costo(new.arti_cod, new.mvar_fecha, new.mvar_costo, new.mvar_cant, new.mvar_entrada, 'N', new.mvar_cons, new.mvar_tipodoc);
      EXECUTE PROCEDURE chequeo_costos(NEW.arti_cod, NEW.mvar_fecha);
      END
  /* actualice existencias */
  if (new.mvar_entrada = 'S') then
    BEGIN
    execute procedure sume_existencia(new.arti_cod, new.bode_cod, new.mvar_fecha, new.mvar_cant, 'N');
    if (LOTE = 'L') then
        BEGIN
        if (NEW.MVAR_LOTE IS NULL) then
            EXCEPTION LOTE_OBLIGATORIO 'Debe especificar un número de lote para el articulo ' || new.arti_cod;
        ELSE
         BEGIN
         EXISTE = 'N';
         SELECT 'S' FROM LOTES WHERE ARTI_COD = NEW.ARTI_COD AND BODE_COD = NEW.bode_cod AND LOTE_NRO = new.mvar_lote INTO :EXISTE;
         if (EXISTE = 'S') then
            UPDATE LOTES
             set lote_saldo = lote_saldo + new.mvar_cant
              where (arti_cod = NEW.ARTI_COD) and (BODE_COD = NEW.bode_cod) and (lote_nro = new.mvar_lote);
         ELSE
            INSERT INTO LOTES (ARTI_COD, BODE_COD, LOTE_NRO, LOTE_FECHA, LOTE_CANT, LOTE_COSTO, LOTE_SALDO)
                VALUES (NEW.ARTI_COD, NEW.bode_cod, NEW.mvar_lote, NEW.mvar_fecha, NEW.mvar_cant, NEW.mvar_costo, NEW.mvar_cant);
         END
        END
    END
  else
    BEGIN
    execute procedure reste_existencia(new.arti_cod, new.bode_cod, new.mvar_fecha, new.mvar_cant, 'N');
    /* ACTUALICE LA EXISTENCIA DEL LOTE */
    if (LOTE = 'L') then
    if (NEW.mvar_lote IS NULL) then
        EXCEPTION LOTE_NEGATIVO 'Debe indicar un número de lote para el artículo ' || new.arti_cod;
    ELSE
        BEGIN
        /* Actualice el saldo historico del lote */
        EXISTE = 'N';
        SELECT 'S' FROM EXISTENCIA_LOTE WHERE LOTE_NRO = NEW.MVAR_LOTE AND EXLO_FECHA = NEW.MVAR_FECHA AND ARTI_COD = NEW.arti_cod AND BODE_COD = NEW.bode_cod INTO :EXISTE;
        if (EXISTE = 'S') then
            BEGIN
            UPDATE EXISTENCIA_LOTE
                SET EXLO_SAL = EXLO_SAL + NEW.mvar_cant
                WHERE LOTE_NRO = NEW.MVAR_LOTE AND EXLO_FECHA = NEW.MVAR_FECHA AND ARTI_COD = NEW.ARTI_COD AND BODE_COD = NEW.bode_cod;
            END
        ELSE
            BEGIN
            INSERT INTO EXISTENCIA_LOTE (ARTI_COD, BODE_COD, LOTE_NRO, EXLO_FECHA, EXLO_SAL)
                VALUES (NEW.ARTI_COD, NEW.bode_cod, NEW.MVAR_LOTE, NEW.MVAR_FECHA, NEW.MVAR_CANT);
            END
        UPDATE LOTES
            set lote_saldo = lote_saldo - new.mvar_cant
            where (arti_cod = NEW.ARTI_COD) and (BODE_COD = NEW.bode_cod) and (lote_nro = new.mvar_lote);
        END
    END
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER TRIGGER DESENSAMBLES_DETALLE_AI
AS
declare variable fec date;
declare variable CONC VARCHAR(60);
declare variable factor numeric(18,4);
declare variable COSTO numeric(18,2);
declare variable Pref varchar(4);
declare variable Num varchar(6);
declare variable CANT NUMERIC(18,2);
declare variable CANTOT CHAR(2);
BEGIN
  if ((NEW.DESE_id <> 0) and (new.dede_anulado = 'N')) then
    begin
    select dese_fecha, dese_conc, pref_pre, dese_numero, dese_cant * dese_factor
        from desensambles where dese_id = new.dese_id into :fec, :conc, :Pref, :Num, :CANT;
    execute procedure factor_unidad_cant(new.arti_cod, new.dede_unidad) returning_values(factor);
    execute procedure costo_promedio(new.arti_cod, :FEC) returning_values (:COSTO);
    EXECUTE PROCEDURE LEE_CONFIGURACION('INVENTARIO', 'ENSAMBLES', 'FORMACIONES CON CANTIDADES TOTALES') returning_values (:CANTOT);
    if (CANTOT <> 'SI') then
        CANT = CANT * factor * new.dede_cant;
    ELSE
        CANT = factor * new.dede_cant;
    INSERT INTO MOVIMIENTO_ARTICULO
      (ARTI_COD, MVAR_CONS, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM)
      VALUES(NEW.ARTI_COD, GEN_ID(ID_MOVARTI,1), NEW.BODE_COD, :FEC, 16, NEW.dese_id,
      :CONC, :CANT, :COSTO, 'S', new.dede_lote, :Pref, :Num, new.dese_item);

    /* RECORRA LAS LISTAS DE PRECIOS Y CAMBIE EL PRECIO */
    EXECUTE PROCEDURE CALCULA_PRECIOS(NEW.ARTI_COD, :fec);
    END
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER TRIGGER DESENSAMBLES_DETALLE_AU
AS
declare variable fec date;
declare variable CONC VARCHAR(60);
declare variable Pref varchar(4);
declare variable Num varchar(6);
declare variable factor numeric(18,4);
declare variable COSTO numeric(18,2);
declare variable CANT NUMERIC(18,2);
declare variable CANTOT CHAR(2);
BEGIN
/* Anule el anterior */
if ((OLD.DESE_ID <> 0) AND (OLD.dede_anulado = 'N')) then
    delete from movimiento_articulo where (mvar_tipodoc = 16) and (mvar_idref = old.DESE_id) and (mvar_item = old.dese_item);
if ((NEW.dese_id <> 0) AND (new.dede_anulado = 'N')) then
    BEGIN
    EXECUTE PROCEDURE LEE_CONFIGURACION('INVENTARIO', 'ENSAMBLES', 'FORMACIONES CON CANTIDADES TOTALES') returning_values (:CANTOT);
    select dese_fecha, dese_conc, pref_pre, dese_numero, dese_cant * dese_factor
        from desensambles where dese_id = new.dese_id into :fec, :conc, :Pref, :Num, :CANT;
    execute procedure factor_unidad_cant(new.arti_cod, new.dede_unidad) returning_values(factor);
    execute procedure costo_promedio(new.arti_cod, :FEC) returning_values (:COSTO);
    if (CANTOT <> 'SI') then
        CANT = CANT * factor * new.dede_cant;
    ELSE
        CANT = factor * new.dede_cant;
    INSERT INTO MOVIMIENTO_ARTICULO
        (ARTI_COD, MVAR_CONS, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM)
        VALUES(NEW.ARTI_COD, GEN_ID(ID_MOVARTI,1), NEW.BODE_COD, :FEC, 16, NEW.dese_id,
        :CONC, :CANT, :COSTO, 'S', new.dede_lote, :Pref, :Num, new.dese_item);

    /* RECORRA LAS LISTAS DE PRECIOS Y CAMBIE EL PRECIO */
    EXECUTE PROCEDURE CALCULA_PRECIOS(NEW.ARTI_COD, :fec);
    END
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER TRIGGER ENSAMBLES_AI
AS
declare variable COSTO NUMERIC(18,2);
BEGIN
if ((NEW.ENSA_id <> 0) and (new.ensa_anulado = 'N')) then
  begin
  COSTO = new.ensa_costo / NEW.ensa_factor;
  INSERT INTO MOVIMIENTO_ARTICULO
    (ARTI_COD, MVAR_CONS, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM)
    VALUES(NEW.ARTI_COD, GEN_ID(ID_MOVARTI,1), new.bode_cod, new.ensa_fecha, 15, NEW.ensa_id,
    new.ensa_conc, NEW.ensa_factor * new.ensa_cant, :COSTO, 'S', new.ensa_lote, new.pref_pre, new.ensa_numero, 0);

  /* RECORRA LAS LISTAS DE PRECIOS Y CAMBIE EL PRECIO */
  EXECUTE PROCEDURE CALCULA_PRECIOS(NEW.ARTI_COD, new.ensa_fecha);

  /* ingrese el retal */
  if ((new.ensa_codretal is not null) and (new.ensa_codretal <> '')) then
      INSERT INTO MOVIMIENTO_ARTICULO
        (ARTI_COD, MVAR_CONS, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM)
        VALUES(NEW.ensa_codretal, GEN_ID(ID_MOVARTI,1), new.bode_cod, new.ensa_fecha, 15, NEW.ensa_id,
        new.ensa_conc, new.ensa_cantretal, :COSTO, 'S', new.ensa_lote, new.pref_pre, new.ensa_numero, 999);

  INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
    VALUES (USER, 15, NEW.ensa_id, 'I', NEW.pref_pre || NEW.ensa_numero);
  end
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER TRIGGER ENSAMBLES_AU
AS
declare variable COSTO NUMERIC(18,2);
declare variable consec INTEGER;
BEGIN
/* BORRE LA CONTABILIZACION */
if (NEW.ensa_anulado = 'S') then
    BEGIN
    select enco_consec from comprobante_encabezado where enco_tiporef = 15 and enco_idref = old.ensa_id into :consec;
    if (NOT consec is null) then
     delete from comprobante_detalle where enco_consec = :consec;
    delete from comprobante_encabezado where enco_tiporef = 15 and enco_idref = old.ensa_id;
    INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
        VALUES (USER, 15, NEW.ensa_id, 'A', NEW.pref_pre || NEW.ensa_numero);
    END

/* BORRE EL ANTERIOR Y GRABE EL NUEVO */
if ((OLD.ensa_id <> 0) AND (OLD.ensa_anulado = 'N')) then
    begin
    delete from movimiento_articulo where (mvar_tipodoc = 15) and (mvar_idref = old.ensa_id) and (mvar_item = 0);
    delete from movimiento_articulo where (mvar_tipodoc = 15) and (mvar_idref = old.ensa_id) and (mvar_item = 999);
    end
if ((new.ensa_id <> 0) AND (NEW.ensa_anulado = 'N')) then
    begin
    COSTO = new.ensa_costo / NEW.ensa_factor;
    INSERT INTO MOVIMIENTO_ARTICULO
        (ARTI_COD, MVAR_CONS, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM)
        VALUES(NEW.ARTI_COD, GEN_ID(ID_MOVARTI,1), new.bode_cod, new.ensa_fecha, 15, NEW.ensa_id,
        new.ensa_conc, NEW.ensa_factor * new.ensa_cant, :COSTO, 'S', new.ensa_lote, new.pref_pre, new.ensa_numero, 0);

    /* RECORRA LAS LISTAS DE PRECIOS Y CAMBIE EL PRECIO */
    EXECUTE PROCEDURE CALCULA_PRECIOS(NEW.ARTI_COD, new.ensa_fecha);

    /* ingrese el retal */
    if ((new.ensa_codretal is not null) and (new.ensa_codretal <> '')) then
      INSERT INTO MOVIMIENTO_ARTICULO
        (ARTI_COD, MVAR_CONS, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM)
        VALUES(NEW.ensa_codretal, GEN_ID(ID_MOVARTI,1), new.bode_cod, new.ensa_fecha, 15, NEW.ensa_id,
        new.ensa_conc, new.ensa_cantretal, :COSTO, 'S', new.ensa_lote, new.pref_pre, new.ensa_numero, 999);

    INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
        VALUES (USER, 15, NEW.ensa_id, 'U', NEW.pref_pre || NEW.ensa_numero);
    end
/* SI CAMBIO LA FECHA ACTUALICE LOS DETALLES */
if ((OLD.pref_pre <> NEW.pref_pre) or
    (OLD.ensa_numero <> NEW.ensa_numero) or
    (OLD.ensa_fecha <> NEW.ensa_fecha) ) then
    UPDATE ENSAMBLES_DETALLE SET ESDE_TRANSMIT = 'N' WHERE ENSA_ID = OLD.ENSA_ID;

if (OLD.ensa_anulado <> NEW.ensa_anulado) then
    UPDATE ENSAMBLES_DETALLE SET ESDE_ANULADO = NEW.ensa_anulado WHERE ENSA_ID = OLD.ENSA_ID;

if (OLD.ensa_transmit <> NEW.ensa_transmit) then
    UPDATE ENSAMBLES_DETALLE SET ESDE_TRANSMIT = NEW.ensa_transmit WHERE ENSA_ID = OLD.ENSA_ID;
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER TRIGGER ENTRADAS_DETALLE_AI
AS
declare variable fec date;
declare variable CONC VARCHAR(60);
declare variable factor numeric(18,4);
declare variable Pref varchar(4);
declare variable Num varchar(6);
declare variable Nit varchar(20);
declare variable IVAINC CHAR(2);
declare variable COSTO NUMERIC(18,2);
BEGIN
  if ((NEW.entr_id <> 0) and (new.ende_anulado = 'N')) then
    BEGIN
    select entr_fecha, entr_conc, pref_pre, entr_numero, terc_nit, entr_imptos
        from entradas where entr_id = new.entr_id
        into :fec, :conc, :Pref, :Num, :Nit, :ivainc;
    execute procedure factor_unidad_cant(new.arti_cod, new.ende_unidad) returning_values(factor);
    COSTO = ((new.ende_costo - NEW.ende_dtomonto) / :factor);
    if (IVAINC = 'S') then
        COSTO = COSTO / (1 + NEW.ende_ivaporc/100);
    INSERT INTO MOVIMIENTO_ARTICULO
      (ARTI_COD, MVAR_CONS, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM, TERC_NIT)
      VALUES(NEW.ARTI_COD, GEN_ID(ID_MOVARTI,1), NEW.BODE_COD, :FEC, 11, NEW.entr_id,
      :CONC, :factor * new.ende_cant, :costo, 'S', new.ende_lote, :Pref, :Num, new.ende_item, :Nit);
    /* RECORRA LAS LISTAS DE PRECIOS Y CAMBIE EL PRECIO */
    EXECUTE PROCEDURE CALCULA_PRECIOS(NEW.ARTI_COD, :FEC);
    /* ACTUALICE EL STAND */
    if (new.ende_stand is not null) then
      if (exists(select stand_cod from stands where arti_cod = new.arti_cod and stand_bodega = new.bode_cod)) then
        UPDATE stands set stand_cod = new.ende_stand where arti_cod = new.arti_cod and stand_bodega = new.bode_cod;
      else
        INSERT INTO stands (ARTI_COD, STAND_BODEGA, STAND_COD) VALUES (NEW.arti_cod, NEW.bode_cod, NEW.ende_stand);
    END
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER TRIGGER ENTRADAS_DETALLE_AU
as
declare variable fec date;
declare variable CONC VARCHAR(60);
declare variable Pref varchar(4);
declare variable Num varchar(6);
declare variable Nit varchar(20);
declare variable factor numeric(18,4);
declare variable IVAINC CHAR(2);
declare variable COSTO NUMERIC(18,2);
BEGIN
if ((OLD.entr_id <> 0) AND (OLD.ende_anulado = 'N')) then
    DELETE FROM MOVIMIENTO_ARTICULO WHERE (mvar_tipodoc = 11) and (mvar_idref = new.entr_id) and (mvar_item = old.ende_item);
if ((NEW.entr_id <> 0) AND (NEW.ende_anulado = 'N')) then
    begin
    select entr_fecha, entr_conc, pref_pre, entr_numero, terc_nit, entr_imptos
        from entradas where entr_id = new.entr_id
        into :fec, :conc, :Pref, :Num, :Nit, :ivainc;
    execute procedure factor_unidad_cant(new.arti_cod, new.ende_unidad) returning_values(factor);
    COSTO = ((new.ende_costo - NEW.ende_dtomonto) / :factor);
    if (IVAINC = 'S') then
        COSTO = COSTO / (1 + NEW.ende_ivaporc/100);
    INSERT INTO MOVIMIENTO_ARTICULO
        (ARTI_COD, MVAR_CONS, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM, TERC_NIT)
        VALUES(NEW.ARTI_COD, GEN_ID(ID_MOVARTI,1), NEW.BODE_COD, :FEC, 11, NEW.entr_id,
        :CONC, :factor * new.ende_cant, :COSTO, 'S', new.ende_lote, :Pref, :Num, new.ende_item, :Nit);
    /* RECORRA LAS LISTAS DE PRECIOS Y CAMBIE EL PRECIO */
    EXECUTE PROCEDURE CALCULA_PRECIOS(NEW.ARTI_COD, :FEC);
    /* ACTUALICE EL STAND */
    if (new.ende_stand is not null) then
      if (exists(select stand_cod from stands where arti_cod = new.arti_cod and stand_bodega = new.bode_cod)) then
        UPDATE stands set stand_cod = new.ende_stand where arti_cod = new.arti_cod and stand_bodega = new.bode_cod;
      else
        INSERT INTO stands (ARTI_COD, STAND_BODEGA, STAND_COD) VALUES (NEW.arti_cod, NEW.bode_cod, NEW.ende_stand);
    END
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER TRIGGER FACTCOMP_DETALLE_AD
AS
declare variable fec date;
declare variable CONSO VARCHAR(2);
declare variable CONSOLIDA INTEGER;
declare variable NUMROWS INTEGER;
declare variable VERIF CHAR(2);
BEGIN
if ((old.fcde_anulado = 'N') and (OLD.faco_id <> 0)) then
    begin
    select faco_fecha, faco_consolida from facturas_compra where faco_id = old.faco_id into :fec, :consolida;
    DELETE FROM MOVIMIENTO_ARTICULO WHERE (mvar_tipodoc = 21) and (mvar_idref = old.faco_id) and (mvar_item = old.fcde_item);
    /* RECORRA LAS LISTAS DE PRECIOS Y CAMBIE EL PRECIO */
    EXECUTE PROCEDURE CALCULA_PRECIOS(old.ARTI_COD, :FEC);
    /* LOS PENDIENTES */
    if (CONSOLIDA <> 0) then
        BEGIN
        UPDATE consolidado_faltantes SET COFA_OK = 'N' WHERE COFA_ID = :consolida AND COFA_ITEM = old.FCDE_ITEM AND ARTI_COD = old.arti_cod;
        SELECT COUNT(CEFA_ITEM) FROM consolide_faltantes WHERE CEFA_ID = :CONSOLIDA INTO :NUMROWS;
        EXECUTE procedure LEE_CONFIGURACION ('COMPRAS','DOCUMENTOS','SUMAR CANTIDADES PENDIENTES AL CONSOLIDAR DOCUMENTOS') returning_values (CONSO);
        /* IGNORE LA CONSOLIDACION SI SE VALIDAN CODIGOS DE LA ORDEN */
        SELECT MIN(CEFA_TIPOORI) FROM consolide_faltantes WHERE CEFA_ID = :CONSOLIDA INTO :NUMROWS;
        if (NUMROWS = 23) then
            BEGIN
            EXECUTE PROCEDURE LEE_CONFIGURACION('COMPRAS', 'FACTURAS', 'VERIFICAR CODIGOS DE LA ORDEN') returning_values (VERIF);
            if (VERIF = 'SI') then
                CONSO = 'NO';
            END
        SELECT COUNT(CEFA_ITEM) FROM consolide_faltantes WHERE CEFA_ID = :CONSOLIDA INTO :NUMROWS;
        if ((CONSO = 'SI') AND (NUMROWS > 1)) then
            UPDATE consolidado_faltantes SET COFA_OK = 'N' WHERE COFA_ID = :consolida;
        END
    enD
END
^

SET TERM ; ^

SET TERM ^ ;

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

        if (COSTO > 0 ) then
         BEGIN
          /* ACTUALICE EL COSTO POR PROVEEDOR */
          SELECT PVAR_FECHA FROM PROVEEDOR_ARTICULO
            WHERE TERC_NIT = :Nit AND ARTI_COD = NEW.ARTI_COD
            INTO :FECAUX;
          if (FECAUX IS NULL) then
            INSERT INTO PROVEEDOR_ARTICULO (TERC_NIT, ARTI_COD, PVAR_COSTO, PVAR_FECHA, PVAR_COD,PVAR_DES)
                VALUES (:Nit, NEW.ARTI_COD, :COSTO, :fec, NEW.fcde_codprov,NEW.fcde_desc);
          else
            UPDATE PROVEEDOR_ARTICULO
                SET PVAR_COSTO = :COSTO, PVAR_FECHA = :fec, PVAR_COD = NEW.fcde_codprov
                WHERE ARTI_COD = NEW.ARTI_COD AND TERC_NIT = :Nit;
         END
        /* RECORRA LAS LISTAS DE PRECIOS Y CAMBIE EL PRECIO */
        EXECUTE PROCEDURE CALCULA_PRECIOS(NEW.ARTI_COD, :FEC);
        END /* AFECTAR INV */
    EXECUTE PROCEDURE lee_configuracion('COMPRAS', 'FACTURAS', 'ACTUALIZAR COSTOS DE LA REMISION RELACIONADA AL GRABAR LA FACTURA') returning_values (:ACTREM);
    if ((ACTREM = 'SI') and (Tipo = 22)) then
        BEGIN
        numrows = 0;
        select mvar_cons, MVAR_ITEM, MVAR_FECHA, MVAR_IDREF, MVAR_CANT, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO
            from movimiento_articulo M, consolidado_faltantes C
            where C.cofa_id = :CONSOLIDA AND mvar_tipodoc = 22 and mvar_idref = C.cofa_idori AND C.cofa_tipoori = 22 and m.arti_cod = new.arti_cod and m.mvar_item = c.cofa_itemori
            into :numrows, :iterem, :fecrem, :idrem, :cantrem, :loterem, :prefrem, :numrem;
        
        if (numrows <> 0) then
            BEGIN
            INSERT INTO MOVIMIENTO_ARTICULO
                (ARTI_COD, MVAR_CONS, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM, TERC_NIT)
                VALUES(NEW.ARTI_COD, GEN_ID(ID_MOVARTI,1), NEW.BODE_COD, :fecrem, 22, :idrem,
                :CONC, :cantrem, :costo, 'S', :loterem, :prefrem, :numrem, :iterem, :Nit);
            DELETE FROM MOVIMIENTO_ARTICULO WHERE MVAR_CONS = :numrows;
        
            if (COSTO > 0 ) then
                BEGIN
                /* ACTUALICE EL COSTO POR PROVEEDOR */
                SELECT PVAR_FECHA FROM PROVEEDOR_ARTICULO
                    WHERE TERC_NIT = :Nit AND ARTI_COD = NEW.ARTI_COD
                    INTO :FECAUX;
                if (FECAUX IS NULL) then
                    INSERT INTO PROVEEDOR_ARTICULO (TERC_NIT, ARTI_COD, PVAR_COSTO, PVAR_FECHA, PVAR_COD,PVAR_DES)
                        VALUES (:Nit, NEW.ARTI_COD, :COSTO, :fec, NEW.fcde_codprov,NEW.fcde_desc);
                else
                    UPDATE PROVEEDOR_ARTICULO
                        SET PVAR_COSTO = :COSTO, PVAR_FECHA = :fec, PVAR_COD = NEW.fcde_codprov
                        WHERE ARTI_COD = NEW.ARTI_COD AND TERC_NIT = :Nit;
                END
            /* RECORRA LAS LISTAS DE PRECIOS Y CAMBIE EL PRECIO */
            EXECUTE PROCEDURE CALCULA_PRECIOS(NEW.ARTI_COD, :FEC);
            END
        END

    /* ACTUALICE EL PENDIENTE  */
    if (CONSOLIDA <> 0) then
        BEGIN
        UPDATE consolidado_faltantes SET COFA_OK = 'S' WHERE COFA_ID = :consolida AND COFA_ITEM = NEW.FCDE_ITEM AND ARTI_COD = NEW.arti_cod;
        EXECUTE procedure LEE_CONFIGURACION ('COMPRAS','DOCUMENTOS','SUMAR CANTIDADES PENDIENTES AL CONSOLIDAR DOCUMENTOS') returning_values (CONSO);
        /* IGNORE LA CONSOLIDACION SI SE VALIDAN CODIGOS DE LA ORDEN */
        SELECT MIN(CEFA_TIPOORI) FROM consolide_faltantes WHERE CEFA_ID = :CONSOLIDA INTO :NUMROWS;
        if (NUMROWS = 23) then
            BEGIN
            EXECUTE PROCEDURE LEE_CONFIGURACION('COMPRAS', 'FACTURAS', 'VERIFICAR CODIGOS DE LA ORDEN') returning_values (MENORV);
            if (MENORV = 'SI') then
                CONSO = 'NO';
            END
        SELECT COUNT(CEFA_ITEM) FROM consolide_faltantes WHERE CEFA_ID = :CONSOLIDA INTO :NUMROWS;
        if ((CONSO = 'SI') AND (NUMROWS > 1)) then
            UPDATE consolidado_faltantes SET COFA_IDDES = NEW.faco_id, COFA_OK = 'S' WHERE COFA_ID = :consolida;
        else
            BEGIN
            /* BUSQUE EL CONSOLIDADO EN EL MISMO ITEM Y SI ES DIFERENTE ACTUALICELO */
            select COFA_CANT * COFA_FACTOR FROM consolidado_faltantes WHERE COFA_ID = :consolida AND COFA_ITEM = NEW.FCDE_ITEM AND ARTI_COD = NEW.arti_cod INTO :CANTREL;
            if (NEW.FCDE_CANT * NEW.FCDE_FACTOR < CANTREL) then
                UPDATE consolidado_faltantes SET COFA_IDDES = NEW.faco_id, COFA_CANT = NEW.FCDE_CANT, COFA_FACTOR = NEW.FCDE_FACTOR
                    WHERE COFA_ID = :consolida AND COFA_ITEM = NEW.FCDE_ITEM AND ARTI_COD = NEW.arti_cod;
            END
        END
    /* ACTUALICE EL STAND */
    if (new.fcde_stand is not null) then
      if (exists(select stand_cod from stands where arti_cod = new.arti_cod and stand_bodega = new.bode_cod)) then
        UPDATE stands set stand_cod = new.fcde_stand where arti_cod = new.arti_cod and stand_bodega = new.bode_cod;
      else
        INSERT INTO stands (ARTI_COD, STAND_BODEGA, STAND_COD) VALUES (NEW.arti_cod, NEW.bode_cod, NEW.fcde_stand);
    END
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER TRIGGER FACTCOMP_DETALLE_AU
as
declare variable fec date;
declare variable fecaux date;
declare variable AUX varchar(90);
declare variable CONC VARCHAR(60);
declare variable Pref varchar(4);
declare variable Num varchar(6);
declare variable Nit varchar(20);
declare variable factor numeric(18,4);
declare variable TIPO INTEGER;
declare variable INVFAC CHAR(2);
declare variable IVAINC CHAR(2);
declare variable COSTO NUMERIC(18,2);
declare variable CANTREL NUMERIC(18,4);
declare variable NUMPROV VARCHAR(10);
declare variable NUMPED VARCHAR(30);
declare variable NUMREM VARCHAR(30);
declare variable CONSO VARCHAR(2);
declare variable CONSOLIDA INTEGER;
declare variable NUMROWS INTEGER;
declare variable DTOPIE NUMERIC(18,2);
declare variable ADICIONAL NUMERIC(18,2);
declare variable TOTAL NUMERIC(18,2);
declare variable IVAMONTO NUMERIC(18,2);
declare variable EXTRA NUMERIC(18,2);
declare variable FACT NUMERIC(18,4);
declare variable MENORV CHAR(2);
declare variable ACTREM CHAR(2);
declare variable FECREM date;
declare variable IDREM INTEGER;
declare variable ITEREM INTEGER;
declare variable CANTREM NUMERIC(18,4);
declare variable LOTEREM VARCHAR(15);
declare variable PREFREM CHAR(4);
BEGIN
if (old.fcde_devuelto = new.fcde_devuelto) then
    begin
    /* deshaga lo viejo */
    if ((old.fcde_anulado = 'N') and (OLD.faco_id <> 0)) then
        begin
        select faco_fecha, faco_consolida from facturas_compra where faco_id = old.faco_id into :fec, :consolida;
        DELETE FROM MOVIMIENTO_ARTICULO WHERE (mvar_tipodoc = 21) and (mvar_idref = old.faco_id) and (mvar_item = old.fcde_item);
        /* RECORRA LAS LISTAS DE PRECIOS Y CAMBIE EL PRECIO */
        EXECUTE PROCEDURE CALCULA_PRECIOS(old.ARTI_COD, :FEC);
        /* LOS PENDIENTES */
        if (CONSOLIDA <> 0) then
            BEGIN
            UPDATE consolidado_faltantes SET COFA_OK = 'N' WHERE COFA_ID = :consolida AND COFA_ITEM = old.FCDE_ITEM AND ARTI_COD = old.arti_cod;
            SELECT COUNT(CEFA_ITEM) FROM consolide_faltantes WHERE CEFA_ID = :CONSOLIDA INTO :NUMROWS;
            EXECUTE procedure LEE_CONFIGURACION ('COMPRAS','DOCUMENTOS','SUMAR CANTIDADES PENDIENTES AL CONSOLIDAR DOCUMENTOS') returning_values (CONSO);
            /* IGNORE LA CONSOLIDACION SI SE VALIDAN CODIGOS DE LA ORDEN */
            SELECT MIN(CEFA_TIPOORI) FROM consolide_faltantes WHERE CEFA_ID = :CONSOLIDA INTO :NUMROWS;
            if (NUMROWS = 23) then
                BEGIN
                EXECUTE PROCEDURE LEE_CONFIGURACION('COMPRAS', 'FACTURAS', 'VERIFICAR CODIGOS DE LA ORDEN') returning_values (MENORV);
                if (MENORV = 'SI') then
                    CONSO = 'NO';
                END
            if (CONSO = 'SI') then
                UPDATE consolidado_faltantes SET COFA_OK = 'N' WHERE COFA_ID = :consolida;
            END
        end
    /* Registre el nuevo */
    if ((new.fcde_anulado = 'N') and (new.faco_id <> 0)) then
        BEGIN
        select faco_fecha, pref_pre, faco_numero, terc_nit, faco_imptos, faco_numprov, faco_remision, faco_orden, faco_consolida, faco_dtomonto, faco_adicional, faco_total, faco_ivamonto, faco_extra
            from facturas_compra where faco_id = new.faco_id
            into :fec, :Pref, :Num, :Nit, :ivainc, :numprov, :numrem, :numped, :consolida, :dtopie, :adicional, :total, :ivamonto, :extra;
        conc = 'FACTURA DE COMPRA No.' || PREF || NUM || '-' || NUMPROV;
        if (NUMREM <> '') then
            BEGIN
            AUX = SUBSTR(NUMREM, 1, 15);
            conc = conc || '-REM:' || AUX;
            END
        else
            if (NUMPED <> '') then
                BEGIN
                AUX = SUBSTR(NUMPED, 1, 15);
                conc = conc || '-ORDEN ' || AUX;
                END
        SELECT MAX(CEFA_TIPOORI) FROM consolide_faltantes WHERE CEFA_ID = :CONSOLIDA INTO :TIPO;
        if (Tipo is null) then
            Tipo = 0;
        execute procedure lee_configuracion('COMPRAS', 'FACTURAS', 'AFECTAR INVENTARIO CON LA FACTURA') returning_values (:INVFAC);
        /* si se hizo con base en una remision no afecte inventario */
        if ((Tipo <> 22) and (INVFAC = 'SI')) then
            begin
            execute procedure factor_unidad_cant(new.arti_cod, new.fcde_unidad) returning_values(factor);
            COSTO = ((new.fcde_prunit - NEW.fcde_dtomonto) / :factor);
            if (IVAINC = 'S') then
                COSTO = COSTO / (1 + NEW.fcde_ivaporc/100);
            EXECUTE PROCEDURE lee_configuracion('COMPRAS','FACTURAS','DESCUENTO Y VALOR ADICIONAL DEL DOCUMENTO COMO MENOR VALOR DEL COSTO') returning_values (:MENORV);
            if (MENORV = 'SI') then
                BEGIN
                FACT = (TOTAL - EXTRA - IVAMONTO);
                if ((FACT - ADICIONAL + DTOPIE) <> 0) then
                    FACT = FACT / (FACT - ADICIONAL + DTOPIE);
                ELSE
                    FACT = 1;
                COSTO = COSTO * FACT;
                END
            INSERT INTO MOVIMIENTO_ARTICULO
                (ARTI_COD, MVAR_CONS, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM, TERC_NIT)
                VALUES(NEW.ARTI_COD, GEN_ID(ID_MOVARTI,1), NEW.BODE_COD, :FEC, 21, NEW.faco_id,
                :CONC, :factor * new.fcde_cant, :COSTO, 'S', new.fcde_lote, :Pref, :Num, NEW.fcde_item, :Nit);
            if (COSTO > 0 ) then
             BEGIN
              /* ACTUALICE EL COSTO POR PROVEEDOR */
              SELECT PVAR_FECHA FROM PROVEEDOR_ARTICULO
                WHERE TERC_NIT = :Nit AND ARTI_COD = NEW.ARTI_COD INTO :FECAUX;
              if (FECAUX IS NULL) then
                INSERT INTO PROVEEDOR_ARTICULO (TERC_NIT, ARTI_COD, PVAR_COSTO, PVAR_FECHA, PVAR_COD,PVAR_DES)
                    VALUES (:Nit, NEW.ARTI_COD, :COSTO, :fec, NEW.fcde_codprov,NEW.fcde_desc);
              else
                UPDATE PROVEEDOR_ARTICULO
                    SET PVAR_COSTO = :COSTO, PVAR_FECHA = :fec, PVAR_COD = NEW.fcde_codprov
                    WHERE ARTI_COD = NEW.ARTI_COD AND TERC_NIT = :Nit;
             END
            /* RECORRA LAS LISTAS DE PRECIOS Y CAMBIE EL PRECIO */
            EXECUTE PROCEDURE CALCULA_PRECIOS(NEW.ARTI_COD, :FEC);
            end
        EXECUTE PROCEDURE lee_configuracion('COMPRAS', 'FACTURAS', 'ACTUALIZAR COSTOS DE LA REMISION RELACIONADA AL GRABAR LA FACTURA') returning_values (:ACTREM);
        if ((ACTREM = 'SI') and (Tipo = 22)) then
            BEGIN
            numrows = 0;
            select mvar_cons, MVAR_ITEM, MVAR_FECHA, MVAR_IDREF, MVAR_CANT, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO
                from movimiento_articulo M, consolidado_faltantes C
                where C.cofa_id = :CONSOLIDA AND mvar_tipodoc = 22 and mvar_idref = C.cofa_idori AND C.cofa_tipoori = 22 and m.arti_cod = new.arti_cod
                into :numrows, :iterem, :fecrem, :idrem, :cantrem, :loterem, :prefrem, :numrem;
            
            if (numrows <> 0) then
                BEGIN
                DELETE FROM MOVIMIENTO_ARTICULO WHERE MVAR_CONS = :numrows;
                INSERT INTO MOVIMIENTO_ARTICULO
                    (ARTI_COD, MVAR_CONS, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM, TERC_NIT)
                    VALUES(NEW.ARTI_COD, GEN_ID(ID_MOVARTI,1), NEW.BODE_COD, :fecrem, 22, :idrem,
                    :CONC, :cantrem, :costo, 'S', :loterem, :prefrem, :numrem, :iterem, :Nit);
        
                if (COSTO > 0 ) then
                    BEGIN
                    /* ACTUALICE EL COSTO POR PROVEEDOR */
                    SELECT PVAR_FECHA FROM PROVEEDOR_ARTICULO
                        WHERE TERC_NIT = :Nit AND ARTI_COD = NEW.ARTI_COD
                        INTO :FECAUX;
                    if (FECAUX IS NULL) then
                        INSERT INTO PROVEEDOR_ARTICULO (TERC_NIT, ARTI_COD, PVAR_COSTO, PVAR_FECHA, PVAR_COD,PVAR_DES)
                            VALUES (:Nit, NEW.ARTI_COD, :COSTO, :fec, NEW.fcde_codprov,NEW.fcde_desc);
                    else
                        UPDATE PROVEEDOR_ARTICULO
                            SET PVAR_COSTO = :COSTO, PVAR_FECHA = :fec, PVAR_COD = NEW.fcde_codprov
                            WHERE ARTI_COD = NEW.ARTI_COD AND TERC_NIT = :Nit;
                    END
                /* RECORRA LAS LISTAS DE PRECIOS Y CAMBIE EL PRECIO */
                EXECUTE PROCEDURE CALCULA_PRECIOS(NEW.ARTI_COD, :FEC);
                END
            END

        if (CONSOLIDA <> 0) then
            begin
            UPDATE consolidado_faltantes SET COFA_OK = 'S' WHERE COFA_ID = :consolida AND COFA_ITEM = NEW.FCDE_ITEM AND ARTI_COD = NEW.arti_cod;
            EXECUTE procedure LEE_CONFIGURACION ('COMPRAS','DOCUMENTOS','SUMAR CANTIDADES PENDIENTES AL CONSOLIDAR DOCUMENTOS') returning_values (CONSO);
            /* IGNORE LA CONSOLIDACION SI SE VALIDAN CODIGOS DE LA ORDEN */
            SELECT MIN(CEFA_TIPOORI) FROM consolide_faltantes WHERE CEFA_ID = :CONSOLIDA INTO :NUMROWS;
            if (NUMROWS = 23) then
                BEGIN
                EXECUTE PROCEDURE LEE_CONFIGURACION('COMPRAS', 'FACTURAS', 'VERIFICAR CODIGOS DE LA ORDEN') returning_values (MENORV);
                if (MENORV = 'SI') then
                    CONSO = 'NO';
                END
            SELECT COUNT(CEFA_ITEM) FROM consolide_faltantes WHERE CEFA_ID = :CONSOLIDA INTO :NUMROWS;
            if ((CONSO = 'SI') AND (NUMROWS > 1)) then
                UPDATE consolidado_faltantes SET COFA_IDDES = NEW.faco_id, COFA_OK = 'S' WHERE COFA_ID = :consolida;
            else
                BEGIN
                /* BUSQUE EL CONSOLIDADO EN EL MISMO ITEM Y SI ES DIFERENTE ACTUALICELO */
                select COFA_CANT * COFA_FACTOR FROM consolidado_faltantes WHERE COFA_ID = :consolida AND COFA_ITEM = NEW.FCDE_ITEM AND ARTI_COD = NEW.arti_cod INTO :CANTREL;
                if (NEW.FCDE_CANT * NEW.FCDE_FACTOR < CANTREL) then
                    UPDATE consolidado_faltantes SET COFA_IDDES = NEW.faco_id, COFA_CANT = NEW.FCDE_CANT, COFA_FACTOR = NEW.FCDE_FACTOR
                        WHERE COFA_ID = :consolida AND COFA_ITEM = NEW.FCDE_ITEM AND ARTI_COD = NEW.arti_cod;
                END
            end
        /* ACTUALICE EL STAND */
        if (new.fcde_stand is not null) then
          if (exists(select stand_cod from stands where arti_cod = new.arti_cod and stand_bodega = new.bode_cod)) then
            UPDATE stands set stand_cod = new.fcde_stand where arti_cod = new.arti_cod and stand_bodega = new.bode_cod;
          else
            INSERT INTO stands (ARTI_COD, STAND_BODEGA, STAND_COD) VALUES (NEW.arti_cod, NEW.bode_cod, NEW.fcde_stand);
        END
    end
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER TRIGGER NOTAS_CREDITO_PROVEEDOR_AI
AS
declare variable COSTO NUMERIC(18,2);
declare variable EXISTENCIA NUMERIC(18,4);
declare variable CODBOD VARCHAR(3);
BEGIN
if ((NEW.NCPR_ID <> 0) and (new.ncpr_anulado = 'N')) then
    BEGIN
    /* Registre el nuevo saldo del documento */
    INSERT INTO SALDOS_DOC_CXPAGAR (SDCP_TIPOREF, SDCP_IDREF, SDCP_FECHA, TERC_NIT, SDCP_RTEFTE, SDCP_RTIVA, SDCP_RTICA, SDCP_ABONO, SDCP_ABRTFTE, SDCP_ABRTIVA, SDCP_ABRTICA, SDCP_DEBITO, SDCP_MONTO, SDCP_TRM)
        VALUES (52, NEW.NCPR_ID, NEW.ncpr_fecha, NEW.terc_nit, (NEW.ncpr_rtftemonto * -1), (NEW.ncpr_rtivamonto * -1), (NEW.ncpr_rticamonto * -1), 0, 0, 0, 0, 'N', (NEW.ncpr_monto+NEW.ncpr_ivamonto)*-1, NEW.ncpr_trm);
    /* Registre el movimiento del proveedor */
    INSERT INTO MOVIMIENTO_PROVEEDOR (MVPR_ID, TERC_NIT, MVPR_TIPOREF, MVPR_IDREF, MVPR_FECHA, MVPR_VENCE, MVPR_CONC, MVPR_MONTO, MVPR_RTFTE, MVPR_RTIVA, MVPR_RTICA, MVPR_DEBITO, MVPR_ABONO, MVPR_PREFIJO, MVPR_NUMERO, MVPR_TRM)
      VALUES (GEN_ID(ID_MOVPROV, 1), NEW.TERC_NIT, 52, NEW.NCPR_ID, NEW.NCPR_FECHA, NEW.NCPR_FECHA, NEW.NCPR_CONC, NEW.NCPR_MONTO+NEW.NCPR_IVAMONTO, NEW.NCPR_RTFTEMONTO, NEW.NCPR_RTIVAMONTO, NEW.NCPR_RTICAMONTO, 'N', 'N', NEW.pref_pre, NEW.ncpr_numero, NEW.ncpr_trm);
    /* afecte el articulo */
    if (new.arti_cod <> '') then
        begin
        /* CALCULE EL NUEVO COSTO */
        execute procedure costo_promedio (new.arti_cod, new.ncpr_fecha) returning_values (:COSTO);
        execute procedure saldo_total_inventario (new.arti_cod, new.ncpr_fecha) returning_values (:EXISTENCIA);
        COSTO = ((COSTO * EXISTENCIA) - NEW.ncpr_monto) / EXISTENCIA;
        FOR SELECT DISTINCT BODE_COD FROM EXISTENCIA WHERE ARTI_COD = NEW.ARTI_COD INTO :CODBOD do
            BEGIN
            execute procedure saldo_inventario (new.arti_cod, :CODBOD, new.ncpr_fecha) returning_values (:EXISTENCIA);
            if (EXISTENCIA <> 0) then
                BEGIN
                /* SAQUE TODO LO QUE TENGA */
                INSERT INTO MOVIMIENTO_ARTICULO
                  (ARTI_COD, MVAR_CONS, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM, TERC_NIT)
                  VALUES(NEW.ARTI_COD, GEN_ID(ID_MOVARTI,1), :CODBOD, new.ncpr_fecha, 52, NEW.ncpr_id,
                  new.ncpr_conc, :EXISTENCIA, 0, 'N', '', new.pref_pre, new.ncpr_numero, 1, new.terc_nit);
                END
            END
        FOR SELECT DISTINCT BODE_COD, MVAR_CANT FROM MOVIMIENTO_ARTICULO WHERE MVAR_TIPODOC = 52 AND MVAR_IDREF = NEW.ncpr_id
            INTO :CODBOD, :existencia do
            BEGIN
            /* META TODO CON EL NUEVO COSTO */
            INSERT INTO MOVIMIENTO_ARTICULO
              (ARTI_COD, MVAR_CONS, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM, TERC_NIT)
              VALUES(NEW.ARTI_COD, GEN_ID(ID_MOVARTI,1), :CODBOD, new.ncpr_fecha, 52, NEW.ncpr_id,
              new.ncpr_conc, :EXISTENCIA, :COSTO, 'S', '', new.pref_pre, new.ncpr_numero, 1, new.terc_nit);
            END
        /* RECORRA LAS LISTAS DE PRECIOS Y CAMBIE EL PRECIO */
        EXECUTE PROCEDURE CALCULA_PRECIOS(NEW.ARTI_COD, new.ncpr_fecha);
        end
    INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
        VALUES (USER, 52, NEW.ncpr_id, 'I', NEW.pref_pre || NEW.ncpr_numero);
    END
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER TRIGGER NOTAS_CREDITO_PROVEEDOR_AU
AS
declare variable ABONOS char(1);
declare variable consec INTEGER;
declare variable COSTO NUMERIC(18,2);
declare variable EXISTENCIA NUMERIC(18,4);
declare variable CODBOD VARCHAR(3);
BEGIN
if (new.ncpr_anulado = 'S') then
    begin
    select enco_consec from comprobante_encabezado where enco_tiporef = 52 and enco_idref = old.ncpr_id into :consec;
    if (NOT consec is null) then
      delete from comprobante_detalle where enco_consec = :consec;
    delete from comprobante_encabezado where enco_tiporef = 52 and enco_idref = old.ncpr_id;
    INSERT INTO AUDITORIA (AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
        VALUES (USER, 52, new.ncpr_id, 'A', NEW.pref_pre || NEW.ncpr_numero);
    end

/* BORRE EL REGISTRO PREVIO */
if ((old.ncpr_id <> 0) and (old.ncpr_anulado = 'N')) then
    begin
    /* Verifique si habia abonos a la nota */
    ABONOS = 'N';
    select 'S' FROM SALDOS_DOC_CXPAGAR WHERE SDCP_TIPOREF = 52 AND SDCP_IDREF = OLD.NCPR_ID AND SDCP_ABONO <> 0 INTO :ABONOS;
    if (ABONOS = 'N') then
        BEGIN
        /* BORRE EL REGISTRO PREVIO */
        delete from saldos_doc_cxpagar where sdcp_tiporef = 52 and sdcp_idref = old.ncpr_id;
        delete from movimiento_PROVEEDOR where (mvpr_tiporef = 52) and (mvpr_idref = old.ncpr_id);
        delete from movimiento_articulo where  (mvar_tipodoc = 52) and (mvar_idref = old.ncpr_id);
        END
    else
        exception DOCUMENTO_CON_ABONOS 'El descuento de proveedor ' || old.pref_pre || old.ncpr_numero || ' tiene abonos registrados.';
    end
if ((new.ncpr_id <> 0) and (new.ncpr_anulado = 'N')) then
    begin
    /* Registre el nuevo saldo del documento */
    INSERT INTO SALDOS_DOC_CXPAGAR (SDCP_TIPOREF, SDCP_IDREF, SDCP_FECHA, TERC_NIT, SDCP_RTEFTE, SDCP_RTIVA, SDCP_RTICA, SDCP_ABONO, SDCP_ABRTFTE, SDCP_ABRTIVA, SDCP_ABRTICA, SDCP_DEBITO, SDCP_MONTO, SDCP_TRM)
        VALUES (52, NEW.NCPR_ID, NEW.ncpr_fecha, NEW.terc_nit, (NEW.ncpr_rtftemonto * -1), (NEW.ncpr_rtivamonto * -1), (NEW.ncpr_rticamonto * -1), 0, 0, 0, 0, 'N', (NEW.ncpr_monto+NEW.ncpr_ivamonto)*-1, NEW.ncpr_trm);
    /* Registre el movimiento del proveedor */
    INSERT INTO MOVIMIENTO_PROVEEDOR (MVPR_ID, TERC_NIT, MVPR_TIPOREF, MVPR_IDREF, MVPR_FECHA, MVPR_VENCE, MVPR_CONC, MVPR_MONTO, MVPR_RTFTE, MVPR_RTIVA, MVPR_RTICA, MVPR_DEBITO, MVPR_ABONO, MVPR_PREFIJO, MVPR_NUMERO, MVPR_TRM)
        VALUES (GEN_ID(ID_MOVPROV, 1), NEW.TERC_NIT, 52, NEW.NCPR_ID, NEW.NCPR_FECHA, NEW.NCPR_FECHA, NEW.NCPR_CONC, NEW.NCPR_MONTO+NEW.ncpr_ivamonto, NEW.NCPR_RTFTEMONTO, NEW.NCPR_RTIVAMONTO, NEW.NCPR_RTICAMONTO, 'N', 'N', NEW.pref_pre, NEW.ncpr_numero, NEW.ncpr_trm);
    /* afecte el articulo */
    if (new.arti_cod <> '') then
        begin
        /* CALCULE EL NUEVO COSTO */
        execute procedure costo_promedio (new.arti_cod, new.ncpr_fecha) returning_values (:COSTO);
        execute procedure saldo_total_inventario (new.arti_cod, new.ncpr_fecha) returning_values (:EXISTENCIA);
        COSTO = ((COSTO * EXISTENCIA) - NEW.ncpr_monto) / EXISTENCIA;
        FOR SELECT DISTINCT BODE_COD FROM EXISTENCIA WHERE ARTI_COD = NEW.ARTI_COD INTO :CODBOD do
            BEGIN
            execute procedure saldo_inventario (new.arti_cod, :CODBOD, new.ncpr_fecha) returning_values (:EXISTENCIA);
            if (EXISTENCIA <> 0) then
                BEGIN
                /* SAQUE TODO LO QUE TENGA */
                INSERT INTO MOVIMIENTO_ARTICULO
                    (ARTI_COD, MVAR_CONS, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM, TERC_NIT)
                    VALUES(NEW.ARTI_COD, GEN_ID(ID_MOVARTI,1), :CODBOD, new.ncpr_fecha, 52, NEW.ncpr_id,
                    new.ncpr_conc, :EXISTENCIA, 0, 'N', '', new.pref_pre, new.ncpr_numero, 1, new.terc_nit);
                end
            END
        FOR SELECT DISTINCT BODE_COD, MVAR_CANT FROM MOVIMIENTO_ARTICULO WHERE MVAR_TIPODOC = 52 AND MVAR_IDREF = NEW.ncpr_id
            INTO :CODBOD, :existencia do
            BEGIN
            /* META TODO CON EL NUEVO COSTO */
            INSERT INTO MOVIMIENTO_ARTICULO
                (ARTI_COD, MVAR_CONS, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM, TERC_NIT)
                VALUES(NEW.ARTI_COD, GEN_ID(ID_MOVARTI,1), :CODBOD, new.ncpr_fecha, 52, NEW.ncpr_id,
                new.ncpr_conc, :EXISTENCIA, :COSTO, 'S', '', new.pref_pre, new.ncpr_numero, 1, new.terc_nit);
            END
        /* RECORRA LAS LISTAS DE PRECIOS Y CAMBIE EL PRECIO */
        EXECUTE PROCEDURE CALCULA_PRECIOS(NEW.ARTI_COD, new.ncpr_fecha);
        end
    INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
        VALUES (USER, 52, NEW.ncpr_id, 'U', NEW.pref_pre || NEW.ncpr_numero);
    end
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER TRIGGER NOTAS_DEBITO_PROVEEDOR_AI
AS
declare variable COSTO NUMERIC(18,2);
declare variable EXISTENCIA NUMERIC(18,4);
declare variable CODBOD VARCHAR(3);
BEGIN
  if ((NEW.NDPR_ID <> 0) and (new.ndpr_anulado = 'N')) then
    BEGIN
    INSERT INTO SALDOS_DOC_CXPAGAR (SDCP_TIPOREF, SDCP_IDREF, SDCP_FECHA, TERC_NIT, SDCP_RTEFTE, SDCP_RTIVA, SDCP_RTICA, SDCP_ABONO, SDCP_ABRTFTE, SDCP_ABRTIVA, SDCP_ABRTICA, SDCP_DEBITO, SDCP_MONTO, SDCP_TRM)
        VALUES (51, NEW.NDPR_ID, NEW.ndpr_fecha, NEW.terc_nit, NEW.ndpr_rtftemonto, NEW.ndpr_rtivamonto, NEW.ndpr_rticamonto, 0, 0, 0, 0, 'S', NEW.ndpr_monto+NEW.ndpr_ivamonto, NEW.ndpr_trm);
    /* Registre el movimiento del proveedor */
    INSERT INTO MOVIMIENTO_PROVEEDOR (MVPR_ID, TERC_NIT, MVPR_TIPOREF, MVPR_IDREF, MVPR_FECHA, MVPR_VENCE, MVPR_CONC, MVPR_MONTO, MVPR_RTFTE, MVPR_RTIVA, MVPR_RTICA, MVPR_DEBITO, MVPR_ABONO, MVPR_PREFIJO, MVPR_NUMERO, MVPR_TRM)
      VALUES (GEN_ID(ID_MOVPROV, 1), NEW.TERC_NIT, 51, NEW.NDPR_ID, NEW.NDPR_FECHA, NEW.NDPR_VENCE, NEW.NDPR_CONC, NEW.NDPR_MONTO+NEW.ndpr_Ivamonto, NEW.NDPR_RTFTEMONTO, NEW.NDPR_RTIVAMONTO, NEW.NDPR_RTICAMONTO, 'S', 'N', NEW.pref_pre, NEW.ndpr_numero, NEW.ndpr_trm);
    /* afecte el articulo */
    if (new.arti_cod <> '') then
        begin
        /* CALCULE EL NUEVO COSTO */
        execute procedure costo_promedio (new.arti_cod, new.ndpr_fecha) returning_values (:COSTO);
        execute procedure saldo_total_inventario (new.arti_cod, new.ndpr_fecha) returning_values (:EXISTENCIA);
        COSTO = (COSTO * EXISTENCIA + (NEW.ndpr_monto)) / EXISTENCIA;
        FOR SELECT DISTINCT BODE_COD FROM EXISTENCIA WHERE ARTI_COD = NEW.ARTI_COD INTO :CODBOD do
            BEGIN
            execute procedure saldo_inventario (new.arti_cod, :CODBOD, new.ndpr_fecha) returning_values (:EXISTENCIA);
            if (existencia <> 0) then
                BEGIN
                /* SAQUE TODO LO QUE TENGA */
                INSERT INTO MOVIMIENTO_ARTICULO
                  (ARTI_COD, MVAR_CONS, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM, TERC_NIT)
                  VALUES(NEW.ARTI_COD, GEN_ID(ID_MOVARTI,1), :CODBOD, new.ndpr_fecha, 51, NEW.ndpr_id,
                  new.ndpr_conc, :EXISTENCIA, 0, 'N', '', new.pref_pre, new.ndpr_numero, 1, new.terc_nit);
                END
            END
        FOR SELECT DISTINCT BODE_COD, MVAR_CANT FROM MOVIMIENTO_ARTICULO WHERE MVAR_TIPODOC = 51 AND MVAR_IDREF = NEW.ndpr_id
            INTO :CODBOD, :existencia do
            BEGIN
            /* META TODO CON EL NUEVO COSTO */
            INSERT INTO MOVIMIENTO_ARTICULO
              (ARTI_COD, MVAR_CONS, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM, TERC_NIT)
              VALUES(NEW.ARTI_COD, GEN_ID(ID_MOVARTI,1), :CODBOD, new.ndpr_fecha, 51, NEW.ndpr_id,
              new.ndpr_conc, :EXISTENCIA, :COSTO, 'S', '', new.pref_pre, new.ndpr_numero, 1, new.terc_nit);
            END
        /* RECORRA LAS LISTAS DE PRECIOS Y CAMBIE EL PRECIO */
        EXECUTE PROCEDURE CALCULA_PRECIOS(NEW.ARTI_COD, new.ndpr_fecha);
        end
    INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
        VALUES (USER, 51, NEW.ndpr_id, 'I', NEW.pref_pre || NEW.ndpr_numero);
    END
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER TRIGGER NOTAS_DEBITO_PROVEEDOR_AU
AS
declare variable ABONOS char(1);
declare variable consec INTEGER;
declare variable COSTO NUMERIC(18,2);
declare variable EXISTENCIA NUMERIC(18,4);
declare variable CODBOD VARCHAR(3);
BEGIN
if (new.ndpr_anulado = 'S') then
    begin
    select enco_consec from comprobante_encabezado where enco_tiporef = 51 and enco_idref = old.ndpr_id into :consec;
    if (NOT consec is null) then
      delete from comprobante_detalle where enco_consec = :consec;
    delete from comprobante_encabezado where enco_tiporef = 51 and enco_idref = old.ndpr_id;
    INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
        VALUES (USER, 51, NEW.ndpr_id, 'A', NEW.pref_pre || NEW.ndpr_numero);
    end

/* BORRE EL REGISTRO PREVIO */
if ((old.ndpr_id <> 0) and (old.ndpr_anulado = 'N')) then
    begin
    /* Verifique si habia abonos a la nota */
    ABONOS = 'N';
    select 'S' FROM SALDOS_DOC_CXPAGAR WHERE SDCP_TIPOREF = 51 AND SDCP_IDREF = OLD.NDPR_ID AND SDCP_ABONO <> 0 INTO :ABONOS;
    if (ABONOS = 'N') then
        BEGIN
        /* BORRE EL REGISTRO PREVIO */
        delete from saldos_doc_cxpagar where sdcp_tiporef = 51 and sdcp_idref = old.ndpr_id;
        delete from movimiento_PROVEEDOR where (mvpr_tiporef = 51) and (mvpr_idref = old.ndpr_id);
        delete from movimiento_articulo where  (mvar_tipodoc = 51) and (mvar_idref = old.ndpr_id);
        END
    else
        exception DOCUMENTO_CON_ABONOS 'El cargo de proveedor ' || old.pref_pre || old.ndpr_numero || ' tiene abonos registrados.';
    end
if ((new.ndpr_id <> 0) and (new.ndpr_anulado = 'N')) then
    begin
    /* Registre el nuevo saldo del documento */
    INSERT INTO SALDOS_DOC_CXPAGAR (SDCP_TIPOREF, SDCP_IDREF, SDCP_FECHA, TERC_NIT, SDCP_RTEFTE, SDCP_RTIVA, SDCP_RTICA, SDCP_ABONO, SDCP_ABRTFTE, SDCP_ABRTIVA, SDCP_ABRTICA, SDCP_DEBITO, SDCP_MONTO, SDCP_TRM)
        VALUES (51, NEW.NDPR_ID, NEW.ndpr_fecha, NEW.terc_nit, NEW.ndpr_rtftemonto, NEW.ndpr_rtivamonto, NEW.ndpr_rticamonto, 0, 0, 0, 0, 'N', NEW.ndpr_monto+NEW.ndpr_ivamonto, NEW.ndpr_trm);
    /* Registre el movimiento del proveedor */
    INSERT INTO MOVIMIENTO_PROVEEDOR (MVPR_ID, TERC_NIT, MVPR_TIPOREF, MVPR_IDREF, MVPR_FECHA, MVPR_VENCE, MVPR_CONC, MVPR_MONTO, MVPR_RTFTE, MVPR_RTIVA, MVPR_RTICA, MVPR_DEBITO, MVPR_ABONO, MVPR_PREFIJO, MVPR_NUMERO, MVPR_TRM)
        VALUES (GEN_ID(ID_MOVPROV, 1), NEW.TERC_NIT, 51, NEW.NDPR_ID, NEW.NDPR_FECHA, NEW.ndpr_vence, NEW.NDPR_CONC, NEW.NDPR_MONTO+NEW.ndpr_ivamonto, NEW.NDPR_RTFTEMONTO, NEW.NDPR_RTIVAMONTO, NEW.NDPR_RTICAMONTO, 'S', 'N', NEW.pref_pre, NEW.ndpr_numero, NEW.ndpr_trm);
    if (new.arti_cod <> '') then
        begin
        /* CALCULE EL NUEVO COSTO */
        execute procedure costo_promedio (new.arti_cod, new.ndpr_fecha) returning_values (:COSTO);
        execute procedure saldo_total_inventario (new.arti_cod, new.ndpr_fecha) returning_values (:EXISTENCIA);
        COSTO = (COSTO * EXISTENCIA + (NEW.ndpr_monto)) / EXISTENCIA;
        FOR SELECT DISTINCT BODE_COD FROM EXISTENCIA WHERE ARTI_COD = NEW.ARTI_COD INTO :CODBOD do
            BEGIN
            execute procedure saldo_inventario (new.arti_cod, :CODBOD, new.ndpr_fecha) returning_values (:EXISTENCIA);
            if (existencia <> 0) then
                BEGIN
                /* SAQUE TODO LO QUE TENGA */
                INSERT INTO MOVIMIENTO_ARTICULO
                  (ARTI_COD, MVAR_CONS, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM, TERC_NIT)
                  VALUES(NEW.ARTI_COD, GEN_ID(ID_MOVARTI,1), :CODBOD, new.ndpr_fecha, 51, NEW.ndpr_id,
                  new.ndpr_conc, :EXISTENCIA, 0, 'N', '', new.pref_pre, new.ndpr_numero, 1, new.terc_nit);
                END
            END
        FOR SELECT DISTINCT BODE_COD, MVAR_CANT FROM MOVIMIENTO_ARTICULO WHERE MVAR_TIPODOC = 51 AND MVAR_IDREF = NEW.ndpr_id
            INTO :CODBOD, :existencia do
            BEGIN
            /* META TODO CON EL NUEVO COSTO */
            INSERT INTO MOVIMIENTO_ARTICULO
              (ARTI_COD, MVAR_CONS, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM, TERC_NIT)
              VALUES(NEW.ARTI_COD, GEN_ID(ID_MOVARTI,1), :CODBOD, new.ndpr_fecha, 51, NEW.ndpr_id,
              new.ndpr_conc, :EXISTENCIA, :COSTO, 'S', '', new.pref_pre, new.ndpr_numero, 1, new.terc_nit);
            END
        /* RECORRA LAS LISTAS DE PRECIOS Y CAMBIE EL PRECIO */
        EXECUTE PROCEDURE CALCULA_PRECIOS(NEW.ARTI_COD, new.ndpr_fecha);
        end
    INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
        VALUES (USER, 51, NEW.ndpr_id, 'U', NEW.pref_pre || NEW.ndpr_numero);
    end
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER TRIGGER REMISION_PROVEEDOR_DET_AI
AS
declare variable fec date;
declare variable CONC VARCHAR(60);
declare variable factor numeric(18,4);
declare variable Pref varchar(4);
declare variable Num varchar(6);
declare variable EXISTE CHAR(1);
declare variable NIT VARCHAR(20);
declare variable NUMPROV VARCHAR(20);
declare variable Tipo Integer;
declare variable idfact integer;
declare variable numrows integer;
declare variable IVAINC CHAR(2);
declare variable COSTO NUMERIC(18,2);
declare variable CANTREL NUMERIC(18,4);
declare variable NUMPED VARCHAR(30);
declare variable CONSO CHAR(2);
declare variable CONSOLIDA INTEGER;
declare variable DTOPIE NUMERIC(18,2);
declare variable ADICIONAL NUMERIC(18,2);
declare variable TOTAL NUMERIC(18,2);
declare variable IVAMONTO NUMERIC(18,2);
declare variable EXTRA NUMERIC(18,2);
declare variable FACT NUMERIC(18,4);
declare variable MENORV CHAR(2);
declare variable CEROS CHAR(2);
declare variable ACTREM CHAR(2);
BEGIN
  if ((NEW.repr_id <> 0) and (new.rpvd_anulado = 'N')) then
    BEGIN
    select max(rprd_tiporel), max(rprd_idrel) from remision_proveedor_docrela
        where repr_id = new.repr_id into :Tipo, :idfact;
    if (Tipo is null) then
        Tipo = 0;
    /* si se hizo con base en una factura que afecto el inventario no afecte inventario */
    numrows = 0;
    if (Tipo = 21) Then
        select count(*) from movimiento_articulo where mvar_tipodoc = 21 and mvar_idref = :idfact into :numrows;
    if (numrows is null) then
        numrows = 0;
    if (numrows = 0) then
        begin
        select repr_fecha, pref_pre, repr_numero, REPR_IMPTOS, terc_nit, REPR_NUMPROV, REPR_ORDEN, REPR_CONSOLIDA, repr_dtomonto, repr_adicional, repr_total, repr_ivamonto, repr_extra
            from remision_proveedor where repr_id = new.repr_id
            into :fec, :Pref, :Num, :IVAINC, :NIT, :NUMPROV, :numped, :CONSOLIDA, :dtopie, :adicional, :total, :ivamonto, :extra;
        execute procedure factor_unidad_cant(new.arti_cod, new.rpvd_unidad) returning_values(factor);
        CONC = 'REMISION PROVEEDOR No.' || PREF || NUM || '-' || NUMPROV;
        if (numped <> '') then
            conc = conc || '-ORDEN ' || NUMPED;
        COSTO = ((new.rpvd_prunit - NEW.rpvd_dtomonto) / :factor);
        if (IVAINC = 'S') then
            COSTO = COSTO / (1 + NEW.rpvd_ivaporc/100);
        EXECUTE PROCEDURE lee_configuracion('COMPRAS','FACTURAS','DESCUENTO Y VALOR ADICIONAL DEL DOCUMENTO COMO MENOR VALOR DEL COSTO') returning_values (:MENORV);
        if (MENORV = 'SI') then
            BEGIN
            FACT = (TOTAL - EXTRA - IVAMONTO);
            if ((FACT - ADICIONAL + DTOPIE) <> 0) then
                FACT = FACT / (FACT - ADICIONAL + DTOPIE);
            ELSE
                FACT = 1;
            COSTO = COSTO * FACT;
            END
        if (COSTO = 0) then
            BEGIN
            EXECUTE PROCEDURE lee_configuracion('COMPRAS', 'REMISIONES', 'PERMITIR CEROS EN COSTOS DE MERCANCIA') returning_values (:ceros);
            EXECUTE PROCEDURE lee_configuracion('COMPRAS', 'FACTURAS', 'ACTUALIZAR COSTOS DE LA REMISION RELACIONADA AL GRABAR LA FACTURA') returning_values (:ACTREM);
            if ((ACTREM = 'SI') and (CEROS = 'NO')) then
                execute procedure costo_promedio(NEW.arti_cod, :fec) returning_values (:COSTO);
            END
        INSERT INTO MOVIMIENTO_ARTICULO
          (ARTI_COD, MVAR_CONS, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM, TERC_NIT)
          VALUES(NEW.ARTI_COD, GEN_ID(ID_MOVARTI,1), NEW.BODE_COD, :FEC, 22, NEW.repr_id,
          :CONC, :factor * new.rpvd_cant, :COSTO, 'S', new.rpvd_lote, :Pref, :Num, new.rpvd_item, :Nit);

        /* RECORRA LAS LISTAS DE PRECIOS Y CAMBIE EL PRECIO */
        EXECUTE PROCEDURE CALCULA_PRECIOS(NEW.ARTI_COD, :FEC);

        if (COSTO > 0 ) then
         BEGIN
          /* GRABE PROV X ARTICULO */
          EXISTE = 'N';
          SELECT 'S' FROM PROVEEDOR_ARTICULO WHERE TERC_NIT = :NIT AND ARTI_COD = NEW.ARTI_COD INTO :EXISTE;
          if (EXISTE = 'S') then
            UPDATE PROVEEDOR_ARTICULO 
                SET PVAR_FECHA = :FEC, PVAR_COSTO = :COSTO, PVAR_COD = NEW.rpvd_codprov
                WHERE TERC_NIT = :NIT AND ARTI_COD = NEW.ARTI_COD;
          ELSE
            INSERT INTO PROVEEDOR_ARTICULO (TERC_NIT, ARTI_COD, PVAR_COSTO, PVAR_FECHA, PVAR_COD,PVAR_DES)
                VALUES (:NIT, NEW.ARTI_COD, :COSTO, :FEC, NEW.rpvd_codprov,NEW.rpvd_desc);
         END
        end

    /* ACTUALICE EL PENDIENTE  */
    if (CONSOLIDA <> 0) then
        BEGIN
        EXECUTE PROCEDURE LEE_CONFIGURACION ('COMPRAS','DOCUMENTOS','SUMAR CANTIDADES PENDIENTES AL CONSOLIDAR DOCUMENTOS') returning_values (CONSO);
        SELECT MIN(CEFA_TIPOORI) FROM consolide_faltantes WHERE CEFA_ID = :CONSOLIDA INTO :NUMROWS;
        if (NUMROWS = 23) then
            BEGIN
            EXECUTE PROCEDURE LEE_CONFIGURACION('COMPRAS', 'REMISIONES', 'VERIFICAR CODIGOS DE LA ORDEN') returning_values (MENORV);
            if (MENORV = 'SI') then
                CONSO = 'NO';
            END
        SELECT COUNT(CEFA_ITEM) FROM consolide_faltantes WHERE CEFA_ID = :CONSOLIDA INTO :NUMROWS;
        if ((CONSO = 'SI') AND (NUMROWS > 1)) then
            UPDATE consolidado_faltantes SET COFA_OK = 'S' WHERE COFA_ID = :consolida;
        ELSE
            BEGIN
            /* BUSQUE EL CONSOLIDADO EN EL MISMO ITEM Y SI ES DIFERENTE ACTUALICELO */
            select COFA_CANT * COFA_FACTOR FROM consolidado_faltantes WHERE COFA_ID = :consolida AND COFA_ITEM = NEW.RPVD_ITEM AND ARTI_COD = NEW.arti_cod INTO :CANTREL;
            if (NEW.RPVD_CANT * NEW.RPVD_FACTOR < CANTREL) then
                UPDATE consolidado_faltantes SET COFA_IDDES = NEW.repr_id, COFA_CANT = NEW.RPVD_CANT, COFA_FACTOR = NEW.RPVD_FACTOR
                    WHERE COFA_ID = :consolida AND COFA_ITEM = NEW.RPVD_ITEM AND ARTI_COD = NEW.arti_cod;
            ELSE
                UPDATE consolidado_faltantes SET COFA_IDDES = NEW.repr_id, COFA_OK = 'S' WHERE COFA_ID = :consolida AND COFA_ITEM = NEW.RPVD_ITEM AND ARTI_COD = NEW.arti_cod;
            END
        END
    /* ACTUALICE EL STAND */
    if (new.rpvd_stand is not null) then
      if (exists(select stand_cod from stands where arti_cod = new.arti_cod and stand_bodega = new.bode_cod)) then
        UPDATE stands set stand_cod = new.rpvd_stand where arti_cod = new.arti_cod and stand_bodega = new.bode_cod;
      else
        INSERT INTO stands (ARTI_COD, STAND_BODEGA, STAND_COD) VALUES (NEW.arti_cod, NEW.bode_cod, NEW.rpvd_stand);
    END
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER TRIGGER REMISION_PROVEEDOR_DET_AU
AS
declare variable fec date;
declare variable CONC VARCHAR(60);
declare variable Pref varchar(4);
declare variable Num varchar(6);
declare variable factor numeric(18,4);
declare variable EXISTE CHAR(1);
declare variable NIT VARCHAR(20);
declare variable NUMPROV VARCHAR(20);
declare variable Tipo integer;
declare variable idfact integer;
declare variable numrows integer;
declare variable IVAINC CHAR(2);
declare variable COSTO NUMERIC(18,2);
declare variable CANTREL NUMERIC(18,4);
declare variable NUMPED VARCHAR(30);
declare variable CONSO CHAR(2);
declare variable CONSOLIDA INTEGER;
declare variable DTOPIE NUMERIC(18,2);
declare variable ADICIONAL NUMERIC(18,2);
declare variable TOTAL NUMERIC(18,2);
declare variable IVAMONTO NUMERIC(18,2);
declare variable EXTRA NUMERIC(18,2);
declare variable FACT NUMERIC(18,4);
declare variable MENORV CHAR(2);
declare variable CEROS CHAR(2);
declare variable ACTREM CHAR(2);
BEGIN
if ((OLD.repr_id <> 0) AND (OLD.rpvd_anulado = 'N')) then
    begin
    DELETE FROM MOVIMIENTO_ARTICULO WHERE (mvar_tipodoc = 22) and (mvar_idref = new.repr_id) and (mvar_item = old.rpvd_item);
    select REPR_CONSOLIDA from remision_proveedor where repr_id = old.repr_id into :CONSOLIDA;
    if (CONSOLIDA <> 0) then
        begin
        EXECUTE PROCEDURE LEE_CONFIGURACION ('COMPRAS','DOCUMENTOS','SUMAR CANTIDADES PENDIENTES AL CONSOLIDAR DOCUMENTOS') returning_values (CONSO);
        SELECT COUNT(CEFA_ITEM) FROM consolide_faltantes WHERE CEFA_ID = :CONSOLIDA INTO :NUMROWS;
        if ((NUMROWS = 1) OR (CONSO = 'NO')) then
            UPDATE consolidado_faltantes SET COFA_OK = 'N' WHERE COFA_ID = :consolida AND COFA_ITEM = old.RPVD_ITEM AND ARTI_COD = old.arti_cod;
        else
            UPDATE consolidado_faltantes SET COFA_OK = 'N' WHERE COFA_ID = :consolida;
        END
    end
/* Registre el nuevo */
if ((new.repr_id <> 0) AND (new.rpvd_anulado = 'N')) then
    begin
    select repr_fecha, pref_pre, repr_numero, repr_imptos, terc_nit, REPR_NUMPROV, REPR_ORDEN, REPR_CONSOLIDA, repr_dtomonto, repr_adicional, repr_total, repr_ivamonto, repr_extra
        from remision_proveedor where repr_id = new.repr_id
        into :fec, :Pref, :Num, :IVAINC, :NIT, :NUMPROV, :numped, :CONSOLIDA, :dtopie, :adicional, :total, :ivamonto, :extra;
    CONC = 'REMISION PROVEEDOR No.' || PREF || NUM || '-' || NUMPROV;
    if (numped <> '') then
        conc = conc || '-ORDEN ' || NUMPED;
    SELECT MAX(CEFA_TIPOORI) FROM consolide_faltantes WHERE CEFA_ID = :CONSOLIDA INTO :TIPO;
    if (Tipo is null) then
        Tipo = 0;
    select FACO_ID from FACTURAS_COMPRA WHERE FACO_CONSOLIDA = :consolida INTO :IDFACT;
    if (Idfact is null) then
        Idfact = 0;
    /* si se hizo con base en una factura que afecto el inventario no afecte inventario */
    numrows = 0;
    if (Tipo = 21) Then
        select count(*) from movimiento_articulo where mvar_tipodoc = 21 and mvar_idref = :idfact into :numrows;
    if (numrows is null) then
        numrows = 0;
    if (numrows = 0) then
        begin
        execute procedure factor_unidad_cant(new.arti_cod, new.rpvd_unidad) returning_values(factor);
        COSTO = ((new.rpvd_prunit - NEW.rpvd_dtomonto) / :factor);
        if (IVAINC = 'S') then
            COSTO = COSTO / (1 + NEW.rpvd_ivaporc/100);
        EXECUTE PROCEDURE lee_configuracion('COMPRAS','FACTURAS','DESCUENTO Y VALOR ADICIONAL DEL DOCUMENTO COMO MENOR VALOR DEL COSTO') returning_values (:MENORV);
        if (MENORV = 'SI') then
            BEGIN
            FACT = (TOTAL - EXTRA - IVAMONTO);
            if ((FACT - ADICIONAL + DTOPIE) <> 0) then
                FACT = FACT / (FACT - ADICIONAL + DTOPIE);
            ELSE
                FACT = 1;
            COSTO = COSTO * FACT;
            END
        if (COSTO = 0) then
            BEGIN
            EXECUTE PROCEDURE lee_configuracion('COMPRAS', 'REMISIONES', 'PERMITIR CEROS EN COSTOS DE MERCANCIA') returning_values (:ceros);
            EXECUTE PROCEDURE lee_configuracion('COMPRAS', 'FACTURAS', 'ACTUALIZAR COSTOS DE LA REMISION RELACIONADA AL GRABAR LA FACTURA') returning_values (:ACTREM);
            if ((ACTREM = 'SI') and (CEROS = 'NO')) then
                execute procedure costo_promedio(NEW.arti_cod, :fec) returning_values (:COSTO);
            END
        INSERT INTO MOVIMIENTO_ARTICULO
            (ARTI_COD, MVAR_CONS, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM, TERC_NIT)
            VALUES(NEW.ARTI_COD, GEN_ID(ID_MOVARTI,1), NEW.BODE_COD, :FEC, 22, NEW.repr_id,
            :CONC, :factor * new.rpvd_cant, :COSTO, 'S', new.rpvd_lote, :Pref, :Num, new.rpvd_item, :Nit);
            
        /* RECORRA LAS LISTAS DE PRECIOS Y CAMBIE EL PRECIO */
        EXECUTE PROCEDURE CALCULA_PRECIOS(NEW.ARTI_COD, :FEC);
          
        if (COSTO > 0 ) then
         BEGIN
          /* GRABE PROV X ARTICULO */
          EXISTE = 'N';
          SELECT 'S' FROM PROVEEDOR_ARTICULO WHERE TERC_NIT = :NIT AND ARTI_COD = NEW.ARTI_COD INTO :EXISTE;
          if (EXISTE = 'S') then
            UPDATE PROVEEDOR_ARTICULO
                SET PVAR_FECHA = :FEC, PVAR_COSTO = :COSTO, PVAR_COD = NEW.rpvd_codprov
                WHERE TERC_NIT = :NIT AND ARTI_COD = NEW.ARTI_COD;
          ELSE
            INSERT INTO PROVEEDOR_ARTICULO (TERC_NIT, ARTI_COD, PVAR_COSTO, PVAR_FECHA, PVAR_COD,PVAR_DES)
                VALUES (:NIT, NEW.ARTI_COD, :COSTO, :FEC, NEW.rpvd_codprov,NEW.rpvd_desc);
         END
        end
    if (CONSOLIDA <> 0) then
        BEGIN
        EXECUTE PROCEDURE LEE_CONFIGURACION ('COMPRAS','DOCUMENTOS','SUMAR CANTIDADES PENDIENTES AL CONSOLIDAR DOCUMENTOS') returning_values (CONSO);
        /* IGNORE LA CONSOLIDACION SI SE VALIDAN CODIGOS DE LA ORDEN */
        SELECT MIN(CEFA_TIPOORI) FROM consolide_faltantes WHERE CEFA_ID = :CONSOLIDA INTO :NUMROWS;
        if (NUMROWS = 23) then
            BEGIN
            EXECUTE PROCEDURE LEE_CONFIGURACION('COMPRAS', 'REMISIONES', 'VERIFICAR CODIGOS DE LA ORDEN') returning_values (MENORV);
            if (MENORV = 'SI') then
                CONSO = 'NO';
            END
        SELECT COUNT(CEFA_ITEM) FROM consolide_faltantes WHERE CEFA_ID = :CONSOLIDA INTO :NUMROWS;
        if ((CONSO = 'SI') AND (NUMROWS > 1)) then
            UPDATE consolidado_faltantes SET COFA_IDDES = NEW.repr_id, COFA_OK = 'S' WHERE COFA_ID = :consolida;
        ELSE
            BEGIN
            /* BUSQUE EL CONSOLIDADO EN EL MISMO ITEM Y SI ES DIFERENTE ACTUALICELO */
            select COFA_CANT * COFA_FACTOR FROM consolidado_faltantes WHERE COFA_ID = :consolida AND COFA_ITEM = NEW.RPVD_ITEM AND ARTI_COD = NEW.arti_cod INTO :CANTREL;
            if (NEW.RPVD_CANT * NEW.RPVD_FACTOR < CANTREL) then
                UPDATE consolidado_faltantes SET COFA_IDDES = NEW.repr_id, COFA_CANT = NEW.RPVD_CANT, COFA_FACTOR = NEW.RPVD_FACTOR
                    WHERE COFA_ID = :consolida AND COFA_ITEM = NEW.RPVD_ITEM AND ARTI_COD = NEW.arti_cod;
            else
                UPDATE consolidado_faltantes SET COFA_IDDES = NEW.repr_id, COFA_OK = 'S' WHERE COFA_ID = :consolida AND COFA_ITEM = NEW.RPVD_ITEM AND ARTI_COD = NEW.arti_cod;
            END
        END
    /* ACTUALICE EL STAND */
    if (new.rpvd_stand is not null) then
      if (exists(select stand_cod from stands where arti_cod = new.arti_cod and stand_bodega = new.bode_cod)) then
        UPDATE stands set stand_cod = new.rpvd_stand where arti_cod = new.arti_cod and stand_bodega = new.bode_cod;
      else
        INSERT INTO stands (ARTI_COD, STAND_BODEGA, STAND_COD) VALUES (NEW.arti_cod, NEW.bode_cod, NEW.rpvd_stand);
    END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure COSTO_PROMEDIO_Y_ULTIMO_UNIDAD (
    ARTICULO varchar(15),
    FECHA date,
    UNIDAD varchar(8))
returns (
    COSTOP numeric(18,2),
    UCOSTO numeric(18,2))
AS
declare variable saldop numeric(18,2);
declare variable saldoc numeric(15,4);
declare variable entp numeric(18,2);
declare variable entc numeric(15,4);
declare variable FACTOR NUMERIC(15,4);
BEGIN
SELECT first 1 COST_SALDOP, COST_ENTP,COST_SALDOC, COST_ENTC, COST_ULTIMO FROM COSTOS
    WHERE (ARTI_COD = :ARTICULO) AND (COST_FECHA <= :FECHA)
    order by COST_FECHA DESC, cost_item desc
    INTO :SALDOP, ENTP, :SALDOC, ENTC, :UCOSTO;
IF (SALDOC IS NULL) THEN
    BEGIN
    COSTOP = 0;
    UCOSTO = 0;
    END
ELSE
    if ((SALDOC < 0) AND (SALDOC+ENTC > 0)) then
        COSTOP = ENTP/ENTC;
    else
        /* Cuando hay existencia calcule el promedio, de otra manera retorne el ultimo */
        if (SALDOC+ENTC > 0) then
            COSTOP = (SALDOP+ENTP) / (SALDOC+ENTC);
        else
            COSTOP = UCOSTO;
EXECUTE PROCEDURE FACTOR_UNIDAD_CANT(ARTICULO, UNIDAD) returning_values (FACTOR);
COSTOP = COSTOP * FACTOR;
UCOSTO = UCOSTO * FACTOR;
SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE EXISTENCIAS_DESDE_HASTA(
    FECHA DATE,
    ARTINI VARCHAR(20),
    ARTFIN VARCHAR(20),
    GRPINI VARCHAR(3),
    GRPFIN VARCHAR(3),
    BODINI VARCHAR(2),
    BODFIN VARCHAR(2),
    ORDEN CHAR(1),
    AGRUPA CHAR(1),
    DETALLE CHAR(1),
    RESERVA CHAR(1),
    ENPESO CHAR(1),
    SUCURSAL INTEGER)
RETURNS (
    CANT NUMERIC(18,4),
    COSTO NUMERIC(18,2),
    COSTO_LOTE NUMERIC(18,2),
    CODIGO VARCHAR(15),
    NOMBRE VARCHAR(60),
    UNIDAD VARCHAR(8),
    STAND VARCHAR(20),
    CODGRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    CODSUBG VARCHAR(3),
    NOMSUBG VARCHAR(30),
    CODMARC VARCHAR(3),
    NOMMARC VARCHAR(30),
    CODBOD VARCHAR(2),
    LOTE VARCHAR(15),
    NOMBOD VARCHAR(30),
    COSTOTOT NUMERIC(18,2),
    ULTCOSTO NUMERIC(18,2),
    FECHACOSTO DATE,
    CONSUMO NUMERIC(18,2),
    RESERVADO NUMERIC(18,4),
    ORDENADO NUMERIC(18,4),
    IVA NUMERIC(9,2),
    PESOUNIT NUMERIC(18,4),
    PESOTOTAL NUMERIC(18,4),
    PRECIO NUMERIC(18,2),
    CODBAR VARCHAR(20))
AS
 /*$$IBE$$ declare variable exist char(1);
declare variable codini varchar(20);
declare variable codfin varchar(20);
declare variable desini varchar(20);
declare variable desfin varchar(20);
declare variable ordenc numeric(18,4);
declare variable pedido numeric(18,4);
declare variable ok char(1);
declare variable id integer;
declare variable item integer;
declare variable und varchar(8);
declare variable factor numeric(18,4);
declare variable cant2 numeric(18,4);
declare variable PEDAUTO CHAR(2);
DECLARE VARIABLE LISTA INTEGER; $$IBE$$*/ 
BEGIN /*$$IBE$$ 
EXECUTE PROCEDURE lee_configuracion ('FACTURACION','FACTURAS', 'CODIGO DE LA LISTA DE PRECIOS A MOSTRAR EN ARTICULOS') returning_values (:LISTA);
if (ORDEN = 'C') then
    BEGIN
    CODINI = ARTINI;
    CODFIN = ARTFIN;
    DESINI = '';
    DESFIN = 'zz';
    END
ELSE
    BEGIN
    DESINI = ARTINI;
    DESFIN = ARTFIN;
    CODINI = '';
    CODFIN = 'zz';
    END
EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION', 'FACTURAS', 'GENERAR PEDIDO AUTOMATICAMENTE CON LA FACTURA') returning_values (pedauto);
if (DETALLE = 'B') then
  BEGIN
  FOR SELECT ARTI_COD, ARTI_DES, ARTI_UNIDAD, ARTI_EXIST, TAIV_PORC, A.GRUP_COD, A.SUBG_COD, A.MARC_COD, BODE_COD, BODE_NOM, ARTI_CONSUMO, ARTI_PESO/1000
      FROM ARTICULO A, BODEGA B, TARIFA_IVA T
      WHERE ARTI_COD >= :CODINI AND ARTI_COD <= :CODFIN AND ARTI_DES >= :DESINI AND ARTI_DES <= :DESFIN AND ESAR_COD <> 'I' AND BODE_COD >= :BODINI AND
      BODE_COD <= :BODFIN AND ((SUCU_ID = :SUCURSAL) or (:SUCURSAL = 0)) AND A.TAIV_COD = T.TAIV_COD
      INTO :CODIGO, :NOMBRE, :UNIDAD, :EXIST, :IVA, :CODGRUPO, :CODSUBG, :CODMARC, :CODBOD, :NOMBOD, :CONSUMO, :pesounit
      DO
        BEGIN
        STAND = '';
        OK = 'N';
        if (AGRUPA = 'G') then
            BEGIN
            if ((CODGRUPO >= GRPINI) AND (CODGRUPO <= GRPFIN)) then
                OK = 'S';
            end
        ELSE
            if (AGRUPA = 'M') then
                BEGIN
                if ((CODMARC >= GRPINI) AND (CODMARC <= GRPFIN)) then
                    OK = 'S';
                END
        if (OK = 'S') then
            BEGIN
            NOMGRUPO = '';
            NOMMARC = '';
            NOMSUBG = '';
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            SELECT MAX(COBA_COD) FROM BARRAS_ARTICULO WHERE ARTI_COD = :codigo AND COBA_UNIDAD = :unidad INTO :codbar;
            if (CODBAR IS NULL) then
                CODBAR = CODIGO;
            if (EXIST <> 'N') then
                BEGIN
                SELECT STAND_COD FROM STANDS WHERE ARTI_COD = :CODIGO AND STAND_BODEGA = :CODBOD INTO :STAND;
                EXECUTE PROCEDURE SALDO_INICIAL_INVENTARIO(CODIGO, FECHA, :CODBOD) returning_values (CANT);
                EXECUTE PROCEDURE costo_promedio_y_ultimo_unidad(CODIGO, FECHA, UNIDAD) returning_values (COSTO, ULTCOSTO);
                SELECT MAX(MVAR_FECHA) FROM MOVIMIENTO_ARTICULO WHERE ARTI_COD = :CODIGO AND MVAR_ENTRADA = 'S' AND MVAR_FECHA <= :FECHA INTO :FECHACOSTO;
                COSTOTOT = :CANT * :COSTO;
                CONSUMO = CONSUMO * CANT;
                if (RESERVA = 'S') then
                    BEGIN
                    SELECT SUM(ORID_ENTREGAR)
                        FROM ORDENINVENTARIO_DETALLE OD, ordenes_inventario O
                        WHERE O.ORIN_ID = OD.ORIN_ID AND ARTI_COD = :CODIGO AND ORIN_FECHA <= :FECHA AND ORIN_FECLLEGA >= :FECHA AND ORID_ANULADO = 'N' AND OD.BODE_COD = :CODBOD
                        INTO :ORDENADO;
                    if (ORDENADO IS NULL) then
                        ORDENADO = 0;
                    ORDENC = 0;
                    FOR SELECT O.ORDC_ID, OCDE_ITEM, OCDE_CANT * OCDE_FACTOR
                        FROM ORDENES_COMPRA O, ORDENES_COMPRA_DETALLE OD
                        WHERE O.ORDC_ID = OD.ORDC_ID AND OD.ARTI_COD = :CODIGO AND ORDC_VENCE >= :FECHA AND ORDC_FECHA <= :FECHA AND OCDE_ANULADO = 'N' AND OD.BODE_COD = :CODBOD
                        INTO :ID, :ITEM, :CANT2
                        do
                        BEGIN
                        EXECUTE PROCEDURE FALTANTE(23, 21, ID, ITEM) returning_values (PEDIDO, UND, FACTOR);
                        if (PEDIDO * FACTOR = CANT2) then  $$IBE$$*/ /* SI NO SE HA FACTURADO MIRE A VER SI SE REMISIONO */ /*$$IBE$$ 
                            EXECUTE PROCEDURE FALTANTE(23, 22, ID, ITEM) returning_values (PEDIDO, UND, FACTOR);
                        if (PEDIDO IS NULL) then
                            PEDIDO = 0;
                        ORDENC = ORDENC + PEDIDO * FACTOR;
                        END
                    ORDENADO = ORDENADO + ORDENC;
                    SELECT SUM(RSDE_LIBERAR)
                        FROM RESERVAS_DETALLE RD, RESERVAS R
                        WHERE R.RESE_ID = RD.RESE_ID AND ARTI_COD = :CODIGO AND RESE_FECHA <= :FECHA AND RESE_VENCE >= :FECHA AND RD.BODE_COD = :CODBOD AND RSDE_ANULADO = 'N'
                        INTO :RESERVADO;
                    if (RESERVADO IS NULL) then
                        RESERVADO = 0;
                    PEDIDO = 0;
                    FOR SELECT P.PEDI_ID, PEDE_ITEM, PEDE_CANT * PEDE_FACTOR
                        FROM PEDIDOS P, PEDIDOS_DETALLE PD
                        WHERE P.PEDI_ID = PD.PEDI_ID AND PD.ARTI_COD = :CODIGO AND PEDI_VENCE >= :FECHA AND PEDI_FECHA <= :FECHA AND PEDE_ANULADO = 'N' AND BODE_COD = :CODBOD
                        INTO :ID, :ITEM, :CANT2
                        do
                        BEGIN
                        EXECUTE PROCEDURE FALTANTE(34, 31, ID, ITEM) returning_values (ORDENC, UND, FACTOR);
                        if ((ORDENC * FACTOR = CANT2) or (PEDAUTO = 'SI')) then  $$IBE$$*/ /* SI NO SE HA FACTURADO MIRE A VER SI SE REMISIONO */ /*$$IBE$$ 
                            EXECUTE PROCEDURE FALTANTE(34, 32, ID, ITEM) returning_values (ORDENC, UND, FACTOR);
                        if (ORDENC IS NULL) then
                            ORDENC = 0;
                        PEDIDO = PEDIDO + ORDENC * FACTOR;
                        END
                    RESERVADO = RESERVADO + PEDIDO;
                    END
                ELSE
                    BEGIN
                    RESERVADO = 0;
                    ORDENADO = 0;
                    END
                if (LISTA > 0) then
                    SELECT prar_fijo FROM precios_articulo WHERE arti_cod = :CODIGO and lipr_cod = :LISTA INTO :PRECIO;
                if (ENPESO = 'S') then
                    BEGIN
                    if (pesounit IS NULL) then
                        pesounit = 0;
                    if (PESOUNIT <> 0) then
                        BEGIN
                        pesototal = PESOUNIT * cant;
                        SUSPEND;
                        END
                    END
                ELSE
                    SUSPEND;
                END
            END
        END
  END

if (DETALLE = 'L') then
  BEGIN
  FOR SELECT A.ARTI_COD, ARTI_DES, ARTI_UNIDAD, ARTI_EXIST, TAIV_PORC, A.GRUP_COD, A.SUBG_COD, A.MARC_COD, L.lote_nro, L.lote_nro||' - '||L.lote_vence, ARTI_CONSUMO,l.bode_cod, L.lote_saldo,l.lote_costo, ARTI_PESO/1000
      FROM ARTICULO A, LOTES l, TARIFA_IVA T
      WHERE A.ARTI_COD >= '0' AND A.ARTI_COD <= 'zz' AND ARTI_DES >= '' AND ARTI_DES <= 'zz' AND ESAR_COD <> 'I' AND A.TAIV_COD = T.TAIV_COD and a.arti_cod = l.arti_cod
      INTO :CODIGO, :NOMBRE, :UNIDAD, :EXIST, :IVA, :CODGRUPO, :CODSUBG, :CODMARC, :LOTE, :NOMBOD, :CONSUMO, :codbod, :cant, :costo_lote, :pesounit
      DO
        BEGIN
        OK = 'N';
        if (AGRUPA = 'G') then
            BEGIN
            if ((CODGRUPO >= GRPINI) AND (CODGRUPO <= GRPFIN)) then
                OK = 'S';
            end
        ELSE
            if (AGRUPA = 'M') then
                BEGIN
                if ((CODMARC >= GRPINI) AND (CODMARC <= GRPFIN)) then
                    OK = 'S';
                END
        if (OK = 'S') then
            BEGIN
            NOMGRUPO = '';
            NOMMARC = '';
            NOMSUBG = '';
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            SELECT MAX(COBA_COD) FROM BARRAS_ARTICULO WHERE ARTI_COD = :codigo AND COBA_UNIDAD = :unidad INTO :codbar;
            if (CODBAR IS NULL) then
                CODBAR = CODIGO;

            if (EXIST <> 'N') then
                BEGIN
                EXECUTE PROCEDURE COSTO_PROMEDIO_UNIDAD(CODIGO, FECHA, UNIDAD) returning_values (COSTO);
                EXECUTE PROCEDURE ULTIMO_COSTO(CODIGO, FECHA, UNIDAD) returning_values (ULTCOSTO);
                SELECT MAX(MVAR_FECHA) FROM MOVIMIENTO_ARTICULO WHERE ARTI_COD = :CODIGO AND MVAR_ENTRADA = 'S' AND MVAR_FECHA <= :FECHA INTO :FECHACOSTO;
                COSTOTOT = :CANT * :COSTO;
                CONSUMO = CONSUMO * CANT;
                if (RESERVA = 'S') then
                    BEGIN
                    SELECT SUM(ORID_ENTREGAR)
                        FROM ORDENINVENTARIO_DETALLE OD, ordenes_inventario O
                        WHERE O.ORIN_ID = OD.ORIN_ID AND ARTI_COD = :CODIGO AND ORIN_FECHA <= :FECHA AND ORIN_FECLLEGA >= :FECHA AND ORID_ANULADO = 'N'
                        INTO :ORDENADO;
                    if (ORDENADO IS NULL) then
                        ORDENADO = 0;
                    ORDENC = 0;
                    FOR SELECT O.ORDC_ID, OCDE_ITEM, OCDE_CANT * OCDE_FACTOR
                        FROM ORDENES_COMPRA O, ORDENES_COMPRA_DETALLE OD
                        WHERE O.ORDC_ID = OD.ORDC_ID AND OD.ARTI_COD = :CODIGO AND ORDC_VENCE >= :FECHA AND ORDC_FECHA <= :FECHA AND OCDE_ANULADO = 'N'
                        INTO :ID, :ITEM, :CANT2
                        do
                        BEGIN
                        EXECUTE PROCEDURE FALTANTE(23, 21, ID, ITEM) returning_values (PEDIDO, UND, FACTOR);
                        if (PEDIDO * FACTOR = CANT2) then  $$IBE$$*/ /* SI NO SE HA FACTURADO MIRE A VER SI SE REMISIONO */ /*$$IBE$$ 
                            EXECUTE PROCEDURE FALTANTE(23, 22, ID, ITEM) returning_values (PEDIDO, UND, FACTOR);
                        if (PEDIDO IS NULL) then
                            PEDIDO = 0;
                        ORDENC = ORDENC + PEDIDO * FACTOR;
                        END
                    ORDENADO = ORDENADO + ORDENC;
                    SELECT SUM(RSDE_LIBERAR)
                        FROM RESERVAS_DETALLE RD, RESERVAS R
                        WHERE R.RESE_ID = RD.RESE_ID AND ARTI_COD = :CODIGO AND RESE_FECHA <= :FECHA AND RESE_VENCE >= :FECHA AND RSDE_ANULADO = 'N'
                        INTO :RESERVADO;
                    if (RESERVADO IS NULL) then
                        RESERVADO = 0;
                    PEDIDO = 0;
                    FOR SELECT P.PEDI_ID, PEDE_ITEM, PEDE_CANT * PEDE_FACTOR
                        FROM PEDIDOS P, PEDIDOS_DETALLE PD
                        WHERE P.PEDI_ID = PD.PEDI_ID AND PD.ARTI_COD = :CODIGO AND PEDI_VENCE >= :FECHA AND PEDI_FECHA <= :FECHA AND PEDE_ANULADO = 'N'
                        INTO :ID, :ITEM, :CANT2
                        do
                        BEGIN
                        EXECUTE PROCEDURE FALTANTE(34, 31, ID, ITEM) returning_values (ORDENC, UND, FACTOR);
                        if ((ORDENC * FACTOR = CANT2) or (PEDAUTO = 'SI')) then  $$IBE$$*/ /* SI NO SE HA FACTURADO MIRE A VER SI SE REMISIONO */ /*$$IBE$$ 
                            EXECUTE PROCEDURE FALTANTE(34, 32, ID, ITEM) returning_values (ORDENC, UND, FACTOR);
                        if (ORDENC IS NULL) then
                            ORDENC = 0;
                        PEDIDO = PEDIDO + ORDENC * FACTOR;
                        END
                    RESERVADO = RESERVADO + PEDIDO;
                    END
                ELSE
                    BEGIN
                    RESERVADO = 0;
                    ORDENADO = 0;
                    END
                if (LISTA > 0) then
                    SELECT prar_fijo FROM precios_articulo WHERE arti_cod = :CODIGO and lipr_cod = :LISTA INTO :PRECIO;
                if (ENPESO = 'S') then
                    BEGIN
                    if (pesounit IS NULL) then
                        pesounit = 0;
                    if (PESOUNIT <> 0) then
                        BEGIN
                        pesototal = PESOUNIT * cant;
                        SUSPEND;
                        END
                    END
                ELSE
                    SUSPEND;
                END
            END
        END
  end
if (DETALLE = 'N') then
  BEGIN
  FOR SELECT ARTI_COD, ARTI_DES, ARTI_UNIDAD, ARTI_EXIST, TAIV_PORC, A.GRUP_COD, A.SUBG_COD, A.MARC_COD, ARTI_CONSUMO, ARTI_PESO/1000
      FROM ARTICULO A, TARIFA_IVA T
      WHERE ARTI_COD >= :CODINI AND ARTI_COD <= :CODFIN AND ARTI_DES >= :DESINI AND ARTI_DES <= :DESFIN AND ESAR_COD <> 'I' AND A.TAIV_COD = T.TAIV_COD
      INTO :CODIGO, :NOMBRE, :UNIDAD, :EXIST, :IVA, :CODGRUPO, :CODSUBG, :CODMARC, :CONSUMO, :pesounit
      DO
        BEGIN
        OK = 'N';
        if (AGRUPA = 'G') then
            BEGIN
            if ((GRPINI = '0') AND (GRPFIN = 'zz')) then
                OK = 'S';
            else
                if ((CODGRUPO >= GRPINI) AND (CODGRUPO <= GRPFIN)) then
                    OK = 'S';
            end
        ELSE
            if (AGRUPA = 'M') then
                BEGIN
                if ((GRPINI = '0') AND (GRPFIN = 'zzz')) then
                    OK = 'S';
                else
                    if ((CODMARC >= GRPINI) AND (CODMARC <= GRPFIN)) then
                        OK = 'S';
                END
        if (OK = 'S') then
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            SELECT MAX(COBA_COD) FROM BARRAS_ARTICULO WHERE ARTI_COD = :codigo AND COBA_UNIDAD = :unidad INTO :codbar;
            if (CODBAR IS NULL) then
                CODBAR = CODIGO;

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

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

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE EXISTENCIAS_DESDE_HASTA(
    FECHA DATE,
    ARTINI VARCHAR(20),
    ARTFIN VARCHAR(20),
    GRPINI VARCHAR(3),
    GRPFIN VARCHAR(3),
    BODINI VARCHAR(2),
    BODFIN VARCHAR(2),
    ORDEN CHAR(1),
    AGRUPA CHAR(1),
    DETALLE CHAR(1),
    RESERVA CHAR(1),
    ENPESO CHAR(1),
    SUCURSAL INTEGER)
RETURNS (
    CANT NUMERIC(18,4),
    COSTO NUMERIC(18,2),
    COSTO_LOTE NUMERIC(18,2),
    CODIGO VARCHAR(15),
    NOMBRE VARCHAR(60),
    UNIDAD VARCHAR(8),
    STAND VARCHAR(20),
    CODGRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    CODSUBG VARCHAR(3),
    NOMSUBG VARCHAR(30),
    CODMARC VARCHAR(3),
    NOMMARC VARCHAR(30),
    CODBOD VARCHAR(2),
    LOTE VARCHAR(15),
    NOMBOD VARCHAR(30),
    COSTOTOT NUMERIC(18,2),
    ULTCOSTO NUMERIC(18,2),
    FECHACOSTO DATE,
    CONSUMO NUMERIC(18,2),
    RESERVADO NUMERIC(18,4),
    ORDENADO NUMERIC(18,4),
    IVA NUMERIC(9,2),
    PESOUNIT NUMERIC(18,4),
    PESOTOTAL NUMERIC(18,4),
    PRECIO NUMERIC(18,2),
    CODBAR VARCHAR(20))
AS
declare variable exist char(1);
declare variable codini varchar(20);
declare variable codfin varchar(20);
declare variable desini varchar(20);
declare variable desfin varchar(20);
declare variable ordenc numeric(18,4);
declare variable pedido numeric(18,4);
declare variable ok char(1);
declare variable id integer;
declare variable item integer;
declare variable und varchar(8);
declare variable factor numeric(18,4);
declare variable cant2 numeric(18,4);
declare variable PEDAUTO CHAR(2);
DECLARE VARIABLE LISTA INTEGER;
BEGIN
EXECUTE PROCEDURE lee_configuracion ('FACTURACION','FACTURAS', 'CODIGO DE LA LISTA DE PRECIOS A MOSTRAR EN ARTICULOS') returning_values (:LISTA);
if (ORDEN = 'C') then
    BEGIN
    CODINI = ARTINI;
    CODFIN = ARTFIN;
    DESINI = '';
    DESFIN = 'zz';
    END
ELSE
    BEGIN
    DESINI = ARTINI;
    DESFIN = ARTFIN;
    CODINI = '';
    CODFIN = 'zz';
    END
EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION', 'FACTURAS', 'GENERAR PEDIDO AUTOMATICAMENTE CON LA FACTURA') returning_values (pedauto);
if (DETALLE = 'B') then
  BEGIN
  FOR SELECT ARTI_COD, ARTI_DES, ARTI_UNIDAD, ARTI_EXIST, TAIV_PORC, A.GRUP_COD, A.SUBG_COD, A.MARC_COD, BODE_COD, BODE_NOM, ARTI_CONSUMO, ARTI_PESO/1000
      FROM ARTICULO A, BODEGA B, TARIFA_IVA T
      WHERE ARTI_COD >= :CODINI AND ARTI_COD <= :CODFIN AND ARTI_DES >= :DESINI AND ARTI_DES <= :DESFIN AND ESAR_COD <> 'I' AND BODE_COD >= :BODINI AND
      BODE_COD <= :BODFIN AND ((SUCU_ID = :SUCURSAL) or (:SUCURSAL = 0)) AND A.TAIV_COD = T.TAIV_COD
      INTO :CODIGO, :NOMBRE, :UNIDAD, :EXIST, :IVA, :CODGRUPO, :CODSUBG, :CODMARC, :CODBOD, :NOMBOD, :CONSUMO, :pesounit
      DO
        BEGIN
        STAND = '';
        OK = 'N';
        if (AGRUPA = 'G') then
            BEGIN
            if ((CODGRUPO >= GRPINI) AND (CODGRUPO <= GRPFIN)) then
                OK = 'S';
            end
        ELSE
            if (AGRUPA = 'M') then
                BEGIN
                if ((CODMARC >= GRPINI) AND (CODMARC <= GRPFIN)) then
                    OK = 'S';
                END
        if (OK = 'S') then
            BEGIN
            NOMGRUPO = '';
            NOMMARC = '';
            NOMSUBG = '';
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            SELECT MAX(COBA_COD) FROM BARRAS_ARTICULO WHERE ARTI_COD = :codigo AND COBA_UNIDAD = :unidad INTO :codbar;
            if (CODBAR IS NULL) then
                CODBAR = CODIGO;
            if (EXIST <> 'N') then
                BEGIN
                SELECT STAND_COD FROM STANDS WHERE ARTI_COD = :CODIGO AND STAND_BODEGA = :CODBOD INTO :STAND;
                EXECUTE PROCEDURE SALDO_INICIAL_INVENTARIO(CODIGO, FECHA, :CODBOD) returning_values (CANT);
                EXECUTE PROCEDURE costo_promedio_y_ultimo_unidad(CODIGO, FECHA, UNIDAD) returning_values (COSTO, ULTCOSTO);
                SELECT MAX(MVAR_FECHA) FROM MOVIMIENTO_ARTICULO WHERE ARTI_COD = :CODIGO AND MVAR_ENTRADA = 'S' AND MVAR_FECHA <= :FECHA INTO :FECHACOSTO;
                COSTOTOT = :CANT * :COSTO;
                CONSUMO = CONSUMO * CANT;
                if (RESERVA = 'S') then
                    BEGIN
                    SELECT SUM(ORID_ENTREGAR)
                        FROM ORDENINVENTARIO_DETALLE OD, ordenes_inventario O
                        WHERE O.ORIN_ID = OD.ORIN_ID AND ARTI_COD = :CODIGO AND ORIN_FECHA <= :FECHA AND ORIN_FECLLEGA >= :FECHA AND ORID_ANULADO = 'N' AND OD.BODE_COD = :CODBOD
                        INTO :ORDENADO;
                    if (ORDENADO IS NULL) then
                        ORDENADO = 0;
                    ORDENC = 0;
                    FOR SELECT O.ORDC_ID, OCDE_ITEM, OCDE_CANT * OCDE_FACTOR
                        FROM ORDENES_COMPRA O, ORDENES_COMPRA_DETALLE OD
                        WHERE O.ORDC_ID = OD.ORDC_ID AND OD.ARTI_COD = :CODIGO AND ORDC_VENCE >= :FECHA AND ORDC_FECHA <= :FECHA AND OCDE_ANULADO = 'N' AND OD.BODE_COD = :CODBOD
                        INTO :ID, :ITEM, :CANT2
                        do
                        BEGIN
                        EXECUTE PROCEDURE FALTANTE(23, 21, ID, ITEM) returning_values (PEDIDO, UND, FACTOR);
                        if (PEDIDO * FACTOR = CANT2) then /* SI NO SE HA FACTURADO MIRE A VER SI SE REMISIONO */
                            EXECUTE PROCEDURE FALTANTE(23, 22, ID, ITEM) returning_values (PEDIDO, UND, FACTOR);
                        if (PEDIDO IS NULL) then
                            PEDIDO = 0;
                        ORDENC = ORDENC + PEDIDO * FACTOR;
                        END
                    ORDENADO = ORDENADO + ORDENC;
                    SELECT SUM(RSDE_LIBERAR)
                        FROM RESERVAS_DETALLE RD, RESERVAS R
                        WHERE R.RESE_ID = RD.RESE_ID AND ARTI_COD = :CODIGO AND RESE_FECHA <= :FECHA AND RESE_VENCE >= :FECHA AND RD.BODE_COD = :CODBOD AND RSDE_ANULADO = 'N'
                        INTO :RESERVADO;
                    if (RESERVADO IS NULL) then
                        RESERVADO = 0;
                    PEDIDO = 0;
                    FOR SELECT P.PEDI_ID, PEDE_ITEM, PEDE_CANT * PEDE_FACTOR
                        FROM PEDIDOS P, PEDIDOS_DETALLE PD
                        WHERE P.PEDI_ID = PD.PEDI_ID AND PD.ARTI_COD = :CODIGO AND PEDI_VENCE >= :FECHA AND PEDI_FECHA <= :FECHA AND PEDE_ANULADO = 'N' AND BODE_COD = :CODBOD
                        INTO :ID, :ITEM, :CANT2
                        do
                        BEGIN
                        EXECUTE PROCEDURE FALTANTE(34, 31, ID, ITEM) returning_values (ORDENC, UND, FACTOR);
                        if ((ORDENC * FACTOR = CANT2) or (PEDAUTO = 'SI')) then /* SI NO SE HA FACTURADO MIRE A VER SI SE REMISIONO */
                            EXECUTE PROCEDURE FALTANTE(34, 32, ID, ITEM) returning_values (ORDENC, UND, FACTOR);
                        if (ORDENC IS NULL) then
                            ORDENC = 0;
                        PEDIDO = PEDIDO + ORDENC * FACTOR;
                        END
                    RESERVADO = RESERVADO + PEDIDO;
                    END
                ELSE
                    BEGIN
                    RESERVADO = 0;
                    ORDENADO = 0;
                    END
                if (LISTA > 0) then
                    SELECT prar_fijo FROM precios_articulo WHERE arti_cod = :CODIGO and lipr_cod = :LISTA INTO :PRECIO;
                if (ENPESO = 'S') then
                    BEGIN
                    if (pesounit IS NULL) then
                        pesounit = 0;
                    if (PESOUNIT <> 0) then
                        BEGIN
                        pesototal = PESOUNIT * cant;
                        SUSPEND;
                        END
                    END
                ELSE
                    SUSPEND;
                END
            END
        END
  END

if (DETALLE = 'L') then
  BEGIN
  FOR SELECT A.ARTI_COD, ARTI_DES, ARTI_UNIDAD, ARTI_EXIST, TAIV_PORC, A.GRUP_COD, A.SUBG_COD, A.MARC_COD, L.lote_nro, L.lote_nro||' - '||L.lote_vence, ARTI_CONSUMO,l.bode_cod, L.lote_saldo,l.lote_costo, ARTI_PESO/1000
      FROM ARTICULO A, LOTES l, TARIFA_IVA T
      WHERE A.ARTI_COD >= '0' AND A.ARTI_COD <= 'zz' AND ARTI_DES >= '' AND ARTI_DES <= 'zz' AND ESAR_COD <> 'I' AND A.TAIV_COD = T.TAIV_COD and a.arti_cod = l.arti_cod
      INTO :CODIGO, :NOMBRE, :UNIDAD, :EXIST, :IVA, :CODGRUPO, :CODSUBG, :CODMARC, :LOTE, :NOMBOD, :CONSUMO, :codbod, :cant, :costo_lote, :pesounit
      DO
        BEGIN
        OK = 'N';
        if (AGRUPA = 'G') then
            BEGIN
            if ((CODGRUPO >= GRPINI) AND (CODGRUPO <= GRPFIN)) then
                OK = 'S';
            end
        ELSE
            if (AGRUPA = 'M') then
                BEGIN
                if ((CODMARC >= GRPINI) AND (CODMARC <= GRPFIN)) then
                    OK = 'S';
                END
        if (OK = 'S') then
            BEGIN
            NOMGRUPO = '';
            NOMMARC = '';
            NOMSUBG = '';
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            SELECT MAX(COBA_COD) FROM BARRAS_ARTICULO WHERE ARTI_COD = :codigo AND COBA_UNIDAD = :unidad INTO :codbar;
            if (CODBAR IS NULL) then
                CODBAR = CODIGO;

            if (EXIST <> 'N') then
                BEGIN
                EXECUTE PROCEDURE COSTO_PROMEDIO_UNIDAD(CODIGO, FECHA, UNIDAD) returning_values (COSTO);
                EXECUTE PROCEDURE ULTIMO_COSTO(CODIGO, FECHA, UNIDAD) returning_values (ULTCOSTO);
                SELECT MAX(MVAR_FECHA) FROM MOVIMIENTO_ARTICULO WHERE ARTI_COD = :CODIGO AND MVAR_ENTRADA = 'S' AND MVAR_FECHA <= :FECHA INTO :FECHACOSTO;
                COSTOTOT = :CANT * :COSTO;
                CONSUMO = CONSUMO * CANT;
                if (RESERVA = 'S') then
                    BEGIN
                    SELECT SUM(ORID_ENTREGAR)
                        FROM ORDENINVENTARIO_DETALLE OD, ordenes_inventario O
                        WHERE O.ORIN_ID = OD.ORIN_ID AND ARTI_COD = :CODIGO AND ORIN_FECHA <= :FECHA AND ORIN_FECLLEGA >= :FECHA AND ORID_ANULADO = 'N'
                        INTO :ORDENADO;
                    if (ORDENADO IS NULL) then
                        ORDENADO = 0;
                    ORDENC = 0;
                    FOR SELECT O.ORDC_ID, OCDE_ITEM, OCDE_CANT * OCDE_FACTOR
                        FROM ORDENES_COMPRA O, ORDENES_COMPRA_DETALLE OD
                        WHERE O.ORDC_ID = OD.ORDC_ID AND OD.ARTI_COD = :CODIGO AND ORDC_VENCE >= :FECHA AND ORDC_FECHA <= :FECHA AND OCDE_ANULADO = 'N'
                        INTO :ID, :ITEM, :CANT2
                        do
                        BEGIN
                        EXECUTE PROCEDURE FALTANTE(23, 21, ID, ITEM) returning_values (PEDIDO, UND, FACTOR);
                        if (PEDIDO * FACTOR = CANT2) then /* SI NO SE HA FACTURADO MIRE A VER SI SE REMISIONO */
                            EXECUTE PROCEDURE FALTANTE(23, 22, ID, ITEM) returning_values (PEDIDO, UND, FACTOR);
                        if (PEDIDO IS NULL) then
                            PEDIDO = 0;
                        ORDENC = ORDENC + PEDIDO * FACTOR;
                        END
                    ORDENADO = ORDENADO + ORDENC;
                    SELECT SUM(RSDE_LIBERAR)
                        FROM RESERVAS_DETALLE RD, RESERVAS R
                        WHERE R.RESE_ID = RD.RESE_ID AND ARTI_COD = :CODIGO AND RESE_FECHA <= :FECHA AND RESE_VENCE >= :FECHA AND RSDE_ANULADO = 'N'
                        INTO :RESERVADO;
                    if (RESERVADO IS NULL) then
                        RESERVADO = 0;
                    PEDIDO = 0;
                    FOR SELECT P.PEDI_ID, PEDE_ITEM, PEDE_CANT * PEDE_FACTOR
                        FROM PEDIDOS P, PEDIDOS_DETALLE PD
                        WHERE P.PEDI_ID = PD.PEDI_ID AND PD.ARTI_COD = :CODIGO AND PEDI_VENCE >= :FECHA AND PEDI_FECHA <= :FECHA AND PEDE_ANULADO = 'N'
                        INTO :ID, :ITEM, :CANT2
                        do
                        BEGIN
                        EXECUTE PROCEDURE FALTANTE(34, 31, ID, ITEM) returning_values (ORDENC, UND, FACTOR);
                        if ((ORDENC * FACTOR = CANT2) or (PEDAUTO = 'SI')) then /* SI NO SE HA FACTURADO MIRE A VER SI SE REMISIONO */
                            EXECUTE PROCEDURE FALTANTE(34, 32, ID, ITEM) returning_values (ORDENC, UND, FACTOR);
                        if (ORDENC IS NULL) then
                            ORDENC = 0;
                        PEDIDO = PEDIDO + ORDENC * FACTOR;
                        END
                    RESERVADO = RESERVADO + PEDIDO;
                    END
                ELSE
                    BEGIN
                    RESERVADO = 0;
                    ORDENADO = 0;
                    END
                if (LISTA > 0) then
                    SELECT prar_fijo FROM precios_articulo WHERE arti_cod = :CODIGO and lipr_cod = :LISTA INTO :PRECIO;
                if (ENPESO = 'S') then
                    BEGIN
                    if (pesounit IS NULL) then
                        pesounit = 0;
                    if (PESOUNIT <> 0) then
                        BEGIN
                        pesototal = PESOUNIT * cant;
                        SUSPEND;
                        END
                    END
                ELSE
                    SUSPEND;
                END
            END
        END
  end
if (DETALLE = 'N') then
  BEGIN
  FOR SELECT ARTI_COD, ARTI_DES, ARTI_UNIDAD, ARTI_EXIST, TAIV_PORC, A.GRUP_COD, A.SUBG_COD, A.MARC_COD, ARTI_CONSUMO, ARTI_PESO/1000
      FROM ARTICULO A, TARIFA_IVA T
      WHERE ARTI_COD >= :CODINI AND ARTI_COD <= :CODFIN AND ARTI_DES >= :DESINI AND ARTI_DES <= :DESFIN AND ESAR_COD <> 'I' AND A.TAIV_COD = T.TAIV_COD
      INTO :CODIGO, :NOMBRE, :UNIDAD, :EXIST, :IVA, :CODGRUPO, :CODSUBG, :CODMARC, :CONSUMO, :pesounit
      DO
        BEGIN
        OK = 'N';
        if (AGRUPA = 'G') then
            BEGIN
            if ((GRPINI = '0') AND (GRPFIN = 'zz')) then
                OK = 'S';
            else
                if ((CODGRUPO >= GRPINI) AND (CODGRUPO <= GRPFIN)) then
                    OK = 'S';
            end
        ELSE
            if (AGRUPA = 'M') then
                BEGIN
                if ((GRPINI = '0') AND (GRPFIN = 'zzz')) then
                    OK = 'S';
                else
                    if ((CODMARC >= GRPINI) AND (CODMARC <= GRPFIN)) then
                        OK = 'S';
                END
        if (OK = 'S') then
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            SELECT MAX(COBA_COD) FROM BARRAS_ARTICULO WHERE ARTI_COD = :codigo AND COBA_UNIDAD = :unidad INTO :codbar;
            if (CODBAR IS NULL) then
                CODBAR = CODIGO;

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

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

^

SET TERM ; ^

/* 20090704c */SET TERM ^ ;

create or ALTER procedure CONSUMO_HISTORICO (
    ARTIC VARCHAR(20),
    FECHA DATE)
returns (CONSUMO NUMERIC(18,2))
as
begin
CONSUMO = NULL;
SELECT FIRST 1 FCDE_CONSUMO/FCDE_CANT FROM FACTURAS_COMPRAS_DETALLE D, FACTURAS_COMPRA F
    WHERE F.faco_id = D.faco_id AND D.ARTI_COD = :ARTIC AND F.FACO_FECHA <= :FECHA ORDER BY FACO_FECHA DESC
    INTO :CONSUMO;
if (CONSUMO IS NULL) then
    SELECT FIRST 1 FCDE_CONSUMO/FCDE_CANT FROM FACTURAS_COMPRAS_DETALLE D, FACTURAS_COMPRA F
        WHERE F.faco_id = D.faco_id AND D.ARTI_COD = :ARTIC AND F.FACO_FECHA > :FECHA ORDER BY FACO_FECHA
        INTO :CONSUMO;
if (CONSUMO IS NULL) then
    SELECT ARTI_CONSUMO FROM ARTICULO WHERE ARTI_COD = :ARTIC INTO :CONSUMO;
suspend;
end
^

SET TERM ; ^

grant EXECUTE on PROCEDURE CONSUMO_HISTORICO to PUBLIC;

SET TERM ^ ;

CREATE OR ALTER procedure EXISTENCIAS_DESDE_HASTA (
    FECHA date,
    ARTINI varchar(20),
    ARTFIN varchar(20),
    GRPINI varchar(3),
    GRPFIN varchar(3),
    BODINI varchar(2),
    BODFIN varchar(2),
    ORDEN char(1),
    AGRUPA char(1),
    DETALLE char(1),
    RESERVA char(1),
    ENPESO char(1),
    SUCURSAL integer)
returns (
    CANT numeric(18,4),
    COSTO numeric(18,2),
    COSTO_LOTE numeric(18,2),
    CODIGO varchar(15),
    NOMBRE varchar(60),
    UNIDAD varchar(8),
    STAND varchar(15),
    CODGRUPO varchar(2),
    NOMGRUPO varchar(30),
    CODSUBG varchar(3),
    NOMSUBG varchar(30),
    CODMARC varchar(3),
    NOMMARC varchar(30),
    CODBOD varchar(2),
    LOTE varchar(15),
    NOMBOD varchar(30),
    COSTOTOT numeric(18,2),
    ULTCOSTO numeric(18,2),
    FECHACOSTO date,
    CONSUMO numeric(18,2),
    RESERVADO numeric(18,4),
    ORDENADO numeric(18,4),
    IVA numeric(9,2),
    PESOUNIT numeric(18,4),
    PESOTOTAL numeric(18,4),
    PRECIO numeric(18,2),
    CODBAR varchar(20))
AS
declare variable exist char(1);
declare variable codini varchar(20);
declare variable codfin varchar(20);
declare variable desini varchar(20);
declare variable desfin varchar(20);
declare variable ordenc numeric(18,4);
declare variable pedido numeric(18,4);
declare variable ok char(1);
declare variable id integer;
declare variable item integer;
declare variable und varchar(8);
declare variable factor numeric(18,4);
declare variable cant2 numeric(18,4);
declare variable PEDAUTO CHAR(2);
DECLARE VARIABLE LISTA INTEGER;
BEGIN
EXECUTE PROCEDURE lee_configuracion ('FACTURACION','FACTURAS', 'CODIGO DE LA LISTA DE PRECIOS A MOSTRAR EN ARTICULOS') returning_values (:LISTA);
if (ORDEN = 'C') then
    BEGIN
    CODINI = ARTINI;
    CODFIN = ARTFIN;
    DESINI = '';
    DESFIN = 'zz';
    END
ELSE
    BEGIN
    DESINI = ARTINI;
    DESFIN = ARTFIN;
    CODINI = '';
    CODFIN = 'zz';
    END
EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION', 'FACTURAS', 'GENERAR PEDIDO AUTOMATICAMENTE CON LA FACTURA') returning_values (pedauto);
if (DETALLE = 'B') then
  BEGIN
  FOR SELECT ARTI_COD, ARTI_DES, ARTI_UNIDAD, ARTI_EXIST, TAIV_PORC, A.GRUP_COD, A.SUBG_COD, A.MARC_COD, BODE_COD, BODE_NOM, ARTI_CONSUMO, ARTI_PESO/1000
      FROM ARTICULO A, BODEGA B, TARIFA_IVA T
      WHERE ARTI_COD >= :CODINI AND ARTI_COD <= :CODFIN AND ARTI_DES >= :DESINI AND ARTI_DES <= :DESFIN AND ESAR_COD <> 'I' AND BODE_COD >= :BODINI AND
      BODE_COD <= :BODFIN AND ((SUCU_ID = :SUCURSAL) or (:SUCURSAL = 0)) AND A.TAIV_COD = T.TAIV_COD
      INTO :CODIGO, :NOMBRE, :UNIDAD, :EXIST, :IVA, :CODGRUPO, :CODSUBG, :CODMARC, :CODBOD, :NOMBOD, :CONSUMO, :pesounit
      DO
        BEGIN
        STAND = '';
        OK = 'N';
        if (AGRUPA = 'G') then
            BEGIN
            if ((CODGRUPO >= GRPINI) AND (CODGRUPO <= GRPFIN)) then
                OK = 'S';
            end
        ELSE
            if (AGRUPA = 'M') then
                BEGIN
                if ((CODMARC >= GRPINI) AND (CODMARC <= GRPFIN)) then
                    OK = 'S';
                END
        if (OK = 'S') then
            BEGIN
            NOMGRUPO = '';
            NOMMARC = '';
            NOMSUBG = '';
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            SELECT MAX(COBA_COD) FROM BARRAS_ARTICULO WHERE ARTI_COD = :codigo AND COBA_UNIDAD = :unidad INTO :codbar;
            if (CODBAR IS NULL) then
                CODBAR = CODIGO;
            if (EXIST <> 'N') then
                BEGIN
                SELECT STAND_COD FROM STANDS WHERE ARTI_COD = :CODIGO AND STAND_BODEGA = :CODBOD INTO :STAND;
                EXECUTE PROCEDURE SALDO_INICIAL_INVENTARIO(CODIGO, FECHA, :CODBOD) returning_values (CANT);
                EXECUTE PROCEDURE costo_promedio_y_ultimo_unidad(CODIGO, FECHA, UNIDAD) returning_values (COSTO, ULTCOSTO);
                SELECT MAX(MVAR_FECHA) FROM MOVIMIENTO_ARTICULO WHERE ARTI_COD = :CODIGO AND MVAR_ENTRADA = 'S' AND MVAR_FECHA <= :FECHA INTO :FECHACOSTO;
                COSTOTOT = :CANT * :COSTO;
                if (CONSUMO <> 0) then
                    EXECUTE PROCEDURE CONSUMO_HISTORICO (:CODIGO, :fecha) returning_values (:CONSUMO);
                CONSUMO = CONSUMO * CANT;
                if (RESERVA = 'S') then
                    BEGIN
                    SELECT SUM(ORID_ENTREGAR)
                        FROM ORDENINVENTARIO_DETALLE OD, ordenes_inventario O
                        WHERE O.ORIN_ID = OD.ORIN_ID AND ARTI_COD = :CODIGO AND ORIN_FECHA <= :FECHA AND ORIN_FECLLEGA >= :FECHA AND ORID_ANULADO = 'N' AND OD.BODE_COD = :CODBOD
                        INTO :ORDENADO;
                    if (ORDENADO IS NULL) then
                        ORDENADO = 0;
                    ORDENC = 0;
                    FOR SELECT O.ORDC_ID, OCDE_ITEM, OCDE_CANT * OCDE_FACTOR
                        FROM ORDENES_COMPRA O, ORDENES_COMPRA_DETALLE OD
                        WHERE O.ORDC_ID = OD.ORDC_ID AND OD.ARTI_COD = :CODIGO AND ORDC_VENCE >= :FECHA AND ORDC_FECHA <= :FECHA AND OCDE_ANULADO = 'N' AND OD.BODE_COD = :CODBOD
                        INTO :ID, :ITEM, :CANT2
                        do
                        BEGIN
                        EXECUTE PROCEDURE FALTANTE(23, 21, ID, ITEM) returning_values (PEDIDO, UND, FACTOR);
                        if (PEDIDO * FACTOR = CANT2) then /* SI NO SE HA FACTURADO MIRE A VER SI SE REMISIONO */
                            EXECUTE PROCEDURE FALTANTE(23, 22, ID, ITEM) returning_values (PEDIDO, UND, FACTOR);
                        if (PEDIDO IS NULL) then
                            PEDIDO = 0;
                        ORDENC = ORDENC + PEDIDO * FACTOR;
                        END
                    ORDENADO = ORDENADO + ORDENC;
                    SELECT SUM(RSDE_LIBERAR)
                        FROM RESERVAS_DETALLE RD, RESERVAS R
                        WHERE R.RESE_ID = RD.RESE_ID AND ARTI_COD = :CODIGO AND RESE_FECHA <= :FECHA AND RESE_VENCE >= :FECHA AND RD.BODE_COD = :CODBOD AND RSDE_ANULADO = 'N'
                        INTO :RESERVADO;
                    if (RESERVADO IS NULL) then
                        RESERVADO = 0;
                    PEDIDO = 0;
                    FOR SELECT P.PEDI_ID, PEDE_ITEM, PEDE_CANT * PEDE_FACTOR
                        FROM PEDIDOS P, PEDIDOS_DETALLE PD
                        WHERE P.PEDI_ID = PD.PEDI_ID AND PD.ARTI_COD = :CODIGO AND PEDI_VENCE >= :FECHA AND PEDI_FECHA <= :FECHA AND PEDE_ANULADO = 'N' AND BODE_COD = :CODBOD
                        INTO :ID, :ITEM, :CANT2
                        do
                        BEGIN
                        EXECUTE PROCEDURE FALTANTE(34, 31, ID, ITEM) returning_values (ORDENC, UND, FACTOR);
                        if ((ORDENC * FACTOR = CANT2) or (PEDAUTO = 'SI')) then /* SI NO SE HA FACTURADO MIRE A VER SI SE REMISIONO */
                            EXECUTE PROCEDURE FALTANTE(34, 32, ID, ITEM) returning_values (ORDENC, UND, FACTOR);
                        if (ORDENC IS NULL) then
                            ORDENC = 0;
                        PEDIDO = PEDIDO + ORDENC * FACTOR;
                        END
                    RESERVADO = RESERVADO + PEDIDO;
                    END
                ELSE
                    BEGIN
                    RESERVADO = 0;
                    ORDENADO = 0;
                    END
                if (LISTA > 0) then
                    SELECT prar_fijo FROM precios_articulo WHERE arti_cod = :CODIGO and lipr_cod = :LISTA INTO :PRECIO;
                if (ENPESO = 'S') then
                    BEGIN
                    if (pesounit IS NULL) then
                        pesounit = 0;
                    if (PESOUNIT <> 0) then
                        BEGIN
                        pesototal = PESOUNIT * cant;
                        SUSPEND;
                        END
                    END
                ELSE
                    SUSPEND;
                END
            END
        END
  END

if (DETALLE = 'L') then
  BEGIN
  FOR SELECT A.ARTI_COD, ARTI_DES, ARTI_UNIDAD, ARTI_EXIST, TAIV_PORC, A.GRUP_COD, A.SUBG_COD, A.MARC_COD, L.lote_nro, L.lote_nro||' - '||L.lote_vence, ARTI_CONSUMO,l.bode_cod, L.lote_saldo,l.lote_costo, ARTI_PESO/1000
      FROM ARTICULO A, LOTES l, TARIFA_IVA T
      WHERE A.ARTI_COD >= '0' AND A.ARTI_COD <= 'zz' AND ARTI_DES >= '' AND ARTI_DES <= 'zz' AND ESAR_COD <> 'I' AND A.TAIV_COD = T.TAIV_COD and a.arti_cod = l.arti_cod
      INTO :CODIGO, :NOMBRE, :UNIDAD, :EXIST, :IVA, :CODGRUPO, :CODSUBG, :CODMARC, :LOTE, :NOMBOD, :CONSUMO, :codbod, :cant, :costo_lote, :pesounit
      DO
        BEGIN
        OK = 'N';
        if (AGRUPA = 'G') then
            BEGIN
            if ((CODGRUPO >= GRPINI) AND (CODGRUPO <= GRPFIN)) then
                OK = 'S';
            end
        ELSE
            if (AGRUPA = 'M') then
                BEGIN
                if ((CODMARC >= GRPINI) AND (CODMARC <= GRPFIN)) then
                    OK = 'S';
                END
        if (OK = 'S') then
            BEGIN
            NOMGRUPO = '';
            NOMMARC = '';
            NOMSUBG = '';
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            SELECT MAX(COBA_COD) FROM BARRAS_ARTICULO WHERE ARTI_COD = :codigo AND COBA_UNIDAD = :unidad INTO :codbar;
            if (CODBAR IS NULL) then
                CODBAR = CODIGO;

            if (EXIST <> 'N') then
                BEGIN
                EXECUTE PROCEDURE COSTO_PROMEDIO_UNIDAD(CODIGO, FECHA, UNIDAD) returning_values (COSTO);
                EXECUTE PROCEDURE ULTIMO_COSTO(CODIGO, FECHA, UNIDAD) returning_values (ULTCOSTO);
                SELECT MAX(MVAR_FECHA) FROM MOVIMIENTO_ARTICULO WHERE ARTI_COD = :CODIGO AND MVAR_ENTRADA = 'S' AND MVAR_FECHA <= :FECHA INTO :FECHACOSTO;
                COSTOTOT = :CANT * :COSTO;
                if (CONSUMO <> 0) then
                    EXECUTE PROCEDURE CONSUMO_HISTORICO (:CODIGO, :fecha) returning_values (:CONSUMO);
                CONSUMO = CONSUMO * CANT;
                if (RESERVA = 'S') then
                    BEGIN
                    SELECT SUM(ORID_ENTREGAR)
                        FROM ORDENINVENTARIO_DETALLE OD, ordenes_inventario O
                        WHERE O.ORIN_ID = OD.ORIN_ID AND ARTI_COD = :CODIGO AND ORIN_FECHA <= :FECHA AND ORIN_FECLLEGA >= :FECHA AND ORID_ANULADO = 'N'
                        INTO :ORDENADO;
                    if (ORDENADO IS NULL) then
                        ORDENADO = 0;
                    ORDENC = 0;
                    FOR SELECT O.ORDC_ID, OCDE_ITEM, OCDE_CANT * OCDE_FACTOR
                        FROM ORDENES_COMPRA O, ORDENES_COMPRA_DETALLE OD
                        WHERE O.ORDC_ID = OD.ORDC_ID AND OD.ARTI_COD = :CODIGO AND ORDC_VENCE >= :FECHA AND ORDC_FECHA <= :FECHA AND OCDE_ANULADO = 'N'
                        INTO :ID, :ITEM, :CANT2
                        do
                        BEGIN
                        EXECUTE PROCEDURE FALTANTE(23, 21, ID, ITEM) returning_values (PEDIDO, UND, FACTOR);
                        if (PEDIDO * FACTOR = CANT2) then /* SI NO SE HA FACTURADO MIRE A VER SI SE REMISIONO */
                            EXECUTE PROCEDURE FALTANTE(23, 22, ID, ITEM) returning_values (PEDIDO, UND, FACTOR);
                        if (PEDIDO IS NULL) then
                            PEDIDO = 0;
                        ORDENC = ORDENC + PEDIDO * FACTOR;
                        END
                    ORDENADO = ORDENADO + ORDENC;
                    SELECT SUM(RSDE_LIBERAR)
                        FROM RESERVAS_DETALLE RD, RESERVAS R
                        WHERE R.RESE_ID = RD.RESE_ID AND ARTI_COD = :CODIGO AND RESE_FECHA <= :FECHA AND RESE_VENCE >= :FECHA AND RSDE_ANULADO = 'N'
                        INTO :RESERVADO;
                    if (RESERVADO IS NULL) then
                        RESERVADO = 0;
                    PEDIDO = 0;
                    FOR SELECT P.PEDI_ID, PEDE_ITEM, PEDE_CANT * PEDE_FACTOR
                        FROM PEDIDOS P, PEDIDOS_DETALLE PD
                        WHERE P.PEDI_ID = PD.PEDI_ID AND PD.ARTI_COD = :CODIGO AND PEDI_VENCE >= :FECHA AND PEDI_FECHA <= :FECHA AND PEDE_ANULADO = 'N'
                        INTO :ID, :ITEM, :CANT2
                        do
                        BEGIN
                        EXECUTE PROCEDURE FALTANTE(34, 31, ID, ITEM) returning_values (ORDENC, UND, FACTOR);
                        if ((ORDENC * FACTOR = CANT2) or (PEDAUTO = 'SI')) then /* SI NO SE HA FACTURADO MIRE A VER SI SE REMISIONO */
                            EXECUTE PROCEDURE FALTANTE(34, 32, ID, ITEM) returning_values (ORDENC, UND, FACTOR);
                        if (ORDENC IS NULL) then
                            ORDENC = 0;
                        PEDIDO = PEDIDO + ORDENC * FACTOR;
                        END
                    RESERVADO = RESERVADO + PEDIDO;
                    END
                ELSE
                    BEGIN
                    RESERVADO = 0;
                    ORDENADO = 0;
                    END
                if (LISTA > 0) then
                    SELECT prar_fijo FROM precios_articulo WHERE arti_cod = :CODIGO and lipr_cod = :LISTA INTO :PRECIO;
                if (ENPESO = 'S') then
                    BEGIN
                    if (pesounit IS NULL) then
                        pesounit = 0;
                    if (PESOUNIT <> 0) then
                        BEGIN
                        pesototal = PESOUNIT * cant;
                        SUSPEND;
                        END
                    END
                ELSE
                    SUSPEND;
                END
            END
        END
  end
if (DETALLE = 'N') then
  BEGIN
  FOR SELECT ARTI_COD, ARTI_DES, ARTI_UNIDAD, ARTI_EXIST, TAIV_PORC, A.GRUP_COD, A.SUBG_COD, A.MARC_COD, ARTI_CONSUMO, ARTI_PESO/1000
      FROM ARTICULO A, TARIFA_IVA T
      WHERE ARTI_COD >= :CODINI AND ARTI_COD <= :CODFIN AND ARTI_DES >= :DESINI AND ARTI_DES <= :DESFIN AND ESAR_COD <> 'I' AND A.TAIV_COD = T.TAIV_COD
      INTO :CODIGO, :NOMBRE, :UNIDAD, :EXIST, :IVA, :CODGRUPO, :CODSUBG, :CODMARC, :CONSUMO, :pesounit
      DO
        BEGIN
        OK = 'N';
        if (AGRUPA = 'G') then
            BEGIN
            if ((GRPINI = '0') AND (GRPFIN = 'zz')) then
                OK = 'S';
            else
                if ((CODGRUPO >= GRPINI) AND (CODGRUPO <= GRPFIN)) then
                    OK = 'S';
            end
        ELSE
            if (AGRUPA = 'M') then
                BEGIN
                if ((GRPINI = '0') AND (GRPFIN = 'zzz')) then
                    OK = 'S';
                else
                    if ((CODMARC >= GRPINI) AND (CODMARC <= GRPFIN)) then
                        OK = 'S';
                END
        if (OK = 'S') then
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            SELECT MAX(COBA_COD) FROM BARRAS_ARTICULO WHERE ARTI_COD = :codigo AND COBA_UNIDAD = :unidad INTO :codbar;
            if (CODBAR IS NULL) then
                CODBAR = CODIGO;

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

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

SET TERM ; ^




/* 20090708 */
INSERT INTO CONFIGURACION (CONF_MODULO, CONF_CATEGORIA, CONF_PROPIEDAD, CONF_VALOR, CONF_POSIBLES, CONF_AYUDA) VALUES ('CAJA', 'EGRESOS', 'CODIGO DE LA CUENTA DEL BANCO PARA IMPRESION ADICIONAL DE CHEQUE', '', '', 'Indique el código de la cuenta del banco que imprime los cheques en formas continuas en impresora separada');
commit work;

/* 20090710 *//* FACTOR DE CONVERSION EN UNIDADES ALTERNATIVAS */
SET TERM ^ ;

CREATE OR ALTER procedure REP_LISTA_PRECIOS (
    ARTINI varchar(20),
    ARTFIN varchar(20),
    GRPINI varchar(2),
    GRPFIN varchar(2),
    ORDEN char(1),
    LINI integer,
    LFIN integer,
    FECHA date,
    DEATRES char(1),
    MASIVA char(1),
    HOY char(1))
returns (
    CODIGO varchar(15),
    NOMBRE varchar(60),
    REFERENCIA varchar(20),
    UNIDAD varchar(8),
    UNIDAD2 varchar(8),
    FACTOR2 NUMERIC(18,4),
    UNIDAD3 varchar(8),
    FACTOR3 NUMERIC(18,4),
    UNIDAD4 varchar(8),
    FACTOR4 NUMERIC(18,4),
    CODGRUPO varchar(2),
    NOMGRUPO varchar(30),
    CODSUBG varchar(3),
    NOMSUBG varchar(30),
    CODMARC varchar(3),
    NOMMARC varchar(30),
    NOMLISTA varchar(30),
    PRECIO numeric(18,2),
    PRECIO2 numeric(18,2),
    PRECIO3 numeric(18,2),
    MARGEN numeric(9,2),
    IVA numeric(9,2),
    IVAMONTO numeric(18,2),
    CONSUMO numeric(18,2),
    CANTMIN numeric(18,4),
    PESO numeric(9,4),
    ANCHO numeric(18,4),
    ALTO numeric(18,4),
    LARGO numeric(18,4),
    FOTO blob sub_type 1 segment size 80,
    OBS blob sub_type 1 segment size 80,
    TOTAL numeric(18,2))
AS
declare variable CODINI VARCHAR(20);
declare variable CODFIN VARCHAR(20);
declare variable DESINI VARCHAR(20);
declare variable DESFIN VARCHAR(20);
declare variable UTIL NUMERIC(9,2);
declare variable MOU CHAR(10);
declare variable LISIVA CHAR(2);
declare variable i integer;
declare variable J integer;
declare variable PRECAUX NUMERIC(18,2);
declare variable NUMROWS INTEGER;
declare variable DIG INTEGER;
declare variable UNIDADA VARCHAR(8);
declare variable FACTORA NUMERIC(18,4);
BEGIN
if (ORDEN = 'C') then
    BEGIN
    CODINI = ARTINI;
    CODFIN = ARTFIN;
    DESINI = '';
    DESFIN = 'zz';
    END
ELSE
    BEGIN
    DESINI = ARTINI;
    DESFIN = ARTFIN;
    CODINI = '';
    CODFIN = 'zz';
    END
EXECUTE PROCEDURE LEE_CONFIGURACION ('FACTURACION', 'ARTICULOS', 'SUGERIR PRECIOS CON PORCENTAJE DE MARGEN O UTILIDAD') returning_values (MOU);
EXECUTE PROCEDURE LEE_CONFIGURACION ('FACTURACION', 'ARTICULOS', 'REDONDEO AL MULTIPLO DE DIEZ EN PRECIOS') returning_values (DIG);
FOR SELECT a.ARTI_COD, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD, TAIV_PORC, ARTI_CONSUMO,
    ARTI_FOTO, ARTI_PESO, ARTI_LARGO, ARTI_ANCHO, ARTI_ALTO, ARTI_OBS
    FROM ARTICULO A, TARIFA_IVA T
    WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :GRPFIN AND
    ARTI_DES >= :DESINI AND ARTI_DES <= :DESFIN AND ESAR_COD = 'A' AND A.TAIV_COD = T.TAIV_COD
    ORDER BY ARTI_COD
    INTO :CODIGO, :NOMBRE, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :IVA, :CONSUMO,
        :FOTO, :PESO, :LARGO, :ANCHO, :ALTO, :OBS
    DO
    BEGIN
    I = 0;
    FOR SELECT LIPR_NOM, PRAR_FIJO, PRAR_MARGEN, PRAR_UTIL, LIPR_MODIF, PRAR_CANTMIN
        FROM LISTA_PRECIOS L, PRECIOS_ARTICULO P
        WHERE L.LIPR_COD = P.LIPR_COD AND p.arti_cod = :codigo and l.lipr_cod >= :lini and l.lipr_cod <= :lfin AND
        ((:fecha IS NULL) or ((L.lipr_fecini <= :FECHA) AND (L.lipr_fecfin >= :FECHA)))
        ORDER BY L.LIPR_COD
        INTO :NOMLISTA, :PRECIO, :MARGEN, :UTIL, :LISIVA, :cantmin
        do
        BEGIN
        if (FECHA IS NULL) then
            FECHA = cast('now' as DATE);
        SELECT COUNT(AUDI_ID) FROM AUDITORIA WHERE TIDO_COD = 126 AND AUDI_COD = :CODIGO AND AUDI_FECHA = :FECHA AND AUDI_OPER <> 'D' INTO :NUMROWS;
        if ((HOY = 'N') or (NUMROWS <> 0)) then
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            SELECT MIN(COBA_COD) FROM barras_articulo WHERE ARTI_COD = :codigo INTO :referencia;
            J = 0;
            UNIDAD2 = '';
            UNIDAD3 = '';
            UNIDAD4 = '';
            factor2 = 0;
            factor3 = 0;
            factor4 = 0;
            for SELECT UNAR_UNIDAD, UNAR_FACPRE FROM unidad_articulo WHERE ARTI_COD = :codigo INTO :unidada, :factora
                DO
                BEGIN
                if (J = 0) then
                    BEGIN
                    UNIDAD2 = UNIDADA;
                    FACTOR2 = FACTORA;
                    END
                if (J = 1) then
                    BEGIN
                    UNIDAD3 = UNIDADA;
                    FACTOR3 = FACTORA;
                    END
                if ( J = 2) then
                    BEGIN
                    UNIDAD4 = UNIDADA;
                    FACTOR4 = FACTORA;
                    END
                J = J + 1;
                END
            if (MOU = 'UTILIDAD') then
                MARGEN = UTIL;
            if (LISIVA = 'N') then
                IVAMONTO = PRECIO * IVA / 100;
            ELSE
                BEGIN
                IVAMONTO = (PRECIO - CONSUMO) * IVA / (100 + IVA);
                PRECIO = (PRECIO - CONSUMO) / (1 + (IVA/100));
/*              EXECUTE PROCEDURE redondee(PRECIO, DIG) returning_values (PRECIO); */
                END
            TOTAL = PRECIO + IVAMONTO + CONSUMO;
            EXECUTE PROCEDURE redondee(TOTAL, DIG) returning_values (TOTAL);
            if (DEATRES = 'N') then
                SUSPEND;
            else
                BEGIN
                I = I + 1;
                if (MASIVA = 'S') then
                    PRECIO = TOTAL;
                TOTAL = 0;
                if (MOD(I,3) = 1) then
                    BEGIN
                    PRECAUX = PRECIO;
                    PRECIO2 = 0;
                    PRECIO3 = 0;
                    END
                if (MOD(I,3) = 2) then
                    BEGIN
                    PRECIO2 = PRECIO;
                    PRECIO = PRECAUX;
                    END
                if (MOD(I,3) = 0) then
                    BEGIN
                    PRECIO3 = PRECIO;
                    PRECIO = PRECAUX;
                    SUSPEND;
                    END
                END
            END
        end
    if ((DEATRES = 'S') AND (MOD(I,3) <> 0)) then
        SUSPEND;
    end
END
^

SET TERM ; ^



/* 20090710b *//* CONSERVE EL CONSECUTIVO DE LA REMISION PARA NO AFECTAR EL KARDEX */
SET TERM ^ ;

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

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

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

    /* ACTUALICE EL PENDIENTE  */
    if (CONSOLIDA <> 0) then
        BEGIN
        UPDATE consolidado_faltantes SET COFA_OK = 'S' WHERE COFA_ID = :consolida AND COFA_ITEM = NEW.FCDE_ITEM AND ARTI_COD = NEW.arti_cod;
        EXECUTE procedure LEE_CONFIGURACION ('COMPRAS','DOCUMENTOS','SUMAR CANTIDADES PENDIENTES AL CONSOLIDAR DOCUMENTOS') returning_values (CONSO);
        /* IGNORE LA CONSOLIDACION SI SE VALIDAN CODIGOS DE LA ORDEN */
        SELECT MIN(CEFA_TIPOORI) FROM consolide_faltantes WHERE CEFA_ID = :CONSOLIDA INTO :NUMROWS;
        if (NUMROWS = 23) then
            BEGIN
            EXECUTE PROCEDURE LEE_CONFIGURACION('COMPRAS', 'FACTURAS', 'VERIFICAR CODIGOS DE LA ORDEN') returning_values (MENORV);
            if (MENORV = 'SI') then
                CONSO = 'NO';
            END
        SELECT COUNT(CEFA_ITEM) FROM consolide_faltantes WHERE CEFA_ID = :CONSOLIDA INTO :NUMROWS;
        if ((CONSO = 'SI') AND (NUMROWS > 1)) then
            UPDATE consolidado_faltantes SET COFA_IDDES = NEW.faco_id, COFA_OK = 'S' WHERE COFA_ID = :consolida;
        else
            BEGIN
            /* BUSQUE EL CONSOLIDADO EN EL MISMO ITEM Y SI ES DIFERENTE ACTUALICELO */
            select COFA_CANT * COFA_FACTOR FROM consolidado_faltantes WHERE COFA_ID = :consolida AND COFA_ITEM = NEW.FCDE_ITEM AND ARTI_COD = NEW.arti_cod INTO :CANTREL;
            if (NEW.FCDE_CANT * NEW.FCDE_FACTOR < CANTREL) then
                UPDATE consolidado_faltantes SET COFA_IDDES = NEW.faco_id, COFA_CANT = NEW.FCDE_CANT, COFA_FACTOR = NEW.FCDE_FACTOR
                    WHERE COFA_ID = :consolida AND COFA_ITEM = NEW.FCDE_ITEM AND ARTI_COD = NEW.arti_cod;
            END
        END
    /* ACTUALICE EL STAND */
    if (new.fcde_stand is not null) then
      if (exists(select stand_cod from stands where arti_cod = new.arti_cod and stand_bodega = new.bode_cod)) then
        UPDATE stands set stand_cod = new.fcde_stand where arti_cod = new.arti_cod and stand_bodega = new.bode_cod;
      else
        INSERT INTO stands (ARTI_COD, STAND_BODEGA, STAND_COD) VALUES (NEW.arti_cod, NEW.bode_cod, NEW.fcde_stand);
    END
END
^

SET TERM ; ^


SET TERM ^ ;

CREATE OR ALTER TRIGGER FACTCOMP_DETALLE_AU FOR FACTURAS_COMPRAS_DETALLE
ACTIVE AFTER UPDATE POSITION 0
as
declare variable fec date;
declare variable fecaux date;
declare variable AUX varchar(90);
declare variable CONC VARCHAR(60);
declare variable Pref varchar(4);
declare variable Num varchar(6);
declare variable Nit varchar(20);
declare variable factor numeric(18,4);
declare variable TIPO INTEGER;
declare variable INVFAC CHAR(2);
declare variable IVAINC CHAR(2);
declare variable COSTO NUMERIC(18,2);
declare variable CANTREL NUMERIC(18,4);
declare variable NUMPROV VARCHAR(10);
declare variable NUMPED VARCHAR(30);
declare variable NUMREM VARCHAR(30);
declare variable CONSO VARCHAR(2);
declare variable CONSOLIDA INTEGER;
declare variable NUMROWS INTEGER;
declare variable DTOPIE NUMERIC(18,2);
declare variable ADICIONAL NUMERIC(18,2);
declare variable TOTAL NUMERIC(18,2);
declare variable IVAMONTO NUMERIC(18,2);
declare variable EXTRA NUMERIC(18,2);
declare variable FACT NUMERIC(18,4);
declare variable MENORV CHAR(2);
declare variable ACTREM CHAR(2);
declare variable FECREM date;
declare variable IDREM INTEGER;
declare variable ITEREM INTEGER;
declare variable CANTREM NUMERIC(18,4);
declare variable LOTEREM VARCHAR(15);
declare variable PREFREM CHAR(4);
declare variable IDMOV INTEGER;
BEGIN
if (old.fcde_devuelto = new.fcde_devuelto) then
    begin
    /* deshaga lo viejo */
    if ((old.fcde_anulado = 'N') and (OLD.faco_id <> 0)) then
        begin
        select faco_fecha, faco_consolida from facturas_compra where faco_id = old.faco_id into :fec, :consolida;
        DELETE FROM MOVIMIENTO_ARTICULO WHERE (mvar_tipodoc = 21) and (mvar_idref = old.faco_id) and (mvar_item = old.fcde_item);
        /* RECORRA LAS LISTAS DE PRECIOS Y CAMBIE EL PRECIO */
        EXECUTE PROCEDURE CALCULA_PRECIOS(old.ARTI_COD, :FEC);
        /* LOS PENDIENTES */
        if (CONSOLIDA <> 0) then
            BEGIN
            UPDATE consolidado_faltantes SET COFA_OK = 'N' WHERE COFA_ID = :consolida AND COFA_ITEM = old.FCDE_ITEM AND ARTI_COD = old.arti_cod;
            SELECT COUNT(CEFA_ITEM) FROM consolide_faltantes WHERE CEFA_ID = :CONSOLIDA INTO :NUMROWS;
            EXECUTE procedure LEE_CONFIGURACION ('COMPRAS','DOCUMENTOS','SUMAR CANTIDADES PENDIENTES AL CONSOLIDAR DOCUMENTOS') returning_values (CONSO);
            /* IGNORE LA CONSOLIDACION SI SE VALIDAN CODIGOS DE LA ORDEN */
            SELECT MIN(CEFA_TIPOORI) FROM consolide_faltantes WHERE CEFA_ID = :CONSOLIDA INTO :NUMROWS;
            if (NUMROWS = 23) then
                BEGIN
                EXECUTE PROCEDURE LEE_CONFIGURACION('COMPRAS', 'FACTURAS', 'VERIFICAR CODIGOS DE LA ORDEN') returning_values (MENORV);
                if (MENORV = 'SI') then
                    CONSO = 'NO';
                END
            if (CONSO = 'SI') then
                UPDATE consolidado_faltantes SET COFA_OK = 'N' WHERE COFA_ID = :consolida;
            END
        end
    /* Registre el nuevo */
    if ((new.fcde_anulado = 'N') and (new.faco_id <> 0)) then
        BEGIN
        select faco_fecha, pref_pre, faco_numero, terc_nit, faco_imptos, faco_numprov, faco_remision, faco_orden, faco_consolida, faco_dtomonto, faco_adicional, faco_total, faco_ivamonto, faco_extra
            from facturas_compra where faco_id = new.faco_id
            into :fec, :Pref, :Num, :Nit, :ivainc, :numprov, :numrem, :numped, :consolida, :dtopie, :adicional, :total, :ivamonto, :extra;
        conc = 'FACTURA DE COMPRA No.' || PREF || NUM || '-' || NUMPROV;
        if (NUMREM <> '') then
            BEGIN
            AUX = SUBSTR(NUMREM, 1, 15);
            conc = conc || '-REM:' || AUX;
            END
        else
            if (NUMPED <> '') then
                BEGIN
                AUX = SUBSTR(NUMPED, 1, 15);
                conc = conc || '-ORDEN ' || AUX;
                END
        SELECT MAX(CEFA_TIPOORI) FROM consolide_faltantes WHERE CEFA_ID = :CONSOLIDA INTO :TIPO;
        if (Tipo is null) then
            Tipo = 0;
        execute procedure lee_configuracion('COMPRAS', 'FACTURAS', 'AFECTAR INVENTARIO CON LA FACTURA') returning_values (:INVFAC);
        /* si se hizo con base en una remision no afecte inventario */
        if ((Tipo <> 22) and (INVFAC = 'SI')) then
            begin
            execute procedure factor_unidad_cant(new.arti_cod, new.fcde_unidad) returning_values(factor);
            COSTO = ((new.fcde_prunit - NEW.fcde_dtomonto) / :factor);
            if (IVAINC = 'S') then
                COSTO = COSTO / (1 + NEW.fcde_ivaporc/100);
            EXECUTE PROCEDURE lee_configuracion('COMPRAS','FACTURAS','DESCUENTO Y VALOR ADICIONAL DEL DOCUMENTO COMO MENOR VALOR DEL COSTO') returning_values (:MENORV);
            if (MENORV = 'SI') then
                BEGIN
                FACT = (TOTAL - EXTRA - IVAMONTO);
                if ((FACT - ADICIONAL + DTOPIE) <> 0) then
                    FACT = FACT / (FACT - ADICIONAL + DTOPIE);
                ELSE
                    FACT = 1;
                COSTO = COSTO * FACT;
                END
            INSERT INTO MOVIMIENTO_ARTICULO
                (ARTI_COD, MVAR_CONS, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM, TERC_NIT)
                VALUES(NEW.ARTI_COD, GEN_ID(ID_MOVARTI,1), NEW.BODE_COD, :FEC, 21, NEW.faco_id,
                :CONC, :factor * new.fcde_cant, :COSTO, 'S', new.fcde_lote, :Pref, :Num, NEW.fcde_item, :Nit);
            if (COSTO > 0 ) then
             BEGIN
              /* ACTUALICE EL COSTO POR PROVEEDOR */
              SELECT PVAR_FECHA FROM PROVEEDOR_ARTICULO
                WHERE TERC_NIT = :Nit AND ARTI_COD = NEW.ARTI_COD INTO :FECAUX;
              if (FECAUX IS NULL) then
                INSERT INTO PROVEEDOR_ARTICULO (TERC_NIT, ARTI_COD, PVAR_COSTO, PVAR_FECHA, PVAR_COD,PVAR_DES)
                    VALUES (:Nit, NEW.ARTI_COD, :COSTO, :fec, NEW.fcde_codprov,NEW.fcde_desc);
              else
                UPDATE PROVEEDOR_ARTICULO
                    SET PVAR_COSTO = :COSTO, PVAR_FECHA = :fec, PVAR_COD = NEW.fcde_codprov
                    WHERE ARTI_COD = NEW.ARTI_COD AND TERC_NIT = :Nit;
             END
            /* RECORRA LAS LISTAS DE PRECIOS Y CAMBIE EL PRECIO */
            EXECUTE PROCEDURE CALCULA_PRECIOS(NEW.ARTI_COD, :FEC);
            end
        EXECUTE PROCEDURE lee_configuracion('COMPRAS', 'FACTURAS', 'ACTUALIZAR COSTOS DE LA REMISION RELACIONADA AL GRABAR LA FACTURA') returning_values (:ACTREM);
        if ((ACTREM = 'SI') and (Tipo = 22)) then
            BEGIN
            numrows = 0;
            select mvar_cons, MVAR_ITEM, MVAR_FECHA, MVAR_IDREF, MVAR_CANT, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO
                from movimiento_articulo M, consolidado_faltantes C
                where C.cofa_id = :CONSOLIDA AND mvar_tipodoc = 22 and mvar_idref = C.cofa_idori AND C.cofa_tipoori = 22 and m.arti_cod = new.arti_cod
                into :numrows, :iterem, :fecrem, :idrem, :cantrem, :loterem, :prefrem, :numrem;
            
            if (numrows <> 0) then
                BEGIN
                /* inserte primero para evitar existencias negativas */
                IDMOV = GEN_ID(ID_MOVARTI,1);
                INSERT INTO MOVIMIENTO_ARTICULO
                    (ARTI_COD, MVAR_CONS, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM, TERC_NIT)
                    VALUES(NEW.ARTI_COD, :IDMOV, NEW.BODE_COD, :fecrem, 22, :idrem,
                    :CONC, :cantrem, :costo, 'S', :loterem, :prefrem, :numrem, :iterem, :Nit);
                DELETE FROM MOVIMIENTO_ARTICULO WHERE MVAR_CONS = :numrows;
                /* reponga el consecutivo para no afectar el orden del kardex */
                update MOVIMIENTO_ARTICULO set mvar_cons = :numrows WHERE MVAR_CONS = :idmov;
                update costos set cost_idmov = :numrows WHERE cost_idmov = :idmov;

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

        if (CONSOLIDA <> 0) then
            begin
            UPDATE consolidado_faltantes SET COFA_OK = 'S' WHERE COFA_ID = :consolida AND COFA_ITEM = NEW.FCDE_ITEM AND ARTI_COD = NEW.arti_cod;
            EXECUTE procedure LEE_CONFIGURACION ('COMPRAS','DOCUMENTOS','SUMAR CANTIDADES PENDIENTES AL CONSOLIDAR DOCUMENTOS') returning_values (CONSO);
            /* IGNORE LA CONSOLIDACION SI SE VALIDAN CODIGOS DE LA ORDEN */
            SELECT MIN(CEFA_TIPOORI) FROM consolide_faltantes WHERE CEFA_ID = :CONSOLIDA INTO :NUMROWS;
            if (NUMROWS = 23) then
                BEGIN
                EXECUTE PROCEDURE LEE_CONFIGURACION('COMPRAS', 'FACTURAS', 'VERIFICAR CODIGOS DE LA ORDEN') returning_values (MENORV);
                if (MENORV = 'SI') then
                    CONSO = 'NO';
                END
            SELECT COUNT(CEFA_ITEM) FROM consolide_faltantes WHERE CEFA_ID = :CONSOLIDA INTO :NUMROWS;
            if ((CONSO = 'SI') AND (NUMROWS > 1)) then
                UPDATE consolidado_faltantes SET COFA_IDDES = NEW.faco_id, COFA_OK = 'S' WHERE COFA_ID = :consolida;
            else
                BEGIN
                /* BUSQUE EL CONSOLIDADO EN EL MISMO ITEM Y SI ES DIFERENTE ACTUALICELO */
                select COFA_CANT * COFA_FACTOR FROM consolidado_faltantes WHERE COFA_ID = :consolida AND COFA_ITEM = NEW.FCDE_ITEM AND ARTI_COD = NEW.arti_cod INTO :CANTREL;
                if (NEW.FCDE_CANT * NEW.FCDE_FACTOR < CANTREL) then
                    UPDATE consolidado_faltantes SET COFA_IDDES = NEW.faco_id, COFA_CANT = NEW.FCDE_CANT, COFA_FACTOR = NEW.FCDE_FACTOR
                        WHERE COFA_ID = :consolida AND COFA_ITEM = NEW.FCDE_ITEM AND ARTI_COD = NEW.arti_cod;
                END
            end
        /* ACTUALICE EL STAND */
        if (new.fcde_stand is not null) then
          if (exists(select stand_cod from stands where arti_cod = new.arti_cod and stand_bodega = new.bode_cod)) then
            UPDATE stands set stand_cod = new.fcde_stand where arti_cod = new.arti_cod and stand_bodega = new.bode_cod;
          else
            INSERT INTO stands (ARTI_COD, STAND_BODEGA, STAND_COD) VALUES (NEW.arti_cod, NEW.bode_cod, NEW.fcde_stand);
        END
    end
END
^

SET TERM ; ^

GRANT SELECT, INSERT, UPDATE, DELETE ON MOVIMIENTO_ARTICULO TO TRIGGER FACTCOMP_DETALLE_AI;
GRANT SELECT, UPDATE ON COSTOS TO TRIGGER FACTCOMP_DETALLE_AI;

GRANT SELECT, INSERT, UPDATE, DELETE ON MOVIMIENTO_ARTICULO TO TRIGGER FACTCOMP_DETALLE_AU;
GRANT SELECT, UPDATE ON COSTOS TO TRIGGER FACTCOMP_DETALLE_AU;

/* 20090713 : COMISIONES POR MONTO POR UNIDAD NO FUNCIONABA, ADEMAS LONG RANGO VENDEDOR MUY PEQUENO */

SET TERM ^ ;

CREATE OR ALTER PROCEDURE COMISIONES_ARTICULO(
    DETALLE CHAR(1),
    DESDE VARCHAR(8),
    HASTA VARCHAR(8),
    FECINI DATE,
    FECFIN DATE,
    ARTINI VARCHAR(15),
    ARTFIN VARCHAR(15),
    CEROS CHAR(1),
    AGENCIA INTEGER)
RETURNS (
    CODVEND VARCHAR(2),
    NOMVEND VARCHAR(60),
    NOMTIPO VARCHAR(10),
    ARTICULO VARCHAR(15),
    DESCRIPCION VARCHAR(60),
    CODGRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    CODSUBG VARCHAR(3),
    NOMSUBG VARCHAR(30),
    CODMARC VARCHAR(3),
    NOMMARC VARCHAR(30),
    UNIDAD VARCHAR(8),
    CANTVTAS NUMERIC(18,4),
    CANTDEV NUMERIC(18,4),
    BASEVTAS NUMERIC(18,2),
    BASEDEV NUMERIC(18,2),
    PORC NUMERIC(18,2),
    COMISION NUMERIC(18,2),
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE)
AS
declare variable COMIPOR NUMERIC(9,2);
declare variable COMIMONTO NUMERIC(18,2);
declare variable LISTA VARCHAR(6);
declare variable COMIPPOR NUMERIC(9,2);
declare variable COMIPMONTO NUMERIC(18,2);
declare variable COMIDMONTO NUMERIC(18,2);
declare variable IDFAC INTEGER;
BEGIN
EXECUTE PROCEDURE lee_configuracion ('FACTURACION', 'ARTICULOS', 'COMISIONES POR ARTICULO POR GRUPO O POR LISTA DE PRECIOS') returning_values (LISTA);
FOR select VEND_COD, VEND_NOMBRE
    from VENDEDORES
    where VEND_COD >= :DESDE AND VEND_COD <= :HASTA AND ((:AGENCIA = 0) or (SUCU_ID = :AGENCIA))
    INTO :CODVEND, :NOMVEND
    DO  
    BEGIN
    FOR SELECT ARTI_COD, ARTI_DES, ARTI_UNIDAD, A.GRUP_COD, GRUP_NOM, A.SUBG_COD, A.MARC_COD, GRUP_COMIPOR, GRUP_COMIMONTO
        FROM ARTICULO A, GRUPO G
        WHERE ARTI_COD >= :ARTINI AND ARTI_COD <= :ARTFIN AND A.GRUP_COD = G.GRUP_COD and substring(a.arti_cod from 1 FOR 2) <> '.t'
      INTO :ARTICULO, :DESCRIPCION, :UNIDAD, :CODGRUPO, :NOMGRUPO, :CODSUBG, :CODMARC, :COMIPOR, :COMIMONTO
      DO
        BEGIN
        SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
        SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
        if (COMIMONTO IS null) then
            COMIMONTO = 0;
        if (DETALLE = 'N') then
            BEGIN
            if (LISTA = 'GRUPO') then
                BEGIN
                SELECT SUM(FADE_CANT * FADE_FACTOR), SUM(FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO)
                    FROM FACTURAS_DETALLE D, FACTURAS F
                    WHERE F.FACT_ID = D.FACT_ID AND ARTI_COD = :ARTICULO AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND VEND_COD = :CODVEND AND FACT_ANULADO = 'N'
                    INTO :CANTVTAS, :BASEVTAS;
                SELECT SUM(DVDE_CANT * DVDE_FACTOR), SUM(DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO)
                    FROM devoluciones_ventas_detalle D, DEVOLUCIONES_VENTAS V
                    WHERE V.DEVT_ID = D.DEVT_ID AND ARTI_COD = :ARTICULO AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND VEND_COD = :CODVEND AND DEVT_ANULADO = 'N'
                    INTO :CANTDEV, :BASEDEV;
                if (CANTVTAS IS NULL) then
                    CANTVTAS = 0;
                if (CANTDEV IS NULL) then
                    CANTDEV = 0;
                if (BASEVTAS IS NULL) then
                    BASEVTAS = 0;
                if (BASEDEV IS NULL) then
                    BASEDEV = 0;
                if (COMIMONTO > 0) then
                    BEGIN
                    COMISION = (CANTVTAS - CANTDEV) * COMIMONTO;
                    PORC = COMISION * 100 / (BASEVTAS - BASEDEV);
                    END
                ELSE
                    BEGIN
                    COMISION = (BASEVTAS - BASEDEV) * COMIPOR / 100;
                    PORC = COMIPOR;
                    END
                if (CEROS = 'S') then
                    SUSPEND;
                ELSE
                    if ((CANTVTAS <> 0) OR (CANTDEV <> 0)) then
                        SUSPEND;
                END
            ELSE
                BEGIN
                SELECT SUM(FADE_CANT * FADE_FACTOR), SUM(FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), SUM((FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO)*P.prar_comi/100), SUM((FADE_CANT * FADE_FACTOR)*P.prar_comimonto)
                    FROM FACTURAS_DETALLE D, FACTURAS F, PRECIOS_ARTICULO P
                    WHERE F.FACT_ID = D.FACT_ID AND D.arti_cod = P.arti_cod AND D.lipr_cod = P.lipr_cod AND D.ARTI_COD = :ARTICULO AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND VEND_COD = :CODVEND AND FACT_ANULADO = 'N'
                    INTO :CANTVTAS, :BASEVTAS, :COMISION, :comipmonto;
                SELECT SUM(DVDE_CANT * DVDE_FACTOR), SUM(DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO), SUM((DVDE_CANT * DVDE_FACTOR)*P.prar_comimonto)
                    FROM devoluciones_ventas_detalle D, DEVOLUCIONES_VENTAS V, PRECIOS_ARTICULO P
                    WHERE V.DEVT_ID = D.DEVT_ID AND D.ARTI_COD = :ARTICULO AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND VEND_COD = :CODVEND AND DEVT_ANULADO = 'N' AND P.lipr_cod = 1 AND P.arti_cod = D.arti_cod
                    INTO :CANTDEV, :BASEDEV, :comidmonto;
                if (CANTVTAS IS NULL) then
                    CANTVTAS = 0;
                if (CANTDEV IS NULL) then
                    CANTDEV = 0;
                if (BASEVTAS IS NULL) then
                    BASEVTAS = 0;
                if (BASEDEV IS NULL) then
                    BASEDEV = 0;
                if (COMISION IS NULL) then
                    COMISION = 0;
                if (COMIPMONTO IS NULL) then
                    COMIPMONTO = 0;
                if (COMIDMONTO IS NULL) then
                    COMIDMONTO = 0;
                if (comipmonto <> 0) then
                    comision = comipmonto -comidmonto;
                else
                    if (basedev <> 0) then
                        COMISION = (BASEVTAS - BASEDEV) * PORC / 100;

                if (BASEVTAS <> 0) then
                    PORC = (COMISION * 100) / BASEVTAS;
                else
                    PORC = 0;
                if (CEROS = 'S') then
                    SUSPEND;
                ELSE
                    if ((CANTVTAS <> 0) OR (CANTDEV <> 0)) then
                        SUSPEND;
                END
            END
        ELSE
            BEGIN
            SELECT TIDO_NOMCORTO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 31 INTO :NOMTIPO;
            BASEDEV = 0;
            CANTDEV = 0;
            FOR SELECT PREF_PRE, FACT_NUMERO, FACT_FECHA, FADE_CANT * FADE_FACTOR, FADE_TOTAL - FADE_IVAMONTO - FADE_CONSUMO, P.prar_comi, P.prar_comimonto
                FROM FACTURAS F, FACTURAS_DETALLE D, precios_articulo P
                WHERE F.FACT_ID = D.FACT_ID AND D.arti_cod = P.arti_cod AND D.lipr_cod = P.lipr_cod AND D.ARTI_COD = :ARTICULO AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND VEND_COD = :CODVEND AND FACT_ANULADO = 'N'
                INTO :PREFIJO, :NUMERO, :FECHA, :CANTVTAS, :BASEVTAS, :comippor, :comipmonto
                DO
                BEGIN
                if (CANTVTAS IS NULL) then
                    CANTVTAS = 0;
                if (BASEVTAS IS NULL) then
                    BASEVTAS = 0;
                if (LISTA = 'GRUPO') then
                    BEGIN
                    if (COMIMONTO > 0) then
                        BEGIN
                        COMISION = CANTVTAS * COMIMONTO;
                        PORC = COMISION * 100 / BASEVTAS;
                        END
                    ELSE
                        BEGIN
                        COMISION = BASEVTAS * COMIPOR / 100;
                        PORC = COMIPOR;
                        END
                    END
                ELSE
                    BEGIN
                    if (COMIPMONTO > 0) then
                        BEGIN
                        COMISION = CANTVTAS * COMIPMONTO;
                        PORC = COMISION * 100 / BASEVTAS;
                        END
                    ELSE
                        BEGIN
                        COMISION = BASEVTAS * COMIPPOR / 100;
                        PORC = COMIPPOR;
                        END
                    END
                SUSPEND;
                END
            SELECT TIDO_NOMCORTO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 33 INTO :NOMTIPO;
            BASEVTAS = 0;
            FOR SELECT PREF_PRE, DEVT_NUMERO, DEVT_FECHA, DVDE_CANT * DVDE_FACTOR, DVDE_TOTAL - DVDE_IVAMONTO - DVDE_CONSUMO, V.devt_factid
                FROM DEVOLUCIONES_VENTAS V, DEVOLUCIONES_VENTAS_DETALLE D
                WHERE V.DEVT_ID = D.DEVT_ID AND D.ARTI_COD = :ARTICULO AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND VEND_COD = :CODVEND AND DEVT_ANULADO = 'N'
                INTO :PREFIJO, :NUMERO, :FECHA, :CANTDEV, :BASEDEV, :idfac
                DO
                BEGIN
                if (CANTDEV IS NULL) then
                    CANTDEV = 0;
                if (BASEDEV IS NULL) then
                    BASEDEV = 0;
                if (LISTA = 'GRUPO') then
                    BEGIN
                    if (COMIMONTO > 0) then
                        BEGIN
                        COMISION = CANTDEV * COMIMONTO * -1;
                        PORC = COMISION * 100 / BASEDEV;
                        END
                    ELSE
                        BEGIN
                        COMISION = BASEDEV * COMIPOR / 100 * -1;
                        PORC = COMIPOR;
                        END
                    END
                ELSE
                    BEGIN
                    /*  BUSQUE EL PRECIO DE LA FACTURA */
                    COMIPMONTO = 0;
                    COMIPPOR = 0;
                    SELECT P.prar_comi, P.prar_comimonto FROM FACTURAS_DETALLE D, PRECIOS_ARTICULO P
                        WHERE D.arti_cod = P.arti_cod AND D.lipr_cod = P.lipr_cod AND D.ARTI_COD = :articulo AND FACT_ID = :idfac INTO :comippor, :comipmonto;
                    if (COMIPMONTO > 0) then
                        BEGIN
                        COMISION = CANTDEV * COMIPMONTO * -1;
                        PORC = COMISION * 100 / BASEDEV;
                        END
                    ELSE
                        BEGIN
                        COMISION = BASEDEV * COMIPPOR / 100 * -1;
                        PORC = COMIPPOR;
                        END
                    END
                SUSPEND;
                END
            END
        END
    END
END
^

SET TERM ; ^



/* 20090713b *//* DEVOLUCIONES SUBTOTAL MAL */

SET TERM ^ ;

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

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

SET TERM ; ^


/* 20090714 */
/* SI BASE POR 'D' ASUMIA QUE SOLO LOS ANTICIPOS EN CUANTA 28 */
SET TERM ^ ;

CREATE OR ALTER procedure CONTABIL_RECICAJA (
    IDDOC integer,
    IDINTER integer)
returns (
    ERROR integer,
    VER char(1),
    IDC integer)
AS
declare variable PREF VARCHAR(4);
declare variable NUM VARCHAR(6);
declare variable FECAUX DATE;
declare variable FECHA CHAR(8);
declare variable CONC CHAR(120);
declare variable VRDTO NUMERIC(18,2);
declare variable VRRTFTE NUMERIC(18,2);
declare variable VRRTIVA NUMERIC(18,2);
declare variable VRRTICA NUMERIC(18,2);
declare variable VRTOTAL NUMERIC(18,2);
declare variable TIPOCOMP VARCHAR(3);
declare variable PREFCONT VARCHAR(4);
declare variable BASE CHAR(1);
declare variable CTABASE VARCHAR(20);
declare variable CAJA CHAR(1);
declare variable CTACAJA VARCHAR(20);
declare variable RTFTE CHAR(1);
declare variable CTARTFTE VARCHAR(20);
declare variable RTIVA CHAR(1);
declare variable CTARTIVA VARCHAR(20);
declare variable RTICA CHAR(1);
declare variable CTARTICA VARCHAR(20);
declare variable DTO CHAR(1);
declare variable CTADTO VARCHAR(20);
declare variable EXISTE CHAR(1);
declare variable CUENTA VARCHAR(20);
declare variable MONTO NUMERIC(18,2);
declare variable ES_RETENCION CHAR(1);
declare variable TIPOCUEN CHAR(1);
declare variable NIT VARCHAR(20);
declare variable PROY VARCHAR(4);
declare variable CENTRO VARCHAR(4);
declare variable DEBITO NUMERIC(18,2);
declare variable CREDITO NUMERIC(18,2);
declare variable NROI INTEGER;
declare variable SUMA NUMERIC(18,2);
declare variable TCTACLIEN VARCHAR(20);
declare variable TCTARTFTE VARCHAR(20);
declare variable TCTARTIVA VARCHAR(20);
declare variable TCTARTICA VARCHAR(20);
declare variable TIPOIT INTEGER;
declare variable IDIT INTEGER;
declare variable PREFIT VARCHAR(4);
declare variable NUMIT VARCHAR(6);
declare variable NUMEROIT VARCHAR(10);
declare variable ABONOIT NUMERIC(18,2);
declare variable CTADIC VARCHAR(20);
declare variable BASEADIC VARCHAR(20);
declare variable PORCADIC NUMERIC(5,2);
declare variable VALORADIC NUMERIC(18,2);
declare variable DBADIC CHAR(1);
declare variable ANULADO CHAR(1);
declare variable VRBASE NUMERIC(18,2);
declare variable PORC numeric(9,2);
declare variable OK INTEGER;
declare variable CRUCES NUMERIC(18,2);
declare variable VRCAJA NUMERIC(18,2);
declare variable DIFCAMBIO NUMERIC(18,2);
declare variable CTADIF VARCHAR(20);
declare variable PROVID INTEGER;
declare variable RTFTEC NUMERIC(18,2);
declare variable RTIVAC NUMERIC(18,2);
declare variable RTICAC NUMERIC(18,2);
declare variable RTFTER CHAR(1);
declare variable CTARTFTER VARCHAR(20);
declare variable RTIVAR CHAR(1);
declare variable CTARTIVAR VARCHAR(20);
declare variable RTICAR CHAR(1);
declare variable CTARTICAR VARCHAR(20);
declare variable RET CHAR(2);
declare variable RTIT NUMERIC(18,2);
BEGIN
ERROR = 0;
/* BUSQUE LA INTERFACE */
EXISTE = 'N';
SELECT 'S',TICO_COD,PRCO_PRE,INCJ_BASE,INCJ_DTOPP,INCJ_RTFTE,INCJ_RTIVA,INCJ_RTICA,INCJ_CAJA,INCJ_CTABASE,INCJ_CTADTO,INCJ_CTARTFTE,INCJ_CTARTIVA,INCJ_CTARTICA,INCJ_CTACAJA,INCJ_CONFIRMAR
    FROM INTERFAZ_CAJA
    WHERE INCJ_ID = :IDINTER
    INTO :EXISTE,:TIPOCOMP,:PREFCONT,:BASE,:DTO,:RTFTE,:RTIVA,:RTICA,:CAJA,:CTABASE,:CTADTO,:CTARTFTE,:CTARTIVA,:CTARTICA,:CTACAJA,:VER;
if (EXISTE = 'S') then
  BEGIN
  /* BORRE LA CONTABILIZACION ANTERIOR */
  OK = 0;
  FOR SELECT CNTB_ID FROM CONTABILIZACION WHERE CNTB_TIPOREF = 61 AND CNTB_IDREF = :IDDOC INTO :OK DO
    BEGIN
    DELETE FROM CONTABILIZACION_DET WHERE CNTB_ID = :OK;
    DELETE FROM CONTABILIZACION WHERE CNTB_ID = :OK;
    END
  /* TRAIGA EL ENCABEZADO DEL RECIBO */
  SELECT PREF_PRE,RECA_NUMERO,RECA_FECHA,R.TERC_NIT,RECA_CONC,RECA_DTOF,RECA_MONTO,RECA_RTFTEMONTO,RECA_RTIVAMONTO,RECA_RTICAMONTO,TERC_CTARTFTE,TERC_CTARTIVA,TERC_CTARTICA,TERC_CTACLIENTE,RECA_ANULADO,RECA_PROVID
    FROM RECIBOS_CAJA R,TERCEROS T
    WHERE RECA_ID = :IDDOC AND R.TERC_NIT = T.TERC_NIT
    INTO :PREF,:NUM,:FECAUX,:NIT,:CONC,:VRDTO,:VRTOTAL,:VRRTFTE,:VRRTIVA,:VRRTICA,:TCTARTFTE,TCTARTIVA,TCTARTICA,TCTACLIEN,:ANULADO,:PROVID;
  if (ANULADO = 'N') then
    BEGIN
    SELECT PREF_CENTRO,PREF_PROY FROM PREFIJOS
        WHERE PREF_PRE = :PREF AND TIDO_COD = 61 INTO :CENTRO,:PROY;
    EXECUTE PROCEDURE FECHA_A_CONTA(:FECAUX) returning_values (:FECHA);
    IDC = GEN_ID(ID_CONTABILIZA,1);
    INSERT INTO CONTABILIZACION (CNTB_ID,CNTB_TIPOCOMP,CNTB_PREFCNT,CNTB_NUMERO,CNTB_FECHA,CNTB_CONCEPTO,CNTB_REF,CNTB_TIPOREF,CNTB_IDREF,CNTB_PREFREF,CNTB_NUMREF,CNTB_PROCESADO)
        VALUES (:IDC,:TIPOCOMP,:PREFCONT,:NUM,:FECHA,:CONC,'',61,:IDDOC,:PREF,:NUM,'N');
    NROI = 0;
    SUMA = 0;
    /* SUME LOS CRUCES PARA LLEVARLOS A LA CUENTA X PAGAR Y RESTAR DE LA CAJA */
    SELECT SUM(RCCR_ABONO) FROM RECIBOS_CAJA_CRUCEC WHERE RECA_ID = :iddoc INTO :CRUCES;
    if (CRUCES IS NULL) then
        CRUCES = 0;
    VRCAJA = VRTOTAL;
    IF ((CAJA = 'K')) THEN
        BEGIN
        if (VRCAJA <> 0) then
            BEGIN
            CUENTA = NULL;
            EXECUTE PROCEDURE VALIDE_CUENTA_C (CTACAJA) RETURNING_VALUES (:OK);
            IF (OK = 0) THEN
                SELECT CUEN_COD,CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :CTACAJA INTO :CUENTA,:TIPOCUEN;
            ELSE
                begin
                EXECUTE PROCEDURE ERROR (61,:IDDOC,:CTACAJA,2);
                CUENTA = CTACAJA;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERROR (61,:IDDOC,:CUENTA,3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                EXECUTE PROCEDURE ERROR (61,:IDDOC,:CUENTA,4);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                IF (VRCAJA > 0) THEN
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID,CNDE_ITEM,CNDE_CUENTA,CNDE_CONC,CNDE_REF,CNDE_DEBITOS,CNDE_CREDITOS,CNDE_BASE,CNDE_PORC,CNDE_TERC,CNDE_PROY,CNDE_CENTRO,CNDE_DOCNUMERO,CNDE_DOCAPLICAR,CNDE_DOCVENCE,CNDE_ARTICULO,CNDE_DOCTIPOA,CNDE_DOCTIPON)
                        VALUES (:IDC,:NROI,:CUENTA,:CONC,'',:VRCAJA,0,0,0,:NIT,:PROY,:CENTRO,NULL,NULL,NULL,NULL,0,0);
                    SUMA = SUMA + VRCAJA;
                    END
                ELSE   
                    BEGIN                     
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID,CNDE_ITEM,CNDE_CUENTA,CNDE_CONC,CNDE_REF,CNDE_DEBITOS,CNDE_CREDITOS,CNDE_BASE,CNDE_PORC,CNDE_TERC,CNDE_PROY,CNDE_CENTRO,CNDE_DOCNUMERO,CNDE_DOCAPLICAR,CNDE_DOCVENCE,CNDE_ARTICULO,CNDE_DOCTIPOA,CNDE_DOCTIPON)
                       VALUES (:IDC,:NROI,:CUENTA,:CONC,'',0,ABS(:VRCAJA),0,0,:NIT,:PROY,:CENTRO,NULL,NULL,NULL,NULL,0,0);
                    SUMA = SUMA + VRCAJA;
                    END
                NROI = NROI + 1;
                END
            END
        END
    IF ((CAJA = 'F')) THEN
        BEGIN
        FOR SELECT MAX(FOPA_CTACONTA),SUM(RCPA_MONTO)
            FROM formas_pago F,recibos_caja_pago R
            WHERE R.RECA_ID = :IDDOC AND R.FOPA_ID = F.FOPA_ID
            GROUP BY FOPA_CTACONTA
            INTO :CTACAJA,:MONTO
        DO
            BEGIN
            if (MONTO <> 0) then
                BEGIN
                CUENTA = NULL;
                EXECUTE PROCEDURE VALIDE_CUENTA_C (CTACAJA) RETURNING_VALUES (:OK);
                IF (OK = 0) THEN
                    SELECT CUEN_COD,CUEN_TIPO FROM CUENTAS
                        WHERE CUEN_COD = :CTACAJA INTO :CUENTA,:TIPOCUEN;
                ELSE
                    begin
                    EXECUTE PROCEDURE ERROR (61,:IDDOC,:CTACAJA,2);
                    CUENTA = CTACAJA;
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (61,:IDDOC,:CUENTA,3);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (61,:IDDOC,:CUENTA,4);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    IF (MONTO > 0) THEN
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID,CNDE_ITEM,CNDE_CUENTA,CNDE_CONC,CNDE_REF,CNDE_DEBITOS,CNDE_CREDITOS,CNDE_BASE,CNDE_PORC,CNDE_TERC,CNDE_PROY,CNDE_CENTRO,CNDE_DOCNUMERO,CNDE_DOCAPLICAR,CNDE_DOCVENCE,CNDE_ARTICULO,CNDE_DOCTIPOA,CNDE_DOCTIPON)
                            VALUES (:IDC,:NROI,:CUENTA,:CONC,'',:MONTO,0,0,0,:NIT,:PROY,:CENTRO,NULL,NULL,NULL,NULL,0,0);
                        SUMA = SUMA + MONTO;
                        END
                    ELSE
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID,CNDE_ITEM,CNDE_CUENTA,CNDE_CONC,CNDE_REF,CNDE_DEBITOS,CNDE_CREDITOS,CNDE_BASE,CNDE_PORC,CNDE_TERC,CNDE_PROY,CNDE_CENTRO,CNDE_DOCNUMERO,CNDE_DOCAPLICAR,CNDE_DOCVENCE,CNDE_ARTICULO,CNDE_DOCTIPOA,CNDE_DOCTIPON)
                            VALUES (:IDC,:NROI,:CUENTA,:CONC,'',0,abs(:MONTO),0,0,:NIT,:PROY,:CENTRO,NULL,NULL,NULL,NULL,0,0);
                        SUMA = SUMA + MONTO;
                        END
                    NROI = NROI + 1;
                    END
                END /* MONTO <> 0 */
            END /* DO FORMA_PAGO */
        END /* CAJA = F */
    if (DTO = 'K') then /* DTO EN CTA CONSTANTE */
        BEGIN
        if (VRDTO <> 0) then
            BEGIN
            CUENTA = NULL;
            EXECUTE PROCEDURE VALIDE_CUENTA_C (CTADTO) RETURNING_VALUES (:OK);
            IF (OK = 0) THEN
                SELECT CUEN_COD,CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :CTADTO INTO :CUENTA,:TIPOCUEN;
            ELSE
                begin
                EXECUTE PROCEDURE ERROR (61,:IDDOC,:CTADTO,2);
                CUENTA = CTADTO;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERROR (61,:IDDOC,:CUENTA,3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                EXECUTE PROCEDURE ERROR (61,:IDDOC,:CUENTA,4);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID,CNDE_ITEM,CNDE_CUENTA,CNDE_CONC,CNDE_REF,CNDE_DEBITOS,CNDE_CREDITOS,CNDE_BASE,CNDE_PORC,CNDE_TERC,CNDE_PROY,CNDE_CENTRO,CNDE_DOCNUMERO,CNDE_DOCAPLICAR,CNDE_DOCVENCE,CNDE_ARTICULO,CNDE_DOCTIPOA,CNDE_DOCTIPON)
                    VALUES (:IDC,:NROI,:CUENTA,:CONC,'',:VRDTO,0,0,0,:NIT,:PROY,:CENTRO,NULL,NULL,NULL,NULL,0,0);
                NROI = NROI + 1;
                SUMA = SUMA + VRDTO;
                END
            END /* VRDTO <> 0 */
        END /* DTO EN CTA CONSTANTE */

    /* LA DIFERENCIA EN CAMBIO */
    SELECT SUM(RCDE_DIFCAMBIO) FROM recibos_caja_detalle WHERE RECA_ID = :iddoc INTO :DIFCAMBIO;
    IF ((DIFCAMBIO IS NOT NULL) AND (DIFCAMBIO <> 0)) THEN
        BEGIN
        if (DIFCAMBIO > 0) then
            execute procedure lee_configuracion('GENERAL','GENERAL','CUENTA DE INGRESO POR DIFERENCIA EN CAMBIO PARA OPERACIONES EN OTRA MONEDA') returning_values (:ctadif);
        else
            execute procedure lee_configuracion('GENERAL','GENERAL','CUENTA DE GASTO POR DIFERENCIA EN CAMBIO PARA OPERACIONES EN OTRA MONEDA') returning_values (:ctadif);
        CUENTA = NULL;
        EXECUTE PROCEDURE VALIDE_CUENTA_C (ctadif) RETURNING_VALUES (:OK);
        IF (OK = 0) THEN
            SELECT CUEN_COD,CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :ctadif INTO :CUENTA,:TIPOCUEN;
        ELSE
            begin
            EXECUTE PROCEDURE ERROR (61,:IDDOC,:ctadif,2);
            CUENTA = ctadif;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERROR (61,:IDDOC,:CUENTA,3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERROR (61,:IDDOC,:CUENTA,4);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            if (DIFCAMBIO > 0) then
                INSERT INTO CONTABILIZACION_DET (CNTB_ID,CNDE_ITEM,CNDE_CUENTA,CNDE_CONC,CNDE_REF,CNDE_DEBITOS,CNDE_CREDITOS,CNDE_BASE,CNDE_PORC,CNDE_TERC,CNDE_PROY,CNDE_CENTRO,CNDE_DOCNUMERO,CNDE_DOCAPLICAR,CNDE_DOCVENCE,CNDE_ARTICULO,CNDE_DOCTIPOA,CNDE_DOCTIPON)
                    VALUES (:IDC,:NROI,:CUENTA,:CONC,'',0,:difcambio,0,0,:NIT,:PROY,:CENTRO,NULL,NULL,NULL,NULL,0,0);
            else
                INSERT INTO CONTABILIZACION_DET (CNTB_ID,CNDE_ITEM,CNDE_CUENTA,CNDE_CONC,CNDE_REF,CNDE_DEBITOS,CNDE_CREDITOS,CNDE_BASE,CNDE_PORC,CNDE_TERC,CNDE_PROY,CNDE_CENTRO,CNDE_DOCNUMERO,CNDE_DOCAPLICAR,CNDE_DOCVENCE,CNDE_ARTICULO,CNDE_DOCTIPOA,CNDE_DOCTIPON)
                    VALUES (:IDC,:NROI,:CUENTA,:CONC,'',ABS(:difcambio),0,0,0,:NIT,:PROY,:CENTRO,NULL,NULL,NULL,NULL,0,0);
            NROI = NROI + 1;
            SUMA = SUMA - difcambio;
            END
        END
    /* RETENCION FUENTE */
    if ((RTFTE = 'T') or (RTFTE = 'K')) then
      if (VRRTFTE <> 0) then
        BEGIN
        if (RTFTE = 'T') then
            CTARTFTE = TCTARTFTE;
        CUENTA = NULL;
        EXECUTE PROCEDURE VALIDE_CUENTA_C (CTARTFTE) RETURNING_VALUES (:OK);
        IF (OK = 0) THEN
            SELECT CUEN_COD,CUEN_RETENCION,CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTARTFTE INTO :CUENTA,:ES_RETENCION,:TIPOCUEN;
        ELSE
            begin
            EXECUTE PROCEDURE ERROR (61,:IDDOC,:CTARTFTE,2);
            CUENTA = CTARTFTE;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERROR (61,:IDDOC,:CUENTA,3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERROR (61,:IDDOC,:CUENTA,4);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            if (ES_RETENCION = 'S') then
                BEGIN
                VRBASE = VRTOTAL + VRDTO + vrrtfte + vrrtiva + vrrtica;
                SELECT CLIE_rtefte from clientes where terc_nit = :NIT INTO :PORC;
                END
            ELSE
                BEGIN
                VRBASE = 0;
                PORC = 0;
                END
            INSERT INTO CONTABILIZACION_DET (CNTB_ID,CNDE_ITEM,CNDE_CUENTA,CNDE_CONC,CNDE_REF,CNDE_DEBITOS,CNDE_CREDITOS,CNDE_BASE,CNDE_PORC,CNDE_TERC,CNDE_PROY,CNDE_CENTRO,CNDE_DOCNUMERO,CNDE_DOCAPLICAR,CNDE_DOCVENCE,CNDE_ARTICULO,CNDE_DOCTIPOA,CNDE_DOCTIPON)
                VALUES (:IDC,:NROI,:CUENTA,:CONC,'',:VRRTFTE,0,:VRBASE,:PORC,:NIT,:PROY,:CENTRO,NULL,NULL,NULL,NULL,0,0);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTFTE;
            END
        END /* RTFTE */
    /* RETENCION IVA */
    if ((RTIVA = 'T') or (RTIVA = 'K')) then
      if (VRRTIVA <> 0) then
        BEGIN
        if (RTIVA = 'T') then
            CTARTIVA = TCTARTIVA;
        CUENTA = NULL;
        EXECUTE PROCEDURE VALIDE_CUENTA_C (CTARTIVA) RETURNING_VALUES (:OK);
        IF (OK = 0) THEN
            SELECT CUEN_COD,CUEN_RETENCION,CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTARTIVA INTO :CUENTA,:ES_RETENCION,:TIPOCUEN;
        ELSE
            begin
            EXECUTE PROCEDURE ERROR (61,:IDDOC,:CTARTIVA,2);
            CUENTA = CTARTIVA;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERROR (61,:IDDOC,:CUENTA,3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERROR (61,:IDDOC,:CUENTA,4);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            if (ES_RETENCION = 'S') then
                BEGIN
                VRBASE = VRTOTAL + VRDTO + vrrtfte + vrrtiva + vrrtica;
                SELECT CLIE_RTEIVA from clientes where terc_nit = :NIT INTO :PORC;
                END
            ELSE
                BEGIN
                VRBASE = 0;
                PORC = 0;
                END
            INSERT INTO CONTABILIZACION_DET (CNTB_ID,CNDE_ITEM,CNDE_CUENTA,CNDE_CONC,CNDE_REF,CNDE_DEBITOS,CNDE_CREDITOS,CNDE_BASE,CNDE_PORC,CNDE_TERC,CNDE_PROY,CNDE_CENTRO,CNDE_DOCNUMERO,CNDE_DOCAPLICAR,CNDE_DOCVENCE,CNDE_ARTICULO,CNDE_DOCTIPOA,CNDE_DOCTIPON)
                VALUES (:IDC,:NROI,:CUENTA,:CONC,'',:VRRTIVA,0,:VRBASE,:PORC,:NIT,:PROY,:CENTRO,NULL,NULL,NULL,NULL,0,0);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTIVA;
            END
        END /* RTIVA */
    /* RETENCION DE ICA */
    if ((RTICA = 'T') or (RTICA = 'K')) then
      if (VRRTICA <> 0) then
        BEGIN
        if (RTICA = 'T') then
            CTARTICA = TCTARTICA;
        CUENTA = NULL;
        EXECUTE PROCEDURE VALIDE_CUENTA_C (CTARTICA) RETURNING_VALUES (:OK);
        IF (OK = 0) THEN
            SELECT CUEN_COD,CUEN_RETENCION,CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTARTICA INTO :CUENTA,:ES_RETENCION,:TIPOCUEN;
        ELSE
            begin
            EXECUTE PROCEDURE ERROR (61,:IDDOC,:CTARTICA,2);
            CUENTA = CTARTICA;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERROR (61,:IDDOC,:CUENTA,3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERROR (61,:IDDOC,:CUENTA,4);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            if (ES_RETENCION = 'S') then
                BEGIN
                VRBASE = VRTOTAL + VRDTO + vrrtfte + vrrtiva + vrrtica;
                SELECT CLIE_RTEICA from clientes where terc_nit = :NIT INTO :PORC;
                END
            ELSE
                BEGIN
                VRBASE = 0;
                PORC = 0;
                END
            INSERT INTO CONTABILIZACION_DET (CNTB_ID,CNDE_ITEM,CNDE_CUENTA,CNDE_CONC,CNDE_REF,CNDE_DEBITOS,CNDE_CREDITOS,CNDE_BASE,CNDE_PORC,CNDE_TERC,CNDE_PROY,CNDE_CENTRO,CNDE_DOCNUMERO,CNDE_DOCAPLICAR,CNDE_DOCVENCE,CNDE_ARTICULO,CNDE_DOCTIPOA,CNDE_DOCTIPON)
                VALUES (:IDC,:NROI,:CUENTA,:CONC,'',:VRRTICA,0,0,0,:NIT,:PROY,:CENTRO,NULL,NULL,NULL,NULL,0,0);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTICA;
            END
        END /* RTICA */
    /* CRUCES CON CXP */
    if (CRUCES <> 0) then
        BEGIN
        SELECT PROV_CTAPAGAR FROM PROVEEDORES WHERE TERC_NIT = :nit INTO :ctabase;
        if (CTABASE IS NULL) then
            ctabase = tctaclien;
        CUENTA = NULL;
        EXECUTE PROCEDURE VALIDE_CUENTA_C (CTABASE) RETURNING_VALUES (:OK);
        IF (OK = 0) THEN
            SELECT CUEN_COD,CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTABASE INTO :CUENTA,:TIPOCUEN;
        ELSE
            begin
            EXECUTE PROCEDURE ERROR (61,:IDDOC,:CTABASE,2);
            CUENTA = CTABASE;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERROR (61,:IDDOC,:CUENTA,3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            /* DEBERIA RECORRER DOCUMENTO POR DOCUMENTO */
            FOR SELECT RCCR_TIPODOC,RCCR_PREFIJO,RCCR_NUMERO,RCCR_ABONO+RCCR_RTFTE+RCCR_RTIVA+RCCR_RTICA+RCCR_DTOF
                FROM recibos_caja_crucec WHERE RECA_ID = :IDDOC
                INTO :TIPOIT,PREFIT,NUMIT,ABONOIT
                DO
                BEGIN
                NUMEROIT = PREFIT || NUMIT;
                if (ABONOIT > 0) then
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID,CNDE_ITEM,CNDE_CUENTA,CNDE_CONC,CNDE_REF,CNDE_DEBITOS,CNDE_CREDITOS,CNDE_BASE,CNDE_PORC,CNDE_TERC,CNDE_PROY,CNDE_CENTRO,CNDE_DOCNUMERO,CNDE_DOCAPLICAR,CNDE_DOCVENCE,CNDE_ARTICULO,CNDE_DOCTIPOA,CNDE_DOCTIPON)
                        VALUES (:IDC,:NROI,:CUENTA,:CONC,'',:ABONOIT,0,0,0,:NIT,:PROY,:CENTRO,NULL,:NUMEROIT,NULL,NULL,:TIPOIT,0);
                else
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID,CNDE_ITEM,CNDE_CUENTA,CNDE_CONC,CNDE_REF,CNDE_DEBITOS,CNDE_CREDITOS,CNDE_BASE,CNDE_PORC,CNDE_TERC,CNDE_PROY,CNDE_CENTRO,CNDE_DOCNUMERO,CNDE_DOCAPLICAR,CNDE_DOCVENCE,CNDE_ARTICULO,CNDE_DOCTIPOA,CNDE_DOCTIPON)
                        VALUES (:IDC,:NROI,:CUENTA,:CONC,'',0, ABS(:ABONOIT),0,0,:NIT,:PROY,:CENTRO,NULL,:NUMEROIT,NULL,NULL,:TIPOIT,0);
                SUMA = SUMA + ABONOIT;
                NROI = NROI + 1;
                END
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            if (CRUCES > 0) then
                INSERT INTO CONTABILIZACION_DET (CNTB_ID,CNDE_ITEM,CNDE_CUENTA,CNDE_CONC,CNDE_REF,CNDE_DEBITOS,CNDE_CREDITOS,CNDE_BASE,CNDE_PORC,CNDE_TERC,CNDE_PROY,CNDE_CENTRO,CNDE_DOCNUMERO,CNDE_DOCAPLICAR,CNDE_DOCVENCE,CNDE_ARTICULO,CNDE_DOCTIPOA,CNDE_DOCTIPON)
                    VALUES (:IDC,:NROI,:CUENTA,:CONC,'',:CRUCES,0,0,0,:NIT,:PROY,:CENTRO,NULL,NULL,NULL,NULL,0,0);
            else
                INSERT INTO CONTABILIZACION_DET (CNTB_ID,CNDE_ITEM,CNDE_CUENTA,CNDE_CONC,CNDE_REF,CNDE_DEBITOS,CNDE_CREDITOS,CNDE_BASE,CNDE_PORC,CNDE_TERC,CNDE_PROY,CNDE_CENTRO,CNDE_DOCNUMERO,CNDE_DOCAPLICAR,CNDE_DOCVENCE,CNDE_ARTICULO,CNDE_DOCTIPOA,CNDE_DOCTIPON)
                    VALUES (:IDC,:NROI,:CUENTA,:CONC,'',0,ABS(:CRUCES),0,0,:NIT,:PROY,:CENTRO,NULL,NULL,NULL,NULL,0,0);
            SUMA = SUMA + CRUCES;
            NROI = NROI + 1;
            END

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

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE RECIBOS_SIN_CONTABILIDAD(
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    ID INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    ESTADO VARCHAR(20),
    IDI INTEGER,
    IDC INTEGER,
    ERROR INTEGER)
AS
 /*$$IBE$$ DECLARE VARIABLE VER CHAR(2);
declare variable FECICNT VARCHAR(10);
declare variable FECFCNT VARCHAR(10);
declare variable idref INTEGER; $$IBE$$*/ 
BEGIN /*$$IBE$$ 
EXECUTE PROCEDURE fecha_a_conta(FECINI) returning_values (FECICNT);
EXECUTE PROCEDURE fecha_a_conta(FECFIN) returning_values (FECFCNT);
FOR SELECT RECA_ID, PREF_PRE, RECA_NUMERO FROM RECIBOS_CAJA WHERE RECA_ANULADO = 'N' AND
    RECA_FECHA >= :FECINI AND RECA_FECHA <= :FECFIN and PREF_PRE NOT IN (SELECT AUTO_PREFRDC FROM AUTORIZACIONES) ORDER BY RECA_ID
    INTO :ID, :PREF, :NUMERO
DO
  BEGIN
  idref = null;
  SELECT ENCO_IDREF FROM COMPROBANTE_ENCABEZADO WHERE ENCO_TIPOREF = 61 AND ENCO_FECHA >= :FECICNT AND ENCO_FECHA <= :FECFCNT and ENCO_IDREF = :id into :idref;
  if (idref IS NULL) then
  begin
   ESTADO = 'PROCESANDO';
   SUSPEND;
   SELECT MAX(INCJ_ID) FROM INTERFAZ_CAJA WHERE PREF_PRE = :PREF AND TIDO_COD = 61 INTO :IDI;
   EXECUTE PROCEDURE CONTABIL_RECICAJA (:ID, :IDI) RETURNING_VALUES (:ERROR, :VER, :IDC);
   if (ERROR = 0) then
    BEGIN
    EXECUTE PROCEDURE CONTABILIZA_PENDIENTE (:IDC);
    ESTADO = 'OK';
    END
   ELSE
    ESTADO = 'ERROR';
   suspend;
  end
  END
 $$IBE$$*/ SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE RECIBOS_SIN_CONTABILIDAD(
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    ID INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    ESTADO VARCHAR(20),
    IDI INTEGER,
    IDC INTEGER,
    ERROR INTEGER)
AS
DECLARE VARIABLE VER CHAR(2);
declare variable FECICNT VARCHAR(10);
declare variable FECFCNT VARCHAR(10);
declare variable idref INTEGER;
BEGIN
EXECUTE PROCEDURE fecha_a_conta(FECINI) returning_values (FECICNT);
EXECUTE PROCEDURE fecha_a_conta(FECFIN) returning_values (FECFCNT);
FOR SELECT RECA_ID, PREF_PRE, RECA_NUMERO FROM RECIBOS_CAJA WHERE RECA_ANULADO = 'N' AND
    RECA_FECHA >= :FECINI AND RECA_FECHA <= :FECFIN and PREF_PRE NOT IN (SELECT AUTO_PREFRDC FROM AUTORIZACIONES) ORDER BY RECA_ID
    INTO :ID, :PREF, :NUMERO
DO
  BEGIN
  idref = null;
  SELECT ENCO_IDREF FROM COMPROBANTE_ENCABEZADO WHERE ENCO_TIPOREF = 61 AND ENCO_FECHA >= :FECICNT AND ENCO_FECHA <= :FECFCNT and ENCO_IDREF = :id into :idref;
  if (idref IS NULL) then
  begin
   ESTADO = 'PROCESANDO';
   SUSPEND;
   SELECT MAX(INCJ_ID) FROM INTERFAZ_CAJA WHERE PREF_PRE = :PREF AND TIDO_COD = 61 INTO :IDI;
   EXECUTE PROCEDURE CONTABIL_RECICAJA (:ID, :IDI) RETURNING_VALUES (:ERROR, :VER, :IDC);
   if (ERROR = 0) then
    BEGIN
    EXECUTE PROCEDURE CONTABILIZA_PENDIENTE (:IDC);
    ESTADO = 'OK';
    END
   ELSE
    ESTADO = 'ERROR';
   suspend;
  end
  END
END

^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure CONTABIL_EGRESO (
    IDDOC integer,
    IDINTER integer)
returns (
    ERROR integer,
    VER char(1),
    IDC integer)
AS
declare variable PREF VARCHAR(4);
declare variable NUM VARCHAR(6);
declare variable FECAUX DATE;
declare variable FECHA CHAR(8);
declare variable CONC CHAR(120);
declare variable VRDTO NUMERIC(18, 2);
declare variable VRRTFTE NUMERIC(18, 2);
declare variable VRRTIVA NUMERIC(18, 2);
declare variable VRRTICA NUMERIC(18, 2);
declare variable VRTOTAL NUMERIC(18, 2);
declare variable TIPOCOMP VARCHAR(3);
declare variable PREFCONT VARCHAR(4);
declare variable BASE CHAR(1);
declare variable CTABASE VARCHAR(20);
declare variable CAJA CHAR(1);
declare variable CTACAJA VARCHAR(20);
declare variable RTFTE CHAR(1);
declare variable CTARTFTE VARCHAR(20);
declare variable RTIVA CHAR(1);
declare variable CTARTIVA VARCHAR(20);
declare variable RTICA CHAR(1);
declare variable CTARTICA VARCHAR(20);
declare variable DTO CHAR(1);
declare variable CTADTO VARCHAR(20);
declare variable EXISTE CHAR(1);
declare variable CUENTA VARCHAR(20);
declare variable MONTO NUMERIC(18,2);
declare variable ES_RETENCION CHAR(1);
declare variable TIPOCUEN CHAR(1);
declare variable NIT VARCHAR(20);
declare variable PROY VARCHAR(4);
declare variable CENTRO VARCHAR(4);
declare variable MONTOBASE NUMERIC(18,2);
declare variable PORC NUMERIC(9,2);
declare variable DEBITO NUMERIC(18,2);
declare variable CREDITO NUMERIC(18,2);
declare variable NROI INTEGER;
declare variable SUMA NUMERIC(18,2);
declare variable TCTACLIEN VARCHAR(20);
declare variable TCTARTFTE VARCHAR(20);
declare variable TCTARTIVA VARCHAR(20);
declare variable TCTARTICA VARCHAR(20);
declare variable TCTACART VARCHAR(20);
declare variable TIPOIT INTEGER;
declare variable IDIT INTEGER;
declare variable PREFIT VARCHAR(4);
declare variable NUMIT VARCHAR(6);
declare variable NUMEROIT VARCHAR(10);
declare variable ABONOIT NUMERIC(18,2);
declare variable CTADIC VARCHAR(20);
declare variable BASEADIC VARCHAR(20);
declare variable PORCADIC NUMERIC(5,2);
declare variable VALORADIC NUMERIC(18,2);
declare variable DBADIC CHAR(1);
declare variable VRBASE NUMERIC(18,2);
declare variable GMF CHAR(1);
declare variable CODBCO INTEGER;
declare variable NUMCHEQ VARCHAR(20);
declare variable CRUCES NUMERIC(18,2);
declare variable VRCAJA NUMERIC(18,2);
declare variable OK INTEGER;
declare variable DIFCAMBIO NUMERIC(18,2);
declare variable CTADIF VARCHAR(20);
declare variable RTFTEC NUMERIC(18,2);
declare variable RTIVAC NUMERIC(18,2);
declare variable RTICAC NUMERIC(18,2);
declare variable RTFTER CHAR(1);
declare variable CTARTFTER VARCHAR(20);
declare variable RTIVAR CHAR(1);
declare variable CTARTIVAR VARCHAR(20);
declare variable RTICAR CHAR(1);
declare variable CTARTICAR VARCHAR(20);
declare variable RET CHAR(2);
declare variable RTIT NUMERIC(18,2);
declare variable NITBCO VARCHAR(20);
BEGIN
/* BUSQUE LA INTERFACE */
EXISTE = 'N';
SELECT 'S', TICO_COD, PRCO_PRE, INCJ_BASE, INCJ_DTOPP, INCJ_RTFTE, INCJ_RTIVA, INCJ_RTICA, INCJ_CAJA, INCJ_CTABASE, INCJ_CTADTO, INCJ_CTARTFTE, INCJ_CTARTIVA, INCJ_CTARTICA, INCJ_CTACAJA, INCJ_CONFIRMAR
    FROM INTERFAZ_CAJA
    WHERE INCJ_ID = :IDINTER
    INTO :EXISTE, :TIPOCOMP, :PREFCONT, :BASE, :DTO, :RTFTE, :RTIVA, :RTICA, :CAJA, :CTABASE, :CTADTO, :CTARTFTE, :CTARTIVA, :CTARTICA, :CTACAJA, :VER;
if (EXISTE = 'S') then
    BEGIN
    OK = 0;
    FOR SELECT CNTB_ID FROM CONTABILIZACION WHERE CNTB_TIPOREF = 62 AND CNTB_IDREF = :IDDOC INTO :OK DO
        BEGIN
        DELETE FROM CONTABILIZACION_DET WHERE CNTB_ID = :OK;
        DELETE FROM CONTABILIZACION WHERE CNTB_ID = :OK;
        END

    /* TRAIGA EL ENCABEZADO DEL EGRESO */
    SELECT PREF_PRE, EGRE_NUMERO, EGRE_FECHA, E.TERC_NIT, EGRE_CONC, EGRE_DTOF, EGRE_MONTO, EGRE_RTFTEMONTO, EGRE_RTIVAMONTO, EGRE_RTICAMONTO, TERC_CTARTFTE, TERC_CTARTIVA, TERC_CTARTICA, TERC_CTACLIENTE
        FROM EGRESOS E, TERCEROS T
        WHERE EGRE_ID = :IDDOC AND E.TERC_NIT = T.TERC_NIT
        INTO :PREF, :NUM, :FECAUX, :NIT, :CONC, :VRDTO, :VRTOTAL, :VRRTFTE, :VRRTIVA, :VRRTICA, :TCTARTFTE, TCTARTIVA, TCTARTICA, TCTACLIEN;
    /* SI ES PROVEEDOR, SOBREESCIBE LAS CUENTAS  */
    SELECT PROV_CTAPAGAR, PROV_CTARTFTE, PROV_CTARTIVA, PROV_CTARTICA
        FROM PROVEEDORES WHERE TERC_NIT = :NIT
        INTO TCTACLIEN, TCTARTFTE, TCTARTIVA, TCTARTICA;
    SELECT PREF_CENTRO, PREF_PROY FROM PREFIJOS
        WHERE PREF_PRE = :PREF AND TIDO_COD = 62 INTO :CENTRO, :PROY;
    EXECUTE PROCEDURE FECHA_A_CONTA(:FECAUX) returning_values (:FECHA);
    /* REGISTRE EL ENCABEZADO CONTABLE */
    IDC = GEN_ID(ID_CONTABILIZA, 1);
    INSERT INTO CONTABILIZACION (CNTB_ID, CNTB_TIPOCOMP, CNTB_PREFCNT, CNTB_NUMERO, CNTB_FECHA, CNTB_CONCEPTO, CNTB_REF, CNTB_TIPOREF, CNTB_IDREF, CNTB_PREFREF, CNTB_NUMREF, CNTB_PROCESADO)
        VALUES (:IDC, :TIPOCOMP, :PREFCONT, :NUM, :FECHA, :CONC, '', 62, :IDDOC, :PREF, :NUM, 'N');
    /* SUME LOS CRUCES PARA LLEVARLOS A LA CUENTA X PAGAR Y RESTAR DE LA CAJA */
    SELECT SUM(EGCC_ABONO) FROM EGRESOS_CRUCEC WHERE EGRE_ID = :iddoc INTO :CRUCES;
    if (CRUCES IS NULL) then
        CRUCES = 0;
    VRCAJA = VRTOTAL;
    NROI = 0;
    SUMA = 0;
    ERROR = 0;
    /* EL CREDITO EN LA CAJA O EL BANCO */
    IF ((CAJA = 'K')) THEN
        BEGIN
        if (VRCAJA <> 0) then
            BEGIN
            CUENTA = NULL;
            EXECUTE PROCEDURE VALIDE_CUENTA_C (CTACAJA) RETURNING_VALUES (:OK);
            IF (OK = 0) THEN
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :CTACAJA INTO :CUENTA, :TIPOCUEN;
            ELSE
                begin
                EXECUTE PROCEDURE ERROR (62, :IDDOC, :CTACAJA, 2);
                CUENTA = CTACAJA;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 4);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRCAJA, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - VRCAJA;
                END
            END /* VRCAJA <> 0 */
        END /* CAJA CONSTANTE */
    IF ((CAJA = 'F')) THEN
        BEGIN
        /* mueva la cuenta de la caja o el banco o ambas */
        /* PRIMERO LA CAJA */
        FOR SELECT CAJA_CUENTA, EGCA_MONTO FROM EGRESOS_CAJA E, CAJAS C
            WHERE C.CAJA_ID = E.CAJA_ID AND EGRE_ID = :IDDOC
            INTO :CTACAJA, :MONTO
            DO
            BEGIN
            if (MONTO <> 0) then
                BEGIN
                CUENTA = NULL;
                EXECUTE PROCEDURE VALIDE_CUENTA_C (CTACAJA) RETURNING_VALUES (:OK);
                IF (OK = 0) THEN
                    SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                        WHERE CUEN_COD = :CTACAJA INTO :CUENTA, :TIPOCUEN;
                ELSE
                    begin
                    EXECUTE PROCEDURE ERROR (62, :IDDOC, :CTACAJA, 2);
                    CUENTA = CTACAJA;
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 4);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA - MONTO;
                    END
                END /* MONTO <> 0 */
            END /* DO CAJA */
        /* AHORA EL BANCO */
        MONTO = 0;
        SELECT CUBA_CTACONTA, EGBC_MONTO, EGBC_GMF, E.CUBA_COD, CUBA_GMFPOR, EGBC_NUMERO, BANC_NIT
            FROM EGRESOS_BANCO E, CUENTAS_BANCO C, BANCOS B
            WHERE E.CUBA_COD = C.CUBA_COD AND EGRE_ID = :IDDOC AND B.banc_cod = C.banc_cod
            INTO :CTACAJA, :MONTO, :GMF, :CODBCO, :PORC, :NUMCHEQ, :nitbco;
        if (MONTO <> 0) then
            BEGIN
            if (MONTO <> 0) then
                BEGIN
                CUENTA = NULL;
                EXECUTE PROCEDURE VALIDE_CUENTA_C (CTACAJA) RETURNING_VALUES (:OK);
                IF (OK = 0) THEN
                    SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                        WHERE CUEN_COD = :CTACAJA INTO :CUENTA, :TIPOCUEN;
                ELSE
                    begin
                    EXECUTE PROCEDURE ERROR (62, :IDDOC, :CTACAJA, 2);
                    CUENTA = CTACAJA;
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 4);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, :NUMCHEQ, 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA - MONTO;
                    END
                /* EL GMF */
                if ((GMF = 'S') AND (PORC <> 0)) then
                    BEGIN
                    if (NITBCO IS NULL) then
                        NITBCO = NIT;
                    EXECUTE procedure REDONDEE(:MONTO * :PORC / 1000, 0) returning_values (MONTO);
                    /* REGISTRE EL GMF EN LA MISMA CUENTA DEL BANCO COMO CREDITO */
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, :NUMCHEQ, 0, :MONTO, 0, 0, :NITBCO, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA - MONTO;

                    /* AHORA LA CUENTA DEL GASTO */
                    SELECT CUBA_CTAGMF FROM CUENTAS_BANCO
                        where CUBA_COD = :CODBCO INTO :CTACAJA;
                    EXECUTE PROCEDURE VALIDE_CUENTA_C (CTACAJA) RETURNING_VALUES (:OK);
                    IF (OK = 0) THEN
                        SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                            WHERE CUEN_COD = :CTACAJA INTO :CUENTA, :TIPOCUEN;
                    ELSE
                        begin
                        EXECUTE PROCEDURE ERROR (62, :IDDOC, :CTACAJA, 2);
                        CUENTA = CTACAJA;
                        TIPOCUEN = 'N';
                        ERROR = ERROR + 1;
                        end
                    if (TIPOCUEN = 'I') then
                        BEGIN
                        EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
                        TIPOCUEN = 'N';
                        ERROR = ERROR + 1;
                        END
                    if (TIPOCUEN = 'C') then
                        BEGIN
                        EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 4);
                        TIPOCUEN = 'N';
                        ERROR = ERROR + 1;
                        END
                    if (TIPOCUEN = 'N') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, :NUMCHEQ, :MONTO, 0, 0, 0, :NITBCO, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NROI = NROI + 1;
                        SUMA = SUMA + MONTO;
                        END
                    END /* GMF */
                END /* MONTO <> 0 */
            END /* EGRESO_BANCO */
        END /* CAJA = F */

    /* LOS CRUCES CON CUENTAS X COBRAR */
    if (CRUCES <> 0) then
        BEGIN
        SELECT TERC_CTACLIENTE FROM TERCEROS WHERE TERC_NIT = :nit INTO :tctacart;
        if (tctacart IS NULL) then
            tctacart = tctaclien;
        CUENTA = NULL;
        EXECUTE PROCEDURE VALIDE_CUENTA_C (tctacart) RETURNING_VALUES (:OK);
        IF (OK = 0) THEN
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :tctacart INTO :CUENTA, :TIPOCUEN;
        ELSE
            begin
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :tctacart, 2);
            CUENTA = tctacart;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            /* DEBERIA RECORRER DOCUMENTO POR DOCUMENTO */
            FOR SELECT EGCC_TIPODOC, EGCC_PREFIJO, EGCC_NUMERO, EGCC_ABONO+EGCC_RTFTE+EGCC_RTIVA+EGCC_RTICA+EGCC_DTOF
                FROM egresos_crucec WHERE EGRE_ID = :IDDOC
                INTO :TIPOIT, PREFIT, NUMIT, ABONOIT
                DO
                BEGIN
                NUMEROIT = PREFIT || NUMIT;
                if (ABONOIT > 0) then
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :ABONOIT, 0, 0, :NIT, :PROY, :CENTRO, NULL, :NUMEROIT, NULL, NULL, :TIPOIT, 0);
                else
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', abs(:ABONOIT), 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, :NUMEROIT, NULL, NULL, :TIPOIT, 0);
                SUMA = SUMA - ABONOIT;
                NROI = NROI + 1;
                END
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            if (CRUCES > 0) then
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :CRUCES, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            else
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', abs(:CRUCES), 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            SUMA = SUMA - CRUCES;
            NROI = NROI + 1;
            END
        /* LA DIFERENCIA EN CAMBIO */
        SELECT SUM(EGCC_DIFCAMBIO) FROM egresos_crucec WHERE EGRE_ID = :iddoc INTO :DIFCAMBIO;
        IF ((DIFCAMBIO IS NOT NULL) AND (DIFCAMBIO <> 0)) THEN
            BEGIN
            if (DIFCAMBIO > 0) then
                execute procedure lee_configuracion('GENERAL','GENERAL','CUENTA DE INGRESO POR DIFERENCIA EN CAMBIO PARA OPERACIONES EN OTRA MONEDA') returning_values (:ctadif);
            else
                execute procedure lee_configuracion('GENERAL','GENERAL','CUENTA DE GASTO POR DIFERENCIA EN CAMBIO PARA OPERACIONES EN OTRA MONEDA') returning_values (:ctadif);
            CUENTA = NULL;
            EXECUTE PROCEDURE VALIDE_CUENTA_C (ctadif) RETURNING_VALUES (:OK);
            IF (OK = 0) THEN
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :ctadif INTO :CUENTA, :TIPOCUEN;
            ELSE
                begin
                EXECUTE PROCEDURE ERROR (62, :IDDOC, :ctadif, 2);
                CUENTA = ctadif;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 4);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                if (DIFCAMBIO > 0) then
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :difcambio, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                else
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', ABS(:difcambio), 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - difcambio;
                END
            END
        /* RETEFUENTE DEL CRUCE */
        SELECT first 1 INCJ_RTFTE, INCJ_RTIVA, INCJ_RTICA, INCJ_CTARTFTE, INCJ_CTARTIVA, INCJ_CTARTICA
            FROM INTERFAZ_CAJA WHERE tido_cod = 61 into :RTFTER, :RTIVAR, :RTICAR, :CTARTFTER, :CTARTIVAR, :CTARTICAR;
        SELECT SUM(EGCC_RTFTE) FROM egresos_crucec WHERE EGRE_ID = :iddoc INTO :rtftec;
        IF ((rtftec IS NOT NULL) AND (rtftec <> 0)) THEN
            BEGIN
            if ((RTFTER = 'T') or (RTFTER = 'K')) then
                BEGIN
                if (RTFTER = 'T') then
                    SELECT TERC_CTARTFTE FROM TERCEROS WHERE TERC_NIT = :NIT INTO CTARTFTER;
                CUENTA = NULL;
                EXECUTE PROCEDURE VALIDE_CUENTA_C (ctartfter) RETURNING_VALUES (:OK);
                IF (OK = 0) THEN
                    SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                        WHERE CUEN_COD = :ctartfter INTO :CUENTA, :TIPOCUEN;
                ELSE
                    begin
                    EXECUTE PROCEDURE ERROR (62, :IDDOC, :ctartfter, 2);
                    CUENTA = ctartfter;
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 4);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    if (rtftec > 0) then
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :rtftec, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    else
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, abs(:rtftec), 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA + rtftec;
                    END
                END
            END
        /* RETEIVA DEL CRUCE */
        SELECT SUM(EGCC_RTIVA) FROM egresos_crucec WHERE EGRE_ID = :iddoc INTO :rtivac;
        IF ((rtivac IS NOT NULL) AND (rtivac <> 0)) THEN
            BEGIN
            if ((RTIVAR = 'T') or (RTIVAR = 'K')) then
                BEGIN
                if (RTIVAR = 'T') then
                    SELECT TERC_CTARTIVA FROM TERCEROS WHERE TERC_NIT = :NIT INTO CTARTIVAR;
                CUENTA = NULL;
                EXECUTE PROCEDURE VALIDE_CUENTA_C (ctartivar) RETURNING_VALUES (:OK);
                IF (OK = 0) THEN
                    SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                        WHERE CUEN_COD = :ctartivar INTO :CUENTA, :TIPOCUEN;
                ELSE
                    begin
                    EXECUTE PROCEDURE ERROR (62, :IDDOC, :ctartivar, 2);
                    CUENTA = ctartivar;
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 4);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    if (rtivac > 0) then
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :rtivac, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    else
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, abs(:rtivac), 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA + rtivac;
                    END
                END
            END
        /* RETEICA DEL CRUCE */
        SELECT SUM(EGCC_RTICA) FROM egresos_crucec WHERE EGRE_ID = :iddoc INTO :rticac;
        IF ((rticac IS NOT NULL) AND (rtivac <> 0)) THEN
            BEGIN
            if ((RTICAR = 'T') or (RTICAR = 'K')) then
                BEGIN
                if (RTICAR = 'T') then
                    SELECT TERC_CTARTICA FROM TERCEROS WHERE TERC_NIT = :NIT INTO CTARTICAR;
                CUENTA = NULL;
                EXECUTE PROCEDURE VALIDE_CUENTA_C (ctarticar) RETURNING_VALUES (:OK);
                IF (OK = 0) THEN
                    SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                        WHERE CUEN_COD = :ctarticar INTO :CUENTA, :TIPOCUEN;
                ELSE
                    begin
                    EXECUTE PROCEDURE ERROR (62, :IDDOC, :ctarticar, 2);
                    CUENTA = ctarticar;
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 4);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    if (rticac > 0) then
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :rticac, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    else
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, abs(:rticac), 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA + rticac;
                    END
                END
            END
        END /* cruces */

    if (DTO = 'K') then /* DTO EN CTA CONSTANTE */
        BEGIN
        if (VRDTO <> 0) then
            BEGIN
            CUENTA = NULL;
            EXECUTE PROCEDURE VALIDE_CUENTA_C (CTADTO) RETURNING_VALUES (:OK);
            IF (OK = 0) THEN
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :CTADTO INTO :CUENTA, :TIPOCUEN;
            ELSE
                begin
                EXECUTE PROCEDURE ERROR (62, :IDDOC, :CTADTO, 2);
                CUENTA = CTADTO;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 4);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRDTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - VRDTO;
                END
            END /* VRDTO <> 0 */
        END /* DTO EN CTA CONSTANTE */

    /* LA DIFERENCIA EN CAMBIO */
    SELECT SUM(EGDE_DIFCAMBIO) FROM egresos_detalle WHERE EGRE_ID = :iddoc INTO :DIFCAMBIO;
    IF ((DIFCAMBIO IS NOT NULL) AND (DIFCAMBIO <> 0)) THEN
        BEGIN
        if (DIFCAMBIO > 0) then
            execute procedure lee_configuracion('GENERAL','GENERAL','CUENTA DE GASTO POR DIFERENCIA EN CAMBIO PARA OPERACIONES EN OTRA MONEDA') returning_values (:ctadif);
        else
            execute procedure lee_configuracion('GENERAL','GENERAL','CUENTA DE INGRESO POR DIFERENCIA EN CAMBIO PARA OPERACIONES EN OTRA MONEDA') returning_values (:ctadif);
        CUENTA = NULL;
        EXECUTE PROCEDURE VALIDE_CUENTA_C (ctadif) RETURNING_VALUES (:OK);
        IF (OK = 0) THEN
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :ctadif INTO :CUENTA, :TIPOCUEN;
        ELSE
            begin
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :ctadif, 2);
            CUENTA = ctadif;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 4);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            if (DIFCAMBIO > 0) then
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :difcambio, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            else
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, ABS(:difcambio), 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA + difcambio;
            END
        END
    /* RETENCION FUENTE */
    if ((RTFTE = 'T') or (RTFTE = 'K')) then
      if (VRRTFTE <> 0) then
        BEGIN
        if (RTFTE = 'T') then
            CTARTFTE = TCTARTFTE;
        CUENTA = NULL;
        EXECUTE PROCEDURE VALIDE_CUENTA_C (CTARTFTE) RETURNING_VALUES (:OK);
        IF (OK = 0) THEN
            SELECT CUEN_COD, CUEN_RETENCION, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTARTFTE INTO :CUENTA, :ES_RETENCION, :TIPOCUEN;
        ELSE
            begin
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :CTARTFTE, 2);
            CUENTA = CTARTFTE;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 4);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            if (ES_RETENCION = 'S') then
                BEGIN
                VRBASE = VRTOTAL;
                SELECT PROV_RETEFTE from proveedores where terc_nit = :NIT INTO :PORC;
                END
            ELSE
                BEGIN
                VRBASE = 0;
                PORC = 0;
                END
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, :VRBASE, :PORC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA - VRRTFTE;
            END
        END /* RTFTE */
    /* RETENCION IVA */
    if ((RTIVA = 'T') or (RTIVA = 'K')) then
      if (VRRTIVA <> 0) then
        BEGIN
        if (RTIVA = 'T') then
            CTARTIVA = TCTARTIVA;
        CUENTA = NULL;
        EXECUTE PROCEDURE VALIDE_CUENTA_C (CTARTIVA) RETURNING_VALUES (:OK);
        IF (OK = 0) THEN
            SELECT CUEN_COD, CUEN_RETENCION, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTARTIVA INTO :CUENTA, :ES_RETENCION, :TIPOCUEN;
        ELSE
            begin
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :CTARTIVA, 2);
            CUENTA = CTARTIVA;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 4);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            if (ES_RETENCION = 'S') then
                BEGIN
                VRBASE = VRTOTAL;
                SELECT PROV_RTEIVA from proveedores where terc_nit = :NIT INTO :PORC;
                END
            ELSE
                BEGIN
                VRBASE = 0;
                PORC = 0;
                END
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTIVA, :VRBASE, :PORC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA - VRRTIVA;
            END
        END /* RTIVA */
    /* RETENCION DE ICA */
    if ((RTICA = 'T') or (RTICA = 'K')) then
      if (VRRTICA <> 0) then
        BEGIN
        if (RTICA = 'T') then
            CTARTICA = TCTARTICA;
        CUENTA = NULL;
        EXECUTE PROCEDURE VALIDE_CUENTA_C (CTARTICA) RETURNING_VALUES (:OK);
        IF (OK = 0) THEN
            SELECT CUEN_COD, CUEN_RETENCION, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTARTICA INTO :CUENTA, :ES_RETENCION, :TIPOCUEN;
        ELSE
            begin
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :CTARTICA, 2);
            CUENTA = CTARTICA;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 4);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            if (ES_RETENCION = 'S') then
                BEGIN
                VRBASE = VRTOTAL;
                SELECT PROV_RTEICA from proveedores where terc_nit = :NIT INTO :PORC;
                END
            ELSE
                BEGIN
                VRBASE = 0;
                PORC = 0;
                END
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTICA, :VRBASE, :PORC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA - VRRTICA;
            END
        END /* RTICA */
    /* RECORRA LAS CUENTAS DE EGRESOS_CONTABILIDAD */
    FOR SELECT CUEN_COD, EGCO_NIT, EGCO_PROY, EGCO_CENTRO, EGCO_CONC, EGCO_DEBITOS, EGCO_CREDITOS, EGCO_BASEM, EGCO_PORC
        FROM EGRESOS_CONTABILIDAD WHERE EGRE_ID = :IDDOC ORDER BY EGCO_ITEM
        INTO :CTABASE, :NIT, :PROY, :CENTRO, :CONC, :DEBITO, :CREDITO, :MONTOBASE, :PORC
        DO
        BEGIN
        CUENTA = NULL;
        EXECUTE PROCEDURE VALIDE_CUENTA_C (CTABASE) RETURNING_VALUES (:OK);
        IF (OK = 0) THEN
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTABASE INTO :CUENTA, :TIPOCUEN;
        ELSE
            begin
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :CTABASE, 2);
            CUENTA = CTABASE;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 4);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'N') then
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :DEBITO, :CREDITO, :MONTOBASE, :PORC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
        SUMA = SUMA + DEBITO - CREDITO;
        NROI = NROI + 1;
        END
    /* CIERRE EL COMPROBANTE CONTRA LA CUENTA DEL TERCERO O LA BASE CONSTANTE */
    if (SUMA <> 0) THEN
        BEGIN
        if (SUMA < 0) then
            BEGIN
            DEBITO = SUMA * -1;
            CREDITO = 0;
            END
        ELSE
            BEGIN
            DEBITO = 0;
            CREDITO = SUMA;
            END
        if ((BASE = 'F') or (BASE = 'T') or (BASE = 'K')) then
            BEGIN
            if (BASE = 'T') then
                CTABASE = TCTACLIEN;
            if (BASE = 'F') then
                BEGIN
                SELECT CAJA_CUENTA FROM EGRESOS E, CAJAS C
                    WHERE C.CAJA_ID = E.CAJA_ID AND EGRE_ID = :IDDOC INTO :CTABASE;
                END
            CUENTA = NULL;
            EXECUTE PROCEDURE VALIDE_CUENTA_C (CTABASE) RETURNING_VALUES (:OK);
            IF (OK = 0) THEN
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :CTABASE INTO :CUENTA, :TIPOCUEN;
            ELSE
                begin
                EXECUTE PROCEDURE ERROR (62, :IDDOC, :CTABASE, 2);
                CUENTA = CTABASE;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                /* DEBERIA RECORRER DOCUMENTO POR DOCUMENTO */
                FOR SELECT RCDE_TIPODOC, RCDE_PREFIJO, RCDE_NUMERO, RCDE_ABONO+RCDE_RTFTE+RCDE_RTIVA+RCDE_RTICA+RCDE_DTOF
                    FROM RECIBOS_CAJA_DETALLE WHERE RECA_ID = :IDDOC
                    INTO :TIPOIT, PREFIT, NUMIT, ABONOIT
                    DO
                    BEGIN
                    NUMEROIT = PREFIT || NUMIT;
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :ABONOIT, 0, 0, :NIT, :PROY, :CENTRO, NULL, :NUMEROIT, NULL, NULL, :TIPOIT, 0);
                    NROI = NROI + 1;
                    END
                END
            if (TIPOCUEN = 'N') then
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :DEBITO, :CREDITO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            END /* SUMA EN CARTERA */
        if (BASE = 'D') then
            BEGIN
            execute procedure lee_configuracion('CXPAGAR','SALDOS','DESCONTAR RETENCIONES POR CAUSACION') returning_values (RET);
            CTABASE = NULL;
            FOR SELECT EGDE_TIPODOC, EGDE_IDDOC, EGDE_PREFIJO, EGDE_NUMERO, EGDE_ABONO+EGDE_DTOF, EGDE_RTFTE+EGDE_RTIVA+EGDE_RTICA
                FROM EGRESOS_DETALLE WHERE EGRE_ID = :IDDOC INTO :tipoit, :IDIT, :PREFIT, :NUMIT, :suma, :RTIT
                DO
                BEGIN
                if (TIPOIT <> 55) then
                    SELECT FIRST 1 CUEN_COD, PROY_COD, CENT_COD FROM COMPROBANTE_ENCABEZADO E, COMPROBANTE_DETALLE D
                        WHERE E.enco_consec = D.enco_consec AND E.enco_tiporef = :TIPOIT AND E.enco_idref = :IDIT AND
                        ((SUBSTR(CUEN_COD,1,1) = '2') or (SUBSTR(CUEN_COD,1,2) = '13'))  AND SUBSTR(CUEN_COD,1,3) <> '236' AND SUBSTR(CUEN_COD,1,4) <> '2408'
                        INTO :ctabase, :proy, :centro;
                else
                    /* tome la base de la configuración y el c.costo del prefijo del recibo */
                    execute procedure lee_configuracion('CAJA', 'EGRESOS', 'CUENTA CONTABLE PARA LOS ANTICIPOS A ACREEDORES SI LA INTERFAZ ES POR DOCUMENTO') returning_values (ctabase);
                if ((ctabase is null) or (ctabase = '')) then
                    CTABASE = TCTACLIEN;
                CUENTA = NULL;
                EXECUTE PROCEDURE VALIDE_CUENTA_C (ctabase) RETURNING_VALUES (:OK);
                IF (OK = 0) THEN
                    SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                        WHERE CUEN_COD = :CTABASE INTO :CUENTA, :TIPOCUEN;
                ELSE
                    begin
                    EXECUTE PROCEDURE ERROR (62, :IDDOC, :CTABASE, 2);
                    CUENTA = CTABASE;
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    end
                if (RET = 'NO') then
                    SUMA = SUMA + RTIT;
                if (SUMA < 0) then
                    BEGIN
                    CREDITO = SUMA * -1;
                    DEBITO = 0;
                    END
                ELSE
                    BEGIN
                    CREDITO = 0;
                    DEBITO = SUMA;
                    END
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    /* DEBERIA RECORRER DOCUMENTO POR DOCUMENTO */
                    NUMEROIT = PREFIT || NUMIT;
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :debito, :credito, 0, 0, :NIT, :PROY, :CENTRO, NULL, :NUMEROIT, NULL, NULL, :TIPOIT, 0);
                    END
                if (TIPOCUEN = 'N') then
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :DEBITO, :CREDITO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                END /* SUMA EN CARTERA */
            END
        END
    /* recorra las cuentas adicionales */
    FOR SELECT INJC_CUENTA, INJC_BASE, INJC_PORC, INJC_VALOR, INJC_DB
        FROM INTERFAZ_CAJA_CTAS
        WHERE INCJ_ID = :IDINTER
        INTO :CTADIC, :BASEADIC, :PORCADIC, :VALORADIC, :DBADIC
        DO
        BEGIN
        if (:BASEADIC = 'TOTAL') then
            VALORADIC = VRTOTAL;
        if (:BASEADIC = 'DESCUENTO') then
            VALORADIC = VRDTO;
        if (:BASEADIC = 'RTFTE') then
            VALORADIC = VRRTFTE;
        if (:BASEADIC = 'RTIVA') then
            VALORADIC = VRRTIVA;
        if (:BASEADIC = 'RTICA') then
            VALORADIC = VRRTICA;
        MONTO = VALORADIC * PORCADIC;
        CUENTA = NULL;
        EXECUTE PROCEDURE VALIDE_CUENTA_C (CTADIC) RETURNING_VALUES (:OK);
        IF (OK = 0) THEN
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTADIC INTO :CUENTA, :TIPOCUEN;
        ELSE
            begin
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :CTADIC, 2);
            CUENTA = CTADIC;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 4);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            if (DBADIC = 'S') then
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTADIC, :CONC, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            ELSE
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTADIC, :CONC, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            END
        NROI = NROI + 1;
        END
    if (ERROR > 0) then
        VER = 'S';
    SUSPEND;
    END /* EXISTE LA INTERFAZ */
  ELSE
    BEGIN
    EXECUTE PROCEDURE ERROR (62, :IDDOC, :PREF, 1);
    ERROR = ERROR + 1;
    VER = 'S';
    SUSPEND;
    END
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE EGRESOS_SIN_CONTABILIDAD(
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    ID INTEGER,
    IDI INTEGER,
    IDC INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    ESTADO VARCHAR(20),
    ERROR INTEGER)
AS
 /*$$IBE$$ DECLARE VARIABLE VER CHAR(2);
declare variable FECICNT VARCHAR(10);
declare variable FECFCNT VARCHAR(10);
declare variable idref INTEGER; $$IBE$$*/ 
BEGIN /*$$IBE$$ 
EXECUTE PROCEDURE fecha_a_conta(FECINI) returning_values (FECICNT);
EXECUTE PROCEDURE fecha_a_conta(FECFIN) returning_values (FECFCNT);
FOR SELECT EGRE_ID, PREF_PRE, egre_numero FROM EGRESOS WHERE EGRE_ANULADO = 'N' AND PREF_PRE <> 'R004' AND
    EGRE_FECHA >= :FECINI AND EGRE_FECHA <= :FECFIN ORDER BY EGRE_ID INTO :ID, :PREF, :NUMERO
DO
  BEGIN
  idref = null;
  SELECT ENCO_IDREF FROM COMPROBANTE_ENCABEZADO WHERE ENCO_TIPOREF = 62 AND ENCO_FECHA >= :FECICNT AND ENCO_FECHA <= :FECFCNT and ENCO_IDREF = :ID into :idref;
  if (idref IS NULL) then
  begin
   ESTADO = 'PROCESANDO';
   SUSPEND;
   SELECT MAX(INCJ_ID) FROM INTERFAZ_CAJA WHERE PREF_PRE = :PREF AND TIDO_COD = 62 INTO :IDI;
   EXECUTE PROCEDURE CONTABIL_EGRESO (:ID, :IDI) RETURNING_VALUES (:ERROR, :VER, :IDC);
   IF (ERROR = 0) THEN
      BEGIN
      EXECUTE PROCEDURE CONTABILIZA_PENDIENTE (:IDC);
      ESTADO = 'OK';
      END
   ELSE
    ESTADO = 'ERROR';
   suspend;
  end
  END
 $$IBE$$*/ SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE EGRESOS_SIN_CONTABILIDAD(
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    ID INTEGER,
    IDI INTEGER,
    IDC INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    ESTADO VARCHAR(20),
    ERROR INTEGER)
AS
DECLARE VARIABLE VER CHAR(2);
declare variable FECICNT VARCHAR(10);
declare variable FECFCNT VARCHAR(10);
declare variable idref INTEGER;
BEGIN
EXECUTE PROCEDURE fecha_a_conta(FECINI) returning_values (FECICNT);
EXECUTE PROCEDURE fecha_a_conta(FECFIN) returning_values (FECFCNT);
FOR SELECT EGRE_ID, PREF_PRE, egre_numero FROM EGRESOS WHERE EGRE_ANULADO = 'N' AND PREF_PRE <> 'R004' AND
    EGRE_FECHA >= :FECINI AND EGRE_FECHA <= :FECFIN ORDER BY EGRE_ID INTO :ID, :PREF, :NUMERO
DO
  BEGIN
  idref = null;
  SELECT ENCO_IDREF FROM COMPROBANTE_ENCABEZADO WHERE ENCO_TIPOREF = 62 AND ENCO_FECHA >= :FECICNT AND ENCO_FECHA <= :FECFCNT and ENCO_IDREF = :ID into :idref;
  if (idref IS NULL) then
  begin
   ESTADO = 'PROCESANDO';
   SUSPEND;
   SELECT MAX(INCJ_ID) FROM INTERFAZ_CAJA WHERE PREF_PRE = :PREF AND TIDO_COD = 62 INTO :IDI;
   EXECUTE PROCEDURE CONTABIL_EGRESO (:ID, :IDI) RETURNING_VALUES (:ERROR, :VER, :IDC);
   IF (ERROR = 0) THEN
      BEGIN
      EXECUTE PROCEDURE CONTABILIZA_PENDIENTE (:IDC);
      ESTADO = 'OK';
      END
   ELSE
    ESTADO = 'ERROR';
   suspend;
  end
  END
END

^

SET TERM ; ^


/* 20090714b *//* NO INCLUIA LAS DEVOLUCIONES DE ARTICULOS SIN VENTAS */
SET TERM ^ ;

CREATE OR ALTER PROCEDURE VENTAS_ARTICULO_MES(
    FECINI DATE,
    FECFIN DATE,
    SUBEMPRESA INTEGER)
RETURNS (
    ARTICULO VARCHAR(15),
    DESCRIPCION VARCHAR(60),
    CODGRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    CODSUBG VARCHAR(3),
    NOMSUBG VARCHAR(30),
    CODMARC VARCHAR(3),
    NOMMARC VARCHAR(30),
    UNIDAD VARCHAR(8),
    CANTVTAS NUMERIC(18,4),
    BASEVTAS NUMERIC(18,2),
    IVAVTAS NUMERIC(18,2),
    CANTDEV NUMERIC(18,4),
    BASEDEV NUMERIC(18,2),
    IVADEV NUMERIC(18,2))
AS
BEGIN
FOR SELECT MAX(ARTI_COD), SUM(FADE_CANT * FADE_FACTOR), SUM((cast(FADE_TOTAL as double precision)-FADE_IVAMONTO-FADE_CONSUMO)*FACT_FACTOR),
    SUM(FADE_IVAMONTO*FACT_FACTOR)
    FROM FACTURAS_DETALLE D, FACTURAS F, PREFIJOS P
    WHERE F.FACT_ID = D.FACT_ID AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND FACT_ANULADO = 'N'
       AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) and substring(D.arti_cod from 1 FOR 2) <> '.t'
    GROUP BY ARTI_COD
    INTO :ARTICULO, :CANTVTAS, :BASEVTAS, :IVAVTAS
    DO
    BEGIN
    SELECT ARTI_DES, ARTI_UNIDAD, A.GRUP_COD, A.SUBG_COD, A.MARC_COD, GRUP_NOM 
        FROM ARTICULO A, GRUPO G WHERE A.ARTI_COD = :articulo AND A.GRUP_COD = G.grup_cod
        INTO :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :NOMGRUPO;
    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
    SELECT SUM(DVDE_CANT * DVDE_FACTOR), SUM((cast(DVDE_TOTAL as double precision)-DVDE_IVAMONTO-DVDE_CONSUMO)*DEVT_FACTOR),
        SUM(DVDE_IVAMONTO*DEVT_FACTOR)
        FROM DEVOLUCIONES_VENTAS F, devoluciones_ventas_DETALLE D, PREFIJOS P
        WHERE F.DEVT_ID = D.DEVT_ID AND ARTI_COD = :ARTICULO AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND DEVT_ANULADO = 'N' AND ((devt_remid is null) or (DEVT_REMID = 0))
        AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 33 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
        INTO :CANTDEV, :BASEDEV, :IVADEV;
    if (cantvtas IS NULL) then
        cantvtas = 0;
    if (cantdev IS NULL) then
        cantdev = 0;
    if (ivavtas IS NULL) then
        ivavtas = 0;
    if (IVADEV IS NULL) then
        IVADEV = 0;
    if (basevtas IS NULL) then
        basevtas = 0;
    if (basedev IS NULL) then
        basedev = 0;
    if ((CANTVTAS <> 0) or (CANTDEV <> 0)) then
        SUSPEND;
    END
FOR SELECT MAX(ARTI_COD), SUM(DVDE_CANT * DVDE_FACTOR), SUM((cast(DVDE_TOTAL as double precision)-DVDE_IVAMONTO-DVDE_CONSUMO)*DEVT_FACTOR),
    SUM(DVDE_IVAMONTO*DEVT_FACTOR)
    FROM DEVOLUCIONES_VENTAS F, devoluciones_ventas_DETALLE D, PREFIJOS P
    WHERE F.DEVT_ID = D.DEVT_ID AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND DEVT_ANULADO = 'N' AND ((devt_remid is null) or (DEVT_REMID = 0))
    AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 33 AND ((P.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
    AND NOT EXISTS (SELECT FD.FACT_ID FROM FACTURAS_DETALLE FD, FACTURAS FF, PREFIJOS PF
    WHERE FF.FACT_ID = FD.FACT_ID AND FF.FACT_FECHA >= :FECINI AND FF.FACT_FECHA <= :FECFIN AND FF.FACT_ANULADO = 'N' AND FD.arti_cod = D.arti_cod
       AND PF.PREF_PRE = FF.PREF_PRE AND PF.TIDO_COD = 31 AND ((PF.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) and substring(FD.arti_cod from 1 FOR 2) <> '.t')
    GROUP BY ARTI_COD
    INTO :ARTICULO, :CANTDEV, :BASEDEV, :IVADEV
    DO
    BEGIN
    cantvtas = 0;
    if (cantdev IS NULL) then
        cantdev = 0;
    ivavtas = 0;
    if (IVADEV IS NULL) then
        IVADEV = 0;
    basevtas = 0;
    if (basedev IS NULL) then
        basedev = 0;
    if (CANTDEV <> 0) then
        BEGIN
        SELECT ARTI_DES, ARTI_UNIDAD, A.GRUP_COD, A.SUBG_COD, A.MARC_COD, GRUP_NOM 
            FROM ARTICULO A, GRUPO G WHERE A.ARTI_COD = :articulo AND A.GRUP_COD = G.grup_cod
            INTO :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :NOMGRUPO;
        SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
        SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
        SUSPEND;
        END
    END
END
^

SET TERM ; ^

/* 20090717 *//* PUNTOS POR CLIENTE CPN POR VCADA $100,000 */
SET TERM ^ ;

CREATE OR ALTER TRIGGER RECIBOS_CAJA_DETALLE_AI FOR RECIBOS_CAJA_DETALLE
ACTIVE AFTER INSERT POSITION 0
AS
declare variable EXISTE CHAR(1);
declare variable FEC DATE;
declare variable NIT VARCHAR(20);
declare variable CONCEPTO VARCHAR(60);
declare variable PREFIJO VARCHAR(4);
declare variable NUMERO VARCHAR(6);
declare variable SALDO NUMERIC(18,2);
declare variable RETES CHAR(2);
declare variable OK CHAR(1);
declare variable RCANTI INTEGER;
declare variable COBR INTEGER;
declare variable ACUMULA CHAR(8);
declare variable DIASMAX INTEGER;
declare variable FACTOR NUMERIC(9,4);
declare variable FACTORD NUMERIC(9,4);
declare variable DIAS INTEGER;
declare variable FECDOC DATE;
declare variable FECMIN DATE;
declare variable FECMINS VARCHAR(10);
declare variable TRM NUMERIC(18,2);
BEGIN
if ((NEW.RECA_ID <> 0) and (new.rcde_anulado = 'N')) then
    BEGIN
    /* Abone el documento referenciado */
    select PREF_PRE, RECA_NUMERO, RECA_fecha, RECA_CONC, TERC_NIT, COBR_COD, RECA_TRM from RECIBOS_CAJA
        where RECA_id = new.RECA_id into :PREFIJO, :NUMERO, :FEC, :CONCEPTO, :NIT, :COBR, :TRM;
    OK = 'N';
    if (new.RCDE_TIPODOC = 45) then
        BEGIN
        /* BUSQUE SI TIENE RECA_ID, SI NO LO ACTUALIZA */
        SELECT RECA_ID FROM ANTICIPOS_CLIENTE WHERE ANCL_ID = NEW.RCDE_IDDOC INTO :RCANTI;
        if (RCANTI = 0) then
            BEGIN
            OK = 'S';
            UPDATE ANTICIPOS_CLIENTE SET RECA_ID = NEW.RECA_ID WHERE ANCL_ID = NEW.RCDE_IDDOC;
            END
        END
    if (OK = 'N') then
        BEGIN
        /* valide que no se pase del saldo */
        execute procedure saldo_doc_cartera(new.rcde_tipodoc, new.rcde_iddoc, '9999/12/31', 0) returning_values(saldo);
        execute procedure lee_configuracion('CARTERA', 'SALDOS', 'DESCONTAR RETENCIONES POR CAUSACION') returning_values (RETES);
        if (SALDO < 0) then
            BEGIN
            if (RETES = 'SI') then
                begin
                if (saldo > (NEW.rcde_abono + NEW.rcde_dtof)) then
                    EXCEPTION DOCUMENTO_ABONO_MAYOR 'EL SALDO DEL DOCUMENTO ' || NEW.rcde_prefijo || NEW.rcde_numero || ' ES INSUFICIENTE.';
                end
            ELSE
                begin
                if (saldo > (NEW.rcde_abono + NEW.rcde_rtfte + NEW.rcde_rtiva + NEW.rcde_rtica + NEW.rcde_dtof)) then
                    EXCEPTION DOCUMENTO_ABONO_MAYOR 'EL SALDO DEL DOCUMENTO ' || NEW.rcde_prefijo || NEW.rcde_numero || ' ES INSUFICIENTE.';
                end
            END
        else
            BEGIN
            if (RETES = 'SI') then
                begin
                if (saldo < (NEW.rcde_abono + NEW.rcde_dtof)) then
                    EXCEPTION DOCUMENTO_ABONO_MAYOR 'EL SALDO DEL DOCUMENTO ' || NEW.rcde_prefijo || NEW.rcde_numero || ' ES INSUFICIENTE.';
                end
            ELSE
                begin
                if (saldo < (NEW.rcde_abono + NEW.rcde_rtfte + NEW.rcde_rtiva + NEW.rcde_rtica + NEW.rcde_dtof)) then
                    EXCEPTION DOCUMENTO_ABONO_MAYOR 'EL SALDO DEL DOCUMENTO ' || NEW.rcde_prefijo || NEW.rcde_numero || ' ES INSUFICIENTE.';
                end
            END
        EXISTE = 'N';
        select 'S' from saldos_doc_cartera where sdca_tiporef = new.rcde_tipodoc and sdca_idref = new.rcde_iddoc and sdca_fecha = :FEC into :EXISTE;
        if (Existe = 'S') then
            begin
            /* actualice el saldo del dia */
            UPDATE saldos_doc_cartera
                SET SDCA_ABONO = SDCA_ABONO + NEW.rcde_abono + new.rcde_dtof,
                SDCA_ABRTFTE = SDCA_ABRTFTE + NEW.rcde_RTFTE,
                SDCA_ABRTIVA = SDCA_ABRTIVA + NEW.rcde_RTIVA,
                SDCA_ABRTICA = SDCA_ABRTICA + NEW.rcde_RTICA,
                SDCA_TRM = :TRM
                WHERE SDCA_TIPOREF = NEW.RCDE_TIPODOC AND SDCA_IDREF = NEW.rcde_IDDOC AND SDCA_FECHA = :FEC;
            END
        ELSE
            BEGIN
            /* Inserte un nuevo saldo diario */
            INSERT INTO SALDOS_DOC_CARTERA (SDCA_TIPOREF, SDCA_IDREF, SDCA_FECHA, TERC_NIT, SDCA_RTFTE, SDCA_RTIVA, SDCA_RTICA, SDCA_ABONO, SDCA_ABRTFTE, SDCA_ABRTIVA, SDCA_ABRTICA, SDCA_DEBITO, SDCA_MONTO, SDCA_TRM)
                VALUES (NEW.RCDE_TIPODOC, NEW.RCDE_IDDOC, :FEC, :NIT, 0, 0, 0, (NEW.rcde_abono+NEW.rcde_dtof), NEW.rcde_rtfte, NEW.rcde_rtiva, NEW.rcde_rtica, 'N', 0, :TRM);
            END
        END
    /* actualice el registro en mov_cliente (por si son varios items) */
    EXISTE = 'N';
    SELECT 'S' FROM MOVIMIENTO_CLIENTES WHERE MVCL_TIPOREF = 61 AND MVCL_IDREF = NEW.RECA_ID AND MVCL_SUCURSAL = NEW.rcde_sucursal INTO :EXISTE;
    if (EXISTE = 'S') then
        begin
        UPDATE movimiento_clientes
            SET MVCL_MONTO = MVCL_MONTO + NEW.rcde_abono + NEW.rcde_dtof,
                MVCL_RTEFTE = MVCL_RTEFTE + NEW.rcde_rtfte,
                MVCL_RTEIVA = MVCL_RTEIVA + NEW.rcde_rtiva,
                MVCL_RTEICA = MVCL_RTEICA + NEW.rcde_rtica,
                MVCL_TRM = :TRM
            WHERE MVCL_TIPOREF = 61 AND MVCL_IDREF = NEW.RECA_ID AND MVCL_SUCURSAL = NEW.rcde_sucursal;
        end
    ELSE
        INSERT INTO MOVIMIENTO_CLIENTES (MVCL_ID, TERC_NIT, MVCL_TIPOREF, MVCL_IDREF, MVCL_FECHA, MVCL_VENCE, MVCL_CONC, MVCL_MONTO, MVCL_RTEFTE, MVCL_RTEIVA, MVCL_RTEICA, MVCL_DEBITO, MVCL_ABONO, MVCL_PREFREF, MVCL_NUMREF, MVCL_SUCURSAL, COBR_COD, MVCL_TRM)
            VALUES (GEN_ID(ID_MOVCLI, 1), :NIT, 61, NEW.RECA_ID, :FEC, :FEC, :CONCEPTO, (NEW.RCDE_ABONO+NEW.RCDE_DTOF), NEW.RCDE_RTFTE, NEW.RCDE_RTIVA, NEW.RCDE_RTICA, 'N', 'S', :PREFIJO, :NUMERO, NEW.rcde_sucursal, :COBR, :TRM);

    /* acumule los puntos del vendedor */
    SELECT MVCL_FECHA FROM MOVIMIENTO_CLIENTES WHERE MVCL_TIPOREF = new.rcde_tipodoc AND MVCL_IDREF = new.rcde_iddoc
        INTO :FECDOC;
    if (FECDOC IS NOT NULL) then
        DIAS = FEC - FECDOC;
    else
        DIAS = 999;
    execute procedure lee_configuracion('FACTURACION', 'FACTURAS', 'ACUMULAR PUNTOS DE VENTAS POR VENDEDOR') returning_values (ACUMULA);
    execute procedure lee_configuracion('FACTURACION', 'FACTURAS', 'DIAS DE RECAUDO MAXIMO PARA ACUMULAR PUNTOS AL VENDEDOR') returning_values (DIASMAX);
    if ((acumula = 'SI') and (diasmax >= dias)) then
        begin
        SELECT COPU_FACTOR FROM comisiones_puntos WHERE COPU_COD = NEW.rcde_comip INTO :FACTOR;
        if ((NEW.rcde_tipodoc = 31) or (NEW.rcde_tipodoc = 41)) then
            begin
            /* recorra la factura acumulando los puntos */
            if (new.rcde_tipodoc = 31) then
                select (fact_total-fact_ivamonto)/fact_total from facturas where fact_id = new.rcde_iddoc into :factord;
            if (new.rcde_tipodoc = 41) then
                select ndcl_monto/(ndcl_monto+ndcl_ivamonto) from notas_debito_clientes where ndcl_id = new.rcde_iddoc into :factord;
            /* inserte el registro de puntos */
            insert into puntos_vendedor (vend_cod, ptvt_fecha, ptvt_tipodoc, ptvt_iddoc, ptvt_db, ptvt_cr)
                values (:cobr, :fec, new.rcde_tipodoc, new.rcde_iddoc, (new.rcde_abono*:factord*:factor), 0);
            end
        if ((new.rcde_tipodoc = 33) or (new.rcde_tipodoc = 42)) then
            begin
            if (new.rcde_tipodoc = 33) then
                select (devt_total-devt_ivamonto)/devt_total from devoluciones_ventas where devt_id = new.rcde_iddoc into :factord;
            if (new.rcde_tipodoc = 42) then
                select nccl_monto/(nccl_monto+nccl_ivamonto) from notas_credito_clientes where nccl_id = new.rcde_iddoc into :factord;
            /* inserte el registro de puntos */
            insert into puntos_vendedor (vend_cod, ptvt_fecha, ptvt_tipodoc, ptvt_iddoc, ptvt_db, ptvt_cr)
                values (:cobr, :fec, new.rcde_tipodoc, new.rcde_iddoc, 0, (new.rcde_abono*:factord*:factor));
            end

        execute procedure lee_configuracion('FACTURACION', 'FACTURAS', 'ACUMULAR PUNTOS POR VENTAS A CLIENTE REGULARES') returning_values (ACUMULA);
        execute procedure lee_configuracion('FACTURACION', 'FACTURAS', 'FECHA A PARTIR DE LA CUAL ACUMULAR PUNTOS A CLIENTES POR RECAUDO') returning_values (FECMINS);
        if (FECMINS <> '') then
            FECMIN = CAST(FECMINS AS DATE);
        else
            FECMIN = '2009/01/01';
        if ((acumula = 'RECAUDO') and (:fecdoc >= :fecmin)) then
            BEGIN
            SELECT COPU_FACTORCL FROM comisiones_puntos WHERE COPU_COD = NEW.rcde_comip INTO :FACTOR;
            if ((NEW.rcde_tipodoc = 31) or (NEW.rcde_tipodoc = 41)) then
                begin
                /* recorra la factura acumulando los puntos */
                if (new.rcde_tipodoc = 31) then
                    select (fact_total-fact_ivamonto)/fact_total from facturas where fact_id = new.rcde_iddoc into :factord;
                if (new.rcde_tipodoc = 41) then
                    select ndcl_monto/(ndcl_monto+ndcl_ivamonto) from notas_debito_clientes where ndcl_id = new.rcde_iddoc into :factord;
                /* inserte el registro de puntos */
                insert into puntos_cliente (ptcl_nit, ptcl_fecha, ptcl_tipodoc, ptcl_iddoc, ptcl_db, ptcl_cr)
                    values (:nit, :fec, new.rcde_tipodoc, new.rcde_iddoc, (new.rcde_abono*:factord*:factor/1000), 0);
                end
            if ((new.rcde_tipodoc = 33) or (new.rcde_tipodoc = 42)) then
                begin
                if (new.rcde_tipodoc = 33) then
                    select (devt_total-devt_ivamonto)/devt_total from devoluciones_ventas where devt_id = new.rcde_iddoc into :factord;
                if (new.rcde_tipodoc = 42) then
                    select nccl_monto/(nccl_monto+nccl_ivamonto) from notas_credito_clientes where nccl_id = new.rcde_iddoc into :factord;
                /* inserte el registro de puntos */
                insert into puntos_cliente (ptcl_nit, ptcl_fecha, ptcl_tipodoc, ptcl_iddoc, ptcl_db, ptcl_cr)
                    values (:nit, :fec, new.rcde_tipodoc, new.rcde_iddoc, 0, (new.rcde_abono*:factord*:factor/1000));
                end
            END
        end
    end
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER RECIBOS_CAJA_DETALLE_AU FOR RECIBOS_CAJA_DETALLE
ACTIVE AFTER UPDATE POSITION 0
AS
declare variable EXISTE CHAR(1);
declare variable FEC DATE;
declare variable NIT VARCHAR(20);
declare variable CONCEPTO VARCHAR(60);
declare variable PREFIJO VARCHAR(4);
declare variable NUMERO VARCHAR(6);
declare variable SALDO NUMERIC(18,2);
declare variable RETES char(2);
declare variable OK CHAR(1);
declare variable RCANTI INTEGER;
declare variable COBR INTEGER;
declare variable ACUMULA CHAR(8);
declare variable DIASMAX INTEGER;
declare variable FACTOR NUMERIC(9,4);
declare variable FACTORD NUMERIC(9,4);
declare variable DIAS INTEGER;
declare variable FECDOC DATE;
declare variable FECMIN DATE;
declare variable FECMINS VARCHAR(10);
declare variable TRM NUMERIC(18,2);
BEGIN
execute procedure lee_configuracion('FACTURACION', 'FACTURAS', 'ACUMULAR PUNTOS DE VENTAS POR VENDEDOR') returning_values (ACUMULA);
select PREF_PRE, RECA_NUMERO, reca_fecha, RECA_CONC, TERC_NIT, COBR_COD, RECA_TRM
    from recibos_caja where reca_id = new.reca_id
    into :PREFIJO, :NUMERO, :FEC, :CONCEPTO, :NIT, :COBR, :TRM;
/* Borre el viejo */
if ((old.RECA_ID <> 0) AND (OLD.rcde_anulado = 'N')) then
    BEGIN
    OK = 'N';
    if (OLD.RCDE_TIPODOC = 45) then
        BEGIN
        SELECT RECA_ID FROM ANTICIPOS_CLIENTE WHERE ANCL_ID = OLD.RCDE_IDDOC INTO :RCANTI;
        if (RCANTI = OLD.RECA_ID) then
            begin
            OK = 'S';
            if (NEW.rcde_anulado = 'N') then
                delete from anticipos_cliente where ANCL_ID = OLD.RCDE_IDDOC;
            else
                UPDATE anticipos_cliente SET ANCL_ANULADO = 'S' where ANCL_ID = OLD.RCDE_IDDOC;
            end
        END
    if (OK = 'N') then
        BEGIN
        UPDATE saldos_doc_cartera
            SET SDCA_ABONO = SDCA_ABONO - old.rcde_abono - OLD.RCDE_DTOF,
            SDCA_ABRTFTE = SDCA_ABRTFTE - old.rcde_RTFTE,
            SDCA_ABRTIVA = SDCA_ABRTIVA - old.rcde_RTIVA,
            SDCA_ABRTICA = SDCA_ABRTICA - old.rcde_RTICA
            WHERE SDCA_TIPOREF = old.RCDE_TIPODOC AND SDCA_IDREF = old.rcde_IDDOC AND SDCA_FECHA = :FEC;
        END
    UPDATE movimiento_clientes
        SET MVCL_MONTO = MVCL_MONTO - OLD.rcde_abono - OLD.RCDE_DTOF,
        MVCL_RTEFTE = MVCL_RTEFTE - OLD.rcde_rtfte,
        MVCL_RTEIVA = MVCL_RTEIVA - OLD.rcde_rtiva,
        MVCL_RTEICA = MVCL_RTEICA - OLD.rcde_rtica
        WHERE MVCL_TIPOREF = 61 AND MVCL_IDREF = OLD.RECA_ID;

    /* DESHAGA LOS PUNTOS DEL VENDEDOR */
    if (acumula = 'SI') then
        delete from puntos_vendedor where vend_cod = :cobr and ptvt_tipodoc = old.rcde_tipodoc and ptvt_iddoc = old.rcde_iddoc and ptvt_fecha = :fec;
    execute procedure lee_configuracion('FACTURACION', 'FACTURAS', 'ACUMULAR PUNTOS POR VENTAS A CLIENTE REGULARES') returning_values (ACUMULA);
    if (acumula = 'RECAUDO') then
        delete from puntos_cliente where PTCL_NIT = :nit and ptcl_tipodoc = old.rcde_tipodoc and ptcl_iddoc = old.rcde_iddoc and ptcl_fecha = :fec;
    END
if ((NEW.RECA_ID <> 0) and (NEW.rcde_anulado = 'N')) then
    BEGIN
    OK = 'N';
    if (new.RCDE_TIPODOC = 45) then
        BEGIN
        /* BUSQUE SI TIENE RECA_ID, SI NO LO ACTUALIZA */
        SELECT RECA_ID FROM ANTICIPOS_CLIENTE WHERE ANCL_ID = NEW.RCDE_IDDOC INTO :RCANTI;
        if (RCANTI = 0) then
            BEGIN
            OK = 'S';
            UPDATE ANTICIPOS_CLIENTE SET RECA_ID = NEW.RECA_ID WHERE ANCL_ID = NEW.RCDE_IDDOC;
            END
        END
    if (OK = 'N') then
        BEGIN
        /* valide que no se pase del saldo */
        execute procedure saldo_doc_cartera(new.rcde_tipodoc, new.rcde_iddoc, '9999/12/31', 0) returning_values(saldo);
        execute procedure lee_configuracion('CARTERA', 'SALDOS', 'DESCONTAR RETENCIONES POR CAUSACION') returning_values (RETES);
        if (SALDO < 0) then
            BEGIN
            if (RETES = 'SI') then
                begin
                if (saldo > (NEW.rcde_abono + NEW.rcde_dtof)) then
                    EXCEPTION DOCUMENTO_ABONO_MAYOR 'EL SALDO DEL DOCUMENTO ' || NEW.rcde_prefijo || NEW.rcde_numero || ' ES INSUFICIENTE.';
                end
            ELSE
                begin
                if (saldo > (NEW.rcde_abono + NEW.rcde_rtfte + NEW.rcde_rtiva + NEW.rcde_rtica + NEW.rcde_dtof)) then
                    EXCEPTION DOCUMENTO_ABONO_MAYOR 'EL SALDO DEL DOCUMENTO ' || NEW.rcde_prefijo || NEW.rcde_numero || ' ES INSUFICIENTE.';
                end
            END
        else
            BEGIN
            if (RETES = 'SI') then
                begin
                if (saldo < (NEW.rcde_abono + NEW.rcde_dtof)) then
                    EXCEPTION DOCUMENTO_ABONO_MAYOR 'EL SALDO DEL DOCUMENTO ' || NEW.rcde_prefijo || NEW.rcde_numero || ' ES INSUFICIENTE.';
                end
            ELSE
                begin
                if (saldo < (NEW.rcde_abono + NEW.rcde_rtfte + NEW.rcde_rtiva + NEW.rcde_rtica + NEW.rcde_dtof)) then
                    EXCEPTION DOCUMENTO_ABONO_MAYOR 'EL SALDO DEL DOCUMENTO ' || NEW.rcde_prefijo || NEW.rcde_numero || ' ES INSUFICIENTE.';
                end
            END
        select 'S' from saldos_doc_cartera where sdca_tiporef = new.rcde_tipodoc and sdca_idref = new.rcde_iddoc and sdca_fecha = :FEC into :EXISTE;
        if (Existe = 'S') then
            /* actualice el saldo del dia */
            UPDATE saldos_doc_cartera
                SET SDCA_ABONO = SDCA_ABONO + NEW.rcde_abono + NEW.RCDE_DTOF,
                    SDCA_ABRTFTE = SDCA_ABRTFTE + NEW.rcde_RTFTE,
                    SDCA_ABRTIVA = SDCA_ABRTIVA + NEW.rcde_RTIVA,
                    SDCA_ABRTICA = SDCA_ABRTICA + NEW.rcde_RTICA,
                    SDCA_TRM = :TRM
                WHERE SDCA_TIPOREF = NEW.RCDE_TIPODOC AND SDCA_IDREF = NEW.rcde_IDDOC AND SDCA_FECHA = :FEC;
        ELSE
            /* Inserte un nuevo saldo diario */
            INSERT INTO SALDOS_DOC_CARTERA (SDCA_TIPOREF, SDCA_IDREF, SDCA_FECHA, TERC_NIT, SDCA_RTFTE, SDCA_RTIVA, SDCA_RTICA, SDCA_ABONO, SDCA_ABRTFTE, SDCA_ABRTIVA, SDCA_ABRTICA, SDCA_DEBITO, SDCA_MONTO, SDCA_TRM)
                VALUES (NEW.RCDE_TIPODOC, NEW.RCDE_IDDOC, :FEC, :NIT, 0, 0, 0, (NEW.rcde_abono+NEW.RCDE_DTOF), NEW.rcde_rtfte, NEW.rcde_rtiva, NEW.rcde_rtica, 'N', 0, :TRM);
        END /* OK = N */
    /* Registre o actualice el registro en movimiento_cliente */
    EXISTE = 'N';
    SELECT 'S' FROM MOVIMIENTO_CLIENTES WHERE MVCL_TIPOREF = 61 AND MVCL_IDREF = NEW.RECA_ID and mvcl_sucursal = new.rcde_sucursal INTO :EXISTE;
    if (EXISTE = 'S') then
        begin
        /* Actualice el nuevo */
        UPDATE movimiento_clientes
            SET MVCL_MONTO = MVCL_MONTO + NEW.rcde_abono + NEW.rcde_dtof,
                MVCL_RTEFTE = MVCL_RTEFTE + NEW.rcde_rtfte,
                MVCL_RTEIVA = MVCL_RTEIVA + NEW.rcde_rtiva,
                MVCL_RTEICA = MVCL_RTEICA + NEW.rcde_rtica,
                MVCL_TRM = :TRM
            WHERE MVCL_TIPOREF = 61 AND MVCL_IDREF = NEW.RECA_ID AND MVCL_SUCURSAL = NEW.rcde_sucursal;
        end
    ELSE
        INSERT INTO MOVIMIENTO_CLIENTES (MVCL_ID, TERC_NIT, MVCL_TIPOREF, MVCL_IDREF, MVCL_FECHA, MVCL_VENCE, MVCL_CONC, MVCL_MONTO, MVCL_RTEFTE, MVCL_RTEIVA, MVCL_RTEICA, MVCL_DEBITO, MVCL_ABONO, MVCL_PREFREF, MVCL_NUMREF, MVCL_SUCURSAL, COBR_COD, MVCL_TRM)
            VALUES (GEN_ID(ID_MOVCLI, 1), :NIT, 61, NEW.RECA_ID, :FEC, :FEC, :CONCEPTO, (NEW.RCDE_ABONO+NEW.RCDE_DTOF), NEW.RCDE_RTFTE, NEW.RCDE_RTIVA, NEW.RCDE_RTICA, 'N', 'S', :PREFIJO, :NUMERO, NEW.rcde_sucursal, :COBR, :TRM);

    /* acumule los puntos del vendedor */
    SELECT MVCL_FECHA FROM MOVIMIENTO_CLIENTES WHERE MVCL_TIPOREF = new.rcde_tipodoc AND MVCL_IDREF = new.rcde_iddoc
        INTO :FECDOC;
    if (FECDOC IS NOT NULL) then
        DIAS = FEC - FECDOC;
    else
        DIAS = 999;
    execute procedure lee_configuracion('FACTURACION', 'FACTURAS', 'DIAS DE RECAUDO MAXIMO PARA ACUMULAR PUNTOS AL VENDEDOR') returning_values (DIASMAX);
    if ((acumula = 'SI') and (diasmax >= dias)) then
        begin
        SELECT COPU_FACTOR FROM comisiones_puntos WHERE COPU_COD = NEW.rcde_comip INTO :FACTOR;
        if ((NEW.rcde_tipodoc = 31) or (NEW.rcde_tipodoc = 41)) then
            begin
            /* recorra la factura acumulando los puntos */
            if (new.rcde_tipodoc = 31) then
                select (fact_total-fact_ivamonto)/fact_total from facturas where fact_id = new.rcde_iddoc into :factord;
            if (new.rcde_tipodoc = 41) then
                select ndcl_monto/(ndcl_monto+ndcl_ivamonto) from notas_debito_clientes where ndcl_id = new.rcde_iddoc into :factord;
            /* inserte el registro de puntos */
            insert into puntos_vendedor (vend_cod, ptvt_fecha, ptvt_tipodoc, ptvt_iddoc, ptvt_db, ptvt_cr)
                values (:cobr, :fec, new.rcde_tipodoc, new.rcde_iddoc, (new.rcde_abono*:factord*:factor), 0);
            end
        if ((new.rcde_tipodoc = 33) or (new.rcde_tipodoc = 42)) then
            begin
            if (new.rcde_tipodoc = 33) then
                select (devt_total-devt_ivamonto)/devt_total from devoluciones_ventas where devt_id = new.rcde_iddoc into :factord;
            if (new.rcde_tipodoc = 42) then
                select nccl_monto/(nccl_monto+nccl_ivamonto) from notas_credito_clientes where nccl_id = new.rcde_iddoc into :factord;
            /* inserte el registro de puntos */
            insert into puntos_vendedor (vend_cod, ptvt_fecha, ptvt_tipodoc, ptvt_iddoc, ptvt_db, ptvt_cr)
                values (:cobr, :fec, new.rcde_tipodoc, new.rcde_iddoc, 0, (new.rcde_abono*:factord*:factor));
            end

        execute procedure lee_configuracion('FACTURACION', 'FACTURAS', 'ACUMULAR PUNTOS POR VENTAS A CLIENTE REGULARES') returning_values (ACUMULA);
        execute procedure lee_configuracion('FACTURACION', 'FACTURAS', 'FECHA A PARTIR DE LA CUAL ACUMULAR PUNTOS A CLIENTES POR RECAUDO') returning_values (FECMINS);
        if (FECMINS <> '') then
            FECMIN = CAST(FECMINS AS DATE);
        else
            FECMIN = '2009/01/01';
        if ((acumula = 'RECAUDO') and (:fecdoc >= :fecmin)) then
            BEGIN
            SELECT COPU_FACTORCL FROM comisiones_puntos WHERE COPU_COD = NEW.rcde_comip INTO :FACTOR;
            if ((NEW.rcde_tipodoc = 31) or (NEW.rcde_tipodoc = 41)) then
                begin
                /* recorra la factura acumulando los puntos */
                if (new.rcde_tipodoc = 31) then
                    select (fact_total-fact_ivamonto)/fact_total from facturas where fact_id = new.rcde_iddoc into :factord;
                if (new.rcde_tipodoc = 41) then
                    select ndcl_monto/(ndcl_monto+ndcl_ivamonto) from notas_debito_clientes where ndcl_id = new.rcde_iddoc into :factord;
                /* inserte el registro de puntos */
                insert into puntos_cliente (ptcl_nit, ptcl_fecha, ptcl_tipodoc, ptcl_iddoc, ptcl_db, ptcl_cr)
                    values (:nit, :fec, new.rcde_tipodoc, new.rcde_iddoc, (new.rcde_abono*:factord*:factor/1000), 0);
                end
            if ((new.rcde_tipodoc = 33) or (new.rcde_tipodoc = 42)) then
                begin
                if (new.rcde_tipodoc = 33) then
                    select (devt_total-devt_ivamonto)/devt_total from devoluciones_ventas where devt_id = new.rcde_iddoc into :factord;
                if (new.rcde_tipodoc = 42) then
                    select nccl_monto/(nccl_monto+nccl_ivamonto) from notas_credito_clientes where nccl_id = new.rcde_iddoc into :factord;
                /* inserte el registro de puntos */
                insert into puntos_cliente (ptcl_nit, ptcl_fecha, ptcl_tipodoc, ptcl_iddoc, ptcl_db, ptcl_cr)
                    values (:nit, :fec, new.rcde_tipodoc, new.rcde_iddoc, 0, (new.rcde_abono*:factord*:factor/1000));
                end
            END
        end
    END /* NUEVO */
END
^

SET TERM ; ^



/* 20090717b *//* AGREGUE LA ZONA DE LA SUCURSAL SI ES VACIA */
SET TERM ^ ;

CREATE OR ALTER TRIGGER CLIENTES_BI FOR CLIENTES
ACTIVE BEFORE INSERT POSITION 0
as
begin
new.clie_fecha = cast('now' as DATE);
if (new.clie_diasbloq is null) then
    new.clie_diasbloq = 1;
if (NEW.zona_cod IS NULL) then
    SELECT FIRST 1 ZONA_COD FROM ZONAS Z, USUARIO U WHERE U.sucu_id = Z.sucu_id AND U.user_cod = USER INTO NEW.zona_cod;
end
^

SET TERM ; ^



/* 20090717c *//* acumulaba puntos redondeando por item en lugar de redondear el subtotal del documento */
SET TERM ^ ;

CREATE OR ALTER procedure ACUMULA_PUNTOS_CLIENTE (
    TIPO integer,
    IDDOC integer,
    CLIENTE varchar(20),
    FECHA date)
returns (
    PUNTOS integer)
AS
declare variable numrows integer;
declare variable fecaux date;
declare variable IDP INTEGER;
declare variable ok integer;
declare variable ACUMULA CHAR(10);
declare variable FACTOR INTEGER;
declare variable ARTICULO VARCHAR(15);
declare variable FACTORART INTEGER;
declare variable ptos FLOAT;
declare variable ptosacum FLOAT;
declare variable HORA TIME;
declare variable HORINI TIME;
declare variable HORFIN TIME;
begin
ok = 1;
execute procedure lee_configuracion('FACTURACION', 'FACTURAS', 'ACUMULAR PUNTOS POR VENTAS A CLIENTE REGULARES') returning_values (ACUMULA);
if (acumula = 'VENTA') then
    begin
    execute procedure lee_configuracion('FACTURACION', 'FACTURAS', 'FACTOR DE CONVERSION DE PUNTOS') returning_values (FACTOR);
    if (IDDOC <> 0) then
        begin
        if (tipo = 31) then
            begin
            select count(ptcl_id) from puntos_cliente where ptcl_nit = :cliente and ptcl_tipodoc = 31 and ptcl_iddoc = :iddoc into :numrows;
            if (numrows = 0) then
                begin
                ptosacum = 0;
                /* recorra la factura acumulando los puntos */
                for select arti_cod, floor((fade_total-fade_ivamonto-fade_consumo)/:factor) from facturas_detalle
                    where fact_id = :iddoc and substring(arti_cod from 1 FOR 2) <> '.t' into :articulo, :ptos
                    do
                    begin
                    factorart = 1;
                    select ptar_factor from puntos_articulos where PTAR_COD = :articulo into :factorart;
                    ptosacum = ptosacum + (ptos * factorart);
                    end
                /* SI ES UN DIA ESPECIAL APLIQUE EL FACTOR */
                SELECT FACT_FECHA FROM FACTURAS WHERE FACT_ID = :iddoc INTO :fecaux;
                FOR SELECT PTDE_ID FROM puntos_diasespecial WHERE PTDE_FECINI <= :fecaux AND PTDE_FECFIN >= :fecaux INTO :idp
                    DO
                    BEGIN
                    SELECT PTDE_HORINI, PTDE_HORFIN, PTDE_FACTOR FROM puntos_diasespecial
                        WHERE PTDE_ID = :IDP INTO :HORINI, :HORFIN, :factorart;
                    SELECT AUDI_HORA FROM AUDITORIA WHERE TIDO_COD = 31 AND AUDI_IDDOC = :iddoc INTO HORA;
                    if ((horini <= HORA) AND (horfin >= HORA)) then
                        ptosacum = ptosacum * factorart;
                    END
                /* inserte el registro de puntos */
                puntos = floor(ptosacum);
                insert into puntos_cliente (ptcl_nit, ptcl_fecha, ptcl_tipodoc, ptcl_iddoc, ptcl_db, ptcl_cr)
                    values (:cliente, :fecha,  31, :iddoc, :puntos, 0);
                end
            end
        if (tipo = 33) then
            begin
            select count(ptcl_id) from puntos_cliente where ptcl_nit = :cliente and ptcl_tipodoc = 33 and ptcl_iddoc = :iddoc into :numrows;
            if (numrows = 0) then
                begin
                ptosacum = 0;
                /* recorra la DEVOLUCION acumulando los puntos */
                for select arti_cod, floor((dvde_total-dvde_ivamonto-dvde_consumo)/:factor) from devoluciones_ventas_detalle
                    where devt_id = :iddoc and substring(arti_cod from 1 FOR 2) <> '.t' into :articulo, :ptos
                    do
                    begin
                    factorart = 1;
                    select ptar_factor from puntos_articulos where PTAR_COD = :articulo into :factorart;
                    ptosacum = ptosacum + (ptos * factorart);
                    end
                /* SI ES UN DIA ESPECIAL APLIQUE EL FACTOR */
                SELECT DEVT_FECHA FROM devoluciones_ventas WHERE DEVT_ID = :iddoc INTO :fecaux;
                FOR SELECT PTDE_ID FROM puntos_diasespecial WHERE PTDE_FECINI <= :fecaux AND PTDE_FECFIN >= :fecaux INTO :idp
                    DO
                    BEGIN
                    SELECT PTDE_HORINI, PTDE_HORFIN, PTDE_FACTOR FROM puntos_diasespecial
                        WHERE PTDE_ID = :IDP INTO :HORINI, :HORFIN, :factorart;
                    SELECT AUDI_HORA FROM AUDITORIA WHERE TIDO_COD = 33 AND AUDI_IDDOC = :iddoc INTO HORA;
                    if ((horini <= HORA) AND (horfin >= HORA)) then
                        ptosacum = ptosacum * factorart;
                    END
                /* inserte el registro de puntos */
                puntos = floor(ptosacum);
                insert into puntos_cliente (ptcl_nit, ptcl_fecha, ptcl_tipodoc, ptcl_iddoc, ptcl_db, ptcl_cr)
                    values (:cliente, :fecha,  33, :iddoc, 0, :puntos);
                end
            end

        suspend;
        end
    end
end
^

SET TERM ; ^



/* 20090718 *//* quedaba null la sucursal del cliente en aplicaciones hechas desde dev o notacr */

SET TERM ^ ;

CREATE OR ALTER TRIGGER APLICACION_CLIENTE_BI FOR APLICACION_CLIENTE
ACTIVE BEFORE INSERT POSITION 0
AS
declare variable NUMERO VARCHAR(6);
declare variable AUTOM CHAR(1);
declare variable EXISTE CHAR(1);
BEGIN
if (NEW.numok = 'N') then
  BEGIN
  /* Actualice el contador del prefijo */
  SELECT PREF_ACTUAL, PREF_AUTO FROM PREFIJOS WHERE TIDO_COD = NEW.TIDO_COD AND PREF_PRE = NEW.PREF_PRE INTO :NUMERO, :AUTOM;
  /* ACTUALICE EL NUMERO EN COMPROBANTE_ENCABEZADO  */
  if (AUTOM = 'S') then
    BEGIN
    NEW.APCL_NUMERO = NUMERO;
    NUMERO = CAST((CAST(NUMERO AS INTEGER) + 1) AS CHAR(6));
    UPDATE PREFIJOS
      SET PREF_ACTUAL = :NUMERO
    WHERE TIDO_COD = NEW.TIDO_COD AND PREF_PRE = NEW.PREF_PRE;
    END
  ELSE
    BEGIN
    if (CAST(NUMERO AS INTEGER) = CAST(NEW.APCL_NUMERO AS INTEGER)) then
        UPDATE PREFIJOS
          SET PREF_ACTUAL = CAST((CAST(PREF_ACTUAL AS INTEGER) + 1) AS CHAR(6))
        WHERE TIDO_COD = NEW.TIDO_COD AND PREF_PRE = NEW.PREF_PRE;
    END
  EXECUTE PROCEDURE completa_ceros (NEW.APCL_numero) returning_values (New.apcl_numero);
  NEW.numok = 'S';
  END
/* Verifique que el numero no existe previamente */
EXISTE = 'N';
SELECT 'S' FROM APLICACION_CLIENTE WHERE PREF_PRE = NEW.PREF_PRE AND APCL_NUMERO = NEW.APCL_NUMERO INTO :EXISTE;
if (EXISTE = 'S') then
    EXCEPTION DOCUMENTO_REGISTRADO 'Ya existe una aplicación con el número ' || new.pref_pre || new.apcl_numero;

if (NEW.apcl_sucursal IS NULL) then
    new.apcl_sucursal = '01';
if ((NEW.apcl_trm IS NULL) or (new.apcl_trm = 0))  then
    NEW.apcl_trm = 1;
END
^

SET TERM ; ^

update aplicacion_cliente set apcl_sucursal = '01' where apcl_sucursal is null;
commit work;



/* 20090718b *//* en usuarios autoretenedores descontaba las retenciones en la consulta de mov. */
SET TERM ^ ;

CREATE OR ALTER procedure MOVIMIENTO_CARTERA_DESDE_HASTA (
    NIT varchar(20),
    DESDE date,
    HASTA date,
    EMPSUCURSAL integer,
    MONEDA integer)
returns (
    INICIAL numeric(18,2),
    TIPODOC varchar(8),
    IDDOC integer,
    PREFIJO varchar(4),
    NUMERO varchar(6),
    FECHA date,
    CONCEPTO varchar(60),
    DEBITO numeric(18,2),
    CREDITO numeric(18,2),
    SALDO numeric(18,2),
    NOMBRE varchar(60),
    RTFTE numeric(18,2),
    RTIVA numeric(18,2),
    RTICA numeric(18,2),
    SUCURSAL varchar(10),
    RECPROV_ID integer,
    RECIPROV char(1))
AS
declare variable DB CHAR(1);
declare variable AB CHAR(1);
declare variable RETES CHAR(2);
declare variable tipo integer;
declare variable TRM NUMERIC(18,2);
declare variable i integer;
declare variable AUTORET VARCHAR(10);
declare variable FAUTORET DATE;
BEGIN
  /* Ubique el NIT */
  select terc_nom from terceros where terc_nit = :NIT INTO :NOMBRE;
  DESDE = DESDE - 1;
  INICIAL = 0;
  i = 0;
  FOR SELECT MVCL_TIPOREF, MVCL_IDREF FROM MOVIMIENTO_CLIENTES
    WHERE TERC_NIT = :NIT AND MVCL_FECHA <= :DESDE AND MVCL_ABONO = 'N' AND
    ((:empsucursal = 0) or (SUCU_ID = :empsucursal)) AND ((:MONEDA = 0) or (MVCL_TRM <> 1))
    INTO :TIPODOC, :IDDOC
    DO
    BEGIN
    EXECUTE PROCEDURE saldo_doc_cartera(TIPODOC, IDDOC, DESDE, MONEDA) returning_values (SALDO);
    if (SALDO <> 0) then
        INICIAL = INICIAL + SALDO;
    END
  DESDE = DESDE + 1;
  SALDO = INICIAL;
  tipodoc = '';
  iddoc = 0;
  EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'DESCONTAR RETENCIONES POR CAUSACION') returning_values(:RETES);
  EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'FECHA AUTORETENEDOR NO DESCONTAR RETENCIONES DEL SALDO PERO SI CONTABILIZARLAS') returning_values (AUTORET);
  if (AUTORET <> '') then
    FAUTORET = CAST(AUTORET AS DATE);
  else
    FAUTORET = '9999/12/31';
  FOR select tido_nomcorto, MVCL_TIPOREF, mvcl_idref, mvcl_prefref, mvcl_numref, mvcl_fecha, mvcl_conc, mvcl_monto, mvcl_debito, mvcl_rtefte, mvcl_rteiva, mvcl_rteica, mvcl_abono, mvcl_sucursal, MVCL_TRM
    from movimiento_clientes m, tipo_documento t
    where m.mvcl_tiporef = t.tido_cod and terc_nit = :NIT and mvcl_fecha >= :DESDE and mvcl_fecha <= :HASTA and mvcl_tiporef <> 45 AND
    ((SUCU_ID = :EMPSUCURSAL) or (:EMPSUCURSAL = 0)) AND ((:MONEDA = 0) or (MVCL_TRM <> 1))
    order by mvcl_fecha, mvcl_tiporef
    into :TIPODOC,:tipo,  :IDDOC, :PREFIJO, :NUMERO, :FECHA, :CONCEPTO, :DEBITO, :DB, :RTFTE, :RTIVA, :RTICA, :AB, :SUCURSAL, :TRM
    DO
    BEGIN
    i = i + 1;
    if (FAUTORET <= FECHA) then
        RTFTE = 0;
    if (DB = 'N') then
        BEGIN
        if (AB = 'S') then
            if (RETES = 'SI') then
                CREDITO = DEBITO;
            ELSE
                CREDITO = DEBITO + RTFTE + RTIVA + RTICA;
        ELSE
            if (RETES = 'SI') then
                CREDITO = DEBITO - RTFTE - RTIVA - RTICA;
            ELSE
                CREDITO = DEBITO;
        DEBITO = 0;
        END
    ELSE
        BEGIN
        if (RETES = 'SI') then
            DEBITO = DEBITO - RTFTE - RTIVA - RTICA;
        CREDITO = 0;
        END
    if ((MONEDA <> 0) AND (TRM <> 0)) then
        BEGIN
        DEBITO = DEBITO / TRM;
        CREDITO = CREDITO / TRM;
        RTFTE = RTFTE / TRM;
        RTIVA = RTIVA / TRM;
        RTICA = RTICA / TRM;
        END
    SALDO = SALDO + DEBITO - CREDITO;
    /* IDENTIFICAR SI EL DOCUMENTO TIENE RECIBO PROVISIONAL*/
    recprov_id = 0;
    SELECT max(RCPR_ID) FROM recibo_provisional_detalle WHERE RPDE_IDDOC = :iddoc  AND RPDE_TIPODOC = :TIPO and RPDE_ANULADO = 'N' INTO :recprov_id;
    if (recprov_id is null) then
      BEGIN
       reciprov = 'N';
      end
    ELSE
      begin
       reciprov = 'S';
      END
    SUSPEND;
    END
if (i = 0) then
    SUSPEND;
END
^

SET TERM ; ^



/* 20090719 *//* CTA DE ANTICIPO POR GRUPO (CIUDADES EN TREFILADOS) */
ALTER TABLE GRUPOS_PROVEEDORES
ADD GRPR_CTAANTI T_CTA_CONTABLE;

SET TERM ^ ;

CREATE OR ALTER procedure CONTABIL_EGRESO (
    IDDOC integer,
    IDINTER integer)
returns (
    ERROR integer,
    VER char(1),
    IDC integer)
AS
declare variable PREF VARCHAR(4);
declare variable NUM VARCHAR(6);
declare variable FECAUX DATE;
declare variable FECHA CHAR(8);
declare variable CONC CHAR(120);
declare variable VRDTO NUMERIC(18, 2);
declare variable VRRTFTE NUMERIC(18, 2);
declare variable VRRTIVA NUMERIC(18, 2);
declare variable VRRTICA NUMERIC(18, 2);
declare variable VRTOTAL NUMERIC(18, 2);
declare variable TIPOCOMP VARCHAR(3);
declare variable PREFCONT VARCHAR(4);
declare variable BASE CHAR(1);
declare variable CTABASE VARCHAR(20);
declare variable CAJA CHAR(1);
declare variable CTACAJA VARCHAR(20);
declare variable RTFTE CHAR(1);
declare variable CTARTFTE VARCHAR(20);
declare variable RTIVA CHAR(1);
declare variable CTARTIVA VARCHAR(20);
declare variable RTICA CHAR(1);
declare variable CTARTICA VARCHAR(20);
declare variable DTO CHAR(1);
declare variable CTADTO VARCHAR(20);
declare variable EXISTE CHAR(1);
declare variable CUENTA VARCHAR(20);
declare variable MONTO NUMERIC(18,2);
declare variable ES_RETENCION CHAR(1);
declare variable TIPOCUEN CHAR(1);
declare variable NIT VARCHAR(20);
declare variable PROY VARCHAR(4);
declare variable CENTRO VARCHAR(4);
declare variable MONTOBASE NUMERIC(18,2);
declare variable PORC NUMERIC(9,2);
declare variable DEBITO NUMERIC(18,2);
declare variable CREDITO NUMERIC(18,2);
declare variable NROI INTEGER;
declare variable SUMA NUMERIC(18,2);
declare variable TCTACLIEN VARCHAR(20);
declare variable TCTARTFTE VARCHAR(20);
declare variable TCTARTIVA VARCHAR(20);
declare variable TCTARTICA VARCHAR(20);
declare variable TCTACART VARCHAR(20);
declare variable TIPOIT INTEGER;
declare variable IDIT INTEGER;
declare variable PREFIT VARCHAR(4);
declare variable NUMIT VARCHAR(6);
declare variable NUMEROIT VARCHAR(10);
declare variable ABONOIT NUMERIC(18,2);
declare variable CTADIC VARCHAR(20);
declare variable BASEADIC VARCHAR(20);
declare variable PORCADIC NUMERIC(5,2);
declare variable VALORADIC NUMERIC(18,2);
declare variable DBADIC CHAR(1);
declare variable VRBASE NUMERIC(18,2);
declare variable GMF CHAR(1);
declare variable CODBCO INTEGER;
declare variable NUMCHEQ VARCHAR(20);
declare variable CRUCES NUMERIC(18,2);
declare variable VRCAJA NUMERIC(18,2);
declare variable OK INTEGER;
declare variable DIFCAMBIO NUMERIC(18,2);
declare variable CTADIF VARCHAR(20);
declare variable RTFTEC NUMERIC(18,2);
declare variable RTIVAC NUMERIC(18,2);
declare variable RTICAC NUMERIC(18,2);
declare variable RTFTER CHAR(1);
declare variable CTARTFTER VARCHAR(20);
declare variable RTIVAR CHAR(1);
declare variable CTARTIVAR VARCHAR(20);
declare variable RTICAR CHAR(1);
declare variable CTARTICAR VARCHAR(20);
declare variable RET CHAR(2);
declare variable RTIT NUMERIC(18,2);
declare variable NITBCO VARCHAR(20);
BEGIN
/* BUSQUE LA INTERFACE */
EXISTE = 'N';
SELECT 'S', TICO_COD, PRCO_PRE, INCJ_BASE, INCJ_DTOPP, INCJ_RTFTE, INCJ_RTIVA, INCJ_RTICA, INCJ_CAJA, INCJ_CTABASE, INCJ_CTADTO, INCJ_CTARTFTE, INCJ_CTARTIVA, INCJ_CTARTICA, INCJ_CTACAJA, INCJ_CONFIRMAR
    FROM INTERFAZ_CAJA
    WHERE INCJ_ID = :IDINTER
    INTO :EXISTE, :TIPOCOMP, :PREFCONT, :BASE, :DTO, :RTFTE, :RTIVA, :RTICA, :CAJA, :CTABASE, :CTADTO, :CTARTFTE, :CTARTIVA, :CTARTICA, :CTACAJA, :VER;
if (EXISTE = 'S') then
    BEGIN
    OK = 0;
    FOR SELECT CNTB_ID FROM CONTABILIZACION WHERE CNTB_TIPOREF = 62 AND CNTB_IDREF = :IDDOC INTO :OK DO
        BEGIN
        DELETE FROM CONTABILIZACION_DET WHERE CNTB_ID = :OK;
        DELETE FROM CONTABILIZACION WHERE CNTB_ID = :OK;
        END

    /* TRAIGA EL ENCABEZADO DEL EGRESO */
    SELECT PREF_PRE, EGRE_NUMERO, EGRE_FECHA, E.TERC_NIT, EGRE_CONC, EGRE_DTOF, EGRE_MONTO, EGRE_RTFTEMONTO, EGRE_RTIVAMONTO, EGRE_RTICAMONTO, TERC_CTARTFTE, TERC_CTARTIVA, TERC_CTARTICA, TERC_CTACLIENTE
        FROM EGRESOS E, TERCEROS T
        WHERE EGRE_ID = :IDDOC AND E.TERC_NIT = T.TERC_NIT
        INTO :PREF, :NUM, :FECAUX, :NIT, :CONC, :VRDTO, :VRTOTAL, :VRRTFTE, :VRRTIVA, :VRRTICA, :TCTARTFTE, TCTARTIVA, TCTARTICA, TCTACLIEN;
    /* SI ES PROVEEDOR, SOBREESCIBE LAS CUENTAS  */
    SELECT PROV_CTAPAGAR, PROV_CTARTFTE, PROV_CTARTIVA, PROV_CTARTICA
        FROM PROVEEDORES WHERE TERC_NIT = :NIT
        INTO TCTACLIEN, TCTARTFTE, TCTARTIVA, TCTARTICA;
    SELECT PREF_CENTRO, PREF_PROY FROM PREFIJOS
        WHERE PREF_PRE = :PREF AND TIDO_COD = 62 INTO :CENTRO, :PROY;
    EXECUTE PROCEDURE FECHA_A_CONTA(:FECAUX) returning_values (:FECHA);
    /* REGISTRE EL ENCABEZADO CONTABLE */
    IDC = GEN_ID(ID_CONTABILIZA, 1);
    INSERT INTO CONTABILIZACION (CNTB_ID, CNTB_TIPOCOMP, CNTB_PREFCNT, CNTB_NUMERO, CNTB_FECHA, CNTB_CONCEPTO, CNTB_REF, CNTB_TIPOREF, CNTB_IDREF, CNTB_PREFREF, CNTB_NUMREF, CNTB_PROCESADO)
        VALUES (:IDC, :TIPOCOMP, :PREFCONT, :NUM, :FECHA, :CONC, '', 62, :IDDOC, :PREF, :NUM, 'N');
    /* SUME LOS CRUCES PARA LLEVARLOS A LA CUENTA X PAGAR Y RESTAR DE LA CAJA */
    SELECT SUM(EGCC_ABONO) FROM EGRESOS_CRUCEC WHERE EGRE_ID = :iddoc INTO :CRUCES;
    if (CRUCES IS NULL) then
        CRUCES = 0;
    VRCAJA = VRTOTAL;
    NROI = 0;
    SUMA = 0;
    ERROR = 0;
    /* EL CREDITO EN LA CAJA O EL BANCO */
    IF ((CAJA = 'K')) THEN
        BEGIN
        if (VRCAJA <> 0) then
            BEGIN
            CUENTA = NULL;
            EXECUTE PROCEDURE VALIDE_CUENTA_C (CTACAJA) RETURNING_VALUES (:OK);
            IF (OK = 0) THEN
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :CTACAJA INTO :CUENTA, :TIPOCUEN;
            ELSE
                begin
                EXECUTE PROCEDURE ERROR (62, :IDDOC, :CTACAJA, 2);
                CUENTA = CTACAJA;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 4);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRCAJA, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - VRCAJA;
                END
            END /* VRCAJA <> 0 */
        END /* CAJA CONSTANTE */
    IF ((CAJA = 'F')) THEN
        BEGIN
        /* mueva la cuenta de la caja o el banco o ambas */
        /* PRIMERO LA CAJA */
        FOR SELECT CAJA_CUENTA, EGCA_MONTO FROM EGRESOS_CAJA E, CAJAS C
            WHERE C.CAJA_ID = E.CAJA_ID AND EGRE_ID = :IDDOC
            INTO :CTACAJA, :MONTO
            DO
            BEGIN
            if (MONTO <> 0) then
                BEGIN
                CUENTA = NULL;
                EXECUTE PROCEDURE VALIDE_CUENTA_C (CTACAJA) RETURNING_VALUES (:OK);
                IF (OK = 0) THEN
                    SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                        WHERE CUEN_COD = :CTACAJA INTO :CUENTA, :TIPOCUEN;
                ELSE
                    begin
                    EXECUTE PROCEDURE ERROR (62, :IDDOC, :CTACAJA, 2);
                    CUENTA = CTACAJA;
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 4);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA - MONTO;
                    END
                END /* MONTO <> 0 */
            END /* DO CAJA */
        /* AHORA EL BANCO */
        MONTO = 0;
        SELECT CUBA_CTACONTA, EGBC_MONTO, EGBC_GMF, E.CUBA_COD, CUBA_GMFPOR, EGBC_NUMERO, BANC_NIT
            FROM EGRESOS_BANCO E, CUENTAS_BANCO C, BANCOS B
            WHERE E.CUBA_COD = C.CUBA_COD AND EGRE_ID = :IDDOC AND B.banc_cod = C.banc_cod
            INTO :CTACAJA, :MONTO, :GMF, :CODBCO, :PORC, :NUMCHEQ, :nitbco;
        if (MONTO <> 0) then
            BEGIN
            if (MONTO <> 0) then
                BEGIN
                CUENTA = NULL;
                EXECUTE PROCEDURE VALIDE_CUENTA_C (CTACAJA) RETURNING_VALUES (:OK);
                IF (OK = 0) THEN
                    SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                        WHERE CUEN_COD = :CTACAJA INTO :CUENTA, :TIPOCUEN;
                ELSE
                    begin
                    EXECUTE PROCEDURE ERROR (62, :IDDOC, :CTACAJA, 2);
                    CUENTA = CTACAJA;
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 4);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, :NUMCHEQ, 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA - MONTO;
                    END
                /* EL GMF */
                if ((GMF = 'S') AND (PORC <> 0)) then
                    BEGIN
                    if (NITBCO IS NULL) then
                        NITBCO = NIT;
                    EXECUTE procedure REDONDEE(:MONTO * :PORC / 1000, 0) returning_values (MONTO);
                    /* REGISTRE EL GMF EN LA MISMA CUENTA DEL BANCO COMO CREDITO */
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, :NUMCHEQ, 0, :MONTO, 0, 0, :NITBCO, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA - MONTO;

                    /* AHORA LA CUENTA DEL GASTO */
                    SELECT CUBA_CTAGMF FROM CUENTAS_BANCO
                        where CUBA_COD = :CODBCO INTO :CTACAJA;
                    EXECUTE PROCEDURE VALIDE_CUENTA_C (CTACAJA) RETURNING_VALUES (:OK);
                    IF (OK = 0) THEN
                        SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                            WHERE CUEN_COD = :CTACAJA INTO :CUENTA, :TIPOCUEN;
                    ELSE
                        begin
                        EXECUTE PROCEDURE ERROR (62, :IDDOC, :CTACAJA, 2);
                        CUENTA = CTACAJA;
                        TIPOCUEN = 'N';
                        ERROR = ERROR + 1;
                        end
                    if (TIPOCUEN = 'I') then
                        BEGIN
                        EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
                        TIPOCUEN = 'N';
                        ERROR = ERROR + 1;
                        END
                    if (TIPOCUEN = 'C') then
                        BEGIN
                        EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 4);
                        TIPOCUEN = 'N';
                        ERROR = ERROR + 1;
                        END
                    if (TIPOCUEN = 'N') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, :NUMCHEQ, :MONTO, 0, 0, 0, :NITBCO, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NROI = NROI + 1;
                        SUMA = SUMA + MONTO;
                        END
                    END /* GMF */
                END /* MONTO <> 0 */
            END /* EGRESO_BANCO */
        END /* CAJA = F */

    /* LOS CRUCES CON CUENTAS X COBRAR */
    if (CRUCES <> 0) then
        BEGIN
        SELECT TERC_CTACLIENTE FROM TERCEROS WHERE TERC_NIT = :nit INTO :tctacart;
        if (tctacart IS NULL) then
            tctacart = tctaclien;
        CUENTA = NULL;
        EXECUTE PROCEDURE VALIDE_CUENTA_C (tctacart) RETURNING_VALUES (:OK);
        IF (OK = 0) THEN
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :tctacart INTO :CUENTA, :TIPOCUEN;
        ELSE
            begin
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :tctacart, 2);
            CUENTA = tctacart;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            /* DEBERIA RECORRER DOCUMENTO POR DOCUMENTO */
            FOR SELECT EGCC_TIPODOC, EGCC_PREFIJO, EGCC_NUMERO, EGCC_ABONO+EGCC_RTFTE+EGCC_RTIVA+EGCC_RTICA+EGCC_DTOF
                FROM egresos_crucec WHERE EGRE_ID = :IDDOC
                INTO :TIPOIT, PREFIT, NUMIT, ABONOIT
                DO
                BEGIN
                NUMEROIT = PREFIT || NUMIT;
                if (ABONOIT > 0) then
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :ABONOIT, 0, 0, :NIT, :PROY, :CENTRO, NULL, :NUMEROIT, NULL, NULL, :TIPOIT, 0);
                else
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', abs(:ABONOIT), 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, :NUMEROIT, NULL, NULL, :TIPOIT, 0);
                SUMA = SUMA - ABONOIT;
                NROI = NROI + 1;
                END
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            if (CRUCES > 0) then
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :CRUCES, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            else
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', abs(:CRUCES), 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            SUMA = SUMA - CRUCES;
            NROI = NROI + 1;
            END
        /* LA DIFERENCIA EN CAMBIO */
        SELECT SUM(EGCC_DIFCAMBIO) FROM egresos_crucec WHERE EGRE_ID = :iddoc INTO :DIFCAMBIO;
        IF ((DIFCAMBIO IS NOT NULL) AND (DIFCAMBIO <> 0)) THEN
            BEGIN
            if (DIFCAMBIO > 0) then
                execute procedure lee_configuracion('GENERAL','GENERAL','CUENTA DE INGRESO POR DIFERENCIA EN CAMBIO PARA OPERACIONES EN OTRA MONEDA') returning_values (:ctadif);
            else
                execute procedure lee_configuracion('GENERAL','GENERAL','CUENTA DE GASTO POR DIFERENCIA EN CAMBIO PARA OPERACIONES EN OTRA MONEDA') returning_values (:ctadif);
            CUENTA = NULL;
            EXECUTE PROCEDURE VALIDE_CUENTA_C (ctadif) RETURNING_VALUES (:OK);
            IF (OK = 0) THEN
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :ctadif INTO :CUENTA, :TIPOCUEN;
            ELSE
                begin
                EXECUTE PROCEDURE ERROR (62, :IDDOC, :ctadif, 2);
                CUENTA = ctadif;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 4);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                if (DIFCAMBIO > 0) then
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :difcambio, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                else
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', ABS(:difcambio), 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - difcambio;
                END
            END
        /* RETEFUENTE DEL CRUCE */
        SELECT first 1 INCJ_RTFTE, INCJ_RTIVA, INCJ_RTICA, INCJ_CTARTFTE, INCJ_CTARTIVA, INCJ_CTARTICA
            FROM INTERFAZ_CAJA WHERE tido_cod = 61 into :RTFTER, :RTIVAR, :RTICAR, :CTARTFTER, :CTARTIVAR, :CTARTICAR;
        SELECT SUM(EGCC_RTFTE) FROM egresos_crucec WHERE EGRE_ID = :iddoc INTO :rtftec;
        IF ((rtftec IS NOT NULL) AND (rtftec <> 0)) THEN
            BEGIN
            if ((RTFTER = 'T') or (RTFTER = 'K')) then
                BEGIN
                if (RTFTER = 'T') then
                    SELECT TERC_CTARTFTE FROM TERCEROS WHERE TERC_NIT = :NIT INTO CTARTFTER;
                CUENTA = NULL;
                EXECUTE PROCEDURE VALIDE_CUENTA_C (ctartfter) RETURNING_VALUES (:OK);
                IF (OK = 0) THEN
                    SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                        WHERE CUEN_COD = :ctartfter INTO :CUENTA, :TIPOCUEN;
                ELSE
                    begin
                    EXECUTE PROCEDURE ERROR (62, :IDDOC, :ctartfter, 2);
                    CUENTA = ctartfter;
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 4);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    if (rtftec > 0) then
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :rtftec, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    else
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, abs(:rtftec), 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA + rtftec;
                    END
                END
            END
        /* RETEIVA DEL CRUCE */
        SELECT SUM(EGCC_RTIVA) FROM egresos_crucec WHERE EGRE_ID = :iddoc INTO :rtivac;
        IF ((rtivac IS NOT NULL) AND (rtivac <> 0)) THEN
            BEGIN
            if ((RTIVAR = 'T') or (RTIVAR = 'K')) then
                BEGIN
                if (RTIVAR = 'T') then
                    SELECT TERC_CTARTIVA FROM TERCEROS WHERE TERC_NIT = :NIT INTO CTARTIVAR;
                CUENTA = NULL;
                EXECUTE PROCEDURE VALIDE_CUENTA_C (ctartivar) RETURNING_VALUES (:OK);
                IF (OK = 0) THEN
                    SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                        WHERE CUEN_COD = :ctartivar INTO :CUENTA, :TIPOCUEN;
                ELSE
                    begin
                    EXECUTE PROCEDURE ERROR (62, :IDDOC, :ctartivar, 2);
                    CUENTA = ctartivar;
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 4);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    if (rtivac > 0) then
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :rtivac, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    else
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, abs(:rtivac), 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA + rtivac;
                    END
                END
            END
        /* RETEICA DEL CRUCE */
        SELECT SUM(EGCC_RTICA) FROM egresos_crucec WHERE EGRE_ID = :iddoc INTO :rticac;
        IF ((rticac IS NOT NULL) AND (rtivac <> 0)) THEN
            BEGIN
            if ((RTICAR = 'T') or (RTICAR = 'K')) then
                BEGIN
                if (RTICAR = 'T') then
                    SELECT TERC_CTARTICA FROM TERCEROS WHERE TERC_NIT = :NIT INTO CTARTICAR;
                CUENTA = NULL;
                EXECUTE PROCEDURE VALIDE_CUENTA_C (ctarticar) RETURNING_VALUES (:OK);
                IF (OK = 0) THEN
                    SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                        WHERE CUEN_COD = :ctarticar INTO :CUENTA, :TIPOCUEN;
                ELSE
                    begin
                    EXECUTE PROCEDURE ERROR (62, :IDDOC, :ctarticar, 2);
                    CUENTA = ctarticar;
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 4);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    if (rticac > 0) then
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :rticac, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    else
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, abs(:rticac), 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA + rticac;
                    END
                END
            END
        END /* cruces */

    if (DTO = 'K') then /* DTO EN CTA CONSTANTE */
        BEGIN
        if (VRDTO <> 0) then
            BEGIN
            CUENTA = NULL;
            EXECUTE PROCEDURE VALIDE_CUENTA_C (CTADTO) RETURNING_VALUES (:OK);
            IF (OK = 0) THEN
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :CTADTO INTO :CUENTA, :TIPOCUEN;
            ELSE
                begin
                EXECUTE PROCEDURE ERROR (62, :IDDOC, :CTADTO, 2);
                CUENTA = CTADTO;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 4);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRDTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - VRDTO;
                END
            END /* VRDTO <> 0 */
        END /* DTO EN CTA CONSTANTE */

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

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE EGRESOS_SIN_CONTABILIDAD(
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    ID INTEGER,
    IDI INTEGER,
    IDC INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    ESTADO VARCHAR(20),
    ERROR INTEGER)
AS
 /*$$IBE$$ DECLARE VARIABLE VER CHAR(2);
declare variable FECICNT VARCHAR(10);
declare variable FECFCNT VARCHAR(10);
declare variable idref INTEGER; $$IBE$$*/ 
BEGIN /*$$IBE$$ 
EXECUTE PROCEDURE fecha_a_conta(FECINI) returning_values (FECICNT);
EXECUTE PROCEDURE fecha_a_conta(FECFIN) returning_values (FECFCNT);
FOR SELECT EGRE_ID, PREF_PRE, egre_numero FROM EGRESOS WHERE EGRE_ANULADO = 'N' AND PREF_PRE <> 'R004' AND
    EGRE_FECHA >= :FECINI AND EGRE_FECHA <= :FECFIN ORDER BY EGRE_ID INTO :ID, :PREF, :NUMERO
DO
  BEGIN
  idref = null;
  SELECT ENCO_IDREF FROM COMPROBANTE_ENCABEZADO WHERE ENCO_TIPOREF = 62 AND ENCO_FECHA >= :FECICNT AND ENCO_FECHA <= :FECFCNT and ENCO_IDREF = :ID into :idref;
  if (idref IS NULL) then
  begin
   ESTADO = 'PROCESANDO';
   SUSPEND;
   SELECT MAX(INCJ_ID) FROM INTERFAZ_CAJA WHERE PREF_PRE = :PREF AND TIDO_COD = 62 INTO :IDI;
   EXECUTE PROCEDURE CONTABIL_EGRESO (:ID, :IDI) RETURNING_VALUES (:ERROR, :VER, :IDC);
   IF (ERROR = 0) THEN
      BEGIN
      EXECUTE PROCEDURE CONTABILIZA_PENDIENTE (:IDC);
      ESTADO = 'OK';
      END
   ELSE
    ESTADO = 'ERROR';
   suspend;
  end
  END
 $$IBE$$*/ SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE EGRESOS_SIN_CONTABILIDAD(
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    ID INTEGER,
    IDI INTEGER,
    IDC INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    ESTADO VARCHAR(20),
    ERROR INTEGER)
AS
DECLARE VARIABLE VER CHAR(2);
declare variable FECICNT VARCHAR(10);
declare variable FECFCNT VARCHAR(10);
declare variable idref INTEGER;
BEGIN
EXECUTE PROCEDURE fecha_a_conta(FECINI) returning_values (FECICNT);
EXECUTE PROCEDURE fecha_a_conta(FECFIN) returning_values (FECFCNT);
FOR SELECT EGRE_ID, PREF_PRE, egre_numero FROM EGRESOS WHERE EGRE_ANULADO = 'N' AND PREF_PRE <> 'R004' AND
    EGRE_FECHA >= :FECINI AND EGRE_FECHA <= :FECFIN ORDER BY EGRE_ID INTO :ID, :PREF, :NUMERO
DO
  BEGIN
  idref = null;
  SELECT ENCO_IDREF FROM COMPROBANTE_ENCABEZADO WHERE ENCO_TIPOREF = 62 AND ENCO_FECHA >= :FECICNT AND ENCO_FECHA <= :FECFCNT and ENCO_IDREF = :ID into :idref;
  if (idref IS NULL) then
  begin
   ESTADO = 'PROCESANDO';
   SUSPEND;
   SELECT MAX(INCJ_ID) FROM INTERFAZ_CAJA WHERE PREF_PRE = :PREF AND TIDO_COD = 62 INTO :IDI;
   EXECUTE PROCEDURE CONTABIL_EGRESO (:ID, :IDI) RETURNING_VALUES (:ERROR, :VER, :IDC);
   IF (ERROR = 0) THEN
      BEGIN
      EXECUTE PROCEDURE CONTABILIZA_PENDIENTE (:IDC);
      ESTADO = 'OK';
      END
   ELSE
    ESTADO = 'ERROR';
   suspend;
  end
  END
END

^

SET TERM ; ^


/* 20090721 *//* EL COSTO ESTABA SIEMPRE EN UNIDAD PRINCIPAL PERO EL DIGITADOR PUEDE CAMBIAR LA UNIDAD */
SET TERM ^ ;

CREATE OR ALTER TRIGGER AJUSTES_DETALLE_BI FOR AJUSTES_DETALLE
ACTIVE BEFORE INSERT POSITION 0
as
declare variable FECHA DATE;
begin
/* COLOQUE EL COSTO PROMEDIO */
SELECT AJUS_FECHA FROM AJUSTES WHERE AJUS_ID = NEW.ajus_id INTO :FECHA;
EXECUTE PROCEDURE costo_promedio_unidad(NEW.arti_cod, :FECHA, NEW.ajus_unidad) returning_values (NEW.ajde_costo);
end
^

SET TERM ; ^


/* 20090722 */
/* SOLO APLIQUE LAS RETENCIONES SI LA CONFIGURACION INDICA QUE NOLO HAGA POR CAUSACION */
SET TERM ^ ;

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

    if (ANULADO = 'N') then
        BEGIN
        SELECT PREF_CENTRO, PREF_PROY FROM PREFIJOS P, aplicacion_cliente N
            WHERE P.PREF_PRE = N.PREF_PRE AND P.TIDO_COD = 43 AND APCL_ID = :IDDOC INTO :CENTRO, :PROY;
        NUMERO = PREF || NUM;
        EXECUTE PROCEDURE FECHA_A_CONTA(:FECAUX) returning_values (:FECHA);
        VENCE = FECHA;
        /* REGISTRE EL ENCABEZADO CONTABLE */
        IDC = GEN_ID(ID_CONTABILIZA, 1);
        INSERT INTO CONTABILIZACION (CNTB_ID, CNTB_TIPOCOMP, CNTB_PREFCNT, CNTB_NUMERO, CNTB_FECHA, CNTB_CONCEPTO, CNTB_REF, CNTB_TIPOREF, CNTB_IDREF, CNTB_PREFREF, CNTB_NUMREF, CNTB_PROCESADO)
            VALUES (:IDC, :TIPOCOMP, :PREFCONT, :NUM, :FECHA, :CONC, '', 43, :IDDOC, :PREF, :NUM, 'N');
        NROI = 0;
        ERROR = 0;
        FOR SELECT ACDE_APLICADO+ACDE_RTFTE+ACDE_RTIVA+ACDE_RTICA, ACDE_PREFIJO || ACDE_NUMERO, ACDE_TIPODOC, ACDE_APLICADO
            FROM aplicacion_cliente_detalle WHERE APCL_ID = :IDDOC
            INTO :vrsubt, :numdoc, :tipodoc, :aplicado
            DO
            BEGIN
            if (RETES = 'SI') then
                vrsubt = aplicado;
            if (VRSUBT < 0) then
                BEGIN
                IF ((BASE = 'C') OR (BASE = 'K')) THEN
                    BEGIN
                    IF (BASE = 'C') THEN
                        CTABASE = TCTABASE;
                    CUENTA = NULL;
                    SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                        WHERE CUEN_COD = :CTABASE INTO :CUENTA, :TIPOCUEN;
                    if (CUENTA IS NULL) then
                        begin
                        EXECUTE PROCEDURE ERROR (43, :IDDOC, :CTABASE, 2);
                        CUENTA = CTABASE;
                        TIPOCUEN = 'N';
                        ERROR = ERROR + 1;
                        end
                    if (TIPOCUEN = 'I') then
                        BEGIN
                        EXECUTE PROCEDURE ERROR (43, :IDDOC, :CUENTA, 3);
                        TIPOCUEN = 'N';
                        ERROR = ERROR + 1;
                        END
                    if (TIPOCUEN = 'C') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRSUBT, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, :NUMDOC, :VENCE, NULL, :tipodoc, 43);
                        NROI = NROI + 1;
                        END
                    if (TIPOCUEN = 'N') then
                        BEGIN
                            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', ABS(:VRSUBT), 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NROI = NROI + 1;
                        END
                    END
                END /* SUBT < 0 */
            if ((VRSUBT > 0) and ((CLIE = 'C') or (CLIE = 'K'))) then
                BEGIN
                if (CLIE = 'C') then
                    CTACLIE = TCTACLIEN;
                CUENTA = NULL;
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :CTACLIE INTO :CUENTA, :TIPOCUEN;
                IF (CUENTA IS NULL) then
                    begin
                    EXECUTE PROCEDURE ERROR (43, :IDDOC, :CTACLIE, 2);
                    CUENTA = CTACLIE;
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (43, :IDDOC, :CUENTA, 3);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :vrsubt, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, :NUMDOC, :VENCE, NULL, :tipodoc, 42);
                    NROI = NROI + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :vrsubt, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    END
                end
            END /* for */
        END /* NO ANULADO */
    if (ERROR > 0) then
        VER = 'S';
    SUSPEND;
    END
ELSE
    BEGIN
    EXECUTE PROCEDURE ERROR (43, :IDDOC, :PREF, 1);
    ERROR = ERROR + 1;
    VER = 'S';
    SUSPEND;
    END
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE APLICACIONCL_SIN_CONTABILIDAD(
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    ID INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    ESTADO VARCHAR(20),
    IDI INTEGER,
    IDC INTEGER,
    ERROR INTEGER)
AS
 /*$$IBE$$ DECLARE VARIABLE VER CHAR(2);
declare variable FECICNT VARCHAR(10);
declare variable FECFCNT VARCHAR(10);
declare variable idref INTEGER; $$IBE$$*/ 
BEGIN /*$$IBE$$ 
EXECUTE PROCEDURE fecha_a_conta(FECINI) returning_values (FECICNT);
EXECUTE PROCEDURE fecha_a_conta(FECFIN) returning_values (FECFCNT);
FOR SELECT APCL_ID, PREF_PRE, APCL_NUMERO FROM aplicacion_cliente WHERE APCL_ANULADO = 'N' AND
    APCL_FECHA >= :FECINI AND APCL_FECHA <= :FECFIN ORDER BY APCL_ID
    INTO :ID, :PREF, :NUMERO
DO
  BEGIN
  idref = null;
  SELECT ENCO_IDREF FROM COMPROBANTE_ENCABEZADO WHERE ENCO_TIPOREF = 43 AND ENCO_FECHA >= :FECICNT AND ENCO_FECHA <= :FECFCNT and ENCO_IDREF = :id into :idref;
  if (idref IS NULL) then
  begin
   ESTADO = 'PROCESANDO';
   SUSPEND;
   SELECT MAX(INCA_ID) FROM INTERFAZ_CARTERA WHERE PREF_PRE = :PREF AND TIDO_COD = 43 INTO :IDI;
   EXECUTE PROCEDURE contabil_aplicacl (:ID, :IDI) RETURNING_VALUES (:ERROR, :VER, :IDC);
   if (ERROR = 0) then
    BEGIN
    EXECUTE PROCEDURE CONTABILIZA_PENDIENTE (:IDC);
    ESTADO = 'OK';
    END
   ELSE
    ESTADO = 'ERROR';
   suspend;
  end
  END
 $$IBE$$*/ SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE APLICACIONCL_SIN_CONTABILIDAD(
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    ID INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    ESTADO VARCHAR(20),
    IDI INTEGER,
    IDC INTEGER,
    ERROR INTEGER)
AS
DECLARE VARIABLE VER CHAR(2);
declare variable FECICNT VARCHAR(10);
declare variable FECFCNT VARCHAR(10);
declare variable idref INTEGER;
BEGIN
EXECUTE PROCEDURE fecha_a_conta(FECINI) returning_values (FECICNT);
EXECUTE PROCEDURE fecha_a_conta(FECFIN) returning_values (FECFCNT);
FOR SELECT APCL_ID, PREF_PRE, APCL_NUMERO FROM aplicacion_cliente WHERE APCL_ANULADO = 'N' AND
    APCL_FECHA >= :FECINI AND APCL_FECHA <= :FECFIN ORDER BY APCL_ID
    INTO :ID, :PREF, :NUMERO
DO
  BEGIN
  idref = null;
  SELECT ENCO_IDREF FROM COMPROBANTE_ENCABEZADO WHERE ENCO_TIPOREF = 43 AND ENCO_FECHA >= :FECICNT AND ENCO_FECHA <= :FECFCNT and ENCO_IDREF = :id into :idref;
  if (idref IS NULL) then
  begin
   ESTADO = 'PROCESANDO';
   SUSPEND;
   SELECT MAX(INCA_ID) FROM INTERFAZ_CARTERA WHERE PREF_PRE = :PREF AND TIDO_COD = 43 INTO :IDI;
   EXECUTE PROCEDURE contabil_aplicacl (:ID, :IDI) RETURNING_VALUES (:ERROR, :VER, :IDC);
   if (ERROR = 0) then
    BEGIN
    EXECUTE PROCEDURE CONTABILIZA_PENDIENTE (:IDC);
    ESTADO = 'OK';
    END
   ELSE
    ESTADO = 'ERROR';
   suspend;
  end
  END
END

^

SET TERM ; ^


SET TERM ^ ;

CREATE OR ALTER procedure CONTABIL_APLICAPR (
    IDDOC integer,
    IDINTER integer)
returns (
    ERROR integer,
    VER char(1),
    IDC integer)
AS
declare variable PREF VARCHAR(4);
declare variable NUM VARCHAR(6);
declare variable NUMERO VARCHAR(10);
declare variable NUMDOC VARCHAR(10);
declare variable FECAUX DATE;
declare variable FECHA CHAR(8);
declare variable CONC CHAR(120);
declare variable VRSUBT NUMERIC(18, 2);
declare variable TIPOCOMP VARCHAR(3);
declare variable PREFCONT VARCHAR(4);
declare variable BASE CHAR(1);
declare variable CTABASE VARCHAR(20);
declare variable CLIE CHAR(1);
declare variable CTACLIE VARCHAR(20);
declare variable EXISTE CHAR(1);
declare variable CUENTA VARCHAR(20);
declare variable TIPOCUEN CHAR(1);
declare variable NIT VARCHAR(20);
declare variable PROY VARCHAR(4);
declare variable CENTRO VARCHAR(4);
declare variable NROI INTEGER;
declare variable TCTACLIEN VARCHAR(20);
declare variable TCTABASE VARCHAR(20);
declare variable ANULADO CHAR(1);
declare variable TIPODOC INTEGER;
declare variable RETES CHAR(2);
declare variable APLICADO NUMERIC(18,2);
BEGIN
execute procedure lee_configuracion('CXPAGAR', 'SALDOS', 'DESCONTAR RETENCIONES POR CAUSACION') returning_values (RETES);
ERROR = 0;
/* BUSQUE LA INTERFACE */
EXISTE = 'N';
SELECT 'S', TICO_COD, PRCO_PRE, INCP_BASE, INCP_PROV, INCP_CTABASE, INCP_CTAPROV, INCP_CONFIRMAR
  FROM INTERFAZ_CXPAGAR
  WHERE INCP_ID = :IDINTER
  INTO :EXISTE, :TIPOCOMP, :PREFCONT, :BASE, :CLIE, :CTABASE, :CTACLIE, :VER;

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

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

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

    FOR SELECT APPD_APLICADO+APPD_RTFTE+APPD_RTIVA+APPD_RTICA, APPD_PREFIJO || APPD_NUMERO, APPD_TIPODOC, APPD_APLICADO
        FROM aplicacion_proveedor_detalle
        WHERE APPR_ID = :IDDOC
        INTO :vrsubt, :numdoc, :tipodoc, :aplicado
        DO
        BEGIN
        if (RETES = 'SI') then
            vrsubt = aplicado;
        IF ((VRSUBT < 0) AND ((BASE = 'T') OR (BASE = 'K'))) THEN
            BEGIN
            IF (BASE = 'T') THEN
                CTABASE = TCTABASE;
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTABASE INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERROR (53, :IDDOC, :CTABASE, 2);
                CUENTA = CTABASE;
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERROR (53, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', ABS(:VRSUBT), 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, :numdoc, :FECHA, NULL, :tipodoc, 43);
                NROI = NROI + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', ABS(:VRSUBT), 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                END
            END /* MONTO <> 0 */
        if ((VRSUBT > 0) and ((CLIE = 'T') or (CLIE = 'K'))) then
            BEGIN
            if (CLIE = 'T') then
                CTACLIE = TCTACLIEN;
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTACLIE INTO :CUENTA, :TIPOCUEN;
            IF (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERROR (53, :IDDOC, :CTACLIE, 2);
                CUENTA = CTACLIE;
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERROR (53, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :vrsubt, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, :numdoc, :FECHA, NULL, :tipodoc, 43);
            if (TIPOCUEN = 'N') then
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :vrsubt, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            END /* CARTERA */
        END /* DO */
    END
  if (ERROR > 0) then
    VER = 'S';
  SUSPEND;
  END /* EXISTE LA INTERFAZ */
ELSE
    BEGIN
    EXECUTE PROCEDURE ERROR (53, :IDDOC, :PREF, 1);
    ERROR = ERROR + 1;
    VER = 'S';
    SUSPEND;
    END
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE APLICACIONPR_SIN_CONTABILIDAD(
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    ID INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    ESTADO VARCHAR(20),
    IDI INTEGER,
    IDC INTEGER,
    ERROR INTEGER)
AS
 /*$$IBE$$ DECLARE VARIABLE VER CHAR(2);
declare variable FECICNT VARCHAR(10);
declare variable FECFCNT VARCHAR(10);
declare variable idref INTEGER; $$IBE$$*/ 
BEGIN /*$$IBE$$ 
EXECUTE PROCEDURE fecha_a_conta(FECINI) returning_values (FECICNT);
EXECUTE PROCEDURE fecha_a_conta(FECFIN) returning_values (FECFCNT);
FOR SELECT APPR_ID, PREF_PRE, APPR_NUMERO FROM aplicacion_provedor WHERE APPR_ANULADO = 'N' AND
    APPR_FECHA >= :FECINI AND APPR_FECHA <= :FECFIN ORDER BY APPR_ID
    INTO :ID, :PREF, :NUMERO
DO
  BEGIN
  idref = null;
  SELECT ENCO_IDREF FROM COMPROBANTE_ENCABEZADO WHERE ENCO_TIPOREF = 53 AND ENCO_FECHA >= :FECICNT AND ENCO_FECHA <= :FECFCNT and ENCO_IDREF = :id into :idref;
  if (idref IS NULL) then
  begin
   ESTADO = 'PROCESANDO';
   SUSPEND;
   SELECT MAX(INCP_ID) FROM interfaz_cxpagar WHERE PREF_PRE = :PREF AND TIDO_COD = 53 INTO :IDI;
   EXECUTE PROCEDURE contabil_aplicapr (:ID, :IDI) RETURNING_VALUES (:ERROR, :VER, :IDC);
   if (ERROR = 0) then
    BEGIN
    EXECUTE PROCEDURE CONTABILIZA_PENDIENTE (:IDC);
    ESTADO = 'OK';
    END
   ELSE
    ESTADO = 'ERROR';
   suspend;
  end
  END
 $$IBE$$*/ SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE APLICACIONPR_SIN_CONTABILIDAD(
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    ID INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    ESTADO VARCHAR(20),
    IDI INTEGER,
    IDC INTEGER,
    ERROR INTEGER)
AS
DECLARE VARIABLE VER CHAR(2);
declare variable FECICNT VARCHAR(10);
declare variable FECFCNT VARCHAR(10);
declare variable idref INTEGER;
BEGIN
EXECUTE PROCEDURE fecha_a_conta(FECINI) returning_values (FECICNT);
EXECUTE PROCEDURE fecha_a_conta(FECFIN) returning_values (FECFCNT);
FOR SELECT APPR_ID, PREF_PRE, APPR_NUMERO FROM aplicacion_provedor WHERE APPR_ANULADO = 'N' AND
    APPR_FECHA >= :FECINI AND APPR_FECHA <= :FECFIN ORDER BY APPR_ID
    INTO :ID, :PREF, :NUMERO
DO
  BEGIN
  idref = null;
  SELECT ENCO_IDREF FROM COMPROBANTE_ENCABEZADO WHERE ENCO_TIPOREF = 53 AND ENCO_FECHA >= :FECICNT AND ENCO_FECHA <= :FECFCNT and ENCO_IDREF = :id into :idref;
  if (idref IS NULL) then
  begin
   ESTADO = 'PROCESANDO';
   SUSPEND;
   SELECT MAX(INCP_ID) FROM interfaz_cxpagar WHERE PREF_PRE = :PREF AND TIDO_COD = 53 INTO :IDI;
   EXECUTE PROCEDURE contabil_aplicapr (:ID, :IDI) RETURNING_VALUES (:ERROR, :VER, :IDC);
   if (ERROR = 0) then
    BEGIN
    EXECUTE PROCEDURE CONTABILIZA_PENDIENTE (:IDC);
    ESTADO = 'OK';
    END
   ELSE
    ESTADO = 'ERROR';
   suspend;
  end
  END
END

^

SET TERM ; ^



/* 20090721b *//* conciliacion y movimiento en pantalla confunden saldo inicial con final del proveedor */
/* conciliacion y movimiento en pantalla confunden saldo inicial con final del proveedor */
SET TERM ^ ;

create or alter procedure SALDO_INICIAL_PROVEEDOR (
    NIT varchar(20),
    FECHA date,
    MONEDA integer)
returns (
    SALDO numeric(18,2))
AS
DECLARE VARIABLE sal numeric(18,2);
declare variable TIPODOC INTEGER;
declare variable IDDOC INTEGER;
BEGIN
fecha = fecha - 1;
saldo = 0;
FOR SELECT MVPR_TIPOREF, MVPR_IDREF FROM movimiento_proveedor
    WHERE TERC_NIT = :NIT AND MVPR_FECHA <= :FECHA AND MVPR_ABONO = 'N'
    INTO :TIPODOC, :IDDOC
    DO
    BEGIN
    EXECUTE PROCEDURE saldo_doc_cxpagar(TIPODOC, IDDOC, FECHA, MONEDA) returning_values (SAL);
    if (SAL <> 0) then
        SALDO = SALDO + SAL;
    END
SUSPEND;
END
^

SET TERM ; ^

GRANT EXECUTE ON PROCEDURE SALDO_INICIAL_PROVEEDOR TO PUBLIC;

SET TERM ^ ;

CREATE OR ALTER procedure SALDO_PROVEEDOR (
    NIT varchar(20),
    FECHA date,
    MONEDA integer)
returns (
    SALDO numeric(18,2))
AS
DECLARE VARIABLE sal numeric(18,2);
declare variable TIPODOC INTEGER;
declare variable IDDOC INTEGER;
BEGIN
saldo = 0;
FOR SELECT MVPR_TIPOREF, MVPR_IDREF FROM movimiento_proveedor
    WHERE TERC_NIT = :NIT AND MVPR_FECHA <= :FECHA AND MVPR_ABONO = 'N'
    INTO :TIPODOC, :IDDOC
    DO
    BEGIN
    EXECUTE PROCEDURE saldo_doc_cxpagar(TIPODOC, IDDOC, FECHA, MONEDA) returning_values (SAL);
    if (SAL <> 0) then
        SALDO = SALDO + SAL;
    END
SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE CONCILIA_CXPAGAR(
    FECINI DATE,
    FECFIN DATE,
    CTACART VARCHAR(20),
    SUBEMPRESA INTEGER,
    ANTERIOR CHAR(1))
RETURNS (
    NIT VARCHAR(20),
    NOMBRE VARCHAR(60),
    INICIAL NUMERIC(18,2),
    INICIALC NUMERIC(18,2),
    DEBITOS NUMERIC(18,2),
    DEBITOSC NUMERIC(18,2),
    CREDITOS NUMERIC(18,2),
    CREDITOSC NUMERIC(18,2),
    SALDO NUMERIC(18,2),
    SALDOC NUMERIC(18,2),
    DIFERENCIA NUMERIC(18,2))
AS
 /*$$IBE$$ declare variable ANO CHAR(4);
declare variable MES INTEGER;
declare variable ABONOS NUMERIC(18,2);
declare variable RETES CHAR(2); $$IBE$$*/ 
begin /*$$IBE$$ 
ano = EXTRACT(YEAR FROM FECFIN);
mes = EXTRACT(MONTH FROM FECFIN);

for select TERC_NIT, TERC_NOM from TERCEROS WHERE TERC_PROV = 'S' into :NIT, :NOMBRE
    DO
    BEGIN
    EXECUTE PROCEDURE saldo_proveedor (NIT, FECINI, 0) returning_values (INICIAL);
    EXECUTE PROCEDURE LEE_CONFIGURACION('CXPAGAR', 'SALDOS', 'DESCONTAR RETENCIONES POR CAUSACION') returning_values(:RETES);
    if (RETES = 'SI') then
        BEGIN
        SELECT SUM(MVPR_MONTO-MVPR_RTFTE-MVPR_RTIVA-MVPR_RTICA)
            FROM movimiento_proveedor
            WHERE TERC_NIT = :NIT AND MVPR_FECHA >= :FECINI AND MVPR_FECHA < :FECFIN AND MVPR_DEBITO = 'S'
            INTO :DEBITOS;
        SELECT SUM(MVPR_MONTO-MVPR_RTFTE-MVPR_RTIVA-MVPR_RTICA)
            FROM movimiento_proveedor
            WHERE TERC_NIT = :NIT AND MVPR_FECHA >= :FECINI AND MVPR_FECHA < :FECFIN AND MVPR_DEBITO = 'N' AND MVPR_ABONO = 'N' and MVPR_TIPOREF <> 55
            INTO :CREDITOS;
        SELECT SUM(MVPR_MONTO) FROM movimiento_proveedor
            WHERE TERC_NIT = :NIT AND MVPR_FECHA >= :FECINI AND MVPR_FECHA < :FECFIN AND MVPR_ABONO = 'S'
            INTO :ABONOS;
        END
    ELSE
        BEGIN
        SELECT SUM(MVPR_MONTO)
            FROM movimiento_proveedor
            WHERE TERC_NIT = :NIT AND MVPR_FECHA >= :FECINI AND MVPR_FECHA < :FECFIN AND MVPR_DEBITO = 'S'
            INTO :DEBITOS;
        SELECT SUM(MVPR_MONTO)
            FROM movimiento_proveedor
            WHERE TERC_NIT = :NIT AND MVPR_FECHA >= :FECINI AND MVPR_FECHA < :FECFIN AND MVPR_DEBITO = 'N' AND MVPR_ABONO = 'N' AND MVPR_TIPOREF <> 55
            INTO :CREDITOS;
        SELECT SUM(MVPR_MONTO+MVPR_RTFTE+MVPR_RTIVA+MVPR_RTICA)
            FROM movimiento_proveedor
            WHERE TERC_NIT = :NIT AND MVPR_FECHA >= :FECINI AND MVPR_FECHA < :FECFIN AND MVPR_ABONO = 'S'
            INTO :ABONOS;
        END
    if (DEBITOS IS NULL) then
        DEBITOS = 0;
    if (CREDITOS IS NULL) then
        CREDITOS = 0;
    if (ABONOS IS NULL) then
        ABONOS = 0;
    CREDITOS = CREDITOS + ABONOS;
    SALDO = INICIAL + DEBITOS - CREDITOS;

     $$IBE$$*/ /* LO CONTABLE */ /*$$IBE$$ 
    EXECUTE PROCEDURE SALDO_TERCERO_MES(ctacart, NIT, ANO, MES, 'S') RETURNING_VALUES (INICIALC);
    EXECUTE PROCEDURE MOVIMIENTO_TERCERO_MES(ctacart, NIT, ANO, MES, 'S') RETURNING_VALUES(DEBITOSC);
    EXECUTE PROCEDURE MOVIMIENTO_TERCERO_MES(ctacart, NIT, ANO, MES, 'N') RETURNING_VALUES(CREDITOSC);
    SALDOC = INICIALC + DEBITOSC - CREDITOSC;
    diferencia = SALDO + SALDOC;
    if (DIFERENCIA <> 0) then
        BEGIN
        if (ANTERIOR <> 'S') then
            SUSPEND;
        ELSE
            BEGIN
            if (DIFERENCIA <> (INICIAL + INICIALC)) then
                SUSPEND;
            END
        END
    END
 $$IBE$$*/ SUSPEND;
end
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE IMPR_EGRESO(
    ID INTEGER)
RETURNS (
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    NIT VARCHAR(20),
    NOMBRE VARCHAR(60),
    DIR VARCHAR(60),
    CIU VARCHAR(40),
    TEL VARCHAR(40),
    CONCEPTO VARCHAR(60),
    MONTO NUMERIC(18,2),
    RTFTE NUMERIC(18,2),
    RTIVA NUMERIC(18,2),
    RTICA NUMERIC(18,2),
    DSCTO NUMERIC(18,2),
    OBS BLOB SUB_TYPE 1 SEGMENT SIZE 80,
    ITEMDOC INTEGER,
    TIPODOC VARCHAR(8),
    PREFDOC VARCHAR(4),
    NUMDOC VARCHAR(6),
    NUMPRV VARCHAR(10),
    ABONODOC NUMERIC(18,2),
    RTFTEDOC NUMERIC(18,2),
    RTIVADOC NUMERIC(18,2),
    RTICADOC NUMERIC(18,2),
    DSCTODOC NUMERIC(18,2),
    SALDODOC NUMERIC(18,2),
    SALDOPROV NUMERIC(18,2),
    ANTERDOC NUMERIC(18,2))
AS
 /*$$IBE$$ declare variable NUMROWS INTEGER;
declare variable TIPO integer;
declare variable IDDOC INTEGER; $$IBE$$*/ 
BEGIN /*$$IBE$$ 
  SELECT PREF_PRE, EGRE_NUMERO, EGRE_FECHA, EGRE_CONC,
        E.TERC_NIT, EGRE_NOMTERC, TERC_DIR, TERC_CIU, TERC_TEL,
        EGRE_MONTO, EGRE_RTFTEMONTO, EGRE_RTIVAMONTO, EGRE_RTICAMONTO, EGRE_DTOF,
        EGRE_OBS
    FROM EGRESOS E, TERCEROS T
    WHERE E.TERC_NIT = T.TERC_NIT AND E.EGRE_ID = :ID
    INTO :PREFIJO, :NUMERO, :FECHA, :CONCEPTO, 
        :NIT, :NOMBRE, :DIR, :CIU, :TEL,
        :MONTO, :RTFTE, :RTIVA, :RTICA, :DSCTO,
        :OBS;
  select SALDO from saldo_proveedor(:NIT, :FECHA+1, 0) into :SALDOPROV;
  SELECT COUNT(EGDE_ITEM) FROM EGRESOS_DETALLE
    WHERE EGRE_ID = :ID INTO :NUMROWS;
  if (NUMROWS > 0) then
    FOR SELECT EGDE_ITEM, EGDE_TIPODOC, TIDO_NOMCORTO, EGDE_IDDOC, EGDE_PREFIJO, EGDE_NUMERO, EGDE_ABONO, EGDE_RTFTE, EGDE_RTIVA, EGDE_RTICA, EGDE_DTOF
        FROM EGRESOS_DETALLE ED, TIPO_DOCUMENTO TD
        WHERE TD.TIDO_COD = ED.EGDE_TIPODOC AND ED.EGRE_ID = :ID
        order by egde_item
        INTO :ITEMDOC, :TIPO, :TIPODOC, :IDDOC, :PREFDOC, :NUMDOC, :ABONODOC, :RTFTEDOC, :RTIVADOC, :RTICADOC, :DSCTODOC
        DO
            BEGIN
            if (TIPO = 21) then
                SELECT FACO_NUMPROV FROM FACTURAS_COMPRA WHERE FACO_ID = :iddoc INTO :numprv;
            ELSE
                if (TIPO = 51) then
                    SELECT NDPR_NUMPROV FROM NOTAS_DEBITO_PROVEEDOR WHERE NDPR_ID = :iddoc INTO :numprv;
                ELSE
                    numprv = numdoc;
            EXECUTE PROCEDURE saldo_doc_cxpagar(:TIPO, :IDDOC, :FECHA, 0) returning_values (:SALDODOC);
            ANTERDOC = SALDODOC + RTFTEDOC + RTIVADOC + RTICADOC + ABONODOC + DSCTODOC;
            SUSPEND;
            END
  else
    BEGIN
    SALDOPROV = 0;
    ANTERDOC = 0;
    SALDODOC = 0;
    RTFTEDOC = 0;
    RTIVADOC = 0;
    RTICADOC = 0;
    ABONODOC = 0;
    DSCTODOC = 0;
    numprv = '';
    SUSPEND;
    END
 $$IBE$$*/ SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE MOVIMIENTO_CXPAGAR_DESDE_HASTA(
    NIT VARCHAR(20),
    DESDE DATE,
    HASTA DATE,
    MONEDA INTEGER)
RETURNS (
    INICIAL NUMERIC(18,2),
    TIPODOC VARCHAR(8),
    IDDOC INTEGER,
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    CONCEPTO VARCHAR(60),
    DEBITO NUMERIC(18,2),
    CREDITO NUMERIC(18,2),
    SALDO NUMERIC(18,2),
    NOMBRE VARCHAR(60),
    RTFTE NUMERIC(18,2),
    RTIVA NUMERIC(18,2),
    RTICA NUMERIC(18,2),
    NUMPROV VARCHAR(20))
AS
 /*$$IBE$$ declare variable DB CHAR(1);
declare variable AB CHAR(1);
declare variable RETES CHAR(2);
declare variable TRM NUMERIC(18,2); $$IBE$$*/ 
BEGIN
  /* Ubique el NIT */ /*$$IBE$$ 
  select terc_nom from terceros where terc_nit = :NIT INTO :NOMBRE;
  execute procedure saldo_proveedor (NIT, DESDE, MONEDA) returning_values (INICIAL);
  if (INICIAL is null) then
    INICIAL = 0;
  SALDO = INICIAL;
  EXECUTE PROCEDURE LEE_CONFIGURACION('CXPAGAR', 'SALDOS', 'DESCONTAR RETENCIONES POR CAUSACION') returning_values(:RETES);
  FOR select tido_nomcorto, mvpr_idref, mvpr_prefijo, mvpr_numero, mvpr_fecha, mvpr_conc, mvpr_monto, mvpr_debito, mvpr_rtfte, mvpr_rtiva, mvpr_rtica, mvpr_abono, MVPR_TRM
    from movimiento_proveedor m, tipo_documento t
    where m.mvpr_tiporef = t.tido_cod and terc_nit = :NIT and mvpr_fecha >= :DESDE and mvpr_fecha <= :HASTA AND mvpr_tiporef <> 55 AND ((:MONEDA = 0) or (MVPR_TRM <> 1))
    order by mvpr_fecha, mvpr_tiporef
    into :TIPODOC, :IDDOC, :PREFIJO, :NUMERO, :FECHA, :CONCEPTO, :DEBITO, :DB, :RTFTE, :RTIVA, :RTICA, :AB, :TRM
    DO
    BEGIN
    if (DB = 'N') then
        BEGIN
        if (AB = 'S') then
            if (RETES = 'SI') then
                CREDITO = DEBITO;
            ELSE
                CREDITO = DEBITO + RTFTE + RTIVA + RTICA;
        ELSE
            if (RETES = 'SI') then
                CREDITO = DEBITO - RTFTE - RTIVA - RTICA;
            ELSE
                CREDITO = DEBITO;
        DEBITO = 0;
        END
    ELSE
        BEGIN
        if (RETES = 'SI') then
            DEBITO = DEBITO - RTFTE - RTIVA - RTICA;
        CREDITO = 0;
        END
    if ((MONEDA <> 0) AND (TRM <> 0)) then
        BEGIN
        DEBITO = DEBITO / TRM;
        CREDITO = CREDITO / TRM;
        RTFTE = RTFTE / TRM;
        RTIVA = RTIVA / TRM;
        RTICA = RTICA / TRM;
        END
    SALDO = SALDO + DEBITO - CREDITO;
    NUMPROV = '';
    if (TIPODOC = 'CARGOACR') then
        SELECT NDPR_NUMPROV FROM NOTAS_DEBITO_PROVEEDOR WHERE NDPR_ID = :IDDOC INTO :NUMPROV;
    if (TIPODOC = 'FACTCOMP') then
        SELECT FACO_NUMPROV FROM FACTURAS_COMPRA WHERE FACO_ID = :IDDOC INTO :NUMPROV;
    SUSPEND;
    END
 $$IBE$$*/ SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE MOVIMIENTO_CXPAGAR_MES(
    FECINI DATE,
    FECFIN DATE,
    MONEDA INTEGER)
RETURNS (
    NIT VARCHAR(20),
    NOMBRE VARCHAR(60),
    GRUPO VARCHAR(2),
    INICIAL NUMERIC(18,4),
    DEBITOS NUMERIC(18,4),
    CREDITOS NUMERIC(18,4),
    ABONOS NUMERIC(18,4),
    FINAL NUMERIC(18,4))
AS
 /*$$IBE$$ declare variable RETES CHAR(2); $$IBE$$*/ 
BEGIN /*$$IBE$$ 
  for select TERC_NIT, TERC_NOM from TERCEROS WHERE TERC_PROV = 'S' into :NIT, :NOMBRE
  DO
    BEGIN
    SELECT GRPR_COD FROM PROVEEDORES WHERE TERC_NIT = :NIT INTO :grupo;
    EXECUTE PROCEDURE saldo_proveedor (NIT, FECINI, MONEDA) returning_values (INICIAL);
    EXECUTE PROCEDURE LEE_CONFIGURACION('CXPAGAR', 'SALDOS', 'DESCONTAR RETENCIONES POR CAUSACION') returning_values(:RETES);
    if (RETES = 'SI') then
        BEGIN
        SELECT SUM((MVPR_MONTO-MVPR_RTFTE-MVPR_RTIVA-MVPR_RTICA)/MVPR_TRM)
            FROM movimiento_proveedor
            WHERE TERC_NIT = :NIT AND MVPR_FECHA >= :FECINI AND MVPR_FECHA <= :FECFIN AND MVPR_DEBITO = 'S' AND ((:MONEDA = 0) or (MVPR_TRM <> 1))
            INTO :DEBITOS;
        SELECT SUM((MVPR_MONTO-MVPR_RTFTE-MVPR_RTIVA-MVPR_RTICA)/MVPR_TRM)
            FROM movimiento_proveedor
            WHERE TERC_NIT = :NIT AND MVPR_FECHA >= :FECINI AND MVPR_FECHA <= :FECFIN AND MVPR_DEBITO = 'N' AND MVPR_ABONO = 'N' and MVPR_TIPOREF <> 55 AND ((:MONEDA = 0) or (MVPR_TRM <> 1))
            INTO :CREDITOS;
        SELECT SUM(MVPR_MONTO/MVPR_TRM) FROM movimiento_proveedor
            WHERE TERC_NIT = :NIT AND MVPR_FECHA >= :FECINI AND MVPR_FECHA <= :FECFIN AND MVPR_ABONO = 'S' AND ((:MONEDA = 0) or (MVPR_TRM <> 1))
            INTO :ABONOS;
        END
    ELSE
        BEGIN
        SELECT SUM(MVPR_MONTO/MVPR_TRM)
            FROM movimiento_proveedor
            WHERE TERC_NIT = :NIT AND MVPR_FECHA >= :FECINI AND MVPR_FECHA <= :FECFIN AND MVPR_DEBITO = 'S' AND ((:MONEDA = 0) or (MVPR_TRM <> 1))
            INTO :DEBITOS;
        SELECT SUM(MVPR_MONTO/MVPR_TRM)
            FROM movimiento_proveedor
            WHERE TERC_NIT = :NIT AND MVPR_FECHA >= :FECINI AND MVPR_FECHA <= :FECFIN AND MVPR_DEBITO = 'N' AND MVPR_ABONO = 'N' AND MVPR_TIPOREF <> 55 AND ((:MONEDA = 0) or (MVPR_TRM <> 1))
            INTO :CREDITOS;
        SELECT SUM((MVPR_MONTO+MVPR_RTFTE+MVPR_RTIVA+MVPR_RTICA)/MVPR_TRM)
            FROM movimiento_proveedor
            WHERE TERC_NIT = :NIT AND MVPR_FECHA >= :FECINI AND MVPR_FECHA <= :FECFIN AND MVPR_ABONO = 'S' AND ((:MONEDA = 0) or (MVPR_TRM <> 1))
            INTO :ABONOS;
        END
    if (DEBITOS IS NULL) then
        DEBITOS = 0;
    if (CREDITOS IS NULL) then
        CREDITOS = 0;
    if (ABONOS IS NULL) then
        ABONOS = 0;
    FINAL = INICIAL + DEBITOS - CREDITOS - ABONOS;
    SUSPEND;
    END
 $$IBE$$*/ SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE REP_MOVIMIENTO_PROVEEDOR(
    DESDE VARCHAR(20),
    HASTA VARCHAR(20),
    GRPINI VARCHAR(5),
    GRPFIN VARCHAR(5),
    FECINI DATE,
    FECFIN DATE,
    DETALLE CHAR(1),
    ORDEN CHAR(1),
    AGRUPA CHAR(1),
    MONEDA INTEGER)
RETURNS (
    NIT VARCHAR(20),
    NOMBRE VARCHAR(60),
    TELEFONO VARCHAR(40),
    CIUDAD VARCHAR(40),
    CODZONA VARCHAR(2),
    NOMZONA VARCHAR(60),
    DV CHAR(1),
    CODCIUD CHAR(5),
    NOMCIUD VARCHAR(60),
    INICIAL NUMERIC(18,2),
    TIPODOC VARCHAR(8),
    IDDOC INTEGER,
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    CONCEPTO VARCHAR(60),
    DEBITO NUMERIC(18,2),
    CREDITO NUMERIC(18,2),
    ABONO NUMERIC(18,2),
    SALDO NUMERIC(18,2),
    RTFTE NUMERIC(18,2),
    RTIVA NUMERIC(18,2),
    RTICA NUMERIC(18,2),
    ARTFTE NUMERIC(18,2),
    ARTIVA NUMERIC(18,2),
    ARTICA NUMERIC(18,2))
AS
 /*$$IBE$$ declare variable NITINI VARCHAR(20);
declare variable NITFIN VARCHAR(20);
declare variable NOMINI VARCHAR(20);
declare variable NOMFIN VARCHAR(20);
declare variable OK CHAR(1);
declare variable DB CHAR(1);
declare variable AB CHAR(1);
declare variable DESCRETE CHAR(2);
declare variable TRM NUMERIC(18,2); $$IBE$$*/ 
BEGIN /*$$IBE$$ 
if (ORDEN = 'C') then
    BEGIN
    NITINI = DESDE;
    NITFIN = HASTA;
    NOMINI = '';
    NOMFIN = 'zz';
    END
ELSE
    BEGIN
    NOMINI = DESDE;
    NOMFIN = HASTA;
    NITINI = '';
    NITFIN = 'zz';
    END
EXECUTE PROCEDURE LEE_CONFIGURACION('CXPAGAR', 'SALDOS', 'DESCONTAR RETENCIONES POR CAUSACION') returning_values (DESCRETE);
 $$IBE$$*/ /* Ubique el NIT */ /*$$IBE$$ 
FOR select T.TERC_NIT, TERC_NOM, TERC_DV, TERC_TEL, TERC_CIU, P.GRPR_COD, T.CIUD_COD
    from terceros T, PROVEEDORES P
    where P.TERC_NIT = T.TERC_NIT AND TERC_PROV = 'S' AND T.TERC_NIT >= :NITINI AND T.TERC_NIT <= :NITFIN AND
        TERC_NOM >= :NOMINI AND TERC_NOM <= :NOMFIN
    INTO :NIT, :NOMBRE, :DV, :TELEFONO, :CIUDAD, :CODZONA, :CODCIUD
    DO  
    BEGIN

    SELECT GRPR_NOM FROM GRUPOS_PROVEEDORES WHERE GRPR_COD = :CODZONA INTO :NOMZONA;
    SELECT CIUD_NOM FROM CIUDADES WHERE CIUD_COD = :CODCIUD INTO :NOMCIUD;
    OK = 'N';
    if (AGRUPA = 'Z') then
        BEGIN
        if (GRPINI = '') then
            BEGIN
            if ((CODZONA IS NULL) or (CODZONA >= :GRPINI AND CODZONA <= :GRPFIN)) then
                OK = 'S';
            END
        ELSE
            if (CODZONA >= :GRPINI AND CODZONA <= :GRPFIN) then
                OK = 'S';
        END
    if (AGRUPA = 'C') then
        BEGIN
        if (GRPINI = '') then
            BEGIN
            if ((CODCIUD IS NULL) or (CODCIUD >= :GRPINI AND CODCIUD <= :GRPFIN)) then
                OK = 'S';
            END
        ELSE
            if (CODCIUD >= :GRPINI AND CODCIUD <= :GRPFIN) then
                OK = 'S';
        END
    if (AGRUPA = 'N') then
        OK = 'S';
        
    if (OK = 'S') then
        BEGIN
        execute procedure saldo_proveedor (NIT, FECINI, MONEDA) returning_values (INICIAL);
        if (INICIAL is null) then
            INICIAL = 0;
        SALDO = INICIAL;
        if (DETALLE = 'S') then
          BEGIN
          FOR select tido_nomcorto, mvpr_idref, mvpr_prefijo, mvpr_numero, mvpr_fecha, mvpr_conc, mvpr_monto, mvpr_debito, mvpr_rtfte, mvpr_rtiva, mvpr_rtica, mvpr_abono, MVPR_TRM
            from movimiento_proveedor m, tipo_documento t
            where m.mvpr_tiporef = t.tido_cod and terc_nit = :NIT and mvpr_fecha >= :FECINI and mvpr_fecha <= :FECFIN AND MVPR_TIPOREF <> 55 AND ((:MONEDA = 0) or (MVPR_TRM <> 1))
            order by mvpr_fecha, mvpr_tiporef
            into :TIPODOC, :IDDOC, :PREFIJO, :NUMERO, :FECHA, :CONCEPTO, :DEBITO, :DB, :RTFTE, :RTIVA, :RTICA, :AB, :TRM
            DO
            BEGIN
            if (RTFTE IS NULL) then
                RTFTE = 0;
            if (RTIVA IS NULL) then
                RTIVA = 0;
            if (RTICA IS NULL) then
                RTICA = 0;
            if (DB = 'N') then
                BEGIN
                CREDITO = DEBITO;
                DEBITO = 0;
                RTFTE = RTFTE * -1;
                RTIVA = RTIVA * -1;
                RTICA = RTICA * -1;
                END
            ELSE
                CREDITO = 0;
            if ((MONEDA <> 0) AND (TRM <> 0)) then
                BEGIN
                DEBITO = DEBITO / TRM;
                CREDITO = CREDITO / TRM;
                RTFTE = RTFTE / TRM;
                RTIVA = RTIVA / TRM;
                RTICA = RTICA / TRM;
                END
            SALDO = SALDO + DEBITO - CREDITO;
            if (AB = 'N') then
                BEGIN
                if (DESCRETE = 'SI') then
                    SALDO = SALDO - RTFTE - RTIVA - RTICA;
                ABONO = 0;
                END
            ELSE
                BEGIN
                ABONO = CREDITO;
                CREDITO = 0;
                if (DESCRETE <> 'SI') then
                    SALDO = SALDO + RTFTE + RTIVA + RTICA;
                END
            SUSPEND;
            END
          END
        ELSE
            BEGIN
            if (MONEDA = 0) then
                SELECT SUM(MVPR_MONTO), sum(mvpr_rtfte), sum(mvpr_rtiva), sum(mvpr_rtica)
                    FROM movimiento_proveedor WHERE TERC_NIT = :NIT AND MVPR_FECHA >= :FECINI AND MVPR_FECHA <= :FECFIN AND MVPR_DEBITO = 'S' and MVPR_ABONO = 'N'
                    INTO :DEBITO, :RTFTE, :RTIVA, :RTICA;
            else
                SELECT SUM(MVPR_MONTO/MVPR_TRM), sum(mvpr_rtfte/MVPR_TRM), sum(mvpr_rtiva/MVPR_TRM), sum(mvpr_rtica/MVPR_TRM)
                    FROM movimiento_proveedor WHERE TERC_NIT = :NIT AND MVPR_FECHA >= :FECINI AND MVPR_FECHA <= :FECFIN AND MVPR_DEBITO = 'S' and MVPR_ABONO = 'N' AND ((:MONEDA = 0) or (MVPR_TRM <> 1))
                    INTO :DEBITO, :RTFTE, :RTIVA, :RTICA;
            if (DEBITO IS NULL) then
                DEBITO = 0;
            if (RTFTE IS NULL) then
                RTFTE = 0;
            if (RTIVA IS NULL) then
                RTIVA = 0;
            if (RTICA IS NULL) then
                RTICA = 0;
            if (DESCRETE = 'SI') then
                DEBITO = DEBITO - RTFTE - RTIVA - RTICA;
            if (MONEDA = 0) then
                SELECT SUM(MVPR_MONTO), sum(mvpr_rtfte), sum(mvpr_rtiva), sum(mvpr_rtica) FROM movimiento_proveedor
                    WHERE TERC_NIT = :NIT AND MVPR_FECHA >= :FECINI AND MVPR_FECHA <= :FECFIN AND MVPR_DEBITO = 'N' AND MVPR_TIPOREF <> 55 AND MVPR_ABONO = 'N' INTO :CREDITO, :ARTFTE, :ARTIVA, :ARTICA;
            else
                SELECT SUM(MVPR_MONTO/MVPR_TRM), sum(mvpr_rtfte/MVPR_TRM), sum(mvpr_rtiva/MVPR_TRM), sum(mvpr_rtica/MVPR_TRM) FROM movimiento_proveedor
                    WHERE TERC_NIT = :NIT AND MVPR_FECHA >= :FECINI AND MVPR_FECHA <= :FECFIN AND MVPR_DEBITO = 'N' AND MVPR_TIPOREF <> 55 AND MVPR_ABONO = 'N' INTO :CREDITO, :ARTFTE, :ARTIVA, :ARTICA;
            if (CREDITO IS NULL) then
                CREDITO = 0;
            if (ARTFTE IS NULL) then
                ARTFTE = 0;
            if (ARTIVA IS NULL) then
                ARTIVA = 0;
            if (ARTICA IS NULL) then
                ARTICA = 0;
            if (DESCRETE = 'SI') then
                CREDITO = CREDITO - ARTFTE - ARTIVA - ARTICA;
            RTFTE = RTFTE - ARTFTE;
            RTIVA = RTIVA - ARTIVA;
            RTICA = RTICA - ARTICA;
            if (MONEDA = 0) then
                SELECT SUM(MVPR_MONTO), sum(mvpr_rtfte), sum(mvpr_rtiva), sum(mvpr_rtica) FROM movimiento_proveedor
                    WHERE TERC_NIT = :NIT AND MVPR_FECHA >= :FECINI AND MVPR_FECHA <= :FECFIN AND MVPR_ABONO = 'S'
                    INTO :ABONO, :ARTFTE, :ARTIVA, :ARTICA;
            else
                SELECT SUM(MVPR_MONTO/MVPR_TRM), sum(mvpr_rtfte/MVPR_TRM), sum(mvpr_rtiva/MVPR_TRM), sum(mvpr_rtica/MVPR_TRM)
                    FROM movimiento_proveedor
                    WHERE TERC_NIT = :NIT AND MVPR_FECHA >= :FECINI AND MVPR_FECHA <= :FECFIN AND MVPR_ABONO = 'S' AND ((:MONEDA = 0) or (MVPR_TRM <> 1))
                    INTO :ABONO, :ARTFTE, :ARTIVA, :ARTICA;
            if (ABONO IS NULL) then
                ABONO = 0;
            if (ARTFTE IS NULL) then
                ARTFTE = 0;
            if (ARTIVA IS NULL) then
                ARTIVA = 0;
            if (ARTICA IS NULL) then
                ARTICA = 0;
            if (DESCRETE <> 'SI') then
                ABONO = ABONO + ARTFTE + ARTIVA + ARTICA;
            SALDO = INICIAL + DEBITO - CREDITO - ABONO;
            SUSPEND;
            END
        END
    END
 $$IBE$$*/ SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE CONCILIA_CXPAGAR(
    FECINI DATE,
    FECFIN DATE,
    CTACART VARCHAR(20),
    SUBEMPRESA INTEGER,
    ANTERIOR CHAR(1))
RETURNS (
    NIT VARCHAR(20),
    NOMBRE VARCHAR(60),
    INICIAL NUMERIC(18,2),
    INICIALC NUMERIC(18,2),
    DEBITOS NUMERIC(18,2),
    DEBITOSC NUMERIC(18,2),
    CREDITOS NUMERIC(18,2),
    CREDITOSC NUMERIC(18,2),
    SALDO NUMERIC(18,2),
    SALDOC NUMERIC(18,2),
    DIFERENCIA NUMERIC(18,2))
AS
declare variable ANO CHAR(4);
declare variable MES INTEGER;
declare variable ABONOS NUMERIC(18,2);
declare variable RETES CHAR(2);
begin
ano = EXTRACT(YEAR FROM FECFIN);
mes = EXTRACT(MONTH FROM FECFIN);

for select TERC_NIT, TERC_NOM from TERCEROS WHERE TERC_PROV = 'S' into :NIT, :NOMBRE
    DO
    BEGIN
    EXECUTE PROCEDURE saldo_inicial_proveedor (NIT, FECINI, 0) returning_values (INICIAL);
    EXECUTE PROCEDURE LEE_CONFIGURACION('CXPAGAR', 'SALDOS', 'DESCONTAR RETENCIONES POR CAUSACION') returning_values(:RETES);
    if (RETES = 'SI') then
        BEGIN
        SELECT SUM(MVPR_MONTO-MVPR_RTFTE-MVPR_RTIVA-MVPR_RTICA)
            FROM movimiento_proveedor
            WHERE TERC_NIT = :NIT AND MVPR_FECHA >= :FECINI AND MVPR_FECHA <= :FECFIN AND MVPR_DEBITO = 'S'
            INTO :DEBITOS;
        SELECT SUM(MVPR_MONTO-MVPR_RTFTE-MVPR_RTIVA-MVPR_RTICA)
            FROM movimiento_proveedor
            WHERE TERC_NIT = :NIT AND MVPR_FECHA >= :FECINI AND MVPR_FECHA <= :FECFIN AND MVPR_DEBITO = 'N' AND MVPR_ABONO = 'N' and MVPR_TIPOREF <> 55
            INTO :CREDITOS;
        SELECT SUM(MVPR_MONTO) FROM movimiento_proveedor
            WHERE TERC_NIT = :NIT AND MVPR_FECHA >= :FECINI AND MVPR_FECHA <= :FECFIN AND MVPR_ABONO = 'S'
            INTO :ABONOS;
        END
    ELSE
        BEGIN
        SELECT SUM(MVPR_MONTO)
            FROM movimiento_proveedor
            WHERE TERC_NIT = :NIT AND MVPR_FECHA >= :FECINI AND MVPR_FECHA <= :FECFIN AND MVPR_DEBITO = 'S'
            INTO :DEBITOS;
        SELECT SUM(MVPR_MONTO)
            FROM movimiento_proveedor
            WHERE TERC_NIT = :NIT AND MVPR_FECHA >= :FECINI AND MVPR_FECHA <= :FECFIN AND MVPR_DEBITO = 'N' AND MVPR_ABONO = 'N' AND MVPR_TIPOREF <> 55
            INTO :CREDITOS;
        SELECT SUM(MVPR_MONTO+MVPR_RTFTE+MVPR_RTIVA+MVPR_RTICA)
            FROM movimiento_proveedor
            WHERE TERC_NIT = :NIT AND MVPR_FECHA >= :FECINI AND MVPR_FECHA <= :FECFIN AND MVPR_ABONO = 'S'
            INTO :ABONOS;
        END
    if (DEBITOS IS NULL) then
        DEBITOS = 0;
    if (CREDITOS IS NULL) then
        CREDITOS = 0;
    if (ABONOS IS NULL) then
        ABONOS = 0;
    CREDITOS = CREDITOS + ABONOS;
    SALDO = INICIAL + DEBITOS - CREDITOS;

    /* LO CONTABLE */
    EXECUTE PROCEDURE SALDO_TERCERO_MES(ctacart, NIT, ANO, MES, 'S') RETURNING_VALUES (INICIALC);
    EXECUTE PROCEDURE MOVIMIENTO_TERCERO_MES(ctacart, NIT, ANO, MES, 'S') RETURNING_VALUES(DEBITOSC);
    EXECUTE PROCEDURE MOVIMIENTO_TERCERO_MES(ctacart, NIT, ANO, MES, 'N') RETURNING_VALUES(CREDITOSC);
    SALDOC = INICIALC + DEBITOSC - CREDITOSC;
    diferencia = SALDO + SALDOC;
    if (DIFERENCIA <> 0) then
        BEGIN
        if (ANTERIOR <> 'S') then
            SUSPEND;
        ELSE
            BEGIN
            if (DIFERENCIA <> (INICIAL + INICIALC)) then
                SUSPEND;
            END
        END
    END
end

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE IMPR_EGRESO(
    ID INTEGER)
RETURNS (
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    NIT VARCHAR(20),
    NOMBRE VARCHAR(60),
    DIR VARCHAR(60),
    CIU VARCHAR(40),
    TEL VARCHAR(40),
    CONCEPTO VARCHAR(60),
    MONTO NUMERIC(18,2),
    RTFTE NUMERIC(18,2),
    RTIVA NUMERIC(18,2),
    RTICA NUMERIC(18,2),
    DSCTO NUMERIC(18,2),
    OBS BLOB SUB_TYPE 1 SEGMENT SIZE 80,
    ITEMDOC INTEGER,
    TIPODOC VARCHAR(8),
    PREFDOC VARCHAR(4),
    NUMDOC VARCHAR(6),
    NUMPRV VARCHAR(10),
    ABONODOC NUMERIC(18,2),
    RTFTEDOC NUMERIC(18,2),
    RTIVADOC NUMERIC(18,2),
    RTICADOC NUMERIC(18,2),
    DSCTODOC NUMERIC(18,2),
    SALDODOC NUMERIC(18,2),
    SALDOPROV NUMERIC(18,2),
    ANTERDOC NUMERIC(18,2))
AS
declare variable NUMROWS INTEGER;
declare variable TIPO integer;
declare variable IDDOC INTEGER;
BEGIN
  SELECT PREF_PRE, EGRE_NUMERO, EGRE_FECHA, EGRE_CONC,
        E.TERC_NIT, EGRE_NOMTERC, TERC_DIR, TERC_CIU, TERC_TEL,
        EGRE_MONTO, EGRE_RTFTEMONTO, EGRE_RTIVAMONTO, EGRE_RTICAMONTO, EGRE_DTOF,
        EGRE_OBS
    FROM EGRESOS E, TERCEROS T
    WHERE E.TERC_NIT = T.TERC_NIT AND E.EGRE_ID = :ID
    INTO :PREFIJO, :NUMERO, :FECHA, :CONCEPTO, 
        :NIT, :NOMBRE, :DIR, :CIU, :TEL,
        :MONTO, :RTFTE, :RTIVA, :RTICA, :DSCTO,
        :OBS;
  select SALDO from saldo_proveedor(:NIT, :FECHA, 0) into :SALDOPROV;
  SELECT COUNT(EGDE_ITEM) FROM EGRESOS_DETALLE
    WHERE EGRE_ID = :ID INTO :NUMROWS;
  if (NUMROWS > 0) then
    FOR SELECT EGDE_ITEM, EGDE_TIPODOC, TIDO_NOMCORTO, EGDE_IDDOC, EGDE_PREFIJO, EGDE_NUMERO, EGDE_ABONO, EGDE_RTFTE, EGDE_RTIVA, EGDE_RTICA, EGDE_DTOF
        FROM EGRESOS_DETALLE ED, TIPO_DOCUMENTO TD
        WHERE TD.TIDO_COD = ED.EGDE_TIPODOC AND ED.EGRE_ID = :ID
        order by egde_item
        INTO :ITEMDOC, :TIPO, :TIPODOC, :IDDOC, :PREFDOC, :NUMDOC, :ABONODOC, :RTFTEDOC, :RTIVADOC, :RTICADOC, :DSCTODOC
        DO
            BEGIN
            if (TIPO = 21) then
                SELECT FACO_NUMPROV FROM FACTURAS_COMPRA WHERE FACO_ID = :iddoc INTO :numprv;
            ELSE
                if (TIPO = 51) then
                    SELECT NDPR_NUMPROV FROM NOTAS_DEBITO_PROVEEDOR WHERE NDPR_ID = :iddoc INTO :numprv;
                ELSE
                    numprv = numdoc;
            EXECUTE PROCEDURE saldo_doc_cxpagar(:TIPO, :IDDOC, :FECHA, 0) returning_values (:SALDODOC);
            ANTERDOC = SALDODOC + RTFTEDOC + RTIVADOC + RTICADOC + ABONODOC + DSCTODOC;
            SUSPEND;
            END
  else
    BEGIN
    SALDOPROV = 0;
    ANTERDOC = 0;
    SALDODOC = 0;
    RTFTEDOC = 0;
    RTIVADOC = 0;
    RTICADOC = 0;
    ABONODOC = 0;
    DSCTODOC = 0;
    numprv = '';
    SUSPEND;
    END
END

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE MOVIMIENTO_CXPAGAR_DESDE_HASTA(
    NIT VARCHAR(20),
    DESDE DATE,
    HASTA DATE,
    MONEDA INTEGER)
RETURNS (
    INICIAL NUMERIC(18,2),
    TIPODOC VARCHAR(8),
    IDDOC INTEGER,
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    CONCEPTO VARCHAR(60),
    DEBITO NUMERIC(18,2),
    CREDITO NUMERIC(18,2),
    SALDO NUMERIC(18,2),
    NOMBRE VARCHAR(60),
    RTFTE NUMERIC(18,2),
    RTIVA NUMERIC(18,2),
    RTICA NUMERIC(18,2),
    NUMPROV VARCHAR(20))
AS
declare variable DB CHAR(1);
declare variable AB CHAR(1);
declare variable RETES CHAR(2);
declare variable TRM NUMERIC(18,2);
BEGIN
  /* Ubique el NIT */
  select terc_nom from terceros where terc_nit = :NIT INTO :NOMBRE;
  execute procedure saldo_inicial_proveedor (NIT, DESDE, MONEDA) returning_values (INICIAL);
  if (INICIAL is null) then
    INICIAL = 0;
  SALDO = INICIAL;
  EXECUTE PROCEDURE LEE_CONFIGURACION('CXPAGAR', 'SALDOS', 'DESCONTAR RETENCIONES POR CAUSACION') returning_values(:RETES);
  FOR select tido_nomcorto, mvpr_idref, mvpr_prefijo, mvpr_numero, mvpr_fecha, mvpr_conc, mvpr_monto, mvpr_debito, mvpr_rtfte, mvpr_rtiva, mvpr_rtica, mvpr_abono, MVPR_TRM
    from movimiento_proveedor m, tipo_documento t
    where m.mvpr_tiporef = t.tido_cod and terc_nit = :NIT and mvpr_fecha >= :DESDE and mvpr_fecha <= :HASTA AND mvpr_tiporef <> 55 AND ((:MONEDA = 0) or (MVPR_TRM <> 1))
    order by mvpr_fecha, mvpr_tiporef
    into :TIPODOC, :IDDOC, :PREFIJO, :NUMERO, :FECHA, :CONCEPTO, :DEBITO, :DB, :RTFTE, :RTIVA, :RTICA, :AB, :TRM
    DO
    BEGIN
    if (DB = 'N') then
        BEGIN
        if (AB = 'S') then
            if (RETES = 'SI') then
                CREDITO = DEBITO;
            ELSE
                CREDITO = DEBITO + RTFTE + RTIVA + RTICA;
        ELSE
            if (RETES = 'SI') then
                CREDITO = DEBITO - RTFTE - RTIVA - RTICA;
            ELSE
                CREDITO = DEBITO;
        DEBITO = 0;
        END
    ELSE
        BEGIN
        if (RETES = 'SI') then
            DEBITO = DEBITO - RTFTE - RTIVA - RTICA;
        CREDITO = 0;
        END
    if ((MONEDA <> 0) AND (TRM <> 0)) then
        BEGIN
        DEBITO = DEBITO / TRM;
        CREDITO = CREDITO / TRM;
        RTFTE = RTFTE / TRM;
        RTIVA = RTIVA / TRM;
        RTICA = RTICA / TRM;
        END
    SALDO = SALDO + DEBITO - CREDITO;
    NUMPROV = '';
    if (TIPODOC = 'CARGOACR') then
        SELECT NDPR_NUMPROV FROM NOTAS_DEBITO_PROVEEDOR WHERE NDPR_ID = :IDDOC INTO :NUMPROV;
    if (TIPODOC = 'FACTCOMP') then
        SELECT FACO_NUMPROV FROM FACTURAS_COMPRA WHERE FACO_ID = :IDDOC INTO :NUMPROV;
    SUSPEND;
    END
END

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE MOVIMIENTO_CXPAGAR_MES(
    FECINI DATE,
    FECFIN DATE,
    MONEDA INTEGER)
RETURNS (
    NIT VARCHAR(20),
    NOMBRE VARCHAR(60),
    GRUPO VARCHAR(2),
    INICIAL NUMERIC(18,4),
    DEBITOS NUMERIC(18,4),
    CREDITOS NUMERIC(18,4),
    ABONOS NUMERIC(18,4),
    FINAL NUMERIC(18,4))
AS
declare variable RETES CHAR(2);
BEGIN
  for select TERC_NIT, TERC_NOM from TERCEROS WHERE TERC_PROV = 'S' into :NIT, :NOMBRE
  DO
    BEGIN
    SELECT GRPR_COD FROM PROVEEDORES WHERE TERC_NIT = :NIT INTO :grupo;
    EXECUTE PROCEDURE saldo_inicial_proveedor (NIT, FECINI, MONEDA) returning_values (INICIAL);
    EXECUTE PROCEDURE LEE_CONFIGURACION('CXPAGAR', 'SALDOS', 'DESCONTAR RETENCIONES POR CAUSACION') returning_values(:RETES);
    if (RETES = 'SI') then
        BEGIN
        SELECT SUM((MVPR_MONTO-MVPR_RTFTE-MVPR_RTIVA-MVPR_RTICA)/MVPR_TRM)
            FROM movimiento_proveedor
            WHERE TERC_NIT = :NIT AND MVPR_FECHA >= :FECINI AND MVPR_FECHA <= :FECFIN AND MVPR_DEBITO = 'S' AND ((:MONEDA = 0) or (MVPR_TRM <> 1))
            INTO :DEBITOS;
        SELECT SUM((MVPR_MONTO-MVPR_RTFTE-MVPR_RTIVA-MVPR_RTICA)/MVPR_TRM)
            FROM movimiento_proveedor
            WHERE TERC_NIT = :NIT AND MVPR_FECHA >= :FECINI AND MVPR_FECHA <= :FECFIN AND MVPR_DEBITO = 'N' AND MVPR_ABONO = 'N' and MVPR_TIPOREF <> 55 AND ((:MONEDA = 0) or (MVPR_TRM <> 1))
            INTO :CREDITOS;
        SELECT SUM(MVPR_MONTO/MVPR_TRM) FROM movimiento_proveedor
            WHERE TERC_NIT = :NIT AND MVPR_FECHA >= :FECINI AND MVPR_FECHA <= :FECFIN AND MVPR_ABONO = 'S' AND ((:MONEDA = 0) or (MVPR_TRM <> 1))
            INTO :ABONOS;
        END
    ELSE
        BEGIN
        SELECT SUM(MVPR_MONTO/MVPR_TRM)
            FROM movimiento_proveedor
            WHERE TERC_NIT = :NIT AND MVPR_FECHA >= :FECINI AND MVPR_FECHA <= :FECFIN AND MVPR_DEBITO = 'S' AND ((:MONEDA = 0) or (MVPR_TRM <> 1))
            INTO :DEBITOS;
        SELECT SUM(MVPR_MONTO/MVPR_TRM)
            FROM movimiento_proveedor
            WHERE TERC_NIT = :NIT AND MVPR_FECHA >= :FECINI AND MVPR_FECHA <= :FECFIN AND MVPR_DEBITO = 'N' AND MVPR_ABONO = 'N' AND MVPR_TIPOREF <> 55 AND ((:MONEDA = 0) or (MVPR_TRM <> 1))
            INTO :CREDITOS;
        SELECT SUM((MVPR_MONTO+MVPR_RTFTE+MVPR_RTIVA+MVPR_RTICA)/MVPR_TRM)
            FROM movimiento_proveedor
            WHERE TERC_NIT = :NIT AND MVPR_FECHA >= :FECINI AND MVPR_FECHA <= :FECFIN AND MVPR_ABONO = 'S' AND ((:MONEDA = 0) or (MVPR_TRM <> 1))
            INTO :ABONOS;
        END
    if (DEBITOS IS NULL) then
        DEBITOS = 0;
    if (CREDITOS IS NULL) then
        CREDITOS = 0;
    if (ABONOS IS NULL) then
        ABONOS = 0;
    FINAL = INICIAL + DEBITOS - CREDITOS - ABONOS;
    SUSPEND;
    END
END

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE REP_MOVIMIENTO_PROVEEDOR(
    DESDE VARCHAR(20),
    HASTA VARCHAR(20),
    GRPINI VARCHAR(5),
    GRPFIN VARCHAR(5),
    FECINI DATE,
    FECFIN DATE,
    DETALLE CHAR(1),
    ORDEN CHAR(1),
    AGRUPA CHAR(1),
    MONEDA INTEGER)
RETURNS (
    NIT VARCHAR(20),
    NOMBRE VARCHAR(60),
    TELEFONO VARCHAR(40),
    CIUDAD VARCHAR(40),
    CODZONA VARCHAR(2),
    NOMZONA VARCHAR(60),
    DV CHAR(1),
    CODCIUD CHAR(5),
    NOMCIUD VARCHAR(60),
    INICIAL NUMERIC(18,2),
    TIPODOC VARCHAR(8),
    IDDOC INTEGER,
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    CONCEPTO VARCHAR(60),
    DEBITO NUMERIC(18,2),
    CREDITO NUMERIC(18,2),
    ABONO NUMERIC(18,2),
    SALDO NUMERIC(18,2),
    RTFTE NUMERIC(18,2),
    RTIVA NUMERIC(18,2),
    RTICA NUMERIC(18,2),
    ARTFTE NUMERIC(18,2),
    ARTIVA NUMERIC(18,2),
    ARTICA NUMERIC(18,2))
AS
declare variable NITINI VARCHAR(20);
declare variable NITFIN VARCHAR(20);
declare variable NOMINI VARCHAR(20);
declare variable NOMFIN VARCHAR(20);
declare variable OK CHAR(1);
declare variable DB CHAR(1);
declare variable AB CHAR(1);
declare variable DESCRETE CHAR(2);
declare variable TRM NUMERIC(18,2);
BEGIN
if (ORDEN = 'C') then
    BEGIN
    NITINI = DESDE;
    NITFIN = HASTA;
    NOMINI = '';
    NOMFIN = 'zz';
    END
ELSE
    BEGIN
    NOMINI = DESDE;
    NOMFIN = HASTA;
    NITINI = '';
    NITFIN = 'zz';
    END
EXECUTE PROCEDURE LEE_CONFIGURACION('CXPAGAR', 'SALDOS', 'DESCONTAR RETENCIONES POR CAUSACION') returning_values (DESCRETE);
/* Ubique el NIT */
FOR select T.TERC_NIT, TERC_NOM, TERC_DV, TERC_TEL, TERC_CIU, P.GRPR_COD, T.CIUD_COD
    from terceros T, PROVEEDORES P
    where P.TERC_NIT = T.TERC_NIT AND TERC_PROV = 'S' AND T.TERC_NIT >= :NITINI AND T.TERC_NIT <= :NITFIN AND
        TERC_NOM >= :NOMINI AND TERC_NOM <= :NOMFIN
    INTO :NIT, :NOMBRE, :DV, :TELEFONO, :CIUDAD, :CODZONA, :CODCIUD
    DO  
    BEGIN

    SELECT GRPR_NOM FROM GRUPOS_PROVEEDORES WHERE GRPR_COD = :CODZONA INTO :NOMZONA;
    SELECT CIUD_NOM FROM CIUDADES WHERE CIUD_COD = :CODCIUD INTO :NOMCIUD;
    OK = 'N';
    if (AGRUPA = 'Z') then
        BEGIN
        if (GRPINI = '') then
            BEGIN
            if ((CODZONA IS NULL) or (CODZONA >= :GRPINI AND CODZONA <= :GRPFIN)) then
                OK = 'S';
            END
        ELSE
            if (CODZONA >= :GRPINI AND CODZONA <= :GRPFIN) then
                OK = 'S';
        END
    if (AGRUPA = 'C') then
        BEGIN
        if (GRPINI = '') then
            BEGIN
            if ((CODCIUD IS NULL) or (CODCIUD >= :GRPINI AND CODCIUD <= :GRPFIN)) then
                OK = 'S';
            END
        ELSE
            if (CODCIUD >= :GRPINI AND CODCIUD <= :GRPFIN) then
                OK = 'S';
        END
    if (AGRUPA = 'N') then
        OK = 'S';
        
    if (OK = 'S') then
        BEGIN
        execute procedure saldo_inicial_proveedor (NIT, FECINI, MONEDA) returning_values (INICIAL);
        if (INICIAL is null) then
            INICIAL = 0;
        SALDO = INICIAL;
        if (DETALLE = 'S') then
          BEGIN
          FOR select tido_nomcorto, mvpr_idref, mvpr_prefijo, mvpr_numero, mvpr_fecha, mvpr_conc, mvpr_monto, mvpr_debito, mvpr_rtfte, mvpr_rtiva, mvpr_rtica, mvpr_abono, MVPR_TRM
            from movimiento_proveedor m, tipo_documento t
            where m.mvpr_tiporef = t.tido_cod and terc_nit = :NIT and mvpr_fecha >= :FECINI and mvpr_fecha <= :FECFIN AND MVPR_TIPOREF <> 55 AND ((:MONEDA = 0) or (MVPR_TRM <> 1))
            order by mvpr_fecha, mvpr_tiporef
            into :TIPODOC, :IDDOC, :PREFIJO, :NUMERO, :FECHA, :CONCEPTO, :DEBITO, :DB, :RTFTE, :RTIVA, :RTICA, :AB, :TRM
            DO
            BEGIN
            if (RTFTE IS NULL) then
                RTFTE = 0;
            if (RTIVA IS NULL) then
                RTIVA = 0;
            if (RTICA IS NULL) then
                RTICA = 0;
            if (DB = 'N') then
                BEGIN
                CREDITO = DEBITO;
                DEBITO = 0;
                RTFTE = RTFTE * -1;
                RTIVA = RTIVA * -1;
                RTICA = RTICA * -1;
                END
            ELSE
                CREDITO = 0;
            if ((MONEDA <> 0) AND (TRM <> 0)) then
                BEGIN
                DEBITO = DEBITO / TRM;
                CREDITO = CREDITO / TRM;
                RTFTE = RTFTE / TRM;
                RTIVA = RTIVA / TRM;
                RTICA = RTICA / TRM;
                END
            SALDO = SALDO + DEBITO - CREDITO;
            if (AB = 'N') then
                BEGIN
                if (DESCRETE = 'SI') then
                    SALDO = SALDO - RTFTE - RTIVA - RTICA;
                ABONO = 0;
                END
            ELSE
                BEGIN
                ABONO = CREDITO;
                CREDITO = 0;
                if (DESCRETE <> 'SI') then
                    SALDO = SALDO + RTFTE + RTIVA + RTICA;
                END
            SUSPEND;
            END
          END
        ELSE
            BEGIN
            if (MONEDA = 0) then
                SELECT SUM(MVPR_MONTO), sum(mvpr_rtfte), sum(mvpr_rtiva), sum(mvpr_rtica)
                    FROM movimiento_proveedor WHERE TERC_NIT = :NIT AND MVPR_FECHA >= :FECINI AND MVPR_FECHA <= :FECFIN AND MVPR_DEBITO = 'S' and MVPR_ABONO = 'N'
                    INTO :DEBITO, :RTFTE, :RTIVA, :RTICA;
            else
                SELECT SUM(MVPR_MONTO/MVPR_TRM), sum(mvpr_rtfte/MVPR_TRM), sum(mvpr_rtiva/MVPR_TRM), sum(mvpr_rtica/MVPR_TRM)
                    FROM movimiento_proveedor WHERE TERC_NIT = :NIT AND MVPR_FECHA >= :FECINI AND MVPR_FECHA <= :FECFIN AND MVPR_DEBITO = 'S' and MVPR_ABONO = 'N' AND ((:MONEDA = 0) or (MVPR_TRM <> 1))
                    INTO :DEBITO, :RTFTE, :RTIVA, :RTICA;
            if (DEBITO IS NULL) then
                DEBITO = 0;
            if (RTFTE IS NULL) then
                RTFTE = 0;
            if (RTIVA IS NULL) then
                RTIVA = 0;
            if (RTICA IS NULL) then
                RTICA = 0;
            if (DESCRETE = 'SI') then
                DEBITO = DEBITO - RTFTE - RTIVA - RTICA;
            if (MONEDA = 0) then
                SELECT SUM(MVPR_MONTO), sum(mvpr_rtfte), sum(mvpr_rtiva), sum(mvpr_rtica) FROM movimiento_proveedor
                    WHERE TERC_NIT = :NIT AND MVPR_FECHA >= :FECINI AND MVPR_FECHA <= :FECFIN AND MVPR_DEBITO = 'N' AND MVPR_TIPOREF <> 55 AND MVPR_ABONO = 'N' INTO :CREDITO, :ARTFTE, :ARTIVA, :ARTICA;
            else
                SELECT SUM(MVPR_MONTO/MVPR_TRM), sum(mvpr_rtfte/MVPR_TRM), sum(mvpr_rtiva/MVPR_TRM), sum(mvpr_rtica/MVPR_TRM) FROM movimiento_proveedor
                    WHERE TERC_NIT = :NIT AND MVPR_FECHA >= :FECINI AND MVPR_FECHA <= :FECFIN AND MVPR_DEBITO = 'N' AND MVPR_TIPOREF <> 55 AND MVPR_ABONO = 'N' INTO :CREDITO, :ARTFTE, :ARTIVA, :ARTICA;
            if (CREDITO IS NULL) then
                CREDITO = 0;
            if (ARTFTE IS NULL) then
                ARTFTE = 0;
            if (ARTIVA IS NULL) then
                ARTIVA = 0;
            if (ARTICA IS NULL) then
                ARTICA = 0;
            if (DESCRETE = 'SI') then
                CREDITO = CREDITO - ARTFTE - ARTIVA - ARTICA;
            RTFTE = RTFTE - ARTFTE;
            RTIVA = RTIVA - ARTIVA;
            RTICA = RTICA - ARTICA;
            if (MONEDA = 0) then
                SELECT SUM(MVPR_MONTO), sum(mvpr_rtfte), sum(mvpr_rtiva), sum(mvpr_rtica) FROM movimiento_proveedor
                    WHERE TERC_NIT = :NIT AND MVPR_FECHA >= :FECINI AND MVPR_FECHA <= :FECFIN AND MVPR_ABONO = 'S'
                    INTO :ABONO, :ARTFTE, :ARTIVA, :ARTICA;
            else
                SELECT SUM(MVPR_MONTO/MVPR_TRM), sum(mvpr_rtfte/MVPR_TRM), sum(mvpr_rtiva/MVPR_TRM), sum(mvpr_rtica/MVPR_TRM)
                    FROM movimiento_proveedor
                    WHERE TERC_NIT = :NIT AND MVPR_FECHA >= :FECINI AND MVPR_FECHA <= :FECFIN AND MVPR_ABONO = 'S' AND ((:MONEDA = 0) or (MVPR_TRM <> 1))
                    INTO :ABONO, :ARTFTE, :ARTIVA, :ARTICA;
            if (ABONO IS NULL) then
                ABONO = 0;
            if (ARTFTE IS NULL) then
                ARTFTE = 0;
            if (ARTIVA IS NULL) then
                ARTIVA = 0;
            if (ARTICA IS NULL) then
                ARTICA = 0;
            if (DESCRETE <> 'SI') then
                ABONO = ABONO + ARTFTE + ARTIVA + ARTICA;
            SALDO = INICIAL + DEBITO - CREDITO - ABONO;
            SUSPEND;
            END
        END
    END
END

^

SET TERM ; ^


/* 20090722B */
/* la conciliacion usaba la funcion saldo_proveedor pero esa traia el saldo  */
SET TERM ^ ;

create or alter procedure SALDO_INICIAL_PROVEEDOR (
    NIT varchar(20),
    FECHA date,
    MONEDA integer)
returns (
    SALDO numeric(18,2))
AS
DECLARE VARIABLE sal numeric(18,2);
declare variable TIPODOC INTEGER;
declare variable IDDOC INTEGER;
BEGIN
fecha = fecha - 1;
saldo = 0;
FOR SELECT MVPR_TIPOREF, MVPR_IDREF FROM movimiento_proveedor
    WHERE TERC_NIT = :NIT AND MVPR_FECHA <= :FECHA AND MVPR_ABONO = 'N'
    INTO :TIPODOC, :IDDOC
    DO
    BEGIN
    EXECUTE PROCEDURE saldo_doc_cxpagar(TIPODOC, IDDOC, FECHA, MONEDA) returning_values (SAL);
    if (SAL <> 0) then
        SALDO = SALDO + SAL;
    END
SUSPEND;
END
^

SET TERM ; ^


SET TERM ^ ;

CREATE OR ALTER procedure SALDO_PROVEEDOR (
    NIT varchar(20),
    FECHA date,
    MONEDA integer)
returns (
    SALDO numeric(18,2))
AS
DECLARE VARIABLE sal numeric(18,2);
declare variable TIPODOC INTEGER;
declare variable IDDOC INTEGER;
BEGIN
saldo = 0;
FOR SELECT MVPR_TIPOREF, MVPR_IDREF FROM movimiento_proveedor
    WHERE TERC_NIT = :NIT AND MVPR_FECHA <= :FECHA AND MVPR_ABONO = 'N'
    INTO :TIPODOC, :IDDOC
    DO
    BEGIN
    EXECUTE PROCEDURE saldo_doc_cxpagar(TIPODOC, IDDOC, FECHA, MONEDA) returning_values (SAL);
    if (SAL <> 0) then
        SALDO = SALDO + SAL;
    END
SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE CONCILIA_CXPAGAR(
    FECINI DATE,
    FECFIN DATE,
    CTACART VARCHAR(20),
    SUBEMPRESA INTEGER,
    ANTERIOR CHAR(1))
RETURNS (
    NIT VARCHAR(20),
    NOMBRE VARCHAR(60),
    INICIAL NUMERIC(18,2),
    INICIALC NUMERIC(18,2),
    DEBITOS NUMERIC(18,2),
    DEBITOSC NUMERIC(18,2),
    CREDITOS NUMERIC(18,2),
    CREDITOSC NUMERIC(18,2),
    SALDO NUMERIC(18,2),
    SALDOC NUMERIC(18,2),
    DIFERENCIA NUMERIC(18,2))
AS
 /*$$IBE$$ declare variable ANO CHAR(4);
declare variable MES INTEGER;
declare variable ABONOS NUMERIC(18,2);
declare variable RETES CHAR(2); $$IBE$$*/ 
begin /*$$IBE$$ 
ano = EXTRACT(YEAR FROM FECFIN);
mes = EXTRACT(MONTH FROM FECFIN);

for select TERC_NIT, TERC_NOM from TERCEROS WHERE TERC_PROV = 'S' into :NIT, :NOMBRE
    DO
    BEGIN
    EXECUTE PROCEDURE saldo_proveedor (NIT, FECINI, 0) returning_values (INICIAL);
    EXECUTE PROCEDURE LEE_CONFIGURACION('CXPAGAR', 'SALDOS', 'DESCONTAR RETENCIONES POR CAUSACION') returning_values(:RETES);
    if (RETES = 'SI') then
        BEGIN
        SELECT SUM(MVPR_MONTO-MVPR_RTFTE-MVPR_RTIVA-MVPR_RTICA)
            FROM movimiento_proveedor
            WHERE TERC_NIT = :NIT AND MVPR_FECHA >= :FECINI AND MVPR_FECHA < :FECFIN AND MVPR_DEBITO = 'S'
            INTO :DEBITOS;
        SELECT SUM(MVPR_MONTO-MVPR_RTFTE-MVPR_RTIVA-MVPR_RTICA)
            FROM movimiento_proveedor
            WHERE TERC_NIT = :NIT AND MVPR_FECHA >= :FECINI AND MVPR_FECHA < :FECFIN AND MVPR_DEBITO = 'N' AND MVPR_ABONO = 'N' and MVPR_TIPOREF <> 55
            INTO :CREDITOS;
        SELECT SUM(MVPR_MONTO) FROM movimiento_proveedor
            WHERE TERC_NIT = :NIT AND MVPR_FECHA >= :FECINI AND MVPR_FECHA < :FECFIN AND MVPR_ABONO = 'S'
            INTO :ABONOS;
        END
    ELSE
        BEGIN
        SELECT SUM(MVPR_MONTO)
            FROM movimiento_proveedor
            WHERE TERC_NIT = :NIT AND MVPR_FECHA >= :FECINI AND MVPR_FECHA < :FECFIN AND MVPR_DEBITO = 'S'
            INTO :DEBITOS;
        SELECT SUM(MVPR_MONTO)
            FROM movimiento_proveedor
            WHERE TERC_NIT = :NIT AND MVPR_FECHA >= :FECINI AND MVPR_FECHA < :FECFIN AND MVPR_DEBITO = 'N' AND MVPR_ABONO = 'N' AND MVPR_TIPOREF <> 55
            INTO :CREDITOS;
        SELECT SUM(MVPR_MONTO+MVPR_RTFTE+MVPR_RTIVA+MVPR_RTICA)
            FROM movimiento_proveedor
            WHERE TERC_NIT = :NIT AND MVPR_FECHA >= :FECINI AND MVPR_FECHA < :FECFIN AND MVPR_ABONO = 'S'
            INTO :ABONOS;
        END
    if (DEBITOS IS NULL) then
        DEBITOS = 0;
    if (CREDITOS IS NULL) then
        CREDITOS = 0;
    if (ABONOS IS NULL) then
        ABONOS = 0;
    CREDITOS = CREDITOS + ABONOS;
    SALDO = INICIAL + DEBITOS - CREDITOS;

     $$IBE$$*/ /* LO CONTABLE */ /*$$IBE$$ 
    EXECUTE PROCEDURE SALDO_TERCERO_MES(ctacart, NIT, ANO, MES, 'S') RETURNING_VALUES (INICIALC);
    EXECUTE PROCEDURE MOVIMIENTO_TERCERO_MES(ctacart, NIT, ANO, MES, 'S') RETURNING_VALUES(DEBITOSC);
    EXECUTE PROCEDURE MOVIMIENTO_TERCERO_MES(ctacart, NIT, ANO, MES, 'N') RETURNING_VALUES(CREDITOSC);
    SALDOC = INICIALC + DEBITOSC - CREDITOSC;
    diferencia = SALDO + SALDOC;
    if (DIFERENCIA <> 0) then
        BEGIN
        if (ANTERIOR <> 'S') then
            SUSPEND;
        ELSE
            BEGIN
            if (DIFERENCIA <> (INICIAL + INICIALC)) then
                SUSPEND;
            END
        END
    END
 $$IBE$$*/ SUSPEND;
end
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE IMPR_EGRESO(
    ID INTEGER)
RETURNS (
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    NIT VARCHAR(20),
    NOMBRE VARCHAR(60),
    DIR VARCHAR(60),
    CIU VARCHAR(40),
    TEL VARCHAR(40),
    CONCEPTO VARCHAR(60),
    MONTO NUMERIC(18,2),
    RTFTE NUMERIC(18,2),
    RTIVA NUMERIC(18,2),
    RTICA NUMERIC(18,2),
    DSCTO NUMERIC(18,2),
    OBS BLOB SUB_TYPE 1 SEGMENT SIZE 80,
    ITEMDOC INTEGER,
    TIPODOC VARCHAR(8),
    PREFDOC VARCHAR(4),
    NUMDOC VARCHAR(6),
    NUMPRV VARCHAR(10),
    ABONODOC NUMERIC(18,2),
    RTFTEDOC NUMERIC(18,2),
    RTIVADOC NUMERIC(18,2),
    RTICADOC NUMERIC(18,2),
    DSCTODOC NUMERIC(18,2),
    SALDODOC NUMERIC(18,2),
    SALDOPROV NUMERIC(18,2),
    ANTERDOC NUMERIC(18,2))
AS
 /*$$IBE$$ declare variable NUMROWS INTEGER;
declare variable TIPO integer;
declare variable IDDOC INTEGER; $$IBE$$*/ 
BEGIN /*$$IBE$$ 
  SELECT PREF_PRE, EGRE_NUMERO, EGRE_FECHA, EGRE_CONC,
        E.TERC_NIT, EGRE_NOMTERC, TERC_DIR, TERC_CIU, TERC_TEL,
        EGRE_MONTO, EGRE_RTFTEMONTO, EGRE_RTIVAMONTO, EGRE_RTICAMONTO, EGRE_DTOF,
        EGRE_OBS
    FROM EGRESOS E, TERCEROS T
    WHERE E.TERC_NIT = T.TERC_NIT AND E.EGRE_ID = :ID
    INTO :PREFIJO, :NUMERO, :FECHA, :CONCEPTO, 
        :NIT, :NOMBRE, :DIR, :CIU, :TEL,
        :MONTO, :RTFTE, :RTIVA, :RTICA, :DSCTO,
        :OBS;
  select SALDO from saldo_proveedor(:NIT, :FECHA+1, 0) into :SALDOPROV;
  SELECT COUNT(EGDE_ITEM) FROM EGRESOS_DETALLE
    WHERE EGRE_ID = :ID INTO :NUMROWS;
  if (NUMROWS > 0) then
    FOR SELECT EGDE_ITEM, EGDE_TIPODOC, TIDO_NOMCORTO, EGDE_IDDOC, EGDE_PREFIJO, EGDE_NUMERO, EGDE_ABONO, EGDE_RTFTE, EGDE_RTIVA, EGDE_RTICA, EGDE_DTOF
        FROM EGRESOS_DETALLE ED, TIPO_DOCUMENTO TD
        WHERE TD.TIDO_COD = ED.EGDE_TIPODOC AND ED.EGRE_ID = :ID
        order by egde_item
        INTO :ITEMDOC, :TIPO, :TIPODOC, :IDDOC, :PREFDOC, :NUMDOC, :ABONODOC, :RTFTEDOC, :RTIVADOC, :RTICADOC, :DSCTODOC
        DO
            BEGIN
            if (TIPO = 21) then
                SELECT FACO_NUMPROV FROM FACTURAS_COMPRA WHERE FACO_ID = :iddoc INTO :numprv;
            ELSE
                if (TIPO = 51) then
                    SELECT NDPR_NUMPROV FROM NOTAS_DEBITO_PROVEEDOR WHERE NDPR_ID = :iddoc INTO :numprv;
                ELSE
                    numprv = numdoc;
            EXECUTE PROCEDURE saldo_doc_cxpagar(:TIPO, :IDDOC, :FECHA, 0) returning_values (:SALDODOC);
            ANTERDOC = SALDODOC + RTFTEDOC + RTIVADOC + RTICADOC + ABONODOC + DSCTODOC;
            SUSPEND;
            END
  else
    BEGIN
    SALDOPROV = 0;
    ANTERDOC = 0;
    SALDODOC = 0;
    RTFTEDOC = 0;
    RTIVADOC = 0;
    RTICADOC = 0;
    ABONODOC = 0;
    DSCTODOC = 0;
    numprv = '';
    SUSPEND;
    END
 $$IBE$$*/ SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE MOVIMIENTO_CXPAGAR_DESDE_HASTA(
    NIT VARCHAR(20),
    DESDE DATE,
    HASTA DATE,
    MONEDA INTEGER)
RETURNS (
    INICIAL NUMERIC(18,2),
    TIPODOC VARCHAR(8),
    IDDOC INTEGER,
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    CONCEPTO VARCHAR(60),
    DEBITO NUMERIC(18,2),
    CREDITO NUMERIC(18,2),
    SALDO NUMERIC(18,2),
    NOMBRE VARCHAR(60),
    RTFTE NUMERIC(18,2),
    RTIVA NUMERIC(18,2),
    RTICA NUMERIC(18,2),
    NUMPROV VARCHAR(20))
AS
 /*$$IBE$$ declare variable DB CHAR(1);
declare variable AB CHAR(1);
declare variable RETES CHAR(2);
declare variable TRM NUMERIC(18,2); $$IBE$$*/ 
BEGIN
  /* Ubique el NIT */ /*$$IBE$$ 
  select terc_nom from terceros where terc_nit = :NIT INTO :NOMBRE;
  execute procedure saldo_proveedor (NIT, DESDE, MONEDA) returning_values (INICIAL);
  if (INICIAL is null) then
    INICIAL = 0;
  SALDO = INICIAL;
  EXECUTE PROCEDURE LEE_CONFIGURACION('CXPAGAR', 'SALDOS', 'DESCONTAR RETENCIONES POR CAUSACION') returning_values(:RETES);
  FOR select tido_nomcorto, mvpr_idref, mvpr_prefijo, mvpr_numero, mvpr_fecha, mvpr_conc, mvpr_monto, mvpr_debito, mvpr_rtfte, mvpr_rtiva, mvpr_rtica, mvpr_abono, MVPR_TRM
    from movimiento_proveedor m, tipo_documento t
    where m.mvpr_tiporef = t.tido_cod and terc_nit = :NIT and mvpr_fecha >= :DESDE and mvpr_fecha <= :HASTA AND mvpr_tiporef <> 55 AND ((:MONEDA = 0) or (MVPR_TRM <> 1))
    order by mvpr_fecha, mvpr_tiporef
    into :TIPODOC, :IDDOC, :PREFIJO, :NUMERO, :FECHA, :CONCEPTO, :DEBITO, :DB, :RTFTE, :RTIVA, :RTICA, :AB, :TRM
    DO
    BEGIN
    if (DB = 'N') then
        BEGIN
        if (AB = 'S') then
            if (RETES = 'SI') then
                CREDITO = DEBITO;
            ELSE
                CREDITO = DEBITO + RTFTE + RTIVA + RTICA;
        ELSE
            if (RETES = 'SI') then
                CREDITO = DEBITO - RTFTE - RTIVA - RTICA;
            ELSE
                CREDITO = DEBITO;
        DEBITO = 0;
        END
    ELSE
        BEGIN
        if (RETES = 'SI') then
            DEBITO = DEBITO - RTFTE - RTIVA - RTICA;
        CREDITO = 0;
        END
    if ((MONEDA <> 0) AND (TRM <> 0)) then
        BEGIN
        DEBITO = DEBITO / TRM;
        CREDITO = CREDITO / TRM;
        RTFTE = RTFTE / TRM;
        RTIVA = RTIVA / TRM;
        RTICA = RTICA / TRM;
        END
    SALDO = SALDO + DEBITO - CREDITO;
    NUMPROV = '';
    if (TIPODOC = 'CARGOACR') then
        SELECT NDPR_NUMPROV FROM NOTAS_DEBITO_PROVEEDOR WHERE NDPR_ID = :IDDOC INTO :NUMPROV;
    if (TIPODOC = 'FACTCOMP') then
        SELECT FACO_NUMPROV FROM FACTURAS_COMPRA WHERE FACO_ID = :IDDOC INTO :NUMPROV;
    SUSPEND;
    END
 $$IBE$$*/ SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE MOVIMIENTO_CXPAGAR_MES(
    FECINI DATE,
    FECFIN DATE,
    MONEDA INTEGER)
RETURNS (
    NIT VARCHAR(20),
    NOMBRE VARCHAR(60),
    GRUPO VARCHAR(2),
    INICIAL NUMERIC(18,4),
    DEBITOS NUMERIC(18,4),
    CREDITOS NUMERIC(18,4),
    ABONOS NUMERIC(18,4),
    FINAL NUMERIC(18,4))
AS
 /*$$IBE$$ declare variable RETES CHAR(2); $$IBE$$*/ 
BEGIN /*$$IBE$$ 
  for select TERC_NIT, TERC_NOM from TERCEROS WHERE TERC_PROV = 'S' into :NIT, :NOMBRE
  DO
    BEGIN
    SELECT GRPR_COD FROM PROVEEDORES WHERE TERC_NIT = :NIT INTO :grupo;
    EXECUTE PROCEDURE saldo_proveedor (NIT, FECINI, MONEDA) returning_values (INICIAL);
    EXECUTE PROCEDURE LEE_CONFIGURACION('CXPAGAR', 'SALDOS', 'DESCONTAR RETENCIONES POR CAUSACION') returning_values(:RETES);
    if (RETES = 'SI') then
        BEGIN
        SELECT SUM((MVPR_MONTO-MVPR_RTFTE-MVPR_RTIVA-MVPR_RTICA)/MVPR_TRM)
            FROM movimiento_proveedor
            WHERE TERC_NIT = :NIT AND MVPR_FECHA >= :FECINI AND MVPR_FECHA <= :FECFIN AND MVPR_DEBITO = 'S' AND ((:MONEDA = 0) or (MVPR_TRM <> 1))
            INTO :DEBITOS;
        SELECT SUM((MVPR_MONTO-MVPR_RTFTE-MVPR_RTIVA-MVPR_RTICA)/MVPR_TRM)
            FROM movimiento_proveedor
            WHERE TERC_NIT = :NIT AND MVPR_FECHA >= :FECINI AND MVPR_FECHA <= :FECFIN AND MVPR_DEBITO = 'N' AND MVPR_ABONO = 'N' and MVPR_TIPOREF <> 55 AND ((:MONEDA = 0) or (MVPR_TRM <> 1))
            INTO :CREDITOS;
        SELECT SUM(MVPR_MONTO/MVPR_TRM) FROM movimiento_proveedor
            WHERE TERC_NIT = :NIT AND MVPR_FECHA >= :FECINI AND MVPR_FECHA <= :FECFIN AND MVPR_ABONO = 'S' AND ((:MONEDA = 0) or (MVPR_TRM <> 1))
            INTO :ABONOS;
        END
    ELSE
        BEGIN
        SELECT SUM(MVPR_MONTO/MVPR_TRM)
            FROM movimiento_proveedor
            WHERE TERC_NIT = :NIT AND MVPR_FECHA >= :FECINI AND MVPR_FECHA <= :FECFIN AND MVPR_DEBITO = 'S' AND ((:MONEDA = 0) or (MVPR_TRM <> 1))
            INTO :DEBITOS;
        SELECT SUM(MVPR_MONTO/MVPR_TRM)
            FROM movimiento_proveedor
            WHERE TERC_NIT = :NIT AND MVPR_FECHA >= :FECINI AND MVPR_FECHA <= :FECFIN AND MVPR_DEBITO = 'N' AND MVPR_ABONO = 'N' AND MVPR_TIPOREF <> 55 AND ((:MONEDA = 0) or (MVPR_TRM <> 1))
            INTO :CREDITOS;
        SELECT SUM((MVPR_MONTO+MVPR_RTFTE+MVPR_RTIVA+MVPR_RTICA)/MVPR_TRM)
            FROM movimiento_proveedor
            WHERE TERC_NIT = :NIT AND MVPR_FECHA >= :FECINI AND MVPR_FECHA <= :FECFIN AND MVPR_ABONO = 'S' AND ((:MONEDA = 0) or (MVPR_TRM <> 1))
            INTO :ABONOS;
        END
    if (DEBITOS IS NULL) then
        DEBITOS = 0;
    if (CREDITOS IS NULL) then
        CREDITOS = 0;
    if (ABONOS IS NULL) then
        ABONOS = 0;
    FINAL = INICIAL + DEBITOS - CREDITOS - ABONOS;
    SUSPEND;
    END
 $$IBE$$*/ SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE REP_MOVIMIENTO_PROVEEDOR(
    DESDE VARCHAR(20),
    HASTA VARCHAR(20),
    GRPINI VARCHAR(5),
    GRPFIN VARCHAR(5),
    FECINI DATE,
    FECFIN DATE,
    DETALLE CHAR(1),
    ORDEN CHAR(1),
    AGRUPA CHAR(1),
    MONEDA INTEGER)
RETURNS (
    NIT VARCHAR(20),
    NOMBRE VARCHAR(60),
    TELEFONO VARCHAR(40),
    CIUDAD VARCHAR(40),
    CODZONA VARCHAR(2),
    NOMZONA VARCHAR(60),
    DV CHAR(1),
    CODCIUD CHAR(5),
    NOMCIUD VARCHAR(60),
    INICIAL NUMERIC(18,2),
    TIPODOC VARCHAR(8),
    IDDOC INTEGER,
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    CONCEPTO VARCHAR(60),
    DEBITO NUMERIC(18,2),
    CREDITO NUMERIC(18,2),
    ABONO NUMERIC(18,2),
    SALDO NUMERIC(18,2),
    RTFTE NUMERIC(18,2),
    RTIVA NUMERIC(18,2),
    RTICA NUMERIC(18,2),
    ARTFTE NUMERIC(18,2),
    ARTIVA NUMERIC(18,2),
    ARTICA NUMERIC(18,2))
AS
 /*$$IBE$$ declare variable NITINI VARCHAR(20);
declare variable NITFIN VARCHAR(20);
declare variable NOMINI VARCHAR(20);
declare variable NOMFIN VARCHAR(20);
declare variable OK CHAR(1);
declare variable DB CHAR(1);
declare variable AB CHAR(1);
declare variable DESCRETE CHAR(2);
declare variable TRM NUMERIC(18,2); $$IBE$$*/ 
BEGIN /*$$IBE$$ 
if (ORDEN = 'C') then
    BEGIN
    NITINI = DESDE;
    NITFIN = HASTA;
    NOMINI = '';
    NOMFIN = 'zz';
    END
ELSE
    BEGIN
    NOMINI = DESDE;
    NOMFIN = HASTA;
    NITINI = '';
    NITFIN = 'zz';
    END
EXECUTE PROCEDURE LEE_CONFIGURACION('CXPAGAR', 'SALDOS', 'DESCONTAR RETENCIONES POR CAUSACION') returning_values (DESCRETE);
 $$IBE$$*/ /* Ubique el NIT */ /*$$IBE$$ 
FOR select T.TERC_NIT, TERC_NOM, TERC_DV, TERC_TEL, TERC_CIU, P.GRPR_COD, T.CIUD_COD
    from terceros T, PROVEEDORES P
    where P.TERC_NIT = T.TERC_NIT AND TERC_PROV = 'S' AND T.TERC_NIT >= :NITINI AND T.TERC_NIT <= :NITFIN AND
        TERC_NOM >= :NOMINI AND TERC_NOM <= :NOMFIN
    INTO :NIT, :NOMBRE, :DV, :TELEFONO, :CIUDAD, :CODZONA, :CODCIUD
    DO  
    BEGIN

    SELECT GRPR_NOM FROM GRUPOS_PROVEEDORES WHERE GRPR_COD = :CODZONA INTO :NOMZONA;
    SELECT CIUD_NOM FROM CIUDADES WHERE CIUD_COD = :CODCIUD INTO :NOMCIUD;
    OK = 'N';
    if (AGRUPA = 'Z') then
        BEGIN
        if (GRPINI = '') then
            BEGIN
            if ((CODZONA IS NULL) or (CODZONA >= :GRPINI AND CODZONA <= :GRPFIN)) then
                OK = 'S';
            END
        ELSE
            if (CODZONA >= :GRPINI AND CODZONA <= :GRPFIN) then
                OK = 'S';
        END
    if (AGRUPA = 'C') then
        BEGIN
        if (GRPINI = '') then
            BEGIN
            if ((CODCIUD IS NULL) or (CODCIUD >= :GRPINI AND CODCIUD <= :GRPFIN)) then
                OK = 'S';
            END
        ELSE
            if (CODCIUD >= :GRPINI AND CODCIUD <= :GRPFIN) then
                OK = 'S';
        END
    if (AGRUPA = 'N') then
        OK = 'S';
        
    if (OK = 'S') then
        BEGIN
        execute procedure saldo_proveedor (NIT, FECINI, MONEDA) returning_values (INICIAL);
        if (INICIAL is null) then
            INICIAL = 0;
        SALDO = INICIAL;
        if (DETALLE = 'S') then
          BEGIN
          FOR select tido_nomcorto, mvpr_idref, mvpr_prefijo, mvpr_numero, mvpr_fecha, mvpr_conc, mvpr_monto, mvpr_debito, mvpr_rtfte, mvpr_rtiva, mvpr_rtica, mvpr_abono, MVPR_TRM
            from movimiento_proveedor m, tipo_documento t
            where m.mvpr_tiporef = t.tido_cod and terc_nit = :NIT and mvpr_fecha >= :FECINI and mvpr_fecha <= :FECFIN AND MVPR_TIPOREF <> 55 AND ((:MONEDA = 0) or (MVPR_TRM <> 1))
            order by mvpr_fecha, mvpr_tiporef
            into :TIPODOC, :IDDOC, :PREFIJO, :NUMERO, :FECHA, :CONCEPTO, :DEBITO, :DB, :RTFTE, :RTIVA, :RTICA, :AB, :TRM
            DO
            BEGIN
            if (RTFTE IS NULL) then
                RTFTE = 0;
            if (RTIVA IS NULL) then
                RTIVA = 0;
            if (RTICA IS NULL) then
                RTICA = 0;
            if (DB = 'N') then
                BEGIN
                CREDITO = DEBITO;
                DEBITO = 0;
                RTFTE = RTFTE * -1;
                RTIVA = RTIVA * -1;
                RTICA = RTICA * -1;
                END
            ELSE
                CREDITO = 0;
            if ((MONEDA <> 0) AND (TRM <> 0)) then
                BEGIN
                DEBITO = DEBITO / TRM;
                CREDITO = CREDITO / TRM;
                RTFTE = RTFTE / TRM;
                RTIVA = RTIVA / TRM;
                RTICA = RTICA / TRM;
                END
            SALDO = SALDO + DEBITO - CREDITO;
            if (AB = 'N') then
                BEGIN
                if (DESCRETE = 'SI') then
                    SALDO = SALDO - RTFTE - RTIVA - RTICA;
                ABONO = 0;
                END
            ELSE
                BEGIN
                ABONO = CREDITO;
                CREDITO = 0;
                if (DESCRETE <> 'SI') then
                    SALDO = SALDO + RTFTE + RTIVA + RTICA;
                END
            SUSPEND;
            END
          END
        ELSE
            BEGIN
            if (MONEDA = 0) then
                SELECT SUM(MVPR_MONTO), sum(mvpr_rtfte), sum(mvpr_rtiva), sum(mvpr_rtica)
                    FROM movimiento_proveedor WHERE TERC_NIT = :NIT AND MVPR_FECHA >= :FECINI AND MVPR_FECHA <= :FECFIN AND MVPR_DEBITO = 'S' and MVPR_ABONO = 'N'
                    INTO :DEBITO, :RTFTE, :RTIVA, :RTICA;
            else
                SELECT SUM(MVPR_MONTO/MVPR_TRM), sum(mvpr_rtfte/MVPR_TRM), sum(mvpr_rtiva/MVPR_TRM), sum(mvpr_rtica/MVPR_TRM)
                    FROM movimiento_proveedor WHERE TERC_NIT = :NIT AND MVPR_FECHA >= :FECINI AND MVPR_FECHA <= :FECFIN AND MVPR_DEBITO = 'S' and MVPR_ABONO = 'N' AND ((:MONEDA = 0) or (MVPR_TRM <> 1))
                    INTO :DEBITO, :RTFTE, :RTIVA, :RTICA;
            if (DEBITO IS NULL) then
                DEBITO = 0;
            if (RTFTE IS NULL) then
                RTFTE = 0;
            if (RTIVA IS NULL) then
                RTIVA = 0;
            if (RTICA IS NULL) then
                RTICA = 0;
            if (DESCRETE = 'SI') then
                DEBITO = DEBITO - RTFTE - RTIVA - RTICA;
            if (MONEDA = 0) then
                SELECT SUM(MVPR_MONTO), sum(mvpr_rtfte), sum(mvpr_rtiva), sum(mvpr_rtica) FROM movimiento_proveedor
                    WHERE TERC_NIT = :NIT AND MVPR_FECHA >= :FECINI AND MVPR_FECHA <= :FECFIN AND MVPR_DEBITO = 'N' AND MVPR_TIPOREF <> 55 AND MVPR_ABONO = 'N' INTO :CREDITO, :ARTFTE, :ARTIVA, :ARTICA;
            else
                SELECT SUM(MVPR_MONTO/MVPR_TRM), sum(mvpr_rtfte/MVPR_TRM), sum(mvpr_rtiva/MVPR_TRM), sum(mvpr_rtica/MVPR_TRM) FROM movimiento_proveedor
                    WHERE TERC_NIT = :NIT AND MVPR_FECHA >= :FECINI AND MVPR_FECHA <= :FECFIN AND MVPR_DEBITO = 'N' AND MVPR_TIPOREF <> 55 AND MVPR_ABONO = 'N' INTO :CREDITO, :ARTFTE, :ARTIVA, :ARTICA;
            if (CREDITO IS NULL) then
                CREDITO = 0;
            if (ARTFTE IS NULL) then
                ARTFTE = 0;
            if (ARTIVA IS NULL) then
                ARTIVA = 0;
            if (ARTICA IS NULL) then
                ARTICA = 0;
            if (DESCRETE = 'SI') then
                CREDITO = CREDITO - ARTFTE - ARTIVA - ARTICA;
            RTFTE = RTFTE - ARTFTE;
            RTIVA = RTIVA - ARTIVA;
            RTICA = RTICA - ARTICA;
            if (MONEDA = 0) then
                SELECT SUM(MVPR_MONTO), sum(mvpr_rtfte), sum(mvpr_rtiva), sum(mvpr_rtica) FROM movimiento_proveedor
                    WHERE TERC_NIT = :NIT AND MVPR_FECHA >= :FECINI AND MVPR_FECHA <= :FECFIN AND MVPR_ABONO = 'S'
                    INTO :ABONO, :ARTFTE, :ARTIVA, :ARTICA;
            else
                SELECT SUM(MVPR_MONTO/MVPR_TRM), sum(mvpr_rtfte/MVPR_TRM), sum(mvpr_rtiva/MVPR_TRM), sum(mvpr_rtica/MVPR_TRM)
                    FROM movimiento_proveedor
                    WHERE TERC_NIT = :NIT AND MVPR_FECHA >= :FECINI AND MVPR_FECHA <= :FECFIN AND MVPR_ABONO = 'S' AND ((:MONEDA = 0) or (MVPR_TRM <> 1))
                    INTO :ABONO, :ARTFTE, :ARTIVA, :ARTICA;
            if (ABONO IS NULL) then
                ABONO = 0;
            if (ARTFTE IS NULL) then
                ARTFTE = 0;
            if (ARTIVA IS NULL) then
                ARTIVA = 0;
            if (ARTICA IS NULL) then
                ARTICA = 0;
            if (DESCRETE <> 'SI') then
                ABONO = ABONO + ARTFTE + ARTIVA + ARTICA;
            SALDO = INICIAL + DEBITO - CREDITO - ABONO;
            SUSPEND;
            END
        END
    END
 $$IBE$$*/ SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE CONCILIA_CXPAGAR(
    FECINI DATE,
    FECFIN DATE,
    CTACART VARCHAR(20),
    SUBEMPRESA INTEGER,
    ANTERIOR CHAR(1))
RETURNS (
    NIT VARCHAR(20),
    NOMBRE VARCHAR(60),
    INICIAL NUMERIC(18,2),
    INICIALC NUMERIC(18,2),
    DEBITOS NUMERIC(18,2),
    DEBITOSC NUMERIC(18,2),
    CREDITOS NUMERIC(18,2),
    CREDITOSC NUMERIC(18,2),
    SALDO NUMERIC(18,2),
    SALDOC NUMERIC(18,2),
    DIFERENCIA NUMERIC(18,2))
AS
declare variable ANO CHAR(4);
declare variable MES INTEGER;
declare variable ABONOS NUMERIC(18,2);
declare variable RETES CHAR(2);
begin
ano = EXTRACT(YEAR FROM FECFIN);
mes = EXTRACT(MONTH FROM FECFIN);

for select TERC_NIT, TERC_NOM from TERCEROS WHERE TERC_PROV = 'S' into :NIT, :NOMBRE
    DO
    BEGIN
    EXECUTE PROCEDURE saldo_inicial_proveedor (NIT, FECINI, 0) returning_values (INICIAL);
    EXECUTE PROCEDURE LEE_CONFIGURACION('CXPAGAR', 'SALDOS', 'DESCONTAR RETENCIONES POR CAUSACION') returning_values(:RETES);
    if (RETES = 'SI') then
        BEGIN
        SELECT SUM(MVPR_MONTO-MVPR_RTFTE-MVPR_RTIVA-MVPR_RTICA)
            FROM movimiento_proveedor
            WHERE TERC_NIT = :NIT AND MVPR_FECHA >= :FECINI AND MVPR_FECHA <= :FECFIN AND MVPR_DEBITO = 'S'
            INTO :CREDITOS;
        SELECT SUM(MVPR_MONTO-MVPR_RTFTE-MVPR_RTIVA-MVPR_RTICA)
            FROM movimiento_proveedor
            WHERE TERC_NIT = :NIT AND MVPR_FECHA >= :FECINI AND MVPR_FECHA <= :FECFIN AND MVPR_DEBITO = 'N' AND MVPR_ABONO = 'N' and MVPR_TIPOREF <> 55
            INTO :DEBITOS;
        SELECT SUM(MVPR_MONTO) FROM movimiento_proveedor
            WHERE TERC_NIT = :NIT AND MVPR_FECHA >= :FECINI AND MVPR_FECHA <= :FECFIN AND MVPR_ABONO = 'S'
            INTO :ABONOS;
        END
    ELSE
        BEGIN
        SELECT SUM(MVPR_MONTO)
            FROM movimiento_proveedor
            WHERE TERC_NIT = :NIT AND MVPR_FECHA >= :FECINI AND MVPR_FECHA <= :FECFIN AND MVPR_DEBITO = 'S'
            INTO :CREDITOS;
        SELECT SUM(MVPR_MONTO)
            FROM movimiento_proveedor
            WHERE TERC_NIT = :NIT AND MVPR_FECHA >= :FECINI AND MVPR_FECHA <= :FECFIN AND MVPR_DEBITO = 'N' AND MVPR_ABONO = 'N' AND MVPR_TIPOREF <> 55
            INTO :DEBITOS;
        SELECT SUM(MVPR_MONTO+MVPR_RTFTE+MVPR_RTIVA+MVPR_RTICA)
            FROM movimiento_proveedor
            WHERE TERC_NIT = :NIT AND MVPR_FECHA >= :FECINI AND MVPR_FECHA <= :FECFIN AND MVPR_ABONO = 'S'
            INTO :ABONOS;
        END
    if (DEBITOS IS NULL) then
        DEBITOS = 0;
    if (CREDITOS IS NULL) then
        CREDITOS = 0;
    if (ABONOS IS NULL) then
        ABONOS = 0;
    DEBITOS = DEBITOS + ABONOS;
    SALDO = INICIAL - DEBITOS + CREDITOS;

    /* LO CONTABLE */
    EXECUTE PROCEDURE SALDO_TERCERO_MES(ctacart, NIT, ANO, MES, 'S') RETURNING_VALUES (INICIALC);
    EXECUTE PROCEDURE MOVIMIENTO_TERCERO_MES(ctacart, NIT, ANO, MES, 'S') RETURNING_VALUES(DEBITOSC);
    EXECUTE PROCEDURE MOVIMIENTO_TERCERO_MES(ctacart, NIT, ANO, MES, 'N') RETURNING_VALUES(CREDITOSC);
    SALDOC = INICIALC + DEBITOSC - CREDITOSC;
    diferencia = SALDO + SALDOC;
    if (DIFERENCIA <> 0) then
        BEGIN
        if (ANTERIOR <> 'S') then
            SUSPEND;
        ELSE
            BEGIN
            if (DIFERENCIA <> (INICIAL + INICIALC)) then
                SUSPEND;
            END
        END
    END
end

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE IMPR_EGRESO(
    ID INTEGER)
RETURNS (
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    NIT VARCHAR(20),
    NOMBRE VARCHAR(60),
    DIR VARCHAR(60),
    CIU VARCHAR(40),
    TEL VARCHAR(40),
    CONCEPTO VARCHAR(60),
    MONTO NUMERIC(18,2),
    RTFTE NUMERIC(18,2),
    RTIVA NUMERIC(18,2),
    RTICA NUMERIC(18,2),
    DSCTO NUMERIC(18,2),
    OBS BLOB SUB_TYPE 1 SEGMENT SIZE 80,
    ITEMDOC INTEGER,
    TIPODOC VARCHAR(8),
    PREFDOC VARCHAR(4),
    NUMDOC VARCHAR(6),
    NUMPRV VARCHAR(10),
    ABONODOC NUMERIC(18,2),
    RTFTEDOC NUMERIC(18,2),
    RTIVADOC NUMERIC(18,2),
    RTICADOC NUMERIC(18,2),
    DSCTODOC NUMERIC(18,2),
    SALDODOC NUMERIC(18,2),
    SALDOPROV NUMERIC(18,2),
    ANTERDOC NUMERIC(18,2))
AS
declare variable NUMROWS INTEGER;
declare variable TIPO integer;
declare variable IDDOC INTEGER;
BEGIN
  SELECT PREF_PRE, EGRE_NUMERO, EGRE_FECHA, EGRE_CONC,
        E.TERC_NIT, EGRE_NOMTERC, TERC_DIR, TERC_CIU, TERC_TEL,
        EGRE_MONTO, EGRE_RTFTEMONTO, EGRE_RTIVAMONTO, EGRE_RTICAMONTO, EGRE_DTOF,
        EGRE_OBS
    FROM EGRESOS E, TERCEROS T
    WHERE E.TERC_NIT = T.TERC_NIT AND E.EGRE_ID = :ID
    INTO :PREFIJO, :NUMERO, :FECHA, :CONCEPTO, 
        :NIT, :NOMBRE, :DIR, :CIU, :TEL,
        :MONTO, :RTFTE, :RTIVA, :RTICA, :DSCTO,
        :OBS;
  select SALDO from saldo_proveedor(:NIT, :FECHA, 0) into :SALDOPROV;
  SELECT COUNT(EGDE_ITEM) FROM EGRESOS_DETALLE
    WHERE EGRE_ID = :ID INTO :NUMROWS;
  if (NUMROWS > 0) then
    FOR SELECT EGDE_ITEM, EGDE_TIPODOC, TIDO_NOMCORTO, EGDE_IDDOC, EGDE_PREFIJO, EGDE_NUMERO, EGDE_ABONO, EGDE_RTFTE, EGDE_RTIVA, EGDE_RTICA, EGDE_DTOF
        FROM EGRESOS_DETALLE ED, TIPO_DOCUMENTO TD
        WHERE TD.TIDO_COD = ED.EGDE_TIPODOC AND ED.EGRE_ID = :ID
        order by egde_item
        INTO :ITEMDOC, :TIPO, :TIPODOC, :IDDOC, :PREFDOC, :NUMDOC, :ABONODOC, :RTFTEDOC, :RTIVADOC, :RTICADOC, :DSCTODOC
        DO
            BEGIN
            if (TIPO = 21) then
                SELECT FACO_NUMPROV FROM FACTURAS_COMPRA WHERE FACO_ID = :iddoc INTO :numprv;
            ELSE
                if (TIPO = 51) then
                    SELECT NDPR_NUMPROV FROM NOTAS_DEBITO_PROVEEDOR WHERE NDPR_ID = :iddoc INTO :numprv;
                ELSE
                    numprv = numdoc;
            EXECUTE PROCEDURE saldo_doc_cxpagar(:TIPO, :IDDOC, :FECHA, 0) returning_values (:SALDODOC);
            ANTERDOC = SALDODOC + RTFTEDOC + RTIVADOC + RTICADOC + ABONODOC + DSCTODOC;
            SUSPEND;
            END
  else
    BEGIN
    SALDOPROV = 0;
    ANTERDOC = 0;
    SALDODOC = 0;
    RTFTEDOC = 0;
    RTIVADOC = 0;
    RTICADOC = 0;
    ABONODOC = 0;
    DSCTODOC = 0;
    numprv = '';
    SUSPEND;
    END
END

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE MOVIMIENTO_CXPAGAR_DESDE_HASTA(
    NIT VARCHAR(20),
    DESDE DATE,
    HASTA DATE,
    MONEDA INTEGER)
RETURNS (
    INICIAL NUMERIC(18,2),
    TIPODOC VARCHAR(8),
    IDDOC INTEGER,
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    CONCEPTO VARCHAR(60),
    DEBITO NUMERIC(18,2),
    CREDITO NUMERIC(18,2),
    SALDO NUMERIC(18,2),
    NOMBRE VARCHAR(60),
    RTFTE NUMERIC(18,2),
    RTIVA NUMERIC(18,2),
    RTICA NUMERIC(18,2),
    NUMPROV VARCHAR(20))
AS
declare variable DB CHAR(1);
declare variable AB CHAR(1);
declare variable RETES CHAR(2);
declare variable TRM NUMERIC(18,2);
BEGIN
  /* Ubique el NIT */
  select terc_nom from terceros where terc_nit = :NIT INTO :NOMBRE;
  execute procedure saldo_inicial_proveedor (NIT, DESDE, MONEDA) returning_values (INICIAL);
  if (INICIAL is null) then
    INICIAL = 0;
  SALDO = INICIAL;
  EXECUTE PROCEDURE LEE_CONFIGURACION('CXPAGAR', 'SALDOS', 'DESCONTAR RETENCIONES POR CAUSACION') returning_values(:RETES);
  FOR select tido_nomcorto, mvpr_idref, mvpr_prefijo, mvpr_numero, mvpr_fecha, mvpr_conc, mvpr_monto, mvpr_debito, mvpr_rtfte, mvpr_rtiva, mvpr_rtica, mvpr_abono, MVPR_TRM
    from movimiento_proveedor m, tipo_documento t
    where m.mvpr_tiporef = t.tido_cod and terc_nit = :NIT and mvpr_fecha >= :DESDE and mvpr_fecha <= :HASTA AND mvpr_tiporef <> 55 AND ((:MONEDA = 0) or (MVPR_TRM <> 1))
    order by mvpr_fecha, mvpr_tiporef
    into :TIPODOC, :IDDOC, :PREFIJO, :NUMERO, :FECHA, :CONCEPTO, :DEBITO, :DB, :RTFTE, :RTIVA, :RTICA, :AB, :TRM
    DO
    BEGIN
    if (DB = 'N') then
        BEGIN
        if (AB = 'S') then
            if (RETES = 'SI') then
                CREDITO = DEBITO;
            ELSE
                CREDITO = DEBITO + RTFTE + RTIVA + RTICA;
        ELSE
            if (RETES = 'SI') then
                CREDITO = DEBITO - RTFTE - RTIVA - RTICA;
            ELSE
                CREDITO = DEBITO;
        DEBITO = 0;
        END
    ELSE
        BEGIN
        if (RETES = 'SI') then
            DEBITO = DEBITO - RTFTE - RTIVA - RTICA;
        CREDITO = 0;
        END
    if ((MONEDA <> 0) AND (TRM <> 0)) then
        BEGIN
        DEBITO = DEBITO / TRM;
        CREDITO = CREDITO / TRM;
        RTFTE = RTFTE / TRM;
        RTIVA = RTIVA / TRM;
        RTICA = RTICA / TRM;
        END
    SALDO = SALDO + DEBITO - CREDITO;
    NUMPROV = '';
    if (TIPODOC = 'CARGOACR') then
        SELECT NDPR_NUMPROV FROM NOTAS_DEBITO_PROVEEDOR WHERE NDPR_ID = :IDDOC INTO :NUMPROV;
    if (TIPODOC = 'FACTCOMP') then
        SELECT FACO_NUMPROV FROM FACTURAS_COMPRA WHERE FACO_ID = :IDDOC INTO :NUMPROV;
    SUSPEND;
    END
END

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE MOVIMIENTO_CXPAGAR_MES(
    FECINI DATE,
    FECFIN DATE,
    MONEDA INTEGER)
RETURNS (
    NIT VARCHAR(20),
    NOMBRE VARCHAR(60),
    GRUPO VARCHAR(2),
    INICIAL NUMERIC(18,4),
    DEBITOS NUMERIC(18,4),
    CREDITOS NUMERIC(18,4),
    ABONOS NUMERIC(18,4),
    FINAL NUMERIC(18,4))
AS
declare variable RETES CHAR(2);
BEGIN
  for select TERC_NIT, TERC_NOM from TERCEROS WHERE TERC_PROV = 'S' into :NIT, :NOMBRE
  DO
    BEGIN
    SELECT GRPR_COD FROM PROVEEDORES WHERE TERC_NIT = :NIT INTO :grupo;
    EXECUTE PROCEDURE saldo_inicial_proveedor (NIT, FECINI, MONEDA) returning_values (INICIAL);
    EXECUTE PROCEDURE LEE_CONFIGURACION('CXPAGAR', 'SALDOS', 'DESCONTAR RETENCIONES POR CAUSACION') returning_values(:RETES);
    if (RETES = 'SI') then
        BEGIN
        SELECT SUM((MVPR_MONTO-MVPR_RTFTE-MVPR_RTIVA-MVPR_RTICA)/MVPR_TRM)
            FROM movimiento_proveedor
            WHERE TERC_NIT = :NIT AND MVPR_FECHA >= :FECINI AND MVPR_FECHA <= :FECFIN AND MVPR_DEBITO = 'S' AND ((:MONEDA = 0) or (MVPR_TRM <> 1))
            INTO :DEBITOS;
        SELECT SUM((MVPR_MONTO-MVPR_RTFTE-MVPR_RTIVA-MVPR_RTICA)/MVPR_TRM)
            FROM movimiento_proveedor
            WHERE TERC_NIT = :NIT AND MVPR_FECHA >= :FECINI AND MVPR_FECHA <= :FECFIN AND MVPR_DEBITO = 'N' AND MVPR_ABONO = 'N' and MVPR_TIPOREF <> 55 AND ((:MONEDA = 0) or (MVPR_TRM <> 1))
            INTO :CREDITOS;
        SELECT SUM(MVPR_MONTO/MVPR_TRM) FROM movimiento_proveedor
            WHERE TERC_NIT = :NIT AND MVPR_FECHA >= :FECINI AND MVPR_FECHA <= :FECFIN AND MVPR_ABONO = 'S' AND ((:MONEDA = 0) or (MVPR_TRM <> 1))
            INTO :ABONOS;
        END
    ELSE
        BEGIN
        SELECT SUM(MVPR_MONTO/MVPR_TRM)
            FROM movimiento_proveedor
            WHERE TERC_NIT = :NIT AND MVPR_FECHA >= :FECINI AND MVPR_FECHA <= :FECFIN AND MVPR_DEBITO = 'S' AND ((:MONEDA = 0) or (MVPR_TRM <> 1))
            INTO :DEBITOS;
        SELECT SUM(MVPR_MONTO/MVPR_TRM)
            FROM movimiento_proveedor
            WHERE TERC_NIT = :NIT AND MVPR_FECHA >= :FECINI AND MVPR_FECHA <= :FECFIN AND MVPR_DEBITO = 'N' AND MVPR_ABONO = 'N' AND MVPR_TIPOREF <> 55 AND ((:MONEDA = 0) or (MVPR_TRM <> 1))
            INTO :CREDITOS;
        SELECT SUM((MVPR_MONTO+MVPR_RTFTE+MVPR_RTIVA+MVPR_RTICA)/MVPR_TRM)
            FROM movimiento_proveedor
            WHERE TERC_NIT = :NIT AND MVPR_FECHA >= :FECINI AND MVPR_FECHA <= :FECFIN AND MVPR_ABONO = 'S' AND ((:MONEDA = 0) or (MVPR_TRM <> 1))
            INTO :ABONOS;
        END
    if (DEBITOS IS NULL) then
        DEBITOS = 0;
    if (CREDITOS IS NULL) then
        CREDITOS = 0;
    if (ABONOS IS NULL) then
        ABONOS = 0;
    FINAL = INICIAL + DEBITOS - CREDITOS - ABONOS;
    SUSPEND;
    END
END

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE REP_MOVIMIENTO_PROVEEDOR(
    DESDE VARCHAR(20),
    HASTA VARCHAR(20),
    GRPINI VARCHAR(5),
    GRPFIN VARCHAR(5),
    FECINI DATE,
    FECFIN DATE,
    DETALLE CHAR(1),
    ORDEN CHAR(1),
    AGRUPA CHAR(1),
    MONEDA INTEGER)
RETURNS (
    NIT VARCHAR(20),
    NOMBRE VARCHAR(60),
    TELEFONO VARCHAR(40),
    CIUDAD VARCHAR(40),
    CODZONA VARCHAR(2),
    NOMZONA VARCHAR(60),
    DV CHAR(1),
    CODCIUD CHAR(5),
    NOMCIUD VARCHAR(60),
    INICIAL NUMERIC(18,2),
    TIPODOC VARCHAR(8),
    IDDOC INTEGER,
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    CONCEPTO VARCHAR(60),
    DEBITO NUMERIC(18,2),
    CREDITO NUMERIC(18,2),
    ABONO NUMERIC(18,2),
    SALDO NUMERIC(18,2),
    RTFTE NUMERIC(18,2),
    RTIVA NUMERIC(18,2),
    RTICA NUMERIC(18,2),
    ARTFTE NUMERIC(18,2),
    ARTIVA NUMERIC(18,2),
    ARTICA NUMERIC(18,2))
AS
declare variable NITINI VARCHAR(20);
declare variable NITFIN VARCHAR(20);
declare variable NOMINI VARCHAR(20);
declare variable NOMFIN VARCHAR(20);
declare variable OK CHAR(1);
declare variable DB CHAR(1);
declare variable AB CHAR(1);
declare variable DESCRETE CHAR(2);
declare variable TRM NUMERIC(18,2);
BEGIN
if (ORDEN = 'C') then
    BEGIN
    NITINI = DESDE;
    NITFIN = HASTA;
    NOMINI = '';
    NOMFIN = 'zz';
    END
ELSE
    BEGIN
    NOMINI = DESDE;
    NOMFIN = HASTA;
    NITINI = '';
    NITFIN = 'zz';
    END
EXECUTE PROCEDURE LEE_CONFIGURACION('CXPAGAR', 'SALDOS', 'DESCONTAR RETENCIONES POR CAUSACION') returning_values (DESCRETE);
/* Ubique el NIT */
FOR select T.TERC_NIT, TERC_NOM, TERC_DV, TERC_TEL, TERC_CIU, P.GRPR_COD, T.CIUD_COD
    from terceros T, PROVEEDORES P
    where P.TERC_NIT = T.TERC_NIT AND TERC_PROV = 'S' AND T.TERC_NIT >= :NITINI AND T.TERC_NIT <= :NITFIN AND
        TERC_NOM >= :NOMINI AND TERC_NOM <= :NOMFIN
    INTO :NIT, :NOMBRE, :DV, :TELEFONO, :CIUDAD, :CODZONA, :CODCIUD
    DO  
    BEGIN

    SELECT GRPR_NOM FROM GRUPOS_PROVEEDORES WHERE GRPR_COD = :CODZONA INTO :NOMZONA;
    SELECT CIUD_NOM FROM CIUDADES WHERE CIUD_COD = :CODCIUD INTO :NOMCIUD;
    OK = 'N';
    if (AGRUPA = 'Z') then
        BEGIN
        if (GRPINI = '') then
            BEGIN
            if ((CODZONA IS NULL) or (CODZONA >= :GRPINI AND CODZONA <= :GRPFIN)) then
                OK = 'S';
            END
        ELSE
            if (CODZONA >= :GRPINI AND CODZONA <= :GRPFIN) then
                OK = 'S';
        END
    if (AGRUPA = 'C') then
        BEGIN
        if (GRPINI = '') then
            BEGIN
            if ((CODCIUD IS NULL) or (CODCIUD >= :GRPINI AND CODCIUD <= :GRPFIN)) then
                OK = 'S';
            END
        ELSE
            if (CODCIUD >= :GRPINI AND CODCIUD <= :GRPFIN) then
                OK = 'S';
        END
    if (AGRUPA = 'N') then
        OK = 'S';
        
    if (OK = 'S') then
        BEGIN
        execute procedure saldo_inicial_proveedor (NIT, FECINI, MONEDA) returning_values (INICIAL);
        if (INICIAL is null) then
            INICIAL = 0;
        SALDO = INICIAL;
        if (DETALLE = 'S') then
          BEGIN
          FOR select tido_nomcorto, mvpr_idref, mvpr_prefijo, mvpr_numero, mvpr_fecha, mvpr_conc, mvpr_monto, mvpr_debito, mvpr_rtfte, mvpr_rtiva, mvpr_rtica, mvpr_abono, MVPR_TRM
            from movimiento_proveedor m, tipo_documento t
            where m.mvpr_tiporef = t.tido_cod and terc_nit = :NIT and mvpr_fecha >= :FECINI and mvpr_fecha <= :FECFIN AND MVPR_TIPOREF <> 55 AND ((:MONEDA = 0) or (MVPR_TRM <> 1))
            order by mvpr_fecha, mvpr_tiporef
            into :TIPODOC, :IDDOC, :PREFIJO, :NUMERO, :FECHA, :CONCEPTO, :DEBITO, :DB, :RTFTE, :RTIVA, :RTICA, :AB, :TRM
            DO
            BEGIN
            if (RTFTE IS NULL) then
                RTFTE = 0;
            if (RTIVA IS NULL) then
                RTIVA = 0;
            if (RTICA IS NULL) then
                RTICA = 0;
            if (DB = 'N') then
                BEGIN
                CREDITO = DEBITO;
                DEBITO = 0;
                RTFTE = RTFTE * -1;
                RTIVA = RTIVA * -1;
                RTICA = RTICA * -1;
                END
            ELSE
                CREDITO = 0;
            if ((MONEDA <> 0) AND (TRM <> 0)) then
                BEGIN
                DEBITO = DEBITO / TRM;
                CREDITO = CREDITO / TRM;
                RTFTE = RTFTE / TRM;
                RTIVA = RTIVA / TRM;
                RTICA = RTICA / TRM;
                END
            SALDO = SALDO + DEBITO - CREDITO;
            if (AB = 'N') then
                BEGIN
                if (DESCRETE = 'SI') then
                    SALDO = SALDO - RTFTE - RTIVA - RTICA;
                ABONO = 0;
                END
            ELSE
                BEGIN
                ABONO = CREDITO;
                CREDITO = 0;
                if (DESCRETE <> 'SI') then
                    SALDO = SALDO + RTFTE + RTIVA + RTICA;
                END
            SUSPEND;
            END
          END
        ELSE
            BEGIN
            if (MONEDA = 0) then
                SELECT SUM(MVPR_MONTO), sum(mvpr_rtfte), sum(mvpr_rtiva), sum(mvpr_rtica)
                    FROM movimiento_proveedor WHERE TERC_NIT = :NIT AND MVPR_FECHA >= :FECINI AND MVPR_FECHA <= :FECFIN AND MVPR_DEBITO = 'S' and MVPR_ABONO = 'N'
                    INTO :DEBITO, :RTFTE, :RTIVA, :RTICA;
            else
                SELECT SUM(MVPR_MONTO/MVPR_TRM), sum(mvpr_rtfte/MVPR_TRM), sum(mvpr_rtiva/MVPR_TRM), sum(mvpr_rtica/MVPR_TRM)
                    FROM movimiento_proveedor WHERE TERC_NIT = :NIT AND MVPR_FECHA >= :FECINI AND MVPR_FECHA <= :FECFIN AND MVPR_DEBITO = 'S' and MVPR_ABONO = 'N' AND ((:MONEDA = 0) or (MVPR_TRM <> 1))
                    INTO :DEBITO, :RTFTE, :RTIVA, :RTICA;
            if (DEBITO IS NULL) then
                DEBITO = 0;
            if (RTFTE IS NULL) then
                RTFTE = 0;
            if (RTIVA IS NULL) then
                RTIVA = 0;
            if (RTICA IS NULL) then
                RTICA = 0;
            if (DESCRETE = 'SI') then
                DEBITO = DEBITO - RTFTE - RTIVA - RTICA;
            if (MONEDA = 0) then
                SELECT SUM(MVPR_MONTO), sum(mvpr_rtfte), sum(mvpr_rtiva), sum(mvpr_rtica) FROM movimiento_proveedor
                    WHERE TERC_NIT = :NIT AND MVPR_FECHA >= :FECINI AND MVPR_FECHA <= :FECFIN AND MVPR_DEBITO = 'N' AND MVPR_TIPOREF <> 55 AND MVPR_ABONO = 'N' INTO :CREDITO, :ARTFTE, :ARTIVA, :ARTICA;
            else
                SELECT SUM(MVPR_MONTO/MVPR_TRM), sum(mvpr_rtfte/MVPR_TRM), sum(mvpr_rtiva/MVPR_TRM), sum(mvpr_rtica/MVPR_TRM) FROM movimiento_proveedor
                    WHERE TERC_NIT = :NIT AND MVPR_FECHA >= :FECINI AND MVPR_FECHA <= :FECFIN AND MVPR_DEBITO = 'N' AND MVPR_TIPOREF <> 55 AND MVPR_ABONO = 'N' INTO :CREDITO, :ARTFTE, :ARTIVA, :ARTICA;
            if (CREDITO IS NULL) then
                CREDITO = 0;
            if (ARTFTE IS NULL) then
                ARTFTE = 0;
            if (ARTIVA IS NULL) then
                ARTIVA = 0;
            if (ARTICA IS NULL) then
                ARTICA = 0;
            if (DESCRETE = 'SI') then
                CREDITO = CREDITO - ARTFTE - ARTIVA - ARTICA;
            RTFTE = RTFTE - ARTFTE;
            RTIVA = RTIVA - ARTIVA;
            RTICA = RTICA - ARTICA;
            if (MONEDA = 0) then
                SELECT SUM(MVPR_MONTO), sum(mvpr_rtfte), sum(mvpr_rtiva), sum(mvpr_rtica) FROM movimiento_proveedor
                    WHERE TERC_NIT = :NIT AND MVPR_FECHA >= :FECINI AND MVPR_FECHA <= :FECFIN AND MVPR_ABONO = 'S'
                    INTO :ABONO, :ARTFTE, :ARTIVA, :ARTICA;
            else
                SELECT SUM(MVPR_MONTO/MVPR_TRM), sum(mvpr_rtfte/MVPR_TRM), sum(mvpr_rtiva/MVPR_TRM), sum(mvpr_rtica/MVPR_TRM)
                    FROM movimiento_proveedor
                    WHERE TERC_NIT = :NIT AND MVPR_FECHA >= :FECINI AND MVPR_FECHA <= :FECFIN AND MVPR_ABONO = 'S' AND ((:MONEDA = 0) or (MVPR_TRM <> 1))
                    INTO :ABONO, :ARTFTE, :ARTIVA, :ARTICA;
            if (ABONO IS NULL) then
                ABONO = 0;
            if (ARTFTE IS NULL) then
                ARTFTE = 0;
            if (ARTIVA IS NULL) then
                ARTIVA = 0;
            if (ARTICA IS NULL) then
                ARTICA = 0;
            if (DESCRETE <> 'SI') then
                ABONO = ABONO + ARTFTE + ARTIVA + ARTICA;
            SALDO = INICIAL + DEBITO - CREDITO - ABONO;
            SUSPEND;
            END
        END
    END
END

^

SET TERM ; ^


/* 20090723B */
/* ACUMULAR COSTOS POR PROVEEDOR EN LAS TRASFERENCIAS PARA PODER SUGERIR ORDEN INTERNA  */

SET TERM ^ ;

CREATE OR ALTER TRIGGER TRASFERENCIAS_DETALLE_AI FOR TRASFERENCIAS_DETALLE
ACTIVE AFTER INSERT POSITION 0
AS
declare variable fec date;
declare variable CONC VARCHAR(60);
declare variable factor numeric(18,4);
declare variable bodori varchar(2);
declare variable boddes varchar(2);
declare variable Pref varchar(4);
declare variable Num varchar(6);
declare variable NIT varchar(20);
declare variable fecaux date;
declare variable ORIGEN VARCHAR(2);
BEGIN
  if ((NEW.Tran_id <> 0) and (new.tras_anulado = 'N')) then
    begin
    select tran_fecha, tran_conc, BODE_COD, TRAN_BODDES, pref_pre, tran_numero, TERC_NIT
        from trasferencias where tran_id = new.tran_id into :fec, :conc, :bodori, :boddes, :Pref, :Num, :NIT;
    execute procedure factor_unidad_cant(new.arti_cod, new.tras_unidad) returning_values(factor);
    EXECUTE PROCEDURE LEE_CONFIGURACION('INVENTARIO', 'TRASLADOS', 'AFECTAR AMBAS BODEGAS AL CONFIRMAR ENTREGA') returning_values(ORIGEN);
    if ((ORIGEN = 'NO') or (new.tras_confirma = 'S'))  then
        INSERT INTO MOVIMIENTO_ARTICULO
          (ARTI_COD, MVAR_CONS, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM)
          VALUES(NEW.ARTI_COD, GEN_ID(ID_MOVARTI,1), :bodori, :FEC, 13, NEW.tran_id,
          :CONC, :factor * new.tras_cant, 0, 'N', new.tras_lote, :Pref, :Num, new.tras_item);
    if (new.tras_confirma = 'S') then
      INSERT INTO MOVIMIENTO_ARTICULO
        (ARTI_COD, MVAR_CONS, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM)
        VALUES(NEW.ARTI_COD, GEN_ID(ID_MOVARTI,1), :boddes, :FEC, 13, NEW.tran_id,
        :CONC, :factor * new.tras_cant, NEW.tras_costo, 'S', new.tras_lotedes, :Pref, :Num, new.tras_item);

    /* ACTUALICE EL COSTO POR PROVEEDOR */
    SELECT PVAR_FECHA FROM PROVEEDOR_ARTICULO
        WHERE TERC_NIT = :Nit AND ARTI_COD = NEW.ARTI_COD
        INTO :FECAUX;
    if (FECAUX IS NULL) then
        INSERT INTO PROVEEDOR_ARTICULO (TERC_NIT, ARTI_COD, PVAR_COSTO, PVAR_FECHA, PVAR_COD,PVAR_DES)
            VALUES (:Nit, NEW.ARTI_COD, (new.tras_costo * new.tras_factor), :fec, :NIT,NEW.tras_desc);
    else
        UPDATE PROVEEDOR_ARTICULO
            SET PVAR_COSTO = NEW.tras_costo, PVAR_FECHA = :fec
            WHERE ARTI_COD = NEW.ARTI_COD AND TERC_NIT = :Nit;
    END
END
^

SET TERM ; ^


SET TERM ^ ;

CREATE OR ALTER TRIGGER TRASFERENCIAS_DETALLE_AU FOR TRASFERENCIAS_DETALLE
ACTIVE AFTER UPDATE POSITION 0
AS
declare variable fec date;
declare variable CONC VARCHAR(60);
declare variable factor numeric(18,4);
declare variable bodori varchar(2);
declare variable boddes varchar(2);
declare variable Pref varchar(4);
declare variable Num varchar(6);
declare variable ORIGEN VARCHAR(2);
declare variable NIT varchar(20);
declare variable fecaux date;
BEGIN
if ((old.tras_cant <> new.tras_cant) or (old.tras_unidad <> new.tras_unidad) or (old.tras_lote <> new.tras_lote) or
    (old.tras_anulado <> new.tras_anulado) or (old.tras_transmit <> new.tras_transmit) or (old.tras_confirma <> new.tras_confirma)) then
  begin
  /* Anule el anterior */
  if ((old.tran_id <> 0) and (old.tras_anulado = 'N')) then
    begin
    delete from movimiento_articulo where (mvar_tipodoc = 13) and (mvar_idref = old.tran_id) and (mvar_item = old.tras_item);
    END
  /* Registre el nuevo */
  if ((new.tran_id <> 0) and (new.tras_anulado = 'N')) then
    BEGIN
    select tran_fecha, tran_conc, BODE_COD, TRAN_BODDES, Pref_pre, tran_numero, terc_nit
        from trasferencias where tran_id = new.tran_id into :fec, :conc, :bodori, :boddes, :Pref, :Num, :Nit;
    execute procedure factor_unidad_cant(new.arti_cod, new.tras_unidad) returning_values(factor);
    EXECUTE PROCEDURE LEE_CONFIGURACION('INVENTARIO', 'TRASLADOS', 'AFECTAR AMBAS BODEGAS AL CONFIRMAR ENTREGA') returning_values(ORIGEN);
    if ((ORIGEN = 'NO') or (new.tras_confirma = 'S'))  then
        INSERT INTO MOVIMIENTO_ARTICULO
            (ARTI_COD, MVAR_CONS, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM)
            VALUES(NEW.ARTI_COD, GEN_ID(ID_MOVARTI,1), :bodori, :FEC, 13, NEW.tran_id,
            :CONC, :factor * new.tras_cant, 0, 'N', new.tras_lote, :Pref, :Num, new.tras_item);
    if (new.tras_confirma = 'S') then
        INSERT INTO MOVIMIENTO_ARTICULO
        (ARTI_COD, MVAR_CONS, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM)
        VALUES(NEW.ARTI_COD, GEN_ID(ID_MOVARTI,1), :boddes, :FEC, 13, NEW.tran_id,
        :CONC, :factor * new.tras_cant, 0, 'S', new.tras_lotedes, :Pref, :Num, new.tras_item);
    /* ACTUALICE EL COSTO POR PROVEEDOR */
    SELECT PVAR_FECHA FROM PROVEEDOR_ARTICULO
        WHERE TERC_NIT = :Nit AND ARTI_COD = NEW.ARTI_COD
        INTO :FECAUX;
    if (FECAUX IS NULL) then
        INSERT INTO PROVEEDOR_ARTICULO (TERC_NIT, ARTI_COD, PVAR_COSTO, PVAR_FECHA, PVAR_COD,PVAR_DES)
            VALUES (:Nit, NEW.ARTI_COD, (new.tras_costo * new.tras_factor), :fec, :NIT,NEW.tras_desc);
    else
        UPDATE PROVEEDOR_ARTICULO
            SET PVAR_COSTO = NEW.tras_costo, PVAR_FECHA = :fec
            WHERE ARTI_COD = NEW.ARTI_COD AND TERC_NIT = :Nit;
    END
  end
END
^

SET TERM ; ^


/* 20090724 */
/* PUEDE DAR UN MULTIPLE ROWS SI LOS VENCIMIENTOS SON IGUALES DE DOS LOTES */
SET TERM ^ ;

CREATE OR ALTER procedure FECHAS_ANTERIORES_LOTE (
    ARTICULO varchar(15))
returns (
    LOTE varchar(15),
    SALDO numeric(18,4))
AS
declare variable fecha date;
BEGIN
  SELECT MIN(LOTE_VENCE) FROM LOTES
    WHERE ARTI_COD = :ARTICULO INTO :fecha;
  SELECT FIRST 1 LOTE_NRO,LOTE_SALDO FROM LOTES
    WHERE (ARTI_COD = :ARTICULO) AND LOTE_VENCE = :FECHA INTO :LOTE, :SALDO;
  SUSPEND;
end
^

SET TERM ; ^



/* 20090723 */
/* ENVIO DEL RESUMEN DESDE LA ULTIMA HORA */
CREATE TABLE ENVIO_RESUMDIA (
    PTVT_ID T_ID NOT NULL,
    ENRE_FECHA DATE NOT NULL,
    ENRE_HORA TIME NOT NULL);
alter table ENVIO_RESUMDIA
add constraint PK_ENVIO_RESUMDIA
primary key (PTVT_ID,ENRE_FECHA,ENRE_HORA);

SET TERM ^ ;

CREATE OR ALTER procedure RESUMEN_VENTAS_TX (
    FECHA date,
    PUNTO integer,
    HORA time)
returns (
    PREFIJO varchar(4),
    VENDEDOR integer,
    ARTICULO varchar(15),
    DESCRIPCION varchar(60),
    UNIDAD varchar(8),
    CANTIDAD numeric(18,4),
    PRECIO numeric(18,4),
    IVA numeric(18,4),
    CONSUMO numeric(18,4))
AS
BEGIN
FOR SELECT MAX(D.ARTI_COD), SUM(FADE_CANT * FADE_FACTOR), SUM((FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO)*FACT_FACTOR), SUM(FADE_IVAMONTO*FACT_FACTOR), SUM(FADE_CONSUMO),
    MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(F.PREF_PRE), max(f.vend_cod)
    FROM FACTURAS_DETALLE D, FACTURAS F, ARTICULO A, auditoria au
    WHERE F.FACT_ID = D.FACT_ID AND D.ARTI_COD = A.arti_cod AND FACT_FECHA = :FECHA AND FACT_ANULADO = 'N' AND F.ptvt_id = :PUNTO and substring(A.arti_cod from 1 FOR 2) <> '.t'
        AND AU.tido_cod = 31 AND AU.audi_oper = 'I' and au.audi_iddoc = f.fact_id AND AU.audi_hora > :HORA+1
    GROUP BY f.vend_cod, D.ARTI_COD
    INTO :ARTICULO, :CANTIDAD, :PRECIO, :IVA, :CONSUMO, :DESCRIPCION, :UNIDAD, :PREFIJO, :vendedor
    DO
    BEGIN
    if (CANTIDAD IS NULL) then
        CANTIDAD = 0;
    if (PRECIO IS NULL) then
        PRECIO = 0;
    if (IVA IS NULL) then
        IVA = 0;
    if (CONSUMO IS NULL) then
        CONSUMO = 0;
    if (cantidad <> 0) then
        begin
        PRECIO = PRECIO / CANTIDAD;
        SUSPEND;
        end
    END /* FOR */
FOR SELECT MAX(D.ARTI_COD), SUM(DVDE_CANT * DVDE_FACTOR), SUM((DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO)*DEVT_FACTOR), SUM(DVDE_IVAMONTO*DEVT_FACTOR), SUM(DVDE_CONSUMO),
    MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(F.PREF_PRE), max(f.vend_cod)
    FROM DEVOLUCIONES_VENTAS_DETALLE D, DEVOLUCIONES_VENTAS F, ARTICULO A
    WHERE F.DEVT_ID = D.DEVT_ID AND D.ARTI_COD = A.arti_cod AND DEVT_FECHA = :FECHA AND DEVT_ANULADO = 'N' AND F.ptvt_id = :PUNTO and substring(a.arti_cod from 1 FOR 2) <> '.t'
    GROUP BY f.vend_cod, D.ARTI_COD
    INTO :ARTICULO, :CANTIDAD, :PRECIO, :IVA, :CONSUMO, :DESCRIPCION, :UNIDAD, :PREFIJO, :vendedor
    DO
    BEGIN
    if (CANTIDAD IS NULL) then
        CANTIDAD = 0;
    if (PRECIO IS NULL) then
        PRECIO = 0;
    if (IVA IS NULL) then
        IVA = 0;
    if (CONSUMO IS NULL) then
        CONSUMO = 0;
    if (cantidad <> 0) then
        begin
        PRECIO = PRECIO / CANTIDAD;
        CANTIDAD = CANTIDAD * -1;
        IVA = IVA * -1;
        CONSUMO = CONSUMO * -1;
        SUSPEND;
        end
    END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure RESUMEN_CAJA_TX (
    FECHA date,
    PUNTO integer,
    HORA time)
returns (
    FORMA integer,
    BANCO varchar(3),
    CUENTA varchar(20),
    NUMERO varchar(20),
    FECDOC date,
    MONTO numeric(18,4))
AS
declare variable CAJA INTEGER;
BEGIN
SELECT CAJA_ID FROM punto_venta V WHERE V.PTVT_ID = :PUNTO INTO :CAJA;
/* EFECTIVO */
MONTO = 0;
SELECT SUM(RCPA_MONTO) FROM RECIBOS_CAJA_PAGO r, auditoria a WHERE a.tido_cod = 61 and a.audi_iddoc = r.reca_id and a.audi_oper = 'I' and a.audi_hora > :hora+1 AND
    FOPA_ID = 1 AND RECA_ID IN (SELECT distinct R.RECA_ID FROM RECIBOS_CAJA R, RECIBOS_CAJA_DETALLE D, movimiento_clientes M
    WHERE R.RECA_ID = D.RECA_ID AND D.rcde_tipodoc = M.mvcl_tiporef AND D.rcde_iddoc = M.mvcl_idref AND M.mvcl_fecha = :FECHA AND
    RECA_FECHA = :FECHA AND RECA_ANULADO = 'N' AND CAJA_ID = :CAJA) INTO :MONTO;
if (MONTO is null) then
    MONTO = 0;
FORMA = 1;
if (monto <> 0) then
    SUSPEND;

FOR SELECT FOPA_ID, RCPA_BANCO, RCPA_CUENTA, RCPA_NUMERO, RCPA_FECHA, RCPA_MONTO
    FROM RECIBOS_CAJA_PAGO r, auditoria a WHERE a.tido_cod = 61 and a.audi_iddoc = r.reca_id and a.audi_oper = 'I' and a.audi_hora > :hora+1 AND
        FOPA_ID <> 1 and RECA_ID IN (SELECT distinct R.RECA_ID FROM RECIBOS_CAJA R, RECIBOS_CAJA_DETALLE D, movimiento_clientes M
        WHERE R.RECA_ID = D.RECA_ID AND D.rcde_tipodoc = M.mvcl_tiporef AND D.rcde_iddoc = M.mvcl_idref AND M.mvcl_fecha = :FECHA AND
        RECA_FECHA = :FECHA AND RECA_ANULADO = 'N' AND CAJA_ID = :CAJA)
    INTO :forma, :banco, :cuenta, :numero, :fecdoc, :monto
    DO
    SUSPEND;
END
^

SET TERM ; ^

ALTER TABLE ENVIO_RESUMDIA
ADD ENRE_FACTID T_ID;

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

SET TERM ^ ;

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

    DELETE FROM puntos_cliente WHERE PTCL_TIPODOC = 31 AND PTCL_IDDOC = OLD.fact_id;
    DELETE FROM envio_resumdia WHERE ENRE_FACTID = OLD.fact_id;

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

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

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

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER FACTURAS_AD FOR FACTURAS
ACTIVE AFTER DELETE POSITION 0
AS
declare variable ABONOS INTEGER;
declare variable IDC INTEGER;
declare variable PEDAUTO CHAR(2);
declare variable consec INTEGER;
BEGIN
/* borre la contabilización */
select enco_consec from comprobante_encabezado where enco_tiporef = 31 and enco_idref = old.fact_id INTO :consec;
if (NOT consec is null) then
  delete from comprobante_detalle where enco_consec = :consec;
delete from comprobante_encabezado where enco_tiporef = 31 and enco_idref = old.fact_id;

DELETE FROM puntos_cliente WHERE PTCL_TIPODOC = 31 AND PTCL_IDDOC = OLD.fact_id;
DELETE FROM envio_resumdia WHERE ENRE_FACTID = OLD.fact_id;

INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
    VALUES (USER, 31, OLD.fact_id, 'D', OLD.pref_pre || OLD.fact_numero);

if ((OLD.fact_id <> 0) AND (OLD.fact_anulado = 'N')) then
    BEGIN
    /* VERIFIQUE QUE NO HAY DEVOLUCIONES */
    SELECT COUNT(*) FROM DEVOLUCIONES_VENTAS WHERE DEVT_FACTID = OLD.fact_id AND DEVT_ANULADO = 'N' INTO :abonos;
    if (abonos > 0) then
        exception documento_devuelto 'La factura ' || old.pref_pre || old.fact_numero || ' tiene devoluciones registradas.';

    /* Verifique si habia abonos a la nota */
    ABONOS = 0;
    select COUNT(*) FROM SALDOS_DOC_CARTERA WHERE SDCA_TIPOREF = 31 AND SDCA_IDREF = OLD.FACT_ID AND SDCA_ABONO <> 0 INTO :ABONOS;
    if (ABONOS = 0) then
        BEGIN
        /* BORRE EL REGISTRO PREVIO */
        delete from saldos_doc_cartera where sdca_tiporef = 31 and sdca_idref = old.fact_id;
        delete from movimiento_CLIENTES where (mvcl_tiporef = 31) and (mvcl_idref = old.fact_id);
        /* borre la contabilizaci¢n */
        select enco_consec from comprobante_encabezado where enco_tiporef = 31 and enco_idref = old.fact_id into :IDC;

        EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION','FACTURAS','GENERAR PEDIDO AUTOMATICAMENTE CON LA FACTURA') RETURNING_VALUES (PEDAUTO);
        if (PEDAUTO = 'SI') then
            BEGIN
            /* INTENTE BORRAR EL PEDIDO DEL MISMO NUMERO */
            DELETE FROM PEDIDOS WHERE PREF_PRE = OLD.pref_pre AND PEDI_NUMERO = OLD.fact_numero;
            END
        /* ACTUALICE LA CONSOLIDACION */
        if ((OLD.FACT_ID <> 0) AND (OLD.FACT_CONSOLIDA <> 0)) then
            UPDATE consolidado_faltantes SET COFA_OK = 'N' WHERE COFA_ID = OLD.fact_consolida;
        END
    else
        exception DOCUMENTO_CON_ABONOS 'La factura ' || old.pref_pre || old.fact_numero || ' tiene abonos registrados.';
    END
END
^

SET TERM ; ^


/* 20090725 */
/* IMPRESION DE LA CONCILIACION BANCARIA */
SET TERM ^ ;

create or alter procedure IMPR_CONCILIACIONB (
    ID INTEGER)
returns (
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    CONCEPTO VARCHAR(60),
    CODCTA VARCHAR(3),
    NROCUENTA VARCHAR(20),
    BANCO VARCHAR(60),
    TITULAR VARCHAR(60),
    FECINI DATE,
    FECFIN DATE,
    SALDOINIS NUMERIC(18,2),
    SALDOFINS NUMERIC(18,2),
    SALDOINIE NUMERIC(18,2),
    SALDOFINE NUMERIC(18,2),
    CLASE CHAR(1),
    NOMCLASE VARCHAR(60),
    FECDOC DATE,
    OPERACION VARCHAR(20),
    TIPODOC VARCHAR(8),
    NUMDOC VARCHAR(10),
    CONCDOC VARCHAR(60),
    MONTODOC NUMERIC(18,2),
    EXPLDOC VARCHAR(255),
    TOTAL1 NUMERIC(18,2),
    TOTAL2 NUMERIC(18,2),
    TOTAL3 NUMERIC(18,2),
    TOTAL4 NUMERIC(18,2),
    SALDOE NUMERIC(18,2),
    saldos NUMERIC(18,2))
as
declare variable CTA INTEGER;
begin
SELECT COBN_PREFIJO, COBN_NUMERO, COBN_FECHA, COBN_CONCEPTO, COBN_FECINI, COBN_FECFIN, COBN_EXTRACTOINI, COBN_EXTRACTOFIN,
    E.CUBA_COD, CUBA_CODCTA, CUBA_NUMERO, CUBA_TITULAR, BANC_NOMBRE
    FROM conciliacion_encabezado E, cuentas_banco C, bancos B
    WHERE E.cuba_cod = C.cuba_cod AND C.banc_cod = B.banc_cod AND E.cobn_id = :ID
    INTO :prefijo, :numero, :fecha, :concepto, :fecini, :fecfin, :saldoinie, :saldofine,
        :cta, :codcta, :nrocuenta, :titular, :banco;
EXECUTE PROCEDURE saldo_cuenta_banco(:CTA, :fecini) returning_values (:saldoinis);
EXECUTE PROCEDURE saldo_cuenta_banco(:CTA, :fecfin+1) returning_values (:saldofins);
SELECT SUM(COBN_MONTO) FROM conciliacion_bancaria WHERE COBN_ID = :ID AND COBN_CLASE = '1' INTO :total1;
SELECT SUM(COBN_MONTO) FROM conciliacion_bancaria WHERE COBN_ID = :ID AND COBN_CLASE = '2' INTO :total2;
SELECT SUM(COBN_MONTO) FROM conciliacion_bancaria WHERE COBN_ID = :ID AND COBN_CLASE = '3' INTO :total3;
SELECT SUM(COBN_MONTO) FROM conciliacion_bancaria WHERE COBN_ID = :ID AND COBN_CLASE = '4' INTO :total4;
SALDOE = saldofine + total4 - total3;
SALDOS = saldofins + total1 - total2;
FOR SELECT COBN_CLASE, COBN_FEC, COBN_OPER, COBN_CONC, COBN_MONTO, TIDO_NOMCORTO, COBN_EXPLICA, COBN_PREFIJO || COBN_NUMERO
    FROM conciliacion_bancaria C, tipo_documento T WHERE C.cobn_tipodoc = T.tido_cod AND
    COBN_ID = :id AND COBN_CLASE <> '0' ORDER BY COBN_CLASE, COBN_ITEM
    INTO :clase, :fecdoc, :operacion, :concdoc, :montodoc, :tipodoc, :expldoc, :numdoc
    DO
    BEGIN
    if (CLASE = 1) then
        nomclase = 'DEBITOS FALTANTES EN LIBROS';
    if (CLASE = 2) then
        nomclase = 'CREDITOS FALTANTES EN LIBROS';
    if (CLASE = 3) then
        nomclase = 'DEBITOS FALTANTES EN EL EXTRACTO';
    if (CLASE = 4) then
        nomclase = 'CREDITOS FALTANTES EN EL EXTRACTO';
    suspend;
    END
end
^

SET TERM ; ^


grant EXECUTE on PROCEDURE IMPR_CONCILIACIONB to PUBLIC;

/* 20090720 */
/* CUENTA DE COMPRAS Y NO DE INVENTARIO */
SET TERM ^ ;

CREATE OR ALTER procedure CONTABIL_FACTCOMP (
    IDDOC integer,
    IDINTER integer)
returns (
    ERROR integer,
    VER char(1),
    IDC integer)
AS
DECLARE VARIABLE PREFIJO VARCHAR(4);
DECLARE VARIABLE NUM VARCHAR(6);
DECLARE VARIABLE NUMERO VARCHAR(10);
DECLARE VARIABLE FECAUX DATE;
DECLARE VARIABLE FECHA CHAR(8);
DECLARE VARIABLE CONCEPTO CHAR(60);
DECLARE VARIABLE VENCEAUX DATE;
DECLARE VARIABLE VENCE CHAR(8);
DECLARE VARIABLE VRDTO NUMERIC(18,2);
DECLARE VARIABLE VRADIC NUMERIC(18,2);
DECLARE VARIABLE VRSUBT NUMERIC(18,2);
DECLARE VARIABLE VRIVA NUMERIC(18,2);
DECLARE VARIABLE PRTFTE NUMERIC(9,2);
DECLARE VARIABLE VRRTFTE NUMERIC(18,2);
DECLARE VARIABLE VRRTIVA NUMERIC(18,2);
DECLARE VARIABLE PRTICA NUMERIC(9,2);
DECLARE VARIABLE VRRTICA NUMERIC(18,2);
DECLARE VARIABLE VRTOTAL NUMERIC(18,2);
DECLARE VARIABLE VREXTRA NUMERIC(18,2);
DECLARE VARIABLE TIPOCOMP VARCHAR(3);
DECLARE VARIABLE PREFCONT VARCHAR(4);
DECLARE VARIABLE INVEN CHAR(1);
DECLARE VARIABLE CTAINVEN VARCHAR(20);
DECLARE VARIABLE IVA CHAR(1);
DECLARE VARIABLE CTAIVA VARCHAR(20);
DECLARE VARIABLE CONSUMO CHAR(1);
DECLARE VARIABLE CTACONSUMO VARCHAR(20);
DECLARE VARIABLE CXP CHAR(1);
DECLARE VARIABLE CTACXP VARCHAR(20);
DECLARE VARIABLE RTFTE CHAR(1);
DECLARE VARIABLE CTARTFTE VARCHAR(20);
DECLARE VARIABLE RTIVA CHAR(1);
DECLARE VARIABLE CTARTIVA VARCHAR(20);
DECLARE VARIABLE RTICA CHAR(1);
DECLARE VARIABLE CTARTICA VARCHAR(20);
DECLARE VARIABLE CTADTO VARCHAR(20);
DECLARE VARIABLE CTAADIC VARCHAR(20);
DECLARE VARIABLE CTAEXTRA VARCHAR(20);
DECLARE VARIABLE EXISTE CHAR(1);
DECLARE VARIABLE CUENTA VARCHAR(20);
DECLARE VARIABLE MONTO NUMERIC(18,2);
DECLARE VARIABLE TIPOCUEN CHAR(1);
DECLARE VARIABLE NIT VARCHAR(20);
DECLARE VARIABLE NOMBRE VARCHAR(60);
DECLARE VARIABLE PROY VARCHAR(4);
DECLARE VARIABLE CENTRO VARCHAR(4);
DECLARE VARIABLE PROYDET VARCHAR(4);
DECLARE VARIABLE CENTRODET VARCHAR(4);
DECLARE VARIABLE PORC NUMERIC(5,2);
DECLARE VARIABLE NUMITEMS INTEGER;
DECLARE VARIABLE ARTICULO VARCHAR(15);
DECLARE VARIABLE IMPINC CHAR(1);
DECLARE VARIABLE IMPTOS NUMERIC(18,2);
DECLARE VARIABLE SUMA NUMERIC(18,2);
DECLARE VARIABLE PORCIVA NUMERIC(9,2);
DECLARE VARIABLE TCTAPROV VARCHAR(20);
DECLARE VARIABLE TCTARTFTE VARCHAR(20);
DECLARE VARIABLE TCTARTIVA VARCHAR(20);
DECLARE VARIABLE TCTARTICA VARCHAR(20);
DECLARE VARIABLE CUENTAADIC VARCHAR(20);
DECLARE VARIABLE BASEADIC VARCHAR(20);
DECLARE VARIABLE PORCADIC NUMERIC(5,2);
DECLARE VARIABLE VALORADIC NUMERIC(18,2);
DECLARE VARIABLE DBADIC CHAR(1);
DECLARE VARIABLE FOMENTO CHAR(2);
DECLARE VARIABLE BODE_DET CHAR(2);
DECLARE VARIABLE NUMPROV VARCHAR(10);
DECLARE VARIABLE MERCANCIA NUMERIC(18,2);
declare variable FACTOR DOUBLE PRECISION;
DECLARE VARIABLE MENORV CHAR(2);
declare variable DIG INTEGER;
declare variable NETO NUMERIC(18,2);
declare variable CENT CHAR(1);
declare variable ANULADO CHAR(1);
declare variable ERRORC INTEGER;
BEGIN
  /* INTERFACE */
  EXISTE = 'N';
  SELECT 'S', TICO_COD, PRCO_PRE, INCO_INVEN, INCO_IVA, INCO_CONSUMO, INCO_CXP, INCO_RTFTE, INCO_RTIVA, INCO_RTICA, INCO_CTAINVEN, INCO_CTAIVA, INCO_CTACONSUMO, INCO_CTADTO, INCO_CTAADIC, INCO_CTAEXTRA, INCO_CTACXP, INCO_CTARTFTE, INCO_CTARTIVA, INCO_CTARTICA, INCO_CONFIRMAR, INCO_CENTRO
    FROM INTERFAZ_COMPRAS WHERE INCO_ID = :IDINTER INTO :EXISTE, :TIPOCOMP, :PREFCONT, :INVEN, :IVA, :CONSUMO, :CXP, :RTFTE, :RTIVA, :RTICA, :CTAINVEN, :CTAIVA, :CTACONSUMO, :CTADTO, :CTAADIC, :CTAEXTRA, :CTACXP, :CTARTFTE, :CTARTIVA, :CTARTICA, :VER, :CENT;
  if (EXISTE = 'S') then
    BEGIN
    /* BORRE CONTABILIZACION PREVIA */
    DELETE FROM CONTABILIZACION WHERE CNTB_TIPOREF = 21 AND CNTB_IDREF = :IDDOC;
    /* ENCABEZADO DE LA FACTURA */
    SELECT PREF_PRE, FACO_NUMERO, FACO_FECHA, F.TERC_NIT, FACO_IMPTOS, FACO_VENCE, FACO_DTOMONTO, FACO_ADICIONAL, FACO_IVAMONTO, FACO_EXTRA, FACO_TOTAL, FACO_RTFTEPORC, FACO_RTFTEMONTO, FACO_RTIVAPOR, FACO_RTIVAMONTO, FACO_RTICAPOR, FACO_RTICAMONTO, TERC_NOM, PROV_CTARTFTE, PROV_CTARTIVA, PROV_CTARTICA, PROV_CTAPAGAR, FACO_NUMPROV, FACO_ANULADO
        FROM FACTURAS_COMPRA F, TERCEROS T, PROVEEDORES P WHERE FACO_ID = :IDDOC AND F.TERC_NIT = T.TERC_NIT AND T.TERC_NIT = P.TERC_NIT
        INTO :PREFIJO, :NUM, :FECAUX, :NIT, :IMPINC, :VENCEAUX, :VRDTO, :VRADIC, :VRIVA, :VREXTRA, :VRTOTAL, :PRTFTE, :VRRTFTE, :PORC, :VRRTIVA, :PRTICA, :VRRTICA, :NOMBRE, TCTARTFTE, TCTARTIVA, TCTARTICA, TCTAPROV, :NUMPROV, :ANULADO;
    /* CENTRO DE LA BODEGA */
    IF (CENT = 'B') THEN
        SELECT BODE_CENTRO, BODE_PROY FROM BODEGA B, FACTURAS_COMPRA F WHERE B.BODE_COD = F.BODE_COD AND F.FACO_ID = :IDDOC INTO :CENTRO, :PROY;
    ELSE
        SELECT PREF_CENTRO,PREF_PROY  FROM PREFIJOS P, FACTURAS_COMPRA F WHERE P.PREF_PRE = F.PREF_PRE AND F.FACO_ID = :IDDOC AND P.TIDO_COD = 21 INTO :CENTRO, :PROY;
    if (ANULADO = 'N') then
        BEGIN
        NUMERO = PREFIJO || NUM;
        VRSUBT = VRTOTAL - VREXTRA - VRIVA;
        MERCANCIA = VRSUBT - VRADIC + VRDTO;
        EXECUTE PROCEDURE FECHA_A_CONTA(:FECAUX) returning_values (:FECHA);
        EXECUTE PROCEDURE FECHA_A_CONTA(:VENCEAUX) returning_values (:VENCE);
        if (NUMPROV IS NULL) then
            NUMPROV = NUMERO;
        CONCEPTO = 'FC No.' || NUMERO || '-' || SUBSTR(NOMBRE,1,26) || '-NPROV.' || NUMPROV;
        IDC = GEN_ID(ID_CONTABILIZA, 1);
        INSERT INTO CONTABILIZACION (CNTB_ID, CNTB_TIPOCOMP, CNTB_PREFCNT, CNTB_NUMERO, CNTB_FECHA, CNTB_CONCEPTO, CNTB_REF, CNTB_TIPOREF, CNTB_IDREF, CNTB_PREFREF, CNTB_NUMREF, CNTB_PROCESADO)
            VALUES (:IDC, :TIPOCOMP, :PREFCONT, :NUM, :FECHA, :CONCEPTO, '', 21, :IDDOC, :PREFIJO, :NUM, 'N');
        NUMITEMS = 0;
        SUMA = 0;
        NETO = 0;
        ERROR = 0;
        EXECUTE PROCEDURE LEE_CONFIGURACION('COMPRAS', 'FACTURAS', 'USAR IMPOCONSUMO COMO PORCENTAJE DE FOMENTO') RETURNING_VALUES (FOMENTO);
        EXECUTE PROCEDURE lee_configuracion('COMPRAS','FACTURAS','DESCUENTO Y VALOR ADICIONAL DEL DOCUMENTO COMO MENOR VALOR DEL COSTO') returning_values (:MENORV);
        SELECT SUM(FCDE_consumo) from facturas_compras_detalle where faco_id = :IDDOC into :valoradic;
        if (MENORV = 'SI') then
            if (MERCANCIA <> 0) then
                FACTOR = (CAST(VRSUBT AS DOUBLE PRECISION) - VALORADIC) / (CAST(MERCANCIA AS DOUBLE PRECISION) - VALORADIC);
            ELSE
                FACTOR = 1;
        ELSE
           FACTOR = 1;
        SELECT CAST(CONF_VALOR AS INTEGER) FROM CONFIGURACION WHERE CONF_MODULO = 'COMPRAS' AND CONF_CATEGORIA = 'GENERAL' AND CONF_PROPIEDAD = 'REDONDEO AL MULTIPLO DE DIEZ EN TOTALES' INTO :DIG;
        if (INVEN = 'A') then
            BEGIN
            FOR SELECT MAX(COAR_CTACOMP), SUM(CAST(FCDE_CANT AS DOUBLE PRECISION) * (FCDE_PRUNIT-FCDE_DTOMONTO)), SUM(FCDE_IVAMONTO), SUM(FCDE_CONSUMO), MAX(F.BODE_COD)
                FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_COMPRAS_DETALLE F WHERE F.FACO_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD
                GROUP BY COAR_CTACOMP, F.BODE_COD INTO :CTAINVEN, :MONTO, :IMPTOS, :VALORADIC, :BODE_DET DO
                BEGIN
                IF (CENT = 'B') THEN
                  SELECT BODE_CENTRO, BODE_PROY FROM BODEGA WHERE BODE_COD = :BODE_DET INTO :CENTRODET, :PROYDET;
                if (IMPINC = 'S') then
                    BEGIN
                    MONTO = MONTO - IMPTOS;
                    if (FOMENTO <> 'SI' ) then
                        MONTO = MONTO - VALORADIC;
                    END
                MONTO = MONTO * FACTOR;
                execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                EXECUTE PROCEDURE CUENTA_INTERFAZ(21, :IDDOC, :CTAINVEN, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    FOR SELECT F.ARTI_COD, (FCDE_CANT * (FCDE_PRUNIT-FCDE_DTOMONTO)), FCDE_IVAMONTO, FCDE_CONSUMO
                        FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_COMPRAS_DETALLE F WHERE F.FACO_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTACOMP = :CUENTA
                        INTO :ARTICULO, :MONTO, :IMPTOS, :VALORADIC DO
                        BEGIN
                        if (IMPINC = 'S') then
                            BEGIN
                            MONTO = MONTO - IMPTOS;
                            if (FOMENTO <> 'SI' ) then
                                MONTO = MONTO - VALORADIC;
                            END
                        MONTO = MONTO * FACTOR;
                        execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                        IF (CENT = 'B') THEN
                           INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                               VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROYDET, :CENTRODET, NULL, NULL, NULL, :ARTICULO, 0, 0);
                        ELSE
                           INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                               VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                        NUMITEMS = NUMITEMS + 1;
                        NETO = NETO + MONTO;
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    IF (CENT = 'B') THEN
                       INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                           VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROYDET, :CENTRODET, :NUMERO, NULL, :VENCE, NULL, 0, 21);
                    ELSE
                       INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                           VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 21);
                    NUMITEMS = NUMITEMS + 1;
                    NETO = NETO + MONTO;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    IF (CENT = 'B') THEN
                       INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                           VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROYDET, :CENTRODET, NULL, NULL, NULL, NULL, 0, 0);
                    ELSE
                       INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                           VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NUMITEMS = NUMITEMS + 1;
                    NETO = NETO + MONTO;
                    END
                END
            END
        if (INVEN = 'K') then
            BEGIN
            FOR SELECT SUM(CAST(FCDE_CANT AS DOUBLE PRECISION) * (FCDE_PRUNIT-FCDE_DTOMONTO)), SUM(FCDE_IVAMONTO), SUM(FCDE_CONSUMO), MAX(BODE_COD)
                FROM FACTURAS_COMPRAS_DETALLE WHERE FACO_ID = :IDDOC GROUP BY BODE_COD INTO :MONTO, :IMPTOS, :VALORADIC, :BODE_DET Do
                BEGIN
                  IF (CENT = 'B') THEN
                    SELECT BODE_CENTRO, BODE_PROY FROM BODEGA WHERE BODE_COD = :BODE_DET INTO :CENTRODET, :PROYDET;
                  if (IMPINC = 'S') then
                   BEGIN
                    MONTO = MONTO - IMPTOS;
                    if (FOMENTO <> 'SI' ) then
                      MONTO = MONTO - VALORADIC;
                   END
                  MONTO = MONTO * FACTOR;
                  execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                  execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                  EXECUTE PROCEDURE CUENTA_INTERFAZ(21, :IDDOC, :CTAINVEN, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                  if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                  if (TIPOCUEN = 'I') then
                   BEGIN
                    FOR SELECT ARTI_COD, (FCDE_CANT * (FCDE_PRUNIT-FCDE_DTOMONTO)), FCDE_IVAMONTO, FCDE_CONSUMO
                      FROM FACTURAS_COMPRAS_DETALLE WHERE FACO_ID = :IDDOC INTO :ARTICULO, :MONTO, :IMPTOS, :VALORADIC DO
                       BEGIN
                       if (IMPINC = 'S') then
                        BEGIN
                         MONTO = MONTO - IMPTOS;
                         if (FOMENTO <> 'SI' ) then
                            MONTO = MONTO - VALORADIC;
                        END
                       MONTO = MONTO * FACTOR;
                       execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                       execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                       IF (CENT = 'B') THEN
                          INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                             VALUES (:IDC, :NUMITEMS, :CTAINVEN, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROYDET, :CENTRODET, NULL, NULL, NULL, :ARTICULO, 0, 0);
                       ELSE
                          INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                             VALUES (:IDC, :NUMITEMS, :CTAINVEN, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                       NUMITEMS = NUMITEMS + 1;
                       NETO = NETO + MONTO;
                       END
                   END
                  if (TIPOCUEN = 'C') then
                   BEGIN
                    IF (CENT = 'B') THEN
                       INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                         VALUES (:IDC, :NUMITEMS, :CTAINVEN, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROYDET, :CENTRODET, :NUMERO, NULL, :VENCE, NULL, 0, 21);
                    ELSE
                       INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                         VALUES (:IDC, :NUMITEMS, :CTAINVEN, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 21);
                    NUMITEMS = NUMITEMS + 1;
                    NETO = NETO + MONTO;
                   END
                  if (TIPOCUEN = 'N') then
                   BEGIN
                    IF (CENT = 'B') THEN
                       INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                          VALUES (:IDC, :NUMITEMS, :CTAINVEN, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROYDET, :CENTRODET, NULL, NULL, NULL, NULL, 0, 0);
                    ELSE
                       INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                          VALUES (:IDC, :NUMITEMS, :CTAINVEN, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NUMITEMS = NUMITEMS + 1;
                    NETO = NETO + MONTO;
                   END
                END
            END
        /* EL IVA */
        if (IVA = 'A') then
            BEGIN
            FOR SELECT MAX(COAR_CTAIVAC), SUM(FCDE_IVAMONTO), SUM(CAST(FCDE_CANT AS DOUBLE PRECISION) * (FCDE_PRUNIT-FCDE_DTOMONTO)), SUM(FCDE_CONSUMO)
                FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_COMPRAS_DETALLE F
                WHERE F.FACO_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND FCDE_IVAMONTO <> 0
                GROUP BY COAR_CTAIVAC
                INTO :CTAIVA, :IMPTOS, :MONTO, :VALORADIC DO
              if (IMPTOS <> 0) then
                BEGIN
                IMPTOS = CAST(IMPTOS AS DOUBLE PRECISION) * VRSUBT / MERCANCIA;
                if (IMPINC = 'S') then
                    BEGIN
                    MONTO = MONTO - IMPTOS;
                    if (FOMENTO <> 'SI' ) then
                        MONTO = MONTO - VALORADIC;
                    END
                MONTO = CAST(MONTO AS DOUBLE PRECISION) * VRSUBT / MERCANCIA;
                execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                EXECUTE PROCEDURE CUENTA_INTERFAZ(21, :IDDOC, :CTAIVA, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    FOR SELECT F.ARTI_COD, FCDE_IVAMONTO, (FCDE_CANT * (FCDE_PRUNIT-FCDE_DTOMONTO)), TAIV_PORC, FCDE_CONSUMO
                        FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_COMPRAS_DETALLE F, TARIFA_IVA T WHERE F.FACO_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTAIVAV = :CUENTA AND A.TAIV_COD = T.TAIV_COD
                        INTO :ARTICULO, :IMPTOS, :MONTO, :PORCIVA, :VALORADIC
                    DO
                        BEGIN
                        IMPTOS = CAST(IMPTOS AS DOUBLE PRECISION) * VRSUBT / MERCANCIA;
                        if (IMPINC = 'S') then
                            BEGIN
                            MONTO = MONTO - IMPTOS;
                            if (FOMENTO <> 'SI' ) then
                                MONTO = MONTO - VALORADIC;
                            END
                        MONTO = CAST(MONTO AS DOUBLE PRECISION) * VRSUBT / MERCANCIA;
                        execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :IMPTOS, 0, :MONTO, :PORCIVA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                        NUMITEMS = NUMITEMS + 1;
                        NETO = NETO + IMPTOS;
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :IMPTOS, 0, :MONTO, :IMPTOS*100/:MONTO, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 21);
                    NUMITEMS = NUMITEMS + 1;
                    NETO = NETO + IMPTOS;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :IMPTOS, 0, :MONTO, CAST(:IMPTOS AS DOUBLE PRECISION)*100/CAST(:MONTO AS DOUBLE PRECISION), :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NUMITEMS = NUMITEMS + 1;
                    NETO = NETO + IMPTOS;
                    END
                END
            END
        if (IVA = 'K') then /* IVA EN CTA CONSTANTE */
            BEGIN
            SELECT SUM(FCDE_IVAMONTO), SUM(CAST(FCDE_CANT AS DOUBLE PRECISION) * (FCDE_PRUNIT-FCDE_DTOMONTO)), SUM(FCDE_CONSUMO)
                FROM FACTURAS_COMPRAS_DETALLE F
                WHERE F.FACO_ID = :IDDOC  AND FCDE_IVAMONTO <> 0
                INTO :IMPTOS, :MONTO, :VALORADIC;
            if (IMPTOS <> 0) then
                BEGIN
                IMPTOS = CAST(IMPTOS AS DOUBLE PRECISION) * VRSUBT / MERCANCIA;
                if (IMPINC = 'S') then
                    BEGIN
                    MONTO = MONTO - IMPTOS;
                    if (FOMENTO <> 'SI' ) then
                        MONTO = MONTO - VALORADIC;
                    END
                MONTO = CAST(MONTO AS DOUBLE PRECISION) * VRSUBT / MERCANCIA;
                execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                EXECUTE PROCEDURE CUENTA_INTERFAZ(21, :IDDOC, :CTAIVA, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    FOR SELECT F.ARTI_COD, (FCDE_CANT * (FCDE_PRUNIT-FCDE_DTOMONTO)), FCDE_IVAMONTO, TAIV_PORC, FCDE_CONSUMO
                        FROM ARTICULO A, FACTURAS_COMPRAS_DETALLE F, TARIFA_IVA T WHERE F.FACO_ID = :IDDOC AND A.TAIV_COD = T.TAIV_COD
                        INTO :ARTICULO, :MONTO, :IMPTOS, :PORCIVA, :VALORADIC DO
                        BEGIN
                        IMPTOS = CAST(IMPTOS AS DOUBLE PRECISION) * VRSUBT / MERCANCIA;
                        if (IMPINC = 'S') then
                            BEGIN
                            MONTO = MONTO - IMPTOS;
                            if (FOMENTO <> 'SI' ) then
                                MONTO = MONTO - VALORADIC;
                            END
                        MONTO = CAST(MONTO AS DOUBLE PRECISION) * VRSUBT / MERCANCIA;
                        execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                        if (IMPTOS <> 0) then
                            BEGIN
                            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                VALUES (:IDC, :NUMITEMS, :CTAIVA, :CONCEPTO, '', :IMPTOS, 0, :MONTO, :PORCIVA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                            NUMITEMS = NUMITEMS + 1;
                            NETO = NETO + IMPTOS;
                            END
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NUMITEMS, :CTAIVA, :CONCEPTO, '', :IMPTOS, 0, :MONTO, :IMPTOS*100/:MONTO, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 21);
                    NUMITEMS = NUMITEMS + 1;
                    NETO = NETO + IMPTOS;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NUMITEMS, :CTAIVA, :CONCEPTO, '', :IMPTOS, 0, :MONTO, :IMPTOS*100/:MONTO, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NUMITEMS = NUMITEMS + 1;
                    NETO = NETO + IMPTOS;
                    END
                END
            END
        /* EL IMPOCONSUMO */
        if (CONSUMO = 'A') then
            BEGIN
            FOR SELECT MAX(COAR_CTACONS), SUM(FCDE_CONSUMO) FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_COMPRAS_DETALLE F
                WHERE F.FACO_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD GROUP BY COAR_CTACONS INTO :CTACONSUMO, :IMPTOS
            DO
              if (IMPTOS <> 0) then
                BEGIN
                execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                EXECUTE PROCEDURE CUENTA_INTERFAZ(21, :IDDOC, :CTACONSUMO, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (FOMENTO <> 'SI') then
                    BEGIN
                    if (TIPOCUEN = 'I') then
                        BEGIN
                        FOR SELECT F.ARTI_COD, FCDE_CONSUMO FROM ARTICULO A, FACTURAS_COMPRAS_DETALLE F WHERE F.FACO_ID = :IDDOC INTO :ARTICULO, :IMPTOS
                            DO
                            BEGIN
                            if (IMPTOS <> 0) then
                                BEGIN
                                execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                    VALUES (:IDC, :NUMITEMS, :CTACONSUMO, :CONCEPTO, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                                NUMITEMS = NUMITEMS + 1;
                                NETO = NETO + IMPTOS;
                                END
                            END
                        END
                    if (TIPOCUEN = 'C') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CTACONSUMO, :CONCEPTO, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                        NUMITEMS = NUMITEMS + 1;
                        NETO = NETO + IMPTOS;
                        END
                    if (TIPOCUEN = 'N') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CTACONSUMO, :CONCEPTO, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NUMITEMS = NUMITEMS + 1;
                        NETO = NETO + IMPTOS;
                        END
                    END
                ELSE
                    BEGIN
                    if (TIPOCUEN = 'I') then
                        BEGIN
                        FOR SELECT F.ARTI_COD, FCDE_CONSUMO FROM ARTICULO A, FACTURAS_COMPRAS_DETALLE F WHERE F.FACO_ID = :IDDOC INTO :ARTICULO, :IMPTOS
                            DO
                            BEGIN
                            if (IMPTOS <> 0) then
                                BEGIN
                                execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                    VALUES (:IDC, :NUMITEMS, :CTACONSUMO, :CONCEPTO, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                                NUMITEMS = NUMITEMS + 1;
                                NETO = NETO - IMPTOS;
                                END
                            END
                        END
                    if (TIPOCUEN = 'C') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CTACONSUMO, :CONCEPTO, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                        NUMITEMS = NUMITEMS + 1;
                        NETO = NETO - IMPTOS;
                        END
                    if (TIPOCUEN = 'N') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CTACONSUMO, :CONCEPTO, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NUMITEMS = NUMITEMS + 1;
                        NETO = NETO - IMPTOS;
                        END
                    END
                END
            END
        if (CONSUMO = 'K') then /* CONSUMO EN CTA CONSTANTE */
            BEGIN
            SELECT SUM(FCDE_CONSUMO) FROM FACTURAS_COMPRAS_DETALLE F WHERE F.FACO_ID = :IDDOC INTO :IMPTOS;
            if (IMPTOS <> 0) then
              BEGIN
              execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
              /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
              EXECUTE PROCEDURE CUENTA_INTERFAZ(21, :IDDOC, :CTACONSUMO, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
              if (ERRORC <> 0) then
                ERROR = ERROR + 1;
              if (FOMENTO <> 'SI') then
                BEGIN
                /* DEPENDE DEL TIPO DE CUENTA */
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT F.ARTI_COD, FCDE_CONSUMO FROM ARTICULO A, FACTURAS_COMPRAS_DETALLE F WHERE F.FACO_ID = :IDDOC INTO :ARTICULO, :IMPTOS
                        DO
                        BEGIN
                        if (IMPTOS <> 0) then
                            BEGIN
                            execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                VALUES (:IDC, :NUMITEMS, :CTACONSUMO, :CONCEPTO, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                            NUMITEMS = NUMITEMS + 1;
                            NETO = NETO + IMPTOS;
                            END
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    /* INSERTE EL REGISTRO DE LA BASE */
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NUMITEMS, :CTACONSUMO, :CONCEPTO, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    NUMITEMS = NUMITEMS + 1;
                    NETO = NETO + IMPTOS;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NUMITEMS, :CTACONSUMO, :CONCEPTO, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NUMITEMS = NUMITEMS + 1;
                    NETO = NETO + IMPTOS;
                    END
                END
              ELSE
                BEGIN
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT F.ARTI_COD, FCDE_CONSUMO FROM ARTICULO A, FACTURAS_COMPRAS_DETALLE F WHERE F.FACO_ID = :IDDOC INTO :ARTICULO, :IMPTOS
                        DO
                        BEGIN
                        if (IMPTOS <> 0) then
                            BEGIN
                           execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                           INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                VALUES (:IDC, :NUMITEMS, :CTACONSUMO, :CONCEPTO, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                            NUMITEMS = NUMITEMS + 1;
                            NETO = NETO - IMPTOS;
                            END
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    /* INSERTE EL REGISTRO DE LA BASE */
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NUMITEMS, :CTACONSUMO, :CONCEPTO, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    NUMITEMS = NUMITEMS + 1;
                    NETO = NETO - IMPTOS;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NUMITEMS, :CTACONSUMO, :CONCEPTO, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NUMITEMS = NUMITEMS + 1;
                    NETO = NETO - IMPTOS;
                    END
                END
              end
            END
        /* DESCUENTO */
        if ((CTADTO IS NOT NULL) AND
            (CTADTO <> '')) THEN
          BEGIN
          execute procedure redondee(VRDTO, DIG) returning_values (VRDTO);
          if (VRDTO <> 0) then
            begin
            /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
            EXECUTE PROCEDURE CUENTA_INTERFAZ(21, :IDDOC, :CTADTO, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :VRDTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 21);
                NUMITEMS = NUMITEMS + 1;
                NETO = NETO - VRDTO;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                /* INSERTE EL REGISTRO DE LA BASE */
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :VRDTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NUMITEMS = NUMITEMS + 1;
                NETO = NETO - VRDTO;
                END
            end
          END
        /* VALOR ADIC */
        if ((CTAADIC IS NOT NULL) AND
            (CTAADIC <> '')) THEN
          BEGIN
          execute procedure redondee(VRADIC, DIG) returning_values (VRADIC);
          if (VRADIC <> 0) then
            begin
            /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
            EXECUTE PROCEDURE CUENTA_INTERFAZ(21, :IDDOC, :CTAADIC, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :VRADIC, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 21);
                NUMITEMS = NUMITEMS + 1;
                NETO = NETO + VRADIC;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :VRADIC, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NUMITEMS = NUMITEMS + 1;
                NETO = NETO + VRADIC;
                END
            end
          END
        /* VALOR EXTRA */
        if ((CTAEXTRA IS NOT NULL) AND
            (CTAEXTRA <> '')) THEN
          BEGIN
          execute procedure redondee(VREXTRA, DIG) returning_values (VREXTRA);
          if (VREXTRA <> 0) then
            begin
            /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
            EXECUTE PROCEDURE CUENTA_INTERFAZ(21, :IDDOC, :CTAEXTRA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :VREXTRA, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 21);
                NUMITEMS = NUMITEMS + 1;
                NETO = NETO + VREXTRA;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :VREXTRA, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NUMITEMS = NUMITEMS + 1;
                NETO = NETO + VREXTRA;
                END
            end
          END

        /* DESCUENTE EL IMPOCONSUMO */
        SELECT SUM(FCDE_CONSUMO) FROM FACTURAS_COMPRAS_DETALLE F WHERE F.FACO_ID = :IDDOC INTO :IMPTOS;
        if (IMPTOS IS NULL) then
            IMPTOS = 0;
        vrsubt = vrsubt - IMPTOS;
        /* RETENCION FUENTE */
        if ((RTFTE = 'P') or (RTFTE = 'K')) then
          BEGIN
          execute procedure redondee(VRRTFTE, DIG) returning_values (VRRTFTE);
          if (VRRTFTE <> 0) then
            begin
            if (RTFTE = 'P') then
                CTARTFTE = TCTARTFTE;
            EXECUTE PROCEDURE CUENTA_INTERFAZ(21, :IDDOC, :CTARTFTE, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :VRRTFTE, (:VRSUBT*-1), :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NUMITEMS = NUMITEMS + 1;
                NETO = NETO - VRRTFTE;
                SUMA = VRRTFTE;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :VRRTFTE, (:VRSUBT*-1), :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NUMITEMS = NUMITEMS + 1;
                NETO = NETO - VRRTFTE;
                SUMA = VRRTFTE;
                END
            end
          END
        if (RTFTE = 'A') then
          BEGIN
          FOR SELECT MAX(COAR_CTARTFTE), MAX(COAR_RTFTE), MIN(COAR_RTBASE), SUM(FCDE_TOTAL-FCDE_IVAMONTO-FCDE_CONSUMO), SUM((FCDE_TOTAL-FCDE_IVAMONTO-FCDE_CONSUMO)*COAR_RTFTE)
            FROM CONTABIL_ARTICULO C, FACTURAS_COMPRAS_DETALLE F
            WHERE F.faco_id = :IDDOC AND F.ARTI_COD = C.ARTI_COD
            GROUP BY COAR_CTARTFTE
            INTO :CTARTFTE, :PRTFTE, :baseadic,  :MONTO, :VRRTFTE
            DO
            BEGIN
            MONTO = MONTO * FACTOR * -1;
            if (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, :VRSUBT, :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                        NUMITEMS = NUMITEMS + 1;
                        NETO = NETO - VRRTFTE;
                        SUMA = VRRTFTE;
                        END
                    if (TIPOCUEN = 'N') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :VRRTFTE, :VRSUBT, :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NUMITEMS = NUMITEMS + 1;
                        NETO = NETO - VRRTFTE;
                        SUMA = VRRTFTE;
                        END
                    end
                end
              END
          END
        /* RETENCION IVA */
        if ((RTIVA = 'P') or (RTIVA = 'K')) then
          BEGIN
          execute procedure redondee(VRRTIVA, DIG) returning_values (VRRTIVA);
          if (VRRTIVA <> 0) then
            begin
            if (RTIVA = 'P') then
                CTARTIVA = TCTARTIVA;
            EXECUTE PROCEDURE CUENTA_INTERFAZ(21, :IDDOC, :CTARTIVA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :VRRTIVA, (:VRIVA*-1), :PORC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 21);
                NUMITEMS = NUMITEMS + 1;
                NETO = NETO - VRRTIVA;
                SUMA = SUMA + VRRTIVA;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :VRRTIVA, (:VRIVA*-1), :PORC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NUMITEMS = NUMITEMS + 1;
                NETO = NETO - VRRTIVA;
                SUMA = SUMA + VRRTIVA;
                END
            end
          END
        /* RETENCION DE ICA */
        if ((RTICA = 'P') or (RTICA = 'K')) then
          BEGIN
          execute procedure redondee(VRRTICA, DIG) returning_values (VRRTICA);
          if (VRRTICA <> 0) then
            begin
            if (RTICA = 'P') then
                CTARTICA = TCTARTICA;
            EXECUTE PROCEDURE CUENTA_INTERFAZ(21, :IDDOC, :CTARTICA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :VRRTICA, (:VRSUBT*-1), :PRTICA, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 21);
                NUMITEMS = NUMITEMS + 1;
                NETO = NETO - VRRTICA;
                SUMA = SUMA + VRRTICA;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :VRRTICA, (:VRSUBT*-1), :PRTICA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NUMITEMS = NUMITEMS + 1;
                NETO = NETO - VRRTICA;
                SUMA = SUMA + VRRTICA;
                END
            end
          END
        /* CIERRE EL COMPROBANTE CONTRA LA CUENTA DEL TERCERO O LA CONSTANTE */
        if ((CXP = 'P') or (CXP = 'K')) then
            BEGIN
            SUMA = VRTOTAL - SUMA;
            execute procedure redondee(SUMA, DIG) returning_values (SUMA);
            if (CXP = 'P') then
                CTACXP = TCTAPROV;
            EXECUTE PROCEDURE CUENTA_INTERFAZ(21, :IDDOC, :CTACXP, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :SUMA, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 21);
            if (TIPOCUEN = 'N') then
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :SUMA, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NETO = NETO - SUMA;
            NUMITEMS = NUMITEMS + 1;
            END
        /* recorra las cuentas adicionales */
        FOR SELECT INCC_CUENTA, INCC_BASE, INCC_PORC, INCC_VALOR, INCC_DB FROM INTERFAZ_COMPRAS_CTAS
            WHERE INCO_ID = :IDINTER INTO :CUENTAADIC, :BASEADIC, :PORCADIC, :VALORADIC, :DBADIC
            DO
            BEGIN
            if (VALORADIC <> 0) then
                MONTO = VALORADIC;
            ELSE
                BEGIN
                if (:BASEADIC = 'SUBTOTAL') then
                    VALORADIC = VRTOTAL - VREXTRA - VRIVA - VRADIC + VRDTO;
                if (:BASEADIC = 'DESCUENTO') then
                    VALORADIC = VRDTO;
                if (:BASEADIC = 'IVA') then
                    VALORADIC = VRIVA;
                if (:BASEADIC = 'CONSUMO') then
                    SELECT SUM(FCDE_CONSUMO) FROM FACTURAS_COMPRAS_DETALLE F WHERE F.FACO_ID = :IDDOC INTO :VALORADIC;
                if (:BASEADIC = 'ADICIONAL') then
                    VALORADIC = VRADIC;
                if (:BASEADIC = 'EXTRA') then
                    VALORADIC = VREXTRA;
                if (:BASEADIC = 'TOTAL') then
                    VALORADIC = VRTOTAL;
                MONTO = CAST(VALORADIC AS DOUBLE PRECISION) * PORCADIC / 100;
                END
            if (MONTO <> 0) then
                BEGIN
                execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                EXECUTE PROCEDURE CUENTA_INTERFAZ(21, :IDDOC, :CUENTAADIC, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'C') then
                    BEGIN
                    if (DBADIC = 'S') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTAADIC, :CONCEPTO, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                        SUMA = SUMA + MONTO;
                        NETO = NETO + MONTO;
                        END
                    ELSE
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTAADIC, :CONCEPTO, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                        SUMA = SUMA - MONTO;
                        NETO = NETO - MONTO;
                        END
                    NUMITEMS = NUMITEMS + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    if (DBADIC = 'S') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTAADIC, :CONCEPTO, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        SUMA = SUMA + MONTO;
                        NETO = NETO + MONTO;
                        END
                    ELSE
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTAADIC, :CONCEPTO, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        SUMA = SUMA - MONTO;
                        NETO = NETO - MONTO;
                        END
                    NUMITEMS = NUMITEMS + 1;
                    END
                END
            END
        if (NETO <> 0) then
            BEGIN
            EXECUTE PROCEDURE lee_configuracion ('CONTABILIDAD','GENERAL','CUENTA PARA CUADRAR COMPROBANTES DESCUADRADOS DE INTERFAZ') returning_values (:ctaadic);
            if (ctaadic <> '') then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(21, :IDDOC, :CTAADIC, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'C') then
                    BEGIN
                    if (NETO < 0) then
                        BEGIN
                        NETO = NETO * -1;
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :NETO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                        END
                    ELSE
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :NETO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                        END
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    if (NETO < 0) then
                        BEGIN
                        NETO = NETO * -1;
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :NETO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        END
                    ELSE
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :NETO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        END
                    END
                END
            END
        END
    if (ERROR > 0) then
        VER = 'S';
    SUSPEND;
    END
ELSE
    BEGIN
    EXECUTE PROCEDURE ERROR (21, :IDDOC, :PREFIJO, 1);
    ERROR = ERROR + 1;
    VER = 'S';
    SUSPEND;
    END
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE CONTABILICE_COMP_SIMPLIFICADO(
    IDI INTEGER)
RETURNS (
    ID INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    ESTADO VARCHAR(20),
    IDC INTEGER)
AS
 /*$$IBE$$ DECLARE VARIABLE VER CHAR(2);
declare variable ERROR INTEGER; $$IBE$$*/ 
BEGIN /*$$IBE$$ 
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;
   $$IBE$$*/ /* 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; */ /*$$IBE$$ 
  EXECUTE PROCEDURE CONTABIL_FACTCOMP (:ID, :IDI) RETURNING_VALUES (:ERROR, VER, :IDC);
  if (ERROR = 0) then
    BEGIN
 $$IBE$$*/ /*    EXECUTE PROCEDURE CONTABILIZA_PENDIENTE (:IDC); */ /*$$IBE$$ 
    ESTADO = 'OK';
    END
  ELSE
    ESTADO = 'ERROR';
  suspend;
  END
 $$IBE$$*/ SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE FACTCOMP_SIN_CONTABILIDAD(
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    ID INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    ESTADO VARCHAR(20),
    IDI INTEGER,
    IDC INTEGER)
AS
 /*$$IBE$$ DECLARE VARIABLE VER CHAR(2);
declare variable FECICNT VARCHAR(10);
declare variable FECFCNT VARCHAR(10);
declare variable ERROR INTEGER;
declare variable idref INTEGER; $$IBE$$*/ 
BEGIN /*$$IBE$$ 
EXECUTE PROCEDURE fecha_a_conta(FECINI) returning_values (FECICNT);
EXECUTE PROCEDURE fecha_a_conta(FECFIN) returning_values (FECFCNT);
FOR SELECT FACO_ID, PREF_PRE, FACO_NUMERO FROM FACTURAS_COMPRA WHERE FACO_ANULADO = 'N' AND
    FACO_FECHA >= :FECINI AND FACO_FECHA <= :FECFIN ORDER BY FACO_ID
    INTO :ID, :PREF, :NUMERO
DO
  BEGIN
  idref = null;
  SELECT ENCO_IDREF FROM COMPROBANTE_ENCABEZADO WHERE ENCO_TIPOREF = 21 AND ENCO_FECHA >= :FECICNT AND ENCO_FECHA <= :FECFCNT and ENCO_IDREF = :id into :idref;
  if (idref IS NULL) then
  begin
   ESTADO = 'PROCESANDO';
   SUSPEND;
   SELECT MAX(INCO_ID) FROM INTERFAZ_COMPRAS WHERE PREF_PRE = :PREF AND TIDO_COD = 21 INTO :IDI;
   EXECUTE PROCEDURE CONTABIL_FACTCOMP (:ID, :IDI) RETURNING_VALUES (:ERROR, VER, :IDC);
   if (ERROR = 0) then
    BEGIN
    EXECUTE PROCEDURE CONTABILIZA_PENDIENTE (:IDC);
    ESTADO = 'OK';
    END
   ELSE
    ESTADO = 'ERROR';
   suspend;
  End
  END
 $$IBE$$*/ SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

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

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE FACTCOMP_SIN_CONTABILIDAD(
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    ID INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    ESTADO VARCHAR(20),
    IDI INTEGER,
    IDC INTEGER)
AS
DECLARE VARIABLE VER CHAR(2);
declare variable FECICNT VARCHAR(10);
declare variable FECFCNT VARCHAR(10);
declare variable ERROR INTEGER;
declare variable idref INTEGER;
BEGIN
EXECUTE PROCEDURE fecha_a_conta(FECINI) returning_values (FECICNT);
EXECUTE PROCEDURE fecha_a_conta(FECFIN) returning_values (FECFCNT);
FOR SELECT FACO_ID, PREF_PRE, FACO_NUMERO FROM FACTURAS_COMPRA WHERE FACO_ANULADO = 'N' AND
    FACO_FECHA >= :FECINI AND FACO_FECHA <= :FECFIN ORDER BY FACO_ID
    INTO :ID, :PREF, :NUMERO
DO
  BEGIN
  idref = null;
  SELECT ENCO_IDREF FROM COMPROBANTE_ENCABEZADO WHERE ENCO_TIPOREF = 21 AND ENCO_FECHA >= :FECICNT AND ENCO_FECHA <= :FECFCNT and ENCO_IDREF = :id into :idref;
  if (idref IS NULL) then
  begin
   ESTADO = 'PROCESANDO';
   SUSPEND;
   SELECT MAX(INCO_ID) FROM INTERFAZ_COMPRAS WHERE PREF_PRE = :PREF AND TIDO_COD = 21 INTO :IDI;
   EXECUTE PROCEDURE CONTABIL_FACTCOMP (:ID, :IDI) RETURNING_VALUES (:ERROR, VER, :IDC);
   if (ERROR = 0) then
    BEGIN
    EXECUTE PROCEDURE CONTABILIZA_PENDIENTE (:IDC);
    ESTADO = 'OK';
    END
   ELSE
    ESTADO = 'ERROR';
   suspend;
  End
  END
END

^

SET TERM ; ^


/* 20090727 */
/* TOTAL NETO FACTIRA MENOS ANTICIPO SIN RETENCIONES */
SET TERM ^ ;

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

/* ACUMULE LOS PUNTOS, SE HACE ACA POR SER POSTERIOR AL DETALLE */
if (ANULADO = 'N') then
    EXECUTE PROCEDURE acumula_puntos_cliente (31, :id, :nit, :fecha) returning_values (:PUNTOS);
EXECUTE PROCEDURE consulta_puntos_cliente (:id, :nit, :fecha) returning_values (:puntos, :puntosacum, :puntosvenc, :fecptos);
if (DTOIT1M IS NULL) then
    DTOIT1M = 0;
if (DTOIT2M IS NULL) then
    DTOIT2M = 0;
if (DTOIT3M IS NULL) then
    DTOIT3M = 0;
SELECT CLIE_COD, C.ZONA_COD, ZONA_NOM
    FROM CLIENTES C, ZONAS Z
    WHERE TERC_NIT = :NIT AND C.ZONA_COD = Z.ZONA_COD
    INTO :CODIGOCL, :ZONACOD, :ZONANOM;
SELECT CLSU_DIR, CLSU_CIUDAD, CLSU_TEL FROM CLIENTE_SUCURSALES WHERE TERC_NIT = :NIT AND CLCU_COD = :SUCUR
    INTO :DIRECCION, :CIUDAD, :TELEFONO;
DIASVENCE = VENCE - FECHA;
if (DIASVENCE > 0) then
    CONTCRED = 'CREDITO ' || CAST(DIASVENCE AS VARCHAR(3)) || ' DIAS';
ELSE
    CONTCRED = 'CONTADO';
SUBTOTAL = TOTALFAC - EXTRA - IVAMONTO - ADICIONAL + DTOMONTO;
if (DTOITE3 = 'SI') then
    BEGIN
    SELECT SUM(FADE_DTOMONTO) FROM FACTURAS_DETALLE WHERE FACT_ID = :id INTO :sumdtoit;
    SUBTOTAL = SUBTOTAL + sumdtoit + dtoit1m + dtoit2m + dtoit3m;
    END
if (INGTER <> '') then
    BEGIN
    SELECT SUM(FADE_TOTAL) FROM FACTURAS_DETALLE D, ARTICULO A WHERE A.arti_cod = D.arti_cod AND FACT_ID = :id AND GRUP_COD = :ingter
        INTO :ingterceros;
    INGPROPIOS = SUBTOTAL - INGTERCEROS;
    END
EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'FECHA AUTORETENEDOR NO DESCONTAR RETENCIONES DEL SALDO PERO SI CONTABILIZARLAS') returning_values (AUTORET);
if (AUTORET <> '') then
    FAUTORET = CAST(AUTORET AS DATE);
else
    FAUTORET = '9999/12/31';
if (FECHA > fautoret) then
    TOTALPAGAR = TOTALFAC - RTEIVAMONTO - RTEICAMONTO - ANTICIPO;
ELSE
    TOTALPAGAR = TOTALFAC - RTEFTEMONTO - RTEIVAMONTO - RTEICAMONTO - ANTICIPO;
TOTALNETO = TOTALFAC - ANTICIPO;
if (RECIBIDO <> 0) then
    CAMBIO = RECIBIDO - totalpagar;
ELSE
    CAMBIO = 0;
SUMAEX = 0;
SUMA1 = 0;
SUMA2 = 0;
SUMA3 = 0;
IVA1 = 0;
IVA2 = 0;
IVA3 = 0;
TOTCONSUMO = 0;
MONTOPAGO1 = 0;
SELECT MAX(AUDI_HORA) FROM AUDITORIA WHERE TIDO_COD = 31 AND AUDI_IDDOC = :ID AND AUDI_OPER = 'I' INTO :HORA;
/* AHORA LAS FORMAS DE PAGO, BUSQUE EL ABONO DE HOY A LA FACTURA */
ITEMFP = 1;
MONTOPAGO1 = 0;
MONTOPAGO2 = 0;
MONTOPAGO3 = 0;
FOR SELECT FOPA_NOM, RCPA_MONTO FROM RECIBOS_CAJA_PAGO P, FORMAS_PAGO F, RECIBOS_CAJA R, RECIBOS_CAJA_DETALLE D
    WHERE R.RECA_ID = P.RECA_ID AND R.RECA_ID = D.RECA_ID AND P.FOPA_ID = F.FOPA_ID AND RECA_FECHA = :FECHA AND RCDE_TIPODOC = 31 AND RCDE_IDDOC = :ID
    INTO :formap, :MONTOP
    DO
    BEGIN
    if (ITEMFP = 1) then
        BEGIN
        FORMAPAGO1 = FORMAP;
        MONTOPAGO1 = MONTOP;
        END
    if (ITEMFP = 2) then
        BEGIN
        FORMAPAGO2 = FORMAP;
        MONTOPAGO2 = MONTOP;
        END
    if (ITEMFP = 3) then
        BEGIN
        FORMAPAGO3 = FORMAP;
        MONTOPAGO3 = MONTOP;
        END
    ITEMFP = ITEMFP + 1;
    END
EXECUTE PROCEDURE lee_configuracion ('FACTURACION','DOCUMENTOS','ORDENAR ITEMS POR CODIGO DE ARTICULO') returning_values (:ORDENCOD);
EXECUTE PROCEDURE lee_configuracion ('FACTURACION','POS', 'IMPRIMIR DEVOLUCIONES DE ARTICULOS NEGATIVOS') returning_values (:imprdev);
totcajas = 0;
totbase = 0;
if (ORDENCOD = 'SI') then
    BEGIN
    FOR SELECT FADE_ITEM, D.ARTI_COD, FADE_CODBAR, SUBSTR(FADE_DESC,1,60), ARTI_DESCORTA, FADE_CANT, FADE_UNIDAD, FADE_FACTOR, BODE_COD, FADE_LOTE, LIPR_COD, FADE_PRUNIT, FADE_DTOPORC, FADE_DTOMONTO, FADE_IVAPORC, FADE_IVAMONTO, FADE_CONSUMO, FADE_TOTAL, FADE_REFERENCIA,
        GRUP_COD, SUBG_COD, MARC_COD, ARTI_PESO, ARTI_ANCHO, ARTI_ALTO, ARTI_LARGO, TAIV_COD, FADE_DEVUELTO, FADE_OBS, FADE_DTO1, FADE_DTO2, FADE_DTO3, FADE_DTOM1, FADE_DTOM2, FADE_DTOM3, FADE_CAJAS, FADE_BASE, FADE_PORCBASE
        FROM FACTURAS_DETALLE D, ARTICULO A
        WHERE D.ARTI_COD = A.ARTI_COD AND D.FACT_ID = :ID
        ORDER BY D.ARTI_COD
        INTO :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :DESCORTA, :CANT, :UNIDAD, :FACTOR, :BODITEM, :LOTE, :LISTAPR, :PRUNIT, :DTOITPORC, :DTOITMONTO, :IVAPORC, :IVAITMONTO, :CONSUMO, :TOTAL, :refitem,
        :GRUPO, :SUBGRUPO, :MARCA, :PESO, :ANCHO, :ALTO, :LARGO, :TARIFA, :devuelto, :obsitem, :dtoit1, :dtoit2, :dtoit3, :dtoitm1, :dtoitm2, :dtoitm3, :cajas, :base, :porcbase
        DO
          BEGIN
          if (ARTICULO = CODBAR) then
            SELECT FIRST 1 COBA_COD FROM barras_articulo WHERE ARTI_COD = :articulo INTO :CODBAR;
          if (IMPRDEV <> 'SI') then
            BEGIN
            if ((CANT >= 0) AND (DEVUELTO = 0)) then
                IMPR = 'S';
            ELSE
                IMPR = 'N'; /* ES DEVOLUCION */
            END
          ELSE
            IMPR = 'S';
          if (IMPR = 'S') then
            BEGIN
            prneto = PRUNIT - DTOITMONTO - dtoitm1 - dtoitm2 - dtoitm3;
            if (IMPTOS = 'S') then
                if (cant <> 0) then
                    prnetosiniva = PRUNIT - DTOITMONTO - ((IVAITMONTO+CONSUMO) / CANT) - dtoitm1 - dtoitm2 - dtoitm3;
                else
                    prnetosiniva = PRUNIT - DTOITMONTO - dtoitm1 - dtoitm2 - dtoitm3;
            ELSE
                prnetosiniva = PRUNIT - DTOITMONTO - dtoit1m - dtoit2m - dtoit3m;
            if (ICOINC = 'SI') then
                SUBTOTIT = TOTAL - IVAITMONTO;
            else
                SUBTOTIT = TOTAL - IVAITMONTO - CONSUMO;
            TOTCONSUMO = TOTCONSUMO + CONSUMO;
            TOTBASE = TOTBASE + BASE;
            SELECT LOTE_VENCE FROM LOTES WHERE LOTE_NRO = :lote AND ARTI_COD = :ARTICULO AND BODE_COD = :boditem INTO :vlote;
            if ((REFITEM <> '.t') or (REFITEM IS NULL)) then
                BEGIN
                /* NO SUME LOS ENSAMBLES */
                if (IVAPORC = 0) then
                    SUMAEX = SUMAEX + TOTAL;
                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;
                END
            if (ANCHO IS NULL) then
                ANCHO = 0;
            if (ALTO IS NULL) then
                ALTO = 0;
            if (LARGO IS NULL) then
                LARGO = 0;
            if (PESO IS NULL) then
                PESO = 0;
            PESO = (PESO / 1000) * CANT * FACTOR;
            totcajas = totcajas + cajas;
            if (substr(ARTICULO,1,2) = '.t') then
                BEGIN
                REFITEM = '';
                TOTAL = 0;
                SUBTOTIT = 0;
                END
            SELECT STAND_COD FROM STANDS WHERE ARTI_COD = :ARTICULO AND STAND_BODEGA = :boditem INTO :stand;
            factcant = NULL;
            SELECT FIRST 1 UNAR_FACCAN FROM unidad_articulo WHERE ARTI_COD = :articulo INTO :factcant;
            if (factcant IS NULL) then
                BEGIN
                ALTERNATIVAS = 0;
                PRINCIPALES = (CANT * FACTOR);
                END
            ELSE
                BEGIN
                ALTERNATIVAS = FLOOR(CANT * factor / factcant);
                PRINCIPALES = (CANT * FACTOR) - (alternativas * factcant);
                END
            SUSPEND;
            END
          END
    END
ELSE
    BEGIN
    FOR SELECT FADE_ITEM, D.ARTI_COD, FADE_CODBAR, SUBSTR(FADE_DESC,1,60), ARTI_DESCORTA, FADE_CANT, FADE_UNIDAD, FADE_FACTOR, BODE_COD, FADE_LOTE, LIPR_COD, FADE_PRUNIT, FADE_DTOPORC, FADE_DTOMONTO, FADE_IVAPORC, FADE_IVAMONTO, FADE_CONSUMO, FADE_TOTAL, FADE_REFERENCIA,
        GRUP_COD, SUBG_COD, MARC_COD, ARTI_PESO, ARTI_ANCHO, ARTI_ALTO, ARTI_LARGO, TAIV_COD, FADE_DEVUELTO, FADE_OBS, FADE_DTO1, FADE_DTO2, FADE_DTO3, FADE_DTOM1, FADE_DTOM2, FADE_DTOM3, FADE_CAJAS, FADE_BASE, FADE_PORCBASE
        FROM FACTURAS_DETALLE D, ARTICULO A
        WHERE D.ARTI_COD = A.ARTI_COD AND D.FACT_ID = :ID
        ORDER BY FADE_ITEM
        INTO :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :DESCORTA, :CANT, :UNIDAD, :FACTOR, :BODITEM, :LOTE, :LISTAPR, :PRUNIT, :DTOITPORC, :DTOITMONTO, :IVAPORC, :IVAITMONTO, :CONSUMO, :TOTAL, :refitem,
        :GRUPO, :SUBGRUPO, :MARCA, :PESO, :ANCHO, :ALTO, :LARGO, :TARIFA, :devuelto, :obsitem, :dtoit1, :dtoit2, :dtoit3, :dtoitm1, :dtoitm2, :dtoitm3, :cajas, :base, :porcbase
        DO
          BEGIN
          if (IMPRDEV <> 'SI') then
            BEGIN
            if ((CANT >= 0) AND (DEVUELTO = 0)) then
                IMPR = 'S';
            ELSE
                IMPR = 'N'; /* ES DEVOLUCION */
            END
          ELSE
            IMPR = 'S';
          if (IMPR = 'S') then
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :GRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :MARCA INTO NOMMARCA;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :SUBGRUPO AND GRUP_COD = :GRUPO INTO :NOMSUBG;
            prneto = PRUNIT - DTOITMONTO - dtoitm1 - dtoitm2 - dtoitm3;
            if (IMPTOS = 'S') then
                if (cant <> 0) then
                    prnetosiniva = PRUNIT - DTOITMONTO - ((IVAITMONTO+CONSUMO) / CANT) - dtoit1m - dtoit2m - dtoit3m;
                else
                    prnetosiniva = PRUNIT - DTOITMONTO - dtoitm1 - dtoitm2 - dtoitm3;
            ELSE
                prnetosiniva = PRUNIT - DTOITMONTO - dtoitm1 - dtoitm2 - dtoitm3;
            if (ICOINC = 'SI') then
                SUBTOTIT = TOTAL - IVAITMONTO;
            else
                SUBTOTIT = TOTAL - IVAITMONTO - CONSUMO;
            TOTCONSUMO = TOTCONSUMO + CONSUMO;
            TOTBASE = TOTBASE + BASE;
            SELECT LOTE_VENCE FROM LOTES WHERE LOTE_NRO = :lote AND ARTI_COD = :ARTICULO AND BODE_COD = :boditem INTO :vlote;
            if ((REFITEM <> '.t') or (REFITEM IS NULL)) then
                BEGIN
                /* NO SUME LOS ENSAMBLES */
                if (IVAPORC = 0) then
                    SUMAEX = SUMAEX + TOTAL;
                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;
                END
            if (ANCHO IS NULL) then
                ANCHO = 0;
            if (ALTO IS NULL) then
                ALTO = 0;
            if (LARGO IS NULL) then
                LARGO = 0;
            if (PESO IS NULL) then
                PESO = 0;
            PESO = (PESO / 1000)* CANT * FACTOR;
            totcajas = totcajas + cajas;
            if (substr(ARTICULO,1,2) = '.t') then
                BEGIN
                REFITEM = '';
                TOTAL = 0;
                SUBTOTIT = 0;
                END
            SELECT STAND_COD FROM STANDS WHERE ARTI_COD = :ARTICULO AND STAND_BODEGA = :boditem INTO :stand;
            factcant = NULL;
            SELECT FIRST 1 UNAR_FACCAN FROM unidad_articulo WHERE ARTI_COD = :articulo INTO :factcant;
            if (factcant IS NULL) then
                BEGIN
                ALTERNATIVAS = 0;
                PRINCIPALES = (CANT * FACTOR);
                END
            ELSE
                BEGIN
                ALTERNATIVAS = FLOOR(CANT * factor / factcant);
                PRINCIPALES = (CANT * FACTOR) - (alternativas * factcant);
                END
            SUSPEND;
            END
          END
    END
END
^

SET TERM ; ^


/* 20090728 */
/* null en totales */
SET TERM ^ ;

ALTER PROCEDURE IMPR_CONCILIACIONB(
    ID INTEGER)
RETURNS (
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    CONCEPTO VARCHAR(60),
    CODCTA VARCHAR(3),
    NROCUENTA VARCHAR(20),
    BANCO VARCHAR(60),
    TITULAR VARCHAR(60),
    FECINI DATE,
    FECFIN DATE,
    SALDOINIS NUMERIC(18,2),
    SALDOFINS NUMERIC(18,2),
    SALDOINIE NUMERIC(18,2),
    SALDOFINE NUMERIC(18,2),
    CLASE CHAR(1),
    NOMCLASE VARCHAR(60),
    FECDOC DATE,
    OPERACION VARCHAR(20),
    TIPODOC VARCHAR(8),
    NUMDOC VARCHAR(10),
    CONCDOC VARCHAR(60),
    MONTODOC NUMERIC(18,2),
    EXPLDOC VARCHAR(255),
    TOTAL1 NUMERIC(18,2),
    TOTAL2 NUMERIC(18,2),
    TOTAL3 NUMERIC(18,2),
    TOTAL4 NUMERIC(18,2),
    SALDOE NUMERIC(18,2),
    SALDOS NUMERIC(18,2))
AS
declare variable CTA INTEGER;
begin
SELECT COBN_PREFIJO, COBN_NUMERO, COBN_FECHA, COBN_CONCEPTO, COBN_FECINI, COBN_FECFIN, COBN_EXTRACTOINI, COBN_EXTRACTOFIN,
    E.CUBA_COD, CUBA_CODCTA, CUBA_NUMERO, CUBA_TITULAR, BANC_NOMBRE
    FROM conciliacion_encabezado E, cuentas_banco C, bancos B
    WHERE E.cuba_cod = C.cuba_cod AND C.banc_cod = B.banc_cod AND E.cobn_id = :ID
    INTO :prefijo, :numero, :fecha, :concepto, :fecini, :fecfin, :saldoinie, :saldofine,
        :cta, :codcta, :nrocuenta, :titular, :banco;
EXECUTE PROCEDURE saldo_cuenta_banco(:CTA, :fecini) returning_values (:saldoinis);
EXECUTE PROCEDURE saldo_cuenta_banco(:CTA, :fecfin+1) returning_values (:saldofins);
SELECT SUM(COBN_MONTO) FROM conciliacion_bancaria WHERE COBN_ID = :ID AND COBN_CLASE = '1' INTO :total1;
SELECT SUM(COBN_MONTO) FROM conciliacion_bancaria WHERE COBN_ID = :ID AND COBN_CLASE = '2' INTO :total2;
SELECT SUM(COBN_MONTO) FROM conciliacion_bancaria WHERE COBN_ID = :ID AND COBN_CLASE = '3' INTO :total3;
SELECT SUM(COBN_MONTO) FROM conciliacion_bancaria WHERE COBN_ID = :ID AND COBN_CLASE = '4' INTO :total4;
if (TOTAL1 IS NULL) then
    TOTAL1 = 0;
if (TOTAL2 IS NULL) then
    TOTAL2 = 0;
if (TOTAL3 IS NULL) then
    TOTAL3 = 0;
if (TOTAL4 IS NULL) then
    TOTAL4 = 0;
SALDOE = saldofine + total3 - total4;
SALDOS = saldofins + total1 - total2;
FOR SELECT COBN_CLASE, COBN_FEC, COBN_OPER, COBN_CONC, COBN_MONTO, TIDO_NOMCORTO, COBN_EXPLICA, COBN_PREFIJO || COBN_NUMERO
    FROM conciliacion_bancaria C, tipo_documento T WHERE C.cobn_tipodoc = T.tido_cod AND
    COBN_ID = :id AND COBN_CLASE <> '0' ORDER BY COBN_CLASE, COBN_ITEM
    INTO :clase, :fecdoc, :operacion, :concdoc, :montodoc, :tipodoc, :expldoc, :numdoc
    DO
    BEGIN
    if (CLASE = 1) then
        nomclase = 'CONSIGNACIONES Y CREDITOS FALTANTES EN LIBROS';
    if (CLASE = 2) then
        nomclase = 'CHEQUES Y DEBITOS FALTANTES EN LIBROS';
    if (CLASE = 3) then
        nomclase = 'CONSIGNACIONES Y CREDITOS FALTANTES EN EL EXTRACTO';
    if (CLASE = 4) then
        nomclase = 'CHEQUES Y DEBITOS FALTANTES EN EL EXTRACTO';
    suspend;
    END
end
^

SET TERM ; ^

/* 20090731 */
/* STRING TRUNCATION POR FORMA DE PAGO */
SET TERM ^ ;

CREATE OR ALTER procedure IMPR_CONSIGNA (
    ID integer)
returns (
    PREF varchar(4),
    NUMERO varchar(6),
    FECHA date,
    CONCEPTO varchar(60),
    CODCUENTA varchar(3),
    NROCUENTA varchar(20),
    TITULAR varchar(60),
    SUCURSAL varchar(60),
    CTACONTA varchar(20),
    CODBANCO varchar(2),
    NOMBANCO varchar(60),
    ITEM integer,
    NOMCAJA varchar(60),
    FORPAGO varchar(30),
    DET_CODBCO varchar(2),
    DET_CUENTA varchar(20),
    DET_NUMERO varchar(20),
    DET_FECHA date,
    DET_MONTO numeric(18,2),
    TOTALFORMA1 numeric(18,2),
    TOTALFORMA2 numeric(18,2),
    TOTALFORMA3 numeric(18,2),
    TOTALFORMA4 numeric(18,2))
AS
declare variable ITEMS INTEGER;
declare variable MAX_CONS INTEGER;
declare variable IDFORMA INTEGER;
BEGIN
totalforma1 = 0;
totalforma2 = 0;
totalforma3 = 0;
totalforma4 = 0;
  SELECT PRBA_PREF, CONS_NUMERO, CONS_FECHA, CONS_CONCEPTO, CUBA_CODCTA, CUBA_NUMERO, CUBA_TITULAR, CUBA_SUCURSAL, CUBA_CTACONTA, CB.BANC_COD, BANC_NOMBRE
    FROM CONSIGNA C, CUENTAS_BANCO CB, BANCOS B
    WHERE C.CUBA_COD = CB.CUBA_COD AND CB.BANC_COD = B.BANC_COD AND CONS_ID = :ID
    into
    :PREF, :NUMERO, :FECHA, :CONCEPTO, :CODCUENTA, :NROCUENTA, TITULAR, SUCURSAL, CTACONTA, CODBANCO, NOMBANCO;
  FOR SELECT CODE_ITEM2, CAJA_NOMBRE, FOPA_NOM, CODE_BANCO, CODE_CUENTA, CODE_NUMERO, CODE_FECHA, CODE_MONTO, D.FOPA_ID
    FROM consigna_detalle D, FORMAS_PAGO F, CAJAS C
    WHERE D.FOPA_ID = F.FOPA_ID AND D.CONS_ID = :ID AND C.CAJA_ID = D.CAJA_ID
    ORDER BY CODE_ITEM2
    INTO
    :ITEM, :NOMCAJA, :FORPAGO, :DET_CODBCO, :DET_CUENTA, :DET_NUMERO, :DET_FECHA, :DET_MONTO, :IDFORMA
    DO
        BEGIN
        if (IDFORMA = 1) then
            TOTALFORMA1 = TOTALFORMA1 + DET_MONTO;
        if (IDFORMA = 2) then
            TOTALFORMA2 = TOTALFORMA2 + DET_MONTO;
        if (IDFORMA = 3) then
            TOTALFORMA3 = TOTALFORMA3 + DET_MONTO;
        if (IDFORMA = 4) then
            TOTALFORMA4 = TOTALFORMA4 + DET_MONTO;
        SUSPEND;
        END
END
^

SET TERM ; ^


/* 20090731b */

INSERT INTO TIPO_DOCUMENTO (TIDO_COD, TIDO_NOMCORTO, TIDO_NOMLARGO, TIDO_MODULO, TIDO_INVE, TIDO_CART, TIDO_CXP, TIDO_CAJA, TIDO_BCOS) VALUES (39, 'REVPRECI', 'REVISION DE PRECIOS', 'VENTAS', 'N', 'N', 'N', 'N', 'N');
COMMIT WORK;

CREATE SEQUENCE ID_REVPRECIO;

CREATE TABLE REVISION_PRECIOS (
    RVPR_ID        T_ID NOT NULL,
    RVPR_PREF      VARCHAR(4) CHARACTER SET NONE,
    RVPR_NUMERO    T_NUMDOC,
    RVPR_FECHA     DATE,
    RVPR_LISTA     T_ID NOT NULL,
    RVPR_ANULADO   T_BOOLEANO,
    RVPR_CONFIRMA  T_BOOLEANO,
    RVPR_NUMOK     T_BOOLEANO
);
ALTER TABLE REVISION_PRECIOS ADD CONSTRAINT PK_REVISION_PRECIOS PRIMARY KEY (RVPR_ID);
grant select, delete, insert, update on revision_precios to public;

ALTER TABLE REVISION_PRECIOS
ADD RVPR_FECINI DATE;
ALTER TABLE REVISION_PRECIOS
ADD RVPR_FECFIN DATE;
ALTER TABLE REVISION_PRECIOS
ADD RVPR_USUARIO T_USUARIO;

CREATE TABLE REVPRECIOS_DETALLE (
    RVPR_ID       T_ID NOT NULL,
    RVPD_ITEM     T_ID NOT NULL,
    ARTI_COD      T_COD_ARTICULO,
    RVPD_PRVIEJO  T_MONTO,
    RVPR_PRNUEVO  T_MONTO,
    RVPR_ANULADO  T_BOOLEANO
);
ALTER TABLE REVPRECIOS_DETALLE ADD CONSTRAINT PK_REVPRECIOS_DETALLE PRIMARY KEY (RVPR_ID, RVPD_ITEM);
grant select, delete, insert, update on revprecios_detalle to public;

ALTER TABLE REVPRECIOS_DETALLE ADD CONSTRAINT FK_REVPRECIOS_DETALLE_1 FOREIGN KEY (RVPR_ID) REFERENCES REVISION_PRECIOS (RVPR_ID) ON DELETE CASCADE ON UPDATE CASCADE;

SET TERM ^ ;

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

SET TERM ; ^

grant EXECUTE on PROCEDURE cambie_id_revprecio to PUBLIC;

SET TERM ^ ;

create trigger REVISION_PRECIOS_BI for REVISION_PRECIOS
active BEFORE INSERT position 0
as
declare variable NUMERO VARCHAR(6);
declare variable AUTOM CHAR(1);
declare variable EXISTE CHAR(1);
begin
if (NEW.rvpr_numok = 'N') then
  BEGIN
  /* Actualice el contador del prefijo */
  SELECT PREF_ACTUAL, PREF_AUTO FROM PREFIJOS WHERE TIDO_COD = 39 AND PREF_PRE = NEW.rvpr_pref INTO :NUMERO, :AUTOM;
  /* ACTUALICE EL NUMERO EN COMPROBANTE_ENCABEZADO  */
  if (AUTOM = 'S') then
    BEGIN
    NEW.rvpr_numero = NUMERO;
    NUMERO = CAST((CAST(NUMERO AS INTEGER) + 1) AS CHAR(6));
    UPDATE PREFIJOS
      SET PREF_ACTUAL = :NUMERO
    WHERE TIDO_COD = 39 AND PREF_PRE = NEW.rvpr_pref;
    END
  ELSE
    BEGIN
    if (CAST(NUMERO AS INTEGER) = CAST(NEW.rvpr_numero AS INTEGER)) then
        UPDATE PREFIJOS
          SET PREF_ACTUAL = CAST((CAST(PREF_ACTUAL AS INTEGER) + 1) AS CHAR(6))
        WHERE TIDO_COD = 39 AND PREF_PRE = NEW.rvpr_pref;
    END
  EXECUTE procedure completa_ceros (NEW.rvpr_numero) returning_values (NEW.rvpr_numero);
  NEW.rvpr_numok = 'S';
  END
/* Verifique que el numero no existe previamente */
EXISTE = 'N';
SELECT 'S' FROM revision_precios WHERE RVPR_PREF = NEW.rvpr_pref AND RVPR_NUMERO = NEW.rvpr_numero INTO :EXISTE;
if (EXISTE = 'S') then
    EXCEPTION DOCUMENTO_REGISTRADO 'Ya existe una revisión de precios con el número ' || new.rvpr_pref || new.rvpr_numero;
end
^

SET TERM ; ^

SET TERM ^ ;

create trigger REVISION_PRECIOS_AI for REVISION_PRECIOS
active AFTER INSERT position 0
as
begin
IF (NEW.rvpr_id <> 0) THEN
    begin
    INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
        VALUES (USER, 39, NEW.rvpr_id, 'I', NEW.rvpr_pref || NEW.rvpr_numero);
    end
end
^

SET TERM ; ^

SET TERM ^ ;

create trigger REVISION_PRECIOS_AU for REVISION_PRECIOS
active AFTER UPDATE position 0
as
begin
if (OLD.rvpr_anulado <> NEW.rvpr_anulado) then
    UPDATE revprecios_detalle SET RVPR_ANULADO = NEW.rvpr_anulado
        WHERE RVPR_ID = NEW.rvpr_id;

if (NEW.rvpr_anulado = 'S') then
  INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
    VALUES (USER, 39, NEW.rvpr_id, 'A', NEW.rvpr_pref || NEW.rvpr_numero);
ELSE
  INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
    VALUES (USER, 39, NEW.rvpr_id, 'U', NEW.rvpr_pref || NEW.rvpr_numero);
end
^

SET TERM ; ^

SET TERM ^ ;

create trigger REVISION_PRECIOS_AD for REVISION_PRECIOS
active AFTER DELETE position 0
as
begin
INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
    VALUES (USER, 39, OLD.rvpr_id, 'D', OLD.rvpr_pref || OLD.rvpr_numero);
end
^

SET TERM ; ^

SET TERM ^ ;

create or ALTER procedure IMPR_REVPRECIOS (
    ID INTEGER)
returns (
    FECHA DATE,
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    LISTA INTEGER,
    NOMLISTA VARCHAR(30),
    FECINI DATE,
    FECFIN DATE,
    CONFIRMA CHAR(1),
    ITEM INTEGER,
    ARTIC VARCHAR(20),
    DESCRIPCION VARCHAR(60),
    CODBAR VARCHAR(20),
    CODGRP VARCHAR(2),
    NOMGRP VARCHAR(30),
    CODSUB VARCHAR(3),
    NOMSUB VARCHAR(30),
    CODMAR VARCHAR(3),
    NOMMAR VARCHAR(30),
    PRVIEJO NUMERIC(18,2),
    PRNUEVO NUMERIC(18,2))
as
begin
select RVPR_PREF, RVPR_NUMERO, RVPR_FECHA, RVPR_LISTA, LIPR_NOM, RVPR_FECINI, RVPR_FECFIN, RVPR_CONFIRMA
    FROM revision_precios R, lista_precios L
    WHERE R.rvpr_lista = L.lipr_cod AND R.rvpr_id = :ID
    INTO :pref, :numero, :fecha, :lista, :nomlista, :FECINI, :FECFIN, :CONFIRMA;
FOR SELECT RVPD_ITEM, D.ARTI_COD, A.arti_des, A.GRUP_COD, A.subg_cod, A.marc_cod, G.grup_nom, D.rvpd_prviejo, D.rvpr_prnuevo
    FROM revprecios_detalle D, articulo A, GRUPO G
    WHERE D.arti_cod = A.arti_cod AND A.grup_cod = G.grup_cod
    INTO :item, :artic, :descripcion, :codgrp, :codsub, :codmar, :nomgrp, :prviejo, :prnuevo
    DO
    BEGIN
    CODBAR = '';
    SELECT FIRST 1 COBA_COD FROM BARRAS_ARTICULO WHERE ARTI_COD = :artic INTO :CODBAR;
    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :codmar INTO :nommar;
    SELECT SUBG_NOM FROM subgrupo WHERE SUBG_COD = :codsub INTO :nomsub;
    suspend;
    END
end
^

SET TERM ; ^

grant EXECUTE on PROCEDURE impr_revprecios to public;

ALTER TABLE REVPRECIOS_DETALLE
ADD RVPD_DESC T_CONCEPTO;
ALTER TABLE REVPRECIOS_DETALLE
ADD RVPD_UNIDAD T_UNIDAD;
ALTER TABLE REVPRECIOS_DETALLE
ADD RVPD_COSTO T_MONTO;
ALTER TABLE REVPRECIOS_DETALLE
ADD RVPD_PORC T_PORCENTAJE;
ALTER TABLE REVPRECIOS_DETALLE
ADD RPVD_SUGERIDO T_MONTO;

SET TERM ^ ;

create trigger REVPRECIOS_DETALLE_AI for REVPRECIOS_DETALLE
active AFTER INSERT position 0
as
declare variable confirma char(1);
declare variable lista INTEGER;
begin
/* Actualice los precios */
select rvpr_confirma, rvpr_lista from revision_precios where rvpr_id = new.rvpr_id into :confirma, :lista;
if (CONFIRMA = 'S') then
    BEGIN
    UPDATE precios_articulo SET PRAR_FIJO = NEW.rvpr_prnuevo WHERE ARTI_COD = NEW.arti_cod AND LIPR_COD = :lista;
    END
end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER REVPRECIOS_DETALLE_AU FOR REVPRECIOS_DETALLE
ACTIVE AFTER UPDATE POSITION 0
as
declare variable confirma char(1);
declare variable lista INTEGER;
begin
if (new.rvpr_anulado <> 'S')then
    begin
    select rvpr_confirma, rvpr_lista from revision_precios where rvpr_id = new.rvpr_id into :confirma, :lista;
    if (CONFIRMA = 'S') then
        BEGIN
        UPDATE precios_articulo SET PRAR_FIJO = new.rvpr_prnuevo WHERE ARTI_COD = new.arti_cod AND LIPR_COD = :lista;
        END
    end
end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure IMPR_REVPRECIOS (
    ID integer)
returns (
    FECHA date,
    PREF varchar(4),
    NUMERO varchar(6),
    LISTA integer,
    NOMLISTA varchar(30),
    FECINI date,
    FECFIN date,
    CONFIRMA char(1),
    ITEM integer,
    ARTIC varchar(20),
    DESCRIPCION varchar(60),
    CODBAR varchar(20),
    CODGRP varchar(2),
    NOMGRP varchar(30),
    CODSUB varchar(3),
    NOMSUB varchar(30),
    CODMAR varchar(3),
    NOMMAR varchar(30),
    PRVIEJO numeric(18,2),
    PRNUEVO numeric(18,2))
AS
begin
select RVPR_PREF, RVPR_NUMERO, RVPR_FECHA, RVPR_LISTA, LIPR_NOM, RVPR_FECINI, RVPR_FECFIN, RVPR_CONFIRMA
    FROM revision_precios R, lista_precios L
    WHERE R.rvpr_lista = L.lipr_cod AND R.rvpr_id = :ID
    INTO :pref, :numero, :fecha, :lista, :nomlista, :FECINI, :FECFIN, :CONFIRMA;
FOR SELECT RVPD_ITEM, D.ARTI_COD, A.arti_des, A.GRUP_COD, A.subg_cod, A.marc_cod, G.grup_nom, D.rvpd_prviejo, D.rvpr_prnuevo
    FROM revprecios_detalle D, articulo A, GRUPO G
    WHERE D.arti_cod = A.arti_cod AND A.grup_cod = G.grup_cod and d.rvpr_id = :ID
    INTO :item, :artic, :descripcion, :codgrp, :codsub, :codmar, :nomgrp, :prviejo, :prnuevo
    DO
    BEGIN
    CODBAR = '';
    SELECT FIRST 1 COBA_COD FROM BARRAS_ARTICULO WHERE ARTI_COD = :artic INTO :CODBAR;
    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :codmar INTO :nommar;
    SELECT SUBG_NOM FROM subgrupo WHERE SUBG_COD = :codsub and grup_cod = :codgrp INTO :nomsub;
    suspend;
    END
end
^

SET TERM ; ^


/* 20090806 */

INSERT INTO CONFIGURACION (CONF_MODULO, CONF_CATEGORIA, CONF_PROPIEDAD, CONF_VALOR, CONF_POSIBLES, CONF_AYUDA) VALUES ('INVENTARIO', 'EXISTENCIAS', 'INCLUIR CANTIDAD EN REPORTE DE PLANILLA DE CONTEO', 'NO', 'SI,NO', 'SI: Muestra la existencia actual en el reporte de planilla');
commit work;

/* 20090806b */

/* MULTIPLE ROWS SI PUNTOS CLIENTE POR RECAUDO Y SE HACEN ABONOS PARCIALES */
SET TERM ^ ;

CREATE OR ALTER procedure CONSULTA_PUNTOS_CLIENTE (
    IDDOC integer,
    CLIENTE varchar(20),
    FECHA date)
returns (
    PTDOC integer,
    PTACUM integer,
    PTVENCER integer,
    FECPTOS date)
AS
declare variable numrows integer;
declare variable anos integer;
declare variable fecaux date;
declare variable fecaux2 date;
declare variable nitcontado varchar(20);
declare variable ok integer;
declare variable ptaux integer;
declare variable PTAGENCIA CHAR(2);
begin
ptdoc = 0;
ptacum = 0;
ptvencer = 0;
ok = 1;
if (IDDOC <> 0) then
    begin
    /* verifique que no sea cliente de contado de la autorización */
    select max(auto_nitcontado) from facturas f, autorizaciones a
        where f.pref_pre = a.pref_pre and fact_id = :iddoc into :nitcontado;
    if (cliente = nitcontado) then
        ok = 0;

    if (ok <> 0) then
        begin
        select count(ptcl_id) from puntos_cliente where ptcl_nit = :cliente and ptcl_tipodoc = 31 and ptcl_iddoc = :iddoc into :numrows;
        if (numrows <> 0) then
            begin
            select SUM(ptcl_db-ptcl_cr) from puntos_cliente where ptcl_nit = :cliente and ptcl_tipodoc = 31 and ptcl_iddoc = :iddoc into :ptdoc;
            end
        end
    end
/* los puntos totales */
EXECUTE PROCEDURE lee_configuracion ('FACTURACION', 'POS', 'MANEJAR TABLA DE PUNTOS DE CLIENTE ACUMULADOS PARA VARIAS AGENCIAS') returning_values (ptagencia);
if (PTAGENCIA = 'SI') then
    BEGIN
    SELECT PTCA_ACUMULADO, PTCA_PORVENCER, PTCA_FECHA FROM puntos_cliente_acumulado WHERE TERC_NIT = :cliente
        INTO :ptacum, :ptvencer, :fecptos;
    SUSPEND;
    END
ELSE
    BEGIN
    numrows = 0;
    select max(ptcl_fecha) from puntos_cliente where ptcl_nit = :cliente and ptcl_fecha <= :fecha into :fecaux;
    if (fecaux is not null) then
        select max(ptcl_saldo), sum(ptcl_db - ptcl_cr) from puntos_cliente where ptcl_nit = :cliente and ptcl_fecha = :fecaux into :ptacum, :ptvencer;
    if (ptacum is null) then
        ptacum = 0;
    if (ptvencer is null) then
        ptvencer = 0;
    ptacum = ptacum + ptvencer;
    /* reste los vencidos */
    execute procedure lee_configuracion('FACTURACION', 'FACTURAS', 'VENCIMIENTO DE PUNTOS POR CLIENTE EN AÑOS') returning_values (:anos);
    fecaux = fecha - (anos * 365);
    select max(ptcl_fecha) from puntos_cliente where ptcl_nit = :cliente and ptcl_fecha <= :fecaux into :fecaux;
    if (fecaux is not null) then
        select max(ptcl_saldo), sum(ptcl_db - ptcl_cr) from puntos_cliente where ptcl_nit = :cliente and ptcl_fecha = :fecaux into :ptvencer, :ptaux;
    else
        begin
        ptvencer = 0;
        ptaux = 0;
        end
    if (ptvencer is null) then
        ptvencer = 0;
    if (ptaux is null) then
        ptaux = 0;
    ptacum = ptacum - ptvencer - ptaux;
    /* los por vencer */
    execute procedure lee_configuracion('FACTURACION', 'FACTURAS', 'VENCIMIENTO DE PUNTOS POR CLIENTE EN AÑOS') returning_values (:anos);
    fecaux = fecha - (anos * 365);
    fecaux2 = fecha - (anos * 365) + 30;
    select sum(ptcl_db - ptcl_cr) from puntos_cliente where ptcl_nit = :cliente and ptcl_fecha >= :fecaux and ptcl_fecha <= :fecaux2 into :ptvencer;
    if (ptvencer is null) then
        ptvencer = 0;
    fecptos = :fecha;
    suspend;
    END
end
^

SET TERM ; ^

SET TERM ^ ;

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

 $$IBE$$*/ /* ACUMULE LOS PUNTOS, SE HACE ACA POR SER POSTERIOR AL DETALLE */ /*$$IBE$$ 
if (ANULADO = 'N') then
    EXECUTE PROCEDURE acumula_puntos_cliente (31, :id, :nit, :fecha) returning_values (:PUNTOS);
EXECUTE PROCEDURE consulta_puntos_cliente (:id, :nit, :fecha) returning_values (:puntos, :puntosacum, :puntosvenc, :fecptos);
if (DTOIT1M IS NULL) then
    DTOIT1M = 0;
if (DTOIT2M IS NULL) then
    DTOIT2M = 0;
if (DTOIT3M IS NULL) then
    DTOIT3M = 0;
SELECT CLIE_COD, C.ZONA_COD, ZONA_NOM
    FROM CLIENTES C, ZONAS Z
    WHERE TERC_NIT = :NIT AND C.ZONA_COD = Z.ZONA_COD
    INTO :CODIGOCL, :ZONACOD, :ZONANOM;
SELECT CLSU_DIR, CLSU_CIUDAD, CLSU_TEL FROM CLIENTE_SUCURSALES WHERE TERC_NIT = :NIT AND CLCU_COD = :SUCUR
    INTO :DIRECCION, :CIUDAD, :TELEFONO;
DIASVENCE = VENCE - FECHA;
if (DIASVENCE > 0) then
    CONTCRED = 'CREDITO ' || CAST(DIASVENCE AS VARCHAR(3)) || ' DIAS';
ELSE
    CONTCRED = 'CONTADO';
SUBTOTAL = TOTALFAC - EXTRA - IVAMONTO - ADICIONAL + DTOMONTO;
if (DTOITE3 = 'SI') then
    BEGIN
    SELECT SUM(FADE_DTOMONTO) FROM FACTURAS_DETALLE WHERE FACT_ID = :id INTO :sumdtoit;
    SUBTOTAL = SUBTOTAL + sumdtoit + dtoit1m + dtoit2m + dtoit3m;
    END
if (INGTER <> '') then
    BEGIN
    SELECT SUM(FADE_TOTAL) FROM FACTURAS_DETALLE D, ARTICULO A WHERE A.arti_cod = D.arti_cod AND FACT_ID = :id AND GRUP_COD = :ingter
        INTO :ingterceros;
    INGPROPIOS = SUBTOTAL - INGTERCEROS;
    END
EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'FECHA AUTORETENEDOR NO DESCONTAR RETENCIONES DEL SALDO PERO SI CONTABILIZARLAS') returning_values (AUTORET);
if (AUTORET <> '') then
    FAUTORET = CAST(AUTORET AS DATE);
else
    FAUTORET = '9999/12/31';
if (FECHA > fautoret) then
    TOTALPAGAR = TOTALFAC - RTEIVAMONTO - RTEICAMONTO - ANTICIPO;
ELSE
    TOTALPAGAR = TOTALFAC - RTEFTEMONTO - RTEIVAMONTO - RTEICAMONTO - ANTICIPO;
TOTALNETO = TOTALFAC - ANTICIPO;
if (RECIBIDO <> 0) then
    CAMBIO = RECIBIDO - totalpagar;
ELSE
    CAMBIO = 0;
SUMAEX = 0;
SUMA1 = 0;
SUMA2 = 0;
SUMA3 = 0;
IVA1 = 0;
IVA2 = 0;
IVA3 = 0;
TOTCONSUMO = 0;
MONTOPAGO1 = 0;
SELECT MAX(AUDI_HORA) FROM AUDITORIA WHERE TIDO_COD = 31 AND AUDI_IDDOC = :ID AND AUDI_OPER = 'I' INTO :HORA;
 $$IBE$$*/ /* AHORA LAS FORMAS DE PAGO, BUSQUE EL ABONO DE HOY A LA FACTURA */ /*$$IBE$$ 
ITEMFP = 1;
MONTOPAGO1 = 0;
MONTOPAGO2 = 0;
MONTOPAGO3 = 0;
FOR SELECT FOPA_NOM, RCPA_MONTO FROM RECIBOS_CAJA_PAGO P, FORMAS_PAGO F, RECIBOS_CAJA R, RECIBOS_CAJA_DETALLE D
    WHERE R.RECA_ID = P.RECA_ID AND R.RECA_ID = D.RECA_ID AND P.FOPA_ID = F.FOPA_ID AND RECA_FECHA = :FECHA AND RCDE_TIPODOC = 31 AND RCDE_IDDOC = :ID
    INTO :formap, :MONTOP
    DO
    BEGIN
    if (ITEMFP = 1) then
        BEGIN
        FORMAPAGO1 = FORMAP;
        MONTOPAGO1 = MONTOP;
        END
    if (ITEMFP = 2) then
        BEGIN
        FORMAPAGO2 = FORMAP;
        MONTOPAGO2 = MONTOP;
        END
    if (ITEMFP = 3) then
        BEGIN
        FORMAPAGO3 = FORMAP;
        MONTOPAGO3 = MONTOP;
        END
    ITEMFP = ITEMFP + 1;
    END
EXECUTE PROCEDURE lee_configuracion ('FACTURACION','DOCUMENTOS','ORDENAR ITEMS POR CODIGO DE ARTICULO') returning_values (:ORDENCOD);
EXECUTE PROCEDURE lee_configuracion ('FACTURACION','POS', 'IMPRIMIR DEVOLUCIONES DE ARTICULOS NEGATIVOS') returning_values (:imprdev);
totcajas = 0;
totbase = 0;
if (ORDENCOD = 'SI') then
    BEGIN
    FOR SELECT FADE_ITEM, D.ARTI_COD, FADE_CODBAR, SUBSTR(FADE_DESC,1,60), ARTI_DESCORTA, FADE_CANT, FADE_UNIDAD, FADE_FACTOR, BODE_COD, FADE_LOTE, LIPR_COD, FADE_PRUNIT, FADE_DTOPORC, FADE_DTOMONTO, FADE_IVAPORC, FADE_IVAMONTO, FADE_CONSUMO, FADE_TOTAL, FADE_REFERENCIA,
        GRUP_COD, SUBG_COD, MARC_COD, ARTI_PESO, ARTI_ANCHO, ARTI_ALTO, ARTI_LARGO, TAIV_COD, FADE_DEVUELTO, FADE_OBS, FADE_DTO1, FADE_DTO2, FADE_DTO3, FADE_DTOM1, FADE_DTOM2, FADE_DTOM3, FADE_CAJAS, FADE_BASE, FADE_PORCBASE
        FROM FACTURAS_DETALLE D, ARTICULO A
        WHERE D.ARTI_COD = A.ARTI_COD AND D.FACT_ID = :ID
        ORDER BY D.ARTI_COD
        INTO :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :DESCORTA, :CANT, :UNIDAD, :FACTOR, :BODITEM, :LOTE, :LISTAPR, :PRUNIT, :DTOITPORC, :DTOITMONTO, :IVAPORC, :IVAITMONTO, :CONSUMO, :TOTAL, :refitem,
        :GRUPO, :SUBGRUPO, :MARCA, :PESO, :ANCHO, :ALTO, :LARGO, :TARIFA, :devuelto, :obsitem, :dtoit1, :dtoit2, :dtoit3, :dtoitm1, :dtoitm2, :dtoitm3, :cajas, :base, :porcbase
        DO
          BEGIN
          if (ARTICULO = CODBAR) then
            SELECT FIRST 1 COBA_COD FROM barras_articulo WHERE ARTI_COD = :articulo INTO :CODBAR;
          if (IMPRDEV <> 'SI') then
            BEGIN
            if ((CANT >= 0) AND (DEVUELTO = 0)) then
                IMPR = 'S';
            ELSE
                IMPR = 'N';  $$IBE$$*/ /* ES DEVOLUCION */ /*$$IBE$$ 
            END
          ELSE
            IMPR = 'S';
          if (IMPR = 'S') then
            BEGIN
            prneto = PRUNIT - DTOITMONTO - dtoitm1 - dtoitm2 - dtoitm3;
            if (IMPTOS = 'S') then
                if (cant <> 0) then
                    prnetosiniva = PRUNIT - DTOITMONTO - ((IVAITMONTO+CONSUMO) / CANT) - dtoitm1 - dtoitm2 - dtoitm3;
                else
                    prnetosiniva = PRUNIT - DTOITMONTO - dtoitm1 - dtoitm2 - dtoitm3;
            ELSE
                prnetosiniva = PRUNIT - DTOITMONTO - dtoit1m - dtoit2m - dtoit3m;
            if (ICOINC = 'SI') then
                SUBTOTIT = TOTAL - IVAITMONTO;
            else
                SUBTOTIT = TOTAL - IVAITMONTO - CONSUMO;
            TOTCONSUMO = TOTCONSUMO + CONSUMO;
            TOTBASE = TOTBASE + BASE;
            SELECT LOTE_VENCE FROM LOTES WHERE LOTE_NRO = :lote AND ARTI_COD = :ARTICULO AND BODE_COD = :boditem INTO :vlote;
            if ((REFITEM <> '.t') or (REFITEM IS NULL)) then
                BEGIN
                 $$IBE$$*/ /* NO SUME LOS ENSAMBLES */ /*$$IBE$$ 
                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;
                END
            if (ANCHO IS NULL) then
                ANCHO = 0;
            if (ALTO IS NULL) then
                ALTO = 0;
            if (LARGO IS NULL) then
                LARGO = 0;
            if (PESO IS NULL) then
                PESO = 0;
            PESO = (PESO / 1000) * CANT * FACTOR;
            totcajas = totcajas + cajas;
            if (substr(ARTICULO,1,2) = '.t') then
                BEGIN
                REFITEM = '';
                TOTAL = 0;
                SUBTOTIT = 0;
                END
            SELECT STAND_COD FROM STANDS WHERE ARTI_COD = :ARTICULO AND STAND_BODEGA = :boditem INTO :stand;
            factcant = NULL;
            SELECT FIRST 1 UNAR_FACCAN FROM unidad_articulo WHERE ARTI_COD = :articulo INTO :factcant;
            if (factcant IS NULL) then
                BEGIN
                ALTERNATIVAS = 0;
                PRINCIPALES = (CANT * FACTOR);
                END
            ELSE
                BEGIN
                ALTERNATIVAS = FLOOR(CANT * factor / factcant);
                PRINCIPALES = (CANT * FACTOR) - (alternativas * factcant);
                END
            SUSPEND;
            END
          END
    END
ELSE
    BEGIN
    FOR SELECT FADE_ITEM, D.ARTI_COD, FADE_CODBAR, SUBSTR(FADE_DESC,1,60), ARTI_DESCORTA, FADE_CANT, FADE_UNIDAD, FADE_FACTOR, BODE_COD, FADE_LOTE, LIPR_COD, FADE_PRUNIT, FADE_DTOPORC, FADE_DTOMONTO, FADE_IVAPORC, FADE_IVAMONTO, FADE_CONSUMO, FADE_TOTAL, FADE_REFERENCIA,
        GRUP_COD, SUBG_COD, MARC_COD, ARTI_PESO, ARTI_ANCHO, ARTI_ALTO, ARTI_LARGO, TAIV_COD, FADE_DEVUELTO, FADE_OBS, FADE_DTO1, FADE_DTO2, FADE_DTO3, FADE_DTOM1, FADE_DTOM2, FADE_DTOM3, FADE_CAJAS, FADE_BASE, FADE_PORCBASE
        FROM FACTURAS_DETALLE D, ARTICULO A
        WHERE D.ARTI_COD = A.ARTI_COD AND D.FACT_ID = :ID
        ORDER BY FADE_ITEM
        INTO :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :DESCORTA, :CANT, :UNIDAD, :FACTOR, :BODITEM, :LOTE, :LISTAPR, :PRUNIT, :DTOITPORC, :DTOITMONTO, :IVAPORC, :IVAITMONTO, :CONSUMO, :TOTAL, :refitem,
        :GRUPO, :SUBGRUPO, :MARCA, :PESO, :ANCHO, :ALTO, :LARGO, :TARIFA, :devuelto, :obsitem, :dtoit1, :dtoit2, :dtoit3, :dtoitm1, :dtoitm2, :dtoitm3, :cajas, :base, :porcbase
        DO
          BEGIN
          if (IMPRDEV <> 'SI') then
            BEGIN
            if ((CANT >= 0) AND (DEVUELTO = 0)) then
                IMPR = 'S';
            ELSE
                IMPR = 'N';  $$IBE$$*/ /* ES DEVOLUCION */ /*$$IBE$$ 
            END
          ELSE
            IMPR = 'S';
          if (IMPR = 'S') then
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :GRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :MARCA INTO NOMMARCA;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :SUBGRUPO AND GRUP_COD = :GRUPO INTO :NOMSUBG;
            prneto = PRUNIT - DTOITMONTO - dtoitm1 - dtoitm2 - dtoitm3;
            if (IMPTOS = 'S') then
                if (cant <> 0) then
                    prnetosiniva = PRUNIT - DTOITMONTO - ((IVAITMONTO+CONSUMO) / CANT) - dtoit1m - dtoit2m - dtoit3m;
                else
                    prnetosiniva = PRUNIT - DTOITMONTO - dtoitm1 - dtoitm2 - dtoitm3;
            ELSE
                prnetosiniva = PRUNIT - DTOITMONTO - dtoitm1 - dtoitm2 - dtoitm3;
            if (ICOINC = 'SI') then
                SUBTOTIT = TOTAL - IVAITMONTO;
            else
                SUBTOTIT = TOTAL - IVAITMONTO - CONSUMO;
            TOTCONSUMO = TOTCONSUMO + CONSUMO;
            TOTBASE = TOTBASE + BASE;
            SELECT LOTE_VENCE FROM LOTES WHERE LOTE_NRO = :lote AND ARTI_COD = :ARTICULO AND BODE_COD = :boditem INTO :vlote;
            if ((REFITEM <> '.t') or (REFITEM IS NULL)) then
                BEGIN
                 $$IBE$$*/ /* NO SUME LOS ENSAMBLES */ /*$$IBE$$ 
                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;
                END
            if (ANCHO IS NULL) then
                ANCHO = 0;
            if (ALTO IS NULL) then
                ALTO = 0;
            if (LARGO IS NULL) then
                LARGO = 0;
            if (PESO IS NULL) then
                PESO = 0;
            PESO = (PESO / 1000)* CANT * FACTOR;
            totcajas = totcajas + cajas;
            if (substr(ARTICULO,1,2) = '.t') then
                BEGIN
                REFITEM = '';
                TOTAL = 0;
                SUBTOTIT = 0;
                END
            SELECT STAND_COD FROM STANDS WHERE ARTI_COD = :ARTICULO AND STAND_BODEGA = :boditem INTO :stand;
            factcant = NULL;
            SELECT FIRST 1 UNAR_FACCAN FROM unidad_articulo WHERE ARTI_COD = :articulo INTO :factcant;
            if (factcant IS NULL) then
                BEGIN
                ALTERNATIVAS = 0;
                PRINCIPALES = (CANT * FACTOR);
                END
            ELSE
                BEGIN
                ALTERNATIVAS = FLOOR(CANT * factor / factcant);
                PRINCIPALES = (CANT * FACTOR) - (alternativas * factcant);
                END
            SUSPEND;
            END
          END
    END
 $$IBE$$*/ SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE IMPR_REDENCION(
    ID INTEGER)
RETURNS (
    NUMERO VARCHAR(6),
    FECHA DATE,
    NIT VARCHAR(20),
    NOMCLIENTE VARCHAR(60),
    DIR VARCHAR(60),
    TEL VARCHAR(60),
    PREMIO VARCHAR(15),
    NOMPREMIO VARCHAR(60),
    PUNTOS INTEGER,
    PUNTOSACUM INTEGER,
    PUNTOSVENC INTEGER,
    FECPTOS DATE)
AS
 /*$$IBE$$ declare variable puntosaux INTEGER; $$IBE$$*/ 
begin /*$$IBE$$ 
SELECT PTRE_NUMERO, PTRE_FECHA, PTRE_NIT, TERC_NOM, TERC_DIR, TERC_TEL, R.PTPR_COD, PTPR_NOMBRE, PTRE_PUNTOS
    FROM PUNTOS_REDENCION R, puntos_premios P, TERCEROS T
    WHERE R.ptre_nit = T.terc_nit AND R.ptpr_cod = P.ptpr_cod AND R.ptre_id = :ID
    INTO :NUMERO, :FECHA, :NIT, :NOMCLIENTE, :DIR, :TEL, :PREMIO, :NOMPREMIO, :PUNTOS;
EXECUTE PROCEDURE consulta_puntos_cliente (0, :nit, :fecha) returning_values (:puntosaux, :puntosacum, :puntosvenc, :fecptos);
suspend;
 $$IBE$$*/ SUSPEND;
end
^

SET TERM ; ^

SET TERM ^ ;

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

/* ACUMULE LOS PUNTOS, SE HACE ACA POR SER POSTERIOR AL DETALLE */
if (ANULADO = 'N') then
    EXECUTE PROCEDURE acumula_puntos_cliente (31, :id, :nit, :fecha) returning_values (:PUNTOS);
EXECUTE PROCEDURE consulta_puntos_cliente (:id, :nit, :fecha) returning_values (:puntos, :puntosacum, :puntosvenc, :fecptos);
if (DTOIT1M IS NULL) then
    DTOIT1M = 0;
if (DTOIT2M IS NULL) then
    DTOIT2M = 0;
if (DTOIT3M IS NULL) then
    DTOIT3M = 0;
SELECT CLIE_COD, C.ZONA_COD, ZONA_NOM
    FROM CLIENTES C, ZONAS Z
    WHERE TERC_NIT = :NIT AND C.ZONA_COD = Z.ZONA_COD
    INTO :CODIGOCL, :ZONACOD, :ZONANOM;
SELECT CLSU_DIR, CLSU_CIUDAD, CLSU_TEL FROM CLIENTE_SUCURSALES WHERE TERC_NIT = :NIT AND CLCU_COD = :SUCUR
    INTO :DIRECCION, :CIUDAD, :TELEFONO;
DIASVENCE = VENCE - FECHA;
if (DIASVENCE > 0) then
    CONTCRED = 'CREDITO ' || CAST(DIASVENCE AS VARCHAR(3)) || ' DIAS';
ELSE
    CONTCRED = 'CONTADO';
SUBTOTAL = TOTALFAC - EXTRA - IVAMONTO - ADICIONAL + DTOMONTO;
if (DTOITE3 = 'SI') then
    BEGIN
    SELECT SUM(FADE_DTOMONTO) FROM FACTURAS_DETALLE WHERE FACT_ID = :id INTO :sumdtoit;
    SUBTOTAL = SUBTOTAL + sumdtoit + dtoit1m + dtoit2m + dtoit3m;
    END
if (INGTER <> '') then
    BEGIN
    SELECT SUM(FADE_TOTAL) FROM FACTURAS_DETALLE D, ARTICULO A WHERE A.arti_cod = D.arti_cod AND FACT_ID = :id AND GRUP_COD = :ingter
        INTO :ingterceros;
    INGPROPIOS = SUBTOTAL - INGTERCEROS;
    END
EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'FECHA AUTORETENEDOR NO DESCONTAR RETENCIONES DEL SALDO PERO SI CONTABILIZARLAS') returning_values (AUTORET);
if (AUTORET <> '') then
    FAUTORET = CAST(AUTORET AS DATE);
else
    FAUTORET = '9999/12/31';
if (FECHA > fautoret) then
    TOTALPAGAR = TOTALFAC - RTEIVAMONTO - RTEICAMONTO - ANTICIPO;
ELSE
    TOTALPAGAR = TOTALFAC - RTEFTEMONTO - RTEIVAMONTO - RTEICAMONTO - ANTICIPO;
TOTALNETO = TOTALFAC - ANTICIPO;
if (RECIBIDO <> 0) then
    CAMBIO = RECIBIDO - totalpagar;
ELSE
    CAMBIO = 0;
SUMAEX = 0;
SUMA1 = 0;
SUMA2 = 0;
SUMA3 = 0;
IVA1 = 0;
IVA2 = 0;
IVA3 = 0;
TOTCONSUMO = 0;
MONTOPAGO1 = 0;
SELECT MAX(AUDI_HORA) FROM AUDITORIA WHERE TIDO_COD = 31 AND AUDI_IDDOC = :ID AND AUDI_OPER = 'I' INTO :HORA;
/* AHORA LAS FORMAS DE PAGO, BUSQUE EL ABONO DE HOY A LA FACTURA */
ITEMFP = 1;
MONTOPAGO1 = 0;
MONTOPAGO2 = 0;
MONTOPAGO3 = 0;
FOR SELECT FOPA_NOM, RCPA_MONTO FROM RECIBOS_CAJA_PAGO P, FORMAS_PAGO F, RECIBOS_CAJA R, RECIBOS_CAJA_DETALLE D
    WHERE R.RECA_ID = P.RECA_ID AND R.RECA_ID = D.RECA_ID AND P.FOPA_ID = F.FOPA_ID AND RECA_FECHA = :FECHA AND RCDE_TIPODOC = 31 AND RCDE_IDDOC = :ID
    INTO :formap, :MONTOP
    DO
    BEGIN
    if (ITEMFP = 1) then
        BEGIN
        FORMAPAGO1 = FORMAP;
        MONTOPAGO1 = MONTOP;
        END
    if (ITEMFP = 2) then
        BEGIN
        FORMAPAGO2 = FORMAP;
        MONTOPAGO2 = MONTOP;
        END
    if (ITEMFP = 3) then
        BEGIN
        FORMAPAGO3 = FORMAP;
        MONTOPAGO3 = MONTOP;
        END
    ITEMFP = ITEMFP + 1;
    END
EXECUTE PROCEDURE lee_configuracion ('FACTURACION','DOCUMENTOS','ORDENAR ITEMS POR CODIGO DE ARTICULO') returning_values (:ORDENCOD);
EXECUTE PROCEDURE lee_configuracion ('FACTURACION','POS', 'IMPRIMIR DEVOLUCIONES DE ARTICULOS NEGATIVOS') returning_values (:imprdev);
totcajas = 0;
totbase = 0;
if (ORDENCOD = 'SI') then
    BEGIN
    FOR SELECT FADE_ITEM, D.ARTI_COD, FADE_CODBAR, SUBSTR(FADE_DESC,1,60), ARTI_DESCORTA, FADE_CANT, FADE_UNIDAD, FADE_FACTOR, BODE_COD, FADE_LOTE, LIPR_COD, FADE_PRUNIT, FADE_DTOPORC, FADE_DTOMONTO, FADE_IVAPORC, FADE_IVAMONTO, FADE_CONSUMO, FADE_TOTAL, FADE_REFERENCIA,
        GRUP_COD, SUBG_COD, MARC_COD, ARTI_PESO, ARTI_ANCHO, ARTI_ALTO, ARTI_LARGO, TAIV_COD, FADE_DEVUELTO, FADE_OBS, FADE_DTO1, FADE_DTO2, FADE_DTO3, FADE_DTOM1, FADE_DTOM2, FADE_DTOM3, FADE_CAJAS, FADE_BASE, FADE_PORCBASE
        FROM FACTURAS_DETALLE D, ARTICULO A
        WHERE D.ARTI_COD = A.ARTI_COD AND D.FACT_ID = :ID
        ORDER BY D.ARTI_COD
        INTO :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :DESCORTA, :CANT, :UNIDAD, :FACTOR, :BODITEM, :LOTE, :LISTAPR, :PRUNIT, :DTOITPORC, :DTOITMONTO, :IVAPORC, :IVAITMONTO, :CONSUMO, :TOTAL, :refitem,
        :GRUPO, :SUBGRUPO, :MARCA, :PESO, :ANCHO, :ALTO, :LARGO, :TARIFA, :devuelto, :obsitem, :dtoit1, :dtoit2, :dtoit3, :dtoitm1, :dtoitm2, :dtoitm3, :cajas, :base, :porcbase
        DO
          BEGIN
          if (ARTICULO = CODBAR) then
            SELECT FIRST 1 COBA_COD FROM barras_articulo WHERE ARTI_COD = :articulo INTO :CODBAR;
          if (IMPRDEV <> 'SI') then
            BEGIN
            if ((CANT >= 0) AND (DEVUELTO = 0)) then
                IMPR = 'S';
            ELSE
                IMPR = 'N'; /* ES DEVOLUCION */
            END
          ELSE
            IMPR = 'S';
          if (IMPR = 'S') then
            BEGIN
            prneto = PRUNIT - DTOITMONTO - dtoitm1 - dtoitm2 - dtoitm3;
            if (IMPTOS = 'S') then
                if (cant <> 0) then
                    prnetosiniva = PRUNIT - DTOITMONTO - ((IVAITMONTO+CONSUMO) / CANT) - dtoitm1 - dtoitm2 - dtoitm3;
                else
                    prnetosiniva = PRUNIT - DTOITMONTO - dtoitm1 - dtoitm2 - dtoitm3;
            ELSE
                prnetosiniva = PRUNIT - DTOITMONTO - dtoit1m - dtoit2m - dtoit3m;
            if (ICOINC = 'SI') then
                SUBTOTIT = TOTAL - IVAITMONTO;
            else
                SUBTOTIT = TOTAL - IVAITMONTO - CONSUMO;
            TOTCONSUMO = TOTCONSUMO + CONSUMO;
            TOTBASE = TOTBASE + BASE;
            SELECT LOTE_VENCE FROM LOTES WHERE LOTE_NRO = :lote AND ARTI_COD = :ARTICULO AND BODE_COD = :boditem INTO :vlote;
            if ((REFITEM <> '.t') or (REFITEM IS NULL)) then
                BEGIN
                /* NO SUME LOS ENSAMBLES */
                if (IVAPORC = 0) then
                    SUMAEX = SUMAEX + TOTAL;
                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;
                END
            if (ANCHO IS NULL) then
                ANCHO = 0;
            if (ALTO IS NULL) then
                ALTO = 0;
            if (LARGO IS NULL) then
                LARGO = 0;
            if (PESO IS NULL) then
                PESO = 0;
            PESO = (PESO / 1000) * CANT * FACTOR;
            totcajas = totcajas + cajas;
            if (substr(ARTICULO,1,2) = '.t') then
                BEGIN
                REFITEM = '';
                TOTAL = 0;
                SUBTOTIT = 0;
                END
            SELECT STAND_COD FROM STANDS WHERE ARTI_COD = :ARTICULO AND STAND_BODEGA = :boditem INTO :stand;
            factcant = NULL;
            SELECT FIRST 1 UNAR_FACCAN FROM unidad_articulo WHERE ARTI_COD = :articulo INTO :factcant;
            if (factcant IS NULL) then
                BEGIN
                ALTERNATIVAS = 0;
                PRINCIPALES = (CANT * FACTOR);
                END
            ELSE
                BEGIN
                ALTERNATIVAS = FLOOR(CANT * factor / factcant);
                PRINCIPALES = (CANT * FACTOR) - (alternativas * factcant);
                END
            SUSPEND;
            END
          END
    END
ELSE
    BEGIN
    FOR SELECT FADE_ITEM, D.ARTI_COD, FADE_CODBAR, SUBSTR(FADE_DESC,1,60), ARTI_DESCORTA, FADE_CANT, FADE_UNIDAD, FADE_FACTOR, BODE_COD, FADE_LOTE, LIPR_COD, FADE_PRUNIT, FADE_DTOPORC, FADE_DTOMONTO, FADE_IVAPORC, FADE_IVAMONTO, FADE_CONSUMO, FADE_TOTAL, FADE_REFERENCIA,
        GRUP_COD, SUBG_COD, MARC_COD, ARTI_PESO, ARTI_ANCHO, ARTI_ALTO, ARTI_LARGO, TAIV_COD, FADE_DEVUELTO, FADE_OBS, FADE_DTO1, FADE_DTO2, FADE_DTO3, FADE_DTOM1, FADE_DTOM2, FADE_DTOM3, FADE_CAJAS, FADE_BASE, FADE_PORCBASE
        FROM FACTURAS_DETALLE D, ARTICULO A
        WHERE D.ARTI_COD = A.ARTI_COD AND D.FACT_ID = :ID
        ORDER BY FADE_ITEM
        INTO :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :DESCORTA, :CANT, :UNIDAD, :FACTOR, :BODITEM, :LOTE, :LISTAPR, :PRUNIT, :DTOITPORC, :DTOITMONTO, :IVAPORC, :IVAITMONTO, :CONSUMO, :TOTAL, :refitem,
        :GRUPO, :SUBGRUPO, :MARCA, :PESO, :ANCHO, :ALTO, :LARGO, :TARIFA, :devuelto, :obsitem, :dtoit1, :dtoit2, :dtoit3, :dtoitm1, :dtoitm2, :dtoitm3, :cajas, :base, :porcbase
        DO
          BEGIN
          if (IMPRDEV <> 'SI') then
            BEGIN
            if ((CANT >= 0) AND (DEVUELTO = 0)) then
                IMPR = 'S';
            ELSE
                IMPR = 'N'; /* ES DEVOLUCION */
            END
          ELSE
            IMPR = 'S';
          if (IMPR = 'S') then
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :GRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :MARCA INTO NOMMARCA;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :SUBGRUPO AND GRUP_COD = :GRUPO INTO :NOMSUBG;
            prneto = PRUNIT - DTOITMONTO - dtoitm1 - dtoitm2 - dtoitm3;
            if (IMPTOS = 'S') then
                if (cant <> 0) then
                    prnetosiniva = PRUNIT - DTOITMONTO - ((IVAITMONTO+CONSUMO) / CANT) - dtoit1m - dtoit2m - dtoit3m;
                else
                    prnetosiniva = PRUNIT - DTOITMONTO - dtoitm1 - dtoitm2 - dtoitm3;
            ELSE
                prnetosiniva = PRUNIT - DTOITMONTO - dtoitm1 - dtoitm2 - dtoitm3;
            if (ICOINC = 'SI') then
                SUBTOTIT = TOTAL - IVAITMONTO;
            else
                SUBTOTIT = TOTAL - IVAITMONTO - CONSUMO;
            TOTCONSUMO = TOTCONSUMO + CONSUMO;
            TOTBASE = TOTBASE + BASE;
            SELECT LOTE_VENCE FROM LOTES WHERE LOTE_NRO = :lote AND ARTI_COD = :ARTICULO AND BODE_COD = :boditem INTO :vlote;
            if ((REFITEM <> '.t') or (REFITEM IS NULL)) then
                BEGIN
                /* NO SUME LOS ENSAMBLES */
                if (IVAPORC = 0) then
                    SUMAEX = SUMAEX + TOTAL;
                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;
                END
            if (ANCHO IS NULL) then
                ANCHO = 0;
            if (ALTO IS NULL) then
                ALTO = 0;
            if (LARGO IS NULL) then
                LARGO = 0;
            if (PESO IS NULL) then
                PESO = 0;
            PESO = (PESO / 1000)* CANT * FACTOR;
            totcajas = totcajas + cajas;
            if (substr(ARTICULO,1,2) = '.t') then
                BEGIN
                REFITEM = '';
                TOTAL = 0;
                SUBTOTIT = 0;
                END
            SELECT STAND_COD FROM STANDS WHERE ARTI_COD = :ARTICULO AND STAND_BODEGA = :boditem INTO :stand;
            factcant = NULL;
            SELECT FIRST 1 UNAR_FACCAN FROM unidad_articulo WHERE ARTI_COD = :articulo INTO :factcant;
            if (factcant IS NULL) then
                BEGIN
                ALTERNATIVAS = 0;
                PRINCIPALES = (CANT * FACTOR);
                END
            ELSE
                BEGIN
                ALTERNATIVAS = FLOOR(CANT * factor / factcant);
                PRINCIPALES = (CANT * FACTOR) - (alternativas * factcant);
                END
            SUSPEND;
            END
          END
    END
END

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE IMPR_REDENCION(
    ID INTEGER)
RETURNS (
    NUMERO VARCHAR(6),
    FECHA DATE,
    NIT VARCHAR(20),
    NOMCLIENTE VARCHAR(60),
    DIR VARCHAR(60),
    TEL VARCHAR(60),
    PREMIO VARCHAR(15),
    NOMPREMIO VARCHAR(60),
    PUNTOS INTEGER,
    PUNTOSACUM INTEGER,
    PUNTOSVENC INTEGER,
    FECPTOS DATE)
AS
declare variable puntosaux INTEGER;
begin
SELECT PTRE_NUMERO, PTRE_FECHA, PTRE_NIT, TERC_NOM, TERC_DIR, TERC_TEL, R.PTPR_COD, PTPR_NOMBRE, PTRE_PUNTOS
    FROM PUNTOS_REDENCION R, puntos_premios P, TERCEROS T
    WHERE R.ptre_nit = T.terc_nit AND R.ptpr_cod = P.ptpr_cod AND R.ptre_id = :ID
    INTO :NUMERO, :FECHA, :NIT, :NOMCLIENTE, :DIR, :TEL, :PREMIO, :NOMPREMIO, :PUNTOS;
EXECUTE PROCEDURE consulta_puntos_cliente (0, :nit, :fecha) returning_values (:puntosaux, :puntosacum, :puntosvenc, :fecptos);
suspend;
end

^

SET TERM ; ^


/* 20090807 */
/* FILTRAR CAJA POR USUARIO */

ALTER TABLE USUARIO
ADD CAJA_ID T_ID;


/* 20090810 */
/* DESCUENTE EL GMF SI LA CUENTA LO TIENE HABILITADO */

SET TERM ^ ;

CREATE OR ALTER procedure CONTABIL_CONSIGNATAR (
    IDDOC integer,
    IDINTER integer)
returns (
    ERROR integer,
    VER char(1),
    IDC integer)
AS
declare variable PREF VARCHAR(4);
declare variable NUM VARCHAR(6);
declare variable NUMERO VARCHAR(10);
declare variable FECAUX DATE;
declare variable FECHA CHAR(8);
declare variable CONC CHAR(120);
declare variable VRDTO NUMERIC(18, 2);
declare variable VRRTFTE NUMERIC(18, 2);
declare variable VRRTIVA NUMERIC(18, 2);
declare variable VRRTICA NUMERIC(18, 2);
declare variable VRTOTAL NUMERIC(18, 2);
declare variable TIPOCOMP VARCHAR(3);
declare variable PREFCONT VARCHAR(4);
declare variable BASE CHAR(1);
declare variable PORC NUMERIC(8,2);
declare variable CTABASE VARCHAR(20);
declare variable CAJA CHAR(1);
declare variable CTACAJA VARCHAR(20);
declare variable RTFTE CHAR(1);
declare variable CTARTFTE VARCHAR(20);
declare variable RTIVA CHAR(1);
declare variable CTARTIVA VARCHAR(20);
declare variable RTICA CHAR(1);
declare variable CTARTICA VARCHAR(20);
declare variable DTO CHAR(1);
declare variable CTADTO VARCHAR(20);
declare variable CTAGMF VARCHAR(20);
declare variable GMFPOR NUMERIC(9,2);
declare variable VRGMF NUMERIC(18,2);
declare variable EXISTE CHAR(1);
declare variable CUENTA VARCHAR(20);
declare variable MONTO NUMERIC(18,2);
declare variable TIPOCUEN CHAR(1);
declare variable NIT VARCHAR(20);
declare variable PROY VARCHAR(4);
declare variable CENTRO VARCHAR(4);
declare variable DEBITO NUMERIC(18,2);
declare variable CREDITO NUMERIC(18,2);
declare variable NROI INTEGER;
declare variable SUMA NUMERIC(18,2);
declare variable CTADIC VARCHAR(20);
declare variable BASEADIC VARCHAR(20);
declare variable PORCADIC NUMERIC(5,2);
declare variable VALORADIC NUMERIC(18,2);
declare variable DBADIC CHAR(1);
declare variable CHEQUE CHAR(1);
declare variable IDCAJA INTEGER;
declare variable IDBANCO INTEGER;
declare variable ANULADO CHAR(1);
declare variable VRBASE NUMERIC(18,2);
BEGIN
/* BUSQUE LA INTERFACE */
EXISTE = 'N';
SELECT 'S', TICO_COD, PRCO_PRE, INCJ_BASE, INCJ_DTOPP, INCJ_RTFTE, INCJ_RTIVA, INCJ_RTICA, INCJ_CAJA, INCJ_CTABASE, INCJ_CTADTO, INCJ_CTARTFTE, INCJ_CTARTIVA, INCJ_CTARTICA, INCJ_CTACAJA, INCJ_CONFIRMAR
    FROM INTERFAZ_CAJA
    WHERE INCJ_ID = :IDINTER
    INTO :EXISTE, :TIPOCOMP, :PREFCONT, :BASE, :DTO, :RTFTE, :RTIVA, :RTICA, :CAJA, :CTABASE, :CTADTO, :CTARTFTE, :CTARTIVA, :CTARTICA, :CTACAJA, :VER;
if (EXISTE = 'S') then
    BEGIN
    DELETE FROM contabilizacion WHERE CNTB_TIPOREF = 64 AND CNTB_IDREF = :IDDOC;

    /* TRAIGA EL ENCABEZADO DE LA CONSIGNACION */
    SELECT PREF_PRE, COTJ_NUMERO, COTJ_FECHA, COTJ_CONCEPTO, COTJ_MONTO, COTJ_COMISION, COTJ_RTFTE, COTJ_RTIVA, COTJ_RTICA, COTJ_CHEQUE, CAJA_ID, CUBA_COD, COTJ_ANULADO
        FROM consigna_tarjetas
        WHERE COTJ_ID = :IDDOC
        INTO :PREF, :NUM, :FECAUX, :CONC, :VRTOTAL, :VRDTO, :VRRTFTE, :VRRTIVA, :VRRTICA, :CHEQUE, :IDCAJA, :IDBANCO, :ANULADO;
    if (ANULADO = 'N') then
        BEGIN
        /* EL NIT ES EL DEL BANCO */
        SELECT B.banc_nit FROM bancos B, CUENTAS_BANCO C WHERE C.banc_cod = B.banc_cod AND C.cuba_cod = :idbanco INTO :nit;

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

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

        NROI = 0;
        SUMA = 0;
        ERROR = 0;
        VRBASE = VRTOTAL;
        VRTOTAL = VRTOTAL + vrdto + vrrtfte + vrrtica + vrrtiva;
        IF ((CAJA = 'K') or (CAJA = 'F') ) THEN
            BEGIN
            if (VRTOTAL <> 0) then
                BEGIN
                IF ((CAJA = 'F')) THEN
                    BEGIN
                    /* TRAIGA LA CUENTA DE LA CAJA O EL BANCO A ABONAR */
                    if (CHEQUE = 'S') then
                        SELECT CUBA_CTACONTA FROM CUENTAS_BANCO WHERE CUBA_COD = :IDBANCO INTO CTACAJA;
                    ELSE
                        SELECT CAJA_CUENTA FROM CAJAS WHERE CAJA_ID = :IDCAJA INTO CTACAJA;
                    END
                
                CUENTA = NULL;
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :CTACAJA INTO :CUENTA, :TIPOCUEN;
                if (CUENTA IS NULL) then
                    begin
                    EXECUTE PROCEDURE ERROR (64, :IDDOC, :CTABASE, 2);
                    CUENTA = CTABASE;
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (64, :IDDOC, :CUENTA, 3);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (64, :IDDOC, :CUENTA, 4);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRTOTAL, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA + VRTOTAL;
                    if (VRDTO <> 0) then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRDTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NROI = NROI + 1;
                        SUMA = SUMA - VRDTO;
                        END
                    if (vrrtfte <> 0) then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :vrrtfte, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NROI = NROI + 1;
                        SUMA = SUMA - vrrtfte;
                        END
                    if (vrrtiva <> 0) then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :vrrtiva, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NROI = NROI + 1;
                        SUMA = SUMA - vrrtiva;
                        END
                    if (vrrtica <> 0) then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :vrrtica, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NROI = NROI + 1;
                        SUMA = SUMA - vrrtica;
                        END
                    END
                END /* VRTOTAL <> 0 */
            END /* CAJA CONSTANTE */
        
        if (DTO = 'K') then /* COMISION */
            BEGIN
            if (VRDTO <> 0) then
                BEGIN
                CUENTA = NULL;
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :CTADTO INTO :CUENTA, :TIPOCUEN;
                if (CUENTA IS NULL) then
                    begin
                    EXECUTE PROCEDURE ERROR (64, :IDDOC, :CTABASE, 2);
                    CUENTA = CTABASE;
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (64, :IDDOC, :CUENTA, 3);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (64, :IDDOC, :CUENTA, 4);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRDTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA + VRDTO;
                    END
                END /* VRDTO <> 0 */
            END /* DTO EN CTA CONSTANTE */
        
        /* RETENCION FUENTE */
        if (RTFTE = 'K') then
          if (VRRTFTE <> 0) then
            BEGIN
            PORC = vrrtfte * 100 / vrbase;
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTARTFTE INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERROR (64, :IDDOC, :ctartfte, 2);
                CUENTA = CTABASE;
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERROR (64, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                EXECUTE PROCEDURE ERROR (64, :IDDOC, :CUENTA, 4);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :vrbase, :PORC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA + VRRTFTE;
                END
            END /* RTFTE */
        
        /* RETENCION IVA */
        if (RTIVA = 'K') then
          if (VRRTIVA <> 0) then
            BEGIN
            PORC = VRRTIVA / VRBASE;
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO
                FROM CUENTAS
                WHERE CUEN_COD = :CTARTIVA
                INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERROR (64, :IDDOC, :ctartiva, 2);
                CUENTA = CTABASE;
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERROR (64, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                EXECUTE PROCEDURE ERROR (64, :IDDOC, :CUENTA, 4);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTIVA, 0, :VRBASE, :PORC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA + VRRTIVA;
                END
            END /* RTIVA */
        
        /* RETENCION ICA */
        if (rtica = 'K') then
          if (vrrtica <> 0) then
            BEGIN
            PORC = vrrtica / VRBASE;
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO
                FROM CUENTAS
                WHERE CUEN_COD = :ctartica
                INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERROR (64, :IDDOC, :ctartica, 2);
                CUENTA = ctartica;
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERROR (64, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                EXECUTE PROCEDURE ERROR (64, :IDDOC, :CUENTA, 4);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :vrrtica, 0, :VRBASE, :PORC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA + vrrtica;
                END
            END /* RTIVA */
        
        /* CUENTA GMF */
        SELECT CUBA_CTAGMF, CUBA_GMFPOR FROM CUENTAS_BANCO WHERE CUBA_COD = :IDBANCO INTO ctagmf, :gmfpor;
        if ((CTAGMF <> '') AND (GMFPOR <> 0))then
            BEGIN
            VRGMF = (vrdto + vrrtfte + vrrtiva + vrrtica) * GMFPOR / 100;
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTAGMF INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERROR (64, :IDDOC, :CTAGMF, 2);
                CUENTA = CTAGMF;
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERROR (64, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                EXECUTE PROCEDURE ERROR (64, :IDDOC, :CUENTA, 4);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
              if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRGMF, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA + VRGMF;
                END
            END /* GMF */

        /* CIERRE EL COMPROBANTE CONTRA LA CUENTA DE LA CAJA */
        if ((SUMA <> 0) and ((BASE = 'F') or (BASE = 'K'))) then
            BEGIN
            if (SUMA < 0) then
                BEGIN
                DEBITO = SUMA * -1;
                CREDITO = 0;
                END
            ELSE    
                BEGIN
                DEBITO = 0;
                CREDITO = SUMA;
                END
            if (BASE = 'F') then
                SELECT CAJA_CUENTA FROM CAJAS WHERE CAJA_ID = :IDCAJA INTO CTABASE;

            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTABASE INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERROR (64, :IDDOC, :CTABASE, 2);
                CUENTA = CTABASE;
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERROR (64, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                EXECUTE PROCEDURE ERROR (64, :IDDOC, :CUENTA, 4);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'N') then
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :DEBITO, :CREDITO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            END /* SUMA EN CARTERA */

        /* recorra las cuentas adicionales */
        FOR SELECT INJC_CUENTA, INJC_BASE, INJC_PORC, INJC_VALOR, INJC_DB
            FROM INTERFAZ_CAJA_CTAS
            WHERE INCJ_ID = :IDINTER
            INTO :CTADIC, :BASEADIC, :PORCADIC, :VALORADIC, :DBADIC
            DO
            BEGIN
            if (:BASEADIC = 'TOTAL') then
                VALORADIC = VRTOTAL;
            if (:BASEADIC = 'DESCUENTO') then
                VALORADIC = VRDTO;
            if (:BASEADIC = 'RTFTE') then
                VALORADIC = VRRTFTE;
            if (:BASEADIC = 'RTIVA') then
                VALORADIC = VRRTIVA;
            MONTO = VALORADIC * PORCADIC;
        
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTADIC INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERROR (66, :IDDOC, :CTABASE, 2);
                CUENTA = CTABASE;
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERROR (66, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                EXECUTE PROCEDURE ERROR (66, :IDDOC, :CUENTA, 4);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                if (DBADIC = 'S') then
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                ELSE
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                END
            NROI = NROI + 1;
            END     
        
        if (ERROR > 0) then
            VER = 'S';
        SUSPEND;
        END
    END /* EXISTE LA INTERFAZ */
ELSE
    BEGIN
    EXECUTE PROCEDURE ERROR (64, :IDDOC, :PREF, 1);
    ERROR = ERROR + 1;
    VER = 'S';
    SUSPEND;
    END
END
^

SET TERM ; ^


SET TERM ^ ;

CREATE OR ALTER TRIGGER CONSIGNA_TARJETAS_AI FOR CONSIGNA_TARJETAS
ACTIVE AFTER INSERT POSITION 0
as
declare variable CONC VARCHAR(60);
declare variable GMFPOR NUMERIC(9,2);
begin
if ((new.cotj_id <> 0) AND (NEW.COTJ_ANULADO = 'N')) then
    BEGIN
    INSERT INTO MOVIMIENTO_BANCO
        (MOBA_ID, CUBA_COD, MOBA_TIPODOC, MOBA_PREF, MOBA_NUMERO, MOBA_FECHA, MOBA_CONCEPTO, MOBA_TOTAL, MOBA_DB, MOBA_IDREF, MOBA_TIPOREF)
        VALUES(GEN_ID(ID_MOVBANCO,1), NEW.cuba_cod, 64, NEW.PREF_PRE, NEW.cotj_numero, NEW.cotj_fecha, NEW.cotj_concepto, (NEW.cotj_monto+new.cotj_rtfte+new.cotj_comision+new.cotj_rtiva+NEW.cotj_rtica), 'S', new.cotj_id, 64);
    if (NEW.cotj_rtfte <> 0) then
        BEGIN
        CONC = 'RETEFTE TARJETAS ' || SUBSTRING(NEW.COTJ_CONCEPTO FROM 1 FOR 42);
        INSERT INTO MOVIMIENTO_BANCO
            (MOBA_ID, CUBA_COD, MOBA_TIPODOC, MOBA_PREF, MOBA_NUMERO, MOBA_FECHA, MOBA_CONCEPTO, MOBA_TOTAL, MOBA_DB, MOBA_IDREF, MOBA_TIPOREF)
            VALUES(GEN_ID(ID_MOVBANCO,1), NEW.cuba_cod, 64, NEW.PREF_PRE, NEW.cotj_numero, NEW.cotj_fecha, :CONC, new.cotj_rtfte, 'N', new.cotj_id, 64);
        END
    if (NEW.cotj_rtiva <> 0) then
        BEGIN
        CONC = 'RETEIVA TARJETAS ' || SUBSTRING(NEW.COTJ_CONCEPTO FROM 1 FOR 42);
        INSERT INTO MOVIMIENTO_BANCO
            (MOBA_ID, CUBA_COD, MOBA_TIPODOC, MOBA_PREF, MOBA_NUMERO, MOBA_FECHA, MOBA_CONCEPTO, MOBA_TOTAL, MOBA_DB, MOBA_IDREF, MOBA_TIPOREF)
            VALUES(GEN_ID(ID_MOVBANCO,1), NEW.cuba_cod, 64, NEW.PREF_PRE, NEW.cotj_numero, NEW.cotj_fecha, :CONC, new.cotj_rtiva, 'N', new.cotj_id, 64);
        END
    if (NEW.cotj_rtica <> 0) then
        BEGIN
        CONC = 'RETEICA TARJETAS ' || SUBSTRING(NEW.COTJ_CONCEPTO FROM 1 FOR 42);
        INSERT INTO MOVIMIENTO_BANCO
            (MOBA_ID, CUBA_COD, MOBA_TIPODOC, MOBA_PREF, MOBA_NUMERO, MOBA_FECHA, MOBA_CONCEPTO, MOBA_TOTAL, MOBA_DB, MOBA_IDREF, MOBA_TIPOREF)
            VALUES(GEN_ID(ID_MOVBANCO,1), NEW.cuba_cod, 64, NEW.PREF_PRE, NEW.cotj_numero, NEW.cotj_fecha, :CONC, NEW.cotj_rtica, 'N', new.cotj_id, 64);
        END
    if (NEW.cotj_comision <> 0) then
        BEGIN
        CONC = 'COMISION TARJETAS ' || SUBSTRING(NEW.COTJ_CONCEPTO FROM 1 FOR 42);
        INSERT INTO MOVIMIENTO_BANCO
            (MOBA_ID, CUBA_COD, MOBA_TIPODOC, MOBA_PREF, MOBA_NUMERO, MOBA_FECHA, MOBA_CONCEPTO, MOBA_TOTAL, MOBA_DB, MOBA_IDREF, MOBA_TIPOREF)
            VALUES(GEN_ID(ID_MOVBANCO,1), NEW.cuba_cod, 64, NEW.PREF_PRE, NEW.cotj_numero, NEW.cotj_fecha, :CONC, new.cotj_comision, 'N', new.cotj_id, 64);
        END
    SELECT CUBA_GMFPOR FROM cuentas_banco WHERE CUBA_COD = NEW.cuba_cod INTO :GMFPOR;
    if (GMFPOR <> 0) then
      begin
      conc = 'GMF EN CONSIGNACION TARJETA No. ' || NEW.pref_pre || NEW.cotj_numero;
      INSERT INTO MOVIMIENTO_BANCO
        (MOBA_ID, CUBA_COD, MOBA_TIPODOC, MOBA_PREF, MOBA_NUMERO, MOBA_FECHA, MOBA_CONCEPTO, MOBA_TOTAL, MOBA_DB, MOBA_IDREF, MOBA_TIPOREF)
        VALUES(GEN_ID(ID_MOVBANCO,1), NEW.cuba_cod, 64, NEW.pref_pre, NEW.cotj_numero, NEW.cotj_fecha, :conc, (NEW.cotj_comision+NEW.cotj_rtfte+NEW.cotj_rtiva+NEW.cotj_rtica)*:GMFPOR/100, 'N', new.cotj_id, 64);
      end
    INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
        VALUES (USER, 64, NEW.cotj_id, 'I', NEW.pref_pre || NEW.cotj_numero);
    end
end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER CONSIGNA_TARJETAS_AU FOR CONSIGNA_TARJETAS
ACTIVE AFTER UPDATE POSITION 0
as
declare variable consec INTEGER;
declare variable CONC VARCHAR(60);
declare variable GMFPOR NUMERIC(9,2);
begin
if (NEW.cotj_anulado = 'S') then
    BEGIN
    select enco_consec from comprobante_encabezado where enco_tiporef = 64 and enco_idref = old.cotj_id into :consec;
    if (NOT consec is null) then
      delete from comprobante_detalle where enco_consec = :consec;
    delete from comprobante_encabezado where enco_tiporef = 64 and enco_idref = old.cotj_id;
    INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
        VALUES (USER, 64, NEW.cotj_id, 'A', NEW.pref_pre || NEW.cotj_numero);
    END
if ((old.cotj_anulado = 'N') and (old.cotj_id <> 0)) then
    DELETE FROM MOVIMIENTO_BANCO
        WHERE MOBA_TIPODOC = 64 AND MOBA_IDREF = OLD.cotj_id;
if ((new.cotj_id <> 0) AND (NEW.COTJ_ANULADO = 'N')) then
    BEGIN
    INSERT INTO MOVIMIENTO_BANCO
        (MOBA_ID, CUBA_COD, MOBA_TIPODOC, MOBA_PREF, MOBA_NUMERO, MOBA_FECHA, MOBA_CONCEPTO, MOBA_TOTAL, MOBA_DB, MOBA_IDREF, MOBA_TIPOREF)
        VALUES(GEN_ID(ID_MOVBANCO,1), NEW.cuba_cod, 64, NEW.PREF_PRE, NEW.cotj_numero, NEW.cotj_fecha, NEW.cotj_concepto, (NEW.cotj_monto+new.cotj_rtfte+new.cotj_comision+new.cotj_rtiva+NEW.cotj_rtica), 'S', new.cotj_id, 64);
    if (NEW.cotj_rtfte <> 0) then
        BEGIN
        CONC = 'RETEFTE TARJETAS ' || SUBSTRING(NEW.COTJ_CONCEPTO FROM 1 FOR 42);
        INSERT INTO MOVIMIENTO_BANCO
            (MOBA_ID, CUBA_COD, MOBA_TIPODOC, MOBA_PREF, MOBA_NUMERO, MOBA_FECHA, MOBA_CONCEPTO, MOBA_TOTAL, MOBA_DB, MOBA_IDREF, MOBA_TIPOREF)
            VALUES(GEN_ID(ID_MOVBANCO,1), NEW.cuba_cod, 64, NEW.PREF_PRE, NEW.cotj_numero, NEW.cotj_fecha, :CONC, new.cotj_rtfte, 'N', new.cotj_id, 64);
        END
    if (NEW.cotj_rtiva <> 0) then
        BEGIN
        CONC = 'RETEIVA TARJETAS ' || SUBSTRING(NEW.COTJ_CONCEPTO FROM 1 FOR 42);
        INSERT INTO MOVIMIENTO_BANCO
            (MOBA_ID, CUBA_COD, MOBA_TIPODOC, MOBA_PREF, MOBA_NUMERO, MOBA_FECHA, MOBA_CONCEPTO, MOBA_TOTAL, MOBA_DB, MOBA_IDREF, MOBA_TIPOREF)
            VALUES(GEN_ID(ID_MOVBANCO,1), NEW.cuba_cod, 64, NEW.PREF_PRE, NEW.cotj_numero, NEW.cotj_fecha, :CONC, new.cotj_rtiva, 'N', new.cotj_id, 64);
        END
    if (NEW.cotj_rtica <> 0) then
        BEGIN
        CONC = 'RETEICA TARJETAS ' || SUBSTRING(NEW.COTJ_CONCEPTO FROM 1 FOR 42);
        INSERT INTO MOVIMIENTO_BANCO
            (MOBA_ID, CUBA_COD, MOBA_TIPODOC, MOBA_PREF, MOBA_NUMERO, MOBA_FECHA, MOBA_CONCEPTO, MOBA_TOTAL, MOBA_DB, MOBA_IDREF, MOBA_TIPOREF)
            VALUES(GEN_ID(ID_MOVBANCO,1), NEW.cuba_cod, 64, NEW.PREF_PRE, NEW.cotj_numero, NEW.cotj_fecha, :CONC, NEW.cotj_rtica, 'N', new.cotj_id, 64);
        END
    if (NEW.cotj_comision <> 0) then
        BEGIN
        CONC = 'COMISION TARJETAS ' || SUBSTRING(NEW.COTJ_CONCEPTO FROM 1 FOR 42);
        INSERT INTO MOVIMIENTO_BANCO
            (MOBA_ID, CUBA_COD, MOBA_TIPODOC, MOBA_PREF, MOBA_NUMERO, MOBA_FECHA, MOBA_CONCEPTO, MOBA_TOTAL, MOBA_DB, MOBA_IDREF, MOBA_TIPOREF)
            VALUES(GEN_ID(ID_MOVBANCO,1), NEW.cuba_cod, 64, NEW.PREF_PRE, NEW.cotj_numero, NEW.cotj_fecha, :CONC, new.cotj_comision, 'N', new.cotj_id, 64);
        END
    SELECT CUBA_GMFPOR FROM cuentas_banco WHERE CUBA_COD = NEW.cuba_cod INTO :GMFPOR;
    if (GMFPOR <> 0) then
      begin
      conc = 'GMF EN CONSIGNACION TARJETA No. ' || NEW.pref_pre || NEW.cotj_numero;
      INSERT INTO MOVIMIENTO_BANCO
        (MOBA_ID, CUBA_COD, MOBA_TIPODOC, MOBA_PREF, MOBA_NUMERO, MOBA_FECHA, MOBA_CONCEPTO, MOBA_TOTAL, MOBA_DB, MOBA_IDREF, MOBA_TIPOREF)
        VALUES(GEN_ID(ID_MOVBANCO,1), NEW.cuba_cod, 64, NEW.pref_pre, NEW.cotj_numero, NEW.cotj_fecha, :conc, (NEW.cotj_comision+NEW.cotj_rtfte+NEW.cotj_rtiva+NEW.cotj_rtica)*:GMFPOR/100, 'N', new.cotj_id, 64);
      end
    INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
        VALUES (USER, 64, NEW.cotj_id, 'U', NEW.pref_pre || NEW.cotj_numero);
    END
/* SI EL CAMPO QUE CAMBIA ES CRITICO ACTUALICE EL DETALLE */
if ((OLD.cotj_fecha <> NEW.cotj_fecha) OR
    (OLD.pref_pre <> NEW.pref_pre) OR
    (OLD.cotj_numero <> NEW.cotj_numero)) then
    UPDATE consigna_tarjetas_det SET CTJD_TRANSMIT = 'N'
        WHERE COTJ_ID = NEW.cotj_id;
/* ACTUALICE EL ANULADO EN LOS DETALLES */
if (OLD.cotj_anulado <> NEW.cotj_anulado) then
    UPDATE consigna_tarjetas_det SET CTJD_ANULADO = NEW.cotj_anulado
        WHERE COTJ_ID = NEW.cotj_id;
if (OLD.cotj_transmit <> NEW.cotj_transmit) then
    UPDATE consigna_tarjetas_det SET CTJD_TRANSMIT = NEW.cotj_transmit
        WHERE COTJ_ID = NEW.cotj_id;
end
^

SET TERM ; ^


/* 20090811 */
/* se perdian los decimales del porcentaje de comision al dividr entre 100, se cambio el orden de la operación */
SET TERM ^ ;

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

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

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

SET TERM ; ^


/* 20090811b */
/* al cambiar el confirmado no se disparaba el trigger del detalle */
SET TERM ^ ;

CREATE OR ALTER TRIGGER REVISION_PRECIOS_AU FOR REVISION_PRECIOS
ACTIVE AFTER UPDATE POSITION 0
as
begin
if (OLD.rvpr_anulado <> NEW.rvpr_anulado) then
    UPDATE revprecios_detalle SET RVPR_ANULADO = NEW.rvpr_anulado
        WHERE RVPR_ID = NEW.rvpr_id;

if (OLD.rvpr_confirma <> NEW.rvpr_confirma) then
    UPDATE revprecios_detalle SET RVPR_ANULADO = NEW.rvpr_anulado
        WHERE RVPR_ID = NEW.rvpr_id;

if (NEW.rvpr_anulado = 'S') then
  INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
    VALUES (USER, 39, NEW.rvpr_id, 'A', NEW.rvpr_pref || NEW.rvpr_numero);
ELSE
  INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
    VALUES (USER, 39, NEW.rvpr_id, 'U', NEW.rvpr_pref || NEW.rvpr_numero);
end
^

SET TERM ; ^



/* 20090811c */
/* peso total en doc. de ventas */

SET TERM ^ ;

CREATE OR ALTER procedure IMPR_COTIZACION (
    ID integer)
returns (
    PREF varchar(4),
    NUMERO varchar(6),
    FECHA date,
    VALIDEZ integer,
    NIT varchar(20),
    NOMTERCERO varchar(60),
    VENDEDOR integer,
    NOMVENDEDOR varchar(60),
    PUNTOVTA integer,
    NOMPUNTOVTA varchar(60),
    SUBTOTAL numeric(18,2),
    DTOPORC numeric(9,2),
    DTOMONTO numeric(18,2),
    ADICIONAL numeric(18,2),
    IVAMONTO numeric(18,2),
    EXTRA numeric(18,2),
    TOTALFAC numeric(18,2),
    PESOTOT numeric(18,2),
    OBS blob sub_type 1 segment size 80,
    ITEM integer,
    ARTICULO varchar(15),
    CODBAR varchar(15),
    ARTIDES varchar(60),
    CANT numeric(18,4),
    UNIDAD varchar(8),
    FACTOR numeric(18,4),
    LISTAPR integer,
    REFITEM varchar(60),
    PRUNIT numeric(18,2),
    DTOITPORC numeric(9,2),
    DTOITMONTO numeric(18,2),
    PRNETO numeric(18,2),
    PRNETOSINIVA numeric(18,2),
    IVAPORC numeric(9,2),
    IVAITMONTO numeric(18,2),
    CONSUMO numeric(18,2),
    SUBTOTIT numeric(18,2),
    TOTAL numeric(18,2),
    CODIGOCL varchar(20),
    ZONACOD varchar(2),
    ZONANOM varchar(60),
    DV char(1),
    DIRECCION varchar(60),
    CIUDAD varchar(40),
    TELEFONO varchar(40),
    CONTACTO varchar(60),
    FAX varchar(25),
    CEL varchar(25),
    GRUPO varchar(2),
    NOMGRUPO varchar(30),
    SUBGRUPO varchar(3),
    NOMSUBG varchar(30),
    MARCA varchar(3),
    NOMMARCA varchar(30),
    PESO numeric(9,4),
    ANCHO numeric(18,4),
    ALTO numeric(18,4),
    LARGO numeric(18,4),
    SUMA1 numeric(18,2),
    SUMA2 numeric(18,2),
    SUMA3 numeric(18,2),
    IVA1 numeric(18,2),
    IVA2 numeric(18,2),
    IVA3 numeric(18,2),
    SUMAEX numeric(18,2),
    SUMAGR numeric(18,2),
    OBSITEM blob sub_type 1 segment size 80,
    ALTERNATIVAS numeric(18,4),
    PRINCIPALES numeric(18,4))
AS
DECLARE VARIABLE IMPTOS CHAR(1);
DECLARE VARIABLE TARIFA INTEGER;
declare variable ORDENCOD CHAR(2);
declare variable SUCUR VARCHAR(10);
declare variable ICOINC CHAR(2);
declare variable FACTCANT NUMERIC(18,4);
BEGIN
execute procedure lee_configuracion('FACTURACION', 'ARTICULOS', 'IMPOCONSUMO INCLUIDO EN EL PRECIO BASE DE VENTA ANTES DE IVA') returning_values (icoinc);
SELECT F.PREF_PRE, COTI_NUMERO, COTI_FECHA, COTI_VALIDEZ, F.TERC_NIT, COTI_NOMTERC, F.VEND_COD, VEND_NOMBRE, F.PTVT_ID, PTVT_NOM,
    COTI_IMPTOS, COTI_DTOPORC, COTI_DTOMONTO, COTI_ADICIONAL, COTI_IVAMONTO, COTI_EXTRA, COTI_TOTAL,
    TERC_CONTACTO, TERC_FAX, TERC_CEL, TERC_DV, COTI_OBS, COTI_SUCURSAL
    FROM COTIZACIONES F, VENDEDORES V, PUNTO_VENTA P, TERCEROS T
    WHERE F.VEND_COD = V.VEND_COD AND F.PTVT_ID = P.PTVT_ID AND F.TERC_NIT = T.TERC_NIT AND F.COTI_ID = :ID
    into :PREF, :NUMERO, :FECHA, :VALIDEZ, :NIT, :NOMTERCERO, :VENDEDOR, :NOMVENDEDOR, :PUNTOVTA, :NOMPUNTOVTA,
    :IMPTOS, :DTOPORC, :DTOMONTO, :ADICIONAL, :IVAMONTO, :EXTRA, :TOTALFAC,
    :CONTACTO, :FAX, :CEL, :DV, :OBS, :SUCUR;
SUBTOTAL = TOTALFAC - EXTRA - IVAMONTO - ADICIONAL + DTOMONTO;

SELECT CLIE_COD, C.ZONA_COD, ZONA_NOM
    FROM CLIENTES C, ZONAS Z
    WHERE TERC_NIT = :NIT AND C.ZONA_COD = Z.ZONA_COD
    INTO :CODIGOCL, :ZONACOD, :ZONANOM;
SELECT CLSU_DIR, CLSU_CIUDAD, CLSU_TEL FROM CLIENTE_SUCURSALES WHERE TERC_NIT = :NIT AND CLCU_COD = :SUCUR
    INTO :DIRECCION, :CIUDAD, :TELEFONO;
    
SUMAEX = 0;
SUMA1 = 0;
SUMA2 = 0;
SUMA3 = 0;
IVA1 = 0;
IVA2 = 0;
IVA3 = 0;
ITEM = 0;
PESOTOT = 0;
EXECUTE PROCEDURE lee_configuracion ('FACTURACION','DOCUMENTOS','ORDENAR ITEMS POR CODIGO DE ARTICULO') returning_values (:ORDENCOD);
if (ORDENCOD = 'SI') then
    BEGIN
    FOR SELECT D.ARTI_COD, CTDE_CODBAR, SUBSTR(CTDE_DESC,1,60), CTDE_CANT, CTDE_UNIDAD, LIPR_COD, CTDE_PRUNIT, CTDE_DTOPORC, CTDE_DTOMONTO, CTDE_IVAPORC, CTDE_IVAMONTO, CTDE_CONSUMO, CTDE_TOTAL, CTDE_REFERENCIA,
        GRUP_COD, SUBG_COD, MARC_COD, ARTI_PESO, ARTI_ANCHO, ARTI_ALTO, ARTI_LARGO, TAIV_COD, CTDE_OBS, CTDE_FACTOR
        FROM COTIZACIONES_DETALLE D, ARTICULO A
        WHERE D.ARTI_COD = A.ARTI_COD AND D.COTI_ID = :ID
        ORDER BY CTDE_CODBAR
        INTO :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :LISTAPR, :PRUNIT, :DTOITPORC, :DTOITMONTO, :IVAPORC, :IVAITMONTO, :CONSUMO, :TOTAL, :refitem,
        :GRUPO, :SUBGRUPO, :MARCA, :PESO, :ANCHO, :ALTO, :LARGO, :TARIFA, :obsitem, :FACTOR
        DO
        BEGIN
        if (ICOINC = 'SI') then
            SUBTOTIT = TOTAL - IVAITMONTO;
        else
            SUBTOTIT = TOTAL - IVAITMONTO - CONSUMO;
        if (ARTICULO = CODBAR) then
            SELECT FIRST 1 COBA_COD FROM barras_articulo WHERE ARTI_COD = :articulo INTO :CODBAR;
        SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :GRUPO INTO NOMGRUPO;
        SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :MARCA INTO NOMMARCA;
        SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :SUBGRUPO AND GRUP_COD = :GRUPO INTO :NOMSUBG;
        ITEM = ITEM + 1;
        PRNETO = PRUNIT - DTOITMONTO;
        if (PESO IS NULL) then
            PESO = 0;
        PESO = PESO / 1000 * CANT * FACTOR;
        PESOTOT = PESOTOT + PESO;
        if (IMPTOS = 'S') then
            if (cant <> 0) then
                prnetosiniva = PRUNIT - DTOITMONTO - ((IVAITMONTO+CONSUMO) / CANT);
            else
                prnetosiniva = PRUNIT - DTOITMONTO;
        ELSE
            prnetosiniva = PRUNIT - DTOITMONTO;
        if (ivaporc = 0) then
            SUMAEX = SUMAEX + TOTAL;
        if (TARIFA = 1) then
            BEGIN
            SUMA1 = SUMA1 + TOTAL - IVAITMONTO;
            IVA1 = IVA1 + IVAITMONTO;
            END
        if (TARIFA = 2) then
            BEGIN
            SUMA2 = SUMA2 + TOTAL - IVAITMONTO;
            IVA2 = IVA2 + IVAITMONTO;
            END
        if (TARIFA = 3) then
            BEGIN
            SUMA3 = SUMA3 + TOTAL - IVAITMONTO;
            IVA3 = IVA3 + IVAITMONTO;
            END
        SUMAGR = SUMA1 + SUMA2 + SUMA3;
        if (IMPTOS = 'N') then
            TOTAL = TOTAL - IVAITMONTO;
        factcant = NULL;
        SELECT FIRST 1 UNAR_FACCAN FROM unidad_articulo WHERE ARTI_COD = :articulo INTO :factcant;
        if (factcant IS NULL) then
            factcant = 1;
        if ((factcant = 1) or (factcant = 0)) then
            BEGIN
            ALTERNATIVAS = 0;
            PRINCIPALES = (CANT * FACTOR);
            END
        ELSE
            BEGIN
            ALTERNATIVAS = FLOOR(CANT * factor / factcant);
            PRINCIPALES = (CANT * FACTOR) - (alternativas * factcant);
            END
        SUSPEND;
        END
    END
ELSE
    BEGIN
    FOR SELECT D.ARTI_COD, CTDE_CODBAR, SUBSTR(CTDE_DESC,1,60), CTDE_CANT, CTDE_UNIDAD, LIPR_COD, CTDE_PRUNIT, CTDE_DTOPORC, CTDE_DTOMONTO, CTDE_IVAPORC, CTDE_IVAMONTO, CTDE_CONSUMO, CTDE_TOTAL, CTDE_REFERENCIA,
        GRUP_COD, SUBG_COD, MARC_COD, ARTI_PESO, ARTI_ANCHO, ARTI_ALTO, ARTI_LARGO, TAIV_COD, CTDE_OBS, CTDE_FACTOR
        FROM COTIZACIONES_DETALLE D, ARTICULO A
        WHERE D.ARTI_COD = A.ARTI_COD AND D.COTI_ID = :ID
        ORDER BY CTDE_ITEM
        INTO :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :LISTAPR, :PRUNIT, :DTOITPORC, :DTOITMONTO, :IVAPORC, :IVAITMONTO, :CONSUMO, :TOTAL, :refitem,
        :GRUPO, :SUBGRUPO, :MARCA, :PESO, :ANCHO, :ALTO, :LARGO, :TARIFA, :obsitem, :FACTOR
        DO
        BEGIN
        SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :GRUPO INTO NOMGRUPO;
        SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :MARCA INTO NOMMARCA;
        SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :SUBGRUPO AND GRUP_COD = :GRUPO INTO :NOMSUBG;
        ITEM = ITEM + 1;
        if (ICOINC = 'SI') then
            SUBTOTIT = TOTAL - IVAITMONTO;
        else
            SUBTOTIT = TOTAL - IVAITMONTO - CONSUMO;
        PRNETO = PRUNIT - DTOITMONTO;
        if (PESO IS NULL) then
            PESO = 0;
        PESO = PESO / 1000 * CANT * FACTOR;
        PESOTOT = PESOTOT + PESO;
        if (IMPTOS = 'S') then
            if (cant <> 0) then
                prnetosiniva = PRUNIT - DTOITMONTO - ((IVAITMONTO+CONSUMO) / CANT);
            else
                prnetosiniva = PRUNIT - DTOITMONTO;
        ELSE
            prnetosiniva = PRUNIT - DTOITMONTO;
        if (ivaporc = 0) then
            SUMAEX = SUMAEX + TOTAL;
        if (TARIFA = 1) then
            BEGIN
            SUMA1 = SUMA1 + TOTAL - IVAITMONTO;
            IVA1 = IVA1 + IVAITMONTO;
            END
        if (TARIFA = 2) then
            BEGIN
            SUMA2 = SUMA2 + TOTAL - IVAITMONTO;
            IVA2 = IVA2 + IVAITMONTO;
            END
        if (TARIFA = 3) then
            BEGIN
            SUMA3 = SUMA3 + TOTAL - IVAITMONTO;
            IVA3 = IVA3 + IVAITMONTO;
            END
        SUMAGR = SUMA1 + SUMA2 + SUMA3;
        if (IMPTOS = 'N') then
            TOTAL = TOTAL - IVAITMONTO;
        factcant = NULL;
        SELECT FIRST 1 UNAR_FACCAN FROM unidad_articulo WHERE ARTI_COD = :articulo INTO :factcant;
        if (factcant IS NULL) then
            factcant = 1;
        if ((factcant = 1) or (factcant = 0)) then
            BEGIN
            ALTERNATIVAS = 0;
            PRINCIPALES = (CANT * FACTOR);
            END
        ELSE
            BEGIN
            ALTERNATIVAS = FLOOR(CANT * factor / factcant);
            PRINCIPALES = (CANT * FACTOR) - (alternativas * factcant);
            END
        SUSPEND;
        END
    END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure IMPR_PEDIDO (
    ID integer)
returns (
    PREF varchar(4),
    NUMERO varchar(6),
    FECHA date,
    VALIDEZ integer,
    NIT varchar(20),
    NOMTERCERO varchar(60),
    VENDEDOR integer,
    NOMVENDEDOR varchar(60),
    PUNTOVTA integer,
    NOMPUNTOVTA varchar(30),
    COTIZACION varchar(30),
    SUBTOTAL numeric(18,2),
    DTOPORC numeric(9,2),
    DTOMONTO numeric(18,2),
    ADICIONAL numeric(18,2),
    IVAMONTO numeric(18,2),
    EXTRA numeric(18,2),
    TOTALFAC numeric(18,2),
    OBS blob sub_type 1 segment size 80,
    ITEM integer,
    ARTICULO varchar(15),
    CODBAR varchar(15),
    ARTIDES varchar(60),
    BODEGA varchar(2),
    CANT numeric(18,4),
    UNIDAD varchar(8),
    FACTOR numeric(18,4),
    LISTAPR integer,
    REFITEM varchar(60),
    PRUNIT numeric(18,2),
    DTOITPORC numeric(9,2),
    DTOITMONTO numeric(18,2),
    PRNETO numeric(18,2),
    PRNETOSINIVA numeric(18,2),
    DTOIT1 numeric(9,2),
    DTOIT2 numeric(9,2),
    DTOIT3 numeric(9,2),
    IVAPORC numeric(9,2),
    IVAITMONTO numeric(18,2),
    CONSUMO numeric(18,2),
    SUBTOTIT numeric(18,2),
    TOTAL numeric(18,2),
    PESOTOT numeric(18,2),
    CODIGOCL varchar(20),
    ZONACOD varchar(2),
    ZONANOM varchar(60),
    DV char(1),
    DIRECCION varchar(60),
    CIUDAD varchar(40),
    TELEFONO varchar(40),
    CONTACTO varchar(60),
    FAX varchar(25),
    CEL varchar(25),
    GRUPO varchar(2),
    NOMGRUPO varchar(30),
    SUBGRUPO varchar(3),
    NOMSUBG varchar(30),
    MARCA varchar(3),
    NOMMARCA varchar(30),
    PESO numeric(9,4),
    ANCHO numeric(18,4),
    ALTO numeric(18,4),
    LARGO numeric(18,4),
    SUMA1 numeric(18,2),
    SUMA2 numeric(18,2),
    SUMA3 numeric(18,2),
    IVA1 numeric(18,2),
    IVA2 numeric(18,2),
    IVA3 numeric(18,2),
    SUMAEX numeric(18,2),
    SUMAGR numeric(18,2),
    DTOIT1M numeric(18,2),
    DTOIT2M numeric(18,2),
    DTOIT3M numeric(18,2),
    OBSITEM blob sub_type 1 segment size 80,
    ALTERNATIVAS numeric(18,4),
    PRINCIPALES numeric(18,4))
AS
DECLARE VARIABLE IMPTOS CHAR(1);
DECLARE VARIABLE TARIFA INTEGER;
declare variable ORDENCOD CHAR(2);
declare variable SUCUR VARCHAR(10);
declare variable ICOINC CHAR(2);
declare variable DTOITM1 NUMERIC(18,2);
declare variable DTOITM2 NUMERIC(18,2);
declare variable DTOITM3 NUMERIC(18,2);
declare variable FACTCANT NUMERIC(18,4);
BEGIN
execute procedure lee_configuracion('FACTURACION', 'ARTICULOS', 'IMPOCONSUMO INCLUIDO EN EL PRECIO BASE DE VENTA ANTES DE IVA') returning_values (icoinc);
SELECT F.PREF_PRE, PEDI_NUMERO, PEDI_FECHA, PEDI_VALIDEZ, F.TERC_NIT, PEDI_NOMTERC, F.VEND_COD, VEND_NOMBRE, F.PTVT_ID, PTVT_NOM, PEDI_COTIZACI,
    PEDI_IVAINC, PEDI_DTOPOR, PEDI_DTOMONTO, PEDI_ADICIONAL, PEDI_IVAMONTO, PEDI_EXTRA, PEDI_TOTAL,
    TERC_CONTACTO, TERC_FAX, TERC_DV, TERC_CEL, PEDI_OBS, PEDI_SUCURSAL, PEDI_DTOIT1, PEDI_DTOIT2, PEDI_DTOIT3
    FROM PEDIDOS F, VENDEDORES V, PUNTO_VENTA P, TERCEROS T
    WHERE F.VEND_COD = V.VEND_COD AND F.PTVT_ID = P.PTVT_ID AND F.TERC_NIT = T.TERC_NIT AND F.PEDI_ID = :ID
    into :PREF, :NUMERO, :FECHA, :VALIDEZ, :NIT, :NOMTERCERO, :VENDEDOR, :NOMVENDEDOR, :PUNTOVTA, :NOMPUNTOVTA, :COTIZACION,
    :IMPTOS, :DTOPORC, :DTOMONTO, :ADICIONAL, :IVAMONTO, :EXTRA, :TOTALFAC,
    :CONTACTO, :FAX, :DV, :CEL, :OBS, :SUCUR, :dtoit1m, :dtoit2m, :dtoit3m;
SUBTOTAL = TOTALFAC - EXTRA - IVAMONTO - ADICIONAL + DTOMONTO;

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

SET TERM ; ^


SET TERM ^ ;

CREATE OR ALTER procedure IMPR_REMISION (
    ID integer)
returns (
    PREF varchar(4),
    NUMERO varchar(6),
    FECHA date,
    NIT varchar(20),
    NOMTERCERO varchar(60),
    VENDEDOR integer,
    NOMVENDEDOR varchar(60),
    PUNTOVTA integer,
    NOMPUNTOVTA varchar(30),
    CODBODEGA varchar(2),
    NOMBODEGA varchar(30),
    COTIZACION varchar(30),
    PEDIDO varchar(30),
    FACTURA varchar(30),
    SUBTOTAL numeric(18,2),
    IVAMONTO numeric(18,2),
    TOTALFAC numeric(18,2),
    DESPACHO varchar(255),
    TRANSPORTADOR varchar(60),
    OBS blob sub_type 1 segment size 80,
    ITEM integer,
    ARTICULO varchar(15),
    CODBAR varchar(15),
    ARTIDES varchar(60),
    CANT numeric(18,4),
    LOTE varchar(15),
    VLOTE date,
    UNIDAD varchar(8),
    FACTOR numeric(18,4),
    CAJAS numeric(18,4),
    DEVUELTO numeric(18,4),
    CONSUMIDO numeric(18,4),
    LISTAPR integer,
    REFITEM varchar(60),
    BODITEM varchar(2),
    STAND varchar(15),
    PRUNIT numeric(18,2),
    DTOITPORC numeric(9,2),
    DTOITMONTO numeric(18,2),
    PRNETOSINIVA numeric(18,2),
    PRNETO numeric(18,2),
    IVAPORC numeric(9,2),
    IVAITMONTO numeric(18,2),
    CONSUMO numeric(18,2),
    SUBTOTIT numeric(18,2),
    TOTAL numeric(18,2),
    PESOTOT numeric(18,4),
    CODIGOCL varchar(20),
    ZONACOD varchar(2),
    ZONANOM varchar(60),
    DV char(1),
    DIRECCION varchar(60),
    CIUDAD varchar(40),
    TELEFONO varchar(40),
    CONTACTO varchar(60),
    FAX varchar(25),
    CEL varchar(25),
    GRUPO varchar(2),
    NOMGRUPO varchar(30),
    SUBGRUPO varchar(3),
    NOMSUBG varchar(30),
    MARCA varchar(3),
    NOMMARCA varchar(30),
    PESO numeric(18,4),
    ANCHO numeric(18,4),
    ALTO numeric(18,4),
    LARGO numeric(18,4),
    SUMA1 numeric(18,2),
    SUMA2 numeric(18,2),
    SUMA3 numeric(18,2),
    IVA1 numeric(18,2),
    IVA2 numeric(18,2),
    IVA3 numeric(18,2),
    SUMAEX numeric(18,2),
    SUMAGR numeric(18,2),
    TOTCAJAS numeric(18,2),
    OBSITEM blob sub_type 1 segment size 80,
    ALTERNATIVAS numeric(18,4),
    PRINCIPALES numeric(18,4))
AS
DECLARE VARIABLE IMPTOS CHAR(1);
DECLARE VARIABLE TARIFA INTEGER;
declare variable ORDENCOD CHAR(2);
declare variable SUCUR VARCHAR(10);
declare variable ICOINC CHAR(2);
declare variable FACTCANT NUMERIC(18,4);
BEGIN
execute procedure lee_configuracion('FACTURACION', 'ARTICULOS', 'IMPOCONSUMO INCLUIDO EN EL PRECIO BASE DE VENTA ANTES DE IVA') returning_values (icoinc);
EXECUTE PROCEDURE lee_configuracion ('FACTURACION','DOCUMENTOS','ORDENAR ITEMS POR CODIGO DE ARTICULO') returning_values (:ORDENCOD);
SELECT F.PREF_PRE, REVT_NUMERO, REVT_FECHA, F.BODE_COD, BODE_NOM, F.TERC_NIT, REVT_NOMTERC, F.VEND_COD, VEND_NOMBRE, F.PTVT_ID, PTVT_NOM,
    REVT_COTIZACI, REVT_PEDIDO, REVT_FACTURA, REVT_IVAINC,
    REVT_IVAMONTO, REVT_TOTAL, REVT_DESPACHO, REVT_TRANSP,
    TERC_CONTACTO, TERC_FAX, TERC_DV, TERC_CEL, REVT_OBS, REVT_SUCURSAL
    FROM REMISIONES_VENTA F, BODEGA B, VENDEDORES V, PUNTO_VENTA P, TERCEROS T
    WHERE F.BODE_COD = B.BODE_COD AND F.VEND_COD = V.VEND_COD AND F.PTVT_ID = P.PTVT_ID AND F.TERC_NIT = T.TERC_NIT AND F.REVT_ID = :ID
    into :PREF, :NUMERO, :FECHA, :CODBODEGA, :NOMBODEGA, :NIT, :NOMTERCERO, :VENDEDOR, :NOMVENDEDOR, :PUNTOVTA, :NOMPUNTOVTA,
    :COTIZACION, :PEDIDO, :FACTURA, :IMPTOS,
    :IVAMONTO, :TOTALFAC, :DESPACHO, :transportador, 
    :CONTACTO, :FAX, :DV, :CEL, :OBS, :SUCUR;
SUBTOTAL = TOTALFAC - IVAMONTO;

SELECT CLIE_COD, C.ZONA_COD, ZONA_NOM
    FROM CLIENTES C, ZONAS Z
    WHERE TERC_NIT = :NIT AND C.ZONA_COD = Z.ZONA_COD
    INTO :CODIGOCL, :ZONACOD, :ZONANOM;
SELECT CLSU_DIR, CLSU_CIUDAD, CLSU_TEL FROM CLIENTE_SUCURSALES WHERE TERC_NIT = :NIT AND CLCU_COD = :SUCUR
    INTO :DIRECCION, :CIUDAD, :TELEFONO;
    
SUMAEX = 0;
SUMA1 = 0;
SUMA2 = 0;
SUMA3 = 0;
IVA1 = 0;
IVA2 = 0;
IVA3 = 0;
ITEM = 0;
totcajas = 0;
PESOTOT = 0;
if (ORDENCOD = 'SI') then
    BEGIN
    FOR SELECT D.ARTI_COD, RVDE_CODBAR, SUBSTR(RVDE_DESC,1,60), RVDE_CANT, RVDE_UNIDAD, BODE_COD, RVDE_LOTE, LIPR_COD, RVDE_PRUNIT, RVDE_DTOPORC, RVDE_DTOMONTO, RVDE_IVAPORC, RVDE_IVAMONTO, RVDE_CONSUMO, RVDE_TOTAL, RVDE_REFERENCIA,
        GRUP_COD, SUBG_COD, MARC_COD, ARTI_PESO, ARTI_ANCHO, ARTI_ALTO, ARTI_LARGO, TAIV_COD, RVDE_DEVUELTO, RVDE_OBS, RVDE_CAJAS, RVDE_FACTOR
        FROM REMISIONES_VENTA_DETALLE D, ARTICULO A
        WHERE D.ARTI_COD = A.ARTI_COD AND D.REVT_ID = :ID
        ORDER BY RVDE_CODBAR
        INTO :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :BODITEM, :LOTE, :LISTAPR, :PRUNIT, :DTOITPORC, :DTOITMONTO, :IVAPORC, :IVAITMONTO, :CONSUMO, :TOTAL, :refitem,
            :GRUPO, :SUBGRUPO, :MARCA, :PESO, :ANCHO, :ALTO, :LARGO, :TARIFA, :DEVUELTO, :obsitem, :CAJAS, :FACTOR
        DO
        BEGIN
        if (ARTICULO = CODBAR) then
            SELECT FIRST 1 COBA_COD FROM barras_articulo WHERE ARTI_COD = :articulo INTO :CODBAR;
        SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :GRUPO INTO NOMGRUPO;
        SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :MARCA INTO NOMMARCA;
        SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :SUBGRUPO AND GRUP_COD = :GRUPO INTO :NOMSUBG;
        SELECT LOTE_VENCE FROM LOTES WHERE LOTE_NRO = :lote AND ARTI_COD = :ARTICULO AND BODE_COD = :boditem INTO :vlote;
        if (ICOINC = 'SI') then
            SUBTOTIT = TOTAL - IVAITMONTO;
        else
            SUBTOTIT = TOTAL - IVAITMONTO - CONSUMO;
        CONSUMIDO = cant * factor - devuelto;
        ITEM = ITEM + 1;
        PRNETO = PRUNIT - DTOITMONTO;
        if (PESO IS NULL) then
            PESO = 0;
        PESO = PESO / 1000 * CANT * FACTOR;
        PESOTOT = PESOTOT + PESO;
        if (IMPTOS = 'S') then
            if (cant <> 0) then
                prnetosiniva = PRUNIT - DTOITMONTO - ((IVAITMONTO+CONSUMO) / CANT);
            else
                prnetosiniva = PRUNIT - DTOITMONTO;
        ELSE
            prnetosiniva = PRUNIT - DTOITMONTO;
        if (IVAPORC = 0) then
            SUMAEX = SUMAEX + TOTAL;
        if (TARIFA = 1) then
            BEGIN
            SUMA1 = SUMA1 + TOTAL - IVAITMONTO;
            IVA1 = IVA1 + IVAITMONTO;
            END
        if (TARIFA = 2) then
            BEGIN
            SUMA2 = SUMA2 + TOTAL - IVAITMONTO;
            IVA2 = IVA2 + IVAITMONTO;
            END
        if (TARIFA = 3) then
            BEGIN
            SUMA3 = SUMA3 + TOTAL - IVAITMONTO;
            IVA3 = IVA3 + IVAITMONTO;
            END
        SUMAGR = SUMA1 + SUMA2 + SUMA3;

        totcajas = totcajas + cajas;
        SELECT STAND_COD FROM STANDS WHERE ARTI_COD = :ARTICULO AND STAND_BODEGA = :boditem INTO :stand;
        factcant = NULL;
        SELECT FIRST 1 UNAR_FACCAN FROM unidad_articulo WHERE ARTI_COD = :articulo INTO :factcant;
        if (factcant IS NULL) then
            factcant = 1;
        if ((factcant = 1) or (factcant = 0)) then
            BEGIN
            ALTERNATIVAS = 0;
            PRINCIPALES = (CANT * FACTOR);
            END
        ELSE
            BEGIN
            ALTERNATIVAS = FLOOR(CANT * factor / factcant);
            PRINCIPALES = (CANT * FACTOR) - (alternativas * factcant);
            END
        SUSPEND;
        END
    END
ELSE
    BEGIN
    FOR SELECT RVDE_ITEM, D.ARTI_COD, RVDE_CODBAR, SUBSTR(RVDE_DESC,1,60), RVDE_CANT, RVDE_UNIDAD, BODE_COD, RVDE_LOTE, LIPR_COD, RVDE_PRUNIT, RVDE_DTOPORC, RVDE_DTOMONTO, RVDE_IVAPORC, RVDE_IVAMONTO, RVDE_CONSUMO, RVDE_TOTAL, RVDE_REFERENCIA,
        GRUP_COD, SUBG_COD, MARC_COD, ARTI_PESO, ARTI_ANCHO, ARTI_ALTO, ARTI_LARGO, TAIV_COD, RVDE_DEVUELTO, RVDE_OBS, RVDE_CAJAS, RVDE_FACTOR
        FROM REMISIONES_VENTA_DETALLE D, ARTICULO A
        WHERE D.ARTI_COD = A.ARTI_COD AND D.REVT_ID = :ID
        ORDER BY RVDE_ITEM
        INTO :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :BODITEM, :LOTE, :LISTAPR, :PRUNIT, :DTOITPORC, :DTOITMONTO, :IVAPORC, :IVAITMONTO, :CONSUMO, :TOTAL, :refitem,
            :GRUPO, :SUBGRUPO, :MARCA, :PESO, :ANCHO, :ALTO, :LARGO, :TARIFA, :DEVUELTO, :obsitem, :CAJAS, :FACTOR
        DO
        BEGIN
        SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :GRUPO INTO NOMGRUPO;
        SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :MARCA INTO NOMMARCA;
        SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :SUBGRUPO AND GRUP_COD = :GRUPO INTO :NOMSUBG;
        SELECT LOTE_VENCE FROM LOTES WHERE LOTE_NRO = :lote AND ARTI_COD = :ARTICULO AND BODE_COD = :boditem INTO :vlote;
        if (ICOINC = 'SI') then
            SUBTOTIT = TOTAL - IVAITMONTO;
        else
            SUBTOTIT = TOTAL - IVAITMONTO - CONSUMO;
        CONSUMIDO = cant * factor - devuelto;
        ITEM = ITEM + 1;
        PRNETO = PRUNIT - DTOITMONTO;
        if (PESO IS NULL) then
            PESO = 0;
        PESO = PESO / 1000 * CANT * FACTOR;
        PESOTOT = PESOTOT + PESO;
        if (IMPTOS = 'S') then
            if (cant <> 0) then
                prnetosiniva = PRUNIT - DTOITMONTO - ((IVAITMONTO+CONSUMO) / CANT);
            else
                prnetosiniva = PRUNIT - DTOITMONTO;
        ELSE
            prnetosiniva = PRUNIT - DTOITMONTO;
        if (IVAPORC = 0) then
            SUMAEX = SUMAEX + TOTAL;
        if (TARIFA = 1) then
            BEGIN
            SUMA1 = SUMA1 + TOTAL - IVAITMONTO;
            IVA1 = IVA1 + IVAITMONTO;
            END
        if (TARIFA = 2) then
            BEGIN
            SUMA2 = SUMA2 + TOTAL - IVAITMONTO;
            IVA2 = IVA2 + IVAITMONTO;
            END
        if (TARIFA = 3) then
            BEGIN
            SUMA3 = SUMA3 + TOTAL - IVAITMONTO;
            IVA3 = IVA3 + IVAITMONTO;
            END
        SUMAGR = SUMA1 + SUMA2 + SUMA3;
        totcajas = totcajas + cajas;
        SELECT STAND_COD FROM STANDS WHERE ARTI_COD = :ARTICULO AND STAND_BODEGA = :boditem INTO :stand;
        factcant = NULL;
        SELECT FIRST 1 UNAR_FACCAN FROM unidad_articulo WHERE ARTI_COD = :articulo INTO :factcant;
        if (factcant IS NULL) then
            factcant = 1;
        if ((factcant = 1) or (factcant = 0)) then
            BEGIN
            ALTERNATIVAS = 0;
            PRINCIPALES = (CANT * FACTOR);
            END
        ELSE
            BEGIN
            ALTERNATIVAS = FLOOR(CANT * factor / factcant);
            PRINCIPALES = (CANT * FACTOR) - (alternativas * factcant);
            END
        SUSPEND;
        END
    END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure IMPR_DEVOLUCION (
    ID integer)
returns (
    PREF varchar(4),
    NUMERO varchar(6),
    FECHA date,
    NIT varchar(20),
    NOMTERCERO varchar(60),
    VENDEDOR integer,
    NOMVENDEDOR varchar(60),
    PUNTOVTA integer,
    NOMPUNTOVTA varchar(30),
    CODBODEGA varchar(2),
    NOMBODEGA varchar(30),
    FACTURA varchar(30),
    REMISION varchar(10),
    COMIPORC numeric(9,2),
    COMIMONTO numeric(18,2),
    SUBTOTAL numeric(18,2),
    DTOPORC numeric(9,2),
    DTOMONTO numeric(18,2),
    ADICIONAL numeric(18,2),
    IVAMONTO numeric(18,2),
    RTEFTEPORC numeric(9,2),
    RTEFTEMONTO numeric(18,2),
    RTEIVAPORC numeric(9,2),
    RTEIVAMONTO numeric(18,2),
    RTEICAPORC numeric(9,2),
    RTEICAMONTO numeric(18,2),
    EXTRA numeric(18,2),
    TOTALFAC numeric(18,2),
    TOTALPAGAR numeric(18,2),
    PESOTOT numeric(18,2),
    OBS blob sub_type 1 segment size 80,
    ITEM integer,
    ARTICULO varchar(15),
    CODBAR varchar(15),
    ARTIDES varchar(60),
    CANT numeric(18,4),
    LOTE varchar(15),
    UNIDAD varchar(8),
    FACTOR numeric(18,4),
    REFITEM varchar(60),
    BODITEM varchar(2),
    PRUNIT numeric(18,2),
    DTOITPORC numeric(9,2),
    DTOITMONTO numeric(18,2),
    PRNETO numeric(18,2),
    PRNETOSINIVA numeric(18,2),
    IVAPORC numeric(9,2),
    IVAITMONTO numeric(18,2),
    CONSUMO numeric(18,2),
    SUBTOTIT numeric(18,2),
    TOTAL numeric(18,2),
    CODIGOCL varchar(20),
    ZONACOD varchar(2),
    ZONANOM varchar(60),
    DV char(1),
    DIRECCION varchar(60),
    CIUDAD varchar(40),
    TELEFONO varchar(40),
    CONTACTO varchar(60),
    FAX varchar(25),
    CEL varchar(25),
    GRUPO varchar(2),
    NOMGRUPO varchar(30),
    SUBGRUPO varchar(3),
    NOMSUBG varchar(30),
    MARCA varchar(3),
    NOMMARCA varchar(30),
    PESO numeric(9,4),
    ANCHO numeric(18,4),
    ALTO numeric(18,4),
    LARGO numeric(18,4),
    SUMA1 numeric(18,2),
    SUMA2 numeric(18,2),
    SUMA3 numeric(18,2),
    IVA1 numeric(18,2),
    IVA2 numeric(18,2),
    IVA3 numeric(18,2),
    TOTCONSUMO numeric(18,2),
    SUMAEX numeric(18,2),
    SUMAGR numeric(18,2),
    OBSITEM blob sub_type 1 segment size 80,
    ALTERNATIVAS numeric(18,4),
    PRINCIPALES numeric(18,4))
AS
DECLARE VARIABLE IMPTOS CHAR(1);
DECLARE VARIABLE TARIFA INTEGER;
declare variable ORDENCOD CHAR(2);
declare variable SUCUR VARCHAR(10);
declare variable PUNTOS NUMERIC(18,4);
declare variable ICOINC CHAR(2);
declare variable FACTCANT NUMERIC(18,4);
declare variable ANULADO CHAR(1);
BEGIN
execute procedure lee_configuracion('FACTURACION', 'ARTICULOS', 'IMPOCONSUMO INCLUIDO EN EL PRECIO BASE DE VENTA ANTES DE IVA') returning_values (icoinc);
SELECT F.PREF_PRE, DEVT_NUMERO, DEVT_FECHA, F.BODE_COD, BODE_NOM, F.TERC_NIT, DEVT_NOMTERC, F.VEND_COD, VEND_NOMBRE, F.PTVT_ID, PTVT_NOM,
    DEVT_FACTURA, DEVT_COMIPORC, DEVT_COMIMONTO, DEVT_IVAINC,
    DEVT_DTOPOR, DEVT_DTOMONTO, DEVT_ADICIONAL, DEVT_IVAMONTO, DEVT_RTFTEPORC, DEVT_RTFTEMONTO, DEVT_RTIVAPORC, DEVT_RTIVAMONTO, DEVT_RTICAPORC, DEVT_RTICAMONTO, DEVT_EXTRA, DEVT_TOTAL,
    TERC_CONTACTO, TERC_FAX, TERC_DV, TERC_CEL, DEVT_OBS, DEVT_SUCURSAL, DEVT_REMISION, DEVT_ANULADO
    FROM DEVOLUCIONES_VENTAS F, BODEGA B, VENDEDORES V, PUNTO_VENTA P, TERCEROS T
    WHERE F.BODE_COD = B.BODE_COD AND F.VEND_COD = V.VEND_COD AND F.PTVT_ID = P.PTVT_ID AND F.TERC_NIT = T.TERC_NIT AND F.DEVT_ID = :ID
    into :PREF, :NUMERO, :FECHA, :CODBODEGA, :NOMBODEGA, :NIT, :NOMTERCERO, :VENDEDOR, :NOMVENDEDOR, :PUNTOVTA, :NOMPUNTOVTA,
    :FACTURA, :COMIPORC, :COMIMONTO, :IMPTOS,
    :DTOPORC, :DTOMONTO, :ADICIONAL, :IVAMONTO, :RTEFTEPORC, :RTEFTEMONTO, :RTEIVAPORC, :RTEIVAMONTO, :RTEICAPORC, :RTEICAMONTO, :EXTRA, :TOTALFAC,
    :CONTACTO, :FAX, :DV, :CEL, :OBS, :SUCUR, :REMISION, :ANULADO;
SUBTOTAL = TOTALFAC - EXTRA - IVAMONTO - ADICIONAL + DTOMONTO;
TOTALPAGAR = TOTALFAC - RTEFTEMONTO - RTEIVAMONTO - RTEICAMONTO;
if (ANULADO = 'N') then
    EXECUTE PROCEDURE acumula_puntos_cliente (33, :id, :nit, :fecha) returning_values (:PUNTOS);
SELECT CLIE_COD, C.ZONA_COD, ZONA_NOM
    FROM CLIENTES C, ZONAS Z
    WHERE TERC_NIT = :NIT AND C.ZONA_COD = Z.ZONA_COD
    INTO :CODIGOCL, :ZONACOD, :ZONANOM;
SELECT CLSU_DIR, CLSU_CIUDAD, CLSU_TEL FROM CLIENTE_SUCURSALES WHERE TERC_NIT = :NIT AND CLCU_COD = :SUCUR
    INTO :DIRECCION, :CIUDAD, :TELEFONO;
    
SUMAEX = 0;
SUMA1 = 0;
SUMA2 = 0;
SUMA3 = 0;
IVA1 = 0;
IVA2 = 0;
IVA3 = 0;
TOTCONSUMO = 0;
ITEM = 0;
EXECUTE PROCEDURE lee_configuracion ('FACTURACION','DOCUMENTOS','ORDENAR ITEMS POR CODIGO DE ARTICULO') returning_values (:ORDENCOD);
if (ORDENCOD = 'SI') then
    BEGIN
    FOR SELECT D.ARTI_COD, DVDE_CODBAR, SUBSTR(DVDE_DESC,1,60), DVDE_CANT, DVDE_UNIDAD, BODE_COD, DVDE_LOTE, DVDE_PRUNIT, DVDE_DTOPORC, DVDE_DTOMONTO, DVDE_IVAPORC, DVDE_IVAMONTO, DVDE_CONSUMO, DVDE_TOTAL, DVDE_REFERENCIA,
        GRUP_COD, SUBG_COD, MARC_COD, ARTI_PESO, ARTI_ANCHO, ARTI_ALTO, ARTI_LARGO, TAIV_COD, DVDE_OBS, DVDE_FACTOR
        FROM DEVOLUCIONES_VENTAS_DETALLE D, ARTICULO A
        WHERE D.ARTI_COD = A.ARTI_COD AND D.DEVT_ID = :ID
        ORDER BY DVDE_CODBAR
        INTO :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :BODITEM, :LOTE, :PRUNIT, :DTOITPORC, :DTOITMONTO, :IVAPORC, :IVAITMONTO, :CONSUMO, :TOTAL, :REFITEM,
        :GRUPO, :SUBGRUPO, :MARCA, :PESO, :ANCHO, :ALTO, :LARGO, :TARIFA, :obsitem, :FACTOR
        DO
        BEGIN
        if (ARTICULO = CODBAR) then
            SELECT FIRST 1 COBA_COD FROM barras_articulo WHERE ARTI_COD = :articulo INTO :CODBAR;
        ITEM = ITEM + 1;
        if (ICOINC = 'SI') then
            SUBTOTIT = TOTAL - IVAITMONTO;
        else
            SUBTOTIT = TOTAL - IVAITMONTO - CONSUMO;
        PRNETO = PRUNIT - DTOITMONTO;
        if (PESO IS NULL) then
            PESO = 0;
        PESO = PESO / 1000 * CANT * FACTOR;
        PESOTOT = PESOTOT + PESO;
        if (IMPTOS = 'S') then
            if (cant <> 0) then
                prnetosiniva = PRUNIT - DTOITMONTO - ((IVAITMONTO+CONSUMO) / CANT);
            else
                prnetosiniva = PRUNIT - DTOITMONTO;
        ELSE
            prnetosiniva = PRUNIT - DTOITMONTO;
        TOTCONSUMO = TOTCONSUMO + CONSUMO;
        if ((REFITEM <> '.t') or (REFITEM IS NULL)) then
            BEGIN
            /* NO SUME LOS ENSAMBLES */
            if (IVAPORC = 0) then
                SUMAEX = SUMAEX + TOTAL;
            if (TARIFA = 1) then
                BEGIN
                SUMA1 = SUMA1 + TOTAL - IVAITMONTO;
                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;
            END
        if (substr(ARTICULO,1,2) = '.t') then
            BEGIN
            REFITEM = '';
            TOTAL = 0;
            END
        factcant = NULL;
        SELECT FIRST 1 UNAR_FACCAN FROM unidad_articulo WHERE ARTI_COD = :articulo INTO :factcant;
        if (factcant IS NULL) then
            factcant = 1;
        if ((factcant = 1) or (factcant = 0)) then
            BEGIN
            ALTERNATIVAS = 0;
            PRINCIPALES = (CANT * FACTOR);
            END
        ELSE
            BEGIN
            ALTERNATIVAS = FLOOR(CANT * factor / factcant);
            PRINCIPALES = (CANT * FACTOR) - (alternativas * factcant);
            END
        SUSPEND;
        END
    END
ELSE
    BEGIN
    FOR SELECT D.ARTI_COD, DVDE_CODBAR, SUBSTR(DVDE_DESC,1,60), DVDE_CANT, DVDE_UNIDAD, BODE_COD, DVDE_LOTE, DVDE_PRUNIT, DVDE_DTOPORC, DVDE_DTOMONTO, DVDE_IVAPORC, DVDE_IVAMONTO, DVDE_CONSUMO, DVDE_TOTAL, DVDE_REFERENCIA,
        GRUP_COD, SUBG_COD, MARC_COD, ARTI_PESO, ARTI_ANCHO, ARTI_ALTO, ARTI_LARGO, TAIV_COD, DVDE_OBS, DVDE_FACTOR
        FROM DEVOLUCIONES_VENTAS_DETALLE D, ARTICULO A
        WHERE D.ARTI_COD = A.ARTI_COD AND D.DEVT_ID = :ID
        ORDER BY DVDE_ITEM
        INTO :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :BODITEM, :LOTE, :PRUNIT, :DTOITPORC, :DTOITMONTO, :IVAPORC, :IVAITMONTO, :CONSUMO, :TOTAL, :REFITEM,
        :GRUPO, :SUBGRUPO, :MARCA, :PESO, :ANCHO, :ALTO, :LARGO, :TARIFA, :obsitem, :FACTOR
        DO
        BEGIN
        if (ARTICULO = CODBAR) then
            SELECT FIRST 1 COBA_COD FROM barras_articulo WHERE ARTI_COD = :articulo INTO :CODBAR;
        SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :GRUPO INTO NOMGRUPO;
        SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :MARCA INTO NOMMARCA;
        SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :SUBGRUPO AND GRUP_COD = :GRUPO INTO :NOMSUBG;
        ITEM = ITEM + 1;
        if (ICOINC = 'SI') then
            SUBTOTIT = TOTAL - IVAITMONTO;
        else
            SUBTOTIT = TOTAL - IVAITMONTO - CONSUMO;
        PRNETO = PRUNIT - DTOITMONTO;
        if (PESO IS NULL) then
            PESO = 0;
        PESO = PESO / 1000 * CANT * FACTOR;
        PESOTOT = PESOTOT + PESO;
        if (IMPTOS = 'S') then
            if (cant <> 0) then
                prnetosiniva = PRUNIT - DTOITMONTO - ((IVAITMONTO+CONSUMO) / CANT);
            else
                prnetosiniva = PRUNIT - DTOITMONTO;
        ELSE
            prnetosiniva = PRUNIT - DTOITMONTO;
        TOTCONSUMO = TOTCONSUMO + CONSUMO;
        if ((REFITEM <> '.t') or (REFITEM IS NULL)) then
            BEGIN
            /* NO SUME LOS ENSAMBLES */
            if (IVAPORC = 0) then
                SUMAEX = SUMAEX + TOTAL;
            if (TARIFA = 1) then
                BEGIN
                SUMA1 = SUMA1 + TOTAL - IVAITMONTO;
                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;
            END
        if (substr(ARTICULO,1,2) = '.t') then
            BEGIN
            REFITEM = '';
            TOTAL = 0;
            END
        factcant = NULL;
        SELECT FIRST 1 UNAR_FACCAN FROM unidad_articulo WHERE ARTI_COD = :articulo INTO :factcant;
        if (factcant IS NULL) then
            factcant = 1;
        if ((factcant = 1) or (factcant = 0)) then
            BEGIN
            ALTERNATIVAS = 0;
            PRINCIPALES = (CANT * FACTOR);
            END
        ELSE
            BEGIN
            ALTERNATIVAS = FLOOR(CANT * factor / factcant);
            PRINCIPALES = (CANT * FACTOR) - (alternativas * factcant);
            END
        SUSPEND;
        END
    END
END
^

SET TERM ; ^

SET TERM ^ ;

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

/* ACUMULE LOS PUNTOS, SE HACE ACA POR SER POSTERIOR AL DETALLE */
if (ANULADO = 'N') then
    EXECUTE PROCEDURE acumula_puntos_cliente (31, :id, :nit, :fecha) returning_values (:PUNTOS);
EXECUTE PROCEDURE consulta_puntos_cliente (:id, :nit, :fecha) returning_values (:puntos, :puntosacum, :puntosvenc, :fecptos);
if (DTOIT1M IS NULL) then
    DTOIT1M = 0;
if (DTOIT2M IS NULL) then
    DTOIT2M = 0;
if (DTOIT3M IS NULL) then
    DTOIT3M = 0;
SELECT CLIE_COD, C.ZONA_COD, ZONA_NOM
    FROM CLIENTES C, ZONAS Z
    WHERE TERC_NIT = :NIT AND C.ZONA_COD = Z.ZONA_COD
    INTO :CODIGOCL, :ZONACOD, :ZONANOM;
SELECT CLSU_DIR, CLSU_CIUDAD, CLSU_TEL FROM CLIENTE_SUCURSALES WHERE TERC_NIT = :NIT AND CLCU_COD = :SUCUR
    INTO :DIRECCION, :CIUDAD, :TELEFONO;
DIASVENCE = VENCE - FECHA;
if (DIASVENCE > 0) then
    CONTCRED = 'CREDITO ' || CAST(DIASVENCE AS VARCHAR(3)) || ' DIAS';
ELSE
    CONTCRED = 'CONTADO';
SUBTOTAL = TOTALFAC - EXTRA - IVAMONTO - ADICIONAL + DTOMONTO;
if (DTOITE3 = 'SI') then
    BEGIN
    SELECT SUM(FADE_DTOMONTO) FROM FACTURAS_DETALLE WHERE FACT_ID = :id INTO :sumdtoit;
    SUBTOTAL = SUBTOTAL + sumdtoit + dtoit1m + dtoit2m + dtoit3m;
    END
if (INGTER <> '') then
    BEGIN
    SELECT SUM(FADE_TOTAL) FROM FACTURAS_DETALLE D, ARTICULO A WHERE A.arti_cod = D.arti_cod AND FACT_ID = :id AND GRUP_COD = :ingter
        INTO :ingterceros;
    INGPROPIOS = SUBTOTAL - INGTERCEROS;
    END
EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'FECHA AUTORETENEDOR NO DESCONTAR RETENCIONES DEL SALDO PERO SI CONTABILIZARLAS') returning_values (AUTORET);
if (AUTORET <> '') then
    FAUTORET = CAST(AUTORET AS DATE);
else
    FAUTORET = '9999/12/31';
if (FECHA > fautoret) then
    TOTALPAGAR = TOTALFAC - RTEIVAMONTO - RTEICAMONTO - ANTICIPO;
ELSE
    TOTALPAGAR = TOTALFAC - RTEFTEMONTO - RTEIVAMONTO - RTEICAMONTO - ANTICIPO;
TOTALNETO = TOTALFAC - ANTICIPO;
if (RECIBIDO <> 0) then
    CAMBIO = RECIBIDO - totalpagar;
ELSE
    CAMBIO = 0;
SUMAEX = 0;
SUMA1 = 0;
SUMA2 = 0;
SUMA3 = 0;
IVA1 = 0;
IVA2 = 0;
IVA3 = 0;
TOTCONSUMO = 0;
MONTOPAGO1 = 0;
PESOTOT = 0;
SELECT MAX(AUDI_HORA) FROM AUDITORIA WHERE TIDO_COD = 31 AND AUDI_IDDOC = :ID AND AUDI_OPER = 'I' INTO :HORA;
/* AHORA LAS FORMAS DE PAGO, BUSQUE EL ABONO DE HOY A LA FACTURA */
ITEMFP = 1;
MONTOPAGO1 = 0;
MONTOPAGO2 = 0;
MONTOPAGO3 = 0;
FOR SELECT FOPA_NOM, RCPA_MONTO FROM RECIBOS_CAJA_PAGO P, FORMAS_PAGO F, RECIBOS_CAJA R, RECIBOS_CAJA_DETALLE D
    WHERE R.RECA_ID = P.RECA_ID AND R.RECA_ID = D.RECA_ID AND P.FOPA_ID = F.FOPA_ID AND RECA_FECHA = :FECHA AND RCDE_TIPODOC = 31 AND RCDE_IDDOC = :ID
    INTO :formap, :MONTOP
    DO
    BEGIN
    if (ITEMFP = 1) then
        BEGIN
        FORMAPAGO1 = FORMAP;
        MONTOPAGO1 = MONTOP;
        END
    if (ITEMFP = 2) then
        BEGIN
        FORMAPAGO2 = FORMAP;
        MONTOPAGO2 = MONTOP;
        END
    if (ITEMFP = 3) then
        BEGIN
        FORMAPAGO3 = FORMAP;
        MONTOPAGO3 = MONTOP;
        END
    ITEMFP = ITEMFP + 1;
    END
EXECUTE PROCEDURE lee_configuracion ('FACTURACION','DOCUMENTOS','ORDENAR ITEMS POR CODIGO DE ARTICULO') returning_values (:ORDENCOD);
EXECUTE PROCEDURE lee_configuracion ('FACTURACION','POS', 'IMPRIMIR DEVOLUCIONES DE ARTICULOS NEGATIVOS') returning_values (:imprdev);
totcajas = 0;
totbase = 0;
if (ORDENCOD = 'SI') then
    BEGIN
    FOR SELECT FADE_ITEM, D.ARTI_COD, FADE_CODBAR, SUBSTR(FADE_DESC,1,60), ARTI_DESCORTA, FADE_CANT, FADE_UNIDAD, FADE_FACTOR, BODE_COD, FADE_LOTE, LIPR_COD, FADE_PRUNIT, FADE_DTOPORC, FADE_DTOMONTO, FADE_IVAPORC, FADE_IVAMONTO, FADE_CONSUMO, FADE_TOTAL, FADE_REFERENCIA,
        GRUP_COD, SUBG_COD, MARC_COD, ARTI_PESO, ARTI_ANCHO, ARTI_ALTO, ARTI_LARGO, TAIV_COD, FADE_DEVUELTO, FADE_OBS, FADE_DTO1, FADE_DTO2, FADE_DTO3, FADE_DTOM1, FADE_DTOM2, FADE_DTOM3, FADE_CAJAS, FADE_BASE, FADE_PORCBASE
        FROM FACTURAS_DETALLE D, ARTICULO A
        WHERE D.ARTI_COD = A.ARTI_COD AND D.FACT_ID = :ID
        ORDER BY D.ARTI_COD
        INTO :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :DESCORTA, :CANT, :UNIDAD, :FACTOR, :BODITEM, :LOTE, :LISTAPR, :PRUNIT, :DTOITPORC, :DTOITMONTO, :IVAPORC, :IVAITMONTO, :CONSUMO, :TOTAL, :refitem,
        :GRUPO, :SUBGRUPO, :MARCA, :PESO, :ANCHO, :ALTO, :LARGO, :TARIFA, :devuelto, :obsitem, :dtoit1, :dtoit2, :dtoit3, :dtoitm1, :dtoitm2, :dtoitm3, :cajas, :base, :porcbase
        DO
          BEGIN
          if (ARTICULO = CODBAR) then
            SELECT FIRST 1 COBA_COD FROM barras_articulo WHERE ARTI_COD = :articulo INTO :CODBAR;
          if (IMPRDEV <> 'SI') then
            BEGIN
            if ((CANT >= 0) AND (DEVUELTO = 0)) then
                IMPR = 'S';
            ELSE
                IMPR = 'N'; /* ES DEVOLUCION */
            END
          ELSE
            IMPR = 'S';
          if (IMPR = 'S') then
            BEGIN
            prneto = PRUNIT - DTOITMONTO - dtoitm1 - dtoitm2 - dtoitm3;
            if (IMPTOS = 'S') then
                if (cant <> 0) then
                    prnetosiniva = PRUNIT - DTOITMONTO - ((IVAITMONTO+CONSUMO) / CANT) - dtoitm1 - dtoitm2 - dtoitm3;
                else
                    prnetosiniva = PRUNIT - DTOITMONTO - dtoitm1 - dtoitm2 - dtoitm3;
            ELSE
                prnetosiniva = PRUNIT - DTOITMONTO - dtoit1m - dtoit2m - dtoit3m;
            if (ICOINC = 'SI') then
                SUBTOTIT = TOTAL - IVAITMONTO;
            else
                SUBTOTIT = TOTAL - IVAITMONTO - CONSUMO;
            TOTCONSUMO = TOTCONSUMO + CONSUMO;
            TOTBASE = TOTBASE + BASE;
            SELECT LOTE_VENCE FROM LOTES WHERE LOTE_NRO = :lote AND ARTI_COD = :ARTICULO AND BODE_COD = :boditem INTO :vlote;
            if ((REFITEM <> '.t') or (REFITEM IS NULL)) then
                BEGIN
                /* NO SUME LOS ENSAMBLES */
                if (IVAPORC = 0) then
                    SUMAEX = SUMAEX + TOTAL;
                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;
                END
            if (ANCHO IS NULL) then
                ANCHO = 0;
            if (ALTO IS NULL) then
                ALTO = 0;
            if (LARGO IS NULL) then
                LARGO = 0;
            if (PESO IS NULL) then
                PESO = 0;
            PESO = (PESO / 1000) * CANT * FACTOR;
            PESOTOT = PESOTOT + PESO;
            totcajas = totcajas + cajas;
            if (substr(ARTICULO,1,2) = '.t') then
                BEGIN
                REFITEM = '';
                TOTAL = 0;
                SUBTOTIT = 0;
                END
            SELECT STAND_COD FROM STANDS WHERE ARTI_COD = :ARTICULO AND STAND_BODEGA = :boditem INTO :stand;
            factcant = NULL;
            SELECT FIRST 1 UNAR_FACCAN FROM unidad_articulo WHERE ARTI_COD = :articulo INTO :factcant;
            if (factcant IS NULL) then
                BEGIN
                ALTERNATIVAS = 0;
                PRINCIPALES = (CANT * FACTOR);
                END
            ELSE
                BEGIN
                ALTERNATIVAS = FLOOR(CANT * factor / factcant);
                PRINCIPALES = (CANT * FACTOR) - (alternativas * factcant);
                END
            SUSPEND;
            END
          END
    END
ELSE
    BEGIN
    FOR SELECT FADE_ITEM, D.ARTI_COD, FADE_CODBAR, SUBSTR(FADE_DESC,1,60), ARTI_DESCORTA, FADE_CANT, FADE_UNIDAD, FADE_FACTOR, BODE_COD, FADE_LOTE, LIPR_COD, FADE_PRUNIT, FADE_DTOPORC, FADE_DTOMONTO, FADE_IVAPORC, FADE_IVAMONTO, FADE_CONSUMO, FADE_TOTAL, FADE_REFERENCIA,
        GRUP_COD, SUBG_COD, MARC_COD, ARTI_PESO, ARTI_ANCHO, ARTI_ALTO, ARTI_LARGO, TAIV_COD, FADE_DEVUELTO, FADE_OBS, FADE_DTO1, FADE_DTO2, FADE_DTO3, FADE_DTOM1, FADE_DTOM2, FADE_DTOM3, FADE_CAJAS, FADE_BASE, FADE_PORCBASE
        FROM FACTURAS_DETALLE D, ARTICULO A
        WHERE D.ARTI_COD = A.ARTI_COD AND D.FACT_ID = :ID
        ORDER BY FADE_ITEM
        INTO :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :DESCORTA, :CANT, :UNIDAD, :FACTOR, :BODITEM, :LOTE, :LISTAPR, :PRUNIT, :DTOITPORC, :DTOITMONTO, :IVAPORC, :IVAITMONTO, :CONSUMO, :TOTAL, :refitem,
        :GRUPO, :SUBGRUPO, :MARCA, :PESO, :ANCHO, :ALTO, :LARGO, :TARIFA, :devuelto, :obsitem, :dtoit1, :dtoit2, :dtoit3, :dtoitm1, :dtoitm2, :dtoitm3, :cajas, :base, :porcbase
        DO
          BEGIN
          if (IMPRDEV <> 'SI') then
            BEGIN
            if ((CANT >= 0) AND (DEVUELTO = 0)) then
                IMPR = 'S';
            ELSE
                IMPR = 'N'; /* ES DEVOLUCION */
            END
          ELSE
            IMPR = 'S';
          if (IMPR = 'S') then
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :GRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :MARCA INTO NOMMARCA;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :SUBGRUPO AND GRUP_COD = :GRUPO INTO :NOMSUBG;
            prneto = PRUNIT - DTOITMONTO - dtoitm1 - dtoitm2 - dtoitm3;
            if (IMPTOS = 'S') then
                if (cant <> 0) then
                    prnetosiniva = PRUNIT - DTOITMONTO - ((IVAITMONTO+CONSUMO) / CANT) - dtoit1m - dtoit2m - dtoit3m;
                else
                    prnetosiniva = PRUNIT - DTOITMONTO - dtoitm1 - dtoitm2 - dtoitm3;
            ELSE
                prnetosiniva = PRUNIT - DTOITMONTO - dtoitm1 - dtoitm2 - dtoitm3;
            if (ICOINC = 'SI') then
                SUBTOTIT = TOTAL - IVAITMONTO;
            else
                SUBTOTIT = TOTAL - IVAITMONTO - CONSUMO;
            TOTCONSUMO = TOTCONSUMO + CONSUMO;
            TOTBASE = TOTBASE + BASE;
            SELECT LOTE_VENCE FROM LOTES WHERE LOTE_NRO = :lote AND ARTI_COD = :ARTICULO AND BODE_COD = :boditem INTO :vlote;
            if ((REFITEM <> '.t') or (REFITEM IS NULL)) then
                BEGIN
                /* NO SUME LOS ENSAMBLES */
                if (IVAPORC = 0) then
                    SUMAEX = SUMAEX + TOTAL;
                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;
                END
            if (ANCHO IS NULL) then
                ANCHO = 0;
            if (ALTO IS NULL) then
                ALTO = 0;
            if (LARGO IS NULL) then
                LARGO = 0;
            if (PESO IS NULL) then
                PESO = 0;
            PESO = (PESO / 1000)* CANT * FACTOR;
            PESOTOT = PESOTOT + PESO;
            totcajas = totcajas + cajas;
            if (substr(ARTICULO,1,2) = '.t') then
                BEGIN
                REFITEM = '';
                TOTAL = 0;
                SUBTOTIT = 0;
                END
            SELECT STAND_COD FROM STANDS WHERE ARTI_COD = :ARTICULO AND STAND_BODEGA = :boditem INTO :stand;
            factcant = NULL;
            SELECT FIRST 1 UNAR_FACCAN FROM unidad_articulo WHERE ARTI_COD = :articulo INTO :factcant;
            if (factcant IS NULL) then
                BEGIN
                ALTERNATIVAS = 0;
                PRINCIPALES = (CANT * FACTOR);
                END
            ELSE
                BEGIN
                ALTERNATIVAS = FLOOR(CANT * factor / factcant);
                PRINCIPALES = (CANT * FACTOR) - (alternativas * factcant);
                END
            SUSPEND;
            END
          END
    END
END
^

SET TERM ; ^


/* 20090812 */
/* ERROR SI EL NIT ES NULL */
SET TERM ^ ;

CREATE OR ALTER TRIGGER TRASFERENCIAS_DETALLE_AI FOR TRASFERENCIAS_DETALLE
ACTIVE AFTER INSERT POSITION 0
AS
declare variable fec date;
declare variable CONC VARCHAR(60);
declare variable factor numeric(18,4);
declare variable bodori varchar(2);
declare variable boddes varchar(2);
declare variable Pref varchar(4);
declare variable Num varchar(6);
declare variable NIT varchar(20);
declare variable fecaux date;
declare variable ORIGEN VARCHAR(2);
BEGIN
  if ((NEW.Tran_id <> 0) and (new.tras_anulado = 'N')) then
    begin
    select tran_fecha, tran_conc, BODE_COD, TRAN_BODDES, pref_pre, tran_numero, TERC_NIT
        from trasferencias where tran_id = new.tran_id into :fec, :conc, :bodori, :boddes, :Pref, :Num, :NIT;
    execute procedure factor_unidad_cant(new.arti_cod, new.tras_unidad) returning_values(factor);
    EXECUTE PROCEDURE LEE_CONFIGURACION('INVENTARIO', 'TRASLADOS', 'AFECTAR AMBAS BODEGAS AL CONFIRMAR ENTREGA') returning_values(ORIGEN);
    if ((ORIGEN = 'NO') or (new.tras_confirma = 'S'))  then
        INSERT INTO MOVIMIENTO_ARTICULO
          (ARTI_COD, MVAR_CONS, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM)
          VALUES(NEW.ARTI_COD, GEN_ID(ID_MOVARTI,1), :bodori, :FEC, 13, NEW.tran_id,
          :CONC, :factor * new.tras_cant, 0, 'N', new.tras_lote, :Pref, :Num, new.tras_item);
    if (new.tras_confirma = 'S') then
      INSERT INTO MOVIMIENTO_ARTICULO
        (ARTI_COD, MVAR_CONS, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM)
        VALUES(NEW.ARTI_COD, GEN_ID(ID_MOVARTI,1), :boddes, :FEC, 13, NEW.tran_id,
        :CONC, :factor * new.tras_cant, NEW.tras_costo, 'S', new.tras_lotedes, :Pref, :Num, new.tras_item);

    /* ACTUALICE EL COSTO POR PROVEEDOR */
    if (:NIT <> '') then
        BEGIN
        SELECT PVAR_FECHA FROM PROVEEDOR_ARTICULO
            WHERE TERC_NIT = :Nit AND ARTI_COD = NEW.ARTI_COD
            INTO :FECAUX;
        if (FECAUX IS NULL) then
            INSERT INTO PROVEEDOR_ARTICULO (TERC_NIT, ARTI_COD, PVAR_COSTO, PVAR_FECHA, PVAR_COD,PVAR_DES)
                VALUES (:Nit, NEW.ARTI_COD, (new.tras_costo * new.tras_factor), :fec, :NIT,NEW.tras_desc);
        else
            UPDATE PROVEEDOR_ARTICULO
                SET PVAR_COSTO = NEW.tras_costo, PVAR_FECHA = :fec
                WHERE ARTI_COD = NEW.ARTI_COD AND TERC_NIT = :Nit;
        END
    END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER TRASFERENCIAS_DETALLE_AU FOR TRASFERENCIAS_DETALLE
ACTIVE AFTER UPDATE POSITION 0
AS
declare variable fec date;
declare variable CONC VARCHAR(60);
declare variable factor numeric(18,4);
declare variable bodori varchar(2);
declare variable boddes varchar(2);
declare variable Pref varchar(4);
declare variable Num varchar(6);
declare variable ORIGEN VARCHAR(2);
declare variable NIT varchar(20);
declare variable fecaux date;
BEGIN
if ((old.tras_cant <> new.tras_cant) or (old.tras_unidad <> new.tras_unidad) or (old.tras_lote <> new.tras_lote) or
    (old.tras_anulado <> new.tras_anulado) or (old.tras_transmit <> new.tras_transmit) or (old.tras_confirma <> new.tras_confirma)) then
  begin
  /* Anule el anterior */
  if ((old.tran_id <> 0) and (old.tras_anulado = 'N')) then
    begin
    delete from movimiento_articulo where (mvar_tipodoc = 13) and (mvar_idref = old.tran_id) and (mvar_item = old.tras_item);
    END
  /* Registre el nuevo */
  if ((new.tran_id <> 0) and (new.tras_anulado = 'N')) then
    BEGIN
    select tran_fecha, tran_conc, BODE_COD, TRAN_BODDES, Pref_pre, tran_numero, terc_nit
        from trasferencias where tran_id = new.tran_id into :fec, :conc, :bodori, :boddes, :Pref, :Num, :Nit;
    execute procedure factor_unidad_cant(new.arti_cod, new.tras_unidad) returning_values(factor);
    EXECUTE PROCEDURE LEE_CONFIGURACION('INVENTARIO', 'TRASLADOS', 'AFECTAR AMBAS BODEGAS AL CONFIRMAR ENTREGA') returning_values(ORIGEN);
    if ((ORIGEN = 'NO') or (new.tras_confirma = 'S'))  then
        INSERT INTO MOVIMIENTO_ARTICULO
            (ARTI_COD, MVAR_CONS, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM)
            VALUES(NEW.ARTI_COD, GEN_ID(ID_MOVARTI,1), :bodori, :FEC, 13, NEW.tran_id,
            :CONC, :factor * new.tras_cant, 0, 'N', new.tras_lote, :Pref, :Num, new.tras_item);
    if (new.tras_confirma = 'S') then
        INSERT INTO MOVIMIENTO_ARTICULO
        (ARTI_COD, MVAR_CONS, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM)
        VALUES(NEW.ARTI_COD, GEN_ID(ID_MOVARTI,1), :boddes, :FEC, 13, NEW.tran_id,
        :CONC, :factor * new.tras_cant, 0, 'S', new.tras_lotedes, :Pref, :Num, new.tras_item);
    /* ACTUALICE EL COSTO POR PROVEEDOR */
    if (:NIT <> '') then
        BEGIN
        SELECT PVAR_FECHA FROM PROVEEDOR_ARTICULO
            WHERE TERC_NIT = :Nit AND ARTI_COD = NEW.ARTI_COD
            INTO :FECAUX;
        if (FECAUX IS NULL) then
            INSERT INTO PROVEEDOR_ARTICULO (TERC_NIT, ARTI_COD, PVAR_COSTO, PVAR_FECHA, PVAR_COD,PVAR_DES)
                VALUES (:Nit, NEW.ARTI_COD, (new.tras_costo * new.tras_factor), :fec, :NIT,NEW.tras_desc);
        else
            UPDATE PROVEEDOR_ARTICULO
                SET PVAR_COSTO = NEW.tras_costo, PVAR_FECHA = :fec
                WHERE ARTI_COD = NEW.ARTI_COD AND TERC_NIT = :Nit;
        END
    END
  end
END
^

SET TERM ; ^



/* 20090812b */
SET TERM ^ ;

CREATE OR ALTER procedure ACUMULA_PUNTOS_CLIENTE (
    TIPO integer,
    IDDOC integer,
    CLIENTE varchar(20),
    FECHA date)
returns (
    PUNTOS integer)
AS
declare variable numrows integer;
declare variable fecaux date;
declare variable IDP INTEGER;
declare variable ok integer;
declare variable ACUMULA CHAR(10);
declare variable FACTOR INTEGER;
declare variable ARTICULO VARCHAR(15);
declare variable FACTORART INTEGER;
declare variable ptos FLOAT;
declare variable ptosacum FLOAT;
declare variable HORA TIME;
declare variable HORINI TIME;
declare variable HORFIN TIME;
begin
ok = 1;
execute procedure lee_configuracion('FACTURACION', 'FACTURAS', 'ACUMULAR PUNTOS POR VENTAS A CLIENTE REGULARES') returning_values (ACUMULA);
if (acumula = 'VENTA') then
    begin
    execute procedure lee_configuracion('FACTURACION', 'FACTURAS', 'FACTOR DE CONVERSION DE PUNTOS') returning_values (FACTOR);
    if (IDDOC <> 0) then
        begin
        if (tipo = 31) then
            begin
            select count(ptcl_id) from puntos_cliente where ptcl_nit = :cliente and ptcl_tipodoc = 31 and ptcl_iddoc = :iddoc into :numrows;
            if (numrows = 0) then
                begin
                ptosacum = 0;
                /* recorra la factura acumulando los puntos */
                for select arti_cod, (fade_total-fade_ivamonto-fade_consumo)/:factor from facturas_detalle
                    where fact_id = :iddoc and substring(arti_cod from 1 FOR 2) <> '.t' into :articulo, :ptos
                    do
                    begin
                    factorart = 1;
                    select ptar_factor from puntos_articulos where PTAR_COD = :articulo into :factorart;
                    ptosacum = ptosacum + (ptos * factorart);
                    end
                /* SI ES UN DIA ESPECIAL APLIQUE EL FACTOR */
                SELECT FACT_FECHA FROM FACTURAS WHERE FACT_ID = :iddoc INTO :fecaux;
                FOR SELECT PTDE_ID FROM puntos_diasespecial WHERE PTDE_FECINI <= :fecaux AND PTDE_FECFIN >= :fecaux INTO :idp
                    DO
                    BEGIN
                    SELECT PTDE_HORINI, PTDE_HORFIN, PTDE_FACTOR FROM puntos_diasespecial
                        WHERE PTDE_ID = :IDP INTO :HORINI, :HORFIN, :factorart;
                    SELECT AUDI_HORA FROM AUDITORIA WHERE TIDO_COD = 31 AND AUDI_IDDOC = :iddoc INTO HORA;
                    if ((horini <= HORA) AND (horfin >= HORA)) then
                        ptosacum = ptosacum * factorart;
                    END
                /* inserte el registro de puntos */
                puntos = floor(ptosacum);
                insert into puntos_cliente (ptcl_nit, ptcl_fecha, ptcl_tipodoc, ptcl_iddoc, ptcl_db, ptcl_cr)
                    values (:cliente, :fecha,  31, :iddoc, :puntos, 0);
                end
            end
        if (tipo = 33) then
            begin
            select count(ptcl_id) from puntos_cliente where ptcl_nit = :cliente and ptcl_tipodoc = 33 and ptcl_iddoc = :iddoc into :numrows;
            if (numrows = 0) then
                begin
                ptosacum = 0;
                /* recorra la DEVOLUCION acumulando los puntos */
                for select arti_cod, (dvde_total-dvde_ivamonto-dvde_consumo)/:factor from devoluciones_ventas_detalle
                    where devt_id = :iddoc and substring(arti_cod from 1 FOR 2) <> '.t' into :articulo, :ptos
                    do
                    begin
                    factorart = 1;
                    select ptar_factor from puntos_articulos where PTAR_COD = :articulo into :factorart;
                    ptosacum = ptosacum + (ptos * factorart);
                    end
                /* SI ES UN DIA ESPECIAL APLIQUE EL FACTOR */
                SELECT DEVT_FECHA FROM devoluciones_ventas WHERE DEVT_ID = :iddoc INTO :fecaux;
                FOR SELECT PTDE_ID FROM puntos_diasespecial WHERE PTDE_FECINI <= :fecaux AND PTDE_FECFIN >= :fecaux INTO :idp
                    DO
                    BEGIN
                    SELECT PTDE_HORINI, PTDE_HORFIN, PTDE_FACTOR FROM puntos_diasespecial
                        WHERE PTDE_ID = :IDP INTO :HORINI, :HORFIN, :factorart;
                    SELECT AUDI_HORA FROM AUDITORIA WHERE TIDO_COD = 33 AND AUDI_IDDOC = :iddoc INTO HORA;
                    if ((horini <= HORA) AND (horfin >= HORA)) then
                        ptosacum = ptosacum * factorart;
                    END
                /* inserte el registro de puntos */
                puntos = floor(ptosacum);
                insert into puntos_cliente (ptcl_nit, ptcl_fecha, ptcl_tipodoc, ptcl_iddoc, ptcl_db, ptcl_cr)
                    values (:cliente, :fecha,  33, :iddoc, 0, :puntos);
                end
            end

        suspend;
        end
    end
end
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE IMPR_DEVOLUCION(
    ID INTEGER)
RETURNS (
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    NIT VARCHAR(20),
    NOMTERCERO VARCHAR(60),
    VENDEDOR INTEGER,
    NOMVENDEDOR VARCHAR(60),
    PUNTOVTA INTEGER,
    NOMPUNTOVTA VARCHAR(30),
    CODBODEGA VARCHAR(2),
    NOMBODEGA VARCHAR(30),
    FACTURA VARCHAR(30),
    REMISION VARCHAR(10),
    COMIPORC NUMERIC(9,2),
    COMIMONTO NUMERIC(18,2),
    SUBTOTAL NUMERIC(18,2),
    DTOPORC NUMERIC(9,2),
    DTOMONTO NUMERIC(18,2),
    ADICIONAL NUMERIC(18,2),
    IVAMONTO NUMERIC(18,2),
    RTEFTEPORC NUMERIC(9,2),
    RTEFTEMONTO NUMERIC(18,2),
    RTEIVAPORC NUMERIC(9,2),
    RTEIVAMONTO NUMERIC(18,2),
    RTEICAPORC NUMERIC(9,2),
    RTEICAMONTO NUMERIC(18,2),
    EXTRA NUMERIC(18,2),
    TOTALFAC NUMERIC(18,2),
    TOTALPAGAR NUMERIC(18,2),
    PESOTOT NUMERIC(18,2),
    OBS BLOB SUB_TYPE 1 SEGMENT SIZE 80,
    ITEM INTEGER,
    ARTICULO VARCHAR(15),
    CODBAR VARCHAR(15),
    ARTIDES VARCHAR(60),
    CANT NUMERIC(18,4),
    LOTE VARCHAR(15),
    UNIDAD VARCHAR(8),
    FACTOR NUMERIC(18,4),
    REFITEM VARCHAR(60),
    BODITEM VARCHAR(2),
    PRUNIT NUMERIC(18,2),
    DTOITPORC NUMERIC(9,2),
    DTOITMONTO NUMERIC(18,2),
    PRNETO NUMERIC(18,2),
    PRNETOSINIVA NUMERIC(18,2),
    IVAPORC NUMERIC(9,2),
    IVAITMONTO NUMERIC(18,2),
    CONSUMO NUMERIC(18,2),
    SUBTOTIT NUMERIC(18,2),
    TOTAL NUMERIC(18,2),
    CODIGOCL VARCHAR(20),
    ZONACOD VARCHAR(2),
    ZONANOM VARCHAR(60),
    DV CHAR(1),
    DIRECCION VARCHAR(60),
    CIUDAD VARCHAR(40),
    TELEFONO VARCHAR(40),
    CONTACTO VARCHAR(60),
    FAX VARCHAR(25),
    CEL VARCHAR(25),
    GRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    SUBGRUPO VARCHAR(3),
    NOMSUBG VARCHAR(30),
    MARCA VARCHAR(3),
    NOMMARCA VARCHAR(30),
    PESO NUMERIC(9,4),
    ANCHO NUMERIC(18,4),
    ALTO NUMERIC(18,4),
    LARGO NUMERIC(18,4),
    SUMA1 NUMERIC(18,2),
    SUMA2 NUMERIC(18,2),
    SUMA3 NUMERIC(18,2),
    IVA1 NUMERIC(18,2),
    IVA2 NUMERIC(18,2),
    IVA3 NUMERIC(18,2),
    TOTCONSUMO NUMERIC(18,2),
    SUMAEX NUMERIC(18,2),
    SUMAGR NUMERIC(18,2),
    OBSITEM BLOB SUB_TYPE 1 SEGMENT SIZE 80,
    ALTERNATIVAS NUMERIC(18,4),
    PRINCIPALES NUMERIC(18,4))
AS
 /*$$IBE$$ DECLARE VARIABLE IMPTOS CHAR(1);
DECLARE VARIABLE TARIFA INTEGER;
declare variable ORDENCOD CHAR(2);
declare variable SUCUR VARCHAR(10);
declare variable PUNTOS NUMERIC(18,4);
declare variable ICOINC CHAR(2);
declare variable FACTCANT NUMERIC(18,4);
declare variable ANULADO CHAR(1); $$IBE$$*/ 
BEGIN /*$$IBE$$ 
execute procedure lee_configuracion('FACTURACION', 'ARTICULOS', 'IMPOCONSUMO INCLUIDO EN EL PRECIO BASE DE VENTA ANTES DE IVA') returning_values (icoinc);
SELECT F.PREF_PRE, DEVT_NUMERO, DEVT_FECHA, F.BODE_COD, BODE_NOM, F.TERC_NIT, DEVT_NOMTERC, F.VEND_COD, VEND_NOMBRE, F.PTVT_ID, PTVT_NOM,
    DEVT_FACTURA, DEVT_COMIPORC, DEVT_COMIMONTO, DEVT_IVAINC,
    DEVT_DTOPOR, DEVT_DTOMONTO, DEVT_ADICIONAL, DEVT_IVAMONTO, DEVT_RTFTEPORC, DEVT_RTFTEMONTO, DEVT_RTIVAPORC, DEVT_RTIVAMONTO, DEVT_RTICAPORC, DEVT_RTICAMONTO, DEVT_EXTRA, DEVT_TOTAL,
    TERC_CONTACTO, TERC_FAX, TERC_DV, TERC_CEL, DEVT_OBS, DEVT_SUCURSAL, DEVT_REMISION, DEVT_ANULADO
    FROM DEVOLUCIONES_VENTAS F, BODEGA B, VENDEDORES V, PUNTO_VENTA P, TERCEROS T
    WHERE F.BODE_COD = B.BODE_COD AND F.VEND_COD = V.VEND_COD AND F.PTVT_ID = P.PTVT_ID AND F.TERC_NIT = T.TERC_NIT AND F.DEVT_ID = :ID
    into :PREF, :NUMERO, :FECHA, :CODBODEGA, :NOMBODEGA, :NIT, :NOMTERCERO, :VENDEDOR, :NOMVENDEDOR, :PUNTOVTA, :NOMPUNTOVTA,
    :FACTURA, :COMIPORC, :COMIMONTO, :IMPTOS,
    :DTOPORC, :DTOMONTO, :ADICIONAL, :IVAMONTO, :RTEFTEPORC, :RTEFTEMONTO, :RTEIVAPORC, :RTEIVAMONTO, :RTEICAPORC, :RTEICAMONTO, :EXTRA, :TOTALFAC,
    :CONTACTO, :FAX, :DV, :CEL, :OBS, :SUCUR, :REMISION, :ANULADO;
SUBTOTAL = TOTALFAC - EXTRA - IVAMONTO - ADICIONAL + DTOMONTO;
TOTALPAGAR = TOTALFAC - RTEFTEMONTO - RTEIVAMONTO - RTEICAMONTO;
if (ANULADO = 'N') then
    EXECUTE PROCEDURE acumula_puntos_cliente (33, :id, :nit, :fecha) returning_values (:PUNTOS);
SELECT CLIE_COD, C.ZONA_COD, ZONA_NOM
    FROM CLIENTES C, ZONAS Z
    WHERE TERC_NIT = :NIT AND C.ZONA_COD = Z.ZONA_COD
    INTO :CODIGOCL, :ZONACOD, :ZONANOM;
SELECT CLSU_DIR, CLSU_CIUDAD, CLSU_TEL FROM CLIENTE_SUCURSALES WHERE TERC_NIT = :NIT AND CLCU_COD = :SUCUR
    INTO :DIRECCION, :CIUDAD, :TELEFONO;
    
SUMAEX = 0;
SUMA1 = 0;
SUMA2 = 0;
SUMA3 = 0;
IVA1 = 0;
IVA2 = 0;
IVA3 = 0;
TOTCONSUMO = 0;
ITEM = 0;
EXECUTE PROCEDURE lee_configuracion ('FACTURACION','DOCUMENTOS','ORDENAR ITEMS POR CODIGO DE ARTICULO') returning_values (:ORDENCOD);
if (ORDENCOD = 'SI') then
    BEGIN
    FOR SELECT D.ARTI_COD, DVDE_CODBAR, SUBSTR(DVDE_DESC,1,60), DVDE_CANT, DVDE_UNIDAD, BODE_COD, DVDE_LOTE, DVDE_PRUNIT, DVDE_DTOPORC, DVDE_DTOMONTO, DVDE_IVAPORC, DVDE_IVAMONTO, DVDE_CONSUMO, DVDE_TOTAL, DVDE_REFERENCIA,
        GRUP_COD, SUBG_COD, MARC_COD, ARTI_PESO, ARTI_ANCHO, ARTI_ALTO, ARTI_LARGO, TAIV_COD, DVDE_OBS, DVDE_FACTOR
        FROM DEVOLUCIONES_VENTAS_DETALLE D, ARTICULO A
        WHERE D.ARTI_COD = A.ARTI_COD AND D.DEVT_ID = :ID
        ORDER BY DVDE_CODBAR
        INTO :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :BODITEM, :LOTE, :PRUNIT, :DTOITPORC, :DTOITMONTO, :IVAPORC, :IVAITMONTO, :CONSUMO, :TOTAL, :REFITEM,
        :GRUPO, :SUBGRUPO, :MARCA, :PESO, :ANCHO, :ALTO, :LARGO, :TARIFA, :obsitem, :FACTOR
        DO
        BEGIN
        if (ARTICULO = CODBAR) then
            SELECT FIRST 1 COBA_COD FROM barras_articulo WHERE ARTI_COD = :articulo INTO :CODBAR;
        ITEM = ITEM + 1;
        if (ICOINC = 'SI') then
            SUBTOTIT = TOTAL - IVAITMONTO;
        else
            SUBTOTIT = TOTAL - IVAITMONTO - CONSUMO;
        PRNETO = PRUNIT - DTOITMONTO;
        if (PESO IS NULL) then
            PESO = 0;
        PESO = PESO / 1000 * CANT * FACTOR;
        PESOTOT = PESOTOT + PESO;
        if (IMPTOS = 'S') then
            if (cant <> 0) then
                prnetosiniva = PRUNIT - DTOITMONTO - ((IVAITMONTO+CONSUMO) / CANT);
            else
                prnetosiniva = PRUNIT - DTOITMONTO;
        ELSE
            prnetosiniva = PRUNIT - DTOITMONTO;
        TOTCONSUMO = TOTCONSUMO + CONSUMO;
        if ((REFITEM <> '.t') or (REFITEM IS NULL)) then
            BEGIN
             $$IBE$$*/ /* NO SUME LOS ENSAMBLES */ /*$$IBE$$ 
            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;
            END
        if (substr(ARTICULO,1,2) = '.t') then
            BEGIN
            REFITEM = '';
            TOTAL = 0;
            END
        factcant = NULL;
        SELECT FIRST 1 UNAR_FACCAN FROM unidad_articulo WHERE ARTI_COD = :articulo INTO :factcant;
        if (factcant IS NULL) then
            factcant = 1;
        if ((factcant = 1) or (factcant = 0)) then
            BEGIN
            ALTERNATIVAS = 0;
            PRINCIPALES = (CANT * FACTOR);
            END
        ELSE
            BEGIN
            ALTERNATIVAS = FLOOR(CANT * factor / factcant);
            PRINCIPALES = (CANT * FACTOR) - (alternativas * factcant);
            END
        SUSPEND;
        END
    END
ELSE
    BEGIN
    FOR SELECT D.ARTI_COD, DVDE_CODBAR, SUBSTR(DVDE_DESC,1,60), DVDE_CANT, DVDE_UNIDAD, BODE_COD, DVDE_LOTE, DVDE_PRUNIT, DVDE_DTOPORC, DVDE_DTOMONTO, DVDE_IVAPORC, DVDE_IVAMONTO, DVDE_CONSUMO, DVDE_TOTAL, DVDE_REFERENCIA,
        GRUP_COD, SUBG_COD, MARC_COD, ARTI_PESO, ARTI_ANCHO, ARTI_ALTO, ARTI_LARGO, TAIV_COD, DVDE_OBS, DVDE_FACTOR
        FROM DEVOLUCIONES_VENTAS_DETALLE D, ARTICULO A
        WHERE D.ARTI_COD = A.ARTI_COD AND D.DEVT_ID = :ID
        ORDER BY DVDE_ITEM
        INTO :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :BODITEM, :LOTE, :PRUNIT, :DTOITPORC, :DTOITMONTO, :IVAPORC, :IVAITMONTO, :CONSUMO, :TOTAL, :REFITEM,
        :GRUPO, :SUBGRUPO, :MARCA, :PESO, :ANCHO, :ALTO, :LARGO, :TARIFA, :obsitem, :FACTOR
        DO
        BEGIN
        if (ARTICULO = CODBAR) then
            SELECT FIRST 1 COBA_COD FROM barras_articulo WHERE ARTI_COD = :articulo INTO :CODBAR;
        SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :GRUPO INTO NOMGRUPO;
        SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :MARCA INTO NOMMARCA;
        SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :SUBGRUPO AND GRUP_COD = :GRUPO INTO :NOMSUBG;
        ITEM = ITEM + 1;
        if (ICOINC = 'SI') then
            SUBTOTIT = TOTAL - IVAITMONTO;
        else
            SUBTOTIT = TOTAL - IVAITMONTO - CONSUMO;
        PRNETO = PRUNIT - DTOITMONTO;
        if (PESO IS NULL) then
            PESO = 0;
        PESO = PESO / 1000 * CANT * FACTOR;
        PESOTOT = PESOTOT + PESO;
        if (IMPTOS = 'S') then
            if (cant <> 0) then
                prnetosiniva = PRUNIT - DTOITMONTO - ((IVAITMONTO+CONSUMO) / CANT);
            else
                prnetosiniva = PRUNIT - DTOITMONTO;
        ELSE
            prnetosiniva = PRUNIT - DTOITMONTO;
        TOTCONSUMO = TOTCONSUMO + CONSUMO;
        if ((REFITEM <> '.t') or (REFITEM IS NULL)) then
            BEGIN
             $$IBE$$*/ /* NO SUME LOS ENSAMBLES */ /*$$IBE$$ 
            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;
            END
        if (substr(ARTICULO,1,2) = '.t') then
            BEGIN
            REFITEM = '';
            TOTAL = 0;
            END
        factcant = NULL;
        SELECT FIRST 1 UNAR_FACCAN FROM unidad_articulo WHERE ARTI_COD = :articulo INTO :factcant;
        if (factcant IS NULL) then
            factcant = 1;
        if ((factcant = 1) or (factcant = 0)) then
            BEGIN
            ALTERNATIVAS = 0;
            PRINCIPALES = (CANT * FACTOR);
            END
        ELSE
            BEGIN
            ALTERNATIVAS = FLOOR(CANT * factor / factcant);
            PRINCIPALES = (CANT * FACTOR) - (alternativas * factcant);
            END
        SUSPEND;
        END
    END
 $$IBE$$*/ SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

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

 $$IBE$$*/ /* ACUMULE LOS PUNTOS, SE HACE ACA POR SER POSTERIOR AL DETALLE */ /*$$IBE$$ 
if (ANULADO = 'N') then
    EXECUTE PROCEDURE acumula_puntos_cliente (31, :id, :nit, :fecha) returning_values (:PUNTOS);
EXECUTE PROCEDURE consulta_puntos_cliente (:id, :nit, :fecha) returning_values (:puntos, :puntosacum, :puntosvenc, :fecptos);
if (DTOIT1M IS NULL) then
    DTOIT1M = 0;
if (DTOIT2M IS NULL) then
    DTOIT2M = 0;
if (DTOIT3M IS NULL) then
    DTOIT3M = 0;
SELECT CLIE_COD, C.ZONA_COD, ZONA_NOM
    FROM CLIENTES C, ZONAS Z
    WHERE TERC_NIT = :NIT AND C.ZONA_COD = Z.ZONA_COD
    INTO :CODIGOCL, :ZONACOD, :ZONANOM;
SELECT CLSU_DIR, CLSU_CIUDAD, CLSU_TEL FROM CLIENTE_SUCURSALES WHERE TERC_NIT = :NIT AND CLCU_COD = :SUCUR
    INTO :DIRECCION, :CIUDAD, :TELEFONO;
DIASVENCE = VENCE - FECHA;
if (DIASVENCE > 0) then
    CONTCRED = 'CREDITO ' || CAST(DIASVENCE AS VARCHAR(3)) || ' DIAS';
ELSE
    CONTCRED = 'CONTADO';
SUBTOTAL = TOTALFAC - EXTRA - IVAMONTO - ADICIONAL + DTOMONTO;
if (DTOITE3 = 'SI') then
    BEGIN
    SELECT SUM(FADE_DTOMONTO) FROM FACTURAS_DETALLE WHERE FACT_ID = :id INTO :sumdtoit;
    SUBTOTAL = SUBTOTAL + sumdtoit + dtoit1m + dtoit2m + dtoit3m;
    END
if (INGTER <> '') then
    BEGIN
    SELECT SUM(FADE_TOTAL) FROM FACTURAS_DETALLE D, ARTICULO A WHERE A.arti_cod = D.arti_cod AND FACT_ID = :id AND GRUP_COD = :ingter
        INTO :ingterceros;
    INGPROPIOS = SUBTOTAL - INGTERCEROS;
    END
EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'FECHA AUTORETENEDOR NO DESCONTAR RETENCIONES DEL SALDO PERO SI CONTABILIZARLAS') returning_values (AUTORET);
if (AUTORET <> '') then
    FAUTORET = CAST(AUTORET AS DATE);
else
    FAUTORET = '9999/12/31';
if (FECHA > fautoret) then
    TOTALPAGAR = TOTALFAC - RTEIVAMONTO - RTEICAMONTO - ANTICIPO;
ELSE
    TOTALPAGAR = TOTALFAC - RTEFTEMONTO - RTEIVAMONTO - RTEICAMONTO - ANTICIPO;
TOTALNETO = TOTALFAC - ANTICIPO;
if (RECIBIDO <> 0) then
    CAMBIO = RECIBIDO - totalpagar;
ELSE
    CAMBIO = 0;
SUMAEX = 0;
SUMA1 = 0;
SUMA2 = 0;
SUMA3 = 0;
IVA1 = 0;
IVA2 = 0;
IVA3 = 0;
TOTCONSUMO = 0;
MONTOPAGO1 = 0;
PESOTOT = 0;
SELECT MAX(AUDI_HORA) FROM AUDITORIA WHERE TIDO_COD = 31 AND AUDI_IDDOC = :ID AND AUDI_OPER = 'I' INTO :HORA;
 $$IBE$$*/ /* AHORA LAS FORMAS DE PAGO, BUSQUE EL ABONO DE HOY A LA FACTURA */ /*$$IBE$$ 
ITEMFP = 1;
MONTOPAGO1 = 0;
MONTOPAGO2 = 0;
MONTOPAGO3 = 0;
FOR SELECT FOPA_NOM, RCPA_MONTO FROM RECIBOS_CAJA_PAGO P, FORMAS_PAGO F, RECIBOS_CAJA R, RECIBOS_CAJA_DETALLE D
    WHERE R.RECA_ID = P.RECA_ID AND R.RECA_ID = D.RECA_ID AND P.FOPA_ID = F.FOPA_ID AND RECA_FECHA = :FECHA AND RCDE_TIPODOC = 31 AND RCDE_IDDOC = :ID
    INTO :formap, :MONTOP
    DO
    BEGIN
    if (ITEMFP = 1) then
        BEGIN
        FORMAPAGO1 = FORMAP;
        MONTOPAGO1 = MONTOP;
        END
    if (ITEMFP = 2) then
        BEGIN
        FORMAPAGO2 = FORMAP;
        MONTOPAGO2 = MONTOP;
        END
    if (ITEMFP = 3) then
        BEGIN
        FORMAPAGO3 = FORMAP;
        MONTOPAGO3 = MONTOP;
        END
    ITEMFP = ITEMFP + 1;
    END
EXECUTE PROCEDURE lee_configuracion ('FACTURACION','DOCUMENTOS','ORDENAR ITEMS POR CODIGO DE ARTICULO') returning_values (:ORDENCOD);
EXECUTE PROCEDURE lee_configuracion ('FACTURACION','POS', 'IMPRIMIR DEVOLUCIONES DE ARTICULOS NEGATIVOS') returning_values (:imprdev);
totcajas = 0;
totbase = 0;
if (ORDENCOD = 'SI') then
    BEGIN
    FOR SELECT FADE_ITEM, D.ARTI_COD, FADE_CODBAR, SUBSTR(FADE_DESC,1,60), ARTI_DESCORTA, FADE_CANT, FADE_UNIDAD, FADE_FACTOR, BODE_COD, FADE_LOTE, LIPR_COD, FADE_PRUNIT, FADE_DTOPORC, FADE_DTOMONTO, FADE_IVAPORC, FADE_IVAMONTO, FADE_CONSUMO, FADE_TOTAL, FADE_REFERENCIA,
        GRUP_COD, SUBG_COD, MARC_COD, ARTI_PESO, ARTI_ANCHO, ARTI_ALTO, ARTI_LARGO, TAIV_COD, FADE_DEVUELTO, FADE_OBS, FADE_DTO1, FADE_DTO2, FADE_DTO3, FADE_DTOM1, FADE_DTOM2, FADE_DTOM3, FADE_CAJAS, FADE_BASE, FADE_PORCBASE
        FROM FACTURAS_DETALLE D, ARTICULO A
        WHERE D.ARTI_COD = A.ARTI_COD AND D.FACT_ID = :ID
        ORDER BY D.ARTI_COD
        INTO :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :DESCORTA, :CANT, :UNIDAD, :FACTOR, :BODITEM, :LOTE, :LISTAPR, :PRUNIT, :DTOITPORC, :DTOITMONTO, :IVAPORC, :IVAITMONTO, :CONSUMO, :TOTAL, :refitem,
        :GRUPO, :SUBGRUPO, :MARCA, :PESO, :ANCHO, :ALTO, :LARGO, :TARIFA, :devuelto, :obsitem, :dtoit1, :dtoit2, :dtoit3, :dtoitm1, :dtoitm2, :dtoitm3, :cajas, :base, :porcbase
        DO
          BEGIN
          if (ARTICULO = CODBAR) then
            SELECT FIRST 1 COBA_COD FROM barras_articulo WHERE ARTI_COD = :articulo INTO :CODBAR;
          if (IMPRDEV <> 'SI') then
            BEGIN
            if ((CANT >= 0) AND (DEVUELTO = 0)) then
                IMPR = 'S';
            ELSE
                IMPR = 'N';  $$IBE$$*/ /* ES DEVOLUCION */ /*$$IBE$$ 
            END
          ELSE
            IMPR = 'S';
          if (IMPR = 'S') then
            BEGIN
            prneto = PRUNIT - DTOITMONTO - dtoitm1 - dtoitm2 - dtoitm3;
            if (IMPTOS = 'S') then
                if (cant <> 0) then
                    prnetosiniva = PRUNIT - DTOITMONTO - ((IVAITMONTO+CONSUMO) / CANT) - dtoitm1 - dtoitm2 - dtoitm3;
                else
                    prnetosiniva = PRUNIT - DTOITMONTO - dtoitm1 - dtoitm2 - dtoitm3;
            ELSE
                prnetosiniva = PRUNIT - DTOITMONTO - dtoit1m - dtoit2m - dtoit3m;
            if (ICOINC = 'SI') then
                SUBTOTIT = TOTAL - IVAITMONTO;
            else
                SUBTOTIT = TOTAL - IVAITMONTO - CONSUMO;
            TOTCONSUMO = TOTCONSUMO + CONSUMO;
            TOTBASE = TOTBASE + BASE;
            SELECT LOTE_VENCE FROM LOTES WHERE LOTE_NRO = :lote AND ARTI_COD = :ARTICULO AND BODE_COD = :boditem INTO :vlote;
            if ((REFITEM <> '.t') or (REFITEM IS NULL)) then
                BEGIN
                 $$IBE$$*/ /* NO SUME LOS ENSAMBLES */ /*$$IBE$$ 
                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;
                END
            if (ANCHO IS NULL) then
                ANCHO = 0;
            if (ALTO IS NULL) then
                ALTO = 0;
            if (LARGO IS NULL) then
                LARGO = 0;
            if (PESO IS NULL) then
                PESO = 0;
            PESO = (PESO / 1000) * CANT * FACTOR;
            PESOTOT = PESOTOT + PESO;
            totcajas = totcajas + cajas;
            if (substr(ARTICULO,1,2) = '.t') then
                BEGIN
                REFITEM = '';
                TOTAL = 0;
                SUBTOTIT = 0;
                END
            SELECT STAND_COD FROM STANDS WHERE ARTI_COD = :ARTICULO AND STAND_BODEGA = :boditem INTO :stand;
            factcant = NULL;
            SELECT FIRST 1 UNAR_FACCAN FROM unidad_articulo WHERE ARTI_COD = :articulo INTO :factcant;
            if (factcant IS NULL) then
                BEGIN
                ALTERNATIVAS = 0;
                PRINCIPALES = (CANT * FACTOR);
                END
            ELSE
                BEGIN
                ALTERNATIVAS = FLOOR(CANT * factor / factcant);
                PRINCIPALES = (CANT * FACTOR) - (alternativas * factcant);
                END
            SUSPEND;
            END
          END
    END
ELSE
    BEGIN
    FOR SELECT FADE_ITEM, D.ARTI_COD, FADE_CODBAR, SUBSTR(FADE_DESC,1,60), ARTI_DESCORTA, FADE_CANT, FADE_UNIDAD, FADE_FACTOR, BODE_COD, FADE_LOTE, LIPR_COD, FADE_PRUNIT, FADE_DTOPORC, FADE_DTOMONTO, FADE_IVAPORC, FADE_IVAMONTO, FADE_CONSUMO, FADE_TOTAL, FADE_REFERENCIA,
        GRUP_COD, SUBG_COD, MARC_COD, ARTI_PESO, ARTI_ANCHO, ARTI_ALTO, ARTI_LARGO, TAIV_COD, FADE_DEVUELTO, FADE_OBS, FADE_DTO1, FADE_DTO2, FADE_DTO3, FADE_DTOM1, FADE_DTOM2, FADE_DTOM3, FADE_CAJAS, FADE_BASE, FADE_PORCBASE
        FROM FACTURAS_DETALLE D, ARTICULO A
        WHERE D.ARTI_COD = A.ARTI_COD AND D.FACT_ID = :ID
        ORDER BY FADE_ITEM
        INTO :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :DESCORTA, :CANT, :UNIDAD, :FACTOR, :BODITEM, :LOTE, :LISTAPR, :PRUNIT, :DTOITPORC, :DTOITMONTO, :IVAPORC, :IVAITMONTO, :CONSUMO, :TOTAL, :refitem,
        :GRUPO, :SUBGRUPO, :MARCA, :PESO, :ANCHO, :ALTO, :LARGO, :TARIFA, :devuelto, :obsitem, :dtoit1, :dtoit2, :dtoit3, :dtoitm1, :dtoitm2, :dtoitm3, :cajas, :base, :porcbase
        DO
          BEGIN
          if (IMPRDEV <> 'SI') then
            BEGIN
            if ((CANT >= 0) AND (DEVUELTO = 0)) then
                IMPR = 'S';
            ELSE
                IMPR = 'N';  $$IBE$$*/ /* ES DEVOLUCION */ /*$$IBE$$ 
            END
          ELSE
            IMPR = 'S';
          if (IMPR = 'S') then
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :GRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :MARCA INTO NOMMARCA;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :SUBGRUPO AND GRUP_COD = :GRUPO INTO :NOMSUBG;
            prneto = PRUNIT - DTOITMONTO - dtoitm1 - dtoitm2 - dtoitm3;
            if (IMPTOS = 'S') then
                if (cant <> 0) then
                    prnetosiniva = PRUNIT - DTOITMONTO - ((IVAITMONTO+CONSUMO) / CANT) - dtoit1m - dtoit2m - dtoit3m;
                else
                    prnetosiniva = PRUNIT - DTOITMONTO - dtoitm1 - dtoitm2 - dtoitm3;
            ELSE
                prnetosiniva = PRUNIT - DTOITMONTO - dtoitm1 - dtoitm2 - dtoitm3;
            if (ICOINC = 'SI') then
                SUBTOTIT = TOTAL - IVAITMONTO;
            else
                SUBTOTIT = TOTAL - IVAITMONTO - CONSUMO;
            TOTCONSUMO = TOTCONSUMO + CONSUMO;
            TOTBASE = TOTBASE + BASE;
            SELECT LOTE_VENCE FROM LOTES WHERE LOTE_NRO = :lote AND ARTI_COD = :ARTICULO AND BODE_COD = :boditem INTO :vlote;
            if ((REFITEM <> '.t') or (REFITEM IS NULL)) then
                BEGIN
                 $$IBE$$*/ /* NO SUME LOS ENSAMBLES */ /*$$IBE$$ 
                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;
                END
            if (ANCHO IS NULL) then
                ANCHO = 0;
            if (ALTO IS NULL) then
                ALTO = 0;
            if (LARGO IS NULL) then
                LARGO = 0;
            if (PESO IS NULL) then
                PESO = 0;
            PESO = (PESO / 1000)* CANT * FACTOR;
            PESOTOT = PESOTOT + PESO;
            totcajas = totcajas + cajas;
            if (substr(ARTICULO,1,2) = '.t') then
                BEGIN
                REFITEM = '';
                TOTAL = 0;
                SUBTOTIT = 0;
                END
            SELECT STAND_COD FROM STANDS WHERE ARTI_COD = :ARTICULO AND STAND_BODEGA = :boditem INTO :stand;
            factcant = NULL;
            SELECT FIRST 1 UNAR_FACCAN FROM unidad_articulo WHERE ARTI_COD = :articulo INTO :factcant;
            if (factcant IS NULL) then
                BEGIN
                ALTERNATIVAS = 0;
                PRINCIPALES = (CANT * FACTOR);
                END
            ELSE
                BEGIN
                ALTERNATIVAS = FLOOR(CANT * factor / factcant);
                PRINCIPALES = (CANT * FACTOR) - (alternativas * factcant);
                END
            SUSPEND;
            END
          END
    END
 $$IBE$$*/ SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE IMPR_DEVOLUCION(
    ID INTEGER)
RETURNS (
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    NIT VARCHAR(20),
    NOMTERCERO VARCHAR(60),
    VENDEDOR INTEGER,
    NOMVENDEDOR VARCHAR(60),
    PUNTOVTA INTEGER,
    NOMPUNTOVTA VARCHAR(30),
    CODBODEGA VARCHAR(2),
    NOMBODEGA VARCHAR(30),
    FACTURA VARCHAR(30),
    REMISION VARCHAR(10),
    COMIPORC NUMERIC(9,2),
    COMIMONTO NUMERIC(18,2),
    SUBTOTAL NUMERIC(18,2),
    DTOPORC NUMERIC(9,2),
    DTOMONTO NUMERIC(18,2),
    ADICIONAL NUMERIC(18,2),
    IVAMONTO NUMERIC(18,2),
    RTEFTEPORC NUMERIC(9,2),
    RTEFTEMONTO NUMERIC(18,2),
    RTEIVAPORC NUMERIC(9,2),
    RTEIVAMONTO NUMERIC(18,2),
    RTEICAPORC NUMERIC(9,2),
    RTEICAMONTO NUMERIC(18,2),
    EXTRA NUMERIC(18,2),
    TOTALFAC NUMERIC(18,2),
    TOTALPAGAR NUMERIC(18,2),
    PESOTOT NUMERIC(18,2),
    OBS BLOB SUB_TYPE 1 SEGMENT SIZE 80,
    ITEM INTEGER,
    ARTICULO VARCHAR(15),
    CODBAR VARCHAR(15),
    ARTIDES VARCHAR(60),
    CANT NUMERIC(18,4),
    LOTE VARCHAR(15),
    UNIDAD VARCHAR(8),
    FACTOR NUMERIC(18,4),
    REFITEM VARCHAR(60),
    BODITEM VARCHAR(2),
    PRUNIT NUMERIC(18,2),
    DTOITPORC NUMERIC(9,2),
    DTOITMONTO NUMERIC(18,2),
    PRNETO NUMERIC(18,2),
    PRNETOSINIVA NUMERIC(18,2),
    IVAPORC NUMERIC(9,2),
    IVAITMONTO NUMERIC(18,2),
    CONSUMO NUMERIC(18,2),
    SUBTOTIT NUMERIC(18,2),
    TOTAL NUMERIC(18,2),
    CODIGOCL VARCHAR(20),
    ZONACOD VARCHAR(2),
    ZONANOM VARCHAR(60),
    DV CHAR(1),
    DIRECCION VARCHAR(60),
    CIUDAD VARCHAR(40),
    TELEFONO VARCHAR(40),
    CONTACTO VARCHAR(60),
    FAX VARCHAR(25),
    CEL VARCHAR(25),
    GRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    SUBGRUPO VARCHAR(3),
    NOMSUBG VARCHAR(30),
    MARCA VARCHAR(3),
    NOMMARCA VARCHAR(30),
    PESO NUMERIC(9,4),
    ANCHO NUMERIC(18,4),
    ALTO NUMERIC(18,4),
    LARGO NUMERIC(18,4),
    SUMA1 NUMERIC(18,2),
    SUMA2 NUMERIC(18,2),
    SUMA3 NUMERIC(18,2),
    IVA1 NUMERIC(18,2),
    IVA2 NUMERIC(18,2),
    IVA3 NUMERIC(18,2),
    TOTCONSUMO NUMERIC(18,2),
    SUMAEX NUMERIC(18,2),
    SUMAGR NUMERIC(18,2),
    OBSITEM BLOB SUB_TYPE 1 SEGMENT SIZE 80,
    ALTERNATIVAS NUMERIC(18,4),
    PRINCIPALES NUMERIC(18,4))
AS
DECLARE VARIABLE IMPTOS CHAR(1);
DECLARE VARIABLE TARIFA INTEGER;
declare variable ORDENCOD CHAR(2);
declare variable SUCUR VARCHAR(10);
declare variable PUNTOS NUMERIC(18,4);
declare variable ICOINC CHAR(2);
declare variable FACTCANT NUMERIC(18,4);
declare variable ANULADO CHAR(1);
BEGIN
execute procedure lee_configuracion('FACTURACION', 'ARTICULOS', 'IMPOCONSUMO INCLUIDO EN EL PRECIO BASE DE VENTA ANTES DE IVA') returning_values (icoinc);
SELECT F.PREF_PRE, DEVT_NUMERO, DEVT_FECHA, F.BODE_COD, BODE_NOM, F.TERC_NIT, DEVT_NOMTERC, F.VEND_COD, VEND_NOMBRE, F.PTVT_ID, PTVT_NOM,
    DEVT_FACTURA, DEVT_COMIPORC, DEVT_COMIMONTO, DEVT_IVAINC,
    DEVT_DTOPOR, DEVT_DTOMONTO, DEVT_ADICIONAL, DEVT_IVAMONTO, DEVT_RTFTEPORC, DEVT_RTFTEMONTO, DEVT_RTIVAPORC, DEVT_RTIVAMONTO, DEVT_RTICAPORC, DEVT_RTICAMONTO, DEVT_EXTRA, DEVT_TOTAL,
    TERC_CONTACTO, TERC_FAX, TERC_DV, TERC_CEL, DEVT_OBS, DEVT_SUCURSAL, DEVT_REMISION, DEVT_ANULADO
    FROM DEVOLUCIONES_VENTAS F, BODEGA B, VENDEDORES V, PUNTO_VENTA P, TERCEROS T
    WHERE F.BODE_COD = B.BODE_COD AND F.VEND_COD = V.VEND_COD AND F.PTVT_ID = P.PTVT_ID AND F.TERC_NIT = T.TERC_NIT AND F.DEVT_ID = :ID
    into :PREF, :NUMERO, :FECHA, :CODBODEGA, :NOMBODEGA, :NIT, :NOMTERCERO, :VENDEDOR, :NOMVENDEDOR, :PUNTOVTA, :NOMPUNTOVTA,
    :FACTURA, :COMIPORC, :COMIMONTO, :IMPTOS,
    :DTOPORC, :DTOMONTO, :ADICIONAL, :IVAMONTO, :RTEFTEPORC, :RTEFTEMONTO, :RTEIVAPORC, :RTEIVAMONTO, :RTEICAPORC, :RTEICAMONTO, :EXTRA, :TOTALFAC,
    :CONTACTO, :FAX, :DV, :CEL, :OBS, :SUCUR, :REMISION, :ANULADO;
SUBTOTAL = TOTALFAC - EXTRA - IVAMONTO - ADICIONAL + DTOMONTO;
TOTALPAGAR = TOTALFAC - RTEFTEMONTO - RTEIVAMONTO - RTEICAMONTO;
if (ANULADO = 'N') then
    EXECUTE PROCEDURE acumula_puntos_cliente (33, :id, :nit, :fecha) returning_values (:PUNTOS);
SELECT CLIE_COD, C.ZONA_COD, ZONA_NOM
    FROM CLIENTES C, ZONAS Z
    WHERE TERC_NIT = :NIT AND C.ZONA_COD = Z.ZONA_COD
    INTO :CODIGOCL, :ZONACOD, :ZONANOM;
SELECT CLSU_DIR, CLSU_CIUDAD, CLSU_TEL FROM CLIENTE_SUCURSALES WHERE TERC_NIT = :NIT AND CLCU_COD = :SUCUR
    INTO :DIRECCION, :CIUDAD, :TELEFONO;
    
SUMAEX = 0;
SUMA1 = 0;
SUMA2 = 0;
SUMA3 = 0;
IVA1 = 0;
IVA2 = 0;
IVA3 = 0;
TOTCONSUMO = 0;
ITEM = 0;
EXECUTE PROCEDURE lee_configuracion ('FACTURACION','DOCUMENTOS','ORDENAR ITEMS POR CODIGO DE ARTICULO') returning_values (:ORDENCOD);
if (ORDENCOD = 'SI') then
    BEGIN
    FOR SELECT D.ARTI_COD, DVDE_CODBAR, SUBSTR(DVDE_DESC,1,60), DVDE_CANT, DVDE_UNIDAD, BODE_COD, DVDE_LOTE, DVDE_PRUNIT, DVDE_DTOPORC, DVDE_DTOMONTO, DVDE_IVAPORC, DVDE_IVAMONTO, DVDE_CONSUMO, DVDE_TOTAL, DVDE_REFERENCIA,
        GRUP_COD, SUBG_COD, MARC_COD, ARTI_PESO, ARTI_ANCHO, ARTI_ALTO, ARTI_LARGO, TAIV_COD, DVDE_OBS, DVDE_FACTOR
        FROM DEVOLUCIONES_VENTAS_DETALLE D, ARTICULO A
        WHERE D.ARTI_COD = A.ARTI_COD AND D.DEVT_ID = :ID
        ORDER BY DVDE_CODBAR
        INTO :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :BODITEM, :LOTE, :PRUNIT, :DTOITPORC, :DTOITMONTO, :IVAPORC, :IVAITMONTO, :CONSUMO, :TOTAL, :REFITEM,
        :GRUPO, :SUBGRUPO, :MARCA, :PESO, :ANCHO, :ALTO, :LARGO, :TARIFA, :obsitem, :FACTOR
        DO
        BEGIN
        if (ARTICULO = CODBAR) then
            SELECT FIRST 1 COBA_COD FROM barras_articulo WHERE ARTI_COD = :articulo INTO :CODBAR;
        ITEM = ITEM + 1;
        if (ICOINC = 'SI') then
            SUBTOTIT = TOTAL - IVAITMONTO;
        else
            SUBTOTIT = TOTAL - IVAITMONTO - CONSUMO;
        PRNETO = PRUNIT - DTOITMONTO;
        if (PESO IS NULL) then
            PESO = 0;
        PESO = PESO / 1000 * CANT * FACTOR;
        PESOTOT = PESOTOT + PESO;
        if (IMPTOS = 'S') then
            if (cant <> 0) then
                prnetosiniva = PRUNIT - DTOITMONTO - ((IVAITMONTO+CONSUMO) / CANT);
            else
                prnetosiniva = PRUNIT - DTOITMONTO;
        ELSE
            prnetosiniva = PRUNIT - DTOITMONTO;
        TOTCONSUMO = TOTCONSUMO + CONSUMO;
        if ((REFITEM <> '.t') or (REFITEM IS NULL)) then
            BEGIN
            /* NO SUME LOS ENSAMBLES */
            if (IVAPORC = 0) then
                SUMAEX = SUMAEX + TOTAL;
            if (TARIFA = 1) then
                BEGIN
                SUMA1 = SUMA1 + TOTAL - IVAITMONTO;
                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;
            END
        if (substr(ARTICULO,1,2) = '.t') then
            BEGIN
            REFITEM = '';
            TOTAL = 0;
            END
        factcant = NULL;
        SELECT FIRST 1 UNAR_FACCAN FROM unidad_articulo WHERE ARTI_COD = :articulo INTO :factcant;
        if (factcant IS NULL) then
            factcant = 1;
        if ((factcant = 1) or (factcant = 0)) then
            BEGIN
            ALTERNATIVAS = 0;
            PRINCIPALES = (CANT * FACTOR);
            END
        ELSE
            BEGIN
            ALTERNATIVAS = FLOOR(CANT * factor / factcant);
            PRINCIPALES = (CANT * FACTOR) - (alternativas * factcant);
            END
        SUSPEND;
        END
    END
ELSE
    BEGIN
    FOR SELECT D.ARTI_COD, DVDE_CODBAR, SUBSTR(DVDE_DESC,1,60), DVDE_CANT, DVDE_UNIDAD, BODE_COD, DVDE_LOTE, DVDE_PRUNIT, DVDE_DTOPORC, DVDE_DTOMONTO, DVDE_IVAPORC, DVDE_IVAMONTO, DVDE_CONSUMO, DVDE_TOTAL, DVDE_REFERENCIA,
        GRUP_COD, SUBG_COD, MARC_COD, ARTI_PESO, ARTI_ANCHO, ARTI_ALTO, ARTI_LARGO, TAIV_COD, DVDE_OBS, DVDE_FACTOR
        FROM DEVOLUCIONES_VENTAS_DETALLE D, ARTICULO A
        WHERE D.ARTI_COD = A.ARTI_COD AND D.DEVT_ID = :ID
        ORDER BY DVDE_ITEM
        INTO :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :BODITEM, :LOTE, :PRUNIT, :DTOITPORC, :DTOITMONTO, :IVAPORC, :IVAITMONTO, :CONSUMO, :TOTAL, :REFITEM,
        :GRUPO, :SUBGRUPO, :MARCA, :PESO, :ANCHO, :ALTO, :LARGO, :TARIFA, :obsitem, :FACTOR
        DO
        BEGIN
        if (ARTICULO = CODBAR) then
            SELECT FIRST 1 COBA_COD FROM barras_articulo WHERE ARTI_COD = :articulo INTO :CODBAR;
        SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :GRUPO INTO NOMGRUPO;
        SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :MARCA INTO NOMMARCA;
        SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :SUBGRUPO AND GRUP_COD = :GRUPO INTO :NOMSUBG;
        ITEM = ITEM + 1;
        if (ICOINC = 'SI') then
            SUBTOTIT = TOTAL - IVAITMONTO;
        else
            SUBTOTIT = TOTAL - IVAITMONTO - CONSUMO;
        PRNETO = PRUNIT - DTOITMONTO;
        if (PESO IS NULL) then
            PESO = 0;
        PESO = PESO / 1000 * CANT * FACTOR;
        PESOTOT = PESOTOT + PESO;
        if (IMPTOS = 'S') then
            if (cant <> 0) then
                prnetosiniva = PRUNIT - DTOITMONTO - ((IVAITMONTO+CONSUMO) / CANT);
            else
                prnetosiniva = PRUNIT - DTOITMONTO;
        ELSE
            prnetosiniva = PRUNIT - DTOITMONTO;
        TOTCONSUMO = TOTCONSUMO + CONSUMO;
        if ((REFITEM <> '.t') or (REFITEM IS NULL)) then
            BEGIN
            /* NO SUME LOS ENSAMBLES */
            if (IVAPORC = 0) then
                SUMAEX = SUMAEX + TOTAL;
            if (TARIFA = 1) then
                BEGIN
                SUMA1 = SUMA1 + TOTAL - IVAITMONTO;
                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;
            END
        if (substr(ARTICULO,1,2) = '.t') then
            BEGIN
            REFITEM = '';
            TOTAL = 0;
            END
        factcant = NULL;
        SELECT FIRST 1 UNAR_FACCAN FROM unidad_articulo WHERE ARTI_COD = :articulo INTO :factcant;
        if (factcant IS NULL) then
            factcant = 1;
        if ((factcant = 1) or (factcant = 0)) then
            BEGIN
            ALTERNATIVAS = 0;
            PRINCIPALES = (CANT * FACTOR);
            END
        ELSE
            BEGIN
            ALTERNATIVAS = FLOOR(CANT * factor / factcant);
            PRINCIPALES = (CANT * FACTOR) - (alternativas * factcant);
            END
        SUSPEND;
        END
    END
END

^

SET TERM ; ^

SET TERM ^ ;

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

/* ACUMULE LOS PUNTOS, SE HACE ACA POR SER POSTERIOR AL DETALLE */
if (ANULADO = 'N') then
    EXECUTE PROCEDURE acumula_puntos_cliente (31, :id, :nit, :fecha) returning_values (:PUNTOS);
EXECUTE PROCEDURE consulta_puntos_cliente (:id, :nit, :fecha) returning_values (:puntos, :puntosacum, :puntosvenc, :fecptos);
if (DTOIT1M IS NULL) then
    DTOIT1M = 0;
if (DTOIT2M IS NULL) then
    DTOIT2M = 0;
if (DTOIT3M IS NULL) then
    DTOIT3M = 0;
SELECT CLIE_COD, C.ZONA_COD, ZONA_NOM
    FROM CLIENTES C, ZONAS Z
    WHERE TERC_NIT = :NIT AND C.ZONA_COD = Z.ZONA_COD
    INTO :CODIGOCL, :ZONACOD, :ZONANOM;
SELECT CLSU_DIR, CLSU_CIUDAD, CLSU_TEL FROM CLIENTE_SUCURSALES WHERE TERC_NIT = :NIT AND CLCU_COD = :SUCUR
    INTO :DIRECCION, :CIUDAD, :TELEFONO;
DIASVENCE = VENCE - FECHA;
if (DIASVENCE > 0) then
    CONTCRED = 'CREDITO ' || CAST(DIASVENCE AS VARCHAR(3)) || ' DIAS';
ELSE
    CONTCRED = 'CONTADO';
SUBTOTAL = TOTALFAC - EXTRA - IVAMONTO - ADICIONAL + DTOMONTO;
if (DTOITE3 = 'SI') then
    BEGIN
    SELECT SUM(FADE_DTOMONTO) FROM FACTURAS_DETALLE WHERE FACT_ID = :id INTO :sumdtoit;
    SUBTOTAL = SUBTOTAL + sumdtoit + dtoit1m + dtoit2m + dtoit3m;
    END
if (INGTER <> '') then
    BEGIN
    SELECT SUM(FADE_TOTAL) FROM FACTURAS_DETALLE D, ARTICULO A WHERE A.arti_cod = D.arti_cod AND FACT_ID = :id AND GRUP_COD = :ingter
        INTO :ingterceros;
    INGPROPIOS = SUBTOTAL - INGTERCEROS;
    END
EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'FECHA AUTORETENEDOR NO DESCONTAR RETENCIONES DEL SALDO PERO SI CONTABILIZARLAS') returning_values (AUTORET);
if (AUTORET <> '') then
    FAUTORET = CAST(AUTORET AS DATE);
else
    FAUTORET = '9999/12/31';
if (FECHA > fautoret) then
    TOTALPAGAR = TOTALFAC - RTEIVAMONTO - RTEICAMONTO - ANTICIPO;
ELSE
    TOTALPAGAR = TOTALFAC - RTEFTEMONTO - RTEIVAMONTO - RTEICAMONTO - ANTICIPO;
TOTALNETO = TOTALFAC - ANTICIPO;
if (RECIBIDO <> 0) then
    CAMBIO = RECIBIDO - totalpagar;
ELSE
    CAMBIO = 0;
SUMAEX = 0;
SUMA1 = 0;
SUMA2 = 0;
SUMA3 = 0;
IVA1 = 0;
IVA2 = 0;
IVA3 = 0;
TOTCONSUMO = 0;
MONTOPAGO1 = 0;
PESOTOT = 0;
SELECT MAX(AUDI_HORA) FROM AUDITORIA WHERE TIDO_COD = 31 AND AUDI_IDDOC = :ID AND AUDI_OPER = 'I' INTO :HORA;
/* AHORA LAS FORMAS DE PAGO, BUSQUE EL ABONO DE HOY A LA FACTURA */
ITEMFP = 1;
MONTOPAGO1 = 0;
MONTOPAGO2 = 0;
MONTOPAGO3 = 0;
FOR SELECT FOPA_NOM, RCPA_MONTO FROM RECIBOS_CAJA_PAGO P, FORMAS_PAGO F, RECIBOS_CAJA R, RECIBOS_CAJA_DETALLE D
    WHERE R.RECA_ID = P.RECA_ID AND R.RECA_ID = D.RECA_ID AND P.FOPA_ID = F.FOPA_ID AND RECA_FECHA = :FECHA AND RCDE_TIPODOC = 31 AND RCDE_IDDOC = :ID
    INTO :formap, :MONTOP
    DO
    BEGIN
    if (ITEMFP = 1) then
        BEGIN
        FORMAPAGO1 = FORMAP;
        MONTOPAGO1 = MONTOP;
        END
    if (ITEMFP = 2) then
        BEGIN
        FORMAPAGO2 = FORMAP;
        MONTOPAGO2 = MONTOP;
        END
    if (ITEMFP = 3) then
        BEGIN
        FORMAPAGO3 = FORMAP;
        MONTOPAGO3 = MONTOP;
        END
    ITEMFP = ITEMFP + 1;
    END
EXECUTE PROCEDURE lee_configuracion ('FACTURACION','DOCUMENTOS','ORDENAR ITEMS POR CODIGO DE ARTICULO') returning_values (:ORDENCOD);
EXECUTE PROCEDURE lee_configuracion ('FACTURACION','POS', 'IMPRIMIR DEVOLUCIONES DE ARTICULOS NEGATIVOS') returning_values (:imprdev);
totcajas = 0;
totbase = 0;
if (ORDENCOD = 'SI') then
    BEGIN
    FOR SELECT FADE_ITEM, D.ARTI_COD, FADE_CODBAR, SUBSTR(FADE_DESC,1,60), ARTI_DESCORTA, FADE_CANT, FADE_UNIDAD, FADE_FACTOR, BODE_COD, FADE_LOTE, LIPR_COD, FADE_PRUNIT, FADE_DTOPORC, FADE_DTOMONTO, FADE_IVAPORC, FADE_IVAMONTO, FADE_CONSUMO, FADE_TOTAL, FADE_REFERENCIA,
        GRUP_COD, SUBG_COD, MARC_COD, ARTI_PESO, ARTI_ANCHO, ARTI_ALTO, ARTI_LARGO, TAIV_COD, FADE_DEVUELTO, FADE_OBS, FADE_DTO1, FADE_DTO2, FADE_DTO3, FADE_DTOM1, FADE_DTOM2, FADE_DTOM3, FADE_CAJAS, FADE_BASE, FADE_PORCBASE
        FROM FACTURAS_DETALLE D, ARTICULO A
        WHERE D.ARTI_COD = A.ARTI_COD AND D.FACT_ID = :ID
        ORDER BY D.ARTI_COD
        INTO :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :DESCORTA, :CANT, :UNIDAD, :FACTOR, :BODITEM, :LOTE, :LISTAPR, :PRUNIT, :DTOITPORC, :DTOITMONTO, :IVAPORC, :IVAITMONTO, :CONSUMO, :TOTAL, :refitem,
        :GRUPO, :SUBGRUPO, :MARCA, :PESO, :ANCHO, :ALTO, :LARGO, :TARIFA, :devuelto, :obsitem, :dtoit1, :dtoit2, :dtoit3, :dtoitm1, :dtoitm2, :dtoitm3, :cajas, :base, :porcbase
        DO
          BEGIN
          if (ARTICULO = CODBAR) then
            SELECT FIRST 1 COBA_COD FROM barras_articulo WHERE ARTI_COD = :articulo INTO :CODBAR;
          if (IMPRDEV <> 'SI') then
            BEGIN
            if ((CANT >= 0) AND (DEVUELTO = 0)) then
                IMPR = 'S';
            ELSE
                IMPR = 'N'; /* ES DEVOLUCION */
            END
          ELSE
            IMPR = 'S';
          if (IMPR = 'S') then
            BEGIN
            prneto = PRUNIT - DTOITMONTO - dtoitm1 - dtoitm2 - dtoitm3;
            if (IMPTOS = 'S') then
                if (cant <> 0) then
                    prnetosiniva = PRUNIT - DTOITMONTO - ((IVAITMONTO+CONSUMO) / CANT) - dtoitm1 - dtoitm2 - dtoitm3;
                else
                    prnetosiniva = PRUNIT - DTOITMONTO - dtoitm1 - dtoitm2 - dtoitm3;
            ELSE
                prnetosiniva = PRUNIT - DTOITMONTO - dtoit1m - dtoit2m - dtoit3m;
            if (ICOINC = 'SI') then
                SUBTOTIT = TOTAL - IVAITMONTO;
            else
                SUBTOTIT = TOTAL - IVAITMONTO - CONSUMO;
            TOTCONSUMO = TOTCONSUMO + CONSUMO;
            TOTBASE = TOTBASE + BASE;
            SELECT LOTE_VENCE FROM LOTES WHERE LOTE_NRO = :lote AND ARTI_COD = :ARTICULO AND BODE_COD = :boditem INTO :vlote;
            if ((REFITEM <> '.t') or (REFITEM IS NULL)) then
                BEGIN
                /* NO SUME LOS ENSAMBLES */
                if (IVAPORC = 0) then
                    SUMAEX = SUMAEX + TOTAL;
                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;
                END
            if (ANCHO IS NULL) then
                ANCHO = 0;
            if (ALTO IS NULL) then
                ALTO = 0;
            if (LARGO IS NULL) then
                LARGO = 0;
            if (PESO IS NULL) then
                PESO = 0;
            PESO = (PESO / 1000) * CANT * FACTOR;
            PESOTOT = PESOTOT + PESO;
            totcajas = totcajas + cajas;
            if (substr(ARTICULO,1,2) = '.t') then
                BEGIN
                REFITEM = '';
                TOTAL = 0;
                SUBTOTIT = 0;
                END
            SELECT STAND_COD FROM STANDS WHERE ARTI_COD = :ARTICULO AND STAND_BODEGA = :boditem INTO :stand;
            factcant = NULL;
            SELECT FIRST 1 UNAR_FACCAN FROM unidad_articulo WHERE ARTI_COD = :articulo INTO :factcant;
            if (factcant IS NULL) then
                BEGIN
                ALTERNATIVAS = 0;
                PRINCIPALES = (CANT * FACTOR);
                END
            ELSE
                BEGIN
                ALTERNATIVAS = FLOOR(CANT * factor / factcant);
                PRINCIPALES = (CANT * FACTOR) - (alternativas * factcant);
                END
            SUSPEND;
            END
          END
    END
ELSE
    BEGIN
    FOR SELECT FADE_ITEM, D.ARTI_COD, FADE_CODBAR, SUBSTR(FADE_DESC,1,60), ARTI_DESCORTA, FADE_CANT, FADE_UNIDAD, FADE_FACTOR, BODE_COD, FADE_LOTE, LIPR_COD, FADE_PRUNIT, FADE_DTOPORC, FADE_DTOMONTO, FADE_IVAPORC, FADE_IVAMONTO, FADE_CONSUMO, FADE_TOTAL, FADE_REFERENCIA,
        GRUP_COD, SUBG_COD, MARC_COD, ARTI_PESO, ARTI_ANCHO, ARTI_ALTO, ARTI_LARGO, TAIV_COD, FADE_DEVUELTO, FADE_OBS, FADE_DTO1, FADE_DTO2, FADE_DTO3, FADE_DTOM1, FADE_DTOM2, FADE_DTOM3, FADE_CAJAS, FADE_BASE, FADE_PORCBASE
        FROM FACTURAS_DETALLE D, ARTICULO A
        WHERE D.ARTI_COD = A.ARTI_COD AND D.FACT_ID = :ID
        ORDER BY FADE_ITEM
        INTO :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :DESCORTA, :CANT, :UNIDAD, :FACTOR, :BODITEM, :LOTE, :LISTAPR, :PRUNIT, :DTOITPORC, :DTOITMONTO, :IVAPORC, :IVAITMONTO, :CONSUMO, :TOTAL, :refitem,
        :GRUPO, :SUBGRUPO, :MARCA, :PESO, :ANCHO, :ALTO, :LARGO, :TARIFA, :devuelto, :obsitem, :dtoit1, :dtoit2, :dtoit3, :dtoitm1, :dtoitm2, :dtoitm3, :cajas, :base, :porcbase
        DO
          BEGIN
          if (IMPRDEV <> 'SI') then
            BEGIN
            if ((CANT >= 0) AND (DEVUELTO = 0)) then
                IMPR = 'S';
            ELSE
                IMPR = 'N'; /* ES DEVOLUCION */
            END
          ELSE
            IMPR = 'S';
          if (IMPR = 'S') then
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :GRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :MARCA INTO NOMMARCA;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :SUBGRUPO AND GRUP_COD = :GRUPO INTO :NOMSUBG;
            prneto = PRUNIT - DTOITMONTO - dtoitm1 - dtoitm2 - dtoitm3;
            if (IMPTOS = 'S') then
                if (cant <> 0) then
                    prnetosiniva = PRUNIT - DTOITMONTO - ((IVAITMONTO+CONSUMO) / CANT) - dtoit1m - dtoit2m - dtoit3m;
                else
                    prnetosiniva = PRUNIT - DTOITMONTO - dtoitm1 - dtoitm2 - dtoitm3;
            ELSE
                prnetosiniva = PRUNIT - DTOITMONTO - dtoitm1 - dtoitm2 - dtoitm3;
            if (ICOINC = 'SI') then
                SUBTOTIT = TOTAL - IVAITMONTO;
            else
                SUBTOTIT = TOTAL - IVAITMONTO - CONSUMO;
            TOTCONSUMO = TOTCONSUMO + CONSUMO;
            TOTBASE = TOTBASE + BASE;
            SELECT LOTE_VENCE FROM LOTES WHERE LOTE_NRO = :lote AND ARTI_COD = :ARTICULO AND BODE_COD = :boditem INTO :vlote;
            if ((REFITEM <> '.t') or (REFITEM IS NULL)) then
                BEGIN
                /* NO SUME LOS ENSAMBLES */
                if (IVAPORC = 0) then
                    SUMAEX = SUMAEX + TOTAL;
                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;
                END
            if (ANCHO IS NULL) then
                ANCHO = 0;
            if (ALTO IS NULL) then
                ALTO = 0;
            if (LARGO IS NULL) then
                LARGO = 0;
            if (PESO IS NULL) then
                PESO = 0;
            PESO = (PESO / 1000)* CANT * FACTOR;
            PESOTOT = PESOTOT + PESO;
            totcajas = totcajas + cajas;
            if (substr(ARTICULO,1,2) = '.t') then
                BEGIN
                REFITEM = '';
                TOTAL = 0;
                SUBTOTIT = 0;
                END
            SELECT STAND_COD FROM STANDS WHERE ARTI_COD = :ARTICULO AND STAND_BODEGA = :boditem INTO :stand;
            factcant = NULL;
            SELECT FIRST 1 UNAR_FACCAN FROM unidad_articulo WHERE ARTI_COD = :articulo INTO :factcant;
            if (factcant IS NULL) then
                BEGIN
                ALTERNATIVAS = 0;
                PRINCIPALES = (CANT * FACTOR);
                END
            ELSE
                BEGIN
                ALTERNATIVAS = FLOOR(CANT * factor / factcant);
                PRINCIPALES = (CANT * FACTOR) - (alternativas * factcant);
                END
            SUSPEND;
            END
          END
    END
END

^

SET TERM ; ^



/* 20090812c */
/* NO SALIAN LAS DEVOLUCIONES CONSOLIDADAS */
SET TERM ^ ;

CREATE OR ALTER procedure REP_VENTAS_CLIENTE (
    TIPO integer,
    NITDESDE varchar(20),
    NITHASTA varchar(20),
    FECINI date,
    FECFIN date,
    DETALLE char(1),
    ORDEN char(1),
    CEROS char(1),
    SUBEMPRESA integer)
returns (
    NIT varchar(20),
    NOMBRE varchar(60),
    DV char(1),
    TELEFONO varchar(40),
    CIUDAD varchar(40),
    CODZONA varchar(2),
    NOMZONA varchar(30),
    NOMTIPO varchar(50),
    PREFIJO varchar(4),
    NUMERO varchar(6),
    SUCURSAL varchar(10),
    ID integer,
    FECDOC date,
    CANTIDAD integer,
    SUBTOTAL numeric(18,2),
    DTO numeric(18,2),
    ADICIONAL numeric(18,2),
    IVA numeric(18,2),
    EXTRA numeric(18,2),
    TOTAL numeric(18,2),
    RTFTE numeric(18,2),
    RTIVA numeric(18,2),
    RTICA numeric(18,2),
    NETO numeric(18,2),
    APELLIDO1 varchar(60),
    APELLIDO2 varchar(60),
    NOMBRE1 varchar(60),
    NOMBRE2 varchar(60),
    CODCIU varchar(5))
AS
DECLARE VARIABLE NITINI VARCHAR(15);
DECLARE VARIABLE NITFIN VARCHAR(15);
DECLARE VARIABLE NOMINI VARCHAR(15);
DECLARE VARIABLE NOMFIN VARCHAR(15);
BEGIN
if (ORDEN = 'C') then
    BEGIN
    NITINI = NITDESDE;
    NITFIN = NITHASTA;
    NOMINI = '';
    NOMFIN = 'zz';
    END
ELSE
    BEGIN
    NITINI = NITDESDE;
    NITFIN = NITHASTA;
    NOMINI = '';
    NOMFIN = 'zz';
    END

SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = :TIPO INTO :NOMTIPO;
if (DETALLE = 'N') then
    BEGIN
    if (BIN_AND(TIPO, 1) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 31 INTO :NOMTIPO;
        FOR SELECT MAX(T.TERC_NIT), MAX(TERC_NOM), MAX(TERC_TEL), MAX(TERC_CIU), MAX(ZONA_COD), MAX(TERC_DV), MAX(TERC_APELLIDO1), MAX(TERC_APELLIDO2), MAX(TERC_NOMBRE1), MAX(TERC_NOMBRE2), MAX(T.CIUD_COD),
            COUNT(*), SUM(FACT_DTOMONTO), SUM(FACT_ADICIONAL), SUM(FACT_IVAMONTO), SUM(FACT_EXTRA), SUM(FACT_RTFTEMONTO), SUM(FACT_RTIVAMONTO), SUM(FACT_RTICAMONTO), SUM(FACT_TOTAL)
            FROM FACTURAS F, PREFIJOS P, terceros T, CLIENTES C
            where C.TERC_NIT = T.TERC_NIT AND T.TERC_CLIE = 'S' AND T.TERC_NIT >= :NITINI AND T.TERC_NIT <= :NITFIN AND TERC_NOM >= :NOMINI AND TERC_NOM <= :NOMFIN
             AND F.TERC_NIT = T.terc_nit AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND FACT_ANULADO = 'N'
             AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY F.terc_nit
            INTO :NIT, :NOMBRE, :TELEFONO, :CIUDAD, :CODZONA, :DV, :APELLIDO1, :APELLIDO2, :NOMBRE1, :NOMBRE2, :CODCIU,
            :CANTIDAD, :DTO, :ADICIONAL, :IVA, :EXTRA, :RTFTE, :RTIVA, :RTICA, :TOTAL
            DO
            BEGIN
            SELECT ZONA_NOM FROM ZONAS WHERE ZONA_COD = :codzona INTO :NOMZONA;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (DTO IS NULL) then
                DTO = 0;
            if (ADICIONAL IS NULL) then
                ADICIONAL = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (EXTRA IS NULL) then
                EXTRA = 0;
            if (RTFTE IS NULL) then
                RTFTE = 0;
            if (RTIVA IS NULL) then
                RTIVA = 0;
            if (RTICA IS NULL) then
                RTICA = 0;
            SUBTOTAL = TOTAL - EXTRA - IVA - ADICIONAL + DTO;
            NETO = TOTAL - RTFTE - RTIVA - RTICA;
            if (CEROS = 'S') then
              SUSPEND;
            ELSE
              if (CANTIDAD > 0) then
                SUSPEND;
            END
        END
    if (BIN_AND(TIPO, 2) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 32 INTO :NOMTIPO;
        FOR SELECT MAX(T.TERC_NIT), MAX(TERC_NOM), MAX(TERC_TEL), MAX(TERC_CIU), MAX(ZONA_COD), MAX(TERC_DV), MAX(TERC_APELLIDO1), MAX(TERC_APELLIDO2), MAX(TERC_NOMBRE1), MAX(TERC_NOMBRE2), MAX(T.CIUD_COD),
            COUNT(*), 0, 0, SUM(REVT_IVAMONTO), 0, 0, 0, 0, SUM(REVT_TOTAL)
            FROM REMISIONES_VENTA R, PREFIJOS P, terceros T, CLIENTES C
            where C.TERC_NIT = T.TERC_NIT AND T.TERC_CLIE = 'S' AND T.TERC_NIT >= :NITINI AND T.TERC_NIT <= :NITFIN AND TERC_NOM >= :NOMINI AND TERC_NOM <= :NOMFIN
             AND R.TERC_NIT = T.terc_nit AND REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN AND REVT_ANULADO = 'N'
             AND P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = 32 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY R.terc_nit
            INTO :NIT, :NOMBRE, :TELEFONO, :CIUDAD, :CODZONA, :DV, :APELLIDO1, :APELLIDO2, :NOMBRE1, :NOMBRE2, :CODCIU,
            :CANTIDAD, :DTO, :ADICIONAL, :IVA, :EXTRA, :RTFTE, :RTIVA, :RTICA, :TOTAL
            DO
            BEGIN
            SELECT ZONA_NOM FROM ZONAS WHERE ZONA_COD = :codzona INTO :NOMZONA;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (DTO IS NULL) then
                DTO = 0;
            if (ADICIONAL IS NULL) then
                ADICIONAL = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (EXTRA IS NULL) then
                EXTRA = 0;
            if (RTFTE IS NULL) then
                RTFTE = 0;
            if (RTIVA IS NULL) then
                RTIVA = 0;
            if (RTICA IS NULL) then
                RTICA = 0;
            SUBTOTAL = TOTAL - EXTRA - IVA - ADICIONAL + DTO;
            NETO = TOTAL - RTFTE - RTIVA - RTICA;
            if (CEROS = 'S') then
              SUSPEND;
            ELSE
              if (CANTIDAD > 0) then
                SUSPEND;
            END
        END
    if (BIN_AND(TIPO, 4) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 33 INTO :NOMTIPO;
        FOR SELECT MAX(T.TERC_NIT), MAX(TERC_NOM), MAX(TERC_TEL), MAX(TERC_CIU), MAX(ZONA_COD), MAX(TERC_DV), MAX(TERC_APELLIDO1), MAX(TERC_APELLIDO2), MAX(TERC_NOMBRE1), MAX(TERC_NOMBRE2), MAX(T.CIUD_COD),
            COUNT(*), SUM(DEVT_DTOMONTO), SUM(DEVT_ADICIONAL), SUM(DEVT_IVAMONTO), SUM(DEVT_EXTRA), SUM(DEVT_RTFTEMONTO), SUM(DEVT_RTIVAMONTO), SUM(DEVT_RTICAMONTO), SUM(DEVT_TOTAL)
            FROM DEVOLUCIONES_VENTAS V, PREFIJOS P, terceros T, CLIENTES C
            where C.TERC_NIT = T.TERC_NIT AND T.TERC_CLIE = 'S' AND T.TERC_NIT >= :NITINI AND T.TERC_NIT <= :NITFIN AND TERC_NOM >= :NOMINI AND TERC_NOM <= :NOMFIN
             AND V.TERC_NIT = T.terc_nit AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND DEVT_ANULADO = 'N'
             AND P.PREF_PRE = V.PREF_PRE AND P.TIDO_COD = 33 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) AND ((DEVT_REMID = 0) or (DEVT_REMID IS NULL))
            GROUP BY V.terc_nit
            INTO :NIT, :NOMBRE, :TELEFONO, :CIUDAD, :CODZONA, :DV, :APELLIDO1, :APELLIDO2, :NOMBRE1, :NOMBRE2, :CODCIU,
             :CANTIDAD, :DTO, :ADICIONAL, :IVA, :EXTRA, :RTFTE, :RTIVA, :RTICA, :TOTAL
            DO
            BEGIN
            SELECT ZONA_NOM FROM ZONAS WHERE ZONA_COD = :codzona INTO :NOMZONA;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (DTO IS NULL) then
                DTO = 0;
            if (ADICIONAL IS NULL) then
                ADICIONAL = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (EXTRA IS NULL) then
                EXTRA = 0;
            if (RTFTE IS NULL) then
                RTFTE = 0;
            if (RTIVA IS NULL) then
                RTIVA = 0;
            if (RTICA IS NULL) then
                RTICA = 0;
            SUBTOTAL = TOTAL - EXTRA - IVA - ADICIONAL + DTO;
            NETO = TOTAL - RTFTE - RTIVA - RTICA;
            CANTIDAD = CANTIDAD * -1;
            SUBTOTAL = SUBTOTAL * -1;
            TOTAL = TOTAL * -1;
            IVA = IVA * -1;
            EXTRA = EXTRA * -1;
            DTO = DTO * -1;
            ADICIONAL = ADICIONAL * -1;
            RTFTE = RTFTE * -1;
            RTIVA = RTIVA * -1;
            RTICA = RTICA * -1;
            if (CEROS = 'S') then
              SUSPEND;
            ELSE
              if (CANTIDAD <> 0) then
                SUSPEND;
            END
        END
    if (BIN_AND(TIPO, 8) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 34 INTO :NOMTIPO;
        FOR SELECT MAX(T.TERC_NIT), MAX(TERC_NOM), MAX(TERC_TEL), MAX(TERC_CIU), MAX(ZONA_COD), MAX(TERC_DV), MAX(TERC_APELLIDO1), MAX(TERC_APELLIDO2), MAX(TERC_NOMBRE1), MAX(TERC_NOMBRE2), MAX(T.CIUD_COD),
            COUNT(*), SUM(PEDI_DTOMONTO), SUM(PEDI_ADICIONAL), SUM(PEDI_IVAMONTO), SUM(PEDI_EXTRA), 0, 0, 0, SUM(PEDI_TOTAL)
            FROM PEDIDOS P, PREFIJOS PR, terceros T, CLIENTES C
            where C.TERC_NIT = T.TERC_NIT AND T.TERC_CLIE = 'S' AND T.TERC_NIT >= :NITINI AND T.TERC_NIT <= :NITFIN AND TERC_NOM >= :NOMINI AND TERC_NOM <= :NOMFIN
             AND P.TERC_NIT = T.terc_nit AND PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND PEDI_ANULADO = 'N'
             AND PR.PREF_PRE = P.PREF_PRE AND P.TIDO_COD = 34 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY P.terc_nit
            INTO :NIT, :NOMBRE, :TELEFONO, :CIUDAD, :CODZONA, :DV, :APELLIDO1, :APELLIDO2, :NOMBRE1, :NOMBRE2, :CODCIU,
            :CANTIDAD, :DTO, :ADICIONAL, :IVA, :EXTRA, :RTFTE, :RTIVA, :RTICA, :TOTAL
            DO
            BEGIN
            SELECT ZONA_NOM FROM ZONAS WHERE ZONA_COD = :codzona INTO :NOMZONA;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (DTO IS NULL) then
                DTO = 0;
            if (ADICIONAL IS NULL) then
                ADICIONAL = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (EXTRA IS NULL) then
                EXTRA = 0;
            if (RTFTE IS NULL) then
                RTFTE = 0;
            if (RTIVA IS NULL) then
                RTIVA = 0;
            if (RTICA IS NULL) then
                RTICA = 0;
            SUBTOTAL = TOTAL - EXTRA - IVA - ADICIONAL + DTO;
            NETO = TOTAL - RTFTE - RTIVA - RTICA;
            if (CEROS = 'S') then
              SUSPEND;
            ELSE
              if (CANTIDAD > 0) then
                SUSPEND;
            END
        END
    if (BIN_AND(TIPO, 16) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 35 INTO :NOMTIPO;
        FOR SELECT MAX(T.TERC_NIT), MAX(TERC_NOM), MAX(TERC_TEL), MAX(TERC_CIU), MAX(ZONA_COD), MAX(TERC_DV), MAX(TERC_APELLIDO1), MAX(TERC_APELLIDO2), MAX(TERC_NOMBRE1), MAX(TERC_NOMBRE2), MAX(T.CIUD_COD),
            COUNT(*), SUM(COTI_DTOMONTO), SUM(COTI_ADICIONAL), SUM(COTI_IVAMONTO), SUM(COTI_EXTRA), 0, 0, 0, SUM(COTI_TOTAL)
            FROM COTIZACIONES CT, PREFIJOS P, terceros T, CLIENTES C
            where C.TERC_NIT = T.TERC_NIT AND T.TERC_CLIE = 'S' AND T.TERC_NIT >= :NITINI AND T.TERC_NIT <= :NITFIN AND TERC_NOM >= :NOMINI AND TERC_NOM <= :NOMFIN
             AND CT.TERC_NIT = T.terc_nit AND COTI_FECHA >= :FECINI AND COTI_FECHA <= :FECFIN AND COTI_ANULADO = 'N'
             AND P.PREF_PRE = CT.PREF_PRE AND P.TIDO_COD = 35 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY C.terc_nit
            INTO :NIT, :NOMBRE, :TELEFONO, :CIUDAD, :CODZONA, :DV, :APELLIDO1, :APELLIDO2, :NOMBRE1, :NOMBRE2, :CODCIU,
            :CANTIDAD, :DTO, :ADICIONAL, :IVA, :EXTRA, :RTFTE, :RTIVA, :RTICA, :TOTAL
            DO
            BEGIN
            SELECT ZONA_NOM FROM ZONAS WHERE ZONA_COD = :codzona INTO :NOMZONA;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (DTO IS NULL) then
                DTO = 0;
            if (ADICIONAL IS NULL) then
                ADICIONAL = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (EXTRA IS NULL) then
                EXTRA = 0;
            if (RTFTE IS NULL) then
                RTFTE = 0;
            if (RTIVA IS NULL) then
                RTIVA = 0;
            if (RTICA IS NULL) then
                RTICA = 0;
            SUBTOTAL = TOTAL - EXTRA - IVA - ADICIONAL + DTO;
            NETO = TOTAL - RTFTE - RTIVA - RTICA;
            if (CEROS = 'S') then
              SUSPEND;
            ELSE
              if (CANTIDAD > 0) then
                SUSPEND;
            END
        END
    END
ELSE
    BEGIN
    if (BIN_AND(TIPO, 1) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 31 INTO :NOMTIPO;
        FOR SELECT FACT_ID, F.PREF_PRE, FACT_NUMERO, FACT_FECHA, FACT_DTOMONTO, FACT_ADICIONAL, FACT_IVAMONTO, FACT_EXTRA, FACT_TOTAL, FACT_RTFTEMONTO, FACT_RTIVAMONTO, FACT_RTICAMONTO,
            T.TERC_NIT, TERC_NOM, ZONA_COD, TERC_TEL, TERC_CIU, TERC_DV, TERC_APELLIDO1, TERC_APELLIDO2, TERC_NOMBRE1, TERC_NOMBRE2, T.CIUD_COD, F.fact_sucursal
            FROM FACTURAS F, PREFIJOS P, terceros T, CLIENTES C
            where C.TERC_NIT = T.TERC_NIT AND T.TERC_CLIE = 'S' AND T.TERC_NIT >= :NITINI AND T.TERC_NIT <= :NITFIN AND TERC_NOM >= :NOMINI AND TERC_NOM <= :NOMFIN
             AND F.TERC_NIT = T.terc_nit AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND FACT_ANULADO = 'N'
             AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            ORDER BY FACT_FECHA, FACT_ID
            INTO :ID, :PREFIJO, :NUMERO, :FECDOC, :DTO, :ADICIONAL, :IVA, :EXTRA, :TOTAL, :RTFTE, :RTIVA, :RTICA, :nit, :nombre, :codzona, :telefono, :ciudad, :dv, :APELLIDO1, :APELLIDO2, :NOMBRE1, :NOMBRE2, :CODCIU, :sucursal
            DO
            BEGIN
            SELECT ZONA_NOM FROM ZONAS WHERE ZONA_COD = :codzona INTO :NOMZONA;
            SUBTOTAL = TOTAL - EXTRA - IVA - ADICIONAL + DTO;
            NETO = TOTAL - RTFTE - RTIVA - RTICA;
            SUSPEND;
            END
        END
    if (BIN_AND(TIPO, 2) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 32 INTO :NOMTIPO;
        FOR SELECT REVT_ID, R.PREF_PRE, REVT_NUMERO, REVT_FECHA, 0, 0, REVT_IVAMONTO, 0, REVT_TOTAL, 0, 0, 0,
        T.TERC_NIT, TERC_NOM, ZONA_COD, TERC_TEL, TERC_CIU, TERC_DV, TERC_APELLIDO1, TERC_APELLIDO2, TERC_NOMBRE1, TERC_NOMBRE2, T.CIUD_COD, R.revt_sucursal
            FROM REMISIONES_VENTA R, PREFIJOS P, terceros T, CLIENTES C
            where C.TERC_NIT = T.TERC_NIT AND T.TERC_CLIE = 'S' AND T.TERC_NIT >= :NITINI AND T.TERC_NIT <= :NITFIN AND TERC_NOM >= :NOMINI AND TERC_NOM <= :NOMFIN
             AND R.TERC_NIT = T.terc_nit AND REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN AND REVT_ANULADO = 'N'
             AND P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = 32 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            ORDER BY REVT_FECHA, REVT_ID
            INTO :ID, :PREFIJO, :NUMERO, :FECDOC, :DTO, :ADICIONAL, :IVA, :EXTRA, :TOTAL, :RTFTE, :RTIVA, :RTICA, :nit, :nombre, :codzona, :telefono, :ciudad, :DV, :APELLIDO1, :APELLIDO2, :NOMBRE1, :NOMBRE2, :CODCIU, :sucursal
            DO
            BEGIN
            SELECT ZONA_NOM FROM ZONAS WHERE ZONA_COD = :codzona INTO :NOMZONA;
            SUBTOTAL = TOTAL - EXTRA - IVA - ADICIONAL + DTO;
            NETO = TOTAL - RTFTE - RTIVA - RTICA;
            SUSPEND;
            END
        END
    if (BIN_AND(TIPO, 4) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 33 INTO :NOMTIPO;
        FOR SELECT DEVT_ID, V.PREF_PRE, DEVT_NUMERO, DEVT_FECHA, DEVT_DTOMONTO, DEVT_ADICIONAL, DEVT_IVAMONTO, DEVT_EXTRA, DEVT_TOTAL, DEVT_RTFTEMONTO, DEVT_RTIVAMONTO, DEVT_RTICAMONTO,
            T.TERC_NIT, TERC_NOM, ZONA_COD, TERC_TEL, TERC_CIU, TERC_DV, TERC_APELLIDO1, TERC_APELLIDO2, TERC_NOMBRE1, TERC_NOMBRE2, T.CIUD_COD, V.devt_sucursal
            FROM DEVOLUCIONES_VENTAS V, PREFIJOS P, terceros T, CLIENTES C
            where C.TERC_NIT = T.TERC_NIT AND T.TERC_CLIE = 'S' AND T.TERC_NIT >= :NITINI AND T.TERC_NIT <= :NITFIN AND TERC_NOM >= :NOMINI AND TERC_NOM <= :NOMFIN
             AND V.TERC_NIT = T.terc_nit AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND DEVT_ANULADO = 'N'
             AND P.PREF_PRE = V.PREF_PRE AND P.TIDO_COD = 33 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) AND ((DEVT_REMID = 0) or (DEVT_REMID IS NULL))
            ORDER BY DEVT_FECHA, DEVT_ID
            INTO :ID, :PREFIJO, :NUMERO, :FECDOC, :DTO, :ADICIONAL, :IVA, :EXTRA, :TOTAL, :RTFTE, :RTIVA, :RTICA, :nit, :nombre, :codzona, :telefono, :ciudad, :DV, :APELLIDO1, :APELLIDO2, :NOMBRE1, :NOMBRE2, :CODCIU, :sucursal
            DO
            BEGIN
            SELECT ZONA_NOM FROM ZONAS WHERE ZONA_COD = :codzona INTO :NOMZONA;
            SUBTOTAL = TOTAL - EXTRA - IVA - ADICIONAL + DTO;
            NETO = TOTAL - RTFTE - RTIVA - RTICA;
            CANTIDAD = CANTIDAD * -1;
            SUBTOTAL = SUBTOTAL * -1;
            TOTAL = TOTAL * -1;
            IVA = IVA * -1;
            EXTRA = EXTRA * -1;
            DTO = DTO * -1;
            ADICIONAL = ADICIONAL * -1;
            RTFTE = RTFTE * -1;
            RTIVA = RTIVA * -1;
            RTICA = RTICA * -1;
            SUSPEND;
            END
        END
    if (BIN_AND(TIPO, 8) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 34 INTO :NOMTIPO;
        FOR SELECT PEDI_ID, P.PREF_PRE, PEDI_NUMERO, PEDI_FECHA, PEDI_DTOMONTO, PEDI_ADICIONAL, PEDI_IVAMONTO, PEDI_EXTRA, PEDI_TOTAL, 0, 0, 0,
            T.TERC_NIT, TERC_NOM, ZONA_COD, TERC_TEL, TERC_CIU, TERC_DV, TERC_APELLIDO1, TERC_APELLIDO2, TERC_NOMBRE1, TERC_NOMBRE2, T.CIUD_COD, P.pedi_sucursal
            FROM PEDIDOS P, PREFIJOS PR, terceros T, CLIENTES C
            where C.TERC_NIT = T.TERC_NIT AND T.TERC_CLIE = 'S' AND T.TERC_NIT >= :NITINI AND T.TERC_NIT <= :NITFIN AND TERC_NOM >= :NOMINI AND TERC_NOM <= :NOMFIN
             AND P.TERC_NIT = T.terc_nit AND PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND PEDI_ANULADO = 'N'
             AND P.PREF_PRE = PR.PREF_PRE AND P.TIDO_COD = 34 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            ORDER BY PEDI_FECHA, PEDI_ID
            INTO :ID, :PREFIJO, :NUMERO, :FECDOC, :DTO, :ADICIONAL, :IVA, :EXTRA, :TOTAL, :RTFTE, :RTIVA, :RTICA, :nit, :nombre, :codzona, :telefono, :ciudad, :DV, :APELLIDO1, :APELLIDO2, :NOMBRE1, :NOMBRE2, :CODCIU, :sucursal
            DO
            BEGIN
            SELECT ZONA_NOM FROM ZONAS WHERE ZONA_COD = :codzona INTO :NOMZONA;
            SUBTOTAL = TOTAL - EXTRA - IVA - ADICIONAL + DTO;
            NETO = TOTAL - RTFTE - RTIVA - RTICA;
            SUSPEND;
            END
        END
    if (BIN_AND(TIPO, 16) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 35 INTO :NOMTIPO;
        FOR SELECT COTI_ID, CT.PREF_PRE, COTI_NUMERO, COTI_FECHA, COTI_DTOMONTO, COTI_ADICIONAL, COTI_IVAMONTO, COTI_EXTRA, COTI_TOTAL, 0, 0, 0,
            T.TERC_NIT, TERC_NOM, ZONA_COD, TERC_TEL, TERC_CIU, TERC_DV, TERC_APELLIDO1, TERC_APELLIDO2, TERC_NOMBRE1, TERC_NOMBRE2, T.CIUD_COD, CT.coti_sucursal
            FROM COTIZACIONES CT, PREFIJOS P, terceros T, CLIENTES C
            where C.TERC_NIT = T.TERC_NIT AND T.TERC_CLIE = 'S' AND T.TERC_NIT >= :NITINI AND T.TERC_NIT <= :NITFIN AND TERC_NOM >= :NOMINI AND TERC_NOM <= :NOMFIN
             AND CT.TERC_NIT = T.terc_nit AND COTI_FECHA >= :FECINI AND COTI_FECHA <= :FECFIN AND COTI_ANULADO = 'N'
             AND P.PREF_PRE = CT.PREF_PRE AND P.TIDO_COD = 35 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            ORDER BY COTI_FECHA, COTI_ID
            INTO :ID, :PREFIJO, :NUMERO, :FECDOC, :DTO, :ADICIONAL, :IVA, :EXTRA, :TOTAL, :RTFTE, :RTIVA, :RTICA, :nit, :nombre, :codzona, :telefono, :ciudad, :DV, :APELLIDO1, :APELLIDO2, :NOMBRE1, :NOMBRE2, :CODCIU, :sucursal
            DO
            BEGIN
            SELECT ZONA_NOM FROM ZONAS WHERE ZONA_COD = :codzona INTO :NOMZONA;
            SUBTOTAL = TOTAL - EXTRA - IVA - ADICIONAL + DTO;
            NETO = TOTAL - RTFTE - RTIVA - RTICA;
            SUSPEND;
            END
        END
    END
END
^

SET TERM ; ^



/* 20090812d */
/* GMF LO LLEVABA A LA CAJA Y NO AL BANCO, ADEMAS ESTABA CAUSANDO UN 4% Y NO 4/1000 */
SET TERM ^ ;

CREATE OR ALTER procedure CONTABIL_CONSIGNATAR (
    IDDOC integer,
    IDINTER integer)
returns (
    ERROR integer,
    VER char(1),
    IDC integer)
AS
declare variable PREF VARCHAR(4);
declare variable NUM VARCHAR(6);
declare variable NUMERO VARCHAR(10);
declare variable FECAUX DATE;
declare variable FECHA CHAR(8);
declare variable CONC CHAR(120);
declare variable VRDTO NUMERIC(18, 2);
declare variable VRRTFTE NUMERIC(18, 2);
declare variable VRRTIVA NUMERIC(18, 2);
declare variable VRRTICA NUMERIC(18, 2);
declare variable VRTOTAL NUMERIC(18, 2);
declare variable TIPOCOMP VARCHAR(3);
declare variable PREFCONT VARCHAR(4);
declare variable BASE CHAR(1);
declare variable PORC NUMERIC(8,2);
declare variable CTABASE VARCHAR(20);
declare variable CAJA CHAR(1);
declare variable CTACAJA VARCHAR(20);
declare variable RTFTE CHAR(1);
declare variable CTARTFTE VARCHAR(20);
declare variable RTIVA CHAR(1);
declare variable CTARTIVA VARCHAR(20);
declare variable RTICA CHAR(1);
declare variable CTARTICA VARCHAR(20);
declare variable DTO CHAR(1);
declare variable CTADTO VARCHAR(20);
declare variable CTAGMF VARCHAR(20);
declare variable GMFPOR NUMERIC(9,2);
declare variable VRGMF NUMERIC(18,2);
declare variable EXISTE CHAR(1);
declare variable CUENTA VARCHAR(20);
declare variable MONTO NUMERIC(18,2);
declare variable TIPOCUEN CHAR(1);
declare variable NIT VARCHAR(20);
declare variable PROY VARCHAR(4);
declare variable CENTRO VARCHAR(4);
declare variable DEBITO NUMERIC(18,2);
declare variable CREDITO NUMERIC(18,2);
declare variable NROI INTEGER;
declare variable SUMA NUMERIC(18,2);
declare variable CTADIC VARCHAR(20);
declare variable BASEADIC VARCHAR(20);
declare variable PORCADIC NUMERIC(5,2);
declare variable VALORADIC NUMERIC(18,2);
declare variable DBADIC CHAR(1);
declare variable CHEQUE CHAR(1);
declare variable IDCAJA INTEGER;
declare variable IDBANCO INTEGER;
declare variable ANULADO CHAR(1);
declare variable VRBASE NUMERIC(18,2);
BEGIN
/* BUSQUE LA INTERFACE */
EXISTE = 'N';
SELECT 'S', TICO_COD, PRCO_PRE, INCJ_BASE, INCJ_DTOPP, INCJ_RTFTE, INCJ_RTIVA, INCJ_RTICA, INCJ_CAJA, INCJ_CTABASE, INCJ_CTADTO, INCJ_CTARTFTE, INCJ_CTARTIVA, INCJ_CTARTICA, INCJ_CTACAJA, INCJ_CONFIRMAR
    FROM INTERFAZ_CAJA
    WHERE INCJ_ID = :IDINTER
    INTO :EXISTE, :TIPOCOMP, :PREFCONT, :BASE, :DTO, :RTFTE, :RTIVA, :RTICA, :CAJA, :CTABASE, :CTADTO, :CTARTFTE, :CTARTIVA, :CTARTICA, :CTACAJA, :VER;
if (EXISTE = 'S') then
    BEGIN
    DELETE FROM contabilizacion WHERE CNTB_TIPOREF = 64 AND CNTB_IDREF = :IDDOC;

    /* TRAIGA EL ENCABEZADO DE LA CONSIGNACION */
    SELECT PREF_PRE, COTJ_NUMERO, COTJ_FECHA, COTJ_CONCEPTO, COTJ_MONTO, COTJ_COMISION, COTJ_RTFTE, COTJ_RTIVA, COTJ_RTICA, COTJ_CHEQUE, CAJA_ID, CUBA_COD, COTJ_ANULADO
        FROM consigna_tarjetas
        WHERE COTJ_ID = :IDDOC
        INTO :PREF, :NUM, :FECAUX, :CONC, :VRTOTAL, :VRDTO, :VRRTFTE, :VRRTIVA, :VRRTICA, :CHEQUE, :IDCAJA, :IDBANCO, :ANULADO;
    if (ANULADO = 'N') then
        BEGIN
        /* EL NIT ES EL DEL BANCO */
        SELECT B.banc_nit FROM bancos B, CUENTAS_BANCO C WHERE C.banc_cod = B.banc_cod AND C.cuba_cod = :idbanco INTO :nit;

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

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

        NROI = 0;
        SUMA = 0;
        ERROR = 0;
        VRBASE = VRTOTAL;
        VRTOTAL = VRTOTAL + vrdto + vrrtfte + vrrtica + vrrtiva;
        SELECT CUBA_CTAGMF, CUBA_GMFPOR FROM CUENTAS_BANCO WHERE CUBA_COD = :IDBANCO INTO ctagmf, :gmfpor;
        if ((CTAGMF <> '') AND (GMFPOR <> 0))then
            EXECUTE procedure REDONDEE((vrdto + vrrtfte + vrrtiva + vrrtica) * GMFPOR / 1000,0) returning_values (:VRGMF);
        else    
            VRGMF = 0;
        IF ((CAJA = 'K') or (CAJA = 'F') ) THEN
            BEGIN
            if (VRTOTAL <> 0) then
                BEGIN
                IF ((CAJA = 'F')) THEN
                    BEGIN
                    /* TRAIGA LA CUENTA DE LA CAJA O EL BANCO A ABONAR */
                    if (CHEQUE = 'S') then
                        SELECT CUBA_CTACONTA FROM CUENTAS_BANCO WHERE CUBA_COD = :IDBANCO INTO CTACAJA;
                    ELSE
                        SELECT CAJA_CUENTA FROM CAJAS WHERE CAJA_ID = :IDCAJA INTO CTACAJA;
                    END
                
                CUENTA = NULL;
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :CTACAJA INTO :CUENTA, :TIPOCUEN;
                if (CUENTA IS NULL) then
                    begin
                    EXECUTE PROCEDURE ERROR (64, :IDDOC, :CTACAJA, 2);
                    CUENTA = CTABASE;
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (64, :IDDOC, :CUENTA, 3);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (64, :IDDOC, :CUENTA, 4);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRTOTAL, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA + VRTOTAL;
                    if (VRDTO <> 0) then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRDTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NROI = NROI + 1;
                        SUMA = SUMA - VRDTO;
                        END
                    if (vrrtfte <> 0) then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :vrrtfte, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NROI = NROI + 1;
                        SUMA = SUMA - vrrtfte;
                        END
                    if (vrrtiva <> 0) then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :vrrtiva, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NROI = NROI + 1;
                        SUMA = SUMA - vrrtiva;
                        END
                    if (vrrtica <> 0) then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :vrrtica, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NROI = NROI + 1;
                        SUMA = SUMA - vrrtica;
                        END
                    if (vrgmf <> 0) then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRGMF, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NROI = NROI + 1;
                        SUMA = SUMA - VRGMF;
                        END
                    END
                END /* VRTOTAL <> 0 */
            END /* CAJA CONSTANTE */
        
        if (DTO = 'K') then /* COMISION */
            BEGIN
            if (VRDTO <> 0) then
                BEGIN
                CUENTA = NULL;
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :CTADTO INTO :CUENTA, :TIPOCUEN;
                if (CUENTA IS NULL) then
                    begin
                    EXECUTE PROCEDURE ERROR (64, :IDDOC, :CTABASE, 2);
                    CUENTA = CTABASE;
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (64, :IDDOC, :CUENTA, 3);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (64, :IDDOC, :CUENTA, 4);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRDTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA + VRDTO;
                    END
                END /* VRDTO <> 0 */
            END /* DTO EN CTA CONSTANTE */
        
        /* RETENCION FUENTE */
        if (RTFTE = 'K') then
          if (VRRTFTE <> 0) then
            BEGIN
            PORC = vrrtfte * 100 / vrbase;
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTARTFTE INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERROR (64, :IDDOC, :ctartfte, 2);
                CUENTA = CTABASE;
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERROR (64, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                EXECUTE PROCEDURE ERROR (64, :IDDOC, :CUENTA, 4);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :vrbase, :PORC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA + VRRTFTE;
                END
            END /* RTFTE */
        
        /* RETENCION IVA */
        if (RTIVA = 'K') then
          if (VRRTIVA <> 0) then
            BEGIN
            PORC = VRRTIVA / VRBASE;
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO
                FROM CUENTAS
                WHERE CUEN_COD = :CTARTIVA
                INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERROR (64, :IDDOC, :ctartiva, 2);
                CUENTA = CTABASE;
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERROR (64, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                EXECUTE PROCEDURE ERROR (64, :IDDOC, :CUENTA, 4);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTIVA, 0, :VRBASE, :PORC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA + VRRTIVA;
                END
            END /* RTIVA */
        
        /* RETENCION ICA */
        if (rtica = 'K') then
          if (vrrtica <> 0) then
            BEGIN
            PORC = vrrtica / VRBASE;
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO
                FROM CUENTAS
                WHERE CUEN_COD = :ctartica
                INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERROR (64, :IDDOC, :ctartica, 2);
                CUENTA = ctartica;
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERROR (64, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                EXECUTE PROCEDURE ERROR (64, :IDDOC, :CUENTA, 4);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :vrrtica, 0, :VRBASE, :PORC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA + vrrtica;
                END
            END /* RTIVA */
        
        /* CUENTA GMF */
        if (VRGMF <> 0) then
            BEGIN
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTAGMF INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERROR (64, :IDDOC, :CTAGMF, 2);
                CUENTA = CTAGMF;
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERROR (64, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                EXECUTE PROCEDURE ERROR (64, :IDDOC, :CUENTA, 4);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
              if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRGMF, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA + VRGMF;
                END
            END /* GMF */

        /* CIERRE EL COMPROBANTE CONTRA LA CUENTA DE LA CAJA */
        if ((SUMA <> 0) and ((BASE = 'F') or (BASE = 'K'))) then
            BEGIN
            if (SUMA < 0) then
                BEGIN
                DEBITO = SUMA * -1;
                CREDITO = 0;
                END
            ELSE    
                BEGIN
                DEBITO = 0;
                CREDITO = SUMA;
                END
            if (BASE = 'F') then
                SELECT CAJA_CUENTA FROM CAJAS WHERE CAJA_ID = :IDCAJA INTO CTABASE;

            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTABASE INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERROR (64, :IDDOC, :CTABASE, 2);
                CUENTA = CTABASE;
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERROR (64, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                EXECUTE PROCEDURE ERROR (64, :IDDOC, :CUENTA, 4);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'N') then
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :DEBITO, :CREDITO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            END /* SUMA EN CARTERA */

        /* recorra las cuentas adicionales */
        FOR SELECT INJC_CUENTA, INJC_BASE, INJC_PORC, INJC_VALOR, INJC_DB
            FROM INTERFAZ_CAJA_CTAS
            WHERE INCJ_ID = :IDINTER
            INTO :CTADIC, :BASEADIC, :PORCADIC, :VALORADIC, :DBADIC
            DO
            BEGIN
            if (:BASEADIC = 'TOTAL') then
                VALORADIC = VRTOTAL;
            if (:BASEADIC = 'DESCUENTO') then
                VALORADIC = VRDTO;
            if (:BASEADIC = 'RTFTE') then
                VALORADIC = VRRTFTE;
            if (:BASEADIC = 'RTIVA') then
                VALORADIC = VRRTIVA;
            MONTO = VALORADIC * PORCADIC;
        
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTADIC INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERROR (66, :IDDOC, :CTABASE, 2);
                CUENTA = CTABASE;
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERROR (66, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                EXECUTE PROCEDURE ERROR (66, :IDDOC, :CUENTA, 4);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                if (DBADIC = 'S') then
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                ELSE
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                END
            NROI = NROI + 1;
            END     
        
        if (ERROR > 0) then
            VER = 'S';
        SUSPEND;
        END
    END /* EXISTE LA INTERFAZ */
ELSE
    BEGIN
    EXECUTE PROCEDURE ERROR (64, :IDDOC, :PREF, 1);
    ERROR = ERROR + 1;
    VER = 'S';
    SUSPEND;
    END
END
^

SET TERM ; ^



/* 20090812e */
/* AGREGAR CUENTA Y MONTO A LA CONSULTA DE MOVIMIENTOS POR TERCERO */
SET TERM ^ ;

CREATE OR ALTER procedure COMPROBANTES_TERCERO (
    NIT varchar(20))
returns (
    ID integer,
    TIPO varchar(3),
    PREFIJO varchar(4),
    NUMERO varchar(6),
    FECHA char(8),
    CONCEPTO varchar(60),
    REF varchar(20),
    CUENTA varchar(20),
    MONTO numeric(18,2),
    TIPOREF integer)
AS
BEGIN
  /* TRAE LOS COMPROBANTES SEGUN EL RANGO DADO */
    FOR SELECT MAX(E.ENCO_CONSEC), MAX(TICO_COD), MAX(PRCO_PREF), MAX(ENCO_NUMERO), MAX(ENCO_FECHA), MAX(ENCO_CONCEPTO), MAX(ENCO_REFER), MAX(ENCO_TIPOREF), MAX(CUEN_COD), SUM(CODE_DEBITO-CODE_CREDITO)
        FROM COMPROBANTE_ENCABEZADO E, COMPROBANTE_DETALLE D
        WHERE E.ENCO_CONSEC = D.ENCO_CONSEC AND D.TERC_NIT = :NIT
        GROUP BY E.ENCO_CONSEC, d.cuen_cod
        ORDER BY E.ENCO_CONSEC, d.cuen_cod
        INTO :ID, :TIPO, :PREFIJO, :NUMERO, :FECHA, :CONCEPTO, :REF, :TIPOREF, :CUENTA, :MONTO
        DO
            SUSPEND;
END
^

SET TERM ; ^


/* 20090813 */
/* DEVOLUCIONES QUEDABAN POSITIVAS SI SE PEDIA DETALLADO */
SET TERM ^ ;

CREATE OR ALTER procedure REP_ARTICULOS_VENDEDOR (
    TIPO integer,
    DETALLE char(1),
    DESDE varchar(20),
    HASTA varchar(20),
    FECINI date,
    FECFIN date,
    ARTINI varchar(15),
    ARTFIN varchar(15),
    GRPINI varchar(3),
    GRPFIN varchar(3),
    ORDEN char(1),
    AGRUPA char(1),
    ZONA char(1),
    CEROS char(1),
    SUBEMPRESA integer,
    ZONAINI char(2),
    ZONAFIN char(2))
returns (
    CODVEND varchar(20),
    NOMVEND varchar(60),
    NOMTIPO varchar(50),
    ARTICULO varchar(15),
    DESCRIPCION varchar(60),
    CODGRUPO varchar(2),
    NOMGRUPO varchar(30),
    CODSUBG varchar(3),
    NOMSUBG varchar(30),
    CODMARC varchar(3),
    NOMMARC varchar(30),
    UNIDAD varchar(8),
    CANTIDAD numeric(18,4),
    BASE numeric(18,2),
    IVA numeric(18,2),
    CONSUMO numeric(18,2),
    TOTAL numeric(18,2),
    PREFIJO varchar(4),
    NUMERO varchar(6),
    FECHA date,
    DTO numeric(9,2),
    NIT varchar(20),
    NOMCLIENTE varchar(60),
    SUCURSAL varchar(10),
    CODZONA varchar(2),
    NOMZONA varchar(60))
AS
declare variable codini varchar(15);
declare variable codfin varchar(15);
declare variable desini varchar(15);
declare variable desfin varchar(15);
declare variable marini varchar(3);
declare variable marfin varchar(3);
BEGIN
if (ORDEN = 'C') then
    BEGIN
    CODINI = ARTINI;
    CODFIN = ARTFIN;
    DESINI = '';
    DESFIN = 'zz';
    END
ELSE
    BEGIN
    DESINI = ARTINI;
    DESFIN = ARTFIN;
    CODINI = '';
    CODFIN = 'zz';
    END
if (AGRUPA = 'G') then
    BEGIN
    MARINI = '';
    MARFIN = 'zz';
    END
ELSE
    if (AGRUPA = 'M') then
        BEGIN
        MARINI = GRPINI;
        MARFIN = GRPFIN;
        GRPINI = '';
        GRPFIN = 'zz';
        END
    ELSE
        BEGIN
        MARINI = '';
        MARFIN = 'zz';
        END
if (DETALLE = 'N') then
    BEGIN
    if (BIN_AND(TIPO, 1) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 31 INTO :NOMTIPO;
        FOR SELECT MAX(D.ARTI_COD), MAX(VEND_COD), SUM(FADE_CANT * FADE_FACTOR), SUM((FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO)*FACT_FACTOR), SUM(FADE_IVAMONTO*FACT_FACTOR), SUM(FADE_CONSUMO), SUM(FADE_TOTAL*FACT_FACTOR),
            MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD)
            FROM FACTURAS_DETALLE D, FACTURAS F, PREFIJOS P, ARTICULO A
            WHERE F.FACT_ID = D.FACT_ID AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND D.ARTI_COD = A.arti_cod AND
            VEND_COD >= :DESDE AND VEND_COD <= :HASTA AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            FACT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) and substring(a.arti_cod from 1 FOR 2) <> '.t'
            GROUP BY VEND_COD, D.ARTI_COD
            INTO :ARTICULO, :CODVEND, :CANTIDAD, :BASE, :IVA, :CONSUMO, :TOTAL,
            :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
            DO
            BEGIN
            select VEND_NOMBRE from VENDEDORES where VEND_COD = :CODVEND INTO :NOMVEND;
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            if (CEROS = 'S') then
                SUSPEND;
            ELSE
                if ((BASE <> 0) AND (CANTIDAD <> 0)) then
                    SUSPEND;
            END /* FOR */
        END
    if (BIN_AND(TIPO, 2) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 32 INTO :NOMTIPO;
        FOR SELECT MAX(D.ARTI_COD), MAX(VEND_COD), SUM(RVDE_CANT * RVDE_FACTOR), SUM(RVDE_TOTAL-RVDE_IVAMONTO-RVDE_CONSUMO), SUM(RVDE_IVAMONTO), SUM(RVDE_CONSUMO), SUM(RVDE_TOTAL),
            MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD)
            FROM REMISIONES_VENTA_DETALLE D, REMISIONES_VENTA R, PREFIJOS P, ARTICULO A
            WHERE R.REVT_ID = D.REVT_ID AND P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = 32 AND D.ARTI_COD = A.arti_cod AND
            VEND_COD >= :DESDE AND VEND_COD <= :HASTA AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            REVT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY R.vend_cod, D.ARTI_COD
            INTO :ARTICULO, :CODVEND, :CANTIDAD, :BASE, :IVA, :CONSUMO, :TOTAL,
            :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
            DO
            BEGIN
            select VEND_NOMBRE from VENDEDORES where VEND_COD = :CODVEND INTO :NOMVEND;
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            if (CEROS = 'S') then
                SUSPEND;
            ELSE
                if ((BASE <> 0) AND (CANTIDAD <> 0)) then
                    SUSPEND;
            END /* FOR */
        END
    if (BIN_AND(TIPO, 4) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 33 INTO :NOMTIPO;
        FOR SELECT MAX(D.ARTI_COD), MAX(VEND_COD), SUM(DVDE_CANT * DVDE_FACTOR), SUM((DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO)*DEVT_FACTOR), SUM(DVDE_IVAMONTO*DEVT_FACTOR), SUM(DVDE_CONSUMO), SUM(DVDE_TOTAL*DEVT_FACTOR),
            MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD)
            FROM devoluciones_ventas_detalle D, DEVOLUCIONES_VENTAS V, PREFIJOS P, ARTICULO A
            WHERE V.DEVT_ID = D.DEVT_ID AND P.PREF_PRE = V.PREF_PRE AND P.TIDO_COD = 33 AND D.ARTI_COD = A.arti_cod AND
            VEND_COD >= :DESDE AND VEND_COD <= :HASTA AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            DEVT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY V.vend_cod, D.ARTI_COD
            INTO :ARTICULO, :CODVEND, :CANTIDAD, :BASE, :IVA, :CONSUMO, :TOTAL,
            :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
            DO
            BEGIN
            select VEND_NOMBRE from VENDEDORES where VEND_COD = :CODVEND INTO :NOMVEND;
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            if (CEROS = 'S') then
                SUSPEND;
            ELSE
                if ((BASE <> 0) AND (CANTIDAD <> 0)) then
                    BEGIN
                    BASE = BASE * -1;
                    IVA = IVA * -1;
                    CANTIDAD = CANTIDAD * -1;
                    TOTAL = TOTAL * -1;
                    SUSPEND;
                    END
            END /* FOR */
        END
    if (BIN_AND(TIPO, 8) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 34 INTO :NOMTIPO;
        FOR SELECT MAX(D.ARTI_COD), MAX(VEND_COD), SUM(PEDE_CANT * PEDE_FACTOR), SUM((PEDE_TOTAL-PEDE_IVAMONTO-PEDE_CONSUMO)*PEDI_FACTOR), SUM(PEDE_IVAMONTO*PEDI_FACTOR), SUM(PEDE_CONSUMO), SUM(PEDE_TOTAL*PEDI_FACTOR),
            MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD)
            FROM PEDIDOS_DETALLE D, PEDIDOS P, PREFIJOS R, ARTICULO A
            WHERE P.PEDI_ID = D.PEDI_ID AND P.PREF_PRE = R.PREF_PRE AND R.TIDO_COD = 34 AND D.ARTI_COD = A.arti_cod AND
            VEND_COD >= :DESDE AND VEND_COD <= :HASTA AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            PEDI_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY P.vend_cod, D.ARTI_COD
            INTO :ARTICULO, :CODVEND, :CANTIDAD, :BASE, :IVA, :CONSUMO, :TOTAL,
            :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
            DO
            BEGIN
            select VEND_NOMBRE from VENDEDORES where VEND_COD = :CODVEND INTO :NOMVEND;
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            if (CEROS = 'S') then
                SUSPEND;
            ELSE
                if ((BASE <> 0) AND (CANTIDAD <> 0)) then
                    SUSPEND;
            END /* FOR */
        END
    if (BIN_AND(TIPO, 16) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 35 INTO :NOMTIPO;
        FOR SELECT MAX(D.ARTI_COD), MAX(VEND_COD), SUM(CTDE_CANT * CTDE_FACTOR), SUM((CTDE_TOTAL-CTDE_IVAMONTO-CTDE_CONSUMO)*COTI_FACTOR), SUM(CTDE_IVAMONTO*COTI_FACTOR), SUM(CTDE_CONSUMO), SUM(CTDE_TOTAL*COTI_FACTOR),
            MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD)
            FROM COTIZACIONES_DETALLE D, COTIZACIONES C, PREFIJOS P, ARTICULO A
            WHERE C.COTI_ID = D.COTI_ID AND P.PREF_PRE = C.PREF_PRE AND P.TIDO_COD = 35 AND D.ARTI_COD = A.arti_cod AND
            VEND_COD >= :DESDE AND VEND_COD <= :HASTA AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND COTI_FECHA >= :FECINI AND COTI_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            COTI_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY C.vend_cod, D.ARTI_COD
            INTO :ARTICULO, :CODVEND, :CANTIDAD, :BASE, :IVA, :CONSUMO, :TOTAL,
            :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
            DO
            BEGIN
            select VEND_NOMBRE from VENDEDORES where VEND_COD = :CODVEND INTO :NOMVEND;
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            if (CEROS = 'S') then
                SUSPEND;
            ELSE
                if ((BASE <> 0) AND (CANTIDAD <> 0)) then
                    SUSPEND;
            END /* FOR */
        END
    END
ELSE
  if (DETALLE = 'S') then
    BEGIN
    if (BIN_AND(TIPO, 1) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 31 INTO :NOMTIPO;
        FOR SELECT F.PREF_PRE, FACT_NUMERO, FACT_FECHA, VEND_COD, D.ARTI_COD, FADE_CANT * FADE_FACTOR, (FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO)*FACT_FACTOR, FADE_IVAMONTO*FACT_FACTOR, FADE_CONSUMO, FADE_DTOPORC, FADE_TOTAL*FACT_FACTOR,
            ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD , F.TERC_NIT, F.fact_nomcliente, F.fact_sucursal
            FROM FACTURAS F, FACTURAS_DETALLE D, PREFIJOS P, ARTICULO A
            WHERE F.FACT_ID = D.FACT_ID AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND D.ARTI_COD = A.arti_cod AND
                VEND_COD >= :DESDE AND VEND_COD <= :HASTA AND
                A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
                A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND FACT_FECHA >= :FECINI AND
                (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
                FACT_FECHA <= :FECFIN AND FACT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) and substring(a.arti_cod from 1 FOR 2) <> '.t'
            ORDER BY VEND_COD, D.ARTI_COD, FACT_FECHA, F.FACT_ID, FADE_ITEM
            INTO :PREFIJO, :NUMERO, :FECHA, :CODVEND, :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO, :DTO, :TOTAL,
                :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :NIT, :nomcliente, :sucursal
            DO
            BEGIN
            select VEND_NOMBRE from VENDEDORES where VEND_COD = :CODVEND INTO :NOMVEND;
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            SUSPEND;
            END
        END
    if (BIN_AND(TIPO, 2) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 32 INTO :NOMTIPO;
        FOR SELECT R.PREF_PRE, REVT_NUMERO, REVT_FECHA, VEND_COD, D.ARTI_COD, RVDE_CANT * RVDE_FACTOR, (RVDE_TOTAL-RVDE_IVAMONTO-RVDE_CONSUMO), RVDE_IVAMONTO, RVDE_CONSUMO, RVDE_DTOPORC, RVDE_TOTAL,
            ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD, R.terc_nit, R.revt_nomterc, r.revt_sucursal
            FROM REMISIONES_VENTA R, REMISIONES_VENTA_DETALLE D, PREFIJOS P, ARTICULO A
            WHERE R.REVT_ID = D.REVT_ID AND P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = 32 AND D.ARTI_COD = A.arti_cod AND
                VEND_COD >= :DESDE AND VEND_COD <= :HASTA AND
                A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
                A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN AND
                (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
                REVT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            ORDER BY VEND_COD, D.ARTI_COD, REVT_FECHA, R.REVT_ID, RVDE_ITEM
            INTO :PREFIJO, :NUMERO, :FECHA, :CODVEND, :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO, :DTO, :TOTAL,
                :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :NIT, :nomcliente, :sucursal
            DO
            BEGIN
            select VEND_NOMBRE from VENDEDORES where VEND_COD = :CODVEND INTO :NOMVEND;
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            SUSPEND;
            END
        END
    if (BIN_AND(TIPO, 4) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 33 INTO :NOMTIPO;
        FOR SELECT V.PREF_PRE, DEVT_NUMERO, DEVT_FECHA, VEND_COD, D.ARTI_COD, DVDE_CANT * DVDE_FACTOR, (DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO)*DEVT_FACTOR, DVDE_IVAMONTO*DEVT_FACTOR, DVDE_CONSUMO, DVDE_DTOPORC, DVDE_TOTAL*DEVT_FACTOR,
            ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD, V.terc_nit, V.devt_nomterc, v.devt_sucursal
            FROM DEVOLUCIONES_VENTAS V, DEVOLUCIONES_VENTAS_DETALLE D, PREFIJOS P, ARTICULO A
            WHERE V.DEVT_ID = D.DEVT_ID AND P.PREF_PRE = V.PREF_PRE AND P.TIDO_COD = 33 AND D.ARTI_COD = A.arti_cod AND
                VEND_COD >= :DESDE AND VEND_COD <= :HASTA AND
                A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
                A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND
                (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
                DEVT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            ORDER BY VEND_COD, D.ARTI_COD, DEVT_FECHA, V.DEVT_ID, DVDE_ITEM
            INTO :PREFIJO, :NUMERO, :FECHA, :CODVEND, :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO, :DTO, :TOTAL,
                :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :NIT, :nomcliente, :sucursal
            DO
            BEGIN
            select VEND_NOMBRE from VENDEDORES where VEND_COD = :CODVEND INTO :NOMVEND;
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            BASE = BASE * -1;
            IVA = IVA * -1;
            CANTIDAD = CANTIDAD * -1;
            TOTAL = TOTAL * -1;
            SUSPEND;
            END
        END
    if (BIN_AND(TIPO, 8) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 34 INTO :NOMTIPO;
        FOR SELECT P.PREF_PRE, PEDI_NUMERO, PEDI_FECHA, VEND_COD, D.ARTI_COD, PEDE_CANT * PEDE_FACTOR, (PEDE_TOTAL-PEDE_IVAMONTO-PEDE_CONSUMO)*PEDI_FACTOR, PEDE_IVAMONTO*PEDI_FACTOR, PEDE_CONSUMO, PEDE_DTOPORC, PEDE_TOTAL*PEDI_FACTOR,
            ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD, P.terc_nit, P.pedi_nomterc, p.pedi_sucursal
            FROM PEDIDOS P, PEDIDOS_DETALLE D, PREFIJOS R, ARTICULO A
            WHERE P.PEDI_ID = D.PEDI_ID AND P.PREF_PRE = R.PREF_PRE AND R.TIDO_COD = 34 AND D.ARTI_COD = A.arti_cod AND
                VEND_COD >= :DESDE AND VEND_COD <= :HASTA AND
                A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
                A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND
                (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
                PEDI_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            ORDER BY VEND_COD, D.ARTI_COD, PEDI_FECHA, P.PEDI_ID, PEDE_ITEM
            INTO :PREFIJO, :NUMERO, :FECHA, :CODVEND, :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO, :DTO, :TOTAL,
                :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :NIT, :nomcliente, :sucursal
            DO
            BEGIN
            select VEND_NOMBRE from VENDEDORES where VEND_COD = :CODVEND INTO :NOMVEND;
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            SUSPEND;
            END
        END
    if (BIN_AND(TIPO, 16) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 35 INTO :NOMTIPO;
        FOR SELECT C.PREF_PRE, COTI_NUMERO, COTI_FECHA, VEND_COD, D.ARTI_COD, CTDE_CANT * CTDE_FACTOR, (CTDE_TOTAL-CTDE_IVAMONTO-CTDE_CONSUMO)*COTI_FACTOR, CTDE_IVAMONTO*COTI_FACTOR, CTDE_CONSUMO, CTDE_DTOPORC, CTDE_TOTAL*COTI_FACTOR,
            ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD, C.terc_nit, C.coti_nomterc, c.coti_sucursal
            FROM COTIZACIONES C, COTIZACIONES_DETALLE D, PREFIJOS P, ARTICULO A
            WHERE C.COTI_ID = D.COTI_ID AND P.PREF_PRE = C.PREF_PRE AND P.TIDO_COD = 35 AND D.ARTI_COD = A.arti_cod AND
                VEND_COD >= :DESDE AND VEND_COD <= :HASTA AND
                A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
                A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND COTI_FECHA >= :FECINI AND COTI_FECHA <= :FECFIN AND
                (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
                COTI_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            ORDER BY VEND_COD, D.ARTI_COD, COTI_FECHA, C.COTI_ID, CTDE_ITEM
            INTO :PREFIJO, :NUMERO, :FECHA, :CODVEND, :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO, :DTO, :TOTAL,
                :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :NIT, :nomcliente, :sucursal
            DO
            BEGIN
            select VEND_NOMBRE from VENDEDORES where VEND_COD = :CODVEND INTO :NOMVEND;
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            SUSPEND;
            END
        END
    END
  ELSE
if (DETALLE = 'C') then
    BEGIN
    if (BIN_AND(TIPO, 1) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 31 INTO :NOMTIPO;
        FOR SELECT MAX(D.ARTI_COD), MAX(VEND_COD), SUM(FADE_CANT * FADE_FACTOR), SUM((FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO)*FACT_FACTOR), SUM(FADE_IVAMONTO*FACT_FACTOR), SUM(FADE_CONSUMO), SUM(FADE_TOTAL*FACT_FACTOR),
            MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD), MAX(F.terc_nit), MAX(F.fact_nomcliente), MAX(F.fact_sucursal)
            FROM FACTURAS_DETALLE D, FACTURAS F, PREFIJOS P, ARTICULO A
            WHERE F.FACT_ID = D.FACT_ID AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND D.ARTI_COD = A.arti_cod AND
            VEND_COD >= :DESDE AND VEND_COD <= :HASTA AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            FACT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) and substring(a.arti_cod from 1 FOR 2) <> '.t'
            GROUP BY F.VEND_COD, F.TERC_NIT, F.fact_sucursal, D.ARTI_COD
            INTO :ARTICULO, :CODVEND, :CANTIDAD, :BASE, :IVA, :CONSUMO, :TOTAL,
            :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :nit, :nomcliente, :sucursal
            DO
            BEGIN
            select VEND_NOMBRE from VENDEDORES where VEND_COD = :CODVEND INTO :NOMVEND;
            SELECT C.ZONA_COD, ZONA_NOM FROM CLIENTES C, ZONAS Z WHERE C.zona_cod = Z.zona_cod AND C.terc_nit = :nit INTO :codzona, :nomzona;
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            if (CEROS = 'S') then
                SUSPEND;
            ELSE
                if ((BASE <> 0) AND (CANTIDAD <> 0)) then
                    SUSPEND;
            END /* FOR */
        END
    if (BIN_AND(TIPO, 2) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 32 INTO :NOMTIPO;
        FOR SELECT MAX(D.ARTI_COD), MAX(VEND_COD), SUM(RVDE_CANT * RVDE_FACTOR), SUM(RVDE_TOTAL-RVDE_IVAMONTO-RVDE_CONSUMO), SUM(RVDE_IVAMONTO), SUM(RVDE_CONSUMO), SUM(RVDE_TOTAL),
            MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD), MAX(R.terc_nit), MAX(R.revt_nomterc), MAX(R.revt_sucursal)
            FROM REMISIONES_VENTA_DETALLE D, REMISIONES_VENTA R, PREFIJOS P, ARTICULO A
            WHERE R.REVT_ID = D.REVT_ID AND P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = 32 AND D.ARTI_COD = A.arti_cod AND
            VEND_COD >= :DESDE AND VEND_COD <= :HASTA AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            REVT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY R.vend_cod, R.terc_nit, R.revt_sucursal, D.arti_cod
            INTO :ARTICULO, :CODVEND, :CANTIDAD, :BASE, :IVA, :CONSUMO, :TOTAL,
            :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :nit, :nomcliente, :sucursal
            DO
            BEGIN
            SELECT C.ZONA_COD, ZONA_NOM FROM CLIENTES C, ZONAS Z WHERE C.zona_cod = Z.zona_cod AND C.terc_nit = :nit INTO :codzona, :nomzona;
            select VEND_NOMBRE from VENDEDORES where VEND_COD = :CODVEND INTO :NOMVEND;
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            if (CEROS = 'S') then
                SUSPEND;
            ELSE
                if ((BASE <> 0) AND (CANTIDAD <> 0)) then
                    SUSPEND;
            END /* FOR */
        END
    if (BIN_AND(TIPO, 4) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 33 INTO :NOMTIPO;
        FOR SELECT MAX(D.ARTI_COD), MAX(VEND_COD), SUM(DVDE_CANT * DVDE_FACTOR), SUM((DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO)*DEVT_FACTOR), SUM(DVDE_IVAMONTO*DEVT_FACTOR), SUM(DVDE_CONSUMO), SUM(DVDE_TOTAL*DEVT_FACTOR),
            MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD), MAX(V.terc_nit), MAX(V.devt_nomterc), MAX(V.devt_sucursal)
            FROM devoluciones_ventas_detalle D, DEVOLUCIONES_VENTAS V, PREFIJOS P, ARTICULO A
            WHERE V.DEVT_ID = D.DEVT_ID AND P.PREF_PRE = V.PREF_PRE AND P.TIDO_COD = 33 AND D.ARTI_COD = A.arti_cod AND
            VEND_COD >= :DESDE AND VEND_COD <= :HASTA AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            DEVT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY V.vend_cod, V.terc_nit, V.devt_sucursal, D.arti_cod
            INTO :ARTICULO, :CODVEND, :CANTIDAD, :BASE, :IVA, :CONSUMO, :TOTAL,
            :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :nit, :nomcliente, :sucursal
            DO
            BEGIN
            SELECT C.ZONA_COD, ZONA_NOM FROM CLIENTES C, ZONAS Z WHERE C.zona_cod = Z.zona_cod AND C.terc_nit = :nit INTO :codzona, :nomzona;
            select VEND_NOMBRE from VENDEDORES where VEND_COD = :CODVEND INTO :NOMVEND;
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            if (CEROS = 'S') then
                SUSPEND;
            ELSE
                if ((BASE <> 0) AND (CANTIDAD <> 0)) then
                    SUSPEND;
            END /* FOR */
        END
    if (BIN_AND(TIPO, 8) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 34 INTO :NOMTIPO;
        FOR SELECT MAX(D.ARTI_COD), MAX(VEND_COD), SUM(PEDE_CANT * PEDE_FACTOR), SUM((PEDE_TOTAL-PEDE_IVAMONTO-PEDE_CONSUMO)*PEDI_FACTOR), SUM(PEDE_IVAMONTO*PEDI_FACTOR), SUM(PEDE_CONSUMO), SUM(PEDE_TOTAL*PEDI_FACTOR),
            MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD), MAX(P.terc_nit), MAX(P.pedi_nomterc), MAX(P.pedi_sucursal)
            FROM PEDIDOS_DETALLE D, PEDIDOS P, PREFIJOS R, ARTICULO A
            WHERE P.PEDI_ID = D.PEDI_ID AND P.PREF_PRE = R.PREF_PRE AND R.TIDO_COD = 34 AND D.ARTI_COD = A.arti_cod AND
            VEND_COD >= :DESDE AND VEND_COD <= :HASTA AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            PEDI_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY P.vend_cod, P.terc_nit, P.pedi_sucursal, D.arti_cod
            INTO :ARTICULO, :CODVEND, :CANTIDAD, :BASE, :IVA, :CONSUMO, :TOTAL,
            :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :nit, :nomcliente, :sucursal
            DO
            BEGIN
            SELECT C.ZONA_COD, ZONA_NOM FROM CLIENTES C, ZONAS Z WHERE C.zona_cod = Z.zona_cod AND C.terc_nit = :nit INTO :codzona, :nomzona;
            select VEND_NOMBRE from VENDEDORES where VEND_COD = :CODVEND INTO :NOMVEND;
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            if (CEROS = 'S') then
                SUSPEND;
            ELSE
                if ((BASE <> 0) AND (CANTIDAD <> 0)) then
                    SUSPEND;
            END /* FOR */
        END
    if (BIN_AND(TIPO, 16) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 35 INTO :NOMTIPO;
        FOR SELECT MAX(D.ARTI_COD), MAX(VEND_COD), SUM(CTDE_CANT * CTDE_FACTOR), SUM((CTDE_TOTAL-CTDE_IVAMONTO-CTDE_CONSUMO)*COTI_FACTOR), SUM(CTDE_IVAMONTO*COTI_FACTOR), SUM(CTDE_CONSUMO), SUM(CTDE_TOTAL*COTI_FACTOR),
            MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD), MAX(C.terc_nit), MAX(C.coti_nomterc), MAX(C.coti_sucursal)
            FROM COTIZACIONES_DETALLE D, COTIZACIONES C, PREFIJOS P, ARTICULO A
            WHERE C.COTI_ID = D.COTI_ID AND P.PREF_PRE = C.PREF_PRE AND P.TIDO_COD = 35 AND D.ARTI_COD = A.arti_cod AND
            VEND_COD >= :DESDE AND VEND_COD <= :HASTA AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND COTI_FECHA >= :FECINI AND COTI_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            COTI_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY C.vend_cod, C.terc_nit, C.coti_sucursal, D.arti_cod
            INTO :ARTICULO, :CODVEND, :CANTIDAD, :BASE, :IVA, :CONSUMO, :TOTAL,
            :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :nit, :nomcliente, :sucursal
            DO
            BEGIN
            SELECT C.ZONA_COD, ZONA_NOM FROM CLIENTES C, ZONAS Z WHERE C.zona_cod = Z.zona_cod AND C.terc_nit = :nit INTO :codzona, :nomzona;
            select VEND_NOMBRE from VENDEDORES where VEND_COD = :CODVEND INTO :NOMVEND;
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            if (CEROS = 'S') then
                SUSPEND;
            ELSE
                if ((BASE <> 0) AND (CANTIDAD <> 0)) then
                    SUSPEND;
            END /* FOR */
        END
    END
if (zona = 'S') then
    BEGIN
    if (BIN_AND(TIPO, 1) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 31 INTO :NOMTIPO;
        FOR SELECT MAX(D.ARTI_COD), MAX(F.VEND_COD), SUM(FADE_CANT * FADE_FACTOR), SUM((FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO)*FACT_FACTOR), SUM(FADE_IVAMONTO*FACT_FACTOR), SUM(FADE_CONSUMO), SUM(FADE_TOTAL*FACT_FACTOR),
            MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD), MAX(F.terc_nit), MAX(F.fact_nomcliente), MAX(F.fact_sucursal)
            FROM FACTURAS_DETALLE D, FACTURAS F, PREFIJOS P, ARTICULO A, clientes C, ZONAS Z
            WHERE F.FACT_ID = D.FACT_ID AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND D.ARTI_COD = A.arti_cod AND
            F.VEND_COD >= :DESDE AND F.VEND_COD <= :HASTA AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            FACT_ANULADO = 'N' AND ((P.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) AND F.terc_nit = C.terc_nit AND
            Z.zona_cod = C.zona_cod AND C.zona_cod >= :zonaini AND C.zona_cod <= :zonafin and substring(a.arti_cod from 1 FOR 2) <> '.t'
            GROUP BY F.VEND_COD, C.zona_cod ,D.ARTI_COD , C.terc_nit, F.fact_sucursal
            INTO :ARTICULO, :CODVEND, :CANTIDAD, :BASE, :IVA, :CONSUMO, :TOTAL,
            :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :nit, :nomcliente, :sucursal
            DO
            BEGIN
            select VEND_NOMBRE from VENDEDORES where VEND_COD = :CODVEND INTO :NOMVEND;
            SELECT C.ZONA_COD, ZONA_NOM FROM CLIENTES C, ZONAS Z WHERE C.zona_cod = Z.zona_cod AND C.terc_nit = :nit /*AND Z.zona_cod >= :zonaini AND Z.zona_cod >= :zonafin*/ INTO :codzona, :nomzona;
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            if (CEROS = 'S') then
                SUSPEND;
            ELSE
                if ((BASE <> 0) AND (CANTIDAD <> 0)) then
                    SUSPEND;
            END /* FOR */
        END
    if (BIN_AND(TIPO, 2) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 32 INTO :NOMTIPO;
        FOR SELECT MAX(D.ARTI_COD), MAX(R.VEND_COD), SUM(RVDE_CANT * RVDE_FACTOR), SUM(RVDE_TOTAL-RVDE_IVAMONTO-RVDE_CONSUMO), SUM(RVDE_IVAMONTO), SUM(RVDE_CONSUMO), SUM(RVDE_TOTAL),
            MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD), MAX(R.terc_nit), MAX(R.revt_nomterc), MAX(R.revt_sucursal)
            FROM REMISIONES_VENTA_DETALLE D, REMISIONES_VENTA R, PREFIJOS P, ARTICULO A, clientes C, ZONAS Z
            WHERE R.REVT_ID = D.REVT_ID AND P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = 32 AND D.ARTI_COD = A.arti_cod AND
            R.VEND_COD >= :DESDE AND R.VEND_COD <= :HASTA AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            REVT_ANULADO = 'N' AND ((P.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))AND R.terc_nit = C.terc_nit AND
            Z.zona_cod = C.zona_cod AND C.zona_cod >= :zonaini AND C.zona_cod <= :zonafin
            GROUP BY R.vend_cod, c.zona_cod, D.arti_cod , R.terc_nit
            INTO :ARTICULO, :CODVEND, :CANTIDAD, :BASE, :IVA, :CONSUMO, :TOTAL,
            :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :nit, :nomcliente, :sucursal
            DO
            BEGIN
            SELECT C.ZONA_COD, ZONA_NOM FROM CLIENTES C, ZONAS Z WHERE C.zona_cod = Z.zona_cod AND C.terc_nit = :nit INTO :codzona, :nomzona;
            select VEND_NOMBRE from VENDEDORES where VEND_COD = :CODVEND INTO :NOMVEND;
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            if (CEROS = 'S') then
                SUSPEND;
            ELSE
                if ((BASE <> 0) AND (CANTIDAD <> 0)) then
                    SUSPEND;
            END /* FOR */
        END
    if (BIN_AND(TIPO, 4) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 33 INTO :NOMTIPO;
        FOR SELECT MAX(D.ARTI_COD), MAX(V.VEND_COD), SUM(DVDE_CANT * DVDE_FACTOR), SUM((DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO)*DEVT_FACTOR), SUM(DVDE_IVAMONTO*DEVT_FACTOR), SUM(DVDE_CONSUMO), SUM(DVDE_TOTAL*DEVT_FACTOR),
            MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD), MAX(V.terc_nit), MAX(V.devt_nomterc), MAX(V.devt_sucursal)
            FROM devoluciones_ventas_detalle D, DEVOLUCIONES_VENTAS V, PREFIJOS P, ARTICULO A, clientes C, ZONAS Z
            WHERE V.DEVT_ID = D.DEVT_ID AND P.PREF_PRE = V.PREF_PRE AND P.TIDO_COD = 33 AND D.ARTI_COD = A.arti_cod AND
            V.VEND_COD >= :DESDE AND V.VEND_COD <= :HASTA AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            DEVT_ANULADO = 'N' AND ((P.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))AND V.terc_nit = C.terc_nit AND
            Z.zona_cod = C.zona_cod AND C.zona_cod >= :zonaini AND C.zona_cod <= :zonafin
            GROUP BY V.vend_cod, c.zona_cod, D.arti_cod , V.terc_nit
            INTO :ARTICULO, :CODVEND, :CANTIDAD, :BASE, :IVA, :CONSUMO, :TOTAL,
            :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :nit, :nomcliente, :sucursal
            DO
            BEGIN
            SELECT C.ZONA_COD, ZONA_NOM FROM CLIENTES C, ZONAS Z WHERE C.zona_cod = Z.zona_cod AND C.terc_nit = :nit INTO :codzona, :nomzona;
            select VEND_NOMBRE from VENDEDORES where VEND_COD = :CODVEND INTO :NOMVEND;
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            if (CEROS = 'S') then
                SUSPEND;
            ELSE
                if ((BASE <> 0) AND (CANTIDAD <> 0)) then
                    SUSPEND;
            END /* FOR */
        END
    if (BIN_AND(TIPO, 8) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 34 INTO :NOMTIPO;
        FOR SELECT MAX(D.ARTI_COD), MAX(P.VEND_COD), SUM(PEDE_CANT * PEDE_FACTOR), SUM((PEDE_TOTAL-PEDE_IVAMONTO-PEDE_CONSUMO)*PEDI_FACTOR), SUM(PEDE_IVAMONTO*PEDI_FACTOR), SUM(PEDE_CONSUMO), SUM(PEDE_TOTAL*PEDI_FACTOR),
            MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD), MAX(P.terc_nit), MAX(P.pedi_nomterc), MAX(P.pedi_sucursal)
            FROM PEDIDOS_DETALLE D, PEDIDOS P, PREFIJOS R, ARTICULO A, clientes C, ZONAS Z
            WHERE P.PEDI_ID = D.PEDI_ID AND P.PREF_PRE = R.PREF_PRE AND R.TIDO_COD = 34 AND D.ARTI_COD = A.arti_cod AND
            P.VEND_COD >= :DESDE AND P.VEND_COD <= :HASTA AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            PEDI_ANULADO = 'N' AND ((R.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))AND P.terc_nit = C.terc_nit AND
            Z.zona_cod = C.zona_cod AND C.zona_cod >= :zonaini AND C.zona_cod <= :zonafin
            GROUP BY P.vend_cod, c.zona_cod, D.arti_cod , P.terc_nit
            INTO :ARTICULO, :CODVEND, :CANTIDAD, :BASE, :IVA, :CONSUMO, :TOTAL,
            :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :nit, :nomcliente, :sucursal
            DO
            BEGIN
            SELECT C.ZONA_COD, ZONA_NOM FROM CLIENTES C, ZONAS Z WHERE C.zona_cod = Z.zona_cod AND C.terc_nit = :nit INTO :codzona, :nomzona;
            select VEND_NOMBRE from VENDEDORES where VEND_COD = :CODVEND INTO :NOMVEND;
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            if (CEROS = 'S') then
                SUSPEND;
            ELSE
                if ((BASE <> 0) AND (CANTIDAD <> 0)) then
                    SUSPEND;
            END /* FOR */
        END
    if (BIN_AND(TIPO, 16) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 35 INTO :NOMTIPO;
        FOR SELECT MAX(D.ARTI_COD), MAX(C.VEND_COD), SUM(CTDE_CANT * CTDE_FACTOR), SUM((CTDE_TOTAL-CTDE_IVAMONTO-CTDE_CONSUMO)*COTI_FACTOR), SUM(CTDE_IVAMONTO*COTI_FACTOR), SUM(CTDE_CONSUMO), SUM(CTDE_TOTAL*COTI_FACTOR),
            MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD), MAX(C.terc_nit), MAX(C.coti_nomterc), MAX(C.coti_sucursal)
            FROM COTIZACIONES_DETALLE D, COTIZACIONES C, PREFIJOS P, ARTICULO A, clientes T, ZONAS Z
            WHERE C.COTI_ID = D.COTI_ID AND P.PREF_PRE = C.PREF_PRE AND P.TIDO_COD = 35 AND D.ARTI_COD = A.arti_cod AND
            C.VEND_COD >= :DESDE AND C.VEND_COD <= :HASTA AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND COTI_FECHA >= :FECINI AND COTI_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            COTI_ANULADO = 'N' AND ((P.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))AND C.terc_nit = T.terc_nit AND
            Z.zona_cod = T.zona_cod AND T.zona_cod >= :zonaini AND T.zona_cod <= :zonafin
            GROUP BY C.vend_cod, t.zona_cod, D.arti_cod , C.terc_nit
            INTO :ARTICULO, :CODVEND, :CANTIDAD, :BASE, :IVA, :CONSUMO, :TOTAL,
            :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :nit, :nomcliente, :sucursal
            DO
            BEGIN
            SELECT C.ZONA_COD, ZONA_NOM FROM CLIENTES C, ZONAS Z WHERE C.zona_cod = Z.zona_cod AND C.terc_nit = :nit INTO :codzona, :nomzona;
            select VEND_NOMBRE from VENDEDORES where VEND_COD = :CODVEND INTO :NOMVEND;
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            if (CEROS = 'S') then
                SUSPEND;
            ELSE
                if ((BASE <> 0) AND (CANTIDAD <> 0)) then
                    SUSPEND;
            END /* FOR */
        END
    END
END
^

SET TERM ; ^



/* 20090813b */
/* BASE RETEFUENTE POSITIVA SI SE CONTABILIZA POR ARTICULO */
SET TERM ^ ;

CREATE OR ALTER procedure CONTABIL_FACTCOMP (
    IDDOC integer,
    IDINTER integer)
returns (
    ERROR integer,
    VER char(1),
    IDC integer)
AS
DECLARE VARIABLE PREFIJO VARCHAR(4);
DECLARE VARIABLE NUM VARCHAR(6);
DECLARE VARIABLE NUMERO VARCHAR(10);
DECLARE VARIABLE FECAUX DATE;
DECLARE VARIABLE FECHA CHAR(8);
DECLARE VARIABLE CONCEPTO CHAR(60);
DECLARE VARIABLE VENCEAUX DATE;
DECLARE VARIABLE VENCE CHAR(8);
DECLARE VARIABLE VRDTO NUMERIC(18,2);
DECLARE VARIABLE VRADIC NUMERIC(18,2);
DECLARE VARIABLE VRSUBT NUMERIC(18,2);
DECLARE VARIABLE VRIVA NUMERIC(18,2);
DECLARE VARIABLE PRTFTE NUMERIC(9,2);
DECLARE VARIABLE VRRTFTE NUMERIC(18,2);
DECLARE VARIABLE VRRTIVA NUMERIC(18,2);
DECLARE VARIABLE PRTICA NUMERIC(9,2);
DECLARE VARIABLE VRRTICA NUMERIC(18,2);
DECLARE VARIABLE VRTOTAL NUMERIC(18,2);
DECLARE VARIABLE VREXTRA NUMERIC(18,2);
DECLARE VARIABLE TIPOCOMP VARCHAR(3);
DECLARE VARIABLE PREFCONT VARCHAR(4);
DECLARE VARIABLE INVEN CHAR(1);
DECLARE VARIABLE CTAINVEN VARCHAR(20);
DECLARE VARIABLE IVA CHAR(1);
DECLARE VARIABLE CTAIVA VARCHAR(20);
DECLARE VARIABLE CONSUMO CHAR(1);
DECLARE VARIABLE CTACONSUMO VARCHAR(20);
DECLARE VARIABLE CXP CHAR(1);
DECLARE VARIABLE CTACXP VARCHAR(20);
DECLARE VARIABLE RTFTE CHAR(1);
DECLARE VARIABLE CTARTFTE VARCHAR(20);
DECLARE VARIABLE RTIVA CHAR(1);
DECLARE VARIABLE CTARTIVA VARCHAR(20);
DECLARE VARIABLE RTICA CHAR(1);
DECLARE VARIABLE CTARTICA VARCHAR(20);
DECLARE VARIABLE CTADTO VARCHAR(20);
DECLARE VARIABLE CTAADIC VARCHAR(20);
DECLARE VARIABLE CTAEXTRA VARCHAR(20);
DECLARE VARIABLE EXISTE CHAR(1);
DECLARE VARIABLE CUENTA VARCHAR(20);
DECLARE VARIABLE MONTO NUMERIC(18,2);
DECLARE VARIABLE TIPOCUEN CHAR(1);
DECLARE VARIABLE NIT VARCHAR(20);
DECLARE VARIABLE NOMBRE VARCHAR(60);
DECLARE VARIABLE PROY VARCHAR(4);
DECLARE VARIABLE CENTRO VARCHAR(4);
DECLARE VARIABLE PROYDET VARCHAR(4);
DECLARE VARIABLE CENTRODET VARCHAR(4);
DECLARE VARIABLE PORC NUMERIC(5,2);
DECLARE VARIABLE NUMITEMS INTEGER;
DECLARE VARIABLE ARTICULO VARCHAR(15);
DECLARE VARIABLE IMPINC CHAR(1);
DECLARE VARIABLE IMPTOS NUMERIC(18,2);
DECLARE VARIABLE SUMA NUMERIC(18,2);
DECLARE VARIABLE PORCIVA NUMERIC(9,2);
DECLARE VARIABLE TCTAPROV VARCHAR(20);
DECLARE VARIABLE TCTARTFTE VARCHAR(20);
DECLARE VARIABLE TCTARTIVA VARCHAR(20);
DECLARE VARIABLE TCTARTICA VARCHAR(20);
DECLARE VARIABLE CUENTAADIC VARCHAR(20);
DECLARE VARIABLE BASEADIC VARCHAR(20);
DECLARE VARIABLE PORCADIC NUMERIC(5,2);
DECLARE VARIABLE VALORADIC NUMERIC(18,2);
DECLARE VARIABLE DBADIC CHAR(1);
DECLARE VARIABLE FOMENTO CHAR(2);
DECLARE VARIABLE BODE_DET CHAR(2);
DECLARE VARIABLE NUMPROV VARCHAR(10);
DECLARE VARIABLE MERCANCIA NUMERIC(18,2);
declare variable FACTOR DOUBLE PRECISION;
DECLARE VARIABLE MENORV CHAR(2);
declare variable DIG INTEGER;
declare variable NETO NUMERIC(18,2);
declare variable CENT CHAR(1);
declare variable ANULADO CHAR(1);
declare variable ERRORC INTEGER;
BEGIN
  /* INTERFACE */
  EXISTE = 'N';
  SELECT 'S', TICO_COD, PRCO_PRE, INCO_INVEN, INCO_IVA, INCO_CONSUMO, INCO_CXP, INCO_RTFTE, INCO_RTIVA, INCO_RTICA, INCO_CTAINVEN, INCO_CTAIVA, INCO_CTACONSUMO, INCO_CTADTO, INCO_CTAADIC, INCO_CTAEXTRA, INCO_CTACXP, INCO_CTARTFTE, INCO_CTARTIVA, INCO_CTARTICA, INCO_CONFIRMAR, INCO_CENTRO
    FROM INTERFAZ_COMPRAS WHERE INCO_ID = :IDINTER INTO :EXISTE, :TIPOCOMP, :PREFCONT, :INVEN, :IVA, :CONSUMO, :CXP, :RTFTE, :RTIVA, :RTICA, :CTAINVEN, :CTAIVA, :CTACONSUMO, :CTADTO, :CTAADIC, :CTAEXTRA, :CTACXP, :CTARTFTE, :CTARTIVA, :CTARTICA, :VER, :CENT;
  if (EXISTE = 'S') then
    BEGIN
    /* BORRE CONTABILIZACION PREVIA */
    DELETE FROM CONTABILIZACION WHERE CNTB_TIPOREF = 21 AND CNTB_IDREF = :IDDOC;
    /* ENCABEZADO DE LA FACTURA */
    SELECT PREF_PRE, FACO_NUMERO, FACO_FECHA, F.TERC_NIT, FACO_IMPTOS, FACO_VENCE, FACO_DTOMONTO, FACO_ADICIONAL, FACO_IVAMONTO, FACO_EXTRA, FACO_TOTAL, FACO_RTFTEPORC, FACO_RTFTEMONTO, FACO_RTIVAPOR, FACO_RTIVAMONTO, FACO_RTICAPOR, FACO_RTICAMONTO, TERC_NOM, PROV_CTARTFTE, PROV_CTARTIVA, PROV_CTARTICA, PROV_CTAPAGAR, FACO_NUMPROV, FACO_ANULADO
        FROM FACTURAS_COMPRA F, TERCEROS T, PROVEEDORES P WHERE FACO_ID = :IDDOC AND F.TERC_NIT = T.TERC_NIT AND T.TERC_NIT = P.TERC_NIT
        INTO :PREFIJO, :NUM, :FECAUX, :NIT, :IMPINC, :VENCEAUX, :VRDTO, :VRADIC, :VRIVA, :VREXTRA, :VRTOTAL, :PRTFTE, :VRRTFTE, :PORC, :VRRTIVA, :PRTICA, :VRRTICA, :NOMBRE, TCTARTFTE, TCTARTIVA, TCTARTICA, TCTAPROV, :NUMPROV, :ANULADO;
    /* CENTRO DE LA BODEGA */
    IF (CENT = 'B') THEN
        SELECT BODE_CENTRO, BODE_PROY FROM BODEGA B, FACTURAS_COMPRA F WHERE B.BODE_COD = F.BODE_COD AND F.FACO_ID = :IDDOC INTO :CENTRO, :PROY;
    ELSE
        SELECT PREF_CENTRO,PREF_PROY  FROM PREFIJOS P, FACTURAS_COMPRA F WHERE P.PREF_PRE = F.PREF_PRE AND F.FACO_ID = :IDDOC AND P.TIDO_COD = 21 INTO :CENTRO, :PROY;
    if (ANULADO = 'N') then
        BEGIN
        NUMERO = PREFIJO || NUM;
        VRSUBT = VRTOTAL - VREXTRA - VRIVA;
        MERCANCIA = VRSUBT - VRADIC + VRDTO;
        EXECUTE PROCEDURE FECHA_A_CONTA(:FECAUX) returning_values (:FECHA);
        EXECUTE PROCEDURE FECHA_A_CONTA(:VENCEAUX) returning_values (:VENCE);
        if (NUMPROV IS NULL) then
            NUMPROV = NUMERO;
        CONCEPTO = 'FC No.' || NUMERO || '-' || SUBSTR(NOMBRE,1,26) || '-NPROV.' || NUMPROV;
        IDC = GEN_ID(ID_CONTABILIZA, 1);
        INSERT INTO CONTABILIZACION (CNTB_ID, CNTB_TIPOCOMP, CNTB_PREFCNT, CNTB_NUMERO, CNTB_FECHA, CNTB_CONCEPTO, CNTB_REF, CNTB_TIPOREF, CNTB_IDREF, CNTB_PREFREF, CNTB_NUMREF, CNTB_PROCESADO)
            VALUES (:IDC, :TIPOCOMP, :PREFCONT, :NUM, :FECHA, :CONCEPTO, '', 21, :IDDOC, :PREFIJO, :NUM, 'N');
        NUMITEMS = 0;
        SUMA = 0;
        NETO = 0;
        ERROR = 0;
        EXECUTE PROCEDURE LEE_CONFIGURACION('COMPRAS', 'FACTURAS', 'USAR IMPOCONSUMO COMO PORCENTAJE DE FOMENTO') RETURNING_VALUES (FOMENTO);
        EXECUTE PROCEDURE lee_configuracion('COMPRAS','FACTURAS','DESCUENTO Y VALOR ADICIONAL DEL DOCUMENTO COMO MENOR VALOR DEL COSTO') returning_values (:MENORV);
        SELECT SUM(FCDE_consumo) from facturas_compras_detalle where faco_id = :IDDOC into :valoradic;
        if (MENORV = 'SI') then
            if (MERCANCIA <> 0) then
                FACTOR = (CAST(VRSUBT AS DOUBLE PRECISION) - VALORADIC) / (CAST(MERCANCIA AS DOUBLE PRECISION) - VALORADIC);
            ELSE
                FACTOR = 1;
        ELSE
           FACTOR = 1;
        SELECT CAST(CONF_VALOR AS INTEGER) FROM CONFIGURACION WHERE CONF_MODULO = 'COMPRAS' AND CONF_CATEGORIA = 'GENERAL' AND CONF_PROPIEDAD = 'REDONDEO AL MULTIPLO DE DIEZ EN TOTALES' INTO :DIG;
        if (INVEN = 'A') then
            BEGIN
            FOR SELECT MAX(COAR_CTACOMP), SUM(CAST(FCDE_CANT AS DOUBLE PRECISION) * (FCDE_PRUNIT-FCDE_DTOMONTO)), SUM(FCDE_IVAMONTO), SUM(FCDE_CONSUMO), MAX(F.BODE_COD)
                FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_COMPRAS_DETALLE F WHERE F.FACO_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD
                GROUP BY COAR_CTACOMP, F.BODE_COD INTO :CTAINVEN, :MONTO, :IMPTOS, :VALORADIC, :BODE_DET DO
                BEGIN
                IF (CENT = 'B') THEN
                  SELECT BODE_CENTRO, BODE_PROY FROM BODEGA WHERE BODE_COD = :BODE_DET INTO :CENTRODET, :PROYDET;
                if (IMPINC = 'S') then
                    BEGIN
                    MONTO = MONTO - IMPTOS;
                    if (FOMENTO <> 'SI' ) then
                        MONTO = MONTO - VALORADIC;
                    END
                MONTO = MONTO * FACTOR;
                execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                EXECUTE PROCEDURE CUENTA_INTERFAZ(21, :IDDOC, :CTAINVEN, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    FOR SELECT F.ARTI_COD, (FCDE_CANT * (FCDE_PRUNIT-FCDE_DTOMONTO)), FCDE_IVAMONTO, FCDE_CONSUMO
                        FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_COMPRAS_DETALLE F WHERE F.FACO_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTACOMP = :CUENTA
                        INTO :ARTICULO, :MONTO, :IMPTOS, :VALORADIC DO
                        BEGIN
                        if (IMPINC = 'S') then
                            BEGIN
                            MONTO = MONTO - IMPTOS;
                            if (FOMENTO <> 'SI' ) then
                                MONTO = MONTO - VALORADIC;
                            END
                        MONTO = MONTO * FACTOR;
                        execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                        IF (CENT = 'B') THEN
                           INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                               VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROYDET, :CENTRODET, NULL, NULL, NULL, :ARTICULO, 0, 0);
                        ELSE
                           INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                               VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                        NUMITEMS = NUMITEMS + 1;
                        NETO = NETO + MONTO;
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    IF (CENT = 'B') THEN
                       INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                           VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROYDET, :CENTRODET, :NUMERO, NULL, :VENCE, NULL, 0, 21);
                    ELSE
                       INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                           VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 21);
                    NUMITEMS = NUMITEMS + 1;
                    NETO = NETO + MONTO;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    IF (CENT = 'B') THEN
                       INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                           VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROYDET, :CENTRODET, NULL, NULL, NULL, NULL, 0, 0);
                    ELSE
                       INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                           VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NUMITEMS = NUMITEMS + 1;
                    NETO = NETO + MONTO;
                    END
                END
            END
        if (INVEN = 'K') then
            BEGIN
            FOR SELECT SUM(CAST(FCDE_CANT AS DOUBLE PRECISION) * (FCDE_PRUNIT-FCDE_DTOMONTO)), SUM(FCDE_IVAMONTO), SUM(FCDE_CONSUMO), MAX(BODE_COD)
                FROM FACTURAS_COMPRAS_DETALLE WHERE FACO_ID = :IDDOC GROUP BY BODE_COD INTO :MONTO, :IMPTOS, :VALORADIC, :BODE_DET Do
                BEGIN
                  IF (CENT = 'B') THEN
                    SELECT BODE_CENTRO, BODE_PROY FROM BODEGA WHERE BODE_COD = :BODE_DET INTO :CENTRODET, :PROYDET;
                  if (IMPINC = 'S') then
                   BEGIN
                    MONTO = MONTO - IMPTOS;
                    if (FOMENTO <> 'SI' ) then
                      MONTO = MONTO - VALORADIC;
                   END
                  MONTO = MONTO * FACTOR;
                  execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                  execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                  EXECUTE PROCEDURE CUENTA_INTERFAZ(21, :IDDOC, :CTAINVEN, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                  if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                  if (TIPOCUEN = 'I') then
                   BEGIN
                    FOR SELECT ARTI_COD, (FCDE_CANT * (FCDE_PRUNIT-FCDE_DTOMONTO)), FCDE_IVAMONTO, FCDE_CONSUMO
                      FROM FACTURAS_COMPRAS_DETALLE WHERE FACO_ID = :IDDOC INTO :ARTICULO, :MONTO, :IMPTOS, :VALORADIC DO
                       BEGIN
                       if (IMPINC = 'S') then
                        BEGIN
                         MONTO = MONTO - IMPTOS;
                         if (FOMENTO <> 'SI' ) then
                            MONTO = MONTO - VALORADIC;
                        END
                       MONTO = MONTO * FACTOR;
                       execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                       execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                       IF (CENT = 'B') THEN
                          INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                             VALUES (:IDC, :NUMITEMS, :CTAINVEN, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROYDET, :CENTRODET, NULL, NULL, NULL, :ARTICULO, 0, 0);
                       ELSE
                          INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                             VALUES (:IDC, :NUMITEMS, :CTAINVEN, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                       NUMITEMS = NUMITEMS + 1;
                       NETO = NETO + MONTO;
                       END
                   END
                  if (TIPOCUEN = 'C') then
                   BEGIN
                    IF (CENT = 'B') THEN
                       INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                         VALUES (:IDC, :NUMITEMS, :CTAINVEN, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROYDET, :CENTRODET, :NUMERO, NULL, :VENCE, NULL, 0, 21);
                    ELSE
                       INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                         VALUES (:IDC, :NUMITEMS, :CTAINVEN, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 21);
                    NUMITEMS = NUMITEMS + 1;
                    NETO = NETO + MONTO;
                   END
                  if (TIPOCUEN = 'N') then
                   BEGIN
                    IF (CENT = 'B') THEN
                       INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                          VALUES (:IDC, :NUMITEMS, :CTAINVEN, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROYDET, :CENTRODET, NULL, NULL, NULL, NULL, 0, 0);
                    ELSE
                       INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                          VALUES (:IDC, :NUMITEMS, :CTAINVEN, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NUMITEMS = NUMITEMS + 1;
                    NETO = NETO + MONTO;
                   END
                END
            END
        /* EL IVA */
        if (IVA = 'A') then
            BEGIN
            FOR SELECT MAX(COAR_CTAIVAC), SUM(FCDE_IVAMONTO), SUM(CAST(FCDE_CANT AS DOUBLE PRECISION) * (FCDE_PRUNIT-FCDE_DTOMONTO)), SUM(FCDE_CONSUMO)
                FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_COMPRAS_DETALLE F
                WHERE F.FACO_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND FCDE_IVAMONTO <> 0
                GROUP BY COAR_CTAIVAC
                INTO :CTAIVA, :IMPTOS, :MONTO, :VALORADIC DO
              if (IMPTOS <> 0) then
                BEGIN
                IMPTOS = CAST(IMPTOS AS DOUBLE PRECISION) * VRSUBT / MERCANCIA;
                if (IMPINC = 'S') then
                    BEGIN
                    MONTO = MONTO - IMPTOS;
                    if (FOMENTO <> 'SI' ) then
                        MONTO = MONTO - VALORADIC;
                    END
                MONTO = CAST(MONTO AS DOUBLE PRECISION) * VRSUBT / MERCANCIA;
                execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                EXECUTE PROCEDURE CUENTA_INTERFAZ(21, :IDDOC, :CTAIVA, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    FOR SELECT F.ARTI_COD, FCDE_IVAMONTO, (FCDE_CANT * (FCDE_PRUNIT-FCDE_DTOMONTO)), TAIV_PORC, FCDE_CONSUMO
                        FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_COMPRAS_DETALLE F, TARIFA_IVA T WHERE F.FACO_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTAIVAV = :CUENTA AND A.TAIV_COD = T.TAIV_COD
                        INTO :ARTICULO, :IMPTOS, :MONTO, :PORCIVA, :VALORADIC
                    DO
                        BEGIN
                        IMPTOS = CAST(IMPTOS AS DOUBLE PRECISION) * VRSUBT / MERCANCIA;
                        if (IMPINC = 'S') then
                            BEGIN
                            MONTO = MONTO - IMPTOS;
                            if (FOMENTO <> 'SI' ) then
                                MONTO = MONTO - VALORADIC;
                            END
                        MONTO = CAST(MONTO AS DOUBLE PRECISION) * VRSUBT / MERCANCIA;
                        execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :IMPTOS, 0, :MONTO, :PORCIVA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                        NUMITEMS = NUMITEMS + 1;
                        NETO = NETO + IMPTOS;
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :IMPTOS, 0, :MONTO, :IMPTOS*100/:MONTO, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 21);
                    NUMITEMS = NUMITEMS + 1;
                    NETO = NETO + IMPTOS;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :IMPTOS, 0, :MONTO, CAST(:IMPTOS AS DOUBLE PRECISION)*100/CAST(:MONTO AS DOUBLE PRECISION), :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NUMITEMS = NUMITEMS + 1;
                    NETO = NETO + IMPTOS;
                    END
                END
            END
        if (IVA = 'K') then /* IVA EN CTA CONSTANTE */
            BEGIN
            SELECT SUM(FCDE_IVAMONTO), SUM(CAST(FCDE_CANT AS DOUBLE PRECISION) * (FCDE_PRUNIT-FCDE_DTOMONTO)), SUM(FCDE_CONSUMO)
                FROM FACTURAS_COMPRAS_DETALLE F
                WHERE F.FACO_ID = :IDDOC  AND FCDE_IVAMONTO <> 0
                INTO :IMPTOS, :MONTO, :VALORADIC;
            if (IMPTOS <> 0) then
                BEGIN
                IMPTOS = CAST(IMPTOS AS DOUBLE PRECISION) * VRSUBT / MERCANCIA;
                if (IMPINC = 'S') then
                    BEGIN
                    MONTO = MONTO - IMPTOS;
                    if (FOMENTO <> 'SI' ) then
                        MONTO = MONTO - VALORADIC;
                    END
                MONTO = CAST(MONTO AS DOUBLE PRECISION) * VRSUBT / MERCANCIA;
                execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                EXECUTE PROCEDURE CUENTA_INTERFAZ(21, :IDDOC, :CTAIVA, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    FOR SELECT F.ARTI_COD, (FCDE_CANT * (FCDE_PRUNIT-FCDE_DTOMONTO)), FCDE_IVAMONTO, TAIV_PORC, FCDE_CONSUMO
                        FROM ARTICULO A, FACTURAS_COMPRAS_DETALLE F, TARIFA_IVA T WHERE F.FACO_ID = :IDDOC AND A.TAIV_COD = T.TAIV_COD
                        INTO :ARTICULO, :MONTO, :IMPTOS, :PORCIVA, :VALORADIC DO
                        BEGIN
                        IMPTOS = CAST(IMPTOS AS DOUBLE PRECISION) * VRSUBT / MERCANCIA;
                        if (IMPINC = 'S') then
                            BEGIN
                            MONTO = MONTO - IMPTOS;
                            if (FOMENTO <> 'SI' ) then
                                MONTO = MONTO - VALORADIC;
                            END
                        MONTO = CAST(MONTO AS DOUBLE PRECISION) * VRSUBT / MERCANCIA;
                        execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                        if (IMPTOS <> 0) then
                            BEGIN
                            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                VALUES (:IDC, :NUMITEMS, :CTAIVA, :CONCEPTO, '', :IMPTOS, 0, :MONTO, :PORCIVA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                            NUMITEMS = NUMITEMS + 1;
                            NETO = NETO + IMPTOS;
                            END
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NUMITEMS, :CTAIVA, :CONCEPTO, '', :IMPTOS, 0, :MONTO, :IMPTOS*100/:MONTO, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 21);
                    NUMITEMS = NUMITEMS + 1;
                    NETO = NETO + IMPTOS;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NUMITEMS, :CTAIVA, :CONCEPTO, '', :IMPTOS, 0, :MONTO, :IMPTOS*100/:MONTO, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NUMITEMS = NUMITEMS + 1;
                    NETO = NETO + IMPTOS;
                    END
                END
            END
        /* EL IMPOCONSUMO */
        if (CONSUMO = 'A') then
            BEGIN
            FOR SELECT MAX(COAR_CTACONS), SUM(FCDE_CONSUMO) FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_COMPRAS_DETALLE F
                WHERE F.FACO_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD GROUP BY COAR_CTACONS INTO :CTACONSUMO, :IMPTOS
            DO
              if (IMPTOS <> 0) then
                BEGIN
                execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                EXECUTE PROCEDURE CUENTA_INTERFAZ(21, :IDDOC, :CTACONSUMO, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (FOMENTO <> 'SI') then
                    BEGIN
                    if (TIPOCUEN = 'I') then
                        BEGIN
                        FOR SELECT F.ARTI_COD, FCDE_CONSUMO FROM ARTICULO A, FACTURAS_COMPRAS_DETALLE F WHERE F.FACO_ID = :IDDOC INTO :ARTICULO, :IMPTOS
                            DO
                            BEGIN
                            if (IMPTOS <> 0) then
                                BEGIN
                                execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                    VALUES (:IDC, :NUMITEMS, :CTACONSUMO, :CONCEPTO, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                                NUMITEMS = NUMITEMS + 1;
                                NETO = NETO + IMPTOS;
                                END
                            END
                        END
                    if (TIPOCUEN = 'C') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CTACONSUMO, :CONCEPTO, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                        NUMITEMS = NUMITEMS + 1;
                        NETO = NETO + IMPTOS;
                        END
                    if (TIPOCUEN = 'N') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CTACONSUMO, :CONCEPTO, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NUMITEMS = NUMITEMS + 1;
                        NETO = NETO + IMPTOS;
                        END
                    END
                ELSE
                    BEGIN
                    if (TIPOCUEN = 'I') then
                        BEGIN
                        FOR SELECT F.ARTI_COD, FCDE_CONSUMO FROM ARTICULO A, FACTURAS_COMPRAS_DETALLE F WHERE F.FACO_ID = :IDDOC INTO :ARTICULO, :IMPTOS
                            DO
                            BEGIN
                            if (IMPTOS <> 0) then
                                BEGIN
                                execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                    VALUES (:IDC, :NUMITEMS, :CTACONSUMO, :CONCEPTO, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                                NUMITEMS = NUMITEMS + 1;
                                NETO = NETO - IMPTOS;
                                END
                            END
                        END
                    if (TIPOCUEN = 'C') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CTACONSUMO, :CONCEPTO, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                        NUMITEMS = NUMITEMS + 1;
                        NETO = NETO - IMPTOS;
                        END
                    if (TIPOCUEN = 'N') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CTACONSUMO, :CONCEPTO, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NUMITEMS = NUMITEMS + 1;
                        NETO = NETO - IMPTOS;
                        END
                    END
                END
            END
        if (CONSUMO = 'K') then /* CONSUMO EN CTA CONSTANTE */
            BEGIN
            SELECT SUM(FCDE_CONSUMO) FROM FACTURAS_COMPRAS_DETALLE F WHERE F.FACO_ID = :IDDOC INTO :IMPTOS;
            if (IMPTOS <> 0) then
              BEGIN
              execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
              /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
              EXECUTE PROCEDURE CUENTA_INTERFAZ(21, :IDDOC, :CTACONSUMO, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
              if (ERRORC <> 0) then
                ERROR = ERROR + 1;
              if (FOMENTO <> 'SI') then
                BEGIN
                /* DEPENDE DEL TIPO DE CUENTA */
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT F.ARTI_COD, FCDE_CONSUMO FROM ARTICULO A, FACTURAS_COMPRAS_DETALLE F WHERE F.FACO_ID = :IDDOC INTO :ARTICULO, :IMPTOS
                        DO
                        BEGIN
                        if (IMPTOS <> 0) then
                            BEGIN
                            execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                VALUES (:IDC, :NUMITEMS, :CTACONSUMO, :CONCEPTO, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                            NUMITEMS = NUMITEMS + 1;
                            NETO = NETO + IMPTOS;
                            END
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    /* INSERTE EL REGISTRO DE LA BASE */
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NUMITEMS, :CTACONSUMO, :CONCEPTO, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    NUMITEMS = NUMITEMS + 1;
                    NETO = NETO + IMPTOS;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NUMITEMS, :CTACONSUMO, :CONCEPTO, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NUMITEMS = NUMITEMS + 1;
                    NETO = NETO + IMPTOS;
                    END
                END
              ELSE
                BEGIN
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT F.ARTI_COD, FCDE_CONSUMO FROM ARTICULO A, FACTURAS_COMPRAS_DETALLE F WHERE F.FACO_ID = :IDDOC INTO :ARTICULO, :IMPTOS
                        DO
                        BEGIN
                        if (IMPTOS <> 0) then
                            BEGIN
                           execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                           INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                VALUES (:IDC, :NUMITEMS, :CTACONSUMO, :CONCEPTO, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                            NUMITEMS = NUMITEMS + 1;
                            NETO = NETO - IMPTOS;
                            END
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    /* INSERTE EL REGISTRO DE LA BASE */
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NUMITEMS, :CTACONSUMO, :CONCEPTO, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    NUMITEMS = NUMITEMS + 1;
                    NETO = NETO - IMPTOS;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NUMITEMS, :CTACONSUMO, :CONCEPTO, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NUMITEMS = NUMITEMS + 1;
                    NETO = NETO - IMPTOS;
                    END
                END
              end
            END
        /* DESCUENTO */
        if ((CTADTO IS NOT NULL) AND
            (CTADTO <> '')) THEN
          BEGIN
          execute procedure redondee(VRDTO, DIG) returning_values (VRDTO);
          if (VRDTO <> 0) then
            begin
            /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
            EXECUTE PROCEDURE CUENTA_INTERFAZ(21, :IDDOC, :CTADTO, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :VRDTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 21);
                NUMITEMS = NUMITEMS + 1;
                NETO = NETO - VRDTO;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                /* INSERTE EL REGISTRO DE LA BASE */
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :VRDTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NUMITEMS = NUMITEMS + 1;
                NETO = NETO - VRDTO;
                END
            end
          END
        /* VALOR ADIC */
        if ((CTAADIC IS NOT NULL) AND
            (CTAADIC <> '')) THEN
          BEGIN
          execute procedure redondee(VRADIC, DIG) returning_values (VRADIC);
          if (VRADIC <> 0) then
            begin
            /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
            EXECUTE PROCEDURE CUENTA_INTERFAZ(21, :IDDOC, :CTAADIC, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :VRADIC, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 21);
                NUMITEMS = NUMITEMS + 1;
                NETO = NETO + VRADIC;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :VRADIC, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NUMITEMS = NUMITEMS + 1;
                NETO = NETO + VRADIC;
                END
            end
          END
        /* VALOR EXTRA */
        if ((CTAEXTRA IS NOT NULL) AND
            (CTAEXTRA <> '')) THEN
          BEGIN
          execute procedure redondee(VREXTRA, DIG) returning_values (VREXTRA);
          if (VREXTRA <> 0) then
            begin
            /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
            EXECUTE PROCEDURE CUENTA_INTERFAZ(21, :IDDOC, :CTAEXTRA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :VREXTRA, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 21);
                NUMITEMS = NUMITEMS + 1;
                NETO = NETO + VREXTRA;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :VREXTRA, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NUMITEMS = NUMITEMS + 1;
                NETO = NETO + VREXTRA;
                END
            end
          END

        /* DESCUENTE EL IMPOCONSUMO */
        SELECT SUM(FCDE_CONSUMO) FROM FACTURAS_COMPRAS_DETALLE F WHERE F.FACO_ID = :IDDOC INTO :IMPTOS;
        if (IMPTOS IS NULL) then
            IMPTOS = 0;
        vrsubt = vrsubt - IMPTOS;
        /* RETENCION FUENTE */
        if ((RTFTE = 'P') or (RTFTE = 'K')) then
          BEGIN
          execute procedure redondee(VRRTFTE, DIG) returning_values (VRRTFTE);
          if (VRRTFTE <> 0) then
            begin
            if (RTFTE = 'P') then
                CTARTFTE = TCTARTFTE;
            EXECUTE PROCEDURE CUENTA_INTERFAZ(21, :IDDOC, :CTARTFTE, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :VRRTFTE, (:VRSUBT*-1), :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NUMITEMS = NUMITEMS + 1;
                NETO = NETO - VRRTFTE;
                SUMA = VRRTFTE;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :VRRTFTE, (:VRSUBT*-1), :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NUMITEMS = NUMITEMS + 1;
                NETO = NETO - VRRTFTE;
                SUMA = VRRTFTE;
                END
            end
          END
        if (RTFTE = 'A') then
          BEGIN
          FOR SELECT MAX(COAR_CTARTFTE), MAX(COAR_RTFTE), MIN(COAR_RTBASE), SUM(FCDE_TOTAL-FCDE_IVAMONTO-FCDE_CONSUMO), SUM((FCDE_TOTAL-FCDE_IVAMONTO-FCDE_CONSUMO)*COAR_RTFTE)
            FROM CONTABIL_ARTICULO C, FACTURAS_COMPRAS_DETALLE F
            WHERE F.faco_id = :IDDOC AND F.ARTI_COD = C.ARTI_COD
            GROUP BY COAR_CTARTFTE
            INTO :CTARTFTE, :PRTFTE, :baseadic,  :MONTO, :VRRTFTE
            DO
            BEGIN
            MONTO = MONTO * FACTOR * -1;
            if (ABS(MONTO) >= :baseadic) then
                BEGIN
                VRRTFTE = VRRTFTE * FACTOR / 100;
                execute procedure redondee(VRRTFTE, DIG) returning_values (VRRTFTE);
                execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                if (VRRTFTE <> 0) then
                    BEGIN
                    EXECUTE PROCEDURE CUENTA_INTERFAZ(21, :IDDOC, :CTARTFTE, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
                    if (ERRORC <> 0) then
                        ERROR = ERROR + 1;
                    if (TIPOCUEN = 'C') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :VRRTFTE, :MONTO, :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                        NUMITEMS = NUMITEMS + 1;
                        NETO = NETO - VRRTFTE;
                        SUMA = VRRTFTE;
                        END
                    if (TIPOCUEN = 'N') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :VRRTFTE, :MONTO, :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NUMITEMS = NUMITEMS + 1;
                        NETO = NETO - VRRTFTE;
                        SUMA = VRRTFTE;
                        END
                    end
                end
              END
          END
        /* RETENCION IVA */
        if ((RTIVA = 'P') or (RTIVA = 'K')) then
          BEGIN
          execute procedure redondee(VRRTIVA, DIG) returning_values (VRRTIVA);
          if (VRRTIVA <> 0) then
            begin
            if (RTIVA = 'P') then
                CTARTIVA = TCTARTIVA;
            EXECUTE PROCEDURE CUENTA_INTERFAZ(21, :IDDOC, :CTARTIVA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :VRRTIVA, (:VRIVA*-1), :PORC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 21);
                NUMITEMS = NUMITEMS + 1;
                NETO = NETO - VRRTIVA;
                SUMA = SUMA + VRRTIVA;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :VRRTIVA, (:VRIVA*-1), :PORC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NUMITEMS = NUMITEMS + 1;
                NETO = NETO - VRRTIVA;
                SUMA = SUMA + VRRTIVA;
                END
            end
          END
        /* RETENCION DE ICA */
        if ((RTICA = 'P') or (RTICA = 'K')) then
          BEGIN
          execute procedure redondee(VRRTICA, DIG) returning_values (VRRTICA);
          if (VRRTICA <> 0) then
            begin
            if (RTICA = 'P') then
                CTARTICA = TCTARTICA;
            EXECUTE PROCEDURE CUENTA_INTERFAZ(21, :IDDOC, :CTARTICA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :VRRTICA, (:VRSUBT*-1), :PRTICA, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 21);
                NUMITEMS = NUMITEMS + 1;
                NETO = NETO - VRRTICA;
                SUMA = SUMA + VRRTICA;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :VRRTICA, (:VRSUBT*-1), :PRTICA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NUMITEMS = NUMITEMS + 1;
                NETO = NETO - VRRTICA;
                SUMA = SUMA + VRRTICA;
                END
            end
          END
        /* CIERRE EL COMPROBANTE CONTRA LA CUENTA DEL TERCERO O LA CONSTANTE */
        if ((CXP = 'P') or (CXP = 'K')) then
            BEGIN
            SUMA = VRTOTAL - SUMA;
            execute procedure redondee(SUMA, DIG) returning_values (SUMA);
            if (CXP = 'P') then
                CTACXP = TCTAPROV;
            EXECUTE PROCEDURE CUENTA_INTERFAZ(21, :IDDOC, :CTACXP, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :SUMA, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 21);
            if (TIPOCUEN = 'N') then
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :SUMA, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NETO = NETO - SUMA;
            NUMITEMS = NUMITEMS + 1;
            END
        /* recorra las cuentas adicionales */
        FOR SELECT INCC_CUENTA, INCC_BASE, INCC_PORC, INCC_VALOR, INCC_DB FROM INTERFAZ_COMPRAS_CTAS
            WHERE INCO_ID = :IDINTER INTO :CUENTAADIC, :BASEADIC, :PORCADIC, :VALORADIC, :DBADIC
            DO
            BEGIN
            if (VALORADIC <> 0) then
                MONTO = VALORADIC;
            ELSE
                BEGIN
                if (:BASEADIC = 'SUBTOTAL') then
                    VALORADIC = VRTOTAL - VREXTRA - VRIVA - VRADIC + VRDTO;
                if (:BASEADIC = 'DESCUENTO') then
                    VALORADIC = VRDTO;
                if (:BASEADIC = 'IVA') then
                    VALORADIC = VRIVA;
                if (:BASEADIC = 'CONSUMO') then
                    SELECT SUM(FCDE_CONSUMO) FROM FACTURAS_COMPRAS_DETALLE F WHERE F.FACO_ID = :IDDOC INTO :VALORADIC;
                if (:BASEADIC = 'ADICIONAL') then
                    VALORADIC = VRADIC;
                if (:BASEADIC = 'EXTRA') then
                    VALORADIC = VREXTRA;
                if (:BASEADIC = 'TOTAL') then
                    VALORADIC = VRTOTAL;
                MONTO = CAST(VALORADIC AS DOUBLE PRECISION) * PORCADIC / 100;
                END
            if (MONTO <> 0) then
                BEGIN
                execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                EXECUTE PROCEDURE CUENTA_INTERFAZ(21, :IDDOC, :CUENTAADIC, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'C') then
                    BEGIN
                    if (DBADIC = 'S') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTAADIC, :CONCEPTO, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                        SUMA = SUMA + MONTO;
                        NETO = NETO + MONTO;
                        END
                    ELSE
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTAADIC, :CONCEPTO, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                        SUMA = SUMA - MONTO;
                        NETO = NETO - MONTO;
                        END
                    NUMITEMS = NUMITEMS + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    if (DBADIC = 'S') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTAADIC, :CONCEPTO, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        SUMA = SUMA + MONTO;
                        NETO = NETO + MONTO;
                        END
                    ELSE
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTAADIC, :CONCEPTO, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        SUMA = SUMA - MONTO;
                        NETO = NETO - MONTO;
                        END
                    NUMITEMS = NUMITEMS + 1;
                    END
                END
            END
        if (NETO <> 0) then
            BEGIN
            EXECUTE PROCEDURE lee_configuracion ('CONTABILIDAD','GENERAL','CUENTA PARA CUADRAR COMPROBANTES DESCUADRADOS DE INTERFAZ') returning_values (:ctaadic);
            if (ctaadic <> '') then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(21, :IDDOC, :CTAADIC, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'C') then
                    BEGIN
                    if (NETO < 0) then
                        BEGIN
                        NETO = NETO * -1;
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :NETO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                        END
                    ELSE
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :NETO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                        END
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    if (NETO < 0) then
                        BEGIN
                        NETO = NETO * -1;
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :NETO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        END
                    ELSE
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :NETO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        END
                    END
                END
            END
        END
    if (ERROR > 0) then
        VER = 'S';
    SUSPEND;
    END
ELSE
    BEGIN
    EXECUTE PROCEDURE ERROR (21, :IDDOC, :PREFIJO, 1);
    ERROR = ERROR + 1;
    VER = 'S';
    SUSPEND;
    END
END
^

SET TERM ; ^

    SET TERM ^ ;

ALTER PROCEDURE CONTABILICE_COMP_SIMPLIFICADO(
    IDI INTEGER)
RETURNS (
    ID INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    ESTADO VARCHAR(20),
    IDC INTEGER)
AS
 /*$$IBE$$ DECLARE VARIABLE VER CHAR(2);
declare variable ERROR INTEGER; $$IBE$$*/ 
BEGIN /*$$IBE$$ 
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;
   $$IBE$$*/ /* 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; */ /*$$IBE$$ 
  EXECUTE PROCEDURE CONTABIL_FACTCOMP (:ID, :IDI) RETURNING_VALUES (:ERROR, VER, :IDC);
  if (ERROR = 0) then
    BEGIN
 $$IBE$$*/ /*    EXECUTE PROCEDURE CONTABILIZA_PENDIENTE (:IDC); */ /*$$IBE$$ 
    ESTADO = 'OK';
    END
  ELSE
    ESTADO = 'ERROR';
  suspend;
  END
 $$IBE$$*/ SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE FACTCOMP_SIN_CONTABILIDAD(
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    ID INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    ESTADO VARCHAR(20),
    IDI INTEGER,
    IDC INTEGER)
AS
 /*$$IBE$$ DECLARE VARIABLE VER CHAR(2);
declare variable FECICNT VARCHAR(10);
declare variable FECFCNT VARCHAR(10);
declare variable ERROR INTEGER;
declare variable idref INTEGER; $$IBE$$*/ 
BEGIN /*$$IBE$$ 
EXECUTE PROCEDURE fecha_a_conta(FECINI) returning_values (FECICNT);
EXECUTE PROCEDURE fecha_a_conta(FECFIN) returning_values (FECFCNT);
FOR SELECT FACO_ID, PREF_PRE, FACO_NUMERO FROM FACTURAS_COMPRA WHERE FACO_ANULADO = 'N' AND
    FACO_FECHA >= :FECINI AND FACO_FECHA <= :FECFIN ORDER BY FACO_ID
    INTO :ID, :PREF, :NUMERO
DO
  BEGIN
  idref = null;
  SELECT ENCO_IDREF FROM COMPROBANTE_ENCABEZADO WHERE ENCO_TIPOREF = 21 AND ENCO_FECHA >= :FECICNT AND ENCO_FECHA <= :FECFCNT and ENCO_IDREF = :id into :idref;
  if (idref IS NULL) then
  begin
   ESTADO = 'PROCESANDO';
   SUSPEND;
   SELECT MAX(INCO_ID) FROM INTERFAZ_COMPRAS WHERE PREF_PRE = :PREF AND TIDO_COD = 21 INTO :IDI;
   EXECUTE PROCEDURE CONTABIL_FACTCOMP (:ID, :IDI) RETURNING_VALUES (:ERROR, VER, :IDC);
   if (ERROR = 0) then
    BEGIN
    EXECUTE PROCEDURE CONTABILIZA_PENDIENTE (:IDC);
    ESTADO = 'OK';
    END
   ELSE
    ESTADO = 'ERROR';
   suspend;
  End
  END
 $$IBE$$*/ SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

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

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE FACTCOMP_SIN_CONTABILIDAD(
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    ID INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    ESTADO VARCHAR(20),
    IDI INTEGER,
    IDC INTEGER)
AS
DECLARE VARIABLE VER CHAR(2);
declare variable FECICNT VARCHAR(10);
declare variable FECFCNT VARCHAR(10);
declare variable ERROR INTEGER;
declare variable idref INTEGER;
BEGIN
EXECUTE PROCEDURE fecha_a_conta(FECINI) returning_values (FECICNT);
EXECUTE PROCEDURE fecha_a_conta(FECFIN) returning_values (FECFCNT);
FOR SELECT FACO_ID, PREF_PRE, FACO_NUMERO FROM FACTURAS_COMPRA WHERE FACO_ANULADO = 'N' AND
    FACO_FECHA >= :FECINI AND FACO_FECHA <= :FECFIN ORDER BY FACO_ID
    INTO :ID, :PREF, :NUMERO
DO
  BEGIN
  idref = null;
  SELECT ENCO_IDREF FROM COMPROBANTE_ENCABEZADO WHERE ENCO_TIPOREF = 21 AND ENCO_FECHA >= :FECICNT AND ENCO_FECHA <= :FECFCNT and ENCO_IDREF = :id into :idref;
  if (idref IS NULL) then
  begin
   ESTADO = 'PROCESANDO';
   SUSPEND;
   SELECT MAX(INCO_ID) FROM INTERFAZ_COMPRAS WHERE PREF_PRE = :PREF AND TIDO_COD = 21 INTO :IDI;
   EXECUTE PROCEDURE CONTABIL_FACTCOMP (:ID, :IDI) RETURNING_VALUES (:ERROR, VER, :IDC);
   if (ERROR = 0) then
    BEGIN
    EXECUTE PROCEDURE CONTABILIZA_PENDIENTE (:IDC);
    ESTADO = 'OK';
    END
   ELSE
    ESTADO = 'ERROR';
   suspend;
  End
  END
END

^

SET TERM ; ^

/* 20090813 crm */


CREATE DOMAIN T_TELEFONO AS
VARCHAR(40);;

CREATE TABLE CRM_CARGOS (
    CRCG_ID T_ID NOT NULL,
    CRCG_NOMBRE T_CONCEPTO NOT NULL);
alter table CRM_CARGOS
add constraint PK_CRM_CARGOS
primary key (CRCG_ID);

CREATE TABLE CRM_ESTADO (
    CRES_ID T_ID NOT NULL,
    CRES_NOMBRE T_CONCEPTO NOT NULL);
alter table CRM_ESTADO
add constraint PK_CRM_ESTADO
primary key (CRES_ID);

CREATE TABLE CRM_TIPOCONTACTO (
    CRTC_ID T_ID NOT NULL,
    CRTC_NOMBRE T_CONCEPTO NOT NULL);
alter table CRM_TIPOCONTACTO
add constraint PK_CRM_TIPOCONTACTO
primary key (CRTC_ID);

CREATE TABLE CRM_TIPORELACION (
    CRTR_ID T_ID NOT NULL,
    CRTR_NOMBRE T_CONCEPTO NOT NULL);
alter table CRM_TIPORELACION
add constraint PK_CRM_TIPORELACION
primary key (CRTR_ID);

CREATE TABLE CRM_CLIENTES (
    CRCL_NIT         VARCHAR(20) NOT NULL,
    CRCL_DV          CHAR(1),
    CRCL_TIPOID      CHAR(1),
    CRCL_NOM         VARCHAR(60) NOT NULL,
    CRCL_APELLIDO1   T_CONCEPTO,
    CRCL_APELLIDO2   T_CONCEPTO,
    CRCL_NOMBRE1     T_CONCEPTO,
    CRCL_NOMBRE2     T_CONCEPTO,
    CRCL_DIR         VARCHAR(60),
    CRCL_CIU         VARCHAR(40),
    CRCL_TEL         T_TELEFONO,
    CRCL_CONTACTO    VARCHAR(60),
    CRCL_EMAIL       VARCHAR(100),
    CRCL_FAX         VARCHAR(25),
    CRCL_CEL         VARCHAR(25),
    CIUD_COD         VARCHAR(5),
    CRCL_USUARIO     T_USUARIO,
    CRCL_ANIV        DATE,
    CRCL_TIPORELA    T_ID, /* CLIENTE,LLAMADA EN FRIO,BASE DATOS */
    CRCL_ESTADO      T_ID,
    CRCL_CLASE T_ID,
    CRCL_AGRUPA T_ID,
    CRCL_CALIFICA SMALLINT,
    CRCL_CAMPO1 T_CONCEPTO,
    CRCL_CAMPO2 T_CONCEPTO,
    CRCL_CAMPO3 T_CONCEPTO,
    CRCL_FECHA1 DATE,
    CRCL_FECHA2 DATE,
    CRCL_MONTO1 T_MONTO,
    CRCL_MONTO2 T_MONTO,
    CRCL_MONTO3 T_MONTO,
    CRCL_OBS BLOB SUB_TYPE 1 SEGMENT SIZE 80,
    CRCL_FOTO BLOB SUB_TYPE 0 SEGMENT SIZE 80);

ALTER TABLE CRM_CLIENTES ADD CONSTRAINT PK_CRMCLIENTE PRIMARY KEY (CRCL_NIT);


/* Privileges of users */
GRANT ALL ON CRM_CLIENTES TO PUBLIC;

CREATE TABLE CRM_CONTACTOS (
    CRCL_NIT T_NIT NOT NULL,
    CRCO_ID T_ID NOT NULL,
    CRCO_NOMBRE T_CONCEPTO,
    CRCO_CARGO T_ID,
    CRCO_TELEFONOS T_TELEFONO,
    CRCO_EMAIL VARCHAR(100),
    CRCO_FAX T_TELEFONO,
    CRCO_CEL T_TELEFONO,
    CRCO_CUMPLE DATE,
    CRCO_OBS BLOB SUB_TYPE 1 SEGMENT SIZE 80,
    CRCO_CAMPO1 T_CONCEPTO,
    CRCO_CAMPO2 T_CONCEPTO,
    CROC_CAMPO3 T_CONCEPTO,
    CROC_FOTO BLOB SUB_TYPE 0 SEGMENT SIZE 80);
alter table CRM_CONTACTOS
add constraint PK_CRM_CONTACTOS
primary key (CRCL_NIT,CRCO_ID);

CREATE TABLE CRM_CLASE (
    CRCL_ID T_NIT NOT NULL,
    CRCL_NOMBRE T_CONCEPTO);
alter table CRM_CLASE
add constraint PK_CRM_CLASE
primary key (CRCL_ID);

CREATE TABLE CRM_AGRUPACION (
    CRAG_ID T_ID NOT NULL,
    CRAG_NOMBRE T_CONCEPTO);
alter table CRM_AGRUPACION
add constraint PK_CRM_AGRUPACION
primary key (CRAG_ID);

CREATE TABLE CRM_TIPOEVENTO (
    CRTE_ID T_ID NOT NULL,
    CRTE_NOMBRE T_CONCEPTO);
alter table CRM_TIPOEVENTO
add constraint PK_CRM_TIPOEVENTO
primary key (CRTE_ID);

CREATE TABLE CRM_EVENTO_MOTIVO (
    CREM_ID T_ID NOT NULL,
    CREM_NOMBRE T_CONCEPTO,
    CREM_ACTIVO T_BOOLEANO);
alter table CRM_EVENTO_MOTIVO
add constraint PK_CRM_EVENTO_MOTIVO
primary key (CREM_ID);

CREATE TABLE CRM_EVENTO_RESPUESTA (
    CRER_ID T_ID NOT NULL,
    CRER_NOMBRE T_CONCEPTO);
alter table CRM_EVENTO_RESPUESTA
add constraint PK_CRM_EVENTO_RESPUESTA
primary key (CRER_ID);

CREATE TABLE CRM_ASESOR (
    CRAS_ID T_ID NOT NULL,
    CRAS_NOMBRE T_CONCEPTO NOT NULL,
    CRAS_ACTIVO T_BOOLEANO);
alter table CRM_ASESOR
add constraint PK_CRM_ASESOR
primary key (CRAS_ID);

CREATE TABLE CRM_PRODUCTOS (
    CRPR_ID T_ID NOT NULL,
    CRPR_NOMBRE T_CONCEPTO NOT NULL,
    CRPR_DESC VARCHAR(255),
    CRPR_ARCHIVO VARCHAR(255),
    CRPR_FOTO BLOB SUB_TYPE 0 SEGMENT SIZE 80,
    CRPR_TEXTO BLOB SUB_TYPE 1 SEGMENT SIZE 80);
alter table CRM_PRODUCTOS
add constraint PK_CRM_PRODUCTOS
primary key (CRPR_ID);

CREATE TABLE CRM_EVENTOS (
    CREV_ID T_ID NOT NULL,
    CREV_TIPO INTEGER,
    CREV_FECHA DATE,
    CREV_HORA TIME,
    CREV_MOTIVO T_ID,
    CREV_ASESOR T_ID,
    CREV_PRODUCTO T_ID,
    CREV_VALOR T_MONTO,
    CREV_PRIORIDAD SMALLINT,
    CREV_RESPUESTA T_ID,
    CREV_EXPLICA VARCHAR(255),
    CREV_SOLUCION VARCHAR(255),
    CREV_OBS BLOB SUB_TYPE 1 SEGMENT SIZE 80,
    CREV_ACTIVIDAD T_ID);
alter table CRM_EVENTOS
add constraint PK_CRM_EVENTOS
primary key (CREV_ID);

CREATE TABLE CRM_TIPO_ACTIVIDAD (
    CRTA_ID T_ID NOT NULL,
    CRTA_NOMBRE T_CONCEPTO NOT NULL);
alter table CRM_TIPO_ACTIVIDAD
add constraint PK_CRM_TIPO_ACTIVIDAD
primary key (CRTA_ID);

CREATE TABLE CRM_ACTIVIDAD (
    CRAC_ID T_ID NOT NULL,
    CRAC_FECHA DATE,
    CRAC_CLIENTE T_NIT,
    CRAC_CONTACTO T_ID,
    CRAC_HORA TIME,
    CRAC_ESTADO SMALLINT,
    CRAC_TIPO T_ID,
    CRAC_PRIORIDAD SMALLINT,
    CRAC_DESCRIPCION VARCHAR(255),
    CRAC_OBS BLOB SUB_TYPE 1 SEGMENT SIZE 80);
alter table CRM_ACTIVIDAD
add constraint PK_CRM_ACTIVIDAD
primary key (CRAC_ID);

CREATE TABLE CRM_CAMPANA (
    CRCM_ID T_ID NOT NULL,
    CRCM_NOMBRE T_CONCEPTO);
alter table CRM_CAMPANA
add constraint PK_CRM_CAMPANA
primary key (CRCM_ID);
ALTER TABLE CRM_CAMPANA
ADD CRCM_FECINI DATE;
ALTER TABLE CRM_CAMPANA
ADD CRCM_FECFIN DATE;

CREATE TABLE CRM_CAMPANA_DETALLE (
    CRCM_ID T_ID NOT NULL,
    CRCD_CLIENTE T_NIT NOT NULL,
    CRCD_CONTACTADO T_BOOLEANO,
    CRCD_FECCONTAC DATE,
    CRCD_EVENTO T_ID);
alter table CRM_CAMPANA_DETALLE
add constraint PK_CRM_CAMPANA_DETALLE
primary key (CRCM_ID);


INSERT INTO CONFIGURACION (CONF_MODULO, CONF_CATEGORIA, CONF_PROPIEDAD, CONF_VALOR, CONF_POSIBLES, CONF_AYUDA) VALUES ('CRM','GENERAL','MOSTRAR AGENDA DE ACTIVIDADES AL ENTRAR AL MODULO', 'NO', 'NO,SI', 'SI: Muestra la agenda del día del usuario selecionado al entrar al módulo.');
commit work;

ALTER TABLE CRM_EVENTOS
ADD CRCL_NIT T_NIT;
alter table CRM_EVENTOS
add constraint FK_CRM_EVENTOS_1
foreign key (CRCL_NIT)
references CRM_CLIENTES(CRCL_NIT);

SET TERM ^ ;

create procedure BUSQUEDA_PROSPECTOS (
    INACTIVOS char(1),
    BUSCAR varchar(100),
    CUALQUIERA char(1),
    COLUMNA integer,
    BUSCAR2 varchar(30),
    BUSCAR3 varchar(30),
    BUSCAR4 varchar(30),
    BUSCAR5 varchar(30))
returns (
    NIT VARCHAR(20),
    NOMBRE VARCHAR(60),
    ENCARGADO VARCHAR(60),
    DIR VARCHAR(100),
    CIUD VARCHAR(40),
    TEL VARCHAR(40),
    ANIV DATE,
    RELACION VARCHAR(60),
    ESTADO VARCHAR(60),
    ULTFEC DATE,
    ASESOR VARCHAR(60),
    CONTACTO VARCHAR(60),
    CLASE VARCHAR(60),
    AGRUPA VARCHAR(60)
    )
as
declare variable TIPOREL INTEGER;
declare variable CODCLASE INTEGER;
declare variable CODAGRUPA INTEGER;
declare variable CODESTADO INTEGER;
declare variable OK CHAR(1);
begin
if ((BUSCAR IS NOT NULL) AND (BUSCAR <> '')) then
    BEGIN
    FOR select CRCL_NIT, CRCL_NOM, CRCL_DIR, CRCL_CIU, CRCL_TEL, CRCL_CONTACTO, CRCL_ANIV, CRCL_TIPORELA, CRCL_ESTADO, CRCL_CLASE, CRCL_AGRUPA
        FROM CRM_CLIENTES WHERE ((:INACTIVOS = 'S') or (CRCL_ESTADO <> 0)) AND
            ((:COLUMNA <> 0) or (upper(CRCL_NIT) like upper(:buscar))) AND
            ((:columna <> 1) or (upper(CRCL_NOM) like upper(:buscar))) AND
            ((:columna <> 2) or (upper(CRCL_CONTACTO) like upper(:buscar)))
         INTO :NIT, :NOMBRE, :DIR, :CIUD, :TEL, :ENCARGADO, :ANIV, :TIPOREL, :CODESTADO, :CODCLASE, :CODAGRUPA
         DO
         BEGIN
         SELECT CRTR_NOMBRE FROM crm_tiporelacion WHERE crtr_id = :tiporel INTO :relacion;
         SELECT CRES_NOMBRE FROM crm_estado WHERE cres_id = :codestado INTO :estado;
         SELECT CRCL_NOMBRE FROM crm_clase WHERE crcl_id = :codclase INTO :clase;
         SELECT CRAG_NOMBRE FROM crm_agrupacion WHERE crag_id = :codagrupa INTO :agrupa;
         ULTFEC = NULL;
         ASESOR = NULL;
         CONTACTO = NULL;
         SELECT FIRST 1 CREV_FECHA, CREV_ASESOR, CRTC_NOMBRE FROM CRM_EVENTOS E, CRM_TIPOCONTACTO T
            WHERE CRCL_NIT = :NIT AND E.crev_tipo = T.crtc_id INTO :ultfec, :asesor, :contacto;
         if (CUALQUIERA = 'S') then
            SUSPEND;
         ELSE
            if ((COLUMNA > 0) AND (BUSCAR2 <> '')) then
                BEGIN
                OK = 'S';
                IF (NOT EXISTS (SELECT CRCL_NIT FROM CRM_CLIENTES WHERE CRCL_NIT = :NIT AND
                    ((:columna <> 1) or (upper(CRCL_NOM) like upper(:buscar2))) AND
                    ((:columna <> 2) or (upper(CRCL_CONTACTO) like upper(:buscar2))))) THEN
                    OK = 'N';
                if ((OK = 'S') AND (BUSCAR3 <> '')) then
                    IF (NOT EXISTS (SELECT CRCL_NIT FROM CRM_CLIENTES WHERE CRCL_NIT = :NIT AND
                        ((:columna <> 1) or (upper(CRCL_NOM) like upper(:buscar3))) AND
                        ((:columna <> 2) or (upper(CRCL_CONTACTO) like upper(:buscar3))))) THEN
                        OK = 'N';
                if ((OK = 'S') AND (BUSCAR4 <> '')) then
                    IF (NOT EXISTS (SELECT CRCL_NIT FROM CRM_CLIENTES WHERE CRCL_NIT = :NIT AND
                        ((:columna <> 1) or (upper(CRCL_NOM) like upper(:buscar4))) AND
                        ((:columna <> 2) or (upper(CRCL_CONTACTO) like upper(:buscar4))))) THEN
                        OK = 'N';
                if ((OK = 'S') AND (BUSCAR5 <> '')) then
                    IF (NOT EXISTS (SELECT CRCL_NIT FROM CRM_CLIENTES WHERE CRCL_NIT = :NIT AND
                        ((:columna <> 1) or (upper(CRCL_NOM) like upper(:buscar5))) AND
                        ((:columna <> 2) or (upper(CRCL_CONTACTO) like upper(:buscar5))))) THEN
                        OK = 'N';
                if (OK = 'S') then
                    SUSPEND;
                END
            ELSE
                SUSPEND;
         END
     END
end
^

SET TERM ; ^

GRANT EXECUTE ON PROCEDURE busqueda_prospectos TO public;

ALTER TABLE CRM_CLIENTES
ADD CRCL_ESTERCERO T_BOOLEANO;
ALTER TABLE CRM_CLIENTES
ADD CRCL_PAIS CHAR(3);

ALTER TABLE CRM_ESTADO
ADD CRES_COLOR VARCHAR(30);


INSERT INTO CONFIGURACION (CONF_MODULO, CONF_CATEGORIA, CONF_PROPIEDAD, CONF_VALOR, CONF_POSIBLES, CONF_AYUDA) VALUES ('CRM', 'PROSPECTOS', 'NOMBRE CAMPO DE TEXTO1', 'Actividad:', NULL, NULL);
INSERT INTO CONFIGURACION (CONF_MODULO, CONF_CATEGORIA, CONF_PROPIEDAD, CONF_VALOR, CONF_POSIBLES, CONF_AYUDA) VALUES ('CRM', 'PROSPECTOS', 'NOMBRE CAMPO DE TEXTO2', 'Libre:', NULL, NULL);
INSERT INTO CONFIGURACION (CONF_MODULO, CONF_CATEGORIA, CONF_PROPIEDAD, CONF_VALOR, CONF_POSIBLES, CONF_AYUDA) VALUES ('CRM', 'PROSPECTOS', 'NOMBRE CAMPO DE TEXTO3', 'Libre:', NULL, NULL);
INSERT INTO CONFIGURACION (CONF_MODULO, CONF_CATEGORIA, CONF_PROPIEDAD, CONF_VALOR, CONF_POSIBLES, CONF_AYUDA) VALUES ('CRM', 'PROSPECTOS', 'NOMBRE CAMPO DE FECHA1', '1a compra:', NULL, NULL);
INSERT INTO CONFIGURACION (CONF_MODULO, CONF_CATEGORIA, CONF_PROPIEDAD, CONF_VALOR, CONF_POSIBLES, CONF_AYUDA) VALUES ('CRM', 'PROSPECTOS', 'NOMBRE CAMPO DE FECHA2', 'Ult.compra:', NULL, NULL);
INSERT INTO CONFIGURACION (CONF_MODULO, CONF_CATEGORIA, CONF_PROPIEDAD, CONF_VALOR, CONF_POSIBLES, CONF_AYUDA) VALUES ('CRM', 'PROSPECTOS', 'NOMBRE CAMPO NUMERICO1', 'Activos:', NULL, NULL);
INSERT INTO CONFIGURACION (CONF_MODULO, CONF_CATEGORIA, CONF_PROPIEDAD, CONF_VALOR, CONF_POSIBLES, CONF_AYUDA) VALUES ('CRM', 'PROSPECTOS', 'NOMBRE CAMPO NUMERICO2', 'Ventas:', NULL, NULL);
INSERT INTO CONFIGURACION (CONF_MODULO, CONF_CATEGORIA, CONF_PROPIEDAD, CONF_VALOR, CONF_POSIBLES, CONF_AYUDA) VALUES ('CRM', 'PROSPECTOS', 'NOMBRE CAMPO NUMERICO3', 'Libre:', NULL, NULL);
COMMIT WORK;

SET TERM ^ ;

create trigger CRM_CLIENTES_BI for CRM_CLIENTES
active BEFORE INSERT position 0
as
begin
SELECT SUBSTR(CIUD_NOM,1,40) FROM CIUDADES WHERE CIUD_COD = NEW.ciud_cod INTO NEW.crcl_ciu;
if (NEW.crcl_tipoid IS NULL) then
    NEW.crcl_tipoid = 'J';
if (NEW.crcl_estercero IS NULL) then
    NEW.crcl_estercero = 'N';
end
^

SET TERM ; ^

SET TERM ^ ;

create trigger CRM_CLIENTES_BU for CRM_CLIENTES
active BEFORE UPDATE position 0
as
begin
if (NEW.ciud_cod <> OLD.ciud_cod) then
    SELECT SUBSTR(CIUD_NOM,1,40) FROM CIUDADES WHERE CIUD_COD = NEW.ciud_cod INTO NEW.crcl_ciu;
end
^

SET TERM ; ^

SET TERM ^ ;

create trigger CRM_CLIENTES_BD for CRM_CLIENTES
active BEFORE DELETE position 0
as
declare variable NUMROWS INTEGER;
begin
SELECT COUNT(*) FROM CRM_EVENTOS WHERE CRCL_NIT = OLD.crcl_nit INTO :NUMROWS;
if (NUMROWS > 0) then
    exception cliente_con_mov 'El prospecto ' || old.crcl_nit || ' tiene eventos registrados.';
end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure BUSQUEDA_PROSPECTOS (
    INACTIVOS char(1),
    BUSCAR varchar(100),
    CUALQUIERA char(1),
    COLUMNA integer,
    BUSCAR2 varchar(30),
    BUSCAR3 varchar(30),
    BUSCAR4 varchar(30),
    BUSCAR5 varchar(30))
returns (
    NIT varchar(20),
    NOMBRE varchar(60),
    ENCARGADO varchar(60),
    DIR varchar(100),
    CIUD varchar(40),
    TEL varchar(40),
    ANIV date,
    RELACION varchar(60),
    ESTADO varchar(60),
    ULTFEC date,
    ASESOR varchar(60),
    CONTACTO varchar(60),
    CLASE varchar(60),
    AGRUPA varchar(60))
AS
declare variable TIPOREL INTEGER;
declare variable CODCLASE INTEGER;
declare variable CODAGRUPA INTEGER;
declare variable CODESTADO INTEGER;
declare variable OK CHAR(1);
begin
if ((BUSCAR IS NOT NULL) AND (BUSCAR <> '')) then
    BEGIN
    FOR select CRCL_NIT, CRCL_NOM, CRCL_DIR, CRCL_CIU, CRCL_TEL, CRCL_CONTACTO, CRCL_ANIV, CRCL_TIPORELA, CRCL_ESTADO, CRCL_CLASE, CRCL_AGRUPA
        FROM CRM_CLIENTES WHERE ((:INACTIVOS = 'S') or (CRCL_ESTADO <> 0)) AND
            ((:COLUMNA <> 0) or (upper(CRCL_NIT) like upper(:buscar))) AND
            ((:columna <> 1) or (upper(CRCL_NOM) like upper(:buscar))) AND
            ((:columna <> 2) or (upper(CRCL_CONTACTO) like upper(:buscar)))
         INTO :NIT, :NOMBRE, :DIR, :CIUD, :TEL, :ENCARGADO, :ANIV, :TIPOREL, :CODESTADO, :CODCLASE, :CODAGRUPA
         DO
         BEGIN
         SELECT CRTR_NOMBRE FROM crm_tiporelacion WHERE crtr_id = :tiporel INTO :relacion;
         SELECT CRES_NOMBRE FROM crm_estado WHERE cres_id = :codestado INTO :estado;
         SELECT CRCL_NOMBRE FROM crm_clase WHERE crcl_id = :codclase INTO :clase;
         SELECT CRAG_NOMBRE FROM crm_agrupacion WHERE crag_id = :codagrupa INTO :agrupa;
         ULTFEC = NULL;
         ASESOR = NULL;
         CONTACTO = NULL;
         SELECT FIRST 1 CREV_FECHA, CREV_ASESOR, CRTC_NOMBRE FROM CRM_EVENTOS E, CRM_TIPOCONTACTO T
            WHERE CRCL_NIT = :NIT AND E.crev_tipo = T.crtc_id INTO :ultfec, :asesor, :contacto;
         if (CUALQUIERA = 'S') then
            SUSPEND;
         ELSE
            if ((COLUMNA > 0) AND (BUSCAR2 <> '')) then
                BEGIN
                OK = 'S';
                IF (NOT EXISTS (SELECT CRCL_NIT FROM CRM_CLIENTES WHERE CRCL_NIT = :NIT AND
                    ((:columna <> 1) or (upper(CRCL_NOM) like upper(:buscar2))) AND
                    ((:columna <> 2) or (upper(CRCL_CONTACTO) like upper(:buscar2))))) THEN
                    OK = 'N';
                if ((OK = 'S') AND (BUSCAR3 <> '')) then
                    IF (NOT EXISTS (SELECT CRCL_NIT FROM CRM_CLIENTES WHERE CRCL_NIT = :NIT AND
                        ((:columna <> 1) or (upper(CRCL_NOM) like upper(:buscar3))) AND
                        ((:columna <> 2) or (upper(CRCL_CONTACTO) like upper(:buscar3))))) THEN
                        OK = 'N';
                if ((OK = 'S') AND (BUSCAR4 <> '')) then
                    IF (NOT EXISTS (SELECT CRCL_NIT FROM CRM_CLIENTES WHERE CRCL_NIT = :NIT AND
                        ((:columna <> 1) or (upper(CRCL_NOM) like upper(:buscar4))) AND
                        ((:columna <> 2) or (upper(CRCL_CONTACTO) like upper(:buscar4))))) THEN
                        OK = 'N';
                if ((OK = 'S') AND (BUSCAR5 <> '')) then
                    IF (NOT EXISTS (SELECT CRCL_NIT FROM CRM_CLIENTES WHERE CRCL_NIT = :NIT AND
                        ((:columna <> 1) or (upper(CRCL_NOM) like upper(:buscar5))) AND
                        ((:columna <> 2) or (upper(CRCL_CONTACTO) like upper(:buscar5))))) THEN
                        OK = 'N';
                if (OK = 'S') then
                    SUSPEND;
                END
            ELSE
                SUSPEND;
        END
    END
else
    BEGIN
    FOR select CRCL_NIT, CRCL_NOM, CRCL_DIR, CRCL_CIU, CRCL_TEL, CRCL_CONTACTO, CRCL_ANIV, CRCL_TIPORELA, CRCL_ESTADO, CRCL_CLASE, CRCL_AGRUPA
        FROM CRM_CLIENTES WHERE ((:INACTIVOS = 'S') or (CRCL_ESTADO <> 0))
         INTO :NIT, :NOMBRE, :DIR, :CIUD, :TEL, :ENCARGADO, :ANIV, :TIPOREL, :CODESTADO, :CODCLASE, :CODAGRUPA
         DO
         BEGIN
         SELECT CRTR_NOMBRE FROM crm_tiporelacion WHERE crtr_id = :tiporel INTO :relacion;
         SELECT CRES_NOMBRE FROM crm_estado WHERE cres_id = :codestado INTO :estado;
         SELECT CRCL_NOMBRE FROM crm_clase WHERE crcl_id = :codclase INTO :clase;
         SELECT CRAG_NOMBRE FROM crm_agrupacion WHERE crag_id = :codagrupa INTO :agrupa;
         ULTFEC = NULL;
         ASESOR = NULL;
         CONTACTO = NULL;
         SELECT FIRST 1 CREV_FECHA, CREV_ASESOR, CRTC_NOMBRE FROM CRM_EVENTOS E, CRM_TIPOCONTACTO T
            WHERE CRCL_NIT = :NIT AND E.crev_tipo = T.crtc_id INTO :ultfec, :asesor, :contacto;
         SUSPEND;
         END
    END
end
^

SET TERM ; ^

ALTER TABLE CRM_ACTIVIDAD
ADD CRAC_ASESOR T_ID;
ALTER TABLE CRM_PRODUCTOS
ADD CRPR_ACTIVO T_BOOLEANO;

CREATE TABLE CRM_SUBPRODUCTOS (
    CRSP_ID T_ID NOT NULL,
    CRSP_ITEM T_ID NOT NULL,
    CRSP_NOMBRE T_CONCEPTO,
    CRSP_CODIGO T_COD_ARTICULO,
    CRSP_ACTIVO T_BOOLEANO,
    CRSP_DESCRIPCION VARCHAR(255),
    CRSP_FOTO BLOB SUB_TYPE 0 SEGMENT SIZE 80,
    CRSP_TEXTO BLOB SUB_TYPE 0 SEGMENT SIZE 80);
alter table CRM_SUBPRODUCTOS
add constraint PK_CRM_SUBPRODUCTOS
primary key (CRSP_ID,CRSP_ITEM);

alter table CRM_SUBPRODUCTOS
add constraint FK_CRM_SUBPRODUCTOS_1 foreign key (CRSP_ID)
references CRM_PRODUCTOS(CRPR_ID) on delete CASCADE on update CASCADE;

ALTER TABLE CRM_EVENTOS
ADD CRCL_CONTACTO T_ID;

SET TERM ^ ;

create procedure ULTIMO_EVENTO (
    NIT VARCHAR(20))
returns (
    TEXTO VARCHAR(255))
as
declare variable FECHA DATE;
declare variable MOTIVO VARCHAR(60);
declare variable TIPO VARCHAR(60);
declare variable ASESOR VARCHAR(60);
begin
SELECT FIRST 1 CREV_FECHA, CRTE_NOMBRE, CREM_NOMBRE, CRAS_NOMBRE
    FROM CRM_EVENTOS E, CRM_TIPOEVENTO T, CRM_EVENTO_MOTIVO M, crm_asesor A
    WHERE E.crev_tipo = T.crte_id AND E.crev_motivo = M.crem_id AND E.crev_asesor = A.cras_id AND CRCL_NIT = :NIT
    ORDER BY CREV_FECHA DESC, CREV_HORA DESC
    INTO :fecha, :tipo, :motivo, :asesor;
TEXTO = FECHA || ':' || TIPO || ' ' || MOTIVO || '-' || ASESOR;
suspend;
end
^

SET TERM ; ^

ALTER TABLE CRM_EVENTOS
ADD CREV_ANULADO T_BOOLEANO;

SET TERM ^ ;

create or alter procedure BUSQUEDA_EVENTOS_CLI (
    NIT VARCHAR(20))
returns (
    ID INTEGER,
    FECHA DATE,
    HORA TIME,
    MOTIVO VARCHAR(60),
    TIPO VARCHAR(60),
    ASESOR VARCHAR(60),
    RESPUESTA VARCHAR(60),
    EXPLICA VARCHAR(255))
as
declare variable RESPTA INTEGER;
begin
FOR SELECT CREV_ID, CREV_FECHA, CREV_HORA, CRTE_NOMBRE, CREM_NOMBRE, CRAS_NOMBRE, CREV_RESPUESTA, CREV_EXPLICA
    FROM CRM_EVENTOS E, CRM_TIPOEVENTO T, CRM_EVENTO_MOTIVO M, crm_asesor A
    WHERE E.crev_tipo = T.crte_id AND E.crev_motivo = M.crem_id AND E.crev_asesor = A.cras_id AND
    CRCL_NIT = :NIT AND CREV_ANULADO = 'N'
    ORDER BY CREV_FECHA DESC, CREV_HORA DESC
    INTO :id, :fecha, :hora, :tipo, :motivo, :asesor, :respta, :explica
    DO
    BEGIN
    respuesta = '';
    SELECT CRER_NOMBRE FROM crm_evento_respuesta WHERE CRER_ID = :respta INTO :respuesta;
    suspend;
    END
end
^

SET TERM ; ^

grant EXECUTE on PROCEDURE ultimo_evento to PUBLIC;
grant EXECUTE on PROCEDURE busqueda_eventos_cli to PUBLIC;

CREATE TABLE CRM_COMPROMISOS (
    CRCO_ID T_ID NOT NULL,
    CRCO_NIT T_NIT NOT NULL,
    CRCO_FECHA DATE,
    CRCO_HORA TIME,
    CRCO_TIPO T_ID,
    CRCO_OBS VARCHAR(255),
    CRCO_ASESOR T_ID);
alter table CRM_COMPROMISOS
add constraint PK_CRM_COMPROMISOS
primary key (CRCO_ID);

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

ALTER TABLE CRM_COMPROMISOS
ADD CRCO_CUMPLIDO T_BOOLEANO;
ALTER TABLE CRM_COMPROMISOS
ADD CRCO_HORAAVISO TIME;
ALTER TABLE CRM_COMPROMISOS
ADD CRCO_CONTACTO T_ID;

SET TERM ^ ;

CREATE OR ALTER procedure BUSQUEDA_EVENTOS
returns (
    ID integer,
    FECHA date,
    HORA time,
    NIT varchar(20),
    NOMBRE VARCHAR(60),
    MOTIVO varchar(60),
    TIPO varchar(60),
    ASESOR varchar(60),
    RESPUESTA varchar(60),
    EXPLICA varchar(255))
AS
declare variable RESPTA INTEGER;
begin
FOR SELECT CREV_ID, CREV_FECHA, CREV_HORA, CRTE_NOMBRE, CREM_NOMBRE, CRAS_NOMBRE, CREV_RESPUESTA, CREV_EXPLICA, CRCL_NIT
    FROM CRM_EVENTOS E, CRM_TIPOEVENTO T, CRM_EVENTO_MOTIVO M, crm_asesor A
    WHERE E.crev_tipo = T.crte_id AND E.crev_motivo = M.crem_id AND E.crev_asesor = A.cras_id AND
    CRCL_NIT = :NIT AND CREV_ANULADO = 'N'
    ORDER BY CREV_FECHA DESC, CREV_HORA DESC
    INTO :id, :fecha, :hora, :tipo, :motivo, :asesor, :respta, :explica, :NIT
    DO
    BEGIN
    respuesta = '';
    NOMBRE = '';
    SELECT CRCL_NOM FROM crm_clientes WHERE CRCL_NIT = :nit INTO :nombre;
    SELECT CRER_NOMBRE FROM crm_evento_respuesta WHERE CRER_ID = :respta INTO :respuesta;
    suspend;
    END
end
^

SET TERM ; ^
grant EXECUTE on PROCEDURE busqueda_eventos to PUBLIC;

ALTER TABLE CRM_COMPROMISOS
ADD CRCO_ANULADO T_BOOLEANO;

SET TERM ^ ;

create or alter procedure BUSQUEDA_COMPROMISOS (
    ASESOR INTEGER,
    CUMPLIDOS CHAR(1))
returns (
    ID integer,
    FECHA date,
    HORA time,
    NIT varchar(20),
    NOMBRE varchar(60),
    TIPO varchar(60),
    OBS varchar(255),
    OK CHAR(1),
    HORAVAISO TIME,
    CONTACTO VARCHAR(60))
AS
declare variable CONT INTEGER;
begin
FOR SELECT C.crco_id, C.crco_fecha, C.crco_hora, T.crte_nombre, C.crco_obs, C.crco_nit, C.crco_cumplido, C.crco_horaaviso, C.crco_contacto
    FROM crm_compromisos C, CRM_TIPOEVENTO T
    WHERE C.crco_tipo = T.crte_id AND C.crco_asesor = :asesor AND C.crco_anulado = 'N'
    ORDER BY C.crco_fecha DESC, C.crco_hora DESC
    INTO :id, :fecha, :hora, :tipo, :obs, :NIT, :ok, :horavaiso, :cont
    DO
    BEGIN
    if ((CUMPLIDOS = 'S') or (OK = 'N'))  then
        BEGIN
        contacto = '';
        NOMBRE = '';
        SELECT CRCL_NOM FROM crm_clientes WHERE CRCL_NIT = :nit INTO :nombre;
        SELECT CRCO_NOMBRE FROM crm_contactos WHERE CRCL_NIT = :nit AND CRCO_ID = :cont INTO :contacto;
        suspend;
        END
    END
end
^

SET TERM ; ^

grant EXECUTE on PROCEDURE BUSQUEDA_COMPROMISOS to public;

insert into crm_clientes (crcl_nit, crcl_dv, crcl_tipoid, crcl_nom, crcl_apellido1, crcl_apellido2, crcl_nombre1, crcl_nombre2, crcl_dir, crcl_ciu, crcl_tel, crcl_contacto, crcl_email, crcl_fax, crcl_cel, ciud_cod, crcl_usuario, crcl_aniv, crcl_estado, crcl_estercero)
    select terc_nit, terc_dv, terc_tipoid, terc_nom, terc_apellido1, terc_apellido2, terc_nombre1, terc_nombre2, terc_dir, terc_ciu, terc_tel, terc_contacto, terc_email, terc_fax, terc_cel, ciud_cod, terc_usuario, terc_aniv, 1, 'S' from terceros;

insert into crm_asesor (cras_id, cras_nombre, cras_activo)
    select cobr_cod, cobr_nom, cobr_estado from cobradores;
commit work;

ALTER TABLE USUARIO
ADD VEND_COD T_ID;


grant select, delete, insert, update on crm_tipoevento to PUBLIC;
grant select, delete, insert, update on crm_asesor to PUBLIC;
grant select, delete, insert, update on crm_estado to PUBLIC;
grant select, delete, insert, update on crm_tipoCONTACTO to PUBLIC;
grant select, delete, insert, update on crm_productos to PUBLIC;
grant select, delete, insert, update on crm_SUBproductos to PUBLIC;
grant select, delete, insert, update on crm_eventos to PUBLIC;
grant select, delete, insert, update on crm_evento_motivo to PUBLIC;
grant select, delete, insert, update on crm_evento_respuesta to PUBLIC;
grant select, delete, insert, update on crm_tipo_actividad to PUBLIC;
grant select, delete, insert, update on crm_estado to PUBLIC;
grant select, delete, insert, update on crm_agrupacion to PUBLIC;
grant select, delete, insert, update on crm_clase to PUBLIC;
grant select, delete, insert, update on crm_tiporelacion to PUBLIC;
grant select, delete, insert, update on crm_contactos to PUBLIC;
grant select, delete, insert, update on crm_cargos to PUBLIC;

CREATE SEQUENCE ID_EVENTO;
CREATE SEQUENCE ID_COMPROMISO;

SET TERM ^ ;

create or alter procedure CAMBIE_ID_EVENTO
returns (
    ID integer)
AS
declare variable numrows integer;
BEGIN
/* TRAE EL ID NUEVO Y LO ACTUALIZA */
NUMROWS = 1;
while (NUMROWS > 0) DO
    BEGIN
    ID = GEN_ID(id_evento, 1);
    /* VERIFIQUE SI YA EXISTE */
    SELECT COUNT(*) FROM crm_eventos V WHERE V.crev_id = :ID INTO :NUMROWS;
    END
SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

create trigger CRM_EVENTOS_BI for CRM_EVENTOS
active BEFORE INSERT position 0
as
begin
if ((new.crev_id = 0) or (new.crev_id is null)) then
    new.crev_id = gen_id(id_evento, 1);
end
^

SET TERM ; ^

SET TERM ^ ;

create trigger CRM_COMPROMISOS_BI for CRM_COMPROMISOS
active BEFORE INSERT position 0
as
begin
if ((NEW.crco_id = 0) or (NEW.crco_id IS NULL))  then
    NEW.crco_id = gen_id(id_compromiso, 1);
end
^

SET TERM ; ^


INSERT INTO CONFIGURACION (CONF_MODULO, CONF_CATEGORIA, CONF_PROPIEDAD, CONF_VALOR, CONF_POSIBLES, CONF_AYUDA) VALUES ('CRM', 'GENERAL', 'COLOR VENTANA PRINCIPAL', '16000', '00000-35999', 'Indique el color en formato RGB que quiere de fondo en la ventana principal del módulo');
INSERT INTO CONFIGURACION (CONF_MODULO, CONF_CATEGORIA, CONF_PROPIEDAD, CONF_VALOR, CONF_POSIBLES, CONF_AYUDA) VALUES ('CRM', 'GENERAL', 'NUMERO DE MINUTOS ENTRE VALDACIONES DE COMPROMISOS PENDIENTES', '5', '1,2,5,10,30,60', 'Indique el número de minutos que trascurren entre dos validaciones de compromisos pendientes');
commit work;

SET TERM ^ ;

CREATE OR ALTER procedure BUSQUEDA_COMPROMISOS (
    ASESOR integer,
    FEC date,
    CUMPLIDOS char(1))
returns (
    ID integer,
    FECHA date,
    HORA time,
    NIT varchar(20),
    NOMBRE varchar(60),
    TIPO varchar(60),
    OBS varchar(255),
    OK char(1),
    HORAVAISO time,
    CONTACTO varchar(60))
as
declare variable CONT integer;
begin
  for select C.CRCO_ID, C.CRCO_FECHA, C.CRCO_HORA, T.CRTE_NOMBRE, C.CRCO_OBS, C.CRCO_NIT, C.CRCO_CUMPLIDO,
             C.CRCO_HORAAVISO, C.CRCO_CONTACTO
      from CRM_COMPROMISOS C, CRM_TIPOEVENTO T
      where C.CRCO_TIPO = T.CRTE_ID and
            C.CRCO_ASESOR = :ASESOR and
            C.CRCO_ANULADO = 'N' and
            C.CRCO_FECHA <= :FEC
      order by C.CRCO_FECHA, C.CRCO_HORA
      into :ID, :FECHA, :HORA, :TIPO, :OBS, :NIT, :OK, :HORAVAISO, :CONT
  do
  begin
    if ((CUMPLIDOS = 'S') or (OK = 'N')) then
    begin
      CONTACTO = '';
      NOMBRE = '';
      select CRCL_NOM
      from CRM_CLIENTES
      where CRCL_NIT = :NIT
      into :NOMBRE;
      select CRCO_NOMBRE
      from CRM_CONTACTOS
      where CRCL_NIT = :NIT and
            CRCO_ID = :CONT
      into :CONTACTO;
      suspend;
    end
  end
end
^

SET TERM ; ^


ALTER TABLE CRM_CLIENTES
ADD CRCL_REPLICA T_BOOLEANO;


UPDATE or INSERT INTO CRM_ESTADO (CRES_ID, CRES_NOMBRE, CRES_COLOR) VALUES (1, 'Sin contacto', 'clWhite');
UPDATE or INSERT INTO CRM_ESTADO (CRES_ID, CRES_NOMBRE, CRES_COLOR) VALUES (2, 'Compromiso pendiente', '$004242FF');
UPDATE or INSERT INTO CRM_ESTADO (CRES_ID, CRES_NOMBRE, CRES_COLOR) VALUES (3, 'Cotizado', '$004FF2EE');
UPDATE or INSERT INTO CRM_ESTADO (CRES_ID, CRES_NOMBRE, CRES_COLOR) VALUES (4, 'Pedido', '$0065DC71');

INSERT INTO CONFIGURACION (CONF_MODULO, CONF_CATEGORIA, CONF_PROPIEDAD, CONF_VALOR, CONF_POSIBLES, CONF_AYUDA) VALUES ('CRM', 'GENERAL', 'PREVISUALIZAR IMPRESION DE DOCUMENTOS', 'SI', 'SI,NO', 'SI:Al imprimir cualquier documento aparece la opción preguntando el destino. NO:Imprime directamente a la impresora predeterminada.');
COMMIT WORK;


SET TERM ^ ;

create or alter procedure BUSQUEDA_COMPROMISOS_CLI (
    CLIENTE VARCHAR(20),
    CUMPLIDOS char(1))
returns (
    ID integer,
    FECHA date,
    HORA time,
    ASESOR INTEGER,
    NOMBRE varchar(60),
    TIPO varchar(60),
    OBS varchar(255),
    OK char(1),
    HORAVAISO time,
    CONTACTO varchar(60))
AS
declare variable CONT INTEGER;
begin
FOR SELECT C.crco_id, C.crco_fecha, C.crco_hora, T.crte_nombre, C.crco_obs, C.crco_cumplido, C.crco_horaaviso, C.crco_contacto, crco_asesor
    FROM crm_compromisos C, CRM_TIPOEVENTO T
    WHERE C.crco_tipo = T.crte_id AND C.crco_nit = :cliente AND C.crco_anulado = 'N'
    ORDER BY C.crco_fecha DESC, C.crco_hora DESC
    INTO :id, :fecha, :hora, :tipo, :obs, :ok, :horavaiso, :cont, :asesor
    DO
    BEGIN
    if ((CUMPLIDOS = 'S') or (OK = 'N'))  then
        BEGIN
        contacto = '';
        NOMBRE = '';
        SELECT CRAS_NOMBRE FROM crm_asesor WHERE CRAS_ID = :asesor INTO :nombre;
        SELECT CRCO_NOMBRE FROM crm_contactos WHERE CRCL_NIT = :cliente AND CRCO_ID = :cont INTO :contacto;
        suspend;
        END
    END
end
^

SET TERM ; ^

grant EXECUTE on PROCEDURE busqueda_compromisos_cli to PUBLIC;

SET TERM ^ ;

CREATE OR ALTER TRIGGER CRM_CLIENTES_AI FOR CRM_CLIENTES
ACTIVE AFTER INSERT POSITION 0
as
declare variable VEND INTEGER;
begin
/* CRERLO COMO CLIENTE */
if ((NEW.crcl_estercero = 'S') AND (NEW.CRCL_REPLICA = 'S')) then
    BEGIN
    update or INSERT INTO TERCEROS(TERC_NIT, TERC_NOM, TERC_DIR, TERC_CIU, TERC_TEL, TERC_CONTACTO, TERC_OBS, TERC_EMAIL, TERC_FAX, TERC_CEL, TERC_CLIE,
        TERC_CTARTFTE, TERC_CTARTIVA, TERC_CTARTICA, TERC_CTAVENTA, TERC_CTAEMPL, TERC_DV, CIUD_COD, TERC_TIPOID, TERC_USUARIO, TERC_APELLIDO1, TERC_APELLIDO2, TERC_NOMBRE1, TERC_NOMBRE2,
        TERC_EXENTO, TERC_ANIV, TERC_ESTADO)
        VALUES(NEW.crcl_nit, NEW.crcl_nom, NEW.crcl_dir, NEW.crcl_ciu, NEW.crcl_tel, NEW.crcl_contacto, NEW.crcl_obs, NEW.crcl_email, NEW.crcl_fax, NEW.crcl_cel, 'S',
        NULL, NULL, NULL, null,  null,  NEW.crcl_dv, NEW.ciud_cod, NEW.crcl_tipoid, NEW.crcl_usuario, NEW.crcl_apellido1, NEW.crcl_apellido2, NEW.crcl_nombre1, NEW.crcl_nombre2,
        'N', NEW.crcl_aniv, 'S');
    /* como cliente */
    if (not exists (select terc_nit from clientes where terc_nit = new.crcl_nit)) then
        begin
        select vend_cod from usuario where user_cod = user into :vend;
        insert into clientes (terc_nit, clie_cod, clie_estado, vend_cod, cobr_cod) values (new.crcl_nit, new.crcl_nit, 'A', :vend, :vend);
        end
    END
end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER CRM_CLIENTES_AU FOR CRM_CLIENTES
ACTIVE AFTER UPDATE POSITION 0
as
declare variable vend integer;
begin
/* CRERLO COMO CLIENTE */
if ((NEW.crcl_estercero = 'S') AND (NEW.CRCL_REPLICA = 'S')) then
    BEGIN
    update or INSERT INTO TERCEROS(TERC_NIT, TERC_NOM, TERC_DIR, TERC_CIU, TERC_TEL, TERC_CONTACTO, TERC_OBS, TERC_EMAIL, TERC_FAX, TERC_CEL, TERC_CLIE,
        TERC_CTARTFTE, TERC_CTARTIVA, TERC_CTARTICA, TERC_CTAVENTA, TERC_CTAEMPL, TERC_DV, CIUD_COD, TERC_TIPOID, TERC_USUARIO, TERC_APELLIDO1, TERC_APELLIDO2, TERC_NOMBRE1, TERC_NOMBRE2,
        TERC_EXENTO, TERC_ANIV, TERC_ESTADO)
        VALUES(NEW.crcl_nit, NEW.crcl_nom, NEW.crcl_dir, NEW.crcl_ciu, NEW.crcl_tel, NEW.crcl_contacto, NEW.crcl_obs, NEW.crcl_email, NEW.crcl_fax, NEW.crcl_cel, 'S',
        NULL, NULL, NULL, null,  null,  NEW.crcl_dv, NEW.ciud_cod, NEW.crcl_tipoid, NEW.crcl_usuario, NEW.crcl_apellido1, NEW.crcl_apellido2, NEW.crcl_nombre1, NEW.crcl_nombre2,
        'N', NEW.crcl_aniv, 'S');
    /* como cliente */
    if (not exists (select terc_nit from clientes where terc_nit = new.crcl_nit)) then
        begin
        select vend_cod from usuario where user_cod = user into :vend;
        insert into clientes (terc_nit, clie_cod, clie_estado, vend_cod, cobr_cod) values (new.crcl_nit, new.crcl_nit, 'A', :vend, :vend);
        end
    END
end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER TERCEROS_AI FOR TERCEROS
ACTIVE AFTER INSERT POSITION 0
as
begin
update or INSERT INTO crm_clientes(CRCL_NIT, CRCL_NOM, CRCL_DIR, CRCL_CIU, CRCL_TEL, CRCL_CONTACTO, CRCL_OBS, CRCL_EMAIL, CRCL_FAX, CRCL_CEL,
    CRCL_DV, CIUD_COD, CRCL_TIPOID, CRCL_USUARIO, CRCL_APELLIDO1, CRCL_APELLIDO2, CRCL_NOMBRE1, CRCL_NOMBRE2,
    CRCL_ANIV, CRCL_ESTADO, crcl_replica)
    VALUES(NEW.terc_nit, NEW.terc_nom, NEW.terc_dir, NEW.terc_ciu, NEW.terc_tel, NEW.terc_contacto, NEW.terc_obs, NEW.terc_email, NEW.terc_fax, NEW.terc_cel,
    NEW.terc_dv, NEW.ciud_cod, NEW.terc_tipoid, NEW.terc_usuario, NEW.terc_apellido1, NEW.terc_apellido2, NEW.terc_nombre1, NEW.terc_nombre2,
    NEW.terc_aniv, 1, 'N');
INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
    VALUES (USER, 102, 1, 'I', NEW.terc_nit);
end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER TERCEROS_AU FOR TERCEROS
ACTIVE AFTER UPDATE POSITION 0
as
declare variable NUMROWS INTEGER;
begin
update or INSERT INTO crm_clientes(CRCL_NIT, CRCL_NOM, CRCL_DIR, CRCL_CIU, CRCL_TEL, CRCL_CONTACTO, CRCL_OBS, CRCL_EMAIL, CRCL_FAX, CRCL_CEL,
    CRCL_DV, CIUD_COD, CRCL_TIPOID, CRCL_USUARIO, CRCL_APELLIDO1, CRCL_APELLIDO2, CRCL_NOMBRE1, CRCL_NOMBRE2,
    CRCL_ANIV, CRCL_ESTADO, CRCL_REPLICA)
    VALUES(NEW.terc_nit, NEW.terc_nom, NEW.terc_dir, NEW.terc_ciu, NEW.terc_tel, NEW.terc_contacto, NEW.terc_obs, NEW.terc_email, NEW.terc_fax, NEW.terc_cel,
    NEW.terc_dv, NEW.ciud_cod, NEW.terc_tipoid, NEW.terc_usuario, NEW.terc_apellido1, NEW.terc_apellido2, NEW.terc_nombre1, NEW.terc_nombre2,
    NEW.terc_aniv, 1, 'N');

INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
    VALUES (USER, 102, 1, 'U', NEW.terc_nit);
/* SI ES CLIENTE Y SE INACTIVA LO INACTIVA COMO CLIENTE */
if ((NEW.terc_estado = 'N') AND (OLD.terc_estado = 'S')) then
    UPDATE CLIENTES SET CLIE_ESTADO = 'I' WHERE TERC_NIT = NEW.terc_nit;

/* SI TIENE UNA SOLA SUCURSAL ACTUALICELA AL CAMBIAR EL PRINCIPAL */
SELECT COUNT(CLCU_COD) FROM CLIENTE_SUCURSALES WHERE TERC_NIT = NEW.terc_nit INTO :NUMROWS;
if (NUMROWS = 1) then
    BEGIN
    UPDATE cliente_sucursales
        SET CLSU_NOMBRE = new.terc_nom,
            CLSU_DIR = new.terc_dir,
            CLSU_CIUDAD = new.terc_ciu,
            CLSU_TEL = new.terc_tel
        WHERE TERC_NIT = NEW.TERC_NIT AND CLCU_COD = '01';
    END
end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER CRM_CLIENTES_BI FOR CRM_CLIENTES
ACTIVE BEFORE INSERT POSITION 0
as
declare variable TERC CHAR(2);
begin
SELECT SUBSTR(CIUD_NOM,1,40) FROM CIUDADES WHERE CIUD_COD = NEW.ciud_cod INTO NEW.crcl_ciu;
if (NEW.crcl_tipoid IS NULL) then
    NEW.crcl_tipoid = 'J';
if (NEW.crcl_estercero IS NULL) then
    NEW.crcl_estercero = 'N';
if (NEW.crcl_estercero IS NULL) then
    BEGIN
    EXECUTE PROCEDURE lee_configuracion ('CRM', 'PROSPECTOS', 'CREAR PROSPECTO AUTOMATICAMENTE COMO CLIENTE') returning_values (:TERC);
    if (TERC = 'SI') then
        NEW.crcl_estercero = 'S';
    END
end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure BUSQUEDA_EVENTOS
returns (
    ID integer,
    FECHA date,
    HORA time,
    NIT varchar(20),
    NOMBRE varchar(60),
    MOTIVO varchar(60),
    TIPO varchar(60),
    ASESOR varchar(60),
    RESPUESTA varchar(60),
    EXPLICA varchar(255),
    ANULADO CHAR(1))
AS
declare variable RESPTA INTEGER;
begin
FOR SELECT CREV_ID, CREV_FECHA, CREV_HORA, CRTE_NOMBRE, CREM_NOMBRE, CRAS_NOMBRE, CREV_RESPUESTA, CREV_EXPLICA, CRCL_NIT, CREV_ANULADO
    FROM CRM_EVENTOS E, CRM_TIPOEVENTO T, CRM_EVENTO_MOTIVO M, crm_asesor A
    WHERE E.crev_tipo = T.crte_id AND E.crev_motivo = M.crem_id AND E.crev_asesor = A.cras_id AND
    CRCL_NIT = :NIT AND CREV_ANULADO = 'N'
    ORDER BY CREV_FECHA DESC, CREV_HORA DESC
    INTO :id, :fecha, :hora, :tipo, :motivo, :asesor, :respta, :explica, :NIT, :anulado
    DO
    BEGIN
    respuesta = '';
    NOMBRE = '';
    SELECT CRCL_NOM FROM crm_clientes WHERE CRCL_NIT = :nit INTO :nombre;
    SELECT CRER_NOMBRE FROM crm_evento_respuesta WHERE CRER_ID = :respta INTO :respuesta;
    suspend;
    END
end
^

SET TERM ; ^


delete from crm_estado;
INSERT INTO CRM_ESTADO (CRES_ID, CRES_NOMBRE, CRES_COLOR) VALUES (1, 'Sin contacto', NULL);
INSERT INTO CRM_ESTADO (CRES_ID, CRES_NOMBRE, CRES_COLOR) VALUES (2, 'Compromiso pendiente', NULL);
INSERT INTO CRM_ESTADO (CRES_ID, CRES_NOMBRE, CRES_COLOR) VALUES (3, 'Cotizado', NULL);
INSERT INTO CRM_ESTADO (CRES_ID, CRES_NOMBRE, CRES_COLOR) VALUES (4, 'Pedido', NULL);
commit work;

SET TERM ^ ;

create trigger CRM_COMPROMISOS_AI for CRM_COMPROMISOS
active AFTER INSERT position 0
as
begin
/* actualice el estado */
update crm_clientes set crcl_estado = 2 where crcl_nit = new.crco_nit;
end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER COTIZACIONES_AI FOR COTIZACIONES
ACTIVE AFTER INSERT POSITION 0
as
begin
IF (NEW.COTI_ID <> 0) THEN
    begin
    /* actualice el estado */
    update crm_clientes set crcl_estado = 3 where crcl_nit = new.terc_nit;
    INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
        VALUES (USER, 35, NEW.coti_id, 'I', NEW.pref_pre || NEW.coti_numero);
    end
end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER PEDIDOS_AI FOR PEDIDOS
ACTIVE AFTER INSERT POSITION 0
as
begin
IF (NEW.PEDI_ID <> 0) THEN
    begin
    /* actualice el estado */
    update crm_clientes set crcl_estado = 4 where crcl_nit = new.terc_nit;
    INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
        VALUES (USER, 34, NEW.pedi_id, 'I', NEW.pref_pre || NEW.pedi_numero);
    end
end
^

SET TERM ; ^


/* ERROR NIT */
SET TERM ^ ;

CREATE OR ALTER procedure BUSQUEDA_EVENTOS
returns (
    ID integer,
    FECHA date,
    HORA time,
    NIT varchar(20),
    NOMBRE varchar(60),
    MOTIVO varchar(60),
    TIPO varchar(60),
    ASESOR varchar(60),
    RESPUESTA varchar(60),
    EXPLICA varchar(255),
    ANULADO char(1))
AS
declare variable RESPTA INTEGER;
begin
FOR SELECT CREV_ID, CREV_FECHA, CREV_HORA, CRTE_NOMBRE, CREM_NOMBRE, CRAS_NOMBRE, CREV_RESPUESTA, CREV_EXPLICA, CRCL_NIT, CREV_ANULADO
    FROM CRM_EVENTOS E, CRM_TIPOEVENTO T, CRM_EVENTO_MOTIVO M, crm_asesor A
    WHERE E.crev_tipo = T.crte_id AND E.crev_motivo = M.crem_id AND E.crev_asesor = A.cras_id AND CREV_ANULADO = 'N'
    ORDER BY CREV_FECHA DESC, CREV_HORA DESC
    INTO :id, :fecha, :hora, :tipo, :motivo, :asesor, :respta, :explica, :NIT, :anulado
    DO
    BEGIN
    respuesta = '';
    NOMBRE = '';
    SELECT CRCL_NOM FROM crm_clientes WHERE CRCL_NIT = :nit INTO :nombre;
    SELECT CRER_NOMBRE FROM crm_evento_respuesta WHERE CRER_ID = :respta INTO :respuesta;
    suspend;
    END
end
^

SET TERM ; ^

/* 20090812 */
INSERT INTO CONFIGURACION (CONF_MODULO, CONF_CATEGORIA, CONF_PROPIEDAD, CONF_VALOR, CONF_POSIBLES, CONF_AYUDA) VALUES ('CRM', 'COMPROMISOS', 'VER COMPROMISOS FUTUROS EN BUSQUEDA DE COMPROMISOS', 'SI', 'SI,NO', 'SI:Muestra los compromisos de fecha posterior al sistema en la pantalla de búsqueda. NO: Solamente muestra compromisos vencidos y del dia actual');
commit work;

SET TERM ^ ;

create or alter procedure BUSCAR_COMPROMISOS
returns (
    ID integer,
    FECHA date,
    HORA time,
    NIT varchar(20),
    NOMBRE varchar(60),
    ASESOR varchar(60),
    TIPO varchar(60),
    OBS varchar(255),
    OK char(1),
    HORAVAISO time,
    CONTACTO varchar(60))
AS
declare variable CONT integer;
begin
  for select C.CRCO_ID, C.CRCO_FECHA, C.CRCO_HORA, T.CRTE_NOMBRE, C.CRCO_OBS, C.CRCO_NIT, C.CRCO_CUMPLIDO, A.cras_nombre,
             C.CRCO_HORAAVISO, C.CRCO_CONTACTO
      from CRM_COMPROMISOS C, CRM_TIPOEVENTO T, CRM_ASESOR A
      where C.CRCO_TIPO = T.CRTE_ID and C.crco_asesor = A.cras_id AND
            C.CRCO_ANULADO = 'N'
      order by C.CRCO_FECHA desc, C.CRCO_HORA desc
      into :ID, :FECHA, :HORA, :TIPO, :OBS, :NIT, :OK, :asesor, HORAVAISO, :CONT
  do
  begin
      CONTACTO = '';
      NOMBRE = '';
      select CRCL_NOM
      from CRM_CLIENTES
      where CRCL_NIT = :NIT
      into :NOMBRE;
      select CRCO_NOMBRE
      from CRM_CONTACTOS
      where CRCL_NIT = :NIT and
            CRCO_ID = :CONT
      into :CONTACTO;
      suspend;
  end
end
^

SET TERM ; ^

grant EXECUTE on PROCEDURE BUSCAR_COMPROMISOS to PUBLIC;

SET TERM ^ ;

CREATE OR ALTER procedure BUSQUEDA_PROSPECTOS (
    INACTIVOS char(1),
    BUSCAR varchar(100),
    CUALQUIERA char(1),
    COLUMNA integer,
    BUSCAR2 varchar(30),
    BUSCAR3 varchar(30),
    BUSCAR4 varchar(30),
    BUSCAR5 varchar(30))
returns (
    NIT varchar(20),
    NOMBRE varchar(60),
    ENCARGADO varchar(60),
    DIR varchar(100),
    CIUD varchar(40),
    TEL varchar(40),
    VEND VARCHAR(60),
    ANIV date,
    RELACION varchar(60),
    ESTADO varchar(60),
    ULTFEC date,
    ASESOR varchar(60),
    CONTACTO varchar(60),
    CLASE varchar(60),
    AGRUPA varchar(60))
AS
declare variable TIPOREL INTEGER;
declare variable CODCLASE INTEGER;
declare variable CODAGRUPA INTEGER;
declare variable CODESTADO INTEGER;
declare variable OK CHAR(1);
begin
if ((BUSCAR IS NOT NULL) AND (BUSCAR <> '')) then
    BEGIN
    FOR select CRCL_NIT, CRCL_NOM, CRCL_DIR, CRCL_CIU, CRCL_TEL, CRCL_CONTACTO, CRCL_ANIV, CRCL_TIPORELA, CRCL_ESTADO, CRCL_CLASE, CRCL_AGRUPA
        FROM CRM_CLIENTES WHERE ((:INACTIVOS = 'S') or (CRCL_ESTADO <> 0)) AND
            ((:COLUMNA <> 0) or (upper(CRCL_NIT) like upper(:buscar))) AND
            ((:columna <> 1) or (upper(CRCL_NOM) like upper(:buscar))) AND
            ((:columna <> 2) or (upper(CRCL_CONTACTO) like upper(:buscar)))
         INTO :NIT, :NOMBRE, :DIR, :CIUD, :TEL, :ENCARGADO, :ANIV, :TIPOREL, :CODESTADO, :CODCLASE, :CODAGRUPA
         DO
         BEGIN
         SELECT CRTR_NOMBRE FROM crm_tiporelacion WHERE crtr_id = :tiporel INTO :relacion;
         SELECT CRES_NOMBRE FROM crm_estado WHERE cres_id = :codestado INTO :estado;
         SELECT CRCL_NOMBRE FROM crm_clase WHERE crcl_id = :codclase INTO :clase;
         SELECT CRAG_NOMBRE FROM crm_agrupacion WHERE crag_id = :codagrupa INTO :agrupa;
         SELECT VEND_NOMBRE FROM CLIENTES C, VENDEDORES V WHERE TERC_NIT = :NIT AND C.vend_cod = V.vend_cod INTO :vend;
         ULTFEC = NULL;
         ASESOR = NULL;
         CONTACTO = NULL;
         SELECT FIRST 1 CREV_FECHA, CREV_ASESOR, CRTC_NOMBRE FROM CRM_EVENTOS E, CRM_TIPOCONTACTO T
            WHERE CRCL_NIT = :NIT AND E.crev_tipo = T.crtc_id INTO :ultfec, :asesor, :contacto;
         if (CUALQUIERA = 'S') then
            SUSPEND;
         ELSE
            if ((COLUMNA > 0) AND (BUSCAR2 <> '')) then
                BEGIN
                OK = 'S';
                IF (NOT EXISTS (SELECT CRCL_NIT FROM CRM_CLIENTES WHERE CRCL_NIT = :NIT AND
                    ((:columna <> 1) or (upper(CRCL_NOM) like upper(:buscar2))) AND
                    ((:columna <> 2) or (upper(CRCL_CONTACTO) like upper(:buscar2))))) THEN
                    OK = 'N';
                if ((OK = 'S') AND (BUSCAR3 <> '')) then
                    IF (NOT EXISTS (SELECT CRCL_NIT FROM CRM_CLIENTES WHERE CRCL_NIT = :NIT AND
                        ((:columna <> 1) or (upper(CRCL_NOM) like upper(:buscar3))) AND
                        ((:columna <> 2) or (upper(CRCL_CONTACTO) like upper(:buscar3))))) THEN
                        OK = 'N';
                if ((OK = 'S') AND (BUSCAR4 <> '')) then
                    IF (NOT EXISTS (SELECT CRCL_NIT FROM CRM_CLIENTES WHERE CRCL_NIT = :NIT AND
                        ((:columna <> 1) or (upper(CRCL_NOM) like upper(:buscar4))) AND
                        ((:columna <> 2) or (upper(CRCL_CONTACTO) like upper(:buscar4))))) THEN
                        OK = 'N';
                if ((OK = 'S') AND (BUSCAR5 <> '')) then
                    IF (NOT EXISTS (SELECT CRCL_NIT FROM CRM_CLIENTES WHERE CRCL_NIT = :NIT AND
                        ((:columna <> 1) or (upper(CRCL_NOM) like upper(:buscar5))) AND
                        ((:columna <> 2) or (upper(CRCL_CONTACTO) like upper(:buscar5))))) THEN
                        OK = 'N';
                if (OK = 'S') then
                    SUSPEND;
                END
            ELSE
                SUSPEND;
        END
    END
else
    BEGIN
    FOR select CRCL_NIT, CRCL_NOM, CRCL_DIR, CRCL_CIU, CRCL_TEL, CRCL_CONTACTO, CRCL_ANIV, CRCL_TIPORELA, CRCL_ESTADO, CRCL_CLASE, CRCL_AGRUPA
        FROM CRM_CLIENTES WHERE ((:INACTIVOS = 'S') or (CRCL_ESTADO <> 0))
         INTO :NIT, :NOMBRE, :DIR, :CIUD, :TEL, :ENCARGADO, :ANIV, :TIPOREL, :CODESTADO, :CODCLASE, :CODAGRUPA
         DO
         BEGIN
         SELECT CRTR_NOMBRE FROM crm_tiporelacion WHERE crtr_id = :tiporel INTO :relacion;
         SELECT CRES_NOMBRE FROM crm_estado WHERE cres_id = :codestado INTO :estado;
         SELECT CRCL_NOMBRE FROM crm_clase WHERE crcl_id = :codclase INTO :clase;
         SELECT CRAG_NOMBRE FROM crm_agrupacion WHERE crag_id = :codagrupa INTO :agrupa;
         SELECT VEND_NOMBRE FROM CLIENTES C, VENDEDORES V WHERE TERC_NIT = :NIT AND C.vend_cod = V.vend_cod INTO :vend;
         ULTFEC = NULL;
         ASESOR = NULL;
         CONTACTO = NULL;
         SELECT FIRST 1 CREV_FECHA, CREV_ASESOR, CRTC_NOMBRE FROM CRM_EVENTOS E, CRM_TIPOCONTACTO T
            WHERE CRCL_NIT = :NIT AND E.crev_tipo = T.crtc_id INTO :ultfec, :asesor, :contacto;
         SUSPEND;
         END
    END
end
^

SET TERM ; ^



update revision set revi_FECHA = '2009/08/13';
COMMIT WORK;

/* 20090813: DEVOLUCIONES QUEDABAN POSITIVAS SI SE PEDIA DETALLADO */
SET TERM ^ ;

CREATE OR ALTER procedure REP_ARTICULOS_VENDEDOR (
    TIPO integer,
    DETALLE char(1),
    DESDE varchar(20),
    HASTA varchar(20),
    FECINI date,
    FECFIN date,
    ARTINI varchar(15),
    ARTFIN varchar(15),
    GRPINI varchar(3),
    GRPFIN varchar(3),
    ORDEN char(1),
    AGRUPA char(1),
    ZONA char(1),
    CEROS char(1),
    SUBEMPRESA integer,
    ZONAINI char(2),
    ZONAFIN char(2))
returns (
    CODVEND varchar(20),
    NOMVEND varchar(60),
    NOMTIPO varchar(50),
    ARTICULO varchar(15),
    DESCRIPCION varchar(60),
    CODGRUPO varchar(2),
    NOMGRUPO varchar(30),
    CODSUBG varchar(3),
    NOMSUBG varchar(30),
    CODMARC varchar(3),
    NOMMARC varchar(30),
    UNIDAD varchar(8),
    CANTIDAD numeric(18,4),
    BASE numeric(18,2),
    IVA numeric(18,2),
    CONSUMO numeric(18,2),
    TOTAL numeric(18,2),
    PREFIJO varchar(4),
    NUMERO varchar(6),
    FECHA date,
    DTO numeric(9,2),
    NIT varchar(20),
    NOMCLIENTE varchar(60),
    SUCURSAL varchar(10),
    CODZONA varchar(2),
    NOMZONA varchar(60))
AS
declare variable codini varchar(15);
declare variable codfin varchar(15);
declare variable desini varchar(15);
declare variable desfin varchar(15);
declare variable marini varchar(3);
declare variable marfin varchar(3);
BEGIN
if (ORDEN = 'C') then
    BEGIN
    CODINI = ARTINI;
    CODFIN = ARTFIN;
    DESINI = '';
    DESFIN = 'zz';
    END
ELSE
    BEGIN
    DESINI = ARTINI;
    DESFIN = ARTFIN;
    CODINI = '';
    CODFIN = 'zz';
    END
if (AGRUPA = 'G') then
    BEGIN
    MARINI = '';
    MARFIN = 'zz';
    END
ELSE
    if (AGRUPA = 'M') then
        BEGIN
        MARINI = GRPINI;
        MARFIN = GRPFIN;
        GRPINI = '';
        GRPFIN = 'zz';
        END
    ELSE
        BEGIN
        MARINI = '';
        MARFIN = 'zz';
        END
if (DETALLE = 'N') then
    BEGIN
    if (BIN_AND(TIPO, 1) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 31 INTO :NOMTIPO;
        FOR SELECT MAX(D.ARTI_COD), MAX(VEND_COD), SUM(FADE_CANT * FADE_FACTOR), SUM((FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO)*FACT_FACTOR), SUM(FADE_IVAMONTO*FACT_FACTOR), SUM(FADE_CONSUMO), SUM(FADE_TOTAL*FACT_FACTOR),
            MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD)
            FROM FACTURAS_DETALLE D, FACTURAS F, PREFIJOS P, ARTICULO A
            WHERE F.FACT_ID = D.FACT_ID AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND D.ARTI_COD = A.arti_cod AND
            VEND_COD >= :DESDE AND VEND_COD <= :HASTA AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            FACT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) and substring(a.arti_cod from 1 FOR 2) <> '.t'
            GROUP BY VEND_COD, D.ARTI_COD
            INTO :ARTICULO, :CODVEND, :CANTIDAD, :BASE, :IVA, :CONSUMO, :TOTAL,
            :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
            DO
            BEGIN
            select VEND_NOMBRE from VENDEDORES where VEND_COD = :CODVEND INTO :NOMVEND;
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            if (CEROS = 'S') then
                SUSPEND;
            ELSE
                if ((BASE <> 0) AND (CANTIDAD <> 0)) then
                    SUSPEND;
            END /* FOR */
        END
    if (BIN_AND(TIPO, 2) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 32 INTO :NOMTIPO;
        FOR SELECT MAX(D.ARTI_COD), MAX(VEND_COD), SUM(RVDE_CANT * RVDE_FACTOR), SUM(RVDE_TOTAL-RVDE_IVAMONTO-RVDE_CONSUMO), SUM(RVDE_IVAMONTO), SUM(RVDE_CONSUMO), SUM(RVDE_TOTAL),
            MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD)
            FROM REMISIONES_VENTA_DETALLE D, REMISIONES_VENTA R, PREFIJOS P, ARTICULO A
            WHERE R.REVT_ID = D.REVT_ID AND P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = 32 AND D.ARTI_COD = A.arti_cod AND
            VEND_COD >= :DESDE AND VEND_COD <= :HASTA AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            REVT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY R.vend_cod, D.ARTI_COD
            INTO :ARTICULO, :CODVEND, :CANTIDAD, :BASE, :IVA, :CONSUMO, :TOTAL,
            :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
            DO
            BEGIN
            select VEND_NOMBRE from VENDEDORES where VEND_COD = :CODVEND INTO :NOMVEND;
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            if (CEROS = 'S') then
                SUSPEND;
            ELSE
                if ((BASE <> 0) AND (CANTIDAD <> 0)) then
                    SUSPEND;
            END /* FOR */
        END
    if (BIN_AND(TIPO, 4) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 33 INTO :NOMTIPO;
        FOR SELECT MAX(D.ARTI_COD), MAX(VEND_COD), SUM(DVDE_CANT * DVDE_FACTOR), SUM((DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO)*DEVT_FACTOR), SUM(DVDE_IVAMONTO*DEVT_FACTOR), SUM(DVDE_CONSUMO), SUM(DVDE_TOTAL*DEVT_FACTOR),
            MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD)
            FROM devoluciones_ventas_detalle D, DEVOLUCIONES_VENTAS V, PREFIJOS P, ARTICULO A
            WHERE V.DEVT_ID = D.DEVT_ID AND P.PREF_PRE = V.PREF_PRE AND P.TIDO_COD = 33 AND D.ARTI_COD = A.arti_cod AND
            VEND_COD >= :DESDE AND VEND_COD <= :HASTA AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            DEVT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY V.vend_cod, D.ARTI_COD
            INTO :ARTICULO, :CODVEND, :CANTIDAD, :BASE, :IVA, :CONSUMO, :TOTAL,
            :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
            DO
            BEGIN
            select VEND_NOMBRE from VENDEDORES where VEND_COD = :CODVEND INTO :NOMVEND;
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            if (CEROS = 'S') then
                SUSPEND;
            ELSE
                if ((BASE <> 0) AND (CANTIDAD <> 0)) then
                    BEGIN
                    BASE = BASE * -1;
                    IVA = IVA * -1;
                    CANTIDAD = CANTIDAD * -1;
                    TOTAL = TOTAL * -1;
                    SUSPEND;
                    END
            END /* FOR */
        END
    if (BIN_AND(TIPO, 8) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 34 INTO :NOMTIPO;
        FOR SELECT MAX(D.ARTI_COD), MAX(VEND_COD), SUM(PEDE_CANT * PEDE_FACTOR), SUM((PEDE_TOTAL-PEDE_IVAMONTO-PEDE_CONSUMO)*PEDI_FACTOR), SUM(PEDE_IVAMONTO*PEDI_FACTOR), SUM(PEDE_CONSUMO), SUM(PEDE_TOTAL*PEDI_FACTOR),
            MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD)
            FROM PEDIDOS_DETALLE D, PEDIDOS P, PREFIJOS R, ARTICULO A
            WHERE P.PEDI_ID = D.PEDI_ID AND P.PREF_PRE = R.PREF_PRE AND R.TIDO_COD = 34 AND D.ARTI_COD = A.arti_cod AND
            VEND_COD >= :DESDE AND VEND_COD <= :HASTA AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            PEDI_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY P.vend_cod, D.ARTI_COD
            INTO :ARTICULO, :CODVEND, :CANTIDAD, :BASE, :IVA, :CONSUMO, :TOTAL,
            :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
            DO
            BEGIN
            select VEND_NOMBRE from VENDEDORES where VEND_COD = :CODVEND INTO :NOMVEND;
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            if (CEROS = 'S') then
                SUSPEND;
            ELSE
                if ((BASE <> 0) AND (CANTIDAD <> 0)) then
                    SUSPEND;
            END /* FOR */
        END
    if (BIN_AND(TIPO, 16) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 35 INTO :NOMTIPO;
        FOR SELECT MAX(D.ARTI_COD), MAX(VEND_COD), SUM(CTDE_CANT * CTDE_FACTOR), SUM((CTDE_TOTAL-CTDE_IVAMONTO-CTDE_CONSUMO)*COTI_FACTOR), SUM(CTDE_IVAMONTO*COTI_FACTOR), SUM(CTDE_CONSUMO), SUM(CTDE_TOTAL*COTI_FACTOR),
            MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD)
            FROM COTIZACIONES_DETALLE D, COTIZACIONES C, PREFIJOS P, ARTICULO A
            WHERE C.COTI_ID = D.COTI_ID AND P.PREF_PRE = C.PREF_PRE AND P.TIDO_COD = 35 AND D.ARTI_COD = A.arti_cod AND
            VEND_COD >= :DESDE AND VEND_COD <= :HASTA AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND COTI_FECHA >= :FECINI AND COTI_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            COTI_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY C.vend_cod, D.ARTI_COD
            INTO :ARTICULO, :CODVEND, :CANTIDAD, :BASE, :IVA, :CONSUMO, :TOTAL,
            :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
            DO
            BEGIN
            select VEND_NOMBRE from VENDEDORES where VEND_COD = :CODVEND INTO :NOMVEND;
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            if (CEROS = 'S') then
                SUSPEND;
            ELSE
                if ((BASE <> 0) AND (CANTIDAD <> 0)) then
                    SUSPEND;
            END /* FOR */
        END
    END
ELSE
  if (DETALLE = 'S') then
    BEGIN
    if (BIN_AND(TIPO, 1) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 31 INTO :NOMTIPO;
        FOR SELECT F.PREF_PRE, FACT_NUMERO, FACT_FECHA, VEND_COD, D.ARTI_COD, FADE_CANT * FADE_FACTOR, (FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO)*FACT_FACTOR, FADE_IVAMONTO*FACT_FACTOR, FADE_CONSUMO, FADE_DTOPORC, FADE_TOTAL*FACT_FACTOR,
            ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD , F.TERC_NIT, F.fact_nomcliente, F.fact_sucursal
            FROM FACTURAS F, FACTURAS_DETALLE D, PREFIJOS P, ARTICULO A
            WHERE F.FACT_ID = D.FACT_ID AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND D.ARTI_COD = A.arti_cod AND
                VEND_COD >= :DESDE AND VEND_COD <= :HASTA AND
                A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
                A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND FACT_FECHA >= :FECINI AND
                (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
                FACT_FECHA <= :FECFIN AND FACT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) and substring(a.arti_cod from 1 FOR 2) <> '.t'
            ORDER BY VEND_COD, D.ARTI_COD, FACT_FECHA, F.FACT_ID, FADE_ITEM
            INTO :PREFIJO, :NUMERO, :FECHA, :CODVEND, :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO, :DTO, :TOTAL,
                :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :NIT, :nomcliente, :sucursal
            DO
            BEGIN
            select VEND_NOMBRE from VENDEDORES where VEND_COD = :CODVEND INTO :NOMVEND;
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            SUSPEND;
            END
        END
    if (BIN_AND(TIPO, 2) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 32 INTO :NOMTIPO;
        FOR SELECT R.PREF_PRE, REVT_NUMERO, REVT_FECHA, VEND_COD, D.ARTI_COD, RVDE_CANT * RVDE_FACTOR, (RVDE_TOTAL-RVDE_IVAMONTO-RVDE_CONSUMO), RVDE_IVAMONTO, RVDE_CONSUMO, RVDE_DTOPORC, RVDE_TOTAL,
            ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD, R.terc_nit, R.revt_nomterc, r.revt_sucursal
            FROM REMISIONES_VENTA R, REMISIONES_VENTA_DETALLE D, PREFIJOS P, ARTICULO A
            WHERE R.REVT_ID = D.REVT_ID AND P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = 32 AND D.ARTI_COD = A.arti_cod AND
                VEND_COD >= :DESDE AND VEND_COD <= :HASTA AND
                A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
                A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN AND
                (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
                REVT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            ORDER BY VEND_COD, D.ARTI_COD, REVT_FECHA, R.REVT_ID, RVDE_ITEM
            INTO :PREFIJO, :NUMERO, :FECHA, :CODVEND, :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO, :DTO, :TOTAL,
                :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :NIT, :nomcliente, :sucursal
            DO
            BEGIN
            select VEND_NOMBRE from VENDEDORES where VEND_COD = :CODVEND INTO :NOMVEND;
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            SUSPEND;
            END
        END
    if (BIN_AND(TIPO, 4) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 33 INTO :NOMTIPO;
        FOR SELECT V.PREF_PRE, DEVT_NUMERO, DEVT_FECHA, VEND_COD, D.ARTI_COD, DVDE_CANT * DVDE_FACTOR, (DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO)*DEVT_FACTOR, DVDE_IVAMONTO*DEVT_FACTOR, DVDE_CONSUMO, DVDE_DTOPORC, DVDE_TOTAL*DEVT_FACTOR,
            ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD, V.terc_nit, V.devt_nomterc, v.devt_sucursal
            FROM DEVOLUCIONES_VENTAS V, DEVOLUCIONES_VENTAS_DETALLE D, PREFIJOS P, ARTICULO A
            WHERE V.DEVT_ID = D.DEVT_ID AND P.PREF_PRE = V.PREF_PRE AND P.TIDO_COD = 33 AND D.ARTI_COD = A.arti_cod AND
                VEND_COD >= :DESDE AND VEND_COD <= :HASTA AND
                A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
                A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND
                (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
                DEVT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            ORDER BY VEND_COD, D.ARTI_COD, DEVT_FECHA, V.DEVT_ID, DVDE_ITEM
            INTO :PREFIJO, :NUMERO, :FECHA, :CODVEND, :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO, :DTO, :TOTAL,
                :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :NIT, :nomcliente, :sucursal
            DO
            BEGIN
            select VEND_NOMBRE from VENDEDORES where VEND_COD = :CODVEND INTO :NOMVEND;
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            BASE = BASE * -1;
            IVA = IVA * -1;
            CANTIDAD = CANTIDAD * -1;
            TOTAL = TOTAL * -1;
            SUSPEND;
            END
        END
    if (BIN_AND(TIPO, 8) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 34 INTO :NOMTIPO;
        FOR SELECT P.PREF_PRE, PEDI_NUMERO, PEDI_FECHA, VEND_COD, D.ARTI_COD, PEDE_CANT * PEDE_FACTOR, (PEDE_TOTAL-PEDE_IVAMONTO-PEDE_CONSUMO)*PEDI_FACTOR, PEDE_IVAMONTO*PEDI_FACTOR, PEDE_CONSUMO, PEDE_DTOPORC, PEDE_TOTAL*PEDI_FACTOR,
            ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD, P.terc_nit, P.pedi_nomterc, p.pedi_sucursal
            FROM PEDIDOS P, PEDIDOS_DETALLE D, PREFIJOS R, ARTICULO A
            WHERE P.PEDI_ID = D.PEDI_ID AND P.PREF_PRE = R.PREF_PRE AND R.TIDO_COD = 34 AND D.ARTI_COD = A.arti_cod AND
                VEND_COD >= :DESDE AND VEND_COD <= :HASTA AND
                A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
                A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND
                (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
                PEDI_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            ORDER BY VEND_COD, D.ARTI_COD, PEDI_FECHA, P.PEDI_ID, PEDE_ITEM
            INTO :PREFIJO, :NUMERO, :FECHA, :CODVEND, :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO, :DTO, :TOTAL,
                :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :NIT, :nomcliente, :sucursal
            DO
            BEGIN
            select VEND_NOMBRE from VENDEDORES where VEND_COD = :CODVEND INTO :NOMVEND;
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            SUSPEND;
            END
        END
    if (BIN_AND(TIPO, 16) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 35 INTO :NOMTIPO;
        FOR SELECT C.PREF_PRE, COTI_NUMERO, COTI_FECHA, VEND_COD, D.ARTI_COD, CTDE_CANT * CTDE_FACTOR, (CTDE_TOTAL-CTDE_IVAMONTO-CTDE_CONSUMO)*COTI_FACTOR, CTDE_IVAMONTO*COTI_FACTOR, CTDE_CONSUMO, CTDE_DTOPORC, CTDE_TOTAL*COTI_FACTOR,
            ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD, C.terc_nit, C.coti_nomterc, c.coti_sucursal
            FROM COTIZACIONES C, COTIZACIONES_DETALLE D, PREFIJOS P, ARTICULO A
            WHERE C.COTI_ID = D.COTI_ID AND P.PREF_PRE = C.PREF_PRE AND P.TIDO_COD = 35 AND D.ARTI_COD = A.arti_cod AND
                VEND_COD >= :DESDE AND VEND_COD <= :HASTA AND
                A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
                A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND COTI_FECHA >= :FECINI AND COTI_FECHA <= :FECFIN AND
                (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
                COTI_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            ORDER BY VEND_COD, D.ARTI_COD, COTI_FECHA, C.COTI_ID, CTDE_ITEM
            INTO :PREFIJO, :NUMERO, :FECHA, :CODVEND, :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO, :DTO, :TOTAL,
                :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :NIT, :nomcliente, :sucursal
            DO
            BEGIN
            select VEND_NOMBRE from VENDEDORES where VEND_COD = :CODVEND INTO :NOMVEND;
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            SUSPEND;
            END
        END
    END
  ELSE
if (DETALLE = 'C') then
    BEGIN
    if (BIN_AND(TIPO, 1) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 31 INTO :NOMTIPO;
        FOR SELECT MAX(D.ARTI_COD), MAX(VEND_COD), SUM(FADE_CANT * FADE_FACTOR), SUM((FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO)*FACT_FACTOR), SUM(FADE_IVAMONTO*FACT_FACTOR), SUM(FADE_CONSUMO), SUM(FADE_TOTAL*FACT_FACTOR),
            MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD), MAX(F.terc_nit), MAX(F.fact_nomcliente), MAX(F.fact_sucursal)
            FROM FACTURAS_DETALLE D, FACTURAS F, PREFIJOS P, ARTICULO A
            WHERE F.FACT_ID = D.FACT_ID AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND D.ARTI_COD = A.arti_cod AND
            VEND_COD >= :DESDE AND VEND_COD <= :HASTA AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            FACT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) and substring(a.arti_cod from 1 FOR 2) <> '.t'
            GROUP BY F.VEND_COD, F.TERC_NIT, F.fact_sucursal, D.ARTI_COD
            INTO :ARTICULO, :CODVEND, :CANTIDAD, :BASE, :IVA, :CONSUMO, :TOTAL,
            :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :nit, :nomcliente, :sucursal
            DO
            BEGIN
            select VEND_NOMBRE from VENDEDORES where VEND_COD = :CODVEND INTO :NOMVEND;
            SELECT C.ZONA_COD, ZONA_NOM FROM CLIENTES C, ZONAS Z WHERE C.zona_cod = Z.zona_cod AND C.terc_nit = :nit INTO :codzona, :nomzona;
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            if (CEROS = 'S') then
                SUSPEND;
            ELSE
                if ((BASE <> 0) AND (CANTIDAD <> 0)) then
                    SUSPEND;
            END /* FOR */
        END
    if (BIN_AND(TIPO, 2) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 32 INTO :NOMTIPO;
        FOR SELECT MAX(D.ARTI_COD), MAX(VEND_COD), SUM(RVDE_CANT * RVDE_FACTOR), SUM(RVDE_TOTAL-RVDE_IVAMONTO-RVDE_CONSUMO), SUM(RVDE_IVAMONTO), SUM(RVDE_CONSUMO), SUM(RVDE_TOTAL),
            MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD), MAX(R.terc_nit), MAX(R.revt_nomterc), MAX(R.revt_sucursal)
            FROM REMISIONES_VENTA_DETALLE D, REMISIONES_VENTA R, PREFIJOS P, ARTICULO A
            WHERE R.REVT_ID = D.REVT_ID AND P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = 32 AND D.ARTI_COD = A.arti_cod AND
            VEND_COD >= :DESDE AND VEND_COD <= :HASTA AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            REVT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY R.vend_cod, R.terc_nit, R.revt_sucursal, D.arti_cod
            INTO :ARTICULO, :CODVEND, :CANTIDAD, :BASE, :IVA, :CONSUMO, :TOTAL,
            :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :nit, :nomcliente, :sucursal
            DO
            BEGIN
            SELECT C.ZONA_COD, ZONA_NOM FROM CLIENTES C, ZONAS Z WHERE C.zona_cod = Z.zona_cod AND C.terc_nit = :nit INTO :codzona, :nomzona;
            select VEND_NOMBRE from VENDEDORES where VEND_COD = :CODVEND INTO :NOMVEND;
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            if (CEROS = 'S') then
                SUSPEND;
            ELSE
                if ((BASE <> 0) AND (CANTIDAD <> 0)) then
                    SUSPEND;
            END /* FOR */
        END
    if (BIN_AND(TIPO, 4) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 33 INTO :NOMTIPO;
        FOR SELECT MAX(D.ARTI_COD), MAX(VEND_COD), SUM(DVDE_CANT * DVDE_FACTOR), SUM((DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO)*DEVT_FACTOR), SUM(DVDE_IVAMONTO*DEVT_FACTOR), SUM(DVDE_CONSUMO), SUM(DVDE_TOTAL*DEVT_FACTOR),
            MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD), MAX(V.terc_nit), MAX(V.devt_nomterc), MAX(V.devt_sucursal)
            FROM devoluciones_ventas_detalle D, DEVOLUCIONES_VENTAS V, PREFIJOS P, ARTICULO A
            WHERE V.DEVT_ID = D.DEVT_ID AND P.PREF_PRE = V.PREF_PRE AND P.TIDO_COD = 33 AND D.ARTI_COD = A.arti_cod AND
            VEND_COD >= :DESDE AND VEND_COD <= :HASTA AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            DEVT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY V.vend_cod, V.terc_nit, V.devt_sucursal, D.arti_cod
            INTO :ARTICULO, :CODVEND, :CANTIDAD, :BASE, :IVA, :CONSUMO, :TOTAL,
            :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :nit, :nomcliente, :sucursal
            DO
            BEGIN
            SELECT C.ZONA_COD, ZONA_NOM FROM CLIENTES C, ZONAS Z WHERE C.zona_cod = Z.zona_cod AND C.terc_nit = :nit INTO :codzona, :nomzona;
            select VEND_NOMBRE from VENDEDORES where VEND_COD = :CODVEND INTO :NOMVEND;
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            if (CEROS = 'S') then
                SUSPEND;
            ELSE
                if ((BASE <> 0) AND (CANTIDAD <> 0)) then
                    SUSPEND;
            END /* FOR */
        END
    if (BIN_AND(TIPO, 8) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 34 INTO :NOMTIPO;
        FOR SELECT MAX(D.ARTI_COD), MAX(VEND_COD), SUM(PEDE_CANT * PEDE_FACTOR), SUM((PEDE_TOTAL-PEDE_IVAMONTO-PEDE_CONSUMO)*PEDI_FACTOR), SUM(PEDE_IVAMONTO*PEDI_FACTOR), SUM(PEDE_CONSUMO), SUM(PEDE_TOTAL*PEDI_FACTOR),
            MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD), MAX(P.terc_nit), MAX(P.pedi_nomterc), MAX(P.pedi_sucursal)
            FROM PEDIDOS_DETALLE D, PEDIDOS P, PREFIJOS R, ARTICULO A
            WHERE P.PEDI_ID = D.PEDI_ID AND P.PREF_PRE = R.PREF_PRE AND R.TIDO_COD = 34 AND D.ARTI_COD = A.arti_cod AND
            VEND_COD >= :DESDE AND VEND_COD <= :HASTA AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            PEDI_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY P.vend_cod, P.terc_nit, P.pedi_sucursal, D.arti_cod
            INTO :ARTICULO, :CODVEND, :CANTIDAD, :BASE, :IVA, :CONSUMO, :TOTAL,
            :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :nit, :nomcliente, :sucursal
            DO
            BEGIN
            SELECT C.ZONA_COD, ZONA_NOM FROM CLIENTES C, ZONAS Z WHERE C.zona_cod = Z.zona_cod AND C.terc_nit = :nit INTO :codzona, :nomzona;
            select VEND_NOMBRE from VENDEDORES where VEND_COD = :CODVEND INTO :NOMVEND;
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            if (CEROS = 'S') then
                SUSPEND;
            ELSE
                if ((BASE <> 0) AND (CANTIDAD <> 0)) then
                    SUSPEND;
            END /* FOR */
        END
    if (BIN_AND(TIPO, 16) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 35 INTO :NOMTIPO;
        FOR SELECT MAX(D.ARTI_COD), MAX(VEND_COD), SUM(CTDE_CANT * CTDE_FACTOR), SUM((CTDE_TOTAL-CTDE_IVAMONTO-CTDE_CONSUMO)*COTI_FACTOR), SUM(CTDE_IVAMONTO*COTI_FACTOR), SUM(CTDE_CONSUMO), SUM(CTDE_TOTAL*COTI_FACTOR),
            MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD), MAX(C.terc_nit), MAX(C.coti_nomterc), MAX(C.coti_sucursal)
            FROM COTIZACIONES_DETALLE D, COTIZACIONES C, PREFIJOS P, ARTICULO A
            WHERE C.COTI_ID = D.COTI_ID AND P.PREF_PRE = C.PREF_PRE AND P.TIDO_COD = 35 AND D.ARTI_COD = A.arti_cod AND
            VEND_COD >= :DESDE AND VEND_COD <= :HASTA AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND COTI_FECHA >= :FECINI AND COTI_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            COTI_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY C.vend_cod, C.terc_nit, C.coti_sucursal, D.arti_cod
            INTO :ARTICULO, :CODVEND, :CANTIDAD, :BASE, :IVA, :CONSUMO, :TOTAL,
            :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :nit, :nomcliente, :sucursal
            DO
            BEGIN
            SELECT C.ZONA_COD, ZONA_NOM FROM CLIENTES C, ZONAS Z WHERE C.zona_cod = Z.zona_cod AND C.terc_nit = :nit INTO :codzona, :nomzona;
            select VEND_NOMBRE from VENDEDORES where VEND_COD = :CODVEND INTO :NOMVEND;
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            if (CEROS = 'S') then
                SUSPEND;
            ELSE
                if ((BASE <> 0) AND (CANTIDAD <> 0)) then
                    SUSPEND;
            END /* FOR */
        END
    END
if (zona = 'S') then
    BEGIN
    if (BIN_AND(TIPO, 1) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 31 INTO :NOMTIPO;
        FOR SELECT MAX(D.ARTI_COD), MAX(F.VEND_COD), SUM(FADE_CANT * FADE_FACTOR), SUM((FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO)*FACT_FACTOR), SUM(FADE_IVAMONTO*FACT_FACTOR), SUM(FADE_CONSUMO), SUM(FADE_TOTAL*FACT_FACTOR),
            MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD), MAX(F.terc_nit), MAX(F.fact_nomcliente), MAX(F.fact_sucursal)
            FROM FACTURAS_DETALLE D, FACTURAS F, PREFIJOS P, ARTICULO A, clientes C, ZONAS Z
            WHERE F.FACT_ID = D.FACT_ID AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND D.ARTI_COD = A.arti_cod AND
            F.VEND_COD >= :DESDE AND F.VEND_COD <= :HASTA AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            FACT_ANULADO = 'N' AND ((P.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) AND F.terc_nit = C.terc_nit AND
            Z.zona_cod = C.zona_cod AND C.zona_cod >= :zonaini AND C.zona_cod <= :zonafin and substring(a.arti_cod from 1 FOR 2) <> '.t'
            GROUP BY F.VEND_COD, C.zona_cod ,D.ARTI_COD , C.terc_nit, F.fact_sucursal
            INTO :ARTICULO, :CODVEND, :CANTIDAD, :BASE, :IVA, :CONSUMO, :TOTAL,
            :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :nit, :nomcliente, :sucursal
            DO
            BEGIN
            select VEND_NOMBRE from VENDEDORES where VEND_COD = :CODVEND INTO :NOMVEND;
            SELECT C.ZONA_COD, ZONA_NOM FROM CLIENTES C, ZONAS Z WHERE C.zona_cod = Z.zona_cod AND C.terc_nit = :nit /*AND Z.zona_cod >= :zonaini AND Z.zona_cod >= :zonafin*/ INTO :codzona, :nomzona;
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            if (CEROS = 'S') then
                SUSPEND;
            ELSE
                if ((BASE <> 0) AND (CANTIDAD <> 0)) then
                    SUSPEND;
            END /* FOR */
        END
    if (BIN_AND(TIPO, 2) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 32 INTO :NOMTIPO;
        FOR SELECT MAX(D.ARTI_COD), MAX(R.VEND_COD), SUM(RVDE_CANT * RVDE_FACTOR), SUM(RVDE_TOTAL-RVDE_IVAMONTO-RVDE_CONSUMO), SUM(RVDE_IVAMONTO), SUM(RVDE_CONSUMO), SUM(RVDE_TOTAL),
            MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD), MAX(R.terc_nit), MAX(R.revt_nomterc), MAX(R.revt_sucursal)
            FROM REMISIONES_VENTA_DETALLE D, REMISIONES_VENTA R, PREFIJOS P, ARTICULO A, clientes C, ZONAS Z
            WHERE R.REVT_ID = D.REVT_ID AND P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = 32 AND D.ARTI_COD = A.arti_cod AND
            R.VEND_COD >= :DESDE AND R.VEND_COD <= :HASTA AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            REVT_ANULADO = 'N' AND ((P.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))AND R.terc_nit = C.terc_nit AND
            Z.zona_cod = C.zona_cod AND C.zona_cod >= :zonaini AND C.zona_cod <= :zonafin
            GROUP BY R.vend_cod, c.zona_cod, D.arti_cod , R.terc_nit
            INTO :ARTICULO, :CODVEND, :CANTIDAD, :BASE, :IVA, :CONSUMO, :TOTAL,
            :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :nit, :nomcliente, :sucursal
            DO
            BEGIN
            SELECT C.ZONA_COD, ZONA_NOM FROM CLIENTES C, ZONAS Z WHERE C.zona_cod = Z.zona_cod AND C.terc_nit = :nit INTO :codzona, :nomzona;
            select VEND_NOMBRE from VENDEDORES where VEND_COD = :CODVEND INTO :NOMVEND;
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            if (CEROS = 'S') then
                SUSPEND;
            ELSE
                if ((BASE <> 0) AND (CANTIDAD <> 0)) then
                    SUSPEND;
            END /* FOR */
        END
    if (BIN_AND(TIPO, 4) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 33 INTO :NOMTIPO;
        FOR SELECT MAX(D.ARTI_COD), MAX(V.VEND_COD), SUM(DVDE_CANT * DVDE_FACTOR), SUM((DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO)*DEVT_FACTOR), SUM(DVDE_IVAMONTO*DEVT_FACTOR), SUM(DVDE_CONSUMO), SUM(DVDE_TOTAL*DEVT_FACTOR),
            MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD), MAX(V.terc_nit), MAX(V.devt_nomterc), MAX(V.devt_sucursal)
            FROM devoluciones_ventas_detalle D, DEVOLUCIONES_VENTAS V, PREFIJOS P, ARTICULO A, clientes C, ZONAS Z
            WHERE V.DEVT_ID = D.DEVT_ID AND P.PREF_PRE = V.PREF_PRE AND P.TIDO_COD = 33 AND D.ARTI_COD = A.arti_cod AND
            V.VEND_COD >= :DESDE AND V.VEND_COD <= :HASTA AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            DEVT_ANULADO = 'N' AND ((P.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))AND V.terc_nit = C.terc_nit AND
            Z.zona_cod = C.zona_cod AND C.zona_cod >= :zonaini AND C.zona_cod <= :zonafin
            GROUP BY V.vend_cod, c.zona_cod, D.arti_cod , V.terc_nit
            INTO :ARTICULO, :CODVEND, :CANTIDAD, :BASE, :IVA, :CONSUMO, :TOTAL,
            :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :nit, :nomcliente, :sucursal
            DO
            BEGIN
            SELECT C.ZONA_COD, ZONA_NOM FROM CLIENTES C, ZONAS Z WHERE C.zona_cod = Z.zona_cod AND C.terc_nit = :nit INTO :codzona, :nomzona;
            select VEND_NOMBRE from VENDEDORES where VEND_COD = :CODVEND INTO :NOMVEND;
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            if (CEROS = 'S') then
                SUSPEND;
            ELSE
                if ((BASE <> 0) AND (CANTIDAD <> 0)) then
                    SUSPEND;
            END /* FOR */
        END
    if (BIN_AND(TIPO, 8) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 34 INTO :NOMTIPO;
        FOR SELECT MAX(D.ARTI_COD), MAX(P.VEND_COD), SUM(PEDE_CANT * PEDE_FACTOR), SUM((PEDE_TOTAL-PEDE_IVAMONTO-PEDE_CONSUMO)*PEDI_FACTOR), SUM(PEDE_IVAMONTO*PEDI_FACTOR), SUM(PEDE_CONSUMO), SUM(PEDE_TOTAL*PEDI_FACTOR),
            MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD), MAX(P.terc_nit), MAX(P.pedi_nomterc), MAX(P.pedi_sucursal)
            FROM PEDIDOS_DETALLE D, PEDIDOS P, PREFIJOS R, ARTICULO A, clientes C, ZONAS Z
            WHERE P.PEDI_ID = D.PEDI_ID AND P.PREF_PRE = R.PREF_PRE AND R.TIDO_COD = 34 AND D.ARTI_COD = A.arti_cod AND
            P.VEND_COD >= :DESDE AND P.VEND_COD <= :HASTA AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            PEDI_ANULADO = 'N' AND ((R.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))AND P.terc_nit = C.terc_nit AND
            Z.zona_cod = C.zona_cod AND C.zona_cod >= :zonaini AND C.zona_cod <= :zonafin
            GROUP BY P.vend_cod, c.zona_cod, D.arti_cod , P.terc_nit
            INTO :ARTICULO, :CODVEND, :CANTIDAD, :BASE, :IVA, :CONSUMO, :TOTAL,
            :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :nit, :nomcliente, :sucursal
            DO
            BEGIN
            SELECT C.ZONA_COD, ZONA_NOM FROM CLIENTES C, ZONAS Z WHERE C.zona_cod = Z.zona_cod AND C.terc_nit = :nit INTO :codzona, :nomzona;
            select VEND_NOMBRE from VENDEDORES where VEND_COD = :CODVEND INTO :NOMVEND;
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            if (CEROS = 'S') then
                SUSPEND;
            ELSE
                if ((BASE <> 0) AND (CANTIDAD <> 0)) then
                    SUSPEND;
            END /* FOR */
        END
    if (BIN_AND(TIPO, 16) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 35 INTO :NOMTIPO;
        FOR SELECT MAX(D.ARTI_COD), MAX(C.VEND_COD), SUM(CTDE_CANT * CTDE_FACTOR), SUM((CTDE_TOTAL-CTDE_IVAMONTO-CTDE_CONSUMO)*COTI_FACTOR), SUM(CTDE_IVAMONTO*COTI_FACTOR), SUM(CTDE_CONSUMO), SUM(CTDE_TOTAL*COTI_FACTOR),
            MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD), MAX(C.terc_nit), MAX(C.coti_nomterc), MAX(C.coti_sucursal)
            FROM COTIZACIONES_DETALLE D, COTIZACIONES C, PREFIJOS P, ARTICULO A, clientes T, ZONAS Z
            WHERE C.COTI_ID = D.COTI_ID AND P.PREF_PRE = C.PREF_PRE AND P.TIDO_COD = 35 AND D.ARTI_COD = A.arti_cod AND
            C.VEND_COD >= :DESDE AND C.VEND_COD <= :HASTA AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND COTI_FECHA >= :FECINI AND COTI_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            COTI_ANULADO = 'N' AND ((P.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))AND C.terc_nit = T.terc_nit AND
            Z.zona_cod = T.zona_cod AND T.zona_cod >= :zonaini AND T.zona_cod <= :zonafin
            GROUP BY C.vend_cod, t.zona_cod, D.arti_cod , C.terc_nit
            INTO :ARTICULO, :CODVEND, :CANTIDAD, :BASE, :IVA, :CONSUMO, :TOTAL,
            :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :nit, :nomcliente, :sucursal
            DO
            BEGIN
            SELECT C.ZONA_COD, ZONA_NOM FROM CLIENTES C, ZONAS Z WHERE C.zona_cod = Z.zona_cod AND C.terc_nit = :nit INTO :codzona, :nomzona;
            select VEND_NOMBRE from VENDEDORES where VEND_COD = :CODVEND INTO :NOMVEND;
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            if (CEROS = 'S') then
                SUSPEND;
            ELSE
                if ((BASE <> 0) AND (CANTIDAD <> 0)) then
                    SUSPEND;
            END /* FOR */
        END
    END
END
^

SET TERM ; ^

/* 20090813B */
/* BASE RETEFUENTE POSITIVA SI SE CONTABILIZA POR ARTICULO */
SET TERM ^ ;

CREATE OR ALTER procedure CONTABIL_FACTCOMP (
    IDDOC integer,
    IDINTER integer)
returns (
    ERROR integer,
    VER char(1),
    IDC integer)
AS
DECLARE VARIABLE PREFIJO VARCHAR(4);
DECLARE VARIABLE NUM VARCHAR(6);
DECLARE VARIABLE NUMERO VARCHAR(10);
DECLARE VARIABLE FECAUX DATE;
DECLARE VARIABLE FECHA CHAR(8);
DECLARE VARIABLE CONCEPTO CHAR(60);
DECLARE VARIABLE VENCEAUX DATE;
DECLARE VARIABLE VENCE CHAR(8);
DECLARE VARIABLE VRDTO NUMERIC(18,2);
DECLARE VARIABLE VRADIC NUMERIC(18,2);
DECLARE VARIABLE VRSUBT NUMERIC(18,2);
DECLARE VARIABLE VRIVA NUMERIC(18,2);
DECLARE VARIABLE PRTFTE NUMERIC(9,2);
DECLARE VARIABLE VRRTFTE NUMERIC(18,2);
DECLARE VARIABLE VRRTIVA NUMERIC(18,2);
DECLARE VARIABLE PRTICA NUMERIC(9,2);
DECLARE VARIABLE VRRTICA NUMERIC(18,2);
DECLARE VARIABLE VRTOTAL NUMERIC(18,2);
DECLARE VARIABLE VREXTRA NUMERIC(18,2);
DECLARE VARIABLE TIPOCOMP VARCHAR(3);
DECLARE VARIABLE PREFCONT VARCHAR(4);
DECLARE VARIABLE INVEN CHAR(1);
DECLARE VARIABLE CTAINVEN VARCHAR(20);
DECLARE VARIABLE IVA CHAR(1);
DECLARE VARIABLE CTAIVA VARCHAR(20);
DECLARE VARIABLE CONSUMO CHAR(1);
DECLARE VARIABLE CTACONSUMO VARCHAR(20);
DECLARE VARIABLE CXP CHAR(1);
DECLARE VARIABLE CTACXP VARCHAR(20);
DECLARE VARIABLE RTFTE CHAR(1);
DECLARE VARIABLE CTARTFTE VARCHAR(20);
DECLARE VARIABLE RTIVA CHAR(1);
DECLARE VARIABLE CTARTIVA VARCHAR(20);
DECLARE VARIABLE RTICA CHAR(1);
DECLARE VARIABLE CTARTICA VARCHAR(20);
DECLARE VARIABLE CTADTO VARCHAR(20);
DECLARE VARIABLE CTAADIC VARCHAR(20);
DECLARE VARIABLE CTAEXTRA VARCHAR(20);
DECLARE VARIABLE EXISTE CHAR(1);
DECLARE VARIABLE CUENTA VARCHAR(20);
DECLARE VARIABLE MONTO NUMERIC(18,2);
DECLARE VARIABLE TIPOCUEN CHAR(1);
DECLARE VARIABLE NIT VARCHAR(20);
DECLARE VARIABLE NOMBRE VARCHAR(60);
DECLARE VARIABLE PROY VARCHAR(4);
DECLARE VARIABLE CENTRO VARCHAR(4);
DECLARE VARIABLE PROYDET VARCHAR(4);
DECLARE VARIABLE CENTRODET VARCHAR(4);
DECLARE VARIABLE PORC NUMERIC(5,2);
DECLARE VARIABLE NUMITEMS INTEGER;
DECLARE VARIABLE ARTICULO VARCHAR(15);
DECLARE VARIABLE IMPINC CHAR(1);
DECLARE VARIABLE IMPTOS NUMERIC(18,2);
DECLARE VARIABLE SUMA NUMERIC(18,2);
DECLARE VARIABLE PORCIVA NUMERIC(9,2);
DECLARE VARIABLE TCTAPROV VARCHAR(20);
DECLARE VARIABLE TCTARTFTE VARCHAR(20);
DECLARE VARIABLE TCTARTIVA VARCHAR(20);
DECLARE VARIABLE TCTARTICA VARCHAR(20);
DECLARE VARIABLE CUENTAADIC VARCHAR(20);
DECLARE VARIABLE BASEADIC VARCHAR(20);
DECLARE VARIABLE PORCADIC NUMERIC(5,2);
DECLARE VARIABLE VALORADIC NUMERIC(18,2);
DECLARE VARIABLE DBADIC CHAR(1);
DECLARE VARIABLE FOMENTO CHAR(2);
DECLARE VARIABLE BODE_DET CHAR(2);
DECLARE VARIABLE NUMPROV VARCHAR(10);
DECLARE VARIABLE MERCANCIA NUMERIC(18,2);
declare variable FACTOR DOUBLE PRECISION;
DECLARE VARIABLE MENORV CHAR(2);
declare variable DIG INTEGER;
declare variable NETO NUMERIC(18,2);
declare variable CENT CHAR(1);
declare variable ANULADO CHAR(1);
declare variable ERRORC INTEGER;
BEGIN
  /* INTERFACE */
  EXISTE = 'N';
  SELECT 'S', TICO_COD, PRCO_PRE, INCO_INVEN, INCO_IVA, INCO_CONSUMO, INCO_CXP, INCO_RTFTE, INCO_RTIVA, INCO_RTICA, INCO_CTAINVEN, INCO_CTAIVA, INCO_CTACONSUMO, INCO_CTADTO, INCO_CTAADIC, INCO_CTAEXTRA, INCO_CTACXP, INCO_CTARTFTE, INCO_CTARTIVA, INCO_CTARTICA, INCO_CONFIRMAR, INCO_CENTRO
    FROM INTERFAZ_COMPRAS WHERE INCO_ID = :IDINTER INTO :EXISTE, :TIPOCOMP, :PREFCONT, :INVEN, :IVA, :CONSUMO, :CXP, :RTFTE, :RTIVA, :RTICA, :CTAINVEN, :CTAIVA, :CTACONSUMO, :CTADTO, :CTAADIC, :CTAEXTRA, :CTACXP, :CTARTFTE, :CTARTIVA, :CTARTICA, :VER, :CENT;
  if (EXISTE = 'S') then
    BEGIN
    /* BORRE CONTABILIZACION PREVIA */
    DELETE FROM CONTABILIZACION WHERE CNTB_TIPOREF = 21 AND CNTB_IDREF = :IDDOC;
    /* ENCABEZADO DE LA FACTURA */
    SELECT PREF_PRE, FACO_NUMERO, FACO_FECHA, F.TERC_NIT, FACO_IMPTOS, FACO_VENCE, FACO_DTOMONTO, FACO_ADICIONAL, FACO_IVAMONTO, FACO_EXTRA, FACO_TOTAL, FACO_RTFTEPORC, FACO_RTFTEMONTO, FACO_RTIVAPOR, FACO_RTIVAMONTO, FACO_RTICAPOR, FACO_RTICAMONTO, TERC_NOM, PROV_CTARTFTE, PROV_CTARTIVA, PROV_CTARTICA, PROV_CTAPAGAR, FACO_NUMPROV, FACO_ANULADO
        FROM FACTURAS_COMPRA F, TERCEROS T, PROVEEDORES P WHERE FACO_ID = :IDDOC AND F.TERC_NIT = T.TERC_NIT AND T.TERC_NIT = P.TERC_NIT
        INTO :PREFIJO, :NUM, :FECAUX, :NIT, :IMPINC, :VENCEAUX, :VRDTO, :VRADIC, :VRIVA, :VREXTRA, :VRTOTAL, :PRTFTE, :VRRTFTE, :PORC, :VRRTIVA, :PRTICA, :VRRTICA, :NOMBRE, TCTARTFTE, TCTARTIVA, TCTARTICA, TCTAPROV, :NUMPROV, :ANULADO;
    /* CENTRO DE LA BODEGA */
    IF (CENT = 'B') THEN
        SELECT BODE_CENTRO, BODE_PROY FROM BODEGA B, FACTURAS_COMPRA F WHERE B.BODE_COD = F.BODE_COD AND F.FACO_ID = :IDDOC INTO :CENTRO, :PROY;
    ELSE
        SELECT PREF_CENTRO,PREF_PROY  FROM PREFIJOS P, FACTURAS_COMPRA F WHERE P.PREF_PRE = F.PREF_PRE AND F.FACO_ID = :IDDOC AND P.TIDO_COD = 21 INTO :CENTRO, :PROY;
    if (ANULADO = 'N') then
        BEGIN
        NUMERO = PREFIJO || NUM;
        VRSUBT = VRTOTAL - VREXTRA - VRIVA;
        MERCANCIA = VRSUBT - VRADIC + VRDTO;
        EXECUTE PROCEDURE FECHA_A_CONTA(:FECAUX) returning_values (:FECHA);
        EXECUTE PROCEDURE FECHA_A_CONTA(:VENCEAUX) returning_values (:VENCE);
        if (NUMPROV IS NULL) then
            NUMPROV = NUMERO;
        CONCEPTO = 'FC No.' || NUMERO || '-' || SUBSTR(NOMBRE,1,26) || '-NPROV.' || NUMPROV;
        IDC = GEN_ID(ID_CONTABILIZA, 1);
        INSERT INTO CONTABILIZACION (CNTB_ID, CNTB_TIPOCOMP, CNTB_PREFCNT, CNTB_NUMERO, CNTB_FECHA, CNTB_CONCEPTO, CNTB_REF, CNTB_TIPOREF, CNTB_IDREF, CNTB_PREFREF, CNTB_NUMREF, CNTB_PROCESADO)
            VALUES (:IDC, :TIPOCOMP, :PREFCONT, :NUM, :FECHA, :CONCEPTO, '', 21, :IDDOC, :PREFIJO, :NUM, 'N');
        NUMITEMS = 0;
        SUMA = 0;
        NETO = 0;
        ERROR = 0;
        EXECUTE PROCEDURE LEE_CONFIGURACION('COMPRAS', 'FACTURAS', 'USAR IMPOCONSUMO COMO PORCENTAJE DE FOMENTO') RETURNING_VALUES (FOMENTO);
        EXECUTE PROCEDURE lee_configuracion('COMPRAS','FACTURAS','DESCUENTO Y VALOR ADICIONAL DEL DOCUMENTO COMO MENOR VALOR DEL COSTO') returning_values (:MENORV);
        SELECT SUM(FCDE_consumo) from facturas_compras_detalle where faco_id = :IDDOC into :valoradic;
        if (MENORV = 'SI') then
            if (MERCANCIA <> 0) then
                FACTOR = (CAST(VRSUBT AS DOUBLE PRECISION) - VALORADIC) / (CAST(MERCANCIA AS DOUBLE PRECISION) - VALORADIC);
            ELSE
                FACTOR = 1;
        ELSE
           FACTOR = 1;
        SELECT CAST(CONF_VALOR AS INTEGER) FROM CONFIGURACION WHERE CONF_MODULO = 'COMPRAS' AND CONF_CATEGORIA = 'GENERAL' AND CONF_PROPIEDAD = 'REDONDEO AL MULTIPLO DE DIEZ EN TOTALES' INTO :DIG;
        if (INVEN = 'A') then
            BEGIN
            FOR SELECT MAX(COAR_CTACOMP), SUM(CAST(FCDE_CANT AS DOUBLE PRECISION) * (FCDE_PRUNIT-FCDE_DTOMONTO)), SUM(FCDE_IVAMONTO), SUM(FCDE_CONSUMO), MAX(F.BODE_COD)
                FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_COMPRAS_DETALLE F WHERE F.FACO_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD
                GROUP BY COAR_CTACOMP, F.BODE_COD INTO :CTAINVEN, :MONTO, :IMPTOS, :VALORADIC, :BODE_DET DO
                BEGIN
                IF (CENT = 'B') THEN
                  SELECT BODE_CENTRO, BODE_PROY FROM BODEGA WHERE BODE_COD = :BODE_DET INTO :CENTRODET, :PROYDET;
                if (IMPINC = 'S') then
                    BEGIN
                    MONTO = MONTO - IMPTOS;
                    if (FOMENTO <> 'SI' ) then
                        MONTO = MONTO - VALORADIC;
                    END
                MONTO = MONTO * FACTOR;
                execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                EXECUTE PROCEDURE CUENTA_INTERFAZ(21, :IDDOC, :CTAINVEN, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    FOR SELECT F.ARTI_COD, (FCDE_CANT * (FCDE_PRUNIT-FCDE_DTOMONTO)), FCDE_IVAMONTO, FCDE_CONSUMO
                        FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_COMPRAS_DETALLE F WHERE F.FACO_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTACOMP = :CUENTA
                        INTO :ARTICULO, :MONTO, :IMPTOS, :VALORADIC DO
                        BEGIN
                        if (IMPINC = 'S') then
                            BEGIN
                            MONTO = MONTO - IMPTOS;
                            if (FOMENTO <> 'SI' ) then
                                MONTO = MONTO - VALORADIC;
                            END
                        MONTO = MONTO * FACTOR;
                        execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                        IF (CENT = 'B') THEN
                           INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                               VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROYDET, :CENTRODET, NULL, NULL, NULL, :ARTICULO, 0, 0);
                        ELSE
                           INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                               VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                        NUMITEMS = NUMITEMS + 1;
                        NETO = NETO + MONTO;
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    IF (CENT = 'B') THEN
                       INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                           VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROYDET, :CENTRODET, :NUMERO, NULL, :VENCE, NULL, 0, 21);
                    ELSE
                       INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                           VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 21);
                    NUMITEMS = NUMITEMS + 1;
                    NETO = NETO + MONTO;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    IF (CENT = 'B') THEN
                       INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                           VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROYDET, :CENTRODET, NULL, NULL, NULL, NULL, 0, 0);
                    ELSE
                       INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                           VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NUMITEMS = NUMITEMS + 1;
                    NETO = NETO + MONTO;
                    END
                END
            END
        if (INVEN = 'K') then
            BEGIN
            FOR SELECT SUM(CAST(FCDE_CANT AS DOUBLE PRECISION) * (FCDE_PRUNIT-FCDE_DTOMONTO)), SUM(FCDE_IVAMONTO), SUM(FCDE_CONSUMO), MAX(BODE_COD)
                FROM FACTURAS_COMPRAS_DETALLE WHERE FACO_ID = :IDDOC GROUP BY BODE_COD INTO :MONTO, :IMPTOS, :VALORADIC, :BODE_DET Do
                BEGIN
                  IF (CENT = 'B') THEN
                    SELECT BODE_CENTRO, BODE_PROY FROM BODEGA WHERE BODE_COD = :BODE_DET INTO :CENTRODET, :PROYDET;
                  if (IMPINC = 'S') then
                   BEGIN
                    MONTO = MONTO - IMPTOS;
                    if (FOMENTO <> 'SI' ) then
                      MONTO = MONTO - VALORADIC;
                   END
                  MONTO = MONTO * FACTOR;
                  execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                  execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                  EXECUTE PROCEDURE CUENTA_INTERFAZ(21, :IDDOC, :CTAINVEN, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                  if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                  if (TIPOCUEN = 'I') then
                   BEGIN
                    FOR SELECT ARTI_COD, (FCDE_CANT * (FCDE_PRUNIT-FCDE_DTOMONTO)), FCDE_IVAMONTO, FCDE_CONSUMO
                      FROM FACTURAS_COMPRAS_DETALLE WHERE FACO_ID = :IDDOC INTO :ARTICULO, :MONTO, :IMPTOS, :VALORADIC DO
                       BEGIN
                       if (IMPINC = 'S') then
                        BEGIN
                         MONTO = MONTO - IMPTOS;
                         if (FOMENTO <> 'SI' ) then
                            MONTO = MONTO - VALORADIC;
                        END
                       MONTO = MONTO * FACTOR;
                       execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                       execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                       IF (CENT = 'B') THEN
                          INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                             VALUES (:IDC, :NUMITEMS, :CTAINVEN, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROYDET, :CENTRODET, NULL, NULL, NULL, :ARTICULO, 0, 0);
                       ELSE
                          INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                             VALUES (:IDC, :NUMITEMS, :CTAINVEN, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                       NUMITEMS = NUMITEMS + 1;
                       NETO = NETO + MONTO;
                       END
                   END
                  if (TIPOCUEN = 'C') then
                   BEGIN
                    IF (CENT = 'B') THEN
                       INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                         VALUES (:IDC, :NUMITEMS, :CTAINVEN, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROYDET, :CENTRODET, :NUMERO, NULL, :VENCE, NULL, 0, 21);
                    ELSE
                       INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                         VALUES (:IDC, :NUMITEMS, :CTAINVEN, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 21);
                    NUMITEMS = NUMITEMS + 1;
                    NETO = NETO + MONTO;
                   END
                  if (TIPOCUEN = 'N') then
                   BEGIN
                    IF (CENT = 'B') THEN
                       INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                          VALUES (:IDC, :NUMITEMS, :CTAINVEN, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROYDET, :CENTRODET, NULL, NULL, NULL, NULL, 0, 0);
                    ELSE
                       INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                          VALUES (:IDC, :NUMITEMS, :CTAINVEN, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NUMITEMS = NUMITEMS + 1;
                    NETO = NETO + MONTO;
                   END
                END
            END
        /* EL IVA */
        if (IVA = 'A') then
            BEGIN
            FOR SELECT MAX(COAR_CTAIVAC), SUM(FCDE_IVAMONTO), SUM(CAST(FCDE_CANT AS DOUBLE PRECISION) * (FCDE_PRUNIT-FCDE_DTOMONTO)), SUM(FCDE_CONSUMO)
                FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_COMPRAS_DETALLE F
                WHERE F.FACO_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND FCDE_IVAMONTO <> 0
                GROUP BY COAR_CTAIVAC
                INTO :CTAIVA, :IMPTOS, :MONTO, :VALORADIC DO
              if (IMPTOS <> 0) then
                BEGIN
                IMPTOS = CAST(IMPTOS AS DOUBLE PRECISION) * VRSUBT / MERCANCIA;
                if (IMPINC = 'S') then
                    BEGIN
                    MONTO = MONTO - IMPTOS;
                    if (FOMENTO <> 'SI' ) then
                        MONTO = MONTO - VALORADIC;
                    END
                MONTO = CAST(MONTO AS DOUBLE PRECISION) * VRSUBT / MERCANCIA;
                execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                EXECUTE PROCEDURE CUENTA_INTERFAZ(21, :IDDOC, :CTAIVA, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    FOR SELECT F.ARTI_COD, FCDE_IVAMONTO, (FCDE_CANT * (FCDE_PRUNIT-FCDE_DTOMONTO)), TAIV_PORC, FCDE_CONSUMO
                        FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_COMPRAS_DETALLE F, TARIFA_IVA T WHERE F.FACO_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTAIVAV = :CUENTA AND A.TAIV_COD = T.TAIV_COD
                        INTO :ARTICULO, :IMPTOS, :MONTO, :PORCIVA, :VALORADIC
                    DO
                        BEGIN
                        IMPTOS = CAST(IMPTOS AS DOUBLE PRECISION) * VRSUBT / MERCANCIA;
                        if (IMPINC = 'S') then
                            BEGIN
                            MONTO = MONTO - IMPTOS;
                            if (FOMENTO <> 'SI' ) then
                                MONTO = MONTO - VALORADIC;
                            END
                        MONTO = CAST(MONTO AS DOUBLE PRECISION) * VRSUBT / MERCANCIA;
                        execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :IMPTOS, 0, :MONTO, :PORCIVA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                        NUMITEMS = NUMITEMS + 1;
                        NETO = NETO + IMPTOS;
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :IMPTOS, 0, :MONTO, :IMPTOS*100/:MONTO, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 21);
                    NUMITEMS = NUMITEMS + 1;
                    NETO = NETO + IMPTOS;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :IMPTOS, 0, :MONTO, CAST(:IMPTOS AS DOUBLE PRECISION)*100/CAST(:MONTO AS DOUBLE PRECISION), :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NUMITEMS = NUMITEMS + 1;
                    NETO = NETO + IMPTOS;
                    END
                END
            END
        if (IVA = 'K') then /* IVA EN CTA CONSTANTE */
            BEGIN
            SELECT SUM(FCDE_IVAMONTO), SUM(CAST(FCDE_CANT AS DOUBLE PRECISION) * (FCDE_PRUNIT-FCDE_DTOMONTO)), SUM(FCDE_CONSUMO)
                FROM FACTURAS_COMPRAS_DETALLE F
                WHERE F.FACO_ID = :IDDOC  AND FCDE_IVAMONTO <> 0
                INTO :IMPTOS, :MONTO, :VALORADIC;
            if (IMPTOS <> 0) then
                BEGIN
                IMPTOS = CAST(IMPTOS AS DOUBLE PRECISION) * VRSUBT / MERCANCIA;
                if (IMPINC = 'S') then
                    BEGIN
                    MONTO = MONTO - IMPTOS;
                    if (FOMENTO <> 'SI' ) then
                        MONTO = MONTO - VALORADIC;
                    END
                MONTO = CAST(MONTO AS DOUBLE PRECISION) * VRSUBT / MERCANCIA;
                execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                EXECUTE PROCEDURE CUENTA_INTERFAZ(21, :IDDOC, :CTAIVA, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    FOR SELECT F.ARTI_COD, (FCDE_CANT * (FCDE_PRUNIT-FCDE_DTOMONTO)), FCDE_IVAMONTO, TAIV_PORC, FCDE_CONSUMO
                        FROM ARTICULO A, FACTURAS_COMPRAS_DETALLE F, TARIFA_IVA T WHERE F.FACO_ID = :IDDOC AND A.TAIV_COD = T.TAIV_COD
                        INTO :ARTICULO, :MONTO, :IMPTOS, :PORCIVA, :VALORADIC DO
                        BEGIN
                        IMPTOS = CAST(IMPTOS AS DOUBLE PRECISION) * VRSUBT / MERCANCIA;
                        if (IMPINC = 'S') then
                            BEGIN
                            MONTO = MONTO - IMPTOS;
                            if (FOMENTO <> 'SI' ) then
                                MONTO = MONTO - VALORADIC;
                            END
                        MONTO = CAST(MONTO AS DOUBLE PRECISION) * VRSUBT / MERCANCIA;
                        execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                        if (IMPTOS <> 0) then
                            BEGIN
                            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                VALUES (:IDC, :NUMITEMS, :CTAIVA, :CONCEPTO, '', :IMPTOS, 0, :MONTO, :PORCIVA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                            NUMITEMS = NUMITEMS + 1;
                            NETO = NETO + IMPTOS;
                            END
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NUMITEMS, :CTAIVA, :CONCEPTO, '', :IMPTOS, 0, :MONTO, :IMPTOS*100/:MONTO, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 21);
                    NUMITEMS = NUMITEMS + 1;
                    NETO = NETO + IMPTOS;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NUMITEMS, :CTAIVA, :CONCEPTO, '', :IMPTOS, 0, :MONTO, :IMPTOS*100/:MONTO, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NUMITEMS = NUMITEMS + 1;
                    NETO = NETO + IMPTOS;
                    END
                END
            END
        /* EL IMPOCONSUMO */
        if (CONSUMO = 'A') then
            BEGIN
            FOR SELECT MAX(COAR_CTACONS), SUM(FCDE_CONSUMO) FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_COMPRAS_DETALLE F
                WHERE F.FACO_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD GROUP BY COAR_CTACONS INTO :CTACONSUMO, :IMPTOS
            DO
              if (IMPTOS <> 0) then
                BEGIN
                execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                EXECUTE PROCEDURE CUENTA_INTERFAZ(21, :IDDOC, :CTACONSUMO, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (FOMENTO <> 'SI') then
                    BEGIN
                    if (TIPOCUEN = 'I') then
                        BEGIN
                        FOR SELECT F.ARTI_COD, FCDE_CONSUMO FROM ARTICULO A, FACTURAS_COMPRAS_DETALLE F WHERE F.FACO_ID = :IDDOC INTO :ARTICULO, :IMPTOS
                            DO
                            BEGIN
                            if (IMPTOS <> 0) then
                                BEGIN
                                execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                    VALUES (:IDC, :NUMITEMS, :CTACONSUMO, :CONCEPTO, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                                NUMITEMS = NUMITEMS + 1;
                                NETO = NETO + IMPTOS;
                                END
                            END
                        END
                    if (TIPOCUEN = 'C') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CTACONSUMO, :CONCEPTO, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                        NUMITEMS = NUMITEMS + 1;
                        NETO = NETO + IMPTOS;
                        END
                    if (TIPOCUEN = 'N') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CTACONSUMO, :CONCEPTO, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NUMITEMS = NUMITEMS + 1;
                        NETO = NETO + IMPTOS;
                        END
                    END
                ELSE
                    BEGIN
                    if (TIPOCUEN = 'I') then
                        BEGIN
                        FOR SELECT F.ARTI_COD, FCDE_CONSUMO FROM ARTICULO A, FACTURAS_COMPRAS_DETALLE F WHERE F.FACO_ID = :IDDOC INTO :ARTICULO, :IMPTOS
                            DO
                            BEGIN
                            if (IMPTOS <> 0) then
                                BEGIN
                                execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                    VALUES (:IDC, :NUMITEMS, :CTACONSUMO, :CONCEPTO, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                                NUMITEMS = NUMITEMS + 1;
                                NETO = NETO - IMPTOS;
                                END
                            END
                        END
                    if (TIPOCUEN = 'C') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CTACONSUMO, :CONCEPTO, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                        NUMITEMS = NUMITEMS + 1;
                        NETO = NETO - IMPTOS;
                        END
                    if (TIPOCUEN = 'N') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CTACONSUMO, :CONCEPTO, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NUMITEMS = NUMITEMS + 1;
                        NETO = NETO - IMPTOS;
                        END
                    END
                END
            END
        if (CONSUMO = 'K') then /* CONSUMO EN CTA CONSTANTE */
            BEGIN
            SELECT SUM(FCDE_CONSUMO) FROM FACTURAS_COMPRAS_DETALLE F WHERE F.FACO_ID = :IDDOC INTO :IMPTOS;
            if (IMPTOS <> 0) then
              BEGIN
              execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
              /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
              EXECUTE PROCEDURE CUENTA_INTERFAZ(21, :IDDOC, :CTACONSUMO, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
              if (ERRORC <> 0) then
                ERROR = ERROR + 1;
              if (FOMENTO <> 'SI') then
                BEGIN
                /* DEPENDE DEL TIPO DE CUENTA */
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT F.ARTI_COD, FCDE_CONSUMO FROM ARTICULO A, FACTURAS_COMPRAS_DETALLE F WHERE F.FACO_ID = :IDDOC INTO :ARTICULO, :IMPTOS
                        DO
                        BEGIN
                        if (IMPTOS <> 0) then
                            BEGIN
                            execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                VALUES (:IDC, :NUMITEMS, :CTACONSUMO, :CONCEPTO, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                            NUMITEMS = NUMITEMS + 1;
                            NETO = NETO + IMPTOS;
                            END
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    /* INSERTE EL REGISTRO DE LA BASE */
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NUMITEMS, :CTACONSUMO, :CONCEPTO, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    NUMITEMS = NUMITEMS + 1;
                    NETO = NETO + IMPTOS;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NUMITEMS, :CTACONSUMO, :CONCEPTO, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NUMITEMS = NUMITEMS + 1;
                    NETO = NETO + IMPTOS;
                    END
                END
              ELSE
                BEGIN
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT F.ARTI_COD, FCDE_CONSUMO FROM ARTICULO A, FACTURAS_COMPRAS_DETALLE F WHERE F.FACO_ID = :IDDOC INTO :ARTICULO, :IMPTOS
                        DO
                        BEGIN
                        if (IMPTOS <> 0) then
                            BEGIN
                           execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                           INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                VALUES (:IDC, :NUMITEMS, :CTACONSUMO, :CONCEPTO, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                            NUMITEMS = NUMITEMS + 1;
                            NETO = NETO - IMPTOS;
                            END
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    /* INSERTE EL REGISTRO DE LA BASE */
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NUMITEMS, :CTACONSUMO, :CONCEPTO, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    NUMITEMS = NUMITEMS + 1;
                    NETO = NETO - IMPTOS;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NUMITEMS, :CTACONSUMO, :CONCEPTO, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NUMITEMS = NUMITEMS + 1;
                    NETO = NETO - IMPTOS;
                    END
                END
              end
            END
        /* DESCUENTO */
        if ((CTADTO IS NOT NULL) AND
            (CTADTO <> '')) THEN
          BEGIN
          execute procedure redondee(VRDTO, DIG) returning_values (VRDTO);
          if (VRDTO <> 0) then
            begin
            /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
            EXECUTE PROCEDURE CUENTA_INTERFAZ(21, :IDDOC, :CTADTO, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :VRDTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 21);
                NUMITEMS = NUMITEMS + 1;
                NETO = NETO - VRDTO;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                /* INSERTE EL REGISTRO DE LA BASE */
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :VRDTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NUMITEMS = NUMITEMS + 1;
                NETO = NETO - VRDTO;
                END
            end
          END
        /* VALOR ADIC */
        if ((CTAADIC IS NOT NULL) AND
            (CTAADIC <> '')) THEN
          BEGIN
          execute procedure redondee(VRADIC, DIG) returning_values (VRADIC);
          if (VRADIC <> 0) then
            begin
            /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
            EXECUTE PROCEDURE CUENTA_INTERFAZ(21, :IDDOC, :CTAADIC, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :VRADIC, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 21);
                NUMITEMS = NUMITEMS + 1;
                NETO = NETO + VRADIC;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :VRADIC, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NUMITEMS = NUMITEMS + 1;
                NETO = NETO + VRADIC;
                END
            end
          END
        /* VALOR EXTRA */
        if ((CTAEXTRA IS NOT NULL) AND
            (CTAEXTRA <> '')) THEN
          BEGIN
          execute procedure redondee(VREXTRA, DIG) returning_values (VREXTRA);
          if (VREXTRA <> 0) then
            begin
            /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
            EXECUTE PROCEDURE CUENTA_INTERFAZ(21, :IDDOC, :CTAEXTRA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :VREXTRA, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 21);
                NUMITEMS = NUMITEMS + 1;
                NETO = NETO + VREXTRA;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :VREXTRA, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NUMITEMS = NUMITEMS + 1;
                NETO = NETO + VREXTRA;
                END
            end
          END

        /* DESCUENTE EL IMPOCONSUMO */
        SELECT SUM(FCDE_CONSUMO) FROM FACTURAS_COMPRAS_DETALLE F WHERE F.FACO_ID = :IDDOC INTO :IMPTOS;
        if (IMPTOS IS NULL) then
            IMPTOS = 0;
        vrsubt = vrsubt - IMPTOS;
        /* RETENCION FUENTE */
        if ((RTFTE = 'P') or (RTFTE = 'K')) then
          BEGIN
          execute procedure redondee(VRRTFTE, DIG) returning_values (VRRTFTE);
          if (VRRTFTE <> 0) then
            begin
            if (RTFTE = 'P') then
                CTARTFTE = TCTARTFTE;
            EXECUTE PROCEDURE CUENTA_INTERFAZ(21, :IDDOC, :CTARTFTE, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :VRRTFTE, (:VRSUBT*-1), :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NUMITEMS = NUMITEMS + 1;
                NETO = NETO - VRRTFTE;
                SUMA = VRRTFTE;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :VRRTFTE, (:VRSUBT*-1), :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NUMITEMS = NUMITEMS + 1;
                NETO = NETO - VRRTFTE;
                SUMA = VRRTFTE;
                END
            end
          END
        if (RTFTE = 'A') then
          BEGIN
          FOR SELECT MAX(COAR_CTARTFTE), MAX(COAR_RTFTE), MIN(COAR_RTBASE), SUM(FCDE_TOTAL-FCDE_IVAMONTO-FCDE_CONSUMO), SUM((FCDE_TOTAL-FCDE_IVAMONTO-FCDE_CONSUMO)*COAR_RTFTE)
            FROM CONTABIL_ARTICULO C, FACTURAS_COMPRAS_DETALLE F
            WHERE F.faco_id = :IDDOC AND F.ARTI_COD = C.ARTI_COD
            GROUP BY COAR_CTARTFTE
            INTO :CTARTFTE, :PRTFTE, :baseadic,  :MONTO, :VRRTFTE
            DO
            BEGIN
            MONTO = MONTO * FACTOR * -1;
            if (ABS(MONTO) >= :baseadic) then
                BEGIN
                VRRTFTE = VRRTFTE * FACTOR / 100;
                execute procedure redondee(VRRTFTE, DIG) returning_values (VRRTFTE);
                execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                if (VRRTFTE <> 0) then
                    BEGIN
                    EXECUTE PROCEDURE CUENTA_INTERFAZ(21, :IDDOC, :CTARTFTE, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
                    if (ERRORC <> 0) then
                        ERROR = ERROR + 1;
                    if (TIPOCUEN = 'C') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :VRRTFTE, :MONTO, :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                        NUMITEMS = NUMITEMS + 1;
                        NETO = NETO - VRRTFTE;
                        SUMA = VRRTFTE;
                        END
                    if (TIPOCUEN = 'N') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :VRRTFTE, :MONTO, :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NUMITEMS = NUMITEMS + 1;
                        NETO = NETO - VRRTFTE;
                        SUMA = VRRTFTE;
                        END
                    end
                end
              END
          END
        /* RETENCION IVA */
        if ((RTIVA = 'P') or (RTIVA = 'K')) then
          BEGIN
          execute procedure redondee(VRRTIVA, DIG) returning_values (VRRTIVA);
          if (VRRTIVA <> 0) then
            begin
            if (RTIVA = 'P') then
                CTARTIVA = TCTARTIVA;
            EXECUTE PROCEDURE CUENTA_INTERFAZ(21, :IDDOC, :CTARTIVA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :VRRTIVA, (:VRIVA*-1), :PORC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 21);
                NUMITEMS = NUMITEMS + 1;
                NETO = NETO - VRRTIVA;
                SUMA = SUMA + VRRTIVA;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :VRRTIVA, (:VRIVA*-1), :PORC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NUMITEMS = NUMITEMS + 1;
                NETO = NETO - VRRTIVA;
                SUMA = SUMA + VRRTIVA;
                END
            end
          END
        /* RETENCION DE ICA */
        if ((RTICA = 'P') or (RTICA = 'K')) then
          BEGIN
          execute procedure redondee(VRRTICA, DIG) returning_values (VRRTICA);
          if (VRRTICA <> 0) then
            begin
            if (RTICA = 'P') then
                CTARTICA = TCTARTICA;
            EXECUTE PROCEDURE CUENTA_INTERFAZ(21, :IDDOC, :CTARTICA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :VRRTICA, (:VRSUBT*-1), :PRTICA, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 21);
                NUMITEMS = NUMITEMS + 1;
                NETO = NETO - VRRTICA;
                SUMA = SUMA + VRRTICA;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :VRRTICA, (:VRSUBT*-1), :PRTICA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NUMITEMS = NUMITEMS + 1;
                NETO = NETO - VRRTICA;
                SUMA = SUMA + VRRTICA;
                END
            end
          END
        /* CIERRE EL COMPROBANTE CONTRA LA CUENTA DEL TERCERO O LA CONSTANTE */
        if ((CXP = 'P') or (CXP = 'K')) then
            BEGIN
            SUMA = VRTOTAL - SUMA;
            execute procedure redondee(SUMA, DIG) returning_values (SUMA);
            if (CXP = 'P') then
                CTACXP = TCTAPROV;
            EXECUTE PROCEDURE CUENTA_INTERFAZ(21, :IDDOC, :CTACXP, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :SUMA, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 21);
            if (TIPOCUEN = 'N') then
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :SUMA, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NETO = NETO - SUMA;
            NUMITEMS = NUMITEMS + 1;
            END
        /* recorra las cuentas adicionales */
        FOR SELECT INCC_CUENTA, INCC_BASE, INCC_PORC, INCC_VALOR, INCC_DB FROM INTERFAZ_COMPRAS_CTAS
            WHERE INCO_ID = :IDINTER INTO :CUENTAADIC, :BASEADIC, :PORCADIC, :VALORADIC, :DBADIC
            DO
            BEGIN
            if (VALORADIC <> 0) then
                MONTO = VALORADIC;
            ELSE
                BEGIN
                if (:BASEADIC = 'SUBTOTAL') then
                    VALORADIC = VRTOTAL - VREXTRA - VRIVA - VRADIC + VRDTO;
                if (:BASEADIC = 'DESCUENTO') then
                    VALORADIC = VRDTO;
                if (:BASEADIC = 'IVA') then
                    VALORADIC = VRIVA;
                if (:BASEADIC = 'CONSUMO') then
                    SELECT SUM(FCDE_CONSUMO) FROM FACTURAS_COMPRAS_DETALLE F WHERE F.FACO_ID = :IDDOC INTO :VALORADIC;
                if (:BASEADIC = 'ADICIONAL') then
                    VALORADIC = VRADIC;
                if (:BASEADIC = 'EXTRA') then
                    VALORADIC = VREXTRA;
                if (:BASEADIC = 'TOTAL') then
                    VALORADIC = VRTOTAL;
                MONTO = CAST(VALORADIC AS DOUBLE PRECISION) * PORCADIC / 100;
                END
            if (MONTO <> 0) then
                BEGIN
                execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                EXECUTE PROCEDURE CUENTA_INTERFAZ(21, :IDDOC, :CUENTAADIC, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'C') then
                    BEGIN
                    if (DBADIC = 'S') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTAADIC, :CONCEPTO, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                        SUMA = SUMA + MONTO;
                        NETO = NETO + MONTO;
                        END
                    ELSE
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTAADIC, :CONCEPTO, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                        SUMA = SUMA - MONTO;
                        NETO = NETO - MONTO;
                        END
                    NUMITEMS = NUMITEMS + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    if (DBADIC = 'S') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTAADIC, :CONCEPTO, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        SUMA = SUMA + MONTO;
                        NETO = NETO + MONTO;
                        END
                    ELSE
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTAADIC, :CONCEPTO, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        SUMA = SUMA - MONTO;
                        NETO = NETO - MONTO;
                        END
                    NUMITEMS = NUMITEMS + 1;
                    END
                END
            END
        if (NETO <> 0) then
            BEGIN
            EXECUTE PROCEDURE lee_configuracion ('CONTABILIDAD','GENERAL','CUENTA PARA CUADRAR COMPROBANTES DESCUADRADOS DE INTERFAZ') returning_values (:ctaadic);
            if (ctaadic <> '') then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(21, :IDDOC, :CTAADIC, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'C') then
                    BEGIN
                    if (NETO < 0) then
                        BEGIN
                        NETO = NETO * -1;
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :NETO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                        END
                    ELSE
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :NETO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                        END
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    if (NETO < 0) then
                        BEGIN
                        NETO = NETO * -1;
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :NETO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        END
                    ELSE
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :NETO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        END
                    END
                END
            END
        END
    if (ERROR > 0) then
        VER = 'S';
    SUSPEND;
    END
ELSE
    BEGIN
    EXECUTE PROCEDURE ERROR (21, :IDDOC, :PREFIJO, 1);
    ERROR = ERROR + 1;
    VER = 'S';
    SUSPEND;
    END
END
^

SET TERM ; ^

    SET TERM ^ ;

ALTER PROCEDURE CONTABILICE_COMP_SIMPLIFICADO(
    IDI INTEGER)
RETURNS (
    ID INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    ESTADO VARCHAR(20),
    IDC INTEGER)
AS
 /*$$IBE$$ DECLARE VARIABLE VER CHAR(2);
declare variable ERROR INTEGER; $$IBE$$*/ 
BEGIN /*$$IBE$$ 
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;
   $$IBE$$*/ /* 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; */ /*$$IBE$$ 
  EXECUTE PROCEDURE CONTABIL_FACTCOMP (:ID, :IDI) RETURNING_VALUES (:ERROR, VER, :IDC);
  if (ERROR = 0) then
    BEGIN
 $$IBE$$*/ /*    EXECUTE PROCEDURE CONTABILIZA_PENDIENTE (:IDC); */ /*$$IBE$$ 
    ESTADO = 'OK';
    END
  ELSE
    ESTADO = 'ERROR';
  suspend;
  END
 $$IBE$$*/ SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE FACTCOMP_SIN_CONTABILIDAD(
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    ID INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    ESTADO VARCHAR(20),
    IDI INTEGER,
    IDC INTEGER)
AS
 /*$$IBE$$ DECLARE VARIABLE VER CHAR(2);
declare variable FECICNT VARCHAR(10);
declare variable FECFCNT VARCHAR(10);
declare variable ERROR INTEGER;
declare variable idref INTEGER; $$IBE$$*/ 
BEGIN /*$$IBE$$ 
EXECUTE PROCEDURE fecha_a_conta(FECINI) returning_values (FECICNT);
EXECUTE PROCEDURE fecha_a_conta(FECFIN) returning_values (FECFCNT);
FOR SELECT FACO_ID, PREF_PRE, FACO_NUMERO FROM FACTURAS_COMPRA WHERE FACO_ANULADO = 'N' AND
    FACO_FECHA >= :FECINI AND FACO_FECHA <= :FECFIN ORDER BY FACO_ID
    INTO :ID, :PREF, :NUMERO
DO
  BEGIN
  idref = null;
  SELECT ENCO_IDREF FROM COMPROBANTE_ENCABEZADO WHERE ENCO_TIPOREF = 21 AND ENCO_FECHA >= :FECICNT AND ENCO_FECHA <= :FECFCNT and ENCO_IDREF = :id into :idref;
  if (idref IS NULL) then
  begin
   ESTADO = 'PROCESANDO';
   SUSPEND;
   SELECT MAX(INCO_ID) FROM INTERFAZ_COMPRAS WHERE PREF_PRE = :PREF AND TIDO_COD = 21 INTO :IDI;
   EXECUTE PROCEDURE CONTABIL_FACTCOMP (:ID, :IDI) RETURNING_VALUES (:ERROR, VER, :IDC);
   if (ERROR = 0) then
    BEGIN
    EXECUTE PROCEDURE CONTABILIZA_PENDIENTE (:IDC);
    ESTADO = 'OK';
    END
   ELSE
    ESTADO = 'ERROR';
   suspend;
  End
  END
 $$IBE$$*/ SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

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

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE FACTCOMP_SIN_CONTABILIDAD(
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    ID INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    ESTADO VARCHAR(20),
    IDI INTEGER,
    IDC INTEGER)
AS
DECLARE VARIABLE VER CHAR(2);
declare variable FECICNT VARCHAR(10);
declare variable FECFCNT VARCHAR(10);
declare variable ERROR INTEGER;
declare variable idref INTEGER;
BEGIN
EXECUTE PROCEDURE fecha_a_conta(FECINI) returning_values (FECICNT);
EXECUTE PROCEDURE fecha_a_conta(FECFIN) returning_values (FECFCNT);
FOR SELECT FACO_ID, PREF_PRE, FACO_NUMERO FROM FACTURAS_COMPRA WHERE FACO_ANULADO = 'N' AND
    FACO_FECHA >= :FECINI AND FACO_FECHA <= :FECFIN ORDER BY FACO_ID
    INTO :ID, :PREF, :NUMERO
DO
  BEGIN
  idref = null;
  SELECT ENCO_IDREF FROM COMPROBANTE_ENCABEZADO WHERE ENCO_TIPOREF = 21 AND ENCO_FECHA >= :FECICNT AND ENCO_FECHA <= :FECFCNT and ENCO_IDREF = :id into :idref;
  if (idref IS NULL) then
  begin
   ESTADO = 'PROCESANDO';
   SUSPEND;
   SELECT MAX(INCO_ID) FROM INTERFAZ_COMPRAS WHERE PREF_PRE = :PREF AND TIDO_COD = 21 INTO :IDI;
   EXECUTE PROCEDURE CONTABIL_FACTCOMP (:ID, :IDI) RETURNING_VALUES (:ERROR, VER, :IDC);
   if (ERROR = 0) then
    BEGIN
    EXECUTE PROCEDURE CONTABILIZA_PENDIENTE (:IDC);
    ESTADO = 'OK';
    END
   ELSE
    ESTADO = 'ERROR';
   suspend;
  End
  END
END

^

SET TERM ; ^


/* 20090814 */
/* devolucion de facturas del pos con negativos falla si el articulo devuelto se repite */
SET TERM ^ ;

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

SET TERM ; ^

SET TERM ^ ;

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

SET TERM ; ^


/* 20090819 */
/* AGREGUE LOS MOVIMIENTOS PENDIENTES DE LA ANTERIOR CONCILIACION */

SET TERM ^ ;

CREATE OR ALTER procedure CONCILIA_BANCO (
    ID integer)
AS
declare variable fecini date;
declare variable fecfin date;
declare variable item integer;
declare variable db char(1);
declare variable cuenta integer;
declare variable tipodoc integer;
declare variable iddoc integer;
declare variable prefijo varchar(4);
declare variable numero varchar(6);
declare variable fecha date;
declare variable concepto varchar(60);
declare variable monto numeric(18,2);
declare variable CONANT INTEGER;
begin
select CUBA_COD, COBN_FECINI, COBN_FECFIN FROM conciliacion_encabezado WHERE COBN_ID = :ID INTO :CUENTA, :FECINI, :FECFIN;
SELECT MAX(COBN_ITEM) FROM conciliacion_bancaria WHERE COBN_ID = :ID INTO :item;
/* AGREGUE LOS PENDIENTES DE LA ULTIMA CONCILIACION DE ESA CUENTA */
SELECT FIRST 1 COBN_ID FROM conciliacion_encabezado WHERE CUBA_COD = :CUENTA AND COBN_FECINI < :FECINI ORDER BY COBN_FECINI DESC INTO :CONANT;
FOR SELECT COBN_FEC, COBN_TIPODOC, COBN_DB, COBN_CONC, ABS(COBN_MONTO) FROM conciliacion_bancaria
    WHERE ((COBN_IDDOC = 0) or (cobn_iddoc is null)) and COBN_ID = :CONANT
    INTO :fecha, :tipodoc, :db, :concepto, :monto
    DO
    BEGIN
    ITEM = ITEM + 1;
    if (DB = 'N') then
        INSERT INTO conciliacion_bancaria (CUBA_COD, COBN_ID, COBN_ITEM, COBN_FEC, COBN_PREFIJO, COBN_NUMERO, COBN_MONTO, COBN_TIPODOC, COBN_ANULADO, COBN_OK, COBN_CONC, COBN_IDDOC, COBN_DB, COBN_CLASE)
            VALUES (:CUENTA, :ID, :ITEM, :FECHA, NULL, NULL, :monto, :TIPODOC, 'N', 'N', :concepto, NULL, :DB, '2');
    else
        INSERT INTO conciliacion_bancaria (CUBA_COD, COBN_ID, COBN_ITEM, COBN_FEC, COBN_PREFIJO, COBN_NUMERO, COBN_MONTO, COBN_TIPODOC, COBN_ANULADO, COBN_OK, COBN_CONC, COBN_IDDOC, COBN_DB, COBN_CLASE)
            VALUES (:CUENTA, :ID, :ITEM, :FECHA, NULL, NULL, :monto, :TIPODOC, 'N', 'N', :concepto, NULL, :DB, '1');
    END

/* COMPARE LA TABLA CON LOS MOVIMIENTOS DEL BANCO */
FOR SELECT COBN_ITEM, ABS(COBN_MONTO), COBN_FEC, COBN_TIPODOC, COBN_DB, COBN_CONC
    FROM CONCILIACION_BANCARIA
    WHERE COBN_ID = :ID AND ((COBN_IDDOC = 0) or (cobn_iddoc is null))
    INTO :ITEM, :MONTO, :FECHA, :TIPODOC, :DB, :concepto
    DO
    BEGIN
    PREFIJO = '';
    NUMERO = '';
    IDDOC = 0;
    /* BUSQUE LA OPERACION  */
    if (TIPODOC <> 0) then
        BEGIN
        SELECT FIRST 1 MOBA_PREF, MOBA_NUMERO, MOBA_IDREF
            FROM movimiento_banco M WHERE MOBA_TIPODOC = :tipodoc AND MOBA_TOTAL = :MONTO AND M.cuba_cod = :cuenta AND MOBA_FECHA >= :FECINI AND MOBA_FECHA <= :FECFIN  AND
                NOT EXISTS (SELECT COBN_ITEM FROM CONCILIACION_BANCARIA WHERE COBN_IDDOC = m.moba_idref AND COBN_TIPODOC = :tipodoc and COBN_ID = :ID)
            ORDER BY ABS(MOBA_FECHA - :FECHA)
            INTO :prefijo, :numero, :IDDOC;
        if (PREFIJO <> '') then
            BEGIN
            UPDATE conciliacion_bancaria SET COBN_PREFIJO = :PREFIJO, COBN_NUMERO = :NUMERO, COBN_IDDOC = :iddoc, COBN_OK = 'S', COBN_CLASE = '0'
                WHERE COBN_ID = :ID AND COBN_ITEM = :ITEM;
            END
        ELSE
            BEGIN
            /* BUSQUELO COMO DEBITO O CREDITO SIN IMPORTAR EL TIPO */
            SELECT FIRST 1 MOBA_PREF, MOBA_NUMERO, MOBA_IDREF
                FROM movimiento_banco M WHERE MOBA_DB = :DB AND MOBA_TOTAL = :MONTO AND M.cuba_cod = :cuenta AND MOBA_FECHA >= :FECINI AND MOBA_FECHA <= :FECFIN AND
                    NOT EXISTS (SELECT COBN_ITEM FROM CONCILIACION_BANCARIA WHERE COBN_IDDOC = m.moba_idref AND COBN_TIPODOC = :tipodoc and COBN_ID = :ID)
                ORDER BY ABS(MOBA_FECHA - :FECHA)
                INTO :prefijo, :numero, :IDDOC;
            if (PREFIJO <> '') then
                BEGIN
                UPDATE conciliacion_bancaria SET COBN_PREFIJO = :PREFIJO, COBN_NUMERO = :NUMERO, COBN_IDDOC = :iddoc, COBN_OK = 'S', COBN_CLASE = '0'
                    WHERE COBN_ID = :ID AND COBN_ITEM = :ITEM;
                END
            ELSE
                BEGIN
                if (DB = 'N') then
                    UPDATE conciliacion_bancaria SET COBN_OK = 'N', COBN_CLASE = '2'
                        WHERE COBN_ID = :ID AND COBN_ITEM = :ITEM;
                else
                    UPDATE conciliacion_bancaria SET COBN_OK = 'N', COBN_CLASE = '1'
                        WHERE COBN_ID = :ID AND COBN_ITEM = :ITEM;
                END
            END
        END
    ELSE
        BEGIN
        /* BUSQUELO COMO DEBITO O CREDITO SIN IMPORTAR EL TIPO */
        SELECT FIRST 1 MOBA_PREF, MOBA_NUMERO, MOBA_IDREF, MOBA_TIPODOC
            FROM movimiento_banco M WHERE MOBA_DB = :DB AND MOBA_TOTAL = :MONTO AND M.cuba_cod = :cuenta AND MOBA_FECHA >= :FECINI AND MOBA_FECHA <= :FECFIN AND
                NOT EXISTS (SELECT COBN_ITEM FROM CONCILIACION_BANCARIA WHERE COBN_IDDOC = m.moba_idref AND COBN_DB = :DB and COBN_ID = :ID)
            ORDER BY ABS(MOBA_FECHA - :FECHA)
            INTO :prefijo, :numero, :IDDOC, :TIPODOC;
        if (PREFIJO <> '') then
            BEGIN
            UPDATE conciliacion_bancaria SET COBN_PREFIJO = :PREFIJO, COBN_NUMERO = :NUMERO, COBN_IDDOC = :iddoc, COBN_TIPODOC = :TIPODOC, COBN_OK = 'S', COBN_CLASE = '0'
                WHERE COBN_ID = :ID AND COBN_ITEM = :ITEM;
            END
        ELSE
            BEGIN
            if (DB = 'N') then
                UPDATE conciliacion_bancaria SET COBN_OK = 'N', COBN_CLASE = '2'
                    WHERE COBN_ID = :ID AND COBN_ITEM = :ITEM;
            else
                UPDATE conciliacion_bancaria SET COBN_OK = 'N', COBN_CLASE = '1'
                    WHERE COBN_ID = :ID AND COBN_ITEM = :ITEM;
            END
        END
    END
/* AGREGUE LOS DOCUMENTOS SIN UBICAR */
FOR SELECT MOBA_PREF, MOBA_NUMERO, MOBA_FECHA, MOBA_TOTAL, MOBA_CONCEPTO, MOBA_TIPODOC, MOBA_IDREF, MOBA_DB
    FROM MOVIMIENTO_BANCO M
    WHERE MOBA_FECHA >= :FECINI AND MOBA_FECHA <= :FECFIN  AND M.cuba_cod = :cuenta AND
        NOT EXISTS (SELECT COBN_ITEM FROM conciliacion_bancaria WHERE COBN_TIPODOC = M.moba_tipodoc AND COBN_IDDOC = M.moba_idref and COBN_ID = :ID)
    INTO :prefijo, :numero, :fecha, :monto, :concepto, :tipodoc, :iddoc, :DB
    DO
    BEGIN
    ITEM = ITEM + 1;
    if (DB = 'N') then
        INSERT INTO conciliacion_bancaria (CUBA_COD, COBN_ID, COBN_ITEM, COBN_FEC, COBN_PREFIJO, COBN_NUMERO, COBN_MONTO, COBN_TIPODOC, COBN_ANULADO, COBN_OK, COBN_CONC, COBN_IDDOC, COBN_DB, COBN_CLASE)
            VALUES (:CUENTA, :ID, :ITEM, :FECHA, :PREFIJO, :NUMERO, :monto, :TIPODOC, 'N', 'N', :concepto, :iddoc, :DB, '4');
    else
        INSERT INTO conciliacion_bancaria (CUBA_COD, COBN_ID, COBN_ITEM, COBN_FEC, COBN_PREFIJO, COBN_NUMERO, COBN_MONTO, COBN_TIPODOC, COBN_ANULADO, COBN_OK, COBN_CONC, COBN_IDDOC, COBN_DB, COBN_CLASE)
            VALUES (:CUENTA, :ID, :ITEM, :FECHA, :PREFIJO, :NUMERO, :monto, :TIPODOC, 'N', 'N', :concepto, :iddoc, :DB, '3');
    END
end
^

SET TERM ; ^



/* 20090819B */
/* CONSOLIDADO EXTENDIDO NO INCLUIA LOS MOVMIENTOS MAYORES A 90 DIAS EN EL SALDO */
SET TERM ^ ;

CREATE OR ALTER procedure REP_ANALISIS_CARTERA (
    DESDE varchar(20),
    HASTA varchar(20),
    GRPINI varchar(5),
    GRPFIN varchar(5),
    FECHA date,
    DETALLE char(1),
    ORDEN char(1),
    AGRUPA char(1),
    DIASR integer,
    SUBEMPRESA integer,
    GRUPCART integer,
    EXTENDIDA char(1),
    MONEDA integer)
returns (
    NIT varchar(20),
    NOMBRE varchar(60),
    TELEFONO varchar(40),
    CIUDAD varchar(40),
    CONTACTO varchar(60),
    EMAIL varchar(100),
    FAX varchar(25),
    CEL varchar(25),
    CODCLI varchar(20),
    CODZONA varchar(2),
    NOMZONA varchar(60),
    CODCOBR integer,
    NOMCOBR varchar(60),
    DV char(1),
    CODCIUD char(5),
    NOMCIUD varchar(60),
    SUCURSAL varchar(10),
    NOMSUC varchar(60),
    TIPO integer,
    ID integer,
    PREFIJO varchar(4),
    NUMERO varchar(6),
    DIAS integer,
    SALDO numeric(18,2),
    CORRIENTE numeric(18,2),
    CERO numeric(18,2),
    TREINTA numeric(18,2),
    SESENTA numeric(18,2),
    NOVENTA numeric(18,2),
    CIENTOCHENTA numeric(18,2),
    DOSSETENTA numeric(18,2),
    TRESSESENTA numeric(18,2),
    PROVISIONAL numeric(18,2),
    TIPONOM varchar(8),
    FECDOC date,
    VENCE date,
    CUPO numeric(18,2),
    DISPONIBLE numeric(18,2),
    OBS blob sub_type 0 segment size 80,
    GRUPCOD integer,
    DIA_CAR integer,
    GRUPNOM varchar(30))
AS
DECLARE VARIABLE NITINI VARCHAR(20);
DECLARE VARIABLE NITFIN VARCHAR(20);
DECLARE VARIABLE NOMINI VARCHAR(20);
DECLARE VARIABLE NOMFIN VARCHAR(20);
DECLARE VARIABLE RTFTE NUMERIC(18,2);
DECLARE VARIABLE RTIVA NUMERIC(18,2);
DECLARE VARIABLE RTICA NUMERIC(18,2);
DECLARE VARIABLE VENCIMIENTO VARCHAR(12);
DECLARE VARIABLE OK CHAR(1);
declare variable AUTORET VARCHAR(10);
declare variable FAUTORET DATE;
declare variable INCLANTI CHAR(2);
declare variable descnt_prov char(2);
declare variable MAXDIAS INTEGER;
DECLARE VARIABLE TRM NUMERIC(18,2);
BEGIN
if (ORDEN = 'C') then
    BEGIN
    NITINI = DESDE;
    NITFIN = HASTA;
    NOMINI = '';
    NOMFIN = 'zz';
    END
ELSE
    BEGIN
    NOMINI = DESDE;
    NOMFIN = HASTA;
    NITINI = '';
    NITFIN = 'zz';
    END
/* Ubique el NIT */
EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'FECHA AUTORETENEDOR NO DESCONTAR RETENCIONES DEL SALDO PERO SI CONTABILIZARLAS') returning_values (AUTORET);
if (AUTORET <> '') then
    FAUTORET = CAST(AUTORET AS DATE);
else
    FAUTORET = '9999/12/31';
EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'ANALISIS DE CARTERA CON FECHA FACTURA O VENCIMIENTO') returning_values (VENCIMIENTO);
EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'INCLUIR ANTICIPOS DE CLIENTES EN REPORTES Y CONSULTAS DE CARTERA') returning_values (INCLANTI);
EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'DESCONTAR RECIBOS PROVISIONALES EN INFORMES DE CARTERA') RETURNING_VALUES (:descnt_prov);

FOR select T.TERC_NIT, TERC_NOM, TERC_DV, CLSU_TEL, CLSU_CIUDAD, S.COBR_COD, S.ZONA_COD, T.CIUD_COD, CLIE_CUPO, CLIE_DIAS, CLCU_COD, CLSU_NOMBRE, t.terc_obs, C.GRCA_COD, TERC_CONTACTO, TERC_EMAIL, TERC_FAX, TERC_CEL, CLIE_COD
    from terceros T, CLIENTES C, CLIENTE_SUCURSALES S
    where C.TERC_NIT = T.TERC_NIT AND TERC_CLIE = 'S' AND S.TERC_NIT = C.TERC_NIT and T.TERC_NIT >= :NITINI AND T.TERC_NIT <= :NITFIN AND
        T.TERC_NOM >= :NOMINI AND T.TERC_NOM <= :NOMFIN AND ((:GRUPCART = 0) or (C.GRCA_COD = :GRUPCART))
    INTO :NIT, :NOMBRE, :DV, :TELEFONO, :CIUDAD, :CODCOBR, :CODZONA, :CODCIUD, :CUPO, :DIA_CAR,  :SUCURSAL, :NOMSUC, :obs, :GRUPCOD, :CONTACTO, :EMAIL, :FAX, :CEL, :CODCLI
    DO  
    BEGIN
    SELECT COBR_NOM FROM COBRADORES CB WHERE COBR_COD = :CODCOBR INTO :NOMCOBR;
    SELECT ZONA_NOM FROM ZONAS Z WHERE ZONA_COD = :CODZONA INTO :NOMZONA;
    SELECT CIUD_NOM FROM CIUDADES WHERE CIUD_COD = :CODCIUD INTO :NOMCIUD;
    SELECT GRCA_NOMBRE FROM GRUPO_CARTERA WHERE GRCA_COD = :GRUPCOD INTO :GRUPNOM;
    provisional = 0;
    MAXDIAS = 0;
    OK = 'N';
    if (AGRUPA = 'Z') then
        BEGIN
        if (GRPINI = '') then
            BEGIN
            if ((CODZONA IS NULL) or (CODZONA >= :GRPINI AND CODZONA <= :GRPFIN)) then
                OK = 'S';
            END
        ELSE
            if (CODZONA >= :GRPINI AND CODZONA <= :GRPFIN) then
                OK = 'S';
        END
    if (AGRUPA = 'I') then
        BEGIN
        if (GRPINI = '') then
            BEGIN
            if ((CODCIUD IS NULL) or (CODCIUD >= :GRPINI AND CODCIUD <= :GRPFIN)) then
                OK = 'S';
            END
        ELSE
            if (CODCIUD >= :GRPINI AND CODCIUD <= :GRPFIN) then
                OK = 'S';
        END
    if (AGRUPA = 'N') then
        OK = 'S';
    if (OK = 'S') then
        BEGIN
        DISPONIBLE = CUPO;
        CORRIENTE = 0;
        CERO = 0;
        TREINTA = 0;
        SESENTA = 0;
        NOVENTA = 0;
        CIENTOCHENTA = 0;
        DOSSETENTA = 0;
        TRESSESENTA = 0;
        /* BUSQUE EN SALDOS_DOC_CARTERA LOS QUE TENGAN SALDO > 0 */
        FOR SELECT MVCL_TIPOREF, MVCL_IDREF, MVCL_PREFREF, MVCL_NUMREF, MVCL_FECHA, MVCL_VENCE
            FROM MOVIMIENTO_CLIENTES
            WHERE TERC_NIT = :NIT AND MVCL_SUCURSAL = :SUCURSAL AND MVCL_FECHA <= :FECHA
                AND MVCL_ABONO = 'N' AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA)) AND
                ((:MONEDA = 0) or (MVCL_TRM <> 1))
            INTO :TIPO, :ID, :PREFIJO, :NUMERO, :FECDOC, :VENCE
            DO
            BEGIN
            if ((inclanti = 'SI') or (TIPO <> 45)) then
                BEGIN
                EXECUTE PROCEDURE saldo_doc_cartera(TIPO, ID, FECHA, MONEDA) returning_values (SALDO);
                if (SALDO <> 0) then
                    BEGIN
                    DISPONIBLE = DISPONIBLE - SALDO;
                    SELECT TIDO_NOMCORTO FROM TIPO_DOCUMENTO WHERE TIDO_COD = :TIPO INTO :TIPONOM;

                    if (MONEDA = 0) then
                        SELECT SUM(SDCA_RTFTE - SDCA_ABRTFTE), SUM(SDCA_RTIVA - SDCA_ABRTIVA), SUM(SDCA_RTICA - SDCA_ABRTICA)
                            FROM SALDOS_DOC_CARTERA WHERE SDCA_TIPOREF = :TIPO AND SDCA_IDREF = :ID
                            INTO :RTFTE, :RTIVA, :RTICA;
                    ELSE
                        SELECT SUM((SDCA_RTFTE - SDCA_ABRTFTE)/SDCA_TRM), SUM((SDCA_RTIVA - SDCA_ABRTIVA)/SDCA_TRM), SUM((SDCA_RTICA - SDCA_ABRTICA)/SDCA_TRM)
                            FROM SALDOS_DOC_CARTERA WHERE SDCA_TIPOREF = :TIPO AND SDCA_IDREF = :ID
                            INTO :RTFTE, :RTIVA, :RTICA;
                    if (RTFTE IS NULL) then
                        RTFTE = 0;
                    if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) THEN
                        BEGIN
                        if (RTFTE > 0) then
                            RTFTE = 0;
                        END
                    ELSE
                        BEGIN
                        if (RTFTE < 0) then
                            RTFTE = 0;
                        END
                    if (FAUTORET <= FECDOC) then
                        RTFTE = 0;
                    if (RTIVA IS NULL) then
                        RTIVA = 0;
                    if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) THEN
                        BEGIN
                        if (RTIVA > 0) then
                            RTIVA = 0;
                        END
                    ELSE
                        BEGIN
                        if (RTIVA < 0) then
                            RTIVA = 0;
                        END
                    if (RTICA IS NULL) then
                        RTICA = 0;
                    if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) THEN
                        BEGIN
                        if (RTICA > 0) then
                            RTICA = 0;
                        END
                    ELSE
                        BEGIN
                        if (RTICA < 0) then
                            RTICA = 0;
                        END
                    /* AHORA CLASIFIQUE LOS DIAS */
                    if (VENCIMIENTO = 'FECHA') then
                        DIAS = FECHA - FECDOC;
                    ELSE
                        DIAS = FECHA - VENCE;
                    if (MAXDIAS < DIAS) then
                        MAXDIAS = DIAS;
                    if (DETALLE = 'S') then
                        BEGIN
                        CORRIENTE = 0;
                        CERO = 0;
                        TREINTA = 0;
                        SESENTA = 0;
                        NOVENTA = 0;
                        CIENTOCHENTA = 0;
                        DOSSETENTA = 0;
                        tressesenta = 0;
                        END
                    if (DIAS < 0) then
                        CORRIENTE = CORRIENTE + SALDO;
                    ELSE
                        if (DIAS < DIASR) then
                            CERO = CERO + SALDO;
                        ELSE
                            if (DIAS < (DIASR * 2)) then
                                TREINTA = TREINTA + SALDO;
                            ELSE
                                if (DIAS < (DIASR * 3)) then
                                    SESENTA = SESENTA + SALDO;
                                ELSE
                                    BEGIN
                                    if (EXTENDIDA = 'N') then
                                        NOVENTA = NOVENTA + SALDO;
                                    else    
                                        BEGIN
                                        if (DIAS < (DIASR * 3) * 2) then
                                            NOVENTA = NOVENTA + SALDO;
                                        ELSE
                                            if (DIAS < (DIASR * 3) * 3) then
                                                CIENTOCHENTA = CIENTOCHENTA + SALDO;
                                            ELSE
                                                if (DIAS < (DIASR * 3) * 4) then
                                                    dossetenta = dossetenta + SALDO;
                                                ELSE
                                                    tressesenta = tressesenta + SALDO;
                                        END
                                    END
                    if (DETALLE = 'S') then
                        SUSPEND;
                    END  /* SALDO */
                END  /* NO ANTICIPO */
            END  /* FOR MOV_CLI */
        /* AGREGUE LOS RECIBOS PROVISIONALES CON SIGNO NEGATIVO */
        FOR SELECT 65, MAX(P.RCPR_ID), MAX(PREF_PRE), MAX(RCPR_NUMERO), MAX(RCPR_FECHA), SUM(RPDE_ABONO* -1), SUM(RPDE_RTFTE*-1), SUM(RPDE_RTIVA*-1), SUM(RPDE_RTICA*-1), MAX(RCPR_TRM)
            FROM RECIBO_PROVISIONAL P, recibo_provisional_detalle D
            WHERE P.rcpr_id = D.rcpr_id AND P.TERC_NIT = :NIT AND D.RPDE_SUCURSAL = :SUCURSAL AND P.RCPR_FECHA <= :FECHA AND P.RCPR_ANULADO = 'N' AND
            ((RCPR_FECCRUCE IS NULL) or (RCPR_FECCRUCE > :FECHA)) AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA)) AND ((:MONEDA = 0) or (RCPR_TRM <> 1))
            GROUP BY P.rcpr_id
            INTO :TIPO, :ID, :PREFIJO, :NUMERO, :FECDOC, :PROVISIONAL, :rtfte,  :RTIVA, :RTICA, :TRM
            DO
            BEGIN
            if ((MONEDA <> 0) AND (TRM <> 0)) then
                BEGIN
                PROVISIONAL = PROVISIONAL / TRM;
                RTFTE = RTFTE / TRM;
                RTIVA = RTIVA / TRM;
                RTICA = RTICA / TRM;
                END
            if (:descnt_prov = 'NO') then
              SALDO = 0;
            else
              SALDO = :PROVISIONAL;
            SELECT TIDO_NOMCORTO FROM TIPO_DOCUMENTO WHERE TIDO_COD = :TIPO INTO :TIPONOM;
            /* CALCULE EL VENCIMIENTO DEL ULTIMO DOCUMENTO POSFECHADO */
            SELECT MAX(RPPA_FECHA) FROM recibo_provisional_pago WHERE RCPR_ID = :ID INTO :VENCE;
            DIAS = VENCE - FECHA;
            if (DETALLE = 'S') then
                BEGIN
                CORRIENTE = 0;
                CERO = 0;
                TREINTA = 0;
                SESENTA = 0;
                NOVENTA = 0;
                CIENTOCHENTA = 0;
                DOSSETENTA = 0;
                tressesenta = 0;
                END
            if (DIAS < 0) then
                CORRIENTE = CORRIENTE + SALDO;
            ELSE
                if (DIAS < DIASR) then
                    CERO = CERO + SALDO;
                ELSE
                    if (DIAS < (DIASR * 2)) then
                        TREINTA = TREINTA + SALDO;
                    ELSE
                        if (DIAS < (DIASR * 3)) then
                            SESENTA = SESENTA + SALDO;
                        ELSE
                            BEGIN
                            if (EXTENDIDA = 'N') then
                                NOVENTA = NOVENTA + SALDO;
                            else
                                BEGIN
                                if (DIAS < (DIASR * 3) * 2) then
                                    NOVENTA = NOVENTA + SALDO;
                                ELSE
                                    if (DIAS < (DIASR * 3) * 3) then
                                        CIENTOCHENTA = CIENTOCHENTA + SALDO;
                                    ELSE
                                        if (DIAS < (DIASR * 3) * 4) then
                                            dossetenta = dossetenta + SALDO;
                                        ELSE
                                            tressesenta = tressesenta + SALDO;
                                END
                            END
            if (DETALLE = 'S') then
                SUSPEND;
            END
        if (DETALLE = 'N') then
            begin
            SALDO = CORRIENTE + CERO + TREINTA + SESENTA + NOVENTA + cientochenta + dossetenta + tressesenta;
            DIAS = MAXDIAS;
            SUSPEND;
            end
        END
    if (AGRUPA = 'C') then
        BEGIN
        FOR SELECT DISTINCT COBR_COD FROM MOVIMIENTO_CLIENTES
            WHERE TERC_NIT = :NIT AND MVCL_SUCURSAL = :SUCURSAL AND MVCL_FECHA <= :FECHA
                AND MVCL_ABONO = 'N' AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA)) AND
                ((:MONEDA = 0) or (MVCL_TRM <> 1))
            INTO :codcobr
            DO
            BEGIN
            OK = 'N';
            if (GRPINI = '') then
                BEGIN
                if ((CODCOBR IS NULL) or (CODCOBR >= :GRPINI AND CODCOBR <= :GRPFIN)) then
                    OK = 'S';
                END
            ELSE
                if (CODCOBR >= :GRPINI AND CODCOBR <= :GRPFIN) then
                    OK = 'S';
            if (OK = 'S') then
                BEGIN
                DISPONIBLE = CUPO;
                CORRIENTE = 0;
                CERO = 0;
                TREINTA = 0;
                SESENTA = 0;
                NOVENTA = 0;
                CIENTOCHENTA = 0;
                DOSSETENTA = 0;
                tressesenta = 0;
                SELECT COBR_NOM FROM COBRADORES WHERE COBR_COD = :codcobr INTO :nomcobr;
                /* BUSQUE EN SALDOS_DOC_CARTERA LOS QUE TENGAN SALDO > 0 */
                FOR SELECT MVCL_TIPOREF, MVCL_IDREF, MVCL_PREFREF, MVCL_NUMREF, MVCL_FECHA, MVCL_VENCE
                    FROM MOVIMIENTO_CLIENTES
                    WHERE TERC_NIT = :NIT AND COBR_COD = :CODCOBR AND MVCL_SUCURSAL = :SUCURSAL AND MVCL_FECHA <= :FECHA
                        AND MVCL_ABONO = 'N' AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA))
                    INTO :TIPO, :ID, :PREFIJO, :NUMERO, :FECDOC, :VENCE
                    DO
                    BEGIN
                    if ((inclanti = 'SI') or (TIPO <> 45)) then
                        BEGIN
                        EXECUTE PROCEDURE saldo_doc_cartera(TIPO, ID, FECHA, MONEDA) returning_values (SALDO);
                        if (SALDO <> 0) then
                            BEGIN
                            DISPONIBLE = DISPONIBLE - SALDO;
                            SELECT TIDO_NOMCORTO FROM TIPO_DOCUMENTO WHERE TIDO_COD = :TIPO INTO :TIPONOM;
                            if (MONEDA = 0) then
                                SELECT SUM(SDCA_RTFTE - SDCA_ABRTFTE), SUM(SDCA_RTIVA - SDCA_ABRTIVA), SUM(SDCA_RTICA - SDCA_ABRTICA)
                                    FROM SALDOS_DOC_CARTERA WHERE SDCA_TIPOREF = :TIPO AND SDCA_IDREF = :ID
                                    INTO :RTFTE, :RTIVA, :RTICA;
                            ELSE
                                SELECT SUM((SDCA_RTFTE - SDCA_ABRTFTE)/SDCA_TRM), SUM((SDCA_RTIVA - SDCA_ABRTIVA)/SDCA_TRM), SUM((SDCA_RTICA - SDCA_ABRTICA)/SDCA_TRM)
                                    FROM SALDOS_DOC_CARTERA WHERE SDCA_TIPOREF = :TIPO AND SDCA_IDREF = :ID
                                    INTO :RTFTE, :RTIVA, :RTICA;
                            if (RTFTE IS NULL) then
                                RTFTE = 0;
                            if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) THEN
                                BEGIN
                                if (RTFTE > 0) then
                                    RTFTE = 0;
                                END
                            ELSE
                                BEGIN
                                if (RTFTE < 0) then
                                    RTFTE = 0;
                                END
                            if (FAUTORET <= FECDOC) then
                                RTFTE = 0;
                            if (RTIVA IS NULL) then
                                RTIVA = 0;
                            if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) THEN
                                BEGIN
                                if (RTIVA > 0) then
                                    RTIVA = 0;
                                END
                            ELSE
                                BEGIN
                                if (RTIVA < 0) then
                                    RTIVA = 0;
                                END
                            if (RTICA IS NULL) then
                                RTICA = 0;
                            if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) THEN
                                BEGIN
                                if (RTICA > 0) then
                                    RTICA = 0;
                                END
                            ELSE
                                BEGIN
                                if (RTICA < 0) then
                                    RTICA = 0;
                                END
                            /* AHORA CLASIFIQUE LOS DIAS */
                            if (VENCIMIENTO = 'FECHA') then
                                DIAS = FECHA - FECDOC;
                            ELSE
                                DIAS = FECHA - VENCE;
                            if (MAXDIAS < DIAS) then
                                MAXDIAS = DIAS;
                            if (DETALLE = 'S') then
                                BEGIN
                                CORRIENTE = 0;
                                CERO = 0;
                                TREINTA = 0;
                                SESENTA = 0;
                                NOVENTA = 0;
                                CIENTOCHENTA = 0;
                                DOSSETENTA = 0;
                                tressesenta = 0;
                                END
                            if (DIAS < 0) then
                                CORRIENTE = CORRIENTE + SALDO;
                            ELSE
                                if (DIAS < DIASR) then
                                    CERO = CERO + SALDO;
                                ELSE
                                    if (DIAS < (DIASR * 2)) then
                                        TREINTA = TREINTA + SALDO;
                                    ELSE
                                        if (DIAS < (DIASR * 3)) then
                                            SESENTA = SESENTA + SALDO;
                                        ELSE
                                            BEGIN
                                            if (EXTENDIDA = 'N') then
                                                NOVENTA = NOVENTA + SALDO;
                                            else    
                                                BEGIN
                                                if (DIAS < (DIASR * 3) * 2) then
                                                    NOVENTA = NOVENTA + SALDO;
                                                ELSE
                                                    if (DIAS < (DIASR * 3) * 3) then
                                                        CIENTOCHENTA = CIENTOCHENTA + SALDO;
                                                    ELSE
                                                        if (DIAS < (DIASR * 3) * 4) then
                                                            dossetenta = dossetenta + SALDO;
                                                        ELSE
                                                            tressesenta = tressesenta + SALDO;
                                                END
                                            END
                            if (DETALLE = 'S') then
                                SUSPEND;
                            END  /* SALDO <>  0 */
                        END  /* NO ANTICIPO */
                    END  /* FOR MOV_CLI */
                /* AGREGUE LOS RECIBOS PROVISIONALES CON SIGNO NEGATIVO */
                FOR SELECT 65, MAX(P.RCPR_ID), MAX(PREF_PRE), MAX(RCPR_NUMERO), MAX(RCPR_FECHA), SUM(RPDE_ABONO * -1), SUM(RPDE_RTFTE*-1), SUM(RPDE_RTIVA*-1), SUM(RPDE_RTICA*-1), MAX(RCPR_TRM)
                    FROM RECIBO_PROVISIONAL P, recibo_provisional_detalle D
                    WHERE P.rcpr_id = D.rcpr_id AND P.TERC_NIT = :NIT AND RPDE_SUCURSAL = :SUCURSAL AND P.VEND_COD = :CODCOBR AND P.RCPR_FECHA <= :FECHA AND P.RCPR_ANULADO = 'N' AND
                    ((RCPR_FECCRUCE IS NULL) or (RCPR_FECCRUCE > :FECHA)) AND ((SUCU_ID = :SUBEMPRESA) OR (:SUBEMPRESA = 0)) AND ((:MONEDA = 0) or (RCPR_TRM <> 1))
                    GROUP BY P.rcpr_id
                    INTO :TIPO, :ID, :PREFIJO, :NUMERO, :FECDOC, :PROVISIONAL, :rtfte,  :RTIVA, :RTICA, :TRM
                    DO
                    BEGIN
                    if ((MONEDA <> 0) AND (TRM <> 0)) then
                        BEGIN
                        PROVISIONAL = PROVISIONAL / TRM;
                        RTFTE = RTFTE / TRM;
                        RTIVA = RTIVA / TRM;
                        RTICA = RTICA / TRM;
                        END
                    if (:descnt_prov = 'NO') then
                      SALDO = 0;
                    else
                      SALDO = :PROVISIONAL;
                    SELECT TIDO_NOMCORTO FROM TIPO_DOCUMENTO WHERE TIDO_COD = :TIPO INTO :TIPONOM;
                    /* CALCULE EL VENCIMIENTO DEL ULTIMO DOCUMENTO POSFECHADO */
                    SELECT MAX(RPPA_FECHA) FROM recibo_provisional_pago WHERE RCPR_ID = :ID INTO :VENCE;
                    DIAS = VENCE - FECHA;
                    if (DETALLE = 'S') then
                        BEGIN
                        CORRIENTE = 0;
                        CERO = 0;
                        TREINTA = 0;
                        SESENTA = 0;
                        NOVENTA = 0;
                        CIENTOCHENTA = 0;
                        DOSSETENTA = 0;
                        tressesenta = 0;
                        END
                    if (DIAS < 0) then
                        CORRIENTE = CORRIENTE + SALDO;
                    ELSE
                        if (DIAS < DIASR) then
                            CERO = CERO + SALDO;
                        ELSE
                            if (DIAS < (DIASR * 2)) then
                                TREINTA = TREINTA + SALDO;
                            ELSE
                                if (DIAS < (DIASR * 3)) then
                                    SESENTA = SESENTA + SALDO;
                                ELSE
                                    BEGIN
                                    if (EXTENDIDA = 'N') then
                                        NOVENTA = NOVENTA + SALDO;
                                    else    
                                        BEGIN
                                        if (DIAS < (DIASR * 3) * 2) then
                                            NOVENTA = NOVENTA + SALDO;
                                        ELSE
                                            if (DIAS < (DIASR * 3) * 3) then
                                                CIENTOCHENTA = CIENTOCHENTA + SALDO;
                                            ELSE
                                                if (DIAS < (DIASR * 3) * 4) then
                                                    dossetenta = dossetenta + SALDO;
                                                ELSE
                                                    tressesenta = tressesenta + SALDO;
                                        END
                                    END
                    if (DETALLE = 'S') then
                        SUSPEND;
                    END
                if (DETALLE = 'N') then
                    begin
                    SALDO = CORRIENTE + CERO + TREINTA + SESENTA + NOVENTA + cientochenta + dossetenta + tressesenta;
                    DIAS = MAXDIAS;
                    SUSPEND;
                    end
                END
            END  /* FOR COBRADOR */
        END
    END  /* FOR NIT */
END
^

SET TERM ; ^



/* 20090819C */
/* NO INCLUYA LAS CAJAS INACTIVAS EN LOS REPORTES */
SET TERM ^ ;

CREATE OR ALTER procedure REP_MOVCAJA_DOCUMENTOS (
    FECINI date,
    FECFIN date,
    CAJINI integer,
    CAJFIN integer,
    SUBEMPRESA integer)
returns (
    FECHA date,
    TIPO varchar(8),
    PREFIJO varchar(4),
    NUMERO varchar(6),
    FORPAGO varchar(30),
    BANCO varchar(2),
    CUENTA varchar(20),
    NUMDOC varchar(20),
    DEBITO numeric(18,2),
    CREDITO numeric(18,2),
    CONCEPTO varchar(60),
    ENCARGADO varchar(60),
    CAJA varchar(60),
    CODIGO integer,
    TIPODOC integer,
    IDDOC integer,
    IDFORMA integer)
AS
BEGIN
FOR SELECT CAJA_ID,CAJA_NOMBRE,CAJA_RESP
  FROM CAJAS
  WHERE CAJA_ID >= :CAJINI AND CAJA_ID <= :CAJFIN AND CAJA_ACTIVA = 'S' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
  ORDER BY CAJA_ID
  INTO :CODIGO,:CAJA,:ENCARGADO
  DO
    BEGIN
    FOR SELECT MOCA_TIPOREF, MOCA_IDREF, MOCA_FECHA, TIDO_NOMCORTO, MOCA_PREFREF, MOCA_NUMREF, MOCA_CONC
        FROM MOVIMIENTO_CAJA M, TIPO_DOCUMENTO T
        WHERE M.MOCA_TIPOREF = T.TIDO_COD AND M.CAJA_ID =:CODIGO AND M.MOCA_FECHA >=:FECINI AND M.MOCA_FECHA <=:FECFIN
        ORDER BY MOCA_FECHA, MOCA_TIPOREF, MOCA_ID
        INTO :TIPODOC, :IDDOC, :FECHA, :TIPO, :PREFIJO, :NUMERO, :CONCEPTO
        DO
        BEGIN
        if (TIPODOC = 61) then
            BEGIN
            FOR SELECT FOPA_NOM, RCPA_BANCO, RCPA_CUENTA, RCPA_NUMERO, RCPA_MONTO, 0, R.FOPA_ID
                FROM RECIBOS_CAJA_PAGO R, FORMAS_PAGO F
                WHERE RECA_ID = :IDDOC AND R.FOPA_ID = F.FOPA_ID
                ORDER BY RCPA_ITEM
                INTO :FORPAGO, :BANCO, :CUENTA, :NUMDOC, :DEBITO, :CREDITO, :IDFORMA
                DO
                    SUSPEND;
            END
        if (TIPODOC = 62) then
            BEGIN
            FOR SELECT 'EFECTIVO', NULL, NULL, NULL, EGRE_MONTO, 0, 1 FROM EGRESOS E
                WHERE EGRE_ID = :IDDOC AND EGRE_TIPO = 2 AND CAJA_ID = :CODIGO
                INTO :FORPAGO, :BANCO, :CUENTA, :NUMDOC, :DEBITO, :CREDITO, :IDFORMA
                DO
                    SUSPEND;
            FOR SELECT FOPA_NOM, EGCA_BANCO, EGCA_CUENTA, EGCA_NUMERO, 0, EGCA_MONTO, E.FOPA_ID
                FROM EGRESOS_CAJA E, FORMAS_PAGO F
                WHERE EGRE_ID = :IDDOC AND E.FOPA_ID = F.FOPA_ID AND CAJA_ID = :CODIGO
                ORDER BY EGCA_ITEM
                INTO :FORPAGO, :BANCO, :CUENTA, :NUMDOC, :DEBITO, :CREDITO, :IDFORMA
                DO
                    SUSPEND;
            END
        if (TIPODOC = 63) then
            BEGIN
            FOR SELECT FOPA_NOM, CDEN_BANCO, CDEN_CUENTA, CDEN_NUMERO, 0, CDEN_MONTO, E.FOPA_ID
                FROM CAMBIODOC_ENTRADAS E, FORMAS_PAGO F
                WHERE CADO_ID = :IDDOC AND E.FOPA_ID = F.FOPA_ID
                ORDER BY CDEN_ITEM
                INTO :FORPAGO, :BANCO, :CUENTA, :NUMDOC, :DEBITO, :CREDITO, :IDFORMA
                DO
                    SUSPEND;
            FOR SELECT FOPA_NOM, CDSA_BANCO, CDSA_CUENTA, CDSA_NUMERO, CDSA_MONTO, 0, E.FOPA_ID
                FROM CAMBIODOC_SALIDAS E, FORMAS_PAGO F
                WHERE CADO_ID = :IDDOC AND E.FOPA_ID = F.FOPA_ID
                ORDER BY CDSA_ITEM
                INTO :FORPAGO, :BANCO, :CUENTA, :NUMDOC, :DEBITO, :CREDITO, :IDFORMA
                DO
                    SUSPEND;
            END
        if (TIPODOC = 65) then
            BEGIN
            FOR SELECT FOPA_NOM, RPPA_BANCO, RPPA_CUENTA, RPPA_NUMERO, RPPA_MONTO, 0, R.FOPA_ID
                FROM RECIBO_PROVISIONAL_PAGO R, FORMAS_PAGO F
                WHERE RCPR_ID = :IDDOC AND R.FOPA_ID = F.FOPA_ID
                ORDER BY RPPA_ITEM
                INTO :FORPAGO, :BANCO, :CUENTA, :NUMDOC, :DEBITO, :CREDITO, :IDFORMA
                DO
                    SUSPEND;
            END
        if (TIPODOC = 66) then
            BEGIN
            FOR SELECT FOPA_NOM, TRCD_BANCO, TRCD_CUENTA, TRCD_NUMERO, 0, TRCD_MONTO, R.FOPA_ID
                FROM TRASLADOS_CAJA T, TRASLADOS_CAJA_DET R, FORMAS_PAGO F
                WHERE T.TRCJ_ID = :IDDOC AND R.FOPA_ID = F.FOPA_ID AND T.CAJA_ID = :CODIGO AND T.TRCJ_ID = R.TRCJ_ID
                ORDER BY TRCD_ITEM
                INTO :FORPAGO, :BANCO, :CUENTA, :NUMDOC, :DEBITO, :CREDITO, :IDFORMA
                DO
                    SUSPEND;
            FOR SELECT FOPA_NOM, TRCD_BANCO, TRCD_CUENTA, TRCD_NUMERO, TRCD_MONTO, 0, R.FOPA_ID
                FROM TRASLADOS_CAJA T, TRASLADOS_CAJA_DET R, FORMAS_PAGO F
                WHERE T.TRCJ_ID = :IDDOC AND R.FOPA_ID = F.FOPA_ID AND T.TRCJ_DESTINO = :CODIGO AND T.TRCJ_ID = R.TRCJ_ID
                ORDER BY TRCD_ITEM
                INTO :FORPAGO, :BANCO, :CUENTA, :NUMDOC, :DEBITO, :CREDITO, :IDFORMA
                DO
                    SUSPEND;
            END
        if (TIPODOC = 71) then
            BEGIN
            FOR SELECT FOPA_NOM, CODE_BANCO, CODE_CUENTA, CODE_NUMERO, 0, CODE_MONTO, C.FOPA_ID
                FROM CONSIGNA_DETALLE C, FORMAS_PAGO F
                WHERE CONS_ID = :IDDOC AND C.FOPA_ID = F.FOPA_ID AND CAJA_ID = :CODIGO
                INTO :FORPAGO, :BANCO, :CUENTA, :NUMDOC, :DEBITO, :CREDITO, :IDFORMA
                DO
                    SUSPEND;
            END
        if (TIPODOC = 77) then
            BEGIN
            SELECT DVCH_BANCO, DVCH_CUENTA, DVCH_NROCH, DVCH_MONTO, 0, 2
                FROM DEVOLUCION_CHEQUES D
                WHERE DVCH_ID = :IDDOC
                INTO :BANCO, :CUENTA, :NUMDOC, :DEBITO, :CREDITO, :IDFORMA;
            FORPAGO  = 'CHEQUE';
            SUSPEND;
            END
        END
    END
END
^

SET TERM ; ^


SET TERM ^ ;

CREATE OR ALTER procedure MOV_DETALLE_CAJAS (
    FECINI date,
    FECFIN date,
    CAJINI integer,
    CAJFIN integer,
    DETALLE char(1),
    SUCURSAL integer)
returns (
    FECHA date,
    TIPO varchar(8),
    PREFIJO varchar(4),
    NUMERO varchar(6),
    DBEFECTIVO numeric(18,2),
    DBCHEQUES numeric(18,2),
    CREFECTIVO numeric(18,2),
    CRCHEQUES numeric(18,2),
    SALDO numeric(18,2),
    CONCEPTO varchar(60),
    TERCERO varchar(60),
    ENCARGADO varchar(60),
    CAJA varchar(60),
    SALDOINICIAL numeric(18,2),
    CODIGO integer)
AS
declare variable DB CHAR(1);
declare variable ID INTEGER;
declare variable NUMROWS INTEGER;
declare variable TIPOCOD INTEGER;
declare variable DEBITO NUMERIC(18,2);
declare variable CREDITO NUMERIC(18,2);
BEGIN
FOR SELECT CAJA_ID,CAJA_NOMBRE,CAJA_RESP
  FROM CAJAS
  WHERE CAJA_ID >= :CAJINI AND CAJA_ID <= :CAJFIN AND CAJA_ACTIVA = 'S' AND ((SUCU_ID = :SUCURSAL) or (:SUCURSAL = 0))
  ORDER BY CAJA_ID
  INTO :CODIGO,:CAJA,:ENCARGADO
  DO
  begin
  if (DETALLE = 'S') then
    BEGIN
    EXECUTE PROCEDURE SALDO_EN_CAJA(:CODIGO, :FECINI) returning_values(:SALDOINICIAL);
    SALDO =SALDOINICIAL;
    SELECT COUNT(MOCA_ID) FROM MOVIMIENTO_CAJA
        WHERE CAJA_ID = :CODIGO AND MOCA_FECHA >= :FECINI AND MOCA_FECHA <= :FECFIN INTO :NUMROWS;
    if (NUMROWS = 0) then
        BEGIN
        TIPO = '';
        PREFIJO = '';
        NUMERO = '';
        CONCEPTO = '';
        tercero = '';
        DEBITO = 0;
        CREDITO = 0;
        DBEFECTIVO = 0;
        CREFECTIVO = 0;
        DBCHEQUES = 0;
        CRCHEQUES = 0;
        SUSPEND;
        END
    ELSE
    FOR SELECT MOCA_TIPOREF, MOCA_IDREF, MOCA_FECHA, TIDO_NOMCORTO, MOCA_PREFREF, MOCA_NUMREF, MOCA_CONC, MOCA_DB, MOCA_DEBITOS, MOCA_CREDITOS
        FROM MOVIMIENTO_CAJA M, TIPO_DOCUMENTO T
        WHERE M.MOCA_TIPOREF = T.TIDO_COD AND M.CAJA_ID =:CODIGO AND M.MOCA_FECHA >=:FECINI AND M.MOCA_FECHA <=:FECFIN
        ORDER BY MOCA_FECHA, MOCA_TIPOREF, MOCA_ID
        INTO :TIPOCOD, :ID, :FECHA, :TIPO, :PREFIJO, :NUMERO, :CONCEPTO, :DB, :DEBITO, :CREDITO
        DO
        BEGIN
        DBEFECTIVO = 0;
        CREFECTIVO = 0;
        DBCHEQUES = 0;
        CRCHEQUES = 0;
        tercero = '';
        if (DB = 'S') then
            BEGIN
            /* BUSQUE CUANTO FUE EN EFECTIVO Y CUANTO EN CHEQUE */
            if (TIPOCOD = 61) then
                BEGIN
                SELECT SUM(RCPA_MONTO) FROM RECIBOS_CAJA_PAGO WHERE RECA_ID = :ID AND FOPA_ID = 1 INTO :DBEFECTIVO;
                if (DBEFECTIVO IS NULL) then
                    DBEFECTIVO = 0;
                DBCHEQUES = DEBITO - DBEFECTIVO;
                SELECT TERC_NOM from TERCEROS T, RECIBOS_CAJA R WHERE R.TERC_NIT = T.terc_nit and reca_id = :id INTO :TERCERO;
                END
            if (TIPOCOD = 62) then
                BEGIN
                /* ES UN TRASLADO A CAJA EL TOTAL VA A LA CAJA */
                SELECT EGRE_MONTO, TERC_NOM FROM EGRESOS E, TERCEROS T WHERE EGRE_ID = :ID AND E.TERC_NIT = T.terc_nit AND EGRE_TIPO = 2 AND CAJA_ID = :CODIGO INTO :DBEFECTIVO, :TERCERO;
                if (DBEFECTIVO IS NULL) then
                    DBEFECTIVO = 0;
                DBCHEQUES = DEBITO - DBEFECTIVO;
                END
            if (TIPOCOD = 63) then
                BEGIN
                DEBITO = CREDITO;
                SELECT SUM(CDEN_MONTO) FROM CAMBIODOC_ENTRADAS WHERE
                    CADO_ID = :ID AND FOPA_ID = 1 INTO :CREFECTIVO;
                if (CREFECTIVO IS NULL) then
                    CREFECTIVO = 0;
                CRCHEQUES = CREDITO - CREFECTIVO;
                TERCERO = '';
                SELECT SUM(CDSA_MONTO) FROM CAMBIODOC_SALIDAS WHERE
                    CADO_ID = :ID AND FOPA_ID = 1 INTO :DBEFECTIVO;
                if (DBEFECTIVO IS NULL) then
                    DBEFECTIVO = 0;
                DBCHEQUES = DEBITO - DBEFECTIVO;
                END
            if (TIPOCOD = 65) then
                BEGIN
                SELECT SUM(RPPA_MONTO) FROM RECIBO_PROVISIONAL_PAGO WHERE RCPR_ID = :ID AND FOPA_ID = 1 INTO :DBEFECTIVO;
                if (DBEFECTIVO IS NULL) then
                    DBEFECTIVO = 0;
                DBCHEQUES = DEBITO - DBEFECTIVO;
                SELECT TERC_NOM from TERCEROS T, RECIBO_PROVISIONAL R WHERE R.TERC_NIT = T.terc_nit AND RCPR_ID = :ID INTO :TERCERO;
                END
            if (TIPOCOD = 66) then
                BEGIN
                SELECT SUM(TRCD_MONTO) FROM TRASLADOS_CAJA_DET WHERE TRCJ_ID = :ID AND FOPA_ID = 1 INTO :DBEFECTIVO;
                if (DBEFECTIVO IS NULL) then
                    DBEFECTIVO = 0;
                DBCHEQUES = DEBITO - DBEFECTIVO;
                TERCERO = '';
                END
            if (TIPOCOD = 77) then
                BEGIN
                DBCHEQUES = DEBITO;
                TERCERO = '';
                END
            END
        ELSE
            BEGIN
            if (TIPOCOD = 62) then
                BEGIN
                SELECT SUM(EGCA_MONTO) FROM EGRESOS_CAJA WHERE EGRE_ID = :ID AND FOPA_ID = 1 AND CAJA_ID = :CODIGO INTO :CREFECTIVO;
                if (CREFECTIVO IS NULL) then
                    CREFECTIVO = 0;
                CRCHEQUES = CREDITO - CREFECTIVO;
                SELECT TERC_NOM from TERCEROS T, EGRESOS E WHERE E.TERC_NIT = T.terc_nit AND EGRE_ID = :ID INTO :TERCERO;
                END
            if (TIPOCOD = 63) then
                BEGIN
                DEBITO = CREDITO;
                SELECT SUM(CDEN_MONTO) FROM CAMBIODOC_ENTRADAS WHERE
                    CADO_ID = :ID AND FOPA_ID = 1 INTO :CREFECTIVO;
                if (CREFECTIVO IS NULL) then
                    CREFECTIVO = 0;
                CRCHEQUES = CREDITO - CREFECTIVO;
                TERCERO = '';
                SELECT SUM(CDSA_MONTO) FROM CAMBIODOC_SALIDAS WHERE
                    CADO_ID = :ID AND FOPA_ID = 1 INTO :DBEFECTIVO;
                if (DBEFECTIVO IS NULL) then
                    DBEFECTIVO = 0;
                DBCHEQUES = DEBITO - DBEFECTIVO;
                END
            if (TIPOCOD = 66) then
                BEGIN
                SELECT SUM(TRCD_MONTO) FROM TRASLADOS_CAJA_DET WHERE TRCJ_ID = :ID AND FOPA_ID = 1 INTO :CREFECTIVO;
                if (CREFECTIVO IS NULL) then
                    CREFECTIVO = 0;
                CRCHEQUES = CREDITO - CREFECTIVO;
                TERCERO = '';
                END
            if (TIPOCOD = 71) then
                BEGIN
                SELECT SUM(CODE_MONTO) FROM CONSIGNA_DETALLE WHERE CONS_ID = :ID AND FOPA_ID = 1 INTO :CREFECTIVO;
                if (CREFECTIVO IS NULL) then
                    CREFECTIVO = 0;
                CRCHEQUES = CREDITO - CREFECTIVO;
                TERCERO = '';
                END
            END
        SALDO = SALDO + DEBITO - CREDITO;
        SUSPEND;
        END
    END
  ELSE
    BEGIN
    SELECT COUNT(SACA_FECHA) FROM SALDO_CAJA
        WHERE CAJA_ID = :CODIGO AND SACA_FECHA >= :FECINI AND SACA_FECHA <= :FECFIN INTO :NUMROWS;
    if (NUMROWS = 0) then
        BEGIN
        EXECUTE PROCEDURE SALDO_EN_CAJA(:CODIGO, :FECINI) returning_values(:SALDOINICIAL);
        SALDO =SALDOINICIAL;
        TIPO = '';
        PREFIJO = '';
        NUMERO = '';
        CONCEPTO = '';
        DEBITO = 0;
        CREDITO = 0;
        DBEFECTIVO = 0;
        CREFECTIVO = 0;
        DBCHEQUES = 0;
        CRCHEQUES = 0;
        SUSPEND;
        END
    ELSE
        FOR SELECT SACA_FECHA, SACA_SALDO, SACA_DEBITOS, SACA_CREDITOS
            FROM SALDO_CAJA
            WHERE CAJA_ID = :CODIGO AND SACA_FECHA >= :FECINI AND SACA_FECHA <= :FECFIN
            ORDER BY SACA_FECHA
            INTO :fecha, :SALDOINICIAL, :DBEFECTIVO, :CREFECTIVO
            DO
                BEGIN
                /* sume los cambios de documento
                SELECT SUM(CDEN_MONTO) FROM cambiodoc_entradas E, cambio_documentos C
                    WHERE C.CADO_FECHA = :fecha AND c.cado_anulado = 'N' and C.CAJA_ID = :CODIGO AND C.CADO_ID = E.CADO_ID INTO :dbcheques;
                if (dbcheques is null) then
                    dbcheques = 0;
                DBEFECTIVO = DBEFECTIVO + DBCHEQUES;
                CREFECTIVO = CREFECTIVO + DBCHEQUES; */
                DBCHEQUES = 0;
                SALDO = SALDOINICIAL + DBEFECTIVO - CREFECTIVO;
                SUSPEND;
                END
    END
  end
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure RESUMEN_SALDOS_CAJA (
    FECINI date,
    FECFIN date,
    SUBEMPRESA integer)
returns (
    CAJA_ID integer,
    CAJA_NOMBRE varchar(60),
    CAJA_RESP varchar(60),
    SALDO_INICIAL numeric(18,2),
    DEBITOS numeric(18,2),
    CREDITOS numeric(18,2),
    SALDO_FINAL numeric(18,2),
    SALDO_ULTIMO numeric(18,2))
AS
BEGIN
  FOR SELECT CAJA_ID, CAJA_NOMBRE, CAJA_RESP
    FROM CAJAS WHERE (SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0) AND CAJA_ACTIVA = 'S'
    INTO :CAJA_ID, :CAJA_NOMBRE, :CAJA_RESP
    DO
        BEGIN
        EXECUTE PROCEDURE SALDO_EN_CAJA (:CAJA_ID, :FECINI) RETURNING_VALUES (:SALDO_INICIAL);
        SELECT SUM(MOCA_DEBITOS), SUM(MOCA_CREDITOS) FROM MOVIMIENTO_CAJA
            WHERE CAJA_ID = :CAJA_ID AND MOCA_FECHA >= :FECINI AND MOCA_FECHA <= :FECFIN INTO :DEBITOS, :CREDITOS;
        IF (DEBITOS IS NULL) THEN
          DEBITOS = 0;
        IF (CREDITOS IS NULL) THEN
          CREDITOS = 0;
        SALDO_FINAL = SALDO_INICIAL + DEBITOS - CREDITOS;
        EXECUTE PROCEDURE SALDO_FINAL_CAJA (:CAJA_ID) RETURNING_VALUES (:SALDO_ULTIMO);
        SUSPEND;
        END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure REP_DOCUMENTOS_ENCAJA (
    CAJAINI integer,
    CAJAFIN integer)
returns (
    CAJAID integer,
    CAJANOM varchar(60),
    RESPONSABLE varchar(60),
    TIPODOC varchar(8),
    NUMDOC varchar(10),
    BANCO varchar(2),
    CUENTA varchar(20),
    NUMERO varchar(20),
    FECDOC date,
    MONTO numeric(18,2),
    FORPAGO varchar(30),
    NOMTERC varchar(60))
AS
declare variable IDDOC INTEGER;
BEGIN
FOR SELECT CAJA_ID, CAJA_NOMBRE, CAJA_RESP FROM CAJAS
    WHERE CAJA_ID >= :CAJAINI AND CAJA_ID <= :CAJAFIN AND CAJA_ACTIVA = 'S'
    ORDER BY CAJA_ID
    INTO :CAJAID, :CAJANOM, :RESPONSABLE
    DO
    BEGIN
    /* PRIMERO EL SALDO DE EFECTIVO */
    FORPAGO = 'EFECTIVO';
    TIPODOC = '';
    NUMDOC = '';
    BANCO = '';
    CUENTA = '';
    NUMERO = '';
    execute procedure SALDO_EN_EFECTIVO(:CAJAID, '9999/12/31') RETURNING_VALUES (:MONTO);
    SUSPEND;
    
    FOR SELECT DPCA_BANCO, DPCA_CUENTA, DPCA_NUMERO, DPCA_FECHA, DPCA_MONTO, FOPA_NOM, TIDO_NOMCORTO, DPCA_IDENT
        FROM DOCUMENTOS_PAGO_CAJA D, TIPO_DOCUMENTO T, FORMAS_PAGO F
        WHERE D.DPCA_TIPOENT = T.TIDO_COD AND D.FOPA_ID = F.FOPA_ID AND D.CAJA_ID = :CAJAID AND D.FOPA_ID <> 1 AND DPCA_IDSAL = 0 AND DPCA_TIPOSAL = 0
        ORDER BY FOPA_NOM, DPCA_FECHA
        INTO :BANCO, :CUENTA, :NUMERO, :FECDOC, :MONTO, :FORPAGO, :TIPODOC, :IDDOC
        DO
        BEGIN
        if (TIPODOC = 'RECICAJA') then
            SELECT PREF_PRE || RECA_NUMERO, TERC_NOM FROM RECIBOS_CAJA R, TERCEROS T
                WHERE RECA_ID = :IDDOC AND R.TERC_NIT = T.TERC_NIT INTO :NUMDOC, :NOMTERC;
        if (TIPODOC = 'RECIPROV') then
            SELECT PREF_PRE || RCPR_NUMERO, TERC_NOM FROM RECIBO_PROVISIONAL R, TERCEROS T
                WHERE RCPR_ID = :IDDOC AND R.TERC_NIT = T.TERC_NIT INTO :NUMDOC, :NOMTERC;
        if (TIPODOC = 'DEVOCHEQ') then
            SELECT PRBA_PREF || DVCH_NUMDOC, TERC_NOM FROM DEVOLUCION_CHEQUES D, TERCEROS T
                WHERE DVCH_ID = :IDDOC AND D.TERC_NIT = T.TERC_NIT INTO :NUMDOC, :NOMTERC;
        SUSPEND;
        END
    END
END
^

SET TERM ; ^

/* 20090820 : */
SET TERM ^ ;

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

SET TERM ; ^

SET TERM ^ ;

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

SET TERM ; ^

SET TERM ^ ;

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

SET TERM ; ^

SET TERM ^ ;

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

^

SET TERM ; ^

SET TERM ^ ;

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

^

SET TERM ; ^

SET TERM ^ ;

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

/* si hay pedido automatico saque una copia de la consolidacion */
EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION', 'FACTURAS', 'GENERAR PEDIDO AUTOMATICAMENTE CON LA FACTURA') returning_values (pedauto);
if (PEDAUTO = 'SI') then
    begin
    IDC = gen_id(id_cons,1);
    for select cefa_item, cefa_idori from consolide_faltantes where cefa_id = new.revt_consolida
        into :item, :idf
        do
        begin
        SELECT PEDI_ID FROM PEDIDOS P, FACTURAS F WHERE P.PREF_PRE = F.pref_pre AND P.pedi_numero = F.fact_numero AND F.fact_id = :IDF INTO :IDP;
        insert into consolide_faltantes (cefa_id, cefa_item, cefa_tipodes, cefa_tipoori, cefa_idori)
            VALUES(:IDC, :item, 32, 34, :IDP);
        end
    EXECUTE PROCEDURE consolide_pendientes (:IDC);
    NEW.lipr_cod = :IDC;
    end
END
^

SET TERM ; ^


/* 20090824 */
/* reversaba mal las consignaciones al sumar la base mas el iva, cuando se supone que el iva esta incluido */
SET TERM ^ ;

CREATE OR ALTER TRIGGER CONSIGNA_TARJETAS_DET_AU FOR CONSIGNA_TARJETAS_DET
ACTIVE AFTER UPDATE POSITION 0
as
declare variable Fec DATE;
declare variable Caja integer;
declare variable Conc VARCHAR(60);
declare variable Pref varchar(4);
declare variable Num varchar(6);
declare variable Existe char(1);
begin
if ((old.COTJ_ID <> 0) and (old.ctjd_anulado = 'N')) then
    begin
    /* borre los movimientos en caja */
    update movimiento_caja
        set moca_creditos = moca_creditos - old.ctjd_base
        where moca_tiporef = 64 and moca_idref = old.cotj_id;
    /* ANULE LA SALIDA DEL DOCUMENTO DE PAGO */
    UPDATE DOCUMENTOS_PAGO_CAJA
        SET DPCA_TIPOSAL = 0, DPCA_IDSAL = 0
        WHERE FOPA_ID = OLD.FOPA_ID AND DPCA_BANCO = OLD.TARJ_COD AND
        DPCA_CUENTA = OLD.CTJD_NROTJ AND DPCA_NUMERO = OLD.CTJD_COMPROB AND
        DPCA_TIPOSAL = 64 AND DPCA_IDSAL = OLD.COTJ_ID AND DPCA_MONTO = OLD.ctjd_base;
    end
if ((new.COTJ_ID <> 0) and (new.ctjd_anulado = 'N')) then
  begin
  /* afecte la caja */
  select cotj_fecha, cotj_concepto, pref_pre, cotj_numero, caja_id from consigna_tarjetas
    where cotj_id = new.cotj_id into :Fec, :Conc, :Pref, :Num, :caja;
  Existe = 'N';
  select 'S' from movimiento_caja where moca_tiporef = 64 and moca_idref = new.cotj_id into :Existe;
  if (Existe = 'S') then
    update movimiento_caja
      set moca_creditos = moca_creditos + new.ctjd_base
      where moca_tiporef = 64 and moca_idref = new.cotj_id;
  else
    INSERT INTO MOVIMIENTO_CAJA
        (MOCA_ID, CAJA_ID, MOCA_TIPOREF, MOCA_PREFREF, MOCA_NUMREF, MOCA_FECHA, MOCA_CONC, MOCA_DEBITOS, MOCA_CREDITOS, MOCA_DB, MOCA_IDREF)
        VALUES(GEN_ID(ID_MOVCAJA,1), :Caja, 64, :Pref, :Num, :Fec, :Conc, 0, NEW.ctjd_base, 'N', new.cotj_id);

  /* ACTUALICE LA SALIDA DEL DOCUMENTO DE PAGO */
  UPDATE DOCUMENTOS_PAGO_CAJA
    SET DPCA_TIPOSAL = 64, DPCA_IDSAL = NEW.cotj_id
    WHERE FOPA_ID = OLD.FOPA_ID AND DPCA_BANCO = NEW.TARJ_COD AND DPCA_CUENTA = NEW.CTJD_NROTJ AND
    DPCA_NUMERO = NEW.CTJD_COMPROB AND DPCA_TIPOSAL = 0 AND DPCA_IDSAL = 0 AND DPCA_MONTO = NEW.ctjd_base;
  end
end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER CONSIGNA_TARJETAS_DET_AD FOR CONSIGNA_TARJETAS_DET
ACTIVE AFTER DELETE POSITION 0
as
begin
if ((old.ctjd_anulado = 'N') AND (OLD.cotj_id <> 0)) then
    begin
    /* borre los movimientos en caja */
    update movimiento_caja
        set moca_creditos = moca_creditos - old.ctjd_base
        where moca_tiporef = 64 and moca_idref = old.cotj_id;
    /* ANULE LA SALIDA DEL DOCUMENTO DE PAGO */
    UPDATE DOCUMENTOS_PAGO_CAJA
        SET DPCA_TIPOSAL = 0, DPCA_IDSAL = 0
        WHERE FOPA_ID = OLD.FOPA_ID AND DPCA_BANCO = OLD.TARJ_COD AND
            DPCA_CUENTA = OLD.CTJD_NROTJ AND DPCA_NUMERO = OLD.CTJD_COMPROB AND
            DPCA_TIPOSAL = 64 AND DPCA_IDSAL = OLD.COTJ_ID AND DPCA_MONTO = OLD.ctjd_base;
    end
end
^

SET TERM ; ^



/* 20090825 */
/* configurable si incluir el impoconsumo en la base de las comisiones */
INSERT INTO CONFIGURACION (CONF_MODULO, CONF_CATEGORIA, CONF_PROPIEDAD, CONF_VALOR, CONF_POSIBLES, CONF_AYUDA) VALUES ('CARTERA', 'COMISIONES', 'INCLUIR IMPOCONSUMO EN LA BASE DEL PAGO DE COMISIONES', 'NO', 'SI,NO', 'SI: La comision se paga sobre el valor del producto incluyendo el impoconsumo pero no el IVA. NO: La comision se paga sobre la base antes de IVA e impoconsumo');
commit work;

SET TERM ^ ;

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

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

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

SET TERM ; ^


/* 20090826 */
/* NUMERO DEL PROVEEDOR EN DOCUMENTOS PENDIENTES */
SET TERM ^ ;

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

SET TERM ; ^


SET TERM ^ ;

CREATE OR ALTER procedure REP_FALTANTES_COMPRA (
    TIPOORI integer,
    FECINI date,
    FECFIN date,
    TIPODES integer,
    CEROS char(1),
    SUBEMPRESA integer)
returns (
    PREFIJO varchar(4),
    NUMERO varchar(6),
    FECHA date,
    NIT varchar(20),
    NOMCLIENTE varchar(60),
    NROPROV VARCHAR(8),
    VENCE date,
    ARTICULO varchar(15),
    DESCRIPCION varchar(60),
    CANTIDAD numeric(18,4),
    UNIDAD varchar(8),
    PRECIO numeric(18,2),
    FALTANTE numeric(18,4))
AS
declare variable ID INTEGER;
declare variable ITEM INTEGER;
declare variable FACTOR NUMERIC(18,4);
BEGIN
if (TIPOORI = 22) then
    FOR SELECT R.REPR_ID, R.PREF_PRE, REPR_NUMERO, REPR_FECHA, REPR_FECHA VENCE, RPVD_ITEM, R.TERC_NIT, TERC_NOM, ARTI_COD, SUBSTR(RPVD_DESC,1,60), RPVD_UNIDAD, RPVD_CANT, RPVD_PRUNIT, REPR_NUMPROV
      FROM REMISION_PROVEEDOR R, REMISION_PROVEEDOR_DET D, TERCEROS T, PREFIJOS P
      WHERE R.REPR_ID = D.REPR_ID AND REPR_FECHA >= :FECINI AND REPR_FECHA <= :FECFIN AND T.TERC_NIT = R.TERC_NIT and REPR_ANULADO = 'N'
       AND P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = 22 AND ((P.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
      ORDER BY REPR_FECHA, R.PREF_PRE, REPR_NUMERO, RPVD_ITEM
      INTO :ID, :PREFIJO, :NUMERO, :FECHA, :VENCE, :ITEM, :NIT, :NOMCLIENTE, :ARTICULO, :DESCRIPCION, :UNIDAD, :CANTIDAD, :PRECIO, :nroprov
      DO
        BEGIN
        EXECUTE PROCEDURE FALTANTE(:TIPOORI, :TIPODES, :ID,  :ITEM) returning_values (:FALTANTE, :UNIDAD, :FACTOR);
        if ((CEROS = 'S') or (FALTANTE <> 0)) then
          SUSPEND;
        END
if (TIPOORI = 23) then
    FOR SELECT O.ORDC_ID, O.PREF_PRE, ORDC_NUMERO, ORDC_FECHA, (ORDC_FECHA + ORDC_VALIDEZ), OCDE_ITEM, O.TERC_NIT, TERC_NOM, ARTI_COD, SUBSTR(OCDE_DESC,1,60), OCDE_UNIDAD, OCDE_CANT, OCDE_PRUNIT
      FROM ORDENES_COMPRA O, ORDENES_COMPRA_DETALLE D, TERCEROS T, PREFIJOS P
      WHERE O.ORDC_ID = D.ORDC_ID AND ORDC_FECHA >= :FECINI AND ORDC_FECHA <= :FECFIN AND T.TERC_NIT = O.TERC_NIT AND ORDC_ANULADO = 'N'
       AND P.PREF_PRE = O.PREF_PRE AND P.TIDO_COD = 23 AND ((P.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
      ORDER BY ORDC_FECHA, O.PREF_PRE, ORDC_NUMERO, OCDE_ITEM
      INTO :ID, :PREFIJO, :NUMERO, :FECHA, :VENCE, :ITEM, :NIT, :NOMCLIENTE, :ARTICULO, :DESCRIPCION, :UNIDAD, :CANTIDAD, :PRECIO
      DO
        BEGIN
        nroprov = '';
        EXECUTE PROCEDURE FALTANTE(:TIPOORI, :TIPODES, :ID,  :ITEM) returning_values (:FALTANTE, :UNIDAD, :FACTOR);
        if ((CEROS = 'S') or (FALTANTE <> 0)) then
          SUSPEND;
        END
if (TIPOORI = 25) then
    FOR SELECT C.COPR_ID, C.PREF_PRE, COPR_NUMERO, COPR_FECHA, (COPR_FECHA + COPR_VALIDEZ), CPRD_ITEM, C.TERC_NIT, TERC_NOM, ARTI_COD, SUBSTR(CPRD_DESC,1,60), CPRD_UNIDAD, CPRD_CANT, CPRD_PRUNIT
      FROM COTIZACION_PROVEEDOR C, COTIZACIONES_PROVEEDOR_DET D, TERCEROS T, PREFIJOS P
      WHERE C.COPR_ID = D.COPR_ID AND COPR_FECHA >= :FECINI AND COPR_FECHA <= :FECFIN AND T.TERC_NIT = C.TERC_NIT AND COPR_ANULADO = 'N'
       AND P.PREF_PRE = C.PREF_PRE AND P.TIDO_COD = 25 AND ((P.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
      ORDER BY COPR_FECHA, PREF_PRE, COPR_NUMERO, CPRD_ITEM
      INTO :ID, :PREFIJO, :NUMERO, :FECHA, :VENCE, :ITEM, :NIT, :NOMCLIENTE, :ARTICULO, :DESCRIPCION, :UNIDAD, :CANTIDAD, :PRECIO
      DO
        BEGIN
        nroprov = '';
        EXECUTE PROCEDURE FALTANTE(:TIPOORI, :TIPODES, :ID,  :ITEM) returning_values (:FALTANTE, :UNIDAD, :FACTOR);
        if ((CEROS = 'S') or (FALTANTE <> 0)) then
          SUSPEND;
        END
END
^

SET TERM ; ^


SET TERM ^ ;

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

SET TERM ; ^

SET TERM ^ ;

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

SET TERM ; ^


/* 20090826B : LIBRO INVENTARIO Y BALANCE CON SOLO CUENTAS DE BALANCE Y DIARIO POR COMPROBANTE-CUENTA */


INSERT INTO CONFIGURACION (CONF_MODULO, CONF_CATEGORIA, CONF_PROPIEDAD, CONF_VALOR, CONF_POSIBLES, CONF_AYUDA) VALUES ('CONTABILIDAD', 'GENERAL', 'INVENTARIO Y BALANCE SOLO CON CUENTAS DE BALANCE', 'NO', 'SI,NO', 'SI: Incluye las cuentas 1, 2 y 3 y simula el cierre en la cuenta de resultados del ejercicio. NO: Incluye todas las cuentas y no simula el cierre');
COMMIT WORK;

SET TERM ^ ;

CREATE OR ALTER procedure INVENTARIO_Y_BALANCE (
    ANO char(4),
    MES integer)
returns (
    CODIGO varchar(20),
    NOMBRE varchar(60),
    ARTICULO varchar(15),
    NOMARTICULO varchar(60),
    NOMCTAART varchar(60),
    SALDO numeric(18,2),
    SCLASE numeric(18,2),
    SGRUPO numeric(18,2),
    SSUBGRUPO numeric(18,2),
    SCUENTA numeric(18,2),
    NIVEL integer)
AS
declare variable TIPO CHAR(1);
declare variable AFECTABLE CHAR(1);
declare variable CTACIERREU VARCHAR(20);
declare variable CTACIERREP VARCHAR(20);
declare variable CIERRE NUMERIC(18,2);
declare variable AUX NUMERIC(18,2);
declare variable SIMULACIERRE CHAR(2);
DECLARE VARIABLE DIG INTEGER;
BEGIN
execute procedure lee_configuracion('CONTABILIDAD', 'GENERAL', 'INVENTARIO Y BALANCE SOLO CON CUENTAS DE BALANCE') returning_values (:simulacierre);
if (simulacierre = 'SI') then
    BEGIN
    /* CALCULE LA UTILIDAD DEL EJERCICIO */
    EXECUTE PROCEDURE SALDO_CUENTA_MES('4', ANO, MES, 'N') RETURNING_VALUES (AUX);
    CIERRE = AUX;
    EXECUTE PROCEDURE SALDO_CUENTA_MES('5', ANO, MES, 'N') RETURNING_VALUES (AUX);
    CIERRE = CIERRE + AUX;
    EXECUTE PROCEDURE SALDO_CUENTA_MES('6', ANO, MES, 'N') RETURNING_VALUES (AUX);
    CIERRE = CIERRE + AUX;
    EXECUTE PROCEDURE SALDO_CUENTA_MES('7', ANO, MES, 'N') RETURNING_VALUES (AUX);
    CIERRE = CIERRE + AUX;
    EXECUTE PROCEDURE LEE_CONFIGURACION ('CONTABILIDAD', 'GENERAL', 'CUENTA DE UTILIDAD DEL EJERCICIO') returning_values (:CTACIERREU);
    EXECUTE PROCEDURE LEE_CONFIGURACION ('CONTABILIDAD', 'GENERAL', 'CUENTA DE PERDIDA DEL EJERCICIO') returning_values (:CTACIERREP);
    END
FOR SELECT CUEN_COD, CUEN_NOM, CUEN_TIPO FROM CUENTAS order by CUEN_COD INTO CODIGO, NOMBRE, TIPO
    DO
    BEGIN
    if ((simulacierre = 'NO') or (CODIGO < '4')) then
        BEGIN
        EXECUTE PROCEDURE SALDO_CUENTA_MES(CODIGO, ANO, MES, 'N') RETURNING_VALUES (SALDO);
        EXECUTE PROCEDURE VALIDE_ESTRUCTURA (CODIGO) RETURNING_VALUES (:NIVEL);
        EXECUTE PROCEDURE ES_AFECTABLE (CODIGO) RETURNING_VALUES (:AFECTABLE);
        EXECUTE PROCEDURE DIGITOS_NIVEL (:NIVEL) RETURNING_VALUES (:DIG);
        SCLASE = 0;
        SGRUPO = 0;
        SSUBGRUPO = 0;
        SCUENTA = 0;
        ARTICULO = '';
        NOMARTICULO = '';
        NOMCTAART = NOMBRE;

        IF (SIMULACIERRE = 'SI') THEN
            IF (CODIGO = SUBSTR(CTACIERREP, 1, DIG)) then
                SALDO = SALDO + CIERRE;

        if (NIVEL = 1) then
            SCLASE = SALDO;
        if (NIVEL = 2) then
            SGRUPO = SALDO;
        if (NIVEL = 3) then
            SSUBGRUPO = SALDO;
        if (NIVEL > 3) then
            SCUENTA = SALDO;
        SALDO = 0;
        if ((AFECTABLE = 'S') AND (TIPO = 'A')) then
            BEGIN
            FOR SELECT ARTI_COD, ARTI_DES FROM ARTICULO INTO :ARTICULO, :NOMARTICULO
                DO
                BEGIN
                EXECUTE PROCEDURE SALDO_ARTICULO_MES(:CODIGO, :ARTICULO, :ANO, :MES, 'N') RETURNING_VALUES (:SALDO);
                NOMCTAART = NOMARTICULO;
                if (SALDO <> 0) then
                    SUSPEND;
                END
            END
        ELSE
            SUSPEND;
        END
    END
END
^

SET TERM ; ^


INSERT INTO CONFIGURACION (CONF_MODULO, CONF_CATEGORIA, CONF_PROPIEDAD, CONF_VALOR, CONF_POSIBLES, CONF_AYUDA) VALUES ('CONTABILIDAD', 'GENERAL', 'LIBRO DIARIO POR CUENTA-COMPROBANTE O COMPROBANTE-CUENTA', 'CUENTA-COMPROBANTE', 'CUENTA-COMPROBANTE,COMPROBANTE-CUENTA', 'CUENTA-COMPROBANTE: Para cada cuenta muestra los tipos de comprobante que se movieron en el mes. COMPROBANTE-CUENTA: Por cada tipo de comprobante muestra las cuentas que tuvieron movimiento en el mes');
commit work;

/* 20090827 */
/* deshacia los cambios con los datos nuevos en lugar de con los  */
SET TERM ^ ;

CREATE OR ALTER TRIGGER CONSIGNA_DETALLE_AU FOR CONSIGNA_DETALLE
ACTIVE AFTER UPDATE POSITION 0
AS
declare variable Fec date;
declare variable Cuenta integer;
declare variable Conc VARCHAR(60);
declare variable Pref varchar(4);
declare variable Num varchar(6);
declare variable Existe char(1);
BEGIN
if ((old.cons_id <> 0) and (old.code_anulado = 'N')) then
    begin
    /* Actualice el total del movimiento del banco */
    select cons_fecha, cuba_cod, cons_concepto, prba_pref, cons_numero from consigna where cons_id = old.cons_id into :Fec, :Cuenta, :Conc, :Pref, :Num;
    Existe = 'N';
    select 'S' from movimiento_banco where moba_tipodoc = 71 and moba_idref = old.cons_id into :Existe;
    if (Existe = 'S') then
        update movimiento_banco
            set moba_concepto = 'ANULADO', moba_total = moba_total - old.code_monto
            where moba_tipodoc = 71 and moba_idref = old.cons_id;
    /* afecte la caja */
    select cons_fecha, cons_concepto, prba_pref, cons_numero from consigna
        where cons_id = old.cons_id into :Fec, :Conc, :Pref, :Num;
    Existe = 'N';
    select 'S' from movimiento_caja where moca_tiporef = 71 and moca_idref = old.cons_id and caja_id = old.caja_id into :Existe;
    if (Existe = 'S') then
        update movimiento_caja
            set moca_creditos = moca_creditos - old.code_monto
            where moca_tiporef = 71 and moca_idref = old.cons_id and caja_id = old.caja_id;
    /* ANULE LA SALIDA DEL DOCUMENTO DE PAGO */
    if (OLD.FOPA_ID <> 1) then
        UPDATE DOCUMENTOS_PAGO_CAJA
            SET DPCA_TIPOSAL = 0, DPCA_IDSAL = 0
            WHERE caja_id = OLD.caja_id AND FOPA_ID = OLD.FOPA_ID AND DPCA_BANCO = OLD.CODE_BANCO AND
            DPCA_CUENTA = OLD.CODE_CUENTA AND DPCA_NUMERO = OLD.CODE_NUMERO AND
            DPCA_TIPOSAL = 71 AND DPCA_IDSAL = OLD.CONS_ID AND DPCA_MONTO = OLD.code_monto;
    ELSE
        EXECUTE PROCEDURE RESTE_SALDO_EFECTIVO(OLD.CAJA_ID, :FEC, OLD.CODE_MONTO, 'S');
    end
if ((new.cons_id <> 0) and (new.code_anulado = 'N')) then
    begin
    /* Actualice el total del movimiento del banco */
    select cons_fecha, cuba_cod, cons_concepto, prba_pref, cons_numero
        from consigna where cons_id = new.cons_id
        into :Fec, :Cuenta, :Conc, :Pref, :Num;
    Existe = 'N';
    select 'S' from movimiento_banco where moba_tipodoc = 71 and moba_idref = new.cons_id into :Existe;
    if (Existe = 'S') then
        update movimiento_banco
            set moba_concepto = :conc, moba_total = moba_total + new.code_monto
            where moba_tipodoc = 71 and moba_idref = new.cons_id;
    else
        INSERT INTO MOVIMIENTO_BANCO
            (MOBA_ID, CUBA_COD, MOBA_TIPODOC, MOBA_PREF, MOBA_NUMERO, MOBA_FECHA, MOBA_CONCEPTO, MOBA_TOTAL, MOBA_DB, MOBA_IDREF, MOBA_TIPOREF)
            VALUES(GEN_ID(ID_MOVBANCO,1), :Cuenta, 71, :Pref, :Num, :Fec, :Conc, NEW.code_monto, 'S', new.cons_id, 71);
    /* afecte la caja */
    select cons_fecha, cons_concepto, prba_pref, cons_numero from consigna
        where cons_id = new.cons_id into :Fec, :Conc, :Pref, :Num;
    Existe = 'N';
    select 'S' from movimiento_caja where moca_tiporef = 71 and moca_idref = new.cons_id and caja_id = new.caja_id into :Existe;
    if (Existe = 'S') then
        update movimiento_caja
            set moca_creditos = moca_creditos + new.code_monto
            where moca_tiporef = 71 and moca_idref = new.cons_id and caja_id = new.caja_id;
    else
        INSERT INTO MOVIMIENTO_CAJA
            (MOCA_ID, CAJA_ID, MOCA_TIPOREF, MOCA_PREFREF, MOCA_NUMREF, MOCA_FECHA, MOCA_CONC, MOCA_DEBITOS, MOCA_CREDITOS, MOCA_DB, MOCA_IDREF)
            VALUES(GEN_ID(ID_MOVCAJA,1), NEW.CAJA_ID, 71, :Pref, :Num, :Fec, :Conc, 0, NEW.code_monto, 'N', new.cons_id);
    /* ACTUALICE LA SALIDA DEL DOCUMENTO DE PAGO */
    if (NEW.FOPA_ID <> 1) then
        UPDATE DOCUMENTOS_PAGO_CAJA
            SET DPCA_TIPOSAL = 71, DPCA_IDSAL = NEW.cons_id
            WHERE caja_id = NEW.caja_id AND FOPA_ID = NEW.FOPA_ID AND DPCA_BANCO = NEW.CODE_BANCO AND DPCA_CUENTA = NEW.CODE_CUENTA AND
            DPCA_NUMERO = NEW.CODE_NUMERO AND DPCA_TIPOSAL = 0 AND DPCA_IDSAL = 0;
    ELSE
        EXECUTE PROCEDURE RESTE_SALDO_EFECTIVO(NEW.CAJA_ID, :FEC, NEW.CODE_MONTO, 'N');
    end
END
^

SET TERM ; ^


CREATE EXCEPTION DOCUMENTO_CONCILIADO 'El documento ya esta relacionado en una conciliación bancaria';

SET TERM ^ ;

create trigger CONSIGNA_DETALLE_BU for CONSIGNA_DETALLE
active BEFORE UPDATE position 0
as
declare variable existe integer;
declare variable numerod varchar(10);
declare variable numeroc varchar(10);
begin
select first 1 cobn_id, cobn_prefijo || cobn_numero from conciliacion_bancaria
    where cobn_tipodoc = 71 and cobn_iddoc = old.cons_id and cobn_ok = 'S' into :existe, :numeroc;
if (existe > 0) then
    begin
    select prba_pref || cons_numero from consigna where cons_id = old.cons_id into :numerod;
    exception documento_conciliado 'La consignación ' || :numerod || ' se encuentra relacionada en la conciliación ' || :numeroc;
    end
end
^

SET TERM ; ^

SET TERM ^ ;

create trigger NOTAS_CREDITO_BU for NOTAS_CREDITO
active BEFORE UPDATE position 0
as
declare variable existe integer;
declare variable numeroc varchar(10);
begin
select first 1 cobn_id, cobn_prefijo || cobn_numero from conciliacion_bancaria
    where cobn_tipodoc = 75 and cobn_iddoc = old.ncbc_id and cobn_ok = 'S' into :existe, :numeroc;
if (existe > 0) then
    begin
    exception documento_conciliado 'La nota crédito ' || old.prba_pref || old.ncbc_numero || ' se encuentra relacionada en la conciliación ' || :numeroc;
    end
end
^

SET TERM ; ^

SET TERM ^ ;

create trigger NOTAS_DEBITO_BU for NOTAS_DEBITO
active BEFORE UPDATE position 0
as
declare variable existe integer;
declare variable numeroc varchar(10);
begin
select first 1 cobn_id, cobn_prefijo || cobn_numero from conciliacion_bancaria
    where cobn_tipodoc = 74 and cobn_iddoc = old.ndbc_id and cobn_ok = 'S' into :existe, :numeroc;
if (existe > 0) then
    begin
    exception documento_conciliado 'La nota débito ' || old.prba_pref || old.ndbc_id || ' se encuentra relacionada en la conciliación ' || :numeroc;
    end
end
^

SET TERM ; ^

SET TERM ^ ;

create trigger CHEQUES_BU for CHEQUES
active BEFORE UPDATE position 0
as
declare variable existe integer;
declare variable numeroc varchar(10);
begin
select first 1 cobn_id, cobn_prefijo || cobn_numero from conciliacion_bancaria
    where cobn_tipodoc = 72 and cobn_iddoc = old.cheq_id and cobn_ok = 'S' into :existe, :numeroc;
if (existe > 0) then
    begin
    exception documento_conciliado 'El cheque ' || old.prba_pref || old.cheq_numero || ' se encuentra relacionada en la conciliación ' || :numeroc;
    end
end
^

SET TERM ; ^

SET TERM ^ ;

create trigger RETIROS_BU for RETIROS
active BEFORE UPDATE position 0
as
declare variable existe integer;
declare variable numeroc varchar(10);
begin
select first 1 cobn_id, cobn_prefijo || cobn_numero from conciliacion_bancaria
    where cobn_tipodoc = 73 and cobn_iddoc = old.reti_id and cobn_ok = 'S' into :existe, :numeroc;
if (existe > 0) then
    begin
    exception documento_conciliado 'El retiro ' || old.prba_pref || old.reti_id || ' se encuentra relacionada en la conciliación ' || :numeroc;
    end
end
^

SET TERM ; ^

SET TERM ^ ;

create trigger RETIROS_BD for RETIROS
active BEFORE DELETE position 0
as
declare variable existe integer;
declare variable numeroc varchar(10);
begin
select first 1 cobn_id, cobn_prefijo || cobn_numero from conciliacion_bancaria
    where cobn_tipodoc = 73 and cobn_iddoc = old.reti_id and cobn_ok = 'S' into :existe, :numeroc;
if (existe > 0) then
    begin
    exception documento_conciliado 'El retiro ' || old.prba_pref || old.reti_id || ' se encuentra relacionada en la conciliación ' || :numeroc;
    end
end
^

SET TERM ; ^

SET TERM ^ ;

create trigger CHEQUES_BD for CHEQUES
active BEFORE DELETE position 0
as
declare variable existe integer;
declare variable numeroc varchar(10);
begin
select first 1 cobn_id, cobn_prefijo || cobn_numero from conciliacion_bancaria
    where cobn_tipodoc = 72 and cobn_iddoc = old.cheq_id and cobn_ok = 'S' into :existe, :numeroc;
if (existe > 0) then
    begin
    exception documento_conciliado 'El cheque ' || old.prba_pref || old.cheq_numero || ' se encuentra relacionada en la conciliación ' || :numeroc;
    end
end
^

SET TERM ; ^

SET TERM ^ ;

create trigger NOTAS_DEBITO_BD for NOTAS_DEBITO
active BEFORE DELETE position 0
as
declare variable existe integer;
declare variable numeroc varchar(10);
begin
select first 1 cobn_id, cobn_prefijo || cobn_numero from conciliacion_bancaria
    where cobn_tipodoc = 74 and cobn_iddoc = old.ndbc_id and cobn_ok = 'S' into :existe, :numeroc;
if (existe > 0) then
    begin
    exception documento_conciliado 'La nota débito ' || old.prba_pref || old.ndbc_id || ' se encuentra relacionada en la conciliación ' || :numeroc;
    end
end
^

SET TERM ; ^

SET TERM ^ ;

create trigger NOTAS_CREDITO_BD for NOTAS_CREDITO
active BEFORE DELETE position 0
as
declare variable existe integer;
declare variable numeroc varchar(10);
begin
select first 1 cobn_id, cobn_prefijo || cobn_numero from conciliacion_bancaria
    where cobn_tipodoc = 75 and cobn_iddoc = old.ncbc_id and cobn_ok = 'S' into :existe, :numeroc;
if (existe > 0) then
    begin
    exception documento_conciliado 'La nota crédito ' || old.prba_pref || old.ncbc_numero || ' se encuentra relacionada en la conciliación ' || :numeroc;
    end
end
^

SET TERM ; ^

SET TERM ^ ;

create trigger CONSIGNA_DETALLE_BD for CONSIGNA_DETALLE
active BEFORE DELETE position 0
as
declare variable existe integer;
declare variable numerod varchar(10);
declare variable numeroc varchar(10);
begin
select first 1 cobn_id, cobn_prefijo || cobn_numero from conciliacion_bancaria
    where cobn_tipodoc = 71 and cobn_iddoc = old.cons_id and cobn_ok = 'S' into :existe, :numeroc;
if (existe > 0) then
    begin
    select prba_pref || cons_numero from consigna where cons_id = old.cons_id into :numerod;
    exception documento_conciliado 'La consignación ' || :numerod || ' se encuentra relacionada en la conciliación ' || :numeroc;
    end
end
^

SET TERM ; ^


/* 20090902 */
/* AL TRAER LAS FACTURAS EN UNA DEVOLUCION NO INCLUIA ALGUNAS DEL POS POR LAS CANTIDADES NEGATIVAS AL DEVOLVER */
SET TERM ^ ;

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

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

SET TERM ; ^



/* 20090903 : TRASLADOS ACUMULABAN MAL EL COSTO POR PROVEEDOR */
/* GRABABA EN PROVEEDOR_ARTICULO EL COSTO EN LA UNIDAD DIGITADA Y NO EN LA PRINCIPAL */
SET TERM ^ ;

CREATE OR ALTER TRIGGER TRASFERENCIAS_DETALLE_AI FOR TRASFERENCIAS_DETALLE
ACTIVE AFTER INSERT POSITION 0
AS
declare variable fec date;
declare variable CONC VARCHAR(60);
declare variable factor numeric(18,4);
declare variable bodori varchar(2);
declare variable boddes varchar(2);
declare variable Pref varchar(4);
declare variable Num varchar(6);
declare variable NIT varchar(20);
declare variable fecaux date;
declare variable ORIGEN VARCHAR(2);
BEGIN
  if ((NEW.Tran_id <> 0) and (new.tras_anulado = 'N')) then
    begin
    select tran_fecha, tran_conc, BODE_COD, TRAN_BODDES, pref_pre, tran_numero, TERC_NIT
        from trasferencias where tran_id = new.tran_id into :fec, :conc, :bodori, :boddes, :Pref, :Num, :NIT;
    execute procedure factor_unidad_cant(new.arti_cod, new.tras_unidad) returning_values(factor);
    EXECUTE PROCEDURE LEE_CONFIGURACION('INVENTARIO', 'TRASLADOS', 'AFECTAR AMBAS BODEGAS AL CONFIRMAR ENTREGA') returning_values(ORIGEN);
    if ((ORIGEN = 'NO') or (new.tras_confirma = 'S'))  then
        INSERT INTO MOVIMIENTO_ARTICULO
          (ARTI_COD, MVAR_CONS, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM)
          VALUES(NEW.ARTI_COD, GEN_ID(ID_MOVARTI,1), :bodori, :FEC, 13, NEW.tran_id,
          :CONC, :factor * new.tras_cant, 0, 'N', new.tras_lote, :Pref, :Num, new.tras_item);
    if (new.tras_confirma = 'S') then
      INSERT INTO MOVIMIENTO_ARTICULO
        (ARTI_COD, MVAR_CONS, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM)
        VALUES(NEW.ARTI_COD, GEN_ID(ID_MOVARTI,1), :boddes, :FEC, 13, NEW.tran_id,
        :CONC, :factor * new.tras_cant, NEW.tras_costo, 'S', new.tras_lotedes, :Pref, :Num, new.tras_item);

    /* ACTUALICE EL COSTO POR PROVEEDOR */
    if (:NIT <> '') then
        BEGIN
        SELECT PVAR_FECHA FROM PROVEEDOR_ARTICULO
            WHERE TERC_NIT = :Nit AND ARTI_COD = NEW.ARTI_COD
            INTO :FECAUX;
        if (FECAUX IS NULL) then
            INSERT INTO PROVEEDOR_ARTICULO (TERC_NIT, ARTI_COD, PVAR_COSTO, PVAR_FECHA, PVAR_COD,PVAR_DES)
                VALUES (:Nit, NEW.ARTI_COD, (new.tras_costo / new.tras_factor), :fec, :NIT,NEW.tras_desc);
        else
            UPDATE PROVEEDOR_ARTICULO
                SET PVAR_COSTO = NEW.tras_costo, PVAR_FECHA = :fec
                WHERE ARTI_COD = NEW.ARTI_COD AND TERC_NIT = :Nit;
        END
    END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER TRASFERENCIAS_DETALLE_AU FOR TRASFERENCIAS_DETALLE
ACTIVE AFTER UPDATE POSITION 0
AS
declare variable fec date;
declare variable CONC VARCHAR(60);
declare variable factor numeric(18,4);
declare variable bodori varchar(2);
declare variable boddes varchar(2);
declare variable Pref varchar(4);
declare variable Num varchar(6);
declare variable ORIGEN VARCHAR(2);
declare variable NIT varchar(20);
declare variable fecaux date;
BEGIN
if ((old.tras_cant <> new.tras_cant) or (old.tras_unidad <> new.tras_unidad) or (old.tras_lote <> new.tras_lote) or
    (old.tras_anulado <> new.tras_anulado) or (old.tras_transmit <> new.tras_transmit) or (old.tras_confirma <> new.tras_confirma)) then
  begin
  /* Anule el anterior */
  if ((old.tran_id <> 0) and (old.tras_anulado = 'N')) then
    begin
    delete from movimiento_articulo where (mvar_tipodoc = 13) and (mvar_idref = old.tran_id) and (mvar_item = old.tras_item);
    END
  /* Registre el nuevo */
  if ((new.tran_id <> 0) and (new.tras_anulado = 'N')) then
    BEGIN
    select tran_fecha, tran_conc, BODE_COD, TRAN_BODDES, Pref_pre, tran_numero, terc_nit
        from trasferencias where tran_id = new.tran_id into :fec, :conc, :bodori, :boddes, :Pref, :Num, :Nit;
    execute procedure factor_unidad_cant(new.arti_cod, new.tras_unidad) returning_values(factor);
    EXECUTE PROCEDURE LEE_CONFIGURACION('INVENTARIO', 'TRASLADOS', 'AFECTAR AMBAS BODEGAS AL CONFIRMAR ENTREGA') returning_values(ORIGEN);
    if ((ORIGEN = 'NO') or (new.tras_confirma = 'S'))  then
        INSERT INTO MOVIMIENTO_ARTICULO
            (ARTI_COD, MVAR_CONS, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM)
            VALUES(NEW.ARTI_COD, GEN_ID(ID_MOVARTI,1), :bodori, :FEC, 13, NEW.tran_id,
            :CONC, :factor * new.tras_cant, 0, 'N', new.tras_lote, :Pref, :Num, new.tras_item);
    if (new.tras_confirma = 'S') then
        INSERT INTO MOVIMIENTO_ARTICULO
        (ARTI_COD, MVAR_CONS, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM)
        VALUES(NEW.ARTI_COD, GEN_ID(ID_MOVARTI,1), :boddes, :FEC, 13, NEW.tran_id,
        :CONC, :factor * new.tras_cant, 0, 'S', new.tras_lotedes, :Pref, :Num, new.tras_item);
    /* ACTUALICE EL COSTO POR PROVEEDOR */
    if (:NIT <> '') then
        BEGIN
        SELECT PVAR_FECHA FROM PROVEEDOR_ARTICULO
            WHERE TERC_NIT = :Nit AND ARTI_COD = NEW.ARTI_COD
            INTO :FECAUX;
        if (FECAUX IS NULL) then
            INSERT INTO PROVEEDOR_ARTICULO (TERC_NIT, ARTI_COD, PVAR_COSTO, PVAR_FECHA, PVAR_COD,PVAR_DES)
                VALUES (:Nit, NEW.ARTI_COD, (new.tras_costo / new.tras_factor), :fec, :NIT,NEW.tras_desc);
        else
            UPDATE PROVEEDOR_ARTICULO
                SET PVAR_COSTO = NEW.tras_costo, PVAR_FECHA = :fec
                WHERE ARTI_COD = NEW.ARTI_COD AND TERC_NIT = :Nit;
        END
    END
  end
END
^

SET TERM ; ^


SET TERM ^ ;

create procedure COSTOS_PROVEEDOR_TRASLADO
returns (
    ARTICULO VARCHAR(20),
    DESCR VARCHAR(60),
    COSTO NUMERIC(18,2),
    fecha date,
    NIT VARCHAR(20))
as
declare variable FECAUX DATE;
begin
FOR SELECT ARTI_COD, tras_costo / tras_factor, TRAN_FECHA, TERC_NIT, TRAS_DESC
    FROM trasferencias T, trasferencias_detalle D
    WHERE T.tran_id = D.tran_id AND TERC_NIT IS NOT NULL
    ORDER BY TRAN_FECHA, T.TRAN_ID
    INTO :ARTICULO, :COSTO, :FECHA, :NIT, :DESCR
    DO
    BEGIN
    SELECT PVAR_FECHA FROM PROVEEDOR_ARTICULO
        WHERE TERC_NIT = :Nit AND ARTI_COD = :ARTICULO INTO :FECAUX;
    if (FECAUX IS NULL) then
        INSERT INTO PROVEEDOR_ARTICULO (TERC_NIT, ARTI_COD, PVAR_COSTO, PVAR_FECHA, PVAR_COD,PVAR_DES)
            VALUES (:Nit, :ARTICULO, :COSTO, :fecha, :NIT, :DESCR);
    else
        UPDATE PROVEEDOR_ARTICULO
            SET PVAR_COSTO = :costo, PVAR_FECHA = :fecha
            WHERE ARTI_COD = :ARTICULO AND TERC_NIT = :Nit;
    suspend;
    END
end
^

SET TERM ; ^


/* 20090903b */
/* ORDENAR POR UNIDAD CONFIGURABLE */
UPDATE CONFIGURACION
SET CONF_POSIBLES = 'SI,NO,UNIDAD',
    CONF_AYUDA = 'SI:Se imprimirán en orden de código los items de los documentos. NO: se imprimen en el orden en que se digitaron. UNIDAD: Para facilitar el alistamiento se orden por el nombre de la unidad'
WHERE (CONF_MODULO = 'FACTURACION') AND (CONF_CATEGORIA = 'DOCUMENTOS') AND (CONF_PROPIEDAD = 'ORDENAR ITEMS POR CODIGO DE ARTICULO');

SET TERM ^ ;

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

/* ACUMULE LOS PUNTOS, SE HACE ACA POR SER POSTERIOR AL DETALLE */
if (ANULADO = 'N') then
    EXECUTE PROCEDURE acumula_puntos_cliente (31, :id, :nit, :fecha) returning_values (:PUNTOS);
EXECUTE PROCEDURE consulta_puntos_cliente (:id, :nit, :fecha) returning_values (:puntos, :puntosacum, :puntosvenc, :fecptos);
if (DTOIT1M IS NULL) then
    DTOIT1M = 0;
if (DTOIT2M IS NULL) then
    DTOIT2M = 0;
if (DTOIT3M IS NULL) then
    DTOIT3M = 0;
SELECT CLIE_COD, C.ZONA_COD, ZONA_NOM
    FROM CLIENTES C, ZONAS Z
    WHERE TERC_NIT = :NIT AND C.ZONA_COD = Z.ZONA_COD
    INTO :CODIGOCL, :ZONACOD, :ZONANOM;
SELECT CLSU_DIR, CLSU_CIUDAD, CLSU_TEL FROM CLIENTE_SUCURSALES WHERE TERC_NIT = :NIT AND CLCU_COD = :SUCUR
    INTO :DIRECCION, :CIUDAD, :TELEFONO;
DIASVENCE = VENCE - FECHA;
if (DIASVENCE > 0) then
    CONTCRED = 'CREDITO ' || CAST(DIASVENCE AS VARCHAR(3)) || ' DIAS';
ELSE
    CONTCRED = 'CONTADO';
SUBTOTAL = TOTALFAC - EXTRA - IVAMONTO - ADICIONAL + DTOMONTO;
if (DTOITE3 = 'SI') then
    BEGIN
    SELECT SUM(FADE_DTOMONTO) FROM FACTURAS_DETALLE WHERE FACT_ID = :id INTO :sumdtoit;
    SUBTOTAL = SUBTOTAL + sumdtoit + dtoit1m + dtoit2m + dtoit3m;
    END
if (INGTER <> '') then
    BEGIN
    SELECT SUM(FADE_TOTAL) FROM FACTURAS_DETALLE D, ARTICULO A WHERE A.arti_cod = D.arti_cod AND FACT_ID = :id AND GRUP_COD = :ingter
        INTO :ingterceros;
    INGPROPIOS = SUBTOTAL - INGTERCEROS;
    END
EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'FECHA AUTORETENEDOR NO DESCONTAR RETENCIONES DEL SALDO PERO SI CONTABILIZARLAS') returning_values (AUTORET);
if (AUTORET <> '') then
    FAUTORET = CAST(AUTORET AS DATE);
else
    FAUTORET = '9999/12/31';
if (FECHA > fautoret) then
    TOTALPAGAR = TOTALFAC - RTEIVAMONTO - RTEICAMONTO - ANTICIPO;
ELSE
    TOTALPAGAR = TOTALFAC - RTEFTEMONTO - RTEIVAMONTO - RTEICAMONTO - ANTICIPO;
TOTALNETO = TOTALFAC - ANTICIPO;
if (RECIBIDO <> 0) then
    CAMBIO = RECIBIDO - totalpagar;
ELSE
    CAMBIO = 0;
SUMAEX = 0;
SUMA1 = 0;
SUMA2 = 0;
SUMA3 = 0;
IVA1 = 0;
IVA2 = 0;
IVA3 = 0;
TOTCONSUMO = 0;
MONTOPAGO1 = 0;
PESOTOT = 0;
SELECT MAX(AUDI_HORA) FROM AUDITORIA WHERE TIDO_COD = 31 AND AUDI_IDDOC = :ID AND AUDI_OPER = 'I' INTO :HORA;
/* AHORA LAS FORMAS DE PAGO, BUSQUE EL ABONO DE HOY A LA FACTURA */
ITEMFP = 1;
MONTOPAGO1 = 0;
MONTOPAGO2 = 0;
MONTOPAGO3 = 0;
FOR SELECT FOPA_NOM, RCPA_MONTO FROM RECIBOS_CAJA_PAGO P, FORMAS_PAGO F, RECIBOS_CAJA R, RECIBOS_CAJA_DETALLE D
    WHERE R.RECA_ID = P.RECA_ID AND R.RECA_ID = D.RECA_ID AND P.FOPA_ID = F.FOPA_ID AND RECA_FECHA = :FECHA AND RCDE_TIPODOC = 31 AND RCDE_IDDOC = :ID
    INTO :formap, :MONTOP
    DO
    BEGIN
    if (ITEMFP = 1) then
        BEGIN
        FORMAPAGO1 = FORMAP;
        MONTOPAGO1 = MONTOP;
        END
    if (ITEMFP = 2) then
        BEGIN
        FORMAPAGO2 = FORMAP;
        MONTOPAGO2 = MONTOP;
        END
    if (ITEMFP = 3) then
        BEGIN
        FORMAPAGO3 = FORMAP;
        MONTOPAGO3 = MONTOP;
        END
    ITEMFP = ITEMFP + 1;
    END
EXECUTE PROCEDURE lee_configuracion ('FACTURACION','DOCUMENTOS','ORDENAR ITEMS POR CODIGO DE ARTICULO') returning_values (:ORDENCOD);
EXECUTE PROCEDURE lee_configuracion ('FACTURACION','POS', 'IMPRIMIR DEVOLUCIONES DE ARTICULOS NEGATIVOS') returning_values (:imprdev);
totcajas = 0;
totbase = 0;
if (ORDENCOD = 'SI') then
    BEGIN
    FOR SELECT FADE_ITEM, D.ARTI_COD, FADE_CODBAR, SUBSTR(FADE_DESC,1,60), ARTI_DESCORTA, FADE_CANT, FADE_UNIDAD, FADE_FACTOR, BODE_COD, FADE_LOTE, LIPR_COD, FADE_PRUNIT, FADE_DTOPORC, FADE_DTOMONTO, FADE_IVAPORC, FADE_IVAMONTO, FADE_CONSUMO, FADE_TOTAL, FADE_REFERENCIA,
        GRUP_COD, SUBG_COD, MARC_COD, ARTI_PESO, ARTI_ANCHO, ARTI_ALTO, ARTI_LARGO, TAIV_COD, FADE_DEVUELTO, FADE_OBS, FADE_DTO1, FADE_DTO2, FADE_DTO3, FADE_DTOM1, FADE_DTOM2, FADE_DTOM3, FADE_CAJAS, FADE_BASE, FADE_PORCBASE
        FROM FACTURAS_DETALLE D, ARTICULO A
        WHERE D.ARTI_COD = A.ARTI_COD AND D.FACT_ID = :ID
        ORDER BY D.ARTI_COD
        INTO :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :DESCORTA, :CANT, :UNIDAD, :FACTOR, :BODITEM, :LOTE, :LISTAPR, :PRUNIT, :DTOITPORC, :DTOITMONTO, :IVAPORC, :IVAITMONTO, :CONSUMO, :TOTAL, :refitem,
        :GRUPO, :SUBGRUPO, :MARCA, :PESO, :ANCHO, :ALTO, :LARGO, :TARIFA, :devuelto, :obsitem, :dtoit1, :dtoit2, :dtoit3, :dtoitm1, :dtoitm2, :dtoitm3, :cajas, :base, :porcbase
        DO
          BEGIN
          if (ARTICULO = CODBAR) then
            SELECT FIRST 1 COBA_COD FROM barras_articulo WHERE ARTI_COD = :articulo INTO :CODBAR;
          if (IMPRDEV <> 'SI') then
            BEGIN
            if ((CANT >= 0) AND (DEVUELTO = 0)) then
                IMPR = 'S';
            ELSE
                IMPR = 'N'; /* ES DEVOLUCION */
            END
          ELSE
            IMPR = 'S';
          if (IMPR = 'S') then
            BEGIN
            prneto = PRUNIT - DTOITMONTO - dtoitm1 - dtoitm2 - dtoitm3;
            if (IMPTOS = 'S') then
                if (cant <> 0) then
                    prnetosiniva = PRUNIT - DTOITMONTO - ((IVAITMONTO+CONSUMO) / CANT) - dtoitm1 - dtoitm2 - dtoitm3;
                else
                    prnetosiniva = PRUNIT - DTOITMONTO - dtoitm1 - dtoitm2 - dtoitm3;
            ELSE
                prnetosiniva = PRUNIT - DTOITMONTO - dtoit1m - dtoit2m - dtoit3m;
            if (ICOINC = 'SI') then
                SUBTOTIT = TOTAL - IVAITMONTO;
            else
                SUBTOTIT = TOTAL - IVAITMONTO - CONSUMO;
            TOTCONSUMO = TOTCONSUMO + CONSUMO;
            TOTBASE = TOTBASE + BASE;
            SELECT LOTE_VENCE FROM LOTES WHERE LOTE_NRO = :lote AND ARTI_COD = :ARTICULO AND BODE_COD = :boditem INTO :vlote;
            if ((REFITEM <> '.t') or (REFITEM IS NULL)) then
                BEGIN
                /* NO SUME LOS ENSAMBLES */
                if (IVAPORC = 0) then
                    SUMAEX = SUMAEX + TOTAL;
                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;
                END
            if (ANCHO IS NULL) then
                ANCHO = 0;
            if (ALTO IS NULL) then
                ALTO = 0;
            if (LARGO IS NULL) then
                LARGO = 0;
            if (PESO IS NULL) then
                PESO = 0;
            PESO = (PESO / 1000) * CANT * FACTOR;
            PESOTOT = PESOTOT + PESO;
            totcajas = totcajas + cajas;
            if (substr(ARTICULO,1,2) = '.t') then
                BEGIN
                REFITEM = '';
                TOTAL = 0;
                SUBTOTIT = 0;
                END
            SELECT STAND_COD FROM STANDS WHERE ARTI_COD = :ARTICULO AND STAND_BODEGA = :boditem INTO :stand;
            factcant = NULL;
            SELECT FIRST 1 UNAR_FACCAN FROM unidad_articulo WHERE ARTI_COD = :articulo INTO :factcant;
            if (factcant IS NULL) then
                BEGIN
                ALTERNATIVAS = 0;
                PRINCIPALES = (CANT * FACTOR);
                END
            ELSE
                BEGIN
                ALTERNATIVAS = FLOOR(CANT * factor / factcant);
                PRINCIPALES = (CANT * FACTOR) - (alternativas * factcant);
                END
            SUSPEND;
            END
          END
    END
ELSE
  if (ORDENCOD = 'UNIDAD') then
    BEGIN
    FOR SELECT FADE_ITEM, D.ARTI_COD, FADE_CODBAR, SUBSTR(FADE_DESC,1,60), ARTI_DESCORTA, FADE_CANT, FADE_UNIDAD, FADE_FACTOR, BODE_COD, FADE_LOTE, LIPR_COD, FADE_PRUNIT, FADE_DTOPORC, FADE_DTOMONTO, FADE_IVAPORC, FADE_IVAMONTO, FADE_CONSUMO, FADE_TOTAL, FADE_REFERENCIA,
        GRUP_COD, SUBG_COD, MARC_COD, ARTI_PESO, ARTI_ANCHO, ARTI_ALTO, ARTI_LARGO, TAIV_COD, FADE_DEVUELTO, FADE_OBS, FADE_DTO1, FADE_DTO2, FADE_DTO3, FADE_DTOM1, FADE_DTOM2, FADE_DTOM3, FADE_CAJAS, FADE_BASE, FADE_PORCBASE
        FROM FACTURAS_DETALLE D, ARTICULO A
        WHERE D.ARTI_COD = A.ARTI_COD AND D.FACT_ID = :ID
        ORDER BY D.fade_unidad, D.fade_desc
        INTO :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :DESCORTA, :CANT, :UNIDAD, :FACTOR, :BODITEM, :LOTE, :LISTAPR, :PRUNIT, :DTOITPORC, :DTOITMONTO, :IVAPORC, :IVAITMONTO, :CONSUMO, :TOTAL, :refitem,
        :GRUPO, :SUBGRUPO, :MARCA, :PESO, :ANCHO, :ALTO, :LARGO, :TARIFA, :devuelto, :obsitem, :dtoit1, :dtoit2, :dtoit3, :dtoitm1, :dtoitm2, :dtoitm3, :cajas, :base, :porcbase
        DO
          BEGIN
          if (ARTICULO = CODBAR) then
            SELECT FIRST 1 COBA_COD FROM barras_articulo WHERE ARTI_COD = :articulo INTO :CODBAR;
          if (IMPRDEV <> 'SI') then
            BEGIN
            if ((CANT >= 0) AND (DEVUELTO = 0)) then
                IMPR = 'S';
            ELSE
                IMPR = 'N'; /* ES DEVOLUCION */
            END
          ELSE
            IMPR = 'S';
          if (IMPR = 'S') then
            BEGIN
            prneto = PRUNIT - DTOITMONTO - dtoitm1 - dtoitm2 - dtoitm3;
            if (IMPTOS = 'S') then
                if (cant <> 0) then
                    prnetosiniva = PRUNIT - DTOITMONTO - ((IVAITMONTO+CONSUMO) / CANT) - dtoitm1 - dtoitm2 - dtoitm3;
                else
                    prnetosiniva = PRUNIT - DTOITMONTO - dtoitm1 - dtoitm2 - dtoitm3;
            ELSE
                prnetosiniva = PRUNIT - DTOITMONTO - dtoit1m - dtoit2m - dtoit3m;
            if (ICOINC = 'SI') then
                SUBTOTIT = TOTAL - IVAITMONTO;
            else
                SUBTOTIT = TOTAL - IVAITMONTO - CONSUMO;
            TOTCONSUMO = TOTCONSUMO + CONSUMO;
            TOTBASE = TOTBASE + BASE;
            SELECT LOTE_VENCE FROM LOTES WHERE LOTE_NRO = :lote AND ARTI_COD = :ARTICULO AND BODE_COD = :boditem INTO :vlote;
            if ((REFITEM <> '.t') or (REFITEM IS NULL)) then
                BEGIN
                /* NO SUME LOS ENSAMBLES */
                if (IVAPORC = 0) then
                    SUMAEX = SUMAEX + TOTAL;
                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;
                END
            if (ANCHO IS NULL) then
                ANCHO = 0;
            if (ALTO IS NULL) then
                ALTO = 0;
            if (LARGO IS NULL) then
                LARGO = 0;
            if (PESO IS NULL) then
                PESO = 0;
            PESO = (PESO / 1000) * CANT * FACTOR;
            PESOTOT = PESOTOT + PESO;
            totcajas = totcajas + cajas;
            if (substr(ARTICULO,1,2) = '.t') then
                BEGIN
                REFITEM = '';
                TOTAL = 0;
                SUBTOTIT = 0;
                END
            SELECT STAND_COD FROM STANDS WHERE ARTI_COD = :ARTICULO AND STAND_BODEGA = :boditem INTO :stand;
            factcant = NULL;
            SELECT FIRST 1 UNAR_FACCAN FROM unidad_articulo WHERE ARTI_COD = :articulo INTO :factcant;
            if (factcant IS NULL) then
                BEGIN
                ALTERNATIVAS = 0;
                PRINCIPALES = (CANT * FACTOR);
                END
            ELSE
                BEGIN
                ALTERNATIVAS = FLOOR(CANT * factor / factcant);
                PRINCIPALES = (CANT * FACTOR) - (alternativas * factcant);
                END
            SUSPEND;
            END
          END
    END
  ELSE
    BEGIN
    FOR SELECT FADE_ITEM, D.ARTI_COD, FADE_CODBAR, SUBSTR(FADE_DESC,1,60), ARTI_DESCORTA, FADE_CANT, FADE_UNIDAD, FADE_FACTOR, BODE_COD, FADE_LOTE, LIPR_COD, FADE_PRUNIT, FADE_DTOPORC, FADE_DTOMONTO, FADE_IVAPORC, FADE_IVAMONTO, FADE_CONSUMO, FADE_TOTAL, FADE_REFERENCIA,
        GRUP_COD, SUBG_COD, MARC_COD, ARTI_PESO, ARTI_ANCHO, ARTI_ALTO, ARTI_LARGO, TAIV_COD, FADE_DEVUELTO, FADE_OBS, FADE_DTO1, FADE_DTO2, FADE_DTO3, FADE_DTOM1, FADE_DTOM2, FADE_DTOM3, FADE_CAJAS, FADE_BASE, FADE_PORCBASE
        FROM FACTURAS_DETALLE D, ARTICULO A
        WHERE D.ARTI_COD = A.ARTI_COD AND D.FACT_ID = :ID
        ORDER BY FADE_ITEM
        INTO :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :DESCORTA, :CANT, :UNIDAD, :FACTOR, :BODITEM, :LOTE, :LISTAPR, :PRUNIT, :DTOITPORC, :DTOITMONTO, :IVAPORC, :IVAITMONTO, :CONSUMO, :TOTAL, :refitem,
        :GRUPO, :SUBGRUPO, :MARCA, :PESO, :ANCHO, :ALTO, :LARGO, :TARIFA, :devuelto, :obsitem, :dtoit1, :dtoit2, :dtoit3, :dtoitm1, :dtoitm2, :dtoitm3, :cajas, :base, :porcbase
        DO
          BEGIN
          if (IMPRDEV <> 'SI') then
            BEGIN
            if ((CANT >= 0) AND (DEVUELTO = 0)) then
                IMPR = 'S';
            ELSE
                IMPR = 'N'; /* ES DEVOLUCION */
            END
          ELSE
            IMPR = 'S';
          if (IMPR = 'S') then
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :GRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :MARCA INTO NOMMARCA;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :SUBGRUPO AND GRUP_COD = :GRUPO INTO :NOMSUBG;
            prneto = PRUNIT - DTOITMONTO - dtoitm1 - dtoitm2 - dtoitm3;
            if (IMPTOS = 'S') then
                if (cant <> 0) then
                    prnetosiniva = PRUNIT - DTOITMONTO - ((IVAITMONTO+CONSUMO) / CANT) - dtoit1m - dtoit2m - dtoit3m;
                else
                    prnetosiniva = PRUNIT - DTOITMONTO - dtoitm1 - dtoitm2 - dtoitm3;
            ELSE
                prnetosiniva = PRUNIT - DTOITMONTO - dtoitm1 - dtoitm2 - dtoitm3;
            if (ICOINC = 'SI') then
                SUBTOTIT = TOTAL - IVAITMONTO;
            else
                SUBTOTIT = TOTAL - IVAITMONTO - CONSUMO;
            TOTCONSUMO = TOTCONSUMO + CONSUMO;
            TOTBASE = TOTBASE + BASE;
            SELECT LOTE_VENCE FROM LOTES WHERE LOTE_NRO = :lote AND ARTI_COD = :ARTICULO AND BODE_COD = :boditem INTO :vlote;
            if ((REFITEM <> '.t') or (REFITEM IS NULL)) then
                BEGIN
                /* NO SUME LOS ENSAMBLES */
                if (IVAPORC = 0) then
                    SUMAEX = SUMAEX + TOTAL;
                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;
                END
            if (ANCHO IS NULL) then
                ANCHO = 0;
            if (ALTO IS NULL) then
                ALTO = 0;
            if (LARGO IS NULL) then
                LARGO = 0;
            if (PESO IS NULL) then
                PESO = 0;
            PESO = (PESO / 1000)* CANT * FACTOR;
            PESOTOT = PESOTOT + PESO;
            totcajas = totcajas + cajas;
            if (substr(ARTICULO,1,2) = '.t') then
                BEGIN
                REFITEM = '';
                TOTAL = 0;
                SUBTOTIT = 0;
                END
            SELECT STAND_COD FROM STANDS WHERE ARTI_COD = :ARTICULO AND STAND_BODEGA = :boditem INTO :stand;
            factcant = NULL;
            SELECT FIRST 1 UNAR_FACCAN FROM unidad_articulo WHERE ARTI_COD = :articulo INTO :factcant;
            if (factcant IS NULL) then
                BEGIN
                ALTERNATIVAS = 0;
                PRINCIPALES = (CANT * FACTOR);
                END
            ELSE
                BEGIN
                ALTERNATIVAS = FLOOR(CANT * factor / factcant);
                PRINCIPALES = (CANT * FACTOR) - (alternativas * factcant);
                END
            SUSPEND;
            END
          END
    END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure IMPR_COTIZACION (
    ID integer)
returns (
    PREF varchar(4),
    NUMERO varchar(6),
    FECHA date,
    VALIDEZ integer,
    NIT varchar(20),
    NOMTERCERO varchar(60),
    VENDEDOR integer,
    NOMVENDEDOR varchar(60),
    PUNTOVTA integer,
    NOMPUNTOVTA varchar(60),
    SUBTOTAL numeric(18,2),
    DTOPORC numeric(9,2),
    DTOMONTO numeric(18,2),
    ADICIONAL numeric(18,2),
    IVAMONTO numeric(18,2),
    EXTRA numeric(18,2),
    TOTALFAC numeric(18,2),
    PESOTOT numeric(18,2),
    OBS blob sub_type 1 segment size 80,
    ITEM integer,
    ARTICULO varchar(15),
    CODBAR varchar(15),
    ARTIDES varchar(60),
    CANT numeric(18,4),
    UNIDAD varchar(8),
    FACTOR numeric(18,4),
    LISTAPR integer,
    REFITEM varchar(60),
    PRUNIT numeric(18,2),
    DTOITPORC numeric(9,2),
    DTOITMONTO numeric(18,2),
    PRNETO numeric(18,2),
    PRNETOSINIVA numeric(18,2),
    IVAPORC numeric(9,2),
    IVAITMONTO numeric(18,2),
    CONSUMO numeric(18,2),
    SUBTOTIT numeric(18,2),
    TOTAL numeric(18,2),
    CODIGOCL varchar(20),
    ZONACOD varchar(2),
    ZONANOM varchar(60),
    DV char(1),
    DIRECCION varchar(60),
    CIUDAD varchar(40),
    TELEFONO varchar(40),
    CONTACTO varchar(60),
    FAX varchar(25),
    CEL varchar(25),
    GRUPO varchar(2),
    NOMGRUPO varchar(30),
    SUBGRUPO varchar(3),
    NOMSUBG varchar(30),
    MARCA varchar(3),
    NOMMARCA varchar(30),
    PESO numeric(9,4),
    ANCHO numeric(18,4),
    ALTO numeric(18,4),
    LARGO numeric(18,4),
    SUMA1 numeric(18,2),
    SUMA2 numeric(18,2),
    SUMA3 numeric(18,2),
    IVA1 numeric(18,2),
    IVA2 numeric(18,2),
    IVA3 numeric(18,2),
    SUMAEX numeric(18,2),
    SUMAGR numeric(18,2),
    OBSITEM blob sub_type 1 segment size 80,
    ALTERNATIVAS numeric(18,4),
    PRINCIPALES numeric(18,4))
AS
DECLARE VARIABLE IMPTOS CHAR(1);
DECLARE VARIABLE TARIFA INTEGER;
declare variable ORDENCOD CHAR(8);
declare variable SUCUR VARCHAR(10);
declare variable ICOINC CHAR(2);
declare variable FACTCANT NUMERIC(18,4);
BEGIN
execute procedure lee_configuracion('FACTURACION', 'ARTICULOS', 'IMPOCONSUMO INCLUIDO EN EL PRECIO BASE DE VENTA ANTES DE IVA') returning_values (icoinc);
SELECT F.PREF_PRE, COTI_NUMERO, COTI_FECHA, COTI_VALIDEZ, F.TERC_NIT, COTI_NOMTERC, F.VEND_COD, VEND_NOMBRE, F.PTVT_ID, PTVT_NOM,
    COTI_IMPTOS, COTI_DTOPORC, COTI_DTOMONTO, COTI_ADICIONAL, COTI_IVAMONTO, COTI_EXTRA, COTI_TOTAL,
    TERC_CONTACTO, TERC_FAX, TERC_CEL, TERC_DV, COTI_OBS, COTI_SUCURSAL
    FROM COTIZACIONES F, VENDEDORES V, PUNTO_VENTA P, TERCEROS T
    WHERE F.VEND_COD = V.VEND_COD AND F.PTVT_ID = P.PTVT_ID AND F.TERC_NIT = T.TERC_NIT AND F.COTI_ID = :ID
    into :PREF, :NUMERO, :FECHA, :VALIDEZ, :NIT, :NOMTERCERO, :VENDEDOR, :NOMVENDEDOR, :PUNTOVTA, :NOMPUNTOVTA,
    :IMPTOS, :DTOPORC, :DTOMONTO, :ADICIONAL, :IVAMONTO, :EXTRA, :TOTALFAC,
    :CONTACTO, :FAX, :CEL, :DV, :OBS, :SUCUR;
SUBTOTAL = TOTALFAC - EXTRA - IVAMONTO - ADICIONAL + DTOMONTO;

SELECT CLIE_COD, C.ZONA_COD, ZONA_NOM
    FROM CLIENTES C, ZONAS Z
    WHERE TERC_NIT = :NIT AND C.ZONA_COD = Z.ZONA_COD
    INTO :CODIGOCL, :ZONACOD, :ZONANOM;
SELECT CLSU_DIR, CLSU_CIUDAD, CLSU_TEL FROM CLIENTE_SUCURSALES WHERE TERC_NIT = :NIT AND CLCU_COD = :SUCUR
    INTO :DIRECCION, :CIUDAD, :TELEFONO;
    
SUMAEX = 0;
SUMA1 = 0;
SUMA2 = 0;
SUMA3 = 0;
IVA1 = 0;
IVA2 = 0;
IVA3 = 0;
ITEM = 0;
PESOTOT = 0;
EXECUTE PROCEDURE lee_configuracion ('FACTURACION','DOCUMENTOS','ORDENAR ITEMS POR CODIGO DE ARTICULO') returning_values (:ORDENCOD);
if (ORDENCOD = 'SI') then
    BEGIN
    FOR SELECT D.ARTI_COD, CTDE_CODBAR, SUBSTR(CTDE_DESC,1,60), CTDE_CANT, CTDE_UNIDAD, LIPR_COD, CTDE_PRUNIT, CTDE_DTOPORC, CTDE_DTOMONTO, CTDE_IVAPORC, CTDE_IVAMONTO, CTDE_CONSUMO, CTDE_TOTAL, CTDE_REFERENCIA,
        GRUP_COD, SUBG_COD, MARC_COD, ARTI_PESO, ARTI_ANCHO, ARTI_ALTO, ARTI_LARGO, TAIV_COD, CTDE_OBS, CTDE_FACTOR
        FROM COTIZACIONES_DETALLE D, ARTICULO A
        WHERE D.ARTI_COD = A.ARTI_COD AND D.COTI_ID = :ID
        ORDER BY CTDE_CODBAR
        INTO :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :LISTAPR, :PRUNIT, :DTOITPORC, :DTOITMONTO, :IVAPORC, :IVAITMONTO, :CONSUMO, :TOTAL, :refitem,
        :GRUPO, :SUBGRUPO, :MARCA, :PESO, :ANCHO, :ALTO, :LARGO, :TARIFA, :obsitem, :FACTOR
        DO
        BEGIN
        if (ICOINC = 'SI') then
            SUBTOTIT = TOTAL - IVAITMONTO;
        else
            SUBTOTIT = TOTAL - IVAITMONTO - CONSUMO;
        if (ARTICULO = CODBAR) then
            SELECT FIRST 1 COBA_COD FROM barras_articulo WHERE ARTI_COD = :articulo INTO :CODBAR;
        SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :GRUPO INTO NOMGRUPO;
        SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :MARCA INTO NOMMARCA;
        SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :SUBGRUPO AND GRUP_COD = :GRUPO INTO :NOMSUBG;
        ITEM = ITEM + 1;
        PRNETO = PRUNIT - DTOITMONTO;
        if (PESO IS NULL) then
            PESO = 0;
        PESO = PESO / 1000 * CANT * FACTOR;
        PESOTOT = PESOTOT + PESO;
        if (IMPTOS = 'S') then
            if (cant <> 0) then
                prnetosiniva = PRUNIT - DTOITMONTO - ((IVAITMONTO+CONSUMO) / CANT);
            else
                prnetosiniva = PRUNIT - DTOITMONTO;
        ELSE
            prnetosiniva = PRUNIT - DTOITMONTO;
        if (ivaporc = 0) then
            SUMAEX = SUMAEX + TOTAL;
        if (TARIFA = 1) then
            BEGIN
            SUMA1 = SUMA1 + TOTAL - IVAITMONTO;
            IVA1 = IVA1 + IVAITMONTO;
            END
        if (TARIFA = 2) then
            BEGIN
            SUMA2 = SUMA2 + TOTAL - IVAITMONTO;
            IVA2 = IVA2 + IVAITMONTO;
            END
        if (TARIFA = 3) then
            BEGIN
            SUMA3 = SUMA3 + TOTAL - IVAITMONTO;
            IVA3 = IVA3 + IVAITMONTO;
            END
        SUMAGR = SUMA1 + SUMA2 + SUMA3;
        if (IMPTOS = 'N') then
            TOTAL = TOTAL - IVAITMONTO;
        factcant = NULL;
        SELECT FIRST 1 UNAR_FACCAN FROM unidad_articulo WHERE ARTI_COD = :articulo INTO :factcant;
        if (factcant IS NULL) then
            factcant = 1;
        if ((factcant = 1) or (factcant = 0)) then
            BEGIN
            ALTERNATIVAS = 0;
            PRINCIPALES = (CANT * FACTOR);
            END
        ELSE
            BEGIN
            ALTERNATIVAS = FLOOR(CANT * factor / factcant);
            PRINCIPALES = (CANT * FACTOR) - (alternativas * factcant);
            END
        SUSPEND;
        END
    END
ELSE
  if (ORDENCOD = 'UNIDAD') then
    BEGIN
    FOR SELECT D.ARTI_COD, CTDE_CODBAR, SUBSTR(CTDE_DESC,1,60), CTDE_CANT, CTDE_UNIDAD, LIPR_COD, CTDE_PRUNIT, CTDE_DTOPORC, CTDE_DTOMONTO, CTDE_IVAPORC, CTDE_IVAMONTO, CTDE_CONSUMO, CTDE_TOTAL, CTDE_REFERENCIA,
        GRUP_COD, SUBG_COD, MARC_COD, ARTI_PESO, ARTI_ANCHO, ARTI_ALTO, ARTI_LARGO, TAIV_COD, CTDE_OBS, CTDE_FACTOR
        FROM COTIZACIONES_DETALLE D, ARTICULO A
        WHERE D.ARTI_COD = A.ARTI_COD AND D.COTI_ID = :ID
        ORDER BY D.ctde_unidad, D.ctde_desc
        INTO :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :LISTAPR, :PRUNIT, :DTOITPORC, :DTOITMONTO, :IVAPORC, :IVAITMONTO, :CONSUMO, :TOTAL, :refitem,
        :GRUPO, :SUBGRUPO, :MARCA, :PESO, :ANCHO, :ALTO, :LARGO, :TARIFA, :obsitem, :FACTOR
        DO
        BEGIN
        if (ICOINC = 'SI') then
            SUBTOTIT = TOTAL - IVAITMONTO;
        else
            SUBTOTIT = TOTAL - IVAITMONTO - CONSUMO;
        if (ARTICULO = CODBAR) then
            SELECT FIRST 1 COBA_COD FROM barras_articulo WHERE ARTI_COD = :articulo INTO :CODBAR;
        SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :GRUPO INTO NOMGRUPO;
        SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :MARCA INTO NOMMARCA;
        SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :SUBGRUPO AND GRUP_COD = :GRUPO INTO :NOMSUBG;
        ITEM = ITEM + 1;
        PRNETO = PRUNIT - DTOITMONTO;
        if (PESO IS NULL) then
            PESO = 0;
        PESO = PESO / 1000 * CANT * FACTOR;
        PESOTOT = PESOTOT + PESO;
        if (IMPTOS = 'S') then
            if (cant <> 0) then
                prnetosiniva = PRUNIT - DTOITMONTO - ((IVAITMONTO+CONSUMO) / CANT);
            else
                prnetosiniva = PRUNIT - DTOITMONTO;
        ELSE
            prnetosiniva = PRUNIT - DTOITMONTO;
        if (ivaporc = 0) then
            SUMAEX = SUMAEX + TOTAL;
        if (TARIFA = 1) then
            BEGIN
            SUMA1 = SUMA1 + TOTAL - IVAITMONTO;
            IVA1 = IVA1 + IVAITMONTO;
            END
        if (TARIFA = 2) then
            BEGIN
            SUMA2 = SUMA2 + TOTAL - IVAITMONTO;
            IVA2 = IVA2 + IVAITMONTO;
            END
        if (TARIFA = 3) then
            BEGIN
            SUMA3 = SUMA3 + TOTAL - IVAITMONTO;
            IVA3 = IVA3 + IVAITMONTO;
            END
        SUMAGR = SUMA1 + SUMA2 + SUMA3;
        if (IMPTOS = 'N') then
            TOTAL = TOTAL - IVAITMONTO;
        factcant = NULL;
        SELECT FIRST 1 UNAR_FACCAN FROM unidad_articulo WHERE ARTI_COD = :articulo INTO :factcant;
        if (factcant IS NULL) then
            factcant = 1;
        if ((factcant = 1) or (factcant = 0)) then
            BEGIN
            ALTERNATIVAS = 0;
            PRINCIPALES = (CANT * FACTOR);
            END
        ELSE
            BEGIN
            ALTERNATIVAS = FLOOR(CANT * factor / factcant);
            PRINCIPALES = (CANT * FACTOR) - (alternativas * factcant);
            END
        SUSPEND;
        END
    END
  ELSE
    BEGIN
    FOR SELECT D.ARTI_COD, CTDE_CODBAR, SUBSTR(CTDE_DESC,1,60), CTDE_CANT, CTDE_UNIDAD, LIPR_COD, CTDE_PRUNIT, CTDE_DTOPORC, CTDE_DTOMONTO, CTDE_IVAPORC, CTDE_IVAMONTO, CTDE_CONSUMO, CTDE_TOTAL, CTDE_REFERENCIA,
        GRUP_COD, SUBG_COD, MARC_COD, ARTI_PESO, ARTI_ANCHO, ARTI_ALTO, ARTI_LARGO, TAIV_COD, CTDE_OBS, CTDE_FACTOR
        FROM COTIZACIONES_DETALLE D, ARTICULO A
        WHERE D.ARTI_COD = A.ARTI_COD AND D.COTI_ID = :ID
        ORDER BY CTDE_ITEM
        INTO :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :LISTAPR, :PRUNIT, :DTOITPORC, :DTOITMONTO, :IVAPORC, :IVAITMONTO, :CONSUMO, :TOTAL, :refitem,
        :GRUPO, :SUBGRUPO, :MARCA, :PESO, :ANCHO, :ALTO, :LARGO, :TARIFA, :obsitem, :FACTOR
        DO
        BEGIN
        SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :GRUPO INTO NOMGRUPO;
        SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :MARCA INTO NOMMARCA;
        SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :SUBGRUPO AND GRUP_COD = :GRUPO INTO :NOMSUBG;
        ITEM = ITEM + 1;
        if (ICOINC = 'SI') then
            SUBTOTIT = TOTAL - IVAITMONTO;
        else
            SUBTOTIT = TOTAL - IVAITMONTO - CONSUMO;
        PRNETO = PRUNIT - DTOITMONTO;
        if (PESO IS NULL) then
            PESO = 0;
        PESO = PESO / 1000 * CANT * FACTOR;
        PESOTOT = PESOTOT + PESO;
        if (IMPTOS = 'S') then
            if (cant <> 0) then
                prnetosiniva = PRUNIT - DTOITMONTO - ((IVAITMONTO+CONSUMO) / CANT);
            else
                prnetosiniva = PRUNIT - DTOITMONTO;
        ELSE
            prnetosiniva = PRUNIT - DTOITMONTO;
        if (ivaporc = 0) then
            SUMAEX = SUMAEX + TOTAL;
        if (TARIFA = 1) then
            BEGIN
            SUMA1 = SUMA1 + TOTAL - IVAITMONTO;
            IVA1 = IVA1 + IVAITMONTO;
            END
        if (TARIFA = 2) then
            BEGIN
            SUMA2 = SUMA2 + TOTAL - IVAITMONTO;
            IVA2 = IVA2 + IVAITMONTO;
            END
        if (TARIFA = 3) then
            BEGIN
            SUMA3 = SUMA3 + TOTAL - IVAITMONTO;
            IVA3 = IVA3 + IVAITMONTO;
            END
        SUMAGR = SUMA1 + SUMA2 + SUMA3;
        if (IMPTOS = 'N') then
            TOTAL = TOTAL - IVAITMONTO;
        factcant = NULL;
        SELECT FIRST 1 UNAR_FACCAN FROM unidad_articulo WHERE ARTI_COD = :articulo INTO :factcant;
        if (factcant IS NULL) then
            factcant = 1;
        if ((factcant = 1) or (factcant = 0)) then
            BEGIN
            ALTERNATIVAS = 0;
            PRINCIPALES = (CANT * FACTOR);
            END
        ELSE
            BEGIN
            ALTERNATIVAS = FLOOR(CANT * factor / factcant);
            PRINCIPALES = (CANT * FACTOR) - (alternativas * factcant);
            END
        SUSPEND;
        END
    END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure IMPR_DEVOLUCION (
    ID integer)
returns (
    PREF varchar(4),
    NUMERO varchar(6),
    FECHA date,
    NIT varchar(20),
    NOMTERCERO varchar(60),
    VENDEDOR integer,
    NOMVENDEDOR varchar(60),
    PUNTOVTA integer,
    NOMPUNTOVTA varchar(30),
    CODBODEGA varchar(2),
    NOMBODEGA varchar(30),
    FACTURA varchar(30),
    REMISION varchar(10),
    COMIPORC numeric(9,2),
    COMIMONTO numeric(18,2),
    SUBTOTAL numeric(18,2),
    DTOPORC numeric(9,2),
    DTOMONTO numeric(18,2),
    ADICIONAL numeric(18,2),
    IVAMONTO numeric(18,2),
    RTEFTEPORC numeric(9,2),
    RTEFTEMONTO numeric(18,2),
    RTEIVAPORC numeric(9,2),
    RTEIVAMONTO numeric(18,2),
    RTEICAPORC numeric(9,2),
    RTEICAMONTO numeric(18,2),
    EXTRA numeric(18,2),
    TOTALFAC numeric(18,2),
    TOTALPAGAR numeric(18,2),
    PESOTOT numeric(18,2),
    OBS blob sub_type 1 segment size 80,
    ITEM integer,
    ARTICULO varchar(15),
    CODBAR varchar(15),
    ARTIDES varchar(60),
    CANT numeric(18,4),
    LOTE varchar(15),
    UNIDAD varchar(8),
    FACTOR numeric(18,4),
    REFITEM varchar(60),
    BODITEM varchar(2),
    PRUNIT numeric(18,2),
    DTOITPORC numeric(9,2),
    DTOITMONTO numeric(18,2),
    PRNETO numeric(18,2),
    PRNETOSINIVA numeric(18,2),
    IVAPORC numeric(9,2),
    IVAITMONTO numeric(18,2),
    CONSUMO numeric(18,2),
    SUBTOTIT numeric(18,2),
    TOTAL numeric(18,2),
    CODIGOCL varchar(20),
    ZONACOD varchar(2),
    ZONANOM varchar(60),
    DV char(1),
    DIRECCION varchar(60),
    CIUDAD varchar(40),
    TELEFONO varchar(40),
    CONTACTO varchar(60),
    FAX varchar(25),
    CEL varchar(25),
    GRUPO varchar(2),
    NOMGRUPO varchar(30),
    SUBGRUPO varchar(3),
    NOMSUBG varchar(30),
    MARCA varchar(3),
    NOMMARCA varchar(30),
    PESO numeric(9,4),
    ANCHO numeric(18,4),
    ALTO numeric(18,4),
    LARGO numeric(18,4),
    SUMA1 numeric(18,2),
    SUMA2 numeric(18,2),
    SUMA3 numeric(18,2),
    IVA1 numeric(18,2),
    IVA2 numeric(18,2),
    IVA3 numeric(18,2),
    TOTCONSUMO numeric(18,2),
    SUMAEX numeric(18,2),
    SUMAGR numeric(18,2),
    OBSITEM blob sub_type 1 segment size 80,
    ALTERNATIVAS numeric(18,4),
    PRINCIPALES numeric(18,4))
AS
DECLARE VARIABLE IMPTOS CHAR(1);
DECLARE VARIABLE TARIFA INTEGER;
declare variable ORDENCOD CHAR(8);
declare variable SUCUR VARCHAR(10);
declare variable PUNTOS NUMERIC(18,4);
declare variable ICOINC CHAR(2);
declare variable FACTCANT NUMERIC(18,4);
declare variable ANULADO CHAR(1);
BEGIN
execute procedure lee_configuracion('FACTURACION', 'ARTICULOS', 'IMPOCONSUMO INCLUIDO EN EL PRECIO BASE DE VENTA ANTES DE IVA') returning_values (icoinc);
SELECT F.PREF_PRE, DEVT_NUMERO, DEVT_FECHA, F.BODE_COD, BODE_NOM, F.TERC_NIT, DEVT_NOMTERC, F.VEND_COD, VEND_NOMBRE, F.PTVT_ID, PTVT_NOM,
    DEVT_FACTURA, DEVT_COMIPORC, DEVT_COMIMONTO, DEVT_IVAINC,
    DEVT_DTOPOR, DEVT_DTOMONTO, DEVT_ADICIONAL, DEVT_IVAMONTO, DEVT_RTFTEPORC, DEVT_RTFTEMONTO, DEVT_RTIVAPORC, DEVT_RTIVAMONTO, DEVT_RTICAPORC, DEVT_RTICAMONTO, DEVT_EXTRA, DEVT_TOTAL,
    TERC_CONTACTO, TERC_FAX, TERC_DV, TERC_CEL, DEVT_OBS, DEVT_SUCURSAL, DEVT_REMISION, DEVT_ANULADO
    FROM DEVOLUCIONES_VENTAS F, BODEGA B, VENDEDORES V, PUNTO_VENTA P, TERCEROS T
    WHERE F.BODE_COD = B.BODE_COD AND F.VEND_COD = V.VEND_COD AND F.PTVT_ID = P.PTVT_ID AND F.TERC_NIT = T.TERC_NIT AND F.DEVT_ID = :ID
    into :PREF, :NUMERO, :FECHA, :CODBODEGA, :NOMBODEGA, :NIT, :NOMTERCERO, :VENDEDOR, :NOMVENDEDOR, :PUNTOVTA, :NOMPUNTOVTA,
    :FACTURA, :COMIPORC, :COMIMONTO, :IMPTOS,
    :DTOPORC, :DTOMONTO, :ADICIONAL, :IVAMONTO, :RTEFTEPORC, :RTEFTEMONTO, :RTEIVAPORC, :RTEIVAMONTO, :RTEICAPORC, :RTEICAMONTO, :EXTRA, :TOTALFAC,
    :CONTACTO, :FAX, :DV, :CEL, :OBS, :SUCUR, :REMISION, :ANULADO;
SUBTOTAL = TOTALFAC - EXTRA - IVAMONTO - ADICIONAL + DTOMONTO;
TOTALPAGAR = TOTALFAC - RTEFTEMONTO - RTEIVAMONTO - RTEICAMONTO;
if (ANULADO = 'N') then
    EXECUTE PROCEDURE acumula_puntos_cliente (33, :id, :nit, :fecha) returning_values (:PUNTOS);
SELECT CLIE_COD, C.ZONA_COD, ZONA_NOM
    FROM CLIENTES C, ZONAS Z
    WHERE TERC_NIT = :NIT AND C.ZONA_COD = Z.ZONA_COD
    INTO :CODIGOCL, :ZONACOD, :ZONANOM;
SELECT CLSU_DIR, CLSU_CIUDAD, CLSU_TEL FROM CLIENTE_SUCURSALES WHERE TERC_NIT = :NIT AND CLCU_COD = :SUCUR
    INTO :DIRECCION, :CIUDAD, :TELEFONO;
    
SUMAEX = 0;
SUMA1 = 0;
SUMA2 = 0;
SUMA3 = 0;
IVA1 = 0;
IVA2 = 0;
IVA3 = 0;
TOTCONSUMO = 0;
ITEM = 0;
EXECUTE PROCEDURE lee_configuracion ('FACTURACION','DOCUMENTOS','ORDENAR ITEMS POR CODIGO DE ARTICULO') returning_values (:ORDENCOD);
if (ORDENCOD = 'SI') then
    BEGIN
    FOR SELECT D.ARTI_COD, DVDE_CODBAR, SUBSTR(DVDE_DESC,1,60), DVDE_CANT, DVDE_UNIDAD, BODE_COD, DVDE_LOTE, DVDE_PRUNIT, DVDE_DTOPORC, DVDE_DTOMONTO, DVDE_IVAPORC, DVDE_IVAMONTO, DVDE_CONSUMO, DVDE_TOTAL, DVDE_REFERENCIA,
        GRUP_COD, SUBG_COD, MARC_COD, ARTI_PESO, ARTI_ANCHO, ARTI_ALTO, ARTI_LARGO, TAIV_COD, DVDE_OBS, DVDE_FACTOR
        FROM DEVOLUCIONES_VENTAS_DETALLE D, ARTICULO A
        WHERE D.ARTI_COD = A.ARTI_COD AND D.DEVT_ID = :ID
        ORDER BY DVDE_CODBAR
        INTO :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :BODITEM, :LOTE, :PRUNIT, :DTOITPORC, :DTOITMONTO, :IVAPORC, :IVAITMONTO, :CONSUMO, :TOTAL, :REFITEM,
        :GRUPO, :SUBGRUPO, :MARCA, :PESO, :ANCHO, :ALTO, :LARGO, :TARIFA, :obsitem, :FACTOR
        DO
        BEGIN
        if (ARTICULO = CODBAR) then
            SELECT FIRST 1 COBA_COD FROM barras_articulo WHERE ARTI_COD = :articulo INTO :CODBAR;
        ITEM = ITEM + 1;
        if (ICOINC = 'SI') then
            SUBTOTIT = TOTAL - IVAITMONTO;
        else
            SUBTOTIT = TOTAL - IVAITMONTO - CONSUMO;
        PRNETO = PRUNIT - DTOITMONTO;
        if (PESO IS NULL) then
            PESO = 0;
        PESO = PESO / 1000 * CANT * FACTOR;
        PESOTOT = PESOTOT + PESO;
        if (IMPTOS = 'S') then
            if (cant <> 0) then
                prnetosiniva = PRUNIT - DTOITMONTO - ((IVAITMONTO+CONSUMO) / CANT);
            else
                prnetosiniva = PRUNIT - DTOITMONTO;
        ELSE
            prnetosiniva = PRUNIT - DTOITMONTO;
        TOTCONSUMO = TOTCONSUMO + CONSUMO;
        if ((REFITEM <> '.t') or (REFITEM IS NULL)) then
            BEGIN
            /* NO SUME LOS ENSAMBLES */
            if (IVAPORC = 0) then
                SUMAEX = SUMAEX + TOTAL;
            if (TARIFA = 1) then
                BEGIN
                SUMA1 = SUMA1 + TOTAL - IVAITMONTO;
                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;
            END
        if (substr(ARTICULO,1,2) = '.t') then
            BEGIN
            REFITEM = '';
            TOTAL = 0;
            END
        factcant = NULL;
        SELECT FIRST 1 UNAR_FACCAN FROM unidad_articulo WHERE ARTI_COD = :articulo INTO :factcant;
        if (factcant IS NULL) then
            factcant = 1;
        if ((factcant = 1) or (factcant = 0)) then
            BEGIN
            ALTERNATIVAS = 0;
            PRINCIPALES = (CANT * FACTOR);
            END
        ELSE
            BEGIN
            ALTERNATIVAS = FLOOR(CANT * factor / factcant);
            PRINCIPALES = (CANT * FACTOR) - (alternativas * factcant);
            END
        SUSPEND;
        END
    END
ELSE
  if (ORDENCOD = 'UNIDAD') then
    BEGIN
    FOR SELECT D.ARTI_COD, DVDE_CODBAR, SUBSTR(DVDE_DESC,1,60), DVDE_CANT, DVDE_UNIDAD, BODE_COD, DVDE_LOTE, DVDE_PRUNIT, DVDE_DTOPORC, DVDE_DTOMONTO, DVDE_IVAPORC, DVDE_IVAMONTO, DVDE_CONSUMO, DVDE_TOTAL, DVDE_REFERENCIA,
        GRUP_COD, SUBG_COD, MARC_COD, ARTI_PESO, ARTI_ANCHO, ARTI_ALTO, ARTI_LARGO, TAIV_COD, DVDE_OBS, DVDE_FACTOR
        FROM DEVOLUCIONES_VENTAS_DETALLE D, ARTICULO A
        WHERE D.ARTI_COD = A.ARTI_COD AND D.DEVT_ID = :ID
        ORDER BY D.dvde_unidad, D.dvde_desc
        INTO :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :BODITEM, :LOTE, :PRUNIT, :DTOITPORC, :DTOITMONTO, :IVAPORC, :IVAITMONTO, :CONSUMO, :TOTAL, :REFITEM,
        :GRUPO, :SUBGRUPO, :MARCA, :PESO, :ANCHO, :ALTO, :LARGO, :TARIFA, :obsitem, :FACTOR
        DO
        BEGIN
        if (ARTICULO = CODBAR) then
            SELECT FIRST 1 COBA_COD FROM barras_articulo WHERE ARTI_COD = :articulo INTO :CODBAR;
        ITEM = ITEM + 1;
        if (ICOINC = 'SI') then
            SUBTOTIT = TOTAL - IVAITMONTO;
        else
            SUBTOTIT = TOTAL - IVAITMONTO - CONSUMO;
        PRNETO = PRUNIT - DTOITMONTO;
        if (PESO IS NULL) then
            PESO = 0;
        PESO = PESO / 1000 * CANT * FACTOR;
        PESOTOT = PESOTOT + PESO;
        if (IMPTOS = 'S') then
            if (cant <> 0) then
                prnetosiniva = PRUNIT - DTOITMONTO - ((IVAITMONTO+CONSUMO) / CANT);
            else
                prnetosiniva = PRUNIT - DTOITMONTO;
        ELSE
            prnetosiniva = PRUNIT - DTOITMONTO;
        TOTCONSUMO = TOTCONSUMO + CONSUMO;
        if ((REFITEM <> '.t') or (REFITEM IS NULL)) then
            BEGIN
            /* NO SUME LOS ENSAMBLES */
            if (IVAPORC = 0) then
                SUMAEX = SUMAEX + TOTAL;
            if (TARIFA = 1) then
                BEGIN
                SUMA1 = SUMA1 + TOTAL - IVAITMONTO;
                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;
            END
        if (substr(ARTICULO,1,2) = '.t') then
            BEGIN
            REFITEM = '';
            TOTAL = 0;
            END
        factcant = NULL;
        SELECT FIRST 1 UNAR_FACCAN FROM unidad_articulo WHERE ARTI_COD = :articulo INTO :factcant;
        if (factcant IS NULL) then
            factcant = 1;
        if ((factcant = 1) or (factcant = 0)) then
            BEGIN
            ALTERNATIVAS = 0;
            PRINCIPALES = (CANT * FACTOR);
            END
        ELSE
            BEGIN
            ALTERNATIVAS = FLOOR(CANT * factor / factcant);
            PRINCIPALES = (CANT * FACTOR) - (alternativas * factcant);
            END
        SUSPEND;
        END
    END
  ELSE
    BEGIN
    FOR SELECT D.ARTI_COD, DVDE_CODBAR, SUBSTR(DVDE_DESC,1,60), DVDE_CANT, DVDE_UNIDAD, BODE_COD, DVDE_LOTE, DVDE_PRUNIT, DVDE_DTOPORC, DVDE_DTOMONTO, DVDE_IVAPORC, DVDE_IVAMONTO, DVDE_CONSUMO, DVDE_TOTAL, DVDE_REFERENCIA,
        GRUP_COD, SUBG_COD, MARC_COD, ARTI_PESO, ARTI_ANCHO, ARTI_ALTO, ARTI_LARGO, TAIV_COD, DVDE_OBS, DVDE_FACTOR
        FROM DEVOLUCIONES_VENTAS_DETALLE D, ARTICULO A
        WHERE D.ARTI_COD = A.ARTI_COD AND D.DEVT_ID = :ID
        ORDER BY DVDE_ITEM
        INTO :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :BODITEM, :LOTE, :PRUNIT, :DTOITPORC, :DTOITMONTO, :IVAPORC, :IVAITMONTO, :CONSUMO, :TOTAL, :REFITEM,
        :GRUPO, :SUBGRUPO, :MARCA, :PESO, :ANCHO, :ALTO, :LARGO, :TARIFA, :obsitem, :FACTOR
        DO
        BEGIN
        if (ARTICULO = CODBAR) then
            SELECT FIRST 1 COBA_COD FROM barras_articulo WHERE ARTI_COD = :articulo INTO :CODBAR;
        SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :GRUPO INTO NOMGRUPO;
        SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :MARCA INTO NOMMARCA;
        SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :SUBGRUPO AND GRUP_COD = :GRUPO INTO :NOMSUBG;
        ITEM = ITEM + 1;
        if (ICOINC = 'SI') then
            SUBTOTIT = TOTAL - IVAITMONTO;
        else
            SUBTOTIT = TOTAL - IVAITMONTO - CONSUMO;
        PRNETO = PRUNIT - DTOITMONTO;
        if (PESO IS NULL) then
            PESO = 0;
        PESO = PESO / 1000 * CANT * FACTOR;
        PESOTOT = PESOTOT + PESO;
        if (IMPTOS = 'S') then
            if (cant <> 0) then
                prnetosiniva = PRUNIT - DTOITMONTO - ((IVAITMONTO+CONSUMO) / CANT);
            else
                prnetosiniva = PRUNIT - DTOITMONTO;
        ELSE
            prnetosiniva = PRUNIT - DTOITMONTO;
        TOTCONSUMO = TOTCONSUMO + CONSUMO;
        if ((REFITEM <> '.t') or (REFITEM IS NULL)) then
            BEGIN
            /* NO SUME LOS ENSAMBLES */
            if (IVAPORC = 0) then
                SUMAEX = SUMAEX + TOTAL;
            if (TARIFA = 1) then
                BEGIN
                SUMA1 = SUMA1 + TOTAL - IVAITMONTO;
                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;
            END
        if (substr(ARTICULO,1,2) = '.t') then
            BEGIN
            REFITEM = '';
            TOTAL = 0;
            END
        factcant = NULL;
        SELECT FIRST 1 UNAR_FACCAN FROM unidad_articulo WHERE ARTI_COD = :articulo INTO :factcant;
        if (factcant IS NULL) then
            factcant = 1;
        if ((factcant = 1) or (factcant = 0)) then
            BEGIN
            ALTERNATIVAS = 0;
            PRINCIPALES = (CANT * FACTOR);
            END
        ELSE
            BEGIN
            ALTERNATIVAS = FLOOR(CANT * factor / factcant);
            PRINCIPALES = (CANT * FACTOR) - (alternativas * factcant);
            END
        SUSPEND;
        END
    END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure IMPR_PEDIDO (
    ID integer)
returns (
    PREF varchar(4),
    NUMERO varchar(6),
    FECHA date,
    VALIDEZ integer,
    NIT varchar(20),
    NOMTERCERO varchar(60),
    VENDEDOR integer,
    NOMVENDEDOR varchar(60),
    PUNTOVTA integer,
    NOMPUNTOVTA varchar(30),
    COTIZACION varchar(30),
    SUBTOTAL numeric(18,2),
    DTOPORC numeric(9,2),
    DTOMONTO numeric(18,2),
    ADICIONAL numeric(18,2),
    IVAMONTO numeric(18,2),
    EXTRA numeric(18,2),
    TOTALFAC numeric(18,2),
    OBS blob sub_type 1 segment size 80,
    ITEM integer,
    ARTICULO varchar(15),
    CODBAR varchar(15),
    ARTIDES varchar(60),
    BODEGA varchar(2),
    CANT numeric(18,4),
    UNIDAD varchar(8),
    FACTOR numeric(18,4),
    LISTAPR integer,
    REFITEM varchar(60),
    PRUNIT numeric(18,2),
    DTOITPORC numeric(9,2),
    DTOITMONTO numeric(18,2),
    PRNETO numeric(18,2),
    PRNETOSINIVA numeric(18,2),
    DTOIT1 numeric(9,2),
    DTOIT2 numeric(9,2),
    DTOIT3 numeric(9,2),
    IVAPORC numeric(9,2),
    IVAITMONTO numeric(18,2),
    CONSUMO numeric(18,2),
    SUBTOTIT numeric(18,2),
    TOTAL numeric(18,2),
    PESOTOT numeric(18,2),
    CODIGOCL varchar(20),
    ZONACOD varchar(2),
    ZONANOM varchar(60),
    DV char(1),
    DIRECCION varchar(60),
    CIUDAD varchar(40),
    TELEFONO varchar(40),
    CONTACTO varchar(60),
    FAX varchar(25),
    CEL varchar(25),
    GRUPO varchar(2),
    NOMGRUPO varchar(30),
    SUBGRUPO varchar(3),
    NOMSUBG varchar(30),
    MARCA varchar(3),
    NOMMARCA varchar(30),
    PESO numeric(9,4),
    ANCHO numeric(18,4),
    ALTO numeric(18,4),
    LARGO numeric(18,4),
    SUMA1 numeric(18,2),
    SUMA2 numeric(18,2),
    SUMA3 numeric(18,2),
    IVA1 numeric(18,2),
    IVA2 numeric(18,2),
    IVA3 numeric(18,2),
    SUMAEX numeric(18,2),
    SUMAGR numeric(18,2),
    DTOIT1M numeric(18,2),
    DTOIT2M numeric(18,2),
    DTOIT3M numeric(18,2),
    OBSITEM blob sub_type 1 segment size 80,
    ALTERNATIVAS numeric(18,4),
    PRINCIPALES numeric(18,4))
AS
DECLARE VARIABLE IMPTOS CHAR(1);
DECLARE VARIABLE TARIFA INTEGER;
declare variable ORDENCOD CHAR(8);
declare variable SUCUR VARCHAR(10);
declare variable ICOINC CHAR(2);
declare variable DTOITM1 NUMERIC(18,2);
declare variable DTOITM2 NUMERIC(18,2);
declare variable DTOITM3 NUMERIC(18,2);
declare variable FACTCANT NUMERIC(18,4);
BEGIN
execute procedure lee_configuracion('FACTURACION', 'ARTICULOS', 'IMPOCONSUMO INCLUIDO EN EL PRECIO BASE DE VENTA ANTES DE IVA') returning_values (icoinc);
SELECT F.PREF_PRE, PEDI_NUMERO, PEDI_FECHA, PEDI_VALIDEZ, F.TERC_NIT, PEDI_NOMTERC, F.VEND_COD, VEND_NOMBRE, F.PTVT_ID, PTVT_NOM, PEDI_COTIZACI,
    PEDI_IVAINC, PEDI_DTOPOR, PEDI_DTOMONTO, PEDI_ADICIONAL, PEDI_IVAMONTO, PEDI_EXTRA, PEDI_TOTAL,
    TERC_CONTACTO, TERC_FAX, TERC_DV, TERC_CEL, PEDI_OBS, PEDI_SUCURSAL, PEDI_DTOIT1, PEDI_DTOIT2, PEDI_DTOIT3
    FROM PEDIDOS F, VENDEDORES V, PUNTO_VENTA P, TERCEROS T
    WHERE F.VEND_COD = V.VEND_COD AND F.PTVT_ID = P.PTVT_ID AND F.TERC_NIT = T.TERC_NIT AND F.PEDI_ID = :ID
    into :PREF, :NUMERO, :FECHA, :VALIDEZ, :NIT, :NOMTERCERO, :VENDEDOR, :NOMVENDEDOR, :PUNTOVTA, :NOMPUNTOVTA, :COTIZACION,
    :IMPTOS, :DTOPORC, :DTOMONTO, :ADICIONAL, :IVAMONTO, :EXTRA, :TOTALFAC,
    :CONTACTO, :FAX, :DV, :CEL, :OBS, :SUCUR, :dtoit1m, :dtoit2m, :dtoit3m;
SUBTOTAL = TOTALFAC - EXTRA - IVAMONTO - ADICIONAL + DTOMONTO;

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

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure IMPR_REMISION (
    ID integer)
returns (
    PREF varchar(4),
    NUMERO varchar(6),
    FECHA date,
    NIT varchar(20),
    NOMTERCERO varchar(60),
    VENDEDOR integer,
    NOMVENDEDOR varchar(60),
    PUNTOVTA integer,
    NOMPUNTOVTA varchar(30),
    CODBODEGA varchar(2),
    NOMBODEGA varchar(30),
    COTIZACION varchar(30),
    PEDIDO varchar(30),
    FACTURA varchar(30),
    SUBTOTAL numeric(18,2),
    IVAMONTO numeric(18,2),
    TOTALFAC numeric(18,2),
    DESPACHO varchar(255),
    TRANSPORTADOR varchar(60),
    OBS blob sub_type 1 segment size 80,
    ITEM integer,
    ARTICULO varchar(15),
    CODBAR varchar(15),
    ARTIDES varchar(60),
    CANT numeric(18,4),
    LOTE varchar(15),
    VLOTE date,
    UNIDAD varchar(8),
    FACTOR numeric(18,4),
    CAJAS numeric(18,4),
    DEVUELTO numeric(18,4),
    CONSUMIDO numeric(18,4),
    LISTAPR integer,
    REFITEM varchar(60),
    BODITEM varchar(2),
    STAND varchar(20),
    PRUNIT numeric(18,2),
    DTOITPORC numeric(9,2),
    DTOITMONTO numeric(18,2),
    PRNETOSINIVA numeric(18,2),
    PRNETO numeric(18,2),
    IVAPORC numeric(9,2),
    IVAITMONTO numeric(18,2),
    CONSUMO numeric(18,2),
    SUBTOTIT numeric(18,2),
    TOTAL numeric(18,2),
    CODIGOCL varchar(20),
    ZONACOD varchar(2),
    ZONANOM varchar(60),
    DV char(1),
    DIRECCION varchar(60),
    CIUDAD varchar(40),
    TELEFONO varchar(40),
    CONTACTO varchar(60),
    FAX varchar(25),
    CEL varchar(25),
    GRUPO varchar(2),
    NOMGRUPO varchar(30),
    SUBGRUPO varchar(3),
    NOMSUBG varchar(30),
    MARCA varchar(3),
    NOMMARCA varchar(30),
    PESO numeric(9,4),
    ANCHO numeric(18,4),
    ALTO numeric(18,4),
    LARGO numeric(18,4),
    SUMA1 numeric(18,2),
    SUMA2 numeric(18,2),
    SUMA3 numeric(18,2),
    IVA1 numeric(18,2),
    IVA2 numeric(18,2),
    IVA3 numeric(18,2),
    SUMAEX numeric(18,2),
    SUMAGR numeric(18,2),
    TOTCAJAS numeric(18,2),
    OBSITEM blob sub_type 1 segment size 80,
    ALTERNATIVAS numeric(18,4),
    PRINCIPALES numeric(18,4))
AS
DECLARE VARIABLE IMPTOS CHAR(1);
DECLARE VARIABLE TARIFA INTEGER;
declare variable ORDENCOD CHAR(8);
declare variable SUCUR VARCHAR(10);
declare variable ICOINC CHAR(2);
declare variable FACTCANT NUMERIC(18,4);
BEGIN
execute procedure lee_configuracion('FACTURACION', 'ARTICULOS', 'IMPOCONSUMO INCLUIDO EN EL PRECIO BASE DE VENTA ANTES DE IVA') returning_values (icoinc);
EXECUTE PROCEDURE lee_configuracion ('FACTURACION','DOCUMENTOS','ORDENAR ITEMS POR CODIGO DE ARTICULO') returning_values (:ORDENCOD);
SELECT F.PREF_PRE, REVT_NUMERO, REVT_FECHA, F.BODE_COD, BODE_NOM, F.TERC_NIT, REVT_NOMTERC, F.VEND_COD, VEND_NOMBRE, F.PTVT_ID, PTVT_NOM,
    REVT_COTIZACI, REVT_PEDIDO, REVT_FACTURA, REVT_IVAINC,
    REVT_IVAMONTO, REVT_TOTAL, REVT_DESPACHO, REVT_TRANSP,
    TERC_CONTACTO, TERC_FAX, TERC_DV, TERC_CEL, REVT_OBS, REVT_SUCURSAL
    FROM REMISIONES_VENTA F, BODEGA B, VENDEDORES V, PUNTO_VENTA P, TERCEROS T
    WHERE F.BODE_COD = B.BODE_COD AND F.VEND_COD = V.VEND_COD AND F.PTVT_ID = P.PTVT_ID AND F.TERC_NIT = T.TERC_NIT AND F.REVT_ID = :ID
    into :PREF, :NUMERO, :FECHA, :CODBODEGA, :NOMBODEGA, :NIT, :NOMTERCERO, :VENDEDOR, :NOMVENDEDOR, :PUNTOVTA, :NOMPUNTOVTA,
    :COTIZACION, :PEDIDO, :FACTURA, :IMPTOS,
    :IVAMONTO, :TOTALFAC, :DESPACHO, :transportador, 
    :CONTACTO, :FAX, :DV, :CEL, :OBS, :SUCUR;
SUBTOTAL = TOTALFAC - IVAMONTO;

SELECT CLIE_COD, C.ZONA_COD, ZONA_NOM
    FROM CLIENTES C, ZONAS Z
    WHERE TERC_NIT = :NIT AND C.ZONA_COD = Z.ZONA_COD
    INTO :CODIGOCL, :ZONACOD, :ZONANOM;
SELECT CLSU_DIR, CLSU_CIUDAD, CLSU_TEL FROM CLIENTE_SUCURSALES WHERE TERC_NIT = :NIT AND CLCU_COD = :SUCUR
    INTO :DIRECCION, :CIUDAD, :TELEFONO;
    
SUMAEX = 0;
SUMA1 = 0;
SUMA2 = 0;
SUMA3 = 0;
IVA1 = 0;
IVA2 = 0;
IVA3 = 0;
ITEM = 0;
totcajas = 0;
if (ORDENCOD = 'SI') then
    BEGIN
    FOR SELECT D.ARTI_COD, RVDE_CODBAR, SUBSTR(RVDE_DESC,1,60), RVDE_CANT, RVDE_UNIDAD, BODE_COD, RVDE_LOTE, LIPR_COD, RVDE_PRUNIT, RVDE_DTOPORC, RVDE_DTOMONTO, RVDE_IVAPORC, RVDE_IVAMONTO, RVDE_CONSUMO, RVDE_TOTAL, RVDE_REFERENCIA,
        GRUP_COD, SUBG_COD, MARC_COD, ARTI_PESO, ARTI_ANCHO, ARTI_ALTO, ARTI_LARGO, TAIV_COD, RVDE_DEVUELTO, RVDE_OBS, RVDE_CAJAS, RVDE_FACTOR
        FROM REMISIONES_VENTA_DETALLE D, ARTICULO A
        WHERE D.ARTI_COD = A.ARTI_COD AND D.REVT_ID = :ID
        ORDER BY RVDE_CODBAR
        INTO :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :BODITEM, :LOTE, :LISTAPR, :PRUNIT, :DTOITPORC, :DTOITMONTO, :IVAPORC, :IVAITMONTO, :CONSUMO, :TOTAL, :refitem,
            :GRUPO, :SUBGRUPO, :MARCA, :PESO, :ANCHO, :ALTO, :LARGO, :TARIFA, :DEVUELTO, :obsitem, :CAJAS, :FACTOR
        DO
        BEGIN
        if (ARTICULO = CODBAR) then
            SELECT FIRST 1 COBA_COD FROM barras_articulo WHERE ARTI_COD = :articulo INTO :CODBAR;
        SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :GRUPO INTO NOMGRUPO;
        SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :MARCA INTO NOMMARCA;
        SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :SUBGRUPO AND GRUP_COD = :GRUPO INTO :NOMSUBG;
        SELECT LOTE_VENCE FROM LOTES WHERE LOTE_NRO = :lote AND ARTI_COD = :ARTICULO AND BODE_COD = :boditem INTO :vlote;
        if (ICOINC = 'SI') then
            SUBTOTIT = TOTAL - IVAITMONTO;
        else
            SUBTOTIT = TOTAL - IVAITMONTO - CONSUMO;
        CONSUMIDO = cant * factor - devuelto;
        ITEM = ITEM + 1;
        PRNETO = PRUNIT - DTOITMONTO;
        if (PESO IS NULL) then
            PESO = 0;
        PESO = PESO / 1000 * CANT * FACTOR;
        if (IMPTOS = 'S') then
            if (cant <> 0) then
                prnetosiniva = PRUNIT - DTOITMONTO - ((IVAITMONTO+CONSUMO) / CANT);
            else
                prnetosiniva = PRUNIT - DTOITMONTO;
        ELSE
            prnetosiniva = PRUNIT - DTOITMONTO;
        if (IVAPORC = 0) then
            SUMAEX = SUMAEX + TOTAL;
        if (TARIFA = 1) then
            BEGIN
            SUMA1 = SUMA1 + TOTAL - IVAITMONTO;
            IVA1 = IVA1 + IVAITMONTO;
            END
        if (TARIFA = 2) then
            BEGIN
            SUMA2 = SUMA2 + TOTAL - IVAITMONTO;
            IVA2 = IVA2 + IVAITMONTO;
            END
        if (TARIFA = 3) then
            BEGIN
            SUMA3 = SUMA3 + TOTAL - IVAITMONTO;
            IVA3 = IVA3 + IVAITMONTO;
            END
        SUMAGR = SUMA1 + SUMA2 + SUMA3;

        totcajas = totcajas + cajas;
        SELECT STAND_COD FROM STANDS WHERE ARTI_COD = :ARTICULO AND STAND_BODEGA = :boditem INTO :stand;
        factcant = NULL;
        SELECT FIRST 1 UNAR_FACCAN FROM unidad_articulo WHERE ARTI_COD = :articulo INTO :factcant;
        if (factcant IS NULL) then
            factcant = 1;
        if ((factcant = 1) or (factcant = 0)) then
            BEGIN
            ALTERNATIVAS = 0;
            PRINCIPALES = (CANT * FACTOR);
            END
        ELSE
            BEGIN
            ALTERNATIVAS = FLOOR(CANT * factor / factcant);
            PRINCIPALES = (CANT * FACTOR) - (alternativas * factcant);
            END
        SUSPEND;
        END
    END
ELSE
  if (ORDENCOD = 'UNIDAD') then
    BEGIN
    FOR SELECT D.ARTI_COD, RVDE_CODBAR, SUBSTR(RVDE_DESC,1,60), RVDE_CANT, RVDE_UNIDAD, BODE_COD, RVDE_LOTE, LIPR_COD, RVDE_PRUNIT, RVDE_DTOPORC, RVDE_DTOMONTO, RVDE_IVAPORC, RVDE_IVAMONTO, RVDE_CONSUMO, RVDE_TOTAL, RVDE_REFERENCIA,
        GRUP_COD, SUBG_COD, MARC_COD, ARTI_PESO, ARTI_ANCHO, ARTI_ALTO, ARTI_LARGO, TAIV_COD, RVDE_DEVUELTO, RVDE_OBS, RVDE_CAJAS, RVDE_FACTOR
        FROM REMISIONES_VENTA_DETALLE D, ARTICULO A
        WHERE D.ARTI_COD = A.ARTI_COD AND D.REVT_ID = :ID
        ORDER BY RVDE_CODBAR
        INTO :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :BODITEM, :LOTE, :LISTAPR, :PRUNIT, :DTOITPORC, :DTOITMONTO, :IVAPORC, :IVAITMONTO, :CONSUMO, :TOTAL, :refitem,
            :GRUPO, :SUBGRUPO, :MARCA, :PESO, :ANCHO, :ALTO, :LARGO, :TARIFA, :DEVUELTO, :obsitem, :CAJAS, :FACTOR
        DO
        BEGIN
        if (ARTICULO = CODBAR) then
            SELECT FIRST 1 COBA_COD FROM barras_articulo WHERE ARTI_COD = :articulo INTO :CODBAR;
        SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :GRUPO INTO NOMGRUPO;
        SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :MARCA INTO NOMMARCA;
        SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :SUBGRUPO AND GRUP_COD = :GRUPO INTO :NOMSUBG;
        SELECT LOTE_VENCE FROM LOTES WHERE LOTE_NRO = :lote AND ARTI_COD = :ARTICULO AND BODE_COD = :boditem INTO :vlote;
        if (ICOINC = 'SI') then
            SUBTOTIT = TOTAL - IVAITMONTO;
        else
            SUBTOTIT = TOTAL - IVAITMONTO - CONSUMO;
        CONSUMIDO = cant * factor - devuelto;
        ITEM = ITEM + 1;
        PRNETO = PRUNIT - DTOITMONTO;
        if (PESO IS NULL) then
            PESO = 0;
        PESO = PESO / 1000 * CANT * FACTOR;
        if (IMPTOS = 'S') then
            if (cant <> 0) then
                prnetosiniva = PRUNIT - DTOITMONTO - ((IVAITMONTO+CONSUMO) / CANT);
            else
                prnetosiniva = PRUNIT - DTOITMONTO;
        ELSE
            prnetosiniva = PRUNIT - DTOITMONTO;
        if (IVAPORC = 0) then
            SUMAEX = SUMAEX + TOTAL;
        if (TARIFA = 1) then
            BEGIN
            SUMA1 = SUMA1 + TOTAL - IVAITMONTO;
            IVA1 = IVA1 + IVAITMONTO;
            END
        if (TARIFA = 2) then
            BEGIN
            SUMA2 = SUMA2 + TOTAL - IVAITMONTO;
            IVA2 = IVA2 + IVAITMONTO;
            END
        if (TARIFA = 3) then
            BEGIN
            SUMA3 = SUMA3 + TOTAL - IVAITMONTO;
            IVA3 = IVA3 + IVAITMONTO;
            END
        SUMAGR = SUMA1 + SUMA2 + SUMA3;

        totcajas = totcajas + cajas;
        SELECT STAND_COD FROM STANDS WHERE ARTI_COD = :ARTICULO AND STAND_BODEGA = :boditem INTO :stand;
        factcant = NULL;
        SELECT FIRST 1 UNAR_FACCAN FROM unidad_articulo WHERE ARTI_COD = :articulo INTO :factcant;
        if (factcant IS NULL) then
            factcant = 1;
        if ((factcant = 1) or (factcant = 0)) then
            BEGIN
            ALTERNATIVAS = 0;
            PRINCIPALES = (CANT * FACTOR);
            END
        ELSE
            BEGIN
            ALTERNATIVAS = FLOOR(CANT * factor / factcant);
            PRINCIPALES = (CANT * FACTOR) - (alternativas * factcant);
            END
        SUSPEND;
        END
    END
  ELSE
    BEGIN
    FOR SELECT RVDE_ITEM, D.ARTI_COD, RVDE_CODBAR, SUBSTR(RVDE_DESC,1,60), RVDE_CANT, RVDE_UNIDAD, BODE_COD, RVDE_LOTE, LIPR_COD, RVDE_PRUNIT, RVDE_DTOPORC, RVDE_DTOMONTO, RVDE_IVAPORC, RVDE_IVAMONTO, RVDE_CONSUMO, RVDE_TOTAL, RVDE_REFERENCIA,
        GRUP_COD, SUBG_COD, MARC_COD, ARTI_PESO, ARTI_ANCHO, ARTI_ALTO, ARTI_LARGO, TAIV_COD, RVDE_DEVUELTO, RVDE_OBS, RVDE_CAJAS, RVDE_FACTOR
        FROM REMISIONES_VENTA_DETALLE D, ARTICULO A
        WHERE D.ARTI_COD = A.ARTI_COD AND D.REVT_ID = :ID
        ORDER BY RVDE_ITEM
        INTO :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :BODITEM, :LOTE, :LISTAPR, :PRUNIT, :DTOITPORC, :DTOITMONTO, :IVAPORC, :IVAITMONTO, :CONSUMO, :TOTAL, :refitem,
            :GRUPO, :SUBGRUPO, :MARCA, :PESO, :ANCHO, :ALTO, :LARGO, :TARIFA, :DEVUELTO, :obsitem, :CAJAS, :FACTOR
        DO
        BEGIN
        SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :GRUPO INTO NOMGRUPO;
        SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :MARCA INTO NOMMARCA;
        SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :SUBGRUPO AND GRUP_COD = :GRUPO INTO :NOMSUBG;
        SELECT LOTE_VENCE FROM LOTES WHERE LOTE_NRO = :lote AND ARTI_COD = :ARTICULO AND BODE_COD = :boditem INTO :vlote;
        if (ICOINC = 'SI') then
            SUBTOTIT = TOTAL - IVAITMONTO;
        else
            SUBTOTIT = TOTAL - IVAITMONTO - CONSUMO;
        CONSUMIDO = cant * factor - devuelto;
        ITEM = ITEM + 1;
        PRNETO = PRUNIT - DTOITMONTO;
        if (PESO IS NULL) then
            PESO = 0;
        PESO = PESO / 1000 * CANT * FACTOR;
        if (IMPTOS = 'S') then
            if (cant <> 0) then
                prnetosiniva = PRUNIT - DTOITMONTO - ((IVAITMONTO+CONSUMO) / CANT);
            else
                prnetosiniva = PRUNIT - DTOITMONTO;
        ELSE
            prnetosiniva = PRUNIT - DTOITMONTO;
        if (IVAPORC = 0) then
            SUMAEX = SUMAEX + TOTAL;
        if (TARIFA = 1) then
            BEGIN
            SUMA1 = SUMA1 + TOTAL - IVAITMONTO;
            IVA1 = IVA1 + IVAITMONTO;
            END
        if (TARIFA = 2) then
            BEGIN
            SUMA2 = SUMA2 + TOTAL - IVAITMONTO;
            IVA2 = IVA2 + IVAITMONTO;
            END
        if (TARIFA = 3) then
            BEGIN
            SUMA3 = SUMA3 + TOTAL - IVAITMONTO;
            IVA3 = IVA3 + IVAITMONTO;
            END
        SUMAGR = SUMA1 + SUMA2 + SUMA3;
        totcajas = totcajas + cajas;
        SELECT STAND_COD FROM STANDS WHERE ARTI_COD = :ARTICULO AND STAND_BODEGA = :boditem INTO :stand;
        factcant = NULL;
        SELECT FIRST 1 UNAR_FACCAN FROM unidad_articulo WHERE ARTI_COD = :articulo INTO :factcant;
        if (factcant IS NULL) then
            factcant = 1;
        if ((factcant = 1) or (factcant = 0)) then
            BEGIN
            ALTERNATIVAS = 0;
            PRINCIPALES = (CANT * FACTOR);
            END
        ELSE
            BEGIN
            ALTERNATIVAS = FLOOR(CANT * factor / factcant);
            PRINCIPALES = (CANT * FACTOR) - (alternativas * factcant);
            END
        SUSPEND;
        END
    END
END
^

SET TERM ; ^


/* 20090904 */
/* CAMBIO DE CODIGO DE ARTICULO */
SET TERM ^ ;

CREATE OR ALTER TRIGGER SALIDAS_DETALLE_AU FOR SALIDAS_DETALLE
ACTIVE AFTER UPDATE POSITION 0
AS
declare variable fec date;
declare variable CONC VARCHAR(60);
declare variable factor numeric(18,4);
declare variable Pref varchar(4);
declare variable Num varchar(6);
declare variable Nit varchar(20);
BEGIN
if ((old.arti_cod <> new.arti_cod) or (old.sade_cant <> new.sade_cant) or (old.sade_unidad <> new.sade_unidad) or (old.sade_lote <> new.sade_lote) or
    (old.sade_anulado <> new.sade_anulado) or (old.sade_transmit <> new.sade_transmit)) then
  begin
  /* Anule el anterior */
  if ((old.sali_id <> 0) and (old.sade_anulado = 'N')) then
    begin
    delete from movimiento_articulo where (mvar_tipodoc = 12) and (mvar_idref = old.sali_id) and (mvar_item = old.sade_item);
    END
  /* Registre el nuevo */
  if ((new.sali_id <> 0) and (new.sade_anulado = 'N')) then
    BEGIN
    select sali_fecha, sali_conc, pref_pre, sali_numero, terc_nit from salidas where sali_id = new.sali_id into :fec, :conc, :Pref, :Num, :Nit;
    execute procedure factor_unidad_cant(new.arti_cod, new.sade_unidad) returning_values(factor);
    INSERT INTO MOVIMIENTO_ARTICULO
        (ARTI_COD, MVAR_CONS, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM, TERC_NIT)
        VALUES(NEW.ARTI_COD, GEN_ID(ID_MOVARTI,1), NEW.BODE_COD, :FEC, 12, NEW.sali_id,
        :CONC, :factor * new.sade_cant, 0, 'N', new.sade_lote, :Pref, :Num, new.sade_item, :Nit);
    END
  end
end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER TRASFERENCIAS_DETALLE_AU FOR TRASFERENCIAS_DETALLE
ACTIVE AFTER UPDATE POSITION 0
AS
declare variable fec date;
declare variable CONC VARCHAR(60);
declare variable factor numeric(18,4);
declare variable bodori varchar(2);
declare variable boddes varchar(2);
declare variable Pref varchar(4);
declare variable Num varchar(6);
declare variable ORIGEN VARCHAR(2);
declare variable NIT varchar(20);
declare variable fecaux date;
BEGIN
if ((old.arti_cod <> new.arti_cod) or (old.tras_cant <> new.tras_cant) or (old.tras_unidad <> new.tras_unidad) or (old.tras_lote <> new.tras_lote) or
    (old.tras_anulado <> new.tras_anulado) or (old.tras_transmit <> new.tras_transmit) or (old.tras_confirma <> new.tras_confirma)) then
  begin
  /* Anule el anterior */
  if ((old.tran_id <> 0) and (old.tras_anulado = 'N')) then
    begin
    delete from movimiento_articulo where (mvar_tipodoc = 13) and (mvar_idref = old.tran_id) and (mvar_item = old.tras_item);
    END
  /* Registre el nuevo */
  if ((new.tran_id <> 0) and (new.tras_anulado = 'N')) then
    BEGIN
    select tran_fecha, tran_conc, BODE_COD, TRAN_BODDES, Pref_pre, tran_numero, terc_nit
        from trasferencias where tran_id = new.tran_id into :fec, :conc, :bodori, :boddes, :Pref, :Num, :Nit;
    execute procedure factor_unidad_cant(new.arti_cod, new.tras_unidad) returning_values(factor);
    EXECUTE PROCEDURE LEE_CONFIGURACION('INVENTARIO', 'TRASLADOS', 'AFECTAR AMBAS BODEGAS AL CONFIRMAR ENTREGA') returning_values(ORIGEN);
    if ((ORIGEN = 'NO') or (new.tras_confirma = 'S'))  then
        INSERT INTO MOVIMIENTO_ARTICULO
            (ARTI_COD, MVAR_CONS, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM)
            VALUES(NEW.ARTI_COD, GEN_ID(ID_MOVARTI,1), :bodori, :FEC, 13, NEW.tran_id,
            :CONC, :factor * new.tras_cant, 0, 'N', new.tras_lote, :Pref, :Num, new.tras_item);
    if (new.tras_confirma = 'S') then
        INSERT INTO MOVIMIENTO_ARTICULO
        (ARTI_COD, MVAR_CONS, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM)
        VALUES(NEW.ARTI_COD, GEN_ID(ID_MOVARTI,1), :boddes, :FEC, 13, NEW.tran_id,
        :CONC, :factor * new.tras_cant, 0, 'S', new.tras_lotedes, :Pref, :Num, new.tras_item);
    /* ACTUALICE EL COSTO POR PROVEEDOR */
    if (:NIT <> '') then
        BEGIN
        SELECT PVAR_FECHA FROM PROVEEDOR_ARTICULO
            WHERE TERC_NIT = :Nit AND ARTI_COD = NEW.ARTI_COD
            INTO :FECAUX;
        if (FECAUX IS NULL) then
            INSERT INTO PROVEEDOR_ARTICULO (TERC_NIT, ARTI_COD, PVAR_COSTO, PVAR_FECHA, PVAR_COD,PVAR_DES)
                VALUES (:Nit, NEW.ARTI_COD, (new.tras_costo / new.tras_factor), :fec, :NIT,NEW.tras_desc);
        else
            UPDATE PROVEEDOR_ARTICULO
                SET PVAR_COSTO = NEW.tras_costo, PVAR_FECHA = :fec
                WHERE ARTI_COD = NEW.ARTI_COD AND TERC_NIT = :Nit;
        END
    END
  end
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER ENSAMBLES_DETALLE_AU FOR ENSAMBLES_DETALLE
ACTIVE AFTER UPDATE POSITION 0
AS
declare variable fec date;
declare variable CONC VARCHAR(60);
declare variable Pref varchar(4);
declare variable Num varchar(6);
declare variable factor numeric(18,4);
declare variable CANT NUMERIC(18, 2);
declare variable CANTOT CHAR(2);
BEGIN
if ((old.arti_cod <> new.arti_cod) or (old.esde_cant <> new.esde_cant) or (old.esde_unidad <> new.esde_unidad) or (old.esde_lote <> new.esde_lote) or
    (old.esde_anulado <> new.esde_anulado) or (old.esde_transmit <> new.esde_transmit)) then
  begin
  if ((old.ensa_id <> 0) and (old.esde_anulado = 'N')) then
    DELETE FROM MOVIMIENTO_ARTICULO WHERE (mvar_tipodoc = 15) and (mvar_idref = new.ensa_id) and (mvar_item = old.esde_item);
  /* Registre el nuevo */
  if ((new.ensa_id <> 0) and (new.esde_anulado = 'N')) then
    BEGIN
    EXECUTE PROCEDURE LEE_CONFIGURACION('INVENTARIO', 'ENSAMBLES', 'FORMACIONES CON CANTIDADES TOTALES') returning_values (:CANTOT);
    select ensa_fecha, ensa_conc, pref_pre, ensa_numero, ensa_cant * ensa_factor from ensambles where ensa_id = new.ensa_id into :fec, :conc, :Pref, :Num, :CANT;
    execute procedure factor_unidad_cant(new.arti_cod, new.esde_unidad) returning_values(factor);
    if (CANTOT <> 'SI') then
        CANT = CANT * factor * new.esde_cant;
    ELSE
        CANT = factor * new.esde_cant;
    INSERT INTO MOVIMIENTO_ARTICULO
        (ARTI_COD, MVAR_CONS, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM)
        VALUES(NEW.ARTI_COD, GEN_ID(ID_MOVARTI,1), NEW.BODE_COD, :FEC, 15, NEW.ensa_id,
        :CONC, :CANT, 0, 'N', new.esde_lote, :Pref, :Num, new.esde_item);
    END
  end
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure CAMBIO_CODIGO_ARTICULO (
    CODANT VARCHAR(20),
    CODNUE VARCHAR(20))
as
begin
if (not EXISTS(SELECT ARTI_COD FROM ARTICULO WHERE ARTI_COD = :CODNUE)) then
    BEGIN
    INSERT INTO ARTICULO (ARTI_COD,GRUP_COD,SUBG_COD,MARC_COD,ARTI_DES,ARTI_DESVAR,ARTI_TIPO,ARTI_EXIST,ARTI_FECHA,
        ARTI_UNIDAD,ARTI_PRECIO,ARTI_CONSUMO,ARTI_IMPOTRO,ARTI_PESO,ARTI_ANCHO,ARTI_ALTO,ARTI_LARGO,ARTI_OBS,ARTI_FOTO,
        ARTI_MAX,ARTI_MIN,ARTI_DIAS,ESAR_COD,ARTI_USUARIO,TAIV_COD,ARTI_CLASE,ARTI_DIANALIS,ARTI_DESCORTA,ARTI_PRODCANT)
        SELECT :codnue,GRUP_COD,SUBG_COD,MARC_COD,ARTI_DES,ARTI_DESVAR,ARTI_TIPO,ARTI_EXIST,ARTI_FECHA,
        ARTI_UNIDAD,ARTI_PRECIO,ARTI_CONSUMO,ARTI_IMPOTRO,ARTI_PESO,ARTI_ANCHO,ARTI_ALTO,ARTI_LARGO,ARTI_OBS,ARTI_FOTO,
        ARTI_MAX,ARTI_MIN,ARTI_DIAS,ESAR_COD,ARTI_USUARIO,TAIV_COD,ARTI_CLASE,ARTI_DIANALIS,ARTI_DESCORTA,ARTI_PRODCANT
        FROM ARTICULO WHERE ARTI_COD = :codant;
    INSERT INTO contabil_articulo (ARTI_COD, COAR_CTAINV, COAR_CTAIVAC, COAR_CTAIVAV, COAR_CTACONS, COAR_CTAVNT, COAR_CTACOS,
        COAR_CTACOMP, COAR_CTADEV, COAR_CTARTFTE, COAR_CTARTICA, COAR_CTARTFTEV, COAR_CTARTICAV, COAR_RTFTE, COAR_RTBASE)
        SELECT :codnue, COAR_CTAINV, COAR_CTAIVAC, COAR_CTAIVAV, COAR_CTACONS, COAR_CTAVNT, COAR_CTACOS,
        COAR_CTACOMP, COAR_CTADEV, COAR_CTARTFTE, COAR_CTARTICA, COAR_CTARTFTEV, COAR_CTARTICAV, COAR_RTFTE, COAR_RTBASE
        FROM contabil_articulo WHERE ARTI_COD = :codant;
    INSERT INTO articulo_alertas (ARTI_COD, ARTI_ITEM, ARAL_USUARIO, ARAL_FECHAINI, ARAL_FECHAFIN, ARAL_MENSAJE)
        SELECT :codnue, ARTI_ITEM, ARAL_USUARIO, ARAL_FECHAINI, ARAL_FECHAFIN, ARAL_MENSAJE FROM articulo_alertas WHERE ARTI_COD = :codant;
    INSERT INTO unidad_articulo (ARTI_COD, UNAR_UNIDAD, UNAR_FACCAN, UNAR_FACPRE, UNAR_ACTIVA)
        SELECT :codnue, UNAR_UNIDAD, UNAR_FACCAN, UNAR_FACPRE, UNAR_ACTIVA FROM unidad_articulo WHERE ARTI_COD = :codant;
    INSERT INTO barras_articulo (ARTI_COD, COBA_COD, COBA_DES, COBA_UNIDAD, COBA_ACTIVO)
        SELECT :codnue, COBA_COD, COBA_DES, COBA_UNIDAD, COBA_ACTIVO FROM barras_articulo WHERE ARTI_COD = :codant;
    INSERT INTO precios_articulo (ARTI_COD, LIPR_COD, PRAR_FIJO, PRAR_MARGEN, PRAR_UTIL, PRAR_AUTO, PRAR_CONSUMO, PRAR_COMI, PRAR_COMIMONTO, PRAR_CANTMIN, PRAR_DTO1, PRAR_DTO2)
        SELECT :codnue, LIPR_COD, PRAR_FIJO, PRAR_MARGEN, PRAR_UTIL, PRAR_AUTO, PRAR_CONSUMO, PRAR_COMI, PRAR_COMIMONTO, PRAR_CANTMIN, PRAR_DTO1, PRAR_DTO2
        FROM precios_articulo WHERE ARTI_COD = :codant;
    INSERT INTO articulos_producto (ARTI_COD, ARPR_ITEM, ARPR_CANT, ARPR_UNIDAD, ARPR_CODBAR, ARPR_COMP)
        SELECT :codnue, ARPR_ITEM, ARPR_CANT, ARPR_UNIDAD, ARPR_CODBAR, ARPR_COMP FROM articulos_producto WHERE ARTI_COD = :codant;
    END

UPDATE proveedor_articulo SET ARTI_COD = :codnue where arti_cod = :codant;
UPDATE articulos_producto SET ARPR_COMP = :codnue where ARPR_COMP = :codant;
UPDATE entradas_detalle SET ARTI_COD = :codnue where arti_cod = :codant;
UPDATE salidas_detalle SET ARTI_COD = :codnue where arti_cod = :codant;
UPDATE trasferencias_detalle SET ARTI_COD = :codnue where arti_cod = :codant;
UPDATE ajustes_detalle SET ARTI_COD = :codnue where arti_cod = :codant;
UPDATE ensambles_detalle SET ARTI_COD = :codnue where arti_cod = :codant;
UPDATE desensambles_detalle SET ARTI_COD = :codnue where arti_cod = :codant;
UPDATE reservas_detalle SET ARTI_COD = :codnue where arti_cod = :codant;
UPDATE ordeninventario_detalle SET ARTI_COD = :codnue where arti_cod = :codant;
UPDATE facturas_compras_detalle SET ARTI_COD = :codnue where arti_cod = :codant;
UPDATE remision_proveedor_det SET ARTI_COD = :codnue where arti_cod = :codant;
UPDATE ordenes_compra_detalle SET ARTI_COD = :codnue where arti_cod = :codant;
UPDATE cotizaciones_proveedor_det SET ARTI_COD = :codnue where arti_cod = :codant;
UPDATE devoluciones_compras_det SET ARTI_COD = :codnue where arti_cod = :codant;
UPDATE facturas_detalle SET ARTI_COD = :codnue where arti_cod = :codant;
UPDATE remisiones_venta_detalle SET ARTI_COD = :codnue where arti_cod = :codant;
UPDATE pedidos_detalle SET ARTI_COD = :codnue where arti_cod = :codant;
UPDATE cotizaciones_detalle SET ARTI_COD = :codnue where arti_cod = :codant;
UPDATE devoluciones_ventas_detalle SET ARTI_COD = :codnue where arti_cod = :codant;
UPDATE notas_credito_proveedor SET ARTI_COD = :codnue where arti_cod = :codant;
UPDATE notas_debito_proveedor SET ARTI_COD = :codnue where arti_cod = :codant;
end
^

SET TERM ; ^



/* 20090904 */
/* crm: eventos automaticos en ventas, prioridad en compromisos */

ALTER TABLE CRM_COMPROMISOS
ADD CRCO_PRIORIDAD CHAR(1);

update crm_compromisos set crco_prioridad = 'N' where crco_prioridad is null;

INSERT INTO CRM_TIPOEVENTO (CRTE_ID, CRTE_NOMBRE) VALUES (901, 'Factura de venta');
INSERT INTO CRM_TIPOEVENTO (CRTE_ID, CRTE_NOMBRE) VALUES (902, 'Remisión a cliente');
INSERT INTO CRM_TIPOEVENTO (CRTE_ID, CRTE_NOMBRE) VALUES (903, 'Pedido de cliente');
INSERT INTO CRM_TIPOEVENTO (CRTE_ID, CRTE_NOMBRE) VALUES (904, 'Cotización');
INSERT INTO CRM_TIPOEVENTO (CRTE_ID, CRTE_NOMBRE) VALUES (905, 'Devolución venta');
commit work;

ALTER TABLE CRM_EVENTOS
ADD CREV_ORIGEN T_ID;

CREATE INDEX CRM_EVENTOS_IDX2
ON CRM_EVENTOS (CREV_ORIGEN);
CREATE INDEX CRM_EVENTOS_IDX1
ON CRM_EVENTOS (CREV_TIPO);

INSERT INTO CONFIGURACION (CONF_MODULO, CONF_CATEGORIA, CONF_PROPIEDAD, CONF_VALOR, CONF_POSIBLES, CONF_AYUDA) VALUES ('CRM', 'EVENTOS', 'GRABAR EVENTOS AUTOMATICAMENTE DESDE DOCUMENTOS DE VENTAS', 'NO', 'SI,NO', 'SI: Graba un evento por cada cotización, pedido, factura, remisión y devolución que se grabe con el cliente');

SET TERM ^ ;

CREATE OR ALTER procedure BUSCAR_COMPROMISOS
returns (
    ID integer,
    FECHA date,
    HORA time,
    NIT varchar(20),
    NOMBRE varchar(60),
    ASESOR varchar(60),
    TIPO varchar(60),
    OBS varchar(255),
    OK char(1),
    HORAVAISO time,
    PRIORIDAD char(1),
    CONTACTO varchar(60))
AS
declare variable CONT integer;
begin
  for select C.CRCO_ID, C.CRCO_FECHA, C.CRCO_HORA, T.CRTE_NOMBRE, C.CRCO_OBS, C.CRCO_NIT, C.CRCO_CUMPLIDO, A.cras_nombre,
             C.CRCO_HORAAVISO, C.CRCO_CONTACTO, C.CRCO_PRIORIDAD
      from CRM_COMPROMISOS C, CRM_TIPOEVENTO T, CRM_ASESOR A
      where C.CRCO_TIPO = T.CRTE_ID and C.crco_asesor = A.cras_id AND
            C.CRCO_ANULADO = 'N'
      order by C.CRCO_FECHA desc, C.CRCO_HORA desc
      into :ID, :FECHA, :HORA, :TIPO, :OBS, :NIT, :OK, :asesor, HORAVAISO, :CONT, :PRIORIDAD
  do
  begin
      CONTACTO = '';
      NOMBRE = '';
      select CRCL_NOM
      from CRM_CLIENTES
      where CRCL_NIT = :NIT
      into :NOMBRE;
      select CRCO_NOMBRE
      from CRM_CONTACTOS
      where CRCL_NIT = :NIT and
            CRCO_ID = :CONT
      into :CONTACTO;
      suspend;
  end
end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure BUSQUEDA_COMPROMISOS (
    ASESOR integer,
    FEC date,
    CUMPLIDOS char(1))
returns (
    ID integer,
    FECHA date,
    HORA time,
    NIT varchar(20),
    NOMBRE varchar(60),
    TIPO varchar(60),
    OBS varchar(255),
    OK char(1),
    HORAVAISO time,
    CONTACTO varchar(60),
    PRIORIDAD char(1))
AS
declare variable CONT integer;
begin
  for select C.CRCO_ID, C.CRCO_FECHA, C.CRCO_HORA, T.CRTE_NOMBRE, C.CRCO_OBS, C.CRCO_NIT, C.CRCO_CUMPLIDO,
             C.CRCO_HORAAVISO, C.CRCO_CONTACTO, C.CRCO_PRIORIDAD
      from CRM_COMPROMISOS C, CRM_TIPOEVENTO T
      where C.CRCO_TIPO = T.CRTE_ID and
            C.CRCO_ASESOR = :ASESOR and
            C.CRCO_ANULADO = 'N' and
            C.CRCO_FECHA <= :FEC
      order by C.CRCO_FECHA, C.CRCO_HORA
      into :ID, :FECHA, :HORA, :TIPO, :OBS, :NIT, :OK, :HORAVAISO, :CONT, :PRIORIDAD
  do
  begin
    if ((CUMPLIDOS = 'S') or (OK = 'N')) then
    begin
      CONTACTO = '';
      NOMBRE = '';
      select CRCL_NOM
      from CRM_CLIENTES
      where CRCL_NIT = :NIT
      into :NOMBRE;
      select CRCO_NOMBRE
      from CRM_CONTACTOS
      where CRCL_NIT = :NIT and
            CRCO_ID = :CONT
      into :CONTACTO;
      suspend;
    end
  end
end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure BUSQUEDA_COMPROMISOS_CLI (
    CLIENTE varchar(20),
    CUMPLIDOS char(1))
returns (
    ID integer,
    FECHA date,
    HORA time,
    ASESOR integer,
    NOMBRE varchar(60),
    TIPO varchar(60),
    OBS varchar(255),
    OK char(1),
    HORAVAISO time,
    PRIORIDAD char(1),
    CONTACTO varchar(60))
AS
declare variable CONT INTEGER;
begin
FOR SELECT C.crco_id, C.crco_fecha, C.crco_hora, T.crte_nombre, C.crco_obs, C.crco_cumplido, C.crco_horaaviso, C.crco_contacto, crco_asesor, crco_prioridad
    FROM crm_compromisos C, CRM_TIPOEVENTO T
    WHERE C.crco_tipo = T.crte_id AND C.crco_nit = :cliente AND C.crco_anulado = 'N'
    ORDER BY C.crco_fecha DESC, C.crco_hora DESC
    INTO :id, :fecha, :hora, :tipo, :obs, :ok, :horavaiso, :cont, :asesor, :prioridad
    DO
    BEGIN
    if ((CUMPLIDOS = 'S') or (OK = 'N'))  then
        BEGIN
        contacto = '';
        NOMBRE = '';
        SELECT CRAS_NOMBRE FROM crm_asesor WHERE CRAS_ID = :asesor INTO :nombre;
        SELECT CRCO_NOMBRE FROM crm_contactos WHERE CRCL_NIT = :cliente AND CRCO_ID = :cont INTO :contacto;
        suspend;
        END
    END
end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER COTIZACIONES_AI FOR COTIZACIONES
ACTIVE AFTER INSERT POSITION 0
as
declare variable crmeven char(2);
begin
IF (NEW.COTI_ID <> 0) THEN
    begin
    /* actualice el estado */
    update crm_clientes set crcl_estado = 3 where crcl_nit = new.terc_nit;
    execute procedure lee_configuracion ('CRM', 'EVENTOS', 'GRABAR EVENTOS AUTOMATICAMENTE DESDE DOCUMENTOS DE VENTAS') returning_values (:crmeven);
    if (crmeven = 'SI') then
        begin
        insert into crm_eventos (CREV_TIPO, CREV_ORIGEN, CREV_FECHA, CREV_HORA, CREV_MOTIVO, CREV_ASESOR, CREV_VALOR, CREV_EXPLICA, CREV_OBS, CREV_ACTIVIDAD, CRCL_NIT, CREV_ANULADO)
            VALUES (904, new.coti_id, new.coti_fecha, cast('now' as time), 6, new.vend_cod, new.coti_total, 'Cotización No. ' || new.pref_pre || new.coti_numero, new.coti_obs, 0, new.terc_nit, new.coti_anulado);
        end
    INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
        VALUES (USER, 35, NEW.coti_id, 'I', NEW.pref_pre || NEW.coti_numero);
    end
end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER COTIZACIONES_AU FOR COTIZACIONES
ACTIVE AFTER UPDATE POSITION 0
as
begin
/* SI SE ANULO ANULE EL DETALLE */
if (OLD.coti_anulado <> NEW.coti_anulado) then
    UPDATE cotizaciones_detalle SET CTDE_ANULADO = NEW.coti_anulado
        WHERE COTI_ID = NEW.coti_id;
if (OLD.coti_transmit <> NEW.coti_transmit) then
    UPDATE cotizaciones_detalle SET CTDE_TRANSMIT = NEW.coti_transmit
        WHERE COTI_ID = NEW.coti_id;

if (NEW.coti_anulado = 'S') then
    begin
    delete from crm_eventos where crev_tipo = 904 and crev_origen = old.coti_id;
    INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
        VALUES (USER, 35, NEW.coti_id, 'A', NEW.pref_pre || NEW.coti_numero);
    end
ELSE
    INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
        VALUES (USER, 35, NEW.coti_id, 'U', NEW.pref_pre || NEW.coti_numero);
end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER COTIZACIONES_AD FOR COTIZACIONES
ACTIVE AFTER DELETE POSITION 1
as
begin
delete from crm_eventos where crev_tipo = 904 and crev_origen = old.coti_id;
INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
    VALUES (USER, 35, OLD.coti_id, 'D', OLD.pref_pre || OLD.coti_numero);
end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER PEDIDOS_AI FOR PEDIDOS
ACTIVE AFTER INSERT POSITION 0
as
declare variable crmeven char(2);
begin
IF (NEW.PEDI_ID <> 0) THEN
    begin
    /* actualice el estado */
    update crm_clientes set crcl_estado = 4 where crcl_nit = new.terc_nit;
    execute procedure lee_configuracion ('CRM', 'EVENTOS', 'GRABAR EVENTOS AUTOMATICAMENTE DESDE DOCUMENTOS DE VENTAS') returning_values (:crmeven);
    if (crmeven = 'SI') then
        begin
        insert into crm_eventos (CREV_TIPO, CREV_ORIGEN, CREV_FECHA, CREV_HORA, CREV_MOTIVO, CREV_ASESOR, CREV_VALOR, CREV_EXPLICA, CREV_OBS, CREV_ACTIVIDAD, CRCL_NIT, CREV_ANULADO)
            VALUES (903, new.pedi_id, new.pedi_fecha, cast('now' as time), 6, new.vend_cod, new.pedi_total, 'Pedido No. ' || new.pref_pre || new.pedi_numero, new.pedi_obs, 0, new.terc_nit, new.pedi_anulado);
        end
    INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
        VALUES (USER, 34, NEW.pedi_id, 'I', NEW.pref_pre || NEW.pedi_numero);
    end
end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER PEDIDOS_AU FOR PEDIDOS
ACTIVE AFTER UPDATE POSITION 0
as
begin
if (NEW.pedi_anulado = 'S') then
    BEGIN
    delete from crm_eventos where crev_tipo = 903 and crev_origen = old.pedi_id;
    INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
        VALUES (USER, 34, NEW.pedi_id, 'A', NEW.pref_pre || NEW.pedi_numero);
    if (OLD.PEDI_CONSOLIDA <> 0) then
        UPDATE consolidado_faltantes SET COFA_OK = 'N' WHERE COFA_ID = OLD.pedi_consolida;
    if (NEW.pedi_anulado <> OLD.pedi_anulado) then
        UPDATE pedidos_detalle SET PEDE_ANULADO = NEW.pedi_anulado WHERE PEDI_ID = NEW.PEDI_ID;
    END
ELSE
    BEGIN
    /* SI CAMBIA LA CONSOLIDACION ACTUALICE LOS DETALLES */
    if (NEW.pedi_consolida <> OLD.pedi_consolida) then
        UPDATE pedidos_detalle SET PEDE_TRANSMIT = 'N' WHERE PEDI_ID = NEW.PEDI_ID;

    /* ACTUALICE LOS ANULADOS Y TRASMITIDOS */
    if (NEW.pedi_anulado <> OLD.pedi_anulado) then
        UPDATE pedidos_detalle SET PEDE_ANULADO = NEW.pedi_anulado WHERE PEDI_ID = NEW.PEDI_ID;
    if (NEW.pedi_TRANSMIT <> OLD.pedi_transmit) then
        UPDATE pedidos_detalle SET PEDE_TRANSMIT = NEW.pedi_transmit WHERE PEDI_ID = NEW.PEDI_ID;
    INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
        VALUES (USER, 34, NEW.pedi_id, 'U', NEW.pref_pre || NEW.pedi_numero);
    END
end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER PEDIDOS_AD FOR PEDIDOS
ACTIVE AFTER DELETE POSITION 0
as
begin
/* ACTUALICE LA CONSOLIDACION */
if ((OLD.PEDI_ID <> 0) AND (OLD.PEDI_CONSOLIDA <> 0)) then
    BEGIN
    delete from crm_eventos where crev_tipo = 903 and crev_origen = old.pedi_id;
    UPDATE consolidado_faltantes SET COFA_OK = 'N' WHERE COFA_ID = OLD.pedi_consolida;
    INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
        VALUES (USER, 34, OLD.pedi_id, 'D', OLD.pref_pre || OLD.pedi_numero);
    END
end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER FACTURAS_AI FOR FACTURAS
ACTIVE AFTER INSERT POSITION 0
AS
declare variable CONC VARCHAR(60);
declare variable PEDAUTO CHAR(2);
declare variable DIAS INTEGER;
declare variable NUMERO VARCHAR(6);
declare variable AUTOM CHAR(1);
declare variable NUMROWS INTEGER;
declare variable ESPOS CHAR(1);
declare variable crmeven CHAR(2);
BEGIN
if ((NEW.FACT_ID <> 0) and (new.fact_anulado = 'N')) then
    BEGIN
    /* actualice el prefijo si se pasaron de una hoja impresa */
    execute procedure lee_configuracion('FACTURACION','FACTURAS','INCREMENTAR NUMERACION AUTOMATICAMENTE EN FACTURAS DE VARIAS HOJAS') returning_values (:pedauto);
    SELECT MIN(AUTO_ESPOS) FROM AUTORIZACIONES WHERE PREF_PRE = NEW.pref_pre INTO :ESPOS;
    if (ESPOS = 'S') then
        PEDAUTO = 'NO';
    if (PEDAUTO = 'SI') then
        BEGIN
        select FORM_NROITEMS from FORMATOS where tido_cod = 31 and pref_pre = new.pref_pre into :dias;
        select count(*) from facturas_detalle where fact_id = new.fact_id into :numrows;
        if (numrows > dias) then
            begin
            SELECT PREF_ACTUAL, PREF_AUTO FROM PREFIJOS WHERE TIDO_COD = 31 AND PREF_PRE = NEW.PREF_PRE INTO :NUMERO, :AUTOM;
            if (AUTOM = 'S' or NUMERO = NEW.fact_numero) then
                BEGIN
                NUMROWS = CAST(NUMERO AS INTEGER) + DIV(numrows,dias);
                NUMERO = CAST(NUMROWS AS CHAR(6));
                update prefijos set pref_actual = :NUMERO WHERE TIDO_COD = 31 AND PREF_PRE = NEW.PREF_PRE;
                END
            end
        END
    /* Registre el nuevo saldo del documento */
    INSERT INTO SALDOS_DOC_CARTERA (SDCA_TIPOREF, SDCA_IDREF, SDCA_FECHA, TERC_NIT, SDCA_RTFTE, SDCA_RTIVA, SDCA_RTICA, SDCA_ABONO, SDCA_ABRTFTE, SDCA_ABRTIVA, SDCA_ABRTICA, SDCA_DEBITO, SDCA_MONTO, SDCA_TRM)
        VALUES (31, NEW.FACT_ID, NEW.FACT_fecha, NEW.terc_nit, NEW.FACT_rtftemonto, NEW.FACT_rtivamonto, NEW.FACT_rticamonto, 0, 0, 0, 0, 'S', NEW.FACT_TOTAL, NEW.fact_trm);
    /* Registre el movimiento del cliente */
    if (STRLEN(NEW.FACT_NOMCLIENTE) > 42) then
        CONC = 'FV No.' || NEW.PREF_PRE || NEW.FACT_NUMERO || '-' || SUBSTR(NEW.FACT_NOMCLIENTE, 1, 42);
    ELSE
        CONC = 'FV No.' || NEW.PREF_PRE || NEW.FACT_NUMERO || '-' || NEW.FACT_NOMCLIENTE;
    INSERT INTO MOVIMIENTO_CLIENTES (MVCL_ID, TERC_NIT, MVCL_TIPOREF, MVCL_IDREF, MVCL_FECHA, MVCL_VENCE, MVCL_CONC, MVCL_MONTO, MVCL_RTEFTE, MVCL_RTEIVA, MVCL_RTEICA, MVCL_DEBITO, MVCL_ABONO, MVCL_PREFREF, MVCL_NUMREF, mvcl_sucursal, COBR_COD, MVCL_TRM)
      VALUES (GEN_ID(ID_MOVCLI, 1), NEW.TERC_NIT, 31, NEW.FACT_ID, NEW.FACT_FECHA, NEW.FACT_VENCE, :CONC, NEW.FACT_TOTAL, NEW.FACT_RTFTEMONTO, NEW.FACT_RTIVAMONTO, NEW.FACT_RTICAMONTO, 'S', 'N', NEW.pref_pre, NEW.FACT_numero, new.fact_sucursal, NEW.cobr_cod, NEW.fact_trm);
    EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION','FACTURAS','GENERAR PEDIDO AUTOMATICAMENTE CON LA FACTURA') RETURNING_VALUES (PEDAUTO);
    if (PEDAUTO = 'SI') then
        BEGIN
        EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION','PEDIDOS','DIAS DE VALIDEZ') RETURNING_VALUES (DIAS);
        INSERT INTO PEDIDOS (PEDI_ID, TERC_NIT, VEND_COD, TIDO_COD, PREF_PRE, PEDI_NUMERO, PEDI_FECHA, PEDI_VALIDEZ, PEDI_DESPACHO, PEDI_OBS, PEDI_IVAINC, PEDI_NOMTERC, PEDI_DTOPOR, PEDI_DTOMONTO, PEDI_ADICIONAL, PEDI_IVAMONTO, PEDI_EXTRA, PEDI_TOTAL, PEDI_ANULADO, PEDI_TRANSMIT, PTVT_ID, PEDI_COTIZACI, PEDI_RTFTEPORC, PEDI_RTFTEMONTO, PEDI_RTIVAPORC, PEDI_RTIVAMONTO, PEDI_RTICAPORC, PEDI_RTICAMONTO, PEDI_SUCURSAL)
            VALUES (GEN_ID(ID_PEDIDO, 1), NEW.TERC_NIT, NEW.VEND_COD, 34, NEW.PREF_PRE, NEW.FACT_NUMERO, NEW.FACT_FECHA, :DIAS, NEW.FACT_DESPACHO, NEW.FACT_OBS, NEW.FACT_IVAINC, NEW.FACT_NOMCLIENTE, NEW.FACT_DTOPOR, NEW.FACT_DTOMONTO, NEW.FACT_ADICIONAL, NEW.FACT_IVAMONTO, NEW.FACT_EXTRA, NEW.FACT_TOTAL, 'N', 'N', NEW.PTVT_ID, NULL, NEW.FACT_RTFTEPOR, NEW.FACT_RTFTEMONTO, NEW.FACT_RTIVAPOR, NEW.FACT_RTIVAMONTO, NEW.FACT_RTICAPOR, NEW.FACT_RTICAMONTO, NEW.fact_sucursal);
        END
    execute procedure lee_configuracion ('CRM', 'EVENTOS', 'GRABAR EVENTOS AUTOMATICAMENTE DESDE DOCUMENTOS DE VENTAS') returning_values (:crmeven);
    if (crmeven = 'SI') then
        begin
        insert into crm_eventos (CREV_TIPO, CREV_ORIGEN, CREV_FECHA, CREV_HORA, CREV_MOTIVO, CREV_ASESOR, CREV_VALOR, CREV_EXPLICA, CREV_OBS, CREV_ACTIVIDAD, CRCL_NIT, CREV_ANULADO)
            VALUES (901, new.fact_id, new.fact_fecha, cast('now' as time), 6, new.vend_cod, new.fact_total, 'Factura No. ' || new.pref_pre || new.fact_numero, new.fact_obs, 0, new.terc_nit, new.fact_anulado);
        end
    INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
        VALUES (USER, 31, NEW.fact_id, 'I', NEW.pref_pre || NEW.fact_numero);
    END
END
^

SET TERM ; ^

SET TERM ^ ;

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

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

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

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

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

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER FACTURAS_AD FOR FACTURAS
ACTIVE AFTER DELETE POSITION 0
AS
declare variable ABONOS INTEGER;
declare variable IDC INTEGER;
declare variable PEDAUTO CHAR(2);
declare variable consec INTEGER;
BEGIN
/* borre la contabilización */
select enco_consec from comprobante_encabezado where enco_tiporef = 31 and enco_idref = old.fact_id INTO :consec;
if (NOT consec is null) then
  delete from comprobante_detalle where enco_consec = :consec;
delete from comprobante_encabezado where enco_tiporef = 31 and enco_idref = old.fact_id;

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

INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
    VALUES (USER, 31, OLD.fact_id, 'D', OLD.pref_pre || OLD.fact_numero);

if ((OLD.fact_id <> 0) AND (OLD.fact_anulado = 'N')) then
    BEGIN
    /* VERIFIQUE QUE NO HAY DEVOLUCIONES */
    SELECT COUNT(*) FROM DEVOLUCIONES_VENTAS WHERE DEVT_FACTID = OLD.fact_id AND DEVT_ANULADO = 'N' INTO :abonos;
    if (abonos > 0) then
        exception documento_devuelto 'La factura ' || old.pref_pre || old.fact_numero || ' tiene devoluciones registradas.';

    /* Verifique si habia abonos a la nota */
    ABONOS = 0;
    select COUNT(*) FROM SALDOS_DOC_CARTERA WHERE SDCA_TIPOREF = 31 AND SDCA_IDREF = OLD.FACT_ID AND SDCA_ABONO <> 0 INTO :ABONOS;
    if (ABONOS = 0) then
        BEGIN
        /* BORRE EL REGISTRO PREVIO */
        delete from saldos_doc_cartera where sdca_tiporef = 31 and sdca_idref = old.fact_id;
        delete from movimiento_CLIENTES where (mvcl_tiporef = 31) and (mvcl_idref = old.fact_id);
        /* borre la contabilizaci¢n */
        select enco_consec from comprobante_encabezado where enco_tiporef = 31 and enco_idref = old.fact_id into :IDC;

        EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION','FACTURAS','GENERAR PEDIDO AUTOMATICAMENTE CON LA FACTURA') RETURNING_VALUES (PEDAUTO);
        if (PEDAUTO = 'SI') then
            BEGIN
            /* INTENTE BORRAR EL PEDIDO DEL MISMO NUMERO */
            DELETE FROM PEDIDOS WHERE PREF_PRE = OLD.pref_pre AND PEDI_NUMERO = OLD.fact_numero;
            END
        /* ACTUALICE LA CONSOLIDACION */
        if ((OLD.FACT_ID <> 0) AND (OLD.FACT_CONSOLIDA <> 0)) then
            UPDATE consolidado_faltantes SET COFA_OK = 'N' WHERE COFA_ID = OLD.fact_consolida;
        END
    else
        exception DOCUMENTO_CON_ABONOS 'La factura ' || old.pref_pre || old.fact_numero || ' tiene abonos registrados.';
    END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER DEVOLUCIONES_VENTAS_AI FOR DEVOLUCIONES_VENTAS
ACTIVE AFTER INSERT POSITION 0
AS
declare variable CONC VARCHAR(60);
declare variable crmeven char(2);
BEGIN
if ((NEW.DEVT_ID <> 0) and (new.devt_anulado = 'N')) then
    BEGIN
    if ((new.devt_remid IS NULL) or (new.devt_remid = 0) ) then
        begin
        /* Registre el nuevo saldo del documento */
        INSERT INTO SALDOS_DOC_CARTERA (SDCA_TIPOREF, SDCA_IDREF, SDCA_FECHA, TERC_NIT, SDCA_RTFTE, SDCA_RTIVA, SDCA_RTICA, SDCA_ABONO, SDCA_ABRTFTE, SDCA_ABRTIVA, SDCA_ABRTICA, SDCA_DEBITO, SDCA_MONTO, SDCA_TRM)
            VALUES (33, NEW.DEVT_ID, NEW.DEVT_fecha, NEW.terc_nit, (NEW.DEVT_rtftemonto*-1), (NEW.DEVT_rtivamonto*-1), (NEW.DEVT_rticamonto*-1), 0, 0, 0, 0, 'N', (NEW.DEVT_TOTAL*-1), new.devt_trm);
        /* Registre el movimiento del cliente */
        CONC = 'DEVOLUCION VENTA No.' || NEW.PREF_PRE || NEW.DEVT_NUMERO || ' EN FACTURA ' || NEW.devt_factura;
        INSERT INTO MOVIMIENTO_CLIENTES (MVCL_ID, TERC_NIT, MVCL_TIPOREF, MVCL_IDREF, MVCL_FECHA, MVCL_VENCE, MVCL_CONC, MVCL_MONTO, MVCL_RTEFTE, MVCL_RTEIVA, MVCL_RTEICA, MVCL_DEBITO, MVCL_ABONO, MVCL_PREFREF, MVCL_NUMREF, MVCL_SUCURSAL, COBR_COD, MVCL_TRM)
          VALUES (GEN_ID(ID_MOVCLI, 1), NEW.TERC_NIT, 33, NEW.DEVT_ID, NEW.DEVT_FECHA, NEW.DEVT_FECHA, :CONC, NEW.DEVT_TOTAL, NEW.DEVT_RTFTEMONTO, NEW.DEVT_RTIVAMONTO, NEW.DEVT_RTICAMONTO, 'N', 'N', NEW.pref_pre, NEW.DEVT_numero, NEW.devt_sucursal, NEW.cobr_cod, new.devt_trm);
        end
    /* ACTUALICE LA CONSOLIDACION */
    if (NEW.DEVT_CONSOLIDA <> 0) then
        UPDATE consolidado_faltantes SET COFA_IDDES = NEW.devt_id, COFA_OK = 'S' WHERE COFA_ID = NEW.devt_consolida;
    execute procedure lee_configuracion ('CRM', 'EVENTOS', 'GRABAR EVENTOS AUTOMATICAMENTE DESDE DOCUMENTOS DE VENTAS') returning_values (:crmeven);
    if (crmeven = 'SI') then
        begin
        insert into crm_eventos (CREV_TIPO, CREV_ORIGEN, CREV_FECHA, CREV_HORA, CREV_MOTIVO, CREV_ASESOR, CREV_VALOR, CREV_EXPLICA, CREV_OBS, CREV_ACTIVIDAD, CRCL_NIT, CREV_ANULADO)
            VALUES (905, new.devt_id, new.devt_fecha, cast('now' as time), 6, new.vend_cod, new.devt_total, 'Devolución No. ' || new.pref_pre || new.devt_numero, new.devt_obs, 0, new.terc_nit, new.devt_anulado);
        end
    INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
        VALUES (USER, 33, NEW.devt_id, 'I', NEW.pref_pre || NEW.devt_numero);
    END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER DEVOLUCIONES_VENTAS_AU FOR DEVOLUCIONES_VENTAS
ACTIVE AFTER UPDATE POSITION 0
AS
declare variable ABONOS integer;
declare variable CONC VARCHAR(60);
declare variable consec INTEGER;
declare variable crmeven char(2);
BEGIN
if (new.devt_anulado = 'S') then
    begin
    select enco_consec from comprobante_encabezado where enco_tiporef = 33 and enco_idref = old.devt_id into :consec;
    if (NOT consec is null) then
      delete from comprobante_detalle where enco_consec = :consec;
    delete from comprobante_encabezado where enco_tiporef = 33 and enco_idref = old.devt_id;
    delete from crm_eventos where crev_tipo = 905 and crev_origen = old.devt_id;

    DELETE FROM puntos_cliente WHERE PTCL_TIPODOC = 33 AND PTCL_IDDOC = OLD.devt_id;

    INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
        VALUES (USER, 33, NEW.devt_id, 'A', NEW.pref_pre || NEW.devt_numero);
    end
if ((old.DEVT_id <> 0) and (old.devt_anulado = 'N')) then
    begin
    if ((old.devt_remid = 0) or (old.devt_remid is null))  then
        begin
        /* Verifique si habia abonos a la nota */
        ABONOS = 0;
        select COUNT(*) FROM SALDOS_DOC_CARTERA WHERE SDCA_TIPOREF = 33 AND SDCA_IDREF = OLD.DEVT_ID AND SDCA_ABONO <> 0 INTO :ABONOS;
        if (ABONOS = 0) then
            BEGIN
            /* BORRE EL REGISTRO PREVIO */
            delete from saldos_doc_cartera where sdca_tiporef = 33 and sdca_idref = old.devt_id;
            delete from movimiento_clientes where (mvcl_tiporef = 33) and (mvcl_idref = old.devt_id);

            /* ACTUALICE LA CONSOLIDACION */
            if (OLD.DEVT_CONSOLIDA <> 0) then
                UPDATE consolidado_faltantes SET COFA_OK = 'N' WHERE COFA_ID = old.devt_consolida;
            END
        else
            exception DOCUMENTO_CON_ABONOS 'La devolución ' || old.pref_pre || old.devt_numero || ' tiene abonos registrados.';
        end
    else
        if (OLD.DEVT_CONSOLIDA <> 0) then
            UPDATE consolidado_faltantes SET COFA_OK = 'N' WHERE COFA_ID = old.devt_consolida;
    END
if ((new.DEVT_id <> 0) and (new.devt_anulado = 'N')) then
    BEGIN
    if ((new.devt_remid = 0) or (new.devt_remid is null))  then
        begin
        /* Registre el nuevo saldo del documento */
        INSERT INTO SALDOS_DOC_CARTERA (SDCA_TIPOREF, SDCA_IDREF, SDCA_FECHA, TERC_NIT, SDCA_RTFTE, SDCA_RTIVA, SDCA_RTICA, SDCA_ABONO, SDCA_ABRTFTE, SDCA_ABRTIVA, SDCA_ABRTICA, SDCA_DEBITO, SDCA_MONTO, SDCA_TRM)
            VALUES (33, NEW.DEVT_ID, NEW.DEVT_fecha, NEW.terc_nit, (NEW.DEVT_rtftemonto*-1), (NEW.DEVT_rtivamonto*-1), (NEW.DEVT_rticamonto*-1), 0, 0, 0, 0, 'N', (NEW.DEVT_TOTAL*-1), NEW.devt_trm);
        /* Registre el movimiento del cliente */
        CONC = 'DEVOLUCION VENTA No.' || NEW.PREF_PRE || NEW.DEVT_NUMERO || ' EN FACTURA ' || NEW.devt_factura;
        INSERT INTO MOVIMIENTO_CLIENTES (MVCL_ID, TERC_NIT, MVCL_TIPOREF, MVCL_IDREF, MVCL_FECHA, MVCL_VENCE, MVCL_CONC, MVCL_MONTO, MVCL_RTEFTE, MVCL_RTEIVA, MVCL_RTEICA, MVCL_DEBITO, MVCL_ABONO, MVCL_PREFREF, MVCL_NUMREF, MVCL_SUCURSAL, COBR_COD, MVCL_TRM)
            VALUES (GEN_ID(ID_MOVCLI, 1), NEW.TERC_NIT, 33, NEW.DEVT_ID, NEW.DEVT_FECHA, NEW.DEVT_FECHA, :CONC, NEW.DEVT_TOTAL, NEW.DEVT_RTFTEMONTO, NEW.DEVT_RTIVAMONTO, NEW.DEVT_RTICAMONTO, 'N', 'N', NEW.pref_pre, NEW.DEVT_numero, NEW.devt_sucursal, NEW.cobr_cod, NEW.devt_trm);
        /* ACTUALICE LA CONSOLIDACION */
        if (NEW.DEVT_CONSOLIDA <> 0) then
            UPDATE consolidado_faltantes SET COFA_IDDES = NEW.devt_id, COFA_OK = 'S' WHERE COFA_ID = NEW.devt_consolida;
        end
    INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
        VALUES (USER, 33, NEW.devt_id, 'U', NEW.pref_pre || NEW.devt_numero);
    END
/* si cambio un dato critico actualice el detalle */
if ((OLD.devt_fecha <> NEW.devt_fecha) or
    (OLD.devt_numero <> NEW.devt_numero) or
    (OLD.pref_pre <> NEW.pref_pre) or
    (OLD.devt_factid <> NEW.devt_factid)) then
    UPDATE DEVOLUCIONES_VENTAS_DETALLE
        SET DVDE_TRANSMIT = 'N'
        WHERE DEVT_ID = NEW.DEVT_ID;
/* ACTUALICE EL ANULADO EN LOS DETALLES */
if (OLD.DEVT_anulado <> NEW.DEVT_anulado) then
    UPDATE DEVOLUCIONES_VENTAS_DETALLE
        SET DVDE_ANULADO = NEW.DEVT_anulado
        WHERE DEVT_ID = NEW.DEVT_ID;
if (OLD.devt_transmit <> NEW.devt_transmit) then
    UPDATE DEVOLUCIONES_VENTAS_DETALLE
        SET DVDE_TRANSMIT = NEW.devt_transmit
        WHERE DEVT_ID = NEW.DEVT_ID;
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER DEVOLUCIONES_VENTAS_AD FOR DEVOLUCIONES_VENTAS
ACTIVE AFTER DELETE POSITION 0
as
declare variable ABONOS INTEGER;
declare variable consec INTEGER;
declare variable crmeven char(2);
begin
select enco_consec from comprobante_encabezado where enco_tiporef = 33 and enco_idref = old.devt_id into :consec;
if (NOT consec is null) then
 delete from comprobante_detalle where enco_consec = :consec;
delete from comprobante_encabezado where enco_tiporef = 33 and enco_idref = old.devt_id;

DELETE FROM puntos_cliente WHERE PTCL_TIPODOC = 33 AND PTCL_IDDOC = OLD.devt_id;
delete from crm_eventos where crev_tipo = 905 and crev_origen = old.devt_id;

INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
    VALUES (USER, 33, OLD.devt_id, 'D', OLD.pref_pre || OLD.devt_numero);
if ((OLD.DEVT_anulado = 'N') AND (OLD.DEVT_ID <> 0)) then
    begin
    /* Verifique si habia abonos */
    ABONOS = 0;
    select COUNT(*) FROM SALDOS_DOC_CARTERA WHERE SDCA_TIPOREF = 33 AND SDCA_IDREF = OLD.DEVT_ID AND SDCA_ABONO <> 0 INTO :ABONOS;
    if (ABONOS = 0) then
        BEGIN
        /* BORRE EL REGISTRO PREVIO */
        delete from saldos_doc_cartera where sdca_tiporef = 33 and sdca_idref = old.devt_id;
        delete from movimiento_clientes where (mvcl_tiporef = 33) and (mvcl_idref = old.devt_id);
        END
    else
        exception DOCUMENTO_CON_ABONOS 'La devolución ' || old.pref_pre || old.devt_numero || ' tiene abonos registrados.';
    END
end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER REMISIONES_VENTA_AI FOR REMISIONES_VENTA
ACTIVE AFTER INSERT POSITION 0
as
declare variable crmeven char(2);
begin
IF (NEW.REVT_ID <> 0) THEN
  BEGIN
  execute procedure lee_configuracion ('CRM', 'EVENTOS', 'GRABAR EVENTOS AUTOMATICAMENTE DESDE DOCUMENTOS DE VENTAS') returning_values (:crmeven);
  if (crmeven = 'SI') then
    begin
    insert into crm_eventos (CREV_TIPO, CREV_ORIGEN, CREV_FECHA, CREV_HORA, CREV_MOTIVO, CREV_ASESOR, CREV_VALOR, CREV_EXPLICA, CREV_OBS, CREV_ACTIVIDAD, CRCL_NIT, CREV_ANULADO)
        VALUES (902, new.revt_id, new.revt_fecha, cast('now' as time), 6, new.vend_cod, new.revt_total, 'Remisión cliente No. ' || new.pref_pre || new.revt_numero, new.revt_obs, 0, new.terc_nit, new.revt_anulado);
    end
  INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
    VALUES (USER, 32, NEW.revt_id, 'I', NEW.pref_pre || NEW.revt_numero);
  END
end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER REMISIONES_VENTA_AU FOR REMISIONES_VENTA
ACTIVE AFTER UPDATE POSITION 0
AS
declare variable consec INTEGER;
declare variable crmeven char(2);
BEGIN
/* borre la contabilizacion */
if (new.revt_anulado = 'S') then
    begin
    select enco_consec from comprobante_encabezado where enco_tiporef = 32 and enco_idref = old.revt_id into :consec;
    if (NOT consec is null) then
      delete from comprobante_detalle where enco_consec = :consec;
    delete from comprobante_encabezado where enco_tiporef = 32 and enco_idref = old.revt_id;
    delete from crm_eventos where crev_tipo = 902 and crev_origen = old.revt_id;
    INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
        VALUES (USER, 32, NEW.revt_id, 'A', NEW.pref_pre || NEW.revt_numero);
    if (OLD.REVT_CONSOLIDA <> 0) then
        UPDATE consolidado_faltantes SET COFA_OK = 'N' WHERE COFA_ID = OLD.revt_consolida;
    end
ELSE
    INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
        VALUES (USER, 32, NEW.revt_id, 'U', NEW.pref_pre || NEW.revt_numero);

/* si cambio fecha o numero */
if ((OLD.pref_pre <> NEW.pref_pre) or
    (OLD.revt_numero <> NEW.revt_numero) or
    (OLD.revt_fecha <> NEW.revt_fecha)) then
    UPDATE REMISIONES_VENTA_DETALLE SET RVDE_TRANSMIT = 'N'
        WHERE REVT_ID = NEW.REVT_ID;

/* ACTUALICE EL ANULADO EN LOS DETALLES */
if (OLD.revt_anulado <> NEW.revt_anulado) then
    UPDATE REMISIONES_VENTA_DETALLE SET RVDE_ANULADO = NEW.revt_anulado
        WHERE REVT_ID = NEW.REVT_ID;
if (OLD.revt_transmit <> NEW.revt_transmit) then
    UPDATE REMISIONES_VENTA_DETALLE SET RVDE_TRANSMIT = NEW.revt_transmit
        WHERE REVT_ID = NEW.REVT_ID;
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER REMISIONES_VENTA_AD FOR REMISIONES_VENTA
ACTIVE AFTER DELETE POSITION 0
as
declare variable consec INTEGER;
declare variable crmeven char(2);
begin
select enco_consec from comprobante_encabezado where enco_tiporef = 32 and enco_idref = old.revt_id into :consec;
if (NOT consec is null) then
  delete from comprobante_detalle where enco_consec = :consec;
delete from comprobante_encabezado where enco_tiporef = 32 and enco_idref = old.revt_id;
delete from crm_eventos where crev_tipo = 902 and crev_origen = old.revt_id;
INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
    VALUES (USER, 32, OLD.revt_id, 'D', OLD.pref_pre || OLD.revt_numero);
if ((OLD.revt_id <> 0) AND (OLD.REVT_CONSOLIDA <> 0)) then
    UPDATE consolidado_faltantes SET COFA_OK = 'N' WHERE COFA_ID = OLD.revt_consolida;
end
^

SET TERM ; ^


/* 20090904c */
/* MAL GMF EN CONSIGNACION DE TARJETAS DIVIDIA POR CIEN Y NO POR MIL */
SET TERM ^ ;

CREATE OR ALTER TRIGGER CONSIGNA_TARJETAS_AI FOR CONSIGNA_TARJETAS
ACTIVE AFTER INSERT POSITION 0
as
declare variable CONC VARCHAR(60);
declare variable GMFPOR NUMERIC(9,2);
declare variable VRGMF NUMERIC(18,2);
begin
if ((new.cotj_id <> 0) AND (NEW.COTJ_ANULADO = 'N')) then
    BEGIN
    INSERT INTO MOVIMIENTO_BANCO
        (MOBA_ID, CUBA_COD, MOBA_TIPODOC, MOBA_PREF, MOBA_NUMERO, MOBA_FECHA, MOBA_CONCEPTO, MOBA_TOTAL, MOBA_DB, MOBA_IDREF, MOBA_TIPOREF)
        VALUES(GEN_ID(ID_MOVBANCO,1), NEW.cuba_cod, 64, NEW.PREF_PRE, NEW.cotj_numero, NEW.cotj_fecha, NEW.cotj_concepto, (NEW.cotj_monto+new.cotj_rtfte+new.cotj_comision+new.cotj_rtiva+NEW.cotj_rtica), 'S', new.cotj_id, 64);
    if (NEW.cotj_rtfte <> 0) then
        BEGIN
        CONC = 'RETEFTE TARJETAS ' || SUBSTRING(NEW.COTJ_CONCEPTO FROM 1 FOR 42);
        INSERT INTO MOVIMIENTO_BANCO
            (MOBA_ID, CUBA_COD, MOBA_TIPODOC, MOBA_PREF, MOBA_NUMERO, MOBA_FECHA, MOBA_CONCEPTO, MOBA_TOTAL, MOBA_DB, MOBA_IDREF, MOBA_TIPOREF)
            VALUES(GEN_ID(ID_MOVBANCO,1), NEW.cuba_cod, 64, NEW.PREF_PRE, NEW.cotj_numero, NEW.cotj_fecha, :CONC, new.cotj_rtfte, 'N', new.cotj_id, 64);
        END
    if (NEW.cotj_rtiva <> 0) then
        BEGIN
        CONC = 'RETEIVA TARJETAS ' || SUBSTRING(NEW.COTJ_CONCEPTO FROM 1 FOR 42);
        INSERT INTO MOVIMIENTO_BANCO
            (MOBA_ID, CUBA_COD, MOBA_TIPODOC, MOBA_PREF, MOBA_NUMERO, MOBA_FECHA, MOBA_CONCEPTO, MOBA_TOTAL, MOBA_DB, MOBA_IDREF, MOBA_TIPOREF)
            VALUES(GEN_ID(ID_MOVBANCO,1), NEW.cuba_cod, 64, NEW.PREF_PRE, NEW.cotj_numero, NEW.cotj_fecha, :CONC, new.cotj_rtiva, 'N', new.cotj_id, 64);
        END
    if (NEW.cotj_rtica <> 0) then
        BEGIN
        CONC = 'RETEICA TARJETAS ' || SUBSTRING(NEW.COTJ_CONCEPTO FROM 1 FOR 42);
        INSERT INTO MOVIMIENTO_BANCO
            (MOBA_ID, CUBA_COD, MOBA_TIPODOC, MOBA_PREF, MOBA_NUMERO, MOBA_FECHA, MOBA_CONCEPTO, MOBA_TOTAL, MOBA_DB, MOBA_IDREF, MOBA_TIPOREF)
            VALUES(GEN_ID(ID_MOVBANCO,1), NEW.cuba_cod, 64, NEW.PREF_PRE, NEW.cotj_numero, NEW.cotj_fecha, :CONC, NEW.cotj_rtica, 'N', new.cotj_id, 64);
        END
    if (NEW.cotj_comision <> 0) then
        BEGIN
        CONC = 'COMISION TARJETAS ' || SUBSTRING(NEW.COTJ_CONCEPTO FROM 1 FOR 42);
        INSERT INTO MOVIMIENTO_BANCO
            (MOBA_ID, CUBA_COD, MOBA_TIPODOC, MOBA_PREF, MOBA_NUMERO, MOBA_FECHA, MOBA_CONCEPTO, MOBA_TOTAL, MOBA_DB, MOBA_IDREF, MOBA_TIPOREF)
            VALUES(GEN_ID(ID_MOVBANCO,1), NEW.cuba_cod, 64, NEW.PREF_PRE, NEW.cotj_numero, NEW.cotj_fecha, :CONC, new.cotj_comision, 'N', new.cotj_id, 64);
        END
    SELECT CUBA_GMFPOR FROM cuentas_banco WHERE CUBA_COD = NEW.cuba_cod INTO :GMFPOR;
    if (GMFPOR <> 0) then
      begin
      conc = 'GMF EN CONSIGNACION TARJETA No. ' || NEW.pref_pre || NEW.cotj_numero;

      EXECUTE procedure REDONDEE((NEW.cotj_comision+NEW.cotj_rtfte+NEW.cotj_rtiva+NEW.cotj_rtica)*:GMFPOR/1000,0) returning_values (:VRGMF);
      INSERT INTO MOVIMIENTO_BANCO
        (MOBA_ID, CUBA_COD, MOBA_TIPODOC, MOBA_PREF, MOBA_NUMERO, MOBA_FECHA, MOBA_CONCEPTO, MOBA_TOTAL, MOBA_DB, MOBA_IDREF, MOBA_TIPOREF)
        VALUES(GEN_ID(ID_MOVBANCO,1), NEW.cuba_cod, 64, NEW.pref_pre, NEW.cotj_numero, NEW.cotj_fecha, :conc, :VRGMF, 'N', new.cotj_id, 64);
      end
    INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
        VALUES (USER, 64, NEW.cotj_id, 'I', NEW.pref_pre || NEW.cotj_numero);
    end
end
^

SET TERM ; ^


SET TERM ^ ;

CREATE OR ALTER TRIGGER CONSIGNA_TARJETAS_AU FOR CONSIGNA_TARJETAS
ACTIVE AFTER UPDATE POSITION 0
as
declare variable consec INTEGER;
declare variable CONC VARCHAR(60);
declare variable GMFPOR NUMERIC(9,2);
declare variable VRGMF NUMERIC(18,2);
begin
if (NEW.cotj_anulado = 'S') then
    BEGIN
    select enco_consec from comprobante_encabezado where enco_tiporef = 64 and enco_idref = old.cotj_id into :consec;
    if (NOT consec is null) then
      delete from comprobante_detalle where enco_consec = :consec;
    delete from comprobante_encabezado where enco_tiporef = 64 and enco_idref = old.cotj_id;
    INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
        VALUES (USER, 64, NEW.cotj_id, 'A', NEW.pref_pre || NEW.cotj_numero);
    END
if ((old.cotj_anulado = 'N') and (old.cotj_id <> 0)) then
    DELETE FROM MOVIMIENTO_BANCO
        WHERE MOBA_TIPODOC = 64 AND MOBA_IDREF = OLD.cotj_id;
if ((new.cotj_id <> 0) AND (NEW.COTJ_ANULADO = 'N')) then
    BEGIN
    INSERT INTO MOVIMIENTO_BANCO
        (MOBA_ID, CUBA_COD, MOBA_TIPODOC, MOBA_PREF, MOBA_NUMERO, MOBA_FECHA, MOBA_CONCEPTO, MOBA_TOTAL, MOBA_DB, MOBA_IDREF, MOBA_TIPOREF)
        VALUES(GEN_ID(ID_MOVBANCO,1), NEW.cuba_cod, 64, NEW.PREF_PRE, NEW.cotj_numero, NEW.cotj_fecha, NEW.cotj_concepto, (NEW.cotj_monto+new.cotj_rtfte+new.cotj_comision+new.cotj_rtiva+NEW.cotj_rtica), 'S', new.cotj_id, 64);
    if (NEW.cotj_rtfte <> 0) then
        BEGIN
        CONC = 'RETEFTE TARJETAS ' || SUBSTRING(NEW.COTJ_CONCEPTO FROM 1 FOR 42);
        INSERT INTO MOVIMIENTO_BANCO
            (MOBA_ID, CUBA_COD, MOBA_TIPODOC, MOBA_PREF, MOBA_NUMERO, MOBA_FECHA, MOBA_CONCEPTO, MOBA_TOTAL, MOBA_DB, MOBA_IDREF, MOBA_TIPOREF)
            VALUES(GEN_ID(ID_MOVBANCO,1), NEW.cuba_cod, 64, NEW.PREF_PRE, NEW.cotj_numero, NEW.cotj_fecha, :CONC, new.cotj_rtfte, 'N', new.cotj_id, 64);
        END
    if (NEW.cotj_rtiva <> 0) then
        BEGIN
        CONC = 'RETEIVA TARJETAS ' || SUBSTRING(NEW.COTJ_CONCEPTO FROM 1 FOR 42);
        INSERT INTO MOVIMIENTO_BANCO
            (MOBA_ID, CUBA_COD, MOBA_TIPODOC, MOBA_PREF, MOBA_NUMERO, MOBA_FECHA, MOBA_CONCEPTO, MOBA_TOTAL, MOBA_DB, MOBA_IDREF, MOBA_TIPOREF)
            VALUES(GEN_ID(ID_MOVBANCO,1), NEW.cuba_cod, 64, NEW.PREF_PRE, NEW.cotj_numero, NEW.cotj_fecha, :CONC, new.cotj_rtiva, 'N', new.cotj_id, 64);
        END
    if (NEW.cotj_rtica <> 0) then
        BEGIN
        CONC = 'RETEICA TARJETAS ' || SUBSTRING(NEW.COTJ_CONCEPTO FROM 1 FOR 42);
        INSERT INTO MOVIMIENTO_BANCO
            (MOBA_ID, CUBA_COD, MOBA_TIPODOC, MOBA_PREF, MOBA_NUMERO, MOBA_FECHA, MOBA_CONCEPTO, MOBA_TOTAL, MOBA_DB, MOBA_IDREF, MOBA_TIPOREF)
            VALUES(GEN_ID(ID_MOVBANCO,1), NEW.cuba_cod, 64, NEW.PREF_PRE, NEW.cotj_numero, NEW.cotj_fecha, :CONC, NEW.cotj_rtica, 'N', new.cotj_id, 64);
        END
    if (NEW.cotj_comision <> 0) then
        BEGIN
        CONC = 'COMISION TARJETAS ' || SUBSTRING(NEW.COTJ_CONCEPTO FROM 1 FOR 42);
        INSERT INTO MOVIMIENTO_BANCO
            (MOBA_ID, CUBA_COD, MOBA_TIPODOC, MOBA_PREF, MOBA_NUMERO, MOBA_FECHA, MOBA_CONCEPTO, MOBA_TOTAL, MOBA_DB, MOBA_IDREF, MOBA_TIPOREF)
            VALUES(GEN_ID(ID_MOVBANCO,1), NEW.cuba_cod, 64, NEW.PREF_PRE, NEW.cotj_numero, NEW.cotj_fecha, :CONC, new.cotj_comision, 'N', new.cotj_id, 64);
        END
    SELECT CUBA_GMFPOR FROM cuentas_banco WHERE CUBA_COD = NEW.cuba_cod INTO :GMFPOR;
    if (GMFPOR <> 0) then
      begin
      conc = 'GMF EN CONSIGNACION TARJETA No. ' || NEW.pref_pre || NEW.cotj_numero;
      EXECUTE procedure REDONDEE((NEW.cotj_comision+NEW.cotj_rtfte+NEW.cotj_rtiva+NEW.cotj_rtica)*:GMFPOR/1000,0) returning_values (:VRGMF);
      INSERT INTO MOVIMIENTO_BANCO
        (MOBA_ID, CUBA_COD, MOBA_TIPODOC, MOBA_PREF, MOBA_NUMERO, MOBA_FECHA, MOBA_CONCEPTO, MOBA_TOTAL, MOBA_DB, MOBA_IDREF, MOBA_TIPOREF)
        VALUES(GEN_ID(ID_MOVBANCO,1), NEW.cuba_cod, 64, NEW.pref_pre, NEW.cotj_numero, NEW.cotj_fecha, :conc, :VRGMF, 'N', new.cotj_id, 64);
      end
    INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
        VALUES (USER, 64, NEW.cotj_id, 'U', NEW.pref_pre || NEW.cotj_numero);
    END
/* SI EL CAMPO QUE CAMBIA ES CRITICO ACTUALICE EL DETALLE */
if ((OLD.cotj_fecha <> NEW.cotj_fecha) OR
    (OLD.pref_pre <> NEW.pref_pre) OR
    (OLD.cotj_numero <> NEW.cotj_numero)) then
    UPDATE consigna_tarjetas_det SET CTJD_TRANSMIT = 'N'
        WHERE COTJ_ID = NEW.cotj_id;
/* ACTUALICE EL ANULADO EN LOS DETALLES */
if (OLD.cotj_anulado <> NEW.cotj_anulado) then
    UPDATE consigna_tarjetas_det SET CTJD_ANULADO = NEW.cotj_anulado
        WHERE COTJ_ID = NEW.cotj_id;
if (OLD.cotj_transmit <> NEW.cotj_transmit) then
    UPDATE consigna_tarjetas_det SET CTJD_TRANSMIT = NEW.cotj_transmit
        WHERE COTJ_ID = NEW.cotj_id;
end
^

SET TERM ; ^


/* 20090905*/
DROP TABLE MENSAJE_DESTINO;
DROP TABLE MENSAJERIA;

CREATE TABLE MENSAJERIA (
    MENS_ID         T_ID NOT NULL /* T_ID = INTEGER */,
    MENS_AUTOR      T_USUARIO /* T_USUARIO = VARCHAR(10) */,
    MENS_MENSAJE    VARCHAR(255),
    MENS_FECHA      DATE,
    MENS_HORA       TIME,
    MENS_NIVEL      INTEGER,
    MENS_DESTINO    T_USUARIO /* T_USUARIO = VARCHAR(10) */,
    MENS_LEIDO      T_BOOLEANO /* T_BOOLEANO = CHAR(1) check (value in ('S','N')) */,
    MENS_FECLEIDO   DATE,
    MENS_HORALEIDO  TIME,
    MENS_RESPUESTA  T_ID /* T_ID = INTEGER */
);

ALTER TABLE MENSAJERIA ADD CONSTRAINT PK_MENSAJERIA PRIMARY KEY (MENS_ID);

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

CREATE SEQUENCE ID_MENSAJE;

SET TERM ^ ;

CREATE OR ALTER TRIGGER MENSAJERIA_BI FOR MENSAJERIA
ACTIVE BEFORE INSERT POSITION 0
as
begin
if ((NEW.mens_id = 0) or (NEW.mens_id IS NULL))  then
    NEW.mens_id = gen_id(id_mensaje, 1);
NEW.mens_autor = USER;
NEW.mens_fecha = CAST ('NOW' AS DATE);
NEW.mens_hora = CAST ('NOW' AS TIME);
NEW.mens_respuesta = 0;
end
^

SET TERM ; ^

SET TERM ^ ;

create trigger MENSAJERIA_BU for MENSAJERIA
active BEFORE UPDATE position 0
as
begin
if (new.mens_leido = 'S') then
    begin
    new.mens_fecleido = cast('now' as date);
    new.mens_horaleido = cast('now' as time);
    end
end
^

SET TERM ; ^


/* 20090907 */
/* traer observaciones y referencia por item de la cot, pedido , rem y factura */

ALTER TABLE CONSOLIDADO_FALTANTES
ADD CODE_OBSIT BLOB SUB_TYPE 1 SEGMENT SIZE 8192;
ALTER TABLE CONSOLIDADO_FALTANTES
ADD CODE_REF T_CONCEPTO;

SET TERM ^ ;

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

SET TERM ; ^

SET TERM ^ ;

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

SET TERM ; ^

SET TERM ^ ;

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

SET TERM ; ^

SET TERM ^ ;

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

^

SET TERM ; ^

SET TERM ^ ;

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

^

SET TERM ; ^

SET TERM ^ ;

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

/* si hay pedido automatico saque una copia de la consolidacion */
EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION', 'FACTURAS', 'GENERAR PEDIDO AUTOMATICAMENTE CON LA FACTURA') returning_values (pedauto);
if (PEDAUTO = 'SI') then
    begin
    IDC = gen_id(id_cons,1);
    for select cefa_item, cefa_idori from consolide_faltantes where cefa_id = new.revt_consolida
        into :item, :idf
        do
        begin
        SELECT PEDI_ID FROM PEDIDOS P, FACTURAS F WHERE P.PREF_PRE = F.pref_pre AND P.pedi_numero = F.fact_numero AND F.fact_id = :IDF INTO :IDP;
        insert into consolide_faltantes (cefa_id, cefa_item, cefa_tipodes, cefa_tipoori, cefa_idori)
            VALUES(:IDC, :item, 32, 34, :IDP);
        end
    EXECUTE PROCEDURE consolide_pendientes (:IDC);
    NEW.lipr_cod = :IDC;
    end
END
^

SET TERM ; ^



/* 20090908 */
/* VALIDAR DESCUENTOS NETOS POR PEDIDO */
SET TERM ^ ;

CREATE OR ALTER procedure DESCUENTOS_PEDIDO (
    ID integer)
returns (
    CODART varchar(20),
    DESCR VARCHAR(60),
    CANT numeric(18,2),
    UNIDAD varchar(8),
    LISTA integer,
    PRLISTA numeric(18,2),
    PRUNIT numeric(18,2),
    DTO numeric(9,2))
AS
begin
FOR SELECT ARTI_COD, PEDE_DESC, PEDE_CANT, PEDE_UNIDAD, PEDE_PRUNIT, LIPR_COD
    FROM pedidos_detalle WHERE PEDI_ID = :ID INTO :codart, :descr, :cant, :unidad, :prunit, :lista
    DO
    BEGIN
    SELECT PRAR_FIJO FROM precios_articulo WHERE ARTI_COD = :codart AND LIPR_COD = :lista INTO :prlista;
    if (prlista <> 0) then
        DTO = (prlista - prunit) * 100 / prlista;
    ELSE
        DTO = 0;
    suspend;
    END
end
^

SET TERM ; ^


GRANT EXECUTE ON PROCEDURE descuentos_pedido TO PUBLIC;

/* 20090908b */
/* RESALTAR EL CAMPO DESPACHAR A EN DOC. DE VENTAS */
INSERT INTO CONFIGURACION (CONF_MODULO, CONF_CATEGORIA, CONF_PROPIEDAD, CONF_VALOR, CONF_POSIBLES, CONF_AYUDA) VALUES ('FACTURACION', 'DOCUMENTOS', 'COLOR DE FONDO PARA EL CAMPO DESPACHAR A', '$00FFFFFF', '$00FFFFFF,$00FFFF80,$0080FFFF,$00FF80FF', 'Indique el color en formato RGB que quiere de fondo en el campo despachar a: en los documentos de venta');
COMMIT WORK;

/* 20090909 */
/* error actualizando el devuelto al anular dev con articulos repetidos */
SET TERM ^ ;

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

SET TERM ; ^


SET TERM ^ ;

CREATE OR ALTER TRIGGER DEVOLUCIONES_VENTAS_DETALLE_AD FOR DEVOLUCIONES_VENTAS_DETALLE
ACTIVE AFTER DELETE POSITION 0
AS
declare variable ID INTEGER;
declare variable ITEM INTEGER;
declare variable CANTAUX NUMERIC(18, 4);
declare variable CANT NUMERIC(18, 4);
declare variable FACTOR NUMERIC(18, 4);
declare variable DEVUELTO NUMERIC(18, 4);
declare variable IDREM INTEGER;
declare variable devrem CHAR(2);
begin
execute procedure lee_configuracion ('FACTURACION', 'DEVOLUCIONES', 'HACER DEVOLUCIONES SOBRE REMISIONES') returning_values (:devrem);
if ((OLD.devt_id <> 0) AND (OLD.dvde_anulado = 'N')) then
    BEGIN
    delete from movimiento_articulo
      where (mvar_tipodoc = 33) and (mvar_idref = old.devt_id) and (mvar_item = old.dvde_item);
  
    /* DESHAGA LO DEVUELTO EN LA FACTURA */
    SELECT DEVT_FACTID FROM DEVOLUCIONES_VENTAS
        WHERE DEVT_ID = OLD.DEVT_ID INTO :ID;
    if (ID <> 0) then
        BEGIN
        CANTAUX = OLD.dvde_cant * OLD.dvde_factor;
        FOR SELECT FADE_CANT, FADE_FACTOR, FADE_DEVUELTO, FADE_ITEM
            FROM FACTURAS_DETALLE
            WHERE FACT_ID = :ID AND ARTI_COD = OLD.ARTI_COD
            INTO :CANT, :FACTOR, :DEVUELTO, :ITEM
            DO
                BEGIN
                if (CANTAUX > 0) then
                  if (CANTAUX > DEVUELTO) then
                    BEGIN
                    UPDATE FACTURAS_DETALLE
                        SET FADE_DEVUELTO = 0
                        WHERE FACT_ID = :ID AND ARTI_COD = OLD.ARTI_COD AND FADE_ITEM = :ITEM;
                    CANTAUX = CANTAUX - DEVUELTO;
                    END
                  ELSE
                    BEGIN
                    UPDATE FACTURAS_DETALLE
                        SET FADE_DEVUELTO = FADE_DEVUELTO - :CANTAUX
                        WHERE FACT_ID = :ID AND ARTI_COD = OLD.ARTI_COD AND FADE_ITEM = :ITEM;
                    CANTAUX = 0;
                    END
                END
        END
    if (devrem = 'SI') then
        begin
        idrem = 0;
        SELECT DEVT_REMID FROM DEVOLUCIONES_VENTAS
            WHERE DEVT_ID = OLD.DEVT_ID INTO :idrem;
        if (idrem <> 0) then
            BEGIN
            CANTAUX = OLD.dvde_cant * OLD.dvde_factor;
            FOR SELECT RVDE_CANT, RVDE_FACTOR, RVDE_DEVUELTO, RVDE_ITEM
                FROM remisiones_venta_detalle
                WHERE REVT_ID = :idrem AND ARTI_COD = OLD.ARTI_COD
                INTO :CANT, :FACTOR, :DEVUELTO, :ITEM
                DO
                BEGIN
                if (CANTAUX > 0) then
                    if (CANTAUX > DEVUELTO) then
                        BEGIN
                        UPDATE remisiones_venta_detalle
                            SET RVDE_DEVUELTO = 0
                            WHERE REVT_ID = :idrem AND ARTI_COD = OLD.ARTI_COD AND RVDE_ITEM = :ITEM;
                        CANTAUX = CANTAUX - DEVUELTO;
                        END
                    ELSE
                        BEGIN
                        UPDATE remisiones_venta_detalle
                            SET RVDE_DEVUELTO = RVDE_DEVUELTO - :CANTAUX
                            WHERE REVT_ID = :idrem AND ARTI_COD = OLD.ARTI_COD AND RVDE_ITEM = :ITEM;
                        CANTAUX = 0;
                        END
                END
            END
        end
    END
END
^

SET TERM ; ^


/* 20090909C */
/* TRAIA PENDIENTES DE CONCILIACION DE SYSplus DE MESES ANTERIOR, DEBE TRAER SOLO LOS DE EXTRACTO, COMPARA CONTRA
   LOS MOVIMIENTOS DE TODA LA VIDA Y ADEMAS AGREGA LOS PENDIENTES DE SYSplus DE TODA LA VIDA Y NO SOLO DEL MES */
SET TERM ^ ;

CREATE OR ALTER procedure CONCILIA_BANCO (
    ID integer)
AS
declare variable fecini date;
declare variable fecfin date;
declare variable item integer;
declare variable db char(1);
declare variable cuenta integer;
declare variable tipodoc integer;
declare variable iddoc integer;
declare variable prefijo varchar(4);
declare variable numero varchar(6);
declare variable fecha date;
declare variable concepto varchar(60);
declare variable monto numeric(18,2);
declare variable CONANT INTEGER;
declare variable CLASE CHAR(1);
begin
select CUBA_COD, COBN_FECINI, COBN_FECFIN FROM conciliacion_encabezado WHERE COBN_ID = :ID INTO :CUENTA, :FECINI, :FECFIN;
SELECT MAX(COBN_ITEM) FROM conciliacion_bancaria WHERE COBN_ID = :ID INTO :item;
/* AGREGUE LOS PENDIENTES DE LA ULTIMA CONCILIACION DE ESA CUENTA */
SELECT FIRST 1 COBN_ID FROM conciliacion_encabezado WHERE CUBA_COD = :CUENTA AND COBN_FECINI < :FECINI ORDER BY COBN_FECINI DESC INTO :CONANT;
FOR SELECT COBN_FEC, COBN_TIPODOC, COBN_DB, COBN_CONC, ABS(COBN_MONTO), COBN_CLASE FROM conciliacion_bancaria
    WHERE ((COBN_IDDOC = 0) or (cobn_iddoc is null)) and COBN_ID = :CONANT AND COBN_CLASE <= '2' AND COBN_OK = 'N'
    INTO :fecha, :tipodoc, :db, :concepto, :monto, :clase
    DO
    BEGIN
    ITEM = ITEM + 1;
    INSERT INTO conciliacion_bancaria (CUBA_COD, COBN_ID, COBN_ITEM, COBN_FEC, COBN_PREFIJO, COBN_NUMERO, COBN_MONTO, COBN_TIPODOC, COBN_ANULADO, COBN_OK, COBN_CONC, COBN_IDDOC, COBN_DB, COBN_CLASE)
        VALUES (:CUENTA, :ID, :ITEM, :FECHA, NULL, NULL, :monto, :TIPODOC, 'N', 'N', :concepto, NULL, :DB, :CLASE);
    END

/* COMPARE LA TABLA CON LOS MOVIMIENTOS DEL BANCO */
FOR SELECT COBN_ITEM, ABS(COBN_MONTO), COBN_FEC, COBN_TIPODOC, COBN_DB, COBN_CONC
    FROM CONCILIACION_BANCARIA
    WHERE COBN_ID = :ID AND ((COBN_IDDOC = 0) or (cobn_iddoc is null))
    INTO :ITEM, :MONTO, :FECHA, :TIPODOC, :DB, :concepto
    DO
    BEGIN
    PREFIJO = '';
    NUMERO = '';
    IDDOC = 0;
    /* BUSQUE LA OPERACION  */
    if (TIPODOC <> 0) then
        BEGIN
        SELECT FIRST 1 MOBA_PREF, MOBA_NUMERO, MOBA_IDREF
            FROM movimiento_banco M WHERE MOBA_TIPODOC = :tipodoc AND MOBA_TOTAL = :MONTO AND M.cuba_cod = :cuenta AND MOBA_FECHA <= :FECFIN  AND
                NOT EXISTS (SELECT COBN_ITEM FROM CONCILIACION_BANCARIA WHERE COBN_IDDOC = m.moba_idref AND COBN_TIPODOC = :tipodoc AND COBN_ANULADO = 'N')
            ORDER BY ABS(MOBA_FECHA - :FECHA)
            INTO :prefijo, :numero, :IDDOC;
        if (PREFIJO <> '') then
            BEGIN
            UPDATE conciliacion_bancaria SET COBN_PREFIJO = :PREFIJO, COBN_NUMERO = :NUMERO, COBN_IDDOC = :iddoc, COBN_OK = 'S', COBN_CLASE = '0'
                WHERE COBN_ID = :ID AND COBN_ITEM = :ITEM;
            END
        ELSE
            BEGIN
            /* BUSQUELO COMO DEBITO O CREDITO SIN IMPORTAR EL TIPO */
            SELECT FIRST 1 MOBA_PREF, MOBA_NUMERO, MOBA_IDREF, MOBA_TIPODOC
                FROM movimiento_banco M WHERE MOBA_DB = :DB AND MOBA_TOTAL = :MONTO AND M.cuba_cod = :cuenta AND MOBA_FECHA <= :FECFIN AND
                    NOT EXISTS (SELECT COBN_ITEM FROM CONCILIACION_BANCARIA WHERE COBN_IDDOC = m.moba_idref AND COBN_TIPODOC = :tipodoc)
                ORDER BY ABS(MOBA_FECHA - :FECHA)
                INTO :prefijo, :numero, :IDDOC, :tipodoc;
            if (PREFIJO <> '') then
                BEGIN
                UPDATE conciliacion_bancaria SET COBN_PREFIJO = :PREFIJO, COBN_NUMERO = :NUMERO, COBN_IDDOC = :iddoc, COBN_TIPODOC = :tipodoc, COBN_OK = 'S', COBN_CLASE = '0'
                    WHERE COBN_ID = :ID AND COBN_ITEM = :ITEM;
                END
            ELSE
                BEGIN
                if (DB = 'N') then
                    UPDATE conciliacion_bancaria SET COBN_OK = 'N', COBN_CLASE = '2'
                        WHERE COBN_ID = :ID AND COBN_ITEM = :ITEM;
                else
                    UPDATE conciliacion_bancaria SET COBN_OK = 'N', COBN_CLASE = '1'
                        WHERE COBN_ID = :ID AND COBN_ITEM = :ITEM;
                END
            END
        END
    ELSE
        BEGIN
        /* BUSQUELO COMO DEBITO O CREDITO SIN IMPORTAR EL TIPO */
        SELECT FIRST 1 MOBA_PREF, MOBA_NUMERO, MOBA_IDREF, MOBA_TIPODOC
            FROM movimiento_banco M WHERE MOBA_DB = :DB AND MOBA_TOTAL = :MONTO AND M.cuba_cod = :cuenta AND MOBA_FECHA <= :FECFIN AND
                NOT EXISTS (SELECT COBN_ITEM FROM CONCILIACION_BANCARIA WHERE COBN_IDDOC = m.moba_idref AND COBN_TIPODOC = M.moba_tipodoc)
            ORDER BY ABS(MOBA_FECHA - :FECHA)
            INTO :prefijo, :numero, :IDDOC, :TIPODOC;
        if (PREFIJO <> '') then
            BEGIN
            UPDATE conciliacion_bancaria SET COBN_PREFIJO = :PREFIJO, COBN_NUMERO = :NUMERO, COBN_IDDOC = :iddoc, COBN_TIPODOC = :TIPODOC, COBN_OK = 'S', COBN_CLASE = '0'
                WHERE COBN_ID = :ID AND COBN_ITEM = :ITEM;
            END
        ELSE
            BEGIN
            if (DB = 'N') then
                UPDATE conciliacion_bancaria SET COBN_OK = 'N', COBN_CLASE = '2'
                    WHERE COBN_ID = :ID AND COBN_ITEM = :ITEM;
            else
                UPDATE conciliacion_bancaria SET COBN_OK = 'N', COBN_CLASE = '1'
                    WHERE COBN_ID = :ID AND COBN_ITEM = :ITEM;
            END
        END
    END
/* AGREGUE LOS DOCUMENTOS SIN UBICAR */
FOR SELECT MOBA_PREF, MOBA_NUMERO, MOBA_FECHA, MOBA_TOTAL, MOBA_CONCEPTO, MOBA_TIPODOC, MOBA_IDREF, MOBA_DB
    FROM MOVIMIENTO_BANCO M
    WHERE MOBA_FECHA <= :FECFIN  AND M.cuba_cod = :cuenta AND
        NOT EXISTS (SELECT COBN_ITEM FROM conciliacion_bancaria WHERE COBN_TIPODOC = M.moba_tipodoc AND COBN_IDDOC = M.moba_idref)
    INTO :prefijo, :numero, :fecha, :monto, :concepto, :tipodoc, :iddoc, :DB
    DO
    BEGIN
    ITEM = ITEM + 1;
    if (DB = 'N') then
        INSERT INTO conciliacion_bancaria (CUBA_COD, COBN_ID, COBN_ITEM, COBN_FEC, COBN_PREFIJO, COBN_NUMERO, COBN_MONTO, COBN_TIPODOC, COBN_ANULADO, COBN_OK, COBN_CONC, COBN_IDDOC, COBN_DB, COBN_CLASE)
            VALUES (:CUENTA, :ID, :ITEM, :FECHA, :PREFIJO, :NUMERO, :monto, :TIPODOC, 'N', 'N', :concepto, :iddoc, :DB, '4');
    else
        INSERT INTO conciliacion_bancaria (CUBA_COD, COBN_ID, COBN_ITEM, COBN_FEC, COBN_PREFIJO, COBN_NUMERO, COBN_MONTO, COBN_TIPODOC, COBN_ANULADO, COBN_OK, COBN_CONC, COBN_IDDOC, COBN_DB, COBN_CLASE)
            VALUES (:CUENTA, :ID, :ITEM, :FECHA, :PREFIJO, :NUMERO, :monto, :TIPODOC, 'N', 'N', :concepto, :iddoc, :DB, '3');
    END
end
^

SET TERM ; ^


/* 20090909D */
/* NO IMPRIMIA EL DETALLE POR ERROR EN EL WHERE */
SET TERM ^ ;

CREATE OR ALTER procedure IMPR_CAMBDOCU (
    ID integer)
returns (
    PREFIJO varchar(4),
    NUMERO varchar(6),
    FECHA date,
    NOMCAJA varchar(60),
    CONCEPTO varchar(60),
    OBS blob sub_type 1 segment size 80,
    ITEMENT integer,
    FORENT varchar(30),
    BCOENT varchar(2),
    CTAENT varchar(20),
    NUMENT varchar(20),
    FECENT date,
    MONTOENT numeric(18,2))
AS
declare variable NUMROWS INTEGER;
declare variable TIPO integer;
declare variable IDDOC INTEGER;
BEGIN
  SELECT PREF_PRE, CADO_NUMERO, CADO_FECHA, CAJA_NOMBRE, CADO_CONC, CADO_OBS
  FROM CAMBIO_DOCUMENTOS D, CAJAS C
  WHERE D.CAJA_ID = C.CAJA_ID AND D.CADO_ID = :ID
  INTO :PREFIJO, :NUMERO, :FECHA, :NOMCAJA, :CONCEPTO, :OBS;
  for select
        CDEN_ITEM, FOPA_NOM, CDEN_BANCO, CDEN_CUENTA, CDEN_NUMERO, CDEN_FECHA, CDEN_MONTO
    FROM CAMBIODOC_ENTRADAS E, FORMAS_PAGO F
    WHERE E.FOPA_ID = F.FOPA_ID AND E.CADO_ID = :ID
    INTO
        :ITEMENT, :FORENT, :BCOENT, :CTAENT, :NUMENT, :FECENT, :MONTOENT
    DO
        SUSPEND;
 END
^

SET TERM ; ^

/* 20090909E */
                                                                                                                                                                                                 
INSERT INTO CONFIGURACION (CONF_MODULO, CONF_CATEGORIA, CONF_PROPIEDAD, CONF_VALOR, CONF_POSIBLES, CONF_AYUDA) VALUES ('CRM', 'COMPROMISOS', 'COLOR COMPROMISOS DE PRIORIDAD ALTA', '$004040FF', NULL, 'Indique el color que se usa para resaltar los compromisos de prioridad alta');
INSERT INTO CONFIGURACION (CONF_MODULO, CONF_CATEGORIA, CONF_PROPIEDAD, CONF_VALOR, CONF_POSIBLES, CONF_AYUDA) VALUES ('CRM', 'COMPROMISOS', 'COLOR COMPROMISOS DE PRIORIDAD MEDIA', '$0040FFFF', NULL, 'Indique el color que se usa para resaltar los compromisos de prioridad media');
INSERT INTO CONFIGURACION (CONF_MODULO, CONF_CATEGORIA, CONF_PROPIEDAD, CONF_VALOR, CONF_POSIBLES, CONF_AYUDA) VALUES ('CRM', 'COMPROMISOS', 'COLOR COMPROMISOS DE PRIORIDAD NORMAL', '$0080FF80', NULL, 'Indique el color que se usa para resaltar los compromisos de prioridad normal');
COMMIT WORK;


/* 20090910 */
SET TERM ^ ;

CREATE OR ALTER procedure CONTABIL_FACTCOMP (
    IDDOC integer,
    IDINTER integer)
returns (
    ERROR integer,
    VER char(1),
    IDC integer)
AS
DECLARE VARIABLE PREFIJO VARCHAR(4);
DECLARE VARIABLE NUM VARCHAR(6);
DECLARE VARIABLE NUMERO VARCHAR(10);
DECLARE VARIABLE FECAUX DATE;
DECLARE VARIABLE FECHA CHAR(8);
DECLARE VARIABLE CONCEPTO CHAR(60);
DECLARE VARIABLE VENCEAUX DATE;
DECLARE VARIABLE VENCE CHAR(8);
DECLARE VARIABLE VRDTO NUMERIC(18,2);
DECLARE VARIABLE VRADIC NUMERIC(18,2);
DECLARE VARIABLE VRSUBT NUMERIC(18,2);
DECLARE VARIABLE VRIVA NUMERIC(18,2);
DECLARE VARIABLE PRTFTE NUMERIC(9,2);
DECLARE VARIABLE VRRTFTE NUMERIC(18,2);
DECLARE VARIABLE VRRTIVA NUMERIC(18,2);
DECLARE VARIABLE PRTICA NUMERIC(9,2);
DECLARE VARIABLE VRRTICA NUMERIC(18,2);
DECLARE VARIABLE VRTOTAL NUMERIC(18,2);
DECLARE VARIABLE VREXTRA NUMERIC(18,2);
DECLARE VARIABLE TIPOCOMP VARCHAR(3);
DECLARE VARIABLE PREFCONT VARCHAR(4);
DECLARE VARIABLE INVEN CHAR(1);
DECLARE VARIABLE CTAINVEN VARCHAR(20);
DECLARE VARIABLE IVA CHAR(1);
DECLARE VARIABLE CTAIVA VARCHAR(20);
DECLARE VARIABLE CONSUMO CHAR(1);
DECLARE VARIABLE CTACONSUMO VARCHAR(20);
DECLARE VARIABLE CXP CHAR(1);
DECLARE VARIABLE CTACXP VARCHAR(20);
DECLARE VARIABLE RTFTE CHAR(1);
DECLARE VARIABLE CTARTFTE VARCHAR(20);
DECLARE VARIABLE RTIVA CHAR(1);
DECLARE VARIABLE CTARTIVA VARCHAR(20);
DECLARE VARIABLE RTICA CHAR(1);
DECLARE VARIABLE CTARTICA VARCHAR(20);
DECLARE VARIABLE CTADTO VARCHAR(20);
DECLARE VARIABLE CTAADIC VARCHAR(20);
DECLARE VARIABLE CTAEXTRA VARCHAR(20);
DECLARE VARIABLE EXISTE CHAR(1);
DECLARE VARIABLE CUENTA VARCHAR(20);
DECLARE VARIABLE MONTO NUMERIC(18,2);
DECLARE VARIABLE TIPOCUEN CHAR(1);
DECLARE VARIABLE NIT VARCHAR(20);
DECLARE VARIABLE NOMBRE VARCHAR(60);
DECLARE VARIABLE PROY VARCHAR(4);
DECLARE VARIABLE CENTRO VARCHAR(4);
DECLARE VARIABLE PROYDET VARCHAR(4);
DECLARE VARIABLE CENTRODET VARCHAR(4);
DECLARE VARIABLE PORC NUMERIC(5,2);
DECLARE VARIABLE NUMITEMS INTEGER;
DECLARE VARIABLE ARTICULO VARCHAR(15);
DECLARE VARIABLE IMPINC CHAR(1);
DECLARE VARIABLE IMPTOS NUMERIC(18,2);
DECLARE VARIABLE SUMA NUMERIC(18,2);
DECLARE VARIABLE PORCIVA NUMERIC(9,2);
DECLARE VARIABLE TCTAPROV VARCHAR(20);
DECLARE VARIABLE TCTARTFTE VARCHAR(20);
DECLARE VARIABLE TCTARTIVA VARCHAR(20);
DECLARE VARIABLE TCTARTICA VARCHAR(20);
DECLARE VARIABLE CUENTAADIC VARCHAR(20);
DECLARE VARIABLE BASEADIC VARCHAR(20);
DECLARE VARIABLE PORCADIC NUMERIC(5,2);
DECLARE VARIABLE VALORADIC NUMERIC(18,2);
DECLARE VARIABLE DBADIC CHAR(1);
DECLARE VARIABLE FOMENTO CHAR(2);
DECLARE VARIABLE BODE_DET CHAR(2);
DECLARE VARIABLE NUMPROV VARCHAR(10);
DECLARE VARIABLE MERCANCIA NUMERIC(18,2);
declare variable FACTOR DOUBLE PRECISION;
DECLARE VARIABLE MENORV CHAR(2);
declare variable DIG INTEGER;
declare variable NETO NUMERIC(18,2);
declare variable CENT CHAR(1);
declare variable ANULADO CHAR(1);
declare variable ERRORC INTEGER;
BEGIN
  /* INTERFACE */
  EXISTE = 'N';
  SELECT 'S', TICO_COD, PRCO_PRE, INCO_INVEN, INCO_IVA, INCO_CONSUMO, INCO_CXP, INCO_RTFTE, INCO_RTIVA, INCO_RTICA, INCO_CTAINVEN, INCO_CTAIVA, INCO_CTACONSUMO, INCO_CTADTO, INCO_CTAADIC, INCO_CTAEXTRA, INCO_CTACXP, INCO_CTARTFTE, INCO_CTARTIVA, INCO_CTARTICA, INCO_CONFIRMAR, INCO_CENTRO
    FROM INTERFAZ_COMPRAS WHERE INCO_ID = :IDINTER INTO :EXISTE, :TIPOCOMP, :PREFCONT, :INVEN, :IVA, :CONSUMO, :CXP, :RTFTE, :RTIVA, :RTICA, :CTAINVEN, :CTAIVA, :CTACONSUMO, :CTADTO, :CTAADIC, :CTAEXTRA, :CTACXP, :CTARTFTE, :CTARTIVA, :CTARTICA, :VER, :CENT;
  if (EXISTE = 'S') then
    BEGIN
    /* BORRE CONTABILIZACION PREVIA */
    DELETE FROM CONTABILIZACION WHERE CNTB_TIPOREF = 21 AND CNTB_IDREF = :IDDOC;
    /* ENCABEZADO DE LA FACTURA */
    SELECT PREF_PRE, FACO_NUMERO, FACO_FECHA, F.TERC_NIT, FACO_IMPTOS, FACO_VENCE, FACO_DTOMONTO, FACO_ADICIONAL, FACO_IVAMONTO, FACO_EXTRA, FACO_TOTAL, FACO_RTFTEPORC, FACO_RTFTEMONTO, FACO_RTIVAPOR, FACO_RTIVAMONTO, FACO_RTICAPOR, FACO_RTICAMONTO, TERC_NOM, PROV_CTARTFTE, PROV_CTARTIVA, PROV_CTARTICA, PROV_CTAPAGAR, FACO_NUMPROV, FACO_ANULADO
        FROM FACTURAS_COMPRA F, TERCEROS T, PROVEEDORES P WHERE FACO_ID = :IDDOC AND F.TERC_NIT = T.TERC_NIT AND T.TERC_NIT = P.TERC_NIT
        INTO :PREFIJO, :NUM, :FECAUX, :NIT, :IMPINC, :VENCEAUX, :VRDTO, :VRADIC, :VRIVA, :VREXTRA, :VRTOTAL, :PRTFTE, :VRRTFTE, :PORC, :VRRTIVA, :PRTICA, :VRRTICA, :NOMBRE, TCTARTFTE, TCTARTIVA, TCTARTICA, TCTAPROV, :NUMPROV, :ANULADO;
    /* CENTRO DE LA BODEGA */
    IF (CENT = 'B') THEN
        SELECT BODE_CENTRO, BODE_PROY FROM BODEGA B, FACTURAS_COMPRA F WHERE B.BODE_COD = F.BODE_COD AND F.FACO_ID = :IDDOC INTO :CENTRO, :PROY;
    ELSE
        SELECT PREF_CENTRO,PREF_PROY  FROM PREFIJOS P, FACTURAS_COMPRA F WHERE P.PREF_PRE = F.PREF_PRE AND F.FACO_ID = :IDDOC AND P.TIDO_COD = 21 INTO :CENTRO, :PROY;
    if (ANULADO = 'N') then
        BEGIN
        NUMERO = PREFIJO || NUM;
        VRSUBT = VRTOTAL - VREXTRA - VRIVA;
        MERCANCIA = VRSUBT - VRADIC + VRDTO;
        EXECUTE PROCEDURE FECHA_A_CONTA(:FECAUX) returning_values (:FECHA);
        EXECUTE PROCEDURE FECHA_A_CONTA(:VENCEAUX) returning_values (:VENCE);
        if (NUMPROV IS NULL) then
            NUMPROV = NUMERO;
        CONCEPTO = 'FC No.' || NUMERO || '-' || SUBSTR(NOMBRE,1,26) || '-NPROV.' || NUMPROV;
        IDC = GEN_ID(ID_CONTABILIZA, 1);
        INSERT INTO CONTABILIZACION (CNTB_ID, CNTB_TIPOCOMP, CNTB_PREFCNT, CNTB_NUMERO, CNTB_FECHA, CNTB_CONCEPTO, CNTB_REF, CNTB_TIPOREF, CNTB_IDREF, CNTB_PREFREF, CNTB_NUMREF, CNTB_PROCESADO)
            VALUES (:IDC, :TIPOCOMP, :PREFCONT, :NUM, :FECHA, :CONCEPTO, '', 21, :IDDOC, :PREFIJO, :NUM, 'N');
        NUMITEMS = 0;
        SUMA = 0;
        NETO = 0;
        ERROR = 0;
        EXECUTE PROCEDURE LEE_CONFIGURACION('COMPRAS', 'FACTURAS', 'USAR IMPOCONSUMO COMO PORCENTAJE DE FOMENTO') RETURNING_VALUES (FOMENTO);
        EXECUTE PROCEDURE lee_configuracion('COMPRAS','FACTURAS','DESCUENTO Y VALOR ADICIONAL DEL DOCUMENTO COMO MENOR VALOR DEL COSTO') returning_values (:MENORV);
        SELECT SUM(FCDE_consumo) from facturas_compras_detalle where faco_id = :IDDOC into :valoradic;
        if (MENORV = 'SI') then
            if (MERCANCIA <> 0) then
                FACTOR = (CAST(VRSUBT AS DOUBLE PRECISION) - VALORADIC) / (CAST(MERCANCIA AS DOUBLE PRECISION) - VALORADIC);
            ELSE
                FACTOR = 1;
        ELSE
           FACTOR = 1;
        SELECT CAST(CONF_VALOR AS INTEGER) FROM CONFIGURACION WHERE CONF_MODULO = 'COMPRAS' AND CONF_CATEGORIA = 'DOCUMENTOS' AND CONF_PROPIEDAD = 'REDONDEO AL MULTIPLO DE DIEZ EN TOTALES' INTO :DIG;
        if (INVEN = 'A') then
            BEGIN
            FOR SELECT MAX(COAR_CTACOMP), SUM(CAST(FCDE_CANT AS DOUBLE PRECISION) * (FCDE_PRUNIT-FCDE_DTOMONTO)), SUM(FCDE_IVAMONTO), SUM(FCDE_CONSUMO), MAX(F.BODE_COD)
                FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_COMPRAS_DETALLE F WHERE F.FACO_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD
                GROUP BY COAR_CTACOMP, F.BODE_COD INTO :CTAINVEN, :MONTO, :IMPTOS, :VALORADIC, :BODE_DET DO
                BEGIN
                IF (CENT = 'B') THEN
                  SELECT BODE_CENTRO, BODE_PROY FROM BODEGA WHERE BODE_COD = :BODE_DET INTO :CENTRODET, :PROYDET;
                if (IMPINC = 'S') then
                    BEGIN
                    MONTO = MONTO - IMPTOS;
                    if (FOMENTO <> 'SI' ) then
                        MONTO = MONTO - VALORADIC;
                    END
                MONTO = MONTO * FACTOR;
                execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                EXECUTE PROCEDURE CUENTA_INTERFAZ(21, :IDDOC, :CTAINVEN, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    FOR SELECT F.ARTI_COD, (FCDE_CANT * (FCDE_PRUNIT-FCDE_DTOMONTO)), FCDE_IVAMONTO, FCDE_CONSUMO
                        FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_COMPRAS_DETALLE F WHERE F.FACO_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTACOMP = :CUENTA
                        INTO :ARTICULO, :MONTO, :IMPTOS, :VALORADIC DO
                        BEGIN
                        if (IMPINC = 'S') then
                            BEGIN
                            MONTO = MONTO - IMPTOS;
                            if (FOMENTO <> 'SI' ) then
                                MONTO = MONTO - VALORADIC;
                            END
                        MONTO = MONTO * FACTOR;
                        execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                        IF (CENT = 'B') THEN
                           INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                               VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROYDET, :CENTRODET, NULL, NULL, NULL, :ARTICULO, 0, 0);
                        ELSE
                           INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                               VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                        NUMITEMS = NUMITEMS + 1;
                        NETO = NETO + MONTO;
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    IF (CENT = 'B') THEN
                       INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                           VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROYDET, :CENTRODET, :NUMERO, NULL, :VENCE, NULL, 0, 21);
                    ELSE
                       INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                           VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 21);
                    NUMITEMS = NUMITEMS + 1;
                    NETO = NETO + MONTO;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    IF (CENT = 'B') THEN
                       INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                           VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROYDET, :CENTRODET, NULL, NULL, NULL, NULL, 0, 0);
                    ELSE
                       INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                           VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NUMITEMS = NUMITEMS + 1;
                    NETO = NETO + MONTO;
                    END
                END
            END
        if (INVEN = 'K') then
            BEGIN
            FOR SELECT SUM(CAST(FCDE_CANT AS DOUBLE PRECISION) * (FCDE_PRUNIT-FCDE_DTOMONTO)), SUM(FCDE_IVAMONTO), SUM(FCDE_CONSUMO), MAX(BODE_COD)
                FROM FACTURAS_COMPRAS_DETALLE WHERE FACO_ID = :IDDOC GROUP BY BODE_COD INTO :MONTO, :IMPTOS, :VALORADIC, :BODE_DET Do
                BEGIN
                  IF (CENT = 'B') THEN
                    SELECT BODE_CENTRO, BODE_PROY FROM BODEGA WHERE BODE_COD = :BODE_DET INTO :CENTRODET, :PROYDET;
                  if (IMPINC = 'S') then
                   BEGIN
                    MONTO = MONTO - IMPTOS;
                    if (FOMENTO <> 'SI' ) then
                      MONTO = MONTO - VALORADIC;
                   END
                  MONTO = MONTO * FACTOR;
                  execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                  execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                  EXECUTE PROCEDURE CUENTA_INTERFAZ(21, :IDDOC, :CTAINVEN, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                  if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                  if (TIPOCUEN = 'I') then
                   BEGIN
                    FOR SELECT ARTI_COD, (FCDE_CANT * (FCDE_PRUNIT-FCDE_DTOMONTO)), FCDE_IVAMONTO, FCDE_CONSUMO
                      FROM FACTURAS_COMPRAS_DETALLE WHERE FACO_ID = :IDDOC INTO :ARTICULO, :MONTO, :IMPTOS, :VALORADIC DO
                       BEGIN
                       if (IMPINC = 'S') then
                        BEGIN
                         MONTO = MONTO - IMPTOS;
                         if (FOMENTO <> 'SI' ) then
                            MONTO = MONTO - VALORADIC;
                        END
                       MONTO = MONTO * FACTOR;
                       execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                       execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                       IF (CENT = 'B') THEN
                          INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                             VALUES (:IDC, :NUMITEMS, :CTAINVEN, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROYDET, :CENTRODET, NULL, NULL, NULL, :ARTICULO, 0, 0);
                       ELSE
                          INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                             VALUES (:IDC, :NUMITEMS, :CTAINVEN, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                       NUMITEMS = NUMITEMS + 1;
                       NETO = NETO + MONTO;
                       END
                   END
                  if (TIPOCUEN = 'C') then
                   BEGIN
                    IF (CENT = 'B') THEN
                       INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                         VALUES (:IDC, :NUMITEMS, :CTAINVEN, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROYDET, :CENTRODET, :NUMERO, NULL, :VENCE, NULL, 0, 21);
                    ELSE
                       INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                         VALUES (:IDC, :NUMITEMS, :CTAINVEN, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 21);
                    NUMITEMS = NUMITEMS + 1;
                    NETO = NETO + MONTO;
                   END
                  if (TIPOCUEN = 'N') then
                   BEGIN
                    IF (CENT = 'B') THEN
                       INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                          VALUES (:IDC, :NUMITEMS, :CTAINVEN, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROYDET, :CENTRODET, NULL, NULL, NULL, NULL, 0, 0);
                    ELSE
                       INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                          VALUES (:IDC, :NUMITEMS, :CTAINVEN, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NUMITEMS = NUMITEMS + 1;
                    NETO = NETO + MONTO;
                   END
                END
            END
        /* EL IVA */
        if (IVA = 'A') then
            BEGIN
            FOR SELECT MAX(COAR_CTAIVAC), SUM(FCDE_IVAMONTO), SUM(CAST(FCDE_CANT AS DOUBLE PRECISION) * (FCDE_PRUNIT-FCDE_DTOMONTO)), SUM(FCDE_CONSUMO)
                FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_COMPRAS_DETALLE F
                WHERE F.FACO_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND FCDE_IVAMONTO <> 0
                GROUP BY COAR_CTAIVAC
                INTO :CTAIVA, :IMPTOS, :MONTO, :VALORADIC DO
              if (IMPTOS <> 0) then
                BEGIN
                IMPTOS = CAST(IMPTOS AS DOUBLE PRECISION) * VRSUBT / MERCANCIA;
                if (IMPINC = 'S') then
                    BEGIN
                    MONTO = MONTO - IMPTOS;
                    if (FOMENTO <> 'SI' ) then
                        MONTO = MONTO - VALORADIC;
                    END
                MONTO = CAST(MONTO AS DOUBLE PRECISION) * VRSUBT / MERCANCIA;
                execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                EXECUTE PROCEDURE CUENTA_INTERFAZ(21, :IDDOC, :CTAIVA, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    FOR SELECT F.ARTI_COD, FCDE_IVAMONTO, (FCDE_CANT * (FCDE_PRUNIT-FCDE_DTOMONTO)), TAIV_PORC, FCDE_CONSUMO
                        FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_COMPRAS_DETALLE F, TARIFA_IVA T WHERE F.FACO_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTAIVAV = :CUENTA AND A.TAIV_COD = T.TAIV_COD
                        INTO :ARTICULO, :IMPTOS, :MONTO, :PORCIVA, :VALORADIC
                    DO
                        BEGIN
                        IMPTOS = CAST(IMPTOS AS DOUBLE PRECISION) * VRSUBT / MERCANCIA;
                        if (IMPINC = 'S') then
                            BEGIN
                            MONTO = MONTO - IMPTOS;
                            if (FOMENTO <> 'SI' ) then
                                MONTO = MONTO - VALORADIC;
                            END
                        MONTO = CAST(MONTO AS DOUBLE PRECISION) * VRSUBT / MERCANCIA;
                        execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :IMPTOS, 0, :MONTO, :PORCIVA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                        NUMITEMS = NUMITEMS + 1;
                        NETO = NETO + IMPTOS;
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :IMPTOS, 0, :MONTO, :IMPTOS*100/:MONTO, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 21);
                    NUMITEMS = NUMITEMS + 1;
                    NETO = NETO + IMPTOS;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :IMPTOS, 0, :MONTO, CAST(:IMPTOS AS DOUBLE PRECISION)*100/CAST(:MONTO AS DOUBLE PRECISION), :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NUMITEMS = NUMITEMS + 1;
                    NETO = NETO + IMPTOS;
                    END
                END
            END
        if (IVA = 'K') then /* IVA EN CTA CONSTANTE */
            BEGIN
            SELECT SUM(FCDE_IVAMONTO), SUM(CAST(FCDE_CANT AS DOUBLE PRECISION) * (FCDE_PRUNIT-FCDE_DTOMONTO)), SUM(FCDE_CONSUMO)
                FROM FACTURAS_COMPRAS_DETALLE F
                WHERE F.FACO_ID = :IDDOC  AND FCDE_IVAMONTO <> 0
                INTO :IMPTOS, :MONTO, :VALORADIC;
            if (IMPTOS <> 0) then
                BEGIN
                IMPTOS = CAST(IMPTOS AS DOUBLE PRECISION) * VRSUBT / MERCANCIA;
                if (IMPINC = 'S') then
                    BEGIN
                    MONTO = MONTO - IMPTOS;
                    if (FOMENTO <> 'SI' ) then
                        MONTO = MONTO - VALORADIC;
                    END
                MONTO = CAST(MONTO AS DOUBLE PRECISION) * VRSUBT / MERCANCIA;
                execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                EXECUTE PROCEDURE CUENTA_INTERFAZ(21, :IDDOC, :CTAIVA, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    FOR SELECT F.ARTI_COD, (FCDE_CANT * (FCDE_PRUNIT-FCDE_DTOMONTO)), FCDE_IVAMONTO, TAIV_PORC, FCDE_CONSUMO
                        FROM ARTICULO A, FACTURAS_COMPRAS_DETALLE F, TARIFA_IVA T WHERE F.FACO_ID = :IDDOC AND A.TAIV_COD = T.TAIV_COD
                        INTO :ARTICULO, :MONTO, :IMPTOS, :PORCIVA, :VALORADIC DO
                        BEGIN
                        IMPTOS = CAST(IMPTOS AS DOUBLE PRECISION) * VRSUBT / MERCANCIA;
                        if (IMPINC = 'S') then
                            BEGIN
                            MONTO = MONTO - IMPTOS;
                            if (FOMENTO <> 'SI' ) then
                                MONTO = MONTO - VALORADIC;
                            END
                        MONTO = CAST(MONTO AS DOUBLE PRECISION) * VRSUBT / MERCANCIA;
                        execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                        if (IMPTOS <> 0) then
                            BEGIN
                            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                VALUES (:IDC, :NUMITEMS, :CTAIVA, :CONCEPTO, '', :IMPTOS, 0, :MONTO, :PORCIVA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                            NUMITEMS = NUMITEMS + 1;
                            NETO = NETO + IMPTOS;
                            END
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NUMITEMS, :CTAIVA, :CONCEPTO, '', :IMPTOS, 0, :MONTO, :IMPTOS*100/:MONTO, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 21);
                    NUMITEMS = NUMITEMS + 1;
                    NETO = NETO + IMPTOS;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NUMITEMS, :CTAIVA, :CONCEPTO, '', :IMPTOS, 0, :MONTO, :IMPTOS*100/:MONTO, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NUMITEMS = NUMITEMS + 1;
                    NETO = NETO + IMPTOS;
                    END
                END
            END
        /* EL IMPOCONSUMO */
        if (CONSUMO = 'A') then
            BEGIN
            FOR SELECT MAX(COAR_CTACONS), SUM(FCDE_CONSUMO) FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_COMPRAS_DETALLE F
                WHERE F.FACO_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD GROUP BY COAR_CTACONS INTO :CTACONSUMO, :IMPTOS
            DO
              if (IMPTOS <> 0) then
                BEGIN
                execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                EXECUTE PROCEDURE CUENTA_INTERFAZ(21, :IDDOC, :CTACONSUMO, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (FOMENTO <> 'SI') then
                    BEGIN
                    if (TIPOCUEN = 'I') then
                        BEGIN
                        FOR SELECT F.ARTI_COD, FCDE_CONSUMO FROM ARTICULO A, FACTURAS_COMPRAS_DETALLE F WHERE F.FACO_ID = :IDDOC INTO :ARTICULO, :IMPTOS
                            DO
                            BEGIN
                            if (IMPTOS <> 0) then
                                BEGIN
                                execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                    VALUES (:IDC, :NUMITEMS, :CTACONSUMO, :CONCEPTO, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                                NUMITEMS = NUMITEMS + 1;
                                NETO = NETO + IMPTOS;
                                END
                            END
                        END
                    if (TIPOCUEN = 'C') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CTACONSUMO, :CONCEPTO, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                        NUMITEMS = NUMITEMS + 1;
                        NETO = NETO + IMPTOS;
                        END
                    if (TIPOCUEN = 'N') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CTACONSUMO, :CONCEPTO, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NUMITEMS = NUMITEMS + 1;
                        NETO = NETO + IMPTOS;
                        END
                    END
                ELSE
                    BEGIN
                    if (TIPOCUEN = 'I') then
                        BEGIN
                        FOR SELECT F.ARTI_COD, FCDE_CONSUMO FROM ARTICULO A, FACTURAS_COMPRAS_DETALLE F WHERE F.FACO_ID = :IDDOC INTO :ARTICULO, :IMPTOS
                            DO
                            BEGIN
                            if (IMPTOS <> 0) then
                                BEGIN
                                execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                    VALUES (:IDC, :NUMITEMS, :CTACONSUMO, :CONCEPTO, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                                NUMITEMS = NUMITEMS + 1;
                                NETO = NETO - IMPTOS;
                                END
                            END
                        END
                    if (TIPOCUEN = 'C') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CTACONSUMO, :CONCEPTO, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                        NUMITEMS = NUMITEMS + 1;
                        NETO = NETO - IMPTOS;
                        END
                    if (TIPOCUEN = 'N') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CTACONSUMO, :CONCEPTO, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NUMITEMS = NUMITEMS + 1;
                        NETO = NETO - IMPTOS;
                        END
                    END
                END
            END
        if (CONSUMO = 'K') then /* CONSUMO EN CTA CONSTANTE */
            BEGIN
            SELECT SUM(FCDE_CONSUMO) FROM FACTURAS_COMPRAS_DETALLE F WHERE F.FACO_ID = :IDDOC INTO :IMPTOS;
            if (IMPTOS <> 0) then
              BEGIN
              execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
              /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
              EXECUTE PROCEDURE CUENTA_INTERFAZ(21, :IDDOC, :CTACONSUMO, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
              if (ERRORC <> 0) then
                ERROR = ERROR + 1;
              if (FOMENTO <> 'SI') then
                BEGIN
                /* DEPENDE DEL TIPO DE CUENTA */
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT F.ARTI_COD, FCDE_CONSUMO FROM ARTICULO A, FACTURAS_COMPRAS_DETALLE F WHERE F.FACO_ID = :IDDOC INTO :ARTICULO, :IMPTOS
                        DO
                        BEGIN
                        if (IMPTOS <> 0) then
                            BEGIN
                            execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                VALUES (:IDC, :NUMITEMS, :CTACONSUMO, :CONCEPTO, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                            NUMITEMS = NUMITEMS + 1;
                            NETO = NETO + IMPTOS;
                            END
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    /* INSERTE EL REGISTRO DE LA BASE */
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NUMITEMS, :CTACONSUMO, :CONCEPTO, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    NUMITEMS = NUMITEMS + 1;
                    NETO = NETO + IMPTOS;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NUMITEMS, :CTACONSUMO, :CONCEPTO, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NUMITEMS = NUMITEMS + 1;
                    NETO = NETO + IMPTOS;
                    END
                END
              ELSE
                BEGIN
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT F.ARTI_COD, FCDE_CONSUMO FROM ARTICULO A, FACTURAS_COMPRAS_DETALLE F WHERE F.FACO_ID = :IDDOC INTO :ARTICULO, :IMPTOS
                        DO
                        BEGIN
                        if (IMPTOS <> 0) then
                            BEGIN
                           execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                           INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                VALUES (:IDC, :NUMITEMS, :CTACONSUMO, :CONCEPTO, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                            NUMITEMS = NUMITEMS + 1;
                            NETO = NETO - IMPTOS;
                            END
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    /* INSERTE EL REGISTRO DE LA BASE */
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NUMITEMS, :CTACONSUMO, :CONCEPTO, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    NUMITEMS = NUMITEMS + 1;
                    NETO = NETO - IMPTOS;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NUMITEMS, :CTACONSUMO, :CONCEPTO, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NUMITEMS = NUMITEMS + 1;
                    NETO = NETO - IMPTOS;
                    END
                END
              end
            END
        /* DESCUENTO */
        if ((CTADTO IS NOT NULL) AND
            (CTADTO <> '')) THEN
          BEGIN
          execute procedure redondee(VRDTO, DIG) returning_values (VRDTO);
          if (VRDTO <> 0) then
            begin
            /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
            EXECUTE PROCEDURE CUENTA_INTERFAZ(21, :IDDOC, :CTADTO, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :VRDTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 21);
                NUMITEMS = NUMITEMS + 1;
                NETO = NETO - VRDTO;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                /* INSERTE EL REGISTRO DE LA BASE */
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :VRDTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NUMITEMS = NUMITEMS + 1;
                NETO = NETO - VRDTO;
                END
            end
          END
        /* VALOR ADIC */
        if ((CTAADIC IS NOT NULL) AND
            (CTAADIC <> '')) THEN
          BEGIN
          execute procedure redondee(VRADIC, DIG) returning_values (VRADIC);
          if (VRADIC <> 0) then
            begin
            /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
            EXECUTE PROCEDURE CUENTA_INTERFAZ(21, :IDDOC, :CTAADIC, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :VRADIC, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 21);
                NUMITEMS = NUMITEMS + 1;
                NETO = NETO + VRADIC;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :VRADIC, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NUMITEMS = NUMITEMS + 1;
                NETO = NETO + VRADIC;
                END
            end
          END
        /* VALOR EXTRA */
        if ((CTAEXTRA IS NOT NULL) AND
            (CTAEXTRA <> '')) THEN
          BEGIN
          execute procedure redondee(VREXTRA, DIG) returning_values (VREXTRA);
          if (VREXTRA <> 0) then
            begin
            /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
            EXECUTE PROCEDURE CUENTA_INTERFAZ(21, :IDDOC, :CTAEXTRA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :VREXTRA, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 21);
                NUMITEMS = NUMITEMS + 1;
                NETO = NETO + VREXTRA;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :VREXTRA, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NUMITEMS = NUMITEMS + 1;
                NETO = NETO + VREXTRA;
                END
            end
          END

        /* DESCUENTE EL IMPOCONSUMO */
        SELECT SUM(FCDE_CONSUMO) FROM FACTURAS_COMPRAS_DETALLE F WHERE F.FACO_ID = :IDDOC INTO :IMPTOS;
        if (IMPTOS IS NULL) then
            IMPTOS = 0;
        vrsubt = vrsubt - IMPTOS;
        /* RETENCION FUENTE */
        if ((RTFTE = 'P') or (RTFTE = 'K')) then
          BEGIN
          execute procedure redondee(VRRTFTE, DIG) returning_values (VRRTFTE);
          if (VRRTFTE <> 0) then
            begin
            if (RTFTE = 'P') then
                CTARTFTE = TCTARTFTE;
            EXECUTE PROCEDURE CUENTA_INTERFAZ(21, :IDDOC, :CTARTFTE, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :VRRTFTE, (:VRSUBT*-1), :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NUMITEMS = NUMITEMS + 1;
                NETO = NETO - VRRTFTE;
                SUMA = VRRTFTE;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :VRRTFTE, (:VRSUBT*-1), :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NUMITEMS = NUMITEMS + 1;
                NETO = NETO - VRRTFTE;
                SUMA = VRRTFTE;
                END
            end
          END
        if (RTFTE = 'A') then
          BEGIN
          FOR SELECT MAX(COAR_CTARTFTE), MAX(COAR_RTFTE), MIN(COAR_RTBASE), SUM(FCDE_TOTAL-FCDE_IVAMONTO-FCDE_CONSUMO), SUM((FCDE_TOTAL-FCDE_IVAMONTO-FCDE_CONSUMO)*COAR_RTFTE)
            FROM CONTABIL_ARTICULO C, FACTURAS_COMPRAS_DETALLE F
            WHERE F.faco_id = :IDDOC AND F.ARTI_COD = C.ARTI_COD
            GROUP BY COAR_CTARTFTE
            INTO :CTARTFTE, :PRTFTE, :baseadic,  :MONTO, :VRRTFTE
            DO
            BEGIN
            MONTO = MONTO * FACTOR * -1;
            if (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, :VRSUBT, :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                        NUMITEMS = NUMITEMS + 1;
                        NETO = NETO - VRRTFTE;
                        SUMA = VRRTFTE;
                        END
                    if (TIPOCUEN = 'N') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :VRRTFTE, :VRSUBT, :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NUMITEMS = NUMITEMS + 1;
                        NETO = NETO - VRRTFTE;
                        SUMA = VRRTFTE;
                        END
                    end
                end
              END
          END
        /* RETENCION IVA */
        if ((RTIVA = 'P') or (RTIVA = 'K')) then
          BEGIN
          execute procedure redondee(VRRTIVA, DIG) returning_values (VRRTIVA);
          if (VRRTIVA <> 0) then
            begin
            if (RTIVA = 'P') then
                CTARTIVA = TCTARTIVA;
            EXECUTE PROCEDURE CUENTA_INTERFAZ(21, :IDDOC, :CTARTIVA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :VRRTIVA, (:VRIVA*-1), :PORC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 21);
                NUMITEMS = NUMITEMS + 1;
                NETO = NETO - VRRTIVA;
                SUMA = SUMA + VRRTIVA;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :VRRTIVA, (:VRIVA*-1), :PORC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NUMITEMS = NUMITEMS + 1;
                NETO = NETO - VRRTIVA;
                SUMA = SUMA + VRRTIVA;
                END
            end
          END
        /* RETENCION DE ICA */
        if ((RTICA = 'P') or (RTICA = 'K')) then
          BEGIN
          execute procedure redondee(VRRTICA, DIG) returning_values (VRRTICA);
          if (VRRTICA <> 0) then
            begin
            if (RTICA = 'P') then
                CTARTICA = TCTARTICA;
            EXECUTE PROCEDURE CUENTA_INTERFAZ(21, :IDDOC, :CTARTICA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :VRRTICA, (:VRSUBT*-1), :PRTICA, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 21);
                NUMITEMS = NUMITEMS + 1;
                NETO = NETO - VRRTICA;
                SUMA = SUMA + VRRTICA;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :VRRTICA, (:VRSUBT*-1), :PRTICA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NUMITEMS = NUMITEMS + 1;
                NETO = NETO - VRRTICA;
                SUMA = SUMA + VRRTICA;
                END
            end
          END
        /* CIERRE EL COMPROBANTE CONTRA LA CUENTA DEL TERCERO O LA CONSTANTE */
        if ((CXP = 'P') or (CXP = 'K')) then
            BEGIN
            SUMA = VRTOTAL - SUMA;
            execute procedure redondee(SUMA, DIG) returning_values (SUMA);
            if (CXP = 'P') then
                CTACXP = TCTAPROV;
            EXECUTE PROCEDURE CUENTA_INTERFAZ(21, :IDDOC, :CTACXP, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :SUMA, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 21);
            if (TIPOCUEN = 'N') then
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :SUMA, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NETO = NETO - SUMA;
            NUMITEMS = NUMITEMS + 1;
            END
        /* recorra las cuentas adicionales */
        FOR SELECT INCC_CUENTA, INCC_BASE, INCC_PORC, INCC_VALOR, INCC_DB FROM INTERFAZ_COMPRAS_CTAS
            WHERE INCO_ID = :IDINTER INTO :CUENTAADIC, :BASEADIC, :PORCADIC, :VALORADIC, :DBADIC
            DO
            BEGIN
            if (VALORADIC <> 0) then
                MONTO = VALORADIC;
            ELSE
                BEGIN
                if (:BASEADIC = 'SUBTOTAL') then
                    VALORADIC = VRTOTAL - VREXTRA - VRIVA - VRADIC + VRDTO;
                if (:BASEADIC = 'DESCUENTO') then
                    VALORADIC = VRDTO;
                if (:BASEADIC = 'IVA') then
                    VALORADIC = VRIVA;
                if (:BASEADIC = 'CONSUMO') then
                    SELECT SUM(FCDE_CONSUMO) FROM FACTURAS_COMPRAS_DETALLE F WHERE F.FACO_ID = :IDDOC INTO :VALORADIC;
                if (:BASEADIC = 'ADICIONAL') then
                    VALORADIC = VRADIC;
                if (:BASEADIC = 'EXTRA') then
                    VALORADIC = VREXTRA;
                if (:BASEADIC = 'TOTAL') then
                    VALORADIC = VRTOTAL;
                MONTO = CAST(VALORADIC AS DOUBLE PRECISION) * PORCADIC / 100;
                END
            if (MONTO <> 0) then
                BEGIN
                execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                EXECUTE PROCEDURE CUENTA_INTERFAZ(21, :IDDOC, :CUENTAADIC, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'C') then
                    BEGIN
                    if (DBADIC = 'S') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTAADIC, :CONCEPTO, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                        SUMA = SUMA + MONTO;
                        NETO = NETO + MONTO;
                        END
                    ELSE
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTAADIC, :CONCEPTO, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                        SUMA = SUMA - MONTO;
                        NETO = NETO - MONTO;
                        END
                    NUMITEMS = NUMITEMS + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    if (DBADIC = 'S') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTAADIC, :CONCEPTO, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        SUMA = SUMA + MONTO;
                        NETO = NETO + MONTO;
                        END
                    ELSE
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTAADIC, :CONCEPTO, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        SUMA = SUMA - MONTO;
                        NETO = NETO - MONTO;
                        END
                    NUMITEMS = NUMITEMS + 1;
                    END
                END
            END
        if (NETO <> 0) then
            BEGIN
            EXECUTE PROCEDURE lee_configuracion ('CONTABILIDAD','GENERAL','CUENTA PARA CUADRAR COMPROBANTES DESCUADRADOS DE INTERFAZ') returning_values (:ctaadic);
            if (ctaadic <> '') then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(21, :IDDOC, :CTAADIC, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'C') then
                    BEGIN
                    if (NETO < 0) then
                        BEGIN
                        NETO = NETO * -1;
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :NETO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                        END
                    ELSE
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :NETO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                        END
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    if (NETO < 0) then
                        BEGIN
                        NETO = NETO * -1;
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :NETO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        END
                    ELSE
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :NETO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        END
                    END
                END
            END
        END
    if (ERROR > 0) then
        VER = 'S';
    SUSPEND;
    END
ELSE
    BEGIN
    EXECUTE PROCEDURE ERROR (21, :IDDOC, :PREFIJO, 1);
    ERROR = ERROR + 1;
    VER = 'S';
    SUSPEND;
    END
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE CONTABILICE_COMP_SIMPLIFICADO(
    IDI INTEGER)
RETURNS (
    ID INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    ESTADO VARCHAR(20),
    IDC INTEGER)
AS
 /*$$IBE$$ DECLARE VARIABLE VER CHAR(2);
declare variable ERROR INTEGER; $$IBE$$*/ 
BEGIN /*$$IBE$$ 
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;
   $$IBE$$*/ /* 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; */ /*$$IBE$$ 
  EXECUTE PROCEDURE CONTABIL_FACTCOMP (:ID, :IDI) RETURNING_VALUES (:ERROR, VER, :IDC);
  if (ERROR = 0) then
    BEGIN
 $$IBE$$*/ /*    EXECUTE PROCEDURE CONTABILIZA_PENDIENTE (:IDC); */ /*$$IBE$$ 
    ESTADO = 'OK';
    END
  ELSE
    ESTADO = 'ERROR';
  suspend;
  END
 $$IBE$$*/ SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE FACTCOMP_SIN_CONTABILIDAD(
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    ID INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    ESTADO VARCHAR(20),
    IDI INTEGER,
    IDC INTEGER)
AS
 /*$$IBE$$ DECLARE VARIABLE VER CHAR(2);
declare variable FECICNT VARCHAR(10);
declare variable FECFCNT VARCHAR(10);
declare variable ERROR INTEGER;
declare variable idref INTEGER; $$IBE$$*/ 
BEGIN /*$$IBE$$ 
EXECUTE PROCEDURE fecha_a_conta(FECINI) returning_values (FECICNT);
EXECUTE PROCEDURE fecha_a_conta(FECFIN) returning_values (FECFCNT);
FOR SELECT FACO_ID, PREF_PRE, FACO_NUMERO FROM FACTURAS_COMPRA WHERE FACO_ANULADO = 'N' AND
    FACO_FECHA >= :FECINI AND FACO_FECHA <= :FECFIN ORDER BY FACO_ID
    INTO :ID, :PREF, :NUMERO
DO
  BEGIN
  idref = null;
  SELECT ENCO_IDREF FROM COMPROBANTE_ENCABEZADO WHERE ENCO_TIPOREF = 21 AND ENCO_FECHA >= :FECICNT AND ENCO_FECHA <= :FECFCNT and ENCO_IDREF = :id into :idref;
  if (idref IS NULL) then
  begin
   ESTADO = 'PROCESANDO';
   SUSPEND;
   SELECT MAX(INCO_ID) FROM INTERFAZ_COMPRAS WHERE PREF_PRE = :PREF AND TIDO_COD = 21 INTO :IDI;
   EXECUTE PROCEDURE CONTABIL_FACTCOMP (:ID, :IDI) RETURNING_VALUES (:ERROR, VER, :IDC);
   if (ERROR = 0) then
    BEGIN
    EXECUTE PROCEDURE CONTABILIZA_PENDIENTE (:IDC);
    ESTADO = 'OK';
    END
   ELSE
    ESTADO = 'ERROR';
   suspend;
  End
  END
 $$IBE$$*/ SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

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

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE FACTCOMP_SIN_CONTABILIDAD(
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    ID INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    ESTADO VARCHAR(20),
    IDI INTEGER,
    IDC INTEGER)
AS
DECLARE VARIABLE VER CHAR(2);
declare variable FECICNT VARCHAR(10);
declare variable FECFCNT VARCHAR(10);
declare variable ERROR INTEGER;
declare variable idref INTEGER;
BEGIN
EXECUTE PROCEDURE fecha_a_conta(FECINI) returning_values (FECICNT);
EXECUTE PROCEDURE fecha_a_conta(FECFIN) returning_values (FECFCNT);
FOR SELECT FACO_ID, PREF_PRE, FACO_NUMERO FROM FACTURAS_COMPRA WHERE FACO_ANULADO = 'N' AND
    FACO_FECHA >= :FECINI AND FACO_FECHA <= :FECFIN ORDER BY FACO_ID
    INTO :ID, :PREF, :NUMERO
DO
  BEGIN
  idref = null;
  SELECT ENCO_IDREF FROM COMPROBANTE_ENCABEZADO WHERE ENCO_TIPOREF = 21 AND ENCO_FECHA >= :FECICNT AND ENCO_FECHA <= :FECFCNT and ENCO_IDREF = :id into :idref;
  if (idref IS NULL) then
  begin
   ESTADO = 'PROCESANDO';
   SUSPEND;
   SELECT MAX(INCO_ID) FROM INTERFAZ_COMPRAS WHERE PREF_PRE = :PREF AND TIDO_COD = 21 INTO :IDI;
   EXECUTE PROCEDURE CONTABIL_FACTCOMP (:ID, :IDI) RETURNING_VALUES (:ERROR, VER, :IDC);
   if (ERROR = 0) then
    BEGIN
    EXECUTE PROCEDURE CONTABILIZA_PENDIENTE (:IDC);
    ESTADO = 'OK';
    END
   ELSE
    ESTADO = 'ERROR';
   suspend;
  End
  END
END

^

SET TERM ; ^


/* 20090911 */
ALTER TABLE BODEGA
ADD BODE_LOTES T_BOOLEANO;

update bodega set bode_lotes = 'S';
commit work;

SET TERM ^ ;

CREATE OR ALTER procedure SELECCIONE_LOTE (
    ARTICULO varchar(15),
    BODEGA varchar(2),
    CANT numeric(18,4))
returns (
    LOTE varchar(15))
AS
declare variable PEPS VARCHAR(4);
declare variable IDLOTE INTEGER;
declare variable BODLOTE CHAR(1);
BEGIN
SELECT BODE_LOTES FROM BODEGA WHERE BODE_COD = :BODEGA INTO :BODLOTE;
if (BODLOTE = 'S') then
  BEGIN
  EXECUTE PROCEDURE lee_configuracion('INVENTARIO', 'EXISTENCIAS', 'DINAMICA DE LOS LOTES DE MERCANCIA') returning_values (:PEPS);
  if (PEPS = 'PEPS') then
    BEGIN
    SELECT min(LOTE_ID) FROM LOTES WHERE (ARTI_COD = :ARTICULO) AND (BODE_COD = :BODEGA) AND (LOTE_SALDO >= :CANT) INTO :IDLOTE;
    if (IDLOTE > 0) then
        SELECT LOTE_NRO FROM LOTES WHERE LOTE_ID = :IDLOTE INTO :LOTE;
    ELSE
        LOTE = NULL;
    END
  ELSE
    BEGIN
    SELECT MAX(LOTE_ID) FROM LOTES WHERE (ARTI_COD = :ARTICULO) AND (BODE_COD = :BODEGA) AND (LOTE_SALDO >= :CANT) INTO :IDLOTE;
    if (IDLOTE > 0) then
        SELECT LOTE_NRO FROM LOTES WHERE LOTE_ID = :IDLOTE INTO :LOTE;
    ELSE
        LOTE = NULL;
    END
  END
ELSE
  LOTE = '1';
SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER TRIGGER MOVIMIENTO_ARTICULO_BI
AS
declare variable LOTE CHAR(1);
BEGIN
  /* INSERTE EL NUEVO LOTE */
  SELECT ARTI_EXIST
    FROM   ARTICULO
    WHERE  ARTICULO.ARTI_COD = NEW.ARTI_COD
    INTO :LOTE;
  if (LOTE = 'L') then
    BEGIN
      if ((NEW.mvar_lote IS NULL) or (NEW.mvar_lote = '')) then
        if (new.mvar_entrada = 'S') then
            new.mvar_lote = cast(new.mvar_cons as varchar(15));
        else
            begin
            /* NO HAY LOTE, ENTONCES CALCULELO SEGUN CONFIGURACION */
            execute procedure seleccione_lote(new.arti_cod, NEW.bode_cod, NEW.mvar_cant) returning_values(NEW.MVAR_LOTE);
            if (new.mvar_lote is null) then
                EXCEPTION LOTE_NEGATIVO 'No hay un lote del artículo ' || new.arti_cod || ' con existencia suficiente.';
            end
    END
END
^

SET TERM ; ^

/* 20090914 */
/* CAMPANAS EN EL CRM */

CREATE TABLE CRM_CAMPANA_PLANILLA (
    CRCP_ID T_ID NOT NULL,
    CRCP_TIPOCOMP T_ID,
    CRCP_OBS VARCHAR(255),
    CRCP_DIAS SMALLINT);
alter table CRM_CAMPANA_PLANILLA
add constraint PK_CRM_CAMPANA_PLANILLA
primary key (CRCP_ID);

ALTER TABLE CRM_CAMPANA_DETALLE
ADD CRCD_ASESOR T_ID;
ALTER TABLE CRM_COMPROMISOS
ADD CRCO_FECREG DATE;
ALTER TABLE CRM_COMPROMISOS
ADD CRCO_USUARIO T_USUARIO;


SET TERM ^ ;

CREATE OR ALTER TRIGGER CRM_COMPROMISOS_BI FOR CRM_COMPROMISOS
ACTIVE BEFORE INSERT POSITION 0
as
begin
if ((NEW.crco_id = 0) or (NEW.crco_id IS NULL))  then
    NEW.crco_id = gen_id(id_compromiso, 1);
if (NEW.crco_fecreg IS NULL)  then
    NEW.crco_fecreg = cast('now' as DATE);
if (NEW.crco_usuario IS NULL)  then
    NEW.crco_usuario = USER;
end
^

SET TERM ; ^

SET TERM ^ ;

create procedure BUSQUEDA_CAMPANAS (CUMPLIDOS CHAR(1))
returns (ID INTEGER,
    FECINI DATE,
    FECFIN DATE,
    NOMBRE VARCHAR(60),
    ITOK INTEGER,
    ITTOT INTEGER,
    PORCENTA NUMERIC(9,2))
as
begin
FOR SELECT CRCM_ID, CRCM_NOMBRE, CRCM_FECINI, CRCM_FECFIN FROM crm_campana
    INTO :ID, :nombre, :fecini, :fecfin
    DO
    BEGIN
    SELECT COUNT(*) FROM crm_campana_detalle WHERE CRCM_ID = :ID INTO :ittot;
    SELECT COUNT(*) FROM crm_campana_detalle D, crm_compromisos C
        WHERE CRCM_ID = :ID AND C.crco_id = D.crcd_evento AND C.crco_cumplido = 'S'
        INTO :itok;
    PORCENTA = ITOK * 100 / ITTOT;
    if ((CUMPLIDOS = 'S') or (ITTOT > ITOK)) then
        suspend;
    END
end
^

SET TERM ; ^

grant EXECUTE on procedure BUSQUEDA_CAMPANAS to PUBLIC;


ALTER TABLE CRM_CAMPANA_PLANILLA ADD CRCP_ITEM T_ID NOT NULL ;
ALTER TABLE CRM_CAMPANA_PLANILLA DROP CONSTRAINT PK_CRM_CAMPANA_PLANILLA;
alter table CRM_CAMPANA_PLANILLA add constraint PK_CRM_CAMPANA_PLANILLA primary key (CRCP_ID,CRCP_ITEM);
ALTER TABLE CRM_CAMPANA_PLANILLA ADD CRCP_DURACION SMALLINT;
ALTER TABLE CRM_CAMPANA ADD CRCM_ANULADO T_BOOLEANO;
ALTER TABLE CRM_CAMPANA ADD CRCM_USUARIO T_USUARIO;
ALTER TABLE CRM_CAMPANA
ADD CRCM_FECHA DATE;
ALTER TABLE CRM_CAMPANA
ADD CRCM_NITINI T_NIT;
ALTER TABLE CRM_CAMPANA
ADD CRCM_NITFIN T_NIT;
ALTER TABLE CRM_CAMPANA
ADD CRCM_NOMINI T_CONCEPTO;
ALTER TABLE CRM_CAMPANA
ADD CRCM_NOMFIN T_CONCEPTO;
ALTER TABLE CRM_CAMPANA
ADD CRCM_VENINI T_ID;
ALTER TABLE CRM_CAMPANA
ADD CRCM_VENFIN T_ID;
ALTER TABLE CRM_CAMPANA
ADD CRCM_COBINI T_ID;
ALTER TABLE CRM_CAMPANA
ADD CRCM_COBFIN T_ID;
ALTER TABLE CRM_CAMPANA
ADD CRCM_ZONINI VARCHAR(2);
ALTER TABLE CRM_CAMPANA
ADD CRCM_ZONFIN VARCHAR(2);
ALTER TABLE CRM_CAMPANA
ADD CRCM_CLAINI T_ID;
ALTER TABLE CRM_CAMPANA
ADD CRCM_CLAFIN T_ID;
ALTER TABLE CRM_CAMPANA
ADD CRCM_AGRINI T_ID;
ALTER TABLE CRM_CAMPANA
ADD CRCM_AGRFIN T_ID;
ALTER TABLE CRM_CAMPANA
ADD CRCM_TIPINI T_ID;
ALTER TABLE CRM_CAMPANA
ADD CRCM_TIPFIN T_ID;
ALTER TABLE CRM_CAMPANA
ADD CRCM_OBS BLOB SUB_TYPE 1 SEGMENT SIZE 8192;
alter table CRM_CAMPANA_PLANILLA
add constraint FK_CRM_CAMPANA_PLANILLA_1 foreign key (CRCP_ID) references CRM_CAMPANA(CRCM_ID) on delete CASCADE on update CASCADE;
ALTER TABLE CRM_CAMPANA_PLANILLA
ADD CRCP_HORAINI TIME;
ALTER TABLE CRM_CAMPANA_PLANILLA
ADD CRCP_ASESOR T_ID;

SET TERM ^ ;

create trigger CRM_CAMPANA_BI for CRM_CAMPANA
active BEFORE INSERT position 0
as
declare variable nit varchar(20);
declare variable clase integer;
declare variable agrupa integer;
declare variable tipo integer;
declare variable zona varchar(2);
declare variable vend integer;
declare variable cobr integer;
declare variable idcompr integer;
declare variable tipoeven integer;
declare variable fecini date;
declare variable Horaini time;
declare variable dura integer;
declare variable dias integer;
declare variable obs varchar(1024);
declare variable asesor integer;
begin
if (new.crcm_nitini is null) then
    new.crcm_nitini = '';
if (new.crcm_nitfin is null) then
    new.crcm_nitfin = 'zzz';
if (new.crcm_nomini is null) then
    new.crcm_nomini = '';
if (new.crcm_nomfin is null) then
    new.crcm_nomfin = 'zzz';
if (new.crcm_venini is null) then
    new.crcm_venini = 0;
if (new.crcm_venfin is null) then
    new.crcm_venfin = 99999;
if (new.crcm_cobini is null) then
    new.crcm_cobini = 0;
if (new.crcm_cobfin is null) then
    new.crcm_cobfin = 99999;
if (new.crcm_zonini is null) then
    new.crcm_zonini = '';
if (new.crcm_zonfin is null) then
    new.crcm_zonfin = 'zz';
if (new.crcm_claini is null) then
    new.crcm_claini = 0;
if (new.crcm_clafin is null) then
    new.crcm_clafin = 99999;
if (new.crcm_agrini is null) then
    new.crcm_agrfin = 0;
if (new.crcm_tipini is null) then
    new.crcm_tipfin = 99999;
/* recorra los detalles del plan */
fecini = new.crcm_fecha;
for select crcp_tipocomp, crcp_horaini, crcp_duracion, crcp_dias, crcp_obs, crcp_asesor
    from crm_campana_planilla
    where crcp_id = new.crcm_id into :tipoeven, :horaini, :dura, :dias, :obs, :asesor
    do
    begin
    /* recorra los clientes del rango e inserte un compromiso por cada detalle del plan */
    for select crcl_nit, crcl_clase, crcl_agrupa, crcl_tiporela from crm_clientes
        where crcl_nit >= new.crcm_nitini and crcl_nit <= new.crcm_nitfin and
        crcl_nom >= new.crcm_nomini and crcl_nom <= new.crcm_nomfin
        into :nit, :clase, :agrupa, :tipo
        do
        begin
        select zona_cod, vend_cod, cobr_cod from clientes where terc_nit = :nit into :zona, :vend, :cobr;
        if (((new.crcm_claini = 0) and (new.crcm_clafin = 99999)) or ((:clase >= new.crcm_claini) and (:clase <= new.crcm_clafin))) then
          if (((new.crcm_agrini = 0) and (new.crcm_agrfin = 99999)) or ((:agrupa >= new.crcm_agrini) and (:agrupa <= new.crcm_agrfin))) then
            if (((new.crcm_agrini = 0) and (new.crcm_agrfin = 99999)) or ((:tipo >= new.crcm_tipini) and (:tipo <= new.crcm_tipfin))) then
               if (((new.crcm_zonini = '') and (new.crcm_zonfin = 'zz')) or ((:zona >= new.crcm_zonini) and (:zona <= new.crcm_zonfin))) then
                 if (((new.crcm_venini = 0) and (new.crcm_venfin = 99999)) or ((:vend >= new.crcm_venini) and (:vend <= new.crcm_venfin))) then
                   if (((new.crcm_cobini = 0) and (new.crcm_cobfin = 99999)) or ((:cobr >= new.crcm_cobini) and (:cobr <= new.crcm_cobfin))) then
                     begin
                     idcompr = gen_id(id_compromiso, 1);
                     insert into crm_compromisos (crco_id, crco_nit, crco_fecha, crco_hora, crco_tipo, crco_obs, crco_asesor, crco_cumplido, crco_horaaviso, crco_contacto, crco_anulado, crco_prioridad, crco_fecreg, crco_usuario)
                        values (:idcompr, :nit, :fecini, :horaini, :tipoeven, :obs, :asesor, 'N', :horaini, null, 'N', 'N', new.crcm_fecha, user);
                     insert into crm_campana_detalle (crcm_id, crcd_cliente, crcd_contactado, crcd_feccontac, crcd_evento, crcd_asesor)
                        values (new.crcm_id, :nit, 'N', :fecini, :idcompr, :asesor);
                     horaini = :horaini + :dura;
                     end
          end
    fecini = :fecini + :dias;
    end
end
^

SET TERM ; ^

CREATE SEQUENCE ID_CAMPANA;

SET TERM ^ ;

create trigger CRM_CAMPANA_AI for CRM_CAMPANA
active AFTER INSERT position 0
as
declare variable nit varchar(20);
declare variable clase integer;
declare variable agrupa integer;
declare variable tipo integer;
declare variable zona varchar(2);
declare variable vend integer;
declare variable cobr integer;
declare variable idcompr integer;
declare variable tipoeven integer;
declare variable fecini date;
declare variable Horaini time;
declare variable dura integer;
declare variable dias integer;
declare variable obs varchar(1024);
declare variable asesor integer;
begin
/* recorra los detalles del plan */
fecini = new.crcm_fecha;
for select crcp_tipocomp, crcp_horaini, crcp_duracion, crcp_dias, crcp_obs, crcp_asesor
    from crm_campana_planilla
    where crcp_id = new.crcm_id into :tipoeven, :horaini, :dura, :dias, :obs, :asesor
    do
    begin
    /* recorra los clientes del rango e inserte un compromiso por cada detalle del plan */
    for select crcl_nit, crcl_clase, crcl_agrupa, crcl_tiporela from crm_clientes
        where crcl_nit >= new.crcm_nitini and crcl_nit <= new.crcm_nitfin and
        crcl_nom >= new.crcm_nomini and crcl_nom <= new.crcm_nomfin
        into :nit, :clase, :agrupa, :tipo
        do
        begin
        select zona_cod, vend_cod, cobr_cod from clientes where terc_nit = :nit into :zona, :vend, :cobr;
        if (((new.crcm_claini = 0) and (new.crcm_clafin = 99999)) or ((:clase >= new.crcm_claini) and (:clase <= new.crcm_clafin))) then
          if (((new.crcm_agrini = 0) and (new.crcm_agrfin = 99999)) or ((:agrupa >= new.crcm_agrini) and (:agrupa <= new.crcm_agrfin))) then
            if (((new.crcm_agrini = 0) and (new.crcm_agrfin = 99999)) or ((:tipo >= new.crcm_tipini) and (:tipo <= new.crcm_tipfin))) then
               if (((new.crcm_zonini = '') and (new.crcm_zonfin = 'zz')) or ((:zona >= new.crcm_zonini) and (:zona <= new.crcm_zonfin))) then
                 if (((new.crcm_venini = 0) and (new.crcm_venfin = 99999)) or ((:vend >= new.crcm_venini) and (:vend <= new.crcm_venfin))) then
                   if (((new.crcm_cobini = 0) and (new.crcm_cobfin = 99999)) or ((:cobr >= new.crcm_cobini) and (:cobr <= new.crcm_cobfin))) then
                     begin
                     idcompr = gen_id(id_compromiso, 1);
                     insert into crm_compromisos (crco_id, crco_nit, crco_fecha, crco_hora, crco_tipo, crco_obs, crco_asesor, crco_cumplido, crco_horaaviso, crco_contacto, crco_anulado, crco_prioridad, crco_fecreg, crco_usuario)
                        values (:idcompr, :nit, :fecini, :horaini, :tipoeven, :obs, :asesor, 'N', :horaini, null, 'N', 'N', new.crcm_fecha, user);
                     insert into crm_campana_detalle (crcm_id, crcd_cliente, crcd_contactado, crcd_feccontac, crcd_evento, crcd_asesor)
                        values (new.crcm_id, :nit, 'N', :fecini, :idcompr, :asesor);
                     horaini = :horaini + :dura;
                     end
          end
    fecini = :fecini + :dias;
    end
end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER CRM_CAMPANA_BI FOR CRM_CAMPANA
ACTIVE BEFORE INSERT POSITION 0
as
begin
if (new.crcm_nitini is null) then
    new.crcm_nitini = '';
if (new.crcm_nitfin is null) then
    new.crcm_nitfin = 'zzz';
if (new.crcm_nomini is null) then
    new.crcm_nomini = '';
if (new.crcm_nomfin is null) then
    new.crcm_nomfin = 'zzz';
if (new.crcm_venini is null) then
    new.crcm_venini = 0;
if (new.crcm_venfin is null) then
    new.crcm_venfin = 99999;
if (new.crcm_cobini is null) then
    new.crcm_cobini = 0;
if (new.crcm_cobfin is null) then
    new.crcm_cobfin = 99999;
if (new.crcm_zonini is null) then
    new.crcm_zonini = '';
if (new.crcm_zonfin is null) then
    new.crcm_zonfin = 'zz';
if (new.crcm_claini is null) then
    new.crcm_claini = 0;
if (new.crcm_clafin is null) then
    new.crcm_clafin = 99999;
if (new.crcm_agrini is null) then
    new.crcm_agrfin = 0;
if (new.crcm_tipini is null) then
    new.crcm_tipfin = 99999;
if ((NEW.crcm_id = 0) or (NEW.crcm_id IS NULL))  then
    NEW.crcm_id = gen_id(id_campana, 1);
if (NEW.crcm_fecha IS NULL)  then
    NEW.crcm_fecha = cast('now' as DATE);
if (NEW.crcm_usuario IS NULL)  then
    NEW.crcm_usuario = USER;
end
^

SET TERM ; ^


/* 20090915 */
/* CONSULTA DE CARTERA DESDE RECIBOS O CLIENTES SOLO POR AGENCIA */
SET TERM ^ ;

CREATE OR ALTER procedure CARTERA_CLIENTE (
    NIT varchar(20),
    FECHA date,
    SUCURSAL varchar(10),
    MONEDA integer,
    SOLOPESOS char(1),
    AGENCIA INTEGER)
returns (
    TIPO integer,
    ID integer,
    PREFIJO varchar(4),
    NUMERO varchar(6),
    CONCEPTO varchar(60),
    SALDO numeric(18,2),
    RTFTE numeric(18,2),
    RTIVA numeric(18,2),
    RTICA numeric(18,2),
    DTOF numeric(18,2),
    TIPONOM varchar(8),
    VENCE date,
    FECDOC date,
    DIAS integer,
    RECPROV_ID integer,
    RECIPROV char(1),
    NOTA varchar(256),
    TRMDOC numeric(18,2))
AS
declare variable FEC DATE;
declare variable DESC_RTES CHAR(2);
declare variable DTOAPL NUMERIC(18,2);
declare variable TRMREC NUMERIC(18,2);
declare variable IDNOTA INTEGER;
declare variable AUTORET VARCHAR(10);
declare variable FAUTORET DATE;
declare variable DIASCONT INTEGER;
BEGIN
EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'FECHA AUTORETENEDOR NO DESCONTAR RETENCIONES DEL SALDO PERO SI CONTABILIZARLAS') returning_values (AUTORET);
if (AUTORET <> '') then
    FAUTORET = CAST(AUTORET AS DATE);
else
    FAUTORET = '9999/12/31';
EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'NUMERO DE DIAS PARA CONSULTA DE CARTERA DE CLIENTES DE CONTADO') returning_values (:diascont);
if ((DIASCONT <> 0) AND (NOT EXISTS (select ptvt_id from punto_venta where terc_nit = :nit))) then
    DIASCONT = 0;
EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'DESCONTAR RETENCIONES POR CAUSACION') returning_values (DESC_RTES);
  /* BUSQUE EN SALDOS_DOC_CARTERA LOS QUE TENGAN SALDO > 0 */
  FOR SELECT MVCL_TIPOREF, MVCL_IDREF, MVCL_FECHA, MVCL_VENCE, MVCL_PREFREF, MVCL_NUMREF, MVCL_CONC, MVCL_TRM
  FROM MOVIMIENTO_CLIENTES
  WHERE TERC_NIT = :NIT AND mvcl_sucursal = :sucursal and MVCL_FECHA <= :FECHA AND MVCL_ABONO = 'N' AND
    ((:MONEDA = 0) or (MVCL_TRM <> 1)) AND ((MVCL_FECHA >= (:FECHA - :DIASCONT)) or (:DIASCONT = 0)) AND
    ((:AGENCIA = 0) or (SUCU_ID = :AGENCIA) or (SUCU_ID = 0))
  INTO :TIPO, :ID, :FECDOC, :VENCE, :PREFIJO, :NUMERO, :CONCEPTO, :TRMDOC
    DO
    BEGIN
    DIAS = (FECHA -VENCE );
    EXECUTE PROCEDURE saldo_doc_cartera(TIPO, ID, FECHA, MONEDA) returning_values (SALDO);
    if (SALDO <> 0) then
        BEGIN
        SELECT TIDO_NOMCORTO FROM TIPO_DOCUMENTO WHERE TIDO_COD = :TIPO INTO :TIPONOM;
        if (TIPO = 41) then
            SELECT NDCL_DTOFMONTO, NDCL_FECHADTO FROM NOTAS_DEBITO_CLIENTES WHERE NDCL_ID = :ID INTO :DTOF, :FEC;
        if (TIPO = 42) then
            SELECT 0, NCCL_FECHA FROM NOTAS_CREDITO_CLIENTES WHERE NCCL_ID = :ID INTO :DTOF, :FEC;
        if (TIPO = 45) then
            SELECT ANCL_DTOFMONTO, ANCL_DTOFECHA FROM ANTICIPOS_CLIENTE WHERE ANCL_ID = :ID INTO :DTOF, :FEC;
        if (TIPO = 31) then
            SELECT FACT_DTOFMONTO, FACT_DTOFFECHA FROM FACTURAS WHERE FACT_ID = :ID INTO :DTOF, :FEC;
        if (TIPO = 33) then
            SELECT 0, :FECHA FROM devoluciones_ventas WHERE DEVT_ID = :ID INTO :DTOF, :FEC;
        if ((MONEDA <> 0) AND (TRMDOC <> 0)) then
            DTOF = DTOF / TRMDOC;

        /* POR WILLIAM IDENTIFICAR SI EL DOCUMENTO TIENE RECIBO PROVISIONAL*/
        recprov_id = 0;
        SELECT max(RCPR_ID) FROM recibo_provisional_detalle WHERE RPDE_IDDOC = :ID AND RPDE_TIPODOC = :TIPO and RPDE_ANULADO = 'N' INTO :recprov_id;
        if /*(recprov_id = 0) or */(recprov_id is null) then
           BEGIN
           reciprov = 'N';
           end 
        ELSE
          begin 
           reciprov = 'S';
          END
        /*FIN WILLIAM*/
        if (FECHA > FEC) then
            DTOF = 0;
        if (DTOF IS NULL) then
            DTOF = 0;
        if (DTOF <> 0) then
            BEGIN
            SELECT SUM(RCDE_DTOF), MAX(RECA_TRM) FROM RECIBOS_CAJA_DETALLE D, RECIBOS_CAJA R
                WHERE R.reca_id = D.reca_id AND RCDE_IDDOC = :ID AND RCDE_TIPODOC = :TIPO
                INTO :DTOAPL, :TRMREC;
            if (DTOAPL IS NULL) then
                DTOAPL = 0;
            if ((MONEDA <> 0) AND (TRMREC <> 0)) then
                DTOAPL = DTOAPL / TRMREC;
            DTOF = DTOF - DTOAPL;
            END
        if (MONEDA = 0) then
            SELECT SUM(SDCA_RTFTE - SDCA_ABRTFTE), SUM(SDCA_RTIVA - SDCA_ABRTIVA), SUM(SDCA_RTICA - SDCA_ABRTICA)
                FROM SALDOS_DOC_CARTERA WHERE SDCA_TIPOREF = :TIPO AND SDCA_IDREF = :ID
                INTO :RTFTE, :RTIVA, :RTICA;
        ELSE
            SELECT SUM((SDCA_RTFTE - SDCA_ABRTFTE)/SDCA_TRM), SUM((SDCA_RTIVA - SDCA_ABRTIVA)/SDCA_TRM), SUM((SDCA_RTICA - SDCA_ABRTICA)/SDCA_TRM)
                FROM SALDOS_DOC_CARTERA WHERE SDCA_TIPOREF = :TIPO AND SDCA_IDREF = :ID
                INTO :RTFTE, :RTIVA, :RTICA;
        if (RTFTE IS NULL) then
            RTFTE = 0;
        if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) THEN
            BEGIN
            if (RTFTE > 0) then
                RTFTE = 0;
            END
        ELSE
            BEGIN
            if (RTFTE < 0) then
                RTFTE = 0;
            END

        if (RTIVA IS NULL) then
            RTIVA = 0;
        if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) THEN
            BEGIN
            if (RTIVA > 0) then
                RTIVA = 0;
            END
        ELSE
            BEGIN
            if (RTIVA < 0) then
                RTIVA = 0;
            END

        if (RTICA IS NULL) then
            RTICA = 0;
        if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) THEN
            BEGIN
            if (RTICA > 0) then
                RTICA = 0;
            END
        ELSE
            BEGIN
            if (RTICA < 0) then
                RTICA = 0;
            END

        if (FAUTORET <= FECDOC) then
            BEGIN
            RTFTE = 0;
            RTIVA = 0;
            RTICA = 0;
            END
        /* RESTE LAS RETENCIONES YA QUE SE SUGERIRAN */
        if (DESC_RTES = 'NO') then
            SALDO = SALDO - RTFTE - RTIVA - RTICA;
        /* SI TIENE NOTA AGREGUELA */
        SELECT MAX(NOCL_ID) FROM NOTAS_CLIENTES WHERE TERC_NIT = :NIT AND CLSU_COD = :SUCURSAL AND NOCL_TIPODOC = :TIPO AND NOCL_IDDOC = :ID INTO :IDNOTA;
        if (IDNOTA IS NOT NULL) then
            SELECT NOCL_TEXTO FROM NOTAS_CLIENTES WHERE NOCL_ID = :IDNOTA INTO :NOTA;
        else
            NOTA = '';
        if ((SOLOPESOS = 'N') or (TRMDOC = 1)) then
            SUSPEND;
        END
    END
END
^

SET TERM ; ^


/* 20090915b */
/* SE AGREGO EL DATO DESPACHAR A */

SET TERM ^ ;

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

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

SET TERM ; ^


/* 20090916 */
/* ERROR AL SUBIR LOS COSTOS CON IMPOCONSUMO */
/*
UPDATE CONFIGURACION
SET CONF_VALOR = 'AVISAR'
WHERE (CONF_MODULO = 'INVENTARIO') AND (CONF_CATEGORIA = 'EXISTENCIAS') AND (CONF_PROPIEDAD = 'ACCION A TOMAR SI LA EXISTENCIA ES INSUFICIENTE');


UPDATE ENTRADAS_DETALLE E SET ENDE_COSTO = ENDE_COSTO - (SELECT ARTI_CONSUMO FROM ARTICULO WHERE ARTI_COD = E.arti_cod)*ENDE_FACTOR WHERE ENDE_ANULADO = 'N' AND EXISTS (SELECT ARTI_COD FROM ARTICULO WHERE ARTI_CONSUMO <> 0);

UPDATE CONFIGURACION
SET CONF_VALOR = 'PROHIBIR'
WHERE (CONF_MODULO = 'INVENTARIO') AND (CONF_CATEGORIA = 'EXISTENCIAS') AND (CONF_PROPIEDAD = 'ACCION A TOMAR SI LA EXISTENCIA ES INSUFICIENTE');

COMMIT WORK;
*/
/* ERROR AL CALCULAR PRECIOS AUTOMATICOS CON VA E IMPOCONSUMO */
SET TERM ^ ;

CREATE OR ALTER TRIGGER PRECIOS_ARTICULO_BU FOR PRECIOS_ARTICULO
ACTIVE BEFORE UPDATE POSITION 0
as
declare variable UNIDAD VARCHAR(8);
declare variable UOR VARCHAR(20);
declare variable DIG INTEGER;
declare variable IVAINC CHAR(1);
declare variable TARIVA NUMERIC(9,4);
declare variable CAMBIO CHAR(7);
declare variable BASE VARCHAR(10);
declare variable REP CHAR(2);
declare variable COSTOP NUMERIC(18, 2);
declare variable COSTOU NUMERIC(18, 2);
declare variable COSTO NUMERIC(18, 2);
declare variable CONSUMO NUMERIC(18, 2);
declare variable LISTA INTEGER;
declare variable PRECIO NUMERIC(18, 4);
declare variable IVAINC1 CHAR(1);
begin
if (NEW.prar_auto = 'S') then
    BEGIN
    EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION','ARTICULOS','CAMBIO DE PRECIOS AUTOMATICO AL CAMBIAR COSTO O PRECIO') returning_values (CAMBIO);
    EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION', 'ARTICULOS', 'SUGERIR PRECIOS CON PORCENTAJE DE MARGEN O UTILIDAD') RETURNING_VALUES (:UOR);
    EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION', 'ARTICULOS', 'REDONDEO AL MULTIPLO DE DIEZ EN PRECIOS') RETURNING_VALUES (:DIG);
    EXECUTE PROCEDURE LEE_CONFIGURACION('INVENTARIO', 'ARTICULOS', 'REPLICAR CAMBIOS EN ARTICULOS') RETURNING_VALUES (:REP);
    SELECT LIPR_MODIF FROM LISTA_PRECIOS L
        WHERE LIPR_COD = NEW.LIPR_COD INTO :IVAINC;
    
    if (CAMBIO <> 'PRECIO') then
      begin
      if (REP <> 'SI') then
        BEGIN
        SELECT ARTI_UNIDAD, TAIV_PORC, ARTI_CONSUMO FROM ARTICULO A, TARIFA_IVA T
            WHERE A.TAIV_COD = T.TAIV_COD AND ARTI_COD = NEW.arti_cod INTO :UNIDAD, :TARIVA, :CONSUMO;
        EXECUTE PROCEDURE lee_configuracion('FACTURACION','ARTICULOS','COSTO BASE PARA CALCULO DE PRECIOS DE VENTA AUTOMATICOS') returning_values (:BASE);
        EXECUTE PROCEDURE costo_promedio_y_ultimo (NEW.arti_cod, 'NOW') RETURNING_VALUES(:COSTOP, :COSTOU);
        if (base = 'ULTIMO') then
            COSTO = COSTOU;
        ELSE
            BEGIN
            COSTO = COSTOP;
            if (base = 'MAYOR') then
                if (COSTOP < COSTOU) then
                    COSTO = COSTOU;
            END
        if (IVAINC = 'S') then
            COSTO = COSTO * (1 + TARIVA/100) + consumo;
            
        if (UOR = 'UTILIDAD') then
            BEGIN
            COSTO = COSTO * (1 + NEW.prar_util/100);
            EXECUTE PROCEDURE REDONDEE (COSTO, DIG) returning_values (COSTO);
            new.prar_fijo = :COSTO;
            END
        ELSE
            BEGIN
            COSTO = COSTO / (1 - NEW.prar_margen/100);
            EXECUTE PROCEDURE REDONDEE (COSTO, DIG) returning_values (COSTO);
            NEW.PRAR_FIJO = :COSTO;
            END
        END
      end
    else
        begin
        /* PRECIO */
        EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION','ARTICULOS','CODIGO DE LA LISTA DE PRECIOS BASE PARA CAMBIO DE PRECIOS AUTOMATICO') returning_values (LISTA);
        if (NEW.lipr_cod <> :LISTA) then
            BEGIN
            SELECT PRAR_FIJO FROM PRECIOS_ARTICULO WHERE LIPR_COD = :LISTA AND ARTI_COD = NEW.arti_cod INTO :PRECIO;
            SELECT LIPR_MODIF FROM LISTA_PRECIOS L
                WHERE LIPR_COD = :lista INTO :IVAINC1;
            if (ivainc = 'S') then
                if (IVAINC1 = 'S') then
                    NEW.prar_fijo = precio;
                else
                    NEW.prar_fijo = precio * (1 + TARIVA/100);
            ELSE
                if (IVAINC1 = 'S') then
                    NEW.prar_fijo = precio / (1 + TARIVA/100);
                else
                    NEW.prar_fijo = precio;
            if (UOR = 'UTILIDAD') then
                NEW.prar_fijo = NEW.prar_fijo * (1 + NEW.prar_util/100);
            ELSE
                NEW.prar_fijo = NEW.prar_fijo / (1 - NEW.prar_margen/100);
            EXECUTE PROCEDURE REDONDEE (NEW.prar_fijo, DIG) returning_values (NEW.prar_fijo);
            END
        end
    END
end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER PROCEDURE CALCULA_PRECIOS(
    ARTICULO VARCHAR(20),
    FECHA DATE)
AS
declare variable LISTA INTEGER;
declare variable MARGEN NUMERIC(9, 4);
declare variable UTIL NUMERIC(9, 4);
declare variable UNIDAD VARCHAR(8);
declare variable UOR VARCHAR(20);
declare variable COSTOP NUMERIC(18, 2);
declare variable COSTOU NUMERIC(18, 2);
declare variable COSTO NUMERIC(18, 2);
declare variable CONSUMO NUMERIC(18, 2);
declare variable DIG INTEGER;
declare variable IVAINC CHAR(1);
declare variable TARIVA NUMERIC(9,2);
declare variable AUTOM CHAR(1);
declare variable BASE varchar(10);
declare variable CAMBIO CHAR(7);
BEGIN
EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION','ARTICULOS','CAMBIO DE PRECIOS AUTOMATICO AL CAMBIAR COSTO O PRECIO') returning_values (CAMBIO);
if (CAMBIO = 'COSTO') then
  BEGIN
  FOR SELECT P.LIPR_COD, PRAR_MARGEN, PRAR_UTIL, LIPR_MODIF, PRAR_AUTO
    FROM PRECIOS_ARTICULO P, LISTA_PRECIOS L
    WHERE P.LIPR_COD = L.LIPR_COD AND ARTI_COD = :articulo
    INTO :LISTA, :MARGEN, :UTIL, :IVAINC, :AUTOM
    DO
      if (AUTOM = 'S') then
        BEGIN
        if (UTIL IS NULL) then
            UTIL = 0;
        if (MARGEN IS NULL) then
            MARGEN = 0;
        SELECT ARTI_UNIDAD, TAIV_PORC, ARTI_CONSUMO FROM ARTICULO A, TARIFA_IVA T
            WHERE A.TAIV_COD = T.TAIV_COD AND ARTI_COD = :ARTICULO INTO :UNIDAD, :TARIVA, :CONSUMO;
        EXECUTE PROCEDURE lee_configuracion('FACTURACION','ARTICULOS','COSTO BASE PARA CALCULO DE PRECIOS DE VENTA AUTOMATICOS') returning_values (:BASE);
        EXECUTE PROCEDURE costo_promedio_y_ultimo (:ARTICULO, :FECHA) RETURNING_VALUES(:COSTOP, :COSTOU);
        if (base = 'ULTIMO') then
            COSTO = COSTOU;
        ELSE
            BEGIN
            COSTO = COSTOP;
            if (base = 'MAYOR') then
                if (COSTOP < COSTOU) then
                    COSTO = COSTOU;
            END
        if (IVAINC = 'S') then
            COSTO = COSTO * (1 + TARIVA/100) + consumo;
        EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION', 'ARTICULOS', 'SUGERIR PRECIOS CON PORCENTAJE DE MARGEN O UTILIDAD') RETURNING_VALUES (:UOR);
        EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION', 'ARTICULOS', 'REDONDEO AL MULTIPLO DE DIEZ EN PRECIOS') RETURNING_VALUES (:DIG);
        if (UOR = 'UTILIDAD') then
            BEGIN
            COSTO = COSTO * (1 + :UTIL/100);
            EXECUTE PROCEDURE REDONDEE (COSTO, DIG) returning_values (COSTO);
            UPDATE PRECIOS_ARTICULO
                SET PRAR_FIJO = :COSTO
                WHERE ARTI_COD = :ARTICULO AND LIPR_COD = :LISTA;
            END
        ELSE
            BEGIN
            COSTO = COSTO / (1 - :MARGEN/100);
            EXECUTE PROCEDURE REDONDEE (COSTO, DIG) returning_values (COSTO);
            UPDATE PRECIOS_ARTICULO
                SET PRAR_FIJO = :COSTO
                WHERE ARTI_COD = :ARTICULO AND LIPR_COD = :LISTA;
            END
        END
  END
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE CAMBIO_PRECIOS(
    FECHA DATE)
AS
declare variable ART VARCHAR(20);
BEGIN /*$$IBE$$ 
FOR SELECT ARTI_COD FROM ARTICULO INTO :ART DO
    EXECUTE PROCEDURE CALCULA_PRECIOS(:ART, :FECHA);
  SUSPEND;
 $$IBE$$*/ EXIT;
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE CAMBIO_PRECIOS(
    FECHA DATE)
AS
declare variable ART VARCHAR(20);
BEGIN
FOR SELECT ARTI_COD FROM ARTICULO INTO :ART DO
    EXECUTE PROCEDURE CALCULA_PRECIOS(:ART, :FECHA);
  SUSPEND;
END

^

SET TERM ; ^

SET TERM ^ ;

ALTER TRIGGER DESENSAMBLES_DETALLE_AI
AS
declare variable fec date;
declare variable CONC VARCHAR(60);
declare variable factor numeric(18,4);
declare variable COSTO numeric(18,2);
declare variable Pref varchar(4);
declare variable Num varchar(6);
declare variable CANT NUMERIC(18,2);
declare variable CANTOT CHAR(2);
BEGIN
  if ((NEW.DESE_id <> 0) and (new.dede_anulado = 'N')) then
    begin
    select dese_fecha, dese_conc, pref_pre, dese_numero, dese_cant * dese_factor
        from desensambles where dese_id = new.dese_id into :fec, :conc, :Pref, :Num, :CANT;
    execute procedure factor_unidad_cant(new.arti_cod, new.dede_unidad) returning_values(factor);
    execute procedure costo_promedio(new.arti_cod, :FEC) returning_values (:COSTO);
    EXECUTE PROCEDURE LEE_CONFIGURACION('INVENTARIO', 'ENSAMBLES', 'FORMACIONES CON CANTIDADES TOTALES') returning_values (:CANTOT);
    if (CANTOT <> 'SI') then
        CANT = CANT * factor * new.dede_cant;
    ELSE
        CANT = factor * new.dede_cant;
    INSERT INTO MOVIMIENTO_ARTICULO
      (ARTI_COD, MVAR_CONS, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM)
      VALUES(NEW.ARTI_COD, GEN_ID(ID_MOVARTI,1), NEW.BODE_COD, :FEC, 16, NEW.dese_id,
      :CONC, :CANT, :COSTO, 'S', new.dede_lote, :Pref, :Num, new.dese_item);

    /* RECORRA LAS LISTAS DE PRECIOS Y CAMBIE EL PRECIO */
    EXECUTE PROCEDURE CALCULA_PRECIOS(NEW.ARTI_COD, :fec);
    END
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER TRIGGER DESENSAMBLES_DETALLE_AU
AS
declare variable fec date;
declare variable CONC VARCHAR(60);
declare variable Pref varchar(4);
declare variable Num varchar(6);
declare variable factor numeric(18,4);
declare variable COSTO numeric(18,2);
declare variable CANT NUMERIC(18,2);
declare variable CANTOT CHAR(2);
BEGIN
/* Anule el anterior */
if ((OLD.DESE_ID <> 0) AND (OLD.dede_anulado = 'N')) then
    delete from movimiento_articulo where (mvar_tipodoc = 16) and (mvar_idref = old.DESE_id) and (mvar_item = old.dese_item);
if ((NEW.dese_id <> 0) AND (new.dede_anulado = 'N')) then
    BEGIN
    EXECUTE PROCEDURE LEE_CONFIGURACION('INVENTARIO', 'ENSAMBLES', 'FORMACIONES CON CANTIDADES TOTALES') returning_values (:CANTOT);
    select dese_fecha, dese_conc, pref_pre, dese_numero, dese_cant * dese_factor
        from desensambles where dese_id = new.dese_id into :fec, :conc, :Pref, :Num, :CANT;
    execute procedure factor_unidad_cant(new.arti_cod, new.dede_unidad) returning_values(factor);
    execute procedure costo_promedio(new.arti_cod, :FEC) returning_values (:COSTO);
    if (CANTOT <> 'SI') then
        CANT = CANT * factor * new.dede_cant;
    ELSE
        CANT = factor * new.dede_cant;
    INSERT INTO MOVIMIENTO_ARTICULO
        (ARTI_COD, MVAR_CONS, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM)
        VALUES(NEW.ARTI_COD, GEN_ID(ID_MOVARTI,1), NEW.BODE_COD, :FEC, 16, NEW.dese_id,
        :CONC, :CANT, :COSTO, 'S', new.dede_lote, :Pref, :Num, new.dese_item);

    /* RECORRA LAS LISTAS DE PRECIOS Y CAMBIE EL PRECIO */
    EXECUTE PROCEDURE CALCULA_PRECIOS(NEW.ARTI_COD, :fec);
    END
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER TRIGGER ENSAMBLES_AI
AS
declare variable COSTO NUMERIC(18,2);
BEGIN
if ((NEW.ENSA_id <> 0) and (new.ensa_anulado = 'N')) then
  begin
  COSTO = new.ensa_costo / NEW.ensa_factor;
  INSERT INTO MOVIMIENTO_ARTICULO
    (ARTI_COD, MVAR_CONS, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM)
    VALUES(NEW.ARTI_COD, GEN_ID(ID_MOVARTI,1), new.bode_cod, new.ensa_fecha, 15, NEW.ensa_id,
    new.ensa_conc, NEW.ensa_factor * new.ensa_cant, :COSTO, 'S', new.ensa_lote, new.pref_pre, new.ensa_numero, 0);

  /* RECORRA LAS LISTAS DE PRECIOS Y CAMBIE EL PRECIO */
  EXECUTE PROCEDURE CALCULA_PRECIOS(NEW.ARTI_COD, new.ensa_fecha);

  /* ingrese el retal */
  if ((new.ensa_codretal is not null) and (new.ensa_codretal <> '')) then
      INSERT INTO MOVIMIENTO_ARTICULO
        (ARTI_COD, MVAR_CONS, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM)
        VALUES(NEW.ensa_codretal, GEN_ID(ID_MOVARTI,1), new.bode_cod, new.ensa_fecha, 15, NEW.ensa_id,
        new.ensa_conc, new.ensa_cantretal, :COSTO, 'S', new.ensa_lote, new.pref_pre, new.ensa_numero, 999);

  INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
    VALUES (USER, 15, NEW.ensa_id, 'I', NEW.pref_pre || NEW.ensa_numero);
  end
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER TRIGGER ENSAMBLES_AU
AS
declare variable COSTO NUMERIC(18,2);
declare variable consec INTEGER;
BEGIN
/* BORRE LA CONTABILIZACION */
if (NEW.ensa_anulado = 'S') then
    BEGIN
    select enco_consec from comprobante_encabezado where enco_tiporef = 15 and enco_idref = old.ensa_id into :consec;
    if (NOT consec is null) then
     delete from comprobante_detalle where enco_consec = :consec;
    delete from comprobante_encabezado where enco_tiporef = 15 and enco_idref = old.ensa_id;
    INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
        VALUES (USER, 15, NEW.ensa_id, 'A', NEW.pref_pre || NEW.ensa_numero);
    END

/* BORRE EL ANTERIOR Y GRABE EL NUEVO */
if ((OLD.ensa_id <> 0) AND (OLD.ensa_anulado = 'N')) then
    begin
    delete from movimiento_articulo where (mvar_tipodoc = 15) and (mvar_idref = old.ensa_id) and (mvar_item = 0);
    delete from movimiento_articulo where (mvar_tipodoc = 15) and (mvar_idref = old.ensa_id) and (mvar_item = 999);
    end
if ((new.ensa_id <> 0) AND (NEW.ensa_anulado = 'N')) then
    begin
    COSTO = new.ensa_costo / NEW.ensa_factor;
    INSERT INTO MOVIMIENTO_ARTICULO
        (ARTI_COD, MVAR_CONS, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM)
        VALUES(NEW.ARTI_COD, GEN_ID(ID_MOVARTI,1), new.bode_cod, new.ensa_fecha, 15, NEW.ensa_id,
        new.ensa_conc, NEW.ensa_factor * new.ensa_cant, :COSTO, 'S', new.ensa_lote, new.pref_pre, new.ensa_numero, 0);

    /* RECORRA LAS LISTAS DE PRECIOS Y CAMBIE EL PRECIO */
    EXECUTE PROCEDURE CALCULA_PRECIOS(NEW.ARTI_COD, new.ensa_fecha);

    /* ingrese el retal */
    if ((new.ensa_codretal is not null) and (new.ensa_codretal <> '')) then
      INSERT INTO MOVIMIENTO_ARTICULO
        (ARTI_COD, MVAR_CONS, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM)
        VALUES(NEW.ensa_codretal, GEN_ID(ID_MOVARTI,1), new.bode_cod, new.ensa_fecha, 15, NEW.ensa_id,
        new.ensa_conc, new.ensa_cantretal, :COSTO, 'S', new.ensa_lote, new.pref_pre, new.ensa_numero, 999);

    INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
        VALUES (USER, 15, NEW.ensa_id, 'U', NEW.pref_pre || NEW.ensa_numero);
    end
/* SI CAMBIO LA FECHA ACTUALICE LOS DETALLES */
if ((OLD.pref_pre <> NEW.pref_pre) or
    (OLD.ensa_numero <> NEW.ensa_numero) or
    (OLD.ensa_fecha <> NEW.ensa_fecha) ) then
    UPDATE ENSAMBLES_DETALLE SET ESDE_TRANSMIT = 'N' WHERE ENSA_ID = OLD.ENSA_ID;

if (OLD.ensa_anulado <> NEW.ensa_anulado) then
    UPDATE ENSAMBLES_DETALLE SET ESDE_ANULADO = NEW.ensa_anulado WHERE ENSA_ID = OLD.ENSA_ID;

if (OLD.ensa_transmit <> NEW.ensa_transmit) then
    UPDATE ENSAMBLES_DETALLE SET ESDE_TRANSMIT = NEW.ensa_transmit WHERE ENSA_ID = OLD.ENSA_ID;
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER TRIGGER ENTRADAS_DETALLE_AI
AS
declare variable fec date;
declare variable CONC VARCHAR(60);
declare variable factor numeric(18,4);
declare variable Pref varchar(4);
declare variable Num varchar(6);
declare variable Nit varchar(20);
declare variable IVAINC CHAR(2);
declare variable COSTO NUMERIC(18,2);
BEGIN
  if ((NEW.entr_id <> 0) and (new.ende_anulado = 'N')) then
    BEGIN
    select entr_fecha, entr_conc, pref_pre, entr_numero, terc_nit, entr_imptos
        from entradas where entr_id = new.entr_id
        into :fec, :conc, :Pref, :Num, :Nit, :ivainc;
    execute procedure factor_unidad_cant(new.arti_cod, new.ende_unidad) returning_values(factor);
    COSTO = ((new.ende_costo - NEW.ende_dtomonto) / :factor);
    if (IVAINC = 'S') then
        COSTO = COSTO / (1 + NEW.ende_ivaporc/100);
    INSERT INTO MOVIMIENTO_ARTICULO
      (ARTI_COD, MVAR_CONS, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM, TERC_NIT)
      VALUES(NEW.ARTI_COD, GEN_ID(ID_MOVARTI,1), NEW.BODE_COD, :FEC, 11, NEW.entr_id,
      :CONC, :factor * new.ende_cant, :costo, 'S', new.ende_lote, :Pref, :Num, new.ende_item, :Nit);
    /* RECORRA LAS LISTAS DE PRECIOS Y CAMBIE EL PRECIO */
    EXECUTE PROCEDURE CALCULA_PRECIOS(NEW.ARTI_COD, :FEC);
    /* ACTUALICE EL STAND */
    if (new.ende_stand is not null) then
      if (exists(select stand_cod from stands where arti_cod = new.arti_cod and stand_bodega = new.bode_cod)) then
        UPDATE stands set stand_cod = new.ende_stand where arti_cod = new.arti_cod and stand_bodega = new.bode_cod;
      else
        INSERT INTO stands (ARTI_COD, STAND_BODEGA, STAND_COD) VALUES (NEW.arti_cod, NEW.bode_cod, NEW.ende_stand);
    END
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER TRIGGER ENTRADAS_DETALLE_AU
as
declare variable fec date;
declare variable CONC VARCHAR(60);
declare variable Pref varchar(4);
declare variable Num varchar(6);
declare variable Nit varchar(20);
declare variable factor numeric(18,4);
declare variable IVAINC CHAR(2);
declare variable COSTO NUMERIC(18,2);
BEGIN
if ((OLD.entr_id <> 0) AND (OLD.ende_anulado = 'N')) then
    DELETE FROM MOVIMIENTO_ARTICULO WHERE (mvar_tipodoc = 11) and (mvar_idref = new.entr_id) and (mvar_item = old.ende_item);
if ((NEW.entr_id <> 0) AND (NEW.ende_anulado = 'N')) then
    begin
    select entr_fecha, entr_conc, pref_pre, entr_numero, terc_nit, entr_imptos
        from entradas where entr_id = new.entr_id
        into :fec, :conc, :Pref, :Num, :Nit, :ivainc;
    execute procedure factor_unidad_cant(new.arti_cod, new.ende_unidad) returning_values(factor);
    COSTO = ((new.ende_costo - NEW.ende_dtomonto) / :factor);
    if (IVAINC = 'S') then
        COSTO = COSTO / (1 + NEW.ende_ivaporc/100);
    INSERT INTO MOVIMIENTO_ARTICULO
        (ARTI_COD, MVAR_CONS, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM, TERC_NIT)
        VALUES(NEW.ARTI_COD, GEN_ID(ID_MOVARTI,1), NEW.BODE_COD, :FEC, 11, NEW.entr_id,
        :CONC, :factor * new.ende_cant, :COSTO, 'S', new.ende_lote, :Pref, :Num, new.ende_item, :Nit);
    /* RECORRA LAS LISTAS DE PRECIOS Y CAMBIE EL PRECIO */
    EXECUTE PROCEDURE CALCULA_PRECIOS(NEW.ARTI_COD, :FEC);
    /* ACTUALICE EL STAND */
    if (new.ende_stand is not null) then
      if (exists(select stand_cod from stands where arti_cod = new.arti_cod and stand_bodega = new.bode_cod)) then
        UPDATE stands set stand_cod = new.ende_stand where arti_cod = new.arti_cod and stand_bodega = new.bode_cod;
      else
        INSERT INTO stands (ARTI_COD, STAND_BODEGA, STAND_COD) VALUES (NEW.arti_cod, NEW.bode_cod, NEW.ende_stand);
    END
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER TRIGGER FACTCOMP_DETALLE_AD
AS
declare variable fec date;
declare variable CONSO VARCHAR(2);
declare variable CONSOLIDA INTEGER;
declare variable NUMROWS INTEGER;
declare variable VERIF CHAR(2);
BEGIN
if ((old.fcde_anulado = 'N') and (OLD.faco_id <> 0)) then
    begin
    select faco_fecha, faco_consolida from facturas_compra where faco_id = old.faco_id into :fec, :consolida;
    DELETE FROM MOVIMIENTO_ARTICULO WHERE (mvar_tipodoc = 21) and (mvar_idref = old.faco_id) and (mvar_item = old.fcde_item);
    /* RECORRA LAS LISTAS DE PRECIOS Y CAMBIE EL PRECIO */
    EXECUTE PROCEDURE CALCULA_PRECIOS(old.ARTI_COD, :FEC);
    /* LOS PENDIENTES */
    if (CONSOLIDA <> 0) then
        BEGIN
        UPDATE consolidado_faltantes SET COFA_OK = 'N' WHERE COFA_ID = :consolida AND COFA_ITEM = old.FCDE_ITEM AND ARTI_COD = old.arti_cod;
        SELECT COUNT(CEFA_ITEM) FROM consolide_faltantes WHERE CEFA_ID = :CONSOLIDA INTO :NUMROWS;
        EXECUTE procedure LEE_CONFIGURACION ('COMPRAS','DOCUMENTOS','SUMAR CANTIDADES PENDIENTES AL CONSOLIDAR DOCUMENTOS') returning_values (CONSO);
        /* IGNORE LA CONSOLIDACION SI SE VALIDAN CODIGOS DE LA ORDEN */
        SELECT MIN(CEFA_TIPOORI) FROM consolide_faltantes WHERE CEFA_ID = :CONSOLIDA INTO :NUMROWS;
        if (NUMROWS = 23) then
            BEGIN
            EXECUTE PROCEDURE LEE_CONFIGURACION('COMPRAS', 'FACTURAS', 'VERIFICAR CODIGOS DE LA ORDEN') returning_values (VERIF);
            if (VERIF = 'SI') then
                CONSO = 'NO';
            END
        SELECT COUNT(CEFA_ITEM) FROM consolide_faltantes WHERE CEFA_ID = :CONSOLIDA INTO :NUMROWS;
        if ((CONSO = 'SI') AND (NUMROWS > 1)) then
            UPDATE consolidado_faltantes SET COFA_OK = 'N' WHERE COFA_ID = :consolida;
        END
    enD
END
^

SET TERM ; ^

SET TERM ^ ;

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

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

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

    /* ACTUALICE EL PENDIENTE  */
    if (CONSOLIDA <> 0) then
        BEGIN
        UPDATE consolidado_faltantes SET COFA_OK = 'S' WHERE COFA_ID = :consolida AND COFA_ITEM = NEW.FCDE_ITEM AND ARTI_COD = NEW.arti_cod;
        EXECUTE procedure LEE_CONFIGURACION ('COMPRAS','DOCUMENTOS','SUMAR CANTIDADES PENDIENTES AL CONSOLIDAR DOCUMENTOS') returning_values (CONSO);
        /* IGNORE LA CONSOLIDACION SI SE VALIDAN CODIGOS DE LA ORDEN */
        SELECT MIN(CEFA_TIPOORI) FROM consolide_faltantes WHERE CEFA_ID = :CONSOLIDA INTO :NUMROWS;
        if (NUMROWS = 23) then
            BEGIN
            EXECUTE PROCEDURE LEE_CONFIGURACION('COMPRAS', 'FACTURAS', 'VERIFICAR CODIGOS DE LA ORDEN') returning_values (MENORV);
            if (MENORV = 'SI') then
                CONSO = 'NO';
            END
        SELECT COUNT(CEFA_ITEM) FROM consolide_faltantes WHERE CEFA_ID = :CONSOLIDA INTO :NUMROWS;
        if ((CONSO = 'SI') AND (NUMROWS > 1)) then
            UPDATE consolidado_faltantes SET COFA_IDDES = NEW.faco_id, COFA_OK = 'S' WHERE COFA_ID = :consolida;
        else
            BEGIN
            /* BUSQUE EL CONSOLIDADO EN EL MISMO ITEM Y SI ES DIFERENTE ACTUALICELO */
            select COFA_CANT * COFA_FACTOR FROM consolidado_faltantes WHERE COFA_ID = :consolida AND COFA_ITEM = NEW.FCDE_ITEM AND ARTI_COD = NEW.arti_cod INTO :CANTREL;
            if (NEW.FCDE_CANT * NEW.FCDE_FACTOR < CANTREL) then
                UPDATE consolidado_faltantes SET COFA_IDDES = NEW.faco_id, COFA_CANT = NEW.FCDE_CANT, COFA_FACTOR = NEW.FCDE_FACTOR
                    WHERE COFA_ID = :consolida AND COFA_ITEM = NEW.FCDE_ITEM AND ARTI_COD = NEW.arti_cod;
            END
        END
    /* ACTUALICE EL STAND */
    if (new.fcde_stand is not null) then
      if (exists(select stand_cod from stands where arti_cod = new.arti_cod and stand_bodega = new.bode_cod)) then
        UPDATE stands set stand_cod = new.fcde_stand where arti_cod = new.arti_cod and stand_bodega = new.bode_cod;
      else
        INSERT INTO stands (ARTI_COD, STAND_BODEGA, STAND_COD) VALUES (NEW.arti_cod, NEW.bode_cod, NEW.fcde_stand);
    END
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER TRIGGER FACTCOMP_DETALLE_AU
as
declare variable fec date;
declare variable fecaux date;
declare variable AUX varchar(90);
declare variable CONC VARCHAR(60);
declare variable Pref varchar(4);
declare variable Num varchar(6);
declare variable Nit varchar(20);
declare variable factor numeric(18,4);
declare variable TIPO INTEGER;
declare variable INVFAC CHAR(2);
declare variable IVAINC CHAR(2);
declare variable COSTO NUMERIC(18,2);
declare variable CANTREL NUMERIC(18,4);
declare variable NUMPROV VARCHAR(10);
declare variable NUMPED VARCHAR(30);
declare variable NUMREM VARCHAR(30);
declare variable CONSO VARCHAR(2);
declare variable CONSOLIDA INTEGER;
declare variable NUMROWS INTEGER;
declare variable DTOPIE NUMERIC(18,2);
declare variable ADICIONAL NUMERIC(18,2);
declare variable TOTAL NUMERIC(18,2);
declare variable IVAMONTO NUMERIC(18,2);
declare variable EXTRA NUMERIC(18,2);
declare variable FACT NUMERIC(18,4);
declare variable MENORV CHAR(2);
declare variable ACTREM CHAR(2);
declare variable FECREM date;
declare variable IDREM INTEGER;
declare variable ITEREM INTEGER;
declare variable CANTREM NUMERIC(18,4);
declare variable LOTEREM VARCHAR(15);
declare variable PREFREM CHAR(4);
declare variable IDMOV INTEGER;
BEGIN
if (old.fcde_devuelto = new.fcde_devuelto) then
    begin
    /* deshaga lo viejo */
    if ((old.fcde_anulado = 'N') and (OLD.faco_id <> 0)) then
        begin
        select faco_fecha, faco_consolida from facturas_compra where faco_id = old.faco_id into :fec, :consolida;
        DELETE FROM MOVIMIENTO_ARTICULO WHERE (mvar_tipodoc = 21) and (mvar_idref = old.faco_id) and (mvar_item = old.fcde_item);
        /* RECORRA LAS LISTAS DE PRECIOS Y CAMBIE EL PRECIO */
        EXECUTE PROCEDURE CALCULA_PRECIOS(old.ARTI_COD, :FEC);
        /* LOS PENDIENTES */
        if (CONSOLIDA <> 0) then
            BEGIN
            UPDATE consolidado_faltantes SET COFA_OK = 'N' WHERE COFA_ID = :consolida AND COFA_ITEM = old.FCDE_ITEM AND ARTI_COD = old.arti_cod;
            SELECT COUNT(CEFA_ITEM) FROM consolide_faltantes WHERE CEFA_ID = :CONSOLIDA INTO :NUMROWS;
            EXECUTE procedure LEE_CONFIGURACION ('COMPRAS','DOCUMENTOS','SUMAR CANTIDADES PENDIENTES AL CONSOLIDAR DOCUMENTOS') returning_values (CONSO);
            /* IGNORE LA CONSOLIDACION SI SE VALIDAN CODIGOS DE LA ORDEN */
            SELECT MIN(CEFA_TIPOORI) FROM consolide_faltantes WHERE CEFA_ID = :CONSOLIDA INTO :NUMROWS;
            if (NUMROWS = 23) then
                BEGIN
                EXECUTE PROCEDURE LEE_CONFIGURACION('COMPRAS', 'FACTURAS', 'VERIFICAR CODIGOS DE LA ORDEN') returning_values (MENORV);
                if (MENORV = 'SI') then
                    CONSO = 'NO';
                END
            if (CONSO = 'SI') then
                UPDATE consolidado_faltantes SET COFA_OK = 'N' WHERE COFA_ID = :consolida;
            END
        end
    /* Registre el nuevo */
    if ((new.fcde_anulado = 'N') and (new.faco_id <> 0)) then
        BEGIN
        select faco_fecha, pref_pre, faco_numero, terc_nit, faco_imptos, faco_numprov, faco_remision, faco_orden, faco_consolida, faco_dtomonto, faco_adicional, faco_total, faco_ivamonto, faco_extra
            from facturas_compra where faco_id = new.faco_id
            into :fec, :Pref, :Num, :Nit, :ivainc, :numprov, :numrem, :numped, :consolida, :dtopie, :adicional, :total, :ivamonto, :extra;
        conc = 'FACTURA DE COMPRA No.' || PREF || NUM || '-' || NUMPROV;
        if (NUMREM <> '') then
            BEGIN
            AUX = SUBSTR(NUMREM, 1, 15);
            conc = conc || '-REM:' || AUX;
            END
        else
            if (NUMPED <> '') then
                BEGIN
                AUX = SUBSTR(NUMPED, 1, 15);
                conc = conc || '-ORDEN ' || AUX;
                END
        SELECT MAX(CEFA_TIPOORI) FROM consolide_faltantes WHERE CEFA_ID = :CONSOLIDA INTO :TIPO;
        if (Tipo is null) then
            Tipo = 0;
        execute procedure lee_configuracion('COMPRAS', 'FACTURAS', 'AFECTAR INVENTARIO CON LA FACTURA') returning_values (:INVFAC);
        /* si se hizo con base en una remision no afecte inventario */
        if ((Tipo <> 22) and (INVFAC = 'SI')) then
            begin
            execute procedure factor_unidad_cant(new.arti_cod, new.fcde_unidad) returning_values(factor);
            COSTO = ((new.fcde_prunit - NEW.fcde_dtomonto) / :factor);
            if (IVAINC = 'S') then
                COSTO = COSTO / (1 + NEW.fcde_ivaporc/100);
            EXECUTE PROCEDURE lee_configuracion('COMPRAS','FACTURAS','DESCUENTO Y VALOR ADICIONAL DEL DOCUMENTO COMO MENOR VALOR DEL COSTO') returning_values (:MENORV);
            if (MENORV = 'SI') then
                BEGIN
                FACT = (TOTAL - EXTRA - IVAMONTO);
                if ((FACT - ADICIONAL + DTOPIE) <> 0) then
                    FACT = FACT / (FACT - ADICIONAL + DTOPIE);
                ELSE
                    FACT = 1;
                COSTO = COSTO * FACT;
                END
            INSERT INTO MOVIMIENTO_ARTICULO
                (ARTI_COD, MVAR_CONS, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM, TERC_NIT)
                VALUES(NEW.ARTI_COD, GEN_ID(ID_MOVARTI,1), NEW.BODE_COD, :FEC, 21, NEW.faco_id,
                :CONC, :factor * new.fcde_cant, :COSTO, 'S', new.fcde_lote, :Pref, :Num, NEW.fcde_item, :Nit);
            if (COSTO > 0 ) then
             BEGIN
              /* ACTUALICE EL COSTO POR PROVEEDOR */
              SELECT PVAR_FECHA FROM PROVEEDOR_ARTICULO
                WHERE TERC_NIT = :Nit AND ARTI_COD = NEW.ARTI_COD INTO :FECAUX;
              if (FECAUX IS NULL) then
                INSERT INTO PROVEEDOR_ARTICULO (TERC_NIT, ARTI_COD, PVAR_COSTO, PVAR_FECHA, PVAR_COD,PVAR_DES)
                    VALUES (:Nit, NEW.ARTI_COD, :COSTO, :fec, NEW.fcde_codprov,NEW.fcde_desc);
              else
                UPDATE PROVEEDOR_ARTICULO
                    SET PVAR_COSTO = :COSTO, PVAR_FECHA = :fec, PVAR_COD = NEW.fcde_codprov
                    WHERE ARTI_COD = NEW.ARTI_COD AND TERC_NIT = :Nit;
             END
            /* RECORRA LAS LISTAS DE PRECIOS Y CAMBIE EL PRECIO */
            EXECUTE PROCEDURE CALCULA_PRECIOS(NEW.ARTI_COD, :FEC);
            end
        EXECUTE PROCEDURE lee_configuracion('COMPRAS', 'FACTURAS', 'ACTUALIZAR COSTOS DE LA REMISION RELACIONADA AL GRABAR LA FACTURA') returning_values (:ACTREM);
        if ((ACTREM = 'SI') and (Tipo = 22)) then
            BEGIN
            numrows = 0;
            select mvar_cons, MVAR_ITEM, MVAR_FECHA, MVAR_IDREF, MVAR_CANT, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO
                from movimiento_articulo M, consolidado_faltantes C
                where C.cofa_id = :CONSOLIDA AND mvar_tipodoc = 22 and mvar_idref = C.cofa_idori AND C.cofa_tipoori = 22 and m.arti_cod = new.arti_cod
                into :numrows, :iterem, :fecrem, :idrem, :cantrem, :loterem, :prefrem, :numrem;
            
            if (numrows <> 0) then
                BEGIN
                /* inserte primero para evitar existencias negativas */
                IDMOV = GEN_ID(ID_MOVARTI,1);
                INSERT INTO MOVIMIENTO_ARTICULO
                    (ARTI_COD, MVAR_CONS, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM, TERC_NIT)
                    VALUES(NEW.ARTI_COD, :IDMOV, NEW.BODE_COD, :fecrem, 22, :idrem,
                    :CONC, :cantrem, :costo, 'S', :loterem, :prefrem, :numrem, :iterem, :Nit);
                DELETE FROM MOVIMIENTO_ARTICULO WHERE MVAR_CONS = :numrows;
                /* reponga el consecutivo para no afectar el orden del kardex */
                update MOVIMIENTO_ARTICULO set mvar_cons = :numrows WHERE MVAR_CONS = :idmov;
                update costos set cost_idmov = :numrows WHERE cost_idmov = :idmov;

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

        if (CONSOLIDA <> 0) then
            begin
            UPDATE consolidado_faltantes SET COFA_OK = 'S' WHERE COFA_ID = :consolida AND COFA_ITEM = NEW.FCDE_ITEM AND ARTI_COD = NEW.arti_cod;
            EXECUTE procedure LEE_CONFIGURACION ('COMPRAS','DOCUMENTOS','SUMAR CANTIDADES PENDIENTES AL CONSOLIDAR DOCUMENTOS') returning_values (CONSO);
            /* IGNORE LA CONSOLIDACION SI SE VALIDAN CODIGOS DE LA ORDEN */
            SELECT MIN(CEFA_TIPOORI) FROM consolide_faltantes WHERE CEFA_ID = :CONSOLIDA INTO :NUMROWS;
            if (NUMROWS = 23) then
                BEGIN
                EXECUTE PROCEDURE LEE_CONFIGURACION('COMPRAS', 'FACTURAS', 'VERIFICAR CODIGOS DE LA ORDEN') returning_values (MENORV);
                if (MENORV = 'SI') then
                    CONSO = 'NO';
                END
            SELECT COUNT(CEFA_ITEM) FROM consolide_faltantes WHERE CEFA_ID = :CONSOLIDA INTO :NUMROWS;
            if ((CONSO = 'SI') AND (NUMROWS > 1)) then
                UPDATE consolidado_faltantes SET COFA_IDDES = NEW.faco_id, COFA_OK = 'S' WHERE COFA_ID = :consolida;
            else
                BEGIN
                /* BUSQUE EL CONSOLIDADO EN EL MISMO ITEM Y SI ES DIFERENTE ACTUALICELO */
                select COFA_CANT * COFA_FACTOR FROM consolidado_faltantes WHERE COFA_ID = :consolida AND COFA_ITEM = NEW.FCDE_ITEM AND ARTI_COD = NEW.arti_cod INTO :CANTREL;
                if (NEW.FCDE_CANT * NEW.FCDE_FACTOR < CANTREL) then
                    UPDATE consolidado_faltantes SET COFA_IDDES = NEW.faco_id, COFA_CANT = NEW.FCDE_CANT, COFA_FACTOR = NEW.FCDE_FACTOR
                        WHERE COFA_ID = :consolida AND COFA_ITEM = NEW.FCDE_ITEM AND ARTI_COD = NEW.arti_cod;
                END
            end
        /* ACTUALICE EL STAND */
        if (new.fcde_stand is not null) then
          if (exists(select stand_cod from stands where arti_cod = new.arti_cod and stand_bodega = new.bode_cod)) then
            UPDATE stands set stand_cod = new.fcde_stand where arti_cod = new.arti_cod and stand_bodega = new.bode_cod;
          else
            INSERT INTO stands (ARTI_COD, STAND_BODEGA, STAND_COD) VALUES (NEW.arti_cod, NEW.bode_cod, NEW.fcde_stand);
        END
    end
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER TRIGGER NOTAS_CREDITO_PROVEEDOR_AI
AS
declare variable COSTO NUMERIC(18,2);
declare variable EXISTENCIA NUMERIC(18,4);
declare variable CODBOD VARCHAR(3);
BEGIN
if ((NEW.NCPR_ID <> 0) and (new.ncpr_anulado = 'N')) then
    BEGIN
    /* Registre el nuevo saldo del documento */
    INSERT INTO SALDOS_DOC_CXPAGAR (SDCP_TIPOREF, SDCP_IDREF, SDCP_FECHA, TERC_NIT, SDCP_RTEFTE, SDCP_RTIVA, SDCP_RTICA, SDCP_ABONO, SDCP_ABRTFTE, SDCP_ABRTIVA, SDCP_ABRTICA, SDCP_DEBITO, SDCP_MONTO, SDCP_TRM)
        VALUES (52, NEW.NCPR_ID, NEW.ncpr_fecha, NEW.terc_nit, (NEW.ncpr_rtftemonto * -1), (NEW.ncpr_rtivamonto * -1), (NEW.ncpr_rticamonto * -1), 0, 0, 0, 0, 'N', (NEW.ncpr_monto+NEW.ncpr_ivamonto)*-1, NEW.ncpr_trm);
    /* Registre el movimiento del proveedor */
    INSERT INTO MOVIMIENTO_PROVEEDOR (MVPR_ID, TERC_NIT, MVPR_TIPOREF, MVPR_IDREF, MVPR_FECHA, MVPR_VENCE, MVPR_CONC, MVPR_MONTO, MVPR_RTFTE, MVPR_RTIVA, MVPR_RTICA, MVPR_DEBITO, MVPR_ABONO, MVPR_PREFIJO, MVPR_NUMERO, MVPR_TRM)
      VALUES (GEN_ID(ID_MOVPROV, 1), NEW.TERC_NIT, 52, NEW.NCPR_ID, NEW.NCPR_FECHA, NEW.NCPR_FECHA, NEW.NCPR_CONC, NEW.NCPR_MONTO+NEW.NCPR_IVAMONTO, NEW.NCPR_RTFTEMONTO, NEW.NCPR_RTIVAMONTO, NEW.NCPR_RTICAMONTO, 'N', 'N', NEW.pref_pre, NEW.ncpr_numero, NEW.ncpr_trm);
    /* afecte el articulo */
    if (new.arti_cod <> '') then
        begin
        /* CALCULE EL NUEVO COSTO */
        execute procedure costo_promedio (new.arti_cod, new.ncpr_fecha) returning_values (:COSTO);
        execute procedure saldo_total_inventario (new.arti_cod, new.ncpr_fecha) returning_values (:EXISTENCIA);
        COSTO = ((COSTO * EXISTENCIA) - NEW.ncpr_monto) / EXISTENCIA;
        FOR SELECT DISTINCT BODE_COD FROM EXISTENCIA WHERE ARTI_COD = NEW.ARTI_COD INTO :CODBOD do
            BEGIN
            execute procedure saldo_inventario (new.arti_cod, :CODBOD, new.ncpr_fecha) returning_values (:EXISTENCIA);
            if (EXISTENCIA <> 0) then
                BEGIN
                /* SAQUE TODO LO QUE TENGA */
                INSERT INTO MOVIMIENTO_ARTICULO
                  (ARTI_COD, MVAR_CONS, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM, TERC_NIT)
                  VALUES(NEW.ARTI_COD, GEN_ID(ID_MOVARTI,1), :CODBOD, new.ncpr_fecha, 52, NEW.ncpr_id,
                  new.ncpr_conc, :EXISTENCIA, 0, 'N', '', new.pref_pre, new.ncpr_numero, 1, new.terc_nit);
                END
            END
        FOR SELECT DISTINCT BODE_COD, MVAR_CANT FROM MOVIMIENTO_ARTICULO WHERE MVAR_TIPODOC = 52 AND MVAR_IDREF = NEW.ncpr_id
            INTO :CODBOD, :existencia do
            BEGIN
            /* META TODO CON EL NUEVO COSTO */
            INSERT INTO MOVIMIENTO_ARTICULO
              (ARTI_COD, MVAR_CONS, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM, TERC_NIT)
              VALUES(NEW.ARTI_COD, GEN_ID(ID_MOVARTI,1), :CODBOD, new.ncpr_fecha, 52, NEW.ncpr_id,
              new.ncpr_conc, :EXISTENCIA, :COSTO, 'S', '', new.pref_pre, new.ncpr_numero, 1, new.terc_nit);
            END
        /* RECORRA LAS LISTAS DE PRECIOS Y CAMBIE EL PRECIO */
        EXECUTE PROCEDURE CALCULA_PRECIOS(NEW.ARTI_COD, new.ncpr_fecha);
        end
    INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
        VALUES (USER, 52, NEW.ncpr_id, 'I', NEW.pref_pre || NEW.ncpr_numero);
    END
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER TRIGGER NOTAS_CREDITO_PROVEEDOR_AU
AS
declare variable ABONOS char(1);
declare variable consec INTEGER;
declare variable COSTO NUMERIC(18,2);
declare variable EXISTENCIA NUMERIC(18,4);
declare variable CODBOD VARCHAR(3);
BEGIN
if (new.ncpr_anulado = 'S') then
    begin
    select enco_consec from comprobante_encabezado where enco_tiporef = 52 and enco_idref = old.ncpr_id into :consec;
    if (NOT consec is null) then
      delete from comprobante_detalle where enco_consec = :consec;
    delete from comprobante_encabezado where enco_tiporef = 52 and enco_idref = old.ncpr_id;
    INSERT INTO AUDITORIA (AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
        VALUES (USER, 52, new.ncpr_id, 'A', NEW.pref_pre || NEW.ncpr_numero);
    end

/* BORRE EL REGISTRO PREVIO */
if ((old.ncpr_id <> 0) and (old.ncpr_anulado = 'N')) then
    begin
    /* Verifique si habia abonos a la nota */
    ABONOS = 'N';
    select 'S' FROM SALDOS_DOC_CXPAGAR WHERE SDCP_TIPOREF = 52 AND SDCP_IDREF = OLD.NCPR_ID AND SDCP_ABONO <> 0 INTO :ABONOS;
    if (ABONOS = 'N') then
        BEGIN
        /* BORRE EL REGISTRO PREVIO */
        delete from saldos_doc_cxpagar where sdcp_tiporef = 52 and sdcp_idref = old.ncpr_id;
        delete from movimiento_PROVEEDOR where (mvpr_tiporef = 52) and (mvpr_idref = old.ncpr_id);
        delete from movimiento_articulo where  (mvar_tipodoc = 52) and (mvar_idref = old.ncpr_id);
        END
    else
        exception DOCUMENTO_CON_ABONOS 'El descuento de proveedor ' || old.pref_pre || old.ncpr_numero || ' tiene abonos registrados.';
    end
if ((new.ncpr_id <> 0) and (new.ncpr_anulado = 'N')) then
    begin
    /* Registre el nuevo saldo del documento */
    INSERT INTO SALDOS_DOC_CXPAGAR (SDCP_TIPOREF, SDCP_IDREF, SDCP_FECHA, TERC_NIT, SDCP_RTEFTE, SDCP_RTIVA, SDCP_RTICA, SDCP_ABONO, SDCP_ABRTFTE, SDCP_ABRTIVA, SDCP_ABRTICA, SDCP_DEBITO, SDCP_MONTO, SDCP_TRM)
        VALUES (52, NEW.NCPR_ID, NEW.ncpr_fecha, NEW.terc_nit, (NEW.ncpr_rtftemonto * -1), (NEW.ncpr_rtivamonto * -1), (NEW.ncpr_rticamonto * -1), 0, 0, 0, 0, 'N', (NEW.ncpr_monto+NEW.ncpr_ivamonto)*-1, NEW.ncpr_trm);
    /* Registre el movimiento del proveedor */
    INSERT INTO MOVIMIENTO_PROVEEDOR (MVPR_ID, TERC_NIT, MVPR_TIPOREF, MVPR_IDREF, MVPR_FECHA, MVPR_VENCE, MVPR_CONC, MVPR_MONTO, MVPR_RTFTE, MVPR_RTIVA, MVPR_RTICA, MVPR_DEBITO, MVPR_ABONO, MVPR_PREFIJO, MVPR_NUMERO, MVPR_TRM)
        VALUES (GEN_ID(ID_MOVPROV, 1), NEW.TERC_NIT, 52, NEW.NCPR_ID, NEW.NCPR_FECHA, NEW.NCPR_FECHA, NEW.NCPR_CONC, NEW.NCPR_MONTO+NEW.ncpr_ivamonto, NEW.NCPR_RTFTEMONTO, NEW.NCPR_RTIVAMONTO, NEW.NCPR_RTICAMONTO, 'N', 'N', NEW.pref_pre, NEW.ncpr_numero, NEW.ncpr_trm);
    /* afecte el articulo */
    if (new.arti_cod <> '') then
        begin
        /* CALCULE EL NUEVO COSTO */
        execute procedure costo_promedio (new.arti_cod, new.ncpr_fecha) returning_values (:COSTO);
        execute procedure saldo_total_inventario (new.arti_cod, new.ncpr_fecha) returning_values (:EXISTENCIA);
        COSTO = ((COSTO * EXISTENCIA) - NEW.ncpr_monto) / EXISTENCIA;
        FOR SELECT DISTINCT BODE_COD FROM EXISTENCIA WHERE ARTI_COD = NEW.ARTI_COD INTO :CODBOD do
            BEGIN
            execute procedure saldo_inventario (new.arti_cod, :CODBOD, new.ncpr_fecha) returning_values (:EXISTENCIA);
            if (EXISTENCIA <> 0) then
                BEGIN
                /* SAQUE TODO LO QUE TENGA */
                INSERT INTO MOVIMIENTO_ARTICULO
                    (ARTI_COD, MVAR_CONS, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM, TERC_NIT)
                    VALUES(NEW.ARTI_COD, GEN_ID(ID_MOVARTI,1), :CODBOD, new.ncpr_fecha, 52, NEW.ncpr_id,
                    new.ncpr_conc, :EXISTENCIA, 0, 'N', '', new.pref_pre, new.ncpr_numero, 1, new.terc_nit);
                end
            END
        FOR SELECT DISTINCT BODE_COD, MVAR_CANT FROM MOVIMIENTO_ARTICULO WHERE MVAR_TIPODOC = 52 AND MVAR_IDREF = NEW.ncpr_id
            INTO :CODBOD, :existencia do
            BEGIN
            /* META TODO CON EL NUEVO COSTO */
            INSERT INTO MOVIMIENTO_ARTICULO
                (ARTI_COD, MVAR_CONS, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM, TERC_NIT)
                VALUES(NEW.ARTI_COD, GEN_ID(ID_MOVARTI,1), :CODBOD, new.ncpr_fecha, 52, NEW.ncpr_id,
                new.ncpr_conc, :EXISTENCIA, :COSTO, 'S', '', new.pref_pre, new.ncpr_numero, 1, new.terc_nit);
            END
        /* RECORRA LAS LISTAS DE PRECIOS Y CAMBIE EL PRECIO */
        EXECUTE PROCEDURE CALCULA_PRECIOS(NEW.ARTI_COD, new.ncpr_fecha);
        end
    INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
        VALUES (USER, 52, NEW.ncpr_id, 'U', NEW.pref_pre || NEW.ncpr_numero);
    end
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER TRIGGER NOTAS_DEBITO_PROVEEDOR_AI
AS
declare variable COSTO NUMERIC(18,2);
declare variable EXISTENCIA NUMERIC(18,4);
declare variable CODBOD VARCHAR(3);
BEGIN
  if ((NEW.NDPR_ID <> 0) and (new.ndpr_anulado = 'N')) then
    BEGIN
    INSERT INTO SALDOS_DOC_CXPAGAR (SDCP_TIPOREF, SDCP_IDREF, SDCP_FECHA, TERC_NIT, SDCP_RTEFTE, SDCP_RTIVA, SDCP_RTICA, SDCP_ABONO, SDCP_ABRTFTE, SDCP_ABRTIVA, SDCP_ABRTICA, SDCP_DEBITO, SDCP_MONTO, SDCP_TRM)
        VALUES (51, NEW.NDPR_ID, NEW.ndpr_fecha, NEW.terc_nit, NEW.ndpr_rtftemonto, NEW.ndpr_rtivamonto, NEW.ndpr_rticamonto, 0, 0, 0, 0, 'S', NEW.ndpr_monto+NEW.ndpr_ivamonto, NEW.ndpr_trm);
    /* Registre el movimiento del proveedor */
    INSERT INTO MOVIMIENTO_PROVEEDOR (MVPR_ID, TERC_NIT, MVPR_TIPOREF, MVPR_IDREF, MVPR_FECHA, MVPR_VENCE, MVPR_CONC, MVPR_MONTO, MVPR_RTFTE, MVPR_RTIVA, MVPR_RTICA, MVPR_DEBITO, MVPR_ABONO, MVPR_PREFIJO, MVPR_NUMERO, MVPR_TRM)
      VALUES (GEN_ID(ID_MOVPROV, 1), NEW.TERC_NIT, 51, NEW.NDPR_ID, NEW.NDPR_FECHA, NEW.NDPR_VENCE, NEW.NDPR_CONC, NEW.NDPR_MONTO+NEW.ndpr_Ivamonto, NEW.NDPR_RTFTEMONTO, NEW.NDPR_RTIVAMONTO, NEW.NDPR_RTICAMONTO, 'S', 'N', NEW.pref_pre, NEW.ndpr_numero, NEW.ndpr_trm);
    /* afecte el articulo */
    if (new.arti_cod <> '') then
        begin
        /* CALCULE EL NUEVO COSTO */
        execute procedure costo_promedio (new.arti_cod, new.ndpr_fecha) returning_values (:COSTO);
        execute procedure saldo_total_inventario (new.arti_cod, new.ndpr_fecha) returning_values (:EXISTENCIA);
        COSTO = (COSTO * EXISTENCIA + (NEW.ndpr_monto)) / EXISTENCIA;
        FOR SELECT DISTINCT BODE_COD FROM EXISTENCIA WHERE ARTI_COD = NEW.ARTI_COD INTO :CODBOD do
            BEGIN
            execute procedure saldo_inventario (new.arti_cod, :CODBOD, new.ndpr_fecha) returning_values (:EXISTENCIA);
            if (existencia <> 0) then
                BEGIN
                /* SAQUE TODO LO QUE TENGA */
                INSERT INTO MOVIMIENTO_ARTICULO
                  (ARTI_COD, MVAR_CONS, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM, TERC_NIT)
                  VALUES(NEW.ARTI_COD, GEN_ID(ID_MOVARTI,1), :CODBOD, new.ndpr_fecha, 51, NEW.ndpr_id,
                  new.ndpr_conc, :EXISTENCIA, 0, 'N', '', new.pref_pre, new.ndpr_numero, 1, new.terc_nit);
                END
            END
        FOR SELECT DISTINCT BODE_COD, MVAR_CANT FROM MOVIMIENTO_ARTICULO WHERE MVAR_TIPODOC = 51 AND MVAR_IDREF = NEW.ndpr_id
            INTO :CODBOD, :existencia do
            BEGIN
            /* META TODO CON EL NUEVO COSTO */
            INSERT INTO MOVIMIENTO_ARTICULO
              (ARTI_COD, MVAR_CONS, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM, TERC_NIT)
              VALUES(NEW.ARTI_COD, GEN_ID(ID_MOVARTI,1), :CODBOD, new.ndpr_fecha, 51, NEW.ndpr_id,
              new.ndpr_conc, :EXISTENCIA, :COSTO, 'S', '', new.pref_pre, new.ndpr_numero, 1, new.terc_nit);
            END
        /* RECORRA LAS LISTAS DE PRECIOS Y CAMBIE EL PRECIO */
        EXECUTE PROCEDURE CALCULA_PRECIOS(NEW.ARTI_COD, new.ndpr_fecha);
        end
    INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
        VALUES (USER, 51, NEW.ndpr_id, 'I', NEW.pref_pre || NEW.ndpr_numero);
    END
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER TRIGGER NOTAS_DEBITO_PROVEEDOR_AU
AS
declare variable ABONOS char(1);
declare variable consec INTEGER;
declare variable COSTO NUMERIC(18,2);
declare variable EXISTENCIA NUMERIC(18,4);
declare variable CODBOD VARCHAR(3);
BEGIN
if (new.ndpr_anulado = 'S') then
    begin
    select enco_consec from comprobante_encabezado where enco_tiporef = 51 and enco_idref = old.ndpr_id into :consec;
    if (NOT consec is null) then
      delete from comprobante_detalle where enco_consec = :consec;
    delete from comprobante_encabezado where enco_tiporef = 51 and enco_idref = old.ndpr_id;
    INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
        VALUES (USER, 51, NEW.ndpr_id, 'A', NEW.pref_pre || NEW.ndpr_numero);
    end

/* BORRE EL REGISTRO PREVIO */
if ((old.ndpr_id <> 0) and (old.ndpr_anulado = 'N')) then
    begin
    /* Verifique si habia abonos a la nota */
    ABONOS = 'N';
    select 'S' FROM SALDOS_DOC_CXPAGAR WHERE SDCP_TIPOREF = 51 AND SDCP_IDREF = OLD.NDPR_ID AND SDCP_ABONO <> 0 INTO :ABONOS;
    if (ABONOS = 'N') then
        BEGIN
        /* BORRE EL REGISTRO PREVIO */
        delete from saldos_doc_cxpagar where sdcp_tiporef = 51 and sdcp_idref = old.ndpr_id;
        delete from movimiento_PROVEEDOR where (mvpr_tiporef = 51) and (mvpr_idref = old.ndpr_id);
        delete from movimiento_articulo where  (mvar_tipodoc = 51) and (mvar_idref = old.ndpr_id);
        END
    else
        exception DOCUMENTO_CON_ABONOS 'El cargo de proveedor ' || old.pref_pre || old.ndpr_numero || ' tiene abonos registrados.';
    end
if ((new.ndpr_id <> 0) and (new.ndpr_anulado = 'N')) then
    begin
    /* Registre el nuevo saldo del documento */
    INSERT INTO SALDOS_DOC_CXPAGAR (SDCP_TIPOREF, SDCP_IDREF, SDCP_FECHA, TERC_NIT, SDCP_RTEFTE, SDCP_RTIVA, SDCP_RTICA, SDCP_ABONO, SDCP_ABRTFTE, SDCP_ABRTIVA, SDCP_ABRTICA, SDCP_DEBITO, SDCP_MONTO, SDCP_TRM)
        VALUES (51, NEW.NDPR_ID, NEW.ndpr_fecha, NEW.terc_nit, NEW.ndpr_rtftemonto, NEW.ndpr_rtivamonto, NEW.ndpr_rticamonto, 0, 0, 0, 0, 'N', NEW.ndpr_monto+NEW.ndpr_ivamonto, NEW.ndpr_trm);
    /* Registre el movimiento del proveedor */
    INSERT INTO MOVIMIENTO_PROVEEDOR (MVPR_ID, TERC_NIT, MVPR_TIPOREF, MVPR_IDREF, MVPR_FECHA, MVPR_VENCE, MVPR_CONC, MVPR_MONTO, MVPR_RTFTE, MVPR_RTIVA, MVPR_RTICA, MVPR_DEBITO, MVPR_ABONO, MVPR_PREFIJO, MVPR_NUMERO, MVPR_TRM)
        VALUES (GEN_ID(ID_MOVPROV, 1), NEW.TERC_NIT, 51, NEW.NDPR_ID, NEW.NDPR_FECHA, NEW.ndpr_vence, NEW.NDPR_CONC, NEW.NDPR_MONTO+NEW.ndpr_ivamonto, NEW.NDPR_RTFTEMONTO, NEW.NDPR_RTIVAMONTO, NEW.NDPR_RTICAMONTO, 'S', 'N', NEW.pref_pre, NEW.ndpr_numero, NEW.ndpr_trm);
    if (new.arti_cod <> '') then
        begin
        /* CALCULE EL NUEVO COSTO */
        execute procedure costo_promedio (new.arti_cod, new.ndpr_fecha) returning_values (:COSTO);
        execute procedure saldo_total_inventario (new.arti_cod, new.ndpr_fecha) returning_values (:EXISTENCIA);
        COSTO = (COSTO * EXISTENCIA + (NEW.ndpr_monto)) / EXISTENCIA;
        FOR SELECT DISTINCT BODE_COD FROM EXISTENCIA WHERE ARTI_COD = NEW.ARTI_COD INTO :CODBOD do
            BEGIN
            execute procedure saldo_inventario (new.arti_cod, :CODBOD, new.ndpr_fecha) returning_values (:EXISTENCIA);
            if (existencia <> 0) then
                BEGIN
                /* SAQUE TODO LO QUE TENGA */
                INSERT INTO MOVIMIENTO_ARTICULO
                  (ARTI_COD, MVAR_CONS, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM, TERC_NIT)
                  VALUES(NEW.ARTI_COD, GEN_ID(ID_MOVARTI,1), :CODBOD, new.ndpr_fecha, 51, NEW.ndpr_id,
                  new.ndpr_conc, :EXISTENCIA, 0, 'N', '', new.pref_pre, new.ndpr_numero, 1, new.terc_nit);
                END
            END
        FOR SELECT DISTINCT BODE_COD, MVAR_CANT FROM MOVIMIENTO_ARTICULO WHERE MVAR_TIPODOC = 51 AND MVAR_IDREF = NEW.ndpr_id
            INTO :CODBOD, :existencia do
            BEGIN
            /* META TODO CON EL NUEVO COSTO */
            INSERT INTO MOVIMIENTO_ARTICULO
              (ARTI_COD, MVAR_CONS, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM, TERC_NIT)
              VALUES(NEW.ARTI_COD, GEN_ID(ID_MOVARTI,1), :CODBOD, new.ndpr_fecha, 51, NEW.ndpr_id,
              new.ndpr_conc, :EXISTENCIA, :COSTO, 'S', '', new.pref_pre, new.ndpr_numero, 1, new.terc_nit);
            END
        /* RECORRA LAS LISTAS DE PRECIOS Y CAMBIE EL PRECIO */
        EXECUTE PROCEDURE CALCULA_PRECIOS(NEW.ARTI_COD, new.ndpr_fecha);
        end
    INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
        VALUES (USER, 51, NEW.ndpr_id, 'U', NEW.pref_pre || NEW.ndpr_numero);
    end
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER TRIGGER REMISION_PROVEEDOR_DET_AI
AS
declare variable fec date;
declare variable CONC VARCHAR(60);
declare variable factor numeric(18,4);
declare variable Pref varchar(4);
declare variable Num varchar(6);
declare variable EXISTE CHAR(1);
declare variable NIT VARCHAR(20);
declare variable NUMPROV VARCHAR(20);
declare variable Tipo Integer;
declare variable idfact integer;
declare variable numrows integer;
declare variable IVAINC CHAR(2);
declare variable COSTO NUMERIC(18,2);
declare variable CANTREL NUMERIC(18,4);
declare variable NUMPED VARCHAR(30);
declare variable CONSO CHAR(2);
declare variable CONSOLIDA INTEGER;
declare variable DTOPIE NUMERIC(18,2);
declare variable ADICIONAL NUMERIC(18,2);
declare variable TOTAL NUMERIC(18,2);
declare variable IVAMONTO NUMERIC(18,2);
declare variable EXTRA NUMERIC(18,2);
declare variable FACT NUMERIC(18,4);
declare variable MENORV CHAR(2);
declare variable CEROS CHAR(2);
declare variable ACTREM CHAR(2);
BEGIN
  if ((NEW.repr_id <> 0) and (new.rpvd_anulado = 'N')) then
    BEGIN
    select max(rprd_tiporel), max(rprd_idrel) from remision_proveedor_docrela
        where repr_id = new.repr_id into :Tipo, :idfact;
    if (Tipo is null) then
        Tipo = 0;
    /* si se hizo con base en una factura que afecto el inventario no afecte inventario */
    numrows = 0;
    if (Tipo = 21) Then
        select count(*) from movimiento_articulo where mvar_tipodoc = 21 and mvar_idref = :idfact into :numrows;
    if (numrows is null) then
        numrows = 0;
    if (numrows = 0) then
        begin
        select repr_fecha, pref_pre, repr_numero, REPR_IMPTOS, terc_nit, REPR_NUMPROV, REPR_ORDEN, REPR_CONSOLIDA, repr_dtomonto, repr_adicional, repr_total, repr_ivamonto, repr_extra
            from remision_proveedor where repr_id = new.repr_id
            into :fec, :Pref, :Num, :IVAINC, :NIT, :NUMPROV, :numped, :CONSOLIDA, :dtopie, :adicional, :total, :ivamonto, :extra;
        execute procedure factor_unidad_cant(new.arti_cod, new.rpvd_unidad) returning_values(factor);
        CONC = 'REMISION PROVEEDOR No.' || PREF || NUM || '-' || NUMPROV;
        if (numped <> '') then
            conc = conc || '-ORDEN ' || NUMPED;
        COSTO = ((new.rpvd_prunit - NEW.rpvd_dtomonto) / :factor);
        if (IVAINC = 'S') then
            COSTO = COSTO / (1 + NEW.rpvd_ivaporc/100);
        EXECUTE PROCEDURE lee_configuracion('COMPRAS','FACTURAS','DESCUENTO Y VALOR ADICIONAL DEL DOCUMENTO COMO MENOR VALOR DEL COSTO') returning_values (:MENORV);
        if (MENORV = 'SI') then
            BEGIN
            FACT = (TOTAL - EXTRA - IVAMONTO);
            if ((FACT - ADICIONAL + DTOPIE) <> 0) then
                FACT = FACT / (FACT - ADICIONAL + DTOPIE);
            ELSE
                FACT = 1;
            COSTO = COSTO * FACT;
            END
        if (COSTO = 0) then
            BEGIN
            EXECUTE PROCEDURE lee_configuracion('COMPRAS', 'REMISIONES', 'PERMITIR CEROS EN COSTOS DE MERCANCIA') returning_values (:ceros);
            EXECUTE PROCEDURE lee_configuracion('COMPRAS', 'FACTURAS', 'ACTUALIZAR COSTOS DE LA REMISION RELACIONADA AL GRABAR LA FACTURA') returning_values (:ACTREM);
            if ((ACTREM = 'SI') and (CEROS = 'NO')) then
                execute procedure costo_promedio(NEW.arti_cod, :fec) returning_values (:COSTO);
            END
        INSERT INTO MOVIMIENTO_ARTICULO
          (ARTI_COD, MVAR_CONS, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM, TERC_NIT)
          VALUES(NEW.ARTI_COD, GEN_ID(ID_MOVARTI,1), NEW.BODE_COD, :FEC, 22, NEW.repr_id,
          :CONC, :factor * new.rpvd_cant, :COSTO, 'S', new.rpvd_lote, :Pref, :Num, new.rpvd_item, :Nit);

        /* RECORRA LAS LISTAS DE PRECIOS Y CAMBIE EL PRECIO */
        EXECUTE PROCEDURE CALCULA_PRECIOS(NEW.ARTI_COD, :FEC);

        if (COSTO > 0 ) then
         BEGIN
          /* GRABE PROV X ARTICULO */
          EXISTE = 'N';
          SELECT 'S' FROM PROVEEDOR_ARTICULO WHERE TERC_NIT = :NIT AND ARTI_COD = NEW.ARTI_COD INTO :EXISTE;
          if (EXISTE = 'S') then
            UPDATE PROVEEDOR_ARTICULO 
                SET PVAR_FECHA = :FEC, PVAR_COSTO = :COSTO, PVAR_COD = NEW.rpvd_codprov
                WHERE TERC_NIT = :NIT AND ARTI_COD = NEW.ARTI_COD;
          ELSE
            INSERT INTO PROVEEDOR_ARTICULO (TERC_NIT, ARTI_COD, PVAR_COSTO, PVAR_FECHA, PVAR_COD,PVAR_DES)
                VALUES (:NIT, NEW.ARTI_COD, :COSTO, :FEC, NEW.rpvd_codprov,NEW.rpvd_desc);
         END
        end

    /* ACTUALICE EL PENDIENTE  */
    if (CONSOLIDA <> 0) then
        BEGIN
        EXECUTE PROCEDURE LEE_CONFIGURACION ('COMPRAS','DOCUMENTOS','SUMAR CANTIDADES PENDIENTES AL CONSOLIDAR DOCUMENTOS') returning_values (CONSO);
        SELECT MIN(CEFA_TIPOORI) FROM consolide_faltantes WHERE CEFA_ID = :CONSOLIDA INTO :NUMROWS;
        if (NUMROWS = 23) then
            BEGIN
            EXECUTE PROCEDURE LEE_CONFIGURACION('COMPRAS', 'REMISIONES', 'VERIFICAR CODIGOS DE LA ORDEN') returning_values (MENORV);
            if (MENORV = 'SI') then
                CONSO = 'NO';
            END
        SELECT COUNT(CEFA_ITEM) FROM consolide_faltantes WHERE CEFA_ID = :CONSOLIDA INTO :NUMROWS;
        if ((CONSO = 'SI') AND (NUMROWS > 1)) then
            UPDATE consolidado_faltantes SET COFA_OK = 'S' WHERE COFA_ID = :consolida;
        ELSE
            BEGIN
            /* BUSQUE EL CONSOLIDADO EN EL MISMO ITEM Y SI ES DIFERENTE ACTUALICELO */
            select COFA_CANT * COFA_FACTOR FROM consolidado_faltantes WHERE COFA_ID = :consolida AND COFA_ITEM = NEW.RPVD_ITEM AND ARTI_COD = NEW.arti_cod INTO :CANTREL;
            if (NEW.RPVD_CANT * NEW.RPVD_FACTOR < CANTREL) then
                UPDATE consolidado_faltantes SET COFA_IDDES = NEW.repr_id, COFA_CANT = NEW.RPVD_CANT, COFA_FACTOR = NEW.RPVD_FACTOR
                    WHERE COFA_ID = :consolida AND COFA_ITEM = NEW.RPVD_ITEM AND ARTI_COD = NEW.arti_cod;
            ELSE
                UPDATE consolidado_faltantes SET COFA_IDDES = NEW.repr_id, COFA_OK = 'S' WHERE COFA_ID = :consolida AND COFA_ITEM = NEW.RPVD_ITEM AND ARTI_COD = NEW.arti_cod;
            END
        END
    /* ACTUALICE EL STAND */
    if (new.rpvd_stand is not null) then
      if (exists(select stand_cod from stands where arti_cod = new.arti_cod and stand_bodega = new.bode_cod)) then
        UPDATE stands set stand_cod = new.rpvd_stand where arti_cod = new.arti_cod and stand_bodega = new.bode_cod;
      else
        INSERT INTO stands (ARTI_COD, STAND_BODEGA, STAND_COD) VALUES (NEW.arti_cod, NEW.bode_cod, NEW.rpvd_stand);
    END
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER TRIGGER REMISION_PROVEEDOR_DET_AU
AS
declare variable fec date;
declare variable CONC VARCHAR(60);
declare variable Pref varchar(4);
declare variable Num varchar(6);
declare variable factor numeric(18,4);
declare variable EXISTE CHAR(1);
declare variable NIT VARCHAR(20);
declare variable NUMPROV VARCHAR(20);
declare variable Tipo integer;
declare variable idfact integer;
declare variable numrows integer;
declare variable IVAINC CHAR(2);
declare variable COSTO NUMERIC(18,2);
declare variable CANTREL NUMERIC(18,4);
declare variable NUMPED VARCHAR(30);
declare variable CONSO CHAR(2);
declare variable CONSOLIDA INTEGER;
declare variable DTOPIE NUMERIC(18,2);
declare variable ADICIONAL NUMERIC(18,2);
declare variable TOTAL NUMERIC(18,2);
declare variable IVAMONTO NUMERIC(18,2);
declare variable EXTRA NUMERIC(18,2);
declare variable FACT NUMERIC(18,4);
declare variable MENORV CHAR(2);
declare variable CEROS CHAR(2);
declare variable ACTREM CHAR(2);
BEGIN
if ((OLD.repr_id <> 0) AND (OLD.rpvd_anulado = 'N')) then
    begin
    DELETE FROM MOVIMIENTO_ARTICULO WHERE (mvar_tipodoc = 22) and (mvar_idref = new.repr_id) and (mvar_item = old.rpvd_item);
    select REPR_CONSOLIDA from remision_proveedor where repr_id = old.repr_id into :CONSOLIDA;
    if (CONSOLIDA <> 0) then
        begin
        EXECUTE PROCEDURE LEE_CONFIGURACION ('COMPRAS','DOCUMENTOS','SUMAR CANTIDADES PENDIENTES AL CONSOLIDAR DOCUMENTOS') returning_values (CONSO);
        SELECT COUNT(CEFA_ITEM) FROM consolide_faltantes WHERE CEFA_ID = :CONSOLIDA INTO :NUMROWS;
        if ((NUMROWS = 1) OR (CONSO = 'NO')) then
            UPDATE consolidado_faltantes SET COFA_OK = 'N' WHERE COFA_ID = :consolida AND COFA_ITEM = old.RPVD_ITEM AND ARTI_COD = old.arti_cod;
        else
            UPDATE consolidado_faltantes SET COFA_OK = 'N' WHERE COFA_ID = :consolida;
        END
    end
/* Registre el nuevo */
if ((new.repr_id <> 0) AND (new.rpvd_anulado = 'N')) then
    begin
    select repr_fecha, pref_pre, repr_numero, repr_imptos, terc_nit, REPR_NUMPROV, REPR_ORDEN, REPR_CONSOLIDA, repr_dtomonto, repr_adicional, repr_total, repr_ivamonto, repr_extra
        from remision_proveedor where repr_id = new.repr_id
        into :fec, :Pref, :Num, :IVAINC, :NIT, :NUMPROV, :numped, :CONSOLIDA, :dtopie, :adicional, :total, :ivamonto, :extra;
    CONC = 'REMISION PROVEEDOR No.' || PREF || NUM || '-' || NUMPROV;
    if (numped <> '') then
        conc = conc || '-ORDEN ' || NUMPED;
    SELECT MAX(CEFA_TIPOORI) FROM consolide_faltantes WHERE CEFA_ID = :CONSOLIDA INTO :TIPO;
    if (Tipo is null) then
        Tipo = 0;
    select FACO_ID from FACTURAS_COMPRA WHERE FACO_CONSOLIDA = :consolida INTO :IDFACT;
    if (Idfact is null) then
        Idfact = 0;
    /* si se hizo con base en una factura que afecto el inventario no afecte inventario */
    numrows = 0;
    if (Tipo = 21) Then
        select count(*) from movimiento_articulo where mvar_tipodoc = 21 and mvar_idref = :idfact into :numrows;
    if (numrows is null) then
        numrows = 0;
    if (numrows = 0) then
        begin
        execute procedure factor_unidad_cant(new.arti_cod, new.rpvd_unidad) returning_values(factor);
        COSTO = ((new.rpvd_prunit - NEW.rpvd_dtomonto) / :factor);
        if (IVAINC = 'S') then
            COSTO = COSTO / (1 + NEW.rpvd_ivaporc/100);
        EXECUTE PROCEDURE lee_configuracion('COMPRAS','FACTURAS','DESCUENTO Y VALOR ADICIONAL DEL DOCUMENTO COMO MENOR VALOR DEL COSTO') returning_values (:MENORV);
        if (MENORV = 'SI') then
            BEGIN
            FACT = (TOTAL - EXTRA - IVAMONTO);
            if ((FACT - ADICIONAL + DTOPIE) <> 0) then
                FACT = FACT / (FACT - ADICIONAL + DTOPIE);
            ELSE
                FACT = 1;
            COSTO = COSTO * FACT;
            END
        if (COSTO = 0) then
            BEGIN
            EXECUTE PROCEDURE lee_configuracion('COMPRAS', 'REMISIONES', 'PERMITIR CEROS EN COSTOS DE MERCANCIA') returning_values (:ceros);
            EXECUTE PROCEDURE lee_configuracion('COMPRAS', 'FACTURAS', 'ACTUALIZAR COSTOS DE LA REMISION RELACIONADA AL GRABAR LA FACTURA') returning_values (:ACTREM);
            if ((ACTREM = 'SI') and (CEROS = 'NO')) then
                execute procedure costo_promedio(NEW.arti_cod, :fec) returning_values (:COSTO);
            END
        INSERT INTO MOVIMIENTO_ARTICULO
            (ARTI_COD, MVAR_CONS, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM, TERC_NIT)
            VALUES(NEW.ARTI_COD, GEN_ID(ID_MOVARTI,1), NEW.BODE_COD, :FEC, 22, NEW.repr_id,
            :CONC, :factor * new.rpvd_cant, :COSTO, 'S', new.rpvd_lote, :Pref, :Num, new.rpvd_item, :Nit);
            
        /* RECORRA LAS LISTAS DE PRECIOS Y CAMBIE EL PRECIO */
        EXECUTE PROCEDURE CALCULA_PRECIOS(NEW.ARTI_COD, :FEC);
          
        if (COSTO > 0 ) then
         BEGIN
          /* GRABE PROV X ARTICULO */
          EXISTE = 'N';
          SELECT 'S' FROM PROVEEDOR_ARTICULO WHERE TERC_NIT = :NIT AND ARTI_COD = NEW.ARTI_COD INTO :EXISTE;
          if (EXISTE = 'S') then
            UPDATE PROVEEDOR_ARTICULO
                SET PVAR_FECHA = :FEC, PVAR_COSTO = :COSTO, PVAR_COD = NEW.rpvd_codprov
                WHERE TERC_NIT = :NIT AND ARTI_COD = NEW.ARTI_COD;
          ELSE
            INSERT INTO PROVEEDOR_ARTICULO (TERC_NIT, ARTI_COD, PVAR_COSTO, PVAR_FECHA, PVAR_COD,PVAR_DES)
                VALUES (:NIT, NEW.ARTI_COD, :COSTO, :FEC, NEW.rpvd_codprov,NEW.rpvd_desc);
         END
        end
    if (CONSOLIDA <> 0) then
        BEGIN
        EXECUTE PROCEDURE LEE_CONFIGURACION ('COMPRAS','DOCUMENTOS','SUMAR CANTIDADES PENDIENTES AL CONSOLIDAR DOCUMENTOS') returning_values (CONSO);
        /* IGNORE LA CONSOLIDACION SI SE VALIDAN CODIGOS DE LA ORDEN */
        SELECT MIN(CEFA_TIPOORI) FROM consolide_faltantes WHERE CEFA_ID = :CONSOLIDA INTO :NUMROWS;
        if (NUMROWS = 23) then
            BEGIN
            EXECUTE PROCEDURE LEE_CONFIGURACION('COMPRAS', 'REMISIONES', 'VERIFICAR CODIGOS DE LA ORDEN') returning_values (MENORV);
            if (MENORV = 'SI') then
                CONSO = 'NO';
            END
        SELECT COUNT(CEFA_ITEM) FROM consolide_faltantes WHERE CEFA_ID = :CONSOLIDA INTO :NUMROWS;
        if ((CONSO = 'SI') AND (NUMROWS > 1)) then
            UPDATE consolidado_faltantes SET COFA_IDDES = NEW.repr_id, COFA_OK = 'S' WHERE COFA_ID = :consolida;
        ELSE
            BEGIN
            /* BUSQUE EL CONSOLIDADO EN EL MISMO ITEM Y SI ES DIFERENTE ACTUALICELO */
            select COFA_CANT * COFA_FACTOR FROM consolidado_faltantes WHERE COFA_ID = :consolida AND COFA_ITEM = NEW.RPVD_ITEM AND ARTI_COD = NEW.arti_cod INTO :CANTREL;
            if (NEW.RPVD_CANT * NEW.RPVD_FACTOR < CANTREL) then
                UPDATE consolidado_faltantes SET COFA_IDDES = NEW.repr_id, COFA_CANT = NEW.RPVD_CANT, COFA_FACTOR = NEW.RPVD_FACTOR
                    WHERE COFA_ID = :consolida AND COFA_ITEM = NEW.RPVD_ITEM AND ARTI_COD = NEW.arti_cod;
            else
                UPDATE consolidado_faltantes SET COFA_IDDES = NEW.repr_id, COFA_OK = 'S' WHERE COFA_ID = :consolida AND COFA_ITEM = NEW.RPVD_ITEM AND ARTI_COD = NEW.arti_cod;
            END
        END
    /* ACTUALICE EL STAND */
    if (new.rpvd_stand is not null) then
      if (exists(select stand_cod from stands where arti_cod = new.arti_cod and stand_bodega = new.bode_cod)) then
        UPDATE stands set stand_cod = new.rpvd_stand where arti_cod = new.arti_cod and stand_bodega = new.bode_cod;
      else
        INSERT INTO stands (ARTI_COD, STAND_BODEGA, STAND_COD) VALUES (NEW.arti_cod, NEW.bode_cod, NEW.rpvd_stand);
    END
END
^

SET TERM ; ^

/* 20090916b */
/* VALIDE QUE EL NIT DEL RECIBO COINCIDA CON EL DEL DOCUMENTO ABONADO */
SET TERM ^ ;

CREATE OR ALTER TRIGGER RECIBOS_CAJA_DETALLE_BI FOR RECIBOS_CAJA_DETALLE
ACTIVE BEFORE INSERT POSITION 0
AS
DECLARE VARIABLE NUMROWS INTEGER;
declare variable PREGTASA CHAR(2);
declare variable TRM NUMERIC(18,2);
declare variable TRMDOC NUMERIC(18,2);
declare variable FECREC DATE;
declare variable FECDOC DATE;
declare variable NITR VARCHAR(20);
declare variable NITD VARCHAR(20);
begin
IF (NEW.RECA_ID IS NOT NULL) THEN
    BEGIN
       SELECT COUNT(*)
       FROM   RECIBOS_CAJA
       WHERE  RECIBOS_CAJA.RECA_ID = NEW.RECA_ID
       INTO   :NUMROWS;
       IF (NUMROWS = 0) THEN
       BEGIN
          EXCEPTION recibo_no_existe;
       END
    END
if (NEW.rcde_sucursal IS NULL) then
    NEW.rcde_sucursal = '01';
/* SI TRM <> 1 CONVIERTA A PESOS LOS VALORES */
EXECUTE PROCEDURE LEE_CONFIGURACION('GENERAL', 'GENERAL', 'PREGUNTAR TASA DE CAMBIO EN DOCUMENTOS DE CARTERA') returning_values (:pregtasa);
if (PREGTASA = 'SI') then
    BEGIN
    SELECT RECA_TRM FROM recibos_caja WHERE RECA_ID = NEW.reca_id INTO :TRM;
    SELECT MVCL_TRM FROM movimiento_clientes M WHERE M.mvcl_tiporef = NEW.rcde_tipodoc AND M.mvcl_idref = NEW.rcde_iddoc INTO :TRMDOC;
    NEW.rcde_difcambio = (NEW.rcde_abono + NEW.rcde_dtof) * (TRM - TRMDOC);
    NEW.rcde_abono = NEW.rcde_abono * :trmdoc;
    NEW.rcde_rtfte = NEW.rcde_rtfte * :trmdoc;
    NEW.rcde_rtiva = NEW.rcde_rtiva * :trmdoc;
    NEW.rcde_rtica = NEW.rcde_rtica * :trmdoc;
    NEW.rcde_dtof = NEW.rcde_dtof * :trmdoc;
    end
/* valide que la fecha no sea anterior al documento */
SELECT RECA_FECHA, TERC_NIT FROM recibos_caja WHERE RECA_ID = NEW.reca_id INTO :FECREC, :NITR;
SELECT MVCL_FECHA, TERC_NIT FROM movimiento_clientes M
    WHERE M.mvcl_tiporef = NEW.rcde_tipodoc AND M.mvcl_idref = NEW.rcde_iddoc INTO :FECDOC, :NITD;
if (FECDOC > FECREC) then
    exception fecha_anterior_documento 'EL RECIBO DE FECHA ' || :FECREC || ' INTENTA ABONAR UN DOCUMENTO DE FECHA ' || FECDOC;
if (NITR > NITD) then
    exception documento_de_otro_tercero 'EL RECIBO CON NIT ' || :nitr || ' INTENTA ABONAR EL DOCUMENTO ' || NEW.rcde_prefijo || NEW.rcde_numero || ' DEL CLIENTE ' || :nitd;
END
^

SET TERM ; ^


SET TERM ^ ;

CREATE OR ALTER TRIGGER RECIBOS_CAJA_DETALLE_BU FOR RECIBOS_CAJA_DETALLE
ACTIVE BEFORE UPDATE POSITION 0
as
declare variable FECREC DATE;
declare variable FECDOC DATE;
declare variable NITR VARCHAR(20);
declare variable NITD VARCHAR(20);
begin
if (NEW.rcde_sucursal IS NULL) then
    NEW.rcde_sucursal = '01';
/* valide que la fecha no sea anterior al documento */
SELECT RECA_FECHA, TERC_NIT FROM recibos_caja WHERE RECA_ID = NEW.reca_id INTO :FECREC, :NITR;
SELECT MVCL_FECHA, TERC_NIT FROM movimiento_clientes M
    WHERE M.mvcl_tiporef = NEW.rcde_tipodoc AND M.mvcl_idref = NEW.rcde_iddoc INTO :FECDOC, :NITD;
if (FECDOC > FECREC) then
    exception fecha_anterior_documento 'EL RECIBO DE FECHA ' || :FECREC || ' INTENTA ABONAR UN DOCUMENTO DE FECHA ' || FECDOC;
if (NITR > NITD) then
    exception documento_de_otro_tercero 'EL RECIBO CON NIT ' || :nitr || ' INTENTA ABONAR EL DOCUMENTO ' || NEW.rcde_prefijo || NEW.rcde_numero || ' DEL CLIENTE ' || :nitd;
end
^

SET TERM ; ^

/* 20090916c */

/* PERSISTIA EL ERROR EN LOS COSTOS EN UNIDAD ALTERNATIVA AL GRABAR TRASLADOS EN PROV. X ARTICULO */

SET TERM ^ ;

CREATE OR ALTER TRIGGER TRASFERENCIAS_DETALLE_AI FOR TRASFERENCIAS_DETALLE
ACTIVE AFTER INSERT POSITION 0
AS
declare variable fec date;
declare variable CONC VARCHAR(60);
declare variable factor numeric(18,4);
declare variable bodori varchar(2);
declare variable boddes varchar(2);
declare variable Pref varchar(4);
declare variable Num varchar(6);
declare variable NIT varchar(20);
declare variable fecaux date;
declare variable ORIGEN VARCHAR(2);
BEGIN
  if ((NEW.Tran_id <> 0) and (new.tras_anulado = 'N')) then
    begin
    select tran_fecha, tran_conc, BODE_COD, TRAN_BODDES, pref_pre, tran_numero, TERC_NIT
        from trasferencias where tran_id = new.tran_id into :fec, :conc, :bodori, :boddes, :Pref, :Num, :NIT;
    execute procedure factor_unidad_cant(new.arti_cod, new.tras_unidad) returning_values(factor);
    EXECUTE PROCEDURE LEE_CONFIGURACION('INVENTARIO', 'TRASLADOS', 'AFECTAR AMBAS BODEGAS AL CONFIRMAR ENTREGA') returning_values(ORIGEN);
    if ((ORIGEN = 'NO') or (new.tras_confirma = 'S'))  then
        INSERT INTO MOVIMIENTO_ARTICULO
          (ARTI_COD, MVAR_CONS, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM)
          VALUES(NEW.ARTI_COD, GEN_ID(ID_MOVARTI,1), :bodori, :FEC, 13, NEW.tran_id,
          :CONC, :factor * new.tras_cant, 0, 'N', new.tras_lote, :Pref, :Num, new.tras_item);
    if (new.tras_confirma = 'S') then
      INSERT INTO MOVIMIENTO_ARTICULO
        (ARTI_COD, MVAR_CONS, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM)
        VALUES(NEW.ARTI_COD, GEN_ID(ID_MOVARTI,1), :boddes, :FEC, 13, NEW.tran_id,
        :CONC, :factor * new.tras_cant, NEW.tras_costo, 'S', new.tras_lotedes, :Pref, :Num, new.tras_item);

    /* ACTUALICE EL COSTO POR PROVEEDOR */
    if (:NIT <> '') then
        BEGIN
        SELECT PVAR_FECHA FROM PROVEEDOR_ARTICULO
            WHERE TERC_NIT = :Nit AND ARTI_COD = NEW.ARTI_COD
            INTO :FECAUX;
        if (FECAUX IS NULL) then
            INSERT INTO PROVEEDOR_ARTICULO (TERC_NIT, ARTI_COD, PVAR_COSTO, PVAR_FECHA, PVAR_COD,PVAR_DES)
                VALUES (:Nit, NEW.ARTI_COD, (new.tras_costo / new.tras_factor), :fec, :NIT,NEW.tras_desc);
        else
            UPDATE PROVEEDOR_ARTICULO
                SET PVAR_COSTO = NEW.tras_costo/NEW.tras_factor, PVAR_FECHA = :fec
                WHERE ARTI_COD = NEW.ARTI_COD AND TERC_NIT = :Nit;
        END
    END
END
^

SET TERM ; ^


SET TERM ^ ;

CREATE OR ALTER TRIGGER TRASFERENCIAS_DETALLE_AU FOR TRASFERENCIAS_DETALLE
ACTIVE AFTER UPDATE POSITION 0
AS
declare variable fec date;
declare variable CONC VARCHAR(60);
declare variable factor numeric(18,4);
declare variable bodori varchar(2);
declare variable boddes varchar(2);
declare variable Pref varchar(4);
declare variable Num varchar(6);
declare variable ORIGEN VARCHAR(2);
declare variable NIT varchar(20);
declare variable fecaux date;
BEGIN
if ((old.arti_cod <> new.arti_cod) or (old.tras_cant <> new.tras_cant) or (old.tras_unidad <> new.tras_unidad) or (old.tras_lote <> new.tras_lote) or
    (old.tras_anulado <> new.tras_anulado) or (old.tras_transmit <> new.tras_transmit) or (old.tras_confirma <> new.tras_confirma)) then
  begin
  /* Anule el anterior */
  if ((old.tran_id <> 0) and (old.tras_anulado = 'N')) then
    begin
    delete from movimiento_articulo where (mvar_tipodoc = 13) and (mvar_idref = old.tran_id) and (mvar_item = old.tras_item);
    END
  /* Registre el nuevo */
  if ((new.tran_id <> 0) and (new.tras_anulado = 'N')) then
    BEGIN
    select tran_fecha, tran_conc, BODE_COD, TRAN_BODDES, Pref_pre, tran_numero, terc_nit
        from trasferencias where tran_id = new.tran_id into :fec, :conc, :bodori, :boddes, :Pref, :Num, :Nit;
    execute procedure factor_unidad_cant(new.arti_cod, new.tras_unidad) returning_values(factor);
    EXECUTE PROCEDURE LEE_CONFIGURACION('INVENTARIO', 'TRASLADOS', 'AFECTAR AMBAS BODEGAS AL CONFIRMAR ENTREGA') returning_values(ORIGEN);
    if ((ORIGEN = 'NO') or (new.tras_confirma = 'S'))  then
        INSERT INTO MOVIMIENTO_ARTICULO
            (ARTI_COD, MVAR_CONS, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM)
            VALUES(NEW.ARTI_COD, GEN_ID(ID_MOVARTI,1), :bodori, :FEC, 13, NEW.tran_id,
            :CONC, :factor * new.tras_cant, 0, 'N', new.tras_lote, :Pref, :Num, new.tras_item);
    if (new.tras_confirma = 'S') then
        INSERT INTO MOVIMIENTO_ARTICULO
        (ARTI_COD, MVAR_CONS, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM)
        VALUES(NEW.ARTI_COD, GEN_ID(ID_MOVARTI,1), :boddes, :FEC, 13, NEW.tran_id,
        :CONC, :factor * new.tras_cant, 0, 'S', new.tras_lotedes, :Pref, :Num, new.tras_item);
    /* ACTUALICE EL COSTO POR PROVEEDOR */
    if (:NIT <> '') then
        BEGIN
        SELECT PVAR_FECHA FROM PROVEEDOR_ARTICULO
            WHERE TERC_NIT = :Nit AND ARTI_COD = NEW.ARTI_COD
            INTO :FECAUX;
        if (FECAUX IS NULL) then
            INSERT INTO PROVEEDOR_ARTICULO (TERC_NIT, ARTI_COD, PVAR_COSTO, PVAR_FECHA, PVAR_COD,PVAR_DES)
                VALUES (:Nit, NEW.ARTI_COD, (new.tras_costo / new.tras_factor), :fec, :NIT,NEW.tras_desc);
        else
            UPDATE PROVEEDOR_ARTICULO
                SET PVAR_COSTO = NEW.tras_costo/NEW.tras_factor, PVAR_FECHA = :fec
                WHERE ARTI_COD = NEW.ARTI_COD AND TERC_NIT = :Nit;
        END
    END
  end
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure ORDEN_SUGERIDA_BOD (
    PROVEEDOR varchar(20),
    BODEGA varchar(2),
    FECHA date)
returns (
    ARTICULO varchar(15),
    CANT numeric(18,4),
    UNIDAD varchar(8),
    COSTO numeric(18,2))
AS
declare variable FACTOR NUMERIC(15,4);
declare variable DIAS INTEGER;
declare variable EXISTENCIA NUMERIC(18,4);
declare variable PROMEDIO NUMERIC(18,4);
declare variable DIA_ART VARCHAR(2) CHARACTER SET NONE;
declare variable DIASC VARCHAR(255);
declare variable SALIDAS NUMERIC(18,4);
BEGIN
FOR SELECT ARTI_COD, PVAR_COSTO FROM proveedor_articulo WHERE TERC_NIT = :proveedor INTO :articulo, :costo
    DO
    begin
    SELECT ARTI_UNIDAD FROM ARTICULO WHERE ARTI_COD = :articulo INTO :unidad;
    execute procedure saldo_inventario (:articulo, :bodega, :fecha) returning_values (:Existencia);
    EXECUTE PROCEDURE FACTOR_UNIDAD_CANT(:ARTICULO, :UNIDAD) returning_values (:FACTOR);
    if (FACTOR <> 0) then
        EXISTENCIA = EXISTENCIA / FACTOR;
    else
        EXISTENCIA = 0;
    EXECUTE PROCEDURE promedio_salidas_articulo (:ARTICULO, :FECHA, :BODEGA) returning_values (:PROMEDIO, :SALIDAS);
    EXECUTE PROCEDURE lee_configuracion ('INVENTARIO', 'EXISTENCIAS', 'PROMEDIAR LAS SALIDAS DEL INVENTARIO CON EL NUMERO DE DIAS ASIGNADO A CADA ARTICULO') returning_values (:DIA_ART);
    if (DIA_ART = 'NO') then
        BEGIN
        EXECUTE PROCEDURE lee_configuracion ('INVENTARIO', 'EXISTENCIAS', 'NUMERO DE DIAS PARA PROMEDIO DE SALIDAS POR ARTICULO') returning_values (DIASC);
        DIAS = CAST(DIASC AS INTEGER);
        END
    ELSE
        SELECT ARTI_DIAS FROM ARTICULO WHERE ARTI_COD = :ARTICULO INTO :DIAS;
    if (DIAS is null) then
        DIAS = 0;
    PROMEDIO = DIAS * PROMEDIO;
    if (FACTOR <> 0) then
        PROMEDIO = PROMEDIO / FACTOR;
    CANT = PROMEDIO - EXISTENCIA;
    if (CANT > 0) then
        SUSPEND;
    end
END
^

SET TERM ; ^

grant execute on procedure orden_sugerida_bod to public;


/* 20090917 */
/* NUEVO DATO PARA IMPRIMIR INSTRUCIONES DE ENTREGA DE FACTURAS POR CLIENTE P.E. DIAS DE RADICACION */
ALTER TABLE CLIENTES
ADD CLIE_INSTRUCCIONES VARCHAR(255);


/* 20090917b */
/* REPTIA CLASE, GRUPO, TIPO O ESTADO DEL CLIENTE ANTERIOR */
SET TERM ^ ;

CREATE OR ALTER procedure BUSQUEDA_PROSPECTOS (
    INACTIVOS char(1),
    BUSCAR varchar(100),
    CUALQUIERA char(1),
    COLUMNA integer,
    BUSCAR2 varchar(30),
    BUSCAR3 varchar(30),
    BUSCAR4 varchar(30),
    BUSCAR5 varchar(30))
returns (
    NIT varchar(20),
    NOMBRE varchar(60),
    ENCARGADO varchar(60),
    DIR varchar(100),
    CIUD varchar(40),
    TEL varchar(40),
    VEND varchar(60),
    ANIV date,
    RELACION varchar(60),
    ESTADO varchar(60),
    ULTFEC date,
    ASESOR varchar(60),
    CONTACTO varchar(60),
    CLASE varchar(60),
    AGRUPA varchar(60))
AS
declare variable TIPOREL INTEGER;
declare variable CODCLASE INTEGER;
declare variable CODAGRUPA INTEGER;
declare variable CODESTADO INTEGER;
declare variable OK CHAR(1);
begin
if ((BUSCAR IS NOT NULL) AND (BUSCAR <> '')) then
    BEGIN
    FOR select CRCL_NIT, CRCL_NOM, CRCL_DIR, CRCL_CIU, CRCL_TEL, CRCL_CONTACTO, CRCL_ANIV, CRCL_TIPORELA, CRCL_ESTADO, CRCL_CLASE, CRCL_AGRUPA
        FROM CRM_CLIENTES WHERE ((:INACTIVOS = 'S') or (CRCL_ESTADO <> 0)) AND
            ((:COLUMNA <> 0) or (upper(CRCL_NIT) like upper(:buscar))) AND
            ((:columna <> 1) or (upper(CRCL_NOM) like upper(:buscar))) AND
            ((:columna <> 2) or (upper(CRCL_CONTACTO) like upper(:buscar)))
         INTO :NIT, :NOMBRE, :DIR, :CIUD, :TEL, :ENCARGADO, :ANIV, :TIPOREL, :CODESTADO, :CODCLASE, :CODAGRUPA
         DO
         BEGIN
         CLASE = '';
         AGRUPA = '';
         RELACION = '';
         ESTADO = '';
         VEND = '';
         SELECT CRTR_NOMBRE FROM crm_tiporelacion WHERE crtr_id = :tiporel INTO :relacion;
         SELECT CRES_NOMBRE FROM crm_estado WHERE cres_id = :codestado INTO :estado;
         SELECT CRCL_NOMBRE FROM crm_clase WHERE crcl_id = :codclase INTO :clase;
         SELECT CRAG_NOMBRE FROM crm_agrupacion WHERE crag_id = :codagrupa INTO :agrupa;
         SELECT VEND_NOMBRE FROM CLIENTES C, VENDEDORES V WHERE TERC_NIT = :NIT AND C.vend_cod = V.vend_cod INTO :vend;
         ULTFEC = NULL;
         ASESOR = NULL;
         CONTACTO = NULL;
         SELECT FIRST 1 CREV_FECHA, CREV_ASESOR, CRTC_NOMBRE FROM CRM_EVENTOS E, CRM_TIPOCONTACTO T
            WHERE CRCL_NIT = :NIT AND E.crev_tipo = T.crtc_id INTO :ultfec, :asesor, :contacto;
         if (CUALQUIERA = 'S') then
            SUSPEND;
         ELSE
            if ((COLUMNA > 0) AND (BUSCAR2 <> '')) then
                BEGIN
                OK = 'S';
                IF (NOT EXISTS (SELECT CRCL_NIT FROM CRM_CLIENTES WHERE CRCL_NIT = :NIT AND
                    ((:columna <> 1) or (upper(CRCL_NOM) like upper(:buscar2))) AND
                    ((:columna <> 2) or (upper(CRCL_CONTACTO) like upper(:buscar2))))) THEN
                    OK = 'N';
                if ((OK = 'S') AND (BUSCAR3 <> '')) then
                    IF (NOT EXISTS (SELECT CRCL_NIT FROM CRM_CLIENTES WHERE CRCL_NIT = :NIT AND
                        ((:columna <> 1) or (upper(CRCL_NOM) like upper(:buscar3))) AND
                        ((:columna <> 2) or (upper(CRCL_CONTACTO) like upper(:buscar3))))) THEN
                        OK = 'N';
                if ((OK = 'S') AND (BUSCAR4 <> '')) then
                    IF (NOT EXISTS (SELECT CRCL_NIT FROM CRM_CLIENTES WHERE CRCL_NIT = :NIT AND
                        ((:columna <> 1) or (upper(CRCL_NOM) like upper(:buscar4))) AND
                        ((:columna <> 2) or (upper(CRCL_CONTACTO) like upper(:buscar4))))) THEN
                        OK = 'N';
                if ((OK = 'S') AND (BUSCAR5 <> '')) then
                    IF (NOT EXISTS (SELECT CRCL_NIT FROM CRM_CLIENTES WHERE CRCL_NIT = :NIT AND
                        ((:columna <> 1) or (upper(CRCL_NOM) like upper(:buscar5))) AND
                        ((:columna <> 2) or (upper(CRCL_CONTACTO) like upper(:buscar5))))) THEN
                        OK = 'N';
                if (OK = 'S') then
                    SUSPEND;
                END
            ELSE
                SUSPEND;
        END
    END
else
    BEGIN
    FOR select CRCL_NIT, CRCL_NOM, CRCL_DIR, CRCL_CIU, CRCL_TEL, CRCL_CONTACTO, CRCL_ANIV, CRCL_TIPORELA, CRCL_ESTADO, CRCL_CLASE, CRCL_AGRUPA
        FROM CRM_CLIENTES WHERE ((:INACTIVOS = 'S') or (CRCL_ESTADO <> 0))
         INTO :NIT, :NOMBRE, :DIR, :CIUD, :TEL, :ENCARGADO, :ANIV, :TIPOREL, :CODESTADO, :CODCLASE, :CODAGRUPA
         DO
         BEGIN
         CLASE = '';
         AGRUPA = '';
         RELACION = '';
         ESTADO = '';
         VEND = '';
         SELECT CRTR_NOMBRE FROM crm_tiporelacion WHERE crtr_id = :tiporel INTO :relacion;
         SELECT CRES_NOMBRE FROM crm_estado WHERE cres_id = :codestado INTO :estado;
         SELECT CRCL_NOMBRE FROM crm_clase WHERE crcl_id = :codclase INTO :clase;
         SELECT CRAG_NOMBRE FROM crm_agrupacion WHERE crag_id = :codagrupa INTO :agrupa;
         SELECT VEND_NOMBRE FROM CLIENTES C, VENDEDORES V WHERE TERC_NIT = :NIT AND C.vend_cod = V.vend_cod INTO :vend;
         ULTFEC = NULL;
         ASESOR = NULL;
         CONTACTO = NULL;
         SELECT FIRST 1 CREV_FECHA, CREV_ASESOR, CRTC_NOMBRE FROM CRM_EVENTOS E, CRM_TIPOCONTACTO T
            WHERE CRCL_NIT = :NIT AND E.crev_tipo = T.crtc_id INTO :ultfec, :asesor, :contacto;
         SUSPEND;
         END
    END
end
^

SET TERM ; ^


/* 20090917c */
/* STRING TRUNCATION CONCEPTO */
SET TERM ^ ;

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

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

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

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

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

SET TERM ; ^

/* 20090922 */
/* IMPRIMIA UNO MENOS DE LOS QUE PREGUNTABA, SE AGREGO DESCCORTA */
SET TERM ^ ;

CREATE OR ALTER procedure IMPR_ARTICULO (
    CODINI varchar(20),
    CODFIN varchar(20),
    CANT integer)
returns (
    ARTICULO varchar(15),
    DESCRIPCION varchar(60),
    DESCCORTA varchar(30),
    PRECIO numeric(18,2),
    CODGRP varchar(2),
    NOMGRP varchar(30),
    COSUBG varchar(3),
    NOMSUBG varchar(30),
    CODMARC varchar(3),
    NOMMARC varchar(30),
    PESO numeric(18,4),
    PUM numeric(18,2),
    LISTA integer,
    NOMLISTA varchar(30),
    FECHA date)
AS
declare variable I INTEGER;
begin
EXECUTE PROCEDURE lee_configuracion('FACTURACION', 'FACTURAS', 'CODIGO DE LA LISTA DE PRECIOS A MOSTRAR EN ARTICULOS') returning_values (LISTA);
for select a.arti_cod, arti_des, a.grup_cod, a.subg_cod, a.marc_cod, arti_peso, p.lipr_cod, p.prar_fijo, grup_nom, lipr_nom, arti_descorta
    from articulo a, precios_articulo p, grupo g, lista_precios l
    where a.arti_cod = p.arti_cod and a.grup_cod = g.grup_cod and l.lipr_cod = p.lipr_cod AND a.arti_cod >= :codini AND a.arti_cod <= :codfin AND P.lipr_cod = :LISTA
    into :articulo, :descripcion, :codgrp, :cosubg, :codmarc, :peso, :lista, :precio, :nomgrp, :nomlista, :desccorta
    do
    begin
    if (cosubg <> '') then
        select subg_nom from subgrupo where grup_cod = :codgrp and subg_cod = :cosubg into :nomsubg;
    if (codmarc <> '') then
        select marc_nom from marcas where marc_cod = :codmarc into :nommarc;
    if ((PESO <> 0) AND (PESO IS NOT NULL)) then
        PUM = PRECIO / PESO;
    ELSE
        PUM = 0;
    SELECT MAX(AUDI_FECHA) FROM AUDITORIA WHERE TIDO_COD = 126 AND AUDI_COD = :articulo AND AUDI_OPER <> 'D' INTO :fecha;
    if (cant = 0) then
        execute procedure saldo_total_inventario(:articulo, cast('now' as DATE)) returning_values (CANT);
    I = 1;
    WHILE (I <= CANT) DO
        BEGIN
        SUSPEND;
        I = I + 1;
        END
    end
end
^

SET TERM ; ^

/* 20090923 */
ALTER TABLE TIPO_ID
ADD TIID_CODSHD CHAR(3);

DELETE FROM tipo_id;

INSERT INTO TIPO_ID (TIID_COD, TIID_NOM, TIID_CODIGO, TIID_CODSHD) VALUES ('R', 'REGISTRO CIVIL', 11, 'RC');
INSERT INTO TIPO_ID (TIID_COD, TIID_NOM, TIID_CODIGO, TIID_CODSHD) VALUES ('T', 'TARJETA IDENTIDAD', 12, 'TI');
INSERT INTO TIPO_ID (TIID_COD, TIID_NOM, TIID_CODIGO, TIID_CODSHD) VALUES ('C', 'CEDULA CIUDADANIA', 13, 'CC');
INSERT INTO TIPO_ID (TIID_COD, TIID_NOM, TIID_CODIGO, TIID_CODSHD) VALUES ('X', 'TARJETA EXTRANJERIA', 21, '');
INSERT INTO TIPO_ID (TIID_COD, TIID_NOM, TIID_CODIGO, TIID_CODSHD) VALUES ('E', 'CEDULA EXTRANJERIA', 22, 'CE');
INSERT INTO TIPO_ID (TIID_COD, TIID_NOM, TIID_CODIGO, TIID_CODSHD) VALUES ('N', 'NIT PERSONA NATURAL', 31, 'NIT');
INSERT INTO TIPO_ID (TIID_COD, TIID_NOM, TIID_CODIGO, TIID_CODSHD) VALUES ('P', 'PASAPORTE', 41, 'PA');
INSERT INTO TIPO_ID (TIID_COD, TIID_NOM, TIID_CODIGO, TIID_CODSHD) VALUES ('D', 'DOCUMENTO EXTRANJERO', 42, '');
INSERT INTO TIPO_ID (TIID_COD, TIID_NOM, TIID_CODIGO, TIID_CODSHD) VALUES ('J', 'NIT PERSONA JURIDICA', 31, 'NIT');
INSERT INTO TIPO_ID (TIID_COD, TIID_NOM, TIID_CODIGO, TIID_CODSHD) VALUES ('U', 'NIUP', 40, '');
INSERT INTO TIPO_ID (TIID_COD, TIID_NOM, TIID_CODIGO, TIID_CODSHD) VALUES ('S', 'EXTRANJERO SIN DOCUMENTO', 43, '');
COMMIT WORK;

SET TERM ^ ;

CREATE OR ALTER procedure MEDIOS_MAGNETICOS_SHD (
    CUENTA varchar(20),
    FECINI varchar(8),
    FECFIN varchar(8),
    NITSHD varchar(20),
    HECHA CHAR(1))
returns (
    TIPOID char(3),
    NIT varchar(20),
    NOMBRE varchar(60),
    DIRECCION varchar(60),
    TELEFONO varchar(40),
    MUNICIPIO varchar(5),
    NOMMUNICIPIO varchar(40),
    DEPARTAMENTO varchar(40),
    BASERET numeric(18,2),
    PORCRET numeric(9,2),
    RETENCION numeric(18,2))
AS
declare variable LONCTA INTEGER;
declare variable LONCIU INTEGER;
declare variable NOMCIUDAD VARCHAR(60);
begin
if (HECHA = 'S') then
    BEGIN
    LONCTA = STRLEN(CUENTA);
    FOR SELECT MAX(D.TERC_NIT), SUM(CODE_CREDITO-CODE_DEBITO), SUM(CODE_BASE*-1), MAX(CODE_PORC) FROM COMPROBANTE_DETALLE D, COMPROBANTE_ENCABEZADO E
        WHERE E.ENCO_CONSEC = D.ENCO_CONSEC AND ENCO_FECHA >= :FECINI AND ENCO_FECHA <= :FECFIN AND D.TERC_NIT <> :NITSHD AND
        (SUBSTR(CUEN_COD,1,:LONCTA) = :CUENTA) AND ((CODE_CREDITO <> 0) or (CODE_DEBITO <> 0))
        GROUP BY D.TERC_NIT, CODE_PORC
        INTO :NIT, :RETENCION, :baseret, :porcret
        DO
        BEGIN
        SELECT TERC_TIPOID, TERC_NOM, TERC_DIR, SUBSTR(TERC_TEL,1,10), CIUD_COD FROM TERCEROS WHERE TERC_NIT = :NIT
            INTO :TIPOID, :NOMBRE, :DIRECCION, :TELEFONO, :MUNICIPIO;
        SELECT TIID_CODSHD FROM TIPO_ID WHERE TIID_COD = :tipoid INTO :tipoid;
        if (MUNICIPIO <> '') then
            BEGIN
            SELECT CIUD_NOM FROM CIUDADES WHERE CIUD_COD = :MUNICIPIO INTO :nomciudad;
            lonciu = STRLEN(nomciudad);
            EXECUTE PROCEDURE POS(' - ', NOMCIUDAD) returning_values (LONCTA);
            nommunicipio = SUBSTR(nomciudad, 1, LONCTA);
            departamento = SUBSTR(nomciudad, LONCTA+3, LONCIU);
            END
        ELSE
            BEGIN
            nommunicipio = '';
            departamento = '';
            END
        SUSPEND;
        END
    END
ELSE
    BEGIN
    LONCTA = STRLEN(CUENTA);
    FOR SELECT MAX(D.TERC_NIT), SUM(CODE_DEBITO-CODE_CREDITO), SUM(CODE_BASE) FROM COMPROBANTE_DETALLE D, COMPROBANTE_ENCABEZADO E
        WHERE E.ENCO_CONSEC = D.ENCO_CONSEC AND ENCO_FECHA >= :FECINI AND ENCO_FECHA <= :FECFIN AND D.TERC_NIT <> :NITSHD AND
        (SUBSTR(CUEN_COD,1,:LONCTA) = :CUENTA) AND ((CODE_CREDITO <> 0) or (CODE_DEBITO <> 0))
        GROUP BY D.TERC_NIT
        INTO :NIT, :RETENCION, :baseret
        DO
        BEGIN
        SELECT TERC_TIPOID, TERC_NOM, TERC_DIR, SUBSTR(TERC_TEL,1,10), CIUD_COD FROM TERCEROS WHERE TERC_NIT = :NIT
            INTO :TIPOID, :NOMBRE, :DIRECCION, :TELEFONO, :MUNICIPIO;
        SELECT TIID_CODSHD FROM TIPO_ID WHERE TIID_COD = :tipoid INTO :tipoid;
        if (MUNICIPIO <> '') then
            BEGIN
            SELECT CIUD_NOM FROM CIUDADES WHERE CIUD_COD = :MUNICIPIO INTO :nomciudad;
            lonciu = STRLEN(nomciudad);
            EXECUTE PROCEDURE POS(' - ', NOMCIUDAD) returning_values (LONCTA);
            nommunicipio = SUBSTR(nomciudad, 1, LONCTA);
            departamento = SUBSTR(nomciudad, LONCTA+3, LONCIU);
            END
        ELSE
            BEGIN
            nommunicipio = '';
            departamento = '';
            END
        SUSPEND;
        END
    END
end
^

SET TERM ; ^


/* 20090923C */
/* NO PERMITA NULL EN DB O CR */
SET TERM ^ ;

CREATE OR ALTER TRIGGER PUNTOS_CLIENTE_BI FOR PUNTOS_CLIENTE
ACTIVE BEFORE INSERT POSITION 0
as
declare variable ID INTEGER;
declare variable fec DATE;
declare variable SALDOANT NUMERIC(18,2);
declare variable MOV NUMERIC(18,2);
begin
if (new.ptcl_db is null) then
    new.ptcl_db = 0;
if (new.ptcl_cr is null) then
    new.ptcl_cr = 0;
NEW.ptcl_id = gen_id(id_puntos, 1);
SELECT MAX(PTCL_ID) FROM PUNTOS_CLIENTE WHERE PTCL_NIT = NEW.ptcl_nit AND PTCL_FECHA < NEW.ptcl_fecha INTO :ID;
if (ID IS NULL) then
    NEW.ptcl_saldo = 0;
ELSE
    BEGIN
    SELECT PTCL_FECHA, PTCL_SALDO FROM PUNTOS_CLIENTE WHERE PTCL_NIT = NEW.ptcl_nit AND PTCL_ID = :id INTO :fec, :saldoant;
    SELECT SUM(PTCL_DB - PTCL_CR) FROM puntos_cliente WHERE PTCL_NIT = NEW.ptcl_nit AND PTCL_FECHA = :fec INTO :mov;
    NEW.ptcl_saldo = saldoant + mov;
    END
end
^

SET TERM ; ^


/* 20090923B */

INSERT INTO CONFIGURACION (CONF_MODULO, CONF_CATEGORIA, CONF_PROPIEDAD, CONF_VALOR, CONF_POSIBLES, CONF_AYUDA) VALUES ('INVENTARIO', 'EXISTENCIAS', 'REPORTE ABC DEL INVENTARIO CON LA UTILIDAD O EL VALOR DE VENTA', 'COSTO', 'UTILIDAD,VENTA,COSTO', 'Cálcula el porcentaje de aporte por artículo con base en la utilidad, en el costo en ventas o el valor de venta. con utilidad puede demorarse más que con las otras dos opciones');
COMMIT WORK;

ALTER TABLE ANALISIS_ABCINVEN
ADD ABCI_CANT T_CANTIDAD;

update RDB$RELATION_FIELDS set
RDB$NULL_FLAG = 1
where (RDB$FIELD_NAME = 'ABCI_COD') and
(RDB$RELATION_NAME = 'ANALISIS_ABCINVEN');

alter table ANALISIS_ABCINVEN
add constraint PK_ANALISIS_ABCINVEN
primary key (ABCI_COD);

SET TERM ^ ;

CREATE OR ALTER procedure REP_ABC_INVENTARIO (
    FECHA date,
    ARTINI varchar(20),
    ARTFIN varchar(20),
    GRPINI varchar(2),
    GRPFIN varchar(2),
    ORDEN char(1),
    DIAS integer)
returns (
    CODIGO varchar(15),
    NOMBRE varchar(60),
    UNIDAD varchar(8),
    CODGRUPO varchar(2),
    NOMGRUPO varchar(30),
    CODSUBG varchar(3),
    NOMSUBG varchar(30),
    CODMARC varchar(3),
    NOMMARC varchar(30),
    COSTO numeric(18,2),
    SALIDAT numeric(18,4),
    VPROMEDIO numeric(18,4),
    PORC numeric(9,2),
    CLASE char(1))
AS
DECLARE VARIABLE CODINI VARCHAR(20);
DECLARE VARIABLE CODFIN VARCHAR(20);
DECLARE VARIABLE DESINI VARCHAR(20);
DECLARE VARIABLE DESFIN VARCHAR(20);
declare variable ACUMULADO NUMERIC(18,2);
declare variable ACUMULAC NUMERIC(18,4);
declare variable ACUMPORC NUMERIC(9,2);
declare variable FECINI DATE;
declare variable A NUMERIC(9,2);
declare variable B NUMERIC(9,2);
declare variable C NUMERIC(9,2);
declare variable MODO VARCHAR(10);
declare variable VENTAS numeric(18,4);
declare variable DEVOL numeric(18,4);
declare variable FECAUX DATE;
BEGIN
if (ORDEN = 'C') then
    BEGIN
    CODINI = ARTINI;
    CODFIN = ARTFIN;
    DESINI = '';
    DESFIN = 'zz';
    END
ELSE
    BEGIN
    DESINI = ARTINI;
    DESFIN = ARTFIN;
    CODINI = '';
    CODFIN = 'zz';
    END
DELETE FROM analisis_abcinven;
acumporc = 0;
FECINI = FECHA - DIAS;
/* CALCULE LA VENTA PROMEDIO DE CADA ARTICULO */
EXECUTE PROCEDURE LEE_CONFIGURACION ('INVENTARIO', 'EXISTENCIAS', 'PORCENTAJE MINIMO PARA ARTICULO CLASE "A"') returning_values (A);
EXECUTE PROCEDURE LEE_CONFIGURACION ('INVENTARIO', 'EXISTENCIAS', 'PORCENTAJE MINIMO PARA ARTICULO CLASE "B"') returning_values (B);
EXECUTE PROCEDURE LEE_CONFIGURACION ('INVENTARIO', 'EXISTENCIAS', 'PORCENTAJE MINIMO PARA ARTICULO CLASE "C"') returning_values (C);
EXECUTE PROCEDURE LEE_CONFIGURACION ('INVENTARIO', 'EXISTENCIAS', 'REPORTE ABC DEL INVENTARIO CON LA UTILIDAD O EL VALOR DE VENTA') returning_values (MODO);
FOR SELECT ARTI_COD, ARTI_UNIDAD FROM ARTICULO A
      WHERE ARTI_COD >= :CODINI AND ARTI_COD <= :CODFIN AND A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :GRPFIN AND ARTI_DES >= :DESINI AND ARTI_DES <= :DESFIN AND A.ESAR_COD <> 'I'
      INTO :CODIGO, :UNIDAD
      DO
      BEGIN
      SELECT SUM(FADE_TOTAL - FADE_CONSUMO - FADE_IVAMONTO) FROM FACTURAS_DETALLE D, FACTURAS F
            WHERE F.fact_id = D.fact_id AND ARTI_COD = :codigo AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECHA AND FADE_ANULADO = 'N' INTO :ventas;
      if (ventas IS NULL) then
          ventas = 0;
      SELECT SUM(DVDE_TOTAL - DVDE_CONSUMO - DVDE_IVAMONTO) FROM devoluciones_ventas_detalle D, devoluciones_ventas F
            WHERE F.devt_id = D.devt_id AND ARTI_COD = :codigo AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECHA AND DVDE_ANULADO = 'N' INTO :devol;
      if (devol IS NULL) then
          devol = 0;
      VENTAS = VENTAS - DEVOL;
      if (VENTAS > 0) then
        BEGIN
        acumulado = 0;
        acumulac = 0;
        if (MODO = 'UTILIDAD') then
            BEGIN
            FOR SELECT FACT_FECHA, FADE_CANT * FADE_FACTOR FROM FACTURAS_DETALLE D, FACTURAS F
                WHERE F.fact_id = D.fact_id AND ARTI_COD = :codigo AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECHA AND FADE_ANULADO = 'N'
                INTO :FECAUX, :salidat
                DO
                BEGIN
                EXECUTE PROCEDURE COSTO_PROMEDIO(:codigo, :fecaux) returning_values (:costo);
                acumulado = acumulado + costo * salidat;
                acumulac = acumulac + salidat;
                END
            FOR SELECT DEVT_FECHA, DVDE_CANT * DVDE_FACTOR FROM devoluciones_ventas_detalle D, devoluciones_ventas F
                WHERE F.devt_id = D.devt_id AND ARTI_COD = :codigo AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECHA AND DVDE_ANULADO = 'N'
                INTO :FECAUX, :salidat
                DO
                BEGIN
                EXECUTE PROCEDURE COSTO_PROMEDIO(:codigo, :fecaux) returning_values (:costo);
                acumulado = acumulado - costo * salidat;
                acumulac = acumulac - salidat;
                END
            ventas = ventas - acumulado;
            END
        insert into analisis_abcinven (ABCI_COD, ABCI_VENTA, ABCI_CANT) VALUES (:codigo, :ventas, :acumulac);
        END
    END
SELECT SUM(ABCI_VENTA) FROM analisis_abcinven INTO :acumulado;
FOR SELECT ARTI_COD, ARTI_DES, ARTI_UNIDAD, ARTI_DIAS, A.GRUP_COD, GRUP_NOM, A.SUBG_COD, A.MARC_COD, ABCI_VENTA, ABCI_CANT
      FROM ARTICULO A, GRUPO G, analisis_abcinven N
      WHERE A.ARTI_COD = N.abci_cod AND G.GRUP_COD = A.GRUP_COD
      ORDER BY ABCI_VENTA DESC
      INTO :CODIGO, :NOMBRE, :UNIDAD, :DIAS, :CODGRUPO, :NOMGRUPO, :CODSUBG, :CODMARC, :vpromedio, :salidat
      DO
        BEGIN
        NOMMARC = '';
        NOMSUBG = '';
        SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO :NOMMARC;
        SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
        if (acumulado <> 0) then
            PORC = vpromedio / acumulado * 100;
        ELSE
            PORC = 0;
        acumporc = acumporc + porc;
        if (acumporc < A) then
            CLASE = 'A';
        else
            if (acumporc < B) then
                CLASE = 'B';
            else
                if (acumporc < c) then
                    CLASE = 'C';
                else
                    CLASE = 'D';
        SUSPEND;
        END
END
^

SET TERM ; ^


update revision set revi_FECHA = '2009/09/23';
COMMIT WORK;



/* 20090925 */
/* CARGABA EL RETAL A AL BOD DE PROD.TERMINADO Y NO A LA DE RETAL */

SET TERM ^ ;

CREATE OR ALTER TRIGGER ENSAMBLES_AI FOR ENSAMBLES
ACTIVE AFTER INSERT POSITION 0
AS
declare variable COSTO NUMERIC(18,2);
BEGIN
if ((NEW.ENSA_id <> 0) and (new.ensa_anulado = 'N')) then
  begin
  COSTO = new.ensa_costo / NEW.ensa_factor;
  INSERT INTO MOVIMIENTO_ARTICULO
    (ARTI_COD, MVAR_CONS, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM)
    VALUES(NEW.ARTI_COD, GEN_ID(ID_MOVARTI,1), new.bode_cod, new.ensa_fecha, 15, NEW.ensa_id,
    new.ensa_conc, NEW.ensa_factor * new.ensa_cant, :COSTO, 'S', new.ensa_lote, new.pref_pre, new.ensa_numero, 0);

  /* RECORRA LAS LISTAS DE PRECIOS Y CAMBIE EL PRECIO */
  EXECUTE PROCEDURE CALCULA_PRECIOS(NEW.ARTI_COD, new.ensa_fecha);

  /* ingrese el retal */
  if ((new.ensa_codretal is not null) and (new.ensa_codretal <> '')) then
      INSERT INTO MOVIMIENTO_ARTICULO
        (ARTI_COD, MVAR_CONS, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM)
        VALUES(NEW.ensa_codretal, GEN_ID(ID_MOVARTI,1), new.ensa_bodretal, new.ensa_fecha, 15, NEW.ensa_id,
        new.ensa_conc, new.ensa_cantretal, :COSTO, 'S', new.ensa_lote, new.pref_pre, new.ensa_numero, 999);

  INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
    VALUES (USER, 15, NEW.ensa_id, 'I', NEW.pref_pre || NEW.ensa_numero);
  end
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER ENSAMBLES_AU FOR ENSAMBLES
ACTIVE AFTER UPDATE POSITION 0
AS
declare variable COSTO NUMERIC(18,2);
declare variable consec INTEGER;
BEGIN
/* BORRE LA CONTABILIZACION */
if (NEW.ensa_anulado = 'S') then
    BEGIN
    select enco_consec from comprobante_encabezado where enco_tiporef = 15 and enco_idref = old.ensa_id into :consec;
    if (NOT consec is null) then
     delete from comprobante_detalle where enco_consec = :consec;
    delete from comprobante_encabezado where enco_tiporef = 15 and enco_idref = old.ensa_id;
    INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
        VALUES (USER, 15, NEW.ensa_id, 'A', NEW.pref_pre || NEW.ensa_numero);
    END

/* BORRE EL ANTERIOR Y GRABE EL NUEVO */
if ((OLD.ensa_id <> 0) AND (OLD.ensa_anulado = 'N')) then
    begin
    delete from movimiento_articulo where (mvar_tipodoc = 15) and (mvar_idref = old.ensa_id) and (mvar_item = 0);
    delete from movimiento_articulo where (mvar_tipodoc = 15) and (mvar_idref = old.ensa_id) and (mvar_item = 999);
    end
if ((new.ensa_id <> 0) AND (NEW.ensa_anulado = 'N')) then
    begin
    COSTO = new.ensa_costo / NEW.ensa_factor;
    INSERT INTO MOVIMIENTO_ARTICULO
        (ARTI_COD, MVAR_CONS, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM)
        VALUES(NEW.ARTI_COD, GEN_ID(ID_MOVARTI,1), new.ensa_bodretal, new.ensa_fecha, 15, NEW.ensa_id,
        new.ensa_conc, NEW.ensa_factor * new.ensa_cant, :COSTO, 'S', new.ensa_lote, new.pref_pre, new.ensa_numero, 0);

    /* RECORRA LAS LISTAS DE PRECIOS Y CAMBIE EL PRECIO */
    EXECUTE PROCEDURE CALCULA_PRECIOS(NEW.ARTI_COD, new.ensa_fecha);

    /* ingrese el retal */
    if ((new.ensa_codretal is not null) and (new.ensa_codretal <> '')) then
      INSERT INTO MOVIMIENTO_ARTICULO
        (ARTI_COD, MVAR_CONS, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM)
        VALUES(NEW.ensa_codretal, GEN_ID(ID_MOVARTI,1), new.bode_cod, new.ensa_fecha, 15, NEW.ensa_id,
        new.ensa_conc, new.ensa_cantretal, :COSTO, 'S', new.ensa_lote, new.pref_pre, new.ensa_numero, 999);

    INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
        VALUES (USER, 15, NEW.ensa_id, 'U', NEW.pref_pre || NEW.ensa_numero);
    end
/* SI CAMBIO LA FECHA ACTUALICE LOS DETALLES */
if ((OLD.pref_pre <> NEW.pref_pre) or
    (OLD.ensa_numero <> NEW.ensa_numero) or
    (OLD.ensa_fecha <> NEW.ensa_fecha) ) then
    UPDATE ENSAMBLES_DETALLE SET ESDE_TRANSMIT = 'N' WHERE ENSA_ID = OLD.ENSA_ID;

if (OLD.ensa_anulado <> NEW.ensa_anulado) then
    UPDATE ENSAMBLES_DETALLE SET ESDE_ANULADO = NEW.ensa_anulado WHERE ENSA_ID = OLD.ENSA_ID;

if (OLD.ensa_transmit <> NEW.ensa_transmit) then
    UPDATE ENSAMBLES_DETALLE SET ESDE_TRANSMIT = NEW.ensa_transmit WHERE ENSA_ID = OLD.ENSA_ID;
END
^

SET TERM ; ^

/* 20090909 EN REALIDAD ES DEL 28 DE SEPTIEMBRE*/

CREATE TABLE SUPERVISOR (
    SUPE_ID T_ID NOT NULL,
    SUPE_NOM T_CONCEPTO);
alter table SUPERVISOR
add constraint PK_SUPERVISOR
primary key (SUPE_ID);


INSERT INTO CONFIGURACION (CONF_MODULO, CONF_CATEGORIA, CONF_PROPIEDAD, CONF_VALOR, CONF_POSIBLES, CONF_AYUDA) VALUES ('INVENTARIO', 'ENSAMBLES', 'HABILITAR EL CONTROL DE ORDENES DE PRODUCCION', 'NO', 'SI,NO', 'SI: Reemplaza el control de ensambles por el de ordenes de producción con entradas y salidas parciales de componentes y productos e informe del estado de la produccion');
INSERT INTO CONFIGURACION (CONF_MODULO, CONF_CATEGORIA, CONF_PROPIEDAD, CONF_VALOR, CONF_POSIBLES, CONF_AYUDA) VALUES ('INVENTARIO', 'ENSAMBLES', 'MAXIMO PORCENTAJE DE EXCESO EN ORDENES DE PRODUCCION', '10', '10,15,20,25,30,35,40,45,50', 'Indique el máximo porcentaje de exceso de unidades producidas antes de cerrar la orden de producción');

INSERT INTO TIPO_DOCUMENTO (TIDO_COD, TIDO_NOMCORTO, TIDO_NOMLARGO, TIDO_MODULO, TIDO_INVE, TIDO_CART, TIDO_CXP, TIDO_CAJA, TIDO_BCOS) VALUES (19, 'ORDENPRO', 'ORDENES DE PRODUCCION', 'INVENTARIO', 'S', 'N', 'N', 'N', 'N');
INSERT INTO TIPO_DOCUMENTO (TIDO_COD, TIDO_NOMCORTO, TIDO_NOMLARGO, TIDO_MODULO, TIDO_INVE, TIDO_CART, TIDO_CXP, TIDO_CAJA, TIDO_BCOS) VALUES (20, 'ORDPRODE', 'ENTRADAS DE PRODUCCION', 'INVENTARIO', 'S', 'N', 'N', 'N', 'N');
INSERT INTO TIPO_DOCUMENTO (TIDO_COD, TIDO_NOMCORTO, TIDO_NOMLARGO, TIDO_MODULO, TIDO_INVE, TIDO_CART, TIDO_CXP, TIDO_CAJA, TIDO_BCOS) VALUES (28, 'ORDPRODS', 'SALIDAS A PRODUCCION', 'INVENTARIO', 'S', 'N', 'N', 'N', 'N');
INSERT INTO TIPO_DOCUMENTO (TIDO_COD, TIDO_NOMCORTO, TIDO_NOMLARGO, TIDO_MODULO, TIDO_INVE, TIDO_CART, TIDO_CXP, TIDO_CAJA, TIDO_BCOS) VALUES (29, 'ORDPRODD', 'DEVOLUCION MATERIAL', 'INVENTARIO', 'S', 'N', 'N', 'N', 'N');
COMMIT WORK;

/* PRODUCCION CAJAS PLASTICAS */
ALTER TABLE ARTICULO
ADD ARTI_CICLO SMALLINT;

CREATE TABLE PRODUCTO_MONTAJE (
    ARTI_COD T_COD_ARTICULO NOT NULL,
    PRMO_ITEM T_ID NOT NULL,
    PRMO_PROCESO T_CONCEPTO,
    PRMO_MINUTOS SMALLINT);
alter table PRODUCTO_MONTAJE
add constraint PK_PRODUCTO_MONTAJE
primary key (ARTI_COD,PRMO_ITEM);

CREATE TABLE PRODUCCION_ORDEN (
    PROR_ID T_ID NOT NULL,
    PREF_PRE VARCHAR(4),
    PROR_NUMERO T_NUMDOC,
    PROR_FECHA DATE,
    PROR_NIT T_NIT,
    PROR_MAQUINA T_ID,
    PROR_PRODUCTO T_COD_ARTICULO,
    PROR_DESC T_CONCEPTO,
    PROR_CICLO SMALLINT,
    PROR_BODEGA VARCHAR(2),
    PROR_CANT T_CANTIDAD,
    PROR_UNIDAD T_UNIDAD,
    PROR_FACTOR T_CANTIDAD,
    PROR_LOTE T_LOTE,
    PROR_LOTEVENCE DATE,
    PROR_PESO T_CANTIDAD,
    PROR_PRIORIDAD SMALLINT,
    PROR_FECHAENT DATE,
    PROR_OBS BLOB SUB_TYPE 1 SEGMENT SIZE 80,
    PROR_USUARIO T_USUARIO,
    PROR_ANULADO T_BOOLEANO,
    PROR_TRANSMIT T_BOOLEANO,
    PROR_NUMOK T_BOOLEANO);
ALTER TABLE PRODUCCION_ORDEN
ADD PROR_ESTADO CHAR(1);
ALTER TABLE PRODUCCION_ORDEN ADD PROR_FECMONTAJE DATE;

alter table PRODUCCION_ORDEN
add constraint PK_PRODUCCION_ORDEN
primary key (PROR_ID);
alter table PRODUCCION_ORDEN
add constraint FK_PRODUCCION_ORDEN_1
foreign key (PROR_PRODUCTO)
references ARTICULO(ARTI_COD);
CREATE INDEX PRODUCCION_ORDEN_IDX2
ON PRODUCCION_ORDEN (PROR_FECHA);
CREATE INDEX PRODUCCION_ORDEN_IDX1
ON PRODUCCION_ORDEN (PROR_MAQUINA);

CREATE TABLE PRODUCCION_ORDEN_DETALLE (
    PROR_ID T_ID NOT NULL,
    PODE_ITEM T_ID NOT NULL,
    PODE_CODBAR T_COD_ARTICULO,
    PODE_CANT T_CANTIDAD,
    PODE_UNIDAD T_UNIDAD,
    PODE_FACTOR T_CANTIDAD,
    PODE_COSTO T_MONTO,
    ARTI_COD T_COD_ARTICULO,
    PODE_LOTE T_LOTE,
    PODE_OBS BLOB SUB_TYPE 1 SEGMENT SIZE 80,
    PODE_IVAPORC T_PORCENTAJE,
    PODE_IVAMONTO T_MONTO,
    PODE_ANULADO T_BOOLEANO,
    PODE_TRANSMIT T_BOOLEANO,
    PODE_DESC T_CONCEPTO,
    PODE_TOTAL T_MONTO,
    PODE_PESO T_CANTIDAD);
alter table PRODUCCION_ORDEN_DETALLE add constraint PK_PRODUCCION_ORDEN_DETALLE
primary key (PROR_ID,PODE_ITEM);
alter table PRODUCCION_ORDEN_DETALLE add constraint FK_PRODUCCION_ORDEN_DETALLE_1
foreign key (PROR_ID) references PRODUCCION_ORDEN(PROR_ID) on delete CASCADE on update CASCADE;
ALTER TABLE PRODUCCION_ORDEN_DETALLE
ADD PODE_BODEGA VARCHAR(2);

CREATE TABLE PRODUCCION_ENTRADA_ENC (
    PRDE_ID T_ID NOT NULL,
    PROR_ID T_ID NOT NULL,
    PROR_NIT T_NIT,
    PROR_PRODUCTO T_COD_ARTICULO,
    PRDE_PREF VARCHAR(4) CHARACTER SET NONE,
    PRDE_NUMERO T_NUMDOC,
    PRDE_FECHA DATE,
    PRDE_SUPERVISOR T_ID,
    PRDE_OBS BLOB SUB_TYPE 1 SEGMENT SIZE 80,
    PRDE_ANULADO T_BOOLEANO,
    PRDE_TRANSMIT T_BOOLEANO,
    PRDE_NUMOK T_BOOLEANO,
    PRDE_USUARIO T_USUARIO);
alter table PRODUCCION_ENTRADA_ENC add constraint PK_PRODUCCION_ENTRADA_ENC
primary key (PRDE_ID);
ALTER TABLE PRODUCCION_ENTRADA_ENC
ADD PRDE_COSTO T_MONTO;
ALTER TABLE PRODUCCION_ENTRADA_ENC
ADD PRDE_LOTE T_LOTE;
ALTER TABLE PRODUCCION_ENTRADA_ENC
ADD PRDE_BODPROD VARCHAR(2);
ALTER TABLE PRODUCCION_ENTRADA_ENC
ADD PRDE_BODRECH VARCHAR(2);

CREATE TABLE PRODUCCION_ENTRADA_DET (
    PRDE_ID T_ID NOT NULL,
    PREN_ITEM T_ID NOT NULL,
    ARTI_COD T_COD_ARTICULO,
    BODE_COD VARCHAR(2),
    PREN_DESC T_COD_ARTICULO,
    PREN_CANTOK T_CANTIDAD,
    PREN_UNIDAD T_UNIDAD,
    PREN_FACTOR T_CANTIDAD,
    PREN_CANTMAL T_CANTIDAD,
    PREN_PESO T_CANTIDAD,
    PREN_ANULADO T_BOOLEANO,
    PREN_TRANSMIT T_BOOLEANO,
    PREN_USUARIO T_USUARIO,
    PREN_TURNO SMALLINT,
    PREN_OPERARIO T_ID,
    PREN_SUPERVISOR T_CONCEPTO,
    PREN_OBS BLOB SUB_TYPE 1 SEGMENT SIZE 80);
alter table PRODUCCION_ENTRADA_DET add constraint PK_PRODUCCION_ENTRADA
primary key (PRDE_ID,PREN_ITEM);
alter table PRODUCCION_ENTRADA_DET add constraint FK_PRODUCCION_ENTRADA_DET_1
foreign key (PRDE_ID) references PRODUCCION_ENTRADA_ENC(PRDE_ID) on delete CASCADE on update CASCADE;
ALTER TABLE PRODUCCION_ENTRADA_DET DROP PREN_SUPERVISOR;
ALTER TABLE PRODUCCION_ENTRADA_ENC ADD PRDE_RECHAZADO T_COD_ARTICULO;

CREATE TABLE PRODUCCION_SALIDA_ENC (
    PRSA_ID T_ID NOT NULL,
    PROR_ID T_ID,
    PRSA_PRODUCTO T_COD_ARTICULO,
    PRSA_PREF VARCHAR(4),
    PRSA_NUMERO T_NUMDOC,
    PRSA_FECHA DATE,
    PRSA_SUPERVISOR T_ID,
    PRSA_OBS BLOB SUB_TYPE 1 SEGMENT SIZE 80,
    PRSA_ANULADO T_BOOLEANO,
    PRSA_TRANSMIT T_BOOLEANO,
    PRSA_NUMOK T_BOOLEANO,
    PRSA_USUARIO T_USUARIO);
alter table PRODUCCION_SALIDA_ENC add constraint PK_PRODUCCION_SALIDA_ENC
primary key (PRSA_ID);
ALTER TABLE PRODUCCION_SALIDA_ENC
ADD PRSA_BODEGA VARCHAR(2);

CREATE TABLE PRODUCCION_SALIDA_DET (
    PRSA_ID T_ID NOT NULL,
    PRSA_ITEM T_ID NOT NULL,
    PRSA_CODBAR T_COD_ARTICULO,
    BODE_COD VARCHAR(2),
    PRSA_CANT T_CANTIDAD,
    PRSA_UNIDAD T_UNIDAD,
    PRSA_FACTOR T_CANTIDAD,
    ARTI_COD T_COD_ARTICULO,
    PRSA_COSTO T_MONTO,
    PRSA_DESC T_CONCEPTO,
    PRSA_ANULADO T_BOOLEANO,
    PRSA_TRANSMIT T_BOOLEANO,
    PRSA_TOTAL T_MONTO,
    PRSA_LOTE T_LOTE,
    PRSA_PESO T_CANTIDAD);
alter table PRODUCCION_SALIDA_DET add constraint PK_PRODUCCION_SALIDA_DET
primary key (PRSA_ID,PRSA_ITEM);
alter table PRODUCCION_SALIDA_DET add constraint FK_PRODUCCION_SALIDA_DET_1
foreign key (PRSA_ID) references PRODUCCION_SALIDA_ENC(PRSA_ID) on delete CASCADE on update CASCADE;

CREATE SEQUENCE ID_ORDENPROD;
CREATE SEQUENCE ID_PRODENT;
CREATE SEQUENCE ID_PRODSAL;
CREATE SEQUENCE ID_PRODDEV;

SET TERM ^ ;

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

SET TERM ; ^

SET TERM ^ ;

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

SET TERM ; ^

SET TERM ^ ;

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

SET TERM ; ^

grant EXECUTE on PROCEDURE cambie_id_ordenprod to PUBLIC;
grant EXECUTE on PROCEDURE cambie_id_prodent to PUBLIC;
grant EXECUTE on PROCEDURE cambie_id_prodsal to PUBLIC;

SET TERM ^ ;

CREATE OR ALTER TRIGGER PRODUCCION_ORDEN_BI FOR PRODUCCION_ORDEN
ACTIVE BEFORE INSERT POSITION 0
AS
declare variable NUMERO VARCHAR(8);
declare variable AUTOM CHAR(1);
declare variable EXISTE CHAR(1);
BEGIN
if (NEW.pror_numok = 'N') then
  BEGIN
  /* Actualice el contador del prefijo */
  SELECT PREF_ACTUAL, PREF_AUTO FROM PREFIJOS WHERE TIDO_COD = 19 AND PREF_PRE = NEW.PREF_PRE INTO :NUMERO, :AUTOM;
  if (AUTOM = 'S') then
    BEGIN
    /* ACTUALICE EL NUMERO EN COMPROBANTE_ENCABEZADO  */
    NEW.pror_numero = NUMERO;
    NUMERO = CAST((CAST(NUMERO AS INTEGER) + 1) AS CHAR(6));
    UPDATE PREFIJOS
      SET PREF_ACTUAL = :NUMERO
    WHERE TIDO_COD = 19 AND PREF_PRE = NEW.PREF_PRE;
    END
  ELSE
    begin
    if (CAST(NUMERO AS INTEGER) = CAST(NEW.pror_numero AS INTEGER)) then
        UPDATE PREFIJOS
          SET PREF_ACTUAL = CAST((CAST(PREF_ACTUAL AS INTEGER) + 1) AS CHAR(6))
        WHERE TIDO_COD = 19 AND PREF_PRE = NEW.PREF_PRE;
    end
  EXECUTE PROCEDURE COMPLETA_CEROS (NEW.pror_numero) returning_values (NEW.pror_numero);
  NEW.pror_numok = 'S';
  END
/* Verifique que el numero no existe previamente */
EXISTE = 'N';
SELECT 'S' FROM produccion_orden WHERE PREF_PRE = NEW.PREF_PRE AND PROR_NUMERO = NEW.pror_numero INTO :EXISTE;
if (EXISTE = 'S') then
    EXCEPTION DOCUMENTO_REGISTRADO 'Ya existe una orden con el número ' || new.pref_pre || new.pror_numero;
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER PRODUCCION_ENTRADA_ENC_BI FOR produccion_entrada_enc
ACTIVE BEFORE INSERT POSITION 0
AS
declare variable NUMERO VARCHAR(8);
declare variable AUTOM CHAR(1);
declare variable EXISTE CHAR(1);
BEGIN
if (NEW.prde_numok = 'N') then
  BEGIN
  /* Actualice el contador del prefijo */
  SELECT PREF_ACTUAL, PREF_AUTO FROM PREFIJOS WHERE TIDO_COD = 20 AND PREF_PRE = NEW.prde_pref INTO :NUMERO, :AUTOM;
  if (AUTOM = 'S') then
    BEGIN
    /* ACTUALICE EL NUMERO EN COMPROBANTE_ENCABEZADO  */
    NEW.prde_numero = NUMERO;
    NUMERO = CAST((CAST(NUMERO AS INTEGER) + 1) AS CHAR(6));
    UPDATE PREFIJOS
      SET PREF_ACTUAL = :NUMERO
    WHERE TIDO_COD = 20 AND PREF_PRE = NEW.prde_pref;
    END
  ELSE
    begin
    if (CAST(NUMERO AS INTEGER) = CAST(NEW.prde_numero AS INTEGER)) then
        UPDATE PREFIJOS
          SET PREF_ACTUAL = CAST((CAST(PREF_ACTUAL AS INTEGER) + 1) AS CHAR(6))
        WHERE TIDO_COD = 20 AND PREF_PRE = NEW.prde_pref;
    end
  EXECUTE PROCEDURE COMPLETA_CEROS (NEW.prde_numero) returning_values (NEW.prde_numero);
  NEW.prde_numok = 'S';
  END
/* Verifique que el numero no existe previamente */
EXISTE = 'N';
SELECT 'S' FROM produccion_entrada_enc WHERE PRDE_PREF = NEW.prde_pref AND PRDE_NUMERO = NEW.prde_numero INTO :EXISTE;
if (EXISTE = 'S') then
    EXCEPTION DOCUMENTO_REGISTRADO 'Ya existe una entrada de producción con el número ' || new.prde_pref || new.prde_numero;
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER PRODUCCION_SALIDA_ENC_BI for PRODUCCION_SALIDA_ENC
active BEFORE INSERT position 0
as
declare variable NUMERO VARCHAR(8);
declare variable AUTOM CHAR(1);
declare variable EXISTE CHAR(1);
BEGIN
if (NEW.prsa_numok = 'N') then
  BEGIN
  /* Actualice el contador del prefijo */
  SELECT PREF_ACTUAL, PREF_AUTO FROM PREFIJOS WHERE TIDO_COD = 28 AND PREF_PRE = NEW.prsa_pref INTO :NUMERO, :AUTOM;
  if (AUTOM = 'S') then
    BEGIN
    /* ACTUALICE EL NUMERO EN COMPROBANTE_ENCABEZADO  */
    NEW.prsa_numero = NUMERO;
    NUMERO = CAST((CAST(NUMERO AS INTEGER) + 1) AS CHAR(6));
    UPDATE PREFIJOS
      SET PREF_ACTUAL = :NUMERO
    WHERE TIDO_COD = 28 AND PREF_PRE = NEW.prsa_pref;
    END
  ELSE
    begin
    if (CAST(NUMERO AS INTEGER) = CAST(NEW.prsa_numero AS INTEGER)) then
        UPDATE PREFIJOS
          SET PREF_ACTUAL = CAST((CAST(PREF_ACTUAL AS INTEGER) + 1) AS CHAR(6))
        WHERE TIDO_COD = 28 AND PREF_PRE = NEW.prsa_pref;
    end
  EXECUTE PROCEDURE COMPLETA_CEROS (NEW.prsa_numero) returning_values (NEW.prsa_numero);
  NEW.prsa_numok = 'S';
  END
/* Verifique que el numero no existe previamente */
EXISTE = 'N';
SELECT 'S' FROM produccion_salida_enc WHERE PRSA_PREF = NEW.prsa_pref AND PRSA_NUMERO = NEW.prsa_numero INTO :EXISTE;
if (EXISTE = 'S') then
    EXCEPTION DOCUMENTO_REGISTRADO 'Ya existe una salida a producción con el número ' || new.prsa_pref || new.prsa_numero;
end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER PRODUCCION_ORDEN_AI for PRODUCCION_ORDEN
active AFTER INSERT position 0
as
begin
INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
    VALUES (USER, 19, NEW.pror_id, 'I', NEW.pref_pre || NEW.pror_numero);
end
^

SET TERM ; ^

ALTER TABLE PRODUCCION_ORDEN
ADD PROR_NOMCLIENTE T_CONCEPTO;
ALTER TABLE PRODUCCION_ORDEN
ADD ARTI_COD T_COD_ARTICULO;

SET TERM ^ ;

CREATE OR ALTER TRIGGER PRODUCCION_SALIDA_ENC_AI for PRODUCCION_SALIDA_ENC
active AFTER INSERT position 0
as
begin
INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
    VALUES (USER, 28, NEW.prsa_id, 'U', NEW.prsa_pref || NEW.prsa_numero);
end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER PRODUCCION_ENTRADA_ENC_AI for PRODUCCION_ENTRADA_ENC
active AFTER INSERT position 0
as
begin
INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
    VALUES (USER, 20, NEW.prde_id, 'I', NEW.prde_pref || NEW.prde_numero);
end
^

SET TERM ; ^

CREATE EXCEPTION PRODUCCION_NO_EXISTE 'No existe la orden de producción especificada';
CREATE EXCEPTION ENTRADAPROD_NO_EXISTE 'No existe la entrada de producto especificada';
CREATE EXCEPTION SALIDAPROD_NO_EXISTE 'No existe la salida a producción especificada';

SET TERM ^ ;

CREATE OR ALTER TRIGGER PRODUCCION_ORDEN_DETALLE_BI for PRODUCCION_ORDEN_DETALLE
active BEFORE INSERT position 0
as
declare variable NUMROWS integer;
begin
    /*  PARENT 'ARTICULO' MUST EXIST WHEN INSERTING A CHILD IN 'ENSAMBLES_DETALLE'  */
    IF (NEW.ARTI_COD IS NOT NULL) THEN
    BEGIN
       SELECT COUNT(*)
       FROM   ARTICULO
       WHERE  ARTICULO.ARTI_COD = NEW.ARTI_COD
       INTO   :NUMROWS;
       IF (NUMROWS = 0) THEN
       BEGIN
          EXCEPTION ARTICULO_NO_EXISTE;
       END
    END
    /*  PARENT 'BODEGA' MUST EXIST WHEN INSERTING A CHILD IN 'ENSAMBLES_DETALLE'  */
    IF (NEW.pode_bodega IS NOT NULL) THEN
    BEGIN
       SELECT COUNT(*)
       FROM   BODEGA
       WHERE  BODEGA.BODE_COD = NEW.pode_bodega
       INTO   :NUMROWS;
       IF (NUMROWS = 0) THEN
       BEGIN
          EXCEPTION BODEGA_NO_EXISTE;
       END
    END
    /*  PARENT 'ENSAMBLES' MUST EXIST WHEN INSERTING A CHILD IN 'ENSAMBLES_DETALLE'  */
    IF (NEW.pror_id IS NOT NULL) THEN
    BEGIN
       SELECT COUNT(*)
       FROM   produccion_orden
       WHERE  produccion_orden.pror_id = NEW.pror_id
       INTO   :NUMROWS;
       IF (NUMROWS = 0) THEN
       BEGIN
          EXCEPTION produccion_no_existe;
       END
    END
end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER PRODUCCION_ENTRADA_DET_BI for PRODUCCION_ENTRADA_DET
active BEFORE INSERT position 0
as
declare variable NUMROWS integer;
begin
    /*  PARENT 'ARTICULO' MUST EXIST WHEN INSERTING A CHILD IN 'ENSAMBLES_DETALLE'  */
    IF (NEW.ARTI_COD IS NOT NULL) THEN
    BEGIN
       SELECT COUNT(*)
       FROM   ARTICULO
       WHERE  ARTICULO.ARTI_COD = NEW.ARTI_COD
       INTO   :NUMROWS;
       IF (NUMROWS = 0) THEN
       BEGIN
          EXCEPTION ARTICULO_NO_EXISTE;
       END
    END
    /*  PARENT 'BODEGA' MUST EXIST WHEN INSERTING A CHILD IN 'ENSAMBLES_DETALLE'  */
    IF (NEW.bode_cod IS NOT NULL) THEN
    BEGIN
       SELECT COUNT(*)
       FROM   BODEGA
       WHERE  BODEGA.BODE_COD = NEW.bode_cod
       INTO   :NUMROWS;
       IF (NUMROWS = 0) THEN
       BEGIN
          EXCEPTION BODEGA_NO_EXISTE;
       END
    END
    /*  PARENT 'ENSAMBLES' MUST EXIST WHEN INSERTING A CHILD IN 'ENSAMBLES_DETALLE'  */
    IF (NEW.prde_id IS NOT NULL) THEN
    BEGIN
       SELECT COUNT(*)
       FROM   produccion_entrada_enc
       WHERE  produccion_entrada_enc.prde_id = NEW.prde_id
       INTO   :NUMROWS;
       IF (NUMROWS = 0) THEN
       BEGIN
          EXCEPTION entradaprod_no_existe;
       END
    END
end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER PRODUCCION_SALIDA_DET_BI for PRODUCCION_SALIDA_DET
active BEFORE INSERT position 0
as
declare variable NUMROWS integer;
begin
    /*  PARENT 'ARTICULO' MUST EXIST WHEN INSERTING A CHILD IN 'ENSAMBLES_DETALLE'  */
    IF (NEW.arti_cod IS NOT NULL) THEN
    BEGIN
       SELECT COUNT(*)
       FROM   ARTICULO
       WHERE  ARTICULO.ARTI_COD = NEW.ARTI_COD
       INTO   :NUMROWS;
       IF (NUMROWS = 0) THEN
       BEGIN
          EXCEPTION ARTICULO_NO_EXISTE;
       END
    END
    /*  PARENT 'BODEGA' MUST EXIST WHEN INSERTING A CHILD IN 'ENSAMBLES_DETALLE'  */
    IF (NEW.bode_cod IS NOT NULL) THEN
    BEGIN
       SELECT COUNT(*)
       FROM   BODEGA
       WHERE  BODEGA.BODE_COD = NEW.bode_cod
       INTO   :NUMROWS;
       IF (NUMROWS = 0) THEN
       BEGIN
          EXCEPTION BODEGA_NO_EXISTE;
       END
    END
    /*  PARENT 'ENSAMBLES' MUST EXIST WHEN INSERTING A CHILD IN 'ENSAMBLES_DETALLE'  */
    IF (NEW.prsa_id IS NOT NULL) THEN
    BEGIN
       SELECT COUNT(*)
       FROM   produccion_salida_enc
       WHERE  produccion_salida_enc.prsa_id = NEW.prsa_id
       INTO   :NUMROWS;
       IF (NUMROWS = 0) THEN
       BEGIN
          EXCEPTION salidaprod_no_existe;
       END
    END
end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER PRODUCCION_SALIDA_DET_AI FOR PRODUCCION_SALIDA_DET
ACTIVE AFTER INSERT POSITION 0
as
declare variable fec date;
declare variable CONC VARCHAR(60);
declare variable factor numeric(18,4);
declare variable Pref varchar(4);
declare variable Num varchar(6);
declare variable CANT NUMERIC(18,2);
BEGIN
  if ((NEW.prsa_id <> 0) and (new.prsa_anulado = 'N')) then
    begin
    select prsa_fecha, 'Salida de material a producción No. ' || prsa_pref || prsa_numero, prsa_pref, prsa_numero
        from produccion_salida_enc where prsa_id = new.prsa_id into :fec, :conc, :Pref, :Num;
    execute procedure factor_unidad_cant(new.arti_cod, new.prsa_unidad) returning_values(factor);
    CANT = factor * new.prsa_cant;
    INSERT INTO MOVIMIENTO_ARTICULO
      (ARTI_COD, MVAR_CONS, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM)
      VALUES(NEW.ARTI_COD, GEN_ID(ID_MOVARTI,1), NEW.BODE_COD, :FEC, 28, NEW.prsa_id,
      :CONC, :CANT, 0, 'N', new.prsa_lote, :Pref, :Num, new.prsa_item);
    END
end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER PRODUCCION_SALIDA_DET_AU for PRODUCCION_SALIDA_DET
active AFTER UPDATE position 0
as
declare variable fec date;
declare variable CONC VARCHAR(60);
declare variable factor numeric(18,4);
declare variable Pref varchar(4);
declare variable Num varchar(6);
declare variable CANT NUMERIC(18,2);
begin
if ((old.arti_cod <> new.arti_cod) or (old.prsa_cant <> new.prsa_cant) or (old.prsa_unidad <> new.prsa_unidad) or (old.prsa_lote <> new.prsa_lote) or
    (old.prsa_anulado <> new.prsa_anulado) or (old.prsa_transmit <> new.prsa_transmit)) then
  begin
  if ((old.prsa_id <> 0) and (old.prsa_anulado = 'N')) then
    DELETE FROM MOVIMIENTO_ARTICULO WHERE (mvar_tipodoc = 28) and (mvar_idref = old.prsa_id) and (mvar_item = old.prsa_item);
  /* Registre el nuevo */
  if ((new.prsa_id <> 0) and (new.prsa_anulado = 'N')) then
    BEGIN
    select prsa_fecha, 'Salida de material a producción No. ' || prsa_pref || prsa_numero, prsa_pref, prsa_numero
        from produccion_salida_enc where prsa_id = new.prsa_id into :fec, :conc, :Pref, :Num;
    execute procedure factor_unidad_cant(new.arti_cod, new.prsa_unidad) returning_values(factor);
    CANT = factor * new.prsa_cant;
    INSERT INTO MOVIMIENTO_ARTICULO
      (ARTI_COD, MVAR_CONS, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM)
      VALUES(NEW.ARTI_COD, GEN_ID(ID_MOVARTI,1), NEW.BODE_COD, :FEC, 28, NEW.prsa_id,
      :CONC, :CANT, 0, 'N', new.prsa_lote, :Pref, :Num, new.prsa_item);
    END
  end
end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER PRODUCCION_SALIDA_DET_AD for PRODUCCION_SALIDA_DET
active AFTER DELETE position 0
as
begin
  if ((old.prsa_id <> 0) and (old.prsa_anulado = 'N')) then
    DELETE FROM MOVIMIENTO_ARTICULO WHERE (mvar_tipodoc = 28) and (mvar_idref = old.prsa_id) and (mvar_item = old.prsa_item);
end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER PRODUCCION_ENTRADA_DET_AI for PRODUCCION_ENTRADA_DET
active AFTER INSERT position 0
as
declare variable FEC DATE;
declare variable COSTO NUMERIC(18,2);
declare variable CONC VARCHAR(60);
declare variable LOTE VARCHAR(15);
declare variable PREF VARCHAR(4);
declare variable NUM VARCHAR(6);
BEGIN
if ((NEW.prde_id <> 0) and (new.pren_anulado = 'N')) then
  begin
  SELECT PRDE_FECHA, PRDE_COSTO, PRDE_PREF, PRDE_NUMERO, PRDE_LOTE
    FROM produccion_entrada_enc WHERE PRDE_ID = NEW.prde_id INTO :FEC, :COSTO, :PREF, :NUM, :LOTE;
  CONC = 'ENTRADA DE PRODUCTO TERMINADO No. ' || :PREF || :NUM;
  INSERT INTO MOVIMIENTO_ARTICULO
    (ARTI_COD, MVAR_CONS, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM)
    VALUES(NEW.ARTI_COD, GEN_ID(ID_MOVARTI,1), new.bode_cod, :fec, 20, NEW.prde_id,
    :conc, NEW.pren_cantok * new.pren_factor, :COSTO, 'S', :lote, :pref, :num, new.pren_item);

  /* ingrese los defectuosos */
  if ((new.pren_cantmal <> 0)) then
      INSERT INTO MOVIMIENTO_ARTICULO
        (ARTI_COD, MVAR_CONS, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM)
        VALUES(NEW.arti_cod, GEN_ID(ID_MOVARTI,1), new.bode_cod, :fec, 20, NEW.prde_id,
        :conc, new.pren_cantmal * new.pren_factor, :COSTO, 'S', :lote, :pref, :num, new.pren_item);
  end
end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER PRODUCCION_ENTRADA_ENC_AU for PRODUCCION_ENTRADA_ENC
active AFTER UPDATE position 0
as
declare variable CONSEC INTEGER;
begin
if (NEW.prde_anulado = 'S') then
    BEGIN
    select enco_consec from comprobante_encabezado where enco_tiporef = 20 and enco_idref = old.prde_id into :consec;
    if (NOT consec is null) then
     delete from comprobante_detalle where enco_consec = :consec;
    delete from comprobante_encabezado where enco_tiporef = 20 and enco_idref = old.prde_id;
    INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
        VALUES (USER, 20, NEW.prde_id, 'A', NEW.prde_pref || NEW.prde_numero);
    END
else
    begin
    INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
        VALUES (USER, 20, NEW.prde_id, 'U', NEW.prde_pref || NEW.prde_numero);
    end
if ((OLD.prde_pref <> NEW.prde_pref) or
    (OLD.prde_numero <> NEW.prde_numero) or
    (OLD.prde_fecha <> NEW.prde_fecha) ) then
    UPDATE produccion_entrada_det SET PREN_TRANSMIT = 'N' WHERE PRDE_ID = OLD.prde_id;

if (OLD.prde_anulado <> NEW.prde_anulado) then
    UPDATE produccion_entrada_det SET PREN_ANULADO = NEW.prde_anulado WHERE PRDE_ID = OLD.prde_id;

if (OLD.prde_transmit <> NEW.prde_transmit) then
    UPDATE produccion_entrada_det SET PREN_TRANSMIT = NEW.prde_transmit WHERE PRDE_ID = OLD.prde_id;
end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER PRODUCCION_ENTRADA_ENC_AD for PRODUCCION_ENTRADA_ENC
active AFTER DELETE position 0
as
declare variable CONSEC INTEGER;
begin
select enco_consec from comprobante_encabezado where enco_tiporef = 20 and enco_idref = old.prde_id into :consec;
if (NOT consec is null) then
    delete from comprobante_detalle where enco_consec = :consec;
delete from comprobante_encabezado where enco_tiporef = 20 and enco_idref = old.prde_id;
INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
    VALUES (USER, 20, OLD.prde_id, 'D', OLD.prde_pref || OLD.prde_numero);
end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER PRODUCCION_ENTRADA_DET_AU for PRODUCCION_ENTRADA_DET
active AFTER UPDATE position 0
as
declare variable FEC DATE;
declare variable COSTO NUMERIC(18,2);
declare variable CONC VARCHAR(60);
declare variable LOTE VARCHAR(15);
declare variable PREF VARCHAR(4);
declare variable NUM VARCHAR(6);
BEGIN
/* BORRE EL ANTERIOR Y GRABE EL NUEVO */
if ((OLD.prde_id <> 0) AND (OLD.pren_anulado = 'N')) then
    begin
    delete from movimiento_articulo where (mvar_tipodoc = 20) and (mvar_idref = old.prde_id) and (mvar_item = OLD.pren_item);
    end
if ((NEW.prde_id <> 0) and (new.pren_anulado = 'N')) then
  begin
  SELECT PRDE_FECHA, PRDE_COSTO, PRDE_PREF, PRDE_NUMERO, PRDE_LOTE
    FROM produccion_entrada_enc WHERE PRDE_ID = NEW.prde_id INTO :FEC, :COSTO, :PREF, :NUM, :LOTE;
  CONC = 'ENTRADA DE PRODUCTO TERMINADO No. ' || :PREF || :NUM;
  INSERT INTO MOVIMIENTO_ARTICULO
    (ARTI_COD, MVAR_CONS, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM)
    VALUES(NEW.ARTI_COD, GEN_ID(ID_MOVARTI,1), new.bode_cod, :fec, 20, NEW.prde_id,
    :conc, NEW.pren_cantok * new.pren_factor, :COSTO, 'S', :lote, :pref, :num, new.pren_item);

  /* ingrese los defectuosos */
  if ((new.pren_cantmal <> 0)) then
      INSERT INTO MOVIMIENTO_ARTICULO
        (ARTI_COD, MVAR_CONS, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM)
        VALUES(NEW.arti_cod, GEN_ID(ID_MOVARTI,1), new.bode_cod, :fec, 20, NEW.prde_id,
        :conc, new.pren_cantmal * new.pren_factor, :COSTO, 'S', :lote, :pref, :num, new.pren_item);
  end
end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER PRODUCCION_ENTRADA_DET_AD for PRODUCCION_ENTRADA_DET
active AFTER DELETE position 0
as
begin
/* BORRE EL ANTERIOR Y GRABE EL NUEVO */
if ((OLD.prde_id <> 0) AND (OLD.pren_anulado = 'N')) then
    begin
    delete from movimiento_articulo where (mvar_tipodoc = 20) and (mvar_idref = old.prde_id) and (mvar_item = OLD.pren_item);
    end
end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER PRODUCCION_ORDEN_AU for PRODUCCION_ORDEN
active AFTER UPDATE position 0
as
declare variable CONSEC INTEGER;
begin
if (NEW.pror_anulado = 'S') then
    BEGIN
    select enco_consec from comprobante_encabezado where enco_tiporef = 19 and enco_idref = old.pror_id into :consec;
    if (NOT consec is null) then
     delete from comprobante_detalle where enco_consec = :consec;
    delete from comprobante_encabezado where enco_tiporef = 19 and enco_idref = old.pror_id;
    INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
        VALUES (USER, 19, NEW.pror_id, 'A', NEW.pref_pre || NEW.pror_numero);
    END
else
    begin
    INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
        VALUES (USER, 19, NEW.pror_id, 'U', NEW.pref_pre || NEW.pror_numero);
    end
if ((OLD.pref_pre <> NEW.pref_pre) or
    (OLD.pror_numero <> NEW.pror_numero) or
    (OLD.pror_fecha <> NEW.pror_fecha) ) then
    UPDATE produccion_orden_detalle SET PODE_TRANSMIT = 'N' WHERE PROR_ID = OLD.pror_id;

if (OLD.pror_anulado <> NEW.pror_anulado) then
    UPDATE produccion_orden_detalle SET PODE_ANULADO = NEW.pror_anulado WHERE PROR_ID = OLD.pror_id;

if (OLD.pror_transmit <> NEW.pror_transmit) then
    UPDATE produccion_orden_detalle SET PODE_TRANSMIT = NEW.pror_transmit WHERE PROR_ID = OLD.pror_id;
end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER PRODUCCION_ORDEN_AD for PRODUCCION_ORDEN
active AFTER DELETE position 0
as
declare variable CONSEC INTEGER;
begin
select enco_consec from comprobante_encabezado where enco_tiporef = 19 and enco_idref = old.pror_id into :consec;
if (NOT consec is null) then
    delete from comprobante_detalle where enco_consec = :consec;
delete from comprobante_encabezado where enco_tiporef = 19 and enco_idref = old.pror_id;
INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
    VALUES (USER, 19, old.pror_id, 'A', old.pref_pre || old.pror_numero);
end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER PRODUCCION_ORDEN_DETALLE_AI for PRODUCCION_ORDEN_DETALLE
active AFTER INSERT position 0
as
declare variable fec date;
declare variable CONC VARCHAR(60);
declare variable factor numeric(18,4);
declare variable Pref varchar(4);
declare variable Num varchar(6);
declare variable CANT NUMERIC(18,2);
BEGIN
if ((NEW.pror_id <> 0) and (new.pode_anulado = 'N')) then
    begin
    select pror_fecha, 'Salida de material a producción No. ' || pref_pre || pror_numero, pref_pre, pror_numero
        from produccion_orden where pror_id = new.pror_id into :fec, :conc, :Pref, :Num;
    execute procedure factor_unidad_cant(new.arti_cod, new.pode_unidad) returning_values(factor);
    CANT = factor * new.pode_cant;
    INSERT INTO MOVIMIENTO_ARTICULO
      (ARTI_COD, MVAR_CONS, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM)
      VALUES(NEW.arti_cod, GEN_ID(ID_MOVARTI,1), NEW.pode_bodega, :FEC, 19, NEW.pror_id,
      :CONC, :CANT, 0, 'N', new.pode_lote, :Pref, :Num, new.pode_item);
    END
end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER PRODUCCION_ORDEN_DETALLE_AU for PRODUCCION_ORDEN_DETALLE
active AFTER UPDATE position 0
as
declare variable fec date;
declare variable CONC VARCHAR(60);
declare variable factor numeric(18,4);
declare variable Pref varchar(4);
declare variable Num varchar(6);
declare variable CANT NUMERIC(18,2);
BEGIN
if ((old.arti_cod <> new.arti_cod) or (old.pode_cant <> new.pode_cant) or (old.pode_unidad <> new.pode_unidad) or (old.pode_lote <> new.pode_lote) or
    (old.pode_anulado <> new.pode_anulado) or (old.pode_transmit <> new.pode_transmit)) then
  if ((old.pror_id <> 0) and (old.pode_anulado = 'N')) then
    DELETE FROM MOVIMIENTO_ARTICULO WHERE (mvar_tipodoc = 19) and (mvar_idref = old.pror_id) and (mvar_item = old.pode_item);

if ((NEW.pror_id <> 0) and (new.pode_anulado = 'N')) then
    begin
    select pror_fecha, 'Salida de material a producción No. ' || pref_pre || pror_numero, pref_pre, pror_numero
        from produccion_orden where pror_id = new.pror_id into :fec, :conc, :Pref, :Num;
    execute procedure factor_unidad_cant(new.arti_cod, new.pode_unidad) returning_values(factor);
    CANT = factor * new.pode_cant;
    INSERT INTO MOVIMIENTO_ARTICULO
      (ARTI_COD, MVAR_CONS, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM)
      VALUES(NEW.arti_cod, GEN_ID(ID_MOVARTI,1), NEW.pode_bodega, :FEC, 19, NEW.pror_id,
      :CONC, :CANT, 0, 'N', new.pode_lote, :Pref, :Num, new.pode_item);
    end
end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER PRODUCCION_ORDEN_DETALLE_AD for PRODUCCION_ORDEN_DETALLE
active AFTER DELETE position 0
as
begin
DELETE FROM MOVIMIENTO_ARTICULO WHERE (mvar_tipodoc = 19) and (mvar_idref = old.pror_id) and (mvar_item = old.pode_item);
end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER PRODUCCION_SALIDA_ENC_AU for PRODUCCION_SALIDA_ENC
active AFTER UPDATE position 0
as
declare variable CONSEC INTEGER;
begin
if (NEW.prsa_anulado = 'S') then
    BEGIN
    select enco_consec from comprobante_encabezado where enco_tiporef = 28 and enco_idref = old.prsa_id into :consec;
    if (NOT consec is null) then
     delete from comprobante_detalle where enco_consec = :consec;
    delete from comprobante_encabezado where enco_tiporef = 28 and enco_idref = old.prsa_id;
    INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
        VALUES (USER, 28, NEW.prsa_id, 'A', NEW.prsa_pref || NEW.prsa_numero);
    END
else
    begin
    INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
        VALUES (USER, 28, NEW.prsa_id, 'U', NEW.prsa_pref || NEW.prsa_numero);
    end
if ((OLD.prsa_pref <> NEW.prsa_pref) or
    (OLD.prsa_numero <> NEW.prsa_numero) or
    (OLD.prsa_fecha <> NEW.prsa_fecha) ) then
    UPDATE produccion_salida_det SET PRSA_TRANSMIT = 'N' WHERE PRSA_ID = OLD.prsa_id;

if (OLD.prsa_anulado <> NEW.prsa_anulado) then
    UPDATE produccion_salida_det SET PRSA_ANULADO = NEW.prsa_anulado WHERE PRSA_ID = OLD.prsa_id;

if (OLD.prsa_transmit <> NEW.prsa_transmit) then
    UPDATE produccion_salida_det SET PRSA_TRANSMIT = NEW.prsa_transmit WHERE PRSA_ID = OLD.prsa_id;
end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER PRODUCCION_SALIDA_ENC_AD for PRODUCCION_SALIDA_ENC
active AFTER DELETE position 0
as
declare variable CONSEC INTEGER;
begin
select enco_consec from comprobante_encabezado where enco_tiporef = 28 and enco_idref = old.prsa_id into :consec;
if (NOT consec is null) then
    delete from comprobante_detalle where enco_consec = :consec;
delete from comprobante_encabezado where enco_tiporef = 28 and enco_idref = old.prsa_id;
INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
    VALUES (USER, 28, old.prsa_id, 'A', old.prsa_pref || old.prsa_numero);
end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER PRODUCCION_ENTRADA_DET_AI FOR PRODUCCION_ENTRADA_DET
ACTIVE AFTER INSERT POSITION 0
as
declare variable FEC DATE;
declare variable COSTO NUMERIC(18,2);
declare variable CONC VARCHAR(60);
declare variable LOTE VARCHAR(15);
declare variable PREF VARCHAR(4);
declare variable NUM VARCHAR(6);
declare variable RECHAZADO VARCHAR(15);
BEGIN
if ((NEW.prde_id <> 0) and (new.pren_anulado = 'N')) then
  begin
  SELECT PRDE_FECHA, PRDE_COSTO, PRDE_PREF, PRDE_NUMERO, PRDE_LOTE, PRDE_RECHAZADO
    FROM produccion_entrada_enc WHERE PRDE_ID = NEW.prde_id INTO :FEC, :COSTO, :PREF, :NUM, :LOTE, :rechazado;
  CONC = 'ENTRADA DE PRODUCTO TERMINADO No. ' || :PREF || :NUM;
  INSERT INTO MOVIMIENTO_ARTICULO
    (ARTI_COD, MVAR_CONS, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM)
    VALUES(NEW.ARTI_COD, GEN_ID(ID_MOVARTI,1), new.bode_cod, :fec, 20, NEW.prde_id,
    :conc, NEW.pren_cantok * new.pren_factor, :COSTO, 'S', :lote, :pref, :num, new.pren_item);

  /* ingrese los defectuosos */
  if ((new.pren_cantmal <> 0) AND (:RECHAZADO <> '')) then
      INSERT INTO MOVIMIENTO_ARTICULO
        (ARTI_COD, MVAR_CONS, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM)
        VALUES(:rechazado, GEN_ID(ID_MOVARTI,1), new.bode_cod, :fec, 20, NEW.prde_id,
        :conc, new.pren_cantmal * new.pren_factor * NEW.pren_peso, :COSTO, 'S', :lote, :pref, :num, new.pren_item);
  end
end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER PRODUCCION_ENTRADA_DET_AU FOR PRODUCCION_ENTRADA_DET
ACTIVE AFTER UPDATE POSITION 0
as
declare variable FEC DATE;
declare variable COSTO NUMERIC(18,2);
declare variable CONC VARCHAR(60);
declare variable LOTE VARCHAR(15);
declare variable PREF VARCHAR(4);
declare variable NUM VARCHAR(6);
declare variable RECHAZADO VARCHAR(15);
BEGIN
/* BORRE EL ANTERIOR Y GRABE EL NUEVO */
if ((OLD.prde_id <> 0) AND (OLD.pren_anulado = 'N')) then
    begin
    delete from movimiento_articulo where (mvar_tipodoc = 20) and (mvar_idref = old.prde_id) and (mvar_item = OLD.pren_item);
    end
if ((NEW.prde_id <> 0) and (new.pren_anulado = 'N')) then
  begin
  SELECT PRDE_FECHA, PRDE_COSTO, PRDE_PREF, PRDE_NUMERO, PRDE_LOTE
    FROM produccion_entrada_enc WHERE PRDE_ID = NEW.prde_id INTO :FEC, :COSTO, :PREF, :NUM, :LOTE;
  CONC = 'ENTRADA DE PRODUCTO TERMINADO No. ' || :PREF || :NUM;
  INSERT INTO MOVIMIENTO_ARTICULO
    (ARTI_COD, MVAR_CONS, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM)
    VALUES(NEW.ARTI_COD, GEN_ID(ID_MOVARTI,1), new.bode_cod, :fec, 20, NEW.prde_id,
    :conc, NEW.pren_cantok * new.pren_factor, :COSTO, 'S', :lote, :pref, :num, new.pren_item);

  /* ingrese los defectuosos */
  if ((new.pren_cantmal <> 0) AND (:RECHAZADO <> '')) then
      INSERT INTO MOVIMIENTO_ARTICULO
        (ARTI_COD, MVAR_CONS, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM)
        VALUES(:rechazado, GEN_ID(ID_MOVARTI,1), new.bode_cod, :fec, 20, NEW.prde_id,
        :conc, new.pren_cantmal * new.pren_factor * NEW.pren_peso, :COSTO, 'S', :lote, :pref, :num, new.pren_item);
  end
end
^

SET TERM ; ^



CREATE TABLE PRODUCCION_DEVOLUCION (
    PRDD_ID T_ID NOT NULL,
    PROR_ID T_ID,
    PRDD_PRODUCTO T_COD_ARTICULO,
    PRDD_PREF VARCHAR(4),
    PRDD_NUMERO T_NUMDOC,
    PRDD_FECHA DATE,
    PRDD_SUPERVISOR T_ID,
    PRDD_OBS BLOB SUB_TYPE 1 SEGMENT SIZE 80,
    PRDD_ANULADO T_BOOLEANO,
    PRDD_TRANSMIT T_BOOLEANO,
    PRDD_NUMOK T_BOOLEANO,
    PRDD_USUARIO T_USUARIO);
alter table PRODUCCION_DEVOLUCION add constraint PK_PRODUCCION_DEVOLUCION
primary key (PRDD_ID);
ALTER TABLE PRODUCCION_DEVOLUCION
ADD PRDD_BODEGA VARCHAR(2);

CREATE TABLE PRODUCCION_DEVOLUCION_DET (
    PRDD_ID T_ID NOT NULL,
    PRDD_ITEM T_ID NOT NULL,
    PRDD_CODBAR T_COD_ARTICULO,
    BODE_COD VARCHAR(2),
    PRDD_CANT T_CANTIDAD,
    PRDD_UNIDAD T_UNIDAD,
    PRDD_FACTOR T_CANTIDAD,
    ARTI_COD T_COD_ARTICULO,
    PRDD_COSTO T_MONTO,
    PRDD_DESC T_CONCEPTO,
    PRDD_ANULADO T_BOOLEANO,
    PRDD_TRANSMIT T_BOOLEANO,
    PRDD_TOTAL T_MONTO,
    PRDD_LOTE T_LOTE,
    PRDD_PESO T_CANTIDAD);
alter table PRODUCCION_DEVOLUCION_DET add constraint PK_PRODUCCION_DEVOLUCION_DET
primary key (PRDD_ID,PRDD_ITEM);
alter table PRODUCCION_DEVOLUCION_DET add constraint FK_PRODUCCION_DEVOLUCION_DET_1
foreign key (PRDD_ID) references PRODUCCION_DEVOLUCION(PRDD_ID) on delete CASCADE on update CASCADE;


SET TERM ^ ;

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

SET TERM ; ^

grant EXECUTE on PROCEDURE cambie_id_proddev to PUBLIC;

SET TERM ^ ;

CREATE OR ALTER TRIGGER PRODUCCION_DEVOLUCION_BI for PRODUCCION_DEVOLUCION
active BEFORE INSERT position 0
as
declare variable NUMERO VARCHAR(8);
declare variable AUTOM CHAR(1);
declare variable EXISTE CHAR(1);
BEGIN
if (NEW.prdd_numok = 'N') then
  BEGIN
  /* Actualice el contador del prefijo */
  SELECT PREF_ACTUAL, PREF_AUTO FROM PREFIJOS WHERE TIDO_COD = 29 AND PREF_PRE = NEW.prdd_pref INTO :NUMERO, :AUTOM;
  if (AUTOM = 'S') then
    BEGIN
    /* ACTUALICE EL NUMERO EN COMPROBANTE_ENCABEZADO  */
    NEW.prdd_numero = NUMERO;
    NUMERO = CAST((CAST(NUMERO AS INTEGER) + 1) AS CHAR(6));
    UPDATE PREFIJOS
      SET PREF_ACTUAL = :NUMERO
    WHERE TIDO_COD = 29 AND PREF_PRE = NEW.prdd_pref;
    END
  ELSE
    begin
    if (CAST(NUMERO AS INTEGER) = CAST(NEW.prdd_numero AS INTEGER)) then
        UPDATE PREFIJOS
          SET PREF_ACTUAL = CAST((CAST(PREF_ACTUAL AS INTEGER) + 1) AS CHAR(6))
        WHERE TIDO_COD = 29 AND PREF_PRE = NEW.prdd_pref;
    end
  EXECUTE PROCEDURE COMPLETA_CEROS (NEW.prdd_numero) returning_values (NEW.prdd_numero);
  NEW.prdd_numok = 'S';
  END
/* Verifique que el numero no existe previamente */
EXISTE = 'N';
SELECT 'S' FROM produccion_devolucion WHERE PRDD_PREF = NEW.prdd_pref AND PRDD_NUMERO = NEW.prdd_numero INTO :EXISTE;
if (EXISTE = 'S') then
    EXCEPTION DOCUMENTO_REGISTRADO 'Ya existe una devolución de material con el número ' || new.prdd_pref || new.prdd_numero;
end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER PRODUCCION_DEVOLUCION_AI for PRODUCCION_DEVOLUCION
active AFTER INSERT position 0
as
begin
INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
    VALUES (USER, 29, NEW.prdd_id, 'U', NEW.prdd_pref || NEW.prdd_numero);
end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER PRODUCCION_DEVOLUCION_AU for PRODUCCION_DEVOLUCION
active AFTER UPDATE position 0
as
declare variable CONSEC INTEGER;
begin
if (NEW.prdd_anulado = 'S') then
    BEGIN
    select enco_consec from comprobante_encabezado where enco_tiporef = 29 and enco_idref = old.prdd_id into :consec;
    if (NOT consec is null) then
     delete from comprobante_detalle where enco_consec = :consec;
    delete from comprobante_encabezado where enco_tiporef = 29 and enco_idref = old.prdd_id;
    INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
        VALUES (USER, 29, NEW.prdd_id, 'A', NEW.prdd_pref || NEW.prdd_numero);
    END
else
    begin
    INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
        VALUES (USER, 29, NEW.prdd_id, 'U', NEW.prdd_pref || NEW.prdd_numero);
    end
if ((OLD.prdd_pref <> NEW.prdd_pref) or
    (OLD.prdd_numero <> NEW.prdd_numero) or
    (OLD.prdd_fecha <> NEW.prdd_fecha) ) then
    UPDATE produccion_devolucion_det SET PRDD_TRANSMIT = 'N' WHERE PRDD_ID = OLD.prdd_id;

if (OLD.prdd_anulado <> NEW.prdd_anulado) then
    UPDATE produccion_devolucion_det SET PRDD_ANULADO = NEW.prdd_anulado WHERE PRDD_ID = OLD.prdd_id;

if (OLD.prdd_transmit <> NEW.prdd_transmit) then
    UPDATE produccion_devolucion_det SET PRDD_TRANSMIT = NEW.prdd_transmit WHERE PRDD_ID = OLD.prdd_id;
end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER PRODUCCION_DEVOLUCION_AD for PRODUCCION_DEVOLUCION
active AFTER DELETE position 0
as
declare variable CONSEC INTEGER;
begin
select enco_consec from comprobante_encabezado where enco_tiporef = 29 and enco_idref = old.prdd_id into :consec;
if (NOT consec is null) then
    delete from comprobante_detalle where enco_consec = :consec;
delete from comprobante_encabezado where enco_tiporef = 29 and enco_idref = old.prdd_id;
INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
    VALUES (USER, 29, old.prdd_id, 'A', old.prdd_pref || old.prdd_numero);
end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER PRODUCCION_DEVOLUCION_DET_AI FOR PRODUCCION_DEVOLUCION_DET
ACTIVE AFTER INSERT POSITION 0
as
declare variable fec date;
declare variable CONC VARCHAR(60);
declare variable factor numeric(18,4);
declare variable Pref varchar(4);
declare variable Num varchar(6);
declare variable CANT NUMERIC(18,2);
BEGIN
  if ((NEW.prdd_id <> 0) and (new.prdd_anulado = 'N')) then
    begin
    select prdd_fecha, 'Devolución de material de producción No. ' || prdd_pref || prdd_numero, prdd_pref, prdd_numero
        from produccion_devolucion where prdd_id = new.prdd_id into :fec, :conc, :Pref, :Num;
    execute procedure factor_unidad_cant(new.arti_cod, new.prdd_unidad) returning_values(factor);
    CANT = factor * new.prdd_cant;
    INSERT INTO MOVIMIENTO_ARTICULO
      (ARTI_COD, MVAR_CONS, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM)
      VALUES(NEW.ARTI_COD, GEN_ID(ID_MOVARTI,1), NEW.BODE_COD, :FEC, 29, NEW.prdd_id,
      :CONC, :CANT, 0, 'S', new.prdd_lote, :Pref, :Num, new.prdd_item);
    END
end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER PRODUCCION_DEVOLUCION_DET_AU for PRODUCCION_DEVOLUCION_DET
active AFTER UPDATE position 0
as
declare variable fec date;
declare variable CONC VARCHAR(60);
declare variable factor numeric(18,4);
declare variable Pref varchar(4);
declare variable Num varchar(6);
declare variable CANT NUMERIC(18,2);
begin
if ((old.arti_cod <> new.arti_cod) or (old.prdd_cant <> new.prdd_cant) or (old.prdd_unidad <> new.prdd_unidad) or (old.prdd_lote <> new.prdd_lote) or
    (old.prdd_anulado <> new.prdd_anulado) or (old.prdd_transmit <> new.prdd_transmit)) then
  begin
  if ((old.prdd_id <> 0) and (old.prdd_anulado = 'N')) then
    DELETE FROM MOVIMIENTO_ARTICULO WHERE (mvar_tipodoc = 29) and (mvar_idref = old.prdd_id) and (mvar_item = old.prdd_item);
  /* Registre el nuevo */
  if ((new.prdd_id <> 0) and (new.prdd_anulado = 'N')) then
    BEGIN
    select prdd_fecha, 'Devolución de material de producción No. ' || prdd_pref || prdd_numero, prdd_pref, prdd_numero
        from produccion_devolucion where prdd_id = new.prdd_id into :fec, :conc, :Pref, :Num;
    execute procedure factor_unidad_cant(new.arti_cod, new.prdd_unidad) returning_values(factor);
    CANT = factor * new.prdd_cant;
    INSERT INTO MOVIMIENTO_ARTICULO
      (ARTI_COD, MVAR_CONS, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM)
      VALUES(NEW.ARTI_COD, GEN_ID(ID_MOVARTI,1), NEW.BODE_COD, :FEC, 29, NEW.prdd_id,
      :CONC, :CANT, 0, 'S', new.prdd_lote, :Pref, :Num, new.prdd_item);
    END
  end
end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER PRODUCCION_DEVOLUCION_DET_AD for PRODUCCION_DEVOLUCION_DET
active AFTER DELETE position 0
as
begin
  if ((old.prdd_id <> 0) and (old.prdd_anulado = 'N')) then
    DELETE FROM MOVIMIENTO_ARTICULO WHERE (mvar_tipodoc = 29) and (mvar_idref = old.prdd_id) and (mvar_item = old.prdd_item);
end
^

SET TERM ; ^

CREATE EXCEPTION DEVOLUCIONPROD_NO_EXISTE 'No se encontró la devolución de produccion';

SET TERM ^ ;

CREATE OR ALTER TRIGGER PRODUCCION_DEVOLUCION_DET_BI for PRODUCCION_DEVOLUCION_DET
active BEFORE INSERT position 0
as
declare variable NUMROWS integer;
begin
    /*  PARENT 'ARTICULO' MUST EXIST WHEN INSERTING A CHILD IN 'ENSAMBLES_DETALLE'  */
    IF (NEW.arti_cod IS NOT NULL) THEN
    BEGIN
       SELECT COUNT(*)
       FROM   ARTICULO
       WHERE  ARTICULO.ARTI_COD = NEW.ARTI_COD
       INTO   :NUMROWS;
       IF (NUMROWS = 0) THEN
       BEGIN
          EXCEPTION ARTICULO_NO_EXISTE;
       END
    END
    /*  PARENT 'BODEGA' MUST EXIST WHEN INSERTING A CHILD IN 'ENSAMBLES_DETALLE'  */
    IF (NEW.bode_cod IS NOT NULL) THEN
    BEGIN
       SELECT COUNT(*)
       FROM   BODEGA
       WHERE  BODEGA.BODE_COD = NEW.bode_cod
       INTO   :NUMROWS;
       IF (NUMROWS = 0) THEN
       BEGIN
          EXCEPTION BODEGA_NO_EXISTE;
       END
    END
    /*  PARENT 'ENSAMBLES' MUST EXIST WHEN INSERTING A CHILD IN 'ENSAMBLES_DETALLE'  */
    IF (NEW.prdd_id IS NOT NULL) THEN
    BEGIN
       SELECT COUNT(*)
       FROM   produccion_devolucion
       WHERE  produccion_devolucion.prdd_id = NEW.prdd_id
       INTO   :NUMROWS;
       IF (NUMROWS = 0) THEN
       BEGIN
          EXCEPTION devolucionprod_no_existe;
       END
    END
end
^

SET TERM ; ^

SET TERM ^ ;

create or alter procedure CONTABIL_PRODUCCION (
    IDDOC integer,
    IDINTER integer)
returns (
    ERROR integer,
    VER char(1),
    IDC integer)
AS
declare variable PREFIJO VARCHAR(4);
declare variable NUMERO VARCHAR(6);
declare variable FECAUX DATE;
declare variable FECHA CHAR(8);
declare variable CONCEPTO CHAR(60);
declare variable TIPOCOMP VARCHAR(3);
declare variable PREFCONT VARCHAR(4);
declare variable BASE CHAR(1);
declare variable CTABASE VARCHAR(20);
declare variable CTACIERRE VARCHAR(20);
declare variable EXISTE CHAR(1);
declare variable CUENTA VARCHAR(20);
declare variable MONTO NUMERIC(18,2);
declare variable TIPOCUEN CHAR(1);
declare variable NIT VARCHAR(20);
declare variable PROY VARCHAR(4);
declare variable CENTRO VARCHAR(4);
declare variable NUMITEMS INTEGER;
declare variable ARTICULO VARCHAR(15);
declare variable IMPTOS NUMERIC(18, 2);
declare variable SUMA NUMERIC(18,2);
declare variable VRBASE NUMERIC(18,2);
declare variable VRIVA NUMERIC(18,2);
declare variable CUENTAADIC VARCHAR(20);
declare variable BASEADIC VARCHAR(20);
declare variable PORCADIC NUMERIC(5,2);
declare variable VALORADIC NUMERIC(18,2);
declare variable DBADIC CHAR(1);
declare variable ANULADO CHAR(1);
declare variable CENT CHAR(1);
declare variable CLIENTE VARCHAR(60);
declare variable CODPROD VARCHAR(20);
BEGIN
  /* BUSQUE LA INTERFACE */
  EXISTE = 'N';
  SELECT 'S', PREF_PRE, TICO_COD, PRCO_PREF, ININ_BASE, ININ_CTABASE, ININ_CTACIERRE, ININ_CONFIRMAR, ININ_CENTRO
    FROM INTERFAZ_INVENTARIO
    WHERE ININ_ID = :IDINTER
    INTO :EXISTE, :PREFIJO, :TIPOCOMP, :PREFCONT, :BASE, :CTABASE, :CTACIERRE, :VER, :CENT;
  if (EXISTE = 'S') then
    BEGIN
    /* BORRE CUALQUEIR CONTABILIZACION PREVIA */
    DELETE FROM CONTABILIZACION WHERE CNTB_TIPOREF = 19 AND CNTB_IDREF = :IDDOC;
    /* TRAIGA EL ENCABEZADO DEL ENSAMBLE */
    SELECT PREF_PRE, PROR_NUMERO, PROR_FECHA, PROR_NIT, PROR_NOMCLIENTE, PROR_ANULADO, ARTI_COD
        FROM PRODUCCION_ORDEN
        WHERE PROR_ID = :IDDOC
        INTO :PREFIJO, :NUMERO, :FECAUX, :NIT, :CLIENTE, :ANULADO, :CODPROD;
    if (ANULADO = 'N') then
        BEGIN
        if (CENT = 'B') then
            SELECT BODE_CENTRO, BODE_PROY FROM BODEGA B, produccion_orden E
                WHERE B.BODE_COD = E.pror_bodega AND E.pror_id = :IDDOC INTO :CENTRO, :PROY;
        ELSE
            SELECT PREF_CENTRO, PREF_PROY FROM PREFIJOS P, produccion_orden E
                WHERE P.PREF_PRE = E.PREF_PRE AND E.pror_id = :IDDOC AND P.TIDO_COD = 19 INTO :CENTRO, :PROY;
        /* CONVIERTA LA FECHA A CADENA */
        EXECUTE PROCEDURE FECHA_A_CONTA(:FECAUX) returning_values (:FECHA);
        /* COMPONGA UN CONCEPTO */
        CONCEPTO = 'ORDEN DE PRODUCCION ' || :prefijo || :numero || '-' || SUBSTRING (:CLIENTE FROM 1 FOR 25);
        IDC = GEN_ID(ID_CONTABILIZA, 1);
        /* REGISTRE EL ENCABEZADO CONTABLE */
        INSERT INTO CONTABILIZACION (CNTB_ID, CNTB_TIPOCOMP, CNTB_PREFCNT, CNTB_NUMERO, CNTB_FECHA, CNTB_CONCEPTO, CNTB_REF, CNTB_TIPOREF, CNTB_IDREF, CNTB_PREFREF, CNTB_NUMREF, CNTB_PROCESADO)
            VALUES (:IDC, :TIPOCOMP, :PREFCONT, :NUMERO, :FECHA, :CONCEPTO, '', 19, :IDDOC, :PREFIJO, :NUMERO, 'N');
        NUMITEMS = 0;
        SUMA = 0;
        ERROR = 0;
        /* PRIMERO EL PRODUCTO */
        if (BASE = 'A') then
            BEGIN
            /* SUME LAS BASES DE LOS ARTICULOS DEL DOCUMENTO */
            FOR SELECT MAX(COAR_CTAINV), SUM(cast(D.pode_cant as double precision) * D.pode_costo), SUM(D.pode_ivamonto)
                FROM ARTICULO A, CONTABIL_ARTICULO C, produccion_orden_detalle D
                WHERE D.pror_id = :IDDOC AND A.arti_cod = :codprod AND A.ARTI_COD = C.ARTI_COD
                GROUP BY COAR_CTAINV
                INTO :CTABASE, :MONTO, :IMPTOS
            DO
                BEGIN
                VRBASE = MONTO;
                VRIVA = :IMPTOS;
                if (MONTO <> 0) then
                    BEGIN
                    /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
                    SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                        WHERE CUEN_COD = :CTABASE INTO :CUENTA, :TIPOCUEN;
                    if (CUENTA IS NULL) then
                        begin
                        EXECUTE PROCEDURE ERROR (19, :IDDOC, :CTABASE, 2);
                        CUENTA = CTABASE;
                        ERROR = ERROR + 1;
                        end
                    if (TIPOCUEN = 'I') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :codprod, 0, 0);
                        NUMITEMS = NUMITEMS + 1;
                        SUMA = SUMA + MONTO;
                        END
                    if (TIPOCUEN = 'C') then
                        BEGIN
                        EXECUTE PROCEDURE ERROR (19, :IDDOC, :CUENTA, 4);
                        TIPOCUEN = 'N';
                        ERROR = ERROR + 1;
                        END
                    if (TIPOCUEN = 'N') then
                        BEGIN
                        /* INSERTE EL REGISTRO DE LA BASE */
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NUMITEMS = NUMITEMS + 1;
                        SUMA = SUMA + MONTO;
                        END
                    END
                END /* FOR */

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

SET TERM ; ^

SET TERM ^ ;

create or alter procedure CONTABIL_PRODUCCION_SAL (
    IDDOC integer,
    IDINTER integer)
returns (
    ERROR integer,
    VER char(1),
    IDC integer)
AS
declare variable PREFIJO VARCHAR(4);
declare variable NUMERO VARCHAR(6);
declare variable FECAUX DATE;
declare variable FECHA CHAR(8);
declare variable CONCEPTO CHAR(60);
declare variable TIPOCOMP VARCHAR(3);
declare variable PREFCONT VARCHAR(4);
declare variable BASE CHAR(1);
declare variable CTABASE VARCHAR(20);
declare variable CTACIERRE VARCHAR(20);
declare variable EXISTE CHAR(1);
declare variable CUENTA VARCHAR(20);
declare variable MONTO NUMERIC(18,2);
declare variable TIPOCUEN CHAR(1);
declare variable NIT VARCHAR(20);
declare variable PROY VARCHAR(4);
declare variable CENTRO VARCHAR(4);
declare variable NUMITEMS INTEGER;
declare variable ARTICULO VARCHAR(15);
declare variable SUMA NUMERIC(18,2);
declare variable VRBASE NUMERIC(18,2);
declare variable CUENTAADIC VARCHAR(20);
declare variable BASEADIC VARCHAR(20);
declare variable PORCADIC NUMERIC(5,2);
declare variable VALORADIC NUMERIC(18,2);
declare variable DBADIC CHAR(1);
declare variable ANULADO CHAR(1);
declare variable CENT CHAR(1);
declare variable CLIENTE VARCHAR(60);
declare variable CODPROD VARCHAR(20);
BEGIN
  /* BUSQUE LA INTERFACE */
  EXISTE = 'N';
  SELECT 'S', PREF_PRE, TICO_COD, PRCO_PREF, ININ_BASE, ININ_CTABASE, ININ_CTACIERRE, ININ_CONFIRMAR, ININ_CENTRO
    FROM INTERFAZ_INVENTARIO
    WHERE ININ_ID = :IDINTER
    INTO :EXISTE, :PREFIJO, :TIPOCOMP, :PREFCONT, :BASE, :CTABASE, :CTACIERRE, :VER, :CENT;
  if (EXISTE = 'S') then
    BEGIN
    /* BORRE CUALQUEIR CONTABILIZACION PREVIA */
    DELETE FROM CONTABILIZACION WHERE CNTB_TIPOREF = 28 AND CNTB_IDREF = :IDDOC;
    /* TRAIGA EL ENCABEZADO DEL ENSAMBLE */
    SELECT PRSA_PREF, PRSA_NUMERO, PRSA_FECHA, P.PROR_NIT, P.PROR_NOMCLIENTE, PRSA_ANULADO, P.ARTI_COD
        FROM produccion_salida_enc S, produccion_orden P
        WHERE S.PRSA_ID = :IDDOC AND S.pror_id = P.pror_id
        INTO :PREFIJO, :NUMERO, :FECAUX, :NIT, :CLIENTE, :ANULADO, :CODPROD;
    if (ANULADO = 'N') then
        BEGIN
        if (CENT = 'B') then
            SELECT BODE_CENTRO, BODE_PROY FROM BODEGA B, produccion_salida_enc E
                WHERE B.BODE_COD = E.prsa_bodega AND E.prsa_id = :IDDOC INTO :CENTRO, :PROY;
        ELSE
            SELECT PREF_CENTRO, PREF_PROY FROM PREFIJOS P, produccion_salida_enc E
                WHERE P.PREF_PRE = E.prsa_pref AND E.prsa_id = :IDDOC AND P.TIDO_COD = 28 INTO :CENTRO, :PROY;
        /* CONVIERTA LA FECHA A CADENA */
        EXECUTE PROCEDURE FECHA_A_CONTA(:FECAUX) returning_values (:FECHA);
        /* COMPONGA UN CONCEPTO */
        CONCEPTO = 'SALIDA A PRODUCCION ' || :prefijo || :numero || '-' || SUBSTRING (:CLIENTE FROM 1 FOR 25);
        IDC = GEN_ID(ID_CONTABILIZA, 1);
        /* REGISTRE EL ENCABEZADO CONTABLE */
        INSERT INTO CONTABILIZACION (CNTB_ID, CNTB_TIPOCOMP, CNTB_PREFCNT, CNTB_NUMERO, CNTB_FECHA, CNTB_CONCEPTO, CNTB_REF, CNTB_TIPOREF, CNTB_IDREF, CNTB_PREFREF, CNTB_NUMREF, CNTB_PROCESADO)
            VALUES (:IDC, :TIPOCOMP, :PREFCONT, :NUMERO, :FECHA, :CONCEPTO, '', 28, :IDDOC, :PREFIJO, :NUMERO, 'N');
        NUMITEMS = 0;
        SUMA = 0;
        ERROR = 0;
        /* PRIMERO EL PRODUCTO */
        if (BASE = 'A') then
            BEGIN
            /* SUME LAS BASES DE LOS ARTICULOS DEL DOCUMENTO */
            FOR SELECT MAX(COAR_CTAINV), SUM(cast(D.prsa_cant as double precision) * D.prsa_costo)
                FROM ARTICULO A, CONTABIL_ARTICULO C, produccion_salida_det D
                WHERE D.prsa_id = :IDDOC AND A.arti_cod = :codprod AND A.ARTI_COD = C.ARTI_COD
                GROUP BY COAR_CTAINV
                INTO :CTABASE, :MONTO
            DO
                BEGIN
                VRBASE = MONTO;
                if (MONTO <> 0) then
                    BEGIN
                    /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
                    SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                        WHERE CUEN_COD = :CTABASE INTO :CUENTA, :TIPOCUEN;
                    if (CUENTA IS NULL) then
                        begin
                        EXECUTE PROCEDURE ERROR (28, :IDDOC, :CTABASE, 2);
                        CUENTA = CTABASE;
                        ERROR = ERROR + 1;
                        end
                    if (TIPOCUEN = 'I') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :codprod, 0, 0);
                        NUMITEMS = NUMITEMS + 1;
                        SUMA = SUMA + MONTO;
                        END
                    if (TIPOCUEN = 'C') then
                        BEGIN
                        EXECUTE PROCEDURE ERROR (28, :IDDOC, :CUENTA, 4);
                        TIPOCUEN = 'N';
                        ERROR = ERROR + 1;
                        END
                    if (TIPOCUEN = 'N') then
                        BEGIN
                        /* INSERTE EL REGISTRO DE LA BASE */
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NUMITEMS = NUMITEMS + 1;
                        SUMA = SUMA + MONTO;
                        END
                    END
                END /* FOR */

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

SET TERM ; ^

SET TERM ^ ;

create or alter procedure CONTABIL_PRODUCCION_ENT (
    IDDOC integer,
    IDINTER integer)
returns (
    ERROR integer,
    VER char(1),
    IDC integer)
AS
declare variable PREFIJO VARCHAR(4);
declare variable NUMERO VARCHAR(6);
declare variable FECAUX DATE;
declare variable FECHA CHAR(8);
declare variable CONCEPTO CHAR(60);
declare variable TIPOCOMP VARCHAR(3);
declare variable PREFCONT VARCHAR(4);
declare variable BASE CHAR(1);
declare variable CTABASE VARCHAR(20);
declare variable CTACIERRE VARCHAR(20);
declare variable EXISTE CHAR(1);
declare variable CUENTA VARCHAR(20);
declare variable MONTO NUMERIC(18,2);
declare variable TIPOCUEN CHAR(1);
declare variable NIT VARCHAR(20);
declare variable PROY VARCHAR(4);
declare variable CENTRO VARCHAR(4);
declare variable NUMITEMS INTEGER;
declare variable SUMA NUMERIC(18,2);
declare variable VRBASE NUMERIC(18,2);
declare variable CUENTAADIC VARCHAR(20);
declare variable BASEADIC VARCHAR(20);
declare variable PORCADIC NUMERIC(5,2);
declare variable VALORADIC NUMERIC(18,2);
declare variable DBADIC CHAR(1);
declare variable ANULADO CHAR(1);
declare variable CENT CHAR(1);
declare variable CLIENTE VARCHAR(60);
declare variable CODPROD VARCHAR(20);
declare variable COSTO NUMERIC(18,2);
declare variable CODRECH VARCHAR(20);
BEGIN
  /* BUSQUE LA INTERFACE */
  EXISTE = 'N';
  SELECT 'S', PREF_PRE, TICO_COD, PRCO_PREF, ININ_BASE, ININ_CTABASE, ININ_CTACIERRE, ININ_CONFIRMAR, ININ_CENTRO
    FROM INTERFAZ_INVENTARIO
    WHERE ININ_ID = :IDINTER
    INTO :EXISTE, :PREFIJO, :TIPOCOMP, :PREFCONT, :BASE, :CTABASE, :CTACIERRE, :VER, :CENT;
  if (EXISTE = 'S') then
    BEGIN
    /* BORRE CUALQUEIR CONTABILIZACION PREVIA */
    DELETE FROM CONTABILIZACION WHERE CNTB_TIPOREF = 20 AND CNTB_IDREF = :IDDOC;
    /* TRAIGA EL ENCABEZADO DEL ENSAMBLE */
    SELECT PRDE_PREF, PRDE_NUMERO, PRDE_FECHA, P.PROR_NIT, P.PROR_NOMCLIENTE, PRDE_ANULADO, P.ARTI_COD, E.prde_costo, E.prde_rechazado
        FROM produccion_entrada_enc E, produccion_orden P
        WHERE E.prde_id = :IDDOC AND E.pror_id = P.pror_id
        INTO :PREFIJO, :NUMERO, :FECAUX, :NIT, :CLIENTE, :ANULADO, :CODPROD, :COSTO, :codrech;
    if (ANULADO = 'N') then
        BEGIN
        if (CENT = 'B') then
            SELECT BODE_CENTRO, BODE_PROY FROM BODEGA B, produccion_entrada_enc E
                WHERE B.BODE_COD = E.prde_bodprod AND E.prde_id = :IDDOC INTO :CENTRO, :PROY;
        ELSE
            SELECT PREF_CENTRO, PREF_PROY FROM PREFIJOS P, produccion_entrada_enc E
                WHERE P.PREF_PRE = E.prde_pref AND E.prde_id = :IDDOC AND P.TIDO_COD = 20 INTO :CENTRO, :PROY;
        /* CONVIERTA LA FECHA A CADENA */
        EXECUTE PROCEDURE FECHA_A_CONTA(:FECAUX) returning_values (:FECHA);
        /* COMPONGA UN CONCEPTO */
        CONCEPTO = 'ENTRADA PRODUCCION ' || :prefijo || :numero || '-' || SUBSTRING (:CLIENTE FROM 1 FOR 25);
        IDC = GEN_ID(ID_CONTABILIZA, 1);
        /* REGISTRE EL ENCABEZADO CONTABLE */
        INSERT INTO CONTABILIZACION (CNTB_ID, CNTB_TIPOCOMP, CNTB_PREFCNT, CNTB_NUMERO, CNTB_FECHA, CNTB_CONCEPTO, CNTB_REF, CNTB_TIPOREF, CNTB_IDREF, CNTB_PREFREF, CNTB_NUMREF, CNTB_PROCESADO)
            VALUES (:IDC, :TIPOCOMP, :PREFCONT, :NUMERO, :FECHA, :CONCEPTO, '', 20, :IDDOC, :PREFIJO, :NUMERO, 'N');
        NUMITEMS = 0;
        SUMA = 0;
        ERROR = 0;
        if (BASE = 'A') then
            BEGIN
            /* PRIMERO EL PRODUCTO BUENO */
            SELECT MAX(COAR_CTAINV), SUM(cast(D.pren_cantok as double precision) * :costo)
                FROM ARTICULO A, CONTABIL_ARTICULO C, produccion_entrada_det D
                WHERE D.prde_id = :IDDOC AND A.arti_cod = :codprod AND A.ARTI_COD = C.ARTI_COD
                INTO :CTABASE, :MONTO;
            VRBASE = MONTO;
            if (MONTO <> 0) then
                BEGIN
                /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :CTABASE INTO :CUENTA, :TIPOCUEN;
                if (CUENTA IS NULL) then
                    begin
                    EXECUTE PROCEDURE ERROR (20, :IDDOC, :CTABASE, 2);
                    CUENTA = CTABASE;
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :codprod, 0, 0);
                    NUMITEMS = NUMITEMS + 1;
                    SUMA = SUMA + MONTO;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (20, :IDDOC, :CUENTA, 4);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    /* INSERTE EL REGISTRO DE LA BASE */
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NUMITEMS = NUMITEMS + 1;
                    SUMA = SUMA + MONTO;
                    END
                END
            /* EL PRODUCTO MALO */
            SELECT MAX(COAR_CTAINV), SUM(cast(D.pren_cantmal as double precision) * :costo)
                FROM ARTICULO A, CONTABIL_ARTICULO C, produccion_entrada_det D
                WHERE D.prde_id = :IDDOC AND A.arti_cod = :codrech AND A.ARTI_COD = C.ARTI_COD
                INTO :CTABASE, :MONTO;
            if (MONTO <> 0) then
                BEGIN
                /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :CTABASE INTO :CUENTA, :TIPOCUEN;
                if (CUENTA IS NULL) then
                    begin
                    EXECUTE PROCEDURE ERROR (20, :IDDOC, :CTABASE, 2);
                    CUENTA = CTABASE;
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :codprod, 0, 0);
                    NUMITEMS = NUMITEMS + 1;
                    SUMA = SUMA + MONTO;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (20, :IDDOC, :CUENTA, 4);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    /* INSERTE EL REGISTRO DE LA BASE */
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NUMITEMS = NUMITEMS + 1;
                    SUMA = SUMA + MONTO;
                    END
                END
            END /* BASE */
        /* DSCARGA EL MATERIAL */
        SELECT SUM(cast(D.pren_cantmal+D.pren_cantok as double precision) * :costo)
            FROM produccion_entrada_det D WHERE D.prde_id = :IDDOC INTO :MONTO;
        if (MONTO <> 0) then
            BEGIN
            /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :ctacierre INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERROR (20, :IDDOC, :ctacierre, 2);
                CUENTA = ctacierre;
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERROR (20, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                EXECUTE PROCEDURE ERROR (20, :IDDOC, :CUENTA, 4);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                /* INSERTE EL REGISTRO DE LA BASE */
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NUMITEMS = NUMITEMS + 1;
                SUMA = SUMA - MONTO;
                END
            END
        /* recorra las cuentas adicionales */
        FOR SELECT INIC_CUENTA, INIC_BASE, INIC_PORC, INIC_VALOR, INIC_DB
            FROM INTERFAZ_INVENTARIO_CTAS
            WHERE ININ_ID = :IDINTER
            INTO :CUENTAADIC, :BASEADIC, :PORCADIC, :VALORADIC, :DBADIC
            DO
            BEGIN
            if (:BASEADIC = 'SUBTOTAL') then
                VALORADIC = VRBASE;
            if (:BASEADIC = 'TOTAL') then
                VALORADIC = VRBASE;
            MONTO = VALORADIC * PORCADIC;
            if (MONTO <> 0) then
                BEGIN
                /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
                CUENTA = NULL;
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :CUENTAADIC INTO :CUENTA, :TIPOCUEN;
                if (CUENTA IS NULL) then
                    begin
                    EXECUTE PROCEDURE ERROR (20, :IDDOC, :CUENTAADIC, 2);
                    CUENTA = CUENTAADIC;
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (20, :IDDOC, :CUENTA, 3);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (20, :IDDOC, :CUENTA, 4);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    if (DBADIC = 'S') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTAADIC, :CONCEPTO, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        SUMA = SUMA + MONTO;
                        END
                    ELSE
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTAADIC, :CONCEPTO, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        SUMA = SUMA - MONTO;
                        END
                    NUMITEMS = NUMITEMS + 1;
                    END
                END
            END
        END
      if (ERROR > 0) then
        VER = 'S';
      SUSPEND;
      END /* EXISTE LA INTERFAZ */
  ELSE
    BEGIN
    EXECUTE PROCEDURE ERROR (20, :IDDOC, :PREFIJO, 1);
    ERROR = ERROR + 1;
    VER = 'S';
    SUSPEND;
    END
END
^

SET TERM ; ^

SET TERM ^ ;

create or alter procedure CONTABIL_PRODUCCION_DEV (
    IDDOC integer,
    IDINTER integer)
returns (
    ERROR integer,
    VER char(1),
    IDC integer)
AS
declare variable PREFIJO VARCHAR(4);
declare variable NUMERO VARCHAR(6);
declare variable FECAUX DATE;
declare variable FECHA CHAR(8);
declare variable CONCEPTO CHAR(60);
declare variable TIPOCOMP VARCHAR(3);
declare variable PREFCONT VARCHAR(4);
declare variable BASE CHAR(1);
declare variable CTABASE VARCHAR(20);
declare variable CTACIERRE VARCHAR(20);
declare variable EXISTE CHAR(1);
declare variable CUENTA VARCHAR(20);
declare variable MONTO NUMERIC(18,2);
declare variable TIPOCUEN CHAR(1);
declare variable NIT VARCHAR(20);
declare variable PROY VARCHAR(4);
declare variable CENTRO VARCHAR(4);
declare variable NUMITEMS INTEGER;
declare variable ARTICULO VARCHAR(15);
declare variable SUMA NUMERIC(18,2);
declare variable VRBASE NUMERIC(18,2);
declare variable CUENTAADIC VARCHAR(20);
declare variable BASEADIC VARCHAR(20);
declare variable PORCADIC NUMERIC(5,2);
declare variable VALORADIC NUMERIC(18,2);
declare variable DBADIC CHAR(1);
declare variable ANULADO CHAR(1);
declare variable CENT CHAR(1);
declare variable ORDEN VARCHAR(10);
declare variable CODPROD VARCHAR(20);
BEGIN
  /* BUSQUE LA INTERFACE */
  EXISTE = 'N';
  SELECT 'S', PREF_PRE, TICO_COD, PRCO_PREF, ININ_BASE, ININ_CTABASE, ININ_CTACIERRE, ININ_CONFIRMAR, ININ_CENTRO
    FROM INTERFAZ_INVENTARIO
    WHERE ININ_ID = :IDINTER
    INTO :EXISTE, :PREFIJO, :TIPOCOMP, :PREFCONT, :BASE, :CTABASE, :CTACIERRE, :VER, :CENT;
  if (EXISTE = 'S') then
    BEGIN
    /* BORRE CUALQUEIR CONTABILIZACION PREVIA */
    DELETE FROM CONTABILIZACION WHERE CNTB_TIPOREF = 29 AND CNTB_IDREF = :IDDOC;
    /* TRAIGA EL ENCABEZADO DEL ENSAMBLE */
    SELECT PRDD_PREF, PRDD_NUMERO, PRDD_FECHA, P.PROR_NIT, P.pref_pre || P.pror_numero, PRDD_ANULADO, P.ARTI_COD
        FROM produccion_devolucion S, produccion_orden P
        WHERE S.PRDD_ID = :IDDOC AND S.pror_id = P.pror_id
        INTO :PREFIJO, :NUMERO, :FECAUX, :NIT, :ORDEN, :ANULADO, :CODPROD;
    if (ANULADO = 'N') then
        BEGIN
        if (CENT = 'B') then
            SELECT BODE_CENTRO, BODE_PROY FROM BODEGA B, produccion_devolucion E
                WHERE B.BODE_COD = E.prdd_bodega AND E.prdd_id = :IDDOC INTO :CENTRO, :PROY;
        ELSE
            SELECT PREF_CENTRO, PREF_PROY FROM PREFIJOS P, produccion_devolucion E
                WHERE P.PREF_PRE = E.prdd_pref AND E.prdd_id = :IDDOC AND P.TIDO_COD = 29 INTO :CENTRO, :PROY;
        /* CONVIERTA LA FECHA A CADENA */
        EXECUTE PROCEDURE FECHA_A_CONTA(:FECAUX) returning_values (:FECHA);
        /* COMPONGA UN CONCEPTO */
        CONCEPTO = 'DEVOLUCION MATERIALES ' || :prefijo || :numero || ' EN ORDEN ' || :ORDEN;
        IDC = GEN_ID(ID_CONTABILIZA, 1);
        /* REGISTRE EL ENCABEZADO CONTABLE */
        INSERT INTO CONTABILIZACION (CNTB_ID, CNTB_TIPOCOMP, CNTB_PREFCNT, CNTB_NUMERO, CNTB_FECHA, CNTB_CONCEPTO, CNTB_REF, CNTB_TIPOREF, CNTB_IDREF, CNTB_PREFREF, CNTB_NUMREF, CNTB_PROCESADO)
            VALUES (:IDC, :TIPOCOMP, :PREFCONT, :NUMERO, :FECHA, :CONCEPTO, '', 29, :IDDOC, :PREFIJO, :NUMERO, 'N');
        NUMITEMS = 0;
        SUMA = 0;
        ERROR = 0;
        /* PRIMERO EL PRODUCTO */
        if (BASE = 'A') then
            BEGIN
            /* SUME LAS BASES DE LOS ARTICULOS DEL DOCUMENTO */
            FOR SELECT MAX(COAR_CTAINV), SUM(cast(D.prdd_cant as double precision) * D.prdd_costo)
                FROM ARTICULO A, CONTABIL_ARTICULO C, produccion_devolucion_det D
                WHERE D.prdd_id = :IDDOC AND A.arti_cod = :codprod AND A.ARTI_COD = C.ARTI_COD
                GROUP BY COAR_CTAINV
                INTO :CTABASE, :MONTO
            DO
                BEGIN
                VRBASE = MONTO;
                if (MONTO <> 0) then
                    BEGIN
                    /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
                    SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                        WHERE CUEN_COD = :CTABASE INTO :CUENTA, :TIPOCUEN;
                    if (CUENTA IS NULL) then
                        begin
                        EXECUTE PROCEDURE ERROR (29, :IDDOC, :CTABASE, 2);
                        CUENTA = CTABASE;
                        ERROR = ERROR + 1;
                        end
                    if (TIPOCUEN = 'I') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :codprod, 0, 0);
                        NUMITEMS = NUMITEMS + 1;
                        SUMA = SUMA - MONTO;
                        END
                    if (TIPOCUEN = 'C') then
                        BEGIN
                        EXECUTE PROCEDURE ERROR (29, :IDDOC, :CUENTA, 4);
                        TIPOCUEN = 'N';
                        ERROR = ERROR + 1;
                        END
                    if (TIPOCUEN = 'N') then
                        BEGIN
                        /* INSERTE EL REGISTRO DE LA BASE */
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NUMITEMS = NUMITEMS + 1;
                        SUMA = SUMA - MONTO;
                        END
                    END
                END /* FOR */

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

^

SET TERM ; ^


CREATE TABLE PRODUCCION_MONTAJE (
    PROR_ID        T_ID NOT NULL /* T_ID = INTEGER */,
    PRMO_ITEM      T_ID NOT NULL /* T_ID = INTEGER */,
    PRMO_PROCESO   T_CONCEPTO /* T_CONCEPTO = VARCHAR(60) */,
    PRMO_MINUTOS   SMALLINT,
    PRMO_MINUTOSR  SMALLINT,
    PRMO_ANULADO   T_BOOLEANO /* T_BOOLEANO = CHAR(1) check (value in ('S','N')) */,
    PRMO_TRANSMIT  T_BOOLEANO /* T_BOOLEANO = CHAR(1) check (value in ('S','N')) */
);

ALTER TABLE PRODUCCION_MONTAJE ADD CONSTRAINT PK_PRODUCCION_MONTAJE PRIMARY KEY (PROR_ID, PRMO_ITEM);

ALTER TABLE PRODUCCION_MONTAJE ADD CONSTRAINT FK_PRODUCCION_MONTAJE_1 FOREIGN KEY (PROR_ID) REFERENCES PRODUCCION_ORDEN (PROR_ID) ON DELETE CASCADE ON UPDATE CASCADE;

SET TERM ^ ;

CREATE OR ALTER procedure IMPR_PRODUCCION (
    ID integer)
returns (
    PREF varchar(4),
    NUMERO varchar(6),
    FECHA date,
    CLIENTE varchar(20),
    NOMCLIENTE varchar(60),
    CODBODEGA varchar(2),
    NOMBODEGA varchar(30),
    PRODARTI varchar(15),
    PRODCODBAR varchar(15),
    PRODDES varchar(60),
    PRODCANT numeric(18,4),
    PRODUNIDAD varchar(8),
    PRODLOTE varchar(15),
    MAQUINA varchar(60),
    PRIORIDAD integer,
    FECHAENT date,
    FECMONTAJE date,
    ESTADO char(1),
    PESOTOTAL numeric(18,4),
    OBS blob sub_type 1 segment size 80,
    TOTENSAMBLE numeric(18,2),
    DIAS numeric(9,2),
    HORAS NUMERIC(9,2),
    ITEM integer,
    ARTICULO varchar(15),
    CODBAR varchar(15),
    ARTIDES varchar(60),
    CICLO integer,
    CANT numeric(18,4),
    UNIDAD varchar(8),
    BODITEM varchar(2),
    COSTO numeric(18,2),
    IVAPORC numeric(9,2),
    IVAMONTO numeric(18,2),
    PESO numeric(18,4),
    TOTAL numeric(18,2),
    LOTE varchar(15))
AS
BEGIN
SELECT PREF_PRE, PROR_NUMERO, PROR_FECHA, PROR_NIT, PROR_NOMCLIENTE, PROR_BODEGA, BODE_NOM, PROR_PRODUCTO, ARTI_COD,
    PROR_DESC, PROR_CANT, PROR_UNIDAD, PROR_LOTE, PROR_OBS, PROR_PESO, PROR_MAQUINA, PROR_PRIORIDAD, PROR_FECHAENT, PROR_ESTADO, PROR_FECMONTAJE
    FROM produccion_orden P, BODEGA B WHERE P.PROR_BODEGA = B.BODE_COD AND P.PROR_ID = :ID into
    :PREF, :NUMERO, :FECHA, :CLIENTE, :NOMCLIENTE, :CODBODEGA, :NOMBODEGA, :PRODCODBAR, :PRODARTI,
    PRODDES, PRODCANT, PRODUNIDAD, PRODLOTE, :OBS, :PESOTOTAL, :MAQUINA, :PRIORIDAD, :FECHAENT, :ESTADO, :fecmontaje;
  SELECT SUM(PODE_TOTAL) FROM produccion_orden_detalle WHERE PROR_ID = :ID INTO :TOTENSAMBLE;
  SELECT ENMA_NOMBRE FROM ensamble_maquina WHERE ENMA_ID = :MAQUINA INTO :MAQUINA;
  SELECT ARTI_CICLO FROM ARTICULO WHERE ARTI_COD = :prodarti INTO :ciclo;
  HORAS = CICLO * prodcant / 60;
  DIAS = HORAS / 24;
  FOR SELECT PODE_ITEM, A.ARTI_COD, PODE_CODBAR, PODE_DESC, PODE_CANT, PODE_UNIDAD, PODE_BODEGA, PODE_COSTO, PODE_IVAPORC, PODE_IVAMONTO, PODE_TOTAL, PODE_LOTE, PODE_PESO
    FROM produccion_orden_detalle D, ARTICULO A
    WHERE D.ARTI_COD = A.ARTI_COD AND D.PROR_ID = :ID
    ORDER BY PODE_ITEM
    INTO :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :BODITEM, :COSTO, :IVAPORC, :IVAMONTO, :TOTAL, :LOTE, :PESO
    DO
      BEGIN
      SUSPEND;
      END
end
^

SET TERM ; ^

GRANT EXECUTE ON PROCEDURE impr_produccion TO PUBLIC;

SET TERM ^ ;

create procedure IMPR_PRODUCCION_ENTRADA (
    ID INTEGER)
returns (
    PREF varchar(4),
    NUMERO varchar(6),
    FECHA date,
    CLIENTE varchar(20),
    NOMCLIENTE varchar(60),
    SUPERVISOR varchar(60),
    CODBODEGA varchar(2),
    NOMBODEGA varchar(30),
    BODRECH VARCHAR(2),
    PRODARTI varchar(15),
    PRODCODBAR varchar(15),
    PRODDES varchar(60),
    PRODCANT numeric(18,4),
    PRODUNIDAD varchar(8),
    PRODLOTE varchar(15),
    MAQUINA varchar(60),
    OBS blob sub_type 1 segment size 80,
    ITEM integer,
    TURNO INTEGER,
    CANTOK numeric(18,4),
    CANTMAL numeric(18,4),
    UNIDAD varchar(8),
    BODITEM varchar(2),
    OPERARIO VARCHAR(60),
    OBSDET blob sub_type 1 segment size 80,
    PESO numeric(18,4))
AS
BEGIN
SELECT PRDE_PREF, PRDE_NUMERO, PRDE_FECHA, P.PROR_NIT, PROR_NOMCLIENTE, PRDE_BODPROD, BODE_NOM, P.PROR_PRODUCTO, ARTI_COD,
    PROR_DESC, PROR_CANT, PROR_UNIDAD, PROR_LOTE, PRDE_BODRECH, PRDE_OBS, PROR_MAQUINA, PRDE_SUPERVISOR
    FROM produccion_entrada_enc E, produccion_orden P, BODEGA B
    WHERE P.pror_id = E.pror_id AND P.PROR_BODEGA = B.BODE_COD AND E.prde_id = :ID into
    :PREF, :NUMERO, :FECHA, :CLIENTE, :NOMCLIENTE, :CODBODEGA, :NOMBODEGA, :PRODCODBAR, :PRODARTI,
    PRODDES, PRODCANT, PRODUNIDAD, PRODLOTE, :BODRECH, :OBS, :MAQUINA, :SUPERVISOR;
  SELECT ENMA_NOMBRE FROM ensamble_maquina WHERE ENMA_ID = :MAQUINA INTO :MAQUINA;
  SELECT SUPE_NOM FROM SUPERVISOR WHERE SUPE_ID = :supervisor INTO :supervisor;
  FOR SELECT PREN_ITEM, PREN_TURNO, PREN_CANTOK, PREN_CANTMAL, PREN_UNIDAD, BODE_COD, PREN_PESO, PREN_OPERARIO, PREN_OBS
    FROM produccion_entrada_det D WHERE D.prde_id = :ID
    ORDER BY PREN_ITEM
    INTO :ITEM, :TURNO, :CANTOK, :CANTMAL, :UNIDAD, :BODITEM, :PESO, :operario, :obsdet
    DO
      BEGIN
      SELECT ENOP_NOMBRE FROM ENSAMBLE_OPERARIO WHERE ENOP_ID = :operario INTO :operario;
      SUSPEND;
      END
end
^

SET TERM ; ^

grant EXECUTE on PROCEDURE impr_produccion_entrada to PUBLIC;

SET TERM ^ ;

create procedure IMPR_PRODUCCION_MONTAJE (
    ID INTEGER)
returns (
    ITEM integer,
    PROCESO INTEGER,
    MINUTOS numeric(18,4),
    REALES numeric(18,4))
AS
BEGIN
FOR SELECT PRMO_ITEM, PRMO_PROCESO, PRMO_MINUTOS, PRMO_MINUTOSR
    FROM produccion_montaje WHERE pror_id = :ID
    ORDER BY PRMO_ITEM
    INTO :ITEM, :proceso, :minutos, :reales
    DO
      BEGIN
      SUSPEND;
      END
end
^

SET TERM ; ^

grant EXECUTE on PROCEDURE impr_produccion_montaje to PUBLIC;


/* 20090928 */
/* CONSUMO POSITIVO EN DEVOLUCIONES Y AGRUPADO POR CLIENTE O ZONA TODO POSITIVO */

SET TERM ^ ;

CREATE OR ALTER procedure REP_ARTICULOS_VENDEDOR (
    TIPO integer,
    DETALLE char(1),
    DESDE varchar(20),
    HASTA varchar(20),
    FECINI date,
    FECFIN date,
    ARTINI varchar(15),
    ARTFIN varchar(15),
    GRPINI varchar(3),
    GRPFIN varchar(3),
    ORDEN char(1),
    AGRUPA char(1),
    ZONA char(1),
    CEROS char(1),
    SUBEMPRESA integer,
    ZONAINI char(2),
    ZONAFIN char(2))
returns (
    CODVEND varchar(20),
    NOMVEND varchar(60),
    NOMTIPO varchar(50),
    ARTICULO varchar(15),
    DESCRIPCION varchar(60),
    CODGRUPO varchar(2),
    NOMGRUPO varchar(30),
    CODSUBG varchar(3),
    NOMSUBG varchar(30),
    CODMARC varchar(3),
    NOMMARC varchar(30),
    UNIDAD varchar(8),
    CANTIDAD numeric(18,4),
    BASE numeric(18,2),
    IVA numeric(18,2),
    CONSUMO numeric(18,2),
    TOTAL numeric(18,2),
    PREFIJO varchar(4),
    NUMERO varchar(6),
    FECHA date,
    DTO numeric(9,2),
    NIT varchar(20),
    NOMCLIENTE varchar(60),
    SUCURSAL varchar(10),
    CODZONA varchar(2),
    NOMZONA varchar(60))
AS
declare variable codini varchar(15);
declare variable codfin varchar(15);
declare variable desini varchar(15);
declare variable desfin varchar(15);
declare variable marini varchar(3);
declare variable marfin varchar(3);
BEGIN
if (ORDEN = 'C') then
    BEGIN
    CODINI = ARTINI;
    CODFIN = ARTFIN;
    DESINI = '';
    DESFIN = 'zz';
    END
ELSE
    BEGIN
    DESINI = ARTINI;
    DESFIN = ARTFIN;
    CODINI = '';
    CODFIN = 'zz';
    END
if (AGRUPA = 'G') then
    BEGIN
    MARINI = '';
    MARFIN = 'zz';
    END
ELSE
    if (AGRUPA = 'M') then
        BEGIN
        MARINI = GRPINI;
        MARFIN = GRPFIN;
        GRPINI = '';
        GRPFIN = 'zz';
        END
    ELSE
        BEGIN
        MARINI = '';
        MARFIN = 'zz';
        END
if (DETALLE = 'N') then
    BEGIN
    if (BIN_AND(TIPO, 1) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 31 INTO :NOMTIPO;
        FOR SELECT MAX(D.ARTI_COD), MAX(VEND_COD), SUM(FADE_CANT * FADE_FACTOR), SUM((FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO)*FACT_FACTOR), SUM(FADE_IVAMONTO*FACT_FACTOR), SUM(FADE_CONSUMO), SUM(FADE_TOTAL*FACT_FACTOR),
            MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD)
            FROM FACTURAS_DETALLE D, FACTURAS F, PREFIJOS P, ARTICULO A
            WHERE F.FACT_ID = D.FACT_ID AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND D.ARTI_COD = A.arti_cod AND
            VEND_COD >= :DESDE AND VEND_COD <= :HASTA AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            FACT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) and substring(a.arti_cod from 1 FOR 2) <> '.t'
            GROUP BY VEND_COD, D.ARTI_COD
            INTO :ARTICULO, :CODVEND, :CANTIDAD, :BASE, :IVA, :CONSUMO, :TOTAL,
            :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
            DO
            BEGIN
            select VEND_NOMBRE from VENDEDORES where VEND_COD = :CODVEND INTO :NOMVEND;
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            if (CEROS = 'S') then
                SUSPEND;
            ELSE
                if ((BASE <> 0) AND (CANTIDAD <> 0)) then
                    SUSPEND;
            END /* FOR */
        END
    if (BIN_AND(TIPO, 2) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 32 INTO :NOMTIPO;
        FOR SELECT MAX(D.ARTI_COD), MAX(VEND_COD), SUM(RVDE_CANT * RVDE_FACTOR), SUM(RVDE_TOTAL-RVDE_IVAMONTO-RVDE_CONSUMO), SUM(RVDE_IVAMONTO), SUM(RVDE_CONSUMO), SUM(RVDE_TOTAL),
            MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD)
            FROM REMISIONES_VENTA_DETALLE D, REMISIONES_VENTA R, PREFIJOS P, ARTICULO A
            WHERE R.REVT_ID = D.REVT_ID AND P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = 32 AND D.ARTI_COD = A.arti_cod AND
            VEND_COD >= :DESDE AND VEND_COD <= :HASTA AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            REVT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY R.vend_cod, D.ARTI_COD
            INTO :ARTICULO, :CODVEND, :CANTIDAD, :BASE, :IVA, :CONSUMO, :TOTAL,
            :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
            DO
            BEGIN
            select VEND_NOMBRE from VENDEDORES where VEND_COD = :CODVEND INTO :NOMVEND;
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            if (CEROS = 'S') then
                SUSPEND;
            ELSE
                if ((BASE <> 0) AND (CANTIDAD <> 0)) then
                    SUSPEND;
            END /* FOR */
        END
    if (BIN_AND(TIPO, 4) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 33 INTO :NOMTIPO;
        FOR SELECT MAX(D.ARTI_COD), MAX(VEND_COD), SUM(DVDE_CANT * DVDE_FACTOR), SUM((DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO)*DEVT_FACTOR), SUM(DVDE_IVAMONTO*DEVT_FACTOR), SUM(DVDE_CONSUMO), SUM(DVDE_TOTAL*DEVT_FACTOR),
            MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD)
            FROM devoluciones_ventas_detalle D, DEVOLUCIONES_VENTAS V, PREFIJOS P, ARTICULO A
            WHERE V.DEVT_ID = D.DEVT_ID AND P.PREF_PRE = V.PREF_PRE AND P.TIDO_COD = 33 AND D.ARTI_COD = A.arti_cod AND
            VEND_COD >= :DESDE AND VEND_COD <= :HASTA AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            DEVT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY V.vend_cod, D.ARTI_COD
            INTO :ARTICULO, :CODVEND, :CANTIDAD, :BASE, :IVA, :CONSUMO, :TOTAL,
            :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
            DO
            BEGIN
            select VEND_NOMBRE from VENDEDORES where VEND_COD = :CODVEND INTO :NOMVEND;
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            if (CEROS = 'S') then
                SUSPEND;
            ELSE
                if ((BASE <> 0) AND (CANTIDAD <> 0)) then
                    BEGIN
                    BASE = BASE * -1;
                    IVA = IVA * -1;
                    CANTIDAD = CANTIDAD * -1;
                    CONSUMO = CONSUMO * -1;
                    TOTAL = TOTAL * -1;
                    SUSPEND;
                    END
            END /* FOR */
        END
    if (BIN_AND(TIPO, 8) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 34 INTO :NOMTIPO;
        FOR SELECT MAX(D.ARTI_COD), MAX(VEND_COD), SUM(PEDE_CANT * PEDE_FACTOR), SUM((PEDE_TOTAL-PEDE_IVAMONTO-PEDE_CONSUMO)*PEDI_FACTOR), SUM(PEDE_IVAMONTO*PEDI_FACTOR), SUM(PEDE_CONSUMO), SUM(PEDE_TOTAL*PEDI_FACTOR),
            MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD)
            FROM PEDIDOS_DETALLE D, PEDIDOS P, PREFIJOS R, ARTICULO A
            WHERE P.PEDI_ID = D.PEDI_ID AND P.PREF_PRE = R.PREF_PRE AND R.TIDO_COD = 34 AND D.ARTI_COD = A.arti_cod AND
            VEND_COD >= :DESDE AND VEND_COD <= :HASTA AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            PEDI_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY P.vend_cod, D.ARTI_COD
            INTO :ARTICULO, :CODVEND, :CANTIDAD, :BASE, :IVA, :CONSUMO, :TOTAL,
            :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
            DO
            BEGIN
            select VEND_NOMBRE from VENDEDORES where VEND_COD = :CODVEND INTO :NOMVEND;
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            if (CEROS = 'S') then
                SUSPEND;
            ELSE
                if ((BASE <> 0) AND (CANTIDAD <> 0)) then
                    SUSPEND;
            END /* FOR */
        END
    if (BIN_AND(TIPO, 16) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 35 INTO :NOMTIPO;
        FOR SELECT MAX(D.ARTI_COD), MAX(VEND_COD), SUM(CTDE_CANT * CTDE_FACTOR), SUM((CTDE_TOTAL-CTDE_IVAMONTO-CTDE_CONSUMO)*COTI_FACTOR), SUM(CTDE_IVAMONTO*COTI_FACTOR), SUM(CTDE_CONSUMO), SUM(CTDE_TOTAL*COTI_FACTOR),
            MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD)
            FROM COTIZACIONES_DETALLE D, COTIZACIONES C, PREFIJOS P, ARTICULO A
            WHERE C.COTI_ID = D.COTI_ID AND P.PREF_PRE = C.PREF_PRE AND P.TIDO_COD = 35 AND D.ARTI_COD = A.arti_cod AND
            VEND_COD >= :DESDE AND VEND_COD <= :HASTA AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND COTI_FECHA >= :FECINI AND COTI_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            COTI_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY C.vend_cod, D.ARTI_COD
            INTO :ARTICULO, :CODVEND, :CANTIDAD, :BASE, :IVA, :CONSUMO, :TOTAL,
            :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
            DO
            BEGIN
            select VEND_NOMBRE from VENDEDORES where VEND_COD = :CODVEND INTO :NOMVEND;
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            if (CEROS = 'S') then
                SUSPEND;
            ELSE
                if ((BASE <> 0) AND (CANTIDAD <> 0)) then
                    SUSPEND;
            END /* FOR */
        END
    END
ELSE
  if (DETALLE = 'S') then
    BEGIN
    if (BIN_AND(TIPO, 1) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 31 INTO :NOMTIPO;
        FOR SELECT F.PREF_PRE, FACT_NUMERO, FACT_FECHA, VEND_COD, D.ARTI_COD, FADE_CANT * FADE_FACTOR, (FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO)*FACT_FACTOR, FADE_IVAMONTO*FACT_FACTOR, FADE_CONSUMO, FADE_DTOPORC, FADE_TOTAL*FACT_FACTOR,
            ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD , F.TERC_NIT, F.fact_nomcliente, F.fact_sucursal
            FROM FACTURAS F, FACTURAS_DETALLE D, PREFIJOS P, ARTICULO A
            WHERE F.FACT_ID = D.FACT_ID AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND D.ARTI_COD = A.arti_cod AND
                VEND_COD >= :DESDE AND VEND_COD <= :HASTA AND
                A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
                A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND FACT_FECHA >= :FECINI AND
                (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
                FACT_FECHA <= :FECFIN AND FACT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) and substring(a.arti_cod from 1 FOR 2) <> '.t'
            ORDER BY VEND_COD, D.ARTI_COD, FACT_FECHA, F.FACT_ID, FADE_ITEM
            INTO :PREFIJO, :NUMERO, :FECHA, :CODVEND, :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO, :DTO, :TOTAL,
                :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :NIT, :nomcliente, :sucursal
            DO
            BEGIN
            select VEND_NOMBRE from VENDEDORES where VEND_COD = :CODVEND INTO :NOMVEND;
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            SUSPEND;
            END
        END
    if (BIN_AND(TIPO, 2) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 32 INTO :NOMTIPO;
        FOR SELECT R.PREF_PRE, REVT_NUMERO, REVT_FECHA, VEND_COD, D.ARTI_COD, RVDE_CANT * RVDE_FACTOR, (RVDE_TOTAL-RVDE_IVAMONTO-RVDE_CONSUMO), RVDE_IVAMONTO, RVDE_CONSUMO, RVDE_DTOPORC, RVDE_TOTAL,
            ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD, R.terc_nit, R.revt_nomterc, r.revt_sucursal
            FROM REMISIONES_VENTA R, REMISIONES_VENTA_DETALLE D, PREFIJOS P, ARTICULO A
            WHERE R.REVT_ID = D.REVT_ID AND P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = 32 AND D.ARTI_COD = A.arti_cod AND
                VEND_COD >= :DESDE AND VEND_COD <= :HASTA AND
                A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
                A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN AND
                (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
                REVT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            ORDER BY VEND_COD, D.ARTI_COD, REVT_FECHA, R.REVT_ID, RVDE_ITEM
            INTO :PREFIJO, :NUMERO, :FECHA, :CODVEND, :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO, :DTO, :TOTAL,
                :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :NIT, :nomcliente, :sucursal
            DO
            BEGIN
            select VEND_NOMBRE from VENDEDORES where VEND_COD = :CODVEND INTO :NOMVEND;
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            SUSPEND;
            END
        END
    if (BIN_AND(TIPO, 4) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 33 INTO :NOMTIPO;
        FOR SELECT V.PREF_PRE, DEVT_NUMERO, DEVT_FECHA, VEND_COD, D.ARTI_COD, DVDE_CANT * DVDE_FACTOR, (DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO)*DEVT_FACTOR, DVDE_IVAMONTO*DEVT_FACTOR, DVDE_CONSUMO, DVDE_DTOPORC, DVDE_TOTAL*DEVT_FACTOR,
            ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD, V.terc_nit, V.devt_nomterc, v.devt_sucursal
            FROM DEVOLUCIONES_VENTAS V, DEVOLUCIONES_VENTAS_DETALLE D, PREFIJOS P, ARTICULO A
            WHERE V.DEVT_ID = D.DEVT_ID AND P.PREF_PRE = V.PREF_PRE AND P.TIDO_COD = 33 AND D.ARTI_COD = A.arti_cod AND
                VEND_COD >= :DESDE AND VEND_COD <= :HASTA AND
                A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
                A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND
                (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
                DEVT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            ORDER BY VEND_COD, D.ARTI_COD, DEVT_FECHA, V.DEVT_ID, DVDE_ITEM
            INTO :PREFIJO, :NUMERO, :FECHA, :CODVEND, :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO, :DTO, :TOTAL,
                :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :NIT, :nomcliente, :sucursal
            DO
            BEGIN
            select VEND_NOMBRE from VENDEDORES where VEND_COD = :CODVEND INTO :NOMVEND;
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            BASE = BASE * -1;
            IVA = IVA * -1;
            CANTIDAD = CANTIDAD * -1;
            CONSUMO = CONSUMO * -1;
            TOTAL = TOTAL * -1;
            SUSPEND;
            END
        END
    if (BIN_AND(TIPO, 8) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 34 INTO :NOMTIPO;
        FOR SELECT P.PREF_PRE, PEDI_NUMERO, PEDI_FECHA, VEND_COD, D.ARTI_COD, PEDE_CANT * PEDE_FACTOR, (PEDE_TOTAL-PEDE_IVAMONTO-PEDE_CONSUMO)*PEDI_FACTOR, PEDE_IVAMONTO*PEDI_FACTOR, PEDE_CONSUMO, PEDE_DTOPORC, PEDE_TOTAL*PEDI_FACTOR,
            ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD, P.terc_nit, P.pedi_nomterc, p.pedi_sucursal
            FROM PEDIDOS P, PEDIDOS_DETALLE D, PREFIJOS R, ARTICULO A
            WHERE P.PEDI_ID = D.PEDI_ID AND P.PREF_PRE = R.PREF_PRE AND R.TIDO_COD = 34 AND D.ARTI_COD = A.arti_cod AND
                VEND_COD >= :DESDE AND VEND_COD <= :HASTA AND
                A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
                A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND
                (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
                PEDI_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            ORDER BY VEND_COD, D.ARTI_COD, PEDI_FECHA, P.PEDI_ID, PEDE_ITEM
            INTO :PREFIJO, :NUMERO, :FECHA, :CODVEND, :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO, :DTO, :TOTAL,
                :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :NIT, :nomcliente, :sucursal
            DO
            BEGIN
            select VEND_NOMBRE from VENDEDORES where VEND_COD = :CODVEND INTO :NOMVEND;
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            SUSPEND;
            END
        END
    if (BIN_AND(TIPO, 16) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 35 INTO :NOMTIPO;
        FOR SELECT C.PREF_PRE, COTI_NUMERO, COTI_FECHA, VEND_COD, D.ARTI_COD, CTDE_CANT * CTDE_FACTOR, (CTDE_TOTAL-CTDE_IVAMONTO-CTDE_CONSUMO)*COTI_FACTOR, CTDE_IVAMONTO*COTI_FACTOR, CTDE_CONSUMO, CTDE_DTOPORC, CTDE_TOTAL*COTI_FACTOR,
            ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD, C.terc_nit, C.coti_nomterc, c.coti_sucursal
            FROM COTIZACIONES C, COTIZACIONES_DETALLE D, PREFIJOS P, ARTICULO A
            WHERE C.COTI_ID = D.COTI_ID AND P.PREF_PRE = C.PREF_PRE AND P.TIDO_COD = 35 AND D.ARTI_COD = A.arti_cod AND
                VEND_COD >= :DESDE AND VEND_COD <= :HASTA AND
                A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
                A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND COTI_FECHA >= :FECINI AND COTI_FECHA <= :FECFIN AND
                (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
                COTI_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            ORDER BY VEND_COD, D.ARTI_COD, COTI_FECHA, C.COTI_ID, CTDE_ITEM
            INTO :PREFIJO, :NUMERO, :FECHA, :CODVEND, :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO, :DTO, :TOTAL,
                :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :NIT, :nomcliente, :sucursal
            DO
            BEGIN
            select VEND_NOMBRE from VENDEDORES where VEND_COD = :CODVEND INTO :NOMVEND;
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            SUSPEND;
            END
        END
    END
  ELSE
if (DETALLE = 'C') then
    BEGIN
    if (BIN_AND(TIPO, 1) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 31 INTO :NOMTIPO;
        FOR SELECT MAX(D.ARTI_COD), MAX(VEND_COD), SUM(FADE_CANT * FADE_FACTOR), SUM((FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO)*FACT_FACTOR), SUM(FADE_IVAMONTO*FACT_FACTOR), SUM(FADE_CONSUMO), SUM(FADE_TOTAL*FACT_FACTOR),
            MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD), MAX(F.terc_nit), MAX(F.fact_nomcliente), MAX(F.fact_sucursal)
            FROM FACTURAS_DETALLE D, FACTURAS F, PREFIJOS P, ARTICULO A
            WHERE F.FACT_ID = D.FACT_ID AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND D.ARTI_COD = A.arti_cod AND
            VEND_COD >= :DESDE AND VEND_COD <= :HASTA AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            FACT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) and substring(a.arti_cod from 1 FOR 2) <> '.t'
            GROUP BY F.VEND_COD, F.TERC_NIT, F.fact_sucursal, D.ARTI_COD
            INTO :ARTICULO, :CODVEND, :CANTIDAD, :BASE, :IVA, :CONSUMO, :TOTAL,
            :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :nit, :nomcliente, :sucursal
            DO
            BEGIN
            select VEND_NOMBRE from VENDEDORES where VEND_COD = :CODVEND INTO :NOMVEND;
            SELECT C.ZONA_COD, ZONA_NOM FROM CLIENTES C, ZONAS Z WHERE C.zona_cod = Z.zona_cod AND C.terc_nit = :nit INTO :codzona, :nomzona;
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            if (CEROS = 'S') then
                SUSPEND;
            ELSE
                if ((BASE <> 0) AND (CANTIDAD <> 0)) then
                    SUSPEND;
            END /* FOR */
        END
    if (BIN_AND(TIPO, 2) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 32 INTO :NOMTIPO;
        FOR SELECT MAX(D.ARTI_COD), MAX(VEND_COD), SUM(RVDE_CANT * RVDE_FACTOR), SUM(RVDE_TOTAL-RVDE_IVAMONTO-RVDE_CONSUMO), SUM(RVDE_IVAMONTO), SUM(RVDE_CONSUMO), SUM(RVDE_TOTAL),
            MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD), MAX(R.terc_nit), MAX(R.revt_nomterc), MAX(R.revt_sucursal)
            FROM REMISIONES_VENTA_DETALLE D, REMISIONES_VENTA R, PREFIJOS P, ARTICULO A
            WHERE R.REVT_ID = D.REVT_ID AND P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = 32 AND D.ARTI_COD = A.arti_cod AND
            VEND_COD >= :DESDE AND VEND_COD <= :HASTA AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            REVT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY R.vend_cod, R.terc_nit, R.revt_sucursal, D.arti_cod
            INTO :ARTICULO, :CODVEND, :CANTIDAD, :BASE, :IVA, :CONSUMO, :TOTAL,
            :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :nit, :nomcliente, :sucursal
            DO
            BEGIN
            SELECT C.ZONA_COD, ZONA_NOM FROM CLIENTES C, ZONAS Z WHERE C.zona_cod = Z.zona_cod AND C.terc_nit = :nit INTO :codzona, :nomzona;
            select VEND_NOMBRE from VENDEDORES where VEND_COD = :CODVEND INTO :NOMVEND;
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            if (CEROS = 'S') then
                SUSPEND;
            ELSE
                if ((BASE <> 0) AND (CANTIDAD <> 0)) then
                    SUSPEND;
            END /* FOR */
        END
    if (BIN_AND(TIPO, 4) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 33 INTO :NOMTIPO;
        FOR SELECT MAX(D.ARTI_COD), MAX(VEND_COD), SUM(DVDE_CANT * DVDE_FACTOR), SUM((DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO)*DEVT_FACTOR), SUM(DVDE_IVAMONTO*DEVT_FACTOR), SUM(DVDE_CONSUMO), SUM(DVDE_TOTAL*DEVT_FACTOR),
            MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD), MAX(V.terc_nit), MAX(V.devt_nomterc), MAX(V.devt_sucursal)
            FROM devoluciones_ventas_detalle D, DEVOLUCIONES_VENTAS V, PREFIJOS P, ARTICULO A
            WHERE V.DEVT_ID = D.DEVT_ID AND P.PREF_PRE = V.PREF_PRE AND P.TIDO_COD = 33 AND D.ARTI_COD = A.arti_cod AND
            VEND_COD >= :DESDE AND VEND_COD <= :HASTA AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            DEVT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY V.vend_cod, V.terc_nit, V.devt_sucursal, D.arti_cod
            INTO :ARTICULO, :CODVEND, :CANTIDAD, :BASE, :IVA, :CONSUMO, :TOTAL,
            :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :nit, :nomcliente, :sucursal
            DO
            BEGIN
            SELECT C.ZONA_COD, ZONA_NOM FROM CLIENTES C, ZONAS Z WHERE C.zona_cod = Z.zona_cod AND C.terc_nit = :nit INTO :codzona, :nomzona;
            select VEND_NOMBRE from VENDEDORES where VEND_COD = :CODVEND INTO :NOMVEND;
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            BASE = BASE * -1;
            IVA = IVA * -1;
            CANTIDAD = CANTIDAD * -1;
            CONSUMO = CONSUMO * -1;
            TOTAL = TOTAL * -1;
            if (CEROS = 'S') then
                SUSPEND;
            ELSE
                if ((BASE <> 0) AND (CANTIDAD <> 0)) then
                    SUSPEND;
            END /* FOR */
        END
    if (BIN_AND(TIPO, 8) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 34 INTO :NOMTIPO;
        FOR SELECT MAX(D.ARTI_COD), MAX(VEND_COD), SUM(PEDE_CANT * PEDE_FACTOR), SUM((PEDE_TOTAL-PEDE_IVAMONTO-PEDE_CONSUMO)*PEDI_FACTOR), SUM(PEDE_IVAMONTO*PEDI_FACTOR), SUM(PEDE_CONSUMO), SUM(PEDE_TOTAL*PEDI_FACTOR),
            MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD), MAX(P.terc_nit), MAX(P.pedi_nomterc), MAX(P.pedi_sucursal)
            FROM PEDIDOS_DETALLE D, PEDIDOS P, PREFIJOS R, ARTICULO A
            WHERE P.PEDI_ID = D.PEDI_ID AND P.PREF_PRE = R.PREF_PRE AND R.TIDO_COD = 34 AND D.ARTI_COD = A.arti_cod AND
            VEND_COD >= :DESDE AND VEND_COD <= :HASTA AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            PEDI_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY P.vend_cod, P.terc_nit, P.pedi_sucursal, D.arti_cod
            INTO :ARTICULO, :CODVEND, :CANTIDAD, :BASE, :IVA, :CONSUMO, :TOTAL,
            :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :nit, :nomcliente, :sucursal
            DO
            BEGIN
            SELECT C.ZONA_COD, ZONA_NOM FROM CLIENTES C, ZONAS Z WHERE C.zona_cod = Z.zona_cod AND C.terc_nit = :nit INTO :codzona, :nomzona;
            select VEND_NOMBRE from VENDEDORES where VEND_COD = :CODVEND INTO :NOMVEND;
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            if (CEROS = 'S') then
                SUSPEND;
            ELSE
                if ((BASE <> 0) AND (CANTIDAD <> 0)) then
                    SUSPEND;
            END /* FOR */
        END
    if (BIN_AND(TIPO, 16) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 35 INTO :NOMTIPO;
        FOR SELECT MAX(D.ARTI_COD), MAX(VEND_COD), SUM(CTDE_CANT * CTDE_FACTOR), SUM((CTDE_TOTAL-CTDE_IVAMONTO-CTDE_CONSUMO)*COTI_FACTOR), SUM(CTDE_IVAMONTO*COTI_FACTOR), SUM(CTDE_CONSUMO), SUM(CTDE_TOTAL*COTI_FACTOR),
            MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD), MAX(C.terc_nit), MAX(C.coti_nomterc), MAX(C.coti_sucursal)
            FROM COTIZACIONES_DETALLE D, COTIZACIONES C, PREFIJOS P, ARTICULO A
            WHERE C.COTI_ID = D.COTI_ID AND P.PREF_PRE = C.PREF_PRE AND P.TIDO_COD = 35 AND D.ARTI_COD = A.arti_cod AND
            VEND_COD >= :DESDE AND VEND_COD <= :HASTA AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND COTI_FECHA >= :FECINI AND COTI_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            COTI_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY C.vend_cod, C.terc_nit, C.coti_sucursal, D.arti_cod
            INTO :ARTICULO, :CODVEND, :CANTIDAD, :BASE, :IVA, :CONSUMO, :TOTAL,
            :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :nit, :nomcliente, :sucursal
            DO
            BEGIN
            SELECT C.ZONA_COD, ZONA_NOM FROM CLIENTES C, ZONAS Z WHERE C.zona_cod = Z.zona_cod AND C.terc_nit = :nit INTO :codzona, :nomzona;
            select VEND_NOMBRE from VENDEDORES where VEND_COD = :CODVEND INTO :NOMVEND;
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            if (CEROS = 'S') then
                SUSPEND;
            ELSE
                if ((BASE <> 0) AND (CANTIDAD <> 0)) then
                    SUSPEND;
            END /* FOR */
        END
    END
if (zona = 'S') then
    BEGIN
    if (BIN_AND(TIPO, 1) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 31 INTO :NOMTIPO;
        FOR SELECT MAX(D.ARTI_COD), MAX(F.VEND_COD), SUM(FADE_CANT * FADE_FACTOR), SUM((FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO)*FACT_FACTOR), SUM(FADE_IVAMONTO*FACT_FACTOR), SUM(FADE_CONSUMO), SUM(FADE_TOTAL*FACT_FACTOR),
            MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD), MAX(F.terc_nit), MAX(F.fact_nomcliente), MAX(F.fact_sucursal)
            FROM FACTURAS_DETALLE D, FACTURAS F, PREFIJOS P, ARTICULO A, clientes C, ZONAS Z
            WHERE F.FACT_ID = D.FACT_ID AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND D.ARTI_COD = A.arti_cod AND
            F.VEND_COD >= :DESDE AND F.VEND_COD <= :HASTA AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            FACT_ANULADO = 'N' AND ((P.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) AND F.terc_nit = C.terc_nit AND
            Z.zona_cod = C.zona_cod AND C.zona_cod >= :zonaini AND C.zona_cod <= :zonafin and substring(a.arti_cod from 1 FOR 2) <> '.t'
            GROUP BY F.VEND_COD, C.zona_cod ,D.ARTI_COD , C.terc_nit, F.fact_sucursal
            INTO :ARTICULO, :CODVEND, :CANTIDAD, :BASE, :IVA, :CONSUMO, :TOTAL,
            :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :nit, :nomcliente, :sucursal
            DO
            BEGIN
            select VEND_NOMBRE from VENDEDORES where VEND_COD = :CODVEND INTO :NOMVEND;
            SELECT C.ZONA_COD, ZONA_NOM FROM CLIENTES C, ZONAS Z WHERE C.zona_cod = Z.zona_cod AND C.terc_nit = :nit /*AND Z.zona_cod >= :zonaini AND Z.zona_cod >= :zonafin*/ INTO :codzona, :nomzona;
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            if (CEROS = 'S') then
                SUSPEND;
            ELSE
                if ((BASE <> 0) AND (CANTIDAD <> 0)) then
                    SUSPEND;
            END /* FOR */
        END
    if (BIN_AND(TIPO, 2) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 32 INTO :NOMTIPO;
        FOR SELECT MAX(D.ARTI_COD), MAX(R.VEND_COD), SUM(RVDE_CANT * RVDE_FACTOR), SUM(RVDE_TOTAL-RVDE_IVAMONTO-RVDE_CONSUMO), SUM(RVDE_IVAMONTO), SUM(RVDE_CONSUMO), SUM(RVDE_TOTAL),
            MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD), MAX(R.terc_nit), MAX(R.revt_nomterc), MAX(R.revt_sucursal)
            FROM REMISIONES_VENTA_DETALLE D, REMISIONES_VENTA R, PREFIJOS P, ARTICULO A, clientes C, ZONAS Z
            WHERE R.REVT_ID = D.REVT_ID AND P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = 32 AND D.ARTI_COD = A.arti_cod AND
            R.VEND_COD >= :DESDE AND R.VEND_COD <= :HASTA AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            REVT_ANULADO = 'N' AND ((P.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))AND R.terc_nit = C.terc_nit AND
            Z.zona_cod = C.zona_cod AND C.zona_cod >= :zonaini AND C.zona_cod <= :zonafin
            GROUP BY R.vend_cod, c.zona_cod, D.arti_cod , R.terc_nit
            INTO :ARTICULO, :CODVEND, :CANTIDAD, :BASE, :IVA, :CONSUMO, :TOTAL,
            :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :nit, :nomcliente, :sucursal
            DO
            BEGIN
            SELECT C.ZONA_COD, ZONA_NOM FROM CLIENTES C, ZONAS Z WHERE C.zona_cod = Z.zona_cod AND C.terc_nit = :nit INTO :codzona, :nomzona;
            select VEND_NOMBRE from VENDEDORES where VEND_COD = :CODVEND INTO :NOMVEND;
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            if (CEROS = 'S') then
                SUSPEND;
            ELSE
                if ((BASE <> 0) AND (CANTIDAD <> 0)) then
                    SUSPEND;
            END /* FOR */
        END
    if (BIN_AND(TIPO, 4) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 33 INTO :NOMTIPO;
        FOR SELECT MAX(D.ARTI_COD), MAX(V.VEND_COD), SUM(DVDE_CANT * DVDE_FACTOR), SUM((DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO)*DEVT_FACTOR), SUM(DVDE_IVAMONTO*DEVT_FACTOR), SUM(DVDE_CONSUMO), SUM(DVDE_TOTAL*DEVT_FACTOR),
            MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD), MAX(V.terc_nit), MAX(V.devt_nomterc), MAX(V.devt_sucursal)
            FROM devoluciones_ventas_detalle D, DEVOLUCIONES_VENTAS V, PREFIJOS P, ARTICULO A, clientes C, ZONAS Z
            WHERE V.DEVT_ID = D.DEVT_ID AND P.PREF_PRE = V.PREF_PRE AND P.TIDO_COD = 33 AND D.ARTI_COD = A.arti_cod AND
            V.VEND_COD >= :DESDE AND V.VEND_COD <= :HASTA AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            DEVT_ANULADO = 'N' AND ((P.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))AND V.terc_nit = C.terc_nit AND
            Z.zona_cod = C.zona_cod AND C.zona_cod >= :zonaini AND C.zona_cod <= :zonafin
            GROUP BY V.vend_cod, c.zona_cod, D.arti_cod , V.terc_nit
            INTO :ARTICULO, :CODVEND, :CANTIDAD, :BASE, :IVA, :CONSUMO, :TOTAL,
            :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :nit, :nomcliente, :sucursal
            DO
            BEGIN
            SELECT C.ZONA_COD, ZONA_NOM FROM CLIENTES C, ZONAS Z WHERE C.zona_cod = Z.zona_cod AND C.terc_nit = :nit INTO :codzona, :nomzona;
            select VEND_NOMBRE from VENDEDORES where VEND_COD = :CODVEND INTO :NOMVEND;
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            BASE = BASE * -1;
            IVA = IVA * -1;
            CANTIDAD = CANTIDAD * -1;
            CONSUMO = CONSUMO * -1;
            TOTAL = TOTAL * -1;
            if (CEROS = 'S') then
                SUSPEND;
            ELSE
                if ((BASE <> 0) AND (CANTIDAD <> 0)) then
                    SUSPEND;
            END /* FOR */
        END
    if (BIN_AND(TIPO, 8) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 34 INTO :NOMTIPO;
        FOR SELECT MAX(D.ARTI_COD), MAX(P.VEND_COD), SUM(PEDE_CANT * PEDE_FACTOR), SUM((PEDE_TOTAL-PEDE_IVAMONTO-PEDE_CONSUMO)*PEDI_FACTOR), SUM(PEDE_IVAMONTO*PEDI_FACTOR), SUM(PEDE_CONSUMO), SUM(PEDE_TOTAL*PEDI_FACTOR),
            MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD), MAX(P.terc_nit), MAX(P.pedi_nomterc), MAX(P.pedi_sucursal)
            FROM PEDIDOS_DETALLE D, PEDIDOS P, PREFIJOS R, ARTICULO A, clientes C, ZONAS Z
            WHERE P.PEDI_ID = D.PEDI_ID AND P.PREF_PRE = R.PREF_PRE AND R.TIDO_COD = 34 AND D.ARTI_COD = A.arti_cod AND
            P.VEND_COD >= :DESDE AND P.VEND_COD <= :HASTA AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            PEDI_ANULADO = 'N' AND ((R.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))AND P.terc_nit = C.terc_nit AND
            Z.zona_cod = C.zona_cod AND C.zona_cod >= :zonaini AND C.zona_cod <= :zonafin
            GROUP BY P.vend_cod, c.zona_cod, D.arti_cod , P.terc_nit
            INTO :ARTICULO, :CODVEND, :CANTIDAD, :BASE, :IVA, :CONSUMO, :TOTAL,
            :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :nit, :nomcliente, :sucursal
            DO
            BEGIN
            SELECT C.ZONA_COD, ZONA_NOM FROM CLIENTES C, ZONAS Z WHERE C.zona_cod = Z.zona_cod AND C.terc_nit = :nit INTO :codzona, :nomzona;
            select VEND_NOMBRE from VENDEDORES where VEND_COD = :CODVEND INTO :NOMVEND;
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            if (CEROS = 'S') then
                SUSPEND;
            ELSE
                if ((BASE <> 0) AND (CANTIDAD <> 0)) then
                    SUSPEND;
            END /* FOR */
        END
    if (BIN_AND(TIPO, 16) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 35 INTO :NOMTIPO;
        FOR SELECT MAX(D.ARTI_COD), MAX(C.VEND_COD), SUM(CTDE_CANT * CTDE_FACTOR), SUM((CTDE_TOTAL-CTDE_IVAMONTO-CTDE_CONSUMO)*COTI_FACTOR), SUM(CTDE_IVAMONTO*COTI_FACTOR), SUM(CTDE_CONSUMO), SUM(CTDE_TOTAL*COTI_FACTOR),
            MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD), MAX(C.terc_nit), MAX(C.coti_nomterc), MAX(C.coti_sucursal)
            FROM COTIZACIONES_DETALLE D, COTIZACIONES C, PREFIJOS P, ARTICULO A, clientes T, ZONAS Z
            WHERE C.COTI_ID = D.COTI_ID AND P.PREF_PRE = C.PREF_PRE AND P.TIDO_COD = 35 AND D.ARTI_COD = A.arti_cod AND
            C.VEND_COD >= :DESDE AND C.VEND_COD <= :HASTA AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND COTI_FECHA >= :FECINI AND COTI_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            COTI_ANULADO = 'N' AND ((P.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))AND C.terc_nit = T.terc_nit AND
            Z.zona_cod = T.zona_cod AND T.zona_cod >= :zonaini AND T.zona_cod <= :zonafin
            GROUP BY C.vend_cod, t.zona_cod, D.arti_cod , C.terc_nit
            INTO :ARTICULO, :CODVEND, :CANTIDAD, :BASE, :IVA, :CONSUMO, :TOTAL,
            :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :nit, :nomcliente, :sucursal
            DO
            BEGIN
            SELECT C.ZONA_COD, ZONA_NOM FROM CLIENTES C, ZONAS Z WHERE C.zona_cod = Z.zona_cod AND C.terc_nit = :nit INTO :codzona, :nomzona;
            select VEND_NOMBRE from VENDEDORES where VEND_COD = :CODVEND INTO :NOMVEND;
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            if (CEROS = 'S') then
                SUSPEND;
            ELSE
                if ((BASE <> 0) AND (CANTIDAD <> 0)) then
                    SUSPEND;
            END /* FOR */
        END
    END
END
^

SET TERM ; ^



/* 20090929 */
/* AL SIMULAR EL CIERRE SIEMPRE REPORTABA COMO PERDIDA SIN IMPORTAR EL SIGNO */
SET TERM ^ ;

CREATE OR ALTER PROCEDURE INVENTARIO_Y_BALANCE (
     ano char(4),
     mes integer)
returns (
     codigo varchar(20),
     nombre varchar(60),
     articulo varchar(15),
     nomarticulo varchar(60),
     nomctaart varchar(60),
     saldo numeric(18,2),
     sclase numeric(18,2),
     sgrupo numeric(18,2),
     ssubgrupo numeric(18,2),
     scuenta numeric(18,2),
     nivel integer)
as
declare variable tipo char(1);
declare variable afectable char(1);
declare variable ctacierreu varchar(20); declare variable ctacierrep varchar(20); declare variable cierre numeric(18,2); declare variable aux numeric(18,2); declare variable simulacierre char(2); declare variable dig integer; BEGIN execute procedure lee_configuracion('CONTABILIDAD', 'GENERAL', 'INVENTARIO Y BALANCE SOLO CON CUENTAS DE BALANCE') returning_values (:simulacierre); if (simulacierre = 'SI') then
     BEGIN
     /* CALCULE LA UTILIDAD DEL EJERCICIO */
     EXECUTE PROCEDURE SALDO_CUENTA_MES('4', ANO, MES, 'N') RETURNING_VALUES (AUX);
     CIERRE = AUX;
     EXECUTE PROCEDURE SALDO_CUENTA_MES('5', ANO, MES, 'N') RETURNING_VALUES (AUX);
     CIERRE = CIERRE + AUX;
     EXECUTE PROCEDURE SALDO_CUENTA_MES('6', ANO, MES, 'N') RETURNING_VALUES (AUX);
     CIERRE = CIERRE + AUX;
     EXECUTE PROCEDURE SALDO_CUENTA_MES('7', ANO, MES, 'N') RETURNING_VALUES (AUX);
     CIERRE = CIERRE + AUX;
     EXECUTE PROCEDURE LEE_CONFIGURACION ('CONTABILIDAD', 'GENERAL', 'CUENTA DE UTILIDAD DEL EJERCICIO') returning_values (:CTACIERREU);
     EXECUTE PROCEDURE LEE_CONFIGURACION ('CONTABILIDAD', 'GENERAL', 'CUENTA DE PERDIDA DEL EJERCICIO') returning_values (:CTACIERREP);
     END
FOR SELECT CUEN_COD, CUEN_NOM, CUEN_TIPO FROM CUENTAS order by CUEN_COD INTO CODIGO, NOMBRE, TIPO
     DO
     BEGIN
     if ((simulacierre = 'NO') or (CODIGO < '4')) then
         BEGIN
         EXECUTE PROCEDURE SALDO_CUENTA_MES(CODIGO, ANO, MES, 'N') RETURNING_VALUES (SALDO);
         EXECUTE PROCEDURE VALIDE_ESTRUCTURA (CODIGO) RETURNING_VALUES (:NIVEL);
         EXECUTE PROCEDURE ES_AFECTABLE (CODIGO) RETURNING_VALUES (:AFECTABLE);
         EXECUTE PROCEDURE DIGITOS_NIVEL (:NIVEL) RETURNING_VALUES (:DIG);
         SCLASE = 0;
         SGRUPO = 0;
         SSUBGRUPO = 0;
         SCUENTA = 0;
         ARTICULO = '';
         NOMARTICULO = '';
         NOMCTAART = NOMBRE;

         IF (SIMULACIERRE = 'SI') THEN
             if (CIERRE > 0) then
               BEGIN
               IF (CODIGO = SUBSTR(CTACIERREP, 1, DIG)) then
                 saldo = saldo + CIERRE;
               END
             else
               BEGIN
               IF (CODIGO = SUBSTR(CTACIERREU, 1, DIG)) then
                 saldo = saldo + CIERRE;
               END

         if (NIVEL = 1) then
             SCLASE = SALDO;
         if (NIVEL = 2) then
             SGRUPO = SALDO;
         if (NIVEL = 3) then
             SSUBGRUPO = SALDO;
         if (NIVEL > 3) then
             SCUENTA = SALDO;
         SALDO = 0;
         if ((AFECTABLE = 'S') AND (TIPO = 'A')) then
             BEGIN
             FOR SELECT ARTI_COD, ARTI_DES FROM ARTICULO INTO :ARTICULO, :NOMARTICULO
                 DO
                 BEGIN
                 EXECUTE PROCEDURE SALDO_ARTICULO_MES(:CODIGO, :ARTICULO, :ANO, :MES, 'N') RETURNING_VALUES (:SALDO);
                 NOMCTAART = NOMARTICULO;
                 if (SALDO <> 0) then
                     SUSPEND;
                 END
             END
         ELSE
             SUSPEND;
         END
     END
END
^

SET TERM ; ^



/* 20090930 */
/* ACTUALIZAR TIENDA VIRTUAL */

CREATE TABLE CONFIGURA_TIENDAV (
    COTV_URLADMIN VARCHAR(255) NOT NULL,
    COTV_USUARIOADM VARCHAR(25),
    COTV_CLAVEADM VARCHAR(25),
    COTV_HOSTFTP VARCHAR(255),
    COTV_USUARIOFTP VARCHAR(25),
    COTV_CLAVEFTP VARCHAR(25),
    COTV_DIRADMIN VARCHAR(255),
    COTV_DIRIMAGES VARCHAR(255),
    COTV_LISTA VARCHAR(30),
    COTV_FECULT DATE);
alter table CONFIGURA_TIENDAV
add constraint PK_CONFIGURA_TIENDAV
primary key (COTV_URLADMIN);

ALTER TABLE CONFIGURA_TIENDAV
ADD COTV_DBTIENDA VARCHAR(100);


INSERT INTO CONFIGURA_TIENDAV (COTV_URLADMIN, COTV_USUARIOADM, COTV_CLAVEADM, COTV_HOSTFTP, COTV_USUARIOFTP, COTV_CLAVEFTP, COTV_DIRADMIN, COTV_DIRIMAGES, COTV_FECULT, COTV_DBTIENDA) VALUES ('204.13.155.133', 'SSILTDA_FERNANDO', 'ENTRADA', 'www.sysplus.com.co', 'ssiltda', 'entrada', '/admin', '/catalog/images', '1-JUN-2009', 'SSILTDA_OSCOM');
commit work;

ALTER TABLE GRUPO ADD GRUP_CATEGORIA T_ID;

/* 20090930b */
/* CONVIERTA SIEMPRE LAS UNIDADES A LA PRINCIPAL */
SET TERM ^ ;

CREATE OR ALTER procedure REP_AJUSTES_ARTICULO (
    DETALLE char(1),
    FECINI date,
    FECFIN date,
    ARTINI varchar(20),
    ARTFIN varchar(20),
    GRPINI varchar(2),
    GRPFIN varchar(2),
    ORDEN char(1),
    SUBEMPRESA integer)
returns (
    CODIGO varchar(15),
    NOMBRE varchar(60),
    UNIDAD varchar(8),
    CODGRUPO varchar(2),
    NOMGRUPO varchar(30),
    CODSUBG varchar(3),
    NOMSUBG varchar(30),
    CODMARC varchar(3),
    NOMMARC varchar(30),
    CODBOD varchar(2),
    STAND varchar(20),
    PREFIJO varchar(4),
    NUMERO varchar(6),
    FECHA date,
    CANTANT numeric(18,4),
    CANTNUE numeric(18,4),
    AJUSCANT numeric(18,4),
    COSTO numeric(18,2),
    AJUSTOT numeric(18,2),
    PORCENTA numeric(9,2))
AS
declare variable CODINI VARCHAR(20);
declare variable CODFIN VARCHAR(20);
declare variable DESINI VARCHAR(20);
declare variable DESFIN VARCHAR(20);
BEGIN
if (ORDEN = 'C') then
    BEGIN
    CODINI = ARTINI;
    CODFIN = ARTFIN;
    DESINI = '';
    DESFIN = 'zz';
    END
ELSE
    BEGIN
    DESINI = ARTINI;
    DESFIN = ARTFIN;
    CODINI = '';
    CODFIN = 'zz';
    END
if (DETALLE = 'S') then
    FOR SELECT A.ARTI_COD, ARTI_DES, A.arti_unidad, A.GRUP_COD, A.SUBG_COD, A.MARC_COD, j.bode_cod, j.ajus_stand,
        J.pref_pre, J.ajus_numero, J.ajus_fecha, D.ajus_exant, D.ajus_exnue*d.ajus_factor, (ajus_exnue*d.ajus_factor)-ajus_exant, D.ajde_costo
      FROM ARTICULO A, AJUSTES J, AJUSTES_DETALLE D, prefijos p
      WHERE A.arti_cod = D.arti_cod AND J.ajus_id = D.ajus_id AND J.ajus_fecha >= :fecini AND J.ajus_fecha <= :fecfin AND J.ajus_anulado = 'N' AND
      A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :GRPFIN AND ARTI_DES >= :DESINI AND ARTI_DES <= :DESFIN and
      j.pref_pre = p.pref_pre and p.tido_cod = 14 and ((:subempresa = 0) or (p.sucu_id = :subempresa))
      INTO :CODIGO, :NOMBRE, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :codbod, :stand,
        :PREFIJO, :NUMERO, :FECHA, :cantant, :cantnue, :ajuscant, :costo
      DO
        BEGIN
        NOMMARC = '';
        NOMSUBG = '';
        SELECT GRUP_NOM FROM GRUPO WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
        SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
        SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
        ajustot = ajuscant * COSTO;
        if ((cantant <> 0) AND (costo <> 0)) then
            PORCENTA = ajustot / (cantant * costo) * 100;
        else
            PORCENTA = 0;
        SUSPEND;
        END
ELSE
    FOR SELECT MAX(A.ARTI_COD), MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(A.GRUP_COD), MAX(A.SUBG_COD), MAX(A.MARC_COD),
        SUM(D.ajus_exant), SUM(D.ajus_exnue), SUM(ajus_exnue-ajus_exant), SUM((ajus_exnue-ajus_exant)*ajde_costo), SUM(AJUS_EXANT*AJDE_COSTO)
      FROM ARTICULO A, AJUSTES J, AJUSTES_DETALLE D, prefijos p
      WHERE A.arti_cod = D.arti_cod AND J.ajus_id = D.ajus_id AND J.ajus_fecha >= :fecini AND J.ajus_fecha <= :fecfin AND J.ajus_anulado = 'N' AND
      A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :GRPFIN AND ARTI_DES >= :DESINI AND ARTI_DES <= :DESFIN and
      j.pref_pre = p.pref_pre and p.tido_cod = 14 and ((:subempresa = 0) or (p.sucu_id = :subempresa))
      GROUP BY J.bode_cod,  A.arti_cod
      INTO :CODIGO, :NOMBRE, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :cantant, :cantnue, :ajuscant, :ajustot, :COSTO
      DO
        BEGIN
        NOMMARC = '';
        NOMSUBG = '';
        SELECT GRUP_NOM FROM GRUPO WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
        SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
        SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
        ajustot = ajuscant * COSTO;
        if (costo <> 0) then
            PORCENTA = ajustot / costo * 100;
        else
            PORCENTA = 0;
        SUSPEND;
        END

END
^

SET TERM ; ^


/* 20090930c */
/* orden sugerida ordenada por descripcion */

SET TERM ^ ;

CREATE OR ALTER procedure ORDEN_SUGERIDA_BOD (
    PROVEEDOR varchar(20),
    BODEGA varchar(2),
    FECHA date)
returns (
    ARTICULO varchar(15),
    CANT numeric(18,4),
    UNIDAD varchar(8),
    COSTO numeric(18,2))
AS
declare variable FACTOR NUMERIC(15,4);
declare variable DIAS INTEGER;
declare variable EXISTENCIA NUMERIC(18,4);
declare variable PROMEDIO NUMERIC(18,4);
declare variable DIA_ART VARCHAR(2) CHARACTER SET NONE;
declare variable DIASC VARCHAR(255);
declare variable SALIDAS NUMERIC(18,4);
BEGIN
EXECUTE PROCEDURE lee_configuracion ('INVENTARIO', 'EXISTENCIAS', 'PROMEDIAR LAS SALIDAS DEL INVENTARIO CON EL NUMERO DE DIAS ASIGNADO A CADA ARTICULO') returning_values (:DIA_ART);
EXECUTE PROCEDURE lee_configuracion ('INVENTARIO', 'EXISTENCIAS', 'NUMERO DE DIAS PARA PROMEDIO DE SALIDAS POR ARTICULO') returning_values (DIASC);
FOR SELECT a.ARTI_COD, PVAR_COSTO, ARTI_UNIDAD, ARTI_DIAS
    FROM proveedor_articulo p, articulo a
    WHERE TERC_NIT = :proveedor and p.arti_cod = a.arti_cod
    INTO :articulo, :costo, :unidad, :DIAS
    DO
    begin
    execute procedure saldo_inventario (:articulo, :bodega, :fecha) returning_values (:Existencia);
    EXECUTE PROCEDURE FACTOR_UNIDAD_CANT(:ARTICULO, :UNIDAD) returning_values (:FACTOR);
    if (FACTOR <> 0) then
        EXISTENCIA = EXISTENCIA / FACTOR;
    else
        EXISTENCIA = 0;
    EXECUTE PROCEDURE promedio_salidas_articulo (:ARTICULO, :FECHA, :BODEGA) returning_values (:PROMEDIO, :SALIDAS);
    if (DIA_ART = 'NO') then
        BEGIN
        DIAS = CAST(DIASC AS INTEGER);
        END
    if (DIAS is null) then
        DIAS = 0;
    PROMEDIO = DIAS * PROMEDIO;
    if (FACTOR <> 0) then
        PROMEDIO = PROMEDIO / FACTOR;
    CANT = PROMEDIO - EXISTENCIA;
    if (CANT > 0) then
        SUSPEND;
    end
END
^

SET TERM ; ^


SET TERM ^ ;

CREATE OR ALTER procedure ORDEN_SUGERIDA (
    PROVEEDOR varchar(20),
    FECHA date)
returns (
    ARTICULO varchar(15),
    BODEGA varchar(2),
    CANT numeric(18,4),
    UNIDAD varchar(8),
    COSTO numeric(18,2))
AS
declare variable FACTOR NUMERIC(15,4);
declare variable DIAS INTEGER;
declare variable EXISTENCIA NUMERIC(18,4);
declare variable PROMEDIO NUMERIC(18,4);
declare variable AGENCIA INTEGER;
declare variable DIA_ART VARCHAR(2) CHARACTER SET NONE;
declare variable DIASC VARCHAR(255);
declare variable SALIDAS NUMERIC(18,4);
BEGIN
FOR SELECT a.ARTI_COD, PVAR_COSTO, ARTI_UNIDAD, ARTI_DIAS FROM proveedor_articulo p, articulo a
    WHERE p.arti_cod = a.arti_cod and TERC_NIT = :proveedor order by a.arti_des
    INTO :articulo, :costo, :unidad, :DIAS
  DO BEGIN
  for select bode_cod, SUCU_ID from bodega into :bodega, :agencia
    do
    begin
    execute procedure saldo_inventario (:articulo, :bodega, :fecha) returning_values (:Existencia);
    EXECUTE PROCEDURE FACTOR_UNIDAD_CANT(:ARTICULO, :UNIDAD) returning_values (:FACTOR);
    if (FACTOR <> 0) then
        EXISTENCIA = EXISTENCIA / FACTOR;
    else
        EXISTENCIA = 0;
    EXECUTE PROCEDURE promedio_salidas_articulo (:ARTICULO, :FECHA, :BODEGA) returning_values (:PROMEDIO, :SALIDAS);
    EXECUTE PROCEDURE lee_configuracion ('INVENTARIO', 'EXISTENCIAS', 'PROMEDIAR LAS SALIDAS DEL INVENTARIO CON EL NUMERO DE DIAS ASIGNADO A CADA ARTICULO') returning_values (:DIA_ART);
    if (DIA_ART = 'NO') then
        BEGIN
        EXECUTE PROCEDURE lee_configuracion ('INVENTARIO', 'EXISTENCIAS', 'NUMERO DE DIAS PARA PROMEDIO DE SALIDAS POR ARTICULO') returning_values (DIASC);
        DIAS = CAST(DIASC AS INTEGER);
        END
    if (DIAS is null) then
        DIAS = 0;
    PROMEDIO = DIAS * PROMEDIO;
    if (FACTOR <> 0) then
        PROMEDIO = PROMEDIO / FACTOR;
    CANT = PROMEDIO - EXISTENCIA;
    if (CANT > 0) then
        SUSPEND;
    end
  END
END
^

SET TERM ; ^


/* 20090930d */
SET TERM ^ ;

CREATE OR ALTER procedure RECALCULA_PUNTOS_CLIENTE (
    FECINI date,
    FECFIN date)
returns (
    NIT varchar(20),
    ID integer,
    FECHA date,
    PUNTOS numeric(18,2))
AS
begin
FOR SELECT FACT_ID, TERC_NIT, FACT_FECHA FROM FACTURAS
    WHERE FACT_FECHA >= :FECINI AND FACT_FECHA <= :fecfin AND FACT_ANULADO = 'N'
    ORDER BY FACT_ID
    INTO :ID, :nit, :fecha
  DO
  BEGIN
  EXECUTE PROCEDURE acumula_puntos_cliente (31, :id, :nit, :fecha) returning_values (:PUNTOS);
  SUSPEND;
  END
end
^

SET TERM ; ^


/* 20091001 */
/* COSTOS INCLUYENDO EN IMPOCONSUMO SI IMPUESTOS INCLUIDOS Y CONF. ICO INCLUIDFO EN BASE = SI */

SET TERM ^ ;

CREATE OR ALTER TRIGGER ENTRADAS_DETALLE_AI FOR ENTRADAS_DETALLE
ACTIVE AFTER INSERT POSITION 0
AS
declare variable fec date;
declare variable CONC VARCHAR(60);
declare variable factor numeric(18,4);
declare variable Pref varchar(4);
declare variable Num varchar(6);
declare variable Nit varchar(20);
declare variable IVAINC CHAR(2);
declare variable ICOINC CHAR(2);
declare variable COSTO NUMERIC(18,2);
BEGIN
  if ((NEW.entr_id <> 0) and (new.ende_anulado = 'N')) then
    BEGIN
    select entr_fecha, entr_conc, pref_pre, entr_numero, terc_nit, entr_imptos
        from entradas where entr_id = new.entr_id
        into :fec, :conc, :Pref, :Num, :Nit, :ivainc;
    execute procedure factor_unidad_cant(new.arti_cod, new.ende_unidad) returning_values(factor);
    COSTO = ((new.ende_costo - NEW.ende_dtomonto) / :factor);
    if (IVAINC = 'S') then
        BEGIN
        COSTO = COSTO / (1 + NEW.ende_ivaporc/100);
        EXECUTE PROCEDURE lee_configuracion ('FACTURACION', 'ARTICULOS', 'IMPOCONSUMO INCLUIDO EN EL PRECIO BASE DE VENTA ANTES DE IVA') returning_values(:icoinc);
        if (icoinc = 'SI') then
            COSTO = COSTO - (NEW.ende_consumo/(NEW.ende_cant * new.ende_factor));
        END
    INSERT INTO MOVIMIENTO_ARTICULO
      (ARTI_COD, MVAR_CONS, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM, TERC_NIT)
      VALUES(NEW.ARTI_COD, GEN_ID(ID_MOVARTI,1), NEW.BODE_COD, :FEC, 11, NEW.entr_id,
      :CONC, :factor * new.ende_cant, :costo, 'S', new.ende_lote, :Pref, :Num, new.ende_item, :Nit);
    /* RECORRA LAS LISTAS DE PRECIOS Y CAMBIE EL PRECIO */
    EXECUTE PROCEDURE CALCULA_PRECIOS(NEW.ARTI_COD, :FEC);
    /* ACTUALICE EL STAND */
    if (new.ende_stand is not null) then
      if (exists(select stand_cod from stands where arti_cod = new.arti_cod and stand_bodega = new.bode_cod)) then
        UPDATE stands set stand_cod = new.ende_stand where arti_cod = new.arti_cod and stand_bodega = new.bode_cod;
      else
        INSERT INTO stands (ARTI_COD, STAND_BODEGA, STAND_COD) VALUES (NEW.arti_cod, NEW.bode_cod, NEW.ende_stand);
    END
END
^

SET TERM ; ^


SET TERM ^ ;

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

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

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

    /* ACTUALICE EL PENDIENTE  */
    if (CONSOLIDA <> 0) then
        BEGIN
        UPDATE consolidado_faltantes SET COFA_OK = 'S' WHERE COFA_ID = :consolida AND COFA_ITEM = NEW.FCDE_ITEM AND ARTI_COD = NEW.arti_cod;
        EXECUTE procedure LEE_CONFIGURACION ('COMPRAS','DOCUMENTOS','SUMAR CANTIDADES PENDIENTES AL CONSOLIDAR DOCUMENTOS') returning_values (CONSO);
        /* IGNORE LA CONSOLIDACION SI SE VALIDAN CODIGOS DE LA ORDEN */
        SELECT MIN(CEFA_TIPOORI) FROM consolide_faltantes WHERE CEFA_ID = :CONSOLIDA INTO :NUMROWS;
        if (NUMROWS = 23) then
            BEGIN
            EXECUTE PROCEDURE LEE_CONFIGURACION('COMPRAS', 'FACTURAS', 'VERIFICAR CODIGOS DE LA ORDEN') returning_values (MENORV);
            if (MENORV = 'SI') then
                CONSO = 'NO';
            END
        SELECT COUNT(CEFA_ITEM) FROM consolide_faltantes WHERE CEFA_ID = :CONSOLIDA INTO :NUMROWS;
        if ((CONSO = 'SI') AND (NUMROWS > 1)) then
            UPDATE consolidado_faltantes SET COFA_IDDES = NEW.faco_id, COFA_OK = 'S' WHERE COFA_ID = :consolida;
        else
            BEGIN
            /* BUSQUE EL CONSOLIDADO EN EL MISMO ITEM Y SI ES DIFERENTE ACTUALICELO */
            select COFA_CANT * COFA_FACTOR FROM consolidado_faltantes WHERE COFA_ID = :consolida AND COFA_ITEM = NEW.FCDE_ITEM AND ARTI_COD = NEW.arti_cod INTO :CANTREL;
            if (NEW.FCDE_CANT * NEW.FCDE_FACTOR < CANTREL) then
                UPDATE consolidado_faltantes SET COFA_IDDES = NEW.faco_id, COFA_CANT = NEW.FCDE_CANT, COFA_FACTOR = NEW.FCDE_FACTOR
                    WHERE COFA_ID = :consolida AND COFA_ITEM = NEW.FCDE_ITEM AND ARTI_COD = NEW.arti_cod;
            END
        END
    /* ACTUALICE EL STAND */
    if (new.fcde_stand is not null) then
      if (exists(select stand_cod from stands where arti_cod = new.arti_cod and stand_bodega = new.bode_cod)) then
        UPDATE stands set stand_cod = new.fcde_stand where arti_cod = new.arti_cod and stand_bodega = new.bode_cod;
      else
        INSERT INTO stands (ARTI_COD, STAND_BODEGA, STAND_COD) VALUES (NEW.arti_cod, NEW.bode_cod, NEW.fcde_stand);
    END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER REMISION_PROVEEDOR_DET_AI FOR REMISION_PROVEEDOR_DET
ACTIVE AFTER INSERT POSITION 0
AS
declare variable fec date;
declare variable CONC VARCHAR(60);
declare variable factor numeric(18,4);
declare variable Pref varchar(4);
declare variable Num varchar(6);
declare variable EXISTE CHAR(1);
declare variable NIT VARCHAR(20);
declare variable NUMPROV VARCHAR(20);
declare variable Tipo Integer;
declare variable idfact integer;
declare variable numrows integer;
declare variable IVAINC CHAR(2);
declare variable ICOINC CHAR(2);
declare variable COSTO NUMERIC(18,2);
declare variable CANTREL NUMERIC(18,4);
declare variable NUMPED VARCHAR(30);
declare variable CONSO CHAR(2);
declare variable CONSOLIDA INTEGER;
declare variable DTOPIE NUMERIC(18,2);
declare variable ADICIONAL NUMERIC(18,2);
declare variable TOTAL NUMERIC(18,2);
declare variable IVAMONTO NUMERIC(18,2);
declare variable EXTRA NUMERIC(18,2);
declare variable FACT NUMERIC(18,4);
declare variable MENORV CHAR(2);
declare variable CEROS CHAR(2);
declare variable ACTREM CHAR(2);
BEGIN
  if ((NEW.repr_id <> 0) and (new.rpvd_anulado = 'N')) then
    BEGIN
    select max(rprd_tiporel), max(rprd_idrel) from remision_proveedor_docrela
        where repr_id = new.repr_id into :Tipo, :idfact;
    if (Tipo is null) then
        Tipo = 0;
    /* si se hizo con base en una factura que afecto el inventario no afecte inventario */
    numrows = 0;
    if (Tipo = 21) Then
        select count(*) from movimiento_articulo where mvar_tipodoc = 21 and mvar_idref = :idfact into :numrows;
    if (numrows is null) then
        numrows = 0;
    if (numrows = 0) then
        begin
        select repr_fecha, pref_pre, repr_numero, REPR_IMPTOS, terc_nit, REPR_NUMPROV, REPR_ORDEN, REPR_CONSOLIDA, repr_dtomonto, repr_adicional, repr_total, repr_ivamonto, repr_extra
            from remision_proveedor where repr_id = new.repr_id
            into :fec, :Pref, :Num, :IVAINC, :NIT, :NUMPROV, :numped, :CONSOLIDA, :dtopie, :adicional, :total, :ivamonto, :extra;
        execute procedure factor_unidad_cant(new.arti_cod, new.rpvd_unidad) returning_values(factor);
        CONC = 'REMISION PROVEEDOR No.' || PREF || NUM || '-' || NUMPROV;
        if (numped <> '') then
            conc = conc || '-ORDEN ' || NUMPED;
        COSTO = ((new.rpvd_prunit - NEW.rpvd_dtomonto) / :factor);
        if (IVAINC = 'S') then
            BEGIN
            COSTO = COSTO / (1 + NEW.rpvd_ivaporc/100);
            EXECUTE PROCEDURE lee_configuracion ('FACTURACION', 'ARTICULOS', 'IMPOCONSUMO INCLUIDO EN EL PRECIO BASE DE VENTA ANTES DE IVA') returning_values(:icoinc);
            if (icoinc = 'SI') then
                COSTO = COSTO - (NEW.rpvd_consumo/(NEW.rpvd_cant * new.rpvd_factor));
            END
        EXECUTE PROCEDURE lee_configuracion('COMPRAS','FACTURAS','DESCUENTO Y VALOR ADICIONAL DEL DOCUMENTO COMO MENOR VALOR DEL COSTO') returning_values (:MENORV);
        if (MENORV = 'SI') then
            BEGIN
            FACT = (TOTAL - EXTRA - IVAMONTO);
            if ((FACT - ADICIONAL + DTOPIE) <> 0) then
                FACT = FACT / (FACT - ADICIONAL + DTOPIE);
            ELSE
                FACT = 1;
            COSTO = COSTO * FACT;
            END
        if (COSTO = 0) then
            BEGIN
            EXECUTE PROCEDURE lee_configuracion('COMPRAS', 'REMISIONES', 'PERMITIR CEROS EN COSTOS DE MERCANCIA') returning_values (:ceros);
            EXECUTE PROCEDURE lee_configuracion('COMPRAS', 'FACTURAS', 'ACTUALIZAR COSTOS DE LA REMISION RELACIONADA AL GRABAR LA FACTURA') returning_values (:ACTREM);
            if ((ACTREM = 'SI') and (CEROS = 'NO')) then
                execute procedure costo_promedio(NEW.arti_cod, :fec) returning_values (:COSTO);
            END
        INSERT INTO MOVIMIENTO_ARTICULO
          (ARTI_COD, MVAR_CONS, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM, TERC_NIT)
          VALUES(NEW.ARTI_COD, GEN_ID(ID_MOVARTI,1), NEW.BODE_COD, :FEC, 22, NEW.repr_id,
          :CONC, :factor * new.rpvd_cant, :COSTO, 'S', new.rpvd_lote, :Pref, :Num, new.rpvd_item, :Nit);

        /* RECORRA LAS LISTAS DE PRECIOS Y CAMBIE EL PRECIO */
        EXECUTE PROCEDURE CALCULA_PRECIOS(NEW.ARTI_COD, :FEC);

        if (COSTO > 0 ) then
         BEGIN
          /* GRABE PROV X ARTICULO */
          EXISTE = 'N';
          SELECT 'S' FROM PROVEEDOR_ARTICULO WHERE TERC_NIT = :NIT AND ARTI_COD = NEW.ARTI_COD INTO :EXISTE;
          if (EXISTE = 'S') then
            UPDATE PROVEEDOR_ARTICULO 
                SET PVAR_FECHA = :FEC, PVAR_COSTO = :COSTO, PVAR_COD = NEW.rpvd_codprov
                WHERE TERC_NIT = :NIT AND ARTI_COD = NEW.ARTI_COD;
          ELSE
            INSERT INTO PROVEEDOR_ARTICULO (TERC_NIT, ARTI_COD, PVAR_COSTO, PVAR_FECHA, PVAR_COD,PVAR_DES)
                VALUES (:NIT, NEW.ARTI_COD, :COSTO, :FEC, NEW.rpvd_codprov,NEW.rpvd_desc);
         END
        end

    /* ACTUALICE EL PENDIENTE  */
    if (CONSOLIDA <> 0) then
        BEGIN
        EXECUTE PROCEDURE LEE_CONFIGURACION ('COMPRAS','DOCUMENTOS','SUMAR CANTIDADES PENDIENTES AL CONSOLIDAR DOCUMENTOS') returning_values (CONSO);
        SELECT MIN(CEFA_TIPOORI) FROM consolide_faltantes WHERE CEFA_ID = :CONSOLIDA INTO :NUMROWS;
        if (NUMROWS = 23) then
            BEGIN
            EXECUTE PROCEDURE LEE_CONFIGURACION('COMPRAS', 'REMISIONES', 'VERIFICAR CODIGOS DE LA ORDEN') returning_values (MENORV);
            if (MENORV = 'SI') then
                CONSO = 'NO';
            END
        SELECT COUNT(CEFA_ITEM) FROM consolide_faltantes WHERE CEFA_ID = :CONSOLIDA INTO :NUMROWS;
        if ((CONSO = 'SI') AND (NUMROWS > 1)) then
            UPDATE consolidado_faltantes SET COFA_OK = 'S' WHERE COFA_ID = :consolida;
        ELSE
            BEGIN
            /* BUSQUE EL CONSOLIDADO EN EL MISMO ITEM Y SI ES DIFERENTE ACTUALICELO */
            select COFA_CANT * COFA_FACTOR FROM consolidado_faltantes WHERE COFA_ID = :consolida AND COFA_ITEM = NEW.RPVD_ITEM AND ARTI_COD = NEW.arti_cod INTO :CANTREL;
            if (NEW.RPVD_CANT * NEW.RPVD_FACTOR < CANTREL) then
                UPDATE consolidado_faltantes SET COFA_IDDES = NEW.repr_id, COFA_CANT = NEW.RPVD_CANT, COFA_FACTOR = NEW.RPVD_FACTOR
                    WHERE COFA_ID = :consolida AND COFA_ITEM = NEW.RPVD_ITEM AND ARTI_COD = NEW.arti_cod;
            ELSE
                UPDATE consolidado_faltantes SET COFA_IDDES = NEW.repr_id, COFA_OK = 'S' WHERE COFA_ID = :consolida AND COFA_ITEM = NEW.RPVD_ITEM AND ARTI_COD = NEW.arti_cod;
            END
        END
    /* ACTUALICE EL STAND */
    if (new.rpvd_stand is not null) then
      if (exists(select stand_cod from stands where arti_cod = new.arti_cod and stand_bodega = new.bode_cod)) then
        UPDATE stands set stand_cod = new.rpvd_stand where arti_cod = new.arti_cod and stand_bodega = new.bode_cod;
      else
        INSERT INTO stands (ARTI_COD, STAND_BODEGA, STAND_COD) VALUES (NEW.arti_cod, NEW.bode_cod, NEW.rpvd_stand);
    END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER ENTRADAS_DETALLE_AU FOR ENTRADAS_DETALLE
ACTIVE AFTER UPDATE POSITION 0
as
declare variable fec date;
declare variable CONC VARCHAR(60);
declare variable Pref varchar(4);
declare variable Num varchar(6);
declare variable Nit varchar(20);
declare variable factor numeric(18,4);
declare variable IVAINC CHAR(2);
declare variable ICOINC CHAR(2);
declare variable COSTO NUMERIC(18,2);
BEGIN
if ((OLD.entr_id <> 0) AND (OLD.ende_anulado = 'N')) then
    DELETE FROM MOVIMIENTO_ARTICULO WHERE (mvar_tipodoc = 11) and (mvar_idref = new.entr_id) and (mvar_item = old.ende_item);
if ((NEW.entr_id <> 0) AND (NEW.ende_anulado = 'N')) then
    begin
    select entr_fecha, entr_conc, pref_pre, entr_numero, terc_nit, entr_imptos
        from entradas where entr_id = new.entr_id
        into :fec, :conc, :Pref, :Num, :Nit, :ivainc;
    execute procedure factor_unidad_cant(new.arti_cod, new.ende_unidad) returning_values(factor);
    COSTO = ((new.ende_costo - NEW.ende_dtomonto) / :factor);
    if (IVAINC = 'S') then
        BEGIN
        COSTO = COSTO / (1 + NEW.ende_ivaporc/100);
        EXECUTE PROCEDURE lee_configuracion ('FACTURACION', 'ARTICULOS', 'IMPOCONSUMO INCLUIDO EN EL PRECIO BASE DE VENTA ANTES DE IVA') returning_values(:icoinc);
        if (icoinc = 'SI') then
            COSTO = COSTO - (NEW.ende_consumo/(NEW.ende_cant * new.ende_factor));
        END
    INSERT INTO MOVIMIENTO_ARTICULO
        (ARTI_COD, MVAR_CONS, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM, TERC_NIT)
        VALUES(NEW.ARTI_COD, GEN_ID(ID_MOVARTI,1), NEW.BODE_COD, :FEC, 11, NEW.entr_id,
        :CONC, :factor * new.ende_cant, :COSTO, 'S', new.ende_lote, :Pref, :Num, new.ende_item, :Nit);
    /* RECORRA LAS LISTAS DE PRECIOS Y CAMBIE EL PRECIO */
    EXECUTE PROCEDURE CALCULA_PRECIOS(NEW.ARTI_COD, :FEC);
    /* ACTUALICE EL STAND */
    if (new.ende_stand is not null) then
      if (exists(select stand_cod from stands where arti_cod = new.arti_cod and stand_bodega = new.bode_cod)) then
        UPDATE stands set stand_cod = new.ende_stand where arti_cod = new.arti_cod and stand_bodega = new.bode_cod;
      else
        INSERT INTO stands (ARTI_COD, STAND_BODEGA, STAND_COD) VALUES (NEW.arti_cod, NEW.bode_cod, NEW.ende_stand);
    END
END
^

SET TERM ; ^

SET TERM ^ ;

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

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

        if (CONSOLIDA <> 0) then
            begin
            UPDATE consolidado_faltantes SET COFA_OK = 'S' WHERE COFA_ID = :consolida AND COFA_ITEM = NEW.FCDE_ITEM AND ARTI_COD = NEW.arti_cod;
            EXECUTE procedure LEE_CONFIGURACION ('COMPRAS','DOCUMENTOS','SUMAR CANTIDADES PENDIENTES AL CONSOLIDAR DOCUMENTOS') returning_values (CONSO);
            /* IGNORE LA CONSOLIDACION SI SE VALIDAN CODIGOS DE LA ORDEN */
            SELECT MIN(CEFA_TIPOORI) FROM consolide_faltantes WHERE CEFA_ID = :CONSOLIDA INTO :NUMROWS;
            if (NUMROWS = 23) then
                BEGIN
                EXECUTE PROCEDURE LEE_CONFIGURACION('COMPRAS', 'FACTURAS', 'VERIFICAR CODIGOS DE LA ORDEN') returning_values (MENORV);
                if (MENORV = 'SI') then
                    CONSO = 'NO';
                END
            SELECT COUNT(CEFA_ITEM) FROM consolide_faltantes WHERE CEFA_ID = :CONSOLIDA INTO :NUMROWS;
            if ((CONSO = 'SI') AND (NUMROWS > 1)) then
                UPDATE consolidado_faltantes SET COFA_IDDES = NEW.faco_id, COFA_OK = 'S' WHERE COFA_ID = :consolida;
            else
                BEGIN
                /* BUSQUE EL CONSOLIDADO EN EL MISMO ITEM Y SI ES DIFERENTE ACTUALICELO */
                select COFA_CANT * COFA_FACTOR FROM consolidado_faltantes WHERE COFA_ID = :consolida AND COFA_ITEM = NEW.FCDE_ITEM AND ARTI_COD = NEW.arti_cod INTO :CANTREL;
                if (NEW.FCDE_CANT * NEW.FCDE_FACTOR < CANTREL) then
                    UPDATE consolidado_faltantes SET COFA_IDDES = NEW.faco_id, COFA_CANT = NEW.FCDE_CANT, COFA_FACTOR = NEW.FCDE_FACTOR
                        WHERE COFA_ID = :consolida AND COFA_ITEM = NEW.FCDE_ITEM AND ARTI_COD = NEW.arti_cod;
                END
            end
        /* ACTUALICE EL STAND */
        if (new.fcde_stand is not null) then
          if (exists(select stand_cod from stands where arti_cod = new.arti_cod and stand_bodega = new.bode_cod)) then
            UPDATE stands set stand_cod = new.fcde_stand where arti_cod = new.arti_cod and stand_bodega = new.bode_cod;
          else
            INSERT INTO stands (ARTI_COD, STAND_BODEGA, STAND_COD) VALUES (NEW.arti_cod, NEW.bode_cod, NEW.fcde_stand);
        END
    end
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER REMISION_PROVEEDOR_DET_AU FOR REMISION_PROVEEDOR_DET
ACTIVE AFTER UPDATE POSITION 0
AS
declare variable fec date;
declare variable CONC VARCHAR(60);
declare variable Pref varchar(4);
declare variable Num varchar(6);
declare variable factor numeric(18,4);
declare variable EXISTE CHAR(1);
declare variable NIT VARCHAR(20);
declare variable NUMPROV VARCHAR(20);
declare variable Tipo integer;
declare variable idfact integer;
declare variable numrows integer;
declare variable IVAINC CHAR(2);
declare variable ICOINC CHAR(2);
declare variable COSTO NUMERIC(18,2);
declare variable CANTREL NUMERIC(18,4);
declare variable NUMPED VARCHAR(30);
declare variable CONSO CHAR(2);
declare variable CONSOLIDA INTEGER;
declare variable DTOPIE NUMERIC(18,2);
declare variable ADICIONAL NUMERIC(18,2);
declare variable TOTAL NUMERIC(18,2);
declare variable IVAMONTO NUMERIC(18,2);
declare variable EXTRA NUMERIC(18,2);
declare variable FACT NUMERIC(18,4);
declare variable MENORV CHAR(2);
declare variable CEROS CHAR(2);
declare variable ACTREM CHAR(2);
BEGIN
if ((OLD.repr_id <> 0) AND (OLD.rpvd_anulado = 'N')) then
    begin
    DELETE FROM MOVIMIENTO_ARTICULO WHERE (mvar_tipodoc = 22) and (mvar_idref = new.repr_id) and (mvar_item = old.rpvd_item);
    select REPR_CONSOLIDA from remision_proveedor where repr_id = old.repr_id into :CONSOLIDA;
    if (CONSOLIDA <> 0) then
        begin
        EXECUTE PROCEDURE LEE_CONFIGURACION ('COMPRAS','DOCUMENTOS','SUMAR CANTIDADES PENDIENTES AL CONSOLIDAR DOCUMENTOS') returning_values (CONSO);
        SELECT COUNT(CEFA_ITEM) FROM consolide_faltantes WHERE CEFA_ID = :CONSOLIDA INTO :NUMROWS;
        if ((NUMROWS = 1) OR (CONSO = 'NO')) then
            UPDATE consolidado_faltantes SET COFA_OK = 'N' WHERE COFA_ID = :consolida AND COFA_ITEM = old.RPVD_ITEM AND ARTI_COD = old.arti_cod;
        else
            UPDATE consolidado_faltantes SET COFA_OK = 'N' WHERE COFA_ID = :consolida;
        END
    end
/* Registre el nuevo */
if ((new.repr_id <> 0) AND (new.rpvd_anulado = 'N')) then
    begin
    select repr_fecha, pref_pre, repr_numero, repr_imptos, terc_nit, REPR_NUMPROV, REPR_ORDEN, REPR_CONSOLIDA, repr_dtomonto, repr_adicional, repr_total, repr_ivamonto, repr_extra
        from remision_proveedor where repr_id = new.repr_id
        into :fec, :Pref, :Num, :IVAINC, :NIT, :NUMPROV, :numped, :CONSOLIDA, :dtopie, :adicional, :total, :ivamonto, :extra;
    CONC = 'REMISION PROVEEDOR No.' || PREF || NUM || '-' || NUMPROV;
    if (numped <> '') then
        conc = conc || '-ORDEN ' || NUMPED;
    SELECT MAX(CEFA_TIPOORI) FROM consolide_faltantes WHERE CEFA_ID = :CONSOLIDA INTO :TIPO;
    if (Tipo is null) then
        Tipo = 0;
    select FACO_ID from FACTURAS_COMPRA WHERE FACO_CONSOLIDA = :consolida INTO :IDFACT;
    if (Idfact is null) then
        Idfact = 0;
    /* si se hizo con base en una factura que afecto el inventario no afecte inventario */
    numrows = 0;
    if (Tipo = 21) Then
        select count(*) from movimiento_articulo where mvar_tipodoc = 21 and mvar_idref = :idfact into :numrows;
    if (numrows is null) then
        numrows = 0;
    if (numrows = 0) then
        begin
        execute procedure factor_unidad_cant(new.arti_cod, new.rpvd_unidad) returning_values(factor);
        COSTO = ((new.rpvd_prunit - NEW.rpvd_dtomonto) / :factor);
        if (IVAINC = 'S') then
            BEGIN
            COSTO = COSTO / (1 + NEW.rpvd_ivaporc/100);
            EXECUTE PROCEDURE lee_configuracion ('FACTURACION', 'ARTICULOS', 'IMPOCONSUMO INCLUIDO EN EL PRECIO BASE DE VENTA ANTES DE IVA') returning_values(:icoinc);
            if (icoinc = 'SI') then
                COSTO = COSTO - (NEW.rpvd_consumo/(NEW.rpvd_cant * new.rpvd_factor));
            END
        EXECUTE PROCEDURE lee_configuracion('COMPRAS','FACTURAS','DESCUENTO Y VALOR ADICIONAL DEL DOCUMENTO COMO MENOR VALOR DEL COSTO') returning_values (:MENORV);
        if (MENORV = 'SI') then
            BEGIN
            FACT = (TOTAL - EXTRA - IVAMONTO);
            if ((FACT - ADICIONAL + DTOPIE) <> 0) then
                FACT = FACT / (FACT - ADICIONAL + DTOPIE);
            ELSE
                FACT = 1;
            COSTO = COSTO * FACT;
            END
        if (COSTO = 0) then
            BEGIN
            EXECUTE PROCEDURE lee_configuracion('COMPRAS', 'REMISIONES', 'PERMITIR CEROS EN COSTOS DE MERCANCIA') returning_values (:ceros);
            EXECUTE PROCEDURE lee_configuracion('COMPRAS', 'FACTURAS', 'ACTUALIZAR COSTOS DE LA REMISION RELACIONADA AL GRABAR LA FACTURA') returning_values (:ACTREM);
            if ((ACTREM = 'SI') and (CEROS = 'NO')) then
                execute procedure costo_promedio(NEW.arti_cod, :fec) returning_values (:COSTO);
            END
        INSERT INTO MOVIMIENTO_ARTICULO
            (ARTI_COD, MVAR_CONS, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM, TERC_NIT)
            VALUES(NEW.ARTI_COD, GEN_ID(ID_MOVARTI,1), NEW.BODE_COD, :FEC, 22, NEW.repr_id,
            :CONC, :factor * new.rpvd_cant, :COSTO, 'S', new.rpvd_lote, :Pref, :Num, new.rpvd_item, :Nit);
            
        /* RECORRA LAS LISTAS DE PRECIOS Y CAMBIE EL PRECIO */
        EXECUTE PROCEDURE CALCULA_PRECIOS(NEW.ARTI_COD, :FEC);
          
        if (COSTO > 0 ) then
         BEGIN
          /* GRABE PROV X ARTICULO */
          EXISTE = 'N';
          SELECT 'S' FROM PROVEEDOR_ARTICULO WHERE TERC_NIT = :NIT AND ARTI_COD = NEW.ARTI_COD INTO :EXISTE;
          if (EXISTE = 'S') then
            UPDATE PROVEEDOR_ARTICULO
                SET PVAR_FECHA = :FEC, PVAR_COSTO = :COSTO, PVAR_COD = NEW.rpvd_codprov
                WHERE TERC_NIT = :NIT AND ARTI_COD = NEW.ARTI_COD;
          ELSE
            INSERT INTO PROVEEDOR_ARTICULO (TERC_NIT, ARTI_COD, PVAR_COSTO, PVAR_FECHA, PVAR_COD,PVAR_DES)
                VALUES (:NIT, NEW.ARTI_COD, :COSTO, :FEC, NEW.rpvd_codprov,NEW.rpvd_desc);
         END
        end
    if (CONSOLIDA <> 0) then
        BEGIN
        EXECUTE PROCEDURE LEE_CONFIGURACION ('COMPRAS','DOCUMENTOS','SUMAR CANTIDADES PENDIENTES AL CONSOLIDAR DOCUMENTOS') returning_values (CONSO);
        /* IGNORE LA CONSOLIDACION SI SE VALIDAN CODIGOS DE LA ORDEN */
        SELECT MIN(CEFA_TIPOORI) FROM consolide_faltantes WHERE CEFA_ID = :CONSOLIDA INTO :NUMROWS;
        if (NUMROWS = 23) then
            BEGIN
            EXECUTE PROCEDURE LEE_CONFIGURACION('COMPRAS', 'REMISIONES', 'VERIFICAR CODIGOS DE LA ORDEN') returning_values (MENORV);
            if (MENORV = 'SI') then
                CONSO = 'NO';
            END
        SELECT COUNT(CEFA_ITEM) FROM consolide_faltantes WHERE CEFA_ID = :CONSOLIDA INTO :NUMROWS;
        if ((CONSO = 'SI') AND (NUMROWS > 1)) then
            UPDATE consolidado_faltantes SET COFA_IDDES = NEW.repr_id, COFA_OK = 'S' WHERE COFA_ID = :consolida;
        ELSE
            BEGIN
            /* BUSQUE EL CONSOLIDADO EN EL MISMO ITEM Y SI ES DIFERENTE ACTUALICELO */
            select COFA_CANT * COFA_FACTOR FROM consolidado_faltantes WHERE COFA_ID = :consolida AND COFA_ITEM = NEW.RPVD_ITEM AND ARTI_COD = NEW.arti_cod INTO :CANTREL;
            if (NEW.RPVD_CANT * NEW.RPVD_FACTOR < CANTREL) then
                UPDATE consolidado_faltantes SET COFA_IDDES = NEW.repr_id, COFA_CANT = NEW.RPVD_CANT, COFA_FACTOR = NEW.RPVD_FACTOR
                    WHERE COFA_ID = :consolida AND COFA_ITEM = NEW.RPVD_ITEM AND ARTI_COD = NEW.arti_cod;
            else
                UPDATE consolidado_faltantes SET COFA_IDDES = NEW.repr_id, COFA_OK = 'S' WHERE COFA_ID = :consolida AND COFA_ITEM = NEW.RPVD_ITEM AND ARTI_COD = NEW.arti_cod;
            END
        END
    /* ACTUALICE EL STAND */
    if (new.rpvd_stand is not null) then
      if (exists(select stand_cod from stands where arti_cod = new.arti_cod and stand_bodega = new.bode_cod)) then
        UPDATE stands set stand_cod = new.rpvd_stand where arti_cod = new.arti_cod and stand_bodega = new.bode_cod;
      else
        INSERT INTO stands (ARTI_COD, STAND_BODEGA, STAND_COD) VALUES (NEW.arti_cod, NEW.bode_cod, NEW.rpvd_stand);
    END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER PRECIOS_ARTICULO_BU FOR PRECIOS_ARTICULO
ACTIVE BEFORE UPDATE POSITION 0
as
declare variable UNIDAD VARCHAR(8);
declare variable UOR VARCHAR(20);
declare variable DIG INTEGER;
declare variable IVAINC CHAR(1);
declare variable TARIVA NUMERIC(9,4);
declare variable CAMBIO CHAR(7);
declare variable BASE VARCHAR(10);
declare variable REP CHAR(2);
declare variable COSTOP NUMERIC(18, 2);
declare variable COSTOU NUMERIC(18, 2);
declare variable COSTO NUMERIC(18, 2);
declare variable CONSUMO NUMERIC(18, 2);
declare variable LISTA INTEGER;
declare variable PRECIO NUMERIC(18, 4);
declare variable IVAINC1 CHAR(1);
declare variable ICOINC CHAR(2);
begin
if (NEW.prar_auto = 'S') then
    BEGIN
    EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION','ARTICULOS','CAMBIO DE PRECIOS AUTOMATICO AL CAMBIAR COSTO O PRECIO') returning_values (CAMBIO);
    EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION', 'ARTICULOS', 'SUGERIR PRECIOS CON PORCENTAJE DE MARGEN O UTILIDAD') RETURNING_VALUES (:UOR);
    EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION', 'ARTICULOS', 'REDONDEO AL MULTIPLO DE DIEZ EN PRECIOS') RETURNING_VALUES (:DIG);
    EXECUTE PROCEDURE LEE_CONFIGURACION('INVENTARIO', 'ARTICULOS', 'REPLICAR CAMBIOS EN ARTICULOS') RETURNING_VALUES (:REP);
    SELECT LIPR_MODIF FROM LISTA_PRECIOS L
        WHERE LIPR_COD = NEW.LIPR_COD INTO :IVAINC;
    
    if (CAMBIO <> 'PRECIO') then
      begin
      if (REP <> 'SI') then
        BEGIN
        SELECT ARTI_UNIDAD, TAIV_PORC, ARTI_CONSUMO FROM ARTICULO A, TARIFA_IVA T
            WHERE A.TAIV_COD = T.TAIV_COD AND ARTI_COD = NEW.arti_cod INTO :UNIDAD, :TARIVA, :CONSUMO;
        EXECUTE PROCEDURE lee_configuracion('FACTURACION','ARTICULOS','COSTO BASE PARA CALCULO DE PRECIOS DE VENTA AUTOMATICOS') returning_values (:BASE);
        EXECUTE PROCEDURE costo_promedio_y_ultimo (NEW.arti_cod, 'NOW') RETURNING_VALUES(:COSTOP, :COSTOU);
        if (base = 'ULTIMO') then
            COSTO = COSTOU;
        ELSE
            BEGIN
            COSTO = COSTOP;
            if (base = 'MAYOR') then
                if (COSTOP < COSTOU) then
                    COSTO = COSTOU;
            END
        if (IVAINC = 'S') then
            BEGIN
            COSTO = COSTO * (1 + TARIVA/100);
            EXECUTE PROCEDURE lee_configuracion ('FACTURACION', 'ARTICULOS', 'IMPOCONSUMO INCLUIDO EN EL PRECIO BASE DE VENTA ANTES DE IVA') returning_values(:icoinc);
            if (icoinc = 'SI') then
                COSTO = COSTO + consumo;
            END
            
        if (UOR = 'UTILIDAD') then
            BEGIN
            COSTO = COSTO * (1 + NEW.prar_util/100);
            EXECUTE PROCEDURE REDONDEE (COSTO, DIG) returning_values (COSTO);
            new.prar_fijo = :COSTO;
            END
        ELSE
            BEGIN
            COSTO = COSTO / (1 - NEW.prar_margen/100);
            EXECUTE PROCEDURE REDONDEE (COSTO, DIG) returning_values (COSTO);
            NEW.PRAR_FIJO = :COSTO;
            END
        END
      end
    else
        begin
        /* PRECIO */
        EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION','ARTICULOS','CODIGO DE LA LISTA DE PRECIOS BASE PARA CAMBIO DE PRECIOS AUTOMATICO') returning_values (LISTA);
        if (NEW.lipr_cod <> :LISTA) then
            BEGIN
            SELECT PRAR_FIJO FROM PRECIOS_ARTICULO WHERE LIPR_COD = :LISTA AND ARTI_COD = NEW.arti_cod INTO :PRECIO;
            SELECT LIPR_MODIF FROM LISTA_PRECIOS L
                WHERE LIPR_COD = :lista INTO :IVAINC1;
            if (ivainc = 'S') then
                if (IVAINC1 = 'S') then
                    NEW.prar_fijo = precio;
                else
                    NEW.prar_fijo = precio * (1 + TARIVA/100);
            ELSE
                if (IVAINC1 = 'S') then
                    NEW.prar_fijo = precio / (1 + TARIVA/100);
                else
                    NEW.prar_fijo = precio;
            if (UOR = 'UTILIDAD') then
                NEW.prar_fijo = NEW.prar_fijo * (1 + NEW.prar_util/100);
            ELSE
                NEW.prar_fijo = NEW.prar_fijo / (1 - NEW.prar_margen/100);
            EXECUTE PROCEDURE REDONDEE (NEW.prar_fijo, DIG) returning_values (NEW.prar_fijo);
            END
        end
    END
end
^

SET TERM ; ^


/* 20091002 */
/* si factor cantidad en cero daba string truncation*/
SET TERM ^ ;

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

/* ACUMULE LOS PUNTOS, SE HACE ACA POR SER POSTERIOR AL DETALLE */
if (ANULADO = 'N') then
    EXECUTE PROCEDURE acumula_puntos_cliente (31, :id, :nit, :fecha) returning_values (:PUNTOS);
EXECUTE PROCEDURE consulta_puntos_cliente (:id, :nit, :fecha) returning_values (:puntos, :puntosacum, :puntosvenc, :fecptos);
if (DTOIT1M IS NULL) then
    DTOIT1M = 0;
if (DTOIT2M IS NULL) then
    DTOIT2M = 0;
if (DTOIT3M IS NULL) then
    DTOIT3M = 0;
SELECT CLIE_COD, C.ZONA_COD, ZONA_NOM
    FROM CLIENTES C, ZONAS Z
    WHERE TERC_NIT = :NIT AND C.ZONA_COD = Z.ZONA_COD
    INTO :CODIGOCL, :ZONACOD, :ZONANOM;
SELECT CLSU_DIR, CLSU_CIUDAD, CLSU_TEL FROM CLIENTE_SUCURSALES WHERE TERC_NIT = :NIT AND CLCU_COD = :SUCUR
    INTO :DIRECCION, :CIUDAD, :TELEFONO;
DIASVENCE = VENCE - FECHA;
if (DIASVENCE > 0) then
    CONTCRED = 'CREDITO ' || CAST(DIASVENCE AS VARCHAR(3)) || ' DIAS';
ELSE
    CONTCRED = 'CONTADO';
SUBTOTAL = TOTALFAC - EXTRA - IVAMONTO - ADICIONAL + DTOMONTO;
if (DTOITE3 = 'SI') then
    BEGIN
    SELECT SUM(FADE_DTOMONTO) FROM FACTURAS_DETALLE WHERE FACT_ID = :id INTO :sumdtoit;
    SUBTOTAL = SUBTOTAL + sumdtoit + dtoit1m + dtoit2m + dtoit3m;
    END
if (INGTER <> '') then
    BEGIN
    SELECT SUM(FADE_TOTAL) FROM FACTURAS_DETALLE D, ARTICULO A WHERE A.arti_cod = D.arti_cod AND FACT_ID = :id AND GRUP_COD = :ingter
        INTO :ingterceros;
    INGPROPIOS = SUBTOTAL - INGTERCEROS;
    END
EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'FECHA AUTORETENEDOR NO DESCONTAR RETENCIONES DEL SALDO PERO SI CONTABILIZARLAS') returning_values (AUTORET);
if (AUTORET <> '') then
    FAUTORET = CAST(AUTORET AS DATE);
else
    FAUTORET = '9999/12/31';
if (FECHA > fautoret) then
    TOTALPAGAR = TOTALFAC - RTEIVAMONTO - RTEICAMONTO - ANTICIPO;
ELSE
    TOTALPAGAR = TOTALFAC - RTEFTEMONTO - RTEIVAMONTO - RTEICAMONTO - ANTICIPO;
TOTALNETO = TOTALFAC - ANTICIPO;
if (RECIBIDO <> 0) then
    CAMBIO = RECIBIDO - totalpagar;
ELSE
    CAMBIO = 0;
SUMAEX = 0;
SUMA1 = 0;
SUMA2 = 0;
SUMA3 = 0;
IVA1 = 0;
IVA2 = 0;
IVA3 = 0;
TOTCONSUMO = 0;
MONTOPAGO1 = 0;
PESOTOT = 0;
SELECT MAX(AUDI_HORA) FROM AUDITORIA WHERE TIDO_COD = 31 AND AUDI_IDDOC = :ID AND AUDI_OPER = 'I' INTO :HORA;
/* AHORA LAS FORMAS DE PAGO, BUSQUE EL ABONO DE HOY A LA FACTURA */
ITEMFP = 1;
MONTOPAGO1 = 0;
MONTOPAGO2 = 0;
MONTOPAGO3 = 0;
FOR SELECT FOPA_NOM, RCPA_MONTO FROM RECIBOS_CAJA_PAGO P, FORMAS_PAGO F, RECIBOS_CAJA R, RECIBOS_CAJA_DETALLE D
    WHERE R.RECA_ID = P.RECA_ID AND R.RECA_ID = D.RECA_ID AND P.FOPA_ID = F.FOPA_ID AND RECA_FECHA = :FECHA AND RCDE_TIPODOC = 31 AND RCDE_IDDOC = :ID
    INTO :formap, :MONTOP
    DO
    BEGIN
    if (ITEMFP = 1) then
        BEGIN
        FORMAPAGO1 = FORMAP;
        MONTOPAGO1 = MONTOP;
        END
    if (ITEMFP = 2) then
        BEGIN
        FORMAPAGO2 = FORMAP;
        MONTOPAGO2 = MONTOP;
        END
    if (ITEMFP = 3) then
        BEGIN
        FORMAPAGO3 = FORMAP;
        MONTOPAGO3 = MONTOP;
        END
    ITEMFP = ITEMFP + 1;
    END
EXECUTE PROCEDURE lee_configuracion ('FACTURACION','DOCUMENTOS','ORDENAR ITEMS POR CODIGO DE ARTICULO') returning_values (:ORDENCOD);
EXECUTE PROCEDURE lee_configuracion ('FACTURACION','POS', 'IMPRIMIR DEVOLUCIONES DE ARTICULOS NEGATIVOS') returning_values (:imprdev);
totcajas = 0;
totbase = 0;
if (ORDENCOD = 'SI') then
    BEGIN
    FOR SELECT FADE_ITEM, D.ARTI_COD, FADE_CODBAR, SUBSTR(FADE_DESC,1,60), ARTI_DESCORTA, FADE_CANT, FADE_UNIDAD, FADE_FACTOR, BODE_COD, FADE_LOTE, LIPR_COD, FADE_PRUNIT, FADE_DTOPORC, FADE_DTOMONTO, FADE_IVAPORC, FADE_IVAMONTO, FADE_CONSUMO, FADE_TOTAL, FADE_REFERENCIA,
        GRUP_COD, SUBG_COD, MARC_COD, ARTI_PESO, ARTI_ANCHO, ARTI_ALTO, ARTI_LARGO, TAIV_COD, FADE_DEVUELTO, FADE_OBS, FADE_DTO1, FADE_DTO2, FADE_DTO3, FADE_DTOM1, FADE_DTOM2, FADE_DTOM3, FADE_CAJAS, FADE_BASE, FADE_PORCBASE
        FROM FACTURAS_DETALLE D, ARTICULO A
        WHERE D.ARTI_COD = A.ARTI_COD AND D.FACT_ID = :ID
        ORDER BY D.ARTI_COD
        INTO :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :DESCORTA, :CANT, :UNIDAD, :FACTOR, :BODITEM, :LOTE, :LISTAPR, :PRUNIT, :DTOITPORC, :DTOITMONTO, :IVAPORC, :IVAITMONTO, :CONSUMO, :TOTAL, :refitem,
        :GRUPO, :SUBGRUPO, :MARCA, :PESO, :ANCHO, :ALTO, :LARGO, :TARIFA, :devuelto, :obsitem, :dtoit1, :dtoit2, :dtoit3, :dtoitm1, :dtoitm2, :dtoitm3, :cajas, :base, :porcbase
        DO
          BEGIN
          if (ARTICULO = CODBAR) then
            SELECT FIRST 1 COBA_COD FROM barras_articulo WHERE ARTI_COD = :articulo INTO :CODBAR;
          if (IMPRDEV <> 'SI') then
            BEGIN
            if ((CANT >= 0) AND (DEVUELTO = 0)) then
                IMPR = 'S';
            ELSE
                IMPR = 'N'; /* ES DEVOLUCION */
            END
          ELSE
            IMPR = 'S';
          if (IMPR = 'S') then
            BEGIN
            prneto = PRUNIT - DTOITMONTO - dtoitm1 - dtoitm2 - dtoitm3;
            if (IMPTOS = 'S') then
                if (cant <> 0) then
                    prnetosiniva = PRUNIT - DTOITMONTO - ((IVAITMONTO+CONSUMO) / CANT) - dtoitm1 - dtoitm2 - dtoitm3;
                else
                    prnetosiniva = PRUNIT - DTOITMONTO - dtoitm1 - dtoitm2 - dtoitm3;
            ELSE
                prnetosiniva = PRUNIT - DTOITMONTO - dtoit1m - dtoit2m - dtoit3m;
            if (ICOINC = 'SI') then
                SUBTOTIT = TOTAL - IVAITMONTO;
            else
                SUBTOTIT = TOTAL - IVAITMONTO - CONSUMO;
            TOTCONSUMO = TOTCONSUMO + CONSUMO;
            TOTBASE = TOTBASE + BASE;
            SELECT LOTE_VENCE FROM LOTES WHERE LOTE_NRO = :lote AND ARTI_COD = :ARTICULO AND BODE_COD = :boditem INTO :vlote;
            if ((REFITEM <> '.t') or (REFITEM IS NULL)) then
                BEGIN
                /* NO SUME LOS ENSAMBLES */
                if (IVAPORC = 0) then
                    SUMAEX = SUMAEX + TOTAL;
                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;
                END
            if (ANCHO IS NULL) then
                ANCHO = 0;
            if (ALTO IS NULL) then
                ALTO = 0;
            if (LARGO IS NULL) then
                LARGO = 0;
            if (PESO IS NULL) then
                PESO = 0;
            PESO = (PESO / 1000) * CANT * FACTOR;
            PESOTOT = PESOTOT + PESO;
            totcajas = totcajas + cajas;
            if (substr(ARTICULO,1,2) = '.t') then
                BEGIN
                REFITEM = '';
                TOTAL = 0;
                SUBTOTIT = 0;
                END
            SELECT STAND_COD FROM STANDS WHERE ARTI_COD = :ARTICULO AND STAND_BODEGA = :boditem INTO :stand;
            factcant = NULL;
            SELECT FIRST 1 UNAR_FACCAN FROM unidad_articulo WHERE ARTI_COD = :articulo INTO :factcant;
            if (factcant IS NULL) then
                BEGIN
                ALTERNATIVAS = 0;
                PRINCIPALES = (CANT * FACTOR);
                END
            ELSE
                BEGIN
                ALTERNATIVAS = FLOOR(CANT * factor / factcant);
                PRINCIPALES = (CANT * FACTOR) - (alternativas * factcant);
                END
            SUSPEND;
            END
          END
    END
ELSE
  if (ORDENCOD = 'UNIDAD') then
    BEGIN
    FOR SELECT FADE_ITEM, D.ARTI_COD, FADE_CODBAR, SUBSTR(FADE_DESC,1,60), ARTI_DESCORTA, FADE_CANT, FADE_UNIDAD, FADE_FACTOR, BODE_COD, FADE_LOTE, LIPR_COD, FADE_PRUNIT, FADE_DTOPORC, FADE_DTOMONTO, FADE_IVAPORC, FADE_IVAMONTO, FADE_CONSUMO, FADE_TOTAL, FADE_REFERENCIA,
        GRUP_COD, SUBG_COD, MARC_COD, ARTI_PESO, ARTI_ANCHO, ARTI_ALTO, ARTI_LARGO, TAIV_COD, FADE_DEVUELTO, FADE_OBS, FADE_DTO1, FADE_DTO2, FADE_DTO3, FADE_DTOM1, FADE_DTOM2, FADE_DTOM3, FADE_CAJAS, FADE_BASE, FADE_PORCBASE
        FROM FACTURAS_DETALLE D, ARTICULO A
        WHERE D.ARTI_COD = A.ARTI_COD AND D.FACT_ID = :ID
        ORDER BY D.fade_unidad, D.fade_desc
        INTO :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :DESCORTA, :CANT, :UNIDAD, :FACTOR, :BODITEM, :LOTE, :LISTAPR, :PRUNIT, :DTOITPORC, :DTOITMONTO, :IVAPORC, :IVAITMONTO, :CONSUMO, :TOTAL, :refitem,
        :GRUPO, :SUBGRUPO, :MARCA, :PESO, :ANCHO, :ALTO, :LARGO, :TARIFA, :devuelto, :obsitem, :dtoit1, :dtoit2, :dtoit3, :dtoitm1, :dtoitm2, :dtoitm3, :cajas, :base, :porcbase
        DO
          BEGIN
          if (ARTICULO = CODBAR) then
            SELECT FIRST 1 COBA_COD FROM barras_articulo WHERE ARTI_COD = :articulo INTO :CODBAR;
          if (IMPRDEV <> 'SI') then
            BEGIN
            if ((CANT >= 0) AND (DEVUELTO = 0)) then
                IMPR = 'S';
            ELSE
                IMPR = 'N'; /* ES DEVOLUCION */
            END
          ELSE
            IMPR = 'S';
          if (IMPR = 'S') then
            BEGIN
            prneto = PRUNIT - DTOITMONTO - dtoitm1 - dtoitm2 - dtoitm3;
            if (IMPTOS = 'S') then
                if (cant <> 0) then
                    prnetosiniva = PRUNIT - DTOITMONTO - ((IVAITMONTO+CONSUMO) / CANT) - dtoitm1 - dtoitm2 - dtoitm3;
                else
                    prnetosiniva = PRUNIT - DTOITMONTO - dtoitm1 - dtoitm2 - dtoitm3;
            ELSE
                prnetosiniva = PRUNIT - DTOITMONTO - dtoit1m - dtoit2m - dtoit3m;
            if (ICOINC = 'SI') then
                SUBTOTIT = TOTAL - IVAITMONTO;
            else
                SUBTOTIT = TOTAL - IVAITMONTO - CONSUMO;
            TOTCONSUMO = TOTCONSUMO + CONSUMO;
            TOTBASE = TOTBASE + BASE;
            SELECT LOTE_VENCE FROM LOTES WHERE LOTE_NRO = :lote AND ARTI_COD = :ARTICULO AND BODE_COD = :boditem INTO :vlote;
            if ((REFITEM <> '.t') or (REFITEM IS NULL)) then
                BEGIN
                /* NO SUME LOS ENSAMBLES */
                if (IVAPORC = 0) then
                    SUMAEX = SUMAEX + TOTAL;
                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;
                END
            if (ANCHO IS NULL) then
                ANCHO = 0;
            if (ALTO IS NULL) then
                ALTO = 0;
            if (LARGO IS NULL) then
                LARGO = 0;
            if (PESO IS NULL) then
                PESO = 0;
            PESO = (PESO / 1000) * CANT * FACTOR;
            PESOTOT = PESOTOT + PESO;
            totcajas = totcajas + cajas;
            if (substr(ARTICULO,1,2) = '.t') then
                BEGIN
                REFITEM = '';
                TOTAL = 0;
                SUBTOTIT = 0;
                END
            SELECT STAND_COD FROM STANDS WHERE ARTI_COD = :ARTICULO AND STAND_BODEGA = :boditem INTO :stand;
            factcant = NULL;
            SELECT FIRST 1 UNAR_FACCAN FROM unidad_articulo WHERE ARTI_COD = :articulo INTO :factcant;
            if ((factcant IS NULL) or (factcant = 0)) then
                BEGIN
                ALTERNATIVAS = 0;
                PRINCIPALES = (CANT * FACTOR);
                END
            ELSE
                BEGIN
                ALTERNATIVAS = FLOOR(CANT * factor / factcant);
                PRINCIPALES = (CANT * FACTOR) - (alternativas * factcant);
                END
            SUSPEND;
            END
          END
    END
  ELSE
    BEGIN
    FOR SELECT FADE_ITEM, D.ARTI_COD, FADE_CODBAR, SUBSTR(FADE_DESC,1,60), ARTI_DESCORTA, FADE_CANT, FADE_UNIDAD, FADE_FACTOR, BODE_COD, FADE_LOTE, LIPR_COD, FADE_PRUNIT, FADE_DTOPORC, FADE_DTOMONTO, FADE_IVAPORC, FADE_IVAMONTO, FADE_CONSUMO, FADE_TOTAL, FADE_REFERENCIA,
        GRUP_COD, SUBG_COD, MARC_COD, ARTI_PESO, ARTI_ANCHO, ARTI_ALTO, ARTI_LARGO, TAIV_COD, FADE_DEVUELTO, FADE_OBS, FADE_DTO1, FADE_DTO2, FADE_DTO3, FADE_DTOM1, FADE_DTOM2, FADE_DTOM3, FADE_CAJAS, FADE_BASE, FADE_PORCBASE
        FROM FACTURAS_DETALLE D, ARTICULO A
        WHERE D.ARTI_COD = A.ARTI_COD AND D.FACT_ID = :ID
        ORDER BY FADE_ITEM
        INTO :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :DESCORTA, :CANT, :UNIDAD, :FACTOR, :BODITEM, :LOTE, :LISTAPR, :PRUNIT, :DTOITPORC, :DTOITMONTO, :IVAPORC, :IVAITMONTO, :CONSUMO, :TOTAL, :refitem,
        :GRUPO, :SUBGRUPO, :MARCA, :PESO, :ANCHO, :ALTO, :LARGO, :TARIFA, :devuelto, :obsitem, :dtoit1, :dtoit2, :dtoit3, :dtoitm1, :dtoitm2, :dtoitm3, :cajas, :base, :porcbase
        DO
          BEGIN
          if (IMPRDEV <> 'SI') then
            BEGIN
            if ((CANT >= 0) AND (DEVUELTO = 0)) then
                IMPR = 'S';
            ELSE
                IMPR = 'N'; /* ES DEVOLUCION */
            END
          ELSE
            IMPR = 'S';
          if (IMPR = 'S') then
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :GRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :MARCA INTO NOMMARCA;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :SUBGRUPO AND GRUP_COD = :GRUPO INTO :NOMSUBG;
            prneto = PRUNIT - DTOITMONTO - dtoitm1 - dtoitm2 - dtoitm3;
            if (IMPTOS = 'S') then
                if (cant <> 0) then
                    prnetosiniva = PRUNIT - DTOITMONTO - ((IVAITMONTO+CONSUMO) / CANT) - dtoit1m - dtoit2m - dtoit3m;
                else
                    prnetosiniva = PRUNIT - DTOITMONTO - dtoitm1 - dtoitm2 - dtoitm3;
            ELSE
                prnetosiniva = PRUNIT - DTOITMONTO - dtoitm1 - dtoitm2 - dtoitm3;
            if (ICOINC = 'SI') then
                SUBTOTIT = TOTAL - IVAITMONTO;
            else
                SUBTOTIT = TOTAL - IVAITMONTO - CONSUMO;
            TOTCONSUMO = TOTCONSUMO + CONSUMO;
            TOTBASE = TOTBASE + BASE;
            SELECT LOTE_VENCE FROM LOTES WHERE LOTE_NRO = :lote AND ARTI_COD = :ARTICULO AND BODE_COD = :boditem INTO :vlote;
            if ((REFITEM <> '.t') or (REFITEM IS NULL)) then
                BEGIN
                /* NO SUME LOS ENSAMBLES */
                if (IVAPORC = 0) then
                    SUMAEX = SUMAEX + TOTAL;
                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;
                END
            if (ANCHO IS NULL) then
                ANCHO = 0;
            if (ALTO IS NULL) then
                ALTO = 0;
            if (LARGO IS NULL) then
                LARGO = 0;
            if (PESO IS NULL) then
                PESO = 0;
            PESO = (PESO / 1000)* CANT * FACTOR;
            PESOTOT = PESOTOT + PESO;
            totcajas = totcajas + cajas;
            if (substr(ARTICULO,1,2) = '.t') then
                BEGIN
                REFITEM = '';
                TOTAL = 0;
                SUBTOTIT = 0;
                END
            SELECT STAND_COD FROM STANDS WHERE ARTI_COD = :ARTICULO AND STAND_BODEGA = :boditem INTO :stand;
            factcant = NULL;
            SELECT FIRST 1 UNAR_FACCAN FROM unidad_articulo WHERE ARTI_COD = :articulo INTO :factcant;
            if ((factcant IS NULL) or (factcant = 0)) then
                BEGIN
                ALTERNATIVAS = 0;
                PRINCIPALES = (CANT * FACTOR);
                END
            ELSE
                BEGIN
                ALTERNATIVAS = FLOOR(CANT * factor / factcant);
                PRINCIPALES = (CANT * FACTOR) - (alternativas * factcant);
                END
            SUSPEND;
            END
          END
    END
END
^

SET TERM ; ^



/* 20091002b */

INSERT INTO CRM_TIPOEVENTO (CRTE_ID, CRTE_NOMBRE) VALUES (906, 'Envio correo');
INSERT INTO CRM_TIPOEVENTO (CRTE_ID, CRTE_NOMBRE) VALUES (907, 'Compromiso cumplido');
commit work;

SET TERM ^ ;

CREATE OR ALTER TRIGGER CRM_COMPROMISOS_BI FOR CRM_COMPROMISOS
ACTIVE BEFORE INSERT POSITION 0
as
begin
if ((NEW.crco_id = 0) or (NEW.crco_id IS NULL))  then
    NEW.crco_id = gen_id(id_compromiso, 1);
if (NEW.crco_fecreg IS NULL)  then
    NEW.crco_fecreg = cast('now' as DATE);
if (NEW.crco_usuario IS NULL)  then
    NEW.crco_usuario = USER;
if (NEW.crco_fecha < cast('now' as DATE))  then
    NEW.crco_fecha = cast('now' as DATE);
end
^

SET TERM ; ^


INSERT INTO CONFIGURACION (CONF_MODULO, CONF_CATEGORIA, CONF_PROPIEDAD, CONF_VALOR, CONF_POSIBLES, CONF_AYUDA) VALUES ('CRM', 'EVENTOS', 'INHABILITAR FECHA EN EVENTOS', 'SI', 'SI,NO', NULL);

INSERT INTO CONFIGURACION (CONF_MODULO, CONF_CATEGORIA, CONF_PROPIEDAD, CONF_VALOR, CONF_POSIBLES, CONF_AYUDA) VALUES ('CRM', 'EVENTOS', 'NIT PARA EVENTOS SIN PROSPECTO', '0', NULL, 'Indique el NIT del prospecto para eventos ocasionales o nuevos que aún no han sido creados');

COMMIT WORK;

/* 20091003 */
/* MAXIMOS Y MINIMOS POR STAND/ARTICULO Y MAXIMO/MINIMO EN DIAS CONFIGURABLE */

INSERT INTO CONFIGURACION (CONF_MODULO, CONF_CATEGORIA, CONF_PROPIEDAD, CONF_VALOR, CONF_POSIBLES, CONF_AYUDA) VALUES ('INVENTARIO', 'EXISTENCIAS', 'MAXIMO INVENTARIO EN DIAS', 'NO', 'SI,NO', 'SI: El campo máximo de la definición del artículo se entiende en días de acuerdo al promedio de salidas del producto. NO: El campo máximo se entiende como cantidad expresada en la unidad principal del artículo');
INSERT INTO CONFIGURACION (CONF_MODULO, CONF_CATEGORIA, CONF_PROPIEDAD, CONF_VALOR, CONF_POSIBLES, CONF_AYUDA) VALUES ('INVENTARIO', 'EXISTENCIAS', 'MAXIMO Y MINIMO POR STAND O POR ARTICULO', 'ARTICULO', 'ARTICULO,STAND', 'ARTICULO: Todas las bodegas usan el mismo valor como máximo y mínimo. STAND: Cada bodega usa un máximo y mínimo independiente');
commit work;

ALTER TABLE STANDS ADD STAND_MAX T_CANTIDAD;
ALTER TABLE STANDS ADD STAND_MIN T_CANTIDAD;

SET TERM ^ ;

CREATE OR ALTER procedure REP_DISPONIBILIDAD (
    FECHA date,
    ARTINI varchar(20),
    ARTFIN varchar(20),
    GRPINI varchar(3),
    GRPFIN varchar(3),
    ORDEN char(1),
    CEROS char(1),
    DETALLE char(1),
    AGRUPA char(1),
    SUCURSAL integer)
returns (
    CODIGO varchar(15),
    NOMBRE varchar(60),
    UNIDAD varchar(8),
    CODGRUPO varchar(2),
    NOMGRUPO varchar(30),
    CODSUBG varchar(3),
    NOMSUBG varchar(30),
    CODMARC varchar(3),
    NOMMARC varchar(30),
    CODBOD varchar(2),
    NOMBOD varchar(30),
    EXIST numeric(18,4),
    PROMEDIO numeric(18,4),
    SALIDAS numeric(18,4),
    DISPONIBILIDAD integer,
    DIAS integer,
    PROMEDIADO integer,
    COSTO numeric(18,2),
    COSTOPRO numeric(18,2),
    SUGERIDO numeric(18,4),
    FECCOMPRA date)
AS
DECLARE VARIABLE CODINI VARCHAR(20);
DECLARE VARIABLE CODFIN VARCHAR(20);
DECLARE VARIABLE DESINI VARCHAR(20);
DECLARE VARIABLE DESFIN VARCHAR(20);
DECLARE VARIABLE MARINI VARCHAR(20);
DECLARE VARIABLE MARFIN VARCHAR(20);
declare variable DIASC VARCHAR(255);
declare variable DIA_ART VARCHAR(2) CHARACTER SET NONE;
declare variable PORART VARCHAR(8);
declare variable MAXDIA VARCHAR(2);
BEGIN
if (ORDEN = 'C') then
    BEGIN
    CODINI = ARTINI;
    CODFIN = ARTFIN;
    DESINI = '';
    DESFIN = 'zz';
    END
ELSE
    BEGIN
    DESINI = ARTINI;
    DESFIN = ARTFIN;
    CODINI = '';
    CODFIN = 'zz';
    END
if (AGRUPA = 'G') then
    BEGIN
    MARINI = '';
    MARFIN = 'zz';
    END
ELSE
    if (AGRUPA = 'M') then
        BEGIN
        MARINI = GRPINI;
        MARFIN = GRPFIN;
        GRPINI = '';
        GRPFIN = 'zz';
        END
EXECUTE PROCEDURE lee_configuracion ('INVENTARIO', 'EXISTENCIAS', 'PROMEDIAR LAS SALIDAS DEL INVENTARIO CON EL NUMERO DE DIAS ASIGNADO A CADA ARTICULO') returning_values (:DIA_ART);
EXECUTE PROCEDURE lee_configuracion ('INVENTARIO', 'EXISTENCIAS', 'NUMERO DE DIAS PARA PROMEDIO DE SALIDAS POR ARTICULO') returning_values (DIASC);
execute procedure lee_configuracion ('INVENTARIO', 'EXISTENCIAS', 'MAXIMO Y MINIMO POR STAND O POR ARTICULO') returning_values (:porart);
execute procedure lee_configuracion ('INVENTARIO', 'EXISTENCIAS', 'MAXIMO INVENTARIO EN DIAS') returning_values (:maxdia);
if (DETALLE = 'S') then
  BEGIN
  FOR SELECT ARTI_COD, ARTI_DES, ARTI_UNIDAD, ARTI_DIAS, A.GRUP_COD, GRUP_NOM, A.SUBG_COD, A.MARC_COD, BODE_COD, BODE_NOM, ARTI_DIANALIS
      FROM ARTICULO A, GRUPO G, BODEGA B
      WHERE ARTI_COD >= :CODINI AND ARTI_COD <= :CODFIN AND A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :GRPFIN AND ARTI_DES >= :DESINI AND ARTI_DES <= :DESFIN AND
      G.GRUP_COD = A.GRUP_COD AND A.ESAR_COD <> 'I' AND ((SUCU_ID = :SUCURSAL) or (:SUCURSAL = 0)) AND
      (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN)))
      INTO :CODIGO, :NOMBRE, :UNIDAD, :DIAS, :CODGRUPO, :NOMGRUPO, :CODSUBG, :CODMARC, :CODBOD, :NOMBOD, :PROMEDIADO
      DO
        BEGIN
        NOMMARC = '';
        NOMSUBG = '';
        SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO :NOMMARC;
        SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
        EXECUTE PROCEDURE costo_promedio_y_ultimo(:CODIGO, :FECHA) RETURNING_VALUES (:costopro, :COSTO);
        EXECUTE PROCEDURE DISPONIBILIDAD_ARTICULO(CODIGO, FECHA, :CODBOD) returning_values (:DISPONIBILIDAD, :EXIST, :PROMEDIO, :SALIDAS);
        if ((PORART = 'STAND') AND (MAXDIA = 'SI')) then
            BEGIN
            DIAS = 0;
            SELECT STAND_MIN FROM STANDS WHERE ARTI_COD = :CODIGO AND STAND_BODEGA = :codbod INTO :dias;
            END
        /*ESTABLECER CUAL ES EL VALOR DE DIAS PARA PROMEDIO*/
        if (DIA_ART = 'NO') then
          BEGIN
            PROMEDIADO = CAST(DIASC AS INTEGER);
          END
        if ((DISPONIBILIDAD < DIAS) and (PROMEDIO > 0))then
            SUGERIDO = (DIAS * PROMEDIO) - EXIST;
        ELSE
            SUGERIDO = 0;
        SELECT MAX(FACO_FECHA) FROM FACTURAS_COMPRA F, FACTURAS_COMPRAS_DETALLE D
            WHERE F.FACO_ID = D.faco_id AND D.ARTI_COD = :CODIGO AND FACO_FECHA <= :FECHA AND D.bode_cod = :codbod
            INTO :FECCOMPRA;
        if ((PROMEDIO > 0) or (EXIST <> 0) or (CEROS = 'S')) then
            SUSPEND;
        END
  END
ELSE
  BEGIN
  FOR SELECT ARTI_COD, ARTI_DES, ARTI_UNIDAD, ARTI_DIAS, A.GRUP_COD, GRUP_NOM, A.SUBG_COD, A.MARC_COD, ARTI_DIANALIS
      FROM ARTICULO A, GRUPO G
      WHERE ARTI_COD >= :CODINI AND ARTI_COD <= :CODFIN AND A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :GRPFIN AND ARTI_DES >= :DESINI AND ARTI_DES <= :DESFIN AND G.GRUP_COD = A.GRUP_COD AND
      A.ESAR_COD <> 'I' AND (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN)))
      INTO :CODIGO, :NOMBRE, :UNIDAD, :DIAS, :CODGRUPO, :NOMGRUPO, :CODSUBG, :CODMARC, :PROMEDIADO
      DO
        BEGIN
        NOMMARC = '';
        NOMSUBG = '';
        SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO :NOMMARC;
        SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
        EXECUTE PROCEDURE costo_promedio_y_ultimo(:CODIGO, :FECHA) RETURNING_VALUES (:costopro, :COSTO);
        EXECUTE PROCEDURE DISPONIBILIDAD_TOTAL_ARTICULO(CODIGO, FECHA) returning_values (:DISPONIBILIDAD, :EXIST, :PROMEDIO, :SALIDAS);
        if ((PORART = 'STAND') AND (MAXDIA = 'SI')) then
            BEGIN
            DIAS = 0;
            SELECT STAND_MIN FROM STANDS WHERE ARTI_COD = :CODIGO AND STAND_BODEGA = :codbod INTO :dias;
            END
        /*ESTABLECER CUAL ES EL VALOR DE DIAS PARA PROMEDIO*/
        if (DIA_ART = 'NO') then
          BEGIN
            PROMEDIADO = CAST(DIASC AS INTEGER);
          END
        if ((DISPONIBILIDAD < DIAS) and (PROMEDIO > 0))then
            SUGERIDO = (DIAS * PROMEDIO) - EXIST;
        ELSE
            SUGERIDO = 0;
        SELECT MAX(FACO_FECHA) FROM FACTURAS_COMPRA F, FACTURAS_COMPRAS_DETALLE D
            WHERE F.FACO_ID = D.faco_id AND D.ARTI_COD = :CODIGO AND FACO_FECHA <= :FECHA
            INTO :FECCOMPRA;
        if ((PROMEDIO > 0) or (EXIST <> 0) or (CEROS = 'S')) then
            SUSPEND;
        END
  END
END
^

SET TERM ; ^

UPDATE STANDS S SET STAND_MAX = (SELECT ARTI_MAX FROM ARTICULO WHERE ARTI_COD = S.arti_cod), STAND_MIN = (SELECT ARTI_MIN FROM ARTICULO WHERE ARTI_COD = S.arti_cod);
/* UPDATE STANDS S SET STAND_MIN = (SELECT ARTI_DIAS FROM ARTICULO WHERE ARTI_COD = S.arti_cod); */
COMMIT WORK;

SET TERM ^ ;

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

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

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

SET TERM ; ^

SET TERM ^ ;

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

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

SET TERM ; ^

grant EXECUTE on PROCEDURE existencias_sobre_maximo to PUBLIC;

/* 20091005 */
/* error proceso entero -> cadena */
SET TERM ^ ;

CREATE OR ALTER procedure IMPR_PRODUCCION_MONTAJE (
    ID integer)
returns (
    ITEM integer,
    PROCESO varchar(60),
    MINUTOS numeric(18,4),
    REALES numeric(18,4))
AS
BEGIN
FOR SELECT PRMO_ITEM, PRMO_PROCESO, PRMO_MINUTOS, PRMO_MINUTOSR
    FROM produccion_montaje WHERE pror_id = :ID
    ORDER BY PRMO_ITEM
    INTO :ITEM, :proceso, :minutos, :reales
    DO
      BEGIN
      SUSPEND;
      END
end
^

SET TERM ; ^


SET TERM ^ ;

create or alter procedure REP_PRODUCCION (
    FECINI date,
    FECFIN date,
    PREFINI varchar(4),
    PREFFIN varchar(4),
    CLIENTE varchar(20),
    MAQUI integer,
    DETALLE char(1),
    SUBEMPRESA integer)
returns (
    FECHA date,
    PREF varchar(4),
    NUMERO varchar(6),
    NIT VARCHAR(20),
    NOMCLI VARCHAR(60),
    MAQUINA varchar(60),
    PRODUCTO varchar(20),
    DESPROD varchar(60),
    CANT numeric(18,4),
    PESO numeric(18,4),
    FECHAMON date,
    OK numeric(18,4),
    MAL numeric(18,4),
    FALTAN numeric(18,4),
    FECHAFIN date,
    OBS varchar(255),
    ESTADO varchar(20))
AS
declare variable ID INTEGER;
begin
FOR SELECT PROR_ID, O.pref_pre, PROR_NUMERO, PROR_FECHA, PROR_PRODUCTO, PROR_DESC, PROR_ESTADO,
    PROR_CANT, PROR_PESO, PROR_OBS, PROR_NIT, PROR_NOMCLIENTE, PROR_CANT, PROR_MAQUINA, PROR_FECMONTAJE
    FROM produccion_orden O, PREFIJOS P
    WHERE O.pror_fecha >= :FECINI AND O.pror_fecha <= :FECFIN AND O.pref_pre >= :prefini AND O.pref_pre <= :preffin
     AND P.PREF_PRE = O.pref_pre AND P.TIDO_COD = 19 AND ((P.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) AND PROR_ANULADO = 'N'
     AND ((:cliente = '') OR (PROR_NIT = :cliente)) AND ((:MAQUI = 0) or (PROR_MAQUINA = :MAQUI))
    ORDER BY PROR_FECHA, PROR_ID
    into :ID, :PREF, :NUMERO, :FECHA, :producto, :desprod, :estado,
    :cant, :peso, :OBS, :nit, :nomcli, :cant, :maquina, :fechamon
    DO
    BEGIN
    if (ESTADO = 'A') then
        ESTADO = 'Act';
    if (ESTADO = 'C') then
        ESTADO = 'Co';
    if (ESTADO = 'X') then
        ESTADO = 'Anu';
    SELECT ENMA_NOMBRE FROM ensamble_maquina WHERE ENMA_ID = :maquina INTO :maquina;
    if (DETALLE = 'S') then
        BEGIN
        FOR SELECT PREN_CANTOK, PREN_CANTMAL, E.prde_fecha, E.prde_obs
            FROM produccion_entrada_det D, produccion_entrada_enc E
            WHERE E.prde_id = D.prde_id AND E.pror_id = :id INTO :ok,  :mal, :fechafin, :obs
            DO
            BEGIN
            SUSPEND;
            END
        END
    else
        BEGIN
        SELECT SUM(PREN_CANTOK), SUM(PREN_CANTMAL), MAX(E.prde_fecha)
            FROM produccion_entrada_det D, produccion_entrada_enc E
            WHERE E.prde_id = D.prde_id AND E.pror_id = :id INTO :ok,  :mal, :fechafin;
        FALTAN = CANT - OK;
        SUSPEND;
        END
    END
end
^

SET TERM ; ^

grant EXECUTE on procedure rep_produccion to public;

/* 20091006 */
/* SI INGRESA CON TRASLADO DEJABA LOS DEL ANTERIOR REGISTRO */
SET TERM ^ ;

CREATE OR ALTER procedure REP_DOCUMENTOS_ENCAJA (
    CAJAINI integer,
    CAJAFIN integer)
returns (
    CAJAID integer,
    CAJANOM varchar(60),
    RESPONSABLE varchar(60),
    TIPODOC varchar(8),
    NUMDOC varchar(10),
    BANCO varchar(2),
    CUENTA varchar(20),
    NUMERO varchar(20),
    FECDOC date,
    MONTO numeric(18,2),
    FORPAGO varchar(30),
    NOMTERC varchar(60))
AS
declare variable IDDOC INTEGER;
BEGIN
FOR SELECT CAJA_ID, CAJA_NOMBRE, CAJA_RESP FROM CAJAS
    WHERE CAJA_ID >= :CAJAINI AND CAJA_ID <= :CAJAFIN
    ORDER BY CAJA_ID
    INTO :CAJAID, :CAJANOM, :RESPONSABLE
    DO
    BEGIN
    /* PRIMERO EL SALDO DE EFECTIVO */
    FORPAGO = 'EFECTIVO';
    TIPODOC = '';
    NUMDOC = '';
    BANCO = '';
    CUENTA = '';
    NUMERO = '';
    execute procedure SALDO_EN_EFECTIVO(:CAJAID, '9999/12/31') RETURNING_VALUES (:MONTO);
    SUSPEND;
    
    FOR SELECT DPCA_BANCO, DPCA_CUENTA, DPCA_NUMERO, DPCA_FECHA, DPCA_MONTO, FOPA_NOM, TIDO_NOMCORTO, DPCA_IDENT
        FROM DOCUMENTOS_PAGO_CAJA D, TIPO_DOCUMENTO T, FORMAS_PAGO F
        WHERE D.DPCA_TIPOENT = T.TIDO_COD AND D.FOPA_ID = F.FOPA_ID AND D.CAJA_ID = :CAJAID AND D.FOPA_ID <> 1 AND DPCA_IDSAL = 0 AND DPCA_TIPOSAL = 0
        ORDER BY FOPA_NOM, DPCA_FECHA
        INTO :BANCO, :CUENTA, :NUMERO, :FECDOC, :MONTO, :FORPAGO, :TIPODOC, :IDDOC
        DO
        BEGIN
        if (TIPODOC = 'RECICAJA') then
            SELECT PREF_PRE || RECA_NUMERO, TERC_NOM FROM RECIBOS_CAJA R, TERCEROS T
                WHERE RECA_ID = :IDDOC AND R.TERC_NIT = T.TERC_NIT INTO :NUMDOC, :NOMTERC;
        if (TIPODOC = 'RECIPROV') then
            SELECT PREF_PRE || RCPR_NUMERO, TERC_NOM FROM RECIBO_PROVISIONAL R, TERCEROS T
                WHERE RCPR_ID = :IDDOC AND R.TERC_NIT = T.TERC_NIT INTO :NUMDOC, :NOMTERC;
        if (TIPODOC = 'DEVOCHEQ') then
            SELECT PRBA_PREF || DVCH_NUMDOC, TERC_NOM FROM DEVOLUCION_CHEQUES D, TERCEROS T
                WHERE DVCH_ID = :IDDOC AND D.TERC_NIT = T.TERC_NIT INTO :NUMDOC, :NOMTERC;
        if (TIPODOC = 'TRASLACJ') then
            SELECT PREF_PRE || TRCJ_NUMERO, '' FROM traslados_caja
                WHERE TRCJ_ID = :IDDOC INTO :NUMDOC, :NOMTERC;
        SUSPEND;
        END
    END
END
^

SET TERM ; ^



/* 20091006b */
/* MEJORA VELOCIDAD DEL CALCULO DE REPORTE DE RESUMEN DIA */

CREATE INDEX EGRESOS_DETALLE_IDX1 ON EGRESOS_DETALLE (EGDE_TIPODOC,EGDE_IDDOC);

SET TERM ^ ;

CREATE OR ALTER procedure CIERRE_DIARIO (
    FECHA date,
    PTOVTA integer)
returns (
    VTACONTDIA numeric(18,2),
    VTACONTMES numeric(18,2),
    VTACREDDIA numeric(18,2),
    VTACREDMES numeric(18,2),
    VTATOTALDIA numeric(18,2),
    VTATOTALMES numeric(18,2),
    DEVOLDIA numeric(18,2),
    DEVOLMES numeric(18,2),
    VTANETADIA numeric(18,2),
    VTANETAMES numeric(18,2),
    VTAEXENTADIA numeric(18,2),
    VTAGRAVA16DIA numeric(18,2),
    VTAGRAVA10DIA numeric(18,2),
    VTAEXENTAMES numeric(18,2),
    VTAGRAVA16MES numeric(18,2),
    VTAGRAVA10MES numeric(18,2),
    IVA16DIA numeric(18,2),
    IVA10DIA numeric(18,2),
    IVA16MES numeric(18,2),
    IVA10MES numeric(18,2),
    FORMAP1 numeric(18,2),
    FORMAP2 numeric(18,2),
    FORMAP3 numeric(18,2),
    FORMAP4 numeric(18,2),
    FORMAP5 numeric(18,2),
    CARTERA numeric(18,2),
    FORMAP1MES numeric(18,2),
    FORMAP2MES numeric(18,2),
    FORMAP3MES numeric(18,2),
    FORMAP4MES numeric(18,2),
    FORMAP5MES numeric(18,2),
    CARTERAMES numeric(18,2),
    INICIAL numeric(18,2),
    INGCARTERA numeric(18,2),
    INGOTROS numeric(18,2),
    INGTOTAL numeric(18,2),
    DESCTOSDIA numeric(18,2),
    DESCTOSMES numeric(18,2),
    EGRTOTAL numeric(18,2),
    EGRPROV numeric(18,2),
    EGRCLASE1 numeric(18,2),
    EGRCLASE2 numeric(18,2),
    EGROTROS numeric(18,2),
    TRASLADO numeric(18,2),
    TRASLADOR numeric(18,2),
    CONSIGNA numeric(18,2))
AS
declare variable fecaux varchar(10);
declare variable fecini date;
declare variable caja integer;
begin
FECAUX = CAST (FECHA AS VARCHAR(10));
FECINI = SUBSTR(FECAUX, 1, 8) || '01';
/* ventas totales */
SELECT SUM(FACT_TOTAL) FROM FACTURAS WHERE FACT_FECHA = :FECHA AND PTVT_ID = :ptovta AND FACT_ANULADO = 'N' INTO :vtatotaldia;
if (vtatotaldia IS NULL) then
    vtatotaldia = 0;
SELECT SUM(FACT_TOTAL) FROM FACTURAS WHERE FACT_FECHA >= :fecini AND FACT_FECHA <= :FECHA AND PTVT_ID = :ptovta AND FACT_ANULADO = 'N' INTO :vtatotalmes;
if (vtatotalmes IS NULL) then
    vtatotalmes = 0;
SELECT SUM(DEVT_TOTAL) FROM DEVOLUCIONES_VENTAS WHERE DEVT_FECHA = :FECHA AND PTVT_ID = :ptovta AND DEVT_ANULADO = 'N' INTO :devoldia;
if (devoldia IS NULL) then
    devoldia = 0;
SELECT SUM(DEVT_TOTAL) FROM DEVOLUCIONES_VENTAS WHERE DEVT_FECHA >= :fecini AND DEVT_FECHA <= :FECHA AND PTVT_ID = :ptovta AND DEVT_ANULADO = 'N' INTO :devolmes;
if (devolmes IS NULL) then
    devolmes = 0;
/* ventas contado */
SELECT SUM(RCDE_ABONO), SUM(RCDE_DTOF) FROM RECIBOS_CAJA_DETALLE D, RECIBOS_CAJA R,  FACTURAS F
    WHERE FACT_FECHA = :FECHA AND PTVT_ID = :ptovta AND D.rcde_tipodoc = 31 AND D.rcde_iddoc = F.fact_id AND R.reca_id = D.reca_id AND RECA_FECHA = :FECHA AND RCDE_ANULADO = 'N'
    INTO :vtacontdia, :desctosdia;
if (vtacontdia IS NULL) then
    vtacontdia = 0;
if (desctosdia IS NULL) then
    desctosdia = 0;

SELECT SUM(RCDE_ABONO), SUM(RCDE_DTOF) FROM RECIBOS_CAJA_DETALLE D, RECIBOS_CAJA R,  FACTURAS F
    WHERE FACT_FECHA >= :fecini AND PTVT_ID = :ptovta AND FACT_FECHA <= :FECHA AND D.rcde_tipodoc = 31 AND D.rcde_iddoc = F.fact_id AND R.reca_id = D.reca_id AND RECA_FECHA = FACT_FECHA AND RCDE_ANULADO = 'N'
    INTO :vtacontmes, :desctosmes;
if (vtacontmes IS NULL) then
    vtacontmes = 0;
if (desctosmes IS NULL) then
    desctosmes = 0;

/* Ventas credito */
vtacreddia = vtatotaldia - vtacontdia;
vtacredmes = vtatotalmes - vtacontmes;

vtanetadia = vtatotaldia - devoldia;
vtanetames = vtatotalmes - devolmes;

SELECT SUM(FADE_TOTAL-FADE_IVAMONTO) FROM facturas_detalle D, FACTURAS F
    WHERE D.FACT_ID = F.FACT_ID AND FACT_FECHA = :FECHA AND PTVT_ID = :ptovta AND PTVT_ID = :ptovta AND FADE_IVAPORC = 0 and FACT_ANULADO = 'N' AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
    INTO :vtaexentadia;
if (vtaexentadia IS NULL) then
    vtaexentadia = 0;
SELECT SUM(FADE_TOTAL-FADE_IVAMONTO) FROM facturas_detalle D, FACTURAS F
    WHERE D.FACT_ID = F.FACT_ID AND FACT_FECHA >= :fecini AND FACT_FECHA <= :FECHA AND PTVT_ID = :ptovta AND FADE_IVAPORC = 0 and FACT_ANULADO = 'N'  AND D.fade_referencia <> '.t'
    INTO :vtaexentames;
if (vtaexentames IS NULL) then
    vtaexentames = 0;
SELECT SUM(FADE_TOTAL-FADE_IVAMONTO), SUM(FADE_IVAMONTO) FROM facturas_detalle D, FACTURAS F
    WHERE D.FACT_ID = F.FACT_ID AND FACT_FECHA = :FECHA AND PTVT_ID = :ptovta AND FADE_IVAPORC = 16 and FACT_ANULADO = 'N'  AND D.fade_referencia <> '.t'
    INTO :vtagrava16dia, :iva16dia;
if (vtagrava16dia IS NULL) then
    vtagrava16dia = 0;
if (iva16dia IS NULL) then
    iva16dia = 0;
SELECT SUM(FADE_TOTAL-FADE_IVAMONTO), SUM(FADE_IVAMONTO) FROM facturas_detalle D, FACTURAS F
    WHERE D.FACT_ID = F.FACT_ID AND FACT_FECHA >= :fecini AND FACT_FECHA <= :FECHA AND PTVT_ID = :ptovta AND FADE_IVAPORC = 16 and FACT_ANULADO = 'N'  AND D.fade_referencia <> '.t'
    INTO :vtagrava16mes, :iva16mes;
if (vtagrava16mes IS NULL) then
    vtagrava16mes = 0;
if (iva16mes IS NULL) then
    iva16mes = 0;
SELECT SUM(FADE_TOTAL-FADE_IVAMONTO), SUM(FADE_IVAMONTO) FROM facturas_detalle D, FACTURAS F
    WHERE D.FACT_ID = F.FACT_ID AND FACT_FECHA = :FECHA AND PTVT_ID = :ptovta AND FADE_IVAPORC = 10 and FACT_ANULADO = 'N'  AND D.fade_referencia <> '.t'
    INTO :vtagrava10dia, :iva10dia;
if (vtagrava10dia IS NULL) then
    vtagrava10dia = 0;
if (iva10dia IS NULL) then
    iva10dia = 0;
SELECT SUM(FADE_TOTAL-FADE_IVAMONTO), SUM(FADE_IVAMONTO) FROM facturas_detalle D, FACTURAS F
    WHERE D.FACT_ID = F.FACT_ID AND FACT_FECHA >= :fecini AND FACT_FECHA <= :FECHA AND PTVT_ID = :ptovta AND FADE_IVAPORC = 10 and FACT_ANULADO = 'N'  AND D.fade_referencia <> '.t'
    INTO :vtagrava10mes, :iva10mes;
if (vtagrava10mes IS NULL) then
    vtagrava10mes = 0;
if (iva10mes IS NULL) then
    iva10mes = 0;

/* POR FORMA DE PAGO */
SELECT SUM(RCPA_MONTO) FROM RECIBOS_CAJA_PAGO P, RECIBOS_CAJA R, PUNTO_VENTA PT
    WHERE R.RECA_ID = P.RECA_ID AND PT.PTVT_ID = :ptovta AND RECA_FECHA = :fecha AND PT.caja_id = R.caja_id AND FOPA_ID = 1 and RECA_ANULADO = 'N'
    INTO :FORMAP1;
SELECT SUM(RCPA_MONTO) FROM RECIBOS_CAJA_PAGO P, RECIBOS_CAJA R, PUNTO_VENTA PT
    WHERE R.RECA_ID = P.RECA_ID AND PT.PTVT_ID = :ptovta AND RECA_FECHA = :FECHA AND PT.caja_id = R.caja_id AND FOPA_ID = 2 and RECA_ANULADO = 'N'
    INTO :FORMAP2;
SELECT SUM(RCPA_MONTO) FROM RECIBOS_CAJA_PAGO P, RECIBOS_CAJA R, PUNTO_VENTA PT
    WHERE R.RECA_ID = P.RECA_ID AND PT.PTVT_ID = :ptovta AND RECA_FECHA = :FECHA AND PT.caja_id = R.caja_id AND FOPA_ID = 3 and RECA_ANULADO = 'N'
    INTO :FORMAP3;
SELECT SUM(RCPA_MONTO) FROM RECIBOS_CAJA_PAGO P, RECIBOS_CAJA R, PUNTO_VENTA PT
    WHERE R.RECA_ID = P.RECA_ID AND PT.PTVT_ID = :ptovta AND RECA_FECHA = :FECHA AND PT.caja_id = R.caja_id AND FOPA_ID = 4 and RECA_ANULADO = 'N'
    INTO :FORMAP4;
SELECT SUM(RCPA_MONTO) FROM RECIBOS_CAJA_PAGO P, RECIBOS_CAJA R, PUNTO_VENTA PT
    WHERE R.RECA_ID = P.RECA_ID AND PT.PTVT_ID = :ptovta AND RECA_FECHA = :FECHA AND PT.caja_id = R.caja_id AND FOPA_ID = 5 and RECA_ANULADO = 'N'
    INTO :FORMAP5;
SELECT SUM(FACT_TOTAL) FROM FACTURAS f WHERE FACT_FECHA = :fecha AND PTVT_ID = :ptovta AND FACT_ANULADO = 'N' AND
    NOT exists (SELECT r.RECA_ID FROM RECIBOS_CAJA R, RECIBOS_CAJA_DETALLE D WHERE R.reca_id = D.reca_id AND R.reca_fecha = F.fact_fecha AND D.rcde_tipodoc = 31 AND D.rcde_iddoc = F.fact_id)
    INTO :cartera;
if (formap1 is null) then
    formap1 = 0;
if (formap2 is null) then
    formap2 = 0;
if (formap3 is null) then
    formap3 = 0;
if (formap4 is null) then
    formap4 = 0;
if (formap5 is null) then
    formap5 = 0;
if (cartera is null) then
    cartera = 0;

/* EL MES X FORMA DE PAGO */
SELECT SUM(RCPA_MONTO) FROM RECIBOS_CAJA_PAGO P, RECIBOS_CAJA R, PUNTO_VENTA PT
    WHERE R.RECA_ID = P.RECA_ID AND PT.PTVT_ID = :ptovta AND RECA_FECHA >= :fecini AND RECA_FECHA <= :fecha AND PT.caja_id = R.caja_id AND FOPA_ID = 1 and RECA_ANULADO = 'N'
    INTO :FORMAP1MES;
SELECT SUM(RCPA_MONTO) FROM RECIBOS_CAJA_PAGO P, RECIBOS_CAJA R, PUNTO_VENTA PT
    WHERE R.RECA_ID = P.RECA_ID AND PT.PTVT_ID = :ptovta AND RECA_FECHA >= :fecini AND RECA_FECHA <= :fecha AND PT.caja_id = R.caja_id AND FOPA_ID = 2 and RECA_ANULADO = 'N'
    INTO :FORMAP2MES;
SELECT SUM(RCPA_MONTO) FROM RECIBOS_CAJA_PAGO P, RECIBOS_CAJA R, PUNTO_VENTA PT
    WHERE R.RECA_ID = P.RECA_ID AND PT.PTVT_ID = :ptovta AND RECA_FECHA >= :fecini AND RECA_FECHA <= :fecha AND PT.caja_id = R.caja_id AND FOPA_ID = 3 and RECA_ANULADO = 'N'
    INTO :FORMAP3MES;
SELECT SUM(RCPA_MONTO) FROM RECIBOS_CAJA_PAGO P, RECIBOS_CAJA R, PUNTO_VENTA PT
    WHERE R.RECA_ID = P.RECA_ID AND PT.PTVT_ID = :ptovta AND RECA_FECHA >= :fecini AND RECA_FECHA <= :fecha AND PT.caja_id = R.caja_id AND FOPA_ID = 4 and RECA_ANULADO = 'N'
    INTO :FORMAP4MES;
SELECT SUM(RCPA_MONTO) FROM RECIBOS_CAJA_PAGO P, RECIBOS_CAJA R, PUNTO_VENTA PT
    WHERE R.RECA_ID = P.RECA_ID AND PT.PTVT_ID = :ptovta AND RECA_FECHA >= :fecini AND RECA_FECHA <= :fecha AND PT.caja_id = R.caja_id AND FOPA_ID = 5 and RECA_ANULADO = 'N'
    INTO :FORMAP5MES;

SELECT SUM(FACT_TOTAL) FROM FACTURAS f WHERE FACT_FECHA >= :fecini AND FACT_FECHA <= :fecha AND PTVT_ID = :ptovta AND FACT_ANULADO = 'N' AND
    NOT EXISTS (SELECT R.RECA_ID FROM RECIBOS_CAJA R, RECIBOS_CAJA_DETALLE D WHERE R.reca_id = D.reca_id AND R.reca_fecha = F.fact_fecha AND D.rcde_tipodoc = 31 AND D.rcde_iddoc = F.fact_id)
    INTO :carterames;
if (formap1mes is null) then
    formap1mes = 0;
if (formap2mes is null) then
    formap2mes = 0;
if (formap3mes is null) then
    formap3mes = 0;
if (formap4mes is null) then
    formap4mes = 0;
if (formap5mes is null) then
    formap5mes = 0;
if (carterames is null) then
    carterames = 0;

/* SALDO INICIAL */
SELECT CAJA_ID FROM punto_venta WHERE PTVT_ID = :ptovta INTO :CAJA;
EXECUTE PROCEDURE saldo_en_caja(:caja, :fecha) returning_values (:inicial);
/* recibos totales */
select sum(reca_monto) from recibos_caja where reca_fecha = :fecha AND RECA_ANULADO = 'N' and caja_id = :caja into :ingtotal;
if (ingtotal IS NULL) then
    ingtotal = 0;
/* recibos otros */
select sum(reca_monto) from recibos_caja r where reca_fecha = :fecha AND RECA_ANULADO = 'N' and caja_id = :caja and
not EXISTS (select reca_id from recibos_caja_detalle WHERE RECA_ID = R.reca_id) into :ingotros;
if (ingotros IS NULL) then
    ingotros = 0;
/* recibos cxc */
select sum(rcde_abono) from recibos_caja_detalle d, recibos_caja r,  movimiento_clientes m
    where mvcl_fecha <> :fecha and r.reca_id = d.reca_id and r.reca_fecha = :fecha and caja_id = :caja and d.rcde_tipodoc = m.mvcl_tiporef and d.rcde_iddoc = m.mvcl_idref AND RCDE_ANULADO = 'N'
    into :ingcartera;
if (ingcartera IS NULL) then
    ingcartera = 0;

/* EGRESOS totales */
select sum(egca_monto) from egresos_caja c, egresos e where e.egre_id = c.egre_id and c.CAJA_ID = :caja and e.egre_fecha = :fecha AND EGCA_ANULADO = 'N'
into :egrtotal;
if (egrtotal IS NULL) then
    egrtotal = 0;
/* EGRESOS PROVEEDORES */
select sum(egca_monto) from egresos_caja c, egresos e, egresos_detalle d
    where e.egre_id = c.egre_id and c.CAJA_ID = :caja and e.egre_fecha = :fecha AND EGCA_ANULADO = 'N' and
    e.egre_id = d.egre_id into :egrprov;
if (egrprov IS NULL) then
    egrprov = 0;
/* EGRESOS CLASE1 */
select sum(egca_monto) from egresos_caja c, egresos e
    where e.egre_id = c.egre_id and c.CAJA_ID = :caja and e.cleg_id = 1 and e.egre_fecha = :fecha AND EGCA_ANULADO = 'N' and
    e.egre_id = c.egre_id into :egrclase1;
if (egrclase1 IS NULL) then
    egrclase1 = 0;
/* EGRESOS CLASE2 */
select sum(egca_monto) from egresos_caja c, egresos e
    where e.egre_id = c.egre_id and c.CAJA_ID = :caja and e.cleg_id = 2 and e.egre_fecha = :fecha AND EGCA_ANULADO = 'N' and
    e.egre_id = c.egre_id into :egrclase2;
if (egrclase2 IS NULL) then
    egrclase2 = 0;
/* EGRESOS OTROS */
egrotros = egrtotal - egrprov - egrclase1 - egrclase2;

/* traslados caja */
select sum(trcd_monto) from traslados_caja t, traslados_caja_det d where t.trcj_id = d.trcj_id and t.caja_id = :caja and t.trcj_fecha = :fecha into :traslado;
if (traslado is null) then
    traslado = 0;
/* traslados caja recibidos */
select sum(trcd_monto) from traslados_caja t, traslados_caja_det d where t.trcj_id = d.trcj_id and t.trcj_destino = :caja and t.trcj_fecha = :fecha into :traslador;
if (traslador is null) then
    traslador = 0;
/* consignaciones */
select sum(code_monto) from consigna_detalle d, consigna c where c.cons_id = d.cons_id and cons_fecha = :fecha and d.caja_id = :caja into :consigna;
if (consigna is null) then
    consigna = 0;
suspend;
end
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE RESUMEN_DIA(
    FECHA DATE,
    PTOINI INTEGER,
    PTOFIN INTEGER,
    AGENCIA INTEGER)
RETURNS (
    PTOVTA INTEGER,
    PTOVTANOM VARCHAR(60),
    VTACONTDIA NUMERIC(18,2),
    VTACONTMES NUMERIC(18,2),
    VTACREDDIA NUMERIC(18,2),
    VTACREDMES NUMERIC(18,2),
    VTATOTALDIA NUMERIC(18,2),
    VTATOTALMES NUMERIC(18,2),
    DEVOLDIA NUMERIC(18,2),
    DEVOLMES NUMERIC(18,2),
    VTANETADIA NUMERIC(18,2),
    VTANETAMES NUMERIC(18,2),
    VTAEXENTADIA NUMERIC(18,2),
    VTAGRAVA16DIA NUMERIC(18,2),
    VTAGRAVA10DIA NUMERIC(18,2),
    VTAEXENTAMES NUMERIC(18,2),
    VTAGRAVA16MES NUMERIC(18,2),
    VTAGRAVA10MES NUMERIC(18,2),
    IVA16DIA NUMERIC(18,2),
    IVA10DIA NUMERIC(18,2),
    IVA16MES NUMERIC(18,2),
    IVA10MES NUMERIC(18,2),
    FORMAP1 NUMERIC(18,2),
    FORMAP2 NUMERIC(18,2),
    FORMAP3 NUMERIC(18,2),
    FORMAP4 NUMERIC(18,2),
    FORMAP5 NUMERIC(18,2),
    CARTERA NUMERIC(18,2),
    FORMAP1MES NUMERIC(18,2),
    FORMAP2MES NUMERIC(18,2),
    FORMAP3MES NUMERIC(18,2),
    FORMAP4MES NUMERIC(18,2),
    FORMAP5MES NUMERIC(18,2),
    CARTERAMES NUMERIC(18,2),
    INICIAL NUMERIC(18,2),
    INGCARTERA NUMERIC(18,2),
    INGOTROS NUMERIC(18,2),
    INGTOTAL NUMERIC(18,2),
    DESCTOSDIA NUMERIC(18,2),
    DESCTOSMES NUMERIC(18,2),
    EGRTOTAL NUMERIC(18,2),
    EGRPROV NUMERIC(18,2),
    EGRCLASE1 NUMERIC(18,2),
    EGRCLASE2 NUMERIC(18,2),
    EGROTROS NUMERIC(18,2),
    TRASLADO NUMERIC(18,2),
    TRASLADOR NUMERIC(18,2),
    CONSIGNA NUMERIC(18,2),
    FINAL NUMERIC(18,2),
    CMPEXENTADIA NUMERIC(18,2),
    CMPGRAVA16DIA NUMERIC(18,2),
    CMPGRAVA10DIA NUMERIC(18,2),
    CMPEXENTAMES NUMERIC(18,2),
    CMPGRAVA16MES NUMERIC(18,2),
    CMPGRAVA10MES NUMERIC(18,2),
    CMPTOTALDIA NUMERIC(18,2),
    CMPTOTALMES NUMERIC(18,2),
    CMPCONTADODIA NUMERIC(18,2),
    CMPCREDITODIA NUMERIC(18,2),
    CMPCONTADOMES NUMERIC(18,2),
    CMPCREDITOMES NUMERIC(18,2),
    DEVCMPDIA NUMERIC(18,2),
    DEVCMPMES NUMERIC(18,2),
    CMPNETADIA NUMERIC(18,2),
    CMPNETAMES NUMERIC(18,2),
    IVAC16DIA NUMERIC(18,2),
    IVAC10DIA NUMERIC(18,2),
    IVAC16MES NUMERIC(18,2),
    IVAC10MES NUMERIC(18,2))
AS
 /*$$IBE$$ declare variable FECAUX VARCHAR(10);
declare variable FECINI DATE; $$IBE$$*/ 
begin /*$$IBE$$ 
FECAUX = CAST (FECHA AS VARCHAR(10));
FECINI = SUBSTR(FECAUX, 1, 8) || '01';
SELECT SUM(FCDE_TOTAL-FCDE_IVAMONTO) FROM facturas_compras_detalle D, facturas_compra F, PREFIJOS P
    WHERE D.FACO_ID = F.FACO_ID AND FACO_FECHA = :FECHA AND FCDE_IVAPORC = 0 and FACO_ANULADO = 'N' AND
        P.pref_pre = F.pref_pre AND P.tido_cod = 21 AND ((:AGENCIA = 0) or (P.sucu_id = :AGENCIA))
    INTO :cmpexentadia;
if (cmpexentadia IS NULL) then
    cmpexentadia = 0;
SELECT SUM(FCDE_TOTAL-FCDE_IVAMONTO) FROM facturas_compras_detalle D, facturas_compra F, PREFIJOS P
    WHERE D.FACO_ID = F.FACO_ID AND FACO_FECHA >= :fecini AND FACO_FECHA <= :FECHA AND FCDE_IVAPORC = 0 and FACO_ANULADO = 'N' and
        P.pref_pre = F.pref_pre AND P.tido_cod = 21 AND ((:AGENCIA = 0) or (P.sucu_id = :AGENCIA))
    INTO :cmpexentames;
if (cmpexentames IS NULL) then
    cmpexentames = 0;
SELECT SUM(FCDE_TOTAL-FCDE_IVAMONTO), SUM(FCDE_IVAMONTO) from facturas_compras_detalle D, facturas_compra F, prefijos p
    WHERE D.FACO_ID = F.FACO_ID AND FACO_FECHA = :FECHA AND FCDE_IVAPORC = 16 and FACO_ANULADO = 'N' AND
        P.pref_pre = F.pref_pre AND P.tido_cod = 21 AND ((:AGENCIA = 0) or (P.sucu_id = :AGENCIA))
    INTO :cmpgrava16dia, :ivac16dia;
if (cmpgrava16dia IS NULL) then
    cmpgrava16dia = 0;
if (ivac16dia IS NULL) then
    ivac16dia = 0;
SELECT SUM(FCDE_TOTAL-FCDE_IVAMONTO), SUM(FCDE_IVAMONTO) from facturas_compras_detalle D, facturas_compra F, PREFIJOS P
    WHERE D.FACO_ID = F.FACO_ID AND FACO_FECHA >= :fecini AND FACO_FECHA <= :FECHA AND FCDE_IVAPORC = 16 and FACO_ANULADO = 'N' AND
        P.pref_pre = F.pref_pre AND P.tido_cod = 21 AND ((:AGENCIA = 0) or (P.sucu_id = :AGENCIA))
    INTO :cmpgrava16mes, :ivac16mes;
if (cmpgrava16mes IS NULL) then
    cmpgrava16mes = 0;
if (ivac16mes IS NULL) then
    ivac16mes = 0;
SELECT SUM(FCDE_TOTAL-FCDE_IVAMONTO), SUM(FCDE_IVAMONTO) FROM facturas_compras_detalle D, facturas_compra F, PREFIJOS P
    WHERE D.FACO_ID = F.FACO_ID AND FACO_FECHA = :FECHA AND FCDE_IVAPORC = 10 and FACO_ANULADO = 'N' AND
        P.pref_pre = F.pref_pre AND P.tido_cod = 21 AND ((:AGENCIA = 0) or (P.sucu_id = :AGENCIA))
    INTO :cmpgrava10dia, :ivac10dia;
if (cmpgrava10dia IS NULL) then
    cmpgrava10dia = 0;
if (ivac10dia IS NULL) then
    ivac10dia = 0;
SELECT SUM(FCDE_TOTAL-FCDE_IVAMONTO), SUM(FCDE_IVAMONTO) FROM facturas_compras_detalle D, facturas_compra F, PREFIJOS P
    WHERE D.FACO_ID = F.FACO_ID AND FACO_FECHA >= :fecini AND FACO_FECHA <= :FECHA AND FCDE_IVAPORC = 10 and FACO_ANULADO = 'N' AND
        P.pref_pre = F.pref_pre AND P.tido_cod = 21 AND ((:AGENCIA = 0) or (P.sucu_id = :AGENCIA))
    INTO :cmpgrava10mes, :ivac10mes;
if (cmpgrava10mes IS NULL) then
    cmpgrava10mes = 0;
if (ivac10mes IS NULL) then
    ivac10mes = 0;
SELECT SUM(FACO_TOTAL) FROM FACTURAS_COMPRA F, PREFIJOS P
    WHERE P.pref_pre = F.pref_pre AND P.tido_cod = 21 AND ((:AGENCIA = 0) or (P.sucu_id = :AGENCIA)) AND
    FACO_FECHA = :fecha AND FACO_ANULADO = 'N' INTO :cmptotaldia;
SELECT SUM(FACO_TOTAL) FROM FACTURAS_COMPRA F, PREFIJOS P
    WHERE P.pref_pre = F.pref_pre AND P.tido_cod = 21 AND ((:AGENCIA = 0) or (P.sucu_id = :AGENCIA)) AND
    FACO_FECHA >= :fecini AND FACO_FECHA <= :fecha AND FACO_ANULADO = 'N' INTO :cmptotalmes;
if (cmptotaldia IS NULL) then
    cmptotaldia = 0;
if (cmptotalmes IS NULL) then
    cmptotalmes = 0;
SELECT SUM(FACO_TOTAL) FROM FACTURAS_COMPRA F, PREFIJOS P, EGRESOS_DETALLE D, EGRESOS E
    WHERE P.pref_pre = F.pref_pre AND P.tido_cod = 21 AND ((:AGENCIA = 0) or (P.sucu_id = :AGENCIA)) AND
    D.egde_iddoc = F.faco_id AND D.egde_tipodoc = 21 AND E.egre_id = D.egre_id AND E.egre_fecha = :FECHA AND
    FACO_FECHA = :fecha AND FACO_ANULADO = 'N' INTO :cmpcontadodia;
SELECT SUM(FACO_TOTAL) FROM FACTURAS_COMPRA F, PREFIJOS P, EGRESOS_DETALLE D, EGRESOS E
    WHERE P.pref_pre = F.pref_pre AND P.tido_cod = 21 AND ((:AGENCIA = 0) or (P.sucu_id = :AGENCIA)) AND
    D.egde_iddoc = F.faco_id AND D.egde_tipodoc = 21 AND E.egre_id = D.egre_id AND E.egre_fecha = F.faco_fecha AND
    FACO_FECHA >= :fecini AND FACO_FECHA <= :fecha AND FACO_ANULADO = 'N' INTO :cmpcontadomes;
if (cmpcontadodia IS NULL) then
    cmpcontadodia = 0;
if (cmpcontadomes IS NULL) then
    cmpcontadomes = 0;
CMPCREDITODIA = cmptotaldia - cmpcontadodia;
cmpcreditomes = cmptotalmes - cmpcontadomes;
SELECT SUM(DVCO_TOTAL) FROM DEVOLUCIONES_COMPRAS
    WHERE DVCO_FECHA = :fecha AND DVCO_ANULADO = 'N' INTO :devcmpdia;
SELECT SUM(DVCO_TOTAL) FROM DEVOLUCIONES_COMPRAS
    WHERE DVCO_FECHA >= :fecini AND DVCO_FECHA <= :fecha AND DVCO_ANULADO = 'N' INTO :devcmpmes;
if (devcmpdia IS NULL) then
    devcmpdia = 0;
if (devcmpmes IS NULL) then
    devcmpmes = 0;
cmpnetadia = cmptotaldia - devcmpdia;
cmpnetames = cmptotalmes - devcmpmes;
FOR SELECT PTVT_ID, PTVT_NOM FROM PUNTO_VENTA WHERE PTVT_ID >= :ptoini AND PTVT_ID <= :ptofin AND ((SUCU_ID = :agencia) or (:AGENCIA = 0))
    INTO :ptovta, :ptovtanom
    DO
    BEGIN
    SELECT VTACONTDIA, VTACONTMES, VTACREDDIA, VTACREDMES, VTATOTALDIA, VTATOTALMES,
        DEVOLDIA, DEVOLMES, VTANETADIA, VTANETAMES, VTAEXENTADIA, VTAGRAVA16DIA, VTAGRAVA10DIA,
        VTAEXENTAMES, VTAGRAVA16MES, VTAGRAVA10MES, IVA16DIA, IVA10DIA, IVA16MES, IVA10MES,
        INICIAL, INGCARTERA, INGOTROS, INGTOTAL, DESCTOSDIA, DESCTOSMES,
        EGRTOTAL, EGRPROV, EGRCLASE1, EGRCLASE2, EGROTROS, TRASLADO, TRASLADOR, CONSIGNA,
        formap1,  FORMAP2, FORMAP3, fORMAP4,  FORMAP5, CARTERA,
        formap1mes,  FORMAP2MES, FORMAP3MES, fORMAP4MES,  FORMAP5MES, CARTERAMES
        FROM cierre_diario(:fecha, :ptovta)
        into :VTACONTDIA, :VTACONTMES, :VTACREDDIA, :VTACREDMES, :VTATOTALDIA, :VTATOTALMES,
        :DEVOLDIA, :DEVOLMES, :VTANETADIA, :VTANETAMES, :VTAEXENTADIA, :VTAGRAVA16DIA, :VTAGRAVA10DIA,
        :VTAEXENTAMES, :VTAGRAVA16MES, :VTAGRAVA10MES, :IVA16DIA, :IVA10DIA, :IVA16MES, :IVA10MES,
        :INICIAL, :INGCARTERA, :INGOTROS, :INGTOTAL, :DESCTOSDIA, :DESCTOSMES,
        :EGRTOTAL, :EGRPROV, :EGRCLASE1, :EGRCLASE2, :EGROTROS, :TRASLADO, :traslador, :CONSIGNA,
        :FORMAP1, :FORMAP2, :FORMAP3, :FORMAP4, :FORMAP5, :CARTERA,
        :FORMAP1MES, :FORMAP2MES, :FORMAP3MES, :FORMAP4MES, :FORMAP5MES, :CARTERAMES;
    FINAL = INICIAL + INGTOTAL - EGRTOTAL - TRASLADO + traslador - CONSIGNA;
    SUSPEND;
    END
 $$IBE$$*/ SUSPEND;
end
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE RESUMEN_DIA(
    FECHA DATE,
    PTOINI INTEGER,
    PTOFIN INTEGER,
    AGENCIA INTEGER)
RETURNS (
    PTOVTA INTEGER,
    PTOVTANOM VARCHAR(60),
    VTACONTDIA NUMERIC(18,2),
    VTACONTMES NUMERIC(18,2),
    VTACREDDIA NUMERIC(18,2),
    VTACREDMES NUMERIC(18,2),
    VTATOTALDIA NUMERIC(18,2),
    VTATOTALMES NUMERIC(18,2),
    DEVOLDIA NUMERIC(18,2),
    DEVOLMES NUMERIC(18,2),
    VTANETADIA NUMERIC(18,2),
    VTANETAMES NUMERIC(18,2),
    VTAEXENTADIA NUMERIC(18,2),
    VTAGRAVA16DIA NUMERIC(18,2),
    VTAGRAVA10DIA NUMERIC(18,2),
    VTAEXENTAMES NUMERIC(18,2),
    VTAGRAVA16MES NUMERIC(18,2),
    VTAGRAVA10MES NUMERIC(18,2),
    IVA16DIA NUMERIC(18,2),
    IVA10DIA NUMERIC(18,2),
    IVA16MES NUMERIC(18,2),
    IVA10MES NUMERIC(18,2),
    FORMAP1 NUMERIC(18,2),
    FORMAP2 NUMERIC(18,2),
    FORMAP3 NUMERIC(18,2),
    FORMAP4 NUMERIC(18,2),
    FORMAP5 NUMERIC(18,2),
    CARTERA NUMERIC(18,2),
    FORMAP1MES NUMERIC(18,2),
    FORMAP2MES NUMERIC(18,2),
    FORMAP3MES NUMERIC(18,2),
    FORMAP4MES NUMERIC(18,2),
    FORMAP5MES NUMERIC(18,2),
    CARTERAMES NUMERIC(18,2),
    INICIAL NUMERIC(18,2),
    INGCARTERA NUMERIC(18,2),
    INGOTROS NUMERIC(18,2),
    INGTOTAL NUMERIC(18,2),
    DESCTOSDIA NUMERIC(18,2),
    DESCTOSMES NUMERIC(18,2),
    EGRTOTAL NUMERIC(18,2),
    EGRPROV NUMERIC(18,2),
    EGRCLASE1 NUMERIC(18,2),
    EGRCLASE2 NUMERIC(18,2),
    EGROTROS NUMERIC(18,2),
    TRASLADO NUMERIC(18,2),
    TRASLADOR NUMERIC(18,2),
    CONSIGNA NUMERIC(18,2),
    FINAL NUMERIC(18,2),
    CMPEXENTADIA NUMERIC(18,2),
    CMPGRAVA16DIA NUMERIC(18,2),
    CMPGRAVA10DIA NUMERIC(18,2),
    CMPEXENTAMES NUMERIC(18,2),
    CMPGRAVA16MES NUMERIC(18,2),
    CMPGRAVA10MES NUMERIC(18,2),
    CMPTOTALDIA NUMERIC(18,2),
    CMPTOTALMES NUMERIC(18,2),
    CMPCONTADODIA NUMERIC(18,2),
    CMPCREDITODIA NUMERIC(18,2),
    CMPCONTADOMES NUMERIC(18,2),
    CMPCREDITOMES NUMERIC(18,2),
    DEVCMPDIA NUMERIC(18,2),
    DEVCMPMES NUMERIC(18,2),
    CMPNETADIA NUMERIC(18,2),
    CMPNETAMES NUMERIC(18,2),
    IVAC16DIA NUMERIC(18,2),
    IVAC10DIA NUMERIC(18,2),
    IVAC16MES NUMERIC(18,2),
    IVAC10MES NUMERIC(18,2))
AS
declare variable FECAUX VARCHAR(10);
declare variable FECINI DATE;
begin
FECAUX = CAST (FECHA AS VARCHAR(10));
FECINI = SUBSTR(FECAUX, 1, 8) || '01';
SELECT SUM(FCDE_TOTAL-FCDE_IVAMONTO) FROM facturas_compras_detalle D, facturas_compra F, PREFIJOS P
    WHERE D.FACO_ID = F.FACO_ID AND FACO_FECHA = :FECHA AND FCDE_IVAPORC = 0 and FACO_ANULADO = 'N' AND
        P.pref_pre = F.pref_pre AND P.tido_cod = 21 AND ((:AGENCIA = 0) or (P.sucu_id = :AGENCIA))
    INTO :cmpexentadia;
if (cmpexentadia IS NULL) then
    cmpexentadia = 0;
SELECT SUM(FCDE_TOTAL-FCDE_IVAMONTO) FROM facturas_compras_detalle D, facturas_compra F, PREFIJOS P
    WHERE D.FACO_ID = F.FACO_ID AND FACO_FECHA >= :fecini AND FACO_FECHA <= :FECHA AND FCDE_IVAPORC = 0 and FACO_ANULADO = 'N' and
        P.pref_pre = F.pref_pre AND P.tido_cod = 21 AND ((:AGENCIA = 0) or (P.sucu_id = :AGENCIA))
    INTO :cmpexentames;
if (cmpexentames IS NULL) then
    cmpexentames = 0;
SELECT SUM(FCDE_TOTAL-FCDE_IVAMONTO), SUM(FCDE_IVAMONTO) from facturas_compras_detalle D, facturas_compra F, prefijos p
    WHERE D.FACO_ID = F.FACO_ID AND FACO_FECHA = :FECHA AND FCDE_IVAPORC = 16 and FACO_ANULADO = 'N' AND
        P.pref_pre = F.pref_pre AND P.tido_cod = 21 AND ((:AGENCIA = 0) or (P.sucu_id = :AGENCIA))
    INTO :cmpgrava16dia, :ivac16dia;
if (cmpgrava16dia IS NULL) then
    cmpgrava16dia = 0;
if (ivac16dia IS NULL) then
    ivac16dia = 0;
SELECT SUM(FCDE_TOTAL-FCDE_IVAMONTO), SUM(FCDE_IVAMONTO) from facturas_compras_detalle D, facturas_compra F, PREFIJOS P
    WHERE D.FACO_ID = F.FACO_ID AND FACO_FECHA >= :fecini AND FACO_FECHA <= :FECHA AND FCDE_IVAPORC = 16 and FACO_ANULADO = 'N' AND
        P.pref_pre = F.pref_pre AND P.tido_cod = 21 AND ((:AGENCIA = 0) or (P.sucu_id = :AGENCIA))
    INTO :cmpgrava16mes, :ivac16mes;
if (cmpgrava16mes IS NULL) then
    cmpgrava16mes = 0;
if (ivac16mes IS NULL) then
    ivac16mes = 0;
SELECT SUM(FCDE_TOTAL-FCDE_IVAMONTO), SUM(FCDE_IVAMONTO) FROM facturas_compras_detalle D, facturas_compra F, PREFIJOS P
    WHERE D.FACO_ID = F.FACO_ID AND FACO_FECHA = :FECHA AND FCDE_IVAPORC = 10 and FACO_ANULADO = 'N' AND
        P.pref_pre = F.pref_pre AND P.tido_cod = 21 AND ((:AGENCIA = 0) or (P.sucu_id = :AGENCIA))
    INTO :cmpgrava10dia, :ivac10dia;
if (cmpgrava10dia IS NULL) then
    cmpgrava10dia = 0;
if (ivac10dia IS NULL) then
    ivac10dia = 0;
SELECT SUM(FCDE_TOTAL-FCDE_IVAMONTO), SUM(FCDE_IVAMONTO) FROM facturas_compras_detalle D, facturas_compra F, PREFIJOS P
    WHERE D.FACO_ID = F.FACO_ID AND FACO_FECHA >= :fecini AND FACO_FECHA <= :FECHA AND FCDE_IVAPORC = 10 and FACO_ANULADO = 'N' AND
        P.pref_pre = F.pref_pre AND P.tido_cod = 21 AND ((:AGENCIA = 0) or (P.sucu_id = :AGENCIA))
    INTO :cmpgrava10mes, :ivac10mes;
if (cmpgrava10mes IS NULL) then
    cmpgrava10mes = 0;
if (ivac10mes IS NULL) then
    ivac10mes = 0;
SELECT SUM(FACO_TOTAL) FROM FACTURAS_COMPRA F, PREFIJOS P
    WHERE P.pref_pre = F.pref_pre AND P.tido_cod = 21 AND ((:AGENCIA = 0) or (P.sucu_id = :AGENCIA)) AND
    FACO_FECHA = :fecha AND FACO_ANULADO = 'N' INTO :cmptotaldia;
SELECT SUM(FACO_TOTAL) FROM FACTURAS_COMPRA F, PREFIJOS P
    WHERE P.pref_pre = F.pref_pre AND P.tido_cod = 21 AND ((:AGENCIA = 0) or (P.sucu_id = :AGENCIA)) AND
    FACO_FECHA >= :fecini AND FACO_FECHA <= :fecha AND FACO_ANULADO = 'N' INTO :cmptotalmes;
if (cmptotaldia IS NULL) then
    cmptotaldia = 0;
if (cmptotalmes IS NULL) then
    cmptotalmes = 0;
SELECT SUM(FACO_TOTAL) FROM FACTURAS_COMPRA F, PREFIJOS P, EGRESOS_DETALLE D, EGRESOS E
    WHERE P.pref_pre = F.pref_pre AND P.tido_cod = 21 AND ((:AGENCIA = 0) or (P.sucu_id = :AGENCIA)) AND
    D.egde_iddoc = F.faco_id AND D.egde_tipodoc = 21 AND E.egre_id = D.egre_id AND E.egre_fecha = :FECHA AND
    FACO_FECHA = :fecha AND FACO_ANULADO = 'N' INTO :cmpcontadodia;
SELECT SUM(FACO_TOTAL) FROM FACTURAS_COMPRA F, PREFIJOS P, EGRESOS_DETALLE D, EGRESOS E
    WHERE P.pref_pre = F.pref_pre AND P.tido_cod = 21 AND ((:AGENCIA = 0) or (P.sucu_id = :AGENCIA)) AND
    D.egde_iddoc = F.faco_id AND D.egde_tipodoc = 21 AND E.egre_id = D.egre_id AND E.egre_fecha = F.faco_fecha AND
    FACO_FECHA >= :fecini AND FACO_FECHA <= :fecha AND FACO_ANULADO = 'N' INTO :cmpcontadomes;
if (cmpcontadodia IS NULL) then
    cmpcontadodia = 0;
if (cmpcontadomes IS NULL) then
    cmpcontadomes = 0;
CMPCREDITODIA = cmptotaldia - cmpcontadodia;
cmpcreditomes = cmptotalmes - cmpcontadomes;
SELECT SUM(DVCO_TOTAL) FROM DEVOLUCIONES_COMPRAS
    WHERE DVCO_FECHA = :fecha AND DVCO_ANULADO = 'N' INTO :devcmpdia;
SELECT SUM(DVCO_TOTAL) FROM DEVOLUCIONES_COMPRAS
    WHERE DVCO_FECHA >= :fecini AND DVCO_FECHA <= :fecha AND DVCO_ANULADO = 'N' INTO :devcmpmes;
if (devcmpdia IS NULL) then
    devcmpdia = 0;
if (devcmpmes IS NULL) then
    devcmpmes = 0;
cmpnetadia = cmptotaldia - devcmpdia;
cmpnetames = cmptotalmes - devcmpmes;
FOR SELECT PTVT_ID, PTVT_NOM FROM PUNTO_VENTA WHERE PTVT_ID >= :ptoini AND PTVT_ID <= :ptofin AND ((SUCU_ID = :agencia) or (:AGENCIA = 0))
    INTO :ptovta, :ptovtanom
    DO
    BEGIN
    SELECT VTACONTDIA, VTACONTMES, VTACREDDIA, VTACREDMES, VTATOTALDIA, VTATOTALMES,
        DEVOLDIA, DEVOLMES, VTANETADIA, VTANETAMES, VTAEXENTADIA, VTAGRAVA16DIA, VTAGRAVA10DIA,
        VTAEXENTAMES, VTAGRAVA16MES, VTAGRAVA10MES, IVA16DIA, IVA10DIA, IVA16MES, IVA10MES,
        INICIAL, INGCARTERA, INGOTROS, INGTOTAL, DESCTOSDIA, DESCTOSMES,
        EGRTOTAL, EGRPROV, EGRCLASE1, EGRCLASE2, EGROTROS, TRASLADO, TRASLADOR, CONSIGNA,
        formap1,  FORMAP2, FORMAP3, fORMAP4,  FORMAP5, CARTERA,
        formap1mes,  FORMAP2MES, FORMAP3MES, fORMAP4MES,  FORMAP5MES, CARTERAMES
        FROM cierre_diario(:fecha, :ptovta)
        into :VTACONTDIA, :VTACONTMES, :VTACREDDIA, :VTACREDMES, :VTATOTALDIA, :VTATOTALMES,
        :DEVOLDIA, :DEVOLMES, :VTANETADIA, :VTANETAMES, :VTAEXENTADIA, :VTAGRAVA16DIA, :VTAGRAVA10DIA,
        :VTAEXENTAMES, :VTAGRAVA16MES, :VTAGRAVA10MES, :IVA16DIA, :IVA10DIA, :IVA16MES, :IVA10MES,
        :INICIAL, :INGCARTERA, :INGOTROS, :INGTOTAL, :DESCTOSDIA, :DESCTOSMES,
        :EGRTOTAL, :EGRPROV, :EGRCLASE1, :EGRCLASE2, :EGROTROS, :TRASLADO, :traslador, :CONSIGNA,
        :FORMAP1, :FORMAP2, :FORMAP3, :FORMAP4, :FORMAP5, :CARTERA,
        :FORMAP1MES, :FORMAP2MES, :FORMAP3MES, :FORMAP4MES, :FORMAP5MES, :CARTERAMES;
    FINAL = INICIAL + INGTOTAL - EGRTOTAL - TRASLADO + traslador - CONSIGNA;
    SUSPEND;
    END
end

^

SET TERM ; ^


/* 20091006c */
/* ERROR DE PRECISION EN EL CALCULO CON DEVOLUCIONES */
SET TERM ^ ;

CREATE OR ALTER PROCEDURE ANALISIS_VENTAS_VENDEDOR(
    AGENCIA INTEGER,
    VENDINI INTEGER,
    VENDFIN INTEGER,
    FECHA DATE)
RETURNS (
    CODVEND INTEGER,
    NOMVEND VARCHAR(60),
    CODAGENCIA INTEGER,
    NOMAGENCIA VARCHAR(60),
    PRESUPUESTO NUMERIC(18,2),
    VENTAS NUMERIC(18,2),
    VENTADIA NUMERIC(18,2),
    PENDIENTE NUMERIC(18,2),
    FALTANTE NUMERIC(18,2),
    FALTANTEDIA NUMERIC(18,2),
    PORCENTAJE NUMERIC(9,2),
    PROMEDIO NUMERIC(18,2),
    ESPERADO NUMERIC(18,2),
    RECAUDO NUMERIC(18,2),
    RECAUDODIA NUMERIC(18,2),
    PENDIENTER NUMERIC(18,2),
    MOSTRADORV NUMERIC(18,2),
    MOSTRADORR NUMERIC(18,2),
    MAXIMAVTA NUMERIC(18,2),
    MESMAXIMO VARCHAR(8),
    VENTAANOP NUMERIC(18,2),
    DEBERIAIR NUMERIC(9,2))
AS
DECLARE VARIABLE FECAUX VARCHAR(10);
DECLARE VARIABLE PORCABONO DOUBLE PRECISION ;
DECLARE VARIABLE FECINI VARCHAR(10);
DECLARE VARIABLE FEC DATE;
DECLARE VARIABLE ANO INTEGER;
DECLARE VARIABLE MES INTEGER;
DECLARE VARIABLE TIPODOC INTEGER;
DECLARE VARIABLE ID INTEGER;
DECLARE VARIABLE ABONO DOUBLE precision;
DECLARE VARIABLE SUBTOTAL NUMERIC(18,4);
DECLARE VARIABLE IVAMONTO NUMERIC(18,2);
DECLARE VARIABLE TOTAL DOUBLE precision;
DECLARE VARIABLE ESCONTADO CHAR(1);
DECLARE VARIABLE DIAS INTEGER;
DECLARE VARIABLE AGEN_ANT INTEGER;
DECLARE VARIABLE TOTAL_SUC NUMERIC(18,2);
declare variable DIA INTEGER;
begin
MOSTRADORV = 0;
MOSTRADORR = 0;
AGEN_ANT = 0;
total_suc = 0;
FECAUX = CAST (FECHA AS VARCHAR(10));
ANO = CAST(SUBSTR(FECAUX, 1, 4) AS INTEGER);
MES = CAST(SUBSTR(FECAUX, 6, 7) AS INTEGER);
FECINI = SUBSTR(FECAUX, 1, 8) || '01';
DIA = extract (DAY FROM FECHA);
/*SELECT PRVM_DIAS FROM PRESUPUESTO_VENTAS_MESES WHERE PRVM_ANO = :ANO AND PRVM_MES = :MES INTO :DIAS; */
DIAS = EXTRACT(DAY FROM (FECHA - EXTRACT(DAY FROM FECHA) + 32 - EXTRACT(DAY FROM FECHA - EXTRACT(DAY FROM FECHA) + 32)));
FOR SELECT VEND_COD, VEND_NOMBRE, SUCU_ID, VEND_CONTADO FROM VENDEDORES WHERE VEND_COD >= :VENDINI AND VEND_COD <= :VENDFIN  AND
    ((SUCU_ID = :AGENCIA) or (:AGENCIA = 0)) ORDER BY SUCU_ID, VEND_COD
    INTO :CODVEND, :NOMVEND, :CODAGENCIA, :ESCONTADO
    DO
    BEGIN
    if (CODAGENCIA <> 0) then
        BEGIN
        SELECT SUCU_NOMBRE FROM SUCURSALES WHERE SUCU_ID = :CODAGENCIA INTO :NOMAGENCIA;
        MAXIMAVTA = 0;
        MESMAXIMO = '';
        VENTAANOP = 0;
        /* LA MAXIMA VENTA Y EL MES EN QUE OCURRIO */
        SELECT MAX(HIVE_VENTA) FROM historico_ventas WHERE SUCU_ID = :codagencia INTO maximavta;
        SELECT MAX(CAST(HIVE_MES AS CHAR(2)) || '/' || CAST(HIVE_ANO AS CHAR(4))) FROM
            historico_ventas WHERE HIVE_VENTA = :maximavta AND SUCU_ID = :codagencia INTO :mesmaximo;
        /* LA VENTA DEL MISMO MES EL ANO ANTERIOR */
        SELECT HIVE_VENTA FROM historico_ventas WHERE HIVE_ANO = :ANO-1 AND HIVE_MES = :MES AND SUCU_ID = :codagencia INTO :ventaanop;
        END
    /* TRAIGA EL PRESUPUESTO DEL MES */
    PRESUPUESTO = 0;
    PENDIENTE = 0;
    PENDIENTER = 0;
    SELECT PRVE_VENTA, PRVE_PENDIENTE, PRVE_PENDRECA FROM PRESUPUESTO_VENTAS
        WHERE VEND_COD = :CODVEND AND PRVE_ANO = :ANO AND PRVE_MES = :MES
        INTO :PRESUPUESTO, :PENDIENTE, :PENDIENTER;

    /* CALCULE LAS VENTAS */
    SELECT SUM(FACT_TOTAL-FACT_IVAMONTO) FROM FACTURAS F, PREFIJOS P
        WHERE VEND_COD = :CODVEND AND FACT_FECHA = :FECHA AND FACT_ANULADO = 'N'
        AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND ((SUCU_ID = :AGENCIA) or (:AGENCIA = 0))
        INTO :VENTADIA;
    if (VENTADIA is null) then
        VENTADIA = 0;
    SELECT SUM(FACT_TOTAL-FACT_IVAMONTO) FROM FACTURAS F, PREFIJOS P
        WHERE VEND_COD = :CODVEND AND FACT_FECHA >= :FECINI AND FACT_FECHA < :FECHA AND FACT_ANULADO = 'N'
        AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND ((SUCU_ID = :AGENCIA) or (:AGENCIA = 0))
        INTO :SUBTOTAL;
    if (subtotal is null) then
        ventas = VENTADIA;
    else
        VENTAS = SUBTOTAL + VENTADIA;
    /* CALCULE LAS DEVOLUCIONES */
    SELECT SUM(DEVT_TOTAL-DEVT_IVAMONTO) FROM devoluciones_ventas F, PREFIJOS P
        WHERE VEND_COD = :CODVEND AND DEVT_FECHA = :FECHA AND DEVT_ANULADO = 'N'
        AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 33 AND ((SUCU_ID = :AGENCIA) or (:AGENCIA = 0))
        INTO :SUBTOTAL;
    if (subtotal is not null) then
        BEGIN
        VENTADIA = VENTADIA - SUBTOTAL;
        VENTAS = VENTAS - SUBTOTAL;
        END
    SELECT SUM(DEVT_TOTAL-DEVT_IVAMONTO) FROM devoluciones_ventas F, PREFIJOS P
        WHERE VEND_COD = :CODVEND AND DEVT_FECHA >= :FECINI AND DEVT_FECHA < :FECHA AND DEVT_ANULADO = 'N'
        AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 33 AND ((SUCU_ID = :AGENCIA) or (:AGENCIA = 0))
        INTO :SUBTOTAL;
    if (subtotal is not null) then
        VENTAS = VENTAS - SUBTOTAL;
    /* CALCULE LAS NOTAS CREDITO */
    SELECT SUM(NCCL_MONTO) FROM NOTAS_CREDITO_CLIENTES F, PREFIJOS P
        WHERE VEND_COD = :CODVEND AND NCCL_FECHA = :FECHA AND NCCL_ANULADO = 'N'
        AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 42 AND ((SUCU_ID = :AGENCIA) or (:AGENCIA = 0))
        INTO :SUBTOTAL;
    if (subtotal is not null) then
        BEGIN
        VENTADIA = VENTADIA - SUBTOTAL;
        VENTAS = VENTAS - SUBTOTAL;
        END
    SELECT SUM(NCCL_MONTO) FROM NOTAS_CREDITO_CLIENTES F, PREFIJOS P
        WHERE VEND_COD = :CODVEND AND NCCL_FECHA >= :FECINI AND NCCL_FECHA < :FECHA AND NCCL_ANULADO = 'N'
        AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 42 AND ((SUCU_ID = :AGENCIA) or (:AGENCIA = 0))
        INTO :SUBTOTAL;
    if (subtotal is not null) then
        VENTAS = VENTAS - SUBTOTAL;
    FALTANTE = PRESUPUESTO - VENTAS;
    if (DIAS - DIA > 0) then
        FALTANTEDIA = FALTANTE / (DIAS - DIA);
    ELSE
        FALTANTEDIA = FALTANTE;
    if (PRESUPUESTO <> 0) then
        PORCENTAJE = VENTAS / PRESUPUESTO * 100;
    ELSE
        PORCENTAJE = 0;
    PROMEDIO = (VENTAS + PENDIENTE) / DIA;
    ESPERADO = PROMEDIO * DIAS;
    DEBERIAIR = DIA * 100/ dias;
    RECAUDO = 0;
    RECAUDODIA = 0;
    /* CALCULE EL RECAUDO DEL MES EXCLUYENDO EL IVA */
    FOR SELECT RECA_FECHA, RCDE_TIPODOC, RCDE_IDDOC, (RCDE_ABONO+RCDE_RTFTE+RCDE_RTIVA+RCDE_RTICA)
        FROM RECIBOS_CAJA R, RECIBOS_CAJA_DETALLE RD
        WHERE R.RECA_ID = RD.RECA_ID AND
        RECA_FECHA >= :FECINI AND RECA_FECHA <= :FECHA AND RECA_ANULADO = 'N' AND COBR_COD = :CODVEND
        ORDER BY RECA_FECHA
        INTO :FEC, :TIPODOC, :ID, :ABONO
        DO
        BEGIN
        /* TRAIGA EL DOCUMENTO Y CALCULE LA BASE */
        if (TIPODOC = 31) then
                SELECT FACT_TOTAL,FACT_IVAMONTO FROM FACTURAS WHERE FACT_ID = :ID INTO :TOTAL, :IVAMONTO;
        if (TIPODOC = 33) then
                SELECT DEVT_TOTAL*-1,DEVT_IVAMONTO*-1 FROM DEVOLUCIONES_VENTAS WHERE DEVT_ID = :ID INTO :TOTAL, :IVAMONTO;
        if (TIPODOC = 41) then
                SELECT NDCL_MONTO,NDCL_IVAMONTO FROM NOTAS_DEBITO_CLIENTES WHERE NDCL_ID = :ID INTO :TOTAL, :IVAMONTO;
        if (TIPODOC = 42) then
                SELECT NCCL_MONTO*-1,NCCL_IVAMONTO*-1 FROM NOTAS_CREDITO_CLIENTES WHERE NCCL_ID = :ID INTO :TOTAL, :IVAMONTO;
        if (TIPODOC = 45) then
                SELECT ANCL_BASE*-1,0 FROM ANTICIPOS_CLIENTE WHERE ANCL_ID = :ID INTO :TOTAL, :IVAMONTO;
        if (TIPODOC = 77) then
                SELECT DVCH_MONTO,0 FROM DEVOLUCION_CHEQUES WHERE DVCH_ID = :ID INTO :TOTAL, :IVAMONTO;
        if (TOTAL <> 0) then
           PORCABONO = (ABONO / TOTAL) *100 ; /*SAQUE EL % QUE ABONO*/
            SUBTOTAL = (PORCABONO)/100 * ((TOTAL - IVAMONTO));  /*COJA EL % DE ABONO Y CALCULE LA BASE*/
        RECAUDO = RECAUDO + SUBTOTAL;
        if (FEC = FECHA) then
            RECAUDODIA = RECAUDODIA + SUBTOTAL;
        END
    if (ESCONTADO = 'S') then
        BEGIN
        MOSTRADORV = MOSTRADORV + VENTAS;
        MOSTRADORR = MOSTRADORR + RECAUDO;
        END
    /* actualice el historico */
    if (AGEN_ANT <> codagencia)  then
        BEGIN
        if (AGEN_ANT <> 0) THEN
            BEGIN
            TOTAL = null;
            SELECT HIVE_VENTA FROM historico_ventas WHERE HIVE_ANO = :ANO AND HIVE_MES = :MES AND SUCU_ID = :AGEN_ANT INTO :TOTAL;
            if (TOTAL is not null) then
                BEGIN
                if (TOTAL_SUC <> 0) then
                    UPDATE historico_ventas SET HIVE_VENTA = (:total_suc)  WHERE HIVE_ANO = :ANO AND HIVE_MES = :MES AND SUCU_ID = :AGEN_ANT;
                END
            ELSE
                INSERT INTO historico_ventas (HIVE_ANO, HIVE_MES, SUCU_ID, HIVE_VENTA) VALUES (:ANO, :MES, :AGEN_ANT, :TOTAL_SUC);
            END
        total_suc = VENTAS;
        END
    ELSE
        BEGIN
        total_suc = :total_suc + :VENTAS;
        END
    AGEN_ANT = :codagencia;
    if ((VENTAS <> 0) or (RECAUDO <> 0) or (:presupuesto <> 0)) then
        suspend;
    END
end^

SET TERM ; ^ 

/* 20091006d */
/* SI SE PEDIA CONSOLIDADO E INCLUYENDO LOS CEROS NO PONIA EL SIGNO A LAS DEVOLUCIONES */
SET TERM ^ ;

CREATE OR ALTER procedure REP_ARTICULOS_VENDEDOR (
    TIPO integer,
    DETALLE char(1),
    DESDE varchar(20),
    HASTA varchar(20),
    FECINI date,
    FECFIN date,
    ARTINI varchar(15),
    ARTFIN varchar(15),
    GRPINI varchar(3),
    GRPFIN varchar(3),
    ORDEN char(1),
    AGRUPA char(1),
    ZONA char(1),
    CEROS char(1),
    SUBEMPRESA integer,
    ZONAINI char(2),
    ZONAFIN char(2))
returns (
    CODVEND varchar(20),
    NOMVEND varchar(60),
    NOMTIPO varchar(50),
    ARTICULO varchar(15),
    DESCRIPCION varchar(60),
    CODGRUPO varchar(2),
    NOMGRUPO varchar(30),
    CODSUBG varchar(3),
    NOMSUBG varchar(30),
    CODMARC varchar(3),
    NOMMARC varchar(30),
    UNIDAD varchar(8),
    CANTIDAD numeric(18,4),
    BASE numeric(18,2),
    IVA numeric(18,2),
    CONSUMO numeric(18,2),
    TOTAL numeric(18,2),
    PREFIJO varchar(4),
    NUMERO varchar(6),
    FECHA date,
    DTO numeric(9,2),
    NIT varchar(20),
    NOMCLIENTE varchar(60),
    SUCURSAL varchar(10),
    CODZONA varchar(2),
    NOMZONA varchar(60))
AS
declare variable codini varchar(15);
declare variable codfin varchar(15);
declare variable desini varchar(15);
declare variable desfin varchar(15);
declare variable marini varchar(3);
declare variable marfin varchar(3);
BEGIN
if (ORDEN = 'C') then
    BEGIN
    CODINI = ARTINI;
    CODFIN = ARTFIN;
    DESINI = '';
    DESFIN = 'zz';
    END
ELSE
    BEGIN
    DESINI = ARTINI;
    DESFIN = ARTFIN;
    CODINI = '';
    CODFIN = 'zz';
    END
if (AGRUPA = 'G') then
    BEGIN
    MARINI = '';
    MARFIN = 'zz';
    END
ELSE
    if (AGRUPA = 'M') then
        BEGIN
        MARINI = GRPINI;
        MARFIN = GRPFIN;
        GRPINI = '';
        GRPFIN = 'zz';
        END
    ELSE
        BEGIN
        MARINI = '';
        MARFIN = 'zz';
        END
if (DETALLE = 'N') then
    BEGIN
    if (BIN_AND(TIPO, 1) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 31 INTO :NOMTIPO;
        FOR SELECT MAX(D.ARTI_COD), MAX(VEND_COD), SUM(FADE_CANT * FADE_FACTOR), SUM((FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO)*FACT_FACTOR), SUM(FADE_IVAMONTO*FACT_FACTOR), SUM(FADE_CONSUMO), SUM(FADE_TOTAL*FACT_FACTOR),
            MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD)
            FROM FACTURAS_DETALLE D, FACTURAS F, PREFIJOS P, ARTICULO A
            WHERE F.FACT_ID = D.FACT_ID AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND D.ARTI_COD = A.arti_cod AND
            VEND_COD >= :DESDE AND VEND_COD <= :HASTA AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            FACT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) and substring(a.arti_cod from 1 FOR 2) <> '.t'
            GROUP BY VEND_COD, D.ARTI_COD
            INTO :ARTICULO, :CODVEND, :CANTIDAD, :BASE, :IVA, :CONSUMO, :TOTAL,
            :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
            DO
            BEGIN
            select VEND_NOMBRE from VENDEDORES where VEND_COD = :CODVEND INTO :NOMVEND;
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            if (CEROS = 'S') then
                SUSPEND;
            ELSE
                if ((BASE <> 0) AND (CANTIDAD <> 0)) then
                    SUSPEND;
            END /* FOR */
        END
    if (BIN_AND(TIPO, 2) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 32 INTO :NOMTIPO;
        FOR SELECT MAX(D.ARTI_COD), MAX(VEND_COD), SUM(RVDE_CANT * RVDE_FACTOR), SUM(RVDE_TOTAL-RVDE_IVAMONTO-RVDE_CONSUMO), SUM(RVDE_IVAMONTO), SUM(RVDE_CONSUMO), SUM(RVDE_TOTAL),
            MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD)
            FROM REMISIONES_VENTA_DETALLE D, REMISIONES_VENTA R, PREFIJOS P, ARTICULO A
            WHERE R.REVT_ID = D.REVT_ID AND P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = 32 AND D.ARTI_COD = A.arti_cod AND
            VEND_COD >= :DESDE AND VEND_COD <= :HASTA AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            REVT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY R.vend_cod, D.ARTI_COD
            INTO :ARTICULO, :CODVEND, :CANTIDAD, :BASE, :IVA, :CONSUMO, :TOTAL,
            :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
            DO
            BEGIN
            select VEND_NOMBRE from VENDEDORES where VEND_COD = :CODVEND INTO :NOMVEND;
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            if (CEROS = 'S') then
                SUSPEND;
            ELSE
                if ((BASE <> 0) AND (CANTIDAD <> 0)) then
                    SUSPEND;
            END /* FOR */
        END
    if (BIN_AND(TIPO, 4) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 33 INTO :NOMTIPO;
        FOR SELECT MAX(D.ARTI_COD), MAX(VEND_COD), SUM(DVDE_CANT * DVDE_FACTOR), SUM((DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO)*DEVT_FACTOR), SUM(DVDE_IVAMONTO*DEVT_FACTOR), SUM(DVDE_CONSUMO), SUM(DVDE_TOTAL*DEVT_FACTOR),
            MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD)
            FROM devoluciones_ventas_detalle D, DEVOLUCIONES_VENTAS V, PREFIJOS P, ARTICULO A
            WHERE V.DEVT_ID = D.DEVT_ID AND P.PREF_PRE = V.PREF_PRE AND P.TIDO_COD = 33 AND D.ARTI_COD = A.arti_cod AND
            VEND_COD >= :DESDE AND VEND_COD <= :HASTA AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            DEVT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY V.vend_cod, D.ARTI_COD
            INTO :ARTICULO, :CODVEND, :CANTIDAD, :BASE, :IVA, :CONSUMO, :TOTAL,
            :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
            DO
            BEGIN
            select VEND_NOMBRE from VENDEDORES where VEND_COD = :CODVEND INTO :NOMVEND;
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            BASE = BASE * -1;
            IVA = IVA * -1;
            CANTIDAD = CANTIDAD * -1;
            CONSUMO = CONSUMO * -1;
            TOTAL = TOTAL * -1;
            if (CEROS = 'S') then
                SUSPEND;
            ELSE
                if ((BASE <> 0) AND (CANTIDAD <> 0)) then
                    BEGIN
                    SUSPEND;
                    END
            END /* FOR */
        END
    if (BIN_AND(TIPO, 8) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 34 INTO :NOMTIPO;
        FOR SELECT MAX(D.ARTI_COD), MAX(VEND_COD), SUM(PEDE_CANT * PEDE_FACTOR), SUM((PEDE_TOTAL-PEDE_IVAMONTO-PEDE_CONSUMO)*PEDI_FACTOR), SUM(PEDE_IVAMONTO*PEDI_FACTOR), SUM(PEDE_CONSUMO), SUM(PEDE_TOTAL*PEDI_FACTOR),
            MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD)
            FROM PEDIDOS_DETALLE D, PEDIDOS P, PREFIJOS R, ARTICULO A
            WHERE P.PEDI_ID = D.PEDI_ID AND P.PREF_PRE = R.PREF_PRE AND R.TIDO_COD = 34 AND D.ARTI_COD = A.arti_cod AND
            VEND_COD >= :DESDE AND VEND_COD <= :HASTA AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            PEDI_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY P.vend_cod, D.ARTI_COD
            INTO :ARTICULO, :CODVEND, :CANTIDAD, :BASE, :IVA, :CONSUMO, :TOTAL,
            :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
            DO
            BEGIN
            select VEND_NOMBRE from VENDEDORES where VEND_COD = :CODVEND INTO :NOMVEND;
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            if (CEROS = 'S') then
                SUSPEND;
            ELSE
                if ((BASE <> 0) AND (CANTIDAD <> 0)) then
                    SUSPEND;
            END /* FOR */
        END
    if (BIN_AND(TIPO, 16) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 35 INTO :NOMTIPO;
        FOR SELECT MAX(D.ARTI_COD), MAX(VEND_COD), SUM(CTDE_CANT * CTDE_FACTOR), SUM((CTDE_TOTAL-CTDE_IVAMONTO-CTDE_CONSUMO)*COTI_FACTOR), SUM(CTDE_IVAMONTO*COTI_FACTOR), SUM(CTDE_CONSUMO), SUM(CTDE_TOTAL*COTI_FACTOR),
            MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD)
            FROM COTIZACIONES_DETALLE D, COTIZACIONES C, PREFIJOS P, ARTICULO A
            WHERE C.COTI_ID = D.COTI_ID AND P.PREF_PRE = C.PREF_PRE AND P.TIDO_COD = 35 AND D.ARTI_COD = A.arti_cod AND
            VEND_COD >= :DESDE AND VEND_COD <= :HASTA AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND COTI_FECHA >= :FECINI AND COTI_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            COTI_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY C.vend_cod, D.ARTI_COD
            INTO :ARTICULO, :CODVEND, :CANTIDAD, :BASE, :IVA, :CONSUMO, :TOTAL,
            :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
            DO
            BEGIN
            select VEND_NOMBRE from VENDEDORES where VEND_COD = :CODVEND INTO :NOMVEND;
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            if (CEROS = 'S') then
                SUSPEND;
            ELSE
                if ((BASE <> 0) AND (CANTIDAD <> 0)) then
                    SUSPEND;
            END /* FOR */
        END
    END
ELSE
  if (DETALLE = 'S') then
    BEGIN
    if (BIN_AND(TIPO, 1) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 31 INTO :NOMTIPO;
        FOR SELECT F.PREF_PRE, FACT_NUMERO, FACT_FECHA, VEND_COD, D.ARTI_COD, FADE_CANT * FADE_FACTOR, (FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO)*FACT_FACTOR, FADE_IVAMONTO*FACT_FACTOR, FADE_CONSUMO, FADE_DTOPORC, FADE_TOTAL*FACT_FACTOR,
            ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD , F.TERC_NIT, F.fact_nomcliente, F.fact_sucursal
            FROM FACTURAS F, FACTURAS_DETALLE D, PREFIJOS P, ARTICULO A
            WHERE F.FACT_ID = D.FACT_ID AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND D.ARTI_COD = A.arti_cod AND
                VEND_COD >= :DESDE AND VEND_COD <= :HASTA AND
                A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
                A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND FACT_FECHA >= :FECINI AND
                (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
                FACT_FECHA <= :FECFIN AND FACT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) and substring(a.arti_cod from 1 FOR 2) <> '.t'
            ORDER BY VEND_COD, D.ARTI_COD, FACT_FECHA, F.FACT_ID, FADE_ITEM
            INTO :PREFIJO, :NUMERO, :FECHA, :CODVEND, :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO, :DTO, :TOTAL,
                :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :NIT, :nomcliente, :sucursal
            DO
            BEGIN
            select VEND_NOMBRE from VENDEDORES where VEND_COD = :CODVEND INTO :NOMVEND;
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            SUSPEND;
            END
        END
    if (BIN_AND(TIPO, 2) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 32 INTO :NOMTIPO;
        FOR SELECT R.PREF_PRE, REVT_NUMERO, REVT_FECHA, VEND_COD, D.ARTI_COD, RVDE_CANT * RVDE_FACTOR, (RVDE_TOTAL-RVDE_IVAMONTO-RVDE_CONSUMO), RVDE_IVAMONTO, RVDE_CONSUMO, RVDE_DTOPORC, RVDE_TOTAL,
            ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD, R.terc_nit, R.revt_nomterc, r.revt_sucursal
            FROM REMISIONES_VENTA R, REMISIONES_VENTA_DETALLE D, PREFIJOS P, ARTICULO A
            WHERE R.REVT_ID = D.REVT_ID AND P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = 32 AND D.ARTI_COD = A.arti_cod AND
                VEND_COD >= :DESDE AND VEND_COD <= :HASTA AND
                A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
                A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN AND
                (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
                REVT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            ORDER BY VEND_COD, D.ARTI_COD, REVT_FECHA, R.REVT_ID, RVDE_ITEM
            INTO :PREFIJO, :NUMERO, :FECHA, :CODVEND, :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO, :DTO, :TOTAL,
                :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :NIT, :nomcliente, :sucursal
            DO
            BEGIN
            select VEND_NOMBRE from VENDEDORES where VEND_COD = :CODVEND INTO :NOMVEND;
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            SUSPEND;
            END
        END
    if (BIN_AND(TIPO, 4) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 33 INTO :NOMTIPO;
        FOR SELECT V.PREF_PRE, DEVT_NUMERO, DEVT_FECHA, VEND_COD, D.ARTI_COD, DVDE_CANT * DVDE_FACTOR, (DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO)*DEVT_FACTOR, DVDE_IVAMONTO*DEVT_FACTOR, DVDE_CONSUMO, DVDE_DTOPORC, DVDE_TOTAL*DEVT_FACTOR,
            ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD, V.terc_nit, V.devt_nomterc, v.devt_sucursal
            FROM DEVOLUCIONES_VENTAS V, DEVOLUCIONES_VENTAS_DETALLE D, PREFIJOS P, ARTICULO A
            WHERE V.DEVT_ID = D.DEVT_ID AND P.PREF_PRE = V.PREF_PRE AND P.TIDO_COD = 33 AND D.ARTI_COD = A.arti_cod AND
                VEND_COD >= :DESDE AND VEND_COD <= :HASTA AND
                A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
                A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND
                (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
                DEVT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            ORDER BY VEND_COD, D.ARTI_COD, DEVT_FECHA, V.DEVT_ID, DVDE_ITEM
            INTO :PREFIJO, :NUMERO, :FECHA, :CODVEND, :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO, :DTO, :TOTAL,
                :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :NIT, :nomcliente, :sucursal
            DO
            BEGIN
            select VEND_NOMBRE from VENDEDORES where VEND_COD = :CODVEND INTO :NOMVEND;
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            BASE = BASE * -1;
            IVA = IVA * -1;
            CANTIDAD = CANTIDAD * -1;
            CONSUMO = CONSUMO * -1;
            TOTAL = TOTAL * -1;
            SUSPEND;
            END
        END
    if (BIN_AND(TIPO, 8) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 34 INTO :NOMTIPO;
        FOR SELECT P.PREF_PRE, PEDI_NUMERO, PEDI_FECHA, VEND_COD, D.ARTI_COD, PEDE_CANT * PEDE_FACTOR, (PEDE_TOTAL-PEDE_IVAMONTO-PEDE_CONSUMO)*PEDI_FACTOR, PEDE_IVAMONTO*PEDI_FACTOR, PEDE_CONSUMO, PEDE_DTOPORC, PEDE_TOTAL*PEDI_FACTOR,
            ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD, P.terc_nit, P.pedi_nomterc, p.pedi_sucursal
            FROM PEDIDOS P, PEDIDOS_DETALLE D, PREFIJOS R, ARTICULO A
            WHERE P.PEDI_ID = D.PEDI_ID AND P.PREF_PRE = R.PREF_PRE AND R.TIDO_COD = 34 AND D.ARTI_COD = A.arti_cod AND
                VEND_COD >= :DESDE AND VEND_COD <= :HASTA AND
                A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
                A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND
                (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
                PEDI_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            ORDER BY VEND_COD, D.ARTI_COD, PEDI_FECHA, P.PEDI_ID, PEDE_ITEM
            INTO :PREFIJO, :NUMERO, :FECHA, :CODVEND, :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO, :DTO, :TOTAL,
                :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :NIT, :nomcliente, :sucursal
            DO
            BEGIN
            select VEND_NOMBRE from VENDEDORES where VEND_COD = :CODVEND INTO :NOMVEND;
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            SUSPEND;
            END
        END
    if (BIN_AND(TIPO, 16) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 35 INTO :NOMTIPO;
        FOR SELECT C.PREF_PRE, COTI_NUMERO, COTI_FECHA, VEND_COD, D.ARTI_COD, CTDE_CANT * CTDE_FACTOR, (CTDE_TOTAL-CTDE_IVAMONTO-CTDE_CONSUMO)*COTI_FACTOR, CTDE_IVAMONTO*COTI_FACTOR, CTDE_CONSUMO, CTDE_DTOPORC, CTDE_TOTAL*COTI_FACTOR,
            ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD, C.terc_nit, C.coti_nomterc, c.coti_sucursal
            FROM COTIZACIONES C, COTIZACIONES_DETALLE D, PREFIJOS P, ARTICULO A
            WHERE C.COTI_ID = D.COTI_ID AND P.PREF_PRE = C.PREF_PRE AND P.TIDO_COD = 35 AND D.ARTI_COD = A.arti_cod AND
                VEND_COD >= :DESDE AND VEND_COD <= :HASTA AND
                A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
                A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND COTI_FECHA >= :FECINI AND COTI_FECHA <= :FECFIN AND
                (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
                COTI_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            ORDER BY VEND_COD, D.ARTI_COD, COTI_FECHA, C.COTI_ID, CTDE_ITEM
            INTO :PREFIJO, :NUMERO, :FECHA, :CODVEND, :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO, :DTO, :TOTAL,
                :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :NIT, :nomcliente, :sucursal
            DO
            BEGIN
            select VEND_NOMBRE from VENDEDORES where VEND_COD = :CODVEND INTO :NOMVEND;
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            SUSPEND;
            END
        END
    END
  ELSE
if (DETALLE = 'C') then
    BEGIN
    if (BIN_AND(TIPO, 1) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 31 INTO :NOMTIPO;
        FOR SELECT MAX(D.ARTI_COD), MAX(VEND_COD), SUM(FADE_CANT * FADE_FACTOR), SUM((FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO)*FACT_FACTOR), SUM(FADE_IVAMONTO*FACT_FACTOR), SUM(FADE_CONSUMO), SUM(FADE_TOTAL*FACT_FACTOR),
            MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD), MAX(F.terc_nit), MAX(F.fact_nomcliente), MAX(F.fact_sucursal)
            FROM FACTURAS_DETALLE D, FACTURAS F, PREFIJOS P, ARTICULO A
            WHERE F.FACT_ID = D.FACT_ID AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND D.ARTI_COD = A.arti_cod AND
            VEND_COD >= :DESDE AND VEND_COD <= :HASTA AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            FACT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) and substring(a.arti_cod from 1 FOR 2) <> '.t'
            GROUP BY F.VEND_COD, F.TERC_NIT, F.fact_sucursal, D.ARTI_COD
            INTO :ARTICULO, :CODVEND, :CANTIDAD, :BASE, :IVA, :CONSUMO, :TOTAL,
            :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :nit, :nomcliente, :sucursal
            DO
            BEGIN
            select VEND_NOMBRE from VENDEDORES where VEND_COD = :CODVEND INTO :NOMVEND;
            SELECT C.ZONA_COD, ZONA_NOM FROM CLIENTES C, ZONAS Z WHERE C.zona_cod = Z.zona_cod AND C.terc_nit = :nit INTO :codzona, :nomzona;
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            if (CEROS = 'S') then
                SUSPEND;
            ELSE
                if ((BASE <> 0) AND (CANTIDAD <> 0)) then
                    SUSPEND;
            END /* FOR */
        END
    if (BIN_AND(TIPO, 2) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 32 INTO :NOMTIPO;
        FOR SELECT MAX(D.ARTI_COD), MAX(VEND_COD), SUM(RVDE_CANT * RVDE_FACTOR), SUM(RVDE_TOTAL-RVDE_IVAMONTO-RVDE_CONSUMO), SUM(RVDE_IVAMONTO), SUM(RVDE_CONSUMO), SUM(RVDE_TOTAL),
            MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD), MAX(R.terc_nit), MAX(R.revt_nomterc), MAX(R.revt_sucursal)
            FROM REMISIONES_VENTA_DETALLE D, REMISIONES_VENTA R, PREFIJOS P, ARTICULO A
            WHERE R.REVT_ID = D.REVT_ID AND P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = 32 AND D.ARTI_COD = A.arti_cod AND
            VEND_COD >= :DESDE AND VEND_COD <= :HASTA AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            REVT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY R.vend_cod, R.terc_nit, R.revt_sucursal, D.arti_cod
            INTO :ARTICULO, :CODVEND, :CANTIDAD, :BASE, :IVA, :CONSUMO, :TOTAL,
            :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :nit, :nomcliente, :sucursal
            DO
            BEGIN
            SELECT C.ZONA_COD, ZONA_NOM FROM CLIENTES C, ZONAS Z WHERE C.zona_cod = Z.zona_cod AND C.terc_nit = :nit INTO :codzona, :nomzona;
            select VEND_NOMBRE from VENDEDORES where VEND_COD = :CODVEND INTO :NOMVEND;
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            if (CEROS = 'S') then
                SUSPEND;
            ELSE
                if ((BASE <> 0) AND (CANTIDAD <> 0)) then
                    SUSPEND;
            END /* FOR */
        END
    if (BIN_AND(TIPO, 4) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 33 INTO :NOMTIPO;
        FOR SELECT MAX(D.ARTI_COD), MAX(VEND_COD), SUM(DVDE_CANT * DVDE_FACTOR), SUM((DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO)*DEVT_FACTOR), SUM(DVDE_IVAMONTO*DEVT_FACTOR), SUM(DVDE_CONSUMO), SUM(DVDE_TOTAL*DEVT_FACTOR),
            MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD), MAX(V.terc_nit), MAX(V.devt_nomterc), MAX(V.devt_sucursal)
            FROM devoluciones_ventas_detalle D, DEVOLUCIONES_VENTAS V, PREFIJOS P, ARTICULO A
            WHERE V.DEVT_ID = D.DEVT_ID AND P.PREF_PRE = V.PREF_PRE AND P.TIDO_COD = 33 AND D.ARTI_COD = A.arti_cod AND
            VEND_COD >= :DESDE AND VEND_COD <= :HASTA AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            DEVT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY V.vend_cod, V.terc_nit, V.devt_sucursal, D.arti_cod
            INTO :ARTICULO, :CODVEND, :CANTIDAD, :BASE, :IVA, :CONSUMO, :TOTAL,
            :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :nit, :nomcliente, :sucursal
            DO
            BEGIN
            SELECT C.ZONA_COD, ZONA_NOM FROM CLIENTES C, ZONAS Z WHERE C.zona_cod = Z.zona_cod AND C.terc_nit = :nit INTO :codzona, :nomzona;
            select VEND_NOMBRE from VENDEDORES where VEND_COD = :CODVEND INTO :NOMVEND;
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            BASE = BASE * -1;
            IVA = IVA * -1;
            CANTIDAD = CANTIDAD * -1;
            CONSUMO = CONSUMO * -1;
            TOTAL = TOTAL * -1;
            if (CEROS = 'S') then
                SUSPEND;
            ELSE
                if ((BASE <> 0) AND (CANTIDAD <> 0)) then
                    SUSPEND;
            END /* FOR */
        END
    if (BIN_AND(TIPO, 8) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 34 INTO :NOMTIPO;
        FOR SELECT MAX(D.ARTI_COD), MAX(VEND_COD), SUM(PEDE_CANT * PEDE_FACTOR), SUM((PEDE_TOTAL-PEDE_IVAMONTO-PEDE_CONSUMO)*PEDI_FACTOR), SUM(PEDE_IVAMONTO*PEDI_FACTOR), SUM(PEDE_CONSUMO), SUM(PEDE_TOTAL*PEDI_FACTOR),
            MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD), MAX(P.terc_nit), MAX(P.pedi_nomterc), MAX(P.pedi_sucursal)
            FROM PEDIDOS_DETALLE D, PEDIDOS P, PREFIJOS R, ARTICULO A
            WHERE P.PEDI_ID = D.PEDI_ID AND P.PREF_PRE = R.PREF_PRE AND R.TIDO_COD = 34 AND D.ARTI_COD = A.arti_cod AND
            VEND_COD >= :DESDE AND VEND_COD <= :HASTA AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            PEDI_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY P.vend_cod, P.terc_nit, P.pedi_sucursal, D.arti_cod
            INTO :ARTICULO, :CODVEND, :CANTIDAD, :BASE, :IVA, :CONSUMO, :TOTAL,
            :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :nit, :nomcliente, :sucursal
            DO
            BEGIN
            SELECT C.ZONA_COD, ZONA_NOM FROM CLIENTES C, ZONAS Z WHERE C.zona_cod = Z.zona_cod AND C.terc_nit = :nit INTO :codzona, :nomzona;
            select VEND_NOMBRE from VENDEDORES where VEND_COD = :CODVEND INTO :NOMVEND;
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            if (CEROS = 'S') then
                SUSPEND;
            ELSE
                if ((BASE <> 0) AND (CANTIDAD <> 0)) then
                    SUSPEND;
            END /* FOR */
        END
    if (BIN_AND(TIPO, 16) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 35 INTO :NOMTIPO;
        FOR SELECT MAX(D.ARTI_COD), MAX(VEND_COD), SUM(CTDE_CANT * CTDE_FACTOR), SUM((CTDE_TOTAL-CTDE_IVAMONTO-CTDE_CONSUMO)*COTI_FACTOR), SUM(CTDE_IVAMONTO*COTI_FACTOR), SUM(CTDE_CONSUMO), SUM(CTDE_TOTAL*COTI_FACTOR),
            MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD), MAX(C.terc_nit), MAX(C.coti_nomterc), MAX(C.coti_sucursal)
            FROM COTIZACIONES_DETALLE D, COTIZACIONES C, PREFIJOS P, ARTICULO A
            WHERE C.COTI_ID = D.COTI_ID AND P.PREF_PRE = C.PREF_PRE AND P.TIDO_COD = 35 AND D.ARTI_COD = A.arti_cod AND
            VEND_COD >= :DESDE AND VEND_COD <= :HASTA AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND COTI_FECHA >= :FECINI AND COTI_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            COTI_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY C.vend_cod, C.terc_nit, C.coti_sucursal, D.arti_cod
            INTO :ARTICULO, :CODVEND, :CANTIDAD, :BASE, :IVA, :CONSUMO, :TOTAL,
            :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :nit, :nomcliente, :sucursal
            DO
            BEGIN
            SELECT C.ZONA_COD, ZONA_NOM FROM CLIENTES C, ZONAS Z WHERE C.zona_cod = Z.zona_cod AND C.terc_nit = :nit INTO :codzona, :nomzona;
            select VEND_NOMBRE from VENDEDORES where VEND_COD = :CODVEND INTO :NOMVEND;
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            if (CEROS = 'S') then
                SUSPEND;
            ELSE
                if ((BASE <> 0) AND (CANTIDAD <> 0)) then
                    SUSPEND;
            END /* FOR */
        END
    END
if (zona = 'S') then
    BEGIN
    if (BIN_AND(TIPO, 1) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 31 INTO :NOMTIPO;
        FOR SELECT MAX(D.ARTI_COD), MAX(F.VEND_COD), SUM(FADE_CANT * FADE_FACTOR), SUM((FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO)*FACT_FACTOR), SUM(FADE_IVAMONTO*FACT_FACTOR), SUM(FADE_CONSUMO), SUM(FADE_TOTAL*FACT_FACTOR),
            MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD), MAX(F.terc_nit), MAX(F.fact_nomcliente), MAX(F.fact_sucursal)
            FROM FACTURAS_DETALLE D, FACTURAS F, PREFIJOS P, ARTICULO A, clientes C, ZONAS Z
            WHERE F.FACT_ID = D.FACT_ID AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND D.ARTI_COD = A.arti_cod AND
            F.VEND_COD >= :DESDE AND F.VEND_COD <= :HASTA AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            FACT_ANULADO = 'N' AND ((P.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) AND F.terc_nit = C.terc_nit AND
            Z.zona_cod = C.zona_cod AND C.zona_cod >= :zonaini AND C.zona_cod <= :zonafin and substring(a.arti_cod from 1 FOR 2) <> '.t'
            GROUP BY F.VEND_COD, C.zona_cod ,D.ARTI_COD , C.terc_nit, F.fact_sucursal
            INTO :ARTICULO, :CODVEND, :CANTIDAD, :BASE, :IVA, :CONSUMO, :TOTAL,
            :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :nit, :nomcliente, :sucursal
            DO
            BEGIN
            select VEND_NOMBRE from VENDEDORES where VEND_COD = :CODVEND INTO :NOMVEND;
            SELECT C.ZONA_COD, ZONA_NOM FROM CLIENTES C, ZONAS Z WHERE C.zona_cod = Z.zona_cod AND C.terc_nit = :nit /*AND Z.zona_cod >= :zonaini AND Z.zona_cod >= :zonafin*/ INTO :codzona, :nomzona;
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            if (CEROS = 'S') then
                SUSPEND;
            ELSE
                if ((BASE <> 0) AND (CANTIDAD <> 0)) then
                    SUSPEND;
            END /* FOR */
        END
    if (BIN_AND(TIPO, 2) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 32 INTO :NOMTIPO;
        FOR SELECT MAX(D.ARTI_COD), MAX(R.VEND_COD), SUM(RVDE_CANT * RVDE_FACTOR), SUM(RVDE_TOTAL-RVDE_IVAMONTO-RVDE_CONSUMO), SUM(RVDE_IVAMONTO), SUM(RVDE_CONSUMO), SUM(RVDE_TOTAL),
            MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD), MAX(R.terc_nit), MAX(R.revt_nomterc), MAX(R.revt_sucursal)
            FROM REMISIONES_VENTA_DETALLE D, REMISIONES_VENTA R, PREFIJOS P, ARTICULO A, clientes C, ZONAS Z
            WHERE R.REVT_ID = D.REVT_ID AND P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = 32 AND D.ARTI_COD = A.arti_cod AND
            R.VEND_COD >= :DESDE AND R.VEND_COD <= :HASTA AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            REVT_ANULADO = 'N' AND ((P.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))AND R.terc_nit = C.terc_nit AND
            Z.zona_cod = C.zona_cod AND C.zona_cod >= :zonaini AND C.zona_cod <= :zonafin
            GROUP BY R.vend_cod, c.zona_cod, D.arti_cod , R.terc_nit
            INTO :ARTICULO, :CODVEND, :CANTIDAD, :BASE, :IVA, :CONSUMO, :TOTAL,
            :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :nit, :nomcliente, :sucursal
            DO
            BEGIN
            SELECT C.ZONA_COD, ZONA_NOM FROM CLIENTES C, ZONAS Z WHERE C.zona_cod = Z.zona_cod AND C.terc_nit = :nit INTO :codzona, :nomzona;
            select VEND_NOMBRE from VENDEDORES where VEND_COD = :CODVEND INTO :NOMVEND;
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            if (CEROS = 'S') then
                SUSPEND;
            ELSE
                if ((BASE <> 0) AND (CANTIDAD <> 0)) then
                    SUSPEND;
            END /* FOR */
        END
    if (BIN_AND(TIPO, 4) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 33 INTO :NOMTIPO;
        FOR SELECT MAX(D.ARTI_COD), MAX(V.VEND_COD), SUM(DVDE_CANT * DVDE_FACTOR), SUM((DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO)*DEVT_FACTOR), SUM(DVDE_IVAMONTO*DEVT_FACTOR), SUM(DVDE_CONSUMO), SUM(DVDE_TOTAL*DEVT_FACTOR),
            MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD), MAX(V.terc_nit), MAX(V.devt_nomterc), MAX(V.devt_sucursal)
            FROM devoluciones_ventas_detalle D, DEVOLUCIONES_VENTAS V, PREFIJOS P, ARTICULO A, clientes C, ZONAS Z
            WHERE V.DEVT_ID = D.DEVT_ID AND P.PREF_PRE = V.PREF_PRE AND P.TIDO_COD = 33 AND D.ARTI_COD = A.arti_cod AND
            V.VEND_COD >= :DESDE AND V.VEND_COD <= :HASTA AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            DEVT_ANULADO = 'N' AND ((P.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))AND V.terc_nit = C.terc_nit AND
            Z.zona_cod = C.zona_cod AND C.zona_cod >= :zonaini AND C.zona_cod <= :zonafin
            GROUP BY V.vend_cod, c.zona_cod, D.arti_cod , V.terc_nit
            INTO :ARTICULO, :CODVEND, :CANTIDAD, :BASE, :IVA, :CONSUMO, :TOTAL,
            :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :nit, :nomcliente, :sucursal
            DO
            BEGIN
            SELECT C.ZONA_COD, ZONA_NOM FROM CLIENTES C, ZONAS Z WHERE C.zona_cod = Z.zona_cod AND C.terc_nit = :nit INTO :codzona, :nomzona;
            select VEND_NOMBRE from VENDEDORES where VEND_COD = :CODVEND INTO :NOMVEND;
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            BASE = BASE * -1;
            IVA = IVA * -1;
            CANTIDAD = CANTIDAD * -1;
            CONSUMO = CONSUMO * -1;
            TOTAL = TOTAL * -1;
            if (CEROS = 'S') then
                SUSPEND;
            ELSE
                if ((BASE <> 0) AND (CANTIDAD <> 0)) then
                    SUSPEND;
            END /* FOR */
        END
    if (BIN_AND(TIPO, 8) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 34 INTO :NOMTIPO;
        FOR SELECT MAX(D.ARTI_COD), MAX(P.VEND_COD), SUM(PEDE_CANT * PEDE_FACTOR), SUM((PEDE_TOTAL-PEDE_IVAMONTO-PEDE_CONSUMO)*PEDI_FACTOR), SUM(PEDE_IVAMONTO*PEDI_FACTOR), SUM(PEDE_CONSUMO), SUM(PEDE_TOTAL*PEDI_FACTOR),
            MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD), MAX(P.terc_nit), MAX(P.pedi_nomterc), MAX(P.pedi_sucursal)
            FROM PEDIDOS_DETALLE D, PEDIDOS P, PREFIJOS R, ARTICULO A, clientes C, ZONAS Z
            WHERE P.PEDI_ID = D.PEDI_ID AND P.PREF_PRE = R.PREF_PRE AND R.TIDO_COD = 34 AND D.ARTI_COD = A.arti_cod AND
            P.VEND_COD >= :DESDE AND P.VEND_COD <= :HASTA AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            PEDI_ANULADO = 'N' AND ((R.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))AND P.terc_nit = C.terc_nit AND
            Z.zona_cod = C.zona_cod AND C.zona_cod >= :zonaini AND C.zona_cod <= :zonafin
            GROUP BY P.vend_cod, c.zona_cod, D.arti_cod , P.terc_nit
            INTO :ARTICULO, :CODVEND, :CANTIDAD, :BASE, :IVA, :CONSUMO, :TOTAL,
            :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :nit, :nomcliente, :sucursal
            DO
            BEGIN
            SELECT C.ZONA_COD, ZONA_NOM FROM CLIENTES C, ZONAS Z WHERE C.zona_cod = Z.zona_cod AND C.terc_nit = :nit INTO :codzona, :nomzona;
            select VEND_NOMBRE from VENDEDORES where VEND_COD = :CODVEND INTO :NOMVEND;
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            if (CEROS = 'S') then
                SUSPEND;
            ELSE
                if ((BASE <> 0) AND (CANTIDAD <> 0)) then
                    SUSPEND;
            END /* FOR */
        END
    if (BIN_AND(TIPO, 16) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 35 INTO :NOMTIPO;
        FOR SELECT MAX(D.ARTI_COD), MAX(C.VEND_COD), SUM(CTDE_CANT * CTDE_FACTOR), SUM((CTDE_TOTAL-CTDE_IVAMONTO-CTDE_CONSUMO)*COTI_FACTOR), SUM(CTDE_IVAMONTO*COTI_FACTOR), SUM(CTDE_CONSUMO), SUM(CTDE_TOTAL*COTI_FACTOR),
            MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD), MAX(C.terc_nit), MAX(C.coti_nomterc), MAX(C.coti_sucursal)
            FROM COTIZACIONES_DETALLE D, COTIZACIONES C, PREFIJOS P, ARTICULO A, clientes T, ZONAS Z
            WHERE C.COTI_ID = D.COTI_ID AND P.PREF_PRE = C.PREF_PRE AND P.TIDO_COD = 35 AND D.ARTI_COD = A.arti_cod AND
            C.VEND_COD >= :DESDE AND C.VEND_COD <= :HASTA AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND COTI_FECHA >= :FECINI AND COTI_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            COTI_ANULADO = 'N' AND ((P.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))AND C.terc_nit = T.terc_nit AND
            Z.zona_cod = T.zona_cod AND T.zona_cod >= :zonaini AND T.zona_cod <= :zonafin
            GROUP BY C.vend_cod, t.zona_cod, D.arti_cod , C.terc_nit
            INTO :ARTICULO, :CODVEND, :CANTIDAD, :BASE, :IVA, :CONSUMO, :TOTAL,
            :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :nit, :nomcliente, :sucursal
            DO
            BEGIN
            SELECT C.ZONA_COD, ZONA_NOM FROM CLIENTES C, ZONAS Z WHERE C.zona_cod = Z.zona_cod AND C.terc_nit = :nit INTO :codzona, :nomzona;
            select VEND_NOMBRE from VENDEDORES where VEND_COD = :CODVEND INTO :NOMVEND;
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            if (CEROS = 'S') then
                SUSPEND;
            ELSE
                if ((BASE <> 0) AND (CANTIDAD <> 0)) then
                    SUSPEND;
            END /* FOR */
        END
    END
END
^

SET TERM ; ^

/* 20091006e */
/* RANGO DE SUBGRUPOS EN FORMULAS */

SET TERM ^ ;

CREATE OR ALTER procedure FORMULA_PRECIOS (
    ORIGEN integer,
    DESTINO integer,
    OPER char(1),
    VALOR numeric(18,4),
    DECIMALES integer,
    IVA char(2),
    CODINI varchar(20),
    CODFIN varchar(20),
    GRPINI varchar(2),
    GRPFIN varchar(2),
    SUBINI varchar(3),
    SUBFIN varchar(3),
    MARINI varchar(3),
    MARFIN varchar(3))
AS
declare variable COD VARCHAR(20);
declare variable FIJO NUMERIC(18,4);
declare variable TIVA NUMERIC(9,2);
declare variable rpta NUMERIC(18,4);
declare variable SUBGR VARCHAR(3);
declare variable MARCA VARCHAR(3);
begin
/* BORRE E INSERTE LA LISTA POR SI NO EXISTE */
FOR SELECT P.ARTI_COD, PRAR_FIJO, MARC_COD, SUBG_COD FROM PRECIOS_ARTICULO P, ARTICULO A
    WHERE LIPR_COD = :ORIGEN AND P.ARTI_COD = A.ARTI_COD AND P.ARTI_COD >= :CODINI AND P.ARTI_COD <= :CODFIN AND
        GRUP_COD >= :GRPINI AND GRUP_COD <= :GRPFIN
    ORDER BY P.ARTI_COD INTO :COD, :FIJO, :MARCA, :SUBGR
    DO
    BEGIN
    if ((((MARINI = '0') AND (MARFIN = 'zz')) or
        ((MARCA >= MARINI) AND (MARCA <= MARFIN))) AND
        (((SUBINI = '0') AND (SUBFIN = 'zz')) or
        ((SUBGR >= SUBINI) AND (SUBGR <= SUBFIN)))) then
        BEGIN
        if (OPER = '+') then
            FIJO = FIJO + VALOR;
        if (OPER = '-') then
            FIJO = FIJO - VALOR;
        if (OPER = '*') then
            FIJO = FIJO * VALOR;
        if (OPER = '/') then
            if (VALOR <> 0) then
                FIJO = FIJO / VALOR;
        if (IVA = 'SI') then
            BEGIN
            SELECT TAIV_PORC FROM ARTICULO A, TARIFA_IVA T WHERE A.TAIV_COD = T.TAIV_COD AND A.ARTI_COD = :COD INTO :TIVA;
            /* SI LA ORIGINAL NO TENIA IVA */
            SELECT LIPR_MODIF FROM LISTA_PRECIOS WHERE LIPR_COD = :ORIGEN INTO :IVA;
            if (IVA <> 'S') then
                FIJO = FIJO * (1 + TIVA/100);
            END
        EXECUTE PROCEDURE REDONDEE (FIJO, DECIMALES) returning_values (RPTA);
        UPDATE PRECIOS_ARTICULO SET PRAR_FIJO = :RPTA
            WHERE LIPR_COD = :DESTINO AND ARTI_COD = :COD;
        END
    END
end
^

SET TERM ; ^



/* 20091006f */
SET TERM ^ ;

create or alter procedure CRUCES_DOCUMENTOS_CAJA (
    IDR INTEGER)
returns (
    FORMA VARCHAR(30),
    BANCO VARCHAR(2),
    CUENTA VARCHAR(20),
    NUMERO VARCHAR(20),
    FECHA DATE,
    MONTO NUMERIC(18,2),
    TIPOSAL VARCHAR(8),
    NUMSALIDA VARCHAR(10),
    FECSAL DATE)
as
declare variable TIPOS INTEGER;
declare variable IDS INTEGER;
begin
FOR SELECT FOPA_NOM, RCPA_BANCO, RCPA_CUENTA,
    RCPA_NUMERO, RCPA_FECHA, RCPA_MONTO
    FROM RECIBOS_CAJA_PAGO P, FORMAS_PAGO F
    WHERE P.RECA_ID = :IDR AND F.FOPA_ID = P.FOPA_ID and p.fopa_id <> 1
    ORDER BY RCPA_ITEM
    INTO :FORMA, :BANCO, :CUENTA, :NUMERO, :FECHA, :MONTO
    DO
        BEGIN
        FOR SELECT DPCA_TIPOSAL, DPCA_IDSAL FROM documentos_pago_caja
            WHERE DPCA_BANCO = :BANCO AND DPCA_CUENTA = :CUENTA AND DPCA_NUMERO = :NUMERO
            INTO :TIPOS, :IDS
            DO
            BEGIN
            SELECT TIDO_NOMCORTO FROM tipo_documento WHERE TIDO_COD = :TIPOS INTO :tiposal;
            if (TIPOS = 71) then
                SELECT PRBA_PREF || CONS_NUMERO, CONS_FECHA FROM CONSIGNA WHERE CONS_ID = :IDS INTO :numsalida, :fecsal;
            if (TIPOS = 62) then
                SELECT PREF_PRE || EGRE_NUMERO, EGRE_FECHA FROM EGRESOS WHERE EGRE_ID = :IDS INTO :numsalida, :fecsal;
            if (TIPOS = 63) then
                SELECT PREF_PRE || CADO_NUMERO, CADO_FECHA FROM cambio_documentos WHERE CADO_ID = :IDS INTO :numsalida, :fecsal;
            if (TIPOS = 64) then
                SELECT PREF_PRE || COTJ_NUMERO, COTJ_FECHA FROM consigna_tarjetas WHERE COTJ_ID = :IDS INTO :numsalida, :fecsal;
            if (TIPOS = 66) then
                SELECT PREF_PRE || TRCJ_NUMERO, TRCJ_FECHA FROM traslados_caja WHERE TRCJ_ID = :IDS INTO :numsalida, :fecsal;
            if (TIPOS = 0) then
                BEGIN
                TIPOSAL = 'EN CAJA';
                NUMSALIDA = '';
                END
            SUSPEND;
            END
        END
end
^

SET TERM ; ^

GRANT EXECUTE ON PROCEDURE cruces_documentos_caja TO PUBLIC;


/* 20091007 TIENDA VIRTUAL */

ALTER TABLE GRUPO ADD GRUP_IDTIENDA T_ID;
ALTER TABLE MARCAS ADD MARC_TIENDA T_ID;
ALTER TABLE ARTICULO ADD ARTI_TIENDA T_BOOLEANO;
ALTER TABLE TARIFA_IVA ADD TAIV_TIENDA T_ID;

update ARTICULO SET ARTI_TIENDA = 'N' WHERE ARTI_TIENDA IS NULL;

INSERT INTO CONFIGURACION (CONF_MODULO, CONF_CATEGORIA, CONF_PROPIEDAD, CONF_VALOR, CONF_POSIBLES, CONF_AYUDA) VALUES ('FACTURACION', 'TIENDAV', 'CODIGO DE LA LISTA DE PRECIOS A PUBLICAR EN LA TIENDA VIRTUAL', '0', '', 'Indique el código de la lista de precios que se publicará en la tienda virtual en internet');
INSERT INTO CONFIGURACION (CONF_MODULO, CONF_CATEGORIA, CONF_PROPIEDAD, CONF_VALOR, CONF_POSIBLES, CONF_AYUDA) VALUES ('FACTURACION', 'TIENDAV', 'CODIGO DEL LENGUAJE A REPORTAR A LA TIENDA VIRTUAL', '3', '1,2,3,4,5', 'Indique el código de lenguaje para subir las descripciones a la tienda virtual');
INSERT INTO CONFIGURACION (CONF_MODULO, CONF_CATEGORIA, CONF_PROPIEDAD, CONF_VALOR, CONF_POSIBLES, CONF_AYUDA) VALUES ('FACTURACION', 'TIENDAV', 'SUBIR CANTIDADES DISPONIBLES A LA TIENDA VIRTUAL', 'SI', 'SI,NO', 'SI:Reporta la cantidad actual disponible como un dato del artículo en la tienda virtual');
commit work;


CREATE TABLE CONFIGURA_TIENDAV (
    COTV_URLADMIN    VARCHAR(255) CHARACTER SET NONE NOT NULL,
    COTV_USUARIOADM  VARCHAR(25) CHARACTER SET NONE,
    COTV_CLAVEADM    VARCHAR(25) CHARACTER SET NONE,
    COTV_HOSTFTP     VARCHAR(255) CHARACTER SET NONE,
    COTV_USUARIOFTP  VARCHAR(25) CHARACTER SET NONE,
    COTV_CLAVEFTP    VARCHAR(25) CHARACTER SET NONE,
    COTV_DIRADMIN    VARCHAR(255) CHARACTER SET NONE,
    COTV_DIRIMAGES   VARCHAR(255) CHARACTER SET NONE,
    COTV_LISTA       VARCHAR(30) CHARACTER SET NONE,
    COTV_FECULT      DATE,
    COTV_DBTIENDA    VARCHAR(100) CHARACTER SET NONE
);

ALTER TABLE CONFIGURA_TIENDAV ADD CONSTRAINT PK_CONFIGURA_TIENDAV PRIMARY KEY (COTV_URLADMIN);

INSERT INTO CONFIGURA_TIENDAV (COTV_URLADMIN, COTV_USUARIOADM, COTV_CLAVEADM, COTV_HOSTFTP, COTV_USUARIOFTP, COTV_CLAVEFTP, COTV_DIRADMIN, COTV_DIRIMAGES, COTV_FECULT, COTV_DBTIENDA) VALUES ('localhost', 'root', '', 'localhost', 'admin', '', '/admin', '/catalog/images', '1-JUN-2009', 'tienda');
COMMIT WORK;

ALTER TABLE CONFIGURA_TIENDAV DROP COTV_LISTA;



/* 20091007b */
/* SI SE PEDIA CON DETALLE DE IVA E INCLUYENDO ANULADOS SUMABA EL IVA DE LOS ANULADOS */
SET TERM ^ ;

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

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

SET TERM ; ^



/* 20091007c */
/* TABLA HISTORICA DE PROMEDIOS DE SALIDAS POR ARTICULO */
CREATE TABLE PROMEDIO_SALIDAS (
    ARTI_COD       T_COD_ARTICULO NOT NULL /* T_COD_ARTICULO = VARCHAR(15) */,
    BODE_COD       VARCHAR(2) NOT NULL,
    PRSA_PROMEDIO  T_CANTIDAD /* T_CANTIDAD = NUMERIC(18,4) */,
    PRSA_FECHA     DATE NOT NULL
);
ALTER TABLE PROMEDIO_SALIDAS ADD CONSTRAINT PK_PROMEDIO_SALIDAS PRIMARY KEY (ARTI_COD, BODE_COD, PRSA_FECHA);

SET TERM ^ ;

CREATE OR ALTER procedure PROMEDIO_SALIDAS_ARTICULO (
    ARTICULO varchar(15),
    FECHA date,
    BODEGA varchar(2))
returns (
    PROMEDIO numeric(18,4),
    SALIDAS numeric(18,4))
AS
declare variable FECINI DATE;
declare variable DIASC VARCHAR(255);
declare variable DIAS INTEGER;
declare variable DIA_ART VARCHAR(2) CHARACTER SET NONE;
declare variable INCSALI VARCHAR(2);
declare variable SININV VARCHAR(2);
declare variable saldo numeric(18,2);
BEGIN
SELECT FIRST 1 PRSA_PROMEDIO, PRSA_FECHA FROM promedio_salidas WHERE ARTI_COD = :articulo AND BODE_COD = :bodega ORDER BY PRSA_FECHA INTO :promedio, :fecini;
if (((FECHA - FECINI) > 7) or (FECINI IS NULL) or (PROMEDIO IS NULL) ) then
  BEGIN
  EXECUTE PROCEDURE lee_configuracion ('INVENTARIO', 'EXISTENCIAS', 'INCLUIR SALIDAS POR CONCEPTOS DIFERENTES A VENTA EN CALCULO DE PROMEDIO DE SALIDAS POR ARTICULO') returning_values (INCSALI);
  /*DE ACUERDO A PARAMETRO TOME LOS DIAS PARA EL PROMDIO*/
  EXECUTE PROCEDURE lee_configuracion ('INVENTARIO', 'EXISTENCIAS', 'PROMEDIAR LAS SALIDAS DEL INVENTARIO CON EL NUMERO DE DIAS ASIGNADO A CADA ARTICULO') returning_values (:DIA_ART);
  /* SUME LAS CANTIDADES SALIDAS DEL INVENTARIO */
  EXECUTE PROCEDURE lee_configuracion ('INVENTARIO', 'EXISTENCIAS', 'NUMERO DE DIAS PARA PROMEDIO DE SALIDAS POR ARTICULO') returning_values (DIASC);
  EXECUTE PROCEDURE lee_configuracion ('INVENTARIO', 'EXISTENCIAS', 'INCLUIR DIAS SIN EXISTENCIA EN PROMEDIO DE VENTAS DIARIO') returning_values (:SININV);
  if (DIA_ART = 'SI') then
    BEGIN
      SELECT ARTI_DIANALIS FROM ARTICULO WHERE ARTI_COD = :ARTICULO INTO :DIAS;
    END
  ELSE
     DIAS = CAST(DIASC AS INTEGER);
  if (DIAS IS NULL) then
    DIAS = 30;
  FECINI = FECHA - DIAS;
  if (INCSALI = 'SI') then
      SELECT SUM(MVAR_CANT) FROM MOVIMIENTO_ARTICULO
        WHERE ARTI_COD = :ARTICULO AND BODE_COD = :BODEGA AND MVAR_FECHA >= :FECINI AND MVAR_FECHA <= :FECHA AND MVAR_ENTRADA = 'N' AND MVAR_TIPODOC <> 13 INTO :SALIDAS;
  else
      SELECT SUM(MVAR_CANT) FROM MOVIMIENTO_ARTICULO
        WHERE ARTI_COD = :ARTICULO AND BODE_COD = :BODEGA AND MVAR_FECHA >= :FECINI AND MVAR_FECHA <= :FECHA AND ((MVAR_TIPODOC = 31) or (MVAR_TIPODOC = 32)) INTO :SALIDAS;
  if (SALIDAS IS NULL) then
    SALIDAS = 0;
  if (SININV = 'SI') then
      PROMEDIO = SALIDAS / DIAS;
  else
    begin
    dias = 0;
    while (fecini < fecha) do
        begin
        execute procedure saldo_inventario (:articulo, :bodega, :fecini) returning_values (:saldo);
        if (SALDO <> 0) then
            DIAS = DIAS + 1;
        fecini = fecini + 1;
        end
    if (DIAS = 0) then
        PROMEDIO = 0;
    ELSE
        PROMEDIO = SALIDAS / DIAS;
    end
  UPDATE or INSERT INTO promedio_salidas (ARTI_COD, BODE_COD, PRSA_FECHA, PRSA_PROMEDIO)
    VALUES (:articulo, :bodega, :fecha, :promedio);
  END
SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE DISPONIBILIDAD_ARTICULO(
    ARTICULO VARCHAR(15),
    FECHA DATE,
    BODEGA VARCHAR(2))
RETURNS (
    DISPONIBILIDAD INTEGER,
    EXIST NUMERIC(18,4),
    PROMEDIO NUMERIC(18,4),
    SALIDAS NUMERIC(18,4))
AS
BEGIN /*$$IBE$$ 
  EXECUTE PROCEDURE SALDO_INVENTARIO (ARTICULO, BODEGA, FECHA) returning_values (:EXIST);
  EXECUTE PROCEDURE PROMEDIO_SALIDAS_ARTICULO(:ARTICULO, :FECHA, :BODEGA) returning_values (:PROMEDIO, :SALIDAS);
  if (PROMEDIO > 0) then
    DISPONIBILIDAD = EXIST / PROMEDIO;
  ELSE
    DISPONIBILIDAD = 0;
  SUSPEND;
 $$IBE$$*/ SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE EXISTENCIAS_COMPRAS(
    ARTICULO VARCHAR(15),
    FECHA DATE,
    UNIDAD VARCHAR(8))
RETURNS (
    BODEGA VARCHAR(2),
    EXISTENCIA NUMERIC(18,2),
    RESERVADO NUMERIC(18,2),
    ORDENADO NUMERIC(18,2),
    PROMEDIO NUMERIC(18,2),
    VENTAMES NUMERIC(18,2),
    FECHACMP DATE,
    CANTCMP NUMERIC(18,2),
    DIAS INTEGER,
    SUGERIDO NUMERIC(18,2),
    STAND VARCHAR(20))
AS
 /*$$IBE$$ declare variable FACTOR NUMERIC(15,4);
declare variable ORDENC NUMERIC(18,4);
declare variable PEDIDO NUMERIC(18,4);
declare variable ITEM INTEGER;
declare variable ID INTEGER;
declare variable UND VARCHAR(8);
declare variable CANT NUMERIC(18,4);
declare variable FACTOR2 NUMERIC(18,4);
declare variable fecini DATE;
declare variable FECHAAUX VARCHAR(10);
declare variable AGENCIA INTEGER;
declare variable DEVMES NUMERIC(18,2);
declare variable MFAC INTEGER;
declare variable MDEV INTEGER;
declare variable IVAF NUMERIC(18,2);
declare variable IVAD NUMERIC(18,2);
declare variable DIA_ART VARCHAR(2) CHARACTER SET NONE;
declare variable DIASC VARCHAR(255);
declare variable PEDAUTO CHAR(2);
declare variable SALIDAS NUMERIC(18,4); $$IBE$$*/ 
BEGIN /*$$IBE$$ 
  for select bode_cod, SUCU_ID from bodega into :bodega, :agencia
    do
    begin
    execute procedure saldo_inventario (:articulo, :bodega, :fecha) returning_values (:Existencia);
    EXECUTE PROCEDURE FACTOR_UNIDAD_CANT(:ARTICULO, :UNIDAD) returning_values (:FACTOR);
    if (FACTOR <> 0) then
        EXISTENCIA = EXISTENCIA / FACTOR;
    else
        EXISTENCIA = 0;
    STAND = '';
    SELECT STAND_COD FROM STANDS WHERE ARTI_COD = :ARTICULO AND STAND_BODEGA = :BODEGA INTO :stand;
    EXECUTE PROCEDURE promedio_salidas_articulo (:ARTICULO, :FECHA, :BODEGA) returning_values (:PROMEDIO, :SALIDAS);
    EXECUTE PROCEDURE lee_configuracion ('INVENTARIO', 'EXISTENCIAS', 'PROMEDIAR LAS SALIDAS DEL INVENTARIO CON EL NUMERO DE DIAS ASIGNADO A CADA ARTICULO') returning_values (:DIA_ART);
    if (DIA_ART = 'NO') then
        BEGIN
        EXECUTE PROCEDURE lee_configuracion ('INVENTARIO', 'EXISTENCIAS', 'NUMERO DE DIAS PARA PROMEDIO DE SALIDAS POR ARTICULO') returning_values (DIASC);
        DIAS = CAST(DIASC AS INTEGER);
        END
    ELSE
        SELECT ARTI_DIAS FROM ARTICULO WHERE ARTI_COD = :ARTICULO INTO :DIAS;
    if (DIAS is null) then
        DIAS = 0;
    PROMEDIO = DIAS * PROMEDIO;
    if (FACTOR <> 0) then
        PROMEDIO = PROMEDIO / FACTOR;
    SUGERIDO = PROMEDIO - EXISTENCIA;
    SELECT SUM(ORID_ENTREGAR)
      FROM ORDENINVENTARIO_DETALLE OD, ordenes_inventario O
      WHERE O.ORIN_ID = OD.ORIN_ID AND ARTI_COD = :ARTICULO AND ORIN_FECHA <= :FECHA AND ORIN_FECLLEGA >= :FECHA AND ORID_ANULADO = 'N' AND OD.BODE_COD = :BODEGA
      INTO :ORDENADO;
    if (ORDENADO IS NULL) then
        ORDENADO = 0;
    ORDENC = 0;
    FOR SELECT O.ORDC_ID, OCDE_ITEM, OCDE_CANT * OCDE_FACTOR
        FROM ORDENES_COMPRA O, ORDENES_COMPRA_DETALLE OD
        WHERE O.ORDC_ID = OD.ORDC_ID AND OD.ARTI_COD = :ARTICULO AND (ORDC_FECHA+ORDC_VALIDEZ) >= :FECHA AND ORDC_FECHA <= :FECHA AND OCDE_ANULADO = 'N' AND OD.BODE_COD = :BODEGA
        INTO :ID, :ITEM, :CANT
        do
        BEGIN
        EXECUTE PROCEDURE FALTANTE(23, 21, ID, ITEM) returning_values (PEDIDO, UND, FACTOR2);
        if (PEDIDO * FACTOR2 = CANT) then  $$IBE$$*/ /* SI NO SE HA FACTURADO MIRE A VER SI SE REMISIONO */ /*$$IBE$$ 
            EXECUTE PROCEDURE FALTANTE(23, 22, ID, ITEM) returning_values (PEDIDO, UND, FACTOR2);
        if (PEDIDO IS NULL) then
            PEDIDO = 0;
        ORDENC = ORDENC + PEDIDO * FACTOR2;
        END
    ORDENADO = ORDENADO + ORDENC;
    if (FACTOR <> 0) then
        ORDENADO = ORDENADO / FACTOR;
    SELECT SUM(RSDE_LIBERAR)
      FROM RESERVAS_DETALLE RD, RESERVAS R
      WHERE R.RESE_ID = RD.RESE_ID AND ARTI_COD = :ARTICULO AND RESE_FECHA <= :FECHA AND RESE_VENCE >= :FECHA AND RD.BODE_COD = :BODEGA AND RSDE_ANULADO = 'N'
      INTO :RESERVADO;
    if (RESERVADO IS NULL) then
        RESERVADO = 0;
    PEDIDO = 0;
    FOR SELECT P.PEDI_ID, PEDE_ITEM, PEDE_CANT * PEDE_FACTOR
        FROM PEDIDOS P, PEDIDOS_DETALLE PD
        WHERE P.PEDI_ID = PD.PEDI_ID AND PD.ARTI_COD = :ARTICULO AND (PEDI_FECHA+PEDI_VALIDEZ) >= :FECHA AND PEDI_FECHA <= :FECHA AND PEDE_ANULADO = 'N' AND BODE_COD = :BODEGA
        INTO :ID, :ITEM, :CANT
        do
        BEGIN
        EXECUTE PROCEDURE FALTANTE(34, 31, ID, ITEM) returning_values (ORDENC, UND, FACTOR2);
        EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION', 'FACTURAS', 'GENERAR PEDIDO AUTOMATICAMENTE CON LA FACTURA') returning_values (pedauto);
        if ((ORDENC * FACTOR2 = CANT) or (PEDAUTO = 'SI')) then  $$IBE$$*/ /* SI NO SE HA FACTURADO MIRE A VER SI SE REMISIONO */ /*$$IBE$$ 
            EXECUTE PROCEDURE FALTANTE(34, 32, ID, ITEM) returning_values (ORDENC, UND, FACTOR2);
        if (ORDENC IS NULL) then
            ORDENC = 0;
        PEDIDO = PEDIDO + ORDENC * FACTOR2;
        END
    RESERVADO = RESERVADO + PEDIDO;
    if (FACTOR <> 0) then
        RESERVADO = RESERVADO / FACTOR;
     $$IBE$$*/ /* VENTAS MES */ /*$$IBE$$ 
    FECHAAUX = CAST (FECHA AS VARCHAR(10));
    FECHAAUX = SUBSTR(FECHAAUX, 1, 7) || '/01';
    FECINI = CAST (FECHAAUX AS DATE);
    EXECUTE PROCEDURE ventas_articulo (:ARTICULO, :FECINI, :FECHA, :agencia) returning_values (:ventames, :mfac, :devmes, :mdev, :ivaf, :ivad);
    ventames = ventames - devmes;
    if (FACTOR <> 0) then
        ventames = ventames / FACTOR;
     $$IBE$$*/ /* FECHA COMPRA */ /*$$IBE$$ 
    fechacmp = null;
    cantcmp = 0;
    SELECT FIRST 1 FACO_FECHA, FCDE_CANT * FCDE_FACTOR FROM FACTURAS_COMPRA F, FACTURAS_COMPRAS_DETALLE D
        WHERE F.FACO_ID = D.faco_id AND D.ARTI_COD = :articulo AND FACO_FECHA <= :FECHA AND D.bode_cod = :BODEGA
        ORDER BY FACO_FECHA DESC, F.FACO_ID DESC
        INTO :fechacmp, :cantcmp;
    SUSPEND;
    end
 $$IBE$$*/ SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER PROCEDURE MAXIMO_ARTICULO(
    ARTICULO VARCHAR(15),
    FECHA DATE,
    BODEGA CHAR(2),
    CANT NUMERIC(18,2))
RETURNS (
    EXCESO NUMERIC(18,2))
AS
 /*$$IBE$$ declare variable DIAS CHAR(2);
declare variable PROMEDIO NUMERIC(18,4);
declare variable SALIDAS NUMERIC(18,4);
declare variable MAXIMO NUMERIC(18,4);
declare variable SALDO NUMERIC(18,4); $$IBE$$*/ 
BEGIN
  /* CUANDO CONFIGURACION MINIMO EN DIAS */ /*$$IBE$$ 
  EXECUTE PROCEDURE LEE_CONFIGURACION ('INVENTARIO', 'EXISTENCIAS', 'MAXIMO INVENTARIO EN DIAS') returning_values (DIAS);
  if (DIAS = 'SI') then
    BEGIN
    EXECUTE PROCEDURE PROMEDIO_SALIDAS_ARTICULO(:ARTICULO, :FECHA, :BODEGA) returning_values (:PROMEDIO, :SALIDAS);
    SELECT ARTI_MAX * :PROMEDIO FROM ARTICULO WHERE ARTI_COD = :ARTICULO INTO :MAXIMO;
    end
  ELSE
    BEGIN
    SELECT ARTI_MAX FROM ARTICULO WHERE ARTI_COD = :ARTICULO INTO :MAXIMO;
    END
  if (MAXIMO IS NULL) then
    MAXIMO = 0;
  EXECUTE PROCEDURE SALDO_INVENTARIO(:ARTICULO, :BODEGA, :FECHA) returning_values (SALDO);
  if (SALDO+CANT > maximo) then
    EXCESO = MAXIMO - (SALDO+CANT);
  ELSE
    EXCESO = 0;
  SUSPEND;
 $$IBE$$*/ SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE MINIMO_ARTICULO(
    ARTICULO VARCHAR(15),
    FECHA DATE,
    BODEGA CHAR(2))
RETURNS (
    MINIMO NUMERIC(18,4))
AS
 /*$$IBE$$ declare variable DIAS CHAR(2);
declare variable PROMEDIO NUMERIC(18,4);
declare variable SALIDAS NUMERIC(18,4); $$IBE$$*/ 
BEGIN
  /* CUANDO CONFIGURACION MINIMO EN DIAS */ /*$$IBE$$ 
  EXECUTE PROCEDURE LEE_CONFIGURACION ('INVENTARIO', 'EXISTENCIAS', 'MINIMO INVENTARIO EN DIAS') returning_values (DIAS);
  if (DIAS = 'SI') then
    BEGIN
    EXECUTE PROCEDURE PROMEDIO_SALIDAS_ARTICULO(:ARTICULO, :FECHA, :BODEGA) returning_values (:PROMEDIO, :SALIDAS);
    SELECT ARTI_DIAS * :PROMEDIO FROM ARTICULO WHERE ARTI_COD = :ARTICULO INTO :MINIMO;
    end
  ELSE
    BEGIN
    SELECT ARTI_MIN FROM ARTICULO WHERE ARTI_COD = :ARTICULO INTO :MINIMO;
    END
  if (MINIMO IS NULL) then
    MINIMO = 0;
  SUSPEND;
 $$IBE$$*/ SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

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

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE ORDEN_SUGERIDA(
    PROVEEDOR VARCHAR(20),
    FECHA DATE)
RETURNS (
    ARTICULO VARCHAR(15),
    BODEGA VARCHAR(2),
    CANT NUMERIC(18,4),
    UNIDAD VARCHAR(8),
    COSTO NUMERIC(18,2))
AS
 /*$$IBE$$ declare variable FACTOR NUMERIC(15,4);
declare variable DIAS INTEGER;
declare variable EXISTENCIA NUMERIC(18,4);
declare variable PROMEDIO NUMERIC(18,4);
declare variable AGENCIA INTEGER;
declare variable DIA_ART VARCHAR(2) CHARACTER SET NONE;
declare variable DIASC VARCHAR(255);
declare variable SALIDAS NUMERIC(18,4); $$IBE$$*/ 
BEGIN /*$$IBE$$ 
FOR SELECT a.ARTI_COD, PVAR_COSTO, ARTI_UNIDAD, ARTI_DIAS FROM proveedor_articulo p, articulo a
    WHERE p.arti_cod = a.arti_cod and TERC_NIT = :proveedor order by a.arti_des
    INTO :articulo, :costo, :unidad, :DIAS
  DO BEGIN
  for select bode_cod, SUCU_ID from bodega into :bodega, :agencia
    do
    begin
    execute procedure saldo_inventario (:articulo, :bodega, :fecha) returning_values (:Existencia);
    EXECUTE PROCEDURE FACTOR_UNIDAD_CANT(:ARTICULO, :UNIDAD) returning_values (:FACTOR);
    if (FACTOR <> 0) then
        EXISTENCIA = EXISTENCIA / FACTOR;
    else
        EXISTENCIA = 0;
    EXECUTE PROCEDURE promedio_salidas_articulo (:ARTICULO, :FECHA, :BODEGA) returning_values (:PROMEDIO, :SALIDAS);
    EXECUTE PROCEDURE lee_configuracion ('INVENTARIO', 'EXISTENCIAS', 'PROMEDIAR LAS SALIDAS DEL INVENTARIO CON EL NUMERO DE DIAS ASIGNADO A CADA ARTICULO') returning_values (:DIA_ART);
    if (DIA_ART = 'NO') then
        BEGIN
        EXECUTE PROCEDURE lee_configuracion ('INVENTARIO', 'EXISTENCIAS', 'NUMERO DE DIAS PARA PROMEDIO DE SALIDAS POR ARTICULO') returning_values (DIASC);
        DIAS = CAST(DIASC AS INTEGER);
        END
    if (DIAS is null) then
        DIAS = 0;
    PROMEDIO = DIAS * PROMEDIO;
    if (FACTOR <> 0) then
        PROMEDIO = PROMEDIO / FACTOR;
    CANT = PROMEDIO - EXISTENCIA;
    if (CANT > 0) then
        SUSPEND;
    end
  END
 $$IBE$$*/ SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

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

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

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

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE EXISTENCIAS_SOBRE_MAXIMO(
    FECHA DATE,
    ARTINI VARCHAR(20),
    ARTFIN VARCHAR(20),
    GRPINI VARCHAR(2),
    GRPFIN VARCHAR(2),
    ORDEN CHAR(1))
RETURNS (
    CODIGO VARCHAR(15),
    NOMBRE VARCHAR(60),
    CANT NUMERIC(18,4),
    UNIDAD VARCHAR(8),
    CODGRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    CODSUBG VARCHAR(3),
    NOMSUBG VARCHAR(30),
    CODMARC VARCHAR(3),
    NOMMARC VARCHAR(30),
    CODBOD VARCHAR(2),
    NOMBOD VARCHAR(30),
    STAND VARCHAR(20),
    MAXIMO NUMERIC(18,4),
    EXCEDENTE NUMERIC(18,4),
    ULTCOSTO NUMERIC(18,2),
    FECHACOSTO DATE)
AS
 /*$$IBE$$ declare variable CODINI VARCHAR(20);
declare variable CODFIN VARCHAR(20);
declare variable DESINI VARCHAR(20);
declare variable DESFIN VARCHAR(20);
declare variable PORART VARCHAR(8);
declare variable MAXDIA VARCHAR(2);
declare variable DISPONIBILIDAD integer;
declare variable PROMEDIO numeric(18,4);
declare variable SALIDAS numeric(18,4); $$IBE$$*/ 
BEGIN /*$$IBE$$ 
if (ORDEN = 'C') then
    BEGIN
    CODINI = ARTINI;
    CODFIN = ARTFIN;
    DESINI = '';
    DESFIN = 'zz';
    END
ELSE
    BEGIN
    DESINI = ARTINI;
    DESFIN = ARTFIN;
    CODINI = '';
    CODFIN = 'zz';
    END
execute procedure lee_configuracion ('INVENTARIO', 'EXISTENCIAS', 'MAXIMO Y MINIMO POR STAND O POR ARTICULO') returning_values (:porart);
execute procedure lee_configuracion ('INVENTARIO', 'EXISTENCIAS', 'MAXIMO INVENTARIO EN DIAS') returning_values (:maxdia);

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

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE REP_DISPONIBILIDAD(
    FECHA DATE,
    ARTINI VARCHAR(20),
    ARTFIN VARCHAR(20),
    GRPINI VARCHAR(3),
    GRPFIN VARCHAR(3),
    ORDEN CHAR(1),
    CEROS CHAR(1),
    DETALLE CHAR(1),
    AGRUPA CHAR(1),
    SUCURSAL INTEGER)
RETURNS (
    CODIGO VARCHAR(15),
    NOMBRE VARCHAR(60),
    UNIDAD VARCHAR(8),
    CODGRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    CODSUBG VARCHAR(3),
    NOMSUBG VARCHAR(30),
    CODMARC VARCHAR(3),
    NOMMARC VARCHAR(30),
    CODBOD VARCHAR(2),
    NOMBOD VARCHAR(30),
    EXIST NUMERIC(18,4),
    PROMEDIO NUMERIC(18,4),
    SALIDAS NUMERIC(18,4),
    DISPONIBILIDAD INTEGER,
    DIAS INTEGER,
    PROMEDIADO INTEGER,
    COSTO NUMERIC(18,2),
    COSTOPRO NUMERIC(18,2),
    SUGERIDO NUMERIC(18,4),
    FECCOMPRA DATE)
AS
 /*$$IBE$$ DECLARE VARIABLE CODINI VARCHAR(20);
DECLARE VARIABLE CODFIN VARCHAR(20);
DECLARE VARIABLE DESINI VARCHAR(20);
DECLARE VARIABLE DESFIN VARCHAR(20);
DECLARE VARIABLE MARINI VARCHAR(20);
DECLARE VARIABLE MARFIN VARCHAR(20);
declare variable DIASC VARCHAR(255);
declare variable DIA_ART VARCHAR(2) CHARACTER SET NONE;
declare variable PORART VARCHAR(8);
declare variable MAXDIA VARCHAR(2); $$IBE$$*/ 
BEGIN /*$$IBE$$ 
if (ORDEN = 'C') then
    BEGIN
    CODINI = ARTINI;
    CODFIN = ARTFIN;
    DESINI = '';
    DESFIN = 'zz';
    END
ELSE
    BEGIN
    DESINI = ARTINI;
    DESFIN = ARTFIN;
    CODINI = '';
    CODFIN = 'zz';
    END
if (AGRUPA = 'G') then
    BEGIN
    MARINI = '';
    MARFIN = 'zz';
    END
ELSE
    if (AGRUPA = 'M') then
        BEGIN
        MARINI = GRPINI;
        MARFIN = GRPFIN;
        GRPINI = '';
        GRPFIN = 'zz';
        END
EXECUTE PROCEDURE lee_configuracion ('INVENTARIO', 'EXISTENCIAS', 'PROMEDIAR LAS SALIDAS DEL INVENTARIO CON EL NUMERO DE DIAS ASIGNADO A CADA ARTICULO') returning_values (:DIA_ART);
EXECUTE PROCEDURE lee_configuracion ('INVENTARIO', 'EXISTENCIAS', 'NUMERO DE DIAS PARA PROMEDIO DE SALIDAS POR ARTICULO') returning_values (DIASC);
execute procedure lee_configuracion ('INVENTARIO', 'EXISTENCIAS', 'MAXIMO Y MINIMO POR STAND O POR ARTICULO') returning_values (:porart);
execute procedure lee_configuracion ('INVENTARIO', 'EXISTENCIAS', 'MAXIMO INVENTARIO EN DIAS') returning_values (:maxdia);
if (DETALLE = 'S') then
  BEGIN
  FOR SELECT ARTI_COD, ARTI_DES, ARTI_UNIDAD, ARTI_DIAS, A.GRUP_COD, GRUP_NOM, A.SUBG_COD, A.MARC_COD, BODE_COD, BODE_NOM, ARTI_DIANALIS
      FROM ARTICULO A, GRUPO G, BODEGA B
      WHERE ARTI_COD >= :CODINI AND ARTI_COD <= :CODFIN AND A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :GRPFIN AND ARTI_DES >= :DESINI AND ARTI_DES <= :DESFIN AND
      G.GRUP_COD = A.GRUP_COD AND A.ESAR_COD <> 'I' AND ((SUCU_ID = :SUCURSAL) or (:SUCURSAL = 0)) AND
      (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN)))
      INTO :CODIGO, :NOMBRE, :UNIDAD, :DIAS, :CODGRUPO, :NOMGRUPO, :CODSUBG, :CODMARC, :CODBOD, :NOMBOD, :PROMEDIADO
      DO
        BEGIN
        NOMMARC = '';
        NOMSUBG = '';
        SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO :NOMMARC;
        SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
        EXECUTE PROCEDURE costo_promedio_y_ultimo(:CODIGO, :FECHA) RETURNING_VALUES (:costopro, :COSTO);
        EXECUTE PROCEDURE DISPONIBILIDAD_ARTICULO(CODIGO, FECHA, :CODBOD) returning_values (:DISPONIBILIDAD, :EXIST, :PROMEDIO, :SALIDAS);
        if ((PORART = 'STAND') AND (MAXDIA = 'SI')) then
            BEGIN
            DIAS = 0;
            SELECT STAND_MIN FROM STANDS WHERE ARTI_COD = :CODIGO AND STAND_BODEGA = :codbod INTO :dias;
            END
         $$IBE$$*/ /*ESTABLECER CUAL ES EL VALOR DE DIAS PARA PROMEDIO*/ /*$$IBE$$ 
        if (DIA_ART = 'NO') then
          BEGIN
            PROMEDIADO = CAST(DIASC AS INTEGER);
          END
        if ((DISPONIBILIDAD < DIAS) and (PROMEDIO > 0))then
            SUGERIDO = (DIAS * PROMEDIO) - EXIST;
        ELSE
            SUGERIDO = 0;
        SELECT MAX(FACO_FECHA) FROM FACTURAS_COMPRA F, FACTURAS_COMPRAS_DETALLE D
            WHERE F.FACO_ID = D.faco_id AND D.ARTI_COD = :CODIGO AND FACO_FECHA <= :FECHA AND D.bode_cod = :codbod
            INTO :FECCOMPRA;
        if ((PROMEDIO > 0) or (EXIST <> 0) or (CEROS = 'S')) then
            SUSPEND;
        END
  END
ELSE
  BEGIN
  FOR SELECT ARTI_COD, ARTI_DES, ARTI_UNIDAD, ARTI_DIAS, A.GRUP_COD, GRUP_NOM, A.SUBG_COD, A.MARC_COD, ARTI_DIANALIS
      FROM ARTICULO A, GRUPO G
      WHERE ARTI_COD >= :CODINI AND ARTI_COD <= :CODFIN AND A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :GRPFIN AND ARTI_DES >= :DESINI AND ARTI_DES <= :DESFIN AND G.GRUP_COD = A.GRUP_COD AND
      A.ESAR_COD <> 'I' AND (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN)))
      INTO :CODIGO, :NOMBRE, :UNIDAD, :DIAS, :CODGRUPO, :NOMGRUPO, :CODSUBG, :CODMARC, :PROMEDIADO
      DO
        BEGIN
        NOMMARC = '';
        NOMSUBG = '';
        SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO :NOMMARC;
        SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
        EXECUTE PROCEDURE costo_promedio_y_ultimo(:CODIGO, :FECHA) RETURNING_VALUES (:costopro, :COSTO);
        EXECUTE PROCEDURE DISPONIBILIDAD_TOTAL_ARTICULO(CODIGO, FECHA) returning_values (:DISPONIBILIDAD, :EXIST, :PROMEDIO, :SALIDAS);
        if ((PORART = 'STAND') AND (MAXDIA = 'SI')) then
            BEGIN
            DIAS = 0;
            SELECT STAND_MIN FROM STANDS WHERE ARTI_COD = :CODIGO AND STAND_BODEGA = :codbod INTO :dias;
            END
         $$IBE$$*/ /*ESTABLECER CUAL ES EL VALOR DE DIAS PARA PROMEDIO*/ /*$$IBE$$ 
        if (DIA_ART = 'NO') then
          BEGIN
            PROMEDIADO = CAST(DIASC AS INTEGER);
          END
        if ((DISPONIBILIDAD < DIAS) and (PROMEDIO > 0))then
            SUGERIDO = (DIAS * PROMEDIO) - EXIST;
        ELSE
            SUGERIDO = 0;
        SELECT MAX(FACO_FECHA) FROM FACTURAS_COMPRA F, FACTURAS_COMPRAS_DETALLE D
            WHERE F.FACO_ID = D.faco_id AND D.ARTI_COD = :CODIGO AND FACO_FECHA <= :FECHA
            INTO :FECCOMPRA;
        if ((PROMEDIO > 0) or (EXIST <> 0) or (CEROS = 'S')) then
            SUSPEND;
        END
  END
 $$IBE$$*/ SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE DISPONIBILIDAD_ARTICULO(
    ARTICULO VARCHAR(15),
    FECHA DATE,
    BODEGA VARCHAR(2))
RETURNS (
    DISPONIBILIDAD INTEGER,
    EXIST NUMERIC(18,4),
    PROMEDIO NUMERIC(18,4),
    SALIDAS NUMERIC(18,4))
AS
BEGIN
  EXECUTE PROCEDURE SALDO_INVENTARIO (ARTICULO, BODEGA, FECHA) returning_values (:EXIST);
  EXECUTE PROCEDURE PROMEDIO_SALIDAS_ARTICULO(:ARTICULO, :FECHA, :BODEGA) returning_values (:PROMEDIO, :SALIDAS);
  if (PROMEDIO > 0) then
    DISPONIBILIDAD = EXIST / PROMEDIO;
  ELSE
    DISPONIBILIDAD = 0;
  SUSPEND;
END

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE EXISTENCIAS_COMPRAS(
    ARTICULO VARCHAR(15),
    FECHA DATE,
    UNIDAD VARCHAR(8))
RETURNS (
    BODEGA VARCHAR(2),
    EXISTENCIA NUMERIC(18,2),
    RESERVADO NUMERIC(18,2),
    ORDENADO NUMERIC(18,2),
    PROMEDIO NUMERIC(18,2),
    VENTAMES NUMERIC(18,2),
    FECHACMP DATE,
    CANTCMP NUMERIC(18,2),
    DIAS INTEGER,
    SUGERIDO NUMERIC(18,2),
    STAND VARCHAR(20))
AS
declare variable FACTOR NUMERIC(15,4);
declare variable ORDENC NUMERIC(18,4);
declare variable PEDIDO NUMERIC(18,4);
declare variable ITEM INTEGER;
declare variable ID INTEGER;
declare variable UND VARCHAR(8);
declare variable CANT NUMERIC(18,4);
declare variable FACTOR2 NUMERIC(18,4);
declare variable fecini DATE;
declare variable FECHAAUX VARCHAR(10);
declare variable AGENCIA INTEGER;
declare variable DEVMES NUMERIC(18,2);
declare variable MFAC INTEGER;
declare variable MDEV INTEGER;
declare variable IVAF NUMERIC(18,2);
declare variable IVAD NUMERIC(18,2);
declare variable DIA_ART VARCHAR(2) CHARACTER SET NONE;
declare variable DIASC VARCHAR(255);
declare variable PEDAUTO CHAR(2);
declare variable SALIDAS NUMERIC(18,4);
BEGIN
  for select bode_cod, SUCU_ID from bodega into :bodega, :agencia
    do
    begin
    execute procedure saldo_inventario (:articulo, :bodega, :fecha) returning_values (:Existencia);
    EXECUTE PROCEDURE FACTOR_UNIDAD_CANT(:ARTICULO, :UNIDAD) returning_values (:FACTOR);
    if (FACTOR <> 0) then
        EXISTENCIA = EXISTENCIA / FACTOR;
    else
        EXISTENCIA = 0;
    STAND = '';
    SELECT STAND_COD FROM STANDS WHERE ARTI_COD = :ARTICULO AND STAND_BODEGA = :BODEGA INTO :stand;
    EXECUTE PROCEDURE promedio_salidas_articulo (:ARTICULO, :FECHA, :BODEGA) returning_values (:PROMEDIO, :SALIDAS);
    EXECUTE PROCEDURE lee_configuracion ('INVENTARIO', 'EXISTENCIAS', 'PROMEDIAR LAS SALIDAS DEL INVENTARIO CON EL NUMERO DE DIAS ASIGNADO A CADA ARTICULO') returning_values (:DIA_ART);
    if (DIA_ART = 'NO') then
        BEGIN
        EXECUTE PROCEDURE lee_configuracion ('INVENTARIO', 'EXISTENCIAS', 'NUMERO DE DIAS PARA PROMEDIO DE SALIDAS POR ARTICULO') returning_values (DIASC);
        DIAS = CAST(DIASC AS INTEGER);
        END
    ELSE
        SELECT ARTI_DIAS FROM ARTICULO WHERE ARTI_COD = :ARTICULO INTO :DIAS;
    if (DIAS is null) then
        DIAS = 0;
    PROMEDIO = DIAS * PROMEDIO;
    if (FACTOR <> 0) then
        PROMEDIO = PROMEDIO / FACTOR;
    SUGERIDO = PROMEDIO - EXISTENCIA;
    SELECT SUM(ORID_ENTREGAR)
      FROM ORDENINVENTARIO_DETALLE OD, ordenes_inventario O
      WHERE O.ORIN_ID = OD.ORIN_ID AND ARTI_COD = :ARTICULO AND ORIN_FECHA <= :FECHA AND ORIN_FECLLEGA >= :FECHA AND ORID_ANULADO = 'N' AND OD.BODE_COD = :BODEGA
      INTO :ORDENADO;
    if (ORDENADO IS NULL) then
        ORDENADO = 0;
    ORDENC = 0;
    FOR SELECT O.ORDC_ID, OCDE_ITEM, OCDE_CANT * OCDE_FACTOR
        FROM ORDENES_COMPRA O, ORDENES_COMPRA_DETALLE OD
        WHERE O.ORDC_ID = OD.ORDC_ID AND OD.ARTI_COD = :ARTICULO AND (ORDC_FECHA+ORDC_VALIDEZ) >= :FECHA AND ORDC_FECHA <= :FECHA AND OCDE_ANULADO = 'N' AND OD.BODE_COD = :BODEGA
        INTO :ID, :ITEM, :CANT
        do
        BEGIN
        EXECUTE PROCEDURE FALTANTE(23, 21, ID, ITEM) returning_values (PEDIDO, UND, FACTOR2);
        if (PEDIDO * FACTOR2 = CANT) then /* SI NO SE HA FACTURADO MIRE A VER SI SE REMISIONO */
            EXECUTE PROCEDURE FALTANTE(23, 22, ID, ITEM) returning_values (PEDIDO, UND, FACTOR2);
        if (PEDIDO IS NULL) then
            PEDIDO = 0;
        ORDENC = ORDENC + PEDIDO * FACTOR2;
        END
    ORDENADO = ORDENADO + ORDENC;
    if (FACTOR <> 0) then
        ORDENADO = ORDENADO / FACTOR;
    SELECT SUM(RSDE_LIBERAR)
      FROM RESERVAS_DETALLE RD, RESERVAS R
      WHERE R.RESE_ID = RD.RESE_ID AND ARTI_COD = :ARTICULO AND RESE_FECHA <= :FECHA AND RESE_VENCE >= :FECHA AND RD.BODE_COD = :BODEGA AND RSDE_ANULADO = 'N'
      INTO :RESERVADO;
    if (RESERVADO IS NULL) then
        RESERVADO = 0;
    PEDIDO = 0;
    FOR SELECT P.PEDI_ID, PEDE_ITEM, PEDE_CANT * PEDE_FACTOR
        FROM PEDIDOS P, PEDIDOS_DETALLE PD
        WHERE P.PEDI_ID = PD.PEDI_ID AND PD.ARTI_COD = :ARTICULO AND (PEDI_FECHA+PEDI_VALIDEZ) >= :FECHA AND PEDI_FECHA <= :FECHA AND PEDE_ANULADO = 'N' AND BODE_COD = :BODEGA
        INTO :ID, :ITEM, :CANT
        do
        BEGIN
        EXECUTE PROCEDURE FALTANTE(34, 31, ID, ITEM) returning_values (ORDENC, UND, FACTOR2);
        EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION', 'FACTURAS', 'GENERAR PEDIDO AUTOMATICAMENTE CON LA FACTURA') returning_values (pedauto);
        if ((ORDENC * FACTOR2 = CANT) or (PEDAUTO = 'SI')) then /* SI NO SE HA FACTURADO MIRE A VER SI SE REMISIONO */
            EXECUTE PROCEDURE FALTANTE(34, 32, ID, ITEM) returning_values (ORDENC, UND, FACTOR2);
        if (ORDENC IS NULL) then
            ORDENC = 0;
        PEDIDO = PEDIDO + ORDENC * FACTOR2;
        END
    RESERVADO = RESERVADO + PEDIDO;
    if (FACTOR <> 0) then
        RESERVADO = RESERVADO / FACTOR;
    /* VENTAS MES */
    FECHAAUX = CAST (FECHA AS VARCHAR(10));
    FECHAAUX = SUBSTR(FECHAAUX, 1, 7) || '/01';
    FECINI = CAST (FECHAAUX AS DATE);
    EXECUTE PROCEDURE ventas_articulo (:ARTICULO, :FECINI, :FECHA, :agencia) returning_values (:ventames, :mfac, :devmes, :mdev, :ivaf, :ivad);
    ventames = ventames - devmes;
    if (FACTOR <> 0) then
        ventames = ventames / FACTOR;
    /* FECHA COMPRA */
    fechacmp = null;
    cantcmp = 0;
    SELECT FIRST 1 FACO_FECHA, FCDE_CANT * FCDE_FACTOR FROM FACTURAS_COMPRA F, FACTURAS_COMPRAS_DETALLE D
        WHERE F.FACO_ID = D.faco_id AND D.ARTI_COD = :articulo AND FACO_FECHA <= :FECHA AND D.bode_cod = :BODEGA
        ORDER BY FACO_FECHA DESC, F.FACO_ID DESC
        INTO :fechacmp, :cantcmp;
    SUSPEND;
    end
END

^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER PROCEDURE MAXIMO_ARTICULO(
    ARTICULO VARCHAR(15),
    FECHA DATE,
    BODEGA CHAR(2),
    CANT NUMERIC(18,2))
RETURNS (
    EXCESO NUMERIC(18,2))
AS
declare variable DIAS CHAR(2);
declare variable PROMEDIO NUMERIC(18,4);
declare variable SALIDAS NUMERIC(18,4);
declare variable MAXIMO NUMERIC(18,4);
declare variable SALDO NUMERIC(18,4);
BEGIN
  /* CUANDO CONFIGURACION MINIMO EN DIAS */
  EXECUTE PROCEDURE LEE_CONFIGURACION ('INVENTARIO', 'EXISTENCIAS', 'MAXIMO INVENTARIO EN DIAS') returning_values (DIAS);
  if (DIAS = 'SI') then
    BEGIN
    EXECUTE PROCEDURE PROMEDIO_SALIDAS_ARTICULO(:ARTICULO, :FECHA, :BODEGA) returning_values (:PROMEDIO, :SALIDAS);
    SELECT ARTI_MAX * :PROMEDIO FROM ARTICULO WHERE ARTI_COD = :ARTICULO INTO :MAXIMO;
    end
  ELSE
    BEGIN
    SELECT ARTI_MAX FROM ARTICULO WHERE ARTI_COD = :ARTICULO INTO :MAXIMO;
    END
  if (MAXIMO IS NULL) then
    MAXIMO = 0;
  EXECUTE PROCEDURE SALDO_INVENTARIO(:ARTICULO, :BODEGA, :FECHA) returning_values (SALDO);
  if (SALDO+CANT > maximo) then
    EXCESO = MAXIMO - (SALDO+CANT);
  ELSE
    EXCESO = 0;
  SUSPEND;
END

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE MINIMO_ARTICULO(
    ARTICULO VARCHAR(15),
    FECHA DATE,
    BODEGA CHAR(2))
RETURNS (
    MINIMO NUMERIC(18,4))
AS
declare variable DIAS CHAR(2);
declare variable PROMEDIO NUMERIC(18,4);
declare variable SALIDAS NUMERIC(18,4);
BEGIN
  /* CUANDO CONFIGURACION MINIMO EN DIAS */
  EXECUTE PROCEDURE LEE_CONFIGURACION ('INVENTARIO', 'EXISTENCIAS', 'MINIMO INVENTARIO EN DIAS') returning_values (DIAS);
  if (DIAS = 'SI') then
    BEGIN
    EXECUTE PROCEDURE PROMEDIO_SALIDAS_ARTICULO(:ARTICULO, :FECHA, :BODEGA) returning_values (:PROMEDIO, :SALIDAS);
    SELECT ARTI_DIAS * :PROMEDIO FROM ARTICULO WHERE ARTI_COD = :ARTICULO INTO :MINIMO;
    end
  ELSE
    BEGIN
    SELECT ARTI_MIN FROM ARTICULO WHERE ARTI_COD = :ARTICULO INTO :MINIMO;
    END
  if (MINIMO IS NULL) then
    MINIMO = 0;
  SUSPEND;
END

^

SET TERM ; ^

SET TERM ^ ;

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

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE ORDEN_SUGERIDA(
    PROVEEDOR VARCHAR(20),
    FECHA DATE)
RETURNS (
    ARTICULO VARCHAR(15),
    BODEGA VARCHAR(2),
    CANT NUMERIC(18,4),
    UNIDAD VARCHAR(8),
    COSTO NUMERIC(18,2))
AS
declare variable FACTOR NUMERIC(15,4);
declare variable DIAS INTEGER;
declare variable EXISTENCIA NUMERIC(18,4);
declare variable PROMEDIO NUMERIC(18,4);
declare variable AGENCIA INTEGER;
declare variable DIA_ART VARCHAR(2) CHARACTER SET NONE;
declare variable DIASC VARCHAR(255);
declare variable SALIDAS NUMERIC(18,4);
BEGIN
FOR SELECT a.ARTI_COD, PVAR_COSTO, ARTI_UNIDAD, ARTI_DIAS FROM proveedor_articulo p, articulo a
    WHERE p.arti_cod = a.arti_cod and TERC_NIT = :proveedor order by a.arti_des
    INTO :articulo, :costo, :unidad, :DIAS
  DO BEGIN
  for select bode_cod, SUCU_ID from bodega into :bodega, :agencia
    do
    begin
    execute procedure saldo_inventario (:articulo, :bodega, :fecha) returning_values (:Existencia);
    EXECUTE PROCEDURE FACTOR_UNIDAD_CANT(:ARTICULO, :UNIDAD) returning_values (:FACTOR);
    if (FACTOR <> 0) then
        EXISTENCIA = EXISTENCIA / FACTOR;
    else
        EXISTENCIA = 0;
    EXECUTE PROCEDURE promedio_salidas_articulo (:ARTICULO, :FECHA, :BODEGA) returning_values (:PROMEDIO, :SALIDAS);
    EXECUTE PROCEDURE lee_configuracion ('INVENTARIO', 'EXISTENCIAS', 'PROMEDIAR LAS SALIDAS DEL INVENTARIO CON EL NUMERO DE DIAS ASIGNADO A CADA ARTICULO') returning_values (:DIA_ART);
    if (DIA_ART = 'NO') then
        BEGIN
        EXECUTE PROCEDURE lee_configuracion ('INVENTARIO', 'EXISTENCIAS', 'NUMERO DE DIAS PARA PROMEDIO DE SALIDAS POR ARTICULO') returning_values (DIASC);
        DIAS = CAST(DIASC AS INTEGER);
        END
    if (DIAS is null) then
        DIAS = 0;
    PROMEDIO = DIAS * PROMEDIO;
    if (FACTOR <> 0) then
        PROMEDIO = PROMEDIO / FACTOR;
    CANT = PROMEDIO - EXISTENCIA;
    if (CANT > 0) then
        SUSPEND;
    end
  END
END

^

SET TERM ; ^

SET TERM ^ ;

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

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

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

^

SET TERM ; ^

SET TERM ^ ;

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

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

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE REP_DISPONIBILIDAD(
    FECHA DATE,
    ARTINI VARCHAR(20),
    ARTFIN VARCHAR(20),
    GRPINI VARCHAR(3),
    GRPFIN VARCHAR(3),
    ORDEN CHAR(1),
    CEROS CHAR(1),
    DETALLE CHAR(1),
    AGRUPA CHAR(1),
    SUCURSAL INTEGER)
RETURNS (
    CODIGO VARCHAR(15),
    NOMBRE VARCHAR(60),
    UNIDAD VARCHAR(8),
    CODGRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    CODSUBG VARCHAR(3),
    NOMSUBG VARCHAR(30),
    CODMARC VARCHAR(3),
    NOMMARC VARCHAR(30),
    CODBOD VARCHAR(2),
    NOMBOD VARCHAR(30),
    EXIST NUMERIC(18,4),
    PROMEDIO NUMERIC(18,4),
    SALIDAS NUMERIC(18,4),
    DISPONIBILIDAD INTEGER,
    DIAS INTEGER,
    PROMEDIADO INTEGER,
    COSTO NUMERIC(18,2),
    COSTOPRO NUMERIC(18,2),
    SUGERIDO NUMERIC(18,4),
    FECCOMPRA DATE)
AS
DECLARE VARIABLE CODINI VARCHAR(20);
DECLARE VARIABLE CODFIN VARCHAR(20);
DECLARE VARIABLE DESINI VARCHAR(20);
DECLARE VARIABLE DESFIN VARCHAR(20);
DECLARE VARIABLE MARINI VARCHAR(20);
DECLARE VARIABLE MARFIN VARCHAR(20);
declare variable DIASC VARCHAR(255);
declare variable DIA_ART VARCHAR(2) CHARACTER SET NONE;
declare variable PORART VARCHAR(8);
declare variable MAXDIA VARCHAR(2);
BEGIN
if (ORDEN = 'C') then
    BEGIN
    CODINI = ARTINI;
    CODFIN = ARTFIN;
    DESINI = '';
    DESFIN = 'zz';
    END
ELSE
    BEGIN
    DESINI = ARTINI;
    DESFIN = ARTFIN;
    CODINI = '';
    CODFIN = 'zz';
    END
if (AGRUPA = 'G') then
    BEGIN
    MARINI = '';
    MARFIN = 'zz';
    END
ELSE
    if (AGRUPA = 'M') then
        BEGIN
        MARINI = GRPINI;
        MARFIN = GRPFIN;
        GRPINI = '';
        GRPFIN = 'zz';
        END
EXECUTE PROCEDURE lee_configuracion ('INVENTARIO', 'EXISTENCIAS', 'PROMEDIAR LAS SALIDAS DEL INVENTARIO CON EL NUMERO DE DIAS ASIGNADO A CADA ARTICULO') returning_values (:DIA_ART);
EXECUTE PROCEDURE lee_configuracion ('INVENTARIO', 'EXISTENCIAS', 'NUMERO DE DIAS PARA PROMEDIO DE SALIDAS POR ARTICULO') returning_values (DIASC);
execute procedure lee_configuracion ('INVENTARIO', 'EXISTENCIAS', 'MAXIMO Y MINIMO POR STAND O POR ARTICULO') returning_values (:porart);
execute procedure lee_configuracion ('INVENTARIO', 'EXISTENCIAS', 'MAXIMO INVENTARIO EN DIAS') returning_values (:maxdia);
if (DETALLE = 'S') then
  BEGIN
  FOR SELECT ARTI_COD, ARTI_DES, ARTI_UNIDAD, ARTI_DIAS, A.GRUP_COD, GRUP_NOM, A.SUBG_COD, A.MARC_COD, BODE_COD, BODE_NOM, ARTI_DIANALIS
      FROM ARTICULO A, GRUPO G, BODEGA B
      WHERE ARTI_COD >= :CODINI AND ARTI_COD <= :CODFIN AND A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :GRPFIN AND ARTI_DES >= :DESINI AND ARTI_DES <= :DESFIN AND
      G.GRUP_COD = A.GRUP_COD AND A.ESAR_COD <> 'I' AND ((SUCU_ID = :SUCURSAL) or (:SUCURSAL = 0)) AND
      (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN)))
      INTO :CODIGO, :NOMBRE, :UNIDAD, :DIAS, :CODGRUPO, :NOMGRUPO, :CODSUBG, :CODMARC, :CODBOD, :NOMBOD, :PROMEDIADO
      DO
        BEGIN
        NOMMARC = '';
        NOMSUBG = '';
        SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO :NOMMARC;
        SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
        EXECUTE PROCEDURE costo_promedio_y_ultimo(:CODIGO, :FECHA) RETURNING_VALUES (:costopro, :COSTO);
        EXECUTE PROCEDURE DISPONIBILIDAD_ARTICULO(CODIGO, FECHA, :CODBOD) returning_values (:DISPONIBILIDAD, :EXIST, :PROMEDIO, :SALIDAS);
        if ((PORART = 'STAND') AND (MAXDIA = 'SI')) then
            BEGIN
            DIAS = 0;
            SELECT STAND_MIN FROM STANDS WHERE ARTI_COD = :CODIGO AND STAND_BODEGA = :codbod INTO :dias;
            END
        /*ESTABLECER CUAL ES EL VALOR DE DIAS PARA PROMEDIO*/
        if (DIA_ART = 'NO') then
          BEGIN
            PROMEDIADO = CAST(DIASC AS INTEGER);
          END
        if ((DISPONIBILIDAD < DIAS) and (PROMEDIO > 0))then
            SUGERIDO = (DIAS * PROMEDIO) - EXIST;
        ELSE
            SUGERIDO = 0;
        SELECT MAX(FACO_FECHA) FROM FACTURAS_COMPRA F, FACTURAS_COMPRAS_DETALLE D
            WHERE F.FACO_ID = D.faco_id AND D.ARTI_COD = :CODIGO AND FACO_FECHA <= :FECHA AND D.bode_cod = :codbod
            INTO :FECCOMPRA;
        if ((PROMEDIO > 0) or (EXIST <> 0) or (CEROS = 'S')) then
            SUSPEND;
        END
  END
ELSE
  BEGIN
  FOR SELECT ARTI_COD, ARTI_DES, ARTI_UNIDAD, ARTI_DIAS, A.GRUP_COD, GRUP_NOM, A.SUBG_COD, A.MARC_COD, ARTI_DIANALIS
      FROM ARTICULO A, GRUPO G
      WHERE ARTI_COD >= :CODINI AND ARTI_COD <= :CODFIN AND A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :GRPFIN AND ARTI_DES >= :DESINI AND ARTI_DES <= :DESFIN AND G.GRUP_COD = A.GRUP_COD AND
      A.ESAR_COD <> 'I' AND (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN)))
      INTO :CODIGO, :NOMBRE, :UNIDAD, :DIAS, :CODGRUPO, :NOMGRUPO, :CODSUBG, :CODMARC, :PROMEDIADO
      DO
        BEGIN
        NOMMARC = '';
        NOMSUBG = '';
        SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO :NOMMARC;
        SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
        EXECUTE PROCEDURE costo_promedio_y_ultimo(:CODIGO, :FECHA) RETURNING_VALUES (:costopro, :COSTO);
        EXECUTE PROCEDURE DISPONIBILIDAD_TOTAL_ARTICULO(CODIGO, FECHA) returning_values (:DISPONIBILIDAD, :EXIST, :PROMEDIO, :SALIDAS);
        if ((PORART = 'STAND') AND (MAXDIA = 'SI')) then
            BEGIN
            DIAS = 0;
            SELECT STAND_MIN FROM STANDS WHERE ARTI_COD = :CODIGO AND STAND_BODEGA = :codbod INTO :dias;
            END
        /*ESTABLECER CUAL ES EL VALOR DE DIAS PARA PROMEDIO*/
        if (DIA_ART = 'NO') then
          BEGIN
            PROMEDIADO = CAST(DIASC AS INTEGER);
          END
        if ((DISPONIBILIDAD < DIAS) and (PROMEDIO > 0))then
            SUGERIDO = (DIAS * PROMEDIO) - EXIST;
        ELSE
            SUGERIDO = 0;
        SELECT MAX(FACO_FECHA) FROM FACTURAS_COMPRA F, FACTURAS_COMPRAS_DETALLE D
            WHERE F.FACO_ID = D.faco_id AND D.ARTI_COD = :CODIGO AND FACO_FECHA <= :FECHA
            INTO :FECCOMPRA;
        if ((PROMEDIO > 0) or (EXIST <> 0) or (CEROS = 'S')) then
            SUSPEND;
        END
  END
END

^

SET TERM ; ^


SET TERM ^ ;

CREATE OR ALTER procedure MAXIMO_ARTICULO (
    ARTICULO varchar(15),
    FECHA date,
    BODEGA char(2),
    CANT NUMERIC(18,2))
returns (
    EXCESO NUMERIC(18,2))
AS
declare variable DIAS CHAR(2);
declare variable PROMEDIO NUMERIC(18,4);
declare variable SALIDAS NUMERIC(18,4);
declare variable MAXIMO NUMERIC(18,4);
declare variable SALDO NUMERIC(18,4);
BEGIN
  /* CUANDO CONFIGURACION MINIMO EN DIAS */
  EXECUTE PROCEDURE LEE_CONFIGURACION ('INVENTARIO', 'EXISTENCIAS', 'MAXIMO INVENTARIO EN DIAS') returning_values (DIAS);
  if (DIAS = 'SI') then
    BEGIN
    EXECUTE PROCEDURE PROMEDIO_SALIDAS_ARTICULO(:ARTICULO, :FECHA, :BODEGA) returning_values (:PROMEDIO, :SALIDAS);
    SELECT ARTI_MAX * :PROMEDIO FROM ARTICULO WHERE ARTI_COD = :ARTICULO INTO :MAXIMO;
    end
  ELSE
    BEGIN
    SELECT ARTI_MAX FROM ARTICULO WHERE ARTI_COD = :ARTICULO INTO :MAXIMO;
    END
  if (MAXIMO IS NULL) then
    MAXIMO = 0;
  EXECUTE PROCEDURE SALDO_INVENTARIO(:ARTICULO, :BODEGA, :FECHA) returning_values (SALDO);
  if (SALDO+CANT > maximo) then
    EXCESO = MAXIMO - (SALDO+CANT);
  ELSE
    EXCESO = 0;
  SUSPEND;
END
^

SET TERM ; ^

grant EXECUTE on PROCEDURE MAXIMO_ARTICULO to PUBLIC;

/* 20091008 */
/* ENSAMBLES CON COMPONENTES COMO PORCENTAJE DEL PRIMER INGREDIENTE */
ALTER TABLE ARTICULOS_PRODUCTO
ADD ARPR_PORC T_PORCENTAJE;

INSERT INTO CONFIGURACION (CONF_MODULO, CONF_CATEGORIA, CONF_PROPIEDAD, CONF_VALOR, CONF_POSIBLES, CONF_AYUDA) VALUES ('INVENTARIO', 'ENSAMBLES', 'ENSAMBLES CON UN ARTICULO PRINCIPAL COMO BASE', 'NO', 'SI,NO', 'SI: No existe sobrante y hay un artículo principal cuya cantidad (y no la del producto) sirve para calcular la formula proporcionalmente. NO: Hay un material sobrante y la composición depende del producto');
commit work;

SET TERM ^ ;

CREATE OR ALTER TRIGGER ENSAMBLES_AI FOR ENSAMBLES
ACTIVE AFTER INSERT POSITION 0
AS
declare variable COSTO NUMERIC(18,2);
declare variable ARTPRIN VARCHAR(2);
BEGIN
if ((NEW.ENSA_id <> 0) and (new.ensa_anulado = 'N')) then
  begin
  COSTO = new.ensa_costo / NEW.ensa_factor;
  INSERT INTO MOVIMIENTO_ARTICULO
    (ARTI_COD, MVAR_CONS, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM)
    VALUES(NEW.ARTI_COD, GEN_ID(ID_MOVARTI,1), new.bode_cod, new.ensa_fecha, 15, NEW.ensa_id,
    new.ensa_conc, NEW.ensa_factor * new.ensa_cant, :COSTO, 'S', new.ensa_lote, new.pref_pre, new.ensa_numero, 0);

  /* RECORRA LAS LISTAS DE PRECIOS Y CAMBIE EL PRECIO */
  EXECUTE PROCEDURE CALCULA_PRECIOS(NEW.ARTI_COD, new.ensa_fecha);

  /* ingrese el retal */
  execute procedure lee_configuracion('INVENTARIO', 'ENSAMBLES', 'ENSAMBLES CON UN ARTICULO PRINCIPAL COMO BASE') returning_values (:ARTPRIN);
  if (ARTPRIN = 'SI') then
    BEGIN
    if ((new.ensa_codretal is not null) and (new.ensa_codretal <> '')) then
      INSERT INTO MOVIMIENTO_ARTICULO
        (ARTI_COD, MVAR_CONS, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM)
        VALUES(NEW.ensa_codretal, GEN_ID(ID_MOVARTI,1), new.ensa_bodretal, new.ensa_fecha, 15, NEW.ensa_id,
        new.ensa_conc, new.ensa_cantretal, 0, 'N', new.ensa_lote, new.pref_pre, new.ensa_numero, 999);
    END
  else
    BEGIN
    if ((new.ensa_codretal is not null) and (new.ensa_codretal <> '')) then
      INSERT INTO MOVIMIENTO_ARTICULO
        (ARTI_COD, MVAR_CONS, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM)
        VALUES(NEW.ensa_codretal, GEN_ID(ID_MOVARTI,1), new.ensa_bodretal, new.ensa_fecha, 15, NEW.ensa_id,
        new.ensa_conc, new.ensa_cantretal, :COSTO, 'S', new.ensa_lote, new.pref_pre, new.ensa_numero, 999);
    END
  INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
    VALUES (USER, 15, NEW.ensa_id, 'I', NEW.pref_pre || NEW.ensa_numero);
  end
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER ENSAMBLES_AU FOR ENSAMBLES
ACTIVE AFTER UPDATE POSITION 0
AS
declare variable COSTO NUMERIC(18,2);
declare variable consec INTEGER;
declare variable ARTPRIN VARCHAR(2);
BEGIN
/* BORRE LA CONTABILIZACION */
if (NEW.ensa_anulado = 'S') then
    BEGIN
    select enco_consec from comprobante_encabezado where enco_tiporef = 15 and enco_idref = old.ensa_id into :consec;
    if (NOT consec is null) then
     delete from comprobante_detalle where enco_consec = :consec;
    delete from comprobante_encabezado where enco_tiporef = 15 and enco_idref = old.ensa_id;
    INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
        VALUES (USER, 15, NEW.ensa_id, 'A', NEW.pref_pre || NEW.ensa_numero);
    END

/* BORRE EL ANTERIOR Y GRABE EL NUEVO */
if ((OLD.ensa_id <> 0) AND (OLD.ensa_anulado = 'N')) then
    begin
    delete from movimiento_articulo where (mvar_tipodoc = 15) and (mvar_idref = old.ensa_id) and (mvar_item = 0);
    delete from movimiento_articulo where (mvar_tipodoc = 15) and (mvar_idref = old.ensa_id) and (mvar_item = 999);
    end
if ((new.ensa_id <> 0) AND (NEW.ensa_anulado = 'N')) then
    begin
    COSTO = new.ensa_costo / NEW.ensa_factor;
    INSERT INTO MOVIMIENTO_ARTICULO
        (ARTI_COD, MVAR_CONS, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM)
        VALUES(NEW.ARTI_COD, GEN_ID(ID_MOVARTI,1), new.ensa_bodretal, new.ensa_fecha, 15, NEW.ensa_id,
        new.ensa_conc, NEW.ensa_factor * new.ensa_cant, :COSTO, 'S', new.ensa_lote, new.pref_pre, new.ensa_numero, 0);

    /* RECORRA LAS LISTAS DE PRECIOS Y CAMBIE EL PRECIO */
    EXECUTE PROCEDURE CALCULA_PRECIOS(NEW.ARTI_COD, new.ensa_fecha);

    /* ingrese el retal */
    execute procedure lee_configuracion('INVENTARIO', 'ENSAMBLES', 'ENSAMBLES CON UN ARTICULO PRINCIPAL COMO BASE') returning_values (:ARTPRIN);
    if (ARTPRIN = 'SI') then
        BEGIN
        if ((new.ensa_codretal is not null) and (new.ensa_codretal <> '')) then
            INSERT INTO MOVIMIENTO_ARTICULO
                (ARTI_COD, MVAR_CONS, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM)
                VALUES(NEW.ensa_codretal, GEN_ID(ID_MOVARTI,1), new.ensa_bodretal, new.ensa_fecha, 15, NEW.ensa_id,
                new.ensa_conc, new.ensa_cantretal, 0, 'N', new.ensa_lote, new.pref_pre, new.ensa_numero, 999);
        END
    else
        BEGIN
        if ((new.ensa_codretal is not null) and (new.ensa_codretal <> '')) then
            INSERT INTO MOVIMIENTO_ARTICULO
                (ARTI_COD, MVAR_CONS, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM)
                VALUES(NEW.ensa_codretal, GEN_ID(ID_MOVARTI,1), new.bode_cod, new.ensa_fecha, 15, NEW.ensa_id,
                new.ensa_conc, new.ensa_cantretal, :COSTO, 'S', new.ensa_lote, new.pref_pre, new.ensa_numero, 999);
        END
    INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
        VALUES (USER, 15, NEW.ensa_id, 'U', NEW.pref_pre || NEW.ensa_numero);
    end
/* SI CAMBIO LA FECHA ACTUALICE LOS DETALLES */
if ((OLD.pref_pre <> NEW.pref_pre) or
    (OLD.ensa_numero <> NEW.ensa_numero) or
    (OLD.ensa_fecha <> NEW.ensa_fecha) ) then
    UPDATE ENSAMBLES_DETALLE SET ESDE_TRANSMIT = 'N' WHERE ENSA_ID = OLD.ENSA_ID;

if (OLD.ensa_anulado <> NEW.ensa_anulado) then
    UPDATE ENSAMBLES_DETALLE SET ESDE_ANULADO = NEW.ensa_anulado WHERE ENSA_ID = OLD.ENSA_ID;

if (OLD.ensa_transmit <> NEW.ensa_transmit) then
    UPDATE ENSAMBLES_DETALLE SET ESDE_TRANSMIT = NEW.ensa_transmit WHERE ENSA_ID = OLD.ENSA_ID;
END
^

SET TERM ; ^


/* 20091009 */
/* DESCARGAR COMPONENTES AL FACTURAR */

INSERT INTO CONFIGURACION (CONF_MODULO, CONF_CATEGORIA, CONF_PROPIEDAD, CONF_VALOR, CONF_POSIBLES, CONF_AYUDA) VALUES ('INVENTARIO', 'ENSAMBLES', 'PREFIJO PARA ENSAMBLES AUTOMATICOS AL SACAR PRODUCTOS', '0000', '', 'Indique el prefijo con que se registrarán los ensambles utomáticos cuando se descargue del inventario un producto');

ALTER TABLE ARTICULO ADD ARTI_ENSAMBLE T_BOOLEANO;

update articulo set arti_ensamble = 'N' where arti_ensamble is null;
commit work;

SET TERM ^ ;

create or alter trigger ARTICULO_BI for ARTICULO
active before insert position 0
as
declare variable EXISTE char(1);
begin
  new.ARTI_FECHA = cast('now' as date);
  /* Verifique que el codigo no se repita */
  EXISTE = 'N';
  select 'S'
  from ARTICULO
  where ARTI_COD = new.ARTI_COD
  into :EXISTE;
  if (EXISTE = 'S') then
    exception ARTICULO_REGISTRADO 'Ya existe un artículo con el código ' || new.ARTI_COD;
  if (new.ARTI_ENSAMBLE is null) then
    new.ARTI_ENSAMBLE = 'N';
  if (new.ARTI_TIENDA is null) then
    new.ARTI_TIENDA = 'N';
end
^

SET TERM ; ^


ALTER TABLE ENSAMBLES ADD ENSA_TIPOREF T_ID;
ALTER TABLE ENSAMBLES ADD ENSA_IDREF T_ID;

SET TERM ^ ;

CREATE OR ALTER TRIGGER MOVIMIENTO_ARTICULO_BI FOR MOVIMIENTO_ARTICULO
ACTIVE BEFORE INSERT POSITION 0
AS
declare variable LOTE CHAR(1);
declare variable ENSAMBLE CHAR(1);
declare variable IDENS INTEGER;
declare variable PREFENS VARCHAR(4);
declare variable unidad varchar(8);
declare variable DESCR varchar(60);
declare variable CODPR varchar(8);
declare variable DESPR varchar(60);
declare variable UNIPR varchar(8);
declare variable CANTPR numeric(18,4);
declare variable FACTOR numeric(18,4);
declare variable COSTO numeric(18,2);
declare variable COSTOTOT numeric(18,2);
declare variable ITEM INTEGER;
declare variable IVA NUMERIC(9,4);
declare variable IVAM NUMERIC(18,2);
declare variable CONSUMO NUMERIC(18,2);
BEGIN
/* INSERTE EL NUEVO LOTE */
SELECT ARTI_EXIST
    FROM   ARTICULO
    WHERE  ARTICULO.ARTI_COD = NEW.ARTI_COD
    INTO :LOTE;
if (LOTE = 'L') then
    BEGIN
      if ((NEW.mvar_lote IS NULL) or (NEW.mvar_lote = '')) then
        if (new.mvar_entrada = 'S') then
            new.mvar_lote = cast(new.mvar_cons as varchar(15));
        else
            begin
            /* NO HAY LOTE, ENTONCES CALCULELO SEGUN CONFIGURACION */
            execute procedure seleccione_lote(new.arti_cod, NEW.bode_cod, NEW.mvar_cant) returning_values(NEW.MVAR_LOTE);
            if (new.mvar_lote is null) then
                EXCEPTION LOTE_NEGATIVO 'No hay un lote del artículo ' || new.arti_cod || ' con existencia suficiente.';
            end
    END
/* ENSAMBLE EL PRODUCTO */
SELECT ARTI_ENSAMBLE, ARTI_UNIDAD, ARTI_DES FROM ARTICULO WHERE ARTI_COD = NEW.arti_cod INTO :ensamble, :unidad, :descr;
if ((NEW.mvar_entrada = 'N') AND (ENSAMBLE = 'S')) then
    BEGIN
    IDENS = gen_id(id_ensamble, 1);
    EXECUTE PROCEDURE lee_configuracion('INVENTARIO', 'ENSAMBLES', 'PREFIJO PARA ENSAMBLES AUTOMATICOS AL SACAR PRODUCTOS') returning_values (:prefens);
    INSERT INTO ENSAMBLES(ENSA_ID, TIDO_COD, PREF_PRE, BODE_COD, ENSA_NUMERO, ENSA_FECHA, ENSA_CONC, ENSA_REFER, ENSA_CANT, ENSA_UNIDAD, ENSA_FACTOR, ENSA_ANULADO, ENSA_TRANSMIT,
        ARTI_COD, ENSA_DESC, ENSA_CODBAR, ENSA_LOTE, ENSA_OBS, TERC_NIT, ENSA_USUARIO, NUMOK, ENSA_COSTO, LOTE_VENCE, ENSA_CODRETAL, ENSA_CANTRETAL, ENSA_OPER, ENSA_MAQUINA, ENSA_PESO, ENSA_BODRETAL, ENSA_TIPOREF, ENSA_IDREF)
        VALUES (:IDENS, 15, :prefens, NEW.bode_cod, '000001', new.mvar_fecha, new.mvar_conc, '', new.mvar_cant, :unidad, 1, 'N', 'N',
        NEW.arti_cod, :descr, NEW.arti_cod, NEW.mvar_lote, NULL, NULL, USER, 'N', NEW.mvar_costo, NULL, NULL, 0, null,  NULL, 0, NEW.bode_cod, NEW.mvar_tipodoc, NEW.mvar_idref);
    ITEM = 0;
    COSTOTOT = 0;
    FOR SELECT ARPR_CANT, ARPR_UNIDAD, ARPR_COMP, ARTI_DES, TAIV_PORC, ARTI_CONSUMO FROM articulos_producto P, ARTICULO A, TARIFA_IVA T
        WHERE P.ARTI_COD = NEW.arti_cod AND A.arti_cod = P.arpr_comp AND A.taiv_cod = T.taiv_cod
        INTO :CANTPR, :UNIPR, :CODPR, :DESPR, :IVA, :CONSUMO
        DO
        BEGIN
        ITEM = ITEM + 1;
        EXECUTE PROCEDURE costo_promedio_unidad (:codpr, NEW.mvar_fecha, :UNIPR) returning_values (:COSTO);
        EXECUTE PROCEDURE factor_unidad_cant(:codpr,  :unipr) returning_values (:FACTOR);
        COSTOTOT = COSTOTOT + COSTO * CANTPR;
        IVAM = costo * cantpr * iva / 100;
        INSERT INTO ENSAMBLES_DETALLE(ENSA_ID, ESDE_ITEM, ARTI_COD, BODE_COD, ESDE_CANT, ESDE_UNIDAD, ESDE_COSTO, ESDE_LOTE, ESDE_FACTOR, ESDE_IVAPORC, ESDE_IVAMONTO, ESDE_CONSUMO, ESDE_CODBAR, ESDE_ANULADO, ESDE_TRANSMIT, ESDE_DESC, ESDE_TOTAL, ESDE_PESO)
            VALUES (:idens, :ITEM, :codpr,  NEW.bode_cod, :cantpr, :unipr, :costo, NULL, :FACTOR, :IVA, :ivam, :consumo, :codpr, 'N', 'N', :despr, :COSTO * :cantpr, 0);
        END
    UPDATE ENSAMBLES SET ENSA_COSTO = :costotot WHERE ENSA_ID = :idens;
    END
if (new.mvar_cons is null) then
    NEW.mvar_cons = GEN_ID(ID_MOVARTI,1);
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER MOVIMIENTO_ARTICULO_AD FOR MOVIMIENTO_ARTICULO
ACTIVE AFTER DELETE POSITION 0
AS
declare variable LOTE CHAR(1);
declare variable ensamble char(1);
BEGIN
  /* INSERTE EL NUEVO LOTE */
  SELECT ARTI_EXIST
    FROM   ARTICULO
    WHERE  ARTICULO.ARTI_COD = OLD.ARTI_COD
    INTO :LOTE;
  /* BORRE LOS VIEJOS */
  if (old.mvar_tipodoc <> 13) then
      BEGIN
      EXECUTE PROCEDURE actualice_costo(old.arti_cod, old.mvar_fecha, old.mvar_costo, old.mvar_cant, old.mvar_entrada, 'S', OLD.mvar_cons, OLD.mvar_tipodoc);
      if (OLD.mvar_entrada = 'S') then
          EXECUTE PROCEDURE chequeo_costos(old.arti_cod, old.mvar_fecha-1); /* PARA OBLIGAR A RECALCULAR LOS MOV. DEL MISMO DIA */
      else
          EXECUTE PROCEDURE chequeo_costos(old.arti_cod, old.mvar_fecha);
      END
  /* actualice existencias */
  if (old.mvar_entrada = 'S') then
    BEGIN
    execute procedure sume_existencia(old.arti_cod, old.bode_cod, old.mvar_fecha, old.mvar_cant, 'S');
    if (LOTE = 'L') then
        UPDATE LOTES
            set lote_saldo = lote_saldo - old.mvar_cant
            where (arti_cod = old.ARTI_COD) and (bode_cod = old.bode_cod) and (lote_nro = old.mvar_lote);
    END
  else
    BEGIN
    SELECT ARTI_ENSAMBLE FROM ARTICULO WHERE ARTI_COD = old.arti_cod INTO :ensamble;
    if (ENSAMBLE = 'S') then
        delete from ensambles where ensa_tiporef = old.mvar_tipodoc and ensa_idref = old.mvar_idref;

    execute procedure reste_existencia(old.arti_cod, old.bode_cod, old.mvar_fecha, old.mvar_cant, 'S');
    if (LOTE = 'L') then
        UPDATE LOTES
            set lote_saldo = lote_saldo + old.mvar_cant
            where (arti_cod = old.ARTI_COD) and (bode_cod = old.bode_cod) and (lote_nro = old.mvar_lote);
    END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER SALIDAS_DETALLE_AI FOR SALIDAS_DETALLE
ACTIVE AFTER INSERT POSITION 0
AS
declare variable fec date;
declare variable CONC VARCHAR(60);
declare variable factor numeric(18,4);
declare variable Pref varchar(4);
declare variable Num varchar(6);
declare variable Nit varchar(20);
BEGIN
  if ((NEW.sali_id <> 0) and (new.sade_anulado = 'N')) then
    BEGIN
    select sali_fecha, sali_conc, pref_pre, sali_numero, terc_nit from salidas where sali_id = new.sali_id into :fec, :conc, :Pref, :Num, :Nit;
    execute procedure factor_unidad_cant(new.arti_cod, new.sade_unidad) returning_values(factor);
    INSERT INTO MOVIMIENTO_ARTICULO
      (ARTI_COD, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM, TERC_NIT)
      VALUES(NEW.ARTI_COD, NEW.BODE_COD, :FEC, 12, NEW.sali_id,
      :CONC, :factor * new.sade_cant, 0, 'N', new.sade_lote, :Pref, :Num, new.sade_item, :Nit);
    end
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER AJUSTES_DETALLE_AI FOR AJUSTES_DETALLE
ACTIVE AFTER INSERT POSITION 0
AS
declare variable fec date;
declare variable CONC VARCHAR(60);
declare variable Pref varchar(4);
declare variable Num varchar(6);
declare variable CANTAJ numeric(18,4);
declare variable COSTO NUMERIC(18,2);
declare variable factor numeric(18,4);
declare variable NOAJUSTAR CHAR(1);
BEGIN
  if ((NEW.AJUS_ID <> 0) and (new.ajde_anulado = 'N')) then
    BEGIN
    select AJUS_fecha, AJUS_conc, AJUS_NUMERO, PREF_PRE, AJUS_NOAJUSTAR
        from AJUSTES where AJUS_id = new.AJUS_id into :fec, :conc, :Num, :Pref, :noajustar;
    if (noajustar = 'N') then
        begin
        execute procedure factor_unidad_cant(new.arti_cod, new.ajus_unidad) returning_values(factor);
        CANTAJ = NEW.ajus_exant - (NEW.ajus_exnue * :factor);
        /* CUANDO CAMBIA LA EXISTENCIA REGISTRE EL MOV. */

        if (CANTAJ > 0) then
          BEGIN
          /* ES UNA SALIDA */
          INSERT INTO MOVIMIENTO_ARTICULO
            (ARTI_COD, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM)
            VALUES(NEW.ARTI_COD, NEW.BODE_COD, :FEC, 14, NEW.AJUS_id,
            :CONC, :cantaj, 0, 'N', NEW.ajus_lote, :Pref, :Num, NEW.ajus_item);
          END
        ELSE
          BEGIN
          /* ES UNA ENTRADA */
          EXECUTE PROCEDURE costo_promedio(NEW.arti_cod, :FEC) returning_values (:COSTO);
          INSERT INTO MOVIMIENTO_ARTICULO
            (ARTI_COD, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM)
            VALUES(NEW.ARTI_COD, NEW.BODE_COD, :FEC, 14, NEW.AJUS_id,
            :CONC, abs(:cantaj), :COSTO, 'S', NEW.ajus_lote, :Pref, :Num, NEW.ajus_item);
          END
        end
    END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER AJUSTES_DETALLE_AU FOR AJUSTES_DETALLE
ACTIVE AFTER UPDATE POSITION 0
as
declare variable fec date;
declare variable CONC VARCHAR(60);
declare variable cantaj numeric(18,4);
declare variable Pref varchar(4);
declare variable Num varchar(6);
declare variable COSTO NUMERIC(18,2);
declare variable factor numeric(18,4);
declare variable NOAJUSTAR CHAR(1);
BEGIN
if ((old.ajus_id <> 0) and (old.ajde_anulado = 'N')) then
    DELETE FROM MOVIMIENTO_ARTICULO WHERE (mvar_tipodoc = 14) and (mvar_idref = new.ajus_id) and (mvar_item = new.ajus_item);
if ((NEW.AJUS_id <> 0) and (NEW.ajde_anulado = 'N')) then
    begin
    select AJUS_fecha, AJUS_conc, AJUS_NUMERO, PREF_PRE, AJUS_NOAJUSTAR
        from AJUSTES where AJUS_id = new.AJUS_id into :fec, :conc, :Num, :Pref, :NOAJUSTAR;
    if (NOAJUSTAR = 'N') then
        BEGIN
        execute procedure factor_unidad_cant(new.arti_cod, new.ajus_unidad) returning_values(factor);
        CANTAJ = NEW.ajus_exant - (NEW.ajus_exnue * :factor);
        /* CUANDO CAMBIA LA EXISTENCIA REGISTRE EL MOV. */
        if (CANTAJ > 0) then
            BEGIN
            /* ES UNA SALIDA */
            INSERT INTO MOVIMIENTO_ARTICULO
                (ARTI_COD, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM)
                VALUES(NEW.ARTI_COD, NEW.BODE_COD, :FEC, 14, NEW.AJUS_id,
                :CONC, :cantaj, 0, 'N', NEW.ajus_lote, :Pref, :Num, new.ajus_item);
            END
        ELSE
            BEGIN
            /* ES UNA ENTRADA */
            EXECUTE PROCEDURE costo_promedio(NEW.arti_cod, :FEC) returning_values (:COSTO);
            INSERT INTO MOVIMIENTO_ARTICULO
                (ARTI_COD, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM)
                VALUES(NEW.ARTI_COD, NEW.BODE_COD, :FEC, 14, NEW.AJUS_id,
                :CONC, abs(:cantaj), :costo, 'S', NEW.ajus_lote, :Pref, :Num, new.ajus_item);
            END
        END
    END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER CONSUMO_DETALLE_AI FOR CONSUMO_DETALLE
ACTIVE AFTER INSERT POSITION 0
AS
declare variable fec date;
declare variable CONC VARCHAR(60);
declare variable VEHICULO VARCHAR(15);
declare variable factor numeric(18,4);
declare variable Nit varchar(20);
declare variable Pref varchar(4);
declare variable Num varchar(6);
BEGIN
if ((NEW.cons_id <> 0) and (new.cnde_anulado = 'N')) then
    BEGIN
    select cons_fecha, pref_pre, cons_numero, terc_nit, vehi_cod
        from consumos where cons_id = new.cons_id
        into :fec, :pref, :Num, :Nit, :VEHICULO;
    execute procedure factor_unidad_cant(new.arti_cod, new.cnde_unidad) returning_values(factor);
    CONC = 'TRABAJO VEHICULO ' || VEHICULO || '-' || Pref || Num;
    INSERT INTO MOVIMIENTO_ARTICULO
      (ARTI_COD, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM, TERC_NIT)
      VALUES(NEW.ARTI_COD, NEW.BODE_COD, :FEC, 32, NEW.cons_id,
      :CONC, :factor * new.cnde_cant, 0, 'N', '', :Pref, :Num, new.cnde_item, :Nit);
    END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER CONSUMO_DETALLE_AU FOR CONSUMO_DETALLE
ACTIVE AFTER UPDATE POSITION 0
AS
declare variable fec date;
declare variable CONC VARCHAR(60);
declare variable VEHICULO varchar(15);
declare variable Pref varchar(4);
declare variable Num varchar(6);
declare variable Nit varchar(20);
declare variable factor numeric(18,4);
BEGIN
/* Anule el anterior */
if ((OLD.CONS_ID <> 0) AND (OLD.cnde_anulado = 'N')) then
    delete from movimiento_articulo where (mvar_tipodoc = 32) and (mvar_idref = old.cons_id) and (mvar_item = old.cnde_item);
if ((NEW.CONS_ID <> 0) AND (NEW.cnde_anulado = 'N')) then
    begin
    /* Registre el nuevo */
    select cons_fecha, pref_pre, cons_numero, terc_nit, VEHI_COD
        from consumos where cons_id = new.cons_id into :fec, :Pref, :Num, :Nit, :vehiculo;
    execute procedure factor_unidad_cant(new.arti_cod, new.cnde_unidad) returning_values(factor);
    conc = 'TRABAJO VEHICULO No.' || PREF || NUM || '-' || VEHICULO;
    INSERT INTO MOVIMIENTO_ARTICULO
        (ARTI_COD, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM, TERC_NIT)
        VALUES(NEW.ARTI_COD, NEW.BODE_COD, :FEC, 32, NEW.cons_id,
        :CONC, :factor * new.cnde_cant, 0, 'N', '', :Pref, :Num, new.cnde_item, :Nit);
    end
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER DESENSAMBLES_AI FOR DESENSAMBLES
ACTIVE AFTER INSERT POSITION 0
AS
declare variable factor numeric(18,4);
BEGIN
  if ((new.dese_id <> 0) and (new.dese_anulado = 'N')) then
    begin
    execute procedure factor_unidad_cant(new.arti_cod, new.dese_unidad) returning_values(factor);
    INSERT INTO MOVIMIENTO_ARTICULO
      (ARTI_COD, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM)
      VALUES(NEW.ARTI_COD, new.bode_cod, new.dese_fecha, 16, NEW.dese_id,
      new.dese_conc, :factor * new.dese_cant, 0, 'N', new.dese_lote, new.pref_pre, new.dese_numero, 0);

    INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
        VALUES (USER, 16, NEW.dese_id, 'I', NEW.pref_pre || NEW.dese_numero);
    end
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER DESENSAMBLES_AU FOR DESENSAMBLES
ACTIVE AFTER UPDATE POSITION 0
AS
declare variable factor numeric(18,4);
declare variable consec INTEGER;
BEGIN
if (new.dese_anulado = 'S') then
    begin
    select enco_consec from comprobante_encabezado where enco_tiporef = 16 and enco_idref = old.dese_id into :consec;
    if (NOT consec is null) then
      delete from comprobante_detalle where enco_consec = :consec;
    delete from comprobante_encabezado where enco_tiporef = 16 and enco_idref = old.dese_id;
    INSERT INTO AUDITORIA (AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
        VALUES (USER, 16, new.dese_id, 'A', NEW.pref_pre || NEW.dese_numero);
    end
if ((old.dese_id <> 0) and (old.dese_anulado = 'N')) then
    delete from movimiento_articulo where (mvar_tipodoc = 16) and (mvar_idref = old.DESE_id) and (mvar_item = 0);
/* registre el nuevo */
if ((new.dese_id <> 0) and (new.dese_anulado = 'N')) then
    begin
    execute procedure factor_unidad_cant(new.arti_cod, new.dese_unidad) returning_values(factor);
    INSERT INTO MOVIMIENTO_ARTICULO
        (ARTI_COD, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO)
        VALUES(NEW.ARTI_COD, new.bode_cod, new.dese_fecha, 16, NEW.dese_id,
        new.dese_conc, :factor * new.dese_cant, 0, 'N', new.dese_lote, new.pref_pre, new.dese_numero);
    INSERT INTO AUDITORIA (AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
        VALUES (USER, 16, new.dese_id, 'U', NEW.pref_pre || NEW.dese_numero);
    end
/* si cambio un dato critico actualice el detalle */
if ((OLD.dese_fecha <> NEW.dese_fecha) or
    (OLD.dese_numero <> NEW.dese_numero) or
    (OLD.pref_pre <> NEW.pref_pre) ) then
    UPDATE DESENSAMBLES_DETALLE SET DEDE_TRANSMIT = 'N'
      WHERE DESE_ID = OLD.DESE_ID;
/* anule los detalles */
if (OLD.dese_anulado <> NEW.dese_anulado) then
    UPDATE DESENSAMBLES_DETALLE SET DEDE_ANULADO = NEW.dese_anulado
      WHERE DESE_ID = OLD.DESE_ID;
if (OLD.dese_transmit <> NEW.dese_transmit) then
    UPDATE DESENSAMBLES_DETALLE SET DEDE_TRANSMIT = NEW.dese_transmit
      WHERE DESE_ID = OLD.DESE_ID;
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER DESENSAMBLES_DETALLE_AI FOR DESENSAMBLES_DETALLE
ACTIVE AFTER INSERT POSITION 0
AS
declare variable fec date;
declare variable CONC VARCHAR(60);
declare variable factor numeric(18,4);
declare variable COSTO numeric(18,2);
declare variable Pref varchar(4);
declare variable Num varchar(6);
declare variable CANT NUMERIC(18,2);
declare variable CANTOT CHAR(2);
BEGIN
  if ((NEW.DESE_id <> 0) and (new.dede_anulado = 'N')) then
    begin
    select dese_fecha, dese_conc, pref_pre, dese_numero, dese_cant * dese_factor
        from desensambles where dese_id = new.dese_id into :fec, :conc, :Pref, :Num, :CANT;
    execute procedure factor_unidad_cant(new.arti_cod, new.dede_unidad) returning_values(factor);
    execute procedure costo_promedio(new.arti_cod, :FEC) returning_values (:COSTO);
    EXECUTE PROCEDURE LEE_CONFIGURACION('INVENTARIO', 'ENSAMBLES', 'FORMACIONES CON CANTIDADES TOTALES') returning_values (:CANTOT);
    if (CANTOT <> 'SI') then
        CANT = CANT * factor * new.dede_cant;
    ELSE
        CANT = factor * new.dede_cant;
    INSERT INTO MOVIMIENTO_ARTICULO
      (ARTI_COD, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM)
      VALUES(NEW.ARTI_COD, NEW.BODE_COD, :FEC, 16, NEW.dese_id,
      :CONC, :CANT, :COSTO, 'S', new.dede_lote, :Pref, :Num, new.dese_item);

    /* RECORRA LAS LISTAS DE PRECIOS Y CAMBIE EL PRECIO */
    EXECUTE PROCEDURE CALCULA_PRECIOS(NEW.ARTI_COD, :fec);
    END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER DESENSAMBLES_DETALLE_AU FOR DESENSAMBLES_DETALLE
ACTIVE AFTER UPDATE POSITION 0
AS
declare variable fec date;
declare variable CONC VARCHAR(60);
declare variable Pref varchar(4);
declare variable Num varchar(6);
declare variable factor numeric(18,4);
declare variable COSTO numeric(18,2);
declare variable CANT NUMERIC(18,2);
declare variable CANTOT CHAR(2);
BEGIN
/* Anule el anterior */
if ((OLD.DESE_ID <> 0) AND (OLD.dede_anulado = 'N')) then
    delete from movimiento_articulo where (mvar_tipodoc = 16) and (mvar_idref = old.DESE_id) and (mvar_item = old.dese_item);
if ((NEW.dese_id <> 0) AND (new.dede_anulado = 'N')) then
    BEGIN
    EXECUTE PROCEDURE LEE_CONFIGURACION('INVENTARIO', 'ENSAMBLES', 'FORMACIONES CON CANTIDADES TOTALES') returning_values (:CANTOT);
    select dese_fecha, dese_conc, pref_pre, dese_numero, dese_cant * dese_factor
        from desensambles where dese_id = new.dese_id into :fec, :conc, :Pref, :Num, :CANT;
    execute procedure factor_unidad_cant(new.arti_cod, new.dede_unidad) returning_values(factor);
    execute procedure costo_promedio(new.arti_cod, :FEC) returning_values (:COSTO);
    if (CANTOT <> 'SI') then
        CANT = CANT * factor * new.dede_cant;
    ELSE
        CANT = factor * new.dede_cant;
    INSERT INTO MOVIMIENTO_ARTICULO
        (ARTI_COD, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM)
        VALUES(NEW.ARTI_COD, NEW.BODE_COD, :FEC, 16, NEW.dese_id,
        :CONC, :CANT, :COSTO, 'S', new.dede_lote, :Pref, :Num, new.dese_item);

    /* RECORRA LAS LISTAS DE PRECIOS Y CAMBIE EL PRECIO */
    EXECUTE PROCEDURE CALCULA_PRECIOS(NEW.ARTI_COD, :fec);
    END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER DEVOLUCIONES_COMPRAS_DET_AI FOR DEVOLUCIONES_COMPRAS_DET
ACTIVE AFTER INSERT POSITION 0
AS
declare variable fec date;
declare variable CONC VARCHAR(60);
declare variable factor numeric(18,4);
declare variable Pref varchar(4);
declare variable Num varchar(6);
declare variable Nit varchar(20);
declare variable ID INTEGER;
declare variable DEVUELTO NUMERIC(18,4);
declare variable CANT NUMERIC(18, 4);
declare variable CANTAUX NUMERIC(18, 4);
declare variable FACT VARCHAR(10);
declare variable SINFACT VARCHAR(2);
BEGIN
  if ((NEW.dvco_id <> 0) and (new.dvcd_anulado = 'N')) then
    BEGIN
    select dvco_fecha, pref_pre, dvco_numero, terc_nit, dvco_factura from devoluciones_compras where dvco_id = new.dvco_id into :fec, :Pref, :Num, :Nit, Fact;
    execute procedure factor_unidad_cant(new.arti_cod, new.dvcd_unidad) returning_values(factor);
    CONC = 'DEVOLUCION COMPRA No.' || PREF || NUM || ' - FACTURA ' || FACT;
    execute procedure LEE_CONFIGURACION ('COMPRAS','DEVOLUCIONES','PERMITIR DEVOLVER ARTICULOS NO FACTURADOS') returning_values (:SINFACT);
    /* ACTUALICE LO DEVUELTO EN LA FACTURA */
    SELECT DVCO_FACTID FROM DEVOLUCIONES_COMPRAS
      WHERE DVCO_ID = NEW.DVCO_ID INTO :ID;
    if ((ID <> 0) or (SINFACT = 'SI')) then
        BEGIN
        INSERT INTO MOVIMIENTO_ARTICULO
            (ARTI_COD, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF,
            MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM, TERC_NIT)
            VALUES(NEW.ARTI_COD, NEW.BODE_COD, :FEC, 24, NEW.dvco_id,
            :CONC, :factor * new.dvcd_cant, 0, 'N', new.dvcd_lote, :Pref, :Num, NEW.dvcd_item, :Nit);
        if (ID <> 0) THEN
            BEGIN
            CANTAUX = NEW.dvcd_cant * NEW.dvcd_factor;
            FOR SELECT FCDE_CANT, FCDE_FACTOR, FCDE_DEVUELTO
              FROM facturas_compras_detalle
              WHERE FACO_ID = :ID AND ARTI_COD = NEW.ARTI_COD AND BODE_COD = NEW.bode_cod
              INTO :CANT, :FACTOR, :DEVUELTO
              DO
                BEGIN
                if ((CANT * FACTOR - DEVUELTO) < CANTAUX) then
                    BEGIN
                    UPDATE FACTURAS_COMPRAS_DETALLE
                        SET FCDE_DEVUELTO = (:CANT * :FACTOR - :DEVUELTO)
                        WHERE FACO_ID = :ID AND ARTI_COD = NEW.ARTI_COD AND BODE_COD = NEW.bode_cod;
                    CANTAUX = CANTAUX - (CANT * FACTOR - DEVUELTO);
                    END
                ELSE
                    BEGIN
                    UPDATE FACTURAS_COMPRAS_DETALLE
                        SET FCDE_DEVUELTO = FCDE_DEVUELTO + :CANTAUX
                        WHERE FACO_ID = :ID AND ARTI_COD = NEW.ARTI_COD AND BODE_COD = NEW.bode_cod;
                    CANTAUX = 0;
                    END
                END
            
            if (CANTAUX > 0) then
                EXCEPTION DEVOLUCION_MAYOR 'Esta devolviendo una cantidad mayor a la facturada del articulo ' || new.arti_cod;
            END
        END
    END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER DEVOLUCIONES_COMPRAS_DET_AU FOR DEVOLUCIONES_COMPRAS_DET
ACTIVE AFTER UPDATE POSITION 0
AS
declare variable fec date;
declare variable CONC VARCHAR(60);
declare variable Pref varchar(4);
declare variable Num varchar(6);
declare variable Nit varchar(20);
declare variable CANT NUMERIC(18, 4);
declare variable CANTAUX NUMERIC(18,4);
declare variable factor numeric(18,4);
declare variable DEVUELTO NUMERIC(18,4);
declare variable ID integer;
declare variable FACT VARCHAR(10);
declare variable SINFACT VARCHAR(2);
BEGIN
/* Anule el anterior */
if ((OLD.DVCO_ID <> 0) AND (OLD.dvcd_anulado = 'N')) then
    BEGIN
    DELETE FROM MOVIMIENTO_ARTICULO WHERE (mvar_tipodoc = 24) and (mvar_idref = new.dvco_id) and (mvar_item = old.dvcd_item);
    /* DESHAGA LO DEVUELTO EN LA FACTURA */
    SELECT DVCO_FACTID FROM DEVOLUCIONES_COMPRAS
        WHERE DVCO_ID = OLD.DVCO_ID INTO :ID;
    if (ID <> 0) then
        BEGIN
        CANTAUX = OLD.dvcd_cant * OLD.dvcd_factor;
        FOR SELECT FCDE_CANT, FCDE_FACTOR, FCDE_DEVUELTO
            FROM FACTURAS_COMPRAS_DETALLE
            WHERE FACO_ID = :ID AND ARTI_COD = OLD.ARTI_COD AND BODE_COD = OLD.bode_cod
            INTO :CANT, :FACTOR, :DEVUELTO
            DO
            BEGIN
            if (CANTAUX > (CANT * FACTOR - DEVUELTO)) then
                BEGIN
                UPDATE FACTURAS_COMPRAS_DETALLE
                    SET FCDE_DEVUELTO = 0
                    WHERE FACO_ID = :ID AND ARTI_COD = OLD.ARTI_COD AND BODE_COD = OLD.bode_cod;
                CANTAUX = CANTAUX - (CANT * FACTOR - DEVUELTO);
                END
            ELSE
                BEGIN
                UPDATE FACTURAS_COMPRAS_DETALLE
                    SET FCDE_DEVUELTO = FCDE_DEVUELTO - :CANTAUX
                    WHERE FACO_ID = :ID AND ARTI_COD = OLD.ARTI_COD AND BODE_COD = OLD.bode_cod;
                CANTAUX = 0;
                END
            END
        END
    END
if ((NEW.DVCO_ID <> 0) AND (NEW.dvcd_anulado = 'N')) then
    BEGIN
    /* Registre el nuevo */
    select dvco_fecha, pref_pre, dvco_numero, terc_nit, dvco_factura from devoluciones_compras where dvco_id = new.dvco_id into :fec, :Pref, :Num, :Nit, Fact;
    execute procedure factor_unidad_cant(new.arti_cod, new.dvcd_unidad) returning_values(factor);
    CONC = 'DEVOLUCION COMPRA No.' || PREF || NUM || ' - FACTURA ' || FACT;
    execute procedure LEE_CONFIGURACION ('COMPRAS','DEVOLUCIONES','PERMITIR DEVOLVER ARTICULOS NO FACTURADOS') returning_values (:SINFACT);
    /* ACTUALICE LO DEVUELTO EN LA FACTURA */
    SELECT DVCO_FACTID FROM DEVOLUCIONES_COMPRAS
        WHERE DVCO_ID = NEW.DVCO_ID INTO :ID;
    if ((ID <> 0) or (SINFACT = 'SI')) then
        BEGIN
        INSERT INTO MOVIMIENTO_ARTICULO
            (ARTI_COD, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM, TERC_NIT)
            VALUES(NEW.ARTI_COD, NEW.BODE_COD, :FEC, 24, NEW.dvco_id,
            :CONC, :factor * new.dvcd_cant, 0, 'N', new.dvcd_lote, :Pref, :Num, NEW.dvcd_item, :Nit);
        if (ID <> 0) THEN
            BEGIN
            CANTAUX = NEW.dvcd_cant * NEW.dvcd_factor;
            FOR SELECT FCDE_CANT, FCDE_FACTOR, FCDE_DEVUELTO
                FROM FACTURAS_COMPRAS_DETALLE
                WHERE FACO_ID = :ID AND ARTI_COD = NEW.ARTI_COD AND BODE_COD = NEW.bode_cod
                INTO :CANT, :FACTOR, :DEVUELTO
                DO
                BEGIN
                if ((CANT * FACTOR - DEVUELTO) < CANTAUX) then
                    BEGIN
                    UPDATE FACTURAS_COMPRAS_DETALLE
                        SET FCDE_DEVUELTO = (:CANT * :FACTOR - :DEVUELTO)
                        WHERE FACO_ID = :ID AND ARTI_COD = NEW.ARTI_COD AND BODE_COD = NEW.bode_cod;
                    CANTAUX = CANTAUX - (CANT * FACTOR - DEVUELTO);
                    END
                ELSE
                    BEGIN
                    UPDATE FACTURAS_COMPRAS_DETALLE
                        SET FCDE_DEVUELTO = FCDE_DEVUELTO + :CANTAUX
                        WHERE FACO_ID = :ID AND ARTI_COD = NEW.ARTI_COD AND BODE_COD = NEW.bode_cod;
                    CANTAUX = 0;
                    END
                END
            
            if (CANTAUX > 0) then
                EXCEPTION DEVOLUCION_MAYOR 'Esta devolviendo una cantidad mayor a la facturada del articulo ' || new.arti_cod;
            END
        END
    end
END
^

SET TERM ; ^

SET TERM ^ ;

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

SET TERM ; ^

SET TERM ^ ;

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

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER ENSAMBLES_AI FOR ENSAMBLES
ACTIVE AFTER INSERT POSITION 0
AS
declare variable COSTO NUMERIC(18,2);
declare variable ARTPRIN VARCHAR(2);
BEGIN
if ((NEW.ENSA_id <> 0) and (new.ensa_anulado = 'N')) then
  begin
  COSTO = new.ensa_costo / NEW.ensa_factor;
  INSERT INTO MOVIMIENTO_ARTICULO
    (ARTI_COD, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM)
    VALUES(NEW.ARTI_COD, new.bode_cod, new.ensa_fecha, 15, NEW.ensa_id,
    new.ensa_conc, NEW.ensa_factor * new.ensa_cant, :COSTO, 'S', new.ensa_lote, new.pref_pre, new.ensa_numero, 0);

  /* RECORRA LAS LISTAS DE PRECIOS Y CAMBIE EL PRECIO */
  EXECUTE PROCEDURE CALCULA_PRECIOS(NEW.ARTI_COD, new.ensa_fecha);

  /* ingrese el retal */
  execute procedure lee_configuracion('INVENTARIO', 'ENSAMBLES', 'ENSAMBLES CON UN ARTICULO PRINCIPAL COMO BASE') returning_values (:ARTPRIN);
  if (ARTPRIN = 'SI') then
    BEGIN
    if ((new.ensa_codretal is not null) and (new.ensa_codretal <> '')) then
      INSERT INTO MOVIMIENTO_ARTICULO
        (ARTI_COD, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM)
        VALUES(NEW.ensa_codretal, new.ensa_bodretal, new.ensa_fecha, 15, NEW.ensa_id,
        new.ensa_conc, new.ensa_cantretal, 0, 'N', new.ensa_lote, new.pref_pre, new.ensa_numero, 999);
    END
  else
    BEGIN
    if ((new.ensa_codretal is not null) and (new.ensa_codretal <> '')) then
      INSERT INTO MOVIMIENTO_ARTICULO
        (ARTI_COD, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM)
        VALUES(NEW.ensa_codretal, new.ensa_bodretal, new.ensa_fecha, 15, NEW.ensa_id,
        new.ensa_conc, new.ensa_cantretal, :COSTO, 'S', new.ensa_lote, new.pref_pre, new.ensa_numero, 999);
    END
  INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
    VALUES (USER, 15, NEW.ensa_id, 'I', NEW.pref_pre || NEW.ensa_numero);
  end
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER ENSAMBLES_AU FOR ENSAMBLES
ACTIVE AFTER UPDATE POSITION 0
AS
declare variable COSTO NUMERIC(18,2);
declare variable consec INTEGER;
declare variable ARTPRIN VARCHAR(2);
BEGIN
/* BORRE LA CONTABILIZACION */
if (NEW.ensa_anulado = 'S') then
    BEGIN
    select enco_consec from comprobante_encabezado where enco_tiporef = 15 and enco_idref = old.ensa_id into :consec;
    if (NOT consec is null) then
     delete from comprobante_detalle where enco_consec = :consec;
    delete from comprobante_encabezado where enco_tiporef = 15 and enco_idref = old.ensa_id;
    INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
        VALUES (USER, 15, NEW.ensa_id, 'A', NEW.pref_pre || NEW.ensa_numero);
    END

/* BORRE EL ANTERIOR Y GRABE EL NUEVO */
if ((OLD.ensa_id <> 0) AND (OLD.ensa_anulado = 'N')) then
    begin
    delete from movimiento_articulo where (mvar_tipodoc = 15) and (mvar_idref = old.ensa_id) and (mvar_item = 0);
    delete from movimiento_articulo where (mvar_tipodoc = 15) and (mvar_idref = old.ensa_id) and (mvar_item = 999);
    end
if ((new.ensa_id <> 0) AND (NEW.ensa_anulado = 'N')) then
    begin
    COSTO = new.ensa_costo / NEW.ensa_factor;
    INSERT INTO MOVIMIENTO_ARTICULO
        (ARTI_COD, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM)
        VALUES(NEW.ARTI_COD, new.ensa_bodretal, new.ensa_fecha, 15, NEW.ensa_id,
        new.ensa_conc, NEW.ensa_factor * new.ensa_cant, :COSTO, 'S', new.ensa_lote, new.pref_pre, new.ensa_numero, 0);

    /* RECORRA LAS LISTAS DE PRECIOS Y CAMBIE EL PRECIO */
    EXECUTE PROCEDURE CALCULA_PRECIOS(NEW.ARTI_COD, new.ensa_fecha);

    /* ingrese el retal */
    execute procedure lee_configuracion('INVENTARIO', 'ENSAMBLES', 'ENSAMBLES CON UN ARTICULO PRINCIPAL COMO BASE') returning_values (:ARTPRIN);
    if (ARTPRIN = 'SI') then
        BEGIN
        if ((new.ensa_codretal is not null) and (new.ensa_codretal <> '')) then
            INSERT INTO MOVIMIENTO_ARTICULO
                (ARTI_COD, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM)
                VALUES(NEW.ensa_codretal, new.ensa_bodretal, new.ensa_fecha, 15, NEW.ensa_id,
                new.ensa_conc, new.ensa_cantretal, 0, 'N', new.ensa_lote, new.pref_pre, new.ensa_numero, 999);
        END
    else
        BEGIN
        if ((new.ensa_codretal is not null) and (new.ensa_codretal <> '')) then
            INSERT INTO MOVIMIENTO_ARTICULO
                (ARTI_COD, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM)
                VALUES(NEW.ensa_codretal, new.bode_cod, new.ensa_fecha, 15, NEW.ensa_id,
                new.ensa_conc, new.ensa_cantretal, :COSTO, 'S', new.ensa_lote, new.pref_pre, new.ensa_numero, 999);
        END
    INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
        VALUES (USER, 15, NEW.ensa_id, 'U', NEW.pref_pre || NEW.ensa_numero);
    end
/* SI CAMBIO LA FECHA ACTUALICE LOS DETALLES */
if ((OLD.pref_pre <> NEW.pref_pre) or
    (OLD.ensa_numero <> NEW.ensa_numero) or
    (OLD.ensa_fecha <> NEW.ensa_fecha) ) then
    UPDATE ENSAMBLES_DETALLE SET ESDE_TRANSMIT = 'N' WHERE ENSA_ID = OLD.ENSA_ID;

if (OLD.ensa_anulado <> NEW.ensa_anulado) then
    UPDATE ENSAMBLES_DETALLE SET ESDE_ANULADO = NEW.ensa_anulado WHERE ENSA_ID = OLD.ENSA_ID;

if (OLD.ensa_transmit <> NEW.ensa_transmit) then
    UPDATE ENSAMBLES_DETALLE SET ESDE_TRANSMIT = NEW.ensa_transmit WHERE ENSA_ID = OLD.ENSA_ID;
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER ENSAMBLES_DETALLE_AI FOR ENSAMBLES_DETALLE
ACTIVE AFTER INSERT POSITION 0
AS
declare variable fec date;
declare variable CONC VARCHAR(60);
declare variable factor numeric(18,4);
declare variable Pref varchar(4);
declare variable Num varchar(6);
declare variable CANT NUMERIC(18,2);
declare variable CANTOT CHAR(2);
BEGIN
  if ((NEW.ENSA_id <> 0) and (new.esde_anulado = 'N')) then
    begin
    select ensa_fecha, ensa_conc, pref_pre, ensa_numero, (ensa_cant * ensa_factor) from ensambles where ensa_id = new.ensa_id into :fec, :conc, :Pref, :Num, :CANT;
    execute procedure factor_unidad_cant(new.arti_cod, new.esde_unidad) returning_values(factor);
    EXECUTE PROCEDURE LEE_CONFIGURACION('INVENTARIO', 'ENSAMBLES', 'FORMACIONES CON CANTIDADES TOTALES') returning_values (:CANTOT);
    if (CANTOT <> 'SI') then
        CANT = CANT * factor * new.esde_cant;
    ELSE
        CANT = factor * new.esde_cant;
    INSERT INTO MOVIMIENTO_ARTICULO
      (ARTI_COD, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM)
      VALUES(NEW.ARTI_COD, NEW.BODE_COD, :FEC, 15, NEW.ensa_id,
      :CONC, :CANT, 0, 'N', new.esde_lote, :Pref, :Num, new.esde_item);
    END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER ENSAMBLES_DETALLE_AU FOR ENSAMBLES_DETALLE
ACTIVE AFTER UPDATE POSITION 0
AS
declare variable fec date;
declare variable CONC VARCHAR(60);
declare variable Pref varchar(4);
declare variable Num varchar(6);
declare variable factor numeric(18,4);
declare variable CANT NUMERIC(18, 2);
declare variable CANTOT CHAR(2);
BEGIN
if ((old.arti_cod <> new.arti_cod) or (old.esde_cant <> new.esde_cant) or (old.esde_unidad <> new.esde_unidad) or (old.esde_lote <> new.esde_lote) or
    (old.esde_anulado <> new.esde_anulado) or (old.esde_transmit <> new.esde_transmit)) then
  begin
  if ((old.ensa_id <> 0) and (old.esde_anulado = 'N')) then
    DELETE FROM MOVIMIENTO_ARTICULO WHERE (mvar_tipodoc = 15) and (mvar_idref = new.ensa_id) and (mvar_item = old.esde_item);
  /* Registre el nuevo */
  if ((new.ensa_id <> 0) and (new.esde_anulado = 'N')) then
    BEGIN
    EXECUTE PROCEDURE LEE_CONFIGURACION('INVENTARIO', 'ENSAMBLES', 'FORMACIONES CON CANTIDADES TOTALES') returning_values (:CANTOT);
    select ensa_fecha, ensa_conc, pref_pre, ensa_numero, ensa_cant * ensa_factor from ensambles where ensa_id = new.ensa_id into :fec, :conc, :Pref, :Num, :CANT;
    execute procedure factor_unidad_cant(new.arti_cod, new.esde_unidad) returning_values(factor);
    if (CANTOT <> 'SI') then
        CANT = CANT * factor * new.esde_cant;
    ELSE
        CANT = factor * new.esde_cant;
    INSERT INTO MOVIMIENTO_ARTICULO
        (ARTI_COD, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM)
        VALUES(NEW.ARTI_COD, NEW.BODE_COD, :FEC, 15, NEW.ensa_id,
        :CONC, :CANT, 0, 'N', new.esde_lote, :Pref, :Num, new.esde_item);
    END
  end
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER ENTRADAS_DETALLE_AI FOR ENTRADAS_DETALLE
ACTIVE AFTER INSERT POSITION 0
AS
declare variable fec date;
declare variable CONC VARCHAR(60);
declare variable factor numeric(18,4);
declare variable Pref varchar(4);
declare variable Num varchar(6);
declare variable Nit varchar(20);
declare variable IVAINC CHAR(2);
declare variable ICOINC CHAR(2);
declare variable COSTO NUMERIC(18,2);
BEGIN
  if ((NEW.entr_id <> 0) and (new.ende_anulado = 'N')) then
    BEGIN
    select entr_fecha, entr_conc, pref_pre, entr_numero, terc_nit, entr_imptos
        from entradas where entr_id = new.entr_id
        into :fec, :conc, :Pref, :Num, :Nit, :ivainc;
    execute procedure factor_unidad_cant(new.arti_cod, new.ende_unidad) returning_values(factor);
    COSTO = ((new.ende_costo - NEW.ende_dtomonto) / :factor);
    if (IVAINC = 'S') then
        BEGIN
        COSTO = COSTO / (1 + NEW.ende_ivaporc/100);
        EXECUTE PROCEDURE lee_configuracion ('FACTURACION', 'ARTICULOS', 'IMPOCONSUMO INCLUIDO EN EL PRECIO BASE DE VENTA ANTES DE IVA') returning_values(:icoinc);
        if (icoinc = 'SI') then
            COSTO = COSTO - (NEW.ende_consumo/(NEW.ende_cant * new.ende_factor));
        END
    INSERT INTO MOVIMIENTO_ARTICULO
      (ARTI_COD, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM, TERC_NIT)
      VALUES(NEW.ARTI_COD, NEW.BODE_COD, :FEC, 11, NEW.entr_id,
      :CONC, :factor * new.ende_cant, :costo, 'S', new.ende_lote, :Pref, :Num, new.ende_item, :Nit);
    /* RECORRA LAS LISTAS DE PRECIOS Y CAMBIE EL PRECIO */
    EXECUTE PROCEDURE CALCULA_PRECIOS(NEW.ARTI_COD, :FEC);
    /* ACTUALICE EL STAND */
    if (new.ende_stand is not null) then
      if (exists(select stand_cod from stands where arti_cod = new.arti_cod and stand_bodega = new.bode_cod)) then
        UPDATE stands set stand_cod = new.ende_stand where arti_cod = new.arti_cod and stand_bodega = new.bode_cod;
      else
        INSERT INTO stands (ARTI_COD, STAND_BODEGA, STAND_COD) VALUES (NEW.arti_cod, NEW.bode_cod, NEW.ende_stand);
    END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER ENTRADAS_DETALLE_AU FOR ENTRADAS_DETALLE
ACTIVE AFTER UPDATE POSITION 0
as
declare variable fec date;
declare variable CONC VARCHAR(60);
declare variable Pref varchar(4);
declare variable Num varchar(6);
declare variable Nit varchar(20);
declare variable factor numeric(18,4);
declare variable IVAINC CHAR(2);
declare variable ICOINC CHAR(2);
declare variable COSTO NUMERIC(18,2);
BEGIN
if ((OLD.entr_id <> 0) AND (OLD.ende_anulado = 'N')) then
    DELETE FROM MOVIMIENTO_ARTICULO WHERE (mvar_tipodoc = 11) and (mvar_idref = new.entr_id) and (mvar_item = old.ende_item);
if ((NEW.entr_id <> 0) AND (NEW.ende_anulado = 'N')) then
    begin
    select entr_fecha, entr_conc, pref_pre, entr_numero, terc_nit, entr_imptos
        from entradas where entr_id = new.entr_id
        into :fec, :conc, :Pref, :Num, :Nit, :ivainc;
    execute procedure factor_unidad_cant(new.arti_cod, new.ende_unidad) returning_values(factor);
    COSTO = ((new.ende_costo - NEW.ende_dtomonto) / :factor);
    if (IVAINC = 'S') then
        BEGIN
        COSTO = COSTO / (1 + NEW.ende_ivaporc/100);
        EXECUTE PROCEDURE lee_configuracion ('FACTURACION', 'ARTICULOS', 'IMPOCONSUMO INCLUIDO EN EL PRECIO BASE DE VENTA ANTES DE IVA') returning_values(:icoinc);
        if (icoinc = 'SI') then
            COSTO = COSTO - (NEW.ende_consumo/(NEW.ende_cant * new.ende_factor));
        END
    INSERT INTO MOVIMIENTO_ARTICULO
        (ARTI_COD, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM, TERC_NIT)
        VALUES(NEW.ARTI_COD, NEW.BODE_COD, :FEC, 11, NEW.entr_id,
        :CONC, :factor * new.ende_cant, :COSTO, 'S', new.ende_lote, :Pref, :Num, new.ende_item, :Nit);
    /* RECORRA LAS LISTAS DE PRECIOS Y CAMBIE EL PRECIO */
    EXECUTE PROCEDURE CALCULA_PRECIOS(NEW.ARTI_COD, :FEC);
    /* ACTUALICE EL STAND */
    if (new.ende_stand is not null) then
      if (exists(select stand_cod from stands where arti_cod = new.arti_cod and stand_bodega = new.bode_cod)) then
        UPDATE stands set stand_cod = new.ende_stand where arti_cod = new.arti_cod and stand_bodega = new.bode_cod;
      else
        INSERT INTO stands (ARTI_COD, STAND_BODEGA, STAND_COD) VALUES (NEW.arti_cod, NEW.bode_cod, NEW.ende_stand);
    END
END
^

SET TERM ; ^

SET TERM ^ ;

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

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

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

    /* ACTUALICE EL PENDIENTE  */
    if (CONSOLIDA <> 0) then
        BEGIN
        UPDATE consolidado_faltantes SET COFA_OK = 'S' WHERE COFA_ID = :consolida AND COFA_ITEM = NEW.FCDE_ITEM AND ARTI_COD = NEW.arti_cod;
        EXECUTE procedure LEE_CONFIGURACION ('COMPRAS','DOCUMENTOS','SUMAR CANTIDADES PENDIENTES AL CONSOLIDAR DOCUMENTOS') returning_values (CONSO);
        /* IGNORE LA CONSOLIDACION SI SE VALIDAN CODIGOS DE LA ORDEN */
        SELECT MIN(CEFA_TIPOORI) FROM consolide_faltantes WHERE CEFA_ID = :CONSOLIDA INTO :NUMROWS;
        if (NUMROWS = 23) then
            BEGIN
            EXECUTE PROCEDURE LEE_CONFIGURACION('COMPRAS', 'FACTURAS', 'VERIFICAR CODIGOS DE LA ORDEN') returning_values (MENORV);
            if (MENORV = 'SI') then
                CONSO = 'NO';
            END
        SELECT COUNT(CEFA_ITEM) FROM consolide_faltantes WHERE CEFA_ID = :CONSOLIDA INTO :NUMROWS;
        if ((CONSO = 'SI') AND (NUMROWS > 1)) then
            UPDATE consolidado_faltantes SET COFA_IDDES = NEW.faco_id, COFA_OK = 'S' WHERE COFA_ID = :consolida;
        else
            BEGIN
            /* BUSQUE EL CONSOLIDADO EN EL MISMO ITEM Y SI ES DIFERENTE ACTUALICELO */
            select COFA_CANT * COFA_FACTOR FROM consolidado_faltantes WHERE COFA_ID = :consolida AND COFA_ITEM = NEW.FCDE_ITEM AND ARTI_COD = NEW.arti_cod INTO :CANTREL;
            if (NEW.FCDE_CANT * NEW.FCDE_FACTOR < CANTREL) then
                UPDATE consolidado_faltantes SET COFA_IDDES = NEW.faco_id, COFA_CANT = NEW.FCDE_CANT, COFA_FACTOR = NEW.FCDE_FACTOR
                    WHERE COFA_ID = :consolida AND COFA_ITEM = NEW.FCDE_ITEM AND ARTI_COD = NEW.arti_cod;
            END
        END
    /* ACTUALICE EL STAND */
    if (new.fcde_stand is not null) then
      if (exists(select stand_cod from stands where arti_cod = new.arti_cod and stand_bodega = new.bode_cod)) then
        UPDATE stands set stand_cod = new.fcde_stand where arti_cod = new.arti_cod and stand_bodega = new.bode_cod;
      else
        INSERT INTO stands (ARTI_COD, STAND_BODEGA, STAND_COD) VALUES (NEW.arti_cod, NEW.bode_cod, NEW.fcde_stand);
    END
END
^

SET TERM ; ^

SET TERM ^ ;

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

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

        if (CONSOLIDA <> 0) then
            begin
            UPDATE consolidado_faltantes SET COFA_OK = 'S' WHERE COFA_ID = :consolida AND COFA_ITEM = NEW.FCDE_ITEM AND ARTI_COD = NEW.arti_cod;
            EXECUTE procedure LEE_CONFIGURACION ('COMPRAS','DOCUMENTOS','SUMAR CANTIDADES PENDIENTES AL CONSOLIDAR DOCUMENTOS') returning_values (CONSO);
            /* IGNORE LA CONSOLIDACION SI SE VALIDAN CODIGOS DE LA ORDEN */
            SELECT MIN(CEFA_TIPOORI) FROM consolide_faltantes WHERE CEFA_ID = :CONSOLIDA INTO :NUMROWS;
            if (NUMROWS = 23) then
                BEGIN
                EXECUTE PROCEDURE LEE_CONFIGURACION('COMPRAS', 'FACTURAS', 'VERIFICAR CODIGOS DE LA ORDEN') returning_values (MENORV);
                if (MENORV = 'SI') then
                    CONSO = 'NO';
                END
            SELECT COUNT(CEFA_ITEM) FROM consolide_faltantes WHERE CEFA_ID = :CONSOLIDA INTO :NUMROWS;
            if ((CONSO = 'SI') AND (NUMROWS > 1)) then
                UPDATE consolidado_faltantes SET COFA_IDDES = NEW.faco_id, COFA_OK = 'S' WHERE COFA_ID = :consolida;
            else
                BEGIN
                /* BUSQUE EL CONSOLIDADO EN EL MISMO ITEM Y SI ES DIFERENTE ACTUALICELO */
                select COFA_CANT * COFA_FACTOR FROM consolidado_faltantes WHERE COFA_ID = :consolida AND COFA_ITEM = NEW.FCDE_ITEM AND ARTI_COD = NEW.arti_cod INTO :CANTREL;
                if (NEW.FCDE_CANT * NEW.FCDE_FACTOR < CANTREL) then
                    UPDATE consolidado_faltantes SET COFA_IDDES = NEW.faco_id, COFA_CANT = NEW.FCDE_CANT, COFA_FACTOR = NEW.FCDE_FACTOR
                        WHERE COFA_ID = :consolida AND COFA_ITEM = NEW.FCDE_ITEM AND ARTI_COD = NEW.arti_cod;
                END
            end
        /* ACTUALICE EL STAND */
        if (new.fcde_stand is not null) then
          if (exists(select stand_cod from stands where arti_cod = new.arti_cod and stand_bodega = new.bode_cod)) then
            UPDATE stands set stand_cod = new.fcde_stand where arti_cod = new.arti_cod and stand_bodega = new.bode_cod;
          else
            INSERT INTO stands (ARTI_COD, STAND_BODEGA, STAND_COD) VALUES (NEW.arti_cod, NEW.bode_cod, NEW.fcde_stand);
        END
    end
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER FACTURAS_DETALLE_AI FOR FACTURAS_DETALLE
ACTIVE AFTER INSERT POSITION 0
AS
declare variable fec date;
declare variable NOMCLI VARCHAR(60);
declare variable CONC VARCHAR(60);
declare variable Pref varchar(4);
declare variable Num varchar(6);
declare variable Nit varchar(20);
declare variable TIPO INTEGER;
declare variable INVFAC CHAR(2);
declare variable PEDAUTO CHAR(2);
declare variable CANTREL NUMERIC(18,4);
declare variable CONSO CHAR(2);
declare variable CONSOLIDA INTEGER;
declare variable ESPOS CHAR(1);
BEGIN
select fact_fecha, pref_pre, fact_numero, terc_nit, fact_nomcliente, fact_consolida
    from facturas where fact_id = new.fact_id
    into :fec, :Pref, :Num, :Nit, :Nomcli, :Consolida;
if ((NEW.fact_id <> 0) and (new.fade_anulado = 'N')) then
    BEGIN
    EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION','FACTURAS','GENERAR PEDIDO AUTOMATICAMENTE CON LA FACTURA') RETURNING_VALUES (PEDAUTO);
    SELECT MAX(CEFA_TIPOORI) FROM consolide_faltantes WHERE CEFA_ID = :CONSOLIDA INTO :TIPO;
    if (Tipo IS NULL) then
        Tipo = 0;
    execute procedure lee_configuracion('FACTURACION', 'FACTURAS', 'AFECTAR INVENTARIO CON LA FACTURA') returning_values (:INVFAC);
    SELECT MIN(AUTO_ESPOS) FROM AUTORIZACIONES WHERE PREF_PRE = :pref INTO :ESPOS;
    if (ESPOS = 'S') then
        BEGIN
        INVFAC = 'SI';
        PEDAUTO = 'NO';
        END
    /* si se hizo con base en una remisi¢n no afecte inventario */
    if ((Tipo <> 32) and (INVFAC = 'SI')) then
        begin
        if (STRLEN(NOMCLI) > 42) then
            CONC = 'FV No.' || :pref || :num || '-' || SUBSTR(NOMCLI, 1, 42);
        ELSE
            CONC = 'FV No.' || :pref || :NUM || '-' || NOMCLI;
        INSERT INTO MOVIMIENTO_ARTICULO
            (ARTI_COD, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM, TERC_NIT)
            VALUES(NEW.ARTI_COD, NEW.BODE_COD, :FEC, 31, NEW.fact_id,
            :CONC, new.fade_factor * new.fade_cant, 0, 'N', new.fade_lote, :Pref, :Num, new.fade_item, :Nit);
        end
    if (PEDAUTO = 'SI') then
        BEGIN
        INSERT INTO PEDIDOS_DETALLE (PEDI_ID, PEDE_ITEM, ARTI_COD, PEDE_CANT, PEDE_UNIDAD, PEDE_DTOPORC, PEDE_DTOMONTO, PEDE_IVAPORC, PEDE_IVAMONTO, PEDE_CONSUMO, PEDE_FACTOR, PEDE_DESC, PEDE_OBS, PEDE_CODBAR, PEDE_TOTAL, PEDE_ANULADO, PEDE_TRANSMIT, LIPR_COD, PEDE_REFERENCIA, PEDE_PRUNIT, PEDE_FACTURAD, PEDE_REMISIONAD, PEDE_RESERVA, BODE_COD)
            VALUES (GEN_ID(id_pedido,0), NEW.FADE_ITEM, NEW.ARTI_COD, NEW.FADE_CANT, NEW.FADE_UNIDAD, NEW.FADE_DTOPORC, NEW.FADE_DTOMONTO, NEW.FADE_IVAPORC, NEW.FADE_IVAMONTO, NEW.FADE_CONSUMO, NEW.FADE_FACTOR, NEW.FADE_DESC, NEW.FADE_OBS, NEW.FADE_CODBAR, NEW.FADE_TOTAL, 'N', 'N', NEW.LIPR_COD, NEW.FADE_REFERENCIA, NEW.FADE_PRUNIT, NEW.FADE_CANT * NEW.FADE_FACTOR, 0, NEW.FADE_CANT * NEW.FADE_FACTOR, NEW.bode_cod);
        END
    ELSE
        BEGIN
        if (CONSOLIDA <> 0) then
            BEGIN
            EXECUTE procedure LEE_CONFIGURACION ('FACTURACION','DOCUMENTOS','DEJAR PENDIENTES LOS ARTICULOS NO INCLUIDOS AL TRAER DOCUMENTOS RELACIONADOS') returning_values (CONSO);
            if (CONSO = 'NO') then
                UPDATE consolidado_faltantes SET COFA_IDDES = NEW.fact_id, COFA_OK = 'S' WHERE COFA_ID = :consolida;
            ELSE
                BEGIN
                UPDATE consolidado_faltantes SET COFA_IDDES = NEW.fact_id, COFA_OK = 'S' WHERE COFA_ID = :consolida AND COFA_ITEM = NEW.FADE_ITEM AND ARTI_COD = NEW.arti_cod;
                /* BUSQUE EL CONSOLIDADO EN EL MISMO ITEM Y SI ES DIFERENTE ACTUALICELO */
                select COFA_CANT * COFA_FACTOR FROM consolidado_faltantes WHERE COFA_ID = :consolida AND COFA_ITEM = NEW.FADE_ITEM AND ARTI_COD = NEW.arti_cod INTO :CANTREL;
                if (NEW.FADE_CANT * NEW.FADE_FACTOR < CANTREL) then
                    UPDATE consolidado_faltantes SET COFA_IDDES = NEW.fact_id, COFA_CANT = NEW.FADE_CANT, COFA_FACTOR = NEW.FADE_FACTOR
                        WHERE COFA_ID = :consolida AND COFA_ITEM = NEW.FADE_ITEM AND ARTI_COD = NEW.arti_cod;
                END
            END
        END
    END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER FACTURAS_DETALLE_AU FOR FACTURAS_DETALLE
ACTIVE AFTER UPDATE POSITION 0
as
declare variable fec date;
declare variable CONC VARCHAR(60);
declare variable NOMCLI varchar(60);
declare variable Pref varchar(4);
declare variable Num varchar(6);
declare variable Nit varchar(20);
declare variable factor numeric(18,4);
declare variable INVFAC CHAR(2);
declare variable TIPO INTEGER;
declare variable PEDAUTO CHAR(2);
declare variable CANTREL NUMERIC(18,4);
declare variable CONSO CHAR(2);
declare variable CONSOLIDA INTEGER;
declare variable consec INTEGER;
declare variable ESPOS CHAR(1);
BEGIN
EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION','FACTURAS','GENERAR PEDIDO AUTOMATICAMENTE CON LA FACTURA') RETURNING_VALUES (PEDAUTO);
if ((OLD.fact_id <> 0) AND (OLD.fade_anulado = 'N')) then
    BEGIN
    if ((OLD.FADE_CANT * OLD.FADE_FACTOR <> NEW.fade_cant * NEW.fade_factor) or (OLD.fade_total <> NEW.fade_total) or (OLD.arti_cod <> NEW.arti_cod) or (NEW.fade_anulado = 'S')) then
        begin
        DELETE FROM MOVIMIENTO_ARTICULO WHERE (mvar_tipodoc = 31) and (mvar_idref = OLD.fact_id) and (mvar_item = old.fade_item);

        if (PEDAUTO = 'SI') then
            BEGIN
            SELECT pref_pre, fact_numero from facturas where fact_id = OLD.fact_id
                into :Pref, :Num;
            SELECT PEDI_ID FROM PEDIDOS WHERE PREF_PRE = :pref AND PEDI_NUMERO = :num into :consec;
            if (consec is not null) then
              DELETE FROM PEDIDOS_DETALLE WHERE PEDE_ITEM = OLD.FADE_ITEM AND PEDI_ID = :consec;
            END
        ELSE
            BEGIN
            /* DESHAGA LOS PENDIENTES */
            SELECT fact_consolida from facturas where fact_id = OLD.fact_id into :Consolida;
            if (CONSOLIDA <> 0) then
                BEGIN
                UPDATE consolidado_faltantes SET COFA_OK = 'N' WHERE COFA_ID = :consolida AND COFA_ITEM = OLD.FADE_ITEM AND ARTI_COD = OLD.arti_cod;
                EXECUTE procedure LEE_CONFIGURACION ('FACTURACION','DOCUMENTOS','DEJAR PENDIENTES LOS ARTICULOS NO INCLUIDOS AL TRAER DOCUMENTOS RELACIONADOS') returning_values (CONSO);
                if (CONSO = 'NO') then
                    UPDATE consolidado_faltantes SET COFA_OK = 'N' WHERE COFA_ID = :consolida;
                END
            END
        end
    END
if ((NEW.fact_id <> 0) and (new.fade_anulado = 'N')) then
    if ((OLD.fact_id = 0) OR (OLD.FADE_CANT * OLD.FADE_FACTOR <> NEW.fade_cant * NEW.fade_factor) or (OLD.fade_total <> NEW.fade_total) or (OLD.arti_cod <> NEW.arti_cod) or (OLD.fade_anulado = 'S')) then
      BEGIN
      select fact_fecha, pref_pre, fact_numero, terc_nit, fact_nomcliente, fact_consolida
            from facturas where fact_id = new.fact_id
            into :fec, :Pref, :Num, :Nit, :Nomcli, :Consolida;
      SELECT MAX(CEFA_TIPOORI) FROM consolide_faltantes WHERE CEFA_ID = :CONSOLIDA INTO :TIPO;
      if (Tipo IS NULL) then
        Tipo = 0;
      execute procedure lee_configuracion('FACTURACION', 'FACTURAS', 'AFECTAR INVENTARIO CON LA FACTURA') returning_values (:INVFAC);
      SELECT MIN(AUTO_ESPOS) FROM AUTORIZACIONES WHERE PREF_PRE = :pref INTO :ESPOS;
      if (ESPOS = 'S') then
        BEGIN
        INVFAC = 'SI';
        PEDAUTO = 'NO';
        END
       /* si se hizo con base en una remisi¢n no afecte inventario */
      if ((Tipo <> 32) and (INVFAC = 'SI')) then
        begin
        if (STRLEN(NOMCLI) > 29) then
            CONC = 'FACTURA DE VENTA No.' || PREF || NUM || '-' || SUBSTR(NOMCLI,1,29);
        ELSE
            CONC = 'FACTURA DE VENTA No.' || PREF || NUM || '-' || NOMCLI;
        DELETE FROM MOVIMIENTO_ARTICULO WHERE (mvar_tipodoc = 31) and (mvar_idref = OLD.fact_id) and (mvar_item = old.fade_item);
        execute procedure factor_unidad_cant(new.arti_cod, new.fade_unidad) returning_values(factor);
        INSERT INTO MOVIMIENTO_ARTICULO
            (ARTI_COD, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM, TERC_NIT)
            VALUES(NEW.ARTI_COD, NEW.BODE_COD, :FEC, 31, NEW.fact_id,
            :CONC, :factor * new.fade_cant, 0, 'N', new.fade_lote, :Pref, :Num, new.fade_item, :Nit);
        end
        if (PEDAUTO = 'SI') then
          BEGIN
          INSERT INTO PEDIDOS_DETALLE (PEDI_ID, PEDE_ITEM, ARTI_COD, PEDE_CANT, PEDE_UNIDAD, PEDE_DTOPORC, PEDE_DTOMONTO, PEDE_IVAPORC, PEDE_IVAMONTO, PEDE_CONSUMO, PEDE_FACTOR, PEDE_DESC, PEDE_OBS, PEDE_CODBAR, PEDE_TOTAL, PEDE_ANULADO, PEDE_TRANSMIT, LIPR_COD, PEDE_REFERENCIA, PEDE_PRUNIT, PEDE_FACTURAD, PEDE_REMISIONAD, PEDE_RESERVA, BODE_COD)
            VALUES (0, NEW.FADE_ITEM, NEW.ARTI_COD, NEW.FADE_CANT, NEW.FADE_UNIDAD, NEW.FADE_DTOPORC, NEW.FADE_DTOMONTO, NEW.FADE_IVAPORC, NEW.FADE_IVAMONTO, NEW.FADE_CONSUMO, NEW.FADE_FACTOR, NEW.FADE_DESC, NEW.FADE_OBS, NEW.FADE_CODBAR, NEW.FADE_TOTAL, 'N', 'N', NEW.LIPR_COD, NEW.FADE_REFERENCIA, NEW.FADE_PRUNIT, NEW.FADE_CANT * NEW.FADE_FACTOR, 0, NEW.FADE_CANT * NEW.FADE_FACTOR, NEW.bode_cod);
          END
        ELSE
          BEGIN
          if (CONSOLIDA <> 0) then
            BEGIN
            UPDATE consolidado_faltantes SET COFA_OK = 'S' WHERE COFA_ID = :consolida AND COFA_ITEM = NEW.FADE_ITEM AND ARTI_COD = NEW.arti_cod;
            EXECUTE procedure LEE_CONFIGURACION ('FACTURACION','DOCUMENTOS','DEJAR PENDIENTES LOS ARTICULOS NO INCLUIDOS AL TRAER DOCUMENTOS RELACIONADOS') returning_values (CONSO);
            if (CONSO = 'NO') then
                UPDATE consolidado_faltantes SET COFA_OK = 'S' WHERE COFA_ID = :consolida;
            ELSE
                BEGIN
                /* BUSQUE EL CONSOLIDADO EN EL MISMO ITEM Y SI ES DIFERENTE ACTUALICELO */
                select COFA_CANT * COFA_FACTOR FROM consolidado_faltantes WHERE COFA_ID = :consolida AND COFA_ITEM = NEW.FADE_ITEM AND ARTI_COD = NEW.arti_cod INTO :CANTREL;
                if (NEW.FADE_CANT * NEW.FADE_FACTOR < CANTREL) then
                    UPDATE consolidado_faltantes SET COFA_CANT = NEW.FADE_CANT, COFA_FACTOR = NEW.FADE_FACTOR
                        WHERE COFA_ID = :consolida AND COFA_ITEM = NEW.FADE_ITEM AND ARTI_COD = NEW.arti_cod;
                END
            END
          END
        END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER NOTAS_CREDITO_PROVEEDOR_AI FOR NOTAS_CREDITO_PROVEEDOR
ACTIVE AFTER INSERT POSITION 0
AS
declare variable COSTO NUMERIC(18,2);
declare variable EXISTENCIA NUMERIC(18,4);
declare variable CODBOD VARCHAR(3);
BEGIN
if ((NEW.NCPR_ID <> 0) and (new.ncpr_anulado = 'N')) then
    BEGIN
    /* Registre el nuevo saldo del documento */
    INSERT INTO SALDOS_DOC_CXPAGAR (SDCP_TIPOREF, SDCP_IDREF, SDCP_FECHA, TERC_NIT, SDCP_RTEFTE, SDCP_RTIVA, SDCP_RTICA, SDCP_ABONO, SDCP_ABRTFTE, SDCP_ABRTIVA, SDCP_ABRTICA, SDCP_DEBITO, SDCP_MONTO, SDCP_TRM)
        VALUES (52, NEW.NCPR_ID, NEW.ncpr_fecha, NEW.terc_nit, (NEW.ncpr_rtftemonto * -1), (NEW.ncpr_rtivamonto * -1), (NEW.ncpr_rticamonto * -1), 0, 0, 0, 0, 'N', (NEW.ncpr_monto+NEW.ncpr_ivamonto)*-1, NEW.ncpr_trm);
    /* Registre el movimiento del proveedor */
    INSERT INTO MOVIMIENTO_PROVEEDOR (MVPR_ID, TERC_NIT, MVPR_TIPOREF, MVPR_IDREF, MVPR_FECHA, MVPR_VENCE, MVPR_CONC, MVPR_MONTO, MVPR_RTFTE, MVPR_RTIVA, MVPR_RTICA, MVPR_DEBITO, MVPR_ABONO, MVPR_PREFIJO, MVPR_NUMERO, MVPR_TRM)
      VALUES (GEN_ID(ID_MOVPROV, 1), NEW.TERC_NIT, 52, NEW.NCPR_ID, NEW.NCPR_FECHA, NEW.NCPR_FECHA, NEW.NCPR_CONC, NEW.NCPR_MONTO+NEW.NCPR_IVAMONTO, NEW.NCPR_RTFTEMONTO, NEW.NCPR_RTIVAMONTO, NEW.NCPR_RTICAMONTO, 'N', 'N', NEW.pref_pre, NEW.ncpr_numero, NEW.ncpr_trm);
    /* afecte el articulo */
    if (new.arti_cod <> '') then
        begin
        /* CALCULE EL NUEVO COSTO */
        execute procedure costo_promedio (new.arti_cod, new.ncpr_fecha) returning_values (:COSTO);
        execute procedure saldo_total_inventario (new.arti_cod, new.ncpr_fecha) returning_values (:EXISTENCIA);
        COSTO = ((COSTO * EXISTENCIA) - NEW.ncpr_monto) / EXISTENCIA;
        FOR SELECT DISTINCT BODE_COD FROM EXISTENCIA WHERE ARTI_COD = NEW.ARTI_COD INTO :CODBOD do
            BEGIN
            execute procedure saldo_inventario (new.arti_cod, :CODBOD, new.ncpr_fecha) returning_values (:EXISTENCIA);
            if (EXISTENCIA <> 0) then
                BEGIN
                /* SAQUE TODO LO QUE TENGA */
                INSERT INTO MOVIMIENTO_ARTICULO
                  (ARTI_COD, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM, TERC_NIT)
                  VALUES(NEW.ARTI_COD, :CODBOD, new.ncpr_fecha, 52, NEW.ncpr_id,
                  new.ncpr_conc, :EXISTENCIA, 0, 'N', '', new.pref_pre, new.ncpr_numero, 1, new.terc_nit);
                END
            END
        FOR SELECT DISTINCT BODE_COD, MVAR_CANT FROM MOVIMIENTO_ARTICULO WHERE MVAR_TIPODOC = 52 AND MVAR_IDREF = NEW.ncpr_id
            INTO :CODBOD, :existencia do
            BEGIN
            /* META TODO CON EL NUEVO COSTO */
            INSERT INTO MOVIMIENTO_ARTICULO
              (ARTI_COD, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM, TERC_NIT)
              VALUES(NEW.ARTI_COD, :CODBOD, new.ncpr_fecha, 52, NEW.ncpr_id,
              new.ncpr_conc, :EXISTENCIA, :COSTO, 'S', '', new.pref_pre, new.ncpr_numero, 1, new.terc_nit);
            END
        /* RECORRA LAS LISTAS DE PRECIOS Y CAMBIE EL PRECIO */
        EXECUTE PROCEDURE CALCULA_PRECIOS(NEW.ARTI_COD, new.ncpr_fecha);
        end
    INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
        VALUES (USER, 52, NEW.ncpr_id, 'I', NEW.pref_pre || NEW.ncpr_numero);
    END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER NOTAS_CREDITO_PROVEEDOR_AU FOR NOTAS_CREDITO_PROVEEDOR
ACTIVE AFTER UPDATE POSITION 0
AS
declare variable ABONOS char(1);
declare variable consec INTEGER;
declare variable COSTO NUMERIC(18,2);
declare variable EXISTENCIA NUMERIC(18,4);
declare variable CODBOD VARCHAR(3);
BEGIN
if (new.ncpr_anulado = 'S') then
    begin
    select enco_consec from comprobante_encabezado where enco_tiporef = 52 and enco_idref = old.ncpr_id into :consec;
    if (NOT consec is null) then
      delete from comprobante_detalle where enco_consec = :consec;
    delete from comprobante_encabezado where enco_tiporef = 52 and enco_idref = old.ncpr_id;
    INSERT INTO AUDITORIA (AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
        VALUES (USER, 52, new.ncpr_id, 'A', NEW.pref_pre || NEW.ncpr_numero);
    end

/* BORRE EL REGISTRO PREVIO */
if ((old.ncpr_id <> 0) and (old.ncpr_anulado = 'N')) then
    begin
    /* Verifique si habia abonos a la nota */
    ABONOS = 'N';
    select 'S' FROM SALDOS_DOC_CXPAGAR WHERE SDCP_TIPOREF = 52 AND SDCP_IDREF = OLD.NCPR_ID AND SDCP_ABONO <> 0 INTO :ABONOS;
    if (ABONOS = 'N') then
        BEGIN
        /* BORRE EL REGISTRO PREVIO */
        delete from saldos_doc_cxpagar where sdcp_tiporef = 52 and sdcp_idref = old.ncpr_id;
        delete from movimiento_PROVEEDOR where (mvpr_tiporef = 52) and (mvpr_idref = old.ncpr_id);
        delete from movimiento_articulo where  (mvar_tipodoc = 52) and (mvar_idref = old.ncpr_id);
        END
    else
        exception DOCUMENTO_CON_ABONOS 'El descuento de proveedor ' || old.pref_pre || old.ncpr_numero || ' tiene abonos registrados.';
    end
if ((new.ncpr_id <> 0) and (new.ncpr_anulado = 'N')) then
    begin
    /* Registre el nuevo saldo del documento */
    INSERT INTO SALDOS_DOC_CXPAGAR (SDCP_TIPOREF, SDCP_IDREF, SDCP_FECHA, TERC_NIT, SDCP_RTEFTE, SDCP_RTIVA, SDCP_RTICA, SDCP_ABONO, SDCP_ABRTFTE, SDCP_ABRTIVA, SDCP_ABRTICA, SDCP_DEBITO, SDCP_MONTO, SDCP_TRM)
        VALUES (52, NEW.NCPR_ID, NEW.ncpr_fecha, NEW.terc_nit, (NEW.ncpr_rtftemonto * -1), (NEW.ncpr_rtivamonto * -1), (NEW.ncpr_rticamonto * -1), 0, 0, 0, 0, 'N', (NEW.ncpr_monto+NEW.ncpr_ivamonto)*-1, NEW.ncpr_trm);
    /* Registre el movimiento del proveedor */
    INSERT INTO MOVIMIENTO_PROVEEDOR (MVPR_ID, TERC_NIT, MVPR_TIPOREF, MVPR_IDREF, MVPR_FECHA, MVPR_VENCE, MVPR_CONC, MVPR_MONTO, MVPR_RTFTE, MVPR_RTIVA, MVPR_RTICA, MVPR_DEBITO, MVPR_ABONO, MVPR_PREFIJO, MVPR_NUMERO, MVPR_TRM)
        VALUES (GEN_ID(ID_MOVPROV, 1), NEW.TERC_NIT, 52, NEW.NCPR_ID, NEW.NCPR_FECHA, NEW.NCPR_FECHA, NEW.NCPR_CONC, NEW.NCPR_MONTO+NEW.ncpr_ivamonto, NEW.NCPR_RTFTEMONTO, NEW.NCPR_RTIVAMONTO, NEW.NCPR_RTICAMONTO, 'N', 'N', NEW.pref_pre, NEW.ncpr_numero, NEW.ncpr_trm);
    /* afecte el articulo */
    if (new.arti_cod <> '') then
        begin
        /* CALCULE EL NUEVO COSTO */
        execute procedure costo_promedio (new.arti_cod, new.ncpr_fecha) returning_values (:COSTO);
        execute procedure saldo_total_inventario (new.arti_cod, new.ncpr_fecha) returning_values (:EXISTENCIA);
        COSTO = ((COSTO * EXISTENCIA) - NEW.ncpr_monto) / EXISTENCIA;
        FOR SELECT DISTINCT BODE_COD FROM EXISTENCIA WHERE ARTI_COD = NEW.ARTI_COD INTO :CODBOD do
            BEGIN
            execute procedure saldo_inventario (new.arti_cod, :CODBOD, new.ncpr_fecha) returning_values (:EXISTENCIA);
            if (EXISTENCIA <> 0) then
                BEGIN
                /* SAQUE TODO LO QUE TENGA */
                INSERT INTO MOVIMIENTO_ARTICULO
                    (ARTI_COD, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM, TERC_NIT)
                    VALUES(NEW.ARTI_COD, :CODBOD, new.ncpr_fecha, 52, NEW.ncpr_id,
                    new.ncpr_conc, :EXISTENCIA, 0, 'N', '', new.pref_pre, new.ncpr_numero, 1, new.terc_nit);
                end
            END
        FOR SELECT DISTINCT BODE_COD, MVAR_CANT FROM MOVIMIENTO_ARTICULO WHERE MVAR_TIPODOC = 52 AND MVAR_IDREF = NEW.ncpr_id
            INTO :CODBOD, :existencia do
            BEGIN
            /* META TODO CON EL NUEVO COSTO */
            INSERT INTO MOVIMIENTO_ARTICULO
                (ARTI_COD, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM, TERC_NIT)
                VALUES(NEW.ARTI_COD, :CODBOD, new.ncpr_fecha, 52, NEW.ncpr_id,
                new.ncpr_conc, :EXISTENCIA, :COSTO, 'S', '', new.pref_pre, new.ncpr_numero, 1, new.terc_nit);
            END
        /* RECORRA LAS LISTAS DE PRECIOS Y CAMBIE EL PRECIO */
        EXECUTE PROCEDURE CALCULA_PRECIOS(NEW.ARTI_COD, new.ncpr_fecha);
        end
    INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
        VALUES (USER, 52, NEW.ncpr_id, 'U', NEW.pref_pre || NEW.ncpr_numero);
    end
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER NOTAS_DEBITO_PROVEEDOR_AI FOR NOTAS_DEBITO_PROVEEDOR
ACTIVE AFTER INSERT POSITION 0
AS
declare variable COSTO NUMERIC(18,2);
declare variable EXISTENCIA NUMERIC(18,4);
declare variable CODBOD VARCHAR(3);
BEGIN
  if ((NEW.NDPR_ID <> 0) and (new.ndpr_anulado = 'N')) then
    BEGIN
    INSERT INTO SALDOS_DOC_CXPAGAR (SDCP_TIPOREF, SDCP_IDREF, SDCP_FECHA, TERC_NIT, SDCP_RTEFTE, SDCP_RTIVA, SDCP_RTICA, SDCP_ABONO, SDCP_ABRTFTE, SDCP_ABRTIVA, SDCP_ABRTICA, SDCP_DEBITO, SDCP_MONTO, SDCP_TRM)
        VALUES (51, NEW.NDPR_ID, NEW.ndpr_fecha, NEW.terc_nit, NEW.ndpr_rtftemonto, NEW.ndpr_rtivamonto, NEW.ndpr_rticamonto, 0, 0, 0, 0, 'S', NEW.ndpr_monto+NEW.ndpr_ivamonto, NEW.ndpr_trm);
    /* Registre el movimiento del proveedor */
    INSERT INTO MOVIMIENTO_PROVEEDOR (MVPR_ID, TERC_NIT, MVPR_TIPOREF, MVPR_IDREF, MVPR_FECHA, MVPR_VENCE, MVPR_CONC, MVPR_MONTO, MVPR_RTFTE, MVPR_RTIVA, MVPR_RTICA, MVPR_DEBITO, MVPR_ABONO, MVPR_PREFIJO, MVPR_NUMERO, MVPR_TRM)
      VALUES (GEN_ID(ID_MOVPROV, 1), NEW.TERC_NIT, 51, NEW.NDPR_ID, NEW.NDPR_FECHA, NEW.NDPR_VENCE, NEW.NDPR_CONC, NEW.NDPR_MONTO+NEW.ndpr_Ivamonto, NEW.NDPR_RTFTEMONTO, NEW.NDPR_RTIVAMONTO, NEW.NDPR_RTICAMONTO, 'S', 'N', NEW.pref_pre, NEW.ndpr_numero, NEW.ndpr_trm);
    /* afecte el articulo */
    if (new.arti_cod <> '') then
        begin
        /* CALCULE EL NUEVO COSTO */
        execute procedure costo_promedio (new.arti_cod, new.ndpr_fecha) returning_values (:COSTO);
        execute procedure saldo_total_inventario (new.arti_cod, new.ndpr_fecha) returning_values (:EXISTENCIA);
        COSTO = (COSTO * EXISTENCIA + (NEW.ndpr_monto)) / EXISTENCIA;
        FOR SELECT DISTINCT BODE_COD FROM EXISTENCIA WHERE ARTI_COD = NEW.ARTI_COD INTO :CODBOD do
            BEGIN
            execute procedure saldo_inventario (new.arti_cod, :CODBOD, new.ndpr_fecha) returning_values (:EXISTENCIA);
            if (existencia <> 0) then
                BEGIN
                /* SAQUE TODO LO QUE TENGA */
                INSERT INTO MOVIMIENTO_ARTICULO
                  (ARTI_COD, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM, TERC_NIT)
                  VALUES(NEW.ARTI_COD, :CODBOD, new.ndpr_fecha, 51, NEW.ndpr_id,
                  new.ndpr_conc, :EXISTENCIA, 0, 'N', '', new.pref_pre, new.ndpr_numero, 1, new.terc_nit);
                END
            END
        FOR SELECT DISTINCT BODE_COD, MVAR_CANT FROM MOVIMIENTO_ARTICULO WHERE MVAR_TIPODOC = 51 AND MVAR_IDREF = NEW.ndpr_id
            INTO :CODBOD, :existencia do
            BEGIN
            /* META TODO CON EL NUEVO COSTO */
            INSERT INTO MOVIMIENTO_ARTICULO
              (ARTI_COD, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM, TERC_NIT)
              VALUES(NEW.ARTI_COD, :CODBOD, new.ndpr_fecha, 51, NEW.ndpr_id,
              new.ndpr_conc, :EXISTENCIA, :COSTO, 'S', '', new.pref_pre, new.ndpr_numero, 1, new.terc_nit);
            END
        /* RECORRA LAS LISTAS DE PRECIOS Y CAMBIE EL PRECIO */
        EXECUTE PROCEDURE CALCULA_PRECIOS(NEW.ARTI_COD, new.ndpr_fecha);
        end
    INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
        VALUES (USER, 51, NEW.ndpr_id, 'I', NEW.pref_pre || NEW.ndpr_numero);
    END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER NOTAS_DEBITO_PROVEEDOR_AU FOR NOTAS_DEBITO_PROVEEDOR
ACTIVE AFTER UPDATE POSITION 0
AS
declare variable ABONOS char(1);
declare variable consec INTEGER;
declare variable COSTO NUMERIC(18,2);
declare variable EXISTENCIA NUMERIC(18,4);
declare variable CODBOD VARCHAR(3);
BEGIN
if (new.ndpr_anulado = 'S') then
    begin
    select enco_consec from comprobante_encabezado where enco_tiporef = 51 and enco_idref = old.ndpr_id into :consec;
    if (NOT consec is null) then
      delete from comprobante_detalle where enco_consec = :consec;
    delete from comprobante_encabezado where enco_tiporef = 51 and enco_idref = old.ndpr_id;
    INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
        VALUES (USER, 51, NEW.ndpr_id, 'A', NEW.pref_pre || NEW.ndpr_numero);
    end

/* BORRE EL REGISTRO PREVIO */
if ((old.ndpr_id <> 0) and (old.ndpr_anulado = 'N')) then
    begin
    /* Verifique si habia abonos a la nota */
    ABONOS = 'N';
    select 'S' FROM SALDOS_DOC_CXPAGAR WHERE SDCP_TIPOREF = 51 AND SDCP_IDREF = OLD.NDPR_ID AND SDCP_ABONO <> 0 INTO :ABONOS;
    if (ABONOS = 'N') then
        BEGIN
        /* BORRE EL REGISTRO PREVIO */
        delete from saldos_doc_cxpagar where sdcp_tiporef = 51 and sdcp_idref = old.ndpr_id;
        delete from movimiento_PROVEEDOR where (mvpr_tiporef = 51) and (mvpr_idref = old.ndpr_id);
        delete from movimiento_articulo where  (mvar_tipodoc = 51) and (mvar_idref = old.ndpr_id);
        END
    else
        exception DOCUMENTO_CON_ABONOS 'El cargo de proveedor ' || old.pref_pre || old.ndpr_numero || ' tiene abonos registrados.';
    end
if ((new.ndpr_id <> 0) and (new.ndpr_anulado = 'N')) then
    begin
    /* Registre el nuevo saldo del documento */
    INSERT INTO SALDOS_DOC_CXPAGAR (SDCP_TIPOREF, SDCP_IDREF, SDCP_FECHA, TERC_NIT, SDCP_RTEFTE, SDCP_RTIVA, SDCP_RTICA, SDCP_ABONO, SDCP_ABRTFTE, SDCP_ABRTIVA, SDCP_ABRTICA, SDCP_DEBITO, SDCP_MONTO, SDCP_TRM)
        VALUES (51, NEW.NDPR_ID, NEW.ndpr_fecha, NEW.terc_nit, NEW.ndpr_rtftemonto, NEW.ndpr_rtivamonto, NEW.ndpr_rticamonto, 0, 0, 0, 0, 'N', NEW.ndpr_monto+NEW.ndpr_ivamonto, NEW.ndpr_trm);
    /* Registre el movimiento del proveedor */
    INSERT INTO MOVIMIENTO_PROVEEDOR (MVPR_ID, TERC_NIT, MVPR_TIPOREF, MVPR_IDREF, MVPR_FECHA, MVPR_VENCE, MVPR_CONC, MVPR_MONTO, MVPR_RTFTE, MVPR_RTIVA, MVPR_RTICA, MVPR_DEBITO, MVPR_ABONO, MVPR_PREFIJO, MVPR_NUMERO, MVPR_TRM)
        VALUES (GEN_ID(ID_MOVPROV, 1), NEW.TERC_NIT, 51, NEW.NDPR_ID, NEW.NDPR_FECHA, NEW.ndpr_vence, NEW.NDPR_CONC, NEW.NDPR_MONTO+NEW.ndpr_ivamonto, NEW.NDPR_RTFTEMONTO, NEW.NDPR_RTIVAMONTO, NEW.NDPR_RTICAMONTO, 'S', 'N', NEW.pref_pre, NEW.ndpr_numero, NEW.ndpr_trm);
    if (new.arti_cod <> '') then
        begin
        /* CALCULE EL NUEVO COSTO */
        execute procedure costo_promedio (new.arti_cod, new.ndpr_fecha) returning_values (:COSTO);
        execute procedure saldo_total_inventario (new.arti_cod, new.ndpr_fecha) returning_values (:EXISTENCIA);
        COSTO = (COSTO * EXISTENCIA + (NEW.ndpr_monto)) / EXISTENCIA;
        FOR SELECT DISTINCT BODE_COD FROM EXISTENCIA WHERE ARTI_COD = NEW.ARTI_COD INTO :CODBOD do
            BEGIN
            execute procedure saldo_inventario (new.arti_cod, :CODBOD, new.ndpr_fecha) returning_values (:EXISTENCIA);
            if (existencia <> 0) then
                BEGIN
                /* SAQUE TODO LO QUE TENGA */
                INSERT INTO MOVIMIENTO_ARTICULO
                  (ARTI_COD, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM, TERC_NIT)
                  VALUES(NEW.ARTI_COD, :CODBOD, new.ndpr_fecha, 51, NEW.ndpr_id,
                  new.ndpr_conc, :EXISTENCIA, 0, 'N', '', new.pref_pre, new.ndpr_numero, 1, new.terc_nit);
                END
            END
        FOR SELECT DISTINCT BODE_COD, MVAR_CANT FROM MOVIMIENTO_ARTICULO WHERE MVAR_TIPODOC = 51 AND MVAR_IDREF = NEW.ndpr_id
            INTO :CODBOD, :existencia do
            BEGIN
            /* META TODO CON EL NUEVO COSTO */
            INSERT INTO MOVIMIENTO_ARTICULO
              (ARTI_COD, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM, TERC_NIT)
              VALUES(NEW.ARTI_COD, :CODBOD, new.ndpr_fecha, 51, NEW.ndpr_id,
              new.ndpr_conc, :EXISTENCIA, :COSTO, 'S', '', new.pref_pre, new.ndpr_numero, 1, new.terc_nit);
            END
        /* RECORRA LAS LISTAS DE PRECIOS Y CAMBIE EL PRECIO */
        EXECUTE PROCEDURE CALCULA_PRECIOS(NEW.ARTI_COD, new.ndpr_fecha);
        end
    INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
        VALUES (USER, 51, NEW.ndpr_id, 'U', NEW.pref_pre || NEW.ndpr_numero);
    end
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER PRODUCCION_DEVOLUCION_DET_AI FOR PRODUCCION_DEVOLUCION_DET
ACTIVE AFTER INSERT POSITION 0
as
declare variable fec date;
declare variable CONC VARCHAR(60);
declare variable factor numeric(18,4);
declare variable Pref varchar(4);
declare variable Num varchar(6);
declare variable CANT NUMERIC(18,2);
BEGIN
  if ((NEW.prdd_id <> 0) and (new.prdd_anulado = 'N')) then
    begin
    select prdd_fecha, 'Devolución de material de producción No. ' || prdd_pref || prdd_numero, prdd_pref, prdd_numero
        from produccion_devolucion where prdd_id = new.prdd_id into :fec, :conc, :Pref, :Num;
    execute procedure factor_unidad_cant(new.arti_cod, new.prdd_unidad) returning_values(factor);
    CANT = factor * new.prdd_cant;
    INSERT INTO MOVIMIENTO_ARTICULO
      (ARTI_COD, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM)
      VALUES(NEW.ARTI_COD, NEW.BODE_COD, :FEC, 29, NEW.prdd_id,
      :CONC, :CANT, 0, 'S', new.prdd_lote, :Pref, :Num, new.prdd_item);
    END
end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER PRODUCCION_DEVOLUCION_DET_AU FOR PRODUCCION_DEVOLUCION_DET
ACTIVE AFTER UPDATE POSITION 0
as
declare variable fec date;
declare variable CONC VARCHAR(60);
declare variable factor numeric(18,4);
declare variable Pref varchar(4);
declare variable Num varchar(6);
declare variable CANT NUMERIC(18,2);
begin
if ((old.arti_cod <> new.arti_cod) or (old.prdd_cant <> new.prdd_cant) or (old.prdd_unidad <> new.prdd_unidad) or (old.prdd_lote <> new.prdd_lote) or
    (old.prdd_anulado <> new.prdd_anulado) or (old.prdd_transmit <> new.prdd_transmit)) then
  begin
  if ((old.prdd_id <> 0) and (old.prdd_anulado = 'N')) then
    DELETE FROM MOVIMIENTO_ARTICULO WHERE (mvar_tipodoc = 29) and (mvar_idref = old.prdd_id) and (mvar_item = old.prdd_item);
  /* Registre el nuevo */
  if ((new.prdd_id <> 0) and (new.prdd_anulado = 'N')) then
    BEGIN
    select prdd_fecha, 'Devolución de material de producción No. ' || prdd_pref || prdd_numero, prdd_pref, prdd_numero
        from produccion_devolucion where prdd_id = new.prdd_id into :fec, :conc, :Pref, :Num;
    execute procedure factor_unidad_cant(new.arti_cod, new.prdd_unidad) returning_values(factor);
    CANT = factor * new.prdd_cant;
    INSERT INTO MOVIMIENTO_ARTICULO
      (ARTI_COD, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM)
      VALUES(NEW.ARTI_COD, NEW.BODE_COD, :FEC, 29, NEW.prdd_id,
      :CONC, :CANT, 0, 'S', new.prdd_lote, :Pref, :Num, new.prdd_item);
    END
  end
end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER PRODUCCION_ENTRADA_DET_AI FOR PRODUCCION_ENTRADA_DET
ACTIVE AFTER INSERT POSITION 0
as
declare variable FEC DATE;
declare variable COSTO NUMERIC(18,2);
declare variable CONC VARCHAR(60);
declare variable LOTE VARCHAR(15);
declare variable PREF VARCHAR(4);
declare variable NUM VARCHAR(6);
declare variable RECHAZADO VARCHAR(15);
BEGIN
if ((NEW.prde_id <> 0) and (new.pren_anulado = 'N')) then
  begin
  SELECT PRDE_FECHA, PRDE_COSTO, PRDE_PREF, PRDE_NUMERO, PRDE_LOTE, PRDE_RECHAZADO
    FROM produccion_entrada_enc WHERE PRDE_ID = NEW.prde_id INTO :FEC, :COSTO, :PREF, :NUM, :LOTE, :rechazado;
  CONC = 'ENTRADA DE PRODUCTO TERMINADO No. ' || :PREF || :NUM;
  INSERT INTO MOVIMIENTO_ARTICULO
    (ARTI_COD, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM)
    VALUES(NEW.ARTI_COD, new.bode_cod, :fec, 20, NEW.prde_id,
    :conc, NEW.pren_cantok * new.pren_factor, :COSTO, 'S', :lote, :pref, :num, new.pren_item);

  /* ingrese los defectuosos */
  if ((new.pren_cantmal <> 0) AND (:RECHAZADO <> '')) then
      INSERT INTO MOVIMIENTO_ARTICULO
        (ARTI_COD, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM)
        VALUES(:rechazado, new.bode_cod, :fec, 20, NEW.prde_id,
        :conc, new.pren_cantmal * new.pren_factor * NEW.pren_peso, :COSTO, 'S', :lote, :pref, :num, new.pren_item);
  end
end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER PRODUCCION_ENTRADA_DET_AU FOR PRODUCCION_ENTRADA_DET
ACTIVE AFTER UPDATE POSITION 0
as
declare variable FEC DATE;
declare variable COSTO NUMERIC(18,2);
declare variable CONC VARCHAR(60);
declare variable LOTE VARCHAR(15);
declare variable PREF VARCHAR(4);
declare variable NUM VARCHAR(6);
declare variable RECHAZADO VARCHAR(15);
BEGIN
/* BORRE EL ANTERIOR Y GRABE EL NUEVO */
if ((OLD.prde_id <> 0) AND (OLD.pren_anulado = 'N')) then
    begin
    delete from movimiento_articulo where (mvar_tipodoc = 20) and (mvar_idref = old.prde_id) and (mvar_item = OLD.pren_item);
    end
if ((NEW.prde_id <> 0) and (new.pren_anulado = 'N')) then
  begin
  SELECT PRDE_FECHA, PRDE_COSTO, PRDE_PREF, PRDE_NUMERO, PRDE_LOTE
    FROM produccion_entrada_enc WHERE PRDE_ID = NEW.prde_id INTO :FEC, :COSTO, :PREF, :NUM, :LOTE;
  CONC = 'ENTRADA DE PRODUCTO TERMINADO No. ' || :PREF || :NUM;
  INSERT INTO MOVIMIENTO_ARTICULO
    (ARTI_COD, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM)
    VALUES(NEW.ARTI_COD, new.bode_cod, :fec, 20, NEW.prde_id,
    :conc, NEW.pren_cantok * new.pren_factor, :COSTO, 'S', :lote, :pref, :num, new.pren_item);

  /* ingrese los defectuosos */
  if ((new.pren_cantmal <> 0) AND (:RECHAZADO <> '')) then
      INSERT INTO MOVIMIENTO_ARTICULO
        (ARTI_COD, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM)
        VALUES(:rechazado, new.bode_cod, :fec, 20, NEW.prde_id,
        :conc, new.pren_cantmal * new.pren_factor * NEW.pren_peso, :COSTO, 'S', :lote, :pref, :num, new.pren_item);
  end
end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER PRODUCCION_ORDEN_DETALLE_AI FOR PRODUCCION_ORDEN_DETALLE
ACTIVE AFTER INSERT POSITION 0
as
declare variable fec date;
declare variable CONC VARCHAR(60);
declare variable factor numeric(18,4);
declare variable Pref varchar(4);
declare variable Num varchar(6);
declare variable CANT NUMERIC(18,2);
BEGIN
if ((NEW.pror_id <> 0) and (new.pode_anulado = 'N')) then
    begin
    select pror_fecha, 'Salida de material a producción No. ' || pref_pre || pror_numero, pref_pre, pror_numero
        from produccion_orden where pror_id = new.pror_id into :fec, :conc, :Pref, :Num;
    execute procedure factor_unidad_cant(new.arti_cod, new.pode_unidad) returning_values(factor);
    CANT = factor * new.pode_cant;
    INSERT INTO MOVIMIENTO_ARTICULO
      (ARTI_COD, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM)
      VALUES(NEW.arti_cod, NEW.pode_bodega, :FEC, 19, NEW.pror_id,
      :CONC, :CANT, 0, 'N', new.pode_lote, :Pref, :Num, new.pode_item);
    END
end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER PRODUCCION_ORDEN_DETALLE_AU FOR PRODUCCION_ORDEN_DETALLE
ACTIVE AFTER UPDATE POSITION 0
as
declare variable fec date;
declare variable CONC VARCHAR(60);
declare variable factor numeric(18,4);
declare variable Pref varchar(4);
declare variable Num varchar(6);
declare variable CANT NUMERIC(18,2);
BEGIN
if ((old.arti_cod <> new.arti_cod) or (old.pode_cant <> new.pode_cant) or (old.pode_unidad <> new.pode_unidad) or (old.pode_lote <> new.pode_lote) or
    (old.pode_anulado <> new.pode_anulado) or (old.pode_transmit <> new.pode_transmit)) then
  if ((old.pror_id <> 0) and (old.pode_anulado = 'N')) then
    DELETE FROM MOVIMIENTO_ARTICULO WHERE (mvar_tipodoc = 19) and (mvar_idref = old.pror_id) and (mvar_item = old.pode_item);

if ((NEW.pror_id <> 0) and (new.pode_anulado = 'N')) then
    begin
    select pror_fecha, 'Salida de material a producción No. ' || pref_pre || pror_numero, pref_pre, pror_numero
        from produccion_orden where pror_id = new.pror_id into :fec, :conc, :Pref, :Num;
    execute procedure factor_unidad_cant(new.arti_cod, new.pode_unidad) returning_values(factor);
    CANT = factor * new.pode_cant;
    INSERT INTO MOVIMIENTO_ARTICULO
      (ARTI_COD, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM)
      VALUES(NEW.arti_cod, NEW.pode_bodega, :FEC, 19, NEW.pror_id,
      :CONC, :CANT, 0, 'N', new.pode_lote, :Pref, :Num, new.pode_item);
    end
end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER PRODUCCION_SALIDA_DET_AI FOR PRODUCCION_SALIDA_DET
ACTIVE AFTER INSERT POSITION 0
as
declare variable fec date;
declare variable CONC VARCHAR(60);
declare variable factor numeric(18,4);
declare variable Pref varchar(4);
declare variable Num varchar(6);
declare variable CANT NUMERIC(18,2);
BEGIN
  if ((NEW.prsa_id <> 0) and (new.prsa_anulado = 'N')) then
    begin
    select prsa_fecha, 'Salida de material a producción No. ' || prsa_pref || prsa_numero, prsa_pref, prsa_numero
        from produccion_salida_enc where prsa_id = new.prsa_id into :fec, :conc, :Pref, :Num;
    execute procedure factor_unidad_cant(new.arti_cod, new.prsa_unidad) returning_values(factor);
    CANT = factor * new.prsa_cant;
    INSERT INTO MOVIMIENTO_ARTICULO
      (ARTI_COD, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM)
      VALUES(NEW.ARTI_COD, NEW.BODE_COD, :FEC, 28, NEW.prsa_id,
      :CONC, :CANT, 0, 'N', new.prsa_lote, :Pref, :Num, new.prsa_item);
    END
end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER PRODUCCION_SALIDA_DET_AU FOR PRODUCCION_SALIDA_DET
ACTIVE AFTER UPDATE POSITION 0
as
declare variable fec date;
declare variable CONC VARCHAR(60);
declare variable factor numeric(18,4);
declare variable Pref varchar(4);
declare variable Num varchar(6);
declare variable CANT NUMERIC(18,2);
begin
if ((old.arti_cod <> new.arti_cod) or (old.prsa_cant <> new.prsa_cant) or (old.prsa_unidad <> new.prsa_unidad) or (old.prsa_lote <> new.prsa_lote) or
    (old.prsa_anulado <> new.prsa_anulado) or (old.prsa_transmit <> new.prsa_transmit)) then
  begin
  if ((old.prsa_id <> 0) and (old.prsa_anulado = 'N')) then
    DELETE FROM MOVIMIENTO_ARTICULO WHERE (mvar_tipodoc = 28) and (mvar_idref = old.prsa_id) and (mvar_item = old.prsa_item);
  /* Registre el nuevo */
  if ((new.prsa_id <> 0) and (new.prsa_anulado = 'N')) then
    BEGIN
    select prsa_fecha, 'Salida de material a producción No. ' || prsa_pref || prsa_numero, prsa_pref, prsa_numero
        from produccion_salida_enc where prsa_id = new.prsa_id into :fec, :conc, :Pref, :Num;
    execute procedure factor_unidad_cant(new.arti_cod, new.prsa_unidad) returning_values(factor);
    CANT = factor * new.prsa_cant;
    INSERT INTO MOVIMIENTO_ARTICULO
      (ARTI_COD, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM)
      VALUES(NEW.ARTI_COD, NEW.BODE_COD, :FEC, 28, NEW.prsa_id,
      :CONC, :CANT, 0, 'N', new.prsa_lote, :Pref, :Num, new.prsa_item);
    END
  end
end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER REMISIONES_VENTA_DETALLE_AI FOR REMISIONES_VENTA_DETALLE
ACTIVE AFTER INSERT POSITION 0
AS
declare variable fec date;
declare variable CONC VARCHAR(60);
declare variable NOMCLI VARCHAR(60);
declare variable factor numeric(18,4);
declare variable Pref varchar(4);
declare variable Num varchar(6);
declare variable Nit varchar(20);
declare variable Tipo integer;
declare variable idfact integer;
declare variable numrows integer;
declare variable CANTREL NUMERIC(18,4);
declare variable CONSO CHAR(2);
declare variable CONSOLIDA INTEGER;
declare variable PEDAUTO CHAR(2);
declare variable VALPEDIDO CHAR(2);
declare variable IDPED INTEGER;
BEGIN
  if ((NEW.revt_id <> 0) and (new.rvde_anulado = 'N')) then
    BEGIN
    select revt_fecha, pref_pre, revt_numero, terc_nit, revt_nomterc, REVT_CONSOLIDA, LIPR_COD
        from remisiones_venta where revt_id = new.revt_id
        into :fec, :Pref, :Num, :Nit, :Nomcli, :consolida, :idped;
    if (strlen(nomcli) > 27) then
        CONC = 'REMISION A CLIENTE No.' || PREF || NUM || '-' ||SUBSTR(NOMCLI, 1, 27);
    else
        CONC = 'REMISION A CLIENTE No.' || PREF || NUM || '-' ||NOMCLI;

    SELECT MAX(CEFA_TIPOORI), MAX(CEFA_IDORI) FROM consolide_faltantes WHERE CEFA_ID = :CONSOLIDA INTO :TIPO, :IDFACT;
    if (Tipo is null) then
        Tipo = 0;
    if (Idfact is null) then
        Idfact = 0;
    /* si se hizo con base en una factura que afecto el inventario no afecte inventario */
    numrows = 0;
    if (Tipo = 31) Then
        begin
        select count(*) from movimiento_articulo where mvar_tipodoc = 31 and mvar_idref = :idfact into :numrows;
        if (numrows is null) then
          numrows = 0;
        end
    if (numrows = 0) then
        begin
        /* Registre el nuevo */
        execute procedure factor_unidad_cant(new.arti_cod, new.rvde_unidad) returning_values(factor);
        INSERT INTO MOVIMIENTO_ARTICULO
            (ARTI_COD, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM, TERC_NIT)
            VALUES(NEW.ARTI_COD, NEW.BODE_COD, :FEC, 32, NEW.revt_id,
            :CONC, :factor * new.rvde_cant, 0, 'N', new.rvde_lote, :Pref, :Num, new.rvde_item, :Nit);
        end

    /* ACTUALICE EL PENDIENTE  */
    if ((NEW.REVT_ID <> 0) AND (CONSOLIDA <> 0)) then
        begin
        EXECUTE procedure LEE_CONFIGURACION ('FACTURACION','DOCUMENTOS','DEJAR PENDIENTES LOS ARTICULOS NO INCLUIDOS AL TRAER DOCUMENTOS RELACIONADOS') returning_values (CONSO);
        /* IGNORELA SI SE VALIDAN CODIGOS DEL PEDIDO */
        SELECT MIN(CEFA_TIPOORI) FROM consolide_faltantes WHERE CEFA_ID = :CONSOLIDA INTO :NUMROWS;
        if (NUMROWS = 34) then
            BEGIN
            EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION', 'REMISIONES', 'VERIFICAR CODIGOS DEL PEDIDO') returning_values (VALPEDIDO);
            if (VALPEDIDO = 'SI') then
                CONSO = 'SI';
            END
        SELECT COUNT(CEFA_ITEM) FROM consolide_faltantes WHERE CEFA_ID = :CONSOLIDA INTO :NUMROWS;
        if (CONSO = 'NO') then
            UPDATE consolidado_faltantes SET COFA_OK = 'S' WHERE COFA_ID = :consolida;
        ELSE
            BEGIN
            UPDATE consolidado_faltantes SET COFA_OK = 'S' WHERE COFA_ID = :consolida AND COFA_ITEM = NEW.RVDE_ITEM AND ARTI_COD = NEW.arti_cod;
            /* BUSQUE EL CONSOLIDADO EN EL MISMO ITEM Y SI ES DIFERENTE ACTUALICELO */
            select COFA_CANT * COFA_FACTOR FROM consolidado_faltantes WHERE COFA_ID = :consolida AND COFA_ITEM = NEW.RVDE_ITEM AND ARTI_COD = NEW.arti_cod INTO :CANTREL;
            if (NEW.RVDE_CANT * NEW.RVDE_FACTOR < CANTREL) then
                UPDATE consolidado_faltantes SET COFA_CANT = NEW.RVDE_CANT, COFA_FACTOR = NEW.RVDE_FACTOR
                    WHERE COFA_ID = :consolida AND COFA_ITEM = NEW.RVDE_ITEM AND ARTI_COD = NEW.arti_cod;
            END

        /* SI HAY PEDIDO AUTOMATICO ACTUALICE EL FALTANTE DEL PEDIDO */
        EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION', 'FACTURAS', 'GENERAR PEDIDO AUTOMATICAMENTE CON LA FACTURA') returning_values (pedauto);
        if (PEDAUTO = 'SI') then
            BEGIN
            if (CONSO = 'NO') then
                UPDATE consolidado_faltantes SET COFA_OK = 'S' WHERE COFA_ID = :idped;
            ELSE
                BEGIN
                UPDATE consolidado_faltantes SET COFA_OK = 'S' WHERE COFA_ID = :IDPED AND COFA_ITEM = NEW.RVDE_ITEM AND ARTI_COD = NEW.arti_cod;
                /* BUSQUE EL CONSOLIDADO EN EL MISMO ITEM Y SI ES DIFERENTE ACTUALICELO */
                select COFA_CANT * COFA_FACTOR FROM consolidado_faltantes WHERE COFA_ID = :idped AND COFA_ITEM = NEW.RVDE_ITEM AND ARTI_COD = NEW.arti_cod INTO :CANTREL;
                if (NEW.RVDE_CANT * NEW.RVDE_FACTOR < CANTREL) then
                    UPDATE consolidado_faltantes SET COFA_CANT = NEW.RVDE_CANT, COFA_FACTOR = NEW.RVDE_FACTOR
                        WHERE COFA_ID = :idped AND COFA_ITEM = NEW.RVDE_ITEM AND ARTI_COD = NEW.arti_cod;
                END
            END
        end
    END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER REMISIONES_VENTA_DETALLE_AU FOR REMISIONES_VENTA_DETALLE
ACTIVE AFTER UPDATE POSITION 0
AS
declare variable fec date;
declare variable CONC VARCHAR(60);
declare variable NOMCLI varchar(60);
declare variable Pref varchar(4);
declare variable Num varchar(6);
declare variable Nit varchar(20);
declare variable factor numeric(18,4);
declare variable Tipo integer;
declare variable idfact integer;
declare variable numrows integer;
declare variable CANTREL NUMERIC(18,4);
declare variable CONSO CHAR(2);
declare variable CONSOLIDA INTEGER;
declare variable PEDAUTO CHAR(2);
declare variable IDPED INTEGER;
BEGIN
/* Anule el anterior */
if ((OLD.revt_id <> 0) AND (OLD.rvde_anulado = 'N')) then
  if ((OLD.rvde_cant * OLD.rvde_factor <> NEW.rvde_cant * NEW.rvde_factor) or (OLD.rvde_total <> NEW.rvde_total) or (OLD.arti_cod <> NEW.arti_cod) or (NEW.rvde_anulado = 'S')) then
    begin
    delete from movimiento_articulo where (mvar_tipodoc = 32) and (mvar_idref = old.revt_id) and (mvar_item = old.rvde_item);
    select REVT_CONSOLIDA, LIPR_COD from remisiones_venta where revt_id = old.revt_id into :CONSOLIDA, :IDPED;
    if (CONSOLIDA <> 0) then
        begin
        EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION', 'FACTURAS', 'GENERAR PEDIDO AUTOMATICAMENTE CON LA FACTURA') returning_values (pedauto);
        EXECUTE procedure LEE_CONFIGURACION ('FACTURACION','DOCUMENTOS','DEJAR PENDIENTES LOS ARTICULOS NO INCLUIDOS AL TRAER DOCUMENTOS RELACIONADOS') returning_values (CONSO);
        if (CONSO = 'SI') then
            begin
            UPDATE consolidado_faltantes SET COFA_OK = 'N' WHERE COFA_ID = :consolida AND COFA_ITEM = old.RVDE_ITEM AND ARTI_COD = old.arti_cod;
            if (PEDAUTO = 'SI') then
                UPDATE consolidado_faltantes SET COFA_OK = 'N' WHERE COFA_ID = :idped AND COFA_ITEM = old.RVDE_ITEM AND ARTI_COD = old.arti_cod;
            end
        else
            BEGIN
            UPDATE consolidado_faltantes SET COFA_OK = 'N' WHERE COFA_ID = :consolida;
            if (PEDAUTO = 'SI') then
                UPDATE consolidado_faltantes SET COFA_OK = 'N' WHERE COFA_ID = :idped;
            END
        END
    end
/* Registre el nuevo */
if ((new.revt_id <> 0) AND (new.rvde_anulado = 'N')) then
  if ((OLD.rvde_cant * OLD.rvde_factor <> NEW.rvde_cant * NEW.rvde_factor) or (OLD.rvde_total <> NEW.rvde_total) or (OLD.arti_cod <> NEW.arti_cod) or (OLD.rvde_anulado = 'S')) then
    begin
    select revt_fecha, pref_pre, revt_numero, terc_nit, revt_nomterc, REVT_CONSOLIDA, lipr_cod
        from remisiones_venta where revt_id = new.revt_id
        into :fec, :Pref, :Num, :Nit, :Nomcli, :CONSOLIDA, :idped;
    CONC = 'REMISION A CLIENTE No.' || PREF || NUM;
    NOMCLI = SUBSTR(NOMCLI, 1, 24);
    conc = conc || '-' || NOMCLI;

    SELECT MAX(CEFA_TIPOORI), MAX(CEFA_IDORI) FROM consolide_faltantes WHERE CEFA_ID = :CONSOLIDA INTO :TIPO, :IDFACT;
    if (Tipo is null) then
        Tipo = 0;
    if (Idfact is null) then
        Idfact = 0;
    /* si se hizo con base en una factura que afecto el inventario no afecte inventario */
    numrows = 0;
    if (Tipo = 31) Then
        begin
        select count(*) from movimiento_articulo where mvar_tipodoc = 31 and mvar_idref = :idfact into :numrows;
        if (numrows is null) then
            numrows = 0;
        end
    if (numrows = 0) then
        begin
        /* Registre el nuevo */
        execute procedure factor_unidad_cant(new.arti_cod, new.rvde_unidad) returning_values(factor);
        INSERT INTO MOVIMIENTO_ARTICULO
            (ARTI_COD, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM, TERC_NIT)
            VALUES(NEW.ARTI_COD, NEW.BODE_COD, :FEC, 32, NEW.revt_id,
            :CONC, :factor * new.rvde_cant, 0, 'N', new.rvde_lote, :Pref, :Num, new.rvde_item, :Nit);
        end
    /* ACTUALICE EL PENDIENTE  */
    if (CONSOLIDA <> 0) then
        begin
        EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION', 'FACTURAS', 'GENERAR PEDIDO AUTOMATICAMENTE CON LA FACTURA') returning_values (pedauto);
        EXECUTE procedure LEE_CONFIGURACION ('FACTURACION','DOCUMENTOS','DEJAR PENDIENTES LOS ARTICULOS NO INCLUIDOS AL TRAER DOCUMENTOS RELACIONADOS') returning_values (CONSO);
        if (CONSO = 'SI') then
            BEGIN
            /* BUSQUE EL CONSOLIDADO EN EL MISMO ITEM Y SI ES DIFERENTE ACTUALICELO */
            select COFA_CANT * COFA_FACTOR FROM consolidado_faltantes WHERE COFA_ID = :consolida AND COFA_ITEM = NEW.RVDE_ITEM AND ARTI_COD = NEW.arti_cod INTO :CANTREL;
            if (NEW.RVDE_CANT * NEW.RVDE_FACTOR < CANTREL) then
                begin
                UPDATE consolidado_faltantes SET COFA_IDDES = NEW.revt_id, COFA_CANT = NEW.RVDE_CANT, COFA_FACTOR = NEW.RVDE_FACTOR, COFA_OK = 'S' 
                    WHERE COFA_ID = :consolida AND COFA_ITEM = NEW.RVDE_ITEM AND ARTI_COD = NEW.arti_cod;
                if (PEDAUTO = 'SI') then
                    UPDATE consolidado_faltantes SET COFA_IDDES = NEW.revt_id, COFA_CANT = NEW.RVDE_CANT, COFA_FACTOR = NEW.RVDE_FACTOR, COFA_OK = 'S' 
                        WHERE COFA_ID = :idped AND COFA_ITEM = NEW.RVDE_ITEM AND ARTI_COD = NEW.arti_cod;
                end
            else
                begin
                UPDATE consolidado_faltantes SET COFA_IDDES = NEW.revt_id, COFA_OK = 'S' WHERE COFA_ID = :consolida AND COFA_ITEM = NEW.RVDE_ITEM AND ARTI_COD = NEW.arti_cod;
                if (PEDAUTO = 'SI') then
                    UPDATE consolidado_faltantes SET COFA_IDDES = NEW.revt_id, COFA_OK = 'S' WHERE COFA_ID = :idped AND COFA_ITEM = NEW.RVDE_ITEM AND ARTI_COD = NEW.arti_cod;
                end
            END
        else
            begin
            UPDATE consolidado_faltantes SET COFA_IDDES = NEW.revt_id, COFA_OK = 'S' WHERE COFA_ID = :consolida;
            if (PEDAUTO = 'SI') then
                UPDATE consolidado_faltantes SET COFA_IDDES = NEW.revt_id, COFA_OK = 'S' WHERE COFA_ID = :idped;
            end
        END
    end
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER REMISION_PROVEEDOR_DET_AI FOR REMISION_PROVEEDOR_DET
ACTIVE AFTER INSERT POSITION 0
AS
declare variable fec date;
declare variable CONC VARCHAR(60);
declare variable factor numeric(18,4);
declare variable Pref varchar(4);
declare variable Num varchar(6);
declare variable EXISTE CHAR(1);
declare variable NIT VARCHAR(20);
declare variable NUMPROV VARCHAR(20);
declare variable Tipo Integer;
declare variable idfact integer;
declare variable numrows integer;
declare variable IVAINC CHAR(2);
declare variable ICOINC CHAR(2);
declare variable COSTO NUMERIC(18,2);
declare variable CANTREL NUMERIC(18,4);
declare variable NUMPED VARCHAR(30);
declare variable CONSO CHAR(2);
declare variable CONSOLIDA INTEGER;
declare variable DTOPIE NUMERIC(18,2);
declare variable ADICIONAL NUMERIC(18,2);
declare variable TOTAL NUMERIC(18,2);
declare variable IVAMONTO NUMERIC(18,2);
declare variable EXTRA NUMERIC(18,2);
declare variable FACT NUMERIC(18,4);
declare variable MENORV CHAR(2);
declare variable CEROS CHAR(2);
declare variable ACTREM CHAR(2);
BEGIN
  if ((NEW.repr_id <> 0) and (new.rpvd_anulado = 'N')) then
    BEGIN
    select max(rprd_tiporel), max(rprd_idrel) from remision_proveedor_docrela
        where repr_id = new.repr_id into :Tipo, :idfact;
    if (Tipo is null) then
        Tipo = 0;
    /* si se hizo con base en una factura que afecto el inventario no afecte inventario */
    numrows = 0;
    if (Tipo = 21) Then
        select count(*) from movimiento_articulo where mvar_tipodoc = 21 and mvar_idref = :idfact into :numrows;
    if (numrows is null) then
        numrows = 0;
    if (numrows = 0) then
        begin
        select repr_fecha, pref_pre, repr_numero, REPR_IMPTOS, terc_nit, REPR_NUMPROV, REPR_ORDEN, REPR_CONSOLIDA, repr_dtomonto, repr_adicional, repr_total, repr_ivamonto, repr_extra
            from remision_proveedor where repr_id = new.repr_id
            into :fec, :Pref, :Num, :IVAINC, :NIT, :NUMPROV, :numped, :CONSOLIDA, :dtopie, :adicional, :total, :ivamonto, :extra;
        execute procedure factor_unidad_cant(new.arti_cod, new.rpvd_unidad) returning_values(factor);
        CONC = 'REMISION PROVEEDOR No.' || PREF || NUM || '-' || NUMPROV;
        if (numped <> '') then
            conc = conc || '-ORDEN ' || NUMPED;
        COSTO = ((new.rpvd_prunit - NEW.rpvd_dtomonto) / :factor);
        if (IVAINC = 'S') then
            BEGIN
            COSTO = COSTO / (1 + NEW.rpvd_ivaporc/100);
            EXECUTE PROCEDURE lee_configuracion ('FACTURACION', 'ARTICULOS', 'IMPOCONSUMO INCLUIDO EN EL PRECIO BASE DE VENTA ANTES DE IVA') returning_values(:icoinc);
            if (icoinc = 'SI') then
                COSTO = COSTO - (NEW.rpvd_consumo/(NEW.rpvd_cant * new.rpvd_factor));
            END
        EXECUTE PROCEDURE lee_configuracion('COMPRAS','FACTURAS','DESCUENTO Y VALOR ADICIONAL DEL DOCUMENTO COMO MENOR VALOR DEL COSTO') returning_values (:MENORV);
        if (MENORV = 'SI') then
            BEGIN
            FACT = (TOTAL - EXTRA - IVAMONTO);
            if ((FACT - ADICIONAL + DTOPIE) <> 0) then
                FACT = FACT / (FACT - ADICIONAL + DTOPIE);
            ELSE
                FACT = 1;
            COSTO = COSTO * FACT;
            END
        if (COSTO = 0) then
            BEGIN
            EXECUTE PROCEDURE lee_configuracion('COMPRAS', 'REMISIONES', 'PERMITIR CEROS EN COSTOS DE MERCANCIA') returning_values (:ceros);
            EXECUTE PROCEDURE lee_configuracion('COMPRAS', 'FACTURAS', 'ACTUALIZAR COSTOS DE LA REMISION RELACIONADA AL GRABAR LA FACTURA') returning_values (:ACTREM);
            if ((ACTREM = 'SI') and (CEROS = 'NO')) then
                execute procedure costo_promedio(NEW.arti_cod, :fec) returning_values (:COSTO);
            END
        INSERT INTO MOVIMIENTO_ARTICULO
          (ARTI_COD, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM, TERC_NIT)
          VALUES(NEW.ARTI_COD, NEW.BODE_COD, :FEC, 22, NEW.repr_id,
          :CONC, :factor * new.rpvd_cant, :COSTO, 'S', new.rpvd_lote, :Pref, :Num, new.rpvd_item, :Nit);

        /* RECORRA LAS LISTAS DE PRECIOS Y CAMBIE EL PRECIO */
        EXECUTE PROCEDURE CALCULA_PRECIOS(NEW.ARTI_COD, :FEC);

        if (COSTO > 0 ) then
         BEGIN
          /* GRABE PROV X ARTICULO */
          EXISTE = 'N';
          SELECT 'S' FROM PROVEEDOR_ARTICULO WHERE TERC_NIT = :NIT AND ARTI_COD = NEW.ARTI_COD INTO :EXISTE;
          if (EXISTE = 'S') then
            UPDATE PROVEEDOR_ARTICULO 
                SET PVAR_FECHA = :FEC, PVAR_COSTO = :COSTO, PVAR_COD = NEW.rpvd_codprov
                WHERE TERC_NIT = :NIT AND ARTI_COD = NEW.ARTI_COD;
          ELSE
            INSERT INTO PROVEEDOR_ARTICULO (TERC_NIT, ARTI_COD, PVAR_COSTO, PVAR_FECHA, PVAR_COD,PVAR_DES)
                VALUES (:NIT, NEW.ARTI_COD, :COSTO, :FEC, NEW.rpvd_codprov,NEW.rpvd_desc);
         END
        end

    /* ACTUALICE EL PENDIENTE  */
    if (CONSOLIDA <> 0) then
        BEGIN
        EXECUTE PROCEDURE LEE_CONFIGURACION ('COMPRAS','DOCUMENTOS','SUMAR CANTIDADES PENDIENTES AL CONSOLIDAR DOCUMENTOS') returning_values (CONSO);
        SELECT MIN(CEFA_TIPOORI) FROM consolide_faltantes WHERE CEFA_ID = :CONSOLIDA INTO :NUMROWS;
        if (NUMROWS = 23) then
            BEGIN
            EXECUTE PROCEDURE LEE_CONFIGURACION('COMPRAS', 'REMISIONES', 'VERIFICAR CODIGOS DE LA ORDEN') returning_values (MENORV);
            if (MENORV = 'SI') then
                CONSO = 'NO';
            END
        SELECT COUNT(CEFA_ITEM) FROM consolide_faltantes WHERE CEFA_ID = :CONSOLIDA INTO :NUMROWS;
        if ((CONSO = 'SI') AND (NUMROWS > 1)) then
            UPDATE consolidado_faltantes SET COFA_OK = 'S' WHERE COFA_ID = :consolida;
        ELSE
            BEGIN
            /* BUSQUE EL CONSOLIDADO EN EL MISMO ITEM Y SI ES DIFERENTE ACTUALICELO */
            select COFA_CANT * COFA_FACTOR FROM consolidado_faltantes WHERE COFA_ID = :consolida AND COFA_ITEM = NEW.RPVD_ITEM AND ARTI_COD = NEW.arti_cod INTO :CANTREL;
            if (NEW.RPVD_CANT * NEW.RPVD_FACTOR < CANTREL) then
                UPDATE consolidado_faltantes SET COFA_IDDES = NEW.repr_id, COFA_CANT = NEW.RPVD_CANT, COFA_FACTOR = NEW.RPVD_FACTOR
                    WHERE COFA_ID = :consolida AND COFA_ITEM = NEW.RPVD_ITEM AND ARTI_COD = NEW.arti_cod;
            ELSE
                UPDATE consolidado_faltantes SET COFA_IDDES = NEW.repr_id, COFA_OK = 'S' WHERE COFA_ID = :consolida AND COFA_ITEM = NEW.RPVD_ITEM AND ARTI_COD = NEW.arti_cod;
            END
        END
    /* ACTUALICE EL STAND */
    if (new.rpvd_stand is not null) then
      if (exists(select stand_cod from stands where arti_cod = new.arti_cod and stand_bodega = new.bode_cod)) then
        UPDATE stands set stand_cod = new.rpvd_stand where arti_cod = new.arti_cod and stand_bodega = new.bode_cod;
      else
        INSERT INTO stands (ARTI_COD, STAND_BODEGA, STAND_COD) VALUES (NEW.arti_cod, NEW.bode_cod, NEW.rpvd_stand);
    END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER REMISION_PROVEEDOR_DET_AU FOR REMISION_PROVEEDOR_DET
ACTIVE AFTER UPDATE POSITION 0
AS
declare variable fec date;
declare variable CONC VARCHAR(60);
declare variable Pref varchar(4);
declare variable Num varchar(6);
declare variable factor numeric(18,4);
declare variable EXISTE CHAR(1);
declare variable NIT VARCHAR(20);
declare variable NUMPROV VARCHAR(20);
declare variable Tipo integer;
declare variable idfact integer;
declare variable numrows integer;
declare variable IVAINC CHAR(2);
declare variable ICOINC CHAR(2);
declare variable COSTO NUMERIC(18,2);
declare variable CANTREL NUMERIC(18,4);
declare variable NUMPED VARCHAR(30);
declare variable CONSO CHAR(2);
declare variable CONSOLIDA INTEGER;
declare variable DTOPIE NUMERIC(18,2);
declare variable ADICIONAL NUMERIC(18,2);
declare variable TOTAL NUMERIC(18,2);
declare variable IVAMONTO NUMERIC(18,2);
declare variable EXTRA NUMERIC(18,2);
declare variable FACT NUMERIC(18,4);
declare variable MENORV CHAR(2);
declare variable CEROS CHAR(2);
declare variable ACTREM CHAR(2);
BEGIN
if ((OLD.repr_id <> 0) AND (OLD.rpvd_anulado = 'N')) then
    begin
    DELETE FROM MOVIMIENTO_ARTICULO WHERE (mvar_tipodoc = 22) and (mvar_idref = new.repr_id) and (mvar_item = old.rpvd_item);
    select REPR_CONSOLIDA from remision_proveedor where repr_id = old.repr_id into :CONSOLIDA;
    if (CONSOLIDA <> 0) then
        begin
        EXECUTE PROCEDURE LEE_CONFIGURACION ('COMPRAS','DOCUMENTOS','SUMAR CANTIDADES PENDIENTES AL CONSOLIDAR DOCUMENTOS') returning_values (CONSO);
        SELECT COUNT(CEFA_ITEM) FROM consolide_faltantes WHERE CEFA_ID = :CONSOLIDA INTO :NUMROWS;
        if ((NUMROWS = 1) OR (CONSO = 'NO')) then
            UPDATE consolidado_faltantes SET COFA_OK = 'N' WHERE COFA_ID = :consolida AND COFA_ITEM = old.RPVD_ITEM AND ARTI_COD = old.arti_cod;
        else
            UPDATE consolidado_faltantes SET COFA_OK = 'N' WHERE COFA_ID = :consolida;
        END
    end
/* Registre el nuevo */
if ((new.repr_id <> 0) AND (new.rpvd_anulado = 'N')) then
    begin
    select repr_fecha, pref_pre, repr_numero, repr_imptos, terc_nit, REPR_NUMPROV, REPR_ORDEN, REPR_CONSOLIDA, repr_dtomonto, repr_adicional, repr_total, repr_ivamonto, repr_extra
        from remision_proveedor where repr_id = new.repr_id
        into :fec, :Pref, :Num, :IVAINC, :NIT, :NUMPROV, :numped, :CONSOLIDA, :dtopie, :adicional, :total, :ivamonto, :extra;
    CONC = 'REMISION PROVEEDOR No.' || PREF || NUM || '-' || NUMPROV;
    if (numped <> '') then
        conc = conc || '-ORDEN ' || NUMPED;
    SELECT MAX(CEFA_TIPOORI) FROM consolide_faltantes WHERE CEFA_ID = :CONSOLIDA INTO :TIPO;
    if (Tipo is null) then
        Tipo = 0;
    select FACO_ID from FACTURAS_COMPRA WHERE FACO_CONSOLIDA = :consolida INTO :IDFACT;
    if (Idfact is null) then
        Idfact = 0;
    /* si se hizo con base en una factura que afecto el inventario no afecte inventario */
    numrows = 0;
    if (Tipo = 21) Then
        select count(*) from movimiento_articulo where mvar_tipodoc = 21 and mvar_idref = :idfact into :numrows;
    if (numrows is null) then
        numrows = 0;
    if (numrows = 0) then
        begin
        execute procedure factor_unidad_cant(new.arti_cod, new.rpvd_unidad) returning_values(factor);
        COSTO = ((new.rpvd_prunit - NEW.rpvd_dtomonto) / :factor);
        if (IVAINC = 'S') then
            BEGIN
            COSTO = COSTO / (1 + NEW.rpvd_ivaporc/100);
            EXECUTE PROCEDURE lee_configuracion ('FACTURACION', 'ARTICULOS', 'IMPOCONSUMO INCLUIDO EN EL PRECIO BASE DE VENTA ANTES DE IVA') returning_values(:icoinc);
            if (icoinc = 'SI') then
                COSTO = COSTO - (NEW.rpvd_consumo/(NEW.rpvd_cant * new.rpvd_factor));
            END
        EXECUTE PROCEDURE lee_configuracion('COMPRAS','FACTURAS','DESCUENTO Y VALOR ADICIONAL DEL DOCUMENTO COMO MENOR VALOR DEL COSTO') returning_values (:MENORV);
        if (MENORV = 'SI') then
            BEGIN
            FACT = (TOTAL - EXTRA - IVAMONTO);
            if ((FACT - ADICIONAL + DTOPIE) <> 0) then
                FACT = FACT / (FACT - ADICIONAL + DTOPIE);
            ELSE
                FACT = 1;
            COSTO = COSTO * FACT;
            END
        if (COSTO = 0) then
            BEGIN
            EXECUTE PROCEDURE lee_configuracion('COMPRAS', 'REMISIONES', 'PERMITIR CEROS EN COSTOS DE MERCANCIA') returning_values (:ceros);
            EXECUTE PROCEDURE lee_configuracion('COMPRAS', 'FACTURAS', 'ACTUALIZAR COSTOS DE LA REMISION RELACIONADA AL GRABAR LA FACTURA') returning_values (:ACTREM);
            if ((ACTREM = 'SI') and (CEROS = 'NO')) then
                execute procedure costo_promedio(NEW.arti_cod, :fec) returning_values (:COSTO);
            END
        INSERT INTO MOVIMIENTO_ARTICULO
            (ARTI_COD, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM, TERC_NIT)
            VALUES(NEW.ARTI_COD, NEW.BODE_COD, :FEC, 22, NEW.repr_id,
            :CONC, :factor * new.rpvd_cant, :COSTO, 'S', new.rpvd_lote, :Pref, :Num, new.rpvd_item, :Nit);
            
        /* RECORRA LAS LISTAS DE PRECIOS Y CAMBIE EL PRECIO */
        EXECUTE PROCEDURE CALCULA_PRECIOS(NEW.ARTI_COD, :FEC);
          
        if (COSTO > 0 ) then
         BEGIN
          /* GRABE PROV X ARTICULO */
          EXISTE = 'N';
          SELECT 'S' FROM PROVEEDOR_ARTICULO WHERE TERC_NIT = :NIT AND ARTI_COD = NEW.ARTI_COD INTO :EXISTE;
          if (EXISTE = 'S') then
            UPDATE PROVEEDOR_ARTICULO
                SET PVAR_FECHA = :FEC, PVAR_COSTO = :COSTO, PVAR_COD = NEW.rpvd_codprov
                WHERE TERC_NIT = :NIT AND ARTI_COD = NEW.ARTI_COD;
          ELSE
            INSERT INTO PROVEEDOR_ARTICULO (TERC_NIT, ARTI_COD, PVAR_COSTO, PVAR_FECHA, PVAR_COD,PVAR_DES)
                VALUES (:NIT, NEW.ARTI_COD, :COSTO, :FEC, NEW.rpvd_codprov,NEW.rpvd_desc);
         END
        end
    if (CONSOLIDA <> 0) then
        BEGIN
        EXECUTE PROCEDURE LEE_CONFIGURACION ('COMPRAS','DOCUMENTOS','SUMAR CANTIDADES PENDIENTES AL CONSOLIDAR DOCUMENTOS') returning_values (CONSO);
        /* IGNORE LA CONSOLIDACION SI SE VALIDAN CODIGOS DE LA ORDEN */
        SELECT MIN(CEFA_TIPOORI) FROM consolide_faltantes WHERE CEFA_ID = :CONSOLIDA INTO :NUMROWS;
        if (NUMROWS = 23) then
            BEGIN
            EXECUTE PROCEDURE LEE_CONFIGURACION('COMPRAS', 'REMISIONES', 'VERIFICAR CODIGOS DE LA ORDEN') returning_values (MENORV);
            if (MENORV = 'SI') then
                CONSO = 'NO';
            END
        SELECT COUNT(CEFA_ITEM) FROM consolide_faltantes WHERE CEFA_ID = :CONSOLIDA INTO :NUMROWS;
        if ((CONSO = 'SI') AND (NUMROWS > 1)) then
            UPDATE consolidado_faltantes SET COFA_IDDES = NEW.repr_id, COFA_OK = 'S' WHERE COFA_ID = :consolida;
        ELSE
            BEGIN
            /* BUSQUE EL CONSOLIDADO EN EL MISMO ITEM Y SI ES DIFERENTE ACTUALICELO */
            select COFA_CANT * COFA_FACTOR FROM consolidado_faltantes WHERE COFA_ID = :consolida AND COFA_ITEM = NEW.RPVD_ITEM AND ARTI_COD = NEW.arti_cod INTO :CANTREL;
            if (NEW.RPVD_CANT * NEW.RPVD_FACTOR < CANTREL) then
                UPDATE consolidado_faltantes SET COFA_IDDES = NEW.repr_id, COFA_CANT = NEW.RPVD_CANT, COFA_FACTOR = NEW.RPVD_FACTOR
                    WHERE COFA_ID = :consolida AND COFA_ITEM = NEW.RPVD_ITEM AND ARTI_COD = NEW.arti_cod;
            else
                UPDATE consolidado_faltantes SET COFA_IDDES = NEW.repr_id, COFA_OK = 'S' WHERE COFA_ID = :consolida AND COFA_ITEM = NEW.RPVD_ITEM AND ARTI_COD = NEW.arti_cod;
            END
        END
    /* ACTUALICE EL STAND */
    if (new.rpvd_stand is not null) then
      if (exists(select stand_cod from stands where arti_cod = new.arti_cod and stand_bodega = new.bode_cod)) then
        UPDATE stands set stand_cod = new.rpvd_stand where arti_cod = new.arti_cod and stand_bodega = new.bode_cod;
      else
        INSERT INTO stands (ARTI_COD, STAND_BODEGA, STAND_COD) VALUES (NEW.arti_cod, NEW.bode_cod, NEW.rpvd_stand);
    END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER SALIDAS_DETALLE_AU FOR SALIDAS_DETALLE
ACTIVE AFTER UPDATE POSITION 0
AS
declare variable fec date;
declare variable CONC VARCHAR(60);
declare variable factor numeric(18,4);
declare variable Pref varchar(4);
declare variable Num varchar(6);
declare variable Nit varchar(20);
BEGIN
if ((old.arti_cod <> new.arti_cod) or (old.sade_cant <> new.sade_cant) or (old.sade_unidad <> new.sade_unidad) or (old.sade_lote <> new.sade_lote) or
    (old.sade_anulado <> new.sade_anulado) or (old.sade_transmit <> new.sade_transmit)) then
  begin
  /* Anule el anterior */
  if ((old.sali_id <> 0) and (old.sade_anulado = 'N')) then
    begin
    delete from movimiento_articulo where (mvar_tipodoc = 12) and (mvar_idref = old.sali_id) and (mvar_item = old.sade_item);
    END
  /* Registre el nuevo */
  if ((new.sali_id <> 0) and (new.sade_anulado = 'N')) then
    BEGIN
    select sali_fecha, sali_conc, pref_pre, sali_numero, terc_nit from salidas where sali_id = new.sali_id into :fec, :conc, :Pref, :Num, :Nit;
    execute procedure factor_unidad_cant(new.arti_cod, new.sade_unidad) returning_values(factor);
    INSERT INTO MOVIMIENTO_ARTICULO
        (ARTI_COD, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM, TERC_NIT)
        VALUES(NEW.ARTI_COD, NEW.BODE_COD, :FEC, 12, NEW.sali_id,
        :CONC, :factor * new.sade_cant, 0, 'N', new.sade_lote, :Pref, :Num, new.sade_item, :Nit);
    END
  end
end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER TRASFERENCIAS_DETALLE_AI FOR TRASFERENCIAS_DETALLE
ACTIVE AFTER INSERT POSITION 0
AS
declare variable fec date;
declare variable CONC VARCHAR(60);
declare variable factor numeric(18,4);
declare variable bodori varchar(2);
declare variable boddes varchar(2);
declare variable Pref varchar(4);
declare variable Num varchar(6);
declare variable NIT varchar(20);
declare variable fecaux date;
declare variable ORIGEN VARCHAR(2);
BEGIN
  if ((NEW.Tran_id <> 0) and (new.tras_anulado = 'N')) then
    begin
    select tran_fecha, tran_conc, BODE_COD, TRAN_BODDES, pref_pre, tran_numero, TERC_NIT
        from trasferencias where tran_id = new.tran_id into :fec, :conc, :bodori, :boddes, :Pref, :Num, :NIT;
    execute procedure factor_unidad_cant(new.arti_cod, new.tras_unidad) returning_values(factor);
    EXECUTE PROCEDURE LEE_CONFIGURACION('INVENTARIO', 'TRASLADOS', 'AFECTAR AMBAS BODEGAS AL CONFIRMAR ENTREGA') returning_values(ORIGEN);
    if ((ORIGEN = 'NO') or (new.tras_confirma = 'S'))  then
        INSERT INTO MOVIMIENTO_ARTICULO
          (ARTI_COD, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM)
          VALUES(NEW.ARTI_COD, :bodori, :FEC, 13, NEW.tran_id,
          :CONC, :factor * new.tras_cant, 0, 'N', new.tras_lote, :Pref, :Num, new.tras_item);
    if (new.tras_confirma = 'S') then
      INSERT INTO MOVIMIENTO_ARTICULO
        (ARTI_COD, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM)
        VALUES(NEW.ARTI_COD, :boddes, :FEC, 13, NEW.tran_id,
        :CONC, :factor * new.tras_cant, NEW.tras_costo, 'S', new.tras_lotedes, :Pref, :Num, new.tras_item);

    /* ACTUALICE EL COSTO POR PROVEEDOR */
    if (:NIT <> '') then
        BEGIN
        SELECT PVAR_FECHA FROM PROVEEDOR_ARTICULO
            WHERE TERC_NIT = :Nit AND ARTI_COD = NEW.ARTI_COD
            INTO :FECAUX;
        if (FECAUX IS NULL) then
            INSERT INTO PROVEEDOR_ARTICULO (TERC_NIT, ARTI_COD, PVAR_COSTO, PVAR_FECHA, PVAR_COD,PVAR_DES)
                VALUES (:Nit, NEW.ARTI_COD, (new.tras_costo / new.tras_factor), :fec, :NIT,NEW.tras_desc);
        else
            UPDATE PROVEEDOR_ARTICULO
                SET PVAR_COSTO = NEW.tras_costo/NEW.tras_factor, PVAR_FECHA = :fec
                WHERE ARTI_COD = NEW.ARTI_COD AND TERC_NIT = :Nit;
        END
    END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER TRASFERENCIAS_DETALLE_AU FOR TRASFERENCIAS_DETALLE
ACTIVE AFTER UPDATE POSITION 0
AS
declare variable fec date;
declare variable CONC VARCHAR(60);
declare variable factor numeric(18,4);
declare variable bodori varchar(2);
declare variable boddes varchar(2);
declare variable Pref varchar(4);
declare variable Num varchar(6);
declare variable ORIGEN VARCHAR(2);
declare variable NIT varchar(20);
declare variable fecaux date;
BEGIN
if ((old.arti_cod <> new.arti_cod) or (old.tras_cant <> new.tras_cant) or (old.tras_unidad <> new.tras_unidad) or (old.tras_lote <> new.tras_lote) or
    (old.tras_anulado <> new.tras_anulado) or (old.tras_transmit <> new.tras_transmit) or (old.tras_confirma <> new.tras_confirma)) then
  begin
  /* Anule el anterior */
  if ((old.tran_id <> 0) and (old.tras_anulado = 'N')) then
    begin
    delete from movimiento_articulo where (mvar_tipodoc = 13) and (mvar_idref = old.tran_id) and (mvar_item = old.tras_item);
    END
  /* Registre el nuevo */
  if ((new.tran_id <> 0) and (new.tras_anulado = 'N')) then
    BEGIN
    select tran_fecha, tran_conc, BODE_COD, TRAN_BODDES, Pref_pre, tran_numero, terc_nit
        from trasferencias where tran_id = new.tran_id into :fec, :conc, :bodori, :boddes, :Pref, :Num, :Nit;
    execute procedure factor_unidad_cant(new.arti_cod, new.tras_unidad) returning_values(factor);
    EXECUTE PROCEDURE LEE_CONFIGURACION('INVENTARIO', 'TRASLADOS', 'AFECTAR AMBAS BODEGAS AL CONFIRMAR ENTREGA') returning_values(ORIGEN);
    if ((ORIGEN = 'NO') or (new.tras_confirma = 'S'))  then
        INSERT INTO MOVIMIENTO_ARTICULO
            (ARTI_COD, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM)
            VALUES(NEW.ARTI_COD, :bodori, :FEC, 13, NEW.tran_id,
            :CONC, :factor * new.tras_cant, 0, 'N', new.tras_lote, :Pref, :Num, new.tras_item);
    if (new.tras_confirma = 'S') then
        INSERT INTO MOVIMIENTO_ARTICULO
        (ARTI_COD, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM)
        VALUES(NEW.ARTI_COD, :boddes, :FEC, 13, NEW.tran_id,
        :CONC, :factor * new.tras_cant, 0, 'S', new.tras_lotedes, :Pref, :Num, new.tras_item);
    /* ACTUALICE EL COSTO POR PROVEEDOR */
    if (:NIT <> '') then
        BEGIN
        SELECT PVAR_FECHA FROM PROVEEDOR_ARTICULO
            WHERE TERC_NIT = :Nit AND ARTI_COD = NEW.ARTI_COD
            INTO :FECAUX;
        if (FECAUX IS NULL) then
            INSERT INTO PROVEEDOR_ARTICULO (TERC_NIT, ARTI_COD, PVAR_COSTO, PVAR_FECHA, PVAR_COD,PVAR_DES)
                VALUES (:Nit, NEW.ARTI_COD, (new.tras_costo / new.tras_factor), :fec, :NIT,NEW.tras_desc);
        else
            UPDATE PROVEEDOR_ARTICULO
                SET PVAR_COSTO = NEW.tras_costo/NEW.tras_factor, PVAR_FECHA = :fec
                WHERE ARTI_COD = NEW.ARTI_COD AND TERC_NIT = :Nit;
        END
    END
  end
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure INVENTARIO_FACTCOMP_SIN_REMI (
    FECINI date,
    FECFIN date)
returns (
    ID integer,
    ITEM integer,
    CONSOLIDA integer,
    NIT varchar(20),
    FECHA date,
    PREF varchar(4),
    NUM varchar(6),
    BOD char(2),
    ARTI varchar(20),
    CANT numeric(18,4),
    UNIDAD varchar(8),
    COSTO numeric(18,2),
    LOTE varchar(20),
    IDR integer)
AS
declare variable factor numeric(18,4);
declare variable IVAIT numeric(9,2);
declare variable NUMPROV VARCHAR(20);
declare variable TIPO INTEGER;
declare variable CONC VARCHAR(60);
declare variable DTOPIE NUMERIC(18,2);
declare variable ADICIONAL NUMERIC(18,2);
declare variable TOTAL NUMERIC(18,2);
declare variable IVAMONTO NUMERIC(18,2);
declare variable EXTRA NUMERIC(18,2);
declare variable FACT NUMERIC(18,4);
declare variable MENORV CHAR(2);
declare variable IVAINC CHAR(2);
begin
EXECUTE PROCEDURE lee_configuracion('COMPRAS','FACTURAS','DESCUENTO Y VALOR ADICIONAL DEL DOCUMENTO COMO MENOR VALOR DEL COSTO') returning_values (:MENORV);
FOR SELECT F.FACO_ID, faco_fecha, pref_pre, faco_numero, TERC_NIT, FACO_CONSOLIDA, faco_imptos, faco_numprov,
    FACO_TOTAL, FACO_EXTRA, FACO_IVAMONTO, FACO_ADICIONAL, FACO_DTOMONTO,
    FCDE_ITEM, ARTI_COD, FCDE_CANT, FCDE_UNIDAD, (fcde_prunit - fcde_dtomonto), D.bode_cod, D.fcde_lote, D.fcde_ivaporc
    FROM FACTURAS_COMPRAS_DETALLE D, FACTURAS_COMPRA F
    WHERE F.faco_id = D.faco_id AND F.faco_fecha >= :fecini and F.faco_fecha <= :fecfin
    ORDER BY F.faco_fecha, F.faco_id, D.fcde_item
    INTO :ID, :FECHA, :PREF, :NUM, :NIT, :CONSOLIDA, :ivainc, :NUMPROV,
    :total, :extra, :ivamonto, :adicional, :dtopie,
    :ITEM, :ARTI, :CANT, :UNIDAD, :COSTO, :BOD, :lote, :IVAIT
    DO
    BEGIN
    if (NOT EXISTS (SELECT MVAR_CONS FROM movimiento_articulo WHERE MVAR_TIPODOC = 21 AND MVAR_IDREF = :ID AND MVAR_ITEM = :ITEM)) then
        BEGIN
        SELECT MAX(CEFA_TIPOORI), MAX(CEFA_IDORI) FROM consolide_faltantes WHERE CEFA_ID = :CONSOLIDA
            INTO :TIPO, :IDR;
        if (TIPO = 22) then
            BEGIN
            if (NOT EXISTS (SELECT MVAR_CONS FROM movimiento_articulo WHERE MVAR_TIPODOC = 22 AND MVAR_IDREF = :IDR AND MVAR_ITEM = :ITEM)) then
                BEGIN
                conc = 'FACTURA DE COMPRA No.' || PREF || NUM || '-' || NUMPROV;
                execute procedure factor_unidad_cant(:arti, :unidad) returning_values(factor);
                COSTO = (:COSTO / :factor);
                if (IVAINC = 'S') then
                    COSTO = COSTO / (1 + :ivait/100);
                if (MENORV = 'SI') then
                    BEGIN
                    FACT = (TOTAL - EXTRA - IVAMONTO);
                    if ((FACT - ADICIONAL + DTOPIE) <> 0) then
                        FACT = FACT / (FACT - ADICIONAL + DTOPIE);
                    ELSE
                        FACT = 1;
                    COSTO = COSTO * FACT;
                    END
                INSERT INTO MOVIMIENTO_ARTICULO
                    (ARTI_COD, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM, TERC_NIT)
                    VALUES(:arti, :bod, :fecha, 21, :id,
                    :CONC, :factor * :cant, :costo, 'S', :lote, :Pref, :Num, :item, :Nit);
                suspend;
                END
            END
        END
    END
end
^

SET TERM ; ^


/* 20091009b */
SET TERM ^ ;

create or alter procedure BUSQUEDA_PRODUCCION (
    subempresa integer)
returns (
    PROR_ID INTEGER,
    PREF_PRE VARCHAR(4),
    PROR_NUMERO VARCHAR(6),
    PROR_FECHA DATE,
    PROR_DESC VARCHAR(60),
    PROR_NOMCLIENTE VARCHAR(60),
    PROR_CANT NUMERIC(18,4),
    PROR_ENTRADAS NUMERIC(18,4),
    PROR_ESTADO CHAR(1),
    PROR_ANULADO CHAR(1))
as
begin

FOR select pror_id, o.pref_pre, pror_numero, pror_fecha, pror_desc, pror_nomcliente, pror_cant, pror_estado, pror_anulado
    from produccion_orden o, prefijos p where o.pref_pre = p.pref_pre and p.tido_cod = 19 and ((:subempresa = 0) or (p.sucu_id = :subempresa))
    into :pror_id, :pref_pre, :pror_numero, :pror_fecha, :pror_desc, :pror_nomcliente, :pror_cant, :pror_estado, :pror_anulado
    do
    begin
    select sum(d.pren_cantok) from produccion_entrada_det d, produccion_entrada_enc e
        where e.pror_id = :pror_id and e.prde_id = d.prde_id and e.prde_anulado = 'N' into :pror_entradas;
    if (pror_entradas is null) then
        pror_entradas = 0;
    suspend;
    end
end
^

SET TERM ; ^

grant execute on procedure busqueda_produccion to public;

SET TERM ^ ;

create or alter procedure BUSQUEDA_DOCS_PRODUCCION (IDORD INTEGER)
returns (
    TIPO integer,
    NOMTIPO VARCHAR(30),
    ID INTEGER,
    PREFIJO varchar(4),
    NUMERO varchar(6),
    FECHA date,
    ANULADO char(1))
AS
begin
TIPO = 20;
SELECT TIDO_NOMLARGO FROM tipo_documento WHERE TIDO_COD = 20 INTO :nomtipo;
FOR select prde_id, prde_pref, prde_numero, prde_fecha, prde_anulado
    from produccion_entrada_enc where pror_id = :idord
    into :id, :prefijo, :numero, :fecha, :anulado
    do
    suspend;
TIPO = 28;
SELECT TIDO_NOMLARGO FROM tipo_documento WHERE TIDO_COD = 28 INTO :nomtipo;
FOR select prsa_id, prsa_pref, prsa_numero, prsa_fecha, prsa_anulado
    from produccion_salida_enc where pror_id = :idord
    into :id, :prefijo, :numero, :fecha, :anulado
    do
    suspend;
TIPO = 29;
SELECT TIDO_NOMLARGO FROM tipo_documento WHERE TIDO_COD = 29 INTO :nomtipo;
FOR select prdd_id, prdd_pref, prdd_numero, prdd_fecha, prdd_anulado
    from produccion_devolucion where pror_id = :idord
    into :id, :prefijo, :numero, :fecha, :anulado
    do
    suspend;
end
^

SET TERM ; ^

grant execute on procedure busqueda_docs_produccion to public;

SET TERM ^ ;

CREATE OR ALTER procedure IMPR_PRODUCCION (
    ID integer)
returns (
    PREF varchar(4),
    NUMERO varchar(6),
    FECHA date,
    CLIENTE varchar(20),
    NOMCLIENTE varchar(60),
    CODBODEGA varchar(2),
    NOMBODEGA varchar(30),
    PRODARTI varchar(15),
    PRODCODBAR varchar(15),
    PRODDES varchar(60),
    PRODCANT numeric(18,4),
    PRODUNIDAD varchar(8),
    PRODLOTE varchar(15),
    MAQUINA varchar(60),
    PRIORIDAD integer,
    FECHAENT date,
    FECMONTAJE date,
    ESTADO char(1),
    PESOTOTAL numeric(18,4),
    OBS blob sub_type 1 segment size 80,
    TOTENSAMBLE numeric(18,2),
    DIAS numeric(9,2),
    HORAS numeric(9,2),
    ITEM integer,
    ARTICULO varchar(15),
    CODBAR varchar(15),
    ARTIDES varchar(60),
    CICLO integer,
    CANT numeric(18,4),
    UNIDAD varchar(8),
    BODITEM varchar(2),
    COSTO numeric(18,2),
    IVAPORC numeric(9,2),
    IVAMONTO numeric(18,2),
    PESO numeric(18,4),
    TOTAL numeric(18,2),
    LOTE varchar(15))
AS
BEGIN
SELECT PREF_PRE, PROR_NUMERO, PROR_FECHA, PROR_NIT, PROR_NOMCLIENTE, PROR_BODEGA, BODE_NOM, PROR_PRODUCTO, ARTI_COD,
    PROR_DESC, PROR_CANT, PROR_UNIDAD, PROR_LOTE, PROR_OBS, PROR_PESO, PROR_MAQUINA, PROR_PRIORIDAD, PROR_FECHAENT, PROR_ESTADO, PROR_FECMONTAJE
    FROM produccion_orden P, BODEGA B WHERE P.PROR_BODEGA = B.BODE_COD AND P.PROR_ID = :ID into
    :PREF, :NUMERO, :FECHA, :CLIENTE, :NOMCLIENTE, :CODBODEGA, :NOMBODEGA, :PRODCODBAR, :PRODARTI,
    PRODDES, PRODCANT, PRODUNIDAD, PRODLOTE, :OBS, :PESOTOTAL, :MAQUINA, :PRIORIDAD, :FECHAENT, :ESTADO, :fecmontaje;
  SELECT SUM(PODE_TOTAL) FROM produccion_orden_detalle WHERE PROR_ID = :ID INTO :TOTENSAMBLE;
  SELECT ENMA_NOMBRE FROM ensamble_maquina WHERE ENMA_ID = :MAQUINA INTO :MAQUINA;
  SELECT ARTI_CICLO FROM ARTICULO WHERE ARTI_COD = :prodarti INTO :ciclo;
  HORAS = CICLO * prodcant / 60;
  DIAS = HORAS / 24;
  FOR SELECT PODE_ITEM, A.ARTI_COD, PODE_CODBAR, PODE_DESC, PODE_CANT, PODE_UNIDAD, PODE_BODEGA, PODE_COSTO, PODE_IVAPORC, PODE_IVAMONTO, PODE_TOTAL, PODE_LOTE, PODE_PESO
    FROM produccion_orden_detalle D, ARTICULO A
    WHERE D.ARTI_COD = A.ARTI_COD AND D.PROR_ID = :ID
    ORDER BY PODE_ITEM
    INTO :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :BODITEM, :COSTO, :IVAPORC, :IVAMONTO, :TOTAL, :LOTE, :PESO
    DO
      BEGIN
      SUSPEND;
      END
  FOR SELECT PRSA_ITEM, A.ARTI_COD, PRSA_CODBAR, PRSA_DESC, PRSA_CANT, PRSA_UNIDAD, BODE_COD, PRSA_COSTO, 0, 0, PRSA_TOTAL, PRSA_LOTE, PRSA_PESO
    FROM produccion_salida_det D, produccion_salida_enc S,  ARTICULO A
    WHERE D.ARTI_COD = A.ARTI_COD AND S.PROR_ID = :ID AND S.prsa_id = D.prsa_id
    ORDER BY PRSA_ITEM
    INTO :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :BODITEM, :COSTO, :IVAPORC, :IVAMONTO, :TOTAL, :LOTE, :PESO
    DO
      BEGIN
      SUSPEND;
      END
end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure IMPR_PRODUCCION_ENT (
    ID integer)
returns (
    PREF varchar(4),
    NUMERO varchar(6),
    FECHA date,
    ITEM integer,
    TURNO integer,
    CANTOK numeric(18,4),
    CANTMAL numeric(18,4),
    UNIDAD varchar(8),
    BODITEM varchar(2),
    OPERARIO varchar(60),
    OBSDET blob sub_type 1 segment size 80,
    PESO numeric(18,4))
AS
BEGIN
FOR SELECT PRDE_PREF, PRDE_NUMERO, PRDE_FECHA, PREN_ITEM, PREN_TURNO, PREN_CANTOK, PREN_CANTMAL, PREN_UNIDAD, BODE_COD, PREN_PESO, PREN_OPERARIO, PREN_OBS
    FROM produccion_entrada_det D, produccion_entrada_enc e WHERE D.prde_id = e.prde_id and e.pror_id = :ID and e.prde_anulado = 'N'
    ORDER BY PREN_ITEM
    INTO :PREF, :NUMERO, :FECHA, :ITEM, :TURNO, :CANTOK, :CANTMAL, :UNIDAD, :BODITEM, :PESO, :operario, :obsdet
    DO
      BEGIN
      SELECT ENOP_NOMBRE FROM ENSAMBLE_OPERARIO WHERE ENOP_ID = :operario INTO :operario;
      SUSPEND;
      END
end
^

SET TERM ; ^

grant execute on procedure impr_produccion_ent to public;

/* 20091009c */
/* INCLUYA LAS DEVOLUCIONES EN LA ORDEN COMO NEGATIVAS */
SET TERM ^ ;

CREATE OR ALTER procedure IMPR_PRODUCCION (
    ID integer)
returns (
    PREF varchar(4),
    NUMERO varchar(6),
    FECHA date,
    CLIENTE varchar(20),
    NOMCLIENTE varchar(60),
    CODBODEGA varchar(2),
    NOMBODEGA varchar(30),
    PRODARTI varchar(15),
    PRODCODBAR varchar(15),
    PRODDES varchar(60),
    PRODCANT numeric(18,4),
    PRODUNIDAD varchar(8),
    PRODLOTE varchar(15),
    MAQUINA varchar(60),
    PRIORIDAD integer,
    FECHAENT date,
    FECMONTAJE date,
    ESTADO char(1),
    PESOTOTAL numeric(18,4),
    OBS blob sub_type 1 segment size 80,
    TOTENSAMBLE numeric(18,2),
    DIAS numeric(9,2),
    HORAS numeric(9,2),
    ITEM integer,
    ARTICULO varchar(15),
    CODBAR varchar(15),
    ARTIDES varchar(60),
    CICLO integer,
    CANT numeric(18,4),
    UNIDAD varchar(8),
    BODITEM varchar(2),
    COSTO numeric(18,2),
    IVAPORC numeric(9,2),
    IVAMONTO numeric(18,2),
    PESO numeric(18,4),
    TOTAL numeric(18,2),
    LOTE varchar(15))
AS
BEGIN
SELECT PREF_PRE, PROR_NUMERO, PROR_FECHA, PROR_NIT, PROR_NOMCLIENTE, PROR_BODEGA, BODE_NOM, PROR_PRODUCTO, ARTI_COD,
    PROR_DESC, PROR_CANT, PROR_UNIDAD, PROR_LOTE, PROR_OBS, PROR_PESO, PROR_MAQUINA, PROR_PRIORIDAD, PROR_FECHAENT, PROR_ESTADO, PROR_FECMONTAJE
    FROM produccion_orden P, BODEGA B WHERE P.PROR_BODEGA = B.BODE_COD AND P.PROR_ID = :ID into
    :PREF, :NUMERO, :FECHA, :CLIENTE, :NOMCLIENTE, :CODBODEGA, :NOMBODEGA, :PRODCODBAR, :PRODARTI,
    PRODDES, PRODCANT, PRODUNIDAD, PRODLOTE, :OBS, :PESOTOTAL, :MAQUINA, :PRIORIDAD, :FECHAENT, :ESTADO, :fecmontaje;
  SELECT SUM(PODE_TOTAL) FROM produccion_orden_detalle WHERE PROR_ID = :ID INTO :TOTENSAMBLE;
  SELECT ENMA_NOMBRE FROM ensamble_maquina WHERE ENMA_ID = :MAQUINA INTO :MAQUINA;
  SELECT ARTI_CICLO FROM ARTICULO WHERE ARTI_COD = :prodarti INTO :ciclo;
  HORAS = CICLO * prodcant / 60;
  DIAS = HORAS / 24;
  FOR SELECT PODE_ITEM, A.ARTI_COD, PODE_CODBAR, PODE_DESC, PODE_CANT, PODE_UNIDAD, PODE_BODEGA, PODE_COSTO, PODE_IVAPORC, PODE_IVAMONTO, PODE_TOTAL, PODE_LOTE, PODE_PESO
    FROM produccion_orden_detalle D, ARTICULO A
    WHERE D.ARTI_COD = A.ARTI_COD AND D.PROR_ID = :ID
    ORDER BY PODE_ITEM
    INTO :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :BODITEM, :COSTO, :IVAPORC, :IVAMONTO, :TOTAL, :LOTE, :PESO
    DO
      BEGIN
      SUSPEND;
      END
  FOR SELECT PRSA_ITEM, A.ARTI_COD, PRSA_CODBAR, PRSA_DESC, PRSA_CANT, PRSA_UNIDAD, BODE_COD, PRSA_COSTO, 0, 0, PRSA_TOTAL, PRSA_LOTE, PRSA_PESO
    FROM produccion_salida_det D, produccion_salida_enc S,  ARTICULO A
    WHERE D.ARTI_COD = A.ARTI_COD AND S.PROR_ID = :ID AND S.prsa_id = D.prsa_id
    ORDER BY D.prsa_id, D.PRSA_ITEM
    INTO :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :BODITEM, :COSTO, :IVAPORC, :IVAMONTO, :TOTAL, :LOTE, :PESO
    DO
      BEGIN
      SUSPEND;
      END
  FOR SELECT PRDD_ITEM, A.ARTI_COD, PRDD_CODBAR, PRDD_DESC, PRDD_CANT*-1, PRDD_UNIDAD, BODE_COD, PRDD_COSTO, 0, 0, PRDD_TOTAL*-1, PRDD_LOTE, PRDD_PESO*-1
    FROM produccion_devolucion_det D, produccion_devolucion S,  ARTICULO A
    WHERE D.ARTI_COD = A.ARTI_COD AND S.PROR_ID = :ID AND S.pror_id = D.prdd_id
    ORDER BY D.prdd_id, D.prdd_item
    INTO :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :BODITEM, :COSTO, :IVAPORC, :IVAMONTO, :TOTAL, :LOTE, :PESO
    DO
      BEGIN
      SUSPEND;
      END
end
^

SET TERM ; ^

grant select, delete, insert, update on PRODUCCION_ORDEN to PUBLIC;
grant select, delete, insert, update on produccion_orden_detalle to PUBLIC;
grant select, delete, insert, update on produccion_entrada_enc to PUBLIC;
grant select, delete, insert, update on produccion_entrada_det to PUBLIC;
grant select, delete, insert, update on produccion_salida_enc to PUBLIC;
grant select, delete, insert, update on produccion_salida_det to PUBLIC;
grant select, delete, insert, update on produccion_devolucion to PUBLIC;
grant select, delete, insert, update on produccion_devolucion_det to PUBLIC;
grant select, delete, insert, update on supervisor to PUBLIC;
grant select, delete, insert, update on producto_montaje to PUBLIC;
grant select, delete, insert, update on produccion_montaje to PUBLIC;
grant select, delete, insert, update on promedio_salidas to PUBLIC;
grant execute on procedure contabil_produccion to public;
grant execute on procedure contabil_produccion_ent to public;
grant execute on procedure contabil_produccion_sal to public;
grant execute on procedure contabil_produccion_dev to public;

update revision set revi_FECHA = '2009/10/09';
COMMIT WORK;


/* 20091012: MAL CALCULO DE COSTO CON IMPINC. IMPOCONSUMO NO ESTA MULTIPLICADO POR LA CANTIDAD*/
/* MAL CALCULO DE COSTO CON IMPINC. IMPOCONSUMO NO ESTA MULTIPLICADO POR LA CANTIDAD*/
SET TERM ^ ;

CREATE OR ALTER TRIGGER ENTRADAS_DETALLE_AI FOR ENTRADAS_DETALLE
ACTIVE AFTER INSERT POSITION 0
AS
declare variable fec date;
declare variable CONC VARCHAR(60);
declare variable factor numeric(18,4);
declare variable Pref varchar(4);
declare variable Num varchar(6);
declare variable Nit varchar(20);
declare variable IVAINC CHAR(2);
declare variable ICOINC CHAR(2);
declare variable COSTO NUMERIC(18,2);
BEGIN
  if ((NEW.entr_id <> 0) and (new.ende_anulado = 'N')) then
    BEGIN
    select entr_fecha, entr_conc, pref_pre, entr_numero, terc_nit, entr_imptos
        from entradas where entr_id = new.entr_id
        into :fec, :conc, :Pref, :Num, :Nit, :ivainc;
    execute procedure factor_unidad_cant(new.arti_cod, new.ende_unidad) returning_values(factor);
    COSTO = ((new.ende_costo - NEW.ende_dtomonto) / :factor);
    if (IVAINC = 'S') then
        BEGIN
        EXECUTE PROCEDURE lee_configuracion ('FACTURACION', 'ARTICULOS', 'IMPOCONSUMO INCLUIDO EN EL PRECIO BASE DE VENTA ANTES DE IVA') returning_values(:icoinc);
        if (icoinc = 'SI') then
            COSTO = COSTO - NEW.ende_consumo;
        COSTO = COSTO / (1 + NEW.ende_ivaporc/100);
        END
    INSERT INTO MOVIMIENTO_ARTICULO
      (ARTI_COD, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM, TERC_NIT)
      VALUES(NEW.ARTI_COD, NEW.BODE_COD, :FEC, 11, NEW.entr_id,
      :CONC, :factor * new.ende_cant, :costo, 'S', new.ende_lote, :Pref, :Num, new.ende_item, :Nit);
    /* RECORRA LAS LISTAS DE PRECIOS Y CAMBIE EL PRECIO */
    EXECUTE PROCEDURE CALCULA_PRECIOS(NEW.ARTI_COD, :FEC);
    /* ACTUALICE EL STAND */
    if (new.ende_stand is not null) then
      if (exists(select stand_cod from stands where arti_cod = new.arti_cod and stand_bodega = new.bode_cod)) then
        UPDATE stands set stand_cod = new.ende_stand where arti_cod = new.arti_cod and stand_bodega = new.bode_cod;
      else
        INSERT INTO stands (ARTI_COD, STAND_BODEGA, STAND_COD) VALUES (NEW.arti_cod, NEW.bode_cod, NEW.ende_stand);
    END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER ENTRADAS_DETALLE_AU FOR ENTRADAS_DETALLE
ACTIVE AFTER UPDATE POSITION 0
as
declare variable fec date;
declare variable CONC VARCHAR(60);
declare variable Pref varchar(4);
declare variable Num varchar(6);
declare variable Nit varchar(20);
declare variable factor numeric(18,4);
declare variable IVAINC CHAR(2);
declare variable ICOINC CHAR(2);
declare variable COSTO NUMERIC(18,2);
BEGIN
if ((OLD.entr_id <> 0) AND (OLD.ende_anulado = 'N')) then
    DELETE FROM MOVIMIENTO_ARTICULO WHERE (mvar_tipodoc = 11) and (mvar_idref = new.entr_id) and (mvar_item = old.ende_item);
if ((NEW.entr_id <> 0) AND (NEW.ende_anulado = 'N')) then
    begin
    select entr_fecha, entr_conc, pref_pre, entr_numero, terc_nit, entr_imptos
        from entradas where entr_id = new.entr_id
        into :fec, :conc, :Pref, :Num, :Nit, :ivainc;
    execute procedure factor_unidad_cant(new.arti_cod, new.ende_unidad) returning_values(factor);
    COSTO = ((new.ende_costo - NEW.ende_dtomonto) / :factor);
    if (IVAINC = 'S') then
        BEGIN
        EXECUTE PROCEDURE lee_configuracion ('FACTURACION', 'ARTICULOS', 'IMPOCONSUMO INCLUIDO EN EL PRECIO BASE DE VENTA ANTES DE IVA') returning_values(:icoinc);
        if (icoinc = 'SI') then
            COSTO = COSTO - NEW.ende_consumo;
        COSTO = COSTO / (1 + NEW.ende_ivaporc/100);
        END
    INSERT INTO MOVIMIENTO_ARTICULO
        (ARTI_COD, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM, TERC_NIT)
        VALUES(NEW.ARTI_COD, NEW.BODE_COD, :FEC, 11, NEW.entr_id,
        :CONC, :factor * new.ende_cant, :COSTO, 'S', new.ende_lote, :Pref, :Num, new.ende_item, :Nit);
    /* RECORRA LAS LISTAS DE PRECIOS Y CAMBIE EL PRECIO */
    EXECUTE PROCEDURE CALCULA_PRECIOS(NEW.ARTI_COD, :FEC);
    /* ACTUALICE EL STAND */
    if (new.ende_stand is not null) then
      if (exists(select stand_cod from stands where arti_cod = new.arti_cod and stand_bodega = new.bode_cod)) then
        UPDATE stands set stand_cod = new.ende_stand where arti_cod = new.arti_cod and stand_bodega = new.bode_cod;
      else
        INSERT INTO stands (ARTI_COD, STAND_BODEGA, STAND_COD) VALUES (NEW.arti_cod, NEW.bode_cod, NEW.ende_stand);
    END
END
^

SET TERM ; ^


/*UPDATE CONFIGURACION
    SET CONF_VALOR = 'AVISAR'
    WHERE (CONF_MODULO = 'INVENTARIO') AND (CONF_CATEGORIA = 'EXISTENCIAS') AND (CONF_PROPIEDAD = 'ACCION A TOMAR SI LA EXISTENCIA ES INSUFICIENTE');

UPDATE ENTRADAS_DETALLE SET ENDE_TRANSMIT = 'S' WHERE ENDE_CONSUMO <> 0;

UPDATE CONFIGURACION
    SET CONF_VALOR = 'PROHIBIR'
    WHERE (CONF_MODULO = 'INVENTARIO') AND (CONF_CATEGORIA = 'EXISTENCIAS') AND (CONF_PROPIEDAD = 'ACCION A TOMAR SI LA EXISTENCIA ES INSUFICIENTE');
COMMIT WORK;
*/

SET TERM ^ ;

CREATE OR ALTER TRIGGER REMISION_PROVEEDOR_DET_AI FOR REMISION_PROVEEDOR_DET
ACTIVE AFTER INSERT POSITION 0
AS
declare variable fec date;
declare variable CONC VARCHAR(60);
declare variable factor numeric(18,4);
declare variable Pref varchar(4);
declare variable Num varchar(6);
declare variable EXISTE CHAR(1);
declare variable NIT VARCHAR(20);
declare variable NUMPROV VARCHAR(20);
declare variable Tipo Integer;
declare variable idfact integer;
declare variable numrows integer;
declare variable IVAINC CHAR(2);
declare variable ICOINC CHAR(2);
declare variable COSTO NUMERIC(18,2);
declare variable CANTREL NUMERIC(18,4);
declare variable NUMPED VARCHAR(30);
declare variable CONSO CHAR(2);
declare variable CONSOLIDA INTEGER;
declare variable DTOPIE NUMERIC(18,2);
declare variable ADICIONAL NUMERIC(18,2);
declare variable TOTAL NUMERIC(18,2);
declare variable IVAMONTO NUMERIC(18,2);
declare variable EXTRA NUMERIC(18,2);
declare variable FACT NUMERIC(18,4);
declare variable MENORV CHAR(2);
declare variable CEROS CHAR(2);
declare variable ACTREM CHAR(2);
BEGIN
  if ((NEW.repr_id <> 0) and (new.rpvd_anulado = 'N')) then
    BEGIN
    select max(rprd_tiporel), max(rprd_idrel) from remision_proveedor_docrela
        where repr_id = new.repr_id into :Tipo, :idfact;
    if (Tipo is null) then
        Tipo = 0;
    /* si se hizo con base en una factura que afecto el inventario no afecte inventario */
    numrows = 0;
    if (Tipo = 21) Then
        select count(*) from movimiento_articulo where mvar_tipodoc = 21 and mvar_idref = :idfact into :numrows;
    if (numrows is null) then
        numrows = 0;
    if (numrows = 0) then
        begin
        select repr_fecha, pref_pre, repr_numero, REPR_IMPTOS, terc_nit, REPR_NUMPROV, REPR_ORDEN, REPR_CONSOLIDA, repr_dtomonto, repr_adicional, repr_total, repr_ivamonto, repr_extra
            from remision_proveedor where repr_id = new.repr_id
            into :fec, :Pref, :Num, :IVAINC, :NIT, :NUMPROV, :numped, :CONSOLIDA, :dtopie, :adicional, :total, :ivamonto, :extra;
        execute procedure factor_unidad_cant(new.arti_cod, new.rpvd_unidad) returning_values(factor);
        CONC = 'REMISION PROVEEDOR No.' || PREF || NUM || '-' || NUMPROV;
        if (numped <> '') then
            conc = conc || '-ORDEN ' || NUMPED;
        COSTO = ((new.rpvd_prunit - NEW.rpvd_dtomonto) / :factor);
        if (IVAINC = 'S') then
            BEGIN
            EXECUTE PROCEDURE lee_configuracion ('FACTURACION', 'ARTICULOS', 'IMPOCONSUMO INCLUIDO EN EL PRECIO BASE DE VENTA ANTES DE IVA') returning_values(:icoinc);
            if (icoinc = 'SI') then
                COSTO = COSTO - (NEW.rpvd_consumo/(NEW.rpvd_cant * new.rpvd_factor));
            COSTO = COSTO / (1 + NEW.rpvd_ivaporc/100);
            END
        EXECUTE PROCEDURE lee_configuracion('COMPRAS','FACTURAS','DESCUENTO Y VALOR ADICIONAL DEL DOCUMENTO COMO MENOR VALOR DEL COSTO') returning_values (:MENORV);
        if (MENORV = 'SI') then
            BEGIN
            FACT = (TOTAL - EXTRA - IVAMONTO);
            if ((FACT - ADICIONAL + DTOPIE) <> 0) then
                FACT = FACT / (FACT - ADICIONAL + DTOPIE);
            ELSE
                FACT = 1;
            COSTO = COSTO * FACT;
            END
        if (COSTO = 0) then
            BEGIN
            EXECUTE PROCEDURE lee_configuracion('COMPRAS', 'REMISIONES', 'PERMITIR CEROS EN COSTOS DE MERCANCIA') returning_values (:ceros);
            EXECUTE PROCEDURE lee_configuracion('COMPRAS', 'FACTURAS', 'ACTUALIZAR COSTOS DE LA REMISION RELACIONADA AL GRABAR LA FACTURA') returning_values (:ACTREM);
            if ((ACTREM = 'SI') and (CEROS = 'NO')) then
                execute procedure costo_promedio(NEW.arti_cod, :fec) returning_values (:COSTO);
            END
        INSERT INTO MOVIMIENTO_ARTICULO
          (ARTI_COD, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM, TERC_NIT)
          VALUES(NEW.ARTI_COD, NEW.BODE_COD, :FEC, 22, NEW.repr_id,
          :CONC, :factor * new.rpvd_cant, :COSTO, 'S', new.rpvd_lote, :Pref, :Num, new.rpvd_item, :Nit);

        /* RECORRA LAS LISTAS DE PRECIOS Y CAMBIE EL PRECIO */
        EXECUTE PROCEDURE CALCULA_PRECIOS(NEW.ARTI_COD, :FEC);

        if (COSTO > 0 ) then
         BEGIN
          /* GRABE PROV X ARTICULO */
          EXISTE = 'N';
          SELECT 'S' FROM PROVEEDOR_ARTICULO WHERE TERC_NIT = :NIT AND ARTI_COD = NEW.ARTI_COD INTO :EXISTE;
          if (EXISTE = 'S') then
            UPDATE PROVEEDOR_ARTICULO 
                SET PVAR_FECHA = :FEC, PVAR_COSTO = :COSTO, PVAR_COD = NEW.rpvd_codprov
                WHERE TERC_NIT = :NIT AND ARTI_COD = NEW.ARTI_COD;
          ELSE
            INSERT INTO PROVEEDOR_ARTICULO (TERC_NIT, ARTI_COD, PVAR_COSTO, PVAR_FECHA, PVAR_COD,PVAR_DES)
                VALUES (:NIT, NEW.ARTI_COD, :COSTO, :FEC, NEW.rpvd_codprov,NEW.rpvd_desc);
         END
        end

    /* ACTUALICE EL PENDIENTE  */
    if (CONSOLIDA <> 0) then
        BEGIN
        EXECUTE PROCEDURE LEE_CONFIGURACION ('COMPRAS','DOCUMENTOS','SUMAR CANTIDADES PENDIENTES AL CONSOLIDAR DOCUMENTOS') returning_values (CONSO);
        SELECT MIN(CEFA_TIPOORI) FROM consolide_faltantes WHERE CEFA_ID = :CONSOLIDA INTO :NUMROWS;
        if (NUMROWS = 23) then
            BEGIN
            EXECUTE PROCEDURE LEE_CONFIGURACION('COMPRAS', 'REMISIONES', 'VERIFICAR CODIGOS DE LA ORDEN') returning_values (MENORV);
            if (MENORV = 'SI') then
                CONSO = 'NO';
            END
        SELECT COUNT(CEFA_ITEM) FROM consolide_faltantes WHERE CEFA_ID = :CONSOLIDA INTO :NUMROWS;
        if ((CONSO = 'SI') AND (NUMROWS > 1)) then
            UPDATE consolidado_faltantes SET COFA_OK = 'S' WHERE COFA_ID = :consolida;
        ELSE
            BEGIN
            /* BUSQUE EL CONSOLIDADO EN EL MISMO ITEM Y SI ES DIFERENTE ACTUALICELO */
            select COFA_CANT * COFA_FACTOR FROM consolidado_faltantes WHERE COFA_ID = :consolida AND COFA_ITEM = NEW.RPVD_ITEM AND ARTI_COD = NEW.arti_cod INTO :CANTREL;
            if (NEW.RPVD_CANT * NEW.RPVD_FACTOR < CANTREL) then
                UPDATE consolidado_faltantes SET COFA_IDDES = NEW.repr_id, COFA_CANT = NEW.RPVD_CANT, COFA_FACTOR = NEW.RPVD_FACTOR
                    WHERE COFA_ID = :consolida AND COFA_ITEM = NEW.RPVD_ITEM AND ARTI_COD = NEW.arti_cod;
            ELSE
                UPDATE consolidado_faltantes SET COFA_IDDES = NEW.repr_id, COFA_OK = 'S' WHERE COFA_ID = :consolida AND COFA_ITEM = NEW.RPVD_ITEM AND ARTI_COD = NEW.arti_cod;
            END
        END
    /* ACTUALICE EL STAND */
    if (new.rpvd_stand is not null) then
      if (exists(select stand_cod from stands where arti_cod = new.arti_cod and stand_bodega = new.bode_cod)) then
        UPDATE stands set stand_cod = new.rpvd_stand where arti_cod = new.arti_cod and stand_bodega = new.bode_cod;
      else
        INSERT INTO stands (ARTI_COD, STAND_BODEGA, STAND_COD) VALUES (NEW.arti_cod, NEW.bode_cod, NEW.rpvd_stand);
    END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER REMISION_PROVEEDOR_DET_AU FOR REMISION_PROVEEDOR_DET
ACTIVE AFTER UPDATE POSITION 0
AS
declare variable fec date;
declare variable CONC VARCHAR(60);
declare variable Pref varchar(4);
declare variable Num varchar(6);
declare variable factor numeric(18,4);
declare variable EXISTE CHAR(1);
declare variable NIT VARCHAR(20);
declare variable NUMPROV VARCHAR(20);
declare variable Tipo integer;
declare variable idfact integer;
declare variable numrows integer;
declare variable IVAINC CHAR(2);
declare variable ICOINC CHAR(2);
declare variable COSTO NUMERIC(18,2);
declare variable CANTREL NUMERIC(18,4);
declare variable NUMPED VARCHAR(30);
declare variable CONSO CHAR(2);
declare variable CONSOLIDA INTEGER;
declare variable DTOPIE NUMERIC(18,2);
declare variable ADICIONAL NUMERIC(18,2);
declare variable TOTAL NUMERIC(18,2);
declare variable IVAMONTO NUMERIC(18,2);
declare variable EXTRA NUMERIC(18,2);
declare variable FACT NUMERIC(18,4);
declare variable MENORV CHAR(2);
declare variable CEROS CHAR(2);
declare variable ACTREM CHAR(2);
BEGIN
if ((OLD.repr_id <> 0) AND (OLD.rpvd_anulado = 'N')) then
    begin
    DELETE FROM MOVIMIENTO_ARTICULO WHERE (mvar_tipodoc = 22) and (mvar_idref = new.repr_id) and (mvar_item = old.rpvd_item);
    select REPR_CONSOLIDA from remision_proveedor where repr_id = old.repr_id into :CONSOLIDA;
    if (CONSOLIDA <> 0) then
        begin
        EXECUTE PROCEDURE LEE_CONFIGURACION ('COMPRAS','DOCUMENTOS','SUMAR CANTIDADES PENDIENTES AL CONSOLIDAR DOCUMENTOS') returning_values (CONSO);
        SELECT COUNT(CEFA_ITEM) FROM consolide_faltantes WHERE CEFA_ID = :CONSOLIDA INTO :NUMROWS;
        if ((NUMROWS = 1) OR (CONSO = 'NO')) then
            UPDATE consolidado_faltantes SET COFA_OK = 'N' WHERE COFA_ID = :consolida AND COFA_ITEM = old.RPVD_ITEM AND ARTI_COD = old.arti_cod;
        else
            UPDATE consolidado_faltantes SET COFA_OK = 'N' WHERE COFA_ID = :consolida;
        END
    end
/* Registre el nuevo */
if ((new.repr_id <> 0) AND (new.rpvd_anulado = 'N')) then
    begin
    select repr_fecha, pref_pre, repr_numero, repr_imptos, terc_nit, REPR_NUMPROV, REPR_ORDEN, REPR_CONSOLIDA, repr_dtomonto, repr_adicional, repr_total, repr_ivamonto, repr_extra
        from remision_proveedor where repr_id = new.repr_id
        into :fec, :Pref, :Num, :IVAINC, :NIT, :NUMPROV, :numped, :CONSOLIDA, :dtopie, :adicional, :total, :ivamonto, :extra;
    CONC = 'REMISION PROVEEDOR No.' || PREF || NUM || '-' || NUMPROV;
    if (numped <> '') then
        conc = conc || '-ORDEN ' || NUMPED;
    SELECT MAX(CEFA_TIPOORI) FROM consolide_faltantes WHERE CEFA_ID = :CONSOLIDA INTO :TIPO;
    if (Tipo is null) then
        Tipo = 0;
    select FACO_ID from FACTURAS_COMPRA WHERE FACO_CONSOLIDA = :consolida INTO :IDFACT;
    if (Idfact is null) then
        Idfact = 0;
    /* si se hizo con base en una factura que afecto el inventario no afecte inventario */
    numrows = 0;
    if (Tipo = 21) Then
        select count(*) from movimiento_articulo where mvar_tipodoc = 21 and mvar_idref = :idfact into :numrows;
    if (numrows is null) then
        numrows = 0;
    if (numrows = 0) then
        begin
        execute procedure factor_unidad_cant(new.arti_cod, new.rpvd_unidad) returning_values(factor);
        COSTO = ((new.rpvd_prunit - NEW.rpvd_dtomonto) / :factor);
        if (IVAINC = 'S') then
            BEGIN
            EXECUTE PROCEDURE lee_configuracion ('FACTURACION', 'ARTICULOS', 'IMPOCONSUMO INCLUIDO EN EL PRECIO BASE DE VENTA ANTES DE IVA') returning_values(:icoinc);
            if (icoinc = 'SI') then
                COSTO = COSTO - (NEW.rpvd_consumo/(NEW.rpvd_cant * new.rpvd_factor));
            COSTO = COSTO / (1 + NEW.rpvd_ivaporc/100);
            END
        EXECUTE PROCEDURE lee_configuracion('COMPRAS','FACTURAS','DESCUENTO Y VALOR ADICIONAL DEL DOCUMENTO COMO MENOR VALOR DEL COSTO') returning_values (:MENORV);
        if (MENORV = 'SI') then
            BEGIN
            FACT = (TOTAL - EXTRA - IVAMONTO);
            if ((FACT - ADICIONAL + DTOPIE) <> 0) then
                FACT = FACT / (FACT - ADICIONAL + DTOPIE);
            ELSE
                FACT = 1;
            COSTO = COSTO * FACT;
            END
        if (COSTO = 0) then
            BEGIN
            EXECUTE PROCEDURE lee_configuracion('COMPRAS', 'REMISIONES', 'PERMITIR CEROS EN COSTOS DE MERCANCIA') returning_values (:ceros);
            EXECUTE PROCEDURE lee_configuracion('COMPRAS', 'FACTURAS', 'ACTUALIZAR COSTOS DE LA REMISION RELACIONADA AL GRABAR LA FACTURA') returning_values (:ACTREM);
            if ((ACTREM = 'SI') and (CEROS = 'NO')) then
                execute procedure costo_promedio(NEW.arti_cod, :fec) returning_values (:COSTO);
            END
        INSERT INTO MOVIMIENTO_ARTICULO
            (ARTI_COD, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM, TERC_NIT)
            VALUES(NEW.ARTI_COD, NEW.BODE_COD, :FEC, 22, NEW.repr_id,
            :CONC, :factor * new.rpvd_cant, :COSTO, 'S', new.rpvd_lote, :Pref, :Num, new.rpvd_item, :Nit);
            
        /* RECORRA LAS LISTAS DE PRECIOS Y CAMBIE EL PRECIO */
        EXECUTE PROCEDURE CALCULA_PRECIOS(NEW.ARTI_COD, :FEC);
          
        if (COSTO > 0 ) then
         BEGIN
          /* GRABE PROV X ARTICULO */
          EXISTE = 'N';
          SELECT 'S' FROM PROVEEDOR_ARTICULO WHERE TERC_NIT = :NIT AND ARTI_COD = NEW.ARTI_COD INTO :EXISTE;
          if (EXISTE = 'S') then
            UPDATE PROVEEDOR_ARTICULO
                SET PVAR_FECHA = :FEC, PVAR_COSTO = :COSTO, PVAR_COD = NEW.rpvd_codprov
                WHERE TERC_NIT = :NIT AND ARTI_COD = NEW.ARTI_COD;
          ELSE
            INSERT INTO PROVEEDOR_ARTICULO (TERC_NIT, ARTI_COD, PVAR_COSTO, PVAR_FECHA, PVAR_COD,PVAR_DES)
                VALUES (:NIT, NEW.ARTI_COD, :COSTO, :FEC, NEW.rpvd_codprov,NEW.rpvd_desc);
         END
        end
    if (CONSOLIDA <> 0) then
        BEGIN
        EXECUTE PROCEDURE LEE_CONFIGURACION ('COMPRAS','DOCUMENTOS','SUMAR CANTIDADES PENDIENTES AL CONSOLIDAR DOCUMENTOS') returning_values (CONSO);
        /* IGNORE LA CONSOLIDACION SI SE VALIDAN CODIGOS DE LA ORDEN */
        SELECT MIN(CEFA_TIPOORI) FROM consolide_faltantes WHERE CEFA_ID = :CONSOLIDA INTO :NUMROWS;
        if (NUMROWS = 23) then
            BEGIN
            EXECUTE PROCEDURE LEE_CONFIGURACION('COMPRAS', 'REMISIONES', 'VERIFICAR CODIGOS DE LA ORDEN') returning_values (MENORV);
            if (MENORV = 'SI') then
                CONSO = 'NO';
            END
        SELECT COUNT(CEFA_ITEM) FROM consolide_faltantes WHERE CEFA_ID = :CONSOLIDA INTO :NUMROWS;
        if ((CONSO = 'SI') AND (NUMROWS > 1)) then
            UPDATE consolidado_faltantes SET COFA_IDDES = NEW.repr_id, COFA_OK = 'S' WHERE COFA_ID = :consolida;
        ELSE
            BEGIN
            /* BUSQUE EL CONSOLIDADO EN EL MISMO ITEM Y SI ES DIFERENTE ACTUALICELO */
            select COFA_CANT * COFA_FACTOR FROM consolidado_faltantes WHERE COFA_ID = :consolida AND COFA_ITEM = NEW.RPVD_ITEM AND ARTI_COD = NEW.arti_cod INTO :CANTREL;
            if (NEW.RPVD_CANT * NEW.RPVD_FACTOR < CANTREL) then
                UPDATE consolidado_faltantes SET COFA_IDDES = NEW.repr_id, COFA_CANT = NEW.RPVD_CANT, COFA_FACTOR = NEW.RPVD_FACTOR
                    WHERE COFA_ID = :consolida AND COFA_ITEM = NEW.RPVD_ITEM AND ARTI_COD = NEW.arti_cod;
            else
                UPDATE consolidado_faltantes SET COFA_IDDES = NEW.repr_id, COFA_OK = 'S' WHERE COFA_ID = :consolida AND COFA_ITEM = NEW.RPVD_ITEM AND ARTI_COD = NEW.arti_cod;
            END
        END
    /* ACTUALICE EL STAND */
    if (new.rpvd_stand is not null) then
      if (exists(select stand_cod from stands where arti_cod = new.arti_cod and stand_bodega = new.bode_cod)) then
        UPDATE stands set stand_cod = new.rpvd_stand where arti_cod = new.arti_cod and stand_bodega = new.bode_cod;
      else
        INSERT INTO stands (ARTI_COD, STAND_BODEGA, STAND_COD) VALUES (NEW.arti_cod, NEW.bode_cod, NEW.rpvd_stand);
    END
END
^

SET TERM ; ^

SET TERM ^ ;

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

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

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

    /* ACTUALICE EL PENDIENTE  */
    if (CONSOLIDA <> 0) then
        BEGIN
        UPDATE consolidado_faltantes SET COFA_OK = 'S' WHERE COFA_ID = :consolida AND COFA_ITEM = NEW.FCDE_ITEM AND ARTI_COD = NEW.arti_cod;
        EXECUTE procedure LEE_CONFIGURACION ('COMPRAS','DOCUMENTOS','SUMAR CANTIDADES PENDIENTES AL CONSOLIDAR DOCUMENTOS') returning_values (CONSO);
        /* IGNORE LA CONSOLIDACION SI SE VALIDAN CODIGOS DE LA ORDEN */
        SELECT MIN(CEFA_TIPOORI) FROM consolide_faltantes WHERE CEFA_ID = :CONSOLIDA INTO :NUMROWS;
        if (NUMROWS = 23) then
            BEGIN
            EXECUTE PROCEDURE LEE_CONFIGURACION('COMPRAS', 'FACTURAS', 'VERIFICAR CODIGOS DE LA ORDEN') returning_values (MENORV);
            if (MENORV = 'SI') then
                CONSO = 'NO';
            END
        SELECT COUNT(CEFA_ITEM) FROM consolide_faltantes WHERE CEFA_ID = :CONSOLIDA INTO :NUMROWS;
        if ((CONSO = 'SI') AND (NUMROWS > 1)) then
            UPDATE consolidado_faltantes SET COFA_IDDES = NEW.faco_id, COFA_OK = 'S' WHERE COFA_ID = :consolida;
        else
            BEGIN
            /* BUSQUE EL CONSOLIDADO EN EL MISMO ITEM Y SI ES DIFERENTE ACTUALICELO */
            select COFA_CANT * COFA_FACTOR FROM consolidado_faltantes WHERE COFA_ID = :consolida AND COFA_ITEM = NEW.FCDE_ITEM AND ARTI_COD = NEW.arti_cod INTO :CANTREL;
            if (NEW.FCDE_CANT * NEW.FCDE_FACTOR < CANTREL) then
                UPDATE consolidado_faltantes SET COFA_IDDES = NEW.faco_id, COFA_CANT = NEW.FCDE_CANT, COFA_FACTOR = NEW.FCDE_FACTOR
                    WHERE COFA_ID = :consolida AND COFA_ITEM = NEW.FCDE_ITEM AND ARTI_COD = NEW.arti_cod;
            END
        END
    /* ACTUALICE EL STAND */
    if (new.fcde_stand is not null) then
      if (exists(select stand_cod from stands where arti_cod = new.arti_cod and stand_bodega = new.bode_cod)) then
        UPDATE stands set stand_cod = new.fcde_stand where arti_cod = new.arti_cod and stand_bodega = new.bode_cod;
      else
        INSERT INTO stands (ARTI_COD, STAND_BODEGA, STAND_COD) VALUES (NEW.arti_cod, NEW.bode_cod, NEW.fcde_stand);
    END
END
^

SET TERM ; ^

SET TERM ^ ;

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

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

        if (CONSOLIDA <> 0) then
            begin
            UPDATE consolidado_faltantes SET COFA_OK = 'S' WHERE COFA_ID = :consolida AND COFA_ITEM = NEW.FCDE_ITEM AND ARTI_COD = NEW.arti_cod;
            EXECUTE procedure LEE_CONFIGURACION ('COMPRAS','DOCUMENTOS','SUMAR CANTIDADES PENDIENTES AL CONSOLIDAR DOCUMENTOS') returning_values (CONSO);
            /* IGNORE LA CONSOLIDACION SI SE VALIDAN CODIGOS DE LA ORDEN */
            SELECT MIN(CEFA_TIPOORI) FROM consolide_faltantes WHERE CEFA_ID = :CONSOLIDA INTO :NUMROWS;
            if (NUMROWS = 23) then
                BEGIN
                EXECUTE PROCEDURE LEE_CONFIGURACION('COMPRAS', 'FACTURAS', 'VERIFICAR CODIGOS DE LA ORDEN') returning_values (MENORV);
                if (MENORV = 'SI') then
                    CONSO = 'NO';
                END
            SELECT COUNT(CEFA_ITEM) FROM consolide_faltantes WHERE CEFA_ID = :CONSOLIDA INTO :NUMROWS;
            if ((CONSO = 'SI') AND (NUMROWS > 1)) then
                UPDATE consolidado_faltantes SET COFA_IDDES = NEW.faco_id, COFA_OK = 'S' WHERE COFA_ID = :consolida;
            else
                BEGIN
                /* BUSQUE EL CONSOLIDADO EN EL MISMO ITEM Y SI ES DIFERENTE ACTUALICELO */
                select COFA_CANT * COFA_FACTOR FROM consolidado_faltantes WHERE COFA_ID = :consolida AND COFA_ITEM = NEW.FCDE_ITEM AND ARTI_COD = NEW.arti_cod INTO :CANTREL;
                if (NEW.FCDE_CANT * NEW.FCDE_FACTOR < CANTREL) then
                    UPDATE consolidado_faltantes SET COFA_IDDES = NEW.faco_id, COFA_CANT = NEW.FCDE_CANT, COFA_FACTOR = NEW.FCDE_FACTOR
                        WHERE COFA_ID = :consolida AND COFA_ITEM = NEW.FCDE_ITEM AND ARTI_COD = NEW.arti_cod;
                END
            end
        /* ACTUALICE EL STAND */
        if (new.fcde_stand is not null) then
          if (exists(select stand_cod from stands where arti_cod = new.arti_cod and stand_bodega = new.bode_cod)) then
            UPDATE stands set stand_cod = new.fcde_stand where arti_cod = new.arti_cod and stand_bodega = new.bode_cod;
          else
            INSERT INTO stands (ARTI_COD, STAND_BODEGA, STAND_COD) VALUES (NEW.arti_cod, NEW.bode_cod, NEW.fcde_stand);
        END
    end
END
^

SET TERM ; ^


/* 20091013 */
/* COMISIONES POR VENTA Y COBRO POR ARTICULO Y PROPORCION POR VENDEDOR */

ALTER TABLE PRECIOS_ARTICULO
ADD PRAR_COMIC T_PORCENTAJE;

INSERT INTO CONFIGURACION (CONF_MODULO, CONF_CATEGORIA, CONF_PROPIEDAD, CONF_VALOR, CONF_POSIBLES, CONF_AYUDA) VALUES ('CARTERA', 'COMISIONES', 'COMISION POR ARTICULO Y PROPORCION POR DIAS DE RECAUDO', 'NO', 'SI,NO', 'SI: La comisión es el porcentaje asignado al artículo multiplicado por la fracción asignada al cobrador en la tabla de comisiones cobro dependiendo de los dias de recaudo. NO: La comisión es por la tabla de comisiones cobro');
INSERT INTO CONFIGURACION (CONF_MODULO, CONF_CATEGORIA, CONF_PROPIEDAD, CONF_VALOR, CONF_POSIBLES, CONF_AYUDA) VALUES ('FACTURACION', 'ARTICULOS', 'COMISION POR ARTICULO Y PROPORCION POR VENDEDOR', 'NO', 'SI,NO', 'SI: La comisión es la multiplicación de la comisión del artículo por una proporción asignada al vendedor en la tabla de comisiones. NO: la comisón es directamente la del artículo');
commit work;

SET TERM ^ ;

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

SET TERM ; ^

SET TERM ^ ;

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

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

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

SET TERM ; ^

/* 20091014 */
/* factor nulo */

SET TERM ^ ;

CREATE OR ALTER TRIGGER PRODUCCION_ENTRADA_DET_BI FOR PRODUCCION_ENTRADA_DET
ACTIVE BEFORE INSERT POSITION 0
as
declare variable NUMROWS integer;
begin
/*  PARENT 'ARTICULO' MUST EXIST WHEN INSERTING A CHILD IN 'ENSAMBLES_DETALLE'  */
IF (NEW.ARTI_COD IS NOT NULL) THEN
    BEGIN
       SELECT COUNT(*)
       FROM   ARTICULO
       WHERE  ARTICULO.ARTI_COD = NEW.ARTI_COD
       INTO   :NUMROWS;
       IF (NUMROWS = 0) THEN
       BEGIN
          EXCEPTION ARTICULO_NO_EXISTE;
       END
    END
/*  PARENT 'BODEGA' MUST EXIST WHEN INSERTING A CHILD IN 'ENSAMBLES_DETALLE'  */
IF (NEW.bode_cod IS NOT NULL) THEN
    BEGIN
       SELECT COUNT(*)
       FROM   BODEGA
       WHERE  BODEGA.BODE_COD = NEW.bode_cod
       INTO   :NUMROWS;
       IF (NUMROWS = 0) THEN
       BEGIN
          EXCEPTION BODEGA_NO_EXISTE;
       END
    END
/*  PARENT 'ENSAMBLES' MUST EXIST WHEN INSERTING A CHILD IN 'ENSAMBLES_DETALLE'  */
IF (NEW.prde_id IS NOT NULL) THEN
    BEGIN
       SELECT COUNT(*)
       FROM   produccion_entrada_enc
       WHERE  produccion_entrada_enc.prde_id = NEW.prde_id
       INTO   :NUMROWS;
       IF (NUMROWS = 0) THEN
       BEGIN
          EXCEPTION entradaprod_no_existe;
       END
    END
if (new.pren_factor is null) then
    execute procedure factor_unidad_cant (new.arti_cod, new.pren_unidad) returning_values (new.pren_factor);
end
^

SET TERM ; ^

update produccion_entrada_det set pren_factor = 1 where pren_factor is null;
commit work;


/* 20091016 */
SET TERM ^ ;

create  or alter procedure CONTACTOS_CLIENTE (
    NIT VARCHAR(20))
returns (
    ID INTEGER,
    NOMBRE VARCHAR(60),
    CARGO VARCHAR(60))
as
begin
ID = 0;
SELECT CRCL_CONTACTO FROM crm_clientes WHERE CRCL_NIT = :NIT INTO :NOMBRE;
suspend;
FOR SELECT TECC_ITEM, TECC_NOMBRE, TECC_CARGO FROM terceros_contactos WHERE TERC_NIT = :NIT
    INTO :ID, :NOMBRE, :cargo
    DO
    SUSPEND;
end
^

SET TERM ; ^

grant EXECUTE on PROCEDURE CONTACTOS_CLIENTE to PUBLIC;


/* 20091019 */
/* CONTADO/CREDITO EN REPORTE CRONOLOGICO DE VENTAS EN FACTURAS Y DEVOLUCIONES */
SET TERM ^ ;

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

SET TERM ; ^


/* 20091020 */
/* AGREGAR TELEFONO DEL CONTACTO */
SET TERM ^ ;

CREATE OR ALTER procedure CONTACTOS_CLIENTE (
    NIT varchar(20))
returns (
    ID integer,
    NOMBRE varchar(60),
    CARGO varchar(60))
AS
begin
ID = 0;
SELECT SUBSTRING(CRCL_CONTACTO from 1 FOR 40) || '-' || SUBSTRING(CRCL_TEL FROM 1 FOR 19) FROM crm_clientes WHERE CRCL_NIT = :NIT INTO :NOMBRE;
suspend;
FOR SELECT TECC_ITEM, SUBSTRING(TECC_NOMBRE from 1 FOR 40) || '-' || SUBSTRING(TECC_TELEFONOS FROM 1 FOR 19), TECC_CARGO FROM terceros_contactos WHERE TERC_NIT = :NIT
    INTO :ID, :NOMBRE, :cargo
    DO
    SUSPEND;
end
^

SET TERM ; ^


SET TERM ^ ;

CREATE OR ALTER procedure BUSQUEDA_PROSPECTOS (
    INACTIVOS char(1),
    BUSCAR varchar(100),
    CUALQUIERA char(1),
    COLUMNA integer,
    BUSCAR2 varchar(30),
    BUSCAR3 varchar(30),
    BUSCAR4 varchar(30),
    BUSCAR5 varchar(30))
returns (
    NIT varchar(20),
    NOMBRE varchar(60),
    ENCARGADO varchar(60),
    DIR varchar(100),
    CIUD varchar(40),
    TEL varchar(40),
    VEND varchar(60),
    ANIV date,
    RELACION varchar(60),
    ESTADO varchar(60),
    ULTFEC date,
    ASESOR varchar(60),
    CONTACTO varchar(60),
    CLASE varchar(60),
    AGRUPA varchar(60))
AS
declare variable TIPOREL INTEGER;
declare variable CODCLASE VARCHAR(20);
declare variable CODAGRUPA INTEGER;
declare variable CODESTADO INTEGER;
declare variable OK CHAR(1);
begin
if ((BUSCAR IS NOT NULL) AND (BUSCAR <> '')) then
    BEGIN
    FOR select CRCL_NIT, CRCL_NOM, CRCL_DIR, CRCL_CIU, CRCL_TEL, CRCL_CONTACTO, CRCL_ANIV, CRCL_TIPORELA, CRCL_ESTADO, CRCL_CLASE, CRCL_AGRUPA
        FROM CRM_CLIENTES WHERE ((:INACTIVOS = 'S') or (CRCL_ESTADO <> 0)) AND
            ((:COLUMNA <> 0) or (upper(CRCL_NIT) like upper(:buscar))) AND
            ((:columna <> 1) or (upper(CRCL_NOM) like upper(:buscar))) AND
            ((:columna <> 2) or (upper(CRCL_CONTACTO) like upper(:buscar)))
         INTO :NIT, :NOMBRE, :DIR, :CIUD, :TEL, :ENCARGADO, :ANIV, :TIPOREL, :CODESTADO, :CODCLASE, :CODAGRUPA
         DO
         BEGIN
         CLASE = '';
         AGRUPA = '';
         RELACION = '';
         ESTADO = '';
         VEND = '';
         SELECT CRTR_NOMBRE FROM crm_tiporelacion WHERE crtr_id = :tiporel INTO :relacion;
         SELECT CRES_NOMBRE FROM crm_estado WHERE cres_id = :codestado INTO :estado;
         SELECT CRCL_NOMBRE FROM crm_clase WHERE crcl_id = :codclase INTO :clase;
         SELECT CRAG_NOMBRE FROM crm_agrupacion WHERE crag_id = :codagrupa INTO :agrupa;
         SELECT VEND_NOMBRE FROM CLIENTES C, VENDEDORES V WHERE TERC_NIT = :NIT AND C.vend_cod = V.vend_cod INTO :vend;
         ULTFEC = NULL;
         ASESOR = NULL;
         CONTACTO = NULL;
         SELECT FIRST 1 CREV_FECHA, CREV_ASESOR, CRTC_NOMBRE FROM CRM_EVENTOS E, CRM_TIPOCONTACTO T
            WHERE CRCL_NIT = :NIT AND E.crev_tipo = T.crtc_id ORDER BY CREV_FECHA DESC
            INTO :ultfec, :asesor, :contacto;
         if (CUALQUIERA = 'S') then
            SUSPEND;
         ELSE
            if ((COLUMNA > 0) AND (BUSCAR2 <> '')) then
                BEGIN
                OK = 'S';
                IF (NOT EXISTS (SELECT CRCL_NIT FROM CRM_CLIENTES WHERE CRCL_NIT = :NIT AND
                    ((:columna <> 1) or (upper(CRCL_NOM) like upper(:buscar2))) AND
                    ((:columna <> 2) or (upper(CRCL_CONTACTO) like upper(:buscar2))))) THEN
                    OK = 'N';
                if ((OK = 'S') AND (BUSCAR3 <> '')) then
                    IF (NOT EXISTS (SELECT CRCL_NIT FROM CRM_CLIENTES WHERE CRCL_NIT = :NIT AND
                        ((:columna <> 1) or (upper(CRCL_NOM) like upper(:buscar3))) AND
                        ((:columna <> 2) or (upper(CRCL_CONTACTO) like upper(:buscar3))))) THEN
                        OK = 'N';
                if ((OK = 'S') AND (BUSCAR4 <> '')) then
                    IF (NOT EXISTS (SELECT CRCL_NIT FROM CRM_CLIENTES WHERE CRCL_NIT = :NIT AND
                        ((:columna <> 1) or (upper(CRCL_NOM) like upper(:buscar4))) AND
                        ((:columna <> 2) or (upper(CRCL_CONTACTO) like upper(:buscar4))))) THEN
                        OK = 'N';
                if ((OK = 'S') AND (BUSCAR5 <> '')) then
                    IF (NOT EXISTS (SELECT CRCL_NIT FROM CRM_CLIENTES WHERE CRCL_NIT = :NIT AND
                        ((:columna <> 1) or (upper(CRCL_NOM) like upper(:buscar5))) AND
                        ((:columna <> 2) or (upper(CRCL_CONTACTO) like upper(:buscar5))))) THEN
                        OK = 'N';
                if (OK = 'S') then
                    SUSPEND;
                END
            ELSE
                SUSPEND;
        END
    END
else
    BEGIN
    FOR select CRCL_NIT, CRCL_NOM, CRCL_DIR, CRCL_CIU, CRCL_TEL, CRCL_CONTACTO, CRCL_ANIV, CRCL_TIPORELA, CRCL_ESTADO, CRCL_CLASE, CRCL_AGRUPA
        FROM CRM_CLIENTES WHERE ((:INACTIVOS = 'S') or (CRCL_ESTADO <> 0))
         INTO :NIT, :NOMBRE, :DIR, :CIUD, :TEL, :ENCARGADO, :ANIV, :TIPOREL, :CODESTADO, :CODCLASE, :CODAGRUPA
         DO
         BEGIN
         CLASE = '';
         AGRUPA = '';
         RELACION = '';
         ESTADO = '';
         VEND = '';
         SELECT CRTR_NOMBRE FROM crm_tiporelacion WHERE crtr_id = :tiporel INTO :relacion;
         SELECT CRES_NOMBRE FROM crm_estado WHERE cres_id = :codestado INTO :estado;
         SELECT CRCL_NOMBRE FROM crm_clase WHERE crcl_id = :codclase INTO :clase;
         SELECT CRAG_NOMBRE FROM crm_agrupacion WHERE crag_id = :codagrupa INTO :agrupa;
         SELECT VEND_NOMBRE FROM CLIENTES C, VENDEDORES V WHERE TERC_NIT = :NIT AND C.vend_cod = V.vend_cod INTO :vend;
         ULTFEC = NULL;
         ASESOR = NULL;
         CONTACTO = NULL;
         SELECT FIRST 1 CREV_FECHA, CREV_ASESOR, CRTC_NOMBRE FROM CRM_EVENTOS E, CRM_TIPOCONTACTO T
            WHERE CRCL_NIT = :NIT AND E.crev_tipo = T.crtc_id
            INTO :ultfec, :asesor, :contacto;
         SUSPEND;
         END
    END
end
^

SET TERM ; ^


/* 20091020b : BONOS DE PAGO AL FACTURAR */

INSERT INTO CONFIGURACION (CONF_MODULO, CONF_CATEGORIA, CONF_PROPIEDAD, CONF_VALOR, CONF_POSIBLES, CONF_AYUDA) VALUES ('FACTURACION', 'ARTICULOS', 'PERMITIR GENERAR BONOS DE PAGO AL FACTURAR ARTICULOS SELECCIONADOS', 'NO', 'SI,NO', 'SI: Permite que un artículo facturado sea a su vez un medio de pago en posteriores facturas para por ejemplo vender bonos o tarjetas perpago en almacenes');
INSERT INTO CONFIGURACION (CONF_MODULO, CONF_CATEGORIA, CONF_PROPIEDAD, CONF_VALOR, CONF_POSIBLES, CONF_AYUDA) VALUES ('FACTURACION', 'ARTICULOS', 'VALIDEZ DE LOS BONOS DE PAGO', '1', '1,30,60,90,180,365,9999', 'Indique el máximo plazo para usar los bonos de pago expedidos al facturar artículos como bonos o tarjetas prepago');
INSERT INTO CONFIGURACION (CONF_MODULO, CONF_CATEGORIA, CONF_PROPIEDAD, CONF_VALOR, CONF_POSIBLES, CONF_AYUDA) VALUES ('FACTURACION', 'ARTICULOS', 'FORMA DE PAGO PARA BONOS FACTURADOS', '9', '', 'Indique el código de la forma de pago usada para registrar los bonos de pago expedidos al facturar artículos seleccionados');
INSERT INTO CONFIGURACION (CONF_MODULO, CONF_CATEGORIA, CONF_PROPIEDAD, CONF_VALOR, CONF_POSIBLES, CONF_AYUDA) VALUES ('FACTURACION', 'ARTICULOS', 'VALOR PREDETERMINADO DEL BONO DE PAGO FACTURADO', '0', '', 'Indique el valor predeterminado para el bono de pago generado al facturar artículos seleccionados');
commit work;

ALTER TABLE ARTICULO
ADD ARTI_VALORBONO T_MONTO;

CREATE TABLE BONOS_PAGO (
    BOPA_ID T_ID NOT NULL,
    BOPA_FACTURA T_ID NOT NULL,
    BOPA_PREF VARCHAR(4),
    BOPA_NUMERO T_NUMDOC,
    BOPA_FECHA DATE,
    BOPA_ITEM T_ID,
    BOPA_MONTO T_MONTO,
    BOPA_IDRDC T_ID);
alter table BONOS_PAGO
add constraint PK_BONOS_PAGO
primary key (BOPA_ID);

CREATE SEQUENCE ID_BONOPAGO;

SET TERM ^ ;

CREATE OR ALTER TRIGGER FACTURAS_DETALLE_AI FOR FACTURAS_DETALLE
ACTIVE AFTER INSERT POSITION 0
AS
declare variable fec date;
declare variable NOMCLI VARCHAR(60);
declare variable CONC VARCHAR(60);
declare variable Pref varchar(4);
declare variable Num varchar(6);
declare variable Nit varchar(20);
declare variable TIPO INTEGER;
declare variable INVFAC CHAR(2);
declare variable PEDAUTO CHAR(2);
declare variable CANTREL NUMERIC(18,4);
declare variable CONSO CHAR(2);
declare variable CONSOLIDA INTEGER;
declare variable ESPOS CHAR(1);
declare variable BONOS CHAR(2);
declare variable VRBONO NUMERIC(18,2);
declare variable I INTEGER;
BEGIN
select fact_fecha, pref_pre, fact_numero, terc_nit, fact_nomcliente, fact_consolida
    from facturas where fact_id = new.fact_id
    into :fec, :Pref, :Num, :Nit, :Nomcli, :Consolida;
if ((NEW.fact_id <> 0) and (new.fade_anulado = 'N')) then
    BEGIN
    EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION','FACTURAS','GENERAR PEDIDO AUTOMATICAMENTE CON LA FACTURA') RETURNING_VALUES (PEDAUTO);
    SELECT MAX(CEFA_TIPOORI) FROM consolide_faltantes WHERE CEFA_ID = :CONSOLIDA INTO :TIPO;
    if (Tipo IS NULL) then
        Tipo = 0;
    execute procedure lee_configuracion('FACTURACION', 'FACTURAS', 'AFECTAR INVENTARIO CON LA FACTURA') returning_values (:INVFAC);
    SELECT MIN(AUTO_ESPOS) FROM AUTORIZACIONES WHERE PREF_PRE = :pref INTO :ESPOS;
    if (ESPOS = 'S') then
        BEGIN
        INVFAC = 'SI';
        PEDAUTO = 'NO';
        END
    /* si se hizo con base en una remisi¢n no afecte inventario */
    if ((Tipo <> 32) and (INVFAC = 'SI')) then
        begin
        if (STRLEN(NOMCLI) > 42) then
            CONC = 'FV No.' || :pref || :num || '-' || SUBSTR(NOMCLI, 1, 42);
        ELSE
            CONC = 'FV No.' || :pref || :NUM || '-' || NOMCLI;
        INSERT INTO MOVIMIENTO_ARTICULO
            (ARTI_COD, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM, TERC_NIT)
            VALUES(NEW.ARTI_COD, NEW.BODE_COD, :FEC, 31, NEW.fact_id,
            :CONC, new.fade_factor * new.fade_cant, 0, 'N', new.fade_lote, :Pref, :Num, new.fade_item, :Nit);
        end
    if (PEDAUTO = 'SI') then
        BEGIN
        INSERT INTO PEDIDOS_DETALLE (PEDI_ID, PEDE_ITEM, ARTI_COD, PEDE_CANT, PEDE_UNIDAD, PEDE_DTOPORC, PEDE_DTOMONTO, PEDE_IVAPORC, PEDE_IVAMONTO, PEDE_CONSUMO, PEDE_FACTOR, PEDE_DESC, PEDE_OBS, PEDE_CODBAR, PEDE_TOTAL, PEDE_ANULADO, PEDE_TRANSMIT, LIPR_COD, PEDE_REFERENCIA, PEDE_PRUNIT, PEDE_FACTURAD, PEDE_REMISIONAD, PEDE_RESERVA, BODE_COD)
            VALUES (GEN_ID(id_pedido,0), NEW.FADE_ITEM, NEW.ARTI_COD, NEW.FADE_CANT, NEW.FADE_UNIDAD, NEW.FADE_DTOPORC, NEW.FADE_DTOMONTO, NEW.FADE_IVAPORC, NEW.FADE_IVAMONTO, NEW.FADE_CONSUMO, NEW.FADE_FACTOR, NEW.FADE_DESC, NEW.FADE_OBS, NEW.FADE_CODBAR, NEW.FADE_TOTAL, 'N', 'N', NEW.LIPR_COD, NEW.FADE_REFERENCIA, NEW.FADE_PRUNIT, NEW.FADE_CANT * NEW.FADE_FACTOR, 0, NEW.FADE_CANT * NEW.FADE_FACTOR, NEW.bode_cod);
        END
    ELSE
        BEGIN
        if (CONSOLIDA <> 0) then
            BEGIN
            EXECUTE procedure LEE_CONFIGURACION ('FACTURACION','DOCUMENTOS','DEJAR PENDIENTES LOS ARTICULOS NO INCLUIDOS AL TRAER DOCUMENTOS RELACIONADOS') returning_values (CONSO);
            if (CONSO = 'NO') then
                UPDATE consolidado_faltantes SET COFA_IDDES = NEW.fact_id, COFA_OK = 'S' WHERE COFA_ID = :consolida;
            ELSE
                BEGIN
                UPDATE consolidado_faltantes SET COFA_IDDES = NEW.fact_id, COFA_OK = 'S' WHERE COFA_ID = :consolida AND COFA_ITEM = NEW.FADE_ITEM AND ARTI_COD = NEW.arti_cod;
                /* BUSQUE EL CONSOLIDADO EN EL MISMO ITEM Y SI ES DIFERENTE ACTUALICELO */
                select COFA_CANT * COFA_FACTOR FROM consolidado_faltantes WHERE COFA_ID = :consolida AND COFA_ITEM = NEW.FADE_ITEM AND ARTI_COD = NEW.arti_cod INTO :CANTREL;
                if (NEW.FADE_CANT * NEW.FADE_FACTOR < CANTREL) then
                    UPDATE consolidado_faltantes SET COFA_IDDES = NEW.fact_id, COFA_CANT = NEW.FADE_CANT, COFA_FACTOR = NEW.FADE_FACTOR
                        WHERE COFA_ID = :consolida AND COFA_ITEM = NEW.FADE_ITEM AND ARTI_COD = NEW.arti_cod;
                END
            END
        END
    EXECUTE procedure LEE_CONFIGURACION ('FACTURACION', 'ARTICULOS', 'PERMITIR GENERAR BONOS DE PAGO AL FACTURAR ARTICULOS SELECCIONADOS') returning_values (BONOS);
    if (BONOS = 'SI') then
        BEGIN
        SELECT ARTI_VALORBONO FROM ARTICULO WHERE ARTI_COD = NEW.arti_cod INTO :VRBONO;
        if (VRBONO <> 0) then
            BEGIN
            I = 1;
            WHILE (I <= (NEW.fade_cant * NEW.fade_factor)) DO
                BEGIN
                INSERT INTO BONOS_PAGO (BOPA_ID, BOPA_FACTURA, BOPA_PREF, BOPA_NUMERO, BOPA_FECHA, BOPA_ITEM, BOPA_MONTO, BOPA_IDRDC)
                    VALUES (GEN_ID(ID_BONOPAGO, 1), NEW.fact_id, :pref, :num, :fec, :I, :VRBONO, 0);
                I = I + 1;
                END
            END
        END
    END
END
^

SET TERM ; ^

CREATE EXCEPTION BONO_USADO 'El bono de pago ya fue usado en caja';

SET TERM ^ ;

create trigger BONOS_PAGO_BD for BONOS_PAGO
active BEFORE DELETE position 0
as
declare variable numero varchar(10);
begin
if (old.bopa_idrdc <> 0) then
    begin
    select pref_pre || reca_numero from recibos_caja where reca_id = old.bopa_idrdc into :numero;
    exception bono_usado 'El bono de pago ya fue usado en el recibo ' || :numero;
    end
end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER FACTURAS_DETALLE_AU FOR FACTURAS_DETALLE
ACTIVE AFTER UPDATE POSITION 0
as
declare variable fec date;
declare variable CONC VARCHAR(60);
declare variable NOMCLI varchar(60);
declare variable Pref varchar(4);
declare variable Num varchar(6);
declare variable Nit varchar(20);
declare variable factor numeric(18,4);
declare variable INVFAC CHAR(2);
declare variable TIPO INTEGER;
declare variable PEDAUTO CHAR(2);
declare variable CANTREL NUMERIC(18,4);
declare variable CONSO CHAR(2);
declare variable CONSOLIDA INTEGER;
declare variable consec INTEGER;
declare variable ESPOS CHAR(1);
declare variable BONOS CHAR(2);
declare variable VRBONO NUMERIC(18,2);
declare variable I INTEGER;
BEGIN
EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION','FACTURAS','GENERAR PEDIDO AUTOMATICAMENTE CON LA FACTURA') RETURNING_VALUES (PEDAUTO);
if ((OLD.fact_id <> 0) AND (OLD.fade_anulado = 'N')) then
    BEGIN
    if ((OLD.FADE_CANT * OLD.FADE_FACTOR <> NEW.fade_cant * NEW.fade_factor) or (OLD.fade_total <> NEW.fade_total) or (OLD.arti_cod <> NEW.arti_cod) or (NEW.fade_anulado = 'S')) then
        begin
        DELETE FROM MOVIMIENTO_ARTICULO WHERE (mvar_tipodoc = 31) and (mvar_idref = OLD.fact_id) and (mvar_item = old.fade_item);

        if (PEDAUTO = 'SI') then
            BEGIN
            SELECT pref_pre, fact_numero from facturas where fact_id = OLD.fact_id
                into :Pref, :Num;
            SELECT PEDI_ID FROM PEDIDOS WHERE PREF_PRE = :pref AND PEDI_NUMERO = :num into :consec;
            if (consec is not null) then
              DELETE FROM PEDIDOS_DETALLE WHERE PEDE_ITEM = OLD.FADE_ITEM AND PEDI_ID = :consec;
            END
        ELSE
            BEGIN
            /* DESHAGA LOS PENDIENTES */
            SELECT fact_consolida from facturas where fact_id = OLD.fact_id into :Consolida;
            if (CONSOLIDA <> 0) then
                BEGIN
                UPDATE consolidado_faltantes SET COFA_OK = 'N' WHERE COFA_ID = :consolida AND COFA_ITEM = OLD.FADE_ITEM AND ARTI_COD = OLD.arti_cod;
                EXECUTE procedure LEE_CONFIGURACION ('FACTURACION','DOCUMENTOS','DEJAR PENDIENTES LOS ARTICULOS NO INCLUIDOS AL TRAER DOCUMENTOS RELACIONADOS') returning_values (CONSO);
                if (CONSO = 'NO') then
                    UPDATE consolidado_faltantes SET COFA_OK = 'N' WHERE COFA_ID = :consolida;
                END
            END
        delete from bonos_pago where bopa_factura = old.fact_id;
        end
    END
if ((NEW.fact_id <> 0) and (new.fade_anulado = 'N')) then
    if ((OLD.fact_id = 0) OR (OLD.FADE_CANT * OLD.FADE_FACTOR <> NEW.fade_cant * NEW.fade_factor) or (OLD.fade_total <> NEW.fade_total) or (OLD.arti_cod <> NEW.arti_cod) or (OLD.fade_anulado = 'S')) then
      BEGIN
      select fact_fecha, pref_pre, fact_numero, terc_nit, fact_nomcliente, fact_consolida
            from facturas where fact_id = new.fact_id
            into :fec, :Pref, :Num, :Nit, :Nomcli, :Consolida;
      SELECT MAX(CEFA_TIPOORI) FROM consolide_faltantes WHERE CEFA_ID = :CONSOLIDA INTO :TIPO;
      if (Tipo IS NULL) then
        Tipo = 0;
      execute procedure lee_configuracion('FACTURACION', 'FACTURAS', 'AFECTAR INVENTARIO CON LA FACTURA') returning_values (:INVFAC);
      SELECT MIN(AUTO_ESPOS) FROM AUTORIZACIONES WHERE PREF_PRE = :pref INTO :ESPOS;
      if (ESPOS = 'S') then
        BEGIN
        INVFAC = 'SI';
        PEDAUTO = 'NO';
        END
       /* si se hizo con base en una remisi¢n no afecte inventario */
      if ((Tipo <> 32) and (INVFAC = 'SI')) then
        begin
        if (STRLEN(NOMCLI) > 29) then
            CONC = 'FACTURA DE VENTA No.' || PREF || NUM || '-' || SUBSTR(NOMCLI,1,29);
        ELSE
            CONC = 'FACTURA DE VENTA No.' || PREF || NUM || '-' || NOMCLI;
        DELETE FROM MOVIMIENTO_ARTICULO WHERE (mvar_tipodoc = 31) and (mvar_idref = OLD.fact_id) and (mvar_item = old.fade_item);
        execute procedure factor_unidad_cant(new.arti_cod, new.fade_unidad) returning_values(factor);
        INSERT INTO MOVIMIENTO_ARTICULO
            (ARTI_COD, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM, TERC_NIT)
            VALUES(NEW.ARTI_COD, NEW.BODE_COD, :FEC, 31, NEW.fact_id,
            :CONC, :factor * new.fade_cant, 0, 'N', new.fade_lote, :Pref, :Num, new.fade_item, :Nit);
        end
      if (PEDAUTO = 'SI') then
        BEGIN
        INSERT INTO PEDIDOS_DETALLE (PEDI_ID, PEDE_ITEM, ARTI_COD, PEDE_CANT, PEDE_UNIDAD, PEDE_DTOPORC, PEDE_DTOMONTO, PEDE_IVAPORC, PEDE_IVAMONTO, PEDE_CONSUMO, PEDE_FACTOR, PEDE_DESC, PEDE_OBS, PEDE_CODBAR, PEDE_TOTAL, PEDE_ANULADO, PEDE_TRANSMIT, LIPR_COD, PEDE_REFERENCIA, PEDE_PRUNIT, PEDE_FACTURAD, PEDE_REMISIONAD, PEDE_RESERVA, BODE_COD)
            VALUES (0, NEW.FADE_ITEM, NEW.ARTI_COD, NEW.FADE_CANT, NEW.FADE_UNIDAD, NEW.FADE_DTOPORC, NEW.FADE_DTOMONTO, NEW.FADE_IVAPORC, NEW.FADE_IVAMONTO, NEW.FADE_CONSUMO, NEW.FADE_FACTOR, NEW.FADE_DESC, NEW.FADE_OBS, NEW.FADE_CODBAR, NEW.FADE_TOTAL, 'N', 'N', NEW.LIPR_COD, NEW.FADE_REFERENCIA, NEW.FADE_PRUNIT, NEW.FADE_CANT * NEW.FADE_FACTOR, 0, NEW.FADE_CANT * NEW.FADE_FACTOR, NEW.bode_cod);
        END
      ELSE
        BEGIN
        if (CONSOLIDA <> 0) then
            BEGIN
            UPDATE consolidado_faltantes SET COFA_OK = 'S' WHERE COFA_ID = :consolida AND COFA_ITEM = NEW.FADE_ITEM AND ARTI_COD = NEW.arti_cod;
            EXECUTE procedure LEE_CONFIGURACION ('FACTURACION','DOCUMENTOS','DEJAR PENDIENTES LOS ARTICULOS NO INCLUIDOS AL TRAER DOCUMENTOS RELACIONADOS') returning_values (CONSO);
            if (CONSO = 'NO') then
                UPDATE consolidado_faltantes SET COFA_OK = 'S' WHERE COFA_ID = :consolida;
            ELSE
                BEGIN
                /* BUSQUE EL CONSOLIDADO EN EL MISMO ITEM Y SI ES DIFERENTE ACTUALICELO */
                select COFA_CANT * COFA_FACTOR FROM consolidado_faltantes WHERE COFA_ID = :consolida AND COFA_ITEM = NEW.FADE_ITEM AND ARTI_COD = NEW.arti_cod INTO :CANTREL;
                if (NEW.FADE_CANT * NEW.FADE_FACTOR < CANTREL) then
                    UPDATE consolidado_faltantes SET COFA_CANT = NEW.FADE_CANT, COFA_FACTOR = NEW.FADE_FACTOR
                        WHERE COFA_ID = :consolida AND COFA_ITEM = NEW.FADE_ITEM AND ARTI_COD = NEW.arti_cod;
                END
            END
        END
      EXECUTE procedure LEE_CONFIGURACION ('FACTURACION', 'ARTICULOS', 'PERMITIR GENERAR BONOS DE PAGO AL FACTURAR ARTICULOS SELECCIONADOS') returning_values (BONOS);
      if (BONOS = 'SI') then
        BEGIN
        SELECT ARTI_VALORBONO FROM ARTICULO WHERE ARTI_COD = NEW.arti_cod INTO :VRBONO;
        if (VRBONO <> 0) then
            BEGIN
            I = 1;
            WHILE (I <= (NEW.fade_cant * NEW.fade_factor)) DO
                BEGIN
                INSERT INTO BONOS_PAGO (BOPA_ID, BOPA_FACTURA, BOPA_PREF, BOPA_NUMERO, BOPA_FECHA, BOPA_ITEM, BOPA_MONTO, BOPA_IDRDC)
                    VALUES (GEN_ID(ID_BONOPAGO, 1), NEW.fact_id, :pref, :num, :fec, :I, :VRBONO, 0);
                I = I + 1;
                END
            END
        END
      END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER FACTURAS_DETALLE_AD FOR FACTURAS_DETALLE
ACTIVE AFTER DELETE POSITION 0
AS
declare variable PEDAUTO CHAR(2);
declare variable Pref varchar(4);
declare variable Num varchar(6);
declare variable CONSO CHAR(2);
declare variable CONSOLIDA INTEGER;
declare variable consec INTEGER;
BEGIN
if ((OLD.fact_id <> 0) AND (OLD.fade_anulado = 'N')) then
    BEGIN
    DELETE FROM MOVIMIENTO_ARTICULO WHERE (mvar_tipodoc = 31) and (mvar_idref = OLD.fact_id) and (mvar_item = old.fade_item);

    EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION','FACTURAS','GENERAR PEDIDO AUTOMATICAMENTE CON LA FACTURA') RETURNING_VALUES (PEDAUTO);
    if (PEDAUTO = 'SI') then
        BEGIN
        SELECT pref_pre, fact_numero from facturas where fact_id = OLD.fact_id
            into :Pref, :Num;
        SELECT PEDI_ID FROM PEDIDOS WHERE PREF_PRE = :pref AND PEDI_NUMERO = :num into :consec;
        if (consec is not null) then
          DELETE FROM PEDIDOS_DETALLE WHERE PEDE_ITEM = OLD.FADE_ITEM AND PEDI_ID = :consec;
        END
    ELSE
        BEGIN
        /* DESHAGA LOS PENDIENTES */
        SELECT fact_consolida from facturas where fact_id = OLD.fact_id into :Consolida;
        if (CONSOLIDA <> 0) then
            BEGIN
            UPDATE consolidado_faltantes SET COFA_OK = 'N' WHERE COFA_ID = :consolida AND COFA_ITEM = OLD.FADE_ITEM AND ARTI_COD = OLD.arti_cod;
            EXECUTE procedure LEE_CONFIGURACION ('FACTURACION','DOCUMENTOS','DEJAR PENDIENTES LOS ARTICULOS NO INCLUIDOS AL TRAER DOCUMENTOS RELACIONADOS') returning_values (CONSO);
            if (CONSO = 'NO') then
                UPDATE consolidado_faltantes SET COFA_OK = 'N' WHERE COFA_ID = :consolida;
            END
        END
    delete from bonos_pago where bopa_factura = old.fact_id;
    END
END
^

SET TERM ; ^

CREATE EXCEPTION NO_HAY_BONO_DE_PAGO 'No se encontró un bono de pago de ese valor disponible';

SET TERM ^ ;

CREATE OR ALTER TRIGGER RECIBOS_CAJA_PAGO_AI FOR RECIBOS_CAJA_PAGO
ACTIVE AFTER INSERT POSITION 0
AS
declare variable Fec DATE;
declare variable Caja integer;
declare variable Conc VARCHAR(60);
declare variable Pref varchar(4);
declare variable Num varchar(6);
declare variable Existe char(1);
declare variable CONS CHAR(1);
declare variable CTABCO INTEGER;
declare variable PREFBCO VARCHAR(4);
declare variable TARJ VARCHAR(3);
declare variable IDCONS INTEGER;
declare variable COMIP NUMERIC(9,2);
declare variable RTFTEP NUMERIC(9,2);
declare variable RTIVAP NUMERIC(9,2);
declare variable RTICAP NUMERIC(9,2);
declare variable COMI NUMERIC(18,2);
declare variable RTFTE NUMERIC(18,2);
declare variable RTIVA NUMERIC(18,2);
declare variable RTICA NUMERIC(18,2);
declare variable FPBONO INTEGER;
BEGIN
if ((new.reca_id <> 0) and (new.rcpa_anulado = 'N')) then
  begin
  /* Actualice el total del movimiento en caja */
  select reca_fecha, caja_id, reca_conc, pref_pre, reca_numero from recibos_caja
    where reca_id = new.reca_id into :Fec, :Caja, :Conc, :Pref, :Num;
  select 'S' from movimiento_caja where moca_tiporef = 61 and moca_idref = new.reca_id into :Existe;
  if (Existe = 'S') then
    update movimiento_caja
      set moca_debitos = moca_debitos + new.rcpa_monto
      where moca_tiporef = 61 and moca_idref = new.reca_id;
  else
    INSERT INTO MOVIMIENTO_CAJA
        (MOCA_ID, CAJA_ID, MOCA_TIPOREF, MOCA_PREFREF, MOCA_NUMREF, MOCA_FECHA, MOCA_CONC, MOCA_DEBITOS, MOCA_CREDITOS, MOCA_DB, MOCA_IDREF)
        VALUES(GEN_ID(id_movcaja,1), :Caja, 61, :Pref, :Num, :Fec, :Conc, NEW.rcpa_monto, 0, 'S', new.reca_id);

  execute procedure lee_configuracion('FACTURACION', 'ARTICULOS', 'FORMA DE PAGO PARA BONOS FACTURADOS') returning_values (:FPBONO);
  if (NEW.fopa_id <> :fpbono) then
    BEGIN
    /* GRABE EL DOCUMENTO DE PAGO EN CAJA */
    if (NEW.FOPA_ID <> 1) then
      INSERT INTO DOCUMENTOS_PAGO_CAJA (DPCA_ID, FOPA_ID, CAJA_ID, DPCA_BANCO, DPCA_CUENTA, DPCA_NUMERO, DPCA_FECHA, DPCA_MONTO, DPCA_TIPOENT, DPCA_IDENT, DPCA_TIPOSAL, DPCA_IDSAL)
        VALUES (GEN_ID(ID_DOCPAGOCAJA, 1), NEW.FOPA_ID, :CAJA, NEW.RCPA_BANCO, NEW.RCPA_CUENTA, NEW.RCPA_NUMERO, NEW.RCPA_FECHA, NEW.RCPA_MONTO, 61, NEW.RECA_ID, 0, 0);
    else
      EXECUTE PROCEDURE SUME_SALDO_EFECTIVO (:CAJA, :FEC, NEW.RCPA_MONTO, 'N');

    /* SI ES DE CONSIGNACION LA FORMA GRABELA */
    SELECT FOPA_CONSIGNA, FOPA_CTABCO, FOPA_PREFBCO, FOPA_TARJETA FROM FORMAS_PAGO
        WHERE FOPA_ID = NEW.fopa_id INTO :CONS, :CTABCO, :PREFBCO, :TARJ;
    if (CONS = 'S') then
        begin
        if ((TARJ IS NULL) OR (TARJ = '')) then
            BEGIN
            if ((CTABCO <> 0) AND (PREFBCO <> '')) then
                BEGIN
                /* CONSIGNACION */
                IDCONS = GEN_ID(ID_CONSIGNA, 1);
                INSERT INTO CONSIGNA (CONS_ID, CUBA_COD, PRBA_PREF, CONS_NUMERO, CONS_FECHA, CONS_CONCEPTO, CONS_ANULADO, CONS_TRANSMIT, NUMOK)
                    VALUES (:idcons, :CTABCO, :prefbco, SUBSTR(NEW.rcpa_numero, 1, 6), :fec, :conc, 'N', 'N', 'N');
                INSERT INTO CONSIGNA_DETALLE (CONS_ID, CODE_ITEM2, FOPA_ID, CODE_BANCO, CODE_CUENTA, CODE_NUMERO, CODE_FECHA, CODE_MONTO, CODE_ANULADO, CODE_TRANSMIT, CAJA_ID, CODE_DEVUELTO)
                    VALUES (:idcons, 1, new.fopa_id, NEW.rcpa_banco, NEW.rcpa_cuenta, NEW.rcpa_numero, NEW.rcpa_fecha, NEW.rcpa_monto, 'N', 'N', :caja, 'N');

                insert into consolidado_faltantes (cofa_id, cofa_item, cofa_tipoori, cofa_tipodes, cofa_iddes, cofa_idori, cofa_itemori, cofa_ok, cofa_lista, cofa_unidad)
                    values (gen_id(id_cons, 1), 1, 61, 71, :idcons, new.reca_id, new.rcpa_item, 'N', :ctabco, :prefbco);
                END
            END
        ELSE
            BEGIN
            /* CONSIGNACION DE TARJETA */
            if ((CTABCO <> 0) AND (PREFBCO <> '')) then
                BEGIN
                select TARJ_COMIPORC, TARJ_RTFTEPORC, TARJ_RTIVAPORC, TARJ_RTICAPORC FROM TARJETAS WHERE TARJ_COD = :tarj
                    INTO :comip, :rtftep, :rtivap, :rticap;
                COMI = (NEW.rcpa_monto-NEW.rcpa_ivamonto) * :comip / 100;
                EXECUTE PROCEDURE REDONDEE (COMI,0) returning_values (COMI);
                RTFTE = (NEW.rcpa_monto-NEW.rcpa_ivamonto) * :rtftep / 100;
                EXECUTE PROCEDURE REDONDEE (RTFTE,0) returning_values (RTFTE);
                RTIVA = NEW.rcpa_ivamonto * :rtivap / 100;
                EXECUTE PROCEDURE REDONDEE (RTIVA,0) returning_values (RTIVA);
                RTICA = (NEW.rcpa_monto-NEW.rcpa_ivamonto) * :rticap / 1000;
                EXECUTE PROCEDURE REDONDEE (RTICA,0) returning_values (RTICA);
                IDCONS = GEN_ID(ID_CONSIGNATAR, 1);
                INSERT INTO CONSIGNA_TARJETAS (COTJ_ID, PREF_PRE, COTJ_NUMERO, COTJ_FECHA, COTJ_CONCEPTO, COTJ_CHEQUE, CUBA_COD,
                    COTJ_MONTO, COTJ_RTFTE, COTJ_COMISION, COTJ_RTIVA, COTJ_RTICA, COTJ_ANULADO, COTJ_TRANSMIT, NUMOK, CAJA_ID)
                    VALUES (:idcons, :prefbco, SUBSTR(NEW.rcpa_numero, 1, 6), :fec, :conc, 'N', :ctabco,
                    new.rcpa_monto-:COMI-:RTFTE-:RTIVA-:RTICA, :rtfte, :COMI, :rtiva, :rtica, 'N', 'N', 'N', :caja);
                INSERT INTO CONSIGNA_TARJETAS_DET (COTJ_ID, CTJD_ITEM, TARJ_COD, CTJD_NROTJ, CTJD_COMPROB, CTJD_BASE, CTJD_IVA, CTJD_COMIPORC, CTJD_COMIIVA, CTJD_COMIMONTO,
                    CTJD_RTFTEPORC, CTJD_RTFTEMONTO, CTJD_RTIVAPOC, CTJD_RTIVAMONTO, CTJD_ANULADO, CTJD_TRANSMIT, FOPA_ID, CTJD_RTICAPORC, CTJD_RTCAMONTO)
                    VALUES (:idcons, 1, NEW.rcpa_banco, NEW.rcpa_cuenta, NEW.rcpa_numero, new.rcpa_monto, NEW.rcpa_ivamonto, :COMIP, 'N', :comi,
                    :rtftep, :rtfte, :rtivap, :rtiva, 'N', 'N', new.fopa_id, :rticap, :rtica);
                    
                insert into consolidado_faltantes (cofa_id, cofa_item, cofa_tipoori, cofa_tipodes, cofa_iddes, cofa_idori, cofa_itemori, cofa_ok, cofa_lista, cofa_unidad)
                    values (gen_id(id_cons, 1), 1, 61, 64, :idcons, new.reca_id, new.rcpa_item, 'N', :ctabco, :prefbco);
                END
            END
        end
    END
  end
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER RECIBOS_CAJA_PAGO_AD FOR RECIBOS_CAJA_PAGO
ACTIVE AFTER DELETE POSITION 0
AS
declare variable Existe CHAR(1);
declare variable CAJA INTEGER;
declare variable FEC DATE;
declare variable TIPOCON INTEGER;
declare variable IDCONS INTEGER;
declare variable FPBONO INTEGER;
BEGIN
if ((OLD.reca_id <> 0) AND (OLD.rcpa_anulado = 'N')) then
    BEGIN
    execute procedure lee_configuracion('FACTURACION', 'ARTICULOS', 'FORMA DE PAGO PARA BONOS FACTURADOS') returning_values (:FPBONO);
    if (old.fopa_id <> :fpbono) then
        begin
        /* anule la consignación */
        existe = 'N';
        select 'S', cofa_tipodes, cofa_iddes from consolidado_faltantes
            where cofa_tipoori = 61 and cofa_idori = old.reca_id and cofa_itemori = old.rcpa_item
            into :existe, :tipocon, :idcons;
        if (existe = 'S') then
            begin
            if (:tipocon = 71) then
                BEGIN
                DELETE FROM CONSIGNA_DETALLE WHERE CONS_ID = :idcons;
                DELETE FROM CONSIGNA WHERE CONS_ID = :idcons;
                END
            if (:tipocon = 64) then
                BEGIN
                DELETE FROM consigna_tarjetas_det WHERE COTJ_ID = :idcons;
                DELETE FROM consigna_tarjetas WHERE COTJ_ID = :idcons;
                END
            end

        select 'S' from movimiento_caja where moca_tiporef = 61 and moca_idref = old.reca_id into :Existe;
        if (Existe = 'S') then
            update movimiento_caja
                set moca_debitos = moca_debitos - old.rcpa_monto
                where moca_tiporef = 61 and moca_idref = old.reca_id;
        /* BORRE EL DOCUMENTO EN CAJA */
        SELECT CAJA_ID, RECA_FECHA FROM RECIBOS_CAJA WHERE RECA_ID = OLD.RECA_ID INTO :CAJA, :FEC;
        if (OLD.FOPA_ID <> 1) then
            DELETE FROM DOCUMENTOS_PAGO_CAJA WHERE DPCA_TIPOENT = 61 AND DPCA_IDENT = OLD.RECA_ID AND
                DPCA_BANCO = OLD.RCPA_BANCO AND DPCA_CUENTA = OLD.RCPA_CUENTA AND DPCA_NUMERO = OLD.RCPA_NUMERO AND DPCA_MONTO = OLD.rcpa_monto;
        ELSE
            EXECUTE PROCEDURE SUME_SALDO_EFECTIVO (:CAJA, :FEC, OLD.RCPA_MONTO, 'S');
        end
    else
        update bonos_pago set bopa_idrdc = 0 where bopa_idrdc = old.reca_id;
    END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER RECIBOS_CAJA_PAGO_AU FOR RECIBOS_CAJA_PAGO
ACTIVE AFTER UPDATE POSITION 0
as
declare variable Fec date;
declare variable Caja integer;
declare variable Conc VARCHAR(60);
declare variable Pref varchar(4);
declare variable Num varchar(6);
declare variable Existe char(1);
declare variable TIPOCON INTEGER;
declare variable CONS CHAR(1);
declare variable CTABCO INTEGER;
declare variable PREFBCO VARCHAR(4);
declare variable TARJ VARCHAR(3);
declare variable IDCONS INTEGER;
declare variable COMIP NUMERIC(9,2);
declare variable RTFTEP NUMERIC(9,2);
declare variable RTIVAP NUMERIC(9,2);
declare variable RTICAP NUMERIC(9,2);
declare variable COMI NUMERIC(18,2);
declare variable RTFTE NUMERIC(18,2);
declare variable RTIVA NUMERIC(18,2);
declare variable RTICA NUMERIC(18,2);
declare variable FPBONO INTEGER;
declare variable DIASBONO INTEGER;
declare variable IDBONO INTEGER;
BEGIN
select reca_fecha, caja_id, reca_conc, pref_pre, reca_numero
    from recibos_caja where reca_id = new.reca_id
    into :Fec, :Caja, :Conc, :Pref, :Num;
execute procedure lee_configuracion('FACTURACION', 'ARTICULOS', 'FORMA DE PAGO PARA BONOS FACTURADOS') returning_values (:FPBONO);
if ((OLD.reca_id <> 0) AND (OLD.rcpa_anulado = 'N')) then
    begin
    if (old.fopa_id <> :fpbono) then
        begin
        /* anule la consignación */
        existe = 'N';
        select 'S', cofa_tipodes, cofa_iddes from consolidado_faltantes
            where cofa_tipoori = 61 and cofa_idori = old.reca_id and cofa_itemori = old.rcpa_item
            into :existe, :tipocon, :idcons;
        if (existe = 'S') then
            begin
            if (:tipocon = 71) then
                BEGIN
                DELETE FROM CONSIGNA_DETALLE WHERE CONS_ID = :idcons;
                DELETE FROM CONSIGNA WHERE CONS_ID = :idcons;
                END
            if (:tipocon = 64) then
                BEGIN
                DELETE FROM consigna_tarjetas_det WHERE COTJ_ID = :idcons;
                DELETE FROM consigna_tarjetas WHERE COTJ_ID = :idcons;
                END
            end
        /* Actualice el total del movimiento caja */
        select 'S' from movimiento_caja where moca_tiporef = 61 and moca_idref = new.reca_id into :Existe;
        if (Existe = 'S') then
            update movimiento_caja
                set moca_debitos = moca_debitos - new.rcpa_monto
                where moca_tiporef = 61 and moca_idref = new.reca_id;
        /* BORRE EL DOCUMENTO EN CAJA */
        if (OLD.FOPA_ID <> 1) then
            DELETE FROM DOCUMENTOS_PAGO_CAJA WHERE DPCA_TIPOENT = 61 AND DPCA_IDENT = OLD.RECA_ID AND
                DPCA_BANCO = OLD.RCPA_BANCO AND DPCA_CUENTA = OLD.RCPA_CUENTA AND DPCA_NUMERO = OLD.RCPA_NUMERO AND DPCA_MONTO = OLD.rcpa_monto;
        ELSE
            EXECUTE PROCEDURE SUME_SALDO_EFECTIVO (:CAJA, :FEC, OLD.RCPA_MONTO, 'S');
        end
    else
        update bonos_pago set bopa_idrdc = 0 where bopa_idrdc = old.reca_id;
    end

if ((new.reca_id <> 0) AND (new.rcpa_anulado = 'N')) then
    begin
    existe = 'N';
    select 'S' from movimiento_caja where moca_tiporef = 61 and moca_idref = new.reca_id into :Existe;
    if (Existe = 'S') then
        update movimiento_caja
            set moca_debitos = moca_debitos + new.rcpa_monto
            where moca_tiporef = 61 and moca_idref = new.reca_id;
    else
        INSERT INTO MOVIMIENTO_CAJA
            (MOCA_ID, CAJA_ID, MOCA_TIPOREF, MOCA_PREFREF, MOCA_NUMREF, MOCA_FECHA, MOCA_CONC, MOCA_DEBITOS, MOCA_CREDITOS, MOCA_DB, MOCA_IDREF)
            VALUES(GEN_ID(id_movcaja,1), :Caja, 61, :Pref, :Num, :Fec, :Conc, NEW.rcpa_monto, 0, 'S', new.reca_id);
                
    if (NEW.fopa_id <> :fpbono) then
        BEGIN
        /* GRABE EL DOCUMENTO DE PAGO EN CAJA */
        if (NEW.FOPA_ID <> 1) then
            INSERT INTO DOCUMENTOS_PAGO_CAJA (DPCA_ID, FOPA_ID, CAJA_ID, DPCA_BANCO, DPCA_CUENTA, DPCA_NUMERO, DPCA_FECHA, DPCA_MONTO, DPCA_TIPOENT, DPCA_IDENT, DPCA_TIPOSAL, DPCA_IDSAL)
                VALUES (GEN_ID(ID_DOCPAGOCAJA, 1), NEW.FOPA_ID, :CAJA, NEW.RCPA_BANCO, NEW.RCPA_CUENTA, NEW.RCPA_NUMERO, NEW.RCPA_FECHA, NEW.RCPA_MONTO, 61, NEW.RECA_ID, 0, 0);
        ELSE
            EXECUTE PROCEDURE SUME_SALDO_EFECTIVO (:CAJA, :FEC, NEW.RCPA_MONTO, 'N');

        /* SI ES DE CONSIGNACION LA FORMA GRABELA */
        SELECT FOPA_CONSIGNA, FOPA_CTABCO, FOPA_PREFBCO, FOPA_TARJETA FROM FORMAS_PAGO
            WHERE FOPA_ID = NEW.fopa_id INTO :CONS, :CTABCO, :PREFBCO, :TARJ;
        if (CONS = 'S') then
            begin
            if ((TARJ IS NULL) OR (TARJ = '')) then
                BEGIN
                if ((CTABCO <> 0) AND (PREFBCO <> '')) then
                    BEGIN
                    /* CONSIGNACION */
                    IDCONS = GEN_ID(ID_CONSIGNA, 1);
                    INSERT INTO CONSIGNA (CONS_ID, CUBA_COD, PRBA_PREF, CONS_NUMERO, CONS_FECHA, CONS_CONCEPTO, CONS_ANULADO, CONS_TRANSMIT, NUMOK)
                        VALUES (:idcons, :ctabco, :prefbco, SUBSTR(NEW.rcpa_numero, 1, 6), :fec, :conc, 'N', 'N', 'N');
                    INSERT INTO CONSIGNA_DETALLE (CONS_ID, CODE_ITEM2, FOPA_ID, CODE_BANCO, CODE_CUENTA, CODE_NUMERO, CODE_FECHA, CODE_MONTO, CODE_ANULADO, CODE_TRANSMIT, CAJA_ID, CODE_DEVUELTO)
                        VALUES (:idcons, 1, new.fopa_id, NEW.rcpa_banco, NEW.rcpa_cuenta, NEW.rcpa_numero, NEW.rcpa_fecha, NEW.rcpa_monto, 'N', 'N', :caja, 'N');
                
                    insert into consolidado_faltantes (cofa_id, cofa_item, cofa_tipoori, cofa_tipodes, cofa_iddes, cofa_idori, cofa_itemori, cofa_ok, cofa_lista, cofa_unidad)
                        values (gen_id(id_cons, 1), 1, 61, 71, :idcons, new.reca_id, new.rcpa_item, 'N', :ctabco, :prefbco);
                    END
                END
            else
                BEGIN
                /* CONSIGNACION DE TARJETA */
                if ((ctabco <> 0) AND (PREFBCO <> '')) then
                    BEGIN
                select TARJ_COMIPORC, TARJ_RTFTEPORC, TARJ_RTIVAPORC, TARJ_RTICAPORC FROM TARJETAS WHERE TARJ_COD = :tarj
                    INTO :comip, :rtftep, :rtivap, :rticap;
                    COMI = (NEW.rcpa_monto-NEW.rcpa_ivamonto) * :comip / 100;
                    EXECUTE PROCEDURE REDONDEE (COMI,0) returning_values (COMI);
                    RTFTE = (NEW.rcpa_monto-NEW.rcpa_ivamonto) * :rtftep / 100;
                    EXECUTE PROCEDURE REDONDEE (RTFTE,0) returning_values (RTFTE);
                    RTIVA = NEW.rcpa_ivamonto * :rtivap / 100;
                    EXECUTE PROCEDURE REDONDEE (RTIVA,0) returning_values (RTIVA);
                    RTICA = (NEW.rcpa_monto-NEW.rcpa_ivamonto) * :rticap / 1000;
                    EXECUTE PROCEDURE REDONDEE (RTICA,0) returning_values (RTICA);
                    IDCONS = GEN_ID(ID_CONSIGNATAR, 1);
                    INSERT INTO CONSIGNA_TARJETAS (COTJ_ID, PREF_PRE, COTJ_NUMERO, COTJ_FECHA, COTJ_CONCEPTO, COTJ_CHEQUE, CUBA_COD,
                        COTJ_MONTO, COTJ_RTFTE, COTJ_COMISION, COTJ_RTIVA, COTJ_RTICA, COTJ_ANULADO, COTJ_TRANSMIT, NUMOK, CAJA_ID)
                        VALUES (:idcons, :prefbco, SUBSTR(NEW.rcpa_numero, 1, 6), :fec, :conc, 'N', :ctabco,
                        new.rcpa_monto-:COMI-:RTFTE-:RTIVA-:RTICA, :rtfte,  :COMI, :rtiva, :rtica, 'N', 'N', 'N', :caja);
                    INSERT INTO CONSIGNA_TARJETAS_DET (COTJ_ID, CTJD_ITEM, TARJ_COD, CTJD_NROTJ, CTJD_COMPROB, CTJD_BASE, CTJD_IVA, CTJD_COMIPORC, CTJD_COMIIVA, CTJD_COMIMONTO,
                        CTJD_RTFTEPORC, CTJD_RTFTEMONTO, CTJD_RTIVAPOC, CTJD_RTIVAMONTO, CTJD_ANULADO, CTJD_TRANSMIT, FOPA_ID, CTJD_RTICAPORC, CTJD_RTCAMONTO)
                        VALUES (:idcons, 1, NEW.rcpa_banco, NEW.rcpa_cuenta, NEW.rcpa_numero, new.rcpa_monto, NEW.rcpa_ivamonto, :COMIP, 'N', :comi,
                        :rtftep, :rtfte, :rtivap, :rtiva, 'N', 'N', new.fopa_id, :rticap, :rtica);
                    insert into consolidado_faltantes (cofa_id, cofa_item, cofa_tipoori, cofa_tipodes, cofa_iddes, cofa_idori, cofa_itemori, cofa_ok, cofa_lista, cofa_unidad)
                        values (gen_id(id_cons, 1), 1, 61, 64, :idcons, new.reca_id, new.rcpa_item, 'N', :ctabco, :prefbco);
                    END
                END
            end /* consignacion */
        END
    ELSE
        BEGIN
        /* BONOS DE PAGO */
        IDBONO = 0;
        execute procedure lee_configuracion('FACTURACION', 'ARTICULOS', 'VALIDEZ DE LOS BONOS DE PAGO') returning_values (:DIASBONO);
        SELECT FIRST 1 BOPA_ID FROM bonos_pago WHERE BOPA_MONTO = NEW.rcpa_monto AND (:FEC-BOPA_FECHA) < :diasbono
            AND BOPA_IDRDC = 0 INTO :IDBONO;
        if (IDBONO <> 0) Then
            update bonos_pago set bopa_idrdc = new.reca_id where bopa_id = :idbono;
        else
            exception no_hay_bono_de_pago 'No se encontró un bono disponible por valor de ' || new.rcpa_monto;
        END
    end
END
^

SET TERM ; ^

SET TERM ^ ;

create procedure BONOS_DISPONIBLES (HOY DATE)
returns (
    FORMA INTEGER,
    NUMERO VARCHAR(10),
    ITEM INTEGER,
    FECHA DATE,
    MONTO NUMERIC(18,2))
as
declare variable DIAS INTEGER;
begin
EXECUTE PROCEDURE lee_configuracion ('FACTURACION', 'ARTICULOS', 'FORMA DE PAGO PARA BONOS FACTURADOS') returning_values (:FORMA);
EXECUTE PROCEDURE lee_configuracion ('FACTURACION', 'ARTICULOS', 'VALIDEZ DE LOS BONOS DE PAGO') returning_values (:DIAS);
FOR select bopa_pref || bopa_numero numero, bopa_item, bopa_fecha, bopa_monto
    from bonos_pago where bopa_idrdc = 0
    INTO :numero,  :ITEM, :FECHA, :MONTO
    DO
    BEGIN
    if ((HOY - FECHA) < DIAS) then
        suspend;
    END
end
^

SET TERM ; ^

grant select, delete, insert, update on BONOS_PAGO to PUBLIC;
grant EXECUTE on procedure BONOS_DISPONIBLES to PUBLIC;

SET TERM ^ ;

create procedure VALIDE_BONO (
    FEC DATE,
    MONTO NUMERIC(18,2))
returns (BANCO CHAR(2),
    CUENTA VARCHAR(10),
    NUMERO VARCHAR(6),
    FECHA DATE)
as
declare variable IDBONO INTEGER;
declare variable DIASBONO INTEGER;
begin
IDBONO = 0;
BANCO = '0';
execute procedure lee_configuracion('FACTURACION', 'ARTICULOS', 'VALIDEZ DE LOS BONOS DE PAGO') returning_values (:DIASBONO);
SELECT FIRST 1 BOPA_ID, BOPA_PREF || BOPA_NUMERO, BOPA_ITEM, BOPA_FECHA FROM bonos_pago
    WHERE BOPA_MONTO = :monto AND (:FEC-BOPA_FECHA) < :diasbono AND BOPA_IDRDC = 0
    INTO :IDBONO, :CUENTA, :NUMERO, :FECHA;
if (IDBONO <> 0) Then
  suspend;
end
^

SET TERM ; ^

grant EXECUTE on procedure VALIDE_BONO to PUBLIC;

SET TERM ^ ;

CREATE OR ALTER TRIGGER RECIBOS_CAJA_PAGO_BI FOR RECIBOS_CAJA_PAGO
ACTIVE BEFORE INSERT POSITION 0
as
declare variable CAJA INTEGER;
declare variable NUMROWS INTEGER;
declare variable PREGTASA CHAR(2);
declare variable TRM NUMERIC(18,2);
declare variable FPBONO INTEGER;
declare variable DIASBONO INTEGER;
declare variable IDBONO INTEGER;
declare variable FEC DATE;
begin
SELECT RECA_FECHA FROM recibos_caja WHERE RECA_ID = NEW.reca_id INTO :FEC;
/* SI TRM <> 1 CONVIERTA A PESOS LOS VALORES */
EXECUTE PROCEDURE LEE_CONFIGURACION('GENERAL', 'GENERAL', 'PREGUNTAR TASA DE CAMBIO EN DOCUMENTOS DE CARTERA') returning_values (:pregtasa);
if (PREGTASA = 'SI') then
    BEGIN
    SELECT RECA_TRM FROM recibos_caja WHERE RECA_ID = NEW.reca_id INTO :TRM;
    NEW.rcpa_monto = NEW.rcpa_monto * :trm;
    END
/* NO PERMITA UNA FORMA DE PAGO REPETIDA */
if (NEW.fopa_id <> 1) then
  BEGIN
  execute procedure lee_configuracion('FACTURACION', 'ARTICULOS', 'FORMA DE PAGO PARA BONOS FACTURADOS') returning_values (:FPBONO);
  if (NEW.fopa_id <> :fpbono) then
    BEGIN
    SELECT CAJA_ID FROM recibos_caja WHERE RECA_ID = NEW.reca_id INTO :CAJA;
    SELECT COUNT(*) FROM documentos_pago_caja WHERE caja_id = :CAJA AND fopa_id = new.fopa_id and dpca_banco = NEW.rcpa_banco AND
        dpca_cuenta = NEW.rcpa_cuenta AND dpca_numero = NEW.rcpa_numero AND dpca_tiposal = 0 and dpca_idsal = 0
        INTO :NUMROWS;
    if (numrows > 0) then
        exception documento_pago_salido 'La forma de pago ' || new.rcpa_banco || ' ' || new.rcpa_cuenta || ' ' || new.rcpa_numero || ' ya existe en la caja.';
    END
  ELSE
    BEGIN
    /* BONOS DE PAGO */
    IDBONO = 0;
    execute procedure lee_configuracion('FACTURACION', 'ARTICULOS', 'VALIDEZ DE LOS BONOS DE PAGO') returning_values (:DIASBONO);
    SELECT FIRST 1 BOPA_ID, BOPA_PREF || BOPA_NUMERO, BOPA_ITEM, BOPA_FECHA
        FROM bonos_pago WHERE BOPA_MONTO = NEW.rcpa_monto AND (:FEC-BOPA_FECHA) < :diasbono
        AND BOPA_IDRDC = 0 INTO :IDBONO, NEW.rcpa_cuenta, NEW.rcpa_numero, NEW.rcpa_fecha;
    if (IDBONO <> 0) Then
        update bonos_pago set bopa_idrdc = new.reca_id where bopa_id = :idbono;
    else
        exception no_hay_bono_de_pago 'No se encontró un bono disponible por valor de ' || new.rcpa_monto;
    END
  END
end
^

SET TERM ; ^


/* 20091022 */
/* PREGUNTAR VENDEDOR EN DOCUMENTOS DE VENTAS Y RECIBOS DIGITANDO CODIGO O DIGITANDO EL NOMBRE */
INSERT INTO CONFIGURACION (CONF_MODULO, CONF_CATEGORIA, CONF_PROPIEDAD, CONF_VALOR, CONF_POSIBLES, CONF_AYUDA) VALUES ('FACTURACION', 'DOCUMENTOS', 'PREGUNTAR VENDEDOR POR CODIGO O POR NOMBRE', 'NOMBRE', 'CODIGO,NOMBRE', NULL);
commit work;

/* 20091023 */

INSERT INTO CONFIGURACION (CONF_MODULO, CONF_CATEGORIA, CONF_PROPIEDAD, CONF_VALOR, CONF_POSIBLES, CONF_AYUDA) VALUES ('COMPRAS', 'GENERAL', 'MOSTRAR LA CONSULTA DE ARTICULOS BAJO MINIMO AL ENTRAR AL MODULO', 'NO', 'SI,NO', 'SI:Muestra automáticamente la consulta de artículos bajo mínimo al entrar al módulo de compras');
COMMIT WORK;


/* 20091023B */
/* SUBGRUPOS Y MARCAS EN RANGOS DEL ABC */
SET TERM ^ ;

CREATE OR ALTER procedure REP_ABC_INVENTARIO (
    FECHA date,
    ARTINI varchar(20),
    ARTFIN varchar(20),
    GRPINI varchar(3),
    GRPFIN varchar(3),
    AGRUPA char(1),
    ORDEN char(1),
    DIAS integer)
returns (
    CODIGO varchar(15),
    NOMBRE varchar(60),
    UNIDAD varchar(8),
    CODGRUPO varchar(2),
    NOMGRUPO varchar(30),
    CODSUBG varchar(3),
    NOMSUBG varchar(30),
    CODMARC varchar(3),
    NOMMARC varchar(30),
    COSTO numeric(18,2),
    SALIDAT numeric(18,4),
    VPROMEDIO numeric(18,4),
    PORC numeric(9,2),
    CLASE char(1))
AS
DECLARE VARIABLE CODINI VARCHAR(20);
DECLARE VARIABLE CODFIN VARCHAR(20);
DECLARE VARIABLE DESINI VARCHAR(20);
DECLARE VARIABLE DESFIN VARCHAR(20);
declare variable MARINI VARCHAR(3);
declare variable MARFIN VARCHAR(3);
declare variable SUBINI VARCHAR(3);
declare variable SUBFIN VARCHAR(3);
declare variable ACUMULADO NUMERIC(18,2);
declare variable ACUMULAC NUMERIC(18,4);
declare variable ACUMPORC NUMERIC(9,2);
declare variable FECINI DATE;
declare variable A NUMERIC(9,2);
declare variable B NUMERIC(9,2);
declare variable C NUMERIC(9,2);
declare variable MODO VARCHAR(10);
declare variable VENTAS numeric(18,4);
declare variable DEVOL numeric(18,4);
declare variable FECAUX DATE;
BEGIN
if (ORDEN = 'C') then
    BEGIN
    CODINI = ARTINI;
    CODFIN = ARTFIN;
    DESINI = '';
    DESFIN = 'zz';
    END
ELSE
    BEGIN
    DESINI = ARTINI;
    DESFIN = ARTFIN;
    CODINI = '';
    CODFIN = 'zz';
    END
if (AGRUPA = 'G') then
    BEGIN
    MARINI = '';
    MARFIN = 'zz';
    SUBINI = '';
    SUBFIN = 'zz';
    END
ELSE
    if (AGRUPA = 'M') then
        BEGIN
        MARINI = GRPINI;
        MARFIN = GRPFIN;
        GRPINI = '';
        GRPFIN = 'zz';
        SUBINI = '';
        SUBFIN = 'zz';
        END
    ELSE
        if (AGRUPA = 'S') then
            BEGIN
            SUBINI = GRPINI;
            SUBFIN = GRPFIN;
            GRPINI = '';
            GRPFIN = 'zz';
            MARINI = '';
            MARFIN = 'zz';
            END
        ELSE
            BEGIN
            MARINI = '';
            MARFIN = 'zz';
            GRPINI = '';
            GRPFIN = 'zz';
            SUBINI = '';
            SUBFIN = 'zz';
            END
DELETE FROM analisis_abcinven;
acumporc = 0;
FECINI = FECHA - DIAS;
/* CALCULE LA VENTA PROMEDIO DE CADA ARTICULO */
EXECUTE PROCEDURE LEE_CONFIGURACION ('INVENTARIO', 'EXISTENCIAS', 'PORCENTAJE MINIMO PARA ARTICULO CLASE "A"') returning_values (A);
EXECUTE PROCEDURE LEE_CONFIGURACION ('INVENTARIO', 'EXISTENCIAS', 'PORCENTAJE MINIMO PARA ARTICULO CLASE "B"') returning_values (B);
EXECUTE PROCEDURE LEE_CONFIGURACION ('INVENTARIO', 'EXISTENCIAS', 'PORCENTAJE MINIMO PARA ARTICULO CLASE "C"') returning_values (C);
EXECUTE PROCEDURE LEE_CONFIGURACION ('INVENTARIO', 'EXISTENCIAS', 'REPORTE ABC DEL INVENTARIO CON LA UTILIDAD O EL VALOR DE VENTA') returning_values (MODO);
FOR SELECT ARTI_COD, ARTI_UNIDAD FROM ARTICULO A
      WHERE ARTI_COD >= :CODINI AND ARTI_COD <= :CODFIN AND A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :GRPFIN AND ARTI_DES >= :DESINI AND ARTI_DES <= :DESFIN AND A.ESAR_COD <> 'I'
      AND (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN)))
      AND (((:SUBINI = '') AND (:SUBFIN = 'zz')) or ((A.subg_cod >= :SUBINI) AND (A.subg_cod <= :SUBFIN)))
      INTO :CODIGO, :UNIDAD
      DO
      BEGIN
      SELECT SUM(FADE_TOTAL - FADE_CONSUMO - FADE_IVAMONTO) FROM FACTURAS_DETALLE D, FACTURAS F
            WHERE F.fact_id = D.fact_id AND ARTI_COD = :codigo AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECHA AND FADE_ANULADO = 'N' INTO :ventas;
      if (ventas IS NULL) then
          ventas = 0;
      SELECT SUM(DVDE_TOTAL - DVDE_CONSUMO - DVDE_IVAMONTO) FROM devoluciones_ventas_detalle D, devoluciones_ventas F
            WHERE F.devt_id = D.devt_id AND ARTI_COD = :codigo AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECHA AND DVDE_ANULADO = 'N' INTO :devol;
      if (devol IS NULL) then
          devol = 0;
      VENTAS = VENTAS - DEVOL;
      if (VENTAS > 0) then
        BEGIN
        acumulado = 0;
        acumulac = 0;
        if (MODO = 'UTILIDAD') then
            BEGIN
            FOR SELECT FACT_FECHA, FADE_CANT * FADE_FACTOR FROM FACTURAS_DETALLE D, FACTURAS F
                WHERE F.fact_id = D.fact_id AND ARTI_COD = :codigo AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECHA AND FADE_ANULADO = 'N'
                INTO :FECAUX, :salidat
                DO
                BEGIN
                EXECUTE PROCEDURE COSTO_PROMEDIO(:codigo, :fecaux) returning_values (:costo);
                acumulado = acumulado + costo * salidat;
                acumulac = acumulac + salidat;
                END
            FOR SELECT DEVT_FECHA, DVDE_CANT * DVDE_FACTOR FROM devoluciones_ventas_detalle D, devoluciones_ventas F
                WHERE F.devt_id = D.devt_id AND ARTI_COD = :codigo AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECHA AND DVDE_ANULADO = 'N'
                INTO :FECAUX, :salidat
                DO
                BEGIN
                EXECUTE PROCEDURE COSTO_PROMEDIO(:codigo, :fecaux) returning_values (:costo);
                acumulado = acumulado - costo * salidat;
                acumulac = acumulac - salidat;
                END
            ventas = ventas - acumulado;
            END
        insert into analisis_abcinven (ABCI_COD, ABCI_VENTA, ABCI_CANT) VALUES (:codigo, :ventas, :acumulac);
        END
    END
SELECT SUM(ABCI_VENTA) FROM analisis_abcinven INTO :acumulado;
FOR SELECT ARTI_COD, ARTI_DES, ARTI_UNIDAD, ARTI_DIAS, A.GRUP_COD, GRUP_NOM, A.SUBG_COD, A.MARC_COD, ABCI_VENTA, ABCI_CANT
      FROM ARTICULO A, GRUPO G, analisis_abcinven N
      WHERE A.ARTI_COD = N.abci_cod AND G.GRUP_COD = A.GRUP_COD
      ORDER BY ABCI_VENTA DESC
      INTO :CODIGO, :NOMBRE, :UNIDAD, :DIAS, :CODGRUPO, :NOMGRUPO, :CODSUBG, :CODMARC, :vpromedio, :salidat
      DO
        BEGIN
        NOMMARC = '';
        NOMSUBG = '';
        SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO :NOMMARC;
        SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
        if (acumulado <> 0) then
            PORC = vpromedio / acumulado * 100;
        ELSE
            PORC = 0;
        acumporc = acumporc + porc;
        if (acumporc < A) then
            CLASE = 'A';
        else
            if (acumporc < B) then
                CLASE = 'B';
            else
                if (acumporc < c) then
                    CLASE = 'C';
                else
                    CLASE = 'D';
        SUSPEND;
        END
END
^

SET TERM ; ^


/* 20091023C */
/* INHABILITAR IMPUESTOS INCLUIDOS EN DOCUMENTOS DE INVENTARIO PARA GARANTIZAR QUE DIGITEN SIEMPRE IGUAL */
INSERT INTO CONFIGURACION (CONF_MODULO, CONF_CATEGORIA, CONF_PROPIEDAD, CONF_VALOR, CONF_POSIBLES, CONF_AYUDA) VALUES ('INVENTARIO', 'DOCUMENTOS', 'INHABILITAR CASILLA DE IMPUESTOS INCLUIDOS EN LOS DOCUMENTOS', 'SI', 'SI,NO', 'SI:No permite a los usuarios cambiar la condición de impuestos incluídos, hay que entrar a la opción de numeración. NO: Permite por cada documento decidir si va o no con impuestos incluídos');
COMMIT WORK;

/* 20091023D */
/* ERROR CONFIGURACION MAXIMOS POR DIA EN LUGAR DE MINIMOS POR DIA */
SET TERM ^ ;

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

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

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

SET TERM ; ^

/* 20091023e : NO PERMITIR DOS REMISIONES DEL MISMO PEDIDO POR CONTROL Y EVITAR DUPLICIDAD DE ENTREGAS */

INSERT INTO CONFIGURACION (CONF_MODULO, CONF_CATEGORIA, CONF_PROPIEDAD, CONF_VALOR, CONF_POSIBLES, CONF_AYUDA) VALUES ('FACTURACION', 'REMISIONES', 'PERMITIR VARIOS DESPACHOS PARCIALES DEL MISMO PEDIDO/FACTURA', 'SI', 'SI,NO', 'SI: Cuando quedan faltantes de un pedido o factura se despachan con una nueva remisión más adelante. NO: Se debe hacer devolución de lo no entregado ya que no se permitirá una nueva remisión sobre ese pedido');
commit work;

CREATE EXCEPTION DOCUMENTO_CRUZADO 'El documento indicado ya fue cruzado con otra operación';

SET TERM ^ ;

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

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

SET TERM ; ^

/* 20091024 */
/* mal ingreso del material rechazado, hay que convertirlo a la undiad con base en el peso */

SET TERM ^ ;

CREATE OR ALTER TRIGGER PRODUCCION_ENTRADA_DET_AI FOR PRODUCCION_ENTRADA_DET
ACTIVE AFTER INSERT POSITION 0
as
declare variable FEC DATE;
declare variable COSTO NUMERIC(18,2);
declare variable CONC VARCHAR(60);
declare variable LOTE VARCHAR(15);
declare variable PREF VARCHAR(4);
declare variable NUM VARCHAR(6);
declare variable RECHAZADO VARCHAR(15);
declare variable PESOP NUMERIC(18,4);
declare variable PESOA NUMERIC(18,4);
BEGIN
if ((NEW.prde_id <> 0) and (new.pren_anulado = 'N')) then
  begin
  SELECT PRDE_FECHA, PRDE_COSTO, PRDE_PREF, PRDE_NUMERO, PRDE_LOTE, PRDE_RECHAZADO
    FROM produccion_entrada_enc WHERE PRDE_ID = NEW.prde_id INTO :FEC, :COSTO, :PREF, :NUM, :LOTE, :rechazado;
  CONC = 'ENTRADA DE PRODUCTO TERMINADO No. ' || :PREF || :NUM;
  INSERT INTO MOVIMIENTO_ARTICULO
    (ARTI_COD, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM)
    VALUES(NEW.ARTI_COD, new.bode_cod, :fec, 20, NEW.prde_id,
    :conc, NEW.pren_cantok * new.pren_factor, :COSTO, 'S', :lote, :pref, :num, new.pren_item);

  /* ingrese los defectuosos */
  if ((new.pren_cantmal <> 0) AND (:RECHAZADO <> '')) then
      BEGIN
      SELECT ARTI_PESO FROM ARTICULO WHERE ARTI_COD = NEW.arti_cod INTO :PESOP;
      if ((pesop is null) or (pesop = 0)) then
        pesop = 1;
      SELECT ARTI_PESO FROM ARTICULO WHERE ARTI_COD = :rechazado INTO :PESOA;
      if ((pesoa is null) or (pesoa = 0)) then
        pesoa = 1;

      INSERT INTO MOVIMIENTO_ARTICULO
        (ARTI_COD, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM)
        VALUES(:rechazado, new.bode_cod, :fec, 20, NEW.prde_id,
        :conc, new.pren_cantmal * new.pren_factor * :pesop / :pesoa, :COSTO, 'S', :lote, :pref, :num, new.pren_item);
      END
  end
end
^

SET TERM ; ^


SET TERM ^ ;

CREATE OR ALTER TRIGGER PRODUCCION_ENTRADA_DET_AU FOR PRODUCCION_ENTRADA_DET
ACTIVE AFTER UPDATE POSITION 0
as
declare variable FEC DATE;
declare variable COSTO NUMERIC(18,2);
declare variable CONC VARCHAR(60);
declare variable LOTE VARCHAR(15);
declare variable PREF VARCHAR(4);
declare variable NUM VARCHAR(6);
declare variable RECHAZADO VARCHAR(15);
declare variable PESOP NUMERIC(18,4);
declare variable PESOA NUMERIC(18,4);
BEGIN
/* BORRE EL ANTERIOR Y GRABE EL NUEVO */
if ((OLD.prde_id <> 0) AND (OLD.pren_anulado = 'N')) then
    begin
    delete from movimiento_articulo where (mvar_tipodoc = 20) and (mvar_idref = old.prde_id) and (mvar_item = OLD.pren_item);
    end
if ((NEW.prde_id <> 0) and (new.pren_anulado = 'N')) then
  begin
  SELECT PRDE_FECHA, PRDE_COSTO, PRDE_PREF, PRDE_NUMERO, PRDE_LOTE
    FROM produccion_entrada_enc WHERE PRDE_ID = NEW.prde_id INTO :FEC, :COSTO, :PREF, :NUM, :LOTE;
  CONC = 'ENTRADA DE PRODUCTO TERMINADO No. ' || :PREF || :NUM;
  INSERT INTO MOVIMIENTO_ARTICULO
    (ARTI_COD, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM)
    VALUES(NEW.ARTI_COD, new.bode_cod, :fec, 20, NEW.prde_id,
    :conc, NEW.pren_cantok * new.pren_factor, :COSTO, 'S', :lote, :pref, :num, new.pren_item);

  /* ingrese los defectuosos */
  if ((new.pren_cantmal <> 0) AND (:RECHAZADO <> '')) then
      begin
      SELECT ARTI_PESO FROM ARTICULO WHERE ARTI_COD = NEW.arti_cod INTO :PESOP;
      if ((pesop is null) or (pesop = 0)) then
        pesop = 1;
      SELECT ARTI_PESO FROM ARTICULO WHERE ARTI_COD = :rechazado INTO :PESOA;
      if ((pesoa is null) or (pesoa = 0)) then
        pesoa = 1;
      INSERT INTO MOVIMIENTO_ARTICULO
        (ARTI_COD, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM)
        VALUES(:rechazado, new.bode_cod, :fec, 20, NEW.prde_id,
        :conc, new.pren_cantmal * new.pren_factor * :pesop / :pesoa, :COSTO, 'S', :lote, :pref, :num, new.pren_item);
      end
  end
end
^

SET TERM ; ^


/* 20091024b */
/* mejora rendimiento procesos de contabilización */

CREATE INDEX COMPROBANTE_ENCABEZADO_IDX2
ON COMPROBANTE_ENCABEZADO (ENCO_TIPOREF,ENCO_IDREF);

SET TERM ^ ;

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

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE VALIDE_CUENTA(
    CUENTA VARCHAR(20))
RETURNS (
    OK CHAR(1))
AS
BEGIN
  /* Verifica que la cuenta exista y sea afectable */ /*$$IBE$$ 
  EXECUTE PROCEDURE EXISTE_CUENTA(CUENTA) RETURNING_VALUES (:OK);
  IF (OK = 'N') THEN
      EXCEPTION CUENTA_NO_EXISTE 'La cuenta ' || :cuenta || ' no existe.';
  ELSE
    BEGIN
    EXECUTE PROCEDURE CUENTA_AFECTABLE (CUENTA) RETURNING_VALUES (:OK);
    END
  SUSPEND;
 $$IBE$$*/ SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE VALIDE_CUENTA(
    CUENTA VARCHAR(20))
RETURNS (
    OK CHAR(1))
AS
BEGIN
  /* Verifica que la cuenta exista y sea afectable */
  EXECUTE PROCEDURE EXISTE_CUENTA(CUENTA) RETURNING_VALUES (:OK);
  IF (OK = 'N') THEN
      EXCEPTION CUENTA_NO_EXISTE 'La cuenta ' || :cuenta || ' no existe.';
  ELSE
    BEGIN
    EXECUTE PROCEDURE CUENTA_AFECTABLE (CUENTA) RETURNING_VALUES (:OK);
    END
  SUSPEND;
END

^

SET TERM ; ^

SET TERM ^ ;

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

SET TERM ; ^

SET TERM ^ ;

ALTER TRIGGER PLANTILLA_DETALLE_BI
AS
DECLARE VARIABLE OK CHAR(1);
DECLARE VARIABLE TERCERO CHAR(1);
DECLARE VARIABLE RETENCION CHAR(1);
DECLARE VARIABLE CENTRO CHAR(1);
declare variable TIPO CHAR(1);
BEGIN
/* VERIFIQUE QUE LA CUENTA EXISTA Y QUE SEA AFECTABLE */
EXECUTE PROCEDURE VALIDE_CUENTA (NEW.CUEN_COD) RETURNING_VALUES (:OK);
IF (OK = 'S') THEN
  BEGIN
  IF (NEW.PLDE_DEBITOS IS NULL) THEN
        NEW.PLDE_DEBITOS = 0;
        IF (NEW.PLDE_CREDITOS IS NULL) THEN
          NEW.PLDE_CREDITOS = 0;
    if (NEW.plde_base IS NULL) then
    NEW.PLDE_BASE = 0;
    if (NEW.plde_porc IS NULL) then
    NEW.PLDE_PORC = 0;
  IF (NEW.TERC_NIT IS NULL) THEN
    EXECUTE PROCEDURE LEE_CONFIGURACION('CONTABILIDAD', 'GENERAL', 'NIT COMPAÑIA') RETURNING_VALUES (NEW.TERC_NIT);
  IF (NEW.PROY_COD IS NULL) THEN
    EXECUTE PROCEDURE LEE_CONFIGURACION('CONTABILIDAD', 'GENERAL', 'PROYECTO UNICO') RETURNING_VALUES (NEW.PROY_COD);
  IF (NEW.CENT_COD IS NULL) THEN
    EXECUTE PROCEDURE LEE_CONFIGURACION('CONTABILIDAD', 'GENERAL', 'CENTRO DE COSTOS UNICO') RETURNING_VALUES (NEW.CENT_COD);
  SELECT CUEN_TERCERO, CUEN_RETENCION, CUEN_CENTRO, CUEN_TIPO FROM CUENTAS WHERE CUEN_COD = NEW.CUEN_COD INTO :TERCERO, :RETENCION, :CENTRO, :TIPO;
  /* VERIFIQUE QUE LA CUENTA PERMITA RETENCION Y VERIFIQUE EL TERCERO */
  IF (TERCERO = 'S' OR RETENCION = 'S') THEN
    EXECUTE PROCEDURE EXISTE_TERCERO (NEW.TERC_NIT) RETURNING_VALUES (:OK);
  ELSE
    EXECUTE PROCEDURE LEE_CONFIGURACION('CONTABILIDAD', 'GENERAL', 'NIT COMPAÑIA') RETURNING_VALUES (NEW.TERC_NIT);
  IF (OK = 'S') THEN
    BEGIN
    /* SI LA CUENTA ES DE RETENCION ASEGURECE QUE TENGA BASE Y PORCENTAJE */
    IF (RETENCION = 'S') THEN
      BEGIN
      IF ((NEW.PLDE_BASE = 0) OR (NEW.PLDE_PORC = 0)) THEN
        EXCEPTION FALTA_BASE 'FALTA INDICAR LA BASE PARA LA CUENTA ' || NEW.cuen_cod;
      END
    ELSE
       BEGIN
      IF (CENTRO = 'S') THEN
        EXECUTE PROCEDURE EXISTE_CENTRO (NEW.PROY_COD, NEW.CENT_COD) RETURNING_VALUES (:OK);
        ELSE
        BEGIN
        EXECUTE PROCEDURE LEE_CONFIGURACION('CONTABILIDAD', 'GENERAL', 'PROYECTO UNICO') RETURNING_VALUES (NEW.PROY_COD);
        EXECUTE PROCEDURE LEE_CONFIGURACION('CONTABILIDAD', 'GENERAL', 'CENTRO DE COSTOS UNICO') RETURNING_VALUES (NEW.CENT_COD);
          END
      END
  END
  if (:TIPO = 'I') then
    BEGIN
    if (NEW.ARTI_COD IS NULL) then
        EXCEPTION FALTA_ARTICULO 'FALTA INDICAR EL ARTICULO PARA LA CUENTA ' || NEW.cuen_cod;
    END
END
END
^

SET TERM ; ^

SET TERM ^ ;

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

SET TERM ; ^

/* 20091026 */
SET TERM ^ ;

CREATE OR ALTER procedure CONTABIL_DEVOLCLI (
    IDDOC integer,
    IDINTER integer)
returns (
    ERROR integer,
    VER char(1),
    IDC integer)
AS
declare variable PREF VARCHAR(4);
declare variable NUM VARCHAR(6);
declare variable NUMERO VARCHAR(10);
declare variable FECAUX DATE;
declare variable FECHA CHAR(8);
declare variable CONC CHAR(120);
declare variable NUMFAC VARCHAR(10);
declare variable VRDTO NUMERIC(18, 2);
declare variable VRADIC NUMERIC(18, 2);
declare variable VRSUBT NUMERIC(18, 2);
declare variable VRIVA NUMERIC(18, 2);
declare variable PRTFTE NUMERIC(9, 2);
declare variable VRRTFTE NUMERIC(18, 2);
declare variable VRRTIVA NUMERIC(18, 2);
declare variable PRTICA NUMERIC(9, 2);
declare variable VRRTICA NUMERIC(18, 2);
declare variable VRTOTAL NUMERIC(18, 2);
declare variable VREXTRA NUMERIC(18, 2);
declare variable TIPOCOMP VARCHAR(3);
declare variable PREFCONT VARCHAR(4);
declare variable VENTAS CHAR(1);
declare variable CTAVENTAS VARCHAR(20);
declare variable IVA CHAR(1);
declare variable CTAIVA VARCHAR(20);
declare variable CONSUMO CHAR(1);
declare variable CTACONSUMO VARCHAR(20);
declare variable CARTERA CHAR(1);
declare variable CTACARTERA VARCHAR(20);
declare variable RTFTE CHAR(1);
declare variable CTARTFTE VARCHAR(20);
declare variable RTIVA CHAR(1);
declare variable CTARTIVA VARCHAR(20);
declare variable RTICA CHAR(1);
declare variable CTARTICA VARCHAR(20);
declare variable INVEN CHAR(1);
declare variable CTAINVEN VARCHAR(20);
declare variable COSTOS CHAR(1);
declare variable CTACOSTOS VARCHAR(20);
declare variable CTADTO VARCHAR(20);
declare variable CTAADIC VARCHAR(20);
declare variable CTAEXTRA VARCHAR(20);
declare variable EXISTE CHAR(1);
declare variable CUENTA VARCHAR(20);
declare variable MONTO NUMERIC(18,2);
declare variable TIPOCUEN CHAR(1);
declare variable NIT VARCHAR(20);
declare variable PROY VARCHAR(4);
declare variable CENTRO VARCHAR(4);
declare variable PORC NUMERIC(5,2);
declare variable DEBITO NUMERIC(18,2);
declare variable CREDITO NUMERIC(18,2);
declare variable NROI INTEGER;
declare variable ART VARCHAR(15);
declare variable IMPINC CHAR(1);
declare variable IMPTOS NUMERIC(18, 2);
declare variable SUMA NUMERIC(18,2);
declare variable PORCIVA NUMERIC(9,2);
declare variable TCTACLIEN VARCHAR(20);
declare variable TCTAVENTA VARCHAR(20);
declare variable TCTARTFTE VARCHAR(20);
declare variable TCTARTIVA VARCHAR(20);
declare variable TCTARTICA VARCHAR(20);
declare variable CTADIC VARCHAR(20);
declare variable BASEADIC VARCHAR(20);
declare variable PORCADIC NUMERIC(5,2);
declare variable VALORADIC NUMERIC(18,2);
declare variable DBADIC CHAR(1);
declare variable PTOVTA INTEGER;
declare variable ANULADO CHAR(1);
declare variable CENT CHAR(1);
DECLARE VARIABLE MERCANCIA NUMERIC(18,2);
declare variable FACTOR DOUBLE PRECISION;
declare variable DIG INTEGER;
DECLARE VARIABLE FOMENTO VARCHAR(2);
DECLARE VARIABLE VRCONSUMO NUMERIC(18,2);
declare variable AUTORET VARCHAR(10);
declare variable FAUTORET DATE;
declare variable IDREM INTEGER;
declare variable DTOXIT CHAR(2);
declare variable ERRORC INTEGER;
BEGIN
EXECUTE PROCEDURE LEE_CONFIGURACION('COMPRAS', 'FACTURAS', 'USAR IMPOCONSUMO COMO PORCENTAJE DE FOMENTO') returning_values (FOMENTO);
EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'FECHA AUTORETENEDOR NO DESCONTAR RETENCIONES DEL SALDO PERO SI CONTABILIZARLAS') returning_values (AUTORET);
if (AUTORET <> '') then
    FAUTORET = CAST(AUTORET AS DATE);
else
    FAUTORET = '9999/12/31';
  /* BUSQUE LA INTERFACE */
  EXISTE = 'N';
  SELECT 'S', TICO_COD, PRCO_PRE, INVE_VENTAS, INVE_IVA, INVE_CONSUMO, INVE_CARTERA, INVE_RTFTE, INVE_RTIVA, INVE_RTICA, INVE_COSTO, INVE_INVEN, INVE_CTAVENTAS, INVE_CTAIVA, INVE_CTACONSUMO, INVE_CTADTO, INVE_CTAADIC, INVE_CTAEXTRA, INVE_CTACARTERA, INVE_CTARTFTE, INVE_CTARTIVA, INVE_CTARTICA, INVE_CTAINVEN, INVE_CTACOSTOS, INVE_CONFIRMAR, INVE_CENTRO
    FROM INTERFAZ_VENTAS
    WHERE INVE_ID = :IDINTER
    INTO :EXISTE, :TIPOCOMP, :PREFCONT, :VENTAS, :IVA, :CONSUMO, :CARTERA, :RTFTE, :RTIVA, :RTICA, :COSTOS, :INVEN, :CTAVENTAS, :CTAIVA, :CTACONSUMO, :CTADTO, :CTAADIC, :CTAEXTRA, :CTACARTERA, :CTARTFTE, :CTARTIVA, :CTARTICA, :CTAINVEN, :CTACOSTOS, :VER, :CENT;
  if (EXISTE = 'S') then
   BEGIN
    /* BORRE CUALQUEIR CONTABILIZACION PREVIA */
    DELETE FROM CONTABILIZACION WHERE CNTB_TIPOREF = 33 AND CNTB_IDREF = :IDDOC;
    /* TRAIGA EL ENCABEZADO DE LA DEVOLUCION */
   SELECT PREF_PRE, DEVT_NUMERO, DEVT_FECHA, F.TERC_NIT, DEVT_IVAINC, PTVT_ID, DEVT_FACTURA, DEVT_DTOMONTO, DEVT_ADICIONAL, DEVT_IVAMONTO, DEVT_EXTRA, DEVT_TOTAL, DEVT_RTFTEPORC, DEVT_RTFTEMONTO, DEVT_RTIVAPORC, DEVT_RTIVAMONTO, DEVT_RTICAPORC, DEVT_RTICAMONTO, TERC_CTARTFTE, TERC_CTARTIVA, TERC_CTARTICA, TERC_CTAVENTA, TERC_CTACLIENTE, DEVT_ANULADO, DEVT_REMID
        FROM DEVOLUCIONES_VENTAS F, TERCEROS T
        WHERE DEVT_ID = :IDDOC AND F.TERC_NIT = T.TERC_NIT
        INTO :PREF, :NUM, :FECAUX, :NIT, :IMPINC, :PTOVTA, :NUMFAC, :VRDTO, :VRADIC, :VRIVA, :VREXTRA, :VRTOTAL, :PRTFTE, :VRRTFTE, :PORC, :VRRTIVA, :PRTICA, :VRRTICA, :TCTARTFTE, TCTARTIVA, TCTARTICA, TCTAVENTA, TCTACLIEN, ANULADO, :IDREM;
   if (idrem is null) Then
    IDREM = 0;
   if ((ANULADO = 'N') AND (IDREM = 0)) then
    BEGIN
    NUMERO = PREF || NUM;
    SELECT SUM(DVDE_CONSUMO) FROM devoluciones_ventas_detalle WHERE DEVT_ID = :iddoc AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL)) INTO :MERCANCIA;
    VRSUBT = VRTOTAL - VREXTRA - VRIVA - MERCANCIA; /* BASE DE RETEFTE Y RETEICA */
    EXECUTE PROCEDURE lee_configuracion ('FACTURACION', 'DEVOLUCIONES', 'DESCUENTO PIE DEVOLUCION IGUAL A SUMA DE DESCUENTOS POR ITEM') returning_values (:DTOXIT);
    if (DTOXIT = 'SI') then
        VRDTO = 0;
    MERCANCIA = VRSUBT - VRADIC + VRDTO;
    IF (CENT = 'B') THEN
        SELECT B.BODE_CENTRO, B.BODE_PROY FROM BODEGA B, DEVOLUCIONES_VENTAS F
            WHERE B.BODE_COD = F.BODE_COD AND F.DEVT_ID = :IDDOC INTO :CENTRO, :PROY;
    IF (CENT = 'V') THEN
        SELECT V.CENT_COD, V.PROY_COD FROM VENDEDORES V, DEVOLUCIONES_VENTAS F
            WHERE V.VEND_COD = F.VEND_COD AND F.DEVT_ID = :IDDOC INTO :CENTRO, :PROY;
    IF (CENT = 'P') THEN
        SELECT P.PREF_CENTRO,P.PREF_PROY  FROM PREFIJOS P, DEVOLUCIONES_VENTAS F
            WHERE P.PREF_PRE = F.PREF_PRE AND F.DEVT_ID = :IDDOC AND P.TIDO_COD = 33 INTO :CENTRO, :PROY;
    EXECUTE PROCEDURE FECHA_A_CONTA(:FECAUX) returning_values (:FECHA);
    /* REGISTRE EL ENCABEZADO CONTABLE */
    IDC = GEN_ID(ID_CONTABILIZA, 1);
    CONC = 'DEVOLUCION VENTAS No. ' || NUMERO || ' EN FACTURA ' || NUMFAC;
    CONC = SUBSTR(CONC, 1, 60);
    INSERT INTO CONTABILIZACION (CNTB_ID, CNTB_TIPOCOMP, CNTB_PREFCNT, CNTB_NUMERO, CNTB_FECHA, CNTB_CONCEPTO, CNTB_REF, CNTB_TIPOREF, CNTB_IDREF, CNTB_PREFREF, CNTB_NUMREF, CNTB_PROCESADO)
        VALUES (:IDC, :TIPOCOMP, :PREFCONT, :NUM, :FECHA, :CONC, '', 33, :IDDOC, :PREF, :NUM, 'N');
    NROI = 0;
    SUMA = 0;
    ERROR = 0;
    /* SI NO HAY CUENTA DE DESCUENTO NI ADICIONAL CALCULE UN FACTOR PARA LAS VENTAS Y EL IVA */
    if (MERCANCIA <> 0) then
        FACTOR = CAST(VRSUBT AS DOUBLE PRECISION) / CAST(MERCANCIA AS DOUBLE PRECISION);
    ELSE
        FACTOR = 1;
    /* TRAIGA EL NUMERO DE DIGITOS PARA EL REDONDEO */
    SELECT CAST(CONF_VALOR AS INTEGER) FROM CONFIGURACION WHERE CONF_MODULO = 'FACTURACION' AND
        CONF_CATEGORIA = 'GENERAL' AND CONF_PROPIEDAD = 'REDONDEO AL MULTIPLO DE DIEZ EN TOTALES' INTO :DIG;
    /* CUENTAS DE VENTAS */
    if (VENTAS = 'A') then
        BEGIN
        FOR SELECT MAX(COAR_CTADEV), SUM(DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO), SUM(DVDE_IVAMONTO), SUM(DVDE_CONSUMO)
            FROM ARTICULO A, CONTABIL_ARTICULO C, DEVOLUCIONES_VENTAS_DETALLE F
            WHERE F.DEVT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
            GROUP BY COAR_CTADEV
            INTO :CTAVENTAS, :MONTO, :IMPTOS, :VRCONSUMO
            DO
            BEGIN
            if (FOMENTO = 'SI') then
                MONTO = MONTO + VRCONSUMO;
            if ((CTADTO IS NULL) OR (CTADTO = '')) then
                MONTO = MONTO * FACTOR;
            execute procedure redondee(MONTO, DIG) returning_values (MONTO);
            if (MONTO <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTAVENTAS, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT F.ARTI_COD, (DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO), (DVDE_IVAMONTO+DVDE_CONSUMO)
                        FROM ARTICULO A, CONTABIL_ARTICULO C, DEVOLUCIONES_VENTAS_DETALLE F
                        WHERE F.DEVT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTAINV = :CUENTA AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
                        INTO :ART, :MONTO, :IMPTOS
                    DO
                        BEGIN
                        if (IMPINC = 'S') then
                            MONTO = MONTO - IMPTOS;
                        if ((CTADTO IS NULL) OR (CTADTO = '')) then
                            MONTO = MONTO * FACTOR;
                        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        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, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                    NROI = NROI + 1;
                    SUMA = SUMA + MONTO;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA + MONTO;
                    END
                END /* MONTO <> 0 */
            END /* FOR */
        END /* VENTAS X ARTICULO */
     IF ((VENTAS = 'C') OR (VENTAS = 'K')) THEN
        BEGIN
        IF (VENTAS = 'C') THEN
            CTAVENTAS = TCTAVENTA;
        SELECT SUM(DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO), SUM(DVDE_IVAMONTO), SUM(DVDE_CONSUMO)
            FROM DEVOLUCIONES_VENTAS_DETALLE F
            WHERE F.DEVT_ID = :IDDOC  AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
            INTO :MONTO, :IMPTOS, :VRCONSUMO;
        if (FOMENTO = 'SI') then
            MONTO = MONTO + VRCONSUMO;
        if ((CTADTO IS NULL) OR (CTADTO = '')) then
            MONTO = MONTO * FACTOR;
        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
        if (MONTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTAVENTAS, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT F.ARTI_COD, (DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO), (DVDE_IVAMONTO+DVDE_CONSUMO)
                    FROM ARTICULO A, DEVOLUCIONES_VENTAS_DETALLE F
                    WHERE F.DEVT_ID = :IDDOC AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
                    INTO :ART, :MONTO, :IMPTOS
                    DO
                    BEGIN
                    if (IMPINC = 'S') then
                        MONTO = MONTO - IMPTOS;
                    if ((CTADTO IS NULL) OR (CTADTO = '')) then
                        MONTO = MONTO * FACTOR;
                    execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                    NROI = NROI + 1;
                    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, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                NROI = NROI + 1;
                SUMA = SUMA + MONTO;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA + MONTO;
                END
            END /* MONTO <> 0 */
        END /* VENTAS DE CLIENTE O CONSTANTE */
    /* EL IVA EN VENTAS */
    if (IVA = 'A') then
        BEGIN
        FOR SELECT MAX(COAR_CTAIVAV), SUM(DVDE_IVAMONTO), SUM(DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO), SUM(DVDE_CONSUMO)
            FROM ARTICULO A, CONTABIL_ARTICULO C, DEVOLUCIONES_VENTAS_DETALLE F
            WHERE F.DEVT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
            GROUP BY COAR_CTAIVAV
            INTO :CTAIVA, :IMPTOS, :MONTO, :VALORADIC
        DO
            BEGIN
            if (FOMENTO = 'SI') then
                MONTO = MONTO + VALORADIC;
            MONTO = MONTO * -1;
            MONTO = MONTO * FACTOR;
            IMPTOS = IMPTOS * FACTOR;
            execute procedure redondee(MONTO, DIG) returning_values (MONTO);
            execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
            if (IMPTOS <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTAIVA, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT F.ARTI_COD, DVDE_IVAMONTO, (DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO), TAIV_PORC, DVDE_CONSUMO
                        FROM ARTICULO A, CONTABIL_ARTICULO C, DEVOLUCIONES_VENTAS_DETALLE F, TARIFA_IVA T
                        WHERE F.DEVT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND A.TAIV_COD = T.TAIV_COD AND COAR_CTAIVAV = :CUENTA AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
                        INTO :ART, :IMPTOS, :MONTO, :PORCIVA, :VALORADIC
                    DO
                        BEGIN
                        if (IMPINC = 'S') then
                            MONTO = MONTO - IMPTOS - VALORADIC;
                        MONTO = MONTO * -1;
                        MONTO = MONTO * FACTOR;
                        IMPTOS = IMPTOS * FACTOR;
                        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                        execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                        if (IMPTOS <> 0) then
                            BEGIN
                            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :IMPTOS, 0, :MONTO, :PORCIVA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                            NROI = NROI + 1;
                            SUMA = SUMA + IMPTOS;
                            END
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                    NROI = NROI + 1;
                    SUMA = SUMA + IMPTOS;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA + IMPTOS;
                    END
                END   /* IMPTOS <> 0 */
            END /* FOR */
        END /* IVA X ARTICULO */
    if (IVA = 'K') then /* IVA EN CTA CONSTANTE */
        BEGIN
        SELECT SUM(DVDE_IVAMONTO), SUM(DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO), SUM(DVDE_CONSUMO)
            FROM DEVOLUCIONES_VENTAS_DETALLE F
            WHERE F.DEVT_ID = :IDDOC  AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
            INTO :IMPTOS, :MONTO, :VALORADIC;
        if (FOMENTO = 'SI') then
            MONTO = MONTO + VALORADIC;
        MONTO = MONTO * -1;
        MONTO = MONTO * FACTOR;
        IMPTOS = IMPTOS * FACTOR;
        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
        execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
        if (IMPTOS <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTAIVA, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT F.ARTI_COD, (DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO), DVDE_IVAMONTO, TAIV_PORC, DVDE_CONSUMO
                    FROM ARTICULO A, DEVOLUCIONES_VENTAS_DETALLE F, TARIFA_IVA T
                    WHERE F.DEVT_ID = :IDDOC AND A.TAIV_COD = T.TAIV_COD AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
                    INTO :ART, :MONTO, :IMPTOS, :PORCIVA, :VALORADIC
                    DO
                    BEGIN
                    if (IMPINC = 'S') then
                        MONTO = MONTO - IMPTOS - VALORADIC;
                    MONTO = MONTO * -1;
                    MONTO = MONTO * FACTOR;
                    IMPTOS = IMPTOS * FACTOR;
                    execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                    execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                    if (IMPTOS <> 0) then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', :IMPTOS, 0, :MONTO, :PORCIVA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        SUMA = SUMA + IMPTOS;
                        END
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                NROI = NROI + 1;
                SUMA = SUMA + IMPTOS;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA + IMPTOS;
                END
            END /* IMPTOS <> 0 */
        END /* IVA EN CTA CONSTANTE */
    /* EL IMPOCONSUMO */
    if ((CONSUMO = 'A') AND (FOMENTO <> 'SI')) then
        BEGIN
        FOR SELECT MAX(COAR_CTACONS), SUM(DVDE_CONSUMO)
            FROM ARTICULO A, CONTABIL_ARTICULO C, DEVOLUCIONES_VENTAS_DETALLE F
            WHERE F.DEVT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
            GROUP BY COAR_CTACONS
            INTO :CTACONSUMO, :IMPTOS
        DO
            BEGIN
            if (IMPTOS <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTACONSUMO, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, REGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT F.ARTI_COD, DVDE_CONSUMO
                        FROM ARTICULO A, CONTABIL_ARTICULO C, DEVOLUCIONES_VENTAS_DETALLE F
                        WHERE F.DEVT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTACONS = :CUENTA AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
                        INTO :ART, :IMPTOS
                    DO
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 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, :NROI, :CUENTA, :CONC, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                    NROI = NROI + 1;
                    SUMA = SUMA + IMPTOS;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA + IMPTOS;
                    END
                END /* IMPTOS <> 0 */
            END /* FOR */
        END /* CONSUMO X ARTICULO */
    if ((CONSUMO = 'K') AND (FOMENTO <> 'SI')) then
        BEGIN
        SELECT SUM(DVDE_CONSUMO)
            FROM DEVOLUCIONES_VENTAS_DETALLE F
            WHERE F.DEVT_ID = :IDDOC AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
            INTO :IMPTOS;
        if (IMPTOS <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTACONSUMO, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT F.ARTI_COD, DVDE_CONSUMO
                    FROM ARTICULO A, DEVOLUCIONES_VENTAS_DETALLE F
                    WHERE F.DEVT_ID = :IDDOC  AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
                    INTO :ART, :IMPTOS
                    DO
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTACONSUMO, :CONC, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                    NROI = NROI + 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, :NROI, :CTACONSUMO, :CONC, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA + IMPTOS;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTACONSUMO, :CONC, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA + IMPTOS;
                END
            END /* IMPTOS <> 0 */
        END /* CONSUMO EN CTA CONSTANTE */
    /* DESCUENTO */
    if ((CTADTO IS NOT NULL) AND
        (CTADTO <> '') AND
        (VRDTO <> 0)) THEN
        BEGIN
        EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTADTO, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRDTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
            NROI = NROI + 1;
            SUMA = SUMA - VRDTO;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRDTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 33);
            NROI = NROI + 1;
            SUMA = SUMA - VRDTO;
            END
        END /* DESCUENTO */
    /* VALOR ADIC */
    if ((CTAADIC IS NOT NULL) AND
        (CTAADIC <> '') AND
        (VRADIC <> 0)) THEN
        BEGIN
        EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTAADIC, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRADIC, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
            NROI = NROI + 1;
            SUMA = SUMA + VRADIC;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRADIC, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 33);
            NROI = NROI + 1;
            SUMA = SUMA + VRADIC;
            END
        END /* VR. ADIC */
    /* VALOR EXTRA */
    if ((CTAEXTRA IS NOT NULL) AND
        (CTAEXTRA <> '') AND
        (VREXTRA <> 0)) THEN
        BEGIN
        EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTAEXTRA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VREXTRA, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
            NROI = NROI + 1;
            SUMA = SUMA + VREXTRA;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VREXTRA, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 33);
            NROI = NROI + 1;
            SUMA = SUMA + VREXTRA;
            END
        END /* VR. EXTRA */
    /* RETENCION FUENTE */
    if ((RTFTE = 'C') or (RTFTE = 'K')) then
      if (VRRTFTE <> 0) then
        BEGIN
        if (RTFTE = 'C') then
            CTARTFTE = TCTARTFTE;
        EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTARTFTE, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, (:VRSUBT*-1), :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
            NROI = NROI + 1;
            SUMA = SUMA - VRRTFTE;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, (:VRSUBT*-1), :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA - VRRTFTE;
            END
        /* AUTORETENCION */
        if (FAUTORET <= fecaux) then
            BEGIN
            EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'CUENTA DE AUTORETENCION EN LA FUENTE') returning_values (CTARTFTE);
            EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTARTFTE, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :VRSUBT, :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                NROI = NROI + 1;
                SUMA = SUMA + VRRTFTE;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :VRSUBT, :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA + VRRTFTE;
                END
            END
        END /* RTFTE */
    if (RTFTE = 'A') then
      BEGIN
      FOR SELECT MAX(COAR_CTARTFTEV), MAX(COAR_RTFTE), MIN(COAR_RTBASE), SUM(DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO), SUM((DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO)*COAR_RTFTE)
        FROM CONTABIL_ARTICULO C, devoluciones_ventas_detalle F
        WHERE F.devt_id = :IDDOC AND F.ARTI_COD = C.ARTI_COD AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
        GROUP BY COAR_CTARTFTEV
        INTO :CTARTFTE, :PRTFTE, :baseadic, :MONTO, :VRRTFTE
        DO
        BEGIN
        MONTO = MONTO * FACTOR;
        if (MONTO >= BASEADIC) then
            BEGIN
            VRRTFTE = VRRTFTE * FACTOR / 100;
            execute procedure redondee(VRRTFTE, DIG) returning_values (VRRTFTE);
            execute procedure redondee(MONTO, DIG) returning_values (MONTO);
            if (VRRTFTE <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTARTFTE, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, (:MONTO*-1), :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                    NROI = NROI + 1;
                    SUMA = SUMA - VRRTFTE;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, (:MONTO*-1), :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA - VRRTFTE;
                    END
                /* AUTORETENCION */
                if (FAUTORET <= fecaux) then
                    BEGIN
                    EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'CUENTA DE AUTORETENCION EN LA FUENTE') returning_values (CTARTFTE);
                    EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTARTFTE, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
                    if (ERRORC <> 0) then
                        ERROR = ERROR + 1;
                    if (TIPOCUEN = 'C') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :MONTO, :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                        NROI = NROI + 1;
                        SUMA = SUMA + VRRTFTE;
                        END
                    if (TIPOCUEN = 'N') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :MONTO, :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NROI = NROI + 1;
                        SUMA = SUMA + VRRTFTE;
                        END
                    END
                END
            END
        END /* RTFTE */
      END
    /* RETENCION IVA */
    if ((RTIVA = 'C') or (RTIVA = 'K')) then
      if (VRRTIVA <> 0) then
        BEGIN
        if (RTIVA = 'C') then
            CTARTIVA = TCTARTIVA;
        EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTARTIVA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTIVA, (:VRIVA*-1), :PORC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
            NROI = NROI + 1;
            SUMA = SUMA - VRRTIVA;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTIVA, (:VRIVA*-1), :PORC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA - VRRTIVA;
            END
        END /* RTIVA */
    /* RETENCION DE ICA */
    if ((RTICA = 'C') or (RTICA = 'K')) then
      if (VRRTICA <> 0) then
        BEGIN
        if (RTICA = 'C') then
            CTARTICA = TCTARTICA;
        EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTARTICA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTICA, (:VRSUBT*-1), :PRTICA, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
            NROI = NROI + 1;
            SUMA = SUMA - VRRTICA;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTICA, (:VRSUBT*-1), :PRTICA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA - VRRTICA;
            END
        END /* RTICA */
    /* CIERRE EL COMPROBANTE CONTRA LA CUENTA DEL TERCERO O LA CONSTANTE */
    if ((SUMA <> 0) and ((CARTERA = 'C') or (CARTERA = 'K') or (CARTERA = 'J'))) then
        BEGIN
        if (SUMA < 0) then
            BEGIN
            DEBITO = SUMA * -1;
            CREDITO = 0;
            END
        ELSE
            BEGIN
            DEBITO = 0;
            CREDITO = SUMA;
            END
        if (CARTERA = 'C') then
            CTACARTERA = TCTACLIEN;
        if (CARTERA = 'J') then
            BEGIN
            /* BUSQUE LA CUENTA DE LA CAJA */
            SELECT CAJA_CUENTA FROM CAJAS C, PUNTO_VENTA P
                WHERE P.CAJA_ID = C.CAJA_ID AND PTVT_ID = :PTOVTA
                INTO :CTACARTERA;
            END
        EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTACARTERA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :DEBITO, :CREDITO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
        if (TIPOCUEN = 'N') then
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :DEBITO, :CREDITO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
        NROI = NROI + 1;
        END /* SUMA EN CARTERA */
    /* CALCULE COSTOS EN VENTAS */
    EXECUTE PROCEDURE COSTO_EN_VENTAS(33, :IDDOC);
    if (COSTOS = 'A') then
        BEGIN
        FOR SELECT MAX(CTACOS), SUM(cast(CANT as double precision) * COSTO)
            FROM COSTO_VENTAS WHERE TIDO_COD = 33 AND COVE_ID = :IDDOC
            GROUP BY CTACOS
            INTO :CTACOSTOS, :MONTO
        DO
            BEGIN
            if (MONTO <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTACOSTOS, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT ARTI_COD, cast(CANT as double precision) * COSTO
                        FROM COSTO_VENTAS WHERE TIDO_COD = 33 AND COVE_ID = :IDDOC AND CTACOS = :CUENTA
                        INTO :ART, :MONTO
                    DO
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                    NROI = NROI + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    END
                END /* MONTO <> 0 */
            END /* FOR */
        END /* COSTOS */
    if (COSTOS = 'K') then
        BEGIN
        SELECT SUM(cast(CANT as double precision) * COSTO)
            FROM COSTO_VENTAS WHERE TIDO_COD = 33 AND COVE_ID = :IDDOC
            INTO :MONTO;
        if (MONTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTACOSTOS, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, REGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT ARTI_COD, cast(CANT as double precision) * COSTO
                    FROM COSTO_VENTAS WHERE TIDO_COD = 33 AND COVE_ID = :IDDOC
                    INTO :ART, :MONTO
                DO
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTACOSTOS, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                    NROI = NROI + 1;
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTACOSTOS, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                NROI = NROI + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTACOSTOS, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                END
            END /* MONTO <> 0 */
        END /* COSTOS = K */
    if (INVEN = 'A') then
        BEGIN
        FOR SELECT MAX(CTAINV), SUM(cast(CANT as double precision) * COSTO)
            FROM COSTO_VENTAS WHERE TIDO_COD = 33 AND COVE_ID = :IDDOC
            GROUP BY CTAINV
            INTO :CTAINVEN, :MONTO
        DO
            BEGIN
            if (MONTO <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTAINVEN, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, REGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT ARTI_COD, cast(CANT as double precision) * COSTO
                        FROM COSTO_VENTAS WHERE TIDO_COD = 33 AND COVE_ID = :IDDOC AND CTAINV = :CUENTA
                        INTO :ART, :MONTO
                    DO
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                    NROI = NROI + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    END
                END /* MONTO <> 0 */
            END /* FOR */
        END /* INVEN = A */
    if (INVEN = 'K') then
        BEGIN
        SELECT SUM(cast(CANT as double precision) * COSTO)
            FROM COSTO_VENTAS WHERE TIDO_COD = 33 AND COVE_ID = :IDDOC
            INTO :MONTO;
        if (MONTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTAINVEN, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT ARTI_COD, cast(CANT as double precision) * COSTO
                    FROM COSTO_VENTAS WHERE TIDO_COD = 33 AND COVE_ID = :IDDOC
                    INTO :ART, :MONTO
                DO
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTAINVEN, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                    NROI = NROI + 1;
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAINVEN, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                NROI = NROI + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAINVEN, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                END
            END /* MONTO <> 0 */
        END /* INVEN = K */
    /* recorra las cuentas adicionales */
    FOR SELECT INVC_CUENTA, INVC_BASE, INVC_PORC, INVC_VALOR, INVC_DB
        FROM INTERFAZ_VENTAS_CTAS WHERE INVE_ID = :IDINTER
        INTO :CTADIC, :BASEADIC, :PORCADIC, :VALORADIC, :DBADIC
        DO
        BEGIN
        if (valoradic <> 0) then
            monto = valoradic;
        else
            BEGIN
            if (:BASEADIC = 'SUBTOTAL') then
                VALORADIC = vrsubt;
            if (:BASEADIC = 'DESCUENTO') then
                VALORADIC = VRDTO;
            if (:BASEADIC = 'IVA') then
                VALORADIC = VRIVA;
            if (:BASEADIC = 'ADICIONAL') then
                VALORADIC = VRADIC;
            if (:BASEADIC = 'EXTRA') then
                VALORADIC = VREXTRA;
            if (:BASEADIC = 'TOTAL') then
                VALORADIC = VRTOTAL;
            MONTO = VALORADIC * PORCADIC;
            END
        if (MONTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTADIC, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                if (DBADIC = 'S') then
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                ELSE
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                NROI = NROI + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                if (DBADIC = 'S') then
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                ELSE
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                END
            NROI = NROI + 1;
            END
        END
    if (error > 0) then
        ver = 'S';
    SUSPEND;
    END
   END /* EXISTE LA INTERFAZ */
  ELSE
    BEGIN
    EXECUTE PROCEDURE ERROR (33, :IDDOC, :PREF, 1);
    ERROR = ERROR + 1;
    VER = 'S';
    SUSPEND;
    END
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE DEVOLUCIONES_SIN_CONTABILIDAD(
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    ID INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    ESTADO VARCHAR(20),
    IDI INTEGER,
    IDC INTEGER)
AS
 /*$$IBE$$ DECLARE VARIABLE VER CHAR(2);
declare variable FECICNT VARCHAR(10);
declare variable FECFCNT VARCHAR(10);
declare variable ERROR INTEGER;
declare variable idref INTEGER; $$IBE$$*/ 
BEGIN /*$$IBE$$ 
EXECUTE PROCEDURE fecha_a_conta(FECINI) returning_values (FECICNT);
EXECUTE PROCEDURE fecha_a_conta(FECFIN) returning_values (FECFCNT);
FOR SELECT DEVT_ID, PREF_PRE, DEVT_NUMERO FROM devoluciones_ventas WHERE DEVT_ANULADO = 'N' AND
    DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN
    INTO :ID, :PREF, :NUMERO
DO
  BEGIN
  idref = null;
  SELECT ENCO_IDREF FROM COMPROBANTE_ENCABEZADO WHERE ENCO_TIPOREF = 33 AND ENCO_FECHA >= :FECICNT AND ENCO_FECHA <= :FECFCNT and ENCO_IDREF = :id into :idref;
  if (idref IS NULL) then
  begin
   ESTADO = 'PROCESANDO';
   SUSPEND;
   SELECT MAX(INVE_ID) FROM INTERFAZ_VENTAS WHERE PREF_PRE = :PREF AND TIDO_COD = 33 INTO :IDI;
   EXECUTE PROCEDURE contabil_devolcli (:ID, :IDI) RETURNING_VALUES (:ERROR, :VER, :IDC);
   if (ERROR = 0) then
    BEGIN
    EXECUTE PROCEDURE CONTABILIZA_PENDIENTE (:IDC);
    ESTADO = 'OK';
    END
   ELSE
    ESTADO = 'ERROR';
   suspend;
  End
  END
 $$IBE$$*/ SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE DEVOLUCIONES_SIN_CONTABILIDAD(
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    ID INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    ESTADO VARCHAR(20),
    IDI INTEGER,
    IDC INTEGER)
AS
DECLARE VARIABLE VER CHAR(2);
declare variable FECICNT VARCHAR(10);
declare variable FECFCNT VARCHAR(10);
declare variable ERROR INTEGER;
declare variable idref INTEGER;
BEGIN
EXECUTE PROCEDURE fecha_a_conta(FECINI) returning_values (FECICNT);
EXECUTE PROCEDURE fecha_a_conta(FECFIN) returning_values (FECFCNT);
FOR SELECT DEVT_ID, PREF_PRE, DEVT_NUMERO FROM devoluciones_ventas WHERE DEVT_ANULADO = 'N' AND
    DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN
    INTO :ID, :PREF, :NUMERO
DO
  BEGIN
  idref = null;
  SELECT ENCO_IDREF FROM COMPROBANTE_ENCABEZADO WHERE ENCO_TIPOREF = 33 AND ENCO_FECHA >= :FECICNT AND ENCO_FECHA <= :FECFCNT and ENCO_IDREF = :id into :idref;
  if (idref IS NULL) then
  begin
   ESTADO = 'PROCESANDO';
   SUSPEND;
   SELECT MAX(INVE_ID) FROM INTERFAZ_VENTAS WHERE PREF_PRE = :PREF AND TIDO_COD = 33 INTO :IDI;
   EXECUTE PROCEDURE contabil_devolcli (:ID, :IDI) RETURNING_VALUES (:ERROR, :VER, :IDC);
   if (ERROR = 0) then
    BEGIN
    EXECUTE PROCEDURE CONTABILIZA_PENDIENTE (:IDC);
    ESTADO = 'OK';
    END
   ELSE
    ESTADO = 'ERROR';
   suspend;
  End
  END
END

^

SET TERM ; ^


/* 20091027 */
/* NO DETALLABA LAS CONSIGNACIONES DE TARJETAS */
SET TERM ^ ;

CREATE OR ALTER procedure MOV_DETALLE_CAJAS (
    FECINI date,
    FECFIN date,
    CAJINI integer,
    CAJFIN integer,
    DETALLE char(1),
    SUCURSAL integer)
returns (
    FECHA date,
    TIPO varchar(8),
    PREFIJO varchar(4),
    NUMERO varchar(6),
    DBEFECTIVO numeric(18,2),
    DBCHEQUES numeric(18,2),
    CREFECTIVO numeric(18,2),
    CRCHEQUES numeric(18,2),
    SALDO numeric(18,2),
    CONCEPTO varchar(60),
    TERCERO varchar(60),
    ENCARGADO varchar(60),
    CAJA varchar(60),
    SALDOINICIAL numeric(18,2),
    CODIGO integer)
AS
declare variable DB CHAR(1);
declare variable ID INTEGER;
declare variable NUMROWS INTEGER;
declare variable TIPOCOD INTEGER;
declare variable DEBITO NUMERIC(18,2);
declare variable CREDITO NUMERIC(18,2);
BEGIN
FOR SELECT CAJA_ID,CAJA_NOMBRE,CAJA_RESP
  FROM CAJAS
  WHERE CAJA_ID >= :CAJINI AND CAJA_ID <= :CAJFIN AND CAJA_ACTIVA = 'S' AND ((SUCU_ID = :SUCURSAL) or (:SUCURSAL = 0))
  ORDER BY CAJA_ID
  INTO :CODIGO,:CAJA,:ENCARGADO
  DO
  begin
  if (DETALLE = 'S') then
    BEGIN
    EXECUTE PROCEDURE SALDO_EN_CAJA(:CODIGO, :FECINI) returning_values(:SALDOINICIAL);
    SALDO =SALDOINICIAL;
    SELECT COUNT(MOCA_ID) FROM MOVIMIENTO_CAJA
        WHERE CAJA_ID = :CODIGO AND MOCA_FECHA >= :FECINI AND MOCA_FECHA <= :FECFIN INTO :NUMROWS;
    if (NUMROWS = 0) then
        BEGIN
        TIPO = '';
        PREFIJO = '';
        NUMERO = '';
        CONCEPTO = '';
        tercero = '';
        DEBITO = 0;
        CREDITO = 0;
        DBEFECTIVO = 0;
        CREFECTIVO = 0;
        DBCHEQUES = 0;
        CRCHEQUES = 0;
        SUSPEND;
        END
    ELSE
    FOR SELECT MOCA_TIPOREF, MOCA_IDREF, MOCA_FECHA, TIDO_NOMCORTO, MOCA_PREFREF, MOCA_NUMREF, MOCA_CONC, MOCA_DB, MOCA_DEBITOS, MOCA_CREDITOS
        FROM MOVIMIENTO_CAJA M, TIPO_DOCUMENTO T
        WHERE M.MOCA_TIPOREF = T.TIDO_COD AND M.CAJA_ID =:CODIGO AND M.MOCA_FECHA >=:FECINI AND M.MOCA_FECHA <=:FECFIN
        ORDER BY MOCA_FECHA, MOCA_TIPOREF, MOCA_ID
        INTO :TIPOCOD, :ID, :FECHA, :TIPO, :PREFIJO, :NUMERO, :CONCEPTO, :DB, :DEBITO, :CREDITO
        DO
        BEGIN
        DBEFECTIVO = 0;
        CREFECTIVO = 0;
        DBCHEQUES = 0;
        CRCHEQUES = 0;
        tercero = '';
        if (DB = 'S') then
            BEGIN
            /* BUSQUE CUANTO FUE EN EFECTIVO Y CUANTO EN CHEQUE */
            if (TIPOCOD = 61) then
                BEGIN
                SELECT SUM(RCPA_MONTO) FROM RECIBOS_CAJA_PAGO WHERE RECA_ID = :ID AND FOPA_ID = 1 INTO :DBEFECTIVO;
                if (DBEFECTIVO IS NULL) then
                    DBEFECTIVO = 0;
                DBCHEQUES = DEBITO - DBEFECTIVO;
                SELECT TERC_NOM from TERCEROS T, RECIBOS_CAJA R WHERE R.TERC_NIT = T.terc_nit and reca_id = :id INTO :TERCERO;
                END
            if (TIPOCOD = 62) then
                BEGIN
                /* ES UN TRASLADO A CAJA EL TOTAL VA A LA CAJA */
                SELECT EGRE_MONTO, TERC_NOM FROM EGRESOS E, TERCEROS T WHERE EGRE_ID = :ID AND E.TERC_NIT = T.terc_nit AND EGRE_TIPO = 2 AND CAJA_ID = :CODIGO INTO :DBEFECTIVO, :TERCERO;
                if (DBEFECTIVO IS NULL) then
                    DBEFECTIVO = 0;
                DBCHEQUES = DEBITO - DBEFECTIVO;
                END
            if (TIPOCOD = 63) then
                BEGIN
                DEBITO = CREDITO;
                SELECT SUM(CDEN_MONTO) FROM CAMBIODOC_ENTRADAS WHERE
                    CADO_ID = :ID AND FOPA_ID = 1 INTO :CREFECTIVO;
                if (CREFECTIVO IS NULL) then
                    CREFECTIVO = 0;
                CRCHEQUES = CREDITO - CREFECTIVO;
                TERCERO = '';
                SELECT SUM(CDSA_MONTO) FROM CAMBIODOC_SALIDAS WHERE
                    CADO_ID = :ID AND FOPA_ID = 1 INTO :DBEFECTIVO;
                if (DBEFECTIVO IS NULL) then
                    DBEFECTIVO = 0;
                DBCHEQUES = DEBITO - DBEFECTIVO;
                END
            if (TIPOCOD = 65) then
                BEGIN
                SELECT SUM(RPPA_MONTO) FROM RECIBO_PROVISIONAL_PAGO WHERE RCPR_ID = :ID AND FOPA_ID = 1 INTO :DBEFECTIVO;
                if (DBEFECTIVO IS NULL) then
                    DBEFECTIVO = 0;
                DBCHEQUES = DEBITO - DBEFECTIVO;
                SELECT TERC_NOM from TERCEROS T, RECIBO_PROVISIONAL R WHERE R.TERC_NIT = T.terc_nit AND RCPR_ID = :ID INTO :TERCERO;
                END
            if (TIPOCOD = 66) then
                BEGIN
                SELECT SUM(TRCD_MONTO) FROM TRASLADOS_CAJA_DET WHERE TRCJ_ID = :ID AND FOPA_ID = 1 INTO :DBEFECTIVO;
                if (DBEFECTIVO IS NULL) then
                    DBEFECTIVO = 0;
                DBCHEQUES = DEBITO - DBEFECTIVO;
                TERCERO = '';
                END
            if (TIPOCOD = 77) then
                BEGIN
                DBCHEQUES = DEBITO;
                TERCERO = '';
                END
            END
        ELSE
            BEGIN
            if (TIPOCOD = 62) then
                BEGIN
                SELECT SUM(EGCA_MONTO) FROM EGRESOS_CAJA WHERE EGRE_ID = :ID AND FOPA_ID = 1 AND CAJA_ID = :CODIGO INTO :CREFECTIVO;
                if (CREFECTIVO IS NULL) then
                    CREFECTIVO = 0;
                CRCHEQUES = CREDITO - CREFECTIVO;
                SELECT TERC_NOM from TERCEROS T, EGRESOS E WHERE E.TERC_NIT = T.terc_nit AND EGRE_ID = :ID INTO :TERCERO;
                END
            if (TIPOCOD = 63) then
                BEGIN
                DEBITO = CREDITO;
                SELECT SUM(CDEN_MONTO) FROM CAMBIODOC_ENTRADAS WHERE
                    CADO_ID = :ID AND FOPA_ID = 1 INTO :CREFECTIVO;
                if (CREFECTIVO IS NULL) then
                    CREFECTIVO = 0;
                CRCHEQUES = CREDITO - CREFECTIVO;
                TERCERO = '';
                SELECT SUM(CDSA_MONTO) FROM CAMBIODOC_SALIDAS WHERE
                    CADO_ID = :ID AND FOPA_ID = 1 INTO :DBEFECTIVO;
                if (DBEFECTIVO IS NULL) then
                    DBEFECTIVO = 0;
                DBCHEQUES = DEBITO - DBEFECTIVO;
                END
            if (TIPOCOD = 64) then
                BEGIN
                CRCHEQUES = CREDITO;
                TERCERO = '';
                END
            if (TIPOCOD = 66) then
                BEGIN
                SELECT SUM(TRCD_MONTO) FROM TRASLADOS_CAJA_DET WHERE TRCJ_ID = :ID AND FOPA_ID = 1 INTO :CREFECTIVO;
                if (CREFECTIVO IS NULL) then
                    CREFECTIVO = 0;
                CRCHEQUES = CREDITO - CREFECTIVO;
                TERCERO = '';
                END
            if (TIPOCOD = 71) then
                BEGIN
                SELECT SUM(CODE_MONTO) FROM CONSIGNA_DETALLE WHERE CONS_ID = :ID AND FOPA_ID = 1 INTO :CREFECTIVO;
                if (CREFECTIVO IS NULL) then
                    CREFECTIVO = 0;
                CRCHEQUES = CREDITO - CREFECTIVO;
                TERCERO = '';
                END
            END
        SALDO = SALDO + DEBITO - CREDITO;
        SUSPEND;
        END
    END
  ELSE
    BEGIN
    SELECT COUNT(SACA_FECHA) FROM SALDO_CAJA
        WHERE CAJA_ID = :CODIGO AND SACA_FECHA >= :FECINI AND SACA_FECHA <= :FECFIN INTO :NUMROWS;
    if (NUMROWS = 0) then
        BEGIN
        EXECUTE PROCEDURE SALDO_EN_CAJA(:CODIGO, :FECINI) returning_values(:SALDOINICIAL);
        SALDO =SALDOINICIAL;
        TIPO = '';
        PREFIJO = '';
        NUMERO = '';
        CONCEPTO = '';
        DEBITO = 0;
        CREDITO = 0;
        DBEFECTIVO = 0;
        CREFECTIVO = 0;
        DBCHEQUES = 0;
        CRCHEQUES = 0;
        SUSPEND;
        END
    ELSE
        FOR SELECT SACA_FECHA, SACA_SALDO, SACA_DEBITOS, SACA_CREDITOS
            FROM SALDO_CAJA
            WHERE CAJA_ID = :CODIGO AND SACA_FECHA >= :FECINI AND SACA_FECHA <= :FECFIN
            ORDER BY SACA_FECHA
            INTO :fecha, :SALDOINICIAL, :DBEFECTIVO, :CREFECTIVO
            DO
                BEGIN
                /* sume los cambios de documento
                SELECT SUM(CDEN_MONTO) FROM cambiodoc_entradas E, cambio_documentos C
                    WHERE C.CADO_FECHA = :fecha AND c.cado_anulado = 'N' and C.CAJA_ID = :CODIGO AND C.CADO_ID = E.CADO_ID INTO :dbcheques;
                if (dbcheques is null) then
                    dbcheques = 0;
                DBEFECTIVO = DBEFECTIVO + DBCHEQUES;
                CREFECTIVO = CREFECTIVO + DBCHEQUES; */
                DBCHEQUES = 0;
                SALDO = SALDOINICIAL + DBEFECTIVO - CREFECTIVO;
                SUSPEND;
                END
    END
  end
END
^

SET TERM ; ^


/* 20091027B */

/* IMPRESION DE CRUCES EN RECIBOS Y EGRESOS */
SET TERM ^ ;

create or alter procedure IMPR_CRUCES (
    TIPO integer,
    ID integer)
returns (
    ITEMDOC integer,
    TIPODOC varchar(8),
    IDDOC integer,
    PREFDOC varchar(4),
    NUMDOC varchar(6),
    NUMPRV varchar(10),
    ABONODOC numeric(18,2),
    RTFTEDOC numeric(18,2),
    RTIVADOC numeric(18,2),
    RTICADOC numeric(18,2),
    DSCTODOC numeric(18,2),
    SALDODOC numeric(18,2),
    ANTERDOC numeric(18,2),
    SALDOTER numeric(18,2))
AS
declare variable NIT VARCHAR(20);
declare variable FECHA DATE;
BEGIN
if (TIPO = 61) then
    BEGIN
    SELECT TERC_NIT, RECA_FECHA FROM recibos_caja WHERE RECA_ID = :id INTO :NIT, :FECHA;
    select SALDO from saldo_proveedor(:NIT, :FECHA, 0) into :SALDOTER;
    FOR SELECT RCCR_ITEM, RCCR_TIPODOC, RCCR_IDDOC, RCCR_PREFIJO, RCCR_NUMERO, RCCR_ABONO, RCCR_RTFTE, RCCR_RTIVA, RCCR_RTICA, RCCR_DTOF, RCCR_NUMPROV
        FROM recibos_caja_crucec WHERE RECA_ID = :id
        INTO :itemdoc, :tipodoc, :iddoc, :prefdoc, :numdoc, :abonodoc, :rtftedoc, :rtivadoc, :rticadoc, :dsctodoc, :numprv
        DO
        BEGIN
        EXECUTE PROCEDURE saldo_doc_cxpagar(:tipodoc, :iddoc, :FECHA, 0) returning_values (:saldodoc);
        SELECT TIDO_NOMCORTO FROM tipo_documento WHERE TIDO_COD = :tipodoc INTO :tipodoc;
        ANTERDOC = SALDODOC + RTFTEDOC + RTIVADOC + RTICADOC + ABONODOC + DSCTODOC;
        SUSPEND;
        END
    END
if (TIPO = 62) then
    BEGIN
    SELECT TERC_NIT, EGRE_FECHA FROM EGRESOS WHERE EGRE_ID = :id INTO :NIT, :FECHA;
    select SALDO from saldo_cliente(:NIT, :FECHA, 0) into :SALDOTER;
    FOR SELECT EGCC_ITEM, EGCC_TIPODOC, EGCC_IDDOC, EGCC_PREFIJO, EGCC_NUMERO, EGCC_ABONO, EGCC_RTFTE, EGCC_RTIVA, EGCC_RTICA, EGCC_DTOF, EGCC_SUCURSAL
        FROM egresos_crucec WHERE EGRE_ID = :id
        INTO :itemdoc, :tipodoc, :iddoc, :prefdoc, :numdoc, :abonodoc, :rtftedoc, :rtivadoc, :rticadoc, :dsctodoc, :numprv
        DO
        BEGIN
        EXECUTE PROCEDURE saldo_doc_cartera(:tipodoc, :iddoc, :FECHA, 0) returning_values (:saldodoc);
        SELECT TIDO_NOMCORTO FROM tipo_documento WHERE TIDO_COD = :tipodoc INTO :tipodoc;
        ANTERDOC = SALDODOC + RTFTEDOC + RTIVADOC + RTICADOC + ABONODOC + DSCTODOC;
        SUSPEND;
        END
    END
END
^

SET TERM ; ^

grant EXECUTE on PROCEDURE impr_cruces to public;


INSERT INTO FORMATO_DATOS (TIDO_COD, PREF_PRE, DAFO_DATO, DAFO_IMPRIME, DAFO_POSX, DAFO_POSY, DAFO_FORMATO, DAFO_LONG, DAFO_REPITE, DAFO_FONT, DAFO_FSIZE, DAFO_LIQUIDA, DAFO_POSYVAR, DAFO_ITEM, DAFO_INI, DAFO_CORTARPALABRAS, DAFO_JUSTIFICA) VALUES (62, '0000', 'CRUCE ANTERIOR', 'N', 690, 1390, '0', NULL, 'S', 'Draft 17cpi', 9, 'N', 'N', 3213, 1, 'S', 'I');
INSERT INTO FORMATO_DATOS (TIDO_COD, PREF_PRE, DAFO_DATO, DAFO_IMPRIME, DAFO_POSX, DAFO_POSY, DAFO_FORMATO, DAFO_LONG, DAFO_REPITE, DAFO_FONT, DAFO_FSIZE, DAFO_LIQUIDA, DAFO_POSYVAR, DAFO_ITEM, DAFO_INI, DAFO_CORTARPALABRAS, DAFO_JUSTIFICA) VALUES (62, '0000', 'CRUCE TIPO', 'N', 100, 1390, NULL, 20, 'S', 'Draft 17cpi', NULL, 'N', 'N', 3214, 1, 'S', 'I');
INSERT INTO FORMATO_DATOS (TIDO_COD, PREF_PRE, DAFO_DATO, DAFO_IMPRIME, DAFO_POSX, DAFO_POSY, DAFO_FORMATO, DAFO_LONG, DAFO_REPITE, DAFO_FONT, DAFO_FSIZE, DAFO_LIQUIDA, DAFO_POSYVAR, DAFO_ITEM, DAFO_INI, DAFO_CORTARPALABRAS, DAFO_JUSTIFICA) VALUES (62, '0000', 'CRUCE PREFIJO', 'N', 290, 1390, NULL, 5, 'S', 'Draft 17cpi', NULL, 'N', 'N', 3215, 1, 'S', 'I');
INSERT INTO FORMATO_DATOS (TIDO_COD, PREF_PRE, DAFO_DATO, DAFO_IMPRIME, DAFO_POSX, DAFO_POSY, DAFO_FORMATO, DAFO_LONG, DAFO_REPITE, DAFO_FONT, DAFO_FSIZE, DAFO_LIQUIDA, DAFO_POSYVAR, DAFO_ITEM, DAFO_INI, DAFO_CORTARPALABRAS, DAFO_JUSTIFICA) VALUES (62, '0000', 'CRUCE NUMERO', 'N', 350, 1390, NULL, 10, 'S', 'Draft 17cpi', NULL, 'N', 'N', 3216, 1, 'S', 'I');
INSERT INTO FORMATO_DATOS (TIDO_COD, PREF_PRE, DAFO_DATO, DAFO_IMPRIME, DAFO_POSX, DAFO_POSY, DAFO_FORMATO, DAFO_LONG, DAFO_REPITE, DAFO_FONT, DAFO_FSIZE, DAFO_LIQUIDA, DAFO_POSYVAR, DAFO_ITEM, DAFO_INI, DAFO_CORTARPALABRAS, DAFO_JUSTIFICA) VALUES (62, '0000', 'CRUCE REFERENCIA', 'N', 450, 1390, NULL, 8, 'S', 'Draft 17cpi', 9, 'N', 'N', 3232, 1, 'S', 'I');
INSERT INTO FORMATO_DATOS (TIDO_COD, PREF_PRE, DAFO_DATO, DAFO_IMPRIME, DAFO_POSX, DAFO_POSY, DAFO_FORMATO, DAFO_LONG, DAFO_REPITE, DAFO_FONT, DAFO_FSIZE, DAFO_LIQUIDA, DAFO_POSYVAR, DAFO_ITEM, DAFO_INI, DAFO_CORTARPALABRAS, DAFO_JUSTIFICA) VALUES (62, '0000', 'CRUCE ABONO', 'N', 840, 1390, '0', 30, 'S', 'Draft 17cpi', 9, 'N', 'N', 3230, 1, 'S', 'I');
INSERT INTO FORMATO_DATOS (TIDO_COD, PREF_PRE, DAFO_DATO, DAFO_IMPRIME, DAFO_POSX, DAFO_POSY, DAFO_FORMATO, DAFO_LONG, DAFO_REPITE, DAFO_FONT, DAFO_FSIZE, DAFO_LIQUIDA, DAFO_POSYVAR, DAFO_ITEM, DAFO_INI, DAFO_CORTARPALABRAS, DAFO_JUSTIFICA) VALUES (62, '0000', 'CRUCE DESCUENTO', 'N', 1100, 1390, NULL, 30, 'S', 'Draft 17cpi', NULL, 'N', 'N', 3217, 1, 'S', 'I');
INSERT INTO FORMATO_DATOS (TIDO_COD, PREF_PRE, DAFO_DATO, DAFO_IMPRIME, DAFO_POSX, DAFO_POSY, DAFO_FORMATO, DAFO_LONG, DAFO_REPITE, DAFO_FONT, DAFO_FSIZE, DAFO_LIQUIDA, DAFO_POSYVAR, DAFO_ITEM, DAFO_INI, DAFO_CORTARPALABRAS, DAFO_JUSTIFICA) VALUES (62, '0000', 'CRUCE SALDO', 'N', 1400, 1390, NULL, NULL, 'S', 'Draft 17cpi', NULL, 'N', 'N', 3219, 1, 'S', 'I');
commit work;

/* 20091027C */
/* OPTIMIZACION DEL CUADRE DE CAJA */
CREATE INDEX APLICACION_CLIENTE_IDX1
ON APLICACION_CLIENTE (APCL_FECHA);

CREATE INDEX CONSIGNA_IDX3
ON CONSIGNA (CONS_FECHA);

CREATE INDEX MOVIMIENTO_CLIENTES_IDX5
ON MOVIMIENTO_CLIENTES (MVCL_FECHA);

CREATE INDEX EGRESOS_CAJA_IDX1
ON EGRESOS_CAJA (EGCA_FECHA);

SET TERM ^ ;

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

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure CUADRE_CAJA (
    FECHA date)
returns (
    VTACONTADO numeric(18,2),
    VTACREDITO numeric(18,2),
    VTATOTAL numeric(18,2),
    VTARETS numeric(18,2),
    DEVCONTADO numeric(18,2),
    DEVCREDITO numeric(18,2),
    DEVTOTAL numeric(18,2),
    DEVOTRODIA numeric(18,2),
    DEVRETS numeric(18,2),
    NETOCONTADO numeric(18,2),
    NETOCREDITO numeric(18,2),
    NETOTOTAL numeric(18,2),
    NETORETS numeric(18,2),
    INGCONTADO numeric(18,2),
    INGDESCTO numeric(18,2),
    INGCXC numeric(18,2),
    INGOTROS numeric(18,2),
    INGTOTAL numeric(18,2),
    EGRCXP numeric(18,2),
    EGROTROS numeric(18,2),
    EGRTOTAL numeric(18,2),
    CONSIGNA numeric(18,2),
    FORMAP1 numeric(18,2),
    FORMAP2 numeric(18,2),
    FORMAP3 numeric(18,2),
    FORMAP4 numeric(18,2),
    FORMAP5 numeric(18,2),
    FORMAP6 numeric(18,2),
    FORMAP7 numeric(18,2),
    FORMAP8 numeric(18,2),
    FORMAP9 numeric(18,2),
    FORMAP0 numeric(18,2))
AS
declare variable DEVDSCTOS NUMERIC(18,2);
declare variable APLIDEV NUMERIC(18,2);
declare variable APLIFAC NUMERIC(18,2);
declare variable IDDOC INTEGER;
declare variable FECDOC DATE;
declare variable APLICA NUMERIC(18,2);
begin
/* ventas totales */
SELECT SUM(FACT_TOTAL), SUM(FACT_RTFTEMONTO+FACT_RTIVAMONTO+FACT_RTICAMONTO) FROM FACTURAS WHERE FACT_FECHA = :FECHA AND FACT_ANULADO = 'N'
    INTO :VTATOTAL, :vtarets;
if (vtatotal IS NULL) then
    vtatotal = 0;
if (vtarets IS NULL) then
    vtarets = 0;
vtatotal = VTATOTAL - vtarets;
SELECT SUM(DEVT_TOTAL), SUM(DEVT_RTFTEMONTO+DEVT_RTIVAMONTO+DEVT_RTICAMONTO) FROM DEVOLUCIONES_VENTAS WHERE DEVT_FECHA = :FECHA AND DEVT_ANULADO = 'N'
    INTO :DEVTOTAL, :devrets;
if (devtotal IS NULL) then
    devtotal = 0;
if (devrets IS NULL) then
    devrets = 0;
devtotal = DEVTOTAL - DEVRETS;
/* ventas contado */
SELECT SUM(RCDE_ABONO), SUM(RCDE_DTOF) FROM RECIBOS_CAJA_DETALLE D, RECIBOS_CAJA R,  FACTURAS F
    WHERE FACT_FECHA = :FECHA AND D.rcde_tipodoc = 31 AND D.rcde_iddoc = F.fact_id AND R.reca_id = D.reca_id AND RECA_FECHA = :FECHA AND RCDE_ANULADO = 'N'
    INTO :vtacontado, :ingdescto;
SELECT SUM(RCDE_ABONO), SUM(RCDE_DTOF) FROM RECIBOS_CAJA_DETALLE D, RECIBOS_CAJA R,  DEVOLUCIONES_VENTAS V
    WHERE DEVT_FECHA = :FECHA AND D.rcde_tipodoc = 33 AND D.rcde_iddoc = V.devt_id AND R.reca_id = D.reca_id AND RECA_FECHA = :FECHA AND RCDE_ANULADO = 'N'
    INTO :devcontado, :devdsctos;
if (vtacontado IS NULL) then
    vtacontado = 0;
if (ingdescto IS NULL) then
    ingdescto = 0;
if (devcontado IS NULL) then
    devcontado = 0;
else
    devcontado = devcontado * -1;
if (devdsctos IS NULL) then
    devdsctos = 0;
SELECT SUM(ACDE_APLICADO) FROM APLICACION_CLIENTE_DETALLE D, APLICACION_CLIENTE R,  FACTURAS F
    WHERE FACT_FECHA = :FECHA AND D.acde_tipodoc = 31 AND D.acde_iddoc = F.fact_id AND R.apcl_id = D.apcl_id AND APCL_FECHA = :FECHA AND ACDE_ANULADO = 'N'
    INTO :aplifac;
if (APLIFAC IS NULL) then
    APLIFAC = 0;
vtacontado = vtacontado + aplifac;
/* DESGLOCE LAS DEV DE HOY DE LAS DE AYER */
APLIDEV = 0;
devotrodia = 0;
FOR SELECT D.acde_iddoc, ACDE_APLICADO FROM APLICACION_CLIENTE_DETALLE D, APLICACION_CLIENTE R
    WHERE R.apcl_id = D.apcl_id AND APCL_FECHA = :FECHA AND ACDE_ANULADO = 'N' AND D.acde_tipodoc = 33
    INTO :IDDOC, :aplica
    DO
    BEGIN
    SELECT DEVT_FECHA, DEVT_FACTID FROM DEVOLUCIONES_VENTAS WHERE DEVT_ID = :IDDOC INTO :FECDOC, :IDDOC;
    SELECT FACT_FECHA FROM FACTURAS WHERE FACT_ID = :IDDOC INTO :FECDOC;
    if (FECDOC = FECHA) then
        APLIDEV = APLIDEV + aplica;
    ELSE
        devotrodia = devotrodia + APLICA;
    END
aplidev = aplidev * -1;
devotrodia = devotrodia * -1;
devtotal = devtotal - devotrodia;
devcontado = devcontado + aplidev;
/* Ventas credito */
vtacredito = vtatotal - vtacontado;
devcredito = devtotal - devcontado;
netocontado = vtacontado - devcontado;
netocredito = vtacredito - devcredito;
netototal = vtatotal - devtotal;
netorets = vtarets - devrets;
/* recibos contado */
ingcontado = vtacontado - devcontado;
ingdescto = ingdescto - devdsctos;

/* recibos totales */
select sum(reca_monto) from recibos_caja where reca_fecha = :fecha AND RECA_ANULADO = 'N' into :ingtotal;
if (ingtotal IS NULL) then
    ingtotal = 0;
/* recibos otros */
select sum(reca_monto) from recibos_caja r where reca_fecha = :fecha AND RECA_ANULADO = 'N' and NOT EXISTS (select reca_id from recibos_caja_detalle WHERE RECA_ID = R.reca_id) into :ingotros;
if (ingotros IS NULL) then
    ingotros = 0;
/* recibos cxc */
select sum(rcde_abono) from recibos_caja_detalle d, recibos_caja r,  movimiento_clientes m
    where r.reca_id = d.reca_id and r.reca_fecha = :fecha and d.rcde_tipodoc = m.mvcl_tiporef and d.rcde_iddoc = m.mvcl_idref AND RCDE_ANULADO = 'N' AND ((MVCL_TIPOREF <> 31 AND MVCL_TIPOREF <> 33) OR mvcl_fecha <> :fecha)
    into :ingcxc;
if (ingcxc IS NULL) then
    ingcxc = 0;

/* EGRESOS totales */
select sum(egca_monto) from egresos e, egresos_caja c where e.egre_id = c.egre_id and C.egca_fecha = :fecha AND E.egre_anulado = 'N' into :egrtotal;
if (egrtotal IS NULL) then
    egrtotal = 0;
/* EGRESOS otros */
select sum(egca_monto) from egresos e, egresos_caja c where e.egre_id = c.egre_id and C.egca_fecha = :fecha AND E.egre_anulado = 'N' and
    not exists (select egre_id from egresos_detalle WHERE EGRE_ID = E.egre_id) into :egrotros;
if (egrotros IS NULL) then
    egrotros = 0;
/* EGRESOS cxp */
egrcxp = egrtotal - egrotros;

/* CONSIGNACIONES */
select sum(code_monto) from consigna c, consigna_detalle d
    where c.cons_id = d.cons_id and cons_fecha = :fecha AND CONS_ANULADO = 'N' into :consigna;
if (consigna IS NULL) then
    consigna = 0;

/* POR FORMA DE PAGO */
SELECT SUM(RCPA_MONTO) FROM RECIBOS_CAJA_PAGO P, RECIBOS_CAJA R
    WHERE R.RECA_ID = P.RECA_ID AND RECA_FECHA = :FECHA AND FOPA_ID = 1 and RECA_ANULADO = 'N'
    INTO :FORMAP1;
SELECT SUM(RCPA_MONTO) FROM RECIBOS_CAJA_PAGO P, RECIBOS_CAJA R
    WHERE R.RECA_ID = P.RECA_ID AND RECA_FECHA = :FECHA AND FOPA_ID = 2 and RECA_ANULADO = 'N'
    INTO :FORMAP2;
SELECT SUM(RCPA_MONTO) FROM RECIBOS_CAJA_PAGO P, RECIBOS_CAJA R
    WHERE R.RECA_ID = P.RECA_ID AND RECA_FECHA = :FECHA AND FOPA_ID = 3 and RECA_ANULADO = 'N'
    INTO :FORMAP3;
SELECT SUM(RCPA_MONTO) FROM RECIBOS_CAJA_PAGO P, RECIBOS_CAJA R
    WHERE R.RECA_ID = P.RECA_ID AND RECA_FECHA = :FECHA AND FOPA_ID = 4 and RECA_ANULADO = 'N'
    INTO :FORMAP4;
SELECT SUM(RCPA_MONTO) FROM RECIBOS_CAJA_PAGO P, RECIBOS_CAJA R
    WHERE R.RECA_ID = P.RECA_ID AND RECA_FECHA = :FECHA AND FOPA_ID = 5 and RECA_ANULADO = 'N'
    INTO :FORMAP5;
SELECT SUM(RCPA_MONTO) FROM RECIBOS_CAJA_PAGO P, RECIBOS_CAJA R
    WHERE R.RECA_ID = P.RECA_ID AND RECA_FECHA = :FECHA AND FOPA_ID = 6 and RECA_ANULADO = 'N'
    INTO :FORMAP6;
SELECT SUM(RCPA_MONTO) FROM RECIBOS_CAJA_PAGO P, RECIBOS_CAJA R
    WHERE R.RECA_ID = P.RECA_ID AND RECA_FECHA = :FECHA AND FOPA_ID = 7 and RECA_ANULADO = 'N'
    INTO :FORMAP7;
SELECT SUM(RCPA_MONTO) FROM RECIBOS_CAJA_PAGO P, RECIBOS_CAJA R
    WHERE R.RECA_ID = P.RECA_ID AND RECA_FECHA = :FECHA AND FOPA_ID = 8 and RECA_ANULADO = 'N'
    INTO :FORMAP8;
SELECT SUM(RCPA_MONTO) FROM RECIBOS_CAJA_PAGO P, RECIBOS_CAJA R
    WHERE R.RECA_ID = P.RECA_ID AND RECA_FECHA = :FECHA AND FOPA_ID = 9 and RECA_ANULADO = 'N'
    INTO :FORMAP9;
SELECT SUM(RCPA_MONTO) FROM RECIBOS_CAJA_PAGO P, RECIBOS_CAJA R
    WHERE R.RECA_ID = P.RECA_ID AND RECA_FECHA = :FECHA AND FOPA_ID = 10 and RECA_ANULADO = 'N'
    INTO :FORMAP0;
if (formap1 is null) then
    formap1 = 0;
if (formap2 is null) then
    formap2 = 0;
if (formap3 is null) then
    formap3 = 0;
if (formap4 is null) then
    formap4 = 0;
if (formap5 is null) then
    formap5 = 0;
if (formap6 is null) then
    formap6 = 0;
if (formap7 is null) then
    formap7 = 0;
if (formap8 is null) then
    formap8 = 0;
if (formap9 is null) then
    formap9 = 0;
if (formap0 is null) then
    formap0 = 0;
SUSPEND;
end
^

SET TERM ; ^

/* 20091027D */
/* afectaba el movimiento pero no el saldo, ahora no afecta ninguno de los dos */
SET TERM ^ ;

CREATE OR ALTER TRIGGER RECIBOS_CAJA_PAGO_AI FOR RECIBOS_CAJA_PAGO
ACTIVE AFTER INSERT POSITION 0
AS
declare variable Fec DATE;
declare variable Caja integer;
declare variable Conc VARCHAR(60);
declare variable Pref varchar(4);
declare variable Num varchar(6);
declare variable Existe char(1);
declare variable CONS CHAR(1);
declare variable CTABCO INTEGER;
declare variable PREFBCO VARCHAR(4);
declare variable TARJ VARCHAR(3);
declare variable IDCONS INTEGER;
declare variable COMIP NUMERIC(9,2);
declare variable RTFTEP NUMERIC(9,2);
declare variable RTIVAP NUMERIC(9,2);
declare variable RTICAP NUMERIC(9,2);
declare variable COMI NUMERIC(18,2);
declare variable RTFTE NUMERIC(18,2);
declare variable RTIVA NUMERIC(18,2);
declare variable RTICA NUMERIC(18,2);
declare variable FPBONO INTEGER;
BEGIN
if ((new.reca_id <> 0) and (new.rcpa_anulado = 'N')) then
  begin
  /* Actualice el total del movimiento en caja */
  select reca_fecha, caja_id, reca_conc, pref_pre, reca_numero from recibos_caja
    where reca_id = new.reca_id into :Fec, :Caja, :Conc, :Pref, :Num;
  execute procedure lee_configuracion('FACTURACION', 'ARTICULOS', 'FORMA DE PAGO PARA BONOS FACTURADOS') returning_values (:FPBONO);
  if (NEW.fopa_id <> :fpbono) then
    BEGIN
    select 'S' from movimiento_caja where moca_tiporef = 61 and moca_idref = new.reca_id into :Existe;
    if (Existe = 'S') then
      update movimiento_caja
        set moca_debitos = moca_debitos + new.rcpa_monto
        where moca_tiporef = 61 and moca_idref = new.reca_id;
    else
        INSERT INTO MOVIMIENTO_CAJA
            (MOCA_ID, CAJA_ID, MOCA_TIPOREF, MOCA_PREFREF, MOCA_NUMREF, MOCA_FECHA, MOCA_CONC, MOCA_DEBITOS, MOCA_CREDITOS, MOCA_DB, MOCA_IDREF)
            VALUES(GEN_ID(id_movcaja,1), :Caja, 61, :Pref, :Num, :Fec, :Conc, NEW.rcpa_monto, 0, 'S', new.reca_id);

    /* GRABE EL DOCUMENTO DE PAGO EN CAJA */
    if (NEW.FOPA_ID <> 1) then
      INSERT INTO DOCUMENTOS_PAGO_CAJA (DPCA_ID, FOPA_ID, CAJA_ID, DPCA_BANCO, DPCA_CUENTA, DPCA_NUMERO, DPCA_FECHA, DPCA_MONTO, DPCA_TIPOENT, DPCA_IDENT, DPCA_TIPOSAL, DPCA_IDSAL)
        VALUES (GEN_ID(ID_DOCPAGOCAJA, 1), NEW.FOPA_ID, :CAJA, NEW.RCPA_BANCO, NEW.RCPA_CUENTA, NEW.RCPA_NUMERO, NEW.RCPA_FECHA, NEW.RCPA_MONTO, 61, NEW.RECA_ID, 0, 0);
    else
      EXECUTE PROCEDURE SUME_SALDO_EFECTIVO (:CAJA, :FEC, NEW.RCPA_MONTO, 'N');

    /* SI ES DE CONSIGNACION LA FORMA GRABELA */
    SELECT FOPA_CONSIGNA, FOPA_CTABCO, FOPA_PREFBCO, FOPA_TARJETA FROM FORMAS_PAGO
        WHERE FOPA_ID = NEW.fopa_id INTO :CONS, :CTABCO, :PREFBCO, :TARJ;
    if (CONS = 'S') then
        begin
        if ((TARJ IS NULL) OR (TARJ = '')) then
            BEGIN
            if ((CTABCO <> 0) AND (PREFBCO <> '')) then
                BEGIN
                /* CONSIGNACION */
                IDCONS = GEN_ID(ID_CONSIGNA, 1);
                INSERT INTO CONSIGNA (CONS_ID, CUBA_COD, PRBA_PREF, CONS_NUMERO, CONS_FECHA, CONS_CONCEPTO, CONS_ANULADO, CONS_TRANSMIT, NUMOK)
                    VALUES (:idcons, :CTABCO, :prefbco, SUBSTR(NEW.rcpa_numero, 1, 6), :fec, :conc, 'N', 'N', 'N');
                INSERT INTO CONSIGNA_DETALLE (CONS_ID, CODE_ITEM2, FOPA_ID, CODE_BANCO, CODE_CUENTA, CODE_NUMERO, CODE_FECHA, CODE_MONTO, CODE_ANULADO, CODE_TRANSMIT, CAJA_ID, CODE_DEVUELTO)
                    VALUES (:idcons, 1, new.fopa_id, NEW.rcpa_banco, NEW.rcpa_cuenta, NEW.rcpa_numero, NEW.rcpa_fecha, NEW.rcpa_monto, 'N', 'N', :caja, 'N');

                insert into consolidado_faltantes (cofa_id, cofa_item, cofa_tipoori, cofa_tipodes, cofa_iddes, cofa_idori, cofa_itemori, cofa_ok, cofa_lista, cofa_unidad)
                    values (gen_id(id_cons, 1), 1, 61, 71, :idcons, new.reca_id, new.rcpa_item, 'N', :ctabco, :prefbco);
                END
            END
        ELSE
            BEGIN
            /* CONSIGNACION DE TARJETA */
            if ((CTABCO <> 0) AND (PREFBCO <> '')) then
                BEGIN
                select TARJ_COMIPORC, TARJ_RTFTEPORC, TARJ_RTIVAPORC, TARJ_RTICAPORC FROM TARJETAS WHERE TARJ_COD = :tarj
                    INTO :comip, :rtftep, :rtivap, :rticap;
                COMI = (NEW.rcpa_monto-NEW.rcpa_ivamonto) * :comip / 100;
                EXECUTE PROCEDURE REDONDEE (COMI,0) returning_values (COMI);
                RTFTE = (NEW.rcpa_monto-NEW.rcpa_ivamonto) * :rtftep / 100;
                EXECUTE PROCEDURE REDONDEE (RTFTE,0) returning_values (RTFTE);
                RTIVA = NEW.rcpa_ivamonto * :rtivap / 100;
                EXECUTE PROCEDURE REDONDEE (RTIVA,0) returning_values (RTIVA);
                RTICA = (NEW.rcpa_monto-NEW.rcpa_ivamonto) * :rticap / 1000;
                EXECUTE PROCEDURE REDONDEE (RTICA,0) returning_values (RTICA);
                IDCONS = GEN_ID(ID_CONSIGNATAR, 1);
                INSERT INTO CONSIGNA_TARJETAS (COTJ_ID, PREF_PRE, COTJ_NUMERO, COTJ_FECHA, COTJ_CONCEPTO, COTJ_CHEQUE, CUBA_COD,
                    COTJ_MONTO, COTJ_RTFTE, COTJ_COMISION, COTJ_RTIVA, COTJ_RTICA, COTJ_ANULADO, COTJ_TRANSMIT, NUMOK, CAJA_ID)
                    VALUES (:idcons, :prefbco, SUBSTR(NEW.rcpa_numero, 1, 6), :fec, :conc, 'N', :ctabco,
                    new.rcpa_monto-:COMI-:RTFTE-:RTIVA-:RTICA, :rtfte, :COMI, :rtiva, :rtica, 'N', 'N', 'N', :caja);
                INSERT INTO CONSIGNA_TARJETAS_DET (COTJ_ID, CTJD_ITEM, TARJ_COD, CTJD_NROTJ, CTJD_COMPROB, CTJD_BASE, CTJD_IVA, CTJD_COMIPORC, CTJD_COMIIVA, CTJD_COMIMONTO,
                    CTJD_RTFTEPORC, CTJD_RTFTEMONTO, CTJD_RTIVAPOC, CTJD_RTIVAMONTO, CTJD_ANULADO, CTJD_TRANSMIT, FOPA_ID, CTJD_RTICAPORC, CTJD_RTCAMONTO)
                    VALUES (:idcons, 1, NEW.rcpa_banco, NEW.rcpa_cuenta, NEW.rcpa_numero, new.rcpa_monto, NEW.rcpa_ivamonto, :COMIP, 'N', :comi,
                    :rtftep, :rtfte, :rtivap, :rtiva, 'N', 'N', new.fopa_id, :rticap, :rtica);
                    
                insert into consolidado_faltantes (cofa_id, cofa_item, cofa_tipoori, cofa_tipodes, cofa_iddes, cofa_idori, cofa_itemori, cofa_ok, cofa_lista, cofa_unidad)
                    values (gen_id(id_cons, 1), 1, 61, 64, :idcons, new.reca_id, new.rcpa_item, 'N', :ctabco, :prefbco);
                END
            END
        end
    END
  end
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER RECIBOS_CAJA_PAGO_AU FOR RECIBOS_CAJA_PAGO
ACTIVE AFTER UPDATE POSITION 0
as
declare variable Fec date;
declare variable Caja integer;
declare variable Conc VARCHAR(60);
declare variable Pref varchar(4);
declare variable Num varchar(6);
declare variable Existe char(1);
declare variable TIPOCON INTEGER;
declare variable CONS CHAR(1);
declare variable CTABCO INTEGER;
declare variable PREFBCO VARCHAR(4);
declare variable TARJ VARCHAR(3);
declare variable IDCONS INTEGER;
declare variable COMIP NUMERIC(9,2);
declare variable RTFTEP NUMERIC(9,2);
declare variable RTIVAP NUMERIC(9,2);
declare variable RTICAP NUMERIC(9,2);
declare variable COMI NUMERIC(18,2);
declare variable RTFTE NUMERIC(18,2);
declare variable RTIVA NUMERIC(18,2);
declare variable RTICA NUMERIC(18,2);
declare variable FPBONO INTEGER;
declare variable DIASBONO INTEGER;
declare variable IDBONO INTEGER;
BEGIN
select reca_fecha, caja_id, reca_conc, pref_pre, reca_numero
    from recibos_caja where reca_id = new.reca_id
    into :Fec, :Caja, :Conc, :Pref, :Num;
execute procedure lee_configuracion('FACTURACION', 'ARTICULOS', 'FORMA DE PAGO PARA BONOS FACTURADOS') returning_values (:FPBONO);
if ((OLD.reca_id <> 0) AND (OLD.rcpa_anulado = 'N')) then
    begin
    if (old.fopa_id <> :fpbono) then
        begin
        /* anule la consignación */
        existe = 'N';
        select 'S', cofa_tipodes, cofa_iddes from consolidado_faltantes
            where cofa_tipoori = 61 and cofa_idori = old.reca_id and cofa_itemori = old.rcpa_item
            into :existe, :tipocon, :idcons;
        if (existe = 'S') then
            begin
            if (:tipocon = 71) then
                BEGIN
                DELETE FROM CONSIGNA_DETALLE WHERE CONS_ID = :idcons;
                DELETE FROM CONSIGNA WHERE CONS_ID = :idcons;
                END
            if (:tipocon = 64) then
                BEGIN
                DELETE FROM consigna_tarjetas_det WHERE COTJ_ID = :idcons;
                DELETE FROM consigna_tarjetas WHERE COTJ_ID = :idcons;
                END
            end
        /* Actualice el total del movimiento caja */
        select 'S' from movimiento_caja where moca_tiporef = 61 and moca_idref = new.reca_id into :Existe;
        if (Existe = 'S') then
            update movimiento_caja
                set moca_debitos = moca_debitos - new.rcpa_monto
                where moca_tiporef = 61 and moca_idref = new.reca_id;
        /* BORRE EL DOCUMENTO EN CAJA */
        if (OLD.FOPA_ID <> 1) then
            DELETE FROM DOCUMENTOS_PAGO_CAJA WHERE DPCA_TIPOENT = 61 AND DPCA_IDENT = OLD.RECA_ID AND
                DPCA_BANCO = OLD.RCPA_BANCO AND DPCA_CUENTA = OLD.RCPA_CUENTA AND DPCA_NUMERO = OLD.RCPA_NUMERO AND DPCA_MONTO = OLD.rcpa_monto;
        ELSE
            EXECUTE PROCEDURE SUME_SALDO_EFECTIVO (:CAJA, :FEC, OLD.RCPA_MONTO, 'S');
        end
    else
        update bonos_pago set bopa_idrdc = 0 where bopa_idrdc = old.reca_id;
    end

if ((new.reca_id <> 0) AND (new.rcpa_anulado = 'N')) then
    begin
    existe = 'N';

    if (NEW.fopa_id <> :fpbono) then
        BEGIN
        select 'S' from movimiento_caja where moca_tiporef = 61 and moca_idref = new.reca_id into :Existe;
        if (Existe = 'S') then
            update movimiento_caja
                set moca_debitos = moca_debitos + new.rcpa_monto
                where moca_tiporef = 61 and moca_idref = new.reca_id;
        else
            INSERT INTO MOVIMIENTO_CAJA
                (MOCA_ID, CAJA_ID, MOCA_TIPOREF, MOCA_PREFREF, MOCA_NUMREF, MOCA_FECHA, MOCA_CONC, MOCA_DEBITOS, MOCA_CREDITOS, MOCA_DB, MOCA_IDREF)
                VALUES(GEN_ID(id_movcaja,1), :Caja, 61, :Pref, :Num, :Fec, :Conc, NEW.rcpa_monto, 0, 'S', new.reca_id);
        /* GRABE EL DOCUMENTO DE PAGO EN CAJA */
        if (NEW.FOPA_ID <> 1) then
            INSERT INTO DOCUMENTOS_PAGO_CAJA (DPCA_ID, FOPA_ID, CAJA_ID, DPCA_BANCO, DPCA_CUENTA, DPCA_NUMERO, DPCA_FECHA, DPCA_MONTO, DPCA_TIPOENT, DPCA_IDENT, DPCA_TIPOSAL, DPCA_IDSAL)
                VALUES (GEN_ID(ID_DOCPAGOCAJA, 1), NEW.FOPA_ID, :CAJA, NEW.RCPA_BANCO, NEW.RCPA_CUENTA, NEW.RCPA_NUMERO, NEW.RCPA_FECHA, NEW.RCPA_MONTO, 61, NEW.RECA_ID, 0, 0);
        ELSE
            EXECUTE PROCEDURE SUME_SALDO_EFECTIVO (:CAJA, :FEC, NEW.RCPA_MONTO, 'N');

        /* SI ES DE CONSIGNACION LA FORMA GRABELA */
        SELECT FOPA_CONSIGNA, FOPA_CTABCO, FOPA_PREFBCO, FOPA_TARJETA FROM FORMAS_PAGO
            WHERE FOPA_ID = NEW.fopa_id INTO :CONS, :CTABCO, :PREFBCO, :TARJ;
        if (CONS = 'S') then
            begin
            if ((TARJ IS NULL) OR (TARJ = '')) then
                BEGIN
                if ((CTABCO <> 0) AND (PREFBCO <> '')) then
                    BEGIN
                    /* CONSIGNACION */
                    IDCONS = GEN_ID(ID_CONSIGNA, 1);
                    INSERT INTO CONSIGNA (CONS_ID, CUBA_COD, PRBA_PREF, CONS_NUMERO, CONS_FECHA, CONS_CONCEPTO, CONS_ANULADO, CONS_TRANSMIT, NUMOK)
                        VALUES (:idcons, :ctabco, :prefbco, SUBSTR(NEW.rcpa_numero, 1, 6), :fec, :conc, 'N', 'N', 'N');
                    INSERT INTO CONSIGNA_DETALLE (CONS_ID, CODE_ITEM2, FOPA_ID, CODE_BANCO, CODE_CUENTA, CODE_NUMERO, CODE_FECHA, CODE_MONTO, CODE_ANULADO, CODE_TRANSMIT, CAJA_ID, CODE_DEVUELTO)
                        VALUES (:idcons, 1, new.fopa_id, NEW.rcpa_banco, NEW.rcpa_cuenta, NEW.rcpa_numero, NEW.rcpa_fecha, NEW.rcpa_monto, 'N', 'N', :caja, 'N');
                
                    insert into consolidado_faltantes (cofa_id, cofa_item, cofa_tipoori, cofa_tipodes, cofa_iddes, cofa_idori, cofa_itemori, cofa_ok, cofa_lista, cofa_unidad)
                        values (gen_id(id_cons, 1), 1, 61, 71, :idcons, new.reca_id, new.rcpa_item, 'N', :ctabco, :prefbco);
                    END
                END
            else
                BEGIN
                /* CONSIGNACION DE TARJETA */
                if ((ctabco <> 0) AND (PREFBCO <> '')) then
                    BEGIN
                select TARJ_COMIPORC, TARJ_RTFTEPORC, TARJ_RTIVAPORC, TARJ_RTICAPORC FROM TARJETAS WHERE TARJ_COD = :tarj
                    INTO :comip, :rtftep, :rtivap, :rticap;
                    COMI = (NEW.rcpa_monto-NEW.rcpa_ivamonto) * :comip / 100;
                    EXECUTE PROCEDURE REDONDEE (COMI,0) returning_values (COMI);
                    RTFTE = (NEW.rcpa_monto-NEW.rcpa_ivamonto) * :rtftep / 100;
                    EXECUTE PROCEDURE REDONDEE (RTFTE,0) returning_values (RTFTE);
                    RTIVA = NEW.rcpa_ivamonto * :rtivap / 100;
                    EXECUTE PROCEDURE REDONDEE (RTIVA,0) returning_values (RTIVA);
                    RTICA = (NEW.rcpa_monto-NEW.rcpa_ivamonto) * :rticap / 1000;
                    EXECUTE PROCEDURE REDONDEE (RTICA,0) returning_values (RTICA);
                    IDCONS = GEN_ID(ID_CONSIGNATAR, 1);
                    INSERT INTO CONSIGNA_TARJETAS (COTJ_ID, PREF_PRE, COTJ_NUMERO, COTJ_FECHA, COTJ_CONCEPTO, COTJ_CHEQUE, CUBA_COD,
                        COTJ_MONTO, COTJ_RTFTE, COTJ_COMISION, COTJ_RTIVA, COTJ_RTICA, COTJ_ANULADO, COTJ_TRANSMIT, NUMOK, CAJA_ID)
                        VALUES (:idcons, :prefbco, SUBSTR(NEW.rcpa_numero, 1, 6), :fec, :conc, 'N', :ctabco,
                        new.rcpa_monto-:COMI-:RTFTE-:RTIVA-:RTICA, :rtfte,  :COMI, :rtiva, :rtica, 'N', 'N', 'N', :caja);
                    INSERT INTO CONSIGNA_TARJETAS_DET (COTJ_ID, CTJD_ITEM, TARJ_COD, CTJD_NROTJ, CTJD_COMPROB, CTJD_BASE, CTJD_IVA, CTJD_COMIPORC, CTJD_COMIIVA, CTJD_COMIMONTO,
                        CTJD_RTFTEPORC, CTJD_RTFTEMONTO, CTJD_RTIVAPOC, CTJD_RTIVAMONTO, CTJD_ANULADO, CTJD_TRANSMIT, FOPA_ID, CTJD_RTICAPORC, CTJD_RTCAMONTO)
                        VALUES (:idcons, 1, NEW.rcpa_banco, NEW.rcpa_cuenta, NEW.rcpa_numero, new.rcpa_monto, NEW.rcpa_ivamonto, :COMIP, 'N', :comi,
                        :rtftep, :rtfte, :rtivap, :rtiva, 'N', 'N', new.fopa_id, :rticap, :rtica);
                    insert into consolidado_faltantes (cofa_id, cofa_item, cofa_tipoori, cofa_tipodes, cofa_iddes, cofa_idori, cofa_itemori, cofa_ok, cofa_lista, cofa_unidad)
                        values (gen_id(id_cons, 1), 1, 61, 64, :idcons, new.reca_id, new.rcpa_item, 'N', :ctabco, :prefbco);
                    END
                END
            end /* consignacion */
        END
    ELSE
        BEGIN
        /* BONOS DE PAGO */
        IDBONO = 0;
        execute procedure lee_configuracion('FACTURACION', 'ARTICULOS', 'VALIDEZ DE LOS BONOS DE PAGO') returning_values (:DIASBONO);
        SELECT FIRST 1 BOPA_ID FROM bonos_pago WHERE BOPA_MONTO = NEW.rcpa_monto AND (:FEC-BOPA_FECHA) < :diasbono
            AND BOPA_IDRDC = 0 INTO :IDBONO;
        if (IDBONO <> 0) Then
            update bonos_pago set bopa_idrdc = new.reca_id where bopa_id = :idbono;
        else
            exception no_hay_bono_de_pago 'No se encontró un bono disponible por valor de ' || new.rcpa_monto;
        END
    end
END
^

SET TERM ; ^

/* 20091028 */
/* NO INCLUYA LOS ARTICULOS SIN CONTROL DE EXISTENCIAS */

SET TERM ^ ;

CREATE OR ALTER procedure MOVIMIENTO_INVENTARIO_MES (
    FECINI date,
    FECFIN date)
returns (
    CODIGO varchar(15),
    DESCRIPCION varchar(60),
    CODGRP varchar(2),
    CODSUBG varchar(3),
    CODMARCA varchar(3),
    UNIDAD varchar(8),
    IVA numeric(9,2),
    INICIAL numeric(18,2),
    ENTRADA numeric(18,2),
    SALIDA numeric(18,2),
    FINAL numeric(18,2))
AS
BEGIN
  for select arti_cod, arti_des, GRUP_COD, SUBG_COD, MARC_COD, ARTI_UNIDAD, TAIV_PORC
    from articulo A, tarifa_iva T where A.taiv_cod = T.taiv_cod AND substring(arti_cod from 1 FOR 2) <> '.t' AND ARTI_EXIST <> 'N'
    into :CODIGO, :DESCRIPCION, :CODGRP, :CODSUBG, :codmarca, :UNIDAD, :IVA
  DO
    BEGIN
    EXECUTE PROCEDURE MOVIMIENTO_TOTAL_ARTICULO_MES(CODIGO, FECINI, FECFIN) returning_values (:INICIAL, :ENTRADA, :SALIDA);
    FINAL = INICIAL + ENTRADA - SALIDA;
    SUSPEND;
    END
END
^

SET TERM ; ^


SET TERM ^ ;

CREATE OR ALTER procedure KARDEX_INVENTARIO_MES (
    FECINI date,
    FECFIN date)
returns (
    CODIGO varchar(15),
    DESCRIPCION varchar(60),
    CODGRP varchar(2),
    CODSUBG varchar(3),
    CODMARCA varchar(3),
    UNIDAD varchar(8),
    IVA numeric(9,2),
    INICIAL numeric(18,2),
    ENTRADA numeric(18,2),
    SALIDA numeric(18,2),
    FINAL numeric(18,2))
AS
BEGIN
  for select arti_cod, arti_des, GRUP_COD, SUBG_COD, MARC_COD, ARTI_UNIDAD, TAIV_PORC
    from articulo A, tarifa_iva T where A.taiv_cod = T.taiv_cod AND substring(arti_cod from 1 FOR 2) <> '.t' AND ARTI_EXIST <> 'N'
    into :CODIGO, :DESCRIPCION, :CODGRP, :CODSUBG, :codmarca, :UNIDAD, :IVA
  DO
    BEGIN
    EXECUTE PROCEDURE KARDEX_ARTICULO_MES(CODIGO, FECINI, FECFIN) returning_values (:INICIAL, :ENTRADA, :SALIDA);
    FINAL = INICIAL + ENTRADA - SALIDA;
    SUSPEND;
    END
END
^

SET TERM ; ^


/* 20091029 */

INSERT INTO CONFIGURACION (CONF_MODULO, CONF_CATEGORIA, CONF_PROPIEDAD, CONF_VALOR, CONF_POSIBLES, CONF_AYUDA) VALUES ('FACTURACION', 'PEDIDOS', 'INGRESAR AL INVENTARIO PENDIENTES POR ENTREGAR', 'NO', 'NO,SIEMPRE,PREGUNTAR', 'PREGUNTAR:Pregunta si generar una entrada automática al grabar un pedido para controlar pendientes por entregar. SIEMPRE:Graba la entrada automática con cada pedido');
commit work;

ALTER TABLE PEDIDOS ADD PEDI_IDENTR T_ID;
ALTER TABLE PEDIDOS ADD PEDI_PENDIENTE T_BOOLEANO;

SET TERM ^ ;

CREATE OR ALTER TRIGGER PEDIDOS_BI FOR PEDIDOS
ACTIVE BEFORE INSERT POSITION 0
AS
declare variable NUMERO VARCHAR(6);
declare variable AUTOM CHAR(1);
declare variable EXISTE CHAR(1);
/*DECLARE VARIABLE VALCUPO CHAR(10);*/
declare variable CUPOPED CHAR(10);
declare variable DISPONIBLE NUMERIC(18,2);
declare variable OK CHAR(1);
declare variable FECSERVER CHAR(2);
declare variable ENTREGA char(9);
declare variable BOD char(2);
BEGIN
NEW.pedi_vence = NEW.pedi_fecha + NEW.pedi_validez;

EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION', 'DOCUMENTOS', 'INHABILITAR FECHA EN DOCUMENTOS') returning_values (:fecserver);
if (FECSERVER = 'SI') then
    NEW.pedi_fecha = CAST ('NOW' AS DATE);
OK = 'S';
/*EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'ACCION A TOMAR SI EL CUPO DE CREDITO ES INSUFICIENTE') RETURNING_VALUES (:VALCUPO);*/
EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION','PEDIDOS','VALIDAR CUPO DE CREDITO EN EL PEDIDO') RETURNING_VALUES (:CUPOPED);
IF (CUPOPED = 'PROHIBIR') THEN /*AND (CUPOPED = 'SI')) THEN*/
  BEGIN
  OK = 'N';
  /* VERIFIQUE EL CUPO DE CREDITO */
  execute procedure cupo_disponible(new.TERC_NIT, NEW.pedi_fecha, NEW.pedi_sucursal) returning_values (:DISPONIBLE);
  if (DISPONIBLE >= NEW.pedi_total) then
    OK = 'S';
  END
IF (OK = 'S') THEN
  begin
  if (NEW.NUMOK = 'N') then
    BEGIN
    /* Actualice el contador del prefijo */
    SELECT PREF_ACTUAL, PREF_AUTO FROM PREFIJOS WHERE TIDO_COD = 34 AND PREF_PRE = NEW.PREF_PRE INTO :NUMERO, :AUTOM;
    /* ACTUALICE EL NUMERO EN COMPROBANTE_ENCABEZADO  */
    if (AUTOM = 'S') then
        BEGIN
        NEW.PEDI_NUMERO = NUMERO;
        NUMERO = CAST((CAST(NUMERO AS INTEGER) + 1) AS CHAR(6));
        UPDATE PREFIJOS
          SET PREF_ACTUAL = :NUMERO
          WHERE TIDO_COD = 34 AND PREF_PRE = NEW.PREF_PRE;
        END
    ELSE
        BEGIN
        if (CAST(NUMERO AS INTEGER) = CAST(NEW.PEDI_NUMERO AS INTEGER)) then
            UPDATE PREFIJOS
                SET PREF_ACTUAL = CAST((CAST(PREF_ACTUAL AS INTEGER) + 1) AS CHAR(6))
                WHERE TIDO_COD = 34 AND PREF_PRE = NEW.PREF_PRE;
        END
    EXECUTE PROCEDURE COMPLETA_CEROS (NEW.PEDI_numero) returning_values (NEW.PEDI_numero);
    NEW.NUMOK = 'S';
    END
  /* Verifique que el numero no existe previamente */
  EXISTE = 'N';
  SELECT 'S' FROM PEDIDOS WHERE PREF_PRE = NEW.PREF_PRE AND PEDI_NUMERO = NEW.PEDI_NUMERO INTO :EXISTE;
  if (EXISTE = 'S') then
    EXCEPTION DOCUMENTO_REGISTRADO 'Ya existe un pedido con el número ' || new.pref_pre || new.pedi_numero;
  END
else
  begin
  EXCEPTION CUPO_INSUFICIENTE;
  end
if ((new.PEDI_TOTAL-new.PEDI_IVAMONTO+new.PEDI_DTOMONTO-new.PEDI_ADICIONAL) = 0) then
    NEW.PEDI_FACTOR = 1;
else
    NEW.PEDI_FACTOR = (new.PEDI_TOTAL-new.PEDI_IVAMONTO)/(new.PEDI_TOTAL-new.PEDI_IVAMONTO+new.PEDI_DTOMONTO-new.PEDI_ADICIONAL);

execute procedure lee_configuracion ('FACTURACION', 'PEDIDOS', 'INGRESAR AL INVENTARIO PENDIENTES POR ENTREGAR') returning_values (:entrega);
if ((ENTREGA <> 'NO') AND (NEW.PEDI_PENDIENTE = 'S')) then
    begin
    NEW.pedi_identr = gen_id(id_entrada, 1);
    SELECT BODE_COD FROM punto_venta WHERE PTVT_ID = NEW.ptvt_id INTO :BOD;
    insert into ENTRADAS (ENTR_ID, TIDO_COD, PREF_PRE, ENTR_NUMERO, BODE_COD, ENTR_FECHA, ENTR_CONC,
        ENTR_REFER, ENTR_TIPOREF, ENTR_IDREF, ENTR_IMPTOS, ENTR_NOMTERC, ENTR_ANULADO, ENTR_TRANSMIT, ENTR_OBS, TERC_NIT, NUMOK, ENTR_USUARIO)
        VALUES (NEW.pedi_identr, 11, new.pref_pre, NEW.pedi_numero, :bod, NEW.pedi_fecha, 'PENDIENTE POR ENTREGAR ' || NEW.pref_pre || NEW.pedi_numero || '-' || SUBSTRING(NEW.pedi_nomterc FROM 1 FOR 25),
        new.pref_pre || NEW.pedi_numero, 34, NEW.pedi_id, 'N', new.pedi_nomterc, 'N', 'N', new.pedi_obs, new.terc_nit, 'N', USER);
    end
else
    NEW.pedi_identr = 0;
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER PEDIDOS_DETALLE_AI FOR PEDIDOS_DETALLE
ACTIVE AFTER INSERT POSITION 0
as
declare variable CANTREL NUMERIC(18,2);
declare variable CONSO CHAR(2);
declare variable CONSOLIDA INTEGER;
declare variable IDENTR INTEGER;
declare variable COSTO NUMERIC(18,2);
declare variable IVA NUMERIC(9,2);
declare variable IVAM NUMERIC(18,2);
declare variable CONSUMO NUMERIC(18,2);
declare variable STAND VARCHAR(20);
declare variable LOTE VARCHAR(15);
declare variable FECHA DATE;
declare variable VLOTE DATE;
begin
if ((NEW.pedi_id <> 0) AND (NEW.pede_anulado = 'N')) then
    BEGIN
    SELECT PEDI_CONSOLIDA, PEDI_IDENTR, PEDI_FECHA FROM PEDIDOS WHERE PEDI_ID = NEW.PEDI_ID INTO :CONSOLIDA, :IDENTR, :FECHA;
    if (CONSOLIDA <> 0) then    
        begin
        UPDATE consolidado_faltantes SET COFA_OK = 'S' WHERE COFA_ID = :consolida AND COFA_ITEM = NEW.PEDE_ITEM AND ARTI_COD = NEW.arti_cod;
        EXECUTE procedure LEE_CONFIGURACION ('FACTURACION','DOCUMENTOS','DEJAR PENDIENTES LOS ARTICULOS NO INCLUIDOS AL TRAER DOCUMENTOS RELACIONADOS') returning_values (CONSO);
        if (CONSO = 'NO') then
            UPDATE consolidado_faltantes SET COFA_IDDES = NEW.pedi_id, COFA_OK = 'S' WHERE COFA_ID = :consolida;
        else
            BEGIN
            /* BUSQUE EL CONSOLIDADO EN EL MISMO ITEM Y SI ES DIFERENTE ACTUALICELO */
            select COFA_CANT FROM consolidado_faltantes WHERE COFA_ID = :consolida AND COFA_ITEM = NEW.PEDE_ITEM AND ARTI_COD = NEW.arti_cod INTO :CANTREL;
            if (NEW.PEDE_CANT * NEW.PEDE_FACTOR < CANTREL) then
                UPDATE consolidado_faltantes SET COFA_IDDES = NEW.pedi_id, COFA_CANT = NEW.PEDE_CANT * NEW.PEDE_FACTOR
                    WHERE COFA_ID = :consolida AND COFA_ITEM = NEW.PEDE_ITEM AND ARTI_COD = NEW.arti_cod;
            END
        end
    if (IDENTR <> 0) then
        begin
        EXECUTE PROCEDURE costo_promedio_unidad(NEW.arti_cod, :FECHA, NEW.pede_unidad) returning_values (:COSTO);
        SELECT ARTI_CONSUMO, TAIV_PORC FROM ARTICULO A, TARIFA_IVA T
            WHERE A.taiv_cod = T.taiv_cod AND A.arti_cod = NEW.arti_cod INTO :consumo, :iva;
        IVAM = COSTO * IVA;
        EXECUTE PROCEDURE seleccione_lote (NEW.arti_cod, NEW.bode_cod, NEW.pede_cant * NEW.pede_factor) returning_values (:LOTE);
        SELECT LOTE_VENCE FROM LOTES WHERE (ARTI_COD = NEW.arti_cod) AND (BODE_COD = NEW.bode_cod) AND (LOTE_NRO = :LOTE) INTO :VLOTE;
        SELECT STAND_COD FROM STANDS WHERE ARTI_COD = NEW.arti_cod AND STAND_BODEGA = NEW.bode_cod INTO :STAND;
        INSERT INTO ENTRADAS_DETALLE (ENTR_ID, ENDE_ITEM, ARTI_COD, BODE_COD, ENDE_CANT, ENDE_UNIDAD, ENDE_COSTO,
            ENDE_LOTE, ENDE_FACTOR, ENDE_DESC, ENDE_OBS, ENDE_DTOPORC, ENDE_DTOMONTO, ENDE_IVAPORC, ENDE_IVAMONTO,
            ENDE_CONSUMO, ENDE_CODBAR, ENDE_TOTAL, ENDE_ANULADO, ENDE_TRANSMIT, LOTE_VENCE, ENDE_STAND)
            VALUES(:IDENTR, NEW.pede_item, NEW.arti_cod, NEW.bode_cod, NEW.pede_cant, NEW.pede_unidad, :COSTO,
            :LOTE, NEW.pede_factor, NEW.pede_desc, NEW.pede_obs, 0, 0, :IVA, :IVAM,
            :CONSUMO, NEW.pede_codbar, :COSTO * NEW.pede_cant * NEW.pede_factor, 'N', 'N', :VLOTE, :STAND);
        end
    END
end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER PEDIDOS_DETALLE_AU FOR PEDIDOS_DETALLE
ACTIVE AFTER UPDATE POSITION 0
as
declare variable CANTREL NUMERIC(18,2);
declare variable CONSO CHAR(2);
declare variable CONSOLIDA INTEGER;
declare variable IDENTR INTEGER;
declare variable COSTO NUMERIC(18,2);
declare variable IVA NUMERIC(9,2);
declare variable IVAM NUMERIC(18,2);
declare variable CONSUMO NUMERIC(18,2);
declare variable STAND VARCHAR(20);
declare variable LOTE VARCHAR(15);
declare variable FECHA DATE;
declare variable VLOTE DATE;
begin
if ((OLD.pedi_id <> 0) AND (OLD.pede_anulado = 'N')) then
    BEGIN
    SELECT PEDI_CONSOLIDA, PEDI_IDENTR, PEDI_FECHA FROM PEDIDOS WHERE PEDI_ID = OLD.PEDI_ID INTO :CONSOLIDA, :IDENTR, :FECHA;
    if (CONSOLIDA <> 0) then
        BEGIN
        EXECUTE procedure LEE_CONFIGURACION ('FACTURACION','DOCUMENTOS','DEJAR PENDIENTES LOS ARTICULOS NO INCLUIDOS AL TRAER DOCUMENTOS RELACIONADOS') returning_values (CONSO);
        if (CONSO = 'SI') then
            UPDATE consolidado_faltantes SET COFA_IDDES = NEW.pedi_id, COFA_OK = 'N' WHERE COFA_ID = :consolida AND COFA_ITEM = OLD.PEDE_ITEM AND ARTI_COD = OLD.arti_cod;
        ELSE
            UPDATE consolidado_faltantes SET COFA_IDDES = NEW.pedi_id, COFA_OK = 'N' WHERE COFA_ID = :consolida;
        END
    if (IDENTR <> 0) then
        DELETE FROM ENTRADAS WHERE ENTR_ID = :IDENTR;
    END

if ((NEW.pedi_id <> 0) AND (NEW.pede_anulado = 'N')) then
    BEGIN
    SELECT PEDI_CONSOLIDA, PEDI_IDENTR, PEDI_FECHA FROM PEDIDOS WHERE PEDI_ID = NEW.PEDI_ID INTO :CONSOLIDA, :IDENTR, :FECHA;
    if (CONSOLIDA <> 0) then
        begin
        EXECUTE procedure LEE_CONFIGURACION ('FACTURACION','DOCUMENTOS','DEJAR PENDIENTES LOS ARTICULOS NO INCLUIDOS AL TRAER DOCUMENTOS RELACIONADOS') returning_values (CONSO);
        if (CONSO = 'NO') then
            UPDATE consolidado_faltantes SET COFA_IDDES = NEW.pedi_id, COFA_OK = 'S' WHERE COFA_ID = :consolida;
        else
            BEGIN
            UPDATE consolidado_faltantes SET COFA_OK = 'S' WHERE COFA_ID = :consolida AND COFA_ITEM = NEW.PEDE_ITEM AND ARTI_COD = NEW.arti_cod;
            /* BUSQUE EL CONSOLIDADO EN EL MISMO ITEM Y SI ES DIFERENTE ACTUALICELO */
            select COFA_CANT FROM consolidado_faltantes WHERE COFA_ID = :consolida AND COFA_ITEM = NEW.PEDE_ITEM AND ARTI_COD = NEW.arti_cod INTO :CANTREL;
            if (NEW.PEDE_CANT * NEW.PEDE_FACTOR < CANTREL) then
                UPDATE consolidado_faltantes SET COFA_IDDES = NEW.pedi_id, COFA_CANT = NEW.PEDE_CANT * NEW.PEDE_FACTOR
                    WHERE COFA_ID = :consolida AND COFA_ITEM = NEW.PEDE_ITEM AND ARTI_COD = NEW.arti_cod;
            END
        end
    if (IDENTR <> 0) then
        begin
        EXECUTE PROCEDURE costo_promedio_unidad(NEW.arti_cod, :FECHA, NEW.pede_unidad) returning_values (:COSTO);
        SELECT ARTI_CONSUMO, TAIV_PORC FROM ARTICULO A, TARIFA_IVA T
            WHERE A.taiv_cod = T.taiv_cod AND A.arti_cod = NEW.arti_cod INTO :consumo, :iva;
        IVAM = COSTO * IVA;
        EXECUTE PROCEDURE seleccione_lote (NEW.arti_cod, NEW.bode_cod, NEW.pede_cant * NEW.pede_factor) returning_values (:LOTE);
        SELECT LOTE_VENCE FROM LOTES WHERE (ARTI_COD = NEW.arti_cod) AND (BODE_COD = NEW.bode_cod) AND (LOTE_NRO = :LOTE) INTO :VLOTE;
        SELECT STAND_COD FROM STANDS WHERE ARTI_COD = NEW.arti_cod AND STAND_BODEGA = NEW.bode_cod INTO :STAND;
        INSERT INTO ENTRADAS_DETALLE (ENTR_ID, ENDE_ITEM, ARTI_COD, BODE_COD, ENDE_CANT, ENDE_UNIDAD, ENDE_COSTO,
            ENDE_LOTE, ENDE_FACTOR, ENDE_DESC, ENDE_OBS, ENDE_DTOPORC, ENDE_DTOMONTO, ENDE_IVAPORC, ENDE_IVAMONTO,
            ENDE_CONSUMO, ENDE_CODBAR, ENDE_TOTAL, ENDE_ANULADO, ENDE_TRANSMIT, LOTE_VENCE, ENDE_STAND)
            VALUES(:IDENTR, NEW.pede_item, NEW.arti_cod, NEW.bode_cod, NEW.pede_cant, NEW.pede_unidad, :COSTO,
            :LOTE, NEW.pede_factor, NEW.pede_desc, NEW.pede_obs, 0, 0, :IVA, :IVAM,
            :CONSUMO, NEW.pede_codbar, :COSTO * NEW.pede_cant * NEW.pede_factor, 'N', 'N', :VLOTE, :STAND);
        end
    END
end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER PEDIDOS_DETALLE_AD FOR PEDIDOS_DETALLE
ACTIVE AFTER DELETE POSITION 0
as
declare variable CONSO CHAR(2);
declare variable CONSOLIDA INTEGER;
declare variable IDENTR INTEGER;
BEGIN
if ((OLD.pedi_id <> 0) AND (OLD.pede_anulado = 'N')) then
    begin
    select PEDI_CONSOLIDA, PEDI_IDENTR from PEDIDOS where PEDI_id = old.pedi_id into :CONSOLIDA, :identr;
    if (CONSOLIDA <> 0) then
        begin
        EXECUTE procedure LEE_CONFIGURACION ('FACTURACION','DOCUMENTOS','DEJAR PENDIENTES LOS ARTICULOS NO INCLUIDOS AL TRAER DOCUMENTOS RELACIONADOS') returning_values (CONSO);
        if (CONSO = 'SI') then
            UPDATE consolidado_faltantes SET COFA_OK = 'N' WHERE COFA_ID = :consolida AND COFA_ITEM = old.pede_item AND ARTI_COD = old.arti_cod;
        else
            UPDATE consolidado_faltantes SET COFA_OK = 'N' WHERE COFA_ID = :consolida;
        END
    if (IDENTR <> 0) then
        DELETE FROM ENTRADAS WHERE ENTR_ID = :IDENTR;
    end
end
^

SET TERM ; ^


/* 20091029b */
/* STRING TRUNCATION STAND */
SET TERM ^ ;

CREATE OR ALTER procedure EXISTENCIAS_DESDE_HASTA (
    FECHA date,
    ARTINI varchar(20),
    ARTFIN varchar(20),
    GRPINI varchar(3),
    GRPFIN varchar(3),
    BODINI varchar(2),
    BODFIN varchar(2),
    ORDEN char(1),
    AGRUPA char(1),
    DETALLE char(1),
    RESERVA char(1),
    ENPESO char(1),
    SUCURSAL integer)
returns (
    CANT numeric(18,4),
    COSTO numeric(18,2),
    COSTO_LOTE numeric(18,2),
    CODIGO varchar(15),
    NOMBRE varchar(60),
    UNIDAD varchar(8),
    STAND varchar(20),
    CODGRUPO varchar(2),
    NOMGRUPO varchar(30),
    CODSUBG varchar(3),
    NOMSUBG varchar(30),
    CODMARC varchar(3),
    NOMMARC varchar(30),
    CODBOD varchar(2),
    LOTE varchar(15),
    NOMBOD varchar(30),
    COSTOTOT numeric(18,2),
    ULTCOSTO numeric(18,2),
    FECHACOSTO date,
    CONSUMO numeric(18,2),
    RESERVADO numeric(18,4),
    ORDENADO numeric(18,4),
    IVA numeric(9,2),
    PESOUNIT numeric(18,4),
    PESOTOTAL numeric(18,4),
    PRECIO numeric(18,2),
    CODBAR varchar(20))
AS
declare variable exist char(1);
declare variable codini varchar(20);
declare variable codfin varchar(20);
declare variable desini varchar(20);
declare variable desfin varchar(20);
declare variable ordenc numeric(18,4);
declare variable pedido numeric(18,4);
declare variable ok char(1);
declare variable id integer;
declare variable item integer;
declare variable und varchar(8);
declare variable factor numeric(18,4);
declare variable cant2 numeric(18,4);
declare variable PEDAUTO CHAR(2);
DECLARE VARIABLE LISTA INTEGER;
BEGIN
EXECUTE PROCEDURE lee_configuracion ('FACTURACION','FACTURAS', 'CODIGO DE LA LISTA DE PRECIOS A MOSTRAR EN ARTICULOS') returning_values (:LISTA);
if (ORDEN = 'C') then
    BEGIN
    CODINI = ARTINI;
    CODFIN = ARTFIN;
    DESINI = '';
    DESFIN = 'zz';
    END
ELSE
    BEGIN
    DESINI = ARTINI;
    DESFIN = ARTFIN;
    CODINI = '';
    CODFIN = 'zz';
    END
EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION', 'FACTURAS', 'GENERAR PEDIDO AUTOMATICAMENTE CON LA FACTURA') returning_values (pedauto);
if (DETALLE = 'B') then
  BEGIN
  FOR SELECT ARTI_COD, ARTI_DES, ARTI_UNIDAD, ARTI_EXIST, TAIV_PORC, A.GRUP_COD, A.SUBG_COD, A.MARC_COD, BODE_COD, BODE_NOM, ARTI_CONSUMO, ARTI_PESO/1000
      FROM ARTICULO A, BODEGA B, TARIFA_IVA T
      WHERE ARTI_COD >= :CODINI AND ARTI_COD <= :CODFIN AND ARTI_DES >= :DESINI AND ARTI_DES <= :DESFIN AND ESAR_COD <> 'I' AND BODE_COD >= :BODINI AND
      BODE_COD <= :BODFIN AND ((SUCU_ID = :SUCURSAL) or (:SUCURSAL = 0)) AND A.TAIV_COD = T.TAIV_COD
      INTO :CODIGO, :NOMBRE, :UNIDAD, :EXIST, :IVA, :CODGRUPO, :CODSUBG, :CODMARC, :CODBOD, :NOMBOD, :CONSUMO, :pesounit
      DO
        BEGIN
        STAND = '';
        OK = 'N';
        if (AGRUPA = 'G') then
            BEGIN
            if ((CODGRUPO >= GRPINI) AND (CODGRUPO <= GRPFIN)) then
                OK = 'S';
            end
        ELSE
            if (AGRUPA = 'M') then
                BEGIN
                if ((CODMARC >= GRPINI) AND (CODMARC <= GRPFIN)) then
                    OK = 'S';
                END
        if (OK = 'S') then
            BEGIN
            NOMGRUPO = '';
            NOMMARC = '';
            NOMSUBG = '';
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            SELECT MAX(COBA_COD) FROM BARRAS_ARTICULO WHERE ARTI_COD = :codigo AND COBA_UNIDAD = :unidad INTO :codbar;
            if (CODBAR IS NULL) then
                CODBAR = CODIGO;
            if (EXIST <> 'N') then
                BEGIN
                SELECT STAND_COD FROM STANDS WHERE ARTI_COD = :CODIGO AND STAND_BODEGA = :CODBOD INTO :STAND;
                EXECUTE PROCEDURE SALDO_INICIAL_INVENTARIO(CODIGO, FECHA, :CODBOD) returning_values (CANT);
                EXECUTE PROCEDURE costo_promedio_y_ultimo_unidad(CODIGO, FECHA, UNIDAD) returning_values (COSTO, ULTCOSTO);
                SELECT MAX(MVAR_FECHA) FROM MOVIMIENTO_ARTICULO WHERE ARTI_COD = :CODIGO AND MVAR_ENTRADA = 'S' AND MVAR_FECHA <= :FECHA INTO :FECHACOSTO;
                COSTOTOT = :CANT * :COSTO;
                CONSUMO = CONSUMO * CANT;
                if (RESERVA = 'S') then
                    BEGIN
                    SELECT SUM(ORID_ENTREGAR)
                        FROM ORDENINVENTARIO_DETALLE OD, ordenes_inventario O
                        WHERE O.ORIN_ID = OD.ORIN_ID AND ARTI_COD = :CODIGO AND ORIN_FECHA <= :FECHA AND ORIN_FECLLEGA >= :FECHA AND ORID_ANULADO = 'N' AND OD.BODE_COD = :CODBOD
                        INTO :ORDENADO;
                    if (ORDENADO IS NULL) then
                        ORDENADO = 0;
                    ORDENC = 0;
                    FOR SELECT O.ORDC_ID, OCDE_ITEM, OCDE_CANT * OCDE_FACTOR
                        FROM ORDENES_COMPRA O, ORDENES_COMPRA_DETALLE OD
                        WHERE O.ORDC_ID = OD.ORDC_ID AND OD.ARTI_COD = :CODIGO AND ORDC_VENCE >= :FECHA AND ORDC_FECHA <= :FECHA AND OCDE_ANULADO = 'N' AND OD.BODE_COD = :CODBOD
                        INTO :ID, :ITEM, :CANT2
                        do
                        BEGIN
                        EXECUTE PROCEDURE FALTANTE(23, 21, ID, ITEM) returning_values (PEDIDO, UND, FACTOR);
                        if (PEDIDO * FACTOR = CANT2) then /* SI NO SE HA FACTURADO MIRE A VER SI SE REMISIONO */
                            EXECUTE PROCEDURE FALTANTE(23, 22, ID, ITEM) returning_values (PEDIDO, UND, FACTOR);
                        if (PEDIDO IS NULL) then
                            PEDIDO = 0;
                        ORDENC = ORDENC + PEDIDO * FACTOR;
                        END
                    ORDENADO = ORDENADO + ORDENC;
                    SELECT SUM(RSDE_LIBERAR)
                        FROM RESERVAS_DETALLE RD, RESERVAS R
                        WHERE R.RESE_ID = RD.RESE_ID AND ARTI_COD = :CODIGO AND RESE_FECHA <= :FECHA AND RESE_VENCE >= :FECHA AND RD.BODE_COD = :CODBOD AND RSDE_ANULADO = 'N'
                        INTO :RESERVADO;
                    if (RESERVADO IS NULL) then
                        RESERVADO = 0;
                    PEDIDO = 0;
                    FOR SELECT P.PEDI_ID, PEDE_ITEM, PEDE_CANT * PEDE_FACTOR
                        FROM PEDIDOS P, PEDIDOS_DETALLE PD
                        WHERE P.PEDI_ID = PD.PEDI_ID AND PD.ARTI_COD = :CODIGO AND PEDI_VENCE >= :FECHA AND PEDI_FECHA <= :FECHA AND PEDE_ANULADO = 'N' AND BODE_COD = :CODBOD
                        INTO :ID, :ITEM, :CANT2
                        do
                        BEGIN
                        EXECUTE PROCEDURE FALTANTE(34, 31, ID, ITEM) returning_values (ORDENC, UND, FACTOR);
                        if ((ORDENC * FACTOR = CANT2) or (PEDAUTO = 'SI')) then /* SI NO SE HA FACTURADO MIRE A VER SI SE REMISIONO */
                            EXECUTE PROCEDURE FALTANTE(34, 32, ID, ITEM) returning_values (ORDENC, UND, FACTOR);
                        if (ORDENC IS NULL) then
                            ORDENC = 0;
                        PEDIDO = PEDIDO + ORDENC * FACTOR;
                        END
                    RESERVADO = RESERVADO + PEDIDO;
                    END
                ELSE
                    BEGIN
                    RESERVADO = 0;
                    ORDENADO = 0;
                    END
                if (LISTA > 0) then
                    SELECT prar_fijo FROM precios_articulo WHERE arti_cod = :CODIGO and lipr_cod = :LISTA INTO :PRECIO;
                if (ENPESO = 'S') then
                    BEGIN
                    if (pesounit IS NULL) then
                        pesounit = 0;
                    if (PESOUNIT <> 0) then
                        BEGIN
                        pesototal = PESOUNIT * cant;
                        SUSPEND;
                        END
                    END
                ELSE
                    SUSPEND;
                END
            END
        END
  END

if (DETALLE = 'L') then
  BEGIN
  FOR SELECT A.ARTI_COD, ARTI_DES, ARTI_UNIDAD, ARTI_EXIST, TAIV_PORC, A.GRUP_COD, A.SUBG_COD, A.MARC_COD, L.lote_nro, L.lote_nro||' - '||L.lote_vence, ARTI_CONSUMO,l.bode_cod, L.lote_saldo,l.lote_costo, ARTI_PESO/1000
      FROM ARTICULO A, LOTES l, TARIFA_IVA T
      WHERE A.ARTI_COD >= '0' AND A.ARTI_COD <= 'zz' AND ARTI_DES >= '' AND ARTI_DES <= 'zz' AND ESAR_COD <> 'I' AND A.TAIV_COD = T.TAIV_COD and a.arti_cod = l.arti_cod
      INTO :CODIGO, :NOMBRE, :UNIDAD, :EXIST, :IVA, :CODGRUPO, :CODSUBG, :CODMARC, :LOTE, :NOMBOD, :CONSUMO, :codbod, :cant, :costo_lote, :pesounit
      DO
        BEGIN
        OK = 'N';
        if (AGRUPA = 'G') then
            BEGIN
            if ((CODGRUPO >= GRPINI) AND (CODGRUPO <= GRPFIN)) then
                OK = 'S';
            end
        ELSE
            if (AGRUPA = 'M') then
                BEGIN
                if ((CODMARC >= GRPINI) AND (CODMARC <= GRPFIN)) then
                    OK = 'S';
                END
        if (OK = 'S') then
            BEGIN
            NOMGRUPO = '';
            NOMMARC = '';
            NOMSUBG = '';
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            SELECT MAX(COBA_COD) FROM BARRAS_ARTICULO WHERE ARTI_COD = :codigo AND COBA_UNIDAD = :unidad INTO :codbar;
            if (CODBAR IS NULL) then
                CODBAR = CODIGO;

            if (EXIST <> 'N') then
                BEGIN
                EXECUTE PROCEDURE COSTO_PROMEDIO_UNIDAD(CODIGO, FECHA, UNIDAD) returning_values (COSTO);
                EXECUTE PROCEDURE ULTIMO_COSTO(CODIGO, FECHA, UNIDAD) returning_values (ULTCOSTO);
                SELECT MAX(MVAR_FECHA) FROM MOVIMIENTO_ARTICULO WHERE ARTI_COD = :CODIGO AND MVAR_ENTRADA = 'S' AND MVAR_FECHA <= :FECHA INTO :FECHACOSTO;
                COSTOTOT = :CANT * :COSTO;
                CONSUMO = CONSUMO * CANT;
                if (RESERVA = 'S') then
                    BEGIN
                    SELECT SUM(ORID_ENTREGAR)
                        FROM ORDENINVENTARIO_DETALLE OD, ordenes_inventario O
                        WHERE O.ORIN_ID = OD.ORIN_ID AND ARTI_COD = :CODIGO AND ORIN_FECHA <= :FECHA AND ORIN_FECLLEGA >= :FECHA AND ORID_ANULADO = 'N'
                        INTO :ORDENADO;
                    if (ORDENADO IS NULL) then
                        ORDENADO = 0;
                    ORDENC = 0;
                    FOR SELECT O.ORDC_ID, OCDE_ITEM, OCDE_CANT * OCDE_FACTOR
                        FROM ORDENES_COMPRA O, ORDENES_COMPRA_DETALLE OD
                        WHERE O.ORDC_ID = OD.ORDC_ID AND OD.ARTI_COD = :CODIGO AND ORDC_VENCE >= :FECHA AND ORDC_FECHA <= :FECHA AND OCDE_ANULADO = 'N'
                        INTO :ID, :ITEM, :CANT2
                        do
                        BEGIN
                        EXECUTE PROCEDURE FALTANTE(23, 21, ID, ITEM) returning_values (PEDIDO, UND, FACTOR);
                        if (PEDIDO * FACTOR = CANT2) then /* SI NO SE HA FACTURADO MIRE A VER SI SE REMISIONO */
                            EXECUTE PROCEDURE FALTANTE(23, 22, ID, ITEM) returning_values (PEDIDO, UND, FACTOR);
                        if (PEDIDO IS NULL) then
                            PEDIDO = 0;
                        ORDENC = ORDENC + PEDIDO * FACTOR;
                        END
                    ORDENADO = ORDENADO + ORDENC;
                    SELECT SUM(RSDE_LIBERAR)
                        FROM RESERVAS_DETALLE RD, RESERVAS R
                        WHERE R.RESE_ID = RD.RESE_ID AND ARTI_COD = :CODIGO AND RESE_FECHA <= :FECHA AND RESE_VENCE >= :FECHA AND RSDE_ANULADO = 'N'
                        INTO :RESERVADO;
                    if (RESERVADO IS NULL) then
                        RESERVADO = 0;
                    PEDIDO = 0;
                    FOR SELECT P.PEDI_ID, PEDE_ITEM, PEDE_CANT * PEDE_FACTOR
                        FROM PEDIDOS P, PEDIDOS_DETALLE PD
                        WHERE P.PEDI_ID = PD.PEDI_ID AND PD.ARTI_COD = :CODIGO AND PEDI_VENCE >= :FECHA AND PEDI_FECHA <= :FECHA AND PEDE_ANULADO = 'N'
                        INTO :ID, :ITEM, :CANT2
                        do
                        BEGIN
                        EXECUTE PROCEDURE FALTANTE(34, 31, ID, ITEM) returning_values (ORDENC, UND, FACTOR);
                        if ((ORDENC * FACTOR = CANT2) or (PEDAUTO = 'SI')) then /* SI NO SE HA FACTURADO MIRE A VER SI SE REMISIONO */
                            EXECUTE PROCEDURE FALTANTE(34, 32, ID, ITEM) returning_values (ORDENC, UND, FACTOR);
                        if (ORDENC IS NULL) then
                            ORDENC = 0;
                        PEDIDO = PEDIDO + ORDENC * FACTOR;
                        END
                    RESERVADO = RESERVADO + PEDIDO;
                    END
                ELSE
                    BEGIN
                    RESERVADO = 0;
                    ORDENADO = 0;
                    END
                if (LISTA > 0) then
                    SELECT prar_fijo FROM precios_articulo WHERE arti_cod = :CODIGO and lipr_cod = :LISTA INTO :PRECIO;
                if (ENPESO = 'S') then
                    BEGIN
                    if (pesounit IS NULL) then
                        pesounit = 0;
                    if (PESOUNIT <> 0) then
                        BEGIN
                        pesototal = PESOUNIT * cant;
                        SUSPEND;
                        END
                    END
                ELSE
                    SUSPEND;
                END
            END
        END
  end
if (DETALLE = 'N') then
  BEGIN
  FOR SELECT ARTI_COD, ARTI_DES, ARTI_UNIDAD, ARTI_EXIST, TAIV_PORC, A.GRUP_COD, A.SUBG_COD, A.MARC_COD, ARTI_CONSUMO, ARTI_PESO/1000
      FROM ARTICULO A, TARIFA_IVA T
      WHERE ARTI_COD >= :CODINI AND ARTI_COD <= :CODFIN AND ARTI_DES >= :DESINI AND ARTI_DES <= :DESFIN AND ESAR_COD <> 'I' AND A.TAIV_COD = T.TAIV_COD
      INTO :CODIGO, :NOMBRE, :UNIDAD, :EXIST, :IVA, :CODGRUPO, :CODSUBG, :CODMARC, :CONSUMO, :pesounit
      DO
        BEGIN
        OK = 'N';
        if (AGRUPA = 'G') then
            BEGIN
            if ((GRPINI = '0') AND (GRPFIN = 'zz')) then
                OK = 'S';
            else
                if ((CODGRUPO >= GRPINI) AND (CODGRUPO <= GRPFIN)) then
                    OK = 'S';
            end
        ELSE
            if (AGRUPA = 'M') then
                BEGIN
                if ((GRPINI = '0') AND (GRPFIN = 'zzz')) then
                    OK = 'S';
                else
                    if ((CODMARC >= GRPINI) AND (CODMARC <= GRPFIN)) then
                        OK = 'S';
                END
        if (OK = 'S') then
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            SELECT MAX(COBA_COD) FROM BARRAS_ARTICULO WHERE ARTI_COD = :codigo AND COBA_UNIDAD = :unidad INTO :codbar;
            if (CODBAR IS NULL) then
                CODBAR = CODIGO;

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

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

SET TERM ; ^



/* 20091030 */
/* CHECKS POR GRUPO DE ARTICULOS */
ALTER TABLE CRM_CLIENTES
ADD CRCL_CHECK1 T_BOOLEANO;
ALTER TABLE CRM_CLIENTES
ADD CRCL_CHECK2 T_BOOLEANO;
ALTER TABLE CRM_CLIENTES
ADD CRCL_CHECK3 T_BOOLEANO;
ALTER TABLE CRM_CLIENTES
ADD CRCL_CHECK4 T_BOOLEANO;
ALTER TABLE CRM_CLIENTES
ADD CRCL_CHECK5 T_BOOLEANO;
ALTER TABLE CRM_CLIENTES
ADD CRCL_CHECK6 T_BOOLEANO;
    
INSERT INTO CONFIGURACION (CONF_MODULO, CONF_CATEGORIA, CONF_PROPIEDAD, CONF_VALOR, CONF_POSIBLES, CONF_AYUDA) VALUES ('CRM', 'PROSPECTOS', 'NOMBRE CAMPO CHECK1', 'Papelería', NULL, NULL);
INSERT INTO CONFIGURACION (CONF_MODULO, CONF_CATEGORIA, CONF_PROPIEDAD, CONF_VALOR, CONF_POSIBLES, CONF_AYUDA) VALUES ('CRM', 'PROSPECTOS', 'NOMBRE CAMPO CHECK2', 'Impresos', NULL, NULL);
INSERT INTO CONFIGURACION (CONF_MODULO, CONF_CATEGORIA, CONF_PROPIEDAD, CONF_VALOR, CONF_POSIBLES, CONF_AYUDA) VALUES ('CRM', 'PROSPECTOS', 'NOMBRE CAMPO CHECK3', 'Aseo y cafetería', NULL, NULL);
INSERT INTO CONFIGURACION (CONF_MODULO, CONF_CATEGORIA, CONF_PROPIEDAD, CONF_VALOR, CONF_POSIBLES, CONF_AYUDA) VALUES ('CRM', 'PROSPECTOS', 'NOMBRE CAMPO CHECK4', 'Productos familia', NULL, NULL);
INSERT INTO CONFIGURACION (CONF_MODULO, CONF_CATEGORIA, CONF_PROPIEDAD, CONF_VALOR, CONF_POSIBLES, CONF_AYUDA) VALUES ('CRM', 'PROSPECTOS', 'NOMBRE CAMPO CHECK5', 'Resmas', NULL, NULL);
INSERT INTO CONFIGURACION (CONF_MODULO, CONF_CATEGORIA, CONF_PROPIEDAD, CONF_VALOR, CONF_POSIBLES, CONF_AYUDA) VALUES ('CRM', 'PROSPECTOS', 'NOMBRE CAMPO CHECK6', '', NULL, NULL);
commit work;

UPDATE CRM_CLIENTES SET CRCL_CHECK1 = 'N',CRCL_CHECK2 = 'N',CRCL_CHECK3 = 'N',CRCL_CHECK4 = 'N',CRCL_CHECK5 = 'N',CRCL_CHECK6 = 'N';
COMMIT WORK;

SET TERM ^ ;

CREATE OR ALTER TRIGGER CRM_CLIENTES_BI FOR CRM_CLIENTES
ACTIVE BEFORE INSERT POSITION 0
as
declare variable TERC CHAR(2);
begin
SELECT SUBSTR(CIUD_NOM,1,40) FROM CIUDADES WHERE CIUD_COD = NEW.ciud_cod INTO NEW.crcl_ciu;
if (NEW.crcl_tipoid IS NULL) then
    NEW.crcl_tipoid = 'J';
if (NEW.crcl_estercero IS NULL) then
    NEW.crcl_estercero = 'N';
if (NEW.crcl_estercero IS NULL) then
    BEGIN
    EXECUTE PROCEDURE lee_configuracion ('CRM', 'PROSPECTOS', 'CREAR PROSPECTO AUTOMATICAMENTE COMO CLIENTE') returning_values (:TERC);
    if (TERC = 'SI') then
        NEW.crcl_estercero = 'S';
    END
if (NEW.crcl_check1 IS NULL) then
    NEW.crcl_check1 = 'N';
if (NEW.crcl_check2 IS NULL) then
    NEW.crcl_check2 = 'N';
if (NEW.crcl_check3 IS NULL) then
    NEW.crcl_check3 = 'N';
if (NEW.crcl_check4 IS NULL) then
    NEW.crcl_check4 = 'N';
if (NEW.crcl_check5 IS NULL) then
    NEW.crcl_check5 = 'N';
if (NEW.crcl_check6 IS NULL) then
    NEW.crcl_check6 = 'N';
end
^

SET TERM ; ^

SET TERM ^ ;

create or alter procedure REP_CRM_CLIENTES (
    DESDE varchar(20),
    HASTA varchar(20),
    ORDEN char(1),
    CHECK1 CHAR(1),
    CHECK2 CHAR(1),
    CHECK3 CHAR(1),
    CHECK4 CHAR(1),
    CHECK5 CHAR(1),
    CHECK6 CHAR(1))
returns (
    NIT varchar(20),
    NOM varchar(60),
    DIR varchar(60),
    CIU varchar(40),
    TEL varchar(40),
    CONTACTO varchar(60),
    OBS varchar(255),
    EMAIL varchar(100),
    FAX varchar(25),
    CEL varchar(25),
    CODCIU varchar(6),
    ZONA varchar(2),
    COBR integer,
    VEND integer,
    GRUPOC integer,
    ANIV date,
    CLIDESDE date,
    LISTA integer,
    NOMLISTA varchar(30),
    NOMVEND varchar(60),
    NOMCOBR varchar(60),
    NOMZONA varchar(60),
    NOMCIUD varchar(60),
    NOMGRP varchar(60),
    CLASE VARCHAR(60),
    CALIFICA INTEGER,
    CAMPO1 VARCHAR(60),
    CAMPO2 VARCHAR(60),
    CAMPO3 VARCHAR(60),
    FECHA1 DATE,
    FECHA2 date,
    MONTO1 NUMERIC(18,2),
    MONTO2 NUMERIC(18,2),
    MONTO3 NUMERIC(18,2))
as
declare variable NITINI VARCHAR(20);
declare variable NITFIN VARCHAR(20);
declare variable NOMINI VARCHAR(20);
declare variable NOMFIN VARCHAR(20);
begin
if (ORDEN = 'C') then
    BEGIN
    NITINI = DESDE;
    NITFIN = HASTA;
    NOMINI = '';
    NOMFIN = 'zz';
    END
ELSE
    BEGIN
    NOMINI = DESDE;
    NOMFIN = HASTA;
    NITINI = '';
    NITFIN = 'zz';
    END
if (check1 = 'S') then
    begin
    EXECUTE PROCEDURE LEE_CONFIGURACION('CRM', 'PROSPECTOS', 'NOMBRE CAMPO CHECK1') returning_values (:CLASE);
    for select crcl_nit,crcl_nom,crcl_dir,crcl_ciu,crcl_tel,crcl_contacto,SUBSTRING(crcl_OBS FROM 1 FOR 255),
        crcl_email,crcl_fax,crcl_cel,l.zona_cod,l.vend_cod, l.cobr_cod, l.clie_aniv, l.clie_fecha, l.lipr_cod,
        ciud_cod, l.grca_cod, crcl_campo1, crcl_campo2, crcl_campo3, crcl_fecha1, crcl_fecha2, crcl_monto1, crcl_monto2, crcl_monto3, crcl_califica
        from crm_clientes c, clientes l where c.crcl_nit = l.terc_nit and c.crcl_nit >= :nitini and c.crcl_nit <= :nitfin and crcl_nom >= :nomini and crcl_nom <= :nomfin and
            crcl_check1 = 'S'
        into :nit, :nom, :dir, :ciu, :tel, :contacto, :obs,
        :email, :fax, :cel, :zona, :vend, :cobr, :aniv, :clidesde, :lista,
        :codciu, :grupoc, :campo1, :campo2, :campo3, :fecha1, :fecha2, :monto1, :monto2, :monto3, :califica
        do
        begin
        nomlista = '';
        nomzona = '';
        nomcobr = '';
        nomciud = '';
        nomvend = '';
        select lipr_nom from LISTA_PRECIOS where lipr_cod = :lista into nomlista;
        select zona_nom from zonas where zona_cod = :zona into :nomzona;
        select cobr_nom from cobradores where cobr_cod = :cobr into nomcobr;
        select vend_nombre from vendedores where vend_cod = :vend into nomvend;
        select ciud_nom from ciudades where ciud_cod = :codciu into nomciud;
        select GRCA_NOMBRE from grupo_cartera where grca_cod = :grupoc into nomgrp;
        suspend;
        END
    END
if (check2 = 'S') then
    begin
    EXECUTE PROCEDURE LEE_CONFIGURACION('CRM', 'PROSPECTOS', 'NOMBRE CAMPO CHECK2') returning_values (:CLASE);
    for select crcl_nit,crcl_nom,crcl_dir,crcl_ciu,crcl_tel,crcl_contacto,SUBSTRING(crcl_OBS FROM 1 FOR 255),
        crcl_email,crcl_fax,crcl_cel,l.zona_cod,l.vend_cod, l.cobr_cod, l.clie_aniv, l.clie_fecha, l.lipr_cod,
        ciud_cod, l.grca_cod, crcl_campo1, crcl_campo2, crcl_campo3, crcl_fecha1, crcl_fecha2, crcl_monto1, crcl_monto2, crcl_monto3, crcl_califica
        from crm_clientes c, clientes l where c.crcl_nit = l.terc_nit and c.crcl_nit >= :nitini and c.crcl_nit <= :nitfin and crcl_nom >= :nomini and crcl_nom <= :nomfin and
            crcl_check2 = 'S'
        into :nit, :nom, :dir, :ciu, :tel, :contacto, :obs,
        :email, :fax, :cel, :zona, :vend, :cobr, :aniv, :clidesde, :lista,
        :codciu, :grupoc, :campo1, :campo2, :campo3, :fecha1, :fecha2, :monto1, :monto2, :monto3, :califica
        do
        begin
        nomlista = '';
        nomzona = '';
        nomcobr = '';
        nomciud = '';
        nomvend = '';
        select lipr_nom from LISTA_PRECIOS where lipr_cod = :lista into nomlista;
        select zona_nom from zonas where zona_cod = :zona into :nomzona;
        select cobr_nom from cobradores where cobr_cod = :cobr into nomcobr;
        select vend_nombre from vendedores where vend_cod = :vend into nomvend;
        select ciud_nom from ciudades where ciud_cod = :codciu into nomciud;
        select GRCA_NOMBRE from grupo_cartera where grca_cod = :grupoc into nomgrp;
        suspend;
        END
    END

if (check3 = 'S') then
    begin
    EXECUTE PROCEDURE LEE_CONFIGURACION('CRM', 'PROSPECTOS', 'NOMBRE CAMPO CHECK3') returning_values (:CLASE);
    for select crcl_nit,crcl_nom,crcl_dir,crcl_ciu,crcl_tel,crcl_contacto,SUBSTRING(crcl_OBS FROM 1 FOR 255),
        crcl_email,crcl_fax,crcl_cel,l.zona_cod,l.vend_cod, l.cobr_cod, l.clie_aniv, l.clie_fecha, l.lipr_cod,
        ciud_cod, l.grca_cod, crcl_campo1, crcl_campo2, crcl_campo3, crcl_fecha1, crcl_fecha2, crcl_monto1, crcl_monto2, crcl_monto3, crcl_califica
        from crm_clientes c, clientes l where c.crcl_nit = l.terc_nit and c.crcl_nit >= :nitini and c.crcl_nit <= :nitfin and crcl_nom >= :nomini and crcl_nom <= :nomfin and
            crcl_check3 = 'S'
        into :nit, :nom, :dir, :ciu, :tel, :contacto, :obs,
        :email, :fax, :cel, :zona, :vend, :cobr, :aniv, :clidesde, :lista,
        :codciu, :grupoc, :campo1, :campo2, :campo3, :fecha1, :fecha2, :monto1, :monto2, :monto3, :califica
        do
        begin
        nomlista = '';
        nomzona = '';
        nomcobr = '';
        nomciud = '';
        nomvend = '';
        select lipr_nom from LISTA_PRECIOS where lipr_cod = :lista into nomlista;
        select zona_nom from zonas where zona_cod = :zona into :nomzona;
        select cobr_nom from cobradores where cobr_cod = :cobr into nomcobr;
        select vend_nombre from vendedores where vend_cod = :vend into nomvend;
        select ciud_nom from ciudades where ciud_cod = :codciu into nomciud;
        select GRCA_NOMBRE from grupo_cartera where grca_cod = :grupoc into nomgrp;
        suspend;
        END
    end
if (check4 = 'S') then
    begin
    EXECUTE PROCEDURE LEE_CONFIGURACION('CRM', 'PROSPECTOS', 'NOMBRE CAMPO CHECK4') returning_values (:CLASE);
    for select crcl_nit,crcl_nom,crcl_dir,crcl_ciu,crcl_tel,crcl_contacto,SUBSTRING(crcl_OBS FROM 1 FOR 255),
        crcl_email,crcl_fax,crcl_cel,l.zona_cod,l.vend_cod, l.cobr_cod, l.clie_aniv, l.clie_fecha, l.lipr_cod,
        ciud_cod, l.grca_cod, crcl_campo1, crcl_campo2, crcl_campo3, crcl_fecha1, crcl_fecha2, crcl_monto1, crcl_monto2, crcl_monto3, crcl_califica
        from crm_clientes c, clientes l where c.crcl_nit = l.terc_nit and c.crcl_nit >= :nitini and c.crcl_nit <= :nitfin and crcl_nom >= :nomini and crcl_nom <= :nomfin and
            crcl_check4 = 'S'
        into :nit, :nom, :dir, :ciu, :tel, :contacto, :obs,
        :email, :fax, :cel, :zona, :vend, :cobr, :aniv, :clidesde, :lista,
        :codciu, :grupoc, :campo1, :campo2, :campo3, :fecha1, :fecha2, :monto1, :monto2, :monto3, :califica
        do
        begin
        nomlista = '';
        nomzona = '';
        nomcobr = '';
        nomciud = '';
        nomvend = '';
        select lipr_nom from LISTA_PRECIOS where lipr_cod = :lista into nomlista;
        select zona_nom from zonas where zona_cod = :zona into :nomzona;
        select cobr_nom from cobradores where cobr_cod = :cobr into nomcobr;
        select vend_nombre from vendedores where vend_cod = :vend into nomvend;
        select ciud_nom from ciudades where ciud_cod = :codciu into nomciud;
        select GRCA_NOMBRE from grupo_cartera where grca_cod = :grupoc into nomgrp;
        suspend;
        END
    end
if (check5 = 'S') then
    begin
    EXECUTE PROCEDURE LEE_CONFIGURACION('CRM', 'PROSPECTOS', 'NOMBRE CAMPO CHECK5') returning_values (:CLASE);
    for select crcl_nit,crcl_nom,crcl_dir,crcl_ciu,crcl_tel,crcl_contacto,SUBSTRING(crcl_OBS FROM 1 FOR 255),
        crcl_email,crcl_fax,crcl_cel,l.zona_cod,l.vend_cod, l.cobr_cod, l.clie_aniv, l.clie_fecha, l.lipr_cod,
        ciud_cod, l.grca_cod, crcl_campo1, crcl_campo2, crcl_campo3, crcl_fecha1, crcl_fecha2, crcl_monto1, crcl_monto2, crcl_monto3, crcl_califica
        from crm_clientes c, clientes l where c.crcl_nit = l.terc_nit and c.crcl_nit >= :nitini and c.crcl_nit <= :nitfin and crcl_nom >= :nomini and crcl_nom <= :nomfin and
            crcl_check5 = 'S'
        into :nit, :nom, :dir, :ciu, :tel, :contacto, :obs,
        :email, :fax, :cel, :zona, :vend, :cobr, :aniv, :clidesde, :lista,
        :codciu, :grupoc, :campo1, :campo2, :campo3, :fecha1, :fecha2, :monto1, :monto2, :monto3, :califica
        do
        begin
        nomlista = '';
        nomzona = '';
        nomcobr = '';
        nomciud = '';
        nomvend = '';
        select lipr_nom from LISTA_PRECIOS where lipr_cod = :lista into nomlista;
        select zona_nom from zonas where zona_cod = :zona into :nomzona;
        select cobr_nom from cobradores where cobr_cod = :cobr into nomcobr;
        select vend_nombre from vendedores where vend_cod = :vend into nomvend;
        select ciud_nom from ciudades where ciud_cod = :codciu into nomciud;
        select GRCA_NOMBRE from grupo_cartera where grca_cod = :grupoc into nomgrp;
        suspend;
        END
    end
if (check6 = 'S') then
    begin
    EXECUTE PROCEDURE LEE_CONFIGURACION('CRM', 'PROSPECTOS', 'NOMBRE CAMPO CHECK6') returning_values (:CLASE);
    for select crcl_nit,crcl_nom,crcl_dir,crcl_ciu,crcl_tel,crcl_contacto,SUBSTRING(crcl_OBS FROM 1 FOR 255),
        crcl_email,crcl_fax,crcl_cel,l.zona_cod,l.vend_cod, l.cobr_cod, l.clie_aniv, l.clie_fecha, l.lipr_cod,
        ciud_cod, l.grca_cod, crcl_campo1, crcl_campo2, crcl_campo3, crcl_fecha1, crcl_fecha2, crcl_monto1, crcl_monto2, crcl_monto3, crcl_califica
        from crm_clientes c, clientes l where c.crcl_nit = l.terc_nit and c.crcl_nit >= :nitini and c.crcl_nit <= :nitfin and crcl_nom >= :nomini and crcl_nom <= :nomfin and
            crcl_check6 = 'S'
        into :nit, :nom, :dir, :ciu, :tel, :contacto, :obs,
        :email, :fax, :cel, :zona, :vend, :cobr, :aniv, :clidesde, :lista,
        :codciu, :grupoc, :campo1, :campo2, :campo3, :fecha1, :fecha2, :monto1, :monto2, :monto3, :califica
        do
        begin
        nomlista = '';
        nomzona = '';
        nomcobr = '';
        nomciud = '';
        nomvend = '';
        select lipr_nom from LISTA_PRECIOS where lipr_cod = :lista into nomlista;
        select zona_nom from zonas where zona_cod = :zona into :nomzona;
        select cobr_nom from cobradores where cobr_cod = :cobr into nomcobr;
        select vend_nombre from vendedores where vend_cod = :vend into nomvend;
        select ciud_nom from ciudades where ciud_cod = :codciu into nomciud;
        select GRCA_NOMBRE from grupo_cartera where grca_cod = :grupoc into nomgrp;
        suspend;
        END
    end
end
^

SET TERM ; ^

grant execute on procedure rep_crm_clientes to public;

/* 20091031 */
SET TERM ^ ;

CREATE OR ALTER procedure CONCILIA_COMPRAS (
    FECINI date,
    FECFIN date,
    SOLODIF char(1),
    NULO1 char(1),
    NULO2 char(2))
returns (
    IDF integer,
    IDC integer,
    PREF varchar(4),
    NUMERO varchar(6),
    FECHA date,
    COMPROBA varchar(3),
    NUMCNT varchar(6),
    CTAINVEN varchar(20),
    MONTO numeric(18,2),
    MONTOC numeric(18,2))
AS
declare variable dig integer;
declare variable mercancia numeric(18,2);
declare variable fomento varchar(2);
declare variable vrconsumo numeric(18,2);
declare variable factor double precision;
declare variable vrdto numeric(18,2);
declare variable vradic numeric(18,2);
declare variable vrsubt numeric(18,2);
declare variable vriva numeric(18,2);
declare variable vrtotal numeric(18,2);
declare variable vrextra numeric(18,2);
declare variable inven char(1);
declare variable ctadto varchar(20);
begin
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;
EXECUTE PROCEDURE LEE_CONFIGURACION('COMPRAS', 'FACTURAS', 'USAR IMPOCONSUMO COMO PORCENTAJE DE FOMENTO') returning_values (FOMENTO);
for select faco_id, pref_pre, faco_numero, faco_fecha, FACO_DTOMONTO, FACO_ADICIONAL, FACO_IVAMONTO, FACO_EXTRA, FACO_TOTAL
    from facturas_compra f
    where faco_fecha >= :fecini and faco_fecha <= :fecfin and faco_anulado = 'N'
    into :idf, :pref, :numero, :fecha, :VRDTO, :VRADIC, :VRIVA, :VREXTRA, :VRTOTAL
    do
    begin
    idc = 0;
    montoc = 0;
    numcnt = '';
    select enco_consec, TICO_COD, ENCO_NUMERO
    from comprobante_encabezado where enco_idref = :idf and enco_tiporef = 21
    into :idc, :comproba, :numcnt;

    SELECT SUM (FCDE_CONSUMO) FROM FACTURAS_COMPRAS_DETALLE WHERE FACO_ID = :idf INTO MERCANCIA;
    VRSUBT = VRTOTAL - VREXTRA - VRIVA - MERCANCIA;
    MERCANCIA = VRSUBT - VRADIC + VRDTO;
    if (MERCANCIA <> 0) then
        FACTOR = CAST(VRSUBT AS DOUBLE PRECISION) / CAST(MERCANCIA AS DOUBLE PRECISION);
    ELSE
        FACTOR = 1;
    SELECT MAX(INCO_INVEN), MAX(INCO_CTAINVEN), MAX(INCO_CTADTO) FROM INTERFAZ_COMPRAS
        WHERE TIDO_COD = 21 AND PREF_PRE = :pref
        INTO :INVEN, :ctainven, :ctadto;
    if (INVEN = 'A') then
        BEGIN
        FOR SELECT MAX(COAR_CTACOMP), SUM(FCDE_TOTAL-FCDE_IVAMONTO-FCDE_CONSUMO), SUM(FCDE_CONSUMO)
            FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_COMPRAS_DETALLE F
            WHERE F.FACO_ID = :IDF AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD
            GROUP BY COAR_CTACOMP, F.BODE_COD INTO :CTAINVEN, :MONTO, :vrconsumo DO
            BEGIN
            if (FOMENTO = 'SI' ) then
                MONTO = MONTO + vrconsumo;
            if ((CTADTO IS NULL) OR (CTADTO = '')) then
                MONTO = MONTO * FACTOR;
            execute procedure redondee(MONTO, DIG) returning_values (MONTO);
            select SUM(code_debito - code_credito) from comprobante_detalle
                where enco_consec = :idc and cuen_cod = :ctainven into MONTOC;
            if (montoc is null) then
                montoc = 0;
            if ((SOLODIF = 'N') or (MONTO <> MONTOC)) then
                SUSPEND;
            END
        END
    if (INVEN = 'K') then
        BEGIN
        FOR SELECT SUM(FCDE_TOTAL-FCDE_IVAMONTO-FCDE_CONSUMO), SUM(FCDE_CONSUMO)
            FROM FACTURAS_COMPRAS_DETALLE F
            WHERE F.FACO_ID = :IDF
            GROUP BY F.BODE_COD INTO :MONTO, :vrconsumo DO
            BEGIN
            if (FOMENTO = 'SI' ) then
                MONTO = MONTO + vrconsumo;
            if ((CTADTO IS NULL) OR (CTADTO = '')) then
                MONTO = MONTO * FACTOR;
            execute procedure redondee(MONTO, DIG) returning_values (MONTO);
            select SUM(code_debito - code_credito) from comprobante_detalle
                where enco_consec = :idc and cuen_cod = :ctainven into MONTOC;
            if (montoc is null) then
                montoc = 0;
            if ((SOLODIF = 'N') or (MONTO <> MONTOC)) then
                SUSPEND;
            END
        END
    end
end
^

SET TERM ; ^


UPDATE PROCEDIMIENTOS_USUARIO
SET PRUS_PARAM1 = 'Sólo diferencias (S/N)',
    PRUS_PARAM2 = '',
    PRUS_PARAM3 = ''
WHERE (PRUS_COD = 3);
commit work;

SET TERM ^ ;

CREATE OR ALTER procedure CONCILIA_CARTERA (
    FECINI date,
    FECFIN date,
    CTACART varchar(20),
    SUBEMPRESA integer,
    ANTERIOR char(1))
returns (
    NIT varchar(20),
    NOMBRE varchar(60),
    INICIAL numeric(18,2),
    INICIALC numeric(18,2),
    DEBITOS numeric(18,2),
    DEBITOSC numeric(18,2),
    CREDITOS numeric(18,2),
    CREDITOSC numeric(18,2),
    SALDO numeric(18,2),
    SALDOC numeric(18,2),
    DIFERENCIA numeric(18,2))
AS
declare variable ANO CHAR(4);
declare variable MES INTEGER;
declare variable NUMROWS INTEGER;
declare variable ABONOS NUMERIC(18,2);
declare variable TIPODOC INTEGER;
declare variable IDDOC INTEGER;
declare variable RETES CHAR(2);
declare variable AUTORET VARCHAR(10);
declare variable FAUTORET DATE;
begin
ano = EXTRACT(YEAR FROM FECFIN);
mes = EXTRACT(MONTH FROM FECFIN);

for select TERC_NIT, TERC_NOM from TERCEROS WHERE TERC_CLIE = 'S' into :NIT, :NOMBRE
    DO
    BEGIN
    /* OMITE LOS CLIENTES DE CONTADO */
    SELECT COUNT(*) FROM AUTORIZACIONES WHERE AUTO_NITCONTADO = :NIT INTO :numrows;
    IF (numrows = 0) THEN
        BEGIN
        FECINI = FECINI - 1;
        INICIAL = 0;
        FOR SELECT MVCL_TIPOREF, MVCL_IDREF FROM MOVIMIENTO_CLIENTES
            WHERE TERC_NIT = :NIT AND MVCL_FECHA <= :FECINI AND
            MVCL_ABONO = 'N' AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA))
            INTO :TIPODOC, :IDDOC
            DO
            BEGIN
            EXECUTE PROCEDURE saldo_doc_cartera(TIPODOC, IDDOC, FECINI, 0) returning_values (SALDO);
            INICIAL = INICIAL + SALDO;
            END
        EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'DESCONTAR RETENCIONES POR CAUSACION') returning_values(:RETES);
        EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'FECHA AUTORETENEDOR NO DESCONTAR RETENCIONES DEL SALDO PERO SI CONTABILIZARLAS') returning_values (AUTORET);
        if (AUTORET <> '') then
            FAUTORET = CAST(AUTORET AS DATE);
        else
            FAUTORET = '9999/12/31';
        FECINI = FECINI + 1;
        if (RETES = 'SI') then
            BEGIN
            if (FAUTORET <= FECINI) then
                BEGIN
                SELECT SUM(MVCL_MONTO-MVCL_RTEIVA-MVCL_RTEICA) FROM movimiento_clientes
                    WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND MVCL_FECHA < :FECFIN
                    AND MVCL_DEBITO = 'S' AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA))
                    INTO :DEBITOS;
                SELECT SUM(MVCL_MONTO-MVCL_RTEIVA-MVCL_RTEICA) FROM movimiento_clientes
                    WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND MVCL_FECHA < :FECFIN
                    AND MVCL_DEBITO = 'N' AND MVCL_ABONO = 'N' and MVCL_TIPOREF <> 45 AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA))
                    INTO :CREDITOS;
                END
            ELSE
                BEGIN
                SELECT SUM(MVCL_MONTO-MVCL_RTEFTE-MVCL_RTEIVA-MVCL_RTEICA) FROM movimiento_clientes
                    WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND MVCL_FECHA < :FECFIN
                    AND MVCL_DEBITO = 'S' AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA))
                    INTO :DEBITOS;
                SELECT SUM(MVCL_MONTO-MVCL_RTEFTE-MVCL_RTEIVA-MVCL_RTEICA) FROM movimiento_clientes
                    WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND MVCL_FECHA < :FECFIN
                    AND MVCL_DEBITO = 'N' AND MVCL_ABONO = 'N' and MVCL_TIPOREF <> 45 AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA))
                    INTO :CREDITOS;
                END
            SELECT SUM(MVCL_MONTO) FROM movimiento_clientes
                WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND MVCL_FECHA < :FECFIN
                AND MVCL_ABONO = 'S' AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA))
                INTO :ABONOS;
            END
        ELSE
            BEGIN
            SELECT SUM(MVCL_MONTO) FROM movimiento_clientes
                WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND MVCL_FECHA < :FECFIN
                AND MVCL_DEBITO = 'S' AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA))
                INTO :DEBITOS;
            SELECT SUM(MVCL_MONTO) FROM movimiento_clientes
                WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND MVCL_FECHA < :FECFIN
                AND MVCL_DEBITO = 'N' AND MVCL_ABONO = 'N' and MVCL_TIPOREF <> 45 AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA))
                INTO :CREDITOS;
            SELECT SUM(MVCL_MONTO+MVCL_RTEFTE+MVCL_RTEIVA+MVCL_RTEICA) FROM movimiento_clientes
                WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND MVCL_FECHA < :FECFIN
                AND MVCL_ABONO = 'S' AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA))
                INTO :ABONOS;
            END
        if (DEBITOS IS NULL) then
            DEBITOS = 0;
        if (CREDITOS IS NULL) then
            CREDITOS = 0;
        if (ABONOS IS NULL) then
            ABONOS = 0;
        CREDITOS = CREDITOS + ABONOS;
        SALDO = INICIAL + DEBITOS - CREDITOS;

        /* LO CONTABLE */
        EXECUTE PROCEDURE SALDO_TERCERO_MES(ctacart, NIT, ANO, MES, 'S') RETURNING_VALUES (INICIALC);
        EXECUTE PROCEDURE MOVIMIENTO_TERCERO_MES(ctacart, NIT, ANO, MES, 'S') RETURNING_VALUES(DEBITOSC);
        EXECUTE PROCEDURE MOVIMIENTO_TERCERO_MES(ctacart, NIT, ANO, MES, 'N') RETURNING_VALUES(CREDITOSC);
        SALDOC = INICIALC + DEBITOSC - CREDITOSC;
        diferencia = SALDO - SALDOC;
        if (DIFERENCIA <> 0) then
            BEGIN
            if (ANTERIOR <> 'S') then
                SUSPEND;
            ELSE
                BEGIN
                if (DIFERENCIA <> (INICIAL - INICIALC)) then
                    SUSPEND;
                END
            END
        END
    END
end
^

SET TERM ; ^


/* 20091104 */
/* INVENTARIO CON COSTOS MAS IMPUESTOS */
SET TERM ^ ;

CREATE OR ALTER procedure EXISTENCIAS_DESDE_HASTA (
    FECHA date,
    ARTINI varchar(20),
    ARTFIN varchar(20),
    GRPINI varchar(3),
    GRPFIN varchar(3),
    BODINI varchar(2),
    BODFIN varchar(2),
    ORDEN char(1),
    AGRUPA char(1),
    DETALLE char(1),
    RESERVA char(1),
    ENPESO char(1),
    MASIVA CHAR(1),
    SUCURSAL integer)
returns (
    CANT numeric(18,4),
    COSTO numeric(18,2),
    COSTO_LOTE numeric(18,2),
    CODIGO varchar(15),
    NOMBRE varchar(60),
    UNIDAD varchar(8),
    STAND varchar(20),
    CODGRUPO varchar(2),
    NOMGRUPO varchar(30),
    CODSUBG varchar(3),
    NOMSUBG varchar(30),
    CODMARC varchar(3),
    NOMMARC varchar(30),
    CODBOD varchar(2),
    LOTE varchar(15),
    NOMBOD varchar(30),
    COSTOTOT numeric(18,2),
    ULTCOSTO numeric(18,2),
    FECHACOSTO date,
    CONSUMO numeric(18,2),
    RESERVADO numeric(18,4),
    ORDENADO numeric(18,4),
    IVA numeric(9,2),
    PESOUNIT numeric(18,4),
    PESOTOTAL numeric(18,4),
    PRECIO numeric(18,2),
    CODBAR varchar(20))
AS
declare variable exist char(1);
declare variable codini varchar(20);
declare variable codfin varchar(20);
declare variable desini varchar(20);
declare variable desfin varchar(20);
declare variable ordenc numeric(18,4);
declare variable pedido numeric(18,4);
declare variable ok char(1);
declare variable id integer;
declare variable item integer;
declare variable und varchar(8);
declare variable factor numeric(18,4);
declare variable cant2 numeric(18,4);
declare variable PEDAUTO CHAR(2);
DECLARE VARIABLE LISTA INTEGER;
BEGIN
EXECUTE PROCEDURE lee_configuracion ('FACTURACION','FACTURAS', 'CODIGO DE LA LISTA DE PRECIOS A MOSTRAR EN ARTICULOS') returning_values (:LISTA);
if (ORDEN = 'C') then
    BEGIN
    CODINI = ARTINI;
    CODFIN = ARTFIN;
    DESINI = '';
    DESFIN = 'zz';
    END
ELSE
    BEGIN
    DESINI = ARTINI;
    DESFIN = ARTFIN;
    CODINI = '';
    CODFIN = 'zz';
    END
EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION', 'FACTURAS', 'GENERAR PEDIDO AUTOMATICAMENTE CON LA FACTURA') returning_values (pedauto);
if (DETALLE = 'B') then
  BEGIN
  FOR SELECT ARTI_COD, ARTI_DES, ARTI_UNIDAD, ARTI_EXIST, TAIV_PORC, A.GRUP_COD, A.SUBG_COD, A.MARC_COD, BODE_COD, BODE_NOM, ARTI_CONSUMO, ARTI_PESO/1000
      FROM ARTICULO A, BODEGA B, TARIFA_IVA T
      WHERE ARTI_COD >= :CODINI AND ARTI_COD <= :CODFIN AND ARTI_DES >= :DESINI AND ARTI_DES <= :DESFIN AND ESAR_COD <> 'I' AND BODE_COD >= :BODINI AND
      BODE_COD <= :BODFIN AND ((SUCU_ID = :SUCURSAL) or (:SUCURSAL = 0)) AND A.TAIV_COD = T.TAIV_COD
      INTO :CODIGO, :NOMBRE, :UNIDAD, :EXIST, :IVA, :CODGRUPO, :CODSUBG, :CODMARC, :CODBOD, :NOMBOD, :CONSUMO, :pesounit
      DO
        BEGIN
        STAND = '';
        OK = 'N';
        if (AGRUPA = 'G') then
            BEGIN
            if ((CODGRUPO >= GRPINI) AND (CODGRUPO <= GRPFIN)) then
                OK = 'S';
            end
        ELSE
            if (AGRUPA = 'M') then
                BEGIN
                if ((CODMARC >= GRPINI) AND (CODMARC <= GRPFIN)) then
                    OK = 'S';
                END
        if (OK = 'S') then
            BEGIN
            NOMGRUPO = '';
            NOMMARC = '';
            NOMSUBG = '';
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            SELECT MAX(COBA_COD) FROM BARRAS_ARTICULO WHERE ARTI_COD = :codigo AND COBA_UNIDAD = :unidad INTO :codbar;
            if (CODBAR IS NULL) then
                CODBAR = CODIGO;
            if (EXIST <> 'N') then
                BEGIN
                SELECT STAND_COD FROM STANDS WHERE ARTI_COD = :CODIGO AND STAND_BODEGA = :CODBOD INTO :STAND;
                EXECUTE PROCEDURE SALDO_INICIAL_INVENTARIO(CODIGO, FECHA, :CODBOD) returning_values (CANT);
                EXECUTE PROCEDURE costo_promedio_y_ultimo_unidad(CODIGO, FECHA, UNIDAD) returning_values (COSTO, ULTCOSTO);
                SELECT MAX(MVAR_FECHA) FROM MOVIMIENTO_ARTICULO WHERE ARTI_COD = :CODIGO AND MVAR_ENTRADA = 'S' AND MVAR_FECHA <= :FECHA INTO :FECHACOSTO;
                if (MASIVA = 'S') then
                    COSTO = COSTO * (100 + :IVA) / 100 + :CONSUMO;
                COSTOTOT = :CANT * :COSTO;
                CONSUMO = CONSUMO * CANT;
                if (RESERVA = 'S') then
                    BEGIN
                    SELECT SUM(ORID_ENTREGAR)
                        FROM ORDENINVENTARIO_DETALLE OD, ordenes_inventario O
                        WHERE O.ORIN_ID = OD.ORIN_ID AND ARTI_COD = :CODIGO AND ORIN_FECHA <= :FECHA AND ORIN_FECLLEGA >= :FECHA AND ORID_ANULADO = 'N' AND OD.BODE_COD = :CODBOD
                        INTO :ORDENADO;
                    if (ORDENADO IS NULL) then
                        ORDENADO = 0;
                    ORDENC = 0;
                    FOR SELECT O.ORDC_ID, OCDE_ITEM, OCDE_CANT * OCDE_FACTOR
                        FROM ORDENES_COMPRA O, ORDENES_COMPRA_DETALLE OD
                        WHERE O.ORDC_ID = OD.ORDC_ID AND OD.ARTI_COD = :CODIGO AND ORDC_VENCE >= :FECHA AND ORDC_FECHA <= :FECHA AND OCDE_ANULADO = 'N' AND OD.BODE_COD = :CODBOD
                        INTO :ID, :ITEM, :CANT2
                        do
                        BEGIN
                        EXECUTE PROCEDURE FALTANTE(23, 21, ID, ITEM) returning_values (PEDIDO, UND, FACTOR);
                        if (PEDIDO * FACTOR = CANT2) then /* SI NO SE HA FACTURADO MIRE A VER SI SE REMISIONO */
                            EXECUTE PROCEDURE FALTANTE(23, 22, ID, ITEM) returning_values (PEDIDO, UND, FACTOR);
                        if (PEDIDO IS NULL) then
                            PEDIDO = 0;
                        ORDENC = ORDENC + PEDIDO * FACTOR;
                        END
                    ORDENADO = ORDENADO + ORDENC;
                    SELECT SUM(RSDE_LIBERAR)
                        FROM RESERVAS_DETALLE RD, RESERVAS R
                        WHERE R.RESE_ID = RD.RESE_ID AND ARTI_COD = :CODIGO AND RESE_FECHA <= :FECHA AND RESE_VENCE >= :FECHA AND RD.BODE_COD = :CODBOD AND RSDE_ANULADO = 'N'
                        INTO :RESERVADO;
                    if (RESERVADO IS NULL) then
                        RESERVADO = 0;
                    PEDIDO = 0;
                    FOR SELECT P.PEDI_ID, PEDE_ITEM, PEDE_CANT * PEDE_FACTOR
                        FROM PEDIDOS P, PEDIDOS_DETALLE PD
                        WHERE P.PEDI_ID = PD.PEDI_ID AND PD.ARTI_COD = :CODIGO AND PEDI_VENCE >= :FECHA AND PEDI_FECHA <= :FECHA AND PEDE_ANULADO = 'N' AND BODE_COD = :CODBOD
                        INTO :ID, :ITEM, :CANT2
                        do
                        BEGIN
                        EXECUTE PROCEDURE FALTANTE(34, 31, ID, ITEM) returning_values (ORDENC, UND, FACTOR);
                        if ((ORDENC * FACTOR = CANT2) or (PEDAUTO = 'SI')) then /* SI NO SE HA FACTURADO MIRE A VER SI SE REMISIONO */
                            EXECUTE PROCEDURE FALTANTE(34, 32, ID, ITEM) returning_values (ORDENC, UND, FACTOR);
                        if (ORDENC IS NULL) then
                            ORDENC = 0;
                        PEDIDO = PEDIDO + ORDENC * FACTOR;
                        END
                    RESERVADO = RESERVADO + PEDIDO;
                    END
                ELSE
                    BEGIN
                    RESERVADO = 0;
                    ORDENADO = 0;
                    END
                if (LISTA > 0) then
                    SELECT prar_fijo FROM precios_articulo WHERE arti_cod = :CODIGO and lipr_cod = :LISTA INTO :PRECIO;
                if (ENPESO = 'S') then
                    BEGIN
                    if (pesounit IS NULL) then
                        pesounit = 0;
                    if (PESOUNIT <> 0) then
                        BEGIN
                        pesototal = PESOUNIT * cant;
                        SUSPEND;
                        END
                    END
                ELSE
                    SUSPEND;
                END
            END
        END
  END

if (DETALLE = 'L') then
  BEGIN
  FOR SELECT A.ARTI_COD, ARTI_DES, ARTI_UNIDAD, ARTI_EXIST, TAIV_PORC, A.GRUP_COD, A.SUBG_COD, A.MARC_COD, L.lote_nro, L.lote_nro||' - '||L.lote_vence, ARTI_CONSUMO,l.bode_cod, L.lote_saldo,l.lote_costo, ARTI_PESO/1000
      FROM ARTICULO A, LOTES l, TARIFA_IVA T
      WHERE A.ARTI_COD >= '0' AND A.ARTI_COD <= 'zz' AND ARTI_DES >= '' AND ARTI_DES <= 'zz' AND ESAR_COD <> 'I' AND A.TAIV_COD = T.TAIV_COD and a.arti_cod = l.arti_cod
      INTO :CODIGO, :NOMBRE, :UNIDAD, :EXIST, :IVA, :CODGRUPO, :CODSUBG, :CODMARC, :LOTE, :NOMBOD, :CONSUMO, :codbod, :cant, :costo_lote, :pesounit
      DO
        BEGIN
        OK = 'N';
        if (AGRUPA = 'G') then
            BEGIN
            if ((CODGRUPO >= GRPINI) AND (CODGRUPO <= GRPFIN)) then
                OK = 'S';
            end
        ELSE
            if (AGRUPA = 'M') then
                BEGIN
                if ((CODMARC >= GRPINI) AND (CODMARC <= GRPFIN)) then
                    OK = 'S';
                END
        if (OK = 'S') then
            BEGIN
            NOMGRUPO = '';
            NOMMARC = '';
            NOMSUBG = '';
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            SELECT MAX(COBA_COD) FROM BARRAS_ARTICULO WHERE ARTI_COD = :codigo AND COBA_UNIDAD = :unidad INTO :codbar;
            if (CODBAR IS NULL) then
                CODBAR = CODIGO;

            if (EXIST <> 'N') then
                BEGIN
                EXECUTE PROCEDURE COSTO_PROMEDIO_UNIDAD(CODIGO, FECHA, UNIDAD) returning_values (COSTO);
                EXECUTE PROCEDURE ULTIMO_COSTO(CODIGO, FECHA, UNIDAD) returning_values (ULTCOSTO);
                SELECT MAX(MVAR_FECHA) FROM MOVIMIENTO_ARTICULO WHERE ARTI_COD = :CODIGO AND MVAR_ENTRADA = 'S' AND MVAR_FECHA <= :FECHA INTO :FECHACOSTO;
                if (MASIVA = 'S') then
                    COSTO = COSTO * (100 + :IVA) / 100 + :CONSUMO;
                COSTOTOT = :CANT * :COSTO;
                CONSUMO = CONSUMO * CANT;
                if (RESERVA = 'S') then
                    BEGIN
                    SELECT SUM(ORID_ENTREGAR)
                        FROM ORDENINVENTARIO_DETALLE OD, ordenes_inventario O
                        WHERE O.ORIN_ID = OD.ORIN_ID AND ARTI_COD = :CODIGO AND ORIN_FECHA <= :FECHA AND ORIN_FECLLEGA >= :FECHA AND ORID_ANULADO = 'N'
                        INTO :ORDENADO;
                    if (ORDENADO IS NULL) then
                        ORDENADO = 0;
                    ORDENC = 0;
                    FOR SELECT O.ORDC_ID, OCDE_ITEM, OCDE_CANT * OCDE_FACTOR
                        FROM ORDENES_COMPRA O, ORDENES_COMPRA_DETALLE OD
                        WHERE O.ORDC_ID = OD.ORDC_ID AND OD.ARTI_COD = :CODIGO AND ORDC_VENCE >= :FECHA AND ORDC_FECHA <= :FECHA AND OCDE_ANULADO = 'N'
                        INTO :ID, :ITEM, :CANT2
                        do
                        BEGIN
                        EXECUTE PROCEDURE FALTANTE(23, 21, ID, ITEM) returning_values (PEDIDO, UND, FACTOR);
                        if (PEDIDO * FACTOR = CANT2) then /* SI NO SE HA FACTURADO MIRE A VER SI SE REMISIONO */
                            EXECUTE PROCEDURE FALTANTE(23, 22, ID, ITEM) returning_values (PEDIDO, UND, FACTOR);
                        if (PEDIDO IS NULL) then
                            PEDIDO = 0;
                        ORDENC = ORDENC + PEDIDO * FACTOR;
                        END
                    ORDENADO = ORDENADO + ORDENC;
                    SELECT SUM(RSDE_LIBERAR)
                        FROM RESERVAS_DETALLE RD, RESERVAS R
                        WHERE R.RESE_ID = RD.RESE_ID AND ARTI_COD = :CODIGO AND RESE_FECHA <= :FECHA AND RESE_VENCE >= :FECHA AND RSDE_ANULADO = 'N'
                        INTO :RESERVADO;
                    if (RESERVADO IS NULL) then
                        RESERVADO = 0;
                    PEDIDO = 0;
                    FOR SELECT P.PEDI_ID, PEDE_ITEM, PEDE_CANT * PEDE_FACTOR
                        FROM PEDIDOS P, PEDIDOS_DETALLE PD
                        WHERE P.PEDI_ID = PD.PEDI_ID AND PD.ARTI_COD = :CODIGO AND PEDI_VENCE >= :FECHA AND PEDI_FECHA <= :FECHA AND PEDE_ANULADO = 'N'
                        INTO :ID, :ITEM, :CANT2
                        do
                        BEGIN
                        EXECUTE PROCEDURE FALTANTE(34, 31, ID, ITEM) returning_values (ORDENC, UND, FACTOR);
                        if ((ORDENC * FACTOR = CANT2) or (PEDAUTO = 'SI')) then /* SI NO SE HA FACTURADO MIRE A VER SI SE REMISIONO */
                            EXECUTE PROCEDURE FALTANTE(34, 32, ID, ITEM) returning_values (ORDENC, UND, FACTOR);
                        if (ORDENC IS NULL) then
                            ORDENC = 0;
                        PEDIDO = PEDIDO + ORDENC * FACTOR;
                        END
                    RESERVADO = RESERVADO + PEDIDO;
                    END
                ELSE
                    BEGIN
                    RESERVADO = 0;
                    ORDENADO = 0;
                    END
                if (LISTA > 0) then
                    SELECT prar_fijo FROM precios_articulo WHERE arti_cod = :CODIGO and lipr_cod = :LISTA INTO :PRECIO;
                if (ENPESO = 'S') then
                    BEGIN
                    if (pesounit IS NULL) then
                        pesounit = 0;
                    if (PESOUNIT <> 0) then
                        BEGIN
                        pesototal = PESOUNIT * cant;
                        SUSPEND;
                        END
                    END
                ELSE
                    SUSPEND;
                END
            END
        END
  end
if (DETALLE = 'N') then
  BEGIN
  FOR SELECT ARTI_COD, ARTI_DES, ARTI_UNIDAD, ARTI_EXIST, TAIV_PORC, A.GRUP_COD, A.SUBG_COD, A.MARC_COD, ARTI_CONSUMO, ARTI_PESO/1000
      FROM ARTICULO A, TARIFA_IVA T
      WHERE ARTI_COD >= :CODINI AND ARTI_COD <= :CODFIN AND ARTI_DES >= :DESINI AND ARTI_DES <= :DESFIN AND ESAR_COD <> 'I' AND A.TAIV_COD = T.TAIV_COD
      INTO :CODIGO, :NOMBRE, :UNIDAD, :EXIST, :IVA, :CODGRUPO, :CODSUBG, :CODMARC, :CONSUMO, :pesounit
      DO
        BEGIN
        OK = 'N';
        if (AGRUPA = 'G') then
            BEGIN
            if ((GRPINI = '0') AND (GRPFIN = 'zz')) then
                OK = 'S';
            else
                if ((CODGRUPO >= GRPINI) AND (CODGRUPO <= GRPFIN)) then
                    OK = 'S';
            end
        ELSE
            if (AGRUPA = 'M') then
                BEGIN
                if ((GRPINI = '0') AND (GRPFIN = 'zzz')) then
                    OK = 'S';
                else
                    if ((CODMARC >= GRPINI) AND (CODMARC <= GRPFIN)) then
                        OK = 'S';
                END
        if (OK = 'S') then
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            SELECT MAX(COBA_COD) FROM BARRAS_ARTICULO WHERE ARTI_COD = :codigo AND COBA_UNIDAD = :unidad INTO :codbar;
            if (CODBAR IS NULL) then
                CODBAR = CODIGO;

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

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

SET TERM ; ^

/* 20091105 */
/* MEJORA RENDIMIENTO EXISTENCIAS Y COSTOS */

ALTER TABLE EXISTENCIA DROP CONSTRAINT PK_EXISTENCIA;

alter table EXISTENCIA
add constraint PK_EXISTENCIA
primary key (ARTI_COD,BODE_COD,EXIS_FECHA)
using descending index PK_EXISTENCIA;

ALTER TABLE COSTOS DROP CONSTRAINT PK_COSTOS;

alter table COSTOS
add constraint PK_COSTOS
primary key (ARTI_COD,COST_FECHA,COST_ITEM)
using descending index PK_COSTOS;

DROP INDEX COSTOS_IDX1;

CREATE INDEX COSTOS_IDX1
ON COSTOS (ARTI_COD,COST_IDMOV);

DROP INDEX MOVIMIENTO_ARTICULO_IDX1;

CREATE DESCENDING INDEX MOVIMIENTO_ARTICULO_IDX1
ON MOVIMIENTO_ARTICULO (ARTI_COD, MVAR_FECHA);

CREATE INDEX MOVIMIENTO_ARTICULO_IDX3
ON MOVIMIENTO_ARTICULO (ARTI_COD,MVAR_FECHA);

CREATE INDEX ORDENES_COMPRA_IDX3
ON ORDENES_COMPRA (ORDC_FECHA);

CREATE INDEX PEDIDOS_IDX3
ON PEDIDOS (PEDI_FECHA);

ALTER TABLE EXISTENCIA_LOTE DROP CONSTRAINT PK_EXISTENCIA_LOTE;

alter table EXISTENCIA_LOTE
add constraint PK_EXISTENCIA_LOTE
primary key (ARTI_COD,BODE_COD,LOTE_NRO,EXLO_FECHA)
using descending index PK_EXISTENCIA_LOTE;


SET TERM ^ ;

CREATE OR ALTER procedure SALDO_INVENTARIO (
    ARTICULO varchar(15),
    BODEGA varchar(2),
    FECHA date)
returns (
    SALDO numeric(18,4))
AS
BEGIN
/* Busca la fecha del último movimiento del artículo en la bodega antes de la fecha */
SELECT first 1 (EXIS_SALDO + EXIS_ENTR - EXIS_SAL) FROM EXISTENCIA
    WHERE (ARTI_COD = :ARTICULO) AND (BODE_COD = :BODEGA) AND (EXIS_FECHA <= :FECHA)
    ORDER BY ARTI_COD DESC, BODE_COD DESC, EXIS_FECHA DESC INTO :SALDO;
if (SALDO IS NULL) then
    SALDO = 0;
SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE AKTIVIA_INVENTARIO(
    FECHA DATE)
RETURNS (
    CODBOD VARCHAR(2),
    CODIGO VARCHAR(15),
    CANT NUMERIC(18,4))
AS
BEGIN
FOR SELECT BODE_COD FROM BODEGA WHERE BODE_ACTIVA = 'S' INTO :CODBOD
    DO
    BEGIN
    FOR SELECT ARTI_COD FROM ARTICULO A WHERE ESAR_COD <> 'I' AND ARTI_EXIST <> 'N' INTO :CODIGO
        DO
        BEGIN
        EXECUTE PROCEDURE saldo_inventario(CODIGO, :CODBOD, FECHA) returning_values (CANT);
        END
    END
END

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE DISPONIBILIDAD_ARTICULO(
    ARTICULO VARCHAR(15),
    FECHA DATE,
    BODEGA VARCHAR(2))
RETURNS (
    DISPONIBILIDAD INTEGER,
    EXIST NUMERIC(18,4),
    PROMEDIO NUMERIC(18,4),
    SALIDAS NUMERIC(18,4))
AS
BEGIN
  EXECUTE PROCEDURE SALDO_INVENTARIO (ARTICULO, BODEGA, FECHA) returning_values (:EXIST);
  EXECUTE PROCEDURE PROMEDIO_SALIDAS_ARTICULO(:ARTICULO, :FECHA, :BODEGA) returning_values (:PROMEDIO, :SALIDAS);
  if (PROMEDIO > 0) then
    DISPONIBILIDAD = EXIST / PROMEDIO;
  ELSE
    DISPONIBILIDAD = 0;
  SUSPEND;
END

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE EXISTENCIAS(
    ARTICULO VARCHAR(15),
    FECHA DATE)
RETURNS (
    BODEGA VARCHAR(2),
    STAND VARCHAR(20),
    EXISTENCIA NUMERIC(18,4))
AS
BEGIN
  for select bode_cod from bodega into :bodega
    do
    begin
    SELECT MAX(EXIS_STAND) FROM EXISTENCIA WHERE ARTI_COD = :ARTICULO AND BODE_COD = :BODEGA INTO :STAND;
    execute procedure saldo_inventario (:articulo, :bodega, :fecha) returning_values (:Existencia);
    SUSPEND;
    end
END

^

SET TERM ; ^

SET TERM ^ ;

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

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

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

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE EXISTENCIAS_COMPRAS(
    ARTICULO VARCHAR(15),
    FECHA DATE,
    UNIDAD VARCHAR(8))
RETURNS (
    BODEGA VARCHAR(2),
    EXISTENCIA NUMERIC(18,2),
    RESERVADO NUMERIC(18,2),
    ORDENADO NUMERIC(18,2),
    PROMEDIO NUMERIC(18,2),
    VENTAMES NUMERIC(18,2),
    FECHACMP DATE,
    CANTCMP NUMERIC(18,2),
    DIAS INTEGER,
    SUGERIDO NUMERIC(18,2),
    STAND VARCHAR(20))
AS
declare variable FACTOR NUMERIC(15,4);
declare variable ORDENC NUMERIC(18,4);
declare variable PEDIDO NUMERIC(18,4);
declare variable ITEM INTEGER;
declare variable ID INTEGER;
declare variable UND VARCHAR(8);
declare variable CANT NUMERIC(18,4);
declare variable FACTOR2 NUMERIC(18,4);
declare variable fecini DATE;
declare variable FECHAAUX VARCHAR(10);
declare variable AGENCIA INTEGER;
declare variable DEVMES NUMERIC(18,2);
declare variable MFAC INTEGER;
declare variable MDEV INTEGER;
declare variable IVAF NUMERIC(18,2);
declare variable IVAD NUMERIC(18,2);
declare variable DIA_ART VARCHAR(2) CHARACTER SET NONE;
declare variable DIASC VARCHAR(255);
declare variable PEDAUTO CHAR(2);
declare variable SALIDAS NUMERIC(18,4);
BEGIN
  for select bode_cod, SUCU_ID from bodega into :bodega, :agencia
    do
    begin
    execute procedure saldo_inventario (:articulo, :bodega, :fecha) returning_values (:Existencia);
    EXECUTE PROCEDURE FACTOR_UNIDAD_CANT(:ARTICULO, :UNIDAD) returning_values (:FACTOR);
    if (FACTOR <> 0) then
        EXISTENCIA = EXISTENCIA / FACTOR;
    else
        EXISTENCIA = 0;
    STAND = '';
    SELECT STAND_COD FROM STANDS WHERE ARTI_COD = :ARTICULO AND STAND_BODEGA = :BODEGA INTO :stand;
    EXECUTE PROCEDURE promedio_salidas_articulo (:ARTICULO, :FECHA, :BODEGA) returning_values (:PROMEDIO, :SALIDAS);
    EXECUTE PROCEDURE lee_configuracion ('INVENTARIO', 'EXISTENCIAS', 'PROMEDIAR LAS SALIDAS DEL INVENTARIO CON EL NUMERO DE DIAS ASIGNADO A CADA ARTICULO') returning_values (:DIA_ART);
    if (DIA_ART = 'NO') then
        BEGIN
        EXECUTE PROCEDURE lee_configuracion ('INVENTARIO', 'EXISTENCIAS', 'NUMERO DE DIAS PARA PROMEDIO DE SALIDAS POR ARTICULO') returning_values (DIASC);
        DIAS = CAST(DIASC AS INTEGER);
        END
    ELSE
        SELECT ARTI_DIAS FROM ARTICULO WHERE ARTI_COD = :ARTICULO INTO :DIAS;
    if (DIAS is null) then
        DIAS = 0;
    PROMEDIO = DIAS * PROMEDIO;
    if (FACTOR <> 0) then
        PROMEDIO = PROMEDIO / FACTOR;
    SUGERIDO = PROMEDIO - EXISTENCIA;
    SELECT SUM(ORID_ENTREGAR)
      FROM ORDENINVENTARIO_DETALLE OD, ordenes_inventario O
      WHERE O.ORIN_ID = OD.ORIN_ID AND ARTI_COD = :ARTICULO AND ORIN_FECHA <= :FECHA AND ORIN_FECLLEGA >= :FECHA AND ORID_ANULADO = 'N' AND OD.BODE_COD = :BODEGA
      INTO :ORDENADO;
    if (ORDENADO IS NULL) then
        ORDENADO = 0;
    ORDENC = 0;
    FOR SELECT O.ORDC_ID, OCDE_ITEM, OCDE_CANT * OCDE_FACTOR
        FROM ORDENES_COMPRA O, ORDENES_COMPRA_DETALLE OD
        WHERE O.ORDC_ID = OD.ORDC_ID AND OD.ARTI_COD = :ARTICULO AND (ORDC_FECHA+ORDC_VALIDEZ) >= :FECHA AND ORDC_FECHA <= :FECHA AND OCDE_ANULADO = 'N' AND OD.BODE_COD = :BODEGA
        INTO :ID, :ITEM, :CANT
        do
        BEGIN
        EXECUTE PROCEDURE FALTANTE(23, 21, ID, ITEM) returning_values (PEDIDO, UND, FACTOR2);
        if (PEDIDO * FACTOR2 = CANT) then /* SI NO SE HA FACTURADO MIRE A VER SI SE REMISIONO */
            EXECUTE PROCEDURE FALTANTE(23, 22, ID, ITEM) returning_values (PEDIDO, UND, FACTOR2);
        if (PEDIDO IS NULL) then
            PEDIDO = 0;
        ORDENC = ORDENC + PEDIDO * FACTOR2;
        END
    ORDENADO = ORDENADO + ORDENC;
    if (FACTOR <> 0) then
        ORDENADO = ORDENADO / FACTOR;
    SELECT SUM(RSDE_LIBERAR)
      FROM RESERVAS_DETALLE RD, RESERVAS R
      WHERE R.RESE_ID = RD.RESE_ID AND ARTI_COD = :ARTICULO AND RESE_FECHA <= :FECHA AND RESE_VENCE >= :FECHA AND RD.BODE_COD = :BODEGA AND RSDE_ANULADO = 'N'
      INTO :RESERVADO;
    if (RESERVADO IS NULL) then
        RESERVADO = 0;
    PEDIDO = 0;
    FOR SELECT P.PEDI_ID, PEDE_ITEM, PEDE_CANT * PEDE_FACTOR
        FROM PEDIDOS P, PEDIDOS_DETALLE PD
        WHERE P.PEDI_ID = PD.PEDI_ID AND PD.ARTI_COD = :ARTICULO AND (PEDI_FECHA+PEDI_VALIDEZ) >= :FECHA AND PEDI_FECHA <= :FECHA AND PEDE_ANULADO = 'N' AND BODE_COD = :BODEGA
        INTO :ID, :ITEM, :CANT
        do
        BEGIN
        EXECUTE PROCEDURE FALTANTE(34, 31, ID, ITEM) returning_values (ORDENC, UND, FACTOR2);
        EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION', 'FACTURAS', 'GENERAR PEDIDO AUTOMATICAMENTE CON LA FACTURA') returning_values (pedauto);
        if ((ORDENC * FACTOR2 = CANT) or (PEDAUTO = 'SI')) then /* SI NO SE HA FACTURADO MIRE A VER SI SE REMISIONO */
            EXECUTE PROCEDURE FALTANTE(34, 32, ID, ITEM) returning_values (ORDENC, UND, FACTOR2);
        if (ORDENC IS NULL) then
            ORDENC = 0;
        PEDIDO = PEDIDO + ORDENC * FACTOR2;
        END
    RESERVADO = RESERVADO + PEDIDO;
    if (FACTOR <> 0) then
        RESERVADO = RESERVADO / FACTOR;
    /* VENTAS MES */
    FECHAAUX = CAST (FECHA AS VARCHAR(10));
    FECHAAUX = SUBSTR(FECHAAUX, 1, 7) || '/01';
    FECINI = CAST (FECHAAUX AS DATE);
    EXECUTE PROCEDURE ventas_articulo (:ARTICULO, :FECINI, :FECHA, :agencia) returning_values (:ventames, :mfac, :devmes, :mdev, :ivaf, :ivad);
    ventames = ventames - devmes;
    if (FACTOR <> 0) then
        ventames = ventames / FACTOR;
    /* FECHA COMPRA */
    fechacmp = null;
    cantcmp = 0;
    SELECT FIRST 1 FACO_FECHA, FCDE_CANT * FCDE_FACTOR FROM FACTURAS_COMPRA F, FACTURAS_COMPRAS_DETALLE D
        WHERE F.FACO_ID = D.faco_id AND D.ARTI_COD = :articulo AND FACO_FECHA <= :FECHA AND D.bode_cod = :BODEGA
        ORDER BY FACO_FECHA DESC, F.FACO_ID DESC
        INTO :fechacmp, :cantcmp;
    SUSPEND;
    end
END

^

SET TERM ; ^

SET TERM ^ ;

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

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

^

SET TERM ; ^

SET TERM ^ ;

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

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE MAXIMO_ARTICULO(
    ARTICULO VARCHAR(15),
    FECHA DATE,
    BODEGA CHAR(2),
    CANT NUMERIC(18,2))
RETURNS (
    EXCESO NUMERIC(18,2))
AS
declare variable DIAS CHAR(2);
declare variable PROMEDIO NUMERIC(18,4);
declare variable SALIDAS NUMERIC(18,4);
declare variable MAXIMO NUMERIC(18,4);
declare variable SALDO NUMERIC(18,4);
BEGIN
  /* CUANDO CONFIGURACION MINIMO EN DIAS */
  EXECUTE PROCEDURE LEE_CONFIGURACION ('INVENTARIO', 'EXISTENCIAS', 'MAXIMO INVENTARIO EN DIAS') returning_values (DIAS);
  if (DIAS = 'SI') then
    BEGIN
    EXECUTE PROCEDURE PROMEDIO_SALIDAS_ARTICULO(:ARTICULO, :FECHA, :BODEGA) returning_values (:PROMEDIO, :SALIDAS);
    SELECT ARTI_MAX * :PROMEDIO FROM ARTICULO WHERE ARTI_COD = :ARTICULO INTO :MAXIMO;
    end
  ELSE
    BEGIN
    SELECT ARTI_MAX FROM ARTICULO WHERE ARTI_COD = :ARTICULO INTO :MAXIMO;
    END
  if (MAXIMO IS NULL) then
    MAXIMO = 0;
  EXECUTE PROCEDURE SALDO_INVENTARIO(:ARTICULO, :BODEGA, :FECHA) returning_values (SALDO);
  if (SALDO+CANT > maximo) then
    EXCESO = MAXIMO - (SALDO+CANT);
  ELSE
    EXCESO = 0;
  SUSPEND;
END

^

SET TERM ; ^

SET TERM ^ ;

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

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE ORDEN_SUGERIDA(
    PROVEEDOR VARCHAR(20),
    FECHA DATE)
RETURNS (
    ARTICULO VARCHAR(15),
    BODEGA VARCHAR(2),
    CANT NUMERIC(18,4),
    UNIDAD VARCHAR(8),
    COSTO NUMERIC(18,2))
AS
declare variable FACTOR NUMERIC(15,4);
declare variable DIAS INTEGER;
declare variable EXISTENCIA NUMERIC(18,4);
declare variable PROMEDIO NUMERIC(18,4);
declare variable AGENCIA INTEGER;
declare variable DIA_ART VARCHAR(2) CHARACTER SET NONE;
declare variable DIASC VARCHAR(255);
declare variable SALIDAS NUMERIC(18,4);
BEGIN
FOR SELECT a.ARTI_COD, PVAR_COSTO, ARTI_UNIDAD, ARTI_DIAS FROM proveedor_articulo p, articulo a
    WHERE p.arti_cod = a.arti_cod and TERC_NIT = :proveedor order by a.arti_des
    INTO :articulo, :costo, :unidad, :DIAS
  DO BEGIN
  for select bode_cod, SUCU_ID from bodega into :bodega, :agencia
    do
    begin
    execute procedure saldo_inventario (:articulo, :bodega, :fecha) returning_values (:Existencia);
    EXECUTE PROCEDURE FACTOR_UNIDAD_CANT(:ARTICULO, :UNIDAD) returning_values (:FACTOR);
    if (FACTOR <> 0) then
        EXISTENCIA = EXISTENCIA / FACTOR;
    else
        EXISTENCIA = 0;
    EXECUTE PROCEDURE promedio_salidas_articulo (:ARTICULO, :FECHA, :BODEGA) returning_values (:PROMEDIO, :SALIDAS);
    EXECUTE PROCEDURE lee_configuracion ('INVENTARIO', 'EXISTENCIAS', 'PROMEDIAR LAS SALIDAS DEL INVENTARIO CON EL NUMERO DE DIAS ASIGNADO A CADA ARTICULO') returning_values (:DIA_ART);
    if (DIA_ART = 'NO') then
        BEGIN
        EXECUTE PROCEDURE lee_configuracion ('INVENTARIO', 'EXISTENCIAS', 'NUMERO DE DIAS PARA PROMEDIO DE SALIDAS POR ARTICULO') returning_values (DIASC);
        DIAS = CAST(DIASC AS INTEGER);
        END
    if (DIAS is null) then
        DIAS = 0;
    PROMEDIO = DIAS * PROMEDIO;
    if (FACTOR <> 0) then
        PROMEDIO = PROMEDIO / FACTOR;
    CANT = PROMEDIO - EXISTENCIA;
    if (CANT > 0) then
        SUSPEND;
    end
  END
END

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE ORDEN_SUGERIDA_BOD(
    PROVEEDOR VARCHAR(20),
    BODEGA VARCHAR(2),
    FECHA DATE)
RETURNS (
    ARTICULO VARCHAR(15),
    CANT NUMERIC(18,4),
    UNIDAD VARCHAR(8),
    COSTO NUMERIC(18,2))
AS
declare variable FACTOR NUMERIC(15,4);
declare variable DIAS INTEGER;
declare variable EXISTENCIA NUMERIC(18,4);
declare variable PROMEDIO NUMERIC(18,4);
declare variable DIA_ART VARCHAR(2) CHARACTER SET NONE;
declare variable DIASC VARCHAR(255);
declare variable SALIDAS NUMERIC(18,4);
BEGIN
EXECUTE PROCEDURE lee_configuracion ('INVENTARIO', 'EXISTENCIAS', 'PROMEDIAR LAS SALIDAS DEL INVENTARIO CON EL NUMERO DE DIAS ASIGNADO A CADA ARTICULO') returning_values (:DIA_ART);
EXECUTE PROCEDURE lee_configuracion ('INVENTARIO', 'EXISTENCIAS', 'NUMERO DE DIAS PARA PROMEDIO DE SALIDAS POR ARTICULO') returning_values (DIASC);
FOR SELECT a.ARTI_COD, PVAR_COSTO, ARTI_UNIDAD, ARTI_DIAS
    FROM proveedor_articulo p, articulo a
    WHERE TERC_NIT = :proveedor and p.arti_cod = a.arti_cod
    INTO :articulo, :costo, :unidad, :DIAS
    DO
    begin
    execute procedure saldo_inventario (:articulo, :bodega, :fecha) returning_values (:Existencia);
    EXECUTE PROCEDURE FACTOR_UNIDAD_CANT(:ARTICULO, :UNIDAD) returning_values (:FACTOR);
    if (FACTOR <> 0) then
        EXISTENCIA = EXISTENCIA / FACTOR;
    else
        EXISTENCIA = 0;
    EXECUTE PROCEDURE promedio_salidas_articulo (:ARTICULO, :FECHA, :BODEGA) returning_values (:PROMEDIO, :SALIDAS);
    if (DIA_ART = 'NO') then
        BEGIN
        DIAS = CAST(DIASC AS INTEGER);
        END
    if (DIAS is null) then
        DIAS = 0;
    PROMEDIO = DIAS * PROMEDIO;
    if (FACTOR <> 0) then
        PROMEDIO = PROMEDIO / FACTOR;
    CANT = PROMEDIO - EXISTENCIA;
    if (CANT > 0) then
        SUSPEND;
    end
END

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE PRECIOS_Y_EXISTENCIA(
    CODIGO VARCHAR(15),
    BODEGA VARCHAR(2),
    FECHA DATE)
RETURNS (
    PRECIO1 NUMERIC(18,2),
    PRECIO2 NUMERIC(18,2),
    PRECIO3 NUMERIC(18,2),
    EXISTEN NUMERIC(18,4))
AS
declare variable I INTEGER;
declare variable PRECIO NUMERIC(18, 2);
BEGIN
EXECUTE PROCEDURE SALDO_INVENTARIO(:CODIGO, :BODEGA, :FECHA) returning_values (:EXISTEN);
I = 0;
FOR SELECT PRAR_FIJO FROM PRECIOS_ARTICULO
    WHERE ARTI_COD = :CODIGO
    ORDER BY LIPR_COD
    INTO :PRECIO
    DO
    BEGIN
    I = I + 1;
    if (I = 1) then
        PRECIO1 = PRECIO;
    if (I = 2) then
        PRECIO2 = PRECIO;
    if (I = 3) then
        PRECIO3 = PRECIO;
    END
SUSPEND;
END

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE PROMEDIO_SALIDAS_ARTICULO(
    ARTICULO VARCHAR(15),
    FECHA DATE,
    BODEGA VARCHAR(2))
RETURNS (
    PROMEDIO NUMERIC(18,4),
    SALIDAS NUMERIC(18,4))
AS
declare variable FECINI DATE;
declare variable DIASC VARCHAR(255);
declare variable DIAS INTEGER;
declare variable DIA_ART VARCHAR(2) CHARACTER SET NONE;
declare variable INCSALI VARCHAR(2);
declare variable SININV VARCHAR(2);
declare variable saldo numeric(18,2);
BEGIN
SELECT FIRST 1 PRSA_PROMEDIO, PRSA_FECHA FROM promedio_salidas WHERE ARTI_COD = :articulo AND BODE_COD = :bodega ORDER BY PRSA_FECHA INTO :promedio, :fecini;
if (((FECHA - FECINI) > 7) or (FECINI IS NULL) or (PROMEDIO IS NULL) ) then
  BEGIN
  EXECUTE PROCEDURE lee_configuracion ('INVENTARIO', 'EXISTENCIAS', 'INCLUIR SALIDAS POR CONCEPTOS DIFERENTES A VENTA EN CALCULO DE PROMEDIO DE SALIDAS POR ARTICULO') returning_values (INCSALI);
  /*DE ACUERDO A PARAMETRO TOME LOS DIAS PARA EL PROMDIO*/
  EXECUTE PROCEDURE lee_configuracion ('INVENTARIO', 'EXISTENCIAS', 'PROMEDIAR LAS SALIDAS DEL INVENTARIO CON EL NUMERO DE DIAS ASIGNADO A CADA ARTICULO') returning_values (:DIA_ART);
  /* SUME LAS CANTIDADES SALIDAS DEL INVENTARIO */
  EXECUTE PROCEDURE lee_configuracion ('INVENTARIO', 'EXISTENCIAS', 'NUMERO DE DIAS PARA PROMEDIO DE SALIDAS POR ARTICULO') returning_values (DIASC);
  EXECUTE PROCEDURE lee_configuracion ('INVENTARIO', 'EXISTENCIAS', 'INCLUIR DIAS SIN EXISTENCIA EN PROMEDIO DE VENTAS DIARIO') returning_values (:SININV);
  if (DIA_ART = 'SI') then
    BEGIN
      SELECT ARTI_DIANALIS FROM ARTICULO WHERE ARTI_COD = :ARTICULO INTO :DIAS;
    END
  ELSE
     DIAS = CAST(DIASC AS INTEGER);
  if (DIAS IS NULL) then
    DIAS = 30;
  FECINI = FECHA - DIAS;
  if (INCSALI = 'SI') then
      SELECT SUM(MVAR_CANT) FROM MOVIMIENTO_ARTICULO
        WHERE ARTI_COD = :ARTICULO AND BODE_COD = :BODEGA AND MVAR_FECHA >= :FECINI AND MVAR_FECHA <= :FECHA AND MVAR_ENTRADA = 'N' AND MVAR_TIPODOC <> 13 INTO :SALIDAS;
  else
      SELECT SUM(MVAR_CANT) FROM MOVIMIENTO_ARTICULO
        WHERE ARTI_COD = :ARTICULO AND BODE_COD = :BODEGA AND MVAR_FECHA >= :FECINI AND MVAR_FECHA <= :FECHA AND ((MVAR_TIPODOC = 31) or (MVAR_TIPODOC = 32)) INTO :SALIDAS;
  if (SALIDAS IS NULL) then
    SALIDAS = 0;
  if (SININV = 'SI') then
      PROMEDIO = SALIDAS / DIAS;
  else
    begin
    dias = 0;
    while (fecini < fecha) do
        begin
        execute procedure saldo_inventario (:articulo, :bodega, :fecini) returning_values (:saldo);
        if (SALDO <> 0) then
            DIAS = DIAS + 1;
        fecini = fecini + 1;
        end
    if (DIAS = 0) then
        PROMEDIO = 0;
    ELSE
        PROMEDIO = SALIDAS / DIAS;
    end
  UPDATE or INSERT INTO promedio_salidas (ARTI_COD, BODE_COD, PRSA_FECHA, PRSA_PROMEDIO)
    VALUES (:articulo, :bodega, :fecha, :promedio);
  END
SUSPEND;
END

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE RESTE_EXISTENCIA(
    ARTICULO VARCHAR(15),
    BODEGA VARCHAR(2),
    FECHA DATE,
    CANTIDAD NUMERIC(18,4),
    ANULAR CHAR(1))
AS
DECLARE VARIABLE existe INTEGER;
DECLARE VARIABLE saldo NUMERIC(15,4);
DECLARE VARIABLE exart CHAR(1);
declare variable sumar integer;
BEGIN
  if (ANULAR = 'S') then
    sumar = -1;
  else
    sumar = 1;
  /* Verfique si el artículo tiene control de existencias */
  SELECT arti_exist FROM articulo WHERE arti_cod = :articulo
    INTO :exart;
  IF (exart <> 'N') THEN
    BEGIN
    /*  Si en EXISTENCIA existe el registro articulo-bodega-fecha le suma
        a las salidas la cantidad, si no, crea un nuevo registro       */
    SELECT 1 FROM EXISTENCIA
      WHERE (arti_cod = :articulo) AND
        (bode_cod = :bodega) AND (exis_fecha = :fecha) INTO :existe;
    IF (existe IS NULL) THEN
      BEGIN
      /*  No existe movimiento en esa fecha, traiga el saldo anterior y
          registre uno nuevo */
      EXECUTE PROCEDURE saldo_inventario(:articulo, :bodega, :fecha)
        RETURNING_VALUES :saldo;
      INSERT INTO existencia (arti_cod, bode_cod, exis_fecha,
          exis_entr, exis_sal, exis_saldo)
          VALUES (:articulo, :bodega, :fecha, 0, (:cantidad * :sumar), :saldo);
      END /* if existe */
    ELSE
      BEGIN
      /* Ya existe un registro en la fecha */
      UPDATE EXISTENCIA
          SET exis_sal = exis_sal + (:cantidad * :sumar)
          WHERE (arti_cod = :articulo) AND 
            (bode_cod = :bodega) AND (exis_fecha = :fecha);
      END
    /*  Recorra los registros de fechas posteriores actualizando el saldo
        anterior */
    UPDATE existencia
        SET exis_saldo = exis_saldo - (:cantidad * :sumar)
        WHERE (arti_cod = :articulo) AND
        (bode_cod = :bodega) AND (exis_fecha > :fecha);
    END
END

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE SALDO_TOTAL_INVENTARIO(
    ARTICULO VARCHAR(15),
    FECHA DATE)
RETURNS (
    SALDO NUMERIC(18,4))
AS
DECLARE VARIABLE SALDO_BOD NUMERIC(15,4);
DECLARE VARIABLE BOD VARCHAR(2);
BEGIN
  SALDO = 0;
  FOR
    SELECT BODE_COD FROM BODEGA WHERE BODE_ACTIVA = 'S' INTO :BOD
  DO
    BEGIN
    EXECUTE PROCEDURE SALDO_INVENTARIO(:ARTICULO, :BOD, :FECHA) RETURNING_VALUES :SALDO_BOD;
    SALDO = SALDO + SALDO_BOD;
    END
if (saldo is null) then
    SALDO = 0;
SUSPEND;
END

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE SUME_EXISTENCIA(
    ARTICULO VARCHAR(15),
    BODEGA VARCHAR(2),
    FECHA DATE,
    CANTIDAD NUMERIC(18,4),
    ANULAR CHAR(1))
AS
DECLARE VARIABLE existe INTEGER;
DECLARE VARIABLE saldo NUMERIC(15,4);
DECLARE VARIABLE exart CHAR(1);
declare variable sumar integer;
BEGIN
  if (ANULAR = 'S') then
    sumar = -1;
  else
    sumar = 1;
  /* Verfique si el artículo tiene control de existencias */
  SELECT arti_exist FROM articulo WHERE arti_cod = :articulo
    INTO :exart;
  IF (exart <> 'N') THEN
    BEGIN
    /*  Si en EXISTENCIA existe el registro articulo-bodega-fecha le suma
        a las entradas la cantidad, si no, crea un nuevo registro       */
    SELECT 1 FROM EXISTENCIA
      WHERE (arti_cod = :articulo) AND
        (bode_cod = :bodega) AND (exis_fecha = :fecha) INTO :existe;
    IF (existe IS NULL) THEN
      BEGIN
      /*  No existe movimiento en esa fecha, traiga el saldo anterior y
          registre uno nuevo */
      EXECUTE PROCEDURE saldo_inventario(:articulo, :bodega, :fecha)
        RETURNING_VALUES :saldo;
      INSERT INTO existencia (arti_cod, bode_cod, exis_fecha,
        exis_entr, exis_sal, exis_saldo)
        VALUES (:articulo, :bodega, :fecha, (:cantidad * :sumar), 0, :saldo);
      END /* if existe */
    ELSE
      BEGIN
      /* Ya existe un registro en la fecha */
      UPDATE EXISTENCIA
          SET exis_entr = exis_entr + (:cantidad * :sumar)
          WHERE (arti_cod = :articulo) AND 
            (bode_cod = :bodega) AND (exis_fecha = :fecha);
      END
    /*  Recorra los registros de fechas posteriores actualizando el saldo
        anterior */
    UPDATE existencia
        SET exis_saldo = exis_saldo + (:cantidad * :sumar)
        WHERE (arti_cod = :articulo) AND
        (bode_cod = :bodega) AND (exis_fecha > :fecha);
    END
END

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE VALIDE_EXISTENCIA(
    ARTICULO VARCHAR(15),
    BODEGA VARCHAR(2),
    CANTIDAD NUMERIC(18,2),
    FECHA DATE)
RETURNS (
    OK CHAR(1))
AS
DECLARE VARIABLE EXIS_NEG VARCHAR(8);
DECLARE VARIABLE SALDO_BOD NUMERIC(15,4);
BEGIN
  OK = 'S';
  EXECUTE PROCEDURE SALDO_INVENTARIO (:ARTICULO, :BODEGA, :FECHA) RETURNING_VALUES :SALDO_BOD;
  IF (CANTIDAD > SALDO_BOD) THEN
    BEGIN
    OK = 'N';
    EXECUTE PROCEDURE LEE_CONFIGURACION ('INVENTARIO', 'EXISTENCIAS', 'ACCION A TOMAR SI LA EXISTENCIA ES INSUFICIENTE') RETURNING_VALUES :EXIS_NEG;
     IF (EXIS_NEG = 'PROHIBIR') THEN
         EXCEPTION SALDO_INSUFICIENTE;
    END
  SUSPEND;
END

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE REP_DISPONIBILIDAD(
    FECHA DATE,
    ARTINI VARCHAR(20),
    ARTFIN VARCHAR(20),
    GRPINI VARCHAR(3),
    GRPFIN VARCHAR(3),
    ORDEN CHAR(1),
    CEROS CHAR(1),
    DETALLE CHAR(1),
    AGRUPA CHAR(1),
    SUCURSAL INTEGER)
RETURNS (
    CODIGO VARCHAR(15),
    NOMBRE VARCHAR(60),
    UNIDAD VARCHAR(8),
    CODGRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    CODSUBG VARCHAR(3),
    NOMSUBG VARCHAR(30),
    CODMARC VARCHAR(3),
    NOMMARC VARCHAR(30),
    CODBOD VARCHAR(2),
    NOMBOD VARCHAR(30),
    EXIST NUMERIC(18,4),
    PROMEDIO NUMERIC(18,4),
    SALIDAS NUMERIC(18,4),
    DISPONIBILIDAD INTEGER,
    DIAS INTEGER,
    PROMEDIADO INTEGER,
    COSTO NUMERIC(18,2),
    COSTOPRO NUMERIC(18,2),
    SUGERIDO NUMERIC(18,4),
    FECCOMPRA DATE)
AS
DECLARE VARIABLE CODINI VARCHAR(20);
DECLARE VARIABLE CODFIN VARCHAR(20);
DECLARE VARIABLE DESINI VARCHAR(20);
DECLARE VARIABLE DESFIN VARCHAR(20);
DECLARE VARIABLE MARINI VARCHAR(20);
DECLARE VARIABLE MARFIN VARCHAR(20);
declare variable DIASC VARCHAR(255);
declare variable DIA_ART VARCHAR(2) CHARACTER SET NONE;
declare variable PORART VARCHAR(8);
declare variable MAXDIA VARCHAR(2);
BEGIN
if (ORDEN = 'C') then
    BEGIN
    CODINI = ARTINI;
    CODFIN = ARTFIN;
    DESINI = '';
    DESFIN = 'zz';
    END
ELSE
    BEGIN
    DESINI = ARTINI;
    DESFIN = ARTFIN;
    CODINI = '';
    CODFIN = 'zz';
    END
if (AGRUPA = 'G') then
    BEGIN
    MARINI = '';
    MARFIN = 'zz';
    END
ELSE
    if (AGRUPA = 'M') then
        BEGIN
        MARINI = GRPINI;
        MARFIN = GRPFIN;
        GRPINI = '';
        GRPFIN = 'zz';
        END
EXECUTE PROCEDURE lee_configuracion ('INVENTARIO', 'EXISTENCIAS', 'PROMEDIAR LAS SALIDAS DEL INVENTARIO CON EL NUMERO DE DIAS ASIGNADO A CADA ARTICULO') returning_values (:DIA_ART);
EXECUTE PROCEDURE lee_configuracion ('INVENTARIO', 'EXISTENCIAS', 'NUMERO DE DIAS PARA PROMEDIO DE SALIDAS POR ARTICULO') returning_values (DIASC);
execute procedure lee_configuracion ('INVENTARIO', 'EXISTENCIAS', 'MAXIMO Y MINIMO POR STAND O POR ARTICULO') returning_values (:porart);
execute procedure lee_configuracion ('INVENTARIO', 'EXISTENCIAS', 'MAXIMO INVENTARIO EN DIAS') returning_values (:maxdia);
if (DETALLE = 'S') then
  BEGIN
  FOR SELECT ARTI_COD, ARTI_DES, ARTI_UNIDAD, ARTI_DIAS, A.GRUP_COD, GRUP_NOM, A.SUBG_COD, A.MARC_COD, BODE_COD, BODE_NOM, ARTI_DIANALIS
      FROM ARTICULO A, GRUPO G, BODEGA B
      WHERE ARTI_COD >= :CODINI AND ARTI_COD <= :CODFIN AND A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :GRPFIN AND ARTI_DES >= :DESINI AND ARTI_DES <= :DESFIN AND
      G.GRUP_COD = A.GRUP_COD AND A.ESAR_COD <> 'I' AND ((SUCU_ID = :SUCURSAL) or (:SUCURSAL = 0)) AND
      (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN)))
      INTO :CODIGO, :NOMBRE, :UNIDAD, :DIAS, :CODGRUPO, :NOMGRUPO, :CODSUBG, :CODMARC, :CODBOD, :NOMBOD, :PROMEDIADO
      DO
        BEGIN
        NOMMARC = '';
        NOMSUBG = '';
        SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO :NOMMARC;
        SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
        EXECUTE PROCEDURE costo_promedio_y_ultimo(:CODIGO, :FECHA) RETURNING_VALUES (:costopro, :COSTO);
        EXECUTE PROCEDURE DISPONIBILIDAD_ARTICULO(CODIGO, FECHA, :CODBOD) returning_values (:DISPONIBILIDAD, :EXIST, :PROMEDIO, :SALIDAS);
        if ((PORART = 'STAND') AND (MAXDIA = 'SI')) then
            BEGIN
            DIAS = 0;
            SELECT STAND_MIN FROM STANDS WHERE ARTI_COD = :CODIGO AND STAND_BODEGA = :codbod INTO :dias;
            END
        /*ESTABLECER CUAL ES EL VALOR DE DIAS PARA PROMEDIO*/
        if (DIA_ART = 'NO') then
          BEGIN
            PROMEDIADO = CAST(DIASC AS INTEGER);
          END
        if ((DISPONIBILIDAD < DIAS) and (PROMEDIO > 0))then
            SUGERIDO = (DIAS * PROMEDIO) - EXIST;
        ELSE
            SUGERIDO = 0;
        SELECT MAX(FACO_FECHA) FROM FACTURAS_COMPRA F, FACTURAS_COMPRAS_DETALLE D
            WHERE F.FACO_ID = D.faco_id AND D.ARTI_COD = :CODIGO AND FACO_FECHA <= :FECHA AND D.bode_cod = :codbod
            INTO :FECCOMPRA;
        if ((PROMEDIO > 0) or (EXIST <> 0) or (CEROS = 'S')) then
            SUSPEND;
        END
  END
ELSE
  BEGIN
  FOR SELECT ARTI_COD, ARTI_DES, ARTI_UNIDAD, ARTI_DIAS, A.GRUP_COD, GRUP_NOM, A.SUBG_COD, A.MARC_COD, ARTI_DIANALIS
      FROM ARTICULO A, GRUPO G
      WHERE ARTI_COD >= :CODINI AND ARTI_COD <= :CODFIN AND A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :GRPFIN AND ARTI_DES >= :DESINI AND ARTI_DES <= :DESFIN AND G.GRUP_COD = A.GRUP_COD AND
      A.ESAR_COD <> 'I' AND (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN)))
      INTO :CODIGO, :NOMBRE, :UNIDAD, :DIAS, :CODGRUPO, :NOMGRUPO, :CODSUBG, :CODMARC, :PROMEDIADO
      DO
        BEGIN
        NOMMARC = '';
        NOMSUBG = '';
        SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO :NOMMARC;
        SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
        EXECUTE PROCEDURE costo_promedio_y_ultimo(:CODIGO, :FECHA) RETURNING_VALUES (:costopro, :COSTO);
        EXECUTE PROCEDURE DISPONIBILIDAD_TOTAL_ARTICULO(CODIGO, FECHA) returning_values (:DISPONIBILIDAD, :EXIST, :PROMEDIO, :SALIDAS);
        if ((PORART = 'STAND') AND (MAXDIA = 'SI')) then
            BEGIN
            DIAS = 0;
            SELECT STAND_MIN FROM STANDS WHERE ARTI_COD = :CODIGO AND STAND_BODEGA = :codbod INTO :dias;
            END
        /*ESTABLECER CUAL ES EL VALOR DE DIAS PARA PROMEDIO*/
        if (DIA_ART = 'NO') then
          BEGIN
            PROMEDIADO = CAST(DIASC AS INTEGER);
          END
        if ((DISPONIBILIDAD < DIAS) and (PROMEDIO > 0))then
            SUGERIDO = (DIAS * PROMEDIO) - EXIST;
        ELSE
            SUGERIDO = 0;
        SELECT MAX(FACO_FECHA) FROM FACTURAS_COMPRA F, FACTURAS_COMPRAS_DETALLE D
            WHERE F.FACO_ID = D.faco_id AND D.ARTI_COD = :CODIGO AND FACO_FECHA <= :FECHA
            INTO :FECCOMPRA;
        if ((PROMEDIO > 0) or (EXIST <> 0) or (CEROS = 'S')) then
            SUSPEND;
        END
  END
END

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE MINIMO_ARTICULO(
    ARTICULO VARCHAR(15),
    FECHA DATE,
    BODEGA CHAR(2))
RETURNS (
    MINIMO NUMERIC(18,4))
AS
declare variable DIAS CHAR(2);
declare variable PROMEDIO NUMERIC(18,4);
declare variable SALIDAS NUMERIC(18,4);
BEGIN
  /* CUANDO CONFIGURACION MINIMO EN DIAS */
  EXECUTE PROCEDURE LEE_CONFIGURACION ('INVENTARIO', 'EXISTENCIAS', 'MINIMO INVENTARIO EN DIAS') returning_values (DIAS);
  if (DIAS = 'SI') then
    BEGIN
    EXECUTE PROCEDURE PROMEDIO_SALIDAS_ARTICULO(:ARTICULO, :FECHA, :BODEGA) returning_values (:PROMEDIO, :SALIDAS);
    SELECT ARTI_DIAS * :PROMEDIO FROM ARTICULO WHERE ARTI_COD = :ARTICULO INTO :MINIMO;
    end
  ELSE
    BEGIN
    SELECT ARTI_MIN FROM ARTICULO WHERE ARTI_COD = :ARTICULO INTO :MINIMO;
    END
  if (MINIMO IS NULL) then
    MINIMO = 0;
  SUSPEND;
END

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE CHEQUEO_INVENTARIO(
    ARTINI VARCHAR(20),
    ARTFIN VARCHAR(20))
AS
DECLARE VARIABLE FECHA DATE;
DECLARE VARIABLE CANT NUMERIC(15,4);
DECLARE VARIABLE COSTO NUMERIC(18,2);
DECLARE VARIABLE ENTRADA CHAR(1);
DECLARE VARIABLE BODEGA CHAR(2);
DECLARE VARIABLE ID INTEGER;
DECLARE VARIABLE TIPO INTEGER;
declare variable TIPOEX CHAR(1);
DECLARE VARIABLE LOTE VARCHAR(20);
DECLARE VARIABLE EXISTE INTEGER;
declare variable ARTICULO VARCHAR(20);
declare variable IDL INTEGER;
BEGIN
for select arti_cod from articulo where arti_cod >= :artini and arti_cod <= :artfin into :ARTICULO
  DO
  BEGIN
  DELETE FROM existencia_lote where arti_cod = :articulo;
  DELETE FROM lotes where arti_cod = :articulo;
  delete from costos where arti_cod = :ARTICULO;
  delete from existencia WHERE ARTI_COD = :ARTICULO;
  for select mvar_cons, mvar_fecha, mvar_cant, mvar_costo, mvar_entrada, bode_cod, mvar_tipodoc, mvar_lote
    from movimiento_articulo WHERE ARTI_COD = :ARTICULO
    order by mvar_fecha, mvar_cons
    into :id, :fecha, :cant, :costo, :entrada, :bodega, :tipo, :lote
  do
    begin
    SELECT ARTI_EXIST
        FROM   ARTICULO
        WHERE  ARTICULO.ARTI_COD = :ARTICULO
        INTO :TIPOEX;
    if ((TIPO <> 13)) then
        EXECUTE PROCEDURE actualice_costo(:ARTICULO, :fecha, :costo, :cant, :entrada, 'N', :id, :tipo);
    /* actualice existencias */
    if (:entrada = 'S') then
        begin
        execute procedure sume_existencia(:articulo, :bodega, :fecha, :cant, 'N');
        if (TIPOEX = 'L') then
            begin
            SELECT COUNT(*) FROM LOTES WHERE ARTI_COD = :ARTICULO AND BODE_COD = :BODEGA AND LOTE_NRO = :lote INTO :EXISTE;
            if (EXISTE > 0) then
                UPDATE LOTES
                    set lote_saldo = lote_saldo + :cant
                    where (arti_cod = :ARTICULO) and (BODE_COD = :BODEGA) AND (lote_nro = :lote);
            ELSE
                INSERT INTO LOTES (ARTI_COD, BODE_COD, LOTE_NRO, LOTE_FECHA, LOTE_CANT, LOTE_COSTO, LOTE_SALDO)
                    VALUES (:ARTICULO, :bodega, :lote, :fecha, :cant, :costo, :cant);
            end
        end
    else
        begin
        execute procedure reste_existencia(:articulo, :bodega, :fecha, :cant, 'N');
        if (TIPOEX = 'L') then
            begin
            SELECT COUNT(*) FROM LOTES WHERE ARTI_COD = :ARTICULO AND BODE_COD = :BODEGA AND LOTE_NRO = :lote INTO :EXISTE;
            if (EXISTE > 0) then
                UPDATE LOTES
                    set lote_saldo = lote_saldo - :cant
                    where (arti_cod = :ARTICULO) AND (BODE_COD = :BODEGA) and (lote_nro = :lote);
            ELSE
                BEGIN
                /* ARREGLE EL LOTE YA QUE NO EXISTE */
                SELECT MIN(LOTE_ID) FROM LOTES WHERE ARTI_COD = :articulo AND BODE_COD = :BODEGA AND LOTE_SALDO >= :cant INTO :IDL;
                SELECT LOTE_NRO FROM LOTES WHERE LOTE_ID = :IDL INTO :LOTE;
                UPDATE MOVIMIENTO_ARTICULO SET MVAR_LOTE = :LOTE WHERE MVAR_CONS = :ID;
                UPDATE LOTES
                    set lote_saldo = lote_saldo - :cant
                    where (arti_cod = :ARTICULO) and (BODE_COD = :BODEGA) AND (lote_nro = :lote);
                END
            SELECT COUNT(*) FROM EXISTENCIA_LOTE
                WHERE LOTE_NRO = :LOTE AND EXLO_FECHA = :FECHA AND ARTI_COD = :ARTICULO AND BODE_COD = :bodega
                INTO :EXISTE;
            if (EXISTE > 0) then
                UPDATE EXISTENCIA_LOTE
                       SET EXLO_SAL = EXLO_SAL + :cant
                    WHERE LOTE_NRO = :LOTE AND EXLO_FECHA = :FECHA AND ARTI_COD = :ARTICULO AND BODE_COD = :bodega;
            else
                INSERT INTO EXISTENCIA_LOTE (ARTI_COD, BODE_COD, LOTE_NRO, EXLO_FECHA, EXLO_SAL)
                    VALUES (:ARTICULO, :BODEGA, :LOTE, :FECHA, :CANT);
            end
        end
    END
  END
END

^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER PROCEDURE ART_INACTIVOS_CON_EXISTENCIA(
    FECHA DATE)
RETURNS (
    CODIGO VARCHAR(20),
    DES VARCHAR(60),
    REF VARCHAR(20),
    GRUPO VARCHAR(30),
    MARCA VARCHAR(30),
    UNIDAD VARCHAR(8),
    EXISTEN NUMERIC(18,2))
AS
BEGIN
FOR select a.arti_cod, arti_des, grup_cod, arti_unidad, marc_cod
    from articulo a where esar_cod <> 'A'
        INTO :CODIGO, :DES, :GRUPO, :UNIDAD, :MARCA
        do
        begin
        ref = '';
        select first 1 coba_cod from barras_articulo where arti_cod = :codigo into :ref;
        EXECUTE PROCEDURE saldo_total_inventario (:CODIGO, :FECHA) returning_values (:EXISTEN);
        if (existen <> 0) then
            SUSPEND;
        end
END

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE DISPONIBILIDAD_TOTAL_ARTICULO(
    ARTICULO VARCHAR(15),
    FECHA DATE)
RETURNS (
    DISPONIBILIDAD INTEGER,
    EXIST NUMERIC(18,4),
    PROMEDIO NUMERIC(18,4),
    SALIDAS NUMERIC(18,4))
AS
BEGIN
  EXECUTE PROCEDURE saldo_total_inventario (ARTICULO, FECHA) returning_values (:EXIST);
  EXECUTE PROCEDURE PROMEDIO_TOTAL_ARTICULO(:ARTICULO, :FECHA) returning_values (:PROMEDIO, :SALIDAS);
  if (PROMEDIO > 0) then
    DISPONIBILIDAD = EXIST / PROMEDIO;
  ELSE
    DISPONIBILIDAD = 0;
  SUSPEND;
END

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE IMPR_ARTICULO(
    CODINI VARCHAR(20),
    CODFIN VARCHAR(20),
    CANT INTEGER)
RETURNS (
    ARTICULO VARCHAR(15),
    DESCRIPCION VARCHAR(60),
    DESCCORTA VARCHAR(30),
    PRECIO NUMERIC(18,2),
    CODGRP VARCHAR(2),
    NOMGRP VARCHAR(30),
    COSUBG VARCHAR(3),
    NOMSUBG VARCHAR(30),
    CODMARC VARCHAR(3),
    NOMMARC VARCHAR(30),
    PESO NUMERIC(18,4),
    PUM NUMERIC(18,2),
    LISTA INTEGER,
    NOMLISTA VARCHAR(30),
    FECHA DATE)
AS
declare variable I INTEGER;
begin
EXECUTE PROCEDURE lee_configuracion('FACTURACION', 'FACTURAS', 'CODIGO DE LA LISTA DE PRECIOS A MOSTRAR EN ARTICULOS') returning_values (LISTA);
for select a.arti_cod, arti_des, a.grup_cod, a.subg_cod, a.marc_cod, arti_peso, p.lipr_cod, p.prar_fijo, grup_nom, lipr_nom, arti_descorta
    from articulo a, precios_articulo p, grupo g, lista_precios l
    where a.arti_cod = p.arti_cod and a.grup_cod = g.grup_cod and l.lipr_cod = p.lipr_cod AND a.arti_cod >= :codini AND a.arti_cod <= :codfin AND P.lipr_cod = :LISTA
    into :articulo, :descripcion, :codgrp, :cosubg, :codmarc, :peso, :lista, :precio, :nomgrp, :nomlista, :desccorta
    do
    begin
    if (cosubg <> '') then
        select subg_nom from subgrupo where grup_cod = :codgrp and subg_cod = :cosubg into :nomsubg;
    if (codmarc <> '') then
        select marc_nom from marcas where marc_cod = :codmarc into :nommarc;
    if ((PESO <> 0) AND (PESO IS NOT NULL)) then
        PUM = PRECIO / PESO;
    ELSE
        PUM = 0;
    SELECT MAX(AUDI_FECHA) FROM AUDITORIA WHERE TIDO_COD = 126 AND AUDI_COD = :articulo AND AUDI_OPER <> 'D' INTO :fecha;
    if (cant = 0) then
        execute procedure saldo_total_inventario(:articulo, cast('now' as DATE)) returning_values (CANT);
    I = 1;
    WHILE (I <= CANT) DO
        BEGIN
        SUSPEND;
        I = I + 1;
        END
    end
end

^

SET TERM ; ^

SET TERM ^ ;

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

^

SET TERM ; ^

SET TERM ^ ;

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

^

SET TERM ; ^

SET TERM ^ ;

ALTER TRIGGER NOTAS_CREDITO_PROVEEDOR_AI
AS
declare variable COSTO NUMERIC(18,2);
declare variable EXISTENCIA NUMERIC(18,4);
declare variable CODBOD VARCHAR(3);
BEGIN
if ((NEW.NCPR_ID <> 0) and (new.ncpr_anulado = 'N')) then
    BEGIN
    /* Registre el nuevo saldo del documento */
    INSERT INTO SALDOS_DOC_CXPAGAR (SDCP_TIPOREF, SDCP_IDREF, SDCP_FECHA, TERC_NIT, SDCP_RTEFTE, SDCP_RTIVA, SDCP_RTICA, SDCP_ABONO, SDCP_ABRTFTE, SDCP_ABRTIVA, SDCP_ABRTICA, SDCP_DEBITO, SDCP_MONTO, SDCP_TRM)
        VALUES (52, NEW.NCPR_ID, NEW.ncpr_fecha, NEW.terc_nit, (NEW.ncpr_rtftemonto * -1), (NEW.ncpr_rtivamonto * -1), (NEW.ncpr_rticamonto * -1), 0, 0, 0, 0, 'N', (NEW.ncpr_monto+NEW.ncpr_ivamonto)*-1, NEW.ncpr_trm);
    /* Registre el movimiento del proveedor */
    INSERT INTO MOVIMIENTO_PROVEEDOR (MVPR_ID, TERC_NIT, MVPR_TIPOREF, MVPR_IDREF, MVPR_FECHA, MVPR_VENCE, MVPR_CONC, MVPR_MONTO, MVPR_RTFTE, MVPR_RTIVA, MVPR_RTICA, MVPR_DEBITO, MVPR_ABONO, MVPR_PREFIJO, MVPR_NUMERO, MVPR_TRM)
      VALUES (GEN_ID(ID_MOVPROV, 1), NEW.TERC_NIT, 52, NEW.NCPR_ID, NEW.NCPR_FECHA, NEW.NCPR_FECHA, NEW.NCPR_CONC, NEW.NCPR_MONTO+NEW.NCPR_IVAMONTO, NEW.NCPR_RTFTEMONTO, NEW.NCPR_RTIVAMONTO, NEW.NCPR_RTICAMONTO, 'N', 'N', NEW.pref_pre, NEW.ncpr_numero, NEW.ncpr_trm);
    /* afecte el articulo */
    if (new.arti_cod <> '') then
        begin
        /* CALCULE EL NUEVO COSTO */
        execute procedure costo_promedio (new.arti_cod, new.ncpr_fecha) returning_values (:COSTO);
        execute procedure saldo_total_inventario (new.arti_cod, new.ncpr_fecha) returning_values (:EXISTENCIA);
        COSTO = ((COSTO * EXISTENCIA) - NEW.ncpr_monto) / EXISTENCIA;
        FOR SELECT DISTINCT BODE_COD FROM EXISTENCIA WHERE ARTI_COD = NEW.ARTI_COD INTO :CODBOD do
            BEGIN
            execute procedure saldo_inventario (new.arti_cod, :CODBOD, new.ncpr_fecha) returning_values (:EXISTENCIA);
            if (EXISTENCIA <> 0) then
                BEGIN
                /* SAQUE TODO LO QUE TENGA */
                INSERT INTO MOVIMIENTO_ARTICULO
                  (ARTI_COD, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM, TERC_NIT)
                  VALUES(NEW.ARTI_COD, :CODBOD, new.ncpr_fecha, 52, NEW.ncpr_id,
                  new.ncpr_conc, :EXISTENCIA, 0, 'N', '', new.pref_pre, new.ncpr_numero, 1, new.terc_nit);
                END
            END
        FOR SELECT DISTINCT BODE_COD, MVAR_CANT FROM MOVIMIENTO_ARTICULO WHERE MVAR_TIPODOC = 52 AND MVAR_IDREF = NEW.ncpr_id
            INTO :CODBOD, :existencia do
            BEGIN
            /* META TODO CON EL NUEVO COSTO */
            INSERT INTO MOVIMIENTO_ARTICULO
              (ARTI_COD, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM, TERC_NIT)
              VALUES(NEW.ARTI_COD, :CODBOD, new.ncpr_fecha, 52, NEW.ncpr_id,
              new.ncpr_conc, :EXISTENCIA, :COSTO, 'S', '', new.pref_pre, new.ncpr_numero, 1, new.terc_nit);
            END
        /* RECORRA LAS LISTAS DE PRECIOS Y CAMBIE EL PRECIO */
        EXECUTE PROCEDURE CALCULA_PRECIOS(NEW.ARTI_COD, new.ncpr_fecha);
        end
    INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
        VALUES (USER, 52, NEW.ncpr_id, 'I', NEW.pref_pre || NEW.ncpr_numero);
    END
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER TRIGGER NOTAS_CREDITO_PROVEEDOR_AU
AS
declare variable ABONOS char(1);
declare variable consec INTEGER;
declare variable COSTO NUMERIC(18,2);
declare variable EXISTENCIA NUMERIC(18,4);
declare variable CODBOD VARCHAR(3);
BEGIN
if (new.ncpr_anulado = 'S') then
    begin
    select enco_consec from comprobante_encabezado where enco_tiporef = 52 and enco_idref = old.ncpr_id into :consec;
    if (NOT consec is null) then
      delete from comprobante_detalle where enco_consec = :consec;
    delete from comprobante_encabezado where enco_tiporef = 52 and enco_idref = old.ncpr_id;
    INSERT INTO AUDITORIA (AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
        VALUES (USER, 52, new.ncpr_id, 'A', NEW.pref_pre || NEW.ncpr_numero);
    end

/* BORRE EL REGISTRO PREVIO */
if ((old.ncpr_id <> 0) and (old.ncpr_anulado = 'N')) then
    begin
    /* Verifique si habia abonos a la nota */
    ABONOS = 'N';
    select 'S' FROM SALDOS_DOC_CXPAGAR WHERE SDCP_TIPOREF = 52 AND SDCP_IDREF = OLD.NCPR_ID AND SDCP_ABONO <> 0 INTO :ABONOS;
    if (ABONOS = 'N') then
        BEGIN
        /* BORRE EL REGISTRO PREVIO */
        delete from saldos_doc_cxpagar where sdcp_tiporef = 52 and sdcp_idref = old.ncpr_id;
        delete from movimiento_PROVEEDOR where (mvpr_tiporef = 52) and (mvpr_idref = old.ncpr_id);
        delete from movimiento_articulo where  (mvar_tipodoc = 52) and (mvar_idref = old.ncpr_id);
        END
    else
        exception DOCUMENTO_CON_ABONOS 'El descuento de proveedor ' || old.pref_pre || old.ncpr_numero || ' tiene abonos registrados.';
    end
if ((new.ncpr_id <> 0) and (new.ncpr_anulado = 'N')) then
    begin
    /* Registre el nuevo saldo del documento */
    INSERT INTO SALDOS_DOC_CXPAGAR (SDCP_TIPOREF, SDCP_IDREF, SDCP_FECHA, TERC_NIT, SDCP_RTEFTE, SDCP_RTIVA, SDCP_RTICA, SDCP_ABONO, SDCP_ABRTFTE, SDCP_ABRTIVA, SDCP_ABRTICA, SDCP_DEBITO, SDCP_MONTO, SDCP_TRM)
        VALUES (52, NEW.NCPR_ID, NEW.ncpr_fecha, NEW.terc_nit, (NEW.ncpr_rtftemonto * -1), (NEW.ncpr_rtivamonto * -1), (NEW.ncpr_rticamonto * -1), 0, 0, 0, 0, 'N', (NEW.ncpr_monto+NEW.ncpr_ivamonto)*-1, NEW.ncpr_trm);
    /* Registre el movimiento del proveedor */
    INSERT INTO MOVIMIENTO_PROVEEDOR (MVPR_ID, TERC_NIT, MVPR_TIPOREF, MVPR_IDREF, MVPR_FECHA, MVPR_VENCE, MVPR_CONC, MVPR_MONTO, MVPR_RTFTE, MVPR_RTIVA, MVPR_RTICA, MVPR_DEBITO, MVPR_ABONO, MVPR_PREFIJO, MVPR_NUMERO, MVPR_TRM)
        VALUES (GEN_ID(ID_MOVPROV, 1), NEW.TERC_NIT, 52, NEW.NCPR_ID, NEW.NCPR_FECHA, NEW.NCPR_FECHA, NEW.NCPR_CONC, NEW.NCPR_MONTO+NEW.ncpr_ivamonto, NEW.NCPR_RTFTEMONTO, NEW.NCPR_RTIVAMONTO, NEW.NCPR_RTICAMONTO, 'N', 'N', NEW.pref_pre, NEW.ncpr_numero, NEW.ncpr_trm);
    /* afecte el articulo */
    if (new.arti_cod <> '') then
        begin
        /* CALCULE EL NUEVO COSTO */
        execute procedure costo_promedio (new.arti_cod, new.ncpr_fecha) returning_values (:COSTO);
        execute procedure saldo_total_inventario (new.arti_cod, new.ncpr_fecha) returning_values (:EXISTENCIA);
        COSTO = ((COSTO * EXISTENCIA) - NEW.ncpr_monto) / EXISTENCIA;
        FOR SELECT DISTINCT BODE_COD FROM EXISTENCIA WHERE ARTI_COD = NEW.ARTI_COD INTO :CODBOD do
            BEGIN
            execute procedure saldo_inventario (new.arti_cod, :CODBOD, new.ncpr_fecha) returning_values (:EXISTENCIA);
            if (EXISTENCIA <> 0) then
                BEGIN
                /* SAQUE TODO LO QUE TENGA */
                INSERT INTO MOVIMIENTO_ARTICULO
                    (ARTI_COD, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM, TERC_NIT)
                    VALUES(NEW.ARTI_COD, :CODBOD, new.ncpr_fecha, 52, NEW.ncpr_id,
                    new.ncpr_conc, :EXISTENCIA, 0, 'N', '', new.pref_pre, new.ncpr_numero, 1, new.terc_nit);
                end
            END
        FOR SELECT DISTINCT BODE_COD, MVAR_CANT FROM MOVIMIENTO_ARTICULO WHERE MVAR_TIPODOC = 52 AND MVAR_IDREF = NEW.ncpr_id
            INTO :CODBOD, :existencia do
            BEGIN
            /* META TODO CON EL NUEVO COSTO */
            INSERT INTO MOVIMIENTO_ARTICULO
                (ARTI_COD, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM, TERC_NIT)
                VALUES(NEW.ARTI_COD, :CODBOD, new.ncpr_fecha, 52, NEW.ncpr_id,
                new.ncpr_conc, :EXISTENCIA, :COSTO, 'S', '', new.pref_pre, new.ncpr_numero, 1, new.terc_nit);
            END
        /* RECORRA LAS LISTAS DE PRECIOS Y CAMBIE EL PRECIO */
        EXECUTE PROCEDURE CALCULA_PRECIOS(NEW.ARTI_COD, new.ncpr_fecha);
        end
    INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
        VALUES (USER, 52, NEW.ncpr_id, 'U', NEW.pref_pre || NEW.ncpr_numero);
    end
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER TRIGGER NOTAS_DEBITO_PROVEEDOR_AI
AS
declare variable COSTO NUMERIC(18,2);
declare variable EXISTENCIA NUMERIC(18,4);
declare variable CODBOD VARCHAR(3);
BEGIN
  if ((NEW.NDPR_ID <> 0) and (new.ndpr_anulado = 'N')) then
    BEGIN
    INSERT INTO SALDOS_DOC_CXPAGAR (SDCP_TIPOREF, SDCP_IDREF, SDCP_FECHA, TERC_NIT, SDCP_RTEFTE, SDCP_RTIVA, SDCP_RTICA, SDCP_ABONO, SDCP_ABRTFTE, SDCP_ABRTIVA, SDCP_ABRTICA, SDCP_DEBITO, SDCP_MONTO, SDCP_TRM)
        VALUES (51, NEW.NDPR_ID, NEW.ndpr_fecha, NEW.terc_nit, NEW.ndpr_rtftemonto, NEW.ndpr_rtivamonto, NEW.ndpr_rticamonto, 0, 0, 0, 0, 'S', NEW.ndpr_monto+NEW.ndpr_ivamonto, NEW.ndpr_trm);
    /* Registre el movimiento del proveedor */
    INSERT INTO MOVIMIENTO_PROVEEDOR (MVPR_ID, TERC_NIT, MVPR_TIPOREF, MVPR_IDREF, MVPR_FECHA, MVPR_VENCE, MVPR_CONC, MVPR_MONTO, MVPR_RTFTE, MVPR_RTIVA, MVPR_RTICA, MVPR_DEBITO, MVPR_ABONO, MVPR_PREFIJO, MVPR_NUMERO, MVPR_TRM)
      VALUES (GEN_ID(ID_MOVPROV, 1), NEW.TERC_NIT, 51, NEW.NDPR_ID, NEW.NDPR_FECHA, NEW.NDPR_VENCE, NEW.NDPR_CONC, NEW.NDPR_MONTO+NEW.ndpr_Ivamonto, NEW.NDPR_RTFTEMONTO, NEW.NDPR_RTIVAMONTO, NEW.NDPR_RTICAMONTO, 'S', 'N', NEW.pref_pre, NEW.ndpr_numero, NEW.ndpr_trm);
    /* afecte el articulo */
    if (new.arti_cod <> '') then
        begin
        /* CALCULE EL NUEVO COSTO */
        execute procedure costo_promedio (new.arti_cod, new.ndpr_fecha) returning_values (:COSTO);
        execute procedure saldo_total_inventario (new.arti_cod, new.ndpr_fecha) returning_values (:EXISTENCIA);
        COSTO = (COSTO * EXISTENCIA + (NEW.ndpr_monto)) / EXISTENCIA;
        FOR SELECT DISTINCT BODE_COD FROM EXISTENCIA WHERE ARTI_COD = NEW.ARTI_COD INTO :CODBOD do
            BEGIN
            execute procedure saldo_inventario (new.arti_cod, :CODBOD, new.ndpr_fecha) returning_values (:EXISTENCIA);
            if (existencia <> 0) then
                BEGIN
                /* SAQUE TODO LO QUE TENGA */
                INSERT INTO MOVIMIENTO_ARTICULO
                  (ARTI_COD, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM, TERC_NIT)
                  VALUES(NEW.ARTI_COD, :CODBOD, new.ndpr_fecha, 51, NEW.ndpr_id,
                  new.ndpr_conc, :EXISTENCIA, 0, 'N', '', new.pref_pre, new.ndpr_numero, 1, new.terc_nit);
                END
            END
        FOR SELECT DISTINCT BODE_COD, MVAR_CANT FROM MOVIMIENTO_ARTICULO WHERE MVAR_TIPODOC = 51 AND MVAR_IDREF = NEW.ndpr_id
            INTO :CODBOD, :existencia do
            BEGIN
            /* META TODO CON EL NUEVO COSTO */
            INSERT INTO MOVIMIENTO_ARTICULO
              (ARTI_COD, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM, TERC_NIT)
              VALUES(NEW.ARTI_COD, :CODBOD, new.ndpr_fecha, 51, NEW.ndpr_id,
              new.ndpr_conc, :EXISTENCIA, :COSTO, 'S', '', new.pref_pre, new.ndpr_numero, 1, new.terc_nit);
            END
        /* RECORRA LAS LISTAS DE PRECIOS Y CAMBIE EL PRECIO */
        EXECUTE PROCEDURE CALCULA_PRECIOS(NEW.ARTI_COD, new.ndpr_fecha);
        end
    INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
        VALUES (USER, 51, NEW.ndpr_id, 'I', NEW.pref_pre || NEW.ndpr_numero);
    END
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER TRIGGER NOTAS_DEBITO_PROVEEDOR_AU
AS
declare variable ABONOS char(1);
declare variable consec INTEGER;
declare variable COSTO NUMERIC(18,2);
declare variable EXISTENCIA NUMERIC(18,4);
declare variable CODBOD VARCHAR(3);
BEGIN
if (new.ndpr_anulado = 'S') then
    begin
    select enco_consec from comprobante_encabezado where enco_tiporef = 51 and enco_idref = old.ndpr_id into :consec;
    if (NOT consec is null) then
      delete from comprobante_detalle where enco_consec = :consec;
    delete from comprobante_encabezado where enco_tiporef = 51 and enco_idref = old.ndpr_id;
    INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
        VALUES (USER, 51, NEW.ndpr_id, 'A', NEW.pref_pre || NEW.ndpr_numero);
    end

/* BORRE EL REGISTRO PREVIO */
if ((old.ndpr_id <> 0) and (old.ndpr_anulado = 'N')) then
    begin
    /* Verifique si habia abonos a la nota */
    ABONOS = 'N';
    select 'S' FROM SALDOS_DOC_CXPAGAR WHERE SDCP_TIPOREF = 51 AND SDCP_IDREF = OLD.NDPR_ID AND SDCP_ABONO <> 0 INTO :ABONOS;
    if (ABONOS = 'N') then
        BEGIN
        /* BORRE EL REGISTRO PREVIO */
        delete from saldos_doc_cxpagar where sdcp_tiporef = 51 and sdcp_idref = old.ndpr_id;
        delete from movimiento_PROVEEDOR where (mvpr_tiporef = 51) and (mvpr_idref = old.ndpr_id);
        delete from movimiento_articulo where  (mvar_tipodoc = 51) and (mvar_idref = old.ndpr_id);
        END
    else
        exception DOCUMENTO_CON_ABONOS 'El cargo de proveedor ' || old.pref_pre || old.ndpr_numero || ' tiene abonos registrados.';
    end
if ((new.ndpr_id <> 0) and (new.ndpr_anulado = 'N')) then
    begin
    /* Registre el nuevo saldo del documento */
    INSERT INTO SALDOS_DOC_CXPAGAR (SDCP_TIPOREF, SDCP_IDREF, SDCP_FECHA, TERC_NIT, SDCP_RTEFTE, SDCP_RTIVA, SDCP_RTICA, SDCP_ABONO, SDCP_ABRTFTE, SDCP_ABRTIVA, SDCP_ABRTICA, SDCP_DEBITO, SDCP_MONTO, SDCP_TRM)
        VALUES (51, NEW.NDPR_ID, NEW.ndpr_fecha, NEW.terc_nit, NEW.ndpr_rtftemonto, NEW.ndpr_rtivamonto, NEW.ndpr_rticamonto, 0, 0, 0, 0, 'N', NEW.ndpr_monto+NEW.ndpr_ivamonto, NEW.ndpr_trm);
    /* Registre el movimiento del proveedor */
    INSERT INTO MOVIMIENTO_PROVEEDOR (MVPR_ID, TERC_NIT, MVPR_TIPOREF, MVPR_IDREF, MVPR_FECHA, MVPR_VENCE, MVPR_CONC, MVPR_MONTO, MVPR_RTFTE, MVPR_RTIVA, MVPR_RTICA, MVPR_DEBITO, MVPR_ABONO, MVPR_PREFIJO, MVPR_NUMERO, MVPR_TRM)
        VALUES (GEN_ID(ID_MOVPROV, 1), NEW.TERC_NIT, 51, NEW.NDPR_ID, NEW.NDPR_FECHA, NEW.ndpr_vence, NEW.NDPR_CONC, NEW.NDPR_MONTO+NEW.ndpr_ivamonto, NEW.NDPR_RTFTEMONTO, NEW.NDPR_RTIVAMONTO, NEW.NDPR_RTICAMONTO, 'S', 'N', NEW.pref_pre, NEW.ndpr_numero, NEW.ndpr_trm);
    if (new.arti_cod <> '') then
        begin
        /* CALCULE EL NUEVO COSTO */
        execute procedure costo_promedio (new.arti_cod, new.ndpr_fecha) returning_values (:COSTO);
        execute procedure saldo_total_inventario (new.arti_cod, new.ndpr_fecha) returning_values (:EXISTENCIA);
        COSTO = (COSTO * EXISTENCIA + (NEW.ndpr_monto)) / EXISTENCIA;
        FOR SELECT DISTINCT BODE_COD FROM EXISTENCIA WHERE ARTI_COD = NEW.ARTI_COD INTO :CODBOD do
            BEGIN
            execute procedure saldo_inventario (new.arti_cod, :CODBOD, new.ndpr_fecha) returning_values (:EXISTENCIA);
            if (existencia <> 0) then
                BEGIN
                /* SAQUE TODO LO QUE TENGA */
                INSERT INTO MOVIMIENTO_ARTICULO
                  (ARTI_COD, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM, TERC_NIT)
                  VALUES(NEW.ARTI_COD, :CODBOD, new.ndpr_fecha, 51, NEW.ndpr_id,
                  new.ndpr_conc, :EXISTENCIA, 0, 'N', '', new.pref_pre, new.ndpr_numero, 1, new.terc_nit);
                END
            END
        FOR SELECT DISTINCT BODE_COD, MVAR_CANT FROM MOVIMIENTO_ARTICULO WHERE MVAR_TIPODOC = 51 AND MVAR_IDREF = NEW.ndpr_id
            INTO :CODBOD, :existencia do
            BEGIN
            /* META TODO CON EL NUEVO COSTO */
            INSERT INTO MOVIMIENTO_ARTICULO
              (ARTI_COD, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM, TERC_NIT)
              VALUES(NEW.ARTI_COD, :CODBOD, new.ndpr_fecha, 51, NEW.ndpr_id,
              new.ndpr_conc, :EXISTENCIA, :COSTO, 'S', '', new.pref_pre, new.ndpr_numero, 1, new.terc_nit);
            END
        /* RECORRA LAS LISTAS DE PRECIOS Y CAMBIE EL PRECIO */
        EXECUTE PROCEDURE CALCULA_PRECIOS(NEW.ARTI_COD, new.ndpr_fecha);
        end
    INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
        VALUES (USER, 51, NEW.ndpr_id, 'U', NEW.pref_pre || NEW.ndpr_numero);
    end
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER TRIGGER MOVIMIENTO_ARTICULO_AD
AS
declare variable LOTE CHAR(1);
declare variable ensamble char(1);
BEGIN
  /* INSERTE EL NUEVO LOTE */
  SELECT ARTI_EXIST
    FROM   ARTICULO
    WHERE  ARTICULO.ARTI_COD = OLD.ARTI_COD
    INTO :LOTE;
  /* BORRE LOS VIEJOS */
  if (old.mvar_tipodoc <> 13) then
      BEGIN
      EXECUTE PROCEDURE actualice_costo(old.arti_cod, old.mvar_fecha, old.mvar_costo, old.mvar_cant, old.mvar_entrada, 'S', OLD.mvar_cons, OLD.mvar_tipodoc);
      if (OLD.mvar_entrada = 'S') then
          EXECUTE PROCEDURE chequeo_costos(old.arti_cod, old.mvar_fecha-1); /* PARA OBLIGAR A RECALCULAR LOS MOV. DEL MISMO DIA */
      else
          EXECUTE PROCEDURE chequeo_costos(old.arti_cod, old.mvar_fecha);
      END
  /* actualice existencias */
  if (old.mvar_entrada = 'S') then
    BEGIN
    execute procedure sume_existencia(old.arti_cod, old.bode_cod, old.mvar_fecha, old.mvar_cant, 'S');
    if (LOTE = 'L') then
        UPDATE LOTES
            set lote_saldo = lote_saldo - old.mvar_cant
            where (arti_cod = old.ARTI_COD) and (bode_cod = old.bode_cod) and (lote_nro = old.mvar_lote);
    END
  else
    BEGIN
    SELECT ARTI_ENSAMBLE FROM ARTICULO WHERE ARTI_COD = old.arti_cod INTO :ensamble;
    if (ENSAMBLE = 'S') then
        delete from ensambles where ensa_tiporef = old.mvar_tipodoc and ensa_idref = old.mvar_idref;

    execute procedure reste_existencia(old.arti_cod, old.bode_cod, old.mvar_fecha, old.mvar_cant, 'S');
    if (LOTE = 'L') then
        UPDATE LOTES
            set lote_saldo = lote_saldo + old.mvar_cant
            where (arti_cod = old.ARTI_COD) and (bode_cod = old.bode_cod) and (lote_nro = old.mvar_lote);
    END
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER TRIGGER MOVIMIENTO_ARTICULO_AI
AS
declare variable EXISTE CHAR(1);
declare variable LOTE CHAR(1);
BEGIN
  /* INSERTE EL NUEVO LOTE */
  SELECT ARTI_EXIST FROM ARTICULO WHERE ARTICULO.ARTI_COD = NEW.ARTI_COD INTO :LOTE;
  /* ACTUALICE COSTOS cuando no es transferencia */
  if (new.mvar_tipodoc <> 13) then
      BEGIN
      EXECUTE PROCEDURE actualice_costo(new.arti_cod, new.mvar_fecha, new.mvar_costo, new.mvar_cant, new.mvar_entrada, 'N', new.mvar_cons, new.mvar_tipodoc);
      EXECUTE PROCEDURE chequeo_costos(NEW.arti_cod, NEW.mvar_fecha);
      END
  /* actualice existencias */
  if (new.mvar_entrada = 'S') then
    BEGIN
    execute procedure sume_existencia(new.arti_cod, new.bode_cod, new.mvar_fecha, new.mvar_cant, 'N');
    if (LOTE = 'L') then
        BEGIN
        if (NEW.MVAR_LOTE IS NULL) then
            EXCEPTION LOTE_OBLIGATORIO 'Debe especificar un número de lote para el articulo ' || new.arti_cod;
        ELSE
         BEGIN
         EXISTE = 'N';
         SELECT 'S' FROM LOTES WHERE ARTI_COD = NEW.ARTI_COD AND BODE_COD = NEW.bode_cod AND LOTE_NRO = new.mvar_lote INTO :EXISTE;
         if (EXISTE = 'S') then
            UPDATE LOTES
             set lote_saldo = lote_saldo + new.mvar_cant
              where (arti_cod = NEW.ARTI_COD) and (BODE_COD = NEW.bode_cod) and (lote_nro = new.mvar_lote);
         ELSE
            INSERT INTO LOTES (ARTI_COD, BODE_COD, LOTE_NRO, LOTE_FECHA, LOTE_CANT, LOTE_COSTO, LOTE_SALDO)
                VALUES (NEW.ARTI_COD, NEW.bode_cod, NEW.mvar_lote, NEW.mvar_fecha, NEW.mvar_cant, NEW.mvar_costo, NEW.mvar_cant);
         END
        END
    END
  else
    BEGIN
    execute procedure reste_existencia(new.arti_cod, new.bode_cod, new.mvar_fecha, new.mvar_cant, 'N');
    /* ACTUALICE LA EXISTENCIA DEL LOTE */
    if (LOTE = 'L') then
    if (NEW.mvar_lote IS NULL) then
        EXCEPTION LOTE_NEGATIVO 'Debe indicar un número de lote para el artículo ' || new.arti_cod;
    ELSE
        BEGIN
        /* Actualice el saldo historico del lote */
        EXISTE = 'N';
        SELECT 'S' FROM EXISTENCIA_LOTE WHERE LOTE_NRO = NEW.MVAR_LOTE AND EXLO_FECHA = NEW.MVAR_FECHA AND ARTI_COD = NEW.arti_cod AND BODE_COD = NEW.bode_cod INTO :EXISTE;
        if (EXISTE = 'S') then
            BEGIN
            UPDATE EXISTENCIA_LOTE
                SET EXLO_SAL = EXLO_SAL + NEW.mvar_cant
                WHERE LOTE_NRO = NEW.MVAR_LOTE AND EXLO_FECHA = NEW.MVAR_FECHA AND ARTI_COD = NEW.ARTI_COD AND BODE_COD = NEW.bode_cod;
            END
        ELSE
            BEGIN
            INSERT INTO EXISTENCIA_LOTE (ARTI_COD, BODE_COD, LOTE_NRO, EXLO_FECHA, EXLO_SAL)
                VALUES (NEW.ARTI_COD, NEW.bode_cod, NEW.MVAR_LOTE, NEW.MVAR_FECHA, NEW.MVAR_CANT);
            END
        UPDATE LOTES
            set lote_saldo = lote_saldo - new.mvar_cant
            where (arti_cod = NEW.ARTI_COD) and (BODE_COD = NEW.bode_cod) and (lote_nro = new.mvar_lote);
        END
    END
END
^

SET TERM ; ^


SET TERM ^ ;

CREATE OR ALTER procedure SALDO_INICIAL_INVENTARIO (
    ARTICULO varchar(15),
    FECHA date,
    BODEGA char(2))
returns (
    SALDO numeric(18,4))
AS
BEGIN
SELECT FIRST 1 (EXIS_SALDO + EXIS_ENTR - EXIS_SAL) FROM EXISTENCIA
    WHERE (ARTI_COD = :ARTICULO) AND (BODE_COD = :BODEGA) AND (EXIS_FECHA < :FECHA)
    ORDER BY ARTI_COD DESC, BODE_COD DESC, EXIS_FECHA DESC
    INTO :SALDO;
if (SALDO IS NULL) then
    SALDO = 0;
SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE COMPARA_MOVIMIENTO_ARTICULO(
    FECINI1 DATE,
    FECFIN1 DATE,
    FECINI2 DATE,
    FECFIN2 DATE)
RETURNS (
    CODIGO VARCHAR(15),
    NOMBRE VARCHAR(60),
    UNIDAD VARCHAR(8),
    CODGRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    CODSUBG VARCHAR(3),
    NOMSUBG VARCHAR(30),
    CODMARC VARCHAR(3),
    NOMMARC VARCHAR(30),
    CODBOD VARCHAR(2),
    NOMBOD VARCHAR(30),
    SALDOINI1 NUMERIC(18,4),
    SALDOINI2 NUMERIC(18,4),
    ENTRADAS1 NUMERIC(18,4),
    ENTRADAS2 NUMERIC(18,4),
    INCENT NUMERIC(9,2),
    SALIDAS1 NUMERIC(18,4),
    SALIDAS2 NUMERIC(18,4),
    INCSAL NUMERIC(9,2),
    SALDOFIN1 NUMERIC(18,4),
    SALDOFIN2 NUMERIC(18,4),
    INCSALDO NUMERIC(9,2))
AS
BEGIN
  FOR
    SELECT ARTI_COD, ARTI_DES, ARTI_UNIDAD, A.GRUP_COD, GRUP_NOM, A.SUBG_COD, SUBG_NOM, A.MARC_COD, MARC_NOM, BODE_COD, BODE_NOM
      FROM ARTICULO A
      LEFT OUTER JOIN GRUPO ON (GRUPO.GRUP_COD = A.GRUP_COD)
      LEFT OUTER JOIN MARCAS ON (MARCAS.MARC_COD = A.MARC_COD)
      LEFT OUTER JOIN SUBGRUPO ON (SUBGRUPO.SUBG_COD = A.SUBG_COD AND SUBGRUPO.GRUP_COD = A.GRUP_COD),
      BODEGA B where A.ESAR_COD <> 'I'
      INTO :CODIGO, :NOMBRE, :UNIDAD, :CODGRUPO, :NOMGRUPO, :CODSUBG, :NOMSUBG, :CODMARC, :NOMMARC, :CODBOD, :NOMBOD
      DO
        BEGIN
        EXECUTE PROCEDURE SALDO_INICIAL_INVENTARIO(CODIGO, FECINI1, :CODBOD) returning_values (:SALDOINI1);
        /* SUME LAS ENTRADAS */
        SELECT SUM(MVAR_CANT) FROM MOVIMIENTO_ARTICULO
            WHERE (MVAR_FECHA >= :FECINI1) AND (MVAR_FECHA <= :FECFIN1) AND
            (ARTI_COD = :CODIGO) AND (BODE_COD = :CODBOD) AND (MVAR_ENTRADA = 'S') INTO :ENTRADAS1;
        if (ENTRADAS1 IS NULL) then
            ENTRADAS1 = 0;
        SELECT SUM(MVAR_CANT)
            FROM MOVIMIENTO_ARTICULO
            WHERE (MVAR_FECHA >= :FECINI1) AND (MVAR_FECHA <= :FECFIN1) AND
            (ARTI_COD = :CODIGO) AND (BODE_COD = :CODBOD) AND (MVAR_ENTRADA = 'N')
            INTO :SALIDAS1;
        if (SALIDAS1 IS NULL) then
            SALIDAS1 = 0;
        SALDOFIN1 = SALDOINI1 + ENTRADAS1 - SALIDAS1;
        /* AHORA LOS DEL SEGUNDO PERIODO */
        EXECUTE PROCEDURE SALDO_INICIAL_INVENTARIO(CODIGO, FECINI2, :CODBOD) returning_values (:SALDOINI2);
        /* SUME LAS ENTRADAS */
        SELECT SUM(MVAR_CANT) FROM MOVIMIENTO_ARTICULO
            WHERE (MVAR_FECHA >= :FECINI2) AND (MVAR_FECHA <= :FECFIN2) AND
            (ARTI_COD = :CODIGO) AND (BODE_COD = :CODBOD) AND (MVAR_ENTRADA = 'S') INTO :ENTRADAS2;
        if (ENTRADAS2 IS NULL) then
            ENTRADAS2 = 0;
        /* CALCULE LAS SALIDAS A COSTO PROMEDIO */
        SALIDAS2 = 0;
        SELECT SUM(MVAR_CANT)
            FROM MOVIMIENTO_ARTICULO
            WHERE (MVAR_FECHA >= :FECINI2) AND (MVAR_FECHA <= :FECFIN2) AND
            (ARTI_COD = :CODIGO) AND (BODE_COD = :CODBOD) AND (MVAR_ENTRADA = 'N')
            INTO :SALIDAS2;
        if (SALIDAS2 IS NULL) then
            SALIDAS2 = 0;
        SALDOFIN2 = SALDOINI2 + ENTRADAS2 - SALIDAS2;
        if (ENTRADAS1 > 0) then
            INCENT = 100 * (ENTRADAS2 - ENTRADAS1) / ENTRADAS1;
        ELSE
            if (ENTRADAS2 > 0) then
                INCENT = 100;
            ELSE
                INCENT = 0;
        if (SALIDAS1 > 0) then
            INCSAL = 100 * (SALIDAS2 - SALIDAS1) / SALIDAS1;
        ELSE
            if (SALIDAS2 > 0) then
                INCSAL = 100;
            ELSE
                INCSAL = 0;
        if (SALDOFIN1 > 0) then
            INCSALDO = 100 * (SALDOFIN2 - SALDOFIN1) / SALDOFIN1;
        ELSE
            if (SALDOFIN2 > 0) then
                INCSALDO = 100;
            ELSE
                INCSALDO = 0;
        SUSPEND;
        END
END

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE EXISTENCIAS_DESDE_HASTA(
    FECHA DATE,
    ARTINI VARCHAR(20),
    ARTFIN VARCHAR(20),
    GRPINI VARCHAR(3),
    GRPFIN VARCHAR(3),
    BODINI VARCHAR(2),
    BODFIN VARCHAR(2),
    ORDEN CHAR(1),
    AGRUPA CHAR(1),
    DETALLE CHAR(1),
    RESERVA CHAR(1),
    ENPESO CHAR(1),
    MASIVA CHAR(1),
    SUCURSAL INTEGER)
RETURNS (
    CANT NUMERIC(18,4),
    COSTO NUMERIC(18,2),
    COSTO_LOTE NUMERIC(18,2),
    CODIGO VARCHAR(15),
    NOMBRE VARCHAR(60),
    UNIDAD VARCHAR(8),
    STAND VARCHAR(20),
    CODGRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    CODSUBG VARCHAR(3),
    NOMSUBG VARCHAR(30),
    CODMARC VARCHAR(3),
    NOMMARC VARCHAR(30),
    CODBOD VARCHAR(2),
    LOTE VARCHAR(15),
    NOMBOD VARCHAR(30),
    COSTOTOT NUMERIC(18,2),
    ULTCOSTO NUMERIC(18,2),
    FECHACOSTO DATE,
    CONSUMO NUMERIC(18,2),
    RESERVADO NUMERIC(18,4),
    ORDENADO NUMERIC(18,4),
    IVA NUMERIC(9,2),
    PESOUNIT NUMERIC(18,4),
    PESOTOTAL NUMERIC(18,4),
    PRECIO NUMERIC(18,2),
    CODBAR VARCHAR(20))
AS
declare variable exist char(1);
declare variable codini varchar(20);
declare variable codfin varchar(20);
declare variable desini varchar(20);
declare variable desfin varchar(20);
declare variable ordenc numeric(18,4);
declare variable pedido numeric(18,4);
declare variable ok char(1);
declare variable id integer;
declare variable item integer;
declare variable und varchar(8);
declare variable factor numeric(18,4);
declare variable cant2 numeric(18,4);
declare variable PEDAUTO CHAR(2);
DECLARE VARIABLE LISTA INTEGER;
BEGIN
EXECUTE PROCEDURE lee_configuracion ('FACTURACION','FACTURAS', 'CODIGO DE LA LISTA DE PRECIOS A MOSTRAR EN ARTICULOS') returning_values (:LISTA);
if (ORDEN = 'C') then
    BEGIN
    CODINI = ARTINI;
    CODFIN = ARTFIN;
    DESINI = '';
    DESFIN = 'zz';
    END
ELSE
    BEGIN
    DESINI = ARTINI;
    DESFIN = ARTFIN;
    CODINI = '';
    CODFIN = 'zz';
    END
EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION', 'FACTURAS', 'GENERAR PEDIDO AUTOMATICAMENTE CON LA FACTURA') returning_values (pedauto);
if (DETALLE = 'B') then
  BEGIN
  FOR SELECT ARTI_COD, ARTI_DES, ARTI_UNIDAD, ARTI_EXIST, TAIV_PORC, A.GRUP_COD, A.SUBG_COD, A.MARC_COD, BODE_COD, BODE_NOM, ARTI_CONSUMO, ARTI_PESO/1000
      FROM ARTICULO A, BODEGA B, TARIFA_IVA T
      WHERE ARTI_COD >= :CODINI AND ARTI_COD <= :CODFIN AND ARTI_DES >= :DESINI AND ARTI_DES <= :DESFIN AND ESAR_COD <> 'I' AND BODE_COD >= :BODINI AND
      BODE_COD <= :BODFIN AND ((SUCU_ID = :SUCURSAL) or (:SUCURSAL = 0)) AND A.TAIV_COD = T.TAIV_COD
      INTO :CODIGO, :NOMBRE, :UNIDAD, :EXIST, :IVA, :CODGRUPO, :CODSUBG, :CODMARC, :CODBOD, :NOMBOD, :CONSUMO, :pesounit
      DO
        BEGIN
        STAND = '';
        OK = 'N';
        if (AGRUPA = 'G') then
            BEGIN
            if ((CODGRUPO >= GRPINI) AND (CODGRUPO <= GRPFIN)) then
                OK = 'S';
            end
        ELSE
            if (AGRUPA = 'M') then
                BEGIN
                if ((CODMARC >= GRPINI) AND (CODMARC <= GRPFIN)) then
                    OK = 'S';
                END
        if (OK = 'S') then
            BEGIN
            NOMGRUPO = '';
            NOMMARC = '';
            NOMSUBG = '';
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            SELECT MAX(COBA_COD) FROM BARRAS_ARTICULO WHERE ARTI_COD = :codigo AND COBA_UNIDAD = :unidad INTO :codbar;
            if (CODBAR IS NULL) then
                CODBAR = CODIGO;
            if (EXIST <> 'N') then
                BEGIN
                SELECT STAND_COD FROM STANDS WHERE ARTI_COD = :CODIGO AND STAND_BODEGA = :CODBOD INTO :STAND;
                EXECUTE PROCEDURE SALDO_INICIAL_INVENTARIO(CODIGO, FECHA, :CODBOD) returning_values (CANT);
                EXECUTE PROCEDURE costo_promedio_y_ultimo_unidad(CODIGO, FECHA, UNIDAD) returning_values (COSTO, ULTCOSTO);
                SELECT MAX(MVAR_FECHA) FROM MOVIMIENTO_ARTICULO WHERE ARTI_COD = :CODIGO AND MVAR_ENTRADA = 'S' AND MVAR_FECHA <= :FECHA INTO :FECHACOSTO;
                if (MASIVA = 'S') then
                    COSTO = COSTO * (100 + :IVA) / 100 + :CONSUMO;
                COSTOTOT = :CANT * :COSTO;
                CONSUMO = CONSUMO * CANT;
                if (RESERVA = 'S') then
                    BEGIN
                    SELECT SUM(ORID_ENTREGAR)
                        FROM ORDENINVENTARIO_DETALLE OD, ordenes_inventario O
                        WHERE O.ORIN_ID = OD.ORIN_ID AND ARTI_COD = :CODIGO AND ORIN_FECHA <= :FECHA AND ORIN_FECLLEGA >= :FECHA AND ORID_ANULADO = 'N' AND OD.BODE_COD = :CODBOD
                        INTO :ORDENADO;
                    if (ORDENADO IS NULL) then
                        ORDENADO = 0;
                    ORDENC = 0;
                    FOR SELECT O.ORDC_ID, OCDE_ITEM, OCDE_CANT * OCDE_FACTOR
                        FROM ORDENES_COMPRA O, ORDENES_COMPRA_DETALLE OD
                        WHERE O.ORDC_ID = OD.ORDC_ID AND OD.ARTI_COD = :CODIGO AND ORDC_VENCE >= :FECHA AND ORDC_FECHA <= :FECHA AND OCDE_ANULADO = 'N' AND OD.BODE_COD = :CODBOD
                        INTO :ID, :ITEM, :CANT2
                        do
                        BEGIN
                        EXECUTE PROCEDURE FALTANTE(23, 21, ID, ITEM) returning_values (PEDIDO, UND, FACTOR);
                        if (PEDIDO * FACTOR = CANT2) then /* SI NO SE HA FACTURADO MIRE A VER SI SE REMISIONO */
                            EXECUTE PROCEDURE FALTANTE(23, 22, ID, ITEM) returning_values (PEDIDO, UND, FACTOR);
                        if (PEDIDO IS NULL) then
                            PEDIDO = 0;
                        ORDENC = ORDENC + PEDIDO * FACTOR;
                        END
                    ORDENADO = ORDENADO + ORDENC;
                    SELECT SUM(RSDE_LIBERAR)
                        FROM RESERVAS_DETALLE RD, RESERVAS R
                        WHERE R.RESE_ID = RD.RESE_ID AND ARTI_COD = :CODIGO AND RESE_FECHA <= :FECHA AND RESE_VENCE >= :FECHA AND RD.BODE_COD = :CODBOD AND RSDE_ANULADO = 'N'
                        INTO :RESERVADO;
                    if (RESERVADO IS NULL) then
                        RESERVADO = 0;
                    PEDIDO = 0;
                    FOR SELECT P.PEDI_ID, PEDE_ITEM, PEDE_CANT * PEDE_FACTOR
                        FROM PEDIDOS P, PEDIDOS_DETALLE PD
                        WHERE P.PEDI_ID = PD.PEDI_ID AND PD.ARTI_COD = :CODIGO AND PEDI_VENCE >= :FECHA AND PEDI_FECHA <= :FECHA AND PEDE_ANULADO = 'N' AND BODE_COD = :CODBOD
                        INTO :ID, :ITEM, :CANT2
                        do
                        BEGIN
                        EXECUTE PROCEDURE FALTANTE(34, 31, ID, ITEM) returning_values (ORDENC, UND, FACTOR);
                        if ((ORDENC * FACTOR = CANT2) or (PEDAUTO = 'SI')) then /* SI NO SE HA FACTURADO MIRE A VER SI SE REMISIONO */
                            EXECUTE PROCEDURE FALTANTE(34, 32, ID, ITEM) returning_values (ORDENC, UND, FACTOR);
                        if (ORDENC IS NULL) then
                            ORDENC = 0;
                        PEDIDO = PEDIDO + ORDENC * FACTOR;
                        END
                    RESERVADO = RESERVADO + PEDIDO;
                    END
                ELSE
                    BEGIN
                    RESERVADO = 0;
                    ORDENADO = 0;
                    END
                if (LISTA > 0) then
                    SELECT prar_fijo FROM precios_articulo WHERE arti_cod = :CODIGO and lipr_cod = :LISTA INTO :PRECIO;
                if (ENPESO = 'S') then
                    BEGIN
                    if (pesounit IS NULL) then
                        pesounit = 0;
                    if (PESOUNIT <> 0) then
                        BEGIN
                        pesototal = PESOUNIT * cant;
                        SUSPEND;
                        END
                    END
                ELSE
                    SUSPEND;
                END
            END
        END
  END

if (DETALLE = 'L') then
  BEGIN
  FOR SELECT A.ARTI_COD, ARTI_DES, ARTI_UNIDAD, ARTI_EXIST, TAIV_PORC, A.GRUP_COD, A.SUBG_COD, A.MARC_COD, L.lote_nro, L.lote_nro||' - '||L.lote_vence, ARTI_CONSUMO,l.bode_cod, L.lote_saldo,l.lote_costo, ARTI_PESO/1000
      FROM ARTICULO A, LOTES l, TARIFA_IVA T
      WHERE A.ARTI_COD >= '0' AND A.ARTI_COD <= 'zz' AND ARTI_DES >= '' AND ARTI_DES <= 'zz' AND ESAR_COD <> 'I' AND A.TAIV_COD = T.TAIV_COD and a.arti_cod = l.arti_cod
      INTO :CODIGO, :NOMBRE, :UNIDAD, :EXIST, :IVA, :CODGRUPO, :CODSUBG, :CODMARC, :LOTE, :NOMBOD, :CONSUMO, :codbod, :cant, :costo_lote, :pesounit
      DO
        BEGIN
        OK = 'N';
        if (AGRUPA = 'G') then
            BEGIN
            if ((CODGRUPO >= GRPINI) AND (CODGRUPO <= GRPFIN)) then
                OK = 'S';
            end
        ELSE
            if (AGRUPA = 'M') then
                BEGIN
                if ((CODMARC >= GRPINI) AND (CODMARC <= GRPFIN)) then
                    OK = 'S';
                END
        if (OK = 'S') then
            BEGIN
            NOMGRUPO = '';
            NOMMARC = '';
            NOMSUBG = '';
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            SELECT MAX(COBA_COD) FROM BARRAS_ARTICULO WHERE ARTI_COD = :codigo AND COBA_UNIDAD = :unidad INTO :codbar;
            if (CODBAR IS NULL) then
                CODBAR = CODIGO;

            if (EXIST <> 'N') then
                BEGIN
                EXECUTE PROCEDURE COSTO_PROMEDIO_UNIDAD(CODIGO, FECHA, UNIDAD) returning_values (COSTO);
                EXECUTE PROCEDURE ULTIMO_COSTO(CODIGO, FECHA, UNIDAD) returning_values (ULTCOSTO);
                SELECT MAX(MVAR_FECHA) FROM MOVIMIENTO_ARTICULO WHERE ARTI_COD = :CODIGO AND MVAR_ENTRADA = 'S' AND MVAR_FECHA <= :FECHA INTO :FECHACOSTO;
                if (MASIVA = 'S') then
                    COSTO = COSTO * (100 + :IVA) / 100 + :CONSUMO;
                COSTOTOT = :CANT * :COSTO;
                CONSUMO = CONSUMO * CANT;
                if (RESERVA = 'S') then
                    BEGIN
                    SELECT SUM(ORID_ENTREGAR)
                        FROM ORDENINVENTARIO_DETALLE OD, ordenes_inventario O
                        WHERE O.ORIN_ID = OD.ORIN_ID AND ARTI_COD = :CODIGO AND ORIN_FECHA <= :FECHA AND ORIN_FECLLEGA >= :FECHA AND ORID_ANULADO = 'N'
                        INTO :ORDENADO;
                    if (ORDENADO IS NULL) then
                        ORDENADO = 0;
                    ORDENC = 0;
                    FOR SELECT O.ORDC_ID, OCDE_ITEM, OCDE_CANT * OCDE_FACTOR
                        FROM ORDENES_COMPRA O, ORDENES_COMPRA_DETALLE OD
                        WHERE O.ORDC_ID = OD.ORDC_ID AND OD.ARTI_COD = :CODIGO AND ORDC_VENCE >= :FECHA AND ORDC_FECHA <= :FECHA AND OCDE_ANULADO = 'N'
                        INTO :ID, :ITEM, :CANT2
                        do
                        BEGIN
                        EXECUTE PROCEDURE FALTANTE(23, 21, ID, ITEM) returning_values (PEDIDO, UND, FACTOR);
                        if (PEDIDO * FACTOR = CANT2) then /* SI NO SE HA FACTURADO MIRE A VER SI SE REMISIONO */
                            EXECUTE PROCEDURE FALTANTE(23, 22, ID, ITEM) returning_values (PEDIDO, UND, FACTOR);
                        if (PEDIDO IS NULL) then
                            PEDIDO = 0;
                        ORDENC = ORDENC + PEDIDO * FACTOR;
                        END
                    ORDENADO = ORDENADO + ORDENC;
                    SELECT SUM(RSDE_LIBERAR)
                        FROM RESERVAS_DETALLE RD, RESERVAS R
                        WHERE R.RESE_ID = RD.RESE_ID AND ARTI_COD = :CODIGO AND RESE_FECHA <= :FECHA AND RESE_VENCE >= :FECHA AND RSDE_ANULADO = 'N'
                        INTO :RESERVADO;
                    if (RESERVADO IS NULL) then
                        RESERVADO = 0;
                    PEDIDO = 0;
                    FOR SELECT P.PEDI_ID, PEDE_ITEM, PEDE_CANT * PEDE_FACTOR
                        FROM PEDIDOS P, PEDIDOS_DETALLE PD
                        WHERE P.PEDI_ID = PD.PEDI_ID AND PD.ARTI_COD = :CODIGO AND PEDI_VENCE >= :FECHA AND PEDI_FECHA <= :FECHA AND PEDE_ANULADO = 'N'
                        INTO :ID, :ITEM, :CANT2
                        do
                        BEGIN
                        EXECUTE PROCEDURE FALTANTE(34, 31, ID, ITEM) returning_values (ORDENC, UND, FACTOR);
                        if ((ORDENC * FACTOR = CANT2) or (PEDAUTO = 'SI')) then /* SI NO SE HA FACTURADO MIRE A VER SI SE REMISIONO */
                            EXECUTE PROCEDURE FALTANTE(34, 32, ID, ITEM) returning_values (ORDENC, UND, FACTOR);
                        if (ORDENC IS NULL) then
                            ORDENC = 0;
                        PEDIDO = PEDIDO + ORDENC * FACTOR;
                        END
                    RESERVADO = RESERVADO + PEDIDO;
                    END
                ELSE
                    BEGIN
                    RESERVADO = 0;
                    ORDENADO = 0;
                    END
                if (LISTA > 0) then
                    SELECT prar_fijo FROM precios_articulo WHERE arti_cod = :CODIGO and lipr_cod = :LISTA INTO :PRECIO;
                if (ENPESO = 'S') then
                    BEGIN
                    if (pesounit IS NULL) then
                        pesounit = 0;
                    if (PESOUNIT <> 0) then
                        BEGIN
                        pesototal = PESOUNIT * cant;
                        SUSPEND;
                        END
                    END
                ELSE
                    SUSPEND;
                END
            END
        END
  end
if (DETALLE = 'N') then
  BEGIN
  FOR SELECT ARTI_COD, ARTI_DES, ARTI_UNIDAD, ARTI_EXIST, TAIV_PORC, A.GRUP_COD, A.SUBG_COD, A.MARC_COD, ARTI_CONSUMO, ARTI_PESO/1000
      FROM ARTICULO A, TARIFA_IVA T
      WHERE ARTI_COD >= :CODINI AND ARTI_COD <= :CODFIN AND ARTI_DES >= :DESINI AND ARTI_DES <= :DESFIN AND ESAR_COD <> 'I' AND A.TAIV_COD = T.TAIV_COD
      INTO :CODIGO, :NOMBRE, :UNIDAD, :EXIST, :IVA, :CODGRUPO, :CODSUBG, :CODMARC, :CONSUMO, :pesounit
      DO
        BEGIN
        OK = 'N';
        if (AGRUPA = 'G') then
            BEGIN
            if ((GRPINI = '0') AND (GRPFIN = 'zz')) then
                OK = 'S';
            else
                if ((CODGRUPO >= GRPINI) AND (CODGRUPO <= GRPFIN)) then
                    OK = 'S';
            end
        ELSE
            if (AGRUPA = 'M') then
                BEGIN
                if ((GRPINI = '0') AND (GRPFIN = 'zzz')) then
                    OK = 'S';
                else
                    if ((CODMARC >= GRPINI) AND (CODMARC <= GRPFIN)) then
                        OK = 'S';
                END
        if (OK = 'S') then
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            SELECT MAX(COBA_COD) FROM BARRAS_ARTICULO WHERE ARTI_COD = :codigo AND COBA_UNIDAD = :unidad INTO :codbar;
            if (CODBAR IS NULL) then
                CODBAR = CODIGO;

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

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

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE MOVIMIENTO_ARTICULO_DESDE_HASTA(
    FECINI DATE,
    FECFIN DATE,
    SUCURSAL INTEGER)
RETURNS (
    INICIAL NUMERIC(18,4),
    ENTRADAS NUMERIC(18,4),
    SALIDAS NUMERIC(18,4),
    FINAL NUMERIC(18,4),
    CODIGO VARCHAR(15),
    NOMBRE VARCHAR(60),
    UNIDAD VARCHAR(8),
    CODGRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    CODSUBG VARCHAR(3),
    NOMSUBG VARCHAR(17),
    CODMARC VARCHAR(3),
    NOMMARC VARCHAR(30),
    CODBOD VARCHAR(2),
    NOMBOD VARCHAR(30))
AS
BEGIN
  FOR
    SELECT ARTI_COD, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD, BODE_COD, BODE_NOM
        FROM ARTICULO A, BODEGA B
        WHERE (SUCU_ID = :SUCURSAL) or (:SUCURSAL = 0)
      INTO :CODIGO, :NOMBRE, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :CODBOD, NOMBOD
      DO
        BEGIN
        NOMMARC = '';
        NOMSUBG = '';
        SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
        SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
        SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
        EXECUTE PROCEDURE SALDO_INICIAL_INVENTARIO(CODIGO, FECINI, :CODBOD) returning_values (INICIAL);
        SELECT SUM(MVAR_CANT) FROM MOVIMIENTO_ARTICULO
          WHERE (MVAR_FECHA >= :FECINI) AND (MVAR_FECHA < :FECFIN) AND
          (ARTI_COD = :codigo) AND (BODE_COD = :CODBOD) AND (MVAR_ENTRADA = 'S') INTO :ENTRADAS;
        if (ENTRADAS IS NULL) then
          ENTRADAS = 0;
        SELECT SUM(MVAR_CANT) FROM MOVIMIENTO_ARTICULO
          WHERE (MVAR_FECHA >= :FECINI) AND (MVAR_FECHA < :FECFIN) AND
          (ARTI_COD = :CODIGO) AND (BODE_COD = :CODBOD) AND (MVAR_ENTRADA = 'N') INTO :SALIDAS;
        if (SALIDAS IS NULL) then
          SALIDAS = 0;
        FINAL = INICIAL + ENTRADAS - SALIDAS;
        SUSPEND;
        END
END

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE MOVIMIENTO_ARTICULO_MES(
    ARTICULO VARCHAR(15),
    FECINI DATE,
    FECFIN DATE,
    BODEGA CHAR(2))
RETURNS (
    INICIAL NUMERIC(18,4),
    ENTC NUMERIC(18,4),
    SALC NUMERIC(18,4))
AS
BEGIN
  EXECUTE PROCEDURE SALDO_INICIAL_INVENTARIO(ARTICULO, FECINI, BODEGA) returning_values (INICIAL);
  SELECT SUM(MVAR_CANT) FROM MOVIMIENTO_ARTICULO
    WHERE (MVAR_FECHA >= :FECINI) AND (MVAR_FECHA <= :FECFIN) AND
          (ARTI_COD = :ARTICULO) AND (BODE_COD = :BODEGA) AND (MVAR_ENTRADA = 'S') INTO :ENTC;
  if (ENTC IS NULL) then
    ENTC = 0;
  SELECT SUM(MVAR_CANT) FROM MOVIMIENTO_ARTICULO
    WHERE (MVAR_FECHA >= :FECINI) AND (MVAR_FECHA <= :FECFIN) AND
          (ARTI_COD = :ARTICULO) AND (BODE_COD = :BODEGA) AND (MVAR_ENTRADA = 'N') INTO :SALC;
  if (SALC IS NULL) then
    SALC = 0;
  SUSPEND;
END

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE REP_EXISTENCIAS_PRECIOS(
    ARTINI VARCHAR(20),
    ARTFIN VARCHAR(20),
    GRPINI VARCHAR(2),
    GRPFIN VARCHAR(2),
    ORDEN CHAR(1),
    LISTA INTEGER,
    FECHA DATE,
    BODINI VARCHAR(2),
    BODFIN VARCHAR(2),
    TODAS CHAR(1),
    IVAINC CHAR(1),
    SINBOD CHAR(1),
    SUBEMPRESA INTEGER)
RETURNS (
    CODIGO VARCHAR(15),
    NOMBRE VARCHAR(60),
    UNIDAD VARCHAR(8),
    CODGRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    CODSUBG VARCHAR(3),
    NOMSUBG VARCHAR(30),
    CODMARC VARCHAR(3),
    NOMMARC VARCHAR(30),
    NOMLISTA VARCHAR(30),
    PRECIO NUMERIC(18,2),
    MARGEN NUMERIC(9,2),
    IVA NUMERIC(9,2),
    CODBOD VARCHAR(2),
    NOMBOD VARCHAR(30),
    CANT NUMERIC(18,4),
    COSTOTOT NUMERIC(18,2))
AS
DECLARE VARIABLE EXIST CHAR(1);
DECLARE VARIABLE CODINI VARCHAR(20);
DECLARE VARIABLE CODFIN VARCHAR(20);
DECLARE VARIABLE DESINI VARCHAR(20);
DECLARE VARIABLE DESFIN VARCHAR(20);
DECLARE VARIABLE FECINI DATE;
DECLARE VARIABLE FECFIN DATE;
DECLARE VARIABLE UTIL NUMERIC(9,2);
DECLARE VARIABLE MOU CHAR(10);
DECLARE VARIABLE LISIVA CHAR(1);
BEGIN
if (ORDEN = 'C') then
    BEGIN
    CODINI = ARTINI;
    CODFIN = ARTFIN;
    DESINI = '';
    DESFIN = 'zz';
    END
ELSE
    BEGIN
    DESINI = ARTINI;
    DESFIN = ARTFIN;
    CODINI = '';
    CODFIN = 'zz';
    END
    
EXECUTE PROCEDURE LEE_CONFIGURACION ('FACTURACION', 'ARTICULOS', 'SUGERIR PRECIOS CON PORCENTAJE DE MARGEN O UTILIDAD') returning_values (MOU);
    
FOR SELECT ARTI_COD, ARTI_DES, ARTI_UNIDAD, ARTI_EXIST, A.GRUP_COD, A.SUBG_COD, A.MARC_COD, TAIV_PORC
    FROM ARTICULO A, TARIFA_IVA T
    WHERE ARTI_COD >= :CODINI AND ARTI_COD <= :CODFIN AND A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :GRPFIN AND
    ARTI_DES >= :DESINI AND ARTI_DES <= :DESFIN AND ESAR_COD <> 'I' AND A.TAIV_COD = T.TAIV_COD
    INTO :CODIGO, :NOMBRE, :UNIDAD, :EXIST, :CODGRUPO, :CODSUBG, :CODMARC, :IVA
    DO
    BEGIN
    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
    if (EXIST <> 'N') then
        BEGIN
        if (LISTA = 255) then
            BEGIN
            if (TODAS = 'N') then
                begin
                /* Busque las listas validas hoy */
                FOR SELECT LIPR_NOM, LIPR_FECINI, LIPR_FECFIN, PRAR_FIJO, PRAR_MARGEN, PRAR_UTIL, LIPR_MODIF
                    FROM LISTA_PRECIOS L, PRECIOS_ARTICULO P
                    WHERE L.LIPR_COD = P.LIPR_COD AND ARTI_COD = :CODIGO
                    INTO :NOMLISTA, :FECINI, :FECFIN, :PRECIO, :MARGEN, :UTIL, :LISIVA
                    DO
                      BEGIN
                      if (MOU = 'UTILIDAD') then
                        MARGEN = UTIL;
                      if (IVAINC = 'S') THEN
                        BEGIN
                        if (LISIVA = 'N') then
                            PRECIO = PRECIO * (1 + (IVA/100));
                        END
                      END
                end   
            ELSE
                FOR SELECT LIPR_NOM, PRAR_FIJO, PRAR_MARGEN, PRAR_UTIL, LIPR_MODIF
                    FROM LISTA_PRECIOS L, PRECIOS_ARTICULO P
                    WHERE L.LIPR_COD = P.LIPR_COD AND ARTI_COD = :CODIGO
                    INTO :NOMLISTA, :PRECIO, :MARGEN, :UTIL, :LISIVA
                    DO
                    BEGIN
                    EXECUTE PROCEDURE LEE_CONFIGURACION ('FACTURACION', 'ARTICULOS', 'SUGERIR PRECIOS CON PORCENTAJE DE MARGEN O UTILIDAD') returning_values (MOU);
                    if (MOU = 'UTILIDAD') then
                        MARGEN = UTIL;
                    if (IVAINC = 'S') THEN
                        BEGIN
                        if (LISIVA = 'N') then
                            PRECIO = PRECIO * (1 + (IVA/100));
                        END
                    END
            END /* 255 */
        ELSE
            BEGIN
            if (TODAS = 'N') then
                begin
                /* Busque las listas validas hoy */
                FOR SELECT LIPR_NOM, LIPR_FECINI, LIPR_FECFIN, PRAR_FIJO, PRAR_MARGEN, PRAR_UTIL, LIPR_MODIF
                    FROM LISTA_PRECIOS L, PRECIOS_ARTICULO P
                    WHERE L.LIPR_COD = P.LIPR_COD AND ARTI_COD = :CODIGO AND L.LIPR_COD = :LISTA
                    INTO :NOMLISTA, :FECINI, :FECFIN, :PRECIO, :MARGEN, :UTIL, :LISIVA
                    DO
                    BEGIN
                    if (MOU = 'UTILIDAD') then
                        MARGEN = UTIL;
                    if (IVAINC = 'S') THEN
                        BEGIN
                        if (LISIVA = 'N') then
                            PRECIO = PRECIO * (1 + (IVA/100));
                        END
                    END
                end
            ELSE
                FOR SELECT LIPR_NOM, PRAR_FIJO, PRAR_MARGEN, PRAR_UTIL
                    FROM LISTA_PRECIOS L, PRECIOS_ARTICULO P
                    WHERE L.LIPR_COD = P.LIPR_COD AND ARTI_COD = :CODIGO AND L.LIPR_COD = :LISTA
                    INTO :NOMLISTA, :PRECIO, :MARGEN, :UTIL
                    DO
                    BEGIN
                    if (MOU = 'UTILIDAD') then
                        MARGEN = UTIL;
                    if (IVAINC = 'S') THEN
                        BEGIN
                        if (LISIVA = 'NO') then
                            PRECIO = PRECIO * (1 + (IVA/100));
                        END
                    END
            END
                      
        if (SINBOD = 'S') then
            BEGIN
            EXECUTE PROCEDURE SALDO_INICIAL_TOTAL_INV(CODIGO, FECHA) returning_values (CANT);
            COSTOTOT = CANT * PRECIO;
            if (FECINI is null) then
                SUSPEND;
            else
                if ((FECINI <= :FECHA) AND (FECFIN >= :FECHA)) Then
                    SUSPEND;
            END
        ELSE
            BEGIN
            FOR SELECT BODE_COD, BODE_NOM FROM BODEGA B
                WHERE BODE_COD >= :BODINI AND BODE_COD <= :BODFIN AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                INTO :CODBOD, :NOMBOD
                DO
                BEGIN
                EXECUTE PROCEDURE SALDO_INICIAL_INVENTARIO(CODIGO, FECHA, :CODBOD) returning_values (CANT);
                        
                COSTOTOT = CANT * PRECIO;
                if (FECINI is null) then
                    SUSPEND;
                else
                    if ((FECINI <= :FECHA) AND (FECFIN >= :FECHA)) Then
                        SUSPEND;
                END
            END
        END
    END
END

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE REP_KARDEX_ARTICULO(
    DETALLE CHAR(1),
    FECINI DATE,
    FECFIN DATE,
    ARTINI VARCHAR(20),
    ARTFIN VARCHAR(20),
    GRPINI VARCHAR(2),
    GRPFIN VARCHAR(2),
    ORDEN CHAR(1),
    BODEGA VARCHAR(2))
RETURNS (
    CODIGO VARCHAR(15),
    NOMBRE VARCHAR(60),
    UNIDAD VARCHAR(8),
    CODGRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    CODSUBG VARCHAR(3),
    NOMSUBG VARCHAR(30),
    CODMARC VARCHAR(3),
    NOMMARC VARCHAR(30),
    CODBOD VARCHAR(2),
    SALDOINI NUMERIC(18,4),
    COSTOINI NUMERIC(18,2),
    ENTRADAS NUMERIC(18,4),
    COSTOENT NUMERIC(18,2),
    SALIDAS NUMERIC(18,4),
    COSTOSAL NUMERIC(18,2),
    SALDOFIN NUMERIC(18,4),
    COSTOFIN NUMERIC(18,2),
    TIPODOC VARCHAR(8),
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    CONCEPTO VARCHAR(60),
    NIT VARCHAR(20),
    CONS INTEGER,
    CANFINAL NUMERIC(18,4),
    COSFINAL NUMERIC(18,2))
AS
DECLARE VARIABLE ENTRADA CHAR(1);
DECLARE VARIABLE CANT NUMERIC(18,4);
DECLARE VARIABLE COSTO NUMERIC(18,2);
DECLARE VARIABLE CODINI VARCHAR(20);
DECLARE VARIABLE CODFIN VARCHAR(20);
DECLARE VARIABLE DESINI VARCHAR(20);
DECLARE VARIABLE DESFIN VARCHAR(20);
BEGIN
if (ORDEN = 'C') then
    BEGIN
    CODINI = ARTINI;
    CODFIN = ARTFIN;
    DESINI = '';
    DESFIN = 'zz';
    END
ELSE
    BEGIN
    DESINI = ARTINI;
    DESFIN = ARTFIN;
    CODINI = '';
    CODFIN = 'zz';
    END
  FOR
    SELECT ARTI_COD, ARTI_DES, ARTI_UNIDAD, A.GRUP_COD, A.SUBG_COD, A.MARC_COD
      FROM ARTICULO A
      WHERE ARTI_COD >= :CODINI AND ARTI_COD <= :CODFIN AND A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :GRPFIN AND ARTI_DES >= :DESINI AND ARTI_DES <= :DESFIN AND A.ESAR_COD <> 'I'
      INTO :CODIGO, :NOMBRE, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
      DO
        BEGIN
        NOMMARC = '';
        NOMSUBG = '';
        SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
        SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
        SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
        if (BODEGA = '') then
            BEGIN
            EXECUTE PROCEDURE SALDO_INICIAL_TOTAL_INV(CODIGO, FECINI) returning_values (:SALDOINI);
            EXECUTE PROCEDURE VALOR_INICIAL_INVENTARIO(CODIGO, FECINI) returning_values (COSTOINI);
            END
        ELSE
            BEGIN
            EXECUTE PROCEDURE SALDO_INICIAL_INVENTARIO(CODIGO, FECINI, :BODEGA) returning_values (SALDOINI);
            EXECUTE PROCEDURE COSTO_PROMEDIO(CODIGO, FECINI-1) returning_values (COSTOINI);
            COSTOINI = COSTOINI * saldoini;
            END
        if (DETALLE = 'N') then
            BEGIN
            /* SUME LAS ENTRADAS */
            if (BODEGA = '') then
              SELECT SUM(COST_ENTC), SUM(COST_ENTP), SUM(COST_SALC), SUM(COST_SALP) FROM COSTOS
                WHERE (COST_FECHA >= :FECINI) AND (COST_FECHA <= :FECFIN) AND (ARTI_COD = :codigo)
                INTO :ENTRADAS, :COSTOENT, :SALIDAS, :COSTOSAL;
            ELSE
              SELECT SUM(COST_ENTC), SUM(COST_ENTP), SUM(COST_SALC), SUM(COST_SALP)
                FROM COSTOS C, MOVIMIENTO_ARTICULO M
                WHERE (COST_FECHA >= :FECINI) AND (COST_FECHA <= :FECFIN) AND (C.ARTI_COD = :codigo) AND C.cost_idmov = M.mvar_cons AND BODE_COD = :BODEGA
                INTO :ENTRADAS, :COSTOENT, :SALIDAS, :COSTOSAL;

            if (ENTRADAS IS NULL) then
              ENTRADAS = 0;
            if (COSTOENT IS NULL) then
              COSTOENT = 0;
            if (SALIDAS IS NULL) then
              SALIDAS = 0;
            if (COSTOSAL IS NULL) then
              COSTOSAL = 0;
            SALDOFIN = SALDOINI + ENTRADAS - SALIDAS;
            COSTOFIN = COSTOINI + COSTOENT - COSTOSAL;
            if (BODEGA = '') then
                BEGIN
                EXECUTE PROCEDURE SALDO_INICIAL_TOTAL_INV(CODIGO, fecfin+1) returning_values (canfinal);
                EXECUTE PROCEDURE VALOR_INICIAL_INVENTARIO(CODIGO, FECFIN+1) returning_values (cosfinal);
                END
            ELSE
                BEGIN
                EXECUTE PROCEDURE SALDO_INICIAL_INVENTARIO(CODIGO, FECFIN+1, :BODEGA) returning_values (CANFINAL);
                EXECUTE PROCEDURE COSTO_PROMEDIO(CODIGO, FECFIN+1) returning_values (COSFINAL);
                COSFINAL = COSFINAL * CANFINAL;
                END
            SUSPEND;
            END
        ELSE
            BEGIN
            SALDOFIN = SALDOINI;
            COSTOFIN = COSTOINI;
            COSTOENT = 0;
            COSTOSAL = 0;
            FOR SELECT TIDO_NOMCORTO, MVAR_ENTRADA, MVAR_PREF, MVAR_NUMERO, MVAR_CANT, MVAR_COSTO, MVAR_CONC, MVAR_FECHA, M.TERC_NIT, MVAR_CONS, BODE_COD, COST_SALDOP, COST_SALDOC
                FROM MOVIMIENTO_ARTICULO M, TIPO_DOCUMENTO TD, COSTOS C
                WHERE TD.TIDO_COD = MVAR_TIPODOC AND (MVAR_FECHA >= :FECINI) AND (MVAR_FECHA <= :FECFIN) AND (MVAR_TIPODOC <> 13) AND (m.ARTI_COD = :CODIGO) AND M.mvar_cons = C.cost_idmov
                ORDER BY MVAR_FECHA, MVAR_CONS
                INTO :TIPODOC, :ENTRADA, :PREFIJO, :NUMERO, :ENTRADAS, :COSTOENT, :CONCEPTO, :FECHA, :NIT, :CONS, :CODBOD, :costo, :cant
                DO
                    BEGIN
                    if (ENTRADA = 'S') then
                        BEGIN
                        SALIDAS = 0;
                        SALDOFIN = SALDOFIN + ENTRADAS;
                        COSTOFIN = COSTOFIN + (ENTRADAS * COSTOENT);
                        if (CANT > 0) then
                            COSTOSAL = COSTO / CANT;
                        else
                            COSTOSAL = 0;
                        end
                    ELSE
                        BEGIN
                        SALIDAS = ENTRADAS;
                        ENTRADAS = 0;
                        if (CANT > 0) then
                            COSTOSAL = COSTO / CANT;
                        else
                            COSTOSAL = 0;
                        SALDOFIN = SALDOFIN - SALIDAS;
                        COSTOFIN = COSTOFIN - (SALIDAS * costosal);
                        END
                    SUSPEND;
                    END
            END
        END
END

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE REP_MOVIMIENTO_X_ARTICULO(
    DETALLE CHAR(1),
    FECINI DATE,
    FECFIN DATE,
    ARTINI VARCHAR(20),
    ARTFIN VARCHAR(20),
    GRPINI VARCHAR(2),
    GRPFIN VARCHAR(2),
    ORDEN CHAR(1),
    SUBEMPRESA INTEGER)
RETURNS (
    CODIGO VARCHAR(15),
    NOMBRE VARCHAR(60),
    UNIDAD VARCHAR(8),
    CODGRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    CODSUBG VARCHAR(3),
    NOMSUBG VARCHAR(30),
    CODMARC VARCHAR(3),
    NOMMARC VARCHAR(30),
    CODBOD VARCHAR(2),
    NOMBOD VARCHAR(30),
    SALDOINI NUMERIC(18,4),
    ENTRADAS NUMERIC(18,4),
    SALIDAS NUMERIC(18,4),
    SALDOFIN NUMERIC(18,4),
    TIPODOC VARCHAR(8),
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    CONCEPTO VARCHAR(60),
    LOTE VARCHAR(15),
    LO_VENCE DATE,
    NIT VARCHAR(20),
    NOMTERC VARCHAR(60),
    CONS INTEGER)
AS
declare variable ENTRADA CHAR(1);
declare variable CODINI VARCHAR(20);
declare variable CODant VARCHAR(15) CHARACTER SET NONE;
declare variable CODFIN VARCHAR(20);
declare variable DESINI VARCHAR(20);
declare variable DESFIN VARCHAR(20);
DECLARE VARIABLE FEC DATE;
BEGIN
if (ORDEN = 'C') then
    BEGIN
    CODINI = ARTINI;
    CODFIN = ARTFIN;
    DESINI = '';
    DESFIN = 'zz';
    END
ELSE
    BEGIN
    DESINI = ARTINI;
    DESFIN = ARTFIN;
    CODINI = '';
    CODFIN = 'zz';
    END

if (DETALLE = 'L') then
  BEGIN
   codant = 0;
   for SELECT A.ARTI_COD, ARTI_DES, ARTI_UNIDAD, A.GRUP_COD, A.SUBG_COD, A.MARC_COD, LOTE_NRO,LOTE_VENCE, BODE_COD
     FROM ARTICULO A, LOTES L
     WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :GRPFIN AND
       ARTI_DES >= :DESINI AND ARTI_DES <= :DESFIN AND A.ESAR_COD <> 'I' AND a.arti_cod = l.arti_cod
     INTO :CODIGO, :NOMBRE, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :LOTE, :LO_VENCE, :codbod
     DO
     BEGIN
      SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
      SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
      SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
      SELECT BODE_NOM FROM BODEGA WHERE BODE_COD = :codbod INTO nombod;

      SELECT  MAX(EXIS_FECHA) FROM EXISTENCIA
        WHERE (ARTI_COD = :CODIGO) AND (BODE_COD = :codbod) AND (EXIS_FECHA < :FECINI) INTO :FEC;
      IF (FEC IS NULL) THEN
        SALDOINI = 0;
      ELSE
        begin
        /* Con la fecha máxima calcule el nuevo saldo */
        if (FECINI = FEC) then
          SELECT SUM(EXIS_SALDO) FROM EXISTENCIA
            WHERE (ARTI_COD = :CODIGO) AND (BODE_COD = :codbod) AND (EXIS_FECHA = :FEC) INTO :SALDOINI;
        ELSE
          SELECT SUM(EXIS_ENTR - EXIS_SAL) FROM EXISTENCIA
            WHERE (ARTI_COD = :CODIGO) AND (BODE_COD = :codbod) AND (EXIS_FECHA <= :FEC) INTO :SALDOINI;
        end
      if (SALDOINI IS NULL) then
        SALDOINI = 0;
      if (codigo <> codant) then
          SALDOFIN = SALDOINI;
      for SELECT TIPODOC, PREFIJO, NUMERO, FECHA, CONCEPTO, ENT, CANTENT, CANTSAL, NIT, CONS
        FROM MOVLOTES_DESDE_HASTA(:codigo, :codbod, :LOTE,:fecini, :fecfin,:SUBEMPRESA)
        ORDER BY FECHA,CONS
        INTO :TIPODOC, :PREFIJO, :NUMERO, :FECHA, :CONCEPTO, :ENTRADA, :ENTRADAS, :SALIDAS, :NIT, :CONS
        DO
        BEGIN
          if (nit is not null) then
            SELECT TERC_NOM FROM TERCEROS WHERE TERC_NIT = :NIT INTO :NOMTERC;
          else
            NOMTERC = '';
          if (ENTRADA = 'S') then
           BEGIN
            salidas = 0;
            SALDOFIN = SALDOFIN + ENTRADAS;
           END
          ELSE
           BEGIN
            ENTRADAS = 0;
            SALDOFIN = SALDOFIN - SALIDAS;
           END
          SUSPEND;
        END
      codant = :codigo;
    END
  END
ELSE
 BEGIN
  FOR
    SELECT ARTI_COD, ARTI_DES, ARTI_UNIDAD, A.GRUP_COD, A.SUBG_COD, A.MARC_COD, BODE_COD, BODE_NOM
      FROM ARTICULO A, BODEGA B
      WHERE ARTI_COD >= :CODINI AND ARTI_COD <= :CODFIN AND A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :GRPFIN AND
       ARTI_DES >= :DESINI AND ARTI_DES <= :DESFIN AND A.ESAR_COD <> 'I' AND ((SUCU_ID = :SUBEMPRESA) OR (:SUBEMPRESA = 0))
      INTO :CODIGO, :NOMBRE, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :CODBOD, :NOMBOD
      DO
        BEGIN
        SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
        SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
        SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
        EXECUTE PROCEDURE SALDO_INICIAL_INVENTARIO(CODIGO, FECINI, :CODBOD) returning_values (:SALDOINI);
        if (DETALLE = 'N') then
            BEGIN
            /* SUME LAS ENTRADAS */
            SELECT SUM(MVAR_CANT) FROM MOVIMIENTO_ARTICULO
              WHERE (MVAR_FECHA >= :FECINI) AND (MVAR_FECHA <= :FECFIN) AND
              (ARTI_COD = :CODIGO) AND (BODE_COD = :CODBOD) AND (MVAR_ENTRADA = 'S') INTO :ENTRADAS;
            if (ENTRADAS IS NULL) then
              ENTRADAS = 0;
            /* CALCULE LAS SALIDAS A COSTO PROMEDIO */
            SALIDAS = 0;
            SELECT SUM(MVAR_CANT)
                FROM MOVIMIENTO_ARTICULO
                WHERE (MVAR_FECHA >= :FECINI) AND (MVAR_FECHA <= :FECFIN) AND
                (ARTI_COD = :CODIGO) AND (BODE_COD = :CODBOD) AND (MVAR_ENTRADA = 'N')
                INTO :SALIDAS;
            if (SALIDAS IS NULL) then
              SALIDAS = 0;
            SALDOFIN = SALDOINI + ENTRADAS - SALIDAS;
            SUSPEND;
            END
        if (DETALLE = 'B') then
            BEGIN
            SALDOFIN = SALDOINI;
            FOR SELECT TIDO_NOMCORTO, MVAR_ENTRADA, MVAR_PREF, MVAR_NUMERO, MVAR_CANT, MVAR_CONC, MVAR_FECHA, M.TERC_NIT, MVAR_CONS
                FROM MOVIMIENTO_ARTICULO M, TIPO_DOCUMENTO TD
                WHERE TD.TIDO_COD = MVAR_TIPODOC AND (MVAR_FECHA >= :FECINI) AND (MVAR_FECHA <= :FECFIN) AND (ARTI_COD = :CODIGO) AND (BODE_COD = :CODBOD)
                ORDER BY MVAR_FECHA, MVAR_CONS
                INTO :TIPODOC, :ENTRADA, :PREFIJO, :NUMERO, :ENTRADAS, :CONCEPTO, :FECHA, :NIT, :CONS
                DO
                    BEGIN
                    if (nit is not null) then
                        SELECT TERC_NOM FROM TERCEROS WHERE TERC_NIT = :NIT INTO :NOMTERC;
                    else
                        NOMTERC = '';
                    if (ENTRADA = 'S') then
                        BEGIN
                        SALIDAS = 0;
                        SALDOFIN = SALDOFIN + ENTRADAS;
                        end
                    ELSE
                        BEGIN
                        SALIDAS = ENTRADAS;
                        ENTRADAS = 0;
                        SALDOFIN = SALDOFIN - SALIDAS;
                        END
                    SUSPEND;
                    END
            END
        END
  END
END

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE SALDO_INICIAL_TOTAL_INV(
    ARTICULO VARCHAR(15),
    FECHA DATE)
RETURNS (
    SALDO NUMERIC(18,4))
AS
DECLARE VARIABLE SALDO_BOD NUMERIC(15,4);
DECLARE VARIABLE BOD VARCHAR(2);
BEGIN
  SALDO = 0;
  FOR
    SELECT BODE_COD FROM BODEGA WHERE BODE_ACTIVA = 'S' INTO :BOD
  DO
    BEGIN
    EXECUTE PROCEDURE saldo_inicial_inventario(:ARTICULO, :FECHA, :BOD) RETURNING_VALUES :SALDO_BOD;
    SALDO = SALDO + SALDO_BOD;
    END
if (saldo is null) then
    SALDO = 0;
SUSPEND;
END

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE MOVIMIENTO_TOTAL_ARTICULO_MES(
    ARTICULO VARCHAR(15),
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    INICIAL NUMERIC(18,4),
    ENTRADA NUMERIC(18,4),
    SALIDA NUMERIC(18,4))
AS
declare variable BOD CHAR(2);
declare variable INI NUMERIC(15,4);
declare variable ENTC NUMERIC(15,4);
declare variable SALC NUMERIC(15,4);
BEGIN
  INICIAL = 0;
  ENTRADA = 0;
  SALIDA = 0;
  FOR SELECT BODE_COD FROM BODEGA INTO :BOD
  DO
    BEGIN
    EXECUTE PROCEDURE MOVIMIENTO_ARTICULO_MES(:ARTICULO, :FECINI, :FECFIN, :BOD) returning_values (INI, ENTC, SALC);
    INICIAL = INICIAL + INI;
    ENTRADA = ENTRADA + ENTC;
    SALIDA = SALIDA + SALC;
    END
  SUSPEND;
END

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE INVENTARIO_FAMILIA(
    FECHA DATE,
    FAMILIA VARCHAR(20))
RETURNS (
    ARTICULO VARCHAR(20),
    INTERNO VARCHAR(20),
    DESCRIPCION VARCHAR(60),
    CANTIDAD NUMERIC(18,2),
    UNIDAD VARCHAR(8),
    TOTAL NUMERIC(18,2))
AS
declare variable COSTO NUMERIC(18,4);
begin
FOR SELECT A.ARTI_COD, ARTI_DES, ARTI_UNIDAD, p.pvar_cod FROM ARTICULO A, PROVEEDOR_ARTICULO P
    WHERE ESAR_COD <> 'I' AND A.arti_cod = P.arti_cod AND P.terc_nit = :FAMILIA
    INTO :ARTICULO, :descripcion, :UNIDAD, :INTERNO
    DO
    BEGIN
    EXECUTE PROCEDURE SALDO_INICIAL_TOTAL_INV(ARTICULO, FECHA) returning_values (cantidad);
    EXECUTE PROCEDURE COSTO_PROMEDIO_UNIDAD(ARTICULO, FECHA, UNIDAD) returning_values (COSTO);
    TOTAL = COSTO * CANTIDAD;
    suspend;
    END
end

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE KARDEX_DESDE_HASTA(
    ARTICULO VARCHAR(15),
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    INICIAL_CANT NUMERIC(18,4),
    INICIAL_PESOS NUMERIC(18,2),
    ENT_CANT NUMERIC(18,4),
    ENT_PESOS NUMERIC(18,2),
    SAL_CANT NUMERIC(18,4),
    SAL_PESOS NUMERIC(18,2),
    FINAL_CANT NUMERIC(18,4),
    FINAL_PESOS NUMERIC(18,2))
AS
BEGIN
  EXECUTE PROCEDURE SALDO_INICIAL_TOTAL_INV(ARTICULO, FECINI) returning_values (INICIAL_CANT);
  EXECUTE PROCEDURE VALOR_INICIAL_INVENTARIO(ARTICULO, FECINI) returning_values (INICIAL_PESOS);
  SELECT SUM(COST_ENTC), SUM(COST_ENTP), SUM(COST_SALC), SUM(COST_SALP) FROM COSTOS
    WHERE (COST_FECHA >= :FECINI) AND (COST_FECHA <= :FECFIN) AND
          (ARTI_COD = :ARTICULO)
    INTO :ENT_CANT, :ENT_PESOS, :SAL_CANT, :SAL_PESOS;
  if (ENT_CANT IS NULL) then
    ENT_CANT = 0;
  if (ENT_PESOS IS NULL) then
    ENT_PESOS = 0;
  if (SAL_CANT IS NULL) then
    SAL_CANT = 0;
  if (SAL_PESOS IS NULL) then
    SAL_PESOS = 0;
  FINAL_CANT = INICIAL_CANT + ENT_CANT - SAL_CANT;
  FINAL_PESOS = INICIAL_PESOS + ENT_PESOS - SAL_PESOS;
  SUSPEND;
END

^

SET TERM ; ^

SET TERM ^ ;

CREATE or ALTER PROCEDURE REP_MOVIMIENTO_ARTICULO_DOC(
    FECINI DATE,
    FECFIN DATE,
    ARTINI VARCHAR(20),
    ARTFIN VARCHAR(20),
    GRPINI VARCHAR(2),
    GRPFIN VARCHAR(2),
    ORDEN CHAR(1))
RETURNS (
    CODIGO VARCHAR(15),
    NOMBRE VARCHAR(60),
    UNIDAD VARCHAR(8),
    CODGRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    CODSUBG VARCHAR(3),
    NOMSUBG VARCHAR(30),
    CODMARC VARCHAR(3),
    NOMMARC VARCHAR(30),
    SALDOINIC NUMERIC(18,4),
    SALDOINIP NUMERIC(18,4),
    ENTRADAC NUMERIC(18,4),
    ENTRADAP NUMERIC(18,4),
    SALIDAC NUMERIC(18,4),
    SALIDAP NUMERIC(18,4),
    COMPRASC NUMERIC(18,4),
    COMPRASP NUMERIC(18,4),
    DEVCOMPRAC NUMERIC(18,4),
    DEVCOMPRAP NUMERIC(18,4),
    VENTASC NUMERIC(18,4),
    VENTASP NUMERIC(18,4),
    DEVVENTAC NUMERIC(18,4),
    DEVVENTAP NUMERIC(18,4),
    REMIPROVC NUMERIC(18,4),
    REMIPROVP NUMERIC(18,4),
    REMICLIEC NUMERIC(18,4),
    REMICLIEP NUMERIC(18,4),
    SALDOFINC NUMERIC(18,4),
    SALDOFINP NUMERIC(18,4))
AS
declare variable CODINI VARCHAR(20);
declare variable CODFIN VARCHAR(20);
declare variable DESINI VARCHAR(20);
declare variable DESFIN VARCHAR(20);
BEGIN
if (ORDEN = 'C') then
    BEGIN
    CODINI = ARTINI;
    CODFIN = ARTFIN;
    DESINI = '';
    DESFIN = 'zz';
    END
ELSE
    BEGIN
    DESINI = ARTINI;
    DESFIN = ARTFIN;
    CODINI = '';
    CODFIN = 'zz';
    END

FOR SELECT ARTI_COD, ARTI_DES, ARTI_UNIDAD, A.GRUP_COD, A.SUBG_COD, A.MARC_COD
      FROM ARTICULO A
      WHERE ARTI_COD >= :CODINI AND ARTI_COD <= :CODFIN AND A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :GRPFIN AND
       ARTI_DES >= :DESINI AND ARTI_DES <= :DESFIN AND A.ESAR_COD <> 'I'
      INTO :CODIGO, :NOMBRE, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
      DO
        BEGIN
        SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
        SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
        SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
        EXECUTE PROCEDURE saldo_inicial_total_inv(CODIGO, FECINI) returning_values (:SALDOINIC);
        EXECUTE PROCEDURE valor_inicial_inventario(CODIGO, FECINI) returning_values (:saldoinip);
        SELECT SUM(MVAR_CANT), SUM(COST_ENTP) FROM MOVIMIENTO_ARTICULO M, COSTOS C
            WHERE (MVAR_FECHA >= :FECINI) AND (MVAR_FECHA <= :FECFIN) AND M.mvar_cons = C.cost_idmov AND M.mvar_tipodoc = 11 AND
            (M.ARTI_COD = :CODIGO) AND (MVAR_ENTRADA = 'S') INTO :ENTRADAC, :ENTRADAP;
        if (entradac IS NULL) then
            ENTRADAC = 0;
        if (entradap IS NULL) then
            entradap = 0;
        SELECT SUM(MVAR_CANT), SUM(COST_ENTP) FROM MOVIMIENTO_ARTICULO M, COSTOS C
            WHERE (MVAR_FECHA >= :FECINI) AND (MVAR_FECHA <= :FECFIN) AND M.mvar_cons = C.cost_idmov AND M.mvar_tipodoc = 21 AND
            (M.ARTI_COD = :CODIGO) AND (MVAR_ENTRADA = 'S') INTO :comprasc, :comprasp;
        if (comprasc IS NULL) then
            comprasc = 0;
        if (comprasp IS NULL) then
            comprasp = 0;
        SELECT SUM(MVAR_CANT), SUM(COST_ENTP) FROM MOVIMIENTO_ARTICULO M, COSTOS C
            WHERE (MVAR_FECHA >= :FECINI) AND (MVAR_FECHA <= :FECFIN) AND M.mvar_cons = C.cost_idmov AND M.mvar_tipodoc = 22 AND
            (M.ARTI_COD = :CODIGO) AND (MVAR_ENTRADA = 'S') INTO :remiprovc, :remiprovp;
        if (remiprovc IS NULL) then
            remiprovc = 0;
        if (remiprovp IS NULL) then
            remiprovp = 0;
        SELECT SUM(MVAR_CANT), SUM(COST_ENTP) FROM MOVIMIENTO_ARTICULO M, COSTOS C
            WHERE (MVAR_FECHA >= :FECINI) AND (MVAR_FECHA <= :FECFIN) AND M.mvar_cons = C.cost_idmov AND M.mvar_tipodoc = 33 AND
            (M.ARTI_COD = :CODIGO) AND (MVAR_ENTRADA = 'S') INTO :devventac, :devventap;
        if (devventac IS NULL) then
            devventac = 0;
        if (devventap IS NULL) then
            devventap = 0;
        /* CALCULE LAS SALIDAS A COSTO PROMEDIO */
        SELECT SUM(MVAR_CANT), SUM(COST_SALP)
            FROM MOVIMIENTO_ARTICULO M, COSTOS C
            WHERE (MVAR_FECHA >= :FECINI) AND (MVAR_FECHA <= :FECFIN) AND M.mvar_cons = C.cost_idmov AND M.mvar_tipodoc = 12 AND
            (M.ARTI_COD = :CODIGO) AND (MVAR_ENTRADA = 'N') INTO :salidac, :salidap;
        if (SALIDAC IS NULL) then
            SALIDAC = 0;
        if (SALIDAP IS NULL) then
            SALIDAP = 0;
        SELECT SUM(MVAR_CANT), SUM(COST_SALP)
            FROM MOVIMIENTO_ARTICULO M, COSTOS C
            WHERE (MVAR_FECHA >= :FECINI) AND (MVAR_FECHA <= :FECFIN) AND M.mvar_cons = C.cost_idmov AND M.mvar_tipodoc = 31 AND
            (M.ARTI_COD = :CODIGO) AND (MVAR_ENTRADA = 'N') INTO :ventasc, :ventasp;
        if (ventasc IS NULL) then
            VENTASC = 0;
        if (ventasp IS NULL) then
            VENTASP = 0;
        SELECT SUM(MVAR_CANT), SUM(COST_SALP)
            FROM MOVIMIENTO_ARTICULO M, COSTOS C
            WHERE (MVAR_FECHA >= :FECINI) AND (MVAR_FECHA <= :FECFIN) AND M.mvar_cons = C.cost_idmov AND M.mvar_tipodoc = 32 AND
            (M.ARTI_COD = :CODIGO) AND (MVAR_ENTRADA = 'N') INTO :remicliec, :remicliep;
        if (remicliec IS NULL) then
            remicliec = 0;
        if (remicliep IS NULL) then
            remicliep = 0;
        SELECT SUM(MVAR_CANT), SUM(COST_SALP)
            FROM MOVIMIENTO_ARTICULO M, COSTOS C
            WHERE (MVAR_FECHA >= :FECINI) AND (MVAR_FECHA <= :FECFIN) AND M.mvar_cons = C.cost_idmov AND M.mvar_tipodoc = 24 AND
            (M.ARTI_COD = :CODIGO) AND (MVAR_ENTRADA = 'N') INTO :devcomprac, :devcomprap;
        if (devcomprac IS NULL) then
            devcomprac = 0;
        if (devcomprap IS NULL) then
            devcomprap = 0;
        SALDOFINC = SALDOINIC + entradac + comprasc + remiprovc + devventac - salidac - ventasc - remicliec - devcomprac;
        saldofinp = SALDOINIP + entradap + comprasp + remiprovp + devventap - salidap - ventasp - remicliep - devcomprap;
        SUSPEND;
        END
END

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE MOVIMIENTO_INVENTARIO_MES(
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    CODIGO VARCHAR(15),
    DESCRIPCION VARCHAR(60),
    CODGRP VARCHAR(2),
    CODSUBG VARCHAR(3),
    CODMARCA VARCHAR(3),
    UNIDAD VARCHAR(8),
    IVA NUMERIC(9,2),
    INICIAL NUMERIC(18,2),
    ENTRADA NUMERIC(18,2),
    SALIDA NUMERIC(18,2),
    FINAL NUMERIC(18,2))
AS
BEGIN
  for select arti_cod, arti_des, GRUP_COD, SUBG_COD, MARC_COD, ARTI_UNIDAD, TAIV_PORC
    from articulo A, tarifa_iva T where A.taiv_cod = T.taiv_cod AND substring(arti_cod from 1 FOR 2) <> '.t' AND ARTI_EXIST <> 'N'
    into :CODIGO, :DESCRIPCION, :CODGRP, :CODSUBG, :codmarca, :UNIDAD, :IVA
  DO
    BEGIN
    EXECUTE PROCEDURE MOVIMIENTO_TOTAL_ARTICULO_MES(CODIGO, FECINI, FECFIN) returning_values (:INICIAL, :ENTRADA, :SALIDA);
    FINAL = INICIAL + ENTRADA - SALIDA;
    SUSPEND;
    END
END

^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure SUME_EXISTENCIA (
    ARTICULO varchar(15),
    BODEGA varchar(2),
    FECHA date,
    CANTIDAD numeric(18,4),
    ANULAR char(1))
AS
DECLARE VARIABLE existe INTEGER;
DECLARE VARIABLE saldo NUMERIC(15,4);
DECLARE VARIABLE exart CHAR(1);
declare variable sumar integer;
BEGIN
  if (ANULAR = 'S') then
    sumar = -1;
  else
    sumar = 1;
  /* Verfique si el artículo tiene control de existencias */
  SELECT arti_exist FROM articulo WHERE arti_cod = :articulo
    INTO :exart;
  IF (exart <> 'N') THEN
    BEGIN
    /*  Si en EXISTENCIA existe el registro articulo-bodega-fecha le suma
        a las entradas la cantidad, si no, crea un nuevo registro       */
    IF (NOT exists (SELECT EXIS_FECHA FROM EXISTENCIA WHERE (arti_cod = :articulo) AND
        (bode_cod = :bodega) AND (exis_fecha = :fecha))) THEN
      BEGIN
      /*  No existe movimiento en esa fecha, traiga el saldo anterior y
          registre uno nuevo */
      EXECUTE PROCEDURE saldo_inventario(:articulo, :bodega, :fecha)
        RETURNING_VALUES :saldo;
      INSERT INTO existencia (arti_cod, bode_cod, exis_fecha,
        exis_entr, exis_sal, exis_saldo)
        VALUES (:articulo, :bodega, :fecha, (:cantidad * :sumar), 0, :saldo);
      END /* if NO existe */
    ELSE
      BEGIN
      /* Ya existe un registro en la fecha */
      UPDATE EXISTENCIA
          SET exis_entr = exis_entr + (:cantidad * :sumar)
          WHERE (arti_cod = :articulo) AND 
            (bode_cod = :bodega) AND (exis_fecha = :fecha);
      END
    /*  Recorra los registros de fechas posteriores actualizando el saldo
        anterior */
    UPDATE existencia
        SET exis_saldo = exis_saldo + (:cantidad * :sumar)
        WHERE (arti_cod = :articulo) AND
        (bode_cod = :bodega) AND (exis_fecha > :fecha);
    END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure RESTE_EXISTENCIA (
    ARTICULO varchar(15),
    BODEGA varchar(2),
    FECHA date,
    CANTIDAD numeric(18,4),
    ANULAR char(1))
AS
DECLARE VARIABLE saldo NUMERIC(15,4);
DECLARE VARIABLE exart CHAR(1);
declare variable sumar integer;
BEGIN
  if (ANULAR = 'S') then
    sumar = -1;
  else
    sumar = 1;
  /* Verfique si el artículo tiene control de existencias */
  SELECT arti_exist FROM articulo WHERE arti_cod = :articulo
    INTO :exart;
  IF (exart <> 'N') THEN
    BEGIN
    /*  Si en EXISTENCIA existe el registro articulo-bodega-fecha le suma
        a las salidas la cantidad, si no, crea un nuevo registro       */
    IF (NOT exists (SELECT EXIS_FECHA FROM EXISTENCIA WHERE (arti_cod = :articulo) AND
        (bode_cod = :bodega) AND (exis_fecha = :fecha))) THEN
      BEGIN
      /*  No existe movimiento en esa fecha, traiga el saldo anterior y
          registre uno nuevo */
      EXECUTE PROCEDURE saldo_inventario(:articulo, :bodega, :fecha)
        RETURNING_VALUES :saldo;
      INSERT INTO existencia (arti_cod, bode_cod, exis_fecha,
          exis_entr, exis_sal, exis_saldo)
          VALUES (:articulo, :bodega, :fecha, 0, (:cantidad * :sumar), :saldo);
      END /* if existe */
    ELSE
      BEGIN
      /* Ya existe un registro en la fecha */
      UPDATE EXISTENCIA
          SET exis_sal = exis_sal + (:cantidad * :sumar)
          WHERE (arti_cod = :articulo) AND 
            (bode_cod = :bodega) AND (exis_fecha = :fecha);
      END
    /*  Recorra los registros de fechas posteriores actualizando el saldo
        anterior */
    UPDATE existencia
        SET exis_saldo = exis_saldo - (:cantidad * :sumar)
        WHERE (arti_cod = :articulo) AND
        (bode_cod = :bodega) AND (exis_fecha > :fecha);
    END
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE CHEQUEO_INVENTARIO(
    ARTINI VARCHAR(20),
    ARTFIN VARCHAR(20))
AS
DECLARE VARIABLE FECHA DATE;
DECLARE VARIABLE CANT NUMERIC(15,4);
DECLARE VARIABLE COSTO NUMERIC(18,2);
DECLARE VARIABLE ENTRADA CHAR(1);
DECLARE VARIABLE BODEGA CHAR(2);
DECLARE VARIABLE ID INTEGER;
DECLARE VARIABLE TIPO INTEGER;
declare variable TIPOEX CHAR(1);
DECLARE VARIABLE LOTE VARCHAR(20);
DECLARE VARIABLE EXISTE INTEGER;
declare variable ARTICULO VARCHAR(20);
declare variable IDL INTEGER;
BEGIN
for select arti_cod from articulo where arti_cod >= :artini and arti_cod <= :artfin into :ARTICULO
  DO
  BEGIN
  DELETE FROM existencia_lote where arti_cod = :articulo;
  DELETE FROM lotes where arti_cod = :articulo;
  delete from costos where arti_cod = :ARTICULO;
  delete from existencia WHERE ARTI_COD = :ARTICULO;
  for select mvar_cons, mvar_fecha, mvar_cant, mvar_costo, mvar_entrada, bode_cod, mvar_tipodoc, mvar_lote
    from movimiento_articulo WHERE ARTI_COD = :ARTICULO
    order by mvar_fecha, mvar_cons
    into :id, :fecha, :cant, :costo, :entrada, :bodega, :tipo, :lote
  do
    begin
    SELECT ARTI_EXIST
        FROM   ARTICULO
        WHERE  ARTICULO.ARTI_COD = :ARTICULO
        INTO :TIPOEX;
    if ((TIPO <> 13)) then
        EXECUTE PROCEDURE actualice_costo(:ARTICULO, :fecha, :costo, :cant, :entrada, 'N', :id, :tipo);
    /* actualice existencias */
    if (:entrada = 'S') then
        begin
        execute procedure sume_existencia(:articulo, :bodega, :fecha, :cant, 'N');
        if (TIPOEX = 'L') then
            begin
            SELECT COUNT(*) FROM LOTES WHERE ARTI_COD = :ARTICULO AND BODE_COD = :BODEGA AND LOTE_NRO = :lote INTO :EXISTE;
            if (EXISTE > 0) then
                UPDATE LOTES
                    set lote_saldo = lote_saldo + :cant
                    where (arti_cod = :ARTICULO) and (BODE_COD = :BODEGA) AND (lote_nro = :lote);
            ELSE
                INSERT INTO LOTES (ARTI_COD, BODE_COD, LOTE_NRO, LOTE_FECHA, LOTE_CANT, LOTE_COSTO, LOTE_SALDO)
                    VALUES (:ARTICULO, :bodega, :lote, :fecha, :cant, :costo, :cant);
            end
        end
    else
        begin
        execute procedure reste_existencia(:articulo, :bodega, :fecha, :cant, 'N');
        if (TIPOEX = 'L') then
            begin
            SELECT COUNT(*) FROM LOTES WHERE ARTI_COD = :ARTICULO AND BODE_COD = :BODEGA AND LOTE_NRO = :lote INTO :EXISTE;
            if (EXISTE > 0) then
                UPDATE LOTES
                    set lote_saldo = lote_saldo - :cant
                    where (arti_cod = :ARTICULO) AND (BODE_COD = :BODEGA) and (lote_nro = :lote);
            ELSE
                BEGIN
                /* ARREGLE EL LOTE YA QUE NO EXISTE */
                SELECT MIN(LOTE_ID) FROM LOTES WHERE ARTI_COD = :articulo AND BODE_COD = :BODEGA AND LOTE_SALDO >= :cant INTO :IDL;
                SELECT LOTE_NRO FROM LOTES WHERE LOTE_ID = :IDL INTO :LOTE;
                UPDATE MOVIMIENTO_ARTICULO SET MVAR_LOTE = :LOTE WHERE MVAR_CONS = :ID;
                UPDATE LOTES
                    set lote_saldo = lote_saldo - :cant
                    where (arti_cod = :ARTICULO) and (BODE_COD = :BODEGA) AND (lote_nro = :lote);
                END
            SELECT COUNT(*) FROM EXISTENCIA_LOTE
                WHERE LOTE_NRO = :LOTE AND EXLO_FECHA = :FECHA AND ARTI_COD = :ARTICULO AND BODE_COD = :bodega
                INTO :EXISTE;
            if (EXISTE > 0) then
                UPDATE EXISTENCIA_LOTE
                       SET EXLO_SAL = EXLO_SAL + :cant
                    WHERE LOTE_NRO = :LOTE AND EXLO_FECHA = :FECHA AND ARTI_COD = :ARTICULO AND BODE_COD = :bodega;
            else
                INSERT INTO EXISTENCIA_LOTE (ARTI_COD, BODE_COD, LOTE_NRO, EXLO_FECHA, EXLO_SAL)
                    VALUES (:ARTICULO, :BODEGA, :LOTE, :FECHA, :CANT);
            end
        end
    END
  END
END

^

SET TERM ; ^

SET TERM ^ ;

ALTER TRIGGER MOVIMIENTO_ARTICULO_AD
AS
declare variable LOTE CHAR(1);
declare variable ensamble char(1);
BEGIN
  /* INSERTE EL NUEVO LOTE */
  SELECT ARTI_EXIST
    FROM   ARTICULO
    WHERE  ARTICULO.ARTI_COD = OLD.ARTI_COD
    INTO :LOTE;
  /* BORRE LOS VIEJOS */
  if (old.mvar_tipodoc <> 13) then
      BEGIN
      EXECUTE PROCEDURE actualice_costo(old.arti_cod, old.mvar_fecha, old.mvar_costo, old.mvar_cant, old.mvar_entrada, 'S', OLD.mvar_cons, OLD.mvar_tipodoc);
      if (OLD.mvar_entrada = 'S') then
          EXECUTE PROCEDURE chequeo_costos(old.arti_cod, old.mvar_fecha-1); /* PARA OBLIGAR A RECALCULAR LOS MOV. DEL MISMO DIA */
      else
          EXECUTE PROCEDURE chequeo_costos(old.arti_cod, old.mvar_fecha);
      END
  /* actualice existencias */
  if (old.mvar_entrada = 'S') then
    BEGIN
    execute procedure sume_existencia(old.arti_cod, old.bode_cod, old.mvar_fecha, old.mvar_cant, 'S');
    if (LOTE = 'L') then
        UPDATE LOTES
            set lote_saldo = lote_saldo - old.mvar_cant
            where (arti_cod = old.ARTI_COD) and (bode_cod = old.bode_cod) and (lote_nro = old.mvar_lote);
    END
  else
    BEGIN
    SELECT ARTI_ENSAMBLE FROM ARTICULO WHERE ARTI_COD = old.arti_cod INTO :ensamble;
    if (ENSAMBLE = 'S') then
        delete from ensambles where ensa_tiporef = old.mvar_tipodoc and ensa_idref = old.mvar_idref;

    execute procedure reste_existencia(old.arti_cod, old.bode_cod, old.mvar_fecha, old.mvar_cant, 'S');
    if (LOTE = 'L') then
        UPDATE LOTES
            set lote_saldo = lote_saldo + old.mvar_cant
            where (arti_cod = old.ARTI_COD) and (bode_cod = old.bode_cod) and (lote_nro = old.mvar_lote);
    END
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER TRIGGER MOVIMIENTO_ARTICULO_AI
AS
declare variable EXISTE CHAR(1);
declare variable LOTE CHAR(1);
BEGIN
  /* INSERTE EL NUEVO LOTE */
  SELECT ARTI_EXIST FROM ARTICULO WHERE ARTICULO.ARTI_COD = NEW.ARTI_COD INTO :LOTE;
  /* ACTUALICE COSTOS cuando no es transferencia */
  if (new.mvar_tipodoc <> 13) then
      BEGIN
      EXECUTE PROCEDURE actualice_costo(new.arti_cod, new.mvar_fecha, new.mvar_costo, new.mvar_cant, new.mvar_entrada, 'N', new.mvar_cons, new.mvar_tipodoc);
      EXECUTE PROCEDURE chequeo_costos(NEW.arti_cod, NEW.mvar_fecha);
      END
  /* actualice existencias */
  if (new.mvar_entrada = 'S') then
    BEGIN
    execute procedure sume_existencia(new.arti_cod, new.bode_cod, new.mvar_fecha, new.mvar_cant, 'N');
    if (LOTE = 'L') then
        BEGIN
        if (NEW.MVAR_LOTE IS NULL) then
            EXCEPTION LOTE_OBLIGATORIO 'Debe especificar un número de lote para el articulo ' || new.arti_cod;
        ELSE
         BEGIN
         EXISTE = 'N';
         SELECT 'S' FROM LOTES WHERE ARTI_COD = NEW.ARTI_COD AND BODE_COD = NEW.bode_cod AND LOTE_NRO = new.mvar_lote INTO :EXISTE;
         if (EXISTE = 'S') then
            UPDATE LOTES
             set lote_saldo = lote_saldo + new.mvar_cant
              where (arti_cod = NEW.ARTI_COD) and (BODE_COD = NEW.bode_cod) and (lote_nro = new.mvar_lote);
         ELSE
            INSERT INTO LOTES (ARTI_COD, BODE_COD, LOTE_NRO, LOTE_FECHA, LOTE_CANT, LOTE_COSTO, LOTE_SALDO)
                VALUES (NEW.ARTI_COD, NEW.bode_cod, NEW.mvar_lote, NEW.mvar_fecha, NEW.mvar_cant, NEW.mvar_costo, NEW.mvar_cant);
         END
        END
    END
  else
    BEGIN
    execute procedure reste_existencia(new.arti_cod, new.bode_cod, new.mvar_fecha, new.mvar_cant, 'N');
    /* ACTUALICE LA EXISTENCIA DEL LOTE */
    if (LOTE = 'L') then
    if (NEW.mvar_lote IS NULL) then
        EXCEPTION LOTE_NEGATIVO 'Debe indicar un número de lote para el artículo ' || new.arti_cod;
    ELSE
        BEGIN
        /* Actualice el saldo historico del lote */
        EXISTE = 'N';
        SELECT 'S' FROM EXISTENCIA_LOTE WHERE LOTE_NRO = NEW.MVAR_LOTE AND EXLO_FECHA = NEW.MVAR_FECHA AND ARTI_COD = NEW.arti_cod AND BODE_COD = NEW.bode_cod INTO :EXISTE;
        if (EXISTE = 'S') then
            BEGIN
            UPDATE EXISTENCIA_LOTE
                SET EXLO_SAL = EXLO_SAL + NEW.mvar_cant
                WHERE LOTE_NRO = NEW.MVAR_LOTE AND EXLO_FECHA = NEW.MVAR_FECHA AND ARTI_COD = NEW.ARTI_COD AND BODE_COD = NEW.bode_cod;
            END
        ELSE
            BEGIN
            INSERT INTO EXISTENCIA_LOTE (ARTI_COD, BODE_COD, LOTE_NRO, EXLO_FECHA, EXLO_SAL)
                VALUES (NEW.ARTI_COD, NEW.bode_cod, NEW.MVAR_LOTE, NEW.MVAR_FECHA, NEW.MVAR_CANT);
            END
        UPDATE LOTES
            set lote_saldo = lote_saldo - new.mvar_cant
            where (arti_cod = NEW.ARTI_COD) and (BODE_COD = NEW.bode_cod) and (lote_nro = new.mvar_lote);
        END
    END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure CHEQUEO_INVENTARIO (
    ARTINI varchar(20),
    ARTFIN varchar(20))
AS
DECLARE VARIABLE FECHA DATE;
DECLARE VARIABLE CANT NUMERIC(15,4);
DECLARE VARIABLE COSTO NUMERIC(18,2);
DECLARE VARIABLE ENTRADA CHAR(1);
DECLARE VARIABLE BODEGA CHAR(2);
DECLARE VARIABLE ID INTEGER;
DECLARE VARIABLE TIPO INTEGER;
declare variable TIPOEX CHAR(1);
DECLARE VARIABLE LOTE VARCHAR(20);
declare variable ARTICULO VARCHAR(20);
declare variable IDL INTEGER;
BEGIN
for select arti_cod from articulo where arti_cod >= :artini and arti_cod <= :artfin into :ARTICULO
  DO
  BEGIN
  DELETE FROM existencia_lote where arti_cod = :articulo;
  DELETE FROM lotes where arti_cod = :articulo;
  delete from costos where arti_cod = :ARTICULO;
  delete from existencia WHERE ARTI_COD = :ARTICULO;
  for select mvar_cons, mvar_fecha, mvar_cant, mvar_costo, mvar_entrada, bode_cod, mvar_tipodoc, mvar_lote
    from movimiento_articulo WHERE ARTI_COD = :ARTICULO
    order by mvar_fecha, mvar_cons
    into :id, :fecha, :cant, :costo, :entrada, :bodega, :tipo, :lote
  do
    begin
    SELECT ARTI_EXIST
        FROM   ARTICULO
        WHERE  ARTICULO.ARTI_COD = :ARTICULO
        INTO :TIPOEX;
    if ((TIPO <> 13)) then
        EXECUTE PROCEDURE actualice_costo(:ARTICULO, :fecha, :costo, :cant, :entrada, 'N', :id, :tipo);
    /* actualice existencias */
    if (:entrada = 'S') then
        begin
        execute procedure sume_existencia(:articulo, :bodega, :fecha, :cant, 'N');
        if (TIPOEX = 'L') then
            begin
            if (EXISTS (SELECT LOTE_NRO FROM LOTES WHERE ARTI_COD = :ARTICULO AND BODE_COD = :BODEGA AND LOTE_NRO = :lote)) then
                UPDATE LOTES
                    set lote_saldo = lote_saldo + :cant
                    where (arti_cod = :ARTICULO) and (BODE_COD = :BODEGA) AND (lote_nro = :lote);
            ELSE
                INSERT INTO LOTES (ARTI_COD, BODE_COD, LOTE_NRO, LOTE_FECHA, LOTE_CANT, LOTE_COSTO, LOTE_SALDO)
                    VALUES (:ARTICULO, :bodega, :lote, :fecha, :cant, :costo, :cant);
            end
        end
    else
        begin
        execute procedure reste_existencia(:articulo, :bodega, :fecha, :cant, 'N');
        if (TIPOEX = 'L') then
            begin
            if (EXISTS (SELECT LOTE_NRO FROM LOTES WHERE ARTI_COD = :ARTICULO AND BODE_COD = :BODEGA AND LOTE_NRO = :lote)) then
                UPDATE LOTES
                    set lote_saldo = lote_saldo - :cant
                    where (arti_cod = :ARTICULO) AND (BODE_COD = :BODEGA) and (lote_nro = :lote);
            ELSE
                BEGIN
                /* ARREGLE EL LOTE YA QUE NO EXISTE */
                SELECT MIN(LOTE_ID) FROM LOTES WHERE ARTI_COD = :articulo AND BODE_COD = :BODEGA AND LOTE_SALDO >= :cant INTO :IDL;
                SELECT LOTE_NRO FROM LOTES WHERE LOTE_ID = :IDL INTO :LOTE;
                UPDATE MOVIMIENTO_ARTICULO SET MVAR_LOTE = :LOTE WHERE MVAR_CONS = :ID;
                UPDATE LOTES
                    set lote_saldo = lote_saldo - :cant
                    where (arti_cod = :ARTICULO) and (BODE_COD = :BODEGA) AND (lote_nro = :lote);
                END
            if (EXISTS (SELECT EXLO_FECHA FROM EXISTENCIA_LOTE WHERE LOTE_NRO = :LOTE AND EXLO_FECHA = :FECHA
                AND ARTI_COD = :ARTICULO AND BODE_COD = :bodega)) then
                UPDATE EXISTENCIA_LOTE
                       SET EXLO_SAL = EXLO_SAL + :cant
                    WHERE LOTE_NRO = :LOTE AND EXLO_FECHA = :FECHA AND ARTI_COD = :ARTICULO AND BODE_COD = :bodega;
            else
                INSERT INTO EXISTENCIA_LOTE (ARTI_COD, BODE_COD, LOTE_NRO, EXLO_FECHA, EXLO_SAL)
                    VALUES (:ARTICULO, :BODEGA, :LOTE, :FECHA, :CANT);
            end
        end
    END
  END
END
^

SET TERM ; ^

SET TERM ^ ;

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

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

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

SET TERM ; ^

SET TERM ^ ;

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

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure REP_MOVIMIENTO_X_ARTICULO (
    DETALLE char(1),
    FECINI date,
    FECFIN date,
    ARTINI varchar(20),
    ARTFIN varchar(20),
    GRPINI varchar(2),
    GRPFIN varchar(2),
    ORDEN char(1),
    SUBEMPRESA integer)
returns (
    CODIGO varchar(15),
    NOMBRE varchar(60),
    UNIDAD varchar(8),
    CODGRUPO varchar(2),
    NOMGRUPO varchar(30),
    CODSUBG varchar(3),
    NOMSUBG varchar(30),
    CODMARC varchar(3),
    NOMMARC varchar(30),
    CODBOD varchar(2),
    NOMBOD varchar(30),
    SALDOINI numeric(18,4),
    ENTRADAS numeric(18,4),
    SALIDAS numeric(18,4),
    SALDOFIN numeric(18,4),
    TIPODOC varchar(8),
    PREFIJO varchar(4),
    NUMERO varchar(6),
    FECHA date,
    CONCEPTO varchar(60),
    LOTE varchar(15),
    LO_VENCE date,
    NIT varchar(20),
    NOMTERC varchar(60),
    CONS integer)
AS
declare variable ENTRADA CHAR(1);
declare variable CODINI VARCHAR(20);
declare variable CODant VARCHAR(15) CHARACTER SET NONE;
declare variable CODFIN VARCHAR(20);
declare variable DESINI VARCHAR(20);
declare variable DESFIN VARCHAR(20);
BEGIN
if (ORDEN = 'C') then
    BEGIN
    CODINI = ARTINI;
    CODFIN = ARTFIN;
    DESINI = '';
    DESFIN = 'zz';
    END
ELSE
    BEGIN
    DESINI = ARTINI;
    DESFIN = ARTFIN;
    CODINI = '';
    CODFIN = 'zz';
    END

if (DETALLE = 'L') then
  BEGIN
   codant = 0;
   for SELECT A.ARTI_COD, ARTI_DES, ARTI_UNIDAD, A.GRUP_COD, A.SUBG_COD, A.MARC_COD, LOTE_NRO,LOTE_VENCE, BODE_COD
     FROM ARTICULO A, LOTES L
     WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :GRPFIN AND
       ARTI_DES >= :DESINI AND ARTI_DES <= :DESFIN AND A.ESAR_COD <> 'I' AND a.arti_cod = l.arti_cod
     INTO :CODIGO, :NOMBRE, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :LOTE, :LO_VENCE, :codbod
     DO
     BEGIN
      SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
      SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
      SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
      SELECT BODE_NOM FROM BODEGA WHERE BODE_COD = :codbod INTO nombod;

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

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

SET TERM ; ^

/* CAMBIABA EL ITEM DE COSTOS AL ACTUALIZAR  */

DROP TRIGGER COSTOS_BU;

SET TERM ^ ;

CREATE OR ALTER procedure COSTO_PROMEDIO (
    ARTICULO varchar(15),
    FECHA date)
returns (
    COSTOP numeric(18,2))
AS
declare variable saldop numeric(18,2);
declare variable saldoc numeric(15,4);
declare variable entp numeric(18,2);
declare variable entc numeric(15,4);
BEGIN
SELECT first 1 COST_SALDOP, COST_ENTP,COST_SALDOC, COST_ENTC FROM COSTOS
    WHERE (ARTI_COD = :ARTICULO) AND (COST_FECHA <= :FECHA)
    order by ARTI_COD DESC, COST_FECHA DESC, cost_item desc
    INTO :SALDOP, ENTP, :SALDOC, ENTC;
IF (SALDOC IS NULL) THEN
    COSTOP = 0;
ELSE
    if ((SALDOC < 0) AND (SALDOC+ENTC > 0)) then
        COSTOP = ENTP/ENTC;
    else
        /* Cuando hay existencia calcule el promedio, de otra manera retorne el ultimo */
        if (SALDOC+ENTC > 0) then
            COSTOP = (SALDOP+ENTP) / (SALDOC+ENTC);
        else
            COSTOP = 0;
SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE COSTO_EN_VENTAS(
    TIPO INTEGER,
    ID INTEGER)
AS
declare variable FECHA DATE;
declare variable ARTICULO VARCHAR(20);
declare variable CANTIDAD NUMERIC(18,4);
declare variable COSTO NUMERIC(18,2);
declare variable CTACOSTO VARCHAR(20);
declare variable CTAINVEN VARCHAR(20);
BEGIN
DELETE FROM COSTO_VENTAS WHERE TIDO_COD = :TIPO AND COVE_ID = :ID;
if (TIPO = 31) then
    BEGIN
    /* FACTURA DE VENTA */
    FOR SELECT D.ARTI_COD, FADE_CANT * FADE_FACTOR, FACT_FECHA
        FROM ARTICULO A, FACTURAS F, FACTURAS_DETALLE D
        WHERE F.FACT_ID = D.FACT_ID AND A.ARTI_COD = D.ARTI_COD AND F.FACT_ID = :ID AND FACT_ANULADO = 'N'
        INTO :ARTICULO, :CANTIDAD, :FECHA
        DO
        BEGIN
        SELECT COAR_CTACOS, COAR_CTAINV FROM CONTABIL_ARTICULO WHERE ARTI_COD = :articulo INTO :CTACOSTO, :CTAINVEN;
        EXECUTE PROCEDURE COSTO_PROMEDIO(:ARTICULO, :FECHA) returning_values (:COSTO);
        INSERT INTO COSTO_VENTAS (TIDO_COD, COVE_ID, ARTI_COD, CANT, COSTO,  CTACOS, CTAINV)
            VALUES (:TIPO, :ID, :ARTICULO, :CANTIDAD, :COSTO, :CTACOSTO, :CTAINVEN);
        END
    END
if (TIPO = 32) then
    BEGIN
    /* REMISION */
    FOR SELECT D.ARTI_COD, RVDE_CANT * RVDE_FACTOR, REVT_FECHA
        FROM ARTICULO A, REMISIONES_VENTA R, REMISIONES_VENTA_DETALLE D
        WHERE R.REVT_ID = D.REVT_ID AND A.ARTI_COD = D.ARTI_COD AND R.REVT_ID = :ID AND REVT_ANULADO = 'N'
        INTO :ARTICULO, :CANTIDAD, :FECHA
        DO
        BEGIN
        SELECT COAR_CTACOS, COAR_CTAINV FROM CONTABIL_ARTICULO WHERE ARTI_COD = :articulo INTO :CTACOSTO, :CTAINVEN;
        EXECUTE PROCEDURE COSTO_PROMEDIO(:ARTICULO, :FECHA) returning_values (:COSTO);
        INSERT INTO COSTO_VENTAS (TIDO_COD, COVE_ID, ARTI_COD, CANT, COSTO,  CTACOS, CTAINV)
            VALUES (:TIPO, :ID, :ARTICULO, :CANTIDAD, :COSTO, :CTACOSTO, :CTAINVEN);
        END
    END
if (TIPO = 33) then
    BEGIN
    /* DEVOLUCION */
    FOR SELECT D.ARTI_COD, DVDE_CANT * DVDE_FACTOR, DEVT_FECHA
        FROM ARTICULO A, DEVOLUCIONES_VENTAS DV, DEVOLUCIONES_VENTAS_DETALLE D
        WHERE DV.DEVT_ID = D.DEVT_ID AND A.ARTI_COD = D.ARTI_COD AND DV.DEVT_ID = :ID AND DEVT_ANULADO = 'N'
        INTO :ARTICULO, :CANTIDAD, :FECHA
        DO
        BEGIN
        SELECT COAR_CTACOS, COAR_CTAINV FROM CONTABIL_ARTICULO WHERE ARTI_COD = :articulo INTO :CTACOSTO, :CTAINVEN;
        EXECUTE PROCEDURE COSTO_PROMEDIO(:ARTICULO, :FECHA) returning_values (:COSTO);
        INSERT INTO COSTO_VENTAS (TIDO_COD, COVE_ID, ARTI_COD, CANT, COSTO,  CTACOS, CTAINV)
            VALUES (:TIPO, :ID, :ARTICULO, :CANTIDAD, :COSTO, :CTACOSTO, :CTAINVEN);
        END
    END
END

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE COSTO_EN_VENTAS_CONTADO(
    FECFAC DATE,
    PREF VARCHAR(4),
    PTVTA INTEGER)
AS
declare variable ARTICULO VARCHAR(20);
declare variable CANTIDAD NUMERIC(18,4);
declare variable COSTO NUMERIC(18,2);
declare variable CTACOSTO VARCHAR(20);
declare variable CTAINVEN VARCHAR(20);
BEGIN
DELETE FROM COSTO_VENTAS WHERE TIDO_COD = 31 AND COVE_ID = 0;
    /* FACTURA DE VENTA */
    FOR SELECT MAX(D.ARTI_COD), SUM(FADE_CANT * FADE_FACTOR), MAX(COAR_CTACOS), MAX(COAR_CTAINV)
        FROM ARTICULO A, FACTURAS F, FACTURAS_DETALLE D, CONTABIL_ARTICULO C
        WHERE F.FACT_ID = D.FACT_ID AND A.ARTI_COD = D.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND FACT_ANULADO = 'N' AND FACT_FECHA = :FECFAC AND F.PREF_PRE = :PREF AND F.PTVT_ID = :PTVTA and substring(a.arti_cod from 1 FOR 2) <> '.t'
        GROUP BY D.ARTI_COD
        INTO :ARTICULO, :CANTIDAD, :CTACOSTO, :CTAINVEN
        DO
        BEGIN
        EXECUTE PROCEDURE COSTO_PROMEDIO(:ARTICULO, :FECFAC) returning_values (:COSTO);
        INSERT INTO COSTO_VENTAS (TIDO_COD, COVE_ID, ARTI_COD, CANT, COSTO,  CTACOS, CTAINV)
            VALUES (31, 0, :ARTICULO, :CANTIDAD, :COSTO * :CANTIDAD, :CTACOSTO, :CTAINVEN);
        END
END

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE COSTO_PROMEDIO_UNIDAD(
    ARTICULO VARCHAR(15),
    FECHA DATE,
    UNIDAD VARCHAR(8))
RETURNS (
    COSTO NUMERIC(18,2))
AS
declare variable FACTOR NUMERIC(15,4);
BEGIN
  EXECUTE PROCEDURE COSTO_PROMEDIO(ARTICULO, FECHA) returning_values (COSTO);
  EXECUTE PROCEDURE FACTOR_UNIDAD_CANT(ARTICULO, UNIDAD) returning_values (FACTOR);
  COSTO = COSTO * FACTOR;
  SUSPEND;
END

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE IMPR_AJUSTE(
    ID INTEGER)
RETURNS (
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    CONCEPTO VARCHAR(60),
    CODBODEGA VARCHAR(2),
    NOMBODEGA VARCHAR(30),
    OBS BLOB SUB_TYPE 1 SEGMENT SIZE 80,
    AJUSTAR CHAR(2),
    STAND VARCHAR(20),
    ITEM INTEGER,
    ARTICULO VARCHAR(15),
    CODBAR VARCHAR(15),
    ARTIDES VARCHAR(60),
    EXANT NUMERIC(18,4),
    EXNUE NUMERIC(18,4),
    CANT NUMERIC(18,4),
    UNIDAD VARCHAR(8),
    BODITEM VARCHAR(2),
    LOTE VARCHAR(15),
    COSTO NUMERIC(18,2),
    TOTAL NUMERIC(18,2))
AS
BEGIN
  /*  */
  SELECT PREF_PRE, AJUS_NUMERO, AJUS_FECHA, AJUS_CONC, A.BODE_COD, BODE_NOM, AJUS_OBS, AJUS_NOAJUSTAR, AJUS_STAND
    FROM AJUSTES A, BODEGA B WHERE A.BODE_COD = B.BODE_COD AND A.AJUS_ID = :ID into
    :PREF, :NUMERO, :FECHA, :CONCEPTO, :CODBODEGA, :NOMBODEGA, :OBS, :AJUSTAR, :STAND;
  if (AJUSTAR = 'S') then
    AJUSTAR = 'NO';
  else
    AJUSTAR = 'SI';
  FOR SELECT AJUS_ITEM, A.ARTI_COD, AJUS_CODBAR, AJDE_DESC, AJUS_EXANT, AJUS_UNIDAD, BODE_COD, AJUS_EXNUE, AJUS_LOTE
    FROM AJUSTES_DETALLE D, ARTICULO A
    WHERE D.ARTI_COD = A.ARTI_COD AND D.AJUS_ID = :ID
    ORDER BY AJUS_ITEM
    INTO :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :EXANT, :UNIDAD, :BODITEM, :EXNUE, :LOTE
    DO
      BEGIN
      EXECUTE PROCEDURE COSTO_PROMEDIO(:ARTICULO, :FECHA) returning_values (:COSTO);
      CANT = EXNUE - EXANT;
      TOTAL = CANT * COSTO;
      SUSPEND;
      END
END

^

SET TERM ; ^

SET TERM ^ ;

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

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE REP_ABC_INVENTARIO(
    FECHA DATE,
    ARTINI VARCHAR(20),
    ARTFIN VARCHAR(20),
    GRPINI VARCHAR(3),
    GRPFIN VARCHAR(3),
    AGRUPA CHAR(1),
    ORDEN CHAR(1),
    DIAS INTEGER)
RETURNS (
    CODIGO VARCHAR(15),
    NOMBRE VARCHAR(60),
    UNIDAD VARCHAR(8),
    CODGRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    CODSUBG VARCHAR(3),
    NOMSUBG VARCHAR(30),
    CODMARC VARCHAR(3),
    NOMMARC VARCHAR(30),
    COSTO NUMERIC(18,2),
    SALIDAT NUMERIC(18,4),
    VPROMEDIO NUMERIC(18,4),
    PORC NUMERIC(9,2),
    CLASE CHAR(1))
AS
DECLARE VARIABLE CODINI VARCHAR(20);
DECLARE VARIABLE CODFIN VARCHAR(20);
DECLARE VARIABLE DESINI VARCHAR(20);
DECLARE VARIABLE DESFIN VARCHAR(20);
declare variable MARINI VARCHAR(3);
declare variable MARFIN VARCHAR(3);
declare variable SUBINI VARCHAR(3);
declare variable SUBFIN VARCHAR(3);
declare variable ACUMULADO NUMERIC(18,2);
declare variable ACUMULAC NUMERIC(18,4);
declare variable ACUMPORC NUMERIC(9,2);
declare variable FECINI DATE;
declare variable A NUMERIC(9,2);
declare variable B NUMERIC(9,2);
declare variable C NUMERIC(9,2);
declare variable MODO VARCHAR(10);
declare variable VENTAS numeric(18,4);
declare variable DEVOL numeric(18,4);
declare variable FECAUX DATE;
BEGIN
if (ORDEN = 'C') then
    BEGIN
    CODINI = ARTINI;
    CODFIN = ARTFIN;
    DESINI = '';
    DESFIN = 'zz';
    END
ELSE
    BEGIN
    DESINI = ARTINI;
    DESFIN = ARTFIN;
    CODINI = '';
    CODFIN = 'zz';
    END
if (AGRUPA = 'G') then
    BEGIN
    MARINI = '';
    MARFIN = 'zz';
    SUBINI = '';
    SUBFIN = 'zz';
    END
ELSE
    if (AGRUPA = 'M') then
        BEGIN
        MARINI = GRPINI;
        MARFIN = GRPFIN;
        GRPINI = '';
        GRPFIN = 'zz';
        SUBINI = '';
        SUBFIN = 'zz';
        END
    ELSE
        if (AGRUPA = 'S') then
            BEGIN
            SUBINI = GRPINI;
            SUBFIN = GRPFIN;
            GRPINI = '';
            GRPFIN = 'zz';
            MARINI = '';
            MARFIN = 'zz';
            END
        ELSE
            BEGIN
            MARINI = '';
            MARFIN = 'zz';
            GRPINI = '';
            GRPFIN = 'zz';
            SUBINI = '';
            SUBFIN = 'zz';
            END
DELETE FROM analisis_abcinven;
acumporc = 0;
FECINI = FECHA - DIAS;
/* CALCULE LA VENTA PROMEDIO DE CADA ARTICULO */
EXECUTE PROCEDURE LEE_CONFIGURACION ('INVENTARIO', 'EXISTENCIAS', 'PORCENTAJE MINIMO PARA ARTICULO CLASE "A"') returning_values (A);
EXECUTE PROCEDURE LEE_CONFIGURACION ('INVENTARIO', 'EXISTENCIAS', 'PORCENTAJE MINIMO PARA ARTICULO CLASE "B"') returning_values (B);
EXECUTE PROCEDURE LEE_CONFIGURACION ('INVENTARIO', 'EXISTENCIAS', 'PORCENTAJE MINIMO PARA ARTICULO CLASE "C"') returning_values (C);
EXECUTE PROCEDURE LEE_CONFIGURACION ('INVENTARIO', 'EXISTENCIAS', 'REPORTE ABC DEL INVENTARIO CON LA UTILIDAD O EL VALOR DE VENTA') returning_values (MODO);
FOR SELECT ARTI_COD, ARTI_UNIDAD FROM ARTICULO A
      WHERE ARTI_COD >= :CODINI AND ARTI_COD <= :CODFIN AND A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :GRPFIN AND ARTI_DES >= :DESINI AND ARTI_DES <= :DESFIN AND A.ESAR_COD <> 'I'
      AND (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN)))
      AND (((:SUBINI = '') AND (:SUBFIN = 'zz')) or ((A.subg_cod >= :SUBINI) AND (A.subg_cod <= :SUBFIN)))
      INTO :CODIGO, :UNIDAD
      DO
      BEGIN
      SELECT SUM(FADE_TOTAL - FADE_CONSUMO - FADE_IVAMONTO) FROM FACTURAS_DETALLE D, FACTURAS F
            WHERE F.fact_id = D.fact_id AND ARTI_COD = :codigo AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECHA AND FADE_ANULADO = 'N' INTO :ventas;
      if (ventas IS NULL) then
          ventas = 0;
      SELECT SUM(DVDE_TOTAL - DVDE_CONSUMO - DVDE_IVAMONTO) FROM devoluciones_ventas_detalle D, devoluciones_ventas F
            WHERE F.devt_id = D.devt_id AND ARTI_COD = :codigo AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECHA AND DVDE_ANULADO = 'N' INTO :devol;
      if (devol IS NULL) then
          devol = 0;
      VENTAS = VENTAS - DEVOL;
      if (VENTAS > 0) then
        BEGIN
        acumulado = 0;
        acumulac = 0;
        if (MODO = 'UTILIDAD') then
            BEGIN
            FOR SELECT FACT_FECHA, FADE_CANT * FADE_FACTOR FROM FACTURAS_DETALLE D, FACTURAS F
                WHERE F.fact_id = D.fact_id AND ARTI_COD = :codigo AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECHA AND FADE_ANULADO = 'N'
                INTO :FECAUX, :salidat
                DO
                BEGIN
                EXECUTE PROCEDURE COSTO_PROMEDIO(:codigo, :fecaux) returning_values (:costo);
                acumulado = acumulado + costo * salidat;
                acumulac = acumulac + salidat;
                END
            FOR SELECT DEVT_FECHA, DVDE_CANT * DVDE_FACTOR FROM devoluciones_ventas_detalle D, devoluciones_ventas F
                WHERE F.devt_id = D.devt_id AND ARTI_COD = :codigo AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECHA AND DVDE_ANULADO = 'N'
                INTO :FECAUX, :salidat
                DO
                BEGIN
                EXECUTE PROCEDURE COSTO_PROMEDIO(:codigo, :fecaux) returning_values (:costo);
                acumulado = acumulado - costo * salidat;
                acumulac = acumulac - salidat;
                END
            ventas = ventas - acumulado;
            END
        insert into analisis_abcinven (ABCI_COD, ABCI_VENTA, ABCI_CANT) VALUES (:codigo, :ventas, :acumulac);
        END
    END
SELECT SUM(ABCI_VENTA) FROM analisis_abcinven INTO :acumulado;
FOR SELECT ARTI_COD, ARTI_DES, ARTI_UNIDAD, ARTI_DIAS, A.GRUP_COD, GRUP_NOM, A.SUBG_COD, A.MARC_COD, ABCI_VENTA, ABCI_CANT
      FROM ARTICULO A, GRUPO G, analisis_abcinven N
      WHERE A.ARTI_COD = N.abci_cod AND G.GRUP_COD = A.GRUP_COD
      ORDER BY ABCI_VENTA DESC
      INTO :CODIGO, :NOMBRE, :UNIDAD, :DIAS, :CODGRUPO, :NOMGRUPO, :CODSUBG, :CODMARC, :vpromedio, :salidat
      DO
        BEGIN
        NOMMARC = '';
        NOMSUBG = '';
        SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO :NOMMARC;
        SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
        if (acumulado <> 0) then
            PORC = vpromedio / acumulado * 100;
        ELSE
            PORC = 0;
        acumporc = acumporc + porc;
        if (acumporc < A) then
            CLASE = 'A';
        else
            if (acumporc < B) then
                CLASE = 'B';
            else
                if (acumporc < c) then
                    CLASE = 'C';
                else
                    CLASE = 'D';
        SUSPEND;
        END
END

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE REP_COMPROBANTES_ARTICULO(
    TIPODOC INTEGER,
    DETALLE CHAR(1),
    FECINI DATE,
    FECFIN DATE,
    ARTINI VARCHAR(20),
    ARTFIN VARCHAR(20),
    GRPINI VARCHAR(2),
    GRPFIN VARCHAR(2),
    ORDEN CHAR(1),
    SUBEMPRESA INTEGER)
RETURNS (
    CODIGO VARCHAR(15),
    NOMBRE VARCHAR(60),
    UNIDAD VARCHAR(8),
    CODGRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    CODSUBG VARCHAR(3),
    NOMSUBG VARCHAR(30),
    CODMARC VARCHAR(3),
    NOMMARC VARCHAR(30),
    CODBOD VARCHAR(2),
    NOMTIPO VARCHAR(30),
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    CONCEPTO VARCHAR(60),
    NIT VARCHAR(20),
    NOMTERC VARCHAR(60),
    CONS INTEGER,
    CANT NUMERIC(18,4),
    COSTO NUMERIC(18,2),
    COSTOTOT NUMERIC(18,2))
AS
declare variable ENT CHAR(1);
declare variable ENTRADAS NUMERIC(18,4);
declare variable COSTOENT NUMERIC(18,2);
declare variable SALIDAS NUMERIC(18,4);
declare variable COSTOSAL NUMERIC(18,2);
declare variable CODINI VARCHAR(20);
declare variable CODFIN VARCHAR(20);
declare variable DESINI VARCHAR(20);
declare variable DESFIN VARCHAR(20);
BEGIN
  SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = :TIPODOC INTO :NOMTIPO;
  if (ORDEN = 'C') then
    BEGIN
    CODINI = ARTINI;
    CODFIN = ARTFIN;
    DESINI = '';
    DESFIN = 'zz';
    END
  ELSE
    BEGIN
    DESINI = ARTINI;
    DESFIN = ARTFIN;
    CODINI = '';
    CODFIN = 'zz';
    END
  FOR
    SELECT ARTI_COD, ARTI_DES, ARTI_UNIDAD, A.GRUP_COD, A.SUBG_COD, A.MARC_COD
      FROM ARTICULO A
      WHERE ARTI_COD >= :CODINI AND ARTI_COD <= :CODFIN AND A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :GRPFIN AND ARTI_DES >= :DESINI AND ARTI_DES <= :DESFIN
      INTO :CODIGO, :NOMBRE, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
      DO
        BEGIN
        NOMMARC = '';
        NOMSUBG = '';
        SELECT GRUP_NOM FROM GRUPO WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
        SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
        SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
        if (DETALLE = 'N') then
            BEGIN
            CANT = 0;
            COSTOTOT = 0;
            /* SUME LAS ENTRADAS */
            SELECT SUM(MVAR_CANT), SUM(MVAR_CANT * MVAR_COSTO) FROM MOVIMIENTO_ARTICULO M, PREFIJOS P
              WHERE P.PREF_PRE = M.MVAR_PREF AND P.TIDO_COD = M.mvar_tipodoc AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA)) AND
              (MVAR_FECHA >= :FECINI) AND (MVAR_FECHA < :FECFIN) AND
              (ARTI_COD = :CODIGO) AND (MVAR_ENTRADA = 'S') AND (MVAR_TIPODOC = :TIPODOC)
              INTO :ENTRADAS, :COSTOENT;
            if (ENTRADAS IS NULL) then
              ENTRADAS = 0;
            if (COSTOENT IS NULL) then
              COSTOENT = 0;
            /* CALCULE LAS SALIDAS A COSTO PROMEDIO */
            SALIDAS = 0;
            COSTOSAL = 0;
            FOR SELECT MVAR_CANT, MVAR_FECHA
                FROM MOVIMIENTO_ARTICULO M, PREFIJOS P
                WHERE P.PREF_PRE = M.MVAR_PREF AND P.TIDO_COD = M.mvar_tipodoc AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA)) AND
                (MVAR_FECHA >= :FECINI) AND (MVAR_FECHA <= :FECFIN) AND
                (ARTI_COD = :CODIGO) AND (MVAR_ENTRADA = 'N') AND (MVAR_TIPODOC = :TIPODOC)
                INTO :CANT, :FECHA
                DO
                    BEGIN
                    EXECUTE PROCEDURE COSTO_PROMEDIO(:CODIGO, :FECHA) returning_values (:COSTO);
                    SALIDAS = SALIDAS + CANT;
                    COSTOSAL = COSTOSAL + (COSTO * CANT);
                    END
            if (SALIDAS IS NULL) then
              SALIDAS = 0;
            if (COSTOSAL IS NULL) then
              COSTOSAL = 0;
            if (ENTRADAS > 0) then
                CANT = ENTRADAS;
            if (SALIDAS > 0) then
                CANT = SALIDAS;
            if (COSTOENT > 0) then
                COSTOTOT = COSTOENT;
            if (COSTOSAL > 0) then
                COSTOTOT = COSTOSAL;
            if (CANT > 0) then
                COSTO = COSTOTOT / CANT;
            ELSE
                COSTO = 0;
            if (CANT <> 0) then
                SUSPEND;
            END
        ELSE
            BEGIN
            FOR SELECT MVAR_ENTRADA, MVAR_PREF, MVAR_NUMERO, MVAR_CANT, MVAR_COSTO, MVAR_CONC, MVAR_FECHA, M.TERC_NIT, MVAR_CONS, BODE_COD
                FROM MOVIMIENTO_ARTICULO M, TIPO_DOCUMENTO TD, PREFIJOS P
                WHERE TD.TIDO_COD = MVAR_TIPODOC AND P.PREF_PRE = M.MVAR_PREF AND P.TIDO_COD = M.mvar_tipodoc AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA)) AND
                (MVAR_FECHA >= :FECINI) AND (MVAR_FECHA < :FECFIN) AND (ARTI_COD = :CODIGO) AND (MVAR_TIPODOC = :TIPODOC)
                ORDER BY MVAR_FECHA, MVAR_CONS
                INTO :ENT, :PREFIJO, :NUMERO, :CANT, :COSTO, :CONCEPTO, :FECHA, :NIT, :CONS, :CODBOD
                DO
                    BEGIN
                    select TERC_NOM from TERCEROS where TERC_NIT = :NIT into :NOMTERC;
                    if (ENT = 'S') then
                        BEGIN
                        COSTOTOT = (CANT * COSTO);
                        end
                    ELSE
                        BEGIN
                        EXECUTE PROCEDURE COSTO_PROMEDIO(:CODIGO, :FECHA) returning_values (:COSTO);
                        COSTOTOT = (CANT * COSTO);
                        END
                    SUSPEND;
                    END
            END
        END
END

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE REP_COMPROBANTES_INV(
    TIPO INTEGER,
    DETALLE CHAR(1),
    FECINI DATE,
    FECFIN DATE,
    PREFIJO VARCHAR(4),
    ANULADOS CHAR(1),
    SUBEMPRESA INTEGER)
RETURNS (
    NOMTIPO VARCHAR(30),
    ID INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    VENCE DATE,
    CONCEPTO VARCHAR(60),
    REFER VARCHAR(60),
    CODBODORI VARCHAR(2),
    NOMBODORI VARCHAR(30),
    CODBODDES VARCHAR(2),
    NOMBODDES VARCHAR(30),
    NOMTERCERO VARCHAR(60),
    PRODCODBAR VARCHAR(15),
    PRODDES VARCHAR(60),
    PRODCANT NUMERIC(18,4),
    PRODUNIDAD VARCHAR(8),
    PRODLOTE VARCHAR(15),
    OBS BLOB SUB_TYPE 0 SEGMENT SIZE 80,
    ITEM INTEGER,
    ARTICULO VARCHAR(15),
    CODBAR VARCHAR(15),
    ARTIDES VARCHAR(60),
    CANT NUMERIC(18,4),
    EXANT NUMERIC(18,4),
    UNIDAD VARCHAR(8),
    BODITEM VARCHAR(2),
    COSTO NUMERIC(18,2),
    DTOPORC NUMERIC(9,2),
    DTOMONTO NUMERIC(18,2),
    IVAPORC NUMERIC(9,2),
    IVAMONTO NUMERIC(18,2),
    CONSUMO NUMERIC(18,2),
    SUBTOTAL NUMERIC(18,2),
    TOTAL NUMERIC(18,2),
    LOTE VARCHAR(15),
    ANULADO CHAR(1),
    OBSITEM BLOB SUB_TYPE 0 SEGMENT SIZE 80)
AS
BEGIN
  /* DETERMINE LA TABLA A EXAMINAR */
  if (BIN_AND(TIPO, 1) <> 0) then
    BEGIN
    SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 11 INTO :NOMTIPO;
    FOR SELECT ENTR_ID, E.PREF_PRE, ENTR_NUMERO, ENTR_FECHA, ENTR_CONC, ENTR_REFER, E.BODE_COD, BODE_NOM, ENTR_NOMTERC, ENTR_OBS, ENTR_ANULADO
    FROM ENTRADAS E, BODEGA B, PREFIJOS P
    WHERE E.BODE_COD = B.BODE_COD AND ENTR_FECHA >= :FECINI AND ENTR_FECHA <= :FECFIN
     AND P.PREF_PRE = E.PREF_PRE AND P.TIDO_COD = 11 AND ((P.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
    ORDER BY ENTR_FECHA, ENTR_ID
    INTO :ID, :PREF, :NUMERO, :FECHA, :CONCEPTO, :REFER, :CODBODORI, :NOMBODORI, :NOMTERCERO, :OBS, :ANULADO
    DO
        BEGIN
        if (((:PREFIJO = '') or (:PREF = :PREFIJO)) AND ((:ANULADOS = 'S') or (:ANULADO = 'N'))) then
            BEGIN
            if (anulado = 'S') then
             BEGIN
              ITEM = 0;
              ARTICULO = '';
              CODBAR = '';
              ARTIDES = '';
              CANT = 0;
              UNIDAD = '';
              BODITEM = '';
              lote = '';
              costo = 0;
              DTOPORC = 0;
              DTOMONTO = 0;
              IVAPORC = 0;
              IVAMONTO = 0;
              CONSUMO = 0;
              TOTAL = 0;
              OBSITEM = null;
              SUBTOTAL = 0;
              SUSPEND;
             END
            ELSE
             BEGIN
              if (DETALLE = 'S') then
                FOR SELECT ENDE_ITEM, A.ARTI_COD, ENDE_CODBAR, ENDE_DESC, ENDE_CANT, ENDE_UNIDAD, BODE_COD, ENDE_COSTO, ENDE_DTOPORC, ENDE_DTOMONTO, ENDE_IVAPORC, ENDE_IVAMONTO, ENDE_CONSUMO, ENDE_TOTAL, ENDE_LOTE, ENDE_OBS
                    FROM ENTRADAS_DETALLE D, ARTICULO A WHERE D.ARTI_COD = A.ARTI_COD AND D.ENTR_ID = :ID INTO
                    :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :BODITEM, :COSTO, :DTOPORC, :DTOMONTO, :IVAPORC, :IVAMONTO, :CONSUMO, :TOTAL, :LOTE, :OBSITEM
                    DO
                    BEGIN
                    SUBTOTAL = TOTAL - IVAMONTO - CONSUMO;
                    SUSPEND;
                    END
              ELSE
                BEGIN
                SELECT SUM(ENDE_IVAMONTO), SUM(ENDE_CONSUMO), SUM(ENDE_TOTAL)
                    FROM ENTRADAS_DETALLE D WHERE D.ENTR_ID = :ID INTO
                    :IVAMONTO, :CONSUMO, :TOTAL;
                SUBTOTAL = TOTAL - IVAMONTO - CONSUMO;
                SUSPEND;
                END
             END
            END
        END
    END
  if (BIN_AND(TIPO, 2) <> 0) then
    BEGIN
    SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 12 INTO :NOMTIPO;
    FOR SELECT SALI_ID, S.PREF_PRE, SALI_NUMERO, SALI_FECHA, SALI_CONC, SALI_REFER, S.BODE_COD, BODE_NOM, SALI_NOMTERC, SALI_OBS, SALI_ANULADO
    FROM SALIDAS S, BODEGA B, PREFIJOS P
    WHERE S.BODE_COD = B.BODE_COD AND SALI_FECHA >= :FECINI AND SALI_FECHA <= :FECFIN 
     AND P.PREF_PRE = S.PREF_PRE AND P.TIDO_COD = 12 AND ((P.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
    ORDER BY SALI_FECHA, SALI_ID
    into :ID, :PREF, :NUMERO, :FECHA, :CONCEPTO, :REFER, :CODBODORI, :NOMBODORI, :NOMTERCERO, :OBS, :ANULADO
    DO
        BEGIN
        if (((:PREFIJO = '') or (:PREF = :PREFIJO)) AND ((:ANULADOS = 'S') or (:ANULADO = 'N'))) then
            BEGIN
            if (anulado = 'S') then
             BEGIN
              ITEM = 0;
              ARTICULO = '';
              CODBAR = '';
              ARTIDES = '';
              CANT = 0;
              UNIDAD = '';
              BODITEM = '';
              lote = '';
              costo = 0;
              DTOPORC = 0;
              DTOMONTO = 0;
              IVAPORC = 0;
              IVAMONTO = 0;
              CONSUMO = 0;
              EXANT = 0;
              TOTAL = 0;
              OBSITEM = null;
              SUBTOTAL = 0;
              SUSPEND;
             END
            ELSE
             BEGIN
              if (DETALLE = 'S') then
                FOR SELECT SADE_ITEM, A.ARTI_COD, SADE_CODBAR, SADE_DESC, SADE_CANT, SADE_UNIDAD, BODE_COD, SADE_COSTO, SADE_IVAPORC, SADE_IVAMONTO, SADE_CONSUMO, SADE_TOTAL, SADE_LOTE, SADE_OBS
                    FROM SALIDAS_DETALLE D, ARTICULO A WHERE D.ARTI_COD = A.ARTI_COD AND D.SALI_ID = :ID INTO
                    :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :BODITEM, :COSTO, :IVAPORC, :IVAMONTO, :CONSUMO, :TOTAL, :LOTE, :OBSITEM
                    DO
                BEGIN
                SUBTOTAL = TOTAL - IVAMONTO - CONSUMO;
                SUSPEND;
                END
              ELSE
                BEGIN
                SELECT SUM(SADE_IVAMONTO), SUM(SADE_CONSUMO), SUM(SADE_TOTAL)
                    FROM SALIDAS_DETALLE D WHERE D.SALI_ID = :ID INTO
                    :IVAMONTO, :CONSUMO, :TOTAL;
                SUBTOTAL = TOTAL - IVAMONTO - CONSUMO;
                SUSPEND;
                END
             END
            END
        END
    END
  if (BIN_AND(TIPO, 4) <> 0) then
    BEGIN
    SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 13 INTO :NOMTIPO;
    FOR SELECT TRAN_ID, T.PREF_PRE, TRAN_NUMERO, TRAN_FECHA, TRAN_CONC, TRAN_REFER, T.BODE_COD, BO.BODE_NOM, TRAN_BODDES, BD.BODE_NOM, TRAN_OBS, TRAN_ANULADO
    FROM TRASFERENCIAS T, BODEGA BO, BODEGA BD, PREFIJOS P
    WHERE T.BODE_COD = BO.BODE_COD AND T.TRAN_BODDES = BD.BODE_COD AND TRAN_FECHA >= :FECINI AND TRAN_FECHA <= :FECFIN 
     AND P.PREF_PRE = T.PREF_PRE AND P.TIDO_COD = 13 AND ((P.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
    ORDER BY TRAN_FECHA, TRAN_ID
    into :ID, :PREF, :NUMERO, :FECHA, :CONCEPTO, :REFER, :CODBODORI, :NOMBODORI, :CODBODDES, :NOMBODDES, :OBS, :ANULADO
    DO
        BEGIN
        if (((:PREFIJO = '') or (:PREF = :PREFIJO)) AND ((:ANULADOS = 'S') or (:ANULADO = 'N'))) then
            BEGIN
            if (anulado = 'S') then
             BEGIN
              ITEM = 0;
              ARTICULO = '';
              CODBAR = '';
              ARTIDES = '';
              CANT = 0;
              UNIDAD = '';
              BODITEM = '';
              lote = '';
              costo = 0;
              DTOPORC = 0;
              DTOMONTO = 0;
              IVAPORC = 0;
              IVAMONTO = 0;
              CONSUMO = 0;
              EXANT = 0;
              TOTAL = 0;
              OBSITEM = null;
              SUBTOTAL = 0;
              SUSPEND;
             END
            ELSE
             BEGIN
              if (DETALLE = 'S') then
                FOR SELECT TRAS_ITEM, A.ARTI_COD, TRAS_CODBAR, TRAS_DESC, TRAS_CANT, TRAS_UNIDAD, TRAS_COSTO, TRAS_IVAPORC, TRAS_IVAMONTO, TRAS_CONSUMO, TRAS_TOTAL, TRAS_LOTE, TRAS_OBS
                    FROM TRASFERENCIAS_DETALLE D, ARTICULO A WHERE D.ARTI_COD = A.ARTI_COD AND D.TRAN_ID = :ID INTO
                    :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :COSTO, :IVAPORC, :IVAMONTO, :CONSUMO, :TOTAL, :LOTE, :OBSITEM
                    DO
                    BEGIN
                    SUBTOTAL = TOTAL - IVAMONTO - CONSUMO;
                    SUSPEND;
                    END
              ELSE
                BEGIN
                SELECT SUM(TRAS_IVAMONTO), SUM(TRAS_CONSUMO), SUM(TRAS_TOTAL) FROM trasferencias_detalle D
                    WHERE D.TRAN_ID = :ID INTO :IVAMONTO, :CONSUMO, :TOTAL;
                SUBTOTAL = TOTAL - IVAMONTO - CONSUMO;
                SUSPEND;
                END
             END
            END
        END
    END
  if (BIN_AND(TIPO, 8) <> 0) then
    BEGIN
    SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 14 INTO :NOMTIPO;
    FOR SELECT AJUS_ID, A.PREF_PRE, AJUS_NUMERO, AJUS_FECHA, AJUS_CONC, A.BODE_COD, BODE_NOM, AJUS_OBS, AJUS_ANULADO
    FROM AJUSTES A, BODEGA B, PREFIJOS P
    WHERE A.BODE_COD = B.BODE_COD AND AJUS_FECHA >= :FECINI AND AJUS_FECHA <= :FECFIN 
     AND P.PREF_PRE = A.PREF_PRE AND P.TIDO_COD = 14 AND ((P.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
    ORDER BY AJUS_FECHA, AJUS_ID
    into :ID, :PREF, :NUMERO, :FECHA, :CONCEPTO, :CODBODORI, :NOMBODORI, :OBS, :ANULADO
    DO
        BEGIN
        if (((:PREFIJO = '') or (:PREF = :PREFIJO)) AND ((:ANULADOS = 'S') or (:ANULADO = 'N'))) then
            BEGIN
            if (anulado = 'S') then
             BEGIN
              ITEM = 0;
              ARTICULO = '';
              CODBAR = '';
              ARTIDES = '';
              CANT = 0;
              UNIDAD = '';
              BODITEM = '';
              lote = '';
              costo = 0;
              DTOPORC = 0;
              DTOMONTO = 0;
              IVAPORC = 0;
              IVAMONTO = 0;
              CONSUMO = 0;
              EXANT = 0;
              TOTAL = 0;
              OBSITEM = null;
              SUBTOTAL = 0;
              SUSPEND;
             END
            ELSE
             BEGIN
              if (DETALLE = 'S') then
                FOR SELECT AJUS_ITEM, A.ARTI_COD, AJUS_CODBAR, AJDE_DESC, AJUS_EXANT, AJUS_UNIDAD, BODE_COD, AJUS_EXNUE, AJUS_LOTE, AJDE_OBS
                    FROM AJUSTES_DETALLE D, ARTICULO A WHERE D.ARTI_COD = A.ARTI_COD AND D.AJUS_ID = :ID INTO
                    :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :EXANT, :UNIDAD, :BODITEM, :CANT, :LOTE, :OBSITEM
                    DO
                      BEGIN
                      EXECUTE PROCEDURE COSTO_PROMEDIO(:ARTICULO, :FECHA) returning_values (:COSTO);
                      TOTAL = (CANT - EXANT) * COSTO;
                      SUBTOTAL = TOTAL;
                      SUSPEND;
                      END
              ELSE
                BEGIN
                TOTAL = 0;
                FOR SELECT ARTI_COD, AJUS_EXNUE, AJUS_EXANT FROM AJUSTES_DETALLE D WHERE D.AJUS_ID = :ID INTO
                    :ARTICULO, :CANT, :EXANT
                    DO
                      BEGIN
                      EXECUTE PROCEDURE COSTO_PROMEDIO(:ARTICULO, :FECHA) returning_values (:COSTO);
                      TOTAL = TOTAL + ((CANT - EXANT) * COSTO);
                      SUBTOTAL = TOTAL;
                      END
                SUSPEND;
                END
             END
            END
        END
    END
  if (BIN_AND(TIPO, 16) <> 0) then
    BEGIN
    SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 15 INTO :NOMTIPO;
    FOR SELECT ENSA_ID, E.PREF_PRE, ENSA_NUMERO, ENSA_FECHA, ENSA_CONC, ENSA_REFER, E.BODE_COD, BODE_NOM, ENSA_CODBAR, ENSA_DESC, ENSA_CANT, ENSA_UNIDAD, ENSA_LOTE, ENSA_OBS, ENSA_ANULADO
    FROM ENSAMBLES E, BODEGA B, PREFIJOS P
    WHERE E.BODE_COD = B.BODE_COD AND E.ENSA_FECHA >= :FECINI AND E.ENSA_FECHA <= :FECFIN
     AND P.PREF_PRE = E.PREF_PRE AND P.TIDO_COD = 15 AND ((P.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
    ORDER BY ENSA_FECHA, ENSA_ID
    into :ID, :PREF, :NUMERO, :FECHA, :CONCEPTO, :REFER, :CODBODORI, :NOMBODORI, :PRODCODBAR, :PRODDES, :PRODCANT, :PRODUNIDAD, :PRODLOTE, :OBS, :ANULADO
    DO
        BEGIN
        if (((:PREFIJO = '') or (:PREF = :PREFIJO)) AND ((:ANULADOS = 'S') or (:ANULADO = 'N'))) then
            BEGIN
            if (anulado = 'S') then
             BEGIN
              ITEM = 0;
              ARTICULO = '';
              CODBAR = '';
              ARTIDES = '';
              CANT = 0;
              UNIDAD = '';
              BODITEM = '';
              lote = '';
              costo = 0;
              DTOPORC = 0;
              DTOMONTO = 0;
              IVAPORC = 0;
              IVAMONTO = 0;
              CONSUMO = 0;
              EXANT = 0;
              TOTAL = 0;
              OBSITEM = null;
              SUBTOTAL = 0;
              SUSPEND;
             END
            ELSE
             BEGIN
              if (DETALLE = 'S') then
                FOR SELECT ESDE_ITEM, A.ARTI_COD, ESDE_CODBAR, ESDE_DESC, ESDE_CANT, ESDE_UNIDAD, BODE_COD, ESDE_COSTO, ESDE_IVAPORC, ESDE_IVAMONTO, ESDE_CONSUMO, ESDE_TOTAL, ESDE_LOTE, ESDE_OBS
                    FROM ensambles_detalle D, ARTICULO A WHERE D.ARTI_COD = A.ARTI_COD AND D.ENSA_ID = :ID INTO
                    :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :BODITEM, :COSTO, :IVAPORC, :IVAMONTO, :CONSUMO, :TOTAL, :LOTE, :OBSITEM
                    DO
                    BEGIN
                    SUBTOTAL = TOTAL - IVAMONTO - CONSUMO;
                    SUSPEND;
                    END
              ELSE
                BEGIN
                SELECT SUM(ESDE_IVAMONTO), SUM(ESDE_CONSUMO), SUM(ESDE_TOTAL) FROM ENSAMBLES_detalle D WHERE D.ENSA_ID = :ID INTO
                    :IVAMONTO, :CONSUMO, :TOTAL;
                SUBTOTAL = TOTAL - IVAMONTO - CONSUMO;
                SUSPEND;
                END
             END
            END
        END
    END
  if (BIN_AND(TIPO, 32) <> 0) then
    BEGIN
    SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 16 INTO :NOMTIPO;
    FOR SELECT DESE_ID, E.PREF_PRE, DESE_NUMERO, DESE_FECHA, DESE_CONC, DESE_REFER, E.BODE_COD, BODE_NOM, DESE_CODBAR, DESE_DESC, DESE_CANT, DESE_UNIDAD, DESE_LOTE, DESE_OBS, DESE_ANULADO
    FROM DESENSAMBLES E, BODEGA B, PREFIJOS P
    WHERE E.BODE_COD = B.BODE_COD AND DESE_FECHA >= :FECINI AND DESE_FECHA <= :FECFIN 
     AND P.PREF_PRE = E.PREF_PRE AND P.TIDO_COD = 16 AND ((P.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
    ORDER BY DESE_FECHA, DESE_ID
    into :ID, PREF, :NUMERO, :FECHA, :CONCEPTO, :REFER, :CODBODORI, :NOMBODORI, :PRODCODBAR, :PRODDES, :PRODCANT, :PRODUNIDAD, :PRODLOTE, :OBS, :ANULADO
    DO
        BEGIN
        if (((:PREFIJO = '') or (:PREF = :PREFIJO)) AND ((:ANULADOS = 'S') or (:ANULADO = 'N'))) then
            BEGIN
            if (anulado = 'S') then
             BEGIN
              ITEM = 0;
              ARTICULO = '';
              CODBAR = '';
              ARTIDES = '';
              CANT = 0;
              UNIDAD = '';
              BODITEM = '';
              lote = '';
              costo = 0;
              DTOPORC = 0;
              DTOMONTO = 0;
              IVAPORC = 0;
              IVAMONTO = 0;
              CONSUMO = 0;
              EXANT = 0;
              TOTAL = 0;
              OBSITEM = null;
              SUBTOTAL = 0;
              SUSPEND;
             END
            ELSE
             BEGIN
              if (DETALLE = 'S') then
                FOR SELECT DESE_ITEM, A.ARTI_COD, DEDE_CODBAR, DEDE_DESC, DEDE_CANT, DEDE_UNIDAD, BODE_COD, DEDE_COSTO, DEDE_IVAPORC, DEDE_IVAMONTO, DEDE_CONSUMO, DEDE_TOTAL, DEDE_LOTE, DEDE_OBS
                    FROM desensambles_detalle D, ARTICULO A WHERE D.ARTI_COD = A.ARTI_COD AND D.DESE_ID = :ID INTO
                    :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :BODITEM, :COSTO, :IVAPORC, :IVAMONTO, :CONSUMO, :TOTAL, :LOTE, :OBSITEM
                    DO
                    BEGIN
                    SUBTOTAL = TOTAL - IVAMONTO - CONSUMO;
                    SUSPEND;
                    END
              ELSE
                BEGIN
                SELECT SUM(DEDE_IVAMONTO), SUM(DEDE_CONSUMO), SUM(DEDE_TOTAL) FROM DESENSAMBLES_detalle D WHERE D.DESE_ID = :ID INTO
                    :IVAMONTO, :CONSUMO, :TOTAL;
                SUBTOTAL = TOTAL - IVAMONTO - CONSUMO;
                SUSPEND;
                END
             END
            END
        END
    END
  if (BIN_AND(TIPO, 64) <> 0) then
    BEGIN
    SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 17 INTO :NOMTIPO;
    FOR SELECT RESE_ID, R.PREF_PRE, RESE_NUMERO, RESE_FECHA, RESE_CONC, RESE_REFER, R.BODE_COD, BODE_NOM, RESE_NOMTERC, RESE_OBS, RESE_ANULADO
    FROM RESERVAS R, BODEGA B, PREFIJOS P
    WHERE R.BODE_COD = B.BODE_COD AND R.RESE_FECHA >= :FECINI AND R.RESE_FECHA <= :FECFIN 
     AND P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = 17 AND ((P.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
    ORDER BY RESE_FECHA, RESE_ID
    into :ID, :PREF, :NUMERO, :FECHA, :CONCEPTO, :REFER, :CODBODORI, :NOMBODORI, :NOMTERCERO, :OBS, :ANULADO
    DO
        BEGIN
        if (((:PREFIJO = '') or (:PREF = :PREFIJO)) AND ((:ANULADOS = 'S') or (:ANULADO = 'N'))) then
            BEGIN
            if (anulado = 'S') then
             BEGIN
              ITEM = 0;
              ARTICULO = '';
              CODBAR = '';
              ARTIDES = '';
              CANT = 0;
              UNIDAD = '';
              BODITEM = '';
              lote = '';
              costo = 0;
              DTOPORC = 0;
              DTOMONTO = 0;
              IVAPORC = 0;
              IVAMONTO = 0;
              CONSUMO = 0;
              EXANT = 0;
              TOTAL = 0;
              OBSITEM = null;
              SUBTOTAL = 0;
              SUSPEND;
             END
            ELSE
             BEGIN
              if (DETALLE = 'S') then
                FOR SELECT RSDE_ITEM, A.ARTI_COD, RSDE_CODBAR, RSDE_DESC, RDSE_CANT, RSDE_UNIDAD, BODE_COD, RSDE_OBS
                    FROM RESERVAS_DETALLE D, ARTICULO A WHERE D.ARTI_COD = A.ARTI_COD AND D.RESE_ID = :ID INTO
                    :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :BODITEM, :OBSITEM
                    DO
                    SUSPEND;
              ELSE
                BEGIN
                SELECT SUM(RDSE_CANT) FROM RESERVAS_detalle D WHERE D.RESE_ID = :ID INTO
                    :CANT;
                SUSPEND;
                END
             END
            END
        END
    END
  if (BIN_AND(TIPO, 128) <> 0) then
    BEGIN
    SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 18 INTO :NOMTIPO;
    FOR SELECT ORIN_ID, O.PREF_PRE, ORIN_NUMERO, ORIN_FECHA, ORIN_FECLLEGA, ORIN_CONC, ORIN_REFER, ORIN_NOMTERC, ORIN_OBS, ORIN_ANULADO
        FROM ORDENES_INVENTARIO O, PREFIJOS P
        WHERE ORIN_FECHA >= :FECINI AND ORIN_FECHA <= :FECFIN 
        AND P.PREF_PRE = O.PREF_PRE AND P.TIDO_COD = 18 AND ((P.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
        ORDER BY ORIN_FECHA, ORIN_ID
        into :ID, PREF, :NUMERO, :FECHA, :VENCE, :CONCEPTO, :REFER, :NOMTERCERO, :OBS, :ANULADO
        DO
        BEGIN
        if (((:PREFIJO = '') or (:PREF = :PREFIJO)) AND ((:ANULADOS = 'S') or (:ANULADO = 'N'))) then
            BEGIN
            if (anulado = 'S') then
             BEGIN
              ITEM = 0;
              ARTICULO = '';
              CODBAR = '';
              ARTIDES = '';
              CANT = 0;
              UNIDAD = '';
              BODITEM = '';
              lote = '';
              costo = 0;
              DTOPORC = 0;
              DTOMONTO = 0;
              IVAPORC = 0;
              IVAMONTO = 0;
              CONSUMO = 0;
              EXANT = 0;
              TOTAL = 0;
              OBSITEM = null;
              SUBTOTAL = 0;
              SUSPEND;
             END
            ELSE
             BEGIN
              if (DETALLE = 'S') then
                FOR SELECT ORID_ITEM, A.ARTI_COD, ORID_CODBAR, ORID_DESC, ORID_CANT, ORID_UNIDAD, ORIN_COSTO, ORID_DTOPORC, ORID_DTOMONTO, ORID_IVAPORC, ORID_IVAMONTO, ORID_CONSUMO, ORID_TOTAL, ORID_OBS, ORID_LOTE
                    FROM ORDENINVENTARIO_DETALLE D, ARTICULO A WHERE D.ARTI_COD = A.ARTI_COD AND D.ORIN_ID = :ID INTO
                    :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :COSTO, :DTOPORC, :DTOMONTO, :IVAPORC, :IVAMONTO, :CONSUMO, :TOTAL, :OBSITEM, :LOTE
                    DO
                    BEGIN
                    SUBTOTAL = TOTAL - IVAMONTO - CONSUMO;
                    SUSPEND;
                    END
              ELSE
                BEGIN
                SELECT SUM(ORID_IVAMONTO), SUM(ORID_CONSUMO), SUM(ORID_TOTAL) FROM ordeninventario_detalle D WHERE D.ORIN_ID = :ID INTO
                    :IVAMONTO, :CONSUMO, :TOTAL;
                SUBTOTAL = TOTAL - IVAMONTO - CONSUMO;
                SUSPEND;
                END
             END
            END
        END
    END
END

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE REP_CONSECUTIVOS_INV(
    TIPO INTEGER,
    DETALLE CHAR(1),
    PREINI VARCHAR(4),
    PREFIN VARCHAR(4),
    NUMINI VARCHAR(6),
    NUMFIN VARCHAR(6),
    ANULADOS CHAR(1),
    SUBEMPRESA INTEGER)
RETURNS (
    NOMTIPO VARCHAR(30),
    ID INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    VENCE DATE,
    CONCEPTO VARCHAR(60),
    REFER VARCHAR(60),
    CODBODORI VARCHAR(2),
    NOMBODORI VARCHAR(30),
    CODBODDES VARCHAR(2),
    NOMBODDES VARCHAR(30),
    NOMTERCERO VARCHAR(60),
    PRODCODBAR VARCHAR(15),
    PRODDES VARCHAR(60),
    PRODCANT NUMERIC(18,4),
    PRODUNIDAD VARCHAR(8),
    PRODLOTE VARCHAR(15),
    OBS BLOB SUB_TYPE 0 SEGMENT SIZE 80,
    ITEM INTEGER,
    ARTICULO VARCHAR(15),
    CODBAR VARCHAR(15),
    ARTIDES VARCHAR(60),
    CANT NUMERIC(18,4),
    EXANT NUMERIC(18,4),
    UNIDAD VARCHAR(8),
    BODITEM VARCHAR(2),
    COSTO NUMERIC(18,2),
    DTOPORC NUMERIC(9,2),
    DTOMONTO NUMERIC(18,2),
    IVAPORC NUMERIC(9,2),
    IVAMONTO NUMERIC(18,2),
    CONSUMO NUMERIC(18,2),
    SUBTOTAL NUMERIC(18,2),
    TOTAL NUMERIC(18,2),
    LOTE VARCHAR(15),
    ANULADO CHAR(1),
    OBSITEM BLOB SUB_TYPE 0 SEGMENT SIZE 80)
AS
BEGIN
  /* DETERMINE LA TABLA A EXAMINAR */
  if (BIN_AND(TIPO, 1) <> 0) then
    BEGIN
    SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 11 INTO :NOMTIPO;
    FOR SELECT ENTR_ID, E.PREF_PRE, ENTR_NUMERO, ENTR_FECHA, ENTR_CONC, ENTR_REFER, E.BODE_COD, BODE_NOM, ENTR_NOMTERC, ENTR_OBS, ENTR_ANULADO
    FROM ENTRADAS E, BODEGA B, PREFIJOS PR
    WHERE E.BODE_COD = B.BODE_COD AND E.PREF_PRE >= :PREINI AND E.PREF_PRE <= :PREFIN AND ENTR_NUMERO >= :NUMINI AND ENTR_NUMERO <= :NUMFIN
     AND PR.PREF_PRE = E.PREF_PRE AND PR.TIDO_COD = 11 AND ((PR.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
    ORDER BY E.PREF_PRE, ENTR_NUMERO
    INTO :ID, :PREF, :NUMERO, :FECHA, :CONCEPTO, :REFER, :CODBODORI, :NOMBODORI, :NOMTERCERO, :OBS, :ANULADO
    DO
        BEGIN
        if ((:ANULADOS = 'S') or (:ANULADO = 'N')) then
            BEGIN
            if (anulado = 'S') then
             BEGIN
              ITEM = 0;
              ARTICULO = '';
              CODBAR = '';
              ARTIDES = '';
              CANT = 0;
              UNIDAD = '';
              BODITEM = '';
              lote = '';
              costo = 0;
              DTOPORC = 0;
              DTOMONTO = 0;
              IVAPORC = 0;
              IVAMONTO = 0;
              CONSUMO = 0;
              TOTAL = 0;
              OBSITEM = null;
              SUBTOTAL = 0;
              SUSPEND;
             END
            ELSE
             BEGIN
              if (DETALLE = 'S') then
                FOR SELECT ENDE_ITEM, A.ARTI_COD, ENDE_CODBAR, ENDE_DESC, ENDE_CANT, ENDE_UNIDAD, BODE_COD, ENDE_COSTO, ENDE_DTOPORC, ENDE_DTOMONTO, ENDE_IVAPORC, ENDE_IVAMONTO, ENDE_CONSUMO, ENDE_TOTAL, ENDE_LOTE, ENDE_OBS
                    FROM ENTRADAS_DETALLE D, ARTICULO A
                    WHERE D.ARTI_COD = A.ARTI_COD AND D.ENTR_ID = :ID
                    ORDER BY ENDE_ITEM
                    INTO :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :BODITEM, :COSTO, :DTOPORC, :DTOMONTO, :IVAPORC, :IVAMONTO, :CONSUMO, :TOTAL, :LOTE, :OBSITEM
                    DO
                    BEGIN
                    SUBTOTAL = TOTAL - IVAMONTO - CONSUMO;
                    SUSPEND;
                    END
              ELSE
                BEGIN
                SELECT SUM(ENDE_IVAMONTO), SUM(ENDE_CONSUMO), SUM(ENDE_TOTAL) FROM ENTRADAS_DETALLE D WHERE D.ENTR_ID = :ID INTO
                    :IVAMONTO, :CONSUMO, :TOTAL;
                SUBTOTAL = TOTAL - IVAMONTO - CONSUMO;
                SUSPEND;
                END
             END
            END
        END
    END
  if (BIN_AND(TIPO, 2) <> 0) then
    BEGIN
    SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 12 INTO :NOMTIPO;
    FOR SELECT SALI_ID, S.PREF_PRE, SALI_NUMERO, SALI_FECHA, SALI_CONC, SALI_REFER, S.BODE_COD, BODE_NOM, SALI_NOMTERC, SALI_OBS, SALI_ANULADO
    FROM SALIDAS S, BODEGA B, PREFIJOS PR
    WHERE S.BODE_COD = B.BODE_COD AND S.PREF_PRE >= :PREINI AND S.PREF_PRE <= :PREFIN AND SALI_NUMERO >= :NUMINI AND SALI_NUMERO <= :NUMFIN
     AND PR.PREF_PRE = S.PREF_PRE AND PR.TIDO_COD = 12 AND ((PR.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
    ORDER BY S.PREF_PRE, SALI_NUMERO
    into :ID, :PREF, :NUMERO, :FECHA, :CONCEPTO, :REFER, :CODBODORI, :NOMBODORI, :NOMTERCERO, :OBS, :ANULADO
    DO
        BEGIN
        if ((:ANULADOS = 'S') or (:ANULADO = 'N')) then
            BEGIN
            if (anulado = 'S') then
             BEGIN
              ITEM = 0;
              ARTICULO = '';
              CODBAR = '';
              ARTIDES = '';
              CANT = 0;
              UNIDAD = '';
              BODITEM = '';
              lote = '';
              costo = 0;
              DTOPORC = 0;
              DTOMONTO = 0;
              IVAPORC = 0;
              IVAMONTO = 0;
              CONSUMO = 0;
              TOTAL = 0;
              OBSITEM = null;
              SUBTOTAL = 0;
              SUSPEND;
             END
            ELSE
             BEGIN
              if (DETALLE = 'S') then
                FOR SELECT SADE_ITEM, A.ARTI_COD, SADE_CODBAR, SADE_DESC, SADE_CANT, SADE_UNIDAD, BODE_COD, SADE_COSTO, SADE_IVAPORC, SADE_IVAMONTO, SADE_CONSUMO, SADE_TOTAL, SADE_LOTE, SADE_OBS
                FROM SALIDAS_DETALLE D, ARTICULO A
                WHERE D.ARTI_COD = A.ARTI_COD AND D.SALI_ID = :ID
                ORDER BY SADE_ITEM
                INTO :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :BODITEM, :COSTO, :IVAPORC, :IVAMONTO, :CONSUMO, :TOTAL, :LOTE, :OBSITEM
                    DO
                BEGIN
                SUBTOTAL = TOTAL - IVAMONTO - CONSUMO;
                SUSPEND;
                END
              ELSE
                BEGIN
                SELECT SUM(SADE_IVAMONTO), SUM(SADE_CONSUMO), SUM(SADE_TOTAL) FROM SALIDAS_DETALLE D WHERE D.SALI_ID = :ID INTO
                    :IVAMONTO, :CONSUMO, :TOTAL;
                SUBTOTAL = TOTAL - IVAMONTO - CONSUMO;
                SUSPEND;
                END
             END
            END
        END
    END
  if (BIN_AND(TIPO, 4) <> 0) then
    BEGIN
    SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 13 INTO :NOMTIPO;
    FOR SELECT TRAN_ID, T.PREF_PRE, TRAN_NUMERO, TRAN_FECHA, TRAN_CONC, TRAN_REFER, T.BODE_COD, BO.BODE_NOM, TRAN_BODDES, BD.BODE_NOM, TRAN_OBS, TRAN_ANULADO
    FROM TRASFERENCIAS T, BODEGA BO, BODEGA BD, PREFIJOS PR
    WHERE T.BODE_COD = BO.BODE_COD AND T.TRAN_BODDES = BD.BODE_COD AND T.PREF_PRE >= :PREINI AND T.PREF_PRE <= :PREFIN AND TRAN_NUMERO >= :NUMINI AND TRAN_NUMERO <= :NUMFIN
     AND PR.PREF_PRE = T.PREF_PRE AND PR.TIDO_COD = 13 AND ((PR.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
    ORDER BY T.PREF_PRE, TRAN_NUMERO
    into :ID, :PREF, :NUMERO, :FECHA, :CONCEPTO, :REFER, :CODBODORI, :NOMBODORI, :CODBODDES, :NOMBODDES, :OBS, :ANULADO
    DO
        BEGIN
        if ((:ANULADOS = 'S') or (:ANULADO = 'N')) then
            BEGIN
            if (anulado = 'S') then
             BEGIN
              ITEM = 0;
              ARTICULO = '';
              CODBAR = '';
              ARTIDES = '';
              CANT = 0;
              UNIDAD = '';
              BODITEM = '';
              lote = '';
              costo = 0;
              DTOPORC = 0;
              DTOMONTO = 0;
              IVAPORC = 0;
              IVAMONTO = 0;
              CONSUMO = 0;
              TOTAL = 0;
              OBSITEM = null;
              SUBTOTAL = 0;
              SUSPEND;
             END
            ELSE
             BEGIN
              if (DETALLE = 'S') then
                FOR SELECT TRAS_ITEM, A.ARTI_COD, TRAS_CODBAR, TRAS_DESC, TRAS_CANT, TRAS_UNIDAD, TRAS_COSTO, TRAS_IVAPORC, TRAS_IVAMONTO, TRAS_CONSUMO, TRAS_TOTAL, TRAS_LOTE, TRAS_OBS
                FROM TRASFERENCIAS_DETALLE D, ARTICULO A
                WHERE D.ARTI_COD = A.ARTI_COD AND D.TRAN_ID = :ID
                ORDER BY TRAS_ITEM
                INTO :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :COSTO, :IVAPORC, :IVAMONTO, :CONSUMO, :TOTAL, :LOTE, :OBSITEM
                    DO
                    BEGIN
                    SUBTOTAL = TOTAL - IVAMONTO - CONSUMO;
                    SUSPEND;
                    END
              ELSE
                BEGIN
                SELECT SUM(TRAS_IVAMONTO), SUM(TRAS_CONSUMO), SUM(TRAS_TOTAL) FROM trasferencias_detalle D WHERE D.TRAN_ID = :ID INTO
                    :IVAMONTO, :CONSUMO, :TOTAL;
                SUBTOTAL = TOTAL - IVAMONTO - CONSUMO;
                SUSPEND;
                END
             END
            END
        END
    END
  if (BIN_AND(TIPO, 8) <> 0) then
    BEGIN
    SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 14 INTO :NOMTIPO;
    FOR SELECT AJUS_ID, A.PREF_PRE, AJUS_NUMERO, AJUS_FECHA, AJUS_CONC, A.BODE_COD, BODE_NOM, AJUS_OBS, AJUS_ANULADO
    FROM AJUSTES A, BODEGA B, PREFIJOS PR
    WHERE A.BODE_COD = B.BODE_COD AND A.PREF_PRE >= :PREINI AND A.PREF_PRE <= :PREFIN AND AJUS_NUMERO >= :NUMINI AND AJUS_NUMERO <= :NUMFIN
     AND PR.PREF_PRE = A.PREF_PRE AND PR.TIDO_COD = 14 AND ((PR.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
    ORDER BY A.PREF_PRE, AJUS_NUMERO
    into :ID, :PREF, :NUMERO, :FECHA, :CONCEPTO, :CODBODORI, :NOMBODORI, :OBS, :ANULADO
    DO
        BEGIN
        if ((:ANULADOS = 'S') or (:ANULADO = 'N')) then
            BEGIN
            if (anulado = 'S') then
             BEGIN
              ITEM = 0;
              ARTICULO = '';
              CODBAR = '';
              ARTIDES = '';
              CANT = 0;
              UNIDAD = '';
              BODITEM = '';
              lote = '';
              costo = 0;
              DTOPORC = 0;
              DTOMONTO = 0;
              IVAPORC = 0;
              IVAMONTO = 0;
              CONSUMO = 0;
              EXANT = 0;
              TOTAL = 0;
              OBSITEM = null;
              SUBTOTAL = 0;
              SUSPEND;
             END
            ELSE
             BEGIN
              if (DETALLE = 'S') then
                FOR SELECT AJUS_ITEM, A.ARTI_COD, AJUS_CODBAR, AJDE_DESC, AJUS_EXANT, AJUS_UNIDAD, BODE_COD, AJUS_EXNUE, AJUS_LOTE, AJDE_OBS
                FROM AJUSTES_DETALLE D, ARTICULO A
                WHERE D.ARTI_COD = A.ARTI_COD AND D.AJUS_ID = :ID
                ORDER BY AJUS_ITEM
                INTO :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :EXANT, :UNIDAD, :BODITEM, :CANT, :LOTE, :OBSITEM
                    DO
                      BEGIN
                      TOTAL = (CANT - EXANT) * COSTO;
                      SUBTOTAL = TOTAL;
                      SUSPEND;
                      END
              ELSE
                BEGIN
                TOTAL = 0;
                FOR SELECT ARTI_COD, AJUS_EXNUE, AJUS_EXANT FROM AJUSTES_DETALLE D WHERE D.AJUS_ID = :ID INTO
                    :ARTICULO, :CANT, :EXANT
                    DO
                      BEGIN
                      EXECUTE PROCEDURE COSTO_PROMEDIO(:ARTICULO, :FECHA) returning_values (:COSTO);
                      TOTAL = TOTAL + ((CANT - EXANT) * COSTO);
                      SUBTOTAL = TOTAL;
                      END
                SUSPEND;
                END
             END
            END
        END
    END
  if (BIN_AND(TIPO, 16) <> 0) then
    BEGIN
    SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 15 INTO :NOMTIPO;
    FOR SELECT ENSA_ID, E.PREF_PRE, ENSA_NUMERO, ENSA_FECHA, ENSA_CONC, ENSA_REFER, E.BODE_COD, BODE_NOM, ENSA_CODBAR, ENSA_DESC, ENSA_CANT, ENSA_UNIDAD, ENSA_LOTE, ENSA_OBS, ENSA_ANULADO
    FROM ENSAMBLES E, BODEGA B, PREFIJOS PR
    WHERE E.BODE_COD = B.BODE_COD AND E.PREF_PRE >= :PREINI AND E.PREF_PRE <= :PREFIN AND ENSA_NUMERO >= :NUMINI AND ENSA_NUMERO <= :NUMFIN
     AND PR.PREF_PRE = E.PREF_PRE AND PR.TIDO_COD = 15 AND ((PR.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
    ORDER BY E.PREF_PRE, ENSA_NUMERO
    into :ID, :PREF, :NUMERO, :FECHA, :CONCEPTO, :REFER, :CODBODORI, :NOMBODORI, :PRODCODBAR, :PRODDES, :PRODCANT, :PRODUNIDAD, :PRODLOTE, :OBS, :ANULADO
    DO
        BEGIN
        if ((:ANULADOS = 'S') or (:ANULADO = 'N')) then
            BEGIN
            if (anulado = 'S') then
             BEGIN
              ITEM = 0;
              ARTICULO = '';
              CODBAR = '';
              ARTIDES = '';
              CANT = 0;
              UNIDAD = '';
              BODITEM = '';
              lote = '';
              costo = 0;
              DTOPORC = 0;
              DTOMONTO = 0;
              IVAPORC = 0;
              IVAMONTO = 0;
              CONSUMO = 0;
              TOTAL = 0;
              OBSITEM = null;
              SUBTOTAL = 0;
              SUSPEND;
             END
            ELSE
             BEGIN
              if (DETALLE = 'S') then
                FOR SELECT ESDE_ITEM, A.ARTI_COD, ESDE_CODBAR, ESDE_DESC, ESDE_CANT, ESDE_UNIDAD, BODE_COD, ESDE_COSTO, ESDE_IVAPORC, ESDE_IVAMONTO, ESDE_CONSUMO, ESDE_TOTAL, ESDE_LOTE, ESDE_OBS
                FROM ensambles_detalle D, ARTICULO A
                WHERE D.ARTI_COD = A.ARTI_COD AND D.ENSA_ID = :ID
                ORDER BY ESDE_ITEM
                INTO :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :BODITEM, :COSTO, :IVAPORC, :IVAMONTO, :CONSUMO, :TOTAL, :LOTE, :OBSITEM
                    DO
                    BEGIN
                    SUBTOTAL = TOTAL - IVAMONTO - CONSUMO;
                    SUSPEND;
                    END
              ELSE
                BEGIN
                SELECT SUM(ESDE_IVAMONTO), SUM(ESDE_CONSUMO), SUM(ESDE_TOTAL) FROM ENSAMBLES_detalle D WHERE D.ENSA_ID = :ID INTO
                    :IVAMONTO, :CONSUMO, :TOTAL;
                SUBTOTAL = TOTAL - IVAMONTO - CONSUMO;
                SUSPEND;
                END
             END
            END
        END
    END
  if (BIN_AND(TIPO, 32) <> 0) then
    BEGIN
    SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 16 INTO :NOMTIPO;
    FOR SELECT DESE_ID, E.PREF_PRE, DESE_NUMERO, DESE_FECHA, DESE_CONC, DESE_REFER, E.BODE_COD, BODE_NOM, DESE_CODBAR, DESE_DESC, DESE_CANT, DESE_UNIDAD, DESE_LOTE, DESE_OBS, DESE_ANULADO
    FROM DESENSAMBLES E, BODEGA B, PREFIJOS PR
    WHERE E.BODE_COD = B.BODE_COD AND E.PREF_PRE >= :PREINI AND E.PREF_PRE <= :PREFIN AND DESE_NUMERO >= :NUMINI AND DESE_NUMERO <= :NUMFIN
     AND PR.PREF_PRE = E.PREF_PRE AND PR.TIDO_COD = 16 AND ((PR.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
    ORDER BY E.PREF_PRE, DESE_NUMERO
    into :ID, :PREF, :NUMERO, :FECHA, :CONCEPTO, :REFER, :CODBODORI, :NOMBODORI, :PRODCODBAR, :PRODDES, :PRODCANT, :PRODUNIDAD, :PRODLOTE, :OBS, :ANULADO
    DO
        BEGIN
        if ((:ANULADOS = 'S') or (:ANULADO = 'N')) then
            BEGIN
            if (anulado = 'S') then
             BEGIN
              ITEM = 0;
              ARTICULO = '';
              CODBAR = '';
              ARTIDES = '';
              CANT = 0;
              UNIDAD = '';
              BODITEM = '';
              lote = '';
              costo = 0;
              DTOPORC = 0;
              DTOMONTO = 0;
              IVAPORC = 0;
              IVAMONTO = 0;
              CONSUMO = 0;
              TOTAL = 0;
              OBSITEM = null;
              SUBTOTAL = 0;
              SUSPEND;
             END
            ELSE
             BEGIN
              if (DETALLE = 'S') then
                FOR SELECT DESE_ITEM, A.ARTI_COD, DEDE_CODBAR, DEDE_DESC, DEDE_CANT, DEDE_UNIDAD, BODE_COD, DEDE_COSTO, DEDE_IVAPORC, DEDE_IVAMONTO, DEDE_CONSUMO, DEDE_TOTAL, DEDE_LOTE, DEDE_OBS
                FROM DESensambles_detalle D, ARTICULO A
                WHERE D.ARTI_COD = A.ARTI_COD AND D.DESE_ID = :ID
                ORDER BY DESE_ITEM
                INTO
                    :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :BODITEM, :COSTO, :IVAPORC, :IVAMONTO, :CONSUMO, :TOTAL, :LOTE, :OBSITEM
                    DO
                    BEGIN
                    SUBTOTAL = TOTAL - IVAMONTO - CONSUMO;
                    SUSPEND;
                    END
              ELSE
                BEGIN
                SELECT SUM(DEDE_IVAMONTO), SUM(DEDE_CONSUMO), SUM(DEDE_TOTAL) FROM DESENSAMBLES_detalle D WHERE D.DESE_ID = :ID INTO
                    :IVAMONTO, :CONSUMO, :TOTAL;
                SUBTOTAL = TOTAL - IVAMONTO - CONSUMO;
                SUSPEND;
                END
             END
            END
        END
    END
  if (BIN_AND(TIPO, 64) <> 0) then
    BEGIN
    SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 17 INTO :NOMTIPO;
    FOR SELECT RESE_ID, R.PREF_PRE, RESE_NUMERO, RESE_FECHA, RESE_CONC, RESE_REFER, R.BODE_COD, BODE_NOM, RESE_NOMTERC, RESE_OBS, RESE_ANULADO
    FROM RESERVAS R, BODEGA B, PREFIJOS PR
    WHERE R.BODE_COD = B.BODE_COD AND R.PREF_PRE >= :PREINI AND R.PREF_PRE <= :PREFIN AND RESE_NUMERO >= :NUMINI AND RESE_NUMERO <= :NUMFIN
     AND PR.PREF_PRE = R.PREF_PRE AND PR.TIDO_COD = 17 AND ((PR.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
    ORDER BY R.PREF_PRE, RESE_NUMERO
    into :ID, :PREF, :NUMERO, :FECHA, :CONCEPTO, :REFER, :CODBODORI, :NOMBODORI, :NOMTERCERO, :OBS, :ANULADO
    DO
        BEGIN
        if ((:ANULADOS = 'S') or (:ANULADO = 'N')) then
            BEGIN
            if (anulado = 'S') then
             BEGIN
              ITEM = 0;
              ARTICULO = '';
              CODBAR = '';
              ARTIDES = '';
              CANT = 0;
              UNIDAD = '';
              BODITEM = '';
              lote = '';
              costo = 0;
              DTOPORC = 0;
              DTOMONTO = 0;
              IVAPORC = 0;
              IVAMONTO = 0;
              CONSUMO = 0;
              EXANT = 0;
              TOTAL = 0;
              OBSITEM = null;
              SUBTOTAL = 0;
              SUSPEND;
             END
            ELSE
             BEGIN
              if (DETALLE = 'S') then
                FOR SELECT RSDE_ITEM, A.ARTI_COD, RSDE_CODBAR, RSDE_DESC, RDSE_CANT, RSDE_UNIDAD, BODE_COD, RSDE_OBS
                FROM RESERVAS_DETALLE D, ARTICULO A
                WHERE D.ARTI_COD = A.ARTI_COD AND D.RESE_ID = :ID
                ORDER BY RSDE_ITEM
                INTO :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :BODITEM, :OBSITEM
                    DO
                    SUSPEND;
              ELSE
                BEGIN
                SELECT SUM(RDSE_CANT) FROM RESERVAS_detalle D WHERE D.RESE_ID = :ID INTO
                    :CANT;
                SUSPEND;
                END
             END
            END
        END
    END
  if (BIN_AND(TIPO, 128) <> 0) then
    BEGIN
    SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 18 INTO :NOMTIPO;
    FOR SELECT ORIN_ID, O.PREF_PRE, ORIN_NUMERO, ORIN_FECHA, ORIN_FECLLEGA, ORIN_CONC, ORIN_REFER, ORIN_NOMTERC, ORIN_OBS, ORIN_ANULADO
    FROM ORDENES_INVENTARIO O, PREFIJOS PR
    WHERE O.PREF_PRE >= :PREINI AND O.PREF_PRE <= :PREFIN AND ORIN_NUMERO >= :NUMINI AND ORIN_NUMERO <= :NUMFIN
     AND PR.PREF_PRE = O.PREF_PRE AND PR.TIDO_COD = 18 AND ((PR.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
    ORDER BY O.PREF_PRE, ORIN_NUMERO
    into :ID, :PREF, :NUMERO, :FECHA, :VENCE, :CONCEPTO, :REFER, :NOMTERCERO, :OBS, :ANULADO
    DO
        BEGIN
        if ((:ANULADOS = 'S') or (:ANULADO = 'N')) then
            BEGIN
            if (anulado = 'S') then
             BEGIN
              ITEM = 0;
              ARTICULO = '';
              CODBAR = '';
              ARTIDES = '';
              CANT = 0;
              UNIDAD = '';
              BODITEM = '';
              lote = '';
              costo = 0;
              DTOPORC = 0;
              DTOMONTO = 0;
              IVAPORC = 0;
              IVAMONTO = 0;
              CONSUMO = 0;
              EXANT = 0;
              TOTAL = 0;
              OBSITEM = null;
              SUBTOTAL = 0;
              SUSPEND;
             END
            ELSE
             BEGIN
              if (DETALLE = 'S') then
                FOR SELECT ORID_ITEM, A.ARTI_COD, ORID_CODBAR, ORID_DESC, ORID_CANT, ORID_UNIDAD, ORIN_COSTO, ORID_DTOPORC, ORID_DTOMONTO, ORID_IVAPORC, ORID_IVAMONTO, ORID_CONSUMO, ORID_TOTAL, ORID_OBS, ORID_LOTE
                FROM ORDENINVENTARIO_DETALLE D, ARTICULO A
                WHERE D.ARTI_COD = A.ARTI_COD AND D.ORIN_ID = :ID
                ORDER BY ORID_ITEM
                INTO :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :COSTO, :DTOPORC, :DTOMONTO, :IVAPORC, :IVAMONTO, :CONSUMO, :TOTAL, :OBSITEM, :LOTE
                    DO
                    BEGIN
                    SUBTOTAL = TOTAL - IVAMONTO - CONSUMO;
                    SUSPEND;
                    END
              ELSE
                BEGIN
                SELECT SUM(ORID_IVAMONTO), SUM(ORID_CONSUMO), SUM(ORID_TOTAL) FROM ordeninventario_detalle D WHERE D.ORIN_ID = :ID INTO
                    :IVAMONTO, :CONSUMO, :TOTAL;
                SUBTOTAL = TOTAL - IVAMONTO - CONSUMO;
                SUSPEND;
                END
             END
            END
        END
    END
END

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE REP_KARDEX_ARTICULO(
    DETALLE CHAR(1),
    FECINI DATE,
    FECFIN DATE,
    ARTINI VARCHAR(20),
    ARTFIN VARCHAR(20),
    GRPINI VARCHAR(2),
    GRPFIN VARCHAR(2),
    ORDEN CHAR(1),
    BODEGA VARCHAR(2))
RETURNS (
    CODIGO VARCHAR(15),
    NOMBRE VARCHAR(60),
    UNIDAD VARCHAR(8),
    CODGRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    CODSUBG VARCHAR(3),
    NOMSUBG VARCHAR(30),
    CODMARC VARCHAR(3),
    NOMMARC VARCHAR(30),
    CODBOD VARCHAR(2),
    SALDOINI NUMERIC(18,4),
    COSTOINI NUMERIC(18,2),
    ENTRADAS NUMERIC(18,4),
    COSTOENT NUMERIC(18,2),
    SALIDAS NUMERIC(18,4),
    COSTOSAL NUMERIC(18,2),
    SALDOFIN NUMERIC(18,4),
    COSTOFIN NUMERIC(18,2),
    TIPODOC VARCHAR(8),
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    CONCEPTO VARCHAR(60),
    NIT VARCHAR(20),
    CONS INTEGER,
    CANFINAL NUMERIC(18,4),
    COSFINAL NUMERIC(18,2))
AS
DECLARE VARIABLE ENTRADA CHAR(1);
DECLARE VARIABLE CANT NUMERIC(18,4);
DECLARE VARIABLE COSTO NUMERIC(18,2);
DECLARE VARIABLE CODINI VARCHAR(20);
DECLARE VARIABLE CODFIN VARCHAR(20);
DECLARE VARIABLE DESINI VARCHAR(20);
DECLARE VARIABLE DESFIN VARCHAR(20);
BEGIN
if (ORDEN = 'C') then
    BEGIN
    CODINI = ARTINI;
    CODFIN = ARTFIN;
    DESINI = '';
    DESFIN = 'zz';
    END
ELSE
    BEGIN
    DESINI = ARTINI;
    DESFIN = ARTFIN;
    CODINI = '';
    CODFIN = 'zz';
    END
  FOR
    SELECT ARTI_COD, ARTI_DES, ARTI_UNIDAD, A.GRUP_COD, A.SUBG_COD, A.MARC_COD
      FROM ARTICULO A
      WHERE ARTI_COD >= :CODINI AND ARTI_COD <= :CODFIN AND A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :GRPFIN AND ARTI_DES >= :DESINI AND ARTI_DES <= :DESFIN AND A.ESAR_COD <> 'I'
      INTO :CODIGO, :NOMBRE, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
      DO
        BEGIN
        NOMMARC = '';
        NOMSUBG = '';
        SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
        SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
        SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
        if (BODEGA = '') then
            BEGIN
            EXECUTE PROCEDURE SALDO_INICIAL_TOTAL_INV(CODIGO, FECINI) returning_values (:SALDOINI);
            EXECUTE PROCEDURE VALOR_INICIAL_INVENTARIO(CODIGO, FECINI) returning_values (COSTOINI);
            END
        ELSE
            BEGIN
            EXECUTE PROCEDURE SALDO_INICIAL_INVENTARIO(CODIGO, FECINI, :BODEGA) returning_values (SALDOINI);
            EXECUTE PROCEDURE COSTO_PROMEDIO(CODIGO, FECINI-1) returning_values (COSTOINI);
            COSTOINI = COSTOINI * saldoini;
            END
        if (DETALLE = 'N') then
            BEGIN
            /* SUME LAS ENTRADAS */
            if (BODEGA = '') then
              SELECT SUM(COST_ENTC), SUM(COST_ENTP), SUM(COST_SALC), SUM(COST_SALP) FROM COSTOS
                WHERE (COST_FECHA >= :FECINI) AND (COST_FECHA <= :FECFIN) AND (ARTI_COD = :codigo)
                INTO :ENTRADAS, :COSTOENT, :SALIDAS, :COSTOSAL;
            ELSE
              SELECT SUM(COST_ENTC), SUM(COST_ENTP), SUM(COST_SALC), SUM(COST_SALP)
                FROM COSTOS C, MOVIMIENTO_ARTICULO M
                WHERE (COST_FECHA >= :FECINI) AND (COST_FECHA <= :FECFIN) AND (C.ARTI_COD = :codigo) AND C.cost_idmov = M.mvar_cons AND BODE_COD = :BODEGA
                INTO :ENTRADAS, :COSTOENT, :SALIDAS, :COSTOSAL;

            if (ENTRADAS IS NULL) then
              ENTRADAS = 0;
            if (COSTOENT IS NULL) then
              COSTOENT = 0;
            if (SALIDAS IS NULL) then
              SALIDAS = 0;
            if (COSTOSAL IS NULL) then
              COSTOSAL = 0;
            SALDOFIN = SALDOINI + ENTRADAS - SALIDAS;
            COSTOFIN = COSTOINI + COSTOENT - COSTOSAL;
            if (BODEGA = '') then
                BEGIN
                EXECUTE PROCEDURE SALDO_INICIAL_TOTAL_INV(CODIGO, fecfin+1) returning_values (canfinal);
                EXECUTE PROCEDURE VALOR_INICIAL_INVENTARIO(CODIGO, FECFIN+1) returning_values (cosfinal);
                END
            ELSE
                BEGIN
                EXECUTE PROCEDURE SALDO_INICIAL_INVENTARIO(CODIGO, FECFIN+1, :BODEGA) returning_values (CANFINAL);
                EXECUTE PROCEDURE COSTO_PROMEDIO(CODIGO, FECFIN+1) returning_values (COSFINAL);
                COSFINAL = COSFINAL * CANFINAL;
                END
            SUSPEND;
            END
        ELSE
            BEGIN
            SALDOFIN = SALDOINI;
            COSTOFIN = COSTOINI;
            COSTOENT = 0;
            COSTOSAL = 0;
            FOR SELECT TIDO_NOMCORTO, MVAR_ENTRADA, MVAR_PREF, MVAR_NUMERO, MVAR_CANT, MVAR_COSTO, MVAR_CONC, MVAR_FECHA, M.TERC_NIT, MVAR_CONS, BODE_COD, COST_SALDOP, COST_SALDOC
                FROM MOVIMIENTO_ARTICULO M, TIPO_DOCUMENTO TD, COSTOS C
                WHERE TD.TIDO_COD = MVAR_TIPODOC AND (MVAR_FECHA >= :FECINI) AND (MVAR_FECHA <= :FECFIN) AND (MVAR_TIPODOC <> 13) AND (m.ARTI_COD = :CODIGO) AND M.mvar_cons = C.cost_idmov
                ORDER BY MVAR_FECHA, MVAR_CONS
                INTO :TIPODOC, :ENTRADA, :PREFIJO, :NUMERO, :ENTRADAS, :COSTOENT, :CONCEPTO, :FECHA, :NIT, :CONS, :CODBOD, :costo, :cant
                DO
                    BEGIN
                    if (ENTRADA = 'S') then
                        BEGIN
                        SALIDAS = 0;
                        SALDOFIN = SALDOFIN + ENTRADAS;
                        COSTOFIN = COSTOFIN + (ENTRADAS * COSTOENT);
                        if (CANT > 0) then
                            COSTOSAL = COSTO / CANT;
                        else
                            COSTOSAL = 0;
                        end
                    ELSE
                        BEGIN
                        SALIDAS = ENTRADAS;
                        ENTRADAS = 0;
                        if (CANT > 0) then
                            COSTOSAL = COSTO / CANT;
                        else
                            COSTOSAL = 0;
                        SALDOFIN = SALDOFIN - SALIDAS;
                        COSTOFIN = COSTOFIN - (SALIDAS * costosal);
                        END
                    SUSPEND;
                    END
            END
        END
END

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE REP_PRODUCTOS(
    ORDEN CHAR(1),
    DESDE VARCHAR(15),
    HASTA VARCHAR(15),
    FECHA DATE)
RETURNS (
    CODIGO VARCHAR(15),
    DESCR VARCHAR(60),
    GRUPCOD VARCHAR(2),
    GRUPNOM VARCHAR(30),
    SUBGCOD VARCHAR(3),
    SUBGNOM VARCHAR(30),
    MARCCOD VARCHAR(3),
    MARCNOM VARCHAR(30),
    ESTADO CHAR(1),
    UNIDAD VARCHAR(8),
    CODCOMP VARCHAR(15),
    DESCOMP VARCHAR(60),
    CANT NUMERIC(18,4),
    UNDCOMP VARCHAR(8),
    CODBARCOMP VARCHAR(15),
    COSTO NUMERIC(18,2),
    TOTAL NUMERIC(18,2))
AS
BEGIN
  FOR SELECT ARTI_COD, ARTI_DES, ARTI_UNIDAD, A.GRUP_COD, GRUP_NOM, A.SUBG_COD, A.MARC_COD, A.esar_cod
  FROM ARTICULO A, GRUPO G, estado_articulo E
  WHERE A.GRUP_COD = G.GRUP_COD AND A.ESAR_COD = E.ESAR_COD AND ARTI_COD IN (SELECT DISTINCT ARTI_COD FROM ARTICULOS_PRODUCTO)
  INTO :CODIGO, :DESCR, :unidad, :GRUPCOD, :GRUPNOM, :SUBGCOD, :MARCCOD, :ESTADO
  DO
    if ((ORDEN = 'C' AND CODIGO >= :DESDE AND CODIGO <= :HASTA) OR
        (ORDEN = 'D' AND DESCR >= :DESDE AND DESCR <= :HASTA)) then
        BEGIN
        SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :MARCCOD INTO MARCNOM;
        SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :SUBGCOD AND GRUP_COD = :GRUPCOD INTO :SUBGNOM;
        FOR SELECT ARPR_COMP, ARTI_DES, ARPR_CODBAR, ARPR_CANT, ARPR_UNIDAD
        FROM ARTICULOS_PRODUCTO P, ARTICULO A
        WHERE P.ARTI_COD = :CODIGO AND P.ARPR_COMP = A.ARTI_COD
          INTO :CODCOMP, :DESCOMP, :CODBARCOMP, :CANT, :UNDCOMP
          DO
            begin
            EXECUTE PROCEDURE COSTO_PROMEDIO (:CODCOMP, :FECHA) returning_values (:COSTO);
            EXECUTE PROCEDURE CANTIDAD_POR_FACTOR (:CODCOMP, :CANT, :UNDCOMP) returning_values (:CANT);
            TOTAL = COSTO * CANT;
            SUSPEND;
            END
        END
END

^

SET TERM ; ^

SET TERM ^ ;

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

        FOR SELECT MAX(T.TERC_NIT), MAX(TERC_NOM), MAX(TERC_TEL), MAX(TERC_CIU), MAX(ZONA_COD), MAX(D.ARTI_COD), SUM(FADE_CANT * FADE_FACTOR), SUM(FACT_FACTOR*(FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO)),
            SUM(FACT_FACTOR*FADE_IVAMONTO), SUM(FACT_FACTOR*FADE_TOTAL),
            MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD), max(f.fact_sucursal)
            FROM FACTURAS_DETALLE D, FACTURAS F, PREFIJOS P, terceros T, CLIENTES C, ARTICULO A
            WHERE C.TERC_NIT = T.TERC_NIT AND TERC_CLIE = 'S' AND F.terc_nit = T.terc_nit AND T.TERC_NIT >= :TERINI AND T.TERC_NIT <= :TERFIN AND
            F.FACT_ID = D.FACT_ID AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND FACT_ANULADO = 'N'
            AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) and substring(D.arti_cod from 1 FOR 2) <> '.t'
            AND D.ARTI_COD = A.arti_cod AND A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN
            GROUP BY T.TERC_NIT, f.fact_sucursal, D.ARTI_COD
            INTO :NIT, :NOMBRE, :TELEFONO, :CIUDAD, :CODZONA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :TOTAL,
            :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :sucursal
            DO
            BEGIN
            COSTO = 0;
            FOR SELECT FADE_CANT * FADE_FACTOR, FACT_FECHA FROM FACTURAS_DETALLE D, FACTURAS F, PREFIJOS P
                WHERE F.TERC_NIT = :NIT AND F.FACT_ID = D.FACT_ID AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND
                FACT_ANULADO = 'N' AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                and D.ARTI_COD = :articulo  INTO :cantdet, :fecha
                DO
                BEGIN
                EXECUTE PROCEDURE COSTO_PROMEDIO(:ARTICULO, :FECHA) returning_values (:costounit);
                COSTO = COSTO + costounit * cantdet;
                END
            SELECT ZONA_NOM FROM ZONAS WHERE ZONA_COD = :CODZONA INTO :NOMZONA;
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            if (CEROS = 'S') then
                INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (3, USER, :ARTICULO);
            SUSPEND;
            END /* FOR */
        if (CEROS = 'S') then
            BEGIN
            COSTO = 0;
            UTILIDAD = 0;
            PORC = 0;
            /* agregue los articulos sin factura */
            FOR SELECT ARTI_COD, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN
                INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                DO
                BEGIN
                SELECT COUNT(REPA_ARTICULO) FROM REPORTES_AUX WHERE REPA_ID = 3 AND REPA_USER = USER AND REPA_ARTICULO = :articulo INTO :numrows;
                if (numrows = 0) then
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        END
    if (BIN_AND(TIPO, 2) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 32 INTO :NOMTIPO;
        /* BORRA LA TABLA AUXILIAR */
        DELETE FROM reportes_aux WHERE REPA_ID = 3 AND REPA_USER = USER;

        FOR SELECT MAX(T.TERC_NIT), MAX(TERC_NOM), MAX(TERC_TEL), MAX(TERC_CIU), MAX(ZONA_COD), MAX(D.ARTI_COD), SUM(RVDE_CANT * RVDE_FACTOR), SUM(RVDE_TOTAL-RVDE_IVAMONTO-RVDE_CONSUMO), SUM(RVDE_IVAMONTO), SUM(RVDE_TOTAL),
            MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD), max(r.revt_sucursal)
            FROM REMISIONES_VENTA_DETALLE D, REMISIONES_VENTA R, PREFIJOS P, terceros T, CLIENTES C, ARTICULO A
            WHERE C.TERC_NIT = T.TERC_NIT AND TERC_CLIE = 'S' AND R.terc_nit = T.terc_nit AND T.TERC_NIT >= :TERINI AND T.TERC_NIT <= :TERFIN AND
            R.REVT_ID = D.REVT_ID AND REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN AND REVT_ANULADO = 'N'
            AND P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = 32 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            AND D.ARTI_COD = A.arti_cod AND A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN
            GROUP BY T.TERC_NIT, r.revt_sucursal, D.ARTI_COD
            INTO :NIT, :NOMBRE, :TELEFONO, :CIUDAD, :CODZONA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :TOTAL,
                :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :sucursal
            DO
                BEGIN
                COSTO = 0;
                FOR SELECT RVDE_CANT * RVDE_FACTOR, REVT_FECHA
                    FROM REMISIONES_VENTA_DETALLE D, REMISIONES_VENTA R, PREFIJOS P
                    WHERE R.terc_nit = :nit AND R.REVT_ID = D.REVT_ID AND REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN AND REVT_ANULADO = 'N'
                    AND P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = 32 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                    AND D.ARTI_COD = :articulo INTO :cantdet, :fecha
                    DO
                    BEGIN
                    EXECUTE PROCEDURE COSTO_PROMEDIO(:ARTICULO, :FECHA) returning_values (:costounit);
                    COSTO = COSTO + costounit * cantdet;
                    END
                SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                if (CANTIDAD IS NULL) then
                    CANTIDAD = 0;
                if (BASE IS NULL) then
                    BASE = 0;
                if (IVA IS NULL) then
                    IVA = 0;
                UTILIDAD = BASE - COSTO;
                if (UOM = 'UTILIDAD') then
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                else
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            if (CEROS = 'S') then
                INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (3, USER, :ARTICULO);
            SUSPEND;
            END /* FOR */
        if (CEROS = 'S') then
            BEGIN
            COSTO = 0;
            UTILIDAD = 0;
            PORC = 0;
            /* agregue los articulos sin factura */
            FOR SELECT ARTI_COD, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN
                INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                DO
                BEGIN
                SELECT COUNT(REPA_ARTICULO) FROM REPORTES_AUX WHERE REPA_ID = 3 AND REPA_USER = USER AND REPA_ARTICULO = :articulo INTO :numrows;
                if (numrows = 0) then
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        END
    if (BIN_AND(TIPO, 4) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 33 INTO :NOMTIPO;
        /* BORRA LA TABLA AUXILIAR */
        DELETE FROM reportes_aux WHERE REPA_ID = 3 AND REPA_USER = USER;

        FOR SELECT MAX(T.TERC_NIT), MAX(TERC_NOM), MAX(TERC_TEL), MAX(TERC_CIU), MAX(ZONA_COD), MAX(D.ARTI_COD), SUM(DVDE_CANT * DVDE_FACTOR), SUM(DEVT_FACTOR*(DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO)),
            SUM(DEVT_FACTOR*DVDE_IVAMONTO), SUM(DEVT_FACTOR*DVDE_TOTAL),
            MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD), max(v.devt_sucursal)
            FROM devoluciones_ventas_detalle D, DEVOLUCIONES_VENTAS V, PREFIJOS P, terceros T, CLIENTES C, ARTICULO A
            WHERE C.TERC_NIT = T.TERC_NIT AND TERC_CLIE = 'S' AND V.terc_nit = T.terc_nit AND T.TERC_NIT >= :TERINI AND T.TERC_NIT <= :TERFIN AND
            V.DEVT_ID = D.DEVT_ID AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND DEVT_ANULADO = 'N'
            AND P.PREF_PRE = V.PREF_PRE AND P.TIDO_COD = 33 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) and substring(D.arti_cod from 1 FOR 2) <> '.t'
            AND D.ARTI_COD = A.arti_cod AND A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN
            GROUP BY T.TERC_NIT, v.devt_sucursal, D.ARTI_COD
            INTO :NIT, :NOMBRE, :TELEFONO, :CIUDAD, :CODZONA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :TOTAL,
                :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :sucursal
            DO
            BEGIN
            COSTO = 0;
            FOR SELECT DVDE_CANT * DVDE_FACTOR, DEVT_FECHA
                FROM devoluciones_ventas_detalle D, DEVOLUCIONES_VENTAS V, PREFIJOS P
                WHERE V.terc_nit = :nit AND V.DEVT_ID = D.DEVT_ID AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND DEVT_ANULADO = 'N'
                AND P.PREF_PRE = V.PREF_PRE AND P.TIDO_COD = 33 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                AND D.ARTI_COD = :articulo INTO :cantdet, :fecha
                DO
                BEGIN
                EXECUTE PROCEDURE COSTO_PROMEDIO(:ARTICULO, :FECHA) returning_values (:costounit);
                COSTO = COSTO + costounit * cantdet;
                END
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            TOTAL = TOTAL * -1;
            IVA = IVA * -1;
            BASE = BASE * -1;
            CANTIDAD = CANTIDAD * -1;
            COSTO = COSTO * -1;
            UTILIDAD = UTILIDAD * -1;
            if (CEROS = 'S') then
                INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (3, USER, :ARTICULO);
            SUSPEND;
            END /* FOR */
        if (CEROS = 'S') then
            BEGIN
            COSTO = 0;
            UTILIDAD = 0;
            PORC = 0;
            /* agregue los articulos sin factura */
            FOR SELECT ARTI_COD, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN
                INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                DO
                BEGIN
                SELECT COUNT(REPA_ARTICULO) FROM REPORTES_AUX WHERE REPA_ID = 3 AND REPA_USER = USER AND REPA_ARTICULO = :articulo INTO :numrows;
                if (numrows = 0) then
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        END
    if (BIN_AND(TIPO, 8) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 34 INTO :NOMTIPO;
        /* BORRA LA TABLA AUXILIAR */
        DELETE FROM reportes_aux WHERE REPA_ID = 3 AND REPA_USER = USER;

        FOR SELECT MAX(T.TERC_NIT), MAX(TERC_NOM), MAX(TERC_TEL), MAX(TERC_CIU), MAX(ZONA_COD), MAX(D.ARTI_COD), SUM(PEDE_CANT * PEDE_FACTOR),
            SUM(PEDI_FACTOR*(PEDE_TOTAL-PEDE_IVAMONTO-PEDE_CONSUMO)), SUM(PEDI_FACTOR*PEDE_IVAMONTO), SUM(PEDI_FACTOR*PEDE_TOTAL),
            MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD), max(p.pedi_sucursal)
            FROM PEDIDOS_DETALLE D, PEDIDOS P, PREFIJOS PR, terceros T, CLIENTES C, ARTICULO A
            WHERE C.TERC_NIT = T.TERC_NIT AND TERC_CLIE = 'S' AND P.terc_nit = T.terc_nit AND T.TERC_NIT >= :TERINI AND T.TERC_NIT <= :TERFIN AND
            P.PEDI_ID = D.PEDI_ID AND PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND PEDI_ANULADO = 'N'
            AND PR.PREF_PRE = P.PREF_PRE AND P.TIDO_COD = 34 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY T.TERC_NIT, p.pedi_sucursal, D.ARTI_COD
            INTO :NIT, :NOMBRE, :TELEFONO, :CIUDAD, :CODZONA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :TOTAL,
                :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :sucursal
            DO
            BEGIN
            COSTO = 0;
            FOR SELECT PEDE_CANT * PEDE_FACTOR, PEDI_FECHA
                FROM PEDIDOS_DETALLE D, PEDIDOS PE, PREFIJOS P
                WHERE PE.terc_nit = :nit AND PE.PEDI_ID = D.PEDI_ID AND PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND PEDI_ANULADO = 'N'
                AND P.PREF_PRE = PE.PREF_PRE AND P.TIDO_COD = 34 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                AND D.ARTI_COD = :articulo INTO :cantdet, :fecha
                DO
                BEGIN
                EXECUTE PROCEDURE COSTO_PROMEDIO(:ARTICULO, :FECHA) returning_values (:costounit);
                COSTO = COSTO + costounit * cantdet;
                END
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            if (CEROS = 'S') then
                INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (3, USER, :ARTICULO);
            SUSPEND;
            END /* FOR */
        if (CEROS = 'S') then
            BEGIN
            COSTO = 0;
            UTILIDAD = 0;
            PORC = 0;
            /* agregue los articulos sin factura */
            FOR SELECT ARTI_COD, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN
                INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                DO
                BEGIN
                SELECT COUNT(REPA_ARTICULO) FROM REPORTES_AUX WHERE REPA_ID = 3 AND REPA_USER = USER AND REPA_ARTICULO = :articulo INTO :numrows;
                if (numrows = 0) then
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        END
    if (BIN_AND(TIPO, 16) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 35 INTO :NOMTIPO;
        /* BORRA LA TABLA AUXILIAR */
        DELETE FROM reportes_aux WHERE REPA_ID = 3 AND REPA_USER = USER;

        FOR SELECT MAX(T.TERC_NIT), MAX(TERC_NOM), MAX(TERC_TEL), MAX(TERC_CIU), MAX(ZONA_COD), MAX(D.ARTI_COD), SUM(CTDE_CANT * CTDE_FACTOR),
            SUM(COTI_FACTOR*(CTDE_TOTAL-CTDE_IVAMONTO-CTDE_CONSUMO)), SUM(COTI_FACTOR*CTDE_IVAMONTO), SUM(COTI_FACTOR*CTDE_TOTAL),
            MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD), max(ct.coti_sucursal)
            FROM COTIZACIONES_DETALLE D, COTIZACIONES CT, PREFIJOS P, terceros T, CLIENTES C, ARTICULO A
            WHERE C.TERC_NIT = T.TERC_NIT AND TERC_CLIE = 'S' AND C.terc_nit = T.terc_nit AND T.TERC_NIT >= :TERINI AND T.TERC_NIT <= :TERFIN AND
            CT.COTI_ID = D.COTI_ID AND COTI_FECHA >= :FECINI AND COTI_FECHA <= :FECFIN AND COTI_ANULADO = 'N'
            AND P.PREF_PRE = CT.PREF_PRE AND P.TIDO_COD = 35 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY T.TERC_NIT, ct.coti_sucursal, D.ARTI_COD
            INTO :NIT, :NOMBRE, :TELEFONO, :CIUDAD, :CODZONA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :TOTAL,
                :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :sucursal
            DO
            BEGIN
            COSTO = 0;
            FOR SELECT CTDE_CANT * CTDE_FACTOR, COTI_FECHA
                FROM COTIZACIONES_DETALLE D, COTIZACIONES C, PREFIJOS P
                WHERE C.terc_nit = :nit AND C.COTI_ID = D.coti_id AND COTI_FECHA >= :FECINI AND COTI_FECHA <= :FECFIN AND COTI_ANULADO = 'N'
                AND P.PREF_PRE = C.PREF_PRE AND P.TIDO_COD = 35 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                AND D.ARTI_COD = :articulo INTO :cantdet, :fecha
                DO
                BEGIN
                EXECUTE PROCEDURE COSTO_PROMEDIO(:ARTICULO, :FECHA) returning_values (:costounit);
                COSTO = COSTO + costounit * cantdet;
                END
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            EXECUTE PROCEDURE costo_promedio (:ARTICULO, :FECFIN) RETURNING_VALUES (:COSTOUNIT);
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            if (CEROS = 'S') then
                INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (3, USER, :ARTICULO);
            SUSPEND;
            END /* FOR */
        if (CEROS = 'S') then
            BEGIN
            COSTO = 0;
            UTILIDAD = 0;
            PORC = 0;
            /* agregue los articulos sin factura */
            FOR SELECT ARTI_COD, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN
                INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                DO
                BEGIN
                SELECT COUNT(REPA_ARTICULO) FROM REPORTES_AUX WHERE REPA_ID = 3 AND REPA_USER = USER AND REPA_ARTICULO = :articulo INTO :numrows;
                if (numrows = 0) then
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        END
    END
ELSE
    BEGIN
    if (BIN_AND(TIPO, 1) <> 0) then
            BEGIN
            SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 31 INTO :NOMTIPO;
            FOR SELECT F.PREF_PRE, FACT_NUMERO, FACT_FECHA, ARTI_COD, FADE_CANT * FADE_FACTOR, (FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO)*FACT_FACTOR,
                FADE_IVAMONTO*FACT_FACTOR, FADE_DTOPORC, FADE_TOTAL*FACT_FACTOR, F.terc_nit, F.fact_nomcliente, f.fact_sucursal
                FROM FACTURAS F, FACTURAS_DETALLE D, PREFIJOS P
                WHERE F.FACT_ID = D.FACT_ID AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND F.TERC_NIT >= :TERINI AND F.TERC_NIT <= :TERFIN AND FACT_ANULADO = 'N'
                 AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) and substring(D.arti_cod from 1 FOR 2) <> '.t'
                ORDER BY f.terc_nit, f.fact_sucursal, ARTI_COD, FACT_FECHA, F.FACT_ID, FADE_ITEM
                INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :DTO, :TOTAL, :NIT, :nombre, :sucursal
                DO
                BEGIN
                SELECT ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO WHERE ARTI_COD = :ARTICULO
                    INTO :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC;
                SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                EXECUTE PROCEDURE costo_promedio (:ARTICULO, :FECHA) RETURNING_VALUES (:COSTOUNIT);
                COSTO = COSTOUNIT * CANTIDAD;
                UTILIDAD = BASE - COSTO;
                if (UOM = 'UTILIDAD') then
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                else
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
                SUSPEND;
                END
            END
    if (BIN_AND(TIPO, 2) <> 0) then
            BEGIN
            SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 32 INTO :NOMTIPO;
            FOR SELECT R.PREF_PRE, REVT_NUMERO, REVT_FECHA, ARTI_COD, RVDE_CANT * RVDE_FACTOR,
                (RVDE_TOTAL - RVDE_IVAMONTO), RVDE_IVAMONTO, RVDE_DTOPORC, RVDE_TOTAL, R.terc_nit, R.revt_nomterc, r.revt_sucursal
                FROM REMISIONES_VENTA R, REMISIONES_VENTA_DETALLE D, PREFIJOS P
                WHERE R.REVT_ID = D.REVT_ID AND REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN AND R.TERC_NIT >= :TERINI AND R.TERC_NIT <= :TERFIN AND REVT_ANULADO = 'N'
                 AND P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = 32 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                ORDER BY r.terc_nit, r.revt_sucursal, ARTI_COD, REVT_FECHA, R.REVT_ID, RVDE_ITEM
                INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :DTO, :TOTAL, :NIT, :nombre, :sucursal
                DO
                BEGIN
                SELECT ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO WHERE ARTI_COD = :ARTICULO
                    INTO :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC;
                SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                EXECUTE PROCEDURE costo_promedio (:ARTICULO, :FECHA) RETURNING_VALUES (:COSTOUNIT);
                COSTO = COSTOUNIT * CANTIDAD;
                UTILIDAD = BASE - COSTO;
                if (UOM = 'UTILIDAD') then
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                else
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
                SUSPEND;
                END
            END
    if (BIN_AND(TIPO, 4) <> 0) then
            BEGIN
            SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 33 INTO :NOMTIPO;
            FOR SELECT V.PREF_PRE, DEVT_NUMERO, DEVT_FECHA, ARTI_COD, DVDE_CANT * DVDE_FACTOR, (DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO)*DEVT_FACTOR,
                DVDE_IVAMONTO*DEVT_FACTOR, DVDE_DTOPORC, DVDE_TOTAL*DEVT_FACTOR, V.terc_nit, V.devt_nomterc, v.devt_sucursal
                FROM DEVOLUCIONES_VENTAS V, DEVOLUCIONES_VENTAS_DETALLE D, PREFIJOS P
                WHERE V.DEVT_ID = D.DEVT_ID AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND V.TERC_NIT >= :TERINI AND V.TERC_NIT <= :TERFIN AND DEVT_ANULADO = 'N'
                 AND P.PREF_PRE = V.PREF_PRE AND P.TIDO_COD = 33 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))  and substring(D.arti_cod from 1 FOR 2) <> '.t'
                ORDER BY v.terc_nit, v.devt_sucursal, ARTI_COD, DEVT_FECHA, D.DEVT_ID, DVDE_ITEM
                INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :DTO, :TOTAL, :NIT, :nombre, :sucursal
                DO
                BEGIN
                SELECT ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO WHERE ARTI_COD = :ARTICULO
                    INTO :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC;
                SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                EXECUTE PROCEDURE costo_promedio (:ARTICULO, :FECHA) RETURNING_VALUES (:COSTOUNIT);
                COSTO = COSTOUNIT * CANTIDAD;
                UTILIDAD = BASE - COSTO;
                if (UOM = 'UTILIDAD') then
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                else
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
                TOTAL = TOTAL * -1;
                IVA = IVA * -1;
                BASE = BASE * -1;
                CANTIDAD = CANTIDAD * -1;
                COSTO = COSTO * -1;
                UTILIDAD = UTILIDAD * -1;
                SUSPEND;
                END
            END
    if (BIN_AND(TIPO, 8) <> 0) then
            BEGIN
            SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 34 INTO :NOMTIPO;
            FOR SELECT P.PREF_PRE, PEDI_NUMERO, PEDI_FECHA, ARTI_COD, PEDE_CANT * PEDE_FACTOR, (PEDE_TOTAL-PEDE_IVAMONTO-PEDE_CONSUMO)*PEDI_FACTOR,
                PEDE_IVAMONTO*PEDI_FACTOR, PEDE_DTOPORC, PEDE_TOTAL*PEDI_FACTOR, P.terc_nit, P.pedi_nomterc, p.pedi_sucursal
                FROM PEDIDOS P, PEDIDOS_DETALLE D, PREFIJOS PR
                WHERE P.PEDI_ID = D.PEDI_ID AND PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND P.TERC_NIT >= :TERINI AND P.TERC_NIT <= :TERFIN AND PEDI_ANULADO = 'N'
                 AND P.PREF_PRE = PR.PREF_PRE AND P.TIDO_COD = 34 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                ORDER BY p.terc_nit, p.pedi_sucursal, ARTI_COD, PEDI_FECHA, P.PEDI_ID, PEDE_ITEM
                INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :DTO, :TOTAL, :NIT, :nombre, :sucursal
                DO
                BEGIN
                SELECT ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO WHERE ARTI_COD = :ARTICULO
                    INTO :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC;
                SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                EXECUTE PROCEDURE costo_promedio (:ARTICULO, :FECHA) RETURNING_VALUES (:COSTOUNIT);
                COSTO = COSTOUNIT * CANTIDAD;
                UTILIDAD = BASE - COSTO;
                if (UOM = 'UTILIDAD') then
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                else
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
                SUSPEND;
                END
            END
    if (BIN_AND(TIPO, 16) <> 0) then
            BEGIN
            SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 35 INTO :NOMTIPO;
            FOR SELECT C.PREF_PRE, COTI_NUMERO, COTI_FECHA, ARTI_COD, CTDE_CANT * CTDE_FACTOR, (CTDE_TOTAL-CTDE_IVAMONTO-CTDE_CONSUMO)*COTI_FACTOR,
                CTDE_IVAMONTO*COTI_FACTOR, CTDE_DTOPORC, CTDE_TOTAL*COTI_FACTOR, C.terc_nit, C.coti_nomterc, c.coti_sucursal
                FROM COTIZACIONES C, COTIZACIONES_DETALLE D, PREFIJOS P
                WHERE C.COTI_ID = D.COTI_ID AND ARTI_COD = :ARTICULO AND COTI_FECHA >= :FECINI AND COTI_FECHA <= :FECFIN AND C.TERC_NIT >= :TERINI AND C.TERC_NIT <= :TERFIN AND COTI_ANULADO = 'N'
                 AND P.PREF_PRE = C.PREF_PRE AND P.TIDO_COD = 35 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                ORDER BY c.terc_nit, c.coti_sucursal, COTI_FECHA, C.COTI_ID, CTDE_ITEM
                INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :DTO, :TOTAL, :NIT, :nombre, :sucursal
                DO
                BEGIN
                SELECT ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO WHERE ARTI_COD = :ARTICULO
                    INTO :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC;
                SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                EXECUTE PROCEDURE costo_promedio (:ARTICULO, :FECHA) RETURNING_VALUES (:COSTOUNIT);
                COSTO = COSTOUNIT * CANTIDAD;
                UTILIDAD = BASE - COSTO;
                if (UOM = 'UTILIDAD') then
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                else
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
                SUSPEND;
                END
            END
    END
END

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE REP_UTILIDAD_VENDEDOR(
    TIPO INTEGER,
    DETALLE CHAR(1),
    VENINI VARCHAR(20),
    VENFIN VARCHAR(20),
    FECINI DATE,
    FECFIN DATE,
    ARTINI VARCHAR(15),
    ARTFIN VARCHAR(15),
    ORDEN CHAR(1),
    CEROS CHAR(1),
    SUBEMPRESA INTEGER)
RETURNS (
    CODVEND VARCHAR(20),
    NOMVEND VARCHAR(60),
    NOMTIPO VARCHAR(50),
    ARTICULO VARCHAR(15),
    DESCRIPCION VARCHAR(60),
    CODGRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    CODSUBG VARCHAR(3),
    NOMSUBG VARCHAR(30),
    CODMARC VARCHAR(3),
    NOMMARC VARCHAR(30),
    UNIDAD VARCHAR(8),
    CANTIDAD NUMERIC(18,4),
    BASE NUMERIC(18,2),
    IVA NUMERIC(18,2),
    CONSUMO NUMERIC(18,2),
    COSTO NUMERIC(18,2),
    UTILIDAD NUMERIC(18,4),
    PORC NUMERIC(9,2),
    TOTAL NUMERIC(18,2),
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    DTO NUMERIC(9,2))
AS
DECLARE VARIABLE COSTOUNIT NUMERIC(18,4);
DECLARE VARIABLE CANTDET NUMERIC(18,4);
DECLARE VARIABLE CODINI VARCHAR(15);
DECLARE VARIABLE CODFIN VARCHAR(15);
DECLARE VARIABLE DESINI VARCHAR(15);
DECLARE VARIABLE DESFIN VARCHAR(15);
declare variable UOM VARCHAR(20);
BEGIN
if (ORDEN = 'C') then
    BEGIN
    CODINI = ARTINI;
    CODFIN = ARTFIN;
    DESINI = '';
    DESFIN = 'zz';
    END
ELSE
    BEGIN
    DESINI = ARTINI;
    DESFIN = ARTFIN;
    CODINI = '';
    CODFIN = 'zz';
    END
  EXECUTE PROCEDURE lee_configuracion ('FACTURACION', 'ARTICULOS', 'SUGERIR PRECIOS CON PORCENTAJE DE MARGEN O UTILIDAD') returning_values (:UOM);
  SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = :TIPO INTO :NOMTIPO;
  FOR select VEND_COD, VEND_NOMBRE
    from VENDEDORES
    where VEND_COD >= :VENINI AND VEND_COD <= :VENFIN
    INTO :CODVEND, :NOMVEND
    DO  
    BEGIN
    if (DETALLE = 'N') then
        BEGIN
        if (BIN_AND(TIPO, 1) <> 0) then
            BEGIN
            SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 31 INTO :NOMTIPO;
            /* BORRA LA TABLA AUXILIAR */
            DELETE FROM reportes_aux WHERE REPA_ID = 4 AND REPA_USER = USER;
            FOR SELECT MAX(D.ARTI_COD), SUM(FADE_CANT * FADE_FACTOR), SUM(FACT_FACTOR*(FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO)),
                SUM(FACT_FACTOR*FADE_IVAMONTO), SUM(FACT_FACTOR*FADE_TOTAL), SUM(FADE_CONSUMO),
                MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD)
                FROM FACTURAS_DETALLE D, FACTURAS F, PREFIJOS P, ARTICULO A
                WHERE F.FACT_ID = D.FACT_ID AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND VEND_COD = :CODVEND AND FACT_ANULADO = 'N'
                 AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) and substring(D.arti_cod from 1 FOR 2) <> '.t'
                 AND D.ARTI_COD = A.arti_cod AND A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN
                GROUP BY D.ARTI_COD
                INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :TOTAL, :CONSUMO,
                    :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                DO
                BEGIN
                COSTO = 0;
                FOR SELECT FADE_CANT * FADE_FACTOR, FACT_FECHA FROM FACTURAS_DETALLE D, FACTURAS F, PREFIJOS P
                    WHERE F.VEND_COD = :codvend AND F.FACT_ID = D.FACT_ID AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND
                    FACT_ANULADO = 'N' AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                    and D.ARTI_COD = :articulo  INTO :cantdet, :fecha
                    DO
                    BEGIN
                    EXECUTE PROCEDURE COSTO_PROMEDIO(:ARTICULO, :FECHA) returning_values (:costounit);
                    COSTO = COSTO + costounit * cantdet;
                    END
                SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                if (CANTIDAD IS NULL) then
                    CANTIDAD = 0;
                if (BASE IS NULL) then
                    BASE = 0;
                if (IVA IS NULL) then
                    IVA = 0;
                UTILIDAD = BASE - COSTO;
                if (UOM = 'UTILIDAD') then
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                else
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
                if (CEROS = 'S') then
                    begin
                    INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (4, USER, :ARTICULO);
                    SUSPEND;
                    end
                ELSE
                    if ((BASE <> 0) AND (CANTIDAD <> 0)) then
                        SUSPEND;
                END
            if (CEROS = 'S') then
                BEGIN
                COSTO = 0;
                UTILIDAD = 0;
                PORC = 0;
                /* agregue los articulos sin factura */
                FOR SELECT ARTI_COD, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN and
                    not exists (select REPA_ARTICULO FROM REPORTES_AUX WHERE REPA_ID = 4 AND REPA_USER = USER AND REPA_ARTICULO = a.arti_cod)
                    INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                    DO
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        if (BIN_AND(TIPO, 2) <> 0) then
            BEGIN
            SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 32 INTO :NOMTIPO;
            FOR SELECT MAX(D.ARTI_COD), SUM(RVDE_CANT * RVDE_FACTOR), SUM(RVDE_TOTAL-RVDE_IVAMONTO-RVDE_CONSUMO), SUM(RVDE_IVAMONTO), SUM(RVDE_TOTAL), SUM(RVDE_CONSUMO),
                MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD)
                FROM REMISIONES_VENTA_DETALLE D, REMISIONES_VENTA R, PREFIJOS P, ARTICULO A
                WHERE R.REVT_ID = D.REVT_ID AND REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN AND VEND_COD = :CODVEND AND REVT_ANULADO = 'N'
                 AND P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = 32 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                 AND D.ARTI_COD = A.arti_cod AND A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN
                GROUP BY D.ARTI_COD
                INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :TOTAL, :CONSUMO,
                    :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                DO
                BEGIN
                COSTO = 0;
                FOR SELECT RVDE_CANT * RVDE_FACTOR, REVT_FECHA FROM remisiones_venta_detalle D, remisiones_venta F, PREFIJOS P
                    WHERE F.VEND_COD = :codvend AND F.revt_id = D.revt_id AND REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN AND
                    REVT_ANULADO = 'N' AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 32 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                    and D.ARTI_COD = :articulo  INTO :cantdet, :fecha
                    DO
                    BEGIN
                    EXECUTE PROCEDURE COSTO_PROMEDIO(:ARTICULO, :FECHA) returning_values (:costounit);
                    COSTO = COSTO + costounit * cantdet;
                    END
                SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                if (CANTIDAD IS NULL) then
                    CANTIDAD = 0;
                if (BASE IS NULL) then
                    BASE = 0;
                if (IVA IS NULL) then
                    IVA = 0;
                UTILIDAD = BASE - COSTO;
                if (UOM = 'UTILIDAD') then
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                else
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
                if (CEROS = 'S') then
                    begin
                    INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (4, USER, :ARTICULO);
                    SUSPEND;
                    end
                ELSE
                    if ((BASE <> 0) AND (CANTIDAD <> 0)) then
                        SUSPEND;
                END
            if (CEROS = 'S') then
                BEGIN
                COSTO = 0;
                UTILIDAD = 0;
                PORC = 0;
                /* agregue los articulos sin factura */
                FOR SELECT ARTI_COD, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN and
                    not exists (select REPA_ARTICULO FROM REPORTES_AUX WHERE REPA_ID = 4 AND REPA_USER = USER AND REPA_ARTICULO = a.arti_cod)
                    INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                    DO
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        if (BIN_AND(TIPO, 4) <> 0) then
            BEGIN
            SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 33 INTO :NOMTIPO;
            FOR SELECT MAX(D.ARTI_COD), SUM(DVDE_CANT * DVDE_FACTOR), SUM(DEVT_FACTOR*(DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO)),
                SUM(DEVT_FACTOR*DVDE_IVAMONTO), SUM(DEVT_FACTOR*DVDE_TOTAL), SUM(DVDE_CONSUMO),
                MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD)
                FROM devoluciones_ventas_detalle D, DEVOLUCIONES_VENTAS V, PREFIJOS P, ARTICULO A
                WHERE V.DEVT_ID = D.DEVT_ID AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND VEND_COD = :CODVEND AND DEVT_ANULADO = 'N'
                 AND P.PREF_PRE = V.PREF_PRE AND P.TIDO_COD = 33 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) and substring(D.arti_cod from 1 FOR 2) <> '.t'
                 AND D.ARTI_COD = A.arti_cod AND A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN
                GROUP BY D.ARTI_COD
                INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :TOTAL, :CONSUMO,
                    :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                DO
                BEGIN
                COSTO = 0;
                FOR SELECT DVDE_CANT * DVDE_FACTOR, DEVT_FECHA FROM devoluciones_ventas_detalle D, devoluciones_ventas F, PREFIJOS P
                    WHERE F.VEND_COD = :codvend AND F.devt_id = D.devt_id AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND
                    DEVT_ANULADO = 'N' AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 33 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                    and D.ARTI_COD = :articulo  INTO :cantdet, :fecha
                    DO
                    BEGIN
                    EXECUTE PROCEDURE COSTO_PROMEDIO(:ARTICULO, :FECHA) returning_values (:costounit);
                    COSTO = COSTO + costounit * cantdet;
                    END
                SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                if (CANTIDAD IS NULL) then
                    CANTIDAD = 0;
                if (BASE IS NULL) then
                    BASE = 0;
                if (IVA IS NULL) then
                    IVA = 0;
                UTILIDAD = BASE - COSTO;
                if (UOM = 'UTILIDAD') then
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                else
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
                TOTAL = TOTAL * -1;
                IVA = IVA * -1;
                BASE = BASE * -1;
                CANTIDAD = CANTIDAD * -1;
                COSTO = COSTO * -1;
                UTILIDAD = UTILIDAD * -1;
                if (CEROS = 'S') then
                    begin
                    INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (4, USER, :ARTICULO);
                    SUSPEND;
                    end
                ELSE
                    if ((BASE <> 0) AND (CANTIDAD <> 0)) then
                        SUSPEND;
                END
            if (CEROS = 'S') then
                BEGIN
                COSTO = 0;
                UTILIDAD = 0;
                PORC = 0;
                /* agregue los articulos sin factura */
                FOR SELECT ARTI_COD, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN and
                    not exists (select REPA_ARTICULO FROM REPORTES_AUX WHERE REPA_ID = 4 AND REPA_USER = USER AND REPA_ARTICULO = a.arti_cod)
                    INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                    DO
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        if (BIN_AND(TIPO, 8) <> 0) then
            BEGIN
            SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 34 INTO :NOMTIPO;
            FOR SELECT MAX(D.ARTI_COD), SUM(PEDE_CANT * PEDE_FACTOR), SUM(PEDI_FACTOR*(PEDE_TOTAL-PEDE_IVAMONTO-PEDE_CONSUMO)),
                SUM(PEDI_FACTOR*PEDE_IVAMONTO), SUM(PEDI_FACTOR*PEDE_TOTAL), SUM(PEDE_CONSUMO),
                MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD)
                FROM PEDIDOS_DETALLE D, PEDIDOS P, PREFIJOS PR, articulo A
                WHERE P.PEDI_ID = D.PEDI_ID AND PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND VEND_COD = :CODVEND AND PEDI_ANULADO = 'N'
                 AND PR.PREF_PRE = P.PREF_PRE AND P.TIDO_COD = 34 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                 AND D.ARTI_COD = A.arti_cod AND A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN
                GROUP BY D.ARTI_COD
                INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :TOTAL, :CONSUMO,
                    :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                DO
                BEGIN
                COSTO = 0;
                FOR SELECT PEDE_CANT * PEDE_FACTOR, PEDI_FECHA FROM pedidos_detalle D, PEDIDOS F, PREFIJOS P
                    WHERE F.VEND_COD = :codvend AND F.pedi_id = D.pedi_id AND PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND
                    PEDI_ANULADO = 'N' AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 34 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                    and D.ARTI_COD = :articulo  INTO :cantdet, :fecha
                    DO
                    BEGIN
                    EXECUTE PROCEDURE COSTO_PROMEDIO(:ARTICULO, :FECHA) returning_values (:costounit);
                    COSTO = COSTO + costounit * cantdet;
                    END
                SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                if (CANTIDAD IS NULL) then
                    CANTIDAD = 0;
                if (BASE IS NULL) then
                    BASE = 0;
                if (IVA IS NULL) then
                    IVA = 0;
                UTILIDAD = BASE - COSTO;
                if (UOM = 'UTILIDAD') then
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                else
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
                if (CEROS = 'S') then
                    begin
                    INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (4, USER, :ARTICULO);
                    SUSPEND;
                    end
                ELSE
                    if ((BASE <> 0) AND (CANTIDAD <> 0)) then
                        SUSPEND;
                END
            if (CEROS = 'S') then
                BEGIN
                COSTO = 0;
                UTILIDAD = 0;
                PORC = 0;
                /* agregue los articulos sin factura */
                FOR SELECT ARTI_COD, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN and
                    not exists (select REPA_ARTICULO FROM REPORTES_AUX WHERE REPA_ID = 4 AND REPA_USER = USER AND REPA_ARTICULO = a.arti_cod)
                    INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                    DO
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        if (BIN_AND(TIPO, 16) <> 0) then
            BEGIN
            SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 35 INTO :NOMTIPO;
            FOR SELECT MAX(D.ARTI_COD), SUM(CTDE_CANT * CTDE_FACTOR), SUM(COTI_FACTOR*(CTDE_TOTAL-CTDE_IVAMONTO-CTDE_CONSUMO)),
                SUM(COTI_FACTOR*CTDE_IVAMONTO), SUM(COTI_FACTOR*CTDE_TOTAL), SUM(CTDE_CONSUMO),
                MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD)
                FROM COTIZACIONES_DETALLE D, COTIZACIONES C, PREFIJOS P, ARTICULO A
                WHERE C.COTI_ID = D.COTI_ID AND COTI_FECHA >= :FECINI AND COTI_FECHA <= :FECFIN AND VEND_COD = :CODVEND AND COTI_ANULADO = 'N'
                 AND P.PREF_PRE = C.PREF_PRE AND P.TIDO_COD = 35 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                 AND D.ARTI_COD = A.arti_cod AND A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN
                GROUP BY D.ARTI_COD
                INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :TOTAL, :CONSUMO,
                    :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                DO
                BEGIN
                COSTO = 0;
                FOR SELECT PEDE_CANT * PEDE_FACTOR, PEDI_FECHA FROM pedidos_detalle D, PEDIDOS F, PREFIJOS P
                    WHERE F.VEND_COD = :codvend AND F.pedi_id = D.pedi_id AND PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND
                    PEDI_ANULADO = 'N' AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 34 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                    and D.ARTI_COD = :articulo  INTO :cantdet, :fecha
                    DO
                    BEGIN
                    EXECUTE PROCEDURE COSTO_PROMEDIO(:ARTICULO, :FECHA) returning_values (:costounit);
                    COSTO = COSTO + costounit * cantdet;
                    END
                SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                if (CANTIDAD IS NULL) then
                    CANTIDAD = 0;
                if (BASE IS NULL) then
                    BASE = 0;
                if (IVA IS NULL) then
                    IVA = 0;
                COSTO = CANTIDAD * COSTOUNIT;
                UTILIDAD = BASE - COSTO;
                if (UOM = 'UTILIDAD') then
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                else
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
                if (CEROS = 'S') then
                    begin
                    INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (4, USER, :ARTICULO);
                    SUSPEND;
                    end
                ELSE
                    if ((BASE <> 0) AND (CANTIDAD <> 0)) then
                        SUSPEND;
                END
            if (CEROS = 'S') then
                BEGIN
                COSTO = 0;
                UTILIDAD = 0;
                PORC = 0;
                /* agregue los articulos sin factura */
                FOR SELECT ARTI_COD, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN and
                    not exists (select REPA_ARTICULO FROM REPORTES_AUX WHERE REPA_ID = 4 AND REPA_USER = USER AND REPA_ARTICULO = a.arti_cod)
                    INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                    DO
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        END
    ELSE
        BEGIN
        if (BIN_AND(TIPO, 1) <> 0) then
            BEGIN
            SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 31 INTO :NOMTIPO;
            FOR SELECT F.PREF_PRE, FACT_NUMERO, FACT_FECHA, ARTI_COD, FADE_CANT * FADE_FACTOR, (FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO)*FACT_FACTOR,
                FADE_IVAMONTO*FACT_FACTOR, FADE_DTOPORC, FADE_TOTAL*FACT_FACTOR, FADE_CONSUMO
                FROM FACTURAS F, FACTURAS_DETALLE D, PREFIJOS P
                WHERE F.FACT_ID = D.FACT_ID AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND VEND_COD = :CODVEND AND FACT_ANULADO = 'N'
                 AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) and substring(D.arti_cod from 1 FOR 2) <> '.t'
                ORDER BY ARTI_COD, FACT_FECHA, F.FACT_ID, FADE_ITEM
                INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :DTO, :TOTAL, :CONSUMO
                DO
                BEGIN
                SELECT ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO WHERE ARTI_COD = :ARTICULO
                    INTO :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC;
                SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                EXECUTE PROCEDURE costo_promedio (:ARTICULO, :FECHA) RETURNING_VALUES (:COSTOUNIT);
                COSTO = COSTOUNIT * CANTIDAD;
                UTILIDAD = BASE - COSTO;
                if (UOM = 'UTILIDAD') then
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                else
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
                if (CEROS = 'S') then
                    INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (4, USER, :ARTICULO);
                SUSPEND;
                END
            if (CEROS = 'S') then
                BEGIN
                COSTO = 0;
                UTILIDAD = 0;
                PORC = 0;
                /* agregue los articulos sin factura */
                FOR SELECT ARTI_COD, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN and
                    not exists (select REPA_ARTICULO FROM REPORTES_AUX WHERE REPA_ID = 4 AND REPA_USER = USER AND REPA_ARTICULO = a.arti_cod)
                    INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                    DO
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        if (BIN_AND(TIPO, 2) <> 0) then
            BEGIN
            SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 32 INTO :NOMTIPO;
            FOR SELECT R.PREF_PRE, REVT_NUMERO, REVT_FECHA, ARTI_COD, RVDE_CANT * RVDE_FACTOR, (RVDE_TOTAL - RVDE_IVAMONTO), RVDE_IVAMONTO, RVDE_DTOPORC, RVDE_TOTAL, RVDE_CONSUMO
                FROM REMISIONES_VENTA R, REMISIONES_VENTA_DETALLE D, PREFIJOS P
                WHERE R.REVT_ID = D.REVT_ID AND REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN AND VEND_COD = :CODVEND AND REVT_ANULADO = 'N'
                 AND P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = 32 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) and substring(D.arti_cod from 1 FOR 2) <> '.t'
                ORDER BY ARTI_COD, REVT_FECHA, R.REVT_ID, RVDE_ITEM
                INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :DTO, :TOTAL, :CONSUMO
                DO
                BEGIN
                SELECT ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO WHERE ARTI_COD = :ARTICULO
                    INTO :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC;
                SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                EXECUTE PROCEDURE costo_promedio (:ARTICULO, :FECHA) RETURNING_VALUES (:COSTOUNIT);
                COSTO = COSTOUNIT * CANTIDAD;
                UTILIDAD = BASE - COSTO;
                if (UOM = 'UTILIDAD') then
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                else
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
                if (CEROS = 'S') then
                    INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (4, USER, :ARTICULO);
                SUSPEND;
                END
            if (CEROS = 'S') then
                BEGIN
                COSTO = 0;
                UTILIDAD = 0;
                PORC = 0;
                /* agregue los articulos sin factura */
                FOR SELECT ARTI_COD, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN and
                    not exists (select REPA_ARTICULO FROM REPORTES_AUX WHERE REPA_ID = 4 AND REPA_USER = USER AND REPA_ARTICULO = a.arti_cod)
                    INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                    DO
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        if (BIN_AND(TIPO, 4) <> 0) then
            BEGIN
            SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 33 INTO :NOMTIPO;
            FOR SELECT V.PREF_PRE, DEVT_NUMERO, DEVT_FECHA, ARTI_COD, DVDE_CANT * DVDE_FACTOR, (DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO)*DEVT_FACTOR,
                DVDE_IVAMONTO*DEVT_FACTOR, DVDE_DTOPORC, DVDE_TOTAL*DEVT_FACTOR, DVDE_CONSUMO
                FROM DEVOLUCIONES_VENTAS V, DEVOLUCIONES_VENTAS_DETALLE D, PREFIJOS P
                WHERE V.DEVT_ID = D.DEVT_ID AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND VEND_COD = :CODVEND AND DEVT_ANULADO = 'N'
                 AND P.PREF_PRE = V.PREF_PRE AND P.TIDO_COD = 33 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) and substring(D.arti_cod from 1 FOR 2) <> '.t'
                ORDER BY ARTI_COD, DEVT_FECHA, D.DEVT_ID, DVDE_ITEM
                INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :DTO, :TOTAL, :CONSUMO
                DO
                BEGIN
                SELECT ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO WHERE ARTI_COD = :ARTICULO
                    INTO :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC;
                SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                EXECUTE PROCEDURE costo_promedio (:ARTICULO, :FECHA) RETURNING_VALUES (:COSTOUNIT);
                COSTO = COSTOUNIT * CANTIDAD;
                UTILIDAD = BASE - COSTO;
                if (UOM = 'UTILIDAD') then
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                else
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
                TOTAL = TOTAL * -1;
                IVA = IVA * -1;
                BASE = BASE * -1;
                CANTIDAD = CANTIDAD * -1;
                COSTO = COSTO * -1;
                UTILIDAD = UTILIDAD * -1;
                if (CEROS = 'S') then
                    INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (4, USER, :ARTICULO);
                SUSPEND;
                END
            if (CEROS = 'S') then
                BEGIN
                COSTO = 0;
                UTILIDAD = 0;
                PORC = 0;
                /* agregue los articulos sin factura */
                FOR SELECT ARTI_COD, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN and
                    not exists (select REPA_ARTICULO FROM REPORTES_AUX WHERE REPA_ID = 4 AND REPA_USER = USER AND REPA_ARTICULO = a.arti_cod)
                    INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                    DO
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        if (BIN_AND(TIPO, 8) <> 0) then
            BEGIN
            SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 34 INTO :NOMTIPO;
            FOR SELECT P.PREF_PRE, PEDI_NUMERO, PEDI_FECHA, ARTI_COD, PEDE_CANT * PEDE_FACTOR, (PEDE_TOTAL-PEDE_IVAMONTO-PEDE_CONSUMO)*PEDI_FACTOR,
                PEDE_IVAMONTO*PEDI_FACTOR, PEDE_DTOPORC, PEDE_TOTAL*PEDI_FACTOR, PEDE_CONSUMO
                FROM PEDIDOS P, PEDIDOS_DETALLE D, PREFIJOS PR
                WHERE P.PEDI_ID = D.PEDI_ID AND PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND VEND_COD = :CODVEND AND PEDI_ANULADO = 'N'
                 AND P.PREF_PRE = PR.PREF_PRE AND P.TIDO_COD = 34 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                ORDER BY ARTI_COD, PEDI_FECHA, P.PEDI_ID, PEDE_ITEM
                INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :DTO, :TOTAL, :CONSUMO
                DO
                BEGIN
                SELECT ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO WHERE ARTI_COD = :ARTICULO
                    INTO :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC;
                SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                EXECUTE PROCEDURE costo_promedio (:ARTICULO, :FECHA) RETURNING_VALUES (:COSTOUNIT);
                COSTO = COSTOUNIT * CANTIDAD;
                UTILIDAD = BASE - COSTO;
                if (UOM = 'UTILIDAD') then
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                else
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
                if (CEROS = 'S') then
                    INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (4, USER, :ARTICULO);
                SUSPEND;
                END
            if (CEROS = 'S') then
                BEGIN
                COSTO = 0;
                UTILIDAD = 0;
                PORC = 0;
                /* agregue los articulos sin factura */
                FOR SELECT ARTI_COD, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN and
                    not exists (select REPA_ARTICULO FROM REPORTES_AUX WHERE REPA_ID = 4 AND REPA_USER = USER AND REPA_ARTICULO = a.arti_cod)
                    INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                    DO
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        if (BIN_AND(TIPO, 16) <> 0) then
            BEGIN
            SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 35 INTO :NOMTIPO;
            FOR SELECT C.PREF_PRE, COTI_NUMERO, COTI_FECHA, ARTI_COD, CTDE_CANT * CTDE_FACTOR, (CTDE_TOTAL-CTDE_IVAMONTO-CTDE_CONSUMO)*COTI_FACTOR,
                CTDE_IVAMONTO*COTI_FACTOR, CTDE_DTOPORC, CTDE_TOTAL*COTI_FACTOR, CTDE_CONSUMO
                FROM COTIZACIONES C, COTIZACIONES_DETALLE D, PREFIJOS P
                WHERE C.COTI_ID = D.COTI_ID AND ARTI_COD = :ARTICULO AND COTI_FECHA >= :FECINI AND COTI_FECHA <= :FECFIN AND VEND_COD = :CODVEND AND COTI_ANULADO = 'N'
                 AND P.PREF_PRE = C.PREF_PRE AND P.TIDO_COD = 35 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                ORDER BY COTI_FECHA, C.COTI_ID, CTDE_ITEM
                INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :DTO, :TOTAL, :CONSUMO
                DO
                BEGIN
                SELECT ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO WHERE ARTI_COD = :ARTICULO
                    INTO :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC;
                SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                EXECUTE PROCEDURE costo_promedio (:ARTICULO, :FECHA) RETURNING_VALUES (:COSTOUNIT);
                COSTO = COSTOUNIT * CANTIDAD;
                UTILIDAD = BASE - COSTO;
                if (UOM = 'UTILIDAD') then
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                else
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
                if (CEROS = 'S') then
                    INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (4, USER, :ARTICULO);
                SUSPEND;
                END
            if (CEROS = 'S') then
                BEGIN
                COSTO = 0;
                UTILIDAD = 0;
                PORC = 0;
                /* agregue los articulos sin factura */
                FOR SELECT ARTI_COD, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN and
                    not exists (select REPA_ARTICULO FROM REPORTES_AUX WHERE REPA_ID = 4 AND REPA_USER = USER AND REPA_ARTICULO = a.arti_cod)
                    INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                    DO
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        END
    END
END

^

SET TERM ; ^

SET TERM ^ ;

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

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE TARIFAS_ENSAMBLE(
    PRODUCTO VARCHAR(20),
    PRECIO NUMERIC(18,2),
    FECHA DATE)
RETURNS (
    T0 NUMERIC(18,2),
    T1 NUMERIC(18,2),
    T2 NUMERIC(18,2),
    T3 NUMERIC(18,2),
    T4 NUMERIC(18,2),
    TC NUMERIC(18,2))
AS
declare variable COSTO NUMERIC(18,2);
declare variable TOTAL NUMERIC(18,2);
declare variable TARIFA INTEGER;
declare variable COMPON VARCHAR(20);
declare variable CANT NUMERIC(18,4);
declare variable UNIDAD VARCHAR(8);
declare variable CONSUMO NUMERIC(18,2);
begin
T0 = 0;
T1 = 0;
T2 = 0;
T3 = 0;
T4 = 0;
TC = 0;
TOTAL = 0;
FOR SELECT ARPR_COMP, ARPR_CANT, ARPR_UNIDAD, TAIV_COD, ARTI_CONSUMO
    FROM articulos_producto P, ARTICULO A WHERE P.ARTI_COD = :PRODUCTO AND P.arpr_comp = A.arti_cod
    INTO :COMPON, :CANT, :UNIDAD, :TARIFA, :CONSUMO
    DO
    BEGIN
    EXECUTE PROCEDURE cantidad_por_factor (:COMPON, :CANT, :UNIDAD) returning_values (:cant);
    EXECUTE PROCEDURE costo_promedio (:COMPON, :FECHA) returning_values (:COSTO);
    TOTAL = TOTAL + COSTO * CANT;
    TC = TC + CONSUMO * CANT;
    if (TARIFA = 0) then
        T0 = T0 + COSTO * CANT;
    if (TARIFA = 1) then
        T1 = T1 + COSTO * CANT;
    if (TARIFA = 2) then
        T2 = T2 + COSTO * CANT;
    if (TARIFA = 3) then
        T3 = T3 + COSTO * CANT;
    if (TARIFA = 4) then
        T4 = T4 + COSTO * CANT;
    END
if (TOTAL <> 0) then
    BEGIN
    T0 = T0 * PRECIO / TOTAL;
    T1 = T1 * PRECIO / TOTAL;
    T2 = T2 * PRECIO / TOTAL;
    T3 = T3 * PRECIO / TOTAL;
    T4 = T4 * PRECIO / TOTAL;
    END
ELSE
    BEGIN
    T0 = 0;
    T1 = 0;
    T2 = 0;
    T3 = 0;
    T4 = 0;
    END
suspend;
end

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE CONTABILICE_COSTO_VENTAS(
    ID INTEGER,
    IDINTER INTEGER)
RETURNS (
    IDC INTEGER)
AS
declare variable PREF VARCHAR(4);
declare variable NUM VARCHAR(6);
declare variable NUMERO VARCHAR(10);
declare variable INVEN CHAR(1);
declare variable CTAINVEN VARCHAR(20);
declare variable COSTOS CHAR(1);
declare variable CTACOSTOS VARCHAR(20);
declare variable EXISTE CHAR(1);
declare variable CUENTA VARCHAR(20);
declare variable MONTO NUMERIC(18,2);
declare variable TIPOCUEN CHAR(1);
declare variable NIT VARCHAR(20);
declare variable PROY VARCHAR(4);
declare variable CENTRO VARCHAR(4);
declare variable ART VARCHAR(15);
declare variable ANULADO CHAR(1);
declare variable NROI INTEGER;
declare variable NUMROWS INTEGER;
declare variable CONC CHAR(120);
declare variable VENCEAUX DATE;
declare variable VENCE CHAR(8);
begin
/* TRAIGA EL ID DEL ENCABEZADO DEL COMPROBANTE CONTABLE */
SELECT ENCO_CONSEC FROM COMPROBANTE_ENCABEZADO WHERE ENCO_TIPOREF = 31 AND ENCO_IDREF = :ID INTO :IDC;
SELECT MAX(CODE_ITEM) FROM COMPROBANTE_DETALLE WHERE ENCO_CONSEC = :idc INTO :NROI;
NROI = NROI + 1;
/* EJECUTE LA PARTE DE CONTABIL_FACTURA QUE CORRESPONDE A LOS COSTOS */
EXISTE = 'N';
SELECT 'S', INVE_COSTO, INVE_INVEN, INVE_CTAINVEN, INVE_CTACOSTOS
    FROM INTERFAZ_VENTAS
    WHERE INVE_ID = :IDINTER
    INTO :EXISTE, :COSTOS, :INVEN, :CTAINVEN, :CTACOSTOS;
if (EXISTE = 'S') then
  BEGIN
  SELECT FACT_ANULADO, PREF_PRE, FACT_NUMERO, FACT_VENCE, TERC_NIT FROM FACTURAS F
        WHERE FACT_ID = :ID INTO :ANULADO, :PREF, :NUMERO, :VENCEAUX, :NIT;
  NUMERO = PREF || NUM;
  CONC = 'COSTO EN VENTAS FACTURA ' || :NUMERO;
  EXECUTE PROCEDURE FECHA_A_CONTA(:VENCEAUX) returning_values (:VENCE);
  if (ANULADO = 'N') then
    BEGIN
    SELECT BODE_CENTRO, BODE_PROY FROM BODEGA B, FACTURAS F, PUNTO_VENTA P
        WHERE B.BODE_COD = P.BODE_COD AND P.PTVT_ID = F.PTVT_ID AND F.FACT_ID = :ID INTO :CENTRO, :PROY;
    /* SE ASUME QUE NO HAN CAMBIADO LAS CUENTAS DE COSTOS, POR ESO SE HACE UPDATE A LOS MOVIMIENTOS DE ESAS CUENTAS */
    EXECUTE PROCEDURE COSTO_EN_VENTAS(31, :ID);
    if (COSTOS = 'A') then
        BEGIN
        FOR SELECT MAX(CTACOS), SUM(CANT * COSTO)
            FROM COSTO_VENTAS WHERE TIDO_COD = 31 AND COVE_ID = :ID
            GROUP BY CTACOS
            INTO :CTACOSTOS, :MONTO
        DO
            BEGIN
            if (MONTO <> 0) then
                BEGIN
                CUENTA = NULL;
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :CTACOSTOS INTO :CUENTA, :TIPOCUEN;
                IF (CUENTA IS NULL) THEN
                    begin
                    EXCEPTION CUENTA_NO_EXISTE 'La cuenta ' || :ctacostos || ' no existe.';
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT ARTI_COD, CANT * COSTO
                        FROM COSTO_VENTAS WHERE TIDO_COD = 31 AND COVE_ID = :ID AND CTACOS = :CUENTA
                        INTO :ART, :MONTO
                    DO
                        BEGIN
                        SELECT COUNT(*) FROM COMPROBANTE_DETALLE WHERE CUEN_COD = :CUENTA AND ENCO_CONSEC = :IDC AND ARTI_COD = :ART INTO :NUMROWS;
                        if (NUMROWS = 0) then
                            BEGIN
                            INSERT INTO comprobante_detalle (ENCO_CONSEC, CODE_ITEM, CUEN_COD, CODE_CONCEPTO, CODE_REFER, CODE_DEBITO, CODE_CREDITO, CODE_BASE, CODE_PORC, TERC_NIT, PROY_COD, CENT_COD, CNDE_DOCNUMERO, CNDE_DOCAPLICA, DOCO_VENCE, ARTI_COD, CODE_TIPOAPL, CODE_TIPONUE)
                                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                            NROI = NROI + 1;
                            END
                        ELSE
                            UPDATE COMPROBANTE_DETALLE
                                SET CODE_DEBITO = :MONTO
                            WHERE CUEN_COD = :CUENTA AND ENCO_CONSEC = :IDC AND ARTI_COD = :ART;
                        END
                    END
                ELSE
                    BEGIN
                    SELECT COUNT(*) FROM COMPROBANTE_DETALLE WHERE CUEN_COD = :CUENTA AND ENCO_CONSEC = :IDC INTO :NUMROWS;
                    if (NUMROWS = 0) then
                        BEGIN
                        if (TIPOCUEN = 'C') then
                            INSERT INTO comprobante_detalle (ENCO_CONSEC, CODE_ITEM, CUEN_COD, CODE_CONCEPTO, CODE_REFER, CODE_DEBITO, CODE_CREDITO, CODE_BASE, CODE_PORC, TERC_NIT, PROY_COD, CENT_COD, CNDE_DOCNUMERO, CNDE_DOCAPLICA, DOCO_VENCE, ARTI_COD, CODE_TIPOAPL, CODE_TIPONUE)
                                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                        ELSE
                            INSERT INTO comprobante_detalle (ENCO_CONSEC, CODE_ITEM, CUEN_COD, CODE_CONCEPTO, CODE_REFER, CODE_DEBITO, CODE_CREDITO, CODE_BASE, CODE_PORC, TERC_NIT, PROY_COD, CENT_COD, CNDE_DOCNUMERO, CNDE_DOCAPLICA, DOCO_VENCE, ARTI_COD, CODE_TIPOAPL, CODE_TIPONUE)
                                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NROI = NROI + 1;
                        END
                    ELSE
                        UPDATE COMPROBANTE_DETALLE
                            SET CODE_DEBITO = :MONTO
                        WHERE CUEN_COD = :CUENTA AND ENCO_CONSEC = :IDC;
                    END
                END /* MONTO <> 0 */
            END /* FOR */
        END /* COSTOS */
    if (COSTOS = 'K') then
        BEGIN
        SELECT SUM(CANT * COSTO)
            FROM COSTO_VENTAS WHERE TIDO_COD = 31 AND COVE_ID = :ID
            INTO :MONTO;
        if (MONTO <> 0) then
            BEGIN
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTACOSTOS INTO :CUENTA, :TIPOCUEN;
            IF (CUENTA IS NULL) THEN
                begin
                EXCEPTION CUENTA_NO_EXISTE 'La cuenta ' || :ctacostos || ' no existe.';
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, REGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT ARTI_COD, CANT * COSTO
                    FROM COSTO_VENTAS WHERE TIDO_COD = 31 AND COVE_ID = :ID
                    INTO :ART, :MONTO
                DO
                    BEGIN
                    SELECT COUNT(*) FROM COMPROBANTE_DETALLE WHERE CUEN_COD = :CUENTA AND ENCO_CONSEC = :IDC AND ARTI_COD = :ART INTO :NUMROWS;
                    if (NUMROWS = 0) then
                        BEGIN
                            INSERT INTO comprobante_detalle (ENCO_CONSEC, CODE_ITEM, CUEN_COD, CODE_CONCEPTO, CODE_REFER, CODE_DEBITO, CODE_CREDITO, CODE_BASE, CODE_PORC, TERC_NIT, PROY_COD, CENT_COD, CNDE_DOCNUMERO, CNDE_DOCAPLICA, DOCO_VENCE, ARTI_COD, CODE_TIPOAPL, CODE_TIPONUE)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        END
                    ELSE
                        UPDATE COMPROBANTE_DETALLE
                            SET CODE_DEBITO = :MONTO
                        WHERE CUEN_COD = :CUENTA AND ENCO_CONSEC = :IDC AND ARTI_COD = :ART;
                    END
                END
            ELSE
                BEGIN
                SELECT COUNT(*) FROM COMPROBANTE_DETALLE WHERE CUEN_COD = :CUENTA AND ENCO_CONSEC = :IDC INTO :NUMROWS;
                if (NUMROWS = 0) then
                    BEGIN
                    if (TIPOCUEN = 'C') then
                        INSERT INTO comprobante_detalle (ENCO_CONSEC, CODE_ITEM, CUEN_COD, CODE_CONCEPTO, CODE_REFER, CODE_DEBITO, CODE_CREDITO, CODE_BASE, CODE_PORC, TERC_NIT, PROY_COD, CENT_COD, CNDE_DOCNUMERO, CNDE_DOCAPLICA, DOCO_VENCE, ARTI_COD, CODE_TIPOAPL, CODE_TIPONUE)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    ELSE
                        INSERT INTO comprobante_detalle (ENCO_CONSEC, CODE_ITEM, CUEN_COD, CODE_CONCEPTO, CODE_REFER, CODE_DEBITO, CODE_CREDITO, CODE_BASE, CODE_PORC, TERC_NIT, PROY_COD, CENT_COD, CNDE_DOCNUMERO, CNDE_DOCAPLICA, DOCO_VENCE, ARTI_COD, CODE_TIPOAPL, CODE_TIPONUE)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    END
                ELSE
                    UPDATE COMPROBANTE_DETALLE
                        SET CODE_DEBITO = :MONTO
                    WHERE CUEN_COD = :CUENTA AND ENCO_CONSEC = :IDC;
                END
            END /* MONTO <> 0 */
        END /* COSTOS = K */
    if (INVEN = 'A') then
        BEGIN
        FOR SELECT MAX(CTAINV), SUM(CANT * COSTO)
            FROM COSTO_VENTAS WHERE TIDO_COD = 31 AND COVE_ID = :ID
            GROUP BY CTAINV
            INTO :CTAINVEN, :MONTO
        DO
            BEGIN
            if (MONTO <> 0) then
                BEGIN
                CUENTA = NULL;
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :CTAINVEN INTO :CUENTA, :TIPOCUEN;
                IF (CUENTA IS NULL) THEN
                    begin
                    EXCEPTION CUENTA_NO_EXISTE 'La cuenta ' || :ctainven || ' no existe.';
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, REGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT ARTI_COD, CANT * COSTO
                        FROM COSTO_VENTAS WHERE TIDO_COD = 31 AND COVE_ID = :ID AND CTAINV = :CUENTA
                        INTO :ART, :MONTO
                    DO
                        BEGIN
                        SELECT COUNT(*) FROM COMPROBANTE_DETALLE WHERE CUEN_COD = :CUENTA AND ENCO_CONSEC = :IDC AND ARTI_COD = :ART INTO :NUMROWS;
                        if (NUMROWS = 0) then
                            BEGIN
                            INSERT INTO comprobante_detalle (ENCO_CONSEC, CODE_ITEM, CUEN_COD, CODE_CONCEPTO, CODE_REFER, CODE_DEBITO, CODE_CREDITO, CODE_BASE, CODE_PORC, TERC_NIT, PROY_COD, CENT_COD, CNDE_DOCNUMERO, CNDE_DOCAPLICA, DOCO_VENCE, ARTI_COD, CODE_TIPOAPL, CODE_TIPONUE)
                                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                            NROI = NROI + 1;
                            END
                        ELSE
                            UPDATE COMPROBANTE_DETALLE
                                SET CODE_CREDITO = :MONTO
                            WHERE CUEN_COD = :CUENTA AND ENCO_CONSEC = :IDC AND ARTI_COD = :ART;
                        END
                    END
                ELSE
                    BEGIN
                    SELECT COUNT(*) FROM COMPROBANTE_DETALLE WHERE CUEN_COD = :CUENTA AND ENCO_CONSEC = :IDC INTO :NUMROWS;
                    if (NUMROWS = 0) then
                        BEGIN
                        if (TIPOCUEN = 'C') then
                            INSERT INTO comprobante_detalle (ENCO_CONSEC, CODE_ITEM, CUEN_COD, CODE_CONCEPTO, CODE_REFER, CODE_DEBITO, CODE_CREDITO, CODE_BASE, CODE_PORC, TERC_NIT, PROY_COD, CENT_COD, CNDE_DOCNUMERO, CNDE_DOCAPLICA, DOCO_VENCE, ARTI_COD, CODE_TIPOAPL, CODE_TIPONUE)
                                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                        ELSE
                            INSERT INTO comprobante_detalle (ENCO_CONSEC, CODE_ITEM, CUEN_COD, CODE_CONCEPTO, CODE_REFER, CODE_DEBITO, CODE_CREDITO, CODE_BASE, CODE_PORC, TERC_NIT, PROY_COD, CENT_COD, CNDE_DOCNUMERO, CNDE_DOCAPLICA, DOCO_VENCE, ARTI_COD, CODE_TIPOAPL, CODE_TIPONUE)
                                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NROI = NROI + 1;
                        END
                    ELSE
                        UPDATE COMPROBANTE_DETALLE
                            SET CODE_CREDITO = :MONTO
                        WHERE CUEN_COD = :CUENTA AND ENCO_CONSEC = :IDC;
                    END
                END /* MONTO <> 0 */
            END /* FOR */
        END /* INVEN = A */
    if (INVEN = 'K') then
        BEGIN
        SELECT SUM(CANT * COSTO)
            FROM COSTO_VENTAS WHERE TIDO_COD = 31 AND COVE_ID = :ID
            INTO :MONTO;
        if (MONTO <> 0) then
            BEGIN
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTAINVEN INTO :CUENTA, :TIPOCUEN;
            IF (CUENTA IS NULL) THEN
                begin
                EXCEPTION CUENTA_NO_EXISTE 'La cuenta ' || :ctainven || ' no existe.';
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT ARTI_COD, CANT * COSTO
                    FROM COSTO_VENTAS WHERE TIDO_COD = 31 AND COVE_ID = :ID
                    INTO :ART, :MONTO
                DO
                    BEGIN
                    SELECT COUNT(*) FROM COMPROBANTE_DETALLE WHERE CUEN_COD = :CUENTA AND ENCO_CONSEC = :IDC AND ARTI_COD = :ART INTO :NUMROWS;
                    if (NUMROWS = 0) then
                        BEGIN
                        INSERT INTO comprobante_detalle (ENCO_CONSEC, CODE_ITEM, CUEN_COD, CODE_CONCEPTO, CODE_REFER, CODE_DEBITO, CODE_CREDITO, CODE_BASE, CODE_PORC, TERC_NIT, PROY_COD, CENT_COD, CNDE_DOCNUMERO, CNDE_DOCAPLICA, DOCO_VENCE, ARTI_COD, CODE_TIPOAPL, CODE_TIPONUE)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        END
                    ELSE
                        UPDATE COMPROBANTE_DETALLE
                            SET CODE_CREDITO = :MONTO
                        WHERE CUEN_COD = :CUENTA AND ENCO_CONSEC = :IDC AND ARTI_COD = :ART;
                    END
                END
            ELSE
                BEGIN
                SELECT COUNT(*) FROM COMPROBANTE_DETALLE WHERE CUEN_COD = :CUENTA AND ENCO_CONSEC = :IDC INTO :NUMROWS;
                if (NUMROWS = 0) then
                    BEGIN
                    if (TIPOCUEN = 'C') then
                        INSERT INTO comprobante_detalle (ENCO_CONSEC, CODE_ITEM, CUEN_COD, CODE_CONCEPTO, CODE_REFER, CODE_DEBITO, CODE_CREDITO, CODE_BASE, CODE_PORC, TERC_NIT, PROY_COD, CENT_COD, CNDE_DOCNUMERO, CNDE_DOCAPLICA, DOCO_VENCE, ARTI_COD, CODE_TIPOAPL, CODE_TIPONUE)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    ELSE
                        INSERT INTO comprobante_detalle (ENCO_CONSEC, CODE_ITEM, CUEN_COD, CODE_CONCEPTO, CODE_REFER, CODE_DEBITO, CODE_CREDITO, CODE_BASE, CODE_PORC, TERC_NIT, PROY_COD, CENT_COD, CNDE_DOCNUMERO, CNDE_DOCAPLICA, DOCO_VENCE, ARTI_COD, CODE_TIPOAPL, CODE_TIPONUE)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    END
                ELSE
                    UPDATE COMPROBANTE_DETALLE
                        SET CODE_CREDITO = :MONTO
                    WHERE CUEN_COD = :CUENTA AND ENCO_CONSEC = :IDC;
                END
            END /* MONTO <> 0 */
        END /* INVEN = K */
    END
  END
end

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE CONTABIL_DEVOLCLI(
    IDDOC INTEGER,
    IDINTER INTEGER)
RETURNS (
    ERROR INTEGER,
    VER CHAR(1),
    IDC INTEGER)
AS
declare variable PREF VARCHAR(4);
declare variable NUM VARCHAR(6);
declare variable NUMERO VARCHAR(10);
declare variable FECAUX DATE;
declare variable FECHA CHAR(8);
declare variable CONC CHAR(120);
declare variable NUMFAC VARCHAR(10);
declare variable VRDTO NUMERIC(18, 2);
declare variable VRADIC NUMERIC(18, 2);
declare variable VRSUBT NUMERIC(18, 2);
declare variable VRIVA NUMERIC(18, 2);
declare variable PRTFTE NUMERIC(9, 2);
declare variable VRRTFTE NUMERIC(18, 2);
declare variable VRRTIVA NUMERIC(18, 2);
declare variable PRTICA NUMERIC(9, 2);
declare variable VRRTICA NUMERIC(18, 2);
declare variable VRTOTAL NUMERIC(18, 2);
declare variable VREXTRA NUMERIC(18, 2);
declare variable TIPOCOMP VARCHAR(3);
declare variable PREFCONT VARCHAR(4);
declare variable VENTAS CHAR(1);
declare variable CTAVENTAS VARCHAR(20);
declare variable IVA CHAR(1);
declare variable CTAIVA VARCHAR(20);
declare variable CONSUMO CHAR(1);
declare variable CTACONSUMO VARCHAR(20);
declare variable CARTERA CHAR(1);
declare variable CTACARTERA VARCHAR(20);
declare variable RTFTE CHAR(1);
declare variable CTARTFTE VARCHAR(20);
declare variable RTIVA CHAR(1);
declare variable CTARTIVA VARCHAR(20);
declare variable RTICA CHAR(1);
declare variable CTARTICA VARCHAR(20);
declare variable INVEN CHAR(1);
declare variable CTAINVEN VARCHAR(20);
declare variable COSTOS CHAR(1);
declare variable CTACOSTOS VARCHAR(20);
declare variable CTADTO VARCHAR(20);
declare variable CTAADIC VARCHAR(20);
declare variable CTAEXTRA VARCHAR(20);
declare variable EXISTE CHAR(1);
declare variable CUENTA VARCHAR(20);
declare variable MONTO NUMERIC(18,2);
declare variable TIPOCUEN CHAR(1);
declare variable NIT VARCHAR(20);
declare variable PROY VARCHAR(4);
declare variable CENTRO VARCHAR(4);
declare variable PORC NUMERIC(5,2);
declare variable DEBITO NUMERIC(18,2);
declare variable CREDITO NUMERIC(18,2);
declare variable NROI INTEGER;
declare variable ART VARCHAR(15);
declare variable IMPINC CHAR(1);
declare variable IMPTOS NUMERIC(18, 2);
declare variable SUMA NUMERIC(18,2);
declare variable PORCIVA NUMERIC(9,2);
declare variable TCTACLIEN VARCHAR(20);
declare variable TCTAVENTA VARCHAR(20);
declare variable TCTARTFTE VARCHAR(20);
declare variable TCTARTIVA VARCHAR(20);
declare variable TCTARTICA VARCHAR(20);
declare variable CTADIC VARCHAR(20);
declare variable BASEADIC VARCHAR(20);
declare variable PORCADIC NUMERIC(5,2);
declare variable VALORADIC NUMERIC(18,2);
declare variable DBADIC CHAR(1);
declare variable PTOVTA INTEGER;
declare variable ANULADO CHAR(1);
declare variable CENT CHAR(1);
DECLARE VARIABLE MERCANCIA NUMERIC(18,2);
declare variable FACTOR DOUBLE PRECISION;
declare variable DIG INTEGER;
DECLARE VARIABLE FOMENTO VARCHAR(2);
DECLARE VARIABLE VRCONSUMO NUMERIC(18,2);
declare variable AUTORET VARCHAR(10);
declare variable FAUTORET DATE;
declare variable IDREM INTEGER;
declare variable DTOXIT CHAR(2);
declare variable ERRORC INTEGER;
BEGIN
EXECUTE PROCEDURE LEE_CONFIGURACION('COMPRAS', 'FACTURAS', 'USAR IMPOCONSUMO COMO PORCENTAJE DE FOMENTO') returning_values (FOMENTO);
EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'FECHA AUTORETENEDOR NO DESCONTAR RETENCIONES DEL SALDO PERO SI CONTABILIZARLAS') returning_values (AUTORET);
if (AUTORET <> '') then
    FAUTORET = CAST(AUTORET AS DATE);
else
    FAUTORET = '9999/12/31';
  /* BUSQUE LA INTERFACE */
  EXISTE = 'N';
  SELECT 'S', TICO_COD, PRCO_PRE, INVE_VENTAS, INVE_IVA, INVE_CONSUMO, INVE_CARTERA, INVE_RTFTE, INVE_RTIVA, INVE_RTICA, INVE_COSTO, INVE_INVEN, INVE_CTAVENTAS, INVE_CTAIVA, INVE_CTACONSUMO, INVE_CTADTO, INVE_CTAADIC, INVE_CTAEXTRA, INVE_CTACARTERA, INVE_CTARTFTE, INVE_CTARTIVA, INVE_CTARTICA, INVE_CTAINVEN, INVE_CTACOSTOS, INVE_CONFIRMAR, INVE_CENTRO
    FROM INTERFAZ_VENTAS
    WHERE INVE_ID = :IDINTER
    INTO :EXISTE, :TIPOCOMP, :PREFCONT, :VENTAS, :IVA, :CONSUMO, :CARTERA, :RTFTE, :RTIVA, :RTICA, :COSTOS, :INVEN, :CTAVENTAS, :CTAIVA, :CTACONSUMO, :CTADTO, :CTAADIC, :CTAEXTRA, :CTACARTERA, :CTARTFTE, :CTARTIVA, :CTARTICA, :CTAINVEN, :CTACOSTOS, :VER, :CENT;
  if (EXISTE = 'S') then
   BEGIN
    /* BORRE CUALQUEIR CONTABILIZACION PREVIA */
    DELETE FROM CONTABILIZACION WHERE CNTB_TIPOREF = 33 AND CNTB_IDREF = :IDDOC;
    /* TRAIGA EL ENCABEZADO DE LA DEVOLUCION */
   SELECT PREF_PRE, DEVT_NUMERO, DEVT_FECHA, F.TERC_NIT, DEVT_IVAINC, PTVT_ID, DEVT_FACTURA, DEVT_DTOMONTO, DEVT_ADICIONAL, DEVT_IVAMONTO, DEVT_EXTRA, DEVT_TOTAL, DEVT_RTFTEPORC, DEVT_RTFTEMONTO, DEVT_RTIVAPORC, DEVT_RTIVAMONTO, DEVT_RTICAPORC, DEVT_RTICAMONTO, TERC_CTARTFTE, TERC_CTARTIVA, TERC_CTARTICA, TERC_CTAVENTA, TERC_CTACLIENTE, DEVT_ANULADO, DEVT_REMID
        FROM DEVOLUCIONES_VENTAS F, TERCEROS T
        WHERE DEVT_ID = :IDDOC AND F.TERC_NIT = T.TERC_NIT
        INTO :PREF, :NUM, :FECAUX, :NIT, :IMPINC, :PTOVTA, :NUMFAC, :VRDTO, :VRADIC, :VRIVA, :VREXTRA, :VRTOTAL, :PRTFTE, :VRRTFTE, :PORC, :VRRTIVA, :PRTICA, :VRRTICA, :TCTARTFTE, TCTARTIVA, TCTARTICA, TCTAVENTA, TCTACLIEN, ANULADO, :IDREM;
   if (idrem is null) Then
    IDREM = 0;
   if ((ANULADO = 'N') AND (IDREM = 0)) then
    BEGIN
    NUMERO = PREF || NUM;
    SELECT SUM(DVDE_CONSUMO) FROM devoluciones_ventas_detalle WHERE DEVT_ID = :iddoc AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL)) INTO :MERCANCIA;
    VRSUBT = VRTOTAL - VREXTRA - VRIVA - MERCANCIA; /* BASE DE RETEFTE Y RETEICA */
    EXECUTE PROCEDURE lee_configuracion ('FACTURACION', 'DEVOLUCIONES', 'DESCUENTO PIE DEVOLUCION IGUAL A SUMA DE DESCUENTOS POR ITEM') returning_values (:DTOXIT);
    if (DTOXIT = 'SI') then
        VRDTO = 0;
    MERCANCIA = VRSUBT - VRADIC + VRDTO;
    IF (CENT = 'B') THEN
        SELECT B.BODE_CENTRO, B.BODE_PROY FROM BODEGA B, DEVOLUCIONES_VENTAS F
            WHERE B.BODE_COD = F.BODE_COD AND F.DEVT_ID = :IDDOC INTO :CENTRO, :PROY;
    IF (CENT = 'V') THEN
        SELECT V.CENT_COD, V.PROY_COD FROM VENDEDORES V, DEVOLUCIONES_VENTAS F
            WHERE V.VEND_COD = F.VEND_COD AND F.DEVT_ID = :IDDOC INTO :CENTRO, :PROY;
    IF (CENT = 'P') THEN
        SELECT P.PREF_CENTRO,P.PREF_PROY  FROM PREFIJOS P, DEVOLUCIONES_VENTAS F
            WHERE P.PREF_PRE = F.PREF_PRE AND F.DEVT_ID = :IDDOC AND P.TIDO_COD = 33 INTO :CENTRO, :PROY;
    EXECUTE PROCEDURE FECHA_A_CONTA(:FECAUX) returning_values (:FECHA);
    /* REGISTRE EL ENCABEZADO CONTABLE */
    IDC = GEN_ID(ID_CONTABILIZA, 1);
    CONC = 'DEVOLUCION VENTAS No. ' || NUMERO || ' EN FACTURA ' || NUMFAC;
    CONC = SUBSTR(CONC, 1, 60);
    INSERT INTO CONTABILIZACION (CNTB_ID, CNTB_TIPOCOMP, CNTB_PREFCNT, CNTB_NUMERO, CNTB_FECHA, CNTB_CONCEPTO, CNTB_REF, CNTB_TIPOREF, CNTB_IDREF, CNTB_PREFREF, CNTB_NUMREF, CNTB_PROCESADO)
        VALUES (:IDC, :TIPOCOMP, :PREFCONT, :NUM, :FECHA, :CONC, '', 33, :IDDOC, :PREF, :NUM, 'N');
    NROI = 0;
    SUMA = 0;
    ERROR = 0;
    /* SI NO HAY CUENTA DE DESCUENTO NI ADICIONAL CALCULE UN FACTOR PARA LAS VENTAS Y EL IVA */
    if (MERCANCIA <> 0) then
        FACTOR = CAST(VRSUBT AS DOUBLE PRECISION) / CAST(MERCANCIA AS DOUBLE PRECISION);
    ELSE
        FACTOR = 1;
    /* TRAIGA EL NUMERO DE DIGITOS PARA EL REDONDEO */
    SELECT CAST(CONF_VALOR AS INTEGER) FROM CONFIGURACION WHERE CONF_MODULO = 'FACTURACION' AND
        CONF_CATEGORIA = 'GENERAL' AND CONF_PROPIEDAD = 'REDONDEO AL MULTIPLO DE DIEZ EN TOTALES' INTO :DIG;
    /* CUENTAS DE VENTAS */
    if (VENTAS = 'A') then
        BEGIN
        FOR SELECT MAX(COAR_CTADEV), SUM(DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO), SUM(DVDE_IVAMONTO), SUM(DVDE_CONSUMO)
            FROM ARTICULO A, CONTABIL_ARTICULO C, DEVOLUCIONES_VENTAS_DETALLE F
            WHERE F.DEVT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
            GROUP BY COAR_CTADEV
            INTO :CTAVENTAS, :MONTO, :IMPTOS, :VRCONSUMO
            DO
            BEGIN
            if (FOMENTO = 'SI') then
                MONTO = MONTO + VRCONSUMO;
            if ((CTADTO IS NULL) OR (CTADTO = '')) then
                MONTO = MONTO * FACTOR;
            execute procedure redondee(MONTO, DIG) returning_values (MONTO);
            if (MONTO <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTAVENTAS, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT F.ARTI_COD, (DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO), (DVDE_IVAMONTO+DVDE_CONSUMO)
                        FROM ARTICULO A, CONTABIL_ARTICULO C, DEVOLUCIONES_VENTAS_DETALLE F
                        WHERE F.DEVT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTAINV = :CUENTA AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
                        INTO :ART, :MONTO, :IMPTOS
                    DO
                        BEGIN
                        if (IMPINC = 'S') then
                            MONTO = MONTO - IMPTOS;
                        if ((CTADTO IS NULL) OR (CTADTO = '')) then
                            MONTO = MONTO * FACTOR;
                        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        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, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                    NROI = NROI + 1;
                    SUMA = SUMA + MONTO;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA + MONTO;
                    END
                END /* MONTO <> 0 */
            END /* FOR */
        END /* VENTAS X ARTICULO */
     IF ((VENTAS = 'C') OR (VENTAS = 'K')) THEN
        BEGIN
        IF (VENTAS = 'C') THEN
            CTAVENTAS = TCTAVENTA;
        SELECT SUM(DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO), SUM(DVDE_IVAMONTO), SUM(DVDE_CONSUMO)
            FROM DEVOLUCIONES_VENTAS_DETALLE F
            WHERE F.DEVT_ID = :IDDOC  AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
            INTO :MONTO, :IMPTOS, :VRCONSUMO;
        if (FOMENTO = 'SI') then
            MONTO = MONTO + VRCONSUMO;
        if ((CTADTO IS NULL) OR (CTADTO = '')) then
            MONTO = MONTO * FACTOR;
        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
        if (MONTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTAVENTAS, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT F.ARTI_COD, (DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO), (DVDE_IVAMONTO+DVDE_CONSUMO)
                    FROM ARTICULO A, DEVOLUCIONES_VENTAS_DETALLE F
                    WHERE F.DEVT_ID = :IDDOC AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
                    INTO :ART, :MONTO, :IMPTOS
                    DO
                    BEGIN
                    if (IMPINC = 'S') then
                        MONTO = MONTO - IMPTOS;
                    if ((CTADTO IS NULL) OR (CTADTO = '')) then
                        MONTO = MONTO * FACTOR;
                    execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                    NROI = NROI + 1;
                    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, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                NROI = NROI + 1;
                SUMA = SUMA + MONTO;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA + MONTO;
                END
            END /* MONTO <> 0 */
        END /* VENTAS DE CLIENTE O CONSTANTE */
    /* EL IVA EN VENTAS */
    if (IVA = 'A') then
        BEGIN
        FOR SELECT MAX(COAR_CTAIVAV), SUM(DVDE_IVAMONTO), SUM(DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO), SUM(DVDE_CONSUMO)
            FROM ARTICULO A, CONTABIL_ARTICULO C, DEVOLUCIONES_VENTAS_DETALLE F
            WHERE F.DEVT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
            GROUP BY COAR_CTAIVAV
            INTO :CTAIVA, :IMPTOS, :MONTO, :VALORADIC
        DO
            BEGIN
            if (FOMENTO = 'SI') then
                MONTO = MONTO + VALORADIC;
            MONTO = MONTO * -1;
            MONTO = MONTO * FACTOR;
            IMPTOS = IMPTOS * FACTOR;
            execute procedure redondee(MONTO, DIG) returning_values (MONTO);
            execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
            if (IMPTOS <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTAIVA, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT F.ARTI_COD, DVDE_IVAMONTO, (DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO), TAIV_PORC, DVDE_CONSUMO
                        FROM ARTICULO A, CONTABIL_ARTICULO C, DEVOLUCIONES_VENTAS_DETALLE F, TARIFA_IVA T
                        WHERE F.DEVT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND A.TAIV_COD = T.TAIV_COD AND COAR_CTAIVAV = :CUENTA AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
                        INTO :ART, :IMPTOS, :MONTO, :PORCIVA, :VALORADIC
                    DO
                        BEGIN
                        if (IMPINC = 'S') then
                            MONTO = MONTO - IMPTOS - VALORADIC;
                        MONTO = MONTO * -1;
                        MONTO = MONTO * FACTOR;
                        IMPTOS = IMPTOS * FACTOR;
                        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                        execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                        if (IMPTOS <> 0) then
                            BEGIN
                            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :IMPTOS, 0, :MONTO, :PORCIVA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                            NROI = NROI + 1;
                            SUMA = SUMA + IMPTOS;
                            END
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                    NROI = NROI + 1;
                    SUMA = SUMA + IMPTOS;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA + IMPTOS;
                    END
                END   /* IMPTOS <> 0 */
            END /* FOR */
        END /* IVA X ARTICULO */
    if (IVA = 'K') then /* IVA EN CTA CONSTANTE */
        BEGIN
        SELECT SUM(DVDE_IVAMONTO), SUM(DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO), SUM(DVDE_CONSUMO)
            FROM DEVOLUCIONES_VENTAS_DETALLE F
            WHERE F.DEVT_ID = :IDDOC  AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
            INTO :IMPTOS, :MONTO, :VALORADIC;
        if (FOMENTO = 'SI') then
            MONTO = MONTO + VALORADIC;
        MONTO = MONTO * -1;
        MONTO = MONTO * FACTOR;
        IMPTOS = IMPTOS * FACTOR;
        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
        execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
        if (IMPTOS <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTAIVA, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT F.ARTI_COD, (DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO), DVDE_IVAMONTO, TAIV_PORC, DVDE_CONSUMO
                    FROM ARTICULO A, DEVOLUCIONES_VENTAS_DETALLE F, TARIFA_IVA T
                    WHERE F.DEVT_ID = :IDDOC AND A.TAIV_COD = T.TAIV_COD AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
                    INTO :ART, :MONTO, :IMPTOS, :PORCIVA, :VALORADIC
                    DO
                    BEGIN
                    if (IMPINC = 'S') then
                        MONTO = MONTO - IMPTOS - VALORADIC;
                    MONTO = MONTO * -1;
                    MONTO = MONTO * FACTOR;
                    IMPTOS = IMPTOS * FACTOR;
                    execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                    execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                    if (IMPTOS <> 0) then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', :IMPTOS, 0, :MONTO, :PORCIVA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        SUMA = SUMA + IMPTOS;
                        END
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                NROI = NROI + 1;
                SUMA = SUMA + IMPTOS;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA + IMPTOS;
                END
            END /* IMPTOS <> 0 */
        END /* IVA EN CTA CONSTANTE */
    /* EL IMPOCONSUMO */
    if ((CONSUMO = 'A') AND (FOMENTO <> 'SI')) then
        BEGIN
        FOR SELECT MAX(COAR_CTACONS), SUM(DVDE_CONSUMO)
            FROM ARTICULO A, CONTABIL_ARTICULO C, DEVOLUCIONES_VENTAS_DETALLE F
            WHERE F.DEVT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
            GROUP BY COAR_CTACONS
            INTO :CTACONSUMO, :IMPTOS
        DO
            BEGIN
            if (IMPTOS <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTACONSUMO, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, REGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT F.ARTI_COD, DVDE_CONSUMO
                        FROM ARTICULO A, CONTABIL_ARTICULO C, DEVOLUCIONES_VENTAS_DETALLE F
                        WHERE F.DEVT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTACONS = :CUENTA AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
                        INTO :ART, :IMPTOS
                    DO
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 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, :NROI, :CUENTA, :CONC, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                    NROI = NROI + 1;
                    SUMA = SUMA + IMPTOS;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA + IMPTOS;
                    END
                END /* IMPTOS <> 0 */
            END /* FOR */
        END /* CONSUMO X ARTICULO */
    if ((CONSUMO = 'K') AND (FOMENTO <> 'SI')) then
        BEGIN
        SELECT SUM(DVDE_CONSUMO)
            FROM DEVOLUCIONES_VENTAS_DETALLE F
            WHERE F.DEVT_ID = :IDDOC AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
            INTO :IMPTOS;
        if (IMPTOS <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTACONSUMO, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT F.ARTI_COD, DVDE_CONSUMO
                    FROM ARTICULO A, DEVOLUCIONES_VENTAS_DETALLE F
                    WHERE F.DEVT_ID = :IDDOC  AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
                    INTO :ART, :IMPTOS
                    DO
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTACONSUMO, :CONC, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                    NROI = NROI + 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, :NROI, :CTACONSUMO, :CONC, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA + IMPTOS;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTACONSUMO, :CONC, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA + IMPTOS;
                END
            END /* IMPTOS <> 0 */
        END /* CONSUMO EN CTA CONSTANTE */
    /* DESCUENTO */
    if ((CTADTO IS NOT NULL) AND
        (CTADTO <> '') AND
        (VRDTO <> 0)) THEN
        BEGIN
        EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTADTO, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRDTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
            NROI = NROI + 1;
            SUMA = SUMA - VRDTO;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRDTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 33);
            NROI = NROI + 1;
            SUMA = SUMA - VRDTO;
            END
        END /* DESCUENTO */
    /* VALOR ADIC */
    if ((CTAADIC IS NOT NULL) AND
        (CTAADIC <> '') AND
        (VRADIC <> 0)) THEN
        BEGIN
        EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTAADIC, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRADIC, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
            NROI = NROI + 1;
            SUMA = SUMA + VRADIC;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRADIC, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 33);
            NROI = NROI + 1;
            SUMA = SUMA + VRADIC;
            END
        END /* VR. ADIC */
    /* VALOR EXTRA */
    if ((CTAEXTRA IS NOT NULL) AND
        (CTAEXTRA <> '') AND
        (VREXTRA <> 0)) THEN
        BEGIN
        EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTAEXTRA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VREXTRA, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
            NROI = NROI + 1;
            SUMA = SUMA + VREXTRA;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VREXTRA, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 33);
            NROI = NROI + 1;
            SUMA = SUMA + VREXTRA;
            END
        END /* VR. EXTRA */
    /* RETENCION FUENTE */
    if ((RTFTE = 'C') or (RTFTE = 'K')) then
      if (VRRTFTE <> 0) then
        BEGIN
        if (RTFTE = 'C') then
            CTARTFTE = TCTARTFTE;
        EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTARTFTE, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, (:VRSUBT*-1), :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
            NROI = NROI + 1;
            SUMA = SUMA - VRRTFTE;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, (:VRSUBT*-1), :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA - VRRTFTE;
            END
        /* AUTORETENCION */
        if (FAUTORET <= fecaux) then
            BEGIN
            EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'CUENTA DE AUTORETENCION EN LA FUENTE') returning_values (CTARTFTE);
            EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTARTFTE, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :VRSUBT, :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                NROI = NROI + 1;
                SUMA = SUMA + VRRTFTE;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :VRSUBT, :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA + VRRTFTE;
                END
            END
        END /* RTFTE */
    if (RTFTE = 'A') then
      BEGIN
      FOR SELECT MAX(COAR_CTARTFTEV), MAX(COAR_RTFTE), MIN(COAR_RTBASE), SUM(DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO), SUM((DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO)*COAR_RTFTE)
        FROM CONTABIL_ARTICULO C, devoluciones_ventas_detalle F
        WHERE F.devt_id = :IDDOC AND F.ARTI_COD = C.ARTI_COD AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
        GROUP BY COAR_CTARTFTEV
        INTO :CTARTFTE, :PRTFTE, :baseadic, :MONTO, :VRRTFTE
        DO
        BEGIN
        MONTO = MONTO * FACTOR;
        if (MONTO >= BASEADIC) then
            BEGIN
            VRRTFTE = VRRTFTE * FACTOR / 100;
            execute procedure redondee(VRRTFTE, DIG) returning_values (VRRTFTE);
            execute procedure redondee(MONTO, DIG) returning_values (MONTO);
            if (VRRTFTE <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTARTFTE, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, (:MONTO*-1), :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                    NROI = NROI + 1;
                    SUMA = SUMA - VRRTFTE;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, (:MONTO*-1), :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA - VRRTFTE;
                    END
                /* AUTORETENCION */
                if (FAUTORET <= fecaux) then
                    BEGIN
                    EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'CUENTA DE AUTORETENCION EN LA FUENTE') returning_values (CTARTFTE);
                    EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTARTFTE, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
                    if (ERRORC <> 0) then
                        ERROR = ERROR + 1;
                    if (TIPOCUEN = 'C') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :MONTO, :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                        NROI = NROI + 1;
                        SUMA = SUMA + VRRTFTE;
                        END
                    if (TIPOCUEN = 'N') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :MONTO, :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NROI = NROI + 1;
                        SUMA = SUMA + VRRTFTE;
                        END
                    END
                END
            END
        END /* RTFTE */
      END
    /* RETENCION IVA */
    if ((RTIVA = 'C') or (RTIVA = 'K')) then
      if (VRRTIVA <> 0) then
        BEGIN
        if (RTIVA = 'C') then
            CTARTIVA = TCTARTIVA;
        EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTARTIVA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTIVA, (:VRIVA*-1), :PORC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
            NROI = NROI + 1;
            SUMA = SUMA - VRRTIVA;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTIVA, (:VRIVA*-1), :PORC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA - VRRTIVA;
            END
        END /* RTIVA */
    /* RETENCION DE ICA */
    if ((RTICA = 'C') or (RTICA = 'K')) then
      if (VRRTICA <> 0) then
        BEGIN
        if (RTICA = 'C') then
            CTARTICA = TCTARTICA;
        EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTARTICA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTICA, (:VRSUBT*-1), :PRTICA, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
            NROI = NROI + 1;
            SUMA = SUMA - VRRTICA;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTICA, (:VRSUBT*-1), :PRTICA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA - VRRTICA;
            END
        END /* RTICA */
    /* CIERRE EL COMPROBANTE CONTRA LA CUENTA DEL TERCERO O LA CONSTANTE */
    if ((SUMA <> 0) and ((CARTERA = 'C') or (CARTERA = 'K') or (CARTERA = 'J'))) then
        BEGIN
        if (SUMA < 0) then
            BEGIN
            DEBITO = SUMA * -1;
            CREDITO = 0;
            END
        ELSE
            BEGIN
            DEBITO = 0;
            CREDITO = SUMA;
            END
        if (CARTERA = 'C') then
            CTACARTERA = TCTACLIEN;
        if (CARTERA = 'J') then
            BEGIN
            /* BUSQUE LA CUENTA DE LA CAJA */
            SELECT CAJA_CUENTA FROM CAJAS C, PUNTO_VENTA P
                WHERE P.CAJA_ID = C.CAJA_ID AND PTVT_ID = :PTOVTA
                INTO :CTACARTERA;
            END
        EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTACARTERA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :DEBITO, :CREDITO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
        if (TIPOCUEN = 'N') then
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :DEBITO, :CREDITO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
        NROI = NROI + 1;
        END /* SUMA EN CARTERA */
    /* CALCULE COSTOS EN VENTAS */
    EXECUTE PROCEDURE COSTO_EN_VENTAS(33, :IDDOC);
    if (COSTOS = 'A') then
        BEGIN
        FOR SELECT MAX(CTACOS), SUM(cast(CANT as double precision) * COSTO)
            FROM COSTO_VENTAS WHERE TIDO_COD = 33 AND COVE_ID = :IDDOC
            GROUP BY CTACOS
            INTO :CTACOSTOS, :MONTO
        DO
            BEGIN
            if (MONTO <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTACOSTOS, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT ARTI_COD, cast(CANT as double precision) * COSTO
                        FROM COSTO_VENTAS WHERE TIDO_COD = 33 AND COVE_ID = :IDDOC AND CTACOS = :CUENTA
                        INTO :ART, :MONTO
                    DO
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                    NROI = NROI + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    END
                END /* MONTO <> 0 */
            END /* FOR */
        END /* COSTOS */
    if (COSTOS = 'K') then
        BEGIN
        SELECT SUM(cast(CANT as double precision) * COSTO)
            FROM COSTO_VENTAS WHERE TIDO_COD = 33 AND COVE_ID = :IDDOC
            INTO :MONTO;
        if (MONTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTACOSTOS, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, REGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT ARTI_COD, cast(CANT as double precision) * COSTO
                    FROM COSTO_VENTAS WHERE TIDO_COD = 33 AND COVE_ID = :IDDOC
                    INTO :ART, :MONTO
                DO
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTACOSTOS, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                    NROI = NROI + 1;
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTACOSTOS, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                NROI = NROI + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTACOSTOS, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                END
            END /* MONTO <> 0 */
        END /* COSTOS = K */
    if (INVEN = 'A') then
        BEGIN
        FOR SELECT MAX(CTAINV), SUM(cast(CANT as double precision) * COSTO)
            FROM COSTO_VENTAS WHERE TIDO_COD = 33 AND COVE_ID = :IDDOC
            GROUP BY CTAINV
            INTO :CTAINVEN, :MONTO
        DO
            BEGIN
            if (MONTO <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTAINVEN, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, REGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT ARTI_COD, cast(CANT as double precision) * COSTO
                        FROM COSTO_VENTAS WHERE TIDO_COD = 33 AND COVE_ID = :IDDOC AND CTAINV = :CUENTA
                        INTO :ART, :MONTO
                    DO
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                    NROI = NROI + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    END
                END /* MONTO <> 0 */
            END /* FOR */
        END /* INVEN = A */
    if (INVEN = 'K') then
        BEGIN
        SELECT SUM(cast(CANT as double precision) * COSTO)
            FROM COSTO_VENTAS WHERE TIDO_COD = 33 AND COVE_ID = :IDDOC
            INTO :MONTO;
        if (MONTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTAINVEN, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT ARTI_COD, cast(CANT as double precision) * COSTO
                    FROM COSTO_VENTAS WHERE TIDO_COD = 33 AND COVE_ID = :IDDOC
                    INTO :ART, :MONTO
                DO
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTAINVEN, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                    NROI = NROI + 1;
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAINVEN, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                NROI = NROI + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAINVEN, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                END
            END /* MONTO <> 0 */
        END /* INVEN = K */
    /* recorra las cuentas adicionales */
    FOR SELECT INVC_CUENTA, INVC_BASE, INVC_PORC, INVC_VALOR, INVC_DB
        FROM INTERFAZ_VENTAS_CTAS WHERE INVE_ID = :IDINTER
        INTO :CTADIC, :BASEADIC, :PORCADIC, :VALORADIC, :DBADIC
        DO
        BEGIN
        if (valoradic <> 0) then
            monto = valoradic;
        else
            BEGIN
            if (:BASEADIC = 'SUBTOTAL') then
                VALORADIC = vrsubt;
            if (:BASEADIC = 'DESCUENTO') then
                VALORADIC = VRDTO;
            if (:BASEADIC = 'IVA') then
                VALORADIC = VRIVA;
            if (:BASEADIC = 'ADICIONAL') then
                VALORADIC = VRADIC;
            if (:BASEADIC = 'EXTRA') then
                VALORADIC = VREXTRA;
            if (:BASEADIC = 'TOTAL') then
                VALORADIC = VRTOTAL;
            MONTO = VALORADIC * PORCADIC;
            END
        if (MONTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTADIC, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                if (DBADIC = 'S') then
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                ELSE
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                NROI = NROI + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                if (DBADIC = 'S') then
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                ELSE
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                END
            NROI = NROI + 1;
            END
        END
    if (error > 0) then
        ver = 'S';
    SUSPEND;
    END
   END /* EXISTE LA INTERFAZ */
  ELSE
    BEGIN
    EXECUTE PROCEDURE ERROR (33, :IDDOC, :PREF, 1);
    ERROR = ERROR + 1;
    VER = 'S';
    SUSPEND;
    END
END

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE CONTABIL_FACTURA(
    IDDOC INTEGER,
    IDINTER INTEGER)
RETURNS (
    ERROR INTEGER,
    VER CHAR(1),
    IDC INTEGER)
AS
declare variable pref varchar(4);
declare variable num varchar(6);
declare variable numero varchar(10);
declare variable fecaux date;
declare variable fecha char(8);
declare variable conc varchar(60);
declare variable venceaux date;
declare variable vence char(8);
declare variable vrdto numeric(18,2);
declare variable vradic numeric(18,2);
declare variable vrsubt numeric(18,2);
declare variable vriva numeric(18,2);
declare variable prtfte numeric(9,2);
declare variable vrrtfte numeric(18,2);
declare variable vrrtiva numeric(18,2);
declare variable prtica numeric(9,2);
declare variable vrrtica numeric(18,2);
declare variable vrtotal numeric(18,2);
declare variable vrextra numeric(18,2);
declare variable tipocomp varchar(3);
declare variable prefcont varchar(4);
declare variable ventas char(1);
declare variable ctaventas varchar(20);
declare variable iva char(1);
declare variable ctaiva varchar(20);
declare variable consumo char(1);
declare variable ctaconsumo varchar(20);
declare variable cartera char(1);
declare variable ctacartera varchar(20);
declare variable rtfte char(1);
declare variable ctartfte varchar(20);
declare variable rtiva char(1);
declare variable ctartiva varchar(20);
declare variable rtica char(1);
declare variable ctartica varchar(20);
declare variable inven char(1);
declare variable ctainven varchar(20);
declare variable costos char(1);
declare variable ctacostos varchar(20);
declare variable ctadto varchar(20);
declare variable ctaadic varchar(20);
declare variable ctaextra varchar(20);
declare variable existe char(1);
declare variable cuenta varchar(20);
declare variable monto numeric(18,2);
declare variable tipocuen char(1);
declare variable nit varchar(20);
declare variable nombre varchar(60);
declare variable proy varchar(4);
declare variable centro varchar(4);
declare variable porc numeric(5,2);
declare variable debito numeric(18,2);
declare variable credito numeric(18,2);
declare variable nroi integer;
declare variable art varchar(15);
declare variable imptos numeric(18,2);
declare variable suma numeric(18,2);
declare variable porciva numeric(9,2);
declare variable tctaclien varchar(20);
declare variable tctaventa varchar(20);
declare variable tctartfte varchar(20);
declare variable tctartiva varchar(20);
declare variable tctartica varchar(20);
declare variable ctadic varchar(20);
declare variable baseadic varchar(20);
declare variable porcadic numeric(5,2);
declare variable valoradic numeric(18,2);
declare variable dbadic char(1);
declare variable ptovta integer;
declare variable anulado char(1);
declare variable dig integer;
declare variable mercancia numeric(18,2);
declare variable fomento varchar(2);
declare variable DTOXIT varchar(2);
declare variable vrconsumo numeric(18,2);
declare variable factor double precision;
declare variable cent char(1);
declare variable AUTORET VARCHAR(10);
declare variable FAUTORET DATE;
declare variable ERRORC INTEGER;
BEGIN
EXECUTE PROCEDURE LEE_CONFIGURACION('COMPRAS', 'FACTURAS', 'USAR IMPOCONSUMO COMO PORCENTAJE DE FOMENTO') returning_values (FOMENTO);
EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'FECHA AUTORETENEDOR NO DESCONTAR RETENCIONES DEL SALDO PERO SI CONTABILIZARLAS') returning_values (AUTORET);
if (AUTORET <> '') then
    FAUTORET = CAST(AUTORET AS DATE);
else
    FAUTORET = '9999/12/31';
/* BUSQUE LA INTERFACE */
EXISTE = 'N';
SELECT 'S', TICO_COD, PRCO_PRE, INVE_VENTAS, INVE_IVA, INVE_CONSUMO, INVE_CARTERA, INVE_RTFTE, INVE_RTIVA, INVE_RTICA, INVE_COSTO, INVE_INVEN, INVE_CTAVENTAS, INVE_CTAIVA, INVE_CTACONSUMO, INVE_CTADTO, INVE_CTAADIC, INVE_CTAEXTRA, INVE_CTACARTERA, INVE_CTARTFTE, INVE_CTARTIVA, INVE_CTARTICA, INVE_CTAINVEN, INVE_CTACOSTOS, INVE_CONFIRMAR, INVE_CENTRO
    FROM INTERFAZ_VENTAS
    WHERE INVE_ID = :IDINTER
    INTO :EXISTE, :TIPOCOMP, :PREFCONT, :VENTAS, :IVA, :CONSUMO, :CARTERA, :RTFTE, :RTIVA, :RTICA, :COSTOS, :INVEN, :CTAVENTAS, :CTAIVA, :CTACONSUMO, :CTADTO, :CTAADIC, :CTAEXTRA, :CTACARTERA, :CTARTFTE, :CTARTIVA, :CTARTICA, :CTAINVEN, :CTACOSTOS, :VER, :CENT;
if (EXISTE = 'S') then
  BEGIN
    /* BORRE CUALQUEIR CONTABILIZACION PREVIA */
    DELETE FROM CONTABILIZACION WHERE CNTB_TIPOREF = 31 AND CNTB_IDREF = :IDDOC;

  /* TRAIGA EL ENCABEZADO DE LA FACTURA */
  SELECT PREF_PRE, FACT_NUMERO, FACT_FECHA, F.TERC_NIT, PTVT_ID, FACT_VENCE, FACT_DTOMONTO, FACT_ADICIONAL, FACT_IVAMONTO, FACT_EXTRA, FACT_TOTAL, FACT_RTFTEPOR, FACT_RTFTEMONTO, FACT_RTIVAPOR, FACT_RTIVAMONTO, FACT_RTICAPOR, FACT_RTICAMONTO, FACT_NOMCLIENTE, TERC_CTARTFTE, TERC_CTARTIVA, TERC_CTARTICA, TERC_CTAVENTA, TERC_CTACLIENTE, FACT_ANULADO
        FROM FACTURAS F, TERCEROS T
        WHERE FACT_ID = :IDDOC AND F.TERC_NIT = T.TERC_NIT
        INTO :PREF, :NUM, :FECAUX, :NIT, :PTOVTA, :VENCEAUX, :VRDTO, :VRADIC, :VRIVA, :VREXTRA, :VRTOTAL, :PRTFTE, :VRRTFTE, :PORC, :VRRTIVA, :PRTICA, :VRRTICA, :NOMBRE, TCTARTFTE, TCTARTIVA, TCTARTICA, TCTAVENTA, TCTACLIEN, ANULADO;
  if (ANULADO = 'N') then
    BEGIN
    /* BUSQUE EL CENTRO DEL PUNTO, LA BODEGA, O EL PREFIJO  */
    IF (CENT = 'B') THEN
        SELECT B.BODE_CENTRO, B.BODE_PROY FROM BODEGA B, FACTURAS F
            WHERE B.BODE_COD = F.BODE_COD AND F.FACT_ID = :IDDOC INTO :CENTRO, :PROY;
    IF (CENT = 'V') THEN
        SELECT V.CENT_COD, V.PROY_COD FROM VENDEDORES V, FACTURAS F
            WHERE V.VEND_COD = F.VEND_COD AND F.FACT_ID = :IDDOC INTO :CENTRO, :PROY;
    IF (CENT = 'P') THEN
        SELECT P.PREF_CENTRO,P.PREF_PROY  FROM PREFIJOS P, FACTURAS F
            WHERE P.PREF_PRE = F.PREF_PRE AND F.FACT_ID = :IDDOC AND P.TIDO_COD = 31 INTO :CENTRO, :PROY;
    NUMERO = PREF || NUM;
    SELECT SUM (FADE_CONSUMO) FROM FACTURAS_DETALLE WHERE FACT_ID = :IDDOC  AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
        INTO MERCANCIA;
    VRSUBT = VRTOTAL - VREXTRA - VRIVA - MERCANCIA; /* BASE DE RETEFTE Y RETEICA */

    EXECUTE PROCEDURE lee_configuracion ('FACTURACION', 'FACTURAS', 'DESCUENTO PIE FACTURA IGUAL A SUMA DE DESCUENTOS POR ITEM') returning_values (:DTOXIT);
    if (DTOXIT = 'SI') then
        VRDTO = 0;
    MERCANCIA = VRSUBT - VRADIC + VRDTO;
    EXECUTE PROCEDURE FECHA_A_CONTA(:FECAUX) returning_values (:FECHA);
    EXECUTE PROCEDURE FECHA_A_CONTA(:VENCEAUX) returning_values (:VENCE);
    /* REGISTRE EL ENCABEZADO CONTABLE */
    IDC = GEN_ID(ID_CONTABILIZA, 1);
    if (STRLEN(NOMBRE)> 43 ) then
      CONC = 'FV No.' || NUMERO || '-' || SUBSTR(NOMBRE,1,43);
    ELSE
      CONC = 'FV No.' || NUMERO || '-' || NOMBRE;
    INSERT INTO CONTABILIZACION (CNTB_ID, CNTB_TIPOCOMP, CNTB_PREFCNT, CNTB_NUMERO, CNTB_FECHA, CNTB_CONCEPTO, CNTB_REF, CNTB_TIPOREF, CNTB_IDREF, CNTB_PREFREF, CNTB_NUMREF, CNTB_PROCESADO)
        VALUES (:IDC, :TIPOCOMP, :PREFCONT, :NUM, :FECHA, :CONC, '', 31, :IDDOC, :PREF, :NUM, 'N');
    NROI = 0;
    SUMA = 0;
    ERROR = 0;
    /* SI NO HAY CUENTA DE DESCUENTO NI ADICIONAL CALCULE UN FACTOR PARA LAS VENTAS Y EL IVA */
    if (MERCANCIA <> 0) then
        FACTOR = CAST(VRSUBT AS DOUBLE PRECISION) / CAST(MERCANCIA AS DOUBLE PRECISION);
    ELSE
        FACTOR = 1;
    /* TRAIGA EL NUMERO DE DIGITOS PARA EL REDONDEO */
    SELECT CAST(CONF_VALOR AS INTEGER) FROM CONFIGURACION WHERE CONF_MODULO = 'FACTURACION' AND
        CONF_CATEGORIA = 'GENERAL' AND CONF_PROPIEDAD = 'REDONDEO AL MULTIPLO DE DIEZ EN TOTALES' INTO :DIG;
    /* CUENTAS DE VENTAS */
    if (VENTAS = 'A') then
        BEGIN
        FOR SELECT MAX(COAR_CTAVNT), SUM(FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), SUM(FADE_IVAMONTO), SUM(FADE_CONSUMO)
            FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_DETALLE F
            WHERE F.FACT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
            GROUP BY COAR_CTAVNT
            INTO :CTAVENTAS, :MONTO, :IMPTOS, :VRCONSUMO
            DO
            BEGIN
            if (FOMENTO = 'SI') then
                MONTO = MONTO + VRCONSUMO;
            if ((CTADTO IS NULL) OR (CTADTO = '')) then
                MONTO = MONTO * FACTOR;
            execute procedure redondee(MONTO, DIG) returning_values (MONTO);
            if (MONTO <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTAVENTAS, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT F.ARTI_COD, (FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), FADE_CONSUMO
                        FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_DETALLE F
                        WHERE F.FACT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTAINV = :CUENTA AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
                        INTO :ART, :MONTO, :IMPTOS
                    DO
                        BEGIN
                        if (FOMENTO = 'SI') then
                            MONTO = MONTO + IMPTOS;
                        if ((CTADTO IS NULL) OR (CTADTO = '')) then
                            MONTO = MONTO * FACTOR;
                        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                        if (MONTO <> 0) then
                            BEGIN
                            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                            NROI = NROI + 1;
                            SUMA = SUMA - MONTO;
                            END
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    NROI = NROI + 1;
                    SUMA = SUMA - MONTO;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA - MONTO;
                    END
                END /* MONTO <> 0 */
            END /* FOR */
        END /* VENTAS X ARTICULO */
     IF ((VENTAS = 'C') OR (VENTAS = 'K')) THEN
        BEGIN
        IF (VENTAS = 'C') THEN
            CTAVENTAS = TCTAVENTA;
        SELECT SUM(FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), SUM(FADE_IVAMONTO), SUM (FADE_CONSUMO)
            FROM FACTURAS_DETALLE F
            WHERE F.FACT_ID = :IDDOC AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
            INTO :MONTO, :IMPTOS, :VRCONSUMO;
        if (FOMENTO = 'SI') then
            MONTO = MONTO + VRCONSUMO;
        if ((CTADTO IS NULL) OR (CTADTO = '')) then
            MONTO = MONTO * FACTOR;
        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
        if (MONTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTAVENTAS, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT F.ARTI_COD, (FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), FADE_CONSUMO
                    FROM ARTICULO A, FACTURAS_DETALLE F
                    WHERE F.FACT_ID = :IDDOC AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
                    INTO :ART, :MONTO, :IMPTOS
                    DO
                    BEGIN
                    if (FOMENTO = 'SI') then
                        MONTO = MONTO + VRCONSUMO;
                    if ((CTADTO IS NULL) OR (CTADTO = '')) then
                        MONTO = MONTO * FACTOR;
                    execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                    if (MONTO <> 0) then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        SUMA = SUMA - MONTO;
                        END
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - MONTO;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - MONTO;
                END
            END /* MONTO <> 0 */
        END /* VENTAS DE CLIENTE O CONSTANTE */
    /* EL IVA EN VENTAS */
    if (IVA = 'A') then
        BEGIN
        FOR SELECT MAX(COAR_CTAIVAV), SUM(FADE_IVAMONTO), SUM(FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), sum(FADE_CONSUMO)
            FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_DETALLE F
            WHERE F.FACT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
            GROUP BY COAR_CTAIVAV
            INTO :CTAIVA, :IMPTOS, :MONTO, :VALORADIC
        DO
            BEGIN
            if (FOMENTO = 'SI') then
                MONTO = MONTO + VALORADIC;
            MONTO = MONTO * -1;
            MONTO = MONTO * FACTOR;
            IMPTOS = IMPTOS * FACTOR;
            execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
            execute procedure redondee(MONTO, DIG) returning_values (MONTO);
            if (IMPTOS <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTAIVA, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT F.ARTI_COD, FADE_IVAMONTO, (FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), TAIV_PORC, FADE_CONSUMO
                        FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_DETALLE F, TARIFA_IVA T
                        WHERE F.FACT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTAIVAV = :CUENTA AND A.TAIV_COD = T.TAIV_COD AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
                        INTO :ART, :IMPTOS, :MONTO, :PORCIVA, :VALORADIC
                    DO
                        BEGIN
                        if (FOMENTO = 'SI') then
                            MONTO = MONTO + VALORADIC;
                        MONTO = MONTO * -1;
                        MONTO = MONTO * FACTOR;
                        IMPTOS = IMPTOS * FACTOR;
                        execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                        if (IMPTOS <> 0) then
                            BEGIN
                            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, :MONTO, :PORCIVA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                            NROI = NROI + 1;
                            SUMA = SUMA + DEBITO - CREDITO;
                            END
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, :MONTO, ABS(:IMPTOS*100/:MONTO), :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    NROI = NROI + 1;
                    SUMA = SUMA - IMPTOS;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, :MONTO, ABS(:IMPTOS*100/:MONTO), :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA - IMPTOS;
                    END
                END   /* IMPTOS <> 0 */
            END /* FOR */
        END /* IVA X ARTICULO */
    if (IVA = 'K') then /* IVA EN CTA CONSTANTE */
        BEGIN
        SELECT SUM(FADE_IVAMONTO), SUM(FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), SUM(FADE_CONSUMO)
            FROM FACTURAS_DETALLE F
            WHERE F.FACT_ID = :IDDOC and FADE_IVAMONTO <> 0 AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
            INTO :IMPTOS, :MONTO, :valoradic;
        if (FOMENTO = 'SI') then
            MONTO = MONTO + VALORADIC;
        MONTO = MONTO * -1;
        MONTO = MONTO * FACTOR;
        IMPTOS = IMPTOS * FACTOR;
        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
        execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
        if (IMPTOS <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTAIVA, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT F.ARTI_COD, (FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), FADE_IVAMONTO, TAIV_PORC, FADE_CONSUMO
                    FROM ARTICULO A, FACTURAS_DETALLE F, TARIFA_IVA T
                    WHERE F.FACT_ID = :IDDOC AND A.TAIV_COD = T.TAIV_COD AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
                    INTO :ART, :MONTO, :IMPTOS, :PORCIVA, :VALORADIC
                    DO
                    BEGIN
                    if (FOMENTO = 'SI') then
                        MONTO = MONTO + VALORADIC;
                    MONTO = MONTO * -1;
                    MONTO = MONTO * FACTOR;
                    IMPTOS = IMPTOS * FACTOR;
                    execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                    execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                    if (IMPTOS <> 0) then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', 0, :IMPTOS, :MONTO, :PORCIVA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        SUMA = SUMA - IMPTOS;
                        END
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', 0, :IMPTOS, :MONTO, ABS(:IMPTOS*100/:MONTO), :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - IMPTOS;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', 0, :IMPTOS, :MONTO, ABS(:IMPTOS*100/:MONTO), :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - IMPTOS;
                END
            END /* IMPTOS <> 0 */
        END /* IVA EN CTA CONSTANTE */
    /* EL IMPOCONSUMO */
    if ((CONSUMO = 'A') AND (FOMENTO <> 'SI')) then
        BEGIN
        FOR SELECT MAX(COAR_CTACONS), SUM(FADE_CONSUMO)
            FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_DETALLE F
            WHERE F.FACT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
            GROUP BY COAR_CTACONS
            INTO :CTACONSUMO, :IMPTOS
        DO
            BEGIN
            execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
            if (IMPTOS <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTACONSUMO, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, REGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT F.ARTI_COD, FADE_CONSUMO
                        FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_DETALLE F
                        WHERE F.FACT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTACONS = :CUENTA AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
                        INTO :ART, :IMPTOS
                    DO
                        BEGIN
                        execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                        if (IMPTOS <> 0) then
                            BEGIN
                            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                            NROI = NROI + 1;
                            SUMA = SUMA - IMPTOS;
                            END
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    NROI = NROI + 1;
                    SUMA = SUMA - IMPTOS;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA - IMPTOS;
                    END
                END /* IMPTOS <> 0 */
            END /* FOR */
        END /* CONSUMO X ARTICULO */
    if ((CONSUMO = 'K') AND (FOMENTO <> 'SI')) then /* CONSUMO EN CTA CONSTANTE */
        BEGIN
        SELECT SUM(FADE_CONSUMO)
            FROM FACTURAS_DETALLE F
            WHERE F.FACT_ID = :IDDOC AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
            INTO :IMPTOS;
        execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
        if (IMPTOS <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTACONSUMO, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT F.ARTI_COD, FADE_CONSUMO
                    FROM ARTICULO A, FACTURAS_DETALLE F
                    WHERE F.FACT_ID = :IDDOC AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
                    INTO :ART, :IMPTOS
                    DO
                    BEGIN
                    execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                    if (IMPTOS <> 0) then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CTACONSUMO, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        SUMA = SUMA - IMPTOS;
                        END
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTACONSUMO, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - IMPTOS;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTACONSUMO, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - IMPTOS;
                END
            END /* IMPTOS <> 0 */
        END /* CONSUMO EN CTA CONSTANTE */
    /* DESCUENTO */
    if ((CTADTO IS NOT NULL) AND (CTADTO <> '')) then
        BEGIN
        execute procedure redondee(VRDTO, DIG) returning_values (VRDTO);
        if (VRDTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTADTO, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRDTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA + VRDTO;
                END
            if (TIPOCUEN = 'N') then
                    BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRDTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA + VRDTO;
                END
            END
        END /* DESCUENTO */
    /* VALOR ADIC */
    if ((CTAADIC IS NOT NULL) AND (CTAADIC <> '')) then
        BEGIN
        execute procedure redondee(VRADIC, DIG) returning_values (VRADIC);
        if (VRADIC <> 0) THEN
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTAADIC, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRADIC, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - VRADIC;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRADIC, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - VRADIC;
                END
            END
        END /* VR. ADIC */
    /* VALOR EXTRA */
    if ((CTAEXTRA IS NOT NULL) AND (CTAEXTRA <> '')) THEN
        BEGIN
        execute procedure redondee(VREXTRA, DIG) returning_values (VREXTRA);
        if (VREXTRA <> 0) THEN
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTAEXTRA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VREXTRA, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - VREXTRA;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VREXTRA, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - VREXTRA;
                END
            END
        END /* VR. EXTRA */
    /* DESCUENTE EL IMPOCONSUMO */
    SELECT SUM(FADE_CONSUMO)
        FROM FACTURAS_DETALLE F WHERE F.FACT_ID = :IDDOC AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL)) INTO :IMPTOS;
    vrsubt = vrsubt - IMPTOS;
    /* RETENCION FUENTE */
    if ((RTFTE = 'C') or (RTFTE = 'K')) then
      BEGIN
      execute procedure redondee(VRRTFTE, DIG) returning_values (VRRTFTE);
      if (VRRTFTE <> 0) then
        BEGIN
        if (RTFTE = 'C') then
            CTARTFTE = TCTARTFTE;
        EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTARTFTE, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :VRSUBT, :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTFTE;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :VRSUBT, :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTFTE;
            END
        /* AUTORETENCION */
        if (FAUTORET <= fecaux) then
            BEGIN
            EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'CUENTA DE AUTORETENCION EN LA FUENTE') returning_values (CTARTFTE);
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTARTFTE INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERROR (31, :IDDOC, :CTARTFTE, 2);
                CUENTA = CTARTFTE;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                begin
                EXECUTE PROCEDURE ERROR (31, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, (:VRSUBT*-1), :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - VRRTFTE;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, (:VRSUBT*-1), :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - VRRTFTE;
                END
            END
        END /* RTFTE */
      END
    if (RTFTE = 'A') then
      BEGIN
      FOR SELECT MAX(COAR_CTARTFTEV), MAX(COAR_RTFTE), MIN(COAR_RTBASE), SUM(FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), SUM((FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO)*COAR_RTFTE)
        FROM CONTABIL_ARTICULO C, FACTURAS_DETALLE F
        WHERE F.FACT_ID = :IDDOC AND F.ARTI_COD = C.ARTI_COD AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
        GROUP BY COAR_CTARTFTEV
        INTO :CTARTFTE, :PRTFTE, :baseadic, :MONTO, :VRRTFTE
        DO
        BEGIN
        MONTO = MONTO * FACTOR;
        if (MONTO >= BASEADIC) then
            BEGIN
            VRRTFTE = VRRTFTE * FACTOR / 100;
            execute procedure redondee(VRRTFTE, DIG) returning_values (VRRTFTE);
            execute procedure redondee(MONTO, DIG) returning_values (MONTO);
            if (VRRTFTE <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTARTFTE, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :MONTO, :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    NROI = NROI + 1;
                    SUMA = SUMA + VRRTFTE;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :MONTO, :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA + VRRTFTE;
                    END
                /* AUTORETENCION */
                if (FAUTORET <= fecaux) then
                    BEGIN
                    EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'CUENTA DE AUTORETENCION EN LA FUENTE') returning_values (CTARTFTE);
                    EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTARTFTE, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
                    if (ERRORC <> 0) then
                        ERROR = ERROR + 1;
                    if (TIPOCUEN = 'C') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, (:MONTO*-1), :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                        NROI = NROI + 1;
                        SUMA = SUMA - VRRTFTE;
                        END
                    if (TIPOCUEN = 'N') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, (:MONTO*-1), :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NROI = NROI + 1;
                        SUMA = SUMA - VRRTFTE;
                        END
                    END
                END
            END
        END /* RTFTE */
      END
    /* RETENCION IVA */
    if ((RTIVA = 'C') or (RTIVA = 'K')) then
      BEGIN
      execute procedure redondee(VRRTIVA, DIG) returning_values (VRRTIVA);
      if (VRRTIVA <> 0) then
        BEGIN
        if (RTIVA = 'C') then
            CTARTIVA = TCTARTIVA;
        EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTARTIVA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTIVA, 0, :VRIVA, :PORC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTIVA;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTIVA, 0, :VRIVA, :PORC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTIVA;
            END
        END /* RTIVA */
      END
    /* RETENCION DE ICA */
    if ((RTICA = 'C') or (RTICA = 'K')) then
      BEGIN
      execute procedure redondee(VRRTICA, DIG) returning_values (VRRTICA);
      if (VRRTICA <> 0) then
        BEGIN
        if (RTICA = 'C') then
            CTARTICA = TCTARTICA;
        EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTARTICA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTICA, 0, :VRSUBT, :PRTICA, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTICA;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTICA, 0, :VRSUBT, :PRTICA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTICA;
            END
        END /* RTICA */
      END
    /* CIERRE EL COMPROBANTE CONTRA LA CUENTA DEL TERCERO O LA CONSTANTE */
    if ((SUMA <> 0) and ((CARTERA = 'C') or (CARTERA = 'K') or (CARTERA = 'J'))) then
        BEGIN
        if (SUMA < 0) then
            BEGIN
            DEBITO = SUMA * -1;
            CREDITO = 0;
            END
        ELSE
            BEGIN
            DEBITO = 0;
            CREDITO = SUMA;
            END
        if (CARTERA = 'C') then
            CTACARTERA = TCTACLIEN;
        if (CARTERA = 'J') then
            BEGIN
            /* BUSQUE LA CUENTA DE LA CAJA */
            SELECT CAJA_CUENTA FROM CAJAS C, PUNTO_VENTA P
                WHERE P.CAJA_ID = C.CAJA_ID AND PTVT_ID = :PTOVTA
                INTO :CTACARTERA;
            END
        EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTACARTERA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :DEBITO, :CREDITO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
        if (TIPOCUEN = 'N') then
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :DEBITO, :CREDITO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
        NROI = NROI + 1;
        END /* SUMA EN CARTERA */
    /* CALCULE COSTOS EN VENTAS */
    EXECUTE PROCEDURE COSTO_EN_VENTAS(31, :IDDOC);
    if (COSTOS = 'A') then
        BEGIN
        FOR SELECT MAX(CTACOS), SUM(CAST(CANT AS DOUBLE PRECISION) * COSTO)
            FROM COSTO_VENTAS WHERE TIDO_COD = 31 AND COVE_ID = :iddoc
            GROUP BY CTACOS
            INTO :CTACOSTOS, :MONTO
        DO
            BEGIN
            if (MONTO <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTACOSTOS, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT ARTI_COD, CANT * COSTO
                        FROM COSTO_VENTAS WHERE TIDO_COD = 31 AND COVE_ID = :iddoc AND CTACOS = :CUENTA
                        INTO :ART, :MONTO
                    DO
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    NROI = NROI + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    END
                END /* MONTO <> 0 */
            END /* FOR */
        END /* COSTOS */
    if (COSTOS = 'K') then
        BEGIN
        SELECT SUM(CAST(CANT AS DOUBLE PRECISION) * COSTO)
            FROM COSTO_VENTAS WHERE TIDO_COD = 31 AND COVE_ID = :iddoc
            INTO :MONTO;
        if (MONTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTACOSTOS, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, REGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT ARTI_COD, CANT * COSTO
                    FROM COSTO_VENTAS WHERE TIDO_COD = 31 AND COVE_ID = :iddoc
                    INTO :ART, :MONTO
                DO
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTACOSTOS, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                    NROI = NROI + 1;
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTACOSTOS, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTACOSTOS, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                END
            END /* MONTO <> 0 */
        END /* COSTOS = K */
    if (INVEN = 'A') then
        BEGIN
        FOR SELECT MAX(CTAINV), SUM(CAST(CANT AS DOUBLE PRECISION) * COSTO)
            FROM COSTO_VENTAS WHERE TIDO_COD = 31 AND COVE_ID = :iddoc
            GROUP BY CTAINV
            INTO :CTAINVEN, :MONTO
        DO
            BEGIN
            if (MONTO <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTAINVEN, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, REGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT ARTI_COD, CANT * COSTO
                        FROM COSTO_VENTAS WHERE TIDO_COD = 31 AND COVE_ID = :iddoc AND CTAINV = :CUENTA
                        INTO :ART, :MONTO
                    DO
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    NROI = NROI + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    END
                END /* MONTO <> 0 */
            END /* FOR */
        END /* INVEN = A */
    if (INVEN = 'K') then
        BEGIN
        SELECT SUM(CAST(CANT AS DOUBLE PRECISION) * COSTO)
            FROM COSTO_VENTAS WHERE TIDO_COD = 31 AND COVE_ID = :iddoc
            INTO :MONTO;
        if (MONTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTAINVEN, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT ARTI_COD, CANT * COSTO
                    FROM COSTO_VENTAS WHERE TIDO_COD = 31 AND COVE_ID = :iddoc
                    INTO :ART, :MONTO
                DO
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTAINVEN, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                    NROI = NROI + 1;
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAINVEN, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAINVEN, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                END
            END /* MONTO <> 0 */
        END /* INVEN = K */
    /* recorra las cuentas adicionales */
    FOR SELECT INVC_CUENTA, INVC_BASE, INVC_PORC, INVC_VALOR, INVC_DB
        FROM INTERFAZ_VENTAS_CTAS
        WHERE INVE_ID = :IDINTER
        INTO :CTADIC, :BASEADIC, :PORCADIC, :VALORADIC, :DBADIC
        DO
        BEGIN
        if (VALORADIC <> 0) then
            MONTO = VALORADIC;
        ELSE
            BEGIN
            if (:BASEADIC = 'SUBTOTAL') then
                VALORADIC = vrsubt;
            if (:BASEADIC = 'DESCUENTO') then
                VALORADIC = VRDTO;
            if (:BASEADIC = 'IVA') then
                VALORADIC = VRIVA;
            if (:BASEADIC = 'ADICIONAL') then
                VALORADIC = VRADIC;
            if (:BASEADIC = 'EXTRA') then
                VALORADIC = VREXTRA;
            if (:BASEADIC = 'TOTAL') then
                VALORADIC = VRTOTAL;
            MONTO = VALORADIC * PORCADIC / 100;
            END
        if (MONTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTADIC, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                if (DBADIC = 'S') then
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                ELSE
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                if (DBADIC = 'S') then
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                ELSE
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                END
            NROI = NROI + 1;
            END
        END
    if (ERROR > 0) then
        VER = 'S';
    SUSPEND;
    END /* NO ANULADO */
  END /* EXISTE LA INTERFAZ */
ELSE
    BEGIN
    EXECUTE PROCEDURE ERROR (31, :IDDOC, :PREF, 1);
    ERROR = ERROR + 1;
    VER = 'S';
    SUSPEND;
    END
END

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE CONTABIL_FACTURA_IVA(
    IDDOC INTEGER,
    IDINTER INTEGER)
RETURNS (
    ERROR INTEGER,
    VER CHAR(1),
    IDC INTEGER)
AS
declare variable pref varchar(4);
declare variable num varchar(6);
declare variable numero varchar(10);
declare variable fecaux date;
declare variable fecha char(8);
declare variable conc varchar(60);
declare variable venceaux date;
declare variable vence char(8);
declare variable vrdto numeric(18,2);
declare variable vradic numeric(18,2);
declare variable vrsubt numeric(18,2);
declare variable vriva numeric(18,2);
declare variable prtfte numeric(9,2);
declare variable vrrtfte numeric(18,2);
declare variable vrrtiva numeric(18,2);
declare variable prtica numeric(9,2);
declare variable vrrtica numeric(18,2);
declare variable vrtotal numeric(18,2);
declare variable vrextra numeric(18,2);
declare variable tipocomp varchar(3);
declare variable prefcont varchar(4);
declare variable ventas char(1);
declare variable ctaventas varchar(20);
declare variable iva char(1);
declare variable ctaiva varchar(20);
declare variable consumo char(1);
declare variable ctaconsumo varchar(20);
declare variable cartera char(1);
declare variable ctacartera varchar(20);
declare variable rtfte char(1);
declare variable ctartfte varchar(20);
declare variable rtiva char(1);
declare variable ctartiva varchar(20);
declare variable rtica char(1);
declare variable ctartica varchar(20);
declare variable inven char(1);
declare variable ctainven varchar(20);
declare variable costos char(1);
declare variable ctacostos varchar(20);
declare variable ctadto varchar(20);
declare variable ctaadic varchar(20);
declare variable ctaextra varchar(20);
declare variable existe char(1);
declare variable cuenta varchar(20);
declare variable monto numeric(18,2);
declare variable tipocuen char(1);
declare variable nit varchar(20);
declare variable nombre varchar(60);
declare variable proy varchar(4);
declare variable centro varchar(4);
declare variable porc numeric(5,2);
declare variable debito numeric(18,2);
declare variable credito numeric(18,2);
declare variable nroi integer;
declare variable art varchar(15);
declare variable imptos numeric(18,2);
declare variable suma numeric(18,2);
declare variable porciva numeric(9,2);
declare variable tctaclien varchar(20);
declare variable tctaventa varchar(20);
declare variable tctartfte varchar(20);
declare variable tctartiva varchar(20);
declare variable tctartica varchar(20);
declare variable ctadic varchar(20);
declare variable baseadic varchar(20);
declare variable porcadic numeric(5,2);
declare variable valoradic numeric(18,2);
declare variable dbadic char(1);
declare variable ptovta integer;
declare variable anulado char(1);
declare variable dig integer;
declare variable mercancia numeric(18,2);
declare variable fomento varchar(2);
declare variable DTOXIT varchar(2);
declare variable vrconsumo numeric(18,2);
declare variable factor double precision;
declare variable cent char(1);
declare variable AUTORET VARCHAR(10);
declare variable FAUTORET DATE;
declare variable ERRORC INTEGER;
BEGIN
EXECUTE PROCEDURE LEE_CONFIGURACION('COMPRAS', 'FACTURAS', 'USAR IMPOCONSUMO COMO PORCENTAJE DE FOMENTO') returning_values (FOMENTO);
EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'FECHA AUTORETENEDOR NO DESCONTAR RETENCIONES DEL SALDO PERO SI CONTABILIZARLAS') returning_values (AUTORET);
if (AUTORET <> '') then
    FAUTORET = CAST(AUTORET AS DATE);
else
    FAUTORET = '9999/12/31';
/* BUSQUE LA INTERFACE */
EXISTE = 'N';
SELECT 'S', TICO_COD, PRCO_PRE, INVE_VENTAS, INVE_IVA, INVE_CONSUMO, INVE_CARTERA, INVE_RTFTE, INVE_RTIVA, INVE_RTICA, INVE_COSTO, INVE_INVEN, INVE_CTAVENTAS, INVE_CTAIVA, INVE_CTACONSUMO, INVE_CTADTO, INVE_CTAADIC, INVE_CTAEXTRA, INVE_CTACARTERA, INVE_CTARTFTE, INVE_CTARTIVA, INVE_CTARTICA, INVE_CTAINVEN, INVE_CTACOSTOS, INVE_CONFIRMAR, INVE_CENTRO
    FROM INTERFAZ_VENTAS
    WHERE INVE_ID = :IDINTER
    INTO :EXISTE, :TIPOCOMP, :PREFCONT, :VENTAS, :IVA, :CONSUMO, :CARTERA, :RTFTE, :RTIVA, :RTICA, :COSTOS, :INVEN, :CTAVENTAS, :CTAIVA, :CTACONSUMO, :CTADTO, :CTAADIC, :CTAEXTRA, :CTACARTERA, :CTARTFTE, :CTARTIVA, :CTARTICA, :CTAINVEN, :CTACOSTOS, :VER, :CENT;
if (EXISTE = 'S') then
  BEGIN
    /* BORRE CUALQUEIR CONTABILIZACION PREVIA */
    DELETE FROM CONTABILIZACION WHERE CNTB_TIPOREF = 31 AND CNTB_IDREF = :IDDOC;

  /* TRAIGA EL ENCABEZADO DE LA FACTURA */
  SELECT PREF_PRE, FACT_NUMERO, FACT_FECHA, F.TERC_NIT, PTVT_ID, FACT_VENCE, FACT_DTOMONTO, FACT_ADICIONAL, FACT_IVAMONTO, FACT_EXTRA, FACT_TOTAL, FACT_RTFTEPOR, FACT_RTFTEMONTO, FACT_RTIVAPOR, FACT_RTIVAMONTO, FACT_RTICAPOR, FACT_RTICAMONTO, FACT_NOMCLIENTE, TERC_CTARTFTE, TERC_CTARTIVA, TERC_CTARTICA, TERC_CTAVENTA, TERC_CTACLIENTE, FACT_ANULADO
        FROM FACTURAS F, TERCEROS T
        WHERE FACT_ID = :IDDOC AND F.TERC_NIT = T.TERC_NIT
        INTO :PREF, :NUM, :FECAUX, :NIT, :PTOVTA, :VENCEAUX, :VRDTO, :VRADIC, :VRIVA, :VREXTRA, :VRTOTAL, :PRTFTE, :VRRTFTE, :PORC, :VRRTIVA, :PRTICA, :VRRTICA, :NOMBRE, TCTARTFTE, TCTARTIVA, TCTARTICA, TCTAVENTA, TCTACLIEN, ANULADO;
  if (ANULADO = 'N') then
    BEGIN
    /* BUSQUE EL CENTRO DEL PUNTO, LA BODEGA, O EL PREFIJO  */
    IF (CENT = 'B') THEN
        SELECT B.BODE_CENTRO, B.BODE_PROY FROM BODEGA B, FACTURAS F
            WHERE B.BODE_COD = F.BODE_COD AND F.FACT_ID = :IDDOC INTO :CENTRO, :PROY;
    IF (CENT = 'V') THEN
        SELECT V.CENT_COD, V.PROY_COD FROM VENDEDORES V, FACTURAS F
            WHERE V.VEND_COD = F.VEND_COD AND F.FACT_ID = :IDDOC INTO :CENTRO, :PROY;
    IF (CENT = 'P') THEN
        SELECT P.PREF_CENTRO,P.PREF_PROY  FROM PREFIJOS P, FACTURAS F
            WHERE P.PREF_PRE = F.PREF_PRE AND F.FACT_ID = :IDDOC AND P.TIDO_COD = 31 INTO :CENTRO, :PROY;
    NUMERO = PREF || NUM;
    SELECT SUM (FADE_CONSUMO) FROM FACTURAS_DETALLE WHERE FACT_ID = :IDDOC  AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
        INTO MERCANCIA;
    VRSUBT = VRTOTAL - VREXTRA - VRIVA - MERCANCIA; /* BASE DE RETEFTE Y RETEICA */

    EXECUTE PROCEDURE lee_configuracion ('FACTURACION', 'FACTURAS', 'DESCUENTO PIE FACTURA IGUAL A SUMA DE DESCUENTOS POR ITEM') returning_values (:DTOXIT);
    if (DTOXIT = 'SI') then
        VRDTO = 0;
    MERCANCIA = VRSUBT - VRADIC + VRDTO;
    EXECUTE PROCEDURE FECHA_A_CONTA(:FECAUX) returning_values (:FECHA);
    EXECUTE PROCEDURE FECHA_A_CONTA(:VENCEAUX) returning_values (:VENCE);
    /* REGISTRE EL ENCABEZADO CONTABLE */
    IDC = GEN_ID(ID_CONTABILIZA, 1);
    if (STRLEN(NOMBRE)> 43 ) then
      CONC = 'FV No.' || NUMERO || '-' || SUBSTR(NOMBRE,1,43);
    ELSE
      CONC = 'FV No.' || NUMERO || '-' || NOMBRE;
    INSERT INTO CONTABILIZACION (CNTB_ID, CNTB_TIPOCOMP, CNTB_PREFCNT, CNTB_NUMERO, CNTB_FECHA, CNTB_CONCEPTO, CNTB_REF, CNTB_TIPOREF, CNTB_IDREF, CNTB_PREFREF, CNTB_NUMREF, CNTB_PROCESADO)
        VALUES (:IDC, :TIPOCOMP, :PREFCONT, :NUM, :FECHA, :CONC, '', 31, :IDDOC, :PREF, :NUM, 'N');
    NROI = 0;
    SUMA = 0;
    ERROR = 0;
    /* SI NO HAY CUENTA DE DESCUENTO NI ADICIONAL CALCULE UN FACTOR PARA LAS VENTAS Y EL IVA */
    if (MERCANCIA <> 0) then
        FACTOR = CAST(VRSUBT AS DOUBLE PRECISION) / CAST(MERCANCIA AS DOUBLE PRECISION);
    ELSE
        FACTOR = 1;
    /* TRAIGA EL NUMERO DE DIGITOS PARA EL REDONDEO */
    SELECT CAST(CONF_VALOR AS INTEGER) FROM CONFIGURACION WHERE CONF_MODULO = 'FACTURACION' AND
        CONF_CATEGORIA = 'GENERAL' AND CONF_PROPIEDAD = 'REDONDEO AL MULTIPLO DE DIEZ EN TOTALES' INTO :DIG;
    /* CUENTAS DE VENTAS */
    if (VENTAS = 'A') then
        BEGIN
        FOR SELECT MAX(TAIV_CTAVTA), SUM(FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), SUM(FADE_IVAMONTO), SUM(FADE_CONSUMO)
            FROM TARIFA_IVA T, FACTURAS_DETALLE F
            WHERE F.FACT_ID = :IDDOC AND F.fade_ivaporc = T.taiv_porc AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
            GROUP BY TAIV_CTAVTA
            INTO :CTAVENTAS, :MONTO, :IMPTOS, :VRCONSUMO
            DO
            BEGIN
            if (FOMENTO = 'SI') then
                MONTO = MONTO + VRCONSUMO;
            if ((CTADTO IS NULL) OR (CTADTO = '')) then
                MONTO = MONTO * FACTOR;
            execute procedure redondee(MONTO, DIG) returning_values (MONTO);
            if (MONTO <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTAVENTAS, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT F.ARTI_COD, (FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), FADE_CONSUMO
                        FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_DETALLE F
                        WHERE F.FACT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTAINV = :CUENTA AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
                        INTO :ART, :MONTO, :IMPTOS
                    DO
                        BEGIN
                        if (FOMENTO = 'SI') then
                            MONTO = MONTO + IMPTOS;
                        if ((CTADTO IS NULL) OR (CTADTO = '')) then
                            MONTO = MONTO * FACTOR;
                        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                        if (MONTO <> 0) then
                            BEGIN
                            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                            NROI = NROI + 1;
                            SUMA = SUMA - MONTO;
                            END
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    NROI = NROI + 1;
                    SUMA = SUMA - MONTO;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA - MONTO;
                    END
                END /* MONTO <> 0 */
            END /* FOR */
        END /* VENTAS X ARTICULO */
     IF ((VENTAS = 'C') OR (VENTAS = 'K')) THEN
        BEGIN
        IF (VENTAS = 'C') THEN
            CTAVENTAS = TCTAVENTA;
        SELECT SUM(FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), SUM(FADE_IVAMONTO), SUM (FADE_CONSUMO)
            FROM FACTURAS_DETALLE F
            WHERE F.FACT_ID = :IDDOC AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
            INTO :MONTO, :IMPTOS, :VRCONSUMO;
        if (FOMENTO = 'SI') then
            MONTO = MONTO + VRCONSUMO;
        if ((CTADTO IS NULL) OR (CTADTO = '')) then
            MONTO = MONTO * FACTOR;
        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
        if (MONTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTAVENTAS, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT F.ARTI_COD, (FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), FADE_CONSUMO
                    FROM ARTICULO A, FACTURAS_DETALLE F
                    WHERE F.FACT_ID = :IDDOC AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
                    INTO :ART, :MONTO, :IMPTOS
                    DO
                    BEGIN
                    if (FOMENTO = 'SI') then
                        MONTO = MONTO + VRCONSUMO;
                    if ((CTADTO IS NULL) OR (CTADTO = '')) then
                        MONTO = MONTO * FACTOR;
                    execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                    if (MONTO <> 0) then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        SUMA = SUMA - MONTO;
                        END
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - MONTO;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - MONTO;
                END
            END /* MONTO <> 0 */
        END /* VENTAS DE CLIENTE O CONSTANTE */
    /* EL IVA EN VENTAS */
    if (IVA = 'A') then
        BEGIN
        FOR SELECT MAX(TAIV_CTAIVAVNT), SUM(FADE_IVAMONTO), SUM(FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), sum(FADE_CONSUMO)
            FROM TARIFA_IVA T, FACTURAS_DETALLE F
            WHERE F.FACT_ID = :IDDOC AND F.fade_ivaporc = T.taiv_porc AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
            GROUP BY TAIV_CTAIVAVNT
            INTO :CTAIVA, :IMPTOS, :MONTO, :VALORADIC
        DO
            BEGIN
            if (FOMENTO = 'SI') then
                MONTO = MONTO + VALORADIC;
            MONTO = MONTO * -1;
            MONTO = MONTO * FACTOR;
            IMPTOS = IMPTOS * FACTOR;
            execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
            execute procedure redondee(MONTO, DIG) returning_values (MONTO);
            if (IMPTOS <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTAIVA, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT F.ARTI_COD, FADE_IVAMONTO, (FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), TAIV_PORC, FADE_CONSUMO
                        FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_DETALLE F, TARIFA_IVA T
                        WHERE F.FACT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTAIVAV = :CUENTA AND A.TAIV_COD = T.TAIV_COD AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
                        INTO :ART, :IMPTOS, :MONTO, :PORCIVA, :VALORADIC
                    DO
                        BEGIN
                        if (FOMENTO = 'SI') then
                            MONTO = MONTO + VALORADIC;
                        MONTO = MONTO * -1;
                        MONTO = MONTO * FACTOR;
                        IMPTOS = IMPTOS * FACTOR;
                        execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                        if (IMPTOS <> 0) then
                            BEGIN
                            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, :MONTO, :PORCIVA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                            NROI = NROI + 1;
                            SUMA = SUMA + DEBITO - CREDITO;
                            END
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, :MONTO, ABS(:IMPTOS*100/:MONTO), :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    NROI = NROI + 1;
                    SUMA = SUMA - IMPTOS;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, :MONTO, ABS(:IMPTOS*100/:MONTO), :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA - IMPTOS;
                    END
                END   /* IMPTOS <> 0 */
            END /* FOR */
        END /* IVA X ARTICULO */
    if (IVA = 'K') then /* IVA EN CTA CONSTANTE */
        BEGIN
        SELECT SUM(FADE_IVAMONTO), SUM(FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), SUM(FADE_CONSUMO)
            FROM FACTURAS_DETALLE F
            WHERE F.FACT_ID = :IDDOC and FADE_IVAMONTO <> 0 AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
            INTO :IMPTOS, :MONTO, :valoradic;
        if (FOMENTO = 'SI') then
            MONTO = MONTO + VALORADIC;
        MONTO = MONTO * -1;
        MONTO = MONTO * FACTOR;
        IMPTOS = IMPTOS * FACTOR;
        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
        execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
        if (IMPTOS <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTAIVA, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT F.ARTI_COD, (FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), FADE_IVAMONTO, TAIV_PORC, FADE_CONSUMO
                    FROM ARTICULO A, FACTURAS_DETALLE F, TARIFA_IVA T
                    WHERE F.FACT_ID = :IDDOC AND A.TAIV_COD = T.TAIV_COD AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
                    INTO :ART, :MONTO, :IMPTOS, :PORCIVA, :VALORADIC
                    DO
                    BEGIN
                    if (FOMENTO = 'SI') then
                        MONTO = MONTO + VALORADIC;
                    MONTO = MONTO * -1;
                    MONTO = MONTO * FACTOR;
                    IMPTOS = IMPTOS * FACTOR;
                    execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                    execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                    if (IMPTOS <> 0) then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', 0, :IMPTOS, :MONTO, :PORCIVA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        SUMA = SUMA - IMPTOS;
                        END
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', 0, :IMPTOS, :MONTO, ABS(:IMPTOS*100/:MONTO), :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - IMPTOS;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', 0, :IMPTOS, :MONTO, ABS(:IMPTOS*100/:MONTO), :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - IMPTOS;
                END
            END /* IMPTOS <> 0 */
        END /* IVA EN CTA CONSTANTE */
    /* EL IMPOCONSUMO */
    if ((CONSUMO = 'A') AND (FOMENTO <> 'SI')) then
        BEGIN
        FOR SELECT MAX(COAR_CTACONS), SUM(FADE_CONSUMO)
            FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_DETALLE F
            WHERE F.FACT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
            GROUP BY COAR_CTACONS
            INTO :CTACONSUMO, :IMPTOS
        DO
            BEGIN
            execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
            if (IMPTOS <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTACONSUMO, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, REGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT F.ARTI_COD, FADE_CONSUMO
                        FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_DETALLE F
                        WHERE F.FACT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTACONS = :CUENTA AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
                        INTO :ART, :IMPTOS
                    DO
                        BEGIN
                        execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                        if (IMPTOS <> 0) then
                            BEGIN
                            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                            NROI = NROI + 1;
                            SUMA = SUMA - IMPTOS;
                            END
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    NROI = NROI + 1;
                    SUMA = SUMA - IMPTOS;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA - IMPTOS;
                    END
                END /* IMPTOS <> 0 */
            END /* FOR */
        END /* CONSUMO X ARTICULO */
    if ((CONSUMO = 'K') AND (FOMENTO <> 'SI')) then /* CONSUMO EN CTA CONSTANTE */
        BEGIN
        SELECT SUM(FADE_CONSUMO)
            FROM FACTURAS_DETALLE F
            WHERE F.FACT_ID = :IDDOC AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
            INTO :IMPTOS;
        execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
        if (IMPTOS <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTACONSUMO, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT F.ARTI_COD, FADE_CONSUMO
                    FROM ARTICULO A, FACTURAS_DETALLE F
                    WHERE F.FACT_ID = :IDDOC AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
                    INTO :ART, :IMPTOS
                    DO
                    BEGIN
                    execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                    if (IMPTOS <> 0) then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CTACONSUMO, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        SUMA = SUMA - IMPTOS;
                        END
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTACONSUMO, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - IMPTOS;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTACONSUMO, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - IMPTOS;
                END
            END /* IMPTOS <> 0 */
        END /* CONSUMO EN CTA CONSTANTE */
    /* DESCUENTO */
    if ((CTADTO IS NOT NULL) AND (CTADTO <> '')) then
        BEGIN
        execute procedure redondee(VRDTO, DIG) returning_values (VRDTO);
        if (VRDTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTADTO, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRDTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA + VRDTO;
                END
            if (TIPOCUEN = 'N') then
                    BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRDTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA + VRDTO;
                END
            END
        END /* DESCUENTO */
    /* VALOR ADIC */
    if ((CTAADIC IS NOT NULL) AND (CTAADIC <> '')) then
        BEGIN
        execute procedure redondee(VRADIC, DIG) returning_values (VRADIC);
        if (VRADIC <> 0) THEN
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTAADIC, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRADIC, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - VRADIC;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRADIC, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - VRADIC;
                END
            END
        END /* VR. ADIC */
    /* VALOR EXTRA */
    if ((CTAEXTRA IS NOT NULL) AND (CTAEXTRA <> '')) THEN
        BEGIN
        execute procedure redondee(VREXTRA, DIG) returning_values (VREXTRA);
        if (VREXTRA <> 0) THEN
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTAEXTRA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VREXTRA, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - VREXTRA;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VREXTRA, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - VREXTRA;
                END
            END
        END /* VR. EXTRA */
    /* DESCUENTE EL IMPOCONSUMO */
    SELECT SUM(FADE_CONSUMO)
        FROM FACTURAS_DETALLE F WHERE F.FACT_ID = :IDDOC AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL)) INTO :IMPTOS;
    vrsubt = vrsubt - IMPTOS;
    /* RETENCION FUENTE */
    if ((RTFTE = 'C') or (RTFTE = 'K')) then
      BEGIN
      execute procedure redondee(VRRTFTE, DIG) returning_values (VRRTFTE);
      if (VRRTFTE <> 0) then
        BEGIN
        if (RTFTE = 'C') then
            CTARTFTE = TCTARTFTE;
        EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTARTFTE, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :VRSUBT, :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTFTE;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :VRSUBT, :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTFTE;
            END
        /* AUTORETENCION */
        if (FAUTORET <= fecaux) then
            BEGIN
            EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'CUENTA DE AUTORETENCION EN LA FUENTE') returning_values (CTARTFTE);
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTARTFTE INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERROR (31, :IDDOC, :CTARTFTE, 2);
                CUENTA = CTARTFTE;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                begin
                EXECUTE PROCEDURE ERROR (31, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, (:VRSUBT*-1), :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - VRRTFTE;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, (:VRSUBT*-1), :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - VRRTFTE;
                END
            END
        END /* RTFTE */
      END
    if (RTFTE = 'A') then
      BEGIN
      FOR SELECT MAX(COAR_CTARTFTEV), MAX(COAR_RTFTE), MIN(COAR_RTBASE), SUM(FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), SUM((FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO)*COAR_RTFTE)
        FROM CONTABIL_ARTICULO C, FACTURAS_DETALLE F
        WHERE F.FACT_ID = :IDDOC AND F.ARTI_COD = C.ARTI_COD AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
        GROUP BY COAR_CTARTFTEV
        INTO :CTARTFTE, :PRTFTE, :baseadic, :MONTO, :VRRTFTE
        DO
        BEGIN
        MONTO = MONTO * FACTOR;
        if (MONTO >= BASEADIC) then
            BEGIN
            VRRTFTE = VRRTFTE * FACTOR / 100;
            execute procedure redondee(VRRTFTE, DIG) returning_values (VRRTFTE);
            execute procedure redondee(MONTO, DIG) returning_values (MONTO);
            if (VRRTFTE <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTARTFTE, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :MONTO, :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    NROI = NROI + 1;
                    SUMA = SUMA + VRRTFTE;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :MONTO, :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA + VRRTFTE;
                    END
                /* AUTORETENCION */
                if (FAUTORET <= fecaux) then
                    BEGIN
                    EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'CUENTA DE AUTORETENCION EN LA FUENTE') returning_values (CTARTFTE);
                    EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTARTFTE, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
                    if (ERRORC <> 0) then
                        ERROR = ERROR + 1;
                    if (TIPOCUEN = 'C') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, (:MONTO*-1), :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                        NROI = NROI + 1;
                        SUMA = SUMA - VRRTFTE;
                        END
                    if (TIPOCUEN = 'N') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, (:MONTO*-1), :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NROI = NROI + 1;
                        SUMA = SUMA - VRRTFTE;
                        END
                    END
                END
            END
        END /* RTFTE */
      END
    /* RETENCION IVA */
    if ((RTIVA = 'C') or (RTIVA = 'K')) then
      BEGIN
      execute procedure redondee(VRRTIVA, DIG) returning_values (VRRTIVA);
      if (VRRTIVA <> 0) then
        BEGIN
        if (RTIVA = 'C') then
            CTARTIVA = TCTARTIVA;
        EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTARTIVA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTIVA, 0, :VRIVA, :PORC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTIVA;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTIVA, 0, :VRIVA, :PORC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTIVA;
            END
        END /* RTIVA */
      END
    /* RETENCION DE ICA */
    if ((RTICA = 'C') or (RTICA = 'K')) then
      BEGIN
      execute procedure redondee(VRRTICA, DIG) returning_values (VRRTICA);
      if (VRRTICA <> 0) then
        BEGIN
        if (RTICA = 'C') then
            CTARTICA = TCTARTICA;
        EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTARTICA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTICA, 0, :VRSUBT, :PRTICA, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTICA;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTICA, 0, :VRSUBT, :PRTICA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTICA;
            END
        END /* RTICA */
      END
    /* CIERRE EL COMPROBANTE CONTRA LA CUENTA DEL TERCERO O LA CONSTANTE */
    if ((SUMA <> 0) and ((CARTERA = 'C') or (CARTERA = 'K') or (CARTERA = 'J'))) then
        BEGIN
        if (SUMA < 0) then
            BEGIN
            DEBITO = SUMA * -1;
            CREDITO = 0;
            END
        ELSE
            BEGIN
            DEBITO = 0;
            CREDITO = SUMA;
            END
        if (CARTERA = 'C') then
            CTACARTERA = TCTACLIEN;
        if (CARTERA = 'J') then
            BEGIN
            /* BUSQUE LA CUENTA DE LA CAJA */
            SELECT CAJA_CUENTA FROM CAJAS C, PUNTO_VENTA P
                WHERE P.CAJA_ID = C.CAJA_ID AND PTVT_ID = :PTOVTA
                INTO :CTACARTERA;
            END
        EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTACARTERA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :DEBITO, :CREDITO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
        if (TIPOCUEN = 'N') then
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :DEBITO, :CREDITO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
        NROI = NROI + 1;
        END /* SUMA EN CARTERA */
    /* CALCULE COSTOS EN VENTAS */
    EXECUTE PROCEDURE COSTO_EN_VENTAS(31, :IDDOC);
    if (COSTOS = 'A') then
        BEGIN
        FOR SELECT MAX(CTACOS), SUM(CAST(CANT AS DOUBLE PRECISION) * COSTO)
            FROM COSTO_VENTAS WHERE TIDO_COD = 31 AND COVE_ID = :IDDOC
            GROUP BY CTACOS
            INTO :CTACOSTOS, :MONTO
        DO
            BEGIN
            if (MONTO <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTACOSTOS, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT ARTI_COD, CANT * COSTO
                        FROM COSTO_VENTAS WHERE TIDO_COD = 31 AND COVE_ID = :IDDOC AND CTACOS = :CUENTA
                        INTO :ART, :MONTO
                    DO
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    NROI = NROI + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    END
                END /* MONTO <> 0 */
            END /* FOR */
        END /* COSTOS */
    if (COSTOS = 'K') then
        BEGIN
        SELECT SUM(CAST(CANT AS DOUBLE PRECISION) * COSTO)
            FROM COSTO_VENTAS WHERE TIDO_COD = 31 AND COVE_ID = :IDDOC
            INTO :MONTO;
        if (MONTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTACOSTOS, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, REGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT ARTI_COD, CANT * COSTO
                    FROM COSTO_VENTAS WHERE TIDO_COD = 31 AND COVE_ID = :IDDOC
                    INTO :ART, :MONTO
                DO
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTACOSTOS, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                    NROI = NROI + 1;
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTACOSTOS, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTACOSTOS, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                END
            END /* MONTO <> 0 */
        END /* COSTOS = K */
    if (INVEN = 'A') then
        BEGIN
        FOR SELECT MAX(CTAINV), SUM(CAST(CANT AS DOUBLE PRECISION) * COSTO)
            FROM COSTO_VENTAS WHERE TIDO_COD = 31 AND COVE_ID = :IDDOC
            GROUP BY CTAINV
            INTO :CTAINVEN, :MONTO
        DO
            BEGIN
            if (MONTO <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTAINVEN, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, REGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT ARTI_COD, CANT * COSTO
                        FROM COSTO_VENTAS WHERE TIDO_COD = 31 AND COVE_ID = :IDDOC AND CTAINV = :CUENTA
                        INTO :ART, :MONTO
                    DO
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    NROI = NROI + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    END
                END /* MONTO <> 0 */
            END /* FOR */
        END /* INVEN = A */
    if (INVEN = 'K') then
        BEGIN
        SELECT SUM(CAST(CANT AS DOUBLE PRECISION) * COSTO)
            FROM COSTO_VENTAS WHERE TIDO_COD = 31 AND COVE_ID = :IDDOC
            INTO :MONTO;
        if (MONTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTAINVEN, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT ARTI_COD, CANT * COSTO
                    FROM COSTO_VENTAS WHERE TIDO_COD = 31 AND COVE_ID = :IDDOC
                    INTO :ART, :MONTO
                DO
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTAINVEN, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                    NROI = NROI + 1;
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAINVEN, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAINVEN, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                END
            END /* MONTO <> 0 */
        END /* INVEN = K */
    /* recorra las cuentas adicionales */
    FOR SELECT INVC_CUENTA, INVC_BASE, INVC_PORC, INVC_VALOR, INVC_DB
        FROM INTERFAZ_VENTAS_CTAS
        WHERE INVE_ID = :IDINTER
        INTO :CTADIC, :BASEADIC, :PORCADIC, :VALORADIC, :DBADIC
        DO
        BEGIN
        if (VALORADIC <> 0) then
            MONTO = VALORADIC;
        ELSE
            BEGIN
            if (:BASEADIC = 'SUBTOTAL') then
                VALORADIC = vrsubt;
            if (:BASEADIC = 'DESCUENTO') then
                VALORADIC = VRDTO;
            if (:BASEADIC = 'IVA') then
                VALORADIC = VRIVA;
            if (:BASEADIC = 'ADICIONAL') then
                VALORADIC = VRADIC;
            if (:BASEADIC = 'EXTRA') then
                VALORADIC = VREXTRA;
            if (:BASEADIC = 'TOTAL') then
                VALORADIC = VRTOTAL;
            MONTO = VALORADIC * PORCADIC / 100;
            END
        if (MONTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTADIC, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                if (DBADIC = 'S') then
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                ELSE
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                if (DBADIC = 'S') then
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                ELSE
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                END
            NROI = NROI + 1;
            END
        END
    if (ERROR > 0) then
        VER = 'S';
    SUSPEND;
    END /* NO ANULADO */
  END /* EXISTE LA INTERFAZ */
ELSE
    BEGIN
    EXECUTE PROCEDURE ERROR (31, :IDDOC, :PREF, 1);
    ERROR = ERROR + 1;
    VER = 'S';
    SUSPEND;
    END
END

^

SET TERM ; ^

SET TERM ^ ;

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

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE CONTABIL_FACTURAS_CONTADO(
    FECFAC DATE,
    NIT VARCHAR(20),
    PREF VARCHAR(4),
    PTVTA INTEGER,
    IDINTER INTEGER)
RETURNS (
    ERROR INTEGER,
    VER CHAR(1),
    IDC INTEGER)
AS
declare variable num varchar(8);
declare variable numero varchar(10);
declare variable fecha char(8);
declare variable conc char(120);
declare variable vence char(8);
declare variable vrdto numeric(18,2);
declare variable vradic numeric(18,2);
declare variable vrsubt numeric(18,2);
declare variable vriva numeric(18,2);
declare variable prtfte numeric(9,2);
declare variable vrrtfte numeric(18,2);
declare variable vrrtiva numeric(18,2);
declare variable prtica numeric(9,2);
declare variable vrrtica numeric(18,2);
declare variable vrtotal numeric(18,2);
declare variable vrextra numeric(18,2);
declare variable tipocomp varchar(3);
declare variable prefcont varchar(4);
declare variable ventas char(1);
declare variable ctaventas varchar(20);
declare variable iva char(1);
declare variable ctaiva varchar(20);
declare variable consumo char(1);
declare variable ctaconsumo varchar(20);
declare variable cartera char(1);
declare variable ctacartera varchar(20);
declare variable rtfte char(1);
declare variable ctartfte varchar(20);
declare variable rtiva char(1);
declare variable ctartiva varchar(20);
declare variable rtica char(1);
declare variable ctartica varchar(20);
declare variable inven char(1);
declare variable ctainven varchar(20);
declare variable costos char(1);
declare variable ctacostos varchar(20);
declare variable ctadto varchar(20);
declare variable ctaadic varchar(20);
declare variable ctaextra varchar(20);
declare variable existe char(1);
declare variable cuenta varchar(20);
declare variable monto numeric(18,2);
declare variable tipocuen char(1);
declare variable nombre varchar(60);
declare variable proy varchar(4);
declare variable centro varchar(4);
declare variable porc numeric(5,2);
declare variable debito numeric(18,2);
declare variable credito numeric(18,2);
declare variable nroi integer;
declare variable art varchar(15);
declare variable impinc char(1);
declare variable imptos numeric(18,2);
declare variable suma numeric(18,2);
declare variable porciva numeric(9,2);
declare variable tctaclien varchar(20);
declare variable tctaventa varchar(20);
declare variable tctartfte varchar(20);
declare variable tctartiva varchar(20);
declare variable tctartica varchar(20);
declare variable ctadic varchar(20);
declare variable baseadic varchar(20);
declare variable porcadic numeric(5,2);
declare variable valoradic numeric(18,2);
declare variable dbadic char(1);
declare variable ptovta integer;
declare variable dig integer;
declare variable mercancia numeric(18,2);
declare variable factor double precision;
declare variable cent char(1);
BEGIN
/* BUSQUE LA INTERFACE */
EXISTE = 'N';
SELECT 'S', TICO_COD, PRCO_PRE, INVE_VENTAS, INVE_IVA, INVE_CONSUMO, INVE_CARTERA, INVE_RTFTE, INVE_RTIVA, INVE_RTICA, INVE_COSTO, INVE_INVEN, INVE_CTAVENTAS, INVE_CTAIVA, INVE_CTACONSUMO, INVE_CTADTO, INVE_CTAADIC, INVE_CTAEXTRA, INVE_CTACARTERA, INVE_CTARTFTE, INVE_CTARTIVA, INVE_CTARTICA, INVE_CTAINVEN, INVE_CTACOSTOS, INVE_CONFIRMAR, INVE_CENTRO
    FROM INTERFAZ_VENTAS
    WHERE INVE_ID = :IDINTER
    INTO :EXISTE, :TIPOCOMP, :PREFCONT, :VENTAS, :IVA, :CONSUMO, :CARTERA, :RTFTE, :RTIVA, :RTICA, :COSTOS, :INVEN, :CTAVENTAS, :CTAIVA, :CTACONSUMO, :CTADTO, :CTAADIC, :CTAEXTRA, :CTACARTERA, :CTARTFTE, :CTARTIVA, :CTARTICA, :CTAINVEN, :CTACOSTOS, :VER, :CENT;
if (EXISTE = 'S') then
  BEGIN
  /* BORRE CUALQUEIR CONTABILIZACION PREVIA */
/*  DELETE FROM CONTABILIZACION WHERE CNTB_TIPOREF = 31 AND CNTB_IDREF = 0;
  /* BUSQUE EL CENTRO DEL PUNTO, LA BODEGA, O EL PREFIJO  */
  IF (CENT = 'B') THEN
    SELECT B.BODE_CENTRO, B.BODE_PROY FROM BODEGA B, PUNTO_VENTA P
        WHERE B.BODE_COD = P.BODE_COD AND P.ptvt_id = :ptvta INTO :CENTRO, :PROY;
  IF (CENT = 'V') THEN
    SELECT MAX(V.CENT_COD), MAX(V.PROY_COD) FROM VENDEDORES V
        WHERE V.PTVT_ID = :PTVTA INTO :CENTRO, :PROY;
  IF (CENT = 'P') THEN
    SELECT P.PREF_PROY, P.PREF_CENTRO FROM PREFIJOS P
        WHERE P.PREF_PRE = :PREF AND P.TIDO_COD = 31 INTO :CENTRO, :PROY;
  /* TRAIGA LOS DATOS DEL CLIENTE */
  SELECT TERC_NOM, TERC_CTARTFTE, TERC_CTARTIVA, TERC_CTARTICA, TERC_CTAVENTA, TERC_CTACLIENTE
        FROM TERCEROS T WHERE TERC_NIT = :NIT
        INTO :NOMBRE, TCTARTFTE, TCTARTIVA, TCTARTICA, TCTAVENTA, TCTACLIEN;
  SELECT SUM(FACT_DTOMONTO), SUM(FACT_ADICIONAL), SUM(FACT_IVAMONTO), SUM(FACT_EXTRA), SUM(FACT_TOTAL), SUM(FACT_RTFTEMONTO), SUM(FACT_RTIVAMONTO), SUM(FACT_RTICAMONTO), MAX(FACT_IVAINC)
        FROM FACTURAS F WHERE FACT_FECHA = :FECFAC AND FACT_ANULADO = 'N' AND PTVT_ID = :ptvta AND PREF_PRE = :PREF
        INTO :VRDTO, :VRADIC, :VRIVA, :VREXTRA, :VRTOTAL, :VRRTFTE, :VRRTIVA, :VRRTICA, :impinc;
  VRSUBT = VRTOTAL - VREXTRA - VRIVA; /* BASE DE RETEFTE Y RETEICA */
  MERCANCIA = VRSUBT - VRADIC + VRDTO;
  EXECUTE PROCEDURE FECHA_A_CONTA(:FECFAC) returning_values (:FECHA);
  VENCE = FECHA;
  /* REGISTRE EL ENCABEZADO CONTABLE */
  IDC = GEN_ID(ID_CONTABILIZA, 1);
  CONC = 'RESUMEN VENTAS ' || FECHA;
  NUM = SUBSTR(FECHA, 3, 8);
  INSERT INTO CONTABILIZACION (CNTB_ID, CNTB_TIPOCOMP, CNTB_PREFCNT, CNTB_NUMERO, CNTB_FECHA, CNTB_CONCEPTO, CNTB_REF, CNTB_TIPOREF, CNTB_IDREF, CNTB_PREFREF, CNTB_NUMREF, CNTB_PROCESADO)
        VALUES (:IDC, :TIPOCOMP, :PREFCONT, :NUM, :FECHA, :CONC, '', 0, 0, :PREF, :NUM, 'N');
  NROI = 0;
  SUMA = 0;
  ERROR = 0;
  /* SI NO HAY CUENTA DE DESCUENTO NI ADICIONAL CALCULE UN FACTOR PARA LAS VENTAS Y EL IVA */
  if (MERCANCIA <> 0) then
    FACTOR = CAST(VRSUBT AS DOUBLE PRECISION) / CAST(MERCANCIA AS DOUBLE PRECISION);
  ELSE
    FACTOR = 1;
  /* TRAIGA EL NUMERO DE DIGITOS PARA EL REDONDEO */
  SELECT CAST(CONF_VALOR AS INTEGER) FROM CONFIGURACION WHERE CONF_MODULO = 'FACTURACION' AND
        CONF_CATEGORIA = 'GENERAL' AND CONF_PROPIEDAD = 'REDONDEO AL MULTIPLO DE DIEZ EN TOTALES' INTO :DIG;
  /* CUENTAS DE VENTAS */
  if (VENTAS = 'A') then
        BEGIN
        FOR SELECT MAX(COAR_CTAVNT), SUM(CAST(FADE_CANT AS DOUBLE PRECISION) * (FADE_PRUNIT-FADE_DTOMONTO)), SUM(FADE_IVAMONTO+FADE_CONSUMO)
            FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_DETALLE FD, FACTURAS F
            WHERE F.FACT_ID = FD.FACT_ID AND FACT_FECHA = :FECFAC AND FD.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND F.PREF_PRE = :PREF AND F.PTVT_ID = :PTVTA AND FACT_ANULADO = 'N' AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
            GROUP BY COAR_CTAVNT
            INTO :CTAVENTAS, :MONTO, :IMPTOS
            DO
            BEGIN
            if (IMPINC = 'S') then
                MONTO = MONTO - IMPTOS;
            if ((CTADTO IS NULL) OR (CTADTO = '')) then
                MONTO = MONTO * FACTOR;
            execute procedure redondee(MONTO, DIG) returning_values (MONTO);
            if (MONTO <> 0) then
                BEGIN
                CUENTA = NULL;
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :CTAVENTAS INTO :CUENTA, :TIPOCUEN;
                if (CUENTA IS NULL) then
                    begin
                    EXECUTE PROCEDURE ERROR (31, 0, :CTAVENTAS, 2);
                    CUENTA = CTAVENTAS;
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT FD.ARTI_COD, (CAST(FADE_CANT AS DOUBLE PRECISION) * (FADE_PRUNIT-FADE_DTOMONTO)), (FADE_IVAMONTO+FADE_CONSUMO)
                        FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_DETALLE FD, FACTURAS F
                        WHERE F.FACT_ID = FD.FACT_ID AND FACT_FECHA = :FECFAC AND F.PREF_PRE = :PREF AND F.PTVT_ID = :PTVTA AND FD.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTAINV = :CUENTA AND FACT_ANULADO = 'N' AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
                        INTO :ART, :MONTO, :IMPTOS
                    DO
                        BEGIN
                        if (IMPINC = 'S') then
                            MONTO = MONTO - IMPTOS;
                        if ((CTADTO IS NULL) OR (CTADTO = '')) then
                            MONTO = MONTO * FACTOR;
                        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                        if (MONTO <> 0) then
                            BEGIN
                            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                            NROI = NROI + 1;
                            SUMA = SUMA - MONTO;
                            END
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    NROI = NROI + 1;
                    SUMA = SUMA - MONTO;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA - MONTO;
                    END
                END /* MONTO <> 0 */
            END /* FOR */
        END /* VENTAS X ARTICULO */
     IF ((VENTAS = 'C') OR (VENTAS = 'K')) THEN
        BEGIN
        IF (VENTAS = 'C') THEN
            CTAVENTAS = TCTAVENTA;
        SELECT SUM(CAST(FADE_CANT AS DOUBLE PRECISION) * (FADE_PRUNIT-FADE_DTOMONTO)), SUM(FADE_IVAMONTO+FADE_CONSUMO)
            FROM FACTURAS_DETALLE FD, FACTURAS F
            WHERE F.FACT_ID = FD.FACT_ID AND FACT_FECHA = :FECFAC AND F.PREF_PRE = :PREF AND F.PTVT_ID = :PTVTA AND FACT_ANULADO = 'N' AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
            INTO :MONTO, :IMPTOS;
        if (IMPINC = 'S') then
            MONTO = MONTO - IMPTOS;
        if ((CTADTO IS NULL) OR (CTADTO = '')) then
            MONTO = MONTO * FACTOR;
        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
        if (MONTO <> 0) then
            BEGIN
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTAVENTAS INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERROR (31, 0, :CTAVENTAS, 2);
                CUENTA = CTAVENTAS;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT FD.ARTI_COD, (CAST(FADE_CANT AS DOUBLE PRECISION) * (FADE_PRUNIT-FADE_DTOMONTO)), (FADE_IVAMONTO+FADE_CONSUMO)
                    FROM /*ARTICULO A,*/ FACTURAS_DETALLE FD, FACTURAS F
                    WHERE F.FACT_ID = FD.FACT_ID AND FACT_FECHA = :FECFAC AND F.PREF_PRE = :PREF AND F.PTVT_ID = :PTVTA AND FACT_ANULADO = 'N' AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
                    INTO :ART, :MONTO, :IMPTOS
                    DO
                    BEGIN
                    if (IMPINC = 'S') then
                        MONTO = MONTO - IMPTOS;
                    if ((CTADTO IS NULL) OR (CTADTO = '')) then
                        MONTO = MONTO * FACTOR;
                    execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                    if (MONTO <> 0) then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        SUMA = SUMA - MONTO;
                        END
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - MONTO;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - MONTO;
                END
            END /* MONTO <> 0 */
        END /* VENTAS DE CLIENTE O CONSTANTE */
    /* EL IVA EN VENTAS */
    if (IVA = 'A') then
        BEGIN
        FOR SELECT MAX(COAR_CTAIVAV), SUM(FADE_IVAMONTO), SUM(CAST(FADE_CANT AS DOUBLE PRECISION) * (FADE_PRUNIT-FADE_DTOMONTO)), sum(FADE_CONSUMO)
            FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_DETALLE FD, FACTURAS F
            WHERE F.FACT_ID = FD.FACT_ID AND FACT_FECHA = :FECFAC AND F.PREF_PRE = :PREF AND F.PTVT_ID = :PTVTA AND FD.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND FACT_ANULADO = 'N' AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
            GROUP BY COAR_CTAIVAV
            INTO :CTAIVA, :IMPTOS, :MONTO, :VALORADIC
        DO
            BEGIN
            if (IMPINC = 'S') then
                MONTO = MONTO - IMPTOS - VALORADIC;
            MONTO = MONTO * -1;
            MONTO = MONTO * FACTOR;
            IMPTOS = IMPTOS * FACTOR;
            execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
            execute procedure redondee(MONTO, DIG) returning_values (MONTO);
            if (IMPTOS <> 0) then
                BEGIN
                CUENTA = NULL;
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :CTAIVA INTO :CUENTA, :TIPOCUEN;
                if (CUENTA IS NULL) then
                    begin
                    EXECUTE PROCEDURE ERROR (31, 0, :CTAIVA, 2);
                    CUENTA = CTAIVA;
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT FD.ARTI_COD, FADE_IVAMONTO, (CAST(FADE_CANT AS DOUBLE PRECISION) * (FADE_PRUNIT-FADE_DTOMONTO)), TAIV_PORC, FADE_CONSUMO
                        FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_DETALLE FD, FACTURAS F, TARIFA_IVA T
                        WHERE F.FACT_ID = FD.FACT_ID AND FACT_FECHA = :FECFAC AND F.PREF_PRE = :PREF AND F.PTVT_ID = :PTVTA AND FD.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTAIVAV = :CUENTA AND A.TAIV_COD = T.TAIV_COD AND FACT_ANULADO = 'N' AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
                        INTO :ART, :IMPTOS, :MONTO, :PORCIVA, :VALORADIC
                    DO
                        BEGIN
                        if (IMPINC = 'S') then
                            MONTO = MONTO - IMPTOS - VALORADIC;
                        MONTO = MONTO * -1;
                        MONTO = MONTO * FACTOR;
                        IMPTOS = IMPTOS * FACTOR;
                        execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                        if (IMPTOS <> 0) then
                            BEGIN
                            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, :MONTO, :PORCIVA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                            NROI = NROI + 1;
                            SUMA = SUMA + DEBITO - CREDITO;
                            END
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, :MONTO, ABS(:IMPTOS*100/:MONTO), :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    NROI = NROI + 1;
                    SUMA = SUMA - IMPTOS;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, :MONTO, ABS(:IMPTOS*100/:MONTO), :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA - IMPTOS;
                    END
                END   /* IMPTOS <> 0 */
            END /* FOR */
        END /* IVA X ARTICULO */
    if (IVA = 'K') then /* IVA EN CTA CONSTANTE */
        BEGIN
        SELECT SUM(FADE_IVAMONTO), SUM(CAST(FADE_CANT AS DOUBLE PRECISION) * (FADE_PRUNIT-FADE_DTOMONTO)), SUM(FADE_CONSUMO)
            FROM FACTURAS_DETALLE FD, FACTURAS F
            WHERE F.FACT_ID = FD.FACT_ID AND FACT_FECHA = :FECFAC AND F.PREF_PRE = :PREF AND F.PTVT_ID = :PTVTA AND FACT_ANULADO = 'N' AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
            INTO :IMPTOS, :MONTO, :valoradic;
        if (IMPINC = 'S') then
            MONTO = MONTO - IMPTOS - VALORADIC;
        MONTO = MONTO * -1;
        MONTO = MONTO * FACTOR;
        IMPTOS = IMPTOS * FACTOR;
        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
        execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
        if (IMPTOS <> 0) then
            BEGIN
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTAIVA INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERROR (31, 0, :CTAIVA, 2);
                CUENTA = CTAIVA;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT FD.ARTI_COD, (CAST(FADE_CANT AS DOUBLE PRECISION) * (FADE_PRUNIT-FADE_DTOMONTO)), FADE_IVAMONTO, TAIV_PORC, FADE_CONSUMO
                    FROM ARTICULO A, FACTURAS_DETALLE FD, FACTURAS F, TARIFA_IVA T
                    WHERE F.FACT_ID = FD.FACT_ID AND FACT_FECHA = :FECFAC AND F.PREF_PRE = :PREF AND F.PTVT_ID = :PTVTA AND FD.arti_cod = A.arti_cod AND T.TAIV_COD=A.TAIV_COD AND FACT_ANULADO = 'N' AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
                    INTO :ART, :MONTO, :IMPTOS, :PORCIVA, :VALORADIC
                    DO
                    BEGIN
                    if (IMPINC = 'S') then
                        MONTO = MONTO - IMPTOS - VALORADIC;
                    MONTO = MONTO * -1;
                    MONTO = MONTO * FACTOR;
                    IMPTOS = IMPTOS * FACTOR;
                    execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                    execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                    if (IMPTOS <> 0) then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', 0, :IMPTOS, :MONTO, :PORCIVA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        SUMA = SUMA - IMPTOS;
                        END
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', 0, :IMPTOS, :MONTO, ABS(:IMPTOS*100/:MONTO), :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - IMPTOS;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', 0, :IMPTOS, :MONTO, ABS(:IMPTOS*100/:MONTO), :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - IMPTOS;
                END
            END /* IMPTOS <> 0 */
        END /* IVA EN CTA CONSTANTE */
    /* EL IMPOCONSUMO */
    if (CONSUMO = 'A') then
        BEGIN
        FOR SELECT MAX(COAR_CTACONS), SUM(FADE_CONSUMO)
            FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_DETALLE FD, FACTURAS F
            WHERE F.FACT_ID = FD.FACT_ID AND FACT_FECHA = :FECFAC AND F.PREF_PRE = :PREF AND F.PTVT_ID = :PTVTA AND FD.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND FACT_ANULADO = 'N' AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
            GROUP BY COAR_CTACONS
            INTO :CTACONSUMO, :IMPTOS
        DO
            BEGIN
            execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
            if (IMPTOS <> 0) then
                BEGIN
                CUENTA = NULL;
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :CTACONSUMO INTO :CUENTA, :TIPOCUEN;
                if (CUENTA IS NULL) then
                    begin
                    EXECUTE PROCEDURE ERROR (31, 0, :CTACONSUMO, 2);
                    CUENTA = CTACONSUMO;
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, REGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT FD.ARTI_COD, FADE_CONSUMO
                        FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_DETALLE FD, FACTURAS F
                        WHERE F.FACT_ID = FD.FACT_ID AND FACT_FECHA = :FECFAC AND F.PREF_PRE = :PREF AND F.PTVT_ID = :PTVTA AND FD.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTACONS = :CUENTA AND FACT_ANULADO = 'N' AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
                        INTO :ART, :IMPTOS
                    DO
                        BEGIN
                        execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                        if (IMPTOS <> 0) then
                            BEGIN
                            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                            NROI = NROI + 1;
                            SUMA = SUMA - IMPTOS;
                            END
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    NROI = NROI + 1;
                    SUMA = SUMA - IMPTOS;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA - CREDITO;
                    END
                END /* IMPTOS <> 0 */
            END /* FOR */
        END /* CONSUMO X ARTICULO */
    if (CONSUMO = 'K') then /* CONSUMO EN CTA CONSTANTE */
        BEGIN
        SELECT SUM(FADE_CONSUMO)
            FROM FACTURAS_DETALLE FD, FACTURAS F
            WHERE F.FACT_ID = FD.FACT_ID AND FACT_FECHA = :FECFAC AND F.PREF_PRE = :PREF AND F.PTVT_ID = :PTVTA AND FACT_ANULADO = 'N' AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
            INTO :IMPTOS;
        execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
        if (IMPTOS <> 0) then
            BEGIN
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTACONSUMO INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERROR (31, 0, :CTACONSUMO, 2);
                CUENTA = CTACONSUMO;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT FD.ARTI_COD, FADE_CONSUMO
                    FROM /*ARTICULO A,*/ FACTURAS_DETALLE FD, FACTURAS F
                    WHERE F.FACT_ID = FD.FACT_ID AND FACT_FECHA = :FECFAC AND F.PREF_PRE = :PREF AND F.PTVT_ID = :PTVTA AND FACT_ANULADO = 'N' AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
                    INTO :ART, :IMPTOS
                    DO
                    BEGIN
                    execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                    if (IMPTOS <> 0) then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CTACONSUMO, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        SUMA = SUMA - IMPTOS;
                        END
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTACONSUMO, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - IMPTOS;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTACONSUMO, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - IMPTOS;
                END
            END /* IMPTOS <> 0 */
        END /* CONSUMO EN CTA CONSTANTE */
    /* DESCUENTO */
    if ((CTADTO IS NOT NULL) AND (CTADTO <> '')) then
        BEGIN
        execute procedure redondee(VRDTO, DIG) returning_values (VRDTO);
        if (VRDTO <> 0) then
            BEGIN
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTADTO INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERROR (31, 0, :CTADTO, 2);
                CUENTA = CTADTO;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                begin
                EXECUTE PROCEDURE ERROR (31, 0, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRDTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA + VRDTO;
                END
            if (TIPOCUEN = 'N') then
                    BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRDTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA + VRDTO;
                END
            END
        END /* DESCUENTO */
    /* VALOR ADIC */
    if ((CTAADIC IS NOT NULL) AND (CTAADIC <> '')) then
        BEGIN
        execute procedure redondee(VRADIC, DIG) returning_values (VRADIC);
        if (VRADIC <> 0) THEN
            BEGIN
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTAADIC INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERROR (31, 0, :CTAADIC, 2);
                CUENTA = CTAADIC;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                begin
                EXECUTE PROCEDURE ERROR (31, 0, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRADIC, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - VRADIC;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRADIC, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - VRADIC;
                END
            END
        END /* VR. ADIC */
    /* VALOR EXTRA */
    if ((CTAEXTRA IS NOT NULL) AND (CTAEXTRA <> '')) THEN
        BEGIN
        execute procedure redondee(VREXTRA, DIG) returning_values (VREXTRA);
        if (VREXTRA <> 0) THEN
            BEGIN
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTAEXTRA INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERROR (31, 0, :CTAEXTRA, 2);
                CUENTA = CTAEXTRA;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                begin
                EXECUTE PROCEDURE ERROR (31, 0, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VREXTRA, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - VREXTRA;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VREXTRA, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - VREXTRA;
                END
            END
        END /* VR. EXTRA */
    /* RETENCION FUENTE */
    if ((RTFTE = 'C') or (RTFTE = 'K')) then
      BEGIN
      execute procedure redondee(VRRTFTE, DIG) returning_values (VRRTFTE);
      if (VRRTFTE <> 0) then
        BEGIN
        if (RTFTE = 'C') then
            CTARTFTE = TCTARTFTE;
        CUENTA = NULL;
        SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
            WHERE CUEN_COD = :CTARTFTE INTO :CUENTA, :TIPOCUEN;
        if (CUENTA IS NULL) then
            begin
            EXECUTE PROCEDURE ERROR (31, 0, :CTARTFTE, 2);
            CUENTA = CTARTFTE;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            begin
            EXECUTE PROCEDURE ERROR (31, 0, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :VRSUBT, :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTFTE;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :VRSUBT, :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTFTE;
            END
        END /* RTFTE */
      END
    /* RETENCION IVA */
    if ((RTIVA = 'C') or (RTIVA = 'K')) then
      BEGIN
      execute procedure redondee(VRRTIVA, DIG) returning_values (VRRTIVA);
      if (VRRTIVA <> 0) then
        BEGIN
        if (RTIVA = 'C') then
            CTARTIVA = TCTARTIVA;
        CUENTA = NULL;
        SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
            WHERE CUEN_COD = :CTARTIVA INTO :CUENTA, :TIPOCUEN;
        if (CUENTA IS NULL) then
            begin
            EXECUTE PROCEDURE ERROR (31, 0, :CTARTIVA, 2);
            CUENTA = CTARTIVA;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            begin
            EXECUTE PROCEDURE ERROR (31, 0, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTIVA, 0, :VRIVA, :PORC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTIVA;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTIVA, 0, :VRIVA, :PORC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTIVA;
            END
        END /* RTIVA */
      END
    /* RETENCION DE ICA */
    if ((RTICA = 'C') or (RTICA = 'K')) then
      BEGIN
      execute procedure redondee(VRRTICA, DIG) returning_values (VRRTICA);
      if (VRRTICA <> 0) then
        BEGIN
        if (RTICA = 'C') then
            CTARTICA = TCTARTICA;
        CUENTA = NULL;
        SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
            WHERE CUEN_COD = :CTARTICA INTO :CUENTA, :TIPOCUEN;
        if (CUENTA IS NULL) then
            begin
            EXECUTE PROCEDURE ERROR (31, 0, :CTARTICA, 2);
            CUENTA = CTARTICA;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            begin
            EXECUTE PROCEDURE ERROR (31, 0, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTICA, 0, :VRSUBT, :PRTICA, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTICA;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTICA, 0, :VRSUBT, :PRTICA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTICA;
            END
        END /* RTICA */
      END
    /* CIERRE EL COMPROBANTE CONTRA LA CUENTA DEL TERCERO O LA CONSTANTE */
    if ((SUMA <> 0) and ((CARTERA = 'C') or (CARTERA = 'K') or (CARTERA = 'J'))) then
        BEGIN
        if (SUMA < 0) then
            BEGIN
            DEBITO = SUMA * -1;
            CREDITO = 0;
            END
        ELSE
            BEGIN
            DEBITO = 0;
            CREDITO = SUMA;
            END
        if (CARTERA = 'C') then
            CTACARTERA = TCTACLIEN;
        if (CARTERA = 'J') then
            BEGIN
            /* BUSQUE LA CUENTA DE LA CAJA */
            SELECT CAJA_CUENTA FROM CAJAS C, PUNTO_VENTA P
                WHERE P.CAJA_ID = C.CAJA_ID AND PTVT_ID = :PTOVTA
                INTO :CTACARTERA;
            END
        CUENTA = NULL;
        SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
            WHERE CUEN_COD = :CTACARTERA INTO :CUENTA, :TIPOCUEN;
        if (CUENTA IS NULL) then
            begin
            EXECUTE PROCEDURE ERROR (31, 0, :CTACARTERA, 2);
            CUENTA = CTACARTERA;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            begin
            EXECUTE PROCEDURE ERROR (31, 0, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'C') then
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :DEBITO, :CREDITO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
        if (TIPOCUEN = 'N') then
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :DEBITO, :CREDITO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
        NROI = NROI + 1;
        END /* SUMA EN CARTERA */
    /* CALCULE LOS COSTOS */
    EXECUTE PROCEDURE costo_en_ventas_contado(:fecfac,  :pref, :ptvta);
    if (COSTOS = 'A') then
        BEGIN
        FOR SELECT MAX(CTACOS), SUM(COSTO)
            FROM COSTO_VENTAS WHERE TIDO_COD = 31 AND COVE_ID = 0
            GROUP BY CTACOS
            INTO :CTACOSTOS, :MONTO
        DO
            BEGIN
            if (MONTO <> 0) then
                BEGIN
                CUENTA = NULL;
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :CTACOSTOS INTO :CUENTA, :TIPOCUEN;
                IF (CUENTA IS NULL) THEN
                    begin
                    EXECUTE PROCEDURE ERROR (31, 0, :CTACOSTOS, 2);
                    CUENTA = CTARTFTE;
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT ARTI_COD, CANT * COSTO
                        FROM COSTO_VENTAS WHERE TIDO_COD = 31 AND COVE_ID = 0 AND CTACOS = :CUENTA
                        INTO :ART, :MONTO
                    DO
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    NROI = NROI + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    END
                END /* MONTO <> 0 */
            END /* FOR */
        END /* COSTOS */
    if (COSTOS = 'K') then
        BEGIN
        SELECT SUM(COSTO)
            FROM COSTO_VENTAS  WHERE TIDO_COD = 31 AND COVE_ID = 0
            INTO :MONTO;
        if (MONTO <> 0) then
            BEGIN
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTACOSTOS INTO :CUENTA, :TIPOCUEN;
            IF (CUENTA IS NULL) THEN
                begin
                EXECUTE PROCEDURE ERROR (31, 0, :CTACOSTOS, 2);
                CUENTA = CTARTFTE;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, REGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT ARTI_COD, CANT * COSTO
                    FROM COSTO_VENTAS WHERE TIDO_COD = 31 AND COVE_ID = 0
                    INTO :ART, :MONTO
                DO
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTACOSTOS, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                    NROI = NROI + 1;
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTACOSTOS, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTACOSTOS, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                END
            END /* MONTO <> 0 */
        END /* COSTOS = K */
    if (INVEN = 'A') then
        BEGIN
        FOR SELECT MAX(CTAINV), SUM(COSTO)
            FROM COSTO_VENTAS  WHERE TIDO_COD = 31 AND COVE_ID = 0
            GROUP BY CTAINV
            INTO :CTAINVEN, :MONTO
        DO
            BEGIN
            if (MONTO <> 0) then
                BEGIN
                CUENTA = NULL;
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :CTAINVEN INTO :CUENTA, :TIPOCUEN;
                IF (CUENTA IS NULL) THEN
                    begin
                    EXECUTE PROCEDURE ERROR (31, 0, :CTAINVEN, 2);
                    CUENTA = CTAINVEN;
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, REGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT ARTI_COD, CANT * COSTO
                        FROM COSTO_VENTAS WHERE TIDO_COD = 31 AND COVE_ID = 0 AND CTAINV = :CUENTA
                        INTO :ART, :MONTO
                    DO
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    NROI = NROI + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    END
                END /* MONTO <> 0 */
            END /* FOR */
        END /* INVEN = A */
    if (INVEN = 'K') then
        BEGIN
        SELECT SUM(COSTO)
            FROM COSTO_VENTAS WHERE TIDO_COD = 31 AND COVE_ID = 0
            INTO :MONTO;
        if (MONTO <> 0) then
            BEGIN
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTAINVEN INTO :CUENTA, :TIPOCUEN;
            IF (CUENTA IS NULL) THEN
                begin
                EXECUTE PROCEDURE ERROR (31, 0, :CTAINVEN, 2);
                CUENTA = CTAINVEN;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT ARTI_COD, CANT * COSTO
                    FROM COSTO_VENTAS  WHERE TIDO_COD = 31 AND COVE_ID = 0
                    INTO :ART, :MONTO
                DO
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTAINVEN, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                    NROI = NROI + 1;
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAINVEN, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAINVEN, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                END
            END /* MONTO <> 0 */
        END /* INVEN = K */
    /* recorra las cuentas adicionales */
    FOR SELECT INVC_CUENTA, INVC_BASE, INVC_PORC, INVC_VALOR, INVC_DB
        FROM INTERFAZ_VENTAS_CTAS
        WHERE INVE_ID = :IDINTER
        INTO :CTADIC, :BASEADIC, :PORCADIC, :VALORADIC, :DBADIC
        DO
        BEGIN
        if (VALORADIC <> 0) then
            MONTO = VALORADIC;
        ELSE
            BEGIN
            if (:BASEADIC = 'SUBTOTAL') then
                VALORADIC = vrsubt;
            if (:BASEADIC = 'DESCUENTO') then
                VALORADIC = VRDTO;
            if (:BASEADIC = 'IVA') then
                VALORADIC = VRIVA;
            if (:BASEADIC = 'ADICIONAL') then
                VALORADIC = VRADIC;
            if (:BASEADIC = 'EXTRA') then
                VALORADIC = VREXTRA;
            if (:BASEADIC = 'TOTAL') then
                VALORADIC = VRTOTAL;
            MONTO = VALORADIC * PORCADIC / 100;
            END
        if (MONTO <> 0) then
            BEGIN
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTADIC INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERROR (31, 0, :CTADIC, 2);
                CUENTA = CTADIC;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                begin
                EXECUTE PROCEDURE ERROR (31, 0, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'C') then
                BEGIN
                if (DBADIC = 'S') then
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                ELSE
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                if (DBADIC = 'S') then
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                ELSE
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                END
            NROI = NROI + 1;
            END
        END
    if (ERROR > 0) then
        VER = 'S';
    SUSPEND;
    END /* EXISTE LA INTERFAZ */
ELSE
    BEGIN
    EXECUTE PROCEDURE ERROR (31, 0, :PREF, 1);
    ERROR = ERROR + 1;
    VER = 'S';
    SUSPEND;
    END
END

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE EXISTENCIAS_DESDE_HASTA(
    FECHA DATE,
    ARTINI VARCHAR(20),
    ARTFIN VARCHAR(20),
    GRPINI VARCHAR(3),
    GRPFIN VARCHAR(3),
    BODINI VARCHAR(2),
    BODFIN VARCHAR(2),
    ORDEN CHAR(1),
    AGRUPA CHAR(1),
    DETALLE CHAR(1),
    RESERVA CHAR(1),
    ENPESO CHAR(1),
    MASIVA CHAR(1),
    SUCURSAL INTEGER)
RETURNS (
    CANT NUMERIC(18,4),
    COSTO NUMERIC(18,2),
    COSTO_LOTE NUMERIC(18,2),
    CODIGO VARCHAR(15),
    NOMBRE VARCHAR(60),
    UNIDAD VARCHAR(8),
    STAND VARCHAR(20),
    CODGRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    CODSUBG VARCHAR(3),
    NOMSUBG VARCHAR(30),
    CODMARC VARCHAR(3),
    NOMMARC VARCHAR(30),
    CODBOD VARCHAR(2),
    LOTE VARCHAR(15),
    NOMBOD VARCHAR(30),
    COSTOTOT NUMERIC(18,2),
    ULTCOSTO NUMERIC(18,2),
    FECHACOSTO DATE,
    CONSUMO NUMERIC(18,2),
    RESERVADO NUMERIC(18,4),
    ORDENADO NUMERIC(18,4),
    IVA NUMERIC(9,2),
    PESOUNIT NUMERIC(18,4),
    PESOTOTAL NUMERIC(18,4),
    PRECIO NUMERIC(18,2),
    CODBAR VARCHAR(20))
AS
declare variable exist char(1);
declare variable codini varchar(20);
declare variable codfin varchar(20);
declare variable desini varchar(20);
declare variable desfin varchar(20);
declare variable ordenc numeric(18,4);
declare variable pedido numeric(18,4);
declare variable ok char(1);
declare variable id integer;
declare variable item integer;
declare variable und varchar(8);
declare variable factor numeric(18,4);
declare variable cant2 numeric(18,4);
declare variable PEDAUTO CHAR(2);
DECLARE VARIABLE LISTA INTEGER;
BEGIN
EXECUTE PROCEDURE lee_configuracion ('FACTURACION','FACTURAS', 'CODIGO DE LA LISTA DE PRECIOS A MOSTRAR EN ARTICULOS') returning_values (:LISTA);
if (ORDEN = 'C') then
    BEGIN
    CODINI = ARTINI;
    CODFIN = ARTFIN;
    DESINI = '';
    DESFIN = 'zz';
    END
ELSE
    BEGIN
    DESINI = ARTINI;
    DESFIN = ARTFIN;
    CODINI = '';
    CODFIN = 'zz';
    END
EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION', 'FACTURAS', 'GENERAR PEDIDO AUTOMATICAMENTE CON LA FACTURA') returning_values (pedauto);
if (DETALLE = 'B') then
  BEGIN
  FOR SELECT ARTI_COD, ARTI_DES, ARTI_UNIDAD, ARTI_EXIST, TAIV_PORC, A.GRUP_COD, A.SUBG_COD, A.MARC_COD, BODE_COD, BODE_NOM, ARTI_CONSUMO, ARTI_PESO/1000
      FROM ARTICULO A, BODEGA B, TARIFA_IVA T
      WHERE ARTI_COD >= :CODINI AND ARTI_COD <= :CODFIN AND ARTI_DES >= :DESINI AND ARTI_DES <= :DESFIN AND ESAR_COD <> 'I' AND BODE_COD >= :BODINI AND
      BODE_COD <= :BODFIN AND ((SUCU_ID = :SUCURSAL) or (:SUCURSAL = 0)) AND A.TAIV_COD = T.TAIV_COD
      INTO :CODIGO, :NOMBRE, :UNIDAD, :EXIST, :IVA, :CODGRUPO, :CODSUBG, :CODMARC, :CODBOD, :NOMBOD, :CONSUMO, :pesounit
      DO
        BEGIN
        STAND = '';
        OK = 'N';
        if (AGRUPA = 'G') then
            BEGIN
            if ((CODGRUPO >= GRPINI) AND (CODGRUPO <= GRPFIN)) then
                OK = 'S';
            end
        ELSE
            if (AGRUPA = 'M') then
                BEGIN
                if ((CODMARC >= GRPINI) AND (CODMARC <= GRPFIN)) then
                    OK = 'S';
                END
        if (OK = 'S') then
            BEGIN
            NOMGRUPO = '';
            NOMMARC = '';
            NOMSUBG = '';
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            SELECT MAX(COBA_COD) FROM BARRAS_ARTICULO WHERE ARTI_COD = :codigo AND COBA_UNIDAD = :unidad INTO :codbar;
            if (CODBAR IS NULL) then
                CODBAR = CODIGO;
            if (EXIST <> 'N') then
                BEGIN
                SELECT STAND_COD FROM STANDS WHERE ARTI_COD = :CODIGO AND STAND_BODEGA = :CODBOD INTO :STAND;
                EXECUTE PROCEDURE SALDO_INICIAL_INVENTARIO(CODIGO, FECHA, :CODBOD) returning_values (CANT);
                EXECUTE PROCEDURE costo_promedio_y_ultimo_unidad(CODIGO, FECHA, UNIDAD) returning_values (COSTO, ULTCOSTO);
                SELECT MAX(MVAR_FECHA) FROM MOVIMIENTO_ARTICULO WHERE ARTI_COD = :CODIGO AND MVAR_ENTRADA = 'S' AND MVAR_FECHA <= :FECHA INTO :FECHACOSTO;
                if (MASIVA = 'S') then
                    COSTO = COSTO * (100 + :IVA) / 100 + :CONSUMO;
                COSTOTOT = :CANT * :COSTO;
                CONSUMO = CONSUMO * CANT;
                if (RESERVA = 'S') then
                    BEGIN
                    SELECT SUM(ORID_ENTREGAR)
                        FROM ORDENINVENTARIO_DETALLE OD, ordenes_inventario O
                        WHERE O.ORIN_ID = OD.ORIN_ID AND ARTI_COD = :CODIGO AND ORIN_FECHA <= :FECHA AND ORIN_FECLLEGA >= :FECHA AND ORID_ANULADO = 'N' AND OD.BODE_COD = :CODBOD
                        INTO :ORDENADO;
                    if (ORDENADO IS NULL) then
                        ORDENADO = 0;
                    ORDENC = 0;
                    FOR SELECT O.ORDC_ID, OCDE_ITEM, OCDE_CANT * OCDE_FACTOR
                        FROM ORDENES_COMPRA O, ORDENES_COMPRA_DETALLE OD
                        WHERE O.ORDC_ID = OD.ORDC_ID AND OD.ARTI_COD = :CODIGO AND ORDC_VENCE >= :FECHA AND ORDC_FECHA <= :FECHA AND OCDE_ANULADO = 'N' AND OD.BODE_COD = :CODBOD
                        INTO :ID, :ITEM, :CANT2
                        do
                        BEGIN
                        EXECUTE PROCEDURE FALTANTE(23, 21, ID, ITEM) returning_values (PEDIDO, UND, FACTOR);
                        if (PEDIDO * FACTOR = CANT2) then /* SI NO SE HA FACTURADO MIRE A VER SI SE REMISIONO */
                            EXECUTE PROCEDURE FALTANTE(23, 22, ID, ITEM) returning_values (PEDIDO, UND, FACTOR);
                        if (PEDIDO IS NULL) then
                            PEDIDO = 0;
                        ORDENC = ORDENC + PEDIDO * FACTOR;
                        END
                    ORDENADO = ORDENADO + ORDENC;
                    SELECT SUM(RSDE_LIBERAR)
                        FROM RESERVAS_DETALLE RD, RESERVAS R
                        WHERE R.RESE_ID = RD.RESE_ID AND ARTI_COD = :CODIGO AND RESE_FECHA <= :FECHA AND RESE_VENCE >= :FECHA AND RD.BODE_COD = :CODBOD AND RSDE_ANULADO = 'N'
                        INTO :RESERVADO;
                    if (RESERVADO IS NULL) then
                        RESERVADO = 0;
                    PEDIDO = 0;
                    FOR SELECT P.PEDI_ID, PEDE_ITEM, PEDE_CANT * PEDE_FACTOR
                        FROM PEDIDOS P, PEDIDOS_DETALLE PD
                        WHERE P.PEDI_ID = PD.PEDI_ID AND PD.ARTI_COD = :CODIGO AND PEDI_VENCE >= :FECHA AND PEDI_FECHA <= :FECHA AND PEDE_ANULADO = 'N' AND BODE_COD = :CODBOD
                        INTO :ID, :ITEM, :CANT2
                        do
                        BEGIN
                        EXECUTE PROCEDURE FALTANTE(34, 31, ID, ITEM) returning_values (ORDENC, UND, FACTOR);
                        if ((ORDENC * FACTOR = CANT2) or (PEDAUTO = 'SI')) then /* SI NO SE HA FACTURADO MIRE A VER SI SE REMISIONO */
                            EXECUTE PROCEDURE FALTANTE(34, 32, ID, ITEM) returning_values (ORDENC, UND, FACTOR);
                        if (ORDENC IS NULL) then
                            ORDENC = 0;
                        PEDIDO = PEDIDO + ORDENC * FACTOR;
                        END
                    RESERVADO = RESERVADO + PEDIDO;
                    END
                ELSE
                    BEGIN
                    RESERVADO = 0;
                    ORDENADO = 0;
                    END
                if (LISTA > 0) then
                    SELECT prar_fijo FROM precios_articulo WHERE arti_cod = :CODIGO and lipr_cod = :LISTA INTO :PRECIO;
                if (ENPESO = 'S') then
                    BEGIN
                    if (pesounit IS NULL) then
                        pesounit = 0;
                    if (PESOUNIT <> 0) then
                        BEGIN
                        pesototal = PESOUNIT * cant;
                        SUSPEND;
                        END
                    END
                ELSE
                    SUSPEND;
                END
            END
        END
  END

if (DETALLE = 'L') then
  BEGIN
  FOR SELECT A.ARTI_COD, ARTI_DES, ARTI_UNIDAD, ARTI_EXIST, TAIV_PORC, A.GRUP_COD, A.SUBG_COD, A.MARC_COD, L.lote_nro, L.lote_nro||' - '||L.lote_vence, ARTI_CONSUMO,l.bode_cod, L.lote_saldo,l.lote_costo, ARTI_PESO/1000
      FROM ARTICULO A, LOTES l, TARIFA_IVA T
      WHERE A.ARTI_COD >= '0' AND A.ARTI_COD <= 'zz' AND ARTI_DES >= '' AND ARTI_DES <= 'zz' AND ESAR_COD <> 'I' AND A.TAIV_COD = T.TAIV_COD and a.arti_cod = l.arti_cod
      INTO :CODIGO, :NOMBRE, :UNIDAD, :EXIST, :IVA, :CODGRUPO, :CODSUBG, :CODMARC, :LOTE, :NOMBOD, :CONSUMO, :codbod, :cant, :costo_lote, :pesounit
      DO
        BEGIN
        OK = 'N';
        if (AGRUPA = 'G') then
            BEGIN
            if ((CODGRUPO >= GRPINI) AND (CODGRUPO <= GRPFIN)) then
                OK = 'S';
            end
        ELSE
            if (AGRUPA = 'M') then
                BEGIN
                if ((CODMARC >= GRPINI) AND (CODMARC <= GRPFIN)) then
                    OK = 'S';
                END
        if (OK = 'S') then
            BEGIN
            NOMGRUPO = '';
            NOMMARC = '';
            NOMSUBG = '';
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            SELECT MAX(COBA_COD) FROM BARRAS_ARTICULO WHERE ARTI_COD = :codigo AND COBA_UNIDAD = :unidad INTO :codbar;
            if (CODBAR IS NULL) then
                CODBAR = CODIGO;

            if (EXIST <> 'N') then
                BEGIN
                EXECUTE PROCEDURE COSTO_PROMEDIO_UNIDAD(CODIGO, FECHA, UNIDAD) returning_values (COSTO);
                EXECUTE PROCEDURE ULTIMO_COSTO(CODIGO, FECHA, UNIDAD) returning_values (ULTCOSTO);
                SELECT MAX(MVAR_FECHA) FROM MOVIMIENTO_ARTICULO WHERE ARTI_COD = :CODIGO AND MVAR_ENTRADA = 'S' AND MVAR_FECHA <= :FECHA INTO :FECHACOSTO;
                if (MASIVA = 'S') then
                    COSTO = COSTO * (100 + :IVA) / 100 + :CONSUMO;
                COSTOTOT = :CANT * :COSTO;
                CONSUMO = CONSUMO * CANT;
                if (RESERVA = 'S') then
                    BEGIN
                    SELECT SUM(ORID_ENTREGAR)
                        FROM ORDENINVENTARIO_DETALLE OD, ordenes_inventario O
                        WHERE O.ORIN_ID = OD.ORIN_ID AND ARTI_COD = :CODIGO AND ORIN_FECHA <= :FECHA AND ORIN_FECLLEGA >= :FECHA AND ORID_ANULADO = 'N'
                        INTO :ORDENADO;
                    if (ORDENADO IS NULL) then
                        ORDENADO = 0;
                    ORDENC = 0;
                    FOR SELECT O.ORDC_ID, OCDE_ITEM, OCDE_CANT * OCDE_FACTOR
                        FROM ORDENES_COMPRA O, ORDENES_COMPRA_DETALLE OD
                        WHERE O.ORDC_ID = OD.ORDC_ID AND OD.ARTI_COD = :CODIGO AND ORDC_VENCE >= :FECHA AND ORDC_FECHA <= :FECHA AND OCDE_ANULADO = 'N'
                        INTO :ID, :ITEM, :CANT2
                        do
                        BEGIN
                        EXECUTE PROCEDURE FALTANTE(23, 21, ID, ITEM) returning_values (PEDIDO, UND, FACTOR);
                        if (PEDIDO * FACTOR = CANT2) then /* SI NO SE HA FACTURADO MIRE A VER SI SE REMISIONO */
                            EXECUTE PROCEDURE FALTANTE(23, 22, ID, ITEM) returning_values (PEDIDO, UND, FACTOR);
                        if (PEDIDO IS NULL) then
                            PEDIDO = 0;
                        ORDENC = ORDENC + PEDIDO * FACTOR;
                        END
                    ORDENADO = ORDENADO + ORDENC;
                    SELECT SUM(RSDE_LIBERAR)
                        FROM RESERVAS_DETALLE RD, RESERVAS R
                        WHERE R.RESE_ID = RD.RESE_ID AND ARTI_COD = :CODIGO AND RESE_FECHA <= :FECHA AND RESE_VENCE >= :FECHA AND RSDE_ANULADO = 'N'
                        INTO :RESERVADO;
                    if (RESERVADO IS NULL) then
                        RESERVADO = 0;
                    PEDIDO = 0;
                    FOR SELECT P.PEDI_ID, PEDE_ITEM, PEDE_CANT * PEDE_FACTOR
                        FROM PEDIDOS P, PEDIDOS_DETALLE PD
                        WHERE P.PEDI_ID = PD.PEDI_ID AND PD.ARTI_COD = :CODIGO AND PEDI_VENCE >= :FECHA AND PEDI_FECHA <= :FECHA AND PEDE_ANULADO = 'N'
                        INTO :ID, :ITEM, :CANT2
                        do
                        BEGIN
                        EXECUTE PROCEDURE FALTANTE(34, 31, ID, ITEM) returning_values (ORDENC, UND, FACTOR);
                        if ((ORDENC * FACTOR = CANT2) or (PEDAUTO = 'SI')) then /* SI NO SE HA FACTURADO MIRE A VER SI SE REMISIONO */
                            EXECUTE PROCEDURE FALTANTE(34, 32, ID, ITEM) returning_values (ORDENC, UND, FACTOR);
                        if (ORDENC IS NULL) then
                            ORDENC = 0;
                        PEDIDO = PEDIDO + ORDENC * FACTOR;
                        END
                    RESERVADO = RESERVADO + PEDIDO;
                    END
                ELSE
                    BEGIN
                    RESERVADO = 0;
                    ORDENADO = 0;
                    END
                if (LISTA > 0) then
                    SELECT prar_fijo FROM precios_articulo WHERE arti_cod = :CODIGO and lipr_cod = :LISTA INTO :PRECIO;
                if (ENPESO = 'S') then
                    BEGIN
                    if (pesounit IS NULL) then
                        pesounit = 0;
                    if (PESOUNIT <> 0) then
                        BEGIN
                        pesototal = PESOUNIT * cant;
                        SUSPEND;
                        END
                    END
                ELSE
                    SUSPEND;
                END
            END
        END
  end
if (DETALLE = 'N') then
  BEGIN
  FOR SELECT ARTI_COD, ARTI_DES, ARTI_UNIDAD, ARTI_EXIST, TAIV_PORC, A.GRUP_COD, A.SUBG_COD, A.MARC_COD, ARTI_CONSUMO, ARTI_PESO/1000
      FROM ARTICULO A, TARIFA_IVA T
      WHERE ARTI_COD >= :CODINI AND ARTI_COD <= :CODFIN AND ARTI_DES >= :DESINI AND ARTI_DES <= :DESFIN AND ESAR_COD <> 'I' AND A.TAIV_COD = T.TAIV_COD
      INTO :CODIGO, :NOMBRE, :UNIDAD, :EXIST, :IVA, :CODGRUPO, :CODSUBG, :CODMARC, :CONSUMO, :pesounit
      DO
        BEGIN
        OK = 'N';
        if (AGRUPA = 'G') then
            BEGIN
            if ((GRPINI = '0') AND (GRPFIN = 'zz')) then
                OK = 'S';
            else
                if ((CODGRUPO >= GRPINI) AND (CODGRUPO <= GRPFIN)) then
                    OK = 'S';
            end
        ELSE
            if (AGRUPA = 'M') then
                BEGIN
                if ((GRPINI = '0') AND (GRPFIN = 'zzz')) then
                    OK = 'S';
                else
                    if ((CODMARC >= GRPINI) AND (CODMARC <= GRPFIN)) then
                        OK = 'S';
                END
        if (OK = 'S') then
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            SELECT MAX(COBA_COD) FROM BARRAS_ARTICULO WHERE ARTI_COD = :codigo AND COBA_UNIDAD = :unidad INTO :codbar;
            if (CODBAR IS NULL) then
                CODBAR = CODIGO;

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

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

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE INVENTARIO_FAMILIA(
    FECHA DATE,
    FAMILIA VARCHAR(20))
RETURNS (
    ARTICULO VARCHAR(20),
    INTERNO VARCHAR(20),
    DESCRIPCION VARCHAR(60),
    CANTIDAD NUMERIC(18,2),
    UNIDAD VARCHAR(8),
    TOTAL NUMERIC(18,2))
AS
declare variable COSTO NUMERIC(18,4);
begin
FOR SELECT A.ARTI_COD, ARTI_DES, ARTI_UNIDAD, p.pvar_cod FROM ARTICULO A, PROVEEDOR_ARTICULO P
    WHERE ESAR_COD <> 'I' AND A.arti_cod = P.arti_cod AND P.terc_nit = :FAMILIA
    INTO :ARTICULO, :descripcion, :UNIDAD, :INTERNO
    DO
    BEGIN
    EXECUTE PROCEDURE SALDO_INICIAL_TOTAL_INV(ARTICULO, FECHA) returning_values (cantidad);
    EXECUTE PROCEDURE COSTO_PROMEDIO_UNIDAD(ARTICULO, FECHA, UNIDAD) returning_values (COSTO);
    TOTAL = COSTO * CANTIDAD;
    suspend;
    END
end

^

SET TERM ; ^

SET TERM ^ ;

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

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE DEVOLUCIONES_SIN_CONTABILIDAD(
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    ID INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    ESTADO VARCHAR(20),
    IDI INTEGER,
    IDC INTEGER)
AS
DECLARE VARIABLE VER CHAR(2);
declare variable FECICNT VARCHAR(10);
declare variable FECFCNT VARCHAR(10);
declare variable ERROR INTEGER;
declare variable idref INTEGER;
BEGIN
EXECUTE PROCEDURE fecha_a_conta(FECINI) returning_values (FECICNT);
EXECUTE PROCEDURE fecha_a_conta(FECFIN) returning_values (FECFCNT);
FOR SELECT DEVT_ID, PREF_PRE, DEVT_NUMERO FROM devoluciones_ventas WHERE DEVT_ANULADO = 'N' AND
    DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN
    INTO :ID, :PREF, :NUMERO
DO
  BEGIN
  idref = null;
  SELECT ENCO_IDREF FROM COMPROBANTE_ENCABEZADO WHERE ENCO_TIPOREF = 33 AND ENCO_FECHA >= :FECICNT AND ENCO_FECHA <= :FECFCNT and ENCO_IDREF = :id into :idref;
  if (idref IS NULL) then
  begin
   ESTADO = 'PROCESANDO';
   SUSPEND;
   SELECT MAX(INVE_ID) FROM INTERFAZ_VENTAS WHERE PREF_PRE = :PREF AND TIDO_COD = 33 INTO :IDI;
   EXECUTE PROCEDURE contabil_devolcli (:ID, :IDI) RETURNING_VALUES (:ERROR, :VER, :IDC);
   if (ERROR = 0) then
    BEGIN
    EXECUTE PROCEDURE CONTABILIZA_PENDIENTE (:IDC);
    ESTADO = 'OK';
    END
   ELSE
    ESTADO = 'ERROR';
   suspend;
  End
  END
END

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE FACTURAS_SIN_CONTABILIDAD(
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    ID INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    ESTADO VARCHAR(20),
    IDI INTEGER,
    IDC INTEGER)
AS
DECLARE VARIABLE VER CHAR(2);
declare variable FECICNT VARCHAR(10);
declare variable FECFCNT VARCHAR(10);
declare variable ERROR INTEGER;
declare variable idref INTEGER;
BEGIN
EXECUTE PROCEDURE fecha_a_conta(FECINI) returning_values (FECICNT);
EXECUTE PROCEDURE fecha_a_conta(FECFIN) returning_values (FECFCNT);
FOR SELECT FACT_ID, PREF_PRE, FACT_NUMERO FROM FACTURAS WHERE FACT_ANULADO = 'N' AND
    FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN INTO :ID, :PREF, :NUMERO
DO
  BEGIN
  idref = null;
  SELECT ENCO_IDREF FROM COMPROBANTE_ENCABEZADO WHERE ENCO_TIPOREF = 31 AND ENCO_FECHA >= :FECICNT AND ENCO_FECHA <= :FECFCNT and ENCO_IDREF = :ID into :idref;
  if (idref IS NULL) then
  begin
   ESTADO = 'PROCESANDO';
   ERROR = NULL;
   SUSPEND;
   SELECT MAX(INVE_ID) FROM INTERFAZ_VENTAS WHERE PREF_PRE = :PREF AND TIDO_COD = 31 INTO :IDI;
   EXECUTE PROCEDURE CONTABIL_FACTURA (:ID, :IDI) RETURNING_VALUES (:ERROR, VER, :IDC);
   if ((ERROR = 0) or (error IS NULL)) then
    BEGIN
    EXECUTE PROCEDURE CONTABILIZA_PENDIENTE (:IDC);
    ESTADO = 'OK';
    END
   ELSE
    ESTADO = 'ERROR';
   suspend;
  end
  END
END

^

SET TERM ; ^

SET TERM ^ ;

ALTER TRIGGER AJUSTES_DETALLE_AI
AS
declare variable fec date;
declare variable CONC VARCHAR(60);
declare variable Pref varchar(4);
declare variable Num varchar(6);
declare variable CANTAJ numeric(18,4);
declare variable COSTO NUMERIC(18,2);
declare variable factor numeric(18,4);
declare variable NOAJUSTAR CHAR(1);
BEGIN
  if ((NEW.AJUS_ID <> 0) and (new.ajde_anulado = 'N')) then
    BEGIN
    select AJUS_fecha, AJUS_conc, AJUS_NUMERO, PREF_PRE, AJUS_NOAJUSTAR
        from AJUSTES where AJUS_id = new.AJUS_id into :fec, :conc, :Num, :Pref, :noajustar;
    if (noajustar = 'N') then
        begin
        execute procedure factor_unidad_cant(new.arti_cod, new.ajus_unidad) returning_values(factor);
        CANTAJ = NEW.ajus_exant - (NEW.ajus_exnue * :factor);
        /* CUANDO CAMBIA LA EXISTENCIA REGISTRE EL MOV. */

        if (CANTAJ > 0) then
          BEGIN
          /* ES UNA SALIDA */
          INSERT INTO MOVIMIENTO_ARTICULO
            (ARTI_COD, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM)
            VALUES(NEW.ARTI_COD, NEW.BODE_COD, :FEC, 14, NEW.AJUS_id,
            :CONC, :cantaj, 0, 'N', NEW.ajus_lote, :Pref, :Num, NEW.ajus_item);
          END
        ELSE
          BEGIN
          /* ES UNA ENTRADA */
          EXECUTE PROCEDURE costo_promedio(NEW.arti_cod, :FEC) returning_values (:COSTO);
          INSERT INTO MOVIMIENTO_ARTICULO
            (ARTI_COD, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM)
            VALUES(NEW.ARTI_COD, NEW.BODE_COD, :FEC, 14, NEW.AJUS_id,
            :CONC, abs(:cantaj), :COSTO, 'S', NEW.ajus_lote, :Pref, :Num, NEW.ajus_item);
          END
        end
    END
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER TRIGGER AJUSTES_DETALLE_AU
as
declare variable fec date;
declare variable CONC VARCHAR(60);
declare variable cantaj numeric(18,4);
declare variable Pref varchar(4);
declare variable Num varchar(6);
declare variable COSTO NUMERIC(18,2);
declare variable factor numeric(18,4);
declare variable NOAJUSTAR CHAR(1);
BEGIN
if ((old.ajus_id <> 0) and (old.ajde_anulado = 'N')) then
    DELETE FROM MOVIMIENTO_ARTICULO WHERE (mvar_tipodoc = 14) and (mvar_idref = new.ajus_id) and (mvar_item = new.ajus_item);
if ((NEW.AJUS_id <> 0) and (NEW.ajde_anulado = 'N')) then
    begin
    select AJUS_fecha, AJUS_conc, AJUS_NUMERO, PREF_PRE, AJUS_NOAJUSTAR
        from AJUSTES where AJUS_id = new.AJUS_id into :fec, :conc, :Num, :Pref, :NOAJUSTAR;
    if (NOAJUSTAR = 'N') then
        BEGIN
        execute procedure factor_unidad_cant(new.arti_cod, new.ajus_unidad) returning_values(factor);
        CANTAJ = NEW.ajus_exant - (NEW.ajus_exnue * :factor);
        /* CUANDO CAMBIA LA EXISTENCIA REGISTRE EL MOV. */
        if (CANTAJ > 0) then
            BEGIN
            /* ES UNA SALIDA */
            INSERT INTO MOVIMIENTO_ARTICULO
                (ARTI_COD, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM)
                VALUES(NEW.ARTI_COD, NEW.BODE_COD, :FEC, 14, NEW.AJUS_id,
                :CONC, :cantaj, 0, 'N', NEW.ajus_lote, :Pref, :Num, new.ajus_item);
            END
        ELSE
            BEGIN
            /* ES UNA ENTRADA */
            EXECUTE PROCEDURE costo_promedio(NEW.arti_cod, :FEC) returning_values (:COSTO);
            INSERT INTO MOVIMIENTO_ARTICULO
                (ARTI_COD, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM)
                VALUES(NEW.ARTI_COD, NEW.BODE_COD, :FEC, 14, NEW.AJUS_id,
                :CONC, abs(:cantaj), :costo, 'S', NEW.ajus_lote, :Pref, :Num, new.ajus_item);
            END
        END
    END
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER TRIGGER DESENSAMBLES_DETALLE_AI
AS
declare variable fec date;
declare variable CONC VARCHAR(60);
declare variable factor numeric(18,4);
declare variable COSTO numeric(18,2);
declare variable Pref varchar(4);
declare variable Num varchar(6);
declare variable CANT NUMERIC(18,2);
declare variable CANTOT CHAR(2);
BEGIN
  if ((NEW.DESE_id <> 0) and (new.dede_anulado = 'N')) then
    begin
    select dese_fecha, dese_conc, pref_pre, dese_numero, dese_cant * dese_factor
        from desensambles where dese_id = new.dese_id into :fec, :conc, :Pref, :Num, :CANT;
    execute procedure factor_unidad_cant(new.arti_cod, new.dede_unidad) returning_values(factor);
    execute procedure costo_promedio(new.arti_cod, :FEC) returning_values (:COSTO);
    EXECUTE PROCEDURE LEE_CONFIGURACION('INVENTARIO', 'ENSAMBLES', 'FORMACIONES CON CANTIDADES TOTALES') returning_values (:CANTOT);
    if (CANTOT <> 'SI') then
        CANT = CANT * factor * new.dede_cant;
    ELSE
        CANT = factor * new.dede_cant;
    INSERT INTO MOVIMIENTO_ARTICULO
      (ARTI_COD, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM)
      VALUES(NEW.ARTI_COD, NEW.BODE_COD, :FEC, 16, NEW.dese_id,
      :CONC, :CANT, :COSTO, 'S', new.dede_lote, :Pref, :Num, new.dese_item);

    /* RECORRA LAS LISTAS DE PRECIOS Y CAMBIE EL PRECIO */
    EXECUTE PROCEDURE CALCULA_PRECIOS(NEW.ARTI_COD, :fec);
    END
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER TRIGGER DESENSAMBLES_DETALLE_AU
AS
declare variable fec date;
declare variable CONC VARCHAR(60);
declare variable Pref varchar(4);
declare variable Num varchar(6);
declare variable factor numeric(18,4);
declare variable COSTO numeric(18,2);
declare variable CANT NUMERIC(18,2);
declare variable CANTOT CHAR(2);
BEGIN
/* Anule el anterior */
if ((OLD.DESE_ID <> 0) AND (OLD.dede_anulado = 'N')) then
    delete from movimiento_articulo where (mvar_tipodoc = 16) and (mvar_idref = old.DESE_id) and (mvar_item = old.dese_item);
if ((NEW.dese_id <> 0) AND (new.dede_anulado = 'N')) then
    BEGIN
    EXECUTE PROCEDURE LEE_CONFIGURACION('INVENTARIO', 'ENSAMBLES', 'FORMACIONES CON CANTIDADES TOTALES') returning_values (:CANTOT);
    select dese_fecha, dese_conc, pref_pre, dese_numero, dese_cant * dese_factor
        from desensambles where dese_id = new.dese_id into :fec, :conc, :Pref, :Num, :CANT;
    execute procedure factor_unidad_cant(new.arti_cod, new.dede_unidad) returning_values(factor);
    execute procedure costo_promedio(new.arti_cod, :FEC) returning_values (:COSTO);
    if (CANTOT <> 'SI') then
        CANT = CANT * factor * new.dede_cant;
    ELSE
        CANT = factor * new.dede_cant;
    INSERT INTO MOVIMIENTO_ARTICULO
        (ARTI_COD, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM)
        VALUES(NEW.ARTI_COD, NEW.BODE_COD, :FEC, 16, NEW.dese_id,
        :CONC, :CANT, :COSTO, 'S', new.dede_lote, :Pref, :Num, new.dese_item);

    /* RECORRA LAS LISTAS DE PRECIOS Y CAMBIE EL PRECIO */
    EXECUTE PROCEDURE CALCULA_PRECIOS(NEW.ARTI_COD, :fec);
    END
END
^

SET TERM ; ^

SET TERM ^ ;

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

SET TERM ; ^

SET TERM ^ ;

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

SET TERM ; ^

SET TERM ^ ;

ALTER TRIGGER NOTAS_CREDITO_PROVEEDOR_AI
AS
declare variable COSTO NUMERIC(18,2);
declare variable EXISTENCIA NUMERIC(18,4);
declare variable CODBOD VARCHAR(3);
BEGIN
if ((NEW.NCPR_ID <> 0) and (new.ncpr_anulado = 'N')) then
    BEGIN
    /* Registre el nuevo saldo del documento */
    INSERT INTO SALDOS_DOC_CXPAGAR (SDCP_TIPOREF, SDCP_IDREF, SDCP_FECHA, TERC_NIT, SDCP_RTEFTE, SDCP_RTIVA, SDCP_RTICA, SDCP_ABONO, SDCP_ABRTFTE, SDCP_ABRTIVA, SDCP_ABRTICA, SDCP_DEBITO, SDCP_MONTO, SDCP_TRM)
        VALUES (52, NEW.NCPR_ID, NEW.ncpr_fecha, NEW.terc_nit, (NEW.ncpr_rtftemonto * -1), (NEW.ncpr_rtivamonto * -1), (NEW.ncpr_rticamonto * -1), 0, 0, 0, 0, 'N', (NEW.ncpr_monto+NEW.ncpr_ivamonto)*-1, NEW.ncpr_trm);
    /* Registre el movimiento del proveedor */
    INSERT INTO MOVIMIENTO_PROVEEDOR (MVPR_ID, TERC_NIT, MVPR_TIPOREF, MVPR_IDREF, MVPR_FECHA, MVPR_VENCE, MVPR_CONC, MVPR_MONTO, MVPR_RTFTE, MVPR_RTIVA, MVPR_RTICA, MVPR_DEBITO, MVPR_ABONO, MVPR_PREFIJO, MVPR_NUMERO, MVPR_TRM)
      VALUES (GEN_ID(ID_MOVPROV, 1), NEW.TERC_NIT, 52, NEW.NCPR_ID, NEW.NCPR_FECHA, NEW.NCPR_FECHA, NEW.NCPR_CONC, NEW.NCPR_MONTO+NEW.NCPR_IVAMONTO, NEW.NCPR_RTFTEMONTO, NEW.NCPR_RTIVAMONTO, NEW.NCPR_RTICAMONTO, 'N', 'N', NEW.pref_pre, NEW.ncpr_numero, NEW.ncpr_trm);
    /* afecte el articulo */
    if (new.arti_cod <> '') then
        begin
        /* CALCULE EL NUEVO COSTO */
        execute procedure costo_promedio (new.arti_cod, new.ncpr_fecha) returning_values (:COSTO);
        execute procedure saldo_total_inventario (new.arti_cod, new.ncpr_fecha) returning_values (:EXISTENCIA);
        COSTO = ((COSTO * EXISTENCIA) - NEW.ncpr_monto) / EXISTENCIA;
        FOR SELECT DISTINCT BODE_COD FROM EXISTENCIA WHERE ARTI_COD = NEW.ARTI_COD INTO :CODBOD do
            BEGIN
            execute procedure saldo_inventario (new.arti_cod, :CODBOD, new.ncpr_fecha) returning_values (:EXISTENCIA);
            if (EXISTENCIA <> 0) then
                BEGIN
                /* SAQUE TODO LO QUE TENGA */
                INSERT INTO MOVIMIENTO_ARTICULO
                  (ARTI_COD, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM, TERC_NIT)
                  VALUES(NEW.ARTI_COD, :CODBOD, new.ncpr_fecha, 52, NEW.ncpr_id,
                  new.ncpr_conc, :EXISTENCIA, 0, 'N', '', new.pref_pre, new.ncpr_numero, 1, new.terc_nit);
                END
            END
        FOR SELECT DISTINCT BODE_COD, MVAR_CANT FROM MOVIMIENTO_ARTICULO WHERE MVAR_TIPODOC = 52 AND MVAR_IDREF = NEW.ncpr_id
            INTO :CODBOD, :existencia do
            BEGIN
            /* META TODO CON EL NUEVO COSTO */
            INSERT INTO MOVIMIENTO_ARTICULO
              (ARTI_COD, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM, TERC_NIT)
              VALUES(NEW.ARTI_COD, :CODBOD, new.ncpr_fecha, 52, NEW.ncpr_id,
              new.ncpr_conc, :EXISTENCIA, :COSTO, 'S', '', new.pref_pre, new.ncpr_numero, 1, new.terc_nit);
            END
        /* RECORRA LAS LISTAS DE PRECIOS Y CAMBIE EL PRECIO */
        EXECUTE PROCEDURE CALCULA_PRECIOS(NEW.ARTI_COD, new.ncpr_fecha);
        end
    INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
        VALUES (USER, 52, NEW.ncpr_id, 'I', NEW.pref_pre || NEW.ncpr_numero);
    END
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER TRIGGER NOTAS_CREDITO_PROVEEDOR_AU
AS
declare variable ABONOS char(1);
declare variable consec INTEGER;
declare variable COSTO NUMERIC(18,2);
declare variable EXISTENCIA NUMERIC(18,4);
declare variable CODBOD VARCHAR(3);
BEGIN
if (new.ncpr_anulado = 'S') then
    begin
    select enco_consec from comprobante_encabezado where enco_tiporef = 52 and enco_idref = old.ncpr_id into :consec;
    if (NOT consec is null) then
      delete from comprobante_detalle where enco_consec = :consec;
    delete from comprobante_encabezado where enco_tiporef = 52 and enco_idref = old.ncpr_id;
    INSERT INTO AUDITORIA (AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
        VALUES (USER, 52, new.ncpr_id, 'A', NEW.pref_pre || NEW.ncpr_numero);
    end

/* BORRE EL REGISTRO PREVIO */
if ((old.ncpr_id <> 0) and (old.ncpr_anulado = 'N')) then
    begin
    /* Verifique si habia abonos a la nota */
    ABONOS = 'N';
    select 'S' FROM SALDOS_DOC_CXPAGAR WHERE SDCP_TIPOREF = 52 AND SDCP_IDREF = OLD.NCPR_ID AND SDCP_ABONO <> 0 INTO :ABONOS;
    if (ABONOS = 'N') then
        BEGIN
        /* BORRE EL REGISTRO PREVIO */
        delete from saldos_doc_cxpagar where sdcp_tiporef = 52 and sdcp_idref = old.ncpr_id;
        delete from movimiento_PROVEEDOR where (mvpr_tiporef = 52) and (mvpr_idref = old.ncpr_id);
        delete from movimiento_articulo where  (mvar_tipodoc = 52) and (mvar_idref = old.ncpr_id);
        END
    else
        exception DOCUMENTO_CON_ABONOS 'El descuento de proveedor ' || old.pref_pre || old.ncpr_numero || ' tiene abonos registrados.';
    end
if ((new.ncpr_id <> 0) and (new.ncpr_anulado = 'N')) then
    begin
    /* Registre el nuevo saldo del documento */
    INSERT INTO SALDOS_DOC_CXPAGAR (SDCP_TIPOREF, SDCP_IDREF, SDCP_FECHA, TERC_NIT, SDCP_RTEFTE, SDCP_RTIVA, SDCP_RTICA, SDCP_ABONO, SDCP_ABRTFTE, SDCP_ABRTIVA, SDCP_ABRTICA, SDCP_DEBITO, SDCP_MONTO, SDCP_TRM)
        VALUES (52, NEW.NCPR_ID, NEW.ncpr_fecha, NEW.terc_nit, (NEW.ncpr_rtftemonto * -1), (NEW.ncpr_rtivamonto * -1), (NEW.ncpr_rticamonto * -1), 0, 0, 0, 0, 'N', (NEW.ncpr_monto+NEW.ncpr_ivamonto)*-1, NEW.ncpr_trm);
    /* Registre el movimiento del proveedor */
    INSERT INTO MOVIMIENTO_PROVEEDOR (MVPR_ID, TERC_NIT, MVPR_TIPOREF, MVPR_IDREF, MVPR_FECHA, MVPR_VENCE, MVPR_CONC, MVPR_MONTO, MVPR_RTFTE, MVPR_RTIVA, MVPR_RTICA, MVPR_DEBITO, MVPR_ABONO, MVPR_PREFIJO, MVPR_NUMERO, MVPR_TRM)
        VALUES (GEN_ID(ID_MOVPROV, 1), NEW.TERC_NIT, 52, NEW.NCPR_ID, NEW.NCPR_FECHA, NEW.NCPR_FECHA, NEW.NCPR_CONC, NEW.NCPR_MONTO+NEW.ncpr_ivamonto, NEW.NCPR_RTFTEMONTO, NEW.NCPR_RTIVAMONTO, NEW.NCPR_RTICAMONTO, 'N', 'N', NEW.pref_pre, NEW.ncpr_numero, NEW.ncpr_trm);
    /* afecte el articulo */
    if (new.arti_cod <> '') then
        begin
        /* CALCULE EL NUEVO COSTO */
        execute procedure costo_promedio (new.arti_cod, new.ncpr_fecha) returning_values (:COSTO);
        execute procedure saldo_total_inventario (new.arti_cod, new.ncpr_fecha) returning_values (:EXISTENCIA);
        COSTO = ((COSTO * EXISTENCIA) - NEW.ncpr_monto) / EXISTENCIA;
        FOR SELECT DISTINCT BODE_COD FROM EXISTENCIA WHERE ARTI_COD = NEW.ARTI_COD INTO :CODBOD do
            BEGIN
            execute procedure saldo_inventario (new.arti_cod, :CODBOD, new.ncpr_fecha) returning_values (:EXISTENCIA);
            if (EXISTENCIA <> 0) then
                BEGIN
                /* SAQUE TODO LO QUE TENGA */
                INSERT INTO MOVIMIENTO_ARTICULO
                    (ARTI_COD, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM, TERC_NIT)
                    VALUES(NEW.ARTI_COD, :CODBOD, new.ncpr_fecha, 52, NEW.ncpr_id,
                    new.ncpr_conc, :EXISTENCIA, 0, 'N', '', new.pref_pre, new.ncpr_numero, 1, new.terc_nit);
                end
            END
        FOR SELECT DISTINCT BODE_COD, MVAR_CANT FROM MOVIMIENTO_ARTICULO WHERE MVAR_TIPODOC = 52 AND MVAR_IDREF = NEW.ncpr_id
            INTO :CODBOD, :existencia do
            BEGIN
            /* META TODO CON EL NUEVO COSTO */
            INSERT INTO MOVIMIENTO_ARTICULO
                (ARTI_COD, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM, TERC_NIT)
                VALUES(NEW.ARTI_COD, :CODBOD, new.ncpr_fecha, 52, NEW.ncpr_id,
                new.ncpr_conc, :EXISTENCIA, :COSTO, 'S', '', new.pref_pre, new.ncpr_numero, 1, new.terc_nit);
            END
        /* RECORRA LAS LISTAS DE PRECIOS Y CAMBIE EL PRECIO */
        EXECUTE PROCEDURE CALCULA_PRECIOS(NEW.ARTI_COD, new.ncpr_fecha);
        end
    INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
        VALUES (USER, 52, NEW.ncpr_id, 'U', NEW.pref_pre || NEW.ncpr_numero);
    end
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER TRIGGER NOTAS_DEBITO_PROVEEDOR_AI
AS
declare variable COSTO NUMERIC(18,2);
declare variable EXISTENCIA NUMERIC(18,4);
declare variable CODBOD VARCHAR(3);
BEGIN
  if ((NEW.NDPR_ID <> 0) and (new.ndpr_anulado = 'N')) then
    BEGIN
    INSERT INTO SALDOS_DOC_CXPAGAR (SDCP_TIPOREF, SDCP_IDREF, SDCP_FECHA, TERC_NIT, SDCP_RTEFTE, SDCP_RTIVA, SDCP_RTICA, SDCP_ABONO, SDCP_ABRTFTE, SDCP_ABRTIVA, SDCP_ABRTICA, SDCP_DEBITO, SDCP_MONTO, SDCP_TRM)
        VALUES (51, NEW.NDPR_ID, NEW.ndpr_fecha, NEW.terc_nit, NEW.ndpr_rtftemonto, NEW.ndpr_rtivamonto, NEW.ndpr_rticamonto, 0, 0, 0, 0, 'S', NEW.ndpr_monto+NEW.ndpr_ivamonto, NEW.ndpr_trm);
    /* Registre el movimiento del proveedor */
    INSERT INTO MOVIMIENTO_PROVEEDOR (MVPR_ID, TERC_NIT, MVPR_TIPOREF, MVPR_IDREF, MVPR_FECHA, MVPR_VENCE, MVPR_CONC, MVPR_MONTO, MVPR_RTFTE, MVPR_RTIVA, MVPR_RTICA, MVPR_DEBITO, MVPR_ABONO, MVPR_PREFIJO, MVPR_NUMERO, MVPR_TRM)
      VALUES (GEN_ID(ID_MOVPROV, 1), NEW.TERC_NIT, 51, NEW.NDPR_ID, NEW.NDPR_FECHA, NEW.NDPR_VENCE, NEW.NDPR_CONC, NEW.NDPR_MONTO+NEW.ndpr_Ivamonto, NEW.NDPR_RTFTEMONTO, NEW.NDPR_RTIVAMONTO, NEW.NDPR_RTICAMONTO, 'S', 'N', NEW.pref_pre, NEW.ndpr_numero, NEW.ndpr_trm);
    /* afecte el articulo */
    if (new.arti_cod <> '') then
        begin
        /* CALCULE EL NUEVO COSTO */
        execute procedure costo_promedio (new.arti_cod, new.ndpr_fecha) returning_values (:COSTO);
        execute procedure saldo_total_inventario (new.arti_cod, new.ndpr_fecha) returning_values (:EXISTENCIA);
        COSTO = (COSTO * EXISTENCIA + (NEW.ndpr_monto)) / EXISTENCIA;
        FOR SELECT DISTINCT BODE_COD FROM EXISTENCIA WHERE ARTI_COD = NEW.ARTI_COD INTO :CODBOD do
            BEGIN
            execute procedure saldo_inventario (new.arti_cod, :CODBOD, new.ndpr_fecha) returning_values (:EXISTENCIA);
            if (existencia <> 0) then
                BEGIN
                /* SAQUE TODO LO QUE TENGA */
                INSERT INTO MOVIMIENTO_ARTICULO
                  (ARTI_COD, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM, TERC_NIT)
                  VALUES(NEW.ARTI_COD, :CODBOD, new.ndpr_fecha, 51, NEW.ndpr_id,
                  new.ndpr_conc, :EXISTENCIA, 0, 'N', '', new.pref_pre, new.ndpr_numero, 1, new.terc_nit);
                END
            END
        FOR SELECT DISTINCT BODE_COD, MVAR_CANT FROM MOVIMIENTO_ARTICULO WHERE MVAR_TIPODOC = 51 AND MVAR_IDREF = NEW.ndpr_id
            INTO :CODBOD, :existencia do
            BEGIN
            /* META TODO CON EL NUEVO COSTO */
            INSERT INTO MOVIMIENTO_ARTICULO
              (ARTI_COD, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM, TERC_NIT)
              VALUES(NEW.ARTI_COD, :CODBOD, new.ndpr_fecha, 51, NEW.ndpr_id,
              new.ndpr_conc, :EXISTENCIA, :COSTO, 'S', '', new.pref_pre, new.ndpr_numero, 1, new.terc_nit);
            END
        /* RECORRA LAS LISTAS DE PRECIOS Y CAMBIE EL PRECIO */
        EXECUTE PROCEDURE CALCULA_PRECIOS(NEW.ARTI_COD, new.ndpr_fecha);
        end
    INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
        VALUES (USER, 51, NEW.ndpr_id, 'I', NEW.pref_pre || NEW.ndpr_numero);
    END
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER TRIGGER NOTAS_DEBITO_PROVEEDOR_AU
AS
declare variable ABONOS char(1);
declare variable consec INTEGER;
declare variable COSTO NUMERIC(18,2);
declare variable EXISTENCIA NUMERIC(18,4);
declare variable CODBOD VARCHAR(3);
BEGIN
if (new.ndpr_anulado = 'S') then
    begin
    select enco_consec from comprobante_encabezado where enco_tiporef = 51 and enco_idref = old.ndpr_id into :consec;
    if (NOT consec is null) then
      delete from comprobante_detalle where enco_consec = :consec;
    delete from comprobante_encabezado where enco_tiporef = 51 and enco_idref = old.ndpr_id;
    INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
        VALUES (USER, 51, NEW.ndpr_id, 'A', NEW.pref_pre || NEW.ndpr_numero);
    end

/* BORRE EL REGISTRO PREVIO */
if ((old.ndpr_id <> 0) and (old.ndpr_anulado = 'N')) then
    begin
    /* Verifique si habia abonos a la nota */
    ABONOS = 'N';
    select 'S' FROM SALDOS_DOC_CXPAGAR WHERE SDCP_TIPOREF = 51 AND SDCP_IDREF = OLD.NDPR_ID AND SDCP_ABONO <> 0 INTO :ABONOS;
    if (ABONOS = 'N') then
        BEGIN
        /* BORRE EL REGISTRO PREVIO */
        delete from saldos_doc_cxpagar where sdcp_tiporef = 51 and sdcp_idref = old.ndpr_id;
        delete from movimiento_PROVEEDOR where (mvpr_tiporef = 51) and (mvpr_idref = old.ndpr_id);
        delete from movimiento_articulo where  (mvar_tipodoc = 51) and (mvar_idref = old.ndpr_id);
        END
    else
        exception DOCUMENTO_CON_ABONOS 'El cargo de proveedor ' || old.pref_pre || old.ndpr_numero || ' tiene abonos registrados.';
    end
if ((new.ndpr_id <> 0) and (new.ndpr_anulado = 'N')) then
    begin
    /* Registre el nuevo saldo del documento */
    INSERT INTO SALDOS_DOC_CXPAGAR (SDCP_TIPOREF, SDCP_IDREF, SDCP_FECHA, TERC_NIT, SDCP_RTEFTE, SDCP_RTIVA, SDCP_RTICA, SDCP_ABONO, SDCP_ABRTFTE, SDCP_ABRTIVA, SDCP_ABRTICA, SDCP_DEBITO, SDCP_MONTO, SDCP_TRM)
        VALUES (51, NEW.NDPR_ID, NEW.ndpr_fecha, NEW.terc_nit, NEW.ndpr_rtftemonto, NEW.ndpr_rtivamonto, NEW.ndpr_rticamonto, 0, 0, 0, 0, 'N', NEW.ndpr_monto+NEW.ndpr_ivamonto, NEW.ndpr_trm);
    /* Registre el movimiento del proveedor */
    INSERT INTO MOVIMIENTO_PROVEEDOR (MVPR_ID, TERC_NIT, MVPR_TIPOREF, MVPR_IDREF, MVPR_FECHA, MVPR_VENCE, MVPR_CONC, MVPR_MONTO, MVPR_RTFTE, MVPR_RTIVA, MVPR_RTICA, MVPR_DEBITO, MVPR_ABONO, MVPR_PREFIJO, MVPR_NUMERO, MVPR_TRM)
        VALUES (GEN_ID(ID_MOVPROV, 1), NEW.TERC_NIT, 51, NEW.NDPR_ID, NEW.NDPR_FECHA, NEW.ndpr_vence, NEW.NDPR_CONC, NEW.NDPR_MONTO+NEW.ndpr_ivamonto, NEW.NDPR_RTFTEMONTO, NEW.NDPR_RTIVAMONTO, NEW.NDPR_RTICAMONTO, 'S', 'N', NEW.pref_pre, NEW.ndpr_numero, NEW.ndpr_trm);
    if (new.arti_cod <> '') then
        begin
        /* CALCULE EL NUEVO COSTO */
        execute procedure costo_promedio (new.arti_cod, new.ndpr_fecha) returning_values (:COSTO);
        execute procedure saldo_total_inventario (new.arti_cod, new.ndpr_fecha) returning_values (:EXISTENCIA);
        COSTO = (COSTO * EXISTENCIA + (NEW.ndpr_monto)) / EXISTENCIA;
        FOR SELECT DISTINCT BODE_COD FROM EXISTENCIA WHERE ARTI_COD = NEW.ARTI_COD INTO :CODBOD do
            BEGIN
            execute procedure saldo_inventario (new.arti_cod, :CODBOD, new.ndpr_fecha) returning_values (:EXISTENCIA);
            if (existencia <> 0) then
                BEGIN
                /* SAQUE TODO LO QUE TENGA */
                INSERT INTO MOVIMIENTO_ARTICULO
                  (ARTI_COD, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM, TERC_NIT)
                  VALUES(NEW.ARTI_COD, :CODBOD, new.ndpr_fecha, 51, NEW.ndpr_id,
                  new.ndpr_conc, :EXISTENCIA, 0, 'N', '', new.pref_pre, new.ndpr_numero, 1, new.terc_nit);
                END
            END
        FOR SELECT DISTINCT BODE_COD, MVAR_CANT FROM MOVIMIENTO_ARTICULO WHERE MVAR_TIPODOC = 51 AND MVAR_IDREF = NEW.ndpr_id
            INTO :CODBOD, :existencia do
            BEGIN
            /* META TODO CON EL NUEVO COSTO */
            INSERT INTO MOVIMIENTO_ARTICULO
              (ARTI_COD, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM, TERC_NIT)
              VALUES(NEW.ARTI_COD, :CODBOD, new.ndpr_fecha, 51, NEW.ndpr_id,
              new.ndpr_conc, :EXISTENCIA, :COSTO, 'S', '', new.pref_pre, new.ndpr_numero, 1, new.terc_nit);
            END
        /* RECORRA LAS LISTAS DE PRECIOS Y CAMBIE EL PRECIO */
        EXECUTE PROCEDURE CALCULA_PRECIOS(NEW.ARTI_COD, new.ndpr_fecha);
        end
    INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
        VALUES (USER, 51, NEW.ndpr_id, 'U', NEW.pref_pre || NEW.ndpr_numero);
    end
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER TRIGGER REMISION_PROVEEDOR_DET_AI
AS
declare variable fec date;
declare variable CONC VARCHAR(60);
declare variable factor numeric(18,4);
declare variable Pref varchar(4);
declare variable Num varchar(6);
declare variable EXISTE CHAR(1);
declare variable NIT VARCHAR(20);
declare variable NUMPROV VARCHAR(20);
declare variable Tipo Integer;
declare variable idfact integer;
declare variable numrows integer;
declare variable IVAINC CHAR(2);
declare variable ICOINC CHAR(2);
declare variable COSTO NUMERIC(18,2);
declare variable CANTREL NUMERIC(18,4);
declare variable NUMPED VARCHAR(30);
declare variable CONSO CHAR(2);
declare variable CONSOLIDA INTEGER;
declare variable DTOPIE NUMERIC(18,2);
declare variable ADICIONAL NUMERIC(18,2);
declare variable TOTAL NUMERIC(18,2);
declare variable IVAMONTO NUMERIC(18,2);
declare variable EXTRA NUMERIC(18,2);
declare variable FACT NUMERIC(18,4);
declare variable MENORV CHAR(2);
declare variable CEROS CHAR(2);
declare variable ACTREM CHAR(2);
BEGIN
  if ((NEW.repr_id <> 0) and (new.rpvd_anulado = 'N')) then
    BEGIN
    select max(rprd_tiporel), max(rprd_idrel) from remision_proveedor_docrela
        where repr_id = new.repr_id into :Tipo, :idfact;
    if (Tipo is null) then
        Tipo = 0;
    /* si se hizo con base en una factura que afecto el inventario no afecte inventario */
    numrows = 0;
    if (Tipo = 21) Then
        select count(*) from movimiento_articulo where mvar_tipodoc = 21 and mvar_idref = :idfact into :numrows;
    if (numrows is null) then
        numrows = 0;
    if (numrows = 0) then
        begin
        select repr_fecha, pref_pre, repr_numero, REPR_IMPTOS, terc_nit, REPR_NUMPROV, REPR_ORDEN, REPR_CONSOLIDA, repr_dtomonto, repr_adicional, repr_total, repr_ivamonto, repr_extra
            from remision_proveedor where repr_id = new.repr_id
            into :fec, :Pref, :Num, :IVAINC, :NIT, :NUMPROV, :numped, :CONSOLIDA, :dtopie, :adicional, :total, :ivamonto, :extra;
        execute procedure factor_unidad_cant(new.arti_cod, new.rpvd_unidad) returning_values(factor);
        CONC = 'REMISION PROVEEDOR No.' || PREF || NUM || '-' || NUMPROV;
        if (numped <> '') then
            conc = conc || '-ORDEN ' || NUMPED;
        COSTO = ((new.rpvd_prunit - NEW.rpvd_dtomonto) / :factor);
        if (IVAINC = 'S') then
            BEGIN
            EXECUTE PROCEDURE lee_configuracion ('FACTURACION', 'ARTICULOS', 'IMPOCONSUMO INCLUIDO EN EL PRECIO BASE DE VENTA ANTES DE IVA') returning_values(:icoinc);
            if (icoinc = 'SI') then
                COSTO = COSTO - (NEW.rpvd_consumo/(NEW.rpvd_cant * new.rpvd_factor));
            COSTO = COSTO / (1 + NEW.rpvd_ivaporc/100);
            END
        EXECUTE PROCEDURE lee_configuracion('COMPRAS','FACTURAS','DESCUENTO Y VALOR ADICIONAL DEL DOCUMENTO COMO MENOR VALOR DEL COSTO') returning_values (:MENORV);
        if (MENORV = 'SI') then
            BEGIN
            FACT = (TOTAL - EXTRA - IVAMONTO);
            if ((FACT - ADICIONAL + DTOPIE) <> 0) then
                FACT = FACT / (FACT - ADICIONAL + DTOPIE);
            ELSE
                FACT = 1;
            COSTO = COSTO * FACT;
            END
        if (COSTO = 0) then
            BEGIN
            EXECUTE PROCEDURE lee_configuracion('COMPRAS', 'REMISIONES', 'PERMITIR CEROS EN COSTOS DE MERCANCIA') returning_values (:ceros);
            EXECUTE PROCEDURE lee_configuracion('COMPRAS', 'FACTURAS', 'ACTUALIZAR COSTOS DE LA REMISION RELACIONADA AL GRABAR LA FACTURA') returning_values (:ACTREM);
            if ((ACTREM = 'SI') and (CEROS = 'NO')) then
                execute procedure costo_promedio(NEW.arti_cod, :fec) returning_values (:COSTO);
            END
        INSERT INTO MOVIMIENTO_ARTICULO
          (ARTI_COD, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM, TERC_NIT)
          VALUES(NEW.ARTI_COD, NEW.BODE_COD, :FEC, 22, NEW.repr_id,
          :CONC, :factor * new.rpvd_cant, :COSTO, 'S', new.rpvd_lote, :Pref, :Num, new.rpvd_item, :Nit);

        /* RECORRA LAS LISTAS DE PRECIOS Y CAMBIE EL PRECIO */
        EXECUTE PROCEDURE CALCULA_PRECIOS(NEW.ARTI_COD, :FEC);

        if (COSTO > 0 ) then
         BEGIN
          /* GRABE PROV X ARTICULO */
          EXISTE = 'N';
          SELECT 'S' FROM PROVEEDOR_ARTICULO WHERE TERC_NIT = :NIT AND ARTI_COD = NEW.ARTI_COD INTO :EXISTE;
          if (EXISTE = 'S') then
            UPDATE PROVEEDOR_ARTICULO 
                SET PVAR_FECHA = :FEC, PVAR_COSTO = :COSTO, PVAR_COD = NEW.rpvd_codprov
                WHERE TERC_NIT = :NIT AND ARTI_COD = NEW.ARTI_COD;
          ELSE
            INSERT INTO PROVEEDOR_ARTICULO (TERC_NIT, ARTI_COD, PVAR_COSTO, PVAR_FECHA, PVAR_COD,PVAR_DES)
                VALUES (:NIT, NEW.ARTI_COD, :COSTO, :FEC, NEW.rpvd_codprov,NEW.rpvd_desc);
         END
        end

    /* ACTUALICE EL PENDIENTE  */
    if (CONSOLIDA <> 0) then
        BEGIN
        EXECUTE PROCEDURE LEE_CONFIGURACION ('COMPRAS','DOCUMENTOS','SUMAR CANTIDADES PENDIENTES AL CONSOLIDAR DOCUMENTOS') returning_values (CONSO);
        SELECT MIN(CEFA_TIPOORI) FROM consolide_faltantes WHERE CEFA_ID = :CONSOLIDA INTO :NUMROWS;
        if (NUMROWS = 23) then
            BEGIN
            EXECUTE PROCEDURE LEE_CONFIGURACION('COMPRAS', 'REMISIONES', 'VERIFICAR CODIGOS DE LA ORDEN') returning_values (MENORV);
            if (MENORV = 'SI') then
                CONSO = 'NO';
            END
        SELECT COUNT(CEFA_ITEM) FROM consolide_faltantes WHERE CEFA_ID = :CONSOLIDA INTO :NUMROWS;
        if ((CONSO = 'SI') AND (NUMROWS > 1)) then
            UPDATE consolidado_faltantes SET COFA_OK = 'S' WHERE COFA_ID = :consolida;
        ELSE
            BEGIN
            /* BUSQUE EL CONSOLIDADO EN EL MISMO ITEM Y SI ES DIFERENTE ACTUALICELO */
            select COFA_CANT * COFA_FACTOR FROM consolidado_faltantes WHERE COFA_ID = :consolida AND COFA_ITEM = NEW.RPVD_ITEM AND ARTI_COD = NEW.arti_cod INTO :CANTREL;
            if (NEW.RPVD_CANT * NEW.RPVD_FACTOR < CANTREL) then
                UPDATE consolidado_faltantes SET COFA_IDDES = NEW.repr_id, COFA_CANT = NEW.RPVD_CANT, COFA_FACTOR = NEW.RPVD_FACTOR
                    WHERE COFA_ID = :consolida AND COFA_ITEM = NEW.RPVD_ITEM AND ARTI_COD = NEW.arti_cod;
            ELSE
                UPDATE consolidado_faltantes SET COFA_IDDES = NEW.repr_id, COFA_OK = 'S' WHERE COFA_ID = :consolida AND COFA_ITEM = NEW.RPVD_ITEM AND ARTI_COD = NEW.arti_cod;
            END
        END
    /* ACTUALICE EL STAND */
    if (new.rpvd_stand is not null) then
      if (exists(select stand_cod from stands where arti_cod = new.arti_cod and stand_bodega = new.bode_cod)) then
        UPDATE stands set stand_cod = new.rpvd_stand where arti_cod = new.arti_cod and stand_bodega = new.bode_cod;
      else
        INSERT INTO stands (ARTI_COD, STAND_BODEGA, STAND_COD) VALUES (NEW.arti_cod, NEW.bode_cod, NEW.rpvd_stand);
    END
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER TRIGGER REMISION_PROVEEDOR_DET_AU
AS
declare variable fec date;
declare variable CONC VARCHAR(60);
declare variable Pref varchar(4);
declare variable Num varchar(6);
declare variable factor numeric(18,4);
declare variable EXISTE CHAR(1);
declare variable NIT VARCHAR(20);
declare variable NUMPROV VARCHAR(20);
declare variable Tipo integer;
declare variable idfact integer;
declare variable numrows integer;
declare variable IVAINC CHAR(2);
declare variable ICOINC CHAR(2);
declare variable COSTO NUMERIC(18,2);
declare variable CANTREL NUMERIC(18,4);
declare variable NUMPED VARCHAR(30);
declare variable CONSO CHAR(2);
declare variable CONSOLIDA INTEGER;
declare variable DTOPIE NUMERIC(18,2);
declare variable ADICIONAL NUMERIC(18,2);
declare variable TOTAL NUMERIC(18,2);
declare variable IVAMONTO NUMERIC(18,2);
declare variable EXTRA NUMERIC(18,2);
declare variable FACT NUMERIC(18,4);
declare variable MENORV CHAR(2);
declare variable CEROS CHAR(2);
declare variable ACTREM CHAR(2);
BEGIN
if ((OLD.repr_id <> 0) AND (OLD.rpvd_anulado = 'N')) then
    begin
    DELETE FROM MOVIMIENTO_ARTICULO WHERE (mvar_tipodoc = 22) and (mvar_idref = new.repr_id) and (mvar_item = old.rpvd_item);
    select REPR_CONSOLIDA from remision_proveedor where repr_id = old.repr_id into :CONSOLIDA;
    if (CONSOLIDA <> 0) then
        begin
        EXECUTE PROCEDURE LEE_CONFIGURACION ('COMPRAS','DOCUMENTOS','SUMAR CANTIDADES PENDIENTES AL CONSOLIDAR DOCUMENTOS') returning_values (CONSO);
        SELECT COUNT(CEFA_ITEM) FROM consolide_faltantes WHERE CEFA_ID = :CONSOLIDA INTO :NUMROWS;
        if ((NUMROWS = 1) OR (CONSO = 'NO')) then
            UPDATE consolidado_faltantes SET COFA_OK = 'N' WHERE COFA_ID = :consolida AND COFA_ITEM = old.RPVD_ITEM AND ARTI_COD = old.arti_cod;
        else
            UPDATE consolidado_faltantes SET COFA_OK = 'N' WHERE COFA_ID = :consolida;
        END
    end
/* Registre el nuevo */
if ((new.repr_id <> 0) AND (new.rpvd_anulado = 'N')) then
    begin
    select repr_fecha, pref_pre, repr_numero, repr_imptos, terc_nit, REPR_NUMPROV, REPR_ORDEN, REPR_CONSOLIDA, repr_dtomonto, repr_adicional, repr_total, repr_ivamonto, repr_extra
        from remision_proveedor where repr_id = new.repr_id
        into :fec, :Pref, :Num, :IVAINC, :NIT, :NUMPROV, :numped, :CONSOLIDA, :dtopie, :adicional, :total, :ivamonto, :extra;
    CONC = 'REMISION PROVEEDOR No.' || PREF || NUM || '-' || NUMPROV;
    if (numped <> '') then
        conc = conc || '-ORDEN ' || NUMPED;
    SELECT MAX(CEFA_TIPOORI) FROM consolide_faltantes WHERE CEFA_ID = :CONSOLIDA INTO :TIPO;
    if (Tipo is null) then
        Tipo = 0;
    select FACO_ID from FACTURAS_COMPRA WHERE FACO_CONSOLIDA = :consolida INTO :IDFACT;
    if (Idfact is null) then
        Idfact = 0;
    /* si se hizo con base en una factura que afecto el inventario no afecte inventario */
    numrows = 0;
    if (Tipo = 21) Then
        select count(*) from movimiento_articulo where mvar_tipodoc = 21 and mvar_idref = :idfact into :numrows;
    if (numrows is null) then
        numrows = 0;
    if (numrows = 0) then
        begin
        execute procedure factor_unidad_cant(new.arti_cod, new.rpvd_unidad) returning_values(factor);
        COSTO = ((new.rpvd_prunit - NEW.rpvd_dtomonto) / :factor);
        if (IVAINC = 'S') then
            BEGIN
            EXECUTE PROCEDURE lee_configuracion ('FACTURACION', 'ARTICULOS', 'IMPOCONSUMO INCLUIDO EN EL PRECIO BASE DE VENTA ANTES DE IVA') returning_values(:icoinc);
            if (icoinc = 'SI') then
                COSTO = COSTO - (NEW.rpvd_consumo/(NEW.rpvd_cant * new.rpvd_factor));
            COSTO = COSTO / (1 + NEW.rpvd_ivaporc/100);
            END
        EXECUTE PROCEDURE lee_configuracion('COMPRAS','FACTURAS','DESCUENTO Y VALOR ADICIONAL DEL DOCUMENTO COMO MENOR VALOR DEL COSTO') returning_values (:MENORV);
        if (MENORV = 'SI') then
            BEGIN
            FACT = (TOTAL - EXTRA - IVAMONTO);
            if ((FACT - ADICIONAL + DTOPIE) <> 0) then
                FACT = FACT / (FACT - ADICIONAL + DTOPIE);
            ELSE
                FACT = 1;
            COSTO = COSTO * FACT;
            END
        if (COSTO = 0) then
            BEGIN
            EXECUTE PROCEDURE lee_configuracion('COMPRAS', 'REMISIONES', 'PERMITIR CEROS EN COSTOS DE MERCANCIA') returning_values (:ceros);
            EXECUTE PROCEDURE lee_configuracion('COMPRAS', 'FACTURAS', 'ACTUALIZAR COSTOS DE LA REMISION RELACIONADA AL GRABAR LA FACTURA') returning_values (:ACTREM);
            if ((ACTREM = 'SI') and (CEROS = 'NO')) then
                execute procedure costo_promedio(NEW.arti_cod, :fec) returning_values (:COSTO);
            END
        INSERT INTO MOVIMIENTO_ARTICULO
            (ARTI_COD, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM, TERC_NIT)
            VALUES(NEW.ARTI_COD, NEW.BODE_COD, :FEC, 22, NEW.repr_id,
            :CONC, :factor * new.rpvd_cant, :COSTO, 'S', new.rpvd_lote, :Pref, :Num, new.rpvd_item, :Nit);
            
        /* RECORRA LAS LISTAS DE PRECIOS Y CAMBIE EL PRECIO */
        EXECUTE PROCEDURE CALCULA_PRECIOS(NEW.ARTI_COD, :FEC);
          
        if (COSTO > 0 ) then
         BEGIN
          /* GRABE PROV X ARTICULO */
          EXISTE = 'N';
          SELECT 'S' FROM PROVEEDOR_ARTICULO WHERE TERC_NIT = :NIT AND ARTI_COD = NEW.ARTI_COD INTO :EXISTE;
          if (EXISTE = 'S') then
            UPDATE PROVEEDOR_ARTICULO
                SET PVAR_FECHA = :FEC, PVAR_COSTO = :COSTO, PVAR_COD = NEW.rpvd_codprov
                WHERE TERC_NIT = :NIT AND ARTI_COD = NEW.ARTI_COD;
          ELSE
            INSERT INTO PROVEEDOR_ARTICULO (TERC_NIT, ARTI_COD, PVAR_COSTO, PVAR_FECHA, PVAR_COD,PVAR_DES)
                VALUES (:NIT, NEW.ARTI_COD, :COSTO, :FEC, NEW.rpvd_codprov,NEW.rpvd_desc);
         END
        end
    if (CONSOLIDA <> 0) then
        BEGIN
        EXECUTE PROCEDURE LEE_CONFIGURACION ('COMPRAS','DOCUMENTOS','SUMAR CANTIDADES PENDIENTES AL CONSOLIDAR DOCUMENTOS') returning_values (CONSO);
        /* IGNORE LA CONSOLIDACION SI SE VALIDAN CODIGOS DE LA ORDEN */
        SELECT MIN(CEFA_TIPOORI) FROM consolide_faltantes WHERE CEFA_ID = :CONSOLIDA INTO :NUMROWS;
        if (NUMROWS = 23) then
            BEGIN
            EXECUTE PROCEDURE LEE_CONFIGURACION('COMPRAS', 'REMISIONES', 'VERIFICAR CODIGOS DE LA ORDEN') returning_values (MENORV);
            if (MENORV = 'SI') then
                CONSO = 'NO';
            END
        SELECT COUNT(CEFA_ITEM) FROM consolide_faltantes WHERE CEFA_ID = :CONSOLIDA INTO :NUMROWS;
        if ((CONSO = 'SI') AND (NUMROWS > 1)) then
            UPDATE consolidado_faltantes SET COFA_IDDES = NEW.repr_id, COFA_OK = 'S' WHERE COFA_ID = :consolida;
        ELSE
            BEGIN
            /* BUSQUE EL CONSOLIDADO EN EL MISMO ITEM Y SI ES DIFERENTE ACTUALICELO */
            select COFA_CANT * COFA_FACTOR FROM consolidado_faltantes WHERE COFA_ID = :consolida AND COFA_ITEM = NEW.RPVD_ITEM AND ARTI_COD = NEW.arti_cod INTO :CANTREL;
            if (NEW.RPVD_CANT * NEW.RPVD_FACTOR < CANTREL) then
                UPDATE consolidado_faltantes SET COFA_IDDES = NEW.repr_id, COFA_CANT = NEW.RPVD_CANT, COFA_FACTOR = NEW.RPVD_FACTOR
                    WHERE COFA_ID = :consolida AND COFA_ITEM = NEW.RPVD_ITEM AND ARTI_COD = NEW.arti_cod;
            else
                UPDATE consolidado_faltantes SET COFA_IDDES = NEW.repr_id, COFA_OK = 'S' WHERE COFA_ID = :consolida AND COFA_ITEM = NEW.RPVD_ITEM AND ARTI_COD = NEW.arti_cod;
            END
        END
    /* ACTUALICE EL STAND */
    if (new.rpvd_stand is not null) then
      if (exists(select stand_cod from stands where arti_cod = new.arti_cod and stand_bodega = new.bode_cod)) then
        UPDATE stands set stand_cod = new.rpvd_stand where arti_cod = new.arti_cod and stand_bodega = new.bode_cod;
      else
        INSERT INTO stands (ARTI_COD, STAND_BODEGA, STAND_COD) VALUES (NEW.arti_cod, NEW.bode_cod, NEW.rpvd_stand);
    END
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER TRIGGER AJUSTES_DETALLE_BI
as
declare variable FECHA DATE;
begin
/* COLOQUE EL COSTO PROMEDIO */
SELECT AJUS_FECHA FROM AJUSTES WHERE AJUS_ID = NEW.ajus_id INTO :FECHA;
EXECUTE PROCEDURE costo_promedio_unidad(NEW.arti_cod, :FECHA, NEW.ajus_unidad) returning_values (NEW.ajde_costo);
end
^

SET TERM ; ^

SET TERM ^ ;

ALTER TRIGGER MOVIMIENTO_ARTICULO_BI
AS
declare variable LOTE CHAR(1);
declare variable ENSAMBLE CHAR(1);
declare variable IDENS INTEGER;
declare variable PREFENS VARCHAR(4);
declare variable unidad varchar(8);
declare variable DESCR varchar(60);
declare variable CODPR varchar(8);
declare variable DESPR varchar(60);
declare variable UNIPR varchar(8);
declare variable CANTPR numeric(18,4);
declare variable FACTOR numeric(18,4);
declare variable COSTO numeric(18,2);
declare variable COSTOTOT numeric(18,2);
declare variable ITEM INTEGER;
declare variable IVA NUMERIC(9,4);
declare variable IVAM NUMERIC(18,2);
declare variable CONSUMO NUMERIC(18,2);
BEGIN
/* INSERTE EL NUEVO LOTE */
SELECT ARTI_EXIST
    FROM   ARTICULO
    WHERE  ARTICULO.ARTI_COD = NEW.ARTI_COD
    INTO :LOTE;
if (LOTE = 'L') then
    BEGIN
      if ((NEW.mvar_lote IS NULL) or (NEW.mvar_lote = '')) then
        if (new.mvar_entrada = 'S') then
            new.mvar_lote = cast(new.mvar_cons as varchar(15));
        else
            begin
            /* NO HAY LOTE, ENTONCES CALCULELO SEGUN CONFIGURACION */
            execute procedure seleccione_lote(new.arti_cod, NEW.bode_cod, NEW.mvar_cant) returning_values(NEW.MVAR_LOTE);
            if (new.mvar_lote is null) then
                EXCEPTION LOTE_NEGATIVO 'No hay un lote del artículo ' || new.arti_cod || ' con existencia suficiente.';
            end
    END
/* ENSAMBLE EL PRODUCTO */
SELECT ARTI_ENSAMBLE, ARTI_UNIDAD, ARTI_DES FROM ARTICULO WHERE ARTI_COD = NEW.arti_cod INTO :ensamble, :unidad, :descr;
if ((NEW.mvar_entrada = 'N') AND (ENSAMBLE = 'S')) then
    BEGIN
    IDENS = gen_id(id_ensamble, 1);
    EXECUTE PROCEDURE lee_configuracion('INVENTARIO', 'ENSAMBLES', 'PREFIJO PARA ENSAMBLES AUTOMATICOS AL SACAR PRODUCTOS') returning_values (:prefens);
    INSERT INTO ENSAMBLES(ENSA_ID, TIDO_COD, PREF_PRE, BODE_COD, ENSA_NUMERO, ENSA_FECHA, ENSA_CONC, ENSA_REFER, ENSA_CANT, ENSA_UNIDAD, ENSA_FACTOR, ENSA_ANULADO, ENSA_TRANSMIT,
        ARTI_COD, ENSA_DESC, ENSA_CODBAR, ENSA_LOTE, ENSA_OBS, TERC_NIT, ENSA_USUARIO, NUMOK, ENSA_COSTO, LOTE_VENCE, ENSA_CODRETAL, ENSA_CANTRETAL, ENSA_OPER, ENSA_MAQUINA, ENSA_PESO, ENSA_BODRETAL, ENSA_TIPOREF, ENSA_IDREF)
        VALUES (:IDENS, 15, :prefens, NEW.bode_cod, '000001', new.mvar_fecha, new.mvar_conc, '', new.mvar_cant, :unidad, 1, 'N', 'N',
        NEW.arti_cod, :descr, NEW.arti_cod, NEW.mvar_lote, NULL, NULL, USER, 'N', NEW.mvar_costo, NULL, NULL, 0, null,  NULL, 0, NEW.bode_cod, NEW.mvar_tipodoc, NEW.mvar_idref);
    ITEM = 0;
    COSTOTOT = 0;
    FOR SELECT ARPR_CANT, ARPR_UNIDAD, ARPR_COMP, ARTI_DES, TAIV_PORC, ARTI_CONSUMO FROM articulos_producto P, ARTICULO A, TARIFA_IVA T
        WHERE P.ARTI_COD = NEW.arti_cod AND A.arti_cod = P.arpr_comp AND A.taiv_cod = T.taiv_cod
        INTO :CANTPR, :UNIPR, :CODPR, :DESPR, :IVA, :CONSUMO
        DO
        BEGIN
        ITEM = ITEM + 1;
        EXECUTE PROCEDURE costo_promedio_unidad (:codpr, NEW.mvar_fecha, :UNIPR) returning_values (:COSTO);
        EXECUTE PROCEDURE factor_unidad_cant(:codpr,  :unipr) returning_values (:FACTOR);
        COSTOTOT = COSTOTOT + COSTO * CANTPR;
        IVAM = costo * cantpr * iva / 100;
        INSERT INTO ENSAMBLES_DETALLE(ENSA_ID, ESDE_ITEM, ARTI_COD, BODE_COD, ESDE_CANT, ESDE_UNIDAD, ESDE_COSTO, ESDE_LOTE, ESDE_FACTOR, ESDE_IVAPORC, ESDE_IVAMONTO, ESDE_CONSUMO, ESDE_CODBAR, ESDE_ANULADO, ESDE_TRANSMIT, ESDE_DESC, ESDE_TOTAL, ESDE_PESO)
            VALUES (:idens, :ITEM, :codpr,  NEW.bode_cod, :cantpr, :unipr, :costo, NULL, :FACTOR, :IVA, :ivam, :consumo, :codpr, 'N', 'N', :despr, :COSTO * :cantpr, 0);
        END
    UPDATE ENSAMBLES SET ENSA_COSTO = :costotot WHERE ENSA_ID = :idens;
    END
if (new.mvar_cons is null) then
    NEW.mvar_cons = GEN_ID(ID_MOVARTI,1);
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER TRIGGER PEDIDOS_DETALLE_AI
as
declare variable CANTREL NUMERIC(18,2);
declare variable CONSO CHAR(2);
declare variable CONSOLIDA INTEGER;
declare variable IDENTR INTEGER;
declare variable COSTO NUMERIC(18,2);
declare variable IVA NUMERIC(9,2);
declare variable IVAM NUMERIC(18,2);
declare variable CONSUMO NUMERIC(18,2);
declare variable STAND VARCHAR(20);
declare variable LOTE VARCHAR(15);
declare variable FECHA DATE;
declare variable VLOTE DATE;
begin
if ((NEW.pedi_id <> 0) AND (NEW.pede_anulado = 'N')) then
    BEGIN
    SELECT PEDI_CONSOLIDA, PEDI_IDENTR, PEDI_FECHA FROM PEDIDOS WHERE PEDI_ID = NEW.PEDI_ID INTO :CONSOLIDA, :IDENTR, :FECHA;
    if (CONSOLIDA <> 0) then    
        begin
        UPDATE consolidado_faltantes SET COFA_OK = 'S' WHERE COFA_ID = :consolida AND COFA_ITEM = NEW.PEDE_ITEM AND ARTI_COD = NEW.arti_cod;
        EXECUTE procedure LEE_CONFIGURACION ('FACTURACION','DOCUMENTOS','DEJAR PENDIENTES LOS ARTICULOS NO INCLUIDOS AL TRAER DOCUMENTOS RELACIONADOS') returning_values (CONSO);
        if (CONSO = 'NO') then
            UPDATE consolidado_faltantes SET COFA_IDDES = NEW.pedi_id, COFA_OK = 'S' WHERE COFA_ID = :consolida;
        else
            BEGIN
            /* BUSQUE EL CONSOLIDADO EN EL MISMO ITEM Y SI ES DIFERENTE ACTUALICELO */
            select COFA_CANT FROM consolidado_faltantes WHERE COFA_ID = :consolida AND COFA_ITEM = NEW.PEDE_ITEM AND ARTI_COD = NEW.arti_cod INTO :CANTREL;
            if (NEW.PEDE_CANT * NEW.PEDE_FACTOR < CANTREL) then
                UPDATE consolidado_faltantes SET COFA_IDDES = NEW.pedi_id, COFA_CANT = NEW.PEDE_CANT * NEW.PEDE_FACTOR
                    WHERE COFA_ID = :consolida AND COFA_ITEM = NEW.PEDE_ITEM AND ARTI_COD = NEW.arti_cod;
            END
        end
    if (IDENTR <> 0) then
        begin
        EXECUTE PROCEDURE costo_promedio_unidad(NEW.arti_cod, :FECHA, NEW.pede_unidad) returning_values (:COSTO);
        SELECT ARTI_CONSUMO, TAIV_PORC FROM ARTICULO A, TARIFA_IVA T
            WHERE A.taiv_cod = T.taiv_cod AND A.arti_cod = NEW.arti_cod INTO :consumo, :iva;
        IVAM = COSTO * IVA;
        EXECUTE PROCEDURE seleccione_lote (NEW.arti_cod, NEW.bode_cod, NEW.pede_cant * NEW.pede_factor) returning_values (:LOTE);
        SELECT LOTE_VENCE FROM LOTES WHERE (ARTI_COD = NEW.arti_cod) AND (BODE_COD = NEW.bode_cod) AND (LOTE_NRO = :LOTE) INTO :VLOTE;
        SELECT STAND_COD FROM STANDS WHERE ARTI_COD = NEW.arti_cod AND STAND_BODEGA = NEW.bode_cod INTO :STAND;
        INSERT INTO ENTRADAS_DETALLE (ENTR_ID, ENDE_ITEM, ARTI_COD, BODE_COD, ENDE_CANT, ENDE_UNIDAD, ENDE_COSTO,
            ENDE_LOTE, ENDE_FACTOR, ENDE_DESC, ENDE_OBS, ENDE_DTOPORC, ENDE_DTOMONTO, ENDE_IVAPORC, ENDE_IVAMONTO,
            ENDE_CONSUMO, ENDE_CODBAR, ENDE_TOTAL, ENDE_ANULADO, ENDE_TRANSMIT, LOTE_VENCE, ENDE_STAND)
            VALUES(:IDENTR, NEW.pede_item, NEW.arti_cod, NEW.bode_cod, NEW.pede_cant, NEW.pede_unidad, :COSTO,
            :LOTE, NEW.pede_factor, NEW.pede_desc, NEW.pede_obs, 0, 0, :IVA, :IVAM,
            :CONSUMO, NEW.pede_codbar, :COSTO * NEW.pede_cant * NEW.pede_factor, 'N', 'N', :VLOTE, :STAND);
        end
    END
end
^

SET TERM ; ^

SET TERM ^ ;

ALTER TRIGGER PEDIDOS_DETALLE_AU
as
declare variable CANTREL NUMERIC(18,2);
declare variable CONSO CHAR(2);
declare variable CONSOLIDA INTEGER;
declare variable IDENTR INTEGER;
declare variable COSTO NUMERIC(18,2);
declare variable IVA NUMERIC(9,2);
declare variable IVAM NUMERIC(18,2);
declare variable CONSUMO NUMERIC(18,2);
declare variable STAND VARCHAR(20);
declare variable LOTE VARCHAR(15);
declare variable FECHA DATE;
declare variable VLOTE DATE;
begin
if ((OLD.pedi_id <> 0) AND (OLD.pede_anulado = 'N')) then
    BEGIN
    SELECT PEDI_CONSOLIDA, PEDI_IDENTR, PEDI_FECHA FROM PEDIDOS WHERE PEDI_ID = OLD.PEDI_ID INTO :CONSOLIDA, :IDENTR, :FECHA;
    if (CONSOLIDA <> 0) then
        BEGIN
        EXECUTE procedure LEE_CONFIGURACION ('FACTURACION','DOCUMENTOS','DEJAR PENDIENTES LOS ARTICULOS NO INCLUIDOS AL TRAER DOCUMENTOS RELACIONADOS') returning_values (CONSO);
        if (CONSO = 'SI') then
            UPDATE consolidado_faltantes SET COFA_IDDES = NEW.pedi_id, COFA_OK = 'N' WHERE COFA_ID = :consolida AND COFA_ITEM = OLD.PEDE_ITEM AND ARTI_COD = OLD.arti_cod;
        ELSE
            UPDATE consolidado_faltantes SET COFA_IDDES = NEW.pedi_id, COFA_OK = 'N' WHERE COFA_ID = :consolida;
        END
    if (IDENTR <> 0) then
        DELETE FROM ENTRADAS WHERE ENTR_ID = :IDENTR;
    END

if ((NEW.pedi_id <> 0) AND (NEW.pede_anulado = 'N')) then
    BEGIN
    SELECT PEDI_CONSOLIDA, PEDI_IDENTR, PEDI_FECHA FROM PEDIDOS WHERE PEDI_ID = NEW.PEDI_ID INTO :CONSOLIDA, :IDENTR, :FECHA;
    if (CONSOLIDA <> 0) then
        begin
        EXECUTE procedure LEE_CONFIGURACION ('FACTURACION','DOCUMENTOS','DEJAR PENDIENTES LOS ARTICULOS NO INCLUIDOS AL TRAER DOCUMENTOS RELACIONADOS') returning_values (CONSO);
        if (CONSO = 'NO') then
            UPDATE consolidado_faltantes SET COFA_IDDES = NEW.pedi_id, COFA_OK = 'S' WHERE COFA_ID = :consolida;
        else
            BEGIN
            UPDATE consolidado_faltantes SET COFA_OK = 'S' WHERE COFA_ID = :consolida AND COFA_ITEM = NEW.PEDE_ITEM AND ARTI_COD = NEW.arti_cod;
            /* BUSQUE EL CONSOLIDADO EN EL MISMO ITEM Y SI ES DIFERENTE ACTUALICELO */
            select COFA_CANT FROM consolidado_faltantes WHERE COFA_ID = :consolida AND COFA_ITEM = NEW.PEDE_ITEM AND ARTI_COD = NEW.arti_cod INTO :CANTREL;
            if (NEW.PEDE_CANT * NEW.PEDE_FACTOR < CANTREL) then
                UPDATE consolidado_faltantes SET COFA_IDDES = NEW.pedi_id, COFA_CANT = NEW.PEDE_CANT * NEW.PEDE_FACTOR
                    WHERE COFA_ID = :consolida AND COFA_ITEM = NEW.PEDE_ITEM AND ARTI_COD = NEW.arti_cod;
            END
        end
    if (IDENTR <> 0) then
        begin
        EXECUTE PROCEDURE costo_promedio_unidad(NEW.arti_cod, :FECHA, NEW.pede_unidad) returning_values (:COSTO);
        SELECT ARTI_CONSUMO, TAIV_PORC FROM ARTICULO A, TARIFA_IVA T
            WHERE A.taiv_cod = T.taiv_cod AND A.arti_cod = NEW.arti_cod INTO :consumo, :iva;
        IVAM = COSTO * IVA;
        EXECUTE PROCEDURE seleccione_lote (NEW.arti_cod, NEW.bode_cod, NEW.pede_cant * NEW.pede_factor) returning_values (:LOTE);
        SELECT LOTE_VENCE FROM LOTES WHERE (ARTI_COD = NEW.arti_cod) AND (BODE_COD = NEW.bode_cod) AND (LOTE_NRO = :LOTE) INTO :VLOTE;
        SELECT STAND_COD FROM STANDS WHERE ARTI_COD = NEW.arti_cod AND STAND_BODEGA = NEW.bode_cod INTO :STAND;
        INSERT INTO ENTRADAS_DETALLE (ENTR_ID, ENDE_ITEM, ARTI_COD, BODE_COD, ENDE_CANT, ENDE_UNIDAD, ENDE_COSTO,
            ENDE_LOTE, ENDE_FACTOR, ENDE_DESC, ENDE_OBS, ENDE_DTOPORC, ENDE_DTOMONTO, ENDE_IVAPORC, ENDE_IVAMONTO,
            ENDE_CONSUMO, ENDE_CODBAR, ENDE_TOTAL, ENDE_ANULADO, ENDE_TRANSMIT, LOTE_VENCE, ENDE_STAND)
            VALUES(:IDENTR, NEW.pede_item, NEW.arti_cod, NEW.bode_cod, NEW.pede_cant, NEW.pede_unidad, :COSTO,
            :LOTE, NEW.pede_factor, NEW.pede_desc, NEW.pede_obs, 0, 0, :IVA, :IVAM,
            :CONSUMO, NEW.pede_codbar, :COSTO * NEW.pede_cant * NEW.pede_factor, 'N', 'N', :VLOTE, :STAND);
        end
    END
end
^

SET TERM ; ^

SET TERM ^ ;

ALTER TRIGGER SALIDAS_DETALLE_BI
as
declare variable FEC DATE;
declare variable IVAINC CHAR(1);
declare variable SUBT double precision;
begin
SELECT SALI_FECHA, SALI_IMPTOS FROM SALIDAS WHERE SALI_ID = NEW.sali_id INTO :FEC, :IVAINC;
execute procedure costo_promedio_unidad (NEW.arti_cod, :fec,  NEW.sade_unidad) returning_values (NEW.sade_costo);
SUBT = NEW.sade_cant * NEW.sade_costo;
if (IVAINC = 'S') then
    BEGIN
    NEW.sade_ivamonto = (:SUBT - (NEW.sade_consumo * NEW.sade_cant * NEW.sade_factor)) * NEW.sade_ivaporc / 100;
    NEW.sade_total = :SUBT + NEW.sade_ivamonto;
    END
ELSE
    BEGIN
    NEW.sade_total = :subt;
    NEW.sade_ivamonto = (:SUBT - (NEW.sade_consumo * NEW.sade_cant * NEW.sade_factor)) / (100 + NEW.sade_ivaporc) * NEW.sade_ivaporc;
    END
end
^

SET TERM ; ^

SET TERM ^ ;

ALTER TRIGGER SALIDAS_DETALLE_BU
as
declare variable FEC DATE;
declare variable IVAINC CHAR(1);
declare variable SUBT double precision;
begin
SELECT SALI_FECHA, SALI_IMPTOS FROM SALIDAS WHERE SALI_ID = NEW.sali_id INTO :FEC, :IVAINC;
execute procedure costo_promedio_unidad (NEW.arti_cod, :fec,  NEW.sade_unidad) returning_values (NEW.sade_costo);
SUBT = NEW.sade_cant * NEW.sade_costo;
if (IVAINC = 'S') then
    BEGIN
    NEW.sade_ivamonto = (:SUBT - (NEW.sade_consumo * NEW.sade_cant * NEW.sade_factor)) * NEW.sade_ivaporc / 100;
    NEW.sade_total = :SUBT + NEW.sade_ivamonto;
    END
ELSE
    BEGIN
    NEW.sade_total = :subt;
    NEW.sade_ivamonto = (:SUBT - (NEW.sade_consumo * NEW.sade_cant * NEW.sade_factor)) / (100 + NEW.sade_ivaporc) * NEW.sade_ivaporc;
    END
end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure COSTO_PROMEDIO_Y_ULTIMO (
    ARTICULO varchar(15),
    FECHA date)
returns (
    COSTOP numeric(18,2),
    UCOSTO numeric(18,2))
AS
declare variable saldop numeric(18,2);
declare variable saldoc numeric(15,4);
declare variable entp numeric(18,2);
declare variable entc numeric(15,4);
BEGIN
SELECT first 1 COST_SALDOP, COST_ENTP,COST_SALDOC, COST_ENTC, COST_ULTIMO FROM COSTOS
    WHERE (ARTI_COD = :ARTICULO) AND (COST_FECHA <= :FECHA)
    order by ARTI_COD DESC, COST_FECHA DESC, cost_item desc
    INTO :SALDOP, ENTP, :SALDOC, ENTC, :UCOSTO;
IF (SALDOC IS NULL) THEN
    BEGIN
    COSTOP = 0;
    UCOSTO = 0;
    END
ELSE
    if ((SALDOC < 0) AND (SALDOC+ENTC > 0)) then
        COSTOP = ENTP/ENTC;
    else
        /* Cuando hay existencia calcule el promedio, de otra manera retorne el ultimo */
        if (SALDOC+ENTC > 0) then
            COSTOP = (SALDOP+ENTP) / (SALDOC+ENTC);
        else
            COSTOP = UCOSTO;
SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE ACTUALICE_COSTO(
    ARTICULO VARCHAR(15),
    FECHA DATE,
    COSTO NUMERIC(18,2),
    CANTIDAD NUMERIC(18,2),
    ENTRADA CHAR(1),
    ANULAR CHAR(1),
    IDMOV INTEGER,
    TIPO INTEGER)
AS
DECLARE VARIABLE saldo NUMERIC(18,2);
DECLARE VARIABLE COSTOP NUMERIC(18,2);
DECLARE VARIABLE exart CHAR(1);
DECLARE VARIABLE UCOSTO NUMERIC(18,2);
declare variable FECAUX DATE;
declare variable SALDOC NUMERIC(15,4);
declare variable ITEM INTEGER;
declare variable UNIDAD VARCHAR(8);
BEGIN
/* Verfique si el artículo tiene control de existencias */
SELECT arti_exist, ARTI_UNIDAD FROM articulo WHERE arti_COD = :articulo
    INTO :exart, :UNIDAD;
IF (exart <> 'N') THEN
    BEGIN
    if (ANULAR = 'S') then
        BEGIN
        select cost_saldoc, cost_saldop from costos
            WHERE (arti_cod = :articulo) AND (cost_fecha = :fecha) AND (cost_idmov = :IDMOV) AND (COST_TIPO = :TIPO)
            into :SALDOC, :SALDO; /* para dejar inicializadas las 2 variables */
        DELETE FROM COSTOS WHERE (arti_cod = :articulo) AND (cost_fecha = :fecha) AND (cost_idmov = :IDMOV) AND (COST_TIPO = :TIPO);
        /* para inicializar el ultimo costo */
        SELECT MAX(COST_FECHA) FROM costos
            WHERE (arti_cod = :articulo) AND (cost_fecha <= :fecha) INTO :FECAUX;
        if (FECAUX IS NULL) then
            UCOSTO = 0;
        ELSE
            BEGIN
            SELECT MAX(COST_ITEM) FROM costos
                WHERE (arti_cod = :articulo) AND (cost_fecha = :fecaux) INTO :ITEM;
            SELECT COST_ULTIMO FROM costos
                WHERE (arti_cod = :articulo) AND (cost_fecha = :fecaux) AND (cost_item = :ITEM) INTO :UCOSTO;
            END
        END
    ELSE
        BEGIN
        select max(cost_fecha) from costos WHERE (arti_cod = :articulo) AND (cost_fecha <= :fecha) into :fecaux;
        select max(cost_item) from costos WHERE (arti_cod = :articulo) AND (cost_fecha = :fecaux) into :item;
        select (cost_saldoc + cost_entc - cost_salc) from costos WHERE (arti_cod = :articulo) AND (cost_fecha = :fecaux) AND (cost_item = :item) into :saldoc;
        if (saldoc is null) THEN
            SALDOC = 0;
        EXECUTE PROCEDURE costo_promedio_y_ultimo(:articulo, :fecha) RETURNING_VALUES (:costop, :ucosto);
        if (ENTRADA = 'S') then
            if (TIPO = 33) then
                BEGIN
                INSERT INTO COSTOS (arti_cod, cost_fecha,
                    cost_entc, cost_entp, cost_salc, cost_salp,
                    cost_saldoc, cost_saldop, cost_ultimo, cost_idmov, cost_tipo)
                    VALUES (:articulo, :fecha, :cantidad, :cantidad*:costop, 0, 0, :saldoc, :saldoc*:costop, :ucosto, :IDMOV, :TIPO);
                SALDO = (SALDOC * COSTOP) + (CANTIDAD * COSTOP);
                SALDOC = SALDOC + CANTIDAD;
                END
            ELSE
                BEGIN
                UCOSTO = :COSTO;
                INSERT INTO COSTOS (arti_cod, cost_fecha,
                    cost_entc, cost_entp, cost_salc, cost_salp,
                    cost_saldoc, cost_saldop, cost_ultimo, cost_idmov, cost_tipo)
                    VALUES (:articulo, :fecha, :cantidad, :cantidad*:costo, 0, 0, :saldoc, :saldoc*:costop, :costo, :IDMOV, :TIPO);
                SALDO = (SALDOC * COSTOP) + (CANTIDAD * COSTO);
                SALDOC = SALDOC + CANTIDAD;
                END
        ELSE
            BEGIN
            INSERT INTO COSTOS (arti_cod, cost_fecha,
                cost_entc, cost_entp, cost_salc, cost_salp,
                cost_saldoc, cost_saldop, cost_ultimo, cost_idmov, cost_tipo)
                VALUES (:articulo, :fecha, 0, 0, :cantidad, :cantidad*:costop, :saldoc, :saldoc*:costop, :UCOSTO, :IDMOV, :TIPO);
            SALDOC = SALDOC - CANTIDAD;
            SALDO = SALDOC * COSTOP; /* YA ESTA RESTADA LA CANTIDAD */
            END
        END
    END
END

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE CALCULA_PRECIOS(
    ARTICULO VARCHAR(20),
    FECHA DATE)
AS
declare variable LISTA INTEGER;
declare variable MARGEN NUMERIC(9, 4);
declare variable UTIL NUMERIC(9, 4);
declare variable UNIDAD VARCHAR(8);
declare variable UOR VARCHAR(20);
declare variable COSTOP NUMERIC(18, 2);
declare variable COSTOU NUMERIC(18, 2);
declare variable COSTO NUMERIC(18, 2);
declare variable DIG INTEGER;
declare variable IVAINC CHAR(1);
declare variable TARIVA NUMERIC(9,2);
declare variable AUTOM CHAR(1);
declare variable BASE varchar(10);
declare variable CAMBIO CHAR(7);
BEGIN
EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION','ARTICULOS','CAMBIO DE PRECIOS AUTOMATICO AL CAMBIAR COSTO O PRECIO') returning_values (CAMBIO);
if (CAMBIO = 'COSTO') then
  BEGIN
  FOR SELECT P.LIPR_COD, PRAR_MARGEN, PRAR_UTIL, LIPR_MODIF, PRAR_AUTO
    FROM PRECIOS_ARTICULO P, LISTA_PRECIOS L
    WHERE P.LIPR_COD = L.LIPR_COD AND ARTI_COD = :articulo
    INTO :LISTA, :MARGEN, :UTIL, :IVAINC, :AUTOM
    DO
      if (AUTOM = 'S') then
        BEGIN
        if (UTIL IS NULL) then
            UTIL = 0;
        if (MARGEN IS NULL) then
            MARGEN = 0;
        SELECT ARTI_UNIDAD, TAIV_PORC FROM ARTICULO A, TARIFA_IVA T WHERE A.TAIV_COD = T.TAIV_COD AND ARTI_COD = :ARTICULO INTO :UNIDAD, :TARIVA;
        EXECUTE PROCEDURE lee_configuracion('FACTURACION','ARTICULOS','COSTO BASE PARA CALCULO DE PRECIOS DE VENTA AUTOMATICOS') returning_values (:BASE);
        EXECUTE PROCEDURE costo_promedio_y_ultimo (:ARTICULO, :FECHA) RETURNING_VALUES(:COSTOP, :COSTOU);
        if (base = 'ULTIMO') then
            COSTO = COSTOU;
        ELSE
            BEGIN
            COSTO = COSTOP;
            if (base = 'MAYOR') then
                if (COSTOP < COSTOU) then
                    COSTO = COSTOU;
            END
        if (IVAINC = 'S') then
            COSTO = COSTO * (1 + TARIVA/100);
        EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION', 'ARTICULOS', 'SUGERIR PRECIOS CON PORCENTAJE DE MARGEN O UTILIDAD') RETURNING_VALUES (:UOR);
        EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION', 'ARTICULOS', 'REDONDEO AL MULTIPLO DE DIEZ EN PRECIOS') RETURNING_VALUES (:DIG);
        if (UOR = 'UTILIDAD') then
            BEGIN
            COSTO = COSTO * (1 + :UTIL/100);
            EXECUTE PROCEDURE REDONDEE (COSTO, DIG) returning_values (COSTO);
            UPDATE PRECIOS_ARTICULO
                SET PRAR_FIJO = :COSTO
                WHERE ARTI_COD = :ARTICULO AND LIPR_COD = :LISTA;
            END
        ELSE
            BEGIN
            COSTO = COSTO / (1 - :MARGEN/100);
            EXECUTE PROCEDURE REDONDEE (COSTO, DIG) returning_values (COSTO);
            UPDATE PRECIOS_ARTICULO
                SET PRAR_FIJO = :COSTO
                WHERE ARTI_COD = :ARTICULO AND LIPR_COD = :LISTA;
            END
        END
  END
END

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE REP_DISPONIBILIDAD(
    FECHA DATE,
    ARTINI VARCHAR(20),
    ARTFIN VARCHAR(20),
    GRPINI VARCHAR(3),
    GRPFIN VARCHAR(3),
    ORDEN CHAR(1),
    CEROS CHAR(1),
    DETALLE CHAR(1),
    AGRUPA CHAR(1),
    SUCURSAL INTEGER)
RETURNS (
    CODIGO VARCHAR(15),
    NOMBRE VARCHAR(60),
    UNIDAD VARCHAR(8),
    CODGRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    CODSUBG VARCHAR(3),
    NOMSUBG VARCHAR(30),
    CODMARC VARCHAR(3),
    NOMMARC VARCHAR(30),
    CODBOD VARCHAR(2),
    NOMBOD VARCHAR(30),
    EXIST NUMERIC(18,4),
    PROMEDIO NUMERIC(18,4),
    SALIDAS NUMERIC(18,4),
    DISPONIBILIDAD INTEGER,
    DIAS INTEGER,
    PROMEDIADO INTEGER,
    COSTO NUMERIC(18,2),
    COSTOPRO NUMERIC(18,2),
    SUGERIDO NUMERIC(18,4),
    FECCOMPRA DATE)
AS
DECLARE VARIABLE CODINI VARCHAR(20);
DECLARE VARIABLE CODFIN VARCHAR(20);
DECLARE VARIABLE DESINI VARCHAR(20);
DECLARE VARIABLE DESFIN VARCHAR(20);
DECLARE VARIABLE MARINI VARCHAR(20);
DECLARE VARIABLE MARFIN VARCHAR(20);
declare variable DIASC VARCHAR(255);
declare variable DIA_ART VARCHAR(2) CHARACTER SET NONE;
declare variable PORART VARCHAR(8);
declare variable MAXDIA VARCHAR(2);
BEGIN
if (ORDEN = 'C') then
    BEGIN
    CODINI = ARTINI;
    CODFIN = ARTFIN;
    DESINI = '';
    DESFIN = 'zz';
    END
ELSE
    BEGIN
    DESINI = ARTINI;
    DESFIN = ARTFIN;
    CODINI = '';
    CODFIN = 'zz';
    END
if (AGRUPA = 'G') then
    BEGIN
    MARINI = '';
    MARFIN = 'zz';
    END
ELSE
    if (AGRUPA = 'M') then
        BEGIN
        MARINI = GRPINI;
        MARFIN = GRPFIN;
        GRPINI = '';
        GRPFIN = 'zz';
        END
EXECUTE PROCEDURE lee_configuracion ('INVENTARIO', 'EXISTENCIAS', 'PROMEDIAR LAS SALIDAS DEL INVENTARIO CON EL NUMERO DE DIAS ASIGNADO A CADA ARTICULO') returning_values (:DIA_ART);
EXECUTE PROCEDURE lee_configuracion ('INVENTARIO', 'EXISTENCIAS', 'NUMERO DE DIAS PARA PROMEDIO DE SALIDAS POR ARTICULO') returning_values (DIASC);
execute procedure lee_configuracion ('INVENTARIO', 'EXISTENCIAS', 'MAXIMO Y MINIMO POR STAND O POR ARTICULO') returning_values (:porart);
execute procedure lee_configuracion ('INVENTARIO', 'EXISTENCIAS', 'MAXIMO INVENTARIO EN DIAS') returning_values (:maxdia);
if (DETALLE = 'S') then
  BEGIN
  FOR SELECT ARTI_COD, ARTI_DES, ARTI_UNIDAD, ARTI_DIAS, A.GRUP_COD, GRUP_NOM, A.SUBG_COD, A.MARC_COD, BODE_COD, BODE_NOM, ARTI_DIANALIS
      FROM ARTICULO A, GRUPO G, BODEGA B
      WHERE ARTI_COD >= :CODINI AND ARTI_COD <= :CODFIN AND A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :GRPFIN AND ARTI_DES >= :DESINI AND ARTI_DES <= :DESFIN AND
      G.GRUP_COD = A.GRUP_COD AND A.ESAR_COD <> 'I' AND ((SUCU_ID = :SUCURSAL) or (:SUCURSAL = 0)) AND
      (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN)))
      INTO :CODIGO, :NOMBRE, :UNIDAD, :DIAS, :CODGRUPO, :NOMGRUPO, :CODSUBG, :CODMARC, :CODBOD, :NOMBOD, :PROMEDIADO
      DO
        BEGIN
        NOMMARC = '';
        NOMSUBG = '';
        SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO :NOMMARC;
        SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
        EXECUTE PROCEDURE costo_promedio_y_ultimo(:CODIGO, :FECHA) RETURNING_VALUES (:costopro, :COSTO);
        EXECUTE PROCEDURE DISPONIBILIDAD_ARTICULO(CODIGO, FECHA, :CODBOD) returning_values (:DISPONIBILIDAD, :EXIST, :PROMEDIO, :SALIDAS);
        if ((PORART = 'STAND') AND (MAXDIA = 'SI')) then
            BEGIN
            DIAS = 0;
            SELECT STAND_MIN FROM STANDS WHERE ARTI_COD = :CODIGO AND STAND_BODEGA = :codbod INTO :dias;
            END
        /*ESTABLECER CUAL ES EL VALOR DE DIAS PARA PROMEDIO*/
        if (DIA_ART = 'NO') then
          BEGIN
            PROMEDIADO = CAST(DIASC AS INTEGER);
          END
        if ((DISPONIBILIDAD < DIAS) and (PROMEDIO > 0))then
            SUGERIDO = (DIAS * PROMEDIO) - EXIST;
        ELSE
            SUGERIDO = 0;
        SELECT MAX(FACO_FECHA) FROM FACTURAS_COMPRA F, FACTURAS_COMPRAS_DETALLE D
            WHERE F.FACO_ID = D.faco_id AND D.ARTI_COD = :CODIGO AND FACO_FECHA <= :FECHA AND D.bode_cod = :codbod
            INTO :FECCOMPRA;
        if ((PROMEDIO > 0) or (EXIST <> 0) or (CEROS = 'S')) then
            SUSPEND;
        END
  END
ELSE
  BEGIN
  FOR SELECT ARTI_COD, ARTI_DES, ARTI_UNIDAD, ARTI_DIAS, A.GRUP_COD, GRUP_NOM, A.SUBG_COD, A.MARC_COD, ARTI_DIANALIS
      FROM ARTICULO A, GRUPO G
      WHERE ARTI_COD >= :CODINI AND ARTI_COD <= :CODFIN AND A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :GRPFIN AND ARTI_DES >= :DESINI AND ARTI_DES <= :DESFIN AND G.GRUP_COD = A.GRUP_COD AND
      A.ESAR_COD <> 'I' AND (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN)))
      INTO :CODIGO, :NOMBRE, :UNIDAD, :DIAS, :CODGRUPO, :NOMGRUPO, :CODSUBG, :CODMARC, :PROMEDIADO
      DO
        BEGIN
        NOMMARC = '';
        NOMSUBG = '';
        SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO :NOMMARC;
        SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
        EXECUTE PROCEDURE costo_promedio_y_ultimo(:CODIGO, :FECHA) RETURNING_VALUES (:costopro, :COSTO);
        EXECUTE PROCEDURE DISPONIBILIDAD_TOTAL_ARTICULO(CODIGO, FECHA) returning_values (:DISPONIBILIDAD, :EXIST, :PROMEDIO, :SALIDAS);
        if ((PORART = 'STAND') AND (MAXDIA = 'SI')) then
            BEGIN
            DIAS = 0;
            SELECT STAND_MIN FROM STANDS WHERE ARTI_COD = :CODIGO AND STAND_BODEGA = :codbod INTO :dias;
            END
        /*ESTABLECER CUAL ES EL VALOR DE DIAS PARA PROMEDIO*/
        if (DIA_ART = 'NO') then
          BEGIN
            PROMEDIADO = CAST(DIASC AS INTEGER);
          END
        if ((DISPONIBILIDAD < DIAS) and (PROMEDIO > 0))then
            SUGERIDO = (DIAS * PROMEDIO) - EXIST;
        ELSE
            SUGERIDO = 0;
        SELECT MAX(FACO_FECHA) FROM FACTURAS_COMPRA F, FACTURAS_COMPRAS_DETALLE D
            WHERE F.FACO_ID = D.faco_id AND D.ARTI_COD = :CODIGO AND FACO_FECHA <= :FECHA
            INTO :FECCOMPRA;
        if ((PROMEDIO > 0) or (EXIST <> 0) or (CEROS = 'S')) then
            SUSPEND;
        END
  END
END

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE REP_UTILIDAD_VENTAS(
    TIPO INTEGER,
    DETALLE CHAR(1),
    FECINI DATE,
    FECFIN DATE,
    ARTINI VARCHAR(15),
    ARTFIN VARCHAR(15),
    GRPINI VARCHAR(3),
    GRPFIN VARCHAR(3),
    ORDEN CHAR(1),
    AGRUPA CHAR(1),
    ULTIMO CHAR(1),
    CEROS CHAR(1),
    SUBEMPRESA INTEGER)
RETURNS (
    ARTICULO VARCHAR(15),
    DESCRIPCION VARCHAR(60),
    CODGRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    CODSUBG VARCHAR(3),
    NOMSUBG VARCHAR(30),
    CODMARC VARCHAR(3),
    NOMMARC VARCHAR(30),
    UNIDAD VARCHAR(8),
    CANTIDAD NUMERIC(18,4),
    BASE NUMERIC(18,4),
    COSTO NUMERIC(18,4),
    UTILIDAD NUMERIC(18,4),
    PORC NUMERIC(9,2),
    IVA NUMERIC(18,4),
    CONSUMO NUMERIC(18,4),
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    TIPODOC INTEGER)
AS
DECLARE VARIABLE COSTOUNIT NUMERIC(18,4);
DECLARE VARIABLE CANTDET NUMERIC(18,4);
declare variable CODINI VARCHAR(15);
declare variable CODFIN VARCHAR(15);
declare variable DESINI VARCHAR(15);
declare variable DESFIN VARCHAR(15);
declare variable MARINI VARCHAR(3);
declare variable MARFIN VARCHAR(3);
declare variable UOM VARCHAR(20);
declare variable NUMROWS INTEGER;
declare variable ULTCOS NUMERIC(18,2);
BEGIN
if (ORDEN = 'C') then
    BEGIN
    CODINI = ARTINI;
    CODFIN = ARTFIN;
    DESINI = '';
    DESFIN = 'zz';
    END
ELSE
    BEGIN
    DESINI = ARTINI;
    DESFIN = ARTFIN;
    CODINI = '';
    CODFIN = 'zz';
    END
if (AGRUPA = 'G') then
    BEGIN
    MARINI = '';
    MARFIN = 'zz';
    END
ELSE
    if (AGRUPA = 'M') then
        BEGIN
        MARINI = GRPINI;
        MARFIN = GRPFIN;
        GRPINI = '';
        GRPFIN = 'zz';
        END
    ELSE
        BEGIN
        MARINI = '';
        MARFIN = 'zz';
        GRPINI = '';
        GRPFIN = 'zz';
        END
EXECUTE PROCEDURE lee_configuracion ('FACTURACION', 'ARTICULOS', 'SUGERIR PRECIOS CON PORCENTAJE DE MARGEN O UTILIDAD') returning_values (:UOM);
if (DETALLE = 'N') then
    BEGIN
    if (BIN_AND(TIPO, 1) <> 0) then
        BEGIN
        TIPODOC = 31;
        /* BORRA LA TABLA AUXILIAR */
        DELETE FROM reportes_aux WHERE REPA_ID = 2 AND REPA_USER = USER;

        FOR SELECT MAX(D.ARTI_COD), SUM(FADE_CANT * FADE_FACTOR), SUM((FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO)*FACT_FACTOR), SUM(FADE_IVAMONTO*FACT_FACTOR), SUM(FADE_CONSUMO),
            MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD)
            FROM FACTURAS_DETALLE D, FACTURAS F, PREFIJOS P, ARTICULO A
            WHERE F.FACT_ID = D.FACT_ID AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND D.ARTI_COD = A.arti_cod AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            FACT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) and substring(a.arti_cod from 1 FOR 2) <> '.t'
            GROUP BY D.ARTI_COD
            INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,
            :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
            DO
            BEGIN
            COSTO = 0;
            FOR SELECT FADE_CANT * FADE_FACTOR, FACT_FECHA FROM FACTURAS_DETALLE D, FACTURAS F, PREFIJOS P
                WHERE F.FACT_ID = D.FACT_ID AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND
                FACT_ANULADO = 'N' AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                and D.ARTI_COD = :articulo  INTO :cantdet, :fecha
                DO
                BEGIN
                EXECUTE PROCEDURE costo_promedio_y_ultimo(:ARTICULO, :FECHA) returning_values (:costounit, :ultcos);
                if (ULTIMO = 'S') then
                    COSTO = COSTO + ultcos * cantdet;
                else
                    COSTO = COSTO + costounit * cantdet;
                END
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            if (CEROS = 'S') then
                INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (2, USER, :ARTICULO);
            SUSPEND;
            END /* FOR */
        if (CEROS = 'S') then
            BEGIN
            COSTO = 0;
            UTILIDAD = 0;
            PORC = 0;
            /* agregue los articulos sin factura */
            FOR SELECT ARTI_COD, 0, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND
                    A.ARTI_DES <= :DESFIN AND A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND
                    (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN)))
                INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,:DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                DO
                BEGIN
                SELECT COUNT(REPA_ARTICULO) FROM REPORTES_AUX WHERE REPA_ID = 2 AND REPA_USER = USER AND REPA_ARTICULO = :articulo INTO :numrows;
                if (numrows = 0) then
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        END
    if (BIN_AND(TIPO, 2) <> 0) then
        BEGIN
        TIPODOC = 32;
        /* BORRA LA TABLA AUXILIAR */
        DELETE FROM reportes_aux WHERE REPA_ID = 2 AND REPA_USER = USER;

        FOR SELECT MAX(D.ARTI_COD), SUM(RVDE_CANT * RVDE_FACTOR), SUM(RVDE_TOTAL-RVDE_IVAMONTO-RVDE_CONSUMO), SUM(RVDE_IVAMONTO), SUM(RVDE_CONSUMO),
            MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD)
            FROM REMISIONES_VENTA_DETALLE D, REMISIONES_VENTA R, PREFIJOS P, ARTICULO A
            WHERE R.REVT_ID = D.REVT_ID AND P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = 32 AND D.ARTI_COD = A.arti_cod AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            REVT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY D.ARTI_COD
            INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,
            :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
            DO
            BEGIN
            COSTO = 0;
            FOR SELECT RVDE_CANT * RVDE_FACTOR, REVT_FECHA FROM remisiones_venta_detalle D, remisiones_venta F, PREFIJOS P
                WHERE F.revt_id = D.revt_id AND REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN AND
                REVT_ANULADO = 'N' AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 32 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                and D.ARTI_COD = :articulo  INTO :cantdet, :fecha
                DO
                BEGIN
                EXECUTE PROCEDURE costo_promedio_y_ultimo(:ARTICULO, :FECHA) returning_values (:costounit, :ultcos);
                if (ULTIMO = 'S') then
                    COSTO = COSTO + ultcos * cantdet;
                else
                    COSTO = COSTO + costounit * cantdet;
                END
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            if (CEROS = 'S') then
                INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (2, USER, :ARTICULO);
            SUSPEND;
            END /* FOR */
        if (CEROS = 'S') then
            BEGIN
            COSTO = 0;
            UTILIDAD = 0;
            PORC = 0;
            /* agregue los articulos sin factura */
            FOR SELECT ARTI_COD, 0, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND
                    A.ARTI_DES <= :DESFIN AND A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND
                    (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN)))
                INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,:DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                DO
                BEGIN
                SELECT COUNT(REPA_ARTICULO) FROM REPORTES_AUX WHERE REPA_ID = 2 AND REPA_USER = USER AND REPA_ARTICULO = :articulo INTO :numrows;
                if (numrows = 0) then
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        END
    if (BIN_AND(TIPO, 4) <> 0) then
        BEGIN
        TIPODOC = 33;
        /* BORRA LA TABLA AUXILIAR */
        DELETE FROM reportes_aux WHERE REPA_ID = 2 AND REPA_USER = USER;

        FOR SELECT MAX(D.ARTI_COD), SUM(DVDE_CANT * DVDE_FACTOR), SUM((DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO)*DEVT_FACTOR), SUM(DVDE_IVAMONTO*DEVT_FACTOR), SUM(DVDE_CONSUMO),
            MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD)
            FROM devoluciones_ventas_detalle D, DEVOLUCIONES_VENTAS V, PREFIJOS P, ARTICULO A
            WHERE V.DEVT_ID = D.DEVT_ID AND P.PREF_PRE = V.PREF_PRE AND P.TIDO_COD = 33 AND D.ARTI_COD = A.arti_cod AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            DEVT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY D.ARTI_COD
            INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,
            :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
            DO
            BEGIN
            COSTO = 0;
            FOR SELECT DVDE_CANT * DVDE_FACTOR, DEVT_FECHA FROM devoluciones_ventas_detalle D, devoluciones_ventas F, PREFIJOS P
                WHERE F.devt_id = D.devt_id AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND
                DEVT_ANULADO = 'N' AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 33 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                and D.ARTI_COD = :articulo  INTO :cantdet, :fecha
                DO
                BEGIN
                EXECUTE PROCEDURE costo_promedio_y_ultimo(:ARTICULO, :FECHA) returning_values (:costounit, :ultcos);
                if (ULTIMO = 'S') then
                    COSTO = COSTO + ultcos * cantdet;
                else
                    COSTO = COSTO + costounit * cantdet;
                END
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            else
                CANTIDAD = CANTIDAD * -1;
            if (BASE IS NULL) then
                BASE = 0;
            else
                BASE = BASE * -1;
            if (IVA IS NULL) then
                IVA = 0;
            else
                IVA = IVA * -1;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            else
                CONSUMO = CONSUMO * -1;
            COSTO = costo * -1;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            if (CEROS = 'S') then
                INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (2, USER, :ARTICULO);
            SUSPEND;
            END /* FOR */
        if (CEROS = 'S') then
            BEGIN
            COSTO = 0;
            UTILIDAD = 0;
            PORC = 0;
            /* agregue los articulos sin factura */
            FOR SELECT ARTI_COD, 0, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND
                    A.ARTI_DES <= :DESFIN AND A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND
                    (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN)))
                INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,:DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                DO
                BEGIN
                SELECT COUNT(REPA_ARTICULO) FROM REPORTES_AUX WHERE REPA_ID = 2 AND REPA_USER = USER AND REPA_ARTICULO = :articulo INTO :numrows;
                if (numrows = 0) then
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        END
    if (BIN_AND(TIPO, 8) <> 0) then
        BEGIN
        TIPODOC = 34;
        /* BORRA LA TABLA AUXILIAR */
        DELETE FROM reportes_aux WHERE REPA_ID = 2 AND REPA_USER = USER;

        FOR SELECT MAX(D.ARTI_COD), SUM(PEDE_CANT * PEDE_FACTOR), SUM((PEDE_TOTAL-PEDE_IVAMONTO-PEDE_CONSUMO)*PEDI_FACTOR), SUM(PEDE_IVAMONTO*PEDI_FACTOR), SUM(PEDE_CONSUMO),
            MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD)
            FROM PEDIDOS_DETALLE D, PEDIDOS P, PREFIJOS R, ARTICULO A
            WHERE P.PEDI_ID = D.PEDI_ID AND P.PREF_PRE = R.PREF_PRE AND R.TIDO_COD = 34 AND D.ARTI_COD = A.arti_cod AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            PEDI_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY D.ARTI_COD
            INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,
            :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
            DO
            BEGIN
            COSTO = 0;
            FOR SELECT PEDE_CANT * PEDE_FACTOR, PEDI_FECHA FROM pedidos_detalle D, pedidos F, PREFIJOS P
                WHERE F.pedi_id = D.pedi_id AND PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND
                PEDI_ANULADO = 'N' AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                and D.ARTI_COD = :articulo  INTO :cantdet, :fecha
                DO
                BEGIN
                EXECUTE PROCEDURE costo_promedio_y_ultimo(:ARTICULO, :FECHA) returning_values (:costounit, :ultcos);
                if (ULTIMO = 'S') then
                    COSTO = COSTO + ultcos * cantdet;
                else
                    COSTO = COSTO + costounit * cantdet;
                END
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            if (CEROS = 'S') then
                INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (2, USER, :ARTICULO);
            SUSPEND;
            END /* FOR */
        if (CEROS = 'S') then
            BEGIN
            COSTO = 0;
            UTILIDAD = 0;
            PORC = 0;
            /* agregue los articulos sin factura */
            FOR SELECT ARTI_COD, 0, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND
                    A.ARTI_DES <= :DESFIN AND A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND
                    (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN)))
                INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,:DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                DO
                BEGIN
                SELECT COUNT(REPA_ARTICULO) FROM REPORTES_AUX WHERE REPA_ID = 2 AND REPA_USER = USER AND REPA_ARTICULO = :articulo INTO :numrows;
                if (numrows = 0) then
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        END
    if (BIN_AND(TIPO, 16) <> 0) then
        BEGIN
        TIPODOC = 35;
        /* BORRA LA TABLA AUXILIAR */
        DELETE FROM reportes_aux WHERE REPA_ID = 2 AND REPA_USER = USER;

        FOR SELECT MAX(D.ARTI_COD), SUM(CTDE_CANT * CTDE_FACTOR), SUM((CTDE_TOTAL-CTDE_IVAMONTO-CTDE_CONSUMO)*COTI_FACTOR), SUM(CTDE_IVAMONTO), SUM(CTDE_CONSUMO),
            MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD)
            FROM COTIZACIONES_DETALLE D, COTIZACIONES C, PREFIJOS P, ARTICULO A
            WHERE C.COTI_ID = D.COTI_ID AND P.PREF_PRE = C.PREF_PRE AND P.TIDO_COD = 35 AND D.ARTI_COD = A.arti_cod AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND COTI_FECHA >= :FECINI AND COTI_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            COTI_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY D.ARTI_COD
            INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,
            :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
            DO
            BEGIN
            COSTO = 0;
            FOR SELECT CTDE_CANT * CTDE_FACTOR, COTI_FECHA FROM cotizaciones_detalle D, cotizaciones F, PREFIJOS P
                WHERE F.coti_id = D.coti_id AND COTI_FECHA >= :FECINI AND COTI_FECHA <= :FECFIN AND
                COTI_ANULADO = 'N' AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                and D.ARTI_COD = :articulo  INTO :cantdet, :fecha
                DO
                BEGIN
                EXECUTE PROCEDURE costo_promedio_y_ultimo(:ARTICULO, :FECHA) returning_values (:costounit, :ultcos);
                if (ULTIMO = 'S') then
                    COSTO = COSTO + ultcos * cantdet;
                else
                    COSTO = COSTO + costounit * cantdet;
                END
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            if (CEROS = 'S') then
                INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (2, USER, :ARTICULO);
            SUSPEND;
            END /* FOR */
        if (CEROS = 'S') then
            BEGIN
            COSTO = 0;
            UTILIDAD = 0;
            PORC = 0;
            /* agregue los articulos sin factura */
            FOR SELECT ARTI_COD, 0, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND
                    A.ARTI_DES <= :DESFIN AND A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND
                    (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN)))
                INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,:DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                DO
                BEGIN
                SELECT COUNT(REPA_ARTICULO) FROM REPORTES_AUX WHERE REPA_ID = 2 AND REPA_USER = USER AND REPA_ARTICULO = :articulo INTO :numrows;
                if (numrows = 0) then
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        END
    END
ELSE
    BEGIN
    if (BIN_AND(TIPO, 1) <> 0) then
        BEGIN
        TIPODOC = 31;
        FOR SELECT F.PREF_PRE, FACT_NUMERO, FACT_FECHA, D.ARTI_COD, FADE_CANT * FADE_FACTOR, (FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO)*FACT_FACTOR, FADE_IVAMONTO*FACT_FACTOR, FADE_CONSUMO,
            ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
            FROM FACTURAS F, FACTURAS_DETALLE D, PREFIJOS P, ARTICULO A
            WHERE F.FACT_ID = D.FACT_ID AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND D.ARTI_COD = A.arti_cod AND
                A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
                A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND FACT_FECHA >= :FECINI AND
                (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
                FACT_FECHA <= :FECFIN AND FACT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) and substring(a.arti_cod from 1 FOR 2) <> '.t'
            ORDER BY D.ARTI_COD, FACT_FECHA, F.FACT_ID, FADE_ITEM
            INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,
                :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
            DO
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            EXECUTE PROCEDURE costo_promedio_y_ultimo(:ARTICULO, :FECHA) returning_values (:costounit, :ultcos);
            if (ULTIMO = 'S') then
                COSTO = ultcos * cantidad;
            else
                COSTO = costounit * cantidad;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            SUSPEND;
            END
        END
    if (BIN_AND(TIPO, 2) <> 0) then
        BEGIN
        TIPODOC = 32;
        FOR SELECT R.PREF_PRE, REVT_NUMERO, REVT_FECHA, D.ARTI_COD, RVDE_CANT * RVDE_FACTOR, RVDE_TOTAL-RVDE_IVAMONTO-RVDE_CONSUMO, RVDE_IVAMONTO, RVDE_CONSUMO,
            ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
            FROM REMISIONES_VENTA R, REMISIONES_VENTA_DETALLE D, PREFIJOS P, ARTICULO A
            WHERE R.REVT_ID = D.REVT_ID AND P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = 32 AND D.ARTI_COD = A.arti_cod AND
                A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
                A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN AND
                (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
                REVT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            ORDER BY D.ARTI_COD, REVT_FECHA, R.REVT_ID, RVDE_ITEM
            INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,
                :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
            DO
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            EXECUTE PROCEDURE costo_promedio_y_ultimo(:ARTICULO, :FECHA) returning_values (:costounit, :ultcos);
            if (ULTIMO = 'S') then
                COSTO = ultcos * cantidad;
            else
                COSTO = costounit * cantidad;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            SUSPEND;
            END
        END
    if (BIN_AND(TIPO, 4) <> 0) then
        BEGIN
        TIPODOC = 33;
        FOR SELECT V.PREF_PRE, DEVT_NUMERO, DEVT_FECHA, D.ARTI_COD, DVDE_CANT * DVDE_FACTOR, (DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO)*DEVT_FACTOR, DVDE_IVAMONTO*DEVT_FACTOR, DVDE_CONSUMO,
            ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
            FROM DEVOLUCIONES_VENTAS V, DEVOLUCIONES_VENTAS_DETALLE D, PREFIJOS P, ARTICULO A
            WHERE V.DEVT_ID = D.DEVT_ID AND P.PREF_PRE = V.PREF_PRE AND P.TIDO_COD = 33 AND D.ARTI_COD = A.arti_cod AND
                A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
                A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND
                (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
                DEVT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            ORDER BY D.ARTI_COD, DEVT_FECHA, V.DEVT_ID, DVDE_ITEM
            INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,
                :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
            DO
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            CANTIDAD = CANTIDAD * -1;
            EXECUTE PROCEDURE costo_promedio_y_ultimo(:ARTICULO, :FECHA) returning_values (:costounit, :ultcos);
            if (ULTIMO = 'S') then
                COSTO = ultcos * cantidad;
            else
                COSTO = costounit * cantidad;
            BASE = BASE * -1;
            IVA = IVA * -1;
            CONSUMO = CONSUMO * -1;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            SUSPEND;
            END
        END
    if (BIN_AND(TIPO, 8) <> 0) then
        BEGIN
        TIPODOC = 34;
        FOR SELECT P.PREF_PRE, PEDI_NUMERO, PEDI_FECHA, D.ARTI_COD, PEDE_CANT * PEDE_FACTOR, (PEDE_TOTAL-PEDE_IVAMONTO-PEDE_CONSUMO)*PEDI_FACTOR, PEDE_IVAMONTO*PEDI_FACTOR, PEDE_CONSUMO,
            ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD 
            FROM PEDIDOS P, PEDIDOS_DETALLE D, PREFIJOS R, ARTICULO A
            WHERE P.PEDI_ID = D.PEDI_ID AND P.PREF_PRE = R.PREF_PRE AND R.TIDO_COD = 34 AND D.ARTI_COD = A.arti_cod AND
                A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
                A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND
                (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
                PEDI_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            ORDER BY D.ARTI_COD, PEDI_FECHA, P.PEDI_ID, PEDE_ITEM
            INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,
                :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
            DO
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            EXECUTE PROCEDURE costo_promedio_y_ultimo(:ARTICULO, :FECHA) returning_values (:costounit, :ultcos);
            if (ULTIMO = 'S') then
                COSTO = ultcos * cantidad;
            else
                COSTO = costounit * cantidad;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            SUSPEND;
            END
        END
    if (BIN_AND(TIPO, 16) <> 0) then
        BEGIN
        TIPODOC = 35;
        FOR SELECT C.PREF_PRE, COTI_NUMERO, COTI_FECHA, D.ARTI_COD, CTDE_CANT * CTDE_FACTOR, (CTDE_TOTAL-CTDE_IVAMONTO-CTDE_CONSUMO)*COTI_FACTOR, CTDE_IVAMONTO*COTI_FACTOR, CTDE_CONSUMO,
            ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD 
            FROM COTIZACIONES C, COTIZACIONES_DETALLE D, PREFIJOS P, ARTICULO A
            WHERE C.COTI_ID = D.COTI_ID AND P.PREF_PRE = C.PREF_PRE AND P.TIDO_COD = 35 AND D.ARTI_COD = A.arti_cod AND
                A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
                A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND COTI_FECHA >= :FECINI AND COTI_FECHA <= :FECFIN AND
                (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
                COTI_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            ORDER BY D.ARTI_COD, COTI_FECHA, C.COTI_ID, CTDE_ITEM
            INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,
                :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
            DO
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            EXECUTE PROCEDURE costo_promedio_y_ultimo(:ARTICULO, :FECHA) returning_values (:costounit, :ultcos);
            if (ULTIMO = 'S') then
                COSTO = ultcos * cantidad;
            else
                COSTO = costounit * cantidad;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            SUSPEND;
            END
        END
    END
END

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE REVISA_PRECIOS(
    LISTA INTEGER,
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    ARTICULO VARCHAR(20),
    DESCR VARCHAR(60),
    GRUPO VARCHAR(2),
    SUBGRUPO VARCHAR(3),
    MARCA VARCHAR(3),
    COSTO NUMERIC(18,2),
    FIJO NUMERIC(18,2),
    UNIDAD VARCHAR(8),
    PORC NUMERIC(9,4),
    SUGERIDO NUMERIC(18,2),
    DIFER NUMERIC(18,2),
    NUEVO NUMERIC(18,2),
    OK CHAR(1))
AS
declare variable marg numeric(9,4);
declare variable UOM VARCHAR(10);
declare variable BASE VARCHAR(10);
declare variable CAMBIO VARCHAR(10);
declare variable COSTOP numeric(18,2);
declare variable COSTOU numeric(18,2);
declare variable DIFMAX numeric(18,2);
declare variable DIG INTEGER;
declare variable TARIVA NUMERIC(9,4);
declare variable IVAINC CHAR(1);
declare variable LISTAREF INTEGER;
begin
execute procedure lee_configuracion ('FACTURACION', 'ARTICULOS', 'SUGERIR PRECIOS CON PORCENTAJE DE MARGEN O UTILIDAD') returning_values (:UOM);
EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION', 'ARTICULOS', 'REDONDEO AL MULTIPLO DE DIEZ EN PRECIOS') RETURNING_VALUES (:DIG);
EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION','ARTICULOS','CAMBIO DE PRECIOS AUTOMATICO AL CAMBIAR COSTO O PRECIO') returning_values (CAMBIO);
EXECUTE PROCEDURE lee_configuracion('FACTURACION','ARTICULOS','COSTO BASE PARA CALCULO DE PRECIOS DE VENTA AUTOMATICOS') returning_values (:BASE);
EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION','ARTICULOS','CODIGO DE LA LISTA DE PRECIOS BASE PARA CAMBIO DE PRECIOS AUTOMATICO') returning_values (LISTAREF);
EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION','ARTICULOS','DIFERENCIA EN PESOS MAXIMA A PERMITIR PARA CAMBIAR PRECIOS') returning_values (DIFMAX);
for select A.arti_cod, A.arti_des, A.grup_cod, A.subg_cod, A.marc_cod, A.arti_unidad, prar_fijo, prar_margen, prar_util, TAIV_PORC
    from precios_articulo p, articulo a, tarifa_iva T
    where a.arti_cod = p.arti_cod and lipr_cod = :lista and a.taiv_cod = t.taiv_cod and exists (select arti_cod from movimiento_articulo m where arti_cod = a.arti_cod and m.mvar_entrada = 'S' and m.mvar_tipodoc <> 33 and m.mvar_tipodoc <> 13 and m.mvar_fecha >= :fecini and m.mvar_fecha <= :fecfin)
    order by A.arti_cod
    into :articulo, descr, :grupo, :subgrupo, :marca, :unidad, :fijo, :marg, :porc, :tariva
    do
    begin
    if (UOM <> 'UTILIDAD') then
        PORC = MARG;
    if (CAMBIO = 'COSTO') then
        BEGIN
        EXECUTE PROCEDURE costo_promedio_y_ultimo (:ARTICULO, :FECFIN) RETURNING_VALUES(:COSTOP, :COSTOU);
        if (base = 'ULTIMO') then
            COSTO = COSTOU;
        ELSE
            BEGIN
            COSTO = COSTOP;
            if (base = 'MAYOR') then
                if (COSTOP < COSTOU) then
                    COSTO = COSTOU;
            END
        SELECT LIPR_MODIF FROM LISTA_PRECIOS WHERE LIPR_COD = :lista INTO :IVAINC;
        if (IVAINC = 'S') then
            COSTO = COSTO * (1 + TARIVA/100);
        if (UOM = 'UTILIDAD') then
            SUGERIDO = COSTO * (1 + :PORC/100);
        ELSE
            SUGERIDO = COSTO / (1 - :PORC/100);
        END
    ELSE
        if (LISTA <> LISTAREF) then
            BEGIN
            SELECT PRAR_FIJO FROM PRECIOS_ARTICULO WHERE ARTI_COD = :articulo AND LIPR_COD = :LISTAREF INTO :SUGERIDO;
            if (IVAINC = 'S') then
                SUGERIDO = SUGERIDO / (1 + TARIVA/100);
            if (UOM = 'UTILIDAD') then
                SUGERIDO = SUGERIDO * (1 + :PORC/100);
            ELSE
                SUGERIDO = SUGERIDO / (1 - :PORC/100);
            END
    EXECUTE PROCEDURE REDONDEE (SUGERIDO, DIG) returning_values (SUGERIDO);
    DIFER = SUGERIDO - FIJO;
    NUEVO = SUGERIDO;
    OK = 'S';
    if ((abs(DIFER) > DIFMAX) and (sugerido <> 0)) then
        suspend;
    end
end

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE UTILIDAD_VENTAS(
    TIPO INTEGER,
    DETALLE CHAR(1),
    FECINI DATE,
    FECFIN DATE,
    PREFIJO VARCHAR(4),
    ULTIMO CHAR(1),
    SUBEMPRESA INTEGER)
RETURNS (
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    PTVTID INTEGER,
    VENDCOD INTEGER,
    NIT VARCHAR(20),
    NOMTERCERO VARCHAR(60),
    ARTICULO VARCHAR(15),
    ARTIDES VARCHAR(60),
    CANT NUMERIC(18,4),
    UNIDAD VARCHAR(8),
    PRECIO NUMERIC(18,2),
    COSTO NUMERIC(18,2),
    UTILIDAD NUMERIC(18,2),
    PORC NUMERIC(9,2))
AS
declare variable IMPTOS CHAR(1);
declare variable ID INTEGER;
declare variable IVA NUMERIC(18,2);
declare variable COSTOT NUMERIC(18,2);
declare variable ULTCOS NUMERIC(18,2);
declare variable PRECIOT NUMERIC(18,2);
declare variable UOM VARCHAR(20);
declare variable icoinc char(2);
declare variable consumo NUMERIC(18,2);
declare variable factor NUMERIC(18,4);
BEGIN
EXECUTE PROCEDURE lee_configuracion ('FACTURACION', 'ARTICULOS', 'SUGERIR PRECIOS CON PORCENTAJE DE MARGEN O UTILIDAD') returning_values (:UOM);
EXECUTE PROCEDURE lee_configuracion ('FACTURACION', 'ARTICULOS', 'IMPOCONSUMO INCLUIDO EN EL PRECIO BASE DE VENTA ANTES DE IVA') returning_values (:icoinc);
/* DETERMINE LA TABLA A EXAMINAR */
if (TIPO = 31) then
    BEGIN
    /* FACTURA */
    FOR SELECT FACT_ID, F.PREF_PRE, FACT_NUMERO, FACT_FECHA, PTVT_ID, VEND_COD, TERC_NIT, FACT_NOMCLIENTE, FACT_IVAINC, fact_factor
        FROM FACTURAS F, PREFIJOS P
        WHERE FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND FACT_ANULADO = 'N'
         AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = :TIPO AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
        ORDER BY FACT_FECHA, F.PREF_PRE, FACT_NUMERO
        INTO :ID, :PREF, :NUMERO, :FECHA, :PTVTID, :VENDCOD, :NIT, :NOMTERCERO, :IMPTOS, :factor
        DO
        if ((PREFIJO = '') or (PREFIJO = PREF)) then
          BEGIN
          COSTOT = 0;
          PRECIOT = 0;
          FOR SELECT D.ARTI_COD, SUBSTR(FADE_DESC,1,60), FADE_CANT * FADE_FACTOR, FADE_UNIDAD, (FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO)*:FACTOR, FADE_IVAMONTO, fade_consumo
            FROM FACTURAS_DETALLE D
            WHERE FACT_ID = :ID and substring(D.arti_cod from 1 FOR 2) <> '.t'
            INTO :ARTICULO, :ARTIDES, :CANT, :UNIDAD, :PRECIO, :IVA, :consumo
            DO
                BEGIN
                EXECUTE PROCEDURE costo_promedio_y_ultimo(:ARTICULO, :FECHA) returning_values (:COSTO, :ultcos);
                if (ULTIMO = 'S') then
                    COSTO = ultcos * CANT;
                else
                    COSTO = COSTO * CANT;
                if (DETALLE = 'S') then
                    BEGIN
                    UTILIDAD = PRECIO - COSTO;
                    if (UOM = 'UTILIDAD') then
                        EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                    else
                        EXECUTE PROCEDURE PORCENTAJE (utilidad,  PRECIO, 'S') returning_values (PORC);
                    SUSPEND;
                    END
                ELSE
                    BEGIN
                    COSTOT = COSTOT + COSTO;
                    PRECIOT = PRECIOT + PRECIO;
                    END
                END
          if (DETALLE <> 'S') then
            BEGIN
            COSTO = COSTOT;
            PRECIO = PRECIOT;
            UTILIDAD = PRECIO - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  PRECIO, 'S') returning_values (PORC);
            SUSPEND;
            END
          END
    END
  if (TIPO = 32) then
    BEGIN
    /* REMISION */
    FOR SELECT REVT_ID, R.PREF_PRE, REVT_NUMERO, REVT_FECHA, PTVT_ID, VEND_COD, TERC_NIT, REVT_NOMTERC, REVT_IVAINC
        FROM REMISIONES_VENTA R, PREFIJOS P
        WHERE REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN AND REVT_ANULADO = 'N'
         AND P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = :TIPO AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
        ORDER BY REVT_FECHA, R.PREF_PRE, REVT_NUMERO
        INTO :ID, :PREF, :NUMERO, :FECHA, :PTVTID, :VENDCOD, :NIT, :NOMTERCERO, :IMPTOS
        DO
        if ((PREFIJO = '') or (PREFIJO = PREF)) then
          BEGIN
          COSTOT = 0;
          PRECIOT = 0;
          FOR SELECT D.ARTI_COD, SUBSTR(RVDE_DESC,1,60), RVDE_CANT * RVDE_FACTOR, RVDE_UNIDAD, (RVDE_TOTAL-RVDE_IVAMONTO-RVDE_CONSUMO), RVDE_IVAMONTO, rvde_consumo
            FROM REMISIONES_VENTA_DETALLE D
            WHERE REVT_ID = :ID and substring(D.arti_cod from 1 FOR 2) <> '.t'
            INTO :ARTICULO, :ARTIDES, :CANT, :UNIDAD, :PRECIO, :IVA, :consumo
            DO
                BEGIN
                EXECUTE PROCEDURE costo_promedio_y_ultimo(:ARTICULO, :FECHA) returning_values (:COSTO, :ultcos);
                if (ULTIMO = 'S') then
                    COSTO = ultcos * CANT;
                else
                    COSTO = COSTO * CANT;
                if (DETALLE = 'S') then
                    BEGIN
                    UTILIDAD = PRECIO - COSTO;
                    if (UOM = 'UTILIDAD') then
                        EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                    else
                        EXECUTE PROCEDURE PORCENTAJE (utilidad,  PRECIO, 'S') returning_values (PORC);
                    SUSPEND;
                    END
                ELSE
                    BEGIN
                    COSTOT = COSTOT + COSTO;
                    PRECIOT = PRECIOT + PRECIO;
                    END
                END
          if (DETALLE <> 'S') then
            BEGIN
            COSTO = COSTOT;
            PRECIO = PRECIOT;
            UTILIDAD = PRECIO - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  PRECIO, 'S') returning_values (PORC);
            SUSPEND;
            END
          END
    END
  if (TIPO = 33) then
    BEGIN
    /* DEVOLUCION */
    FOR SELECT DEVT_ID, D.PREF_PRE, DEVT_NUMERO, DEVT_FECHA, PTVT_ID, VEND_COD, TERC_NIT, DEVT_NOMTERC, DEVT_IVAINC, DEVT_FACTOR
        FROM DEVOLUCIONES_VENTAS D, PREFIJOS P
        WHERE DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND DEVT_ANULADO = 'N'
         AND P.PREF_PRE = D.PREF_PRE AND P.TIDO_COD = :TIPO AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
        ORDER BY DEVT_FECHA, D.PREF_PRE, DEVT_NUMERO
        INTO :ID, :PREF, :NUMERO, :FECHA, :PTVTID, :VENDCOD, :NIT, :NOMTERCERO, :IMPTOS, :FACTOR
        DO
        if ((PREFIJO = '') or (PREFIJO = PREF)) then
          BEGIN
          COSTOT = 0;
          PRECIOT = 0;
          FOR SELECT D.ARTI_COD, SUBSTR(DVDE_DESC,1,60), DVDE_CANT * DVDE_FACTOR, DVDE_UNIDAD, (DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO)*:FACTOR, DVDE_IVAMONTO, dvde_consumo
            FROM DEVOLUCIONES_VENTAS_DETALLE D
            WHERE DEVT_ID = :ID and substring(D.arti_cod from 1 FOR 2) <> '.t'
            INTO :ARTICULO, :ARTIDES, :CANT, :UNIDAD, :PRECIO, :IVA, :consumo
            DO
                BEGIN
                EXECUTE PROCEDURE costo_promedio_y_ultimo(:ARTICULO, :FECHA) returning_values (:COSTO, :ultcos);
                if (ULTIMO = 'S') then
                    COSTO = ultcos * CANT;
                else
                    COSTO = COSTO * CANT;
                if (DETALLE = 'S') then
                    BEGIN
                    UTILIDAD = PRECIO - COSTO;
                    if (UOM = 'UTILIDAD') then
                        EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                    else
                        EXECUTE PROCEDURE PORCENTAJE (utilidad,  PRECIO, 'S') returning_values (PORC);
                    SUSPEND;
                    END
                ELSE
                    BEGIN
                    COSTOT = COSTOT + COSTO;
                    PRECIOT = PRECIOT + PRECIO;
                    END
                END
        if (DETALLE <> 'S') then
            BEGIN
            COSTO = COSTOT;
            PRECIO = PRECIOT;
            UTILIDAD = PRECIO - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  PRECIO, 'S') returning_values (PORC);
            SUSPEND;
            END
        END
    END
  if (TIPO = 34) then
    BEGIN
    /* PEDIDO */
    FOR SELECT PEDI_ID, P.PREF_PRE, PEDI_NUMERO, PEDI_FECHA, PTVT_ID, VEND_COD, TERC_NIT, PEDI_NOMTERC, PEDI_IVAINC, PEDI_FACTOR
        FROM PEDIDOS P, PREFIJOS R
        WHERE PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND PEDI_ANULADO = 'N'
         AND P.PREF_PRE = R.PREF_PRE AND R.TIDO_COD = :TIPO AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
        ORDER BY PEDI_FECHA, P.PREF_PRE, PEDI_NUMERO
        INTO :ID, :PREF, :NUMERO, :FECHA, :PTVTID, :VENDCOD, :NIT, :NOMTERCERO, :IMPTOS, :FACTOR
        DO
        if ((PREFIJO = '') or (PREFIJO = PREF)) then
          BEGIN
          COSTOT = 0;
          PRECIOT = 0;
          FOR SELECT ARTI_COD, SUBSTR(PEDE_DESC,1,60), PEDE_CANT * PEDE_FACTOR, PEDE_UNIDAD, (PEDE_TOTAL-PEDE_IVAMONTO-PEDE_CONSUMO)*:FACTOR, PEDE_IVAMONTO, pede_consumo
            FROM PEDIDOS_DETALLE
            WHERE PEDI_ID = :ID
            INTO :ARTICULO, :ARTIDES, :CANT, :UNIDAD, :PRECIO, :IVA, :consumo
            DO
                BEGIN
                EXECUTE PROCEDURE costo_promedio_y_ultimo(:ARTICULO, :FECHA) returning_values (:COSTO, :ultcos);
                if (ULTIMO = 'S') then
                    COSTO = ultcos * CANT;
                else
                    COSTO = COSTO * CANT;
                if (DETALLE = 'S') then
                    BEGIN
                    UTILIDAD = PRECIO - COSTO;
                    if (UOM = 'UTILIDAD') then
                        EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                    else
                        EXECUTE PROCEDURE PORCENTAJE (utilidad,  PRECIO, 'S') returning_values (PORC);
                    SUSPEND;
                    END
                ELSE
                    BEGIN
                    COSTOT = COSTOT + COSTO;
                    PRECIOT = PRECIOT + PRECIO;
                    END
                END
        if (DETALLE <> 'S') then
            BEGIN
            COSTO = COSTOT;
            PRECIO = PRECIOT;
            UTILIDAD = PRECIO - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  PRECIO, 'S') returning_values (PORC);
            SUSPEND;
            END
        END
    END
  if (TIPO = 35) then
    BEGIN
    /* COTIZACION */
    FOR SELECT COTI_ID, C.PREF_PRE, COTI_NUMERO, COTI_FECHA, PTVT_ID, VEND_COD, TERC_NIT, COTI_NOMTERC, COTI_IMPTOS, COTI_FACTOR
        FROM COTIZACIONES C, PREFIJOS P
        WHERE COTI_FECHA >= :FECINI AND COTI_FECHA <= :FECFIN AND COTI_ANULADO = 'N'
         AND P.PREF_PRE = C.PREF_PRE AND P.TIDO_COD = :TIPO AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
        ORDER BY COTI_FECHA, C.PREF_PRE, COTI_NUMERO
        INTO :ID, :PREF, :NUMERO, :FECHA, :PTVTID, :VENDCOD, :NIT, :NOMTERCERO, :IMPTOS, :FACTOR
        DO
        if ((PREFIJO = '') or (PREFIJO = PREF)) then
          BEGIN
          COSTOT = 0;
          PRECIOT = 0;
          FOR SELECT ARTI_COD, SUBSTR(CTDE_DESC,1,60), CTDE_CANT * CTDE_FACTOR, CTDE_UNIDAD, (CTDE_TOTAL-CTDE_IVAMONTO-CTDE_CONSUMO)*:FACTOR, CTDE_IVAMONTO, ctde_consumo
            FROM COTIZACIONES_DETALLE
            WHERE COTI_ID = :ID
            INTO :ARTICULO, :ARTIDES, :CANT, :UNIDAD, :PRECIO, :IVA, :consumo
            DO
                BEGIN
                EXECUTE PROCEDURE costo_promedio_y_ultimo(:ARTICULO, :FECHA) returning_values (:COSTO, :ultcos);
                if (ULTIMO = 'S') then
                    COSTO = ultcos * CANT;
                else
                    COSTO = COSTO * CANT;
                if (DETALLE = 'S') then
                    BEGIN
                    UTILIDAD = PRECIO - COSTO;
                    if (UOM = 'UTILIDAD') then
                        EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                    else
                        EXECUTE PROCEDURE PORCENTAJE (utilidad,  PRECIO, 'S') returning_values (PORC);
                    SUSPEND;
                    END
                ELSE
                    BEGIN
                    COSTOT = COSTOT + COSTO;
                    PRECIOT = PRECIOT + PRECIO;
                    END
                END
        if (DETALLE <> 'S') then
            BEGIN
            COSTO = COSTOT;
            PRECIO = PRECIOT;
            UTILIDAD = PRECIO - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  PRECIO, 'S') returning_values (PORC);
            SUSPEND;
            END
        END
    END
END

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE CHEQUEO_COSTOS(
    ARTICULO VARCHAR(20),
    FECHA DATE)
AS
declare variable NUMROWS INTEGER;
DECLARE VARIABLE ID INTEGER;
DECLARE VARIABLE FECMV DATE;
DECLARE VARIABLE CANT NUMERIC(15,4);
DECLARE VARIABLE COSTO NUMERIC(18,2);
DECLARE VARIABLE ENTRADA CHAR(1);
DECLARE VARIABLE TIPO INTEGER;
begin
SELECT COUNT(*) FROM COSTOS WHERE ARTI_COD = :ARTICULO AND COST_FECHA > :FECHA INTO :NUMROWS;
if (NUMROWS > 0) then
    BEGIN
    delete from costos where arti_cod = :ARTICULO AND COST_FECHA >= :FECHA;
    for select mvar_cons, mvar_fecha, mvar_cant, mvar_costo, mvar_entrada, mvar_tipodoc
        from movimiento_articulo WHERE ARTI_COD = :ARTICULO AND MVAR_FECHA >= :FECHA
        order by mvar_fecha, mvar_cons /* SE HACE ESTRICTAMENTE EN ORDEN DE FECHA Y REGISTRO, SI LO EDITAN CAMBIA EL ORDEN */
        into :id, :fecmv, :cant, :costo, :entrada, :tipo
        do
        if ((TIPO <> 13)) then
            EXECUTE PROCEDURE actualice_costo(:ARTICULO, :fecmv, :costo, :cant, :entrada, 'N', :id, :tipo);
    END
end

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE CHEQUEO_INVENTARIO(
    ARTINI VARCHAR(20),
    ARTFIN VARCHAR(20))
AS
DECLARE VARIABLE FECHA DATE;
DECLARE VARIABLE CANT NUMERIC(15,4);
DECLARE VARIABLE COSTO NUMERIC(18,2);
DECLARE VARIABLE ENTRADA CHAR(1);
DECLARE VARIABLE BODEGA CHAR(2);
DECLARE VARIABLE ID INTEGER;
DECLARE VARIABLE TIPO INTEGER;
declare variable TIPOEX CHAR(1);
DECLARE VARIABLE LOTE VARCHAR(20);
declare variable ARTICULO VARCHAR(20);
declare variable IDL INTEGER;
BEGIN
for select arti_cod from articulo where arti_cod >= :artini and arti_cod <= :artfin into :ARTICULO
  DO
  BEGIN
  DELETE FROM existencia_lote where arti_cod = :articulo;
  DELETE FROM lotes where arti_cod = :articulo;
  delete from costos where arti_cod = :ARTICULO;
  delete from existencia WHERE ARTI_COD = :ARTICULO;
  for select mvar_cons, mvar_fecha, mvar_cant, mvar_costo, mvar_entrada, bode_cod, mvar_tipodoc, mvar_lote
    from movimiento_articulo WHERE ARTI_COD = :ARTICULO
    order by mvar_fecha, mvar_cons
    into :id, :fecha, :cant, :costo, :entrada, :bodega, :tipo, :lote
  do
    begin
    SELECT ARTI_EXIST
        FROM   ARTICULO
        WHERE  ARTICULO.ARTI_COD = :ARTICULO
        INTO :TIPOEX;
    if ((TIPO <> 13)) then
        EXECUTE PROCEDURE actualice_costo(:ARTICULO, :fecha, :costo, :cant, :entrada, 'N', :id, :tipo);
    /* actualice existencias */
    if (:entrada = 'S') then
        begin
        execute procedure sume_existencia(:articulo, :bodega, :fecha, :cant, 'N');
        if (TIPOEX = 'L') then
            begin
            if (EXISTS (SELECT LOTE_NRO FROM LOTES WHERE ARTI_COD = :ARTICULO AND BODE_COD = :BODEGA AND LOTE_NRO = :lote)) then
                UPDATE LOTES
                    set lote_saldo = lote_saldo + :cant
                    where (arti_cod = :ARTICULO) and (BODE_COD = :BODEGA) AND (lote_nro = :lote);
            ELSE
                INSERT INTO LOTES (ARTI_COD, BODE_COD, LOTE_NRO, LOTE_FECHA, LOTE_CANT, LOTE_COSTO, LOTE_SALDO)
                    VALUES (:ARTICULO, :bodega, :lote, :fecha, :cant, :costo, :cant);
            end
        end
    else
        begin
        execute procedure reste_existencia(:articulo, :bodega, :fecha, :cant, 'N');
        if (TIPOEX = 'L') then
            begin
            if (EXISTS (SELECT LOTE_NRO FROM LOTES WHERE ARTI_COD = :ARTICULO AND BODE_COD = :BODEGA AND LOTE_NRO = :lote)) then
                UPDATE LOTES
                    set lote_saldo = lote_saldo - :cant
                    where (arti_cod = :ARTICULO) AND (BODE_COD = :BODEGA) and (lote_nro = :lote);
            ELSE
                BEGIN
                /* ARREGLE EL LOTE YA QUE NO EXISTE */
                SELECT MIN(LOTE_ID) FROM LOTES WHERE ARTI_COD = :articulo AND BODE_COD = :BODEGA AND LOTE_SALDO >= :cant INTO :IDL;
                SELECT LOTE_NRO FROM LOTES WHERE LOTE_ID = :IDL INTO :LOTE;
                UPDATE MOVIMIENTO_ARTICULO SET MVAR_LOTE = :LOTE WHERE MVAR_CONS = :ID;
                UPDATE LOTES
                    set lote_saldo = lote_saldo - :cant
                    where (arti_cod = :ARTICULO) and (BODE_COD = :BODEGA) AND (lote_nro = :lote);
                END
            if (EXISTS (SELECT EXLO_FECHA FROM EXISTENCIA_LOTE WHERE LOTE_NRO = :LOTE AND EXLO_FECHA = :FECHA
                AND ARTI_COD = :ARTICULO AND BODE_COD = :bodega)) then
                UPDATE EXISTENCIA_LOTE
                       SET EXLO_SAL = EXLO_SAL + :cant
                    WHERE LOTE_NRO = :LOTE AND EXLO_FECHA = :FECHA AND ARTI_COD = :ARTICULO AND BODE_COD = :bodega;
            else
                INSERT INTO EXISTENCIA_LOTE (ARTI_COD, BODE_COD, LOTE_NRO, EXLO_FECHA, EXLO_SAL)
                    VALUES (:ARTICULO, :BODEGA, :LOTE, :FECHA, :CANT);
            end
        end
    END
  END
END

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE CAMBIO_PRECIOS(
    FECHA DATE)
AS
declare variable ART VARCHAR(20);
BEGIN
FOR SELECT ARTI_COD FROM ARTICULO INTO :ART DO
    EXECUTE PROCEDURE CALCULA_PRECIOS(:ART, :FECHA);
  SUSPEND;
END

^

SET TERM ; ^

SET TERM ^ ;

ALTER TRIGGER PRECIOS_ARTICULO_BI
AS
declare variable UNIDAD VARCHAR(8);
declare variable UOR VARCHAR(20);
declare variable COSTOP NUMERIC(18, 2);
declare variable COSTOU NUMERIC(18, 2);
declare variable COSTO NUMERIC(18, 2);
declare variable DIG INTEGER;
declare variable IVAINC CHAR(1);
declare variable IVAINC1 CHAR(1);
declare variable TARIVA NUMERIC(9,2);
declare variable BASE varchar(10);
declare variable CAMBIO CHAR(7);
declare variable LISTA INTEGER;
declare variable PRECIO NUMERIC(18, 4);
BEGIN
if (NEW.prar_util IS NULL) then
    NEW.prar_util = 0;
if (NEW.prar_margen IS NULL) then
    NEW.prar_margen = 0;
if (NEW.prar_cantmin IS NULL) then
    NEW.prar_cantmin = 0.01;
if (NEW.prar_auto = 'S') then
    BEGIN
    SELECT LIPR_MODIF FROM LISTA_PRECIOS L
        WHERE LIPR_COD = NEW.LIPR_COD INTO :IVAINC;
    
    SELECT ARTI_UNIDAD, TAIV_PORC FROM ARTICULO A, TARIFA_IVA T
        WHERE ARTI_COD = NEW.ARTI_COD AND A.taiv_cod = T.taiv_cod INTO :UNIDAD, :TARIVA;
    EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION', 'ARTICULOS', 'SUGERIR PRECIOS CON PORCENTAJE DE MARGEN O UTILIDAD') RETURNING_VALUES (:UOR);
    EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION', 'ARTICULOS', 'REDONDEO AL MULTIPLO DE DIEZ EN PRECIOS') RETURNING_VALUES (:DIG);
    EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION','ARTICULOS','CAMBIO DE PRECIOS AUTOMATICO AL CAMBIAR COSTO O PRECIO') returning_values (CAMBIO);
    if (CAMBIO <> 'PRECIO') then
        BEGIN
        EXECUTE PROCEDURE lee_configuracion('FACTURACION','ARTICULOS','COSTO BASE PARA CALCULO DE PRECIOS DE VENTA AUTOMATICOS') returning_values (:BASE);
        EXECUTE PROCEDURE costo_promedio_y_ultimo (NEW.ARTI_COD, 'NOW') RETURNING_VALUES(:COSTOP, :COSTOU);
        if (base = 'ULTIMO') then
            BEGIN
            COSTO = COSTOU;
            END
        ELSE
            BEGIN
            COSTO = COSTOP;
            if (base = 'MAYOR') then
                if (COSTOP < COSTOU) then
                    COSTO = COSTOU;
            END
        if (IVAINC = 'S') then
            COSTO = COSTO * (1 + TARIVA/100);
        if (UOR = 'UTILIDAD') then
            NEW.PRAR_FIJO = (:COSTO * (1 + NEW.prar_util/100));
        ELSE
            NEW.PRAR_FIJO = (:COSTO / (1 - NEW.prar_margen/100));
        EXECUTE PROCEDURE REDONDEE (NEW.prar_fijo, DIG) returning_values (NEW.prar_fijo);
        END
    ELSE
        BEGIN
        /* PRECIO */
        EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION','ARTICULOS','CODIGO DE LA LISTA DE PRECIOS BASE PARA CAMBIO DE PRECIOS AUTOMATICO') returning_values (LISTA);
        if (NEW.lipr_cod <> :LISTA) then
            BEGIN
            SELECT PRAR_FIJO FROM PRECIOS_ARTICULO WHERE LIPR_COD = :LISTA AND ARTI_COD = NEW.arti_cod INTO :PRECIO;
            SELECT LIPR_MODIF FROM LISTA_PRECIOS L
                WHERE LIPR_COD = :lista INTO :IVAINC1;
            if (ivainc = 'S') then
                if (IVAINC1 = 'S') then
                    NEW.prar_fijo = precio;
                else
                    NEW.prar_fijo = precio * (1 + TARIVA/100);
            ELSE
                if (IVAINC1 = 'S') then
                    NEW.prar_fijo = precio / (1 + TARIVA/100);
                else
                    NEW.prar_fijo = precio;
            if (UOR = 'UTILIDAD') then
                NEW.prar_fijo = NEW.prar_fijo * (1 + NEW.prar_util/100);
            ELSE
                NEW.prar_fijo = NEW.prar_fijo / (1 - NEW.prar_margen/100);
            EXECUTE PROCEDURE REDONDEE (NEW.prar_fijo, DIG) returning_values (NEW.prar_fijo);
            END
        END
    END
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER TRIGGER PRECIOS_ARTICULO_BU
as
declare variable UNIDAD VARCHAR(8);
declare variable UOR VARCHAR(20);
declare variable DIG INTEGER;
declare variable IVAINC CHAR(1);
declare variable TARIVA NUMERIC(9,4);
declare variable CAMBIO CHAR(7);
declare variable BASE VARCHAR(10);
declare variable REP CHAR(2);
declare variable COSTOP NUMERIC(18, 2);
declare variable COSTOU NUMERIC(18, 2);
declare variable COSTO NUMERIC(18, 2);
declare variable CONSUMO NUMERIC(18, 2);
declare variable LISTA INTEGER;
declare variable PRECIO NUMERIC(18, 4);
declare variable IVAINC1 CHAR(1);
declare variable ICOINC CHAR(2);
begin
if (NEW.prar_auto = 'S') then
    BEGIN
    EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION','ARTICULOS','CAMBIO DE PRECIOS AUTOMATICO AL CAMBIAR COSTO O PRECIO') returning_values (CAMBIO);
    EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION', 'ARTICULOS', 'SUGERIR PRECIOS CON PORCENTAJE DE MARGEN O UTILIDAD') RETURNING_VALUES (:UOR);
    EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION', 'ARTICULOS', 'REDONDEO AL MULTIPLO DE DIEZ EN PRECIOS') RETURNING_VALUES (:DIG);
    EXECUTE PROCEDURE LEE_CONFIGURACION('INVENTARIO', 'ARTICULOS', 'REPLICAR CAMBIOS EN ARTICULOS') RETURNING_VALUES (:REP);
    SELECT LIPR_MODIF FROM LISTA_PRECIOS L
        WHERE LIPR_COD = NEW.LIPR_COD INTO :IVAINC;
    
    if (CAMBIO <> 'PRECIO') then
      begin
      if (REP <> 'SI') then
        BEGIN
        SELECT ARTI_UNIDAD, TAIV_PORC, ARTI_CONSUMO FROM ARTICULO A, TARIFA_IVA T
            WHERE A.TAIV_COD = T.TAIV_COD AND ARTI_COD = NEW.arti_cod INTO :UNIDAD, :TARIVA, :CONSUMO;
        EXECUTE PROCEDURE lee_configuracion('FACTURACION','ARTICULOS','COSTO BASE PARA CALCULO DE PRECIOS DE VENTA AUTOMATICOS') returning_values (:BASE);
        EXECUTE PROCEDURE costo_promedio_y_ultimo (NEW.arti_cod, 'NOW') RETURNING_VALUES(:COSTOP, :COSTOU);
        if (base = 'ULTIMO') then
            COSTO = COSTOU;
        ELSE
            BEGIN
            COSTO = COSTOP;
            if (base = 'MAYOR') then
                if (COSTOP < COSTOU) then
                    COSTO = COSTOU;
            END
        if (IVAINC = 'S') then
            BEGIN
            COSTO = COSTO * (1 + TARIVA/100);
            EXECUTE PROCEDURE lee_configuracion ('FACTURACION', 'ARTICULOS', 'IMPOCONSUMO INCLUIDO EN EL PRECIO BASE DE VENTA ANTES DE IVA') returning_values(:icoinc);
            if (icoinc = 'SI') then
                COSTO = COSTO + consumo;
            END
            
        if (UOR = 'UTILIDAD') then
            BEGIN
            COSTO = COSTO * (1 + NEW.prar_util/100);
            EXECUTE PROCEDURE REDONDEE (COSTO, DIG) returning_values (COSTO);
            new.prar_fijo = :COSTO;
            END
        ELSE
            BEGIN
            COSTO = COSTO / (1 - NEW.prar_margen/100);
            EXECUTE PROCEDURE REDONDEE (COSTO, DIG) returning_values (COSTO);
            NEW.PRAR_FIJO = :COSTO;
            END
        END
      end
    else
        begin
        /* PRECIO */
        EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION','ARTICULOS','CODIGO DE LA LISTA DE PRECIOS BASE PARA CAMBIO DE PRECIOS AUTOMATICO') returning_values (LISTA);
        if (NEW.lipr_cod <> :LISTA) then
            BEGIN
            SELECT PRAR_FIJO FROM PRECIOS_ARTICULO WHERE LIPR_COD = :LISTA AND ARTI_COD = NEW.arti_cod INTO :PRECIO;
            SELECT LIPR_MODIF FROM LISTA_PRECIOS L
                WHERE LIPR_COD = :lista INTO :IVAINC1;
            if (ivainc = 'S') then
                if (IVAINC1 = 'S') then
                    NEW.prar_fijo = precio;
                else
                    NEW.prar_fijo = precio * (1 + TARIVA/100);
            ELSE
                if (IVAINC1 = 'S') then
                    NEW.prar_fijo = precio / (1 + TARIVA/100);
                else
                    NEW.prar_fijo = precio;
            if (UOR = 'UTILIDAD') then
                NEW.prar_fijo = NEW.prar_fijo * (1 + NEW.prar_util/100);
            ELSE
                NEW.prar_fijo = NEW.prar_fijo / (1 - NEW.prar_margen/100);
            EXECUTE PROCEDURE REDONDEE (NEW.prar_fijo, DIG) returning_values (NEW.prar_fijo);
            END
        end
    END
end
^

SET TERM ; ^

SET TERM ^ ;

ALTER TRIGGER MOVIMIENTO_ARTICULO_AD
AS
declare variable LOTE CHAR(1);
declare variable ensamble char(1);
BEGIN
  /* INSERTE EL NUEVO LOTE */
  SELECT ARTI_EXIST
    FROM   ARTICULO
    WHERE  ARTICULO.ARTI_COD = OLD.ARTI_COD
    INTO :LOTE;
  /* BORRE LOS VIEJOS */
  if (old.mvar_tipodoc <> 13) then
      BEGIN
      EXECUTE PROCEDURE actualice_costo(old.arti_cod, old.mvar_fecha, old.mvar_costo, old.mvar_cant, old.mvar_entrada, 'S', OLD.mvar_cons, OLD.mvar_tipodoc);
      if (OLD.mvar_entrada = 'S') then
          EXECUTE PROCEDURE chequeo_costos(old.arti_cod, old.mvar_fecha-1); /* PARA OBLIGAR A RECALCULAR LOS MOV. DEL MISMO DIA */
      else
          EXECUTE PROCEDURE chequeo_costos(old.arti_cod, old.mvar_fecha);
      END
  /* actualice existencias */
  if (old.mvar_entrada = 'S') then
    BEGIN
    execute procedure sume_existencia(old.arti_cod, old.bode_cod, old.mvar_fecha, old.mvar_cant, 'S');
    if (LOTE = 'L') then
        UPDATE LOTES
            set lote_saldo = lote_saldo - old.mvar_cant
            where (arti_cod = old.ARTI_COD) and (bode_cod = old.bode_cod) and (lote_nro = old.mvar_lote);
    END
  else
    BEGIN
    SELECT ARTI_ENSAMBLE FROM ARTICULO WHERE ARTI_COD = old.arti_cod INTO :ensamble;
    if (ENSAMBLE = 'S') then
        delete from ensambles where ensa_tiporef = old.mvar_tipodoc and ensa_idref = old.mvar_idref;

    execute procedure reste_existencia(old.arti_cod, old.bode_cod, old.mvar_fecha, old.mvar_cant, 'S');
    if (LOTE = 'L') then
        UPDATE LOTES
            set lote_saldo = lote_saldo + old.mvar_cant
            where (arti_cod = old.ARTI_COD) and (bode_cod = old.bode_cod) and (lote_nro = old.mvar_lote);
    END
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER TRIGGER MOVIMIENTO_ARTICULO_AI
AS
declare variable EXISTE CHAR(1);
declare variable LOTE CHAR(1);
BEGIN
  /* INSERTE EL NUEVO LOTE */
  SELECT ARTI_EXIST FROM ARTICULO WHERE ARTICULO.ARTI_COD = NEW.ARTI_COD INTO :LOTE;
  /* ACTUALICE COSTOS cuando no es transferencia */
  if (new.mvar_tipodoc <> 13) then
      BEGIN
      EXECUTE PROCEDURE actualice_costo(new.arti_cod, new.mvar_fecha, new.mvar_costo, new.mvar_cant, new.mvar_entrada, 'N', new.mvar_cons, new.mvar_tipodoc);
      EXECUTE PROCEDURE chequeo_costos(NEW.arti_cod, NEW.mvar_fecha);
      END
  /* actualice existencias */
  if (new.mvar_entrada = 'S') then
    BEGIN
    execute procedure sume_existencia(new.arti_cod, new.bode_cod, new.mvar_fecha, new.mvar_cant, 'N');
    if (LOTE = 'L') then
        BEGIN
        if (NEW.MVAR_LOTE IS NULL) then
            EXCEPTION LOTE_OBLIGATORIO 'Debe especificar un número de lote para el articulo ' || new.arti_cod;
        ELSE
         BEGIN
         EXISTE = 'N';
         SELECT 'S' FROM LOTES WHERE ARTI_COD = NEW.ARTI_COD AND BODE_COD = NEW.bode_cod AND LOTE_NRO = new.mvar_lote INTO :EXISTE;
         if (EXISTE = 'S') then
            UPDATE LOTES
             set lote_saldo = lote_saldo + new.mvar_cant
              where (arti_cod = NEW.ARTI_COD) and (BODE_COD = NEW.bode_cod) and (lote_nro = new.mvar_lote);
         ELSE
            INSERT INTO LOTES (ARTI_COD, BODE_COD, LOTE_NRO, LOTE_FECHA, LOTE_CANT, LOTE_COSTO, LOTE_SALDO)
                VALUES (NEW.ARTI_COD, NEW.bode_cod, NEW.mvar_lote, NEW.mvar_fecha, NEW.mvar_cant, NEW.mvar_costo, NEW.mvar_cant);
         END
        END
    END
  else
    BEGIN
    execute procedure reste_existencia(new.arti_cod, new.bode_cod, new.mvar_fecha, new.mvar_cant, 'N');
    /* ACTUALICE LA EXISTENCIA DEL LOTE */
    if (LOTE = 'L') then
    if (NEW.mvar_lote IS NULL) then
        EXCEPTION LOTE_NEGATIVO 'Debe indicar un número de lote para el artículo ' || new.arti_cod;
    ELSE
        BEGIN
        /* Actualice el saldo historico del lote */
        EXISTE = 'N';
        SELECT 'S' FROM EXISTENCIA_LOTE WHERE LOTE_NRO = NEW.MVAR_LOTE AND EXLO_FECHA = NEW.MVAR_FECHA AND ARTI_COD = NEW.arti_cod AND BODE_COD = NEW.bode_cod INTO :EXISTE;
        if (EXISTE = 'S') then
            BEGIN
            UPDATE EXISTENCIA_LOTE
                SET EXLO_SAL = EXLO_SAL + NEW.mvar_cant
                WHERE LOTE_NRO = NEW.MVAR_LOTE AND EXLO_FECHA = NEW.MVAR_FECHA AND ARTI_COD = NEW.ARTI_COD AND BODE_COD = NEW.bode_cod;
            END
        ELSE
            BEGIN
            INSERT INTO EXISTENCIA_LOTE (ARTI_COD, BODE_COD, LOTE_NRO, EXLO_FECHA, EXLO_SAL)
                VALUES (NEW.ARTI_COD, NEW.bode_cod, NEW.MVAR_LOTE, NEW.MVAR_FECHA, NEW.MVAR_CANT);
            END
        UPDATE LOTES
            set lote_saldo = lote_saldo - new.mvar_cant
            where (arti_cod = NEW.ARTI_COD) and (BODE_COD = NEW.bode_cod) and (lote_nro = new.mvar_lote);
        END
    END
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER TRIGGER DESENSAMBLES_DETALLE_AI
AS
declare variable fec date;
declare variable CONC VARCHAR(60);
declare variable factor numeric(18,4);
declare variable COSTO numeric(18,2);
declare variable Pref varchar(4);
declare variable Num varchar(6);
declare variable CANT NUMERIC(18,2);
declare variable CANTOT CHAR(2);
BEGIN
  if ((NEW.DESE_id <> 0) and (new.dede_anulado = 'N')) then
    begin
    select dese_fecha, dese_conc, pref_pre, dese_numero, dese_cant * dese_factor
        from desensambles where dese_id = new.dese_id into :fec, :conc, :Pref, :Num, :CANT;
    execute procedure factor_unidad_cant(new.arti_cod, new.dede_unidad) returning_values(factor);
    execute procedure costo_promedio(new.arti_cod, :FEC) returning_values (:COSTO);
    EXECUTE PROCEDURE LEE_CONFIGURACION('INVENTARIO', 'ENSAMBLES', 'FORMACIONES CON CANTIDADES TOTALES') returning_values (:CANTOT);
    if (CANTOT <> 'SI') then
        CANT = CANT * factor * new.dede_cant;
    ELSE
        CANT = factor * new.dede_cant;
    INSERT INTO MOVIMIENTO_ARTICULO
      (ARTI_COD, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM)
      VALUES(NEW.ARTI_COD, NEW.BODE_COD, :FEC, 16, NEW.dese_id,
      :CONC, :CANT, :COSTO, 'S', new.dede_lote, :Pref, :Num, new.dese_item);

    /* RECORRA LAS LISTAS DE PRECIOS Y CAMBIE EL PRECIO */
    EXECUTE PROCEDURE CALCULA_PRECIOS(NEW.ARTI_COD, :fec);
    END
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER TRIGGER DESENSAMBLES_DETALLE_AU
AS
declare variable fec date;
declare variable CONC VARCHAR(60);
declare variable Pref varchar(4);
declare variable Num varchar(6);
declare variable factor numeric(18,4);
declare variable COSTO numeric(18,2);
declare variable CANT NUMERIC(18,2);
declare variable CANTOT CHAR(2);
BEGIN
/* Anule el anterior */
if ((OLD.DESE_ID <> 0) AND (OLD.dede_anulado = 'N')) then
    delete from movimiento_articulo where (mvar_tipodoc = 16) and (mvar_idref = old.DESE_id) and (mvar_item = old.dese_item);
if ((NEW.dese_id <> 0) AND (new.dede_anulado = 'N')) then
    BEGIN
    EXECUTE PROCEDURE LEE_CONFIGURACION('INVENTARIO', 'ENSAMBLES', 'FORMACIONES CON CANTIDADES TOTALES') returning_values (:CANTOT);
    select dese_fecha, dese_conc, pref_pre, dese_numero, dese_cant * dese_factor
        from desensambles where dese_id = new.dese_id into :fec, :conc, :Pref, :Num, :CANT;
    execute procedure factor_unidad_cant(new.arti_cod, new.dede_unidad) returning_values(factor);
    execute procedure costo_promedio(new.arti_cod, :FEC) returning_values (:COSTO);
    if (CANTOT <> 'SI') then
        CANT = CANT * factor * new.dede_cant;
    ELSE
        CANT = factor * new.dede_cant;
    INSERT INTO MOVIMIENTO_ARTICULO
        (ARTI_COD, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM)
        VALUES(NEW.ARTI_COD, NEW.BODE_COD, :FEC, 16, NEW.dese_id,
        :CONC, :CANT, :COSTO, 'S', new.dede_lote, :Pref, :Num, new.dese_item);

    /* RECORRA LAS LISTAS DE PRECIOS Y CAMBIE EL PRECIO */
    EXECUTE PROCEDURE CALCULA_PRECIOS(NEW.ARTI_COD, :fec);
    END
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER TRIGGER ENSAMBLES_AI
AS
declare variable COSTO NUMERIC(18,2);
declare variable ARTPRIN VARCHAR(2);
BEGIN
if ((NEW.ENSA_id <> 0) and (new.ensa_anulado = 'N')) then
  begin
  COSTO = new.ensa_costo / NEW.ensa_factor;
  INSERT INTO MOVIMIENTO_ARTICULO
    (ARTI_COD, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM)
    VALUES(NEW.ARTI_COD, new.bode_cod, new.ensa_fecha, 15, NEW.ensa_id,
    new.ensa_conc, NEW.ensa_factor * new.ensa_cant, :COSTO, 'S', new.ensa_lote, new.pref_pre, new.ensa_numero, 0);

  /* RECORRA LAS LISTAS DE PRECIOS Y CAMBIE EL PRECIO */
  EXECUTE PROCEDURE CALCULA_PRECIOS(NEW.ARTI_COD, new.ensa_fecha);

  /* ingrese el retal */
  execute procedure lee_configuracion('INVENTARIO', 'ENSAMBLES', 'ENSAMBLES CON UN ARTICULO PRINCIPAL COMO BASE') returning_values (:ARTPRIN);
  if (ARTPRIN = 'SI') then
    BEGIN
    if ((new.ensa_codretal is not null) and (new.ensa_codretal <> '')) then
      INSERT INTO MOVIMIENTO_ARTICULO
        (ARTI_COD, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM)
        VALUES(NEW.ensa_codretal, new.ensa_bodretal, new.ensa_fecha, 15, NEW.ensa_id,
        new.ensa_conc, new.ensa_cantretal, 0, 'N', new.ensa_lote, new.pref_pre, new.ensa_numero, 999);
    END
  else
    BEGIN
    if ((new.ensa_codretal is not null) and (new.ensa_codretal <> '')) then
      INSERT INTO MOVIMIENTO_ARTICULO
        (ARTI_COD, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM)
        VALUES(NEW.ensa_codretal, new.ensa_bodretal, new.ensa_fecha, 15, NEW.ensa_id,
        new.ensa_conc, new.ensa_cantretal, :COSTO, 'S', new.ensa_lote, new.pref_pre, new.ensa_numero, 999);
    END
  INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
    VALUES (USER, 15, NEW.ensa_id, 'I', NEW.pref_pre || NEW.ensa_numero);
  end
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER TRIGGER ENSAMBLES_AU
AS
declare variable COSTO NUMERIC(18,2);
declare variable consec INTEGER;
declare variable ARTPRIN VARCHAR(2);
BEGIN
/* BORRE LA CONTABILIZACION */
if (NEW.ensa_anulado = 'S') then
    BEGIN
    select enco_consec from comprobante_encabezado where enco_tiporef = 15 and enco_idref = old.ensa_id into :consec;
    if (NOT consec is null) then
     delete from comprobante_detalle where enco_consec = :consec;
    delete from comprobante_encabezado where enco_tiporef = 15 and enco_idref = old.ensa_id;
    INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
        VALUES (USER, 15, NEW.ensa_id, 'A', NEW.pref_pre || NEW.ensa_numero);
    END

/* BORRE EL ANTERIOR Y GRABE EL NUEVO */
if ((OLD.ensa_id <> 0) AND (OLD.ensa_anulado = 'N')) then
    begin
    delete from movimiento_articulo where (mvar_tipodoc = 15) and (mvar_idref = old.ensa_id) and (mvar_item = 0);
    delete from movimiento_articulo where (mvar_tipodoc = 15) and (mvar_idref = old.ensa_id) and (mvar_item = 999);
    end
if ((new.ensa_id <> 0) AND (NEW.ensa_anulado = 'N')) then
    begin
    COSTO = new.ensa_costo / NEW.ensa_factor;
    INSERT INTO MOVIMIENTO_ARTICULO
        (ARTI_COD, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM)
        VALUES(NEW.ARTI_COD, new.ensa_bodretal, new.ensa_fecha, 15, NEW.ensa_id,
        new.ensa_conc, NEW.ensa_factor * new.ensa_cant, :COSTO, 'S', new.ensa_lote, new.pref_pre, new.ensa_numero, 0);

    /* RECORRA LAS LISTAS DE PRECIOS Y CAMBIE EL PRECIO */
    EXECUTE PROCEDURE CALCULA_PRECIOS(NEW.ARTI_COD, new.ensa_fecha);

    /* ingrese el retal */
    execute procedure lee_configuracion('INVENTARIO', 'ENSAMBLES', 'ENSAMBLES CON UN ARTICULO PRINCIPAL COMO BASE') returning_values (:ARTPRIN);
    if (ARTPRIN = 'SI') then
        BEGIN
        if ((new.ensa_codretal is not null) and (new.ensa_codretal <> '')) then
            INSERT INTO MOVIMIENTO_ARTICULO
                (ARTI_COD, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM)
                VALUES(NEW.ensa_codretal, new.ensa_bodretal, new.ensa_fecha, 15, NEW.ensa_id,
                new.ensa_conc, new.ensa_cantretal, 0, 'N', new.ensa_lote, new.pref_pre, new.ensa_numero, 999);
        END
    else
        BEGIN
        if ((new.ensa_codretal is not null) and (new.ensa_codretal <> '')) then
            INSERT INTO MOVIMIENTO_ARTICULO
                (ARTI_COD, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM)
                VALUES(NEW.ensa_codretal, new.bode_cod, new.ensa_fecha, 15, NEW.ensa_id,
                new.ensa_conc, new.ensa_cantretal, :COSTO, 'S', new.ensa_lote, new.pref_pre, new.ensa_numero, 999);
        END
    INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
        VALUES (USER, 15, NEW.ensa_id, 'U', NEW.pref_pre || NEW.ensa_numero);
    end
/* SI CAMBIO LA FECHA ACTUALICE LOS DETALLES */
if ((OLD.pref_pre <> NEW.pref_pre) or
    (OLD.ensa_numero <> NEW.ensa_numero) or
    (OLD.ensa_fecha <> NEW.ensa_fecha) ) then
    UPDATE ENSAMBLES_DETALLE SET ESDE_TRANSMIT = 'N' WHERE ENSA_ID = OLD.ENSA_ID;

if (OLD.ensa_anulado <> NEW.ensa_anulado) then
    UPDATE ENSAMBLES_DETALLE SET ESDE_ANULADO = NEW.ensa_anulado WHERE ENSA_ID = OLD.ENSA_ID;

if (OLD.ensa_transmit <> NEW.ensa_transmit) then
    UPDATE ENSAMBLES_DETALLE SET ESDE_TRANSMIT = NEW.ensa_transmit WHERE ENSA_ID = OLD.ENSA_ID;
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER TRIGGER ENTRADAS_DETALLE_AI
AS
declare variable fec date;
declare variable CONC VARCHAR(60);
declare variable factor numeric(18,4);
declare variable Pref varchar(4);
declare variable Num varchar(6);
declare variable Nit varchar(20);
declare variable IVAINC CHAR(2);
declare variable ICOINC CHAR(2);
declare variable COSTO NUMERIC(18,2);
BEGIN
  if ((NEW.entr_id <> 0) and (new.ende_anulado = 'N')) then
    BEGIN
    select entr_fecha, entr_conc, pref_pre, entr_numero, terc_nit, entr_imptos
        from entradas where entr_id = new.entr_id
        into :fec, :conc, :Pref, :Num, :Nit, :ivainc;
    execute procedure factor_unidad_cant(new.arti_cod, new.ende_unidad) returning_values(factor);
    COSTO = ((new.ende_costo - NEW.ende_dtomonto) / :factor);
    if (IVAINC = 'S') then
        BEGIN
        EXECUTE PROCEDURE lee_configuracion ('FACTURACION', 'ARTICULOS', 'IMPOCONSUMO INCLUIDO EN EL PRECIO BASE DE VENTA ANTES DE IVA') returning_values(:icoinc);
        if (icoinc = 'SI') then
            COSTO = COSTO - NEW.ende_consumo;
        COSTO = COSTO / (1 + NEW.ende_ivaporc/100);
        END
    INSERT INTO MOVIMIENTO_ARTICULO
      (ARTI_COD, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM, TERC_NIT)
      VALUES(NEW.ARTI_COD, NEW.BODE_COD, :FEC, 11, NEW.entr_id,
      :CONC, :factor * new.ende_cant, :costo, 'S', new.ende_lote, :Pref, :Num, new.ende_item, :Nit);
    /* RECORRA LAS LISTAS DE PRECIOS Y CAMBIE EL PRECIO */
    EXECUTE PROCEDURE CALCULA_PRECIOS(NEW.ARTI_COD, :FEC);
    /* ACTUALICE EL STAND */
    if (new.ende_stand is not null) then
      if (exists(select stand_cod from stands where arti_cod = new.arti_cod and stand_bodega = new.bode_cod)) then
        UPDATE stands set stand_cod = new.ende_stand where arti_cod = new.arti_cod and stand_bodega = new.bode_cod;
      else
        INSERT INTO stands (ARTI_COD, STAND_BODEGA, STAND_COD) VALUES (NEW.arti_cod, NEW.bode_cod, NEW.ende_stand);
    END
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER TRIGGER ENTRADAS_DETALLE_AU
as
declare variable fec date;
declare variable CONC VARCHAR(60);
declare variable Pref varchar(4);
declare variable Num varchar(6);
declare variable Nit varchar(20);
declare variable factor numeric(18,4);
declare variable IVAINC CHAR(2);
declare variable ICOINC CHAR(2);
declare variable COSTO NUMERIC(18,2);
BEGIN
if ((OLD.entr_id <> 0) AND (OLD.ende_anulado = 'N')) then
    DELETE FROM MOVIMIENTO_ARTICULO WHERE (mvar_tipodoc = 11) and (mvar_idref = new.entr_id) and (mvar_item = old.ende_item);
if ((NEW.entr_id <> 0) AND (NEW.ende_anulado = 'N')) then
    begin
    select entr_fecha, entr_conc, pref_pre, entr_numero, terc_nit, entr_imptos
        from entradas where entr_id = new.entr_id
        into :fec, :conc, :Pref, :Num, :Nit, :ivainc;
    execute procedure factor_unidad_cant(new.arti_cod, new.ende_unidad) returning_values(factor);
    COSTO = ((new.ende_costo - NEW.ende_dtomonto) / :factor);
    if (IVAINC = 'S') then
        BEGIN
        EXECUTE PROCEDURE lee_configuracion ('FACTURACION', 'ARTICULOS', 'IMPOCONSUMO INCLUIDO EN EL PRECIO BASE DE VENTA ANTES DE IVA') returning_values(:icoinc);
        if (icoinc = 'SI') then
            COSTO = COSTO - NEW.ende_consumo;
        COSTO = COSTO / (1 + NEW.ende_ivaporc/100);
        END
    INSERT INTO MOVIMIENTO_ARTICULO
        (ARTI_COD, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM, TERC_NIT)
        VALUES(NEW.ARTI_COD, NEW.BODE_COD, :FEC, 11, NEW.entr_id,
        :CONC, :factor * new.ende_cant, :COSTO, 'S', new.ende_lote, :Pref, :Num, new.ende_item, :Nit);
    /* RECORRA LAS LISTAS DE PRECIOS Y CAMBIE EL PRECIO */
    EXECUTE PROCEDURE CALCULA_PRECIOS(NEW.ARTI_COD, :FEC);
    /* ACTUALICE EL STAND */
    if (new.ende_stand is not null) then
      if (exists(select stand_cod from stands where arti_cod = new.arti_cod and stand_bodega = new.bode_cod)) then
        UPDATE stands set stand_cod = new.ende_stand where arti_cod = new.arti_cod and stand_bodega = new.bode_cod;
      else
        INSERT INTO stands (ARTI_COD, STAND_BODEGA, STAND_COD) VALUES (NEW.arti_cod, NEW.bode_cod, NEW.ende_stand);
    END
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER TRIGGER FACTCOMP_DETALLE_AD
AS
declare variable fec date;
declare variable CONSO VARCHAR(2);
declare variable CONSOLIDA INTEGER;
declare variable NUMROWS INTEGER;
declare variable VERIF CHAR(2);
BEGIN
if ((old.fcde_anulado = 'N') and (OLD.faco_id <> 0)) then
    begin
    select faco_fecha, faco_consolida from facturas_compra where faco_id = old.faco_id into :fec, :consolida;
    DELETE FROM MOVIMIENTO_ARTICULO WHERE (mvar_tipodoc = 21) and (mvar_idref = old.faco_id) and (mvar_item = old.fcde_item);
    /* RECORRA LAS LISTAS DE PRECIOS Y CAMBIE EL PRECIO */
    EXECUTE PROCEDURE CALCULA_PRECIOS(old.ARTI_COD, :FEC);
    /* LOS PENDIENTES */
    if (CONSOLIDA <> 0) then
        BEGIN
        UPDATE consolidado_faltantes SET COFA_OK = 'N' WHERE COFA_ID = :consolida AND COFA_ITEM = old.FCDE_ITEM AND ARTI_COD = old.arti_cod;
        SELECT COUNT(CEFA_ITEM) FROM consolide_faltantes WHERE CEFA_ID = :CONSOLIDA INTO :NUMROWS;
        EXECUTE procedure LEE_CONFIGURACION ('COMPRAS','DOCUMENTOS','SUMAR CANTIDADES PENDIENTES AL CONSOLIDAR DOCUMENTOS') returning_values (CONSO);
        /* IGNORE LA CONSOLIDACION SI SE VALIDAN CODIGOS DE LA ORDEN */
        SELECT MIN(CEFA_TIPOORI) FROM consolide_faltantes WHERE CEFA_ID = :CONSOLIDA INTO :NUMROWS;
        if (NUMROWS = 23) then
            BEGIN
            EXECUTE PROCEDURE LEE_CONFIGURACION('COMPRAS', 'FACTURAS', 'VERIFICAR CODIGOS DE LA ORDEN') returning_values (VERIF);
            if (VERIF = 'SI') then
                CONSO = 'NO';
            END
        SELECT COUNT(CEFA_ITEM) FROM consolide_faltantes WHERE CEFA_ID = :CONSOLIDA INTO :NUMROWS;
        if ((CONSO = 'SI') AND (NUMROWS > 1)) then
            UPDATE consolidado_faltantes SET COFA_OK = 'N' WHERE COFA_ID = :consolida;
        END
    enD
END
^

SET TERM ; ^

SET TERM ^ ;

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

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

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

    /* ACTUALICE EL PENDIENTE  */
    if (CONSOLIDA <> 0) then
        BEGIN
        UPDATE consolidado_faltantes SET COFA_OK = 'S' WHERE COFA_ID = :consolida AND COFA_ITEM = NEW.FCDE_ITEM AND ARTI_COD = NEW.arti_cod;
        EXECUTE procedure LEE_CONFIGURACION ('COMPRAS','DOCUMENTOS','SUMAR CANTIDADES PENDIENTES AL CONSOLIDAR DOCUMENTOS') returning_values (CONSO);
        /* IGNORE LA CONSOLIDACION SI SE VALIDAN CODIGOS DE LA ORDEN */
        SELECT MIN(CEFA_TIPOORI) FROM consolide_faltantes WHERE CEFA_ID = :CONSOLIDA INTO :NUMROWS;
        if (NUMROWS = 23) then
            BEGIN
            EXECUTE PROCEDURE LEE_CONFIGURACION('COMPRAS', 'FACTURAS', 'VERIFICAR CODIGOS DE LA ORDEN') returning_values (MENORV);
            if (MENORV = 'SI') then
                CONSO = 'NO';
            END
        SELECT COUNT(CEFA_ITEM) FROM consolide_faltantes WHERE CEFA_ID = :CONSOLIDA INTO :NUMROWS;
        if ((CONSO = 'SI') AND (NUMROWS > 1)) then
            UPDATE consolidado_faltantes SET COFA_IDDES = NEW.faco_id, COFA_OK = 'S' WHERE COFA_ID = :consolida;
        else
            BEGIN
            /* BUSQUE EL CONSOLIDADO EN EL MISMO ITEM Y SI ES DIFERENTE ACTUALICELO */
            select COFA_CANT * COFA_FACTOR FROM consolidado_faltantes WHERE COFA_ID = :consolida AND COFA_ITEM = NEW.FCDE_ITEM AND ARTI_COD = NEW.arti_cod INTO :CANTREL;
            if (NEW.FCDE_CANT * NEW.FCDE_FACTOR < CANTREL) then
                UPDATE consolidado_faltantes SET COFA_IDDES = NEW.faco_id, COFA_CANT = NEW.FCDE_CANT, COFA_FACTOR = NEW.FCDE_FACTOR
                    WHERE COFA_ID = :consolida AND COFA_ITEM = NEW.FCDE_ITEM AND ARTI_COD = NEW.arti_cod;
            END
        END
    /* ACTUALICE EL STAND */
    if (new.fcde_stand is not null) then
      if (exists(select stand_cod from stands where arti_cod = new.arti_cod and stand_bodega = new.bode_cod)) then
        UPDATE stands set stand_cod = new.fcde_stand where arti_cod = new.arti_cod and stand_bodega = new.bode_cod;
      else
        INSERT INTO stands (ARTI_COD, STAND_BODEGA, STAND_COD) VALUES (NEW.arti_cod, NEW.bode_cod, NEW.fcde_stand);
    END
END
^

SET TERM ; ^

SET TERM ^ ;

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

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

        if (CONSOLIDA <> 0) then
            begin
            UPDATE consolidado_faltantes SET COFA_OK = 'S' WHERE COFA_ID = :consolida AND COFA_ITEM = NEW.FCDE_ITEM AND ARTI_COD = NEW.arti_cod;
            EXECUTE procedure LEE_CONFIGURACION ('COMPRAS','DOCUMENTOS','SUMAR CANTIDADES PENDIENTES AL CONSOLIDAR DOCUMENTOS') returning_values (CONSO);
            /* IGNORE LA CONSOLIDACION SI SE VALIDAN CODIGOS DE LA ORDEN */
            SELECT MIN(CEFA_TIPOORI) FROM consolide_faltantes WHERE CEFA_ID = :CONSOLIDA INTO :NUMROWS;
            if (NUMROWS = 23) then
                BEGIN
                EXECUTE PROCEDURE LEE_CONFIGURACION('COMPRAS', 'FACTURAS', 'VERIFICAR CODIGOS DE LA ORDEN') returning_values (MENORV);
                if (MENORV = 'SI') then
                    CONSO = 'NO';
                END
            SELECT COUNT(CEFA_ITEM) FROM consolide_faltantes WHERE CEFA_ID = :CONSOLIDA INTO :NUMROWS;
            if ((CONSO = 'SI') AND (NUMROWS > 1)) then
                UPDATE consolidado_faltantes SET COFA_IDDES = NEW.faco_id, COFA_OK = 'S' WHERE COFA_ID = :consolida;
            else
                BEGIN
                /* BUSQUE EL CONSOLIDADO EN EL MISMO ITEM Y SI ES DIFERENTE ACTUALICELO */
                select COFA_CANT * COFA_FACTOR FROM consolidado_faltantes WHERE COFA_ID = :consolida AND COFA_ITEM = NEW.FCDE_ITEM AND ARTI_COD = NEW.arti_cod INTO :CANTREL;
                if (NEW.FCDE_CANT * NEW.FCDE_FACTOR < CANTREL) then
                    UPDATE consolidado_faltantes SET COFA_IDDES = NEW.faco_id, COFA_CANT = NEW.FCDE_CANT, COFA_FACTOR = NEW.FCDE_FACTOR
                        WHERE COFA_ID = :consolida AND COFA_ITEM = NEW.FCDE_ITEM AND ARTI_COD = NEW.arti_cod;
                END
            end
        /* ACTUALICE EL STAND */
        if (new.fcde_stand is not null) then
          if (exists(select stand_cod from stands where arti_cod = new.arti_cod and stand_bodega = new.bode_cod)) then
            UPDATE stands set stand_cod = new.fcde_stand where arti_cod = new.arti_cod and stand_bodega = new.bode_cod;
          else
            INSERT INTO stands (ARTI_COD, STAND_BODEGA, STAND_COD) VALUES (NEW.arti_cod, NEW.bode_cod, NEW.fcde_stand);
        END
    end
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER TRIGGER NOTAS_CREDITO_PROVEEDOR_AI
AS
declare variable COSTO NUMERIC(18,2);
declare variable EXISTENCIA NUMERIC(18,4);
declare variable CODBOD VARCHAR(3);
BEGIN
if ((NEW.NCPR_ID <> 0) and (new.ncpr_anulado = 'N')) then
    BEGIN
    /* Registre el nuevo saldo del documento */
    INSERT INTO SALDOS_DOC_CXPAGAR (SDCP_TIPOREF, SDCP_IDREF, SDCP_FECHA, TERC_NIT, SDCP_RTEFTE, SDCP_RTIVA, SDCP_RTICA, SDCP_ABONO, SDCP_ABRTFTE, SDCP_ABRTIVA, SDCP_ABRTICA, SDCP_DEBITO, SDCP_MONTO, SDCP_TRM)
        VALUES (52, NEW.NCPR_ID, NEW.ncpr_fecha, NEW.terc_nit, (NEW.ncpr_rtftemonto * -1), (NEW.ncpr_rtivamonto * -1), (NEW.ncpr_rticamonto * -1), 0, 0, 0, 0, 'N', (NEW.ncpr_monto+NEW.ncpr_ivamonto)*-1, NEW.ncpr_trm);
    /* Registre el movimiento del proveedor */
    INSERT INTO MOVIMIENTO_PROVEEDOR (MVPR_ID, TERC_NIT, MVPR_TIPOREF, MVPR_IDREF, MVPR_FECHA, MVPR_VENCE, MVPR_CONC, MVPR_MONTO, MVPR_RTFTE, MVPR_RTIVA, MVPR_RTICA, MVPR_DEBITO, MVPR_ABONO, MVPR_PREFIJO, MVPR_NUMERO, MVPR_TRM)
      VALUES (GEN_ID(ID_MOVPROV, 1), NEW.TERC_NIT, 52, NEW.NCPR_ID, NEW.NCPR_FECHA, NEW.NCPR_FECHA, NEW.NCPR_CONC, NEW.NCPR_MONTO+NEW.NCPR_IVAMONTO, NEW.NCPR_RTFTEMONTO, NEW.NCPR_RTIVAMONTO, NEW.NCPR_RTICAMONTO, 'N', 'N', NEW.pref_pre, NEW.ncpr_numero, NEW.ncpr_trm);
    /* afecte el articulo */
    if (new.arti_cod <> '') then
        begin
        /* CALCULE EL NUEVO COSTO */
        execute procedure costo_promedio (new.arti_cod, new.ncpr_fecha) returning_values (:COSTO);
        execute procedure saldo_total_inventario (new.arti_cod, new.ncpr_fecha) returning_values (:EXISTENCIA);
        COSTO = ((COSTO * EXISTENCIA) - NEW.ncpr_monto) / EXISTENCIA;
        FOR SELECT DISTINCT BODE_COD FROM EXISTENCIA WHERE ARTI_COD = NEW.ARTI_COD INTO :CODBOD do
            BEGIN
            execute procedure saldo_inventario (new.arti_cod, :CODBOD, new.ncpr_fecha) returning_values (:EXISTENCIA);
            if (EXISTENCIA <> 0) then
                BEGIN
                /* SAQUE TODO LO QUE TENGA */
                INSERT INTO MOVIMIENTO_ARTICULO
                  (ARTI_COD, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM, TERC_NIT)
                  VALUES(NEW.ARTI_COD, :CODBOD, new.ncpr_fecha, 52, NEW.ncpr_id,
                  new.ncpr_conc, :EXISTENCIA, 0, 'N', '', new.pref_pre, new.ncpr_numero, 1, new.terc_nit);
                END
            END
        FOR SELECT DISTINCT BODE_COD, MVAR_CANT FROM MOVIMIENTO_ARTICULO WHERE MVAR_TIPODOC = 52 AND MVAR_IDREF = NEW.ncpr_id
            INTO :CODBOD, :existencia do
            BEGIN
            /* META TODO CON EL NUEVO COSTO */
            INSERT INTO MOVIMIENTO_ARTICULO
              (ARTI_COD, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM, TERC_NIT)
              VALUES(NEW.ARTI_COD, :CODBOD, new.ncpr_fecha, 52, NEW.ncpr_id,
              new.ncpr_conc, :EXISTENCIA, :COSTO, 'S', '', new.pref_pre, new.ncpr_numero, 1, new.terc_nit);
            END
        /* RECORRA LAS LISTAS DE PRECIOS Y CAMBIE EL PRECIO */
        EXECUTE PROCEDURE CALCULA_PRECIOS(NEW.ARTI_COD, new.ncpr_fecha);
        end
    INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
        VALUES (USER, 52, NEW.ncpr_id, 'I', NEW.pref_pre || NEW.ncpr_numero);
    END
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER TRIGGER NOTAS_CREDITO_PROVEEDOR_AU
AS
declare variable ABONOS char(1);
declare variable consec INTEGER;
declare variable COSTO NUMERIC(18,2);
declare variable EXISTENCIA NUMERIC(18,4);
declare variable CODBOD VARCHAR(3);
BEGIN
if (new.ncpr_anulado = 'S') then
    begin
    select enco_consec from comprobante_encabezado where enco_tiporef = 52 and enco_idref = old.ncpr_id into :consec;
    if (NOT consec is null) then
      delete from comprobante_detalle where enco_consec = :consec;
    delete from comprobante_encabezado where enco_tiporef = 52 and enco_idref = old.ncpr_id;
    INSERT INTO AUDITORIA (AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
        VALUES (USER, 52, new.ncpr_id, 'A', NEW.pref_pre || NEW.ncpr_numero);
    end

/* BORRE EL REGISTRO PREVIO */
if ((old.ncpr_id <> 0) and (old.ncpr_anulado = 'N')) then
    begin
    /* Verifique si habia abonos a la nota */
    ABONOS = 'N';
    select 'S' FROM SALDOS_DOC_CXPAGAR WHERE SDCP_TIPOREF = 52 AND SDCP_IDREF = OLD.NCPR_ID AND SDCP_ABONO <> 0 INTO :ABONOS;
    if (ABONOS = 'N') then
        BEGIN
        /* BORRE EL REGISTRO PREVIO */
        delete from saldos_doc_cxpagar where sdcp_tiporef = 52 and sdcp_idref = old.ncpr_id;
        delete from movimiento_PROVEEDOR where (mvpr_tiporef = 52) and (mvpr_idref = old.ncpr_id);
        delete from movimiento_articulo where  (mvar_tipodoc = 52) and (mvar_idref = old.ncpr_id);
        END
    else
        exception DOCUMENTO_CON_ABONOS 'El descuento de proveedor ' || old.pref_pre || old.ncpr_numero || ' tiene abonos registrados.';
    end
if ((new.ncpr_id <> 0) and (new.ncpr_anulado = 'N')) then
    begin
    /* Registre el nuevo saldo del documento */
    INSERT INTO SALDOS_DOC_CXPAGAR (SDCP_TIPOREF, SDCP_IDREF, SDCP_FECHA, TERC_NIT, SDCP_RTEFTE, SDCP_RTIVA, SDCP_RTICA, SDCP_ABONO, SDCP_ABRTFTE, SDCP_ABRTIVA, SDCP_ABRTICA, SDCP_DEBITO, SDCP_MONTO, SDCP_TRM)
        VALUES (52, NEW.NCPR_ID, NEW.ncpr_fecha, NEW.terc_nit, (NEW.ncpr_rtftemonto * -1), (NEW.ncpr_rtivamonto * -1), (NEW.ncpr_rticamonto * -1), 0, 0, 0, 0, 'N', (NEW.ncpr_monto+NEW.ncpr_ivamonto)*-1, NEW.ncpr_trm);
    /* Registre el movimiento del proveedor */
    INSERT INTO MOVIMIENTO_PROVEEDOR (MVPR_ID, TERC_NIT, MVPR_TIPOREF, MVPR_IDREF, MVPR_FECHA, MVPR_VENCE, MVPR_CONC, MVPR_MONTO, MVPR_RTFTE, MVPR_RTIVA, MVPR_RTICA, MVPR_DEBITO, MVPR_ABONO, MVPR_PREFIJO, MVPR_NUMERO, MVPR_TRM)
        VALUES (GEN_ID(ID_MOVPROV, 1), NEW.TERC_NIT, 52, NEW.NCPR_ID, NEW.NCPR_FECHA, NEW.NCPR_FECHA, NEW.NCPR_CONC, NEW.NCPR_MONTO+NEW.ncpr_ivamonto, NEW.NCPR_RTFTEMONTO, NEW.NCPR_RTIVAMONTO, NEW.NCPR_RTICAMONTO, 'N', 'N', NEW.pref_pre, NEW.ncpr_numero, NEW.ncpr_trm);
    /* afecte el articulo */
    if (new.arti_cod <> '') then
        begin
        /* CALCULE EL NUEVO COSTO */
        execute procedure costo_promedio (new.arti_cod, new.ncpr_fecha) returning_values (:COSTO);
        execute procedure saldo_total_inventario (new.arti_cod, new.ncpr_fecha) returning_values (:EXISTENCIA);
        COSTO = ((COSTO * EXISTENCIA) - NEW.ncpr_monto) / EXISTENCIA;
        FOR SELECT DISTINCT BODE_COD FROM EXISTENCIA WHERE ARTI_COD = NEW.ARTI_COD INTO :CODBOD do
            BEGIN
            execute procedure saldo_inventario (new.arti_cod, :CODBOD, new.ncpr_fecha) returning_values (:EXISTENCIA);
            if (EXISTENCIA <> 0) then
                BEGIN
                /* SAQUE TODO LO QUE TENGA */
                INSERT INTO MOVIMIENTO_ARTICULO
                    (ARTI_COD, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM, TERC_NIT)
                    VALUES(NEW.ARTI_COD, :CODBOD, new.ncpr_fecha, 52, NEW.ncpr_id,
                    new.ncpr_conc, :EXISTENCIA, 0, 'N', '', new.pref_pre, new.ncpr_numero, 1, new.terc_nit);
                end
            END
        FOR SELECT DISTINCT BODE_COD, MVAR_CANT FROM MOVIMIENTO_ARTICULO WHERE MVAR_TIPODOC = 52 AND MVAR_IDREF = NEW.ncpr_id
            INTO :CODBOD, :existencia do
            BEGIN
            /* META TODO CON EL NUEVO COSTO */
            INSERT INTO MOVIMIENTO_ARTICULO
                (ARTI_COD, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM, TERC_NIT)
                VALUES(NEW.ARTI_COD, :CODBOD, new.ncpr_fecha, 52, NEW.ncpr_id,
                new.ncpr_conc, :EXISTENCIA, :COSTO, 'S', '', new.pref_pre, new.ncpr_numero, 1, new.terc_nit);
            END
        /* RECORRA LAS LISTAS DE PRECIOS Y CAMBIE EL PRECIO */
        EXECUTE PROCEDURE CALCULA_PRECIOS(NEW.ARTI_COD, new.ncpr_fecha);
        end
    INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
        VALUES (USER, 52, NEW.ncpr_id, 'U', NEW.pref_pre || NEW.ncpr_numero);
    end
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER TRIGGER NOTAS_DEBITO_PROVEEDOR_AI
AS
declare variable COSTO NUMERIC(18,2);
declare variable EXISTENCIA NUMERIC(18,4);
declare variable CODBOD VARCHAR(3);
BEGIN
  if ((NEW.NDPR_ID <> 0) and (new.ndpr_anulado = 'N')) then
    BEGIN
    INSERT INTO SALDOS_DOC_CXPAGAR (SDCP_TIPOREF, SDCP_IDREF, SDCP_FECHA, TERC_NIT, SDCP_RTEFTE, SDCP_RTIVA, SDCP_RTICA, SDCP_ABONO, SDCP_ABRTFTE, SDCP_ABRTIVA, SDCP_ABRTICA, SDCP_DEBITO, SDCP_MONTO, SDCP_TRM)
        VALUES (51, NEW.NDPR_ID, NEW.ndpr_fecha, NEW.terc_nit, NEW.ndpr_rtftemonto, NEW.ndpr_rtivamonto, NEW.ndpr_rticamonto, 0, 0, 0, 0, 'S', NEW.ndpr_monto+NEW.ndpr_ivamonto, NEW.ndpr_trm);
    /* Registre el movimiento del proveedor */
    INSERT INTO MOVIMIENTO_PROVEEDOR (MVPR_ID, TERC_NIT, MVPR_TIPOREF, MVPR_IDREF, MVPR_FECHA, MVPR_VENCE, MVPR_CONC, MVPR_MONTO, MVPR_RTFTE, MVPR_RTIVA, MVPR_RTICA, MVPR_DEBITO, MVPR_ABONO, MVPR_PREFIJO, MVPR_NUMERO, MVPR_TRM)
      VALUES (GEN_ID(ID_MOVPROV, 1), NEW.TERC_NIT, 51, NEW.NDPR_ID, NEW.NDPR_FECHA, NEW.NDPR_VENCE, NEW.NDPR_CONC, NEW.NDPR_MONTO+NEW.ndpr_Ivamonto, NEW.NDPR_RTFTEMONTO, NEW.NDPR_RTIVAMONTO, NEW.NDPR_RTICAMONTO, 'S', 'N', NEW.pref_pre, NEW.ndpr_numero, NEW.ndpr_trm);
    /* afecte el articulo */
    if (new.arti_cod <> '') then
        begin
        /* CALCULE EL NUEVO COSTO */
        execute procedure costo_promedio (new.arti_cod, new.ndpr_fecha) returning_values (:COSTO);
        execute procedure saldo_total_inventario (new.arti_cod, new.ndpr_fecha) returning_values (:EXISTENCIA);
        COSTO = (COSTO * EXISTENCIA + (NEW.ndpr_monto)) / EXISTENCIA;
        FOR SELECT DISTINCT BODE_COD FROM EXISTENCIA WHERE ARTI_COD = NEW.ARTI_COD INTO :CODBOD do
            BEGIN
            execute procedure saldo_inventario (new.arti_cod, :CODBOD, new.ndpr_fecha) returning_values (:EXISTENCIA);
            if (existencia <> 0) then
                BEGIN
                /* SAQUE TODO LO QUE TENGA */
                INSERT INTO MOVIMIENTO_ARTICULO
                  (ARTI_COD, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM, TERC_NIT)
                  VALUES(NEW.ARTI_COD, :CODBOD, new.ndpr_fecha, 51, NEW.ndpr_id,
                  new.ndpr_conc, :EXISTENCIA, 0, 'N', '', new.pref_pre, new.ndpr_numero, 1, new.terc_nit);
                END
            END
        FOR SELECT DISTINCT BODE_COD, MVAR_CANT FROM MOVIMIENTO_ARTICULO WHERE MVAR_TIPODOC = 51 AND MVAR_IDREF = NEW.ndpr_id
            INTO :CODBOD, :existencia do
            BEGIN
            /* META TODO CON EL NUEVO COSTO */
            INSERT INTO MOVIMIENTO_ARTICULO
              (ARTI_COD, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM, TERC_NIT)
              VALUES(NEW.ARTI_COD, :CODBOD, new.ndpr_fecha, 51, NEW.ndpr_id,
              new.ndpr_conc, :EXISTENCIA, :COSTO, 'S', '', new.pref_pre, new.ndpr_numero, 1, new.terc_nit);
            END
        /* RECORRA LAS LISTAS DE PRECIOS Y CAMBIE EL PRECIO */
        EXECUTE PROCEDURE CALCULA_PRECIOS(NEW.ARTI_COD, new.ndpr_fecha);
        end
    INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
        VALUES (USER, 51, NEW.ndpr_id, 'I', NEW.pref_pre || NEW.ndpr_numero);
    END
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER TRIGGER NOTAS_DEBITO_PROVEEDOR_AU
AS
declare variable ABONOS char(1);
declare variable consec INTEGER;
declare variable COSTO NUMERIC(18,2);
declare variable EXISTENCIA NUMERIC(18,4);
declare variable CODBOD VARCHAR(3);
BEGIN
if (new.ndpr_anulado = 'S') then
    begin
    select enco_consec from comprobante_encabezado where enco_tiporef = 51 and enco_idref = old.ndpr_id into :consec;
    if (NOT consec is null) then
      delete from comprobante_detalle where enco_consec = :consec;
    delete from comprobante_encabezado where enco_tiporef = 51 and enco_idref = old.ndpr_id;
    INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
        VALUES (USER, 51, NEW.ndpr_id, 'A', NEW.pref_pre || NEW.ndpr_numero);
    end

/* BORRE EL REGISTRO PREVIO */
if ((old.ndpr_id <> 0) and (old.ndpr_anulado = 'N')) then
    begin
    /* Verifique si habia abonos a la nota */
    ABONOS = 'N';
    select 'S' FROM SALDOS_DOC_CXPAGAR WHERE SDCP_TIPOREF = 51 AND SDCP_IDREF = OLD.NDPR_ID AND SDCP_ABONO <> 0 INTO :ABONOS;
    if (ABONOS = 'N') then
        BEGIN
        /* BORRE EL REGISTRO PREVIO */
        delete from saldos_doc_cxpagar where sdcp_tiporef = 51 and sdcp_idref = old.ndpr_id;
        delete from movimiento_PROVEEDOR where (mvpr_tiporef = 51) and (mvpr_idref = old.ndpr_id);
        delete from movimiento_articulo where  (mvar_tipodoc = 51) and (mvar_idref = old.ndpr_id);
        END
    else
        exception DOCUMENTO_CON_ABONOS 'El cargo de proveedor ' || old.pref_pre || old.ndpr_numero || ' tiene abonos registrados.';
    end
if ((new.ndpr_id <> 0) and (new.ndpr_anulado = 'N')) then
    begin
    /* Registre el nuevo saldo del documento */
    INSERT INTO SALDOS_DOC_CXPAGAR (SDCP_TIPOREF, SDCP_IDREF, SDCP_FECHA, TERC_NIT, SDCP_RTEFTE, SDCP_RTIVA, SDCP_RTICA, SDCP_ABONO, SDCP_ABRTFTE, SDCP_ABRTIVA, SDCP_ABRTICA, SDCP_DEBITO, SDCP_MONTO, SDCP_TRM)
        VALUES (51, NEW.NDPR_ID, NEW.ndpr_fecha, NEW.terc_nit, NEW.ndpr_rtftemonto, NEW.ndpr_rtivamonto, NEW.ndpr_rticamonto, 0, 0, 0, 0, 'N', NEW.ndpr_monto+NEW.ndpr_ivamonto, NEW.ndpr_trm);
    /* Registre el movimiento del proveedor */
    INSERT INTO MOVIMIENTO_PROVEEDOR (MVPR_ID, TERC_NIT, MVPR_TIPOREF, MVPR_IDREF, MVPR_FECHA, MVPR_VENCE, MVPR_CONC, MVPR_MONTO, MVPR_RTFTE, MVPR_RTIVA, MVPR_RTICA, MVPR_DEBITO, MVPR_ABONO, MVPR_PREFIJO, MVPR_NUMERO, MVPR_TRM)
        VALUES (GEN_ID(ID_MOVPROV, 1), NEW.TERC_NIT, 51, NEW.NDPR_ID, NEW.NDPR_FECHA, NEW.ndpr_vence, NEW.NDPR_CONC, NEW.NDPR_MONTO+NEW.ndpr_ivamonto, NEW.NDPR_RTFTEMONTO, NEW.NDPR_RTIVAMONTO, NEW.NDPR_RTICAMONTO, 'S', 'N', NEW.pref_pre, NEW.ndpr_numero, NEW.ndpr_trm);
    if (new.arti_cod <> '') then
        begin
        /* CALCULE EL NUEVO COSTO */
        execute procedure costo_promedio (new.arti_cod, new.ndpr_fecha) returning_values (:COSTO);
        execute procedure saldo_total_inventario (new.arti_cod, new.ndpr_fecha) returning_values (:EXISTENCIA);
        COSTO = (COSTO * EXISTENCIA + (NEW.ndpr_monto)) / EXISTENCIA;
        FOR SELECT DISTINCT BODE_COD FROM EXISTENCIA WHERE ARTI_COD = NEW.ARTI_COD INTO :CODBOD do
            BEGIN
            execute procedure saldo_inventario (new.arti_cod, :CODBOD, new.ndpr_fecha) returning_values (:EXISTENCIA);
            if (existencia <> 0) then
                BEGIN
                /* SAQUE TODO LO QUE TENGA */
                INSERT INTO MOVIMIENTO_ARTICULO
                  (ARTI_COD, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM, TERC_NIT)
                  VALUES(NEW.ARTI_COD, :CODBOD, new.ndpr_fecha, 51, NEW.ndpr_id,
                  new.ndpr_conc, :EXISTENCIA, 0, 'N', '', new.pref_pre, new.ndpr_numero, 1, new.terc_nit);
                END
            END
        FOR SELECT DISTINCT BODE_COD, MVAR_CANT FROM MOVIMIENTO_ARTICULO WHERE MVAR_TIPODOC = 51 AND MVAR_IDREF = NEW.ndpr_id
            INTO :CODBOD, :existencia do
            BEGIN
            /* META TODO CON EL NUEVO COSTO */
            INSERT INTO MOVIMIENTO_ARTICULO
              (ARTI_COD, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM, TERC_NIT)
              VALUES(NEW.ARTI_COD, :CODBOD, new.ndpr_fecha, 51, NEW.ndpr_id,
              new.ndpr_conc, :EXISTENCIA, :COSTO, 'S', '', new.pref_pre, new.ndpr_numero, 1, new.terc_nit);
            END
        /* RECORRA LAS LISTAS DE PRECIOS Y CAMBIE EL PRECIO */
        EXECUTE PROCEDURE CALCULA_PRECIOS(NEW.ARTI_COD, new.ndpr_fecha);
        end
    INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
        VALUES (USER, 51, NEW.ndpr_id, 'U', NEW.pref_pre || NEW.ndpr_numero);
    end
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER TRIGGER REMISION_PROVEEDOR_DET_AI
AS
declare variable fec date;
declare variable CONC VARCHAR(60);
declare variable factor numeric(18,4);
declare variable Pref varchar(4);
declare variable Num varchar(6);
declare variable EXISTE CHAR(1);
declare variable NIT VARCHAR(20);
declare variable NUMPROV VARCHAR(20);
declare variable Tipo Integer;
declare variable idfact integer;
declare variable numrows integer;
declare variable IVAINC CHAR(2);
declare variable ICOINC CHAR(2);
declare variable COSTO NUMERIC(18,2);
declare variable CANTREL NUMERIC(18,4);
declare variable NUMPED VARCHAR(30);
declare variable CONSO CHAR(2);
declare variable CONSOLIDA INTEGER;
declare variable DTOPIE NUMERIC(18,2);
declare variable ADICIONAL NUMERIC(18,2);
declare variable TOTAL NUMERIC(18,2);
declare variable IVAMONTO NUMERIC(18,2);
declare variable EXTRA NUMERIC(18,2);
declare variable FACT NUMERIC(18,4);
declare variable MENORV CHAR(2);
declare variable CEROS CHAR(2);
declare variable ACTREM CHAR(2);
BEGIN
  if ((NEW.repr_id <> 0) and (new.rpvd_anulado = 'N')) then
    BEGIN
    select max(rprd_tiporel), max(rprd_idrel) from remision_proveedor_docrela
        where repr_id = new.repr_id into :Tipo, :idfact;
    if (Tipo is null) then
        Tipo = 0;
    /* si se hizo con base en una factura que afecto el inventario no afecte inventario */
    numrows = 0;
    if (Tipo = 21) Then
        select count(*) from movimiento_articulo where mvar_tipodoc = 21 and mvar_idref = :idfact into :numrows;
    if (numrows is null) then
        numrows = 0;
    if (numrows = 0) then
        begin
        select repr_fecha, pref_pre, repr_numero, REPR_IMPTOS, terc_nit, REPR_NUMPROV, REPR_ORDEN, REPR_CONSOLIDA, repr_dtomonto, repr_adicional, repr_total, repr_ivamonto, repr_extra
            from remision_proveedor where repr_id = new.repr_id
            into :fec, :Pref, :Num, :IVAINC, :NIT, :NUMPROV, :numped, :CONSOLIDA, :dtopie, :adicional, :total, :ivamonto, :extra;
        execute procedure factor_unidad_cant(new.arti_cod, new.rpvd_unidad) returning_values(factor);
        CONC = 'REMISION PROVEEDOR No.' || PREF || NUM || '-' || NUMPROV;
        if (numped <> '') then
            conc = conc || '-ORDEN ' || NUMPED;
        COSTO = ((new.rpvd_prunit - NEW.rpvd_dtomonto) / :factor);
        if (IVAINC = 'S') then
            BEGIN
            EXECUTE PROCEDURE lee_configuracion ('FACTURACION', 'ARTICULOS', 'IMPOCONSUMO INCLUIDO EN EL PRECIO BASE DE VENTA ANTES DE IVA') returning_values(:icoinc);
            if (icoinc = 'SI') then
                COSTO = COSTO - (NEW.rpvd_consumo/(NEW.rpvd_cant * new.rpvd_factor));
            COSTO = COSTO / (1 + NEW.rpvd_ivaporc/100);
            END
        EXECUTE PROCEDURE lee_configuracion('COMPRAS','FACTURAS','DESCUENTO Y VALOR ADICIONAL DEL DOCUMENTO COMO MENOR VALOR DEL COSTO') returning_values (:MENORV);
        if (MENORV = 'SI') then
            BEGIN
            FACT = (TOTAL - EXTRA - IVAMONTO);
            if ((FACT - ADICIONAL + DTOPIE) <> 0) then
                FACT = FACT / (FACT - ADICIONAL + DTOPIE);
            ELSE
                FACT = 1;
            COSTO = COSTO * FACT;
            END
        if (COSTO = 0) then
            BEGIN
            EXECUTE PROCEDURE lee_configuracion('COMPRAS', 'REMISIONES', 'PERMITIR CEROS EN COSTOS DE MERCANCIA') returning_values (:ceros);
            EXECUTE PROCEDURE lee_configuracion('COMPRAS', 'FACTURAS', 'ACTUALIZAR COSTOS DE LA REMISION RELACIONADA AL GRABAR LA FACTURA') returning_values (:ACTREM);
            if ((ACTREM = 'SI') and (CEROS = 'NO')) then
                execute procedure costo_promedio(NEW.arti_cod, :fec) returning_values (:COSTO);
            END
        INSERT INTO MOVIMIENTO_ARTICULO
          (ARTI_COD, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM, TERC_NIT)
          VALUES(NEW.ARTI_COD, NEW.BODE_COD, :FEC, 22, NEW.repr_id,
          :CONC, :factor * new.rpvd_cant, :COSTO, 'S', new.rpvd_lote, :Pref, :Num, new.rpvd_item, :Nit);

        /* RECORRA LAS LISTAS DE PRECIOS Y CAMBIE EL PRECIO */
        EXECUTE PROCEDURE CALCULA_PRECIOS(NEW.ARTI_COD, :FEC);

        if (COSTO > 0 ) then
         BEGIN
          /* GRABE PROV X ARTICULO */
          EXISTE = 'N';
          SELECT 'S' FROM PROVEEDOR_ARTICULO WHERE TERC_NIT = :NIT AND ARTI_COD = NEW.ARTI_COD INTO :EXISTE;
          if (EXISTE = 'S') then
            UPDATE PROVEEDOR_ARTICULO 
                SET PVAR_FECHA = :FEC, PVAR_COSTO = :COSTO, PVAR_COD = NEW.rpvd_codprov
                WHERE TERC_NIT = :NIT AND ARTI_COD = NEW.ARTI_COD;
          ELSE
            INSERT INTO PROVEEDOR_ARTICULO (TERC_NIT, ARTI_COD, PVAR_COSTO, PVAR_FECHA, PVAR_COD,PVAR_DES)
                VALUES (:NIT, NEW.ARTI_COD, :COSTO, :FEC, NEW.rpvd_codprov,NEW.rpvd_desc);
         END
        end

    /* ACTUALICE EL PENDIENTE  */
    if (CONSOLIDA <> 0) then
        BEGIN
        EXECUTE PROCEDURE LEE_CONFIGURACION ('COMPRAS','DOCUMENTOS','SUMAR CANTIDADES PENDIENTES AL CONSOLIDAR DOCUMENTOS') returning_values (CONSO);
        SELECT MIN(CEFA_TIPOORI) FROM consolide_faltantes WHERE CEFA_ID = :CONSOLIDA INTO :NUMROWS;
        if (NUMROWS = 23) then
            BEGIN
            EXECUTE PROCEDURE LEE_CONFIGURACION('COMPRAS', 'REMISIONES', 'VERIFICAR CODIGOS DE LA ORDEN') returning_values (MENORV);
            if (MENORV = 'SI') then
                CONSO = 'NO';
            END
        SELECT COUNT(CEFA_ITEM) FROM consolide_faltantes WHERE CEFA_ID = :CONSOLIDA INTO :NUMROWS;
        if ((CONSO = 'SI') AND (NUMROWS > 1)) then
            UPDATE consolidado_faltantes SET COFA_OK = 'S' WHERE COFA_ID = :consolida;
        ELSE
            BEGIN
            /* BUSQUE EL CONSOLIDADO EN EL MISMO ITEM Y SI ES DIFERENTE ACTUALICELO */
            select COFA_CANT * COFA_FACTOR FROM consolidado_faltantes WHERE COFA_ID = :consolida AND COFA_ITEM = NEW.RPVD_ITEM AND ARTI_COD = NEW.arti_cod INTO :CANTREL;
            if (NEW.RPVD_CANT * NEW.RPVD_FACTOR < CANTREL) then
                UPDATE consolidado_faltantes SET COFA_IDDES = NEW.repr_id, COFA_CANT = NEW.RPVD_CANT, COFA_FACTOR = NEW.RPVD_FACTOR
                    WHERE COFA_ID = :consolida AND COFA_ITEM = NEW.RPVD_ITEM AND ARTI_COD = NEW.arti_cod;
            ELSE
                UPDATE consolidado_faltantes SET COFA_IDDES = NEW.repr_id, COFA_OK = 'S' WHERE COFA_ID = :consolida AND COFA_ITEM = NEW.RPVD_ITEM AND ARTI_COD = NEW.arti_cod;
            END
        END
    /* ACTUALICE EL STAND */
    if (new.rpvd_stand is not null) then
      if (exists(select stand_cod from stands where arti_cod = new.arti_cod and stand_bodega = new.bode_cod)) then
        UPDATE stands set stand_cod = new.rpvd_stand where arti_cod = new.arti_cod and stand_bodega = new.bode_cod;
      else
        INSERT INTO stands (ARTI_COD, STAND_BODEGA, STAND_COD) VALUES (NEW.arti_cod, NEW.bode_cod, NEW.rpvd_stand);
    END
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER TRIGGER REMISION_PROVEEDOR_DET_AU
AS
declare variable fec date;
declare variable CONC VARCHAR(60);
declare variable Pref varchar(4);
declare variable Num varchar(6);
declare variable factor numeric(18,4);
declare variable EXISTE CHAR(1);
declare variable NIT VARCHAR(20);
declare variable NUMPROV VARCHAR(20);
declare variable Tipo integer;
declare variable idfact integer;
declare variable numrows integer;
declare variable IVAINC CHAR(2);
declare variable ICOINC CHAR(2);
declare variable COSTO NUMERIC(18,2);
declare variable CANTREL NUMERIC(18,4);
declare variable NUMPED VARCHAR(30);
declare variable CONSO CHAR(2);
declare variable CONSOLIDA INTEGER;
declare variable DTOPIE NUMERIC(18,2);
declare variable ADICIONAL NUMERIC(18,2);
declare variable TOTAL NUMERIC(18,2);
declare variable IVAMONTO NUMERIC(18,2);
declare variable EXTRA NUMERIC(18,2);
declare variable FACT NUMERIC(18,4);
declare variable MENORV CHAR(2);
declare variable CEROS CHAR(2);
declare variable ACTREM CHAR(2);
BEGIN
if ((OLD.repr_id <> 0) AND (OLD.rpvd_anulado = 'N')) then
    begin
    DELETE FROM MOVIMIENTO_ARTICULO WHERE (mvar_tipodoc = 22) and (mvar_idref = new.repr_id) and (mvar_item = old.rpvd_item);
    select REPR_CONSOLIDA from remision_proveedor where repr_id = old.repr_id into :CONSOLIDA;
    if (CONSOLIDA <> 0) then
        begin
        EXECUTE PROCEDURE LEE_CONFIGURACION ('COMPRAS','DOCUMENTOS','SUMAR CANTIDADES PENDIENTES AL CONSOLIDAR DOCUMENTOS') returning_values (CONSO);
        SELECT COUNT(CEFA_ITEM) FROM consolide_faltantes WHERE CEFA_ID = :CONSOLIDA INTO :NUMROWS;
        if ((NUMROWS = 1) OR (CONSO = 'NO')) then
            UPDATE consolidado_faltantes SET COFA_OK = 'N' WHERE COFA_ID = :consolida AND COFA_ITEM = old.RPVD_ITEM AND ARTI_COD = old.arti_cod;
        else
            UPDATE consolidado_faltantes SET COFA_OK = 'N' WHERE COFA_ID = :consolida;
        END
    end
/* Registre el nuevo */
if ((new.repr_id <> 0) AND (new.rpvd_anulado = 'N')) then
    begin
    select repr_fecha, pref_pre, repr_numero, repr_imptos, terc_nit, REPR_NUMPROV, REPR_ORDEN, REPR_CONSOLIDA, repr_dtomonto, repr_adicional, repr_total, repr_ivamonto, repr_extra
        from remision_proveedor where repr_id = new.repr_id
        into :fec, :Pref, :Num, :IVAINC, :NIT, :NUMPROV, :numped, :CONSOLIDA, :dtopie, :adicional, :total, :ivamonto, :extra;
    CONC = 'REMISION PROVEEDOR No.' || PREF || NUM || '-' || NUMPROV;
    if (numped <> '') then
        conc = conc || '-ORDEN ' || NUMPED;
    SELECT MAX(CEFA_TIPOORI) FROM consolide_faltantes WHERE CEFA_ID = :CONSOLIDA INTO :TIPO;
    if (Tipo is null) then
        Tipo = 0;
    select FACO_ID from FACTURAS_COMPRA WHERE FACO_CONSOLIDA = :consolida INTO :IDFACT;
    if (Idfact is null) then
        Idfact = 0;
    /* si se hizo con base en una factura que afecto el inventario no afecte inventario */
    numrows = 0;
    if (Tipo = 21) Then
        select count(*) from movimiento_articulo where mvar_tipodoc = 21 and mvar_idref = :idfact into :numrows;
    if (numrows is null) then
        numrows = 0;
    if (numrows = 0) then
        begin
        execute procedure factor_unidad_cant(new.arti_cod, new.rpvd_unidad) returning_values(factor);
        COSTO = ((new.rpvd_prunit - NEW.rpvd_dtomonto) / :factor);
        if (IVAINC = 'S') then
            BEGIN
            EXECUTE PROCEDURE lee_configuracion ('FACTURACION', 'ARTICULOS', 'IMPOCONSUMO INCLUIDO EN EL PRECIO BASE DE VENTA ANTES DE IVA') returning_values(:icoinc);
            if (icoinc = 'SI') then
                COSTO = COSTO - (NEW.rpvd_consumo/(NEW.rpvd_cant * new.rpvd_factor));
            COSTO = COSTO / (1 + NEW.rpvd_ivaporc/100);
            END
        EXECUTE PROCEDURE lee_configuracion('COMPRAS','FACTURAS','DESCUENTO Y VALOR ADICIONAL DEL DOCUMENTO COMO MENOR VALOR DEL COSTO') returning_values (:MENORV);
        if (MENORV = 'SI') then
            BEGIN
            FACT = (TOTAL - EXTRA - IVAMONTO);
            if ((FACT - ADICIONAL + DTOPIE) <> 0) then
                FACT = FACT / (FACT - ADICIONAL + DTOPIE);
            ELSE
                FACT = 1;
            COSTO = COSTO * FACT;
            END
        if (COSTO = 0) then
            BEGIN
            EXECUTE PROCEDURE lee_configuracion('COMPRAS', 'REMISIONES', 'PERMITIR CEROS EN COSTOS DE MERCANCIA') returning_values (:ceros);
            EXECUTE PROCEDURE lee_configuracion('COMPRAS', 'FACTURAS', 'ACTUALIZAR COSTOS DE LA REMISION RELACIONADA AL GRABAR LA FACTURA') returning_values (:ACTREM);
            if ((ACTREM = 'SI') and (CEROS = 'NO')) then
                execute procedure costo_promedio(NEW.arti_cod, :fec) returning_values (:COSTO);
            END
        INSERT INTO MOVIMIENTO_ARTICULO
            (ARTI_COD, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM, TERC_NIT)
            VALUES(NEW.ARTI_COD, NEW.BODE_COD, :FEC, 22, NEW.repr_id,
            :CONC, :factor * new.rpvd_cant, :COSTO, 'S', new.rpvd_lote, :Pref, :Num, new.rpvd_item, :Nit);
            
        /* RECORRA LAS LISTAS DE PRECIOS Y CAMBIE EL PRECIO */
        EXECUTE PROCEDURE CALCULA_PRECIOS(NEW.ARTI_COD, :FEC);
          
        if (COSTO > 0 ) then
         BEGIN
          /* GRABE PROV X ARTICULO */
          EXISTE = 'N';
          SELECT 'S' FROM PROVEEDOR_ARTICULO WHERE TERC_NIT = :NIT AND ARTI_COD = NEW.ARTI_COD INTO :EXISTE;
          if (EXISTE = 'S') then
            UPDATE PROVEEDOR_ARTICULO
                SET PVAR_FECHA = :FEC, PVAR_COSTO = :COSTO, PVAR_COD = NEW.rpvd_codprov
                WHERE TERC_NIT = :NIT AND ARTI_COD = NEW.ARTI_COD;
          ELSE
            INSERT INTO PROVEEDOR_ARTICULO (TERC_NIT, ARTI_COD, PVAR_COSTO, PVAR_FECHA, PVAR_COD,PVAR_DES)
                VALUES (:NIT, NEW.ARTI_COD, :COSTO, :FEC, NEW.rpvd_codprov,NEW.rpvd_desc);
         END
        end
    if (CONSOLIDA <> 0) then
        BEGIN
        EXECUTE PROCEDURE LEE_CONFIGURACION ('COMPRAS','DOCUMENTOS','SUMAR CANTIDADES PENDIENTES AL CONSOLIDAR DOCUMENTOS') returning_values (CONSO);
        /* IGNORE LA CONSOLIDACION SI SE VALIDAN CODIGOS DE LA ORDEN */
        SELECT MIN(CEFA_TIPOORI) FROM consolide_faltantes WHERE CEFA_ID = :CONSOLIDA INTO :NUMROWS;
        if (NUMROWS = 23) then
            BEGIN
            EXECUTE PROCEDURE LEE_CONFIGURACION('COMPRAS', 'REMISIONES', 'VERIFICAR CODIGOS DE LA ORDEN') returning_values (MENORV);
            if (MENORV = 'SI') then
                CONSO = 'NO';
            END
        SELECT COUNT(CEFA_ITEM) FROM consolide_faltantes WHERE CEFA_ID = :CONSOLIDA INTO :NUMROWS;
        if ((CONSO = 'SI') AND (NUMROWS > 1)) then
            UPDATE consolidado_faltantes SET COFA_IDDES = NEW.repr_id, COFA_OK = 'S' WHERE COFA_ID = :consolida;
        ELSE
            BEGIN
            /* BUSQUE EL CONSOLIDADO EN EL MISMO ITEM Y SI ES DIFERENTE ACTUALICELO */
            select COFA_CANT * COFA_FACTOR FROM consolidado_faltantes WHERE COFA_ID = :consolida AND COFA_ITEM = NEW.RPVD_ITEM AND ARTI_COD = NEW.arti_cod INTO :CANTREL;
            if (NEW.RPVD_CANT * NEW.RPVD_FACTOR < CANTREL) then
                UPDATE consolidado_faltantes SET COFA_IDDES = NEW.repr_id, COFA_CANT = NEW.RPVD_CANT, COFA_FACTOR = NEW.RPVD_FACTOR
                    WHERE COFA_ID = :consolida AND COFA_ITEM = NEW.RPVD_ITEM AND ARTI_COD = NEW.arti_cod;
            else
                UPDATE consolidado_faltantes SET COFA_IDDES = NEW.repr_id, COFA_OK = 'S' WHERE COFA_ID = :consolida AND COFA_ITEM = NEW.RPVD_ITEM AND ARTI_COD = NEW.arti_cod;
            END
        END
    /* ACTUALICE EL STAND */
    if (new.rpvd_stand is not null) then
      if (exists(select stand_cod from stands where arti_cod = new.arti_cod and stand_bodega = new.bode_cod)) then
        UPDATE stands set stand_cod = new.rpvd_stand where arti_cod = new.arti_cod and stand_bodega = new.bode_cod;
      else
        INSERT INTO stands (ARTI_COD, STAND_BODEGA, STAND_COD) VALUES (NEW.arti_cod, NEW.bode_cod, NEW.rpvd_stand);
    END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure COSTO_PROMEDIO_Y_ULTIMO_UNIDAD (
    ARTICULO varchar(15),
    FECHA date,
    UNIDAD varchar(8))
returns (
    COSTOP numeric(18,2),
    UCOSTO numeric(18,2))
AS
declare variable saldop numeric(18,2);
declare variable saldoc numeric(15,4);
declare variable entp numeric(18,2);
declare variable entc numeric(15,4);
declare variable FACTOR NUMERIC(15,4);
BEGIN
SELECT first 1 COST_SALDOP, COST_ENTP,COST_SALDOC, COST_ENTC, COST_ULTIMO FROM COSTOS
    WHERE (ARTI_COD = :ARTICULO) AND (COST_FECHA <= :FECHA)
    order by ARTI_COD DESC, COST_FECHA DESC, cost_item desc
    INTO :SALDOP, ENTP, :SALDOC, ENTC, :UCOSTO;
IF (SALDOC IS NULL) THEN
    BEGIN
    COSTOP = 0;
    UCOSTO = 0;
    END
ELSE
    if ((SALDOC < 0) AND (SALDOC+ENTC > 0)) then
        COSTOP = ENTP/ENTC;
    else
        /* Cuando hay existencia calcule el promedio, de otra manera retorne el ultimo */
        if (SALDOC+ENTC > 0) then
            COSTOP = (SALDOP+ENTP) / (SALDOC+ENTC);
        else
            COSTOP = UCOSTO;
EXECUTE PROCEDURE FACTOR_UNIDAD_CANT(ARTICULO, UNIDAD) returning_values (FACTOR);
COSTOP = COSTOP * FACTOR;
UCOSTO = UCOSTO * FACTOR;
SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE EXISTENCIAS_DESDE_HASTA(
    FECHA DATE,
    ARTINI VARCHAR(20),
    ARTFIN VARCHAR(20),
    GRPINI VARCHAR(3),
    GRPFIN VARCHAR(3),
    BODINI VARCHAR(2),
    BODFIN VARCHAR(2),
    ORDEN CHAR(1),
    AGRUPA CHAR(1),
    DETALLE CHAR(1),
    RESERVA CHAR(1),
    ENPESO CHAR(1),
    MASIVA CHAR(1),
    SUCURSAL INTEGER)
RETURNS (
    CANT NUMERIC(18,4),
    COSTO NUMERIC(18,2),
    COSTO_LOTE NUMERIC(18,2),
    CODIGO VARCHAR(15),
    NOMBRE VARCHAR(60),
    UNIDAD VARCHAR(8),
    STAND VARCHAR(20),
    CODGRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    CODSUBG VARCHAR(3),
    NOMSUBG VARCHAR(30),
    CODMARC VARCHAR(3),
    NOMMARC VARCHAR(30),
    CODBOD VARCHAR(2),
    LOTE VARCHAR(15),
    NOMBOD VARCHAR(30),
    COSTOTOT NUMERIC(18,2),
    ULTCOSTO NUMERIC(18,2),
    FECHACOSTO DATE,
    CONSUMO NUMERIC(18,2),
    RESERVADO NUMERIC(18,4),
    ORDENADO NUMERIC(18,4),
    IVA NUMERIC(9,2),
    PESOUNIT NUMERIC(18,4),
    PESOTOTAL NUMERIC(18,4),
    PRECIO NUMERIC(18,2),
    CODBAR VARCHAR(20))
AS
declare variable exist char(1);
declare variable codini varchar(20);
declare variable codfin varchar(20);
declare variable desini varchar(20);
declare variable desfin varchar(20);
declare variable ordenc numeric(18,4);
declare variable pedido numeric(18,4);
declare variable ok char(1);
declare variable id integer;
declare variable item integer;
declare variable und varchar(8);
declare variable factor numeric(18,4);
declare variable cant2 numeric(18,4);
declare variable PEDAUTO CHAR(2);
DECLARE VARIABLE LISTA INTEGER;
BEGIN
EXECUTE PROCEDURE lee_configuracion ('FACTURACION','FACTURAS', 'CODIGO DE LA LISTA DE PRECIOS A MOSTRAR EN ARTICULOS') returning_values (:LISTA);
if (ORDEN = 'C') then
    BEGIN
    CODINI = ARTINI;
    CODFIN = ARTFIN;
    DESINI = '';
    DESFIN = 'zz';
    END
ELSE
    BEGIN
    DESINI = ARTINI;
    DESFIN = ARTFIN;
    CODINI = '';
    CODFIN = 'zz';
    END
EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION', 'FACTURAS', 'GENERAR PEDIDO AUTOMATICAMENTE CON LA FACTURA') returning_values (pedauto);
if (DETALLE = 'B') then
  BEGIN
  FOR SELECT ARTI_COD, ARTI_DES, ARTI_UNIDAD, ARTI_EXIST, TAIV_PORC, A.GRUP_COD, A.SUBG_COD, A.MARC_COD, BODE_COD, BODE_NOM, ARTI_CONSUMO, ARTI_PESO/1000
      FROM ARTICULO A, BODEGA B, TARIFA_IVA T
      WHERE ARTI_COD >= :CODINI AND ARTI_COD <= :CODFIN AND ARTI_DES >= :DESINI AND ARTI_DES <= :DESFIN AND ESAR_COD <> 'I' AND BODE_COD >= :BODINI AND
      BODE_COD <= :BODFIN AND ((SUCU_ID = :SUCURSAL) or (:SUCURSAL = 0)) AND A.TAIV_COD = T.TAIV_COD
      INTO :CODIGO, :NOMBRE, :UNIDAD, :EXIST, :IVA, :CODGRUPO, :CODSUBG, :CODMARC, :CODBOD, :NOMBOD, :CONSUMO, :pesounit
      DO
        BEGIN
        STAND = '';
        OK = 'N';
        if (AGRUPA = 'G') then
            BEGIN
            if ((CODGRUPO >= GRPINI) AND (CODGRUPO <= GRPFIN)) then
                OK = 'S';
            end
        ELSE
            if (AGRUPA = 'M') then
                BEGIN
                if ((CODMARC >= GRPINI) AND (CODMARC <= GRPFIN)) then
                    OK = 'S';
                END
        if (OK = 'S') then
            BEGIN
            NOMGRUPO = '';
            NOMMARC = '';
            NOMSUBG = '';
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            SELECT MAX(COBA_COD) FROM BARRAS_ARTICULO WHERE ARTI_COD = :codigo AND COBA_UNIDAD = :unidad INTO :codbar;
            if (CODBAR IS NULL) then
                CODBAR = CODIGO;
            if (EXIST <> 'N') then
                BEGIN
                SELECT STAND_COD FROM STANDS WHERE ARTI_COD = :CODIGO AND STAND_BODEGA = :CODBOD INTO :STAND;
                EXECUTE PROCEDURE SALDO_INICIAL_INVENTARIO(CODIGO, FECHA, :CODBOD) returning_values (CANT);
                EXECUTE PROCEDURE costo_promedio_y_ultimo_unidad(CODIGO, FECHA, UNIDAD) returning_values (COSTO, ULTCOSTO);
                SELECT MAX(MVAR_FECHA) FROM MOVIMIENTO_ARTICULO WHERE ARTI_COD = :CODIGO AND MVAR_ENTRADA = 'S' AND MVAR_FECHA <= :FECHA INTO :FECHACOSTO;
                if (MASIVA = 'S') then
                    COSTO = COSTO * (100 + :IVA) / 100 + :CONSUMO;
                COSTOTOT = :CANT * :COSTO;
                CONSUMO = CONSUMO * CANT;
                if (RESERVA = 'S') then
                    BEGIN
                    SELECT SUM(ORID_ENTREGAR)
                        FROM ORDENINVENTARIO_DETALLE OD, ordenes_inventario O
                        WHERE O.ORIN_ID = OD.ORIN_ID AND ARTI_COD = :CODIGO AND ORIN_FECHA <= :FECHA AND ORIN_FECLLEGA >= :FECHA AND ORID_ANULADO = 'N' AND OD.BODE_COD = :CODBOD
                        INTO :ORDENADO;
                    if (ORDENADO IS NULL) then
                        ORDENADO = 0;
                    ORDENC = 0;
                    FOR SELECT O.ORDC_ID, OCDE_ITEM, OCDE_CANT * OCDE_FACTOR
                        FROM ORDENES_COMPRA O, ORDENES_COMPRA_DETALLE OD
                        WHERE O.ORDC_ID = OD.ORDC_ID AND OD.ARTI_COD = :CODIGO AND ORDC_VENCE >= :FECHA AND ORDC_FECHA <= :FECHA AND OCDE_ANULADO = 'N' AND OD.BODE_COD = :CODBOD
                        INTO :ID, :ITEM, :CANT2
                        do
                        BEGIN
                        EXECUTE PROCEDURE FALTANTE(23, 21, ID, ITEM) returning_values (PEDIDO, UND, FACTOR);
                        if (PEDIDO * FACTOR = CANT2) then /* SI NO SE HA FACTURADO MIRE A VER SI SE REMISIONO */
                            EXECUTE PROCEDURE FALTANTE(23, 22, ID, ITEM) returning_values (PEDIDO, UND, FACTOR);
                        if (PEDIDO IS NULL) then
                            PEDIDO = 0;
                        ORDENC = ORDENC + PEDIDO * FACTOR;
                        END
                    ORDENADO = ORDENADO + ORDENC;
                    SELECT SUM(RSDE_LIBERAR)
                        FROM RESERVAS_DETALLE RD, RESERVAS R
                        WHERE R.RESE_ID = RD.RESE_ID AND ARTI_COD = :CODIGO AND RESE_FECHA <= :FECHA AND RESE_VENCE >= :FECHA AND RD.BODE_COD = :CODBOD AND RSDE_ANULADO = 'N'
                        INTO :RESERVADO;
                    if (RESERVADO IS NULL) then
                        RESERVADO = 0;
                    PEDIDO = 0;
                    FOR SELECT P.PEDI_ID, PEDE_ITEM, PEDE_CANT * PEDE_FACTOR
                        FROM PEDIDOS P, PEDIDOS_DETALLE PD
                        WHERE P.PEDI_ID = PD.PEDI_ID AND PD.ARTI_COD = :CODIGO AND PEDI_VENCE >= :FECHA AND PEDI_FECHA <= :FECHA AND PEDE_ANULADO = 'N' AND BODE_COD = :CODBOD
                        INTO :ID, :ITEM, :CANT2
                        do
                        BEGIN
                        EXECUTE PROCEDURE FALTANTE(34, 31, ID, ITEM) returning_values (ORDENC, UND, FACTOR);
                        if ((ORDENC * FACTOR = CANT2) or (PEDAUTO = 'SI')) then /* SI NO SE HA FACTURADO MIRE A VER SI SE REMISIONO */
                            EXECUTE PROCEDURE FALTANTE(34, 32, ID, ITEM) returning_values (ORDENC, UND, FACTOR);
                        if (ORDENC IS NULL) then
                            ORDENC = 0;
                        PEDIDO = PEDIDO + ORDENC * FACTOR;
                        END
                    RESERVADO = RESERVADO + PEDIDO;
                    END
                ELSE
                    BEGIN
                    RESERVADO = 0;
                    ORDENADO = 0;
                    END
                if (LISTA > 0) then
                    SELECT prar_fijo FROM precios_articulo WHERE arti_cod = :CODIGO and lipr_cod = :LISTA INTO :PRECIO;
                if (ENPESO = 'S') then
                    BEGIN
                    if (pesounit IS NULL) then
                        pesounit = 0;
                    if (PESOUNIT <> 0) then
                        BEGIN
                        pesototal = PESOUNIT * cant;
                        SUSPEND;
                        END
                    END
                ELSE
                    SUSPEND;
                END
            END
        END
  END

if (DETALLE = 'L') then
  BEGIN
  FOR SELECT A.ARTI_COD, ARTI_DES, ARTI_UNIDAD, ARTI_EXIST, TAIV_PORC, A.GRUP_COD, A.SUBG_COD, A.MARC_COD, L.lote_nro, L.lote_nro||' - '||L.lote_vence, ARTI_CONSUMO,l.bode_cod, L.lote_saldo,l.lote_costo, ARTI_PESO/1000
      FROM ARTICULO A, LOTES l, TARIFA_IVA T
      WHERE A.ARTI_COD >= '0' AND A.ARTI_COD <= 'zz' AND ARTI_DES >= '' AND ARTI_DES <= 'zz' AND ESAR_COD <> 'I' AND A.TAIV_COD = T.TAIV_COD and a.arti_cod = l.arti_cod
      INTO :CODIGO, :NOMBRE, :UNIDAD, :EXIST, :IVA, :CODGRUPO, :CODSUBG, :CODMARC, :LOTE, :NOMBOD, :CONSUMO, :codbod, :cant, :costo_lote, :pesounit
      DO
        BEGIN
        OK = 'N';
        if (AGRUPA = 'G') then
            BEGIN
            if ((CODGRUPO >= GRPINI) AND (CODGRUPO <= GRPFIN)) then
                OK = 'S';
            end
        ELSE
            if (AGRUPA = 'M') then
                BEGIN
                if ((CODMARC >= GRPINI) AND (CODMARC <= GRPFIN)) then
                    OK = 'S';
                END
        if (OK = 'S') then
            BEGIN
            NOMGRUPO = '';
            NOMMARC = '';
            NOMSUBG = '';
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            SELECT MAX(COBA_COD) FROM BARRAS_ARTICULO WHERE ARTI_COD = :codigo AND COBA_UNIDAD = :unidad INTO :codbar;
            if (CODBAR IS NULL) then
                CODBAR = CODIGO;

            if (EXIST <> 'N') then
                BEGIN
                EXECUTE PROCEDURE COSTO_PROMEDIO_UNIDAD(CODIGO, FECHA, UNIDAD) returning_values (COSTO);
                EXECUTE PROCEDURE ULTIMO_COSTO(CODIGO, FECHA, UNIDAD) returning_values (ULTCOSTO);
                SELECT MAX(MVAR_FECHA) FROM MOVIMIENTO_ARTICULO WHERE ARTI_COD = :CODIGO AND MVAR_ENTRADA = 'S' AND MVAR_FECHA <= :FECHA INTO :FECHACOSTO;
                if (MASIVA = 'S') then
                    COSTO = COSTO * (100 + :IVA) / 100 + :CONSUMO;
                COSTOTOT = :CANT * :COSTO;
                CONSUMO = CONSUMO * CANT;
                if (RESERVA = 'S') then
                    BEGIN
                    SELECT SUM(ORID_ENTREGAR)
                        FROM ORDENINVENTARIO_DETALLE OD, ordenes_inventario O
                        WHERE O.ORIN_ID = OD.ORIN_ID AND ARTI_COD = :CODIGO AND ORIN_FECHA <= :FECHA AND ORIN_FECLLEGA >= :FECHA AND ORID_ANULADO = 'N'
                        INTO :ORDENADO;
                    if (ORDENADO IS NULL) then
                        ORDENADO = 0;
                    ORDENC = 0;
                    FOR SELECT O.ORDC_ID, OCDE_ITEM, OCDE_CANT * OCDE_FACTOR
                        FROM ORDENES_COMPRA O, ORDENES_COMPRA_DETALLE OD
                        WHERE O.ORDC_ID = OD.ORDC_ID AND OD.ARTI_COD = :CODIGO AND ORDC_VENCE >= :FECHA AND ORDC_FECHA <= :FECHA AND OCDE_ANULADO = 'N'
                        INTO :ID, :ITEM, :CANT2
                        do
                        BEGIN
                        EXECUTE PROCEDURE FALTANTE(23, 21, ID, ITEM) returning_values (PEDIDO, UND, FACTOR);
                        if (PEDIDO * FACTOR = CANT2) then /* SI NO SE HA FACTURADO MIRE A VER SI SE REMISIONO */
                            EXECUTE PROCEDURE FALTANTE(23, 22, ID, ITEM) returning_values (PEDIDO, UND, FACTOR);
                        if (PEDIDO IS NULL) then
                            PEDIDO = 0;
                        ORDENC = ORDENC + PEDIDO * FACTOR;
                        END
                    ORDENADO = ORDENADO + ORDENC;
                    SELECT SUM(RSDE_LIBERAR)
                        FROM RESERVAS_DETALLE RD, RESERVAS R
                        WHERE R.RESE_ID = RD.RESE_ID AND ARTI_COD = :CODIGO AND RESE_FECHA <= :FECHA AND RESE_VENCE >= :FECHA AND RSDE_ANULADO = 'N'
                        INTO :RESERVADO;
                    if (RESERVADO IS NULL) then
                        RESERVADO = 0;
                    PEDIDO = 0;
                    FOR SELECT P.PEDI_ID, PEDE_ITEM, PEDE_CANT * PEDE_FACTOR
                        FROM PEDIDOS P, PEDIDOS_DETALLE PD
                        WHERE P.PEDI_ID = PD.PEDI_ID AND PD.ARTI_COD = :CODIGO AND PEDI_VENCE >= :FECHA AND PEDI_FECHA <= :FECHA AND PEDE_ANULADO = 'N'
                        INTO :ID, :ITEM, :CANT2
                        do
                        BEGIN
                        EXECUTE PROCEDURE FALTANTE(34, 31, ID, ITEM) returning_values (ORDENC, UND, FACTOR);
                        if ((ORDENC * FACTOR = CANT2) or (PEDAUTO = 'SI')) then /* SI NO SE HA FACTURADO MIRE A VER SI SE REMISIONO */
                            EXECUTE PROCEDURE FALTANTE(34, 32, ID, ITEM) returning_values (ORDENC, UND, FACTOR);
                        if (ORDENC IS NULL) then
                            ORDENC = 0;
                        PEDIDO = PEDIDO + ORDENC * FACTOR;
                        END
                    RESERVADO = RESERVADO + PEDIDO;
                    END
                ELSE
                    BEGIN
                    RESERVADO = 0;
                    ORDENADO = 0;
                    END
                if (LISTA > 0) then
                    SELECT prar_fijo FROM precios_articulo WHERE arti_cod = :CODIGO and lipr_cod = :LISTA INTO :PRECIO;
                if (ENPESO = 'S') then
                    BEGIN
                    if (pesounit IS NULL) then
                        pesounit = 0;
                    if (PESOUNIT <> 0) then
                        BEGIN
                        pesototal = PESOUNIT * cant;
                        SUSPEND;
                        END
                    END
                ELSE
                    SUSPEND;
                END
            END
        END
  end
if (DETALLE = 'N') then
  BEGIN
  FOR SELECT ARTI_COD, ARTI_DES, ARTI_UNIDAD, ARTI_EXIST, TAIV_PORC, A.GRUP_COD, A.SUBG_COD, A.MARC_COD, ARTI_CONSUMO, ARTI_PESO/1000
      FROM ARTICULO A, TARIFA_IVA T
      WHERE ARTI_COD >= :CODINI AND ARTI_COD <= :CODFIN AND ARTI_DES >= :DESINI AND ARTI_DES <= :DESFIN AND ESAR_COD <> 'I' AND A.TAIV_COD = T.TAIV_COD
      INTO :CODIGO, :NOMBRE, :UNIDAD, :EXIST, :IVA, :CODGRUPO, :CODSUBG, :CODMARC, :CONSUMO, :pesounit
      DO
        BEGIN
        OK = 'N';
        if (AGRUPA = 'G') then
            BEGIN
            if ((GRPINI = '0') AND (GRPFIN = 'zz')) then
                OK = 'S';
            else
                if ((CODGRUPO >= GRPINI) AND (CODGRUPO <= GRPFIN)) then
                    OK = 'S';
            end
        ELSE
            if (AGRUPA = 'M') then
                BEGIN
                if ((GRPINI = '0') AND (GRPFIN = 'zzz')) then
                    OK = 'S';
                else
                    if ((CODMARC >= GRPINI) AND (CODMARC <= GRPFIN)) then
                        OK = 'S';
                END
        if (OK = 'S') then
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            SELECT MAX(COBA_COD) FROM BARRAS_ARTICULO WHERE ARTI_COD = :codigo AND COBA_UNIDAD = :unidad INTO :codbar;
            if (CODBAR IS NULL) then
                CODBAR = CODIGO;

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

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

^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure ACTUALICE_COSTO (
    ARTICULO varchar(15),
    FECHA date,
    COSTO numeric(18,2),
    CANTIDAD numeric(18,2),
    ENTRADA char(1),
    ANULAR char(1),
    IDMOV integer,
    TIPO integer)
AS
DECLARE VARIABLE exart CHAR(1);
DECLARE VARIABLE COSTOP NUMERIC(18,2);
DECLARE VARIABLE UCOSTO NUMERIC(18,2);
declare variable SALDOC NUMERIC(15,4);
BEGIN
/* Verfique si el artículo tiene control de existencias */
SELECT arti_exist FROM articulo WHERE arti_COD = :articulo INTO :exart;
IF (exart <> 'N') THEN
    BEGIN
    if (ANULAR = 'S') then
        BEGIN
        DELETE FROM COSTOS WHERE (arti_cod = :articulo) AND (cost_fecha = :fecha) AND (cost_idmov = :IDMOV) AND (COST_TIPO = :TIPO);
        END
    ELSE
        BEGIN
        SELECT FIRST 1 (cost_saldoc + cost_entc - cost_salc) from costos WHERE (arti_cod = :articulo) AND
            (cost_fecha <= :fecha) ORDER BY ARTI_COD DESC, COST_FECHA DESC, COST_ITEM DESC into :saldoc;
        if (saldoc is null) THEN
            SALDOC = 0;
        EXECUTE PROCEDURE costo_promedio_y_ultimo(:articulo, :fecha) RETURNING_VALUES (:costop, :ucosto);
        if (ENTRADA = 'S') then
            if (TIPO = 33) then
                BEGIN
                INSERT INTO COSTOS (arti_cod, cost_fecha,
                    cost_entc, cost_entp, cost_salc, cost_salp,
                    cost_saldoc, cost_saldop, cost_ultimo, cost_idmov, cost_tipo)
                    VALUES (:articulo, :fecha, :cantidad, :cantidad*:costop, 0, 0, :saldoc, :saldoc*:costop, :ucosto, :IDMOV, :TIPO);
                END
            ELSE
                BEGIN
                UCOSTO = :COSTO;
                INSERT INTO COSTOS (arti_cod, cost_fecha,
                    cost_entc, cost_entp, cost_salc, cost_salp,
                    cost_saldoc, cost_saldop, cost_ultimo, cost_idmov, cost_tipo)
                    VALUES (:articulo, :fecha, :cantidad, :cantidad*:costo, 0, 0, :saldoc, :saldoc*:costop, :costo, :IDMOV, :TIPO);
                END
        ELSE
            BEGIN
            INSERT INTO COSTOS (arti_cod, cost_fecha,
                cost_entc, cost_entp, cost_salc, cost_salp,
                cost_saldoc, cost_saldop, cost_ultimo, cost_idmov, cost_tipo)
                VALUES (:articulo, :fecha, 0, 0, :cantidad, :cantidad*:costop, :saldoc, :saldoc*:costop, :UCOSTO, :IDMOV, :TIPO);
            END
        END
    END
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE CHEQUEO_COSTOS(
    ARTICULO VARCHAR(20),
    FECHA DATE)
AS
declare variable NUMROWS INTEGER;
DECLARE VARIABLE ID INTEGER;
DECLARE VARIABLE FECMV DATE;
DECLARE VARIABLE CANT NUMERIC(15,4);
DECLARE VARIABLE COSTO NUMERIC(18,2);
DECLARE VARIABLE ENTRADA CHAR(1);
DECLARE VARIABLE TIPO INTEGER;
begin
SELECT COUNT(*) FROM COSTOS WHERE ARTI_COD = :ARTICULO AND COST_FECHA > :FECHA INTO :NUMROWS;
if (NUMROWS > 0) then
    BEGIN
    delete from costos where arti_cod = :ARTICULO AND COST_FECHA >= :FECHA;
    for select mvar_cons, mvar_fecha, mvar_cant, mvar_costo, mvar_entrada, mvar_tipodoc
        from movimiento_articulo WHERE ARTI_COD = :ARTICULO AND MVAR_FECHA >= :FECHA
        order by mvar_fecha, mvar_cons /* SE HACE ESTRICTAMENTE EN ORDEN DE FECHA Y REGISTRO, SI LO EDITAN CAMBIA EL ORDEN */
        into :id, :fecmv, :cant, :costo, :entrada, :tipo
        do
        if ((TIPO <> 13)) then
            EXECUTE PROCEDURE actualice_costo(:ARTICULO, :fecmv, :costo, :cant, :entrada, 'N', :id, :tipo);
    END
end

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE CHEQUEO_INVENTARIO(
    ARTINI VARCHAR(20),
    ARTFIN VARCHAR(20))
AS
DECLARE VARIABLE FECHA DATE;
DECLARE VARIABLE CANT NUMERIC(15,4);
DECLARE VARIABLE COSTO NUMERIC(18,2);
DECLARE VARIABLE ENTRADA CHAR(1);
DECLARE VARIABLE BODEGA CHAR(2);
DECLARE VARIABLE ID INTEGER;
DECLARE VARIABLE TIPO INTEGER;
declare variable TIPOEX CHAR(1);
DECLARE VARIABLE LOTE VARCHAR(20);
declare variable ARTICULO VARCHAR(20);
declare variable IDL INTEGER;
BEGIN
for select arti_cod from articulo where arti_cod >= :artini and arti_cod <= :artfin into :ARTICULO
  DO
  BEGIN
  DELETE FROM existencia_lote where arti_cod = :articulo;
  DELETE FROM lotes where arti_cod = :articulo;
  delete from costos where arti_cod = :ARTICULO;
  delete from existencia WHERE ARTI_COD = :ARTICULO;
  for select mvar_cons, mvar_fecha, mvar_cant, mvar_costo, mvar_entrada, bode_cod, mvar_tipodoc, mvar_lote
    from movimiento_articulo WHERE ARTI_COD = :ARTICULO
    order by mvar_fecha, mvar_cons
    into :id, :fecha, :cant, :costo, :entrada, :bodega, :tipo, :lote
  do
    begin
    SELECT ARTI_EXIST
        FROM   ARTICULO
        WHERE  ARTICULO.ARTI_COD = :ARTICULO
        INTO :TIPOEX;
    if ((TIPO <> 13)) then
        EXECUTE PROCEDURE actualice_costo(:ARTICULO, :fecha, :costo, :cant, :entrada, 'N', :id, :tipo);
    /* actualice existencias */
    if (:entrada = 'S') then
        begin
        execute procedure sume_existencia(:articulo, :bodega, :fecha, :cant, 'N');
        if (TIPOEX = 'L') then
            begin
            if (EXISTS (SELECT LOTE_NRO FROM LOTES WHERE ARTI_COD = :ARTICULO AND BODE_COD = :BODEGA AND LOTE_NRO = :lote)) then
                UPDATE LOTES
                    set lote_saldo = lote_saldo + :cant
                    where (arti_cod = :ARTICULO) and (BODE_COD = :BODEGA) AND (lote_nro = :lote);
            ELSE
                INSERT INTO LOTES (ARTI_COD, BODE_COD, LOTE_NRO, LOTE_FECHA, LOTE_CANT, LOTE_COSTO, LOTE_SALDO)
                    VALUES (:ARTICULO, :bodega, :lote, :fecha, :cant, :costo, :cant);
            end
        end
    else
        begin
        execute procedure reste_existencia(:articulo, :bodega, :fecha, :cant, 'N');
        if (TIPOEX = 'L') then
            begin
            if (EXISTS (SELECT LOTE_NRO FROM LOTES WHERE ARTI_COD = :ARTICULO AND BODE_COD = :BODEGA AND LOTE_NRO = :lote)) then
                UPDATE LOTES
                    set lote_saldo = lote_saldo - :cant
                    where (arti_cod = :ARTICULO) AND (BODE_COD = :BODEGA) and (lote_nro = :lote);
            ELSE
                BEGIN
                /* ARREGLE EL LOTE YA QUE NO EXISTE */
                SELECT MIN(LOTE_ID) FROM LOTES WHERE ARTI_COD = :articulo AND BODE_COD = :BODEGA AND LOTE_SALDO >= :cant INTO :IDL;
                SELECT LOTE_NRO FROM LOTES WHERE LOTE_ID = :IDL INTO :LOTE;
                UPDATE MOVIMIENTO_ARTICULO SET MVAR_LOTE = :LOTE WHERE MVAR_CONS = :ID;
                UPDATE LOTES
                    set lote_saldo = lote_saldo - :cant
                    where (arti_cod = :ARTICULO) and (BODE_COD = :BODEGA) AND (lote_nro = :lote);
                END
            if (EXISTS (SELECT EXLO_FECHA FROM EXISTENCIA_LOTE WHERE LOTE_NRO = :LOTE AND EXLO_FECHA = :FECHA
                AND ARTI_COD = :ARTICULO AND BODE_COD = :bodega)) then
                UPDATE EXISTENCIA_LOTE
                       SET EXLO_SAL = EXLO_SAL + :cant
                    WHERE LOTE_NRO = :LOTE AND EXLO_FECHA = :FECHA AND ARTI_COD = :ARTICULO AND BODE_COD = :bodega;
            else
                INSERT INTO EXISTENCIA_LOTE (ARTI_COD, BODE_COD, LOTE_NRO, EXLO_FECHA, EXLO_SAL)
                    VALUES (:ARTICULO, :BODEGA, :LOTE, :FECHA, :CANT);
            end
        end
    END
  END
END

^

SET TERM ; ^

SET TERM ^ ;

ALTER TRIGGER MOVIMIENTO_ARTICULO_AD
AS
declare variable LOTE CHAR(1);
declare variable ensamble char(1);
BEGIN
  /* INSERTE EL NUEVO LOTE */
  SELECT ARTI_EXIST
    FROM   ARTICULO
    WHERE  ARTICULO.ARTI_COD = OLD.ARTI_COD
    INTO :LOTE;
  /* BORRE LOS VIEJOS */
  if (old.mvar_tipodoc <> 13) then
      BEGIN
      EXECUTE PROCEDURE actualice_costo(old.arti_cod, old.mvar_fecha, old.mvar_costo, old.mvar_cant, old.mvar_entrada, 'S', OLD.mvar_cons, OLD.mvar_tipodoc);
      if (OLD.mvar_entrada = 'S') then
          EXECUTE PROCEDURE chequeo_costos(old.arti_cod, old.mvar_fecha-1); /* PARA OBLIGAR A RECALCULAR LOS MOV. DEL MISMO DIA */
      else
          EXECUTE PROCEDURE chequeo_costos(old.arti_cod, old.mvar_fecha);
      END
  /* actualice existencias */
  if (old.mvar_entrada = 'S') then
    BEGIN
    execute procedure sume_existencia(old.arti_cod, old.bode_cod, old.mvar_fecha, old.mvar_cant, 'S');
    if (LOTE = 'L') then
        UPDATE LOTES
            set lote_saldo = lote_saldo - old.mvar_cant
            where (arti_cod = old.ARTI_COD) and (bode_cod = old.bode_cod) and (lote_nro = old.mvar_lote);
    END
  else
    BEGIN
    SELECT ARTI_ENSAMBLE FROM ARTICULO WHERE ARTI_COD = old.arti_cod INTO :ensamble;
    if (ENSAMBLE = 'S') then
        delete from ensambles where ensa_tiporef = old.mvar_tipodoc and ensa_idref = old.mvar_idref;

    execute procedure reste_existencia(old.arti_cod, old.bode_cod, old.mvar_fecha, old.mvar_cant, 'S');
    if (LOTE = 'L') then
        UPDATE LOTES
            set lote_saldo = lote_saldo + old.mvar_cant
            where (arti_cod = old.ARTI_COD) and (bode_cod = old.bode_cod) and (lote_nro = old.mvar_lote);
    END
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER TRIGGER MOVIMIENTO_ARTICULO_AI
AS
declare variable EXISTE CHAR(1);
declare variable LOTE CHAR(1);
BEGIN
  /* INSERTE EL NUEVO LOTE */
  SELECT ARTI_EXIST FROM ARTICULO WHERE ARTICULO.ARTI_COD = NEW.ARTI_COD INTO :LOTE;
  /* ACTUALICE COSTOS cuando no es transferencia */
  if (new.mvar_tipodoc <> 13) then
      BEGIN
      EXECUTE PROCEDURE actualice_costo(new.arti_cod, new.mvar_fecha, new.mvar_costo, new.mvar_cant, new.mvar_entrada, 'N', new.mvar_cons, new.mvar_tipodoc);
      EXECUTE PROCEDURE chequeo_costos(NEW.arti_cod, NEW.mvar_fecha);
      END
  /* actualice existencias */
  if (new.mvar_entrada = 'S') then
    BEGIN
    execute procedure sume_existencia(new.arti_cod, new.bode_cod, new.mvar_fecha, new.mvar_cant, 'N');
    if (LOTE = 'L') then
        BEGIN
        if (NEW.MVAR_LOTE IS NULL) then
            EXCEPTION LOTE_OBLIGATORIO 'Debe especificar un número de lote para el articulo ' || new.arti_cod;
        ELSE
         BEGIN
         EXISTE = 'N';
         SELECT 'S' FROM LOTES WHERE ARTI_COD = NEW.ARTI_COD AND BODE_COD = NEW.bode_cod AND LOTE_NRO = new.mvar_lote INTO :EXISTE;
         if (EXISTE = 'S') then
            UPDATE LOTES
             set lote_saldo = lote_saldo + new.mvar_cant
              where (arti_cod = NEW.ARTI_COD) and (BODE_COD = NEW.bode_cod) and (lote_nro = new.mvar_lote);
         ELSE
            INSERT INTO LOTES (ARTI_COD, BODE_COD, LOTE_NRO, LOTE_FECHA, LOTE_CANT, LOTE_COSTO, LOTE_SALDO)
                VALUES (NEW.ARTI_COD, NEW.bode_cod, NEW.mvar_lote, NEW.mvar_fecha, NEW.mvar_cant, NEW.mvar_costo, NEW.mvar_cant);
         END
        END
    END
  else
    BEGIN
    execute procedure reste_existencia(new.arti_cod, new.bode_cod, new.mvar_fecha, new.mvar_cant, 'N');
    /* ACTUALICE LA EXISTENCIA DEL LOTE */
    if (LOTE = 'L') then
    if (NEW.mvar_lote IS NULL) then
        EXCEPTION LOTE_NEGATIVO 'Debe indicar un número de lote para el artículo ' || new.arti_cod;
    ELSE
        BEGIN
        /* Actualice el saldo historico del lote */
        EXISTE = 'N';
        SELECT 'S' FROM EXISTENCIA_LOTE WHERE LOTE_NRO = NEW.MVAR_LOTE AND EXLO_FECHA = NEW.MVAR_FECHA AND ARTI_COD = NEW.arti_cod AND BODE_COD = NEW.bode_cod INTO :EXISTE;
        if (EXISTE = 'S') then
            BEGIN
            UPDATE EXISTENCIA_LOTE
                SET EXLO_SAL = EXLO_SAL + NEW.mvar_cant
                WHERE LOTE_NRO = NEW.MVAR_LOTE AND EXLO_FECHA = NEW.MVAR_FECHA AND ARTI_COD = NEW.ARTI_COD AND BODE_COD = NEW.bode_cod;
            END
        ELSE
            BEGIN
            INSERT INTO EXISTENCIA_LOTE (ARTI_COD, BODE_COD, LOTE_NRO, EXLO_FECHA, EXLO_SAL)
                VALUES (NEW.ARTI_COD, NEW.bode_cod, NEW.MVAR_LOTE, NEW.MVAR_FECHA, NEW.MVAR_CANT);
            END
        UPDATE LOTES
            set lote_saldo = lote_saldo - new.mvar_cant
            where (arti_cod = NEW.ARTI_COD) and (BODE_COD = NEW.bode_cod) and (lote_nro = new.mvar_lote);
        END
    END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure CHEQUEO_COSTOS (
    ARTICULO varchar(20),
    FECHA date)
AS
DECLARE VARIABLE ID INTEGER;
DECLARE VARIABLE FECMV DATE;
DECLARE VARIABLE CANT NUMERIC(15,4);
DECLARE VARIABLE COSTO NUMERIC(18,2);
DECLARE VARIABLE ENTRADA CHAR(1);
DECLARE VARIABLE TIPO INTEGER;
begin
delete from costos where arti_cod = :ARTICULO AND COST_FECHA >= :FECHA;
for select mvar_cons, mvar_fecha, mvar_cant, mvar_costo, mvar_entrada, mvar_tipodoc
    from movimiento_articulo WHERE ARTI_COD = :ARTICULO AND MVAR_FECHA >= :FECHA
    order by mvar_fecha, mvar_cons /* SE HACE ESTRICTAMENTE EN ORDEN DE FECHA Y REGISTRO, SI LO EDITAN CAMBIA EL ORDEN */
    into :id, :fecmv, :cant, :costo, :entrada, :tipo
    do
    if ((TIPO <> 13)) then
        EXECUTE PROCEDURE actualice_costo(:ARTICULO, :fecmv, :costo, :cant, :entrada, 'N', :id, :tipo);
end
^

SET TERM ; ^

SET TERM ^ ;

ALTER TRIGGER MOVIMIENTO_ARTICULO_AD
AS
declare variable LOTE CHAR(1);
declare variable ensamble char(1);
BEGIN
  /* INSERTE EL NUEVO LOTE */
  SELECT ARTI_EXIST
    FROM   ARTICULO
    WHERE  ARTICULO.ARTI_COD = OLD.ARTI_COD
    INTO :LOTE;
  /* BORRE LOS VIEJOS */
  if (old.mvar_tipodoc <> 13) then
      BEGIN
      EXECUTE PROCEDURE actualice_costo(old.arti_cod, old.mvar_fecha, old.mvar_costo, old.mvar_cant, old.mvar_entrada, 'S', OLD.mvar_cons, OLD.mvar_tipodoc);
      if (OLD.mvar_entrada = 'S') then
          EXECUTE PROCEDURE chequeo_costos(old.arti_cod, old.mvar_fecha-1); /* PARA OBLIGAR A RECALCULAR LOS MOV. DEL MISMO DIA */
      else
          EXECUTE PROCEDURE chequeo_costos(old.arti_cod, old.mvar_fecha);
      END
  /* actualice existencias */
  if (old.mvar_entrada = 'S') then
    BEGIN
    execute procedure sume_existencia(old.arti_cod, old.bode_cod, old.mvar_fecha, old.mvar_cant, 'S');
    if (LOTE = 'L') then
        UPDATE LOTES
            set lote_saldo = lote_saldo - old.mvar_cant
            where (arti_cod = old.ARTI_COD) and (bode_cod = old.bode_cod) and (lote_nro = old.mvar_lote);
    END
  else
    BEGIN
    SELECT ARTI_ENSAMBLE FROM ARTICULO WHERE ARTI_COD = old.arti_cod INTO :ensamble;
    if (ENSAMBLE = 'S') then
        delete from ensambles where ensa_tiporef = old.mvar_tipodoc and ensa_idref = old.mvar_idref;

    execute procedure reste_existencia(old.arti_cod, old.bode_cod, old.mvar_fecha, old.mvar_cant, 'S');
    if (LOTE = 'L') then
        UPDATE LOTES
            set lote_saldo = lote_saldo + old.mvar_cant
            where (arti_cod = old.ARTI_COD) and (bode_cod = old.bode_cod) and (lote_nro = old.mvar_lote);
    END
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER TRIGGER MOVIMIENTO_ARTICULO_AI
AS
declare variable EXISTE CHAR(1);
declare variable LOTE CHAR(1);
BEGIN
  /* INSERTE EL NUEVO LOTE */
  SELECT ARTI_EXIST FROM ARTICULO WHERE ARTICULO.ARTI_COD = NEW.ARTI_COD INTO :LOTE;
  /* ACTUALICE COSTOS cuando no es transferencia */
  if (new.mvar_tipodoc <> 13) then
      BEGIN
      EXECUTE PROCEDURE actualice_costo(new.arti_cod, new.mvar_fecha, new.mvar_costo, new.mvar_cant, new.mvar_entrada, 'N', new.mvar_cons, new.mvar_tipodoc);
      EXECUTE PROCEDURE chequeo_costos(NEW.arti_cod, NEW.mvar_fecha);
      END
  /* actualice existencias */
  if (new.mvar_entrada = 'S') then
    BEGIN
    execute procedure sume_existencia(new.arti_cod, new.bode_cod, new.mvar_fecha, new.mvar_cant, 'N');
    if (LOTE = 'L') then
        BEGIN
        if (NEW.MVAR_LOTE IS NULL) then
            EXCEPTION LOTE_OBLIGATORIO 'Debe especificar un número de lote para el articulo ' || new.arti_cod;
        ELSE
         BEGIN
         EXISTE = 'N';
         SELECT 'S' FROM LOTES WHERE ARTI_COD = NEW.ARTI_COD AND BODE_COD = NEW.bode_cod AND LOTE_NRO = new.mvar_lote INTO :EXISTE;
         if (EXISTE = 'S') then
            UPDATE LOTES
             set lote_saldo = lote_saldo + new.mvar_cant
              where (arti_cod = NEW.ARTI_COD) and (BODE_COD = NEW.bode_cod) and (lote_nro = new.mvar_lote);
         ELSE
            INSERT INTO LOTES (ARTI_COD, BODE_COD, LOTE_NRO, LOTE_FECHA, LOTE_CANT, LOTE_COSTO, LOTE_SALDO)
                VALUES (NEW.ARTI_COD, NEW.bode_cod, NEW.mvar_lote, NEW.mvar_fecha, NEW.mvar_cant, NEW.mvar_costo, NEW.mvar_cant);
         END
        END
    END
  else
    BEGIN
    execute procedure reste_existencia(new.arti_cod, new.bode_cod, new.mvar_fecha, new.mvar_cant, 'N');
    /* ACTUALICE LA EXISTENCIA DEL LOTE */
    if (LOTE = 'L') then
    if (NEW.mvar_lote IS NULL) then
        EXCEPTION LOTE_NEGATIVO 'Debe indicar un número de lote para el artículo ' || new.arti_cod;
    ELSE
        BEGIN
        /* Actualice el saldo historico del lote */
        EXISTE = 'N';
        SELECT 'S' FROM EXISTENCIA_LOTE WHERE LOTE_NRO = NEW.MVAR_LOTE AND EXLO_FECHA = NEW.MVAR_FECHA AND ARTI_COD = NEW.arti_cod AND BODE_COD = NEW.bode_cod INTO :EXISTE;
        if (EXISTE = 'S') then
            BEGIN
            UPDATE EXISTENCIA_LOTE
                SET EXLO_SAL = EXLO_SAL + NEW.mvar_cant
                WHERE LOTE_NRO = NEW.MVAR_LOTE AND EXLO_FECHA = NEW.MVAR_FECHA AND ARTI_COD = NEW.ARTI_COD AND BODE_COD = NEW.bode_cod;
            END
        ELSE
            BEGIN
            INSERT INTO EXISTENCIA_LOTE (ARTI_COD, BODE_COD, LOTE_NRO, EXLO_FECHA, EXLO_SAL)
                VALUES (NEW.ARTI_COD, NEW.bode_cod, NEW.MVAR_LOTE, NEW.MVAR_FECHA, NEW.MVAR_CANT);
            END
        UPDATE LOTES
            set lote_saldo = lote_saldo - new.mvar_cant
            where (arti_cod = NEW.ARTI_COD) and (BODE_COD = NEW.bode_cod) and (lote_nro = new.mvar_lote);
        END
    END
END
^

SET TERM ; ^

CREATE INDEX LOTES_IDX1
ON LOTES (LOTE_ID);

SET TERM ^ ;

CREATE OR ALTER procedure CHEQUEO_INVENTARIO (
    ARTINI varchar(20),
    ARTFIN varchar(20))
AS
DECLARE VARIABLE FECHA DATE;
DECLARE VARIABLE CANT NUMERIC(15,4);
DECLARE VARIABLE COSTO NUMERIC(18,2);
DECLARE VARIABLE ENTRADA CHAR(1);
DECLARE VARIABLE BODEGA CHAR(2);
DECLARE VARIABLE ID INTEGER;
DECLARE VARIABLE TIPO INTEGER;
declare variable TIPOEX CHAR(1);
DECLARE VARIABLE LOTE VARCHAR(20);
declare variable ARTICULO VARCHAR(20);
declare variable IDL INTEGER;
BEGIN
for select arti_cod, ARTI_EXIST from articulo where arti_cod >= :artini and arti_cod <= :artfin into :ARTICULO, :TIPOEX
  DO
  BEGIN
  DELETE FROM existencia_lote where arti_cod = :articulo;
  DELETE FROM lotes where arti_cod = :articulo;
  delete from costos where arti_cod = :ARTICULO;
  delete from existencia WHERE ARTI_COD = :ARTICULO;
  for select mvar_cons, mvar_fecha, mvar_cant, mvar_costo, mvar_entrada, bode_cod, mvar_tipodoc, mvar_lote
    from movimiento_articulo WHERE ARTI_COD = :ARTICULO
    order by arti_cod, mvar_fecha, mvar_cons
    into :id, :fecha, :cant, :costo, :entrada, :bodega, :tipo, :lote
  do
    begin
    if ((TIPO <> 13)) then
        EXECUTE PROCEDURE actualice_costo(:ARTICULO, :fecha, :costo, :cant, :entrada, 'N', :id, :tipo);
    /* actualice existencias */
    if (:entrada = 'S') then
        begin
        execute procedure sume_existencia(:articulo, :bodega, :fecha, :cant, 'N');
        if (TIPOEX = 'L') then
            begin
            if (EXISTS (SELECT LOTE_NRO FROM LOTES WHERE ARTI_COD = :ARTICULO AND BODE_COD = :BODEGA AND LOTE_NRO = :lote)) then
                UPDATE LOTES
                    set lote_saldo = lote_saldo + :cant
                    where (arti_cod = :ARTICULO) and (BODE_COD = :BODEGA) AND (lote_nro = :lote);
            ELSE
                INSERT INTO LOTES (ARTI_COD, BODE_COD, LOTE_NRO, LOTE_FECHA, LOTE_CANT, LOTE_COSTO, LOTE_SALDO)
                    VALUES (:ARTICULO, :bodega, :lote, :fecha, :cant, :costo, :cant);
            end
        end
    else
        begin
        execute procedure reste_existencia(:articulo, :bodega, :fecha, :cant, 'N');
        if (TIPOEX = 'L') then
            begin
            if (EXISTS (SELECT LOTE_NRO FROM LOTES WHERE ARTI_COD = :ARTICULO AND BODE_COD = :BODEGA AND LOTE_NRO = :lote)) then
                UPDATE LOTES
                    set lote_saldo = lote_saldo - :cant
                    where (arti_cod = :ARTICULO) AND (BODE_COD = :BODEGA) and (lote_nro = :lote);
            ELSE
                BEGIN
                /* ARREGLE EL LOTE YA QUE NO EXISTE */
                SELECT MIN(LOTE_ID) FROM LOTES WHERE ARTI_COD = :articulo AND BODE_COD = :BODEGA AND LOTE_SALDO >= :cant INTO :IDL;
                SELECT LOTE_NRO FROM LOTES WHERE LOTE_ID = :IDL INTO :LOTE;
                UPDATE MOVIMIENTO_ARTICULO SET MVAR_LOTE = :LOTE WHERE ARTI_COD = :ARTICULO AND MVAR_CONS = :ID;
                UPDATE LOTES
                    set lote_saldo = lote_saldo - :cant
                    where (arti_cod = :ARTICULO) and (BODE_COD = :BODEGA) AND (lote_nro = :lote);
                END
            if (EXISTS (SELECT EXLO_FECHA FROM EXISTENCIA_LOTE WHERE LOTE_NRO = :LOTE AND EXLO_FECHA = :FECHA
                AND ARTI_COD = :ARTICULO AND BODE_COD = :bodega)) then
                UPDATE EXISTENCIA_LOTE
                       SET EXLO_SAL = EXLO_SAL + :cant
                    WHERE LOTE_NRO = :LOTE AND EXLO_FECHA = :FECHA AND ARTI_COD = :ARTICULO AND BODE_COD = :bodega;
            else
                INSERT INTO EXISTENCIA_LOTE (ARTI_COD, BODE_COD, LOTE_NRO, EXLO_FECHA, EXLO_SAL)
                    VALUES (:ARTICULO, :BODEGA, :LOTE, :FECHA, :CANT);
            end
        end
    END
  END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure CONSULTA_ARTICULOS_VTAS (
    FECHA date,
    INACTIVOS char(1),
    MODULO varchar(20),
    BUSCAR varchar(100),
    CUALQUIERA char(1),
    COLUMNA integer,
    BUSCAR2 varchar(30),
    BUSCAR3 varchar(30),
    BUSCAR4 varchar(30),
    BUSCAR5 varchar(30))
returns (
    CODIGO varchar(20),
    DES varchar(60),
    REF varchar(20),
    GRUPO varchar(30),
    MARCA varchar(30),
    UNIDAD varchar(8),
    ESTADO varchar(30),
    IVA numeric(9,2),
    EXISTEN numeric(18,2),
    PRECIO numeric(18,2),
    CLASE char(1))
AS
DECLARE VARIABLE LISTA INTEGER;
DECLARE VARIABLE EXIST CHAR(2);
DECLARE VARIABLE SINEXIST CHAR(2);
declare variable DIG INTEGER;
declare variable OK CHAR(1);
BEGIN
EXISTEN = 0;
EXECUTE PROCEDURE lee_configuracion ('FACTURACION','ARTICULOS', 'VER EXISTENCIA EN CONSULTA ARTICULOS') returning_values (:EXIST);
EXECUTE PROCEDURE lee_configuracion ('FACTURACION','FACTURAS', 'CODIGO DE LA LISTA DE PRECIOS A MOSTRAR EN ARTICULOS') returning_values (:LISTA);
if (modulo = 'FACTURACION') then
  EXECUTE PROCEDURE lee_configuracion ('FACTURACION','ARTICULOS','VER ARTICULOS SIN EXISTENCIA EN CONSULTA DE ARTICULOS') returning_values (:sinexist);
else
  sinexist = 'SI';
EXECUTE PROCEDURE LEE_CONFIGURACION ('FACTURACION', 'ARTICULOS', 'REDONDEO AL MULTIPLO DE DIEZ EN PRECIOS') returning_values (DIG);
if (LISTA > 0) then
    BEGIN
    if ((BUSCAR IS NOT NULL) AND (BUSCAR <> '')) then
        FOR select a.arti_cod, arti_des, grup_cod, arti_unidad, esar_cod, taiv_porc, marc_cod,arti_clase
            from articulo a, tarifa_iva t
            where a.taiv_cod = t.taiv_cod and substring(a.arti_cod from 1 FOR 2) <> '.t' and
            ((:INACTIVOS = 'S') or (esar_cod = 'A') or ((:INACTIVOS = 'C') AND (esar_cod = 'N'))) AND
            ((:COLUMNA <> 0) or (upper(A.ARTI_COD) like upper(:buscar))) AND
            ((:columna <> 1) or (upper(A.ARTI_DES) like upper(:buscar))) AND
            ((:columna <> 2) or (upper(A.ARTI_OBS) like upper(:buscar)) or (upper(A.ARTI_DES) like upper(:buscar)))
            INTO :CODIGO, :DES, :GRUPO, :UNIDAD, :ESTADO, :IVA, :MARCA, :CLASE
            do
            begin
            ref = '';
            select first 1 coba_cod from barras_articulo where arti_cod = :codigo into :ref;
            if ((COLUMNA <> 3) or (upper(REF) like upper(:buscar))) then
                BEGIN
                OK = 'N';
                PRECIO = 0;
                SELECT prar_fijo PRECIO FROM precios_articulo WHERE arti_cod = :CODIGO and lipr_cod = :LISTA INTO :PRECIO;
                EXECUTE PROCEDURE redondee(PRECIO, DIG) returning_values (PRECIO);
                if (EXIST = 'SI') then
                    BEGIN
                    existen = 0;
                    SELECT FIRST 1 COST_SALDOC+COST_ENTC-COST_SALC
                        FROM COSTOS WHERE ARTI_COD = :codigo AND COST_FECHA <= :FECHA
                        ORDER BY ARTI_COD DESC, COST_FECHA DESC, COST_ITEM DESC
                        INTO :existen;
                    if (existen is null) then
                        existen = 0;
/*                    EXECUTE PROCEDURE saldo_total_inventario (:CODIGO, :FECHA) returning_values (:EXISTEN);*/
                    if ((SINEXIST = 'SI')  or (existen <> 0)) then
                        OK = 'S';
                    END
                ELSE
                    OK = 'S';
                if (ok = 'S') then
                    if (CUALQUIERA = 'S') then
                        SUSPEND;
                    ELSE
                        if (BUSCAR2 <> '') then
                            BEGIN
                            IF (NOT EXISTS (SELECT ARTI_COD FROM ARTICULO WHERE ARTI_COD = :CODIGO AND ((upper(ARTI_DES) like upper(:BUSCAR2)) or (UPPER(ARTI_OBS) LIKE UPPER(:BUSCAR2))))) THEN
                                OK = 'N';
                            if ((OK = 'S') AND (BUSCAR3 <> '')) then
                                IF (NOT EXISTS (SELECT ARTI_COD FROM ARTICULO WHERE ARTI_COD = :CODIGO AND ((upper(ARTI_DES) like upper(:BUSCAR3)) or (UPPER(ARTI_OBS) LIKE UPPER(:BUSCAR3))))) THEN
                                    OK = 'N';
                            if ((OK = 'S') AND (BUSCAR4 <> '')) then
                                IF (NOT EXISTS (SELECT ARTI_COD FROM ARTICULO WHERE ARTI_COD = :CODIGO AND ((upper(ARTI_DES) like upper(:BUSCAR4)) or (UPPER(ARTI_OBS) LIKE UPPER(:BUSCAR4))))) THEN
                                    OK = 'N';
                            if ((OK = 'S') AND (BUSCAR4 <> '')) then
                                IF (NOT EXISTS (SELECT ARTI_COD FROM ARTICULO WHERE ARTI_COD = :CODIGO AND ((upper(ARTI_DES) like upper(:BUSCAR4)) or (UPPER(ARTI_OBS) LIKE UPPER(:BUSCAR4))))) THEN
                                    OK = 'N';
                            if ((OK = 'S') AND (BUSCAR5 <> '')) then
                                IF (NOT EXISTS (SELECT ARTI_COD FROM ARTICULO WHERE ARTI_COD = :CODIGO AND ((upper(ARTI_DES) like upper(:BUSCAR5)) or (UPPER(ARTI_OBS) LIKE UPPER(:BUSCAR5))))) THEN
                                    OK = 'N';
                            if (OK = 'S') then
                                SUSPEND;
                            END
                        ELSE
                            SUSPEND;
                END
            end
    ELSE
        FOR select a.arti_cod, arti_des, grup_cod, arti_unidad, esar_cod, taiv_porc, marc_cod,arti_clase
            from articulo a, tarifa_iva t
            where a.taiv_cod = t.taiv_cod and substring(a.arti_cod from 1 FOR 2) <> '.t' and
            ((:INACTIVOS = 'S') or (esar_cod = 'A') or ((:INACTIVOS = 'C') AND (esar_cod = 'N')))
            INTO :CODIGO, :DES, :GRUPO, :UNIDAD, :ESTADO, :IVA, :MARCA, :CLASE
            do
            begin
            ref = '';
            select first 1 coba_cod from barras_articulo where arti_cod = :codigo into :ref;
            PRECIO = 0;
            SELECT prar_fijo PRECIO FROM precios_articulo WHERE arti_cod = :CODIGO and lipr_cod = :LISTA INTO :PRECIO;
            EXECUTE PROCEDURE redondee(PRECIO, DIG) returning_values (PRECIO);
            if (EXIST = 'SI') then
                BEGIN
                existen = 0;
                SELECT FIRST 1 COST_SALDOC+COST_ENTC-COST_SALC
                    FROM COSTOS WHERE ARTI_COD = :codigo AND COST_FECHA <= :FECHA
                    ORDER BY ARTI_COD DESC, COST_FECHA DESC, COST_ITEM DESC
                    INTO :existen;
                if (existen is null) then
                    existen = 0;
/*                EXECUTE PROCEDURE saldo_total_inventario (:CODIGO, :FECHA) returning_values (:EXISTEN);*/
                if ((SINEXIST = 'SI')  or (existen <> 0)) then
                    SUSPEND;
                END
            ELSE
                SUSPEND;
            END
    END
ELSE
    if ((BUSCAR IS NOT NULL) AND (BUSCAR <> '')) then
        FOR select arti_cod, arti_des, grup_cod, arti_unidad, esar_cod, taiv_porc, arti_precio, marc_cod, arti_clase
            from articulo a, tarifa_iva t
            where a.taiv_cod = t.taiv_cod and substring(a.arti_cod from 1 FOR 2) <> '.t' and
            ((:INACTIVOS = 'S') or (esar_cod = 'A') or ((:INACTIVOS = 'C') AND (esar_cod = 'N'))) AND
            ((:COLUMNA <> 0) or (upper(A.ARTI_COD) like upper(:buscar))) AND
            ((:columna <> 1) or (upper(A.ARTI_DES) like upper(:buscar))) AND
            ((:columna <> 2) or (upper(A.ARTI_OBS) like upper(:buscar)) or (upper(A.ARTI_DES) like upper(:buscar)))
            INTO :CODIGO, :DES, :GRUPO, :UNIDAD, :ESTADO, :IVA, :PRECIO, :MARCA, :CLASE
            do
            begin
            ref = '';
            select first 1 coba_cod from barras_articulo where arti_cod = :codigo into :ref;
            if ((COLUMNA <> 3) or (upper(REF) like upper(:buscar))) then
                BEGIN
                if (EXIST = 'SI') then
                    BEGIN
                    existen = 0;
                    SELECT FIRST 1 COST_SALDOC+COST_ENTC-COST_SALC
                        FROM COSTOS WHERE ARTI_COD = :codigo AND COST_FECHA <= :FECHA
                        ORDER BY ARTI_COD DESC, COST_FECHA DESC, COST_ITEM DESC
                        INTO :existen;
                    if (existen is null) then
                        existen = 0;
/*                    EXECUTE PROCEDURE saldo_total_inventario (:CODIGO, :FECHA) returning_values (:EXISTEN);*/
                    if ((SINEXIST = 'SI') or (existen <> 0)) then
                        OK = 'S';
                    END
                ELSE
                    OK = 'S';
                if (ok = 'S') then
                    if (CUALQUIERA = 'S') then
                        SUSPEND;
                    ELSE
                        if (BUSCAR2 <> '') then
                            BEGIN
                            IF (NOT EXISTS (SELECT ARTI_COD FROM ARTICULO WHERE ARTI_COD = :CODIGO AND ((upper(ARTI_DES) like upper(:BUSCAR2)) or (UPPER(ARTI_OBS) LIKE UPPER(:BUSCAR2))))) THEN
                                OK = 'N';
                            if ((OK = 'S') AND (BUSCAR3 <> '')) then
                                IF (NOT EXISTS (SELECT ARTI_COD FROM ARTICULO WHERE ARTI_COD = :CODIGO AND ((upper(ARTI_DES) like upper(:BUSCAR3)) or (UPPER(ARTI_OBS) LIKE UPPER(:BUSCAR3))))) THEN
                                    OK = 'N';
                            if ((OK = 'S') AND (BUSCAR4 <> '')) then
                                IF (NOT EXISTS (SELECT ARTI_COD FROM ARTICULO WHERE ARTI_COD = :CODIGO AND ((upper(ARTI_DES) like upper(:BUSCAR4)) or (UPPER(ARTI_OBS) LIKE UPPER(:BUSCAR4))))) THEN
                                    OK = 'N';
                            if ((OK = 'S') AND (BUSCAR4 <> '')) then
                                IF (NOT EXISTS (SELECT ARTI_COD FROM ARTICULO WHERE ARTI_COD = :CODIGO AND ((upper(ARTI_DES) like upper(:BUSCAR4)) or (UPPER(ARTI_OBS) LIKE UPPER(:BUSCAR4))))) THEN
                                    OK = 'N';
                            if ((OK = 'S') AND (BUSCAR5 <> '')) then
                                IF (NOT EXISTS (SELECT ARTI_COD FROM ARTICULO WHERE ARTI_COD = :CODIGO AND ((upper(ARTI_DES) like upper(:BUSCAR5)) or (UPPER(ARTI_OBS) LIKE UPPER(:BUSCAR5))))) THEN
                                    OK = 'N';
                            if (OK = 'S') then
                                SUSPEND;
                            END
                        ELSE
                            SUSPEND;
                END
            end
    ELSE
        FOR select arti_cod, arti_des, grup_cod, arti_unidad, esar_cod, taiv_porc, arti_precio, marc_cod, arti_clase
            from articulo a, tarifa_iva t
            where a.taiv_cod = t.taiv_cod and substring(a.arti_cod from 1 FOR 2) <> '.t' and
            ((:INACTIVOS = 'S') or (esar_cod = 'A') or ((:INACTIVOS = 'C') AND (esar_cod = 'N')))
            INTO :CODIGO, :DES, :GRUPO, :UNIDAD, :ESTADO, :IVA, :PRECIO, :MARCA, :CLASE
            do
            begin
            ref = '';
            select first 1 coba_cod from barras_articulo where arti_cod = :codigo into :ref;
            if (EXIST = 'SI') then
                BEGIN
                existen = 0;
                SELECT FIRST 1 COST_SALDOC+COST_ENTC-COST_SALC
                    FROM COSTOS WHERE ARTI_COD = :codigo AND COST_FECHA <= :FECHA
                    ORDER BY ARTI_COD DESC, COST_FECHA DESC, COST_ITEM DESC
                    INTO :existen;
                if (existen is null) then
                    existen = 0;
/*                EXECUTE PROCEDURE saldo_total_inventario (:CODIGO, :FECHA) returning_values (:EXISTEN);*/
                if ((SINEXIST = 'SI') or (existen <> 0)) then
                    SUSPEND;
                END
            ELSE
                SUSPEND;
            end
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure VALOR_INICIAL_INVENTARIO (
    ARTICULO varchar(15),
    FECHA date)
returns (
    INICIAL numeric(18,2))
AS
BEGIN
SELECT FIRST 1 (COST_SALDOP+COST_ENTP-COST_SALP) FROM COSTOS
    WHERE (ARTI_COD = :ARTICULO) AND (COST_FECHA < :FECHA)
    ORDER BY ARTI_COD DESC, COST_FECHA DESC, COST_ITEM DESC
    INTO :INICIAL;
if (INICIAL IS NULL) then
    INICIAL = 0;
SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE KARDEX_ARTICULO_MES(
    ARTICULO VARCHAR(15),
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    INICIAL NUMERIC(18,2),
    ENTRADA NUMERIC(18,2),
    SALIDA NUMERIC(18,2))
AS
BEGIN
  EXECUTE PROCEDURE VALOR_INICIAL_INVENTARIO(ARTICULO, FECINI) returning_values (INICIAL);
  SELECT SUM(COST_ENTP) FROM COSTOS
    WHERE (COST_FECHA >= :FECINI) AND (COST_FECHA <= :FECFIN) AND
          (ARTI_COD = :ARTICULO) INTO :ENTRADA;
  if (ENTRADA IS NULL) then
    ENTRADA = 0;
  SELECT SUM(COST_SALP) FROM COSTOS
    WHERE (COST_FECHA >= :FECINI) AND (COST_FECHA <= :FECFIN) AND
          (ARTI_COD = :ARTICULO) INTO :SALIDA;
  if (SALIDA IS NULL) then
    SALIDA = 0;
  SUSPEND;
END

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE KARDEX_DESDE_HASTA(
    ARTICULO VARCHAR(15),
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    INICIAL_CANT NUMERIC(18,4),
    INICIAL_PESOS NUMERIC(18,2),
    ENT_CANT NUMERIC(18,4),
    ENT_PESOS NUMERIC(18,2),
    SAL_CANT NUMERIC(18,4),
    SAL_PESOS NUMERIC(18,2),
    FINAL_CANT NUMERIC(18,4),
    FINAL_PESOS NUMERIC(18,2))
AS
BEGIN
  EXECUTE PROCEDURE SALDO_INICIAL_TOTAL_INV(ARTICULO, FECINI) returning_values (INICIAL_CANT);
  EXECUTE PROCEDURE VALOR_INICIAL_INVENTARIO(ARTICULO, FECINI) returning_values (INICIAL_PESOS);
  SELECT SUM(COST_ENTC), SUM(COST_ENTP), SUM(COST_SALC), SUM(COST_SALP) FROM COSTOS
    WHERE (COST_FECHA >= :FECINI) AND (COST_FECHA <= :FECFIN) AND
          (ARTI_COD = :ARTICULO)
    INTO :ENT_CANT, :ENT_PESOS, :SAL_CANT, :SAL_PESOS;
  if (ENT_CANT IS NULL) then
    ENT_CANT = 0;
  if (ENT_PESOS IS NULL) then
    ENT_PESOS = 0;
  if (SAL_CANT IS NULL) then
    SAL_CANT = 0;
  if (SAL_PESOS IS NULL) then
    SAL_PESOS = 0;
  FINAL_CANT = INICIAL_CANT + ENT_CANT - SAL_CANT;
  FINAL_PESOS = INICIAL_PESOS + ENT_PESOS - SAL_PESOS;
  SUSPEND;
END

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE REP_KARDEX_ARTICULO(
    DETALLE CHAR(1),
    FECINI DATE,
    FECFIN DATE,
    ARTINI VARCHAR(20),
    ARTFIN VARCHAR(20),
    GRPINI VARCHAR(2),
    GRPFIN VARCHAR(2),
    ORDEN CHAR(1),
    BODEGA VARCHAR(2))
RETURNS (
    CODIGO VARCHAR(15),
    NOMBRE VARCHAR(60),
    UNIDAD VARCHAR(8),
    CODGRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    CODSUBG VARCHAR(3),
    NOMSUBG VARCHAR(30),
    CODMARC VARCHAR(3),
    NOMMARC VARCHAR(30),
    CODBOD VARCHAR(2),
    SALDOINI NUMERIC(18,4),
    COSTOINI NUMERIC(18,2),
    ENTRADAS NUMERIC(18,4),
    COSTOENT NUMERIC(18,2),
    SALIDAS NUMERIC(18,4),
    COSTOSAL NUMERIC(18,2),
    SALDOFIN NUMERIC(18,4),
    COSTOFIN NUMERIC(18,2),
    TIPODOC VARCHAR(8),
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    CONCEPTO VARCHAR(60),
    NIT VARCHAR(20),
    CONS INTEGER,
    CANFINAL NUMERIC(18,4),
    COSFINAL NUMERIC(18,2))
AS
DECLARE VARIABLE ENTRADA CHAR(1);
DECLARE VARIABLE CANT NUMERIC(18,4);
DECLARE VARIABLE COSTO NUMERIC(18,2);
DECLARE VARIABLE CODINI VARCHAR(20);
DECLARE VARIABLE CODFIN VARCHAR(20);
DECLARE VARIABLE DESINI VARCHAR(20);
DECLARE VARIABLE DESFIN VARCHAR(20);
BEGIN
if (ORDEN = 'C') then
    BEGIN
    CODINI = ARTINI;
    CODFIN = ARTFIN;
    DESINI = '';
    DESFIN = 'zz';
    END
ELSE
    BEGIN
    DESINI = ARTINI;
    DESFIN = ARTFIN;
    CODINI = '';
    CODFIN = 'zz';
    END
  FOR
    SELECT ARTI_COD, ARTI_DES, ARTI_UNIDAD, A.GRUP_COD, A.SUBG_COD, A.MARC_COD
      FROM ARTICULO A
      WHERE ARTI_COD >= :CODINI AND ARTI_COD <= :CODFIN AND A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :GRPFIN AND ARTI_DES >= :DESINI AND ARTI_DES <= :DESFIN AND A.ESAR_COD <> 'I'
      INTO :CODIGO, :NOMBRE, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
      DO
        BEGIN
        NOMMARC = '';
        NOMSUBG = '';
        SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
        SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
        SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
        if (BODEGA = '') then
            BEGIN
            EXECUTE PROCEDURE SALDO_INICIAL_TOTAL_INV(CODIGO, FECINI) returning_values (:SALDOINI);
            EXECUTE PROCEDURE VALOR_INICIAL_INVENTARIO(CODIGO, FECINI) returning_values (COSTOINI);
            END
        ELSE
            BEGIN
            EXECUTE PROCEDURE SALDO_INICIAL_INVENTARIO(CODIGO, FECINI, :BODEGA) returning_values (SALDOINI);
            EXECUTE PROCEDURE COSTO_PROMEDIO(CODIGO, FECINI-1) returning_values (COSTOINI);
            COSTOINI = COSTOINI * saldoini;
            END
        if (DETALLE = 'N') then
            BEGIN
            /* SUME LAS ENTRADAS */
            if (BODEGA = '') then
              SELECT SUM(COST_ENTC), SUM(COST_ENTP), SUM(COST_SALC), SUM(COST_SALP) FROM COSTOS
                WHERE (COST_FECHA >= :FECINI) AND (COST_FECHA <= :FECFIN) AND (ARTI_COD = :codigo)
                INTO :ENTRADAS, :COSTOENT, :SALIDAS, :COSTOSAL;
            ELSE
              SELECT SUM(COST_ENTC), SUM(COST_ENTP), SUM(COST_SALC), SUM(COST_SALP)
                FROM COSTOS C, MOVIMIENTO_ARTICULO M
                WHERE (COST_FECHA >= :FECINI) AND (COST_FECHA <= :FECFIN) AND (C.ARTI_COD = :codigo) AND C.cost_idmov = M.mvar_cons AND BODE_COD = :BODEGA
                INTO :ENTRADAS, :COSTOENT, :SALIDAS, :COSTOSAL;

            if (ENTRADAS IS NULL) then
              ENTRADAS = 0;
            if (COSTOENT IS NULL) then
              COSTOENT = 0;
            if (SALIDAS IS NULL) then
              SALIDAS = 0;
            if (COSTOSAL IS NULL) then
              COSTOSAL = 0;
            SALDOFIN = SALDOINI + ENTRADAS - SALIDAS;
            COSTOFIN = COSTOINI + COSTOENT - COSTOSAL;
            if (BODEGA = '') then
                BEGIN
                EXECUTE PROCEDURE SALDO_INICIAL_TOTAL_INV(CODIGO, fecfin+1) returning_values (canfinal);
                EXECUTE PROCEDURE VALOR_INICIAL_INVENTARIO(CODIGO, FECFIN+1) returning_values (cosfinal);
                END
            ELSE
                BEGIN
                EXECUTE PROCEDURE SALDO_INICIAL_INVENTARIO(CODIGO, FECFIN+1, :BODEGA) returning_values (CANFINAL);
                EXECUTE PROCEDURE COSTO_PROMEDIO(CODIGO, FECFIN+1) returning_values (COSFINAL);
                COSFINAL = COSFINAL * CANFINAL;
                END
            SUSPEND;
            END
        ELSE
            BEGIN
            SALDOFIN = SALDOINI;
            COSTOFIN = COSTOINI;
            COSTOENT = 0;
            COSTOSAL = 0;
            FOR SELECT TIDO_NOMCORTO, MVAR_ENTRADA, MVAR_PREF, MVAR_NUMERO, MVAR_CANT, MVAR_COSTO, MVAR_CONC, MVAR_FECHA, M.TERC_NIT, MVAR_CONS, BODE_COD, COST_SALDOP, COST_SALDOC
                FROM MOVIMIENTO_ARTICULO M, TIPO_DOCUMENTO TD, COSTOS C
                WHERE TD.TIDO_COD = MVAR_TIPODOC AND (MVAR_FECHA >= :FECINI) AND (MVAR_FECHA <= :FECFIN) AND (MVAR_TIPODOC <> 13) AND (m.ARTI_COD = :CODIGO) AND M.mvar_cons = C.cost_idmov
                ORDER BY MVAR_FECHA, MVAR_CONS
                INTO :TIPODOC, :ENTRADA, :PREFIJO, :NUMERO, :ENTRADAS, :COSTOENT, :CONCEPTO, :FECHA, :NIT, :CONS, :CODBOD, :costo, :cant
                DO
                    BEGIN
                    if (ENTRADA = 'S') then
                        BEGIN
                        SALIDAS = 0;
                        SALDOFIN = SALDOFIN + ENTRADAS;
                        COSTOFIN = COSTOFIN + (ENTRADAS * COSTOENT);
                        if (CANT > 0) then
                            COSTOSAL = COSTO / CANT;
                        else
                            COSTOSAL = 0;
                        end
                    ELSE
                        BEGIN
                        SALIDAS = ENTRADAS;
                        ENTRADAS = 0;
                        if (CANT > 0) then
                            COSTOSAL = COSTO / CANT;
                        else
                            COSTOSAL = 0;
                        SALDOFIN = SALDOFIN - SALIDAS;
                        COSTOFIN = COSTOFIN - (SALIDAS * costosal);
                        END
                    SUSPEND;
                    END
            END
        END
END

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE REP_MOVIMIENTO_ARTICULO_DOC(
    FECINI DATE,
    FECFIN DATE,
    ARTINI VARCHAR(20),
    ARTFIN VARCHAR(20),
    GRPINI VARCHAR(2),
    GRPFIN VARCHAR(2),
    ORDEN CHAR(1))
RETURNS (
    CODIGO VARCHAR(15),
    NOMBRE VARCHAR(60),
    UNIDAD VARCHAR(8),
    CODGRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    CODSUBG VARCHAR(3),
    NOMSUBG VARCHAR(30),
    CODMARC VARCHAR(3),
    NOMMARC VARCHAR(30),
    SALDOINIC NUMERIC(18,4),
    SALDOINIP NUMERIC(18,4),
    ENTRADAC NUMERIC(18,4),
    ENTRADAP NUMERIC(18,4),
    SALIDAC NUMERIC(18,4),
    SALIDAP NUMERIC(18,4),
    COMPRASC NUMERIC(18,4),
    COMPRASP NUMERIC(18,4),
    DEVCOMPRAC NUMERIC(18,4),
    DEVCOMPRAP NUMERIC(18,4),
    VENTASC NUMERIC(18,4),
    VENTASP NUMERIC(18,4),
    DEVVENTAC NUMERIC(18,4),
    DEVVENTAP NUMERIC(18,4),
    REMIPROVC NUMERIC(18,4),
    REMIPROVP NUMERIC(18,4),
    REMICLIEC NUMERIC(18,4),
    REMICLIEP NUMERIC(18,4),
    SALDOFINC NUMERIC(18,4),
    SALDOFINP NUMERIC(18,4))
AS
declare variable CODINI VARCHAR(20);
declare variable CODFIN VARCHAR(20);
declare variable DESINI VARCHAR(20);
declare variable DESFIN VARCHAR(20);
BEGIN
if (ORDEN = 'C') then
    BEGIN
    CODINI = ARTINI;
    CODFIN = ARTFIN;
    DESINI = '';
    DESFIN = 'zz';
    END
ELSE
    BEGIN
    DESINI = ARTINI;
    DESFIN = ARTFIN;
    CODINI = '';
    CODFIN = 'zz';
    END

FOR SELECT ARTI_COD, ARTI_DES, ARTI_UNIDAD, A.GRUP_COD, A.SUBG_COD, A.MARC_COD
      FROM ARTICULO A
      WHERE ARTI_COD >= :CODINI AND ARTI_COD <= :CODFIN AND A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :GRPFIN AND
       ARTI_DES >= :DESINI AND ARTI_DES <= :DESFIN AND A.ESAR_COD <> 'I'
      INTO :CODIGO, :NOMBRE, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
      DO
        BEGIN
        SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
        SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
        SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
        EXECUTE PROCEDURE saldo_inicial_total_inv(CODIGO, FECINI) returning_values (:SALDOINIC);
        EXECUTE PROCEDURE valor_inicial_inventario(CODIGO, FECINI) returning_values (:saldoinip);
        SELECT SUM(MVAR_CANT), SUM(COST_ENTP) FROM MOVIMIENTO_ARTICULO M, COSTOS C
            WHERE (MVAR_FECHA >= :FECINI) AND (MVAR_FECHA <= :FECFIN) AND M.mvar_cons = C.cost_idmov AND M.mvar_tipodoc = 11 AND
            (M.ARTI_COD = :CODIGO) AND (MVAR_ENTRADA = 'S') INTO :ENTRADAC, :ENTRADAP;
        if (entradac IS NULL) then
            ENTRADAC = 0;
        if (entradap IS NULL) then
            entradap = 0;
        SELECT SUM(MVAR_CANT), SUM(COST_ENTP) FROM MOVIMIENTO_ARTICULO M, COSTOS C
            WHERE (MVAR_FECHA >= :FECINI) AND (MVAR_FECHA <= :FECFIN) AND M.mvar_cons = C.cost_idmov AND M.mvar_tipodoc = 21 AND
            (M.ARTI_COD = :CODIGO) AND (MVAR_ENTRADA = 'S') INTO :comprasc, :comprasp;
        if (comprasc IS NULL) then
            comprasc = 0;
        if (comprasp IS NULL) then
            comprasp = 0;
        SELECT SUM(MVAR_CANT), SUM(COST_ENTP) FROM MOVIMIENTO_ARTICULO M, COSTOS C
            WHERE (MVAR_FECHA >= :FECINI) AND (MVAR_FECHA <= :FECFIN) AND M.mvar_cons = C.cost_idmov AND M.mvar_tipodoc = 22 AND
            (M.ARTI_COD = :CODIGO) AND (MVAR_ENTRADA = 'S') INTO :remiprovc, :remiprovp;
        if (remiprovc IS NULL) then
            remiprovc = 0;
        if (remiprovp IS NULL) then
            remiprovp = 0;
        SELECT SUM(MVAR_CANT), SUM(COST_ENTP) FROM MOVIMIENTO_ARTICULO M, COSTOS C
            WHERE (MVAR_FECHA >= :FECINI) AND (MVAR_FECHA <= :FECFIN) AND M.mvar_cons = C.cost_idmov AND M.mvar_tipodoc = 33 AND
            (M.ARTI_COD = :CODIGO) AND (MVAR_ENTRADA = 'S') INTO :devventac, :devventap;
        if (devventac IS NULL) then
            devventac = 0;
        if (devventap IS NULL) then
            devventap = 0;
        /* CALCULE LAS SALIDAS A COSTO PROMEDIO */
        SELECT SUM(MVAR_CANT), SUM(COST_SALP)
            FROM MOVIMIENTO_ARTICULO M, COSTOS C
            WHERE (MVAR_FECHA >= :FECINI) AND (MVAR_FECHA <= :FECFIN) AND M.mvar_cons = C.cost_idmov AND M.mvar_tipodoc = 12 AND
            (M.ARTI_COD = :CODIGO) AND (MVAR_ENTRADA = 'N') INTO :salidac, :salidap;
        if (SALIDAC IS NULL) then
            SALIDAC = 0;
        if (SALIDAP IS NULL) then
            SALIDAP = 0;
        SELECT SUM(MVAR_CANT), SUM(COST_SALP)
            FROM MOVIMIENTO_ARTICULO M, COSTOS C
            WHERE (MVAR_FECHA >= :FECINI) AND (MVAR_FECHA <= :FECFIN) AND M.mvar_cons = C.cost_idmov AND M.mvar_tipodoc = 31 AND
            (M.ARTI_COD = :CODIGO) AND (MVAR_ENTRADA = 'N') INTO :ventasc, :ventasp;
        if (ventasc IS NULL) then
            VENTASC = 0;
        if (ventasp IS NULL) then
            VENTASP = 0;
        SELECT SUM(MVAR_CANT), SUM(COST_SALP)
            FROM MOVIMIENTO_ARTICULO M, COSTOS C
            WHERE (MVAR_FECHA >= :FECINI) AND (MVAR_FECHA <= :FECFIN) AND M.mvar_cons = C.cost_idmov AND M.mvar_tipodoc = 32 AND
            (M.ARTI_COD = :CODIGO) AND (MVAR_ENTRADA = 'N') INTO :remicliec, :remicliep;
        if (remicliec IS NULL) then
            remicliec = 0;
        if (remicliep IS NULL) then
            remicliep = 0;
        SELECT SUM(MVAR_CANT), SUM(COST_SALP)
            FROM MOVIMIENTO_ARTICULO M, COSTOS C
            WHERE (MVAR_FECHA >= :FECINI) AND (MVAR_FECHA <= :FECFIN) AND M.mvar_cons = C.cost_idmov AND M.mvar_tipodoc = 24 AND
            (M.ARTI_COD = :CODIGO) AND (MVAR_ENTRADA = 'N') INTO :devcomprac, :devcomprap;
        if (devcomprac IS NULL) then
            devcomprac = 0;
        if (devcomprap IS NULL) then
            devcomprap = 0;
        SALDOFINC = SALDOINIC + entradac + comprasc + remiprovc + devventac - salidac - ventasc - remicliec - devcomprac;
        saldofinp = SALDOINIP + entradap + comprasp + remiprovp + devventap - salidap - ventasp - remicliep - devcomprap;
        SUSPEND;
        END
END

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE KARDEX_INVENTARIO_MES(
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    CODIGO VARCHAR(15),
    DESCRIPCION VARCHAR(60),
    CODGRP VARCHAR(2),
    CODSUBG VARCHAR(3),
    CODMARCA VARCHAR(3),
    UNIDAD VARCHAR(8),
    IVA NUMERIC(9,2),
    INICIAL NUMERIC(18,2),
    ENTRADA NUMERIC(18,2),
    SALIDA NUMERIC(18,2),
    FINAL NUMERIC(18,2))
AS
BEGIN
  for select arti_cod, arti_des, GRUP_COD, SUBG_COD, MARC_COD, ARTI_UNIDAD, TAIV_PORC
    from articulo A, tarifa_iva T where A.taiv_cod = T.taiv_cod AND substring(arti_cod from 1 FOR 2) <> '.t' AND ARTI_EXIST <> 'N'
    into :CODIGO, :DESCRIPCION, :CODGRP, :CODSUBG, :codmarca, :UNIDAD, :IVA
  DO
    BEGIN
    EXECUTE PROCEDURE KARDEX_ARTICULO_MES(CODIGO, FECINI, FECFIN) returning_values (:INICIAL, :ENTRADA, :SALIDA);
    FINAL = INICIAL + ENTRADA - SALIDA;
    SUSPEND;
    END
END

^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure REP_KARDEX_ARTICULO (
    DETALLE char(1),
    FECINI date,
    FECFIN date,
    ARTINI varchar(20),
    ARTFIN varchar(20),
    GRPINI varchar(2),
    GRPFIN varchar(2),
    ORDEN char(1),
    BODEGA varchar(2))
returns (
    CODIGO varchar(15),
    NOMBRE varchar(60),
    UNIDAD varchar(8),
    CODGRUPO varchar(2),
    NOMGRUPO varchar(30),
    CODSUBG varchar(3),
    NOMSUBG varchar(30),
    CODMARC varchar(3),
    NOMMARC varchar(30),
    CODBOD varchar(2),
    SALDOINI numeric(18,4),
    COSTOINI numeric(18,2),
    ENTRADAS numeric(18,4),
    COSTOENT numeric(18,2),
    SALIDAS numeric(18,4),
    COSTOSAL numeric(18,2),
    SALDOFIN numeric(18,4),
    COSTOFIN numeric(18,2),
    TIPODOC varchar(8),
    PREFIJO varchar(4),
    NUMERO varchar(6),
    FECHA date,
    CONCEPTO varchar(60),
    NIT varchar(20),
    CONS integer,
    CANFINAL numeric(18,4),
    COSFINAL numeric(18,2))
AS
DECLARE VARIABLE ENTRADA CHAR(1);
DECLARE VARIABLE CANT NUMERIC(18,4);
DECLARE VARIABLE COSTO NUMERIC(18,2);
DECLARE VARIABLE CODINI VARCHAR(20);
DECLARE VARIABLE CODFIN VARCHAR(20);
DECLARE VARIABLE DESINI VARCHAR(20);
DECLARE VARIABLE DESFIN VARCHAR(20);
BEGIN
if (ORDEN = 'C') then
    BEGIN
    CODINI = ARTINI;
    CODFIN = ARTFIN;
    DESINI = '';
    DESFIN = 'zz';
    END
ELSE
    BEGIN
    DESINI = ARTINI;
    DESFIN = ARTFIN;
    CODINI = '';
    CODFIN = 'zz';
    END
  FOR
    SELECT ARTI_COD, ARTI_DES, ARTI_UNIDAD, A.GRUP_COD, A.SUBG_COD, A.MARC_COD
      FROM ARTICULO A
      WHERE ARTI_COD >= :CODINI AND ARTI_COD <= :CODFIN AND A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :GRPFIN AND ARTI_DES >= :DESINI AND ARTI_DES <= :DESFIN AND A.ESAR_COD <> 'I'
      INTO :CODIGO, :NOMBRE, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
      DO
        BEGIN
        NOMMARC = '';
        NOMSUBG = '';
        SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
        SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
        SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
        if (BODEGA = '') then
            BEGIN
            EXECUTE PROCEDURE SALDO_INICIAL_TOTAL_INV(CODIGO, FECINI) returning_values (:SALDOINI);
            EXECUTE PROCEDURE VALOR_INICIAL_INVENTARIO(CODIGO, FECINI) returning_values (COSTOINI);
            END
        ELSE
            BEGIN
            EXECUTE PROCEDURE SALDO_INICIAL_INVENTARIO(CODIGO, FECINI, :BODEGA) returning_values (SALDOINI);
            EXECUTE PROCEDURE COSTO_PROMEDIO(CODIGO, FECINI-1) returning_values (COSTOINI);
            COSTOINI = COSTOINI * saldoini;
            END
        if (DETALLE = 'N') then
            BEGIN
            /* SUME LAS ENTRADAS */
            if (BODEGA = '') then
              SELECT SUM(COST_ENTC), SUM(COST_ENTP), SUM(COST_SALC), SUM(COST_SALP) FROM COSTOS
                WHERE (COST_FECHA >= :FECINI) AND (COST_FECHA <= :FECFIN) AND (ARTI_COD = :codigo)
                INTO :ENTRADAS, :COSTOENT, :SALIDAS, :COSTOSAL;
            ELSE
              SELECT SUM(COST_ENTC), SUM(COST_ENTP), SUM(COST_SALC), SUM(COST_SALP)
                FROM COSTOS C, MOVIMIENTO_ARTICULO M
                WHERE (COST_FECHA >= :FECINI) AND (COST_FECHA <= :FECFIN) AND (C.ARTI_COD = :codigo) AND C.cost_idmov = M.mvar_cons AND BODE_COD = :BODEGA
                INTO :ENTRADAS, :COSTOENT, :SALIDAS, :COSTOSAL;

            if (ENTRADAS IS NULL) then
              ENTRADAS = 0;
            if (COSTOENT IS NULL) then
              COSTOENT = 0;
            if (SALIDAS IS NULL) then
              SALIDAS = 0;
            if (COSTOSAL IS NULL) then
              COSTOSAL = 0;
            SALDOFIN = SALDOINI + ENTRADAS - SALIDAS;
            COSTOFIN = COSTOINI + COSTOENT - COSTOSAL;
            if (BODEGA = '') then
                BEGIN
                EXECUTE PROCEDURE SALDO_INICIAL_TOTAL_INV(CODIGO, fecfin+1) returning_values (canfinal);
                EXECUTE PROCEDURE VALOR_INICIAL_INVENTARIO(CODIGO, FECFIN+1) returning_values (cosfinal);
                END
            ELSE
                BEGIN
                EXECUTE PROCEDURE SALDO_INICIAL_INVENTARIO(CODIGO, FECFIN+1, :BODEGA) returning_values (CANFINAL);
                EXECUTE PROCEDURE COSTO_PROMEDIO(CODIGO, FECFIN+1) returning_values (COSFINAL);
                COSFINAL = COSFINAL * CANFINAL;
                END
            SUSPEND;
            END
        ELSE
            BEGIN
            SALDOFIN = SALDOINI;
            COSTOFIN = COSTOINI;
            COSTOENT = 0;
            COSTOSAL = 0;
            FOR SELECT MVAR_TIPODOC, MVAR_ENTRADA, MVAR_PREF, MVAR_NUMERO, MVAR_CANT, MVAR_COSTO, MVAR_CONC, MVAR_FECHA, M.TERC_NIT, MVAR_CONS, BODE_COD, COST_SALDOP, COST_SALDOC
                FROM MOVIMIENTO_ARTICULO M, COSTOS C
                WHERE M.arti_cod = C.arti_cod AND M.mvar_cons = C.cost_idmov AND (m.ARTI_COD = :CODIGO) AND (MVAR_FECHA >= :FECINI) AND (MVAR_FECHA <= :FECFIN) AND (MVAR_TIPODOC <> 13)
                ORDER BY M.ARTI_COD, MVAR_FECHA, MVAR_CONS
                INTO :TIPODOC, :ENTRADA, :PREFIJO, :NUMERO, :ENTRADAS, :COSTOENT, :CONCEPTO, :FECHA, :NIT, :CONS, :CODBOD, :costo, :cant
                DO
                    BEGIN
                    SELECT TIDO_NOMCORTO FROM TIPO_DOCUMENTO WHERE TIDO_COD = :TIPODOC INTO :TIPODOC;
                    if (ENTRADA = 'S') then
                        BEGIN
                        SALIDAS = 0;
                        SALDOFIN = SALDOFIN + ENTRADAS;
                        COSTOFIN = COSTOFIN + (ENTRADAS * COSTOENT);
                        if (CANT > 0) then
                            COSTOSAL = COSTO / CANT;
                        else
                            COSTOSAL = 0;
                        end
                    ELSE
                        BEGIN
                        SALIDAS = ENTRADAS;
                        ENTRADAS = 0;
                        if (CANT > 0) then
                            COSTOSAL = COSTO / CANT;
                        else
                            COSTOSAL = 0;
                        SALDOFIN = SALDOFIN - SALIDAS;
                        COSTOFIN = COSTOFIN - (SALIDAS * costosal);
                        END
                    SUSPEND;
                    END
            END
        END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure REP_MOVIMIENTO_ARTICULO_DOC (
    FECINI date,
    FECFIN date,
    ARTINI varchar(20),
    ARTFIN varchar(20),
    GRPINI varchar(2),
    GRPFIN varchar(2),
    ORDEN char(1))
returns (
    CODIGO varchar(15),
    NOMBRE varchar(60),
    UNIDAD varchar(8),
    CODGRUPO varchar(2),
    NOMGRUPO varchar(30),
    CODSUBG varchar(3),
    NOMSUBG varchar(30),
    CODMARC varchar(3),
    NOMMARC varchar(30),
    SALDOINIC numeric(18,4),
    SALDOINIP numeric(18,4),
    ENTRADAC numeric(18,4),
    ENTRADAP numeric(18,4),
    SALIDAC numeric(18,4),
    SALIDAP numeric(18,4),
    COMPRASC numeric(18,4),
    COMPRASP numeric(18,4),
    DEVCOMPRAC numeric(18,4),
    DEVCOMPRAP numeric(18,4),
    VENTASC numeric(18,4),
    VENTASP numeric(18,4),
    DEVVENTAC numeric(18,4),
    DEVVENTAP numeric(18,4),
    REMIPROVC numeric(18,4),
    REMIPROVP numeric(18,4),
    REMICLIEC numeric(18,4),
    REMICLIEP numeric(18,4),
    SALDOFINC numeric(18,4),
    SALDOFINP numeric(18,4))
AS
declare variable CODINI VARCHAR(20);
declare variable CODFIN VARCHAR(20);
declare variable DESINI VARCHAR(20);
declare variable DESFIN VARCHAR(20);
BEGIN
if (ORDEN = 'C') then
    BEGIN
    CODINI = ARTINI;
    CODFIN = ARTFIN;
    DESINI = '';
    DESFIN = 'zz';
    END
ELSE
    BEGIN
    DESINI = ARTINI;
    DESFIN = ARTFIN;
    CODINI = '';
    CODFIN = 'zz';
    END

FOR SELECT ARTI_COD, ARTI_DES, ARTI_UNIDAD, A.GRUP_COD, A.SUBG_COD, A.MARC_COD
      FROM ARTICULO A
      WHERE ARTI_COD >= :CODINI AND ARTI_COD <= :CODFIN AND A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :GRPFIN AND
       ARTI_DES >= :DESINI AND ARTI_DES <= :DESFIN AND A.ESAR_COD <> 'I'
      INTO :CODIGO, :NOMBRE, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
      DO
        BEGIN
        SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
        SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
        SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
        EXECUTE PROCEDURE saldo_inicial_total_inv(CODIGO, FECINI) returning_values (:SALDOINIC);
        EXECUTE PROCEDURE valor_inicial_inventario(CODIGO, FECINI) returning_values (:saldoinip);
        SELECT SUM(MVAR_CANT), SUM(COST_ENTP) FROM MOVIMIENTO_ARTICULO M, COSTOS C
            WHERE M.arti_cod = C.arti_cod AND M.mvar_cons = C.cost_idmov AND (M.ARTI_COD = :CODIGO) AND
            (MVAR_FECHA >= :FECINI) AND (MVAR_FECHA <= :FECFIN) AND (MVAR_ENTRADA = 'S') AND M.mvar_tipodoc = 11 INTO :ENTRADAC, :ENTRADAP;
        if (entradac IS NULL) then
            ENTRADAC = 0;
        if (entradap IS NULL) then
            entradap = 0;
        SELECT SUM(MVAR_CANT), SUM(COST_ENTP) FROM MOVIMIENTO_ARTICULO M, COSTOS C
            WHERE (MVAR_FECHA >= :FECINI) AND (MVAR_FECHA <= :FECFIN) AND M.arti_cod = C.arti_cod AND M.mvar_cons = C.cost_idmov AND M.mvar_tipodoc = 21 AND
            (M.ARTI_COD = :CODIGO) AND (MVAR_ENTRADA = 'S') INTO :comprasc, :comprasp;
        if (comprasc IS NULL) then
            comprasc = 0;
        if (comprasp IS NULL) then
            comprasp = 0;
        SELECT SUM(MVAR_CANT), SUM(COST_ENTP) FROM MOVIMIENTO_ARTICULO M, COSTOS C
            WHERE (MVAR_FECHA >= :FECINI) AND (MVAR_FECHA <= :FECFIN) AND M.arti_cod = C.arti_cod AND M.mvar_cons = C.cost_idmov AND M.mvar_tipodoc = 22 AND
            (M.ARTI_COD = :CODIGO) AND (MVAR_ENTRADA = 'S') INTO :remiprovc, :remiprovp;
        if (remiprovc IS NULL) then
            remiprovc = 0;
        if (remiprovp IS NULL) then
            remiprovp = 0;
        SELECT SUM(MVAR_CANT), SUM(COST_ENTP) FROM MOVIMIENTO_ARTICULO M, COSTOS C
            WHERE (MVAR_FECHA >= :FECINI) AND (MVAR_FECHA <= :FECFIN) AND M.arti_cod = C.arti_cod AND M.mvar_cons = C.cost_idmov AND M.mvar_tipodoc = 33 AND
            (M.ARTI_COD = :CODIGO) AND (MVAR_ENTRADA = 'S') INTO :devventac, :devventap;
        if (devventac IS NULL) then
            devventac = 0;
        if (devventap IS NULL) then
            devventap = 0;
        /* CALCULE LAS SALIDAS A COSTO PROMEDIO */
        SELECT SUM(MVAR_CANT), SUM(COST_SALP)
            FROM MOVIMIENTO_ARTICULO M, COSTOS C
            WHERE (MVAR_FECHA >= :FECINI) AND (MVAR_FECHA <= :FECFIN) AND M.arti_cod = C.arti_cod AND M.mvar_cons = C.cost_idmov AND M.mvar_tipodoc = 12 AND
            (M.ARTI_COD = :CODIGO) AND (MVAR_ENTRADA = 'N') INTO :salidac, :salidap;
        if (SALIDAC IS NULL) then
            SALIDAC = 0;
        if (SALIDAP IS NULL) then
            SALIDAP = 0;
        SELECT SUM(MVAR_CANT), SUM(COST_SALP)
            FROM MOVIMIENTO_ARTICULO M, COSTOS C
            WHERE (MVAR_FECHA >= :FECINI) AND (MVAR_FECHA <= :FECFIN) AND M.arti_cod = C.arti_cod AND M.mvar_cons = C.cost_idmov AND M.mvar_tipodoc = 31 AND
            (M.ARTI_COD = :CODIGO) AND (MVAR_ENTRADA = 'N') INTO :ventasc, :ventasp;
        if (ventasc IS NULL) then
            VENTASC = 0;
        if (ventasp IS NULL) then
            VENTASP = 0;
        SELECT SUM(MVAR_CANT), SUM(COST_SALP)
            FROM MOVIMIENTO_ARTICULO M, COSTOS C
            WHERE (MVAR_FECHA >= :FECINI) AND (MVAR_FECHA <= :FECFIN) AND M.arti_cod = C.arti_cod AND M.mvar_cons = C.cost_idmov AND M.mvar_tipodoc = 32 AND
            (M.ARTI_COD = :CODIGO) AND (MVAR_ENTRADA = 'N') INTO :remicliec, :remicliep;
        if (remicliec IS NULL) then
            remicliec = 0;
        if (remicliep IS NULL) then
            remicliep = 0;
        SELECT SUM(MVAR_CANT), SUM(COST_SALP)
            FROM MOVIMIENTO_ARTICULO M, COSTOS C
            WHERE (MVAR_FECHA >= :FECINI) AND (MVAR_FECHA <= :FECFIN) AND M.arti_cod = C.arti_cod AND M.mvar_cons = C.cost_idmov AND M.mvar_tipodoc = 24 AND
            (M.ARTI_COD = :CODIGO) AND (MVAR_ENTRADA = 'N') INTO :devcomprac, :devcomprap;
        if (devcomprac IS NULL) then
            devcomprac = 0;
        if (devcomprap IS NULL) then
            devcomprap = 0;
        SALDOFINC = SALDOINIC + entradac + comprasc + remiprovc + devventac - salidac - ventasc - remicliec - devcomprac;
        saldofinp = SALDOINIP + entradap + comprasp + remiprovp + devventap - salidap - ventasp - remicliep - devcomprap;
        SUSPEND;
        END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure ULTIMO_COSTO (
    ARTICULO varchar(15),
    FECHA date,
    UNIDAD varchar(8))
returns (
    UCOSTO numeric(18,2))
AS
DECLARE VARIABLE FACTOR NUMERIC(15,4);
BEGIN
SELECT FIRST 1 COST_ULTIMO FROM COSTOS
    WHERE (ARTI_COD = :ARTICULO) AND (COST_FECHA <= :FECHA)
    ORDER BY ARTI_COD DESC, COST_FECHA DESC, COST_ITEM DESC INTO :UCOSTO;

execute procedure factor_unidad_cant(:ARTICULO, :UNIDAD) RETURNING_VALUES (:FACTOR);
UCOSTO = UCOSTO * FACTOR;
SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE CLASIFICA_INVENTARIO(
    FECHA DATE,
    DIAS INTEGER)
AS
declare variable CODIGO VARCHAR(20);
declare variable UNIDAD VARCHAR(8);
declare variable COSTO NUMERIC(18,2);
declare variable ACUMULADO NUMERIC(18,2);
declare variable SALIDAT NUMERIC(18,2);
declare variable VPROMEDIO NUMERIC(18,4);
declare variable PORC NUMERIC(9,2);
declare variable CLASE CHAR(1);
declare variable ACUMPORC NUMERIC(9,2);
declare variable FECINI DATE;
declare variable A NUMERIC(9,2);
declare variable B NUMERIC(9,2);
declare variable C NUMERIC(9,2);
BEGIN
DELETE FROM analisis_abcinven;
acumporc = 0;
FECINI = FECHA - DIAS;
/* CALCULE LA VENTA PROMEDIO DE CADA ARTICULO */
EXECUTE PROCEDURE LEE_CONFIGURACION ('INVENTARIO', 'EXISTENCIAS', 'PORCENTAJE MINIMO PARA ARTICULO CLASE "A"') returning_values (A);
EXECUTE PROCEDURE LEE_CONFIGURACION ('INVENTARIO', 'EXISTENCIAS', 'PORCENTAJE MINIMO PARA ARTICULO CLASE "B"') returning_values (B);
EXECUTE PROCEDURE LEE_CONFIGURACION ('INVENTARIO', 'EXISTENCIAS', 'PORCENTAJE MINIMO PARA ARTICULO CLASE "C"') returning_values (C);
FOR SELECT ARTI_COD, ARTI_UNIDAD FROM ARTICULO A
      WHERE A.ESAR_COD <> 'I'
      INTO :CODIGO, :UNIDAD
      DO
      BEGIN
      EXECUTE PROCEDURE ultimo_costo(:CODIGO, :FECHA, :UNIDAD) returning_values (:COSTO);
      SELECT SUM(MVAR_CANT) FROM MOVIMIENTO_ARTICULO
        WHERE ARTI_COD = :codigo AND MVAR_FECHA >= :FECINI AND MVAR_FECHA <= :FECHA AND MVAR_ENTRADA = 'N' AND MVAR_TIPODOC <> 13 INTO :SALIDAT;
      if (SALIDAT IS NULL) then
        SALIDAT = 0;
      VPROMEDIO = SALIDAT / DIAS * COSTO;
      insert into analisis_abcinven (ABCI_COD, ABCI_VENTA) VALUES (:codigo, :vpromedio);
      END
SELECT SUM(ABCI_VENTA) FROM analisis_abcinven INTO :acumulado;
FOR SELECT ARTI_COD, ABCI_VENTA
      FROM ARTICULO A, analisis_abcinven N
      WHERE A.ARTI_COD = N.abci_cod
      ORDER BY ABCI_VENTA DESC
      INTO :CODIGO, :vpromedio
      DO
        BEGIN
        if (acumulado <> 0) then
            PORC = vpromedio / acumulado * 100;
        ELSE
            PORC = 0;
        acumporc = acumporc + porc;
        if (acumporc < A) then
            CLASE = 'A';
        else
            if (acumporc < B) then
                CLASE = 'B';
            else
                if (acumporc < c) then
                    CLASE = 'C';
                else
                    CLASE = 'D';
        /* GRABE LA CLASE */
        UPDATE ARTICULO SET ARTI_CLASE = :CLASE WHERE ARTI_COD = :codigo;
        /*SUSPEND;*/
        END
END

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE COSTO_PROVEEDOR(
    NIT VARCHAR(20),
    ARTI VARCHAR(15),
    FECHA DATE)
RETURNS (
    COSTO NUMERIC(18,2))
AS
declare variable UNIDAD VARCHAR(8);
declare variable porprov char(10);
BEGIN
execute procedure lee_configuracion('COMPRAS', 'DOCUMENTOS', 'SUGERIR ULTIMO COSTO POR PROVEEDOR O GENERAL PARA EL ARTICULO') returning_values (:porprov);
/* busque el costo del proveedor, cuendo no hay trae el ultimo */
SELECT PVAR_COSTO FROM PROVEEDOR_ARTICULO
    WHERE TERC_NIT = :Nit AND ARTI_COD = :ARTI
    INTO :COSTO;
if ((COSTO IS NULL) or (PORPROV = 'GENERAL')) then
    BEGIN
    SELECT ARTI_UNIDAD FROM ARTICULO WHERE ARTI_COD = :ARTI INTO :UNIDAD;
    EXECUTE PROCEDURE ultimo_costo(:ARTI, :FECHA, :UNIDAD) returning_values (:COSTO);
    END
SUSPEND;
END

^

SET TERM ; ^

SET TERM ^ ;

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

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

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

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE EXISTENCIAS_DESDE_HASTA(
    FECHA DATE,
    ARTINI VARCHAR(20),
    ARTFIN VARCHAR(20),
    GRPINI VARCHAR(3),
    GRPFIN VARCHAR(3),
    BODINI VARCHAR(2),
    BODFIN VARCHAR(2),
    ORDEN CHAR(1),
    AGRUPA CHAR(1),
    DETALLE CHAR(1),
    RESERVA CHAR(1),
    ENPESO CHAR(1),
    MASIVA CHAR(1),
    SUCURSAL INTEGER)
RETURNS (
    CANT NUMERIC(18,4),
    COSTO NUMERIC(18,2),
    COSTO_LOTE NUMERIC(18,2),
    CODIGO VARCHAR(15),
    NOMBRE VARCHAR(60),
    UNIDAD VARCHAR(8),
    STAND VARCHAR(20),
    CODGRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    CODSUBG VARCHAR(3),
    NOMSUBG VARCHAR(30),
    CODMARC VARCHAR(3),
    NOMMARC VARCHAR(30),
    CODBOD VARCHAR(2),
    LOTE VARCHAR(15),
    NOMBOD VARCHAR(30),
    COSTOTOT NUMERIC(18,2),
    ULTCOSTO NUMERIC(18,2),
    FECHACOSTO DATE,
    CONSUMO NUMERIC(18,2),
    RESERVADO NUMERIC(18,4),
    ORDENADO NUMERIC(18,4),
    IVA NUMERIC(9,2),
    PESOUNIT NUMERIC(18,4),
    PESOTOTAL NUMERIC(18,4),
    PRECIO NUMERIC(18,2),
    CODBAR VARCHAR(20))
AS
declare variable exist char(1);
declare variable codini varchar(20);
declare variable codfin varchar(20);
declare variable desini varchar(20);
declare variable desfin varchar(20);
declare variable ordenc numeric(18,4);
declare variable pedido numeric(18,4);
declare variable ok char(1);
declare variable id integer;
declare variable item integer;
declare variable und varchar(8);
declare variable factor numeric(18,4);
declare variable cant2 numeric(18,4);
declare variable PEDAUTO CHAR(2);
DECLARE VARIABLE LISTA INTEGER;
BEGIN
EXECUTE PROCEDURE lee_configuracion ('FACTURACION','FACTURAS', 'CODIGO DE LA LISTA DE PRECIOS A MOSTRAR EN ARTICULOS') returning_values (:LISTA);
if (ORDEN = 'C') then
    BEGIN
    CODINI = ARTINI;
    CODFIN = ARTFIN;
    DESINI = '';
    DESFIN = 'zz';
    END
ELSE
    BEGIN
    DESINI = ARTINI;
    DESFIN = ARTFIN;
    CODINI = '';
    CODFIN = 'zz';
    END
EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION', 'FACTURAS', 'GENERAR PEDIDO AUTOMATICAMENTE CON LA FACTURA') returning_values (pedauto);
if (DETALLE = 'B') then
  BEGIN
  FOR SELECT ARTI_COD, ARTI_DES, ARTI_UNIDAD, ARTI_EXIST, TAIV_PORC, A.GRUP_COD, A.SUBG_COD, A.MARC_COD, BODE_COD, BODE_NOM, ARTI_CONSUMO, ARTI_PESO/1000
      FROM ARTICULO A, BODEGA B, TARIFA_IVA T
      WHERE ARTI_COD >= :CODINI AND ARTI_COD <= :CODFIN AND ARTI_DES >= :DESINI AND ARTI_DES <= :DESFIN AND ESAR_COD <> 'I' AND BODE_COD >= :BODINI AND
      BODE_COD <= :BODFIN AND ((SUCU_ID = :SUCURSAL) or (:SUCURSAL = 0)) AND A.TAIV_COD = T.TAIV_COD
      INTO :CODIGO, :NOMBRE, :UNIDAD, :EXIST, :IVA, :CODGRUPO, :CODSUBG, :CODMARC, :CODBOD, :NOMBOD, :CONSUMO, :pesounit
      DO
        BEGIN
        STAND = '';
        OK = 'N';
        if (AGRUPA = 'G') then
            BEGIN
            if ((CODGRUPO >= GRPINI) AND (CODGRUPO <= GRPFIN)) then
                OK = 'S';
            end
        ELSE
            if (AGRUPA = 'M') then
                BEGIN
                if ((CODMARC >= GRPINI) AND (CODMARC <= GRPFIN)) then
                    OK = 'S';
                END
        if (OK = 'S') then
            BEGIN
            NOMGRUPO = '';
            NOMMARC = '';
            NOMSUBG = '';
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            SELECT MAX(COBA_COD) FROM BARRAS_ARTICULO WHERE ARTI_COD = :codigo AND COBA_UNIDAD = :unidad INTO :codbar;
            if (CODBAR IS NULL) then
                CODBAR = CODIGO;
            if (EXIST <> 'N') then
                BEGIN
                SELECT STAND_COD FROM STANDS WHERE ARTI_COD = :CODIGO AND STAND_BODEGA = :CODBOD INTO :STAND;
                EXECUTE PROCEDURE SALDO_INICIAL_INVENTARIO(CODIGO, FECHA, :CODBOD) returning_values (CANT);
                EXECUTE PROCEDURE costo_promedio_y_ultimo_unidad(CODIGO, FECHA, UNIDAD) returning_values (COSTO, ULTCOSTO);
                SELECT MAX(MVAR_FECHA) FROM MOVIMIENTO_ARTICULO WHERE ARTI_COD = :CODIGO AND MVAR_ENTRADA = 'S' AND MVAR_FECHA <= :FECHA INTO :FECHACOSTO;
                if (MASIVA = 'S') then
                    COSTO = COSTO * (100 + :IVA) / 100 + :CONSUMO;
                COSTOTOT = :CANT * :COSTO;
                CONSUMO = CONSUMO * CANT;
                if (RESERVA = 'S') then
                    BEGIN
                    SELECT SUM(ORID_ENTREGAR)
                        FROM ORDENINVENTARIO_DETALLE OD, ordenes_inventario O
                        WHERE O.ORIN_ID = OD.ORIN_ID AND ARTI_COD = :CODIGO AND ORIN_FECHA <= :FECHA AND ORIN_FECLLEGA >= :FECHA AND ORID_ANULADO = 'N' AND OD.BODE_COD = :CODBOD
                        INTO :ORDENADO;
                    if (ORDENADO IS NULL) then
                        ORDENADO = 0;
                    ORDENC = 0;
                    FOR SELECT O.ORDC_ID, OCDE_ITEM, OCDE_CANT * OCDE_FACTOR
                        FROM ORDENES_COMPRA O, ORDENES_COMPRA_DETALLE OD
                        WHERE O.ORDC_ID = OD.ORDC_ID AND OD.ARTI_COD = :CODIGO AND ORDC_VENCE >= :FECHA AND ORDC_FECHA <= :FECHA AND OCDE_ANULADO = 'N' AND OD.BODE_COD = :CODBOD
                        INTO :ID, :ITEM, :CANT2
                        do
                        BEGIN
                        EXECUTE PROCEDURE FALTANTE(23, 21, ID, ITEM) returning_values (PEDIDO, UND, FACTOR);
                        if (PEDIDO * FACTOR = CANT2) then /* SI NO SE HA FACTURADO MIRE A VER SI SE REMISIONO */
                            EXECUTE PROCEDURE FALTANTE(23, 22, ID, ITEM) returning_values (PEDIDO, UND, FACTOR);
                        if (PEDIDO IS NULL) then
                            PEDIDO = 0;
                        ORDENC = ORDENC + PEDIDO * FACTOR;
                        END
                    ORDENADO = ORDENADO + ORDENC;
                    SELECT SUM(RSDE_LIBERAR)
                        FROM RESERVAS_DETALLE RD, RESERVAS R
                        WHERE R.RESE_ID = RD.RESE_ID AND ARTI_COD = :CODIGO AND RESE_FECHA <= :FECHA AND RESE_VENCE >= :FECHA AND RD.BODE_COD = :CODBOD AND RSDE_ANULADO = 'N'
                        INTO :RESERVADO;
                    if (RESERVADO IS NULL) then
                        RESERVADO = 0;
                    PEDIDO = 0;
                    FOR SELECT P.PEDI_ID, PEDE_ITEM, PEDE_CANT * PEDE_FACTOR
                        FROM PEDIDOS P, PEDIDOS_DETALLE PD
                        WHERE P.PEDI_ID = PD.PEDI_ID AND PD.ARTI_COD = :CODIGO AND PEDI_VENCE >= :FECHA AND PEDI_FECHA <= :FECHA AND PEDE_ANULADO = 'N' AND BODE_COD = :CODBOD
                        INTO :ID, :ITEM, :CANT2
                        do
                        BEGIN
                        EXECUTE PROCEDURE FALTANTE(34, 31, ID, ITEM) returning_values (ORDENC, UND, FACTOR);
                        if ((ORDENC * FACTOR = CANT2) or (PEDAUTO = 'SI')) then /* SI NO SE HA FACTURADO MIRE A VER SI SE REMISIONO */
                            EXECUTE PROCEDURE FALTANTE(34, 32, ID, ITEM) returning_values (ORDENC, UND, FACTOR);
                        if (ORDENC IS NULL) then
                            ORDENC = 0;
                        PEDIDO = PEDIDO + ORDENC * FACTOR;
                        END
                    RESERVADO = RESERVADO + PEDIDO;
                    END
                ELSE
                    BEGIN
                    RESERVADO = 0;
                    ORDENADO = 0;
                    END
                if (LISTA > 0) then
                    SELECT prar_fijo FROM precios_articulo WHERE arti_cod = :CODIGO and lipr_cod = :LISTA INTO :PRECIO;
                if (ENPESO = 'S') then
                    BEGIN
                    if (pesounit IS NULL) then
                        pesounit = 0;
                    if (PESOUNIT <> 0) then
                        BEGIN
                        pesototal = PESOUNIT * cant;
                        SUSPEND;
                        END
                    END
                ELSE
                    SUSPEND;
                END
            END
        END
  END

if (DETALLE = 'L') then
  BEGIN
  FOR SELECT A.ARTI_COD, ARTI_DES, ARTI_UNIDAD, ARTI_EXIST, TAIV_PORC, A.GRUP_COD, A.SUBG_COD, A.MARC_COD, L.lote_nro, L.lote_nro||' - '||L.lote_vence, ARTI_CONSUMO,l.bode_cod, L.lote_saldo,l.lote_costo, ARTI_PESO/1000
      FROM ARTICULO A, LOTES l, TARIFA_IVA T
      WHERE A.ARTI_COD >= '0' AND A.ARTI_COD <= 'zz' AND ARTI_DES >= '' AND ARTI_DES <= 'zz' AND ESAR_COD <> 'I' AND A.TAIV_COD = T.TAIV_COD and a.arti_cod = l.arti_cod
      INTO :CODIGO, :NOMBRE, :UNIDAD, :EXIST, :IVA, :CODGRUPO, :CODSUBG, :CODMARC, :LOTE, :NOMBOD, :CONSUMO, :codbod, :cant, :costo_lote, :pesounit
      DO
        BEGIN
        OK = 'N';
        if (AGRUPA = 'G') then
            BEGIN
            if ((CODGRUPO >= GRPINI) AND (CODGRUPO <= GRPFIN)) then
                OK = 'S';
            end
        ELSE
            if (AGRUPA = 'M') then
                BEGIN
                if ((CODMARC >= GRPINI) AND (CODMARC <= GRPFIN)) then
                    OK = 'S';
                END
        if (OK = 'S') then
            BEGIN
            NOMGRUPO = '';
            NOMMARC = '';
            NOMSUBG = '';
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            SELECT MAX(COBA_COD) FROM BARRAS_ARTICULO WHERE ARTI_COD = :codigo AND COBA_UNIDAD = :unidad INTO :codbar;
            if (CODBAR IS NULL) then
                CODBAR = CODIGO;

            if (EXIST <> 'N') then
                BEGIN
                EXECUTE PROCEDURE COSTO_PROMEDIO_UNIDAD(CODIGO, FECHA, UNIDAD) returning_values (COSTO);
                EXECUTE PROCEDURE ULTIMO_COSTO(CODIGO, FECHA, UNIDAD) returning_values (ULTCOSTO);
                SELECT MAX(MVAR_FECHA) FROM MOVIMIENTO_ARTICULO WHERE ARTI_COD = :CODIGO AND MVAR_ENTRADA = 'S' AND MVAR_FECHA <= :FECHA INTO :FECHACOSTO;
                if (MASIVA = 'S') then
                    COSTO = COSTO * (100 + :IVA) / 100 + :CONSUMO;
                COSTOTOT = :CANT * :COSTO;
                CONSUMO = CONSUMO * CANT;
                if (RESERVA = 'S') then
                    BEGIN
                    SELECT SUM(ORID_ENTREGAR)
                        FROM ORDENINVENTARIO_DETALLE OD, ordenes_inventario O
                        WHERE O.ORIN_ID = OD.ORIN_ID AND ARTI_COD = :CODIGO AND ORIN_FECHA <= :FECHA AND ORIN_FECLLEGA >= :FECHA AND ORID_ANULADO = 'N'
                        INTO :ORDENADO;
                    if (ORDENADO IS NULL) then
                        ORDENADO = 0;
                    ORDENC = 0;
                    FOR SELECT O.ORDC_ID, OCDE_ITEM, OCDE_CANT * OCDE_FACTOR
                        FROM ORDENES_COMPRA O, ORDENES_COMPRA_DETALLE OD
                        WHERE O.ORDC_ID = OD.ORDC_ID AND OD.ARTI_COD = :CODIGO AND ORDC_VENCE >= :FECHA AND ORDC_FECHA <= :FECHA AND OCDE_ANULADO = 'N'
                        INTO :ID, :ITEM, :CANT2
                        do
                        BEGIN
                        EXECUTE PROCEDURE FALTANTE(23, 21, ID, ITEM) returning_values (PEDIDO, UND, FACTOR);
                        if (PEDIDO * FACTOR = CANT2) then /* SI NO SE HA FACTURADO MIRE A VER SI SE REMISIONO */
                            EXECUTE PROCEDURE FALTANTE(23, 22, ID, ITEM) returning_values (PEDIDO, UND, FACTOR);
                        if (PEDIDO IS NULL) then
                            PEDIDO = 0;
                        ORDENC = ORDENC + PEDIDO * FACTOR;
                        END
                    ORDENADO = ORDENADO + ORDENC;
                    SELECT SUM(RSDE_LIBERAR)
                        FROM RESERVAS_DETALLE RD, RESERVAS R
                        WHERE R.RESE_ID = RD.RESE_ID AND ARTI_COD = :CODIGO AND RESE_FECHA <= :FECHA AND RESE_VENCE >= :FECHA AND RSDE_ANULADO = 'N'
                        INTO :RESERVADO;
                    if (RESERVADO IS NULL) then
                        RESERVADO = 0;
                    PEDIDO = 0;
                    FOR SELECT P.PEDI_ID, PEDE_ITEM, PEDE_CANT * PEDE_FACTOR
                        FROM PEDIDOS P, PEDIDOS_DETALLE PD
                        WHERE P.PEDI_ID = PD.PEDI_ID AND PD.ARTI_COD = :CODIGO AND PEDI_VENCE >= :FECHA AND PEDI_FECHA <= :FECHA AND PEDE_ANULADO = 'N'
                        INTO :ID, :ITEM, :CANT2
                        do
                        BEGIN
                        EXECUTE PROCEDURE FALTANTE(34, 31, ID, ITEM) returning_values (ORDENC, UND, FACTOR);
                        if ((ORDENC * FACTOR = CANT2) or (PEDAUTO = 'SI')) then /* SI NO SE HA FACTURADO MIRE A VER SI SE REMISIONO */
                            EXECUTE PROCEDURE FALTANTE(34, 32, ID, ITEM) returning_values (ORDENC, UND, FACTOR);
                        if (ORDENC IS NULL) then
                            ORDENC = 0;
                        PEDIDO = PEDIDO + ORDENC * FACTOR;
                        END
                    RESERVADO = RESERVADO + PEDIDO;
                    END
                ELSE
                    BEGIN
                    RESERVADO = 0;
                    ORDENADO = 0;
                    END
                if (LISTA > 0) then
                    SELECT prar_fijo FROM precios_articulo WHERE arti_cod = :CODIGO and lipr_cod = :LISTA INTO :PRECIO;
                if (ENPESO = 'S') then
                    BEGIN
                    if (pesounit IS NULL) then
                        pesounit = 0;
                    if (PESOUNIT <> 0) then
                        BEGIN
                        pesototal = PESOUNIT * cant;
                        SUSPEND;
                        END
                    END
                ELSE
                    SUSPEND;
                END
            END
        END
  end
if (DETALLE = 'N') then
  BEGIN
  FOR SELECT ARTI_COD, ARTI_DES, ARTI_UNIDAD, ARTI_EXIST, TAIV_PORC, A.GRUP_COD, A.SUBG_COD, A.MARC_COD, ARTI_CONSUMO, ARTI_PESO/1000
      FROM ARTICULO A, TARIFA_IVA T
      WHERE ARTI_COD >= :CODINI AND ARTI_COD <= :CODFIN AND ARTI_DES >= :DESINI AND ARTI_DES <= :DESFIN AND ESAR_COD <> 'I' AND A.TAIV_COD = T.TAIV_COD
      INTO :CODIGO, :NOMBRE, :UNIDAD, :EXIST, :IVA, :CODGRUPO, :CODSUBG, :CODMARC, :CONSUMO, :pesounit
      DO
        BEGIN
        OK = 'N';
        if (AGRUPA = 'G') then
            BEGIN
            if ((GRPINI = '0') AND (GRPFIN = 'zz')) then
                OK = 'S';
            else
                if ((CODGRUPO >= GRPINI) AND (CODGRUPO <= GRPFIN)) then
                    OK = 'S';
            end
        ELSE
            if (AGRUPA = 'M') then
                BEGIN
                if ((GRPINI = '0') AND (GRPFIN = 'zzz')) then
                    OK = 'S';
                else
                    if ((CODMARC >= GRPINI) AND (CODMARC <= GRPFIN)) then
                        OK = 'S';
                END
        if (OK = 'S') then
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            SELECT MAX(COBA_COD) FROM BARRAS_ARTICULO WHERE ARTI_COD = :codigo AND COBA_UNIDAD = :unidad INTO :codbar;
            if (CODBAR IS NULL) then
                CODBAR = CODIGO;

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

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

^

SET TERM ; ^

SET TERM ^ ;

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

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

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE IMPR_SALIDA(
    ID INTEGER)
RETURNS (
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    CONCEPTO VARCHAR(60),
    REFER VARCHAR(60),
    CODBODEGA VARCHAR(2),
    NOMBODEGA VARCHAR(30),
    NOMTERCERO VARCHAR(60),
    OBS BLOB SUB_TYPE 0 SEGMENT SIZE 80,
    ITEM INTEGER,
    ARTICULO VARCHAR(15),
    CODBAR VARCHAR(15),
    ARTIDES VARCHAR(60),
    CANT NUMERIC(18,4),
    UNIDAD VARCHAR(8),
    BODITEM VARCHAR(2),
    STAND VARCHAR(20),
    COSTO NUMERIC(18,2),
    IVAPORC NUMERIC(9,2),
    IVAMONTO NUMERIC(18,2),
    CONSUMO NUMERIC(18,2),
    TOTAL NUMERIC(18,2),
    TOTALITEM NUMERIC(18,2),
    PRECIO NUMERIC(18,2),
    LOTE VARCHAR(15),
    PESOUNIT NUMERIC(18,4),
    PESOTOT NUMERIC(18,4),
    VOLUMUNIT NUMERIC(18,4),
    VOLUMTOT NUMERIC(18,4),
    TOTALDOC NUMERIC(18,2),
    ULTIMO NUMERIC(18,2),
    TOTALULT NUMERIC(18,2),
    CONSUMODOC NUMERIC(18,2),
    TOTALMASIMP NUMERIC(18,2))
AS
declare variable IMPTOS CHAR(1);
declare variable LARGO NUMERIC(18,4);
declare variable ANCHO NUMERIC(18,4);
declare variable ALTO NUMERIC(18,4);
declare variable LISTA CHAR(3);
BEGIN
  PESOTOT = 0;
  VOLUMTOT = 0;
  SELECT PREF_PRE, SALI_NUMERO, SALI_FECHA, SALI_CONC, SALI_REFER, S.BODE_COD, BODE_NOM, SALI_NOMTERC, SALI_IMPTOS, SALI_OBS
    FROM SALIDAS S, BODEGA B WHERE S.BODE_COD = B.BODE_COD AND S.SALI_ID = :ID into
    :PREF, :NUMERO, :FECHA, :CONCEPTO, :REFER, :CODBODEGA, :NOMBODEGA, :NOMTERCERO, :IMPTOS, :OBS;
  SELECT SUM(SADE_TOTAL), SUM(SADE_IVAMONTO), SUM(SADE_CONSUMO*SADE_CANT*SADE_FACTOR) FROM SALIDAS_DETALLE
    WHERE SALI_ID = :ID INTO :TOTALDOC, :IVAMONTO, :CONSUMODOC;
  TOTALMASIMP = TOTALDOC + CONSUMODOC;
  if (IMPTOS = 'N') then
    TOTALDOC = TOTALDOC - IVAMONTO;
  FOR SELECT SADE_ITEM, A.ARTI_COD, SADE_CODBAR, SADE_DESC, SADE_CANT, SADE_UNIDAD, BODE_COD, SADE_COSTO, SADE_IVAPORC, SADE_IVAMONTO, SADE_CONSUMO, SADE_TOTAL, SADE_LOTE,
    (ARTI_PESO / 1000 * SADE_CANT * SADE_FACTOR), (ARTI_LARGO / 100 * SADE_FACTOR), (ARTI_ANCHO / 100 * SADE_FACTOR), (ARTI_ALTO / 100 * SADE_FACTOR)
    FROM SALIDAS_DETALLE D, ARTICULO A
    WHERE D.ARTI_COD = A.ARTI_COD AND D.SALI_ID = :ID
    ORDER BY SADE_ITEM
    INTO :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :BODITEM, :COSTO, :IVAPORC, :IVAMONTO, :CONSUMO, :TOTAL, :LOTE, :PESOUNIT, :LARGO, :ANCHO, :ALTO
    DO
      BEGIN
      EXECUTE PROCEDURE LEE_CONFIGURACION('INVENTARIO','DOCUMENTOS','CODIGO DE LISTA DE PRECIOS A IMPRIMIR EN DOCUMENTOS') returning_values (:LISTA);
      if (NOT lista IS NULL) then
          SELECT PRAR_FIJO FROM PRECIOS_ARTICULO WHERE ARTI_COD = :articulo AND LIPR_COD = :LISTA INTO :PRECIO;
      EXECUTE PROCEDURE ultimo_costo(:articulo, :fecha,  :unidad) returning_values (:ultimo);
      TOTALULT = CANT * ULTIMO;
      TOTALITEM = COSTO + IVAMONTO + CONSUMO;
      if (IMPTOS = 'N') then
        TOTAL = TOTAL - IVAMONTO;
      if (PESOUNIT IS NULL) then
        PESOUNIT = 0;
      PESOTOT = PESOTOT + PESOUNIT;
      VOLUMUNIT = ANCHO * ALTO * LARGO;
      volumunit = VOLUMUNIT * CANT;
      if (VOLUMUNIT IS NULL) then
        VOLUMUNIT = 0;
      VOLUMTOT = VOLUMTOT + VOLUMUNIT;
      SELECT STAND_COD FROM STANDS WHERE ARTI_COD = :ARTICULO AND STAND_BODEGA = :boditem INTO :stand;
      SUSPEND;
      END
END

^

SET TERM ; ^

/* 20091106 */
CREATE DESCENDING INDEX CRM_EVENTOS_IDX3
ON CRM_EVENTOS (CREV_FECHA);
CREATE INDEX CRM_COMPROMISOS_IDX1
ON CRM_COMPROMISOS (CRCO_NIT);

INSERT INTO CRM_ESTADO (CRES_ID, CRES_NOMBRE, CRES_COLOR) VALUES (5, 'Compromiso cumplido', '$0065DC71');

INSERT INTO CONFIGURACION (CONF_MODULO, CONF_CATEGORIA, CONF_PROPIEDAD, CONF_VALOR, CONF_POSIBLES, CONF_AYUDA) VALUES ('CRM', 'PROSPECTOS', 'NOMBRE CAMPO CONTACTO/RAZON SOCIAL', 'Contacto', NULL, 'Indique el nombre de la columna o dato del prospecto');

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

SET TERM ^ ;

CREATE OR ALTER procedure BUSQUEDA_PROSPECTOS (
    INACTIVOS char(1),
    BUSCAR varchar(100),
    CUALQUIERA char(1),
    COLUMNA integer,
    BUSCAR2 varchar(30),
    BUSCAR3 varchar(30),
    BUSCAR4 varchar(30),
    BUSCAR5 varchar(30))
returns (
    NIT varchar(20),
    NOMBRE varchar(60),
    ENCARGADO varchar(60),
    DIR varchar(100),
    CIUD varchar(40),
    TEL varchar(40),
    VEND varchar(60),
    ANIV date,
    RELACION varchar(60),
    ESTADO varchar(60),
    ULTFEC date,
    ASESOR varchar(60),
    CONTACTO varchar(60),
    CLASE varchar(60),
    AGRUPA varchar(60))
AS
declare variable TIPOREL INTEGER;
declare variable CODCLASE VARCHAR(20);
declare variable CODAGRUPA INTEGER;
declare variable CODESTADO INTEGER;
declare variable OK CHAR(1);
begin
if ((BUSCAR IS NOT NULL) AND (BUSCAR <> '')) then
    BEGIN
    FOR select CRCL_NIT, CRCL_NOM, CRCL_DIR, CRCL_CIU, CRCL_TEL, CRCL_CONTACTO, CRCL_ANIV, CRCL_TIPORELA, CRCL_ESTADO, CRCL_CLASE, CRCL_AGRUPA
        FROM CRM_CLIENTES WHERE ((:INACTIVOS = 'S') or (CRCL_ESTADO <> 0)) AND
            ((:COLUMNA <> 0) or (upper(CRCL_NIT) like upper(:buscar))) AND
            ((:columna <> 1) or (upper(CRCL_NOM) like upper(:buscar))) AND
            ((:columna <> 2) or (upper(CRCL_CONTACTO) like upper(:buscar)))
         INTO :NIT, :NOMBRE, :DIR, :CIUD, :TEL, :ENCARGADO, :ANIV, :TIPOREL, :CODESTADO, :CODCLASE, :CODAGRUPA
         DO
         BEGIN
         CLASE = '';
         AGRUPA = '';
         RELACION = '';
         ESTADO = '';
         VEND = '';
         SELECT CRTR_NOMBRE FROM crm_tiporelacion WHERE crtr_id = :tiporel INTO :relacion;
         SELECT CRES_NOMBRE FROM crm_estado WHERE cres_id = :codestado INTO :estado;
         SELECT CRCL_NOMBRE FROM crm_clase WHERE crcl_id = :codclase INTO :clase;
         SELECT CRAG_NOMBRE FROM crm_agrupacion WHERE crag_id = :codagrupa INTO :agrupa;
         SELECT VEND_NOMBRE FROM CLIENTES C, VENDEDORES V WHERE TERC_NIT = :NIT AND C.vend_cod = V.vend_cod INTO :vend;
         ULTFEC = NULL;
         ASESOR = NULL;
         CONTACTO = NULL;
         select first 1 CREV_FECHA, CREV_ASESOR, E.CREV_RESPUESTA
            from CRM_EVENTOS E, CRM_TIPOCONTACTO T where CRCL_NIT = :NIT and E.CREV_TIPO = T.CRTC_ID
            order by CREV_FECHA desc
            into :ULTFEC, :ASESOR, :CONTACTO;
         if (CONTACTO is not null) then
            select CRER_NOMBRE from CRM_EVENTO_RESPUESTA WHERE CRER_ID = :CONTACTO into :CONTACTO;

         if (CUALQUIERA = 'S') then
            SUSPEND;
         ELSE
            if ((COLUMNA > 0) AND (BUSCAR2 <> '')) then
                BEGIN
                OK = 'S';
                IF (NOT EXISTS (SELECT CRCL_NIT FROM CRM_CLIENTES WHERE CRCL_NIT = :NIT AND
                    ((:columna <> 1) or (upper(CRCL_NOM) like upper(:buscar2))) AND
                    ((:columna <> 2) or (upper(CRCL_CONTACTO) like upper(:buscar2))))) THEN
                    OK = 'N';
                if ((OK = 'S') AND (BUSCAR3 <> '')) then
                    IF (NOT EXISTS (SELECT CRCL_NIT FROM CRM_CLIENTES WHERE CRCL_NIT = :NIT AND
                        ((:columna <> 1) or (upper(CRCL_NOM) like upper(:buscar3))) AND
                        ((:columna <> 2) or (upper(CRCL_CONTACTO) like upper(:buscar3))))) THEN
                        OK = 'N';
                if ((OK = 'S') AND (BUSCAR4 <> '')) then
                    IF (NOT EXISTS (SELECT CRCL_NIT FROM CRM_CLIENTES WHERE CRCL_NIT = :NIT AND
                        ((:columna <> 1) or (upper(CRCL_NOM) like upper(:buscar4))) AND
                        ((:columna <> 2) or (upper(CRCL_CONTACTO) like upper(:buscar4))))) THEN
                        OK = 'N';
                if ((OK = 'S') AND (BUSCAR5 <> '')) then
                    IF (NOT EXISTS (SELECT CRCL_NIT FROM CRM_CLIENTES WHERE CRCL_NIT = :NIT AND
                        ((:columna <> 1) or (upper(CRCL_NOM) like upper(:buscar5))) AND
                        ((:columna <> 2) or (upper(CRCL_CONTACTO) like upper(:buscar5))))) THEN
                        OK = 'N';
                if (OK = 'S') then
                    SUSPEND;
                END
            ELSE
                SUSPEND;
        END
    END
else
    BEGIN
    FOR select CRCL_NIT, CRCL_NOM, CRCL_DIR, CRCL_CIU, CRCL_TEL, CRCL_CONTACTO, CRCL_ANIV, CRCL_TIPORELA, CRCL_ESTADO, CRCL_CLASE, CRCL_AGRUPA
        FROM CRM_CLIENTES WHERE ((:INACTIVOS = 'S') or (CRCL_ESTADO <> 0))
         INTO :NIT, :NOMBRE, :DIR, :CIUD, :TEL, :ENCARGADO, :ANIV, :TIPOREL, :CODESTADO, :CODCLASE, :CODAGRUPA
         DO
         BEGIN
         CLASE = '';
         AGRUPA = '';
         RELACION = '';
         ESTADO = '';
         VEND = '';
         SELECT CRTR_NOMBRE FROM crm_tiporelacion WHERE crtr_id = :tiporel INTO :relacion;
         SELECT CRES_NOMBRE FROM crm_estado WHERE cres_id = :codestado INTO :estado;
         SELECT CRCL_NOMBRE FROM crm_clase WHERE crcl_id = :codclase INTO :clase;
         SELECT CRAG_NOMBRE FROM crm_agrupacion WHERE crag_id = :codagrupa INTO :agrupa;
         SELECT VEND_NOMBRE FROM CLIENTES C, VENDEDORES V WHERE TERC_NIT = :NIT AND C.vend_cod = V.vend_cod INTO :vend;
         ULTFEC = NULL;
         ASESOR = NULL;
         CONTACTO = NULL;
         select first 1 CREV_FECHA, CREV_ASESOR, E.CREV_RESPUESTA
            from CRM_EVENTOS E, CRM_TIPOCONTACTO T where CRCL_NIT = :NIT and E.CREV_TIPO = T.CRTC_ID
            order by CREV_FECHA desc
            into :ULTFEC, :ASESOR, :CONTACTO;
         if (CONTACTO is not null) then
            select CRER_NOMBRE from CRM_EVENTO_RESPUESTA WHERE CRER_ID = :CONTACTO into :CONTACTO;
         SUSPEND;
         END
    END
end
^

SET TERM ; ^

SET TERM ^ ;

create trigger CRM_COMPROMISOS_AU for CRM_COMPROMISOS
active AFTER UPDATE position 0
as
declare variable NUMROWS INTEGER;
begin
/* actualice el estado */
SELECT COUNT(CRCO_ID) FROM crm_compromisos WHERE CRCO_NIT = NEW.crco_nit AND CRCO_ANULADO = 'N' AND
    CRCO_CUMPLIDO = 'N' INTO :NUMROWS;
if (NUMROWS > 0) then
    update crm_clientes set crcl_estado = 2 where crcl_nit = new.crco_nit;
ELSE
    BEGIN
    SELECT COUNT(CRCO_ID) FROM crm_compromisos WHERE CRCO_NIT = NEW.crco_nit AND CRCO_ANULADO = 'N' AND
        CRCO_CUMPLIDO = 'S' INTO :NUMROWS;
    if (NUMROWS > 0) then
        update crm_clientes set crcl_estado = 5 where crcl_nit = new.crco_nit;
    else
        update crm_clientes set crcl_estado = 1 where crcl_nit = new.crco_nit;
    END
end
^

SET TERM ; ^

SET TERM ^ ;

create trigger CRM_COMPROMISOS_AD for CRM_COMPROMISOS
active AFTER DELETE position 0
as
declare variable NUMROWS INTEGER;
begin
/* actualice el estado */
SELECT COUNT(CRCO_ID) FROM crm_compromisos WHERE CRCO_NIT = OLD.crco_nit AND CRCO_ANULADO = 'N' AND
    CRCO_CUMPLIDO = 'N' INTO :NUMROWS;
if (NUMROWS > 0) then
    update crm_clientes set crcl_estado = 2 where crcl_nit = OLD.crco_nit;
ELSE
    BEGIN
    SELECT COUNT(CRCO_ID) FROM crm_compromisos WHERE CRCO_NIT = OLD.crco_nit AND CRCO_ANULADO = 'N' AND
        CRCO_CUMPLIDO = 'S' INTO :NUMROWS;
    if (NUMROWS > 0) then
        update crm_clientes set crcl_estado = 5 where crcl_nit = OLD.crco_nit;
    else
        update crm_clientes set crcl_estado = 1 where crcl_nit = OLD.crco_nit;
    END
end
^

SET TERM ; ^


/* 20091107 */
/* DIAS DE INV Y MAXIMO EN EL REPORTE */

SET TERM ^ ;

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

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

SET TERM ; ^



/* 20091109 */

UPDATE CONFIGURACION
SET CONF_PROPIEDAD = 'PREFIJO PARA INGRESAR AL INVENTARIO PENDIENTES POR ENTREGAR',
    CONF_VALOR = '',
    CONF_POSIBLES = '',
    CONF_AYUDA = 'Indique el prefijo del pedido que se usará para el registro de pendientes por entregar que generará una entrada al inventario automática'
WHERE (CONF_MODULO = 'FACTURACION') AND (CONF_CATEGORIA = 'PEDIDOS') AND (CONF_PROPIEDAD = 'INGRESAR AL INVENTARIO PENDIENTES POR ENTREGAR');
COMMIT WORK;

SET TERM ^ ;

CREATE OR ALTER TRIGGER PEDIDOS_BI FOR PEDIDOS
ACTIVE BEFORE INSERT POSITION 0
AS
declare variable NUMERO VARCHAR(6);
declare variable AUTOM CHAR(1);
declare variable EXISTE CHAR(1);
/*DECLARE VARIABLE VALCUPO CHAR(10);*/
declare variable CUPOPED CHAR(10);
declare variable DISPONIBLE NUMERIC(18,2);
declare variable OK CHAR(1);
declare variable FECSERVER CHAR(2);
declare variable ENTREGA char(9);
declare variable BOD char(2);
BEGIN
NEW.pedi_vence = NEW.pedi_fecha + NEW.pedi_validez;

EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION', 'DOCUMENTOS', 'INHABILITAR FECHA EN DOCUMENTOS') returning_values (:fecserver);
if (FECSERVER = 'SI') then
    NEW.pedi_fecha = CAST ('NOW' AS DATE);
OK = 'S';
/*EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'ACCION A TOMAR SI EL CUPO DE CREDITO ES INSUFICIENTE') RETURNING_VALUES (:VALCUPO);*/
EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION','PEDIDOS','VALIDAR CUPO DE CREDITO EN EL PEDIDO') RETURNING_VALUES (:CUPOPED);
IF (CUPOPED = 'PROHIBIR') THEN /*AND (CUPOPED = 'SI')) THEN*/
  BEGIN
  OK = 'N';
  /* VERIFIQUE EL CUPO DE CREDITO */
  execute procedure cupo_disponible(new.TERC_NIT, NEW.pedi_fecha, NEW.pedi_sucursal) returning_values (:DISPONIBLE);
  if (DISPONIBLE >= NEW.pedi_total) then
    OK = 'S';
  END
IF (OK = 'S') THEN
  begin
  if (NEW.NUMOK = 'N') then
    BEGIN
    /* Actualice el contador del prefijo */
    SELECT PREF_ACTUAL, PREF_AUTO FROM PREFIJOS WHERE TIDO_COD = 34 AND PREF_PRE = NEW.PREF_PRE INTO :NUMERO, :AUTOM;
    /* ACTUALICE EL NUMERO EN COMPROBANTE_ENCABEZADO  */
    if (AUTOM = 'S') then
        BEGIN
        NEW.PEDI_NUMERO = NUMERO;
        NUMERO = CAST((CAST(NUMERO AS INTEGER) + 1) AS CHAR(6));
        UPDATE PREFIJOS
          SET PREF_ACTUAL = :NUMERO
          WHERE TIDO_COD = 34 AND PREF_PRE = NEW.PREF_PRE;
        END
    ELSE
        BEGIN
        if (CAST(NUMERO AS INTEGER) = CAST(NEW.PEDI_NUMERO AS INTEGER)) then
            UPDATE PREFIJOS
                SET PREF_ACTUAL = CAST((CAST(PREF_ACTUAL AS INTEGER) + 1) AS CHAR(6))
                WHERE TIDO_COD = 34 AND PREF_PRE = NEW.PREF_PRE;
        END
    EXECUTE PROCEDURE COMPLETA_CEROS (NEW.PEDI_numero) returning_values (NEW.PEDI_numero);
    NEW.NUMOK = 'S';
    END
  /* Verifique que el numero no existe previamente */
  EXISTE = 'N';
  SELECT 'S' FROM PEDIDOS WHERE PREF_PRE = NEW.PREF_PRE AND PEDI_NUMERO = NEW.PEDI_NUMERO INTO :EXISTE;
  if (EXISTE = 'S') then
    EXCEPTION DOCUMENTO_REGISTRADO 'Ya existe un pedido con el número ' || new.pref_pre || new.pedi_numero;
  END
else
  begin
  EXCEPTION CUPO_INSUFICIENTE;
  end
if ((new.PEDI_TOTAL-new.PEDI_IVAMONTO+new.PEDI_DTOMONTO-new.PEDI_ADICIONAL) = 0) then
    NEW.PEDI_FACTOR = 1;
else
    NEW.PEDI_FACTOR = (new.PEDI_TOTAL-new.PEDI_IVAMONTO)/(new.PEDI_TOTAL-new.PEDI_IVAMONTO+new.PEDI_DTOMONTO-new.PEDI_ADICIONAL);

execute procedure lee_configuracion ('FACTURACION', 'PEDIDOS', 'PREFIJO PARA INGRESAR AL INVENTARIO PENDIENTES POR ENTREGAR') returning_values (:entrega);
if ((NEW.pref_pre = :entrega) AND (NEW.PEDI_PENDIENTE = 'S')) then
    begin
    NEW.pedi_identr = gen_id(id_entrada, 1);
    SELECT BODE_COD FROM punto_venta WHERE PTVT_ID = NEW.ptvt_id INTO :BOD;
    insert into ENTRADAS (ENTR_ID, TIDO_COD, PREF_PRE, ENTR_NUMERO, BODE_COD, ENTR_FECHA, ENTR_CONC,
        ENTR_REFER, ENTR_TIPOREF, ENTR_IDREF, ENTR_IMPTOS, ENTR_NOMTERC, ENTR_ANULADO, ENTR_TRANSMIT, ENTR_OBS, TERC_NIT, NUMOK, ENTR_USUARIO)
        VALUES (NEW.pedi_identr, 11, new.pref_pre, NEW.pedi_numero, :bod, NEW.pedi_fecha, 'PENDIENTE POR ENTREGAR ' || NEW.pref_pre || NEW.pedi_numero || '-' || SUBSTRING(NEW.pedi_nomterc FROM 1 FOR 25),
        new.pref_pre || NEW.pedi_numero, 34, NEW.pedi_id, 'N', new.pedi_nomterc, 'N', 'N', new.pedi_obs, new.terc_nit, 'N', USER);
    end
else
    NEW.pedi_identr = 0;
END
^

SET TERM ; ^


/* 20091110 */
/* BASE E IVA EN DEVOLUCIONES DEL POS QUEDABA NEGATIVA, ESA HACE QUE AL APLICAR FACTOR AL CIERRE CALCULE MAL LOS VALORES */

SET TERM ^ ;

CREATE OR ALTER procedure CIERRE_FACTURACION (
    FECHA date,
    PUNTO integer,
    PREFIJO varchar(4))
returns (
    PREF varchar(4),
    AUTORIZA varchar(20),
    PUNTOVTA varchar(60),
    NUMINI varchar(6),
    NUMFIN varchar(6),
    NROFAC integer,
    HORAINI time,
    HORAFIN time,
    BASEFAC numeric(18,2),
    IVAFAC numeric(18,2),
    TOTALFAC numeric(18,2),
    NROITE integer,
    NRODEV integer,
    BASEDEV numeric(18,2),
    IVADEV numeric(18,2),
    TOTALDEV numeric(18,2),
    BASENETO numeric(18,2),
    IVANETO numeric(18,2),
    TOTALNETO numeric(18,2),
    BASEF0 numeric(18,2),
    IVAF0 numeric(18,2),
    TOTALF0 numeric(18,2),
    BASED0 numeric(18,2),
    IVAD0 numeric(18,2),
    TOTALD0 numeric(18,2),
    BASEF1 numeric(18,2),
    IVAF1 numeric(18,2),
    TOTALF1 numeric(18,2),
    BASED1 numeric(18,2),
    IVAD1 numeric(18,2),
    TOTALD1 numeric(18,2),
    BASEF2 numeric(18,2),
    IVAF2 numeric(18,2),
    TOTALF2 numeric(18,2),
    BASED2 numeric(18,2),
    IVAD2 numeric(18,2),
    TOTALD2 numeric(18,2),
    BASEF3 numeric(18,2),
    IVAF3 numeric(18,2),
    TOTALF3 numeric(18,2),
    BASED3 numeric(18,2),
    IVAD3 numeric(18,2),
    TOTALD3 numeric(18,2),
    BASEF4 numeric(18,2),
    IVAF4 numeric(18,2),
    TOTALF4 numeric(18,2),
    BASED4 numeric(18,2),
    IVAD4 numeric(18,2),
    TOTALD4 numeric(18,2),
    FORMAP1 numeric(18,2),
    FORMAP2 numeric(18,2),
    FORMAP3 numeric(18,2),
    FORMAP4 numeric(18,2),
    FORMAP5 numeric(18,2),
    CARTERA numeric(18,2),
    VENDEDOR1 varchar(60),
    VTAVEND1 numeric(18,2),
    VENDEDOR2 varchar(60),
    VTAVEND2 numeric(18,2),
    VENDEDOR3 varchar(60),
    VTAVEND3 numeric(18,2),
    VENDEDOR4 varchar(60),
    VTAVEND4 numeric(18,2),
    VENDEDOR5 varchar(60),
    VTAVEND5 numeric(18,2),
    NROFACTANUL integer,
    IVANUL numeric(18,2),
    TOTALFACANUL numeric(18,2))
AS
declare variable tarifa NUMERIC(9,2);
declare variable BASEF NUMERIC(18,2);
declare variable IVAF NUMERIC(18,2);
declare variable TOTALF NUMERIC(18,2);
declare variable BASEDv NUMERIC(18,2);
declare variable IVAD NUMERIC(18,2);
declare variable TOTALD NUMERIC(18,2);
declare variable I INTEGER;
declare variable CODVEN INTEGER;
declare variable VENDED VARCHAR(60);
declare variable R_IDDOC INTEGER;
declare variable F_ID INTEGER;
declare variable F_TOTAL NUMERIC(18,2);
declare variable FACTOR NUMERIC(18,4);
declare variable AJUSTE INTEGER;
begin
if (PREFIJO <> '') then
  SELECT PREF_PRE, AUTO_NUMERO FROM AUTORIZACIONES WHERE PREF_PRE = :PREFIJO INTO :PREF, :autoriza;
SELECT PTVT_NOM FROM PUNTO_VENTA WHERE PTVT_ID = :punto INTO :puntovta;
SELECT MIN(AUDI_HORA) FROM AUDITORIA WHERE TIDO_COD = 131 AND AUDI_FECHA = :FECHA INTO :HORAINI;
HORAFIN = CAST('NOW' AS TIME);
  /* LAS VENTAS */
  SELECT MIN(FACT_NUMERO), MAX(FACT_NUMERO), COUNT(FACT_NUMERO), SUM(FACT_TOTAL - FACT_IVAMONTO), SUM(FACT_IVAMONTO), SUM(FACT_TOTAL)
    FROM FACTURAS WHERE FACT_FECHA = :FECHA AND PTVT_ID = :PUNTO AND ((PREF_PRE = :PREFIJO) or (:PREFIJO = '')) and FACT_ANULADO = 'N'
    INTO :NUMINI, :NUMFIN, :NROFAC, :BASENETO, :IVANETO, :TOTALNETO;
  SELECT COUNT(FADE_ITEM), SUM(FADE_TOTAL-FADE_IVAMONTO), SUM(FADE_IVAMONTO), SUM(FADE_TOTAL) FROM facturas_detalle D, FACTURAS F
    WHERE D.FACT_ID = F.FACT_ID AND FACT_FECHA = :FECHA AND PTVT_ID = :PUNTO AND ((PREF_PRE = :PREFIJO) or (:PREFIJO = '')) AND FADE_CANT > 0 and FACT_ANULADO = 'N' and substring(d.arti_cod from 1 FOR 2) <> '.t'
    INTO :nroite, :BASEFAC, :IVAFAC, :TOTALFAC;
  SELECT COUNT(FADE_ITEM), SUM(FADE_IVAMONTO-FADE_TOTAL), SUM(FADE_IVAMONTO*-1), SUM(FADE_TOTAL*-1) FROM facturas_detalle D, FACTURAS F
    WHERE D.FACT_ID = F.FACT_ID AND FACT_FECHA = :FECHA AND PTVT_ID = :PUNTO AND ((PREF_PRE = :PREFIJO) or (:PREFIJO = '')) AND FADE_CANT < 0 and FACT_ANULADO = 'N' and substring(d.arti_cod from 1 FOR 2) <> '.t'
    INTO :NRODEV, :BASEDEV, :IVADEV, :TOTALDEV;
  SELECT COUNT(DVDE_ITEM), SUM(DVDE_TOTAL-DVDE_IVAMONTO), SUM(DVDE_IVAMONTO), SUM(DVDE_TOTAL) FROM devoluciones_ventas_detalle D, devoluciones_ventas F
    WHERE D.DEVT_ID = F.DEVT_ID AND DEVT_FECHA = :FECHA AND PTVT_ID = :PUNTO AND ((PREF_PRE = :PREFIJO) or (:PREFIJO = '')) AND DEVT_ANULADO = 'N' and substring(d.arti_cod from 1 FOR 2) <> '.t'
    INTO :I, :BASEDV, :IVAD, :TOTALD;
  SELECT COUNT(FACT_NUMERO),SUM(FACT_TOTAL - FACT_IVAMONTO), SUM(FACT_IVAMONTO) FROM FACTURAS
    WHERE FACT_FECHA = :FECHA AND PTVT_ID = :PUNTO AND ((PREF_PRE = :PREFIJO) or (:PREFIJO = '')) and FACT_ANULADO = 'S'
    INTO :NROFACTANUL, :TOTALFACANUL, :IVANUL;
  if (nrofac is null) then
    nrofac = 0;
  if (NROFACTANUL is null) then
    NROFACTANUL = 0;
  if (TOTALFACANUL is null) then
    TOTALFACANUL = 0;
  if (IVANUL is null) then
    IVANUL = 0;
  if (baseneto is null) then
    baseneto = 0;
  if (ivaneto is null) then
    ivaneto = 0;
  if (totalneto is null) then
    totalneto = 0;
  if (nroite is null) then
    nroite = 0;
  if (basefac is null) then
    basefac = 0;
  if (ivafac is null) then
    ivafac = 0;
  if (totalfac is null) then
    totalfac = 0;
  if (nrodev is null) then
    nrodev = 0;
  if (basedev is null) then
    basedev = 0;
  if (ivadev is null) then
    ivadev = 0;
  if (totaldev is null) then
    totaldev = 0;
  if (I is null) then
    I = 0;
  if (basedv is null) then
    basedv = 0;
  if (ivad is null) then
    ivad = 0;
  if (totald is null) then
    totald = 0;
  NRODEV = NRODEV + I;
  BASEDEV = BASEDEV + BASEDV;
  IVADEV = IVADEV + IVAD;
  TOTALDEV = TOTALDEV + TOTALD;

  /* POR TARIFA DE IVA */
  I = 0;
  BASEF0 = 0;
  BASED0 = 0;
  IVAF0 = 0;
  IVAD0 = 0;
  TOTALF0 = 0;
  TOTALD0 = 0;
  BASEF1 = 0;
  BASED1 = 0;
  IVAF1 = 0;
  IVAD1 = 0;
  TOTALF1 = 0;
  TOTALD1 = 0;
  BASEF2 = 0;
  BASED2 = 0;
  IVAF2 = 0;
  IVAD2 = 0;
  TOTALF2 = 0;
  TOTALD2 = 0;
  BASEF3 = 0;
  BASED3 = 0;
  IVAF3 = 0;
  IVAD3 = 0;
  TOTALF3 = 0;
  TOTALD3 = 0;
  BASEF4 = 0;
  BASED4 = 0;
  IVAF4 = 0;
  IVAD4 = 0;
  TOTALF4 = 0;
  TOTALD4 = 0;
  vtavend1 = 0;
  vtavend2 = 0;
  vtavend3 = 0;
  vtavend4 = 0;
  vtavend5 = 0;
  FOR SELECT TAIV_PORC FROM TARIFA_IVA ORDER BY TAIV_PORC INTO :TARIFA DO
    BEGIN
    I = I + 1;
    SELECT SUM(FADE_TOTAL-FADE_IVAMONTO), SUM(FADE_IVAMONTO), SUM(FADE_TOTAL) FROM facturas_detalle D, FACTURAS F
        WHERE D.FACT_ID = F.FACT_ID AND FACT_FECHA = :FECHA AND PTVT_ID = :PUNTO AND ((PREF_PRE = :PREFIJO) or (:PREFIJO = '')) AND FADE_CANT > 0 AND FADE_IVAPORC = :TARIFA and FACT_ANULADO = 'N'
        INTO :BASEF, :IVAF, :TOTALF;
    SELECT SUM(FADE_TOTAL-FADE_IVAMONTO), SUM(FADE_IVAMONTO), SUM(FADE_TOTAL) FROM facturas_detalle D, FACTURAS F
        WHERE D.FACT_ID = F.FACT_ID AND FACT_FECHA = :FECHA AND PTVT_ID = :PUNTO AND ((PREF_PRE = :PREFIJO) or (:PREFIJO = '')) AND FADE_CANT < 0 AND FADE_IVAPORC = :TARIFA and FACT_ANULADO = 'N'
        INTO :BASEDV, :IVAD, :TOTALD;
    if (basef is null) then
        basef = 0;
    if (ivaf is null) then
        ivaf = 0;
    if (totalf is null) then
        totalf = 0;
    if (basedv is null) then
        basedv = 0;
    if (ivad is null) then
        ivad = 0;
    if (totald is null) then
        totald = 0;

    FACTOR = 1;
    SELECT AJCI_FACTOR FROM ajuste_cierre WHERE AJCI_PORC = :TARIFA AND AJCI_FECINI <= :FECHA AND AJCI_FECFIN >= :FECHA INTO :FACTOR;
    if (FACTOR IS null) then
        FACTOR = 1;
    if (FACTOR <> 1) then
        AJUSTE = 1;
    BASEF = BASEF * FACTOR;
    BASEDV = BASEDV * FACTOR;
    IVAF = IVAF * FACTOR;
    IVAD = IVAD * FACTOR;
    TOTALF = TOTALF * FACTOR;
    TOTALD = TOTALD * FACTOR;

    if (I = 1) then
        BEGIN
        BASEF0 = BASEF;
        BASED0 = :BASEDV;
        IVAF0 = IVAF;
        IVAD0 = IVAD;
        TOTALF0 = TOTALF;
        TOTALD0 = TOTALD;
        SELECT SUM(DVDE_TOTAL-DVDE_IVAMONTO), SUM(DVDE_IVAMONTO), SUM(DVDE_TOTAL) FROM devoluciones_ventas_detalle D, devoluciones_ventas F
            WHERE D.DEVT_ID = F.DEVT_ID AND DEVT_FECHA = :FECHA AND PTVT_ID = :PUNTO AND ((PREF_PRE = :PREFIJO) or (:PREFIJO = '')) AND DVDE_IVAPORC = :TARIFA and DEVT_ANULADO = 'N'
            INTO :BASEDV, :IVAD, :TOTALD;
        if (basedv is null) then
            basedv = 0;
        if (ivad is null) then
            ivad = 0;
        if (totald is null) then
            totald = 0;
        BASED0 = BASED0 + BASEDV;
        IVAD0 = IVAD0 + IVAD;
        TOTALD0 = TOTALD0 + TOTALD;
        END
    if (I = 2) then
        BEGIN
        BASEF1 = BASEF;
        BASED1 = :BASEDV;
        IVAF1 = IVAF;
        IVAD1 = IVAD;
        TOTALF1 = TOTALF;
        TOTALD1 = TOTALD;
        SELECT SUM(DVDE_TOTAL-DVDE_IVAMONTO), SUM(DVDE_IVAMONTO), SUM(DVDE_TOTAL) FROM devoluciones_ventas_detalle D, devoluciones_ventas F
            WHERE D.DEVT_ID = F.DEVT_ID AND DEVT_FECHA = :FECHA AND PTVT_ID = :PUNTO AND ((PREF_PRE = :PREFIJO) or (:PREFIJO = '')) AND DVDE_IVAPORC = :TARIFA and DEVT_ANULADO = 'N'
            INTO :BASEDV, :IVAD, :TOTALD;
        if (basedv is null) then
            basedv = 0;
        if (ivad is null) then
            ivad = 0;
        if (totald is null) then
            totald = 0;
        BASED1 = BASED1 + BASEDV;
        IVAD1 = IVAD1 + IVAD;
        TOTALD1 = TOTALD1 + TOTALD;
        END
    if (I = 3) then
        BEGIN
        BASEF2 = BASEF;
        BASED2 = :BASEDV;
        IVAF2 = IVAF;
        IVAD2 = IVAD;
        TOTALF2 = TOTALF;
        TOTALD2 = TOTALD;
        SELECT SUM(DVDE_TOTAL-DVDE_IVAMONTO), SUM(DVDE_IVAMONTO), SUM(DVDE_TOTAL) FROM devoluciones_ventas_detalle D, devoluciones_ventas F
            WHERE D.DEVT_ID = F.DEVT_ID AND DEVT_FECHA = :FECHA AND PTVT_ID = :PUNTO AND ((PREF_PRE = :PREFIJO) or (:PREFIJO = '')) AND DVDE_IVAPORC = :TARIFA and DEVT_ANULADO = 'N'
            INTO :BASEDV, :IVAD, :TOTALD;
        if (basedv is null) then
            basedv = 0;
        if (ivad is null) then
            ivad = 0;
        if (totald is null) then
            totald = 0;
        BASED2 = BASED2 + BASEDV;
        IVAD2 = IVAD2 + IVAD;
        TOTALD2 = TOTALD2 + TOTALD;
        END
    if (I = 4) then
        BEGIN
        BASEF3 = BASEF;
        BASED3 = :BASEDV;
        IVAF3 = IVAF;
        IVAD3 = IVAD;
        TOTALF3 = TOTALF;
        TOTALD3 = TOTALD;
        SELECT SUM(DVDE_TOTAL-DVDE_IVAMONTO), SUM(DVDE_IVAMONTO), SUM(DVDE_TOTAL) FROM devoluciones_ventas_detalle D, devoluciones_ventas F
            WHERE D.DEVT_ID = F.DEVT_ID AND DEVT_FECHA = :FECHA AND PTVT_ID = :PUNTO AND ((PREF_PRE = :PREFIJO) or (:PREFIJO = '')) AND DVDE_IVAPORC = :TARIFA and DEVT_ANULADO = 'N'
            INTO :BASEDV, :IVAD, :TOTALD;
        if (basedv is null) then
            basedv = 0;
        if (ivad is null) then
            ivad = 0;
        if (totald is null) then
            totald = 0;
        BASED3 = BASED3 + BASEDV;
        IVAD3 = IVAD3 + IVAD;
        TOTALD3 = TOTALD3 + TOTALD;
        END
    if (I = 5) then
        BEGIN
        BASEF4 = BASEF;
        BASED4 = :BASEDV;
        IVAF4 = IVAF;
        IVAD4 = IVAD;
        TOTALF4 = TOTALF;
        TOTALD4 = TOTALD;
        SELECT SUM(DVDE_TOTAL-DVDE_IVAMONTO), SUM(DVDE_IVAMONTO), SUM(DVDE_TOTAL) FROM devoluciones_ventas_detalle D, devoluciones_ventas F
            WHERE D.DEVT_ID = F.DEVT_ID AND DEVT_FECHA = :FECHA AND PTVT_ID = :PUNTO AND ((PREF_PRE = :PREFIJO) or (:PREFIJO = '')) AND DVDE_IVAPORC = :TARIFA and DEVT_ANULADO = 'N'
            INTO :BASEDV, :IVAD, :TOTALD;
        if (basedv is null) then
            basedv = 0;
        if (ivad is null) then
            ivad = 0;
        if (totald is null) then
            totald = 0;
        BASED4 = BASED4 + BASEDV;
        IVAD4 = IVAD4 + IVAD;
        TOTALD4 = TOTALD4 + TOTALD;
        END
    END
  /* POR FORMA DE PAGO */
  SELECT SUM(RCPA_MONTO) FROM RECIBOS_CAJA_PAGO P, RECIBOS_CAJA R, PUNTO_VENTA PT
    WHERE R.RECA_ID = P.RECA_ID AND PT.PTVT_ID = :punto AND RECA_FECHA = :FECHA AND PT.caja_id = R.caja_id AND ((PT.PREF_PRE = :PREFIJO) or (:PREFIJO = '')) AND FOPA_ID = 1 and RECA_ANULADO = 'N'
    INTO :FORMAP1;
  SELECT SUM(RCPA_MONTO) FROM RECIBOS_CAJA_PAGO P, RECIBOS_CAJA R, PUNTO_VENTA PT
    WHERE R.RECA_ID = P.RECA_ID AND PT.PTVT_ID = :punto AND RECA_FECHA = :FECHA AND PT.caja_id = R.caja_id AND ((PT.PREF_PRE = :PREFIJO) or (:PREFIJO = '')) AND FOPA_ID = 2 and RECA_ANULADO = 'N'
    INTO :FORMAP2;
  SELECT SUM(RCPA_MONTO) FROM RECIBOS_CAJA_PAGO P, RECIBOS_CAJA R, PUNTO_VENTA PT
    WHERE R.RECA_ID = P.RECA_ID AND PT.PTVT_ID = :punto AND RECA_FECHA = :FECHA AND PT.caja_id = R.caja_id AND ((PT.PREF_PRE = :PREFIJO) or (:PREFIJO = '')) AND FOPA_ID = 3 and RECA_ANULADO = 'N'
    INTO :FORMAP3;
  SELECT SUM(RCPA_MONTO) FROM RECIBOS_CAJA_PAGO P, RECIBOS_CAJA R, PUNTO_VENTA PT
    WHERE R.RECA_ID = P.RECA_ID AND PT.PTVT_ID = :punto AND RECA_FECHA = :FECHA AND PT.caja_id = R.caja_id AND ((PT.PREF_PRE = :PREFIJO) or (:PREFIJO = '')) AND FOPA_ID = 4 and RECA_ANULADO = 'N'
    INTO :FORMAP4;
  SELECT SUM(RCPA_MONTO) FROM RECIBOS_CAJA_PAGO P, RECIBOS_CAJA R, PUNTO_VENTA PT
    WHERE R.RECA_ID = P.RECA_ID AND PT.PTVT_ID = :punto AND RECA_FECHA = :FECHA AND PT.caja_id = R.caja_id AND ((PT.PREF_PRE = :PREFIJO) or (:PREFIJO = '')) AND FOPA_ID = 5 and RECA_ANULADO = 'N'
    INTO :FORMAP5;

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

SET TERM ; ^


/* 20091111 */
/* VOLVIO A QUEDAR CON EL CONSUMO SIN REF IS NULL */
SET TERM ^ ;

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

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

SET TERM ; ^


/* 20091112b */
SET TERM ^ ;

create or alter procedure DESCARGA_REMIPROV_FALTANTE (
    REMISION1 varchar(10),
    REMISION2 varchar(10),
    REMISION3 varchar(10),
    REMISION4 varchar(10),
    REMISION5 varchar(10),
    REMISION6 varchar(10),
    PREFAC varchar(4),
    NUMFAC varchar(6))
returns (
    IDCON integer)
AS
declare variable IDF INTEGER;
declare variable IDR6 INTEGER;
declare variable IDR5 INTEGER;
declare variable IDR4 INTEGER;
declare variable IDR3 INTEGER;
declare variable IDR2 INTEGER;
declare variable IDR1 INTEGER;
declare variable ITEM INTEGER;
begin
IDR1 = 0;
IDR2 = 0;
IDR3 = 0;
IDR4 = 0;
IDR5 = 0;
IDR6 = 0;
ITEM = 0;
SELECT REPR_ID FROM remision_proveedor WHERE PREF_PRE = SUBSTR(:remision1, 1, 4) AND REPR_NUMERO = SUBSTR(:remision1, 5, 10) INTO :IDR1;
SELECT REPR_ID FROM remision_proveedor WHERE PREF_PRE = SUBSTR(:remision2, 1, 4) AND REPR_NUMERO = SUBSTR(:remision2, 5, 10) INTO :IDR2;
SELECT REPR_ID FROM remision_proveedor WHERE PREF_PRE = SUBSTR(:remision3, 1, 4) AND REPR_NUMERO = SUBSTR(:remision3, 5, 10) INTO :IDR3;
SELECT REPR_ID FROM remision_proveedor WHERE PREF_PRE = SUBSTR(:remision4, 1, 4) AND REPR_NUMERO = SUBSTR(:remision4, 5, 10) INTO :IDR4;
SELECT REPR_ID FROM remision_proveedor WHERE PREF_PRE = SUBSTR(:remision5, 1, 4) AND REPR_NUMERO = SUBSTR(:remision5, 5, 10) INTO :IDR5;
SELECT REPR_ID FROM remision_proveedor WHERE PREF_PRE = SUBSTR(:remision6, 1, 4) AND REPR_NUMERO = SUBSTR(:remision6, 5, 10) INTO :IDR6;
IF (IDR1 <> 0) THEN
    BEGIN
    ITEM = ITEM + 1;
    SELECT FACO_ID FROM facturas_compra WHERE PREF_PRE = :prefac AND FACO_NUMERO = :numfac INTO :IDF;
    IDCON = GEN_ID(ID_CONS, 1);
    UPDATE facturas_compra SET FACO_CONSOLIDA = :idcon WHERE FACO_ID = :IDF;
    INSERT INTO CONSOLIDE_FALTANTES (CEFA_ID, CEFA_ITEM, CEFA_TIPODES, CEFA_TIPOORI, CEFA_IDORI)
        VALUES (:IDCON, :ITEM, 21, 22, :IDR1);
    IF (IDR2 <> 0) THEN
        BEGIN
        ITEM = ITEM + 1;
        INSERT INTO CONSOLIDE_FALTANTES (CEFA_ID, CEFA_ITEM, CEFA_TIPODES, CEFA_TIPOORI, CEFA_IDORI)
            VALUES (:IDCON, :ITEM, 21, 22, :IDR2);
        END
    IF (IDR3 <> 0) THEN
        BEGIN
        ITEM = ITEM + 1;
        INSERT INTO CONSOLIDE_FALTANTES (CEFA_ID, CEFA_ITEM, CEFA_TIPODES, CEFA_TIPOORI, CEFA_IDORI)
            VALUES (:IDCON, :ITEM, 21, 22, :IDR3);
        END
    IF (IDR4 <> 0) THEN
        BEGIN
        ITEM = ITEM + 1;
        INSERT INTO CONSOLIDE_FALTANTES (CEFA_ID, CEFA_ITEM, CEFA_TIPODES, CEFA_TIPOORI, CEFA_IDORI)
            VALUES (:IDCON, :ITEM, 21, 22, :IDR4);
        END
    IF (IDR5 <> 0) THEN
        BEGIN
        ITEM = ITEM + 1;
        INSERT INTO CONSOLIDE_FALTANTES (CEFA_ID, CEFA_ITEM, CEFA_TIPODES, CEFA_TIPOORI, CEFA_IDORI)
            VALUES (:IDCON, :ITEM, 21, 22, :IDR5);
        END
    IF (IDR6 <> 0) THEN
        BEGIN
        ITEM = ITEM + 1;
        INSERT INTO CONSOLIDE_FALTANTES (CEFA_ID, CEFA_ITEM, CEFA_TIPODES, CEFA_TIPOORI, CEFA_IDORI)
            VALUES (:IDCON, :ITEM, 21, 22, :IDR6);
        END
    EXECUTE PROCEDURE consolide_pendientes (:IDCON);
    UPDATE consolidado_faltantes SET COFA_OK = 'S' WHERE COFA_ID = :idcon;
    suspend;
    END
end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure COMPRAS_SIN_INVENTARIO (
    FECINI date,
    FECFIN date,
    SOLOFALTA char(1))
returns (
    FACTURA varchar(10),
    ID integer,
    FECHA date,
    ITEM integer,
    ARTICULO varchar(20),
    DESCRIPCION varchar(60),
    CANT numeric(18,4),
    COSTO numeric(18,2),
    CONSOLIDA integer,
    TIPODOC integer,
    IDDOC integer,
    NUMDOC varchar(10),
    CANTDIF numeric(18,4))
AS
begin
FOR SELECT f.FACO_ID, PREF_PRE || FACO_NUMERO, FACO_FECHA, ARTI_COD, FCDE_ITEM, FCDE_CANT * FCDE_FACTOR, FCDE_DESC, FCDE_prunit / FCDE_FACTOR, FACO_CONSOLIDA
    FROM FACTURAS_COMPRA F, facturas_compras_detalle D
    WHERE F.faco_id = D.faco_id AND FACO_FECHA >= :FECINI AND FACO_FECHA <= :FECFIN AND FACO_ANULADO = 'N'
    ORDER BY FACO_ID, FCDE_ITEM 
    INTO :ID, :FACTURA, :FECHA, :ARTICULO, :ITEM, :CANT, :DESCRIPCION, :COSTO, :CONSOLIDA
    DO
    BEGIN
    if (NOT EXISTS (SELECT MVAR_CONS FROM movimiento_articulo WHERE MVAR_TIPODOC = 21 AND MVAR_IDREF = :ID AND MVAR_ITEM = :ITEM)) then
        BEGIN
        /* BUSQUELO COMO REMISION */
        if ((CONSOLIDA = 0) or (CONSOLIDA IS NULL)) then
            BEGIN
            TIPODOC = 0;
            IDDOC = 0;
            NUMDOC = '';
            SUSPEND;
            END
        else
            BEGIN
            if (NOT EXISTS(select mvar_cons from movimiento_articulo M, consolidado_faltantes C
                where C.cofa_id = :CONSOLIDA AND mvar_tipodoc = 22 and mvar_idref = C.cofa_idori AND C.cofa_tipoori = 22 and m.arti_cod = :articulo and m.mvar_item = c.cofa_itemori)) then
                BEGIN
                TIPODOC = 0;
                IDDOC = 0;
                NUMDOC = '';
                CANTDIF = CANT;
                SUSPEND;
                END
            else
                BEGIN
                for select mvar_tipodoc, mvar_idref, mvar_pref || mvar_numero, MVAR_CANT
                    from movimiento_articulo M, consolidado_faltantes C
                    where C.cofa_id = :CONSOLIDA AND mvar_tipodoc = 22 and mvar_idref = C.cofa_idori AND C.cofa_tipoori = 22 and m.arti_cod = :articulo and m.mvar_item = c.cofa_itemori and c.cofa_ok = 'S'
                    into :tipodoc, :iddoc, :numdoc, :cantdif
                    do
                    BEGIN
                    CANTDIF = CANT - CANTDIF;
                    if ((CANTDIF <> 0) or (solofalta = 'N')) then
                        SUSPEND;
                    END
                END
            END
        END
    ELSE
        begin
        if (solofalta = 'N') then
            BEGIN
            TIPODOC = 21;
            IDDOC = :ID;
            NUMDOC = FACTURA;
            CANTDIF = 0;
            SUSPEND;
            END
        end
    END
end
^

SET TERM ; ^


/* 20091112c */
SET TERM ^ ;

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

FOR SELECT ARTI_COD, ARTI_DES, ARTI_UNIDAD, A.GRUP_COD, A.SUBG_COD, A.MARC_COD, BODE_COD, BODE_NOM, ARTI_MIN, ARTI_MAX
      FROM ARTICULO A, BODEGA B
      WHERE ARTI_COD >= :CODINI AND ARTI_COD <= :CODFIN AND A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :GRPFIN AND
        ARTI_DES >= :DESINI AND ARTI_DES <= :DESFIN AND BODE_ACTIVA = 'S'
      ORDER BY ARTI_COD, BODE_COD
      INTO :CODIGO, :NOMBRE, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :CODBOD, :NOMBOD, :MINIMO, :MAXIMO
      DO
        BEGIN
        SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
        SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
        SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;

        if (maxdia = 'SI') then
            begin
            EXECUTE PROCEDURE DISPONIBILIDAD_ARTICULO(CODIGO, FECHA, :CODBOD) returning_values (:DISPONIBILIDAD, :CANT, :PROMEDIO, :SALIDAS);
            if ((DISPONIBILIDAD < minimo) and (PROMEDIO > 0)) then
                FALTANTE = (minimo * PROMEDIO) - cant;
            ELSE
                FALTANTE = 0;
            if ((DISPONIBILIDAD > maximo) and (PROMEDIO > 0)) then
                excedente = cant - (MAXIMO * PROMEDIO);
            ELSE
                EXCEDENTE = 0;
            if ((CEROS = 'S') or (FALTANTE <> 0) or (excedente <> 0))  then
                SUSPEND;
            end
        else
            begin
            EXECUTE PROCEDURE SALDO_INVENTARIO(CODIGO, :CODBOD, FECHA) returning_values (CANT);
            if (CANT < MINIMO) then
                FALTANTE = MINIMO - CANT;
            if (CANT > maximo) then
                excedente =  CANT - maximo;
            if ((CEROS = 'S') or (FALTANTE <> 0) or (excedente <> 0))  then
                SUSPEND;
            end
        END
END
^

SET TERM ; ^


/* 20091113 */
/* CONTABILIZACION DE EXEDENTES DE CAJA */
INSERT INTO CONFIGURACION (CONF_MODULO, CONF_CATEGORIA, CONF_PROPIEDAD, CONF_VALOR, CONF_POSIBLES, CONF_AYUDA) VALUES ('CAJA', 'RECIBOS', 'CUENTA CONTABLE PARA EXCENTES EN RECIBOS DE CAJA', '', '', 'Indique la cuenta contable donde se llevarán los excedentes recibidos');
commit work;

SET TERM ^ ;

CREATE OR ALTER procedure CONTABIL_RECICAJA (
    IDDOC integer,
    IDINTER integer)
returns (
    ERROR integer,
    VER char(1),
    IDC integer)
AS
declare variable PREF VARCHAR(4);
declare variable NUM VARCHAR(6);
declare variable FECAUX DATE;
declare variable FECHA CHAR(8);
declare variable CONC CHAR(120);
declare variable VRDTO NUMERIC(18,2);
declare variable VRRTFTE NUMERIC(18,2);
declare variable VRRTIVA NUMERIC(18,2);
declare variable VRRTICA NUMERIC(18,2);
declare variable VRTOTAL NUMERIC(18,2);
declare variable TIPOCOMP VARCHAR(3);
declare variable PREFCONT VARCHAR(4);
declare variable BASE CHAR(1);
declare variable CTABASE VARCHAR(20);
declare variable CAJA CHAR(1);
declare variable CTACAJA VARCHAR(20);
declare variable RTFTE CHAR(1);
declare variable CTARTFTE VARCHAR(20);
declare variable RTIVA CHAR(1);
declare variable CTARTIVA VARCHAR(20);
declare variable RTICA CHAR(1);
declare variable CTARTICA VARCHAR(20);
declare variable DTO CHAR(1);
declare variable CTADTO VARCHAR(20);
declare variable EXISTE CHAR(1);
declare variable CUENTA VARCHAR(20);
declare variable MONTO NUMERIC(18,2);
declare variable ES_RETENCION CHAR(1);
declare variable TIPOCUEN CHAR(1);
declare variable NIT VARCHAR(20);
declare variable PROY VARCHAR(4);
declare variable CENTRO VARCHAR(4);
declare variable DEBITO NUMERIC(18,2);
declare variable CREDITO NUMERIC(18,2);
declare variable NROI INTEGER;
declare variable SUMA NUMERIC(18,2);
declare variable TCTACLIEN VARCHAR(20);
declare variable TCTARTFTE VARCHAR(20);
declare variable TCTARTIVA VARCHAR(20);
declare variable TCTARTICA VARCHAR(20);
declare variable TIPOIT INTEGER;
declare variable IDIT INTEGER;
declare variable PREFIT VARCHAR(4);
declare variable NUMIT VARCHAR(6);
declare variable NUMEROIT VARCHAR(10);
declare variable ABONOIT NUMERIC(18,2);
declare variable CTADIC VARCHAR(20);
declare variable BASEADIC VARCHAR(20);
declare variable PORCADIC NUMERIC(5,2);
declare variable VALORADIC NUMERIC(18,2);
declare variable DBADIC CHAR(1);
declare variable ANULADO CHAR(1);
declare variable VRBASE NUMERIC(18,2);
declare variable PORC numeric(9,2);
declare variable OK INTEGER;
declare variable CRUCES NUMERIC(18,2);
declare variable VRCAJA NUMERIC(18,2);
declare variable DIFCAMBIO NUMERIC(18,2);
declare variable CTADIF VARCHAR(20);
declare variable PROVID INTEGER;
declare variable RTFTEC NUMERIC(18,2);
declare variable RTIVAC NUMERIC(18,2);
declare variable RTICAC NUMERIC(18,2);
declare variable RTFTER CHAR(1);
declare variable CTARTFTER VARCHAR(20);
declare variable RTIVAR CHAR(1);
declare variable CTARTIVAR VARCHAR(20);
declare variable RTICAR CHAR(1);
declare variable CTARTICAR VARCHAR(20);
declare variable RET CHAR(2);
declare variable RTIT NUMERIC(18,2);
declare variable EXEDENTE NUMERIC(18,2);
declare variable CTAEXCEDENTE VARCHAR(20);
BEGIN
ERROR = 0;
/* BUSQUE LA INTERFACE */
EXISTE = 'N';
SELECT 'S',TICO_COD,PRCO_PRE,INCJ_BASE,INCJ_DTOPP,INCJ_RTFTE,INCJ_RTIVA,INCJ_RTICA,INCJ_CAJA,INCJ_CTABASE,INCJ_CTADTO,INCJ_CTARTFTE,INCJ_CTARTIVA,INCJ_CTARTICA,INCJ_CTACAJA,INCJ_CONFIRMAR
    FROM INTERFAZ_CAJA
    WHERE INCJ_ID = :IDINTER
    INTO :EXISTE,:TIPOCOMP,:PREFCONT,:BASE,:DTO,:RTFTE,:RTIVA,:RTICA,:CAJA,:CTABASE,:CTADTO,:CTARTFTE,:CTARTIVA,:CTARTICA,:CTACAJA,:VER;
if (EXISTE = 'S') then
  BEGIN
  /* BORRE LA CONTABILIZACION ANTERIOR */
  execute procedure lee_configuracion('CAJA', 'RECIBOS', 'CUENTA CONTABLE PARA EXCENTES EN RECIBOS DE CAJA') returning_values (ctaexcedente);
  OK = 0;
  FOR SELECT CNTB_ID FROM CONTABILIZACION WHERE CNTB_TIPOREF = 61 AND CNTB_IDREF = :IDDOC INTO :OK DO
    BEGIN
    DELETE FROM CONTABILIZACION_DET WHERE CNTB_ID = :OK;
    DELETE FROM CONTABILIZACION WHERE CNTB_ID = :OK;
    END
  /* TRAIGA EL ENCABEZADO DEL RECIBO */
  SELECT PREF_PRE,RECA_NUMERO,RECA_FECHA,R.TERC_NIT,RECA_CONC,RECA_DTOF,RECA_MONTO,RECA_RTFTEMONTO,RECA_RTIVAMONTO,RECA_RTICAMONTO,TERC_CTARTFTE,TERC_CTARTIVA,TERC_CTARTICA,TERC_CTACLIENTE,RECA_ANULADO,RECA_PROVID, RECA_EXEDENTE
    FROM RECIBOS_CAJA R,TERCEROS T
    WHERE RECA_ID = :IDDOC AND R.TERC_NIT = T.TERC_NIT
    INTO :PREF,:NUM,:FECAUX,:NIT,:CONC,:VRDTO,:VRTOTAL,:VRRTFTE,:VRRTIVA,:VRRTICA,:TCTARTFTE,TCTARTIVA,TCTARTICA,TCTACLIEN,:ANULADO,:PROVID, :exedente;
  if (ANULADO = 'N') then
    BEGIN
    SELECT PREF_CENTRO,PREF_PROY FROM PREFIJOS
        WHERE PREF_PRE = :PREF AND TIDO_COD = 61 INTO :CENTRO,:PROY;
    EXECUTE PROCEDURE FECHA_A_CONTA(:FECAUX) returning_values (:FECHA);
    IDC = GEN_ID(ID_CONTABILIZA,1);
    INSERT INTO CONTABILIZACION (CNTB_ID,CNTB_TIPOCOMP,CNTB_PREFCNT,CNTB_NUMERO,CNTB_FECHA,CNTB_CONCEPTO,CNTB_REF,CNTB_TIPOREF,CNTB_IDREF,CNTB_PREFREF,CNTB_NUMREF,CNTB_PROCESADO)
        VALUES (:IDC,:TIPOCOMP,:PREFCONT,:NUM,:FECHA,:CONC,'',61,:IDDOC,:PREF,:NUM,'N');
    NROI = 0;
    SUMA = 0;
    /* SUME LOS CRUCES PARA LLEVARLOS A LA CUENTA X PAGAR Y RESTAR DE LA CAJA */
    SELECT SUM(RCCR_ABONO) FROM RECIBOS_CAJA_CRUCEC WHERE RECA_ID = :iddoc INTO :CRUCES;
    if (CRUCES IS NULL) then
        CRUCES = 0;
    VRCAJA = VRTOTAL;
    IF ((CAJA = 'K')) THEN
        BEGIN
        if (VRCAJA <> 0) then
            BEGIN
            CUENTA = NULL;
            EXECUTE PROCEDURE VALIDE_CUENTA_C (CTACAJA) RETURNING_VALUES (:OK);
            IF (OK = 0) THEN
                SELECT CUEN_COD,CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :CTACAJA INTO :CUENTA,:TIPOCUEN;
            ELSE
                begin
                EXECUTE PROCEDURE ERROR (61,:IDDOC,:CTACAJA,2);
                CUENTA = CTACAJA;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERROR (61,:IDDOC,:CUENTA,3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                EXECUTE PROCEDURE ERROR (61,:IDDOC,:CUENTA,4);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                IF (VRCAJA > 0) THEN
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID,CNDE_ITEM,CNDE_CUENTA,CNDE_CONC,CNDE_REF,CNDE_DEBITOS,CNDE_CREDITOS,CNDE_BASE,CNDE_PORC,CNDE_TERC,CNDE_PROY,CNDE_CENTRO,CNDE_DOCNUMERO,CNDE_DOCAPLICAR,CNDE_DOCVENCE,CNDE_ARTICULO,CNDE_DOCTIPOA,CNDE_DOCTIPON)
                        VALUES (:IDC,:NROI,:CUENTA,:CONC,'',:VRCAJA,0,0,0,:NIT,:PROY,:CENTRO,NULL,NULL,NULL,NULL,0,0);
                    SUMA = SUMA + VRCAJA;
                    END
                ELSE   
                    BEGIN                     
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID,CNDE_ITEM,CNDE_CUENTA,CNDE_CONC,CNDE_REF,CNDE_DEBITOS,CNDE_CREDITOS,CNDE_BASE,CNDE_PORC,CNDE_TERC,CNDE_PROY,CNDE_CENTRO,CNDE_DOCNUMERO,CNDE_DOCAPLICAR,CNDE_DOCVENCE,CNDE_ARTICULO,CNDE_DOCTIPOA,CNDE_DOCTIPON)
                       VALUES (:IDC,:NROI,:CUENTA,:CONC,'',0,ABS(:VRCAJA),0,0,:NIT,:PROY,:CENTRO,NULL,NULL,NULL,NULL,0,0);
                    SUMA = SUMA + VRCAJA;
                    END
                NROI = NROI + 1;
                END
            END
        END
    IF ((CAJA = 'F')) THEN
        BEGIN
        FOR SELECT MAX(FOPA_CTACONTA),SUM(RCPA_MONTO)
            FROM formas_pago F,recibos_caja_pago R
            WHERE R.RECA_ID = :IDDOC AND R.FOPA_ID = F.FOPA_ID
            GROUP BY FOPA_CTACONTA
            INTO :CTACAJA,:MONTO
        DO
            BEGIN
            if (MONTO <> 0) then
                BEGIN
                CUENTA = NULL;
                EXECUTE PROCEDURE VALIDE_CUENTA_C (CTACAJA) RETURNING_VALUES (:OK);
                IF (OK = 0) THEN
                    SELECT CUEN_COD,CUEN_TIPO FROM CUENTAS
                        WHERE CUEN_COD = :CTACAJA INTO :CUENTA,:TIPOCUEN;
                ELSE
                    begin
                    EXECUTE PROCEDURE ERROR (61,:IDDOC,:CTACAJA,2);
                    CUENTA = CTACAJA;
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (61,:IDDOC,:CUENTA,3);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (61,:IDDOC,:CUENTA,4);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    IF (MONTO > 0) THEN
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID,CNDE_ITEM,CNDE_CUENTA,CNDE_CONC,CNDE_REF,CNDE_DEBITOS,CNDE_CREDITOS,CNDE_BASE,CNDE_PORC,CNDE_TERC,CNDE_PROY,CNDE_CENTRO,CNDE_DOCNUMERO,CNDE_DOCAPLICAR,CNDE_DOCVENCE,CNDE_ARTICULO,CNDE_DOCTIPOA,CNDE_DOCTIPON)
                            VALUES (:IDC,:NROI,:CUENTA,:CONC,'',:MONTO,0,0,0,:NIT,:PROY,:CENTRO,NULL,NULL,NULL,NULL,0,0);
                        SUMA = SUMA + MONTO;
                        END
                    ELSE
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID,CNDE_ITEM,CNDE_CUENTA,CNDE_CONC,CNDE_REF,CNDE_DEBITOS,CNDE_CREDITOS,CNDE_BASE,CNDE_PORC,CNDE_TERC,CNDE_PROY,CNDE_CENTRO,CNDE_DOCNUMERO,CNDE_DOCAPLICAR,CNDE_DOCVENCE,CNDE_ARTICULO,CNDE_DOCTIPOA,CNDE_DOCTIPON)
                            VALUES (:IDC,:NROI,:CUENTA,:CONC,'',0,abs(:MONTO),0,0,:NIT,:PROY,:CENTRO,NULL,NULL,NULL,NULL,0,0);
                        SUMA = SUMA + MONTO;
                        END
                    NROI = NROI + 1;
                    END
                END /* MONTO <> 0 */
            END /* DO FORMA_PAGO */
        END /* CAJA = F */
    if (DTO = 'K') then /* DTO EN CTA CONSTANTE */
        BEGIN
        if (VRDTO <> 0) then
            BEGIN
            CUENTA = NULL;
            EXECUTE PROCEDURE VALIDE_CUENTA_C (CTADTO) RETURNING_VALUES (:OK);
            IF (OK = 0) THEN
                SELECT CUEN_COD,CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :CTADTO INTO :CUENTA,:TIPOCUEN;
            ELSE
                begin
                EXECUTE PROCEDURE ERROR (61,:IDDOC,:CTADTO,2);
                CUENTA = CTADTO;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERROR (61,:IDDOC,:CUENTA,3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                EXECUTE PROCEDURE ERROR (61,:IDDOC,:CUENTA,4);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID,CNDE_ITEM,CNDE_CUENTA,CNDE_CONC,CNDE_REF,CNDE_DEBITOS,CNDE_CREDITOS,CNDE_BASE,CNDE_PORC,CNDE_TERC,CNDE_PROY,CNDE_CENTRO,CNDE_DOCNUMERO,CNDE_DOCAPLICAR,CNDE_DOCVENCE,CNDE_ARTICULO,CNDE_DOCTIPOA,CNDE_DOCTIPON)
                    VALUES (:IDC,:NROI,:CUENTA,:CONC,'',:VRDTO,0,0,0,:NIT,:PROY,:CENTRO,NULL,NULL,NULL,NULL,0,0);
                NROI = NROI + 1;
                SUMA = SUMA + VRDTO;
                END
            END /* VRDTO <> 0 */
        END /* DTO EN CTA CONSTANTE */

    /* LA DIFERENCIA EN CAMBIO */
    SELECT SUM(RCDE_DIFCAMBIO) FROM recibos_caja_detalle WHERE RECA_ID = :iddoc INTO :DIFCAMBIO;
    IF ((DIFCAMBIO IS NOT NULL) AND (DIFCAMBIO <> 0)) THEN
        BEGIN
        if (DIFCAMBIO > 0) then
            execute procedure lee_configuracion('GENERAL','GENERAL','CUENTA DE INGRESO POR DIFERENCIA EN CAMBIO PARA OPERACIONES EN OTRA MONEDA') returning_values (:ctadif);
        else
            execute procedure lee_configuracion('GENERAL','GENERAL','CUENTA DE GASTO POR DIFERENCIA EN CAMBIO PARA OPERACIONES EN OTRA MONEDA') returning_values (:ctadif);
        CUENTA = NULL;
        EXECUTE PROCEDURE VALIDE_CUENTA_C (ctadif) RETURNING_VALUES (:OK);
        IF (OK = 0) THEN
            SELECT CUEN_COD,CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :ctadif INTO :CUENTA,:TIPOCUEN;
        ELSE
            begin
            EXECUTE PROCEDURE ERROR (61,:IDDOC,:ctadif,2);
            CUENTA = ctadif;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERROR (61,:IDDOC,:CUENTA,3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERROR (61,:IDDOC,:CUENTA,4);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            if (DIFCAMBIO > 0) then
                INSERT INTO CONTABILIZACION_DET (CNTB_ID,CNDE_ITEM,CNDE_CUENTA,CNDE_CONC,CNDE_REF,CNDE_DEBITOS,CNDE_CREDITOS,CNDE_BASE,CNDE_PORC,CNDE_TERC,CNDE_PROY,CNDE_CENTRO,CNDE_DOCNUMERO,CNDE_DOCAPLICAR,CNDE_DOCVENCE,CNDE_ARTICULO,CNDE_DOCTIPOA,CNDE_DOCTIPON)
                    VALUES (:IDC,:NROI,:CUENTA,:CONC,'',0,:difcambio,0,0,:NIT,:PROY,:CENTRO,NULL,NULL,NULL,NULL,0,0);
            else
                INSERT INTO CONTABILIZACION_DET (CNTB_ID,CNDE_ITEM,CNDE_CUENTA,CNDE_CONC,CNDE_REF,CNDE_DEBITOS,CNDE_CREDITOS,CNDE_BASE,CNDE_PORC,CNDE_TERC,CNDE_PROY,CNDE_CENTRO,CNDE_DOCNUMERO,CNDE_DOCAPLICAR,CNDE_DOCVENCE,CNDE_ARTICULO,CNDE_DOCTIPOA,CNDE_DOCTIPON)
                    VALUES (:IDC,:NROI,:CUENTA,:CONC,'',ABS(:difcambio),0,0,0,:NIT,:PROY,:CENTRO,NULL,NULL,NULL,NULL,0,0);
            NROI = NROI + 1;
            SUMA = SUMA - difcambio;
            END
        END
    IF ((exedente IS NOT NULL) AND (exedente <> 0)) THEN
        BEGIN
        CUENTA = NULL;
        EXECUTE PROCEDURE VALIDE_CUENTA_C (ctaexcedente) RETURNING_VALUES (:OK);
        IF (OK = 0) THEN
            SELECT CUEN_COD,CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :ctaexcedente INTO :CUENTA,:TIPOCUEN;
        ELSE
            begin
            EXECUTE PROCEDURE ERROR (61,:IDDOC,:ctaexcedente,2);
            CUENTA = ctaexcedente;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERROR (61,:IDDOC,:CUENTA,3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERROR (61,:IDDOC,:CUENTA,4);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            if (exedente > 0) then
                INSERT INTO CONTABILIZACION_DET (CNTB_ID,CNDE_ITEM,CNDE_CUENTA,CNDE_CONC,CNDE_REF,CNDE_DEBITOS,CNDE_CREDITOS,CNDE_BASE,CNDE_PORC,CNDE_TERC,CNDE_PROY,CNDE_CENTRO,CNDE_DOCNUMERO,CNDE_DOCAPLICAR,CNDE_DOCVENCE,CNDE_ARTICULO,CNDE_DOCTIPOA,CNDE_DOCTIPON)
                    VALUES (:IDC,:NROI,:CUENTA,:CONC,'',0,:exedente,0,0,:NIT,:PROY,:CENTRO,NULL,NULL,NULL,NULL,0,0);
            else
                INSERT INTO CONTABILIZACION_DET (CNTB_ID,CNDE_ITEM,CNDE_CUENTA,CNDE_CONC,CNDE_REF,CNDE_DEBITOS,CNDE_CREDITOS,CNDE_BASE,CNDE_PORC,CNDE_TERC,CNDE_PROY,CNDE_CENTRO,CNDE_DOCNUMERO,CNDE_DOCAPLICAR,CNDE_DOCVENCE,CNDE_ARTICULO,CNDE_DOCTIPOA,CNDE_DOCTIPON)
                    VALUES (:IDC,:NROI,:CUENTA,:CONC,'',ABS(:exedente),0,0,0,:NIT,:PROY,:CENTRO,NULL,NULL,NULL,NULL,0,0);
            NROI = NROI + 1;
            SUMA = SUMA - exedente;
            END
        END
    /* RETENCION FUENTE */
    if ((RTFTE = 'T') or (RTFTE = 'K')) then
      if (VRRTFTE <> 0) then
        BEGIN
        if (RTFTE = 'T') then
            CTARTFTE = TCTARTFTE;
        CUENTA = NULL;
        EXECUTE PROCEDURE VALIDE_CUENTA_C (CTARTFTE) RETURNING_VALUES (:OK);
        IF (OK = 0) THEN
            SELECT CUEN_COD,CUEN_RETENCION,CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTARTFTE INTO :CUENTA,:ES_RETENCION,:TIPOCUEN;
        ELSE
            begin
            EXECUTE PROCEDURE ERROR (61,:IDDOC,:CTARTFTE,2);
            CUENTA = CTARTFTE;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERROR (61,:IDDOC,:CUENTA,3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERROR (61,:IDDOC,:CUENTA,4);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            if (ES_RETENCION = 'S') then
                BEGIN
                VRBASE = VRTOTAL + VRDTO + vrrtfte + vrrtiva + vrrtica;
                SELECT CLIE_rtefte from clientes where terc_nit = :NIT INTO :PORC;
                END
            ELSE
                BEGIN
                VRBASE = 0;
                PORC = 0;
                END
            INSERT INTO CONTABILIZACION_DET (CNTB_ID,CNDE_ITEM,CNDE_CUENTA,CNDE_CONC,CNDE_REF,CNDE_DEBITOS,CNDE_CREDITOS,CNDE_BASE,CNDE_PORC,CNDE_TERC,CNDE_PROY,CNDE_CENTRO,CNDE_DOCNUMERO,CNDE_DOCAPLICAR,CNDE_DOCVENCE,CNDE_ARTICULO,CNDE_DOCTIPOA,CNDE_DOCTIPON)
                VALUES (:IDC,:NROI,:CUENTA,:CONC,'',:VRRTFTE,0,:VRBASE,:PORC,:NIT,:PROY,:CENTRO,NULL,NULL,NULL,NULL,0,0);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTFTE;
            END
        END /* RTFTE */
    /* RETENCION IVA */
    if ((RTIVA = 'T') or (RTIVA = 'K')) then
      if (VRRTIVA <> 0) then
        BEGIN
        if (RTIVA = 'T') then
            CTARTIVA = TCTARTIVA;
        CUENTA = NULL;
        EXECUTE PROCEDURE VALIDE_CUENTA_C (CTARTIVA) RETURNING_VALUES (:OK);
        IF (OK = 0) THEN
            SELECT CUEN_COD,CUEN_RETENCION,CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTARTIVA INTO :CUENTA,:ES_RETENCION,:TIPOCUEN;
        ELSE
            begin
            EXECUTE PROCEDURE ERROR (61,:IDDOC,:CTARTIVA,2);
            CUENTA = CTARTIVA;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERROR (61,:IDDOC,:CUENTA,3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERROR (61,:IDDOC,:CUENTA,4);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            if (ES_RETENCION = 'S') then
                BEGIN
                VRBASE = VRTOTAL + VRDTO + vrrtfte + vrrtiva + vrrtica;
                SELECT CLIE_RTEIVA from clientes where terc_nit = :NIT INTO :PORC;
                END
            ELSE
                BEGIN
                VRBASE = 0;
                PORC = 0;
                END
            INSERT INTO CONTABILIZACION_DET (CNTB_ID,CNDE_ITEM,CNDE_CUENTA,CNDE_CONC,CNDE_REF,CNDE_DEBITOS,CNDE_CREDITOS,CNDE_BASE,CNDE_PORC,CNDE_TERC,CNDE_PROY,CNDE_CENTRO,CNDE_DOCNUMERO,CNDE_DOCAPLICAR,CNDE_DOCVENCE,CNDE_ARTICULO,CNDE_DOCTIPOA,CNDE_DOCTIPON)
                VALUES (:IDC,:NROI,:CUENTA,:CONC,'',:VRRTIVA,0,:VRBASE,:PORC,:NIT,:PROY,:CENTRO,NULL,NULL,NULL,NULL,0,0);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTIVA;
            END
        END /* RTIVA */
    /* RETENCION DE ICA */
    if ((RTICA = 'T') or (RTICA = 'K')) then
      if (VRRTICA <> 0) then
        BEGIN
        if (RTICA = 'T') then
            CTARTICA = TCTARTICA;
        CUENTA = NULL;
        EXECUTE PROCEDURE VALIDE_CUENTA_C (CTARTICA) RETURNING_VALUES (:OK);
        IF (OK = 0) THEN
            SELECT CUEN_COD,CUEN_RETENCION,CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTARTICA INTO :CUENTA,:ES_RETENCION,:TIPOCUEN;
        ELSE
            begin
            EXECUTE PROCEDURE ERROR (61,:IDDOC,:CTARTICA,2);
            CUENTA = CTARTICA;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERROR (61,:IDDOC,:CUENTA,3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERROR (61,:IDDOC,:CUENTA,4);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            if (ES_RETENCION = 'S') then
                BEGIN
                VRBASE = VRTOTAL + VRDTO + vrrtfte + vrrtiva + vrrtica;
                SELECT CLIE_RTEICA from clientes where terc_nit = :NIT INTO :PORC;
                END
            ELSE
                BEGIN
                VRBASE = 0;
                PORC = 0;
                END
            INSERT INTO CONTABILIZACION_DET (CNTB_ID,CNDE_ITEM,CNDE_CUENTA,CNDE_CONC,CNDE_REF,CNDE_DEBITOS,CNDE_CREDITOS,CNDE_BASE,CNDE_PORC,CNDE_TERC,CNDE_PROY,CNDE_CENTRO,CNDE_DOCNUMERO,CNDE_DOCAPLICAR,CNDE_DOCVENCE,CNDE_ARTICULO,CNDE_DOCTIPOA,CNDE_DOCTIPON)
                VALUES (:IDC,:NROI,:CUENTA,:CONC,'',:VRRTICA,0,0,0,:NIT,:PROY,:CENTRO,NULL,NULL,NULL,NULL,0,0);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTICA;
            END
        END /* RTICA */
    /* CRUCES CON CXP */
    if (CRUCES <> 0) then
        BEGIN
        SELECT PROV_CTAPAGAR FROM PROVEEDORES WHERE TERC_NIT = :nit INTO :ctabase;
        if (CTABASE IS NULL) then
            ctabase = tctaclien;
        CUENTA = NULL;
        EXECUTE PROCEDURE VALIDE_CUENTA_C (CTABASE) RETURNING_VALUES (:OK);
        IF (OK = 0) THEN
            SELECT CUEN_COD,CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTABASE INTO :CUENTA,:TIPOCUEN;
        ELSE
            begin
            EXECUTE PROCEDURE ERROR (61,:IDDOC,:CTABASE,2);
            CUENTA = CTABASE;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERROR (61,:IDDOC,:CUENTA,3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            /* DEBERIA RECORRER DOCUMENTO POR DOCUMENTO */
            FOR SELECT RCCR_TIPODOC,RCCR_PREFIJO,RCCR_NUMERO,RCCR_ABONO+RCCR_RTFTE+RCCR_RTIVA+RCCR_RTICA+RCCR_DTOF
                FROM recibos_caja_crucec WHERE RECA_ID = :IDDOC
                INTO :TIPOIT,PREFIT,NUMIT,ABONOIT
                DO
                BEGIN
                NUMEROIT = PREFIT || NUMIT;
                if (ABONOIT > 0) then
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID,CNDE_ITEM,CNDE_CUENTA,CNDE_CONC,CNDE_REF,CNDE_DEBITOS,CNDE_CREDITOS,CNDE_BASE,CNDE_PORC,CNDE_TERC,CNDE_PROY,CNDE_CENTRO,CNDE_DOCNUMERO,CNDE_DOCAPLICAR,CNDE_DOCVENCE,CNDE_ARTICULO,CNDE_DOCTIPOA,CNDE_DOCTIPON)
                        VALUES (:IDC,:NROI,:CUENTA,:CONC,'',:ABONOIT,0,0,0,:NIT,:PROY,:CENTRO,NULL,:NUMEROIT,NULL,NULL,:TIPOIT,0);
                else
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID,CNDE_ITEM,CNDE_CUENTA,CNDE_CONC,CNDE_REF,CNDE_DEBITOS,CNDE_CREDITOS,CNDE_BASE,CNDE_PORC,CNDE_TERC,CNDE_PROY,CNDE_CENTRO,CNDE_DOCNUMERO,CNDE_DOCAPLICAR,CNDE_DOCVENCE,CNDE_ARTICULO,CNDE_DOCTIPOA,CNDE_DOCTIPON)
                        VALUES (:IDC,:NROI,:CUENTA,:CONC,'',0, ABS(:ABONOIT),0,0,:NIT,:PROY,:CENTRO,NULL,:NUMEROIT,NULL,NULL,:TIPOIT,0);
                SUMA = SUMA + ABONOIT;
                NROI = NROI + 1;
                END
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            if (CRUCES > 0) then
                INSERT INTO CONTABILIZACION_DET (CNTB_ID,CNDE_ITEM,CNDE_CUENTA,CNDE_CONC,CNDE_REF,CNDE_DEBITOS,CNDE_CREDITOS,CNDE_BASE,CNDE_PORC,CNDE_TERC,CNDE_PROY,CNDE_CENTRO,CNDE_DOCNUMERO,CNDE_DOCAPLICAR,CNDE_DOCVENCE,CNDE_ARTICULO,CNDE_DOCTIPOA,CNDE_DOCTIPON)
                    VALUES (:IDC,:NROI,:CUENTA,:CONC,'',:CRUCES,0,0,0,:NIT,:PROY,:CENTRO,NULL,NULL,NULL,NULL,0,0);
            else
                INSERT INTO CONTABILIZACION_DET (CNTB_ID,CNDE_ITEM,CNDE_CUENTA,CNDE_CONC,CNDE_REF,CNDE_DEBITOS,CNDE_CREDITOS,CNDE_BASE,CNDE_PORC,CNDE_TERC,CNDE_PROY,CNDE_CENTRO,CNDE_DOCNUMERO,CNDE_DOCAPLICAR,CNDE_DOCVENCE,CNDE_ARTICULO,CNDE_DOCTIPOA,CNDE_DOCTIPON)
                    VALUES (:IDC,:NROI,:CUENTA,:CONC,'',0,ABS(:CRUCES),0,0,:NIT,:PROY,:CENTRO,NULL,NULL,NULL,NULL,0,0);
            SUMA = SUMA + CRUCES;
            NROI = NROI + 1;
            END

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

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE RECIBOS_SIN_CONTABILIDAD(
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    ID INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    ESTADO VARCHAR(20),
    IDI INTEGER,
    IDC INTEGER,
    ERROR INTEGER)
AS
DECLARE VARIABLE VER CHAR(2);
declare variable FECICNT VARCHAR(10);
declare variable FECFCNT VARCHAR(10);
declare variable idref INTEGER;
BEGIN
EXECUTE PROCEDURE fecha_a_conta(FECINI) returning_values (FECICNT);
EXECUTE PROCEDURE fecha_a_conta(FECFIN) returning_values (FECFCNT);
FOR SELECT RECA_ID, PREF_PRE, RECA_NUMERO FROM RECIBOS_CAJA WHERE RECA_ANULADO = 'N' AND
    RECA_FECHA >= :FECINI AND RECA_FECHA <= :FECFIN and PREF_PRE NOT IN (SELECT AUTO_PREFRDC FROM AUTORIZACIONES) ORDER BY RECA_ID
    INTO :ID, :PREF, :NUMERO
DO
  BEGIN
  idref = null;
  SELECT ENCO_IDREF FROM COMPROBANTE_ENCABEZADO WHERE ENCO_TIPOREF = 61 AND ENCO_FECHA >= :FECICNT AND ENCO_FECHA <= :FECFCNT and ENCO_IDREF = :id into :idref;
  if (idref IS NULL) then
  begin
   ESTADO = 'PROCESANDO';
   SUSPEND;
   SELECT MAX(INCJ_ID) FROM INTERFAZ_CAJA WHERE PREF_PRE = :PREF AND TIDO_COD = 61 INTO :IDI;
   EXECUTE PROCEDURE CONTABIL_RECICAJA (:ID, :IDI) RETURNING_VALUES (:ERROR, :VER, :IDC);
   if (ERROR = 0) then
    BEGIN
    EXECUTE PROCEDURE CONTABILIZA_PENDIENTE (:IDC);
    ESTADO = 'OK';
    END
   ELSE
    ESTADO = 'ERROR';
   suspend;
  end
  END
END

^

SET TERM ; ^

/* 20091113B */
/* consolide documentos de diferentes sucursales */
SET TERM ^ ;

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

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

SET TERM ; ^


/* 20091114 */
SET TERM ^ ;

ALTER PROCEDURE CONCILIA_CXPAGAR (
    fecini date,
    fecfin date,
    ctacart varchar(20),
    subempresa integer,
    anterior char(1))
returns (
    nit varchar(20),
    nombre varchar(60),
    inicial numeric(18,2),
    inicialc numeric(18,2),
    debitos numeric(18,2),
    debitosc numeric(18,2),
    creditos numeric(18,2),
    creditosc numeric(18,2),
    saldo numeric(18,2),
    saldoc numeric(18,2),
    diferencia numeric(18,2))
as
declare variable ano char(4);
declare variable mes integer;
declare variable abonos numeric(18,2);
declare variable retes char(2);
begin
ano = EXTRACT(YEAR FROM FECFIN);
mes = EXTRACT(MONTH FROM FECFIN);

for select T.TERC_NIT, TERC_NOM from TERCEROS T, PROVEEDORES P
    WHERE T.terc_nit = P.terc_nit AND TERC_PROV = 'S' AND P.grpr_cod = :SUBEMPRESA into :NIT, :NOMBRE
    DO
    BEGIN
    EXECUTE PROCEDURE saldo_proveedor (NIT, FECINI, 0) returning_values (INICIAL);
    INICIAL = INICIAL * -1;
    EXECUTE PROCEDURE LEE_CONFIGURACION('CXPAGAR', 'SALDOS', 'DESCONTAR RETENCIONES POR CAUSACION') returning_values(:RETES);
    if (RETES = 'SI') then
        BEGIN
        SELECT SUM(MVPR_MONTO-MVPR_RTFTE-MVPR_RTIVA-MVPR_RTICA)
            FROM movimiento_proveedor
            WHERE TERC_NIT = :NIT AND MVPR_FECHA >= :FECINI AND MVPR_FECHA <= :FECFIN AND MVPR_DEBITO = 'S'
            INTO :CREDITOS;
        SELECT SUM(MVPR_MONTO-MVPR_RTFTE-MVPR_RTIVA-MVPR_RTICA)
            FROM movimiento_proveedor
            WHERE TERC_NIT = :NIT AND MVPR_FECHA >= :FECINI AND MVPR_FECHA <= :FECFIN AND MVPR_DEBITO = 'N' AND MVPR_ABONO = 'N' and MVPR_TIPOREF <> 55
            INTO :DEBITOS;
        SELECT SUM(MVPR_MONTO) FROM movimiento_proveedor
            WHERE TERC_NIT = :NIT AND MVPR_FECHA >= :FECINI AND MVPR_FECHA <= :FECFIN AND MVPR_ABONO = 'S'
            INTO :ABONOS;
        END
    ELSE
        BEGIN
        SELECT SUM(MVPR_MONTO)
            FROM movimiento_proveedor
            WHERE TERC_NIT = :NIT AND MVPR_FECHA >= :FECINI AND MVPR_FECHA <= :FECFIN AND MVPR_DEBITO = 'S'
            INTO :CREDITOS;
        SELECT SUM(MVPR_MONTO)
            FROM movimiento_proveedor
            WHERE TERC_NIT = :NIT AND MVPR_FECHA >= :FECINI AND MVPR_FECHA <= :FECFIN AND MVPR_DEBITO = 'N' AND MVPR_ABONO = 'N' AND MVPR_TIPOREF <> 55
            INTO :DEBITOS;
        SELECT SUM(MVPR_MONTO+MVPR_RTFTE+MVPR_RTIVA+MVPR_RTICA)
            FROM movimiento_proveedor
            WHERE TERC_NIT = :NIT AND MVPR_FECHA >= :FECINI AND MVPR_FECHA <= :FECFIN AND MVPR_ABONO = 'S'
            INTO :ABONOS;
        END
    if (DEBITOS IS NULL) then
        DEBITOS = 0;
    if (CREDITOS IS NULL) then
        CREDITOS = 0;
    if (ABONOS IS NULL) then
        ABONOS = 0;
    DEBITOS = DEBITOS + ABONOS;
    SALDO = INICIAL + DEBITOS - CREDITOS;

    /* LO CONTABLE */
    EXECUTE PROCEDURE SALDO_TERCERO_MES(ctacart, NIT, ANO, MES, 'S') RETURNING_VALUES (INICIALC);
    EXECUTE PROCEDURE MOVIMIENTO_TERCERO_MES(ctacart, NIT, ANO, MES, 'S') RETURNING_VALUES(DEBITOSC);
    EXECUTE PROCEDURE MOVIMIENTO_TERCERO_MES(ctacart, NIT, ANO, MES, 'N') RETURNING_VALUES(CREDITOSC);
    SALDOC = INICIALC + DEBITOSC - CREDITOSC;
    diferencia = SALDO - SALDOC;
    if (DIFERENCIA <> 0) then
        BEGIN
        if (ANTERIOR <> 'S') then
            SUSPEND;
        ELSE
            BEGIN
            if (DIFERENCIA <> (INICIAL - INICIALC)) then
                SUSPEND;
            END
        END
    END
end
^

SET TERM ; ^


UPDATE PROCEDIMIENTOS_USUARIO
SET PRUS_PARAM2 = 'Grupo proveedor'
WHERE (PRUS_COD = 6);
commit work;


SET TERM ^ ;

CREATE or ALTER PROCEDURE CONCILIA_CXPAGAR_DET (
    fecini date,
    fecfin date,
    ctacart varchar(20),
    nit varchar(20),
    solodif char(1))
returns (
    fecha date,
    tipodoc varchar(10),
    pref varchar(4),
    numero varchar(6),
    monto numeric(18,2),
    fecconta char(10),
    montoc numeric(18,2),
    diferencia numeric(18,2))
as
declare variable tipo integer;
declare variable id integer;
declare variable fecinic char(10);
declare variable fecfinc char(10);
declare variable db char(1);
declare variable ab char(1);
declare variable RETES char(2);
declare variable rtfte numeric(18,2);
declare variable rtiva numeric(18,2);
declare variable rtica numeric(18,2);
begin
FOR select MVPR_TIPOREF, MVPR_IDREF, MVPR_MONTO, MVPR_FECHA, MVPR_PREFIJO, MVPR_NUMERO, MVPR_DEBITO, mvpr_rtfte, mvpr_rtiva, mvpr_rtica, mvpr_abono
    from movimiento_proveedor
    where TERC_NIT = :NIT and MVPR_FECHA >= :FECINI and MVPR_FECHA <= :FECFIN
    into :TIPO, :ID, :MONTO, :fecha, :pref, :numero, :DB, :rtfte, :rtiva, :rtica, :ab
    DO
    BEGIN
    EXECUTE PROCEDURE LEE_CONFIGURACION('CXPAGAR', 'SALDOS', 'DESCONTAR RETENCIONES POR CAUSACION') returning_values(:RETES);
    if (RETES = 'SI') then
        begin
        if (ab = 'N') then
            MONTO = MONTO - rtfte - rtiva - rtica;
        end
    else
        begin
        if (ab = 'S') then
            MONTO = MONTO + rtfte + rtiva + rtica;
        end
    SELECT TIDO_NOMCORTO FROM tipo_documento WHERE TIDO_COD = :tipo INTO :tipodoc;
    if (DB = 'N') then
        MONTO = MONTO * -1;
    /* BUSQUE EL CONTABLE */
    MONTOC = NULL;
    SELECT SUM(CODE_CREDITO-CODE_DEBITO) FROM comprobante_detalle D, comprobante_encabezado C
        where C.enco_consec = D.enco_consec AND C.enco_tiporef = :TIPO AND C.enco_idref = :ID AND D.cuen_cod = :ctacart
        INTO :montoc;
    if (MONTOC IS NULL) then
        BEGIN
/*        EXECUTE PROCEDURE fecha_a_conta (:FECHA) returning_values (:FECCONTA);
        SELECT SUM(CODE_DEBITO-CODE_CREDITO) FROM comprobante_detalle D, comprobante_encabezado C
            where C.enco_consec = D.enco_consec AND C.enco_fecha = :fecconta AND D.cuen_cod = :ctacart AND C.enco_numero = :numero
            INTO :montoc;
        if (MONTOC IS NULL) then*/
            MONTOC = 0;
        END
    diferencia = MONTO - MONTOC;
    if ((SOLODIF = 'N') or (DIFERENCIA <> 0)) then
        SUSPEND;
    END
/* AGREGUE LAS QUE NO TIENEN IDREF */
MONTO = 0;
EXECUTE PROCEDURE fecha_a_conta (:FECINI) returning_values (:FECINIC);
EXECUTE PROCEDURE fecha_a_conta (:FECFIN) returning_values (:FECFINC);
FOR SELECT C.tico_cod, C.enco_fecha, C.prco_pref, C.enco_numero, CODE_DEBITO-CODE_CREDITO FROM comprobante_detalle D, comprobante_encabezado C
    where C.enco_consec = D.enco_consec AND CUEN_COD = :ctacart AND D.terc_nit = :NIT AND C.enco_fecha >= :fecinic AND C.enco_fecha <= :fecfinc AND C.enco_idref = 0
    INTO :tipodoc, :fecconta, :pref, :numero, :montoc
    do
    BEGIN
    diferencia = MONTO - MONTOC;
    SUSPEND;
    END
end
^

SET TERM ; ^

/* 20091115 */
SET TERM ^ ;

CREATE OR ALTER procedure CONTABIL_DEVOLCOMP (
    IDDOC integer,
    IDINTER integer)
returns (
    ERROR integer,
    VER char(1),
    IDC integer)
AS
declare variable PREFIJO VARCHAR(4);
declare variable NUM VARCHAR(6);
declare variable NUMERO VARCHAR(10);
declare variable FECAUX DATE;
declare variable FECHA CHAR(8);
declare variable CONCEPTO CHAR(100);
declare variable NUMFAC VARCHAR(10);
declare variable VRDTO NUMERIC(18, 2);
declare variable VRADIC NUMERIC(18, 2);
declare variable VRSUBT NUMERIC(18, 2);
declare variable VRIVA NUMERIC(18, 2);
declare variable PRTFTE NUMERIC(9, 2);
declare variable VRRTFTE NUMERIC(18, 2);
declare variable VRRTIVA NUMERIC(18, 2);
declare variable PRTICA NUMERIC(9, 2);
declare variable VRRTICA NUMERIC(18, 2);
declare variable VRTOTAL NUMERIC(18, 2);
declare variable VREXTRA NUMERIC(18, 2);
declare variable TIPOCOMP VARCHAR(3);
declare variable PREFCONT VARCHAR(4);
declare variable INVEN CHAR(1);
declare variable CTAINVEN VARCHAR(20);
declare variable IVA CHAR(1);
declare variable CTAIVA VARCHAR(20);
declare variable CONSUMO CHAR(1);
declare variable CTACONSUMO VARCHAR(20);
declare variable CXP CHAR(1);
declare variable CTACXP VARCHAR(20);
declare variable RTFTE CHAR(1);
declare variable CTARTFTE VARCHAR(20);
declare variable RTIVA CHAR(1);
declare variable CTARTIVA VARCHAR(20);
declare variable RTICA CHAR(1);
declare variable CTARTICA VARCHAR(20);
declare variable CTADTO VARCHAR(20);
declare variable CTAADIC VARCHAR(20);
declare variable CTAEXTRA VARCHAR(20);
declare variable EXISTE CHAR(1);
declare variable CUENTA VARCHAR(20);
declare variable MONTO NUMERIC(18,2);
declare variable TIPOCUEN CHAR(1);
declare variable NIT VARCHAR(20);
declare variable PROY VARCHAR(4);
declare variable CENTRO VARCHAR(4);
declare variable PORC NUMERIC(5,2);
declare variable DEBITO NUMERIC(18,2);
declare variable CREDITO NUMERIC(18,2);
declare variable NUMITEMS INTEGER;
declare variable ARTICULO VARCHAR(15);
declare variable IMPINC CHAR(1);
declare variable IMPTOS NUMERIC(18, 2);
declare variable SUMA NUMERIC(18,2);
declare variable PORCIVA NUMERIC(9,2);
declare variable TCTAPROV VARCHAR(20);
declare variable TCTARTFTE VARCHAR(20);
declare variable TCTARTIVA VARCHAR(20);
declare variable TCTARTICA VARCHAR(20);
declare variable CUENTAADIC VARCHAR(20);
declare variable BASEADIC VARCHAR(20);
declare variable PORCADIC NUMERIC(5,2);
declare variable VALORADIC NUMERIC(18,2);
declare variable DBADIC CHAR(1);
declare variable FOMENTO CHAR(2);
declare variable ANULADO CHAR(1);
declare variable CENT CHAR(1);
declare variable ERRORC INTEGER;
DECLARE VARIABLE MENORV CHAR(2);
DECLARE VARIABLE MERCANCIA NUMERIC(18,2);
declare variable FACTOR DOUBLE PRECISION;
declare variable DIG INTEGER;
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_CTAINVEN, INCO_CTAIVA, INCO_CTACONSUMO, INCO_CTADTO, INCO_CTAADIC, INCO_CTAEXTRA, INCO_CTACXP, INCO_CTARTFTE, INCO_CTARTIVA, INCO_CTARTICA, INCO_CONFIRMAR, INCO_CENTRO
    FROM INTERFAZ_COMPRAS
    WHERE INCO_ID = :IDINTER
    INTO :EXISTE, :TIPOCOMP, :PREFCONT, :INVEN, :IVA, :CONSUMO, :CXP, :RTFTE, :RTIVA, :RTICA, :CTAINVEN, :CTAIVA, :CTACONSUMO, :CTADTO, :CTAADIC, :CTAEXTRA, :CTACXP, :CTARTFTE, :CTARTIVA, :CTARTICA, :VER, :CENT;
if (EXISTE = 'S') then
   BEGIN
    /* BORRE 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, PROV_CTARTFTE, PROV_CTARTIVA, PROV_CTARTICA, PROV_CTAPAGAR, DVCO_ANULADO
        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, :TCTARTFTE, TCTARTIVA, TCTARTICA, TCTAPROV, ANULADO;
   if (ANULADO = 'N') then
    BEGIN
    NUMERO = PREFIJO || NUM;
    VRSUBT = VRTOTAL - VREXTRA - VRIVA; /* BASE DE RETEFTE Y RETEICA */
    IF (CENT = 'B') THEN
        SELECT BODE_CENTRO, BODE_PROY FROM BODEGA B, DEVOLUCIONES_COMPRAS F
            WHERE B.BODE_COD = F.BODE_COD AND F.DVCO_ID = :IDDOC INTO :CENTRO, :PROY;
    ELSE
        SELECT PREF_CENTRO,PREF_PROY FROM PREFIJOS P, DEVOLUCIONES_COMPRAS F
            WHERE P.PREF_PRE = F.PREF_PRE AND F.DVCO_ID = :IDDOC AND P.TIDO_COD = 24 INTO :CENTRO, :PROY;
    /* CONVIERTA LA FECHA A CADENA */
    EXECUTE PROCEDURE FECHA_A_CONTA(:FECAUX) returning_values (:FECHA);
    EXECUTE PROCEDURE LEE_CONFIGURACION('COMPRAS', 'FACTURAS', 'USAR IMPOCONSUMO COMO PORCENTAJE DE FOMENTO') RETURNING_VALUES (FOMENTO);
    EXECUTE PROCEDURE lee_configuracion('COMPRAS','FACTURAS','DESCUENTO Y VALOR ADICIONAL DEL DOCUMENTO COMO MENOR VALOR DEL COSTO') returning_values (:MENORV);
    SELECT CAST(CONF_VALOR AS INTEGER) FROM CONFIGURACION WHERE CONF_MODULO = 'COMPRAS' AND CONF_CATEGORIA = 'GENERAL' AND CONF_PROPIEDAD = 'REDONDEO AL MULTIPLO DE DIEZ EN TOTALES' INTO :DIG;
    VRSUBT = VRTOTAL - VREXTRA - VRIVA;
    MERCANCIA = VRSUBT - VRADIC + VRDTO;
    SELECT SUM(DVCD_consumo) from devoluciones_compras_det where dvco_id = :IDDOC into :valoradic;
    if (MENORV = 'SI') then
        if (MERCANCIA <> 0) then
            FACTOR = (CAST(VRSUBT AS DOUBLE PRECISION) - VALORADIC) / (CAST(MERCANCIA AS DOUBLE PRECISION) - VALORADIC);
        ELSE
            FACTOR = 1;
    ELSE
        FACTOR = 1;

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

    NUMITEMS = 0;
    SUMA = 0;
    ERROR = 0;
    /* CUENTAS DE INVENTARIO */
    if (INVEN = 'A') then
        BEGIN
        /* SUME LAS BASES DE LOS ARTICULOS DEL DOCUMENTO */
        FOR SELECT MAX(COAR_CTACOMP), SUM(cast(DVCD_CANT as double precision) * (DVCD_PRUNIT-DVCD_DTOMONTO)), SUM(DVCD_IVAMONTO), SUM(DVCD_CONSUMO)
            FROM ARTICULO A, CONTABIL_ARTICULO C, DEVOLUCIONES_COMPRAS_DET F
            WHERE F.DVCO_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD
            GROUP BY COAR_CTAINV
            INTO :CTAINVEN, :MONTO, :IMPTOS, :VALORADIC
            DO
            BEGIN
            if (IMPINC = 'S') then
                BEGIN
                MONTO = MONTO - IMPTOS;
                if (FOMENTO <> 'SI') then
                    MONTO = MONTO - VALORADIC;
                END
            /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
            EXECUTE PROCEDURE CUENTA_INTERFAZ(24, :IDDOC, :CTAINVEN, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            /* DEPENDE DEL TIPO DE CUENTA */
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, REGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT F.ARTI_COD, (cast(DVCD_CANT as double precision) * (DVCD_PRUNIT-DVCD_DTOMONTO)), DVCD_IVAMONTO, DVCD_CONSUMO
                    FROM ARTICULO A, CONTABIL_ARTICULO C, DEVOLUCIONES_COMPRAS_DET F
                    WHERE F.DVCO_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTAINV = :CUENTA
                    INTO :ARTICULO, :MONTO, :IMPTOS, :VALORADIC
                DO
                    BEGIN
                    if (IMPINC = 'S') then
                        BEGIN
                        MONTO = MONTO - IMPTOS;
                        if (FOMENTO <> 'SI') then
                            MONTO = MONTO - VALORADIC;
                        END
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                    NUMITEMS = NUMITEMS + 1;
                    SUMA = SUMA - MONTO;
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                /* INSERTE EL REGISTRO DE LA BASE */
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 24);
                NUMITEMS = NUMITEMS + 1;
                SUMA = SUMA - MONTO;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                /* INSERTE EL REGISTRO DE LA BASE */
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NUMITEMS = NUMITEMS + 1;
                SUMA = SUMA - MONTO;
                END
            END /* FOR */
        END /* INVENTARIO X ARTICULO */

    if (INVEN = 'K') then
        BEGIN
        /* SUME LAS BASES DE LOS ARTICULOS DEL DOCUMENTO */
        SELECT SUM(cast(DVCD_CANT as double precision) * (DVCD_PRUNIT-DVCD_DTOMONTO)), SUM(DVCD_IVAMONTO), SUM(DVCD_CONSUMO)
            FROM DEVOLUCIONES_COMPRAS_DET WHERE DVCO_ID = :IDDOC
            INTO :MONTO, :IMPTOS, :VALORADIC;
        if (IMPINC = 'S') then
            BEGIN
            MONTO = MONTO - IMPTOS;
            if (FOMENTO <> 'SI') then
                MONTO = MONTO - VALORADIC;
            END
        /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
        EXECUTE PROCEDURE CUENTA_INTERFAZ(24, :IDDOC, :CTAINVEN, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        /* DEPENDE DEL TIPO DE CUENTA */
        if (TIPOCUEN = 'I') then
            BEGIN
            /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
            FOR SELECT ARTI_COD, (cast(DVCD_CANT as double precision) * (DVCD_PRUNIT-DVCD_DTOMONTO)), DVCD_IVAMONTO, DVCD_CONSUMO
                FROM DEVOLUCIONES_COMPRAS_DET
                WHERE DVCO_ID = :IDDOC
                INTO :ARTICULO, :MONTO, :IMPTOS, :VALORADIC
                DO
                BEGIN
                if (IMPINC = 'S') then
                    BEGIN
                    MONTO = MONTO - IMPTOS;
                    if (FOMENTO <> 'SI') then
                        MONTO = MONTO - VALORADIC;
                    END
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NUMITEMS, :CTAINVEN, :CONCEPTO, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                NUMITEMS = NUMITEMS + 1;
                SUMA = SUMA - MONTO;
                END
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NUMITEMS, :CTAINVEN, :CONCEPTO, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 24);
            NUMITEMS = NUMITEMS + 1;
            SUMA = SUMA - MONTO;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NUMITEMS, :CTAINVEN, :CONCEPTO, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NUMITEMS = NUMITEMS + 1;
            SUMA = SUMA - MONTO;
            END
        END /* INVEN = K */
        
    /* EL IVA */
    if (IVA = 'A') then
        BEGIN
        /* SUME LAS BASES DE LOS ARTICULOS DEL DOCUMENTO */
        FOR SELECT MAX(COAR_CTAIVAC), SUM(DVCD_IVAMONTO), SUM(cast(DVCD_CANT as double precision) * (DVCD_PRUNIT-DVCD_DTOMONTO)), SUM(DVCD_CONSUMO)
            FROM ARTICULO A, CONTABIL_ARTICULO C, DEVOLUCIONES_COMPRAS_DET F
            WHERE F.DVCO_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND DVCD_IVAMONTO <> 0
            GROUP BY COAR_CTAIVAC
            INTO :CTAIVA, :IMPTOS, :MONTO, :VALORADIC
        DO
          if (IMPTOS <> 0) then
            BEGIN
            IMPTOS = CAST(IMPTOS AS DOUBLE PRECISION) * VRSUBT / MERCANCIA;
            if (IMPINC = 'S') then
                BEGIN
                MONTO = MONTO - IMPTOS;
                if (FOMENTO <> 'SI') then
                    MONTO = MONTO - VALORADIC;
                END

            /* TRAIGA LAS CARCATERISTICAS DE LA CUENTA */
            EXECUTE PROCEDURE CUENTA_INTERFAZ(24, :IDDOC, :CTAIVA, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            /* DEPENDE DEL TIPO DE CUENTA */
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT F.ARTI_COD, DVCD_IVAMONTO, (cast(DVCD_CANT as double precision) * (DVCD_PRUNIT-DVCD_DTOMONTO)), TAIV_PORC, DVCD_CONSUMO
                    FROM ARTICULO A, CONTABIL_ARTICULO C, DEVOLUCIONES_COMPRAS_DET F, TARIFA_IVA T
                    WHERE F.DVCO_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTAIVAV = :CUENTA AND A.TAIV_COD = T.TAIV_COD
                    INTO :ARTICULO, :IMPTOS, :MONTO, :PORCIVA, :VALORADIC
                DO
                    BEGIN
                    if (IMPINC = 'S') then
                        BEGIN
                        MONTO = MONTO - IMPTOS;
                        if (FOMENTO <> 'SI') then
                            MONTO = MONTO - VALORADIC;
                        END
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :IMPTOS, :MONTO, :PORCIVA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                    NUMITEMS = NUMITEMS + 1;
                    SUMA = SUMA - IMPTOS;
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :IMPTOS, :MONTO, :PORCIVA, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 24);
                NUMITEMS = NUMITEMS + 1;
                SUMA = SUMA - IMPTOS;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :IMPTOS, :MONTO, :PORCIVA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NUMITEMS = NUMITEMS + 1;
                SUMA = SUMA - IMPTOS;
                END
            END /* FOR */
        END /* IVA X ARTICULO */
        
    if (IVA = 'K') then /* IVA EN CTA CONSTANTE */
        BEGIN
        SELECT SUM(DVCD_IVAMONTO), SUM(cast(DVCD_CANT as double precision) * (DVCD_PRUNIT-DVCD_DTOMONTO)), SUM(DVCD_CONSUMO)
            FROM DEVOLUCIONES_COMPRAS_DET F
            WHERE F.DVCO_ID = :IDDOC  AND DVCD_IVAMONTO <> 0
            INTO :IMPTOS, :MONTO, :VALORADIC;
            
        if (IMPTOS <> 0) then
            BEGIN
            IMPTOS = CAST(IMPTOS AS DOUBLE PRECISION) * VRSUBT / MERCANCIA;
            if (IMPINC = 'S') then
                BEGIN
                MONTO = MONTO - IMPTOS;
                if (FOMENTO <> 'SI') then
                    MONTO = MONTO - VALORADIC;
                END
            /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
            EXECUTE PROCEDURE CUENTA_INTERFAZ(24, :IDDOC, :CTAIVA, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            /* DEPENDE DEL TIPO DE CUENTA */
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT F.ARTI_COD, (cast(DVCD_CANT as double precision) * (DVCD_PRUNIT-DVCD_DTOMONTO)), DVCD_IVAMONTO, TAIV_PORC, DVCD_CONSUMO
                    FROM ARTICULO A, DEVOLUCIONES_COMPRAS_DET F, TARIFA_IVA T
                    WHERE F.DVCO_ID = :IDDOC AND A.TAIV_COD = T.TAIV_COD
                    INTO :ARTICULO, :MONTO, :IMPTOS, :PORCIVA, :VALORADIC
                    DO
                    BEGIN
                    if (IMPTOS <> 0) then
                        BEGIN
                        if (IMPINC = 'S') then
                            BEGIN
                            MONTO = MONTO - IMPTOS;
                            if (FOMENTO <> 'SI') then
                                MONTO = MONTO - VALORADIC;
                            END
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CTAIVA, :CONCEPTO, '', 0, :IMPTOS, :MONTO, :PORCIVA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                        NUMITEMS = NUMITEMS + 1;
                        SUMA = SUMA - IMPTOS;
                        END
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                /* INSERTE EL REGISTRO DE LA BASE */
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NUMITEMS, :CTAIVA, :CONCEPTO, '', 0, :IMPTOS, :MONTO, :PORCIVA, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 24);
                NUMITEMS = NUMITEMS + 1;
                SUMA = SUMA - IMPTOS;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                /* INSERTE EL REGISTRO DE LA BASE */
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NUMITEMS, :CTAIVA, :CONCEPTO, '', 0, :IMPTOS, :MONTO, :PORCIVA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NUMITEMS = NUMITEMS + 1;
                SUMA = SUMA - IMPTOS;
                END
            END /* <> 0 */
        END /* IVA EN CTA CONSTANTE */
        
    /* EL IMPOCONSUMO */
    if (CONSUMO = 'A') then
        BEGIN
        /* SUME LAS BASES DE LOS ARTICULOS DEL DOCUMENTO */
        FOR SELECT MAX(COAR_CTACONS), SUM(DVCD_CONSUMO)
            FROM ARTICULO A, CONTABIL_ARTICULO C, DEVOLUCIONES_COMPRAS_DET F
            WHERE F.DVCO_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD
            GROUP BY COAR_CTACONS
            INTO :CTACONSUMO, :IMPTOS
        DO
            BEGIN
            if (IMPTOS <> 0) then
                BEGIN
                /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
                EXECUTE PROCEDURE CUENTA_INTERFAZ(24, :IDDOC, :CTACONSUMO, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (FOMENTO <> 'SI') then
                    BEGIN
                    /* DEPENDE DEL TIPO DE CUENTA */
                    if (TIPOCUEN = 'I') then
                        BEGIN
                        /* ES UNA CUENTA DE INVENTARIO, REGISTRE UNO A UNO LOS ARTICULOS */
                        FOR SELECT F.ARTI_COD, DVCD_CONSUMO
                            FROM ARTICULO A, CONTABIL_ARTICULO C, DEVOLUCIONES_COMPRAS_DET F
                            WHERE F.DVCO_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTACONS = :CUENTA
                            INTO :ARTICULO, :IMPTOS
                            DO
                            BEGIN
                            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                            NUMITEMS = NUMITEMS + 1;
                            SUMA = SUMA - IMPTOS;
                            END
                        END
                    if (TIPOCUEN = 'C') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 24);
                        NUMITEMS = NUMITEMS + 1;
                        SUMA = SUMA - IMPTOS;
                        END
                    if (TIPOCUEN = 'N') then
                        BEGIN
                        /* INSERTE EL REGISTRO DE LA BASE */
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NUMITEMS = NUMITEMS + 1;
                        SUMA = SUMA - IMPTOS;
                        END
                    END
                ELSE
                    BEGIN
                    if (TIPOCUEN = 'I') then
                        BEGIN
                        /* ES UNA CUENTA DE INVENTARIO, REGISTRE UNO A UNO LOS ARTICULOS */
                        FOR SELECT F.ARTI_COD, DVCD_CONSUMO
                            FROM ARTICULO A, CONTABIL_ARTICULO C, DEVOLUCIONES_COMPRAS_DET F
                            WHERE F.DVCO_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTACONS = :CUENTA
                            INTO :ARTICULO, :IMPTOS
                            DO
                            BEGIN
                            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                VALUES (:IDC, :NUMITEMS, :CTACONSUMO, :CONCEPTO, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                            NUMITEMS = NUMITEMS + 1;
                            SUMA = SUMA + IMPTOS;
                            END
                        END
                    if (TIPOCUEN = 'C') then
                        BEGIN
                        /* INSERTE EL REGISTRO DE LA BASE */
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CTACONSUMO, :CONCEPTO, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 24);
                        NUMITEMS = NUMITEMS + 1;
                        SUMA = SUMA + IMPTOS;
                        END
                    if (TIPOCUEN = 'N') then
                        BEGIN
                        /* INSERTE EL REGISTRO DE LA BASE */
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CTACONSUMO, :CONCEPTO, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NUMITEMS = NUMITEMS + 1;
                        SUMA = SUMA + IMPTOS;
                        END
                    END
                END
            END /* FOR */
        END /* CONSUMO X ARTICULO */
        
    if (CONSUMO = 'K') then /* CONSUMO EN CTA CONSTANTE */
        BEGIN
        SELECT SUM(DVCD_CONSUMO)
            FROM DEVOLUCIONES_COMPRAS_DET F
            WHERE F.DVCO_ID = :IDDOC 
            INTO :IMPTOS;
            
        if (IMPTOS <> 0) then
            BEGIN
            /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
            EXECUTE PROCEDURE CUENTA_INTERFAZ(24, :IDDOC, :CTACONSUMO, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (FOMENTO <> 'SI') then
                BEGIN
                /* DEPENDE DEL TIPO DE CUENTA */
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT F.ARTI_COD, DVCD_CONSUMO
                        FROM ARTICULO A, DEVOLUCIONES_COMPRAS_DET F
                        WHERE F.DVCO_ID = :IDDOC
                        INTO :ARTICULO, :IMPTOS
                        DO
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CTACONSUMO, :CONCEPTO, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                        NUMITEMS = NUMITEMS + 1;
                        SUMA = SUMA - IMPTOS;
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    /* INSERTE EL REGISTRO DE LA BASE */
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NUMITEMS, :CTACONSUMO, :CONCEPTO, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 24);
                    NUMITEMS = NUMITEMS + 1;
                    SUMA = SUMA - IMPTOS;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    /* INSERTE EL REGISTRO DE LA BASE */
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NUMITEMS, :CTACONSUMO, :CONCEPTO, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NUMITEMS = NUMITEMS + 1;
                    SUMA = SUMA - IMPTOS;
                    END
                END
            ELSE
                BEGIN
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT F.ARTI_COD, DVCD_CONSUMO
                        FROM ARTICULO A, DEVOLUCIONES_COMPRAS_DET F
                        WHERE F.DVCO_ID = :IDDOC
                        INTO :ARTICULO, :IMPTOS
                        DO
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CTACONSUMO, :CONCEPTO, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                        NUMITEMS = NUMITEMS + 1;
                        SUMA = SUMA + IMPTOS;
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    /* INSERTE EL REGISTRO DE LA BASE */
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NUMITEMS, :CTACONSUMO, :CONCEPTO, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 24);
                    NUMITEMS = NUMITEMS + 1;
                    SUMA = SUMA + IMPTOS;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    /* INSERTE EL REGISTRO DE LA BASE */
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NUMITEMS, :CTACONSUMO, :CONCEPTO, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NUMITEMS = NUMITEMS + 1;
                    SUMA = SUMA + IMPTOS;
                    END
                END
            END
        END /* CONSUMO EN CTA CONSTANTE */
        
    /* DESCUENTO */
    if ((CTADTO IS NOT NULL) AND
        (CTADTO <> '') AND
        (VRDTO <> 0)) THEN
        BEGIN
        /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
        EXECUTE PROCEDURE CUENTA_INTERFAZ(24, :IDDOC, :CTADTO, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :VRDTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 24);
            NUMITEMS = NUMITEMS + 1;
            SUMA = SUMA + VRDTO;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            /* INSERTE EL REGISTRO DE LA BASE */
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :VRDTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NUMITEMS = NUMITEMS + 1;
            SUMA = SUMA + VRDTO;
            END
        END /* DESCUENTO */
        
    /* VALOR ADIC */
    if ((CTAADIC IS NOT NULL) AND
        (CTAADIC <> '') AND
        (VRADIC <> 0)) THEN
        BEGIN
        /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
        EXECUTE PROCEDURE CUENTA_INTERFAZ(24, :IDDOC, :CTAADIC, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :VRADIC, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 24);
            NUMITEMS = NUMITEMS + 1;
            SUMA = SUMA - VRADIC;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            /* INSERTE EL REGISTRO DE LA BASE */
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :VRADIC, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NUMITEMS = NUMITEMS + 1;
            SUMA = SUMA - VRADIC;
            END
        END /* VR. ADIC */
        
    /* VALOR EXTRA */
    if ((CTAEXTRA IS NOT NULL) AND
        (CTAEXTRA <> '') AND
        (VREXTRA <> 0)) THEN
        BEGIN
        /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
        EXECUTE PROCEDURE CUENTA_INTERFAZ(24, :IDDOC, :CTAEXTRA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :VREXTRA, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 24);
            NUMITEMS = NUMITEMS + 1;
            SUMA = SUMA + VREXTRA;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            /* INSERTE EL REGISTRO DE LA BASE */
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :VREXTRA, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NUMITEMS = NUMITEMS + 1;
            SUMA = SUMA + VREXTRA;
            END
        END /* VR. EXTRA */
        
    if (fomento <> 'SI') then
        BEGIN
        /* DESCUENTE EL IMPOCONSUMO */
        SELECT SUM(DVCD_CONSUMO)
            FROM devoluciones_compras_det WHERE DVCO_ID = :IDDOC INTO :IMPTOS;
        if (IMPTOS IS NULL) then
            IMPTOS = 0;
        vrsubt = vrsubt - IMPTOS;
        END
    /* RETENCION FUENTE */
    if ((RTFTE = 'P') or (RTFTE = 'K')) then
      if (VRRTFTE <> 0) then
        BEGIN
        if (RTFTE = 'P') then
            CTARTFTE = TCTARTFTE;
            
        /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
        EXECUTE PROCEDURE CUENTA_INTERFAZ(24, :IDDOC, :CTARTFTE, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :VRRTFTE, 0, :VRSUBT, :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 24);
            NUMITEMS = NUMITEMS + 1;
            SUMA = SUMA + VRRTFTE;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            /* INSERTE EL REGISTRO DE LA BASE */
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :VRRTFTE, 0, :VRSUBT, :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NUMITEMS = NUMITEMS + 1;
            SUMA = SUMA + VRRTFTE;
            END
        END /* RTFTE */
    if (RTFTE = 'A') then
        BEGIN
        FOR SELECT MAX(COAR_CTARTFTE), MAX(COAR_RTFTE), MIN(COAR_RTBASE), SUM(DVCD_TOTAL-DVCD_IVAMONTO-DVCD_CONSUMO), SUM((DVCD_TOTAL-DVCD_IVAMONTO-DVCD_CONSUMO)*COAR_RTFTE)
            FROM CONTABIL_ARTICULO C, DEVOLUCIONES_COMPRAS_DET F
            WHERE F.dvco_id = :IDDOC AND F.ARTI_COD = C.ARTI_COD
            GROUP BY COAR_CTARTFTE
            INTO :CTARTFTE, :PRTFTE, :baseadic, :MONTO, :VRRTFTE
            DO
            BEGIN
            MONTO = MONTO * FACTOR;
            if (MONTO >= BASEADIC) then
                BEGIN
                VRRTFTE = VRRTFTE * FACTOR / 100;
                execute procedure redondee(VRRTFTE, DIG) returning_values (VRRTFTE);
                execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                if (VRRTFTE <> 0) then
                    BEGIN
                    /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
                    EXECUTE PROCEDURE CUENTA_INTERFAZ(24, :IDDOC, :CTARTFTE, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
                    if (ERRORC <> 0) then
                        ERROR = ERROR + 1;
                    if (TIPOCUEN = 'C') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :VRRTFTE, 0, :VRSUBT, :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 24);
                        NUMITEMS = NUMITEMS + 1;
                        SUMA = SUMA + VRRTFTE;
                        END
                    if (TIPOCUEN = 'N') then
                        BEGIN
                        /* INSERTE EL REGISTRO DE LA BASE */
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :VRRTFTE, 0, :VRSUBT, :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NUMITEMS = NUMITEMS + 1;
                        SUMA = SUMA + VRRTFTE;
                        END
                    END
                END
            END
        END /* RTFTE */
    /* RETENCION IVA */
    if ((RTIVA = 'P') or (RTIVA = 'K')) then
      if (VRRTIVA <> 0) then
        BEGIN
        if (RTIVA = 'P') then
            CTARTIVA = TCTARTIVA;
            
        /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
        EXECUTE PROCEDURE CUENTA_INTERFAZ(24, :IDDOC, :CTARTIVA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :VRRTIVA, 0, :VRIVA, :PORC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 24);
            NUMITEMS = NUMITEMS + 1;
            SUMA = SUMA + VRRTIVA;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            /* INSERTE EL REGISTRO DE LA BASE */
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :VRRTIVA, 0, :VRIVA, :PORC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NUMITEMS = NUMITEMS + 1;
            SUMA = SUMA + VRRTIVA;
            END
        END /* RTIVA */
        
    /* RETENCION DE ICA */
    if ((RTICA = 'P') or (RTICA = 'K')) then
      if (VRRTICA <> 0) then
        BEGIN
        if (RTICA = 'P') then
            CTARTICA = TCTARTICA;
            
        /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
        EXECUTE PROCEDURE CUENTA_INTERFAZ(24, :IDDOC, :CTARTICA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :VRRTICA, 0, :VRSUBT, :PRTICA, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 24);
            NUMITEMS = NUMITEMS + 1;
            SUMA = SUMA + VRRTICA;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            /* INSERTE EL REGISTRO DE LA BASE */
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :VRRTICA, 0, :VRSUBT, :PRTICA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NUMITEMS = NUMITEMS + 1;
            SUMA = SUMA + VRRTICA;
            END
        END /* RTICA */
    /* recorra las cuentas adicionales */
    FOR SELECT INCC_CUENTA, INCC_BASE, INCC_PORC, INCC_VALOR, INCC_DB
        FROM INTERFAZ_COMPRAS_CTAS
        WHERE INCO_ID = :IDINTER
        INTO :CUENTAADIC, :BASEADIC, :PORCADIC, :VALORADIC, :DBADIC
        DO
        BEGIN
        if (VALORADIC <> 0) then
            MONTO = VALORADIC;
        ELSE
            BEGIN
            if (:BASEADIC = 'SUBTOTAL') then
                VALORADIC = VRTOTAL - VREXTRA - VRIVA - VRADIC + VRDTO;
            if (:BASEADIC = 'DESCUENTO') then
                VALORADIC = VRDTO;
            if (:BASEADIC = 'IVA') then
                VALORADIC = VRIVA;
            if (:BASEADIC = 'CONSUMO') then
                SELECT SUM(DVCD_CONSUMO)
                    FROM DEVOLUCIONES_COMPRAS_DET F
                    WHERE F.DVCO_ID = :IDDOC 
                    INTO :VALORADIC;
            if (:BASEADIC = 'ADICIONAL') then
                VALORADIC = VRADIC;
            if (:BASEADIC = 'EXTRA') then
                VALORADIC = VREXTRA;
            if (:BASEADIC = 'TOTAL') then
                VALORADIC = VRTOTAL;
            MONTO = VALORADIC * PORCADIC;
            END
        if (MONTO <> 0) then
            BEGIN
            /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
            EXECUTE PROCEDURE CUENTA_INTERFAZ(24, :IDDOC, :CUENTAADIC, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                if (DBADIC = 'S') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NUMITEMS, :CUENTAADIC, :CONCEPTO, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 24);
                    SUMA = SUMA + MONTO;
                    END
                ELSE
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NUMITEMS, :CUENTAADIC, :CONCEPTO, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 24);
                    SUMA = SUMA - MONTO;
                    END
                NUMITEMS = NUMITEMS + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                if (DBADIC = 'S') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NUMITEMS, :CUENTAADIC, :CONCEPTO, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    SUMA = SUMA + MONTO;
                    END
                ELSE
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NUMITEMS, :CUENTAADIC, :CONCEPTO, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    SUMA = SUMA - MONTO;
                    END
                NUMITEMS = NUMITEMS + 1;
                END
            NUMITEMS = NUMITEMS + 1;
            END
        END
    /* CIERRE EL COMPROBANTE CONTRA LA CUENTA DEL TERCERO O LA CONSTANTE */
    if ((SUMA <> 0) and ((CXP = 'P') or (CXP = 'K'))) then
        BEGIN
        if (SUMA < 0) then
            BEGIN
            DEBITO = SUMA * -1;
            CREDITO = 0;
            END
        ELSE
            BEGIN
            DEBITO = 0;
            CREDITO = SUMA;
            END
        if (CXP = 'P') then
            CTACXP = TCTAPROV;

        /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
        EXECUTE PROCEDURE CUENTA_INTERFAZ(24, :IDDOC, :CTACXP, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :DEBITO, :CREDITO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 24);
        if (TIPOCUEN = 'N') then
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :DEBITO, :CREDITO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
        END /* SUMA EN CXP */
     end
    if (ERROR > 0) then
        VER = 'S';
    SUSPEND;
    END /* EXISTE */
ELSE
    BEGIN
    EXECUTE PROCEDURE ERROR (24, :IDDOC, :PREFIJO, 1);
    ERROR = ERROR + 1;
    VER = 'S';
    SUSPEND;
    END
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE DEVCOMPRA_SIN_CONTABILIDAD(
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    ID INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    ESTADO VARCHAR(20),
    IDI INTEGER,
    IDC INTEGER)
AS
DECLARE VARIABLE VER CHAR(2);
declare variable FECICNT VARCHAR(10);
declare variable FECFCNT VARCHAR(10);
declare variable ERROR INTEGER;
declare variable idref INTEGER;
BEGIN
EXECUTE PROCEDURE fecha_a_conta(FECINI) returning_values (FECICNT);
EXECUTE PROCEDURE fecha_a_conta(FECFIN) returning_values (FECFCNT);
FOR SELECT DVCO_ID, PREF_PRE, DVCO_NUMERO FROM DEVOLUCIONES_COMPRAS WHERE DVCO_ANULADO = 'N' AND
    DVCO_FECHA >= :FECINI AND DVCO_FECHA <= :FECFIN
    INTO :ID, :PREF, :NUMERO
DO
  BEGIN
  idref = null;
  SELECT ENCO_IDREF FROM COMPROBANTE_ENCABEZADO WHERE ENCO_TIPOREF = 24 AND ENCO_FECHA >= :FECICNT AND ENCO_FECHA <= :FECFCNT and ENCO_IDREF = :id into :idref;
  if (idref IS NULL) then
  begin
   ESTADO = 'PROCESANDO';
   SUSPEND;
   SELECT MAX(INCO_ID) FROM INTERFAZ_COMPRAS WHERE PREF_PRE = :PREF AND TIDO_COD = 24 INTO :IDI;
   EXECUTE PROCEDURE CONTABIL_DEVOLCOMP (:ID, :IDI) RETURNING_VALUES (:ERROR, :VER, :IDC);
   if (ERROR = 0) then
    BEGIN
      EXECUTE PROCEDURE CONTABILIZA_PENDIENTE (:IDC);
      ESTADO = 'OK';
    end
   ELSE
    ESTADO = 'ERROR';
   suspend;
  End
  END
END

^

SET TERM ; ^

/* 20091115b */
SET TERM ^ ;

CREATE OR ALTER procedure CONCILIA_CARTERA_DET (
    FECINI date,
    FECFIN date,
    CTACART varchar(20),
    NIT varchar(20),
    SOLODIF char(1))
returns (
    FECHA date,
    TIPODOC varchar(10),
    TIPO INTEGER,
    ID INTEGER,
    PREF varchar(4),
    NUMERO varchar(6),
    MONTO numeric(18,2),
    FECCONTA char(10),
    MONTOC numeric(18,2),
    DIFERENCIA numeric(18,2))
AS
declare variable FECINIC char(10);
declare variable FECFINC char(10);
declare variable DB CHAR(1);
begin
FOR select MVCL_TIPOREF, MVCL_IDREF, MVCL_MONTO, MVCL_FECHA, MVCL_PREFREF, MVCL_NUMREF, MVCL_DEBITO
    from movimiento_clientes
    where TERC_NIT = :NIT and MVCL_FECHA >= :FECINI and MVCL_FECHA <= :FECFIN
    into :TIPO, :ID, :MONTO, :fecha, :pref, :numero, :DB
    DO
    BEGIN
    SELECT TIDO_NOMCORTO FROM tipo_documento WHERE TIDO_COD = :tipo INTO :tipodoc;
    if (DB = 'N') then
        MONTO = MONTO * -1;
    /* BUSQUE EL CONTABLE */
    MONTOC = NULL;
    SELECT SUM(CODE_DEBITO-CODE_CREDITO) FROM comprobante_detalle D, comprobante_encabezado C
        where C.enco_consec = D.enco_consec AND C.enco_tiporef = :TIPO AND C.enco_idref = :ID AND D.cuen_cod = :ctacart
        INTO :montoc;
    if (MONTOC IS NULL) then
        BEGIN
/*        EXECUTE PROCEDURE fecha_a_conta (:FECHA) returning_values (:FECCONTA);
        SELECT SUM(CODE_DEBITO-CODE_CREDITO) FROM comprobante_detalle D, comprobante_encabezado C
            where C.enco_consec = D.enco_consec AND C.enco_fecha = :fecconta AND D.cuen_cod = :ctacart AND C.enco_numero = :numero
            INTO :montoc;
        if (MONTOC IS NULL) then*/
            MONTOC = 0;
        END
    diferencia = MONTO - MONTOC;
    if ((SOLODIF = 'N') or (DIFERENCIA <> 0)) then
        SUSPEND;
    END
/* AGREGUE LAS QUE NO TIENEN IDREF */
MONTO = 0;
EXECUTE PROCEDURE fecha_a_conta (:FECINI) returning_values (:FECINIC);
EXECUTE PROCEDURE fecha_a_conta (:FECFIN) returning_values (:FECFINC);
FOR SELECT C.tico_cod, C.enco_fecha, C.prco_pref, C.enco_numero, CODE_DEBITO-CODE_CREDITO FROM comprobante_detalle D, comprobante_encabezado C
    where C.enco_consec = D.enco_consec AND CUEN_COD = :ctacart AND D.terc_nit = :NIT AND C.enco_fecha >= :fecinic AND C.enco_fecha <= :fecfinc AND C.enco_idref = 0
    INTO :tipodoc, :fecconta, :pref, :numero, :montoc
    do
    BEGIN
    diferencia = MONTO - MONTOC;
    SUSPEND;
    END
end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER PROCEDURE CONCILIA_CXPAGAR_DET(
    FECINI DATE,
    FECFIN DATE,
    CTACART VARCHAR(20),
    NIT VARCHAR(20),
    SOLODIF CHAR(1))
RETURNS (
    FECHA DATE,
    TIPODOC VARCHAR(10),
    TIPO INTEGER,
    ID INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    MONTO NUMERIC(18,2),
    FECCONTA CHAR(10),
    MONTOC NUMERIC(18,2),
    DIFERENCIA NUMERIC(18,2))
AS
declare variable fecinic char(10);
declare variable fecfinc char(10);
declare variable db char(1);
declare variable ab char(1);
declare variable RETES char(2);
declare variable rtfte numeric(18,2);
declare variable rtiva numeric(18,2);
declare variable rtica numeric(18,2);
begin
FOR select MVPR_TIPOREF, MVPR_IDREF, MVPR_MONTO, MVPR_FECHA, MVPR_PREFIJO, MVPR_NUMERO, MVPR_DEBITO, mvpr_rtfte, mvpr_rtiva, mvpr_rtica, mvpr_abono
    from movimiento_proveedor
    where TERC_NIT = :NIT and MVPR_FECHA >= :FECINI and MVPR_FECHA <= :FECFIN
    into :TIPO, :ID, :MONTO, :fecha, :pref, :numero, :DB, :rtfte, :rtiva, :rtica, :ab
    DO
    BEGIN
    EXECUTE PROCEDURE LEE_CONFIGURACION('CXPAGAR', 'SALDOS', 'DESCONTAR RETENCIONES POR CAUSACION') returning_values(:RETES);
    if (RETES = 'SI') then
        begin
        if (ab = 'N') then
            MONTO = MONTO - rtfte - rtiva - rtica;
        end
    else
        begin
        if (ab = 'S') then
            MONTO = MONTO + rtfte + rtiva + rtica;
        end
    SELECT TIDO_NOMCORTO FROM tipo_documento WHERE TIDO_COD = :tipo INTO :tipodoc;
    if (DB = 'N') then
        MONTO = MONTO * -1;
    /* BUSQUE EL CONTABLE */
    MONTOC = NULL;
    SELECT SUM(CODE_CREDITO-CODE_DEBITO) FROM comprobante_detalle D, comprobante_encabezado C
        where C.enco_consec = D.enco_consec AND C.enco_tiporef = :TIPO AND C.enco_idref = :ID AND D.cuen_cod = :ctacart
        INTO :montoc;
    if (MONTOC IS NULL) then
        BEGIN
/*        EXECUTE PROCEDURE fecha_a_conta (:FECHA) returning_values (:FECCONTA);
        SELECT SUM(CODE_DEBITO-CODE_CREDITO) FROM comprobante_detalle D, comprobante_encabezado C
            where C.enco_consec = D.enco_consec AND C.enco_fecha = :fecconta AND D.cuen_cod = :ctacart AND C.enco_numero = :numero
            INTO :montoc;
        if (MONTOC IS NULL) then*/
            MONTOC = 0;
        END
    diferencia = MONTO - MONTOC;
    if ((SOLODIF = 'N') or (DIFERENCIA <> 0)) then
        SUSPEND;
    END
/* AGREGUE LAS QUE NO TIENEN IDREF */
MONTO = 0;
EXECUTE PROCEDURE fecha_a_conta (:FECINI) returning_values (:FECINIC);
EXECUTE PROCEDURE fecha_a_conta (:FECFIN) returning_values (:FECFINC);
FOR SELECT C.tico_cod, C.enco_fecha, C.prco_pref, C.enco_numero, CODE_DEBITO-CODE_CREDITO FROM comprobante_detalle D, comprobante_encabezado C
    where C.enco_consec = D.enco_consec AND CUEN_COD = :ctacart AND D.terc_nit = :NIT AND C.enco_fecha >= :fecinic AND C.enco_fecha <= :fecfinc AND C.enco_idref = 0
    INTO :tipodoc, :fecconta, :pref, :numero, :montoc
    do
    BEGIN
    diferencia = MONTO - MONTOC;
    SUSPEND;
    END
end
^

SET TERM ; ^



/* 20091118 */
/* los puntos vencidos son los del saldo hace un año menos las redenciones */
/* NO ACUMULE PUNTOS AL CLIENTE DE CONTADO */

SET TERM ^ ;

CREATE OR ALTER procedure CONSULTA_PUNTOS_CLIENTE (
    IDDOC integer,
    CLIENTE varchar(20),
    FECHA date)
returns (
    PTDOC integer,
    PTACUM integer,
    PTVENCER integer,
    FECPTOS date)
AS
declare variable numrows integer;
declare variable anos integer;
declare variable fecaux date;
declare variable fecaux2 date;
declare variable nitcontado varchar(20);
declare variable ok integer;
declare variable ptaux integer;
declare variable PTAGENCIA CHAR(2);
begin
ptdoc = 0;
ptacum = 0;
ptvencer = 0;
ok = 1;
if (IDDOC <> 0) then
    begin
    /* verifique que no sea cliente de contado de la autorización */
    select max(auto_nitcontado) from facturas f, autorizaciones a
        where f.pref_pre = a.pref_pre and fact_id = :iddoc into :nitcontado;
    if (cliente = nitcontado) then
        ok = 0;

    if (ok <> 0) then
        begin
        select count(ptcl_id) from puntos_cliente where ptcl_nit = :cliente and ptcl_tipodoc = 31 and ptcl_iddoc = :iddoc into :numrows;
        if (numrows <> 0) then
            begin
            select SUM(ptcl_db-ptcl_cr) from puntos_cliente where ptcl_nit = :cliente and ptcl_tipodoc = 31 and ptcl_iddoc = :iddoc into :ptdoc;
            end
        end
    end
/* los puntos totales */
EXECUTE PROCEDURE lee_configuracion ('FACTURACION', 'POS', 'MANEJAR TABLA DE PUNTOS DE CLIENTE ACUMULADOS PARA VARIAS AGENCIAS') returning_values (ptagencia);
if (PTAGENCIA = 'SI') then
    BEGIN
    SELECT PTCA_ACUMULADO, PTCA_PORVENCER, PTCA_FECHA FROM puntos_cliente_acumulado WHERE TERC_NIT = :cliente
        INTO :ptacum, :ptvencer, :fecptos;
    SUSPEND;
    END
ELSE
    BEGIN
    numrows = 0;
    select max(ptcl_fecha) from puntos_cliente where ptcl_nit = :cliente and ptcl_fecha <= :fecha into :fecaux;
    if (fecaux is not null) then
        select max(ptcl_saldo), sum(ptcl_db - ptcl_cr) from puntos_cliente where ptcl_nit = :cliente and ptcl_fecha = :fecaux into :ptacum, :ptvencer;
    if (ptacum is null) then
        ptacum = 0;
    if (ptvencer is null) then
        ptvencer = 0;
    ptacum = ptacum + ptvencer;
    /* reste los vencidos */
    execute procedure lee_configuracion('FACTURACION', 'FACTURAS', 'VENCIMIENTO DE PUNTOS POR CLIENTE EN AÑOS') returning_values (:anos);
    fecaux = fecha - (anos * 365);
    select max(ptcl_fecha) from puntos_cliente where ptcl_nit = :cliente and ptcl_fecha <= :fecaux into :fecaux;
    if (fecaux is not null) then
        select max(ptcl_saldo), sum(ptcl_db - ptcl_cr) from puntos_cliente where ptcl_nit = :cliente and ptcl_fecha = :fecaux into :ptvencer, :ptaux;
    else
        begin
        ptvencer = 0;
        ptaux = 0;
        end
    if (ptvencer is null) then
        ptvencer = 0;
    if (ptaux is null) then
        ptaux = 0;
    ptvencer = ptvencer - ptaux;
    /* al saldo de hace n años restele las redenciones entre esa fecha y hoy */
    ptaux = 0;
    select sum(ptcl_cr) from puntos_cliente where ptcl_nit = :cliente and ptcl_fecha >= :fecaux and ptcl_fecha <= :fecha and ptcl_tipodoc = 81 into :ptaux;
    if (ptaux is null) then
        ptaux = 0;
    else
        if (ptaux > ptvencer) then
            ptvencer = 0;
        else
            ptvencer = ptvencer - ptaux;
    ptacum = ptacum - ptvencer;

    /* los por vencer */
    execute procedure lee_configuracion('FACTURACION', 'FACTURAS', 'VENCIMIENTO DE PUNTOS POR CLIENTE EN AÑOS') returning_values (:anos);
    fecaux = fecha - (anos * 365);
    fecaux2 = fecha - (anos * 365) + 30;
    select sum(ptcl_db - ptcl_cr) from puntos_cliente where ptcl_nit = :cliente and ptcl_fecha >= :fecaux and ptcl_fecha <= :fecaux2 into :ptvencer;
    if (ptvencer is null) then
        ptvencer = 0;
    fecptos = :fecha;
    suspend;
    END
end
^

SET TERM ; ^

SET TERM ^ ;

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

/* ACUMULE LOS PUNTOS, SE HACE ACA POR SER POSTERIOR AL DETALLE */
if (ANULADO = 'N') then
    EXECUTE PROCEDURE acumula_puntos_cliente (31, :id, :nit, :fecha) returning_values (:PUNTOS);
EXECUTE PROCEDURE consulta_puntos_cliente (:id, :nit, :fecha) returning_values (:puntos, :puntosacum, :puntosvenc, :fecptos);
if (DTOIT1M IS NULL) then
    DTOIT1M = 0;
if (DTOIT2M IS NULL) then
    DTOIT2M = 0;
if (DTOIT3M IS NULL) then
    DTOIT3M = 0;
SELECT CLIE_COD, C.ZONA_COD, ZONA_NOM
    FROM CLIENTES C, ZONAS Z
    WHERE TERC_NIT = :NIT AND C.ZONA_COD = Z.ZONA_COD
    INTO :CODIGOCL, :ZONACOD, :ZONANOM;
SELECT CLSU_DIR, CLSU_CIUDAD, CLSU_TEL FROM CLIENTE_SUCURSALES WHERE TERC_NIT = :NIT AND CLCU_COD = :SUCUR
    INTO :DIRECCION, :CIUDAD, :TELEFONO;
DIASVENCE = VENCE - FECHA;
if (DIASVENCE > 0) then
    CONTCRED = 'CREDITO ' || CAST(DIASVENCE AS VARCHAR(3)) || ' DIAS';
ELSE
    CONTCRED = 'CONTADO';
SUBTOTAL = TOTALFAC - EXTRA - IVAMONTO - ADICIONAL + DTOMONTO;
if (DTOITE3 = 'SI') then
    BEGIN
    SELECT SUM(FADE_DTOMONTO) FROM FACTURAS_DETALLE WHERE FACT_ID = :id INTO :sumdtoit;
    SUBTOTAL = SUBTOTAL + sumdtoit + dtoit1m + dtoit2m + dtoit3m;
    END
if (INGTER <> '') then
    BEGIN
    SELECT SUM(FADE_TOTAL) FROM FACTURAS_DETALLE D, ARTICULO A WHERE A.arti_cod = D.arti_cod AND FACT_ID = :id AND GRUP_COD = :ingter
        INTO :ingterceros;
    INGPROPIOS = SUBTOTAL - INGTERCEROS;
    END
EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'FECHA AUTORETENEDOR NO DESCONTAR RETENCIONES DEL SALDO PERO SI CONTABILIZARLAS') returning_values (AUTORET);
if (AUTORET <> '') then
    FAUTORET = CAST(AUTORET AS DATE);
else
    FAUTORET = '9999/12/31';
if (FECHA > fautoret) then
    TOTALPAGAR = TOTALFAC - RTEIVAMONTO - RTEICAMONTO - ANTICIPO;
ELSE
    TOTALPAGAR = TOTALFAC - RTEFTEMONTO - RTEIVAMONTO - RTEICAMONTO - ANTICIPO;
TOTALNETO = TOTALFAC - ANTICIPO;
if (RECIBIDO <> 0) then
    CAMBIO = RECIBIDO - totalpagar;
ELSE
    CAMBIO = 0;
SUMAEX = 0;
SUMA1 = 0;
SUMA2 = 0;
SUMA3 = 0;
IVA1 = 0;
IVA2 = 0;
IVA3 = 0;
TOTCONSUMO = 0;
MONTOPAGO1 = 0;
PESOTOT = 0;
SELECT MAX(AUDI_HORA) FROM AUDITORIA WHERE TIDO_COD = 31 AND AUDI_IDDOC = :ID AND AUDI_OPER = 'I' INTO :HORA;
/* AHORA LAS FORMAS DE PAGO, BUSQUE EL ABONO DE HOY A LA FACTURA */
ITEMFP = 1;
MONTOPAGO1 = 0;
MONTOPAGO2 = 0;
MONTOPAGO3 = 0;
FOR SELECT FOPA_NOM, RCPA_MONTO FROM RECIBOS_CAJA_PAGO P, FORMAS_PAGO F, RECIBOS_CAJA R, RECIBOS_CAJA_DETALLE D
    WHERE R.RECA_ID = P.RECA_ID AND R.RECA_ID = D.RECA_ID AND P.FOPA_ID = F.FOPA_ID AND RECA_FECHA = :FECHA AND RCDE_TIPODOC = 31 AND RCDE_IDDOC = :ID
    INTO :formap, :MONTOP
    DO
    BEGIN
    if (ITEMFP = 1) then
        BEGIN
        FORMAPAGO1 = FORMAP;
        MONTOPAGO1 = MONTOP;
        END
    if (ITEMFP = 2) then
        BEGIN
        FORMAPAGO2 = FORMAP;
        MONTOPAGO2 = MONTOP;
        END
    if (ITEMFP = 3) then
        BEGIN
        FORMAPAGO3 = FORMAP;
        MONTOPAGO3 = MONTOP;
        END
    ITEMFP = ITEMFP + 1;
    END
EXECUTE PROCEDURE lee_configuracion ('FACTURACION','DOCUMENTOS','ORDENAR ITEMS POR CODIGO DE ARTICULO') returning_values (:ORDENCOD);
EXECUTE PROCEDURE lee_configuracion ('FACTURACION','POS', 'IMPRIMIR DEVOLUCIONES DE ARTICULOS NEGATIVOS') returning_values (:imprdev);
totcajas = 0;
totbase = 0;
if (ORDENCOD = 'SI') then
    BEGIN
    FOR SELECT FADE_ITEM, D.ARTI_COD, FADE_CODBAR, SUBSTR(FADE_DESC,1,60), ARTI_DESCORTA, FADE_CANT, FADE_UNIDAD, FADE_FACTOR, BODE_COD, FADE_LOTE, LIPR_COD, FADE_PRUNIT, FADE_DTOPORC, FADE_DTOMONTO, FADE_IVAPORC, FADE_IVAMONTO, FADE_CONSUMO, FADE_TOTAL, FADE_REFERENCIA,
        GRUP_COD, SUBG_COD, MARC_COD, ARTI_PESO, ARTI_ANCHO, ARTI_ALTO, ARTI_LARGO, TAIV_COD, FADE_DEVUELTO, FADE_OBS, FADE_DTO1, FADE_DTO2, FADE_DTO3, FADE_DTOM1, FADE_DTOM2, FADE_DTOM3, FADE_CAJAS, FADE_BASE, FADE_PORCBASE
        FROM FACTURAS_DETALLE D, ARTICULO A
        WHERE D.ARTI_COD = A.ARTI_COD AND D.FACT_ID = :ID
        ORDER BY D.ARTI_COD
        INTO :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :DESCORTA, :CANT, :UNIDAD, :FACTOR, :BODITEM, :LOTE, :LISTAPR, :PRUNIT, :DTOITPORC, :DTOITMONTO, :IVAPORC, :IVAITMONTO, :CONSUMO, :TOTAL, :refitem,
        :GRUPO, :SUBGRUPO, :MARCA, :PESO, :ANCHO, :ALTO, :LARGO, :TARIFA, :devuelto, :obsitem, :dtoit1, :dtoit2, :dtoit3, :dtoitm1, :dtoitm2, :dtoitm3, :cajas, :base, :porcbase
        DO
          BEGIN
          if (ARTICULO = CODBAR) then
            SELECT FIRST 1 COBA_COD FROM barras_articulo WHERE ARTI_COD = :articulo INTO :CODBAR;
          if (IMPRDEV <> 'SI') then
            BEGIN
            if ((CANT >= 0) AND (DEVUELTO = 0)) then
                IMPR = 'S';
            ELSE
                IMPR = 'N'; /* ES DEVOLUCION */
            END
          ELSE
            IMPR = 'S';
          if (IMPR = 'S') then
            BEGIN
            prneto = PRUNIT - DTOITMONTO - dtoitm1 - dtoitm2 - dtoitm3;
            if (IMPTOS = 'S') then
                if (cant <> 0) then
                    prnetosiniva = PRUNIT - DTOITMONTO - ((IVAITMONTO+CONSUMO) / CANT) - dtoitm1 - dtoitm2 - dtoitm3;
                else
                    prnetosiniva = PRUNIT - DTOITMONTO - dtoitm1 - dtoitm2 - dtoitm3;
            ELSE
                prnetosiniva = PRUNIT - DTOITMONTO - dtoit1m - dtoit2m - dtoit3m;
            if (ICOINC = 'SI') then
                SUBTOTIT = TOTAL - IVAITMONTO;
            else
                SUBTOTIT = TOTAL - IVAITMONTO - CONSUMO;
            TOTCONSUMO = TOTCONSUMO + CONSUMO;
            TOTBASE = TOTBASE + BASE;
            SELECT LOTE_VENCE FROM LOTES WHERE LOTE_NRO = :lote AND ARTI_COD = :ARTICULO AND BODE_COD = :boditem INTO :vlote;
            if ((REFITEM <> '.t') or (REFITEM IS NULL)) then
                BEGIN
                /* NO SUME LOS ENSAMBLES */
                if (IVAPORC = 0) then
                    SUMAEX = SUMAEX + TOTAL;
                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;
                END
            if (ANCHO IS NULL) then
                ANCHO = 0;
            if (ALTO IS NULL) then
                ALTO = 0;
            if (LARGO IS NULL) then
                LARGO = 0;
            if (PESO IS NULL) then
                PESO = 0;
            PESO = (PESO / 1000) * CANT * FACTOR;
            PESOTOT = PESOTOT + PESO;
            totcajas = totcajas + cajas;
            if (substr(ARTICULO,1,2) = '.t') then
                BEGIN
                REFITEM = '';
                TOTAL = 0;
                SUBTOTIT = 0;
                END
            SELECT STAND_COD FROM STANDS WHERE ARTI_COD = :ARTICULO AND STAND_BODEGA = :boditem INTO :stand;
            factcant = NULL;
            SELECT FIRST 1 UNAR_FACCAN FROM unidad_articulo WHERE ARTI_COD = :articulo INTO :factcant;
            if (factcant IS NULL) then
                BEGIN
                ALTERNATIVAS = 0;
                PRINCIPALES = (CANT * FACTOR);
                END
            ELSE
                BEGIN
                ALTERNATIVAS = FLOOR(CANT * factor / factcant);
                PRINCIPALES = (CANT * FACTOR) - (alternativas * factcant);
                END
            SUSPEND;
            END
          END
    END
ELSE
  if (ORDENCOD = 'UNIDAD') then
    BEGIN
    FOR SELECT FADE_ITEM, D.ARTI_COD, FADE_CODBAR, SUBSTR(FADE_DESC,1,60), ARTI_DESCORTA, FADE_CANT, FADE_UNIDAD, FADE_FACTOR, BODE_COD, FADE_LOTE, LIPR_COD, FADE_PRUNIT, FADE_DTOPORC, FADE_DTOMONTO, FADE_IVAPORC, FADE_IVAMONTO, FADE_CONSUMO, FADE_TOTAL, FADE_REFERENCIA,
        GRUP_COD, SUBG_COD, MARC_COD, ARTI_PESO, ARTI_ANCHO, ARTI_ALTO, ARTI_LARGO, TAIV_COD, FADE_DEVUELTO, FADE_OBS, FADE_DTO1, FADE_DTO2, FADE_DTO3, FADE_DTOM1, FADE_DTOM2, FADE_DTOM3, FADE_CAJAS, FADE_BASE, FADE_PORCBASE
        FROM FACTURAS_DETALLE D, ARTICULO A
        WHERE D.ARTI_COD = A.ARTI_COD AND D.FACT_ID = :ID
        ORDER BY D.fade_unidad, D.fade_desc
        INTO :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :DESCORTA, :CANT, :UNIDAD, :FACTOR, :BODITEM, :LOTE, :LISTAPR, :PRUNIT, :DTOITPORC, :DTOITMONTO, :IVAPORC, :IVAITMONTO, :CONSUMO, :TOTAL, :refitem,
        :GRUPO, :SUBGRUPO, :MARCA, :PESO, :ANCHO, :ALTO, :LARGO, :TARIFA, :devuelto, :obsitem, :dtoit1, :dtoit2, :dtoit3, :dtoitm1, :dtoitm2, :dtoitm3, :cajas, :base, :porcbase
        DO
          BEGIN
          if (ARTICULO = CODBAR) then
            SELECT FIRST 1 COBA_COD FROM barras_articulo WHERE ARTI_COD = :articulo INTO :CODBAR;
          if (IMPRDEV <> 'SI') then
            BEGIN
            if ((CANT >= 0) AND (DEVUELTO = 0)) then
                IMPR = 'S';
            ELSE
                IMPR = 'N'; /* ES DEVOLUCION */
            END
          ELSE
            IMPR = 'S';
          if (IMPR = 'S') then
            BEGIN
            prneto = PRUNIT - DTOITMONTO - dtoitm1 - dtoitm2 - dtoitm3;
            if (IMPTOS = 'S') then
                if (cant <> 0) then
                    prnetosiniva = PRUNIT - DTOITMONTO - ((IVAITMONTO+CONSUMO) / CANT) - dtoitm1 - dtoitm2 - dtoitm3;
                else
                    prnetosiniva = PRUNIT - DTOITMONTO - dtoitm1 - dtoitm2 - dtoitm3;
            ELSE
                prnetosiniva = PRUNIT - DTOITMONTO - dtoit1m - dtoit2m - dtoit3m;
            if (ICOINC = 'SI') then
                SUBTOTIT = TOTAL - IVAITMONTO;
            else
                SUBTOTIT = TOTAL - IVAITMONTO - CONSUMO;
            TOTCONSUMO = TOTCONSUMO + CONSUMO;
            TOTBASE = TOTBASE + BASE;
            SELECT LOTE_VENCE FROM LOTES WHERE LOTE_NRO = :lote AND ARTI_COD = :ARTICULO AND BODE_COD = :boditem INTO :vlote;
            if ((REFITEM <> '.t') or (REFITEM IS NULL)) then
                BEGIN
                /* NO SUME LOS ENSAMBLES */
                if (IVAPORC = 0) then
                    SUMAEX = SUMAEX + TOTAL;
                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;
                END
            if (ANCHO IS NULL) then
                ANCHO = 0;
            if (ALTO IS NULL) then
                ALTO = 0;
            if (LARGO IS NULL) then
                LARGO = 0;
            if (PESO IS NULL) then
                PESO = 0;
            PESO = (PESO / 1000) * CANT * FACTOR;
            PESOTOT = PESOTOT + PESO;
            totcajas = totcajas + cajas;
            if (substr(ARTICULO,1,2) = '.t') then
                BEGIN
                REFITEM = '';
                TOTAL = 0;
                SUBTOTIT = 0;
                END
            SELECT STAND_COD FROM STANDS WHERE ARTI_COD = :ARTICULO AND STAND_BODEGA = :boditem INTO :stand;
            factcant = NULL;
            SELECT FIRST 1 UNAR_FACCAN FROM unidad_articulo WHERE ARTI_COD = :articulo INTO :factcant;
            if ((factcant IS NULL) or (factcant = 0)) then
                BEGIN
                ALTERNATIVAS = 0;
                PRINCIPALES = (CANT * FACTOR);
                END
            ELSE
                BEGIN
                ALTERNATIVAS = FLOOR(CANT * factor / factcant);
                PRINCIPALES = (CANT * FACTOR) - (alternativas * factcant);
                END
            SUSPEND;
            END
          END
    END
  ELSE
    BEGIN
    FOR SELECT FADE_ITEM, D.ARTI_COD, FADE_CODBAR, SUBSTR(FADE_DESC,1,60), ARTI_DESCORTA, FADE_CANT, FADE_UNIDAD, FADE_FACTOR, BODE_COD, FADE_LOTE, LIPR_COD, FADE_PRUNIT, FADE_DTOPORC, FADE_DTOMONTO, FADE_IVAPORC, FADE_IVAMONTO, FADE_CONSUMO, FADE_TOTAL, FADE_REFERENCIA,
        GRUP_COD, SUBG_COD, MARC_COD, ARTI_PESO, ARTI_ANCHO, ARTI_ALTO, ARTI_LARGO, TAIV_COD, FADE_DEVUELTO, FADE_OBS, FADE_DTO1, FADE_DTO2, FADE_DTO3, FADE_DTOM1, FADE_DTOM2, FADE_DTOM3, FADE_CAJAS, FADE_BASE, FADE_PORCBASE
        FROM FACTURAS_DETALLE D, ARTICULO A
        WHERE D.ARTI_COD = A.ARTI_COD AND D.FACT_ID = :ID
        ORDER BY FADE_ITEM
        INTO :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :DESCORTA, :CANT, :UNIDAD, :FACTOR, :BODITEM, :LOTE, :LISTAPR, :PRUNIT, :DTOITPORC, :DTOITMONTO, :IVAPORC, :IVAITMONTO, :CONSUMO, :TOTAL, :refitem,
        :GRUPO, :SUBGRUPO, :MARCA, :PESO, :ANCHO, :ALTO, :LARGO, :TARIFA, :devuelto, :obsitem, :dtoit1, :dtoit2, :dtoit3, :dtoitm1, :dtoitm2, :dtoitm3, :cajas, :base, :porcbase
        DO
          BEGIN
          if (IMPRDEV <> 'SI') then
            BEGIN
            if ((CANT >= 0) AND (DEVUELTO = 0)) then
                IMPR = 'S';
            ELSE
                IMPR = 'N'; /* ES DEVOLUCION */
            END
          ELSE
            IMPR = 'S';
          if (IMPR = 'S') then
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :GRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :MARCA INTO NOMMARCA;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :SUBGRUPO AND GRUP_COD = :GRUPO INTO :NOMSUBG;
            prneto = PRUNIT - DTOITMONTO - dtoitm1 - dtoitm2 - dtoitm3;
            if (IMPTOS = 'S') then
                if (cant <> 0) then
                    prnetosiniva = PRUNIT - DTOITMONTO - ((IVAITMONTO+CONSUMO) / CANT) - dtoit1m - dtoit2m - dtoit3m;
                else
                    prnetosiniva = PRUNIT - DTOITMONTO - dtoitm1 - dtoitm2 - dtoitm3;
            ELSE
                prnetosiniva = PRUNIT - DTOITMONTO - dtoitm1 - dtoitm2 - dtoitm3;
            if (ICOINC = 'SI') then
                SUBTOTIT = TOTAL - IVAITMONTO;
            else
                SUBTOTIT = TOTAL - IVAITMONTO - CONSUMO;
            TOTCONSUMO = TOTCONSUMO + CONSUMO;
            TOTBASE = TOTBASE + BASE;
            SELECT LOTE_VENCE FROM LOTES WHERE LOTE_NRO = :lote AND ARTI_COD = :ARTICULO AND BODE_COD = :boditem INTO :vlote;
            if ((REFITEM <> '.t') or (REFITEM IS NULL)) then
                BEGIN
                /* NO SUME LOS ENSAMBLES */
                if (IVAPORC = 0) then
                    SUMAEX = SUMAEX + TOTAL;
                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;
                END
            if (ANCHO IS NULL) then
                ANCHO = 0;
            if (ALTO IS NULL) then
                ALTO = 0;
            if (LARGO IS NULL) then
                LARGO = 0;
            if (PESO IS NULL) then
                PESO = 0;
            PESO = (PESO / 1000)* CANT * FACTOR;
            PESOTOT = PESOTOT + PESO;
            totcajas = totcajas + cajas;
            if (substr(ARTICULO,1,2) = '.t') then
                BEGIN
                REFITEM = '';
                TOTAL = 0;
                SUBTOTIT = 0;
                END
            SELECT STAND_COD FROM STANDS WHERE ARTI_COD = :ARTICULO AND STAND_BODEGA = :boditem INTO :stand;
            factcant = NULL;
            SELECT FIRST 1 UNAR_FACCAN FROM unidad_articulo WHERE ARTI_COD = :articulo INTO :factcant;
            if ((factcant IS NULL) or (factcant = 0)) then
                BEGIN
                ALTERNATIVAS = 0;
                PRINCIPALES = (CANT * FACTOR);
                END
            ELSE
                BEGIN
                ALTERNATIVAS = FLOOR(CANT * factor / factcant);
                PRINCIPALES = (CANT * FACTOR) - (alternativas * factcant);
                END
            SUSPEND;
            END
          END
    END
END

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE IMPR_REDENCION(
    ID INTEGER)
RETURNS (
    NUMERO VARCHAR(6),
    FECHA DATE,
    NIT VARCHAR(20),
    NOMCLIENTE VARCHAR(60),
    DIR VARCHAR(60),
    TEL VARCHAR(60),
    PREMIO VARCHAR(15),
    NOMPREMIO VARCHAR(60),
    PUNTOS INTEGER,
    PUNTOSACUM INTEGER,
    PUNTOSVENC INTEGER,
    FECPTOS DATE)
AS
declare variable puntosaux INTEGER;
begin
SELECT PTRE_NUMERO, PTRE_FECHA, PTRE_NIT, TERC_NOM, TERC_DIR, TERC_TEL, R.PTPR_COD, PTPR_NOMBRE, PTRE_PUNTOS
    FROM PUNTOS_REDENCION R, puntos_premios P, TERCEROS T
    WHERE R.ptre_nit = T.terc_nit AND R.ptpr_cod = P.ptpr_cod AND R.ptre_id = :ID
    INTO :NUMERO, :FECHA, :NIT, :NOMCLIENTE, :DIR, :TEL, :PREMIO, :NOMPREMIO, :PUNTOS;
EXECUTE PROCEDURE consulta_puntos_cliente (0, :nit, :fecha) returning_values (:puntosaux, :puntosacum, :puntosvenc, :fecptos);
suspend;
end

^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure ACUMULA_PUNTOS_CLIENTE (
    TIPO integer,
    IDDOC integer,
    CLIENTE varchar(20),
    FECHA date)
returns (
    PUNTOS integer)
AS
declare variable numrows integer;
declare variable fecaux date;
declare variable IDP INTEGER;
declare variable ok integer;
declare variable ACUMULA CHAR(10);
declare variable FACTOR INTEGER;
declare variable ARTICULO VARCHAR(15);
declare variable FACTORART INTEGER;
declare variable ptos FLOAT;
declare variable ptosacum FLOAT;
declare variable HORA TIME;
declare variable HORINI TIME;
declare variable HORFIN TIME;
begin
ok = 1;
execute procedure lee_configuracion('FACTURACION', 'FACTURAS', 'ACUMULAR PUNTOS POR VENTAS A CLIENTE REGULARES') returning_values (ACUMULA);
if (acumula = 'VENTA') then
    begin
    execute procedure lee_configuracion('FACTURACION', 'FACTURAS', 'FACTOR DE CONVERSION DE PUNTOS') returning_values (FACTOR);
    if (IDDOC <> 0) then
        begin
        if (NOT EXISTS (SELECT AUTO_NUMERO FROM AUTORIZACIONES WHERE AUTO_NITCONTADO = :cliente)) then
          BEGIN
          if (tipo = 31) then
            begin
            select count(ptcl_id) from puntos_cliente where ptcl_nit = :cliente and ptcl_tipodoc = 31 and ptcl_iddoc = :iddoc into :numrows;
            if (numrows = 0) then
                begin
                ptosacum = 0;
                /* recorra la factura acumulando los puntos */
                for select arti_cod, (fade_total-fade_ivamonto-fade_consumo)/:factor from facturas_detalle
                    where fact_id = :iddoc and substring(arti_cod from 1 FOR 2) <> '.t' into :articulo, :ptos
                    do
                    begin
                    factorart = 1;
                    select ptar_factor from puntos_articulos where PTAR_COD = :articulo into :factorart;
                    ptosacum = ptosacum + (ptos * factorart);
                    end
                /* SI ES UN DIA ESPECIAL APLIQUE EL FACTOR */
                SELECT FACT_FECHA FROM FACTURAS WHERE FACT_ID = :iddoc INTO :fecaux;
                FOR SELECT PTDE_ID FROM puntos_diasespecial WHERE PTDE_FECINI <= :fecaux AND PTDE_FECFIN >= :fecaux INTO :idp
                    DO
                    BEGIN
                    SELECT PTDE_HORINI, PTDE_HORFIN, PTDE_FACTOR FROM puntos_diasespecial
                        WHERE PTDE_ID = :IDP INTO :HORINI, :HORFIN, :factorart;
                    SELECT AUDI_HORA FROM AUDITORIA WHERE TIDO_COD = 31 AND AUDI_IDDOC = :iddoc INTO HORA;
                    if ((horini <= HORA) AND (horfin >= HORA)) then
                        ptosacum = ptosacum * factorart;
                    END
                /* inserte el registro de puntos */
                puntos = floor(ptosacum);
                insert into puntos_cliente (ptcl_nit, ptcl_fecha, ptcl_tipodoc, ptcl_iddoc, ptcl_db, ptcl_cr)
                    values (:cliente, :fecha,  31, :iddoc, :puntos, 0);
                end
            end
          if (tipo = 33) then
            begin
            select count(ptcl_id) from puntos_cliente where ptcl_nit = :cliente and ptcl_tipodoc = 33 and ptcl_iddoc = :iddoc into :numrows;
            if (numrows = 0) then
                begin
                ptosacum = 0;
                /* recorra la DEVOLUCION acumulando los puntos */
                for select arti_cod, (dvde_total-dvde_ivamonto-dvde_consumo)/:factor from devoluciones_ventas_detalle
                    where devt_id = :iddoc and substring(arti_cod from 1 FOR 2) <> '.t' into :articulo, :ptos
                    do
                    begin
                    factorart = 1;
                    select ptar_factor from puntos_articulos where PTAR_COD = :articulo into :factorart;
                    ptosacum = ptosacum + (ptos * factorart);
                    end
                /* SI ES UN DIA ESPECIAL APLIQUE EL FACTOR */
                SELECT DEVT_FECHA FROM devoluciones_ventas WHERE DEVT_ID = :iddoc INTO :fecaux;
                FOR SELECT PTDE_ID FROM puntos_diasespecial WHERE PTDE_FECINI <= :fecaux AND PTDE_FECFIN >= :fecaux INTO :idp
                    DO
                    BEGIN
                    SELECT PTDE_HORINI, PTDE_HORFIN, PTDE_FACTOR FROM puntos_diasespecial
                        WHERE PTDE_ID = :IDP INTO :HORINI, :HORFIN, :factorart;
                    SELECT AUDI_HORA FROM AUDITORIA WHERE TIDO_COD = 33 AND AUDI_IDDOC = :iddoc INTO HORA;
                    if ((horini <= HORA) AND (horfin >= HORA)) then
                        ptosacum = ptosacum * factorart;
                    END
                /* inserte el registro de puntos */
                puntos = floor(ptosacum);
                insert into puntos_cliente (ptcl_nit, ptcl_fecha, ptcl_tipodoc, ptcl_iddoc, ptcl_db, ptcl_cr)
                    values (:cliente, :fecha,  33, :iddoc, 0, :puntos);
                end
            end
          END
        suspend;
        end
    end
end
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE IMPR_DEVOLUCION(
    ID INTEGER)
RETURNS (
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    NIT VARCHAR(20),
    NOMTERCERO VARCHAR(60),
    VENDEDOR INTEGER,
    NOMVENDEDOR VARCHAR(60),
    PUNTOVTA INTEGER,
    NOMPUNTOVTA VARCHAR(30),
    CODBODEGA VARCHAR(2),
    NOMBODEGA VARCHAR(30),
    FACTURA VARCHAR(30),
    REMISION VARCHAR(10),
    COMIPORC NUMERIC(9,2),
    COMIMONTO NUMERIC(18,2),
    SUBTOTAL NUMERIC(18,2),
    DTOPORC NUMERIC(9,2),
    DTOMONTO NUMERIC(18,2),
    ADICIONAL NUMERIC(18,2),
    IVAMONTO NUMERIC(18,2),
    RTEFTEPORC NUMERIC(9,2),
    RTEFTEMONTO NUMERIC(18,2),
    RTEIVAPORC NUMERIC(9,2),
    RTEIVAMONTO NUMERIC(18,2),
    RTEICAPORC NUMERIC(9,2),
    RTEICAMONTO NUMERIC(18,2),
    EXTRA NUMERIC(18,2),
    TOTALFAC NUMERIC(18,2),
    TOTALPAGAR NUMERIC(18,2),
    PESOTOT NUMERIC(18,2),
    OBS BLOB SUB_TYPE 1 SEGMENT SIZE 80,
    ITEM INTEGER,
    ARTICULO VARCHAR(15),
    CODBAR VARCHAR(15),
    ARTIDES VARCHAR(60),
    CANT NUMERIC(18,4),
    LOTE VARCHAR(15),
    UNIDAD VARCHAR(8),
    FACTOR NUMERIC(18,4),
    REFITEM VARCHAR(60),
    BODITEM VARCHAR(2),
    PRUNIT NUMERIC(18,2),
    DTOITPORC NUMERIC(9,2),
    DTOITMONTO NUMERIC(18,2),
    PRNETO NUMERIC(18,2),
    PRNETOSINIVA NUMERIC(18,2),
    IVAPORC NUMERIC(9,2),
    IVAITMONTO NUMERIC(18,2),
    CONSUMO NUMERIC(18,2),
    SUBTOTIT NUMERIC(18,2),
    TOTAL NUMERIC(18,2),
    CODIGOCL VARCHAR(20),
    ZONACOD VARCHAR(2),
    ZONANOM VARCHAR(60),
    DV CHAR(1),
    DIRECCION VARCHAR(60),
    CIUDAD VARCHAR(40),
    TELEFONO VARCHAR(40),
    CONTACTO VARCHAR(60),
    FAX VARCHAR(25),
    CEL VARCHAR(25),
    GRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    SUBGRUPO VARCHAR(3),
    NOMSUBG VARCHAR(30),
    MARCA VARCHAR(3),
    NOMMARCA VARCHAR(30),
    PESO NUMERIC(9,4),
    ANCHO NUMERIC(18,4),
    ALTO NUMERIC(18,4),
    LARGO NUMERIC(18,4),
    SUMA1 NUMERIC(18,2),
    SUMA2 NUMERIC(18,2),
    SUMA3 NUMERIC(18,2),
    IVA1 NUMERIC(18,2),
    IVA2 NUMERIC(18,2),
    IVA3 NUMERIC(18,2),
    TOTCONSUMO NUMERIC(18,2),
    SUMAEX NUMERIC(18,2),
    SUMAGR NUMERIC(18,2),
    OBSITEM BLOB SUB_TYPE 1 SEGMENT SIZE 80,
    ALTERNATIVAS NUMERIC(18,4),
    PRINCIPALES NUMERIC(18,4))
AS
DECLARE VARIABLE IMPTOS CHAR(1);
DECLARE VARIABLE TARIFA INTEGER;
declare variable ORDENCOD CHAR(8);
declare variable SUCUR VARCHAR(10);
declare variable PUNTOS NUMERIC(18,4);
declare variable ICOINC CHAR(2);
declare variable FACTCANT NUMERIC(18,4);
declare variable ANULADO CHAR(1);
BEGIN
execute procedure lee_configuracion('FACTURACION', 'ARTICULOS', 'IMPOCONSUMO INCLUIDO EN EL PRECIO BASE DE VENTA ANTES DE IVA') returning_values (icoinc);
SELECT F.PREF_PRE, DEVT_NUMERO, DEVT_FECHA, F.BODE_COD, BODE_NOM, F.TERC_NIT, DEVT_NOMTERC, F.VEND_COD, VEND_NOMBRE, F.PTVT_ID, PTVT_NOM,
    DEVT_FACTURA, DEVT_COMIPORC, DEVT_COMIMONTO, DEVT_IVAINC,
    DEVT_DTOPOR, DEVT_DTOMONTO, DEVT_ADICIONAL, DEVT_IVAMONTO, DEVT_RTFTEPORC, DEVT_RTFTEMONTO, DEVT_RTIVAPORC, DEVT_RTIVAMONTO, DEVT_RTICAPORC, DEVT_RTICAMONTO, DEVT_EXTRA, DEVT_TOTAL,
    TERC_CONTACTO, TERC_FAX, TERC_DV, TERC_CEL, DEVT_OBS, DEVT_SUCURSAL, DEVT_REMISION, DEVT_ANULADO
    FROM DEVOLUCIONES_VENTAS F, BODEGA B, VENDEDORES V, PUNTO_VENTA P, TERCEROS T
    WHERE F.BODE_COD = B.BODE_COD AND F.VEND_COD = V.VEND_COD AND F.PTVT_ID = P.PTVT_ID AND F.TERC_NIT = T.TERC_NIT AND F.DEVT_ID = :ID
    into :PREF, :NUMERO, :FECHA, :CODBODEGA, :NOMBODEGA, :NIT, :NOMTERCERO, :VENDEDOR, :NOMVENDEDOR, :PUNTOVTA, :NOMPUNTOVTA,
    :FACTURA, :COMIPORC, :COMIMONTO, :IMPTOS,
    :DTOPORC, :DTOMONTO, :ADICIONAL, :IVAMONTO, :RTEFTEPORC, :RTEFTEMONTO, :RTEIVAPORC, :RTEIVAMONTO, :RTEICAPORC, :RTEICAMONTO, :EXTRA, :TOTALFAC,
    :CONTACTO, :FAX, :DV, :CEL, :OBS, :SUCUR, :REMISION, :ANULADO;
SUBTOTAL = TOTALFAC - EXTRA - IVAMONTO - ADICIONAL + DTOMONTO;
TOTALPAGAR = TOTALFAC - RTEFTEMONTO - RTEIVAMONTO - RTEICAMONTO;
if (ANULADO = 'N') then
    EXECUTE PROCEDURE acumula_puntos_cliente (33, :id, :nit, :fecha) returning_values (:PUNTOS);
SELECT CLIE_COD, C.ZONA_COD, ZONA_NOM
    FROM CLIENTES C, ZONAS Z
    WHERE TERC_NIT = :NIT AND C.ZONA_COD = Z.ZONA_COD
    INTO :CODIGOCL, :ZONACOD, :ZONANOM;
SELECT CLSU_DIR, CLSU_CIUDAD, CLSU_TEL FROM CLIENTE_SUCURSALES WHERE TERC_NIT = :NIT AND CLCU_COD = :SUCUR
    INTO :DIRECCION, :CIUDAD, :TELEFONO;
    
SUMAEX = 0;
SUMA1 = 0;
SUMA2 = 0;
SUMA3 = 0;
IVA1 = 0;
IVA2 = 0;
IVA3 = 0;
TOTCONSUMO = 0;
ITEM = 0;
EXECUTE PROCEDURE lee_configuracion ('FACTURACION','DOCUMENTOS','ORDENAR ITEMS POR CODIGO DE ARTICULO') returning_values (:ORDENCOD);
if (ORDENCOD = 'SI') then
    BEGIN
    FOR SELECT D.ARTI_COD, DVDE_CODBAR, SUBSTR(DVDE_DESC,1,60), DVDE_CANT, DVDE_UNIDAD, BODE_COD, DVDE_LOTE, DVDE_PRUNIT, DVDE_DTOPORC, DVDE_DTOMONTO, DVDE_IVAPORC, DVDE_IVAMONTO, DVDE_CONSUMO, DVDE_TOTAL, DVDE_REFERENCIA,
        GRUP_COD, SUBG_COD, MARC_COD, ARTI_PESO, ARTI_ANCHO, ARTI_ALTO, ARTI_LARGO, TAIV_COD, DVDE_OBS, DVDE_FACTOR
        FROM DEVOLUCIONES_VENTAS_DETALLE D, ARTICULO A
        WHERE D.ARTI_COD = A.ARTI_COD AND D.DEVT_ID = :ID
        ORDER BY DVDE_CODBAR
        INTO :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :BODITEM, :LOTE, :PRUNIT, :DTOITPORC, :DTOITMONTO, :IVAPORC, :IVAITMONTO, :CONSUMO, :TOTAL, :REFITEM,
        :GRUPO, :SUBGRUPO, :MARCA, :PESO, :ANCHO, :ALTO, :LARGO, :TARIFA, :obsitem, :FACTOR
        DO
        BEGIN
        if (ARTICULO = CODBAR) then
            SELECT FIRST 1 COBA_COD FROM barras_articulo WHERE ARTI_COD = :articulo INTO :CODBAR;
        ITEM = ITEM + 1;
        if (ICOINC = 'SI') then
            SUBTOTIT = TOTAL - IVAITMONTO;
        else
            SUBTOTIT = TOTAL - IVAITMONTO - CONSUMO;
        PRNETO = PRUNIT - DTOITMONTO;
        if (PESO IS NULL) then
            PESO = 0;
        PESO = PESO / 1000 * CANT * FACTOR;
        PESOTOT = PESOTOT + PESO;
        if (IMPTOS = 'S') then
            if (cant <> 0) then
                prnetosiniva = PRUNIT - DTOITMONTO - ((IVAITMONTO+CONSUMO) / CANT);
            else
                prnetosiniva = PRUNIT - DTOITMONTO;
        ELSE
            prnetosiniva = PRUNIT - DTOITMONTO;
        TOTCONSUMO = TOTCONSUMO + CONSUMO;
        if ((REFITEM <> '.t') or (REFITEM IS NULL)) then
            BEGIN
            /* NO SUME LOS ENSAMBLES */
            if (IVAPORC = 0) then
                SUMAEX = SUMAEX + TOTAL;
            if (TARIFA = 1) then
                BEGIN
                SUMA1 = SUMA1 + TOTAL - IVAITMONTO;
                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;
            END
        if (substr(ARTICULO,1,2) = '.t') then
            BEGIN
            REFITEM = '';
            TOTAL = 0;
            END
        factcant = NULL;
        SELECT FIRST 1 UNAR_FACCAN FROM unidad_articulo WHERE ARTI_COD = :articulo INTO :factcant;
        if (factcant IS NULL) then
            factcant = 1;
        if ((factcant = 1) or (factcant = 0)) then
            BEGIN
            ALTERNATIVAS = 0;
            PRINCIPALES = (CANT * FACTOR);
            END
        ELSE
            BEGIN
            ALTERNATIVAS = FLOOR(CANT * factor / factcant);
            PRINCIPALES = (CANT * FACTOR) - (alternativas * factcant);
            END
        SUSPEND;
        END
    END
ELSE
  if (ORDENCOD = 'UNIDAD') then
    BEGIN
    FOR SELECT D.ARTI_COD, DVDE_CODBAR, SUBSTR(DVDE_DESC,1,60), DVDE_CANT, DVDE_UNIDAD, BODE_COD, DVDE_LOTE, DVDE_PRUNIT, DVDE_DTOPORC, DVDE_DTOMONTO, DVDE_IVAPORC, DVDE_IVAMONTO, DVDE_CONSUMO, DVDE_TOTAL, DVDE_REFERENCIA,
        GRUP_COD, SUBG_COD, MARC_COD, ARTI_PESO, ARTI_ANCHO, ARTI_ALTO, ARTI_LARGO, TAIV_COD, DVDE_OBS, DVDE_FACTOR
        FROM DEVOLUCIONES_VENTAS_DETALLE D, ARTICULO A
        WHERE D.ARTI_COD = A.ARTI_COD AND D.DEVT_ID = :ID
        ORDER BY D.dvde_unidad, D.dvde_desc
        INTO :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :BODITEM, :LOTE, :PRUNIT, :DTOITPORC, :DTOITMONTO, :IVAPORC, :IVAITMONTO, :CONSUMO, :TOTAL, :REFITEM,
        :GRUPO, :SUBGRUPO, :MARCA, :PESO, :ANCHO, :ALTO, :LARGO, :TARIFA, :obsitem, :FACTOR
        DO
        BEGIN
        if (ARTICULO = CODBAR) then
            SELECT FIRST 1 COBA_COD FROM barras_articulo WHERE ARTI_COD = :articulo INTO :CODBAR;
        ITEM = ITEM + 1;
        if (ICOINC = 'SI') then
            SUBTOTIT = TOTAL - IVAITMONTO;
        else
            SUBTOTIT = TOTAL - IVAITMONTO - CONSUMO;
        PRNETO = PRUNIT - DTOITMONTO;
        if (PESO IS NULL) then
            PESO = 0;
        PESO = PESO / 1000 * CANT * FACTOR;
        PESOTOT = PESOTOT + PESO;
        if (IMPTOS = 'S') then
            if (cant <> 0) then
                prnetosiniva = PRUNIT - DTOITMONTO - ((IVAITMONTO+CONSUMO) / CANT);
            else
                prnetosiniva = PRUNIT - DTOITMONTO;
        ELSE
            prnetosiniva = PRUNIT - DTOITMONTO;
        TOTCONSUMO = TOTCONSUMO + CONSUMO;
        if ((REFITEM <> '.t') or (REFITEM IS NULL)) then
            BEGIN
            /* NO SUME LOS ENSAMBLES */
            if (IVAPORC = 0) then
                SUMAEX = SUMAEX + TOTAL;
            if (TARIFA = 1) then
                BEGIN
                SUMA1 = SUMA1 + TOTAL - IVAITMONTO;
                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;
            END
        if (substr(ARTICULO,1,2) = '.t') then
            BEGIN
            REFITEM = '';
            TOTAL = 0;
            END
        factcant = NULL;
        SELECT FIRST 1 UNAR_FACCAN FROM unidad_articulo WHERE ARTI_COD = :articulo INTO :factcant;
        if (factcant IS NULL) then
            factcant = 1;
        if ((factcant = 1) or (factcant = 0)) then
            BEGIN
            ALTERNATIVAS = 0;
            PRINCIPALES = (CANT * FACTOR);
            END
        ELSE
            BEGIN
            ALTERNATIVAS = FLOOR(CANT * factor / factcant);
            PRINCIPALES = (CANT * FACTOR) - (alternativas * factcant);
            END
        SUSPEND;
        END
    END
  ELSE
    BEGIN
    FOR SELECT D.ARTI_COD, DVDE_CODBAR, SUBSTR(DVDE_DESC,1,60), DVDE_CANT, DVDE_UNIDAD, BODE_COD, DVDE_LOTE, DVDE_PRUNIT, DVDE_DTOPORC, DVDE_DTOMONTO, DVDE_IVAPORC, DVDE_IVAMONTO, DVDE_CONSUMO, DVDE_TOTAL, DVDE_REFERENCIA,
        GRUP_COD, SUBG_COD, MARC_COD, ARTI_PESO, ARTI_ANCHO, ARTI_ALTO, ARTI_LARGO, TAIV_COD, DVDE_OBS, DVDE_FACTOR
        FROM DEVOLUCIONES_VENTAS_DETALLE D, ARTICULO A
        WHERE D.ARTI_COD = A.ARTI_COD AND D.DEVT_ID = :ID
        ORDER BY DVDE_ITEM
        INTO :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :BODITEM, :LOTE, :PRUNIT, :DTOITPORC, :DTOITMONTO, :IVAPORC, :IVAITMONTO, :CONSUMO, :TOTAL, :REFITEM,
        :GRUPO, :SUBGRUPO, :MARCA, :PESO, :ANCHO, :ALTO, :LARGO, :TARIFA, :obsitem, :FACTOR
        DO
        BEGIN
        if (ARTICULO = CODBAR) then
            SELECT FIRST 1 COBA_COD FROM barras_articulo WHERE ARTI_COD = :articulo INTO :CODBAR;
        SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :GRUPO INTO NOMGRUPO;
        SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :MARCA INTO NOMMARCA;
        SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :SUBGRUPO AND GRUP_COD = :GRUPO INTO :NOMSUBG;
        ITEM = ITEM + 1;
        if (ICOINC = 'SI') then
            SUBTOTIT = TOTAL - IVAITMONTO;
        else
            SUBTOTIT = TOTAL - IVAITMONTO - CONSUMO;
        PRNETO = PRUNIT - DTOITMONTO;
        if (PESO IS NULL) then
            PESO = 0;
        PESO = PESO / 1000 * CANT * FACTOR;
        PESOTOT = PESOTOT + PESO;
        if (IMPTOS = 'S') then
            if (cant <> 0) then
                prnetosiniva = PRUNIT - DTOITMONTO - ((IVAITMONTO+CONSUMO) / CANT);
            else
                prnetosiniva = PRUNIT - DTOITMONTO;
        ELSE
            prnetosiniva = PRUNIT - DTOITMONTO;
        TOTCONSUMO = TOTCONSUMO + CONSUMO;
        if ((REFITEM <> '.t') or (REFITEM IS NULL)) then
            BEGIN
            /* NO SUME LOS ENSAMBLES */
            if (IVAPORC = 0) then
                SUMAEX = SUMAEX + TOTAL;
            if (TARIFA = 1) then
                BEGIN
                SUMA1 = SUMA1 + TOTAL - IVAITMONTO;
                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;
            END
        if (substr(ARTICULO,1,2) = '.t') then
            BEGIN
            REFITEM = '';
            TOTAL = 0;
            END
        factcant = NULL;
        SELECT FIRST 1 UNAR_FACCAN FROM unidad_articulo WHERE ARTI_COD = :articulo INTO :factcant;
        if (factcant IS NULL) then
            factcant = 1;
        if ((factcant = 1) or (factcant = 0)) then
            BEGIN
            ALTERNATIVAS = 0;
            PRINCIPALES = (CANT * FACTOR);
            END
        ELSE
            BEGIN
            ALTERNATIVAS = FLOOR(CANT * factor / factcant);
            PRINCIPALES = (CANT * FACTOR) - (alternativas * factcant);
            END
        SUSPEND;
        END
    END
END

^

SET TERM ; ^

SET TERM ^ ;

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

/* ACUMULE LOS PUNTOS, SE HACE ACA POR SER POSTERIOR AL DETALLE */
if (ANULADO = 'N') then
    EXECUTE PROCEDURE acumula_puntos_cliente (31, :id, :nit, :fecha) returning_values (:PUNTOS);
EXECUTE PROCEDURE consulta_puntos_cliente (:id, :nit, :fecha) returning_values (:puntos, :puntosacum, :puntosvenc, :fecptos);
if (DTOIT1M IS NULL) then
    DTOIT1M = 0;
if (DTOIT2M IS NULL) then
    DTOIT2M = 0;
if (DTOIT3M IS NULL) then
    DTOIT3M = 0;
SELECT CLIE_COD, C.ZONA_COD, ZONA_NOM
    FROM CLIENTES C, ZONAS Z
    WHERE TERC_NIT = :NIT AND C.ZONA_COD = Z.ZONA_COD
    INTO :CODIGOCL, :ZONACOD, :ZONANOM;
SELECT CLSU_DIR, CLSU_CIUDAD, CLSU_TEL FROM CLIENTE_SUCURSALES WHERE TERC_NIT = :NIT AND CLCU_COD = :SUCUR
    INTO :DIRECCION, :CIUDAD, :TELEFONO;
DIASVENCE = VENCE - FECHA;
if (DIASVENCE > 0) then
    CONTCRED = 'CREDITO ' || CAST(DIASVENCE AS VARCHAR(3)) || ' DIAS';
ELSE
    CONTCRED = 'CONTADO';
SUBTOTAL = TOTALFAC - EXTRA - IVAMONTO - ADICIONAL + DTOMONTO;
if (DTOITE3 = 'SI') then
    BEGIN
    SELECT SUM(FADE_DTOMONTO) FROM FACTURAS_DETALLE WHERE FACT_ID = :id INTO :sumdtoit;
    SUBTOTAL = SUBTOTAL + sumdtoit + dtoit1m + dtoit2m + dtoit3m;
    END
if (INGTER <> '') then
    BEGIN
    SELECT SUM(FADE_TOTAL) FROM FACTURAS_DETALLE D, ARTICULO A WHERE A.arti_cod = D.arti_cod AND FACT_ID = :id AND GRUP_COD = :ingter
        INTO :ingterceros;
    INGPROPIOS = SUBTOTAL - INGTERCEROS;
    END
EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'FECHA AUTORETENEDOR NO DESCONTAR RETENCIONES DEL SALDO PERO SI CONTABILIZARLAS') returning_values (AUTORET);
if (AUTORET <> '') then
    FAUTORET = CAST(AUTORET AS DATE);
else
    FAUTORET = '9999/12/31';
if (FECHA > fautoret) then
    TOTALPAGAR = TOTALFAC - RTEIVAMONTO - RTEICAMONTO - ANTICIPO;
ELSE
    TOTALPAGAR = TOTALFAC - RTEFTEMONTO - RTEIVAMONTO - RTEICAMONTO - ANTICIPO;
TOTALNETO = TOTALFAC - ANTICIPO;
if (RECIBIDO <> 0) then
    CAMBIO = RECIBIDO - totalpagar;
ELSE
    CAMBIO = 0;
SUMAEX = 0;
SUMA1 = 0;
SUMA2 = 0;
SUMA3 = 0;
IVA1 = 0;
IVA2 = 0;
IVA3 = 0;
TOTCONSUMO = 0;
MONTOPAGO1 = 0;
PESOTOT = 0;
SELECT MAX(AUDI_HORA) FROM AUDITORIA WHERE TIDO_COD = 31 AND AUDI_IDDOC = :ID AND AUDI_OPER = 'I' INTO :HORA;
/* AHORA LAS FORMAS DE PAGO, BUSQUE EL ABONO DE HOY A LA FACTURA */
ITEMFP = 1;
MONTOPAGO1 = 0;
MONTOPAGO2 = 0;
MONTOPAGO3 = 0;
FOR SELECT FOPA_NOM, RCPA_MONTO FROM RECIBOS_CAJA_PAGO P, FORMAS_PAGO F, RECIBOS_CAJA R, RECIBOS_CAJA_DETALLE D
    WHERE R.RECA_ID = P.RECA_ID AND R.RECA_ID = D.RECA_ID AND P.FOPA_ID = F.FOPA_ID AND RECA_FECHA = :FECHA AND RCDE_TIPODOC = 31 AND RCDE_IDDOC = :ID
    INTO :formap, :MONTOP
    DO
    BEGIN
    if (ITEMFP = 1) then
        BEGIN
        FORMAPAGO1 = FORMAP;
        MONTOPAGO1 = MONTOP;
        END
    if (ITEMFP = 2) then
        BEGIN
        FORMAPAGO2 = FORMAP;
        MONTOPAGO2 = MONTOP;
        END
    if (ITEMFP = 3) then
        BEGIN
        FORMAPAGO3 = FORMAP;
        MONTOPAGO3 = MONTOP;
        END
    ITEMFP = ITEMFP + 1;
    END
EXECUTE PROCEDURE lee_configuracion ('FACTURACION','DOCUMENTOS','ORDENAR ITEMS POR CODIGO DE ARTICULO') returning_values (:ORDENCOD);
EXECUTE PROCEDURE lee_configuracion ('FACTURACION','POS', 'IMPRIMIR DEVOLUCIONES DE ARTICULOS NEGATIVOS') returning_values (:imprdev);
totcajas = 0;
totbase = 0;
if (ORDENCOD = 'SI') then
    BEGIN
    FOR SELECT FADE_ITEM, D.ARTI_COD, FADE_CODBAR, SUBSTR(FADE_DESC,1,60), ARTI_DESCORTA, FADE_CANT, FADE_UNIDAD, FADE_FACTOR, BODE_COD, FADE_LOTE, LIPR_COD, FADE_PRUNIT, FADE_DTOPORC, FADE_DTOMONTO, FADE_IVAPORC, FADE_IVAMONTO, FADE_CONSUMO, FADE_TOTAL, FADE_REFERENCIA,
        GRUP_COD, SUBG_COD, MARC_COD, ARTI_PESO, ARTI_ANCHO, ARTI_ALTO, ARTI_LARGO, TAIV_COD, FADE_DEVUELTO, FADE_OBS, FADE_DTO1, FADE_DTO2, FADE_DTO3, FADE_DTOM1, FADE_DTOM2, FADE_DTOM3, FADE_CAJAS, FADE_BASE, FADE_PORCBASE
        FROM FACTURAS_DETALLE D, ARTICULO A
        WHERE D.ARTI_COD = A.ARTI_COD AND D.FACT_ID = :ID
        ORDER BY D.ARTI_COD
        INTO :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :DESCORTA, :CANT, :UNIDAD, :FACTOR, :BODITEM, :LOTE, :LISTAPR, :PRUNIT, :DTOITPORC, :DTOITMONTO, :IVAPORC, :IVAITMONTO, :CONSUMO, :TOTAL, :refitem,
        :GRUPO, :SUBGRUPO, :MARCA, :PESO, :ANCHO, :ALTO, :LARGO, :TARIFA, :devuelto, :obsitem, :dtoit1, :dtoit2, :dtoit3, :dtoitm1, :dtoitm2, :dtoitm3, :cajas, :base, :porcbase
        DO
          BEGIN
          if (ARTICULO = CODBAR) then
            SELECT FIRST 1 COBA_COD FROM barras_articulo WHERE ARTI_COD = :articulo INTO :CODBAR;
          if (IMPRDEV <> 'SI') then
            BEGIN
            if ((CANT >= 0) AND (DEVUELTO = 0)) then
                IMPR = 'S';
            ELSE
                IMPR = 'N'; /* ES DEVOLUCION */
            END
          ELSE
            IMPR = 'S';
          if (IMPR = 'S') then
            BEGIN
            prneto = PRUNIT - DTOITMONTO - dtoitm1 - dtoitm2 - dtoitm3;
            if (IMPTOS = 'S') then
                if (cant <> 0) then
                    prnetosiniva = PRUNIT - DTOITMONTO - ((IVAITMONTO+CONSUMO) / CANT) - dtoitm1 - dtoitm2 - dtoitm3;
                else
                    prnetosiniva = PRUNIT - DTOITMONTO - dtoitm1 - dtoitm2 - dtoitm3;
            ELSE
                prnetosiniva = PRUNIT - DTOITMONTO - dtoit1m - dtoit2m - dtoit3m;
            if (ICOINC = 'SI') then
                SUBTOTIT = TOTAL - IVAITMONTO;
            else
                SUBTOTIT = TOTAL - IVAITMONTO - CONSUMO;
            TOTCONSUMO = TOTCONSUMO + CONSUMO;
            TOTBASE = TOTBASE + BASE;
            SELECT LOTE_VENCE FROM LOTES WHERE LOTE_NRO = :lote AND ARTI_COD = :ARTICULO AND BODE_COD = :boditem INTO :vlote;
            if ((REFITEM <> '.t') or (REFITEM IS NULL)) then
                BEGIN
                /* NO SUME LOS ENSAMBLES */
                if (IVAPORC = 0) then
                    SUMAEX = SUMAEX + TOTAL;
                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;
                END
            if (ANCHO IS NULL) then
                ANCHO = 0;
            if (ALTO IS NULL) then
                ALTO = 0;
            if (LARGO IS NULL) then
                LARGO = 0;
            if (PESO IS NULL) then
                PESO = 0;
            PESO = (PESO / 1000) * CANT * FACTOR;
            PESOTOT = PESOTOT + PESO;
            totcajas = totcajas + cajas;
            if (substr(ARTICULO,1,2) = '.t') then
                BEGIN
                REFITEM = '';
                TOTAL = 0;
                SUBTOTIT = 0;
                END
            SELECT STAND_COD FROM STANDS WHERE ARTI_COD = :ARTICULO AND STAND_BODEGA = :boditem INTO :stand;
            factcant = NULL;
            SELECT FIRST 1 UNAR_FACCAN FROM unidad_articulo WHERE ARTI_COD = :articulo INTO :factcant;
            if (factcant IS NULL) then
                BEGIN
                ALTERNATIVAS = 0;
                PRINCIPALES = (CANT * FACTOR);
                END
            ELSE
                BEGIN
                ALTERNATIVAS = FLOOR(CANT * factor / factcant);
                PRINCIPALES = (CANT * FACTOR) - (alternativas * factcant);
                END
            SUSPEND;
            END
          END
    END
ELSE
  if (ORDENCOD = 'UNIDAD') then
    BEGIN
    FOR SELECT FADE_ITEM, D.ARTI_COD, FADE_CODBAR, SUBSTR(FADE_DESC,1,60), ARTI_DESCORTA, FADE_CANT, FADE_UNIDAD, FADE_FACTOR, BODE_COD, FADE_LOTE, LIPR_COD, FADE_PRUNIT, FADE_DTOPORC, FADE_DTOMONTO, FADE_IVAPORC, FADE_IVAMONTO, FADE_CONSUMO, FADE_TOTAL, FADE_REFERENCIA,
        GRUP_COD, SUBG_COD, MARC_COD, ARTI_PESO, ARTI_ANCHO, ARTI_ALTO, ARTI_LARGO, TAIV_COD, FADE_DEVUELTO, FADE_OBS, FADE_DTO1, FADE_DTO2, FADE_DTO3, FADE_DTOM1, FADE_DTOM2, FADE_DTOM3, FADE_CAJAS, FADE_BASE, FADE_PORCBASE
        FROM FACTURAS_DETALLE D, ARTICULO A
        WHERE D.ARTI_COD = A.ARTI_COD AND D.FACT_ID = :ID
        ORDER BY D.fade_unidad, D.fade_desc
        INTO :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :DESCORTA, :CANT, :UNIDAD, :FACTOR, :BODITEM, :LOTE, :LISTAPR, :PRUNIT, :DTOITPORC, :DTOITMONTO, :IVAPORC, :IVAITMONTO, :CONSUMO, :TOTAL, :refitem,
        :GRUPO, :SUBGRUPO, :MARCA, :PESO, :ANCHO, :ALTO, :LARGO, :TARIFA, :devuelto, :obsitem, :dtoit1, :dtoit2, :dtoit3, :dtoitm1, :dtoitm2, :dtoitm3, :cajas, :base, :porcbase
        DO
          BEGIN
          if (ARTICULO = CODBAR) then
            SELECT FIRST 1 COBA_COD FROM barras_articulo WHERE ARTI_COD = :articulo INTO :CODBAR;
          if (IMPRDEV <> 'SI') then
            BEGIN
            if ((CANT >= 0) AND (DEVUELTO = 0)) then
                IMPR = 'S';
            ELSE
                IMPR = 'N'; /* ES DEVOLUCION */
            END
          ELSE
            IMPR = 'S';
          if (IMPR = 'S') then
            BEGIN
            prneto = PRUNIT - DTOITMONTO - dtoitm1 - dtoitm2 - dtoitm3;
            if (IMPTOS = 'S') then
                if (cant <> 0) then
                    prnetosiniva = PRUNIT - DTOITMONTO - ((IVAITMONTO+CONSUMO) / CANT) - dtoitm1 - dtoitm2 - dtoitm3;
                else
                    prnetosiniva = PRUNIT - DTOITMONTO - dtoitm1 - dtoitm2 - dtoitm3;
            ELSE
                prnetosiniva = PRUNIT - DTOITMONTO - dtoit1m - dtoit2m - dtoit3m;
            if (ICOINC = 'SI') then
                SUBTOTIT = TOTAL - IVAITMONTO;
            else
                SUBTOTIT = TOTAL - IVAITMONTO - CONSUMO;
            TOTCONSUMO = TOTCONSUMO + CONSUMO;
            TOTBASE = TOTBASE + BASE;
            SELECT LOTE_VENCE FROM LOTES WHERE LOTE_NRO = :lote AND ARTI_COD = :ARTICULO AND BODE_COD = :boditem INTO :vlote;
            if ((REFITEM <> '.t') or (REFITEM IS NULL)) then
                BEGIN
                /* NO SUME LOS ENSAMBLES */
                if (IVAPORC = 0) then
                    SUMAEX = SUMAEX + TOTAL;
                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;
                END
            if (ANCHO IS NULL) then
                ANCHO = 0;
            if (ALTO IS NULL) then
                ALTO = 0;
            if (LARGO IS NULL) then
                LARGO = 0;
            if (PESO IS NULL) then
                PESO = 0;
            PESO = (PESO / 1000) * CANT * FACTOR;
            PESOTOT = PESOTOT + PESO;
            totcajas = totcajas + cajas;
            if (substr(ARTICULO,1,2) = '.t') then
                BEGIN
                REFITEM = '';
                TOTAL = 0;
                SUBTOTIT = 0;
                END
            SELECT STAND_COD FROM STANDS WHERE ARTI_COD = :ARTICULO AND STAND_BODEGA = :boditem INTO :stand;
            factcant = NULL;
            SELECT FIRST 1 UNAR_FACCAN FROM unidad_articulo WHERE ARTI_COD = :articulo INTO :factcant;
            if ((factcant IS NULL) or (factcant = 0)) then
                BEGIN
                ALTERNATIVAS = 0;
                PRINCIPALES = (CANT * FACTOR);
                END
            ELSE
                BEGIN
                ALTERNATIVAS = FLOOR(CANT * factor / factcant);
                PRINCIPALES = (CANT * FACTOR) - (alternativas * factcant);
                END
            SUSPEND;
            END
          END
    END
  ELSE
    BEGIN
    FOR SELECT FADE_ITEM, D.ARTI_COD, FADE_CODBAR, SUBSTR(FADE_DESC,1,60), ARTI_DESCORTA, FADE_CANT, FADE_UNIDAD, FADE_FACTOR, BODE_COD, FADE_LOTE, LIPR_COD, FADE_PRUNIT, FADE_DTOPORC, FADE_DTOMONTO, FADE_IVAPORC, FADE_IVAMONTO, FADE_CONSUMO, FADE_TOTAL, FADE_REFERENCIA,
        GRUP_COD, SUBG_COD, MARC_COD, ARTI_PESO, ARTI_ANCHO, ARTI_ALTO, ARTI_LARGO, TAIV_COD, FADE_DEVUELTO, FADE_OBS, FADE_DTO1, FADE_DTO2, FADE_DTO3, FADE_DTOM1, FADE_DTOM2, FADE_DTOM3, FADE_CAJAS, FADE_BASE, FADE_PORCBASE
        FROM FACTURAS_DETALLE D, ARTICULO A
        WHERE D.ARTI_COD = A.ARTI_COD AND D.FACT_ID = :ID
        ORDER BY FADE_ITEM
        INTO :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :DESCORTA, :CANT, :UNIDAD, :FACTOR, :BODITEM, :LOTE, :LISTAPR, :PRUNIT, :DTOITPORC, :DTOITMONTO, :IVAPORC, :IVAITMONTO, :CONSUMO, :TOTAL, :refitem,
        :GRUPO, :SUBGRUPO, :MARCA, :PESO, :ANCHO, :ALTO, :LARGO, :TARIFA, :devuelto, :obsitem, :dtoit1, :dtoit2, :dtoit3, :dtoitm1, :dtoitm2, :dtoitm3, :cajas, :base, :porcbase
        DO
          BEGIN
          if (IMPRDEV <> 'SI') then
            BEGIN
            if ((CANT >= 0) AND (DEVUELTO = 0)) then
                IMPR = 'S';
            ELSE
                IMPR = 'N'; /* ES DEVOLUCION */
            END
          ELSE
            IMPR = 'S';
          if (IMPR = 'S') then
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :GRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :MARCA INTO NOMMARCA;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :SUBGRUPO AND GRUP_COD = :GRUPO INTO :NOMSUBG;
            prneto = PRUNIT - DTOITMONTO - dtoitm1 - dtoitm2 - dtoitm3;
            if (IMPTOS = 'S') then
                if (cant <> 0) then
                    prnetosiniva = PRUNIT - DTOITMONTO - ((IVAITMONTO+CONSUMO) / CANT) - dtoit1m - dtoit2m - dtoit3m;
                else
                    prnetosiniva = PRUNIT - DTOITMONTO - dtoitm1 - dtoitm2 - dtoitm3;
            ELSE
                prnetosiniva = PRUNIT - DTOITMONTO - dtoitm1 - dtoitm2 - dtoitm3;
            if (ICOINC = 'SI') then
                SUBTOTIT = TOTAL - IVAITMONTO;
            else
                SUBTOTIT = TOTAL - IVAITMONTO - CONSUMO;
            TOTCONSUMO = TOTCONSUMO + CONSUMO;
            TOTBASE = TOTBASE + BASE;
            SELECT LOTE_VENCE FROM LOTES WHERE LOTE_NRO = :lote AND ARTI_COD = :ARTICULO AND BODE_COD = :boditem INTO :vlote;
            if ((REFITEM <> '.t') or (REFITEM IS NULL)) then
                BEGIN
                /* NO SUME LOS ENSAMBLES */
                if (IVAPORC = 0) then
                    SUMAEX = SUMAEX + TOTAL;
                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;
                END
            if (ANCHO IS NULL) then
                ANCHO = 0;
            if (ALTO IS NULL) then
                ALTO = 0;
            if (LARGO IS NULL) then
                LARGO = 0;
            if (PESO IS NULL) then
                PESO = 0;
            PESO = (PESO / 1000)* CANT * FACTOR;
            PESOTOT = PESOTOT + PESO;
            totcajas = totcajas + cajas;
            if (substr(ARTICULO,1,2) = '.t') then
                BEGIN
                REFITEM = '';
                TOTAL = 0;
                SUBTOTIT = 0;
                END
            SELECT STAND_COD FROM STANDS WHERE ARTI_COD = :ARTICULO AND STAND_BODEGA = :boditem INTO :stand;
            factcant = NULL;
            SELECT FIRST 1 UNAR_FACCAN FROM unidad_articulo WHERE ARTI_COD = :articulo INTO :factcant;
            if ((factcant IS NULL) or (factcant = 0)) then
                BEGIN
                ALTERNATIVAS = 0;
                PRINCIPALES = (CANT * FACTOR);
                END
            ELSE
                BEGIN
                ALTERNATIVAS = FLOOR(CANT * factor / factcant);
                PRINCIPALES = (CANT * FACTOR) - (alternativas * factcant);
                END
            SUSPEND;
            END
          END
    END
END

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE RECALCULA_PUNTOS_CLIENTE(
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    NIT VARCHAR(20),
    ID INTEGER,
    FECHA DATE,
    PUNTOS NUMERIC(18,2))
AS
begin
FOR SELECT FACT_ID, TERC_NIT, FACT_FECHA FROM FACTURAS
    WHERE FACT_FECHA >= :FECINI AND FACT_FECHA <= :fecfin AND FACT_ANULADO = 'N'
    ORDER BY FACT_ID
    INTO :ID, :nit, :fecha
  DO
  BEGIN
  EXECUTE PROCEDURE acumula_puntos_cliente (31, :id, :nit, :fecha) returning_values (:PUNTOS);
  SUSPEND;
  END
end

^

SET TERM ; ^

/* 20091118b */
/* EXCLUIR CLIENTE DE CONTADO OPCIONAL */

SET TERM ^ ;

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

SET TERM ; ^

/* 20091118c */

INSERT INTO CONFIGURACION (CONF_MODULO, CONF_CATEGORIA, CONF_PROPIEDAD, CONF_VALOR, CONF_POSIBLES, CONF_AYUDA) VALUES ('CRM', 'PROSPECTOS', 'NUMERAR REGISTROS EN BUSQUEDA DE PROSPECTOS', 'NO', 'SI,NO', 'Agrega una columna inicial para el número de registro en la búsqueda de prospectos que sirve para numerarlos');
commit work;


/* 20091119 */
/* INTERFAZ POR DOCUMENTO BUSCA LA CUENTA POR PAGAR SEGUN DB/CR Y TIPO DE DOCUMENTO */

SET TERM ^ ;

CREATE OR ALTER procedure CONTABIL_EGRESO (
    IDDOC integer,
    IDINTER integer)
returns (
    ERROR integer,
    VER char(1),
    IDC integer)
AS
declare variable PREF VARCHAR(4);
declare variable NUM VARCHAR(6);
declare variable FECAUX DATE;
declare variable FECHA CHAR(8);
declare variable CONC CHAR(120);
declare variable VRDTO NUMERIC(18, 2);
declare variable VRRTFTE NUMERIC(18, 2);
declare variable VRRTIVA NUMERIC(18, 2);
declare variable VRRTICA NUMERIC(18, 2);
declare variable VRTOTAL NUMERIC(18, 2);
declare variable TIPOCOMP VARCHAR(3);
declare variable PREFCONT VARCHAR(4);
declare variable BASE CHAR(1);
declare variable CTABASE VARCHAR(20);
declare variable CAJA CHAR(1);
declare variable CTACAJA VARCHAR(20);
declare variable RTFTE CHAR(1);
declare variable CTARTFTE VARCHAR(20);
declare variable RTIVA CHAR(1);
declare variable CTARTIVA VARCHAR(20);
declare variable RTICA CHAR(1);
declare variable CTARTICA VARCHAR(20);
declare variable DTO CHAR(1);
declare variable CTADTO VARCHAR(20);
declare variable EXISTE CHAR(1);
declare variable CUENTA VARCHAR(20);
declare variable MONTO NUMERIC(18,2);
declare variable ES_RETENCION CHAR(1);
declare variable TIPOCUEN CHAR(1);
declare variable NIT VARCHAR(20);
declare variable PROY VARCHAR(4);
declare variable CENTRO VARCHAR(4);
declare variable MONTOBASE NUMERIC(18,2);
declare variable PORC NUMERIC(9,2);
declare variable DEBITO NUMERIC(18,2);
declare variable CREDITO NUMERIC(18,2);
declare variable NROI INTEGER;
declare variable SUMA NUMERIC(18,2);
declare variable TCTACLIEN VARCHAR(20);
declare variable TCTARTFTE VARCHAR(20);
declare variable TCTARTIVA VARCHAR(20);
declare variable TCTARTICA VARCHAR(20);
declare variable TCTACART VARCHAR(20);
declare variable TIPOIT INTEGER;
declare variable IDIT INTEGER;
declare variable PREFIT VARCHAR(4);
declare variable NUMIT VARCHAR(6);
declare variable NUMEROIT VARCHAR(10);
declare variable ABONOIT NUMERIC(18,2);
declare variable CTADIC VARCHAR(20);
declare variable BASEADIC VARCHAR(20);
declare variable PORCADIC NUMERIC(5,2);
declare variable VALORADIC NUMERIC(18,2);
declare variable DBADIC CHAR(1);
declare variable VRBASE NUMERIC(18,2);
declare variable GMF CHAR(1);
declare variable CODBCO INTEGER;
declare variable NUMCHEQ VARCHAR(20);
declare variable CRUCES NUMERIC(18,2);
declare variable VRCAJA NUMERIC(18,2);
declare variable OK INTEGER;
declare variable DIFCAMBIO NUMERIC(18,2);
declare variable CTADIF VARCHAR(20);
declare variable RTFTEC NUMERIC(18,2);
declare variable RTIVAC NUMERIC(18,2);
declare variable RTICAC NUMERIC(18,2);
declare variable RTFTER CHAR(1);
declare variable CTARTFTER VARCHAR(20);
declare variable RTIVAR CHAR(1);
declare variable CTARTIVAR VARCHAR(20);
declare variable RTICAR CHAR(1);
declare variable CTARTICAR VARCHAR(20);
declare variable RET CHAR(2);
declare variable RTIT NUMERIC(18,2);
declare variable NITBCO VARCHAR(20);
BEGIN
/* BUSQUE LA INTERFACE */
EXISTE = 'N';
SELECT 'S', TICO_COD, PRCO_PRE, INCJ_BASE, INCJ_DTOPP, INCJ_RTFTE, INCJ_RTIVA, INCJ_RTICA, INCJ_CAJA, INCJ_CTABASE, INCJ_CTADTO, INCJ_CTARTFTE, INCJ_CTARTIVA, INCJ_CTARTICA, INCJ_CTACAJA, INCJ_CONFIRMAR
    FROM INTERFAZ_CAJA
    WHERE INCJ_ID = :IDINTER
    INTO :EXISTE, :TIPOCOMP, :PREFCONT, :BASE, :DTO, :RTFTE, :RTIVA, :RTICA, :CAJA, :CTABASE, :CTADTO, :CTARTFTE, :CTARTIVA, :CTARTICA, :CTACAJA, :VER;
if (EXISTE = 'S') then
    BEGIN
    OK = 0;
    FOR SELECT CNTB_ID FROM CONTABILIZACION WHERE CNTB_TIPOREF = 62 AND CNTB_IDREF = :IDDOC INTO :OK DO
        BEGIN
        DELETE FROM CONTABILIZACION_DET WHERE CNTB_ID = :OK;
        DELETE FROM CONTABILIZACION WHERE CNTB_ID = :OK;
        END

    /* TRAIGA EL ENCABEZADO DEL EGRESO */
    SELECT PREF_PRE, EGRE_NUMERO, EGRE_FECHA, E.TERC_NIT, EGRE_CONC, EGRE_DTOF, EGRE_MONTO, EGRE_RTFTEMONTO, EGRE_RTIVAMONTO, EGRE_RTICAMONTO, TERC_CTARTFTE, TERC_CTARTIVA, TERC_CTARTICA, TERC_CTACLIENTE
        FROM EGRESOS E, TERCEROS T
        WHERE EGRE_ID = :IDDOC AND E.TERC_NIT = T.TERC_NIT
        INTO :PREF, :NUM, :FECAUX, :NIT, :CONC, :VRDTO, :VRTOTAL, :VRRTFTE, :VRRTIVA, :VRRTICA, :TCTARTFTE, TCTARTIVA, TCTARTICA, TCTACLIEN;
    /* SI ES PROVEEDOR, SOBREESCIBE LAS CUENTAS  */
    SELECT PROV_CTAPAGAR, PROV_CTARTFTE, PROV_CTARTIVA, PROV_CTARTICA
        FROM PROVEEDORES WHERE TERC_NIT = :NIT
        INTO TCTACLIEN, TCTARTFTE, TCTARTIVA, TCTARTICA;
    SELECT PREF_CENTRO, PREF_PROY FROM PREFIJOS
        WHERE PREF_PRE = :PREF AND TIDO_COD = 62 INTO :CENTRO, :PROY;
    EXECUTE PROCEDURE FECHA_A_CONTA(:FECAUX) returning_values (:FECHA);
    /* REGISTRE EL ENCABEZADO CONTABLE */
    IDC = GEN_ID(ID_CONTABILIZA, 1);
    INSERT INTO CONTABILIZACION (CNTB_ID, CNTB_TIPOCOMP, CNTB_PREFCNT, CNTB_NUMERO, CNTB_FECHA, CNTB_CONCEPTO, CNTB_REF, CNTB_TIPOREF, CNTB_IDREF, CNTB_PREFREF, CNTB_NUMREF, CNTB_PROCESADO)
        VALUES (:IDC, :TIPOCOMP, :PREFCONT, :NUM, :FECHA, :CONC, '', 62, :IDDOC, :PREF, :NUM, 'N');
    /* SUME LOS CRUCES PARA LLEVARLOS A LA CUENTA X PAGAR Y RESTAR DE LA CAJA */
    SELECT SUM(EGCC_ABONO) FROM EGRESOS_CRUCEC WHERE EGRE_ID = :iddoc INTO :CRUCES;
    if (CRUCES IS NULL) then
        CRUCES = 0;
    VRCAJA = VRTOTAL;
    NROI = 0;
    SUMA = 0;
    ERROR = 0;
    /* EL CREDITO EN LA CAJA O EL BANCO */
    IF ((CAJA = 'K')) THEN
        BEGIN
        if (VRCAJA <> 0) then
            BEGIN
            CUENTA = NULL;
            EXECUTE PROCEDURE VALIDE_CUENTA_C (CTACAJA) RETURNING_VALUES (:OK);
            IF (OK = 0) THEN
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :CTACAJA INTO :CUENTA, :TIPOCUEN;
            ELSE
                begin
                EXECUTE PROCEDURE ERROR (62, :IDDOC, :CTACAJA, 2);
                CUENTA = CTACAJA;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 4);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRCAJA, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - VRCAJA;
                END
            END /* VRCAJA <> 0 */
        END /* CAJA CONSTANTE */
    IF ((CAJA = 'F')) THEN
        BEGIN
        /* mueva la cuenta de la caja o el banco o ambas */
        /* PRIMERO LA CAJA */
        FOR SELECT CAJA_CUENTA, EGCA_MONTO FROM EGRESOS_CAJA E, CAJAS C
            WHERE C.CAJA_ID = E.CAJA_ID AND EGRE_ID = :IDDOC
            INTO :CTACAJA, :MONTO
            DO
            BEGIN
            if (MONTO <> 0) then
                BEGIN
                CUENTA = NULL;
                EXECUTE PROCEDURE VALIDE_CUENTA_C (CTACAJA) RETURNING_VALUES (:OK);
                IF (OK = 0) THEN
                    SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                        WHERE CUEN_COD = :CTACAJA INTO :CUENTA, :TIPOCUEN;
                ELSE
                    begin
                    EXECUTE PROCEDURE ERROR (62, :IDDOC, :CTACAJA, 2);
                    CUENTA = CTACAJA;
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 4);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA - MONTO;
                    END
                END /* MONTO <> 0 */
            END /* DO CAJA */
        /* AHORA EL BANCO */
        MONTO = 0;
        SELECT CUBA_CTACONTA, EGBC_MONTO, EGBC_GMF, E.CUBA_COD, CUBA_GMFPOR, EGBC_NUMERO, BANC_NIT
            FROM EGRESOS_BANCO E, CUENTAS_BANCO C, BANCOS B
            WHERE E.CUBA_COD = C.CUBA_COD AND EGRE_ID = :IDDOC AND B.banc_cod = C.banc_cod
            INTO :CTACAJA, :MONTO, :GMF, :CODBCO, :PORC, :NUMCHEQ, :nitbco;
        if (MONTO <> 0) then
            BEGIN
            if (MONTO <> 0) then
                BEGIN
                CUENTA = NULL;
                EXECUTE PROCEDURE VALIDE_CUENTA_C (CTACAJA) RETURNING_VALUES (:OK);
                IF (OK = 0) THEN
                    SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                        WHERE CUEN_COD = :CTACAJA INTO :CUENTA, :TIPOCUEN;
                ELSE
                    begin
                    EXECUTE PROCEDURE ERROR (62, :IDDOC, :CTACAJA, 2);
                    CUENTA = CTACAJA;
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 4);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, :NUMCHEQ, 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA - MONTO;
                    END
                /* EL GMF */
                if ((GMF = 'S') AND (PORC <> 0)) then
                    BEGIN
                    if (NITBCO IS NULL) then
                        NITBCO = NIT;
                    EXECUTE procedure REDONDEE(:MONTO * :PORC / 1000, 0) returning_values (MONTO);
                    /* REGISTRE EL GMF EN LA MISMA CUENTA DEL BANCO COMO CREDITO */
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, :NUMCHEQ, 0, :MONTO, 0, 0, :NITBCO, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA - MONTO;

                    /* AHORA LA CUENTA DEL GASTO */
                    SELECT CUBA_CTAGMF FROM CUENTAS_BANCO
                        where CUBA_COD = :CODBCO INTO :CTACAJA;
                    EXECUTE PROCEDURE VALIDE_CUENTA_C (CTACAJA) RETURNING_VALUES (:OK);
                    IF (OK = 0) THEN
                        SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                            WHERE CUEN_COD = :CTACAJA INTO :CUENTA, :TIPOCUEN;
                    ELSE
                        begin
                        EXECUTE PROCEDURE ERROR (62, :IDDOC, :CTACAJA, 2);
                        CUENTA = CTACAJA;
                        TIPOCUEN = 'N';
                        ERROR = ERROR + 1;
                        end
                    if (TIPOCUEN = 'I') then
                        BEGIN
                        EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
                        TIPOCUEN = 'N';
                        ERROR = ERROR + 1;
                        END
                    if (TIPOCUEN = 'C') then
                        BEGIN
                        EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 4);
                        TIPOCUEN = 'N';
                        ERROR = ERROR + 1;
                        END
                    if (TIPOCUEN = 'N') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, :NUMCHEQ, :MONTO, 0, 0, 0, :NITBCO, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NROI = NROI + 1;
                        SUMA = SUMA + MONTO;
                        END
                    END /* GMF */
                END /* MONTO <> 0 */
            END /* EGRESO_BANCO */
        END /* CAJA = F */

    /* LOS CRUCES CON CUENTAS X COBRAR */
    if (CRUCES <> 0) then
        BEGIN
        SELECT TERC_CTACLIENTE FROM TERCEROS WHERE TERC_NIT = :nit INTO :tctacart;
        if (tctacart IS NULL) then
            tctacart = tctaclien;
        CUENTA = NULL;
        EXECUTE PROCEDURE VALIDE_CUENTA_C (tctacart) RETURNING_VALUES (:OK);
        IF (OK = 0) THEN
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :tctacart INTO :CUENTA, :TIPOCUEN;
        ELSE
            begin
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :tctacart, 2);
            CUENTA = tctacart;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            /* DEBERIA RECORRER DOCUMENTO POR DOCUMENTO */
            FOR SELECT EGCC_TIPODOC, EGCC_PREFIJO, EGCC_NUMERO, EGCC_ABONO+EGCC_RTFTE+EGCC_RTIVA+EGCC_RTICA+EGCC_DTOF
                FROM egresos_crucec WHERE EGRE_ID = :IDDOC
                INTO :TIPOIT, PREFIT, NUMIT, ABONOIT
                DO
                BEGIN
                NUMEROIT = PREFIT || NUMIT;
                if (ABONOIT > 0) then
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :ABONOIT, 0, 0, :NIT, :PROY, :CENTRO, NULL, :NUMEROIT, NULL, NULL, :TIPOIT, 0);
                else
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', abs(:ABONOIT), 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, :NUMEROIT, NULL, NULL, :TIPOIT, 0);
                SUMA = SUMA - ABONOIT;
                NROI = NROI + 1;
                END
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            if (CRUCES > 0) then
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :CRUCES, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            else
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', abs(:CRUCES), 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            SUMA = SUMA - CRUCES;
            NROI = NROI + 1;
            END
        /* LA DIFERENCIA EN CAMBIO */
        SELECT SUM(EGCC_DIFCAMBIO) FROM egresos_crucec WHERE EGRE_ID = :iddoc INTO :DIFCAMBIO;
        IF ((DIFCAMBIO IS NOT NULL) AND (DIFCAMBIO <> 0)) THEN
            BEGIN
            if (DIFCAMBIO > 0) then
                execute procedure lee_configuracion('GENERAL','GENERAL','CUENTA DE INGRESO POR DIFERENCIA EN CAMBIO PARA OPERACIONES EN OTRA MONEDA') returning_values (:ctadif);
            else
                execute procedure lee_configuracion('GENERAL','GENERAL','CUENTA DE GASTO POR DIFERENCIA EN CAMBIO PARA OPERACIONES EN OTRA MONEDA') returning_values (:ctadif);
            CUENTA = NULL;
            EXECUTE PROCEDURE VALIDE_CUENTA_C (ctadif) RETURNING_VALUES (:OK);
            IF (OK = 0) THEN
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :ctadif INTO :CUENTA, :TIPOCUEN;
            ELSE
                begin
                EXECUTE PROCEDURE ERROR (62, :IDDOC, :ctadif, 2);
                CUENTA = ctadif;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 4);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                if (DIFCAMBIO > 0) then
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :difcambio, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                else
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', ABS(:difcambio), 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - difcambio;
                END
            END
        /* RETEFUENTE DEL CRUCE */
        SELECT first 1 INCJ_RTFTE, INCJ_RTIVA, INCJ_RTICA, INCJ_CTARTFTE, INCJ_CTARTIVA, INCJ_CTARTICA
            FROM INTERFAZ_CAJA WHERE tido_cod = 61 into :RTFTER, :RTIVAR, :RTICAR, :CTARTFTER, :CTARTIVAR, :CTARTICAR;
        SELECT SUM(EGCC_RTFTE) FROM egresos_crucec WHERE EGRE_ID = :iddoc INTO :rtftec;
        IF ((rtftec IS NOT NULL) AND (rtftec <> 0)) THEN
            BEGIN
            if ((RTFTER = 'T') or (RTFTER = 'K')) then
                BEGIN
                if (RTFTER = 'T') then
                    SELECT TERC_CTARTFTE FROM TERCEROS WHERE TERC_NIT = :NIT INTO CTARTFTER;
                CUENTA = NULL;
                EXECUTE PROCEDURE VALIDE_CUENTA_C (ctartfter) RETURNING_VALUES (:OK);
                IF (OK = 0) THEN
                    SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                        WHERE CUEN_COD = :ctartfter INTO :CUENTA, :TIPOCUEN;
                ELSE
                    begin
                    EXECUTE PROCEDURE ERROR (62, :IDDOC, :ctartfter, 2);
                    CUENTA = ctartfter;
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 4);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    if (rtftec > 0) then
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :rtftec, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    else
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, abs(:rtftec), 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA + rtftec;
                    END
                END
            END
        /* RETEIVA DEL CRUCE */
        SELECT SUM(EGCC_RTIVA) FROM egresos_crucec WHERE EGRE_ID = :iddoc INTO :rtivac;
        IF ((rtivac IS NOT NULL) AND (rtivac <> 0)) THEN
            BEGIN
            if ((RTIVAR = 'T') or (RTIVAR = 'K')) then
                BEGIN
                if (RTIVAR = 'T') then
                    SELECT TERC_CTARTIVA FROM TERCEROS WHERE TERC_NIT = :NIT INTO CTARTIVAR;
                CUENTA = NULL;
                EXECUTE PROCEDURE VALIDE_CUENTA_C (ctartivar) RETURNING_VALUES (:OK);
                IF (OK = 0) THEN
                    SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                        WHERE CUEN_COD = :ctartivar INTO :CUENTA, :TIPOCUEN;
                ELSE
                    begin
                    EXECUTE PROCEDURE ERROR (62, :IDDOC, :ctartivar, 2);
                    CUENTA = ctartivar;
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 4);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    if (rtivac > 0) then
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :rtivac, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    else
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, abs(:rtivac), 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA + rtivac;
                    END
                END
            END
        /* RETEICA DEL CRUCE */
        SELECT SUM(EGCC_RTICA) FROM egresos_crucec WHERE EGRE_ID = :iddoc INTO :rticac;
        IF ((rticac IS NOT NULL) AND (rtivac <> 0)) THEN
            BEGIN
            if ((RTICAR = 'T') or (RTICAR = 'K')) then
                BEGIN
                if (RTICAR = 'T') then
                    SELECT TERC_CTARTICA FROM TERCEROS WHERE TERC_NIT = :NIT INTO CTARTICAR;
                CUENTA = NULL;
                EXECUTE PROCEDURE VALIDE_CUENTA_C (ctarticar) RETURNING_VALUES (:OK);
                IF (OK = 0) THEN
                    SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                        WHERE CUEN_COD = :ctarticar INTO :CUENTA, :TIPOCUEN;
                ELSE
                    begin
                    EXECUTE PROCEDURE ERROR (62, :IDDOC, :ctarticar, 2);
                    CUENTA = ctarticar;
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 4);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    if (rticac > 0) then
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :rticac, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    else
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, abs(:rticac), 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA + rticac;
                    END
                END
            END
        END /* cruces */

    if (DTO = 'K') then /* DTO EN CTA CONSTANTE */
        BEGIN
        if (VRDTO <> 0) then
            BEGIN
            CUENTA = NULL;
            EXECUTE PROCEDURE VALIDE_CUENTA_C (CTADTO) RETURNING_VALUES (:OK);
            IF (OK = 0) THEN
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :CTADTO INTO :CUENTA, :TIPOCUEN;
            ELSE
                begin
                EXECUTE PROCEDURE ERROR (62, :IDDOC, :CTADTO, 2);
                CUENTA = CTADTO;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 4);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRDTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - VRDTO;
                END
            END /* VRDTO <> 0 */
        END /* DTO EN CTA CONSTANTE */

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

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE EGRESOS_SIN_CONTABILIDAD(
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    ID INTEGER,
    IDI INTEGER,
    IDC INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    ESTADO VARCHAR(20),
    ERROR INTEGER)
AS
DECLARE VARIABLE VER CHAR(2);
declare variable FECICNT VARCHAR(10);
declare variable FECFCNT VARCHAR(10);
declare variable idref INTEGER;
BEGIN
EXECUTE PROCEDURE fecha_a_conta(FECINI) returning_values (FECICNT);
EXECUTE PROCEDURE fecha_a_conta(FECFIN) returning_values (FECFCNT);
FOR SELECT EGRE_ID, PREF_PRE, egre_numero FROM EGRESOS WHERE EGRE_ANULADO = 'N' AND PREF_PRE <> 'R004' AND
    EGRE_FECHA >= :FECINI AND EGRE_FECHA <= :FECFIN ORDER BY EGRE_ID INTO :ID, :PREF, :NUMERO
DO
  BEGIN
  idref = null;
  SELECT ENCO_IDREF FROM COMPROBANTE_ENCABEZADO WHERE ENCO_TIPOREF = 62 AND ENCO_FECHA >= :FECICNT AND ENCO_FECHA <= :FECFCNT and ENCO_IDREF = :ID into :idref;
  if (idref IS NULL) then
  begin
   ESTADO = 'PROCESANDO';
   SUSPEND;
   SELECT MAX(INCJ_ID) FROM INTERFAZ_CAJA WHERE PREF_PRE = :PREF AND TIDO_COD = 62 INTO :IDI;
   EXECUTE PROCEDURE CONTABIL_EGRESO (:ID, :IDI) RETURNING_VALUES (:ERROR, :VER, :IDC);
   IF (ERROR = 0) THEN
      BEGIN
      EXECUTE PROCEDURE CONTABILIZA_PENDIENTE (:IDC);
      ESTADO = 'OK';
      END
   ELSE
    ESTADO = 'ERROR';
   suspend;
  end
  END
END

^

SET TERM ; ^


/* 20091119b */

INSERT INTO CONFIGURACION (CONF_MODULO, CONF_CATEGORIA, CONF_PROPIEDAD, CONF_VALOR, CONF_POSIBLES, CONF_AYUDA) VALUES ('CRM', 'PROSPECTOS', 'DETERMINAR COLOR DEL PROSPECTO POR ESTADO O POR RESPUESTA A EVENTO', 'ESTADO', 'ESTADO,EVENTO', NULL);
COMMIT WORK;

ALTER TABLE CRM_EVENTO_RESPUESTA
ADD CRER_COLOR VARCHAR(30);


/* 20091120 */
/* PROMEDIO SALIDAS NO TOMABA SALIDAS SI ESTABA CALCULADO EL PROMEDIO */

SET TERM ^ ;

CREATE OR ALTER procedure PROMEDIO_SALIDAS_ARTICULO (
    ARTICULO varchar(15),
    FECHA date,
    BODEGA varchar(2))
returns (
    PROMEDIO numeric(18,4),
    SALIDAS numeric(18,4))
AS
declare variable FECINI DATE;
declare variable DIASC VARCHAR(255);
declare variable DIAS INTEGER;
declare variable DIA_ART VARCHAR(2) CHARACTER SET NONE;
declare variable INCSALI VARCHAR(2);
declare variable SININV VARCHAR(2);
declare variable saldo numeric(18,2);
BEGIN
EXECUTE PROCEDURE lee_configuracion ('INVENTARIO', 'EXISTENCIAS', 'INCLUIR SALIDAS POR CONCEPTOS DIFERENTES A VENTA EN CALCULO DE PROMEDIO DE SALIDAS POR ARTICULO') returning_values (INCSALI);
  /*DE ACUERDO A PARAMETRO TOME LOS DIAS PARA EL PROMDIO*/
EXECUTE PROCEDURE lee_configuracion ('INVENTARIO', 'EXISTENCIAS', 'PROMEDIAR LAS SALIDAS DEL INVENTARIO CON EL NUMERO DE DIAS ASIGNADO A CADA ARTICULO') returning_values (:DIA_ART);
  /* SUME LAS CANTIDADES SALIDAS DEL INVENTARIO */
EXECUTE PROCEDURE lee_configuracion ('INVENTARIO', 'EXISTENCIAS', 'NUMERO DE DIAS PARA PROMEDIO DE SALIDAS POR ARTICULO') returning_values (DIASC);
EXECUTE PROCEDURE lee_configuracion ('INVENTARIO', 'EXISTENCIAS', 'INCLUIR DIAS SIN EXISTENCIA EN PROMEDIO DE VENTAS DIARIO') returning_values (:SININV);
if (DIA_ART = 'SI') then
    BEGIN
      SELECT ARTI_DIANALIS FROM ARTICULO WHERE ARTI_COD = :ARTICULO INTO :DIAS;
    END
ELSE
     DIAS = CAST(DIASC AS INTEGER);
if (DIAS IS NULL) then
    DIAS = 30;
SELECT FIRST 1 PRSA_PROMEDIO, PRSA_FECHA FROM promedio_salidas WHERE ARTI_COD = :articulo AND BODE_COD = :bodega ORDER BY PRSA_FECHA INTO :promedio, :fecini;
if (((FECHA - FECINI) > 7) or (FECINI IS NULL) or (PROMEDIO IS NULL) ) then
  BEGIN
  FECINI = FECHA - DIAS;
  if (INCSALI = 'SI') then
      SELECT SUM(MVAR_CANT) FROM MOVIMIENTO_ARTICULO
        WHERE ARTI_COD = :ARTICULO AND BODE_COD = :BODEGA AND MVAR_FECHA >= :FECINI AND MVAR_FECHA <= :FECHA AND MVAR_ENTRADA = 'N' AND MVAR_TIPODOC <> 13 INTO :SALIDAS;
  else
      SELECT SUM(MVAR_CANT) FROM MOVIMIENTO_ARTICULO
        WHERE ARTI_COD = :ARTICULO AND BODE_COD = :BODEGA AND MVAR_FECHA >= :FECINI AND MVAR_FECHA <= :FECHA AND ((MVAR_TIPODOC = 31) or (MVAR_TIPODOC = 32)) INTO :SALIDAS;
  if (SALIDAS IS NULL) then
    SALIDAS = 0;
  if (SININV = 'SI') then
      PROMEDIO = SALIDAS / DIAS;
  else
    begin
    dias = 0;
    while (fecini < fecha) do
        begin
        execute procedure saldo_inventario (:articulo, :bodega, :fecini) returning_values (:saldo);
        if (SALDO <> 0) then
            DIAS = DIAS + 1;
        fecini = fecini + 1;
        end
    if (DIAS = 0) then
        PROMEDIO = 0;
    ELSE
        PROMEDIO = SALIDAS / DIAS;
    end
  UPDATE or INSERT INTO promedio_salidas (ARTI_COD, BODE_COD, PRSA_FECHA, PRSA_PROMEDIO)
    VALUES (:articulo, :bodega, :fecha, :promedio);
  END
ELSE
  SALIDAS = PROMEDIO * DIAS;
SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE DISPONIBILIDAD_ARTICULO(
    ARTICULO VARCHAR(15),
    FECHA DATE,
    BODEGA VARCHAR(2))
RETURNS (
    DISPONIBILIDAD INTEGER,
    EXIST NUMERIC(18,4),
    PROMEDIO NUMERIC(18,4),
    SALIDAS NUMERIC(18,4))
AS
BEGIN
  EXECUTE PROCEDURE SALDO_INVENTARIO (ARTICULO, BODEGA, FECHA) returning_values (:EXIST);
  EXECUTE PROCEDURE PROMEDIO_SALIDAS_ARTICULO(:ARTICULO, :FECHA, :BODEGA) returning_values (:PROMEDIO, :SALIDAS);
  if (PROMEDIO > 0) then
    DISPONIBILIDAD = EXIST / PROMEDIO;
  ELSE
    DISPONIBILIDAD = 0;
  SUSPEND;
END

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE EXISTENCIAS_COMPRAS(
    ARTICULO VARCHAR(15),
    FECHA DATE,
    UNIDAD VARCHAR(8))
RETURNS (
    BODEGA VARCHAR(2),
    EXISTENCIA NUMERIC(18,2),
    RESERVADO NUMERIC(18,2),
    ORDENADO NUMERIC(18,2),
    PROMEDIO NUMERIC(18,2),
    VENTAMES NUMERIC(18,2),
    FECHACMP DATE,
    CANTCMP NUMERIC(18,2),
    DIAS INTEGER,
    SUGERIDO NUMERIC(18,2),
    STAND VARCHAR(20))
AS
declare variable FACTOR NUMERIC(15,4);
declare variable ORDENC NUMERIC(18,4);
declare variable PEDIDO NUMERIC(18,4);
declare variable ITEM INTEGER;
declare variable ID INTEGER;
declare variable UND VARCHAR(8);
declare variable CANT NUMERIC(18,4);
declare variable FACTOR2 NUMERIC(18,4);
declare variable fecini DATE;
declare variable FECHAAUX VARCHAR(10);
declare variable AGENCIA INTEGER;
declare variable DEVMES NUMERIC(18,2);
declare variable MFAC INTEGER;
declare variable MDEV INTEGER;
declare variable IVAF NUMERIC(18,2);
declare variable IVAD NUMERIC(18,2);
declare variable DIA_ART VARCHAR(2) CHARACTER SET NONE;
declare variable DIASC VARCHAR(255);
declare variable PEDAUTO CHAR(2);
declare variable SALIDAS NUMERIC(18,4);
BEGIN
  for select bode_cod, SUCU_ID from bodega into :bodega, :agencia
    do
    begin
    execute procedure saldo_inventario (:articulo, :bodega, :fecha) returning_values (:Existencia);
    EXECUTE PROCEDURE FACTOR_UNIDAD_CANT(:ARTICULO, :UNIDAD) returning_values (:FACTOR);
    if (FACTOR <> 0) then
        EXISTENCIA = EXISTENCIA / FACTOR;
    else
        EXISTENCIA = 0;
    STAND = '';
    SELECT STAND_COD FROM STANDS WHERE ARTI_COD = :ARTICULO AND STAND_BODEGA = :BODEGA INTO :stand;
    EXECUTE PROCEDURE promedio_salidas_articulo (:ARTICULO, :FECHA, :BODEGA) returning_values (:PROMEDIO, :SALIDAS);
    EXECUTE PROCEDURE lee_configuracion ('INVENTARIO', 'EXISTENCIAS', 'PROMEDIAR LAS SALIDAS DEL INVENTARIO CON EL NUMERO DE DIAS ASIGNADO A CADA ARTICULO') returning_values (:DIA_ART);
    if (DIA_ART = 'NO') then
        BEGIN
        EXECUTE PROCEDURE lee_configuracion ('INVENTARIO', 'EXISTENCIAS', 'NUMERO DE DIAS PARA PROMEDIO DE SALIDAS POR ARTICULO') returning_values (DIASC);
        DIAS = CAST(DIASC AS INTEGER);
        END
    ELSE
        SELECT ARTI_DIAS FROM ARTICULO WHERE ARTI_COD = :ARTICULO INTO :DIAS;
    if (DIAS is null) then
        DIAS = 0;
    PROMEDIO = DIAS * PROMEDIO;
    if (FACTOR <> 0) then
        PROMEDIO = PROMEDIO / FACTOR;
    SUGERIDO = PROMEDIO - EXISTENCIA;
    SELECT SUM(ORID_ENTREGAR)
      FROM ORDENINVENTARIO_DETALLE OD, ordenes_inventario O
      WHERE O.ORIN_ID = OD.ORIN_ID AND ARTI_COD = :ARTICULO AND ORIN_FECHA <= :FECHA AND ORIN_FECLLEGA >= :FECHA AND ORID_ANULADO = 'N' AND OD.BODE_COD = :BODEGA
      INTO :ORDENADO;
    if (ORDENADO IS NULL) then
        ORDENADO = 0;
    ORDENC = 0;
    FOR SELECT O.ORDC_ID, OCDE_ITEM, OCDE_CANT * OCDE_FACTOR
        FROM ORDENES_COMPRA O, ORDENES_COMPRA_DETALLE OD
        WHERE O.ORDC_ID = OD.ORDC_ID AND OD.ARTI_COD = :ARTICULO AND (ORDC_FECHA+ORDC_VALIDEZ) >= :FECHA AND ORDC_FECHA <= :FECHA AND OCDE_ANULADO = 'N' AND OD.BODE_COD = :BODEGA
        INTO :ID, :ITEM, :CANT
        do
        BEGIN
        EXECUTE PROCEDURE FALTANTE(23, 21, ID, ITEM) returning_values (PEDIDO, UND, FACTOR2);
        if (PEDIDO * FACTOR2 = CANT) then /* SI NO SE HA FACTURADO MIRE A VER SI SE REMISIONO */
            EXECUTE PROCEDURE FALTANTE(23, 22, ID, ITEM) returning_values (PEDIDO, UND, FACTOR2);
        if (PEDIDO IS NULL) then
            PEDIDO = 0;
        ORDENC = ORDENC + PEDIDO * FACTOR2;
        END
    ORDENADO = ORDENADO + ORDENC;
    if (FACTOR <> 0) then
        ORDENADO = ORDENADO / FACTOR;
    SELECT SUM(RSDE_LIBERAR)
      FROM RESERVAS_DETALLE RD, RESERVAS R
      WHERE R.RESE_ID = RD.RESE_ID AND ARTI_COD = :ARTICULO AND RESE_FECHA <= :FECHA AND RESE_VENCE >= :FECHA AND RD.BODE_COD = :BODEGA AND RSDE_ANULADO = 'N'
      INTO :RESERVADO;
    if (RESERVADO IS NULL) then
        RESERVADO = 0;
    PEDIDO = 0;
    FOR SELECT P.PEDI_ID, PEDE_ITEM, PEDE_CANT * PEDE_FACTOR
        FROM PEDIDOS P, PEDIDOS_DETALLE PD
        WHERE P.PEDI_ID = PD.PEDI_ID AND PD.ARTI_COD = :ARTICULO AND (PEDI_FECHA+PEDI_VALIDEZ) >= :FECHA AND PEDI_FECHA <= :FECHA AND PEDE_ANULADO = 'N' AND BODE_COD = :BODEGA
        INTO :ID, :ITEM, :CANT
        do
        BEGIN
        EXECUTE PROCEDURE FALTANTE(34, 31, ID, ITEM) returning_values (ORDENC, UND, FACTOR2);
        EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION', 'FACTURAS', 'GENERAR PEDIDO AUTOMATICAMENTE CON LA FACTURA') returning_values (pedauto);
        if ((ORDENC * FACTOR2 = CANT) or (PEDAUTO = 'SI')) then /* SI NO SE HA FACTURADO MIRE A VER SI SE REMISIONO */
            EXECUTE PROCEDURE FALTANTE(34, 32, ID, ITEM) returning_values (ORDENC, UND, FACTOR2);
        if (ORDENC IS NULL) then
            ORDENC = 0;
        PEDIDO = PEDIDO + ORDENC * FACTOR2;
        END
    RESERVADO = RESERVADO + PEDIDO;
    if (FACTOR <> 0) then
        RESERVADO = RESERVADO / FACTOR;
    /* VENTAS MES */
    FECHAAUX = CAST (FECHA AS VARCHAR(10));
    FECHAAUX = SUBSTR(FECHAAUX, 1, 7) || '/01';
    FECINI = CAST (FECHAAUX AS DATE);
    EXECUTE PROCEDURE ventas_articulo (:ARTICULO, :FECINI, :FECHA, :agencia) returning_values (:ventames, :mfac, :devmes, :mdev, :ivaf, :ivad);
    ventames = ventames - devmes;
    if (FACTOR <> 0) then
        ventames = ventames / FACTOR;
    /* FECHA COMPRA */
    fechacmp = null;
    cantcmp = 0;
    SELECT FIRST 1 FACO_FECHA, FCDE_CANT * FCDE_FACTOR FROM FACTURAS_COMPRA F, FACTURAS_COMPRAS_DETALLE D
        WHERE F.FACO_ID = D.faco_id AND D.ARTI_COD = :articulo AND FACO_FECHA <= :FECHA AND D.bode_cod = :BODEGA
        ORDER BY FACO_FECHA DESC, F.FACO_ID DESC
        INTO :fechacmp, :cantcmp;
    SUSPEND;
    end
END

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE MAXIMO_ARTICULO(
    ARTICULO VARCHAR(15),
    FECHA DATE,
    BODEGA CHAR(2),
    CANT NUMERIC(18,2))
RETURNS (
    EXCESO NUMERIC(18,2))
AS
declare variable DIAS CHAR(2);
declare variable PROMEDIO NUMERIC(18,4);
declare variable SALIDAS NUMERIC(18,4);
declare variable MAXIMO NUMERIC(18,4);
declare variable SALDO NUMERIC(18,4);
BEGIN
  /* CUANDO CONFIGURACION MINIMO EN DIAS */
  EXECUTE PROCEDURE LEE_CONFIGURACION ('INVENTARIO', 'EXISTENCIAS', 'MAXIMO INVENTARIO EN DIAS') returning_values (DIAS);
  if (DIAS = 'SI') then
    BEGIN
    EXECUTE PROCEDURE PROMEDIO_SALIDAS_ARTICULO(:ARTICULO, :FECHA, :BODEGA) returning_values (:PROMEDIO, :SALIDAS);
    SELECT ARTI_MAX * :PROMEDIO FROM ARTICULO WHERE ARTI_COD = :ARTICULO INTO :MAXIMO;
    end
  ELSE
    BEGIN
    SELECT ARTI_MAX FROM ARTICULO WHERE ARTI_COD = :ARTICULO INTO :MAXIMO;
    END
  if (MAXIMO IS NULL) then
    MAXIMO = 0;
  EXECUTE PROCEDURE SALDO_INVENTARIO(:ARTICULO, :BODEGA, :FECHA) returning_values (SALDO);
  if (SALDO+CANT > maximo) then
    EXCESO = MAXIMO - (SALDO+CANT);
  ELSE
    EXCESO = 0;
  SUSPEND;
END

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE MINIMO_ARTICULO(
    ARTICULO VARCHAR(15),
    FECHA DATE,
    BODEGA CHAR(2))
RETURNS (
    MINIMO NUMERIC(18,4))
AS
declare variable DIAS CHAR(2);
declare variable PROMEDIO NUMERIC(18,4);
declare variable SALIDAS NUMERIC(18,4);
BEGIN
  /* CUANDO CONFIGURACION MINIMO EN DIAS */
  EXECUTE PROCEDURE LEE_CONFIGURACION ('INVENTARIO', 'EXISTENCIAS', 'MINIMO INVENTARIO EN DIAS') returning_values (DIAS);
  if (DIAS = 'SI') then
    BEGIN
    EXECUTE PROCEDURE PROMEDIO_SALIDAS_ARTICULO(:ARTICULO, :FECHA, :BODEGA) returning_values (:PROMEDIO, :SALIDAS);
    SELECT ARTI_DIAS * :PROMEDIO FROM ARTICULO WHERE ARTI_COD = :ARTICULO INTO :MINIMO;
    end
  ELSE
    BEGIN
    SELECT ARTI_MIN FROM ARTICULO WHERE ARTI_COD = :ARTICULO INTO :MINIMO;
    END
  if (MINIMO IS NULL) then
    MINIMO = 0;
  SUSPEND;
END

^

SET TERM ; ^

SET TERM ^ ;

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

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE ORDEN_SUGERIDA(
    PROVEEDOR VARCHAR(20),
    FECHA DATE)
RETURNS (
    ARTICULO VARCHAR(15),
    BODEGA VARCHAR(2),
    CANT NUMERIC(18,4),
    UNIDAD VARCHAR(8),
    COSTO NUMERIC(18,2))
AS
declare variable FACTOR NUMERIC(15,4);
declare variable DIAS INTEGER;
declare variable EXISTENCIA NUMERIC(18,4);
declare variable PROMEDIO NUMERIC(18,4);
declare variable AGENCIA INTEGER;
declare variable DIA_ART VARCHAR(2) CHARACTER SET NONE;
declare variable DIASC VARCHAR(255);
declare variable SALIDAS NUMERIC(18,4);
BEGIN
FOR SELECT a.ARTI_COD, PVAR_COSTO, ARTI_UNIDAD, ARTI_DIAS FROM proveedor_articulo p, articulo a
    WHERE p.arti_cod = a.arti_cod and TERC_NIT = :proveedor order by a.arti_des
    INTO :articulo, :costo, :unidad, :DIAS
  DO BEGIN
  for select bode_cod, SUCU_ID from bodega into :bodega, :agencia
    do
    begin
    execute procedure saldo_inventario (:articulo, :bodega, :fecha) returning_values (:Existencia);
    EXECUTE PROCEDURE FACTOR_UNIDAD_CANT(:ARTICULO, :UNIDAD) returning_values (:FACTOR);
    if (FACTOR <> 0) then
        EXISTENCIA = EXISTENCIA / FACTOR;
    else
        EXISTENCIA = 0;
    EXECUTE PROCEDURE promedio_salidas_articulo (:ARTICULO, :FECHA, :BODEGA) returning_values (:PROMEDIO, :SALIDAS);
    EXECUTE PROCEDURE lee_configuracion ('INVENTARIO', 'EXISTENCIAS', 'PROMEDIAR LAS SALIDAS DEL INVENTARIO CON EL NUMERO DE DIAS ASIGNADO A CADA ARTICULO') returning_values (:DIA_ART);
    if (DIA_ART = 'NO') then
        BEGIN
        EXECUTE PROCEDURE lee_configuracion ('INVENTARIO', 'EXISTENCIAS', 'NUMERO DE DIAS PARA PROMEDIO DE SALIDAS POR ARTICULO') returning_values (DIASC);
        DIAS = CAST(DIASC AS INTEGER);
        END
    if (DIAS is null) then
        DIAS = 0;
    PROMEDIO = DIAS * PROMEDIO;
    if (FACTOR <> 0) then
        PROMEDIO = PROMEDIO / FACTOR;
    CANT = PROMEDIO - EXISTENCIA;
    if (CANT > 0) then
        SUSPEND;
    end
  END
END

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE ORDEN_SUGERIDA_BOD(
    PROVEEDOR VARCHAR(20),
    BODEGA VARCHAR(2),
    FECHA DATE)
RETURNS (
    ARTICULO VARCHAR(15),
    CANT NUMERIC(18,4),
    UNIDAD VARCHAR(8),
    COSTO NUMERIC(18,2))
AS
declare variable FACTOR NUMERIC(15,4);
declare variable DIAS INTEGER;
declare variable EXISTENCIA NUMERIC(18,4);
declare variable PROMEDIO NUMERIC(18,4);
declare variable DIA_ART VARCHAR(2) CHARACTER SET NONE;
declare variable DIASC VARCHAR(255);
declare variable SALIDAS NUMERIC(18,4);
BEGIN
EXECUTE PROCEDURE lee_configuracion ('INVENTARIO', 'EXISTENCIAS', 'PROMEDIAR LAS SALIDAS DEL INVENTARIO CON EL NUMERO DE DIAS ASIGNADO A CADA ARTICULO') returning_values (:DIA_ART);
EXECUTE PROCEDURE lee_configuracion ('INVENTARIO', 'EXISTENCIAS', 'NUMERO DE DIAS PARA PROMEDIO DE SALIDAS POR ARTICULO') returning_values (DIASC);
FOR SELECT a.ARTI_COD, PVAR_COSTO, ARTI_UNIDAD, ARTI_DIAS
    FROM proveedor_articulo p, articulo a
    WHERE TERC_NIT = :proveedor and p.arti_cod = a.arti_cod
    INTO :articulo, :costo, :unidad, :DIAS
    DO
    begin
    execute procedure saldo_inventario (:articulo, :bodega, :fecha) returning_values (:Existencia);
    EXECUTE PROCEDURE FACTOR_UNIDAD_CANT(:ARTICULO, :UNIDAD) returning_values (:FACTOR);
    if (FACTOR <> 0) then
        EXISTENCIA = EXISTENCIA / FACTOR;
    else
        EXISTENCIA = 0;
    EXECUTE PROCEDURE promedio_salidas_articulo (:ARTICULO, :FECHA, :BODEGA) returning_values (:PROMEDIO, :SALIDAS);
    if (DIA_ART = 'NO') then
        BEGIN
        DIAS = CAST(DIASC AS INTEGER);
        END
    if (DIAS is null) then
        DIAS = 0;
    PROMEDIO = DIAS * PROMEDIO;
    if (FACTOR <> 0) then
        PROMEDIO = PROMEDIO / FACTOR;
    CANT = PROMEDIO - EXISTENCIA;
    if (CANT > 0) then
        SUSPEND;
    end
END

^

SET TERM ; ^

SET TERM ^ ;

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

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

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

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE EXISTENCIAS_MINYMAX(
    FECHA DATE,
    ARTINI VARCHAR(20),
    ARTFIN VARCHAR(20),
    GRPINI VARCHAR(2),
    GRPFIN VARCHAR(2),
    ORDEN CHAR(1),
    CEROS CHAR(1))
RETURNS (
    CODIGO VARCHAR(15),
    NOMBRE VARCHAR(60),
    UNIDAD VARCHAR(8),
    CODGRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    CODSUBG VARCHAR(3),
    NOMSUBG VARCHAR(30),
    CODMARC VARCHAR(3),
    NOMMARC VARCHAR(30),
    CODBOD VARCHAR(2),
    NOMBOD VARCHAR(30),
    CANT NUMERIC(18,4),
    MINIMO NUMERIC(18,4),
    MAXIMO NUMERIC(18,4),
    FALTANTE NUMERIC(18,4),
    EXCEDENTE NUMERIC(18,4))
AS
declare variable CODINI VARCHAR(20);
declare variable CODFIN VARCHAR(20);
declare variable DESINI VARCHAR(20);
declare variable DESFIN VARCHAR(20);
declare variable MAXDIA VARCHAR(2);
declare variable DISPONIBILIDAD integer;
declare variable PROMEDIO numeric(18,4);
declare variable SALIDAS numeric(18,4);
BEGIN
if (ORDEN = 'C') then
    BEGIN
    CODINI = ARTINI;
    CODFIN = ARTFIN;
    DESINI = '';
    DESFIN = 'zz';
    END
ELSE
    BEGIN
    DESINI = ARTINI;
    DESFIN = ARTFIN;
    CODINI = '';
    CODFIN = 'zz';
    END
execute procedure lee_configuracion ('INVENTARIO', 'EXISTENCIAS', 'MAXIMO INVENTARIO EN DIAS') returning_values (:maxdia);

FOR SELECT ARTI_COD, ARTI_DES, ARTI_UNIDAD, A.GRUP_COD, A.SUBG_COD, A.MARC_COD, BODE_COD, BODE_NOM, ARTI_MIN, ARTI_MAX
      FROM ARTICULO A, BODEGA B
      WHERE ARTI_COD >= :CODINI AND ARTI_COD <= :CODFIN AND A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :GRPFIN AND
        ARTI_DES >= :DESINI AND ARTI_DES <= :DESFIN AND BODE_ACTIVA = 'S'
      ORDER BY ARTI_COD, BODE_COD
      INTO :CODIGO, :NOMBRE, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :CODBOD, :NOMBOD, :MINIMO, :MAXIMO
      DO
        BEGIN
        SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
        SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
        SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;

        if (maxdia = 'SI') then
            begin
            EXECUTE PROCEDURE DISPONIBILIDAD_ARTICULO(CODIGO, FECHA, :CODBOD) returning_values (:DISPONIBILIDAD, :CANT, :PROMEDIO, :SALIDAS);
            if ((DISPONIBILIDAD < minimo) and (PROMEDIO > 0)) then
                FALTANTE = (minimo * PROMEDIO) - cant;
            ELSE
                FALTANTE = 0;
            if ((DISPONIBILIDAD > maximo) and (PROMEDIO > 0)) then
                excedente = cant - (MAXIMO * PROMEDIO);
            ELSE
                EXCEDENTE = 0;
            if ((CEROS = 'S') or (FALTANTE <> 0) or (excedente <> 0))  then
                SUSPEND;
            end
        else
            begin
            EXECUTE PROCEDURE SALDO_INVENTARIO(CODIGO, :CODBOD, FECHA) returning_values (CANT);
            if (CANT < MINIMO) then
                FALTANTE = MINIMO - CANT;
            if (CANT > maximo) then
                excedente =  CANT - maximo;
            if ((CEROS = 'S') or (FALTANTE <> 0) or (excedente <> 0))  then
                SUSPEND;
            end
        END
END

^

SET TERM ; ^

SET TERM ^ ;

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

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

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE REP_DISPONIBILIDAD(
    FECHA DATE,
    ARTINI VARCHAR(20),
    ARTFIN VARCHAR(20),
    GRPINI VARCHAR(3),
    GRPFIN VARCHAR(3),
    ORDEN CHAR(1),
    CEROS CHAR(1),
    DETALLE CHAR(1),
    AGRUPA CHAR(1),
    SUCURSAL INTEGER)
RETURNS (
    CODIGO VARCHAR(15),
    NOMBRE VARCHAR(60),
    UNIDAD VARCHAR(8),
    CODGRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    CODSUBG VARCHAR(3),
    NOMSUBG VARCHAR(30),
    CODMARC VARCHAR(3),
    NOMMARC VARCHAR(30),
    CODBOD VARCHAR(2),
    NOMBOD VARCHAR(30),
    EXIST NUMERIC(18,4),
    PROMEDIO NUMERIC(18,4),
    SALIDAS NUMERIC(18,4),
    DISPONIBILIDAD INTEGER,
    DIAS INTEGER,
    PROMEDIADO INTEGER,
    COSTO NUMERIC(18,2),
    COSTOPRO NUMERIC(18,2),
    SUGERIDO NUMERIC(18,4),
    FECCOMPRA DATE)
AS
DECLARE VARIABLE CODINI VARCHAR(20);
DECLARE VARIABLE CODFIN VARCHAR(20);
DECLARE VARIABLE DESINI VARCHAR(20);
DECLARE VARIABLE DESFIN VARCHAR(20);
DECLARE VARIABLE MARINI VARCHAR(20);
DECLARE VARIABLE MARFIN VARCHAR(20);
declare variable DIASC VARCHAR(255);
declare variable DIA_ART VARCHAR(2) CHARACTER SET NONE;
declare variable PORART VARCHAR(8);
declare variable MAXDIA VARCHAR(2);
BEGIN
if (ORDEN = 'C') then
    BEGIN
    CODINI = ARTINI;
    CODFIN = ARTFIN;
    DESINI = '';
    DESFIN = 'zz';
    END
ELSE
    BEGIN
    DESINI = ARTINI;
    DESFIN = ARTFIN;
    CODINI = '';
    CODFIN = 'zz';
    END
if (AGRUPA = 'G') then
    BEGIN
    MARINI = '';
    MARFIN = 'zz';
    END
ELSE
    if (AGRUPA = 'M') then
        BEGIN
        MARINI = GRPINI;
        MARFIN = GRPFIN;
        GRPINI = '';
        GRPFIN = 'zz';
        END
EXECUTE PROCEDURE lee_configuracion ('INVENTARIO', 'EXISTENCIAS', 'PROMEDIAR LAS SALIDAS DEL INVENTARIO CON EL NUMERO DE DIAS ASIGNADO A CADA ARTICULO') returning_values (:DIA_ART);
EXECUTE PROCEDURE lee_configuracion ('INVENTARIO', 'EXISTENCIAS', 'NUMERO DE DIAS PARA PROMEDIO DE SALIDAS POR ARTICULO') returning_values (DIASC);
execute procedure lee_configuracion ('INVENTARIO', 'EXISTENCIAS', 'MAXIMO Y MINIMO POR STAND O POR ARTICULO') returning_values (:porart);
execute procedure lee_configuracion ('INVENTARIO', 'EXISTENCIAS', 'MAXIMO INVENTARIO EN DIAS') returning_values (:maxdia);
if (DETALLE = 'S') then
  BEGIN
  FOR SELECT ARTI_COD, ARTI_DES, ARTI_UNIDAD, ARTI_DIAS, A.GRUP_COD, GRUP_NOM, A.SUBG_COD, A.MARC_COD, BODE_COD, BODE_NOM, ARTI_DIANALIS
      FROM ARTICULO A, GRUPO G, BODEGA B
      WHERE ARTI_COD >= :CODINI AND ARTI_COD <= :CODFIN AND A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :GRPFIN AND ARTI_DES >= :DESINI AND ARTI_DES <= :DESFIN AND
      G.GRUP_COD = A.GRUP_COD AND A.ESAR_COD <> 'I' AND ((SUCU_ID = :SUCURSAL) or (:SUCURSAL = 0)) AND
      (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN)))
      INTO :CODIGO, :NOMBRE, :UNIDAD, :DIAS, :CODGRUPO, :NOMGRUPO, :CODSUBG, :CODMARC, :CODBOD, :NOMBOD, :PROMEDIADO
      DO
        BEGIN
        NOMMARC = '';
        NOMSUBG = '';
        SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO :NOMMARC;
        SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
        EXECUTE PROCEDURE costo_promedio_y_ultimo(:CODIGO, :FECHA) RETURNING_VALUES (:costopro, :COSTO);
        EXECUTE PROCEDURE DISPONIBILIDAD_ARTICULO(CODIGO, FECHA, :CODBOD) returning_values (:DISPONIBILIDAD, :EXIST, :PROMEDIO, :SALIDAS);
        if ((PORART = 'STAND') AND (MAXDIA = 'SI')) then
            BEGIN
            DIAS = 0;
            SELECT STAND_MIN FROM STANDS WHERE ARTI_COD = :CODIGO AND STAND_BODEGA = :codbod INTO :dias;
            END
        /*ESTABLECER CUAL ES EL VALOR DE DIAS PARA PROMEDIO*/
        if (DIA_ART = 'NO') then
          BEGIN
            PROMEDIADO = CAST(DIASC AS INTEGER);
          END
        if ((DISPONIBILIDAD < DIAS) and (PROMEDIO > 0))then
            SUGERIDO = (DIAS * PROMEDIO) - EXIST;
        ELSE
            SUGERIDO = 0;
        SELECT MAX(FACO_FECHA) FROM FACTURAS_COMPRA F, FACTURAS_COMPRAS_DETALLE D
            WHERE F.FACO_ID = D.faco_id AND D.ARTI_COD = :CODIGO AND FACO_FECHA <= :FECHA AND D.bode_cod = :codbod
            INTO :FECCOMPRA;
        if ((PROMEDIO > 0) or (EXIST <> 0) or (CEROS = 'S')) then
            SUSPEND;
        END
  END
ELSE
  BEGIN
  FOR SELECT ARTI_COD, ARTI_DES, ARTI_UNIDAD, ARTI_DIAS, A.GRUP_COD, GRUP_NOM, A.SUBG_COD, A.MARC_COD, ARTI_DIANALIS
      FROM ARTICULO A, GRUPO G
      WHERE ARTI_COD >= :CODINI AND ARTI_COD <= :CODFIN AND A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :GRPFIN AND ARTI_DES >= :DESINI AND ARTI_DES <= :DESFIN AND G.GRUP_COD = A.GRUP_COD AND
      A.ESAR_COD <> 'I' AND (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN)))
      INTO :CODIGO, :NOMBRE, :UNIDAD, :DIAS, :CODGRUPO, :NOMGRUPO, :CODSUBG, :CODMARC, :PROMEDIADO
      DO
        BEGIN
        NOMMARC = '';
        NOMSUBG = '';
        SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO :NOMMARC;
        SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
        EXECUTE PROCEDURE costo_promedio_y_ultimo(:CODIGO, :FECHA) RETURNING_VALUES (:costopro, :COSTO);
        EXECUTE PROCEDURE DISPONIBILIDAD_TOTAL_ARTICULO(CODIGO, FECHA) returning_values (:DISPONIBILIDAD, :EXIST, :PROMEDIO, :SALIDAS);
        if ((PORART = 'STAND') AND (MAXDIA = 'SI')) then
            BEGIN
            DIAS = 0;
            SELECT STAND_MIN FROM STANDS WHERE ARTI_COD = :CODIGO AND STAND_BODEGA = :codbod INTO :dias;
            END
        /*ESTABLECER CUAL ES EL VALOR DE DIAS PARA PROMEDIO*/
        if (DIA_ART = 'NO') then
          BEGIN
            PROMEDIADO = CAST(DIASC AS INTEGER);
          END
        if ((DISPONIBILIDAD < DIAS) and (PROMEDIO > 0))then
            SUGERIDO = (DIAS * PROMEDIO) - EXIST;
        ELSE
            SUGERIDO = 0;
        SELECT MAX(FACO_FECHA) FROM FACTURAS_COMPRA F, FACTURAS_COMPRAS_DETALLE D
            WHERE F.FACO_ID = D.faco_id AND D.ARTI_COD = :CODIGO AND FACO_FECHA <= :FECHA
            INTO :FECCOMPRA;
        if ((PROMEDIO > 0) or (EXIST <> 0) or (CEROS = 'S')) then
            SUSPEND;
        END
  END
END

^

SET TERM ; ^


/* 20091121: nuevos procedimientos de usuario */

SET TERM ^ ;

CREATE OR ALTER procedure MOVBANCO_NO_CONCILIADOS (
    FECINI DATE,
    FECFIN DATE,
    CUENTA VARCHAR(3))
returns (TIPODOC VARCHAR(8),
    PREFDOC VARCHAR(4),
    NUMDOC VARCHAR(6),
    FECHA DATE,
    CONCEPTO VARCHAR(60),
    MONTO NUMERIC(18,2))
as
begin
FOR SELECT m.moba_tipodoc, m.moba_pref, m.moba_numero, m.moba_fecha, m.moba_concepto, m.moba_total
    FROM movimiento_banco m, cuentas_banco c where c.cuba_cod = m.cuba_cod and c.cuba_codcta = :cuenta and
    m.moba_fecha <= :fecfin and moba_fecha >= :fecini and
    not exists (select cobn_item from conciliacion_bancaria where cobn_tipodoc = m.moba_tipodoc and cobn_iddoc = m.moba_idref)
    into :tipodoc, :prefdoc, :numdoc, :fecha, :concepto, :monto
    do
    begin
    select tido_nomcorto from tipo_documento where tido_cod = :tipodoc into :tipodoc;
    suspend;
    end
end
^

SET TERM ; ^

SET TERM ^ ;

create or alter procedure DIF_MOVBANCO_CONCILIACION (
    FECINI DATE,
    FECFIN DATE,
    CUENTA VARCHAR(3))
returns (TIPODOC VARCHAR(8),
    PREFDOC VARCHAR(4),
    NUMDOC VARCHAR(6),
    FECHA DATE,
    CONCEPTO VARCHAR(60),
    MONTO NUMERIC(18,2))
as
begin
FOR SELECT m.moba_tipodoc, m.moba_pref, m.moba_numero, m.moba_fecha, m.moba_concepto, m.moba_total
    FROM movimiento_banco m, cuentas_banco c, conciliacion_bancaria b
    where c.cuba_cod = m.cuba_cod and c.cuba_codcta = :cuenta and
    b.cobn_tipodoc = m.moba_tipodoc and b.cobn_iddoc = m.moba_idref and b.cobn_monto <> m.moba_total and b.cobn_ok = 'S' and m.cuba_cod = c.cuba_cod
    and m.moba_fecha <= :fecfin and moba_fecha >= :fecini
    into :tipodoc, :prefdoc, :numdoc, :fecha, :concepto, :monto
    do
    begin
    select tido_nomcorto from tipo_documento where tido_cod = :tipodoc into :tipodoc;
    suspend;
    end
end
^

SET TERM ; ^

grant execute on procedure movbanco_no_conciliados to public;

grant execute on procedure dif_movbanco_conciliacion to public;


INSERT INTO PROCEDIMIENTOS_USUARIO (PRUS_COD, PRUS_NOMBRE, PRUS_SP, PRUS_PARAM1, PRUS_PARAM2, PRUS_PARAM3) VALUES (7, 'Movimientos del banco no conciliados', 'MOVBANCO_NO_CONCILIADOS', 'Cuenta banco', '', '');
INSERT INTO PROCEDIMIENTOS_USUARIO (PRUS_COD, PRUS_NOMBRE, PRUS_SP, PRUS_PARAM1, PRUS_PARAM2, PRUS_PARAM3) VALUES (8, 'Movimientos banco diferentes en conciliacion', 'DIF_MOVBANCO_CONCILIACION', 'Cuenta banco', '', '');
commit work;

SET TERM ^ ;

CREATE OR ALTER PROCEDURE CONCILIA_CAJA(
    FECINI DATE,
    FECFIN DATE,
    caja INTEGER,
    CTACAJA VARCHAR(20),
    NULO1 CHAR(1))
RETURNS (
    FECHA DATE,
    TIPODOC VARCHAR(10),
    TIPO INTEGER,
    ID INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    FECCONTA char(10),
    debitos NUMERIC(18,2),
    creditos NUMERIC(18,2),
    debitosC NUMERIC(18,2),
    creditosC NUMERIC(18,2),
    DIFERENCIA NUMERIC(18,2))
AS
declare variable FECINIC char(10);
declare variable FECFINC char(10);
begin
FOR select m.moca_tiporef, m.moca_idref, m.moca_debitos, m.moca_creditos, m.moca_fecha, m.moca_prefref, m.moca_numref
    from movimiento_caja m
    where caja_id = :caja and m.moca_fecha >= :FECINI and m.moca_fecha <= :FECFIN
    into :TIPO, :ID, :debitos, :creditos, :fecha, :pref, :numero
    DO
    BEGIN
    SELECT TIDO_NOMCORTO FROM tipo_documento WHERE TIDO_COD = :tipo INTO :tipodoc;
    /* BUSQUE EL CONTABLE */
    debitosc = NULL;
    creditosc = NULL;
    SELECT CODE_DEBITO, CODE_CREDITO FROM comprobante_detalle D, comprobante_encabezado C
        where C.enco_consec = D.enco_consec AND C.enco_tiporef = :TIPO AND C.enco_idref = :ID AND D.cuen_cod = :ctacaja
        INTO :debitosc, :creditosc;
    diferencia = (debitos - debitosc) - (creditos - creditosc);
    if (DIFERENCIA <> 0) then
        SUSPEND;
    END
/* AGREGUE LAS QUE NO TIENEN IDREF */
debitos = 0;
creditos = 0;
EXECUTE PROCEDURE fecha_a_conta (:FECINI) returning_values (:FECINIC);
EXECUTE PROCEDURE fecha_a_conta (:FECFIN) returning_values (:FECFINC);
FOR SELECT C.tico_cod, C.enco_fecha, C.prco_pref, C.enco_numero, CODE_DEBITO, CODE_CREDITO FROM comprobante_detalle D, comprobante_encabezado C
    where C.enco_consec = D.enco_consec AND CUEN_COD = :ctacaja AND C.enco_fecha >= :fecinic AND C.enco_fecha <= :fecfinc AND C.enco_idref = 0
    INTO :tipodoc, :fecconta, :pref, :numero, :debitosc, :creditosc
    do
    BEGIN
    diferencia = debitosc - creditosc;
    SUSPEND;
    END
end
^

SET TERM ; ^

grant EXECUTE on procedure concilia_caja to PUBLIC;

SET TERM ^ ;

CREATE OR ALTER PROCEDURE CONCILIA_BANCO_CONTA(
    FECINI DATE,
    FECFIN DATE,
    BANCO VARCHAR(3),
    CTABANCO VARCHAR(20),
    NULO1 CHAR(1))
RETURNS (
    FECHA DATE,
    TIPODOC VARCHAR(10),
    TIPO INTEGER,
    ID INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    FECCONTA CHAR(10),
    MONTO NUMERIC(18,2),
    MONTOC NUMERIC(18,2),
    DIFERENCIA NUMERIC(18,2))
AS
declare variable FECINIC char(10);
declare variable FECFINC char(10);
declare variable db char(1);
begin
FOR select m.moba_tipodoc, m.moba_idref, m.moba_total, m.moba_fecha, m.moba_pref, m.moba_numero, m.moba_db
    from movimiento_banco m, cuentas_banco c
    where c.cuba_cod = m.cuba_cod and c.cuba_codcta = :banco and m.moba_fecha >= :FECINI and m.moba_fecha <= :FECFIN
    into :TIPO, :ID, :monto, :fecha, :pref, :numero, :db
    DO
    BEGIN
    SELECT TIDO_NOMCORTO FROM tipo_documento WHERE TIDO_COD = :tipo INTO :tipodoc;
    if (db = 'N') then
        monto = monto * -1;
    /* BUSQUE EL CONTABLE */
    montoc = NULL;
    SELECT CODE_DEBITO-CODE_CREDITO FROM comprobante_detalle D, comprobante_encabezado C
        where C.enco_consec = D.enco_consec AND C.enco_tiporef = :TIPO AND C.enco_idref = :ID AND D.cuen_cod = :ctabanco
        INTO :montoc;
    diferencia = (monto - montoc);
    if (DIFERENCIA <> 0) then
        SUSPEND;
    END
/* AGREGUE LAS QUE NO TIENEN IDREF */
monto = 0;
EXECUTE PROCEDURE fecha_a_conta (:FECINI) returning_values (:FECINIC);
EXECUTE PROCEDURE fecha_a_conta (:FECFIN) returning_values (:FECFINC);
FOR SELECT C.tico_cod, C.enco_fecha, C.prco_pref, C.enco_numero, CODE_DEBITO-CODE_CREDITO FROM comprobante_detalle D, comprobante_encabezado C
    where C.enco_consec = D.enco_consec AND CUEN_COD = :ctabanco AND C.enco_fecha >= :fecinic AND C.enco_fecha <= :fecfinc AND C.enco_idref = 0
    INTO :tipodoc, :fecconta, :pref, :numero, :montoc
    do
    BEGIN
    diferencia = montoc;
    SUSPEND;
    END
end
^

SET TERM ; ^

grant EXECUTE on procedure concilia_banco_conta to PUBLIC;


INSERT INTO PROCEDIMIENTOS_USUARIO (PRUS_COD, PRUS_NOMBRE, PRUS_SP, PRUS_PARAM1, PRUS_PARAM2, PRUS_PARAM3) VALUES (9, 'Movimiento caja vs contabilidad', 'CONCILIA_CAJA', 'Caja', 'Cuenta contable', '');
INSERT INTO PROCEDIMIENTOS_USUARIO (PRUS_COD, PRUS_NOMBRE, PRUS_SP, PRUS_PARAM1, PRUS_PARAM2, PRUS_PARAM3) VALUES (10, 'Movimiento banco vs contabilidad', 'CONCILIA_BANCO_CONTA', 'Banco', 'Cuenta contable', '');
commit work;

SET TERM ^ ;

CREATE OR ALTER PROCEDURE COMPROBANTES_NEGATIVOS(
    FECINI DATE,
    FECFIN DATE,
    nulo1 CHAR(1),
    NULO2 CHAR(1),
    NULO3 CHAR(1))
RETURNS (
    TIPODOC VARCHAR(8),
    PREFDOC VARCHAR(4),
    NUMDOC VARCHAR(6),
    FECHA CHAR(10),
    CONCEPTO VARCHAR(60),
    DEBITO NUMERIC(18,2),
    CREDITO NUMERIC(18,2))
AS
declare variable FECINIC char(10);
declare variable FECFINC char(10);
begin
EXECUTE PROCEDURE fecha_a_conta (:FECINI) returning_values (:FECINIC);
EXECUTE PROCEDURE fecha_a_conta (:FECFIN) returning_values (:FECFINC);
FOR SELECT e.tico_cod, e.prco_pref, e.enco_numero, e.enco_fecha, e.enco_concepto, d.code_debito, d.code_credito
    FROM comprobante_encabezado e, comprobante_detalle d
    where e.enco_consec = d.enco_consec and ((d.code_debito < 0) or (d.code_credito < 0))
    and e.enco_fecha <= :fecfinc and e.enco_fecha >= :fecinic
    into :tipodoc, :prefdoc, :numdoc, :fecha, :concepto, :debito, :credito
    do
    begin
    suspend;
    end
end
^

SET TERM ; ^

grant EXECUTE on procedure comprobantes_negativos to PUBLIC;

INSERT INTO PROCEDIMIENTOS_USUARIO (PRUS_COD, PRUS_NOMBRE, PRUS_SP, PRUS_PARAM1, PRUS_PARAM2, PRUS_PARAM3) VALUES (11, 'Comprobantes contables negativos', 'COMPROBANTES_NEGATIVOS', '', '', '');
commit work;

SET TERM ^ ;

CREATE OR ALTER PROCEDURE CONCILIA_COMPRAS(
    FECINI DATE,
    FECFIN DATE,
    CTAEXE VARCHAR(20),
    CTAGRA VARCHAR(20),
    CTAOTRO VARCHAR(20))
RETURNS (
    IDF INTEGER,
    IDC INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    TARIFA0 NUMERIC(18,2),
    TARIFA0C NUMERIC(18,2),
    TARIFA1 NUMERIC(18,2),
    TARIFA1C NUMERIC(18,2),
    TARIFA2 NUMERIC(18,2),
    TARIFA2C NUMERIC(18,2),
    DIFERENCIA NUMERIC(18,2))
AS
DECLARE VARIABLE VRDTO NUMERIC(18,2);
DECLARE VARIABLE VRADIC NUMERIC(18,2);
DECLARE VARIABLE VRSUBT DOUBLE PRECISION;
DECLARE VARIABLE VRIVA NUMERIC(18,2);
DECLARE VARIABLE VRTOTAL NUMERIC(18,2);
DECLARE VARIABLE VREXTRA NUMERIC(18,2);
DECLARE VARIABLE factor DOUBLE PRECISION;
DECLARE VARIABLE mercancia DOUBLE PRECISION;
DECLARE VARIABLE VALORADIC DOUBLE PRECISION;
DECLARE VARIABLE MENORV CHAR(2);
DECLARE VARIABLE IVAINC CHAR(2);
DECLARE VARIABLE IVA NUMERIC(18,2);
DECLARE VARIABLE CONSUMO NUMERIC(18,2);
begin
EXECUTE PROCEDURE lee_configuracion('COMPRAS','FACTURAS','DESCUENTO Y VALOR ADICIONAL DEL DOCUMENTO COMO MENOR VALOR DEL COSTO') returning_values (:MENORV);
for select faco_id, pref_pre, faco_numero, enco_consec, FACO_IMPTOS, FACO_DTOMONTO, FACO_ADICIONAL, FACO_IVAMONTO, FACO_EXTRA, FACO_TOTAL
    from facturas_compra f, comprobante_encabezado c
    where faco_fecha >= :fecini and faco_fecha <= :fecfin and faco_id = enco_idref and enco_tiporef = 21
    into :idf, :pref, :numero, :idc, :IVAINC, :VRDTO, :VRADIC, :VRIVA, :VREXTRA, :VRTOTAL
    do
    begin
    tarifa0 = 0;
    tarifa1 = 0;
    tarifa2 = 0;
    tarifa0c = 0;
    tarifa1c = 0;
    tarifa2c = 0;
    VRSUBT = VRTOTAL - VREXTRA - VRIVA;
    MERCANCIA = VRSUBT - VRADIC + VRDTO;
    SELECT SUM(FCDE_consumo) from facturas_compras_detalle where faco_id = :IDF into :valoradic;
    if (valoradic is null) then
        valoradic = 0;
    if (MENORV = 'SI') then
        if (MERCANCIA <> 0) then
            FACTOR = (VRSUBT - VALORADIC) / (MERCANCIA - VALORADIC);
        ELSE
            FACTOR = 1;
    ELSE
        FACTOR = 1;

    select SUM(CAST(FCDE_CANT AS DOUBLE PRECISION) * (FCDE_PRUNIT-FCDE_DTOMONTO)*:factor), SUM(FCDE_IVAMONTO), SUM(FCDE_CONSUMO)
        FROM FACTURAS_COMPRAS_DETALLE WHERE FACO_ID = :idf and fcde_ivaporc = 0 into :tarifa0, :IVA, :CONSUMO;
    if (tarifa0 is null) then
        tarifa0 = 0;
    if (iva is null) then
        IVA = 0;
    if (CONSUMO is null) then
        CONSUMO = 0;
    if (IVAINC = 'S') then
        TARIFA0 = TARIFA0 - IVA - CONSUMO;
    select SUM(CAST(FCDE_CANT AS DOUBLE PRECISION) * (FCDE_PRUNIT-FCDE_DTOMONTO)*:factor), SUM(FCDE_IVAMONTO), SUM(FCDE_CONSUMO)
        FROM FACTURAS_COMPRAS_DETALLE WHERE FACO_ID = :idf and fcde_ivaporc = 16 into :tarifa1, :IVA, :CONSUMO;
    if (tarifa1 is null) then
        tarifa1 = 0;
    if (iva is null) then
        IVA = 0;
    if (CONSUMO is null) then
        CONSUMO = 0;
    if (IVAINC = 'S') then
        TARIFA1 = TARIFA1 - IVA - CONSUMO;
    select SUM(CAST(FCDE_CANT AS DOUBLE PRECISION) * (FCDE_PRUNIT-FCDE_DTOMONTO)*:factor), SUM(FCDE_IVAMONTO), SUM(FCDE_CONSUMO)
        FROM FACTURAS_COMPRAS_DETALLE WHERE FACO_ID = :idf and fcde_ivaporc <> 16 and fcde_ivaporc <> 0 into :tarifa2, :IVA, :CONSUMO;
    if (tarifa2 is null) then
        tarifa2 = 0;
    if (iva is null) then
        IVA = 0;
    if (CONSUMO is null) then
        CONSUMO = 0;
    if (IVAINC = 'S') then
        TARIFA2 = TARIFA2 - IVA - CONSUMO;
    select sum(code_debito - code_credito) from comprobante_detalle where enco_consec = :idc and cuen_cod = :ctaexe into tarifa0c;
    select sum(code_debito - code_credito) from comprobante_detalle where enco_consec = :idc and cuen_cod = :ctagra into tarifa1c;
    select sum(code_debito - code_credito) from comprobante_detalle where enco_consec = :idc and cuen_cod = :ctaotro into tarifa2c;
    if (tarifa0c is null) then
        tarifa0c = 0;
    if (tarifa1c is null) then
        tarifa1c = 0;
    if (tarifa2c is null) then
        tarifa2c = 0;
    diferencia = (tarifa0 - tarifa0c) + (tarifa1 - tarifa1c) + (tarifa2 - tarifa2c);
    suspend;
    end
end

^

SET TERM ; ^

/* 20091122 */

INSERT INTO CONFIGURACION (CONF_MODULO, CONF_CATEGORIA, CONF_PROPIEDAD, CONF_VALOR, CONF_POSIBLES, CONF_AYUDA) VALUES ('CAJA', 'EGRESOS', 'PERMITIR REGISTRAR EGRESOS POR OTROS CONCEPTOS A PROVEEDORES', 'SI', 'SI,NO', 'SI: Permite dar cancelar ene l detalle del egreso y registrar un egreso por conceptos diferentes a cuentas por pagar. NO: Obligatoriamente se requiere un documento a pagar al hacer egresos a proveedores');
commit work;

/* 20091123 */

INSERT INTO CONFIGURACION (CONF_MODULO, CONF_CATEGORIA, CONF_PROPIEDAD, CONF_VALOR, CONF_POSIBLES, CONF_AYUDA) VALUES ('INVENTARIO', 'EXISTENCIAS', 'SUGERIR EL LOTE MAS NUEVO O MAS VIEJO SIN IMPORTAR LA CANTIDAD A SALIR', 'NO', 'SI,NO', 'SI: Suguiere al hacer salidas o ventas el lote más antiguo o más reciente asi la cantidad no sea suficiente obigando a relacionar varios renglones. NO: Suguiere el primer lote cuyo saldo sea mayor o igual a la cantidad a sacar');
commit work;

SET TERM ^ ;

CREATE OR ALTER procedure LISTA_LOTES (
    ARTICULO varchar(15),
    BODEGA varchar(2),
    CANT numeric(18,4))
returns (
    LOTE varchar(15),
    SALDO numeric(18,4),
    VENCE date)
AS
BEGIN
  /* Muestra los lotes del artículo con existencia */
  for select lote_nro, lote_saldo, lote_vence from lotes
    where arti_cod = :articulo and BODE_COD = :bodega AND lote_saldo >= :cant and lote_saldo <> 0
    ORDER BY LOTE_VENCE, LOTE_ID
    into :lote, :saldo, :vence
    do
      SUSPEND;
END
^

SET TERM ; ^


SET TERM ^ ;

CREATE OR ALTER procedure SELECCIONE_LOTE (
    ARTICULO varchar(15),
    BODEGA varchar(2),
    CANT numeric(18,4))
returns (
    LOTE varchar(15))
AS
declare variable PEPS VARCHAR(4);
declare variable valcant VARCHAR(2);
BEGIN
EXECUTE PROCEDURE lee_configuracion('INVENTARIO', 'EXISTENCIAS', 'DINAMICA DE LOS LOTES DE MERCANCIA') returning_values (:PEPS);
EXECUTE PROCEDURE lee_configuracion('INVENTARIO', 'EXISTENCIAS', 'SUGERIR EL LOTE MAS NUEVO O MAS VIEJO SIN IMPORTAR LA CANTIDAD A SALIR') returning_values (:valcant);
if (PEPS = 'PEPS') then
    BEGIN
    if (VALCANT <> 'SI') then
        SELECT FIRST 1 LOTE_NRO FROM LOTES WHERE (ARTI_COD = :ARTICULO) AND (BODE_COD = :BODEGA) AND
            (LOTE_SALDO >= :CANT) ORDER BY LOTE_ID INTO :LOTE;
    ELSE
        SELECT FIRST 1 LOTE_NRO FROM LOTES WHERE (ARTI_COD = :ARTICULO) AND (BODE_COD = :BODEGA) AND
            (LOTE_SALDO > 0) ORDER BY LOTE_ID INTO :LOTE;
    END
ELSE
    BEGIN
    if (VALCANT <> 'SI') then
        SELECT FIRST 1 LOTE_NRO FROM LOTES WHERE (ARTI_COD = :ARTICULO) AND (BODE_COD = :BODEGA) AND
            (LOTE_SALDO >= :CANT) ORDER BY LOTE_ID DESC INTO :LOTE;
    ELSE
        SELECT FIRST 1 LOTE_NRO FROM LOTES WHERE (ARTI_COD = :ARTICULO) AND (BODE_COD = :BODEGA) AND
            (LOTE_SALDO > 0) ORDER BY LOTE_ID DESC INTO :LOTE;
    END
  SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER TRIGGER MOVIMIENTO_ARTICULO_BI
AS
declare variable LOTE CHAR(1);
declare variable ENSAMBLE CHAR(1);
declare variable IDENS INTEGER;
declare variable PREFENS VARCHAR(4);
declare variable unidad varchar(8);
declare variable DESCR varchar(60);
declare variable CODPR varchar(8);
declare variable DESPR varchar(60);
declare variable UNIPR varchar(8);
declare variable CANTPR numeric(18,4);
declare variable FACTOR numeric(18,4);
declare variable COSTO numeric(18,2);
declare variable COSTOTOT numeric(18,2);
declare variable ITEM INTEGER;
declare variable IVA NUMERIC(9,4);
declare variable IVAM NUMERIC(18,2);
declare variable CONSUMO NUMERIC(18,2);
BEGIN
/* INSERTE EL NUEVO LOTE */
SELECT ARTI_EXIST
    FROM   ARTICULO
    WHERE  ARTICULO.ARTI_COD = NEW.ARTI_COD
    INTO :LOTE;
if (LOTE = 'L') then
    BEGIN
      if ((NEW.mvar_lote IS NULL) or (NEW.mvar_lote = '')) then
        if (new.mvar_entrada = 'S') then
            new.mvar_lote = cast(new.mvar_cons as varchar(15));
        else
            begin
            /* NO HAY LOTE, ENTONCES CALCULELO SEGUN CONFIGURACION */
            EXCEPTION LOTE_NEGATIVO 'No se indicó un lote para el artículo ' || new.arti_cod;
            end
    END
/* ENSAMBLE EL PRODUCTO */
SELECT ARTI_ENSAMBLE, ARTI_UNIDAD, ARTI_DES FROM ARTICULO WHERE ARTI_COD = NEW.arti_cod INTO :ensamble, :unidad, :descr;
if ((NEW.mvar_entrada = 'N') AND (ENSAMBLE = 'S')) then
    BEGIN
    IDENS = gen_id(id_ensamble, 1);
    EXECUTE PROCEDURE lee_configuracion('INVENTARIO', 'ENSAMBLES', 'PREFIJO PARA ENSAMBLES AUTOMATICOS AL SACAR PRODUCTOS') returning_values (:prefens);
    INSERT INTO ENSAMBLES(ENSA_ID, TIDO_COD, PREF_PRE, BODE_COD, ENSA_NUMERO, ENSA_FECHA, ENSA_CONC, ENSA_REFER, ENSA_CANT, ENSA_UNIDAD, ENSA_FACTOR, ENSA_ANULADO, ENSA_TRANSMIT,
        ARTI_COD, ENSA_DESC, ENSA_CODBAR, ENSA_LOTE, ENSA_OBS, TERC_NIT, ENSA_USUARIO, NUMOK, ENSA_COSTO, LOTE_VENCE, ENSA_CODRETAL, ENSA_CANTRETAL, ENSA_OPER, ENSA_MAQUINA, ENSA_PESO, ENSA_BODRETAL, ENSA_TIPOREF, ENSA_IDREF)
        VALUES (:IDENS, 15, :prefens, NEW.bode_cod, '000001', new.mvar_fecha, new.mvar_conc, '', new.mvar_cant, :unidad, 1, 'N', 'N',
        NEW.arti_cod, :descr, NEW.arti_cod, NEW.mvar_lote, NULL, NULL, USER, 'N', NEW.mvar_costo, NULL, NULL, 0, null,  NULL, 0, NEW.bode_cod, NEW.mvar_tipodoc, NEW.mvar_idref);
    ITEM = 0;
    COSTOTOT = 0;
    FOR SELECT ARPR_CANT, ARPR_UNIDAD, ARPR_COMP, ARTI_DES, TAIV_PORC, ARTI_CONSUMO FROM articulos_producto P, ARTICULO A, TARIFA_IVA T
        WHERE P.ARTI_COD = NEW.arti_cod AND A.arti_cod = P.arpr_comp AND A.taiv_cod = T.taiv_cod
        INTO :CANTPR, :UNIPR, :CODPR, :DESPR, :IVA, :CONSUMO
        DO
        BEGIN
        ITEM = ITEM + 1;
        EXECUTE PROCEDURE costo_promedio_unidad (:codpr, NEW.mvar_fecha, :UNIPR) returning_values (:COSTO);
        EXECUTE PROCEDURE factor_unidad_cant(:codpr,  :unipr) returning_values (:FACTOR);
        COSTOTOT = COSTOTOT + COSTO * CANTPR;
        IVAM = costo * cantpr * iva / 100;
        INSERT INTO ENSAMBLES_DETALLE(ENSA_ID, ESDE_ITEM, ARTI_COD, BODE_COD, ESDE_CANT, ESDE_UNIDAD, ESDE_COSTO, ESDE_LOTE, ESDE_FACTOR, ESDE_IVAPORC, ESDE_IVAMONTO, ESDE_CONSUMO, ESDE_CODBAR, ESDE_ANULADO, ESDE_TRANSMIT, ESDE_DESC, ESDE_TOTAL, ESDE_PESO)
            VALUES (:idens, :ITEM, :codpr,  NEW.bode_cod, :cantpr, :unipr, :costo, NULL, :FACTOR, :IVA, :ivam, :consumo, :codpr, 'N', 'N', :despr, :COSTO * :cantpr, 0);
        END
    UPDATE ENSAMBLES SET ENSA_COSTO = :costotot WHERE ENSA_ID = :idens;
    END
if (new.mvar_cons is null) then
    NEW.mvar_cons = GEN_ID(ID_MOVARTI,1);
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER TRIGGER PEDIDOS_DETALLE_AI
as
declare variable CANTREL NUMERIC(18,2);
declare variable CONSO CHAR(2);
declare variable CONSOLIDA INTEGER;
declare variable IDENTR INTEGER;
declare variable COSTO NUMERIC(18,2);
declare variable IVA NUMERIC(9,2);
declare variable IVAM NUMERIC(18,2);
declare variable CONSUMO NUMERIC(18,2);
declare variable STAND VARCHAR(20);
declare variable LOTE VARCHAR(15);
declare variable FECHA DATE;
declare variable VLOTE DATE;
begin
if ((NEW.pedi_id <> 0) AND (NEW.pede_anulado = 'N')) then
    BEGIN
    SELECT PEDI_CONSOLIDA, PEDI_IDENTR, PEDI_FECHA FROM PEDIDOS WHERE PEDI_ID = NEW.PEDI_ID INTO :CONSOLIDA, :IDENTR, :FECHA;
    if (CONSOLIDA <> 0) then    
        begin
        UPDATE consolidado_faltantes SET COFA_OK = 'S' WHERE COFA_ID = :consolida AND COFA_ITEM = NEW.PEDE_ITEM AND ARTI_COD = NEW.arti_cod;
        EXECUTE procedure LEE_CONFIGURACION ('FACTURACION','DOCUMENTOS','DEJAR PENDIENTES LOS ARTICULOS NO INCLUIDOS AL TRAER DOCUMENTOS RELACIONADOS') returning_values (CONSO);
        if (CONSO = 'NO') then
            UPDATE consolidado_faltantes SET COFA_IDDES = NEW.pedi_id, COFA_OK = 'S' WHERE COFA_ID = :consolida;
        else
            BEGIN
            /* BUSQUE EL CONSOLIDADO EN EL MISMO ITEM Y SI ES DIFERENTE ACTUALICELO */
            select COFA_CANT FROM consolidado_faltantes WHERE COFA_ID = :consolida AND COFA_ITEM = NEW.PEDE_ITEM AND ARTI_COD = NEW.arti_cod INTO :CANTREL;
            if (NEW.PEDE_CANT * NEW.PEDE_FACTOR < CANTREL) then
                UPDATE consolidado_faltantes SET COFA_IDDES = NEW.pedi_id, COFA_CANT = NEW.PEDE_CANT * NEW.PEDE_FACTOR
                    WHERE COFA_ID = :consolida AND COFA_ITEM = NEW.PEDE_ITEM AND ARTI_COD = NEW.arti_cod;
            END
        end
    if (IDENTR <> 0) then
        begin
        EXECUTE PROCEDURE costo_promedio_unidad(NEW.arti_cod, :FECHA, NEW.pede_unidad) returning_values (:COSTO);
        SELECT ARTI_CONSUMO, TAIV_PORC FROM ARTICULO A, TARIFA_IVA T
            WHERE A.taiv_cod = T.taiv_cod AND A.arti_cod = NEW.arti_cod INTO :consumo, :iva;
        IVAM = COSTO * IVA;
/*        EXECUTE PROCEDURE seleccione_lote (NEW.arti_cod, NEW.bode_cod, NEW.pede_cant * NEW.pede_factor) returning_values (:LOTE);
        SELECT LOTE_VENCE FROM LOTES WHERE (ARTI_COD = NEW.arti_cod) AND (BODE_COD = NEW.bode_cod) AND (LOTE_NRO = :LOTE) INTO :VLOTE;*/
        SELECT STAND_COD FROM STANDS WHERE ARTI_COD = NEW.arti_cod AND STAND_BODEGA = NEW.bode_cod INTO :STAND;
        INSERT INTO ENTRADAS_DETALLE (ENTR_ID, ENDE_ITEM, ARTI_COD, BODE_COD, ENDE_CANT, ENDE_UNIDAD, ENDE_COSTO,
            ENDE_LOTE, ENDE_FACTOR, ENDE_DESC, ENDE_OBS, ENDE_DTOPORC, ENDE_DTOMONTO, ENDE_IVAPORC, ENDE_IVAMONTO,
            ENDE_CONSUMO, ENDE_CODBAR, ENDE_TOTAL, ENDE_ANULADO, ENDE_TRANSMIT, LOTE_VENCE, ENDE_STAND)
            VALUES(:IDENTR, NEW.pede_item, NEW.arti_cod, NEW.bode_cod, NEW.pede_cant, NEW.pede_unidad, :COSTO,
            :LOTE, NEW.pede_factor, NEW.pede_desc, NEW.pede_obs, 0, 0, :IVA, :IVAM,
            :CONSUMO, NEW.pede_codbar, :COSTO * NEW.pede_cant * NEW.pede_factor, 'N', 'N', :VLOTE, :STAND);
        end
    END
end
^

SET TERM ; ^

SET TERM ^ ;

ALTER TRIGGER PEDIDOS_DETALLE_AU
as
declare variable CANTREL NUMERIC(18,2);
declare variable CONSO CHAR(2);
declare variable CONSOLIDA INTEGER;
declare variable IDENTR INTEGER;
declare variable COSTO NUMERIC(18,2);
declare variable IVA NUMERIC(9,2);
declare variable IVAM NUMERIC(18,2);
declare variable CONSUMO NUMERIC(18,2);
declare variable STAND VARCHAR(20);
declare variable LOTE VARCHAR(15);
declare variable FECHA DATE;
declare variable VLOTE DATE;
begin
if ((OLD.pedi_id <> 0) AND (OLD.pede_anulado = 'N')) then
    BEGIN
    SELECT PEDI_CONSOLIDA, PEDI_IDENTR, PEDI_FECHA FROM PEDIDOS WHERE PEDI_ID = OLD.PEDI_ID INTO :CONSOLIDA, :IDENTR, :FECHA;
    if (CONSOLIDA <> 0) then
        BEGIN
        EXECUTE procedure LEE_CONFIGURACION ('FACTURACION','DOCUMENTOS','DEJAR PENDIENTES LOS ARTICULOS NO INCLUIDOS AL TRAER DOCUMENTOS RELACIONADOS') returning_values (CONSO);
        if (CONSO = 'SI') then
            UPDATE consolidado_faltantes SET COFA_IDDES = NEW.pedi_id, COFA_OK = 'N' WHERE COFA_ID = :consolida AND COFA_ITEM = OLD.PEDE_ITEM AND ARTI_COD = OLD.arti_cod;
        ELSE
            UPDATE consolidado_faltantes SET COFA_IDDES = NEW.pedi_id, COFA_OK = 'N' WHERE COFA_ID = :consolida;
        END
    if (IDENTR <> 0) then
        DELETE FROM ENTRADAS WHERE ENTR_ID = :IDENTR;
    END

if ((NEW.pedi_id <> 0) AND (NEW.pede_anulado = 'N')) then
    BEGIN
    SELECT PEDI_CONSOLIDA, PEDI_IDENTR, PEDI_FECHA FROM PEDIDOS WHERE PEDI_ID = NEW.PEDI_ID INTO :CONSOLIDA, :IDENTR, :FECHA;
    if (CONSOLIDA <> 0) then
        begin
        EXECUTE procedure LEE_CONFIGURACION ('FACTURACION','DOCUMENTOS','DEJAR PENDIENTES LOS ARTICULOS NO INCLUIDOS AL TRAER DOCUMENTOS RELACIONADOS') returning_values (CONSO);
        if (CONSO = 'NO') then
            UPDATE consolidado_faltantes SET COFA_IDDES = NEW.pedi_id, COFA_OK = 'S' WHERE COFA_ID = :consolida;
        else
            BEGIN
            UPDATE consolidado_faltantes SET COFA_OK = 'S' WHERE COFA_ID = :consolida AND COFA_ITEM = NEW.PEDE_ITEM AND ARTI_COD = NEW.arti_cod;
            /* BUSQUE EL CONSOLIDADO EN EL MISMO ITEM Y SI ES DIFERENTE ACTUALICELO */
            select COFA_CANT FROM consolidado_faltantes WHERE COFA_ID = :consolida AND COFA_ITEM = NEW.PEDE_ITEM AND ARTI_COD = NEW.arti_cod INTO :CANTREL;
            if (NEW.PEDE_CANT * NEW.PEDE_FACTOR < CANTREL) then
                UPDATE consolidado_faltantes SET COFA_IDDES = NEW.pedi_id, COFA_CANT = NEW.PEDE_CANT * NEW.PEDE_FACTOR
                    WHERE COFA_ID = :consolida AND COFA_ITEM = NEW.PEDE_ITEM AND ARTI_COD = NEW.arti_cod;
            END
        end
    if (IDENTR <> 0) then
        begin
        EXECUTE PROCEDURE costo_promedio_unidad(NEW.arti_cod, :FECHA, NEW.pede_unidad) returning_values (:COSTO);
        SELECT ARTI_CONSUMO, TAIV_PORC FROM ARTICULO A, TARIFA_IVA T
            WHERE A.taiv_cod = T.taiv_cod AND A.arti_cod = NEW.arti_cod INTO :consumo, :iva;
        IVAM = COSTO * IVA;
/*        EXECUTE PROCEDURE seleccione_lote (NEW.arti_cod, NEW.bode_cod, NEW.pede_cant * NEW.pede_factor) returning_values (:LOTE);
        SELECT LOTE_VENCE FROM LOTES WHERE (ARTI_COD = NEW.arti_cod) AND (BODE_COD = NEW.bode_cod) AND (LOTE_NRO = :LOTE) INTO :VLOTE;*/
        SELECT STAND_COD FROM STANDS WHERE ARTI_COD = NEW.arti_cod AND STAND_BODEGA = NEW.bode_cod INTO :STAND;
        INSERT INTO ENTRADAS_DETALLE (ENTR_ID, ENDE_ITEM, ARTI_COD, BODE_COD, ENDE_CANT, ENDE_UNIDAD, ENDE_COSTO,
            ENDE_LOTE, ENDE_FACTOR, ENDE_DESC, ENDE_OBS, ENDE_DTOPORC, ENDE_DTOMONTO, ENDE_IVAPORC, ENDE_IVAMONTO,
            ENDE_CONSUMO, ENDE_CODBAR, ENDE_TOTAL, ENDE_ANULADO, ENDE_TRANSMIT, LOTE_VENCE, ENDE_STAND)
            VALUES(:IDENTR, NEW.pede_item, NEW.arti_cod, NEW.bode_cod, NEW.pede_cant, NEW.pede_unidad, :COSTO,
            :LOTE, NEW.pede_factor, NEW.pede_desc, NEW.pede_obs, 0, 0, :IVA, :IVAM,
            :CONSUMO, NEW.pede_codbar, :COSTO * NEW.pede_cant * NEW.pede_factor, 'N', 'N', :VLOTE, :STAND);
        end
    END
end
^

SET TERM ; ^


/* 20091124 */
/* imprima nit o nombre del cliente en detalle del cuadre de caja */

SET TERM ^ ;

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

SET TERM ; ^

/* 20091125 */
/* MAL LA BASE DEL IVA SI IVA='K' Y SE DETALLAN LAS BASES, AHORA LA BASE ES LA SUMA DE BASE1 + BASE 2, SI NO SE DETALLAN BASES ASUMA QUE ES TODO DEL 16% */

SET TERM ^ ;

CREATE OR ALTER procedure CONTABIL_NOTADBPR (
    IDDOC integer,
    IDINTER integer)
returns (
    ERROR integer,
    VER char(1),
    IDC integer)
AS
declare variable PREF VARCHAR(4);
declare variable NUM VARCHAR(6);
declare variable NUMERO VARCHAR(10);
declare variable FECAUX DATE;
declare variable FECHA CHAR(8);
declare variable CONC CHAR(120);
declare variable VENCEAUX DATE;
declare variable VENCE CHAR(8);
declare variable VRSUBT NUMERIC(18, 2);
declare variable BASE0 NUMERIC(18, 2);
declare variable BASE1 NUMERIC(18, 2);
declare variable BASE2 NUMERIC(18, 2);
declare variable VRIVA NUMERIC(18, 2);
declare variable IVA1 NUMERIC(18, 2);
declare variable IVA2 NUMERIC(18, 2);
declare variable PRTFTE NUMERIC(9, 2);
declare variable VRRTFTE NUMERIC(18, 2);
declare variable PRTIVA NUMERIC(9, 2);
declare variable VRRTIVA NUMERIC(18, 2);
declare variable PRTICA NUMERIC(9, 2);
declare variable VRRTICA NUMERIC(18, 2);
declare variable VRTOTAL NUMERIC(18, 2);
declare variable TIPOCOMP VARCHAR(3);
declare variable PREFCONT VARCHAR(4);
declare variable BASE CHAR(1);
declare variable CTABASE VARCHAR(20);
declare variable IVA CHAR(1);
declare variable CTAIVA VARCHAR(20);
declare variable CLIE CHAR(1);
declare variable CTACLIE VARCHAR(20);
declare variable RTFTE CHAR(1);
declare variable CTARTFTE VARCHAR(20);
declare variable RTIVA CHAR(1);
declare variable CTARTIVA VARCHAR(20);
declare variable RTICA CHAR(1);
declare variable CTARTICA VARCHAR(20);
declare variable EXISTE CHAR(1);
declare variable CUENTA VARCHAR(20);
declare variable MONTO NUMERIC(18,2);
declare variable ES_RETENCION CHAR(1);
declare variable TIPOCUEN CHAR(1);
declare variable NIT VARCHAR(20);
declare variable PROY VARCHAR(4);
declare variable CENTRO VARCHAR(4);
declare variable MONTOBASE NUMERIC(18,2);
declare variable PORC NUMERIC(5,2);
declare variable DEBITO NUMERIC(18,2);
declare variable CREDITO NUMERIC(18,2);
declare variable NROI INTEGER;
declare variable SUMA NUMERIC(18,2);
declare variable TCTACLIEN VARCHAR(20);
declare variable TCTABASE VARCHAR(20);
declare variable TCTARTFTE VARCHAR(20);
declare variable TCTARTIVA VARCHAR(20);
declare variable TCTARTICA VARCHAR(20);
declare variable CUENTAADIC VARCHAR(20);
declare variable BASEADIC VARCHAR(20);
declare variable PORCADIC NUMERIC(5,2);
declare variable VALORADIC NUMERIC(18,2);
declare variable DBADIC CHAR(1);
declare variable NPROY VARCHAR(4);
declare variable NCENTRO VARCHAR(4);
declare variable ANULADO CHAR(1);
declare variable TARIFA INTEGER;
BEGIN
ERROR = 0;
/* BUSQUE LA INTERFACE */
EXISTE = 'N';
SELECT 'S', TICO_COD, PRCO_PRE, INCP_BASE, INCP_IVA, INCP_RTFTE, INCP_RTIVA, INCP_RTICA, INCP_PROV, INCP_CTABASE, INCP_CTAIVA, INCP_CTARTFTE, INCP_CTARTIVA, INCP_CTARTICA, INCP_CTAPROV, INCP_CONFIRMAR
    FROM INTERFAZ_CXPAGAR
    WHERE INCP_ID = :IDINTER
    INTO :EXISTE, :TIPOCOMP, :PREFCONT, :BASE, :IVA, :RTFTE, :RTIVA, :RTICA, :CLIE, :CTABASE, :CTAIVA, :CTARTFTE, :CTARTIVA, :CTARTICA, :CTACLIE, :VER;

if (EXISTE = 'S') then
  BEGIN
  /* BORRE CUALQUEIR CONTABILIZACION PREVIA */
  DELETE FROM CONTABILIZACION WHERE CNTB_TIPOREF = 51 AND CNTB_IDREF = :IDDOC;
  /* TRAIGA EL ENCABEZADO DE LA NOTA */
  SELECT PREF_PRE, NDPR_NUMERO, NDPR_FECHA, NDPR_VENCE, N.TERC_NIT, NDPR_CONC, NDPR_IVAPORC, NDPR_IVAMONTO, NDPR_MONTO, NDPR_RTFTEPORC, NDPR_RTFTEMONTO, NDPR_RTIVAPORC, NDPR_RTIVAMONTO, NDPR_RTICAPORC, NDPR_RTICAMONTO, TERC_CTAVENTA, TERC_CTARTFTE, TERC_CTARTIVA, TERC_CTARTICA, TERC_CTACLIENTE, NDPR_PROY, NDPR_CENTRO, NDPR_ANULADO, NDPR_BASE0, NDPR_BASE1, NDPR_BASE2, NDPR_IVA1, NDPR_IVA2
        FROM NOTAS_DEBITO_PROVEEDOR N, TERCEROS T
        WHERE NDPR_ID = :IDDOC AND N.TERC_NIT = T.TERC_NIT
        INTO :PREF, :NUM, :FECAUX, :VENCEAUX, :NIT, :CONC, :PORC, :VRIVA, :VRTOTAL, :PRTFTE, :VRRTFTE, :PRTIVA, :VRRTIVA, :PRTICA, :VRRTICA, :TCTABASE, TCTARTFTE, TCTARTIVA, TCTARTICA, TCTACLIEN, NPROY, NCENTRO, ANULADO, :BASE0, BASE1, :BASE2, :IVA1, :IVA2;
  if (ANULADO = 'N') then
    BEGIN
    /* SI ES PROVEEDOR, SOBREESCIBE LAS CUENTAS  */
    SELECT PROV_CTAPAGAR, PROV_CTARTFTE, PROV_CTARTIVA, PROV_CTARTICA, PROV_CTACAUSA
        FROM PROVEEDORES WHERE TERC_NIT = :NIT
        INTO TCTACLIEN, TCTARTFTE, TCTARTIVA, TCTARTICA, TCTABASE;
        
    /* SI EL DOCUMENTO ESPECIFICA ALGUNAS SOBRESCRIBA LAS DEL PROVEEDOR */
    SELECT NDPR_CTAPAGAR, NDPR_CTACAUSA
        FROM NOTAS_DEBITO_PROVEEDOR
        WHERE NDPR_ID = :IDDOC
        INTO :TCTACLIEN, TCTABASE;
    SELECT PREF_CENTRO, PREF_PROY FROM PREFIJOS P, NOTAS_DEBITO_PROVEEDOR N
        WHERE P.PREF_PRE = N.PREF_PRE AND P.TIDO_COD = 51 AND N.NDPR_ID = :IDDOC INTO :CENTRO, :PROY;
    if (NPROY <> '') then
        PROY = NPROY;
    if (NCENTRO <> '') then
        CENTRO = NCENTRO;
    NUMERO = PREF || NUM;
    VRSUBT = VRTOTAL; /* BASE DE RETEFTE Y RETEICA */

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

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

    NROI = 0;
    SUMA = 0;

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

        if (VRSUBT <> 0) then
            BEGIN
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO, CUEN_RETENCION FROM CUENTAS
                WHERE CUEN_COD = :CTABASE INTO :CUENTA, :TIPOCUEN, :ES_RETENCION;
            if (CUENTA IS NULL) then
                begin
                INSERT INTO  ERRORES (ERRO_ITEM, ERRO_TIPODOC, ERRO_IDDOC, ERRO_CODIGO, ERRO_CANT, ERRO_CADENA)
                    VALUES(GEN_ID(id_errores, 1), 51, :IDDOC, 'CUENTA NO EXISTE', 0, :CTABASE);
                CUENTA = CTABASE;
                ERROR = ERROR + 1;
                end
            if (ES_RETENCION = 'S') then
                if ((prtiva <> 0) and (vriva = 0)) then
                    montobase = FLOOR(VRSUBT / prtiva);
                else
                    montobase = VRSUBT;
            else
                montobase = 0;
            if (TIPOCUEN = 'I') then
                BEGIN
                INSERT INTO  ERRORES (ERRO_ITEM, ERRO_TIPODOC, ERRO_IDDOC, ERRO_CODIGO, ERRO_CANT, ERRO_CADENA)
                    VALUES(GEN_ID(id_errores, 1), 51, :IDDOC, 'CUENTA DE INVENTARIO', 0, :CUENTA);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRSUBT, 0, :MONTOBASE, :prtiva, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 41);
                NROI = NROI + 1;
                SUMA = SUMA + VRSUBT;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRSUBT, 0, :MONTOBASE, :prtiva, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA + VRSUBT;
                END
            END /* MONTO <> 0 */
        END /* BASE TERCERO O CONSTANTE */
    IF ((BASE = 'I')) THEN
        BEGIN
        FOR SELECT TAIV_CTACOMP, TAIV_COD FROM TARIFA_IVA WHERE TAIV_COD <= 2 INTO :CTABASE, :tarifa
            DO
            BEGIN
            if (TARIFA = 0) then
                vrsubt = BASE0;
            if (TARIFA = 1) then
                vrsubt = BASE1;
            if (TARIFA = 2) then
                vrsubt = BASE2;
            if (VRSUBT <> 0) then
                BEGIN
                CUENTA = NULL;
                SELECT CUEN_COD, CUEN_TIPO, CUEN_RETENCION FROM CUENTAS
                    WHERE CUEN_COD = :CTABASE INTO :CUENTA, :TIPOCUEN, :ES_RETENCION;
                if (CUENTA IS NULL) then
                    begin
                    INSERT INTO  ERRORES (ERRO_ITEM, ERRO_TIPODOC, ERRO_IDDOC, ERRO_CODIGO, ERRO_CANT, ERRO_CADENA)
                        VALUES(GEN_ID(id_errores, 1), 51, :IDDOC, 'CUENTA NO EXISTE', 0, :CTABASE);
                    CUENTA = CTABASE;
                    ERROR = ERROR + 1;
                    end
                montobase = 0;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    INSERT INTO  ERRORES (ERRO_ITEM, ERRO_TIPODOC, ERRO_IDDOC, ERRO_CODIGO, ERRO_CANT, ERRO_CADENA)
                        VALUES(GEN_ID(id_errores, 1), 51, :IDDOC, 'CUENTA DE INVENTARIO', 0, :CUENTA);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRSUBT, 0, :MONTOBASE, :prtiva, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 41);
                    NROI = NROI + 1;
                    SUMA = SUMA + VRSUBT;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRSUBT, 0, :MONTOBASE, :prtiva, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA + VRSUBT;
                    END
                END /* MONTO <> 0 */
            END
        END /* BASE TARIFA DE IVA */

    if (IVA = 'I') then /* IVA POR TARIFA */
        BEGIN
        FOR SELECT TAIV_CTAIVACMP, TAIV_COD, TAIV_PORC FROM TARIFA_IVA WHERE (TAIV_COD <> 0) AND (TAIV_COD <= 2) INTO :CTAIVA, :tarifa, :PORC
            DO
            BEGIN
            if (TARIFA = 1) then
                BEGIN
                vrsubt = BASE1;
                VRIVA = IVA1;
                END
            if (TARIFA = 2) then
                BEGIN
                VRIVA = IVA2;
                vrsubt = BASE2;
                END
            if (VRIVA <> 0) then
                BEGIN
                CUENTA = NULL;
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :CTAIVA INTO :CUENTA, :TIPOCUEN;
                if (CUENTA IS NULL) then
                    begin
                    INSERT INTO  ERRORES (ERRO_ITEM, ERRO_TIPODOC, ERRO_IDDOC, ERRO_CODIGO, ERRO_CANT, ERRO_CADENA)
                        VALUES(GEN_ID(id_errores, 1), 51, :IDDOC, 'CUENTA NO EXISTE', 0, :CTAIVA);
                    CUENTA = CTAIVA;
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    INSERT INTO  ERRORES (ERRO_ITEM, ERRO_TIPODOC, ERRO_IDDOC, ERRO_CODIGO, ERRO_CANT, ERRO_CADENA)
                        VALUES(GEN_ID(id_errores, 1), 51, :IDDOC, 'CUENTA DE INVENTARIO', 0, :CUENTA);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', :VRIVA, 0, :vrsubt, :porc, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 41);
                    NROI = NROI + 1;
                    SUMA = SUMA + VRIVA;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', :VRIVA, 0, :vrsubt, :porc, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA + VRIVA;
                    END
                END /* VRIVA <> 0 */
            end /* FOR */
        END /* IVA EN CTA CONSTANTE */
        
    VRSUBT = VRTOTAL; /* BASE DE RETEFTE Y RETEICA */
    if (IVA = 'K') then /* IVA EN CTA CONSTANTE */
        BEGIN
        if (VRIVA <> 0) then
            BEGIN
            /* si no discrimino tarifas, asuma el subtotal como base del iva */
            if ((base1 = 0) and (base2 = 0)) then
                base1 = vrsubt;
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTAIVA INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                INSERT INTO  ERRORES (ERRO_ITEM, ERRO_TIPODOC, ERRO_IDDOC, ERRO_CODIGO, ERRO_CANT, ERRO_CADENA)
                    VALUES(GEN_ID(id_errores, 1), 51, :IDDOC, 'CUENTA NO EXISTE', 0, :CTAIVA);
                CUENTA = CTAIVA;
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                INSERT INTO  ERRORES (ERRO_ITEM, ERRO_TIPODOC, ERRO_IDDOC, ERRO_CODIGO, ERRO_CANT, ERRO_CADENA)
                    VALUES(GEN_ID(id_errores, 1), 51, :IDDOC, 'CUENTA DE INVENTARIO', 0, :CUENTA);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', :VRIVA, 0, (:base1+:base2), :porc, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 41);
                NROI = NROI + 1;
                SUMA = SUMA + VRIVA;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', :VRIVA, 0, (:base1+:base2), :porc, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA + VRIVA;
                END
            END /* VRIVA <> 0 */
        END /* IVA EN CTA CONSTANTE */
        
    /* RETENCION FUENTE */
    if ((RTFTE = 'T') or (RTFTE = 'K')) then
      if (VRRTFTE <> 0) then
        BEGIN
        if (RTFTE = 'T') then
            CTARTFTE = TCTARTFTE;
            
        CUENTA = NULL;
        SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
            WHERE CUEN_COD = :CTARTFTE INTO :CUENTA, :TIPOCUEN;
        if (CUENTA IS NULL) then
            begin
            INSERT INTO  ERRORES (ERRO_ITEM, ERRO_TIPODOC, ERRO_IDDOC, ERRO_CODIGO, ERRO_CANT, ERRO_CADENA)
                VALUES(GEN_ID(id_errores, 1), 51, :IDDOC, 'CUENTA NO EXISTE', 0, :CTARTFTE);
            CUENTA = CTARTFTE;
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            INSERT INTO  ERRORES (ERRO_ITEM, ERRO_TIPODOC, ERRO_IDDOC, ERRO_CODIGO, ERRO_CANT, ERRO_CADENA)
                    VALUES(GEN_ID(id_errores, 1), 51, :IDDOC, 'CUENTA DE INVENTARIO', 0, :CUENTA);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, (:VRSUBT*-1), :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 41);
            NROI = NROI + 1;
            SUMA = SUMA - VRRTFTE;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, (:VRSUBT*-1), :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA - VRRTFTE;
            END
        END /* RTFTE */
        
    /* RETENCION IVA */
    if ((RTIVA = 'T') or (RTIVA = 'K')) then
      if (VRRTIVA <> 0) then
        BEGIN
        if (RTIVA = 'T') then
            CTARTIVA = TCTARTIVA;
            
        CUENTA = NULL;
        SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
            WHERE CUEN_COD = :CTARTIVA INTO :CUENTA, :TIPOCUEN;
        if (CUENTA IS NULL) then
            begin
            INSERT INTO  ERRORES (ERRO_ITEM, ERRO_TIPODOC, ERRO_IDDOC, ERRO_CODIGO, ERRO_CANT, ERRO_CADENA)
                VALUES(GEN_ID(id_errores, 1), 51, :IDDOC, 'CUENTA NO EXISTE', 0, :CTARTIVA);
            CUENTA = CTARTIVA;
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            INSERT INTO  ERRORES (ERRO_ITEM, ERRO_TIPODOC, ERRO_IDDOC, ERRO_CODIGO, ERRO_CANT, ERRO_CADENA)
                VALUES(GEN_ID(id_errores, 1), 51, :IDDOC, 'CUENTA DE INVENTARIO', 0, :CUENTA);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTIVA, (:VRIVA*-1), :prtiva, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 41);
            NROI = NROI + 1;
            SUMA = SUMA - VRRTIVA;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTIVA, (:VRIVA*-1), :prtiva, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA - VRRTIVA;
            END
        END /* RTIVA */
        
    /* RETENCION DE ICA */
    if ((RTICA = 'T') or (RTICA = 'K')) then
      if (VRRTICA <> 0) then
        BEGIN
        if (RTICA = 'T') then
            CTARTICA = TCTARTICA;
            
        CUENTA = NULL;
        SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
            WHERE CUEN_COD = :CTARTICA INTO :CUENTA, :TIPOCUEN;
        if (CUENTA IS NULL) then
            begin
            INSERT INTO  ERRORES (ERRO_ITEM, ERRO_TIPODOC, ERRO_IDDOC, ERRO_CODIGO, ERRO_CANT, ERRO_CADENA)
                    VALUES(GEN_ID(id_errores, 1), 51, :IDDOC, 'CUENTA NO EXISTE', 0, :CTARTICA);
            CUENTA = CTARTICA;
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            INSERT INTO  ERRORES (ERRO_ITEM, ERRO_TIPODOC, ERRO_IDDOC, ERRO_CODIGO, ERRO_CANT, ERRO_CADENA)
                VALUES(GEN_ID(id_errores, 1), 51, :IDDOC, 'CUENTA DE INVENTARIO', 0, :CUENTA);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTICA, (:VRSUBT*-1), :PRTICA, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 41);
            NROI = NROI + 1;
            SUMA = SUMA - VRRTICA;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTICA, (:VRSUBT*-1), :PRTICA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA - VRRTICA;
            END
        END /* RTICA */
        
    /* recorra las cuentas adicionales */
    FOR SELECT INPC_CUENTA, INPC_BASE, INPC_PORC, INPC_VALOR, INPC_DB
        FROM INTERFAZ_CXPAGAR_CTAS
        WHERE INCP_ID = :IDINTER
        INTO :CUENTAADIC, :BASEADIC, :PORCADIC, :VALORADIC, :DBADIC
        DO
        BEGIN
        if (:BASEADIC = 'SUBTOTAL') then
            VALORADIC = VRTOTAL - VRIVA;
        if (:BASEADIC = 'IVA') then
            VALORADIC = VRIVA;
        if (:BASEADIC = 'TOTAL') then
            VALORADIC = VRTOTAL;
        MONTO = VALORADIC * PORCADIC;
        
        /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
        CUENTA = NULL;
        SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
            WHERE CUEN_COD = :CUENTAADIC INTO :CUENTA, :TIPOCUEN;
        IF (CUENTA IS NULL) THEN
            begin
            INSERT INTO  ERRORES (ERRO_ITEM, ERRO_TIPODOC, ERRO_IDDOC, ERRO_CODIGO, ERRO_CANT, ERRO_CADENA)
                    VALUES(GEN_ID(id_errores, 1), 51, :IDDOC, 'CUENTA NO EXISTE', 0, :CUENTAADIC);
            CUENTA = CUENTAADIC;
            ERROR = ERROR + 1;
            end
        /* DEPENDE DEL TIPO DE CUENTA */
        if (TIPOCUEN = 'I') then
            BEGIN
            INSERT INTO  ERRORES (ERRO_ITEM, ERRO_TIPODOC, ERRO_IDDOC, ERRO_CODIGO, ERRO_CANT, ERRO_CADENA)
                VALUES(GEN_ID(id_errores, 1), 51, :IDDOC, 'CUENTA DE INVENTARIO', 0, :CUENTA);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            if (DBADIC = 'S') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTAADIC, :CONC, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 31);
                SUMA = SUMA + MONTO;
                END
            ELSE
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTAADIC, :CONC, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 31);
                SUMA = SUMA - MONTO;
                END
            NROI = NROI + 1;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            if (DBADIC = 'S') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTAADIC, :CONC, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                SUMA = SUMA + MONTO;
                END
            ELSE
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTAADIC, :CONC, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                SUMA = SUMA - MONTO;
                END
            NROI = NROI + 1;
            END
        
        NROI = NROI + 1;
        END
        
    /* CIERRE EL COMPROBANTE CONTRA LA CUENTA DEL TERCERO O LA CONSTANTE */
    if ((SUMA <> 0) and ((CLIE = 'T') or (CLIE = 'K'))) then
        BEGIN
        if (SUMA < 0) then
            BEGIN
            DEBITO = SUMA * -1;
            CREDITO = 0;
            END
        ELSE
            BEGIN
            DEBITO = 0;
            CREDITO = SUMA;
            END
        if (CLIE = 'T') then
            CTACLIE = TCTACLIEN;

        CUENTA = NULL;
        SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
            WHERE CUEN_COD = :CTACLIE INTO :CUENTA, :TIPOCUEN;
        IF (CUENTA IS NULL) then
            begin
            INSERT INTO  ERRORES (ERRO_ITEM, ERRO_TIPODOC, ERRO_IDDOC, ERRO_CODIGO, ERRO_CANT, ERRO_CADENA)
                VALUES(GEN_ID(id_errores, 1), 51, :IDDOC, 'CUENTA NO EXISTE', 0, :CTACLIE);
            CUENTA = CTACLIE;
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            INSERT INTO  ERRORES (ERRO_ITEM, ERRO_TIPODOC, ERRO_IDDOC, ERRO_CODIGO, ERRO_CANT, ERRO_CADENA)
                VALUES(GEN_ID(id_errores, 1), 51, :IDDOC, 'CUENTA DE INVENTARIO', 0, :CUENTA);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :DEBITO, :CREDITO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 41);
        if (TIPOCUEN = 'N') then
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :DEBITO, :CREDITO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
        NROI = NROI + 1;
        END /* SUMA EN CARTERA */
    if (ERROR > 0) then
        VER = 'S';
    SUSPEND;
    END /* ANULADO */
  END /* EXISTE LA INTERFAZ */
ELSE
    BEGIN
    INSERT INTO  ERRORES (ERRO_ITEM, ERRO_TIPODOC, ERRO_IDDOC, ERRO_CODIGO, ERRO_CANT, ERRO_CADENA)
        VALUES(GEN_ID(id_errores, 1), 51, :IDDOC, 'INTERFAZ NO EXISTE', 0, :pref);
    ERROR = ERROR + 1;
    VER = 'S';
    SUSPEND;
    END
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE NOTADBPR_SIN_CONTABILIDAD(
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    ID INTEGER,
    IDI INTEGER,
    IDC INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    ESTADO VARCHAR(20),
    ERROR INTEGER)
AS
DECLARE VARIABLE VER CHAR(2);
declare variable FECICNT VARCHAR(10);
declare variable FECFCNT VARCHAR(10);
declare variable idref INTEGER;
BEGIN
EXECUTE PROCEDURE fecha_a_conta(FECINI) returning_values (FECICNT);
EXECUTE PROCEDURE fecha_a_conta(FECFIN) returning_values (FECFCNT);
FOR SELECT NDPR_ID, PREF_PRE, NDPR_NUMERO FROM NOTAS_DEBITO_PROVEEDOR WHERE NDPR_ANULADO = 'N' AND
    NDPR_FECHA >= :FECINI AND NDPR_FECHA <= :FECFIN
    ORDER BY NDPR_ID INTO :ID, :PREF, :NUMERO
DO
  BEGIN
  idref = null;
  SELECT ENCO_IDREF FROM COMPROBANTE_ENCABEZADO WHERE ENCO_TIPOREF = 51 AND ENCO_FECHA >= :FECICNT AND ENCO_FECHA <= :FECFCNT and ENCO_IDREF = :id into :idref;
  if (idref IS NULL) then
  begin
  ESTADO = 'PROCESANDO';
  SUSPEND;
  SELECT MAX(INCA_ID) FROM INTERFAZ_CARTERA WHERE PREF_PRE = :PREF AND TIDO_COD = 51 INTO :IDI;
  if (IDI IS NOT NULL) then
    BEGIN
    EXECUTE PROCEDURE CONTABIL_NOTADBPR (:ID, :IDI) RETURNING_VALUES (:ERROR, :VER, :IDC);
    if (ERROR = 0) then
      BEGIN
      EXECUTE PROCEDURE CONTABILIZA_PENDIENTE (:IDC);
      ESTADO = 'OK';
      END
    ELSE
      ESTADO = 'ERROR';
    suspend;
    END
  end
  END
END

^

SET TERM ; ^

/* 20091126 */
/* SI EL VENDEDOR CAMBIA CON RESPECTO AL ASESOR NO SALE EL EVENTO EN LA BUSQUEDA */
SET TERM ^ ;

CREATE OR ALTER procedure BUSQUEDA_EVENTOS_CLI (
    NIT varchar(20))
returns (
    ID integer,
    FECHA date,
    HORA time,
    MOTIVO varchar(60),
    TIPO varchar(60),
    ASESOR varchar(60),
    RESPUESTA varchar(60),
    EXPLICA varchar(255))
AS
declare variable RESPTA INTEGER;
declare variable IDASES INTEGER;
declare variable IDMOTI INTEGER;
begin
FOR SELECT CREV_ID, CREV_FECHA, CREV_HORA, CRTE_NOMBRE, crev_motivo, CREV_ASESOR, CREV_RESPUESTA, CREV_EXPLICA
    FROM CRM_EVENTOS E, CRM_TIPOEVENTO T
    WHERE E.crev_tipo = T.crte_id AND CRCL_NIT = :NIT AND CREV_ANULADO = 'N'
    ORDER BY CREV_FECHA DESC, CREV_HORA DESC
    INTO :id, :fecha, :hora, :tipo, :idmoti, :idases, :respta, :explica
    DO
    BEGIN
    MOTIVO = '';
    SELECT CREM_NOMBRE FROM CRM_EVENTO_MOTIVO WHERE crem_id = :idmoti INTO :motivo;
    ASESOR = '';
    SELECT CRAS_NOMBRE FROM crm_asesor WHERE cras_id = :idases INTO :asesor;
    if ((ASESOR = '') or (ASESOR IS NULL)) then
        SELECT VEND_NOMBRE FROM vendedores WHERE VEND_COD = :idases INTO :asesor;
    respuesta = '';
    SELECT CRER_NOMBRE FROM crm_evento_respuesta WHERE CRER_ID = :respta INTO :respuesta;
    suspend;
    END
end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure BUSQUEDA_EVENTOS
returns (
    ID integer,
    FECHA date,
    HORA time,
    NIT varchar(20),
    NOMBRE varchar(60),
    MOTIVO varchar(60),
    TIPO varchar(60),
    ASESOR varchar(60),
    RESPUESTA varchar(60),
    EXPLICA varchar(255),
    ANULADO char(1))
AS
declare variable RESPTA INTEGER;
declare variable IDASES INTEGER;
declare variable IDMOTI INTEGER;
begin
FOR SELECT CREV_ID, CREV_FECHA, CREV_HORA, CRTE_NOMBRE, crev_motivo, crev_asesor, CREV_RESPUESTA, CREV_EXPLICA, CRCL_NIT, CREV_ANULADO
    FROM CRM_EVENTOS E, CRM_TIPOEVENTO T, CRM_EVENTO_MOTIVO M
    WHERE E.crev_tipo = T.crte_id AND CREV_ANULADO = 'N'
    ORDER BY CREV_FECHA DESC, CREV_HORA DESC
    INTO :id, :fecha, :hora, :tipo, :idmoti, :idases, :respta, :explica, :NIT, :anulado
    DO
    BEGIN
    MOTIVO = '';
    SELECT CREM_NOMBRE FROM CRM_EVENTO_MOTIVO WHERE crem_id = :idmoti INTO :motivo;
    asesor = '';
    SELECT CRAS_NOMBRE FROM crm_asesor WHERE cras_id = :idases INTO :asesor;
    if ((ASESOR = '') or (ASESOR IS NULL)) then
        SELECT VEND_NOMBRE FROM vendedores WHERE VEND_COD = :idases INTO :asesor;
    respuesta = '';
    NOMBRE = '';
    SELECT CRCL_NOM FROM crm_clientes WHERE CRCL_NIT = :nit INTO :nombre;
    SELECT CRER_NOMBRE FROM crm_evento_respuesta WHERE CRER_ID = :respta INTO :respuesta;
    suspend;
    END
end
^

SET TERM ; ^

/* 20091127 */
/* compromisos semiautomáticos al grabr cotizaciones y pedidos */
INSERT INTO CONFIGURACION (CONF_MODULO, CONF_CATEGORIA, CONF_PROPIEDAD, CONF_VALOR, CONF_POSIBLES, CONF_AYUDA) VALUES ('CRM', 'COMPROMISOS', 'GENERAR COMPROMISO DE CONFIRMACION DE COTIZACIONES', 'SI', 'SI,NO', 'SI: Abre la ventana de compromiso para confirmar la recepción de la cotización.');
INSERT INTO CONFIGURACION (CONF_MODULO, CONF_CATEGORIA, CONF_PROPIEDAD, CONF_VALOR, CONF_POSIBLES, CONF_AYUDA) VALUES ('CRM', 'COMPROMISOS', 'GENERAR COMPROMISO PARA TOMA DEL PROXIMO PEDIDO', 'SI', 'SI,NO', 'SI: Abre la ventana de compromiso para recordar la toma del próximo pedido.');
commit work;

/* 20091128 */

CREATE TABLE CONCILIA_BANCO_CONTA_AUX (
    COBC_TIPO INTEGER NOT NULL,
    COBC_ID INTEGER NOT NULL);
alter table CONCILIA_BANCO_CONTA_AUX
add constraint PK_CONCILIA_BANCO_CONTA_AUX
primary key (COBC_TIPO,COBC_ID);

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

SET TERM ^ ;

CREATE or ALTER PROCEDURE CONCILIA_BANCO_CONTA(
    FECINI DATE,
    FECFIN DATE,
    BANCO VARCHAR(3),
    CTABANCO VARCHAR(20),
    NULO1 CHAR(1))
RETURNS (
    FECHA DATE,
    TIPODOC VARCHAR(10),
    TIPO INTEGER,
    ID INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    FECCONTA CHAR(10),
    MONTO NUMERIC(18,2),
    MONTOC NUMERIC(18,2),
    DIFERENCIA NUMERIC(18,2))
AS
declare variable FECINIC char(10);
declare variable FECFINC char(10);
declare variable db char(1);
begin
DELETE FROM concilia_banco_conta_aux;
FOR select m.moba_tipodoc, m.moba_idref, m.moba_total, m.moba_fecha, m.moba_pref, m.moba_numero, m.moba_db
    from movimiento_banco m, cuentas_banco c
    where c.cuba_cod = m.cuba_cod and c.cuba_codcta = :banco and m.moba_fecha >= :FECINI and m.moba_fecha <= :FECFIN
    into :TIPO, :ID, :monto, :fecha, :pref, :numero, :db
    DO
    BEGIN
    SELECT TIDO_NOMCORTO FROM tipo_documento WHERE TIDO_COD = :tipo INTO :tipodoc;
    if (db = 'N') then
        monto = monto * -1;
    /* BUSQUE EL CONTABLE */
    montoc = NULL;
    if (TIPO = 72) then
        begin
        TIPO = 62;
        select ch.cheq_idegreso from cheques ch where ch.cheq_id = :id into :id;
        end
    if (TIPO = 73) then
        begin
        TIPO = 62;
        select r.reti_idegreso from retiros r where r.reti_id = :id into :id;
        end

    SELECT CODE_DEBITO-CODE_CREDITO FROM comprobante_detalle D, comprobante_encabezado C
        where C.enco_consec = D.enco_consec AND C.enco_tiporef = :TIPO AND C.enco_idref = :ID AND D.cuen_cod = :ctabanco
        INTO :montoc;
    diferencia = (monto - montoc);
    if (DIFERENCIA <> 0) then
        SUSPEND;
    INSERT INTO concilia_banco_conta_aux (COBC_TIPO, COBC_ID) VALUES(:TIPO, :ID);
    END
/* AGREGUE LAS QUE NO TIENEN MOVBANCO */
fecha = null;
monto = 0;
EXECUTE PROCEDURE fecha_a_conta (:FECINI) returning_values (:FECINIC);
EXECUTE PROCEDURE fecha_a_conta (:FECFIN) returning_values (:FECFINC);
FOR SELECT e.tico_cod, e.enco_fecha, e.prco_pref, e.enco_numero, CODE_DEBITO-CODE_CREDITO, e.enco_tiporef, e.enco_idref FROM comprobante_detalle D, comprobante_encabezado e
    where e.enco_consec = D.enco_consec AND CUEN_COD = :ctabanco AND e.enco_fecha >= :fecinic AND e.enco_fecha <= :fecfinc AND
    not exists (select cobc_id FROM concilia_banco_conta_aux WHERE cobc_tipo = e.enco_tiporef and cobc_id = e.enco_idref)
    INTO :tipodoc, :fecconta, :pref, :numero, :montoc, :tipo, :id
    do
    BEGIN
    diferencia = montoc;
    SUSPEND;
    END
end
^

SET TERM ; ^

SET TERM ^ ;

CREATE or ALTER PROCEDURE CONCILIA_CAJA(
    FECINI DATE,
    FECFIN DATE,
    CAJA INTEGER,
    CTACAJA VARCHAR(20),
    NULO1 CHAR(1))
RETURNS (
    FECHA DATE,
    TIPODOC VARCHAR(10),
    TIPO INTEGER,
    ID INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    FECCONTA CHAR(10),
    DEBITOS NUMERIC(18,2),
    CREDITOS NUMERIC(18,2),
    DEBITOSC NUMERIC(18,2),
    CREDITOSC NUMERIC(18,2),
    DIFERENCIA NUMERIC(18,2))
AS
declare variable FECINIC char(10);
declare variable FECFINC char(10);
begin
FOR select m.moca_tiporef, m.moca_idref, m.moca_debitos, m.moca_creditos, m.moca_fecha, m.moca_prefref, m.moca_numref
    from movimiento_caja m
    where caja_id = :caja and m.moca_fecha >= :FECINI and m.moca_fecha <= :FECFIN
    into :TIPO, :ID, :debitos, :creditos, :fecha, :pref, :numero
    DO
    BEGIN
    SELECT TIDO_NOMCORTO FROM tipo_documento WHERE TIDO_COD = :tipo INTO :tipodoc;
    /* BUSQUE EL CONTABLE */
    debitosc = NULL;
    creditosc = NULL;
    SELECT CODE_DEBITO, CODE_CREDITO FROM comprobante_detalle D, comprobante_encabezado C
        where C.enco_consec = D.enco_consec AND C.enco_tiporef = :TIPO AND C.enco_idref = :ID AND D.cuen_cod = :ctacaja
        INTO :debitosc, :creditosc;
    diferencia = (debitos - debitosc) - (creditos - creditosc);
    if (DIFERENCIA <> 0) then
        SUSPEND;
    END
/* AGREGUE LAS QUE NO ESTAN EN MOVCAJA */
fecha = null;
debitos = 0;
creditos = 0;
EXECUTE PROCEDURE fecha_a_conta (:FECINI) returning_values (:FECINIC);
EXECUTE PROCEDURE fecha_a_conta (:FECFIN) returning_values (:FECFINC);
FOR SELECT C.tico_cod, C.enco_fecha, C.prco_pref, C.enco_numero, CODE_DEBITO, CODE_CREDITO FROM comprobante_detalle D, comprobante_encabezado C
    where C.enco_consec = D.enco_consec AND CUEN_COD = :ctacaja AND C.enco_fecha >= :fecinic AND C.enco_fecha <= :fecfinc AND
    not exists (select moca_id from movimiento_caja where caja_id = :caja and moca_fecha >= :FECINI and moca_fecha <= :FECFIN and moca_tiporef = c.enco_tiporef and moca_idref = c.enco_idref)
    INTO :tipodoc, :fecconta, :pref, :numero, :debitosc, :creditosc
    do
    BEGIN
    diferencia = debitosc - creditosc;
    SUSPEND;
    END
end

^

SET TERM ; ^

/* 20091129 */
/* orden de los movimientos de caja en reporte detallado agrupaba por tipo, ahora estrictamente en orden de registro */
SET TERM ^ ;

CREATE OR ALTER procedure MOV_DETALLE_CAJAS (
    FECINI date,
    FECFIN date,
    CAJINI integer,
    CAJFIN integer,
    DETALLE char(1),
    SUCURSAL integer)
returns (
    FECHA date,
    TIPO varchar(8),
    PREFIJO varchar(4),
    NUMERO varchar(6),
    DBEFECTIVO numeric(18,2),
    DBCHEQUES numeric(18,2),
    CREFECTIVO numeric(18,2),
    CRCHEQUES numeric(18,2),
    SALDO numeric(18,2),
    CONCEPTO varchar(60),
    TERCERO varchar(60),
    ENCARGADO varchar(60),
    CAJA varchar(60),
    SALDOINICIAL numeric(18,2),
    CODIGO integer)
AS
declare variable DB CHAR(1);
declare variable ID INTEGER;
declare variable NUMROWS INTEGER;
declare variable TIPOCOD INTEGER;
declare variable DEBITO NUMERIC(18,2);
declare variable CREDITO NUMERIC(18,2);
BEGIN
FOR SELECT CAJA_ID,CAJA_NOMBRE,CAJA_RESP
  FROM CAJAS
  WHERE CAJA_ID >= :CAJINI AND CAJA_ID <= :CAJFIN AND CAJA_ACTIVA = 'S' AND ((SUCU_ID = :SUCURSAL) or (:SUCURSAL = 0))
  ORDER BY CAJA_ID
  INTO :CODIGO,:CAJA,:ENCARGADO
  DO
  begin
  if (DETALLE = 'S') then
    BEGIN
    EXECUTE PROCEDURE SALDO_EN_CAJA(:CODIGO, :FECINI) returning_values(:SALDOINICIAL);
    SALDO =SALDOINICIAL;
    SELECT COUNT(MOCA_ID) FROM MOVIMIENTO_CAJA
        WHERE CAJA_ID = :CODIGO AND MOCA_FECHA >= :FECINI AND MOCA_FECHA <= :FECFIN INTO :NUMROWS;
    if (NUMROWS = 0) then
        BEGIN
        TIPO = '';
        PREFIJO = '';
        NUMERO = '';
        CONCEPTO = '';
        tercero = '';
        DEBITO = 0;
        CREDITO = 0;
        DBEFECTIVO = 0;
        CREFECTIVO = 0;
        DBCHEQUES = 0;
        CRCHEQUES = 0;
        SUSPEND;
        END
    ELSE
    FOR SELECT MOCA_TIPOREF, MOCA_IDREF, MOCA_FECHA, TIDO_NOMCORTO, MOCA_PREFREF, MOCA_NUMREF, MOCA_CONC, MOCA_DB, MOCA_DEBITOS, MOCA_CREDITOS
        FROM MOVIMIENTO_CAJA M, TIPO_DOCUMENTO T
        WHERE M.MOCA_TIPOREF = T.TIDO_COD AND M.CAJA_ID =:CODIGO AND M.MOCA_FECHA >=:FECINI AND M.MOCA_FECHA <=:FECFIN
        ORDER BY MOCA_FECHA, MOCA_ID, MOCA_TIPOREF
        INTO :TIPOCOD, :ID, :FECHA, :TIPO, :PREFIJO, :NUMERO, :CONCEPTO, :DB, :DEBITO, :CREDITO
        DO
        BEGIN
        DBEFECTIVO = 0;
        CREFECTIVO = 0;
        DBCHEQUES = 0;
        CRCHEQUES = 0;
        tercero = '';
        if (DB = 'S') then
            BEGIN
            /* BUSQUE CUANTO FUE EN EFECTIVO Y CUANTO EN CHEQUE */
            if (TIPOCOD = 61) then
                BEGIN
                SELECT SUM(RCPA_MONTO) FROM RECIBOS_CAJA_PAGO WHERE RECA_ID = :ID AND FOPA_ID = 1 INTO :DBEFECTIVO;
                if (DBEFECTIVO IS NULL) then
                    DBEFECTIVO = 0;
                DBCHEQUES = DEBITO - DBEFECTIVO;
                SELECT TERC_NOM from TERCEROS T, RECIBOS_CAJA R WHERE R.TERC_NIT = T.terc_nit and reca_id = :id INTO :TERCERO;
                END
            if (TIPOCOD = 62) then
                BEGIN
                /* ES UN TRASLADO A CAJA EL TOTAL VA A LA CAJA */
                SELECT EGRE_MONTO, TERC_NOM FROM EGRESOS E, TERCEROS T WHERE EGRE_ID = :ID AND E.TERC_NIT = T.terc_nit AND EGRE_TIPO = 2 AND CAJA_ID = :CODIGO INTO :DBEFECTIVO, :TERCERO;
                if (DBEFECTIVO IS NULL) then
                    DBEFECTIVO = 0;
                DBCHEQUES = DEBITO - DBEFECTIVO;
                END
            if (TIPOCOD = 63) then
                BEGIN
                DEBITO = CREDITO;
                SELECT SUM(CDEN_MONTO) FROM CAMBIODOC_ENTRADAS WHERE
                    CADO_ID = :ID AND FOPA_ID = 1 INTO :CREFECTIVO;
                if (CREFECTIVO IS NULL) then
                    CREFECTIVO = 0;
                CRCHEQUES = CREDITO - CREFECTIVO;
                TERCERO = '';
                SELECT SUM(CDSA_MONTO) FROM CAMBIODOC_SALIDAS WHERE
                    CADO_ID = :ID AND FOPA_ID = 1 INTO :DBEFECTIVO;
                if (DBEFECTIVO IS NULL) then
                    DBEFECTIVO = 0;
                DBCHEQUES = DEBITO - DBEFECTIVO;
                END
            if (TIPOCOD = 65) then
                BEGIN
                SELECT SUM(RPPA_MONTO) FROM RECIBO_PROVISIONAL_PAGO WHERE RCPR_ID = :ID AND FOPA_ID = 1 INTO :DBEFECTIVO;
                if (DBEFECTIVO IS NULL) then
                    DBEFECTIVO = 0;
                DBCHEQUES = DEBITO - DBEFECTIVO;
                SELECT TERC_NOM from TERCEROS T, RECIBO_PROVISIONAL R WHERE R.TERC_NIT = T.terc_nit AND RCPR_ID = :ID INTO :TERCERO;
                END
            if (TIPOCOD = 66) then
                BEGIN
                SELECT SUM(TRCD_MONTO) FROM TRASLADOS_CAJA_DET WHERE TRCJ_ID = :ID AND FOPA_ID = 1 INTO :DBEFECTIVO;
                if (DBEFECTIVO IS NULL) then
                    DBEFECTIVO = 0;
                DBCHEQUES = DEBITO - DBEFECTIVO;
                TERCERO = '';
                END
            if (TIPOCOD = 77) then
                BEGIN
                DBCHEQUES = DEBITO;
                TERCERO = '';
                END
            END
        ELSE
            BEGIN
            if (TIPOCOD = 62) then
                BEGIN
                SELECT SUM(EGCA_MONTO) FROM EGRESOS_CAJA WHERE EGRE_ID = :ID AND FOPA_ID = 1 AND CAJA_ID = :CODIGO INTO :CREFECTIVO;
                if (CREFECTIVO IS NULL) then
                    CREFECTIVO = 0;
                CRCHEQUES = CREDITO - CREFECTIVO;
                SELECT TERC_NOM from TERCEROS T, EGRESOS E WHERE E.TERC_NIT = T.terc_nit AND EGRE_ID = :ID INTO :TERCERO;
                END
            if (TIPOCOD = 63) then
                BEGIN
                DEBITO = CREDITO;
                SELECT SUM(CDEN_MONTO) FROM CAMBIODOC_ENTRADAS WHERE
                    CADO_ID = :ID AND FOPA_ID = 1 INTO :CREFECTIVO;
                if (CREFECTIVO IS NULL) then
                    CREFECTIVO = 0;
                CRCHEQUES = CREDITO - CREFECTIVO;
                TERCERO = '';
                SELECT SUM(CDSA_MONTO) FROM CAMBIODOC_SALIDAS WHERE
                    CADO_ID = :ID AND FOPA_ID = 1 INTO :DBEFECTIVO;
                if (DBEFECTIVO IS NULL) then
                    DBEFECTIVO = 0;
                DBCHEQUES = DEBITO - DBEFECTIVO;
                END
            if (TIPOCOD = 64) then
                BEGIN
                CRCHEQUES = CREDITO;
                TERCERO = '';
                END
            if (TIPOCOD = 66) then
                BEGIN
                SELECT SUM(TRCD_MONTO) FROM TRASLADOS_CAJA_DET WHERE TRCJ_ID = :ID AND FOPA_ID = 1 INTO :CREFECTIVO;
                if (CREFECTIVO IS NULL) then
                    CREFECTIVO = 0;
                CRCHEQUES = CREDITO - CREFECTIVO;
                TERCERO = '';
                END
            if (TIPOCOD = 71) then
                BEGIN
                SELECT SUM(CODE_MONTO) FROM CONSIGNA_DETALLE WHERE CONS_ID = :ID AND FOPA_ID = 1 INTO :CREFECTIVO;
                if (CREFECTIVO IS NULL) then
                    CREFECTIVO = 0;
                CRCHEQUES = CREDITO - CREFECTIVO;
                TERCERO = '';
                END
            END
        SALDO = SALDO + DEBITO - CREDITO;
        SUSPEND;
        END
    END
  ELSE
    BEGIN
    SELECT COUNT(SACA_FECHA) FROM SALDO_CAJA
        WHERE CAJA_ID = :CODIGO AND SACA_FECHA >= :FECINI AND SACA_FECHA <= :FECFIN INTO :NUMROWS;
    if (NUMROWS = 0) then
        BEGIN
        EXECUTE PROCEDURE SALDO_EN_CAJA(:CODIGO, :FECINI) returning_values(:SALDOINICIAL);
        SALDO =SALDOINICIAL;
        TIPO = '';
        PREFIJO = '';
        NUMERO = '';
        CONCEPTO = '';
        DEBITO = 0;
        CREDITO = 0;
        DBEFECTIVO = 0;
        CREFECTIVO = 0;
        DBCHEQUES = 0;
        CRCHEQUES = 0;
        SUSPEND;
        END
    ELSE
        FOR SELECT SACA_FECHA, SACA_SALDO, SACA_DEBITOS, SACA_CREDITOS
            FROM SALDO_CAJA
            WHERE CAJA_ID = :CODIGO AND SACA_FECHA >= :FECINI AND SACA_FECHA <= :FECFIN
            ORDER BY SACA_FECHA
            INTO :fecha, :SALDOINICIAL, :DBEFECTIVO, :CREFECTIVO
            DO
                BEGIN
                /* sume los cambios de documento
                SELECT SUM(CDEN_MONTO) FROM cambiodoc_entradas E, cambio_documentos C
                    WHERE C.CADO_FECHA = :fecha AND c.cado_anulado = 'N' and C.CAJA_ID = :CODIGO AND C.CADO_ID = E.CADO_ID INTO :dbcheques;
                if (dbcheques is null) then
                    dbcheques = 0;
                DBEFECTIVO = DBEFECTIVO + DBCHEQUES;
                CREFECTIVO = CREFECTIVO + DBCHEQUES; */
                DBCHEQUES = 0;
                SALDO = SALDOINICIAL + DBEFECTIVO - CREFECTIVO;
                SUSPEND;
                END
    END
  end
END
^

SET TERM ; ^

/* 20091130 */
/* permita dejar siempre deshabilitado el check de confirmado */

UPDATE CONFIGURACION
SET CONF_VALOR = 'PREGUNTAR',
    CONF_POSIBLES = 'SIEMPRE, NUNCA,PREGUNTAR',
    CONF_AYUDA = 'SIEMPRE: El sistema siempre dejara como valor preterminado la entrega confirmada al realizar el traslado de mercancia, NUNCA: El usuario debera editar el documento para porder confirmar la entrega y asi actualiza el inventario.'
WHERE (CONF_MODULO = 'INVENTARIO') AND (CONF_CATEGORIA = 'TRASLADOS') AND (CONF_PROPIEDAD = 'ACTIVAR SIEMPRE LA ENTREGA CONFIRMADA EN TRASLADOS') and (CONF_VALOR = 'NO');

UPDATE CONFIGURACION
SET CONF_VALOR = 'SIEMPRE',
    CONF_POSIBLES = 'SIEMPRE, NUNCA,PREGUNTAR',
    CONF_AYUDA = 'SIEMPRE: El sistema siempre dejara como valor preterminado la entrega confirmada al realizar el traslado de mercancia, NUNCA: El usuario debera editar el documento para porder confirmar la entrega y asi actualiza el inventario.'
WHERE (CONF_MODULO = 'INVENTARIO') AND (CONF_CATEGORIA = 'TRASLADOS') AND (CONF_PROPIEDAD = 'ACTIVAR SIEMPRE LA ENTREGA CONFIRMADA EN TRASLADOS') and (CONF_VALOR = 'SI');
COMMIT WORK;


/* 20091201 */
/* MAL SALDO INICIAL DEL INVENTARIO POR FALTA DEL ORDER */

SET TERM ^ ;

CREATE OR ALTER procedure SALDO_INICIAL_INVENTARIO (
    ARTICULO varchar(15),
    FECHA date,
    BODEGA char(2))
returns (
    SALDO numeric(18,4))
AS
BEGIN
SELECT FIRST 1 (EXIS_SALDO + EXIS_ENTR - EXIS_SAL) FROM EXISTENCIA
    WHERE (ARTI_COD = :ARTICULO) AND (BODE_COD = :BODEGA) AND (EXIS_FECHA < :FECHA)
    ORDER BY ARTI_COD DESC, BODE_COD DESC, EXIS_FECHA DESC
    INTO :SALDO;
if (SALDO IS NULL) then
    SALDO = 0;
SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE COMPARA_MOVIMIENTO_ARTICULO(
    FECINI1 DATE,
    FECFIN1 DATE,
    FECINI2 DATE,
    FECFIN2 DATE)
RETURNS (
    CODIGO VARCHAR(15),
    NOMBRE VARCHAR(60),
    UNIDAD VARCHAR(8),
    CODGRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    CODSUBG VARCHAR(3),
    NOMSUBG VARCHAR(30),
    CODMARC VARCHAR(3),
    NOMMARC VARCHAR(30),
    CODBOD VARCHAR(2),
    NOMBOD VARCHAR(30),
    SALDOINI1 NUMERIC(18,4),
    SALDOINI2 NUMERIC(18,4),
    ENTRADAS1 NUMERIC(18,4),
    ENTRADAS2 NUMERIC(18,4),
    INCENT NUMERIC(9,2),
    SALIDAS1 NUMERIC(18,4),
    SALIDAS2 NUMERIC(18,4),
    INCSAL NUMERIC(9,2),
    SALDOFIN1 NUMERIC(18,4),
    SALDOFIN2 NUMERIC(18,4),
    INCSALDO NUMERIC(9,2))
AS
BEGIN
  FOR
    SELECT ARTI_COD, ARTI_DES, ARTI_UNIDAD, A.GRUP_COD, GRUP_NOM, A.SUBG_COD, SUBG_NOM, A.MARC_COD, MARC_NOM, BODE_COD, BODE_NOM
      FROM ARTICULO A
      LEFT OUTER JOIN GRUPO ON (GRUPO.GRUP_COD = A.GRUP_COD)
      LEFT OUTER JOIN MARCAS ON (MARCAS.MARC_COD = A.MARC_COD)
      LEFT OUTER JOIN SUBGRUPO ON (SUBGRUPO.SUBG_COD = A.SUBG_COD AND SUBGRUPO.GRUP_COD = A.GRUP_COD),
      BODEGA B where A.ESAR_COD <> 'I'
      INTO :CODIGO, :NOMBRE, :UNIDAD, :CODGRUPO, :NOMGRUPO, :CODSUBG, :NOMSUBG, :CODMARC, :NOMMARC, :CODBOD, :NOMBOD
      DO
        BEGIN
        EXECUTE PROCEDURE SALDO_INICIAL_INVENTARIO(CODIGO, FECINI1, :CODBOD) returning_values (:SALDOINI1);
        /* SUME LAS ENTRADAS */
        SELECT SUM(MVAR_CANT) FROM MOVIMIENTO_ARTICULO
            WHERE (MVAR_FECHA >= :FECINI1) AND (MVAR_FECHA <= :FECFIN1) AND
            (ARTI_COD = :CODIGO) AND (BODE_COD = :CODBOD) AND (MVAR_ENTRADA = 'S') INTO :ENTRADAS1;
        if (ENTRADAS1 IS NULL) then
            ENTRADAS1 = 0;
        SELECT SUM(MVAR_CANT)
            FROM MOVIMIENTO_ARTICULO
            WHERE (MVAR_FECHA >= :FECINI1) AND (MVAR_FECHA <= :FECFIN1) AND
            (ARTI_COD = :CODIGO) AND (BODE_COD = :CODBOD) AND (MVAR_ENTRADA = 'N')
            INTO :SALIDAS1;
        if (SALIDAS1 IS NULL) then
            SALIDAS1 = 0;
        SALDOFIN1 = SALDOINI1 + ENTRADAS1 - SALIDAS1;
        /* AHORA LOS DEL SEGUNDO PERIODO */
        EXECUTE PROCEDURE SALDO_INICIAL_INVENTARIO(CODIGO, FECINI2, :CODBOD) returning_values (:SALDOINI2);
        /* SUME LAS ENTRADAS */
        SELECT SUM(MVAR_CANT) FROM MOVIMIENTO_ARTICULO
            WHERE (MVAR_FECHA >= :FECINI2) AND (MVAR_FECHA <= :FECFIN2) AND
            (ARTI_COD = :CODIGO) AND (BODE_COD = :CODBOD) AND (MVAR_ENTRADA = 'S') INTO :ENTRADAS2;
        if (ENTRADAS2 IS NULL) then
            ENTRADAS2 = 0;
        /* CALCULE LAS SALIDAS A COSTO PROMEDIO */
        SALIDAS2 = 0;
        SELECT SUM(MVAR_CANT)
            FROM MOVIMIENTO_ARTICULO
            WHERE (MVAR_FECHA >= :FECINI2) AND (MVAR_FECHA <= :FECFIN2) AND
            (ARTI_COD = :CODIGO) AND (BODE_COD = :CODBOD) AND (MVAR_ENTRADA = 'N')
            INTO :SALIDAS2;
        if (SALIDAS2 IS NULL) then
            SALIDAS2 = 0;
        SALDOFIN2 = SALDOINI2 + ENTRADAS2 - SALIDAS2;
        if (ENTRADAS1 > 0) then
            INCENT = 100 * (ENTRADAS2 - ENTRADAS1) / ENTRADAS1;
        ELSE
            if (ENTRADAS2 > 0) then
                INCENT = 100;
            ELSE
                INCENT = 0;
        if (SALIDAS1 > 0) then
            INCSAL = 100 * (SALIDAS2 - SALIDAS1) / SALIDAS1;
        ELSE
            if (SALIDAS2 > 0) then
                INCSAL = 100;
            ELSE
                INCSAL = 0;
        if (SALDOFIN1 > 0) then
            INCSALDO = 100 * (SALDOFIN2 - SALDOFIN1) / SALDOFIN1;
        ELSE
            if (SALDOFIN2 > 0) then
                INCSALDO = 100;
            ELSE
                INCSALDO = 0;
        SUSPEND;
        END
END

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE EXISTENCIAS_DESDE_HASTA(
    FECHA DATE,
    ARTINI VARCHAR(20),
    ARTFIN VARCHAR(20),
    GRPINI VARCHAR(3),
    GRPFIN VARCHAR(3),
    BODINI VARCHAR(2),
    BODFIN VARCHAR(2),
    ORDEN CHAR(1),
    AGRUPA CHAR(1),
    DETALLE CHAR(1),
    RESERVA CHAR(1),
    ENPESO CHAR(1),
    MASIVA CHAR(1),
    SUCURSAL INTEGER)
RETURNS (
    CANT NUMERIC(18,4),
    COSTO NUMERIC(18,2),
    COSTO_LOTE NUMERIC(18,2),
    CODIGO VARCHAR(15),
    NOMBRE VARCHAR(60),
    UNIDAD VARCHAR(8),
    STAND VARCHAR(20),
    CODGRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    CODSUBG VARCHAR(3),
    NOMSUBG VARCHAR(30),
    CODMARC VARCHAR(3),
    NOMMARC VARCHAR(30),
    CODBOD VARCHAR(2),
    LOTE VARCHAR(15),
    NOMBOD VARCHAR(30),
    COSTOTOT NUMERIC(18,2),
    ULTCOSTO NUMERIC(18,2),
    FECHACOSTO DATE,
    CONSUMO NUMERIC(18,2),
    RESERVADO NUMERIC(18,4),
    ORDENADO NUMERIC(18,4),
    IVA NUMERIC(9,2),
    PESOUNIT NUMERIC(18,4),
    PESOTOTAL NUMERIC(18,4),
    PRECIO NUMERIC(18,2),
    CODBAR VARCHAR(20))
AS
declare variable exist char(1);
declare variable codini varchar(20);
declare variable codfin varchar(20);
declare variable desini varchar(20);
declare variable desfin varchar(20);
declare variable ordenc numeric(18,4);
declare variable pedido numeric(18,4);
declare variable ok char(1);
declare variable id integer;
declare variable item integer;
declare variable und varchar(8);
declare variable factor numeric(18,4);
declare variable cant2 numeric(18,4);
declare variable PEDAUTO CHAR(2);
DECLARE VARIABLE LISTA INTEGER;
BEGIN
EXECUTE PROCEDURE lee_configuracion ('FACTURACION','FACTURAS', 'CODIGO DE LA LISTA DE PRECIOS A MOSTRAR EN ARTICULOS') returning_values (:LISTA);
if (ORDEN = 'C') then
    BEGIN
    CODINI = ARTINI;
    CODFIN = ARTFIN;
    DESINI = '';
    DESFIN = 'zz';
    END
ELSE
    BEGIN
    DESINI = ARTINI;
    DESFIN = ARTFIN;
    CODINI = '';
    CODFIN = 'zz';
    END
EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION', 'FACTURAS', 'GENERAR PEDIDO AUTOMATICAMENTE CON LA FACTURA') returning_values (pedauto);
if (DETALLE = 'B') then
  BEGIN
  FOR SELECT ARTI_COD, ARTI_DES, ARTI_UNIDAD, ARTI_EXIST, TAIV_PORC, A.GRUP_COD, A.SUBG_COD, A.MARC_COD, BODE_COD, BODE_NOM, ARTI_CONSUMO, ARTI_PESO/1000
      FROM ARTICULO A, BODEGA B, TARIFA_IVA T
      WHERE ARTI_COD >= :CODINI AND ARTI_COD <= :CODFIN AND ARTI_DES >= :DESINI AND ARTI_DES <= :DESFIN AND ESAR_COD <> 'I' AND BODE_COD >= :BODINI AND
      BODE_COD <= :BODFIN AND ((SUCU_ID = :SUCURSAL) or (:SUCURSAL = 0)) AND A.TAIV_COD = T.TAIV_COD
      INTO :CODIGO, :NOMBRE, :UNIDAD, :EXIST, :IVA, :CODGRUPO, :CODSUBG, :CODMARC, :CODBOD, :NOMBOD, :CONSUMO, :pesounit
      DO
        BEGIN
        STAND = '';
        OK = 'N';
        if (AGRUPA = 'G') then
            BEGIN
            if ((CODGRUPO >= GRPINI) AND (CODGRUPO <= GRPFIN)) then
                OK = 'S';
            end
        ELSE
            if (AGRUPA = 'M') then
                BEGIN
                if ((CODMARC >= GRPINI) AND (CODMARC <= GRPFIN)) then
                    OK = 'S';
                END
        if (OK = 'S') then
            BEGIN
            NOMGRUPO = '';
            NOMMARC = '';
            NOMSUBG = '';
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            SELECT MAX(COBA_COD) FROM BARRAS_ARTICULO WHERE ARTI_COD = :codigo AND COBA_UNIDAD = :unidad INTO :codbar;
            if (CODBAR IS NULL) then
                CODBAR = CODIGO;
            if (EXIST <> 'N') then
                BEGIN
                SELECT STAND_COD FROM STANDS WHERE ARTI_COD = :CODIGO AND STAND_BODEGA = :CODBOD INTO :STAND;
                EXECUTE PROCEDURE SALDO_INICIAL_INVENTARIO(CODIGO, FECHA, :CODBOD) returning_values (CANT);
                EXECUTE PROCEDURE costo_promedio_y_ultimo_unidad(CODIGO, FECHA, UNIDAD) returning_values (COSTO, ULTCOSTO);
                SELECT MAX(MVAR_FECHA) FROM MOVIMIENTO_ARTICULO WHERE ARTI_COD = :CODIGO AND MVAR_ENTRADA = 'S' AND MVAR_FECHA <= :FECHA INTO :FECHACOSTO;
                if (MASIVA = 'S') then
                    COSTO = COSTO * (100 + :IVA) / 100 + :CONSUMO;
                COSTOTOT = :CANT * :COSTO;
                CONSUMO = CONSUMO * CANT;
                if (RESERVA = 'S') then
                    BEGIN
                    SELECT SUM(ORID_ENTREGAR)
                        FROM ORDENINVENTARIO_DETALLE OD, ordenes_inventario O
                        WHERE O.ORIN_ID = OD.ORIN_ID AND ARTI_COD = :CODIGO AND ORIN_FECHA <= :FECHA AND ORIN_FECLLEGA >= :FECHA AND ORID_ANULADO = 'N' AND OD.BODE_COD = :CODBOD
                        INTO :ORDENADO;
                    if (ORDENADO IS NULL) then
                        ORDENADO = 0;
                    ORDENC = 0;
                    FOR SELECT O.ORDC_ID, OCDE_ITEM, OCDE_CANT * OCDE_FACTOR
                        FROM ORDENES_COMPRA O, ORDENES_COMPRA_DETALLE OD
                        WHERE O.ORDC_ID = OD.ORDC_ID AND OD.ARTI_COD = :CODIGO AND ORDC_VENCE >= :FECHA AND ORDC_FECHA <= :FECHA AND OCDE_ANULADO = 'N' AND OD.BODE_COD = :CODBOD
                        INTO :ID, :ITEM, :CANT2
                        do
                        BEGIN
                        EXECUTE PROCEDURE FALTANTE(23, 21, ID, ITEM) returning_values (PEDIDO, UND, FACTOR);
                        if (PEDIDO * FACTOR = CANT2) then /* SI NO SE HA FACTURADO MIRE A VER SI SE REMISIONO */
                            EXECUTE PROCEDURE FALTANTE(23, 22, ID, ITEM) returning_values (PEDIDO, UND, FACTOR);
                        if (PEDIDO IS NULL) then
                            PEDIDO = 0;
                        ORDENC = ORDENC + PEDIDO * FACTOR;
                        END
                    ORDENADO = ORDENADO + ORDENC;
                    SELECT SUM(RSDE_LIBERAR)
                        FROM RESERVAS_DETALLE RD, RESERVAS R
                        WHERE R.RESE_ID = RD.RESE_ID AND ARTI_COD = :CODIGO AND RESE_FECHA <= :FECHA AND RESE_VENCE >= :FECHA AND RD.BODE_COD = :CODBOD AND RSDE_ANULADO = 'N'
                        INTO :RESERVADO;
                    if (RESERVADO IS NULL) then
                        RESERVADO = 0;
                    PEDIDO = 0;
                    FOR SELECT P.PEDI_ID, PEDE_ITEM, PEDE_CANT * PEDE_FACTOR
                        FROM PEDIDOS P, PEDIDOS_DETALLE PD
                        WHERE P.PEDI_ID = PD.PEDI_ID AND PD.ARTI_COD = :CODIGO AND PEDI_VENCE >= :FECHA AND PEDI_FECHA <= :FECHA AND PEDE_ANULADO = 'N' AND BODE_COD = :CODBOD
                        INTO :ID, :ITEM, :CANT2
                        do
                        BEGIN
                        EXECUTE PROCEDURE FALTANTE(34, 31, ID, ITEM) returning_values (ORDENC, UND, FACTOR);
                        if ((ORDENC * FACTOR = CANT2) or (PEDAUTO = 'SI')) then /* SI NO SE HA FACTURADO MIRE A VER SI SE REMISIONO */
                            EXECUTE PROCEDURE FALTANTE(34, 32, ID, ITEM) returning_values (ORDENC, UND, FACTOR);
                        if (ORDENC IS NULL) then
                            ORDENC = 0;
                        PEDIDO = PEDIDO + ORDENC * FACTOR;
                        END
                    RESERVADO = RESERVADO + PEDIDO;
                    END
                ELSE
                    BEGIN
                    RESERVADO = 0;
                    ORDENADO = 0;
                    END
                if (LISTA > 0) then
                    SELECT prar_fijo FROM precios_articulo WHERE arti_cod = :CODIGO and lipr_cod = :LISTA INTO :PRECIO;
                if (ENPESO = 'S') then
                    BEGIN
                    if (pesounit IS NULL) then
                        pesounit = 0;
                    if (PESOUNIT <> 0) then
                        BEGIN
                        pesototal = PESOUNIT * cant;
                        SUSPEND;
                        END
                    END
                ELSE
                    SUSPEND;
                END
            END
        END
  END

if (DETALLE = 'L') then
  BEGIN
  FOR SELECT A.ARTI_COD, ARTI_DES, ARTI_UNIDAD, ARTI_EXIST, TAIV_PORC, A.GRUP_COD, A.SUBG_COD, A.MARC_COD, L.lote_nro, L.lote_nro||' - '||L.lote_vence, ARTI_CONSUMO,l.bode_cod, L.lote_saldo,l.lote_costo, ARTI_PESO/1000
      FROM ARTICULO A, LOTES l, TARIFA_IVA T
      WHERE A.ARTI_COD >= '0' AND A.ARTI_COD <= 'zz' AND ARTI_DES >= '' AND ARTI_DES <= 'zz' AND ESAR_COD <> 'I' AND A.TAIV_COD = T.TAIV_COD and a.arti_cod = l.arti_cod
      INTO :CODIGO, :NOMBRE, :UNIDAD, :EXIST, :IVA, :CODGRUPO, :CODSUBG, :CODMARC, :LOTE, :NOMBOD, :CONSUMO, :codbod, :cant, :costo_lote, :pesounit
      DO
        BEGIN
        OK = 'N';
        if (AGRUPA = 'G') then
            BEGIN
            if ((CODGRUPO >= GRPINI) AND (CODGRUPO <= GRPFIN)) then
                OK = 'S';
            end
        ELSE
            if (AGRUPA = 'M') then
                BEGIN
                if ((CODMARC >= GRPINI) AND (CODMARC <= GRPFIN)) then
                    OK = 'S';
                END
        if (OK = 'S') then
            BEGIN
            NOMGRUPO = '';
            NOMMARC = '';
            NOMSUBG = '';
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            SELECT MAX(COBA_COD) FROM BARRAS_ARTICULO WHERE ARTI_COD = :codigo AND COBA_UNIDAD = :unidad INTO :codbar;
            if (CODBAR IS NULL) then
                CODBAR = CODIGO;

            if (EXIST <> 'N') then
                BEGIN
                EXECUTE PROCEDURE COSTO_PROMEDIO_UNIDAD(CODIGO, FECHA, UNIDAD) returning_values (COSTO);
                EXECUTE PROCEDURE ULTIMO_COSTO(CODIGO, FECHA, UNIDAD) returning_values (ULTCOSTO);
                SELECT MAX(MVAR_FECHA) FROM MOVIMIENTO_ARTICULO WHERE ARTI_COD = :CODIGO AND MVAR_ENTRADA = 'S' AND MVAR_FECHA <= :FECHA INTO :FECHACOSTO;
                if (MASIVA = 'S') then
                    COSTO = COSTO * (100 + :IVA) / 100 + :CONSUMO;
                COSTOTOT = :CANT * :COSTO;
                CONSUMO = CONSUMO * CANT;
                if (RESERVA = 'S') then
                    BEGIN
                    SELECT SUM(ORID_ENTREGAR)
                        FROM ORDENINVENTARIO_DETALLE OD, ordenes_inventario O
                        WHERE O.ORIN_ID = OD.ORIN_ID AND ARTI_COD = :CODIGO AND ORIN_FECHA <= :FECHA AND ORIN_FECLLEGA >= :FECHA AND ORID_ANULADO = 'N'
                        INTO :ORDENADO;
                    if (ORDENADO IS NULL) then
                        ORDENADO = 0;
                    ORDENC = 0;
                    FOR SELECT O.ORDC_ID, OCDE_ITEM, OCDE_CANT * OCDE_FACTOR
                        FROM ORDENES_COMPRA O, ORDENES_COMPRA_DETALLE OD
                        WHERE O.ORDC_ID = OD.ORDC_ID AND OD.ARTI_COD = :CODIGO AND ORDC_VENCE >= :FECHA AND ORDC_FECHA <= :FECHA AND OCDE_ANULADO = 'N'
                        INTO :ID, :ITEM, :CANT2
                        do
                        BEGIN
                        EXECUTE PROCEDURE FALTANTE(23, 21, ID, ITEM) returning_values (PEDIDO, UND, FACTOR);
                        if (PEDIDO * FACTOR = CANT2) then /* SI NO SE HA FACTURADO MIRE A VER SI SE REMISIONO */
                            EXECUTE PROCEDURE FALTANTE(23, 22, ID, ITEM) returning_values (PEDIDO, UND, FACTOR);
                        if (PEDIDO IS NULL) then
                            PEDIDO = 0;
                        ORDENC = ORDENC + PEDIDO * FACTOR;
                        END
                    ORDENADO = ORDENADO + ORDENC;
                    SELECT SUM(RSDE_LIBERAR)
                        FROM RESERVAS_DETALLE RD, RESERVAS R
                        WHERE R.RESE_ID = RD.RESE_ID AND ARTI_COD = :CODIGO AND RESE_FECHA <= :FECHA AND RESE_VENCE >= :FECHA AND RSDE_ANULADO = 'N'
                        INTO :RESERVADO;
                    if (RESERVADO IS NULL) then
                        RESERVADO = 0;
                    PEDIDO = 0;
                    FOR SELECT P.PEDI_ID, PEDE_ITEM, PEDE_CANT * PEDE_FACTOR
                        FROM PEDIDOS P, PEDIDOS_DETALLE PD
                        WHERE P.PEDI_ID = PD.PEDI_ID AND PD.ARTI_COD = :CODIGO AND PEDI_VENCE >= :FECHA AND PEDI_FECHA <= :FECHA AND PEDE_ANULADO = 'N'
                        INTO :ID, :ITEM, :CANT2
                        do
                        BEGIN
                        EXECUTE PROCEDURE FALTANTE(34, 31, ID, ITEM) returning_values (ORDENC, UND, FACTOR);
                        if ((ORDENC * FACTOR = CANT2) or (PEDAUTO = 'SI')) then /* SI NO SE HA FACTURADO MIRE A VER SI SE REMISIONO */
                            EXECUTE PROCEDURE FALTANTE(34, 32, ID, ITEM) returning_values (ORDENC, UND, FACTOR);
                        if (ORDENC IS NULL) then
                            ORDENC = 0;
                        PEDIDO = PEDIDO + ORDENC * FACTOR;
                        END
                    RESERVADO = RESERVADO + PEDIDO;
                    END
                ELSE
                    BEGIN
                    RESERVADO = 0;
                    ORDENADO = 0;
                    END
                if (LISTA > 0) then
                    SELECT prar_fijo FROM precios_articulo WHERE arti_cod = :CODIGO and lipr_cod = :LISTA INTO :PRECIO;
                if (ENPESO = 'S') then
                    BEGIN
                    if (pesounit IS NULL) then
                        pesounit = 0;
                    if (PESOUNIT <> 0) then
                        BEGIN
                        pesototal = PESOUNIT * cant;
                        SUSPEND;
                        END
                    END
                ELSE
                    SUSPEND;
                END
            END
        END
  end
if (DETALLE = 'N') then
  BEGIN
  FOR SELECT ARTI_COD, ARTI_DES, ARTI_UNIDAD, ARTI_EXIST, TAIV_PORC, A.GRUP_COD, A.SUBG_COD, A.MARC_COD, ARTI_CONSUMO, ARTI_PESO/1000
      FROM ARTICULO A, TARIFA_IVA T
      WHERE ARTI_COD >= :CODINI AND ARTI_COD <= :CODFIN AND ARTI_DES >= :DESINI AND ARTI_DES <= :DESFIN AND ESAR_COD <> 'I' AND A.TAIV_COD = T.TAIV_COD
      INTO :CODIGO, :NOMBRE, :UNIDAD, :EXIST, :IVA, :CODGRUPO, :CODSUBG, :CODMARC, :CONSUMO, :pesounit
      DO
        BEGIN
        OK = 'N';
        if (AGRUPA = 'G') then
            BEGIN
            if ((GRPINI = '0') AND (GRPFIN = 'zz')) then
                OK = 'S';
            else
                if ((CODGRUPO >= GRPINI) AND (CODGRUPO <= GRPFIN)) then
                    OK = 'S';
            end
        ELSE
            if (AGRUPA = 'M') then
                BEGIN
                if ((GRPINI = '0') AND (GRPFIN = 'zzz')) then
                    OK = 'S';
                else
                    if ((CODMARC >= GRPINI) AND (CODMARC <= GRPFIN)) then
                        OK = 'S';
                END
        if (OK = 'S') then
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            SELECT MAX(COBA_COD) FROM BARRAS_ARTICULO WHERE ARTI_COD = :codigo AND COBA_UNIDAD = :unidad INTO :codbar;
            if (CODBAR IS NULL) then
                CODBAR = CODIGO;

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

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

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE MOVIMIENTO_ARTICULO_DESDE_HASTA(
    FECINI DATE,
    FECFIN DATE,
    SUCURSAL INTEGER)
RETURNS (
    INICIAL NUMERIC(18,4),
    ENTRADAS NUMERIC(18,4),
    SALIDAS NUMERIC(18,4),
    FINAL NUMERIC(18,4),
    CODIGO VARCHAR(15),
    NOMBRE VARCHAR(60),
    UNIDAD VARCHAR(8),
    CODGRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    CODSUBG VARCHAR(3),
    NOMSUBG VARCHAR(17),
    CODMARC VARCHAR(3),
    NOMMARC VARCHAR(30),
    CODBOD VARCHAR(2),
    NOMBOD VARCHAR(30))
AS
BEGIN
  FOR
    SELECT ARTI_COD, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD, BODE_COD, BODE_NOM
        FROM ARTICULO A, BODEGA B
        WHERE (SUCU_ID = :SUCURSAL) or (:SUCURSAL = 0)
      INTO :CODIGO, :NOMBRE, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :CODBOD, NOMBOD
      DO
        BEGIN
        NOMMARC = '';
        NOMSUBG = '';
        SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
        SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
        SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
        EXECUTE PROCEDURE SALDO_INICIAL_INVENTARIO(CODIGO, FECINI, :CODBOD) returning_values (INICIAL);
        SELECT SUM(MVAR_CANT) FROM MOVIMIENTO_ARTICULO
          WHERE (MVAR_FECHA >= :FECINI) AND (MVAR_FECHA < :FECFIN) AND
          (ARTI_COD = :codigo) AND (BODE_COD = :CODBOD) AND (MVAR_ENTRADA = 'S') INTO :ENTRADAS;
        if (ENTRADAS IS NULL) then
          ENTRADAS = 0;
        SELECT SUM(MVAR_CANT) FROM MOVIMIENTO_ARTICULO
          WHERE (MVAR_FECHA >= :FECINI) AND (MVAR_FECHA < :FECFIN) AND
          (ARTI_COD = :CODIGO) AND (BODE_COD = :CODBOD) AND (MVAR_ENTRADA = 'N') INTO :SALIDAS;
        if (SALIDAS IS NULL) then
          SALIDAS = 0;
        FINAL = INICIAL + ENTRADAS - SALIDAS;
        SUSPEND;
        END
END

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE MOVIMIENTO_ARTICULO_MES(
    ARTICULO VARCHAR(15),
    FECINI DATE,
    FECFIN DATE,
    BODEGA CHAR(2))
RETURNS (
    INICIAL NUMERIC(18,4),
    ENTC NUMERIC(18,4),
    SALC NUMERIC(18,4))
AS
BEGIN
  EXECUTE PROCEDURE SALDO_INICIAL_INVENTARIO(ARTICULO, FECINI, BODEGA) returning_values (INICIAL);
  SELECT SUM(MVAR_CANT) FROM MOVIMIENTO_ARTICULO
    WHERE (MVAR_FECHA >= :FECINI) AND (MVAR_FECHA <= :FECFIN) AND
          (ARTI_COD = :ARTICULO) AND (BODE_COD = :BODEGA) AND (MVAR_ENTRADA = 'S') INTO :ENTC;
  if (ENTC IS NULL) then
    ENTC = 0;
  SELECT SUM(MVAR_CANT) FROM MOVIMIENTO_ARTICULO
    WHERE (MVAR_FECHA >= :FECINI) AND (MVAR_FECHA <= :FECFIN) AND
          (ARTI_COD = :ARTICULO) AND (BODE_COD = :BODEGA) AND (MVAR_ENTRADA = 'N') INTO :SALC;
  if (SALC IS NULL) then
    SALC = 0;
  SUSPEND;
END

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE REP_EXISTENCIAS_PRECIOS(
    ARTINI VARCHAR(20),
    ARTFIN VARCHAR(20),
    GRPINI VARCHAR(2),
    GRPFIN VARCHAR(2),
    ORDEN CHAR(1),
    LISTA INTEGER,
    FECHA DATE,
    BODINI VARCHAR(2),
    BODFIN VARCHAR(2),
    TODAS CHAR(1),
    IVAINC CHAR(1),
    SINBOD CHAR(1),
    SUBEMPRESA INTEGER)
RETURNS (
    CODIGO VARCHAR(15),
    NOMBRE VARCHAR(60),
    UNIDAD VARCHAR(8),
    CODGRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    CODSUBG VARCHAR(3),
    NOMSUBG VARCHAR(30),
    CODMARC VARCHAR(3),
    NOMMARC VARCHAR(30),
    NOMLISTA VARCHAR(30),
    PRECIO NUMERIC(18,2),
    MARGEN NUMERIC(9,2),
    IVA NUMERIC(9,2),
    CODBOD VARCHAR(2),
    NOMBOD VARCHAR(30),
    CANT NUMERIC(18,4),
    COSTOTOT NUMERIC(18,2))
AS
DECLARE VARIABLE EXIST CHAR(1);
DECLARE VARIABLE CODINI VARCHAR(20);
DECLARE VARIABLE CODFIN VARCHAR(20);
DECLARE VARIABLE DESINI VARCHAR(20);
DECLARE VARIABLE DESFIN VARCHAR(20);
DECLARE VARIABLE FECINI DATE;
DECLARE VARIABLE FECFIN DATE;
DECLARE VARIABLE UTIL NUMERIC(9,2);
DECLARE VARIABLE MOU CHAR(10);
DECLARE VARIABLE LISIVA CHAR(1);
BEGIN
if (ORDEN = 'C') then
    BEGIN
    CODINI = ARTINI;
    CODFIN = ARTFIN;
    DESINI = '';
    DESFIN = 'zz';
    END
ELSE
    BEGIN
    DESINI = ARTINI;
    DESFIN = ARTFIN;
    CODINI = '';
    CODFIN = 'zz';
    END
    
EXECUTE PROCEDURE LEE_CONFIGURACION ('FACTURACION', 'ARTICULOS', 'SUGERIR PRECIOS CON PORCENTAJE DE MARGEN O UTILIDAD') returning_values (MOU);
    
FOR SELECT ARTI_COD, ARTI_DES, ARTI_UNIDAD, ARTI_EXIST, A.GRUP_COD, A.SUBG_COD, A.MARC_COD, TAIV_PORC
    FROM ARTICULO A, TARIFA_IVA T
    WHERE ARTI_COD >= :CODINI AND ARTI_COD <= :CODFIN AND A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :GRPFIN AND
    ARTI_DES >= :DESINI AND ARTI_DES <= :DESFIN AND ESAR_COD <> 'I' AND A.TAIV_COD = T.TAIV_COD
    INTO :CODIGO, :NOMBRE, :UNIDAD, :EXIST, :CODGRUPO, :CODSUBG, :CODMARC, :IVA
    DO
    BEGIN
    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
    if (EXIST <> 'N') then
        BEGIN
        if (LISTA = 255) then
            BEGIN
            if (TODAS = 'N') then
                begin
                /* Busque las listas validas hoy */
                FOR SELECT LIPR_NOM, LIPR_FECINI, LIPR_FECFIN, PRAR_FIJO, PRAR_MARGEN, PRAR_UTIL, LIPR_MODIF
                    FROM LISTA_PRECIOS L, PRECIOS_ARTICULO P
                    WHERE L.LIPR_COD = P.LIPR_COD AND ARTI_COD = :CODIGO
                    INTO :NOMLISTA, :FECINI, :FECFIN, :PRECIO, :MARGEN, :UTIL, :LISIVA
                    DO
                      BEGIN
                      if (MOU = 'UTILIDAD') then
                        MARGEN = UTIL;
                      if (IVAINC = 'S') THEN
                        BEGIN
                        if (LISIVA = 'N') then
                            PRECIO = PRECIO * (1 + (IVA/100));
                        END
                      END
                end   
            ELSE
                FOR SELECT LIPR_NOM, PRAR_FIJO, PRAR_MARGEN, PRAR_UTIL, LIPR_MODIF
                    FROM LISTA_PRECIOS L, PRECIOS_ARTICULO P
                    WHERE L.LIPR_COD = P.LIPR_COD AND ARTI_COD = :CODIGO
                    INTO :NOMLISTA, :PRECIO, :MARGEN, :UTIL, :LISIVA
                    DO
                    BEGIN
                    EXECUTE PROCEDURE LEE_CONFIGURACION ('FACTURACION', 'ARTICULOS', 'SUGERIR PRECIOS CON PORCENTAJE DE MARGEN O UTILIDAD') returning_values (MOU);
                    if (MOU = 'UTILIDAD') then
                        MARGEN = UTIL;
                    if (IVAINC = 'S') THEN
                        BEGIN
                        if (LISIVA = 'N') then
                            PRECIO = PRECIO * (1 + (IVA/100));
                        END
                    END
            END /* 255 */
        ELSE
            BEGIN
            if (TODAS = 'N') then
                begin
                /* Busque las listas validas hoy */
                FOR SELECT LIPR_NOM, LIPR_FECINI, LIPR_FECFIN, PRAR_FIJO, PRAR_MARGEN, PRAR_UTIL, LIPR_MODIF
                    FROM LISTA_PRECIOS L, PRECIOS_ARTICULO P
                    WHERE L.LIPR_COD = P.LIPR_COD AND ARTI_COD = :CODIGO AND L.LIPR_COD = :LISTA
                    INTO :NOMLISTA, :FECINI, :FECFIN, :PRECIO, :MARGEN, :UTIL, :LISIVA
                    DO
                    BEGIN
                    if (MOU = 'UTILIDAD') then
                        MARGEN = UTIL;
                    if (IVAINC = 'S') THEN
                        BEGIN
                        if (LISIVA = 'N') then
                            PRECIO = PRECIO * (1 + (IVA/100));
                        END
                    END
                end
            ELSE
                FOR SELECT LIPR_NOM, PRAR_FIJO, PRAR_MARGEN, PRAR_UTIL
                    FROM LISTA_PRECIOS L, PRECIOS_ARTICULO P
                    WHERE L.LIPR_COD = P.LIPR_COD AND ARTI_COD = :CODIGO AND L.LIPR_COD = :LISTA
                    INTO :NOMLISTA, :PRECIO, :MARGEN, :UTIL
                    DO
                    BEGIN
                    if (MOU = 'UTILIDAD') then
                        MARGEN = UTIL;
                    if (IVAINC = 'S') THEN
                        BEGIN
                        if (LISIVA = 'NO') then
                            PRECIO = PRECIO * (1 + (IVA/100));
                        END
                    END
            END
                      
        if (SINBOD = 'S') then
            BEGIN
            EXECUTE PROCEDURE SALDO_INICIAL_TOTAL_INV(CODIGO, FECHA) returning_values (CANT);
            COSTOTOT = CANT * PRECIO;
            if (FECINI is null) then
                SUSPEND;
            else
                if ((FECINI <= :FECHA) AND (FECFIN >= :FECHA)) Then
                    SUSPEND;
            END
        ELSE
            BEGIN
            FOR SELECT BODE_COD, BODE_NOM FROM BODEGA B
                WHERE BODE_COD >= :BODINI AND BODE_COD <= :BODFIN AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                INTO :CODBOD, :NOMBOD
                DO
                BEGIN
                EXECUTE PROCEDURE SALDO_INICIAL_INVENTARIO(CODIGO, FECHA, :CODBOD) returning_values (CANT);
                        
                COSTOTOT = CANT * PRECIO;
                if (FECINI is null) then
                    SUSPEND;
                else
                    if ((FECINI <= :FECHA) AND (FECFIN >= :FECHA)) Then
                        SUSPEND;
                END
            END
        END
    END
END

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE REP_KARDEX_ARTICULO(
    DETALLE CHAR(1),
    FECINI DATE,
    FECFIN DATE,
    ARTINI VARCHAR(20),
    ARTFIN VARCHAR(20),
    GRPINI VARCHAR(2),
    GRPFIN VARCHAR(2),
    ORDEN CHAR(1),
    BODEGA VARCHAR(2))
RETURNS (
    CODIGO VARCHAR(15),
    NOMBRE VARCHAR(60),
    UNIDAD VARCHAR(8),
    CODGRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    CODSUBG VARCHAR(3),
    NOMSUBG VARCHAR(30),
    CODMARC VARCHAR(3),
    NOMMARC VARCHAR(30),
    CODBOD VARCHAR(2),
    SALDOINI NUMERIC(18,4),
    COSTOINI NUMERIC(18,2),
    ENTRADAS NUMERIC(18,4),
    COSTOENT NUMERIC(18,2),
    SALIDAS NUMERIC(18,4),
    COSTOSAL NUMERIC(18,2),
    SALDOFIN NUMERIC(18,4),
    COSTOFIN NUMERIC(18,2),
    TIPODOC VARCHAR(8),
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    CONCEPTO VARCHAR(60),
    NIT VARCHAR(20),
    CONS INTEGER,
    CANFINAL NUMERIC(18,4),
    COSFINAL NUMERIC(18,2))
AS
DECLARE VARIABLE ENTRADA CHAR(1);
DECLARE VARIABLE CANT NUMERIC(18,4);
DECLARE VARIABLE COSTO NUMERIC(18,2);
DECLARE VARIABLE CODINI VARCHAR(20);
DECLARE VARIABLE CODFIN VARCHAR(20);
DECLARE VARIABLE DESINI VARCHAR(20);
DECLARE VARIABLE DESFIN VARCHAR(20);
BEGIN
if (ORDEN = 'C') then
    BEGIN
    CODINI = ARTINI;
    CODFIN = ARTFIN;
    DESINI = '';
    DESFIN = 'zz';
    END
ELSE
    BEGIN
    DESINI = ARTINI;
    DESFIN = ARTFIN;
    CODINI = '';
    CODFIN = 'zz';
    END
  FOR
    SELECT ARTI_COD, ARTI_DES, ARTI_UNIDAD, A.GRUP_COD, A.SUBG_COD, A.MARC_COD
      FROM ARTICULO A
      WHERE ARTI_COD >= :CODINI AND ARTI_COD <= :CODFIN AND A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :GRPFIN AND ARTI_DES >= :DESINI AND ARTI_DES <= :DESFIN AND A.ESAR_COD <> 'I'
      INTO :CODIGO, :NOMBRE, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
      DO
        BEGIN
        NOMMARC = '';
        NOMSUBG = '';
        SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
        SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
        SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
        if (BODEGA = '') then
            BEGIN
            EXECUTE PROCEDURE SALDO_INICIAL_TOTAL_INV(CODIGO, FECINI) returning_values (:SALDOINI);
            EXECUTE PROCEDURE VALOR_INICIAL_INVENTARIO(CODIGO, FECINI) returning_values (COSTOINI);
            END
        ELSE
            BEGIN
            EXECUTE PROCEDURE SALDO_INICIAL_INVENTARIO(CODIGO, FECINI, :BODEGA) returning_values (SALDOINI);
            EXECUTE PROCEDURE COSTO_PROMEDIO(CODIGO, FECINI-1) returning_values (COSTOINI);
            COSTOINI = COSTOINI * saldoini;
            END
        if (DETALLE = 'N') then
            BEGIN
            /* SUME LAS ENTRADAS */
            if (BODEGA = '') then
              SELECT SUM(COST_ENTC), SUM(COST_ENTP), SUM(COST_SALC), SUM(COST_SALP) FROM COSTOS
                WHERE (COST_FECHA >= :FECINI) AND (COST_FECHA <= :FECFIN) AND (ARTI_COD = :codigo)
                INTO :ENTRADAS, :COSTOENT, :SALIDAS, :COSTOSAL;
            ELSE
              SELECT SUM(COST_ENTC), SUM(COST_ENTP), SUM(COST_SALC), SUM(COST_SALP)
                FROM COSTOS C, MOVIMIENTO_ARTICULO M
                WHERE (COST_FECHA >= :FECINI) AND (COST_FECHA <= :FECFIN) AND (C.ARTI_COD = :codigo) AND C.cost_idmov = M.mvar_cons AND BODE_COD = :BODEGA
                INTO :ENTRADAS, :COSTOENT, :SALIDAS, :COSTOSAL;

            if (ENTRADAS IS NULL) then
              ENTRADAS = 0;
            if (COSTOENT IS NULL) then
              COSTOENT = 0;
            if (SALIDAS IS NULL) then
              SALIDAS = 0;
            if (COSTOSAL IS NULL) then
              COSTOSAL = 0;
            SALDOFIN = SALDOINI + ENTRADAS - SALIDAS;
            COSTOFIN = COSTOINI + COSTOENT - COSTOSAL;
            if (BODEGA = '') then
                BEGIN
                EXECUTE PROCEDURE SALDO_INICIAL_TOTAL_INV(CODIGO, fecfin+1) returning_values (canfinal);
                EXECUTE PROCEDURE VALOR_INICIAL_INVENTARIO(CODIGO, FECFIN+1) returning_values (cosfinal);
                END
            ELSE
                BEGIN
                EXECUTE PROCEDURE SALDO_INICIAL_INVENTARIO(CODIGO, FECFIN+1, :BODEGA) returning_values (CANFINAL);
                EXECUTE PROCEDURE COSTO_PROMEDIO(CODIGO, FECFIN+1) returning_values (COSFINAL);
                COSFINAL = COSFINAL * CANFINAL;
                END
            SUSPEND;
            END
        ELSE
            BEGIN
            SALDOFIN = SALDOINI;
            COSTOFIN = COSTOINI;
            COSTOENT = 0;
            COSTOSAL = 0;
            FOR SELECT MVAR_TIPODOC, MVAR_ENTRADA, MVAR_PREF, MVAR_NUMERO, MVAR_CANT, MVAR_COSTO, MVAR_CONC, MVAR_FECHA, M.TERC_NIT, MVAR_CONS, BODE_COD, COST_SALDOP, COST_SALDOC
                FROM MOVIMIENTO_ARTICULO M, COSTOS C
                WHERE M.arti_cod = C.arti_cod AND M.mvar_cons = C.cost_idmov AND (m.ARTI_COD = :CODIGO) AND (MVAR_FECHA >= :FECINI) AND (MVAR_FECHA <= :FECFIN) AND (MVAR_TIPODOC <> 13)
                ORDER BY M.ARTI_COD, MVAR_FECHA, MVAR_CONS
                INTO :TIPODOC, :ENTRADA, :PREFIJO, :NUMERO, :ENTRADAS, :COSTOENT, :CONCEPTO, :FECHA, :NIT, :CONS, :CODBOD, :costo, :cant
                DO
                    BEGIN
                    SELECT TIDO_NOMCORTO FROM TIPO_DOCUMENTO WHERE TIDO_COD = :TIPODOC INTO :TIPODOC;
                    if (ENTRADA = 'S') then
                        BEGIN
                        SALIDAS = 0;
                        SALDOFIN = SALDOFIN + ENTRADAS;
                        COSTOFIN = COSTOFIN + (ENTRADAS * COSTOENT);
                        if (CANT > 0) then
                            COSTOSAL = COSTO / CANT;
                        else
                            COSTOSAL = 0;
                        end
                    ELSE
                        BEGIN
                        SALIDAS = ENTRADAS;
                        ENTRADAS = 0;
                        if (CANT > 0) then
                            COSTOSAL = COSTO / CANT;
                        else
                            COSTOSAL = 0;
                        SALDOFIN = SALDOFIN - SALIDAS;
                        COSTOFIN = COSTOFIN - (SALIDAS * costosal);
                        END
                    SUSPEND;
                    END
            END
        END
END

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE REP_MOVIMIENTO_X_ARTICULO(
    DETALLE CHAR(1),
    FECINI DATE,
    FECFIN DATE,
    ARTINI VARCHAR(20),
    ARTFIN VARCHAR(20),
    GRPINI VARCHAR(2),
    GRPFIN VARCHAR(2),
    ORDEN CHAR(1),
    SUBEMPRESA INTEGER)
RETURNS (
    CODIGO VARCHAR(15),
    NOMBRE VARCHAR(60),
    UNIDAD VARCHAR(8),
    CODGRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    CODSUBG VARCHAR(3),
    NOMSUBG VARCHAR(30),
    CODMARC VARCHAR(3),
    NOMMARC VARCHAR(30),
    CODBOD VARCHAR(2),
    NOMBOD VARCHAR(30),
    SALDOINI NUMERIC(18,4),
    ENTRADAS NUMERIC(18,4),
    SALIDAS NUMERIC(18,4),
    SALDOFIN NUMERIC(18,4),
    TIPODOC VARCHAR(8),
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    CONCEPTO VARCHAR(60),
    LOTE VARCHAR(15),
    LO_VENCE DATE,
    NIT VARCHAR(20),
    NOMTERC VARCHAR(60),
    CONS INTEGER)
AS
declare variable ENTRADA CHAR(1);
declare variable CODINI VARCHAR(20);
declare variable CODant VARCHAR(15) CHARACTER SET NONE;
declare variable CODFIN VARCHAR(20);
declare variable DESINI VARCHAR(20);
declare variable DESFIN VARCHAR(20);
BEGIN
if (ORDEN = 'C') then
    BEGIN
    CODINI = ARTINI;
    CODFIN = ARTFIN;
    DESINI = '';
    DESFIN = 'zz';
    END
ELSE
    BEGIN
    DESINI = ARTINI;
    DESFIN = ARTFIN;
    CODINI = '';
    CODFIN = 'zz';
    END

if (DETALLE = 'L') then
  BEGIN
   codant = 0;
   for SELECT A.ARTI_COD, ARTI_DES, ARTI_UNIDAD, A.GRUP_COD, A.SUBG_COD, A.MARC_COD, LOTE_NRO,LOTE_VENCE, BODE_COD
     FROM ARTICULO A, LOTES L
     WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :GRPFIN AND
       ARTI_DES >= :DESINI AND ARTI_DES <= :DESFIN AND A.ESAR_COD <> 'I' AND a.arti_cod = l.arti_cod
     INTO :CODIGO, :NOMBRE, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :LOTE, :LO_VENCE, :codbod
     DO
     BEGIN
      SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
      SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
      SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
      SELECT BODE_NOM FROM BODEGA WHERE BODE_COD = :codbod INTO nombod;

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

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

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE SALDO_INICIAL_TOTAL_INV(
    ARTICULO VARCHAR(15),
    FECHA DATE)
RETURNS (
    SALDO NUMERIC(18,4))
AS
DECLARE VARIABLE SALDO_BOD NUMERIC(15,4);
DECLARE VARIABLE BOD VARCHAR(2);
BEGIN
  SALDO = 0;
  FOR
    SELECT BODE_COD FROM BODEGA WHERE BODE_ACTIVA = 'S' INTO :BOD
  DO
    BEGIN
    EXECUTE PROCEDURE saldo_inicial_inventario(:ARTICULO, :FECHA, :BOD) RETURNING_VALUES :SALDO_BOD;
    SALDO = SALDO + SALDO_BOD;
    END
if (saldo is null) then
    SALDO = 0;
SUSPEND;
END

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE MOVIMIENTO_TOTAL_ARTICULO_MES(
    ARTICULO VARCHAR(15),
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    INICIAL NUMERIC(18,4),
    ENTRADA NUMERIC(18,4),
    SALIDA NUMERIC(18,4))
AS
declare variable BOD CHAR(2);
declare variable INI NUMERIC(15,4);
declare variable ENTC NUMERIC(15,4);
declare variable SALC NUMERIC(15,4);
BEGIN
  INICIAL = 0;
  ENTRADA = 0;
  SALIDA = 0;
  FOR SELECT BODE_COD FROM BODEGA INTO :BOD
  DO
    BEGIN
    EXECUTE PROCEDURE MOVIMIENTO_ARTICULO_MES(:ARTICULO, :FECINI, :FECFIN, :BOD) returning_values (INI, ENTC, SALC);
    INICIAL = INICIAL + INI;
    ENTRADA = ENTRADA + ENTC;
    SALIDA = SALIDA + SALC;
    END
  SUSPEND;
END

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE INVENTARIO_FAMILIA(
    FECHA DATE,
    FAMILIA VARCHAR(20))
RETURNS (
    ARTICULO VARCHAR(20),
    INTERNO VARCHAR(20),
    DESCRIPCION VARCHAR(60),
    CANTIDAD NUMERIC(18,2),
    UNIDAD VARCHAR(8),
    TOTAL NUMERIC(18,2))
AS
declare variable COSTO NUMERIC(18,4);
begin
FOR SELECT A.ARTI_COD, ARTI_DES, ARTI_UNIDAD, p.pvar_cod FROM ARTICULO A, PROVEEDOR_ARTICULO P
    WHERE ESAR_COD <> 'I' AND A.arti_cod = P.arti_cod AND P.terc_nit = :FAMILIA
    INTO :ARTICULO, :descripcion, :UNIDAD, :INTERNO
    DO
    BEGIN
    EXECUTE PROCEDURE SALDO_INICIAL_TOTAL_INV(ARTICULO, FECHA) returning_values (cantidad);
    EXECUTE PROCEDURE COSTO_PROMEDIO_UNIDAD(ARTICULO, FECHA, UNIDAD) returning_values (COSTO);
    TOTAL = COSTO * CANTIDAD;
    suspend;
    END
end

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE KARDEX_DESDE_HASTA(
    ARTICULO VARCHAR(15),
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    INICIAL_CANT NUMERIC(18,4),
    INICIAL_PESOS NUMERIC(18,2),
    ENT_CANT NUMERIC(18,4),
    ENT_PESOS NUMERIC(18,2),
    SAL_CANT NUMERIC(18,4),
    SAL_PESOS NUMERIC(18,2),
    FINAL_CANT NUMERIC(18,4),
    FINAL_PESOS NUMERIC(18,2))
AS
BEGIN
  EXECUTE PROCEDURE SALDO_INICIAL_TOTAL_INV(ARTICULO, FECINI) returning_values (INICIAL_CANT);
  EXECUTE PROCEDURE VALOR_INICIAL_INVENTARIO(ARTICULO, FECINI) returning_values (INICIAL_PESOS);
  SELECT SUM(COST_ENTC), SUM(COST_ENTP), SUM(COST_SALC), SUM(COST_SALP) FROM COSTOS
    WHERE (COST_FECHA >= :FECINI) AND (COST_FECHA <= :FECFIN) AND
          (ARTI_COD = :ARTICULO)
    INTO :ENT_CANT, :ENT_PESOS, :SAL_CANT, :SAL_PESOS;
  if (ENT_CANT IS NULL) then
    ENT_CANT = 0;
  if (ENT_PESOS IS NULL) then
    ENT_PESOS = 0;
  if (SAL_CANT IS NULL) then
    SAL_CANT = 0;
  if (SAL_PESOS IS NULL) then
    SAL_PESOS = 0;
  FINAL_CANT = INICIAL_CANT + ENT_CANT - SAL_CANT;
  FINAL_PESOS = INICIAL_PESOS + ENT_PESOS - SAL_PESOS;
  SUSPEND;
END

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE REP_MOVIMIENTO_ARTICULO_DOC(
    FECINI DATE,
    FECFIN DATE,
    ARTINI VARCHAR(20),
    ARTFIN VARCHAR(20),
    GRPINI VARCHAR(2),
    GRPFIN VARCHAR(2),
    ORDEN CHAR(1))
RETURNS (
    CODIGO VARCHAR(15),
    NOMBRE VARCHAR(60),
    UNIDAD VARCHAR(8),
    CODGRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    CODSUBG VARCHAR(3),
    NOMSUBG VARCHAR(30),
    CODMARC VARCHAR(3),
    NOMMARC VARCHAR(30),
    SALDOINIC NUMERIC(18,4),
    SALDOINIP NUMERIC(18,4),
    ENTRADAC NUMERIC(18,4),
    ENTRADAP NUMERIC(18,4),
    SALIDAC NUMERIC(18,4),
    SALIDAP NUMERIC(18,4),
    COMPRASC NUMERIC(18,4),
    COMPRASP NUMERIC(18,4),
    DEVCOMPRAC NUMERIC(18,4),
    DEVCOMPRAP NUMERIC(18,4),
    VENTASC NUMERIC(18,4),
    VENTASP NUMERIC(18,4),
    DEVVENTAC NUMERIC(18,4),
    DEVVENTAP NUMERIC(18,4),
    REMIPROVC NUMERIC(18,4),
    REMIPROVP NUMERIC(18,4),
    REMICLIEC NUMERIC(18,4),
    REMICLIEP NUMERIC(18,4),
    SALDOFINC NUMERIC(18,4),
    SALDOFINP NUMERIC(18,4))
AS
declare variable CODINI VARCHAR(20);
declare variable CODFIN VARCHAR(20);
declare variable DESINI VARCHAR(20);
declare variable DESFIN VARCHAR(20);
BEGIN
if (ORDEN = 'C') then
    BEGIN
    CODINI = ARTINI;
    CODFIN = ARTFIN;
    DESINI = '';
    DESFIN = 'zz';
    END
ELSE
    BEGIN
    DESINI = ARTINI;
    DESFIN = ARTFIN;
    CODINI = '';
    CODFIN = 'zz';
    END

FOR SELECT ARTI_COD, ARTI_DES, ARTI_UNIDAD, A.GRUP_COD, A.SUBG_COD, A.MARC_COD
      FROM ARTICULO A
      WHERE ARTI_COD >= :CODINI AND ARTI_COD <= :CODFIN AND A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :GRPFIN AND
       ARTI_DES >= :DESINI AND ARTI_DES <= :DESFIN AND A.ESAR_COD <> 'I'
      INTO :CODIGO, :NOMBRE, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
      DO
        BEGIN
        SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
        SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
        SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
        EXECUTE PROCEDURE saldo_inicial_total_inv(CODIGO, FECINI) returning_values (:SALDOINIC);
        EXECUTE PROCEDURE valor_inicial_inventario(CODIGO, FECINI) returning_values (:saldoinip);
        SELECT SUM(MVAR_CANT), SUM(COST_ENTP) FROM MOVIMIENTO_ARTICULO M, COSTOS C
            WHERE M.arti_cod = C.arti_cod AND M.mvar_cons = C.cost_idmov AND (M.ARTI_COD = :CODIGO) AND
            (MVAR_FECHA >= :FECINI) AND (MVAR_FECHA <= :FECFIN) AND (MVAR_ENTRADA = 'S') AND M.mvar_tipodoc = 11 INTO :ENTRADAC, :ENTRADAP;
        if (entradac IS NULL) then
            ENTRADAC = 0;
        if (entradap IS NULL) then
            entradap = 0;
        SELECT SUM(MVAR_CANT), SUM(COST_ENTP) FROM MOVIMIENTO_ARTICULO M, COSTOS C
            WHERE (MVAR_FECHA >= :FECINI) AND (MVAR_FECHA <= :FECFIN) AND M.arti_cod = C.arti_cod AND M.mvar_cons = C.cost_idmov AND M.mvar_tipodoc = 21 AND
            (M.ARTI_COD = :CODIGO) AND (MVAR_ENTRADA = 'S') INTO :comprasc, :comprasp;
        if (comprasc IS NULL) then
            comprasc = 0;
        if (comprasp IS NULL) then
            comprasp = 0;
        SELECT SUM(MVAR_CANT), SUM(COST_ENTP) FROM MOVIMIENTO_ARTICULO M, COSTOS C
            WHERE (MVAR_FECHA >= :FECINI) AND (MVAR_FECHA <= :FECFIN) AND M.arti_cod = C.arti_cod AND M.mvar_cons = C.cost_idmov AND M.mvar_tipodoc = 22 AND
            (M.ARTI_COD = :CODIGO) AND (MVAR_ENTRADA = 'S') INTO :remiprovc, :remiprovp;
        if (remiprovc IS NULL) then
            remiprovc = 0;
        if (remiprovp IS NULL) then
            remiprovp = 0;
        SELECT SUM(MVAR_CANT), SUM(COST_ENTP) FROM MOVIMIENTO_ARTICULO M, COSTOS C
            WHERE (MVAR_FECHA >= :FECINI) AND (MVAR_FECHA <= :FECFIN) AND M.arti_cod = C.arti_cod AND M.mvar_cons = C.cost_idmov AND M.mvar_tipodoc = 33 AND
            (M.ARTI_COD = :CODIGO) AND (MVAR_ENTRADA = 'S') INTO :devventac, :devventap;
        if (devventac IS NULL) then
            devventac = 0;
        if (devventap IS NULL) then
            devventap = 0;
        /* CALCULE LAS SALIDAS A COSTO PROMEDIO */
        SELECT SUM(MVAR_CANT), SUM(COST_SALP)
            FROM MOVIMIENTO_ARTICULO M, COSTOS C
            WHERE (MVAR_FECHA >= :FECINI) AND (MVAR_FECHA <= :FECFIN) AND M.arti_cod = C.arti_cod AND M.mvar_cons = C.cost_idmov AND M.mvar_tipodoc = 12 AND
            (M.ARTI_COD = :CODIGO) AND (MVAR_ENTRADA = 'N') INTO :salidac, :salidap;
        if (SALIDAC IS NULL) then
            SALIDAC = 0;
        if (SALIDAP IS NULL) then
            SALIDAP = 0;
        SELECT SUM(MVAR_CANT), SUM(COST_SALP)
            FROM MOVIMIENTO_ARTICULO M, COSTOS C
            WHERE (MVAR_FECHA >= :FECINI) AND (MVAR_FECHA <= :FECFIN) AND M.arti_cod = C.arti_cod AND M.mvar_cons = C.cost_idmov AND M.mvar_tipodoc = 31 AND
            (M.ARTI_COD = :CODIGO) AND (MVAR_ENTRADA = 'N') INTO :ventasc, :ventasp;
        if (ventasc IS NULL) then
            VENTASC = 0;
        if (ventasp IS NULL) then
            VENTASP = 0;
        SELECT SUM(MVAR_CANT), SUM(COST_SALP)
            FROM MOVIMIENTO_ARTICULO M, COSTOS C
            WHERE (MVAR_FECHA >= :FECINI) AND (MVAR_FECHA <= :FECFIN) AND M.arti_cod = C.arti_cod AND M.mvar_cons = C.cost_idmov AND M.mvar_tipodoc = 32 AND
            (M.ARTI_COD = :CODIGO) AND (MVAR_ENTRADA = 'N') INTO :remicliec, :remicliep;
        if (remicliec IS NULL) then
            remicliec = 0;
        if (remicliep IS NULL) then
            remicliep = 0;
        SELECT SUM(MVAR_CANT), SUM(COST_SALP)
            FROM MOVIMIENTO_ARTICULO M, COSTOS C
            WHERE (MVAR_FECHA >= :FECINI) AND (MVAR_FECHA <= :FECFIN) AND M.arti_cod = C.arti_cod AND M.mvar_cons = C.cost_idmov AND M.mvar_tipodoc = 24 AND
            (M.ARTI_COD = :CODIGO) AND (MVAR_ENTRADA = 'N') INTO :devcomprac, :devcomprap;
        if (devcomprac IS NULL) then
            devcomprac = 0;
        if (devcomprap IS NULL) then
            devcomprap = 0;
        SALDOFINC = SALDOINIC + entradac + comprasc + remiprovc + devventac - salidac - ventasc - remicliec - devcomprac;
        saldofinp = SALDOINIP + entradap + comprasp + remiprovp + devventap - salidap - ventasp - remicliep - devcomprap;
        SUSPEND;
        END
END

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE MOVIMIENTO_INVENTARIO_MES(
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    CODIGO VARCHAR(15),
    DESCRIPCION VARCHAR(60),
    CODGRP VARCHAR(2),
    CODSUBG VARCHAR(3),
    CODMARCA VARCHAR(3),
    UNIDAD VARCHAR(8),
    IVA NUMERIC(9,2),
    INICIAL NUMERIC(18,2),
    ENTRADA NUMERIC(18,2),
    SALIDA NUMERIC(18,2),
    FINAL NUMERIC(18,2))
AS
BEGIN
  for select arti_cod, arti_des, GRUP_COD, SUBG_COD, MARC_COD, ARTI_UNIDAD, TAIV_PORC
    from articulo A, tarifa_iva T where A.taiv_cod = T.taiv_cod AND substring(arti_cod from 1 FOR 2) <> '.t' AND ARTI_EXIST <> 'N'
    into :CODIGO, :DESCRIPCION, :CODGRP, :CODSUBG, :codmarca, :UNIDAD, :IVA
  DO
    BEGIN
    EXECUTE PROCEDURE MOVIMIENTO_TOTAL_ARTICULO_MES(CODIGO, FECINI, FECFIN) returning_values (:INICIAL, :ENTRADA, :SALIDA);
    FINAL = INICIAL + ENTRADA - SALIDA;
    SUSPEND;
    END
END

^

SET TERM ; ^

/* 20091201B */
/* SE OLVIDO INCLUIR EN EL QUIER DE 20091124 */

SET TERM ^ ;

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

SET TERM ; ^

SET TERM ^ ;

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

SET TERM ; ^

/* 20091202 */
/* CHEQUEAR UNA SOLA CUENTA CON AUXILIARES DISPARABA TODO EL RECALCULO COMPLETO POR NO VALIDAR RANGO DE CUENTAS */

SET TERM ^ ;

CREATE OR ALTER procedure CHEQUEO_SALDOS_CONTA (
    FECINI char(8),
    CTAINI varchar(20),
    CTAFIN varchar(20))
AS
declare variable CUENTA VARCHAR(20);
declare variable NIT VARCHAR(20);
declare variable PROY VARCHAR(4);
declare variable CENTRO VARCHAR(4);
declare variable ARTIC VARCHAR(15);
declare variable DEBITOS NUMERIC(15,2);
declare variable CREDITOS NUMERIC(15,2);
declare variable FECHA CHAR(8);
DECLARE VARIABLE ANO CHAR(4);
DECLARE VARIABLE MES CHAR(2);
DECLARE VARIABLE INICIAL CHAR(8);
DECLARE VARIABLE EXISTE CHAR(1);
declare variable CUENTAUX VARCHAR(20);
BEGIN
/* BORRE LOS DB Y CR EN CERO */
UPDATE COMPROBANTE_DETALLE SET CODE_DEBITO = 0 WHERE CODE_DEBITO IS NULL;
UPDATE COMPROBANTE_DETALLE SET CODE_CREDITO = 0 WHERE CODE_CREDITO IS NULL;
DELETE FROM saldos_centros_TERCERO WHERE SACU_FECHA >= :FECINI AND CUEN_COD >= :CTAINI AND CUEN_COD <= :CTAFIN;
DELETE FROM saldos_centros WHERE SACU_FECHA >= :FECINI AND CUEN_COD >= :CTAINI AND CUEN_COD <= :CTAFIN;
DELETE FROM saldos_terceros WHERE SACU_FECHA >= :FECINI AND CUEN_COD >= :CTAINI AND CUEN_COD <= :CTAFIN;
DELETE FROM SALDOS_ARTICULO WHERE SAAR_FECHA >= :FECINI AND CUEN_COD >= :CTAINI AND CUEN_COD <= :CTAFIN;
DELETE FROM saldos_cuentas WHERE SACU_FECHA >= :FECINI AND CUEN_COD >= :CTAINI AND CUEN_COD <= :CTAFIN;
/* EMPIECE CON LOS SALDOS INICIALES */
EXECUTE PROCEDURE LEE_CONFIGURACION('CONTABILIDAD', 'GENERAL', 'AÑO DE INICIO') RETURNING_VALUES (ANO);
EXECUTE PROCEDURE LEE_CONFIGURACION('CONTABILIDAD', 'GENERAL', 'MES DE INICIO') RETURNING_VALUES (MES);
EXECUTE PROCEDURE compone_fecha_conta (ANO, MES, 1) returning_values (INICIAL);
if (FECINI <= INICIAL) then
    BEGIN
    FOR SELECT CUEN_COD, TERC_NIT, PROY_COD, CENT_COD, ARTI_COD, SAIN_DEBITO, SAIN_CREDITO
        FROM SALDOS_INICIALES WHERE CUEN_COD >= :CTAINI AND CUEN_COD <= :CTAFIN
        INTO :CUENTA, :NIT, :PROY, :CENTRO, :ARTIC, :DEBITOS, :CREDITOS
        DO
        BEGIN
        /* Busque en saldos_cuentas la cuenta y la fecha, si la encuentra actualice INICIAL, si no inserte un registro */
        CUENTAUX = CUENTA;
        WHILE (CUENTAUX <> '') DO
            BEGIN
            EXISTE = 'N';
            SELECT 'S' FROM SALDOS_CUENTAS
                WHERE (CUEN_COD = :CUENTAUX) AND (SACU_FECHA = :INICIAL) INTO :EXISTE;
            IF (EXISTE = 'N') THEN
                BEGIN
                INSERT INTO SALDOS_CUENTAS(CUEN_COD, SACU_FECHA, SACU_SALDO, SACU_DEBITO, SACU_CREDITO)
                    VALUES (:CUENTAUX, :INICIAL, :DEBITOS-:CREDITOS, 0, 0);
                END
            ELSE
                BEGIN
                UPDATE SALDOS_CUENTAS
                    SET SACU_SALDO = SACU_SALDO + :DEBITOS - :CREDITOS
                    WHERE (CUEN_COD = :CUENTAUX) AND (SACU_FECHA = :INICIAL);
                END
            EXECUTE PROCEDURE PADRE(CUENTAUX) RETURNING_VALUES (CUENTAUX);
            END
    
        /* Busque en saldos_TERCEROS si la encuentra actualice INICIAL, si no inserte un registro */
        EXISTE = 'N';
        SELECT 'S' FROM SALDOS_TERCEROS
            WHERE (CUEN_COD = :CUENTA) AND (TERC_NIT = :NIT) AND (SACU_FECHA = :INICIAL) INTO :EXISTE;
        IF (EXISTE = 'N') THEN
            BEGIN
            INSERT INTO SALDOS_TERCEROS(CUEN_COD, TERC_NIT, SACU_FECHA, SATE_SALDO, SATE_DEBITO, SATE_CREDITO)
                VALUES (:CUENTA, :NIT, :INICIAL, :DEBITOS-:CREDITOS, 0, 0);
            END
        ELSE
            BEGIN
            UPDATE SALDOS_TERCEROS
                SET SATE_SALDO = SATE_SALDO + :DEBITOS - :CREDITOS
                WHERE (CUEN_COD = :CUENTA) AND (TERC_NIT = :NIT) AND (SACU_FECHA = :INICIAL);
            END
        /* Busque en saldos_CENTROS si la encuentra actualice INICIAL, si no inserte un registro */
        EXISTE = 'N';
        SELECT 'S' FROM SALDOS_CENTROS
            WHERE (CUEN_COD = :CUENTA) AND (PROY_COD = :PROY) AND (CENT_COD = :CENTRO) AND (SACU_FECHA = :INICIAL) INTO :EXISTE;
        IF (EXISTE = 'N') THEN
            BEGIN
            INSERT INTO SALDOS_CENTROS(CUEN_COD, PROY_COD, CENT_COD, SACU_FECHA, SACE_SALDO, SACE_DEBITO, SACE_CREDITO)
                VALUES (:CUENTA, :PROY, :CENTRO, :INICIAL, :DEBITOS-:CREDITOS, 0, 0);
            END
        ELSE
            BEGIN
            UPDATE SALDOS_CENTROS
                SET SACE_SALDO = SACE_SALDO + :DEBITOS - :CREDITOS
                WHERE (CUEN_COD = :CUENTA) AND (PROY_COD = :PROY) AND (CENT_COD = :CENTRO) AND (SACU_FECHA = :INICIAL);
            END
        /* Busque en saldos_CENTROS-TERCERO si la encuentra actualice INICIAL, si no inserte un registro */
        EXISTE = 'N';
        SELECT 'S' FROM SALDOS_CENTROS_TERCERO
            WHERE (CUEN_COD = :CUENTA) AND (PROY_COD = :PROY) AND (CENT_COD = :CENTRO) AND (TERC_NIT = :NIT) AND (SACU_FECHA = :INICIAL) INTO :EXISTE;
        IF (EXISTE = 'N') THEN
            BEGIN
            INSERT INTO SALDOS_CENTROS_TERCERO(CUEN_COD, PROY_COD, CENT_COD, TERC_NIT, SACU_FECHA, SACT_SALDO, SACT_DEBITO, SACT_CREDITO)
                VALUES (:CUENTA, :PROY, :CENTRO, :NIT, :INICIAL, :DEBITOS-:CREDITOS, 0, 0);
            END
        ELSE
            BEGIN
            UPDATE SALDOS_CENTROS_TERCERO
                SET SACT_SALDO = SACT_SALDO + :DEBITOS - :CREDITOS
                WHERE (CUEN_COD = :CUENTA) AND (PROY_COD = :PROY) AND (CENT_COD = :CENTRO) AND (TERC_NIT = :NIT) AND (SACU_FECHA = :INICIAL);
            END
        /* LOS DETALLADOS POR ARTICULO */
        if (ARTIC IS NOT NULL) then
            BEGIN
            EXISTE = 'N';
            SELECT 'S' FROM SALDOS_ARTICULO
                WHERE (CUEN_COD = :CUENTA) AND (ARTI_COD = :ARTIC) AND (SAAR_FECHA = :INICIAL) INTO :EXISTE;
            IF (EXISTE = 'N') THEN
                BEGIN
                INSERT INTO SALDOS_ARTICULO(CUEN_COD, ARTI_COD, SAAR_FECHA, SAAR_SALDO, SAAR_DEBITOS, SAAR_CREDITOS)
                    VALUES (:CUENTA, :ARTIC, :INICIAL, :DEBITOS-:CREDITOS, 0, 0);
                END
            ELSE
                BEGIN
                UPDATE SALDOS_ARTICULO
                    SET SAAR_SALDO = SAAR_SALDO + :DEBITOS - :CREDITOS
                    WHERE (CUEN_COD = :CUENTA) AND (ARTI_COD = :ARTIC) AND (SAAR_FECHA = :INICIAL);
                END
            END
        END
    END /* SI DESDE EL INICIO */
/* AHORA LOS MOVIMIENTOS */
FOR SELECT CUEN_COD, D.TERC_NIT, PROY_COD, CENT_COD, ARTI_COD, CODE_DEBITO, CODE_CREDITO, ENCO_FECHA
    FROM COMPROBANTE_DETALLE d, COMPROBANTE_ENCABEZADO C WHERE C.ENCO_CONSEC = d.enco_consec AND
    ENCO_FECHA >= :FECINI AND CUEN_COD >= :CTAINI AND CUEN_COD <= :CTAFIN
    ORDER BY ENCO_FECHA, CUEN_COD, D.TERC_NIT
    INTO :CUENTA, :NIT, :PROY, :CENTRO, :ARTIC, :DEBITOS, :CREDITOS, :FECHA
    DO
    BEGIN
    EXECUTE PROCEDURE ACTUALICE_SALDO_CUENTA(:CUENTA, FECHA, :DEBITOS, :CREDITOS);
    EXECUTE PROCEDURE ACTUALICE_SALDO_TERCERO(:CUENTA, :NIT, FECHA, :DEBITOS, :CREDITOS);
    EXECUTE PROCEDURE ACTUALICE_SALDO_CENTRO(:CUENTA, :PROY, :CENTRO, FECHA, :DEBITOS, :CREDITOS);
    EXECUTE PROCEDURE ACTUALICE_SALDO_CENTRO_TERCERO(:CUENTA, :PROY, :CENTRO, :NIT, FECHA, :DEBITOS, :CREDITOS);
    IF (ARTIC IS NOT NULL) THEN
        EXECUTE PROCEDURE ACTUALICE_SALDO_ARTICULO(:CUENTA, :ARTIC, :FECHA, :DEBITOS, :CREDITOS);
    END
END

^

SET TERM ; ^


/* 20091202B */
/* POR SI ACASO INICALICE LA VARIABLE AJUSTE EN CERO */
SET TERM ^ ;

CREATE OR ALTER procedure CIERRE_FACTURACION (
    FECHA date,
    PUNTO integer,
    PREFIJO varchar(4))
returns (
    PREF varchar(4),
    AUTORIZA varchar(20),
    PUNTOVTA varchar(60),
    NUMINI varchar(6),
    NUMFIN varchar(6),
    NROFAC integer,
    HORAINI time,
    HORAFIN time,
    BASEFAC numeric(18,2),
    IVAFAC numeric(18,2),
    TOTALFAC numeric(18,2),
    NROITE integer,
    NRODEV integer,
    BASEDEV numeric(18,2),
    IVADEV numeric(18,2),
    TOTALDEV numeric(18,2),
    BASENETO numeric(18,2),
    IVANETO numeric(18,2),
    TOTALNETO numeric(18,2),
    BASEF0 numeric(18,2),
    IVAF0 numeric(18,2),
    TOTALF0 numeric(18,2),
    BASED0 numeric(18,2),
    IVAD0 numeric(18,2),
    TOTALD0 numeric(18,2),
    BASEF1 numeric(18,2),
    IVAF1 numeric(18,2),
    TOTALF1 numeric(18,2),
    BASED1 numeric(18,2),
    IVAD1 numeric(18,2),
    TOTALD1 numeric(18,2),
    BASEF2 numeric(18,2),
    IVAF2 numeric(18,2),
    TOTALF2 numeric(18,2),
    BASED2 numeric(18,2),
    IVAD2 numeric(18,2),
    TOTALD2 numeric(18,2),
    BASEF3 numeric(18,2),
    IVAF3 numeric(18,2),
    TOTALF3 numeric(18,2),
    BASED3 numeric(18,2),
    IVAD3 numeric(18,2),
    TOTALD3 numeric(18,2),
    BASEF4 numeric(18,2),
    IVAF4 numeric(18,2),
    TOTALF4 numeric(18,2),
    BASED4 numeric(18,2),
    IVAD4 numeric(18,2),
    TOTALD4 numeric(18,2),
    FORMAP1 numeric(18,2),
    FORMAP2 numeric(18,2),
    FORMAP3 numeric(18,2),
    FORMAP4 numeric(18,2),
    FORMAP5 numeric(18,2),
    CARTERA numeric(18,2),
    VENDEDOR1 varchar(60),
    VTAVEND1 numeric(18,2),
    VENDEDOR2 varchar(60),
    VTAVEND2 numeric(18,2),
    VENDEDOR3 varchar(60),
    VTAVEND3 numeric(18,2),
    VENDEDOR4 varchar(60),
    VTAVEND4 numeric(18,2),
    VENDEDOR5 varchar(60),
    VTAVEND5 numeric(18,2),
    NROFACTANUL integer,
    IVANUL numeric(18,2),
    TOTALFACANUL numeric(18,2))
AS
declare variable tarifa NUMERIC(9,2);
declare variable BASEF NUMERIC(18,2);
declare variable IVAF NUMERIC(18,2);
declare variable TOTALF NUMERIC(18,2);
declare variable BASEDv NUMERIC(18,2);
declare variable IVAD NUMERIC(18,2);
declare variable TOTALD NUMERIC(18,2);
declare variable I INTEGER;
declare variable CODVEN INTEGER;
declare variable VENDED VARCHAR(60);
declare variable R_IDDOC INTEGER;
declare variable F_ID INTEGER;
declare variable F_TOTAL NUMERIC(18,2);
declare variable FACTOR NUMERIC(18,4);
declare variable AJUSTE INTEGER;
begin
AJUSTE = 0;
if (PREFIJO <> '') then
  SELECT PREF_PRE, AUTO_NUMERO FROM AUTORIZACIONES WHERE PREF_PRE = :PREFIJO INTO :PREF, :autoriza;
SELECT PTVT_NOM FROM PUNTO_VENTA WHERE PTVT_ID = :punto INTO :puntovta;
SELECT MIN(AUDI_HORA) FROM AUDITORIA WHERE TIDO_COD = 131 AND AUDI_FECHA = :FECHA INTO :HORAINI;
HORAFIN = CAST('NOW' AS TIME);
  /* LAS VENTAS */
  SELECT MIN(FACT_NUMERO), MAX(FACT_NUMERO), COUNT(FACT_NUMERO), SUM(FACT_TOTAL - FACT_IVAMONTO), SUM(FACT_IVAMONTO), SUM(FACT_TOTAL)
    FROM FACTURAS WHERE FACT_FECHA = :FECHA AND PTVT_ID = :PUNTO AND ((PREF_PRE = :PREFIJO) or (:PREFIJO = '')) and FACT_ANULADO = 'N'
    INTO :NUMINI, :NUMFIN, :NROFAC, :BASENETO, :IVANETO, :TOTALNETO;
  SELECT COUNT(FADE_ITEM), SUM(FADE_TOTAL-FADE_IVAMONTO), SUM(FADE_IVAMONTO), SUM(FADE_TOTAL) FROM facturas_detalle D, FACTURAS F
    WHERE D.FACT_ID = F.FACT_ID AND FACT_FECHA = :FECHA AND PTVT_ID = :PUNTO AND ((PREF_PRE = :PREFIJO) or (:PREFIJO = '')) AND FADE_CANT > 0 and FACT_ANULADO = 'N' and substring(d.arti_cod from 1 FOR 2) <> '.t'
    INTO :nroite, :BASEFAC, :IVAFAC, :TOTALFAC;
  SELECT COUNT(FADE_ITEM), SUM(FADE_IVAMONTO-FADE_TOTAL), SUM(FADE_IVAMONTO*-1), SUM(FADE_TOTAL*-1) FROM facturas_detalle D, FACTURAS F
    WHERE D.FACT_ID = F.FACT_ID AND FACT_FECHA = :FECHA AND PTVT_ID = :PUNTO AND ((PREF_PRE = :PREFIJO) or (:PREFIJO = '')) AND FADE_CANT < 0 and FACT_ANULADO = 'N' and substring(d.arti_cod from 1 FOR 2) <> '.t'
    INTO :NRODEV, :BASEDEV, :IVADEV, :TOTALDEV;
  SELECT COUNT(DVDE_ITEM), SUM(DVDE_TOTAL-DVDE_IVAMONTO), SUM(DVDE_IVAMONTO), SUM(DVDE_TOTAL) FROM devoluciones_ventas_detalle D, devoluciones_ventas F
    WHERE D.DEVT_ID = F.DEVT_ID AND DEVT_FECHA = :FECHA AND PTVT_ID = :PUNTO AND ((PREF_PRE = :PREFIJO) or (:PREFIJO = '')) AND DEVT_ANULADO = 'N' and substring(d.arti_cod from 1 FOR 2) <> '.t'
    INTO :I, :BASEDV, :IVAD, :TOTALD;
  SELECT COUNT(FACT_NUMERO),SUM(FACT_TOTAL - FACT_IVAMONTO), SUM(FACT_IVAMONTO) FROM FACTURAS
    WHERE FACT_FECHA = :FECHA AND PTVT_ID = :PUNTO AND ((PREF_PRE = :PREFIJO) or (:PREFIJO = '')) and FACT_ANULADO = 'S'
    INTO :NROFACTANUL, :TOTALFACANUL, :IVANUL;
  if (nrofac is null) then
    nrofac = 0;
  if (NROFACTANUL is null) then
    NROFACTANUL = 0;
  if (TOTALFACANUL is null) then
    TOTALFACANUL = 0;
  if (IVANUL is null) then
    IVANUL = 0;
  if (baseneto is null) then
    baseneto = 0;
  if (ivaneto is null) then
    ivaneto = 0;
  if (totalneto is null) then
    totalneto = 0;
  if (nroite is null) then
    nroite = 0;
  if (basefac is null) then
    basefac = 0;
  if (ivafac is null) then
    ivafac = 0;
  if (totalfac is null) then
    totalfac = 0;
  if (nrodev is null) then
    nrodev = 0;
  if (basedev is null) then
    basedev = 0;
  if (ivadev is null) then
    ivadev = 0;
  if (totaldev is null) then
    totaldev = 0;
  if (I is null) then
    I = 0;
  if (basedv is null) then
    basedv = 0;
  if (ivad is null) then
    ivad = 0;
  if (totald is null) then
    totald = 0;
  NRODEV = NRODEV + I;
  BASEDEV = BASEDEV + BASEDV;
  IVADEV = IVADEV + IVAD;
  TOTALDEV = TOTALDEV + TOTALD;

  /* POR TARIFA DE IVA */
  I = 0;
  BASEF0 = 0;
  BASED0 = 0;
  IVAF0 = 0;
  IVAD0 = 0;
  TOTALF0 = 0;
  TOTALD0 = 0;
  BASEF1 = 0;
  BASED1 = 0;
  IVAF1 = 0;
  IVAD1 = 0;
  TOTALF1 = 0;
  TOTALD1 = 0;
  BASEF2 = 0;
  BASED2 = 0;
  IVAF2 = 0;
  IVAD2 = 0;
  TOTALF2 = 0;
  TOTALD2 = 0;
  BASEF3 = 0;
  BASED3 = 0;
  IVAF3 = 0;
  IVAD3 = 0;
  TOTALF3 = 0;
  TOTALD3 = 0;
  BASEF4 = 0;
  BASED4 = 0;
  IVAF4 = 0;
  IVAD4 = 0;
  TOTALF4 = 0;
  TOTALD4 = 0;
  vtavend1 = 0;
  vtavend2 = 0;
  vtavend3 = 0;
  vtavend4 = 0;
  vtavend5 = 0;
  FOR SELECT TAIV_PORC FROM TARIFA_IVA ORDER BY TAIV_PORC INTO :TARIFA DO
    BEGIN
    I = I + 1;
    SELECT SUM(FADE_TOTAL-FADE_IVAMONTO), SUM(FADE_IVAMONTO), SUM(FADE_TOTAL) FROM facturas_detalle D, FACTURAS F
        WHERE D.FACT_ID = F.FACT_ID AND FACT_FECHA = :FECHA AND PTVT_ID = :PUNTO AND ((PREF_PRE = :PREFIJO) or (:PREFIJO = '')) AND FADE_CANT > 0 AND FADE_IVAPORC = :TARIFA and FACT_ANULADO = 'N'
        INTO :BASEF, :IVAF, :TOTALF;
    SELECT SUM(FADE_TOTAL-FADE_IVAMONTO), SUM(FADE_IVAMONTO), SUM(FADE_TOTAL) FROM facturas_detalle D, FACTURAS F
        WHERE D.FACT_ID = F.FACT_ID AND FACT_FECHA = :FECHA AND PTVT_ID = :PUNTO AND ((PREF_PRE = :PREFIJO) or (:PREFIJO = '')) AND FADE_CANT < 0 AND FADE_IVAPORC = :TARIFA and FACT_ANULADO = 'N'
        INTO :BASEDV, :IVAD, :TOTALD;
    if (basef is null) then
        basef = 0;
    if (ivaf is null) then
        ivaf = 0;
    if (totalf is null) then
        totalf = 0;
    if (basedv is null) then
        basedv = 0;
    if (ivad is null) then
        ivad = 0;
    if (totald is null) then
        totald = 0;

    FACTOR = 1;
    SELECT AJCI_FACTOR FROM ajuste_cierre WHERE AJCI_PORC = :TARIFA AND AJCI_FECINI <= :FECHA AND AJCI_FECFIN >= :FECHA INTO :FACTOR;
    if (FACTOR IS null) then
        FACTOR = 1;
    if (FACTOR <> 1) then
        AJUSTE = 1;
    BASEF = BASEF * FACTOR;
    BASEDV = BASEDV * FACTOR;
    IVAF = IVAF * FACTOR;
    IVAD = IVAD * FACTOR;
    TOTALF = TOTALF * FACTOR;
    TOTALD = TOTALD * FACTOR;

    if (I = 1) then
        BEGIN
        BASEF0 = BASEF;
        BASED0 = :BASEDV;
        IVAF0 = IVAF;
        IVAD0 = IVAD;
        TOTALF0 = TOTALF;
        TOTALD0 = TOTALD;
        SELECT SUM(DVDE_TOTAL-DVDE_IVAMONTO), SUM(DVDE_IVAMONTO), SUM(DVDE_TOTAL) FROM devoluciones_ventas_detalle D, devoluciones_ventas F
            WHERE D.DEVT_ID = F.DEVT_ID AND DEVT_FECHA = :FECHA AND PTVT_ID = :PUNTO AND ((PREF_PRE = :PREFIJO) or (:PREFIJO = '')) AND DVDE_IVAPORC = :TARIFA and DEVT_ANULADO = 'N'
            INTO :BASEDV, :IVAD, :TOTALD;
        if (basedv is null) then
            basedv = 0;
        if (ivad is null) then
            ivad = 0;
        if (totald is null) then
            totald = 0;
        BASED0 = BASED0 + BASEDV;
        IVAD0 = IVAD0 + IVAD;
        TOTALD0 = TOTALD0 + TOTALD;
        END
    if (I = 2) then
        BEGIN
        BASEF1 = BASEF;
        BASED1 = :BASEDV;
        IVAF1 = IVAF;
        IVAD1 = IVAD;
        TOTALF1 = TOTALF;
        TOTALD1 = TOTALD;
        SELECT SUM(DVDE_TOTAL-DVDE_IVAMONTO), SUM(DVDE_IVAMONTO), SUM(DVDE_TOTAL) FROM devoluciones_ventas_detalle D, devoluciones_ventas F
            WHERE D.DEVT_ID = F.DEVT_ID AND DEVT_FECHA = :FECHA AND PTVT_ID = :PUNTO AND ((PREF_PRE = :PREFIJO) or (:PREFIJO = '')) AND DVDE_IVAPORC = :TARIFA and DEVT_ANULADO = 'N'
            INTO :BASEDV, :IVAD, :TOTALD;
        if (basedv is null) then
            basedv = 0;
        if (ivad is null) then
            ivad = 0;
        if (totald is null) then
            totald = 0;
        BASED1 = BASED1 + BASEDV;
        IVAD1 = IVAD1 + IVAD;
        TOTALD1 = TOTALD1 + TOTALD;
        END
    if (I = 3) then
        BEGIN
        BASEF2 = BASEF;
        BASED2 = :BASEDV;
        IVAF2 = IVAF;
        IVAD2 = IVAD;
        TOTALF2 = TOTALF;
        TOTALD2 = TOTALD;
        SELECT SUM(DVDE_TOTAL-DVDE_IVAMONTO), SUM(DVDE_IVAMONTO), SUM(DVDE_TOTAL) FROM devoluciones_ventas_detalle D, devoluciones_ventas F
            WHERE D.DEVT_ID = F.DEVT_ID AND DEVT_FECHA = :FECHA AND PTVT_ID = :PUNTO AND ((PREF_PRE = :PREFIJO) or (:PREFIJO = '')) AND DVDE_IVAPORC = :TARIFA and DEVT_ANULADO = 'N'
            INTO :BASEDV, :IVAD, :TOTALD;
        if (basedv is null) then
            basedv = 0;
        if (ivad is null) then
            ivad = 0;
        if (totald is null) then
            totald = 0;
        BASED2 = BASED2 + BASEDV;
        IVAD2 = IVAD2 + IVAD;
        TOTALD2 = TOTALD2 + TOTALD;
        END
    if (I = 4) then
        BEGIN
        BASEF3 = BASEF;
        BASED3 = :BASEDV;
        IVAF3 = IVAF;
        IVAD3 = IVAD;
        TOTALF3 = TOTALF;
        TOTALD3 = TOTALD;
        SELECT SUM(DVDE_TOTAL-DVDE_IVAMONTO), SUM(DVDE_IVAMONTO), SUM(DVDE_TOTAL) FROM devoluciones_ventas_detalle D, devoluciones_ventas F
            WHERE D.DEVT_ID = F.DEVT_ID AND DEVT_FECHA = :FECHA AND PTVT_ID = :PUNTO AND ((PREF_PRE = :PREFIJO) or (:PREFIJO = '')) AND DVDE_IVAPORC = :TARIFA and DEVT_ANULADO = 'N'
            INTO :BASEDV, :IVAD, :TOTALD;
        if (basedv is null) then
            basedv = 0;
        if (ivad is null) then
            ivad = 0;
        if (totald is null) then
            totald = 0;
        BASED3 = BASED3 + BASEDV;
        IVAD3 = IVAD3 + IVAD;
        TOTALD3 = TOTALD3 + TOTALD;
        END
    if (I = 5) then
        BEGIN
        BASEF4 = BASEF;
        BASED4 = :BASEDV;
        IVAF4 = IVAF;
        IVAD4 = IVAD;
        TOTALF4 = TOTALF;
        TOTALD4 = TOTALD;
        SELECT SUM(DVDE_TOTAL-DVDE_IVAMONTO), SUM(DVDE_IVAMONTO), SUM(DVDE_TOTAL) FROM devoluciones_ventas_detalle D, devoluciones_ventas F
            WHERE D.DEVT_ID = F.DEVT_ID AND DEVT_FECHA = :FECHA AND PTVT_ID = :PUNTO AND ((PREF_PRE = :PREFIJO) or (:PREFIJO = '')) AND DVDE_IVAPORC = :TARIFA and DEVT_ANULADO = 'N'
            INTO :BASEDV, :IVAD, :TOTALD;
        if (basedv is null) then
            basedv = 0;
        if (ivad is null) then
            ivad = 0;
        if (totald is null) then
            totald = 0;
        BASED4 = BASED4 + BASEDV;
        IVAD4 = IVAD4 + IVAD;
        TOTALD4 = TOTALD4 + TOTALD;
        END
    END
  /* POR FORMA DE PAGO */
  SELECT SUM(RCPA_MONTO) FROM RECIBOS_CAJA_PAGO P, RECIBOS_CAJA R, PUNTO_VENTA PT
    WHERE R.RECA_ID = P.RECA_ID AND PT.PTVT_ID = :punto AND RECA_FECHA = :FECHA AND PT.caja_id = R.caja_id AND ((PT.PREF_PRE = :PREFIJO) or (:PREFIJO = '')) AND FOPA_ID = 1 and RECA_ANULADO = 'N'
    INTO :FORMAP1;
  SELECT SUM(RCPA_MONTO) FROM RECIBOS_CAJA_PAGO P, RECIBOS_CAJA R, PUNTO_VENTA PT
    WHERE R.RECA_ID = P.RECA_ID AND PT.PTVT_ID = :punto AND RECA_FECHA = :FECHA AND PT.caja_id = R.caja_id AND ((PT.PREF_PRE = :PREFIJO) or (:PREFIJO = '')) AND FOPA_ID = 2 and RECA_ANULADO = 'N'
    INTO :FORMAP2;
  SELECT SUM(RCPA_MONTO) FROM RECIBOS_CAJA_PAGO P, RECIBOS_CAJA R, PUNTO_VENTA PT
    WHERE R.RECA_ID = P.RECA_ID AND PT.PTVT_ID = :punto AND RECA_FECHA = :FECHA AND PT.caja_id = R.caja_id AND ((PT.PREF_PRE = :PREFIJO) or (:PREFIJO = '')) AND FOPA_ID = 3 and RECA_ANULADO = 'N'
    INTO :FORMAP3;
  SELECT SUM(RCPA_MONTO) FROM RECIBOS_CAJA_PAGO P, RECIBOS_CAJA R, PUNTO_VENTA PT
    WHERE R.RECA_ID = P.RECA_ID AND PT.PTVT_ID = :punto AND RECA_FECHA = :FECHA AND PT.caja_id = R.caja_id AND ((PT.PREF_PRE = :PREFIJO) or (:PREFIJO = '')) AND FOPA_ID = 4 and RECA_ANULADO = 'N'
    INTO :FORMAP4;
  SELECT SUM(RCPA_MONTO) FROM RECIBOS_CAJA_PAGO P, RECIBOS_CAJA R, PUNTO_VENTA PT
    WHERE R.RECA_ID = P.RECA_ID AND PT.PTVT_ID = :punto AND RECA_FECHA = :FECHA AND PT.caja_id = R.caja_id AND ((PT.PREF_PRE = :PREFIJO) or (:PREFIJO = '')) AND FOPA_ID = 5 and RECA_ANULADO = 'N'
    INTO :FORMAP5;

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

SET TERM ; ^


/* 20091203 */
/* CON LA MEJORA DE LA CONSULTA DE EXISTENCIAS ES MEJOR VOLVER A DEJAR EL SALDO COMO LA SUMA DE EXISTENCIAS Y NO DE LA TABLA COSTOS */

SET TERM ^ ;

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

SET TERM ; ^


update revision set revi_FECHA = '2009/12/03';
COMMIT WORK;

/* 20091203B : REDONDEO DE PRECIOS EN EL REPORTE */

SET TERM ^ ;

CREATE OR ALTER procedure REP_EXISTENCIAS_PRECIOS (
    ARTINI varchar(20),
    ARTFIN varchar(20),
    GRPINI varchar(2),
    GRPFIN varchar(2),
    ORDEN char(1),
    LISTA integer,
    FECHA date,
    BODINI varchar(2),
    BODFIN varchar(2),
    TODAS char(1),
    IVAINC char(1),
    SINBOD char(1),
    SUBEMPRESA integer)
returns (
    CODIGO varchar(15),
    NOMBRE varchar(60),
    UNIDAD varchar(8),
    CODGRUPO varchar(2),
    NOMGRUPO varchar(30),
    CODSUBG varchar(3),
    NOMSUBG varchar(30),
    CODMARC varchar(3),
    NOMMARC varchar(30),
    NOMLISTA varchar(30),
    PRECIO numeric(18,2),
    MARGEN numeric(9,2),
    IVA numeric(9,2),
    CODBOD varchar(2),
    NOMBOD varchar(30),
    CANT numeric(18,4),
    COSTOTOT numeric(18,2))
AS
DECLARE VARIABLE EXIST CHAR(1);
DECLARE VARIABLE CODINI VARCHAR(20);
DECLARE VARIABLE CODFIN VARCHAR(20);
DECLARE VARIABLE DESINI VARCHAR(20);
DECLARE VARIABLE DESFIN VARCHAR(20);
DECLARE VARIABLE FECINI DATE;
DECLARE VARIABLE FECFIN DATE;
DECLARE VARIABLE UTIL NUMERIC(9,2);
DECLARE VARIABLE MOU CHAR(10);
DECLARE VARIABLE LISIVA CHAR(1);
declare variable DIG INTEGER;
BEGIN
if (ORDEN = 'C') then
    BEGIN
    CODINI = ARTINI;
    CODFIN = ARTFIN;
    DESINI = '';
    DESFIN = 'zz';
    END
ELSE
    BEGIN
    DESINI = ARTINI;
    DESFIN = ARTFIN;
    CODINI = '';
    CODFIN = 'zz';
    END
    
EXECUTE PROCEDURE LEE_CONFIGURACION ('FACTURACION', 'ARTICULOS', 'SUGERIR PRECIOS CON PORCENTAJE DE MARGEN O UTILIDAD') returning_values (MOU);
EXECUTE PROCEDURE LEE_CONFIGURACION ('FACTURACION', 'ARTICULOS', 'REDONDEO AL MULTIPLO DE DIEZ EN PRECIOS') returning_values (DIG);
FOR SELECT ARTI_COD, ARTI_DES, ARTI_UNIDAD, ARTI_EXIST, A.GRUP_COD, A.SUBG_COD, A.MARC_COD, TAIV_PORC
    FROM ARTICULO A, TARIFA_IVA T
    WHERE ARTI_COD >= :CODINI AND ARTI_COD <= :CODFIN AND A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :GRPFIN AND
    ARTI_DES >= :DESINI AND ARTI_DES <= :DESFIN AND ESAR_COD <> 'I' AND A.TAIV_COD = T.TAIV_COD
    INTO :CODIGO, :NOMBRE, :UNIDAD, :EXIST, :CODGRUPO, :CODSUBG, :CODMARC, :IVA
    DO
    BEGIN
    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
    if (EXIST <> 'N') then
        BEGIN
        if (LISTA = 255) then
            BEGIN
            if (TODAS = 'N') then
                begin
                /* Busque las listas validas hoy */
                FOR SELECT LIPR_NOM, LIPR_FECINI, LIPR_FECFIN, PRAR_FIJO, PRAR_MARGEN, PRAR_UTIL, LIPR_MODIF
                    FROM LISTA_PRECIOS L, PRECIOS_ARTICULO P
                    WHERE L.LIPR_COD = P.LIPR_COD AND ARTI_COD = :CODIGO
                    INTO :NOMLISTA, :FECINI, :FECFIN, :PRECIO, :MARGEN, :UTIL, :LISIVA
                    DO
                      BEGIN
                      if (MOU = 'UTILIDAD') then
                        MARGEN = UTIL;
                      if (IVAINC = 'S') THEN
                        BEGIN
                        if (LISIVA = 'N') then
                            PRECIO = PRECIO * (1 + (IVA/100));
                        END
                      EXECUTE PROCEDURE redondee(PRECIO, DIG) returning_values (PRECIO);
                      END
                end   
            ELSE
                FOR SELECT LIPR_NOM, PRAR_FIJO, PRAR_MARGEN, PRAR_UTIL, LIPR_MODIF
                    FROM LISTA_PRECIOS L, PRECIOS_ARTICULO P
                    WHERE L.LIPR_COD = P.LIPR_COD AND ARTI_COD = :CODIGO
                    INTO :NOMLISTA, :PRECIO, :MARGEN, :UTIL, :LISIVA
                    DO
                    BEGIN
                    EXECUTE PROCEDURE LEE_CONFIGURACION ('FACTURACION', 'ARTICULOS', 'SUGERIR PRECIOS CON PORCENTAJE DE MARGEN O UTILIDAD') returning_values (MOU);
                    if (MOU = 'UTILIDAD') then
                        MARGEN = UTIL;
                    if (IVAINC = 'S') THEN
                        BEGIN
                        if (LISIVA = 'N') then
                            PRECIO = PRECIO * (1 + (IVA/100));
                        END
                    EXECUTE PROCEDURE redondee(PRECIO, DIG) returning_values (PRECIO);
                    END
            END /* 255 */
        ELSE
            BEGIN
            if (TODAS = 'N') then
                begin
                /* Busque las listas validas hoy */
                FOR SELECT LIPR_NOM, LIPR_FECINI, LIPR_FECFIN, PRAR_FIJO, PRAR_MARGEN, PRAR_UTIL, LIPR_MODIF
                    FROM LISTA_PRECIOS L, PRECIOS_ARTICULO P
                    WHERE L.LIPR_COD = P.LIPR_COD AND ARTI_COD = :CODIGO AND L.LIPR_COD = :LISTA
                    INTO :NOMLISTA, :FECINI, :FECFIN, :PRECIO, :MARGEN, :UTIL, :LISIVA
                    DO
                    BEGIN
                    if (MOU = 'UTILIDAD') then
                        MARGEN = UTIL;
                    if (IVAINC = 'S') THEN
                        BEGIN
                        if (LISIVA = 'N') then
                            PRECIO = PRECIO * (1 + (IVA/100));
                        END
                    EXECUTE PROCEDURE redondee(PRECIO, DIG) returning_values (PRECIO);
                    END
                end
            ELSE
                FOR SELECT LIPR_NOM, PRAR_FIJO, PRAR_MARGEN, PRAR_UTIL
                    FROM LISTA_PRECIOS L, PRECIOS_ARTICULO P
                    WHERE L.LIPR_COD = P.LIPR_COD AND ARTI_COD = :CODIGO AND L.LIPR_COD = :LISTA
                    INTO :NOMLISTA, :PRECIO, :MARGEN, :UTIL
                    DO
                    BEGIN
                    if (MOU = 'UTILIDAD') then
                        MARGEN = UTIL;
                    if (IVAINC = 'S') THEN
                        BEGIN
                        if (LISIVA = 'NO') then
                            PRECIO = PRECIO * (1 + (IVA/100));
                        END
                    EXECUTE PROCEDURE redondee(PRECIO, DIG) returning_values (PRECIO);
                    END
            END
                      
        if (SINBOD = 'S') then
            BEGIN
            EXECUTE PROCEDURE SALDO_INICIAL_TOTAL_INV(CODIGO, FECHA) returning_values (CANT);
            COSTOTOT = CANT * PRECIO;
            if (FECINI is null) then
                SUSPEND;
            else
                if ((FECINI <= :FECHA) AND (FECFIN >= :FECHA)) Then
                    SUSPEND;
            END
        ELSE
            BEGIN
            FOR SELECT BODE_COD, BODE_NOM FROM BODEGA B
                WHERE BODE_COD >= :BODINI AND BODE_COD <= :BODFIN AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                INTO :CODBOD, :NOMBOD
                DO
                BEGIN
                EXECUTE PROCEDURE SALDO_INICIAL_INVENTARIO(CODIGO, FECHA, :CODBOD) returning_values (CANT);
                        
                COSTOTOT = CANT * PRECIO;
                if (FECINI is null) then
                    SUSPEND;
                else
                    if ((FECINI <= :FECHA) AND (FECFIN >= :FECHA)) Then
                        SUSPEND;
                END
            END
        END
    END
END
^

SET TERM ; ^


/* 20091204 */

/* MUESTRE EL ULTIMO COMPROMISO DEL CLIENTE */
CREATE DESCENDING INDEX CRM_COMPROMISOS_IDX1
ON CRM_COMPROMISOS (CRCO_NIT,CRCO_FECHA);
CREATE INDEX CRM_COMPROMISOS_IDX2
ON CRM_COMPROMISOS (CRCO_NIT);

SET TERM ^ ;

CREATE OR ALTER procedure ULTIMO_COMPROMISO (
    NIT varchar(20))
returns (
    TEXTO varchar(255))
AS
declare variable FECHA DATE;
declare variable MOTIVO VARCHAR(255);
declare variable TIPO VARCHAR(60);
declare variable ASESOR VARCHAR(60);
declare variable CUMPLIDO VARCHAR(10);
begin
SELECT FIRST 1 CRCO_FECHA, CRCO_OBS, CRTE_NOMBRE, CRAS_NOMBRE, CRCO_CUMPLIDO
    FROM crm_compromisos E, CRM_TIPOEVENTO T, crm_asesor A
    WHERE E.crco_tipo = T.crte_id AND E.crco_asesor = A.cras_id AND CRCO_NIT = :NIT
    ORDER BY CRCO_FECHA DESC, CRCO_HORA DESC
    INTO :fecha, :motivo, :tipo, :asesor, :cumplido;
TEXTO = FECHA || ':' || SUBSTRING(TIPO FROM 1 FOR 20) || ' ' || SUBSTRING(MOTIVO FROM 1 FOR 190) || '-' || SUBSTRING(ASESOR FROM 1 FOR 20);
if (CUMPLIDO = 'S') then
    TEXTO = TEXTO || ' Cumplido.';
else
    TEXTO = TEXTO || ' Pendiente.';
suspend;
end
^

SET TERM ; ^


grant EXECUTE on PROCEDURE ultimo_compromiso to public;


/* 20091205 */
SET TERM ^ ;

CREATE OR ALTER PROCEDURE CONCILIA_COSTOVENTAS(
    FECINI DATE,
    FECFIN DATE,
    CTACOSTO VARCHAR(20),
    SOLODIF CHAR(1),
    NULO2 CHAR(2))
RETURNS (
    IDF INTEGER,
    IDC INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    COMPROBA VARCHAR(3),
    NUMCNT VARCHAR(6),
    MONTO NUMERIC(18,2),
    MONTOC NUMERIC(18,2))
AS
declare variable costo numeric(18,2);
declare variable cant numeric(18,2);
declare variable articulo varchar(20);
begin
for select fact_id, pref_pre, fact_numero, fact_fecha
    from facturas f
    where fact_fecha >= :fecini and fact_fecha <= :fecfin and fact_anulado = 'N'
    into :idf, :pref, :numero, :fecha
    do
    begin
    idc = 0;
    montoc = 0;
    numcnt = '';
    select enco_consec, TICO_COD, ENCO_NUMERO
    from comprobante_encabezado where enco_idref = :idf and enco_tiporef = 31
    into :idc, :comproba, :numcnt;
    MONTO = 0;
    FOR SELECT D.ARTI_COD, FADE_CANT * FADE_FACTOR FROM FACTURAS_DETALLE D
        WHERE FACT_ID = :IDF and substring(D.arti_cod from 1 FOR 2) <> '.t'
        INTO :ARTICULO, :CANT
        DO
        BEGIN
        EXECUTE PROCEDURE COSTO_PROMEDIO(:ARTICULO, :FECHA) returning_values (:COSTO);
        MONTO = MONTO + COSTO * CANT;
        END
    select SUM(code_credito-code_debito) from comprobante_detalle
        where enco_consec = :idc and cuen_cod = :ctacosto into MONTOC;
    if (montoc is null) then
        montoc = 0;
    if ((SOLODIF = 'N') or (MONTO <> MONTOC)) then
        SUSPEND;
    end
end
^

SET TERM ; ^

grant EXECUTE on PROCEDURE CONCILIA_COSTOVENTAS to PUBLIC;

/* 20091207 */
/* SI EL PROMEDIO ES CERO, TOME EL COSTO DE LA FACTURA/REMISION PARA EVITAR QUE QUEDE EN CERO */

SET TERM ^ ;

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

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

SET TERM ; ^


SET TERM ^ ;

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

SET TERM ; ^



/* 20091209 */
/* CARTERA DEL DIA */

SET TERM ^ ;

create or alter procedure REP_MOVIMIENTO_DIARIO (
    DESDE varchar(20),
    HASTA varchar(20),
    GRPINI varchar(5),
    GRPFIN varchar(5),
    FECINI date,
    ORDEN char(1),
    AGRUPA char(1),
    SUBEMPRESA integer,
    MONEDA integer)
returns (
    NIT varchar(20),
    NOMBRE varchar(60),
    TELEFONO varchar(40),
    CIUDAD varchar(40),
    CODZONA varchar(2),
    NOMZONA varchar(60),
    CODCOBR integer,
    NOMCOBR varchar(60),
    SUCURSAL varchar(10),
    NOMSUC varchar(60),
    DV char(1),
    CODCIUD char(5),
    NOMCIUD varchar(60),
    INICIAL numeric(18,2),
    TIPODOC varchar(8),
    TIPOREF integer,
    IDDOC integer,
    PREFIJO varchar(4),
    NUMERO varchar(6),
    FECHA date,
    VENCE date,
    DEBITO numeric(18,2),
    CREDITO numeric(18,2),
    SALDO numeric(18,2),
    RTFTE numeric(18,2),
    RTIVA numeric(18,2),
    RTICA numeric(18,2),
    CUPO numeric(18,2))
AS
declare variable NITINI VARCHAR(20);
declare variable NITFIN VARCHAR(20);
declare variable NOMINI VARCHAR(20);
declare variable NOMFIN VARCHAR(20);
declare variable OK CHAR(1);
declare variable DB CHAR(1);
declare variable TRM NUMERIC(18,2);
BEGIN
if (ORDEN = 'C') then
    BEGIN
    NITINI = DESDE;
    NITFIN = HASTA;
    NOMINI = '';
    NOMFIN = 'zz';
    END
ELSE
    BEGIN
    NOMINI = DESDE;
    NOMFIN = HASTA;
    NITINI = '';
    NITFIN = 'zz';
    END
  /* Ubique el NIT */
  FOR select T.TERC_NIT, TERC_NOM, TERC_DV, CLSU_TEL, CLSU_CIUDAD, S.COBR_COD, S.ZONA_COD, T.CIUD_COD, CLIE_CUPO, CLCU_COD, CLSU_NOMBRE
    from terceros T, CLIENTES C, CLIENTE_SUCURSALES S
    where C.TERC_NIT  = T.TERC_NIT AND TERC_CLIE = 'S' AND S.TERC_NIT = C.TERC_NIT AND T.TERC_NIT >= :NITINI AND T.TERC_NIT <= :NITFIN AND
        TERC_NOM >= :NOMINI AND TERC_NOM <= :NOMFIN AND ((NOT EXISTS (SELECT AUTO_NUMERO FROM AUTORIZACIONES WHERE AUTO_NITCONTADO = T.terc_nit))) AND
        EXISTS (SELECT MVCL_ID FROM MOVIMIENTO_CLIENTES WHERE TERC_NIT = T.terc_nit AND MVCL_FECHA = :fecini)
    INTO :NIT, :NOMBRE, :DV, :TELEFONO, :CIUDAD, :CODCOBR, :CODZONA, :CODCIUD, :CUPO, :SUCURSAL, :NOMSUC
    DO  
    BEGIN
    SELECT COBR_NOM FROM COBRADORES WHERE COBR_COD = :CODCOBR INTO :NOMCOBR;
    SELECT ZONA_NOM FROM ZONAS WHERE ZONA_COD = :CODZONA INTO :NOMZONA;
    SELECT CIUD_NOM FROM CIUDADES WHERE CIUD_COD = :CODCIUD INTO :NOMCIUD;
    OK = 'N';
    if (AGRUPA = 'Z') then
        BEGIN
        if (GRPINI = '') then
            BEGIN
            if ((CODZONA IS NULL) or (CODZONA >= :GRPINI AND CODZONA <= :GRPFIN)) then
                OK = 'S';
            END
        ELSE
            if (CODZONA >= :GRPINI AND CODZONA <= :GRPFIN) then
                OK = 'S';
        END
    if (AGRUPA = 'I') then
        BEGIN
        if (GRPINI = '') then
            BEGIN
            if ((CODCIUD IS NULL) or (CODCIUD >= :GRPINI AND CODCIUD <= :GRPFIN)) then
                OK = 'S';
            END
        ELSE
            if (CODCIUD >= :GRPINI AND CODCIUD <= :GRPFIN) then
                OK = 'S';
        END
    if (AGRUPA = 'N') then
        OK = 'S';
        
    if (OK = 'S') then
        BEGIN
        INICIAL = 0;
        FECINI = FECINI - 1;
        FOR SELECT MVCL_TIPOREF, MVCL_IDREF FROM MOVIMIENTO_CLIENTES
          WHERE TERC_NIT = :NIT AND MVCL_SUCURSAL = :SUCURSAL AND MVCL_FECHA <= :FECINI AND
            MVCL_ABONO = 'N' AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA)) AND ((:MONEDA = 0) or (MVCL_TRM <> 1))
          INTO :TIPODOC, :IDDOC
          DO
            BEGIN
            EXECUTE PROCEDURE saldo_doc_cartera(TIPODOC, IDDOC, FECINI, MONEDA) returning_values (SALDO);
            INICIAL = INICIAL + SALDO;
            END
        SALDO = INICIAL;
        FECINI = FECINI + 1;
        FOR select mvcl_tiporef, tido_nomcorto, mvcl_idref, mvcl_prefref, mvcl_numref, mvcl_fecha, mvcl_monto, mvcl_debito, mvcl_rtefte, mvcl_rteiva, mvcl_rteica, mvcl_vence, MVCL_TRM
            from movimiento_clientes m, tipo_documento t
            where m.mvcl_tiporef = t.tido_cod and terc_nit = :NIT and MVCL_SUCURSAL = :SUCURSAL AND
                mvcl_fecha = :FECINI and mvcl_tiporef <> 45 AND MVCL_ABONO = 'N' AND
                ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA)) AND ((:MONEDA = 0) or (MVCL_TRM <> 1))
            order by mvcl_fecha, mvcl_tiporef, mvcl_idref
            into :TIPOREF, :TIPODOC, :IDDOC, :PREFIJO, :NUMERO, :FECHA, :DEBITO, :DB, :RTFTE, :RTIVA, :RTICA, :VENCE, :TRM
            DO
            BEGIN
            if ((NOT EXISTS (SELECT D.RECA_ID FROM RECIBOS_CAJA_DETALLE D, RECIBOS_CAJA R
                WHERE R.reca_id = D.reca_id AND D.RCDE_TIPODOC = :TIPOREF AND D.RCDE_IDDOC = :IDDOC AND R.reca_fecha = :FECHA AND R.reca_anulado = 'N')) AND
                (NOT EXISTS (SELECT P.APCL_ID FROM aplicacion_cliente_detalle P, aplicacion_cliente A
                WHERE A.apcl_id = P.apcl_id AND P.acde_tipodoc = :TIPOREF AND P.acde_iddoc = :IDDOC AND A.apcl_fecha = :FECHA AND A.apcl_anulado = 'N'))) then
                BEGIN
                if (RTFTE IS NULL) then
                    RTFTE = 0;
                if (RTIVA IS NULL) then
                    RTIVA = 0;
                if (RTICA IS NULL) then
                    RTICA = 0;
                if (DB = 'N') then
                    BEGIN
                    CREDITO = DEBITO;
                    DEBITO = 0;
                    RTFTE = rtfte * -1;
                    RTIVA = rtiva * -1;
                    RTICA = rtica * -1;
                    END
                ELSE
                    CREDITO = 0;
                if ((MONEDA <> 0) AND (TRM <> 0)) then
                    BEGIN
                    SALDO = saldo / TRM;
                    DEBITO = DEBITO / TRM;
                    CREDITO = CREDITO / TRM;
                    RTFTE = RTFTE / TRM;
                    RTIVA = RTIVA / TRM;
                    RTICA = RTICA / TRM;
                    END
                END
            SUSPEND;
            END
        END
    if (AGRUPA = 'C') then
        BEGIN
        FOR SELECT DISTINCT COBR_COD FROM MOVIMIENTO_CLIENTES
            WHERE TERC_NIT = :NIT AND MVCL_SUCURSAL = :SUCURSAL AND MVCL_FECHA <= :FECINI AND
            MVCL_ABONO = 'N' AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA))
            INTO :codcobr
            DO
            BEGIN
            OK = 'N';
            if (GRPINI = '') then
                BEGIN
                if ((CODCOBR IS NULL) or (CODCOBR >= :GRPINI AND CODCOBR <= :GRPFIN)) then
                    OK = 'S';
                END
            ELSE
                if (CODCOBR >= :GRPINI AND CODCOBR <= :GRPFIN) then
                    OK = 'S';
            if (OK = 'S') then
                BEGIN
                SELECT COBR_NOM FROM COBRADORES WHERE COBR_COD = :CODCOBR INTO :NOMCOBR;
                INICIAL = 0;
                FECINI = FECINI - 1;
                FOR SELECT MVCL_TIPOREF, MVCL_IDREF FROM MOVIMIENTO_CLIENTES
                  WHERE TERC_NIT = :NIT AND MVCL_SUCURSAL = :SUCURSAL AND MVCL_FECHA <= :FECINI AND ((:MONEDA = 0) or (MVCL_TRM <> 1)) AND
                  COBR_COD = :CODCOBR AND MVCL_ABONO = 'N' AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA))
                  INTO :TIPODOC, :IDDOC
                  DO
                    BEGIN
                    EXECUTE PROCEDURE saldo_doc_cartera(TIPODOC, IDDOC, FECINI, MONEDA) returning_values (SALDO);
                    INICIAL = INICIAL + SALDO;
                    END
                SALDO = INICIAL;
                FECINI = FECINI + 1;
                FOR select mvcl_tiporef, tido_nomcorto, mvcl_idref, mvcl_prefref, mvcl_numref, mvcl_fecha, mvcl_monto, mvcl_debito, mvcl_rtefte, mvcl_rteiva, mvcl_rteica, mvcl_vence, mvcl_trm
                    from movimiento_clientes m, tipo_documento t
                    where m.mvcl_tiporef = t.tido_cod and terc_nit = :NIT and MVCL_SUCURSAL = :SUCURSAL AND
                    mvcl_fecha = :FECINI and mvcl_tiporef <> 45 AND ((:MONEDA = 0) or (MVCL_TRM <> 1)) AND
                    COBR_COD = :CODCOBR AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA)) AND MVCL_ABONO = 'N'
                    order by mvcl_fecha, mvcl_tiporef, mvcl_idref
                    into :TIPOREF, :TIPODOC, :IDDOC, :PREFIJO, :NUMERO, :FECHA, :DEBITO, :DB, :RTFTE, :RTIVA, :RTICA, :VENCE, :TRM
                    DO
                    if ((NOT EXISTS (SELECT D.RECA_ID FROM RECIBOS_CAJA_DETALLE D, RECIBOS_CAJA R
                        WHERE R.reca_id = D.reca_id AND D.RCDE_TIPODOC = :TIPOREF AND D.RCDE_IDDOC = :IDDOC AND R.reca_fecha = :FECHA AND R.reca_anulado = 'N')) AND
                        (NOT EXISTS (SELECT P.APCL_ID FROM aplicacion_cliente_detalle P, aplicacion_cliente A
                        WHERE A.apcl_id = P.apcl_id AND P.acde_tipodoc = :TIPOREF AND P.acde_iddoc = :IDDOC AND A.apcl_fecha = :FECHA AND A.apcl_anulado = 'N'))) then
                        BEGIN
                        if (RTFTE IS NULL) then
                            RTFTE = 0;
                        if (RTIVA IS NULL) then
                            RTIVA = 0;
                        if (RTICA IS NULL) then
                            RTICA = 0;
                        if (DB = 'N') then
                            BEGIN
                            CREDITO = DEBITO;
                            DEBITO = 0;
                            RTFTE = rtfte * -1;
                            RTIVA = rtiva * -1;
                            RTICA = rtica * -1;
                            END
                        ELSE
                            CREDITO = 0;
                        if ((MONEDA <> 0) AND (TRM <> 0)) then
                            BEGIN
                            SALDO = saldo / TRM;
                            DEBITO = DEBITO / TRM;
                            CREDITO = CREDITO / TRM;
                            RTFTE = RTFTE / TRM;
                            RTIVA = RTIVA / TRM;
                            RTICA = RTICA / TRM;
                            END
                        SUSPEND;
                        END
                END  /* ok = S */
            END  /* FOR COBRADOR */
        END  /* AGRUPA C */
    END  /* FOR NIT */
END
^

SET TERM ; ^


grant EXECUTE on PROCEDURE rep_movimiento_diario to PUBLIC;

/* 20091209B */
/* CUADRE DE CAJA POR AGENCIA */

SET TERM ^ ;

CREATE OR ALTER procedure CUADRE_CAJA (
    FECHA date,
    AGENCIA INTEGER)
returns (
    VTACONTADO numeric(18,2),
    VTACREDITO numeric(18,2),
    VTATOTAL numeric(18,2),
    VTARETS numeric(18,2),
    DEVCONTADO numeric(18,2),
    DEVCREDITO numeric(18,2),
    DEVTOTAL numeric(18,2),
    DEVOTRODIA numeric(18,2),
    DEVRETS numeric(18,2),
    NETOCONTADO numeric(18,2),
    NETOCREDITO numeric(18,2),
    NETOTOTAL numeric(18,2),
    NETORETS numeric(18,2),
    INGCONTADO numeric(18,2),
    INGDESCTO numeric(18,2),
    INGCXC numeric(18,2),
    INGOTROS numeric(18,2),
    INGTOTAL numeric(18,2),
    EGRCXP numeric(18,2),
    EGROTROS numeric(18,2),
    EGRTOTAL numeric(18,2),
    CONSIGNA numeric(18,2),
    FORMAP1 numeric(18,2),
    FORMAP2 numeric(18,2),
    FORMAP3 numeric(18,2),
    FORMAP4 numeric(18,2),
    FORMAP5 numeric(18,2),
    FORMAP6 numeric(18,2),
    FORMAP7 numeric(18,2),
    FORMAP8 numeric(18,2),
    FORMAP9 numeric(18,2),
    FORMAP0 numeric(18,2))
AS
declare variable DEVDSCTOS NUMERIC(18,2);
declare variable APLIDEV NUMERIC(18,2);
declare variable APLIFAC NUMERIC(18,2);
declare variable IDDOC INTEGER;
declare variable FECDOC DATE;
declare variable APLICA NUMERIC(18,2);
begin
/* ventas totales */
SELECT SUM(FACT_TOTAL), SUM(FACT_RTFTEMONTO+FACT_RTIVAMONTO+FACT_RTICAMONTO) FROM FACTURAS F, PREFIJOS P
    WHERE FACT_FECHA = :FECHA AND FACT_ANULADO = 'N' AND P.tido_cod = 31 AND P.pref_pre = F.pref_pre AND ((:AGENCIA = 0) or (P.sucu_id = :AGENCIA))
    INTO :VTATOTAL, :vtarets;
if (vtatotal IS NULL) then
    vtatotal = 0;
if (vtarets IS NULL) then
    vtarets = 0;
vtatotal = VTATOTAL - vtarets;
SELECT SUM(DEVT_TOTAL), SUM(DEVT_RTFTEMONTO+DEVT_RTIVAMONTO+DEVT_RTICAMONTO) FROM DEVOLUCIONES_VENTAS V, PREFIJOS P
    WHERE DEVT_FECHA = :FECHA AND DEVT_ANULADO = 'N' AND P.tido_cod = 31 AND P.pref_pre = V.pref_pre AND ((:AGENCIA = 0) or (P.sucu_id = :AGENCIA))
    INTO :DEVTOTAL, :devrets;
if (devtotal IS NULL) then
    devtotal = 0;
if (devrets IS NULL) then
    devrets = 0;
devtotal = DEVTOTAL - DEVRETS;
/* ventas contado */
SELECT SUM(RCDE_ABONO), SUM(RCDE_DTOF) FROM RECIBOS_CAJA_DETALLE D, RECIBOS_CAJA R,  FACTURAS F, PREFIJOS P
    WHERE FACT_FECHA = :FECHA AND D.rcde_tipodoc = 31 AND D.rcde_iddoc = F.fact_id AND R.reca_id = D.reca_id AND
        RECA_FECHA = :FECHA AND RCDE_ANULADO = 'N' AND P.tido_cod = 61 AND P.pref_pre = R.pref_pre AND ((:AGENCIA = 0) or (P.sucu_id = :AGENCIA))
    INTO :vtacontado, :ingdescto;
SELECT SUM(RCDE_ABONO), SUM(RCDE_DTOF) FROM RECIBOS_CAJA_DETALLE D, RECIBOS_CAJA R,  DEVOLUCIONES_VENTAS V, PREFIJOS P
    WHERE DEVT_FECHA = :FECHA AND D.rcde_tipodoc = 33 AND D.rcde_iddoc = V.devt_id AND R.reca_id = D.reca_id AND
    RECA_FECHA = :FECHA AND RCDE_ANULADO = 'N' AND P.tido_cod = 61 AND P.pref_pre = R.pref_pre AND ((:AGENCIA = 0) or (P.sucu_id = :AGENCIA))
    INTO :devcontado, :devdsctos;
if (vtacontado IS NULL) then
    vtacontado = 0;
if (ingdescto IS NULL) then
    ingdescto = 0;
if (devcontado IS NULL) then
    devcontado = 0;
else
    devcontado = devcontado * -1;
if (devdsctos IS NULL) then
    devdsctos = 0;
SELECT SUM(ACDE_APLICADO) FROM APLICACION_CLIENTE_DETALLE D, APLICACION_CLIENTE R,  FACTURAS F, PREFIJOS P
    WHERE FACT_FECHA = :FECHA AND D.acde_tipodoc = 31 AND D.acde_iddoc = F.fact_id AND R.apcl_id = D.apcl_id AND
    APCL_FECHA = :FECHA AND ACDE_ANULADO = 'N' AND P.tido_cod = 43 AND P.pref_pre = R.pref_pre AND ((:AGENCIA = 0) or (P.sucu_id = :AGENCIA))
    INTO :aplifac;
if (APLIFAC IS NULL) then
    APLIFAC = 0;
vtacontado = vtacontado + aplifac;
/* DESGLOCE LAS DEV DE HOY DE LAS DE AYER */
APLIDEV = 0;
devotrodia = 0;
FOR SELECT D.acde_iddoc, ACDE_APLICADO FROM APLICACION_CLIENTE_DETALLE D, APLICACION_CLIENTE R, PREFIJOS P
    WHERE R.apcl_id = D.apcl_id AND APCL_FECHA = :FECHA AND ACDE_ANULADO = 'N' AND D.acde_tipodoc = 33 AND P.tido_cod = 43 AND P.pref_pre = R.pref_pre AND ((:AGENCIA = 0) or (P.sucu_id = :AGENCIA))
    INTO :IDDOC, :aplica
    DO
    BEGIN
    SELECT DEVT_FECHA, DEVT_FACTID FROM DEVOLUCIONES_VENTAS WHERE DEVT_ID = :IDDOC INTO :FECDOC, :IDDOC;
    SELECT FACT_FECHA FROM FACTURAS WHERE FACT_ID = :IDDOC INTO :FECDOC;
    if (FECDOC = FECHA) then
        APLIDEV = APLIDEV + aplica;
    ELSE
        devotrodia = devotrodia + APLICA;
    END
aplidev = aplidev * -1;
devotrodia = devotrodia * -1;
devtotal = devtotal - devotrodia;
devcontado = devcontado + aplidev;
/* Ventas credito */
vtacredito = vtatotal - vtacontado;
devcredito = devtotal - devcontado;
netocontado = vtacontado - devcontado;
netocredito = vtacredito - devcredito;
netototal = vtatotal - devtotal;
netorets = vtarets - devrets;
/* recibos contado */
ingcontado = vtacontado - devcontado;
ingdescto = ingdescto - devdsctos;

/* recibos totales */
select sum(reca_monto) from recibos_caja r, prefijos p
    where reca_fecha = :fecha AND RECA_ANULADO = 'N' AND P.tido_cod = 61 AND P.pref_pre = r.pref_pre AND ((:AGENCIA = 0) or (P.sucu_id = :AGENCIA))
    into :ingtotal;
if (ingtotal IS NULL) then
    ingtotal = 0;
/* recibos otros */
select sum(reca_monto) from recibos_caja r, prefijos p
    where reca_fecha = :fecha AND RECA_ANULADO = 'N' AND P.tido_cod = 61 AND P.pref_pre = r.pref_pre AND ((:AGENCIA = 0) or (P.sucu_id = :AGENCIA))
    and NOT EXISTS (select reca_id from recibos_caja_detalle WHERE RECA_ID = R.reca_id) into :ingotros;
if (ingotros IS NULL) then
    ingotros = 0;
/* recibos cxc */
select sum(rcde_abono) from recibos_caja_detalle d, recibos_caja r,  movimiento_clientes m, prefijos p
    where r.reca_id = d.reca_id and r.reca_fecha = :fecha and d.rcde_tipodoc = m.mvcl_tiporef and d.rcde_iddoc = m.mvcl_idref
    AND RCDE_ANULADO = 'N' AND ((MVCL_TIPOREF <> 31 AND MVCL_TIPOREF <> 33) OR mvcl_fecha <> :fecha)
    AND P.tido_cod = 61 AND P.pref_pre = r.pref_pre AND ((:AGENCIA = 0) or (P.sucu_id = :AGENCIA))
    into :ingcxc;
if (ingcxc IS NULL) then
    ingcxc = 0;

/* EGRESOS totales */
select sum(egca_monto) from egresos e, egresos_caja c, prefijos p
    where e.egre_id = c.egre_id and C.egca_fecha = :fecha AND E.egre_anulado = 'N'
    AND P.tido_cod = 62 AND P.pref_pre = e.pref_pre AND ((:AGENCIA = 0) or (P.sucu_id = :AGENCIA))
    into :egrtotal;
if (egrtotal IS NULL) then
    egrtotal = 0;
/* EGRESOS otros */
select sum(egca_monto) from egresos e, egresos_caja c, prefijos p
    where e.egre_id = c.egre_id and C.egca_fecha = :fecha AND E.egre_anulado = 'N' and
    not exists (select egre_id from egresos_detalle WHERE EGRE_ID = E.egre_id)
    AND P.tido_cod = 62 AND P.pref_pre = e.pref_pre AND ((:AGENCIA = 0) or (P.sucu_id = :AGENCIA))
    into :egrotros;
if (egrotros IS NULL) then
    egrotros = 0;
/* EGRESOS cxp */
egrcxp = egrtotal - egrotros;

/* CONSIGNACIONES */
select sum(code_monto) from consigna c, consigna_detalle d, cajas j
    where c.cons_id = d.cons_id and cons_fecha = :fecha AND CONS_ANULADO = 'N' and
    d.caja_id = j.caja_id AND ((:AGENCIA = 0) or (j.sucu_id = :AGENCIA))
    into :consigna;
if (consigna IS NULL) then
    consigna = 0;

/* POR FORMA DE PAGO */
SELECT SUM(RCPA_MONTO) FROM RECIBOS_CAJA_PAGO G, RECIBOS_CAJA R, prefijos p
    WHERE R.RECA_ID = G.RECA_ID AND RECA_FECHA = :FECHA AND FOPA_ID = 1 and RECA_ANULADO = 'N'
    AND P.tido_cod = 61 AND P.pref_pre = r.pref_pre AND ((:AGENCIA = 0) or (P.sucu_id = :AGENCIA))
    INTO :FORMAP1;
SELECT SUM(RCPA_MONTO) FROM RECIBOS_CAJA_PAGO G, RECIBOS_CAJA R, prefijos p
    WHERE R.RECA_ID = G.RECA_ID AND RECA_FECHA = :FECHA AND FOPA_ID = 2 and RECA_ANULADO = 'N'
    AND P.tido_cod = 61 AND P.pref_pre = r.pref_pre AND ((:AGENCIA = 0) or (P.sucu_id = :AGENCIA))
    INTO :FORMAP2;
SELECT SUM(RCPA_MONTO) FROM RECIBOS_CAJA_PAGO G, RECIBOS_CAJA R, prefijos p
    WHERE R.RECA_ID = G.RECA_ID AND RECA_FECHA = :FECHA AND FOPA_ID = 3 and RECA_ANULADO = 'N'
    AND P.tido_cod = 61 AND P.pref_pre = r.pref_pre AND ((:AGENCIA = 0) or (P.sucu_id = :AGENCIA))
    INTO :FORMAP3;
SELECT SUM(RCPA_MONTO) FROM RECIBOS_CAJA_PAGO G, RECIBOS_CAJA R, prefijos p
    WHERE R.RECA_ID = G.RECA_ID AND RECA_FECHA = :FECHA AND FOPA_ID = 4 and RECA_ANULADO = 'N'
    AND P.tido_cod = 61 AND P.pref_pre = r.pref_pre AND ((:AGENCIA = 0) or (P.sucu_id = :AGENCIA))
    INTO :FORMAP4;
SELECT SUM(RCPA_MONTO) FROM RECIBOS_CAJA_PAGO G, RECIBOS_CAJA R, prefijos p
    WHERE R.RECA_ID = G.RECA_ID AND RECA_FECHA = :FECHA AND FOPA_ID = 5 and RECA_ANULADO = 'N'
    AND P.tido_cod = 61 AND P.pref_pre = r.pref_pre AND ((:AGENCIA = 0) or (P.sucu_id = :AGENCIA))
    INTO :FORMAP5;
SELECT SUM(RCPA_MONTO) FROM RECIBOS_CAJA_PAGO G, RECIBOS_CAJA R, prefijos p
    WHERE R.RECA_ID = G.RECA_ID AND RECA_FECHA = :FECHA AND FOPA_ID = 6 and RECA_ANULADO = 'N'
    AND P.tido_cod = 61 AND P.pref_pre = r.pref_pre AND ((:AGENCIA = 0) or (P.sucu_id = :AGENCIA))
    INTO :FORMAP6;
SELECT SUM(RCPA_MONTO) FROM RECIBOS_CAJA_PAGO G, RECIBOS_CAJA R, prefijos p
    WHERE R.RECA_ID = G.RECA_ID AND RECA_FECHA = :FECHA AND FOPA_ID = 7 and RECA_ANULADO = 'N'
    AND P.tido_cod = 61 AND P.pref_pre = r.pref_pre AND ((:AGENCIA = 0) or (P.sucu_id = :AGENCIA))
    INTO :FORMAP7;
SELECT SUM(RCPA_MONTO) FROM RECIBOS_CAJA_PAGO G, RECIBOS_CAJA R, prefijos p
    WHERE R.RECA_ID = G.RECA_ID AND RECA_FECHA = :FECHA AND FOPA_ID = 8 and RECA_ANULADO = 'N'
    AND P.tido_cod = 61 AND P.pref_pre = r.pref_pre AND ((:AGENCIA = 0) or (P.sucu_id = :AGENCIA))
    INTO :FORMAP8;
SELECT SUM(RCPA_MONTO) FROM RECIBOS_CAJA_PAGO G, RECIBOS_CAJA R, prefijos p
    WHERE R.RECA_ID = G.RECA_ID AND RECA_FECHA = :FECHA AND FOPA_ID = 9 and RECA_ANULADO = 'N'
    AND P.tido_cod = 61 AND P.pref_pre = r.pref_pre AND ((:AGENCIA = 0) or (P.sucu_id = :AGENCIA))
    INTO :FORMAP9;
SELECT SUM(RCPA_MONTO) FROM RECIBOS_CAJA_PAGO G, RECIBOS_CAJA R, prefijos p
    WHERE R.RECA_ID = G.RECA_ID AND RECA_FECHA = :FECHA AND FOPA_ID = 10 and RECA_ANULADO = 'N'
    AND P.tido_cod = 61 AND P.pref_pre = r.pref_pre AND ((:AGENCIA = 0) or (P.sucu_id = :AGENCIA))
    INTO :FORMAP0;
if (formap1 is null) then
    formap1 = 0;
if (formap2 is null) then
    formap2 = 0;
if (formap3 is null) then
    formap3 = 0;
if (formap4 is null) then
    formap4 = 0;
if (formap5 is null) then
    formap5 = 0;
if (formap6 is null) then
    formap6 = 0;
if (formap7 is null) then
    formap7 = 0;
if (formap8 is null) then
    formap8 = 0;
if (formap9 is null) then
    formap9 = 0;
if (formap0 is null) then
    formap0 = 0;
SUSPEND;
end
^

SET TERM ; ^

SET TERM ^ ;

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

SET TERM ; ^

SET TERM ^ ;

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

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure CUADRE_CAJA_FPAGO (
    FECHA date,
    AGENCIA INTEGER)
returns (
    CHETIPO varchar(30),
    CHERECIBO varchar(10),
    CHEMONTO numeric(18,2))
AS
begin
/* DETALLE DE LAS FORMAS DE PAGO */
FOR SELECT FOPA_NOM, RCPA_MONTO, RECA_NUMERO FROM RECIBOS_CAJA_PAGO RP, RECIBOS_CAJA R, formas_pago F, PREFIJOS P
    WHERE R.RECA_ID = RP.RECA_ID AND RECA_FECHA = :FECHA AND F.fopa_id = RP.fopa_id AND RP.FOPA_ID <> 1 and
    RECA_ANULADO = 'N' AND P.tido_cod = 61 AND P.pref_pre = R.pref_pre AND ((:AGENCIA = 0) or (P.sucu_id = :AGENCIA))
    INTO :chetipo, :chemonto, :cherecibo
    DO
    BEGIN
    if (chemonto IS NULL) then
        chemonto = 0;
    SUSPEND;
    END
end
^

SET TERM ; ^


/* 20091209C */
/* INCLUIR NIT Y NOMBRE DEL CLIENTE EN MOV.CAJA POR FORMA DE PAGO */

SET TERM ^ ;

CREATE OR ALTER procedure REP_MOVCAJA_DOCUMENTOS (
    FECINI date,
    FECFIN date,
    CAJINI integer,
    CAJFIN integer,
    SUBEMPRESA integer)
returns (
    FECHA date,
    TIPO varchar(8),
    PREFIJO varchar(4),
    NUMERO varchar(6),
    FORPAGO varchar(30),
    BANCO varchar(2),
    CUENTA varchar(20),
    NUMDOC varchar(20),
    DEBITO numeric(18,2),
    CREDITO numeric(18,2),
    NIT VARCHAR(20),
    NOMBRE VARCHAR(60),
    CONCEPTO varchar(60),
    ENCARGADO varchar(60),
    CAJA varchar(60),
    CODIGO integer,
    TIPODOC integer,
    IDDOC integer,
    IDFORMA integer)
AS
BEGIN
FOR SELECT CAJA_ID,CAJA_NOMBRE,CAJA_RESP
  FROM CAJAS
  WHERE CAJA_ID >= :CAJINI AND CAJA_ID <= :CAJFIN AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
  ORDER BY CAJA_ID
  INTO :CODIGO,:CAJA,:ENCARGADO
  DO
    BEGIN
    FOR SELECT MOCA_TIPOREF, MOCA_IDREF, MOCA_FECHA, TIDO_NOMCORTO, MOCA_PREFREF, MOCA_NUMREF, MOCA_CONC
        FROM MOVIMIENTO_CAJA M, TIPO_DOCUMENTO T
        WHERE M.MOCA_TIPOREF = T.TIDO_COD AND M.CAJA_ID =:CODIGO AND M.MOCA_FECHA >=:FECINI AND M.MOCA_FECHA <=:FECFIN
        ORDER BY MOCA_FECHA, MOCA_TIPOREF, MOCA_ID
        INTO :TIPODOC, :IDDOC, :FECHA, :TIPO, :PREFIJO, :NUMERO, :CONCEPTO
        DO
        BEGIN
        NIT = '';
        NOMBRE = '';
        if (TIPODOC = 61) then
            BEGIN
            SELECT TERC_NIT, RECA_NOMTERC FROM RECIBOS_CAJA WHERE RECA_ID = :IDDOC INTO :NIT, :NOMBRE;
            FOR SELECT FOPA_NOM, RCPA_BANCO, RCPA_CUENTA, RCPA_NUMERO, RCPA_MONTO, 0, R.FOPA_ID
                FROM RECIBOS_CAJA_PAGO R, FORMAS_PAGO F
                WHERE RECA_ID = :IDDOC AND R.FOPA_ID = F.FOPA_ID
                ORDER BY RCPA_ITEM
                INTO :FORPAGO, :BANCO, :CUENTA, :NUMDOC, :DEBITO, :CREDITO, :IDFORMA
                DO
                    SUSPEND;
            END
        if (TIPODOC = 62) then
            BEGIN
            SELECT TERC_NIT, EGRE_NOMTERC FROM EGRESOS WHERE EGRE_ID = :IDDOC INTO :NIT, :NOMBRE;
            FOR SELECT 'EFECTIVO', NULL, NULL, NULL, EGRE_MONTO, 0, 1 FROM EGRESOS E
                WHERE EGRE_ID = :IDDOC AND EGRE_TIPO = 2 AND CAJA_ID = :CODIGO
                INTO :FORPAGO, :BANCO, :CUENTA, :NUMDOC, :DEBITO, :CREDITO, :IDFORMA
                DO
                    SUSPEND;
            FOR SELECT FOPA_NOM, EGCA_BANCO, EGCA_CUENTA, EGCA_NUMERO, 0, EGCA_MONTO, E.FOPA_ID
                FROM EGRESOS_CAJA E, FORMAS_PAGO F
                WHERE EGRE_ID = :IDDOC AND E.FOPA_ID = F.FOPA_ID AND CAJA_ID = :CODIGO
                ORDER BY EGCA_ITEM
                INTO :FORPAGO, :BANCO, :CUENTA, :NUMDOC, :DEBITO, :CREDITO, :IDFORMA
                DO
                    SUSPEND;
            END
        if (TIPODOC = 63) then
            BEGIN
            FOR SELECT FOPA_NOM, CDEN_BANCO, CDEN_CUENTA, CDEN_NUMERO, 0, CDEN_MONTO, E.FOPA_ID
                FROM CAMBIODOC_ENTRADAS E, FORMAS_PAGO F
                WHERE CADO_ID = :IDDOC AND E.FOPA_ID = F.FOPA_ID
                ORDER BY CDEN_ITEM
                INTO :FORPAGO, :BANCO, :CUENTA, :NUMDOC, :DEBITO, :CREDITO, :IDFORMA
                DO
                    SUSPEND;
            FOR SELECT FOPA_NOM, CDSA_BANCO, CDSA_CUENTA, CDSA_NUMERO, CDSA_MONTO, 0, E.FOPA_ID
                FROM CAMBIODOC_SALIDAS E, FORMAS_PAGO F
                WHERE CADO_ID = :IDDOC AND E.FOPA_ID = F.FOPA_ID
                ORDER BY CDSA_ITEM
                INTO :FORPAGO, :BANCO, :CUENTA, :NUMDOC, :DEBITO, :CREDITO, :IDFORMA
                DO
                    SUSPEND;
            END
        if (TIPODOC = 65) then
            BEGIN
            SELECT TERC_NIT, RCPR_NOMTERC FROM recibo_provisional WHERE RCPR_ID = :IDDOC INTO :NIT, :NOMBRE;
            FOR SELECT FOPA_NOM, RPPA_BANCO, RPPA_CUENTA, RPPA_NUMERO, RPPA_MONTO, 0, R.FOPA_ID
                FROM RECIBO_PROVISIONAL_PAGO R, FORMAS_PAGO F
                WHERE RCPR_ID = :IDDOC AND R.FOPA_ID = F.FOPA_ID
                ORDER BY RPPA_ITEM
                INTO :FORPAGO, :BANCO, :CUENTA, :NUMDOC, :DEBITO, :CREDITO, :IDFORMA
                DO
                    SUSPEND;
            END
        if (TIPODOC = 66) then
            BEGIN
            FOR SELECT FOPA_NOM, TRCD_BANCO, TRCD_CUENTA, TRCD_NUMERO, 0, TRCD_MONTO, R.FOPA_ID
                FROM TRASLADOS_CAJA T, TRASLADOS_CAJA_DET R, FORMAS_PAGO F
                WHERE T.TRCJ_ID = :IDDOC AND R.FOPA_ID = F.FOPA_ID AND T.CAJA_ID = :CODIGO AND T.TRCJ_ID = R.TRCJ_ID
                ORDER BY TRCD_ITEM
                INTO :FORPAGO, :BANCO, :CUENTA, :NUMDOC, :DEBITO, :CREDITO, :IDFORMA
                DO
                    SUSPEND;
            FOR SELECT FOPA_NOM, TRCD_BANCO, TRCD_CUENTA, TRCD_NUMERO, TRCD_MONTO, 0, R.FOPA_ID
                FROM TRASLADOS_CAJA T, TRASLADOS_CAJA_DET R, FORMAS_PAGO F
                WHERE T.TRCJ_ID = :IDDOC AND R.FOPA_ID = F.FOPA_ID AND T.TRCJ_DESTINO = :CODIGO AND T.TRCJ_ID = R.TRCJ_ID
                ORDER BY TRCD_ITEM
                INTO :FORPAGO, :BANCO, :CUENTA, :NUMDOC, :DEBITO, :CREDITO, :IDFORMA
                DO
                    SUSPEND;
            END
        if (TIPODOC = 71) then
            BEGIN
            FOR SELECT FOPA_NOM, CODE_BANCO, CODE_CUENTA, CODE_NUMERO, 0, CODE_MONTO, C.FOPA_ID
                FROM CONSIGNA_DETALLE C, FORMAS_PAGO F
                WHERE CONS_ID = :IDDOC AND C.FOPA_ID = F.FOPA_ID AND CAJA_ID = :CODIGO
                INTO :FORPAGO, :BANCO, :CUENTA, :NUMDOC, :DEBITO, :CREDITO, :IDFORMA
                DO
                    SUSPEND;
            END
        if (TIPODOC = 77) then
            BEGIN
            SELECT DVCH_BANCO, DVCH_CUENTA, DVCH_NROCH, DVCH_MONTO, 0, 2, TERC_NIT, DVCH_NOMTERC
                FROM DEVOLUCION_CHEQUES D
                WHERE DVCH_ID = :IDDOC
                INTO :BANCO, :CUENTA, :NUMDOC, :DEBITO, :CREDITO, :IDFORMA, :NIT, :NOMBRE;
            FORPAGO  = 'CHEQUE';
            SUSPEND;
            END
        END
    END
END
^

SET TERM ; ^


/* 20091209D */
/* MONTO ORIGINAL DEL DOCUMENTO EN CARTERA CON NOTAS */

SET TERM ^ ;

CREATE OR ALTER procedure REP_CARTERA_CLIENTES (
    DESDE varchar(20),
    HASTA varchar(20),
    GRPINI varchar(5),
    GRPFIN varchar(5),
    FECHA date,
    ORDEN char(1),
    AGRUPA char(1),
    SUBEMPRESA integer,
    GRUPCART integer,
    MONEDA integer)
returns (
    NIT varchar(20),
    NOMBRE varchar(60),
    DIR varchar(60),
    TELEFONO varchar(40),
    CIUDAD varchar(40),
    CONTACTO varchar(60),
    EMAIL varchar(100),
    FAX varchar(25),
    CEL varchar(25),
    CODCLI varchar(20),
    CODZONA varchar(2),
    NOMZONA varchar(60),
    CODCOBR integer,
    NOMCOBR varchar(60),
    SUCURSAL varchar(10),
    NOMSUC varchar(60),
    DV char(1),
    CODCIUD char(5),
    NOMCIUD varchar(60),
    TIPO integer,
    ID integer,
    PREFIJO varchar(4),
    NUMERO varchar(6),
    CONCEPTO varchar(60),
    MONTO numeric(18,2),
    SALDO numeric(18,2),
    PROVISIONAL numeric(18,2),
    RTFTE numeric(18,2),
    RTIVA numeric(18,2),
    RTICA numeric(18,2),
    DTOF numeric(18,2),
    TIPONOM varchar(8),
    FECDOC date,
    VENCE date,
    DIAS integer,
    CUPO numeric(18,2),
    DISPONIBLE numeric(18,2),
    NOTA varchar(256),
    OBS blob sub_type 0 segment size 80,
    GRUPCOD integer,
    GRUPNOM varchar(30))
AS
DECLARE VARIABLE NITINI VARCHAR(20);
DECLARE VARIABLE NITFIN VARCHAR(20);
DECLARE VARIABLE NOMINI VARCHAR(20);
DECLARE VARIABLE NOMFIN VARCHAR(20);
DECLARE VARIABLE OK CHAR(1);
DECLARE VARIABLE FOV CHAR(11);
DECLARE VARIABLE DTOAPL NUMERIC(18,2);
DECLARE VARIABLE FECDTO DATE;
DECLARE VARIABLE FECNOTA VARCHAR(10);
DECLARE VARIABLE AUXNOTA VARCHAR(256);
DECLARE VARIABLE IDNOTA INTEGER;
declare variable descnt_prov char(2);
declare variable AUTORET VARCHAR(10);
declare variable FAUTORET DATE;
declare variable INCLANTI CHAR(2);
DECLARE VARIABLE TRM NUMERIC(18,2);
BEGIN
if (ORDEN = 'C') then
    BEGIN
    NITINI = DESDE;
    NITFIN = HASTA;
    NOMINI = '';
    NOMFIN = 'zz';
    END
ELSE
    BEGIN
    NOMINI = DESDE;
    NOMFIN = HASTA;
    NITINI = '';
    NITFIN = 'zz';
    END
  EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'DESCONTAR RECIBOS PROVISIONALES EN INFORMES DE CARTERA') RETURNING_VALUES (:descnt_prov);
  EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'INCLUIR ANTICIPOS DE CLIENTES EN REPORTES Y CONSULTAS DE CARTERA') returning_values (INCLANTI);
  EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'FECHA AUTORETENEDOR NO DESCONTAR RETENCIONES DEL SALDO PERO SI CONTABILIZARLAS') returning_values (AUTORET);
  EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'ANALISIS DE CARTERA CON FECHA FACTURA O VENCIMIENTO') RETURNING_VALUES (FOV);
  if (AUTORET <> '') then
    FAUTORET = CAST(AUTORET AS DATE);
  else
    FAUTORET = '9999/12/31';
  /* Ubique el NIT */
  FOR select C.TERC_NIT, TERC_NOM, TERC_DV, CLSU_DIR, CLSU_TEL, CLSU_CIUDAD, S.COBR_COD, S.ZONA_COD, T.CIUD_COD, CLIE_CUPO, CLCU_COD, CLSU_NOMBRE, t.terc_obs, C.GRCA_COD, TERC_CONTACTO, TERC_EMAIL, TERC_FAX, TERC_CEL, CLIE_COD
    from terceros T, CLIENTES C, CLIENTE_SUCURSALES S
    where C.TERC_NIT = T.TERC_NIT AND TERC_CLIE = 'S' AND S.TERC_NIT = C.TERC_NIT AND C.TERC_NIT >= :NITINI AND C.TERC_NIT <= :NITFIN AND
        TERC_NOM >= :NOMINI AND TERC_NOM <= :NOMFIN AND ((:GRUPCART = 0) or (C.GRCA_COD = :GRUPCART))
    INTO :NIT, :NOMBRE, :DV, :DIR, :TELEFONO, :CIUDAD, :CODCOBR, :CODZONA, :CODCIUD, :CUPO, :SUCURSAL, :NOMSUC, :obs, :GRUPCOD, :CONTACTO, :EMAIL, :FAX, :CEL, :CODCLI
    DO  
    BEGIN
    if (CODCOBR IS NOT NULL) then
        SELECT COBR_NOM FROM COBRADORES  WHERE COBR_COD = :CODCOBR INTO :NOMCOBR;
    if (CODZONA IS NOT NULL) then
        SELECT ZONA_NOM FROM ZONAS WHERE ZONA_COD = :CODZONA INTO :NOMZONA;
    if (CODCIUD IS NOT NULL) then
        SELECT CIUD_NOM FROM CIUDADES  WHERE CIUD_COD = :CODCIUD INTO :NOMCIUD;
    SELECT GRCA_NOMBRE FROM GRUPO_CARTERA WHERE GRCA_COD = :GRUPCOD INTO :GRUPNOM;
    DISPONIBLE = CUPO;
    OK = 'N';
    if (AGRUPA = 'Z') then
        BEGIN
        if (GRPINI = '') then
            BEGIN
            if ((CODZONA IS NULL) or (CODZONA >= :GRPINI AND CODZONA <= :GRPFIN)) then
                OK = 'S';
            END
        ELSE
            if (CODZONA >= :GRPINI AND CODZONA <= :GRPFIN) then
                OK = 'S';
        END
    if (AGRUPA = 'I') then
        BEGIN
        if (GRPINI = '') then
            BEGIN
            if ((CODCIUD IS NULL) or (CODCIUD >= :GRPINI AND CODCIUD <= :GRPFIN)) then
                OK = 'S';
            END
        ELSE
            if (CODCIUD >= :GRPINI AND CODCIUD <= :GRPFIN) then
                OK = 'S';
        END
    if (AGRUPA = 'N') then
        OK = 'S';
        
    if (OK = 'S') then
        BEGIN
        /* BUSQUE EN SALDOS_DOC_CARTERA LOS QUE TENGAN SALDO > 0 */
        FOR SELECT MVCL_TIPOREF, MVCL_IDREF, MVCL_PREFREF, MVCL_NUMREF, MVCL_FECHA, MVCL_VENCE, MVCL_CONC, MVCL_MONTO
            FROM MOVIMIENTO_CLIENTES WHERE TERC_NIT = :NIT AND MVCL_SUCURSAL = :SUCURSAL AND MVCL_FECHA <= :FECHA AND
            MVCL_ABONO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) AND ((:MONEDA = 0) or (MVCL_TRM <> 1))
            INTO :TIPO, :ID, :PREFIJO, :NUMERO, :FECDOC, :VENCE, :CONCEPTO, :MONTO
            DO
            BEGIN
            if ((inclanti = 'SI') or (TIPO <> 45)) then
                BEGIN
                EXECUTE PROCEDURE saldo_doc_cartera(TIPO, ID, FECHA, MONEDA) returning_values (SALDO);
                if (SALDO <> 0) then
                    BEGIN
                    PROVISIONAL = 0;
                    if (FOV = 'FECHA') then
                       DIAS = FECHA - FECDOC;
                    ELSE
                      DIAS = FECHA - VENCE;
                    DISPONIBLE = DISPONIBLE - SALDO;
                    SELECT TIDO_NOMCORTO FROM TIPO_DOCUMENTO WHERE TIDO_COD = :TIPO INTO :TIPONOM;
                    if (TIPO = 41) then
                        SELECT NDCL_DTOFMONTO, NDCL_FECHADTO, NDCL_TRM FROM NOTAS_DEBITO_CLIENTES
                            WHERE NDCL_ID = :ID INTO :DTOF, :FECDTO, :TRM;
                    if (TIPO = 42) then
                        SELECT 0, :FECDOC, 1 FROM NOTAS_CREDITO_CLIENTES
                            WHERE NCCL_ID = :ID INTO :DTOF, :FECDTO, :TRM;
                    if (TIPO = 45) then
                        SELECT ANCL_DTOFMONTO, ANCL_DTOFECHA, ANCL_TRM FROM ANTICIPOS_CLIENTE
                            WHERE ANCL_ID = :ID INTO :DTOF, :FECDTO, :TRM;
                    if (TIPO = 31) then
                        SELECT FACT_DTOFMONTO, FACT_DTOFFECHA, FACT_TRM FROM FACTURAS
                            WHERE FACT_ID = :ID INTO :DTOF, :FECDTO, :TRM;
                    if (TIPO = 33) then
                        SELECT 0, :FECDOC, 1 FROM devoluciones_ventas
                            WHERE DEVT_ID = :ID INTO :DTOF, :FECDTO, :TRM;
                    if ((MONEDA <> 0) AND (TRM <> 0)) then
                        DTOF = DTOF / TRM;
                    if (DTOF IS NULL) then
                        DTOF = 0;
                    if (DTOF <> 0) then
                        BEGIN
                        SELECT SUM(RCDE_DTOF), MAX(RECA_TRM) FROM RECIBOS_CAJA_DETALLE D, RECIBOS_CAJA R
                            WHERE R.reca_id = D.reca_id AND RCDE_IDDOC = :ID AND RCDE_TIPODOC = :TIPO
                            INTO :DTOAPL, :TRM;
                        if (DTOAPL IS NULL) then
                            DTOAPL = 0;
                        if ((MONEDA <> 0) AND (TRM <> 1)) then
                            DTOAPL = DTOAPL / TRM;
                        DTOF = DTOF - DTOAPL;
                        /* SI YA SE VENCIO DEJELO EN CERO */
                        if (FECDTO < FECHA) then
                            DTOF = 0;
                        END
                    if (MONEDA = 0) then
                        SELECT SUM(SDCA_RTFTE - SDCA_ABRTFTE), SUM(SDCA_RTIVA - SDCA_ABRTIVA), SUM(SDCA_RTICA - SDCA_ABRTICA)
                            FROM SALDOS_DOC_CARTERA WHERE SDCA_TIPOREF = :TIPO AND SDCA_IDREF = :ID
                            INTO :RTFTE, :RTIVA, :RTICA;
                    ELSE
                        SELECT SUM((SDCA_RTFTE - SDCA_ABRTFTE)/SDCA_TRM), SUM((SDCA_RTIVA - SDCA_ABRTIVA)/SDCA_TRM), SUM((SDCA_RTICA - SDCA_ABRTICA)/SDCA_TRM)
                            FROM SALDOS_DOC_CARTERA WHERE SDCA_TIPOREF = :TIPO AND SDCA_IDREF = :ID
                            INTO :RTFTE, :RTIVA, :RTICA;
                    if (RTFTE IS NULL) then
                        RTFTE = 0;
                    if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) THEN
                        BEGIN
                        if (RTFTE > 0) then
                            RTFTE = 0;
                        END
                    ELSE
                        BEGIN
                        if (RTFTE < 0) then
                            RTFTE = 0;
                        END
                    if (RTIVA IS NULL) then
                        RTIVA = 0;
                    if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) THEN
                        BEGIN
                        if (RTIVA > 0) then
                            RTIVA = 0;
                        END
                    ELSE
                        BEGIN
                        if (RTIVA < 0) then
                            RTIVA = 0;
                        END
                    if (RTICA IS NULL) then
                        RTICA = 0;
                    if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) THEN
                        BEGIN
                        if (RTICA > 0) then
                            RTICA = 0;
                        END
                    ELSE
                        BEGIN
                        if (RTICA < 0) then
                            RTICA = 0;
                        END
                    if (FAUTORET <= FECDOC) then
                        RTFTE = 0;
                    /* SI TIENE NOTA AGREGUELA */
                    SELECT MAX(NOCL_ID) FROM NOTAS_CLIENTES WHERE TERC_NIT = :NIT AND CLSU_COD = :SUCURSAL AND NOCL_TIPODOC = :TIPO AND NOCL_IDDOC = :ID INTO :IDNOTA;
                    if (IDNOTA IS NOT NULL) then
                        BEGIN
                        SELECT cast(NOCL_FECHA as char(10)), NOCL_TEXTO FROM NOTAS_CLIENTES
                            WHERE NOCL_ID = :IDNOTA INTO :FECNOTA, :AUXNOTA;
                        if (STRLEN(AUXNOTA) < 244) then
                            NOTA = FECNOTA || ':' || AUXNOTA;
                        ELSE
                            NOTA = AUXNOTA;
                        END
                    else
                        NOTA = '';
                    SUSPEND;
                    END  /* SALDO <> 0 */
                END  /* NO ANTICIPO */
            END  /* FOR */
        /* AGREGUE LOS RECIBOS PROVISIONALES CON SIGNO NEGATIVO */
        FOR SELECT 65, MAX(P.RCPR_ID), MAX(PREF_PRE), MAX(RCPR_NUMERO), MAX(RCPR_FECHA), MAX(RCPR_CONC), SUM(RPDE_ABONO * -1), SUM(RPDE_RTFTE*-1), SUM(RPDE_RTIVA*-1), SUM(RPDE_RTICA*-1), MAX(RCPR_TRM)
            FROM RECIBO_PROVISIONAL P, recibo_provisional_detalle D
            WHERE P.rcpr_id = D.rcpr_id AND P.TERC_NIT = :NIT AND RCPR_FECHA <= :FECHA AND RCPR_ANULADO = 'N' AND
            ((RCPR_FECCRUCE IS NULL) or (RCPR_FECCRUCE > :FECHA)) AND RPDE_SUCURSAL = :SUCURSAL AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY P.rcpr_id
            INTO :TIPO, :ID, :PREFIJO, :NUMERO, :FECDOC, :CONCEPTO, :PROVISIONAL, :rtfte,  :RTIVA, :RTICA, :TRM
            DO
            BEGIN
            if ((MONEDA <> 0) AND (TRM <> 0)) then
                PROVISIONAL = PROVISIONAL / TRM;
            if (:descnt_prov = 'NO') then
              SALDO = 0;
            else
              SALDO = :PROVISIONAL;
            SELECT TIDO_NOMCORTO FROM TIPO_DOCUMENTO WHERE TIDO_COD = :TIPO INTO :TIPONOM;
            /* CALCULE EL VENCIMIENTO DEL ULTIMO DOCUMENTO POSFECHADO */
            SELECT MAX(RPPA_FECHA) FROM recibo_provisional_pago WHERE RCPR_ID = :ID INTO :VENCE;
            DIAS = VENCE - FECHA;
            SUSPEND;
            END
        END
    if (AGRUPA = 'C') then
        BEGIN
        FOR SELECT DISTINCT COBR_COD FROM MOVIMIENTO_CLIENTES
            WHERE TERC_NIT = :NIT AND MVCL_SUCURSAL = :SUCURSAL AND MVCL_FECHA <= :FECHA AND
            MVCL_ABONO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            INTO :codcobr
            DO
            BEGIN
            OK = 'N';
            if (GRPINI = '') then
                BEGIN
                if ((CODCOBR IS NULL) or (CODCOBR >= :GRPINI AND CODCOBR <= :GRPFIN)) then
                    OK = 'S';
                END
            ELSE
                if (CODCOBR >= :GRPINI AND CODCOBR <= :GRPFIN) then
                    OK = 'S';
            if (OK = 'S') then
                BEGIN
                SELECT COBR_NOM FROM COBRADORES  WHERE COBR_COD = :CODCOBR INTO :NOMCOBR;
                /* BUSQUE EN SALDOS_DOC_CARTERA LOS QUE TENGAN SALDO > 0 */
                FOR SELECT MVCL_TIPOREF, MVCL_IDREF, MVCL_PREFREF, MVCL_NUMREF, MVCL_FECHA, MVCL_VENCE, MVCL_CONC, MVCL_MONTO
                    FROM MOVIMIENTO_CLIENTES WHERE TERC_NIT = :NIT AND MVCL_SUCURSAL = :SUCURSAL AND MVCL_FECHA <= :FECHA AND
                    MVCL_ABONO = 'N' AND COBR_COD = :codcobr AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) AND
                    ((:MONEDA = 0) or (MVCL_TRM <> 1))
                    INTO :TIPO, :ID, :PREFIJO, :NUMERO, :FECDOC, :VENCE, :CONCEPTO, :MONTO
                    DO
                    BEGIN
                    if ((inclanti = 'SI') or (TIPO <> 45)) then
                        BEGIN
                        EXECUTE PROCEDURE saldo_doc_cartera(TIPO, ID, FECHA, MONEDA) returning_values (SALDO);
                        if (SALDO <> 0) then
                            BEGIN
                            PROVISIONAL = 0;
                            if (FOV = 'FECHA') then
                               DIAS = FECHA - FECDOC;
                            ELSE
                              DIAS = FECHA - VENCE;
                            DISPONIBLE = DISPONIBLE - SALDO;
                            SELECT TIDO_NOMCORTO FROM TIPO_DOCUMENTO WHERE TIDO_COD = :TIPO INTO :TIPONOM;
                            if (TIPO = 41) then
                                SELECT NDCL_DTOFMONTO, NDCL_FECHADTO, NDCL_TRM FROM NOTAS_DEBITO_CLIENTES
                                    WHERE NDCL_ID = :ID INTO :DTOF, :FECDTO, :TRM;
                            if (TIPO = 42) then
                                SELECT 0, :FECDOC, 1 FROM NOTAS_CREDITO_CLIENTES
                                    WHERE NCCL_ID = :ID INTO :DTOF, :FECDTO, :TRM;
                            if (TIPO = 45) then
                                SELECT ANCL_DTOFMONTO, ANCL_DTOFECHA, ANCL_TRM FROM ANTICIPOS_CLIENTE
                                    WHERE ANCL_ID = :ID INTO :DTOF, :FECDTO, :TRM;
                            if (TIPO = 31) then
                                SELECT FACT_DTOFMONTO, FACT_DTOFFECHA, FACT_TRM FROM FACTURAS
                                    WHERE FACT_ID = :ID INTO :DTOF, :FECDTO, :TRM;
                            if (TIPO = 33) then
                                SELECT 0, :FECDOC, 1 FROM devoluciones_ventas
                                    WHERE DEVT_ID = :ID INTO :DTOF, :FECDTO, :TRM;
                            if (DTOF IS NULL) then
                                DTOF = 0;
                            if ((MONEDA <> 0) AND (TRM <> 0)) then
                                DTOF = DTOF / TRM;
                            if (DTOF <> 0) then
                                BEGIN
                                SELECT SUM(RCDE_DTOF) FROM RECIBOS_CAJA_DETALLE WHERE RCDE_IDDOC = :ID AND RCDE_TIPODOC = :TIPO INTO :DTOAPL;
                                if (DTOAPL IS NULL) then
                                    DTOAPL = 0;
                                DTOF = DTOF - DTOAPL;
                                /* SI YA SE VENCIO DEJELO EN CERO */
                                if (FECDTO < FECHA) then
                                    DTOF = 0;
                                END
                            SELECT SUM(SDCA_RTFTE - SDCA_ABRTFTE), SUM(SDCA_RTIVA - SDCA_ABRTIVA), SUM(SDCA_RTICA - SDCA_ABRTICA)
                                FROM SALDOS_DOC_CARTERA WHERE SDCA_TIPOREF = :TIPO AND SDCA_IDREF = :ID INTO :RTFTE, :RTIVA, :RTICA;
                            if (RTFTE IS NULL) then
                                RTFTE = 0;
                            if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) THEN
                                BEGIN
                                if (RTFTE > 0) then
                                    RTFTE = 0;
                                END
                            ELSE
                                BEGIN
                                if (RTFTE < 0) then
                                    RTFTE = 0;
                                END
                            if (FAUTORET <= FECDOC) then
                                RTFTE = 0;
                            if (RTIVA IS NULL) then
                                RTIVA = 0;
                            if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) THEN
                                BEGIN
                                if (RTIVA > 0) then
                                    RTIVA = 0;
                                END
                            ELSE
                                BEGIN
                                if (RTIVA < 0) then
                                    RTIVA = 0;
                                END
                            if (RTICA IS NULL) then
                                RTICA = 0;
                            if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) THEN
                                BEGIN
                                if (RTICA > 0) then
                                    RTICA = 0;
                                END
                            ELSE
                                BEGIN
                                if (RTICA < 0) then
                                    RTICA = 0;
                                END
                            /* SI TIENE NOTA AGREGUELA */
                            SELECT MAX(NOCL_ID) FROM NOTAS_CLIENTES WHERE TERC_NIT = :NIT AND CLSU_COD = :SUCURSAL AND NOCL_TIPODOC = :TIPO AND NOCL_IDDOC = :ID INTO :IDNOTA;
                            if (IDNOTA IS NOT NULL) then
                                BEGIN
                                SELECT cast(NOCL_FECHA as char(10)), NOCL_TEXTO FROM NOTAS_CLIENTES
                                    WHERE NOCL_ID = :IDNOTA INTO :FECNOTA, :AUXNOTA;
                                if (STRLEN(AUXNOTA) < 244) then
                                    NOTA = FECNOTA || ':' || AUXNOTA;
                                ELSE
                                    NOTA = AUXNOTA;
                                END
                            else
                                NOTA = '';
                            SUSPEND;
                            END  /* SALDO <> 0 */
                        END  /* NO ANTICIPO */
                    END  /* FOR */
                /* AGREGUE LOS RECIBOS PROVISIONALES CON SIGNO NEGATIVO */
                FOR SELECT 65, MAX(P.RCPR_ID), MAX(PREF_PRE), MAX(RCPR_NUMERO), MAX(RCPR_FECHA), MAX(RCPR_CONC), SUM(RPDE_ABONO * -1), SUM(RPDE_RTFTE*-1), SUM(RPDE_RTIVA*-1), SUM(RPDE_RTICA*-1), MAX(RCPR_TRM)
                    FROM RECIBO_PROVISIONAL P, recibo_provisional_detalle D
                    WHERE P.rcpr_id = D.rcpr_id AND P.TERC_NIT = :NIT AND P.VEND_COD = :codcobr AND RCPR_FECHA <= :FECHA AND RCPR_ANULADO = 'N' AND
                    ((RCPR_FECCRUCE IS NULL) or (RCPR_FECCRUCE > :FECHA)) AND RPDE_SUCURSAL = :SUCURSAL AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                    GROUP BY P.rcpr_id
                    INTO :TIPO, :ID, :PREFIJO, :NUMERO, :FECDOC, :CONCEPTO, :PROVISIONAL, :rtfte,  :RTIVA, :RTICA, :TRM
                    DO
                    BEGIN
                    if ((MONEDA <> 0) AND (TRM <> 0)) then
                        PROVISIONAL = PROVISIONAL / TRM;
                    MONTO = PROVISIONAL;
                    if (:descnt_prov = 'NO') then
                      SALDO = 0;
                    else
                      SALDO = :PROVISIONAL;
                    SELECT TIDO_NOMCORTO FROM TIPO_DOCUMENTO WHERE TIDO_COD = :TIPO INTO :TIPONOM;
                    /* CALCULE EL VENCIMIENTO DEL ULTIMO DOCUMENTO POSFECHADO */
                    SELECT MAX(RPPA_FECHA) FROM recibo_provisional_pago WHERE RCPR_ID = :ID INTO :VENCE;
                    DIAS = VENCE - FECHA;
                    SUSPEND;
                    END
                END /* ok */
            END  /* FOR COBR */
        END  /* AGRUPA = C */
    END  /* FOR NIT */
END
^

SET TERM ; ^



CREATE SEQUENCE ID_REPUTILIDAD;

CREATE TABLE REP_UTILIDAD (ID INTEGER NOT NULL,
    CODIGO T_COD_ARTICULO NOT NULL,
    BASE T_MONTO,
    IVA T_MONTO,
    CONSUMO T_MONTO,
    COSTO T_MONTO);
alter table REP_UTILIDAD
add constraint PK_REP_UTILIDAD
primary key (ID,CODIGO);

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

SET TERM ^ ;

CREATE OR ALTER procedure REP_UTILIDAD_VENTAS (
    TIPO integer,
    DETALLE char(1),
    FECINI date,
    FECFIN date,
    ARTINI varchar(15),
    ARTFIN varchar(15),
    GRPINI varchar(3),
    GRPFIN varchar(3),
    ORDEN char(1),
    AGRUPA char(1),
    ULTIMO char(1),
    CEROS char(1),
    SUBEMPRESA integer)
returns (
    ARTICULO varchar(15),
    DESCRIPCION varchar(60),
    CODGRUPO varchar(2),
    NOMGRUPO varchar(30),
    CODSUBG varchar(3),
    NOMSUBG varchar(30),
    CODMARC varchar(3),
    NOMMARC varchar(30),
    UNIDAD varchar(8),
    CANTIDAD numeric(18,4),
    BASE numeric(18,4),
    COSTO numeric(18,4),
    UTILIDAD numeric(18,4),
    PORC numeric(9,2),
    IVA numeric(18,4),
    CONSUMO numeric(18,4),
    PREFIJO varchar(4),
    NUMERO varchar(6),
    FECHA date,
    TIPODOC integer,
    PART numeric(9,2))
AS
DECLARE VARIABLE COSTOUNIT NUMERIC(18,4);
DECLARE VARIABLE CANTDET NUMERIC(18,4);
DECLARE VARIABLE TOTAL NUMERIC(18,2);
declare variable CODINI VARCHAR(15);
declare variable CODFIN VARCHAR(15);
declare variable DESINI VARCHAR(15);
declare variable DESFIN VARCHAR(15);
declare variable MARINI VARCHAR(3);
declare variable MARFIN VARCHAR(3);
declare variable UOM VARCHAR(20);
declare variable ULTCOS NUMERIC(18,2);
declare variable IDREP INTEGER;
BEGIN
if (ORDEN = 'C') then
    BEGIN
    CODINI = ARTINI;
    CODFIN = ARTFIN;
    DESINI = '';
    DESFIN = 'zz';
    END
ELSE
    BEGIN
    DESINI = ARTINI;
    DESFIN = ARTFIN;
    CODINI = '';
    CODFIN = 'zz';
    END
if (AGRUPA = 'G') then
    BEGIN
    MARINI = '';
    MARFIN = 'zz';
    END
ELSE
    if (AGRUPA = 'M') then
        BEGIN
        MARINI = GRPINI;
        MARFIN = GRPFIN;
        GRPINI = '';
        GRPFIN = 'zz';
        END
    ELSE
        BEGIN
        MARINI = '';
        MARFIN = 'zz';
        GRPINI = '';
        GRPFIN = 'zz';
        END
EXECUTE PROCEDURE lee_configuracion ('FACTURACION', 'ARTICULOS', 'SUGERIR PRECIOS CON PORCENTAJE DE MARGEN O UTILIDAD') returning_values (:UOM);
IDREP = GEN_ID(id_reputilidad, 1);
if (DETALLE = 'N') then
    BEGIN
    if (BIN_AND(TIPO, 1) <> 0) then
        BEGIN
        TIPODOC = 31;
        FOR SELECT MAX(D.ARTI_COD), SUM(FADE_CANT * FADE_FACTOR), SUM((FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO)*FACT_FACTOR), SUM(FADE_IVAMONTO*FACT_FACTOR), SUM(FADE_CONSUMO)
            FROM FACTURAS_DETALLE D, FACTURAS F, PREFIJOS P, ARTICULO A
            WHERE F.FACT_ID = D.FACT_ID AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND D.ARTI_COD = A.arti_cod AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            FACT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) and substring(a.arti_cod from 1 FOR 2) <> '.t'
            GROUP BY D.ARTI_COD
            INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO
            DO
            BEGIN
            COSTO = 0;
            FOR SELECT FADE_CANT * FADE_FACTOR, FACT_FECHA FROM FACTURAS_DETALLE D, FACTURAS F, PREFIJOS P
                WHERE F.FACT_ID = D.FACT_ID AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND
                FACT_ANULADO = 'N' AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                and D.ARTI_COD = :articulo  INTO :cantdet, :fecha
                DO
                BEGIN
                EXECUTE PROCEDURE costo_promedio_y_ultimo(:ARTICULO, :FECHA) returning_values (:costounit, :ultcos);
                if (ULTIMO = 'S') then
                    COSTO = COSTO + ultcos * cantdet;
                else
                    COSTO = COSTO + costounit * cantdet;
                END
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            INSERT INTO REP_UTILIDAD(ID, CODIGO, BASE, IVA, CONSUMO, COSTO) VALUES (:IDREP, :articulo, :base, :iva, :consumo, :costo);
            if (CEROS = 'S') then
                INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (2, USER, :ARTICULO);
            END /* FOR */
        SELECT SUM(BASE-COSTO) FROM REP_UTILIDAD WHERE id = :IDREP INTO :TOTAL;
        FOR SELECT ARTI_COD, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD FROM ARTICULO A
            WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND
            (A.MARC_COD <= :MARFIN))) AND substring(a.arti_cod from 1 FOR 2) <> '.t'
            INTO :ARTICULO, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
            DO
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            BASE = 0;
            IVA = 0;
            CONSUMO = 0;
            COSTO = 0;
            UTILIDAD = 0;
            PORC = 0;
            PART = 0;
            SELECT BASE, IVA, CONSUMO, COSTO FROM rep_utilidad WHERE ID = :IDREP AND CODIGO = :articulo INTO :BASE, :IVA, :consumo,  :costo;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            EXECUTE PROCEDURE PORCENTAJE (utilidad,  TOTAL, 'S') returning_values (part);
            if ((CEROS = 'S') or (BASE <> 0) or (COSTO <> 0)) then
                SUSPEND;
            END /* FOR */
            BEGIN
            COSTO = 0;
            END
        END
    if (BIN_AND(TIPO, 2) <> 0) then
        BEGIN
        TIPODOC = 32;
        FOR SELECT MAX(D.ARTI_COD), SUM(RVDE_CANT * RVDE_FACTOR), SUM(RVDE_TOTAL-RVDE_IVAMONTO-RVDE_CONSUMO), SUM(RVDE_IVAMONTO), SUM(RVDE_CONSUMO)
            FROM REMISIONES_VENTA_DETALLE D, REMISIONES_VENTA R, PREFIJOS P, ARTICULO A
            WHERE R.REVT_ID = D.REVT_ID AND P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = 32 AND D.ARTI_COD = A.arti_cod AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            REVT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY D.ARTI_COD
            INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO
            DO
            BEGIN
            COSTO = 0;
            FOR SELECT RVDE_CANT * RVDE_FACTOR, REVT_FECHA FROM remisiones_venta_detalle D, remisiones_venta F, PREFIJOS P
                WHERE F.revt_id = D.revt_id AND REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN AND
                REVT_ANULADO = 'N' AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 32 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                and D.ARTI_COD = :articulo  INTO :cantdet, :fecha
                DO
                BEGIN
                EXECUTE PROCEDURE costo_promedio_y_ultimo(:ARTICULO, :FECHA) returning_values (:costounit, :ultcos);
                if (ULTIMO = 'S') then
                    COSTO = COSTO + ultcos * cantdet;
                else
                    COSTO = COSTO + costounit * cantdet;
                END
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            if (CEROS = 'S') then
                INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (2, USER, :ARTICULO);
            INSERT INTO REP_UTILIDAD(ID, CODIGO, BASE, IVA, CONSUMO, COSTO) VALUES (:IDREP, :articulo, :base, :iva, :consumo, :costo);
            END /* FOR */
        SELECT SUM(BASE-COSTO) FROM REP_UTILIDAD WHERE id = :IDREP INTO :TOTAL;
        FOR SELECT ARTI_COD, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD FROM ARTICULO A
            WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND
            (A.MARC_COD <= :MARFIN))) AND substring(a.arti_cod from 1 FOR 2) <> '.t'
            INTO :ARTICULO, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
            DO
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            BASE = 0;
            IVA = 0;
            CONSUMO = 0;
            COSTO = 0;
            UTILIDAD = 0;
            PORC = 0;
            SELECT BASE, IVA, CONSUMO, COSTO FROM rep_utilidad WHERE ID = :IDREP AND CODIGO = :articulo INTO :BASE, :IVA, :consumo,  :costo;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            EXECUTE PROCEDURE PORCENTAJE (utilidad,  TOTAL, 'S') returning_values (part);
            if ((CEROS = 'S') or (BASE <> 0) or (COSTO <> 0)) then
                SUSPEND;
            END /* FOR */
        END
    if (BIN_AND(TIPO, 4) <> 0) then
        BEGIN
        TIPODOC = 33;
        FOR SELECT MAX(D.ARTI_COD), SUM(DVDE_CANT * DVDE_FACTOR), SUM((DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO)*DEVT_FACTOR), SUM(DVDE_IVAMONTO*DEVT_FACTOR), SUM(DVDE_CONSUMO)
            FROM devoluciones_ventas_detalle D, DEVOLUCIONES_VENTAS V, PREFIJOS P, ARTICULO A
            WHERE V.DEVT_ID = D.DEVT_ID AND P.PREF_PRE = V.PREF_PRE AND P.TIDO_COD = 33 AND D.ARTI_COD = A.arti_cod AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            DEVT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY D.ARTI_COD
            INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO
            DO
            BEGIN
            COSTO = 0;
            FOR SELECT DVDE_CANT * DVDE_FACTOR, DEVT_FECHA FROM devoluciones_ventas_detalle D, devoluciones_ventas F, PREFIJOS P
                WHERE F.devt_id = D.devt_id AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND
                DEVT_ANULADO = 'N' AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 33 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                and D.ARTI_COD = :articulo  INTO :cantdet, :fecha
                DO
                BEGIN
                EXECUTE PROCEDURE costo_promedio_y_ultimo(:ARTICULO, :FECHA) returning_values (:costounit, :ultcos);
                if (ULTIMO = 'S') then
                    COSTO = COSTO + ultcos * cantdet;
                else
                    COSTO = COSTO + costounit * cantdet;
                END
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            else
                CANTIDAD = CANTIDAD * -1;
            if (BASE IS NULL) then
                BASE = 0;
            else
                BASE = BASE * -1;
            if (IVA IS NULL) then
                IVA = 0;
            else
                IVA = IVA * -1;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            else
                CONSUMO = CONSUMO * -1;
            COSTO = costo * -1;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            if (CEROS = 'S') then
                INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (2, USER, :ARTICULO);
            INSERT INTO REP_UTILIDAD(ID, CODIGO, BASE, IVA, CONSUMO, COSTO) VALUES (:IDREP, :articulo, :base, :iva, :consumo, :costo);
            END /* FOR */
        SELECT SUM(BASE-COSTO) FROM REP_UTILIDAD WHERE id = :IDREP INTO :TOTAL;
        FOR SELECT ARTI_COD, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD FROM ARTICULO A
            WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND
            (A.MARC_COD <= :MARFIN))) AND substring(a.arti_cod from 1 FOR 2) <> '.t'
            INTO :ARTICULO, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
            DO
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            BASE = 0;
            IVA = 0;
            CONSUMO = 0;
            COSTO = 0;
            UTILIDAD = 0;
            PORC = 0;
            SELECT BASE, IVA, CONSUMO, COSTO FROM rep_utilidad WHERE ID = :IDREP AND CODIGO = :articulo INTO :BASE, :IVA, :consumo,  :costo;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            EXECUTE PROCEDURE PORCENTAJE (utilidad,  TOTAL, 'S') returning_values (part);
            if ((CEROS = 'S') or (BASE <> 0) or (COSTO <> 0)) then
                SUSPEND;
            END /* FOR */
        END
    if (BIN_AND(TIPO, 8) <> 0) then
        BEGIN
        TIPODOC = 34;
        /* BORRA LA TABLA AUXILIAR */
        DELETE FROM reportes_aux WHERE REPA_ID = 2 AND REPA_USER = USER;

        FOR SELECT MAX(D.ARTI_COD), SUM(PEDE_CANT * PEDE_FACTOR), SUM((PEDE_TOTAL-PEDE_IVAMONTO-PEDE_CONSUMO)*PEDI_FACTOR), SUM(PEDE_IVAMONTO*PEDI_FACTOR), SUM(PEDE_CONSUMO)
            FROM PEDIDOS_DETALLE D, PEDIDOS P, PREFIJOS R, ARTICULO A
            WHERE P.PEDI_ID = D.PEDI_ID AND P.PREF_PRE = R.PREF_PRE AND R.TIDO_COD = 34 AND D.ARTI_COD = A.arti_cod AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            PEDI_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY D.ARTI_COD
            INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO
            DO
            BEGIN
            COSTO = 0;
            FOR SELECT PEDE_CANT * PEDE_FACTOR, PEDI_FECHA FROM pedidos_detalle D, pedidos F, PREFIJOS P
                WHERE F.pedi_id = D.pedi_id AND PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND
                PEDI_ANULADO = 'N' AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                and D.ARTI_COD = :articulo  INTO :cantdet, :fecha
                DO
                BEGIN
                EXECUTE PROCEDURE costo_promedio_y_ultimo(:ARTICULO, :FECHA) returning_values (:costounit, :ultcos);
                if (ULTIMO = 'S') then
                    COSTO = COSTO + ultcos * cantdet;
                else
                    COSTO = COSTO + costounit * cantdet;
                END
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            if (CEROS = 'S') then
                INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (2, USER, :ARTICULO);
            INSERT INTO REP_UTILIDAD(ID, CODIGO, BASE, IVA, CONSUMO, COSTO) VALUES (:IDREP, :articulo, :base, :iva, :consumo, :costo);
            END /* FOR */
        SELECT SUM(BASE-COSTO) FROM REP_UTILIDAD WHERE id = :IDREP INTO :TOTAL;
        FOR SELECT ARTI_COD, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD FROM ARTICULO A
            WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND
            (A.MARC_COD <= :MARFIN))) AND substring(a.arti_cod from 1 FOR 2) <> '.t'
            INTO :ARTICULO, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
            DO
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            BASE = 0;
            IVA = 0;
            CONSUMO = 0;
            COSTO = 0;
            UTILIDAD = 0;
            PORC = 0;
            SELECT BASE, IVA, CONSUMO, COSTO FROM rep_utilidad WHERE ID = :IDREP AND CODIGO = :articulo INTO :BASE, :IVA, :consumo,  :costo;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            EXECUTE PROCEDURE PORCENTAJE (utilidad,  TOTAL, 'S') returning_values (part);
            if ((CEROS = 'S') or (BASE <> 0) or (COSTO <> 0)) then
                SUSPEND;
            END /* FOR */
        END
    if (BIN_AND(TIPO, 16) <> 0) then
        BEGIN
        TIPODOC = 35;
        FOR SELECT MAX(D.ARTI_COD), SUM(CTDE_CANT * CTDE_FACTOR), SUM((CTDE_TOTAL-CTDE_IVAMONTO-CTDE_CONSUMO)*COTI_FACTOR), SUM(CTDE_IVAMONTO), SUM(CTDE_CONSUMO)
            FROM COTIZACIONES_DETALLE D, COTIZACIONES C, PREFIJOS P, ARTICULO A
            WHERE C.COTI_ID = D.COTI_ID AND P.PREF_PRE = C.PREF_PRE AND P.TIDO_COD = 35 AND D.ARTI_COD = A.arti_cod AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND COTI_FECHA >= :FECINI AND COTI_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            COTI_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY D.ARTI_COD
            INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO
            DO
            BEGIN
            COSTO = 0;
            FOR SELECT CTDE_CANT * CTDE_FACTOR, COTI_FECHA FROM cotizaciones_detalle D, cotizaciones F, PREFIJOS P
                WHERE F.coti_id = D.coti_id AND COTI_FECHA >= :FECINI AND COTI_FECHA <= :FECFIN AND
                COTI_ANULADO = 'N' AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                and D.ARTI_COD = :articulo  INTO :cantdet, :fecha
                DO
                BEGIN
                EXECUTE PROCEDURE costo_promedio_y_ultimo(:ARTICULO, :FECHA) returning_values (:costounit, :ultcos);
                if (ULTIMO = 'S') then
                    COSTO = COSTO + ultcos * cantdet;
                else
                    COSTO = COSTO + costounit * cantdet;
                END
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            if (CEROS = 'S') then
                INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (2, USER, :ARTICULO);
            INSERT INTO REP_UTILIDAD(ID, CODIGO, BASE, IVA, CONSUMO, COSTO) VALUES (:IDREP, :articulo, :base, :iva, :consumo, :costo);
            END /* FOR */
        SELECT SUM(BASE-COSTO) FROM REP_UTILIDAD WHERE id = :IDREP INTO :TOTAL;
        FOR SELECT ARTI_COD, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD FROM ARTICULO A
            WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND
            (A.MARC_COD <= :MARFIN))) AND substring(a.arti_cod from 1 FOR 2) <> '.t'
            INTO :ARTICULO, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
            DO
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            BASE = 0;
            IVA = 0;
            CONSUMO = 0;
            COSTO = 0;
            UTILIDAD = 0;
            PORC = 0;
            SELECT BASE, IVA, CONSUMO, COSTO FROM rep_utilidad WHERE ID = :IDREP AND CODIGO = :articulo INTO :BASE, :IVA, :consumo,  :costo;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            EXECUTE PROCEDURE PORCENTAJE (utilidad,  TOTAL, 'S') returning_values (part);
            if ((CEROS = 'S') or (BASE <> 0) or (COSTO <> 0)) then
                SUSPEND;
            END /* FOR */
        END
    END
ELSE
    BEGIN
    if (BIN_AND(TIPO, 1) <> 0) then
        BEGIN
        TIPODOC = 31;
        FOR SELECT F.PREF_PRE, FACT_NUMERO, FACT_FECHA, D.ARTI_COD, FADE_CANT * FADE_FACTOR, (FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO)*FACT_FACTOR, FADE_IVAMONTO*FACT_FACTOR, FADE_CONSUMO,
            ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
            FROM FACTURAS F, FACTURAS_DETALLE D, PREFIJOS P, ARTICULO A
            WHERE F.FACT_ID = D.FACT_ID AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND D.ARTI_COD = A.arti_cod AND
                A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
                A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND FACT_FECHA >= :FECINI AND
                (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
                FACT_FECHA <= :FECFIN AND FACT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) and substring(a.arti_cod from 1 FOR 2) <> '.t'
            ORDER BY D.ARTI_COD, FACT_FECHA, F.FACT_ID, FADE_ITEM
            INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,
                :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
            DO
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            EXECUTE PROCEDURE costo_promedio_y_ultimo(:ARTICULO, :FECHA) returning_values (:costounit, :ultcos);
            if (ULTIMO = 'S') then
                COSTO = ultcos * cantidad;
            else
                COSTO = costounit * cantidad;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            SUSPEND;
            END
        END
    if (BIN_AND(TIPO, 2) <> 0) then
        BEGIN
        TIPODOC = 32;
        FOR SELECT R.PREF_PRE, REVT_NUMERO, REVT_FECHA, D.ARTI_COD, RVDE_CANT * RVDE_FACTOR, RVDE_TOTAL-RVDE_IVAMONTO-RVDE_CONSUMO, RVDE_IVAMONTO, RVDE_CONSUMO,
            ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
            FROM REMISIONES_VENTA R, REMISIONES_VENTA_DETALLE D, PREFIJOS P, ARTICULO A
            WHERE R.REVT_ID = D.REVT_ID AND P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = 32 AND D.ARTI_COD = A.arti_cod AND
                A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
                A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN AND
                (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
                REVT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            ORDER BY D.ARTI_COD, REVT_FECHA, R.REVT_ID, RVDE_ITEM
            INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,
                :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
            DO
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            EXECUTE PROCEDURE costo_promedio_y_ultimo(:ARTICULO, :FECHA) returning_values (:costounit, :ultcos);
            if (ULTIMO = 'S') then
                COSTO = ultcos * cantidad;
            else
                COSTO = costounit * cantidad;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            SUSPEND;
            END
        END
    if (BIN_AND(TIPO, 4) <> 0) then
        BEGIN
        TIPODOC = 33;
        FOR SELECT V.PREF_PRE, DEVT_NUMERO, DEVT_FECHA, D.ARTI_COD, DVDE_CANT * DVDE_FACTOR, (DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO)*DEVT_FACTOR, DVDE_IVAMONTO*DEVT_FACTOR, DVDE_CONSUMO,
            ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
            FROM DEVOLUCIONES_VENTAS V, DEVOLUCIONES_VENTAS_DETALLE D, PREFIJOS P, ARTICULO A
            WHERE V.DEVT_ID = D.DEVT_ID AND P.PREF_PRE = V.PREF_PRE AND P.TIDO_COD = 33 AND D.ARTI_COD = A.arti_cod AND
                A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
                A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND
                (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
                DEVT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            ORDER BY D.ARTI_COD, DEVT_FECHA, V.DEVT_ID, DVDE_ITEM
            INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,
                :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
            DO
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            CANTIDAD = CANTIDAD * -1;
            EXECUTE PROCEDURE costo_promedio_y_ultimo(:ARTICULO, :FECHA) returning_values (:costounit, :ultcos);
            if (ULTIMO = 'S') then
                COSTO = ultcos * cantidad;
            else
                COSTO = costounit * cantidad;
            BASE = BASE * -1;
            IVA = IVA * -1;
            CONSUMO = CONSUMO * -1;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            SUSPEND;
            END
        END
    if (BIN_AND(TIPO, 8) <> 0) then
        BEGIN
        TIPODOC = 34;
        FOR SELECT P.PREF_PRE, PEDI_NUMERO, PEDI_FECHA, D.ARTI_COD, PEDE_CANT * PEDE_FACTOR, (PEDE_TOTAL-PEDE_IVAMONTO-PEDE_CONSUMO)*PEDI_FACTOR, PEDE_IVAMONTO*PEDI_FACTOR, PEDE_CONSUMO,
            ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD 
            FROM PEDIDOS P, PEDIDOS_DETALLE D, PREFIJOS R, ARTICULO A
            WHERE P.PEDI_ID = D.PEDI_ID AND P.PREF_PRE = R.PREF_PRE AND R.TIDO_COD = 34 AND D.ARTI_COD = A.arti_cod AND
                A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
                A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND
                (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
                PEDI_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            ORDER BY D.ARTI_COD, PEDI_FECHA, P.PEDI_ID, PEDE_ITEM
            INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,
                :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
            DO
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            EXECUTE PROCEDURE costo_promedio_y_ultimo(:ARTICULO, :FECHA) returning_values (:costounit, :ultcos);
            if (ULTIMO = 'S') then
                COSTO = ultcos * cantidad;
            else
                COSTO = costounit * cantidad;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            SUSPEND;
            END
        END
    if (BIN_AND(TIPO, 16) <> 0) then
        BEGIN
        TIPODOC = 35;
        FOR SELECT C.PREF_PRE, COTI_NUMERO, COTI_FECHA, D.ARTI_COD, CTDE_CANT * CTDE_FACTOR, (CTDE_TOTAL-CTDE_IVAMONTO-CTDE_CONSUMO)*COTI_FACTOR, CTDE_IVAMONTO*COTI_FACTOR, CTDE_CONSUMO,
            ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD 
            FROM COTIZACIONES C, COTIZACIONES_DETALLE D, PREFIJOS P, ARTICULO A
            WHERE C.COTI_ID = D.COTI_ID AND P.PREF_PRE = C.PREF_PRE AND P.TIDO_COD = 35 AND D.ARTI_COD = A.arti_cod AND
                A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
                A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND COTI_FECHA >= :FECINI AND COTI_FECHA <= :FECFIN AND
                (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
                COTI_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            ORDER BY D.ARTI_COD, COTI_FECHA, C.COTI_ID, CTDE_ITEM
            INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,
                :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
            DO
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            EXECUTE PROCEDURE costo_promedio_y_ultimo(:ARTICULO, :FECHA) returning_values (:costounit, :ultcos);
            if (ULTIMO = 'S') then
                COSTO = ultcos * cantidad;
            else
                COSTO = costounit * cantidad;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            SUSPEND;
            END
        END
    END
END
^

SET TERM ; ^


/* ERROR AL COMPARAR NIT DEL DOCUMENTO CON EL DEL ENCABEZADO ESTABA > Y NO <> */

SET TERM ^ ;

CREATE OR ALTER TRIGGER RECIBOS_CAJA_DETALLE_BI FOR RECIBOS_CAJA_DETALLE
ACTIVE BEFORE INSERT POSITION 0
AS
DECLARE VARIABLE NUMROWS INTEGER;
declare variable PREGTASA CHAR(2);
declare variable TRM NUMERIC(18,2);
declare variable TRMDOC NUMERIC(18,2);
declare variable FECREC DATE;
declare variable FECDOC DATE;
declare variable NITR VARCHAR(20);
declare variable NITD VARCHAR(20);
begin
IF (NEW.RECA_ID IS NOT NULL) THEN
    BEGIN
       SELECT COUNT(*)
       FROM   RECIBOS_CAJA
       WHERE  RECIBOS_CAJA.RECA_ID = NEW.RECA_ID
       INTO   :NUMROWS;
       IF (NUMROWS = 0) THEN
       BEGIN
          EXCEPTION recibo_no_existe;
       END
    END
if (NEW.rcde_sucursal IS NULL) then
    NEW.rcde_sucursal = '01';
/* SI TRM <> 1 CONVIERTA A PESOS LOS VALORES */
EXECUTE PROCEDURE LEE_CONFIGURACION('GENERAL', 'GENERAL', 'PREGUNTAR TASA DE CAMBIO EN DOCUMENTOS DE CARTERA') returning_values (:pregtasa);
if (PREGTASA = 'SI') then
    BEGIN
    SELECT RECA_TRM FROM recibos_caja WHERE RECA_ID = NEW.reca_id INTO :TRM;
    SELECT MVCL_TRM FROM movimiento_clientes M WHERE M.mvcl_tiporef = NEW.rcde_tipodoc AND M.mvcl_idref = NEW.rcde_iddoc INTO :TRMDOC;
    NEW.rcde_difcambio = (NEW.rcde_abono + NEW.rcde_dtof) * (TRM - TRMDOC);
    NEW.rcde_abono = NEW.rcde_abono * :trmdoc;
    NEW.rcde_rtfte = NEW.rcde_rtfte * :trmdoc;
    NEW.rcde_rtiva = NEW.rcde_rtiva * :trmdoc;
    NEW.rcde_rtica = NEW.rcde_rtica * :trmdoc;
    NEW.rcde_dtof = NEW.rcde_dtof * :trmdoc;
    end
/* valide que la fecha no sea anterior al documento */
SELECT RECA_FECHA, TERC_NIT FROM recibos_caja WHERE RECA_ID = NEW.reca_id INTO :FECREC, :NITR;
SELECT MVCL_FECHA, TERC_NIT FROM movimiento_clientes M
    WHERE M.mvcl_tiporef = NEW.rcde_tipodoc AND M.mvcl_idref = NEW.rcde_iddoc INTO :FECDOC, :NITD;
if (FECDOC > FECREC) then
    exception fecha_anterior_documento 'EL RECIBO DE FECHA ' || :FECREC || ' INTENTA ABONAR UN DOCUMENTO DE FECHA ' || FECDOC;
if (NITR <> NITD) then
    exception documento_de_otro_tercero 'EL RECIBO CON NIT ' || :nitr || ' INTENTA ABONAR EL DOCUMENTO ' || NEW.rcde_prefijo || NEW.rcde_numero || ' DEL CLIENTE ' || :nitd;
END
^

SET TERM ; ^



/* EGRESOS DE VARIOS TERCEROS EN UN SOLO EGRESO */

INSERT INTO CONFIGURACION (CONF_MODULO, CONF_CATEGORIA, CONF_PROPIEDAD, CONF_VALOR, CONF_POSIBLES, CONF_AYUDA) VALUES ('CAJA', 'EGRESOS', 'PERMITIR ABONAR/CANCELAR DOCUMENTOS DE VARIOS TERCEROS EN UN SOLO EGRESO', 'NO', 'SI,NO', 'SI: Puede llamar documentos de varios terceros en un egreso, la interfaz del egerso debe estar por Documento. NO: Solo puede llamar documentos del tercero indicado en el encabezado del egreso');
commit work;

SET TERM ^ ;

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

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure CONTABIL_EGRESO (
    IDDOC integer,
    IDINTER integer)
returns (
    ERROR integer,
    VER char(1),
    IDC integer)
AS
declare variable PREF VARCHAR(4);
declare variable NUM VARCHAR(6);
declare variable FECAUX DATE;
declare variable FECHA CHAR(8);
declare variable CONC CHAR(120);
declare variable VRDTO NUMERIC(18, 2);
declare variable VRRTFTE NUMERIC(18, 2);
declare variable VRRTIVA NUMERIC(18, 2);
declare variable VRRTICA NUMERIC(18, 2);
declare variable VRTOTAL NUMERIC(18, 2);
declare variable TIPOCOMP VARCHAR(3);
declare variable PREFCONT VARCHAR(4);
declare variable BASE CHAR(1);
declare variable CTABASE VARCHAR(20);
declare variable CAJA CHAR(1);
declare variable CTACAJA VARCHAR(20);
declare variable RTFTE CHAR(1);
declare variable CTARTFTE VARCHAR(20);
declare variable RTIVA CHAR(1);
declare variable CTARTIVA VARCHAR(20);
declare variable RTICA CHAR(1);
declare variable CTARTICA VARCHAR(20);
declare variable DTO CHAR(1);
declare variable CTADTO VARCHAR(20);
declare variable EXISTE CHAR(1);
declare variable CUENTA VARCHAR(20);
declare variable MONTO NUMERIC(18,2);
declare variable ES_RETENCION CHAR(1);
declare variable TIPOCUEN CHAR(1);
declare variable NIT VARCHAR(20);
declare variable PROY VARCHAR(4);
declare variable CENTRO VARCHAR(4);
declare variable MONTOBASE NUMERIC(18,2);
declare variable PORC NUMERIC(9,2);
declare variable DEBITO NUMERIC(18,2);
declare variable CREDITO NUMERIC(18,2);
declare variable NROI INTEGER;
declare variable SUMA NUMERIC(18,2);
declare variable TCTACLIEN VARCHAR(20);
declare variable TCTARTFTE VARCHAR(20);
declare variable TCTARTIVA VARCHAR(20);
declare variable TCTARTICA VARCHAR(20);
declare variable TCTACART VARCHAR(20);
declare variable TIPOIT INTEGER;
declare variable IDIT INTEGER;
declare variable PREFIT VARCHAR(4);
declare variable NUMIT VARCHAR(6);
declare variable NUMEROIT VARCHAR(10);
declare variable ABONOIT NUMERIC(18,2);
declare variable CTADIC VARCHAR(20);
declare variable BASEADIC VARCHAR(20);
declare variable PORCADIC NUMERIC(5,2);
declare variable VALORADIC NUMERIC(18,2);
declare variable DBADIC CHAR(1);
declare variable VRBASE NUMERIC(18,2);
declare variable GMF CHAR(1);
declare variable CODBCO INTEGER;
declare variable NUMCHEQ VARCHAR(20);
declare variable CRUCES NUMERIC(18,2);
declare variable VRCAJA NUMERIC(18,2);
declare variable OK INTEGER;
declare variable DIFCAMBIO NUMERIC(18,2);
declare variable CTADIF VARCHAR(20);
declare variable RTFTEC NUMERIC(18,2);
declare variable RTIVAC NUMERIC(18,2);
declare variable RTICAC NUMERIC(18,2);
declare variable RTFTER CHAR(1);
declare variable CTARTFTER VARCHAR(20);
declare variable RTIVAR CHAR(1);
declare variable CTARTIVAR VARCHAR(20);
declare variable RTICAR CHAR(1);
declare variable CTARTICAR VARCHAR(20);
declare variable RET CHAR(2);
declare variable RTIT NUMERIC(18,2);
declare variable NITBCO VARCHAR(20);
BEGIN
/* BUSQUE LA INTERFACE */
EXISTE = 'N';
SELECT 'S', TICO_COD, PRCO_PRE, INCJ_BASE, INCJ_DTOPP, INCJ_RTFTE, INCJ_RTIVA, INCJ_RTICA, INCJ_CAJA, INCJ_CTABASE, INCJ_CTADTO, INCJ_CTARTFTE, INCJ_CTARTIVA, INCJ_CTARTICA, INCJ_CTACAJA, INCJ_CONFIRMAR
    FROM INTERFAZ_CAJA
    WHERE INCJ_ID = :IDINTER
    INTO :EXISTE, :TIPOCOMP, :PREFCONT, :BASE, :DTO, :RTFTE, :RTIVA, :RTICA, :CAJA, :CTABASE, :CTADTO, :CTARTFTE, :CTARTIVA, :CTARTICA, :CTACAJA, :VER;
if (EXISTE = 'S') then
    BEGIN
    OK = 0;
    FOR SELECT CNTB_ID FROM CONTABILIZACION WHERE CNTB_TIPOREF = 62 AND CNTB_IDREF = :IDDOC INTO :OK DO
        BEGIN
        DELETE FROM CONTABILIZACION_DET WHERE CNTB_ID = :OK;
        DELETE FROM CONTABILIZACION WHERE CNTB_ID = :OK;
        END

    /* TRAIGA EL ENCABEZADO DEL EGRESO */
    SELECT PREF_PRE, EGRE_NUMERO, EGRE_FECHA, E.TERC_NIT, EGRE_CONC, EGRE_DTOF, EGRE_MONTO, EGRE_RTFTEMONTO, EGRE_RTIVAMONTO, EGRE_RTICAMONTO, TERC_CTARTFTE, TERC_CTARTIVA, TERC_CTARTICA, TERC_CTACLIENTE
        FROM EGRESOS E, TERCEROS T
        WHERE EGRE_ID = :IDDOC AND E.TERC_NIT = T.TERC_NIT
        INTO :PREF, :NUM, :FECAUX, :NIT, :CONC, :VRDTO, :VRTOTAL, :VRRTFTE, :VRRTIVA, :VRRTICA, :TCTARTFTE, TCTARTIVA, TCTARTICA, TCTACLIEN;
    /* SI ES PROVEEDOR, SOBREESCIBE LAS CUENTAS  */
    SELECT PROV_CTAPAGAR, PROV_CTARTFTE, PROV_CTARTIVA, PROV_CTARTICA
        FROM PROVEEDORES WHERE TERC_NIT = :NIT
        INTO TCTACLIEN, TCTARTFTE, TCTARTIVA, TCTARTICA;
    SELECT PREF_CENTRO, PREF_PROY FROM PREFIJOS
        WHERE PREF_PRE = :PREF AND TIDO_COD = 62 INTO :CENTRO, :PROY;
    EXECUTE PROCEDURE FECHA_A_CONTA(:FECAUX) returning_values (:FECHA);
    /* REGISTRE EL ENCABEZADO CONTABLE */
    IDC = GEN_ID(ID_CONTABILIZA, 1);
    INSERT INTO CONTABILIZACION (CNTB_ID, CNTB_TIPOCOMP, CNTB_PREFCNT, CNTB_NUMERO, CNTB_FECHA, CNTB_CONCEPTO, CNTB_REF, CNTB_TIPOREF, CNTB_IDREF, CNTB_PREFREF, CNTB_NUMREF, CNTB_PROCESADO)
        VALUES (:IDC, :TIPOCOMP, :PREFCONT, :NUM, :FECHA, :CONC, '', 62, :IDDOC, :PREF, :NUM, 'N');
    /* SUME LOS CRUCES PARA LLEVARLOS A LA CUENTA X PAGAR Y RESTAR DE LA CAJA */
    SELECT SUM(EGCC_ABONO) FROM EGRESOS_CRUCEC WHERE EGRE_ID = :iddoc INTO :CRUCES;
    if (CRUCES IS NULL) then
        CRUCES = 0;
    VRCAJA = VRTOTAL;
    NROI = 0;
    SUMA = 0;
    ERROR = 0;
    /* EL CREDITO EN LA CAJA O EL BANCO */
    IF ((CAJA = 'K')) THEN
        BEGIN
        if (VRCAJA <> 0) then
            BEGIN
            CUENTA = NULL;
            EXECUTE PROCEDURE VALIDE_CUENTA_C (CTACAJA) RETURNING_VALUES (:OK);
            IF (OK = 0) THEN
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :CTACAJA INTO :CUENTA, :TIPOCUEN;
            ELSE
                begin
                EXECUTE PROCEDURE ERROR (62, :IDDOC, :CTACAJA, 2);
                CUENTA = CTACAJA;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 4);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRCAJA, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - VRCAJA;
                END
            END /* VRCAJA <> 0 */
        END /* CAJA CONSTANTE */
    IF ((CAJA = 'F')) THEN
        BEGIN
        /* mueva la cuenta de la caja o el banco o ambas */
        /* PRIMERO LA CAJA */
        FOR SELECT CAJA_CUENTA, EGCA_MONTO FROM EGRESOS_CAJA E, CAJAS C
            WHERE C.CAJA_ID = E.CAJA_ID AND EGRE_ID = :IDDOC
            INTO :CTACAJA, :MONTO
            DO
            BEGIN
            if (MONTO <> 0) then
                BEGIN
                CUENTA = NULL;
                EXECUTE PROCEDURE VALIDE_CUENTA_C (CTACAJA) RETURNING_VALUES (:OK);
                IF (OK = 0) THEN
                    SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                        WHERE CUEN_COD = :CTACAJA INTO :CUENTA, :TIPOCUEN;
                ELSE
                    begin
                    EXECUTE PROCEDURE ERROR (62, :IDDOC, :CTACAJA, 2);
                    CUENTA = CTACAJA;
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 4);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA - MONTO;
                    END
                END /* MONTO <> 0 */
            END /* DO CAJA */
        /* AHORA EL BANCO */
        MONTO = 0;
        SELECT CUBA_CTACONTA, EGBC_MONTO, EGBC_GMF, E.CUBA_COD, CUBA_GMFPOR, EGBC_NUMERO, BANC_NIT
            FROM EGRESOS_BANCO E, CUENTAS_BANCO C, BANCOS B
            WHERE E.CUBA_COD = C.CUBA_COD AND EGRE_ID = :IDDOC AND B.banc_cod = C.banc_cod
            INTO :CTACAJA, :MONTO, :GMF, :CODBCO, :PORC, :NUMCHEQ, :nitbco;
        if (MONTO <> 0) then
            BEGIN
            if (MONTO <> 0) then
                BEGIN
                CUENTA = NULL;
                EXECUTE PROCEDURE VALIDE_CUENTA_C (CTACAJA) RETURNING_VALUES (:OK);
                IF (OK = 0) THEN
                    SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                        WHERE CUEN_COD = :CTACAJA INTO :CUENTA, :TIPOCUEN;
                ELSE
                    begin
                    EXECUTE PROCEDURE ERROR (62, :IDDOC, :CTACAJA, 2);
                    CUENTA = CTACAJA;
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 4);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, :NUMCHEQ, 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA - MONTO;
                    END
                /* EL GMF */
                if ((GMF = 'S') AND (PORC <> 0)) then
                    BEGIN
                    if (NITBCO IS NULL) then
                        NITBCO = NIT;
                    EXECUTE procedure REDONDEE(:MONTO * :PORC / 1000, 0) returning_values (MONTO);
                    /* REGISTRE EL GMF EN LA MISMA CUENTA DEL BANCO COMO CREDITO */
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, :NUMCHEQ, 0, :MONTO, 0, 0, :NITBCO, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA - MONTO;

                    /* AHORA LA CUENTA DEL GASTO */
                    SELECT CUBA_CTAGMF FROM CUENTAS_BANCO
                        where CUBA_COD = :CODBCO INTO :CTACAJA;
                    EXECUTE PROCEDURE VALIDE_CUENTA_C (CTACAJA) RETURNING_VALUES (:OK);
                    IF (OK = 0) THEN
                        SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                            WHERE CUEN_COD = :CTACAJA INTO :CUENTA, :TIPOCUEN;
                    ELSE
                        begin
                        EXECUTE PROCEDURE ERROR (62, :IDDOC, :CTACAJA, 2);
                        CUENTA = CTACAJA;
                        TIPOCUEN = 'N';
                        ERROR = ERROR + 1;
                        end
                    if (TIPOCUEN = 'I') then
                        BEGIN
                        EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
                        TIPOCUEN = 'N';
                        ERROR = ERROR + 1;
                        END
                    if (TIPOCUEN = 'C') then
                        BEGIN
                        EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 4);
                        TIPOCUEN = 'N';
                        ERROR = ERROR + 1;
                        END
                    if (TIPOCUEN = 'N') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, :NUMCHEQ, :MONTO, 0, 0, 0, :NITBCO, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NROI = NROI + 1;
                        SUMA = SUMA + MONTO;
                        END
                    END /* GMF */
                END /* MONTO <> 0 */
            END /* EGRESO_BANCO */
        END /* CAJA = F */

    /* LOS CRUCES CON CUENTAS X COBRAR */
    if (CRUCES <> 0) then
        BEGIN
        SELECT TERC_CTACLIENTE FROM TERCEROS WHERE TERC_NIT = :nit INTO :tctacart;
        if (tctacart IS NULL) then
            tctacart = tctaclien;
        CUENTA = NULL;
        EXECUTE PROCEDURE VALIDE_CUENTA_C (tctacart) RETURNING_VALUES (:OK);
        IF (OK = 0) THEN
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :tctacart INTO :CUENTA, :TIPOCUEN;
        ELSE
            begin
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :tctacart, 2);
            CUENTA = tctacart;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            /* DEBERIA RECORRER DOCUMENTO POR DOCUMENTO */
            FOR SELECT EGCC_TIPODOC, EGCC_PREFIJO, EGCC_NUMERO, EGCC_ABONO+EGCC_RTFTE+EGCC_RTIVA+EGCC_RTICA+EGCC_DTOF
                FROM egresos_crucec WHERE EGRE_ID = :IDDOC
                INTO :TIPOIT, PREFIT, NUMIT, ABONOIT
                DO
                BEGIN
                NUMEROIT = PREFIT || NUMIT;
                if (ABONOIT > 0) then
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :ABONOIT, 0, 0, :NIT, :PROY, :CENTRO, NULL, :NUMEROIT, NULL, NULL, :TIPOIT, 0);
                else
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', abs(:ABONOIT), 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, :NUMEROIT, NULL, NULL, :TIPOIT, 0);
                SUMA = SUMA - ABONOIT;
                NROI = NROI + 1;
                END
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            if (CRUCES > 0) then
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :CRUCES, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            else
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', abs(:CRUCES), 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            SUMA = SUMA - CRUCES;
            NROI = NROI + 1;
            END
        /* LA DIFERENCIA EN CAMBIO */
        SELECT SUM(EGCC_DIFCAMBIO) FROM egresos_crucec WHERE EGRE_ID = :iddoc INTO :DIFCAMBIO;
        IF ((DIFCAMBIO IS NOT NULL) AND (DIFCAMBIO <> 0)) THEN
            BEGIN
            if (DIFCAMBIO > 0) then
                execute procedure lee_configuracion('GENERAL','GENERAL','CUENTA DE INGRESO POR DIFERENCIA EN CAMBIO PARA OPERACIONES EN OTRA MONEDA') returning_values (:ctadif);
            else
                execute procedure lee_configuracion('GENERAL','GENERAL','CUENTA DE GASTO POR DIFERENCIA EN CAMBIO PARA OPERACIONES EN OTRA MONEDA') returning_values (:ctadif);
            CUENTA = NULL;
            EXECUTE PROCEDURE VALIDE_CUENTA_C (ctadif) RETURNING_VALUES (:OK);
            IF (OK = 0) THEN
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :ctadif INTO :CUENTA, :TIPOCUEN;
            ELSE
                begin
                EXECUTE PROCEDURE ERROR (62, :IDDOC, :ctadif, 2);
                CUENTA = ctadif;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 4);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                if (DIFCAMBIO > 0) then
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :difcambio, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                else
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', ABS(:difcambio), 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - difcambio;
                END
            END
        /* RETEFUENTE DEL CRUCE */
        SELECT first 1 INCJ_RTFTE, INCJ_RTIVA, INCJ_RTICA, INCJ_CTARTFTE, INCJ_CTARTIVA, INCJ_CTARTICA
            FROM INTERFAZ_CAJA WHERE tido_cod = 61 into :RTFTER, :RTIVAR, :RTICAR, :CTARTFTER, :CTARTIVAR, :CTARTICAR;
        SELECT SUM(EGCC_RTFTE) FROM egresos_crucec WHERE EGRE_ID = :iddoc INTO :rtftec;
        IF ((rtftec IS NOT NULL) AND (rtftec <> 0)) THEN
            BEGIN
            if ((RTFTER = 'T') or (RTFTER = 'K')) then
                BEGIN
                if (RTFTER = 'T') then
                    SELECT TERC_CTARTFTE FROM TERCEROS WHERE TERC_NIT = :NIT INTO CTARTFTER;
                CUENTA = NULL;
                EXECUTE PROCEDURE VALIDE_CUENTA_C (ctartfter) RETURNING_VALUES (:OK);
                IF (OK = 0) THEN
                    SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                        WHERE CUEN_COD = :ctartfter INTO :CUENTA, :TIPOCUEN;
                ELSE
                    begin
                    EXECUTE PROCEDURE ERROR (62, :IDDOC, :ctartfter, 2);
                    CUENTA = ctartfter;
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 4);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    if (rtftec > 0) then
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :rtftec, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    else
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, abs(:rtftec), 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA + rtftec;
                    END
                END
            END
        /* RETEIVA DEL CRUCE */
        SELECT SUM(EGCC_RTIVA) FROM egresos_crucec WHERE EGRE_ID = :iddoc INTO :rtivac;
        IF ((rtivac IS NOT NULL) AND (rtivac <> 0)) THEN
            BEGIN
            if ((RTIVAR = 'T') or (RTIVAR = 'K')) then
                BEGIN
                if (RTIVAR = 'T') then
                    SELECT TERC_CTARTIVA FROM TERCEROS WHERE TERC_NIT = :NIT INTO CTARTIVAR;
                CUENTA = NULL;
                EXECUTE PROCEDURE VALIDE_CUENTA_C (ctartivar) RETURNING_VALUES (:OK);
                IF (OK = 0) THEN
                    SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                        WHERE CUEN_COD = :ctartivar INTO :CUENTA, :TIPOCUEN;
                ELSE
                    begin
                    EXECUTE PROCEDURE ERROR (62, :IDDOC, :ctartivar, 2);
                    CUENTA = ctartivar;
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 4);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    if (rtivac > 0) then
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :rtivac, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    else
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, abs(:rtivac), 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA + rtivac;
                    END
                END
            END
        /* RETEICA DEL CRUCE */
        SELECT SUM(EGCC_RTICA) FROM egresos_crucec WHERE EGRE_ID = :iddoc INTO :rticac;
        IF ((rticac IS NOT NULL) AND (rtivac <> 0)) THEN
            BEGIN
            if ((RTICAR = 'T') or (RTICAR = 'K')) then
                BEGIN
                if (RTICAR = 'T') then
                    SELECT TERC_CTARTICA FROM TERCEROS WHERE TERC_NIT = :NIT INTO CTARTICAR;
                CUENTA = NULL;
                EXECUTE PROCEDURE VALIDE_CUENTA_C (ctarticar) RETURNING_VALUES (:OK);
                IF (OK = 0) THEN
                    SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                        WHERE CUEN_COD = :ctarticar INTO :CUENTA, :TIPOCUEN;
                ELSE
                    begin
                    EXECUTE PROCEDURE ERROR (62, :IDDOC, :ctarticar, 2);
                    CUENTA = ctarticar;
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 4);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    if (rticac > 0) then
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :rticac, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    else
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, abs(:rticac), 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA + rticac;
                    END
                END
            END
        END /* cruces */

    if (DTO = 'K') then /* DTO EN CTA CONSTANTE */
        BEGIN
        if (VRDTO <> 0) then
            BEGIN
            CUENTA = NULL;
            EXECUTE PROCEDURE VALIDE_CUENTA_C (CTADTO) RETURNING_VALUES (:OK);
            IF (OK = 0) THEN
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :CTADTO INTO :CUENTA, :TIPOCUEN;
            ELSE
                begin
                EXECUTE PROCEDURE ERROR (62, :IDDOC, :CTADTO, 2);
                CUENTA = CTADTO;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 4);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRDTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - VRDTO;
                END
            END /* VRDTO <> 0 */
        END /* DTO EN CTA CONSTANTE */

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

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE EGRESOS_SIN_CONTABILIDAD(
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    ID INTEGER,
    IDI INTEGER,
    IDC INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    ESTADO VARCHAR(20),
    ERROR INTEGER)
AS
DECLARE VARIABLE VER CHAR(2);
declare variable FECICNT VARCHAR(10);
declare variable FECFCNT VARCHAR(10);
declare variable idref INTEGER;
BEGIN
EXECUTE PROCEDURE fecha_a_conta(FECINI) returning_values (FECICNT);
EXECUTE PROCEDURE fecha_a_conta(FECFIN) returning_values (FECFCNT);
FOR SELECT EGRE_ID, PREF_PRE, egre_numero FROM EGRESOS WHERE EGRE_ANULADO = 'N' AND PREF_PRE <> 'R004' AND
    EGRE_FECHA >= :FECINI AND EGRE_FECHA <= :FECFIN ORDER BY EGRE_ID INTO :ID, :PREF, :NUMERO
DO
  BEGIN
  idref = null;
  SELECT ENCO_IDREF FROM COMPROBANTE_ENCABEZADO WHERE ENCO_TIPOREF = 62 AND ENCO_FECHA >= :FECICNT AND ENCO_FECHA <= :FECFCNT and ENCO_IDREF = :ID into :idref;
  if (idref IS NULL) then
  begin
   ESTADO = 'PROCESANDO';
   SUSPEND;
   SELECT MAX(INCJ_ID) FROM INTERFAZ_CAJA WHERE PREF_PRE = :PREF AND TIDO_COD = 62 INTO :IDI;
   EXECUTE PROCEDURE CONTABIL_EGRESO (:ID, :IDI) RETURNING_VALUES (:ERROR, :VER, :IDC);
   IF (ERROR = 0) THEN
      BEGIN
      EXECUTE PROCEDURE CONTABILIZA_PENDIENTE (:IDC);
      ESTADO = 'OK';
      END
   ELSE
    ESTADO = 'ERROR';
   suspend;
  end
  END
END

^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure BUSCA_ID_DOC_CXPAGAR (
    TIPO integer,
    PREFIJO varchar(4),
    NUMERO varchar(6),
    NIT varchar(20),
    FECHA date)
returns (
    ID integer,
    SALDO numeric(18,2),
    RTFTE numeric(18,2),
    RTIVA numeric(18,2),
    RTICA numeric(18,2),
    DTOF numeric(18,2),
    ERROR integer,
    NUMPROV varchar(8))
AS
declare variable VERNIT VARCHAR(20);
declare variable FEC DATE;
declare variable DTOAPL NUMERIC(18,2);
declare variable FECDTO DATE;
declare variable DESC_RTES CHAR(2);
declare variable OTROSTERC CHAR(2);
declare variable TRM NUMERIC(18,2);
declare variable MONEDA INTEGER;
BEGIN
ERROR = 0;
ID = 0;
EXECUTE PROCEDURE COMPLETA_CEROS(NUMERO) returning_values (NUMERO);
if (TIPO = 51) then
    SELECT NDPR_ID, TERC_NIT, NDPR_FECHA, NDPR_DTOFMONTO, NDPR_DTOFECHA, NDPR_TRM, NDPR_NUMPROV
        FROM NOTAS_DEBITO_PROVEEDOR WHERE PREF_PRE = :PREFIJO AND NDPR_NUMERO = :NUMERO
        INTO :ID, :VERNIT, :FEC, :DTOF, :FECDTO, :TRM, :numprov;
if (TIPO = 52) then
    SELECT NCPR_ID, TERC_NIT, NCPR_FECHA, NCPR_DTOFMONTO, NCPR_DTOFECHA, NCPR_TRM, ''
        FROM NOTAS_CREDITO_PROVEEDOR WHERE PREF_PRE = :PREFIJO AND NCPR_NUMERO = :NUMERO
        INTO :ID, :VERNIT, :FEC, :DTOF, :FECDTO, :TRM, :numprov;
if (TIPO = 55) then
    SELECT ANPR_ID, TERC_NIT, ANPR_FECHA, ANPR_DTOFMONTO, ANPR_DTOFECHA, ANPR_TRM, ''
        FROM ANTICIPOS_PROVEEDOR WHERE PREF_PRE = :PREFIJO AND ANPR_NUMERO = :NUMERO
        INTO :ID, :VERNIT, :FEC, :DTOF, :FECDTO, :TRM, :numprov;
if (TIPO = 21) then
    SELECT FACO_ID, TERC_NIT, FACO_FECHA, FACO_DTOFMONTO, FACO_DTOFFECHA, FACO_TRM, FACO_NUMPROV
        FROM FACTURAS_COMPRA WHERE PREF_PRE = :PREFIJO AND FACO_NUMERO = :NUMERO
        INTO :ID, :VERNIT, :FEC, :DTOF, :FECDTO, :TRM, :numprov;
if (TIPO = 24) then
    SELECT DVCO_ID, TERC_NIT, DVCO_FECHA, 0, DVCO_FECHA, DVCO_TRM, ''
        FROM devoluciones_compras WHERE PREF_PRE = :PREFIJO AND DVCO_NUMERO = :NUMERO
        INTO :ID, :VERNIT, :FEC, :DTOF, :FECDTO, :TRM, :numprov;
if (fecha > FECDTO) then
    DTOF = 0;
if (DTOF IS NULL) then
    DTOF = 0;
if (DTOF <> 0) then
    BEGIN
    SELECT SUM(EGDE_DTOF) FROM EGRESOS_DETALLE WHERE EGDE_IDDOC = :ID AND EGDE_TIPODOC = :TIPO INTO :DTOAPL;
    if (DTOAPL IS NULL) then
        DTOAPL = 0;
    DTOF = DTOF - DTOAPL;
    if ((TRM <> 1) AND (TRM <> 0)) then
        DTOF = DTOF / TRM;
    END
if (ID = 0) then
  ERROR = 1;
ELSE
  BEGIN
  /* VERIFIQUE EL NIT */
  execute procedure lee_configuracion ('CAJA', 'EGRESOS', 'PERMITIR ABONAR/CANCELAR DOCUMENTOS DE VARIOS TERCEROS EN UN SOLO EGRESO') returning_values (:otrosterc);
  if ((otrosterc = 'NO') AND (VERNIT <> NIT)) then
    begin
    ERROR = 2;
    end
  else
    BEGIN
    /* VERIFIQUE QUE LA FECHA DEL ABONO SEA POSTERIOR O IGUAL AL DOC */
    if (FEC > FECHA) then
        ERROR = 3;
    ELSE
        BEGIN
        /* CALCULE LOS SALDOS */
        SELECT SUM(SDCP_RTEFTE - SDCP_ABRTFTE), SUM(SDCP_RTIVA - SDCP_ABRTIVA), SUM(SDCP_RTICA - SDCP_ABRTICA)
            FROM SALDOS_DOC_CXPAGAR WHERE SDCP_TIPOREF = :TIPO AND SDCP_IDREF = :ID
            INTO :RTFTE, :RTIVA, :RTICA;
        if (RTFTE IS NULL) then
            RTFTE = 0;
        if (RTIVA IS NULL) then
            RTIVA = 0;
        if (RTICA IS NULL) then
            RTICA = 0;
        /* TRAIGA EL SALDO NETO */
        if (TRM <> 1) then
            execute procedure lee_configuracion ('GENERAL', 'GENERAL', 'MONEDA PREDETERMINADA EN OPERACIONES CON EL EXTERIOR') returning_values (:moneda);
        else    
            MONEDA = 0;
        if (TRM <> 0) then
            BEGIN
            RTFTE = RTFTE / TRM;
            RTIVA = RTIVA / TRM;
            RTICA = RTICA / TRM;
            END
        EXECUTE PROCEDURE SALDO_DOC_CXPAGAR(TIPO, ID, FECHA,MONEDA) returning_values (SALDO);
        if (SALDO = 0) then
            ERROR = 4;
        ELSE
            BEGIN
            /* RESTE LAS RETENCIONES YA QUE SE SUGERIRAN */
            EXECUTE PROCEDURE LEE_CONFIGURACION('CXPAGAR', 'SALDOS', 'DESCONTAR RETENCIONES POR CAUSACION') returning_values (DESC_RTES);
            if (DESC_RTES = 'NO') then
                SALDO = SALDO - RTFTE - RTIVA - RTICA;
            SALDO = SALDO - DTOF;
            END
        END
    END
  END
SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER EGRESOS_DETALLE_AI FOR EGRESOS_DETALLE
ACTIVE AFTER INSERT POSITION 0
AS
declare variable FEC DATE;
declare variable NIT VARCHAR(20);
declare variable CONCEPTO VARCHAR(60);
declare variable PREFIJO VARCHAR(4);
declare variable NUMERO VARCHAR(6);
declare variable OK CHAR(1);
declare variable EGANTI INTEGER;
declare variable RETES CHAR(2);
declare variable SALDO NUMERIC(18,2);
declare variable TRM NUMERIC(18,2);
declare variable NITDOC VARCHAR(20);
BEGIN
/* Abone el documento referenciado en EGRESOS_DETALLE */
select PREF_PRE, EGRE_NUMERO, EGRE_FECHA, EGRE_CONC, TERC_NIT, EGRE_TRM
    from EGRESOS where EGRE_ID = new.EGRE_ID into :PREFIJO, :NUMERO, :FEC, :CONCEPTO, :NIT, :TRM;
if ((NEW.EGRE_ID <> 0) and (new.egde_anulado = 'N')) then
    BEGIN
    OK = 'N';
    if (new.EGDE_TIPODOC = 55) then
        BEGIN
        /* BUSQUE SI TIENE EGRE_ID, SI NO LO ACTUALIZA */
        SELECT EGRE_ID FROM ANTICIPOS_PROVEEDOR WHERE ANPR_ID = NEW.EGDE_IDDOC INTO :EGANTI;
        if (EGANTI = 0) then
            BEGIN
            OK = 'S';
            UPDATE ANTICIPOS_PROVEEDOR SET EGRE_ID = NEW.EGRE_ID WHERE ANPR_ID = NEW.EGDE_IDDOC;
            END
        END
    /* valide que no se pase del saldo */
    execute procedure saldo_doc_cxpagar(new.egde_tipodoc, new.egde_iddoc, '9999/12/31', 0) returning_values(saldo);
    execute procedure lee_configuracion('CXPAGAR', 'SALDOS', 'DESCONTAR RETENCIONES POR CAUSACION') returning_values (RETES);
    if (SALDO < 0) then
        BEGIN
        if (RETES = 'SI') then
            begin
            if (saldo > (NEW.egde_abono+NEW.egde_dtof+NEW.egde_difcambio)) then
                EXCEPTION DOCUMENTO_ABONO_MAYOR 'EL SALDO DEL DOCUMENTO ' || NEW.egde_prefijo || NEW.egde_numero || ' ES INSUFICIENTE.';
            end
        ELSE
            begin
            if (saldo > (NEW.egde_abono + NEW.egde_rtfte + NEW.egde_rtiva + NEW.egde_rtica + new.egde_dtof + NEW.egde_difcambio)) then
                EXCEPTION DOCUMENTO_ABONO_MAYOR 'EL SALDO DEL DOCUMENTO ' || NEW.egde_prefijo || NEW.egde_numero || ' ES INSUFICIENTE.';
            end
        END
    else
        BEGIN
        if (RETES = 'SI') then
            begin
            if (saldo < (NEW.egde_abono + NEW.egde_dtof + NEW.egde_difcambio)) then
                EXCEPTION DOCUMENTO_ABONO_MAYOR 'EL SALDO DEL DOCUMENTO ' || NEW.egde_prefijo || NEW.egde_numero || ' ES INSUFICIENTE.';
            end
        ELSE
            begin
            if (saldo < (NEW.egde_abono + NEW.egde_rtfte + NEW.egde_rtiva + NEW.egde_rtica + NEW.egde_dtof + NEW.egde_difcambio)) then
                EXCEPTION DOCUMENTO_ABONO_MAYOR 'EL SALDO DEL DOCUMENTO ' || NEW.egde_prefijo || NEW.egde_numero || ' ES INSUFICIENTE.';
            end
        END
    if (OK = 'N') then
        BEGIN
        if (exists (select sdcp_idref from saldos_doc_cxpagar where sdcp_tiporef = new.egde_tipodoc and
            sdcp_idref = new.egde_iddoc and sdcp_fecha = :FEC)) then
            begin
            /* actualice el saldo del dia */
            UPDATE saldos_doc_cxpagar
                SET SDCP_ABONO = SDCP_ABONO + (NEW.egde_abono + NEW.egde_dtof + NEW.egde_difcambio),
                    SDCP_ABRTFTE = SDCP_ABRTFTE + NEW.egde_RTFTE,
                    SDCP_ABRTIVA = SDCP_ABRTIVA + NEW.egde_RTIVA,
                    SDCP_ABRTICA = SDCP_ABRTICA + NEW.egde_RTICA,
                    SDCP_TRM = :TRM
                WHERE SDCP_TIPOREF = NEW.EGDE_TIPODOC AND SDCP_IDREF = NEW.egde_IDDOC AND SDCP_FECHA = :FEC;
            END
        ELSE
            BEGIN
            /* Inserte un nuevo saldo diario */
            INSERT INTO SALDOS_DOC_CXPAGAR (SDCP_TIPOREF, SDCP_IDREF, SDCP_FECHA, TERC_NIT, SDCP_RTEFTE, SDCP_RTIVA, SDCP_RTICA, SDCP_ABONO, SDCP_ABRTFTE, SDCP_ABRTIVA, SDCP_ABRTICA, SDCP_DEBITO, SDCP_MONTO, SDCP_TRM)
                VALUES (NEW.EGDE_TIPODOC, NEW.EGDE_IDDOC, :FEC, :NIT, 0, 0, 0, (NEW.egde_abono+NEW.egde_dtof+NEW.egde_difcambio), NEW.egde_rtfte, NEW.egde_rtiva, NEW.egde_rtica, 'N', 0, :TRM);
            END
        END
    /* actualice el registro en mov_proveedor (por si son varios items) */
    SELECT TERC_NIT FROM movimiento_proveedor M WHERE M.mvpr_tiporef = NEW.egde_tipodoc AND M.mvpr_idref = NEW.egde_iddoc INTO :NITDOC;
    if (EXISTS (SELECT MVPR_ID FROM MOVIMIENTO_PROVEEDOR WHERE MVPR_TIPOREF = 62 AND MVPR_IDREF = NEW.EGRE_ID AND TERC_NIT = :NITDOC)) then
        begin
        UPDATE movimiento_proveedor
            SET MVPR_MONTO = MVPR_MONTO + (NEW.egde_abono + NEW.egde_dtof + NEW.egde_difcambio),
                MVPR_RTFTE = MVPR_RTFTE + NEW.egde_rtfte,
                MVPR_RTIVA = MVPR_RTIVA + NEW.egde_rtiva,
                MVPR_RTICA = MVPR_RTICA + NEW.egde_rtica,
                MVPR_TRM = :TRM
            WHERE MVPR_TIPOREF = 62 AND MVPR_IDREF = NEW.EGRE_ID AND TERC_NIT = :NITDOC;
        end
    ELSE
        INSERT INTO MOVIMIENTO_PROVEEDOR (MVPR_ID, TERC_NIT, MVPR_TIPOREF, MVPR_IDREF, MVPR_FECHA, MVPR_VENCE, MVPR_CONC, MVPR_MONTO, MVPR_RTFTE, MVPR_RTIVA, MVPR_RTICA, MVPR_DEBITO, MVPR_ABONO, MVPR_PREFIJO, MVPR_NUMERO, MVPR_TRM)
            VALUES (GEN_ID(ID_MOVPROV, 1), :NITDOC, 62, NEW.EGRE_ID, :FEC, :FEC, :CONCEPTO, (NEW.EGDE_ABONO+NEW.egde_dtof+NEW.egde_difcambio), NEW.EGDE_RTFTE, NEW.EGDE_RTIVA, NEW.EGDE_RTICA, 'N', 'S', :PREFIJO, :NUMERO, :TRM);
    END
END
^

SET TERM ; ^

SET TERM ^ ;

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

SET TERM ; ^

SET TERM ^ ;

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

SET TERM ; ^


/* COMISIONES POR COBRO INCLUYENDO EL IMPOCONSUMO */

INSERT INTO CONFIGURACION (CONF_MODULO, CONF_CATEGORIA, CONF_PROPIEDAD, CONF_VALOR, CONF_POSIBLES, CONF_AYUDA) VALUES ('CARTERA', 'COMISIONES', 'COMISION POR COBRO INCLUYENDO EL IMPOCONSUMO', 'NO', 'SI,NO', 'SI: El subtotal antes de IVA incluyendo el impoconsumo hace parte de la base para el cálculo de la comisión por cobro. NO: Se liquida la comisión sobre la base antes de IVA e impoconsumo');
commit work;

SET TERM ^ ;

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

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

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

SET TERM ; ^


/* MOVIMIENTO PROVEEDOR BORRABA LOS EGRESOS EN CERO */

SET TERM ^ ;

CREATE OR ALTER TRIGGER MOVIMIENTO_PROVEEDOR_AU FOR MOVIMIENTO_PROVEEDOR
ACTIVE AFTER UPDATE POSITION 0
AS
declare variable ANULADO char(1);
BEGIN
if (new.mvpr_tiporef <> 55) Then
  begin
  /* SI QUEDO EN CEROS EL MONTO Y LAS RETES, ELIMINE EL REGISTRO */
  if ((NEW.mvpr_monto = 0) AND (NEW.mvpr_rtfte = 0) AND (NEW.mvpr_rtica = 0) AND (NEW.mvpr_rtiva = 0)) then
    IF (NEW.MVPR_TIPOREF <> 53) THEN
      BEGIN
      IF (NEW.MVPR_TIPOREF <> 62) THEN
        DELETE FROM movimiento_proveedor WHERE MVPR_ID = NEW.mvpr_id;
      ELSE
        BEGIN
        SELECT EGRE_ANULADO FROM EGRESOS WHERE EGRE_ID = NEW.mvpr_idref INTO :ANULADO;
        if (ANULADO = 'S') then
          DELETE FROM movimiento_proveedor WHERE MVPR_ID = NEW.mvpr_id;
        END
      END
    ELSE
      BEGIN
      SELECT APPR_ANULADO FROM APLICACION_PROVEDOR WHERE APPR_ID = NEW.mvpr_idref INTO :ANULADO;
      if (ANULADO = 'S') then
            DELETE FROM movimiento_proveedor WHERE MVPR_ID = NEW.mvpr_id;
      END
  END
END
^

SET TERM ; ^

/* 20091211 */
/* ERROR AL COMPARAR NIT DEL DOCUMENTO CON EL DEL ENCABEZADO ESTABA > Y NO <> */

SET TERM ^ ;

CREATE OR ALTER TRIGGER RECIBOS_CAJA_DETALLE_BI FOR RECIBOS_CAJA_DETALLE
ACTIVE BEFORE INSERT POSITION 0
AS
DECLARE VARIABLE NUMROWS INTEGER;
declare variable PREGTASA CHAR(2);
declare variable TRM NUMERIC(18,2);
declare variable TRMDOC NUMERIC(18,2);
declare variable FECREC DATE;
declare variable FECDOC DATE;
declare variable NITR VARCHAR(20);
declare variable NITD VARCHAR(20);
begin
IF (NEW.RECA_ID IS NOT NULL) THEN
    BEGIN
       SELECT COUNT(*)
       FROM   RECIBOS_CAJA
       WHERE  RECIBOS_CAJA.RECA_ID = NEW.RECA_ID
       INTO   :NUMROWS;
       IF (NUMROWS = 0) THEN
       BEGIN
          EXCEPTION recibo_no_existe;
       END
    END
if (NEW.rcde_sucursal IS NULL) then
    NEW.rcde_sucursal = '01';
/* SI TRM <> 1 CONVIERTA A PESOS LOS VALORES */
EXECUTE PROCEDURE LEE_CONFIGURACION('GENERAL', 'GENERAL', 'PREGUNTAR TASA DE CAMBIO EN DOCUMENTOS DE CARTERA') returning_values (:pregtasa);
if (PREGTASA = 'SI') then
    BEGIN
    SELECT RECA_TRM FROM recibos_caja WHERE RECA_ID = NEW.reca_id INTO :TRM;
    SELECT MVCL_TRM FROM movimiento_clientes M WHERE M.mvcl_tiporef = NEW.rcde_tipodoc AND M.mvcl_idref = NEW.rcde_iddoc INTO :TRMDOC;
    NEW.rcde_difcambio = (NEW.rcde_abono + NEW.rcde_dtof) * (TRM - TRMDOC);
    NEW.rcde_abono = NEW.rcde_abono * :trmdoc;
    NEW.rcde_rtfte = NEW.rcde_rtfte * :trmdoc;
    NEW.rcde_rtiva = NEW.rcde_rtiva * :trmdoc;
    NEW.rcde_rtica = NEW.rcde_rtica * :trmdoc;
    NEW.rcde_dtof = NEW.rcde_dtof * :trmdoc;
    end
/* valide que la fecha no sea anterior al documento */
SELECT RECA_FECHA, TERC_NIT FROM recibos_caja WHERE RECA_ID = NEW.reca_id INTO :FECREC, :NITR;
SELECT MVCL_FECHA, TERC_NIT FROM movimiento_clientes M
    WHERE M.mvcl_tiporef = NEW.rcde_tipodoc AND M.mvcl_idref = NEW.rcde_iddoc INTO :FECDOC, :NITD;
if (FECDOC > FECREC) then
    exception fecha_anterior_documento 'EL RECIBO DE FECHA ' || :FECREC || ' INTENTA ABONAR UN DOCUMENTO DE FECHA ' || FECDOC;
if (NITR <> NITD) then
    exception documento_de_otro_tercero 'EL RECIBO CON NIT ' || :nitr || ' INTENTA ABONAR EL DOCUMENTO ' || NEW.rcde_prefijo || NEW.rcde_numero || ' DEL CLIENTE ' || :nitd;
END
^

SET TERM ; ^



/* 20091211B */
/* EGRESOS DE VARIOS TERCEROS EN UN SOLO EGRESO */

INSERT INTO CONFIGURACION (CONF_MODULO, CONF_CATEGORIA, CONF_PROPIEDAD, CONF_VALOR, CONF_POSIBLES, CONF_AYUDA) VALUES ('CAJA', 'EGRESOS', 'PERMITIR ABONAR/CANCELAR DOCUMENTOS DE VARIOS TERCEROS EN UN SOLO EGRESO', 'NO', 'SI,NO', 'SI: Puede llamar documentos de varios terceros en un egreso, la interfaz del egerso debe estar por Documento. NO: Solo puede llamar documentos del tercero indicado en el encabezado del egreso');
commit work;

SET TERM ^ ;

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

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure CONTABIL_EGRESO (
    IDDOC integer,
    IDINTER integer)
returns (
    ERROR integer,
    VER char(1),
    IDC integer)
AS
declare variable PREF VARCHAR(4);
declare variable NUM VARCHAR(6);
declare variable FECAUX DATE;
declare variable FECHA CHAR(8);
declare variable CONC CHAR(120);
declare variable VRDTO NUMERIC(18, 2);
declare variable VRRTFTE NUMERIC(18, 2);
declare variable VRRTIVA NUMERIC(18, 2);
declare variable VRRTICA NUMERIC(18, 2);
declare variable VRTOTAL NUMERIC(18, 2);
declare variable TIPOCOMP VARCHAR(3);
declare variable PREFCONT VARCHAR(4);
declare variable BASE CHAR(1);
declare variable CTABASE VARCHAR(20);
declare variable CAJA CHAR(1);
declare variable CTACAJA VARCHAR(20);
declare variable RTFTE CHAR(1);
declare variable CTARTFTE VARCHAR(20);
declare variable RTIVA CHAR(1);
declare variable CTARTIVA VARCHAR(20);
declare variable RTICA CHAR(1);
declare variable CTARTICA VARCHAR(20);
declare variable DTO CHAR(1);
declare variable CTADTO VARCHAR(20);
declare variable EXISTE CHAR(1);
declare variable CUENTA VARCHAR(20);
declare variable MONTO NUMERIC(18,2);
declare variable ES_RETENCION CHAR(1);
declare variable TIPOCUEN CHAR(1);
declare variable NIT VARCHAR(20);
declare variable PROY VARCHAR(4);
declare variable CENTRO VARCHAR(4);
declare variable MONTOBASE NUMERIC(18,2);
declare variable PORC NUMERIC(9,2);
declare variable DEBITO NUMERIC(18,2);
declare variable CREDITO NUMERIC(18,2);
declare variable NROI INTEGER;
declare variable SUMA NUMERIC(18,2);
declare variable TCTACLIEN VARCHAR(20);
declare variable TCTARTFTE VARCHAR(20);
declare variable TCTARTIVA VARCHAR(20);
declare variable TCTARTICA VARCHAR(20);
declare variable TCTACART VARCHAR(20);
declare variable TIPOIT INTEGER;
declare variable IDIT INTEGER;
declare variable PREFIT VARCHAR(4);
declare variable NUMIT VARCHAR(6);
declare variable NUMEROIT VARCHAR(10);
declare variable ABONOIT NUMERIC(18,2);
declare variable CTADIC VARCHAR(20);
declare variable BASEADIC VARCHAR(20);
declare variable PORCADIC NUMERIC(5,2);
declare variable VALORADIC NUMERIC(18,2);
declare variable DBADIC CHAR(1);
declare variable VRBASE NUMERIC(18,2);
declare variable GMF CHAR(1);
declare variable CODBCO INTEGER;
declare variable NUMCHEQ VARCHAR(20);
declare variable CRUCES NUMERIC(18,2);
declare variable VRCAJA NUMERIC(18,2);
declare variable OK INTEGER;
declare variable DIFCAMBIO NUMERIC(18,2);
declare variable CTADIF VARCHAR(20);
declare variable RTFTEC NUMERIC(18,2);
declare variable RTIVAC NUMERIC(18,2);
declare variable RTICAC NUMERIC(18,2);
declare variable RTFTER CHAR(1);
declare variable CTARTFTER VARCHAR(20);
declare variable RTIVAR CHAR(1);
declare variable CTARTIVAR VARCHAR(20);
declare variable RTICAR CHAR(1);
declare variable CTARTICAR VARCHAR(20);
declare variable RET CHAR(2);
declare variable RTIT NUMERIC(18,2);
declare variable NITBCO VARCHAR(20);
BEGIN
/* BUSQUE LA INTERFACE */
EXISTE = 'N';
SELECT 'S', TICO_COD, PRCO_PRE, INCJ_BASE, INCJ_DTOPP, INCJ_RTFTE, INCJ_RTIVA, INCJ_RTICA, INCJ_CAJA, INCJ_CTABASE, INCJ_CTADTO, INCJ_CTARTFTE, INCJ_CTARTIVA, INCJ_CTARTICA, INCJ_CTACAJA, INCJ_CONFIRMAR
    FROM INTERFAZ_CAJA
    WHERE INCJ_ID = :IDINTER
    INTO :EXISTE, :TIPOCOMP, :PREFCONT, :BASE, :DTO, :RTFTE, :RTIVA, :RTICA, :CAJA, :CTABASE, :CTADTO, :CTARTFTE, :CTARTIVA, :CTARTICA, :CTACAJA, :VER;
if (EXISTE = 'S') then
    BEGIN
    OK = 0;
    FOR SELECT CNTB_ID FROM CONTABILIZACION WHERE CNTB_TIPOREF = 62 AND CNTB_IDREF = :IDDOC INTO :OK DO
        BEGIN
        DELETE FROM CONTABILIZACION_DET WHERE CNTB_ID = :OK;
        DELETE FROM CONTABILIZACION WHERE CNTB_ID = :OK;
        END

    /* TRAIGA EL ENCABEZADO DEL EGRESO */
    SELECT PREF_PRE, EGRE_NUMERO, EGRE_FECHA, E.TERC_NIT, EGRE_CONC, EGRE_DTOF, EGRE_MONTO, EGRE_RTFTEMONTO, EGRE_RTIVAMONTO, EGRE_RTICAMONTO, TERC_CTARTFTE, TERC_CTARTIVA, TERC_CTARTICA, TERC_CTACLIENTE
        FROM EGRESOS E, TERCEROS T
        WHERE EGRE_ID = :IDDOC AND E.TERC_NIT = T.TERC_NIT
        INTO :PREF, :NUM, :FECAUX, :NIT, :CONC, :VRDTO, :VRTOTAL, :VRRTFTE, :VRRTIVA, :VRRTICA, :TCTARTFTE, TCTARTIVA, TCTARTICA, TCTACLIEN;
    /* SI ES PROVEEDOR, SOBREESCIBE LAS CUENTAS  */
    SELECT PROV_CTAPAGAR, PROV_CTARTFTE, PROV_CTARTIVA, PROV_CTARTICA
        FROM PROVEEDORES WHERE TERC_NIT = :NIT
        INTO TCTACLIEN, TCTARTFTE, TCTARTIVA, TCTARTICA;
    SELECT PREF_CENTRO, PREF_PROY FROM PREFIJOS
        WHERE PREF_PRE = :PREF AND TIDO_COD = 62 INTO :CENTRO, :PROY;
    EXECUTE PROCEDURE FECHA_A_CONTA(:FECAUX) returning_values (:FECHA);
    /* REGISTRE EL ENCABEZADO CONTABLE */
    IDC = GEN_ID(ID_CONTABILIZA, 1);
    INSERT INTO CONTABILIZACION (CNTB_ID, CNTB_TIPOCOMP, CNTB_PREFCNT, CNTB_NUMERO, CNTB_FECHA, CNTB_CONCEPTO, CNTB_REF, CNTB_TIPOREF, CNTB_IDREF, CNTB_PREFREF, CNTB_NUMREF, CNTB_PROCESADO)
        VALUES (:IDC, :TIPOCOMP, :PREFCONT, :NUM, :FECHA, :CONC, '', 62, :IDDOC, :PREF, :NUM, 'N');
    /* SUME LOS CRUCES PARA LLEVARLOS A LA CUENTA X PAGAR Y RESTAR DE LA CAJA */
    SELECT SUM(EGCC_ABONO) FROM EGRESOS_CRUCEC WHERE EGRE_ID = :iddoc INTO :CRUCES;
    if (CRUCES IS NULL) then
        CRUCES = 0;
    VRCAJA = VRTOTAL;
    NROI = 0;
    SUMA = 0;
    ERROR = 0;
    /* EL CREDITO EN LA CAJA O EL BANCO */
    IF ((CAJA = 'K')) THEN
        BEGIN
        if (VRCAJA <> 0) then
            BEGIN
            CUENTA = NULL;
            EXECUTE PROCEDURE VALIDE_CUENTA_C (CTACAJA) RETURNING_VALUES (:OK);
            IF (OK = 0) THEN
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :CTACAJA INTO :CUENTA, :TIPOCUEN;
            ELSE
                begin
                EXECUTE PROCEDURE ERROR (62, :IDDOC, :CTACAJA, 2);
                CUENTA = CTACAJA;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 4);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRCAJA, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - VRCAJA;
                END
            END /* VRCAJA <> 0 */
        END /* CAJA CONSTANTE */
    IF ((CAJA = 'F')) THEN
        BEGIN
        /* mueva la cuenta de la caja o el banco o ambas */
        /* PRIMERO LA CAJA */
        FOR SELECT CAJA_CUENTA, EGCA_MONTO FROM EGRESOS_CAJA E, CAJAS C
            WHERE C.CAJA_ID = E.CAJA_ID AND EGRE_ID = :IDDOC
            INTO :CTACAJA, :MONTO
            DO
            BEGIN
            if (MONTO <> 0) then
                BEGIN
                CUENTA = NULL;
                EXECUTE PROCEDURE VALIDE_CUENTA_C (CTACAJA) RETURNING_VALUES (:OK);
                IF (OK = 0) THEN
                    SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                        WHERE CUEN_COD = :CTACAJA INTO :CUENTA, :TIPOCUEN;
                ELSE
                    begin
                    EXECUTE PROCEDURE ERROR (62, :IDDOC, :CTACAJA, 2);
                    CUENTA = CTACAJA;
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 4);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA - MONTO;
                    END
                END /* MONTO <> 0 */
            END /* DO CAJA */
        /* AHORA EL BANCO */
        MONTO = 0;
        SELECT CUBA_CTACONTA, EGBC_MONTO, EGBC_GMF, E.CUBA_COD, CUBA_GMFPOR, EGBC_NUMERO, BANC_NIT
            FROM EGRESOS_BANCO E, CUENTAS_BANCO C, BANCOS B
            WHERE E.CUBA_COD = C.CUBA_COD AND EGRE_ID = :IDDOC AND B.banc_cod = C.banc_cod
            INTO :CTACAJA, :MONTO, :GMF, :CODBCO, :PORC, :NUMCHEQ, :nitbco;
        if (MONTO <> 0) then
            BEGIN
            if (MONTO <> 0) then
                BEGIN
                CUENTA = NULL;
                EXECUTE PROCEDURE VALIDE_CUENTA_C (CTACAJA) RETURNING_VALUES (:OK);
                IF (OK = 0) THEN
                    SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                        WHERE CUEN_COD = :CTACAJA INTO :CUENTA, :TIPOCUEN;
                ELSE
                    begin
                    EXECUTE PROCEDURE ERROR (62, :IDDOC, :CTACAJA, 2);
                    CUENTA = CTACAJA;
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 4);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, :NUMCHEQ, 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA - MONTO;
                    END
                /* EL GMF */
                if ((GMF = 'S') AND (PORC <> 0)) then
                    BEGIN
                    if (NITBCO IS NULL) then
                        NITBCO = NIT;
                    EXECUTE procedure REDONDEE(:MONTO * :PORC / 1000, 0) returning_values (MONTO);
                    /* REGISTRE EL GMF EN LA MISMA CUENTA DEL BANCO COMO CREDITO */
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, :NUMCHEQ, 0, :MONTO, 0, 0, :NITBCO, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA - MONTO;

                    /* AHORA LA CUENTA DEL GASTO */
                    SELECT CUBA_CTAGMF FROM CUENTAS_BANCO
                        where CUBA_COD = :CODBCO INTO :CTACAJA;
                    EXECUTE PROCEDURE VALIDE_CUENTA_C (CTACAJA) RETURNING_VALUES (:OK);
                    IF (OK = 0) THEN
                        SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                            WHERE CUEN_COD = :CTACAJA INTO :CUENTA, :TIPOCUEN;
                    ELSE
                        begin
                        EXECUTE PROCEDURE ERROR (62, :IDDOC, :CTACAJA, 2);
                        CUENTA = CTACAJA;
                        TIPOCUEN = 'N';
                        ERROR = ERROR + 1;
                        end
                    if (TIPOCUEN = 'I') then
                        BEGIN
                        EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
                        TIPOCUEN = 'N';
                        ERROR = ERROR + 1;
                        END
                    if (TIPOCUEN = 'C') then
                        BEGIN
                        EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 4);
                        TIPOCUEN = 'N';
                        ERROR = ERROR + 1;
                        END
                    if (TIPOCUEN = 'N') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, :NUMCHEQ, :MONTO, 0, 0, 0, :NITBCO, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NROI = NROI + 1;
                        SUMA = SUMA + MONTO;
                        END
                    END /* GMF */
                END /* MONTO <> 0 */
            END /* EGRESO_BANCO */
        END /* CAJA = F */

    /* LOS CRUCES CON CUENTAS X COBRAR */
    if (CRUCES <> 0) then
        BEGIN
        SELECT TERC_CTACLIENTE FROM TERCEROS WHERE TERC_NIT = :nit INTO :tctacart;
        if (tctacart IS NULL) then
            tctacart = tctaclien;
        CUENTA = NULL;
        EXECUTE PROCEDURE VALIDE_CUENTA_C (tctacart) RETURNING_VALUES (:OK);
        IF (OK = 0) THEN
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :tctacart INTO :CUENTA, :TIPOCUEN;
        ELSE
            begin
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :tctacart, 2);
            CUENTA = tctacart;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            /* DEBERIA RECORRER DOCUMENTO POR DOCUMENTO */
            FOR SELECT EGCC_TIPODOC, EGCC_PREFIJO, EGCC_NUMERO, EGCC_ABONO+EGCC_RTFTE+EGCC_RTIVA+EGCC_RTICA+EGCC_DTOF
                FROM egresos_crucec WHERE EGRE_ID = :IDDOC
                INTO :TIPOIT, PREFIT, NUMIT, ABONOIT
                DO
                BEGIN
                NUMEROIT = PREFIT || NUMIT;
                if (ABONOIT > 0) then
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :ABONOIT, 0, 0, :NIT, :PROY, :CENTRO, NULL, :NUMEROIT, NULL, NULL, :TIPOIT, 0);
                else
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', abs(:ABONOIT), 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, :NUMEROIT, NULL, NULL, :TIPOIT, 0);
                SUMA = SUMA - ABONOIT;
                NROI = NROI + 1;
                END
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            if (CRUCES > 0) then
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :CRUCES, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            else
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', abs(:CRUCES), 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            SUMA = SUMA - CRUCES;
            NROI = NROI + 1;
            END
        /* LA DIFERENCIA EN CAMBIO */
        SELECT SUM(EGCC_DIFCAMBIO) FROM egresos_crucec WHERE EGRE_ID = :iddoc INTO :DIFCAMBIO;
        IF ((DIFCAMBIO IS NOT NULL) AND (DIFCAMBIO <> 0)) THEN
            BEGIN
            if (DIFCAMBIO > 0) then
                execute procedure lee_configuracion('GENERAL','GENERAL','CUENTA DE INGRESO POR DIFERENCIA EN CAMBIO PARA OPERACIONES EN OTRA MONEDA') returning_values (:ctadif);
            else
                execute procedure lee_configuracion('GENERAL','GENERAL','CUENTA DE GASTO POR DIFERENCIA EN CAMBIO PARA OPERACIONES EN OTRA MONEDA') returning_values (:ctadif);
            CUENTA = NULL;
            EXECUTE PROCEDURE VALIDE_CUENTA_C (ctadif) RETURNING_VALUES (:OK);
            IF (OK = 0) THEN
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :ctadif INTO :CUENTA, :TIPOCUEN;
            ELSE
                begin
                EXECUTE PROCEDURE ERROR (62, :IDDOC, :ctadif, 2);
                CUENTA = ctadif;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 4);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                if (DIFCAMBIO > 0) then
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :difcambio, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                else
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', ABS(:difcambio), 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - difcambio;
                END
            END
        /* RETEFUENTE DEL CRUCE */
        SELECT first 1 INCJ_RTFTE, INCJ_RTIVA, INCJ_RTICA, INCJ_CTARTFTE, INCJ_CTARTIVA, INCJ_CTARTICA
            FROM INTERFAZ_CAJA WHERE tido_cod = 61 into :RTFTER, :RTIVAR, :RTICAR, :CTARTFTER, :CTARTIVAR, :CTARTICAR;
        SELECT SUM(EGCC_RTFTE) FROM egresos_crucec WHERE EGRE_ID = :iddoc INTO :rtftec;
        IF ((rtftec IS NOT NULL) AND (rtftec <> 0)) THEN
            BEGIN
            if ((RTFTER = 'T') or (RTFTER = 'K')) then
                BEGIN
                if (RTFTER = 'T') then
                    SELECT TERC_CTARTFTE FROM TERCEROS WHERE TERC_NIT = :NIT INTO CTARTFTER;
                CUENTA = NULL;
                EXECUTE PROCEDURE VALIDE_CUENTA_C (ctartfter) RETURNING_VALUES (:OK);
                IF (OK = 0) THEN
                    SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                        WHERE CUEN_COD = :ctartfter INTO :CUENTA, :TIPOCUEN;
                ELSE
                    begin
                    EXECUTE PROCEDURE ERROR (62, :IDDOC, :ctartfter, 2);
                    CUENTA = ctartfter;
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 4);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    if (rtftec > 0) then
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :rtftec, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    else
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, abs(:rtftec), 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA + rtftec;
                    END
                END
            END
        /* RETEIVA DEL CRUCE */
        SELECT SUM(EGCC_RTIVA) FROM egresos_crucec WHERE EGRE_ID = :iddoc INTO :rtivac;
        IF ((rtivac IS NOT NULL) AND (rtivac <> 0)) THEN
            BEGIN
            if ((RTIVAR = 'T') or (RTIVAR = 'K')) then
                BEGIN
                if (RTIVAR = 'T') then
                    SELECT TERC_CTARTIVA FROM TERCEROS WHERE TERC_NIT = :NIT INTO CTARTIVAR;
                CUENTA = NULL;
                EXECUTE PROCEDURE VALIDE_CUENTA_C (ctartivar) RETURNING_VALUES (:OK);
                IF (OK = 0) THEN
                    SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                        WHERE CUEN_COD = :ctartivar INTO :CUENTA, :TIPOCUEN;
                ELSE
                    begin
                    EXECUTE PROCEDURE ERROR (62, :IDDOC, :ctartivar, 2);
                    CUENTA = ctartivar;
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 4);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    if (rtivac > 0) then
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :rtivac, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    else
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, abs(:rtivac), 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA + rtivac;
                    END
                END
            END
        /* RETEICA DEL CRUCE */
        SELECT SUM(EGCC_RTICA) FROM egresos_crucec WHERE EGRE_ID = :iddoc INTO :rticac;
        IF ((rticac IS NOT NULL) AND (rtivac <> 0)) THEN
            BEGIN
            if ((RTICAR = 'T') or (RTICAR = 'K')) then
                BEGIN
                if (RTICAR = 'T') then
                    SELECT TERC_CTARTICA FROM TERCEROS WHERE TERC_NIT = :NIT INTO CTARTICAR;
                CUENTA = NULL;
                EXECUTE PROCEDURE VALIDE_CUENTA_C (ctarticar) RETURNING_VALUES (:OK);
                IF (OK = 0) THEN
                    SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                        WHERE CUEN_COD = :ctarticar INTO :CUENTA, :TIPOCUEN;
                ELSE
                    begin
                    EXECUTE PROCEDURE ERROR (62, :IDDOC, :ctarticar, 2);
                    CUENTA = ctarticar;
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 4);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    if (rticac > 0) then
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :rticac, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    else
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, abs(:rticac), 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA + rticac;
                    END
                END
            END
        END /* cruces */

    if (DTO = 'K') then /* DTO EN CTA CONSTANTE */
        BEGIN
        if (VRDTO <> 0) then
            BEGIN
            CUENTA = NULL;
            EXECUTE PROCEDURE VALIDE_CUENTA_C (CTADTO) RETURNING_VALUES (:OK);
            IF (OK = 0) THEN
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :CTADTO INTO :CUENTA, :TIPOCUEN;
            ELSE
                begin
                EXECUTE PROCEDURE ERROR (62, :IDDOC, :CTADTO, 2);
                CUENTA = CTADTO;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 4);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRDTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - VRDTO;
                END
            END /* VRDTO <> 0 */
        END /* DTO EN CTA CONSTANTE */

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

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE EGRESOS_SIN_CONTABILIDAD(
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    ID INTEGER,
    IDI INTEGER,
    IDC INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    ESTADO VARCHAR(20),
    ERROR INTEGER)
AS
DECLARE VARIABLE VER CHAR(2);
declare variable FECICNT VARCHAR(10);
declare variable FECFCNT VARCHAR(10);
declare variable idref INTEGER;
BEGIN
EXECUTE PROCEDURE fecha_a_conta(FECINI) returning_values (FECICNT);
EXECUTE PROCEDURE fecha_a_conta(FECFIN) returning_values (FECFCNT);
FOR SELECT EGRE_ID, PREF_PRE, egre_numero FROM EGRESOS WHERE EGRE_ANULADO = 'N' AND PREF_PRE <> 'R004' AND
    EGRE_FECHA >= :FECINI AND EGRE_FECHA <= :FECFIN ORDER BY EGRE_ID INTO :ID, :PREF, :NUMERO
DO
  BEGIN
  idref = null;
  SELECT ENCO_IDREF FROM COMPROBANTE_ENCABEZADO WHERE ENCO_TIPOREF = 62 AND ENCO_FECHA >= :FECICNT AND ENCO_FECHA <= :FECFCNT and ENCO_IDREF = :ID into :idref;
  if (idref IS NULL) then
  begin
   ESTADO = 'PROCESANDO';
   SUSPEND;
   SELECT MAX(INCJ_ID) FROM INTERFAZ_CAJA WHERE PREF_PRE = :PREF AND TIDO_COD = 62 INTO :IDI;
   EXECUTE PROCEDURE CONTABIL_EGRESO (:ID, :IDI) RETURNING_VALUES (:ERROR, :VER, :IDC);
   IF (ERROR = 0) THEN
      BEGIN
      EXECUTE PROCEDURE CONTABILIZA_PENDIENTE (:IDC);
      ESTADO = 'OK';
      END
   ELSE
    ESTADO = 'ERROR';
   suspend;
  end
  END
END

^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure BUSCA_ID_DOC_CXPAGAR (
    TIPO integer,
    PREFIJO varchar(4),
    NUMERO varchar(6),
    NIT varchar(20),
    FECHA date)
returns (
    ID integer,
    SALDO numeric(18,2),
    RTFTE numeric(18,2),
    RTIVA numeric(18,2),
    RTICA numeric(18,2),
    DTOF numeric(18,2),
    ERROR integer,
    NUMPROV varchar(8))
AS
declare variable VERNIT VARCHAR(20);
declare variable FEC DATE;
declare variable DTOAPL NUMERIC(18,2);
declare variable FECDTO DATE;
declare variable DESC_RTES CHAR(2);
declare variable OTROSTERC CHAR(2);
declare variable TRM NUMERIC(18,2);
declare variable MONEDA INTEGER;
BEGIN
ERROR = 0;
ID = 0;
EXECUTE PROCEDURE COMPLETA_CEROS(NUMERO) returning_values (NUMERO);
if (TIPO = 51) then
    SELECT NDPR_ID, TERC_NIT, NDPR_FECHA, NDPR_DTOFMONTO, NDPR_DTOFECHA, NDPR_TRM, NDPR_NUMPROV
        FROM NOTAS_DEBITO_PROVEEDOR WHERE PREF_PRE = :PREFIJO AND NDPR_NUMERO = :NUMERO
        INTO :ID, :VERNIT, :FEC, :DTOF, :FECDTO, :TRM, :numprov;
if (TIPO = 52) then
    SELECT NCPR_ID, TERC_NIT, NCPR_FECHA, NCPR_DTOFMONTO, NCPR_DTOFECHA, NCPR_TRM, ''
        FROM NOTAS_CREDITO_PROVEEDOR WHERE PREF_PRE = :PREFIJO AND NCPR_NUMERO = :NUMERO
        INTO :ID, :VERNIT, :FEC, :DTOF, :FECDTO, :TRM, :numprov;
if (TIPO = 55) then
    SELECT ANPR_ID, TERC_NIT, ANPR_FECHA, ANPR_DTOFMONTO, ANPR_DTOFECHA, ANPR_TRM, ''
        FROM ANTICIPOS_PROVEEDOR WHERE PREF_PRE = :PREFIJO AND ANPR_NUMERO = :NUMERO
        INTO :ID, :VERNIT, :FEC, :DTOF, :FECDTO, :TRM, :numprov;
if (TIPO = 21) then
    SELECT FACO_ID, TERC_NIT, FACO_FECHA, FACO_DTOFMONTO, FACO_DTOFFECHA, FACO_TRM, FACO_NUMPROV
        FROM FACTURAS_COMPRA WHERE PREF_PRE = :PREFIJO AND FACO_NUMERO = :NUMERO
        INTO :ID, :VERNIT, :FEC, :DTOF, :FECDTO, :TRM, :numprov;
if (TIPO = 24) then
    SELECT DVCO_ID, TERC_NIT, DVCO_FECHA, 0, DVCO_FECHA, DVCO_TRM, ''
        FROM devoluciones_compras WHERE PREF_PRE = :PREFIJO AND DVCO_NUMERO = :NUMERO
        INTO :ID, :VERNIT, :FEC, :DTOF, :FECDTO, :TRM, :numprov;
if (fecha > FECDTO) then
    DTOF = 0;
if (DTOF IS NULL) then
    DTOF = 0;
if (DTOF <> 0) then
    BEGIN
    SELECT SUM(EGDE_DTOF) FROM EGRESOS_DETALLE WHERE EGDE_IDDOC = :ID AND EGDE_TIPODOC = :TIPO INTO :DTOAPL;
    if (DTOAPL IS NULL) then
        DTOAPL = 0;
    DTOF = DTOF - DTOAPL;
    if ((TRM <> 1) AND (TRM <> 0)) then
        DTOF = DTOF / TRM;
    END
if (ID = 0) then
  ERROR = 1;
ELSE
  BEGIN
  /* VERIFIQUE EL NIT */
  execute procedure lee_configuracion ('CAJA', 'EGRESOS', 'PERMITIR ABONAR/CANCELAR DOCUMENTOS DE VARIOS TERCEROS EN UN SOLO EGRESO') returning_values (:otrosterc);
  if ((otrosterc = 'NO') AND (VERNIT <> NIT)) then
    begin
    ERROR = 2;
    end
  else
    BEGIN
    /* VERIFIQUE QUE LA FECHA DEL ABONO SEA POSTERIOR O IGUAL AL DOC */
    if (FEC > FECHA) then
        ERROR = 3;
    ELSE
        BEGIN
        /* CALCULE LOS SALDOS */
        SELECT SUM(SDCP_RTEFTE - SDCP_ABRTFTE), SUM(SDCP_RTIVA - SDCP_ABRTIVA), SUM(SDCP_RTICA - SDCP_ABRTICA)
            FROM SALDOS_DOC_CXPAGAR WHERE SDCP_TIPOREF = :TIPO AND SDCP_IDREF = :ID
            INTO :RTFTE, :RTIVA, :RTICA;
        if (RTFTE IS NULL) then
            RTFTE = 0;
        if (RTIVA IS NULL) then
            RTIVA = 0;
        if (RTICA IS NULL) then
            RTICA = 0;
        /* TRAIGA EL SALDO NETO */
        if (TRM <> 1) then
            execute procedure lee_configuracion ('GENERAL', 'GENERAL', 'MONEDA PREDETERMINADA EN OPERACIONES CON EL EXTERIOR') returning_values (:moneda);
        else    
            MONEDA = 0;
        if (TRM <> 0) then
            BEGIN
            RTFTE = RTFTE / TRM;
            RTIVA = RTIVA / TRM;
            RTICA = RTICA / TRM;
            END
        EXECUTE PROCEDURE SALDO_DOC_CXPAGAR(TIPO, ID, FECHA,MONEDA) returning_values (SALDO);
        if (SALDO = 0) then
            ERROR = 4;
        ELSE
            BEGIN
            /* RESTE LAS RETENCIONES YA QUE SE SUGERIRAN */
            EXECUTE PROCEDURE LEE_CONFIGURACION('CXPAGAR', 'SALDOS', 'DESCONTAR RETENCIONES POR CAUSACION') returning_values (DESC_RTES);
            if (DESC_RTES = 'NO') then
                SALDO = SALDO - RTFTE - RTIVA - RTICA;
            SALDO = SALDO - DTOF;
            END
        END
    END
  END
SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER EGRESOS_DETALLE_AI FOR EGRESOS_DETALLE
ACTIVE AFTER INSERT POSITION 0
AS
declare variable FEC DATE;
declare variable NIT VARCHAR(20);
declare variable CONCEPTO VARCHAR(60);
declare variable PREFIJO VARCHAR(4);
declare variable NUMERO VARCHAR(6);
declare variable OK CHAR(1);
declare variable EGANTI INTEGER;
declare variable RETES CHAR(2);
declare variable SALDO NUMERIC(18,2);
declare variable TRM NUMERIC(18,2);
declare variable NITDOC VARCHAR(20);
BEGIN
/* Abone el documento referenciado en EGRESOS_DETALLE */
select PREF_PRE, EGRE_NUMERO, EGRE_FECHA, EGRE_CONC, TERC_NIT, EGRE_TRM
    from EGRESOS where EGRE_ID = new.EGRE_ID into :PREFIJO, :NUMERO, :FEC, :CONCEPTO, :NIT, :TRM;
if ((NEW.EGRE_ID <> 0) and (new.egde_anulado = 'N')) then
    BEGIN
    OK = 'N';
    if (new.EGDE_TIPODOC = 55) then
        BEGIN
        /* BUSQUE SI TIENE EGRE_ID, SI NO LO ACTUALIZA */
        SELECT EGRE_ID FROM ANTICIPOS_PROVEEDOR WHERE ANPR_ID = NEW.EGDE_IDDOC INTO :EGANTI;
        if (EGANTI = 0) then
            BEGIN
            OK = 'S';
            UPDATE ANTICIPOS_PROVEEDOR SET EGRE_ID = NEW.EGRE_ID WHERE ANPR_ID = NEW.EGDE_IDDOC;
            END
        END
    /* valide que no se pase del saldo */
    execute procedure saldo_doc_cxpagar(new.egde_tipodoc, new.egde_iddoc, '9999/12/31', 0) returning_values(saldo);
    execute procedure lee_configuracion('CXPAGAR', 'SALDOS', 'DESCONTAR RETENCIONES POR CAUSACION') returning_values (RETES);
    if (SALDO < 0) then
        BEGIN
        if (RETES = 'SI') then
            begin
            if (saldo > (NEW.egde_abono+NEW.egde_dtof+NEW.egde_difcambio)) then
                EXCEPTION DOCUMENTO_ABONO_MAYOR 'EL SALDO DEL DOCUMENTO ' || NEW.egde_prefijo || NEW.egde_numero || ' ES INSUFICIENTE.';
            end
        ELSE
            begin
            if (saldo > (NEW.egde_abono + NEW.egde_rtfte + NEW.egde_rtiva + NEW.egde_rtica + new.egde_dtof + NEW.egde_difcambio)) then
                EXCEPTION DOCUMENTO_ABONO_MAYOR 'EL SALDO DEL DOCUMENTO ' || NEW.egde_prefijo || NEW.egde_numero || ' ES INSUFICIENTE.';
            end
        END
    else
        BEGIN
        if (RETES = 'SI') then
            begin
            if (saldo < (NEW.egde_abono + NEW.egde_dtof + NEW.egde_difcambio)) then
                EXCEPTION DOCUMENTO_ABONO_MAYOR 'EL SALDO DEL DOCUMENTO ' || NEW.egde_prefijo || NEW.egde_numero || ' ES INSUFICIENTE.';
            end
        ELSE
            begin
            if (saldo < (NEW.egde_abono + NEW.egde_rtfte + NEW.egde_rtiva + NEW.egde_rtica + NEW.egde_dtof + NEW.egde_difcambio)) then
                EXCEPTION DOCUMENTO_ABONO_MAYOR 'EL SALDO DEL DOCUMENTO ' || NEW.egde_prefijo || NEW.egde_numero || ' ES INSUFICIENTE.';
            end
        END
    if (OK = 'N') then
        BEGIN
        if (exists (select sdcp_idref from saldos_doc_cxpagar where sdcp_tiporef = new.egde_tipodoc and
            sdcp_idref = new.egde_iddoc and sdcp_fecha = :FEC)) then
            begin
            /* actualice el saldo del dia */
            UPDATE saldos_doc_cxpagar
                SET SDCP_ABONO = SDCP_ABONO + (NEW.egde_abono + NEW.egde_dtof + NEW.egde_difcambio),
                    SDCP_ABRTFTE = SDCP_ABRTFTE + NEW.egde_RTFTE,
                    SDCP_ABRTIVA = SDCP_ABRTIVA + NEW.egde_RTIVA,
                    SDCP_ABRTICA = SDCP_ABRTICA + NEW.egde_RTICA,
                    SDCP_TRM = :TRM
                WHERE SDCP_TIPOREF = NEW.EGDE_TIPODOC AND SDCP_IDREF = NEW.egde_IDDOC AND SDCP_FECHA = :FEC;
            END
        ELSE
            BEGIN
            /* Inserte un nuevo saldo diario */
            INSERT INTO SALDOS_DOC_CXPAGAR (SDCP_TIPOREF, SDCP_IDREF, SDCP_FECHA, TERC_NIT, SDCP_RTEFTE, SDCP_RTIVA, SDCP_RTICA, SDCP_ABONO, SDCP_ABRTFTE, SDCP_ABRTIVA, SDCP_ABRTICA, SDCP_DEBITO, SDCP_MONTO, SDCP_TRM)
                VALUES (NEW.EGDE_TIPODOC, NEW.EGDE_IDDOC, :FEC, :NIT, 0, 0, 0, (NEW.egde_abono+NEW.egde_dtof+NEW.egde_difcambio), NEW.egde_rtfte, NEW.egde_rtiva, NEW.egde_rtica, 'N', 0, :TRM);
            END
        END
    /* actualice el registro en mov_proveedor (por si son varios items) */
    SELECT TERC_NIT FROM movimiento_proveedor M WHERE M.mvpr_tiporef = NEW.egde_tipodoc AND M.mvpr_idref = NEW.egde_iddoc INTO :NITDOC;
    if (EXISTS (SELECT MVPR_ID FROM MOVIMIENTO_PROVEEDOR WHERE MVPR_TIPOREF = 62 AND MVPR_IDREF = NEW.EGRE_ID AND TERC_NIT = :NITDOC)) then
        begin
        UPDATE movimiento_proveedor
            SET MVPR_MONTO = MVPR_MONTO + (NEW.egde_abono + NEW.egde_dtof + NEW.egde_difcambio),
                MVPR_RTFTE = MVPR_RTFTE + NEW.egde_rtfte,
                MVPR_RTIVA = MVPR_RTIVA + NEW.egde_rtiva,
                MVPR_RTICA = MVPR_RTICA + NEW.egde_rtica,
                MVPR_TRM = :TRM
            WHERE MVPR_TIPOREF = 62 AND MVPR_IDREF = NEW.EGRE_ID AND TERC_NIT = :NITDOC;
        end
    ELSE
        INSERT INTO MOVIMIENTO_PROVEEDOR (MVPR_ID, TERC_NIT, MVPR_TIPOREF, MVPR_IDREF, MVPR_FECHA, MVPR_VENCE, MVPR_CONC, MVPR_MONTO, MVPR_RTFTE, MVPR_RTIVA, MVPR_RTICA, MVPR_DEBITO, MVPR_ABONO, MVPR_PREFIJO, MVPR_NUMERO, MVPR_TRM)
            VALUES (GEN_ID(ID_MOVPROV, 1), :NITDOC, 62, NEW.EGRE_ID, :FEC, :FEC, :CONCEPTO, (NEW.EGDE_ABONO+NEW.egde_dtof+NEW.egde_difcambio), NEW.EGDE_RTFTE, NEW.EGDE_RTIVA, NEW.EGDE_RTICA, 'N', 'S', :PREFIJO, :NUMERO, :TRM);
    END
END
^

SET TERM ; ^

SET TERM ^ ;

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

SET TERM ; ^

SET TERM ^ ;

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

SET TERM ; ^


/* 20091211C */
/* COMISIONES POR COBRO INCLUYENDO EL IMPOCONSUMO */

INSERT INTO CONFIGURACION (CONF_MODULO, CONF_CATEGORIA, CONF_PROPIEDAD, CONF_VALOR, CONF_POSIBLES, CONF_AYUDA) VALUES ('CARTERA', 'COMISIONES', 'COMISION POR COBRO INCLUYENDO EL IMPOCONSUMO', 'NO', 'SI,NO', 'SI: El subtotal antes de IVA incluyendo el impoconsumo hace parte de la base para el cálculo de la comisión por cobro. NO: Se liquida la comisión sobre la base antes de IVA e impoconsumo');
commit work;

SET TERM ^ ;

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

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

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

SET TERM ; ^


/* 20091211D */
/* MOVIMIENTO PROVEEDOR BORRABA LOS EGRESOS EN CERO */

SET TERM ^ ;

CREATE OR ALTER TRIGGER MOVIMIENTO_PROVEEDOR_AU FOR MOVIMIENTO_PROVEEDOR
ACTIVE AFTER UPDATE POSITION 0
AS
declare variable ANULADO char(1);
BEGIN
if (new.mvpr_tiporef <> 55) Then
  begin
  /* SI QUEDO EN CEROS EL MONTO Y LAS RETES, ELIMINE EL REGISTRO */
  if ((NEW.mvpr_monto = 0) AND (NEW.mvpr_rtfte = 0) AND (NEW.mvpr_rtica = 0) AND (NEW.mvpr_rtiva = 0)) then
    IF (NEW.MVPR_TIPOREF <> 53) THEN
      BEGIN
      IF (NEW.MVPR_TIPOREF <> 62) THEN
        DELETE FROM movimiento_proveedor WHERE MVPR_ID = NEW.mvpr_id;
      ELSE
        BEGIN
        SELECT EGRE_ANULADO FROM EGRESOS WHERE EGRE_ID = NEW.mvpr_idref INTO :ANULADO;
        if (ANULADO = 'S') then
          DELETE FROM movimiento_proveedor WHERE MVPR_ID = NEW.mvpr_id;
        END
      END
    ELSE
      BEGIN
      SELECT APPR_ANULADO FROM APLICACION_PROVEDOR WHERE APPR_ID = NEW.mvpr_idref INTO :ANULADO;
      if (ANULADO = 'S') then
            DELETE FROM movimiento_proveedor WHERE MVPR_ID = NEW.mvpr_id;
      END
  END
END
^

SET TERM ; ^



/* 20091212 */
CREATE DESCENDING INDEX FACTURAS_IDX4
ON FACTURAS (TERC_NIT,FACT_FECHA);

SET TERM ^ ;

CREATE OR ALTER procedure BUSQUEDA_CLIENTES (
    NITINI VARCHAR(20),
    NITFIN VARCHAR(20),
    NOMINI VARCHAR(60),
    NOMFIN VARCHAR(60),
    VENINI INTEGER,
    VENFIN INTEGER,
    COBINI INTEGER,
    COBFIN INTEGER,
    ZONINI VARCHAR(20),
    ZONFIN VARCHAR(20),
    CLAINI INTEGER,
    CLAFIN INTEGER,
    GRPINI INTEGER,
    GRPFIN INTEGER,
    TIPINI INTEGER,
    TIPFIN INTEGER,
    EVEINI DATE,
    EVEFIN DATE,
    VTAINI DATE,
    VTAFIN DATE)
returns (
    NIT VARCHAR(20),
    NOMBRE VARCHAR(60),
    DIR VARCHAR(60),
    CIU VARCHAR(40),
    TEL VARCHAR(40),
    FAX VARCHAR(25),
    CEL VARCHAR(25),
    EMAIL VARCHAR(100),
    CONTACTO VARCHAR(60),
    CODVEND INTEGER,
    CODCOBR INTEGER,
    CODZONA VARCHAR(3),
    CODGRUP INTEGER,
    CODTIPO INTEGER,
    CODCLAS INTEGER,
    NOMVEND VARCHAR(60),
    NOMCOBR VARCHAR(60),
    NOMZONA VARCHAR(60),
    NOMGRUP VARCHAR(60),
    NOMTIPO VARCHAR(60),
    NOMCLAS VARCHAR(60),
    ULTEVEN DATE,
    ULTVENT DATE,
    ANIVERS DATE,
    ESTADO VARCHAR(60),
    CALIFICA INTEGER,
    CAMPO1 VARCHAR(25),
    CAMPO2 VARCHAR(25),
    CAMPO3 VARCHAR(25),
    FECHA1 DATE,
    FECHA2 DATE,
    MONTO1 NUMERIC(18,2),
    MONTO2 NUMERIC(18,2),
    OBSERV BLOB SUB_TYPE 1 SEGMENT SIZE 80)
as
declare variable OK CHAR(1);
begin
FOR select CRCL_NIT, CRCL_NOM, CRCL_DIR, CRCL_CIU, CRCL_TEL, CRCL_FAX, CRCL_CEL, CRCL_EMAIL, CRCL_CONTACTO, CRCL_ANIV,
    CRCL_TIPORELA, CRCL_ESTADO, CRCL_CLASE, CRCL_AGRUPA, CRCL_CALIFICA, CRCL_CAMPO1, CRCL_CAMPO2, CRCL_CAMPO3,
    CRCL_FECHA1, CRCL_FECHA2, CRCL_MONTO1, CRCL_MONTO2, CRCL_OBS
    FROM CRM_CLIENTES WHERE CRCL_NIT >= :nitini AND CRCL_NIT <= :nitfin AND CRCL_NOM >= :nomini AND CRCL_NOM <= :nomfin
    AND CRCL_ESTADO <> 0
    INTO :NIT, :NOMBRE, :DIR, :CIU, :TEL, :FAX, :CEL, :EMAIL, :contacto, :ANIVERS,
    :CODTIPO, :ESTADO, :CODCLAS, :CODGRUP, :califica, :campo1, :campo2, :campo3,
    :fecha1, :fecha2, :monto1, :monto2, :observ
    DO
    BEGIN
    NOMCLAS = '';
    NOMGRUP = '';
    NOMTIPO = '';
    NOMVEND = '';
    nomcobr = '';
    SELECT VEND_COD, COBR_COD, ZONA_COD FROM CLIENTES C WHERE TERC_NIT = :NIT INTO :codvend, :codcobr, :codzona;
    OK = 'S';
    if (((VENINI <> 0) OR (VENFIN <> 999999)) AND ((codvend < venini) OR (codvend > venfin))) then
        OK = 'N';
    if (((COBINI <> 0) OR (COBFIN <> 999999)) AND ((codcobr < cobini) OR (codcobr > cobfin))) then
        OK = 'N';
    if (((TIPINI <> 0) OR (TIPFIN <> 999999)) AND ((codtipo < tipini) OR (codtipo > tipfin))) then
        OK = 'N';
    if (((grpini <> 0) OR (grpfin <> 999999)) AND ((codgrup < grpini) OR (codgrup > grpfin))) then
        OK = 'N';
    if (((claini <> 0) OR (clafin <> 999999)) AND ((codclas < claini) OR (codclas > clafin))) then
        OK = 'N';
    if (((zonini <> '') OR (zonfin <> 'zz')) AND ((codzona < zonini) OR (codzona > zonfin))) then
        OK = 'N';
    if (OK = 'S') then
        begin
        SELECT CRTR_NOMBRE FROM crm_tiporelacion WHERE crtr_id = :codtipo INTO :nomtipo;
        SELECT CRES_NOMBRE FROM crm_estado WHERE cres_id = :estado INTO :estado;
/*        SELECT CRCL_NOMBRE FROM crm_clase WHERE crcl_id = :codclas INTO :nomclas; */
        SELECT CRAG_NOMBRE FROM crm_agrupacion WHERE crag_id = :codgrup INTO :nomgrup;
        SELECT VEND_NOMBRE FROM VENDEDORES WHERE vend_cod = :codvend INTO :nomvend;
        SELECT COBR_NOM FROM cobradores WHERE cobr_cod = :codcobr INTO :nomcobr;
        SELECT ZONA_NOM FROM zonas WHERE zona_cod = :codzona INTO :nomzona;
        ulteven = NULL;
        ultvent = NULL;
        select MAX(CREV_FECHA) from CRM_EVENTOS where CRCL_NIT = :NIT into :ulteven;
        select FIRST 1 FACT_FECHA from FACTURAS where TERC_NIT = :NIT AND FACT_FECHA >= '2000/01/01' ORDER BY TERC_NIT DESC, FACT_FECHA DESC into :ultvent;
        if ((ulteven >= eveini) AND (ulteven <= evefin) AND (ultvent >= vtaini) AND (ultvent <= vtafin)) then
            SUSPEND;
        end
    END
end
^

SET TERM ; ^



/* 20091212B */

INSERT INTO CONFIGURACION (CONF_MODULO, CONF_CATEGORIA, CONF_PROPIEDAD, CONF_VALOR, CONF_POSIBLES, CONF_AYUDA) VALUES ('CONTABILIDAD', 'COMPROBANTES', 'AUXILIAR POR CUENTA MOSTRANDO CENTROS DE COSTOS', 'SI', 'SI,NO', 'SI: Incluye las columnas de centro y subcentro. NO: Omite el centro y subcentro y amplia el concepto del movimiento.');
commit work;

/* 20091214 */
CREATE INDEX MOVIMIENTO_ARTICULO_IDX4
ON MOVIMIENTO_ARTICULO (ARTI_COD,BODE_COD,MVAR_FECHA);

ALTER TABLE PROMEDIO_SALIDAS DROP CONSTRAINT PK_PROMEDIO_SALIDAS;

alter table PROMEDIO_SALIDAS
add constraint PK_PROMEDIO_SALIDAS
primary key (ARTI_COD,BODE_COD,PRSA_FECHA)
using descending index PK_PROMEDIO_SALIDAS;

SET TERM ^ ;

CREATE OR ALTER procedure PROMEDIO_SALIDAS_ARTICULO (
    ARTICULO varchar(15),
    FECHA date,
    BODEGA varchar(2))
returns (
    PROMEDIO numeric(18,4),
    SALIDAS numeric(18,4))
AS
declare variable FECINI DATE;
declare variable DIASC VARCHAR(255);
declare variable DIAS INTEGER;
declare variable DIA_ART VARCHAR(2) CHARACTER SET NONE;
declare variable INCSALI VARCHAR(2);
declare variable SININV VARCHAR(2);
declare variable saldo numeric(18,2);
BEGIN
  EXECUTE PROCEDURE lee_configuracion ('INVENTARIO', 'EXISTENCIAS', 'INCLUIR SALIDAS POR CONCEPTOS DIFERENTES A VENTA EN CALCULO DE PROMEDIO DE SALIDAS POR ARTICULO') returning_values (INCSALI);
  /*DE ACUERDO A PARAMETRO TOME LOS DIAS PARA EL PROMDIO*/
  EXECUTE PROCEDURE lee_configuracion ('INVENTARIO', 'EXISTENCIAS', 'PROMEDIAR LAS SALIDAS DEL INVENTARIO CON EL NUMERO DE DIAS ASIGNADO A CADA ARTICULO') returning_values (:DIA_ART);
  /* SUME LAS CANTIDADES SALIDAS DEL INVENTARIO */
  EXECUTE PROCEDURE lee_configuracion ('INVENTARIO', 'EXISTENCIAS', 'NUMERO DE DIAS PARA PROMEDIO DE SALIDAS POR ARTICULO') returning_values (DIASC);
  EXECUTE PROCEDURE lee_configuracion ('INVENTARIO', 'EXISTENCIAS', 'INCLUIR DIAS SIN EXISTENCIA EN PROMEDIO DE VENTAS DIARIO') returning_values (:SININV);
  if (DIA_ART = 'SI') then
    BEGIN
      SELECT ARTI_DIANALIS FROM ARTICULO WHERE ARTI_COD = :ARTICULO INTO :DIAS;
    END
  ELSE
     DIAS = CAST(DIASC AS INTEGER);
  if (DIAS IS NULL) then
    DIAS = 30;
SELECT FIRST 1 PRSA_PROMEDIO, PRSA_FECHA FROM promedio_salidas
    WHERE ARTI_COD = :articulo AND BODE_COD = :bodega
    ORDER BY ARTI_COD DESC, BODE_COD DESC, PRSA_FECHA DESC INTO :promedio, :fecini;
if (((FECHA - FECINI) > 7) or (FECINI IS NULL) or (PROMEDIO IS NULL) ) then
  BEGIN
  FECINI = FECHA - DIAS;
  if (INCSALI = 'SI') then
      SELECT SUM(MVAR_CANT) FROM MOVIMIENTO_ARTICULO
        WHERE ARTI_COD = :ARTICULO AND BODE_COD = :BODEGA AND MVAR_FECHA >= :FECINI AND MVAR_FECHA <= :FECHA AND MVAR_ENTRADA = 'N' AND MVAR_TIPODOC <> 13 INTO :SALIDAS;
  else
      SELECT SUM(MVAR_CANT) FROM MOVIMIENTO_ARTICULO
        WHERE ARTI_COD = :ARTICULO AND BODE_COD = :BODEGA AND MVAR_FECHA >= :FECINI AND MVAR_FECHA <= :FECHA AND ((MVAR_TIPODOC = 31) or (MVAR_TIPODOC = 32)) INTO :SALIDAS;
  if (SALIDAS IS NULL) then
    SALIDAS = 0;
  if (SININV = 'SI') then
      PROMEDIO = SALIDAS / DIAS;
  else
    begin
    dias = 0;
    while (fecini < fecha) do
        begin
        execute procedure saldo_inventario (:articulo, :bodega, :fecini) returning_values (:saldo);
        if (SALDO <> 0) then
            DIAS = DIAS + 1;
        fecini = fecini + 1;
        end
    if (DIAS = 0) then
        PROMEDIO = 0;
    ELSE
        PROMEDIO = SALIDAS / DIAS;
    end
  UPDATE or INSERT INTO promedio_salidas (ARTI_COD, BODE_COD, PRSA_FECHA, PRSA_PROMEDIO)
    VALUES (:articulo, :bodega, :fecha, :promedio);
  END
else
    SALIDAS = PROMEDIO * DIAS;
SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE DISPONIBILIDAD_ARTICULO(
    ARTICULO VARCHAR(15),
    FECHA DATE,
    BODEGA VARCHAR(2))
RETURNS (
    DISPONIBILIDAD INTEGER,
    EXIST NUMERIC(18,4),
    PROMEDIO NUMERIC(18,4),
    SALIDAS NUMERIC(18,4))
AS
BEGIN
  EXECUTE PROCEDURE SALDO_INVENTARIO (ARTICULO, BODEGA, FECHA) returning_values (:EXIST);
  EXECUTE PROCEDURE PROMEDIO_SALIDAS_ARTICULO(:ARTICULO, :FECHA, :BODEGA) returning_values (:PROMEDIO, :SALIDAS);
  if (PROMEDIO > 0) then
    DISPONIBILIDAD = EXIST / PROMEDIO;
  ELSE
    DISPONIBILIDAD = 0;
  SUSPEND;
END

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE EXISTENCIAS_COMPRAS(
    ARTICULO VARCHAR(15),
    FECHA DATE,
    UNIDAD VARCHAR(8))
RETURNS (
    BODEGA VARCHAR(2),
    EXISTENCIA NUMERIC(18,2),
    RESERVADO NUMERIC(18,2),
    ORDENADO NUMERIC(18,2),
    PROMEDIO NUMERIC(18,2),
    VENTAMES NUMERIC(18,2),
    FECHACMP DATE,
    CANTCMP NUMERIC(18,2),
    DIAS INTEGER,
    SUGERIDO NUMERIC(18,2),
    STAND VARCHAR(20))
AS
declare variable FACTOR NUMERIC(15,4);
declare variable ORDENC NUMERIC(18,4);
declare variable PEDIDO NUMERIC(18,4);
declare variable ITEM INTEGER;
declare variable ID INTEGER;
declare variable UND VARCHAR(8);
declare variable CANT NUMERIC(18,4);
declare variable FACTOR2 NUMERIC(18,4);
declare variable fecini DATE;
declare variable FECHAAUX VARCHAR(10);
declare variable AGENCIA INTEGER;
declare variable DEVMES NUMERIC(18,2);
declare variable MFAC INTEGER;
declare variable MDEV INTEGER;
declare variable IVAF NUMERIC(18,2);
declare variable IVAD NUMERIC(18,2);
declare variable DIA_ART VARCHAR(2) CHARACTER SET NONE;
declare variable DIASC VARCHAR(255);
declare variable PEDAUTO CHAR(2);
declare variable SALIDAS NUMERIC(18,4);
BEGIN
  for select bode_cod, SUCU_ID from bodega into :bodega, :agencia
    do
    begin
    execute procedure saldo_inventario (:articulo, :bodega, :fecha) returning_values (:Existencia);
    EXECUTE PROCEDURE FACTOR_UNIDAD_CANT(:ARTICULO, :UNIDAD) returning_values (:FACTOR);
    if (FACTOR <> 0) then
        EXISTENCIA = EXISTENCIA / FACTOR;
    else
        EXISTENCIA = 0;
    STAND = '';
    SELECT STAND_COD FROM STANDS WHERE ARTI_COD = :ARTICULO AND STAND_BODEGA = :BODEGA INTO :stand;
    EXECUTE PROCEDURE promedio_salidas_articulo (:ARTICULO, :FECHA, :BODEGA) returning_values (:PROMEDIO, :SALIDAS);
    EXECUTE PROCEDURE lee_configuracion ('INVENTARIO', 'EXISTENCIAS', 'PROMEDIAR LAS SALIDAS DEL INVENTARIO CON EL NUMERO DE DIAS ASIGNADO A CADA ARTICULO') returning_values (:DIA_ART);
    if (DIA_ART = 'NO') then
        BEGIN
        EXECUTE PROCEDURE lee_configuracion ('INVENTARIO', 'EXISTENCIAS', 'NUMERO DE DIAS PARA PROMEDIO DE SALIDAS POR ARTICULO') returning_values (DIASC);
        DIAS = CAST(DIASC AS INTEGER);
        END
    ELSE
        SELECT ARTI_DIAS FROM ARTICULO WHERE ARTI_COD = :ARTICULO INTO :DIAS;
    if (DIAS is null) then
        DIAS = 0;
    PROMEDIO = DIAS * PROMEDIO;
    if (FACTOR <> 0) then
        PROMEDIO = PROMEDIO / FACTOR;
    SUGERIDO = PROMEDIO - EXISTENCIA;
    SELECT SUM(ORID_ENTREGAR)
      FROM ORDENINVENTARIO_DETALLE OD, ordenes_inventario O
      WHERE O.ORIN_ID = OD.ORIN_ID AND ARTI_COD = :ARTICULO AND ORIN_FECHA <= :FECHA AND ORIN_FECLLEGA >= :FECHA AND ORID_ANULADO = 'N' AND OD.BODE_COD = :BODEGA
      INTO :ORDENADO;
    if (ORDENADO IS NULL) then
        ORDENADO = 0;
    ORDENC = 0;
    FOR SELECT O.ORDC_ID, OCDE_ITEM, OCDE_CANT * OCDE_FACTOR
        FROM ORDENES_COMPRA O, ORDENES_COMPRA_DETALLE OD
        WHERE O.ORDC_ID = OD.ORDC_ID AND OD.ARTI_COD = :ARTICULO AND (ORDC_FECHA+ORDC_VALIDEZ) >= :FECHA AND ORDC_FECHA <= :FECHA AND OCDE_ANULADO = 'N' AND OD.BODE_COD = :BODEGA
        INTO :ID, :ITEM, :CANT
        do
        BEGIN
        EXECUTE PROCEDURE FALTANTE(23, 21, ID, ITEM) returning_values (PEDIDO, UND, FACTOR2);
        if (PEDIDO * FACTOR2 = CANT) then /* SI NO SE HA FACTURADO MIRE A VER SI SE REMISIONO */
            EXECUTE PROCEDURE FALTANTE(23, 22, ID, ITEM) returning_values (PEDIDO, UND, FACTOR2);
        if (PEDIDO IS NULL) then
            PEDIDO = 0;
        ORDENC = ORDENC + PEDIDO * FACTOR2;
        END
    ORDENADO = ORDENADO + ORDENC;
    if (FACTOR <> 0) then
        ORDENADO = ORDENADO / FACTOR;
    SELECT SUM(RSDE_LIBERAR)
      FROM RESERVAS_DETALLE RD, RESERVAS R
      WHERE R.RESE_ID = RD.RESE_ID AND ARTI_COD = :ARTICULO AND RESE_FECHA <= :FECHA AND RESE_VENCE >= :FECHA AND RD.BODE_COD = :BODEGA AND RSDE_ANULADO = 'N'
      INTO :RESERVADO;
    if (RESERVADO IS NULL) then
        RESERVADO = 0;
    PEDIDO = 0;
    FOR SELECT P.PEDI_ID, PEDE_ITEM, PEDE_CANT * PEDE_FACTOR
        FROM PEDIDOS P, PEDIDOS_DETALLE PD
        WHERE P.PEDI_ID = PD.PEDI_ID AND PD.ARTI_COD = :ARTICULO AND (PEDI_FECHA+PEDI_VALIDEZ) >= :FECHA AND PEDI_FECHA <= :FECHA AND PEDE_ANULADO = 'N' AND BODE_COD = :BODEGA
        INTO :ID, :ITEM, :CANT
        do
        BEGIN
        EXECUTE PROCEDURE FALTANTE(34, 31, ID, ITEM) returning_values (ORDENC, UND, FACTOR2);
        EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION', 'FACTURAS', 'GENERAR PEDIDO AUTOMATICAMENTE CON LA FACTURA') returning_values (pedauto);
        if ((ORDENC * FACTOR2 = CANT) or (PEDAUTO = 'SI')) then /* SI NO SE HA FACTURADO MIRE A VER SI SE REMISIONO */
            EXECUTE PROCEDURE FALTANTE(34, 32, ID, ITEM) returning_values (ORDENC, UND, FACTOR2);
        if (ORDENC IS NULL) then
            ORDENC = 0;
        PEDIDO = PEDIDO + ORDENC * FACTOR2;
        END
    RESERVADO = RESERVADO + PEDIDO;
    if (FACTOR <> 0) then
        RESERVADO = RESERVADO / FACTOR;
    /* VENTAS MES */
    FECHAAUX = CAST (FECHA AS VARCHAR(10));
    FECHAAUX = SUBSTR(FECHAAUX, 1, 7) || '/01';
    FECINI = CAST (FECHAAUX AS DATE);
    EXECUTE PROCEDURE ventas_articulo (:ARTICULO, :FECINI, :FECHA, :agencia) returning_values (:ventames, :mfac, :devmes, :mdev, :ivaf, :ivad);
    ventames = ventames - devmes;
    if (FACTOR <> 0) then
        ventames = ventames / FACTOR;
    /* FECHA COMPRA */
    fechacmp = null;
    cantcmp = 0;
    SELECT FIRST 1 FACO_FECHA, FCDE_CANT * FCDE_FACTOR FROM FACTURAS_COMPRA F, FACTURAS_COMPRAS_DETALLE D
        WHERE F.FACO_ID = D.faco_id AND D.ARTI_COD = :articulo AND FACO_FECHA <= :FECHA AND D.bode_cod = :BODEGA
        ORDER BY FACO_FECHA DESC, F.FACO_ID DESC
        INTO :fechacmp, :cantcmp;
    SUSPEND;
    end
END

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE MAXIMO_ARTICULO(
    ARTICULO VARCHAR(15),
    FECHA DATE,
    BODEGA CHAR(2),
    CANT NUMERIC(18,2))
RETURNS (
    EXCESO NUMERIC(18,2))
AS
declare variable DIAS CHAR(2);
declare variable PROMEDIO NUMERIC(18,4);
declare variable SALIDAS NUMERIC(18,4);
declare variable MAXIMO NUMERIC(18,4);
declare variable SALDO NUMERIC(18,4);
BEGIN
  /* CUANDO CONFIGURACION MINIMO EN DIAS */
  EXECUTE PROCEDURE LEE_CONFIGURACION ('INVENTARIO', 'EXISTENCIAS', 'MAXIMO INVENTARIO EN DIAS') returning_values (DIAS);
  if (DIAS = 'SI') then
    BEGIN
    EXECUTE PROCEDURE PROMEDIO_SALIDAS_ARTICULO(:ARTICULO, :FECHA, :BODEGA) returning_values (:PROMEDIO, :SALIDAS);
    SELECT ARTI_MAX * :PROMEDIO FROM ARTICULO WHERE ARTI_COD = :ARTICULO INTO :MAXIMO;
    end
  ELSE
    BEGIN
    SELECT ARTI_MAX FROM ARTICULO WHERE ARTI_COD = :ARTICULO INTO :MAXIMO;
    END
  if (MAXIMO IS NULL) then
    MAXIMO = 0;
  EXECUTE PROCEDURE SALDO_INVENTARIO(:ARTICULO, :BODEGA, :FECHA) returning_values (SALDO);
  if (SALDO+CANT > maximo) then
    EXCESO = MAXIMO - (SALDO+CANT);
  ELSE
    EXCESO = 0;
  SUSPEND;
END

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE MINIMO_ARTICULO(
    ARTICULO VARCHAR(15),
    FECHA DATE,
    BODEGA CHAR(2))
RETURNS (
    MINIMO NUMERIC(18,4))
AS
declare variable DIAS CHAR(2);
declare variable PROMEDIO NUMERIC(18,4);
declare variable SALIDAS NUMERIC(18,4);
BEGIN
  /* CUANDO CONFIGURACION MINIMO EN DIAS */
  EXECUTE PROCEDURE LEE_CONFIGURACION ('INVENTARIO', 'EXISTENCIAS', 'MINIMO INVENTARIO EN DIAS') returning_values (DIAS);
  if (DIAS = 'SI') then
    BEGIN
    EXECUTE PROCEDURE PROMEDIO_SALIDAS_ARTICULO(:ARTICULO, :FECHA, :BODEGA) returning_values (:PROMEDIO, :SALIDAS);
    SELECT ARTI_DIAS * :PROMEDIO FROM ARTICULO WHERE ARTI_COD = :ARTICULO INTO :MINIMO;
    end
  ELSE
    BEGIN
    SELECT ARTI_MIN FROM ARTICULO WHERE ARTI_COD = :ARTICULO INTO :MINIMO;
    END
  if (MINIMO IS NULL) then
    MINIMO = 0;
  SUSPEND;
END

^

SET TERM ; ^

SET TERM ^ ;

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

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE ORDEN_SUGERIDA(
    PROVEEDOR VARCHAR(20),
    FECHA DATE)
RETURNS (
    ARTICULO VARCHAR(15),
    BODEGA VARCHAR(2),
    CANT NUMERIC(18,4),
    UNIDAD VARCHAR(8),
    COSTO NUMERIC(18,2))
AS
declare variable FACTOR NUMERIC(15,4);
declare variable DIAS INTEGER;
declare variable EXISTENCIA NUMERIC(18,4);
declare variable PROMEDIO NUMERIC(18,4);
declare variable AGENCIA INTEGER;
declare variable DIA_ART VARCHAR(2) CHARACTER SET NONE;
declare variable DIASC VARCHAR(255);
declare variable SALIDAS NUMERIC(18,4);
BEGIN
FOR SELECT a.ARTI_COD, PVAR_COSTO, ARTI_UNIDAD, ARTI_DIAS FROM proveedor_articulo p, articulo a
    WHERE p.arti_cod = a.arti_cod and TERC_NIT = :proveedor order by a.arti_des
    INTO :articulo, :costo, :unidad, :DIAS
  DO BEGIN
  for select bode_cod, SUCU_ID from bodega into :bodega, :agencia
    do
    begin
    execute procedure saldo_inventario (:articulo, :bodega, :fecha) returning_values (:Existencia);
    EXECUTE PROCEDURE FACTOR_UNIDAD_CANT(:ARTICULO, :UNIDAD) returning_values (:FACTOR);
    if (FACTOR <> 0) then
        EXISTENCIA = EXISTENCIA / FACTOR;
    else
        EXISTENCIA = 0;
    EXECUTE PROCEDURE promedio_salidas_articulo (:ARTICULO, :FECHA, :BODEGA) returning_values (:PROMEDIO, :SALIDAS);
    EXECUTE PROCEDURE lee_configuracion ('INVENTARIO', 'EXISTENCIAS', 'PROMEDIAR LAS SALIDAS DEL INVENTARIO CON EL NUMERO DE DIAS ASIGNADO A CADA ARTICULO') returning_values (:DIA_ART);
    if (DIA_ART = 'NO') then
        BEGIN
        EXECUTE PROCEDURE lee_configuracion ('INVENTARIO', 'EXISTENCIAS', 'NUMERO DE DIAS PARA PROMEDIO DE SALIDAS POR ARTICULO') returning_values (DIASC);
        DIAS = CAST(DIASC AS INTEGER);
        END
    if (DIAS is null) then
        DIAS = 0;
    PROMEDIO = DIAS * PROMEDIO;
    if (FACTOR <> 0) then
        PROMEDIO = PROMEDIO / FACTOR;
    CANT = PROMEDIO - EXISTENCIA;
    if (CANT > 0) then
        SUSPEND;
    end
  END
END

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE ORDEN_SUGERIDA_BOD(
    PROVEEDOR VARCHAR(20),
    BODEGA VARCHAR(2),
    FECHA DATE)
RETURNS (
    ARTICULO VARCHAR(15),
    CANT NUMERIC(18,4),
    UNIDAD VARCHAR(8),
    COSTO NUMERIC(18,2))
AS
declare variable FACTOR NUMERIC(15,4);
declare variable DIAS INTEGER;
declare variable EXISTENCIA NUMERIC(18,4);
declare variable PROMEDIO NUMERIC(18,4);
declare variable DIA_ART VARCHAR(2) CHARACTER SET NONE;
declare variable DIASC VARCHAR(255);
declare variable SALIDAS NUMERIC(18,4);
BEGIN
EXECUTE PROCEDURE lee_configuracion ('INVENTARIO', 'EXISTENCIAS', 'PROMEDIAR LAS SALIDAS DEL INVENTARIO CON EL NUMERO DE DIAS ASIGNADO A CADA ARTICULO') returning_values (:DIA_ART);
EXECUTE PROCEDURE lee_configuracion ('INVENTARIO', 'EXISTENCIAS', 'NUMERO DE DIAS PARA PROMEDIO DE SALIDAS POR ARTICULO') returning_values (DIASC);
FOR SELECT a.ARTI_COD, PVAR_COSTO, ARTI_UNIDAD, ARTI_DIAS
    FROM proveedor_articulo p, articulo a
    WHERE TERC_NIT = :proveedor and p.arti_cod = a.arti_cod
    INTO :articulo, :costo, :unidad, :DIAS
    DO
    begin
    execute procedure saldo_inventario (:articulo, :bodega, :fecha) returning_values (:Existencia);
    EXECUTE PROCEDURE FACTOR_UNIDAD_CANT(:ARTICULO, :UNIDAD) returning_values (:FACTOR);
    if (FACTOR <> 0) then
        EXISTENCIA = EXISTENCIA / FACTOR;
    else
        EXISTENCIA = 0;
    EXECUTE PROCEDURE promedio_salidas_articulo (:ARTICULO, :FECHA, :BODEGA) returning_values (:PROMEDIO, :SALIDAS);
    if (DIA_ART = 'NO') then
        BEGIN
        DIAS = CAST(DIASC AS INTEGER);
        END
    if (DIAS is null) then
        DIAS = 0;
    PROMEDIO = DIAS * PROMEDIO;
    if (FACTOR <> 0) then
        PROMEDIO = PROMEDIO / FACTOR;
    CANT = PROMEDIO - EXISTENCIA;
    if (CANT > 0) then
        SUSPEND;
    end
END

^

SET TERM ; ^

SET TERM ^ ;

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

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

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

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE EXISTENCIAS_MINYMAX(
    FECHA DATE,
    ARTINI VARCHAR(20),
    ARTFIN VARCHAR(20),
    GRPINI VARCHAR(2),
    GRPFIN VARCHAR(2),
    ORDEN CHAR(1),
    CEROS CHAR(1))
RETURNS (
    CODIGO VARCHAR(15),
    NOMBRE VARCHAR(60),
    UNIDAD VARCHAR(8),
    CODGRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    CODSUBG VARCHAR(3),
    NOMSUBG VARCHAR(30),
    CODMARC VARCHAR(3),
    NOMMARC VARCHAR(30),
    CODBOD VARCHAR(2),
    NOMBOD VARCHAR(30),
    CANT NUMERIC(18,4),
    MINIMO NUMERIC(18,4),
    MAXIMO NUMERIC(18,4),
    FALTANTE NUMERIC(18,4),
    EXCEDENTE NUMERIC(18,4))
AS
declare variable CODINI VARCHAR(20);
declare variable CODFIN VARCHAR(20);
declare variable DESINI VARCHAR(20);
declare variable DESFIN VARCHAR(20);
declare variable MAXDIA VARCHAR(2);
declare variable DISPONIBILIDAD integer;
declare variable PROMEDIO numeric(18,4);
declare variable SALIDAS numeric(18,4);
BEGIN
if (ORDEN = 'C') then
    BEGIN
    CODINI = ARTINI;
    CODFIN = ARTFIN;
    DESINI = '';
    DESFIN = 'zz';
    END
ELSE
    BEGIN
    DESINI = ARTINI;
    DESFIN = ARTFIN;
    CODINI = '';
    CODFIN = 'zz';
    END
execute procedure lee_configuracion ('INVENTARIO', 'EXISTENCIAS', 'MAXIMO INVENTARIO EN DIAS') returning_values (:maxdia);

FOR SELECT ARTI_COD, ARTI_DES, ARTI_UNIDAD, A.GRUP_COD, A.SUBG_COD, A.MARC_COD, BODE_COD, BODE_NOM, ARTI_MIN, ARTI_MAX
      FROM ARTICULO A, BODEGA B
      WHERE ARTI_COD >= :CODINI AND ARTI_COD <= :CODFIN AND A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :GRPFIN AND
        ARTI_DES >= :DESINI AND ARTI_DES <= :DESFIN AND BODE_ACTIVA = 'S'
      ORDER BY ARTI_COD, BODE_COD
      INTO :CODIGO, :NOMBRE, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :CODBOD, :NOMBOD, :MINIMO, :MAXIMO
      DO
        BEGIN
        SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
        SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
        SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;

        if (maxdia = 'SI') then
            begin
            EXECUTE PROCEDURE DISPONIBILIDAD_ARTICULO(CODIGO, FECHA, :CODBOD) returning_values (:DISPONIBILIDAD, :CANT, :PROMEDIO, :SALIDAS);
            if ((DISPONIBILIDAD < minimo) and (PROMEDIO > 0)) then
                FALTANTE = (minimo * PROMEDIO) - cant;
            ELSE
                FALTANTE = 0;
            if ((DISPONIBILIDAD > maximo) and (PROMEDIO > 0)) then
                excedente = cant - (MAXIMO * PROMEDIO);
            ELSE
                EXCEDENTE = 0;
            if ((CEROS = 'S') or (FALTANTE <> 0) or (excedente <> 0))  then
                SUSPEND;
            end
        else
            begin
            EXECUTE PROCEDURE SALDO_INVENTARIO(CODIGO, :CODBOD, FECHA) returning_values (CANT);
            if (CANT < MINIMO) then
                FALTANTE = MINIMO - CANT;
            if (CANT > maximo) then
                excedente =  CANT - maximo;
            if ((CEROS = 'S') or (FALTANTE <> 0) or (excedente <> 0))  then
                SUSPEND;
            end
        END
END

^

SET TERM ; ^

SET TERM ^ ;

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

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

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE REP_DISPONIBILIDAD(
    FECHA DATE,
    ARTINI VARCHAR(20),
    ARTFIN VARCHAR(20),
    GRPINI VARCHAR(3),
    GRPFIN VARCHAR(3),
    ORDEN CHAR(1),
    CEROS CHAR(1),
    DETALLE CHAR(1),
    AGRUPA CHAR(1),
    SUCURSAL INTEGER)
RETURNS (
    CODIGO VARCHAR(15),
    NOMBRE VARCHAR(60),
    UNIDAD VARCHAR(8),
    CODGRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    CODSUBG VARCHAR(3),
    NOMSUBG VARCHAR(30),
    CODMARC VARCHAR(3),
    NOMMARC VARCHAR(30),
    CODBOD VARCHAR(2),
    NOMBOD VARCHAR(30),
    EXIST NUMERIC(18,4),
    PROMEDIO NUMERIC(18,4),
    SALIDAS NUMERIC(18,4),
    DISPONIBILIDAD INTEGER,
    DIAS INTEGER,
    PROMEDIADO INTEGER,
    COSTO NUMERIC(18,2),
    COSTOPRO NUMERIC(18,2),
    SUGERIDO NUMERIC(18,4),
    FECCOMPRA DATE)
AS
DECLARE VARIABLE CODINI VARCHAR(20);
DECLARE VARIABLE CODFIN VARCHAR(20);
DECLARE VARIABLE DESINI VARCHAR(20);
DECLARE VARIABLE DESFIN VARCHAR(20);
DECLARE VARIABLE MARINI VARCHAR(20);
DECLARE VARIABLE MARFIN VARCHAR(20);
declare variable DIASC VARCHAR(255);
declare variable DIA_ART VARCHAR(2) CHARACTER SET NONE;
declare variable PORART VARCHAR(8);
declare variable MAXDIA VARCHAR(2);
BEGIN
if (ORDEN = 'C') then
    BEGIN
    CODINI = ARTINI;
    CODFIN = ARTFIN;
    DESINI = '';
    DESFIN = 'zz';
    END
ELSE
    BEGIN
    DESINI = ARTINI;
    DESFIN = ARTFIN;
    CODINI = '';
    CODFIN = 'zz';
    END
if (AGRUPA = 'G') then
    BEGIN
    MARINI = '';
    MARFIN = 'zz';
    END
ELSE
    if (AGRUPA = 'M') then
        BEGIN
        MARINI = GRPINI;
        MARFIN = GRPFIN;
        GRPINI = '';
        GRPFIN = 'zz';
        END
EXECUTE PROCEDURE lee_configuracion ('INVENTARIO', 'EXISTENCIAS', 'PROMEDIAR LAS SALIDAS DEL INVENTARIO CON EL NUMERO DE DIAS ASIGNADO A CADA ARTICULO') returning_values (:DIA_ART);
EXECUTE PROCEDURE lee_configuracion ('INVENTARIO', 'EXISTENCIAS', 'NUMERO DE DIAS PARA PROMEDIO DE SALIDAS POR ARTICULO') returning_values (DIASC);
execute procedure lee_configuracion ('INVENTARIO', 'EXISTENCIAS', 'MAXIMO Y MINIMO POR STAND O POR ARTICULO') returning_values (:porart);
execute procedure lee_configuracion ('INVENTARIO', 'EXISTENCIAS', 'MAXIMO INVENTARIO EN DIAS') returning_values (:maxdia);
if (DETALLE = 'S') then
  BEGIN
  FOR SELECT ARTI_COD, ARTI_DES, ARTI_UNIDAD, ARTI_DIAS, A.GRUP_COD, GRUP_NOM, A.SUBG_COD, A.MARC_COD, BODE_COD, BODE_NOM, ARTI_DIANALIS
      FROM ARTICULO A, GRUPO G, BODEGA B
      WHERE ARTI_COD >= :CODINI AND ARTI_COD <= :CODFIN AND A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :GRPFIN AND ARTI_DES >= :DESINI AND ARTI_DES <= :DESFIN AND
      G.GRUP_COD = A.GRUP_COD AND A.ESAR_COD <> 'I' AND ((SUCU_ID = :SUCURSAL) or (:SUCURSAL = 0)) AND
      (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN)))
      INTO :CODIGO, :NOMBRE, :UNIDAD, :DIAS, :CODGRUPO, :NOMGRUPO, :CODSUBG, :CODMARC, :CODBOD, :NOMBOD, :PROMEDIADO
      DO
        BEGIN
        NOMMARC = '';
        NOMSUBG = '';
        SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO :NOMMARC;
        SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
        EXECUTE PROCEDURE costo_promedio_y_ultimo(:CODIGO, :FECHA) RETURNING_VALUES (:costopro, :COSTO);
        EXECUTE PROCEDURE DISPONIBILIDAD_ARTICULO(CODIGO, FECHA, :CODBOD) returning_values (:DISPONIBILIDAD, :EXIST, :PROMEDIO, :SALIDAS);
        if ((PORART = 'STAND') AND (MAXDIA = 'SI')) then
            BEGIN
            DIAS = 0;
            SELECT STAND_MIN FROM STANDS WHERE ARTI_COD = :CODIGO AND STAND_BODEGA = :codbod INTO :dias;
            END
        /*ESTABLECER CUAL ES EL VALOR DE DIAS PARA PROMEDIO*/
        if (DIA_ART = 'NO') then
          BEGIN
            PROMEDIADO = CAST(DIASC AS INTEGER);
          END
        if ((DISPONIBILIDAD < DIAS) and (PROMEDIO > 0))then
            SUGERIDO = (DIAS * PROMEDIO) - EXIST;
        ELSE
            SUGERIDO = 0;
        SELECT MAX(FACO_FECHA) FROM FACTURAS_COMPRA F, FACTURAS_COMPRAS_DETALLE D
            WHERE F.FACO_ID = D.faco_id AND D.ARTI_COD = :CODIGO AND FACO_FECHA <= :FECHA AND D.bode_cod = :codbod
            INTO :FECCOMPRA;
        if ((PROMEDIO > 0) or (EXIST <> 0) or (CEROS = 'S')) then
            SUSPEND;
        END
  END
ELSE
  BEGIN
  FOR SELECT ARTI_COD, ARTI_DES, ARTI_UNIDAD, ARTI_DIAS, A.GRUP_COD, GRUP_NOM, A.SUBG_COD, A.MARC_COD, ARTI_DIANALIS
      FROM ARTICULO A, GRUPO G
      WHERE ARTI_COD >= :CODINI AND ARTI_COD <= :CODFIN AND A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :GRPFIN AND ARTI_DES >= :DESINI AND ARTI_DES <= :DESFIN AND G.GRUP_COD = A.GRUP_COD AND
      A.ESAR_COD <> 'I' AND (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN)))
      INTO :CODIGO, :NOMBRE, :UNIDAD, :DIAS, :CODGRUPO, :NOMGRUPO, :CODSUBG, :CODMARC, :PROMEDIADO
      DO
        BEGIN
        NOMMARC = '';
        NOMSUBG = '';
        SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO :NOMMARC;
        SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
        EXECUTE PROCEDURE costo_promedio_y_ultimo(:CODIGO, :FECHA) RETURNING_VALUES (:costopro, :COSTO);
        EXECUTE PROCEDURE DISPONIBILIDAD_TOTAL_ARTICULO(CODIGO, FECHA) returning_values (:DISPONIBILIDAD, :EXIST, :PROMEDIO, :SALIDAS);
        if ((PORART = 'STAND') AND (MAXDIA = 'SI')) then
            BEGIN
            DIAS = 0;
            SELECT STAND_MIN FROM STANDS WHERE ARTI_COD = :CODIGO AND STAND_BODEGA = :codbod INTO :dias;
            END
        /*ESTABLECER CUAL ES EL VALOR DE DIAS PARA PROMEDIO*/
        if (DIA_ART = 'NO') then
          BEGIN
            PROMEDIADO = CAST(DIASC AS INTEGER);
          END
        if ((DISPONIBILIDAD < DIAS) and (PROMEDIO > 0))then
            SUGERIDO = (DIAS * PROMEDIO) - EXIST;
        ELSE
            SUGERIDO = 0;
        SELECT MAX(FACO_FECHA) FROM FACTURAS_COMPRA F, FACTURAS_COMPRAS_DETALLE D
            WHERE F.FACO_ID = D.faco_id AND D.ARTI_COD = :CODIGO AND FACO_FECHA <= :FECHA
            INTO :FECCOMPRA;
        if ((PROMEDIO > 0) or (EXIST <> 0) or (CEROS = 'S')) then
            SUSPEND;
        END
  END
END

^

SET TERM ; ^



/* 20091215 */

UPDATE CONFIGURACION
SET CONF_POSIBLES = 'SI,NO,GRUPO,MARCA,GRUPO-MARCA',
    CONF_AYUDA = 'SI: El sistema sugerirá automáticamente el código de cada nuevo artículo de acuerdo al consecutivo interno, NO: El usuario digitará el código'
WHERE (CONF_MODULO = 'INVENTARIO') AND (CONF_CATEGORIA = 'ARTICULOS') AND (CONF_PROPIEDAD = 'CODIFICAR CON NUMERACION CONSECUTIVA');

INSERT INTO CONFIGURACION (CONF_MODULO, CONF_CATEGORIA, CONF_PROPIEDAD, CONF_VALOR, CONF_POSIBLES, CONF_AYUDA) VALUES ('INVENTARIO', 'ARTICULOS', 'NUMERO DE CARACTERES DEL CODIGO CONSECUTIVO AUTOMATICO', '4', '2,3,4,5,6', 'Indique el número de digitos o caracteres que tendrá la parte automática del código del artículo');
commit work;

/* 20091215B */
DELETE FROM IMPORTACION_INVENTARIO WHERE IMIN_TIPO = 19;

INSERT INTO IMPORTACION_INVENTARIO (IMIN_TIPO, IMIN_DATO, IMIN_COLUMNA, IMIN_ANCHO) VALUES (19, 'PREF_PRE', 1, 4);
INSERT INTO IMPORTACION_INVENTARIO (IMIN_TIPO, IMIN_DATO, IMIN_COLUMNA, IMIN_ANCHO) VALUES (19, 'FACT_NUMERO', 2, 6);
INSERT INTO IMPORTACION_INVENTARIO (IMIN_TIPO, IMIN_DATO, IMIN_COLUMNA, IMIN_ANCHO) VALUES (19, 'FACT_VENCE', 3, 10);
INSERT INTO IMPORTACION_INVENTARIO (IMIN_TIPO, IMIN_DATO, IMIN_COLUMNA, IMIN_ANCHO) VALUES (19, 'FACT_FECHA', 3, 10);
INSERT INTO IMPORTACION_INVENTARIO (IMIN_TIPO, IMIN_DATO, IMIN_COLUMNA, IMIN_ANCHO) VALUES (19, 'VEND_COD', 4, 4);
INSERT INTO IMPORTACION_INVENTARIO (IMIN_TIPO, IMIN_DATO, IMIN_COLUMNA, IMIN_ANCHO) VALUES (19, 'PTVT_ID', 5, 3);
INSERT INTO IMPORTACION_INVENTARIO (IMIN_TIPO, IMIN_DATO, IMIN_COLUMNA, IMIN_ANCHO) VALUES (19, 'TERC_NIT', 6, 15);
INSERT INTO IMPORTACION_INVENTARIO (IMIN_TIPO, IMIN_DATO, IMIN_COLUMNA, IMIN_ANCHO) VALUES (19, 'ARTI_COD', 7, 255);
INSERT INTO IMPORTACION_INVENTARIO (IMIN_TIPO, IMIN_DATO, IMIN_COLUMNA, IMIN_ANCHO) VALUES (19, 'FADE_CANT', 8, 9);
INSERT INTO IMPORTACION_INVENTARIO (IMIN_TIPO, IMIN_DATO, IMIN_COLUMNA, IMIN_ANCHO) VALUES (19, 'FADE_UNIDAD', 9, 15);
INSERT INTO IMPORTACION_INVENTARIO (IMIN_TIPO, IMIN_DATO, IMIN_COLUMNA, IMIN_ANCHO) VALUES (19, 'FADE_PRUNIT', 10, 15);
INSERT INTO IMPORTACION_INVENTARIO (IMIN_TIPO, IMIN_DATO, IMIN_COLUMNA, IMIN_ANCHO) VALUES (19, 'FADE_DTOPORC', 11, 9);
INSERT INTO IMPORTACION_INVENTARIO (IMIN_TIPO, IMIN_DATO, IMIN_COLUMNA, IMIN_ANCHO) VALUES (19, 'FACT_NOMCLIENTE', 12, 60);
INSERT INTO IMPORTACION_INVENTARIO (IMIN_TIPO, IMIN_DATO, IMIN_COLUMNA, IMIN_ANCHO) VALUES (19, 'FACT_SUCURSAL', 13, 10);
INSERT INTO IMPORTACION_INVENTARIO (IMIN_TIPO, IMIN_DATO, IMIN_COLUMNA, IMIN_ANCHO) VALUES (19, 'FACT_REMISION', 14, 30);
INSERT INTO IMPORTACION_INVENTARIO (IMIN_TIPO, IMIN_DATO, IMIN_COLUMNA, IMIN_ANCHO) VALUES (19, 'FACT_PEDIDO', 15, 30);
INSERT INTO IMPORTACION_INVENTARIO (IMIN_TIPO, IMIN_DATO, IMIN_COLUMNA, IMIN_ANCHO) VALUES (19, 'FACT_COTIZACI', 16, 30);
INSERT INTO IMPORTACION_INVENTARIO (IMIN_TIPO, IMIN_DATO, IMIN_COLUMNA, IMIN_ANCHO) VALUES (19, 'FACT_RTFTEMONTO', 17, 15);
INSERT INTO IMPORTACION_INVENTARIO (IMIN_TIPO, IMIN_DATO, IMIN_COLUMNA, IMIN_ANCHO) VALUES (19, 'FACT_RTIVAMONTO', 18, 15);
INSERT INTO IMPORTACION_INVENTARIO (IMIN_TIPO, IMIN_DATO, IMIN_COLUMNA, IMIN_ANCHO) VALUES (19, 'FACT_RTICAMONTO', 19, 15);
INSERT INTO IMPORTACION_INVENTARIO (IMIN_TIPO, IMIN_DATO, IMIN_COLUMNA, IMIN_ANCHO) VALUES (19, 'FACT_DTOMONTO', 20, 15);
INSERT INTO IMPORTACION_INVENTARIO (IMIN_TIPO, IMIN_DATO, IMIN_COLUMNA, IMIN_ANCHO) VALUES (19, 'FACT_ADICIONAL', 21, 15);
INSERT INTO IMPORTACION_INVENTARIO (IMIN_TIPO, IMIN_DATO, IMIN_COLUMNA, IMIN_ANCHO) VALUES (19, 'FACT_EXTRA', 22, 15);
INSERT INTO IMPORTACION_INVENTARIO (IMIN_TIPO, IMIN_DATO, IMIN_COLUMNA, IMIN_ANCHO) VALUES (19, 'FACT_DTOFMONTO', 23, 15);
INSERT INTO IMPORTACION_INVENTARIO (IMIN_TIPO, IMIN_DATO, IMIN_COLUMNA, IMIN_ANCHO) VALUES (19, 'FACT_DTOFFECHA', 24, 15);
COMMIT WORK;

/* 20091215C */

/* al llamar dos veces un documento credito no se dispara la validación por ser cero mayor que el negativo */

SET TERM ^ ;

CREATE OR ALTER TRIGGER RECIBOS_CAJA_DETALLE_AI FOR RECIBOS_CAJA_DETALLE
ACTIVE AFTER INSERT POSITION 0
AS
declare variable EXISTE CHAR(1);
declare variable FEC DATE;
declare variable NIT VARCHAR(20);
declare variable CONCEPTO VARCHAR(60);
declare variable PREFIJO VARCHAR(4);
declare variable NUMERO VARCHAR(6);
declare variable SALDO NUMERIC(18,2);
declare variable RETES CHAR(2);
declare variable OK CHAR(1);
declare variable RCANTI INTEGER;
declare variable COBR INTEGER;
declare variable ACUMULA CHAR(8);
declare variable DIASMAX INTEGER;
declare variable FACTOR NUMERIC(9,4);
declare variable FACTORD NUMERIC(9,4);
declare variable DIAS INTEGER;
declare variable FECDOC DATE;
declare variable FECMIN DATE;
declare variable FECMINS VARCHAR(10);
declare variable TRM NUMERIC(18,2);
BEGIN
if ((NEW.RECA_ID <> 0) and (new.rcde_anulado = 'N')) then
    BEGIN
    /* Abone el documento referenciado */
    select PREF_PRE, RECA_NUMERO, RECA_fecha, RECA_CONC, TERC_NIT, COBR_COD, RECA_TRM from RECIBOS_CAJA
        where RECA_id = new.RECA_id into :PREFIJO, :NUMERO, :FEC, :CONCEPTO, :NIT, :COBR, :TRM;
    OK = 'N';
    if (new.RCDE_TIPODOC = 45) then
        BEGIN
        /* BUSQUE SI TIENE RECA_ID, SI NO LO ACTUALIZA */
        SELECT RECA_ID FROM ANTICIPOS_CLIENTE WHERE ANCL_ID = NEW.RCDE_IDDOC INTO :RCANTI;
        if (RCANTI = 0) then
            BEGIN
            OK = 'S';
            UPDATE ANTICIPOS_CLIENTE SET RECA_ID = NEW.RECA_ID WHERE ANCL_ID = NEW.RCDE_IDDOC;
            END
        END
    if (OK = 'N') then
        BEGIN
        /* valide que no se pase del saldo */
        execute procedure saldo_doc_cartera(new.rcde_tipodoc, new.rcde_iddoc, '9999/12/31', 0) returning_values(saldo);
        execute procedure lee_configuracion('CARTERA', 'SALDOS', 'DESCONTAR RETENCIONES POR CAUSACION') returning_values (RETES);
        if (SALDO = 0) then
          EXCEPTION DOCUMENTO_ABONO_MAYOR 'EL SALDO DEL DOCUMENTO ' || NEW.rcde_prefijo || NEW.rcde_numero || ' ES INSUFICIENTE.';
        else
          if (SALDO < 0) then
            BEGIN
            if (RETES = 'SI') then
                begin
                if (saldo > (NEW.rcde_abono + NEW.rcde_dtof)) then
                    EXCEPTION DOCUMENTO_ABONO_MAYOR 'EL SALDO DEL DOCUMENTO ' || NEW.rcde_prefijo || NEW.rcde_numero || ' ES INSUFICIENTE.';
                end
            ELSE
                begin
                if (saldo > (NEW.rcde_abono + NEW.rcde_rtfte + NEW.rcde_rtiva + NEW.rcde_rtica + NEW.rcde_dtof)) then
                    EXCEPTION DOCUMENTO_ABONO_MAYOR 'EL SALDO DEL DOCUMENTO ' || NEW.rcde_prefijo || NEW.rcde_numero || ' ES INSUFICIENTE.';
                end
            END
          else
            BEGIN
            if (RETES = 'SI') then
                begin
                if (saldo < (NEW.rcde_abono + NEW.rcde_dtof)) then
                    EXCEPTION DOCUMENTO_ABONO_MAYOR 'EL SALDO DEL DOCUMENTO ' || NEW.rcde_prefijo || NEW.rcde_numero || ' ES INSUFICIENTE.';
                end
            ELSE
                begin
                if (saldo < (NEW.rcde_abono + NEW.rcde_rtfte + NEW.rcde_rtiva + NEW.rcde_rtica + NEW.rcde_dtof)) then
                    EXCEPTION DOCUMENTO_ABONO_MAYOR 'EL SALDO DEL DOCUMENTO ' || NEW.rcde_prefijo || NEW.rcde_numero || ' ES INSUFICIENTE.';
                end
            END
        EXISTE = 'N';
        select 'S' from saldos_doc_cartera where sdca_tiporef = new.rcde_tipodoc and sdca_idref = new.rcde_iddoc and sdca_fecha = :FEC into :EXISTE;
        if (Existe = 'S') then
            begin
            /* actualice el saldo del dia */
            UPDATE saldos_doc_cartera
                SET SDCA_ABONO = SDCA_ABONO + NEW.rcde_abono + new.rcde_dtof,
                SDCA_ABRTFTE = SDCA_ABRTFTE + NEW.rcde_RTFTE,
                SDCA_ABRTIVA = SDCA_ABRTIVA + NEW.rcde_RTIVA,
                SDCA_ABRTICA = SDCA_ABRTICA + NEW.rcde_RTICA,
                SDCA_TRM = :TRM
                WHERE SDCA_TIPOREF = NEW.RCDE_TIPODOC AND SDCA_IDREF = NEW.rcde_IDDOC AND SDCA_FECHA = :FEC;
            END
        ELSE
            BEGIN
            /* Inserte un nuevo saldo diario */
            INSERT INTO SALDOS_DOC_CARTERA (SDCA_TIPOREF, SDCA_IDREF, SDCA_FECHA, TERC_NIT, SDCA_RTFTE, SDCA_RTIVA, SDCA_RTICA, SDCA_ABONO, SDCA_ABRTFTE, SDCA_ABRTIVA, SDCA_ABRTICA, SDCA_DEBITO, SDCA_MONTO, SDCA_TRM)
                VALUES (NEW.RCDE_TIPODOC, NEW.RCDE_IDDOC, :FEC, :NIT, 0, 0, 0, (NEW.rcde_abono+NEW.rcde_dtof), NEW.rcde_rtfte, NEW.rcde_rtiva, NEW.rcde_rtica, 'N', 0, :TRM);
            END
        END
    /* actualice el registro en mov_cliente (por si son varios items) */
    EXISTE = 'N';
    SELECT 'S' FROM MOVIMIENTO_CLIENTES WHERE MVCL_TIPOREF = 61 AND MVCL_IDREF = NEW.RECA_ID AND MVCL_SUCURSAL = NEW.rcde_sucursal INTO :EXISTE;
    if (EXISTE = 'S') then
        begin
        UPDATE movimiento_clientes
            SET MVCL_MONTO = MVCL_MONTO + NEW.rcde_abono + NEW.rcde_dtof,
                MVCL_RTEFTE = MVCL_RTEFTE + NEW.rcde_rtfte,
                MVCL_RTEIVA = MVCL_RTEIVA + NEW.rcde_rtiva,
                MVCL_RTEICA = MVCL_RTEICA + NEW.rcde_rtica,
                MVCL_TRM = :TRM
            WHERE MVCL_TIPOREF = 61 AND MVCL_IDREF = NEW.RECA_ID AND MVCL_SUCURSAL = NEW.rcde_sucursal;
        end
    ELSE
        INSERT INTO MOVIMIENTO_CLIENTES (MVCL_ID, TERC_NIT, MVCL_TIPOREF, MVCL_IDREF, MVCL_FECHA, MVCL_VENCE, MVCL_CONC, MVCL_MONTO, MVCL_RTEFTE, MVCL_RTEIVA, MVCL_RTEICA, MVCL_DEBITO, MVCL_ABONO, MVCL_PREFREF, MVCL_NUMREF, MVCL_SUCURSAL, COBR_COD, MVCL_TRM)
            VALUES (GEN_ID(ID_MOVCLI, 1), :NIT, 61, NEW.RECA_ID, :FEC, :FEC, :CONCEPTO, (NEW.RCDE_ABONO+NEW.RCDE_DTOF), NEW.RCDE_RTFTE, NEW.RCDE_RTIVA, NEW.RCDE_RTICA, 'N', 'S', :PREFIJO, :NUMERO, NEW.rcde_sucursal, :COBR, :TRM);

    /* acumule los puntos del vendedor */
    SELECT MVCL_FECHA FROM MOVIMIENTO_CLIENTES WHERE MVCL_TIPOREF = new.rcde_tipodoc AND MVCL_IDREF = new.rcde_iddoc
        INTO :FECDOC;
    if (FECDOC IS NOT NULL) then
        DIAS = FEC - FECDOC;
    else
        DIAS = 999;
    execute procedure lee_configuracion('FACTURACION', 'FACTURAS', 'ACUMULAR PUNTOS DE VENTAS POR VENDEDOR') returning_values (ACUMULA);
    execute procedure lee_configuracion('FACTURACION', 'FACTURAS', 'DIAS DE RECAUDO MAXIMO PARA ACUMULAR PUNTOS AL VENDEDOR') returning_values (DIASMAX);
    if ((acumula = 'SI') and (diasmax >= dias)) then
        begin
        SELECT COPU_FACTOR FROM comisiones_puntos WHERE COPU_COD = NEW.rcde_comip INTO :FACTOR;
        if ((NEW.rcde_tipodoc = 31) or (NEW.rcde_tipodoc = 41)) then
            begin
            /* recorra la factura acumulando los puntos */
            if (new.rcde_tipodoc = 31) then
                select (fact_total-fact_ivamonto)/fact_total from facturas where fact_id = new.rcde_iddoc into :factord;
            if (new.rcde_tipodoc = 41) then
                select ndcl_monto/(ndcl_monto+ndcl_ivamonto) from notas_debito_clientes where ndcl_id = new.rcde_iddoc into :factord;
            /* inserte el registro de puntos */
            insert into puntos_vendedor (vend_cod, ptvt_fecha, ptvt_tipodoc, ptvt_iddoc, ptvt_db, ptvt_cr)
                values (:cobr, :fec, new.rcde_tipodoc, new.rcde_iddoc, (new.rcde_abono*:factord*:factor), 0);
            end
        if ((new.rcde_tipodoc = 33) or (new.rcde_tipodoc = 42)) then
            begin
            if (new.rcde_tipodoc = 33) then
                select (devt_total-devt_ivamonto)/devt_total from devoluciones_ventas where devt_id = new.rcde_iddoc into :factord;
            if (new.rcde_tipodoc = 42) then
                select nccl_monto/(nccl_monto+nccl_ivamonto) from notas_credito_clientes where nccl_id = new.rcde_iddoc into :factord;
            /* inserte el registro de puntos */
            insert into puntos_vendedor (vend_cod, ptvt_fecha, ptvt_tipodoc, ptvt_iddoc, ptvt_db, ptvt_cr)
                values (:cobr, :fec, new.rcde_tipodoc, new.rcde_iddoc, 0, (new.rcde_abono*:factord*:factor));
            end

        execute procedure lee_configuracion('FACTURACION', 'FACTURAS', 'ACUMULAR PUNTOS POR VENTAS A CLIENTE REGULARES') returning_values (ACUMULA);
        execute procedure lee_configuracion('FACTURACION', 'FACTURAS', 'FECHA A PARTIR DE LA CUAL ACUMULAR PUNTOS A CLIENTES POR RECAUDO') returning_values (FECMINS);
        if (FECMINS <> '') then
            FECMIN = CAST(FECMINS AS DATE);
        else
            FECMIN = '2009/01/01';
        if ((acumula = 'RECAUDO') and (:fecdoc >= :fecmin)) then
            BEGIN
            SELECT COPU_FACTORCL FROM comisiones_puntos WHERE COPU_COD = NEW.rcde_comip INTO :FACTOR;
            if ((NEW.rcde_tipodoc = 31) or (NEW.rcde_tipodoc = 41)) then
                begin
                /* recorra la factura acumulando los puntos */
                if (new.rcde_tipodoc = 31) then
                    select (fact_total-fact_ivamonto)/fact_total from facturas where fact_id = new.rcde_iddoc into :factord;
                if (new.rcde_tipodoc = 41) then
                    select ndcl_monto/(ndcl_monto+ndcl_ivamonto) from notas_debito_clientes where ndcl_id = new.rcde_iddoc into :factord;
                /* inserte el registro de puntos */
                insert into puntos_cliente (ptcl_nit, ptcl_fecha, ptcl_tipodoc, ptcl_iddoc, ptcl_db, ptcl_cr)
                    values (:nit, :fec, new.rcde_tipodoc, new.rcde_iddoc, (new.rcde_abono*:factord*:factor/1000), 0);
                end
            if ((new.rcde_tipodoc = 33) or (new.rcde_tipodoc = 42)) then
                begin
                if (new.rcde_tipodoc = 33) then
                    select (devt_total-devt_ivamonto)/devt_total from devoluciones_ventas where devt_id = new.rcde_iddoc into :factord;
                if (new.rcde_tipodoc = 42) then
                    select nccl_monto/(nccl_monto+nccl_ivamonto) from notas_credito_clientes where nccl_id = new.rcde_iddoc into :factord;
                /* inserte el registro de puntos */
                insert into puntos_cliente (ptcl_nit, ptcl_fecha, ptcl_tipodoc, ptcl_iddoc, ptcl_db, ptcl_cr)
                    values (:nit, :fec, new.rcde_tipodoc, new.rcde_iddoc, 0, (new.rcde_abono*:factord*:factor/1000));
                end
            END
        end
    end
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER RECIBOS_CAJA_DETALLE_AU FOR RECIBOS_CAJA_DETALLE
ACTIVE AFTER UPDATE POSITION 0
AS
declare variable EXISTE CHAR(1);
declare variable FEC DATE;
declare variable NIT VARCHAR(20);
declare variable CONCEPTO VARCHAR(60);
declare variable PREFIJO VARCHAR(4);
declare variable NUMERO VARCHAR(6);
declare variable SALDO NUMERIC(18,2);
declare variable RETES char(2);
declare variable OK CHAR(1);
declare variable RCANTI INTEGER;
declare variable COBR INTEGER;
declare variable ACUMULA CHAR(8);
declare variable DIASMAX INTEGER;
declare variable FACTOR NUMERIC(9,4);
declare variable FACTORD NUMERIC(9,4);
declare variable DIAS INTEGER;
declare variable FECDOC DATE;
declare variable FECMIN DATE;
declare variable FECMINS VARCHAR(10);
declare variable TRM NUMERIC(18,2);
BEGIN
execute procedure lee_configuracion('FACTURACION', 'FACTURAS', 'ACUMULAR PUNTOS DE VENTAS POR VENDEDOR') returning_values (ACUMULA);
select PREF_PRE, RECA_NUMERO, reca_fecha, RECA_CONC, TERC_NIT, COBR_COD, RECA_TRM
    from recibos_caja where reca_id = new.reca_id
    into :PREFIJO, :NUMERO, :FEC, :CONCEPTO, :NIT, :COBR, :TRM;
/* Borre el viejo */
if ((old.RECA_ID <> 0) AND (OLD.rcde_anulado = 'N')) then
    BEGIN
    OK = 'N';
    if (OLD.RCDE_TIPODOC = 45) then
        BEGIN
        SELECT RECA_ID FROM ANTICIPOS_CLIENTE WHERE ANCL_ID = OLD.RCDE_IDDOC INTO :RCANTI;
        if (RCANTI = OLD.RECA_ID) then
            begin
            OK = 'S';
            if (NEW.rcde_anulado = 'N') then
                delete from anticipos_cliente where ANCL_ID = OLD.RCDE_IDDOC;
            else
                UPDATE anticipos_cliente SET ANCL_ANULADO = 'S' where ANCL_ID = OLD.RCDE_IDDOC;
            end
        END
    if (OK = 'N') then
        BEGIN
        UPDATE saldos_doc_cartera
            SET SDCA_ABONO = SDCA_ABONO - old.rcde_abono - OLD.RCDE_DTOF,
            SDCA_ABRTFTE = SDCA_ABRTFTE - old.rcde_RTFTE,
            SDCA_ABRTIVA = SDCA_ABRTIVA - old.rcde_RTIVA,
            SDCA_ABRTICA = SDCA_ABRTICA - old.rcde_RTICA
            WHERE SDCA_TIPOREF = old.RCDE_TIPODOC AND SDCA_IDREF = old.rcde_IDDOC AND SDCA_FECHA = :FEC;
        END
    UPDATE movimiento_clientes
        SET MVCL_MONTO = MVCL_MONTO - OLD.rcde_abono - OLD.RCDE_DTOF,
        MVCL_RTEFTE = MVCL_RTEFTE - OLD.rcde_rtfte,
        MVCL_RTEIVA = MVCL_RTEIVA - OLD.rcde_rtiva,
        MVCL_RTEICA = MVCL_RTEICA - OLD.rcde_rtica
        WHERE MVCL_TIPOREF = 61 AND MVCL_IDREF = OLD.RECA_ID;

    /* DESHAGA LOS PUNTOS DEL VENDEDOR */
    if (acumula = 'SI') then
        delete from puntos_vendedor where vend_cod = :cobr and ptvt_tipodoc = old.rcde_tipodoc and ptvt_iddoc = old.rcde_iddoc and ptvt_fecha = :fec;
    execute procedure lee_configuracion('FACTURACION', 'FACTURAS', 'ACUMULAR PUNTOS POR VENTAS A CLIENTE REGULARES') returning_values (ACUMULA);
    if (acumula = 'RECAUDO') then
        delete from puntos_cliente where PTCL_NIT = :nit and ptcl_tipodoc = old.rcde_tipodoc and ptcl_iddoc = old.rcde_iddoc and ptcl_fecha = :fec;
    END
if ((NEW.RECA_ID <> 0) and (NEW.rcde_anulado = 'N')) then
    BEGIN
    OK = 'N';
    if (new.RCDE_TIPODOC = 45) then
        BEGIN
        /* BUSQUE SI TIENE RECA_ID, SI NO LO ACTUALIZA */
        SELECT RECA_ID FROM ANTICIPOS_CLIENTE WHERE ANCL_ID = NEW.RCDE_IDDOC INTO :RCANTI;
        if (RCANTI = 0) then
            BEGIN
            OK = 'S';
            UPDATE ANTICIPOS_CLIENTE SET RECA_ID = NEW.RECA_ID WHERE ANCL_ID = NEW.RCDE_IDDOC;
            END
        END
    if (OK = 'N') then
        BEGIN
        /* valide que no se pase del saldo */
        execute procedure saldo_doc_cartera(new.rcde_tipodoc, new.rcde_iddoc, '9999/12/31', 0) returning_values(saldo);
        execute procedure lee_configuracion('CARTERA', 'SALDOS', 'DESCONTAR RETENCIONES POR CAUSACION') returning_values (RETES);
        if (SALDO = 0) then
            EXCEPTION DOCUMENTO_ABONO_MAYOR 'EL SALDO DEL DOCUMENTO ' || NEW.rcde_prefijo || NEW.rcde_numero || ' ES INSUFICIENTE.';
        else
          if (SALDO < 0) then
            BEGIN
            if (RETES = 'SI') then
                begin
                if (saldo > (NEW.rcde_abono + NEW.rcde_dtof)) then
                    EXCEPTION DOCUMENTO_ABONO_MAYOR 'EL SALDO DEL DOCUMENTO ' || NEW.rcde_prefijo || NEW.rcde_numero || ' ES INSUFICIENTE.';
                end
            ELSE
                begin
                if (saldo > (NEW.rcde_abono + NEW.rcde_rtfte + NEW.rcde_rtiva + NEW.rcde_rtica + NEW.rcde_dtof)) then
                    EXCEPTION DOCUMENTO_ABONO_MAYOR 'EL SALDO DEL DOCUMENTO ' || NEW.rcde_prefijo || NEW.rcde_numero || ' ES INSUFICIENTE.';
                end
            END
          else
            BEGIN
            if (RETES = 'SI') then
                begin
                if (saldo < (NEW.rcde_abono + NEW.rcde_dtof)) then
                    EXCEPTION DOCUMENTO_ABONO_MAYOR 'EL SALDO DEL DOCUMENTO ' || NEW.rcde_prefijo || NEW.rcde_numero || ' ES INSUFICIENTE.';
                end
            ELSE
                begin
                if (saldo < (NEW.rcde_abono + NEW.rcde_rtfte + NEW.rcde_rtiva + NEW.rcde_rtica + NEW.rcde_dtof)) then
                    EXCEPTION DOCUMENTO_ABONO_MAYOR 'EL SALDO DEL DOCUMENTO ' || NEW.rcde_prefijo || NEW.rcde_numero || ' ES INSUFICIENTE.';
                end
            END
        select 'S' from saldos_doc_cartera where sdca_tiporef = new.rcde_tipodoc and sdca_idref = new.rcde_iddoc and sdca_fecha = :FEC into :EXISTE;
        if (Existe = 'S') then
            /* actualice el saldo del dia */
            UPDATE saldos_doc_cartera
                SET SDCA_ABONO = SDCA_ABONO + NEW.rcde_abono + NEW.RCDE_DTOF,
                    SDCA_ABRTFTE = SDCA_ABRTFTE + NEW.rcde_RTFTE,
                    SDCA_ABRTIVA = SDCA_ABRTIVA + NEW.rcde_RTIVA,
                    SDCA_ABRTICA = SDCA_ABRTICA + NEW.rcde_RTICA,
                    SDCA_TRM = :TRM
                WHERE SDCA_TIPOREF = NEW.RCDE_TIPODOC AND SDCA_IDREF = NEW.rcde_IDDOC AND SDCA_FECHA = :FEC;
        ELSE
            /* Inserte un nuevo saldo diario */
            INSERT INTO SALDOS_DOC_CARTERA (SDCA_TIPOREF, SDCA_IDREF, SDCA_FECHA, TERC_NIT, SDCA_RTFTE, SDCA_RTIVA, SDCA_RTICA, SDCA_ABONO, SDCA_ABRTFTE, SDCA_ABRTIVA, SDCA_ABRTICA, SDCA_DEBITO, SDCA_MONTO, SDCA_TRM)
                VALUES (NEW.RCDE_TIPODOC, NEW.RCDE_IDDOC, :FEC, :NIT, 0, 0, 0, (NEW.rcde_abono+NEW.RCDE_DTOF), NEW.rcde_rtfte, NEW.rcde_rtiva, NEW.rcde_rtica, 'N', 0, :TRM);
        END /* OK = N */
    /* Registre o actualice el registro en movimiento_cliente */
    EXISTE = 'N';
    SELECT 'S' FROM MOVIMIENTO_CLIENTES WHERE MVCL_TIPOREF = 61 AND MVCL_IDREF = NEW.RECA_ID and mvcl_sucursal = new.rcde_sucursal INTO :EXISTE;
    if (EXISTE = 'S') then
        begin
        /* Actualice el nuevo */
        UPDATE movimiento_clientes
            SET MVCL_MONTO = MVCL_MONTO + NEW.rcde_abono + NEW.rcde_dtof,
                MVCL_RTEFTE = MVCL_RTEFTE + NEW.rcde_rtfte,
                MVCL_RTEIVA = MVCL_RTEIVA + NEW.rcde_rtiva,
                MVCL_RTEICA = MVCL_RTEICA + NEW.rcde_rtica,
                MVCL_TRM = :TRM
            WHERE MVCL_TIPOREF = 61 AND MVCL_IDREF = NEW.RECA_ID AND MVCL_SUCURSAL = NEW.rcde_sucursal;
        end
    ELSE
        INSERT INTO MOVIMIENTO_CLIENTES (MVCL_ID, TERC_NIT, MVCL_TIPOREF, MVCL_IDREF, MVCL_FECHA, MVCL_VENCE, MVCL_CONC, MVCL_MONTO, MVCL_RTEFTE, MVCL_RTEIVA, MVCL_RTEICA, MVCL_DEBITO, MVCL_ABONO, MVCL_PREFREF, MVCL_NUMREF, MVCL_SUCURSAL, COBR_COD, MVCL_TRM)
            VALUES (GEN_ID(ID_MOVCLI, 1), :NIT, 61, NEW.RECA_ID, :FEC, :FEC, :CONCEPTO, (NEW.RCDE_ABONO+NEW.RCDE_DTOF), NEW.RCDE_RTFTE, NEW.RCDE_RTIVA, NEW.RCDE_RTICA, 'N', 'S', :PREFIJO, :NUMERO, NEW.rcde_sucursal, :COBR, :TRM);

    /* acumule los puntos del vendedor */
    SELECT MVCL_FECHA FROM MOVIMIENTO_CLIENTES WHERE MVCL_TIPOREF = new.rcde_tipodoc AND MVCL_IDREF = new.rcde_iddoc
        INTO :FECDOC;
    if (FECDOC IS NOT NULL) then
        DIAS = FEC - FECDOC;
    else
        DIAS = 999;
    execute procedure lee_configuracion('FACTURACION', 'FACTURAS', 'DIAS DE RECAUDO MAXIMO PARA ACUMULAR PUNTOS AL VENDEDOR') returning_values (DIASMAX);
    if ((acumula = 'SI') and (diasmax >= dias)) then
        begin
        SELECT COPU_FACTOR FROM comisiones_puntos WHERE COPU_COD = NEW.rcde_comip INTO :FACTOR;
        if ((NEW.rcde_tipodoc = 31) or (NEW.rcde_tipodoc = 41)) then
            begin
            /* recorra la factura acumulando los puntos */
            if (new.rcde_tipodoc = 31) then
                select (fact_total-fact_ivamonto)/fact_total from facturas where fact_id = new.rcde_iddoc into :factord;
            if (new.rcde_tipodoc = 41) then
                select ndcl_monto/(ndcl_monto+ndcl_ivamonto) from notas_debito_clientes where ndcl_id = new.rcde_iddoc into :factord;
            /* inserte el registro de puntos */
            insert into puntos_vendedor (vend_cod, ptvt_fecha, ptvt_tipodoc, ptvt_iddoc, ptvt_db, ptvt_cr)
                values (:cobr, :fec, new.rcde_tipodoc, new.rcde_iddoc, (new.rcde_abono*:factord*:factor), 0);
            end
        if ((new.rcde_tipodoc = 33) or (new.rcde_tipodoc = 42)) then
            begin
            if (new.rcde_tipodoc = 33) then
                select (devt_total-devt_ivamonto)/devt_total from devoluciones_ventas where devt_id = new.rcde_iddoc into :factord;
            if (new.rcde_tipodoc = 42) then
                select nccl_monto/(nccl_monto+nccl_ivamonto) from notas_credito_clientes where nccl_id = new.rcde_iddoc into :factord;
            /* inserte el registro de puntos */
            insert into puntos_vendedor (vend_cod, ptvt_fecha, ptvt_tipodoc, ptvt_iddoc, ptvt_db, ptvt_cr)
                values (:cobr, :fec, new.rcde_tipodoc, new.rcde_iddoc, 0, (new.rcde_abono*:factord*:factor));
            end

        execute procedure lee_configuracion('FACTURACION', 'FACTURAS', 'ACUMULAR PUNTOS POR VENTAS A CLIENTE REGULARES') returning_values (ACUMULA);
        execute procedure lee_configuracion('FACTURACION', 'FACTURAS', 'FECHA A PARTIR DE LA CUAL ACUMULAR PUNTOS A CLIENTES POR RECAUDO') returning_values (FECMINS);
        if (FECMINS <> '') then
            FECMIN = CAST(FECMINS AS DATE);
        else
            FECMIN = '2009/01/01';
        if ((acumula = 'RECAUDO') and (:fecdoc >= :fecmin)) then
            BEGIN
            SELECT COPU_FACTORCL FROM comisiones_puntos WHERE COPU_COD = NEW.rcde_comip INTO :FACTOR;
            if ((NEW.rcde_tipodoc = 31) or (NEW.rcde_tipodoc = 41)) then
                begin
                /* recorra la factura acumulando los puntos */
                if (new.rcde_tipodoc = 31) then
                    select (fact_total-fact_ivamonto)/fact_total from facturas where fact_id = new.rcde_iddoc into :factord;
                if (new.rcde_tipodoc = 41) then
                    select ndcl_monto/(ndcl_monto+ndcl_ivamonto) from notas_debito_clientes where ndcl_id = new.rcde_iddoc into :factord;
                /* inserte el registro de puntos */
                insert into puntos_cliente (ptcl_nit, ptcl_fecha, ptcl_tipodoc, ptcl_iddoc, ptcl_db, ptcl_cr)
                    values (:nit, :fec, new.rcde_tipodoc, new.rcde_iddoc, (new.rcde_abono*:factord*:factor/1000), 0);
                end
            if ((new.rcde_tipodoc = 33) or (new.rcde_tipodoc = 42)) then
                begin
                if (new.rcde_tipodoc = 33) then
                    select (devt_total-devt_ivamonto)/devt_total from devoluciones_ventas where devt_id = new.rcde_iddoc into :factord;
                if (new.rcde_tipodoc = 42) then
                    select nccl_monto/(nccl_monto+nccl_ivamonto) from notas_credito_clientes where nccl_id = new.rcde_iddoc into :factord;
                /* inserte el registro de puntos */
                insert into puntos_cliente (ptcl_nit, ptcl_fecha, ptcl_tipodoc, ptcl_iddoc, ptcl_db, ptcl_cr)
                    values (:nit, :fec, new.rcde_tipodoc, new.rcde_iddoc, 0, (new.rcde_abono*:factord*:factor/1000));
                end
            END
        end
    END /* NUEVO */
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER APLICACION_CLIENTE_DETALLE_AU FOR APLICACION_CLIENTE_DETALLE
ACTIVE AFTER UPDATE POSITION 0
AS
declare variable EXISTE CHAR(1);
declare variable FEC DATE;
declare variable NIT VARCHAR(20);
declare variable CONCEPTO VARCHAR(60);
declare variable PREFIJO VARCHAR(4);
declare variable NUMERO VARCHAR(6);
declare variable SALDO NUMERIC(18,2);
declare variable RETES CHAR(2);
declare variable SUCURSAL VARCHAR(10);
declare variable COBR INTEGER;
declare variable TRM NUMERIC(18,2);
BEGIN
if ((old.apcl_id <> 0) and (old.acde_anulado = 'N')) then
    begin
    select apcl_fecha, apcl_trm from aplicacion_CLIENTE
        where apcl_id = old.apcl_id into :FEC, :TRM;
    UPDATE saldos_doc_cartera
        SET SDCA_ABONO = SDCA_ABONO - old.acde_aplicado - OLD.acde_difcambio,
        SDCA_ABRTFTE = SDCA_ABRTFTE - old.acde_RTFTE,
        SDCA_ABRTIVA = SDCA_ABRTIVA - old.acde_RTIVA,
        SDCA_ABRTICA = SDCA_ABRTICA - old.acde_RTICA
        WHERE SDCA_TIPOREF = OLD.ACDE_TIPODOC AND SDCA_IDREF = OLD.acde_IDDOC AND SDCA_FECHA = :FEC;
                    
    UPDATE movimiento_clientes
        SET MVCL_MONTO = MVCL_MONTO - OLD.acde_aplicado - OLD.acde_difcambio,
        MVCL_RTEFTE = MVCL_RTEFTE - OLD.acde_rtfte,
        MVCL_RTEIVA = MVCL_RTEIVA - OLD.acde_rtiva,
        MVCL_RTEICA = MVCL_RTEICA - OLD.acde_rtica
        WHERE MVCL_TIPOREF = 43 AND MVCL_IDREF = NEW.APCL_ID;
    end
if ((NEW.acde_anulado = 'N') AND (NEW.APCL_ID <> 0)) then
    BEGIN
    select PREF_PRE, APCL_NUMERO, apcl_fecha, APCL_CONCEPTO, TERC_NIT, APCL_SUCURSAL, COBR_COD, APCL_TRM
        from aplicacion_CLIENTE
        where apcl_id = new.apcl_id
        into :PREFIJO, :NUMERO, :FEC, :CONCEPTO, :NIT, :SUCURSAL, :COBR, :TRM;
    /* valide que no se pase del saldo */
    execute procedure saldo_doc_cartera(new.acde_tipodoc, new.acde_iddoc, '9999/12/31', 0) returning_values(saldo);
    execute procedure lee_configuracion('CARTERA', 'SALDOS', 'DESCONTAR RETENCIONES POR CAUSACION') returning_values (RETES);
    if (SALDO = 0) then
      EXCEPTION DOCUMENTO_ABONO_MAYOR 'EL SALDO DEL DOCUMENTO ' || NEW.acde_prefijo || NEW.acde_numero || ' ES INSUFICIENTE.';
    else
      if (SALDO < 0) then
        BEGIN
        if (RETES = 'SI') then
            begin
            if (saldo > (NEW.acde_aplicado+NEW.acde_difcambio)) then
                EXCEPTION DOCUMENTO_ABONO_MAYOR 'EL SALDO DEL DOCUMENTO ' || NEW.acde_prefijo || NEW.acde_numero || ' ES INSUFICIENTE.';
            end
        ELSE
            begin
            if (saldo > (NEW.acde_aplicado + NEW.acde_rtfte + NEW.acde_rtiva + NEW.acde_rtica + NEW.acde_difcambio)) then
                EXCEPTION DOCUMENTO_ABONO_MAYOR 'EL SALDO DEL DOCUMENTO ' || NEW.acde_prefijo || NEW.acde_numero || ' ES INSUFICIENTE.';
            end
        END
      else
        BEGIN
        if (RETES = 'SI') then
            begin
            if (saldo < (NEW.acde_aplicado+NEW.acde_difcambio)) then
                EXCEPTION DOCUMENTO_ABONO_MAYOR 'EL SALDO DEL DOCUMENTO ' || NEW.acde_prefijo || NEW.acde_numero || ' ES INSUFICIENTE.';
            end
        ELSE
            begin
            if (saldo < (NEW.acde_aplicado + NEW.acde_rtfte + NEW.acde_rtiva + NEW.acde_rtica + NEW.acde_difcambio)) then
                EXCEPTION DOCUMENTO_ABONO_MAYOR 'EL SALDO DEL DOCUMENTO ' || NEW.acde_prefijo || NEW.acde_numero || ' ES INSUFICIENTE.';
            end
        END
        
    /* Abone el documento referenciado  */
    select 'S' from saldos_doc_cartera where sdca_tiporef = new.acde_tipodoc and sdca_idref = new.acde_iddoc and sdca_fecha = :FEC into :EXISTE;
    if (Existe = 'S') then
        /* actualice el saldo del dia */
        UPDATE saldos_doc_cartera
            SET SDCA_ABONO = SDCA_ABONO + NEW.acde_aplicado+NEW.acde_difcambio,
            SDCA_ABRTFTE = SDCA_ABRTFTE + NEW.acde_RTFTE,
            SDCA_ABRTIVA = SDCA_ABRTIVA + NEW.acde_RTIVA,
            SDCA_ABRTICA = SDCA_ABRTICA + NEW.acde_RTICA,
            SDCA_TRM = :TRM
        WHERE SDCA_TIPOREF = NEW.ACDE_TIPODOC AND SDCA_IDREF = NEW.acde_IDDOC AND SDCA_FECHA = :FEC;
    ELSE
        /* Inserte un nuevo saldo diario */
        INSERT INTO SALDOS_DOC_CARTERA (SDCA_TIPOREF, SDCA_IDREF, SDCA_FECHA, TERC_NIT, SDCA_RTFTE, SDCA_RTIVA, SDCA_RTICA, SDCA_ABONO, SDCA_ABRTFTE, SDCA_ABRTIVA, SDCA_ABRTICA, SDCA_DEBITO, SDCA_MONTO, SDCA_TRM)
            VALUES (NEW.ACDE_TIPODOC, NEW.ACDE_IDDOC, :FEC, :NIT, 0, 0, 0, (NEW.acde_aplicado+NEW.acde_difcambio), NEW.acde_rtfte, NEW.acde_rtiva, NEW.acde_rtica, 'N', 0, :TRM);
            
    /* Registre o actualice el registro en movimiento */
    EXISTE = 'N';
    SELECT 'S' FROM MOVIMIENTO_CLIENTES WHERE MVCL_TIPOREF = 43 AND MVCL_IDREF = NEW.APCL_ID INTO :EXISTE;
    if (EXISTE = 'S') then
        begin
        UPDATE movimiento_clientes
            SET MVCL_MONTO = MVCL_MONTO + NEW.acde_aplicado+NEW.acde_difcambio,
            MVCL_RTEFTE = MVCL_RTEFTE + NEW.acde_rtfte,
            MVCL_RTEIVA = MVCL_RTEIVA + NEW.acde_rtiva,
            MVCL_RTEICA = MVCL_RTEICA + NEW.acde_rtica,
            MVCL_TRM = :TRM
        WHERE MVCL_TIPOREF = 43 AND MVCL_IDREF = NEW.APCL_ID;
        end
    ELSE
        INSERT INTO MOVIMIENTO_CLIENTES (MVCL_ID, TERC_NIT, MVCL_TIPOREF, MVCL_IDREF, MVCL_FECHA, MVCL_VENCE, MVCL_CONC, MVCL_MONTO, MVCL_RTEFTE, MVCL_RTEIVA, MVCL_RTEICA, MVCL_DEBITO, MVCL_ABONO, MVCL_PREFref, MVCL_NUMREF, MVCL_SUCURSAL, COBR_COD, MVCL_TRM)
            VALUES (GEN_ID(ID_MOVCLI, 1), :NIT, 43, NEW.APCL_ID, :FEC, :FEC, :CONCEPTO, (NEW.ACDE_APLICADO+NEW.acde_difcambio), NEW.ACDE_RTFTE, NEW.ACDE_RTIVA, NEW.ACDE_RTICA, 'N', 'S', :PREFIJO, :NUMERO, :SUCURSAL, :COBR, :TRM);
    end
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER APLICACION_CLIENTE_DETALLE_AI FOR APLICACION_CLIENTE_DETALLE
ACTIVE AFTER INSERT POSITION 0
AS
declare variable EXISTE CHAR(1);
declare variable FEC DATE;
declare variable NIT VARCHAR(20);
declare variable CONCEPTO VARCHAR(60);
declare variable PREFIJO VARCHAR(4);
declare variable NUMERO VARCHAR(6);
declare variable SALDO NUMERIC(18,2);
declare variable RETES CHAR(2);
declare variable SUCURSAL VARCHAR(10);
declare variable COBR INTEGER;
declare variable TRM NUMERIC(18,2);
BEGIN
if ((NEW.APCL_ID <> 0) and (new.acde_anulado = 'N')) then
    BEGIN
    /* Abone el documento referenciado */
    select PREF_PRE, APCL_NUMERO, apcl_fecha, APCL_CONCEPTO, TERC_NIT, APCL_SUCURSAL, COBR_COD, APCL_TRM
        from aplicacion_cliente where apcl_id = new.apcl_id
        into :PREFIJO, :NUMERO, :FEC, :CONCEPTO, :NIT, :SUCURSAL, :COBR, :TRM;
    /* valide que no se pase del saldo */
    execute procedure saldo_doc_cartera(new.acde_tipodoc, new.acde_iddoc, '9999/12/31', 0) returning_values(saldo);
    execute procedure lee_configuracion('CARTERA', 'SALDOS', 'DESCONTAR RETENCIONES POR CAUSACION') returning_values (RETES);
    if (SALDO = 0) then
      EXCEPTION DOCUMENTO_ABONO_MAYOR 'EL SALDO DEL DOCUMENTO ' || NEW.acde_prefijo || NEW.acde_numero || ' ES INSUFICIENTE.';
    else
      if (SALDO < 0) then
        BEGIN
        if (RETES = 'SI') then
            begin
            if (saldo > (NEW.acde_aplicado + NEW.acde_difcambio)) then
                EXCEPTION DOCUMENTO_ABONO_MAYOR 'EL SALDO DEL DOCUMENTO ' || NEW.acde_prefijo || NEW.acde_numero || ' ES INSUFICIENTE.';
            end
        ELSE
            begin
            if (saldo > (NEW.acde_aplicado + NEW.acde_rtfte + NEW.acde_rtiva + NEW.acde_rtica + NEW.acde_difcambio)) then
                EXCEPTION DOCUMENTO_ABONO_MAYOR 'EL SALDO DEL DOCUMENTO ' || NEW.acde_prefijo || NEW.acde_numero || ' ES INSUFICIENTE.';
            end
        END
      else
        BEGIN
        if (RETES = 'SI') then
            begin
            if (saldo < (NEW.acde_aplicado + NEW.acde_difcambio)) then
                EXCEPTION DOCUMENTO_ABONO_MAYOR 'EL SALDO DEL DOCUMENTO ' || NEW.acde_prefijo || NEW.acde_numero || ' ES INSUFICIENTE.';
            end
        ELSE
            begin
            if (saldo < (NEW.acde_aplicado + NEW.acde_rtfte + NEW.acde_rtiva + NEW.acde_rtica + NEW.acde_difcambio)) then
                EXCEPTION DOCUMENTO_ABONO_MAYOR 'EL SALDO DEL DOCUMENTO ' || NEW.acde_prefijo || NEW.acde_numero || ' ES INSUFICIENTE.';
            end
        END
    select 'S' from saldos_doc_cartera where sdca_tiporef = new.acde_tipodoc and sdca_idref = new.acde_iddoc and sdca_fecha = :FEC into :EXISTE;
    if (Existe = 'S') then
        begin
        /* actualice el saldo del dia */
        UPDATE saldos_doc_cartera
            SET SDCA_ABONO = SDCA_ABONO + NEW.acde_aplicado + NEW.acde_difcambio,
                SDCA_ABRTFTE = SDCA_ABRTFTE + NEW.acde_RTFTE,
                SDCA_ABRTIVA = SDCA_ABRTIVA + NEW.acde_RTIVA,
                SDCA_ABRTICA = SDCA_ABRTICA + NEW.acde_RTICA,
                SDCA_TRM = :TRM
            WHERE SDCA_TIPOREF = NEW.ACDE_TIPODOC AND SDCA_IDREF = NEW.acde_IDDOC AND SDCA_FECHA = :FEC;
        END
    ELSE
        BEGIN
        /* Inserte un nuevo saldo diario */
        INSERT INTO SALDOS_DOC_CARTERA (SDCA_TIPOREF, SDCA_IDREF, SDCA_FECHA, TERC_NIT, SDCA_RTFTE, SDCA_RTIVA, SDCA_RTICA, SDCA_ABONO, SDCA_ABRTFTE, SDCA_ABRTIVA, SDCA_ABRTICA, SDCA_DEBITO, SDCA_MONTO, SDCA_TRM)
            VALUES (NEW.ACDE_TIPODOC, NEW.ACDE_IDDOC, :FEC, :NIT, 0, 0, 0, (NEW.acde_aplicado + NEW.acde_difcambio), NEW.acde_rtfte, NEW.acde_rtiva, NEW.acde_rtica, 'N', 0, :TRM);
        END
    /* actualice el registro en mov_cliente (por si son varios items) */
    EXISTE = 'N';
    SELECT 'S' FROM MOVIMIENTO_CLIENTES WHERE MVCL_TIPOREF = 43 AND MVCL_IDREF = NEW.APCL_ID INTO :EXISTE;
    if (EXISTE = 'S') then
        begin
        UPDATE movimiento_clientes
            SET MVCL_MONTO = MVCL_MONTO + NEW.acde_aplicado + NEW.acde_difcambio,
                MVCL_RTEFTE = MVCL_RTEFTE + NEW.acde_rtfte,
                MVCL_RTEIVA = MVCL_RTEIVA + NEW.acde_rtiva,
                MVCL_RTEICA = MVCL_RTEICA + NEW.acde_rtica,
                MVCL_TRM = :TRM
            WHERE MVCL_TIPOREF = 43 AND MVCL_IDREF = NEW.APCL_ID;
        end
    ELSE
        INSERT INTO MOVIMIENTO_CLIENTES (MVCL_ID, TERC_NIT, MVCL_TIPOREF, MVCL_IDREF, MVCL_FECHA, MVCL_VENCE, MVCL_CONC, MVCL_MONTO, MVCL_RTEFTE, MVCL_RTEIVA, MVCL_RTEICA, MVCL_DEBITO, MVCL_ABONO, MVCL_PREFREF, MVCL_NUMREF, MVCL_SUCURSAL, COBR_COD, MVCL_TRM)
            VALUES (GEN_ID(ID_MOVCLI, 1), :NIT, 43, NEW.APCL_ID, :FEC, :FEC, :CONCEPTO, (NEW.ACDE_APLICADO + NEW.acde_difcambio), NEW.ACDE_RTFTE, NEW.ACDE_RTIVA, NEW.ACDE_RTICA, 'N', 'S', :PREFIJO, :NUMERO, :SUCURSAL, :COBR, :TRM);
    end
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER RECIBOS_CAJA_CRUCEC_AI FOR RECIBOS_CAJA_CRUCEC
ACTIVE AFTER INSERT POSITION 0
AS
declare variable EXISTE CHAR(1);
declare variable FEC DATE;
declare variable NIT VARCHAR(20);
declare variable CONCEPTO VARCHAR(60);
declare variable PREFIJO VARCHAR(4);
declare variable NUMERO VARCHAR(6);
declare variable OK CHAR(1);
declare variable RETES CHAR(2);
declare variable SALDO NUMERIC(18,2);
declare variable TRM NUMERIC(18,2);
BEGIN
/* Abone el documento referenciado  */
select PREF_PRE, RECA_NUMERO, RECA_FECHA, RECA_CONC, TERC_NIT, RECA_TRM
    from RECIBOS_CAJA where RECA_ID = new.reca_id into :PREFIJO, :NUMERO, :FEC, :CONCEPTO, :NIT, :TRM;
if ((NEW.RECA_ID <> 0) and (new.rccr_anulado = 'N')) then
    BEGIN
    OK = 'N';
    /* valide que no se pase del saldo */
    execute procedure saldo_doc_cxpagar(new.rccr_tipodoc, new.rccr_iddoc, '9999/12/31', 0) returning_values(saldo);
    execute procedure lee_configuracion('CXPAGAR', 'SALDOS', 'DESCONTAR RETENCIONES POR CAUSACION') returning_values (RETES);
    if (SALDO = 0) then
      EXCEPTION DOCUMENTO_ABONO_MAYOR 'El saldo del documento ' || new.rccr_prefijo || new.rccr_numero || ' es insuficiente.';
    else
      if (SALDO < 0) then
        BEGIN
        if (RETES = 'SI') then
            begin
            if (saldo > (NEW.rccr_abono+NEW.rccr_difcambio+NEW.rccr_dtof)) then
                EXCEPTION DOCUMENTO_ABONO_MAYOR 'El saldo del documento ' || new.rccr_prefijo || new.rccr_numero || ' es insuficiente.';
            end
        ELSE
            begin
            if (saldo > (NEW.rccr_abono + NEW.rccr_rtfte + NEW.rccr_rtiva + NEW.rccr_rtica + new.rccr_dtof + NEW.rccr_difcambio)) then
                EXCEPTION DOCUMENTO_ABONO_MAYOR 'El saldo del documento ' || new.rccr_prefijo || new.rccr_numero || ' es insuficiente.';
            end
        END
      else
        BEGIN
        if (RETES = 'SI') then
            begin
            if (saldo < (NEW.rccr_abono+NEW.rccr_dtof+NEW.rccr_difcambio)) then
                EXCEPTION DOCUMENTO_ABONO_MAYOR 'El saldo del documento ' || new.rccr_prefijo || new.rccr_numero || ' es insuficiente.';
            end
        ELSE
            begin
            if (saldo < (NEW.rccr_abono + NEW.rccr_rtfte + NEW.rccr_rtiva + NEW.rccr_rtica + NEW.rccr_dtof + NEW.rccr_difcambio)) then
                EXCEPTION DOCUMENTO_ABONO_MAYOR 'El saldo del documento ' || new.rccr_prefijo || new.rccr_numero || ' es insuficiente.';
            end
        END
    if (OK = 'N') then
        BEGIN
        select 'S' from saldos_doc_cxpagar where sdcp_tiporef = new.rccr_tipodoc and
            sdcp_idref = new.rccr_iddoc and sdcp_fecha = :FEC into :EXISTE;
        if (Existe = 'S') then
            begin
            /* actualice el saldo del dia */
            UPDATE saldos_doc_cxpagar
                SET SDCP_ABONO = SDCP_ABONO + (NEW.rccr_abono + NEW.rccr_dtof + NEW.rccr_difcambio),
                    SDCP_ABRTFTE = SDCP_ABRTFTE + NEW.rccr_rtfte,
                    SDCP_ABRTIVA = SDCP_ABRTIVA + NEW.rccr_rtiva,
                    SDCP_ABRTICA = SDCP_ABRTICA + NEW.rccr_rtica,
                    SDCP_TRM = :TRM
                WHERE SDCP_TIPOREF = NEW.rccr_tipodoc AND SDCP_IDREF = NEW.rccr_iddoc AND SDCP_FECHA = :FEC;
            END
        ELSE
            BEGIN
            /* Inserte un nuevo saldo diario */
            INSERT INTO SALDOS_DOC_CXPAGAR (SDCP_TIPOREF, SDCP_IDREF, SDCP_FECHA, TERC_NIT, SDCP_RTEFTE, SDCP_RTIVA, SDCP_RTICA, SDCP_ABONO, SDCP_ABRTFTE, SDCP_ABRTIVA, SDCP_ABRTICA, SDCP_DEBITO, SDCP_MONTO, SDCP_TRM)
                VALUES (NEW.rccr_tipodoc, NEW.rccr_iddoc, :FEC, :NIT, 0, 0, 0, (NEW.rccr_abono+NEW.rccr_dtof+NEW.rccr_difcambio), NEW.rccr_rtfte, NEW.rccr_rtiva, NEW.rccr_rtica, 'N', 0, :TRM);
            END
        END
    /* actualice el registro en mov_proveedor (por si son varios items) */
    EXISTE = 'N';
    SELECT 'S' FROM MOVIMIENTO_PROVEEDOR WHERE MVPR_TIPOREF = 61 AND MVPR_IDREF = NEW.reca_id INTO :EXISTE;
    if (EXISTE = 'S') then
        begin
        UPDATE movimiento_proveedor
            SET MVPR_MONTO = MVPR_MONTO + (NEW.rccr_abono + NEW.rccr_dtof+NEW.rccr_difcambio),
                MVPR_RTFTE = MVPR_RTFTE + NEW.rccr_rtfte,
                MVPR_RTIVA = MVPR_RTIVA + NEW.rccr_rtiva,
                MVPR_RTICA = MVPR_RTICA + NEW.rccr_rtica,
                MVPR_TRM = :TRM
            WHERE MVPR_TIPOREF = 61 AND MVPR_IDREF = NEW.reca_id;
        end
    ELSE
        INSERT INTO MOVIMIENTO_PROVEEDOR (MVPR_ID, TERC_NIT, MVPR_TIPOREF, MVPR_IDREF, MVPR_FECHA, MVPR_VENCE, MVPR_CONC, MVPR_MONTO, MVPR_RTFTE, MVPR_RTIVA, MVPR_RTICA, MVPR_DEBITO, MVPR_ABONO, MVPR_PREFIJO, MVPR_NUMERO, MVPR_TRM)
            VALUES (GEN_ID(ID_MOVPROV, 1), :NIT, 61, NEW.reca_id, :FEC, :FEC, :CONCEPTO, (NEW.rccr_abono+NEW.rccr_dtof+NEW.rccr_difcambio), NEW.rccr_rtfte, NEW.rccr_rtiva, NEW.rccr_rtica, 'N', 'S', :PREFIJO, :NUMERO, :TRM);
    END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER RECIBOS_CAJA_CRUCEC_AU FOR RECIBOS_CAJA_CRUCEC
ACTIVE AFTER UPDATE POSITION 0
as
declare variable EXISTE CHAR(1);
declare variable FEC DATE;
declare variable NIT VARCHAR(20);
declare variable CONCEPTO VARCHAR(60);
declare variable PREFIJO VARCHAR(4);
declare variable NUMERO VARCHAR(6);
declare variable RETES CHAR(2);
declare variable SALDO NUMERIC(18,2);
declare variable TRM NUMERIC(18,2);
BEGIN
select PREF_PRE, RECA_NUMERO, RECA_FECHA, RECA_CONC, TERC_NIT, RECA_TRM from RECIBOS_CAJA
    where reca_id = new.reca_id into :PREFIJO, :NUMERO, :FEC, :CONCEPTO, :NIT, :TRM;
if ((OLD.reca_id <> 0) and (old.rccr_anulado = 'N')) then
    BEGIN
    EXISTE = 'N';
    select 'S' from saldos_doc_cxpagar where sdcp_tiporef = old.rccr_tipodoc and
        sdcp_idref = old.rccr_iddoc and sdcp_fecha = :FEC into :EXISTE;
    if (Existe = 'S') then
        UPDATE saldos_doc_cxpagar
            SET SDCP_ABONO = SDCP_ABONO - (old.rccr_abono + OLD.rccr_dtof+OLD.rccr_difcambio),
            SDCP_ABRTFTE = SDCP_ABRTFTE - old.rccr_rtfte,
            SDCP_ABRTIVA = SDCP_ABRTIVA - old.rccr_rtiva,
            SDCP_ABRTICA = SDCP_ABRTICA - old.rccr_rtica
            WHERE SDCP_TIPOREF = OLD.rccr_tipodoc AND SDCP_IDREF = OLD.rccr_iddoc AND SDCP_FECHA = :FEC;
    EXISTE = 'N';
    SELECT 'S' FROM MOVIMIENTO_PROVEEDOR WHERE MVPR_TIPOREF = 61 AND MVPR_IDREF = OLD.reca_id INTO :EXISTE;
    if (EXISTE = 'S') then
        UPDATE movimiento_proveedor
            SET MVPR_MONTO = MVPR_MONTO - (OLD.rccr_abono + OLD.rccr_dtof+OLD.rccr_difcambio),
            MVPR_RTFTE = MVPR_RTFTE - OLD.rccr_rtfte,
            MVPR_RTIVA = MVPR_RTIVA - OLD.rccr_rtiva,
            MVPR_RTICA = MVPR_RTICA - OLD.rccr_rtica
            WHERE MVPR_TIPOREF = 61 AND MVPR_IDREF = OLD.reca_id;
    END
if ((NEW.reca_id <> 0) and (NEW.rccr_anulado = 'N')) then
    BEGIN
    /* valide que no se pase del saldo */
    execute procedure saldo_doc_cxpagar(new.rccr_tipodoc, new.rccr_iddoc, '9999/12/31', 0) returning_values(saldo);
    execute procedure lee_configuracion('CXPAGAR', 'SALDOS', 'DESCONTAR RETENCIONES POR CAUSACION') returning_values (RETES);
    if (SALDO = 0) then
        EXCEPTION DOCUMENTO_ABONO_MAYOR 'El saldo del documento ' || new.rccr_prefijo || new.rccr_numero || ' es insuficiente.';
    else
      if (SALDO < 0) then
        BEGIN
        if (RETES = 'SI') then
            begin
            if (saldo > (NEW.rccr_abono+NEW.rccr_dtof+NEW.rccr_difcambio)) then
                EXCEPTION DOCUMENTO_ABONO_MAYOR 'El saldo del documento ' || new.rccr_prefijo || new.rccr_numero || ' es insuficiente.';
            end
        ELSE
            begin
            if (saldo > (NEW.rccr_abono + NEW.rccr_rtfte + NEW.rccr_rtiva + NEW.rccr_rtica + new.rccr_dtof+NEW.rccr_difcambio)) then
                EXCEPTION DOCUMENTO_ABONO_MAYOR 'El saldo del documento ' || new.rccr_prefijo || new.rccr_numero || ' es insuficiente.';
            end
        END
      else
        BEGIN
        if (RETES = 'SI') then
            begin
            if (saldo < (NEW.rccr_abono+NEW.rccr_dtof+NEW.rccr_difcambio)) then
                EXCEPTION DOCUMENTO_ABONO_MAYOR 'El saldo del documento ' || new.rccr_prefijo || new.rccr_numero || ' es insuficiente.';
            end
        ELSE
            begin
            if (saldo < (NEW.rccr_abono + NEW.rccr_rtfte + NEW.rccr_rtiva + NEW.rccr_rtica + NEW.rccr_dtof+NEW.rccr_difcambio)) then
                EXCEPTION DOCUMENTO_ABONO_MAYOR 'El saldo del documento ' || new.rccr_prefijo || new.rccr_numero || ' es insuficiente.';
            end
        END
    /* AHORA REGISTRE LO NUEVO */
    EXISTE = 'N';
    select 'S' from saldos_doc_cxpagar where sdcp_tiporef = new.rccr_tipodoc and
        sdcp_idref = new.rccr_iddoc and sdcp_fecha = :FEC into :EXISTE;
    if (Existe = 'S') then
        UPDATE saldos_doc_cxpagar
            SET SDCP_ABONO = SDCP_ABONO + (NEW.rccr_abono + NEW.rccr_dtof + NEW.rccr_difcambio),
            SDCP_ABRTFTE = SDCP_ABRTFTE + NEW.rccr_rtfte,
            SDCP_ABRTIVA = SDCP_ABRTIVA + NEW.rccr_rtiva,
            SDCP_ABRTICA = SDCP_ABRTICA + NEW.rccr_rtica,
            SDCP_TRM = :TRM
            WHERE SDCP_TIPOREF = NEW.rccr_tipodoc AND SDCP_IDREF = NEW.rccr_iddoc AND SDCP_FECHA = :FEC;
    else
        INSERT INTO SALDOS_DOC_CXPAGAR (SDCP_TIPOREF, SDCP_IDREF, SDCP_FECHA, TERC_NIT, SDCP_RTEFTE, SDCP_RTIVA, SDCP_RTICA, SDCP_ABONO, SDCP_ABRTFTE, SDCP_ABRTIVA, SDCP_ABRTICA, SDCP_DEBITO, SDCP_MONTO, SDCP_TRM)
            VALUES (NEW.rccr_tipodoc, NEW.rccr_iddoc, :FEC, :NIT, 0, 0, 0, (NEW.rccr_abono + NEW.rccr_dtof + NEW.rccr_difcambio), NEW.rccr_rtfte, NEW.rccr_rtiva, NEW.rccr_rtica, 'N', 0, :TRM);
    /* Registre o actualice el registro en movimiento_proveedor */
    EXISTE = 'N';
    SELECT 'S' FROM MOVIMIENTO_PROVEEDOR WHERE MVPR_TIPOREF = 61 AND MVPR_IDREF = NEW.reca_id INTO :EXISTE;
    if (EXISTE = 'S') then
        /* Actualice el nuevo */
        UPDATE movimiento_proveedor
            SET MVPR_MONTO = MVPR_MONTO + (NEW.rccr_abono + NEW.rccr_dtof + NEW.rccr_difcambio),
                MVPR_RTFTE = MVPR_RTFTE + NEW.rccr_rtfte,
                MVPR_RTIVA = MVPR_RTIVA + NEW.rccr_rtiva,
                MVPR_RTICA = MVPR_RTICA + NEW.rccr_rtica,
                MVPR_TRM = :TRM
            WHERE MVPR_TIPOREF = 61 AND MVPR_IDREF = NEW.reca_id;
    ELSE
        INSERT INTO MOVIMIENTO_PROVEEDOR (MVPR_ID, TERC_NIT, MVPR_TIPOREF, MVPR_IDREF, MVPR_FECHA, MVPR_VENCE, MVPR_CONC, MVPR_MONTO, MVPR_RTFTE, MVPR_RTIVA, MVPR_RTICA, MVPR_DEBITO, MVPR_ABONO, MVPR_PREFIJO, MVPR_NUMERO, MVPR_TRM)
            VALUES (GEN_ID(ID_MOVPROV, 1), :NIT, 61, NEW.reca_id, :FEC, :FEC, :CONCEPTO, (NEW.rccr_abono + NEW.rccr_dtof + NEW.rccr_difcambio), NEW.rccr_rtfte, NEW.rccr_rtiva, NEW.rccr_rtica, 'N', 'S', :PREFIJO, :NUMERO, :TRM);
    end
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER EGRESOS_CRUCEC_AI FOR EGRESOS_CRUCEC
ACTIVE AFTER INSERT POSITION 0
AS
declare variable EXISTE CHAR(1);
declare variable FEC DATE;
declare variable NIT VARCHAR(20);
declare variable CONCEPTO VARCHAR(60);
declare variable PREFIJO VARCHAR(4);
declare variable NUMERO VARCHAR(6);
declare variable SALDO NUMERIC(18,2);
declare variable RETES CHAR(2);
declare variable COBR INTEGER;
declare variable TRM NUMERIC(18,2);
BEGIN
if ((NEW.egre_id <> 0) and (new.egcc_anulado = 'N')) then
    BEGIN
    /* Abone el documento referenciado */
    select PREF_PRE, EGRE_NUMERO, EGRE_fecha, EGRE_CONC, TERC_NIT, EGRE_TRM from EGRESOS
        where EGRE_id = new.egre_id into :PREFIJO, :NUMERO, :FEC, :CONCEPTO, :NIT, :TRM;
    SELECT COBR_COD FROM cliente_sucursales WHERE TERC_NIT = :NIT AND CLCU_COD = NEW.egcc_sucursal INTO :COBR;
    /* valide que no se pase del saldo */
    execute procedure saldo_doc_cartera(new.egcc_tipodoc, new.egcc_iddoc, '9999/12/31',0) returning_values(saldo);
    execute procedure lee_configuracion('CARTERA', 'SALDOS', 'DESCONTAR RETENCIONES POR CAUSACION') returning_values (RETES);
    if (SALDO = 0) then
      EXCEPTION DOCUMENTO_ABONO_MAYOR 'EL SALDO DEL DOCUMENTO ' || NEW.egcc_prefijo || NEW.egcc_numero || ' ES INSUFICIENTE.';
    else
      if (SALDO < 0) then
        BEGIN
        if (RETES = 'SI') then
            begin
            if (saldo > (NEW.egcc_abono + NEW.egcc_dtof + NEW.egcc_difcambio)) then
                EXCEPTION DOCUMENTO_ABONO_MAYOR 'EL SALDO DEL DOCUMENTO ' || NEW.egcc_prefijo || NEW.egcc_numero || ' ES INSUFICIENTE.';
            end
        ELSE
            begin
            if (saldo > (NEW.egcc_abono + NEW.egcc_rtfte + NEW.egcc_rtiva + NEW.egcc_rtica + NEW.egcc_dtof + NEW.egcc_difcambio)) then
                EXCEPTION DOCUMENTO_ABONO_MAYOR 'EL SALDO DEL DOCUMENTO ' || NEW.egcc_prefijo || NEW.egcc_numero || ' ES INSUFICIENTE.';
            end
        END
      else
        BEGIN
        if (RETES = 'SI') then
            begin
            if (saldo < (NEW.egcc_abono + NEW.egcc_dtof + NEW.egcc_difcambio)) then
                EXCEPTION DOCUMENTO_ABONO_MAYOR 'EL SALDO DEL DOCUMENTO ' || NEW.egcc_prefijo || NEW.egcc_numero || ' ES INSUFICIENTE.';
            end
        ELSE
            begin
            if (saldo < (NEW.egcc_abono + NEW.egcc_rtfte + NEW.egcc_rtiva + NEW.egcc_rtica + NEW.egcc_dtof + NEW.egcc_difcambio)) then
                EXCEPTION DOCUMENTO_ABONO_MAYOR 'EL SALDO DEL DOCUMENTO ' || NEW.egcc_prefijo || NEW.egcc_numero || ' ES INSUFICIENTE.';
            end
        END
    EXISTE = 'N';
    select 'S' from saldos_doc_cartera where sdca_tiporef = new.egcc_tipodoc and sdca_idref = new.egcc_iddoc and sdca_fecha = :FEC into :EXISTE;
    if (Existe = 'S') then
        begin
        /* actualice el saldo del dia */
        UPDATE saldos_doc_cartera
            SET SDCA_ABONO = SDCA_ABONO + NEW.egcc_abono + new.egcc_dtof + NEW.egcc_difcambio,
                SDCA_ABRTFTE = SDCA_ABRTFTE + NEW.egcc_rtfte,
                SDCA_ABRTIVA = SDCA_ABRTIVA + NEW.egcc_rtiva,
                SDCA_ABRTICA = SDCA_ABRTICA + NEW.egcc_rtica,
                SDCA_TRM = :TRM
                WHERE SDCA_TIPOREF = NEW.egcc_tipodoc AND SDCA_IDREF = NEW.egcc_iddoc AND SDCA_FECHA = :FEC;
        END
    ELSE
        BEGIN
        /* Inserte un nuevo saldo diario */
        INSERT INTO SALDOS_DOC_CARTERA (SDCA_TIPOREF, SDCA_IDREF, SDCA_FECHA, TERC_NIT, SDCA_RTFTE, SDCA_RTIVA, SDCA_RTICA, SDCA_ABONO, SDCA_ABRTFTE, SDCA_ABRTIVA, SDCA_ABRTICA, SDCA_DEBITO, SDCA_MONTO, SDCA_TRM)
            VALUES (NEW.egcc_tipodoc, NEW.egcc_iddoc, :FEC, :NIT, 0, 0, 0, (NEW.egcc_abono+NEW.egcc_dtof+NEW.egcc_difcambio), NEW.egcc_rtfte, NEW.egcc_rtiva, NEW.egcc_rtica, 'N', 0, :TRM);
        END
    /* actualice el registro en mov_cliente (por si son varios items) */
    EXISTE = 'N';
    SELECT 'S' FROM MOVIMIENTO_CLIENTES WHERE MVCL_TIPOREF = 62 AND MVCL_IDREF = NEW.egre_id AND MVCL_SUCURSAL = NEW.egcc_sucursal INTO :EXISTE;
    if (EXISTE = 'S') then
        begin
        UPDATE movimiento_clientes
            SET MVCL_MONTO = MVCL_MONTO + NEW.egcc_abono + NEW.egcc_dtof + NEW.egcc_difcambio,
                MVCL_RTEFTE = MVCL_RTEFTE + NEW.egcc_rtfte,
                MVCL_RTEIVA = MVCL_RTEIVA + NEW.egcc_rtiva,
                MVCL_RTEICA = MVCL_RTEICA + NEW.egcc_rtica,
                MVCL_TRM = :TRM
            WHERE MVCL_TIPOREF = 62 AND MVCL_IDREF = NEW.egre_id;
        end
    ELSE
        INSERT INTO MOVIMIENTO_CLIENTES (MVCL_ID, TERC_NIT, MVCL_TIPOREF, MVCL_IDREF, MVCL_FECHA, MVCL_VENCE, MVCL_CONC, MVCL_MONTO, MVCL_RTEFTE, MVCL_RTEIVA, MVCL_RTEICA, MVCL_DEBITO, MVCL_ABONO, MVCL_PREFREF, MVCL_NUMREF, MVCL_SUCURSAL, COBR_COD, MVCL_TRM)
            VALUES (GEN_ID(ID_MOVCLI, 1), :NIT, 62, NEW.egre_id, :FEC, :FEC, :CONCEPTO, (NEW.egcc_abono+NEW.egcc_dtof+NEW.egcc_difcambio), NEW.egcc_rtfte, NEW.egcc_rtiva, NEW.egcc_rtica, 'N', 'S', :PREFIJO, :NUMERO, NEW.egcc_sucursal, :COBR, :TRM);
    end
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER EGRESOS_CRUCEC_AU FOR EGRESOS_CRUCEC
ACTIVE AFTER UPDATE POSITION 0
AS
declare variable EXISTE CHAR(1);
declare variable FEC DATE;
declare variable NIT VARCHAR(20);
declare variable CONCEPTO VARCHAR(60);
declare variable PREFIJO VARCHAR(4);
declare variable NUMERO VARCHAR(6);
declare variable SALDO NUMERIC(18,2);
declare variable RETES char(2);
declare variable COBR INTEGER;
declare variable TRM NUMERIC(18,2);
BEGIN
select PREF_PRE, EGRE_NUMERO, EGRE_fecha, EGRE_CONC, TERC_NIT, EGRE_TRM
    from egresos where egre_id = new.egre_id
    into :PREFIJO, :NUMERO, :FEC, :CONCEPTO, :NIT, :TRM;
/* Borre el viejo */
if ((old.egre_id <> 0) AND (OLD.egcc_anulado = 'N')) then
    BEGIN
    UPDATE saldos_doc_cartera
        SET SDCA_ABONO = SDCA_ABONO - old.egcc_abono - OLD.egcc_dtof - OLD.egcc_difcambio,
        SDCA_ABRTFTE = SDCA_ABRTFTE - old.egcc_rtfte,
        SDCA_ABRTIVA = SDCA_ABRTIVA - old.egcc_rtiva,
        SDCA_ABRTICA = SDCA_ABRTICA - old.egcc_rtica
        WHERE SDCA_TIPOREF = old.egcc_tipodoc AND SDCA_IDREF = old.egcc_iddoc AND SDCA_FECHA = :FEC;
    UPDATE movimiento_clientes
        SET MVCL_MONTO = MVCL_MONTO - OLD.egcc_abono - OLD.egcc_dtof - OLD.egcc_difcambio,
        MVCL_RTEFTE = MVCL_RTEFTE - OLD.egcc_rtfte,
        MVCL_RTEIVA = MVCL_RTEIVA - OLD.egcc_rtiva,
        MVCL_RTEICA = MVCL_RTEICA - OLD.egcc_rtica
        WHERE MVCL_TIPOREF = 62 AND MVCL_IDREF = OLD.egre_id AND MVCL_SUCURSAL = old.egcc_sucursal;
    END
if ((NEW.egre_id <> 0) and (NEW.egcc_anulado = 'N')) then
    BEGIN
    SELECT COBR_COD FROM cliente_sucursales WHERE TERC_NIT = :NIT AND CLCU_COD = NEW.egcc_sucursal INTO :COBR;
    /* valide que no se pase del saldo */
    execute procedure saldo_doc_cartera(new.egcc_tipodoc, new.egcc_iddoc, '9999/12/31',0) returning_values(saldo);
    execute procedure lee_configuracion('CARTERA', 'SALDOS', 'DESCONTAR RETENCIONES POR CAUSACION') returning_values (RETES);
    if (SALDO = 0) then
      EXCEPTION DOCUMENTO_ABONO_MAYOR 'EL SALDO DEL DOCUMENTO ' || NEW.egcc_prefijo || NEW.egcc_numero || ' ES INSUFICIENTE.';
    else
      if (SALDO < 0) then
        BEGIN
        if (RETES = 'SI') then
            begin
            if (saldo > (NEW.egcc_abono + NEW.egcc_dtof + NEW.egcc_difcambio)) then
                EXCEPTION DOCUMENTO_ABONO_MAYOR 'EL SALDO DEL DOCUMENTO ' || NEW.egcc_prefijo || NEW.egcc_numero || ' ES INSUFICIENTE.';
            end
        ELSE
            begin
            if (saldo > (NEW.egcc_abono + NEW.egcc_rtfte + NEW.egcc_rtiva + NEW.egcc_rtica + NEW.egcc_dtof + NEW.egcc_difcambio)) then
                EXCEPTION DOCUMENTO_ABONO_MAYOR 'EL SALDO DEL DOCUMENTO ' || NEW.egcc_prefijo || NEW.egcc_numero || ' ES INSUFICIENTE.';
            end
        END
      else
        BEGIN
        if (RETES = 'SI') then
            begin
            if (saldo < (NEW.egcc_abono + NEW.egcc_dtof + NEW.egcc_difcambio)) then
                EXCEPTION DOCUMENTO_ABONO_MAYOR 'EL SALDO DEL DOCUMENTO ' || NEW.egcc_prefijo || NEW.egcc_numero || ' ES INSUFICIENTE.';
            end
        ELSE
            begin
            if (saldo < (NEW.egcc_abono + NEW.egcc_rtfte + NEW.egcc_rtiva + NEW.egcc_rtica + NEW.egcc_dtof + NEW.egcc_difcambio)) then
                EXCEPTION DOCUMENTO_ABONO_MAYOR 'EL SALDO DEL DOCUMENTO ' || NEW.egcc_prefijo || NEW.egcc_numero || ' ES INSUFICIENTE.';
            end
        END
    select 'S' from saldos_doc_cartera where sdca_tiporef = new.egcc_tipodoc and sdca_idref = new.egcc_iddoc and sdca_fecha = :FEC into :EXISTE;
    if (Existe = 'S') then
        /* actualice el saldo del dia */
        UPDATE saldos_doc_cartera
            SET SDCA_ABONO = SDCA_ABONO + NEW.egcc_abono + NEW.egcc_dtof + NEW.egcc_difcambio,
            SDCA_ABRTFTE = SDCA_ABRTFTE + NEW.egcc_rtfte,
            SDCA_ABRTIVA = SDCA_ABRTIVA + NEW.egcc_rtiva,
            SDCA_ABRTICA = SDCA_ABRTICA + NEW.egcc_rtica,
            SDCA_TRM = :TRM
            WHERE SDCA_TIPOREF = NEW.egcc_tipodoc AND SDCA_IDREF = NEW.egcc_iddoc AND SDCA_FECHA = :FEC;
    ELSE
        /* Inserte un nuevo saldo diario */
        INSERT INTO SALDOS_DOC_CARTERA (SDCA_TIPOREF, SDCA_IDREF, SDCA_FECHA, TERC_NIT, SDCA_RTFTE, SDCA_RTIVA, SDCA_RTICA, SDCA_ABONO, SDCA_ABRTFTE, SDCA_ABRTIVA, SDCA_ABRTICA, SDCA_DEBITO, SDCA_MONTO, SDCA_TRM)
            VALUES (NEW.egcc_tipodoc, NEW.egcc_iddoc, :FEC, :NIT, 0, 0, 0, (NEW.egcc_abono+NEW.egcc_dtof+NEW.egcc_difcambio), NEW.egcc_rtfte, NEW.egcc_rtiva, NEW.egcc_rtica, 'N', 0, :TRM);
    /* Registre o actualice el registro en movimiento_cliente */
    EXISTE = 'N';
    SELECT 'S' FROM MOVIMIENTO_CLIENTES WHERE MVCL_TIPOREF = 62 AND MVCL_IDREF = NEW.egre_id and mvcl_sucursal = new.egcc_sucursal INTO :EXISTE;
    if (EXISTE = 'S') then
        begin
        /* Actualice el nuevo */
        UPDATE movimiento_clientes
            SET MVCL_MONTO = MVCL_MONTO + NEW.egcc_abono + NEW.egcc_dtof + NEW.egcc_difcambio,
                MVCL_RTEFTE = MVCL_RTEFTE + NEW.egcc_rtfte,
                MVCL_RTEIVA = MVCL_RTEIVA + NEW.egcc_rtiva,
                MVCL_RTEICA = MVCL_RTEICA + NEW.egcc_rtica,
                MVCL_TRM = :TRM
            WHERE MVCL_TIPOREF = 62 AND MVCL_IDREF = NEW.egre_id AND MVCL_SUCURSAL = NEW.egcc_sucursal;
        end
    ELSE
        INSERT INTO MOVIMIENTO_CLIENTES (MVCL_ID, TERC_NIT, MVCL_TIPOREF, MVCL_IDREF, MVCL_FECHA, MVCL_VENCE, MVCL_CONC, MVCL_MONTO, MVCL_RTEFTE, MVCL_RTEIVA, MVCL_RTEICA, MVCL_DEBITO, MVCL_ABONO, MVCL_PREFREF, MVCL_NUMREF, MVCL_SUCURSAL, COBR_COD, MVCL_TRM)
            VALUES (GEN_ID(ID_MOVCLI, 1), :NIT, 62, NEW.egre_id, :FEC, :FEC, :CONCEPTO, (NEW.egcc_abono+NEW.egcc_dtof+NEW.egcc_difcambio), NEW.egcc_rtfte, NEW.egcc_rtiva, NEW.egcc_rtica, 'N', 'S', :PREFIJO, :NUMERO, NEW.egcc_sucursal, :COBR, :TRM);
    END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER EGRESOS_DETALLE_AI FOR EGRESOS_DETALLE
ACTIVE AFTER INSERT POSITION 0
AS
declare variable FEC DATE;
declare variable NIT VARCHAR(20);
declare variable CONCEPTO VARCHAR(60);
declare variable PREFIJO VARCHAR(4);
declare variable NUMERO VARCHAR(6);
declare variable OK CHAR(1);
declare variable EGANTI INTEGER;
declare variable RETES CHAR(2);
declare variable SALDO NUMERIC(18,2);
declare variable TRM NUMERIC(18,2);
declare variable NITDOC VARCHAR(20);
BEGIN
/* Abone el documento referenciado en EGRESOS_DETALLE */
select PREF_PRE, EGRE_NUMERO, EGRE_FECHA, EGRE_CONC, TERC_NIT, EGRE_TRM
    from EGRESOS where EGRE_ID = new.EGRE_ID into :PREFIJO, :NUMERO, :FEC, :CONCEPTO, :NIT, :TRM;
if ((NEW.EGRE_ID <> 0) and (new.egde_anulado = 'N')) then
    BEGIN
    OK = 'N';
    if (new.EGDE_TIPODOC = 55) then
        BEGIN
        /* BUSQUE SI TIENE EGRE_ID, SI NO LO ACTUALIZA */
        SELECT EGRE_ID FROM ANTICIPOS_PROVEEDOR WHERE ANPR_ID = NEW.EGDE_IDDOC INTO :EGANTI;
        if (EGANTI = 0) then
            BEGIN
            OK = 'S';
            UPDATE ANTICIPOS_PROVEEDOR SET EGRE_ID = NEW.EGRE_ID WHERE ANPR_ID = NEW.EGDE_IDDOC;
            END
        END
    /* valide que no se pase del saldo */
    execute procedure saldo_doc_cxpagar(new.egde_tipodoc, new.egde_iddoc, '9999/12/31', 0) returning_values(saldo);
    execute procedure lee_configuracion('CXPAGAR', 'SALDOS', 'DESCONTAR RETENCIONES POR CAUSACION') returning_values (RETES);
    if (SALDO = 0) then
        EXCEPTION DOCUMENTO_ABONO_MAYOR 'EL SALDO DEL DOCUMENTO ' || NEW.egde_prefijo || NEW.egde_numero || ' ES INSUFICIENTE.';
    else
      if (SALDO < 0) then
        BEGIN
        if (RETES = 'SI') then
            begin
            if (saldo > (NEW.egde_abono+NEW.egde_dtof+NEW.egde_difcambio)) then
                EXCEPTION DOCUMENTO_ABONO_MAYOR 'EL SALDO DEL DOCUMENTO ' || NEW.egde_prefijo || NEW.egde_numero || ' ES INSUFICIENTE.';
            end
        ELSE
            begin
            if (saldo > (NEW.egde_abono + NEW.egde_rtfte + NEW.egde_rtiva + NEW.egde_rtica + new.egde_dtof + NEW.egde_difcambio)) then
                EXCEPTION DOCUMENTO_ABONO_MAYOR 'EL SALDO DEL DOCUMENTO ' || NEW.egde_prefijo || NEW.egde_numero || ' ES INSUFICIENTE.';
            end
        END
      else
        BEGIN
        if (RETES = 'SI') then
            begin
            if (saldo < (NEW.egde_abono + NEW.egde_dtof + NEW.egde_difcambio)) then
                EXCEPTION DOCUMENTO_ABONO_MAYOR 'EL SALDO DEL DOCUMENTO ' || NEW.egde_prefijo || NEW.egde_numero || ' ES INSUFICIENTE.';
            end
        ELSE
            begin
            if (saldo < (NEW.egde_abono + NEW.egde_rtfte + NEW.egde_rtiva + NEW.egde_rtica + NEW.egde_dtof + NEW.egde_difcambio)) then
                EXCEPTION DOCUMENTO_ABONO_MAYOR 'EL SALDO DEL DOCUMENTO ' || NEW.egde_prefijo || NEW.egde_numero || ' ES INSUFICIENTE.';
            end
        END
    if (OK = 'N') then
        BEGIN
        if (exists (select sdcp_idref from saldos_doc_cxpagar where sdcp_tiporef = new.egde_tipodoc and
            sdcp_idref = new.egde_iddoc and sdcp_fecha = :FEC)) then
            begin
            /* actualice el saldo del dia */
            UPDATE saldos_doc_cxpagar
                SET SDCP_ABONO = SDCP_ABONO + (NEW.egde_abono + NEW.egde_dtof + NEW.egde_difcambio),
                    SDCP_ABRTFTE = SDCP_ABRTFTE + NEW.egde_RTFTE,
                    SDCP_ABRTIVA = SDCP_ABRTIVA + NEW.egde_RTIVA,
                    SDCP_ABRTICA = SDCP_ABRTICA + NEW.egde_RTICA,
                    SDCP_TRM = :TRM
                WHERE SDCP_TIPOREF = NEW.EGDE_TIPODOC AND SDCP_IDREF = NEW.egde_IDDOC AND SDCP_FECHA = :FEC;
            END
        ELSE
            BEGIN
            /* Inserte un nuevo saldo diario */
            INSERT INTO SALDOS_DOC_CXPAGAR (SDCP_TIPOREF, SDCP_IDREF, SDCP_FECHA, TERC_NIT, SDCP_RTEFTE, SDCP_RTIVA, SDCP_RTICA, SDCP_ABONO, SDCP_ABRTFTE, SDCP_ABRTIVA, SDCP_ABRTICA, SDCP_DEBITO, SDCP_MONTO, SDCP_TRM)
                VALUES (NEW.EGDE_TIPODOC, NEW.EGDE_IDDOC, :FEC, :NIT, 0, 0, 0, (NEW.egde_abono+NEW.egde_dtof+NEW.egde_difcambio), NEW.egde_rtfte, NEW.egde_rtiva, NEW.egde_rtica, 'N', 0, :TRM);
            END
        END
    /* actualice el registro en mov_proveedor (por si son varios items) */
    SELECT TERC_NIT FROM movimiento_proveedor M WHERE M.mvpr_tiporef = NEW.egde_tipodoc AND M.mvpr_idref = NEW.egde_iddoc INTO :NITDOC;
    if (EXISTS (SELECT MVPR_ID FROM MOVIMIENTO_PROVEEDOR WHERE MVPR_TIPOREF = 62 AND MVPR_IDREF = NEW.EGRE_ID AND TERC_NIT = :NITDOC)) then
        begin
        UPDATE movimiento_proveedor
            SET MVPR_MONTO = MVPR_MONTO + (NEW.egde_abono + NEW.egde_dtof + NEW.egde_difcambio),
                MVPR_RTFTE = MVPR_RTFTE + NEW.egde_rtfte,
                MVPR_RTIVA = MVPR_RTIVA + NEW.egde_rtiva,
                MVPR_RTICA = MVPR_RTICA + NEW.egde_rtica,
                MVPR_TRM = :TRM
            WHERE MVPR_TIPOREF = 62 AND MVPR_IDREF = NEW.EGRE_ID AND TERC_NIT = :NITDOC;
        end
    ELSE
        INSERT INTO MOVIMIENTO_PROVEEDOR (MVPR_ID, TERC_NIT, MVPR_TIPOREF, MVPR_IDREF, MVPR_FECHA, MVPR_VENCE, MVPR_CONC, MVPR_MONTO, MVPR_RTFTE, MVPR_RTIVA, MVPR_RTICA, MVPR_DEBITO, MVPR_ABONO, MVPR_PREFIJO, MVPR_NUMERO, MVPR_TRM)
            VALUES (GEN_ID(ID_MOVPROV, 1), :NITDOC, 62, NEW.EGRE_ID, :FEC, :FEC, :CONCEPTO, (NEW.EGDE_ABONO+NEW.egde_dtof+NEW.egde_difcambio), NEW.EGDE_RTFTE, NEW.EGDE_RTIVA, NEW.EGDE_RTICA, 'N', 'S', :PREFIJO, :NUMERO, :TRM);
    END
END
^

SET TERM ; ^

SET TERM ^ ;

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

SET TERM ; ^

SET TERM ^ ;

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

SET TERM ; ^

SET TERM ^ ;

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

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

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

SET TERM ; ^


/* 20091216 */
/* ERROR, EL SUSPEND SE HACIA EN DOCUMENTOS CON ABONOS */
SET TERM ^ ;

CREATE OR ALTER procedure REP_MOVIMIENTO_DIARIO (
    DESDE varchar(20),
    HASTA varchar(20),
    GRPINI varchar(5),
    GRPFIN varchar(5),
    FECINI date,
    ORDEN char(1),
    AGRUPA char(1),
    SUBEMPRESA integer,
    MONEDA integer)
returns (
    NIT varchar(20),
    NOMBRE varchar(60),
    TELEFONO varchar(40),
    CIUDAD varchar(40),
    CODZONA varchar(2),
    NOMZONA varchar(60),
    CODCOBR integer,
    NOMCOBR varchar(60),
    SUCURSAL varchar(10),
    NOMSUC varchar(60),
    DV char(1),
    CODCIUD char(5),
    NOMCIUD varchar(60),
    INICIAL numeric(18,2),
    TIPODOC varchar(8),
    TIPOREF integer,
    IDDOC integer,
    PREFIJO varchar(4),
    NUMERO varchar(6),
    FECHA date,
    VENCE date,
    DEBITO numeric(18,2),
    CREDITO numeric(18,2),
    SALDO numeric(18,2),
    RTFTE numeric(18,2),
    RTIVA numeric(18,2),
    RTICA numeric(18,2),
    CUPO numeric(18,2))
AS
declare variable NITINI VARCHAR(20);
declare variable NITFIN VARCHAR(20);
declare variable NOMINI VARCHAR(20);
declare variable NOMFIN VARCHAR(20);
declare variable OK CHAR(1);
declare variable DB CHAR(1);
declare variable TRM NUMERIC(18,2);
BEGIN
if (ORDEN = 'C') then
    BEGIN
    NITINI = DESDE;
    NITFIN = HASTA;
    NOMINI = '';
    NOMFIN = 'zz';
    END
ELSE
    BEGIN
    NOMINI = DESDE;
    NOMFIN = HASTA;
    NITINI = '';
    NITFIN = 'zz';
    END
  /* Ubique el NIT */
  FOR select T.TERC_NIT, TERC_NOM, TERC_DV, CLSU_TEL, CLSU_CIUDAD, S.COBR_COD, S.ZONA_COD, T.CIUD_COD, CLIE_CUPO, CLCU_COD, CLSU_NOMBRE
    from terceros T, CLIENTES C, CLIENTE_SUCURSALES S
    where C.TERC_NIT  = T.TERC_NIT AND TERC_CLIE = 'S' AND S.TERC_NIT = C.TERC_NIT AND T.TERC_NIT >= :NITINI AND T.TERC_NIT <= :NITFIN AND
        TERC_NOM >= :NOMINI AND TERC_NOM <= :NOMFIN AND ((NOT EXISTS (SELECT AUTO_NUMERO FROM AUTORIZACIONES WHERE AUTO_NITCONTADO = T.terc_nit))) AND
        EXISTS (SELECT MVCL_ID FROM MOVIMIENTO_CLIENTES WHERE TERC_NIT = T.terc_nit AND MVCL_FECHA = :fecini)
    INTO :NIT, :NOMBRE, :DV, :TELEFONO, :CIUDAD, :CODCOBR, :CODZONA, :CODCIUD, :CUPO, :SUCURSAL, :NOMSUC
    DO  
    BEGIN
    SELECT COBR_NOM FROM COBRADORES WHERE COBR_COD = :CODCOBR INTO :NOMCOBR;
    SELECT ZONA_NOM FROM ZONAS WHERE ZONA_COD = :CODZONA INTO :NOMZONA;
    SELECT CIUD_NOM FROM CIUDADES WHERE CIUD_COD = :CODCIUD INTO :NOMCIUD;
    OK = 'N';
    if (AGRUPA = 'Z') then
        BEGIN
        if (GRPINI = '') then
            BEGIN
            if ((CODZONA IS NULL) or (CODZONA >= :GRPINI AND CODZONA <= :GRPFIN)) then
                OK = 'S';
            END
        ELSE
            if (CODZONA >= :GRPINI AND CODZONA <= :GRPFIN) then
                OK = 'S';
        END
    if (AGRUPA = 'I') then
        BEGIN
        if (GRPINI = '') then
            BEGIN
            if ((CODCIUD IS NULL) or (CODCIUD >= :GRPINI AND CODCIUD <= :GRPFIN)) then
                OK = 'S';
            END
        ELSE
            if (CODCIUD >= :GRPINI AND CODCIUD <= :GRPFIN) then
                OK = 'S';
        END
    if (AGRUPA = 'N') then
        OK = 'S';
        
    if (OK = 'S') then
        BEGIN
        INICIAL = 0;
        FECINI = FECINI - 1;
        FOR SELECT MVCL_TIPOREF, MVCL_IDREF FROM MOVIMIENTO_CLIENTES
          WHERE TERC_NIT = :NIT AND MVCL_SUCURSAL = :SUCURSAL AND MVCL_FECHA <= :FECINI AND
            MVCL_ABONO = 'N' AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA)) AND ((:MONEDA = 0) or (MVCL_TRM <> 1))
          INTO :TIPODOC, :IDDOC
          DO
            BEGIN
            EXECUTE PROCEDURE saldo_doc_cartera(TIPODOC, IDDOC, FECINI, MONEDA) returning_values (SALDO);
            INICIAL = INICIAL + SALDO;
            END
        SALDO = INICIAL;
        FECINI = FECINI + 1;
        FOR select mvcl_tiporef, tido_nomcorto, mvcl_idref, mvcl_prefref, mvcl_numref, mvcl_fecha, mvcl_monto, mvcl_debito, mvcl_rtefte, mvcl_rteiva, mvcl_rteica, mvcl_vence, MVCL_TRM
            from movimiento_clientes m, tipo_documento t
            where m.mvcl_tiporef = t.tido_cod and terc_nit = :NIT and MVCL_SUCURSAL = :SUCURSAL AND
                mvcl_fecha = :FECINI and mvcl_tiporef <> 45 AND MVCL_ABONO = 'N' AND
                ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA)) AND ((:MONEDA = 0) or (MVCL_TRM <> 1))
            order by mvcl_fecha, mvcl_tiporef, mvcl_idref
            into :TIPOREF, :TIPODOC, :IDDOC, :PREFIJO, :NUMERO, :FECHA, :DEBITO, :DB, :RTFTE, :RTIVA, :RTICA, :VENCE, :TRM
            DO
            BEGIN
            if ((NOT EXISTS (SELECT D.RECA_ID FROM RECIBOS_CAJA_DETALLE D, RECIBOS_CAJA R
                WHERE R.reca_id = D.reca_id AND D.RCDE_TIPODOC = :TIPOREF AND D.RCDE_IDDOC = :IDDOC AND R.reca_fecha = :FECHA AND R.reca_anulado = 'N')) AND
                (NOT EXISTS (SELECT P.APCL_ID FROM aplicacion_cliente_detalle P, aplicacion_cliente A
                WHERE A.apcl_id = P.apcl_id AND P.acde_tipodoc = :TIPOREF AND P.acde_iddoc = :IDDOC AND A.apcl_fecha = :FECHA AND A.apcl_anulado = 'N'))) then
                BEGIN
                if (RTFTE IS NULL) then
                    RTFTE = 0;
                if (RTIVA IS NULL) then
                    RTIVA = 0;
                if (RTICA IS NULL) then
                    RTICA = 0;
                if (DB = 'N') then
                    BEGIN
                    CREDITO = DEBITO;
                    DEBITO = 0;
                    RTFTE = rtfte * -1;
                    RTIVA = rtiva * -1;
                    RTICA = rtica * -1;
                    END
                ELSE
                    CREDITO = 0;
                if ((MONEDA <> 0) AND (TRM <> 0)) then
                    BEGIN
                    SALDO = saldo / TRM;
                    DEBITO = DEBITO / TRM;
                    CREDITO = CREDITO / TRM;
                    RTFTE = RTFTE / TRM;
                    RTIVA = RTIVA / TRM;
                    RTICA = RTICA / TRM;
                    END
                SUSPEND;
                END
            END
        END
    if (AGRUPA = 'C') then
        BEGIN
        FOR SELECT DISTINCT COBR_COD FROM MOVIMIENTO_CLIENTES
            WHERE TERC_NIT = :NIT AND MVCL_SUCURSAL = :SUCURSAL AND MVCL_FECHA <= :FECINI AND
            MVCL_ABONO = 'N' AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA))
            INTO :codcobr
            DO
            BEGIN
            OK = 'N';
            if (GRPINI = '') then
                BEGIN
                if ((CODCOBR IS NULL) or (CODCOBR >= :GRPINI AND CODCOBR <= :GRPFIN)) then
                    OK = 'S';
                END
            ELSE
                if (CODCOBR >= :GRPINI AND CODCOBR <= :GRPFIN) then
                    OK = 'S';
            if (OK = 'S') then
                BEGIN
                SELECT COBR_NOM FROM COBRADORES WHERE COBR_COD = :CODCOBR INTO :NOMCOBR;
                INICIAL = 0;
                FECINI = FECINI - 1;
                FOR SELECT MVCL_TIPOREF, MVCL_IDREF FROM MOVIMIENTO_CLIENTES
                  WHERE TERC_NIT = :NIT AND MVCL_SUCURSAL = :SUCURSAL AND MVCL_FECHA <= :FECINI AND ((:MONEDA = 0) or (MVCL_TRM <> 1)) AND
                  COBR_COD = :CODCOBR AND MVCL_ABONO = 'N' AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA))
                  INTO :TIPODOC, :IDDOC
                  DO
                    BEGIN
                    EXECUTE PROCEDURE saldo_doc_cartera(TIPODOC, IDDOC, FECINI, MONEDA) returning_values (SALDO);
                    INICIAL = INICIAL + SALDO;
                    END
                SALDO = INICIAL;
                FECINI = FECINI + 1;
                FOR select mvcl_tiporef, tido_nomcorto, mvcl_idref, mvcl_prefref, mvcl_numref, mvcl_fecha, mvcl_monto, mvcl_debito, mvcl_rtefte, mvcl_rteiva, mvcl_rteica, mvcl_vence, mvcl_trm
                    from movimiento_clientes m, tipo_documento t
                    where m.mvcl_tiporef = t.tido_cod and terc_nit = :NIT and MVCL_SUCURSAL = :SUCURSAL AND
                    mvcl_fecha = :FECINI and mvcl_tiporef <> 45 AND ((:MONEDA = 0) or (MVCL_TRM <> 1)) AND
                    COBR_COD = :CODCOBR AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA)) AND MVCL_ABONO = 'N'
                    order by mvcl_fecha, mvcl_tiporef, mvcl_idref
                    into :TIPOREF, :TIPODOC, :IDDOC, :PREFIJO, :NUMERO, :FECHA, :DEBITO, :DB, :RTFTE, :RTIVA, :RTICA, :VENCE, :TRM
                    DO
                    if ((NOT EXISTS (SELECT D.RECA_ID FROM RECIBOS_CAJA_DETALLE D, RECIBOS_CAJA R
                        WHERE R.reca_id = D.reca_id AND D.RCDE_TIPODOC = :TIPOREF AND D.RCDE_IDDOC = :IDDOC AND R.reca_fecha = :FECHA AND R.reca_anulado = 'N')) AND
                        (NOT EXISTS (SELECT P.APCL_ID FROM aplicacion_cliente_detalle P, aplicacion_cliente A
                        WHERE A.apcl_id = P.apcl_id AND P.acde_tipodoc = :TIPOREF AND P.acde_iddoc = :IDDOC AND A.apcl_fecha = :FECHA AND A.apcl_anulado = 'N'))) then
                        BEGIN
                        if (RTFTE IS NULL) then
                            RTFTE = 0;
                        if (RTIVA IS NULL) then
                            RTIVA = 0;
                        if (RTICA IS NULL) then
                            RTICA = 0;
                        if (DB = 'N') then
                            BEGIN
                            CREDITO = DEBITO;
                            DEBITO = 0;
                            RTFTE = rtfte * -1;
                            RTIVA = rtiva * -1;
                            RTICA = rtica * -1;
                            END
                        ELSE
                            CREDITO = 0;
                        if ((MONEDA <> 0) AND (TRM <> 0)) then
                            BEGIN
                            SALDO = saldo / TRM;
                            DEBITO = DEBITO / TRM;
                            CREDITO = CREDITO / TRM;
                            RTFTE = RTFTE / TRM;
                            RTIVA = RTIVA / TRM;
                            RTICA = RTICA / TRM;
                            END
                        SUSPEND;
                        END
                END  /* ok = S */
            END  /* FOR COBRADOR */
        END  /* AGRUPA C */
    END  /* FOR NIT */
END
^

SET TERM ; ^



/* 20091216C */
/* MONTO ORIGINAL DEL DOCUMENTO ESTABA SIN SIGNO Y FALLABA EL CALCULO DEL ABONO YA QUE EL SALDO SI TIENE SIGNO */
SET TERM ^ ;

CREATE OR ALTER procedure REP_CARTERA_CLIENTES (
    DESDE varchar(20),
    HASTA varchar(20),
    GRPINI varchar(5),
    GRPFIN varchar(5),
    FECHA date,
    ORDEN char(1),
    AGRUPA char(1),
    SUBEMPRESA integer,
    GRUPCART integer,
    MONEDA integer)
returns (
    NIT varchar(20),
    NOMBRE varchar(60),
    DIR varchar(60),
    TELEFONO varchar(40),
    CIUDAD varchar(40),
    CONTACTO varchar(60),
    EMAIL varchar(100),
    FAX varchar(25),
    CEL varchar(25),
    CODCLI varchar(20),
    CODZONA varchar(2),
    NOMZONA varchar(60),
    CODCOBR integer,
    NOMCOBR varchar(60),
    SUCURSAL varchar(10),
    NOMSUC varchar(60),
    DV char(1),
    CODCIUD char(5),
    NOMCIUD varchar(60),
    TIPO integer,
    ID integer,
    PREFIJO varchar(4),
    NUMERO varchar(6),
    CONCEPTO varchar(60),
    MONTO numeric(18,2),
    SALDO numeric(18,2),
    PROVISIONAL numeric(18,2),
    RTFTE numeric(18,2),
    RTIVA numeric(18,2),
    RTICA numeric(18,2),
    DTOF numeric(18,2),
    TIPONOM varchar(8),
    FECDOC date,
    VENCE date,
    DIAS integer,
    CUPO numeric(18,2),
    DISPONIBLE numeric(18,2),
    NOTA varchar(256),
    OBS blob sub_type 0 segment size 80,
    GRUPCOD integer,
    GRUPNOM varchar(30))
AS
DECLARE VARIABLE NITINI VARCHAR(20);
DECLARE VARIABLE NITFIN VARCHAR(20);
DECLARE VARIABLE NOMINI VARCHAR(20);
DECLARE VARIABLE NOMFIN VARCHAR(20);
DECLARE VARIABLE OK CHAR(1);
DECLARE VARIABLE FOV CHAR(11);
DECLARE VARIABLE DTOAPL NUMERIC(18,2);
DECLARE VARIABLE FECDTO DATE;
DECLARE VARIABLE FECNOTA VARCHAR(10);
DECLARE VARIABLE AUXNOTA VARCHAR(256);
DECLARE VARIABLE IDNOTA INTEGER;
declare variable descnt_prov char(2);
declare variable AUTORET VARCHAR(10);
declare variable FAUTORET DATE;
declare variable INCLANTI CHAR(2);
DECLARE VARIABLE TRM NUMERIC(18,2);
declare variable DB CHAR(1);
BEGIN
if (ORDEN = 'C') then
    BEGIN
    NITINI = DESDE;
    NITFIN = HASTA;
    NOMINI = '';
    NOMFIN = 'zz';
    END
ELSE
    BEGIN
    NOMINI = DESDE;
    NOMFIN = HASTA;
    NITINI = '';
    NITFIN = 'zz';
    END
  EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'DESCONTAR RECIBOS PROVISIONALES EN INFORMES DE CARTERA') RETURNING_VALUES (:descnt_prov);
  EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'INCLUIR ANTICIPOS DE CLIENTES EN REPORTES Y CONSULTAS DE CARTERA') returning_values (INCLANTI);
  EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'FECHA AUTORETENEDOR NO DESCONTAR RETENCIONES DEL SALDO PERO SI CONTABILIZARLAS') returning_values (AUTORET);
  EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'ANALISIS DE CARTERA CON FECHA FACTURA O VENCIMIENTO') RETURNING_VALUES (FOV);
  if (AUTORET <> '') then
    FAUTORET = CAST(AUTORET AS DATE);
  else
    FAUTORET = '9999/12/31';
  /* Ubique el NIT */
  FOR select C.TERC_NIT, TERC_NOM, TERC_DV, CLSU_DIR, CLSU_TEL, CLSU_CIUDAD, S.COBR_COD, S.ZONA_COD, T.CIUD_COD, CLIE_CUPO, CLCU_COD, CLSU_NOMBRE, t.terc_obs, C.GRCA_COD, TERC_CONTACTO, TERC_EMAIL, TERC_FAX, TERC_CEL, CLIE_COD
    from terceros T, CLIENTES C, CLIENTE_SUCURSALES S
    where C.TERC_NIT = T.TERC_NIT AND TERC_CLIE = 'S' AND S.TERC_NIT = C.TERC_NIT AND C.TERC_NIT >= :NITINI AND C.TERC_NIT <= :NITFIN AND
        TERC_NOM >= :NOMINI AND TERC_NOM <= :NOMFIN AND ((:GRUPCART = 0) or (C.GRCA_COD = :GRUPCART))
    INTO :NIT, :NOMBRE, :DV, :DIR, :TELEFONO, :CIUDAD, :CODCOBR, :CODZONA, :CODCIUD, :CUPO, :SUCURSAL, :NOMSUC, :obs, :GRUPCOD, :CONTACTO, :EMAIL, :FAX, :CEL, :CODCLI
    DO  
    BEGIN
    if (CODCOBR IS NOT NULL) then
        SELECT COBR_NOM FROM COBRADORES  WHERE COBR_COD = :CODCOBR INTO :NOMCOBR;
    if (CODZONA IS NOT NULL) then
        SELECT ZONA_NOM FROM ZONAS WHERE ZONA_COD = :CODZONA INTO :NOMZONA;
    if (CODCIUD IS NOT NULL) then
        SELECT CIUD_NOM FROM CIUDADES  WHERE CIUD_COD = :CODCIUD INTO :NOMCIUD;
    SELECT GRCA_NOMBRE FROM GRUPO_CARTERA WHERE GRCA_COD = :GRUPCOD INTO :GRUPNOM;
    DISPONIBLE = CUPO;
    OK = 'N';
    if (AGRUPA = 'Z') then
        BEGIN
        if (GRPINI = '') then
            BEGIN
            if ((CODZONA IS NULL) or (CODZONA >= :GRPINI AND CODZONA <= :GRPFIN)) then
                OK = 'S';
            END
        ELSE
            if (CODZONA >= :GRPINI AND CODZONA <= :GRPFIN) then
                OK = 'S';
        END
    if (AGRUPA = 'I') then
        BEGIN
        if (GRPINI = '') then
            BEGIN
            if ((CODCIUD IS NULL) or (CODCIUD >= :GRPINI AND CODCIUD <= :GRPFIN)) then
                OK = 'S';
            END
        ELSE
            if (CODCIUD >= :GRPINI AND CODCIUD <= :GRPFIN) then
                OK = 'S';
        END
    if (AGRUPA = 'N') then
        OK = 'S';
        
    if (OK = 'S') then
        BEGIN
        /* BUSQUE EN SALDOS_DOC_CARTERA LOS QUE TENGAN SALDO > 0 */
        FOR SELECT MVCL_TIPOREF, MVCL_IDREF, MVCL_PREFREF, MVCL_NUMREF, MVCL_FECHA, MVCL_VENCE, MVCL_CONC, MVCL_MONTO, MVCL_DEBITO
            FROM MOVIMIENTO_CLIENTES WHERE TERC_NIT = :NIT AND MVCL_SUCURSAL = :SUCURSAL AND MVCL_FECHA <= :FECHA AND
            MVCL_ABONO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) AND ((:MONEDA = 0) or (MVCL_TRM <> 1))
            INTO :TIPO, :ID, :PREFIJO, :NUMERO, :FECDOC, :VENCE, :CONCEPTO, :MONTO, :DB
            DO
            BEGIN
            if (DB = 'N') then
                MONTO = MONTO * -1;
            if ((inclanti = 'SI') or (TIPO <> 45)) then
                BEGIN
                EXECUTE PROCEDURE saldo_doc_cartera(TIPO, ID, FECHA, MONEDA) returning_values (SALDO);
                if (SALDO <> 0) then
                    BEGIN
                    PROVISIONAL = 0;
                    if (FOV = 'FECHA') then
                       DIAS = FECHA - FECDOC;
                    ELSE
                      DIAS = FECHA - VENCE;
                    DISPONIBLE = DISPONIBLE - SALDO;
                    SELECT TIDO_NOMCORTO FROM TIPO_DOCUMENTO WHERE TIDO_COD = :TIPO INTO :TIPONOM;
                    if (TIPO = 41) then
                        SELECT NDCL_DTOFMONTO, NDCL_FECHADTO, NDCL_TRM FROM NOTAS_DEBITO_CLIENTES
                            WHERE NDCL_ID = :ID INTO :DTOF, :FECDTO, :TRM;
                    if (TIPO = 42) then
                        SELECT 0, :FECDOC, 1 FROM NOTAS_CREDITO_CLIENTES
                            WHERE NCCL_ID = :ID INTO :DTOF, :FECDTO, :TRM;
                    if (TIPO = 45) then
                        SELECT ANCL_DTOFMONTO, ANCL_DTOFECHA, ANCL_TRM FROM ANTICIPOS_CLIENTE
                            WHERE ANCL_ID = :ID INTO :DTOF, :FECDTO, :TRM;
                    if (TIPO = 31) then
                        SELECT FACT_DTOFMONTO, FACT_DTOFFECHA, FACT_TRM FROM FACTURAS
                            WHERE FACT_ID = :ID INTO :DTOF, :FECDTO, :TRM;
                    if (TIPO = 33) then
                        SELECT 0, :FECDOC, 1 FROM devoluciones_ventas
                            WHERE DEVT_ID = :ID INTO :DTOF, :FECDTO, :TRM;
                    if ((MONEDA <> 0) AND (TRM <> 0)) then
                        DTOF = DTOF / TRM;
                    if (DTOF IS NULL) then
                        DTOF = 0;
                    if (DTOF <> 0) then
                        BEGIN
                        SELECT SUM(RCDE_DTOF), MAX(RECA_TRM) FROM RECIBOS_CAJA_DETALLE D, RECIBOS_CAJA R
                            WHERE R.reca_id = D.reca_id AND RCDE_IDDOC = :ID AND RCDE_TIPODOC = :TIPO
                            INTO :DTOAPL, :TRM;
                        if (DTOAPL IS NULL) then
                            DTOAPL = 0;
                        if ((MONEDA <> 0) AND (TRM <> 1)) then
                            DTOAPL = DTOAPL / TRM;
                        DTOF = DTOF - DTOAPL;
                        /* SI YA SE VENCIO DEJELO EN CERO */
                        if (FECDTO < FECHA) then
                            DTOF = 0;
                        END
                    if (MONEDA = 0) then
                        SELECT SUM(SDCA_RTFTE - SDCA_ABRTFTE), SUM(SDCA_RTIVA - SDCA_ABRTIVA), SUM(SDCA_RTICA - SDCA_ABRTICA)
                            FROM SALDOS_DOC_CARTERA WHERE SDCA_TIPOREF = :TIPO AND SDCA_IDREF = :ID
                            INTO :RTFTE, :RTIVA, :RTICA;
                    ELSE
                        SELECT SUM((SDCA_RTFTE - SDCA_ABRTFTE)/SDCA_TRM), SUM((SDCA_RTIVA - SDCA_ABRTIVA)/SDCA_TRM), SUM((SDCA_RTICA - SDCA_ABRTICA)/SDCA_TRM)
                            FROM SALDOS_DOC_CARTERA WHERE SDCA_TIPOREF = :TIPO AND SDCA_IDREF = :ID
                            INTO :RTFTE, :RTIVA, :RTICA;
                    if (RTFTE IS NULL) then
                        RTFTE = 0;
                    if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) THEN
                        BEGIN
                        if (RTFTE > 0) then
                            RTFTE = 0;
                        END
                    ELSE
                        BEGIN
                        if (RTFTE < 0) then
                            RTFTE = 0;
                        END
                    if (RTIVA IS NULL) then
                        RTIVA = 0;
                    if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) THEN
                        BEGIN
                        if (RTIVA > 0) then
                            RTIVA = 0;
                        END
                    ELSE
                        BEGIN
                        if (RTIVA < 0) then
                            RTIVA = 0;
                        END
                    if (RTICA IS NULL) then
                        RTICA = 0;
                    if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) THEN
                        BEGIN
                        if (RTICA > 0) then
                            RTICA = 0;
                        END
                    ELSE
                        BEGIN
                        if (RTICA < 0) then
                            RTICA = 0;
                        END
                    if (FAUTORET <= FECDOC) then
                        RTFTE = 0;
                    /* SI TIENE NOTA AGREGUELA */
                    SELECT MAX(NOCL_ID) FROM NOTAS_CLIENTES WHERE TERC_NIT = :NIT AND CLSU_COD = :SUCURSAL AND NOCL_TIPODOC = :TIPO AND NOCL_IDDOC = :ID INTO :IDNOTA;
                    if (IDNOTA IS NOT NULL) then
                        BEGIN
                        SELECT cast(NOCL_FECHA as char(10)), NOCL_TEXTO FROM NOTAS_CLIENTES
                            WHERE NOCL_ID = :IDNOTA INTO :FECNOTA, :AUXNOTA;
                        if (STRLEN(AUXNOTA) < 244) then
                            NOTA = FECNOTA || ':' || AUXNOTA;
                        ELSE
                            NOTA = AUXNOTA;
                        END
                    else
                        NOTA = '';
                    SUSPEND;
                    END  /* SALDO <> 0 */
                END  /* NO ANTICIPO */
            END  /* FOR */
        /* AGREGUE LOS RECIBOS PROVISIONALES CON SIGNO NEGATIVO */
        FOR SELECT 65, MAX(P.RCPR_ID), MAX(PREF_PRE), MAX(RCPR_NUMERO), MAX(RCPR_FECHA), MAX(RCPR_CONC), SUM(RPDE_ABONO * -1), SUM(RPDE_RTFTE*-1), SUM(RPDE_RTIVA*-1), SUM(RPDE_RTICA*-1), MAX(RCPR_TRM)
            FROM RECIBO_PROVISIONAL P, recibo_provisional_detalle D
            WHERE P.rcpr_id = D.rcpr_id AND P.TERC_NIT = :NIT AND RCPR_FECHA <= :FECHA AND RCPR_ANULADO = 'N' AND
            ((RCPR_FECCRUCE IS NULL) or (RCPR_FECCRUCE > :FECHA)) AND RPDE_SUCURSAL = :SUCURSAL AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY P.rcpr_id
            INTO :TIPO, :ID, :PREFIJO, :NUMERO, :FECDOC, :CONCEPTO, :PROVISIONAL, :rtfte,  :RTIVA, :RTICA, :TRM
            DO
            BEGIN
            if ((MONEDA <> 0) AND (TRM <> 0)) then
                PROVISIONAL = PROVISIONAL / TRM;
            if (:descnt_prov = 'NO') then
              SALDO = 0;
            else
              SALDO = :PROVISIONAL;
            SELECT TIDO_NOMCORTO FROM TIPO_DOCUMENTO WHERE TIDO_COD = :TIPO INTO :TIPONOM;
            /* CALCULE EL VENCIMIENTO DEL ULTIMO DOCUMENTO POSFECHADO */
            SELECT MAX(RPPA_FECHA) FROM recibo_provisional_pago WHERE RCPR_ID = :ID INTO :VENCE;
            DIAS = VENCE - FECHA;
            SUSPEND;
            END
        END
    if (AGRUPA = 'C') then
        BEGIN
        FOR SELECT DISTINCT COBR_COD FROM MOVIMIENTO_CLIENTES
            WHERE TERC_NIT = :NIT AND MVCL_SUCURSAL = :SUCURSAL AND MVCL_FECHA <= :FECHA AND
            MVCL_ABONO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            INTO :codcobr
            DO
            BEGIN
            OK = 'N';
            if (GRPINI = '') then
                BEGIN
                if ((CODCOBR IS NULL) or (CODCOBR >= :GRPINI AND CODCOBR <= :GRPFIN)) then
                    OK = 'S';
                END
            ELSE
                if (CODCOBR >= :GRPINI AND CODCOBR <= :GRPFIN) then
                    OK = 'S';
            if (OK = 'S') then
                BEGIN
                SELECT COBR_NOM FROM COBRADORES  WHERE COBR_COD = :CODCOBR INTO :NOMCOBR;
                /* BUSQUE EN SALDOS_DOC_CARTERA LOS QUE TENGAN SALDO > 0 */
                FOR SELECT MVCL_TIPOREF, MVCL_IDREF, MVCL_PREFREF, MVCL_NUMREF, MVCL_FECHA, MVCL_VENCE, MVCL_CONC, MVCL_MONTO, MVCL_DEBITO
                    FROM MOVIMIENTO_CLIENTES WHERE TERC_NIT = :NIT AND MVCL_SUCURSAL = :SUCURSAL AND MVCL_FECHA <= :FECHA AND
                    MVCL_ABONO = 'N' AND COBR_COD = :codcobr AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) AND
                    ((:MONEDA = 0) or (MVCL_TRM <> 1))
                    INTO :TIPO, :ID, :PREFIJO, :NUMERO, :FECDOC, :VENCE, :CONCEPTO, :MONTO, :DB
                    DO
                    BEGIN
                    if (DB = 'N') then
                        MONTO = MONTO * -1;
                    if ((inclanti = 'SI') or (TIPO <> 45)) then
                        BEGIN
                        EXECUTE PROCEDURE saldo_doc_cartera(TIPO, ID, FECHA, MONEDA) returning_values (SALDO);
                        if (SALDO <> 0) then
                            BEGIN
                            PROVISIONAL = 0;
                            if (FOV = 'FECHA') then
                               DIAS = FECHA - FECDOC;
                            ELSE
                              DIAS = FECHA - VENCE;
                            DISPONIBLE = DISPONIBLE - SALDO;
                            SELECT TIDO_NOMCORTO FROM TIPO_DOCUMENTO WHERE TIDO_COD = :TIPO INTO :TIPONOM;
                            if (TIPO = 41) then
                                SELECT NDCL_DTOFMONTO, NDCL_FECHADTO, NDCL_TRM FROM NOTAS_DEBITO_CLIENTES
                                    WHERE NDCL_ID = :ID INTO :DTOF, :FECDTO, :TRM;
                            if (TIPO = 42) then
                                SELECT 0, :FECDOC, 1 FROM NOTAS_CREDITO_CLIENTES
                                    WHERE NCCL_ID = :ID INTO :DTOF, :FECDTO, :TRM;
                            if (TIPO = 45) then
                                SELECT ANCL_DTOFMONTO, ANCL_DTOFECHA, ANCL_TRM FROM ANTICIPOS_CLIENTE
                                    WHERE ANCL_ID = :ID INTO :DTOF, :FECDTO, :TRM;
                            if (TIPO = 31) then
                                SELECT FACT_DTOFMONTO, FACT_DTOFFECHA, FACT_TRM FROM FACTURAS
                                    WHERE FACT_ID = :ID INTO :DTOF, :FECDTO, :TRM;
                            if (TIPO = 33) then
                                SELECT 0, :FECDOC, 1 FROM devoluciones_ventas
                                    WHERE DEVT_ID = :ID INTO :DTOF, :FECDTO, :TRM;
                            if (DTOF IS NULL) then
                                DTOF = 0;
                            if ((MONEDA <> 0) AND (TRM <> 0)) then
                                DTOF = DTOF / TRM;
                            if (DTOF <> 0) then
                                BEGIN
                                SELECT SUM(RCDE_DTOF) FROM RECIBOS_CAJA_DETALLE WHERE RCDE_IDDOC = :ID AND RCDE_TIPODOC = :TIPO INTO :DTOAPL;
                                if (DTOAPL IS NULL) then
                                    DTOAPL = 0;
                                DTOF = DTOF - DTOAPL;
                                /* SI YA SE VENCIO DEJELO EN CERO */
                                if (FECDTO < FECHA) then
                                    DTOF = 0;
                                END
                            SELECT SUM(SDCA_RTFTE - SDCA_ABRTFTE), SUM(SDCA_RTIVA - SDCA_ABRTIVA), SUM(SDCA_RTICA - SDCA_ABRTICA)
                                FROM SALDOS_DOC_CARTERA WHERE SDCA_TIPOREF = :TIPO AND SDCA_IDREF = :ID INTO :RTFTE, :RTIVA, :RTICA;
                            if (RTFTE IS NULL) then
                                RTFTE = 0;
                            if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) THEN
                                BEGIN
                                if (RTFTE > 0) then
                                    RTFTE = 0;
                                END
                            ELSE
                                BEGIN
                                if (RTFTE < 0) then
                                    RTFTE = 0;
                                END
                            if (FAUTORET <= FECDOC) then
                                RTFTE = 0;
                            if (RTIVA IS NULL) then
                                RTIVA = 0;
                            if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) THEN
                                BEGIN
                                if (RTIVA > 0) then
                                    RTIVA = 0;
                                END
                            ELSE
                                BEGIN
                                if (RTIVA < 0) then
                                    RTIVA = 0;
                                END
                            if (RTICA IS NULL) then
                                RTICA = 0;
                            if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) THEN
                                BEGIN
                                if (RTICA > 0) then
                                    RTICA = 0;
                                END
                            ELSE
                                BEGIN
                                if (RTICA < 0) then
                                    RTICA = 0;
                                END
                            /* SI TIENE NOTA AGREGUELA */
                            SELECT MAX(NOCL_ID) FROM NOTAS_CLIENTES WHERE TERC_NIT = :NIT AND CLSU_COD = :SUCURSAL AND NOCL_TIPODOC = :TIPO AND NOCL_IDDOC = :ID INTO :IDNOTA;
                            if (IDNOTA IS NOT NULL) then
                                BEGIN
                                SELECT cast(NOCL_FECHA as char(10)), NOCL_TEXTO FROM NOTAS_CLIENTES
                                    WHERE NOCL_ID = :IDNOTA INTO :FECNOTA, :AUXNOTA;
                                if (STRLEN(AUXNOTA) < 244) then
                                    NOTA = FECNOTA || ':' || AUXNOTA;
                                ELSE
                                    NOTA = AUXNOTA;
                                END
                            else
                                NOTA = '';
                            SUSPEND;
                            END  /* SALDO <> 0 */
                        END  /* NO ANTICIPO */
                    END  /* FOR */
                /* AGREGUE LOS RECIBOS PROVISIONALES CON SIGNO NEGATIVO */
                FOR SELECT 65, MAX(P.RCPR_ID), MAX(PREF_PRE), MAX(RCPR_NUMERO), MAX(RCPR_FECHA), MAX(RCPR_CONC), SUM(RPDE_ABONO * -1), SUM(RPDE_RTFTE*-1), SUM(RPDE_RTIVA*-1), SUM(RPDE_RTICA*-1), MAX(RCPR_TRM)
                    FROM RECIBO_PROVISIONAL P, recibo_provisional_detalle D
                    WHERE P.rcpr_id = D.rcpr_id AND P.TERC_NIT = :NIT AND P.VEND_COD = :codcobr AND RCPR_FECHA <= :FECHA AND RCPR_ANULADO = 'N' AND
                    ((RCPR_FECCRUCE IS NULL) or (RCPR_FECCRUCE > :FECHA)) AND RPDE_SUCURSAL = :SUCURSAL AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                    GROUP BY P.rcpr_id
                    INTO :TIPO, :ID, :PREFIJO, :NUMERO, :FECDOC, :CONCEPTO, :PROVISIONAL, :rtfte,  :RTIVA, :RTICA, :TRM
                    DO
                    BEGIN
                    if ((MONEDA <> 0) AND (TRM <> 0)) then
                        PROVISIONAL = PROVISIONAL / TRM;
                    MONTO = PROVISIONAL;
                    if (:descnt_prov = 'NO') then
                      SALDO = 0;
                    else
                      SALDO = :PROVISIONAL;
                    SELECT TIDO_NOMCORTO FROM TIPO_DOCUMENTO WHERE TIDO_COD = :TIPO INTO :TIPONOM;
                    /* CALCULE EL VENCIMIENTO DEL ULTIMO DOCUMENTO POSFECHADO */
                    SELECT MAX(RPPA_FECHA) FROM recibo_provisional_pago WHERE RCPR_ID = :ID INTO :VENCE;
                    DIAS = VENCE - FECHA;
                    SUSPEND;
                    END
                END /* ok */
            END  /* FOR COBR */
        END  /* AGRUPA = C */
    END  /* FOR NIT */
END
^

SET TERM ; ^



/* 20091216D */
/* TOME LA SUCURSAL DEL PREFIJO SI LA NUMERACION NO ES POR CUENTA Y DE LA CAJA SI ES POR CUENTA */
SET TERM ^ ;

CREATE OR ALTER TRIGGER MOVIMIENTO_CLIENTES_BI FOR MOVIMIENTO_CLIENTES
ACTIVE BEFORE INSERT POSITION 0
as
declare variable POR_CTA CHAR(2);
begin
/* AGREGE LA SUCURSAL QUE REGISTRO BASADO EN EL PREFIJO */
if (NEW.mvcl_tiporef <> 77) then
    SELECT SUCU_ID FROM PREFIJOS WHERE PREF_PRE = NEW.mvcl_prefref AND TIDO_COD = NEW.mvcl_tiporef
        INTO NEW.sucu_id;
ELSE
    BEGIN
    EXECUTE PROCEDURE LEE_configuracion('BANCOS', 'DEVOLUCIONES', 'CONSECUTIVOS POR CUENTA') returning_values(:POR_CTA);
    if (por_cta = 'SI') then
        SELECT SUCU_ID FROM CAJAS C, DEVOLUCION_CHEQUES D
            WHERE DVCH_ID = NEW.mvcl_idref AND D.caja_id = C.caja_id INTO NEW.sucu_id;
    else
        SELECT SUCU_ID FROM prefijos where tido_cod = 77 and pref_pre = new.mvcl_prefref into new.sucu_id;
    END

end
^

SET TERM ; ^



/* 20091216E */
/* COSTO EN REPORTE DE ORDENES DE PRODUCCION */

SET TERM ^ ;

CREATE OR ALTER procedure REP_PRODUCCION (
    FECINI date,
    FECFIN date,
    PREFINI varchar(4),
    PREFFIN varchar(4),
    CLIENTE varchar(20),
    MAQUI integer,
    DETALLE char(1),
    SUBEMPRESA integer)
returns (
    FECHA date,
    PREF varchar(4),
    NUMERO varchar(6),
    NIT varchar(20),
    NOMCLI varchar(60),
    MAQUINA varchar(60),
    PRODUCTO varchar(20),
    DESPROD varchar(60),
    CANT numeric(18,4),
    PESO numeric(18,4),
    FECHAMON date,
    OK numeric(18,4),
    MAL numeric(18,4),
    FALTAN numeric(18,4),
    FECHAFIN date,
    OBS varchar(255),
    ESTADO varchar(20),
    COSTO numeric(18,4))
AS
declare variable ID INTEGER;
begin
FOR SELECT PROR_ID, O.pref_pre, PROR_NUMERO, PROR_FECHA, PROR_PRODUCTO, PROR_DESC, PROR_ESTADO,
    PROR_CANT, PROR_PESO, PROR_OBS, PROR_NIT, PROR_NOMCLIENTE, PROR_CANT, PROR_MAQUINA, PROR_FECMONTAJE
    FROM produccion_orden O, PREFIJOS P
    WHERE O.pror_fecha >= :FECINI AND O.pror_fecha <= :FECFIN AND O.pref_pre >= :prefini AND O.pref_pre <= :preffin
     AND P.PREF_PRE = O.pref_pre AND P.TIDO_COD = 19 AND ((P.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) AND PROR_ANULADO = 'N'
     AND ((:cliente = '') OR (PROR_NIT = :cliente)) AND ((:MAQUI = 0) or (PROR_MAQUINA = :MAQUI))
    ORDER BY PROR_FECHA, PROR_ID
    into :ID, :PREF, :NUMERO, :FECHA, :producto, :desprod, :estado,
    :cant, :peso, :OBS, :nit, :nomcli, :cant, :maquina, :fechamon
    DO
    BEGIN
    if (ESTADO = 'A') then
        ESTADO = 'Act';
    if (ESTADO = 'C') then
        ESTADO = 'Co';
    if (ESTADO = 'X') then
        ESTADO = 'Anu';
    SELECT ENMA_NOMBRE FROM ensamble_maquina WHERE ENMA_ID = :maquina INTO :maquina;
    if (DETALLE = 'S') then
        BEGIN
        FOR SELECT PREN_CANTOK, PREN_CANTMAL, E.prde_fecha, E.prde_obs, E.prde_costo
            FROM produccion_entrada_det D, produccion_entrada_enc E
            WHERE E.prde_id = D.prde_id AND E.pror_id = :id INTO :ok,  :mal, :fechafin, :obs, :costo
            DO
            BEGIN
            SUSPEND;
            END
        END
    else
        BEGIN
        SELECT SUM(PREN_CANTOK), SUM(PREN_CANTMAL), MAX(E.prde_fecha), AVG(E.prde_costo)
            FROM produccion_entrada_det D, produccion_entrada_enc E
            WHERE E.prde_id = D.prde_id AND E.pror_id = :id INTO :ok,  :mal, :fechafin, :costo;
        FALTAN = CANT - OK;
        SUSPEND;
        END
    END
end
^

SET TERM ; ^


SET TERM ^ ;

CREATE OR ALTER procedure IMPR_PRODUCCION_ENT (
    ID integer)
returns (
    PREF varchar(4),
    NUMERO varchar(6),
    FECHA date,
    ITEM integer,
    TURNO integer,
    CANTOK numeric(18,4),
    CANTMAL numeric(18,4),
    UNIDAD varchar(8),
    BODITEM varchar(2),
    OPERARIO varchar(60),
    OBSDET blob sub_type 1 segment size 80,
    PESO numeric(18,4),
    COSTO numeric(18,4))
AS
BEGIN
FOR SELECT PRDE_PREF, PRDE_NUMERO, PRDE_FECHA, PREN_ITEM, PREN_TURNO, PREN_CANTOK, PREN_CANTMAL, PREN_UNIDAD, BODE_COD, PREN_PESO, PREN_OPERARIO, PREN_OBS, E.prde_costo
    FROM produccion_entrada_det D, produccion_entrada_enc e WHERE D.prde_id = e.prde_id and e.pror_id = :ID and e.prde_anulado = 'N'
    ORDER BY PREN_ITEM
    INTO :PREF, :NUMERO, :FECHA, :ITEM, :TURNO, :CANTOK, :CANTMAL, :UNIDAD, :BODITEM, :PESO, :operario, :obsdet, :costo
    DO
      BEGIN
      SELECT ENOP_NOMBRE FROM ENSAMBLE_OPERARIO WHERE ENOP_ID = :operario INTO :operario;
      SUSPEND;
      END
end
^

SET TERM ; ^


/* 20091217 */
/* LEIA EL PARAMETRO DE COMISIONES X VENTA SOBRE EL TOTAL Y NO EL DE COBRO */
SET TERM ^ ;

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

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

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

SET TERM ; ^



/* 20091218 */

INSERT INTO CONFIGURACION (CONF_MODULO, CONF_CATEGORIA, CONF_PROPIEDAD, CONF_VALOR, CONF_POSIBLES, CONF_AYUDA) VALUES ('INVENTARIO', 'TRASLADOS', 'VER ORDENES DE INVENTARIO DE TODAS LAS AGENCIAS', 'SI', 'SI,NO', 'SI:Permite llamar una orden de cualquier agencia para hacer un traslado. NO: Solo puede llamar ordenes de la misma agencia para hacer los traslados');
commit work;


/* 20091218B */
/* OBSERVACIONES POR ITEM */

SET TERM ^ ;

CREATE OR ALTER procedure IMPR_FACTCOMP (
    ID integer)
returns (
    PREF varchar(4),
    NUMERO varchar(6),
    FECHA date,
    VENCE date,
    DIASVENCE integer,
    NIT varchar(20),
    NOMTERCERO varchar(60),
    SIMPLIFICADO varchar(15),
    CODBODEGA varchar(2),
    NOMBODEGA varchar(30),
    NUMPROV varchar(10),
    COTIZACION varchar(30),
    PEDIDO varchar(30),
    REMISION varchar(30),
    SUBTOTAL numeric(18,2),
    DTOPORC numeric(9,2),
    DTOMONTO numeric(18,2),
    ADICIONAL numeric(18,2),
    IVAMONTO numeric(18,2),
    RTEFTEPORC numeric(9,2),
    RTEFTEMONTO numeric(18,2),
    RTEIVAPORC numeric(9,2),
    RTEIVAMONTO numeric(18,2),
    RTEICAPORC numeric(9,2),
    RTEICAMONTO numeric(18,2),
    EXTRA numeric(18,2),
    DTOFPORC numeric(9,2),
    DTOFMONTO numeric(18,2),
    FECHADTO date,
    TOTALFAC numeric(18,2),
    TOTALPAGAR numeric(18,2),
    OBS blob sub_type 1 segment size 80,
    ITEM integer,
    ARTICULO varchar(15),
    CODBAR varchar(15),
    ARTIDES varchar(60),
    ARTIPROV varchar(15),
    CANT numeric(18,4),
    LOTE varchar(15),
    UNIDAD varchar(8),
    REFITEM varchar(60),
    BODITEM varchar(2),
    OBSITEM blob sub_type 1 segment size 80,
    STAND varchar(20),
    PRUNIT numeric(18,2),
    DTOITPORC numeric(9,2),
    DTOITMONTO numeric(18,2),
    PRNETO numeric(18,2),
    IVAPORC numeric(9,2),
    IVAITMONTO numeric(18,2),
    CONSUMO numeric(18,2),
    SUBTOTIT numeric(18,2),
    SUBTOTITCON numeric(18,2),
    TOTAL numeric(18,2),
    CODIGOPR varchar(20),
    ZONACOD varchar(2),
    ZONANOM varchar(60),
    DV char(1),
    DIRECCION varchar(60),
    CIUDAD varchar(40),
    TELEFONO varchar(40),
    CONTACTO varchar(60),
    FAX varchar(25),
    GRUPO varchar(2),
    SUBGRUPO varchar(3),
    MARCA varchar(3),
    PESO numeric(9,4),
    ANCHO numeric(18,4),
    ALTO numeric(18,4),
    LARGO numeric(18,4),
    SUMA1 numeric(18,2),
    SUMA2 numeric(18,2),
    SUMA3 numeric(18,2),
    IVA1 numeric(18,2),
    IVA2 numeric(18,2),
    IVA3 numeric(18,2),
    TOTCONSUMO numeric(18,2),
    SUMAEX numeric(18,2),
    SUMAGR numeric(18,2))
AS
declare variable IMPTOS CHAR(1);
declare variable TARIFA INTEGER;
declare variable SIMPLIFICA CHAR(1);
declare variable orden char(2);
BEGIN
  SELECT PREF_PRE, FACO_NUMERO, FACO_FECHA, FACO_VENCE, F.BODE_COD, BODE_NOM, F.TERC_NIT, TERC_NOM, FACO_NUMPROV, FACO_COTIZACI, FACO_ORDEN, FACO_REMISION, FACO_IMPTOS,
    FACO_DTOPORC, FACO_DTOMONTO, FACO_ADICIONAL, FACO_IVAMONTO, FACO_RTFTEPORC, FACO_RTFTEMONTO, FACO_RTIVAPOR, FACO_RTIVAMONTO, FACO_RTICAPOR, FACO_RTICAMONTO,
    FACO_EXTRA, FACO_DTOFPOR, FACO_DTOFMONTO, FACO_DTOFFECHA, FACO_TOTAL, TERC_DIR, TERC_CIU, TERC_TEL, TERC_CONTACTO, TERC_FAX, TERC_DV,
    FACO_OBS, FACO_SIMPLIFICADO
    FROM FACTURAS_COMPRA F, BODEGA B, TERCEROS T
    WHERE F.BODE_COD = B.BODE_COD AND F.TERC_NIT = T.TERC_NIT AND F.FACO_ID = :ID
    into :PREF, :NUMERO, :FECHA, :VENCE, :CODBODEGA, :NOMBODEGA, :NIT, :NOMTERCERO, :NUMPROV, :COTIZACION, :PEDIDO, :REMISION, :IMPTOS,
    :DTOPORC, :DTOMONTO, :ADICIONAL, :IVAMONTO, :RTEFTEPORC, :RTEFTEMONTO, :RTEIVAPORC, :RTEIVAMONTO, :RTEICAPORC, :RTEICAMONTO, :EXTRA, :DTOFPORC, :DTOFMONTO, :FECHADTO, :TOTALFAC,
    :DIRECCION, :CIUDAD, :TELEFONO, :CONTACTO, :FAX, :DV, :OBS, :SIMPLIFICA;
    
    if (SIMPLIFICA = 'N') then
         SIMPLIFICADO = 'COMUN';
    ELSE
        SIMPLIFICADO = 'SIMPLIFICADO';

  SELECT PROV_COD, P.GRPR_COD, GRPR_NOM
    FROM PROVEEDORES P, GRUPOS_PROVEEDORES G
    WHERE TERC_NIT = :NIT AND G.GRPR_COD = P.GRPR_COD
    INTO :CODIGOPR, :ZONACOD, :ZONANOM;

  DIASVENCE = VENCE - FECHA;
  SUBTOTAL = TOTALFAC - EXTRA - IVAMONTO - ADICIONAL + DTOMONTO;
  TOTALPAGAR = TOTALFAC - RTEFTEMONTO - RTEIVAMONTO - RTEICAMONTO;
  SUMAEX = 0;
  SUMA1 = 0;
  SUMA2 = 0;
  SUMA3 = 0;
  IVA1 = 0;
  IVA2 = 0;
  IVA3 = 0;
  TOTCONSUMO = 0;

execute procedure lee_configuracion('COMPRAS', 'DOCUMENTOS', 'ORDENAR ITEMS POR BODEGA AL IMPRIMIR DOCUMENTOS') returning_values (:Orden);
if (orden = 'NO') then
  BEGIN
  FOR SELECT FCDE_ITEM, D.ARTI_COD, FCDE_CODBAR, SUBSTR(FCDE_DESC,1,60), FCDE_CANT, FCDE_UNIDAD, BODE_COD, FCDE_LOTE, FCDE_PRUNIT,
    FCDE_DTOPORC, FCDE_DTOMONTO, FCDE_IVAPORC, FCDE_IVAMONTO, FCDE_CONSUMO, FCDE_TOTAL, FCDE_OBS,
    GRUP_COD, SUBG_COD, MARC_COD, ARTI_PESO, ARTI_ANCHO, ARTI_ALTO, ARTI_LARGO, TAIV_COD, FCDE_CODPROV, FCDE_REFERENCIA
    FROM FACTURAS_COMPRAS_DETALLE D, ARTICULO A
    WHERE D.ARTI_COD = A.ARTI_COD AND D.FACO_ID = :ID
    ORDER BY FCDE_ITEM
    INTO :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :BODITEM, :LOTE, :PRUNIT,
    :DTOITPORC, :DTOITMONTO, :IVAPORC, :IVAITMONTO, :CONSUMO, :TOTAL, :OBSITEM,
    :GRUPO, :SUBGRUPO, :MARCA, :PESO, :ANCHO, :ALTO, :LARGO, :TARIFA, :ARTIPROV, :REFITEM
    DO
      BEGIN
      PRNETO = PRUNIT - DTOITMONTO - ((IVAITMONTO+CONSUMO) / CANT);
      SUBTOTIT = TOTAL - IVAITMONTO - CONSUMO;
      SUBTOTITCON = TOTAL;
      TOTCONSUMO = TOTCONSUMO + CONSUMO;
      if (IVAPORC = 0) then
        SUMAEX = SUMAEX + TOTAL;
      if (TARIFA = 1) then
        BEGIN
        SUMA1 = SUMA1 + TOTAL - IVAITMONTO;
        IVA1 = IVA1 + IVAITMONTO;
        END
      if (TARIFA = 2) then
        BEGIN
        SUMA2 = SUMA2 + TOTAL - IVAITMONTO;
        IVA2 = IVA2 + IVAITMONTO;
        END
      if (TARIFA = 3) then
        BEGIN
        SUMA3 = SUMA3 + TOTAL - IVAITMONTO;
        IVA3 = IVA3 + IVAITMONTO;
        END
      SUMAGR = SUMA1 + SUMA2 + SUMA3;
      if (IMPTOS = 'N') then
        TOTAL = TOTAL - IVAITMONTO - CONSUMO;
      SELECT STAND_COD FROM STANDS WHERE ARTI_COD = :ARTICULO AND STAND_BODEGA = :boditem INTO :stand;
      SUSPEND;
      END
  END
ELSE
  BEGIN
  FOR SELECT FCDE_ITEM, D.ARTI_COD, FCDE_CODBAR, SUBSTR(FCDE_DESC,1,60), FCDE_CANT, FCDE_UNIDAD, BODE_COD, FCDE_LOTE, FCDE_PRUNIT,
    FCDE_DTOPORC, FCDE_DTOMONTO, FCDE_IVAPORC, FCDE_IVAMONTO, FCDE_CONSUMO, FCDE_TOTAL, FCDE_OBS,
    GRUP_COD, SUBG_COD, MARC_COD, ARTI_PESO, ARTI_ANCHO, ARTI_ALTO, ARTI_LARGO, TAIV_COD, FCDE_CODPROV, FCDE_REFERENCIA
    FROM FACTURAS_COMPRAS_DETALLE D, ARTICULO A
    WHERE D.ARTI_COD = A.ARTI_COD AND D.FACO_ID = :ID
    ORDER BY D.bode_cod, FCDE_ITEM
    INTO :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :BODITEM, :LOTE, :PRUNIT,
    :DTOITPORC, :DTOITMONTO, :IVAPORC, :IVAITMONTO, :CONSUMO, :TOTAL, :OBSITEM,
    :GRUPO, :SUBGRUPO, :MARCA, :PESO, :ANCHO, :ALTO, :LARGO, :TARIFA, :ARTIPROV, :REFITEM
    DO
      BEGIN
      PRNETO = PRUNIT - DTOITMONTO - ((IVAITMONTO+CONSUMO) / CANT);
      SUBTOTIT = TOTAL - IVAITMONTO - CONSUMO;
      SUBTOTITCON = TOTAL;
      TOTCONSUMO = TOTCONSUMO + CONSUMO;
      if (IVAPORC = 0) then
        SUMAEX = SUMAEX + TOTAL;
      if (TARIFA = 1) then
        BEGIN
        SUMA1 = SUMA1 + TOTAL - IVAITMONTO;
        IVA1 = IVA1 + IVAITMONTO;
        END
      if (TARIFA = 2) then
        BEGIN
        SUMA2 = SUMA2 + TOTAL - IVAITMONTO;
        IVA2 = IVA2 + IVAITMONTO;
        END
      if (TARIFA = 3) then
        BEGIN
        SUMA3 = SUMA3 + TOTAL - IVAITMONTO;
        IVA3 = IVA3 + IVAITMONTO;
        END
      SUMAGR = SUMA1 + SUMA2 + SUMA3;
      if (IMPTOS = 'N') then
        TOTAL = TOTAL - IVAITMONTO - CONSUMO;
      SELECT STAND_COD FROM STANDS WHERE ARTI_COD = :ARTICULO AND STAND_BODEGA = :boditem INTO :stand;
      SUSPEND;
      END
  END
END
^

SET TERM ; ^


SET TERM ^ ;

CREATE OR ALTER procedure IMPR_COTIPROV (
    ID integer)
returns (
    PREF varchar(4),
    NUMERO varchar(6),
    FECHA date,
    DIASVENCE integer,
    NIT varchar(20),
    NOMTERCERO varchar(60),
    CODBODEGA varchar(2),
    NOMBODEGA varchar(30),
    SUBTOTAL numeric(18,2),
    DTOPORC numeric(9,2),
    DTOMONTO numeric(18,2),
    ADICIONAL numeric(18,2),
    IVAMONTO numeric(18,2),
    EXTRA numeric(18,2),
    TOTALFAC numeric(18,2),
    OBS blob sub_type 1 segment size 80,
    ITEM integer,
    ARTICULO varchar(15),
    CODBAR varchar(15),
    ARTIDES varchar(60),
    ARTIPROV varchar(15),
    CANT numeric(18,4),
    UNIDAD varchar(8),
    BODITEM varchar(2),
    PRUNIT numeric(18,2),
    DTOITPORC numeric(9,2),
    DTOITMONTO numeric(18,2),
    PRNETO numeric(18,2),
    IVAPORC numeric(9,2),
    IVAITMONTO numeric(18,2),
    CONSUMO numeric(18,2),
    TOTAL numeric(18,2),
    OBSITEM blob sub_type 1 segment size 80,
    CODIGOPR varchar(20),
    ZONACOD varchar(2),
    ZONANOM varchar(30),
    DV char(1),
    DIRECCION varchar(60),
    CIUDAD varchar(40),
    TELEFONO varchar(40),
    CONTACTO varchar(60),
    FAX varchar(25),
    GRUPO varchar(2),
    SUBGRUPO varchar(3),
    MARCA varchar(3),
    PESO numeric(9,4),
    ANCHO numeric(18,4),
    ALTO numeric(18,4),
    LARGO numeric(18,4),
    SUMA1 numeric(18,2),
    SUMA2 numeric(18,2),
    SUMA3 numeric(18,2),
    IVA1 numeric(18,2),
    IVA2 numeric(18,2),
    IVA3 numeric(18,2),
    SUMAEX numeric(18,2),
    SUMAGR numeric(18,2))
AS
declare variable IMPTOS CHAR(1);
declare variable TARIFA INTEGER;
declare variable orden char(2);
BEGIN
  SELECT PREF_PRE, COPR_NUMERO, COPR_FECHA, COPR_VALIDEZ, C.BODE_COD, BODE_NOM, C.TERC_NIT, TERC_NOM, COPR_IMPTOS,
    COPR_DTOPORC, COPR_DTOMONTO, COPR_ADICIONAL, COPR_IVAMONTO,
    COPR_EXTRA, COPR_TOTAL, TERC_DIR, TERC_CIU, TERC_TEL, TERC_CONTACTO, TERC_FAX, TERC_DV,
    COPR_OBS
    FROM COTIZACION_PROVEEDOR C, BODEGA B, TERCEROS T
    WHERE C.BODE_COD = B.BODE_COD AND C.TERC_NIT = T.TERC_NIT AND C.COPR_ID = :ID
    into :PREF, :NUMERO, :FECHA, :DIASVENCE, :CODBODEGA, :NOMBODEGA, :NIT, :NOMTERCERO, :IMPTOS,
    :DTOPORC, :DTOMONTO, :ADICIONAL, :IVAMONTO, :EXTRA, :TOTALFAC,
    :DIRECCION, :CIUDAD, :TELEFONO, :CONTACTO, :FAX, :DV, :OBS;
    
  SELECT PROV_COD, P.GRPR_COD, GRPR_NOM
    FROM PROVEEDORES P, GRUPOS_PROVEEDORES G
    WHERE TERC_NIT = :NIT AND G.GRPR_COD = P.GRPR_COD
    INTO :CODIGOPR, :ZONACOD, :ZONANOM;
    
  SUBTOTAL = TOTALFAC - EXTRA - IVAMONTO - ADICIONAL + DTOMONTO;
  SUMAEX = 0;
  SUMA1 = 0;
  SUMA2 = 0;
  SUMA3 = 0;
  IVA1 = 0;
  IVA2 = 0;
  IVA3 = 0;
  ITEM = 0;

execute procedure lee_configuracion('COMPRAS', 'DOCUMENTOS', 'ORDENAR ITEMS POR BODEGA AL IMPRIMIR DOCUMENTOS') returning_values (:Orden);
if (orden = 'NO') then
  BEGIN
  FOR SELECT D.ARTI_COD, CPRD_CODBAR, CPRD_DESC, CPRD_CANT, CPRD_UNIDAD, BODE_COD, CPRD_PRUNIT,
    CPRD_DTOPORC, CPRD_DTOMONTO, CPRD_IVAPORC, CPRD_IVAMONTO, CPRD_CONSUMO, CPRD_TOTAL, CPRD_OBS,
    GRUP_COD, SUBG_COD, MARC_COD, ARTI_PESO, ARTI_ANCHO, ARTI_ALTO, ARTI_LARGO, TAIV_COD, CPRD_CODPROV
    FROM COTIZACIONES_PROVEEDOR_DET D, ARTICULO A
    WHERE D.ARTI_COD = A.ARTI_COD AND D.COPR_ID = :ID
    ORDER BY CPRD_ITEM
    INTO :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :BODITEM, :PRUNIT,
    :DTOITPORC, :DTOITMONTO, :IVAPORC, :IVAITMONTO, :CONSUMO, :TOTAL, :OBSITEM,
    :GRUPO, :SUBGRUPO, :MARCA, :PESO, :ANCHO, :ALTO, :LARGO, :TARIFA, :ARTIPROV
    DO
      BEGIN
      ITEM = ITEM + 1;
      PRNETO = PRUNIT - DTOITMONTO;
      if (IVAPORC = 0) then
        SUMAEX = SUMAEX + TOTAL;
      if (TARIFA = 1) then
        BEGIN
        SUMA1 = SUMA1 + TOTAL - IVAITMONTO;
        IVA1 = IVA1 + IVAITMONTO;
        END
      if (TARIFA = 2) then
        BEGIN
        SUMA2 = SUMA2 + TOTAL - IVAITMONTO;
        IVA2 = IVA2 + IVAITMONTO;
        END
      if (TARIFA = 3) then
        BEGIN
        SUMA3 = SUMA3 + TOTAL - IVAITMONTO;
        IVA3 = IVA3 + IVAITMONTO;
        END
      SUMAGR = SUMA1 + SUMA2 + SUMA3;
      if (IMPTOS = 'N') then
        TOTAL = TOTAL - IVAITMONTO;
      SUSPEND;
      END
  END
ELSE
  BEGIN
  FOR SELECT D.ARTI_COD, CPRD_CODBAR, CPRD_DESC, CPRD_CANT, CPRD_UNIDAD, BODE_COD, CPRD_PRUNIT,
    CPRD_DTOPORC, CPRD_DTOMONTO, CPRD_IVAPORC, CPRD_IVAMONTO, CPRD_CONSUMO, CPRD_TOTAL, CPRD_OBS,
    GRUP_COD, SUBG_COD, MARC_COD, ARTI_PESO, ARTI_ANCHO, ARTI_ALTO, ARTI_LARGO, TAIV_COD, CPRD_CODPROV
    FROM COTIZACIONES_PROVEEDOR_DET D, ARTICULO A
    WHERE D.ARTI_COD = A.ARTI_COD AND D.COPR_ID = :ID
    ORDER BY D.bode_cod, CPRD_ITEM
    INTO :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :BODITEM, :PRUNIT,
    :DTOITPORC, :DTOITMONTO, :IVAPORC, :IVAITMONTO, :CONSUMO, :TOTAL, :obsitem, 
    :GRUPO, :SUBGRUPO, :MARCA, :PESO, :ANCHO, :ALTO, :LARGO, :TARIFA, :ARTIPROV
    DO
      BEGIN
      ITEM = ITEM + 1;
      PRNETO = PRUNIT - DTOITMONTO;
      if (IVAPORC = 0) then
        SUMAEX = SUMAEX + TOTAL;
      if (TARIFA = 1) then
        BEGIN
        SUMA1 = SUMA1 + TOTAL - IVAITMONTO;
        IVA1 = IVA1 + IVAITMONTO;
        END
      if (TARIFA = 2) then
        BEGIN
        SUMA2 = SUMA2 + TOTAL - IVAITMONTO;
        IVA2 = IVA2 + IVAITMONTO;
        END
      if (TARIFA = 3) then
        BEGIN
        SUMA3 = SUMA3 + TOTAL - IVAITMONTO;
        IVA3 = IVA3 + IVAITMONTO;
        END
      SUMAGR = SUMA1 + SUMA2 + SUMA3;
      if (IMPTOS = 'N') then
        TOTAL = TOTAL - IVAITMONTO;
      SUSPEND;
      END
  END
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(6),
    FECHA date,
    DIASVENCE integer,
    NIT varchar(20),
    NOMTERCERO varchar(60),
    CODBODEGA varchar(2),
    NOMBODEGA varchar(30),
    COTIZACION varchar(30),
    SUBTOTAL numeric(18,2),
    DTOPORC numeric(9,2),
    DTOMONTO numeric(18,2),
    ADICIONAL numeric(18,2),
    IVAMONTO numeric(18,2),
    EXTRA numeric(18,2),
    DTOFPORC numeric(9,2),
    DTOFMONTO numeric(18,2),
    FECHADTO date,
    TOTALFAC numeric(18,2),
    OBS blob sub_type 1 segment size 80,
    BOD1 varchar(2),
    BOD2 varchar(2),
    BOD3 varchar(2),
    BOD4 varchar(2),
    BOD5 varchar(2),
    BOD6 varchar(2),
    BOD7 varchar(2),
    BOD8 varchar(2),
    BOD9 varchar(2),
    BOD0 varchar(2),
    ITEM integer,
    ARTICULO varchar(15),
    CODBAR varchar(15),
    ARTIDES varchar(60),
    ARTIPROV varchar(15),
    CANT numeric(18,4),
    UNIDAD varchar(8),
    BODITEM varchar(2),
    PRUNIT numeric(18,2),
    DTOITPORC numeric(9,2),
    DTOITMONTO numeric(18,2),
    PRNETO numeric(18,2),
    IVAPORC numeric(9,2),
    IVAITMONTO numeric(18,2),
    CONSUMO numeric(18,2),
    TOTAL numeric(18,2),
    OBSITEM blob sub_type 1 segment size 80,
    CODIGOPR varchar(20),
    ZONACOD varchar(2),
    ZONANOM varchar(30),
    DV char(1),
    DIRECCION varchar(60),
    CIUDAD varchar(40),
    TELEFONO varchar(40),
    CONTACTO varchar(60),
    DIASPAGO integer,
    FAX varchar(25),
    GRUPO varchar(2),
    SUBGRUPO varchar(3),
    MARCA varchar(3),
    PESO numeric(9,4),
    ANCHO numeric(18,4),
    ALTO numeric(18,4),
    LARGO numeric(18,4),
    SUMA1 numeric(18,2),
    SUMA2 numeric(18,2),
    SUMA3 numeric(18,2),
    IVA1 numeric(18,2),
    IVA2 numeric(18,2),
    IVA3 numeric(18,2),
    SUMAEX numeric(18,2),
    SUMAGR numeric(18,2),
    CANTB1 numeric(18,4),
    CANTB2 numeric(18,4),
    CANTB3 numeric(18,4),
    CANTB4 numeric(18,4),
    CANTB5 numeric(18,4),
    CANTB6 numeric(18,4),
    CANTB7 numeric(18,4),
    CANTB8 numeric(18,4),
    CANTB9 numeric(18,4),
    CANTB0 numeric(18,4))
AS
declare variable imptos char(1);
declare variable tarifa integer;
declare variable orden char(2);
declare variable i integer;
declare variable totalitem numeric(18,2);
declare variable ivaitem numeric(18,2);
declare variable cantitem numeric(18,2);
BEGIN
  SELECT PREF_PRE, ORDC_NUMERO, ORDC_FECHA, ORDC_VALIDEZ, O.BODE_COD, BODE_NOM, O.TERC_NIT, TERC_NOM, ORDC_COTIZACION, ORDC_IMPTOS,
    ORDC_DTOPORC, ORDC_DTOMONTO, ORDC_ADICIONAL, ORDC_IVAMONTO, 
    ORDC_EXTRA, ORDC_DTOFPORC, ORDC_DTOFMONTO, ORDC_DTOFECHA, ORDC_TOTAL, TERC_DIR, TERC_CIU, TERC_TEL, TERC_CONTACTO, TERC_FAX, TERC_DV,
    ORDC_OBS,ORDC_DIASPAGO
    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;
    
  SELECT PROV_COD, P.GRPR_COD, GRPR_NOM
    FROM PROVEEDORES P, GRUPOS_PROVEEDORES G
    WHERE TERC_NIT = :NIT AND G.GRPR_COD = P.GRPR_COD
    INTO :CODIGOPR, :ZONACOD, :ZONANOM;
    
  SUBTOTAL = TOTALFAC - EXTRA - IVAMONTO - ADICIONAL + DTOMONTO;
  SUMAEX = 0;
  SUMA1 = 0;
  SUMA2 = 0;
  SUMA3 = 0;
  IVA1 = 0;
  IVA2 = 0;
  IVA3 = 0;

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

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure IMPR_REMIPROV (
    ID integer)
returns (
    PREF varchar(4),
    NUMERO varchar(6),
    FECHA date,
    NIT varchar(20),
    NOMTERCERO varchar(60),
    CODBODEGA varchar(2),
    NOMBODEGA varchar(30),
    NUMPROV varchar(10),
    COTIZACION varchar(30),
    PEDIDO varchar(30),
    SUBTOTAL numeric(18,2),
    DTOPORC numeric(9,2),
    DTOMONTO numeric(18,2),
    ADICIONAL numeric(18,2),
    IVAMONTO numeric(18,2),
    EXTRA numeric(18,2),
    TOTALFAC numeric(18,2),
    OBS blob sub_type 1 segment size 80,
    ITEM integer,
    ARTICULO varchar(15),
    CODBAR varchar(15),
    ARTIDES varchar(60),
    ARTIPROV varchar(15),
    CANT numeric(18,4),
    LOTE varchar(15),
    UNIDAD varchar(8),
    BODITEM varchar(2),
    STAND varchar(20),
    PRUNIT numeric(18,2),
    DTOITPORC numeric(9,2),
    DTOITMONTO numeric(18,2),
    PRNETO numeric(18,2),
    IVAPORC numeric(9,2),
    IVAITMONTO numeric(18,2),
    CONSUMO numeric(18,2),
    TOTAL numeric(18,2),
    OBSITEM blob sub_type 1 segment size 80,
    CODIGOPR varchar(20),
    ZONACOD varchar(2),
    ZONANOM varchar(30),
    DV char(1),
    DIRECCION varchar(60),
    CIUDAD varchar(40),
    TELEFONO varchar(40),
    CONTACTO varchar(60),
    FAX varchar(25),
    GRUPO varchar(2),
    SUBGRUPO varchar(3),
    MARCA varchar(3),
    PESO numeric(9,4),
    ANCHO numeric(18,4),
    ALTO numeric(18,4),
    LARGO numeric(18,4),
    SUMA1 numeric(18,2),
    SUMA2 numeric(18,2),
    SUMA3 numeric(18,2),
    IVA1 numeric(18,2),
    IVA2 numeric(18,2),
    IVA3 numeric(18,2),
    SUMAEX numeric(18,2),
    SUMAGR numeric(18,2))
AS
declare variable IMPTOS CHAR(1);
declare variable TARIFA INTEGER;
declare variable orden char(2);
BEGIN
  SELECT PREF_PRE, REPR_NUMERO, REPR_FECHA, F.BODE_COD, BODE_NOM, REPR_NUMPROV, REPR_COTIZACI, REPR_ORDEN, REPR_IMPTOS, 
    REPR_DTOPORC, REPR_DTOMONTO, REPR_ADICIONAL, REPR_IVAMONTO, REPR_EXTRA, REPR_TOTAL,
    F.TERC_NIT, TERC_NOM, TERC_DIR, TERC_CIU, TERC_TEL, TERC_CONTACTO, TERC_FAX, TERC_DV,
    REPR_OBS
    FROM REMISION_PROVEEDOR F, BODEGA B, TERCEROS T
    WHERE F.BODE_COD = B.BODE_COD AND F.TERC_NIT = T.TERC_NIT AND F.REPR_ID = :ID
    into :PREF, :NUMERO, :FECHA, :CODBODEGA, :NOMBODEGA, :NUMPROV, :COTIZACION, :PEDIDO, :IMPTOS, 
    :DTOPORC, :DTOMONTO, :ADICIONAL, :IVAMONTO, :EXTRA, :TOTALFAC,
    :NIT, :NOMTERCERO, :DIRECCION, :CIUDAD, :TELEFONO, :CONTACTO, :FAX, :DV,
    :OBS;
    
  SELECT PROV_COD, P.GRPR_COD, GRPR_NOM
    FROM PROVEEDORES P, GRUPOS_PROVEEDORES G
    WHERE TERC_NIT = :NIT AND G.GRPR_COD = P.GRPR_COD
    INTO :CODIGOPR, :ZONACOD, :ZONANOM;
    
  SUBTOTAL = TOTALFAC - EXTRA - IVAMONTO - ADICIONAL + DTOMONTO;
  SUMAEX = 0;
  SUMA1 = 0;
  SUMA2 = 0;
  SUMA3 = 0;
  IVA1 = 0;
  IVA2 = 0;
  IVA3 = 0;

execute procedure lee_configuracion('COMPRAS', 'DOCUMENTOS', 'ORDENAR ITEMS POR BODEGA AL IMPRIMIR DOCUMENTOS') returning_values (:Orden);
if (orden = 'NO') then
  BEGIN
  FOR SELECT RPVD_ITEM, D.ARTI_COD, RPVD_CODBAR, SUBSTR(RPVD_DESC,1,60), RPVD_CANT, RPVD_UNIDAD, BODE_COD, RPVD_LOTE, RPVD_PRUNIT,
    RPVD_DTOPORC, RPVD_DTOMONTO, RPVD_IVAPORC, RPVD_IVAMONTO, RPVD_CONSUMO, RPVD_TOTAL, RPVD_OBS,
    GRUP_COD, SUBG_COD, MARC_COD, ARTI_PESO, ARTI_ANCHO, ARTI_ALTO, ARTI_LARGO, TAIV_COD, RPVD_CODPROV
    FROM REMISION_PROVEEDOR_DET D, ARTICULO A
    WHERE D.ARTI_COD = A.ARTI_COD AND D.REPR_ID = :ID
    ORDER BY RPVD_ITEM
    INTO :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :BODITEM, :LOTE, :PRUNIT,
    :DTOITPORC, :DTOITMONTO, :IVAPORC, :IVAITMONTO, :CONSUMO, :TOTAL, :OBSITEM,
    :GRUPO, :SUBGRUPO, :MARCA, :PESO, :ANCHO, :ALTO, :LARGO, :TARIFA, :ARTIPROV
    DO
      BEGIN
      PRNETO = PRUNIT - DTOITMONTO;
      if (IVAPORC = 0) then
        SUMAEX = SUMAEX + TOTAL;
      if (TARIFA = 1) then
        BEGIN
        SUMA1 = SUMA1 + TOTAL - IVAITMONTO;
        IVA1 = IVA1 + IVAITMONTO;
        END
      if (TARIFA = 2) then
        BEGIN
        SUMA2 = SUMA2 + TOTAL - IVAITMONTO;
        IVA2 = IVA2 + IVAITMONTO;
        END
      if (TARIFA = 3) then
        BEGIN
        SUMA3 = SUMA3 + TOTAL - IVAITMONTO;
        IVA3 = IVA3 + IVAITMONTO;
        END
      SUMAGR = SUMA1 + SUMA2 + SUMA3;
      if (IMPTOS = 'N') then
        TOTAL = TOTAL - IVAITMONTO;
      SELECT STAND_COD FROM STANDS WHERE ARTI_COD = :ARTICULO AND STAND_BODEGA = :boditem INTO :stand;
      SUSPEND;
      END
  END
ELSE
  BEGIN
  FOR SELECT RPVD_ITEM, D.ARTI_COD, RPVD_CODBAR, SUBSTR(RPVD_DESC,1,60), RPVD_CANT, RPVD_UNIDAD, BODE_COD, RPVD_LOTE, RPVD_PRUNIT,
    RPVD_DTOPORC, RPVD_DTOMONTO, RPVD_IVAPORC, RPVD_IVAMONTO, RPVD_CONSUMO, RPVD_TOTAL, RPVD_OBS,
    GRUP_COD, SUBG_COD, MARC_COD, ARTI_PESO, ARTI_ANCHO, ARTI_ALTO, ARTI_LARGO, TAIV_COD, RPVD_CODPROV
    FROM REMISION_PROVEEDOR_DET D, ARTICULO A
    WHERE D.ARTI_COD = A.ARTI_COD AND D.REPR_ID = :ID
    ORDER BY D.bode_cod, RPVD_ITEM
    INTO :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :BODITEM, :LOTE, :PRUNIT,
    :DTOITPORC, :DTOITMONTO, :IVAPORC, :IVAITMONTO, :CONSUMO, :TOTAL, :OBSITEM,
    :GRUPO, :SUBGRUPO, :MARCA, :PESO, :ANCHO, :ALTO, :LARGO, :TARIFA, :ARTIPROV
    DO
      BEGIN
      PRNETO = PRUNIT - DTOITMONTO;
      if (IVAPORC = 0) then
        SUMAEX = SUMAEX + TOTAL;
      if (TARIFA = 1) then
        BEGIN
        SUMA1 = SUMA1 + TOTAL - IVAITMONTO;
        IVA1 = IVA1 + IVAITMONTO;
        END
      if (TARIFA = 2) then
        BEGIN
        SUMA2 = SUMA2 + TOTAL - IVAITMONTO;
        IVA2 = IVA2 + IVAITMONTO;
        END
      if (TARIFA = 3) then
        BEGIN
        SUMA3 = SUMA3 + TOTAL - IVAITMONTO;
        IVA3 = IVA3 + IVAITMONTO;
        END
      SUMAGR = SUMA1 + SUMA2 + SUMA3;
      if (IMPTOS = 'N') then
        TOTAL = TOTAL - IVAITMONTO;
      SELECT STAND_COD FROM STANDS WHERE ARTI_COD = :ARTICULO AND STAND_BODEGA = :boditem INTO :stand;
      SUSPEND;
      END
  END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure IMPR_DEVOLPROV (
    ID integer)
returns (
    PREF varchar(4),
    NUMERO varchar(6),
    FECHA date,
    NIT varchar(20),
    NOMTERCERO varchar(60),
    CODBODEGA varchar(2),
    NOMBODEGA varchar(30),
    FACTURA varchar(30),
    NUMPROV varchar(30),
    SUBTOTAL numeric(18,2),
    DTOPORC numeric(9,2),
    DTOMONTO numeric(18,2),
    ADICIONAL numeric(18,2),
    IVAMONTO numeric(18,2),
    RTEFTEPORC numeric(9,2),
    RTEFTEMONTO numeric(18,2),
    RTEIVAPORC numeric(9,2),
    RTEIVAMONTO numeric(18,2),
    RTEICAPORC numeric(9,2),
    RTEICAMONTO numeric(18,2),
    EXTRA numeric(18,2),
    TOTALFAC numeric(18,2),
    TOTALPAGAR numeric(18,2),
    OBS blob sub_type 1 segment size 80,
    ITEM integer,
    ARTICULO varchar(15),
    CODBAR varchar(15),
    ARTIDES varchar(60),
    CANT numeric(18,4),
    UNIDAD varchar(8),
    BODITEM varchar(2),
    PRUNIT numeric(18,2),
    DTOITPORC numeric(9,2),
    DTOITMONTO numeric(18,2),
    PRNETO numeric(18,2),
    IVAPORC numeric(9,2),
    IVAITMONTO numeric(18,2),
    CONSUMO numeric(18,2),
    TOTAL numeric(18,2),
    OBSITEM blob sub_type 1 segment size 80,
    CODIGOPR varchar(20),
    ZONACOD varchar(2),
    ZONANOM varchar(30),
    DV char(1),
    DIRECCION varchar(60),
    CIUDAD varchar(40),
    TELEFONO varchar(40),
    CONTACTO varchar(60),
    FAX varchar(25),
    GRUPO varchar(2),
    SUBGRUPO varchar(3),
    MARCA varchar(3),
    PESO numeric(9,4),
    ANCHO numeric(18,4),
    ALTO numeric(18,4),
    LARGO numeric(18,4),
    SUMA1 numeric(18,2),
    SUMA2 numeric(18,2),
    SUMA3 numeric(18,2),
    IVA1 numeric(18,2),
    IVA2 numeric(18,2),
    IVA3 numeric(18,2),
    TOTCONSUMO numeric(18,2),
    SUMAEX numeric(18,2),
    SUMAGR numeric(18,2))
AS
declare variable IMPTOS CHAR(1);
declare variable TARIFA INTEGER;
declare variable orden char(2);
declare variable IDFACT INTEGER;
BEGIN
  SELECT PREF_PRE, DVCO_NUMERO, DVCO_FECHA, D.BODE_COD, BODE_NOM, D.TERC_NIT, TERC_NOM, DVCO_FACTURA, DVCO_IMPTOS,
    DVCO_DTOPORC, DVCO_DTOMONTO, DVCO_ADICIONAL, DVCO_IVAMONTO,
    DVCO_EXTRA, DVCO_RTFTEPORC, DVCO_RTFTEMONTO, DVCO_RTIVAPORC, DVCO_RTIVAMONTO, DVCO_RTICAPORC, DVCO_RTICAMONTO, DVCO_TOTAL,
    TERC_DIR, TERC_CIU, TERC_TEL, TERC_CONTACTO, TERC_FAX, TERC_DV, DVCO_OBS, DVCO_FACTID
    FROM DEVOLUCIONES_COMPRAS D, BODEGA B, TERCEROS T
    WHERE D.BODE_COD = B.BODE_COD AND D.TERC_NIT = T.TERC_NIT AND D.DVCO_ID = :ID
    into :PREF, :NUMERO, :FECHA, :CODBODEGA, :NOMBODEGA, :NIT, :NOMTERCERO, :FACTURA, :IMPTOS,
    :DTOPORC, :DTOMONTO, :ADICIONAL, :IVAMONTO,
    :EXTRA, :RTEFTEPORC, :RTEFTEMONTO, :RTEIVAPORC, :RTEIVAMONTO, :RTEICAPORC, :RTEICAMONTO, :TOTALFAC,
    :DIRECCION, :CIUDAD, :TELEFONO, :CONTACTO, :FAX, :DV, :OBS, :IDFACT;
    
  SELECT PROV_COD, P.GRPR_COD, GRPR_NOM
    FROM PROVEEDORES P, GRUPOS_PROVEEDORES G
    WHERE TERC_NIT = :NIT AND G.GRPR_COD = P.GRPR_COD
    INTO :CODIGOPR, :ZONACOD, :ZONANOM;
  SELECT FACO_NUMPROV FROM FACTURAS_COMPRA WHERE FACO_ID = :idfact INTO :numprov;
  SUBTOTAL = TOTALFAC - EXTRA - IVAMONTO - ADICIONAL + DTOMONTO;
  TOTALPAGAR = TOTALFAC - RTEFTEMONTO - RTEIVAMONTO - RTEICAMONTO;
  SUMAEX = 0;
  SUMA1 = 0;
  SUMA2 = 0;
  SUMA3 = 0;
  IVA1 = 0;
  IVA2 = 0;
  IVA3 = 0;
  TOTCONSUMO = 0;
  ITEM = 0;

execute procedure lee_configuracion('COMPRAS', 'DOCUMENTOS', 'ORDENAR ITEMS POR BODEGA AL IMPRIMIR DOCUMENTOS') returning_values (:Orden);
if (orden = 'NO') then
  BEGIN
  FOR SELECT D.ARTI_COD, DVCD_CODBAR, SUBSTR(DVCD_DESC,1,60), DVCD_CANT, DVCD_UNIDAD, BODE_COD, DVCD_PRUNIT,
    DVCD_DTOPORC, DVCD_DTOMONTO, DVCD_IVAPORC, DVCD_IVAMONTO, DVCD_CONSUMO, DVCD_TOTAL, DVCD_OBS,
    GRUP_COD, SUBG_COD, MARC_COD, ARTI_PESO, ARTI_ANCHO, ARTI_ALTO, ARTI_LARGO, TAIV_COD
    FROM DEVOLUCIONES_COMPRAS_DET D, ARTICULO A
    WHERE D.ARTI_COD = A.ARTI_COD AND D.DVCO_ID = :ID
    ORDER BY DVCD_ITEM
    INTO :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :BODITEM, :PRUNIT,
    :DTOITPORC, :DTOITMONTO, :IVAPORC, :IVAITMONTO, :CONSUMO, :TOTAL, :OBSITEM,
    :GRUPO, :SUBGRUPO, :MARCA, :PESO, :ANCHO, :ALTO, :LARGO, :TARIFA
    DO
      BEGIN
      ITEM = ITEM + 1;
      PRNETO = PRUNIT - DTOITMONTO - ((IVAITMONTO+CONSUMO) / CANT);
      TOTCONSUMO = TOTCONSUMO + CONSUMO;
      if (IVAPORC = 0) then
        SUMAEX = SUMAEX + TOTAL;
      if (TARIFA = 1) then
        BEGIN
        SUMA1 = SUMA1 + TOTAL - IVAITMONTO;
        IVA1 = IVA1 + IVAITMONTO;
        END
      if (TARIFA = 2) then
        BEGIN
        SUMA2 = SUMA2 + TOTAL - IVAITMONTO;
        IVA2 = IVA2 + IVAITMONTO;
        END
      if (TARIFA = 3) then
        BEGIN
        SUMA3 = SUMA3 + TOTAL - IVAITMONTO;
        IVA3 = IVA3 + IVAITMONTO;
        END
      SUMAGR = SUMA1 + SUMA2 + SUMA3;
      if (IMPTOS = 'N') then
        TOTAL = TOTAL - IVAITMONTO - CONSUMO;
      SUSPEND;
      END
  END
ELSE
  BEGIN
  FOR SELECT D.ARTI_COD, DVCD_CODBAR, SUBSTR(DVCD_DESC,1,60), DVCD_CANT, DVCD_UNIDAD, BODE_COD, DVCD_PRUNIT,
    DVCD_DTOPORC, DVCD_DTOMONTO, DVCD_IVAPORC, DVCD_IVAMONTO, DVCD_CONSUMO, DVCD_TOTAL, DVCD_OBS,
    GRUP_COD, SUBG_COD, MARC_COD, ARTI_PESO, ARTI_ANCHO, ARTI_ALTO, ARTI_LARGO, TAIV_COD
    FROM DEVOLUCIONES_COMPRAS_DET D, ARTICULO A
    WHERE D.ARTI_COD = A.ARTI_COD AND D.DVCO_ID = :ID
    ORDER BY D.bode_cod, DVCD_ITEM
    INTO :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :BODITEM, :PRUNIT,
    :DTOITPORC, :DTOITMONTO, :IVAPORC, :IVAITMONTO, :CONSUMO, :TOTAL, :OBSITEM,
    :GRUPO, :SUBGRUPO, :MARCA, :PESO, :ANCHO, :ALTO, :LARGO, :TARIFA
    DO
      BEGIN
      ITEM = ITEM + 1;
      PRNETO = PRUNIT - DTOITMONTO - ((IVAITMONTO+CONSUMO) / CANT);
      TOTCONSUMO = TOTCONSUMO + CONSUMO;
      if (IVAPORC = 0) then
        SUMAEX = SUMAEX + TOTAL;
      if (TARIFA = 1) then
        BEGIN
        SUMA1 = SUMA1 + TOTAL - IVAITMONTO;
        IVA1 = IVA1 + IVAITMONTO;
        END
      if (TARIFA = 2) then
        BEGIN
        SUMA2 = SUMA2 + TOTAL - IVAITMONTO;
        IVA2 = IVA2 + IVAITMONTO;
        END
      if (TARIFA = 3) then
        BEGIN
        SUMA3 = SUMA3 + TOTAL - IVAITMONTO;
        IVA3 = IVA3 + IVAITMONTO;
        END
      SUMAGR = SUMA1 + SUMA2 + SUMA3;
      if (IMPTOS = 'N') then
        TOTAL = TOTAL - IVAITMONTO - CONSUMO;
      SUSPEND;
      END
  END
END
^

SET TERM ; ^


/* 20091218C */
/* reporte de clientes sin venta o con la ultima venta */
SET TERM ^ ;

create or alter procedure REP_CLIENTES_ULTVENTA (
    DESDE varchar(20),
    HASTA varchar(20),
    ZONINI varchar(5),
    ZONFIN varchar(5),
    VENINI integer,
    VENFIN integer,
    AGRUPA char(1),
    ORDEN char(1),
    FECINI DATE,
    FECFIN DATE,
    SINVENTAS char(1))
returns (
    NIT varchar(20),
    NOM varchar(60),
    SUC varchar(10),
    DIR varchar(60),
    CIU varchar(40),
    TEL varchar(40),
    CONTACTO varchar(60),
    OBS varchar(255),
    EMAIL varchar(100),
    FAX varchar(25),
    CEL varchar(25),
    CODCLIE varchar(20),
    CODCIU varchar(6),
    ZONA varchar(2),
    ESTADO char(1),
    RTEFTE numeric(9,4),
    RTEIVA numeric(9,4),
    RTEICA numeric(9,4),
    RTFTEBASE numeric(18,2),
    DTOMAX numeric(9,4),
    CUPO numeric(18,2),
    COBR integer,
    VEND integer,
    GRUPOC integer,
    ANIV date,
    CLIDESDE date,
    LISTA integer,
    DIAS integer,
    DIASBLOQ integer,
    DETALLE char(1),
    ULTVENTA DATE,
    NOMLISTA varchar(30),
    NOMVEND varchar(60),
    NOMCOBR varchar(60),
    NOMZONA varchar(60),
    NOMCIUD varchar(60),
    NOMGRP varchar(60))
AS
declare variable NITINI VARCHAR(20);
declare variable NITFIN VARCHAR(20);
declare variable NOMINI VARCHAR(20);
declare variable NOMFIN VARCHAR(20);
declare variable NUMROWS INTEGER;
declare variable ok char(1);
begin
if (ORDEN = 'C') then
    BEGIN
    NITINI = DESDE;
    NITFIN = HASTA;
    NOMINI = '';
    NOMFIN = 'zz';
    END
ELSE
    BEGIN
    NOMINI = DESDE;
    NOMFIN = HASTA;
    NITINI = '';
    NITFIN = 'zz';
    END

for select t.terc_nit,terc_nom,terc_dir,terc_ciu,terc_tel,terc_contacto,SUBSTRING(TERC_OBS FROM 1 FOR 255),
    terc_email,terc_fax,terc_cel,c.clie_cod,c.zona_cod,c.clie_estado,c.clie_rtefte,c.clie_rteiva,c.clie_rteica,c.clie_rtftebase,c.clie_dtomax,
    c.clie_cupo,c.vend_cod, c.cobr_cod, c.clie_aniv, c.clie_fecha, c.lipr_cod, c.clie_dias, c.clie_diasbloq, c.clie_detalle,
    T.ciud_cod, c.grca_cod
    from terceros t,clientes c where t.terc_nit = c.terc_nit and t.terc_nit >= :nitini and t.terc_nit <= :nitfin and terc_nom >= :nomini and terc_nom <= :nomfin
    into :nit, :nom, :dir, :ciu, :tel, :contacto, :obs,
    :email, :fax, :cel, :codclie, :zona, :estado, :rtefte, :rteiva, :rteica,
    :rtftebase, :dtomax, :cupo, :vend, :cobr, :aniv, :clidesde, :lista, :dias, :diasbloq, :detalle,
    :codciu, :grupoc
    do
    begin
    if (estado <> 'I')  then
        begin
        SUC = '';
        nomlista = '';
        select lipr_nom from LISTA_PRECIOS where lipr_cod = :lista into nomlista;
        SELECT COUNT(*) FROM CLIENTE_SUCURSALES WHERE TERC_NIT = :NIT INTO :NUMROWS;
        if (NUMROWS > 1) then
            BEGIN
            FOR SELECT CLCU_COD, CLSU_NOMBRE, CLSU_DIR, CLSU_CIUDAD, CLSU_TEL, SUBSTRING(CLSU_OBS FROM 1 FOR 255), VEND_COD, COBR_COD, ZONA_COD
                FROM cliente_sucursales WHERE TERC_NIT = :NIT ORDER BY CLCU_COD
                INTO :SUC, :nom, :dir, :ciu, :tel, :obs, :vend, :cobr, :zona
                DO
                BEGIN
                OK = 'N';
                ULTVENTA = NULL;
                SELECT MAX(FACT_FECHA) FROM FACTURAS WHERE TERC_NIT = :NIT AND FACT_SUCURSAL = :SUC AND FACT_FECHA >= :fecini AND FACT_FECHA <= :FECFIN
                    INTO :ultventa;
                if (sinventas = 'S') then
                    BEGIN
                    if (ULTVENTA IS NULL) then
                        OK = 'S';
                    END
                ELSE
                    OK = 'S';
                if (OK = 'S') then
                    BEGIN
                    nomzona = '';
                    nomcobr = '';
                    nomciud = '';
                    nomvend = '';
                    select zona_nom from zonas where zona_cod = :zona into :nomzona;
                    select cobr_nom from cobradores where cobr_cod = :cobr into nomcobr;
                    select vend_nombre from vendedores where vend_cod = :vend into nomvend;
                    select ciud_nom from ciudades where ciud_cod = :codciu into nomciud;
                    select GRCA_NOMBRE from grupo_cartera where grca_cod = :grupoc into nomgrp;
                    if (AGRUPA = 'V') then
                        begin
                        if ((vend >= :venini) and (vend <= :venfin)) then
                            suspend;
                        end
                    else
                        if (AGRUPA = 'B') then
                            begin
                            if ((cobr >= :venini) and (cobr <= :venfin)) then
                                suspend;
                            end
                        else
                            if (AGRUPA = 'Z') then
                                begin
                                if ((zona >= :zonini) and (zona <= :zonfin)) then
                                    suspend;
                                end
                            else
                                if (AGRUPA = 'C') then
                                    begin
                                    if ((codciu >= :zonini) and (codciu <= :zonfin)) then
                                        suspend;
                                    end
                                else
                                    suspend;
                    END
                end
            END
        ELSE
            BEGIN
            OK = 'N';
            ULTVENTA = NULL;
            SELECT MAX(FACT_FECHA) FROM FACTURAS WHERE TERC_NIT = :NIT AND FACT_SUCURSAL = :SUC AND FACT_FECHA >= :fecini AND FACT_FECHA <= :FECFIN
                INTO :ultventa;
            if (sinventas = 'S') then
                BEGIN
                if (ULTVENTA IS NULL) then
                    OK = 'S';
                END
            ELSE
                OK = 'S';
            if (OK = 'S') then
                BEGIN
                nomzona = '';
                nomcobr = '';
                nomciud = '';
                nomvend = '';
                select zona_nom from zonas where zona_cod = :zona into :nomzona;
                select cobr_nom from cobradores where cobr_cod = :cobr into nomcobr;
                select vend_nombre from vendedores where vend_cod = :vend into nomvend;
                select ciud_nom from ciudades where ciud_cod = :codciu into nomciud;
                select GRCA_NOMBRE from grupo_cartera where grca_cod = :grupoc into nomgrp;
                if (AGRUPA = 'V') then
                    begin
                    if ((vend >= :venini) and (vend <= :venfin)) then
                        suspend;
                    end
                else
                    if (AGRUPA = 'B') then
                        begin
                        if ((cobr >= :venini) and (cobr <= :venfin)) then
                            suspend;
                        end
                    else
                        if (AGRUPA = 'Z') then
                            begin
                                if ((zona >= :zonini) and (zona <= :zonfin)) then
                                    suspend;
                            end
                        else
                            if (AGRUPA = 'C') then
                                begin
                                if ((codciu >= :zonini) and (codciu <= :zonfin)) then
                                    suspend;
                                end
                            else
                                suspend;
                END
            end
        end
    end
end
^

SET TERM ; ^

grant execute on procedure rep_clientes_ultventa to public;

SET TERM ^ ;

CREATE OR ALTER procedure REP_VENTAS_CLIENTE (
    TIPO integer,
    NITDESDE varchar(20),
    NITHASTA varchar(20),
    FECINI date,
    FECFIN date,
    DETALLE char(1),
    ORDEN char(1),
    CEROS char(1),
    SUBEMPRESA integer)
returns (
    NIT varchar(20),
    NOMBRE varchar(60),
    DV char(1),
    TELEFONO varchar(40),
    CIUDAD varchar(40),
    CODZONA varchar(2),
    NOMZONA varchar(30),
    NOMTIPO varchar(50),
    PREFIJO varchar(4),
    NUMERO varchar(6),
    SUCURSAL varchar(10),
    ID integer,
    FECDOC date,
    CANTIDAD integer,
    SUBTOTAL numeric(18,2),
    DTO numeric(18,2),
    ADICIONAL numeric(18,2),
    IVA numeric(18,2),
    EXTRA numeric(18,2),
    TOTAL numeric(18,2),
    RTFTE numeric(18,2),
    RTIVA numeric(18,2),
    RTICA numeric(18,2),
    NETO numeric(18,2),
    ULTVENTA date,
    APELLIDO1 varchar(60),
    APELLIDO2 varchar(60),
    NOMBRE1 varchar(60),
    NOMBRE2 varchar(60),
    CODCIU varchar(5))
AS
DECLARE VARIABLE NITINI VARCHAR(15);
DECLARE VARIABLE NITFIN VARCHAR(15);
DECLARE VARIABLE NOMINI VARCHAR(15);
DECLARE VARIABLE NOMFIN VARCHAR(15);
BEGIN
if (ORDEN = 'C') then
    BEGIN
    NITINI = NITDESDE;
    NITFIN = NITHASTA;
    NOMINI = '';
    NOMFIN = 'zz';
    END
ELSE
    BEGIN
    NITINI = NITDESDE;
    NITFIN = NITHASTA;
    NOMINI = '';
    NOMFIN = 'zz';
    END

SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = :TIPO INTO :NOMTIPO;
if (DETALLE = 'N') then
    BEGIN
    if (BIN_AND(TIPO, 1) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 31 INTO :NOMTIPO;
        FOR SELECT MAX(T.TERC_NIT), MAX(TERC_NOM), MAX(TERC_TEL), MAX(TERC_CIU), MAX(ZONA_COD), MAX(TERC_DV),
            MAX(TERC_APELLIDO1), MAX(TERC_APELLIDO2), MAX(TERC_NOMBRE1), MAX(TERC_NOMBRE2), MAX(T.CIUD_COD), max(FACT_FECHA),
            COUNT(*), SUM(FACT_DTOMONTO), SUM(FACT_ADICIONAL), SUM(FACT_IVAMONTO), SUM(FACT_EXTRA), SUM(FACT_RTFTEMONTO), SUM(FACT_RTIVAMONTO), SUM(FACT_RTICAMONTO), SUM(FACT_TOTAL)
            FROM FACTURAS F, PREFIJOS P, terceros T, CLIENTES C
            where C.TERC_NIT = T.TERC_NIT AND T.TERC_CLIE = 'S' AND T.TERC_NIT >= :NITINI AND T.TERC_NIT <= :NITFIN AND TERC_NOM >= :NOMINI AND TERC_NOM <= :NOMFIN
             AND F.TERC_NIT = T.terc_nit AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND FACT_ANULADO = 'N'
             AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY F.terc_nit
            INTO :NIT, :NOMBRE, :TELEFONO, :CIUDAD, :CODZONA, :DV,
            :APELLIDO1, :APELLIDO2, :NOMBRE1, :NOMBRE2, :CODCIU, :ultventa,
            :CANTIDAD, :DTO, :ADICIONAL, :IVA, :EXTRA, :RTFTE, :RTIVA, :RTICA, :TOTAL
            DO
            BEGIN
            SELECT ZONA_NOM FROM ZONAS WHERE ZONA_COD = :codzona INTO :NOMZONA;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (DTO IS NULL) then
                DTO = 0;
            if (ADICIONAL IS NULL) then
                ADICIONAL = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (EXTRA IS NULL) then
                EXTRA = 0;
            if (RTFTE IS NULL) then
                RTFTE = 0;
            if (RTIVA IS NULL) then
                RTIVA = 0;
            if (RTICA IS NULL) then
                RTICA = 0;
            SUBTOTAL = TOTAL - EXTRA - IVA - ADICIONAL + DTO;
            NETO = TOTAL - RTFTE - RTIVA - RTICA;
            if (CEROS = 'S') then
              SUSPEND;
            ELSE
              if (CANTIDAD > 0) then
                SUSPEND;
            END
        END
    if (BIN_AND(TIPO, 2) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 32 INTO :NOMTIPO;
        FOR SELECT MAX(T.TERC_NIT), MAX(TERC_NOM), MAX(TERC_TEL), MAX(TERC_CIU), MAX(ZONA_COD), MAX(TERC_DV),
            MAX(TERC_APELLIDO1), MAX(TERC_APELLIDO2), MAX(TERC_NOMBRE1), MAX(TERC_NOMBRE2), MAX(T.CIUD_COD), MAX(REVT_FECHA),
            COUNT(*), 0, 0, SUM(REVT_IVAMONTO), 0, 0, 0, 0, SUM(REVT_TOTAL)
            FROM REMISIONES_VENTA R, PREFIJOS P, terceros T, CLIENTES C
            where C.TERC_NIT = T.TERC_NIT AND T.TERC_CLIE = 'S' AND T.TERC_NIT >= :NITINI AND T.TERC_NIT <= :NITFIN AND TERC_NOM >= :NOMINI AND TERC_NOM <= :NOMFIN
             AND R.TERC_NIT = T.terc_nit AND REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN AND REVT_ANULADO = 'N'
             AND P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = 32 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY R.terc_nit
            INTO :NIT, :NOMBRE, :TELEFONO, :CIUDAD, :CODZONA, :DV,
            :APELLIDO1, :APELLIDO2, :NOMBRE1, :NOMBRE2, :CODCIU, :ultventa,
            :CANTIDAD, :DTO, :ADICIONAL, :IVA, :EXTRA, :RTFTE, :RTIVA, :RTICA, :TOTAL
            DO
            BEGIN
            SELECT ZONA_NOM FROM ZONAS WHERE ZONA_COD = :codzona INTO :NOMZONA;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (DTO IS NULL) then
                DTO = 0;
            if (ADICIONAL IS NULL) then
                ADICIONAL = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (EXTRA IS NULL) then
                EXTRA = 0;
            if (RTFTE IS NULL) then
                RTFTE = 0;
            if (RTIVA IS NULL) then
                RTIVA = 0;
            if (RTICA IS NULL) then
                RTICA = 0;
            SUBTOTAL = TOTAL - EXTRA - IVA - ADICIONAL + DTO;
            NETO = TOTAL - RTFTE - RTIVA - RTICA;
            if (CEROS = 'S') then
              SUSPEND;
            ELSE
              if (CANTIDAD > 0) then
                SUSPEND;
            END
        END
    if (BIN_AND(TIPO, 4) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 33 INTO :NOMTIPO;
        FOR SELECT MAX(T.TERC_NIT), MAX(TERC_NOM), MAX(TERC_TEL), MAX(TERC_CIU), MAX(ZONA_COD), MAX(TERC_DV),
            MAX(TERC_APELLIDO1), MAX(TERC_APELLIDO2), MAX(TERC_NOMBRE1), MAX(TERC_NOMBRE2), MAX(T.CIUD_COD), MAX(DEVT_FECHA),
            COUNT(*), SUM(DEVT_DTOMONTO), SUM(DEVT_ADICIONAL), SUM(DEVT_IVAMONTO), SUM(DEVT_EXTRA), SUM(DEVT_RTFTEMONTO), SUM(DEVT_RTIVAMONTO), SUM(DEVT_RTICAMONTO), SUM(DEVT_TOTAL)
            FROM DEVOLUCIONES_VENTAS V, PREFIJOS P, terceros T, CLIENTES C
            where C.TERC_NIT = T.TERC_NIT AND T.TERC_CLIE = 'S' AND T.TERC_NIT >= :NITINI AND T.TERC_NIT <= :NITFIN AND TERC_NOM >= :NOMINI AND TERC_NOM <= :NOMFIN
             AND V.TERC_NIT = T.terc_nit AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND DEVT_ANULADO = 'N'
             AND P.PREF_PRE = V.PREF_PRE AND P.TIDO_COD = 33 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) AND ((DEVT_REMID = 0) or (DEVT_REMID IS NULL))
            GROUP BY V.terc_nit
            INTO :NIT, :NOMBRE, :TELEFONO, :CIUDAD, :CODZONA, :DV,
            :APELLIDO1, :APELLIDO2, :NOMBRE1, :NOMBRE2, :CODCIU, :ultventa,
             :CANTIDAD, :DTO, :ADICIONAL, :IVA, :EXTRA, :RTFTE, :RTIVA, :RTICA, :TOTAL
            DO
            BEGIN
            SELECT ZONA_NOM FROM ZONAS WHERE ZONA_COD = :codzona INTO :NOMZONA;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (DTO IS NULL) then
                DTO = 0;
            if (ADICIONAL IS NULL) then
                ADICIONAL = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (EXTRA IS NULL) then
                EXTRA = 0;
            if (RTFTE IS NULL) then
                RTFTE = 0;
            if (RTIVA IS NULL) then
                RTIVA = 0;
            if (RTICA IS NULL) then
                RTICA = 0;
            SUBTOTAL = TOTAL - EXTRA - IVA - ADICIONAL + DTO;
            NETO = TOTAL - RTFTE - RTIVA - RTICA;
            CANTIDAD = CANTIDAD * -1;
            SUBTOTAL = SUBTOTAL * -1;
            TOTAL = TOTAL * -1;
            IVA = IVA * -1;
            EXTRA = EXTRA * -1;
            DTO = DTO * -1;
            ADICIONAL = ADICIONAL * -1;
            RTFTE = RTFTE * -1;
            RTIVA = RTIVA * -1;
            RTICA = RTICA * -1;
            if (CEROS = 'S') then
              SUSPEND;
            ELSE
              if (CANTIDAD <> 0) then
                SUSPEND;
            END
        END
    if (BIN_AND(TIPO, 8) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 34 INTO :NOMTIPO;
        FOR SELECT MAX(T.TERC_NIT), MAX(TERC_NOM), MAX(TERC_TEL), MAX(TERC_CIU), MAX(ZONA_COD), MAX(TERC_DV),
            MAX(TERC_APELLIDO1), MAX(TERC_APELLIDO2), MAX(TERC_NOMBRE1), MAX(TERC_NOMBRE2), MAX(T.CIUD_COD), MAX(PEDI_FECHA),
            COUNT(*), SUM(PEDI_DTOMONTO), SUM(PEDI_ADICIONAL), SUM(PEDI_IVAMONTO), SUM(PEDI_EXTRA), 0, 0, 0, SUM(PEDI_TOTAL)
            FROM PEDIDOS P, PREFIJOS PR, terceros T, CLIENTES C
            where C.TERC_NIT = T.TERC_NIT AND T.TERC_CLIE = 'S' AND T.TERC_NIT >= :NITINI AND T.TERC_NIT <= :NITFIN AND TERC_NOM >= :NOMINI AND TERC_NOM <= :NOMFIN
             AND P.TERC_NIT = T.terc_nit AND PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND PEDI_ANULADO = 'N'
             AND PR.PREF_PRE = P.PREF_PRE AND P.TIDO_COD = 34 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY P.terc_nit
            INTO :NIT, :NOMBRE, :TELEFONO, :CIUDAD, :CODZONA, :DV,
            :APELLIDO1, :APELLIDO2, :NOMBRE1, :NOMBRE2, :CODCIU, :ultventa,
            :CANTIDAD, :DTO, :ADICIONAL, :IVA, :EXTRA, :RTFTE, :RTIVA, :RTICA, :TOTAL
            DO
            BEGIN
            SELECT ZONA_NOM FROM ZONAS WHERE ZONA_COD = :codzona INTO :NOMZONA;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (DTO IS NULL) then
                DTO = 0;
            if (ADICIONAL IS NULL) then
                ADICIONAL = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (EXTRA IS NULL) then
                EXTRA = 0;
            if (RTFTE IS NULL) then
                RTFTE = 0;
            if (RTIVA IS NULL) then
                RTIVA = 0;
            if (RTICA IS NULL) then
                RTICA = 0;
            SUBTOTAL = TOTAL - EXTRA - IVA - ADICIONAL + DTO;
            NETO = TOTAL - RTFTE - RTIVA - RTICA;
            if (CEROS = 'S') then
              SUSPEND;
            ELSE
              if (CANTIDAD > 0) then
                SUSPEND;
            END
        END
    if (BIN_AND(TIPO, 16) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 35 INTO :NOMTIPO;
        FOR SELECT MAX(T.TERC_NIT), MAX(TERC_NOM), MAX(TERC_TEL), MAX(TERC_CIU), MAX(ZONA_COD), MAX(TERC_DV),
            MAX(TERC_APELLIDO1), MAX(TERC_APELLIDO2), MAX(TERC_NOMBRE1), MAX(TERC_NOMBRE2), MAX(T.CIUD_COD), MAX(COTI_FECHA),
            COUNT(*), SUM(COTI_DTOMONTO), SUM(COTI_ADICIONAL), SUM(COTI_IVAMONTO), SUM(COTI_EXTRA), 0, 0, 0, SUM(COTI_TOTAL)
            FROM COTIZACIONES CT, PREFIJOS P, terceros T, CLIENTES C
            where C.TERC_NIT = T.TERC_NIT AND T.TERC_CLIE = 'S' AND T.TERC_NIT >= :NITINI AND T.TERC_NIT <= :NITFIN AND TERC_NOM >= :NOMINI AND TERC_NOM <= :NOMFIN
             AND CT.TERC_NIT = T.terc_nit AND COTI_FECHA >= :FECINI AND COTI_FECHA <= :FECFIN AND COTI_ANULADO = 'N'
             AND P.PREF_PRE = CT.PREF_PRE AND P.TIDO_COD = 35 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY C.terc_nit
            INTO :NIT, :NOMBRE, :TELEFONO, :CIUDAD, :CODZONA, :DV,
            :APELLIDO1, :APELLIDO2, :NOMBRE1, :NOMBRE2, :CODCIU, :ultventa,
            :CANTIDAD, :DTO, :ADICIONAL, :IVA, :EXTRA, :RTFTE, :RTIVA, :RTICA, :TOTAL
            DO
            BEGIN
            SELECT ZONA_NOM FROM ZONAS WHERE ZONA_COD = :codzona INTO :NOMZONA;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (DTO IS NULL) then
                DTO = 0;
            if (ADICIONAL IS NULL) then
                ADICIONAL = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (EXTRA IS NULL) then
                EXTRA = 0;
            if (RTFTE IS NULL) then
                RTFTE = 0;
            if (RTIVA IS NULL) then
                RTIVA = 0;
            if (RTICA IS NULL) then
                RTICA = 0;
            SUBTOTAL = TOTAL - EXTRA - IVA - ADICIONAL + DTO;
            NETO = TOTAL - RTFTE - RTIVA - RTICA;
            if (CEROS = 'S') then
              SUSPEND;
            ELSE
              if (CANTIDAD > 0) then
                SUSPEND;
            END
        END
    END
ELSE
    BEGIN
    if (BIN_AND(TIPO, 1) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 31 INTO :NOMTIPO;
        FOR SELECT FACT_ID, F.PREF_PRE, FACT_NUMERO, FACT_FECHA, FACT_DTOMONTO, FACT_ADICIONAL, FACT_IVAMONTO, FACT_EXTRA, FACT_TOTAL, FACT_RTFTEMONTO, FACT_RTIVAMONTO, FACT_RTICAMONTO,
            T.TERC_NIT, TERC_NOM, ZONA_COD, TERC_TEL, TERC_CIU, TERC_DV, TERC_APELLIDO1, TERC_APELLIDO2, TERC_NOMBRE1, TERC_NOMBRE2, T.CIUD_COD, F.fact_sucursal
            FROM FACTURAS F, PREFIJOS P, terceros T, CLIENTES C
            where C.TERC_NIT = T.TERC_NIT AND T.TERC_CLIE = 'S' AND T.TERC_NIT >= :NITINI AND T.TERC_NIT <= :NITFIN AND TERC_NOM >= :NOMINI AND TERC_NOM <= :NOMFIN
             AND F.TERC_NIT = T.terc_nit AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND FACT_ANULADO = 'N'
             AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            ORDER BY FACT_FECHA, FACT_ID
            INTO :ID, :PREFIJO, :NUMERO, :FECDOC, :DTO, :ADICIONAL, :IVA, :EXTRA, :TOTAL, :RTFTE, :RTIVA, :RTICA, :nit, :nombre, :codzona, :telefono, :ciudad, :dv, :APELLIDO1, :APELLIDO2, :NOMBRE1, :NOMBRE2, :CODCIU, :sucursal
            DO
            BEGIN
            SELECT ZONA_NOM FROM ZONAS WHERE ZONA_COD = :codzona INTO :NOMZONA;
            SUBTOTAL = TOTAL - EXTRA - IVA - ADICIONAL + DTO;
            NETO = TOTAL - RTFTE - RTIVA - RTICA;
            SUSPEND;
            END
        END
    if (BIN_AND(TIPO, 2) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 32 INTO :NOMTIPO;
        FOR SELECT REVT_ID, R.PREF_PRE, REVT_NUMERO, REVT_FECHA, 0, 0, REVT_IVAMONTO, 0, REVT_TOTAL, 0, 0, 0,
        T.TERC_NIT, TERC_NOM, ZONA_COD, TERC_TEL, TERC_CIU, TERC_DV, TERC_APELLIDO1, TERC_APELLIDO2, TERC_NOMBRE1, TERC_NOMBRE2, T.CIUD_COD, R.revt_sucursal
            FROM REMISIONES_VENTA R, PREFIJOS P, terceros T, CLIENTES C
            where C.TERC_NIT = T.TERC_NIT AND T.TERC_CLIE = 'S' AND T.TERC_NIT >= :NITINI AND T.TERC_NIT <= :NITFIN AND TERC_NOM >= :NOMINI AND TERC_NOM <= :NOMFIN
             AND R.TERC_NIT = T.terc_nit AND REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN AND REVT_ANULADO = 'N'
             AND P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = 32 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            ORDER BY REVT_FECHA, REVT_ID
            INTO :ID, :PREFIJO, :NUMERO, :FECDOC, :DTO, :ADICIONAL, :IVA, :EXTRA, :TOTAL, :RTFTE, :RTIVA, :RTICA, :nit, :nombre, :codzona, :telefono, :ciudad, :DV, :APELLIDO1, :APELLIDO2, :NOMBRE1, :NOMBRE2, :CODCIU, :sucursal
            DO
            BEGIN
            SELECT ZONA_NOM FROM ZONAS WHERE ZONA_COD = :codzona INTO :NOMZONA;
            SUBTOTAL = TOTAL - EXTRA - IVA - ADICIONAL + DTO;
            NETO = TOTAL - RTFTE - RTIVA - RTICA;
            SUSPEND;
            END
        END
    if (BIN_AND(TIPO, 4) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 33 INTO :NOMTIPO;
        FOR SELECT DEVT_ID, V.PREF_PRE, DEVT_NUMERO, DEVT_FECHA, DEVT_DTOMONTO, DEVT_ADICIONAL, DEVT_IVAMONTO, DEVT_EXTRA, DEVT_TOTAL, DEVT_RTFTEMONTO, DEVT_RTIVAMONTO, DEVT_RTICAMONTO,
            T.TERC_NIT, TERC_NOM, ZONA_COD, TERC_TEL, TERC_CIU, TERC_DV, TERC_APELLIDO1, TERC_APELLIDO2, TERC_NOMBRE1, TERC_NOMBRE2, T.CIUD_COD, V.devt_sucursal
            FROM DEVOLUCIONES_VENTAS V, PREFIJOS P, terceros T, CLIENTES C
            where C.TERC_NIT = T.TERC_NIT AND T.TERC_CLIE = 'S' AND T.TERC_NIT >= :NITINI AND T.TERC_NIT <= :NITFIN AND TERC_NOM >= :NOMINI AND TERC_NOM <= :NOMFIN
             AND V.TERC_NIT = T.terc_nit AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND DEVT_ANULADO = 'N'
             AND P.PREF_PRE = V.PREF_PRE AND P.TIDO_COD = 33 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) AND ((DEVT_REMID = 0) or (DEVT_REMID IS NULL))
            ORDER BY DEVT_FECHA, DEVT_ID
            INTO :ID, :PREFIJO, :NUMERO, :FECDOC, :DTO, :ADICIONAL, :IVA, :EXTRA, :TOTAL, :RTFTE, :RTIVA, :RTICA, :nit, :nombre, :codzona, :telefono, :ciudad, :DV, :APELLIDO1, :APELLIDO2, :NOMBRE1, :NOMBRE2, :CODCIU, :sucursal
            DO
            BEGIN
            SELECT ZONA_NOM FROM ZONAS WHERE ZONA_COD = :codzona INTO :NOMZONA;
            SUBTOTAL = TOTAL - EXTRA - IVA - ADICIONAL + DTO;
            NETO = TOTAL - RTFTE - RTIVA - RTICA;
            CANTIDAD = CANTIDAD * -1;
            SUBTOTAL = SUBTOTAL * -1;
            TOTAL = TOTAL * -1;
            IVA = IVA * -1;
            EXTRA = EXTRA * -1;
            DTO = DTO * -1;
            ADICIONAL = ADICIONAL * -1;
            RTFTE = RTFTE * -1;
            RTIVA = RTIVA * -1;
            RTICA = RTICA * -1;
            SUSPEND;
            END
        END
    if (BIN_AND(TIPO, 8) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 34 INTO :NOMTIPO;
        FOR SELECT PEDI_ID, P.PREF_PRE, PEDI_NUMERO, PEDI_FECHA, PEDI_DTOMONTO, PEDI_ADICIONAL, PEDI_IVAMONTO, PEDI_EXTRA, PEDI_TOTAL, 0, 0, 0,
            T.TERC_NIT, TERC_NOM, ZONA_COD, TERC_TEL, TERC_CIU, TERC_DV, TERC_APELLIDO1, TERC_APELLIDO2, TERC_NOMBRE1, TERC_NOMBRE2, T.CIUD_COD, P.pedi_sucursal
            FROM PEDIDOS P, PREFIJOS PR, terceros T, CLIENTES C
            where C.TERC_NIT = T.TERC_NIT AND T.TERC_CLIE = 'S' AND T.TERC_NIT >= :NITINI AND T.TERC_NIT <= :NITFIN AND TERC_NOM >= :NOMINI AND TERC_NOM <= :NOMFIN
             AND P.TERC_NIT = T.terc_nit AND PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND PEDI_ANULADO = 'N'
             AND P.PREF_PRE = PR.PREF_PRE AND P.TIDO_COD = 34 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            ORDER BY PEDI_FECHA, PEDI_ID
            INTO :ID, :PREFIJO, :NUMERO, :FECDOC, :DTO, :ADICIONAL, :IVA, :EXTRA, :TOTAL, :RTFTE, :RTIVA, :RTICA, :nit, :nombre, :codzona, :telefono, :ciudad, :DV, :APELLIDO1, :APELLIDO2, :NOMBRE1, :NOMBRE2, :CODCIU, :sucursal
            DO
            BEGIN
            SELECT ZONA_NOM FROM ZONAS WHERE ZONA_COD = :codzona INTO :NOMZONA;
            SUBTOTAL = TOTAL - EXTRA - IVA - ADICIONAL + DTO;
            NETO = TOTAL - RTFTE - RTIVA - RTICA;
            SUSPEND;
            END
        END
    if (BIN_AND(TIPO, 16) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 35 INTO :NOMTIPO;
        FOR SELECT COTI_ID, CT.PREF_PRE, COTI_NUMERO, COTI_FECHA, COTI_DTOMONTO, COTI_ADICIONAL, COTI_IVAMONTO, COTI_EXTRA, COTI_TOTAL, 0, 0, 0,
            T.TERC_NIT, TERC_NOM, ZONA_COD, TERC_TEL, TERC_CIU, TERC_DV, TERC_APELLIDO1, TERC_APELLIDO2, TERC_NOMBRE1, TERC_NOMBRE2, T.CIUD_COD, CT.coti_sucursal
            FROM COTIZACIONES CT, PREFIJOS P, terceros T, CLIENTES C
            where C.TERC_NIT = T.TERC_NIT AND T.TERC_CLIE = 'S' AND T.TERC_NIT >= :NITINI AND T.TERC_NIT <= :NITFIN AND TERC_NOM >= :NOMINI AND TERC_NOM <= :NOMFIN
             AND CT.TERC_NIT = T.terc_nit AND COTI_FECHA >= :FECINI AND COTI_FECHA <= :FECFIN AND COTI_ANULADO = 'N'
             AND P.PREF_PRE = CT.PREF_PRE AND P.TIDO_COD = 35 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            ORDER BY COTI_FECHA, COTI_ID
            INTO :ID, :PREFIJO, :NUMERO, :FECDOC, :DTO, :ADICIONAL, :IVA, :EXTRA, :TOTAL, :RTFTE, :RTIVA, :RTICA, :nit, :nombre, :codzona, :telefono, :ciudad, :DV, :APELLIDO1, :APELLIDO2, :NOMBRE1, :NOMBRE2, :CODCIU, :sucursal
            DO
            BEGIN
            SELECT ZONA_NOM FROM ZONAS WHERE ZONA_COD = :codzona INTO :NOMZONA;
            SUBTOTAL = TOTAL - EXTRA - IVA - ADICIONAL + DTO;
            NETO = TOTAL - RTFTE - RTIVA - RTICA;
            SUSPEND;
            END
        END
    END
END
^

SET TERM ; ^


/* 20091219 : NOTAS POR DOCUMENTO */
CREATE TABLE TIPO_NOTADOC (
    TIND_ID T_ID NOT NULL,
    TIND_NOMBRE T_CONCEPTO);
alter table TIPO_NOTADOC add constraint PK_TIPO_NOTADOC primary key (TIND_ID);

INSERT INTO TIPO_NOTADOC (TIND_ID, TIND_NOMBRE) VALUES (1, 'DEVOLUCION PEDIDO CLIENTE');
INSERT INTO TIPO_NOTADOC (TIND_ID, TIND_NOMBRE) VALUES (2, 'FACTURADO');
INSERT INTO TIPO_NOTADOC (TIND_ID, TIND_NOMBRE) VALUES (3, 'NOTAS CREDITO CARTERA');
INSERT INTO TIPO_NOTADOC (TIND_ID, TIND_NOMBRE) VALUES (4, 'ABONO CARTERA');
INSERT INTO TIPO_NOTADOC (TIND_ID, TIND_NOMBRE) VALUES (5, 'PEDIDO');
INSERT INTO TIPO_NOTADOC (TIND_ID, TIND_NOMBRE) VALUES (6, 'REMISIONADO');
INSERT INTO TIPO_NOTADOC (TIND_ID, TIND_NOMBRE) VALUES (7, 'DEVUELTO');
COMMIT WORK;

CREATE TABLE NOTAS_DOCUMENTO (
    NODO_ID T_ID NOT NULL,
    TIDO_COD T_ID NOT NULL,
    NODO_IDDOC T_ID NOT NULL,
    NODO_TIPO T_ID NOT NULL,
    NODO_FECHA DATE NOT NULL,
    NODO_USER T_USUARIO NOT NULL,
    NODO_TEXTO BLOB SUB_TYPE 1 SEGMENT SIZE 80);
alter table NOTAS_DOCUMENTO add constraint PK_NOTAS_DOCUMENTO primary key (NODO_ID);

CREATE INDEX NOTAS_DOCUMENTO_IDX1 ON NOTAS_DOCUMENTO (TIDO_COD,NODO_IDDOC);

CREATE SEQUENCE ID_NOTADOC;

SET TERM ^ ;

create procedure CAMBIE_IDNOTADOC
returns (ID INTEGER)
as
begin
ID = GEN_ID(id_notadoc, 1);
SUSPEND;
end
^

SET TERM ; ^

grant select, delete, insert, update on tipo_notadoc to PUBLIC;
grant select, delete, insert, update on notas_documento to PUBLIC;
grant EXECUTE on PROCEDURE cambie_idnotadoc to PUBLIC;

SET TERM ^ ;

CREATE OR ALTER procedure BUSQUEDA_NOTASDOC (
    TIPO integer,
    ID integer)
returns (
    USUARIO varchar(10),
    FECHA date,
    TIPONOTA varchar(60),
    TEXTO blob sub_type 1 segment size 80)
AS
begin
for select n.nodo_user, n.nodo_fecha, t.tind_nombre, n.nodo_texto
    from notas_documento n, tipo_notadoc t
    where t.tind_id = n.nodo_tipo and n.tido_cod = :tipo and n.nodo_iddoc = :id
    order by n.nodo_tipo, n.nodo_fecha
    into :usuario, :fecha, :tiponota, :texto
    do
    suspend;
end
^

SET TERM ; ^

grant execute on procedure busqueda_notasdoc to public;

ALTER TABLE NOTAS_DOCUMENTO
ADD NODO_RESUMEN T_CONCEPTO;
SET TERM ^ ;

CREATE OR ALTER procedure BUSQUEDA_NOTASDOC (
    TIPO integer,
    ID integer)
returns (
    USUARIO varchar(10),
    FECHA date,
    TIPONOTA varchar(60),
    RESUMEN varchar(60),
    TEXTO blob sub_type 1 segment size 80)
AS
begin
for select n.nodo_user, n.nodo_fecha, t.tind_nombre, n.nodo_texto, n.nodo_resumen
    from notas_documento n, tipo_notadoc t
    where t.tind_id = n.nodo_tipo and n.tido_cod = :tipo and n.nodo_iddoc = :id
    order by n.nodo_tipo, n.nodo_fecha
    into :usuario, :fecha, :tiponota, :texto, :resumen
    do
    suspend;
end
^

SET TERM ; ^

ALTER TABLE NOTAS_DOCUMENTO
ADD NODO_IMAGEN VARCHAR(250);

SET TERM ^ ;

CREATE OR ALTER procedure BUSQUEDA_NOTASDOC (
    TIPO integer,
    ID integer)
returns (
    USUARIO varchar(10),
    FECHA date,
    TIPONOTA varchar(60),
    RESUMEN varchar(60),
    IMAGEN varchar(250),
    TEXTO blob sub_type 1 segment size 80)
AS
begin
for select n.nodo_user, n.nodo_fecha, t.tind_nombre, n.nodo_texto, n.nodo_resumen, n.nodo_imagen
    from notas_documento n, tipo_notadoc t
    where t.tind_id = n.nodo_tipo and n.tido_cod = :tipo and n.nodo_iddoc = :id
    order by n.nodo_tipo, n.nodo_fecha
    into :usuario, :fecha, :tiponota, :texto, :resumen, :imagen
    do
    suspend;
end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER FACTURAS_AI FOR FACTURAS
ACTIVE AFTER INSERT POSITION 0
AS
declare variable CONC VARCHAR(60);
declare variable PEDAUTO CHAR(2);
declare variable DIAS INTEGER;
declare variable NUMERO VARCHAR(6);
declare variable AUTOM CHAR(1);
declare variable NUMROWS INTEGER;
declare variable ESPOS CHAR(1);
declare variable crmeven CHAR(2);
declare variable CONTADO CHAR(1);
declare variable NUMRDCF CHAR(2);
declare variable PREFRDC VARCHAR(4);
declare variable NUMRDC VARCHAR(6);
declare variable IDR INTEGER;
declare variable CAJA INTEGER;
declare variable tipoori integer;
declare variable idori integer;
BEGIN
if ((NEW.FACT_ID <> 0) and (new.fact_anulado = 'N')) then
    BEGIN
    /* actualice el prefijo si se pasaron de una hoja impresa */
    execute procedure lee_configuracion('FACTURACION','FACTURAS','INCREMENTAR NUMERACION AUTOMATICAMENTE EN FACTURAS DE VARIAS HOJAS') returning_values (:pedauto);
    SELECT MIN(AUTO_ESPOS) FROM AUTORIZACIONES WHERE PREF_PRE = NEW.pref_pre INTO :ESPOS;
    if (ESPOS = 'S') then
        PEDAUTO = 'NO';
    if (PEDAUTO = 'SI') then
        BEGIN
        select FORM_NROITEMS from FORMATOS where tido_cod = 31 and pref_pre = new.pref_pre into :dias;
        select count(*) from facturas_detalle where fact_id = new.fact_id into :numrows;
        if (numrows > dias) then
            begin
            SELECT PREF_ACTUAL, PREF_AUTO FROM PREFIJOS WHERE TIDO_COD = 31 AND PREF_PRE = NEW.PREF_PRE INTO :NUMERO, :AUTOM;
            if (AUTOM = 'S' or NUMERO = NEW.fact_numero) then
                BEGIN
                NUMROWS = CAST(NUMERO AS INTEGER) + DIV(numrows,dias);
                NUMERO = CAST(NUMROWS AS CHAR(6));
                update prefijos set pref_actual = :NUMERO WHERE TIDO_COD = 31 AND PREF_PRE = NEW.PREF_PRE;
                END
            end
        END
    /* Registre el nuevo saldo del documento */
    INSERT INTO SALDOS_DOC_CARTERA (SDCA_TIPOREF, SDCA_IDREF, SDCA_FECHA, TERC_NIT, SDCA_RTFTE, SDCA_RTIVA, SDCA_RTICA, SDCA_ABONO, SDCA_ABRTFTE, SDCA_ABRTIVA, SDCA_ABRTICA, SDCA_DEBITO, SDCA_MONTO, SDCA_TRM)
        VALUES (31, NEW.FACT_ID, NEW.FACT_fecha, NEW.terc_nit, NEW.FACT_rtftemonto, NEW.FACT_rtivamonto, NEW.FACT_rticamonto, 0, 0, 0, 0, 'S', NEW.FACT_TOTAL, NEW.fact_trm);
    /* Registre el movimiento del cliente */
    if (STRLEN(NEW.FACT_NOMCLIENTE) > 42) then
        CONC = 'FV No.' || NEW.PREF_PRE || NEW.FACT_NUMERO || '-' || SUBSTR(NEW.FACT_NOMCLIENTE, 1, 42);
    ELSE
        CONC = 'FV No.' || NEW.PREF_PRE || NEW.FACT_NUMERO || '-' || NEW.FACT_NOMCLIENTE;
    INSERT INTO MOVIMIENTO_CLIENTES (MVCL_ID, TERC_NIT, MVCL_TIPOREF, MVCL_IDREF, MVCL_FECHA, MVCL_VENCE, MVCL_CONC, MVCL_MONTO, MVCL_RTEFTE, MVCL_RTEIVA, MVCL_RTEICA, MVCL_DEBITO, MVCL_ABONO, MVCL_PREFREF, MVCL_NUMREF, mvcl_sucursal, COBR_COD, MVCL_TRM)
      VALUES (GEN_ID(ID_MOVCLI, 1), NEW.TERC_NIT, 31, NEW.FACT_ID, NEW.FACT_FECHA, NEW.FACT_VENCE, :CONC, NEW.FACT_TOTAL, NEW.FACT_RTFTEMONTO, NEW.FACT_RTIVAMONTO, NEW.FACT_RTICAMONTO, 'S', 'N', NEW.pref_pre, NEW.FACT_numero, new.fact_sucursal, NEW.cobr_cod, NEW.fact_trm);
    EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION','FACTURAS','GENERAR PEDIDO AUTOMATICAMENTE CON LA FACTURA') RETURNING_VALUES (PEDAUTO);
    if (PEDAUTO = 'SI') then
        BEGIN
        EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION','PEDIDOS','DIAS DE VALIDEZ') RETURNING_VALUES (DIAS);
        INSERT INTO PEDIDOS (PEDI_ID, TERC_NIT, VEND_COD, TIDO_COD, PREF_PRE, PEDI_NUMERO, PEDI_FECHA, PEDI_VALIDEZ, PEDI_DESPACHO, PEDI_OBS, PEDI_IVAINC, PEDI_NOMTERC, PEDI_DTOPOR, PEDI_DTOMONTO, PEDI_ADICIONAL, PEDI_IVAMONTO, PEDI_EXTRA, PEDI_TOTAL, PEDI_ANULADO, PEDI_TRANSMIT, PTVT_ID, PEDI_COTIZACI, PEDI_RTFTEPORC, PEDI_RTFTEMONTO, PEDI_RTIVAPORC, PEDI_RTIVAMONTO, PEDI_RTICAPORC, PEDI_RTICAMONTO, PEDI_SUCURSAL)
            VALUES (GEN_ID(ID_PEDIDO, 1), NEW.TERC_NIT, NEW.VEND_COD, 34, NEW.PREF_PRE, NEW.FACT_NUMERO, NEW.FACT_FECHA, :DIAS, NEW.FACT_DESPACHO, NEW.FACT_OBS, NEW.FACT_IVAINC, NEW.FACT_NOMCLIENTE, NEW.FACT_DTOPOR, NEW.FACT_DTOMONTO, NEW.FACT_ADICIONAL, NEW.FACT_IVAMONTO, NEW.FACT_EXTRA, NEW.FACT_TOTAL, 'N', 'N', NEW.PTVT_ID, NULL, NEW.FACT_RTFTEPOR, NEW.FACT_RTFTEMONTO, NEW.FACT_RTIVAPOR, NEW.FACT_RTIVAMONTO, NEW.FACT_RTICAPOR, NEW.FACT_RTICAMONTO, NEW.fact_sucursal);
        END
    execute procedure lee_configuracion ('CRM', 'EVENTOS', 'GRABAR EVENTOS AUTOMATICAMENTE DESDE DOCUMENTOS DE VENTAS') returning_values (:crmeven);
    if (crmeven = 'SI') then
        begin
        insert into crm_eventos (CREV_TIPO, CREV_ORIGEN, CREV_FECHA, CREV_HORA, CREV_MOTIVO, CREV_ASESOR, CREV_VALOR, CREV_EXPLICA, CREV_OBS, CREV_ACTIVIDAD, CRCL_NIT, CREV_ANULADO)
            VALUES (901, new.fact_id, new.fact_fecha, cast('now' as time), 6, new.vend_cod, new.fact_total, 'Factura No. ' || new.pref_pre || new.fact_numero, new.fact_obs, 0, new.terc_nit, new.fact_anulado);
        end
    SELECT FIRST 1 AUTO_CONTADO, AUTO_PREFRDC FROM autorizaciones WHERE PREF_PRE = NEW.pref_pre ORDER BY AUTO_NUMERO DESC
        INTO :CONTADO, :prefrdc;
    if (CONTADO = 'S') then
        BEGIN
        IDR = GEN_ID(id_recicaja, 1);
        SELECT CAJA_ID FROM punto_venta WHERE PTVT_ID = NEW.ptvt_id INTO :CAJA;
        execute procedure lee_configuracion('FACTURACION','FACTURAS','NUMERO DE RECIBO DE CAJA IGUAL AL DE FACTURA PARA VENTAS DE CONTADO') returning_values (numrdcf);
        if (NUMRDCF = 'SI') then
            BEGIN
            prefrdc = NEW.pref_pre;
            NUMRDC = NEW.fact_numero;
            END
        ELSE
            BEGIN
            SELECT PREF_ACTUAL FROM PREFIJOS WHERE PREF_PRE = :prefrdc AND TIDO_COD = 61 INTO :numrdc;
            END
        /* GRABE EL RECIBO DE CAJA */
        INSERT INTO RECIBOS_CAJA (RECA_ID, CAJA_ID, TIDO_COD, PREF_PRE, RECA_NUMERO, RECA_FECHA, RECA_CONC, RECA_MONTO, 
            RECA_RTFTEMONTO, RECA_RTIVAMONTO, RECA_RTICAMONTO, RECA_DTOF, RECA_OBS, TERC_NIT, RECA_NOMTERC, RECA_ANULADO,
            RECA_TRANSMIT, COBR_COD, RECA_PROVISIONAL, RECA_PROVID, RECA_USUARIO, NUMOK, RECA_TRM, RECA_EXEDENTE)
            VALUES (:IDR, :CAJA, 61, :prefrdc, :numrdc, NEW.fact_fecha, 'Cancela factura contado ' || new.pref_pre || new.fact_numero, (new.fact_total-new.fact_rtftemonto-new.fact_rtivamonto-new.fact_rticamonto),
            new.fact_rtftemonto, new.fact_rtivamonto, new.fact_rticamonto, 0, NULL, new.terc_nit, new.fact_nomcliente, 'N',
            'N', new.cobr_cod, NULL, NULL, USER, 'N', 1, 0);
        
        INSERT INTO RECIBOS_CAJA_DETALLE (RECA_ID, RCDE_ITEM, RCDE_TIPODOC, RCDE_IDDOC, RCDE_PREFIJO, RCDE_NUMERO,
            RCDE_ABONO, RCDE_RTFTE, RCDE_RTIVA, RCDE_RTICA, RCDE_DTOF, RCDE_ANULADO, RCDE_TRANSMIT, RCDE_COMIP,
            RCDE_SUCURSAL, RCDE_DIFCAMBIO)
            VALUES (:IDR, 1, 31, NEW.fact_id, NEW.pref_pre, NEW.fact_numero, (new.fact_total-new.fact_rtftemonto-new.fact_rtivamonto-new.fact_rticamonto),
            new.fact_rtftemonto, new.fact_rtivamonto, new.fact_rticamonto, 0, 'N', 'N', 'Q', NEW.fact_sucursal, 0);

        INSERT INTO RECIBOS_CAJA_PAGO (RECA_ID, RCPA_ITEM, FOPA_ID, RCPA_BANCO, RCPA_CUENTA, RCPA_NUMERO, RCPA_FECHA,
            RCPA_MONTO, RCPA_ANULADO, RCPA_TRANSMIT, RCPA_IVAMONTO)
            VALUES (:IDR, 1, 1, '', '', '', NEW.fact_fecha, (new.fact_total-new.fact_rtftemonto-new.fact_rtivamonto-new.fact_rticamonto), 'N', 'N', NEW.fact_ivamonto);
        END
    if (NEW.fact_consolida <> 0) then
        FOR SELECT C.cefa_tipoori, C.cefa_idori FROM consolide_faltantes C WHERE C.cefa_id = NEW.fact_consolida
        into :tipoori, :idori do
        INSERT INTO notas_documento (NODO_ID, TIDO_COD, NODO_IDDOC, NODO_FECHA, NODO_USER, NODO_RESUMEN, NODO_TIPO)
            VALUES (GEN_ID(id_notadoc, 1), :TIPOORI, :IDORI, NEW.fact_fecha, user, 'Factura No. ' || new.pref_pre || new.fact_numero, 2);

    INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
        VALUES (USER, 31, NEW.fact_id, 'I', NEW.pref_pre || NEW.fact_numero);
    END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER REMISIONES_VENTA_AI FOR REMISIONES_VENTA
ACTIVE AFTER INSERT POSITION 0
as
declare variable crmeven char(2);
declare variable tipoori integer;
declare variable idori integer;
begin
IF (NEW.REVT_ID <> 0) THEN
  BEGIN
  execute procedure lee_configuracion ('CRM', 'EVENTOS', 'GRABAR EVENTOS AUTOMATICAMENTE DESDE DOCUMENTOS DE VENTAS') returning_values (:crmeven);
  if (crmeven = 'SI') then
    begin
    insert into crm_eventos (CREV_TIPO, CREV_ORIGEN, CREV_FECHA, CREV_HORA, CREV_MOTIVO, CREV_ASESOR, CREV_VALOR, CREV_EXPLICA, CREV_OBS, CREV_ACTIVIDAD, CRCL_NIT, CREV_ANULADO)
        VALUES (902, new.revt_id, new.revt_fecha, cast('now' as time), 6, new.vend_cod, new.revt_total, 'Remisión cliente No. ' || new.pref_pre || new.revt_numero, new.revt_obs, 0, new.terc_nit, new.revt_anulado);
    end
  if (NEW.revt_consolida <> 0) then
    FOR SELECT C.cefa_tipoori, C.cefa_idori FROM consolide_faltantes C WHERE C.cefa_id = NEW.revt_consolida
        into :tipoori, :idori do
        INSERT INTO notas_documento (NODO_ID, TIDO_COD, NODO_IDDOC, NODO_FECHA, NODO_USER, NODO_RESUMEN, NODO_TIPO)
            VALUES (GEN_ID(id_notadoc, 1), :TIPOORI, :IDORI, NEW.revt_fecha, user, 'Remisión No. ' || new.pref_pre || new.revt_numero, 6);

  INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
    VALUES (USER, 32, NEW.revt_id, 'I', NEW.pref_pre || NEW.revt_numero);
  END
end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER PEDIDOS_AI FOR PEDIDOS
ACTIVE AFTER INSERT POSITION 0
as
declare variable crmeven char(2);
declare variable tipoori integer;
declare variable idori integer;
begin
IF (NEW.PEDI_ID <> 0) THEN
    begin
    /* actualice el estado */
    update crm_clientes set crcl_estado = 4 where crcl_nit = new.terc_nit;
    execute procedure lee_configuracion ('CRM', 'EVENTOS', 'GRABAR EVENTOS AUTOMATICAMENTE DESDE DOCUMENTOS DE VENTAS') returning_values (:crmeven);
    if (crmeven = 'SI') then
        begin
        insert into crm_eventos (CREV_TIPO, CREV_ORIGEN, CREV_FECHA, CREV_HORA, CREV_MOTIVO, CREV_ASESOR, CREV_VALOR, CREV_EXPLICA, CREV_OBS, CREV_ACTIVIDAD, CRCL_NIT, CREV_ANULADO)
            VALUES (903, new.pedi_id, new.pedi_fecha, cast('now' as time), 6, new.vend_cod, new.pedi_total, 'Pedido No. ' || new.pref_pre || new.pedi_numero, new.pedi_obs, 0, new.terc_nit, new.pedi_anulado);
        end

  if (NEW.pedi_consolida <> 0) then
    FOR SELECT C.cefa_tipoori, C.cefa_idori FROM consolide_faltantes C WHERE C.cefa_id = NEW.pedi_consolida
        into :tipoori, :idori do
        INSERT INTO notas_documento (NODO_ID, TIDO_COD, NODO_IDDOC, NODO_FECHA, NODO_USER, NODO_RESUMEN, NODO_TIPO)
            VALUES (GEN_ID(id_notadoc, 1), :TIPOORI, :IDORI, NEW.pedi_fecha, user, 'Pedido No. ' || new.pref_pre || new.pedi_numero, 5);

    INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
        VALUES (USER, 34, NEW.pedi_id, 'I', NEW.pref_pre || NEW.pedi_numero);
    end
end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER DEVOLUCIONES_VENTAS_AI FOR DEVOLUCIONES_VENTAS
ACTIVE AFTER INSERT POSITION 0
AS
declare variable CONC VARCHAR(60);
declare variable crmeven char(2);
BEGIN
if ((NEW.DEVT_ID <> 0) and (new.devt_anulado = 'N')) then
    BEGIN
    if ((new.devt_remid IS NULL) or (new.devt_remid = 0) ) then
        begin
        /* Registre el nuevo saldo del documento */
        INSERT INTO SALDOS_DOC_CARTERA (SDCA_TIPOREF, SDCA_IDREF, SDCA_FECHA, TERC_NIT, SDCA_RTFTE, SDCA_RTIVA, SDCA_RTICA, SDCA_ABONO, SDCA_ABRTFTE, SDCA_ABRTIVA, SDCA_ABRTICA, SDCA_DEBITO, SDCA_MONTO, SDCA_TRM)
            VALUES (33, NEW.DEVT_ID, NEW.DEVT_fecha, NEW.terc_nit, (NEW.DEVT_rtftemonto*-1), (NEW.DEVT_rtivamonto*-1), (NEW.DEVT_rticamonto*-1), 0, 0, 0, 0, 'N', (NEW.DEVT_TOTAL*-1), new.devt_trm);
        /* Registre el movimiento del cliente */
        CONC = 'DEVOLUCION VENTA No.' || NEW.PREF_PRE || NEW.DEVT_NUMERO || ' EN FACTURA ' || NEW.devt_factura;
        INSERT INTO MOVIMIENTO_CLIENTES (MVCL_ID, TERC_NIT, MVCL_TIPOREF, MVCL_IDREF, MVCL_FECHA, MVCL_VENCE, MVCL_CONC, MVCL_MONTO, MVCL_RTEFTE, MVCL_RTEIVA, MVCL_RTEICA, MVCL_DEBITO, MVCL_ABONO, MVCL_PREFREF, MVCL_NUMREF, MVCL_SUCURSAL, COBR_COD, MVCL_TRM)
          VALUES (GEN_ID(ID_MOVCLI, 1), NEW.TERC_NIT, 33, NEW.DEVT_ID, NEW.DEVT_FECHA, NEW.DEVT_FECHA, :CONC, NEW.DEVT_TOTAL, NEW.DEVT_RTFTEMONTO, NEW.DEVT_RTIVAMONTO, NEW.DEVT_RTICAMONTO, 'N', 'N', NEW.pref_pre, NEW.DEVT_numero, NEW.devt_sucursal, NEW.cobr_cod, new.devt_trm);
        end
    /* ACTUALICE LA CONSOLIDACION */
    if (NEW.DEVT_CONSOLIDA <> 0) then
        UPDATE consolidado_faltantes SET COFA_IDDES = NEW.devt_id, COFA_OK = 'S' WHERE COFA_ID = NEW.devt_consolida;
    execute procedure lee_configuracion ('CRM', 'EVENTOS', 'GRABAR EVENTOS AUTOMATICAMENTE DESDE DOCUMENTOS DE VENTAS') returning_values (:crmeven);
    if (crmeven = 'SI') then
        begin
        insert into crm_eventos (CREV_TIPO, CREV_ORIGEN, CREV_FECHA, CREV_HORA, CREV_MOTIVO, CREV_ASESOR, CREV_VALOR, CREV_EXPLICA, CREV_OBS, CREV_ACTIVIDAD, CRCL_NIT, CREV_ANULADO)
            VALUES (905, new.devt_id, new.devt_fecha, cast('now' as time), 6, new.vend_cod, new.devt_total, 'Devolución No. ' || new.pref_pre || new.devt_numero, new.devt_obs, 0, new.terc_nit, new.devt_anulado);
        end
    if (new.devt_factid <> 0) then
        INSERT INTO notas_documento (NODO_ID, TIDO_COD, NODO_IDDOC, NODO_FECHA, NODO_USER, NODO_RESUMEN, NODO_TIPO)
            VALUES (GEN_ID(id_notadoc, 1), 31, new.devt_factid, NEW.devt_fecha, user, 'Devolución No. ' || new.pref_pre || new.devt_numero, 7);
        
    INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
        VALUES (USER, 33, NEW.devt_id, 'I', NEW.pref_pre || NEW.devt_numero);
    END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER RECIBOS_CAJA_DETALLE_AI FOR RECIBOS_CAJA_DETALLE
ACTIVE AFTER INSERT POSITION 0
AS
declare variable EXISTE CHAR(1);
declare variable FEC DATE;
declare variable NIT VARCHAR(20);
declare variable CONCEPTO VARCHAR(60);
declare variable PREFIJO VARCHAR(4);
declare variable NUMERO VARCHAR(6);
declare variable SALDO NUMERIC(18,2);
declare variable RETES CHAR(2);
declare variable OK CHAR(1);
declare variable RCANTI INTEGER;
declare variable COBR INTEGER;
declare variable ACUMULA CHAR(8);
declare variable DIASMAX INTEGER;
declare variable FACTOR NUMERIC(9,4);
declare variable FACTORD NUMERIC(9,4);
declare variable DIAS INTEGER;
declare variable FECDOC DATE;
declare variable FECMIN DATE;
declare variable FECMINS VARCHAR(10);
declare variable TRM NUMERIC(18,2);
BEGIN
if ((NEW.RECA_ID <> 0) and (new.rcde_anulado = 'N')) then
    BEGIN
    /* Abone el documento referenciado */
    select PREF_PRE, RECA_NUMERO, RECA_fecha, RECA_CONC, TERC_NIT, COBR_COD, RECA_TRM from RECIBOS_CAJA
        where RECA_id = new.RECA_id into :PREFIJO, :NUMERO, :FEC, :CONCEPTO, :NIT, :COBR, :TRM;
    OK = 'N';
    if (new.RCDE_TIPODOC = 45) then
        BEGIN
        /* BUSQUE SI TIENE RECA_ID, SI NO LO ACTUALIZA */
        SELECT RECA_ID FROM ANTICIPOS_CLIENTE WHERE ANCL_ID = NEW.RCDE_IDDOC INTO :RCANTI;
        if (RCANTI = 0) then
            BEGIN
            OK = 'S';
            UPDATE ANTICIPOS_CLIENTE SET RECA_ID = NEW.RECA_ID WHERE ANCL_ID = NEW.RCDE_IDDOC;
            END
        END
    if (OK = 'N') then
        BEGIN
        /* valide que no se pase del saldo */
        execute procedure saldo_doc_cartera(new.rcde_tipodoc, new.rcde_iddoc, '9999/12/31', 0) returning_values(saldo);
        execute procedure lee_configuracion('CARTERA', 'SALDOS', 'DESCONTAR RETENCIONES POR CAUSACION') returning_values (RETES);
        if (SALDO = 0) then
          EXCEPTION DOCUMENTO_ABONO_MAYOR 'EL SALDO DEL DOCUMENTO ' || NEW.rcde_prefijo || NEW.rcde_numero || ' ES INSUFICIENTE.';
        else
          if (SALDO < 0) then
            BEGIN
            if (RETES = 'SI') then
                begin
                if (saldo > (NEW.rcde_abono + NEW.rcde_dtof)) then
                    EXCEPTION DOCUMENTO_ABONO_MAYOR 'EL SALDO DEL DOCUMENTO ' || NEW.rcde_prefijo || NEW.rcde_numero || ' ES INSUFICIENTE.';
                end
            ELSE
                begin
                if (saldo > (NEW.rcde_abono + NEW.rcde_rtfte + NEW.rcde_rtiva + NEW.rcde_rtica + NEW.rcde_dtof)) then
                    EXCEPTION DOCUMENTO_ABONO_MAYOR 'EL SALDO DEL DOCUMENTO ' || NEW.rcde_prefijo || NEW.rcde_numero || ' ES INSUFICIENTE.';
                end
            END
          else
            BEGIN
            if (RETES = 'SI') then
                begin
                if (saldo < (NEW.rcde_abono + NEW.rcde_dtof)) then
                    EXCEPTION DOCUMENTO_ABONO_MAYOR 'EL SALDO DEL DOCUMENTO ' || NEW.rcde_prefijo || NEW.rcde_numero || ' ES INSUFICIENTE.';
                end
            ELSE
                begin
                if (saldo < (NEW.rcde_abono + NEW.rcde_rtfte + NEW.rcde_rtiva + NEW.rcde_rtica + NEW.rcde_dtof)) then
                    EXCEPTION DOCUMENTO_ABONO_MAYOR 'EL SALDO DEL DOCUMENTO ' || NEW.rcde_prefijo || NEW.rcde_numero || ' ES INSUFICIENTE.';
                end
            END
        EXISTE = 'N';
        select 'S' from saldos_doc_cartera where sdca_tiporef = new.rcde_tipodoc and sdca_idref = new.rcde_iddoc and sdca_fecha = :FEC into :EXISTE;
        if (Existe = 'S') then
            begin
            /* actualice el saldo del dia */
            UPDATE saldos_doc_cartera
                SET SDCA_ABONO = SDCA_ABONO + NEW.rcde_abono + new.rcde_dtof,
                SDCA_ABRTFTE = SDCA_ABRTFTE + NEW.rcde_RTFTE,
                SDCA_ABRTIVA = SDCA_ABRTIVA + NEW.rcde_RTIVA,
                SDCA_ABRTICA = SDCA_ABRTICA + NEW.rcde_RTICA,
                SDCA_TRM = :TRM
                WHERE SDCA_TIPOREF = NEW.RCDE_TIPODOC AND SDCA_IDREF = NEW.rcde_IDDOC AND SDCA_FECHA = :FEC;
            END
        ELSE
            BEGIN
            /* Inserte un nuevo saldo diario */
            INSERT INTO SALDOS_DOC_CARTERA (SDCA_TIPOREF, SDCA_IDREF, SDCA_FECHA, TERC_NIT, SDCA_RTFTE, SDCA_RTIVA, SDCA_RTICA, SDCA_ABONO, SDCA_ABRTFTE, SDCA_ABRTIVA, SDCA_ABRTICA, SDCA_DEBITO, SDCA_MONTO, SDCA_TRM)
                VALUES (NEW.RCDE_TIPODOC, NEW.RCDE_IDDOC, :FEC, :NIT, 0, 0, 0, (NEW.rcde_abono+NEW.rcde_dtof), NEW.rcde_rtfte, NEW.rcde_rtiva, NEW.rcde_rtica, 'N', 0, :TRM);
            END
        END
    /* actualice el registro en mov_cliente (por si son varios items) */
    EXISTE = 'N';
    SELECT 'S' FROM MOVIMIENTO_CLIENTES WHERE MVCL_TIPOREF = 61 AND MVCL_IDREF = NEW.RECA_ID AND MVCL_SUCURSAL = NEW.rcde_sucursal INTO :EXISTE;
    if (EXISTE = 'S') then
        begin
        UPDATE movimiento_clientes
            SET MVCL_MONTO = MVCL_MONTO + NEW.rcde_abono + NEW.rcde_dtof,
                MVCL_RTEFTE = MVCL_RTEFTE + NEW.rcde_rtfte,
                MVCL_RTEIVA = MVCL_RTEIVA + NEW.rcde_rtiva,
                MVCL_RTEICA = MVCL_RTEICA + NEW.rcde_rtica,
                MVCL_TRM = :TRM
            WHERE MVCL_TIPOREF = 61 AND MVCL_IDREF = NEW.RECA_ID AND MVCL_SUCURSAL = NEW.rcde_sucursal;
        end
    ELSE
        INSERT INTO MOVIMIENTO_CLIENTES (MVCL_ID, TERC_NIT, MVCL_TIPOREF, MVCL_IDREF, MVCL_FECHA, MVCL_VENCE, MVCL_CONC, MVCL_MONTO, MVCL_RTEFTE, MVCL_RTEIVA, MVCL_RTEICA, MVCL_DEBITO, MVCL_ABONO, MVCL_PREFREF, MVCL_NUMREF, MVCL_SUCURSAL, COBR_COD, MVCL_TRM)
            VALUES (GEN_ID(ID_MOVCLI, 1), :NIT, 61, NEW.RECA_ID, :FEC, :FEC, :CONCEPTO, (NEW.RCDE_ABONO+NEW.RCDE_DTOF), NEW.RCDE_RTFTE, NEW.RCDE_RTIVA, NEW.RCDE_RTICA, 'N', 'S', :PREFIJO, :NUMERO, NEW.rcde_sucursal, :COBR, :TRM);

    INSERT INTO notas_documento (NODO_ID, TIDO_COD, NODO_IDDOC, NODO_FECHA, NODO_USER, NODO_RESUMEN, NODO_TIPO)
        VALUES (GEN_ID(id_notadoc, 1), new.rcde_tipodoc, new.rcde_iddoc, :fec, user, 'Recibo de caja No. ' || :prefijo || :numero, 4);

    /* acumule los puntos del vendedor */
    SELECT MVCL_FECHA FROM MOVIMIENTO_CLIENTES WHERE MVCL_TIPOREF = new.rcde_tipodoc AND MVCL_IDREF = new.rcde_iddoc
        INTO :FECDOC;
    if (FECDOC IS NOT NULL) then
        DIAS = FEC - FECDOC;
    else
        DIAS = 999;
    execute procedure lee_configuracion('FACTURACION', 'FACTURAS', 'ACUMULAR PUNTOS DE VENTAS POR VENDEDOR') returning_values (ACUMULA);
    execute procedure lee_configuracion('FACTURACION', 'FACTURAS', 'DIAS DE RECAUDO MAXIMO PARA ACUMULAR PUNTOS AL VENDEDOR') returning_values (DIASMAX);
    if ((acumula = 'SI') and (diasmax >= dias)) then
        begin
        SELECT COPU_FACTOR FROM comisiones_puntos WHERE COPU_COD = NEW.rcde_comip INTO :FACTOR;
        if ((NEW.rcde_tipodoc = 31) or (NEW.rcde_tipodoc = 41)) then
            begin
            /* recorra la factura acumulando los puntos */
            if (new.rcde_tipodoc = 31) then
                select (fact_total-fact_ivamonto)/fact_total from facturas where fact_id = new.rcde_iddoc into :factord;
            if (new.rcde_tipodoc = 41) then
                select ndcl_monto/(ndcl_monto+ndcl_ivamonto) from notas_debito_clientes where ndcl_id = new.rcde_iddoc into :factord;
            /* inserte el registro de puntos */
            insert into puntos_vendedor (vend_cod, ptvt_fecha, ptvt_tipodoc, ptvt_iddoc, ptvt_db, ptvt_cr)
                values (:cobr, :fec, new.rcde_tipodoc, new.rcde_iddoc, (new.rcde_abono*:factord*:factor), 0);
            end
        if ((new.rcde_tipodoc = 33) or (new.rcde_tipodoc = 42)) then
            begin
            if (new.rcde_tipodoc = 33) then
                select (devt_total-devt_ivamonto)/devt_total from devoluciones_ventas where devt_id = new.rcde_iddoc into :factord;
            if (new.rcde_tipodoc = 42) then
                select nccl_monto/(nccl_monto+nccl_ivamonto) from notas_credito_clientes where nccl_id = new.rcde_iddoc into :factord;
            /* inserte el registro de puntos */
            insert into puntos_vendedor (vend_cod, ptvt_fecha, ptvt_tipodoc, ptvt_iddoc, ptvt_db, ptvt_cr)
                values (:cobr, :fec, new.rcde_tipodoc, new.rcde_iddoc, 0, (new.rcde_abono*:factord*:factor));
            end

        execute procedure lee_configuracion('FACTURACION', 'FACTURAS', 'ACUMULAR PUNTOS POR VENTAS A CLIENTE REGULARES') returning_values (ACUMULA);
        execute procedure lee_configuracion('FACTURACION', 'FACTURAS', 'FECHA A PARTIR DE LA CUAL ACUMULAR PUNTOS A CLIENTES POR RECAUDO') returning_values (FECMINS);
        if (FECMINS <> '') then
            FECMIN = CAST(FECMINS AS DATE);
        else
            FECMIN = '2009/01/01';
        if ((acumula = 'RECAUDO') and (:fecdoc >= :fecmin)) then
            BEGIN
            SELECT COPU_FACTORCL FROM comisiones_puntos WHERE COPU_COD = NEW.rcde_comip INTO :FACTOR;
            if ((NEW.rcde_tipodoc = 31) or (NEW.rcde_tipodoc = 41)) then
                begin
                /* recorra la factura acumulando los puntos */
                if (new.rcde_tipodoc = 31) then
                    select (fact_total-fact_ivamonto)/fact_total from facturas where fact_id = new.rcde_iddoc into :factord;
                if (new.rcde_tipodoc = 41) then
                    select ndcl_monto/(ndcl_monto+ndcl_ivamonto) from notas_debito_clientes where ndcl_id = new.rcde_iddoc into :factord;
                /* inserte el registro de puntos */
                insert into puntos_cliente (ptcl_nit, ptcl_fecha, ptcl_tipodoc, ptcl_iddoc, ptcl_db, ptcl_cr)
                    values (:nit, :fec, new.rcde_tipodoc, new.rcde_iddoc, (new.rcde_abono*:factord*:factor/1000), 0);
                end
            if ((new.rcde_tipodoc = 33) or (new.rcde_tipodoc = 42)) then
                begin
                if (new.rcde_tipodoc = 33) then
                    select (devt_total-devt_ivamonto)/devt_total from devoluciones_ventas where devt_id = new.rcde_iddoc into :factord;
                if (new.rcde_tipodoc = 42) then
                    select nccl_monto/(nccl_monto+nccl_ivamonto) from notas_credito_clientes where nccl_id = new.rcde_iddoc into :factord;
                /* inserte el registro de puntos */
                insert into puntos_cliente (ptcl_nit, ptcl_fecha, ptcl_tipodoc, ptcl_iddoc, ptcl_db, ptcl_cr)
                    values (:nit, :fec, new.rcde_tipodoc, new.rcde_iddoc, 0, (new.rcde_abono*:factord*:factor/1000));
                end
            END
        end
    end
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER APLICACION_CLIENTE_DETALLE_AI FOR APLICACION_CLIENTE_DETALLE
ACTIVE AFTER INSERT POSITION 0
AS
declare variable EXISTE CHAR(1);
declare variable FEC DATE;
declare variable NIT VARCHAR(20);
declare variable CONCEPTO VARCHAR(60);
declare variable PREFIJO VARCHAR(4);
declare variable NUMERO VARCHAR(6);
declare variable SALDO NUMERIC(18,2);
declare variable RETES CHAR(2);
declare variable SUCURSAL VARCHAR(10);
declare variable COBR INTEGER;
declare variable TRM NUMERIC(18,2);
BEGIN
if ((NEW.APCL_ID <> 0) and (new.acde_anulado = 'N')) then
    BEGIN
    /* Abone el documento referenciado */
    select PREF_PRE, APCL_NUMERO, apcl_fecha, APCL_CONCEPTO, TERC_NIT, APCL_SUCURSAL, COBR_COD, APCL_TRM
        from aplicacion_cliente where apcl_id = new.apcl_id
        into :PREFIJO, :NUMERO, :FEC, :CONCEPTO, :NIT, :SUCURSAL, :COBR, :TRM;
    /* valide que no se pase del saldo */
    execute procedure saldo_doc_cartera(new.acde_tipodoc, new.acde_iddoc, '9999/12/31', 0) returning_values(saldo);
    execute procedure lee_configuracion('CARTERA', 'SALDOS', 'DESCONTAR RETENCIONES POR CAUSACION') returning_values (RETES);
    if (SALDO = 0) then
      EXCEPTION DOCUMENTO_ABONO_MAYOR 'EL SALDO DEL DOCUMENTO ' || NEW.acde_prefijo || NEW.acde_numero || ' ES INSUFICIENTE.';
    else
      if (SALDO < 0) then
        BEGIN
        if (RETES = 'SI') then
            begin
            if (saldo > (NEW.acde_aplicado + NEW.acde_difcambio)) then
                EXCEPTION DOCUMENTO_ABONO_MAYOR 'EL SALDO DEL DOCUMENTO ' || NEW.acde_prefijo || NEW.acde_numero || ' ES INSUFICIENTE.';
            end
        ELSE
            begin
            if (saldo > (NEW.acde_aplicado + NEW.acde_rtfte + NEW.acde_rtiva + NEW.acde_rtica + NEW.acde_difcambio)) then
                EXCEPTION DOCUMENTO_ABONO_MAYOR 'EL SALDO DEL DOCUMENTO ' || NEW.acde_prefijo || NEW.acde_numero || ' ES INSUFICIENTE.';
            end
        END
      else
        BEGIN
        if (RETES = 'SI') then
            begin
            if (saldo < (NEW.acde_aplicado + NEW.acde_difcambio)) then
                EXCEPTION DOCUMENTO_ABONO_MAYOR 'EL SALDO DEL DOCUMENTO ' || NEW.acde_prefijo || NEW.acde_numero || ' ES INSUFICIENTE.';
            end
        ELSE
            begin
            if (saldo < (NEW.acde_aplicado + NEW.acde_rtfte + NEW.acde_rtiva + NEW.acde_rtica + NEW.acde_difcambio)) then
                EXCEPTION DOCUMENTO_ABONO_MAYOR 'EL SALDO DEL DOCUMENTO ' || NEW.acde_prefijo || NEW.acde_numero || ' ES INSUFICIENTE.';
            end
        END
    select 'S' from saldos_doc_cartera where sdca_tiporef = new.acde_tipodoc and sdca_idref = new.acde_iddoc and sdca_fecha = :FEC into :EXISTE;
    if (Existe = 'S') then
        begin
        /* actualice el saldo del dia */
        UPDATE saldos_doc_cartera
            SET SDCA_ABONO = SDCA_ABONO + NEW.acde_aplicado + NEW.acde_difcambio,
                SDCA_ABRTFTE = SDCA_ABRTFTE + NEW.acde_RTFTE,
                SDCA_ABRTIVA = SDCA_ABRTIVA + NEW.acde_RTIVA,
                SDCA_ABRTICA = SDCA_ABRTICA + NEW.acde_RTICA,
                SDCA_TRM = :TRM
            WHERE SDCA_TIPOREF = NEW.ACDE_TIPODOC AND SDCA_IDREF = NEW.acde_IDDOC AND SDCA_FECHA = :FEC;
        END
    ELSE
        BEGIN
        /* Inserte un nuevo saldo diario */
        INSERT INTO SALDOS_DOC_CARTERA (SDCA_TIPOREF, SDCA_IDREF, SDCA_FECHA, TERC_NIT, SDCA_RTFTE, SDCA_RTIVA, SDCA_RTICA, SDCA_ABONO, SDCA_ABRTFTE, SDCA_ABRTIVA, SDCA_ABRTICA, SDCA_DEBITO, SDCA_MONTO, SDCA_TRM)
            VALUES (NEW.ACDE_TIPODOC, NEW.ACDE_IDDOC, :FEC, :NIT, 0, 0, 0, (NEW.acde_aplicado + NEW.acde_difcambio), NEW.acde_rtfte, NEW.acde_rtiva, NEW.acde_rtica, 'N', 0, :TRM);
        END
    /* actualice el registro en mov_cliente (por si son varios items) */
    EXISTE = 'N';
    SELECT 'S' FROM MOVIMIENTO_CLIENTES WHERE MVCL_TIPOREF = 43 AND MVCL_IDREF = NEW.APCL_ID INTO :EXISTE;
    if (EXISTE = 'S') then
        begin
        UPDATE movimiento_clientes
            SET MVCL_MONTO = MVCL_MONTO + NEW.acde_aplicado + NEW.acde_difcambio,
                MVCL_RTEFTE = MVCL_RTEFTE + NEW.acde_rtfte,
                MVCL_RTEIVA = MVCL_RTEIVA + NEW.acde_rtiva,
                MVCL_RTEICA = MVCL_RTEICA + NEW.acde_rtica,
                MVCL_TRM = :TRM
            WHERE MVCL_TIPOREF = 43 AND MVCL_IDREF = NEW.APCL_ID;
        end
    ELSE
        INSERT INTO MOVIMIENTO_CLIENTES (MVCL_ID, TERC_NIT, MVCL_TIPOREF, MVCL_IDREF, MVCL_FECHA, MVCL_VENCE, MVCL_CONC, MVCL_MONTO, MVCL_RTEFTE, MVCL_RTEIVA, MVCL_RTEICA, MVCL_DEBITO, MVCL_ABONO, MVCL_PREFREF, MVCL_NUMREF, MVCL_SUCURSAL, COBR_COD, MVCL_TRM)
            VALUES (GEN_ID(ID_MOVCLI, 1), :NIT, 43, NEW.APCL_ID, :FEC, :FEC, :CONCEPTO, (NEW.ACDE_APLICADO + NEW.acde_difcambio), NEW.ACDE_RTFTE, NEW.ACDE_RTIVA, NEW.ACDE_RTICA, 'N', 'S', :PREFIJO, :NUMERO, :SUCURSAL, :COBR, :TRM);

    INSERT INTO notas_documento (NODO_ID, TIDO_COD, NODO_IDDOC, NODO_FECHA, NODO_USER, NODO_RESUMEN, NODO_TIPO)
        VALUES (GEN_ID(id_notadoc, 1), new.acde_tipodoc, new.acde_iddoc, :fec, user, 'Aplicación No. ' || :prefijo || :numero, 4);
    end
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER EGRESOS_CRUCEC_AI FOR EGRESOS_CRUCEC
ACTIVE AFTER INSERT POSITION 0
AS
declare variable EXISTE CHAR(1);
declare variable FEC DATE;
declare variable NIT VARCHAR(20);
declare variable CONCEPTO VARCHAR(60);
declare variable PREFIJO VARCHAR(4);
declare variable NUMERO VARCHAR(6);
declare variable SALDO NUMERIC(18,2);
declare variable RETES CHAR(2);
declare variable COBR INTEGER;
declare variable TRM NUMERIC(18,2);
BEGIN
if ((NEW.egre_id <> 0) and (new.egcc_anulado = 'N')) then
    BEGIN
    /* Abone el documento referenciado */
    select PREF_PRE, EGRE_NUMERO, EGRE_fecha, EGRE_CONC, TERC_NIT, EGRE_TRM from EGRESOS
        where EGRE_id = new.egre_id into :PREFIJO, :NUMERO, :FEC, :CONCEPTO, :NIT, :TRM;
    SELECT COBR_COD FROM cliente_sucursales WHERE TERC_NIT = :NIT AND CLCU_COD = NEW.egcc_sucursal INTO :COBR;
    /* valide que no se pase del saldo */
    execute procedure saldo_doc_cartera(new.egcc_tipodoc, new.egcc_iddoc, '9999/12/31',0) returning_values(saldo);
    execute procedure lee_configuracion('CARTERA', 'SALDOS', 'DESCONTAR RETENCIONES POR CAUSACION') returning_values (RETES);
    if (SALDO = 0) then
      EXCEPTION DOCUMENTO_ABONO_MAYOR 'EL SALDO DEL DOCUMENTO ' || NEW.egcc_prefijo || NEW.egcc_numero || ' ES INSUFICIENTE.';
    else
      if (SALDO < 0) then
        BEGIN
        if (RETES = 'SI') then
            begin
            if (saldo > (NEW.egcc_abono + NEW.egcc_dtof + NEW.egcc_difcambio)) then
                EXCEPTION DOCUMENTO_ABONO_MAYOR 'EL SALDO DEL DOCUMENTO ' || NEW.egcc_prefijo || NEW.egcc_numero || ' ES INSUFICIENTE.';
            end
        ELSE
            begin
            if (saldo > (NEW.egcc_abono + NEW.egcc_rtfte + NEW.egcc_rtiva + NEW.egcc_rtica + NEW.egcc_dtof + NEW.egcc_difcambio)) then
                EXCEPTION DOCUMENTO_ABONO_MAYOR 'EL SALDO DEL DOCUMENTO ' || NEW.egcc_prefijo || NEW.egcc_numero || ' ES INSUFICIENTE.';
            end
        END
      else
        BEGIN
        if (RETES = 'SI') then
            begin
            if (saldo < (NEW.egcc_abono + NEW.egcc_dtof + NEW.egcc_difcambio)) then
                EXCEPTION DOCUMENTO_ABONO_MAYOR 'EL SALDO DEL DOCUMENTO ' || NEW.egcc_prefijo || NEW.egcc_numero || ' ES INSUFICIENTE.';
            end
        ELSE
            begin
            if (saldo < (NEW.egcc_abono + NEW.egcc_rtfte + NEW.egcc_rtiva + NEW.egcc_rtica + NEW.egcc_dtof + NEW.egcc_difcambio)) then
                EXCEPTION DOCUMENTO_ABONO_MAYOR 'EL SALDO DEL DOCUMENTO ' || NEW.egcc_prefijo || NEW.egcc_numero || ' ES INSUFICIENTE.';
            end
        END
    EXISTE = 'N';
    select 'S' from saldos_doc_cartera where sdca_tiporef = new.egcc_tipodoc and sdca_idref = new.egcc_iddoc and sdca_fecha = :FEC into :EXISTE;
    if (Existe = 'S') then
        begin
        /* actualice el saldo del dia */
        UPDATE saldos_doc_cartera
            SET SDCA_ABONO = SDCA_ABONO + NEW.egcc_abono + new.egcc_dtof + NEW.egcc_difcambio,
                SDCA_ABRTFTE = SDCA_ABRTFTE + NEW.egcc_rtfte,
                SDCA_ABRTIVA = SDCA_ABRTIVA + NEW.egcc_rtiva,
                SDCA_ABRTICA = SDCA_ABRTICA + NEW.egcc_rtica,
                SDCA_TRM = :TRM
                WHERE SDCA_TIPOREF = NEW.egcc_tipodoc AND SDCA_IDREF = NEW.egcc_iddoc AND SDCA_FECHA = :FEC;
        END
    ELSE
        BEGIN
        /* Inserte un nuevo saldo diario */
        INSERT INTO SALDOS_DOC_CARTERA (SDCA_TIPOREF, SDCA_IDREF, SDCA_FECHA, TERC_NIT, SDCA_RTFTE, SDCA_RTIVA, SDCA_RTICA, SDCA_ABONO, SDCA_ABRTFTE, SDCA_ABRTIVA, SDCA_ABRTICA, SDCA_DEBITO, SDCA_MONTO, SDCA_TRM)
            VALUES (NEW.egcc_tipodoc, NEW.egcc_iddoc, :FEC, :NIT, 0, 0, 0, (NEW.egcc_abono+NEW.egcc_dtof+NEW.egcc_difcambio), NEW.egcc_rtfte, NEW.egcc_rtiva, NEW.egcc_rtica, 'N', 0, :TRM);
        END
    /* actualice el registro en mov_cliente (por si son varios items) */
    EXISTE = 'N';
    SELECT 'S' FROM MOVIMIENTO_CLIENTES WHERE MVCL_TIPOREF = 62 AND MVCL_IDREF = NEW.egre_id AND MVCL_SUCURSAL = NEW.egcc_sucursal INTO :EXISTE;
    if (EXISTE = 'S') then
        begin
        UPDATE movimiento_clientes
            SET MVCL_MONTO = MVCL_MONTO + NEW.egcc_abono + NEW.egcc_dtof + NEW.egcc_difcambio,
                MVCL_RTEFTE = MVCL_RTEFTE + NEW.egcc_rtfte,
                MVCL_RTEIVA = MVCL_RTEIVA + NEW.egcc_rtiva,
                MVCL_RTEICA = MVCL_RTEICA + NEW.egcc_rtica,
                MVCL_TRM = :TRM
            WHERE MVCL_TIPOREF = 62 AND MVCL_IDREF = NEW.egre_id;
        end
    ELSE
        INSERT INTO MOVIMIENTO_CLIENTES (MVCL_ID, TERC_NIT, MVCL_TIPOREF, MVCL_IDREF, MVCL_FECHA, MVCL_VENCE, MVCL_CONC, MVCL_MONTO, MVCL_RTEFTE, MVCL_RTEIVA, MVCL_RTEICA, MVCL_DEBITO, MVCL_ABONO, MVCL_PREFREF, MVCL_NUMREF, MVCL_SUCURSAL, COBR_COD, MVCL_TRM)
            VALUES (GEN_ID(ID_MOVCLI, 1), :NIT, 62, NEW.egre_id, :FEC, :FEC, :CONCEPTO, (NEW.egcc_abono+NEW.egcc_dtof+NEW.egcc_difcambio), NEW.egcc_rtfte, NEW.egcc_rtiva, NEW.egcc_rtica, 'N', 'S', :PREFIJO, :NUMERO, NEW.egcc_sucursal, :COBR, :TRM);

    INSERT INTO notas_documento (NODO_ID, TIDO_COD, NODO_IDDOC, NODO_FECHA, NODO_USER, NODO_RESUMEN, NODO_TIPO)
        VALUES (GEN_ID(id_notadoc, 1), new.egcc_tipodoc, new.egcc_iddoc, :fec, user, 'Egreso cruce No. ' || :prefijo || :numero, 4);
    end
END
^

SET TERM ; ^

SET TERM ^ ;

create trigger NOTAS_DOCUMENTO_AI for NOTAS_DOCUMENTO
active AFTER INSERT position 0
as
declare variable consolida integer;
declare variable tipoori integer;
declare variable idori integer;
begin
if (new.tido_cod = 31) then
    begin
    /* agregue notas a los documentos relacionados */
    select fact_consolida from facturas where fact_id = new.nodo_iddoc into :consolida;
    if (consolida <> 0) then
        FOR SELECT C.cefa_tipoori, C.cefa_idori FROM consolide_faltantes C WHERE C.cefa_id = :consolida
        into :tipoori, :idori do
        INSERT INTO notas_documento (NODO_ID, TIDO_COD, NODO_IDDOC, NODO_FECHA, NODO_USER, NODO_RESUMEN, NODO_TIPO)
            VALUES (GEN_ID(id_notadoc, 1), :TIPOORI, :IDORI, NEW.nodo_fecha, user, new.nodo_resumen, NEW.NODO_TIPO);
    end
end
^

SET TERM ; ^



/* 20091221 */
/* CENTROS DE COSTO POR BODEGA POR ITEM */
SET TERM ^ ;

CREATE OR ALTER procedure CONTABIL_FACTURA (
    IDDOC integer,
    IDINTER integer)
returns (
    ERROR integer,
    VER char(1),
    IDC integer)
AS
declare variable pref varchar(4);
declare variable num varchar(6);
declare variable numero varchar(10);
declare variable fecaux date;
declare variable fecha char(8);
declare variable conc varchar(60);
declare variable venceaux date;
declare variable vence char(8);
declare variable vrdto numeric(18,2);
declare variable vradic numeric(18,2);
declare variable vrsubt numeric(18,2);
declare variable vriva numeric(18,2);
declare variable prtfte numeric(9,2);
declare variable vrrtfte numeric(18,2);
declare variable vrrtiva numeric(18,2);
declare variable prtica numeric(9,2);
declare variable vrrtica numeric(18,2);
declare variable vrtotal numeric(18,2);
declare variable vrextra numeric(18,2);
declare variable tipocomp varchar(3);
declare variable prefcont varchar(4);
declare variable ventas char(1);
declare variable ctaventas varchar(20);
declare variable iva char(1);
declare variable ctaiva varchar(20);
declare variable consumo char(1);
declare variable ctaconsumo varchar(20);
declare variable cartera char(1);
declare variable ctacartera varchar(20);
declare variable rtfte char(1);
declare variable ctartfte varchar(20);
declare variable rtiva char(1);
declare variable ctartiva varchar(20);
declare variable rtica char(1);
declare variable ctartica varchar(20);
declare variable inven char(1);
declare variable ctainven varchar(20);
declare variable costos char(1);
declare variable ctacostos varchar(20);
declare variable ctadto varchar(20);
declare variable ctaadic varchar(20);
declare variable ctaextra varchar(20);
declare variable existe char(1);
declare variable cuenta varchar(20);
declare variable monto numeric(18,2);
declare variable tipocuen char(1);
declare variable nit varchar(20);
declare variable nombre varchar(60);
declare variable proy varchar(4);
declare variable centro varchar(4);
declare variable proyi varchar(4);
declare variable centi varchar(4);
declare variable porc numeric(5,2);
declare variable debito numeric(18,2);
declare variable credito numeric(18,2);
declare variable nroi integer;
declare variable art varchar(15);
declare variable imptos numeric(18,2);
declare variable suma numeric(18,2);
declare variable porciva numeric(9,2);
declare variable tctaclien varchar(20);
declare variable tctaventa varchar(20);
declare variable tctartfte varchar(20);
declare variable tctartiva varchar(20);
declare variable tctartica varchar(20);
declare variable ctadic varchar(20);
declare variable baseadic varchar(20);
declare variable porcadic numeric(5,2);
declare variable valoradic numeric(18,2);
declare variable dbadic char(1);
declare variable ptovta integer;
declare variable anulado char(1);
declare variable dig integer;
declare variable mercancia numeric(18,2);
declare variable fomento varchar(2);
declare variable DTOXIT varchar(2);
declare variable vrconsumo numeric(18,2);
declare variable factor double precision;
declare variable cent char(1);
declare variable AUTORET VARCHAR(10);
declare variable FAUTORET DATE;
declare variable ERRORC INTEGER;
BEGIN
EXECUTE PROCEDURE LEE_CONFIGURACION('COMPRAS', 'FACTURAS', 'USAR IMPOCONSUMO COMO PORCENTAJE DE FOMENTO') returning_values (FOMENTO);
EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'FECHA AUTORETENEDOR NO DESCONTAR RETENCIONES DEL SALDO PERO SI CONTABILIZARLAS') returning_values (AUTORET);
if (AUTORET <> '') then
    FAUTORET = CAST(AUTORET AS DATE);
else
    FAUTORET = '9999/12/31';
/* BUSQUE LA INTERFACE */
EXISTE = 'N';
SELECT 'S', TICO_COD, PRCO_PRE, INVE_VENTAS, INVE_IVA, INVE_CONSUMO, INVE_CARTERA, INVE_RTFTE, INVE_RTIVA, INVE_RTICA, INVE_COSTO, INVE_INVEN, INVE_CTAVENTAS, INVE_CTAIVA, INVE_CTACONSUMO, INVE_CTADTO, INVE_CTAADIC, INVE_CTAEXTRA, INVE_CTACARTERA, INVE_CTARTFTE, INVE_CTARTIVA, INVE_CTARTICA, INVE_CTAINVEN, INVE_CTACOSTOS, INVE_CONFIRMAR, INVE_CENTRO
    FROM INTERFAZ_VENTAS
    WHERE INVE_ID = :IDINTER
    INTO :EXISTE, :TIPOCOMP, :PREFCONT, :VENTAS, :IVA, :CONSUMO, :CARTERA, :RTFTE, :RTIVA, :RTICA, :COSTOS, :INVEN, :CTAVENTAS, :CTAIVA, :CTACONSUMO, :CTADTO, :CTAADIC, :CTAEXTRA, :CTACARTERA, :CTARTFTE, :CTARTIVA, :CTARTICA, :CTAINVEN, :CTACOSTOS, :VER, :CENT;
if (EXISTE = 'S') then
  BEGIN
    /* BORRE CUALQUEIR CONTABILIZACION PREVIA */
    DELETE FROM CONTABILIZACION WHERE CNTB_TIPOREF = 31 AND CNTB_IDREF = :IDDOC;

  /* TRAIGA EL ENCABEZADO DE LA FACTURA */
  SELECT PREF_PRE, FACT_NUMERO, FACT_FECHA, F.TERC_NIT, PTVT_ID, FACT_VENCE, FACT_DTOMONTO, FACT_ADICIONAL, FACT_IVAMONTO, FACT_EXTRA, FACT_TOTAL, FACT_RTFTEPOR, FACT_RTFTEMONTO, FACT_RTIVAPOR, FACT_RTIVAMONTO, FACT_RTICAPOR, FACT_RTICAMONTO, FACT_NOMCLIENTE, TERC_CTARTFTE, TERC_CTARTIVA, TERC_CTARTICA, TERC_CTAVENTA, TERC_CTACLIENTE, FACT_ANULADO
        FROM FACTURAS F, TERCEROS T
        WHERE FACT_ID = :IDDOC AND F.TERC_NIT = T.TERC_NIT
        INTO :PREF, :NUM, :FECAUX, :NIT, :PTOVTA, :VENCEAUX, :VRDTO, :VRADIC, :VRIVA, :VREXTRA, :VRTOTAL, :PRTFTE, :VRRTFTE, :PORC, :VRRTIVA, :PRTICA, :VRRTICA, :NOMBRE, TCTARTFTE, TCTARTIVA, TCTARTICA, TCTAVENTA, TCTACLIEN, ANULADO;
  if (ANULADO = 'N') then
    BEGIN
    /* BUSQUE EL CENTRO DEL PUNTO, LA BODEGA, O EL PREFIJO  */
    IF (CENT = 'B') THEN
        SELECT B.BODE_CENTRO, B.BODE_PROY FROM BODEGA B, FACTURAS F
            WHERE B.BODE_COD = F.BODE_COD AND F.FACT_ID = :IDDOC INTO :CENTRO, :PROY;
    IF (CENT = 'V') THEN
        SELECT V.CENT_COD, V.PROY_COD FROM VENDEDORES V, FACTURAS F
            WHERE V.VEND_COD = F.VEND_COD AND F.FACT_ID = :IDDOC INTO :CENTRO, :PROY;
    IF (CENT = 'P') THEN
        SELECT P.PREF_CENTRO,P.PREF_PROY  FROM PREFIJOS P, FACTURAS F
            WHERE P.PREF_PRE = F.PREF_PRE AND F.FACT_ID = :IDDOC AND P.TIDO_COD = 31 INTO :CENTRO, :PROY;
    NUMERO = PREF || NUM;
    SELECT SUM (FADE_CONSUMO) FROM FACTURAS_DETALLE WHERE FACT_ID = :IDDOC  AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
        INTO MERCANCIA;
    VRSUBT = VRTOTAL - VREXTRA - VRIVA - MERCANCIA; /* BASE DE RETEFTE Y RETEICA */

    EXECUTE PROCEDURE lee_configuracion ('FACTURACION', 'FACTURAS', 'DESCUENTO PIE FACTURA IGUAL A SUMA DE DESCUENTOS POR ITEM') returning_values (:DTOXIT);
    if (DTOXIT = 'SI') then
        VRDTO = 0;
    MERCANCIA = VRSUBT - VRADIC + VRDTO;
    EXECUTE PROCEDURE FECHA_A_CONTA(:FECAUX) returning_values (:FECHA);
    EXECUTE PROCEDURE FECHA_A_CONTA(:VENCEAUX) returning_values (:VENCE);
    /* REGISTRE EL ENCABEZADO CONTABLE */
    IDC = GEN_ID(ID_CONTABILIZA, 1);
    if (STRLEN(NOMBRE)> 43 ) then
      CONC = 'FV No.' || NUMERO || '-' || SUBSTR(NOMBRE,1,43);
    ELSE
      CONC = 'FV No.' || NUMERO || '-' || NOMBRE;
    INSERT INTO CONTABILIZACION (CNTB_ID, CNTB_TIPOCOMP, CNTB_PREFCNT, CNTB_NUMERO, CNTB_FECHA, CNTB_CONCEPTO, CNTB_REF, CNTB_TIPOREF, CNTB_IDREF, CNTB_PREFREF, CNTB_NUMREF, CNTB_PROCESADO)
        VALUES (:IDC, :TIPOCOMP, :PREFCONT, :NUM, :FECHA, :CONC, '', 31, :IDDOC, :PREF, :NUM, 'N');
    NROI = 0;
    SUMA = 0;
    ERROR = 0;
    /* SI NO HAY CUENTA DE DESCUENTO NI ADICIONAL CALCULE UN FACTOR PARA LAS VENTAS Y EL IVA */
    if (MERCANCIA <> 0) then
        FACTOR = CAST(VRSUBT AS DOUBLE PRECISION) / CAST(MERCANCIA AS DOUBLE PRECISION);
    ELSE
        FACTOR = 1;
    /* TRAIGA EL NUMERO DE DIGITOS PARA EL REDONDEO */
    SELECT CAST(CONF_VALOR AS INTEGER) FROM CONFIGURACION WHERE CONF_MODULO = 'FACTURACION' AND
        CONF_CATEGORIA = 'GENERAL' AND CONF_PROPIEDAD = 'REDONDEO AL MULTIPLO DE DIEZ EN TOTALES' INTO :DIG;
    /* CUENTAS DE VENTAS */
    if (VENTAS = 'A') then
        BEGIN
        FOR SELECT MAX(COAR_CTAVNT), SUM(FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), SUM(FADE_IVAMONTO), SUM(FADE_CONSUMO), MAX(B.bode_proy), MAX(B.bode_centro)
            FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_DETALLE F, bodega b
            WHERE F.FACT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL)) and
            f.bode_cod = b.bode_cod
            GROUP BY COAR_CTAVNT
            INTO :CTAVENTAS, :MONTO, :IMPTOS, :VRCONSUMO, :PROYI, :CENTI
            DO
            BEGIN
            if (FOMENTO = 'SI') then
                MONTO = MONTO + VRCONSUMO;
            if ((CTADTO IS NULL) OR (CTADTO = '')) then
                MONTO = MONTO * FACTOR;
            execute procedure redondee(MONTO, DIG) returning_values (MONTO);
            if (MONTO <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTAVENTAS, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT F.ARTI_COD, (FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), FADE_CONSUMO
                        FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_DETALLE F
                        WHERE F.FACT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTAINV = :CUENTA AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
                        INTO :ART, :MONTO, :IMPTOS
                    DO
                        BEGIN
                        if (FOMENTO = 'SI') then
                            MONTO = MONTO + IMPTOS;
                        if ((CTADTO IS NULL) OR (CTADTO = '')) then
                            MONTO = MONTO * FACTOR;
                        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                        if (MONTO <> 0) then
                            BEGIN
                            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                            NROI = NROI + 1;
                            SUMA = SUMA - MONTO;
                            END
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    NROI = NROI + 1;
                    SUMA = SUMA - MONTO;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    IF (CENT = 'B') THEN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROYI, :CENTI, NULL, NULL, NULL, NULL, 0, 0);
                    ELSE
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA - MONTO;
                    END
                END /* MONTO <> 0 */
            END /* FOR */
        END /* VENTAS X ARTICULO */
     IF ((VENTAS = 'C') OR (VENTAS = 'K')) THEN
        BEGIN
        IF (VENTAS = 'C') THEN
            CTAVENTAS = TCTAVENTA;
        SELECT SUM(FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), SUM(FADE_IVAMONTO), SUM (FADE_CONSUMO)
            FROM FACTURAS_DETALLE F
            WHERE F.FACT_ID = :IDDOC AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
            INTO :MONTO, :IMPTOS, :VRCONSUMO;
        if (FOMENTO = 'SI') then
            MONTO = MONTO + VRCONSUMO;
        if ((CTADTO IS NULL) OR (CTADTO = '')) then
            MONTO = MONTO * FACTOR;
        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
        if (MONTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTAVENTAS, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT F.ARTI_COD, (FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), FADE_CONSUMO
                    FROM ARTICULO A, FACTURAS_DETALLE F
                    WHERE F.FACT_ID = :IDDOC AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
                    INTO :ART, :MONTO, :IMPTOS
                    DO
                    BEGIN
                    if (FOMENTO = 'SI') then
                        MONTO = MONTO + VRCONSUMO;
                    if ((CTADTO IS NULL) OR (CTADTO = '')) then
                        MONTO = MONTO * FACTOR;
                    execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                    if (MONTO <> 0) then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        SUMA = SUMA - MONTO;
                        END
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - MONTO;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - MONTO;
                END
            END /* MONTO <> 0 */
        END /* VENTAS DE CLIENTE O CONSTANTE */
    /* EL IVA EN VENTAS */
    if (IVA = 'A') then
        BEGIN
        FOR SELECT MAX(COAR_CTAIVAV), SUM(FADE_IVAMONTO), SUM(FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), sum(FADE_CONSUMO)
            FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_DETALLE F
            WHERE F.FACT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
            GROUP BY COAR_CTAIVAV
            INTO :CTAIVA, :IMPTOS, :MONTO, :VALORADIC
        DO
            BEGIN
            if (FOMENTO = 'SI') then
                MONTO = MONTO + VALORADIC;
            MONTO = MONTO * -1;
            MONTO = MONTO * FACTOR;
            IMPTOS = IMPTOS * FACTOR;
            execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
            execute procedure redondee(MONTO, DIG) returning_values (MONTO);
            if (IMPTOS <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTAIVA, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT F.ARTI_COD, FADE_IVAMONTO, (FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), TAIV_PORC, FADE_CONSUMO
                        FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_DETALLE F, TARIFA_IVA T
                        WHERE F.FACT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTAIVAV = :CUENTA AND A.TAIV_COD = T.TAIV_COD AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
                        INTO :ART, :IMPTOS, :MONTO, :PORCIVA, :VALORADIC
                    DO
                        BEGIN
                        if (FOMENTO = 'SI') then
                            MONTO = MONTO + VALORADIC;
                        MONTO = MONTO * -1;
                        MONTO = MONTO * FACTOR;
                        IMPTOS = IMPTOS * FACTOR;
                        execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                        if (IMPTOS <> 0) then
                            BEGIN
                            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, :MONTO, :PORCIVA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                            NROI = NROI + 1;
                            SUMA = SUMA + DEBITO - CREDITO;
                            END
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, :MONTO, ABS(:IMPTOS*100/:MONTO), :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    NROI = NROI + 1;
                    SUMA = SUMA - IMPTOS;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, :MONTO, ABS(:IMPTOS*100/:MONTO), :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA - IMPTOS;
                    END
                END   /* IMPTOS <> 0 */
            END /* FOR */
        END /* IVA X ARTICULO */
    if (IVA = 'K') then /* IVA EN CTA CONSTANTE */
        BEGIN
        SELECT SUM(FADE_IVAMONTO), SUM(FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), SUM(FADE_CONSUMO)
            FROM FACTURAS_DETALLE F
            WHERE F.FACT_ID = :IDDOC and FADE_IVAMONTO <> 0 AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
            INTO :IMPTOS, :MONTO, :valoradic;
        if (FOMENTO = 'SI') then
            MONTO = MONTO + VALORADIC;
        MONTO = MONTO * -1;
        MONTO = MONTO * FACTOR;
        IMPTOS = IMPTOS * FACTOR;
        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
        execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
        if (IMPTOS <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTAIVA, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT F.ARTI_COD, (FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), FADE_IVAMONTO, TAIV_PORC, FADE_CONSUMO
                    FROM ARTICULO A, FACTURAS_DETALLE F, TARIFA_IVA T
                    WHERE F.FACT_ID = :IDDOC AND A.TAIV_COD = T.TAIV_COD AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
                    INTO :ART, :MONTO, :IMPTOS, :PORCIVA, :VALORADIC
                    DO
                    BEGIN
                    if (FOMENTO = 'SI') then
                        MONTO = MONTO + VALORADIC;
                    MONTO = MONTO * -1;
                    MONTO = MONTO * FACTOR;
                    IMPTOS = IMPTOS * FACTOR;
                    execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                    execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                    if (IMPTOS <> 0) then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', 0, :IMPTOS, :MONTO, :PORCIVA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        SUMA = SUMA - IMPTOS;
                        END
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', 0, :IMPTOS, :MONTO, ABS(:IMPTOS*100/:MONTO), :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - IMPTOS;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', 0, :IMPTOS, :MONTO, ABS(:IMPTOS*100/:MONTO), :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - IMPTOS;
                END
            END /* IMPTOS <> 0 */
        END /* IVA EN CTA CONSTANTE */
    /* EL IMPOCONSUMO */
    if ((CONSUMO = 'A') AND (FOMENTO <> 'SI')) then
        BEGIN
        FOR SELECT MAX(COAR_CTACONS), SUM(FADE_CONSUMO)
            FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_DETALLE F
            WHERE F.FACT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
            GROUP BY COAR_CTACONS
            INTO :CTACONSUMO, :IMPTOS
        DO
            BEGIN
            execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
            if (IMPTOS <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTACONSUMO, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, REGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT F.ARTI_COD, FADE_CONSUMO
                        FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_DETALLE F
                        WHERE F.FACT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTACONS = :CUENTA AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
                        INTO :ART, :IMPTOS
                    DO
                        BEGIN
                        execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                        if (IMPTOS <> 0) then
                            BEGIN
                            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                            NROI = NROI + 1;
                            SUMA = SUMA - IMPTOS;
                            END
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    NROI = NROI + 1;
                    SUMA = SUMA - IMPTOS;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA - IMPTOS;
                    END
                END /* IMPTOS <> 0 */
            END /* FOR */
        END /* CONSUMO X ARTICULO */
    if ((CONSUMO = 'K') AND (FOMENTO <> 'SI')) then /* CONSUMO EN CTA CONSTANTE */
        BEGIN
        SELECT SUM(FADE_CONSUMO)
            FROM FACTURAS_DETALLE F
            WHERE F.FACT_ID = :IDDOC AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
            INTO :IMPTOS;
        execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
        if (IMPTOS <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTACONSUMO, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT F.ARTI_COD, FADE_CONSUMO
                    FROM ARTICULO A, FACTURAS_DETALLE F
                    WHERE F.FACT_ID = :IDDOC AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
                    INTO :ART, :IMPTOS
                    DO
                    BEGIN
                    execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                    if (IMPTOS <> 0) then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CTACONSUMO, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        SUMA = SUMA - IMPTOS;
                        END
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTACONSUMO, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - IMPTOS;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTACONSUMO, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - IMPTOS;
                END
            END /* IMPTOS <> 0 */
        END /* CONSUMO EN CTA CONSTANTE */
    /* DESCUENTO */
    if ((CTADTO IS NOT NULL) AND (CTADTO <> '')) then
        BEGIN
        execute procedure redondee(VRDTO, DIG) returning_values (VRDTO);
        if (VRDTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTADTO, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRDTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA + VRDTO;
                END
            if (TIPOCUEN = 'N') then
                    BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRDTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA + VRDTO;
                END
            END
        END /* DESCUENTO */
    /* VALOR ADIC */
    if ((CTAADIC IS NOT NULL) AND (CTAADIC <> '')) then
        BEGIN
        execute procedure redondee(VRADIC, DIG) returning_values (VRADIC);
        if (VRADIC <> 0) THEN
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTAADIC, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRADIC, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - VRADIC;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRADIC, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - VRADIC;
                END
            END
        END /* VR. ADIC */
    /* VALOR EXTRA */
    if ((CTAEXTRA IS NOT NULL) AND (CTAEXTRA <> '')) THEN
        BEGIN
        execute procedure redondee(VREXTRA, DIG) returning_values (VREXTRA);
        if (VREXTRA <> 0) THEN
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTAEXTRA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VREXTRA, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - VREXTRA;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VREXTRA, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - VREXTRA;
                END
            END
        END /* VR. EXTRA */
    /* DESCUENTE EL IMPOCONSUMO */
    SELECT SUM(FADE_CONSUMO)
        FROM FACTURAS_DETALLE F WHERE F.FACT_ID = :IDDOC AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL)) INTO :IMPTOS;
    vrsubt = vrsubt - IMPTOS;
    /* RETENCION FUENTE */
    if ((RTFTE = 'C') or (RTFTE = 'K')) then
      BEGIN
      execute procedure redondee(VRRTFTE, DIG) returning_values (VRRTFTE);
      if (VRRTFTE <> 0) then
        BEGIN
        if (RTFTE = 'C') then
            CTARTFTE = TCTARTFTE;
        EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTARTFTE, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :VRSUBT, :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTFTE;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :VRSUBT, :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTFTE;
            END
        /* AUTORETENCION */
        if (FAUTORET <= fecaux) then
            BEGIN
            EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'CUENTA DE AUTORETENCION EN LA FUENTE') returning_values (CTARTFTE);
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTARTFTE INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERROR (31, :IDDOC, :CTARTFTE, 2);
                CUENTA = CTARTFTE;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                begin
                EXECUTE PROCEDURE ERROR (31, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, (:VRSUBT*-1), :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - VRRTFTE;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, (:VRSUBT*-1), :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - VRRTFTE;
                END
            END
        END /* RTFTE */
      END
    if (RTFTE = 'A') then
      BEGIN
      FOR SELECT MAX(COAR_CTARTFTEV), MAX(COAR_RTFTE), MIN(COAR_RTBASE), SUM(FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), SUM((FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO)*COAR_RTFTE)
        FROM CONTABIL_ARTICULO C, FACTURAS_DETALLE F
        WHERE F.FACT_ID = :IDDOC AND F.ARTI_COD = C.ARTI_COD AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
        GROUP BY COAR_CTARTFTEV
        INTO :CTARTFTE, :PRTFTE, :baseadic, :MONTO, :VRRTFTE
        DO
        BEGIN
        MONTO = MONTO * FACTOR;
        if (MONTO >= BASEADIC) then
            BEGIN
            VRRTFTE = VRRTFTE * FACTOR / 100;
            execute procedure redondee(VRRTFTE, DIG) returning_values (VRRTFTE);
            execute procedure redondee(MONTO, DIG) returning_values (MONTO);
            if (VRRTFTE <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTARTFTE, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :MONTO, :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    NROI = NROI + 1;
                    SUMA = SUMA + VRRTFTE;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :MONTO, :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA + VRRTFTE;
                    END
                /* AUTORETENCION */
                if (FAUTORET <= fecaux) then
                    BEGIN
                    EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'CUENTA DE AUTORETENCION EN LA FUENTE') returning_values (CTARTFTE);
                    EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTARTFTE, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
                    if (ERRORC <> 0) then
                        ERROR = ERROR + 1;
                    if (TIPOCUEN = 'C') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, (:MONTO*-1), :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                        NROI = NROI + 1;
                        SUMA = SUMA - VRRTFTE;
                        END
                    if (TIPOCUEN = 'N') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, (:MONTO*-1), :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NROI = NROI + 1;
                        SUMA = SUMA - VRRTFTE;
                        END
                    END
                END
            END
        END /* RTFTE */
      END
    /* RETENCION IVA */
    if ((RTIVA = 'C') or (RTIVA = 'K')) then
      BEGIN
      execute procedure redondee(VRRTIVA, DIG) returning_values (VRRTIVA);
      if (VRRTIVA <> 0) then
        BEGIN
        if (RTIVA = 'C') then
            CTARTIVA = TCTARTIVA;
        EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTARTIVA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTIVA, 0, :VRIVA, :PORC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTIVA;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTIVA, 0, :VRIVA, :PORC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTIVA;
            END
        END /* RTIVA */
      END
    /* RETENCION DE ICA */
    if ((RTICA = 'C') or (RTICA = 'K')) then
      BEGIN
      execute procedure redondee(VRRTICA, DIG) returning_values (VRRTICA);
      if (VRRTICA <> 0) then
        BEGIN
        if (RTICA = 'C') then
            CTARTICA = TCTARTICA;
        EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTARTICA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTICA, 0, :VRSUBT, :PRTICA, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTICA;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTICA, 0, :VRSUBT, :PRTICA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTICA;
            END
        END /* RTICA */
      END
    /* CIERRE EL COMPROBANTE CONTRA LA CUENTA DEL TERCERO O LA CONSTANTE */
    if ((SUMA <> 0) and ((CARTERA = 'C') or (CARTERA = 'K') or (CARTERA = 'J'))) then
        BEGIN
        if (SUMA < 0) then
            BEGIN
            DEBITO = SUMA * -1;
            CREDITO = 0;
            END
        ELSE
            BEGIN
            DEBITO = 0;
            CREDITO = SUMA;
            END
        if (CARTERA = 'C') then
            CTACARTERA = TCTACLIEN;
        if (CARTERA = 'J') then
            BEGIN
            /* BUSQUE LA CUENTA DE LA CAJA */
            SELECT CAJA_CUENTA FROM CAJAS C, PUNTO_VENTA P
                WHERE P.CAJA_ID = C.CAJA_ID AND PTVT_ID = :PTOVTA
                INTO :CTACARTERA;
            END
        EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTACARTERA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :DEBITO, :CREDITO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
        if (TIPOCUEN = 'N') then
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :DEBITO, :CREDITO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
        NROI = NROI + 1;
        END /* SUMA EN CARTERA */
    /* CALCULE COSTOS EN VENTAS */
    EXECUTE PROCEDURE COSTO_EN_VENTAS(31, :IDDOC);
    if (COSTOS = 'A') then
        BEGIN
        FOR SELECT MAX(CTACOS), SUM(CAST(CANT AS DOUBLE PRECISION) * COSTO)
            FROM COSTO_VENTAS WHERE TIDO_COD = 31 AND COVE_ID = :iddoc
            GROUP BY CTACOS
            INTO :CTACOSTOS, :MONTO
        DO
            BEGIN
            if (MONTO <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTACOSTOS, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT ARTI_COD, CANT * COSTO
                        FROM COSTO_VENTAS WHERE TIDO_COD = 31 AND COVE_ID = :iddoc AND CTACOS = :CUENTA
                        INTO :ART, :MONTO
                    DO
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    NROI = NROI + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    END
                END /* MONTO <> 0 */
            END /* FOR */
        END /* COSTOS */
    if (COSTOS = 'K') then
        BEGIN
        SELECT SUM(CAST(CANT AS DOUBLE PRECISION) * COSTO)
            FROM COSTO_VENTAS WHERE TIDO_COD = 31 AND COVE_ID = :iddoc
            INTO :MONTO;
        if (MONTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTACOSTOS, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, REGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT ARTI_COD, CANT * COSTO
                    FROM COSTO_VENTAS WHERE TIDO_COD = 31 AND COVE_ID = :iddoc
                    INTO :ART, :MONTO
                DO
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTACOSTOS, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                    NROI = NROI + 1;
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTACOSTOS, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTACOSTOS, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                END
            END /* MONTO <> 0 */
        END /* COSTOS = K */
    if (INVEN = 'A') then
        BEGIN
        FOR SELECT MAX(CTAINV), SUM(CAST(CANT AS DOUBLE PRECISION) * COSTO)
            FROM COSTO_VENTAS WHERE TIDO_COD = 31 AND COVE_ID = :iddoc
            GROUP BY CTAINV
            INTO :CTAINVEN, :MONTO
        DO
            BEGIN
            if (MONTO <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTAINVEN, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, REGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT ARTI_COD, CANT * COSTO
                        FROM COSTO_VENTAS WHERE TIDO_COD = 31 AND COVE_ID = :iddoc AND CTAINV = :CUENTA
                        INTO :ART, :MONTO
                    DO
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    NROI = NROI + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    END
                END /* MONTO <> 0 */
            END /* FOR */
        END /* INVEN = A */
    if (INVEN = 'K') then
        BEGIN
        SELECT SUM(CAST(CANT AS DOUBLE PRECISION) * COSTO)
            FROM COSTO_VENTAS WHERE TIDO_COD = 31 AND COVE_ID = :iddoc
            INTO :MONTO;
        if (MONTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTAINVEN, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT ARTI_COD, CANT * COSTO
                    FROM COSTO_VENTAS WHERE TIDO_COD = 31 AND COVE_ID = :iddoc
                    INTO :ART, :MONTO
                DO
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTAINVEN, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                    NROI = NROI + 1;
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAINVEN, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAINVEN, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                END
            END /* MONTO <> 0 */
        END /* INVEN = K */
    /* recorra las cuentas adicionales */
    FOR SELECT INVC_CUENTA, INVC_BASE, INVC_PORC, INVC_VALOR, INVC_DB
        FROM INTERFAZ_VENTAS_CTAS
        WHERE INVE_ID = :IDINTER
        INTO :CTADIC, :BASEADIC, :PORCADIC, :VALORADIC, :DBADIC
        DO
        BEGIN
        if (VALORADIC <> 0) then
            MONTO = VALORADIC;
        ELSE
            BEGIN
            if (:BASEADIC = 'SUBTOTAL') then
                VALORADIC = vrsubt;
            if (:BASEADIC = 'DESCUENTO') then
                VALORADIC = VRDTO;
            if (:BASEADIC = 'IVA') then
                VALORADIC = VRIVA;
            if (:BASEADIC = 'ADICIONAL') then
                VALORADIC = VRADIC;
            if (:BASEADIC = 'EXTRA') then
                VALORADIC = VREXTRA;
            if (:BASEADIC = 'TOTAL') then
                VALORADIC = VRTOTAL;
            MONTO = VALORADIC * PORCADIC / 100;
            END
        if (MONTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTADIC, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                if (DBADIC = 'S') then
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                ELSE
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                if (DBADIC = 'S') then
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                ELSE
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                END
            NROI = NROI + 1;
            END
        END
    if (ERROR > 0) then
        VER = 'S';
    SUSPEND;
    END /* NO ANULADO */
  END /* EXISTE LA INTERFAZ */
ELSE
    BEGIN
    EXECUTE PROCEDURE ERROR (31, :IDDOC, :PREF, 1);
    ERROR = ERROR + 1;
    VER = 'S';
    SUSPEND;
    END
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE FACTURAS_SIN_CONTABILIDAD(
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    ID INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    ESTADO VARCHAR(20),
    IDI INTEGER,
    IDC INTEGER)
AS
DECLARE VARIABLE VER CHAR(2);
declare variable FECICNT VARCHAR(10);
declare variable FECFCNT VARCHAR(10);
declare variable ERROR INTEGER;
declare variable idref INTEGER;
BEGIN
EXECUTE PROCEDURE fecha_a_conta(FECINI) returning_values (FECICNT);
EXECUTE PROCEDURE fecha_a_conta(FECFIN) returning_values (FECFCNT);
FOR SELECT FACT_ID, PREF_PRE, FACT_NUMERO FROM FACTURAS WHERE FACT_ANULADO = 'N' AND
    FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN INTO :ID, :PREF, :NUMERO
DO
  BEGIN
  idref = null;
  SELECT ENCO_IDREF FROM COMPROBANTE_ENCABEZADO WHERE ENCO_TIPOREF = 31 AND ENCO_FECHA >= :FECICNT AND ENCO_FECHA <= :FECFCNT and ENCO_IDREF = :ID into :idref;
  if (idref IS NULL) then
  begin
   ESTADO = 'PROCESANDO';
   ERROR = NULL;
   SUSPEND;
   SELECT MAX(INVE_ID) FROM INTERFAZ_VENTAS WHERE PREF_PRE = :PREF AND TIDO_COD = 31 INTO :IDI;
   EXECUTE PROCEDURE CONTABIL_FACTURA (:ID, :IDI) RETURNING_VALUES (:ERROR, VER, :IDC);
   if ((ERROR = 0) or (error IS NULL)) then
    BEGIN
    EXECUTE PROCEDURE CONTABILIZA_PENDIENTE (:IDC);
    ESTADO = 'OK';
    END
   ELSE
    ESTADO = 'ERROR';
   suspend;
  end
  END
END

^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure CONTABIL_DEVOLCLI (
    IDDOC integer,
    IDINTER integer)
returns (
    ERROR integer,
    VER char(1),
    IDC integer)
AS
declare variable PREF VARCHAR(4);
declare variable NUM VARCHAR(6);
declare variable NUMERO VARCHAR(10);
declare variable FECAUX DATE;
declare variable FECHA CHAR(8);
declare variable CONC CHAR(120);
declare variable NUMFAC VARCHAR(10);
declare variable VRDTO NUMERIC(18, 2);
declare variable VRADIC NUMERIC(18, 2);
declare variable VRSUBT NUMERIC(18, 2);
declare variable VRIVA NUMERIC(18, 2);
declare variable PRTFTE NUMERIC(9, 2);
declare variable VRRTFTE NUMERIC(18, 2);
declare variable VRRTIVA NUMERIC(18, 2);
declare variable PRTICA NUMERIC(9, 2);
declare variable VRRTICA NUMERIC(18, 2);
declare variable VRTOTAL NUMERIC(18, 2);
declare variable VREXTRA NUMERIC(18, 2);
declare variable TIPOCOMP VARCHAR(3);
declare variable PREFCONT VARCHAR(4);
declare variable VENTAS CHAR(1);
declare variable CTAVENTAS VARCHAR(20);
declare variable IVA CHAR(1);
declare variable CTAIVA VARCHAR(20);
declare variable CONSUMO CHAR(1);
declare variable CTACONSUMO VARCHAR(20);
declare variable CARTERA CHAR(1);
declare variable CTACARTERA VARCHAR(20);
declare variable RTFTE CHAR(1);
declare variable CTARTFTE VARCHAR(20);
declare variable RTIVA CHAR(1);
declare variable CTARTIVA VARCHAR(20);
declare variable RTICA CHAR(1);
declare variable CTARTICA VARCHAR(20);
declare variable INVEN CHAR(1);
declare variable CTAINVEN VARCHAR(20);
declare variable COSTOS CHAR(1);
declare variable CTACOSTOS VARCHAR(20);
declare variable CTADTO VARCHAR(20);
declare variable CTAADIC VARCHAR(20);
declare variable CTAEXTRA VARCHAR(20);
declare variable EXISTE CHAR(1);
declare variable CUENTA VARCHAR(20);
declare variable MONTO NUMERIC(18,2);
declare variable TIPOCUEN CHAR(1);
declare variable NIT VARCHAR(20);
declare variable PROY VARCHAR(4);
declare variable CENTRO VARCHAR(4);
declare variable PROYI VARCHAR(4);
declare variable CENTI VARCHAR(4);
declare variable PORC NUMERIC(5,2);
declare variable DEBITO NUMERIC(18,2);
declare variable CREDITO NUMERIC(18,2);
declare variable NROI INTEGER;
declare variable ART VARCHAR(15);
declare variable IMPINC CHAR(1);
declare variable IMPTOS NUMERIC(18, 2);
declare variable SUMA NUMERIC(18,2);
declare variable PORCIVA NUMERIC(9,2);
declare variable TCTACLIEN VARCHAR(20);
declare variable TCTAVENTA VARCHAR(20);
declare variable TCTARTFTE VARCHAR(20);
declare variable TCTARTIVA VARCHAR(20);
declare variable TCTARTICA VARCHAR(20);
declare variable CTADIC VARCHAR(20);
declare variable BASEADIC VARCHAR(20);
declare variable PORCADIC NUMERIC(5,2);
declare variable VALORADIC NUMERIC(18,2);
declare variable DBADIC CHAR(1);
declare variable PTOVTA INTEGER;
declare variable ANULADO CHAR(1);
declare variable CENT CHAR(1);
DECLARE VARIABLE MERCANCIA NUMERIC(18,2);
declare variable FACTOR DOUBLE PRECISION;
declare variable DIG INTEGER;
DECLARE VARIABLE FOMENTO VARCHAR(2);
DECLARE VARIABLE VRCONSUMO NUMERIC(18,2);
declare variable AUTORET VARCHAR(10);
declare variable FAUTORET DATE;
declare variable IDREM INTEGER;
declare variable DTOXIT CHAR(2);
declare variable ERRORC INTEGER;
BEGIN
EXECUTE PROCEDURE LEE_CONFIGURACION('COMPRAS', 'FACTURAS', 'USAR IMPOCONSUMO COMO PORCENTAJE DE FOMENTO') returning_values (FOMENTO);
EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'FECHA AUTORETENEDOR NO DESCONTAR RETENCIONES DEL SALDO PERO SI CONTABILIZARLAS') returning_values (AUTORET);
if (AUTORET <> '') then
    FAUTORET = CAST(AUTORET AS DATE);
else
    FAUTORET = '9999/12/31';
  /* BUSQUE LA INTERFACE */
  EXISTE = 'N';
  SELECT 'S', TICO_COD, PRCO_PRE, INVE_VENTAS, INVE_IVA, INVE_CONSUMO, INVE_CARTERA, INVE_RTFTE, INVE_RTIVA, INVE_RTICA, INVE_COSTO, INVE_INVEN, INVE_CTAVENTAS, INVE_CTAIVA, INVE_CTACONSUMO, INVE_CTADTO, INVE_CTAADIC, INVE_CTAEXTRA, INVE_CTACARTERA, INVE_CTARTFTE, INVE_CTARTIVA, INVE_CTARTICA, INVE_CTAINVEN, INVE_CTACOSTOS, INVE_CONFIRMAR, INVE_CENTRO
    FROM INTERFAZ_VENTAS
    WHERE INVE_ID = :IDINTER
    INTO :EXISTE, :TIPOCOMP, :PREFCONT, :VENTAS, :IVA, :CONSUMO, :CARTERA, :RTFTE, :RTIVA, :RTICA, :COSTOS, :INVEN, :CTAVENTAS, :CTAIVA, :CTACONSUMO, :CTADTO, :CTAADIC, :CTAEXTRA, :CTACARTERA, :CTARTFTE, :CTARTIVA, :CTARTICA, :CTAINVEN, :CTACOSTOS, :VER, :CENT;
  if (EXISTE = 'S') then
   BEGIN
    /* BORRE CUALQUEIR CONTABILIZACION PREVIA */
    DELETE FROM CONTABILIZACION WHERE CNTB_TIPOREF = 33 AND CNTB_IDREF = :IDDOC;
    /* TRAIGA EL ENCABEZADO DE LA DEVOLUCION */
   SELECT PREF_PRE, DEVT_NUMERO, DEVT_FECHA, F.TERC_NIT, DEVT_IVAINC, PTVT_ID, DEVT_FACTURA, DEVT_DTOMONTO, DEVT_ADICIONAL, DEVT_IVAMONTO, DEVT_EXTRA, DEVT_TOTAL, DEVT_RTFTEPORC, DEVT_RTFTEMONTO, DEVT_RTIVAPORC, DEVT_RTIVAMONTO, DEVT_RTICAPORC, DEVT_RTICAMONTO, TERC_CTARTFTE, TERC_CTARTIVA, TERC_CTARTICA, TERC_CTAVENTA, TERC_CTACLIENTE, DEVT_ANULADO, DEVT_REMID
        FROM DEVOLUCIONES_VENTAS F, TERCEROS T
        WHERE DEVT_ID = :IDDOC AND F.TERC_NIT = T.TERC_NIT
        INTO :PREF, :NUM, :FECAUX, :NIT, :IMPINC, :PTOVTA, :NUMFAC, :VRDTO, :VRADIC, :VRIVA, :VREXTRA, :VRTOTAL, :PRTFTE, :VRRTFTE, :PORC, :VRRTIVA, :PRTICA, :VRRTICA, :TCTARTFTE, TCTARTIVA, TCTARTICA, TCTAVENTA, TCTACLIEN, ANULADO, :IDREM;
   if (idrem is null) Then
    IDREM = 0;
   if ((ANULADO = 'N') AND (IDREM = 0)) then
    BEGIN
    NUMERO = PREF || NUM;
    SELECT SUM(DVDE_CONSUMO) FROM devoluciones_ventas_detalle WHERE DEVT_ID = :iddoc AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL)) INTO :MERCANCIA;
    VRSUBT = VRTOTAL - VREXTRA - VRIVA - MERCANCIA; /* BASE DE RETEFTE Y RETEICA */
    EXECUTE PROCEDURE lee_configuracion ('FACTURACION', 'DEVOLUCIONES', 'DESCUENTO PIE DEVOLUCION IGUAL A SUMA DE DESCUENTOS POR ITEM') returning_values (:DTOXIT);
    if (DTOXIT = 'SI') then
        VRDTO = 0;
    MERCANCIA = VRSUBT - VRADIC + VRDTO;
    IF (CENT = 'B') THEN
        SELECT B.BODE_CENTRO, B.BODE_PROY FROM BODEGA B, DEVOLUCIONES_VENTAS F
            WHERE B.BODE_COD = F.BODE_COD AND F.DEVT_ID = :IDDOC INTO :CENTRO, :PROY;
    IF (CENT = 'V') THEN
        SELECT V.CENT_COD, V.PROY_COD FROM VENDEDORES V, DEVOLUCIONES_VENTAS F
            WHERE V.VEND_COD = F.VEND_COD AND F.DEVT_ID = :IDDOC INTO :CENTRO, :PROY;
    IF (CENT = 'P') THEN
        SELECT P.PREF_CENTRO,P.PREF_PROY  FROM PREFIJOS P, DEVOLUCIONES_VENTAS F
            WHERE P.PREF_PRE = F.PREF_PRE AND F.DEVT_ID = :IDDOC AND P.TIDO_COD = 33 INTO :CENTRO, :PROY;
    EXECUTE PROCEDURE FECHA_A_CONTA(:FECAUX) returning_values (:FECHA);
    /* REGISTRE EL ENCABEZADO CONTABLE */
    IDC = GEN_ID(ID_CONTABILIZA, 1);
    CONC = 'DEVOLUCION VENTAS No. ' || NUMERO || ' EN FACTURA ' || NUMFAC;
    CONC = SUBSTR(CONC, 1, 60);
    INSERT INTO CONTABILIZACION (CNTB_ID, CNTB_TIPOCOMP, CNTB_PREFCNT, CNTB_NUMERO, CNTB_FECHA, CNTB_CONCEPTO, CNTB_REF, CNTB_TIPOREF, CNTB_IDREF, CNTB_PREFREF, CNTB_NUMREF, CNTB_PROCESADO)
        VALUES (:IDC, :TIPOCOMP, :PREFCONT, :NUM, :FECHA, :CONC, '', 33, :IDDOC, :PREF, :NUM, 'N');
    NROI = 0;
    SUMA = 0;
    ERROR = 0;
    /* SI NO HAY CUENTA DE DESCUENTO NI ADICIONAL CALCULE UN FACTOR PARA LAS VENTAS Y EL IVA */
    if (MERCANCIA <> 0) then
        FACTOR = CAST(VRSUBT AS DOUBLE PRECISION) / CAST(MERCANCIA AS DOUBLE PRECISION);
    ELSE
        FACTOR = 1;
    /* TRAIGA EL NUMERO DE DIGITOS PARA EL REDONDEO */
    SELECT CAST(CONF_VALOR AS INTEGER) FROM CONFIGURACION WHERE CONF_MODULO = 'FACTURACION' AND
        CONF_CATEGORIA = 'GENERAL' AND CONF_PROPIEDAD = 'REDONDEO AL MULTIPLO DE DIEZ EN TOTALES' INTO :DIG;
    /* CUENTAS DE VENTAS */
    if (VENTAS = 'A') then
        BEGIN
        FOR SELECT MAX(COAR_CTADEV), SUM(DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO), SUM(DVDE_IVAMONTO), SUM(DVDE_CONSUMO), MAX(B.bode_proy), MAX(B.bode_centro)
            FROM ARTICULO A, CONTABIL_ARTICULO C, DEVOLUCIONES_VENTAS_DETALLE F, BODEGA B
            WHERE F.DEVT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
            AND f.bode_cod = b.bode_cod
            GROUP BY COAR_CTADEV
            INTO :CTAVENTAS, :MONTO, :IMPTOS, :VRCONSUMO, :proyi, :centi
            DO
            BEGIN
            if (FOMENTO = 'SI') then
                MONTO = MONTO + VRCONSUMO;
            if ((CTADTO IS NULL) OR (CTADTO = '')) then
                MONTO = MONTO * FACTOR;
            execute procedure redondee(MONTO, DIG) returning_values (MONTO);
            if (MONTO <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTAVENTAS, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT F.ARTI_COD, (DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO), (DVDE_IVAMONTO+DVDE_CONSUMO)
                        FROM ARTICULO A, CONTABIL_ARTICULO C, DEVOLUCIONES_VENTAS_DETALLE F
                        WHERE F.DEVT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTAINV = :CUENTA AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
                        INTO :ART, :MONTO, :IMPTOS
                    DO
                        BEGIN
                        if (IMPINC = 'S') then
                            MONTO = MONTO - IMPTOS;
                        if ((CTADTO IS NULL) OR (CTADTO = '')) then
                            MONTO = MONTO * FACTOR;
                        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        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, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                    NROI = NROI + 1;
                    SUMA = SUMA + MONTO;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    IF (CENT = 'B') THEN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROYI, :CENTI, NULL, NULL, NULL, NULL, 0, 0);
                    ELSE
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA + MONTO;
                    END
                END /* MONTO <> 0 */
            END /* FOR */
        END /* VENTAS X ARTICULO */
     IF ((VENTAS = 'C') OR (VENTAS = 'K')) THEN
        BEGIN
        IF (VENTAS = 'C') THEN
            CTAVENTAS = TCTAVENTA;
        SELECT SUM(DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO), SUM(DVDE_IVAMONTO), SUM(DVDE_CONSUMO)
            FROM DEVOLUCIONES_VENTAS_DETALLE F
            WHERE F.DEVT_ID = :IDDOC  AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
            INTO :MONTO, :IMPTOS, :VRCONSUMO;
        if (FOMENTO = 'SI') then
            MONTO = MONTO + VRCONSUMO;
        if ((CTADTO IS NULL) OR (CTADTO = '')) then
            MONTO = MONTO * FACTOR;
        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
        if (MONTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTAVENTAS, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT F.ARTI_COD, (DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO), (DVDE_IVAMONTO+DVDE_CONSUMO)
                    FROM ARTICULO A, DEVOLUCIONES_VENTAS_DETALLE F
                    WHERE F.DEVT_ID = :IDDOC AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
                    INTO :ART, :MONTO, :IMPTOS
                    DO
                    BEGIN
                    if (IMPINC = 'S') then
                        MONTO = MONTO - IMPTOS;
                    if ((CTADTO IS NULL) OR (CTADTO = '')) then
                        MONTO = MONTO * FACTOR;
                    execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                    NROI = NROI + 1;
                    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, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                NROI = NROI + 1;
                SUMA = SUMA + MONTO;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA + MONTO;
                END
            END /* MONTO <> 0 */
        END /* VENTAS DE CLIENTE O CONSTANTE */
    /* EL IVA EN VENTAS */
    if (IVA = 'A') then
        BEGIN
        FOR SELECT MAX(COAR_CTAIVAV), SUM(DVDE_IVAMONTO), SUM(DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO), SUM(DVDE_CONSUMO)
            FROM ARTICULO A, CONTABIL_ARTICULO C, DEVOLUCIONES_VENTAS_DETALLE F
            WHERE F.DEVT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
            GROUP BY COAR_CTAIVAV
            INTO :CTAIVA, :IMPTOS, :MONTO, :VALORADIC
        DO
            BEGIN
            if (FOMENTO = 'SI') then
                MONTO = MONTO + VALORADIC;
            MONTO = MONTO * -1;
            MONTO = MONTO * FACTOR;
            IMPTOS = IMPTOS * FACTOR;
            execute procedure redondee(MONTO, DIG) returning_values (MONTO);
            execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
            if (IMPTOS <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTAIVA, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT F.ARTI_COD, DVDE_IVAMONTO, (DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO), TAIV_PORC, DVDE_CONSUMO
                        FROM ARTICULO A, CONTABIL_ARTICULO C, DEVOLUCIONES_VENTAS_DETALLE F, TARIFA_IVA T
                        WHERE F.DEVT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND A.TAIV_COD = T.TAIV_COD AND COAR_CTAIVAV = :CUENTA AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
                        INTO :ART, :IMPTOS, :MONTO, :PORCIVA, :VALORADIC
                    DO
                        BEGIN
                        if (IMPINC = 'S') then
                            MONTO = MONTO - IMPTOS - VALORADIC;
                        MONTO = MONTO * -1;
                        MONTO = MONTO * FACTOR;
                        IMPTOS = IMPTOS * FACTOR;
                        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                        execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                        if (IMPTOS <> 0) then
                            BEGIN
                            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :IMPTOS, 0, :MONTO, :PORCIVA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                            NROI = NROI + 1;
                            SUMA = SUMA + IMPTOS;
                            END
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                    NROI = NROI + 1;
                    SUMA = SUMA + IMPTOS;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA + IMPTOS;
                    END
                END   /* IMPTOS <> 0 */
            END /* FOR */
        END /* IVA X ARTICULO */
    if (IVA = 'K') then /* IVA EN CTA CONSTANTE */
        BEGIN
        SELECT SUM(DVDE_IVAMONTO), SUM(DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO), SUM(DVDE_CONSUMO)
            FROM DEVOLUCIONES_VENTAS_DETALLE F
            WHERE F.DEVT_ID = :IDDOC  AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
            INTO :IMPTOS, :MONTO, :VALORADIC;
        if (FOMENTO = 'SI') then
            MONTO = MONTO + VALORADIC;
        MONTO = MONTO * -1;
        MONTO = MONTO * FACTOR;
        IMPTOS = IMPTOS * FACTOR;
        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
        execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
        if (IMPTOS <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTAIVA, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT F.ARTI_COD, (DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO), DVDE_IVAMONTO, TAIV_PORC, DVDE_CONSUMO
                    FROM ARTICULO A, DEVOLUCIONES_VENTAS_DETALLE F, TARIFA_IVA T
                    WHERE F.DEVT_ID = :IDDOC AND A.TAIV_COD = T.TAIV_COD AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
                    INTO :ART, :MONTO, :IMPTOS, :PORCIVA, :VALORADIC
                    DO
                    BEGIN
                    if (IMPINC = 'S') then
                        MONTO = MONTO - IMPTOS - VALORADIC;
                    MONTO = MONTO * -1;
                    MONTO = MONTO * FACTOR;
                    IMPTOS = IMPTOS * FACTOR;
                    execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                    execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                    if (IMPTOS <> 0) then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', :IMPTOS, 0, :MONTO, :PORCIVA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        SUMA = SUMA + IMPTOS;
                        END
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                NROI = NROI + 1;
                SUMA = SUMA + IMPTOS;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA + IMPTOS;
                END
            END /* IMPTOS <> 0 */
        END /* IVA EN CTA CONSTANTE */
    /* EL IMPOCONSUMO */
    if ((CONSUMO = 'A') AND (FOMENTO <> 'SI')) then
        BEGIN
        FOR SELECT MAX(COAR_CTACONS), SUM(DVDE_CONSUMO)
            FROM ARTICULO A, CONTABIL_ARTICULO C, DEVOLUCIONES_VENTAS_DETALLE F
            WHERE F.DEVT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
            GROUP BY COAR_CTACONS
            INTO :CTACONSUMO, :IMPTOS
        DO
            BEGIN
            if (IMPTOS <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTACONSUMO, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, REGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT F.ARTI_COD, DVDE_CONSUMO
                        FROM ARTICULO A, CONTABIL_ARTICULO C, DEVOLUCIONES_VENTAS_DETALLE F
                        WHERE F.DEVT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTACONS = :CUENTA AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
                        INTO :ART, :IMPTOS
                    DO
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 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, :NROI, :CUENTA, :CONC, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                    NROI = NROI + 1;
                    SUMA = SUMA + IMPTOS;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA + IMPTOS;
                    END
                END /* IMPTOS <> 0 */
            END /* FOR */
        END /* CONSUMO X ARTICULO */
    if ((CONSUMO = 'K') AND (FOMENTO <> 'SI')) then
        BEGIN
        SELECT SUM(DVDE_CONSUMO)
            FROM DEVOLUCIONES_VENTAS_DETALLE F
            WHERE F.DEVT_ID = :IDDOC AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
            INTO :IMPTOS;
        if (IMPTOS <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTACONSUMO, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT F.ARTI_COD, DVDE_CONSUMO
                    FROM ARTICULO A, DEVOLUCIONES_VENTAS_DETALLE F
                    WHERE F.DEVT_ID = :IDDOC  AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
                    INTO :ART, :IMPTOS
                    DO
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTACONSUMO, :CONC, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                    NROI = NROI + 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, :NROI, :CTACONSUMO, :CONC, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA + IMPTOS;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTACONSUMO, :CONC, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA + IMPTOS;
                END
            END /* IMPTOS <> 0 */
        END /* CONSUMO EN CTA CONSTANTE */
    /* DESCUENTO */
    if ((CTADTO IS NOT NULL) AND
        (CTADTO <> '') AND
        (VRDTO <> 0)) THEN
        BEGIN
        EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTADTO, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRDTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
            NROI = NROI + 1;
            SUMA = SUMA - VRDTO;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRDTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 33);
            NROI = NROI + 1;
            SUMA = SUMA - VRDTO;
            END
        END /* DESCUENTO */
    /* VALOR ADIC */
    if ((CTAADIC IS NOT NULL) AND
        (CTAADIC <> '') AND
        (VRADIC <> 0)) THEN
        BEGIN
        EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTAADIC, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRADIC, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
            NROI = NROI + 1;
            SUMA = SUMA + VRADIC;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRADIC, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 33);
            NROI = NROI + 1;
            SUMA = SUMA + VRADIC;
            END
        END /* VR. ADIC */
    /* VALOR EXTRA */
    if ((CTAEXTRA IS NOT NULL) AND
        (CTAEXTRA <> '') AND
        (VREXTRA <> 0)) THEN
        BEGIN
        EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTAEXTRA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VREXTRA, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
            NROI = NROI + 1;
            SUMA = SUMA + VREXTRA;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VREXTRA, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 33);
            NROI = NROI + 1;
            SUMA = SUMA + VREXTRA;
            END
        END /* VR. EXTRA */
    /* RETENCION FUENTE */
    if ((RTFTE = 'C') or (RTFTE = 'K')) then
      if (VRRTFTE <> 0) then
        BEGIN
        if (RTFTE = 'C') then
            CTARTFTE = TCTARTFTE;
        EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTARTFTE, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, (:VRSUBT*-1), :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
            NROI = NROI + 1;
            SUMA = SUMA - VRRTFTE;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, (:VRSUBT*-1), :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA - VRRTFTE;
            END
        /* AUTORETENCION */
        if (FAUTORET <= fecaux) then
            BEGIN
            EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'CUENTA DE AUTORETENCION EN LA FUENTE') returning_values (CTARTFTE);
            EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTARTFTE, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :VRSUBT, :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                NROI = NROI + 1;
                SUMA = SUMA + VRRTFTE;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :VRSUBT, :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA + VRRTFTE;
                END
            END
        END /* RTFTE */
    if (RTFTE = 'A') then
      BEGIN
      FOR SELECT MAX(COAR_CTARTFTEV), MAX(COAR_RTFTE), MIN(COAR_RTBASE), SUM(DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO), SUM((DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO)*COAR_RTFTE)
        FROM CONTABIL_ARTICULO C, devoluciones_ventas_detalle F
        WHERE F.devt_id = :IDDOC AND F.ARTI_COD = C.ARTI_COD AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
        GROUP BY COAR_CTARTFTEV
        INTO :CTARTFTE, :PRTFTE, :baseadic, :MONTO, :VRRTFTE
        DO
        BEGIN
        MONTO = MONTO * FACTOR;
        if (MONTO >= BASEADIC) then
            BEGIN
            VRRTFTE = VRRTFTE * FACTOR / 100;
            execute procedure redondee(VRRTFTE, DIG) returning_values (VRRTFTE);
            execute procedure redondee(MONTO, DIG) returning_values (MONTO);
            if (VRRTFTE <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTARTFTE, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, (:MONTO*-1), :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                    NROI = NROI + 1;
                    SUMA = SUMA - VRRTFTE;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, (:MONTO*-1), :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA - VRRTFTE;
                    END
                /* AUTORETENCION */
                if (FAUTORET <= fecaux) then
                    BEGIN
                    EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'CUENTA DE AUTORETENCION EN LA FUENTE') returning_values (CTARTFTE);
                    EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTARTFTE, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
                    if (ERRORC <> 0) then
                        ERROR = ERROR + 1;
                    if (TIPOCUEN = 'C') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :MONTO, :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                        NROI = NROI + 1;
                        SUMA = SUMA + VRRTFTE;
                        END
                    if (TIPOCUEN = 'N') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :MONTO, :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NROI = NROI + 1;
                        SUMA = SUMA + VRRTFTE;
                        END
                    END
                END
            END
        END /* RTFTE */
      END
    /* RETENCION IVA */
    if ((RTIVA = 'C') or (RTIVA = 'K')) then
      if (VRRTIVA <> 0) then
        BEGIN
        if (RTIVA = 'C') then
            CTARTIVA = TCTARTIVA;
        EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTARTIVA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTIVA, (:VRIVA*-1), :PORC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
            NROI = NROI + 1;
            SUMA = SUMA - VRRTIVA;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTIVA, (:VRIVA*-1), :PORC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA - VRRTIVA;
            END
        END /* RTIVA */
    /* RETENCION DE ICA */
    if ((RTICA = 'C') or (RTICA = 'K')) then
      if (VRRTICA <> 0) then
        BEGIN
        if (RTICA = 'C') then
            CTARTICA = TCTARTICA;
        EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTARTICA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTICA, (:VRSUBT*-1), :PRTICA, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
            NROI = NROI + 1;
            SUMA = SUMA - VRRTICA;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTICA, (:VRSUBT*-1), :PRTICA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA - VRRTICA;
            END
        END /* RTICA */
    /* CIERRE EL COMPROBANTE CONTRA LA CUENTA DEL TERCERO O LA CONSTANTE */
    if ((SUMA <> 0) and ((CARTERA = 'C') or (CARTERA = 'K') or (CARTERA = 'J'))) then
        BEGIN
        if (SUMA < 0) then
            BEGIN
            DEBITO = SUMA * -1;
            CREDITO = 0;
            END
        ELSE
            BEGIN
            DEBITO = 0;
            CREDITO = SUMA;
            END
        if (CARTERA = 'C') then
            CTACARTERA = TCTACLIEN;
        if (CARTERA = 'J') then
            BEGIN
            /* BUSQUE LA CUENTA DE LA CAJA */
            SELECT CAJA_CUENTA FROM CAJAS C, PUNTO_VENTA P
                WHERE P.CAJA_ID = C.CAJA_ID AND PTVT_ID = :PTOVTA
                INTO :CTACARTERA;
            END
        EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTACARTERA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :DEBITO, :CREDITO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
        if (TIPOCUEN = 'N') then
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :DEBITO, :CREDITO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
        NROI = NROI + 1;
        END /* SUMA EN CARTERA */
    /* CALCULE COSTOS EN VENTAS */
    EXECUTE PROCEDURE COSTO_EN_VENTAS(33, :IDDOC);
    if (COSTOS = 'A') then
        BEGIN
        FOR SELECT MAX(CTACOS), SUM(cast(CANT as double precision) * COSTO)
            FROM COSTO_VENTAS WHERE TIDO_COD = 33 AND COVE_ID = :IDDOC
            GROUP BY CTACOS
            INTO :CTACOSTOS, :MONTO
        DO
            BEGIN
            if (MONTO <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTACOSTOS, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT ARTI_COD, cast(CANT as double precision) * COSTO
                        FROM COSTO_VENTAS WHERE TIDO_COD = 33 AND COVE_ID = :IDDOC AND CTACOS = :CUENTA
                        INTO :ART, :MONTO
                    DO
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                    NROI = NROI + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    END
                END /* MONTO <> 0 */
            END /* FOR */
        END /* COSTOS */
    if (COSTOS = 'K') then
        BEGIN
        SELECT SUM(cast(CANT as double precision) * COSTO)
            FROM COSTO_VENTAS WHERE TIDO_COD = 33 AND COVE_ID = :IDDOC
            INTO :MONTO;
        if (MONTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTACOSTOS, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, REGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT ARTI_COD, cast(CANT as double precision) * COSTO
                    FROM COSTO_VENTAS WHERE TIDO_COD = 33 AND COVE_ID = :IDDOC
                    INTO :ART, :MONTO
                DO
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTACOSTOS, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                    NROI = NROI + 1;
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTACOSTOS, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                NROI = NROI + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTACOSTOS, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                END
            END /* MONTO <> 0 */
        END /* COSTOS = K */
    if (INVEN = 'A') then
        BEGIN
        FOR SELECT MAX(CTAINV), SUM(cast(CANT as double precision) * COSTO)
            FROM COSTO_VENTAS WHERE TIDO_COD = 33 AND COVE_ID = :IDDOC
            GROUP BY CTAINV
            INTO :CTAINVEN, :MONTO
        DO
            BEGIN
            if (MONTO <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTAINVEN, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, REGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT ARTI_COD, cast(CANT as double precision) * COSTO
                        FROM COSTO_VENTAS WHERE TIDO_COD = 33 AND COVE_ID = :IDDOC AND CTAINV = :CUENTA
                        INTO :ART, :MONTO
                    DO
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                    NROI = NROI + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    END
                END /* MONTO <> 0 */
            END /* FOR */
        END /* INVEN = A */
    if (INVEN = 'K') then
        BEGIN
        SELECT SUM(cast(CANT as double precision) * COSTO)
            FROM COSTO_VENTAS WHERE TIDO_COD = 33 AND COVE_ID = :IDDOC
            INTO :MONTO;
        if (MONTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTAINVEN, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT ARTI_COD, cast(CANT as double precision) * COSTO
                    FROM COSTO_VENTAS WHERE TIDO_COD = 33 AND COVE_ID = :IDDOC
                    INTO :ART, :MONTO
                DO
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTAINVEN, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                    NROI = NROI + 1;
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAINVEN, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                NROI = NROI + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAINVEN, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                END
            END /* MONTO <> 0 */
        END /* INVEN = K */
    /* recorra las cuentas adicionales */
    FOR SELECT INVC_CUENTA, INVC_BASE, INVC_PORC, INVC_VALOR, INVC_DB
        FROM INTERFAZ_VENTAS_CTAS WHERE INVE_ID = :IDINTER
        INTO :CTADIC, :BASEADIC, :PORCADIC, :VALORADIC, :DBADIC
        DO
        BEGIN
        if (valoradic <> 0) then
            monto = valoradic;
        else
            BEGIN
            if (:BASEADIC = 'SUBTOTAL') then
                VALORADIC = vrsubt;
            if (:BASEADIC = 'DESCUENTO') then
                VALORADIC = VRDTO;
            if (:BASEADIC = 'IVA') then
                VALORADIC = VRIVA;
            if (:BASEADIC = 'ADICIONAL') then
                VALORADIC = VRADIC;
            if (:BASEADIC = 'EXTRA') then
                VALORADIC = VREXTRA;
            if (:BASEADIC = 'TOTAL') then
                VALORADIC = VRTOTAL;
            MONTO = VALORADIC * PORCADIC;
            END
        if (MONTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTADIC, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                if (DBADIC = 'S') then
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                ELSE
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                NROI = NROI + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                if (DBADIC = 'S') then
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                ELSE
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                END
            NROI = NROI + 1;
            END
        END
    if (error > 0) then
        ver = 'S';
    SUSPEND;
    END
   END /* EXISTE LA INTERFAZ */
  ELSE
    BEGIN
    EXECUTE PROCEDURE ERROR (33, :IDDOC, :PREF, 1);
    ERROR = ERROR + 1;
    VER = 'S';
    SUSPEND;
    END
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE DEVOLUCIONES_SIN_CONTABILIDAD(
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    ID INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    ESTADO VARCHAR(20),
    IDI INTEGER,
    IDC INTEGER)
AS
DECLARE VARIABLE VER CHAR(2);
declare variable FECICNT VARCHAR(10);
declare variable FECFCNT VARCHAR(10);
declare variable ERROR INTEGER;
declare variable idref INTEGER;
BEGIN
EXECUTE PROCEDURE fecha_a_conta(FECINI) returning_values (FECICNT);
EXECUTE PROCEDURE fecha_a_conta(FECFIN) returning_values (FECFCNT);
FOR SELECT DEVT_ID, PREF_PRE, DEVT_NUMERO FROM devoluciones_ventas WHERE DEVT_ANULADO = 'N' AND
    DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN
    INTO :ID, :PREF, :NUMERO
DO
  BEGIN
  idref = null;
  SELECT ENCO_IDREF FROM COMPROBANTE_ENCABEZADO WHERE ENCO_TIPOREF = 33 AND ENCO_FECHA >= :FECICNT AND ENCO_FECHA <= :FECFCNT and ENCO_IDREF = :id into :idref;
  if (idref IS NULL) then
  begin
   ESTADO = 'PROCESANDO';
   SUSPEND;
   SELECT MAX(INVE_ID) FROM INTERFAZ_VENTAS WHERE PREF_PRE = :PREF AND TIDO_COD = 33 INTO :IDI;
   EXECUTE PROCEDURE contabil_devolcli (:ID, :IDI) RETURNING_VALUES (:ERROR, :VER, :IDC);
   if (ERROR = 0) then
    BEGIN
    EXECUTE PROCEDURE CONTABILIZA_PENDIENTE (:IDC);
    ESTADO = 'OK';
    END
   ELSE
    ESTADO = 'ERROR';
   suspend;
  End
  END
END

^

SET TERM ; ^



/* 20091222 */
/* error multiple rows si la cuenta del banco se repite en el comprobante */
SET TERM ^ ;

CREATE OR ALTER procedure CONCILIA_BANCO_CONTA (
    FECINI date,
    FECFIN date,
    BANCO varchar(3),
    CTABANCO varchar(20),
    NULO1 char(1))
returns (
    FECHA date,
    TIPODOC varchar(10),
    TIPO integer,
    ID integer,
    PREF varchar(4),
    NUMERO varchar(6),
    FECCONTA char(10),
    MONTO numeric(18,2),
    MONTOC numeric(18,2),
    DIFERENCIA numeric(18,2))
AS
declare variable FECINIC char(10);
declare variable FECFINC char(10);
declare variable db char(1);
begin
DELETE FROM concilia_banco_conta_aux;
FOR select m.moba_tipodoc, m.moba_idref, m.moba_total, m.moba_fecha, m.moba_pref, m.moba_numero, m.moba_db
    from movimiento_banco m, cuentas_banco c
    where c.cuba_cod = m.cuba_cod and c.cuba_codcta = :banco and m.moba_fecha >= :FECINI and m.moba_fecha <= :FECFIN
    into :TIPO, :ID, :monto, :fecha, :pref, :numero, :db
    DO
    BEGIN
    SELECT TIDO_NOMCORTO FROM tipo_documento WHERE TIDO_COD = :tipo INTO :tipodoc;
    if (db = 'N') then
        monto = monto * -1;
    /* BUSQUE EL CONTABLE */
    montoc = NULL;
    if (TIPO = 72) then
        begin
        TIPO = 62;
        select ch.cheq_idegreso from cheques ch where ch.cheq_id = :id into :id;
        end
    if (TIPO = 73) then
        begin
        TIPO = 62;
        select r.reti_idegreso from retiros r where r.reti_id = :id into :id;
        end

    SELECT sum(CODE_DEBITO-CODE_CREDITO) FROM comprobante_detalle D, comprobante_encabezado C
        where C.enco_consec = D.enco_consec AND C.enco_tiporef = :TIPO AND C.enco_idref = :ID AND D.cuen_cod = :ctabanco
        INTO :montoc;
    diferencia = (monto - montoc);
    if (DIFERENCIA <> 0) then
        SUSPEND;
    INSERT INTO concilia_banco_conta_aux (COBC_TIPO, COBC_ID) VALUES(:TIPO, :ID);
    END
/* AGREGUE LAS QUE NO TIENEN MOVBANCO */
fecha = null;
monto = 0;
EXECUTE PROCEDURE fecha_a_conta (:FECINI) returning_values (:FECINIC);
EXECUTE PROCEDURE fecha_a_conta (:FECFIN) returning_values (:FECFINC);
FOR SELECT e.tico_cod, e.enco_fecha, e.prco_pref, e.enco_numero, CODE_DEBITO-CODE_CREDITO, e.enco_tiporef, e.enco_idref FROM comprobante_detalle D, comprobante_encabezado e
    where e.enco_consec = D.enco_consec AND CUEN_COD = :ctabanco AND e.enco_fecha >= :fecinic AND e.enco_fecha <= :fecfinc AND
    not exists (select cobc_id FROM concilia_banco_conta_aux WHERE cobc_tipo = e.enco_tiporef and cobc_id = e.enco_idref)
    INTO :tipodoc, :fecconta, :pref, :numero, :montoc, :tipo, :id
    do
    BEGIN
    diferencia = montoc;
    SUSPEND;
    END
end
^

SET TERM ; ^

/* 20091223 */
/* PLAN DE PRODUCCION */
INSERT INTO TIPO_DOCUMENTO (TIDO_COD, TIDO_NOMCORTO, TIDO_NOMLARGO, TIDO_MODULO, TIDO_INVE, TIDO_CART, TIDO_CXP, TIDO_CAJA, TIDO_BCOS) VALUES (27, 'PLANPROD', 'PLAN DE PRODUCCION', 'INVENTARIO', 'S', 'N', 'N', 'N', 'N');
COMMIT WORK;

ALTER TABLE ARTICULO
ADD ARTI_MERMA T_PORCENTAJE;

CREATE TABLE PLAN_PRODUCCION (
    PLPR_ID T_ID NOT NULL,
    PLPR_PREF VARCHAR(4),
    PLPR_NUMERO T_NUMDOC,
    PLPR_FECINI DATE,
    PLPR_FECFIN DATE,
    PLPR_CONC T_CONCEPTO,
    PLPR_RESPONSABLE T_CONCEPTO,
    PLPR_OBS BLOB SUB_TYPE 1 SEGMENT SIZE 80,
    PLPR_ANULADO T_BOOLEANO,
    PLPR_TRANSMIT T_BOOLEANO,
    PLPR_USUARIO T_USUARIO,
    PLPR_NUMOK T_BOOLEANO);
alter table PLAN_PRODUCCION
add constraint PK_PLAN_PRODUCCION
primary key (PLPR_ID);

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

CREATE SEQUENCE ID_PLANPROD;

SET TERM ^ ;

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

SET TERM ; ^


CREATE TABLE PLAN_PRODUCCION_DET (
    PLPR_ID T_ID NOT NULL,
    PLPD_ITEM T_ID NOT NULL,
    ARTI_COD T_COD_ARTICULO,
    PLPD_CODBAR T_COD_ARTICULO,
    PLPD_DESC T_CONCEPTO,
    PLPD_CANT T_CANTIDAD,
    PLPD_UNIDAD T_UNIDAD,
    PLPD_FACTOR T_CANTIDAD,
    PLPD_OBS BLOB SUB_TYPE 1 SEGMENT SIZE 80,
    PLPD_ANULADO T_BOOLEANO,
    PLPD_TRANSMIT T_BOOLEANO);
alter table PLAN_PRODUCCION_DET
add constraint PK_PLAN_PRODUCCION_DET
primary key (PLPR_ID,PLPD_ITEM);

grant select, delete, insert, update on PLAN_PRODUCCION_DET to PUBLIC;
ALTER TABLE PLAN_PRODUCCION_DET
ADD PLPD_MERMA T_PORCENTAJE;

CREATE TABLE PLAN_PRODUCCION_CONS (
    PLPD_ID T_ID NOT NULL,
    PLPC_ITEM T_ID NOT NULL,
    ARTI_COD T_COD_ARTICULO,
    PLPC_CANT T_CANTIDAD,
    PLPC_UNIDAD T_UNIDAD,
    PLPC_EXIST T_CANTIDAD,
    PLPC_ORDENAR T_CANTIDAD,
    PLPC_ORDENTIPO T_ID,
    PLPC_ORDENID T_ID,
    PLPC_ANULADO T_BOOLEANO,
    PLPC_TRANSMIT T_BOOLEANO);
alter table PLAN_PRODUCCION_CONS
add constraint PK_PLAN_PRODUCCION_CONS
primary key (PLPD_ID,PLPC_ITEM);

ALTER TABLE PLAN_PRODUCCION_CONS
ADD PLPC_CODBAR T_COD_ARTICULO;
ALTER TABLE PLAN_PRODUCCION_CONS
ADD PLPC_DESC T_CONCEPTO;
ALTER TABLE PLAN_PRODUCCION_CONS
ADD PLPC_OBS BLOB SUB_TYPE 1 SEGMENT SIZE 8192;

SET TERM ^ ;

CREATE OR ALTER PROCEDURE CONSOLIDE_PRODUCCION(
    PLANID INTEGER)
AS
declare variable ITEM INTEGER;
declare variable FEC DATE;
declare variable ARTIC VARCHAR(20);
declare variable CANT NUMERIC(18,4);
declare variable DESCR VARCHAR(60);
declare variable UNIDAD VARCHAR(8);
declare variable MERMA NUMERIC(18,4);
declare variable EXIST NUMERIC(18,4);
declare variable ORDENAR NUMERIC(18,4);
declare variable TIPOORD INTEGER;
declare variable NUMROWS INTEGER;
begin
SELECT PLPR_FECINI FROM plan_produccion WHERE PLPR_ID = :PLANID INTO :FEC;
ITEM = 0;
FOR SELECT MAX(a.arpr_comp), SUM(PLPD_CANT * PLPD_FACTOR) from PLAN_PRODUCCION_DET d, articulos_producto a
    WHERE a.arti_cod = d.arti_cod and PLPR_ID = :PLANID
    group by a.arpr_comp INTO :ARTIC, :CANT
    DO
    BEGIN
    SELECT ARTI_MERMA, ARTI_UNIDAD, ARTI_DES FROM ARTICULO WHERE ARTI_COD = :ARTIC INTO :MERMA, :UNIDAD, :DESCR;
    SELECT COUNT(ARTI_COD) FROM articulos_producto WHERE ARTI_COD = :ARTIC INTO :NUMROWS;
    if (NUMROWS <> 0) then
        TIPOORD = 19;
    else
        TIPOORD = 24;
    if ((MERMA IS NOT NULL) AND (MERMA <> 0)) then
        CANT = CANT * 100 / MERMA;
    EXECUTE PROCEDURE saldo_total_inventario (:ARTIC, :FEC) returning_values (:EXIST);
    if (CANT > EXIST) then
        ORDENAR = CANT - EXIST;
    ELSE
        ORDENAR = 0;
    ITEM = ITEM + 1;
    INSERT INTO plan_produccion_cons (PLPD_ID, PLPC_ITEM, PLPC_CODBAR, ARTI_COD, PLPC_CANT, PLPC_UNIDAD, PLPC_EXIST, PLPC_ORDENAR, PLPC_ORDENTIPO, PLPC_ORDENID, PLPC_ANULADO, PLPC_TRANSMIT, PLPC_DESC)
        VALUES (:planid, :item, :artic, :artic, :cant, :unidad, :exist, :ordenar, :tipoord, 0, 'N', 'N', :descr);
    END
end
^

SET TERM ; ^

SET TERM ^ ;

create trigger PLAN_PRODUCCION_CONS_BI for PLAN_PRODUCCION_CONS
active BEFORE INSERT position 0
as
declare variable FEC DATE;
begin
SELECT PLPR_FECINI FROM plan_produccion WHERE PLPR_ID = NEW.plpd_id INTO :FEC;
EXECUTE PROCEDURE saldo_total_inventario (NEW.arti_cod, :FEC) returning_values (NEW.plpc_exist);
if (NEW.plpc_cant > NEW.plpc_exist) then
    NEW.plpc_ordenar = NEW.plpc_cant - NEW.plpc_exist;
ELSE
    NEW.plpc_ordenar = 0;
end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER PLAN_PRODUCCION_CONS_BU FOR PLAN_PRODUCCION_CONS
ACTIVE BEFORE UPDATE POSITION 0
as
begin
if (NEW.plpc_cant > NEW.plpc_exist) then
    NEW.plpc_ordenar = NEW.plpc_cant - NEW.plpc_exist;
ELSE
    NEW.plpc_ordenar = 0;
end
^

SET TERM ; ^

UPDATE ARTICULO SET ARTI_PESO = 500 WHERE ARTI_UNIDAD = 'LIBRA' AND ARTI_PESO IS NULL;
COMMIT WORK;

ALTER TABLE PLAN_PRODUCCION_DET
ADD PLPD_PESO T_CANTIDAD;

SET TERM ^ ;

CREATE OR ALTER procedure CONSOLIDE_PRODUCCION (
    PLANID integer)
AS
declare variable ITEM INTEGER;
declare variable ARTIC VARCHAR(20);
declare variable CANT NUMERIC(18,4);
declare variable CODCMP VARCHAR(20);
declare variable CANTCMP NUMERIC(18,4);
declare variable PORCMP NUMERIC(9,4);
declare variable UNDCMP VARCHAR(8);
declare variable FACTOR NUMERIC(18,4);
declare variable PESOCMP NUMERIC(18,4);
declare variable PESO NUMERIC(18,4);
declare variable MERMA NUMERIC(18,4);
declare variable TIPOORD INTEGER;
declare variable NUMROWS INTEGER;
declare variable TOTAL NUMERIC(9,4);
declare variable DESCR VARCHAR(60);
declare variable UNIDAD VARCHAR(8);
begin
ITEM = 0;
FOR SELECT ARTI_COD, PLPD_CANT * PLPD_FACTOR, PLPD_MERMA, PLPD_PESO
    from PLAN_PRODUCCION_DET WHERE PLPR_ID = :PLANID
    INTO :ARTIC, :CANT, :MERMA, :PESO
    DO
    BEGIN
    select sum(arpr_porc) from articulos_producto where arti_cod = :artic into :total;
    FOR SELECT arpr_comp, ARPR_CANT, ARPR_UNIDAD, ARPR_PORC, ARTI_UNIDAD, ARTI_DES, arti_peso
        from articulos_producto AP, ARTICULO A2
        WHERE AP.arpr_comp = A2.arti_cod AND AP.arti_cod = :ARTIC ORDER by ARPR_ITEM
        INTO :codcmp, :cantcmp, :undcmp, :porcmp, :unidad, :descr, :pesocmp
        DO
        BEGIN
        EXECUTE PROCEDURE factor_unidad_cant(:codcmp, :undcmp) returning_values (:FACTOR);
        cantcmp = cantcmp * FACTOR;
        if (((cantcmp is null) or (cantcmp = 0)) AND (porcmp <> 0)) then
            BEGIN
            /* ES PORCENTUAL AL PESO LA MEZCLA SOBRE EL 1ER ARTICULO */
            CANT = cant * PESO;
            if ((MERMA IS NOT NULL) AND (MERMA <> 0)) then
                CANT = CANT * (100 + MERMA) / 100;
            CANT = CANT * porcmp / TOTAL; /* APLICA LA PROPORCION */
            CANT = CANT / pesocmp; /* LO LLEVA A LA UNIDAD PRINCIPAL */
            END
        ELSE
            BEGIN
            CANT = cant * CANTCMP;
            END

        SELECT COUNT(ARTI_COD) FROM articulos_producto WHERE ARTI_COD = :codcmp INTO :NUMROWS;
        if (NUMROWS <> 0) then
           TIPOORD = 19;
        else
            TIPOORD = 24;

        /* INSERTE O ACTUALICE EL COMPONENTE */
        if (NOT EXISTS (SELECT PLPC_ITEM FROM plan_produccion_cons WHERE PLPD_ID = :planid AND ARTI_COD = :codcmp)) then
            BEGIN
            ITEM = ITEM + 1;
            INSERT INTO plan_produccion_cons (PLPD_ID, PLPC_ITEM, PLPC_CODBAR, ARTI_COD, PLPC_CANT, PLPC_UNIDAD, PLPC_EXIST, PLPC_ORDENAR, PLPC_ORDENTIPO, PLPC_ORDENID, PLPC_ANULADO, PLPC_TRANSMIT, PLPC_DESC)
                VALUES (:planid, :item, :codcmp, :codcmp, :cant, :unidad, 0, 0, :tipoord, 0, 'N', 'N', :descr);
            END
        ELSE
            UPDATE plan_produccion_cons SET PLPC_CANT = PLPC_CANT + :CANT
                WHERE PLPD_ID = :planid AND ARTI_COD = :codcmp;
        END
    END
end
^

SET TERM ; ^


/* 20091226 */
/* POR REUSAR LA VARIABLE FECHA SALIA SOLO UN ARTICULO CUANDO SE PEDIA INCLUYENDO TODAS */

SET TERM ^ ;

CREATE OR ALTER procedure REP_LISTA_PRECIOS (
    ARTINI varchar(20),
    ARTFIN varchar(20),
    GRPINI varchar(2),
    GRPFIN varchar(2),
    ORDEN char(1),
    LINI integer,
    LFIN integer,
    FECHA date,
    DEATRES char(1),
    MASIVA char(1),
    HOY char(1))
returns (
    CODIGO varchar(15),
    NOMBRE varchar(60),
    REFERENCIA varchar(20),
    UNIDAD varchar(8),
    UNIDAD2 varchar(8),
    UNIDAD3 varchar(8),
    UNIDAD4 varchar(8),
    CODGRUPO varchar(2),
    NOMGRUPO varchar(30),
    CODSUBG varchar(3),
    NOMSUBG varchar(30),
    CODMARC varchar(3),
    NOMMARC varchar(30),
    NOMLISTA varchar(30),
    PRECIO numeric(18,2),
    PRECIO2 numeric(18,2),
    PRECIO3 numeric(18,2),
    MARGEN numeric(9,2),
    IVA numeric(9,2),
    IVAMONTO numeric(18,2),
    CONSUMO numeric(18,2),
    CANTMIN numeric(18,4),
    PESO numeric(9,4),
    ANCHO numeric(18,4),
    ALTO numeric(18,4),
    LARGO numeric(18,4),
    FOTO blob sub_type 1 segment size 80,
    OBS blob sub_type 1 segment size 80,
    TOTAL numeric(18,2))
AS
declare variable CODINI VARCHAR(20);
declare variable CODFIN VARCHAR(20);
declare variable DESINI VARCHAR(20);
declare variable DESFIN VARCHAR(20);
declare variable UTIL NUMERIC(9,2);
declare variable MOU CHAR(10);
declare variable LISIVA CHAR(2);
declare variable i integer;
declare variable J integer;
declare variable PRECAUX NUMERIC(18,2);
declare variable NUMROWS INTEGER;
declare variable DIG INTEGER;
declare variable UNIDADA VARCHAR(8);
declare variable FECHOY DATE;
BEGIN
if (ORDEN = 'C') then
    BEGIN
    CODINI = ARTINI;
    CODFIN = ARTFIN;
    DESINI = '';
    DESFIN = 'zz';
    END
ELSE
    BEGIN
    DESINI = ARTINI;
    DESFIN = ARTFIN;
    CODINI = '';
    CODFIN = 'zz';
    END
FECHOY = cast('now' as DATE);
EXECUTE PROCEDURE LEE_CONFIGURACION ('FACTURACION', 'ARTICULOS', 'SUGERIR PRECIOS CON PORCENTAJE DE MARGEN O UTILIDAD') returning_values (MOU);
EXECUTE PROCEDURE LEE_CONFIGURACION ('FACTURACION', 'ARTICULOS', 'REDONDEO AL MULTIPLO DE DIEZ EN PRECIOS') returning_values (DIG);
FOR SELECT a.ARTI_COD, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD, TAIV_PORC, ARTI_CONSUMO,
    ARTI_FOTO, ARTI_PESO, ARTI_LARGO, ARTI_ANCHO, ARTI_ALTO, ARTI_OBS
    FROM ARTICULO A, TARIFA_IVA T
    WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :GRPFIN AND
    ARTI_DES >= :DESINI AND ARTI_DES <= :DESFIN AND ESAR_COD = 'A' AND A.TAIV_COD = T.TAIV_COD
    ORDER BY ARTI_COD
    INTO :CODIGO, :NOMBRE, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :IVA, :CONSUMO,
        :FOTO, :PESO, :LARGO, :ANCHO, :ALTO, :OBS
    DO
    BEGIN
    I = 0;
    FOR SELECT LIPR_NOM, PRAR_FIJO, PRAR_MARGEN, PRAR_UTIL, LIPR_MODIF, PRAR_CANTMIN
        FROM LISTA_PRECIOS L, PRECIOS_ARTICULO P
        WHERE L.LIPR_COD = P.LIPR_COD AND p.arti_cod = :codigo and l.lipr_cod >= :lini and l.lipr_cod <= :lfin AND
        ((:fecha IS NULL) or ((L.lipr_fecini <= :FECHA) AND (L.lipr_fecfin >= :FECHA)))
        ORDER BY L.LIPR_COD
        INTO :NOMLISTA, :PRECIO, :MARGEN, :UTIL, :LISIVA, :cantmin
        do
        BEGIN
        SELECT COUNT(AUDI_ID) FROM AUDITORIA WHERE TIDO_COD = 126 AND AUDI_COD = :CODIGO AND AUDI_FECHA = :FECHOY AND AUDI_OPER <> 'D' INTO :NUMROWS;
        if ((HOY = 'N') or (NUMROWS <> 0)) then
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            SELECT MIN(COBA_COD) FROM barras_articulo WHERE ARTI_COD = :codigo INTO :referencia;
            J = 0;
            UNIDAD2 = '';
            UNIDAD3 = '';
            UNIDAD4 = '';
            for SELECT UNAR_UNIDAD FROM unidad_articulo WHERE ARTI_COD = :codigo INTO :unidada
                DO
                BEGIN
                if (J = 0) then
                    UNIDAD2 = UNIDADA;
                if (J = 1) then
                    UNIDAD3 = UNIDADA;
                if ( J = 2) then
                    UNIDAD4 = UNIDADA;
                J = J + 1;
                END
            if (MOU = 'UTILIDAD') then
                MARGEN = UTIL;
            if (LISIVA = 'N') then
                IVAMONTO = PRECIO * IVA / 100;
            ELSE
                BEGIN
                IVAMONTO = (PRECIO - CONSUMO) * IVA / (100 + IVA);
                PRECIO = (PRECIO - CONSUMO) / (1 + (IVA/100));
/*              EXECUTE PROCEDURE redondee(PRECIO, DIG) returning_values (PRECIO); */
                END
            TOTAL = PRECIO + IVAMONTO + CONSUMO;
            EXECUTE PROCEDURE redondee(TOTAL, DIG) returning_values (TOTAL);
            if (DEATRES = 'N') then
                SUSPEND;
            else
                BEGIN
                I = I + 1;
                if (MASIVA = 'S') then
                    PRECIO = TOTAL;
                TOTAL = 0;
                if (MOD(I,3) = 1) then
                    BEGIN
                    PRECAUX = PRECIO;
                    PRECIO2 = 0;
                    PRECIO3 = 0;
                    END
                if (MOD(I,3) = 2) then
                    BEGIN
                    PRECIO2 = PRECIO;
                    PRECIO = PRECAUX;
                    END
                if (MOD(I,3) = 0) then
                    BEGIN
                    PRECIO3 = PRECIO;
                    PRECIO = PRECAUX;
                    SUSPEND;
                    END
                END
            END
        end
    if ((DEATRES = 'S') AND (MOD(I,3) <> 0)) then
        SUSPEND;
    end
END
^

SET TERM ; ^


/* 20091226b */
ALTER TABLE CAJAS ADD CAJA_FPBCO VARCHAR(2);

UPDATE CAJAS SET CAJA_FPBCO = (SELECT CONF_VALOR FROM CONFIGURACION WHERE
(CONF_MODULO = 'CAJA') AND (CONF_CATEGORIA = 'RECIBOS') AND (CONF_PROPIEDAD = 'PREFIJO DEL BANCO PARA LAS FORMAS DE PAGO AUTOMATICAS'));
COMMIT WORK;


/* 20091228 */
/* SI HOY UN TERCEO ES EXENTO PERO ANTES NO REPORTELO SEGUN EL MONTO DEL IVA CAUSADO */
SET TERM ^ ;

ALTER PROCEDURE IMPUESTOS_VENTAS(
    FECINI DATE,
    FECFIN DATE,
    PREFIJO VARCHAR(4),
    PTOINI INTEGER,
    PTOFIN INTEGER,
    ANULADOS CHAR(1),
    SUBEMPRESA INTEGER)
RETURNS (
    TIPO INTEGER,
    NOMTIPO VARCHAR(30),
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    NIT VARCHAR(20),
    NOMTERCERO VARCHAR(60),
    SUBTOTAL NUMERIC(18,2),
    DTOMONTO NUMERIC(18,2),
    ADICIONAL NUMERIC(18,2),
    IVAMONTO NUMERIC(18,2),
    CONSUMO NUMERIC(18,2),
    EXENTOS NUMERIC(18,2),
    GRAVADOS1 NUMERIC(18,2),
    GRAVADOS2 NUMERIC(18,2),
    GRAVADOS3 NUMERIC(18,2),
    IVA1 NUMERIC(18,2),
    IVA2 NUMERIC(18,2),
    IVA3 NUMERIC(18,2),
    EXTRA NUMERIC(18,2),
    TOTAL NUMERIC(18,2),
    RTFTEMONTO NUMERIC(18,2),
    RTIVAMONTO NUMERIC(18,2),
    RTICAMONTO NUMERIC(18,2),
    NETO NUMERIC(18,2),
    ANULADO CHAR(1))
AS
declare variable ID INTEGER;
declare variable TER_exento CHAR(1);
declare variable NOTAS CHAR(2);
declare variable ajustar CHAR(1);
declare variable FACTOR NUMERIC(18,4);
declare variable NUEVO NUMERIC(18,2);
declare variable FACTENC NUMERIC(18,2);
BEGIN
/* FACTURA */
TIPO = 31;
SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 31 INTO :NOMTIPO;
ajustar = 'N';
FOR SELECT FACT_ID, F.PREF_PRE, FACT_NUMERO, FACT_FECHA, TERC_NIT, FACT_NOMCLIENTE, FACT_ADICIONAL-FACT_DTOMONTO, FACT_IVAMONTO, FACT_RTFTEMONTO, FACT_RTIVAMONTO, FACT_RTICAMONTO, FACT_EXTRA, FACT_TOTAL, FACT_ANULADO, fact_factor
    FROM FACTURAS F, PREFIJOS PR WHERE PTVT_ID >= :PTOINI AND PTVT_ID <= :PTOFIN AND
    FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND ((:PREFIJO = '') or (:PREFIJO IS NULL) or (F.PREF_PRE = :PREFIJO))
    AND PR.PREF_PRE = F.PREF_PRE AND PR.TIDO_COD = 31 AND ((PR.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
    ORDER BY FACT_FECHA, F.PREF_PRE, FACT_NUMERO
    INTO :ID, :PREF, :NUMERO, :FECHA, :NIT, :NOMTERCERO, :DTOMONTO, :IVAMONTO, :RTFTEMONTO, :RTIVAMONTO, :RTICAMONTO, :EXTRA, :TOTAL, :ANULADO, :FACTENC
    DO
    BEGIN
    SELECT TERC_EXENTO FROM TERCEROS WHERE TERC_NIT = :NIT INTO :TER_EXENTO;
    if ((ANULADOS = 'S') or (ANULADO = 'N')) then
        BEGIN
        if (ANULADO = 'S') then
            BEGIN
            EXENTOS = 0;
            GRAVADOS1 = 0;
            GRAVADOS2 = 0;
            GRAVADOS3 = 0;
            CONSUMO = 0;
            SUBTOTAL = 0;
            TOTAL = 0;
            EXTRA = 0;
            IVAMONTO = 0;
            IVA1 = 0;
            IVA2 = 0;
            IVA3 = 0;
            DTOMONTO = 0;
            NETO = 0;
            RTFTEMONTO = 0;
            RTIVAMONTO = 0;
            RTICAMONTO = 0;
            END
        else
            BEGIN
            /* CALCULE LAS DIFERENTES TARIFAS */
            if (TER_EXENTO = 'S') then
                BEGIN
                SELECT SUM(FADE_TOTAL - FADE_IVAMONTO - FADE_CONSUMO)*:FACTENC FROM FACTURAS_DETALLE D WHERE FACT_ID = :ID AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL)) AND FADE_IVAMONTO = 0 INTO :EXENTOS;
                SELECT SUM((FADE_TOTAL - FADE_IVAMONTO - FADE_CONSUMO)*:FACTENC), SUM(FADE_IVAMONTO*:FACTENC) FROM FACTURAS_DETALLE D, TARIFA_IVA T WHERE FACT_ID = :ID AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL)) AND FADE_IVAPORC = TAIV_PORC AND FADE_IVAPORC = 16 AND FADE_IVAMONTO <> 0 INTO :GRAVADOS1, :IVA1;
                SELECT SUM((FADE_TOTAL - FADE_IVAMONTO - FADE_CONSUMO)*:FACTENC), SUM(FADE_IVAMONTO*:FACTENC) FROM FACTURAS_DETALLE D, TARIFA_IVA T WHERE FACT_ID = :ID AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL)) AND FADE_IVAPORC = TAIV_PORC AND FADE_IVAPORC = 10 AND FADE_IVAMONTO <> 0 INTO :GRAVADOS2, :IVA2;
                GRAVADOS3 = 0;
                IVA3 = 0;
                end
            else
                begin
                SELECT SUM((FADE_TOTAL - FADE_IVAMONTO - FADE_CONSUMO)*:FACTENC) FROM FACTURAS_DETALLE D WHERE FACT_ID = :ID AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL)) AND FADE_IVAPORC = 0 INTO :EXENTOS;
                SELECT SUM((FADE_TOTAL - FADE_IVAMONTO - FADE_CONSUMO)*:FACTENC), SUM(FADE_IVAMONTO*:FACTENC) FROM FACTURAS_DETALLE D, TARIFA_IVA T WHERE FACT_ID = :ID AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL)) AND FADE_IVAPORC = TAIV_PORC AND TAIV_COD = 1 INTO :GRAVADOS1, :IVA1;
                SELECT SUM((FADE_TOTAL - FADE_IVAMONTO - FADE_CONSUMO)*:FACTENC), SUM(FADE_IVAMONTO*:FACTENC) FROM FACTURAS_DETALLE D, TARIFA_IVA T WHERE FACT_ID = :ID AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL)) AND FADE_IVAPORC = TAIV_PORC AND TAIV_COD = 2 INTO :GRAVADOS2, :IVA2;
                SELECT SUM((FADE_TOTAL - FADE_IVAMONTO - FADE_CONSUMO)*:FACTENC), SUM(FADE_IVAMONTO*:FACTENC) FROM FACTURAS_DETALLE D, TARIFA_IVA T WHERE FACT_ID = :ID AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL)) AND FADE_IVAPORC = TAIV_PORC AND TAIV_COD = 3 INTO :GRAVADOS3, :IVA3;
                end
            if (iva1 is null) then
                iva1 = 0;
            if (iva2 is null) then
                iva2 = 0;
            if (iva3 is null) then
                iva3 = 0;
            SELECT SUM(FADE_CONSUMO) FROM FACTURAS_DETALLE WHERE FACT_ID = :ID AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL)) INTO :CONSUMO;
            SUBTOTAL = TOTAL - EXTRA - IVAMONTO - DTOMONTO;
            NETO = TOTAL - RTFTEMONTO - RTIVAMONTO - RTICAMONTO;
            END
        if (exentos is null) then
            exentos = 0;
        if (gravados1 is null) then
            gravados1 = 0;
        if (gravados2 is null) then
            gravados2 = 0;
        if (gravados3 is null) then
            gravados3 = 0;
        if (consumo is null) then
            consumo = 0;
        FACTOR = 1;
        SELECT AJCI_FACTOR FROM ajuste_cierre WHERE AJCI_PORC = 0 AND AJCI_FECINI <= :FECHA AND AJCI_FECFIN >= :FECHA INTO :FACTOR;
        if (FACTOR IS null) then
            FACTOR = 1;
        if (factor <> 1) then
            ajustar = 'S';
        EXENTOS = EXENTOS * FACTOR;
        FACTOR = 1;
        SELECT AJCI_FACTOR FROM ajuste_cierre WHERE AJCI_PORC = 16 AND AJCI_FECINI <= :FECHA AND AJCI_FECFIN >= :FECHA INTO :FACTOR;
        if (FACTOR IS null) then
            FACTOR = 1;
        if (factor <> 1) then
            ajustar = 'S';
        gravados1 = GRAVADOS1 * FACTOR;
        IVA1 = IVA1 * FACTOR;
        FACTOR = 1;
        SELECT AJCI_FACTOR FROM ajuste_cierre WHERE AJCI_PORC = 10 AND AJCI_FECINI <= :FECHA AND AJCI_FECFIN >= :FECHA INTO :FACTOR;
        if (FACTOR IS null) then
            FACTOR = 1;
        if (factor <> 1) then
            ajustar = 'S';
        gravados2 = GRAVADOS2 * FACTOR;
        IVA2 = IVA2 * FACTOR;
        FACTOR = 1;
        SELECT AJCI_FACTOR FROM ajuste_cierre WHERE AJCI_PORC = 7 AND AJCI_FECINI <= :FECHA AND AJCI_FECFIN >= :FECHA INTO :FACTOR;
        if (FACTOR IS null) then
            FACTOR = 1;
        if (factor <> 1) then
            ajustar = 'S';
        gravados3 = GRAVADOS3 * FACTOR;
        IVA3 = IVA3 * FACTOR;
        NUEVO = exentos + gravados1 + gravados2 + gravados3;
        if ((TOTAL <> 0) and (ajustar = 'S')) then
            BEGIN
            IVAMONTO = IVA1 + IVA2 + IVA3;
            CONSUMO = CONSUMO * (NUEVO+ivamonto+consumo) / TOTAL;
            SUBTOTAL = SUBTOTAL * (NUEVO+ivamonto+consumo) / TOTAL;
            NETO = NETO * (NUEVO+ivamonto+consumo) / TOTAL;
            rtftemonto = rtftemonto * (NUEVO+ivamonto+consumo) / TOTAL;
            rticamonto = rticamonto * (NUEVO+ivamonto+consumo) / TOTAL;
            rtivamonto = rtivamonto * (NUEVO+ivamonto+consumo) / TOTAL;
            dtomonto = dtomonto * (NUEVO+ivamonto+consumo) / TOTAL;
            adicional = adicional * (NUEVO+ivamonto+consumo) / TOTAL;
            total = total * (NUEVO+ivamonto+consumo) / TOTAL;
            END
        SUSPEND;
        END
    END
    
TIPO = 33;
ajustar = 'N';
SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 33 INTO :NOMTIPO;
/* DEVOLUCIONES */
FOR SELECT DEVT_ID, D.PREF_PRE, DEVT_NUMERO, DEVT_FECHA, TERC_NIT, DEVT_NOMTERC, DEVT_ADICIONAL-DEVT_DTOMONTO, DEVT_IVAMONTO, DEVT_RTFTEMONTO, DEVT_RTIVAMONTO, DEVT_RTICAMONTO, DEVT_EXTRA, DEVT_TOTAL, DEVT_ANULADO, DEVT_FACTOR
    FROM DEVOLUCIONES_VENTAS D, PREFIJOS PR WHERE PTVT_ID >= :PTOINI AND PTVT_ID <= :PTOFIN AND
    DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND ((:PREFIJO = '') or (:PREFIJO IS NULL) or (D.PREF_PRE = :PREFIJO))
    AND PR.PREF_PRE = D.PREF_PRE AND PR.TIDO_COD = 33 AND ((PR.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) AND ((DEVT_REMID = 0) or (DEVT_REMID IS NULL))
    ORDER BY DEVT_FECHA, D.PREF_PRE, DEVT_NUMERO
    INTO :ID, :PREF, :NUMERO, :FECHA, :NIT, :NOMTERCERO, :DTOMONTO, :IVAMONTO, :RTFTEMONTO, :RTIVAMONTO, :RTICAMONTO, :EXTRA, :TOTAL, :ANULADO, :FACTENC
    DO
    BEGIN
    SELECT TERC_EXENTO FROM TERCEROS WHERE TERC_NIT = :NIT INTO :TER_EXENTO;
    if ((ANULADOS = 'S') or (ANULADO = 'N')) then
        BEGIN
        if (ANULADO = 'S') then
            BEGIN
            EXENTOS = 0;
            GRAVADOS1 = 0;
            GRAVADOS2 = 0;
            GRAVADOS3 = 0;
            CONSUMO = 0;
            SUBTOTAL = 0;
            TOTAL = 0;
            EXTRA = 0;
            IVAMONTO = 0;
            IVA1 = 0;
            IVA2 = 0;
            IVA3 = 0;
            DTOMONTO = 0;
            NETO = 0;
            RTFTEMONTO = 0;
            RTIVAMONTO = 0;
            RTICAMONTO = 0;
            END
        else
            BEGIN
            DTOMONTO = DTOMONTO * -1;
            ADICIONAL = ADICIONAL * -1;
            IVAMONTO = IVAMONTO * -1;
            EXTRA = EXTRA * -1;
            TOTAL = TOTAL * -1;
            RTFTEMONTO = RTFTEMONTO * -1;
            RTIVAMONTO = RTIVAMONTO * -1;
            RTICAMONTO = RTICAMONTO * -1;
            /* CALCULE LAS DIFERENTES TARIFAS */
            if (TER_EXENTO = 'S') then
              BEGIN
              SELECT SUM((DVDE_TOTAL - DVDE_IVAMONTO - DVDE_CONSUMO)*:FACTENC) FROM DEVOLUCIONES_VENTAS_DETALLE D WHERE DEVT_ID = :ID AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL)) AND DVDE_IVAMONTO = 0 INTO :EXENTOS;
              SELECT SUM((DVDE_TOTAL - DVDE_IVAMONTO - DVDE_CONSUMO)*:FACTENC), SUM(DVDE_IVAMONTO*:FACTENC) FROM DEVOLUCIONES_VENTAS_DETALLE D WHERE DEVT_ID = :ID AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL)) AND DVDE_IVAPORC = 16 AND DVDE_IVAMONTO <> 0 INTO :GRAVADOS1, :IVA1;
              SELECT SUM((DVDE_TOTAL - DVDE_IVAMONTO - DVDE_CONSUMO)*:FACTENC), SUM(DVDE_IVAMONTO*:FACTENC) FROM DEVOLUCIONES_VENTAS_DETALLE D WHERE DEVT_ID = :ID AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL)) AND DVDE_IVAPORC = 10 AND DVDE_IVAMONTO <> 0 INTO :GRAVADOS2, :IVA2;
              GRAVADOS3 = 0;
              iVA3 = 0;
              end
            else
              begin
              SELECT SUM((DVDE_TOTAL - DVDE_IVAMONTO - DVDE_CONSUMO)*:FACTENC) FROM DEVOLUCIONES_VENTAS_DETALLE D WHERE DEVT_ID = :ID AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL)) AND DVDE_IVAPORC = 0 INTO :EXENTOS;
              SELECT SUM((DVDE_TOTAL - DVDE_IVAMONTO - DVDE_CONSUMO)*:FACTENC), SUM(DVDE_IVAMONTO*:FACTENC) FROM DEVOLUCIONES_VENTAS_DETALLE D, TARIFA_IVA T WHERE DEVT_ID = :ID AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL)) AND DVDE_IVAPORC = TAIV_PORC AND TAIV_COD = 1 INTO :GRAVADOS1, :IVA1;
              SELECT SUM((DVDE_TOTAL - DVDE_IVAMONTO - DVDE_CONSUMO)*:FACTENC), SUM(DVDE_IVAMONTO*:FACTENC) FROM DEVOLUCIONES_VENTAS_DETALLE D, TARIFA_IVA T WHERE DEVT_ID = :ID AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL)) AND DVDE_IVAPORC = TAIV_PORC AND TAIV_COD = 2 INTO :GRAVADOS2, :IVA2;
              SELECT SUM((DVDE_TOTAL - DVDE_IVAMONTO - DVDE_CONSUMO)*:FACTENC), SUM(DVDE_IVAMONTO*:FACTENC) FROM DEVOLUCIONES_VENTAS_DETALLE D, TARIFA_IVA T WHERE DEVT_ID = :ID AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL)) AND DVDE_IVAPORC = TAIV_PORC AND TAIV_COD = 3 INTO :GRAVADOS3, :IVA3;
              end
            if (iva1 is null) then
                iva1 = 0;
            if (iva2 is null) then
                iva2 = 0;
            if (iva3 is null) then
                iva3 = 0;
            SELECT SUM(DVDE_CONSUMO) FROM DEVOLUCIONES_VENTAS_DETALLE WHERE DEVT_ID = :ID AND DVDE_REFERENCIA <> '.t' INTO :CONSUMO;
            EXENTOS = EXENTOS * -1;
            GRAVADOS1 = GRAVADOS1 * -1;
            GRAVADOS2 = GRAVADOS2 * -1;
            GRAVADOS3 = GRAVADOS3 * -1;
            CONSUMO = CONSUMO * -1;
            IVA1 = IVA1 * -1;
            IVA2 = IVA2 * -1;
            IVA3 = IVA3 * -1;
            SUBTOTAL = TOTAL - EXTRA - IVAMONTO - DTOMONTO;
            NETO = TOTAL - RTFTEMONTO - RTIVAMONTO - RTICAMONTO;
            END
        if (exentos is null) then
            exentos = 0;
        if (gravados1 is null) then
            gravados1 = 0;
        if (gravados2 is null) then
            gravados2 = 0;
        if (gravados3 is null) then
            gravados3 = 0;
        if (consumo is null) then
            consumo = 0;
        FACTOR = 1;
        SELECT AJCI_FACTOR FROM ajuste_cierre WHERE AJCI_PORC = 0 AND AJCI_FECINI <= :FECHA AND AJCI_FECFIN >= :FECHA INTO :FACTOR;
        if (FACTOR IS null) then
            FACTOR = 1;
        if (factor <> 1) then
            ajustar = 'S';
        EXENTOS = EXENTOS * FACTOR;
        ivamonto = 0;
        FACTOR = 1;
        SELECT AJCI_FACTOR FROM ajuste_cierre WHERE AJCI_PORC = 16 AND AJCI_FECINI <= :FECHA AND AJCI_FECFIN >= :FECHA INTO :FACTOR;
        if (FACTOR IS null) then
            FACTOR = 1;
        if (factor <> 1) then
            ajustar = 'S';
        gravados1 = GRAVADOS1 * FACTOR;
        IVA1 = IVA1 * FACTOR;
        FACTOR = 1;
        SELECT AJCI_FACTOR FROM ajuste_cierre WHERE AJCI_PORC = 10 AND AJCI_FECINI <= :FECHA AND AJCI_FECFIN >= :FECHA INTO :FACTOR;
        if (FACTOR IS null) then
            FACTOR = 1;
        if (factor <> 1) then
            ajustar = 'S';
        gravados2 = GRAVADOS2 * FACTOR;
        IVA2 = IVA2 * FACTOR;
        FACTOR = 1;
        SELECT AJCI_FACTOR FROM ajuste_cierre WHERE AJCI_PORC = 7 AND AJCI_FECINI <= :FECHA AND AJCI_FECFIN >= :FECHA INTO :FACTOR;
        if (FACTOR IS null) then
            FACTOR = 1;
        if (factor <> 1) then
            ajustar = 'S';
        gravados3 = GRAVADOS3 * FACTOR;
        IVA3 = IVA3 * FACTOR;
        NUEVO = exentos + gravados1 + gravados2 + gravados3;
        if ((TOTAL <> 0) and (ajustar = 'S')) then
            BEGIN
            IVAMONTO = IVA1 + IVA2 + IVA3;
            CONSUMO = CONSUMO * (NUEVO+ivamonto+consumo) / TOTAL;
            SUBTOTAL = SUBTOTAL * (NUEVO+ivamonto+consumo) / TOTAL;
            NETO = NETO * (NUEVO+ivamonto+consumo) / TOTAL;
            rtftemonto = rtftemonto * (NUEVO+ivamonto+consumo) / TOTAL;
            rticamonto = rticamonto * (NUEVO+ivamonto+consumo) / TOTAL;
            rtivamonto = rtivamonto * (NUEVO+ivamonto+consumo) / TOTAL;
            dtomonto = dtomonto * (NUEVO+ivamonto+consumo) / TOTAL;
            adicional = adicional * (NUEVO+ivamonto+consumo) / TOTAL;
            total = total * (NUEVO+ivamonto+consumo) / TOTAL;
            END
        SUSPEND;
        END
    END
execute procedure lee_configuracion ('FACTURACION', 'DOCUMENTOS', 'INCLUIR NOTAS DE CARTERA EN REPORTE DE IMPUESTOS EN VENTAS') returning_values (:NOTAS);
if (NOTAS = 'SI') then
    BEGIN
    TIPO = 41;
    SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 41 INTO :NOMTIPO;
    FOR SELECT NDCL_ID, N.PREF_PRE, NDCL_NUMERO, NDCL_FECHA, N.TERC_NIT, TERC_NOM, 0, NDCL_IVAMONTO, NDCL_RTFTEMONTO, NDCL_RTIVAMONTO, NDCL_RTICAMONTO, 0, NDCL_MONTO+NDCL_IVAMONTO, NDCL_ANULADO
        FROM NOTAS_DEBITO_CLIENTES N, TERCEROS T, PREFIJOS PR WHERE N.TERC_NIT = T.TERC_NIT AND
        NDCL_FECHA >= :FECINI AND NDCL_FECHA <= :FECFIN AND ((:PREFIJO = '') or (:PREFIJO IS NULL) or (N.PREF_PRE = :PREFIJO))
        AND PR.PREF_PRE = N.PREF_PRE AND PR.TIDO_COD = 41 AND ((PR.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
        ORDER BY NDCL_FECHA, N.PREF_PRE, NDCL_NUMERO
        INTO :ID, :PREF, :NUMERO, :FECHA, :NIT, :NOMTERCERO, :DTOMONTO, :IVAMONTO, :RTFTEMONTO, :RTIVAMONTO, :RTICAMONTO, :EXTRA, :TOTAL, :ANULADO
        DO
        BEGIN
        GRAVADOS2 = 0;
        GRAVADOS3 = 0;
        IVA2 = 0;
        IVA3 = 0;
        CONSUMO = 0;
        if (ANULADO = 'S') then
            BEGIN
            EXENTOS = 0;
            GRAVADOS1 = 0;
            SUBTOTAL = 0;
            TOTAL = 0;
            EXTRA = 0;
            IVAMONTO = 0;
            IVA1 = 0;
            DTOMONTO = 0;
            NETO = 0;
            RTFTEMONTO = 0;
            RTIVAMONTO = 0;
            RTICAMONTO = 0;
            END
        ELSE
            BEGIN
            if (IVAMONTO <> 0) then
                BEGIN
                GRAVADOS1 = TOTAL-IVAMONTO;
                IVA1 = IVAMONTO;
                exentos = 0;
                END
            ELSE
                BEGIN
                GRAVADOS1 = 0;
                IVA1 = 0;
                exentos = TOTAL;
                END
            SUBTOTAL = TOTAL - EXTRA - IVAMONTO - DTOMONTO;
            NETO = TOTAL - RTFTEMONTO - RTIVAMONTO - RTICAMONTO;
            END
        SUSPEND;
        END

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

SET TERM ; ^

/* 20091228B */
/* CXP POR AGENCIA */

SET TERM ^ ;

CREATE OR ALTER procedure REP_CXPAGAR_PROVEEDOR (
    DESDE varchar(20),
    HASTA varchar(20),
    GRPINI varchar(5),
    GRPFIN varchar(5),
    FECHA date,
    ORDEN char(1),
    AGRUPA char(1),
    SUBEMPRESA integer,
    MONEDA integer)
returns (
    NIT varchar(20),
    NOMBRE varchar(60),
    TELEFONO varchar(40),
    CIUDAD varchar(40),
    CODZONA varchar(2),
    NOMZONA varchar(60),
    DV char(1),
    CODCIUD char(5),
    NOMCIUD varchar(60),
    TIPO integer,
    ID integer,
    PREFIJO varchar(4),
    NUMERO varchar(6),
    CONCEPTO varchar(60),
    SALDO numeric(18,2),
    RTFTE numeric(18,2),
    RTIVA numeric(18,2),
    RTICA numeric(18,2),
    DTOF numeric(18,2),
    TIPONOM varchar(8),
    FECDOC date,
    VENCE date,
    DIAS integer,
    NUMPROV varchar(20))
AS
declare variable NITINI VARCHAR(20);
declare variable NITFIN VARCHAR(20);
declare variable NOMINI VARCHAR(20);
declare variable NOMFIN VARCHAR(20);
declare variable OK CHAR(1);
declare variable DTOAPL NUMERIC(18,2);
declare variable FOV CHAR(12);
declare variable TRM NUMERIC(18,2);
BEGIN
if (ORDEN = 'C') then
    BEGIN
    NITINI = DESDE;
    NITFIN = HASTA;
    NOMINI = '';
    NOMFIN = 'zz';
    END
ELSE
    BEGIN
    NOMINI = DESDE;
    NOMFIN = HASTA;
    NITINI = '';
    NITFIN = 'zz';
    END
  /* Ubique el NIT */
  FOR select T.TERC_NIT, TERC_NOM, TERC_DV, TERC_TEL, TERC_CIU, P.GRPR_COD, T.CIUD_COD
    from terceros T, PROVEEDORES P 
    where P.TERC_NIT = T.TERC_NIT AND TERC_PROV = 'S' AND T.TERC_NIT >= :NITINI AND T.TERC_NIT <= :NITFIN AND
        TERC_NOM >= :NOMINI AND TERC_NOM <= :NOMFIN
    INTO :NIT, :NOMBRE, :DV, :TELEFONO, :CIUDAD, :CODZONA, :CODCIUD
    DO  
    BEGIN
    select GRPR_NOM from GRUPOS_PROVEEDORES where GRPR_COD = :codzona into :NOMZONA;
    select CIUD_NOM from CIUDADES where CIUD_COD = :codciud into :NOMCIUD;
    OK = 'N';
    if (AGRUPA = 'G') then
        BEGIN
        if (GRPINI = '') then
            BEGIN
            if ((CODZONA IS NULL) or (CODZONA >= :GRPINI AND CODZONA <= :GRPFIN)) then
                OK = 'S';
            END
        ELSE
            if (CODZONA >= :GRPINI AND CODZONA <= :GRPFIN) then
                OK = 'S';
        END
    if (AGRUPA = 'C') then
        BEGIN
        if (GRPINI = '') then
            BEGIN
            if ((CODCIUD IS NULL) or (CODCIUD >= :GRPINI AND CODCIUD <= :GRPFIN)) then
                OK = 'S';
            END
        ELSE
            if (CODCIUD >= :GRPINI AND CODCIUD <= :GRPFIN) then
                OK = 'S';
        END
    if (AGRUPA = 'N') then
        OK = 'S';
        
    if (OK = 'S') then
        BEGIN
        /* BUSQUE EN SALDOS_DOC_CXPAGAR LOS QUE TENGAN SALDO > 0 */
        FOR SELECT MVPR_TIPOREF, MVPR_IDREF, MVPR_PREFIJO, MVPR_NUMERO, MVPR_FECHA, MVPR_VENCE, MVPR_CONC
            FROM MOVIMIENTO_PROVEEDOR M, PREFIJOS P
            WHERE TERC_NIT = :NIT AND MVPR_FECHA <= :FECHA AND MVPR_ABONO = 'N' AND ((:MONEDA = 0) or (MVPR_TRM <> 1))
            AND P.tido_cod = M.mvpr_tiporef AND P.pref_pre = M.mvpr_prefijo AND ((P.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            INTO :TIPO, :ID, :PREFIJO, :NUMERO, :FECDOC, :VENCE, :CONCEPTO
            DO
            BEGIN
            EXECUTE PROCEDURE LEE_CONFIGURACION('CXPAGAR', 'SALDOS', 'ANALISIS DE CXPAGAR CON FECHA FACTURA O VENCIMIENTO') RETURNING_VALUES (FOV);
            if (FOV = 'FECHA') then
                DIAS = FECHA - FECDOC;
            ELSE
                DIAS = FECHA - VENCE;
            EXECUTE PROCEDURE saldo_doc_cxpagar(TIPO, ID, FECHA, MONEDA) returning_values (SALDO);
            if (SALDO <> 0) then
                BEGIN
                SELECT TIDO_NOMCORTO FROM TIPO_DOCUMENTO WHERE TIDO_COD = :TIPO INTO :TIPONOM;
                if (TIPO = 51) then
                    SELECT NDPR_DTOFMONTO, NDPR_NUMPROV, NDPR_TRM FROM NOTAS_DEBITO_PROVEEDOR
                        WHERE NDPR_ID = :ID INTO :DTOF, :NUMPROV, :TRM;
                if (TIPO = 52) then
                    SELECT 0, '', 1 FROM NOTAS_CREDITO_PROVEEDOR WHERE NCPR_ID = :ID INTO :DTOF, :NUMPROV, :TRM;
                if (TIPO = 55) then
                    SELECT ANPR_DTOFMONTO, '', ANPR_TRM FROM ANTICIPOS_PROVEEDOR WHERE ANPR_ID = :ID INTO :DTOF, :NUMPROV, :TRM;
                if (TIPO = 21) then
                    SELECT FACO_DTOFMONTO, FACO_NUMPROV, FACO_TRM FROM FACTURAS_COMPRA WHERE FACO_ID = :ID INTO :DTOF, :NUMPROV, :TRM;
                if (TIPO = 24) then
                    SELECT 0, '', 1 FROM devoluciones_compras WHERE DVCO_ID = :ID INTO :DTOF, :NUMPROV, :TRM;
                if (DTOF IS NULL) then
                    DTOF = 0;
                if (DTOF <> 0) then
                    BEGIN
                    if ((MONEDA <> 0) AND (TRM <> 0)) then
                        DTOF = DTOF / TRM;
                    if (MONEDA = 0) then
                        SELECT SUM(EGDE_DTOF) FROM EGRESOS_DETALLE WHERE EGDE_IDDOC = :ID AND EGDE_TIPODOC = :TIPO INTO :DTOAPL;
                    else
                        SELECT SUM(EGDE_DTOF/EGRE_TRM) FROM EGRESOS_DETALLE D, EGRESOS E
                            WHERE E.egre_id = D.egre_id AND EGDE_IDDOC = :ID AND EGDE_TIPODOC = :TIPO INTO :DTOAPL;

                    if (DTOAPL IS NULL) then
                        DTOAPL = 0;
                    DTOF = DTOF - DTOAPL;
                    END
                if (MONEDA = 0) then
                    SELECT SUM(SDCP_RTEFTE-SDCP_ABRTFTE), SUM(SDCP_RTIVA-SDCP_ABRTIVA), SUM(SDCP_RTICA-SDCP_ABRTICA)
                        FROM SALDOS_DOC_CXPAGAR WHERE SDCP_TIPOREF = :TIPO AND SDCP_IDREF = :ID INTO :RTFTE, :RTIVA, :RTICA;
                else
                    SELECT SUM((SDCP_RTEFTE-SDCP_ABRTFTE)/SDCP_TRM), SUM((SDCP_RTIVA-SDCP_ABRTIVA)/SDCP_TRM), SUM((SDCP_RTICA-SDCP_ABRTICA)/SDCP_TRM)
                        FROM SALDOS_DOC_CXPAGAR WHERE SDCP_TIPOREF = :TIPO AND SDCP_IDREF = :ID INTO :RTFTE, :RTIVA, :RTICA;
                if (RTFTE IS NULL) then
                    RTFTE = 0;
                if ((TIPO = 52) or (TIPO = 55) or (TIPO = 24)) THEN
                    BEGIN
                    if (RTFTE > 0) then
                        RTFTE = 0;
                    END
                ELSE
                    BEGIN
                    if (RTFTE < 0) then
                        RTFTE = 0;
                    END

                if (RTIVA IS NULL) then
                    RTIVA = 0;
                if ((TIPO = 52) or (TIPO = 55) or (TIPO = 24)) THEN
                    BEGIN
                    if (RTIVA > 0) then
                        RTIVA = 0;
                    END
                ELSE
                    BEGIN
                    if (RTIVA < 0) then
                        RTIVA = 0;
                    END

                if (RTICA IS NULL) then
                    RTICA = 0;
                if ((TIPO = 52) or (TIPO = 55) or (TIPO = 24)) THEN
                    BEGIN
                    if (RTICA > 0) then
                        RTICA = 0;
                    END
                ELSE
                    BEGIN
                    if (RTICA < 0) then
                        RTICA = 0;
                    END
                SUSPEND;
                END
            END
        END
    END
END
^

SET TERM ; ^


SET TERM ^ ;

CREATE OR ALTER procedure REP_CXPAGAR_CONSOLIDADAS (
    DESDE varchar(20),
    HASTA varchar(20),
    GRPINI varchar(5),
    GRPFIN varchar(5),
    FECHA date,
    ORDEN char(1),
    AGRUPA char(1),
    SUBEMPRESA integer,
    MONEDA integer)
returns (
    NIT varchar(20),
    NOMBRE varchar(60),
    TELEFONO varchar(40),
    CIUDAD varchar(40),
    CODZONA varchar(2),
    NOMZONA varchar(60),
    DV char(1),
    CODCIUD char(5),
    NOMCIUD varchar(60),
    SALDO numeric(18,2),
    RTFTE numeric(18,2),
    RTIVA numeric(18,2),
    RTICA numeric(18,2),
    DTOF numeric(18,2))
AS
declare variable NITINI VARCHAR(20);
declare variable NITFIN VARCHAR(20);
declare variable NOMINI VARCHAR(20);
declare variable NOMFIN VARCHAR(20);
declare variable OK CHAR(1);
declare variable PSALDO NUMERIC(18,2);
declare variable PRTFTE NUMERIC(18,2);
declare variable PRTIVA NUMERIC(18,2);
declare variable PRTICA NUMERIC(18,2);
declare variable PDTOF NUMERIC(18,2);
declare variable TIPO INTEGER;
declare variable ID INTEGER;
declare variable DTOAPL NUMERIC(18,2);
declare variable TRM NUMERIC(18,2);
BEGIN
if (ORDEN = 'C') then
    BEGIN
    NITINI = DESDE;
    NITFIN = HASTA;
    NOMINI = '';
    NOMFIN = 'zz';
    END
ELSE
    BEGIN
    NOMINI = DESDE;
    NOMFIN = HASTA;
    NITINI = '';
    NITFIN = 'zz';
    END
  /* Ubique el NIT */
  FOR select T.TERC_NIT, TERC_NOM, TERC_DV, TERC_TEL, TERC_CIU, GRPR_COD, CIUD_COD
    from terceros T, PROVEEDORES P
    where P.TERC_NIT = T.TERC_NIT AND TERC_PROV = 'S' AND T.TERC_NIT >= :NITINI AND T.TERC_NIT <= :NITFIN AND
        TERC_NOM >= :NOMINI AND TERC_NOM <= :NOMFIN
    INTO :NIT, :NOMBRE, :DV, :TELEFONO, :CIUDAD, :CODZONA, :CODCIUD
    DO  
    BEGIN
    OK = 'N';
    if (AGRUPA = 'G') then
        BEGIN
        if (GRPINI = '') then
            BEGIN
            if ((CODZONA IS NULL) or (CODZONA >= :GRPINI AND CODZONA <= :GRPFIN)) then
                OK = 'S';
            END
        ELSE
            if (CODZONA >= :GRPINI AND CODZONA <= :GRPFIN) then
                OK = 'S';
        END
    if (AGRUPA = 'N') then
        OK = 'S';
        
    if (OK = 'S') then
        BEGIN
        SELECT GRPR_NOM FROM GRUPOS_PROVEEDORES WHERE GRPR_COD = :CODZONA INTO :NOMZONA;
        SELECT CIUD_NOM FROM CIUDADES WHERE CIUD_COD = :CODCIUD INTO :NOMCIUD;
        SALDO = 0;
        RTFTE = 0;
        RTIVA = 0;
        RTICA = 0;
        DTOF = 0;
        /* BUSQUE EN SALDOS_DOC_CXPAGAR LOS QUE TENGAN SALDO > 0 */
        FOR SELECT MVPR_TIPOREF, MVPR_IDREF
          FROM MOVIMIENTO_PROVEEDOR M, PREFIJOS P
          WHERE TERC_NIT = :NIT AND MVPR_FECHA <= :FECHA AND MVPR_ABONO = 'N' AND ((:MONEDA = 0) or (MVPR_TRM <> 1))
            AND P.tido_cod = M.mvpr_tiporef AND P.pref_pre = M.mvpr_prefijo AND ((P.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
          INTO :TIPO, :ID
          DO
            BEGIN
            EXECUTE PROCEDURE saldo_doc_cxpagar(TIPO, ID, FECHA, MONEDA) returning_values (PSALDO);
            if (PSALDO <> 0) then
                BEGIN
                if (TIPO = 51) then
                    SELECT NDPR_DTOFMONTO, NDPR_TRM FROM NOTAS_DEBITO_PROVEEDOR
                        WHERE NDPR_ID = :ID INTO :PDTOF, :TRM;
                if (TIPO = 52) then
                    SELECT 0, 1 FROM NOTAS_CREDITO_PROVEEDOR WHERE NCPR_ID = :ID INTO :PDTOF, :TRM;
                if (TIPO = 55) then
                    SELECT ANPR_DTOFMONTO, ANPR_TRM FROM ANTICIPOS_PROVEEDOR WHERE ANPR_ID = :ID INTO :PDTOF, :TRM;
                if (TIPO = 21) then
                    SELECT 0, 1 FROM FACTURAS_COMPRA WHERE FACO_ID = :ID INTO :PDTOF, :TRM;
                if (TIPO = 24) then
                    SELECT 0, 1 FROM devoluciones_compras WHERE DVCO_ID = :ID INTO :PDTOF, :TRM;
                if (DTOF IS NULL) then
                    DTOF = 0;
                if (DTOF <> 0) then
                    BEGIN
                    if ((MONEDA <> 0) AND (TRM <> 0)) then
                        DTOF = DTOF / TRM;
                    if (MONEDA = 0) then
                        SELECT SUM(EGDE_DTOF) FROM EGRESOS_DETALLE WHERE EGDE_IDDOC = :ID AND EGDE_TIPODOC = :TIPO INTO :DTOAPL;
                    else
                        SELECT SUM(EGDE_DTOF/EGRE_TRM) FROM EGRESOS_DETALLE D, EGRESOS E
                            WHERE E.egre_id = D.egre_id AND EGDE_IDDOC = :ID AND EGDE_TIPODOC = :TIPO INTO :DTOAPL;
                    if (DTOAPL IS NULL) then
                        DTOAPL = 0;
                    DTOF = DTOF - DTOAPL;
                    END
                if (MONEDA = 0) then
                    SELECT SUM(SDCP_RTEFTE - SDCP_ABRTFTE), SUM(SDCP_RTIVA - SDCP_ABRTIVA), SUM(SDCP_RTICA - SDCP_ABRTICA)
                        FROM SALDOS_DOC_CXPAGAR WHERE SDCP_TIPOREF = :TIPO AND SDCP_IDREF = :ID INTO :PRTFTE, :PRTIVA, :PRTICA;
                else
                    SELECT SUM((SDCP_RTEFTE-SDCP_ABRTFTE)/SDCP_TRM), SUM((SDCP_RTIVA-SDCP_ABRTIVA)/SDCP_TRM), SUM((SDCP_RTICA-SDCP_ABRTICA)/SDCP_TRM)
                        FROM SALDOS_DOC_CXPAGAR WHERE SDCP_TIPOREF = :TIPO AND SDCP_IDREF = :ID INTO :PRTFTE, :PRTIVA, :PRTICA;
                if (PRTFTE IS NULL) then
                    PRTFTE = 0;
                if ((TIPO = 52) or (TIPO = 55) or (TIPO = 24)) THEN
                    BEGIN
                    if (RTFTE > 0) then
                        RTFTE = 0;
                    END
                ELSE
                    BEGIN
                    if (RTFTE < 0) then
                        RTFTE = 0;
                    END
                if (PRTIVA IS NULL) then
                    PRTIVA = 0;
                if ((TIPO = 52) or (TIPO = 55) or (TIPO = 24)) THEN
                    BEGIN
                    if (RTIVA > 0) then
                        RTIVA = 0;
                    END
                ELSE
                    BEGIN
                    if (RTIVA < 0) then
                        RTIVA = 0;
                    END
                if (PRTICA IS NULL) then
                    PRTICA = 0;
                if ((TIPO = 52) or (TIPO = 55) or (TIPO = 24)) THEN
                    BEGIN
                    if (PRTICA > 0) then
                        PRTICA = 0;
                    END
                ELSE
                    BEGIN
                    if (PRTICA < 0) then
                        PRTICA = 0;
                    END
                SALDO = SALDO + PSALDO;
                RTFTE = RTFTE + PRTFTE;
                RTIVA = RTIVA + PRTIVA;
                RTICA = RTICA + PRTICA;
                DTOF = DTOF + PDTOF;
                END
            END
        SUSPEND;
        END
    END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure REP_ANALISIS_CXPAGAR (
    DESDE varchar(20),
    HASTA varchar(20),
    GRPINI varchar(5),
    GRPFIN varchar(5),
    FECHA date,
    DETALLE char(1),
    ORDEN char(1),
    AGRUPA char(1),
    DIASR integer,
    SUBEMPRESA integer,
    MONEDA integer)
returns (
    NIT varchar(20),
    NOMBRE varchar(60),
    TELEFONO varchar(40),
    CIUDAD varchar(40),
    GRUPO varchar(2),
    NOMGRUPO varchar(60),
    TIPO integer,
    ID integer,
    PREFIJO varchar(4),
    NUMERO varchar(6),
    DIAS integer,
    SALDO numeric(18,2),
    CORRIENTE numeric(18,2),
    CERO numeric(18,2),
    TREINTA numeric(18,2),
    SESENTA numeric(18,2),
    NOVENTA numeric(18,2),
    TIPONOM varchar(8),
    FECDOC date,
    VENCE date,
    NUMPROV varchar(20))
AS
declare variable NITINI VARCHAR(20);
declare variable NITFIN VARCHAR(20);
declare variable NOMINI VARCHAR(20);
declare variable NOMFIN VARCHAR(20);
declare variable OK CHAR(1);
declare variable RTFTE NUMERIC(18,2);
declare variable RTIVA NUMERIC(18,2);
declare variable RTICA NUMERIC(18,2);
declare variable VENCIMIENTO VARCHAR(12);
BEGIN
if (ORDEN = 'C') then
    BEGIN
    NITINI = DESDE;
    NITFIN = HASTA;
    NOMINI = '';
    NOMFIN = 'zz';
    END
ELSE
    BEGIN
    NOMINI = DESDE;
    NOMFIN = HASTA;
    NITINI = '';
    NITFIN = 'zz';
    END
/* Ubique el NIT */
FOR select T.TERC_NIT, TERC_NOM,  TERC_TEL, TERC_CIU, GRPR_COD
    from terceros T, PROVEEDORES P
    where P.TERC_NIT = T.TERC_NIT AND TERC_PROV = 'S' AND T.TERC_NIT >= :NITINI AND T.TERC_NIT <= :NITFIN AND
        TERC_NOM >= :NOMINI AND TERC_NOM <= :NOMFIN
    INTO :NIT, :NOMBRE, :TELEFONO, :CIUDAD, :GRUPO
    DO  
    BEGIN
    SELECT GRPR_NOM FROM GRUPOS_PROVEEDORES WHERE GRPR_COD = :GRUPO INTO :NOMGRUPO;
    OK = 'N';
    if (AGRUPA = 'G') then
        BEGIN
        if (GRPINI = '') then
            BEGIN
            if ((GRUPO IS NULL) or (GRUPO >= :GRPINI AND GRUPO <= :GRPFIN)) then
                OK = 'S';
            END
        ELSE
            if (GRUPO >= :GRPINI AND GRUPO <= :GRPFIN) then
                OK = 'S';
        END
    if (AGRUPA = 'N') then
        OK = 'S';
    if (OK = 'S') then
        BEGIN
        CORRIENTE = 0;
        CERO = 0;
        TREINTA = 0;
        SESENTA = 0;
        NOVENTA = 0;
        /* BUSQUE EN SALDOS_DOC_CXPAGAR LOS QUE TENGAN SALDO > 0 */
        FOR SELECT MVPR_TIPOREF, MVPR_IDREF, MVPR_PREFIJO, MVPR_NUMERO, MVPR_FECHA, MVPR_VENCE
            FROM MOVIMIENTO_PROVEEDOR M, PREFIJOS P
            WHERE TERC_NIT = :NIT AND MVPR_FECHA <= :FECHA AND MVPR_ABONO = 'N' AND ((:MONEDA = 0) or (MVPR_TRM <> 1))
             AND P.tido_cod = M.mvpr_tiporef AND P.pref_pre = M.mvpr_prefijo AND ((P.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            INTO :TIPO, :ID, :PREFIJO, :NUMERO, :FECDOC, :VENCE
            DO
            BEGIN
            EXECUTE PROCEDURE saldo_doc_cxpagar(TIPO, ID, FECHA, MONEDA) returning_values (SALDO);
            if (SALDO <> 0) then
                BEGIN
                SELECT TIDO_NOMCORTO FROM TIPO_DOCUMENTO WHERE TIDO_COD = :TIPO INTO :TIPONOM;
                if (MONEDA = 0) then
                    SELECT SUM(SDCP_RTEFTE - SDCP_ABRTFTE), SUM(SDCP_RTIVA - SDCP_ABRTIVA), SUM(SDCP_RTICA - SDCP_ABRTICA)
                        FROM SALDOS_DOC_CXPAGAR WHERE SDCP_TIPOREF = :TIPO AND SDCP_IDREF = :ID
                        INTO :RTFTE, :RTIVA, :RTICA;
                else
                    SELECT SUM((SDCP_RTEFTE-SDCP_ABRTFTE)/SDCP_TRM), SUM((SDCP_RTIVA-SDCP_ABRTIVA)/SDCP_TRM), SUM((SDCP_RTICA-SDCP_ABRTICA)/SDCP_TRM)
                        FROM SALDOS_DOC_CXPAGAR WHERE SDCP_TIPOREF = :TIPO AND SDCP_IDREF = :ID
                        INTO :RTFTE, :RTIVA, :RTICA;
                if (RTFTE IS NULL) then
                    RTFTE = 0;
                if ((TIPO = 52) or (TIPO = 55) or (TIPO = 24)) THEN
                    BEGIN
                    if (RTFTE > 0) then
                        RTFTE = 0;
                    END
                ELSE
                    BEGIN
                    if (RTFTE < 0) then
                        RTFTE = 0;
                    END

                if (RTIVA IS NULL) then
                    RTIVA = 0;
                if ((TIPO = 52) or (TIPO = 55) or (TIPO = 24)) THEN
                    BEGIN
                    if (RTIVA > 0) then
                        RTIVA = 0;
                    END
                ELSE
                    BEGIN
                    if (RTIVA < 0) then
                        RTIVA = 0;
                    END

                if (RTICA IS NULL) then
                    RTICA = 0;
                if ((TIPO = 52) or (TIPO = 55) or (TIPO = 24)) THEN
                    BEGIN
                    if (RTICA > 0) then
                        RTICA = 0;
                    END
                ELSE
                    BEGIN
                    if (RTICA < 0) then
                        RTICA = 0;
                    END
                /* AHORA CLASIFIQUE LOS DIAS */
                if (DETALLE = 'S') then
                    BEGIN
                    CORRIENTE = 0;
                    CERO = 0;
                    TREINTA = 0;
                    SESENTA = 0;
                    NOVENTA = 0;
                    END
                EXECUTE PROCEDURE LEE_CONFIGURACION('CXPAGAR', 'SALDOS', 'ANALISIS DE CXPAGAR CON FECHA FACTURA O VENCIMIENTO') returning_values (VENCIMIENTO);
                if (VENCIMIENTO = 'FECHA') then
                    DIAS = FECHA - FECDOC;
                ELSE
                    DIAS = FECHA - VENCE;
                if (DIAS < 0) then
                    CORRIENTE = CORRIENTE + SALDO;
                ELSE
                    if (DIAS < DIASR) then
                        CERO = CERO + SALDO;
                    ELSE
                        if (DIAS < (DIASR * 2)) then
                            TREINTA = TREINTA + SALDO;
                        ELSE
                            if (DIAS < (DIASR * 3)) then
                                SESENTA = SESENTA + SALDO;
                            ELSE
                                NOVENTA = NOVENTA + SALDO;
                if (DETALLE = 'S') then
                    BEGIN
                    if (TIPO = 51) then
                        SELECT NDPR_NUMPROV FROM NOTAS_DEBITO_PROVEEDOR WHERE NDPR_ID = :ID INTO :NUMPROV;
                    ELSE
                        if (TIPO = 21) then
                            SELECT FACO_NUMPROV FROM FACTURAS_COMPRA WHERE FACO_ID = :ID INTO :NUMPROV;
                        ELSE
                            NUMPROV = '';
                    SUSPEND;
                    END
                END /* SALDO <> 0 */
            END /* FOR MVPR */
        if (DETALLE = 'N') then
            begin
            SALDO = CORRIENTE + CERO + TREINTA + SESENTA + NOVENTA;
            SUSPEND;
            end
        END /* OK */
    END /* FOR NIT */
END
^

SET TERM ; ^



/* 20091231 */

INSERT INTO CONFIGURACION (CONF_MODULO, CONF_CATEGORIA, CONF_PROPIEDAD, CONF_VALOR, CONF_POSIBLES, CONF_AYUDA) VALUES ('INVENTARIO', 'ENSAMBLES', 'NUMERO DE DIAS DE CONSUMO A PRODUCIR', '1', '1,2,3,5,7,15,30', 'Indique el número de dias de inventario a cubrir con la orden de producción');

INSERT INTO CONFIGURACION (CONF_MODULO, CONF_CATEGORIA, CONF_PROPIEDAD, CONF_VALOR, CONF_POSIBLES, CONF_AYUDA) VALUES ('INVENTARIO', 'ENSAMBLES', 'PORCENTAJE DE EXCEDENTE A PRODUCIR', '5', '5,10,15,20', 'Indique el porcentaje en que se incrementarán las cantidades producidas para dar un margen de seguridad que evite agotados por pedidos sobre el promedio');

INSERT INTO CONFIGURACION (CONF_MODULO, CONF_CATEGORIA, CONF_PROPIEDAD, CONF_VALOR, CONF_POSIBLES, CONF_AYUDA) VALUES ('INVENTARIO', 'ENSAMBLES', 'GRUPO DE LOS ARTICULOS A PRODUCIR', '01', '', 'Indique el código del grupo al que pertenecen los artículos a incluir en la orden de producción automática');
INSERT INTO CONFIGURACION (CONF_MODULO, CONF_CATEGORIA, CONF_PROPIEDAD, CONF_VALOR, CONF_POSIBLES, CONF_AYUDA) VALUES ('INVENTARIO', 'ENSAMBLES', 'SUBGRUPO DE LOS ARTICULOS A PRODUCIR', '80', '', 'Indique el código del subgrupo al que pertenecen los artículos a incluir en la orden de producción automática');
INSERT INTO CONFIGURACION (CONF_MODULO, CONF_CATEGORIA, CONF_PROPIEDAD, CONF_VALOR, CONF_POSIBLES, CONF_AYUDA) VALUES ('INVENTARIO', 'ENSAMBLES', 'MARCA DE LOS ARTICULOS A PRODUCIR', '84', '', 'Indique el código de la marca a la que pertenecen los artículos a incluir en la orden de producción automática');
commit work;


SET TERM ^ ;

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

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

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

SET TERM ; ^

grant EXECUTE on PROCEDURE produccion_sugerida to PUBLIC;

SET TERM ^ ;

create or alter procedure IMPR_PLANPROD (
    ID integer)
returns (
    PREF varchar(4),
    NUMERO varchar(6),
    FECHA date,
    FECFIN date,
    CONCEPTO varchar(60),
    RESPONSABLE varchar(60),
    OBS blob sub_type 0 segment size 80,
    ITEM integer,
    ARTICULO varchar(15),
    CODBAR varchar(15),
    ARTIDES varchar(60),
    CANT numeric(18,4),
    UNIDAD varchar(8),
    MERMA numeric(9,4),
    PESO numeric(18,4),
    OBSITEM blob sub_type 0 segment size 80)
AS
BEGIN
  /*  */
  SELECT PLPR_PREF, PLPR_NUMERO, PLPR_FECINI, PLPR_FECFIN, PLPR_CONC, PLPR_RESPONSABLE, PLPR_OBS
    FROM plan_produccion O WHERE PLPR_ID = :ID into
    :PREF, :NUMERO, :FECHA,
    :FECFIN, :CONCEPTO, :RESPONSABLE, :OBS;
  FOR SELECT PLPD_ITEM, ARTI_COD, PLPD_CODBAR, PLPD_DESC, PLPD_CANT, PLPD_UNIDAD, PLPD_MERMA, PLPD_PESO, PLPD_OBS
    FROM plan_produccion_det WHERE PLPR_ID = :ID
    ORDER BY PLPD_ITEM
    INTO :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :MERMA, :PESO, :OBSITEM
    DO
      BEGIN
      SUSPEND;
      END
END
^

SET TERM ; ^

grant EXECUTE on PROCEDURE impr_planprod to PUBLIC;

SET TERM ^ ;

create or alter procedure IMPR_PLANPROD_CONS (
    ID integer)
returns (
    ITEM integer,
    ARTICULO varchar(15),
    CODBAR varchar(15),
    ARTIDES varchar(60),
    CANT numeric(18,4),
    UNIDAD varchar(8),
    EXISTEN numeric(18,4),
    ORDENADO numeric(18,4),
    OBSITEM blob sub_type 0 segment size 80)
AS
BEGIN
FOR SELECT PLPC_ITEM, ARTI_COD, PLPC_CODBAR, PLPC_DESC, PLPC_CANT, PLPC_UNIDAD, PLPC_EXIST, PLPC_ORDENAR, PLPC_OBS
    FROM plan_produccion_cons WHERE PLPD_ID = :ID
    ORDER BY PLPC_ITEM
    INTO :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :existen, :ordenado, :OBSITEM
    DO
      BEGIN
      SUSPEND;
      END
END
^

SET TERM ; ^

grant EXECUTE on PROCEDURE impr_planprod_cons to PUBLIC;

SET TERM ^ ;

create trigger PLAN_PRODUCCION_DET_BI for PLAN_PRODUCCION_DET
active BEFORE INSERT position 0
as
begin
if (NEW.plpd_factor IS NULL) then
    NEW.plpd_factor = 1;
end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER PROCEDURE CONSOLIDE_PRODUCCION(
    PLANID INTEGER)
AS
declare variable ITEM INTEGER;
declare variable ARTIC VARCHAR(20);
declare variable CANT NUMERIC(18,4);
declare variable CANTPRO NUMERIC(18,4);
declare variable CODCMP VARCHAR(20);
declare variable CANTCMP NUMERIC(18,4);
declare variable PORCMP NUMERIC(9,4);
declare variable UNDCMP VARCHAR(8);
declare variable FACTOR NUMERIC(18,4);
declare variable PESOCMP NUMERIC(18,4);
declare variable PESO NUMERIC(18,4);
declare variable MERMA NUMERIC(18,4);
declare variable TIPOORD INTEGER;
declare variable NUMROWS INTEGER;
declare variable TOTAL NUMERIC(9,4);
declare variable DESCR VARCHAR(60);
declare variable UNIDAD VARCHAR(8);
begin
ITEM = 0;
FOR SELECT ARTI_COD, PLPD_CANT * PLPD_FACTOR, PLPD_MERMA, PLPD_PESO
    from PLAN_PRODUCCION_DET WHERE PLPR_ID = :PLANID
    INTO :ARTIC, :CANTPRO, :MERMA, :PESO
    DO
    BEGIN
    select sum(arpr_porc) from articulos_producto where arti_cod = :artic into :total;
    FOR SELECT arpr_comp, ARPR_CANT, ARPR_UNIDAD, ARPR_PORC, ARTI_UNIDAD, ARTI_DES, arti_peso
        from articulos_producto AP, ARTICULO A2
        WHERE AP.arpr_comp = A2.arti_cod AND AP.arti_cod = :ARTIC ORDER by ARPR_ITEM
        INTO :codcmp, :cantcmp, :undcmp, :porcmp, :unidad, :descr, :pesocmp
        DO
        BEGIN
/*        EXECUTE PROCEDURE factor_unidad_cant(:codcmp, :undcmp) returning_values (:FACTOR);
        cantcmp = cantcmp * FACTOR;*/
        if (((cantcmp is null) or (cantcmp = 0)) AND (PORCMP IS NOT NULL) AND (porcmp <> 0)) then
            BEGIN
            /* ES PORCENTUAL AL PESO LA MEZCLA SOBRE EL 1ER ARTICULO */
            CANT = cantpro * PESO;
            if ((MERMA IS NOT NULL) AND (MERMA <> 0)) then
                CANT = CANT * (100 + MERMA) / 100;
            CANT = CANT * porcmp / TOTAL; /* APLICA LA PROPORCION */
            CANT = CANT / pesocmp; /* LO LLEVA A LA UNIDAD PRINCIPAL */
            undcmp = unidad;
            END
        ELSE
            BEGIN
            CANT = cantpro * CANTCMP;
            END

        SELECT COUNT(ARTI_COD) FROM articulos_producto WHERE ARTI_COD = :codcmp INTO :NUMROWS;
        if (NUMROWS <> 0) then
           TIPOORD = 19;
        else
            TIPOORD = 24;

        /* INSERTE O ACTUALICE EL COMPONENTE */
        if (NOT EXISTS (SELECT PLPC_ITEM FROM plan_produccion_cons WHERE PLPD_ID = :planid AND ARTI_COD = :codcmp)) then
            BEGIN
            ITEM = ITEM + 1;
            INSERT INTO plan_produccion_cons (PLPD_ID, PLPC_ITEM, PLPC_CODBAR, ARTI_COD, PLPC_CANT, PLPC_UNIDAD, PLPC_EXIST, PLPC_ORDENAR, PLPC_ORDENTIPO, PLPC_ORDENID, PLPC_ANULADO, PLPC_TRANSMIT, PLPC_DESC)
                VALUES (:planid, :item, :codcmp, :codcmp, :cant, :undcmp, 0, 0, :tipoord, 0, 'N', 'N', :descr);
            END
        ELSE
            UPDATE plan_produccion_cons SET PLPC_CANT = PLPC_CANT + :CANT
                WHERE PLPD_ID = :planid AND ARTI_COD = :codcmp;
        END
    END
end
^

SET TERM ; ^


/* 20091231B */
SET TERM ^ ;

create trigger PLAN_PRODUCCION_CONS_AI for PLAN_PRODUCCION_CONS
active AFTER INSERT position 0
as
declare variable fec date;
declare variable CONC VARCHAR(60);
declare variable factor numeric(18,4);
declare variable Pref varchar(4);
declare variable Num varchar(6);
BEGIN
  if ((NEW.plpd_id <> 0) and (new.plpc_anulado = 'N')) then
    BEGIN
    select plpr_fecini, plpr_conc, plpr_pref, plpr_numero from plan_produccion
        where plpr_id = new.plpd_id into :fec, :conc, :Pref, :Num;
    execute procedure factor_unidad_cant(new.arti_cod, new.plpc_unidad) returning_values(factor);
    INSERT INTO MOVIMIENTO_ARTICULO
      (ARTI_COD, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM, TERC_NIT)
      VALUES(NEW.ARTI_COD, '01', :FEC, 27, NEW.plpd_id,
      :CONC, :factor * new.plpc_cant, 0, 'N', null, :Pref, :Num, new.plpc_item, null);
    end
end
^

SET TERM ; ^

SET TERM ^ ;

create trigger PLAN_PRODUCCION_CONS_AD for PLAN_PRODUCCION_CONS
active AFTER DELETE position 0
as
begin
if ((old.plpd_id <> 0) and (old.plpc_anulado = 'N')) then
    begin
    delete from movimiento_articulo
      where (mvar_tipodoc = 27) and (mvar_idref = old.plpd_id) and (mvar_item = old.plpc_item);
    end
end
^

SET TERM ; ^


SET TERM ^ ;

create trigger PLAN_PRODUCCION_CONS_AU for PLAN_PRODUCCION_CONS
active AFTER UPDATE position 0
as
declare variable fec date;
declare variable CONC VARCHAR(60);
declare variable factor numeric(18,4);
declare variable Pref varchar(4);
declare variable Num varchar(6);
BEGIN
if ((old.arti_cod <> new.arti_cod) or (old.plpc_cant <> new.plpc_cant) or (old.plpc_unidad <> new.plpc_unidad) or
    (old.plpc_anulado <> new.plpc_anulado) or (old.plpc_transmit <> new.plpc_transmit)) then
  begin
  /* Anule el anterior */
  if ((old.plpd_id <> 0) and (old.plpc_anulado = 'N')) then
    begin
    delete from movimiento_articulo where (mvar_tipodoc = 27) and (mvar_idref = old.plpd_id) and (mvar_item = old.plpc_item);
    END
  /* Registre el nuevo */
  if ((new.plpd_id <> 0) and (new.plpc_anulado = 'N')) then
    BEGIN
    select plpr_fecini, plpr_conc, plpr_pref, plpr_numero from plan_produccion
        where plpr_id = new.plpd_id into :fec, :conc, :Pref, :Num;
    execute procedure factor_unidad_cant(new.arti_cod, new.plpc_unidad) returning_values(factor);
    INSERT INTO MOVIMIENTO_ARTICULO
      (ARTI_COD, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM, TERC_NIT)
      VALUES(NEW.ARTI_COD, '01', :FEC, 27, NEW.plpd_id,
      :CONC, :factor * new.plpc_cant, 0, 'N', null, :Pref, :Num, new.plpc_item, null);
    END
  end
end
^

SET TERM ; ^

SET TERM ^ ;

create trigger PLAN_PRODUCCION_AU for PLAN_PRODUCCION
active AFTER UPDATE position 0
as
declare variable consec INTEGER;
BEGIN
/* borre la contabilizacion */
if (new.plpr_anulado = 'S') then
    begin
    select enco_consec from comprobante_encabezado where enco_tiporef = 27 and enco_idref = old.plpr_id into :consec;
    if (NOT consec is null) then
      delete from comprobante_detalle where enco_consec = :consec;
    delete from comprobante_encabezado where enco_tiporef = 27 and enco_idref = old.plpr_id;
    INSERT INTO AUDITORIA (AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
        VALUES (USER, 27, new.plpr_id, 'A', NEW.plpr_pref || NEW.plpr_numero);
    end

if ((new.plpr_id <> 0) and (new.plpr_anulado = 'N')) then
    BEGIN
    INSERT INTO AUDITORIA (AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
        VALUES (USER, 27, new.plpr_id, 'U', NEW.plpr_pref || NEW.plpr_numero);
    END
/* si cambia fecha o numero actualice los detalles */
if ((OLD.plpr_pref <> NEW.plpr_pref) or
    (OLD.plpr_numero <> NEW.plpr_numero) or
    (OLD.plpr_fecini <> NEW.plpr_fecini)) then
    BEGIN
    UPDATE plan_produccion_det SET PLPD_TRANSMIT = 'N' WHERE PLPR_ID = NEW.plpr_id;
    UPDATE plan_produccion_cons SET PLPC_TRANSMIT = 'N' WHERE PLPD_ID = NEW.plpr_id;
    END
/* actualice los anulados y trasmitidos */
if (OLD.plpr_anulado <> NEW.plpr_anulado) then
    BEGIN
    UPDATE plan_produccion_det SET PLPD_ANULADO = NEW.plpr_anulado WHERE PLPR_ID = NEW.plpr_id;
    UPDATE plan_produccion_cons SET PLPC_ANULADO = NEW.plpr_anulado WHERE PLPD_ID = NEW.plpr_id;
    END
if (OLD.plpr_transmit <> NEW.plpr_transmit) then
    BEGIN
    UPDATE plan_produccion_det SET PLPD_TRANSMIT = NEW.plpr_transmit WHERE PLPR_ID = NEW.plpr_id;
    UPDATE plan_produccion_cons SET PLPC_TRANSMIT = NEW.plpr_transmit WHERE PLPD_ID = NEW.plpr_id;
    END
end
^

SET TERM ; ^


/* 20100102 */
/* REVERSE EL RECIBO DESDE LA BD EN FACTURAS DE CONTADO */

SET TERM ^ ;

CREATE OR ALTER TRIGGER FACTURAS_AI FOR FACTURAS
ACTIVE AFTER INSERT POSITION 0
AS
declare variable CONC VARCHAR(60);
declare variable PEDAUTO CHAR(2);
declare variable DIAS INTEGER;
declare variable NUMERO VARCHAR(6);
declare variable AUTOM CHAR(1);
declare variable NUMROWS INTEGER;
declare variable ESPOS CHAR(1);
declare variable crmeven CHAR(2);
declare variable tipoori integer;
declare variable idori integer;
BEGIN
if ((NEW.FACT_ID <> 0) and (new.fact_anulado = 'N')) then
    BEGIN
    /* actualice el prefijo si se pasaron de una hoja impresa */
    execute procedure lee_configuracion('FACTURACION','FACTURAS','INCREMENTAR NUMERACION AUTOMATICAMENTE EN FACTURAS DE VARIAS HOJAS') returning_values (:pedauto);
    SELECT MIN(AUTO_ESPOS) FROM AUTORIZACIONES WHERE PREF_PRE = NEW.pref_pre INTO :ESPOS;
    if (ESPOS = 'S') then
        PEDAUTO = 'NO';
    if (PEDAUTO = 'SI') then
        BEGIN
        select FORM_NROITEMS from FORMATOS where tido_cod = 31 and pref_pre = new.pref_pre into :dias;
        select count(*) from facturas_detalle where fact_id = new.fact_id into :numrows;
        if (numrows > dias) then
            begin
            SELECT PREF_ACTUAL, PREF_AUTO FROM PREFIJOS WHERE TIDO_COD = 31 AND PREF_PRE = NEW.PREF_PRE INTO :NUMERO, :AUTOM;
            if (AUTOM = 'S' or NUMERO = NEW.fact_numero) then
                BEGIN
                NUMROWS = CAST(NUMERO AS INTEGER) + DIV(numrows,dias);
                NUMERO = CAST(NUMROWS AS CHAR(6));
                update prefijos set pref_actual = :NUMERO WHERE TIDO_COD = 31 AND PREF_PRE = NEW.PREF_PRE;
                END
            end
        END
    /* Registre el nuevo saldo del documento */
    INSERT INTO SALDOS_DOC_CARTERA (SDCA_TIPOREF, SDCA_IDREF, SDCA_FECHA, TERC_NIT, SDCA_RTFTE, SDCA_RTIVA, SDCA_RTICA, SDCA_ABONO, SDCA_ABRTFTE, SDCA_ABRTIVA, SDCA_ABRTICA, SDCA_DEBITO, SDCA_MONTO, SDCA_TRM)
        VALUES (31, NEW.FACT_ID, NEW.FACT_fecha, NEW.terc_nit, NEW.FACT_rtftemonto, NEW.FACT_rtivamonto, NEW.FACT_rticamonto, 0, 0, 0, 0, 'S', NEW.FACT_TOTAL, NEW.fact_trm);
    /* Registre el movimiento del cliente */
    if (STRLEN(NEW.FACT_NOMCLIENTE) > 42) then
        CONC = 'FV No.' || NEW.PREF_PRE || NEW.FACT_NUMERO || '-' || SUBSTR(NEW.FACT_NOMCLIENTE, 1, 42);
    ELSE
        CONC = 'FV No.' || NEW.PREF_PRE || NEW.FACT_NUMERO || '-' || NEW.FACT_NOMCLIENTE;
    INSERT INTO MOVIMIENTO_CLIENTES (MVCL_ID, TERC_NIT, MVCL_TIPOREF, MVCL_IDREF, MVCL_FECHA, MVCL_VENCE, MVCL_CONC, MVCL_MONTO, MVCL_RTEFTE, MVCL_RTEIVA, MVCL_RTEICA, MVCL_DEBITO, MVCL_ABONO, MVCL_PREFREF, MVCL_NUMREF, mvcl_sucursal, COBR_COD, MVCL_TRM)
      VALUES (GEN_ID(ID_MOVCLI, 1), NEW.TERC_NIT, 31, NEW.FACT_ID, NEW.FACT_FECHA, NEW.FACT_VENCE, :CONC, NEW.FACT_TOTAL, NEW.FACT_RTFTEMONTO, NEW.FACT_RTIVAMONTO, NEW.FACT_RTICAMONTO, 'S', 'N', NEW.pref_pre, NEW.FACT_numero, new.fact_sucursal, NEW.cobr_cod, NEW.fact_trm);
    EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION','FACTURAS','GENERAR PEDIDO AUTOMATICAMENTE CON LA FACTURA') RETURNING_VALUES (PEDAUTO);
    if (PEDAUTO = 'SI') then
        BEGIN
        EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION','PEDIDOS','DIAS DE VALIDEZ') RETURNING_VALUES (DIAS);
        INSERT INTO PEDIDOS (PEDI_ID, TERC_NIT, VEND_COD, TIDO_COD, PREF_PRE, PEDI_NUMERO, PEDI_FECHA, PEDI_VALIDEZ, PEDI_DESPACHO, PEDI_OBS, PEDI_IVAINC, PEDI_NOMTERC, PEDI_DTOPOR, PEDI_DTOMONTO, PEDI_ADICIONAL, PEDI_IVAMONTO, PEDI_EXTRA, PEDI_TOTAL, PEDI_ANULADO, PEDI_TRANSMIT, PTVT_ID, PEDI_COTIZACI, PEDI_RTFTEPORC, PEDI_RTFTEMONTO, PEDI_RTIVAPORC, PEDI_RTIVAMONTO, PEDI_RTICAPORC, PEDI_RTICAMONTO, PEDI_SUCURSAL)
            VALUES (GEN_ID(ID_PEDIDO, 1), NEW.TERC_NIT, NEW.VEND_COD, 34, NEW.PREF_PRE, NEW.FACT_NUMERO, NEW.FACT_FECHA, :DIAS, NEW.FACT_DESPACHO, NEW.FACT_OBS, NEW.FACT_IVAINC, NEW.FACT_NOMCLIENTE, NEW.FACT_DTOPOR, NEW.FACT_DTOMONTO, NEW.FACT_ADICIONAL, NEW.FACT_IVAMONTO, NEW.FACT_EXTRA, NEW.FACT_TOTAL, 'N', 'N', NEW.PTVT_ID, NULL, NEW.FACT_RTFTEPOR, NEW.FACT_RTFTEMONTO, NEW.FACT_RTIVAPOR, NEW.FACT_RTIVAMONTO, NEW.FACT_RTICAPOR, NEW.FACT_RTICAMONTO, NEW.fact_sucursal);
        END
    execute procedure lee_configuracion ('CRM', 'EVENTOS', 'GRABAR EVENTOS AUTOMATICAMENTE DESDE DOCUMENTOS DE VENTAS') returning_values (:crmeven);
    if (crmeven = 'SI') then
        begin
        insert into crm_eventos (CREV_TIPO, CREV_ORIGEN, CREV_FECHA, CREV_HORA, CREV_MOTIVO, CREV_ASESOR, CREV_VALOR, CREV_EXPLICA, CREV_OBS, CREV_ACTIVIDAD, CRCL_NIT, CREV_ANULADO)
            VALUES (901, new.fact_id, new.fact_fecha, cast('now' as time), 6, new.vend_cod, new.fact_total, 'Factura No. ' || new.pref_pre || new.fact_numero, new.fact_obs, 0, new.terc_nit, new.fact_anulado);
        end
    if (NEW.fact_consolida <> 0) then
        FOR SELECT C.cefa_tipoori, C.cefa_idori FROM consolide_faltantes C WHERE C.cefa_id = NEW.fact_consolida
        into :tipoori, :idori do
        INSERT INTO notas_documento (NODO_ID, TIDO_COD, NODO_IDDOC, NODO_FECHA, NODO_USER, NODO_RESUMEN, NODO_TIPO)
            VALUES (GEN_ID(id_notadoc, 1), :TIPOORI, :IDORI, NEW.fact_fecha, user, 'Factura No. ' || new.pref_pre || new.fact_numero, 2);
    INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
        VALUES (USER, 31, NEW.fact_id, 'I', NEW.pref_pre || NEW.fact_numero);
    END
END
^

SET TERM ; ^


/* 20100104: PLAN DE PRODUCCION */
ALTER TABLE ARTICULOS_PRODUCTO
ADD ARPR_MERMA T_PORCENTAJE;
ALTER TABLE ARTICULO
ADD ARTI_SOBRANTE T_COD_ARTICULO;
ALTER TABLE ARTICULO
ADD ARTI_PORCSOBR T_PORCENTAJE;

SET TERM ^ ;

CREATE OR ALTER procedure CONSOLIDE_PRODUCCION (
    PLANID integer)
AS
declare variable ITEM INTEGER;
declare variable ARTIC VARCHAR(20);
declare variable CANT NUMERIC(18,4);
declare variable CANTPRO NUMERIC(18,4);
declare variable CODCMP VARCHAR(20);
declare variable CANTCMP NUMERIC(18,4);
declare variable PORCMP NUMERIC(9,4);
declare variable UNDCMP VARCHAR(8);
declare variable FACTOR NUMERIC(18,4);
declare variable PESOCMP NUMERIC(18,4);
declare variable PESO NUMERIC(18,4);
declare variable MERMA NUMERIC(18,4);
declare variable TIPOORD INTEGER;
declare variable NUMROWS INTEGER;
declare variable TOTAL NUMERIC(9,4);
declare variable DESCR VARCHAR(60);
declare variable UNIDAD VARCHAR(8);
begin
ITEM = 0;
FOR SELECT ARTI_COD, PLPD_CANT * PLPD_FACTOR, PLPD_PESO
    from PLAN_PRODUCCION_DET WHERE PLPR_ID = :PLANID
    INTO :ARTIC, :CANTPRO, :PESO
    DO
    BEGIN
    select sum(arpr_porc) from articulos_producto where arti_cod = :artic into :total;
    FOR SELECT arpr_comp, ARPR_CANT, ARPR_UNIDAD, ARPR_PORC, ARTI_UNIDAD, ARTI_DES, arti_peso, arpr_merma
        from articulos_producto AP, ARTICULO A2
        WHERE AP.arpr_comp = A2.arti_cod AND AP.arti_cod = :ARTIC ORDER by ARPR_ITEM
        INTO :codcmp, :cantcmp, :undcmp, :porcmp, :unidad, :descr, :pesocmp, :MERMA
        DO
        BEGIN
/*        EXECUTE PROCEDURE factor_unidad_cant(:codcmp, :undcmp) returning_values (:FACTOR);
        cantcmp = cantcmp * FACTOR;*/
        if (((cantcmp is null) or (cantcmp = 0)) AND (PORCMP IS NOT NULL) AND (porcmp <> 0)) then
            BEGIN
            /* ES PORCENTUAL AL PESO LA MEZCLA SOBRE EL 1ER ARTICULO */
            CANT = cantpro * PESO;
            if ((MERMA IS NOT NULL) AND (MERMA <> 0)) then
                CANT = CANT * (100 + MERMA) / 100;
            CANT = CANT * porcmp / TOTAL; /* APLICA LA PROPORCION */
            CANT = CANT / pesocmp; /* LO LLEVA A LA UNIDAD PRINCIPAL */
            undcmp = unidad;
            END
        ELSE
            BEGIN
            CANT = cantpro * CANTCMP;
            END

        SELECT COUNT(ARTI_COD) FROM articulos_producto WHERE ARTI_COD = :codcmp INTO :NUMROWS;
        if (NUMROWS <> 0) then
           TIPOORD = 19;
        else
            TIPOORD = 24;

        /* INSERTE O ACTUALICE EL COMPONENTE */
        if (NOT EXISTS (SELECT PLPC_ITEM FROM plan_produccion_cons WHERE PLPD_ID = :planid AND ARTI_COD = :codcmp)) then
            BEGIN
            ITEM = ITEM + 1;
            INSERT INTO plan_produccion_cons (PLPD_ID, PLPC_ITEM, PLPC_CODBAR, ARTI_COD, PLPC_CANT, PLPC_UNIDAD, PLPC_EXIST, PLPC_ORDENAR, PLPC_ORDENTIPO, PLPC_ORDENID, PLPC_ANULADO, PLPC_TRANSMIT, PLPC_DESC)
                VALUES (:planid, :item, :codcmp, :codcmp, :cant, :undcmp, 0, 0, :tipoord, 0, 'N', 'N', :descr);
            END
        ELSE
            UPDATE plan_produccion_cons SET PLPC_CANT = PLPC_CANT + :CANT
                WHERE PLPD_ID = :planid AND ARTI_COD = :codcmp;
        END
    END
end
^

SET TERM ; ^


/* 20100105 */
/* ERROR SI ES AUTORETENEDOR NO DEBE DESCONTAR LA RTEFTE */

SET TERM ^ ;

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

SET TERM ; ^

/* NO INCLUIA EL ULTIMO DIA DEL MES, NI AUTORETENEDOR */

SET TERM ^ ;

CREATE OR ALTER procedure CONCILIA_CARTERA (
    FECINI date,
    FECFIN date,
    CTACART varchar(20),
    SUBEMPRESA integer,
    ANTERIOR char(1))
returns (
    NIT varchar(20),
    NOMBRE varchar(60),
    INICIAL numeric(18,2),
    INICIALC numeric(18,2),
    DEBITOS numeric(18,2),
    DEBITOSC numeric(18,2),
    CREDITOS numeric(18,2),
    CREDITOSC numeric(18,2),
    SALDO numeric(18,2),
    SALDOC numeric(18,2),
    DIFERENCIA numeric(18,2))
AS
declare variable ANO CHAR(4);
declare variable MES INTEGER;
declare variable NUMROWS INTEGER;
declare variable ABONOS NUMERIC(18,2);
declare variable TIPODOC INTEGER;
declare variable IDDOC INTEGER;
declare variable RETES CHAR(2);
declare variable AUTORET VARCHAR(10);
declare variable FAUTORET DATE;
BEGIN
EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'FECHA AUTORETENEDOR NO DESCONTAR RETENCIONES DEL SALDO PERO SI CONTABILIZARLAS') returning_values (AUTORET);
if (AUTORET <> '') then
    FAUTORET = CAST(AUTORET AS DATE);
else
    FAUTORET = '9999/12/31';
ano = EXTRACT(YEAR FROM FECFIN);
mes = EXTRACT(MONTH FROM FECFIN);

for select TERC_NIT, TERC_NOM from TERCEROS WHERE TERC_CLIE = 'S' into :NIT, :NOMBRE
    DO
    BEGIN
    /* OMITE LOS CLIENTES DE CONTADO */
    SELECT COUNT(*) FROM AUTORIZACIONES WHERE AUTO_NITCONTADO = :NIT INTO :numrows;
    IF (numrows = 0) THEN
        BEGIN
        FECINI = FECINI - 1;
        INICIAL = 0;
        FOR SELECT MVCL_TIPOREF, MVCL_IDREF FROM MOVIMIENTO_CLIENTES
            WHERE TERC_NIT = :NIT AND MVCL_FECHA <= :FECINI AND
            MVCL_ABONO = 'N' AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA))
            INTO :TIPODOC, :IDDOC
            DO
            BEGIN
            EXECUTE PROCEDURE saldo_doc_cartera(TIPODOC, IDDOC, FECINI, 0) returning_values (SALDO);
            INICIAL = INICIAL + SALDO;
            END
        EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'DESCONTAR RETENCIONES POR CAUSACION') returning_values(:RETES);
        FECINI = FECINI + 1;
        if (RETES = 'SI') then
            BEGIN
            if (FAUTORET <= FECINI) then
                begin
                SELECT SUM(MVCL_MONTO-MVCL_RTEIVA-MVCL_RTEICA) FROM movimiento_clientes
                    WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND MVCL_FECHA <= :FECFIN
                    AND MVCL_DEBITO = 'S' AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA))
                    INTO :DEBITOS;
                SELECT SUM(MVCL_MONTO-MVCL_RTEIVA-MVCL_RTEICA) FROM movimiento_clientes
                    WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND MVCL_FECHA <= :FECFIN
                    AND MVCL_DEBITO = 'N' AND MVCL_ABONO = 'N' and MVCL_TIPOREF <> 45 AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA))
                    INTO :CREDITOS;
                end
            else
                begin
                SELECT SUM(MVCL_MONTO-MVCL_RTEFTE-MVCL_RTEIVA-MVCL_RTEICA) FROM movimiento_clientes
                    WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND MVCL_FECHA <= :FECFIN
                    AND MVCL_DEBITO = 'S' AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA))
                    INTO :DEBITOS;
                SELECT SUM(MVCL_MONTO-MVCL_RTEFTE-MVCL_RTEIVA-MVCL_RTEICA) FROM movimiento_clientes
                    WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND MVCL_FECHA <= :FECFIN
                    AND MVCL_DEBITO = 'N' AND MVCL_ABONO = 'N' and MVCL_TIPOREF <> 45 AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA))
                    INTO :CREDITOS;
                end
            SELECT SUM(MVCL_MONTO) FROM movimiento_clientes
                WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND MVCL_FECHA <= :FECFIN
                AND MVCL_ABONO = 'S' AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA))
                INTO :ABONOS;
            END
        ELSE
            BEGIN
            SELECT SUM(MVCL_MONTO) FROM movimiento_clientes
                WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND MVCL_FECHA <= :FECFIN
                AND MVCL_DEBITO = 'S' AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA))
                INTO :DEBITOS;
            SELECT SUM(MVCL_MONTO) FROM movimiento_clientes
                WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND MVCL_FECHA <= :FECFIN
                AND MVCL_DEBITO = 'N' AND MVCL_ABONO = 'N' and MVCL_TIPOREF <> 45 AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA))
                INTO :CREDITOS;
            SELECT SUM(MVCL_MONTO+MVCL_RTEFTE+MVCL_RTEIVA+MVCL_RTEICA) FROM movimiento_clientes
                WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND MVCL_FECHA <= :FECFIN
                AND MVCL_ABONO = 'S' AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA))
                INTO :ABONOS;
            END
        if (DEBITOS IS NULL) then
            DEBITOS = 0;
        if (CREDITOS IS NULL) then
            CREDITOS = 0;
        if (ABONOS IS NULL) then
            ABONOS = 0;
        CREDITOS = CREDITOS + ABONOS;
        SALDO = INICIAL + DEBITOS - CREDITOS;

        /* LO CONTABLE */
        EXECUTE PROCEDURE SALDO_TERCERO_MES(ctacart, NIT, ANO, MES, 'S') RETURNING_VALUES (INICIALC);
        EXECUTE PROCEDURE MOVIMIENTO_TERCERO_MES(ctacart, NIT, ANO, MES, 'S') RETURNING_VALUES(DEBITOSC);
        EXECUTE PROCEDURE MOVIMIENTO_TERCERO_MES(ctacart, NIT, ANO, MES, 'N') RETURNING_VALUES(CREDITOSC);
        SALDOC = INICIALC + DEBITOSC - CREDITOSC;
        diferencia = SALDO - SALDOC;
        if (DIFERENCIA <> 0) then
            BEGIN
            if (ANTERIOR <> 'S') then
                SUSPEND;
            ELSE
                BEGIN
                if (DIFERENCIA <> (INICIAL - INICIALC)) then
                    SUSPEND;
                END
            END
        END
    END
end
^

SET TERM ; ^


/* 20100105B */
/* IMPRIMA SIEMPRE EL TOTAL SIN IMPUESTOS YA EXISTEN LOS DATOS MAS IVA Y MAS CONSUMO */

SET TERM ^ ;

CREATE OR ALTER procedure IMPR_ENTRADA (
    ID integer)
returns (
    PREF varchar(4),
    NUMERO varchar(6),
    FECHA date,
    CONCEPTO varchar(60),
    REFER varchar(60),
    CODBODEGA varchar(2),
    NOMBODEGA varchar(30),
    NOMTERCERO varchar(60),
    OBS blob sub_type 1 segment size 80,
    ITEM integer,
    ARTICULO varchar(15),
    CODBAR varchar(15),
    ARTIDES varchar(60),
    CANT numeric(18,4),
    UNIDAD varchar(8),
    BODITEM varchar(2),
    STAND varchar(20),
    COSTO numeric(18,2),
    DTOPORC numeric(9,2),
    DTOMONTO numeric(18,2),
    IVAPORC numeric(9,2),
    IVAMONTO numeric(18,2),
    CONSUMO numeric(18,2),
    TOTAL numeric(18,2),
    PRECIO numeric(18,2),
    LOTE varchar(15),
    PESOUNIT numeric(18,4),
    PESOTOT numeric(18,4),
    VOLUMUNIT numeric(18,4),
    VOLUMTOT numeric(18,4),
    TOTALDOC numeric(18,2),
    CONSUMODOC numeric(18,2),
    TOTALMASIMP numeric(18,2))
AS
declare variable IMPTOS CHAR(1);
declare variable LARGO NUMERIC(18,4);
declare variable ANCHO NUMERIC(18,4);
declare variable ALTO NUMERIC(18,4);
declare variable LISTA CHAR(3);
declare variable ICOINC CHAR(2);
BEGIN
  /*  */
  PESOTOT = 0;
  VOLUMTOT = 0;
  SELECT PREF_PRE, ENTR_NUMERO, ENTR_FECHA, ENTR_CONC, ENTR_REFER, E.BODE_COD, BODE_NOM, ENTR_NOMTERC, ENTR_IMPTOS, ENTR_OBS
    FROM ENTRADAS E, BODEGA B
    WHERE E.BODE_COD = B.BODE_COD AND E.ENTR_ID = :ID
    into :PREF, :NUMERO, :FECHA, :CONCEPTO, :REFER, :CODBODEGA, :NOMBODEGA, :NOMTERCERO, :IMPTOS, :OBS;
  SELECT SUM(ENDE_TOTAL), SUM(ENDE_IVAMONTO), SUM(ENDE_CONSUMO*ENDE_CANT*ENDE_FACTOR) FROM ENTRADAS_DETALLE
    WHERE ENTR_ID = :ID INTO :TOTALDOC, :IVAMONTO, :CONSUMODOC;
  TOTALDOC = TOTALDOC - IVAMONTO;
  EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION','ARTICULOS','IMPOCONSUMO INCLUIDO EN EL PRECIO BASE DE VENTA ANTES DE IVA') returning_values (:ICOINC);
  if (ICOINC <> 'SI') then
      TOTALMASIMP = TOTALDOC + CONSUMODOC;
  FOR SELECT ENDE_ITEM, A.ARTI_COD, ENDE_CODBAR, SUBSTR(ENDE_DESC,1,60), ENDE_CANT, ENDE_UNIDAD, BODE_COD, ENDE_COSTO, ENDE_DTOPORC, ENDE_DTOMONTO, ENDE_IVAPORC, ENDE_IVAMONTO, ENDE_CONSUMO, ENDE_TOTAL, ENDE_LOTE,
    (ARTI_PESO / 1000 * ENDE_CANT * ENDE_FACTOR), (ARTI_LARGO / 100 * ENDE_FACTOR), (ARTI_ANCHO / 100 * ENDE_FACTOR), (ARTI_ALTO / 100 * ENDE_FACTOR)
    FROM ENTRADAS_DETALLE D, ARTICULO A
    WHERE D.ARTI_COD = A.ARTI_COD AND D.ENTR_ID = :ID
    ORDER BY ENDE_ITEM
    INTO :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :BODITEM, :COSTO, :DTOPORC, :DTOMONTO, :IVAPORC, :IVAMONTO, :CONSUMO, :TOTAL, :LOTE, :PESOUNIT, :LARGO, :ANCHO, :ALTO
    DO
      BEGIN
      EXECUTE PROCEDURE LEE_CONFIGURACION('INVENTARIO','DOCUMENTOS','CODIGO DE LISTA DE PRECIOS A IMPRIMIR EN DOCUMENTOS') returning_values (:LISTA);
      if (NOT lista IS NULL) then
          SELECT PRAR_FIJO FROM PRECIOS_ARTICULO WHERE ARTI_COD = :articulo AND LIPR_COD = :LISTA INTO :PRECIO;
      if (PESOUNIT IS NULL) then
        PESOUNIT = 0;
      PESOTOT = PESOTOT + PESOUNIT;
      VOLUMUNIT = ANCHO * ALTO * LARGO;
      volumunit = VOLUMUNIT * CANT;
      if (VOLUMUNIT IS NULL) then
        VOLUMUNIT = 0;
      VOLUMTOT = VOLUMTOT + VOLUMUNIT;
      TOTAL = TOTAL - IVAMONTO;
      SELECT STAND_COD FROM STANDS WHERE ARTI_COD = :ARTICULO AND STAND_BODEGA = :boditem INTO :stand;
      SUSPEND;
      END
END
^

SET TERM ; ^


SET TERM ^ ;

CREATE OR ALTER procedure IMPR_SALIDA (
    ID integer)
returns (
    PREF varchar(4),
    NUMERO varchar(6),
    FECHA date,
    CONCEPTO varchar(60),
    REFER varchar(60),
    CODBODEGA varchar(2),
    NOMBODEGA varchar(30),
    NOMTERCERO varchar(60),
    OBS blob sub_type 0 segment size 80,
    ITEM integer,
    ARTICULO varchar(15),
    CODBAR varchar(15),
    ARTIDES varchar(60),
    CANT numeric(18,4),
    UNIDAD varchar(8),
    BODITEM varchar(2),
    STAND varchar(20),
    COSTO numeric(18,2),
    IVAPORC numeric(9,2),
    IVAMONTO numeric(18,2),
    CONSUMO numeric(18,2),
    TOTAL numeric(18,2),
    TOTALITEM numeric(18,2),
    PRECIO numeric(18,2),
    LOTE varchar(15),
    PESOUNIT numeric(18,4),
    PESOTOT numeric(18,4),
    VOLUMUNIT numeric(18,4),
    VOLUMTOT numeric(18,4),
    TOTALDOC numeric(18,2),
    ULTIMO numeric(18,2),
    TOTALULT numeric(18,2),
    CONSUMODOC numeric(18,2),
    TOTALMASIMP numeric(18,2))
AS
declare variable IMPTOS CHAR(1);
declare variable LARGO NUMERIC(18,4);
declare variable ANCHO NUMERIC(18,4);
declare variable ALTO NUMERIC(18,4);
declare variable LISTA CHAR(3);
declare variable ICOINC CHAR(2);
BEGIN
  PESOTOT = 0;
  VOLUMTOT = 0;
  SELECT PREF_PRE, SALI_NUMERO, SALI_FECHA, SALI_CONC, SALI_REFER, S.BODE_COD, BODE_NOM, SALI_NOMTERC, SALI_IMPTOS, SALI_OBS
    FROM SALIDAS S, BODEGA B WHERE S.BODE_COD = B.BODE_COD AND S.SALI_ID = :ID into
    :PREF, :NUMERO, :FECHA, :CONCEPTO, :REFER, :CODBODEGA, :NOMBODEGA, :NOMTERCERO, :IMPTOS, :OBS;
  SELECT SUM(SADE_TOTAL), SUM(SADE_IVAMONTO), SUM(SADE_CONSUMO*SADE_CANT*SADE_FACTOR) FROM SALIDAS_DETALLE
    WHERE SALI_ID = :ID INTO :TOTALDOC, :IVAMONTO, :CONSUMODOC;
  TOTALDOC = TOTALDOC - IVAMONTO;
  EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION','ARTICULOS','IMPOCONSUMO INCLUIDO EN EL PRECIO BASE DE VENTA ANTES DE IVA') returning_values (:ICOINC);
  if (ICOINC <> 'SI') then
      TOTALMASIMP = TOTALDOC + CONSUMODOC;
  FOR SELECT SADE_ITEM, A.ARTI_COD, SADE_CODBAR, SADE_DESC, SADE_CANT, SADE_UNIDAD, BODE_COD, SADE_COSTO, SADE_IVAPORC, SADE_IVAMONTO, SADE_CONSUMO, SADE_TOTAL, SADE_LOTE,
    (ARTI_PESO / 1000 * SADE_CANT * SADE_FACTOR), (ARTI_LARGO / 100 * SADE_FACTOR), (ARTI_ANCHO / 100 * SADE_FACTOR), (ARTI_ALTO / 100 * SADE_FACTOR)
    FROM SALIDAS_DETALLE D, ARTICULO A
    WHERE D.ARTI_COD = A.ARTI_COD AND D.SALI_ID = :ID
    ORDER BY SADE_ITEM
    INTO :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :BODITEM, :COSTO, :IVAPORC, :IVAMONTO, :CONSUMO, :TOTAL, :LOTE, :PESOUNIT, :LARGO, :ANCHO, :ALTO
    DO
      BEGIN
      EXECUTE PROCEDURE LEE_CONFIGURACION('INVENTARIO','DOCUMENTOS','CODIGO DE LISTA DE PRECIOS A IMPRIMIR EN DOCUMENTOS') returning_values (:LISTA);
      if (NOT lista IS NULL) then
          SELECT PRAR_FIJO FROM PRECIOS_ARTICULO WHERE ARTI_COD = :articulo AND LIPR_COD = :LISTA INTO :PRECIO;
      EXECUTE PROCEDURE ultimo_costo(:articulo, :fecha,  :unidad) returning_values (:ultimo);
      TOTALULT = CANT * ULTIMO;
      TOTALITEM = COSTO + IVAMONTO + CONSUMO;
      TOTAL = TOTAL - IVAMONTO;
      if (PESOUNIT IS NULL) then
        PESOUNIT = 0;
      PESOTOT = PESOTOT + PESOUNIT;
      VOLUMUNIT = ANCHO * ALTO * LARGO;
      volumunit = VOLUMUNIT * CANT;
      if (VOLUMUNIT IS NULL) then
        VOLUMUNIT = 0;
      VOLUMTOT = VOLUMTOT + VOLUMUNIT;
      SELECT STAND_COD FROM STANDS WHERE ARTI_COD = :ARTICULO AND STAND_BODEGA = :boditem INTO :stand;
      SUSPEND;
      END
END
^

SET TERM ; ^

SET TERM ^ ;

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

SET TERM ; ^


/* 20100106 */
/* ASEGURECE QUE EL NOMBRE DEL GRUPO EMPIECE VACIO */
SET TERM ^ ;

CREATE OR ALTER procedure REP_CARTERA_NOTAS (
    DESDE varchar(20),
    HASTA varchar(20),
    GRPINI varchar(5),
    GRPFIN varchar(5),
    FECHA date,
    ORDEN char(1),
    AGRUPA char(1),
    SUBEMPRESA integer,
    VENCEINI date,
    VENCEFIN date,
    GRUPCART integer,
    MONEDA integer)
returns (
    NIT varchar(20),
    NOMBRE varchar(60),
    TELEFONO varchar(40),
    CIUDAD varchar(40),
    CODZONA varchar(2),
    NOMZONA varchar(60),
    CODCOBR integer,
    NOMCOBR varchar(60),
    SUCURSAL varchar(10),
    DV char(1),
    CODCIUD char(5),
    NOMCIUD varchar(60),
    SALDO numeric(18,2),
    NOTA1 varchar(256),
    NOTA2 varchar(256),
    CUPO numeric(18,2),
    DISPONIBLE numeric(18,2),
    PROVISIONAL numeric(18,2),
    CONTACTO varchar(60),
    ESTADO char(1),
    GRUPCOD integer,
    GRUPNOM varchar(30))
AS
declare variable NITINI VARCHAR(20);
declare variable NITFIN VARCHAR(20);
declare variable NOMINI VARCHAR(20);
declare variable NOMFIN VARCHAR(20);
declare variable OK CHAR(1);
declare variable PSALDO NUMERIC(18,2);
declare variable TIPO INTEGER;
declare variable ID INTEGER;
declare variable NOTA VARCHAR(277);
declare variable TIPODOC VARCHAR(8);
declare variable NUMDOC VARCHAR(10);
declare variable FECNOTA VARCHAR(10);
declare variable I INTEGER;
declare variable INCLANTI CHAR(2);
declare variable TRM NUMERIC(18,2);
BEGIN
if (ORDEN = 'C') then
    BEGIN
    NITINI = DESDE;
    NITFIN = HASTA;
    NOMINI = '';
    NOMFIN = 'zz';
    END
ELSE
    BEGIN
    NOMINI = DESDE;
    NOMFIN = HASTA;
    NITINI = '';
    NITFIN = 'zz';
    END
  EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'INCLUIR ANTICIPOS DE CLIENTES EN REPORTES Y CONSULTAS DE CARTERA') returning_values (INCLANTI);
  /* Ubique el NIT */
  FOR select T.TERC_NIT, CLSU_NOMBRE, TERC_DV, CLSU_TEL, CLSU_CIUDAD, TERC_CONTACTO, S.COBR_COD, S.ZONA_COD, CIUD_COD, CLIE_CUPO, CLIE_ESTADO, CLCU_COD, C.GRCA_COD
    from terceros T, CLIENTES C, CLIENTE_SUCURSALES S
    where C.TERC_NIT = T.TERC_NIT AND TERC_CLIE = 'S' AND S.TERC_NIT = C.TERC_NIT AND T.TERC_NIT >= :NITINI AND T.TERC_NIT <= :NITFIN AND
        TERC_NOM >= :NOMINI AND TERC_NOM <= :NOMFIN AND ((:GRUPCART = 0) or (C.GRCA_COD = :GRUPCART))
    INTO :NIT, :NOMBRE, :DV, :TELEFONO, :CIUDAD, :CONTACTO, :CODCOBR, :CODZONA, :CODCIUD, :CUPO, :ESTADO, :SUCURSAL, :GRUPCOD
    DO  
    BEGIN
    GRUPNOM = '';
    SELECT GRCA_NOMBRE FROM GRUPO_CARTERA WHERE GRCA_COD = :GRUPCOD INTO :GRUPNOM;
    OK = 'N';
    if (AGRUPA = 'Z') then
        BEGIN
        if (GRPINI = '') then
            BEGIN
            if ((CODZONA IS NULL) or (CODZONA >= :GRPINI AND CODZONA <= :GRPFIN)) then
                OK = 'S';
            END
        ELSE
            if (CODZONA >= :GRPINI AND CODZONA <= :GRPFIN) then
                OK = 'S';
        END
    if (AGRUPA = 'I') then
        BEGIN
        if (GRPINI = '') then
            BEGIN
            if ((CODCIUD IS NULL) or (CODCIUD >= :GRPINI AND CODCIUD <= :GRPFIN)) then
                OK = 'S';
            END
        ELSE
            if (CODCIUD >= :GRPINI AND CODCIUD <= :GRPFIN) then
                OK = 'S';
        END
    if (AGRUPA = 'N') then
        OK = 'S';
        
    if (OK = 'S') then
        BEGIN
        if (CODCOBR IS NOT NULL) then
            SELECT COBR_NOM FROM COBRADORES  WHERE COBR_COD = :CODCOBR INTO :NOMCOBR;
        if (CODZONA IS NOT NULL) then
            SELECT ZONA_NOM FROM ZONAS WHERE ZONA_COD = :CODZONA INTO :NOMZONA;
        if (CODCIUD IS NOT NULL) then
            SELECT CIUD_NOM FROM CIUDADES  WHERE CIUD_COD = :CODCIUD INTO :NOMCIUD;
    
        SALDO = 0;
        /* BUSQUE EN SALDOS_DOC_CARTERA LOS QUE TENGAN SALDO > 0 */
        FOR SELECT MVCL_TIPOREF, MVCL_IDREF
          FROM MOVIMIENTO_CLIENTES WHERE TERC_NIT = :NIT AND MVCL_SUCURSAL = :SUCURSAL AND MVCL_FECHA <= :FECHA AND
          MVCL_ABONO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) AND MVCL_VENCE >= :VENCEINI AND
          MVCL_VENCE <= :VENCEFIN AND ((:MONEDA = 0) or (MVCL_TRM <> 1))
          INTO :TIPO, :ID
          DO
            if ((inclanti = 'SI') or (TIPO <> 45)) then
                BEGIN
                EXECUTE PROCEDURE saldo_doc_cartera(TIPO, ID, FECHA, MONEDA) returning_values (PSALDO);
                if (PSALDO <> 0) then
                    SALDO = SALDO + PSALDO;
                END
        DISPONIBLE = CUPO - SALDO;
        /* LOS RECIBOS PROVISIONALES */
        SELECT SUM(RPDE_ABONO), MAX(RCPR_TRM) FROM RECIBO_PROVISIONAL P, recibo_provisional_detalle D
            WHERE P.rcpr_id = D.rcpr_id AND TERC_NIT = :NIT AND RPDE_SUCURSAL = :SUCURSAL AND ((:MONEDA = 0) or (RCPR_TRM <> 1)) AND
            RCPR_FECHA <= :FECHA AND RCPR_ANULADO = 'N' AND ((RCPR_FECCRUCE IS NULL) or (RCPR_FECCRUCE > :FECHA)) AND
            ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            INTO :provisional, :TRM;
        if ((MONEDA <> 0) AND (TRM <> 0)) then
            PROVISIONAL = PROVISIONAL / TRM;
        /* LAS NOTAS DE CLIENTES */
        I = 0;
        NOTA1 = '';
        NOTA2 = '';
        FOR SELECT CAST(NOCL_FECHA AS VARCHAR(10)), tido_nomcorto, NOCL_NUMDOC, NOCL_TEXTO
            FROM NOTAS_CLIENTES N, TIPO_DOCUMENTO T WHERE N.NOCL_TIPODOC = T.TIDO_COD AND TERC_NIT = :NIT
            AND N.TINO_COD = 3 AND N.CLSU_COD = :SUCURSAL
            ORDER BY NOCL_ID DESC INTO :FECNOTA, :TIPODOC, :NUMDOC, :NOTA
            DO
            BEGIN
            if (I = 0) then
                NOTA1 = NOTA;
            if (I = 1) then
                NOTA2 = NOTA;
            I = I + 1;
            END
        SUSPEND;
        END
    if (AGRUPA = 'C') then
        BEGIN
        if (CODZONA IS NOT NULL) then
            SELECT ZONA_NOM FROM ZONAS WHERE ZONA_COD = :CODZONA INTO :NOMZONA;
        if (CODCIUD IS NOT NULL) then
            SELECT CIUD_NOM FROM CIUDADES  WHERE CIUD_COD = :CODCIUD INTO :NOMCIUD;
        FOR SELECT DISTINCT COBR_COD FROM MOVIMIENTO_CLIENTES WHERE TERC_NIT = :NIT AND
            MVCL_SUCURSAL = :SUCURSAL AND MVCL_FECHA <= :FECHA AND
            MVCL_ABONO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) AND MVCL_VENCE >= :VENCEINI AND MVCL_VENCE <= :VENCEFIN
            INTO :codcobr
            DO
            begin
            OK = 'N';
            if (GRPINI = '') then
                BEGIN
                if ((CODCOBR IS NULL) or (CODCOBR >= :GRPINI AND CODCOBR <= :GRPFIN)) then
                    OK = 'S';
                END
            ELSE
                if (CODCOBR >= :GRPINI AND CODCOBR <= :GRPFIN) then
                    OK = 'S';
            if (OK = 'S') then
                BEGIN
                SELECT COBR_NOM FROM COBRADORES  WHERE COBR_COD = :CODCOBR INTO :NOMCOBR;

                SALDO = 0;
                /* BUSQUE EN SALDOS_DOC_CARTERA LOS QUE TENGAN SALDO > 0 */
                FOR SELECT MVCL_TIPOREF, MVCL_IDREF
                  FROM MOVIMIENTO_CLIENTES WHERE TERC_NIT = :NIT AND MVCL_SUCURSAL = :SUCURSAL AND
                  MVCL_FECHA <= :FECHA AND COBR_COD = :codcobr AND MVCL_ABONO = 'N' AND
                  ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) AND MVCL_VENCE >= :VENCEINI AND
                  MVCL_VENCE <= :VENCEFIN AND ((:MONEDA = 0) or (MVCL_TRM <> 1))
                  INTO :TIPO, :ID
                  DO
                    if ((inclanti = 'SI') or (TIPO <> 45)) then
                        BEGIN
                        EXECUTE PROCEDURE saldo_doc_cartera(TIPO, ID, FECHA, MONEDA) returning_values (PSALDO);
                        if (PSALDO <> 0) then
                            BEGIN
                            SALDO = SALDO + PSALDO;
                            END
                        END
                DISPONIBLE = CUPO - SALDO;
                /* LOS RECIBOS PROVISIONALES */
                SELECT SUM(RPDE_ABONO), MAX(RCPR_TRM) FROM RECIBO_PROVISIONAL P, recibo_provisional_detalle D
                    WHERE P.rcpr_id = D.rcpr_id AND TERC_NIT = :NIT AND RPDE_SUCURSAL = :SUCURSAL AND ((:MONEDA = 0) or (RCPR_TRM <> 1)) AND
                    VEND_COD = :CODCOBR AND RCPR_FECHA <= :FECHA AND RCPR_ANULADO = 'N' AND ((RCPR_FECCRUCE IS NULL) or (RCPR_FECCRUCE > :FECHA)) AND
                    ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                    INTO :provisional, :TRM;
                if ((MONEDA <> 0) AND (TRM <> 0)) then
                    PROVISIONAL = PROVISIONAL / TRM;
                /* LAS NOTAS DE CLIENTES */
                I = 0;
                NOTA1 = '';
                NOTA2 = '';
                FOR SELECT CAST(NOCL_FECHA AS VARCHAR(10)), tido_nomcorto, NOCL_NUMDOC, NOCL_TEXTO
                    FROM NOTAS_CLIENTES N, TIPO_DOCUMENTO T WHERE N.NOCL_TIPODOC = T.TIDO_COD AND TERC_NIT = :NIT
                    AND N.TINO_COD = 3 AND N.CLSU_COD = :SUCURSAL
                    ORDER BY NOCL_FECHA DESC INTO :FECNOTA, :TIPODOC, :NUMDOC, :NOTA
                    DO
                    BEGIN
                    if (I = 0) then
                        NOTA1 = NOTA;
                    if (I = 1) then
                        NOTA2 = NOTA;
                    I = I + 1;
                    END
                SUSPEND;
                END  /* OK = S */
            END  /* FOR COBRADOR */
        END  /* AGRUPA = C */
    END  /* FOR NIT */
END
^

SET TERM ; ^



/* 20100106B */
/* PROMOCIONES CON UNIDADES A CERO PESOS POR GRUPO Y SUBGRUPO */
INSERT INTO CONFIGURACION (CONF_MODULO, CONF_CATEGORIA, CONF_PROPIEDAD, CONF_VALOR, CONF_POSIBLES, CONF_AYUDA) VALUES ('FACTURACION', 'FACTURAS', 'GRUPO DE ARTICULOS CON PROMOCIONES AUTOMATICAS DE UNIDADES GRATIS', '', '', 'Indique el código del grupo de mercancía al que pertenecen los artículos con promociones de unidades gratis por cada CANTMIN unidades');
INSERT INTO CONFIGURACION (CONF_MODULO, CONF_CATEGORIA, CONF_PROPIEDAD, CONF_VALOR, CONF_POSIBLES, CONF_AYUDA) VALUES ('FACTURACION', 'FACTURAS', 'SUBGRUPO DE ARTICULOS CON PROMOCIONES AUTOMATICAS DE UNIDADES GRATIS', '', '', 'Indique el código del subgrupo de mercancía al que pertenecen los artículos con promociones de unidades gratis por cada CANTMIN unidades');
COMMIT WORK;



/* 20100106C */
/* ENSAMBLE AUTOMATICO CON PROCENTAJE COMO BASE */
SET TERM ^ ;

CREATE OR ALTER TRIGGER MOVIMIENTO_ARTICULO_BI FOR MOVIMIENTO_ARTICULO
ACTIVE BEFORE INSERT POSITION 0
AS
declare variable LOTE CHAR(1);
declare variable ENSAMBLE CHAR(1);
declare variable IDENS INTEGER;
declare variable PREFENS VARCHAR(4);
declare variable unidad varchar(8);
declare variable DESCR varchar(60);
declare variable CODPR varchar(8);
declare variable DESPR varchar(60);
declare variable UNIPR varchar(8);
declare variable CANTPR numeric(18,4);
declare variable FACTOR numeric(18,4);
declare variable COSTO numeric(18,2);
declare variable COSTOTOT numeric(18,2);
declare variable PORCPR numeric(9,4);
declare variable MERMAPR numeric(9,4);
declare variable PESO numeric(18,4);
declare variable PESOPR numeric(18,4);
declare variable ITEM INTEGER;
declare variable IVA NUMERIC(9,4);
declare variable IVAM NUMERIC(18,2);
declare variable CONSUMO NUMERIC(18,2);
declare variable TOTAL NUMERIC(9,4);
BEGIN
/* INSERTE EL NUEVO LOTE */
SELECT ARTI_EXIST
    FROM   ARTICULO
    WHERE  ARTICULO.ARTI_COD = NEW.ARTI_COD
    INTO :LOTE;
if (LOTE = 'L') then
    BEGIN
      if ((NEW.mvar_lote IS NULL) or (NEW.mvar_lote = '')) then
        if (new.mvar_entrada = 'S') then
            new.mvar_lote = cast(new.mvar_cons as varchar(15));
        else
            begin
            /* NO HAY LOTE, ENTONCES CALCULELO SEGUN CONFIGURACION */
            EXCEPTION LOTE_NEGATIVO 'No se indicó un lote para el artículo ' || new.arti_cod;
            end
    END
/* ENSAMBLE EL PRODUCTO */
SELECT ARTI_ENSAMBLE, ARTI_UNIDAD, ARTI_DES, ARTI_PESO
    FROM ARTICULO WHERE ARTI_COD = NEW.arti_cod INTO :ensamble, :unidad, :descr, :peso;
if ((NEW.mvar_entrada = 'N') AND (ENSAMBLE = 'S')) then
    BEGIN
    IDENS = gen_id(id_ensamble, 1);
    EXECUTE PROCEDURE lee_configuracion('INVENTARIO', 'ENSAMBLES', 'PREFIJO PARA ENSAMBLES AUTOMATICOS AL SACAR PRODUCTOS') returning_values (:prefens);
    INSERT INTO ENSAMBLES(ENSA_ID, TIDO_COD, PREF_PRE, BODE_COD, ENSA_NUMERO, ENSA_FECHA, ENSA_CONC, ENSA_REFER, ENSA_CANT, ENSA_UNIDAD, ENSA_FACTOR, ENSA_ANULADO, ENSA_TRANSMIT,
        ARTI_COD, ENSA_DESC, ENSA_CODBAR, ENSA_LOTE, ENSA_OBS, TERC_NIT, ENSA_USUARIO, NUMOK, ENSA_COSTO, LOTE_VENCE, ENSA_CODRETAL, ENSA_CANTRETAL, ENSA_OPER, ENSA_MAQUINA, ENSA_PESO, ENSA_BODRETAL, ENSA_TIPOREF, ENSA_IDREF)
        VALUES (:IDENS, 15, :prefens, NEW.bode_cod, '000001', new.mvar_fecha, new.mvar_conc, '', new.mvar_cant, :unidad, 1, 'N', 'N',
        NEW.arti_cod, :descr, NEW.arti_cod, NEW.mvar_lote, NULL, NULL, USER, 'N', NEW.mvar_costo, NULL, NULL, 0, null,  NULL, 0, NEW.bode_cod, NEW.mvar_tipodoc, NEW.mvar_idref);
    ITEM = 0;
    COSTOTOT = 0;
    select sum(arpr_porc) from articulos_producto where arti_cod = NEW.arti_cod into :total;
    FOR SELECT ARPR_CANT, ARPR_UNIDAD, ARPR_COMP, ARTI_DES, TAIV_PORC, ARTI_CONSUMO, ARPR_PORC, ARPR_MERMA, ARTI_PESO
        FROM articulos_producto P, ARTICULO A, TARIFA_IVA T
        WHERE P.ARTI_COD = NEW.arti_cod AND A.arti_cod = P.arpr_comp AND A.taiv_cod = T.taiv_cod
        INTO :CANTPR, :UNIPR, :CODPR, :DESPR, :IVA, :CONSUMO, :PORCPR, :MERMAPR, :PESOPR
        DO
        BEGIN
        ITEM = ITEM + 1;
        EXECUTE PROCEDURE costo_promedio_unidad (:codpr, NEW.mvar_fecha, :UNIPR) returning_values (:COSTO);
        IVAM = costo * cantpr * iva / 100;
        if (((cantpr is null) or (cantpr = 0)) AND (porcpr IS NOT NULL) AND (porcpr <> 0)) then
            BEGIN
            /* ES PORCENTUAL AL PESO LA MEZCLA SOBRE EL 1ER ARTICULO */
            CANTPR = NEW.mvar_cant * PESO;
            if ((mermapr IS NOT NULL) AND (mermapr <> 0)) then
                CANTPR = CANTPR * (100 + mermapr) / 100;
            CANTPR = CANTPR * porcpr / TOTAL; /* APLICA LA PROPORCION */
/*            CANTPR = CANTPR / pesopr; /* LO LLEVA A LA UNIDAD PRINCIPAL */
            UNIPR = 'GRAMO';
            END
        ELSE
            BEGIN
            CANTPR = CANTPR * NEW.MVAR_CANT;
            END
        COSTOTOT = COSTOTOT + COSTO * CANTPR;
        INSERT INTO ENSAMBLES_DETALLE(ENSA_ID, ESDE_ITEM, ARTI_COD, BODE_COD, ESDE_CANT, ESDE_UNIDAD, ESDE_COSTO, ESDE_LOTE, ESDE_FACTOR, ESDE_IVAPORC, ESDE_IVAMONTO, ESDE_CONSUMO, ESDE_CODBAR, ESDE_ANULADO, ESDE_TRANSMIT, ESDE_DESC, ESDE_TOTAL, ESDE_PESO)
            VALUES (:idens, :ITEM, :codpr,  NEW.bode_cod, :cantpr, :unipr, :costo, NULL, :FACTOR, :IVA, :ivam, :consumo, :codpr, 'N', 'N', :despr, :COSTO * :cantpr, 0);
        END
    UPDATE ENSAMBLES SET ENSA_COSTO = :costotot WHERE ENSA_ID = :idens;
    END
if (new.mvar_cons is null) then
    NEW.mvar_cons = GEN_ID(ID_MOVARTI,1);
END
^

SET TERM ; ^


/* 20100107 */
/* ivamonto en devoluciones siempre en cero */
SET TERM ^ ;

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

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

SET TERM ; ^



/* 20100109 */
/* SOLO RESUMEN POR GRUPO COMO REPORTE DIRECTO */
SET TERM ^ ;

CREATE OR ALTER procedure REP_UTILIDAD_VENTAS (
    TIPO integer,
    DETALLE char(1),
    FECINI date,
    FECFIN date,
    ARTINI varchar(15),
    ARTFIN varchar(15),
    GRPINI varchar(3),
    GRPFIN varchar(3),
    ORDEN char(1),
    AGRUPA char(1),
    ULTIMO char(1),
    CEROS char(1),
    SUBEMPRESA integer)
returns (
    ARTICULO varchar(15),
    DESCRIPCION varchar(60),
    CODGRUPO varchar(2),
    NOMGRUPO varchar(30),
    CODSUBG varchar(3),
    NOMSUBG varchar(30),
    CODMARC varchar(3),
    NOMMARC varchar(30),
    UNIDAD varchar(8),
    CANTIDAD numeric(18,4),
    BASE numeric(18,4),
    COSTO numeric(18,4),
    UTILIDAD numeric(18,4),
    PORC numeric(9,2),
    IVA numeric(18,4),
    CONSUMO numeric(18,4),
    PREFIJO varchar(4),
    NUMERO varchar(6),
    FECHA date,
    TIPODOC integer,
    PART float)
AS
DECLARE VARIABLE COSTOUNIT NUMERIC(18,4);
DECLARE VARIABLE CANTDET NUMERIC(18,4);
DECLARE VARIABLE TOTAL NUMERIC(18,2);
declare variable CODINI VARCHAR(15);
declare variable CODFIN VARCHAR(15);
declare variable DESINI VARCHAR(15);
declare variable DESFIN VARCHAR(15);
declare variable MARINI VARCHAR(3);
declare variable MARFIN VARCHAR(3);
declare variable UOM VARCHAR(20);
declare variable ULTCOS NUMERIC(18,2);
declare variable IDREP INTEGER;
BEGIN
if (ORDEN = 'C') then
    BEGIN
    CODINI = ARTINI;
    CODFIN = ARTFIN;
    DESINI = '';
    DESFIN = 'zz';
    END
ELSE
    BEGIN
    DESINI = ARTINI;
    DESFIN = ARTFIN;
    CODINI = '';
    CODFIN = 'zz';
    END
if (AGRUPA = 'G') then
    BEGIN
    MARINI = '';
    MARFIN = 'zz';
    END
ELSE
    if (AGRUPA = 'M') then
        BEGIN
        MARINI = GRPINI;
        MARFIN = GRPFIN;
        GRPINI = '';
        GRPFIN = 'zz';
        END
    ELSE
        BEGIN
        MARINI = '';
        MARFIN = 'zz';
        GRPINI = '';
        GRPFIN = 'zz';
        END
EXECUTE PROCEDURE lee_configuracion ('FACTURACION', 'ARTICULOS', 'SUGERIR PRECIOS CON PORCENTAJE DE MARGEN O UTILIDAD') returning_values (:UOM);
IDREP = GEN_ID(id_reputilidad, 1);
if (DETALLE = 'N') then
    BEGIN
    if (BIN_AND(TIPO, 1) <> 0) then
        BEGIN
        TIPODOC = 31;
        FOR SELECT MAX(D.ARTI_COD), SUM(FADE_CANT * FADE_FACTOR), SUM((FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO)*FACT_FACTOR), SUM(FADE_IVAMONTO*FACT_FACTOR), SUM(FADE_CONSUMO)
            FROM FACTURAS_DETALLE D, FACTURAS F, PREFIJOS P, ARTICULO A
            WHERE F.FACT_ID = D.FACT_ID AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND D.ARTI_COD = A.arti_cod AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            FACT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) and substring(a.arti_cod from 1 FOR 2) <> '.t'
            GROUP BY D.ARTI_COD
            INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO
            DO
            BEGIN
            COSTO = 0;
            FOR SELECT FADE_CANT * FADE_FACTOR, FACT_FECHA FROM FACTURAS_DETALLE D, FACTURAS F, PREFIJOS P
                WHERE F.FACT_ID = D.FACT_ID AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND
                FACT_ANULADO = 'N' AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                and D.ARTI_COD = :articulo  INTO :cantdet, :fecha
                DO
                BEGIN
                EXECUTE PROCEDURE costo_promedio_y_ultimo(:ARTICULO, :FECHA) returning_values (:costounit, :ultcos);
                if (ULTIMO = 'S') then
                    COSTO = COSTO + ultcos * cantdet;
                else
                    COSTO = COSTO + costounit * cantdet;
                END
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            INSERT INTO REP_UTILIDAD(ID, CODIGO, BASE, IVA, CONSUMO, COSTO) VALUES (:IDREP, :articulo, :base, :iva, :consumo, :costo);
            if (CEROS = 'S') then
                INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (2, USER, :ARTICULO);
            END /* FOR */
        SELECT SUM(BASE-COSTO) FROM REP_UTILIDAD WHERE id = :IDREP INTO :TOTAL;
        FOR SELECT ARTI_COD, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD FROM ARTICULO A
            WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND
            (A.MARC_COD <= :MARFIN))) AND substring(a.arti_cod from 1 FOR 2) <> '.t'
            INTO :ARTICULO, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
            DO
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            BASE = 0;
            IVA = 0;
            CONSUMO = 0;
            COSTO = 0;
            UTILIDAD = 0;
            PORC = 0;
            PART = 0;
            SELECT BASE, IVA, CONSUMO, COSTO FROM rep_utilidad WHERE ID = :IDREP AND CODIGO = :articulo INTO :BASE, :IVA, :consumo,  :costo;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            EXECUTE PROCEDURE PORCENTAJE (utilidad,  TOTAL, 'S') returning_values (part);
            if ((CEROS = 'S') or (BASE <> 0) or (COSTO <> 0)) then
                SUSPEND;
            END /* FOR */
            BEGIN
            COSTO = 0;
            END
        END
    if (BIN_AND(TIPO, 2) <> 0) then
        BEGIN
        TIPODOC = 32;
        FOR SELECT MAX(D.ARTI_COD), SUM(RVDE_CANT * RVDE_FACTOR), SUM(RVDE_TOTAL-RVDE_IVAMONTO-RVDE_CONSUMO), SUM(RVDE_IVAMONTO), SUM(RVDE_CONSUMO)
            FROM REMISIONES_VENTA_DETALLE D, REMISIONES_VENTA R, PREFIJOS P, ARTICULO A
            WHERE R.REVT_ID = D.REVT_ID AND P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = 32 AND D.ARTI_COD = A.arti_cod AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            REVT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY D.ARTI_COD
            INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO
            DO
            BEGIN
            COSTO = 0;
            FOR SELECT RVDE_CANT * RVDE_FACTOR, REVT_FECHA FROM remisiones_venta_detalle D, remisiones_venta F, PREFIJOS P
                WHERE F.revt_id = D.revt_id AND REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN AND
                REVT_ANULADO = 'N' AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 32 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                and D.ARTI_COD = :articulo  INTO :cantdet, :fecha
                DO
                BEGIN
                EXECUTE PROCEDURE costo_promedio_y_ultimo(:ARTICULO, :FECHA) returning_values (:costounit, :ultcos);
                if (ULTIMO = 'S') then
                    COSTO = COSTO + ultcos * cantdet;
                else
                    COSTO = COSTO + costounit * cantdet;
                END
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            if (CEROS = 'S') then
                INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (2, USER, :ARTICULO);
            INSERT INTO REP_UTILIDAD(ID, CODIGO, BASE, IVA, CONSUMO, COSTO) VALUES (:IDREP, :articulo, :base, :iva, :consumo, :costo);
            END /* FOR */
        SELECT SUM(BASE-COSTO) FROM REP_UTILIDAD WHERE id = :IDREP INTO :TOTAL;
        FOR SELECT ARTI_COD, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD FROM ARTICULO A
            WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND
            (A.MARC_COD <= :MARFIN))) AND substring(a.arti_cod from 1 FOR 2) <> '.t'
            INTO :ARTICULO, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
            DO
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            BASE = 0;
            IVA = 0;
            CONSUMO = 0;
            COSTO = 0;
            UTILIDAD = 0;
            PORC = 0;
            SELECT BASE, IVA, CONSUMO, COSTO FROM rep_utilidad WHERE ID = :IDREP AND CODIGO = :articulo INTO :BASE, :IVA, :consumo,  :costo;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            EXECUTE PROCEDURE PORCENTAJE (utilidad,  TOTAL, 'S') returning_values (part);
            if ((CEROS = 'S') or (BASE <> 0) or (COSTO <> 0)) then
                SUSPEND;
            END /* FOR */
        END
    if (BIN_AND(TIPO, 4) <> 0) then
        BEGIN
        TIPODOC = 33;
        FOR SELECT MAX(D.ARTI_COD), SUM(DVDE_CANT * DVDE_FACTOR), SUM((DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO)*DEVT_FACTOR), SUM(DVDE_IVAMONTO*DEVT_FACTOR), SUM(DVDE_CONSUMO)
            FROM devoluciones_ventas_detalle D, DEVOLUCIONES_VENTAS V, PREFIJOS P, ARTICULO A
            WHERE V.DEVT_ID = D.DEVT_ID AND P.PREF_PRE = V.PREF_PRE AND P.TIDO_COD = 33 AND D.ARTI_COD = A.arti_cod AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            DEVT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY D.ARTI_COD
            INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO
            DO
            BEGIN
            COSTO = 0;
            FOR SELECT DVDE_CANT * DVDE_FACTOR, DEVT_FECHA FROM devoluciones_ventas_detalle D, devoluciones_ventas F, PREFIJOS P
                WHERE F.devt_id = D.devt_id AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND
                DEVT_ANULADO = 'N' AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 33 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                and D.ARTI_COD = :articulo  INTO :cantdet, :fecha
                DO
                BEGIN
                EXECUTE PROCEDURE costo_promedio_y_ultimo(:ARTICULO, :FECHA) returning_values (:costounit, :ultcos);
                if (ULTIMO = 'S') then
                    COSTO = COSTO + ultcos * cantdet;
                else
                    COSTO = COSTO + costounit * cantdet;
                END
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            else
                CANTIDAD = CANTIDAD * -1;
            if (BASE IS NULL) then
                BASE = 0;
            else
                BASE = BASE * -1;
            if (IVA IS NULL) then
                IVA = 0;
            else
                IVA = IVA * -1;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            else
                CONSUMO = CONSUMO * -1;
            COSTO = costo * -1;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            if (CEROS = 'S') then
                INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (2, USER, :ARTICULO);
            INSERT INTO REP_UTILIDAD(ID, CODIGO, BASE, IVA, CONSUMO, COSTO) VALUES (:IDREP, :articulo, :base, :iva, :consumo, :costo);
            END /* FOR */
        SELECT SUM(BASE-COSTO) FROM REP_UTILIDAD WHERE id = :IDREP INTO :TOTAL;
        FOR SELECT ARTI_COD, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD FROM ARTICULO A
            WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND
            (A.MARC_COD <= :MARFIN))) AND substring(a.arti_cod from 1 FOR 2) <> '.t'
            INTO :ARTICULO, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
            DO
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            BASE = 0;
            IVA = 0;
            CONSUMO = 0;
            COSTO = 0;
            UTILIDAD = 0;
            PORC = 0;
            SELECT BASE, IVA, CONSUMO, COSTO FROM rep_utilidad WHERE ID = :IDREP AND CODIGO = :articulo INTO :BASE, :IVA, :consumo,  :costo;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            EXECUTE PROCEDURE PORCENTAJE (utilidad,  TOTAL, 'S') returning_values (part);
            if ((CEROS = 'S') or (BASE <> 0) or (COSTO <> 0)) then
                SUSPEND;
            END /* FOR */
        END
    if (BIN_AND(TIPO, 8) <> 0) then
        BEGIN
        TIPODOC = 34;
        /* BORRA LA TABLA AUXILIAR */
        DELETE FROM reportes_aux WHERE REPA_ID = 2 AND REPA_USER = USER;

        FOR SELECT MAX(D.ARTI_COD), SUM(PEDE_CANT * PEDE_FACTOR), SUM((PEDE_TOTAL-PEDE_IVAMONTO-PEDE_CONSUMO)*PEDI_FACTOR), SUM(PEDE_IVAMONTO*PEDI_FACTOR), SUM(PEDE_CONSUMO)
            FROM PEDIDOS_DETALLE D, PEDIDOS P, PREFIJOS R, ARTICULO A
            WHERE P.PEDI_ID = D.PEDI_ID AND P.PREF_PRE = R.PREF_PRE AND R.TIDO_COD = 34 AND D.ARTI_COD = A.arti_cod AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            PEDI_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY D.ARTI_COD
            INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO
            DO
            BEGIN
            COSTO = 0;
            FOR SELECT PEDE_CANT * PEDE_FACTOR, PEDI_FECHA FROM pedidos_detalle D, pedidos F, PREFIJOS P
                WHERE F.pedi_id = D.pedi_id AND PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND
                PEDI_ANULADO = 'N' AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                and D.ARTI_COD = :articulo  INTO :cantdet, :fecha
                DO
                BEGIN
                EXECUTE PROCEDURE costo_promedio_y_ultimo(:ARTICULO, :FECHA) returning_values (:costounit, :ultcos);
                if (ULTIMO = 'S') then
                    COSTO = COSTO + ultcos * cantdet;
                else
                    COSTO = COSTO + costounit * cantdet;
                END
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            if (CEROS = 'S') then
                INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (2, USER, :ARTICULO);
            INSERT INTO REP_UTILIDAD(ID, CODIGO, BASE, IVA, CONSUMO, COSTO) VALUES (:IDREP, :articulo, :base, :iva, :consumo, :costo);
            END /* FOR */
        SELECT SUM(BASE-COSTO) FROM REP_UTILIDAD WHERE id = :IDREP INTO :TOTAL;
        FOR SELECT ARTI_COD, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD FROM ARTICULO A
            WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND
            (A.MARC_COD <= :MARFIN))) AND substring(a.arti_cod from 1 FOR 2) <> '.t'
            INTO :ARTICULO, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
            DO
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            BASE = 0;
            IVA = 0;
            CONSUMO = 0;
            COSTO = 0;
            UTILIDAD = 0;
            PORC = 0;
            SELECT BASE, IVA, CONSUMO, COSTO FROM rep_utilidad WHERE ID = :IDREP AND CODIGO = :articulo INTO :BASE, :IVA, :consumo,  :costo;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            EXECUTE PROCEDURE PORCENTAJE (utilidad,  TOTAL, 'S') returning_values (part);
            if ((CEROS = 'S') or (BASE <> 0) or (COSTO <> 0)) then
                SUSPEND;
            END /* FOR */
        END
    if (BIN_AND(TIPO, 16) <> 0) then
        BEGIN
        TIPODOC = 35;
        FOR SELECT MAX(D.ARTI_COD), SUM(CTDE_CANT * CTDE_FACTOR), SUM((CTDE_TOTAL-CTDE_IVAMONTO-CTDE_CONSUMO)*COTI_FACTOR), SUM(CTDE_IVAMONTO), SUM(CTDE_CONSUMO)
            FROM COTIZACIONES_DETALLE D, COTIZACIONES C, PREFIJOS P, ARTICULO A
            WHERE C.COTI_ID = D.COTI_ID AND P.PREF_PRE = C.PREF_PRE AND P.TIDO_COD = 35 AND D.ARTI_COD = A.arti_cod AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND COTI_FECHA >= :FECINI AND COTI_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            COTI_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY D.ARTI_COD
            INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO
            DO
            BEGIN
            COSTO = 0;
            FOR SELECT CTDE_CANT * CTDE_FACTOR, COTI_FECHA FROM cotizaciones_detalle D, cotizaciones F, PREFIJOS P
                WHERE F.coti_id = D.coti_id AND COTI_FECHA >= :FECINI AND COTI_FECHA <= :FECFIN AND
                COTI_ANULADO = 'N' AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                and D.ARTI_COD = :articulo  INTO :cantdet, :fecha
                DO
                BEGIN
                EXECUTE PROCEDURE costo_promedio_y_ultimo(:ARTICULO, :FECHA) returning_values (:costounit, :ultcos);
                if (ULTIMO = 'S') then
                    COSTO = COSTO + ultcos * cantdet;
                else
                    COSTO = COSTO + costounit * cantdet;
                END
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            if (CEROS = 'S') then
                INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (2, USER, :ARTICULO);
            INSERT INTO REP_UTILIDAD(ID, CODIGO, BASE, IVA, CONSUMO, COSTO) VALUES (:IDREP, :articulo, :base, :iva, :consumo, :costo);
            END /* FOR */
        SELECT SUM(BASE-COSTO) FROM REP_UTILIDAD WHERE id = :IDREP INTO :TOTAL;
        FOR SELECT ARTI_COD, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD FROM ARTICULO A
            WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND
            (A.MARC_COD <= :MARFIN))) AND substring(a.arti_cod from 1 FOR 2) <> '.t'
            INTO :ARTICULO, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
            DO
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            BASE = 0;
            IVA = 0;
            CONSUMO = 0;
            COSTO = 0;
            UTILIDAD = 0;
            PORC = 0;
            SELECT BASE, IVA, CONSUMO, COSTO FROM rep_utilidad WHERE ID = :IDREP AND CODIGO = :articulo INTO :BASE, :IVA, :consumo,  :costo;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            EXECUTE PROCEDURE PORCENTAJE (utilidad,  TOTAL, 'S') returning_values (part);
            if ((CEROS = 'S') or (BASE <> 0) or (COSTO <> 0)) then
                SUSPEND;
            END /* FOR */
        END
    END
ELSE
  if (DETALLE = 'G') then
    BEGIN
    if (BIN_AND(TIPO, 1) <> 0) then
        BEGIN
        TIPODOC = 31;
        FOR SELECT MAX(a.grup_cod), SUM((FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO)*FACT_FACTOR), SUM(FADE_IVAMONTO*FACT_FACTOR), SUM(FADE_CONSUMO)
            FROM FACTURAS_DETALLE D, FACTURAS F, PREFIJOS P, ARTICULO A
            WHERE F.FACT_ID = D.FACT_ID AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND D.ARTI_COD = A.arti_cod AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            FACT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) and substring(a.arti_cod from 1 FOR 2) <> '.t'
            GROUP BY a.grup_cod
            INTO :codgrupo, :BASE, :IVA, :CONSUMO
            DO
            BEGIN
            COSTO = 0;
            FOR SELECT MAX(D.arti_cod), SUM(FADE_CANT * FADE_FACTOR), MAX(FACT_FECHA) FROM FACTURAS_DETALLE D, FACTURAS F, PREFIJOS P, ARTICULO A
                WHERE A.arti_cod = D.arti_cod AND F.FACT_ID = D.FACT_ID AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND
                FACT_ANULADO = 'N' AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                and a.grup_cod = :codgrupo GROUP BY D.ARTI_COD, FACT_FECHA INTO :ARTICULO, cantdet, :fecha
                DO
                BEGIN
                EXECUTE PROCEDURE costo_promedio_y_ultimo(:ARTICULO, :FECHA) returning_values (:costounit, :ultcos);
                if (ULTIMO = 'S') then
                    COSTO = COSTO + ultcos * cantdet;
                else
                    COSTO = COSTO + costounit * cantdet;
                END
            CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            INSERT INTO REP_UTILIDAD(ID, CODIGO, BASE, IVA, CONSUMO, COSTO) VALUES (:IDREP, :codgrupo, :base, :iva, :consumo, :costo);
            if (CEROS = 'S') then
                INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (2, USER, :codgrupo);
            END /* FOR */
        SELECT SUM(BASE-COSTO) FROM REP_UTILIDAD WHERE id = :IDREP INTO :TOTAL;
        FOR SELECT GRUP_COD, GRUP_NOM FROM GRUPO
            WHERE GRUP_COD >= :GRPINI AND GRUP_COD <= :grpfin
            INTO :ARTICULO, :DESCRIPCION
            DO
            BEGIN
            BASE = 0;
            IVA = 0;
            CONSUMO = 0;
            COSTO = 0;
            UTILIDAD = 0;
            PORC = 0;
            PART = 0;
            SELECT BASE, IVA, CONSUMO, COSTO FROM rep_utilidad WHERE ID = :IDREP AND CODIGO = :articulo INTO :BASE, :IVA, :consumo,  :costo;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            EXECUTE PROCEDURE PORCENTAJE (utilidad,  TOTAL, 'S') returning_values (part);
            if ((CEROS = 'S') or (BASE <> 0) or (COSTO <> 0)) then
                SUSPEND;
            END /* FOR */
            BEGIN
            COSTO = 0;
            END
        END
    if (BIN_AND(TIPO, 2) <> 0) then
        BEGIN
        TIPODOC = 32;
        FOR SELECT MAX(a.grup_cod), SUM(RVDE_TOTAL-RVDE_IVAMONTO-RVDE_CONSUMO), SUM(RVDE_IVAMONTO), SUM(RVDE_CONSUMO)
            FROM REMISIONES_VENTA_DETALLE D, REMISIONES_VENTA R, PREFIJOS P, ARTICULO A
            WHERE R.REVT_ID = D.REVT_ID AND P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = 32 AND D.ARTI_COD = A.arti_cod AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            REVT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY a.grup_cod
            INTO :codgrupo, :BASE, :IVA, :CONSUMO
            DO
            BEGIN
            COSTO = 0;
            FOR SELECT MAX(D.arti_cod), SUM(RVDE_CANT * RVDE_FACTOR), MAX(REVT_FECHA) FROM remisiones_venta_detalle D, remisiones_venta F, PREFIJOS P, ARTICULO A
                WHERE A.arti_cod = D.arti_cod AND F.revt_id = D.revt_id AND REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN AND
                REVT_ANULADO = 'N' AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 32 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                and a.grup_cod = :codgrupo GROUP BY D.ARTI_COD, REVT_FECHA INTO :ARTICULO, cantdet, :fecha
                DO
                BEGIN
                EXECUTE PROCEDURE costo_promedio_y_ultimo(:ARTICULO, :FECHA) returning_values (:costounit, :ultcos);
                if (ULTIMO = 'S') then
                    COSTO = COSTO + ultcos * cantdet;
                else
                    COSTO = COSTO + costounit * cantdet;
                END
            CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            if (CEROS = 'S') then
                INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (2, USER, :codgrupo);
            INSERT INTO REP_UTILIDAD(ID, CODIGO, BASE, IVA, CONSUMO, COSTO) VALUES (:IDREP, :codgrupo, :base, :iva, :consumo, :costo);
            END /* FOR */
        SELECT SUM(BASE-COSTO) FROM REP_UTILIDAD WHERE id = :IDREP INTO :TOTAL;
        FOR SELECT GRUP_COD, GRUP_NOM FROM GRUPO
            WHERE GRUP_COD >= :GRPINI AND GRUP_COD <= :grpfin
            INTO :ARTICULO, :DESCRIPCION
            DO
            BEGIN
            BASE = 0;
            IVA = 0;
            CONSUMO = 0;
            COSTO = 0;
            UTILIDAD = 0;
            PORC = 0;
            SELECT BASE, IVA, CONSUMO, COSTO FROM rep_utilidad WHERE ID = :IDREP AND CODIGO = :articulo INTO :BASE, :IVA, :consumo,  :costo;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            EXECUTE PROCEDURE PORCENTAJE (utilidad,  TOTAL, 'S') returning_values (part);
            if ((CEROS = 'S') or (BASE <> 0) or (COSTO <> 0)) then
                SUSPEND;
            END /* FOR */
        END
    if (BIN_AND(TIPO, 4) <> 0) then
        BEGIN
        TIPODOC = 33;
        FOR SELECT MAX(a.grup_cod), SUM((DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO)*DEVT_FACTOR), SUM(DVDE_IVAMONTO*DEVT_FACTOR), SUM(DVDE_CONSUMO)
            FROM devoluciones_ventas_detalle D, DEVOLUCIONES_VENTAS V, PREFIJOS P, ARTICULO A
            WHERE V.DEVT_ID = D.DEVT_ID AND P.PREF_PRE = V.PREF_PRE AND P.TIDO_COD = 33 AND D.ARTI_COD = A.arti_cod AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            DEVT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY a.grup_cod
            INTO :codgrupo, :BASE, :IVA, :CONSUMO
            DO
            BEGIN
            COSTO = 0;
            FOR SELECT MAX(D.arti_cod), SUM(DVDE_CANT * DVDE_FACTOR), MAX(DEVT_FECHA) FROM devoluciones_ventas_detalle D, devoluciones_ventas F, PREFIJOS P, ARTICULO A
                WHERE A.arti_cod = D.arti_cod AND F.devt_id = D.devt_id AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND
                DEVT_ANULADO = 'N' AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 33 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                and a.grup_cod = :codgrupo GROUP BY D.ARTI_COD, DEVT_FECHA INTO :ARTICULO, cantdet, :fecha
                DO
                BEGIN
                EXECUTE PROCEDURE costo_promedio_y_ultimo(:ARTICULO, :FECHA) returning_values (:costounit, :ultcos);
                if (ULTIMO = 'S') then
                    COSTO = COSTO + ultcos * cantdet;
                else
                    COSTO = COSTO + costounit * cantdet;
                END
            CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            else
                BASE = BASE * -1;
            if (IVA IS NULL) then
                IVA = 0;
            else
                IVA = IVA * -1;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            else
                CONSUMO = CONSUMO * -1;
            COSTO = costo * -1;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            if (CEROS = 'S') then
                INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (2, USER, :codgrupo);
            INSERT INTO REP_UTILIDAD(ID, CODIGO, BASE, IVA, CONSUMO, COSTO) VALUES (:IDREP, :codgrupo, :base, :iva, :consumo, :costo);
            END /* FOR */
        SELECT SUM(BASE-COSTO) FROM REP_UTILIDAD WHERE id = :IDREP INTO :TOTAL;
        FOR SELECT GRUP_COD, GRUP_NOM FROM GRUPO
            WHERE GRUP_COD >= :GRPINI AND GRUP_COD <= :grpfin
            INTO :ARTICULO, :DESCRIPCION
            DO
            BEGIN
            BASE = 0;
            IVA = 0;
            CONSUMO = 0;
            COSTO = 0;
            UTILIDAD = 0;
            PORC = 0;
            SELECT BASE, IVA, CONSUMO, COSTO FROM rep_utilidad WHERE ID = :IDREP AND CODIGO = :articulo INTO :BASE, :IVA, :consumo,  :costo;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            EXECUTE PROCEDURE PORCENTAJE (utilidad,  TOTAL, 'S') returning_values (part);
            if ((CEROS = 'S') or (BASE <> 0) or (COSTO <> 0)) then
                SUSPEND;
            END /* FOR */
        END
    if (BIN_AND(TIPO, 8) <> 0) then
        BEGIN
        TIPODOC = 34;
        /* BORRA LA TABLA AUXILIAR */
        DELETE FROM reportes_aux WHERE REPA_ID = 2 AND REPA_USER = USER;

        FOR SELECT MAX(a.grup_cod), SUM((PEDE_TOTAL-PEDE_IVAMONTO-PEDE_CONSUMO)*PEDI_FACTOR), SUM(PEDE_IVAMONTO*PEDI_FACTOR), SUM(PEDE_CONSUMO)
            FROM PEDIDOS_DETALLE D, PEDIDOS P, PREFIJOS R, ARTICULO A
            WHERE P.PEDI_ID = D.PEDI_ID AND P.PREF_PRE = R.PREF_PRE AND R.TIDO_COD = 34 AND D.ARTI_COD = A.arti_cod AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            PEDI_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY a.grup_cod
            INTO :codgrupo, :BASE, :IVA, :CONSUMO
            DO
            BEGIN
            COSTO = 0;
            FOR SELECT MAX(D.arti_cod), SUM(PEDE_CANT * PEDE_FACTOR), MAX(pedi_FECHA) FROM pedidos_detalle D, pedidos F, PREFIJOS P, ARTICULO A
                WHERE A.arti_cod = D.arti_cod AND F.pedi_id = D.pedi_id AND PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND
                PEDI_ANULADO = 'N' AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                and a.grup_cod = :codgrupo GROUP BY D.ARTI_COD, PEDI_FECHA INTO :ARTICULO, cantdet, :fecha
                DO
                BEGIN
                EXECUTE PROCEDURE costo_promedio_y_ultimo(:ARTICULO, :FECHA) returning_values (:costounit, :ultcos);
                if (ULTIMO = 'S') then
                    COSTO = COSTO + ultcos * cantdet;
                else
                    COSTO = COSTO + costounit * cantdet;
                END
            CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            if (CEROS = 'S') then
                INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (2, USER, :codgrupo);
            INSERT INTO REP_UTILIDAD(ID, CODIGO, BASE, IVA, CONSUMO, COSTO) VALUES (:IDREP, :codgrupo, :base, :iva, :consumo, :costo);
            END /* FOR */
        SELECT SUM(BASE-COSTO) FROM REP_UTILIDAD WHERE id = :IDREP INTO :TOTAL;
        FOR SELECT GRUP_COD, GRUP_NOM FROM GRUPO
            WHERE GRUP_COD >= :GRPINI AND GRUP_COD <= :grpfin
            INTO :ARTICULO, :DESCRIPCION
            DO
            BEGIN
            BASE = 0;
            IVA = 0;
            CONSUMO = 0;
            COSTO = 0;
            UTILIDAD = 0;
            PORC = 0;
            SELECT BASE, IVA, CONSUMO, COSTO FROM rep_utilidad WHERE ID = :IDREP AND CODIGO = :articulo INTO :BASE, :IVA, :consumo,  :costo;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            EXECUTE PROCEDURE PORCENTAJE (utilidad,  TOTAL, 'S') returning_values (part);
            if ((CEROS = 'S') or (BASE <> 0) or (COSTO <> 0)) then
                SUSPEND;
            END /* FOR */
        END
    if (BIN_AND(TIPO, 16) <> 0) then
        BEGIN
        TIPODOC = 35;
        FOR SELECT MAX(a.grup_cod), SUM((CTDE_TOTAL-CTDE_IVAMONTO-CTDE_CONSUMO)*COTI_FACTOR), SUM(CTDE_IVAMONTO), SUM(CTDE_CONSUMO)
            FROM COTIZACIONES_DETALLE D, COTIZACIONES C, PREFIJOS P, ARTICULO A
            WHERE C.COTI_ID = D.COTI_ID AND P.PREF_PRE = C.PREF_PRE AND P.TIDO_COD = 35 AND D.ARTI_COD = A.arti_cod AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND COTI_FECHA >= :FECINI AND COTI_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            COTI_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY A.grup_cod
            INTO :codgrupo, :BASE, :IVA, :CONSUMO
            DO
            BEGIN
            COSTO = 0;
            FOR SELECT MAX(D.arti_cod), SUM(CTDE_CANT * CTDE_FACTOR), MAX(COTI_FECHA) FROM cotizaciones_detalle D, cotizaciones F, PREFIJOS P, ARTICULO A
                WHERE A.arti_cod = D.arti_cod AND F.coti_id = D.coti_id AND COTI_FECHA >= :FECINI AND COTI_FECHA <= :FECFIN AND
                COTI_ANULADO = 'N' AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                and a.grup_cod = :codgrupo GROUP BY D.ARTI_COD, COTI_FECHA INTO :ARTICULO, cantdet, :fecha
                DO
                BEGIN
                EXECUTE PROCEDURE costo_promedio_y_ultimo(:ARTICULO, :FECHA) returning_values (:costounit, :ultcos);
                if (ULTIMO = 'S') then
                    COSTO = COSTO + ultcos * cantdet;
                else
                    COSTO = COSTO + costounit * cantdet;
                END
            CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            if (CEROS = 'S') then
                INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (2, USER, :codgrupo);
            INSERT INTO REP_UTILIDAD(ID, CODIGO, BASE, IVA, CONSUMO, COSTO) VALUES (:IDREP, :codgrupo, :base, :iva, :consumo, :costo);
            END /* FOR */
        SELECT SUM(BASE-COSTO) FROM REP_UTILIDAD WHERE id = :IDREP INTO :TOTAL;
        FOR SELECT GRUP_COD, GRUP_NOM FROM GRUPO
            WHERE GRUP_COD >= :GRPINI AND GRUP_COD <= :grpfin
            INTO :ARTICULO, :DESCRIPCION
            DO
            BEGIN
            BASE = 0;
            IVA = 0;
            CONSUMO = 0;
            COSTO = 0;
            UTILIDAD = 0;
            PORC = 0;
            SELECT BASE, IVA, CONSUMO, COSTO FROM rep_utilidad WHERE ID = :IDREP AND CODIGO = :articulo INTO :BASE, :IVA, :consumo,  :costo;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            EXECUTE PROCEDURE PORCENTAJE (utilidad,  TOTAL, 'S') returning_values (part);
            if ((CEROS = 'S') or (BASE <> 0) or (COSTO <> 0)) then
                SUSPEND;
            END /* FOR */
        END
    END
  ELSE
    BEGIN
    if (BIN_AND(TIPO, 1) <> 0) then
        BEGIN
        TIPODOC = 31;
        FOR SELECT F.PREF_PRE, FACT_NUMERO, FACT_FECHA, D.ARTI_COD, FADE_CANT * FADE_FACTOR, (FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO)*FACT_FACTOR, FADE_IVAMONTO*FACT_FACTOR, FADE_CONSUMO,
            ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
            FROM FACTURAS F, FACTURAS_DETALLE D, PREFIJOS P, ARTICULO A
            WHERE F.FACT_ID = D.FACT_ID AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND D.ARTI_COD = A.arti_cod AND
                A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
                A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND FACT_FECHA >= :FECINI AND
                (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
                FACT_FECHA <= :FECFIN AND FACT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) and substring(a.arti_cod from 1 FOR 2) <> '.t'
            ORDER BY D.ARTI_COD, FACT_FECHA, F.FACT_ID, FADE_ITEM
            INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,
                :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
            DO
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            EXECUTE PROCEDURE costo_promedio_y_ultimo(:ARTICULO, :FECHA) returning_values (:costounit, :ultcos);
            if (ULTIMO = 'S') then
                COSTO = ultcos * cantidad;
            else
                COSTO = costounit * cantidad;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            SUSPEND;
            END
        END
    if (BIN_AND(TIPO, 2) <> 0) then
        BEGIN
        TIPODOC = 32;
        FOR SELECT R.PREF_PRE, REVT_NUMERO, REVT_FECHA, D.ARTI_COD, RVDE_CANT * RVDE_FACTOR, RVDE_TOTAL-RVDE_IVAMONTO-RVDE_CONSUMO, RVDE_IVAMONTO, RVDE_CONSUMO,
            ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
            FROM REMISIONES_VENTA R, REMISIONES_VENTA_DETALLE D, PREFIJOS P, ARTICULO A
            WHERE R.REVT_ID = D.REVT_ID AND P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = 32 AND D.ARTI_COD = A.arti_cod AND
                A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
                A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN AND
                (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
                REVT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            ORDER BY D.ARTI_COD, REVT_FECHA, R.REVT_ID, RVDE_ITEM
            INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,
                :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
            DO
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            EXECUTE PROCEDURE costo_promedio_y_ultimo(:ARTICULO, :FECHA) returning_values (:costounit, :ultcos);
            if (ULTIMO = 'S') then
                COSTO = ultcos * cantidad;
            else
                COSTO = costounit * cantidad;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            SUSPEND;
            END
        END
    if (BIN_AND(TIPO, 4) <> 0) then
        BEGIN
        TIPODOC = 33;
        FOR SELECT V.PREF_PRE, DEVT_NUMERO, DEVT_FECHA, D.ARTI_COD, DVDE_CANT * DVDE_FACTOR, (DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO)*DEVT_FACTOR, DVDE_IVAMONTO*DEVT_FACTOR, DVDE_CONSUMO,
            ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
            FROM DEVOLUCIONES_VENTAS V, DEVOLUCIONES_VENTAS_DETALLE D, PREFIJOS P, ARTICULO A
            WHERE V.DEVT_ID = D.DEVT_ID AND P.PREF_PRE = V.PREF_PRE AND P.TIDO_COD = 33 AND D.ARTI_COD = A.arti_cod AND
                A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
                A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND
                (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
                DEVT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            ORDER BY D.ARTI_COD, DEVT_FECHA, V.DEVT_ID, DVDE_ITEM
            INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,
                :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
            DO
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            CANTIDAD = CANTIDAD * -1;
            EXECUTE PROCEDURE costo_promedio_y_ultimo(:ARTICULO, :FECHA) returning_values (:costounit, :ultcos);
            if (ULTIMO = 'S') then
                COSTO = ultcos * cantidad;
            else
                COSTO = costounit * cantidad;
            BASE = BASE * -1;
            IVA = IVA * -1;
            CONSUMO = CONSUMO * -1;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            SUSPEND;
            END
        END
    if (BIN_AND(TIPO, 8) <> 0) then
        BEGIN
        TIPODOC = 34;
        FOR SELECT P.PREF_PRE, PEDI_NUMERO, PEDI_FECHA, D.ARTI_COD, PEDE_CANT * PEDE_FACTOR, (PEDE_TOTAL-PEDE_IVAMONTO-PEDE_CONSUMO)*PEDI_FACTOR, PEDE_IVAMONTO*PEDI_FACTOR, PEDE_CONSUMO,
            ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD 
            FROM PEDIDOS P, PEDIDOS_DETALLE D, PREFIJOS R, ARTICULO A
            WHERE P.PEDI_ID = D.PEDI_ID AND P.PREF_PRE = R.PREF_PRE AND R.TIDO_COD = 34 AND D.ARTI_COD = A.arti_cod AND
                A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
                A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND
                (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
                PEDI_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            ORDER BY D.ARTI_COD, PEDI_FECHA, P.PEDI_ID, PEDE_ITEM
            INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,
                :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
            DO
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            EXECUTE PROCEDURE costo_promedio_y_ultimo(:ARTICULO, :FECHA) returning_values (:costounit, :ultcos);
            if (ULTIMO = 'S') then
                COSTO = ultcos * cantidad;
            else
                COSTO = costounit * cantidad;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            SUSPEND;
            END
        END
    if (BIN_AND(TIPO, 16) <> 0) then
        BEGIN
        TIPODOC = 35;
        FOR SELECT C.PREF_PRE, COTI_NUMERO, COTI_FECHA, D.ARTI_COD, CTDE_CANT * CTDE_FACTOR, (CTDE_TOTAL-CTDE_IVAMONTO-CTDE_CONSUMO)*COTI_FACTOR, CTDE_IVAMONTO*COTI_FACTOR, CTDE_CONSUMO,
            ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD 
            FROM COTIZACIONES C, COTIZACIONES_DETALLE D, PREFIJOS P, ARTICULO A
            WHERE C.COTI_ID = D.COTI_ID AND P.PREF_PRE = C.PREF_PRE AND P.TIDO_COD = 35 AND D.ARTI_COD = A.arti_cod AND
                A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
                A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND COTI_FECHA >= :FECINI AND COTI_FECHA <= :FECFIN AND
                (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
                COTI_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            ORDER BY D.ARTI_COD, COTI_FECHA, C.COTI_ID, CTDE_ITEM
            INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,
                :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
            DO
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            EXECUTE PROCEDURE costo_promedio_y_ultimo(:ARTICULO, :FECHA) returning_values (:costounit, :ultcos);
            if (ULTIMO = 'S') then
                COSTO = ultcos * cantidad;
            else
                COSTO = costounit * cantidad;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            SUSPEND;
            END
        END
    END
END
^

SET TERM ; ^


/* 20100110 */
/* IMPRIMA EL DETALLE DE LA COMPOSICION DE CADA ARTICULO Y DE LOS INGRDIENTES DE LAS BASES */

SET TERM ^ ;

CREATE OR ALTER procedure IMPR_PLANPROD (
    ID integer)
returns (
    PREF varchar(4),
    NUMERO varchar(6),
    FECHA date,
    FECFIN date,
    CONCEPTO varchar(60),
    RESPONSABLE varchar(60),
    OBS blob sub_type 0 segment size 80,
    ITEM integer,
    ARTICULO varchar(15),
    CODBAR varchar(15),
    ARTIDES varchar(60),
    CANT numeric(18,4),
    UNIDAD varchar(8),
    MERMA numeric(9,4),
    PESO numeric(18,4),
    OBSITEM blob sub_type 0 segment size 80,
    CODCOMP VARCHAR(20),
    DESCOMP VARCHAR(60),
    CANTCOMP NUMERIC(18,4),
    UNICOMP VARCHAR(8))
AS
BEGIN
SELECT PLPR_PREF, PLPR_NUMERO, PLPR_FECINI, PLPR_FECFIN, PLPR_CONC, PLPR_RESPONSABLE, PLPR_OBS
    FROM plan_produccion O WHERE PLPR_ID = :ID into
    :PREF, :NUMERO, :FECHA,
    :FECFIN, :CONCEPTO, :RESPONSABLE, :OBS;
FOR SELECT PLPD_ITEM, ARTI_COD, PLPD_CODBAR, PLPD_DESC, PLPD_CANT, PLPD_UNIDAD, PLPD_MERMA, PLPD_PESO, PLPD_OBS
    FROM plan_produccion_det WHERE PLPR_ID = :ID
    ORDER BY PLPD_ITEM
    INTO :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :MERMA, :PESO, :OBSITEM
    DO
      BEGIN
      codcomp = '';
      descomp = '';
      cantcomp = 0;
      unicomp = '';
      SUSPEND;
      for select arpr_comp, arti_des, arpr_cant, arpr_unidad from articulos_producto P, ARTICULO A
        where P.arpr_comp = A.arti_cod AND p.arti_cod = :articulo
        into :codcomp, :descomp, :cantcomp, :unicomp
        DO
        BEGIN
        ARTICULO = '';
        CODBAR = '';
        ARTIDES = '';
        CANT = 0;
        UNIDAD = '';
        MERMA = 0;
        PESO = 0;
        OBSITEM = '';
        SUSPEND;
        END
      END
END
^

SET TERM ; ^


SET TERM ^ ;

CREATE OR ALTER procedure IMPR_PLANPROD_CONS (
    ID integer)
returns (
    ITEM integer,
    ARTICULO varchar(15),
    CODBAR varchar(15),
    ARTIDES varchar(60),
    CANT numeric(18,4),
    UNIDAD varchar(8),
    EXISTEN numeric(18,4),
    ORDENADO numeric(18,4),
    OBSITEM blob sub_type 0 segment size 80,
    CODCOMP VARCHAR(20),
    DESCOMP VARCHAR(60),
    CANTCOMP NUMERIC(18,4),
    UNICOMP VARCHAR(8))
AS
BEGIN
FOR SELECT PLPC_ITEM, ARTI_COD, PLPC_CODBAR, PLPC_DESC, PLPC_CANT, PLPC_UNIDAD, PLPC_EXIST, PLPC_ORDENAR, PLPC_OBS
    FROM plan_produccion_cons WHERE PLPD_ID = :ID
    ORDER BY PLPC_ITEM
    INTO :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :existen, :ordenado, :OBSITEM
    DO
      BEGIN
      SUSPEND;
      codcomp = '';
      descomp = '';
      cantcomp = 0;
      unicomp = '';
      SUSPEND;
      for select arpr_comp, arti_des, arpr_cant, arpr_unidad from articulos_producto P, ARTICULO A
        where P.arpr_comp = A.arti_cod AND p.arti_cod = :articulo
        into :codcomp, :descomp, :cantcomp, :unicomp
        DO
        ARTICULO = '';
        CODBAR = '';
        ARTIDES = '';
        CANT = 0;
        UNIDAD = '';
        EXISTEN = '';
        ORDENADO = '';
        OBSITEM = '';
        SUSPEND;
      END
END
^

SET TERM ; ^


/* 20100112 */
/* SOLO LOS ACTIVOS 0 CON VENTA */
SET TERM ^ ;

CREATE OR ALTER procedure VENTAS_VENDEDOR_MES (
    FECINI date,
    FECFIN date,
    SUBEMPRESA integer)
returns (
    CODIGO integer,
    NOMBRE varchar(60),
    FACTURAS integer,
    MFACTURAS numeric(18,2),
    DEVOLUCIONES integer,
    MDEVOLUCIONES numeric(18,2),
    IVAFACT numeric(18,2),
    IVADEV numeric(18,2),
    CONSUMOF numeric(18,2),
    CONSUMOD numeric(18,2))
AS
declare variable ESTADO CHAR(1);
BEGIN
  for select VEND_COD, VEND_NOMBRE, VEND_ESTADO from VENDEDORES into :CODIGO, :NOMBRE, :ESTADO
  DO
    BEGIN
    EXECUTE PROCEDURE VENTAS_VENDEDOR (CODIGO, FECINI, FECFIN, SUBEMPRESA) returning_values (FACTURAS, MFACTURAS, DEVOLUCIONES, MDEVOLUCIONES, IVAFACT, IVADEV, CONSUMOF, CONSUMOD);
    IF ((ESTADO = 'A') OR (MFACTURAS <> 0) OR (MDEVOLUCIONES <> 0)) THEN
        SUSPEND;
    END
END
^

SET TERM ; ^


/* 20100119 */
/* error de reuso de fecha no incluia los campos de unidades alternativas */
SET TERM ^ ;

CREATE OR ALTER procedure REP_LISTA_PRECIOS (
    ARTINI varchar(20),
    ARTFIN varchar(20),
    GRPINI varchar(2),
    GRPFIN varchar(2),
    ORDEN char(1),
    LINI integer,
    LFIN integer,
    FECHA date,
    DEATRES char(1),
    MASIVA char(1),
    HOY char(1))
returns (
    CODIGO varchar(15),
    NOMBRE varchar(60),
    REFERENCIA varchar(20),
    UNIDAD varchar(8),
    UNIDAD2 varchar(8),
    FACTOR2 NUMERIC(18,4),
    UNIDAD3 varchar(8),
    FACTOR3 NUMERIC(18,4),
    UNIDAD4 varchar(8),
    FACTOR4 NUMERIC(18,4),
    CODGRUPO varchar(2),
    NOMGRUPO varchar(30),
    CODSUBG varchar(3),
    NOMSUBG varchar(30),
    CODMARC varchar(3),
    NOMMARC varchar(30),
    NOMLISTA varchar(30),
    PRECIO numeric(18,2),
    PRECIO2 numeric(18,2),
    PRECIO3 numeric(18,2),
    MARGEN numeric(9,2),
    IVA numeric(9,2),
    IVAMONTO numeric(18,2),
    CONSUMO numeric(18,2),
    CANTMIN numeric(18,4),
    PESO numeric(9,4),
    ANCHO numeric(18,4),
    ALTO numeric(18,4),
    LARGO numeric(18,4),
    FOTO blob sub_type 1 segment size 80,
    OBS blob sub_type 1 segment size 80,
    TOTAL numeric(18,2))
AS
declare variable CODINI VARCHAR(20);
declare variable CODFIN VARCHAR(20);
declare variable DESINI VARCHAR(20);
declare variable DESFIN VARCHAR(20);
declare variable UTIL NUMERIC(9,2);
declare variable MOU CHAR(10);
declare variable LISIVA CHAR(2);
declare variable i integer;
declare variable J integer;
declare variable PRECAUX NUMERIC(18,2);
declare variable NUMROWS INTEGER;
declare variable DIG INTEGER;
declare variable UNIDADA VARCHAR(8);
declare variable FACTORA NUMERIC(18,4);
declare variable FECHOY DATE;
BEGIN
if (ORDEN = 'C') then
    BEGIN
    CODINI = ARTINI;
    CODFIN = ARTFIN;
    DESINI = '';
    DESFIN = 'zz';
    END
ELSE
    BEGIN
    DESINI = ARTINI;
    DESFIN = ARTFIN;
    CODINI = '';
    CODFIN = 'zz';
    END
FECHOY = cast('now' as DATE);
EXECUTE PROCEDURE LEE_CONFIGURACION ('FACTURACION', 'ARTICULOS', 'SUGERIR PRECIOS CON PORCENTAJE DE MARGEN O UTILIDAD') returning_values (MOU);
EXECUTE PROCEDURE LEE_CONFIGURACION ('FACTURACION', 'ARTICULOS', 'REDONDEO AL MULTIPLO DE DIEZ EN PRECIOS') returning_values (DIG);
FOR SELECT a.ARTI_COD, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD, TAIV_PORC, ARTI_CONSUMO,
    ARTI_FOTO, ARTI_PESO, ARTI_LARGO, ARTI_ANCHO, ARTI_ALTO, ARTI_OBS
    FROM ARTICULO A, TARIFA_IVA T
    WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :GRPFIN AND
    ARTI_DES >= :DESINI AND ARTI_DES <= :DESFIN AND ESAR_COD = 'A' AND A.TAIV_COD = T.TAIV_COD
    ORDER BY ARTI_COD
    INTO :CODIGO, :NOMBRE, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :IVA, :CONSUMO,
        :FOTO, :PESO, :LARGO, :ANCHO, :ALTO, :OBS
    DO
    BEGIN
    I = 0;
    FOR SELECT LIPR_NOM, PRAR_FIJO, PRAR_MARGEN, PRAR_UTIL, LIPR_MODIF, PRAR_CANTMIN
        FROM LISTA_PRECIOS L, PRECIOS_ARTICULO P
        WHERE L.LIPR_COD = P.LIPR_COD AND p.arti_cod = :codigo and l.lipr_cod >= :lini and l.lipr_cod <= :lfin AND
        ((:fecha IS NULL) or ((L.lipr_fecini <= :FECHA) AND (L.lipr_fecfin >= :FECHA)))
        ORDER BY L.LIPR_COD
        INTO :NOMLISTA, :PRECIO, :MARGEN, :UTIL, :LISIVA, :cantmin
        do
        BEGIN
        SELECT COUNT(AUDI_ID) FROM AUDITORIA WHERE TIDO_COD = 126 AND AUDI_COD = :CODIGO AND AUDI_FECHA = :FECHOY AND AUDI_OPER <> 'D' INTO :NUMROWS;
        if ((HOY = 'N') or (NUMROWS <> 0)) then
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            SELECT MIN(COBA_COD) FROM barras_articulo WHERE ARTI_COD = :codigo INTO :referencia;
            J = 0;
            UNIDAD2 = '';
            UNIDAD3 = '';
            UNIDAD4 = '';
            factor2 = 0;
            factor3 = 0;
            factor4 = 0;
            for SELECT UNAR_UNIDAD, UNAR_FACPRE FROM unidad_articulo WHERE ARTI_COD = :codigo INTO :unidada, :factora
                DO
                BEGIN
                if (J = 0) then
                    BEGIN
                    UNIDAD2 = UNIDADA;
                    FACTOR2 = FACTORA;
                    END
                if (J = 1) then
                    BEGIN
                    UNIDAD3 = UNIDADA;
                    FACTOR3 = FACTORA;
                    END
                if ( J = 2) then
                    BEGIN
                    UNIDAD4 = UNIDADA;
                    FACTOR4 = FACTORA;
                    END
                J = J + 1;
                END
            if (MOU = 'UTILIDAD') then
                MARGEN = UTIL;
            if (LISIVA = 'N') then
                IVAMONTO = PRECIO * IVA / 100;
            ELSE
                BEGIN
                IVAMONTO = (PRECIO - CONSUMO) * IVA / (100 + IVA);
                PRECIO = (PRECIO - CONSUMO) / (1 + (IVA/100));
/*              EXECUTE PROCEDURE redondee(PRECIO, DIG) returning_values (PRECIO); */
                END
            TOTAL = PRECIO + IVAMONTO + CONSUMO;
            EXECUTE PROCEDURE redondee(TOTAL, DIG) returning_values (TOTAL);
            if (DEATRES = 'N') then
                SUSPEND;
            else
                BEGIN
                I = I + 1;
                if (MASIVA = 'S') then
                    PRECIO = TOTAL;
                TOTAL = 0;
                if (MOD(I,3) = 1) then
                    BEGIN
                    PRECAUX = PRECIO;
                    PRECIO2 = 0;
                    PRECIO3 = 0;
                    END
                if (MOD(I,3) = 2) then
                    BEGIN
                    PRECIO2 = PRECIO;
                    PRECIO = PRECAUX;
                    END
                if (MOD(I,3) = 0) then
                    BEGIN
                    PRECIO3 = PRECIO;
                    PRECIO = PRECAUX;
                    SUSPEND;
                    END
                END
            END
        end
    if ((DEATRES = 'S') AND (MOD(I,3) <> 0)) then
        SUSPEND;
    end
END
^

SET TERM ; ^




/* 20100120 */
/* PASE EL NUMERO DE PROVEEDOR EN LA CONTABILIZACION POR DOCUMENTO COMO REF. CONTABLE Y NO REPITA LA FECHA DEL BANCO AL IMPRIMIR */

SET TERM ^ ;

CREATE OR ALTER procedure CONTABIL_EGRESO (
    IDDOC integer,
    IDINTER integer)
returns (
    ERROR integer,
    VER char(1),
    IDC integer)
AS
declare variable PREF VARCHAR(4);
declare variable NUM VARCHAR(6);
declare variable FECAUX DATE;
declare variable FECHA CHAR(8);
declare variable CONC CHAR(120);
declare variable VRDTO NUMERIC(18, 2);
declare variable VRRTFTE NUMERIC(18, 2);
declare variable VRRTIVA NUMERIC(18, 2);
declare variable VRRTICA NUMERIC(18, 2);
declare variable VRTOTAL NUMERIC(18, 2);
declare variable TIPOCOMP VARCHAR(3);
declare variable PREFCONT VARCHAR(4);
declare variable BASE CHAR(1);
declare variable CTABASE VARCHAR(20);
declare variable CAJA CHAR(1);
declare variable CTACAJA VARCHAR(20);
declare variable RTFTE CHAR(1);
declare variable CTARTFTE VARCHAR(20);
declare variable RTIVA CHAR(1);
declare variable CTARTIVA VARCHAR(20);
declare variable RTICA CHAR(1);
declare variable CTARTICA VARCHAR(20);
declare variable DTO CHAR(1);
declare variable CTADTO VARCHAR(20);
declare variable EXISTE CHAR(1);
declare variable CUENTA VARCHAR(20);
declare variable MONTO NUMERIC(18,2);
declare variable ES_RETENCION CHAR(1);
declare variable TIPOCUEN CHAR(1);
declare variable NIT VARCHAR(20);
declare variable PROY VARCHAR(4);
declare variable CENTRO VARCHAR(4);
declare variable MONTOBASE NUMERIC(18,2);
declare variable PORC NUMERIC(9,2);
declare variable DEBITO NUMERIC(18,2);
declare variable CREDITO NUMERIC(18,2);
declare variable NROI INTEGER;
declare variable SUMA NUMERIC(18,2);
declare variable TCTACLIEN VARCHAR(20);
declare variable TCTARTFTE VARCHAR(20);
declare variable TCTARTIVA VARCHAR(20);
declare variable TCTARTICA VARCHAR(20);
declare variable TCTACART VARCHAR(20);
declare variable TIPOIT INTEGER;
declare variable IDIT INTEGER;
declare variable PREFIT VARCHAR(4);
declare variable NUMIT VARCHAR(6);
declare variable NUMEROIT VARCHAR(10);
declare variable ABONOIT NUMERIC(18,2);
declare variable CTADIC VARCHAR(20);
declare variable BASEADIC VARCHAR(20);
declare variable PORCADIC NUMERIC(5,2);
declare variable VALORADIC NUMERIC(18,2);
declare variable DBADIC CHAR(1);
declare variable VRBASE NUMERIC(18,2);
declare variable GMF CHAR(1);
declare variable CODBCO INTEGER;
declare variable NUMCHEQ VARCHAR(20);
declare variable CRUCES NUMERIC(18,2);
declare variable VRCAJA NUMERIC(18,2);
declare variable OK INTEGER;
declare variable DIFCAMBIO NUMERIC(18,2);
declare variable CTADIF VARCHAR(20);
declare variable RTFTEC NUMERIC(18,2);
declare variable RTIVAC NUMERIC(18,2);
declare variable RTICAC NUMERIC(18,2);
declare variable RTFTER CHAR(1);
declare variable CTARTFTER VARCHAR(20);
declare variable RTIVAR CHAR(1);
declare variable CTARTIVAR VARCHAR(20);
declare variable RTICAR CHAR(1);
declare variable CTARTICAR VARCHAR(20);
declare variable RET CHAR(2);
declare variable RTIT NUMERIC(18,2);
declare variable NITBCO VARCHAR(20);
declare variable NUMPROV CHAR(8);
BEGIN
/* BUSQUE LA INTERFACE */
EXISTE = 'N';
SELECT 'S', TICO_COD, PRCO_PRE, INCJ_BASE, INCJ_DTOPP, INCJ_RTFTE, INCJ_RTIVA, INCJ_RTICA, INCJ_CAJA, INCJ_CTABASE, INCJ_CTADTO, INCJ_CTARTFTE, INCJ_CTARTIVA, INCJ_CTARTICA, INCJ_CTACAJA, INCJ_CONFIRMAR
    FROM INTERFAZ_CAJA
    WHERE INCJ_ID = :IDINTER
    INTO :EXISTE, :TIPOCOMP, :PREFCONT, :BASE, :DTO, :RTFTE, :RTIVA, :RTICA, :CAJA, :CTABASE, :CTADTO, :CTARTFTE, :CTARTIVA, :CTARTICA, :CTACAJA, :VER;
if (EXISTE = 'S') then
    BEGIN
    OK = 0;
    FOR SELECT CNTB_ID FROM CONTABILIZACION WHERE CNTB_TIPOREF = 62 AND CNTB_IDREF = :IDDOC INTO :OK DO
        BEGIN
        DELETE FROM CONTABILIZACION_DET WHERE CNTB_ID = :OK;
        DELETE FROM CONTABILIZACION WHERE CNTB_ID = :OK;
        END

    /* TRAIGA EL ENCABEZADO DEL EGRESO */
    SELECT PREF_PRE, EGRE_NUMERO, EGRE_FECHA, E.TERC_NIT, EGRE_CONC, EGRE_DTOF, EGRE_MONTO, EGRE_RTFTEMONTO, EGRE_RTIVAMONTO, EGRE_RTICAMONTO, TERC_CTARTFTE, TERC_CTARTIVA, TERC_CTARTICA, TERC_CTACLIENTE
        FROM EGRESOS E, TERCEROS T
        WHERE EGRE_ID = :IDDOC AND E.TERC_NIT = T.TERC_NIT
        INTO :PREF, :NUM, :FECAUX, :NIT, :CONC, :VRDTO, :VRTOTAL, :VRRTFTE, :VRRTIVA, :VRRTICA, :TCTARTFTE, TCTARTIVA, TCTARTICA, TCTACLIEN;
    /* SI ES PROVEEDOR, SOBREESCIBE LAS CUENTAS  */
    SELECT PROV_CTAPAGAR, PROV_CTARTFTE, PROV_CTARTIVA, PROV_CTARTICA
        FROM PROVEEDORES WHERE TERC_NIT = :NIT
        INTO TCTACLIEN, TCTARTFTE, TCTARTIVA, TCTARTICA;
    SELECT PREF_CENTRO, PREF_PROY FROM PREFIJOS
        WHERE PREF_PRE = :PREF AND TIDO_COD = 62 INTO :CENTRO, :PROY;
    EXECUTE PROCEDURE FECHA_A_CONTA(:FECAUX) returning_values (:FECHA);
    /* REGISTRE EL ENCABEZADO CONTABLE */
    IDC = GEN_ID(ID_CONTABILIZA, 1);
    INSERT INTO CONTABILIZACION (CNTB_ID, CNTB_TIPOCOMP, CNTB_PREFCNT, CNTB_NUMERO, CNTB_FECHA, CNTB_CONCEPTO, CNTB_REF, CNTB_TIPOREF, CNTB_IDREF, CNTB_PREFREF, CNTB_NUMREF, CNTB_PROCESADO)
        VALUES (:IDC, :TIPOCOMP, :PREFCONT, :NUM, :FECHA, :CONC, '', 62, :IDDOC, :PREF, :NUM, 'N');
    /* SUME LOS CRUCES PARA LLEVARLOS A LA CUENTA X PAGAR Y RESTAR DE LA CAJA */
    SELECT SUM(EGCC_ABONO) FROM EGRESOS_CRUCEC WHERE EGRE_ID = :iddoc INTO :CRUCES;
    if (CRUCES IS NULL) then
        CRUCES = 0;
    VRCAJA = VRTOTAL;
    NROI = 0;
    SUMA = 0;
    ERROR = 0;
    /* EL CREDITO EN LA CAJA O EL BANCO */
    IF ((CAJA = 'K')) THEN
        BEGIN
        if (VRCAJA <> 0) then
            BEGIN
            CUENTA = NULL;
            EXECUTE PROCEDURE VALIDE_CUENTA_C (CTACAJA) RETURNING_VALUES (:OK);
            IF (OK = 0) THEN
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :CTACAJA INTO :CUENTA, :TIPOCUEN;
            ELSE
                begin
                EXECUTE PROCEDURE ERROR (62, :IDDOC, :CTACAJA, 2);
                CUENTA = CTACAJA;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 4);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRCAJA, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - VRCAJA;
                END
            END /* VRCAJA <> 0 */
        END /* CAJA CONSTANTE */
    IF ((CAJA = 'F')) THEN
        BEGIN
        /* mueva la cuenta de la caja o el banco o ambas */
        /* PRIMERO LA CAJA */
        FOR SELECT CAJA_CUENTA, EGCA_MONTO FROM EGRESOS_CAJA E, CAJAS C
            WHERE C.CAJA_ID = E.CAJA_ID AND EGRE_ID = :IDDOC
            INTO :CTACAJA, :MONTO
            DO
            BEGIN
            if (MONTO <> 0) then
                BEGIN
                CUENTA = NULL;
                EXECUTE PROCEDURE VALIDE_CUENTA_C (CTACAJA) RETURNING_VALUES (:OK);
                IF (OK = 0) THEN
                    SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                        WHERE CUEN_COD = :CTACAJA INTO :CUENTA, :TIPOCUEN;
                ELSE
                    begin
                    EXECUTE PROCEDURE ERROR (62, :IDDOC, :CTACAJA, 2);
                    CUENTA = CTACAJA;
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 4);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA - MONTO;
                    END
                END /* MONTO <> 0 */
            END /* DO CAJA */
        /* AHORA EL BANCO */
        MONTO = 0;
        SELECT CUBA_CTACONTA, EGBC_MONTO, EGBC_GMF, E.CUBA_COD, CUBA_GMFPOR, EGBC_NUMERO, BANC_NIT
            FROM EGRESOS_BANCO E, CUENTAS_BANCO C, BANCOS B
            WHERE E.CUBA_COD = C.CUBA_COD AND EGRE_ID = :IDDOC AND B.banc_cod = C.banc_cod
            INTO :CTACAJA, :MONTO, :GMF, :CODBCO, :PORC, :NUMCHEQ, :nitbco;
        if (MONTO <> 0) then
            BEGIN
            if (MONTO <> 0) then
                BEGIN
                CUENTA = NULL;
                EXECUTE PROCEDURE VALIDE_CUENTA_C (CTACAJA) RETURNING_VALUES (:OK);
                IF (OK = 0) THEN
                    SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                        WHERE CUEN_COD = :CTACAJA INTO :CUENTA, :TIPOCUEN;
                ELSE
                    begin
                    EXECUTE PROCEDURE ERROR (62, :IDDOC, :CTACAJA, 2);
                    CUENTA = CTACAJA;
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 4);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, :NUMCHEQ, 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA - MONTO;
                    END
                /* EL GMF */
                if ((GMF = 'S') AND (PORC <> 0)) then
                    BEGIN
                    if (NITBCO IS NULL) then
                        NITBCO = NIT;
                    EXECUTE procedure REDONDEE(:MONTO * :PORC / 1000, 0) returning_values (MONTO);
                    /* REGISTRE EL GMF EN LA MISMA CUENTA DEL BANCO COMO CREDITO */
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, :NUMCHEQ, 0, :MONTO, 0, 0, :NITBCO, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA - MONTO;

                    /* AHORA LA CUENTA DEL GASTO */
                    SELECT CUBA_CTAGMF FROM CUENTAS_BANCO
                        where CUBA_COD = :CODBCO INTO :CTACAJA;
                    EXECUTE PROCEDURE VALIDE_CUENTA_C (CTACAJA) RETURNING_VALUES (:OK);
                    IF (OK = 0) THEN
                        SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                            WHERE CUEN_COD = :CTACAJA INTO :CUENTA, :TIPOCUEN;
                    ELSE
                        begin
                        EXECUTE PROCEDURE ERROR (62, :IDDOC, :CTACAJA, 2);
                        CUENTA = CTACAJA;
                        TIPOCUEN = 'N';
                        ERROR = ERROR + 1;
                        end
                    if (TIPOCUEN = 'I') then
                        BEGIN
                        EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
                        TIPOCUEN = 'N';
                        ERROR = ERROR + 1;
                        END
                    if (TIPOCUEN = 'C') then
                        BEGIN
                        EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 4);
                        TIPOCUEN = 'N';
                        ERROR = ERROR + 1;
                        END
                    if (TIPOCUEN = 'N') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, :NUMCHEQ, :MONTO, 0, 0, 0, :NITBCO, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NROI = NROI + 1;
                        SUMA = SUMA + MONTO;
                        END
                    END /* GMF */
                END /* MONTO <> 0 */
            END /* EGRESO_BANCO */
        END /* CAJA = F */

    /* LOS CRUCES CON CUENTAS X COBRAR */
    if (CRUCES <> 0) then
        BEGIN
        SELECT TERC_CTACLIENTE FROM TERCEROS WHERE TERC_NIT = :nit INTO :tctacart;
        if (tctacart IS NULL) then
            tctacart = tctaclien;
        CUENTA = NULL;
        EXECUTE PROCEDURE VALIDE_CUENTA_C (tctacart) RETURNING_VALUES (:OK);
        IF (OK = 0) THEN
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :tctacart INTO :CUENTA, :TIPOCUEN;
        ELSE
            begin
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :tctacart, 2);
            CUENTA = tctacart;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            /* DEBERIA RECORRER DOCUMENTO POR DOCUMENTO */
            FOR SELECT EGCC_TIPODOC, EGCC_PREFIJO, EGCC_NUMERO, EGCC_ABONO+EGCC_RTFTE+EGCC_RTIVA+EGCC_RTICA+EGCC_DTOF
                FROM egresos_crucec WHERE EGRE_ID = :IDDOC
                INTO :TIPOIT, PREFIT, NUMIT, ABONOIT
                DO
                BEGIN
                NUMEROIT = PREFIT || NUMIT;
                if (ABONOIT > 0) then
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :ABONOIT, 0, 0, :NIT, :PROY, :CENTRO, NULL, :NUMEROIT, NULL, NULL, :TIPOIT, 0);
                else
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', abs(:ABONOIT), 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, :NUMEROIT, NULL, NULL, :TIPOIT, 0);
                SUMA = SUMA - ABONOIT;
                NROI = NROI + 1;
                END
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            if (CRUCES > 0) then
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :CRUCES, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            else
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', abs(:CRUCES), 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            SUMA = SUMA - CRUCES;
            NROI = NROI + 1;
            END
        /* LA DIFERENCIA EN CAMBIO */
        SELECT SUM(EGCC_DIFCAMBIO) FROM egresos_crucec WHERE EGRE_ID = :iddoc INTO :DIFCAMBIO;
        IF ((DIFCAMBIO IS NOT NULL) AND (DIFCAMBIO <> 0)) THEN
            BEGIN
            if (DIFCAMBIO > 0) then
                execute procedure lee_configuracion('GENERAL','GENERAL','CUENTA DE INGRESO POR DIFERENCIA EN CAMBIO PARA OPERACIONES EN OTRA MONEDA') returning_values (:ctadif);
            else
                execute procedure lee_configuracion('GENERAL','GENERAL','CUENTA DE GASTO POR DIFERENCIA EN CAMBIO PARA OPERACIONES EN OTRA MONEDA') returning_values (:ctadif);
            CUENTA = NULL;
            EXECUTE PROCEDURE VALIDE_CUENTA_C (ctadif) RETURNING_VALUES (:OK);
            IF (OK = 0) THEN
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :ctadif INTO :CUENTA, :TIPOCUEN;
            ELSE
                begin
                EXECUTE PROCEDURE ERROR (62, :IDDOC, :ctadif, 2);
                CUENTA = ctadif;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 4);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                if (DIFCAMBIO > 0) then
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :difcambio, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                else
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', ABS(:difcambio), 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - difcambio;
                END
            END
        /* RETEFUENTE DEL CRUCE */
        SELECT first 1 INCJ_RTFTE, INCJ_RTIVA, INCJ_RTICA, INCJ_CTARTFTE, INCJ_CTARTIVA, INCJ_CTARTICA
            FROM INTERFAZ_CAJA WHERE tido_cod = 61 into :RTFTER, :RTIVAR, :RTICAR, :CTARTFTER, :CTARTIVAR, :CTARTICAR;
        SELECT SUM(EGCC_RTFTE) FROM egresos_crucec WHERE EGRE_ID = :iddoc INTO :rtftec;
        IF ((rtftec IS NOT NULL) AND (rtftec <> 0)) THEN
            BEGIN
            if ((RTFTER = 'T') or (RTFTER = 'K')) then
                BEGIN
                if (RTFTER = 'T') then
                    SELECT TERC_CTARTFTE FROM TERCEROS WHERE TERC_NIT = :NIT INTO CTARTFTER;
                CUENTA = NULL;
                EXECUTE PROCEDURE VALIDE_CUENTA_C (ctartfter) RETURNING_VALUES (:OK);
                IF (OK = 0) THEN
                    SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                        WHERE CUEN_COD = :ctartfter INTO :CUENTA, :TIPOCUEN;
                ELSE
                    begin
                    EXECUTE PROCEDURE ERROR (62, :IDDOC, :ctartfter, 2);
                    CUENTA = ctartfter;
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 4);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    if (rtftec > 0) then
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :rtftec, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    else
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, abs(:rtftec), 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA + rtftec;
                    END
                END
            END
        /* RETEIVA DEL CRUCE */
        SELECT SUM(EGCC_RTIVA) FROM egresos_crucec WHERE EGRE_ID = :iddoc INTO :rtivac;
        IF ((rtivac IS NOT NULL) AND (rtivac <> 0)) THEN
            BEGIN
            if ((RTIVAR = 'T') or (RTIVAR = 'K')) then
                BEGIN
                if (RTIVAR = 'T') then
                    SELECT TERC_CTARTIVA FROM TERCEROS WHERE TERC_NIT = :NIT INTO CTARTIVAR;
                CUENTA = NULL;
                EXECUTE PROCEDURE VALIDE_CUENTA_C (ctartivar) RETURNING_VALUES (:OK);
                IF (OK = 0) THEN
                    SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                        WHERE CUEN_COD = :ctartivar INTO :CUENTA, :TIPOCUEN;
                ELSE
                    begin
                    EXECUTE PROCEDURE ERROR (62, :IDDOC, :ctartivar, 2);
                    CUENTA = ctartivar;
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 4);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    if (rtivac > 0) then
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :rtivac, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    else
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, abs(:rtivac), 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA + rtivac;
                    END
                END
            END
        /* RETEICA DEL CRUCE */
        SELECT SUM(EGCC_RTICA) FROM egresos_crucec WHERE EGRE_ID = :iddoc INTO :rticac;
        IF ((rticac IS NOT NULL) AND (rtivac <> 0)) THEN
            BEGIN
            if ((RTICAR = 'T') or (RTICAR = 'K')) then
                BEGIN
                if (RTICAR = 'T') then
                    SELECT TERC_CTARTICA FROM TERCEROS WHERE TERC_NIT = :NIT INTO CTARTICAR;
                CUENTA = NULL;
                EXECUTE PROCEDURE VALIDE_CUENTA_C (ctarticar) RETURNING_VALUES (:OK);
                IF (OK = 0) THEN
                    SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                        WHERE CUEN_COD = :ctarticar INTO :CUENTA, :TIPOCUEN;
                ELSE
                    begin
                    EXECUTE PROCEDURE ERROR (62, :IDDOC, :ctarticar, 2);
                    CUENTA = ctarticar;
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 4);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    if (rticac > 0) then
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :rticac, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    else
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, abs(:rticac), 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA + rticac;
                    END
                END
            END
        END /* cruces */

    if (DTO = 'K') then /* DTO EN CTA CONSTANTE */
        BEGIN
        if (VRDTO <> 0) then
            BEGIN
            CUENTA = NULL;
            EXECUTE PROCEDURE VALIDE_CUENTA_C (CTADTO) RETURNING_VALUES (:OK);
            IF (OK = 0) THEN
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :CTADTO INTO :CUENTA, :TIPOCUEN;
            ELSE
                begin
                EXECUTE PROCEDURE ERROR (62, :IDDOC, :CTADTO, 2);
                CUENTA = CTADTO;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 4);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRDTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - VRDTO;
                END
            END /* VRDTO <> 0 */
        END /* DTO EN CTA CONSTANTE */

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

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE EGRESOS_SIN_CONTABILIDAD(
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    ID INTEGER,
    IDI INTEGER,
    IDC INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    ESTADO VARCHAR(20),
    ERROR INTEGER)
AS
DECLARE VARIABLE VER CHAR(2);
declare variable FECICNT VARCHAR(10);
declare variable FECFCNT VARCHAR(10);
declare variable idref INTEGER;
BEGIN
EXECUTE PROCEDURE fecha_a_conta(FECINI) returning_values (FECICNT);
EXECUTE PROCEDURE fecha_a_conta(FECFIN) returning_values (FECFCNT);
FOR SELECT EGRE_ID, PREF_PRE, egre_numero FROM EGRESOS WHERE EGRE_ANULADO = 'N' AND PREF_PRE <> 'R004' AND
    EGRE_FECHA >= :FECINI AND EGRE_FECHA <= :FECFIN ORDER BY EGRE_ID INTO :ID, :PREF, :NUMERO
DO
  BEGIN
  idref = null;
  SELECT ENCO_IDREF FROM COMPROBANTE_ENCABEZADO WHERE ENCO_TIPOREF = 62 AND ENCO_FECHA >= :FECICNT AND ENCO_FECHA <= :FECFCNT and ENCO_IDREF = :ID into :idref;
  if (idref IS NULL) then
  begin
   ESTADO = 'PROCESANDO';
   SUSPEND;
   SELECT MAX(INCJ_ID) FROM INTERFAZ_CAJA WHERE PREF_PRE = :PREF AND TIDO_COD = 62 INTO :IDI;
   EXECUTE PROCEDURE CONTABIL_EGRESO (:ID, :IDI) RETURNING_VALUES (:ERROR, :VER, :IDC);
   IF (ERROR = 0) THEN
      BEGIN
      EXECUTE PROCEDURE CONTABILIZA_PENDIENTE (:IDC);
      ESTADO = 'OK';
      END
   ELSE
    ESTADO = 'ERROR';
   suspend;
  end
  END
END

^

SET TERM ; ^


SET TERM ^ ;

CREATE OR ALTER procedure IMPR_FORMAPAGO (
    TIPODOC integer,
    IDDOC integer)
returns (
    TIPOBCO varchar(8),
    PREFBCO varchar(4),
    CTABCO varchar(3),
    CTANRO varchar(20),
    CTATIT varchar(60),
    CTASUC varchar(60),
    CTACONTA varchar(20),
    NUMBCO varchar(20),
    FECBCO date,
    BENEFBCO varchar(60),
    CONCBCO varchar(60),
    MONTOBCO numeric(18,2),
    ITEMPAGO integer,
    NOMCAJA varchar(30),
    FORPAGO varchar(30),
    BCOPAGO varchar(2),
    CTAPAGO varchar(20),
    NUMPAGO varchar(20),
    FECPAGO date,
    MONTOPAGO numeric(18,2),
    TOTALFORMA1 numeric(18,2),
    TOTALFORMA2 numeric(18,2),
    TOTALFORMA3 numeric(18,2),
    TOTALFORMA4 numeric(18,2))
AS
declare variable IDFORMA INTEGER;
BEGIN
totalforma1 = 0;
totalforma2 = 0;
totalforma3 = 0;
totalforma4 = 0;
if (TIPODOC = 62) then
    BEGIN
    MONTOPAGO = 0;
    FOR SELECT EGCA_ITEM, CAJA_NOMBRE, FOPA_NOM, EGCA_BANCO, EGCA_CUENTA, EGCA_NUMERO, EGCA_FECHA, EGCA_MONTO, EC.FOPA_ID
        FROM EGRESOS E, EGRESOS_CAJA EC, CAJAS C, FORMAS_PAGO F
        WHERE EC.CAJA_ID = C.CAJA_ID AND EC.FOPA_ID = F.FOPA_ID AND
        E.EGRE_ID = EC.EGRE_ID AND E.EGRE_ID = :IDDOC
        ORDER BY EGCA_ITEM
        INTO :ITEMPAGO, :NOMCAJA, :FORPAGO, :BCOPAGO, :CTAPAGO, :NUMPAGO, :FECPAGO, :MONTOPAGO, :IDFORMA
        DO
        BEGIN
        TIPOBCO = NULL;
        PREFBCO = NULL;
        CTABCO = NULL;
        CTATIT = NULL;
        CTANRO = NULL;
        CTASUC = NULL;
        CTACONTA = NULL;
        NUMBCO = NULL;
        FECBCO = NULL;
        BENEFBCO = NULL;
        CONCBCO = NULL;
        MONTOBCO = 0;
        if (IDFORMA = 1) then
            TOTALFORMA1 = TOTALFORMA1 + MONTOPAGO;
        if (IDFORMA = 2) then
            TOTALFORMA2 = TOTALFORMA2 + MONTOPAGO;
        if (IDFORMA = 3) then
            TOTALFORMA3 = TOTALFORMA3 + MONTOPAGO;
        if (IDFORMA = 4) then
            TOTALFORMA4 = TOTALFORMA4 + MONTOPAGO;
        SUSPEND;
        END
    FOR SELECT
        TB.TIDO_NOMCORTO, PRBA_PREF, CUBA_CODCTA, CUBA_TITULAR, CUBA_NUMERO, CUBA_SUCURSAL, CUBA_CTACONTA,
        EGBC_NUMERO, EGBC_FECHA, EGBC_BENEF, EGBC_CONCEPTO, EGBC_MONTO
    FROM EGRESOS E, EGRESOS_BANCO EB, TIPO_DOCUMENTO TB, CUENTAS_BANCO CB
    WHERE EB.EGBC_TIPOBCO = TB.TIDO_COD AND
        CB.CUBA_COD = EB.CUBA_COD AND
        E.EGRE_ID = EB.EGRE_ID AND E.EGRE_ID = :IDDOC
    INTO
        :TIPOBCO, :PREFBCO, :CTABCO, :CTATIT, :CTANRO, :CTASUC, :CTACONTA,
        :NUMBCO, :FECBCO, :BENEFBCO, :CONCBCO, :MONTOBCO
    DO
        BEGIN
        ITEMPAGO = NULL;
        NOMCAJA = NULL;
        FORPAGO = NULL;
        BCOPAGO = NULL;
        CTAPAGO = NULL;
        NUMPAGO = NULL;
        FECPAGO = NULL;
        MONTOPAGO = 0;
        TOTALFORMA2 = TOTALFORMA2 + MONTOBCO;
        SUSPEND;
        END
    END
ELSE
  if (TIPODOC = 61) then
    BEGIN
    for select
        RCPA_ITEM, FOPA_NOM, RCPA_BANCO, RCPA_CUENTA, RCPA_NUMERO, RCPA_FECHA, RCPA_MONTO, RP.FOPA_ID
    FROM RECIBOS_CAJA R, RECIBOS_CAJA_PAGO RP, FORMAS_PAGO F
    WHERE RP.FOPA_ID = F.FOPA_ID AND R.RECA_ID = RP.RECA_ID AND
        R.RECA_ID = :IDDOC
    INTO
        :ITEMPAGO, :FORPAGO, :BCOPAGO, :CTAPAGO, :NUMPAGO, :FECPAGO, :MONTOPAGO, :IDFORMA
    DO
        BEGIN
        if (IDFORMA = 1) then
            TOTALFORMA1 = TOTALFORMA1 + MONTOPAGO;
        if (IDFORMA = 2) then
            TOTALFORMA2 = TOTALFORMA2 + MONTOPAGO;
        if (IDFORMA = 3) then
            TOTALFORMA3 = TOTALFORMA3 + MONTOPAGO;
        if (IDFORMA = 4) then
            TOTALFORMA4 = TOTALFORMA4 + MONTOPAGO;
        SUSPEND;
        END
    END
  if (TIPODOC = 63) then
    BEGIN
    for select
        CDSA_ITEM, FOPA_NOM, CDSA_BANCO, CDSA_CUENTA, CDSA_NUMERO, CDSA_FECHA, CDSA_MONTO, CP.FOPA_ID
    FROM CAMBIO_DOCUMENTOS C, CAMBIODOC_SALIDAS CP, FORMAS_PAGO F
    WHERE CP.FOPA_ID = F.FOPA_ID AND C.CADO_ID = CP.CADO_ID AND
        C.CADO_ID = :IDDOC
    INTO
        :ITEMPAGO, :FORPAGO, :BCOPAGO, :CTAPAGO, :NUMPAGO, :FECPAGO, :MONTOPAGO, :IDFORMA
    DO
        BEGIN
        if (IDFORMA = 1) then
            TOTALFORMA1 = TOTALFORMA1 + MONTOPAGO;
        if (IDFORMA = 2) then
            TOTALFORMA2 = TOTALFORMA2 + MONTOPAGO;
        if (IDFORMA = 3) then
            TOTALFORMA3 = TOTALFORMA3 + MONTOPAGO;
        if (IDFORMA = 4) then
            TOTALFORMA4 = TOTALFORMA4 + MONTOPAGO;
        SUSPEND;
        END
    END
  if (TIPODOC = 65) then
    BEGIN
    for select
        RPPA_ITEM, FOPA_NOM, RPPA_BANCO, RPPA_CUENTA, RPPA_NUMERO, RPPA_FECHA, RPPA_MONTO, RP.FOPA_ID
    FROM RECIBO_PROVISIONAL R, RECIBO_PROVISIONAL_PAGO RP, FORMAS_PAGO F
    WHERE RP.FOPA_ID = F.FOPA_ID AND R.RCPR_ID = RP.RCPR_ID AND
        R.RCPR_ID = :IDDOC
    INTO
        :ITEMPAGO, :FORPAGO, :BCOPAGO, :CTAPAGO, :NUMPAGO, :FECPAGO, :MONTOPAGO, :IDFORMA
    DO
        BEGIN
        if (IDFORMA = 1) then
            TOTALFORMA1 = TOTALFORMA1 + MONTOPAGO;
        if (IDFORMA = 2) then
            TOTALFORMA2 = TOTALFORMA2 + MONTOPAGO;
        if (IDFORMA = 3) then
            TOTALFORMA3 = TOTALFORMA3 + MONTOPAGO;
        if (IDFORMA = 4) then
            TOTALFORMA4 = TOTALFORMA4 + MONTOPAGO;
        SUSPEND;
        END
    END
END
^

SET TERM ; ^


/* 20100122 */
/* traiga las lineas de descripcion adicional al consolidar */
SET TERM ^ ;

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

SET TERM ; ^

SET TERM ^ ;

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

^

SET TERM ; ^

SET TERM ^ ;

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

^

SET TERM ; ^

SET TERM ^ ;

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

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

SET TERM ; ^


/* 20100127B */
/* configurable si contabilizar el banco neto o el total y luego los descuentos */
INSERT INTO CONFIGURACION (CONF_MODULO, CONF_CATEGORIA, CONF_PROPIEDAD, CONF_VALOR, CONF_POSIBLES, CONF_AYUDA) VALUES ('BANCOS', 'CONSIGNACIONES', 'CONTABILIZAR EL BANCO POR EL TOTAL DE TARJETAS Y LUEGO DESCUENTOS O UN SOLO REGISTRO NETO', 'TOTAL', 'TOTAL,NETO', 'TOTAL: Se mueve la cuenta del banco por el total de la tarjeta débito y luego se acreditan los descuentos. NETO: Se hace un solo registro en el banco por el neto abonado después de descuentos');
commit work;


SET TERM ^ ;

CREATE OR ALTER procedure CONTABIL_CONSIGNATAR (
    IDDOC integer,
    IDINTER integer)
returns (
    ERROR integer,
    VER char(1),
    IDC integer)
AS
declare variable PREF VARCHAR(4);
declare variable NUM VARCHAR(6);
declare variable NUMERO VARCHAR(10);
declare variable FECAUX DATE;
declare variable FECHA CHAR(8);
declare variable CONC CHAR(120);
declare variable VRDTO NUMERIC(18, 2);
declare variable VRRTFTE NUMERIC(18, 2);
declare variable VRRTIVA NUMERIC(18, 2);
declare variable VRRTICA NUMERIC(18, 2);
declare variable VRTOTAL NUMERIC(18, 2);
declare variable TIPOCOMP VARCHAR(3);
declare variable PREFCONT VARCHAR(4);
declare variable BASE CHAR(1);
declare variable PORC NUMERIC(8,2);
declare variable CTABASE VARCHAR(20);
declare variable CAJA CHAR(1);
declare variable CTACAJA VARCHAR(20);
declare variable RTFTE CHAR(1);
declare variable CTARTFTE VARCHAR(20);
declare variable RTIVA CHAR(1);
declare variable CTARTIVA VARCHAR(20);
declare variable RTICA CHAR(1);
declare variable CTARTICA VARCHAR(20);
declare variable DTO CHAR(1);
declare variable CTADTO VARCHAR(20);
declare variable CTAGMF VARCHAR(20);
declare variable GMFPOR NUMERIC(9,2);
declare variable VRGMF NUMERIC(18,2);
declare variable EXISTE CHAR(1);
declare variable CUENTA VARCHAR(20);
declare variable MONTO NUMERIC(18,2);
declare variable TIPOCUEN CHAR(1);
declare variable NIT VARCHAR(20);
declare variable PROY VARCHAR(4);
declare variable CENTRO VARCHAR(4);
declare variable DEBITO NUMERIC(18,2);
declare variable CREDITO NUMERIC(18,2);
declare variable NROI INTEGER;
declare variable SUMA NUMERIC(18,2);
declare variable CTADIC VARCHAR(20);
declare variable BASEADIC VARCHAR(20);
declare variable PORCADIC NUMERIC(5,2);
declare variable VALORADIC NUMERIC(18,2);
declare variable DBADIC CHAR(1);
declare variable CHEQUE CHAR(1);
declare variable IDCAJA INTEGER;
declare variable IDBANCO INTEGER;
declare variable ANULADO CHAR(1);
declare variable VRBASE NUMERIC(18,2);
declare variable TOTALNETO CHAR(5);
BEGIN
/* BUSQUE LA INTERFACE */
EXISTE = 'N';
SELECT 'S', TICO_COD, PRCO_PRE, INCJ_BASE, INCJ_DTOPP, INCJ_RTFTE, INCJ_RTIVA, INCJ_RTICA, INCJ_CAJA, INCJ_CTABASE, INCJ_CTADTO, INCJ_CTARTFTE, INCJ_CTARTIVA, INCJ_CTARTICA, INCJ_CTACAJA, INCJ_CONFIRMAR
    FROM INTERFAZ_CAJA
    WHERE INCJ_ID = :IDINTER
    INTO :EXISTE, :TIPOCOMP, :PREFCONT, :BASE, :DTO, :RTFTE, :RTIVA, :RTICA, :CAJA, :CTABASE, :CTADTO, :CTARTFTE, :CTARTIVA, :CTARTICA, :CTACAJA, :VER;
if (EXISTE = 'S') then
    BEGIN
    DELETE FROM contabilizacion WHERE CNTB_TIPOREF = 64 AND CNTB_IDREF = :IDDOC;

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

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

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

        NROI = 0;
        SUMA = 0;
        ERROR = 0;
        VRBASE = VRTOTAL;
        if (TOTALNETO = 'TOTAL') then
            VRTOTAL = VRTOTAL + vrdto + vrrtfte + vrrtica + vrrtiva;
        SELECT CUBA_CTAGMF, CUBA_GMFPOR FROM CUENTAS_BANCO WHERE CUBA_COD = :IDBANCO INTO ctagmf, :gmfpor;
        if ((CTAGMF <> '') AND (GMFPOR <> 0))then
            EXECUTE procedure REDONDEE((vrdto + vrrtfte + vrrtiva + vrrtica) * GMFPOR / 1000,0) returning_values (:VRGMF);
        else    
            VRGMF = 0;
        IF ((CAJA = 'K') or (CAJA = 'F') ) THEN
            BEGIN
            if (VRTOTAL <> 0) then
                BEGIN
                IF ((CAJA = 'F')) THEN
                    BEGIN
                    /* TRAIGA LA CUENTA DE LA CAJA O EL BANCO A ABONAR */
                    if (CHEQUE = 'S') then
                        SELECT CUBA_CTACONTA FROM CUENTAS_BANCO WHERE CUBA_COD = :IDBANCO INTO CTACAJA;
                    ELSE
                        SELECT CAJA_CUENTA FROM CAJAS WHERE CAJA_ID = :IDCAJA INTO CTACAJA;
                    END
                
                CUENTA = NULL;
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :CTACAJA INTO :CUENTA, :TIPOCUEN;
                if (CUENTA IS NULL) then
                    begin
                    EXECUTE PROCEDURE ERROR (64, :IDDOC, :CTACAJA, 2);
                    CUENTA = CTABASE;
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (64, :IDDOC, :CUENTA, 3);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (64, :IDDOC, :CUENTA, 4);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRTOTAL, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA + VRTOTAL;
                    if (TOTALNETO = 'TOTAL') then
                        BEGIN
                        if (VRDTO <> 0) then
                            BEGIN
                            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRDTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                            NROI = NROI + 1;
                            SUMA = SUMA - VRDTO;
                            END
                        if (vrrtfte <> 0) then
                            BEGIN
                            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :vrrtfte, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                            NROI = NROI + 1;
                            SUMA = SUMA - vrrtfte;
                            END
                        if (vrrtiva <> 0) then
                            BEGIN
                            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :vrrtiva, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                            NROI = NROI + 1;
                            SUMA = SUMA - vrrtiva;
                            END
                        if (vrrtica <> 0) then
                            BEGIN
                            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :vrrtica, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                            NROI = NROI + 1;
                            SUMA = SUMA - vrrtica;
                            END
                        if (vrgmf <> 0) then
                            BEGIN
                            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRGMF, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                            NROI = NROI + 1;
                            SUMA = SUMA - VRGMF;
                            END
                        END
                    END
                END /* VRTOTAL <> 0 */
            END /* CAJA CONSTANTE */
        
        if (DTO = 'K') then /* COMISION */
            BEGIN
            if (VRDTO <> 0) then
                BEGIN
                CUENTA = NULL;
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :CTADTO INTO :CUENTA, :TIPOCUEN;
                if (CUENTA IS NULL) then
                    begin
                    EXECUTE PROCEDURE ERROR (64, :IDDOC, :CTABASE, 2);
                    CUENTA = CTABASE;
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (64, :IDDOC, :CUENTA, 3);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (64, :IDDOC, :CUENTA, 4);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRDTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA + VRDTO;
                    END
                END /* VRDTO <> 0 */
            END /* DTO EN CTA CONSTANTE */
        
        /* RETENCION FUENTE */
        if (RTFTE = 'K') then
          if (VRRTFTE <> 0) then
            BEGIN
            PORC = vrrtfte * 100 / vrbase;
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTARTFTE INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERROR (64, :IDDOC, :ctartfte, 2);
                CUENTA = CTABASE;
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERROR (64, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                EXECUTE PROCEDURE ERROR (64, :IDDOC, :CUENTA, 4);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :vrbase, :PORC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA + VRRTFTE;
                END
            END /* RTFTE */
        
        /* RETENCION IVA */
        if (RTIVA = 'K') then
          if (VRRTIVA <> 0) then
            BEGIN
            PORC = VRRTIVA / VRBASE;
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO
                FROM CUENTAS
                WHERE CUEN_COD = :CTARTIVA
                INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERROR (64, :IDDOC, :ctartiva, 2);
                CUENTA = CTABASE;
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERROR (64, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                EXECUTE PROCEDURE ERROR (64, :IDDOC, :CUENTA, 4);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTIVA, 0, :VRBASE, :PORC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA + VRRTIVA;
                END
            END /* RTIVA */
        
        /* RETENCION ICA */
        if (rtica = 'K') then
          if (vrrtica <> 0) then
            BEGIN
            PORC = vrrtica / VRBASE;
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO
                FROM CUENTAS
                WHERE CUEN_COD = :ctartica
                INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERROR (64, :IDDOC, :ctartica, 2);
                CUENTA = ctartica;
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERROR (64, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                EXECUTE PROCEDURE ERROR (64, :IDDOC, :CUENTA, 4);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :vrrtica, 0, :VRBASE, :PORC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA + vrrtica;
                END
            END /* RTIVA */
        
        /* CUENTA GMF */
        if (VRGMF <> 0) then
            BEGIN
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTAGMF INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERROR (64, :IDDOC, :CTAGMF, 2);
                CUENTA = CTAGMF;
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERROR (64, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                EXECUTE PROCEDURE ERROR (64, :IDDOC, :CUENTA, 4);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
              if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRGMF, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA + VRGMF;
                END
            END /* GMF */

        /* CIERRE EL COMPROBANTE CONTRA LA CUENTA DE LA CAJA */
        if ((SUMA <> 0) and ((BASE = 'F') or (BASE = 'K'))) then
            BEGIN
            if (SUMA < 0) then
                BEGIN
                DEBITO = SUMA * -1;
                CREDITO = 0;
                END
            ELSE    
                BEGIN
                DEBITO = 0;
                CREDITO = SUMA;
                END
            if (BASE = 'F') then
                SELECT CAJA_CUENTA FROM CAJAS WHERE CAJA_ID = :IDCAJA INTO CTABASE;

            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTABASE INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERROR (64, :IDDOC, :CTABASE, 2);
                CUENTA = CTABASE;
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERROR (64, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                EXECUTE PROCEDURE ERROR (64, :IDDOC, :CUENTA, 4);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'N') then
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :DEBITO, :CREDITO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            END /* SUMA EN CARTERA */

        /* recorra las cuentas adicionales */
        FOR SELECT INJC_CUENTA, INJC_BASE, INJC_PORC, INJC_VALOR, INJC_DB
            FROM INTERFAZ_CAJA_CTAS
            WHERE INCJ_ID = :IDINTER
            INTO :CTADIC, :BASEADIC, :PORCADIC, :VALORADIC, :DBADIC
            DO
            BEGIN
            if (:BASEADIC = 'TOTAL') then
                VALORADIC = VRTOTAL;
            if (:BASEADIC = 'DESCUENTO') then
                VALORADIC = VRDTO;
            if (:BASEADIC = 'RTFTE') then
                VALORADIC = VRRTFTE;
            if (:BASEADIC = 'RTIVA') then
                VALORADIC = VRRTIVA;
            MONTO = VALORADIC * PORCADIC;
        
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTADIC INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERROR (66, :IDDOC, :CTABASE, 2);
                CUENTA = CTABASE;
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERROR (66, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                EXECUTE PROCEDURE ERROR (66, :IDDOC, :CUENTA, 4);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                if (DBADIC = 'S') then
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                ELSE
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                END
            NROI = NROI + 1;
            END     
        
        if (ERROR > 0) then
            VER = 'S';
        SUSPEND;
        END
    END /* EXISTE LA INTERFAZ */
ELSE
    BEGIN
    EXECUTE PROCEDURE ERROR (64, :IDDOC, :PREF, 1);
    ERROR = ERROR + 1;
    VER = 'S';
    SUSPEND;
    END
END
^

SET TERM ; ^


/* 20100127C */
/* REPLICACION DE ORDENES DE COMPRA Y VENTAS */

INSERT INTO CONFIGURACION (CONF_MODULO, CONF_CATEGORIA, CONF_PROPIEDAD, CONF_VALOR, CONF_POSIBLES, CONF_AYUDA) VALUES ('COMPRAS', 'ORDENES', 'TERCERO PARA REPLICAR ORDEN DE COMPRA COMO PEDIDO EN COMPAÑÍA RELACIONADA', '', '', 'Indique el NIT del tercero para replicar la orden de compra como pedido en una compañía relacionada');
COMMIT WORK;


/* 20100129 */
SET TERM ^ ;

CREATE OR ALTER procedure REP_COMPROBANTES_CAJA_DET (
    TIPO integer,
    FECINI date,
    FECFIN date,
    PREF_INI varchar(4),
    PREF_FIN varchar(4),
    CODCAJA varchar(4),
    ANULADOS char(1),
    SUBEMPRESA integer)
returns (
    NOMTIPO varchar(30),
    CAJA integer,
    NOMCAJA varchar(60),
    PREFIJO varchar(4),
    NUMERO varchar(8),
    FECHA date,
    CONCEPTO varchar(60),
    BENEFICIARIO varchar(60),
    NUMREL varchar(10),
    MONTO numeric(18,2),
    DESCUENTO numeric(18,2),
    RTFTE numeric(18,2),
    RTIVA numeric(18,2),
    RTICA numeric(18,2),
    TIPODOC varchar(8),
    PREFDOC varchar(4),
    NUMDOC varchar(6),
    FECDOC date,
    ANULADO char(1),
    ABONODOC numeric(18,2),
    RTFTEDOC numeric(18,2),
    RTIVADOC numeric(18,2),
    RTICADOC numeric(18,2),
    DSCTODOC numeric(18,2))
AS
declare variable ID INTEGER;
declare variable IDDOC INTEGER;
declare variable IDTIPO INTEGER;
declare variable IDCAJA INTEGER;
declare variable IDCRUCE INTEGER;
BEGIN
if (BIN_AND(TIPO, 1) <> 0) then
    BEGIN
    /* RECIBO CAJA */
    IDCAJA = CAST(CODCAJA AS INTEGER);
    FOR SELECT RECA_ID, TIDO_NOMLARGO, PREF_PRE, RECA_NUMERO, RECA_FECHA, RECA_CONC, RECA_NOMTERC, R.CAJA_ID, CAJA_NOMBRE, RECA_MONTO, RECA_DTOF, RECA_RTFTEMONTO, RECA_RTIVAMONTO, RECA_RTICAMONTO, RECA_ANULADO, RECA_PROVISIONAL
        FROM RECIBOS_CAJA R, TIPO_DOCUMENTO T, CAJAS C
        WHERE C.CAJA_ID = R.CAJA_ID AND T.TIDO_COD = 61 AND RECA_FECHA >= :FECINI AND RECA_FECHA <= :FECFIN AND ((:PREF_INI IS NULL) or (:PREF_INI = '') or (PREF_PRE >= :PREF_INI AND PREF_PRE <=:PREF_FIN)) AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
        ORDER BY RECA_FECHA, RECA_ID
        INTO :ID, :NOMTIPO, :PREFIJO, :NUMERO, :FECHA, :CONCEPTO, :BENEFICIARIO, :CAJA, :NOMCAJA, :MONTO, :DESCUENTO, :RTFTE, :RTIVA, :RTICA, :ANULADO, :numrel
        DO
        if ((IDCAJA = 0) or (IDCAJA = CAJA)) then
            BEGIN
            if ((ANULADOS = 'S') or (ANULADO = 'N')) then
              BEGIN
              if (ANULADO = 'S') then
                BEGIN
                MONTO = 0;
                DESCUENTO = 0;
                RTFTE = 0;
                RTIVA = 0;
                RTICA = 0;
                tipodoc = '';
                prefdoc = '';
                numdoc = '';
                abonodoc = 0;
                rtftedoc = 0;
                rtivadoc = 0;
                rticadoc = 0;
                dsctodoc = 0;
                fecdoc = null;
                SUSPEND;
                END
              ELSE
                BEGIN
                if (numrel is null) then
                    numrel = '';
                FOR SELECT RCDE_TIPODOC, RCDE_IDDOC, TIDO_NOMCORTO, RCDE_PREFIJO, RCDE_NUMERO, RCDE_ABONO, RCDE_RTFTE, RCDE_RTIVA, RCDE_RTICA, RCDE_DTOF
                    FROM RECIBOS_CAJA_DETALLE D, tipo_documento TD
                    WHERE TD.tido_cod = D.rcde_tipodoc AND RECA_ID = :ID
                    ORDER BY RCDE_ITEM
                    INTO :idtipo, :iddoc, :tipodoc, :prefdoc, :numdoc, :abonodoc, :rtftedoc, :rtivadoc, :rticadoc, :dsctodoc
                    DO
                        BEGIN
                        SELECT MVCL_FECHA FROM MOVIMIENTO_CLIENTES WHERE MVCL_TIPOREF = :idtipo AND MVCL_IDREF = :iddoc INTO :fecdoc;
                        SUSPEND;
                        END
                END
              END
            END
    END
if (BIN_AND(TIPO, 2) <> 0) then
    BEGIN
    /* EGRESO */
    FOR SELECT EGRE_ID, TIDO_NOMLARGO, E.PREF_PRE, EGRE_NUMERO, EGRE_FECHA, EGRE_CONC, EGRE_NOMTERC, EGRE_MONTO, EGRE_DTOF, EGRE_RTFTEMONTO, EGRE_RTIVAMONTO, EGRE_RTICAMONTO, EGRE_ANULADO
        FROM EGRESOS E, TIPO_DOCUMENTO T, PREFIJOS P
        WHERE T.TIDO_COD = 62 AND EGRE_FECHA >= :FECINI AND EGRE_FECHA <= :FECFIN AND ((:PREF_INI IS NULL) or (:PREF_INI = '') or (E.PREF_PRE >= :PREF_INI AND E.PREF_PRE <=:PREF_FIN)) AND P.PREF_PRE = E.PREF_PRE AND P.TIDO_COD = 62 AND ((P.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
        ORDER BY EGRE_FECHA, EGRE_ID
        INTO :ID, :NOMTIPO, :PREFIJO, :NUMERO, :FECHA, :CONCEPTO, :BENEFICIARIO, :MONTO, :DESCUENTO, :RTFTE, :RTIVA, :RTICA, :ANULADO
        do
            BEGIN
            if ((ANULADOS = 'S') or (ANULADO = 'N')) then
                BEGIN
                if (ANULADO = 'S') then
                    BEGIN
                    MONTO = 0;
                    DESCUENTO = 0;
                    RTFTE = 0;
                    RTIVA = 0;
                    RTICA = 0;
                    tipodoc = '';
                    prefdoc = '';
                    numdoc = '';
                    abonodoc = 0;
                    rtftedoc = 0;
                    rtivadoc = 0;
                    rticadoc = 0;
                    dsctodoc = 0;
                    fecdoc = null;
                    SUSPEND;
                    END
                ELSE
                    BEGIN
                    if (numrel is null) then
                        numrel = '';
                    FOR SELECT EGDE_TIPODOC, EGDE_IDDOC, TIDO_NOMCORTO, EGDE_PREFIJO, EGDE_NUMERO, EGDE_ABONO, EGDE_RTFTE, EGDE_RTIVA, EGDE_RTICA, EGDE_DTOF
                        FROM EGRESOS_DETALLE D, tipo_documento TD
                        WHERE TD.tido_cod = D.egde_tipodoc AND EGRE_ID = :ID
                        ORDER BY EGDE_ITEM
                        INTO :idtipo, :iddoc, :tipodoc, :prefdoc, :numdoc, :abonodoc, :rtftedoc, :rtivadoc, :rticadoc, :dsctodoc
                        DO
                            BEGIN
                            SELECT MVPR_FECHA FROM movimiento_proveedor WHERE MVPR_TIPOREF = :idtipo AND MVPR_IDREF = :iddoc INTO :fecdoc;
                            SUSPEND;
                            END
                    END
                END
            END
    END
if (BIN_AND(TIPO, 4) <> 0) then
    BEGIN
    IDCAJA = CAST(CODCAJA AS INTEGER);
    NUMREL = '';
    /* CAMBIO DOC */
    FOR SELECT CADO_ID, TIDO_NOMLARGO, PREF_PRE, CADO_NUMERO, CADO_FECHA, CADO_CONC, '', D.CAJA_ID, CAJA_NOMBRE, 0, CADO_ANULADO
        FROM CAMBIO_DOCUMENTOS D, TIPO_DOCUMENTO T, CAJAS C
        WHERE D.CAJA_ID = C.CAJA_ID AND T.TIDO_COD = 63 AND CADO_FECHA >= :FECINI AND CADO_FECHA <= :FECFIN AND ((:PREF_INI IS NULL) or (:PREF_INI = '') or (PREF_PRE >= :PREF_INI AND PREF_PRE <=:PREF_FIN)) AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
        ORDER BY CADO_FECHA, CADO_ID
        INTO :ID, :NOMTIPO, :PREFIJO, :NUMERO, :FECHA, :CONCEPTO, :BENEFICIARIO, :CAJA, :NOMCAJA, :MONTO, :ANULADO
        DO
          if ((IDCAJA = 0) or (IDCAJA = CAJA)) then
            BEGIN
            tipodoc = '';
            prefdoc = '';
            numdoc = '';
            abonodoc = 0;
            rtftedoc = 0;
            rtivadoc = 0;
            rticadoc = 0;
            dsctodoc = 0;
            fecdoc = null;
            if ((ANULADOS = 'S') or (ANULADO = 'N')) then
              if (ANULADO = 'S') then
                BEGIN
                MONTO = 0;
                DESCUENTO = 0;
                RTFTE = 0;
                RTIVA = 0;
                RTICA = 0;
                SUSPEND;
                END
            ELSE
                BEGIN
                SUSPEND;
                END
            END
    END
if (BIN_AND(TIPO, 8) <> 0) then
    BEGIN
    IDCAJA = CAST(CODCAJA AS INTEGER);
    NUMREL = '';
    /* CONSIGNA TARJETAS */
    FOR SELECT COTJ_ID, TIDO_NOMLARGO, PREF_PRE, COTJ_NUMERO, COTJ_FECHA, '', '', J.CAJA_ID, CAJA_NOMBRE, COTJ_ANULADO
        FROM CONSIGNA_TARJETAS J, TIPO_DOCUMENTO T, CAJAS C
        WHERE J.CAJA_ID = C.CAJA_ID AND T.TIDO_COD = 64 AND COTJ_FECHA >= :FECINI AND COTJ_FECHA <= :FECFIN AND ((:PREF_INI IS NULL) or (:PREF_INI = '') or (PREF_PRE >= :PREF_INI AND PREF_PRE <=:PREF_FIN)) AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
        ORDER BY COTJ_FECHA, COTJ_ID
        INTO :ID, :NOMTIPO, :PREFIJO, :NUMERO, :FECHA, :CONCEPTO, :BENEFICIARIO, :CAJA, :NOMCAJA, :ANULADO
        DO
          BEGIN
          SELECT SUM(CTJD_BASE), SUM(CTJD_RTFTEMONTO), SUM(CTJD_RTIVAMONTO), SUM(CTJD_COMIMONTO)
            FROM CONSIGNA_TARJETAS_DET WHERE COTJ_ID = :ID
            INTO :MONTO, :RTFTE, :RTIVA, :DESCUENTO;
          if ((IDCAJA = 0) or (IDCAJA = CAJA)) then
            BEGIN
            tipodoc = '';
            prefdoc = '';
            numdoc = '';
            abonodoc = 0;
            rtftedoc = 0;
            rtivadoc = 0;
            rticadoc = 0;
            dsctodoc = 0;
            fecdoc = null;
            if ((ANULADOS = 'S') or (ANULADO = 'N')) then
              if (ANULADO = 'S') then
                BEGIN
                MONTO = 0;
                DESCUENTO = 0;
                RTFTE = 0;
                RTIVA = 0;
                RTICA = 0;
                SUSPEND;
                END
            ELSE
                BEGIN
                SUSPEND;
                END
            END
          END
    END
if (BIN_AND(TIPO, 16) <> 0) then
    BEGIN
    IDCAJA = CAST(CODCAJA AS INTEGER);
    /* RECIBO PROVISIONAL */
    FOR SELECT RCPR_ID, TIDO_NOMLARGO, PREF_PRE, RCPR_NUMERO, RCPR_FECHA, RCPR_CONC, RCPR_NOMTERC, R.CAJA_ID, CAJA_NOMBRE, RCPR_MONTO, RCPR_DTOF, RCPR_RTFTE, RCPR_RTIVA, RCPR_RTICA, RCPR_ANULADO, RCPR_IDCRUCE
        FROM RECIBO_PROVISIONAL R, TIPO_DOCUMENTO T, CAJAS C
        WHERE C.CAJA_ID = R.CAJA_ID AND T.TIDO_COD = 65 AND RCPR_FECHA >= :FECINI AND RCPR_FECHA <= :FECFIN AND ((:PREF_INI IS NULL) or (:PREF_INI = '') or (PREF_PRE >= :PREF_INI AND PREF_PRE <=:PREF_FIN)) AND ((R.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
        ORDER BY RCPR_FECHA, RCPR_ID
        INTO :ID, :NOMTIPO, :PREFIJO, :NUMERO, :FECHA, :CONCEPTO, :BENEFICIARIO, :CAJA, :NOMCAJA, :MONTO, :DESCUENTO, :RTFTE, :RTIVA, :RTICA, :ANULADO, :IDCRUCE
        DO
        if ((IDCAJA = 0) or (IDCAJA = CAJA)) then
            BEGIN
            if ((ANULADOS = 'S') or (ANULADO = 'N')) then
              if (ANULADO = 'S') then
                BEGIN
                MONTO = 0;
                DESCUENTO = 0;
                RTFTE = 0;
                RTIVA = 0;
                RTICA = 0;
                tipodoc = '';
                prefdoc = '';
                numdoc = '';
                abonodoc = 0;
                rtftedoc = 0;
                rtivadoc = 0;
                rticadoc = 0;
                dsctodoc = 0;
                fecdoc = null;
                SUSPEND;
                END
              ELSE
                BEGIN
                if (IDCRUCE <> 0) then
                    SELECT PREF_PRE || RECA_NUMERO FROM RECIBOS_CAJA WHERE RECA_ID = :idcruce INTO :NUMREL;
                else
                    NUMREL = '';
                FOR SELECT RPDE_TIPODOC, RPDE_IDDOC, TIDO_NOMCORTO, RPDE_PREFDOC, RPDE_NUMDOC, RPDE_ABONO, RPDE_RTFTE, RPDE_RTIVA, RPDE_RTICA, RPDE_DTOF
                    FROM recibo_provisional_detalle D, tipo_documento TD
                    WHERE TD.tido_cod = D.rpde_tipodoc AND RCPR_ID = :ID
                    ORDER BY RPDE_ITEM
                    INTO :idtipo, :iddoc, :tipodoc, :prefdoc, :numdoc, :abonodoc, :rtftedoc, :rtivadoc, :rticadoc, :dsctodoc
                    DO
                        BEGIN
                        SELECT MVCL_FECHA FROM MOVIMIENTO_CLIENTES WHERE MVCL_TIPOREF = :idtipo AND MVCL_IDREF = :iddoc INTO :fecdoc;
                        SUSPEND;
                        END
                END
            END
    END
if (BIN_AND(TIPO, 32) <> 0) then
    BEGIN
    IDCAJA = CAST(CODCAJA AS INTEGER);
    NUMREL = '';
    /* TRASLADOS */
    FOR SELECT TRCJ_ID, TIDO_NOMLARGO, PREF_PRE, TRCJ_NUMERO, TRCJ_FECHA, TRCJ_CONC, C2.CAJA_NOMBRE, C.CAJA_ID, C.CAJA_NOMBRE, TRCJ_ANULADO
        FROM TRASLADOS_CAJA TR, TIPO_DOCUMENTO T, CAJAS C, CAJAS C2
        WHERE TR.CAJA_ID = C.CAJA_ID AND T.TIDO_COD = 66 AND TRCJ_FECHA >= :FECINI AND TRCJ_FECHA <= :FECFIN AND C2.CAJA_ID = TRCJ_DESTINO AND ((:PREF_INI IS NULL) or (:PREF_INI = '') or (PREF_PRE >= :PREF_INI AND PREF_PRE <=:PREF_FIN)) AND ((C.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
        ORDER BY TRCJ_FECHA, TRCJ_ID
        INTO :ID, :NOMTIPO, :PREFIJO, :NUMERO, :FECHA, :CONCEPTO, :BENEFICIARIO, :CAJA, :NOMCAJA, :ANULADO
        DO
        if ((IDCAJA = 0) or (IDCAJA = CAJA)) then
            BEGIN
            if ((ANULADOS = 'S') or (ANULADO = 'N')) then
              if (ANULADO = 'S') then
                BEGIN
                MONTO = 0;
                DESCUENTO = 0;
                RTFTE = 0;
                RTIVA = 0;
                RTICA = 0;
                tipodoc = '';
                prefdoc = '';
                numdoc = '';
                abonodoc = 0;
                rtftedoc = 0;
                rtivadoc = 0;
                rticadoc = 0;
                dsctodoc = 0;
                fecdoc = null;
                SUSPEND;
                END
              ELSE
                BEGIN
                SUSPEND;
                END
            END
    END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure REP_COMPROBANTES_CAJA_ART (
    TIPO integer,
    FECINI date,
    FECFIN date,
    PREF_INI varchar(4),
    PREF_FIN varchar(4),
    CODCAJA varchar(4),
    ANULADOS char(1),
    SUBEMPRESA integer)
returns (
    NOMTIPO varchar(30),
    CAJA integer,
    NOMCAJA varchar(60),
    PREFIJO varchar(4),
    NUMERO varchar(8),
    FECHA date,
    CONCEPTO varchar(60),
    BENEFICIARIO varchar(60),
    NUMREL varchar(10),
    MONTO numeric(18,2),
    DESCUENTO numeric(18,2),
    RTFTE numeric(18,2),
    RTIVA numeric(18,2),
    RTICA numeric(18,2),
    ANULADO char(1),
    TIPODOC varchar(8),
    PREFDOC varchar(4),
    NUMDOC varchar(6),
    GRUPO varchar(2),
    NOMGRUPO VARCHAR(60),
    MONTOG numeric(18,2))
AS
declare variable ID INTEGER;
declare variable IDDOC INTEGER;
declare variable IDTIPO INTEGER;
declare variable IDCAJA INTEGER;
declare variable IDCRUCE INTEGER;
declare variable MONTODOC NUMERIC(18,2);
declare variable ABONO NUMERIC(18,2);
BEGIN
if (BIN_AND(TIPO, 1) <> 0) then
    BEGIN
    /* RECIBO CAJA */
    IDCAJA = CAST(CODCAJA AS INTEGER);
    FOR SELECT RECA_ID, TIDO_NOMLARGO, PREF_PRE, RECA_NUMERO, RECA_FECHA, RECA_CONC, RECA_NOMTERC, R.CAJA_ID, CAJA_NOMBRE, RECA_MONTO, RECA_DTOF, RECA_RTFTEMONTO, RECA_RTIVAMONTO, RECA_RTICAMONTO, RECA_ANULADO, RECA_PROVISIONAL
        FROM RECIBOS_CAJA R, TIPO_DOCUMENTO T, CAJAS C
        WHERE C.CAJA_ID = R.CAJA_ID AND T.TIDO_COD = 61 AND RECA_FECHA >= :FECINI AND RECA_FECHA <= :FECFIN AND ((:PREF_INI IS NULL) or (:PREF_INI = '') or (PREF_PRE >= :PREF_INI AND PREF_PRE <=:PREF_FIN)) AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
        ORDER BY RECA_FECHA, RECA_ID
        INTO :ID, :NOMTIPO, :PREFIJO, :NUMERO, :FECHA, :CONCEPTO, :BENEFICIARIO, :CAJA, :NOMCAJA, :MONTO, :DESCUENTO, :RTFTE, :RTIVA, :RTICA, :ANULADO, :numrel
        DO
        if ((IDCAJA = 0) or (IDCAJA = CAJA)) then
            BEGIN
            if ((ANULADOS = 'S') or (ANULADO = 'N')) then
              BEGIN
              if (ANULADO = 'S') then
                BEGIN
                MONTO = 0;
                DESCUENTO = 0;
                RTFTE = 0;
                RTIVA = 0;
                RTICA = 0;
                tipodoc = '';
                GRUPO = '';
                MONTOG = 0;
                SUSPEND;
                END
              ELSE
                BEGIN
                if (numrel is null) then
                    numrel = '';
                FOR SELECT RCDE_TIPODOC, RCDE_IDDOC, TIDO_NOMCORTO, RCDE_ABONO, RCDE_PREFIJO, RCDE_NUMERO
                    FROM RECIBOS_CAJA_DETALLE D, tipo_documento TD
                    WHERE TD.tido_cod = D.rcde_tipodoc AND RECA_ID = :ID
                    ORDER BY RCDE_ITEM
                    INTO :idtipo, :iddoc, :tipodoc, :ABONO, :PREFDOC, :NUMDOC
                    DO
                        BEGIN
                        SELECT MVCL_MONTO FROM movimiento_clientes
                            WHERE MVCL_TIPOREF = :idtipo AND MVCL_IDREF = :iddoc INTO :MONTODOC;

                        if (IDTIPO = 31) then
                            FOR SELECT MAX(A.grup_cod), SUM(FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO)
                                FROM FACTURAS_DETALLE FD, ARTICULO A
                                WHERE FACT_ID = :iddoc AND FD.arti_cod = A.arti_cod
                                GROUP BY A.grup_cod
                                INTO :GRUPO, :MONTOG
                                DO
                                BEGIN
                                SELECT GRUP_NOM FROM GRUPO WHERE GRUP_COD = :grupo INTO :nomgrupo;
                                MONTOG = MONTOG / MONTODOC * ABONO;
                                SUSPEND;
                                END
                        ELSE
                            if (IDTIPO = 33) then
                                BEGIN
                                FOR SELECT MAX(A.grup_cod), SUM(DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO)
                                    FROM devoluciones_ventas_detalle DD, ARTICULO A
                                    WHERE DEVT_ID = :iddoc AND DD.arti_cod = A.arti_cod
                                    GROUP BY A.grup_cod
                                    INTO :GRUPO, :MONTOG
                                    DO
                                    BEGIN
                                    SELECT GRUP_NOM FROM GRUPO WHERE GRUP_COD = :grupo INTO :nomgrupo;
                                    MONTOG = MONTOG * -1;
                                    MONTOG = MONTOG / MONTODOC * ABONO;
                                    SUSPEND;
                                    END
                                END
                            ELSE
                                BEGIN
                                GRUPO = '00';
                                NOMGRUPO = 'SIN GRUPO';
                                MONTOG = ABONO;
                                SUSPEND;
                                END
                        END
                END
              END
            END
    END
if (BIN_AND(TIPO, 2) <> 0) then
    BEGIN
    /* EGRESO */
    FOR SELECT EGRE_ID, TIDO_NOMLARGO, E.PREF_PRE, EGRE_NUMERO, EGRE_FECHA, EGRE_CONC, EGRE_NOMTERC, EGRE_MONTO, EGRE_DTOF, EGRE_RTFTEMONTO, EGRE_RTIVAMONTO, EGRE_RTICAMONTO, EGRE_ANULADO
        FROM EGRESOS E, TIPO_DOCUMENTO T, PREFIJOS P
        WHERE T.TIDO_COD = 62 AND EGRE_FECHA >= :FECINI AND EGRE_FECHA <= :FECFIN AND ((:PREF_INI IS NULL) or (:PREF_INI = '') or (E.PREF_PRE >= :PREF_INI AND E.PREF_PRE <=:PREF_FIN)) AND P.PREF_PRE = E.PREF_PRE AND P.TIDO_COD = 62 AND ((P.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
        ORDER BY EGRE_FECHA, EGRE_ID
        INTO :ID, :NOMTIPO, :PREFIJO, :NUMERO, :FECHA, :CONCEPTO, :BENEFICIARIO, :MONTO, :DESCUENTO, :RTFTE, :RTIVA, :RTICA, :ANULADO
        do
            BEGIN
            if ((ANULADOS = 'S') or (ANULADO = 'N')) then
                BEGIN
                if (ANULADO = 'S') then
                    BEGIN
                    MONTO = 0;
                    DESCUENTO = 0;
                    RTFTE = 0;
                    RTIVA = 0;
                    RTICA = 0;
                    tipodoc = '';
                    GRUPO = '';
                    MONTOG = 0;
                    SUSPEND;
                    END
                ELSE
                    BEGIN
                if (numrel is null) then
                    numrel = '';
                FOR SELECT EGDE_TIPODOC, EGDE_IDDOC, TIDO_NOMCORTO, EGDE_ABONO, EGDE_PREFIJO, EGDE_NUMERO
                    FROM egresos_detalle D, tipo_documento TD
                    WHERE TD.tido_cod = D.egde_tipodoc AND EGRE_ID = :ID
                    ORDER BY EGDE_ITEM
                    INTO :idtipo, :iddoc, :tipodoc, :ABONO, :PREFDOC, :NUMDOC
                    DO
                        BEGIN
                        SELECT MVPR_MONTO FROM movimiento_proveedor
                            WHERE MVPR_TIPOREF = :idtipo AND MVPR_IDREF = :iddoc INTO :MONTODOC;

                        if (IDTIPO = 21) then
                            FOR SELECT MAX(A.grup_cod), SUM(FCDE_TOTAL-FCDE_IVAMONTO-FCDE_CONSUMO)
                                FROM facturas_compras_detalle FD, ARTICULO A
                                WHERE FACO_ID = :iddoc AND FD.arti_cod = A.arti_cod
                                GROUP BY A.grup_cod
                                INTO :GRUPO, :MONTOG
                                DO
                                BEGIN
                                SELECT GRUP_NOM FROM GRUPO WHERE GRUP_COD = :grupo INTO :nomgrupo;
                                MONTOG = MONTOG / MONTODOC * ABONO;
                                SUSPEND;
                                END
                        ELSE
                            if (IDTIPO = 24) then
                                BEGIN
                                FOR SELECT MAX(A.grup_cod), SUM(DVCD_TOTAL-DVCD_IVAMONTO-DVCD_CONSUMO)
                                    FROM devoluciones_compras_det DD, ARTICULO A
                                    WHERE DVCO_ID = :iddoc AND DD.arti_cod = A.arti_cod
                                    GROUP BY A.grup_cod
                                    INTO :GRUPO, :MONTOG
                                    DO
                                    BEGIN
                                    SELECT GRUP_NOM FROM GRUPO WHERE GRUP_COD = :grupo INTO :nomgrupo;
                                    MONTOG = MONTOG * -1;
                                    MONTOG = MONTOG / MONTODOC * ABONO;
                                    SUSPEND;
                                    END
                                END
                            ELSE
                                BEGIN
                                MONTOG = ABONO;
                                GRUPO = '00';
                                NOMGRUPO = 'SIN GRUPO';
                                SUSPEND;
                                END
                        END
                    END
                END
            END
    END
if (BIN_AND(TIPO, 4) <> 0) then
    BEGIN
    IDCAJA = CAST(CODCAJA AS INTEGER);
    NUMREL = '';
    /* CAMBIO DOC */
    FOR SELECT CADO_ID, TIDO_NOMLARGO, PREF_PRE, CADO_NUMERO, CADO_FECHA, CADO_CONC, '', D.CAJA_ID, CAJA_NOMBRE, 0, CADO_ANULADO
        FROM CAMBIO_DOCUMENTOS D, TIPO_DOCUMENTO T, CAJAS C
        WHERE D.CAJA_ID = C.CAJA_ID AND T.TIDO_COD = 63 AND CADO_FECHA >= :FECINI AND CADO_FECHA <= :FECFIN AND ((:PREF_INI IS NULL) or (:PREF_INI = '') or (PREF_PRE >= :PREF_INI AND PREF_PRE <=:PREF_FIN)) AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
        ORDER BY CADO_FECHA, CADO_ID
        INTO :ID, :NOMTIPO, :PREFIJO, :NUMERO, :FECHA, :CONCEPTO, :BENEFICIARIO, :CAJA, :NOMCAJA, :MONTO, :ANULADO
        DO
          if ((IDCAJA = 0) or (IDCAJA = CAJA)) then
            BEGIN
            tipodoc = '';
            if ((ANULADOS = 'S') or (ANULADO = 'N')) then
              if (ANULADO = 'S') then
                BEGIN
                MONTO = 0;
                DESCUENTO = 0;
                RTFTE = 0;
                RTIVA = 0;
                RTICA = 0;
                SUSPEND;
                END
            ELSE
                BEGIN
                GRUPO = '00';
                SELECT MVPR_MONTO FROM movimiento_proveedor
                    WHERE MVPR_TIPOREF = :idtipo AND MVPR_IDREF = :iddoc INTO :MONTOG;
                SUSPEND;
                END
            END
    END
if (BIN_AND(TIPO, 8) <> 0) then
    BEGIN
    IDCAJA = CAST(CODCAJA AS INTEGER);
    NUMREL = '';
    /* CONSIGNA TARJETAS */
    FOR SELECT COTJ_ID, TIDO_NOMLARGO, PREF_PRE, COTJ_NUMERO, COTJ_FECHA, '', '', J.CAJA_ID, CAJA_NOMBRE, COTJ_ANULADO
        FROM CONSIGNA_TARJETAS J, TIPO_DOCUMENTO T, CAJAS C
        WHERE J.CAJA_ID = C.CAJA_ID AND T.TIDO_COD = 64 AND COTJ_FECHA >= :FECINI AND COTJ_FECHA <= :FECFIN AND ((:PREF_INI IS NULL) or (:PREF_INI = '') or (PREF_PRE >= :PREF_INI AND PREF_PRE <=:PREF_FIN)) AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
        ORDER BY COTJ_FECHA, COTJ_ID
        INTO :ID, :NOMTIPO, :PREFIJO, :NUMERO, :FECHA, :CONCEPTO, :BENEFICIARIO, :CAJA, :NOMCAJA, :ANULADO
        DO
          BEGIN
          SELECT SUM(CTJD_BASE), SUM(CTJD_RTFTEMONTO), SUM(CTJD_RTIVAMONTO), SUM(CTJD_COMIMONTO)
            FROM CONSIGNA_TARJETAS_DET WHERE COTJ_ID = :ID
            INTO :MONTO, :RTFTE, :RTIVA, :DESCUENTO;
          if ((IDCAJA = 0) or (IDCAJA = CAJA)) then
            BEGIN
            tipodoc = '';
            if ((ANULADOS = 'S') or (ANULADO = 'N')) then
              if (ANULADO = 'S') then
                BEGIN
                MONTO = 0;
                DESCUENTO = 0;
                RTFTE = 0;
                RTIVA = 0;
                RTICA = 0;
                SUSPEND;
                END
            ELSE
                BEGIN
                GRUPO = '00';
                SELECT MVPR_MONTO FROM movimiento_proveedor
                    WHERE MVPR_TIPOREF = :idtipo AND MVPR_IDREF = :iddoc INTO :MONTOG;
                SUSPEND;
                END
            END
          END
    END
if (BIN_AND(TIPO, 16) <> 0) then
    BEGIN
    IDCAJA = CAST(CODCAJA AS INTEGER);
    /* RECIBO PROVISIONAL */
    FOR SELECT RCPR_ID, TIDO_NOMLARGO, PREF_PRE, RCPR_NUMERO, RCPR_FECHA, RCPR_CONC, RCPR_NOMTERC, R.CAJA_ID, CAJA_NOMBRE, RCPR_MONTO, RCPR_DTOF, RCPR_RTFTE, RCPR_RTIVA, RCPR_RTICA, RCPR_ANULADO, RCPR_IDCRUCE
        FROM RECIBO_PROVISIONAL R, TIPO_DOCUMENTO T, CAJAS C
        WHERE C.CAJA_ID = R.CAJA_ID AND T.TIDO_COD = 65 AND RCPR_FECHA >= :FECINI AND RCPR_FECHA <= :FECFIN AND ((:PREF_INI IS NULL) or (:PREF_INI = '') or (PREF_PRE >= :PREF_INI AND PREF_PRE <=:PREF_FIN)) AND ((R.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
        ORDER BY RCPR_FECHA, RCPR_ID
        INTO :ID, :NOMTIPO, :PREFIJO, :NUMERO, :FECHA, :CONCEPTO, :BENEFICIARIO, :CAJA, :NOMCAJA, :MONTO, :DESCUENTO, :RTFTE, :RTIVA, :RTICA, :ANULADO, :IDCRUCE
        DO
        if ((IDCAJA = 0) or (IDCAJA = CAJA)) then
            BEGIN
            if ((ANULADOS = 'S') or (ANULADO = 'N')) then
              if (ANULADO = 'S') then
                BEGIN
                MONTO = 0;
                DESCUENTO = 0;
                RTFTE = 0;
                RTIVA = 0;
                RTICA = 0;
                tipodoc = '';
                GRUPO = '';
                MONTOG = 0;
                SUSPEND;
                END
              ELSE
                BEGIN
                if (IDCRUCE <> 0) then
                    SELECT PREF_PRE || RECA_NUMERO FROM RECIBOS_CAJA WHERE RECA_ID = :idcruce INTO :NUMREL;
                else
                    NUMREL = '';
                if (numrel is null) then
                    numrel = '';
                FOR SELECT RPDE_TIPODOC, RPDE_IDDOC, TIDO_NOMCORTO, RPDE_ABONO, RPDE_PREFDOC, RPDE_NUMDOC
                    FROM recibo_provisional_detalle D, tipo_documento TD
                    WHERE TD.tido_cod = D.rpde_tipodoc AND RCPR_ID = :ID
                    ORDER BY RPDE_ITEM
                    INTO :idtipo, :iddoc, :tipodoc, :ABONO, :PREFDOC, :NUMDOC
                    DO
                        BEGIN
                        SELECT MVCL_MONTO FROM movimiento_clientes
                            WHERE MVCL_TIPOREF = :idtipo AND MVCL_IDREF = :iddoc INTO :MONTODOC;

                        if (IDTIPO = 31) then
                            FOR SELECT MAX(A.grup_cod), SUM(FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO)
                                FROM FACTURAS_DETALLE FD, ARTICULO A
                                WHERE FACT_ID = :iddoc AND FD.arti_cod = A.arti_cod
                                GROUP BY A.grup_cod
                                INTO :GRUPO, :MONTOG
                                DO
                                BEGIN
                                SELECT GRUP_NOM FROM GRUPO WHERE GRUP_COD = :grupo INTO :nomgrupo;
                                MONTOG = MONTOG / MONTODOC * ABONO;
                                SUSPEND;
                                END
                        ELSE
                            if (IDTIPO = 33) then
                                BEGIN
                                FOR SELECT MAX(A.grup_cod), SUM(DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO)
                                    FROM devoluciones_ventas_detalle DD, ARTICULO A
                                    WHERE DEVT_ID = :iddoc AND DD.arti_cod = A.arti_cod
                                    GROUP BY A.grup_cod
                                    INTO :GRUPO, :MONTOG
                                    DO
                                    BEGIN
                                    SELECT GRUP_NOM FROM GRUPO WHERE GRUP_COD = :grupo INTO :nomgrupo;
                                    MONTOG = MONTOG * -1;
                                    MONTOG = MONTOG / MONTODOC * ABONO;
                                    SUSPEND;
                                    END
                                END
                            ELSE
                                BEGIN
                                GRUPO = '00';
                                NOMGRUPO = 'SIN GRUPO';
                                MONTOG = ABONO;
                                SUSPEND;
                                END
                        END
                END
            END
    END
if (BIN_AND(TIPO, 32) <> 0) then
    BEGIN
    IDCAJA = CAST(CODCAJA AS INTEGER);
    NUMREL = '';
    /* TRASLADOS */
    FOR SELECT TRCJ_ID, TIDO_NOMLARGO, PREF_PRE, TRCJ_NUMERO, TRCJ_FECHA, TRCJ_CONC, C2.CAJA_NOMBRE, C.CAJA_ID, C.CAJA_NOMBRE, TRCJ_ANULADO
        FROM TRASLADOS_CAJA TR, TIPO_DOCUMENTO T, CAJAS C, CAJAS C2
        WHERE TR.CAJA_ID = C.CAJA_ID AND T.TIDO_COD = 66 AND TRCJ_FECHA >= :FECINI AND TRCJ_FECHA <= :FECFIN AND C2.CAJA_ID = TRCJ_DESTINO AND ((:PREF_INI IS NULL) or (:PREF_INI = '') or (PREF_PRE >= :PREF_INI AND PREF_PRE <=:PREF_FIN)) AND ((C.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
        ORDER BY TRCJ_FECHA, TRCJ_ID
        INTO :ID, :NOMTIPO, :PREFIJO, :NUMERO, :FECHA, :CONCEPTO, :BENEFICIARIO, :CAJA, :NOMCAJA, :ANULADO
        DO
        if ((IDCAJA = 0) or (IDCAJA = CAJA)) then
            BEGIN
            if ((ANULADOS = 'S') or (ANULADO = 'N')) then
              if (ANULADO = 'S') then
                BEGIN
                MONTO = 0;
                DESCUENTO = 0;
                RTFTE = 0;
                RTIVA = 0;
                RTICA = 0;
                tipodoc = '';
                GRUPO = '';
                MONTOG = 0;
                SUSPEND;
                END
              ELSE
                BEGIN
                GRUPO = '00';
                SELECT MVPR_MONTO FROM movimiento_proveedor
                    WHERE MVPR_TIPOREF = :idtipo AND MVPR_IDREF = :iddoc INTO :MONTOG;
                SUSPEND;
                END
            END
    END
END
^

SET TERM ; ^


grant EXECUTE on PROCEDURE rep_comprobantes_caja_DET to PUBLIC;
grant EXECUTE on PROCEDURE rep_comprobantes_caja_ART to PUBLIC;

/* 20100131: AVECES REPETIA REGISRTOS POR EL JOIN? */

SET TERM ^ ;

CREATE OR ALTER procedure REP_DOCUMENTOS_CLIENTE (
    TIPO integer,
    FECINI date,
    FECFIN date,
    DESDE varchar(20),
    HASTA varchar(20),
    GRPINI varchar(2),
    GRPFIN varchar(2),
    DETALLE char(1),
    ORDEN char(1),
    AGRUPA char(1),
    SUBEMPRESA integer)
returns (
    PREF varchar(4),
    NUMERO varchar(6),
    FECHA date,
    VENCE date,
    CONCEPTO varchar(60),
    NIT varchar(20),
    NOMBRE varchar(60),
    DV char(1),
    DIR varchar(60),
    CIUDAD varchar(40),
    TELEFONO varchar(40),
    CONTACTO varchar(60),
    FAX varchar(25),
    CEL varchar(25),
    EMAIL varchar(100),
    ITEM integer,
    TIPODOC varchar(8),
    PREFDOC varchar(4),
    NUMDOC varchar(6),
    ABONO numeric(18,2),
    MONTO numeric(18,2),
    IVAPORC numeric(9,2),
    IVAMONTO numeric(18,2),
    RTFTEPORC numeric(9,2),
    RTFTEMONTO numeric(18,2),
    RTIVAPORC numeric(9,2),
    RTIVAMONTO numeric(18,2),
    RTICAPORC numeric(9,2),
    RTICAMONTO numeric(18,2),
    DTOFECHA date,
    DTOPORC numeric(9,2),
    DTOMONTO numeric(18,2),
    TOTAL numeric(18,2),
    NETO numeric(18,2),
    CODZONA varchar(2),
    NOMZONA varchar(60),
    CODCIUD varchar(5),
    NOMCIUD varchar(60),
    CODCOBR integer,
    NOMCOBR varchar(60),
    ANULADO char(1))
AS
declare variable NITINI VARCHAR(20);
declare variable NITFIN VARCHAR(20);
declare variable NOMINI VARCHAR(20);
declare variable NOMFIN VARCHAR(20);
declare variable OK CHAR(1);
BEGIN
if (ORDEN = 'C') then
    BEGIN
    NITINI = DESDE;
    NITFIN = HASTA;
    NOMINI = '';
    NOMFIN = 'zz';
    END
ELSE
    BEGIN
    NOMINI = DESDE;
    NOMFIN = HASTA;
    NITINI = '';
    NITFIN = 'zz';
    END
  /* Ubique el NIT */
FOR select T.TERC_NIT, TERC_NOM, TERC_DV, TERC_DIR, TERC_TEL, TERC_CIU, TERC_CONTACTO,
    TERC_FAX, TERC_CEL, TERC_EMAIL, C.COBR_COD, C.ZONA_COD, T.CIUD_COD
    from terceros T, CLIENTES C
    where C.TERC_NIT = T.TERC_NIT AND TERC_CLIE = 'S' AND T.TERC_NIT >= :NITINI AND T.TERC_NIT <= :NITFIN AND
        TERC_NOM >= :NOMINI AND TERC_NOM <= :NOMFIN
    INTO :NIT, :NOMBRE, :DV, :DIR, :TELEFONO, :CIUDAD, :CONTACTO,
        :fax, :cel,  :email, :codcobr, :CODZONA, :CODCIUD
    DO  
    BEGIN
    OK = 'N';
    if (AGRUPA = 'Z') then
        BEGIN
        if (GRPINI = '') then
            BEGIN
            if ((CODZONA IS NULL) or (CODZONA >= :GRPINI AND CODZONA <= :GRPFIN)) then
                OK = 'S';
            END
        ELSE
            if (CODZONA >= :GRPINI AND CODZONA <= :GRPFIN) then
                OK = 'S';
        END
    if (AGRUPA = 'C') then
        BEGIN
        if (GRPINI = '') then
            BEGIN
            if ((CODCOBR IS NULL) or (CODCOBR >= :GRPINI AND CODCOBR <= :GRPFIN)) then
                OK = 'S';
            END
        ELSE
            if (CODCOBR >= :GRPINI AND CODCOBR <= :GRPFIN) then
                OK = 'S';
        END
    if (AGRUPA = 'I') then
        BEGIN
        if (GRPINI = '') then
            BEGIN
            if ((CODCIUD IS NULL) or (CODCIUD >= :GRPINI AND CODCIUD <= :GRPFIN)) then
                OK = 'S';
            END
        ELSE
            if (CODCIUD >= :GRPINI AND CODCIUD <= :GRPFIN) then
                OK = 'S';
        END
    if (AGRUPA = 'N') then
        OK = 'S';
        
    if (OK = 'S') then
        BEGIN
        NOMCOBR = '';
        NOMZONA = '';
        NOMCIUD = '';
        select COBR_NOM from COBRADORES where COBR_COD = :codcobr into :NOMCOBR;
        select ZONA_NOM from ZONAS where ZONA_COD = :codzona into :nomzona;
        select CIUD_NOM FROM CIUDADES WHERE CIUD_COD = :codciud INTO :nomciud;

        /* DETERMINE LA TABLA A EXAMINAR */
        if (TIPO = 41) then
            BEGIN
            FOR SELECT N.PREF_PRE, NDCL_NUMERO, NDCL_FECHA, NDCL_CONC, NDCL_VENCE, NDCL_MONTO, NDCL_IVAPORC, NDCL_IVAMONTO,
                NDCL_RTFTEPORC, NDCL_RTFTEMONTO, NDCL_RTIVAPORC, NDCL_RTIVAMONTO, NDCL_RTICAPORC, NDCL_RTICAMONTO, NDCL_ANULADO, NDCL_FECHADTO, NDCL_DTOFPORC, NDCL_DTOFMONTO
                FROM NOTAS_DEBITO_CLIENTES N, PREFIJOS P
                WHERE TERC_NIT = :NIT AND NDCL_FECHA >= :FECINI AND NDCL_FECHA <= :FECFIN AND
                 P.PREF_PRE = N.PREF_PRE AND P.TIDO_COD = 41 AND ((P.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                INTO :PREF, :NUMERO, :FECHA, :CONCEPTO, :VENCE, :MONTO, :IVAPORC, :IVAMONTO, :RTFTEPORC, :RTFTEMONTO, :RTIVAPORC, :RTIVAMONTO, :RTICAPORC, :RTICAMONTO, :ANULADO, :DTOFECHA, :DTOPORC, :DTOMONTO
                DO
                    BEGIN
                    TOTAL = MONTO + IVAMONTO;
                    NETO = TOTAL - RTFTEMONTO - RTIVAMONTO - RTICAMONTO;
                    SUSPEND;
                    END
            END
        if (TIPO = 42) then
            BEGIN
            FOR SELECT N.PREF_PRE, NCCL_NUMERO, NCCL_FECHA, NCCL_CONC, NCCL_MONTO, NCCL_IVAPORC, NCCL_IVAMONTO,
                NCCL_RTFTEPORC, NCCL_RTFTEMONTO, NCCL_RTIVAPORC, NCCL_RTIVAMONTO, NCCL_RTICAPORC, NCCL_RTICAMONTO, NCCL_ANULADO, NCCL_FECHA, 0, 0
                FROM NOTAS_CREDITO_CLIENTES N, PREFIJOS P
                WHERE TERC_NIT = :NIT AND NCCL_FECHA >= :FECINI AND NCCL_FECHA <= :FECFIN AND
                 P.PREF_PRE = N.PREF_PRE AND P.TIDO_COD = 42 AND ((P.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                INTO :PREF, :NUMERO, :FECHA, :CONCEPTO, :MONTO, :IVAPORC, :IVAMONTO, :RTFTEPORC, :RTFTEMONTO, :RTIVAPORC, :RTIVAMONTO, :RTICAPORC, :RTICAMONTO, :ANULADO, :DTOFECHA, :DTOPORC, :DTOMONTO
                DO
                    BEGIN
                    TOTAL = MONTO + IVAMONTO;
                    NETO = TOTAL - RTFTEMONTO - RTIVAMONTO - RTICAMONTO;
                    SUSPEND;
                    END
            END
        if (TIPO = 43) then
            BEGIN
            if (DETALLE = 'S') then
                BEGIN
                FOR SELECT A.PREF_PRE, APCL_NUMERO, APCL_FECHA, APCL_CONCEPTO, ACDE_ITEM, TIDO_NOMCORTO, ACDE_PREFIJO, ACDE_NUMERO,
                    ACDE_APLICADO, ACDE_RTFTE, ACDE_RTIVA, ACDE_RTICA, APCL_ANULADO, APCL_FECHA, 0, 0
                    FROM APLICACION_CLIENTE A, APLICACION_CLIENTE_DETALLE D, TIPO_DOCUMENTO T, PREFIJOS P
                    WHERE A.TERC_NIT = :NIT AND A.APCL_ID = D.APCL_ID AND ACDE_TIPODOC = T.TIDO_COD AND APCL_FECHA >= :FECINI AND APCL_FECHA <= :FECFIN AND
                     P.PREF_PRE = A.PREF_PRE AND P.TIDO_COD = 43 AND ((P.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                    INTO :PREF, :NUMERO, :FECHA, :CONCEPTO, :ITEM, :TIPODOC, :PREFDOC, :NUMDOC, :ABONO, :RTFTEMONTO, :RTIVAMONTO, :RTICAMONTO, :ANULADO, :DTOFECHA, :DTOPORC, :DTOMONTO
                    DO
                        BEGIN
                        TOTAL = ABONO + IVAMONTO;
                        NETO = TOTAL - RTFTEMONTO - RTIVAMONTO - RTICAMONTO;
                        SUSPEND;
                        END
                END
            ELSE
                BEGIN
                FOR SELECT MAX(A.PREF_PRE), MAX(APCL_NUMERO), MAX(APCL_FECHA), MAX(APCL_CONCEPTO), SUM(ACDE_APLICADO), SUM(ACDE_RTFTE),
                    SUM(ACDE_RTIVA), SUM(ACDE_RTICA), MAX(APCL_ANULADO), MAX(APCL_FECHA), 0, 0
                    FROM APLICACION_CLIENTE A, APLICACION_CLIENTE_DETALLE D, TIPO_DOCUMENTO T, PREFIJOS P
                    WHERE A.TERC_NIT = :NIT AND A.APCL_ID = D.APCL_ID AND ACDE_TIPODOC = T.TIDO_COD AND APCL_FECHA >= :FECINI AND APCL_FECHA <= :FECFIN AND
                     P.PREF_PRE = A.PREF_PRE AND P.TIDO_COD = 43 AND ((P.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                    GROUP BY A.APCL_ID
                    INTO :PREF, :NUMERO, :FECHA, :CONCEPTO, :MONTO, :RTFTEMONTO, :RTIVAMONTO, :RTICAMONTO, :ANULADO, :DTOFECHA, :DTOPORC, :DTOMONTO
                    DO
                        BEGIN
                        TOTAL = MONTO + IVAMONTO;
                        NETO = TOTAL - RTFTEMONTO - RTIVAMONTO - RTICAMONTO;
                        SUSPEND;
                        END
                    END
            END
        if (TIPO = 45) then
            BEGIN
            FOR SELECT A.PREF_PRE, ANCL_NUMERO, ANCL_FECHA, ANCL_CONC, ANCL_BASE,
                ANCL_IVAPORC, ANCL_IVAMONTO, ANCL_RTFTEPORC, ANCL_RTFTEMONTO, ANCL_RTIVAPORC, ANCL_RTIVAMONTO, ANCL_RTICAPORC, ANCL_RTICAMONTO, ANCL_ANULADO, ANCL_FECHA, 0, 0
                FROM ANTICIPOS_CLIENTE A, PREFIJOS P
                WHERE A.TERC_NIT = :NIT AND ANCL_FECHA >= :FECINI AND ANCL_FECHA <= :FECFIN AND
                 P.PREF_PRE = A.PREF_PRE AND P.TIDO_COD = 45 AND ((P.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                INTO :PREF, :NUMERO, :FECHA, :CONCEPTO, :MONTO, :IVAPORC, :IVAMONTO, :RTFTEPORC, :RTFTEMONTO, :RTIVAPORC, :RTIVAMONTO, :RTICAPORC, :RTICAMONTO, :ANULADO, :DTOFECHA, :DTOPORC, :DTOMONTO
                DO
                    BEGIN
                    TOTAL = MONTO + IVAMONTO;
                    NETO = TOTAL - RTFTEMONTO - RTIVAMONTO - RTICAMONTO;
                    SUSPEND;
                    END
            END
        END /* OK */
    END /* FOR NIT */
END
^

SET TERM ; ^


/* 20100204 */
/* AGREGAR PRECIO DE LISTA PARA COMPARAR CON LA UTILIDAD ESPERADA */
SET TERM ^ ;

CREATE OR ALTER procedure REP_UTILIDAD_VENDEDOR (
    TIPO integer,
    DETALLE char(1),
    VENINI varchar(20),
    VENFIN varchar(20),
    FECINI date,
    FECFIN date,
    ARTINI varchar(15),
    ARTFIN varchar(15),
    ORDEN char(1),
    CEROS char(1),
    SUBEMPRESA integer)
returns (
    CODVEND varchar(20),
    NOMVEND varchar(60),
    NOMTIPO varchar(50),
    ARTICULO varchar(15),
    DESCRIPCION varchar(60),
    CODGRUPO varchar(2),
    NOMGRUPO varchar(30),
    CODSUBG varchar(3),
    NOMSUBG varchar(30),
    CODMARC varchar(3),
    NOMMARC varchar(30),
    UNIDAD varchar(8),
    CANTIDAD numeric(18,4),
    BASE numeric(18,2),
    IVA numeric(18,2),
    CONSUMO numeric(18,2),
    COSTO numeric(18,2),
    UTILIDAD numeric(18,4),
    PORC numeric(9,2),
    TOTAL numeric(18,2),
    LISTA numeric(18,2),
    PREFIJO varchar(4),
    NUMERO varchar(6),
    FECHA date,
    DTO numeric(9,2))
AS
DECLARE VARIABLE COSTOUNIT NUMERIC(18,4);
DECLARE VARIABLE CANTDET NUMERIC(18,4);
DECLARE VARIABLE CODINI VARCHAR(15);
DECLARE VARIABLE CODFIN VARCHAR(15);
DECLARE VARIABLE DESINI VARCHAR(15);
DECLARE VARIABLE DESFIN VARCHAR(15);
declare variable UOM VARCHAR(20);
declare variable CODLISTA INTEGER;
BEGIN
if (ORDEN = 'C') then
    BEGIN
    CODINI = ARTINI;
    CODFIN = ARTFIN;
    DESINI = '';
    DESFIN = 'zz';
    END
ELSE
    BEGIN
    DESINI = ARTINI;
    DESFIN = ARTFIN;
    CODINI = '';
    CODFIN = 'zz';
    END
  EXECUTE PROCEDURE lee_configuracion ('FACTURACION', 'ARTICULOS', 'SUGERIR PRECIOS CON PORCENTAJE DE MARGEN O UTILIDAD') returning_values (:UOM);
  SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = :TIPO INTO :NOMTIPO;
  FOR select VEND_COD, VEND_NOMBRE
    from VENDEDORES
    where VEND_COD >= :VENINI AND VEND_COD <= :VENFIN
    INTO :CODVEND, :NOMVEND
    DO  
    BEGIN
    if (DETALLE = 'N') then
        BEGIN
        if (BIN_AND(TIPO, 1) <> 0) then
            BEGIN
            SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 31 INTO :NOMTIPO;
            /* BORRA LA TABLA AUXILIAR */
            DELETE FROM reportes_aux WHERE REPA_ID = 4 AND REPA_USER = USER;
            FOR SELECT MAX(D.ARTI_COD), SUM(FADE_CANT * FADE_FACTOR), SUM(FACT_FACTOR*(FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO)),
                SUM(FACT_FACTOR*FADE_IVAMONTO), SUM(FACT_FACTOR*FADE_TOTAL), SUM(FADE_CONSUMO),
                MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD)
                FROM FACTURAS_DETALLE D, FACTURAS F, PREFIJOS P, ARTICULO A
                WHERE F.FACT_ID = D.FACT_ID AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND VEND_COD = :CODVEND AND FACT_ANULADO = 'N'
                 AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) and substring(D.arti_cod from 1 FOR 2) <> '.t'
                 AND D.ARTI_COD = A.arti_cod AND A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN
                GROUP BY D.ARTI_COD
                INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :TOTAL, :CONSUMO,
                    :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                DO
                BEGIN
                COSTO = 0;
                FOR SELECT FADE_CANT * FADE_FACTOR, FACT_FECHA FROM FACTURAS_DETALLE D, FACTURAS F, PREFIJOS P
                    WHERE F.VEND_COD = :codvend AND F.FACT_ID = D.FACT_ID AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND
                    FACT_ANULADO = 'N' AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                    and D.ARTI_COD = :articulo  INTO :cantdet, :fecha
                    DO
                    BEGIN
                    EXECUTE PROCEDURE COSTO_PROMEDIO(:ARTICULO, :FECHA) returning_values (:costounit);
                    COSTO = COSTO + costounit * cantdet;
                    END
                SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                if (CANTIDAD IS NULL) then
                    CANTIDAD = 0;
                if (BASE IS NULL) then
                    BASE = 0;
                if (IVA IS NULL) then
                    IVA = 0;
                UTILIDAD = BASE - COSTO;
                if (UOM = 'UTILIDAD') then
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                else
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
                if (CEROS = 'S') then
                    begin
                    INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (4, USER, :ARTICULO);
                    SUSPEND;
                    end
                ELSE
                    if ((BASE <> 0) AND (CANTIDAD <> 0)) then
                        SUSPEND;
                END
            if (CEROS = 'S') then
                BEGIN
                COSTO = 0;
                UTILIDAD = 0;
                PORC = 0;
                /* agregue los articulos sin factura */
                FOR SELECT ARTI_COD, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN and
                    not exists (select REPA_ARTICULO FROM REPORTES_AUX WHERE REPA_ID = 4 AND REPA_USER = USER AND REPA_ARTICULO = a.arti_cod)
                    INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                    DO
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        if (BIN_AND(TIPO, 2) <> 0) then
            BEGIN
            SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 32 INTO :NOMTIPO;
            FOR SELECT MAX(D.ARTI_COD), SUM(RVDE_CANT * RVDE_FACTOR), SUM(RVDE_TOTAL-RVDE_IVAMONTO-RVDE_CONSUMO), SUM(RVDE_IVAMONTO), SUM(RVDE_TOTAL), SUM(RVDE_CONSUMO),
                MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD)
                FROM REMISIONES_VENTA_DETALLE D, REMISIONES_VENTA R, PREFIJOS P, ARTICULO A
                WHERE R.REVT_ID = D.REVT_ID AND REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN AND VEND_COD = :CODVEND AND REVT_ANULADO = 'N'
                 AND P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = 32 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                 AND D.ARTI_COD = A.arti_cod AND A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN
                GROUP BY D.ARTI_COD
                INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :TOTAL, :CONSUMO,
                    :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                DO
                BEGIN
                COSTO = 0;
                FOR SELECT RVDE_CANT * RVDE_FACTOR, REVT_FECHA FROM remisiones_venta_detalle D, remisiones_venta F, PREFIJOS P
                    WHERE F.VEND_COD = :codvend AND F.revt_id = D.revt_id AND REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN AND
                    REVT_ANULADO = 'N' AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 32 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                    and D.ARTI_COD = :articulo  INTO :cantdet, :fecha
                    DO
                    BEGIN
                    EXECUTE PROCEDURE COSTO_PROMEDIO(:ARTICULO, :FECHA) returning_values (:costounit);
                    COSTO = COSTO + costounit * cantdet;
                    END
                SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                if (CANTIDAD IS NULL) then
                    CANTIDAD = 0;
                if (BASE IS NULL) then
                    BASE = 0;
                if (IVA IS NULL) then
                    IVA = 0;
                UTILIDAD = BASE - COSTO;
                if (UOM = 'UTILIDAD') then
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                else
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
                if (CEROS = 'S') then
                    begin
                    INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (4, USER, :ARTICULO);
                    SUSPEND;
                    end
                ELSE
                    if ((BASE <> 0) AND (CANTIDAD <> 0)) then
                        SUSPEND;
                END
            if (CEROS = 'S') then
                BEGIN
                COSTO = 0;
                UTILIDAD = 0;
                PORC = 0;
                /* agregue los articulos sin factura */
                FOR SELECT ARTI_COD, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN and
                    not exists (select REPA_ARTICULO FROM REPORTES_AUX WHERE REPA_ID = 4 AND REPA_USER = USER AND REPA_ARTICULO = a.arti_cod)
                    INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                    DO
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        if (BIN_AND(TIPO, 4) <> 0) then
            BEGIN
            SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 33 INTO :NOMTIPO;
            FOR SELECT MAX(D.ARTI_COD), SUM(DVDE_CANT * DVDE_FACTOR), SUM(DEVT_FACTOR*(DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO)),
                SUM(DEVT_FACTOR*DVDE_IVAMONTO), SUM(DEVT_FACTOR*DVDE_TOTAL), SUM(DVDE_CONSUMO),
                MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD)
                FROM devoluciones_ventas_detalle D, DEVOLUCIONES_VENTAS V, PREFIJOS P, ARTICULO A
                WHERE V.DEVT_ID = D.DEVT_ID AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND VEND_COD = :CODVEND AND DEVT_ANULADO = 'N'
                 AND P.PREF_PRE = V.PREF_PRE AND P.TIDO_COD = 33 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) and substring(D.arti_cod from 1 FOR 2) <> '.t'
                 AND D.ARTI_COD = A.arti_cod AND A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN
                GROUP BY D.ARTI_COD
                INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :TOTAL, :CONSUMO,
                    :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                DO
                BEGIN
                COSTO = 0;
                FOR SELECT DVDE_CANT * DVDE_FACTOR, DEVT_FECHA FROM devoluciones_ventas_detalle D, devoluciones_ventas F, PREFIJOS P
                    WHERE F.VEND_COD = :codvend AND F.devt_id = D.devt_id AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND
                    DEVT_ANULADO = 'N' AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 33 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                    and D.ARTI_COD = :articulo  INTO :cantdet, :fecha
                    DO
                    BEGIN
                    EXECUTE PROCEDURE COSTO_PROMEDIO(:ARTICULO, :FECHA) returning_values (:costounit);
                    COSTO = COSTO + costounit * cantdet;
                    END
                SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                if (CANTIDAD IS NULL) then
                    CANTIDAD = 0;
                if (BASE IS NULL) then
                    BASE = 0;
                if (IVA IS NULL) then
                    IVA = 0;
                UTILIDAD = BASE - COSTO;
                if (UOM = 'UTILIDAD') then
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                else
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
                TOTAL = TOTAL * -1;
                IVA = IVA * -1;
                BASE = BASE * -1;
                CANTIDAD = CANTIDAD * -1;
                COSTO = COSTO * -1;
                UTILIDAD = UTILIDAD * -1;
                if (CEROS = 'S') then
                    begin
                    INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (4, USER, :ARTICULO);
                    SUSPEND;
                    end
                ELSE
                    if ((BASE <> 0) AND (CANTIDAD <> 0)) then
                        SUSPEND;
                END
            if (CEROS = 'S') then
                BEGIN
                COSTO = 0;
                UTILIDAD = 0;
                PORC = 0;
                /* agregue los articulos sin factura */
                FOR SELECT ARTI_COD, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN and
                    not exists (select REPA_ARTICULO FROM REPORTES_AUX WHERE REPA_ID = 4 AND REPA_USER = USER AND REPA_ARTICULO = a.arti_cod)
                    INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                    DO
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        if (BIN_AND(TIPO, 8) <> 0) then
            BEGIN
            SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 34 INTO :NOMTIPO;
            FOR SELECT MAX(D.ARTI_COD), SUM(PEDE_CANT * PEDE_FACTOR), SUM(PEDI_FACTOR*(PEDE_TOTAL-PEDE_IVAMONTO-PEDE_CONSUMO)),
                SUM(PEDI_FACTOR*PEDE_IVAMONTO), SUM(PEDI_FACTOR*PEDE_TOTAL), SUM(PEDE_CONSUMO),
                MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD)
                FROM PEDIDOS_DETALLE D, PEDIDOS P, PREFIJOS PR, articulo A
                WHERE P.PEDI_ID = D.PEDI_ID AND PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND VEND_COD = :CODVEND AND PEDI_ANULADO = 'N'
                 AND PR.PREF_PRE = P.PREF_PRE AND P.TIDO_COD = 34 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                 AND D.ARTI_COD = A.arti_cod AND A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN
                GROUP BY D.ARTI_COD
                INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :TOTAL, :CONSUMO,
                    :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                DO
                BEGIN
                COSTO = 0;
                FOR SELECT PEDE_CANT * PEDE_FACTOR, PEDI_FECHA FROM pedidos_detalle D, PEDIDOS F, PREFIJOS P
                    WHERE F.VEND_COD = :codvend AND F.pedi_id = D.pedi_id AND PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND
                    PEDI_ANULADO = 'N' AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 34 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                    and D.ARTI_COD = :articulo  INTO :cantdet, :fecha
                    DO
                    BEGIN
                    EXECUTE PROCEDURE COSTO_PROMEDIO(:ARTICULO, :FECHA) returning_values (:costounit);
                    COSTO = COSTO + costounit * cantdet;
                    END
                SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                if (CANTIDAD IS NULL) then
                    CANTIDAD = 0;
                if (BASE IS NULL) then
                    BASE = 0;
                if (IVA IS NULL) then
                    IVA = 0;
                UTILIDAD = BASE - COSTO;
                if (UOM = 'UTILIDAD') then
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                else
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
                if (CEROS = 'S') then
                    begin
                    INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (4, USER, :ARTICULO);
                    SUSPEND;
                    end
                ELSE
                    if ((BASE <> 0) AND (CANTIDAD <> 0)) then
                        SUSPEND;
                END
            if (CEROS = 'S') then
                BEGIN
                COSTO = 0;
                UTILIDAD = 0;
                PORC = 0;
                /* agregue los articulos sin factura */
                FOR SELECT ARTI_COD, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN and
                    not exists (select REPA_ARTICULO FROM REPORTES_AUX WHERE REPA_ID = 4 AND REPA_USER = USER AND REPA_ARTICULO = a.arti_cod)
                    INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                    DO
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        if (BIN_AND(TIPO, 16) <> 0) then
            BEGIN
            SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 35 INTO :NOMTIPO;
            FOR SELECT MAX(D.ARTI_COD), SUM(CTDE_CANT * CTDE_FACTOR), SUM(COTI_FACTOR*(CTDE_TOTAL-CTDE_IVAMONTO-CTDE_CONSUMO)),
                SUM(COTI_FACTOR*CTDE_IVAMONTO), SUM(COTI_FACTOR*CTDE_TOTAL), SUM(CTDE_CONSUMO),
                MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD)
                FROM COTIZACIONES_DETALLE D, COTIZACIONES C, PREFIJOS P, ARTICULO A
                WHERE C.COTI_ID = D.COTI_ID AND COTI_FECHA >= :FECINI AND COTI_FECHA <= :FECFIN AND VEND_COD = :CODVEND AND COTI_ANULADO = 'N'
                 AND P.PREF_PRE = C.PREF_PRE AND P.TIDO_COD = 35 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                 AND D.ARTI_COD = A.arti_cod AND A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN
                GROUP BY D.ARTI_COD
                INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :TOTAL, :CONSUMO,
                    :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                DO
                BEGIN
                COSTO = 0;
                FOR SELECT PEDE_CANT * PEDE_FACTOR, PEDI_FECHA FROM pedidos_detalle D, PEDIDOS F, PREFIJOS P
                    WHERE F.VEND_COD = :codvend AND F.pedi_id = D.pedi_id AND PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND
                    PEDI_ANULADO = 'N' AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 34 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                    and D.ARTI_COD = :articulo  INTO :cantdet, :fecha
                    DO
                    BEGIN
                    EXECUTE PROCEDURE COSTO_PROMEDIO(:ARTICULO, :FECHA) returning_values (:costounit);
                    COSTO = COSTO + costounit * cantdet;
                    END
                SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                if (CANTIDAD IS NULL) then
                    CANTIDAD = 0;
                if (BASE IS NULL) then
                    BASE = 0;
                if (IVA IS NULL) then
                    IVA = 0;
                COSTO = CANTIDAD * COSTOUNIT;
                UTILIDAD = BASE - COSTO;
                if (UOM = 'UTILIDAD') then
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                else
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
                if (CEROS = 'S') then
                    begin
                    INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (4, USER, :ARTICULO);
                    SUSPEND;
                    end
                ELSE
                    if ((BASE <> 0) AND (CANTIDAD <> 0)) then
                        SUSPEND;
                END
            if (CEROS = 'S') then
                BEGIN
                COSTO = 0;
                UTILIDAD = 0;
                PORC = 0;
                /* agregue los articulos sin factura */
                FOR SELECT ARTI_COD, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN and
                    not exists (select REPA_ARTICULO FROM REPORTES_AUX WHERE REPA_ID = 4 AND REPA_USER = USER AND REPA_ARTICULO = a.arti_cod)
                    INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                    DO
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        END
    ELSE
        BEGIN
        if (BIN_AND(TIPO, 1) <> 0) then
            BEGIN
            SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 31 INTO :NOMTIPO;
            FOR SELECT F.PREF_PRE, FACT_NUMERO, FACT_FECHA, ARTI_COD, FADE_CANT * FADE_FACTOR, (FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO)*FACT_FACTOR,
                FADE_IVAMONTO*FACT_FACTOR, FADE_DTOPORC, FADE_TOTAL*FACT_FACTOR, FADE_CONSUMO, D.lipr_cod
                FROM FACTURAS F, FACTURAS_DETALLE D, PREFIJOS P
                WHERE F.FACT_ID = D.FACT_ID AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND VEND_COD = :CODVEND AND FACT_ANULADO = 'N'
                 AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) and substring(D.arti_cod from 1 FOR 2) <> '.t'
                ORDER BY ARTI_COD, FACT_FECHA, F.FACT_ID, FADE_ITEM
                INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :DTO, :TOTAL, :CONSUMO, :codlista
                DO
                BEGIN
                SELECT ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO WHERE ARTI_COD = :ARTICULO
                    INTO :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC;
                SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                EXECUTE PROCEDURE costo_promedio (:ARTICULO, :FECHA) RETURNING_VALUES (:COSTOUNIT);
                LISTA = 0;
                SELECT PRAR_FIJO FROM precios_articulo WHERE LIPR_COD = :CODLISTA AND ARTI_COD = :ARTICULO INTO :LISTA;
                COSTO = COSTOUNIT * CANTIDAD;
                UTILIDAD = BASE - COSTO;
                if (UOM = 'UTILIDAD') then
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                else
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
                if (CEROS = 'S') then
                    INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (4, USER, :ARTICULO);
                SUSPEND;
                END
            if (CEROS = 'S') then
                BEGIN
                COSTO = 0;
                UTILIDAD = 0;
                PORC = 0;
                /* agregue los articulos sin factura */
                FOR SELECT ARTI_COD, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN and
                    not exists (select REPA_ARTICULO FROM REPORTES_AUX WHERE REPA_ID = 4 AND REPA_USER = USER AND REPA_ARTICULO = a.arti_cod)
                    INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                    DO
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        if (BIN_AND(TIPO, 2) <> 0) then
            BEGIN
            SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 32 INTO :NOMTIPO;
            FOR SELECT R.PREF_PRE, REVT_NUMERO, REVT_FECHA, ARTI_COD, RVDE_CANT * RVDE_FACTOR, (RVDE_TOTAL - RVDE_IVAMONTO), RVDE_IVAMONTO, RVDE_DTOPORC, RVDE_TOTAL, RVDE_CONSUMO, D.lipr_cod
                FROM REMISIONES_VENTA R, REMISIONES_VENTA_DETALLE D, PREFIJOS P
                WHERE R.REVT_ID = D.REVT_ID AND REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN AND VEND_COD = :CODVEND AND REVT_ANULADO = 'N'
                 AND P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = 32 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) and substring(D.arti_cod from 1 FOR 2) <> '.t'
                ORDER BY ARTI_COD, REVT_FECHA, R.REVT_ID, RVDE_ITEM
                INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :DTO, :TOTAL, :CONSUMO, :codlista
                DO
                BEGIN
                SELECT ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO WHERE ARTI_COD = :ARTICULO
                    INTO :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC;
                SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                EXECUTE PROCEDURE costo_promedio (:ARTICULO, :FECHA) RETURNING_VALUES (:COSTOUNIT);
                LISTA = 0;
                SELECT PRAR_FIJO FROM precios_articulo WHERE LIPR_COD = :CODLISTA AND ARTI_COD = :ARTICULO INTO :LISTA;
                COSTO = COSTOUNIT * CANTIDAD;
                UTILIDAD = BASE - COSTO;
                if (UOM = 'UTILIDAD') then
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                else
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
                if (CEROS = 'S') then
                    INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (4, USER, :ARTICULO);
                SUSPEND;
                END
            if (CEROS = 'S') then
                BEGIN
                COSTO = 0;
                UTILIDAD = 0;
                PORC = 0;
                /* agregue los articulos sin factura */
                FOR SELECT ARTI_COD, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN and
                    not exists (select REPA_ARTICULO FROM REPORTES_AUX WHERE REPA_ID = 4 AND REPA_USER = USER AND REPA_ARTICULO = a.arti_cod)
                    INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                    DO
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        if (BIN_AND(TIPO, 4) <> 0) then
            BEGIN
            SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 33 INTO :NOMTIPO;
            FOR SELECT V.PREF_PRE, DEVT_NUMERO, DEVT_FECHA, ARTI_COD, DVDE_CANT * DVDE_FACTOR, (DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO)*DEVT_FACTOR,
                DVDE_IVAMONTO*DEVT_FACTOR, DVDE_DTOPORC, DVDE_TOTAL*DEVT_FACTOR, DVDE_CONSUMO
                FROM DEVOLUCIONES_VENTAS V, DEVOLUCIONES_VENTAS_DETALLE D, PREFIJOS P
                WHERE V.DEVT_ID = D.DEVT_ID AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND VEND_COD = :CODVEND AND DEVT_ANULADO = 'N'
                 AND P.PREF_PRE = V.PREF_PRE AND P.TIDO_COD = 33 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) and substring(D.arti_cod from 1 FOR 2) <> '.t'
                ORDER BY ARTI_COD, DEVT_FECHA, D.DEVT_ID, DVDE_ITEM
                INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :DTO, :TOTAL, :CONSUMO
                DO
                BEGIN
                SELECT ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO WHERE ARTI_COD = :ARTICULO
                    INTO :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC;
                SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                EXECUTE PROCEDURE costo_promedio (:ARTICULO, :FECHA) RETURNING_VALUES (:COSTOUNIT);
                LISTA = 0;
                COSTO = COSTOUNIT * CANTIDAD;
                UTILIDAD = BASE - COSTO;
                if (UOM = 'UTILIDAD') then
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                else
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
                TOTAL = TOTAL * -1;
                IVA = IVA * -1;
                BASE = BASE * -1;
                CANTIDAD = CANTIDAD * -1;
                COSTO = COSTO * -1;
                UTILIDAD = UTILIDAD * -1;
                if (CEROS = 'S') then
                    INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (4, USER, :ARTICULO);
                SUSPEND;
                END
            if (CEROS = 'S') then
                BEGIN
                COSTO = 0;
                UTILIDAD = 0;
                PORC = 0;
                /* agregue los articulos sin factura */
                FOR SELECT ARTI_COD, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN and
                    not exists (select REPA_ARTICULO FROM REPORTES_AUX WHERE REPA_ID = 4 AND REPA_USER = USER AND REPA_ARTICULO = a.arti_cod)
                    INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                    DO
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        if (BIN_AND(TIPO, 8) <> 0) then
            BEGIN
            SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 34 INTO :NOMTIPO;
            FOR SELECT P.PREF_PRE, PEDI_NUMERO, PEDI_FECHA, ARTI_COD, PEDE_CANT * PEDE_FACTOR, (PEDE_TOTAL-PEDE_IVAMONTO-PEDE_CONSUMO)*PEDI_FACTOR,
                PEDE_IVAMONTO*PEDI_FACTOR, PEDE_DTOPORC, PEDE_TOTAL*PEDI_FACTOR, PEDE_CONSUMO, D.lipr_cod
                FROM PEDIDOS P, PEDIDOS_DETALLE D, PREFIJOS PR
                WHERE P.PEDI_ID = D.PEDI_ID AND PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND VEND_COD = :CODVEND AND PEDI_ANULADO = 'N'
                 AND P.PREF_PRE = PR.PREF_PRE AND P.TIDO_COD = 34 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                ORDER BY ARTI_COD, PEDI_FECHA, P.PEDI_ID, PEDE_ITEM
                INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :DTO, :TOTAL, :CONSUMO, :codlista
                DO
                BEGIN
                SELECT ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO WHERE ARTI_COD = :ARTICULO
                    INTO :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC;
                SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                EXECUTE PROCEDURE costo_promedio (:ARTICULO, :FECHA) RETURNING_VALUES (:COSTOUNIT);
                LISTA = 0;
                SELECT PRAR_FIJO FROM precios_articulo WHERE LIPR_COD = :CODLISTA AND ARTI_COD = :ARTICULO INTO :LISTA;
                COSTO = COSTOUNIT * CANTIDAD;
                UTILIDAD = BASE - COSTO;
                if (UOM = 'UTILIDAD') then
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                else
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
                if (CEROS = 'S') then
                    INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (4, USER, :ARTICULO);
                SUSPEND;
                END
            if (CEROS = 'S') then
                BEGIN
                COSTO = 0;
                UTILIDAD = 0;
                PORC = 0;
                /* agregue los articulos sin factura */
                FOR SELECT ARTI_COD, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN and
                    not exists (select REPA_ARTICULO FROM REPORTES_AUX WHERE REPA_ID = 4 AND REPA_USER = USER AND REPA_ARTICULO = a.arti_cod)
                    INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                    DO
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        if (BIN_AND(TIPO, 16) <> 0) then
            BEGIN
            SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 35 INTO :NOMTIPO;
            FOR SELECT C.PREF_PRE, COTI_NUMERO, COTI_FECHA, ARTI_COD, CTDE_CANT * CTDE_FACTOR, (CTDE_TOTAL-CTDE_IVAMONTO-CTDE_CONSUMO)*COTI_FACTOR,
                CTDE_IVAMONTO*COTI_FACTOR, CTDE_DTOPORC, CTDE_TOTAL*COTI_FACTOR, CTDE_CONSUMO, D.lipr_cod
                FROM COTIZACIONES C, COTIZACIONES_DETALLE D, PREFIJOS P
                WHERE C.COTI_ID = D.COTI_ID AND ARTI_COD = :ARTICULO AND COTI_FECHA >= :FECINI AND COTI_FECHA <= :FECFIN AND VEND_COD = :CODVEND AND COTI_ANULADO = 'N'
                 AND P.PREF_PRE = C.PREF_PRE AND P.TIDO_COD = 35 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                ORDER BY COTI_FECHA, C.COTI_ID, CTDE_ITEM
                INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :DTO, :TOTAL, :CONSUMO, :codlista
                DO
                BEGIN
                SELECT ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO WHERE ARTI_COD = :ARTICULO
                    INTO :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC;
                SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                LISTA = 0;
                SELECT PRAR_FIJO FROM precios_articulo WHERE LIPR_COD = :CODLISTA AND ARTI_COD = :ARTICULO INTO :LISTA;
                EXECUTE PROCEDURE costo_promedio (:ARTICULO, :FECHA) RETURNING_VALUES (:COSTOUNIT);
                COSTO = COSTOUNIT * CANTIDAD;
                UTILIDAD = BASE - COSTO;
                if (UOM = 'UTILIDAD') then
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                else
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
                if (CEROS = 'S') then
                    INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (4, USER, :ARTICULO);
                SUSPEND;
                END
            if (CEROS = 'S') then
                BEGIN
                COSTO = 0;
                UTILIDAD = 0;
                PORC = 0;
                /* agregue los articulos sin factura */
                FOR SELECT ARTI_COD, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN and
                    not exists (select REPA_ARTICULO FROM REPORTES_AUX WHERE REPA_ID = 4 AND REPA_USER = USER AND REPA_ARTICULO = a.arti_cod)
                    INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                    DO
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        END
    END
END
^

SET TERM ; ^


/* 20100204B */
/* CTA DEV POR CENTRO DE COSTO POR BODEGA HACIA QUE SE REPITIERA EL VALOR POR CADA BODEGA POR FALTA DE UNA CONDICION EN EL WHERE */
SET TERM ^ ;

CREATE OR ALTER procedure CONTABIL_DEVOLCLI (
    IDDOC integer,
    IDINTER integer)
returns (
    ERROR integer,
    VER char(1),
    IDC integer)
AS
declare variable PREF VARCHAR(4);
declare variable NUM VARCHAR(6);
declare variable NUMERO VARCHAR(10);
declare variable FECAUX DATE;
declare variable FECHA CHAR(8);
declare variable CONC CHAR(120);
declare variable NUMFAC VARCHAR(10);
declare variable VRDTO NUMERIC(18, 2);
declare variable VRADIC NUMERIC(18, 2);
declare variable VRSUBT NUMERIC(18, 2);
declare variable VRIVA NUMERIC(18, 2);
declare variable PRTFTE NUMERIC(9, 2);
declare variable VRRTFTE NUMERIC(18, 2);
declare variable VRRTIVA NUMERIC(18, 2);
declare variable PRTICA NUMERIC(9, 2);
declare variable VRRTICA NUMERIC(18, 2);
declare variable VRTOTAL NUMERIC(18, 2);
declare variable VREXTRA NUMERIC(18, 2);
declare variable TIPOCOMP VARCHAR(3);
declare variable PREFCONT VARCHAR(4);
declare variable VENTAS CHAR(1);
declare variable CTAVENTAS VARCHAR(20);
declare variable IVA CHAR(1);
declare variable CTAIVA VARCHAR(20);
declare variable CONSUMO CHAR(1);
declare variable CTACONSUMO VARCHAR(20);
declare variable CARTERA CHAR(1);
declare variable CTACARTERA VARCHAR(20);
declare variable RTFTE CHAR(1);
declare variable CTARTFTE VARCHAR(20);
declare variable RTIVA CHAR(1);
declare variable CTARTIVA VARCHAR(20);
declare variable RTICA CHAR(1);
declare variable CTARTICA VARCHAR(20);
declare variable INVEN CHAR(1);
declare variable CTAINVEN VARCHAR(20);
declare variable COSTOS CHAR(1);
declare variable CTACOSTOS VARCHAR(20);
declare variable CTADTO VARCHAR(20);
declare variable CTAADIC VARCHAR(20);
declare variable CTAEXTRA VARCHAR(20);
declare variable EXISTE CHAR(1);
declare variable CUENTA VARCHAR(20);
declare variable MONTO NUMERIC(18,2);
declare variable TIPOCUEN CHAR(1);
declare variable NIT VARCHAR(20);
declare variable PROY VARCHAR(4);
declare variable CENTRO VARCHAR(4);
declare variable PROYI VARCHAR(4);
declare variable CENTI VARCHAR(4);
declare variable PORC NUMERIC(5,2);
declare variable DEBITO NUMERIC(18,2);
declare variable CREDITO NUMERIC(18,2);
declare variable NROI INTEGER;
declare variable ART VARCHAR(15);
declare variable IMPINC CHAR(1);
declare variable IMPTOS NUMERIC(18, 2);
declare variable SUMA NUMERIC(18,2);
declare variable PORCIVA NUMERIC(9,2);
declare variable TCTACLIEN VARCHAR(20);
declare variable TCTAVENTA VARCHAR(20);
declare variable TCTARTFTE VARCHAR(20);
declare variable TCTARTIVA VARCHAR(20);
declare variable TCTARTICA VARCHAR(20);
declare variable CTADIC VARCHAR(20);
declare variable BASEADIC VARCHAR(20);
declare variable PORCADIC NUMERIC(5,2);
declare variable VALORADIC NUMERIC(18,2);
declare variable DBADIC CHAR(1);
declare variable PTOVTA INTEGER;
declare variable ANULADO CHAR(1);
declare variable CENT CHAR(1);
DECLARE VARIABLE MERCANCIA NUMERIC(18,2);
declare variable FACTOR DOUBLE PRECISION;
declare variable DIG INTEGER;
DECLARE VARIABLE FOMENTO VARCHAR(2);
DECLARE VARIABLE VRCONSUMO NUMERIC(18,2);
declare variable AUTORET VARCHAR(10);
declare variable FAUTORET DATE;
declare variable IDREM INTEGER;
declare variable DTOXIT CHAR(2);
declare variable ERRORC INTEGER;
BEGIN
EXECUTE PROCEDURE LEE_CONFIGURACION('COMPRAS', 'FACTURAS', 'USAR IMPOCONSUMO COMO PORCENTAJE DE FOMENTO') returning_values (FOMENTO);
EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'FECHA AUTORETENEDOR NO DESCONTAR RETENCIONES DEL SALDO PERO SI CONTABILIZARLAS') returning_values (AUTORET);
if (AUTORET <> '') then
    FAUTORET = CAST(AUTORET AS DATE);
else
    FAUTORET = '9999/12/31';
  /* BUSQUE LA INTERFACE */
  EXISTE = 'N';
  SELECT 'S', TICO_COD, PRCO_PRE, INVE_VENTAS, INVE_IVA, INVE_CONSUMO, INVE_CARTERA, INVE_RTFTE, INVE_RTIVA, INVE_RTICA, INVE_COSTO, INVE_INVEN, INVE_CTAVENTAS, INVE_CTAIVA, INVE_CTACONSUMO, INVE_CTADTO, INVE_CTAADIC, INVE_CTAEXTRA, INVE_CTACARTERA, INVE_CTARTFTE, INVE_CTARTIVA, INVE_CTARTICA, INVE_CTAINVEN, INVE_CTACOSTOS, INVE_CONFIRMAR, INVE_CENTRO
    FROM INTERFAZ_VENTAS
    WHERE INVE_ID = :IDINTER
    INTO :EXISTE, :TIPOCOMP, :PREFCONT, :VENTAS, :IVA, :CONSUMO, :CARTERA, :RTFTE, :RTIVA, :RTICA, :COSTOS, :INVEN, :CTAVENTAS, :CTAIVA, :CTACONSUMO, :CTADTO, :CTAADIC, :CTAEXTRA, :CTACARTERA, :CTARTFTE, :CTARTIVA, :CTARTICA, :CTAINVEN, :CTACOSTOS, :VER, :CENT;
  if (EXISTE = 'S') then
   BEGIN
    /* BORRE CUALQUEIR CONTABILIZACION PREVIA */
    DELETE FROM CONTABILIZACION WHERE CNTB_TIPOREF = 33 AND CNTB_IDREF = :IDDOC;
    /* TRAIGA EL ENCABEZADO DE LA DEVOLUCION */
   SELECT PREF_PRE, DEVT_NUMERO, DEVT_FECHA, F.TERC_NIT, DEVT_IVAINC, PTVT_ID, DEVT_FACTURA, DEVT_DTOMONTO, DEVT_ADICIONAL, DEVT_IVAMONTO, DEVT_EXTRA, DEVT_TOTAL, DEVT_RTFTEPORC, DEVT_RTFTEMONTO, DEVT_RTIVAPORC, DEVT_RTIVAMONTO, DEVT_RTICAPORC, DEVT_RTICAMONTO, TERC_CTARTFTE, TERC_CTARTIVA, TERC_CTARTICA, TERC_CTAVENTA, TERC_CTACLIENTE, DEVT_ANULADO, DEVT_REMID
        FROM DEVOLUCIONES_VENTAS F, TERCEROS T
        WHERE DEVT_ID = :IDDOC AND F.TERC_NIT = T.TERC_NIT
        INTO :PREF, :NUM, :FECAUX, :NIT, :IMPINC, :PTOVTA, :NUMFAC, :VRDTO, :VRADIC, :VRIVA, :VREXTRA, :VRTOTAL, :PRTFTE, :VRRTFTE, :PORC, :VRRTIVA, :PRTICA, :VRRTICA, :TCTARTFTE, TCTARTIVA, TCTARTICA, TCTAVENTA, TCTACLIEN, ANULADO, :IDREM;
   if (idrem is null) Then
    IDREM = 0;
   if ((ANULADO = 'N') AND (IDREM = 0)) then
    BEGIN
    NUMERO = PREF || NUM;
    SELECT SUM(DVDE_CONSUMO) FROM devoluciones_ventas_detalle WHERE DEVT_ID = :iddoc AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL)) INTO :MERCANCIA;
    VRSUBT = VRTOTAL - VREXTRA - VRIVA - MERCANCIA; /* BASE DE RETEFTE Y RETEICA */
    EXECUTE PROCEDURE lee_configuracion ('FACTURACION', 'DEVOLUCIONES', 'DESCUENTO PIE DEVOLUCION IGUAL A SUMA DE DESCUENTOS POR ITEM') returning_values (:DTOXIT);
    if (DTOXIT = 'SI') then
        VRDTO = 0;
    MERCANCIA = VRSUBT - VRADIC + VRDTO;
    IF (CENT = 'B') THEN
        SELECT B.BODE_CENTRO, B.BODE_PROY FROM BODEGA B, DEVOLUCIONES_VENTAS F
            WHERE B.BODE_COD = F.BODE_COD AND F.DEVT_ID = :IDDOC INTO :CENTRO, :PROY;
    IF (CENT = 'V') THEN
        SELECT V.CENT_COD, V.PROY_COD FROM VENDEDORES V, DEVOLUCIONES_VENTAS F
            WHERE V.VEND_COD = F.VEND_COD AND F.DEVT_ID = :IDDOC INTO :CENTRO, :PROY;
    IF (CENT = 'P') THEN
        SELECT P.PREF_CENTRO,P.PREF_PROY  FROM PREFIJOS P, DEVOLUCIONES_VENTAS F
            WHERE P.PREF_PRE = F.PREF_PRE AND F.DEVT_ID = :IDDOC AND P.TIDO_COD = 33 INTO :CENTRO, :PROY;
    EXECUTE PROCEDURE FECHA_A_CONTA(:FECAUX) returning_values (:FECHA);
    /* REGISTRE EL ENCABEZADO CONTABLE */
    IDC = GEN_ID(ID_CONTABILIZA, 1);
    CONC = 'DEVOLUCION VENTAS No. ' || NUMERO || ' EN FACTURA ' || NUMFAC;
    CONC = SUBSTR(CONC, 1, 60);
    INSERT INTO CONTABILIZACION (CNTB_ID, CNTB_TIPOCOMP, CNTB_PREFCNT, CNTB_NUMERO, CNTB_FECHA, CNTB_CONCEPTO, CNTB_REF, CNTB_TIPOREF, CNTB_IDREF, CNTB_PREFREF, CNTB_NUMREF, CNTB_PROCESADO)
        VALUES (:IDC, :TIPOCOMP, :PREFCONT, :NUM, :FECHA, :CONC, '', 33, :IDDOC, :PREF, :NUM, 'N');
    NROI = 0;
    SUMA = 0;
    ERROR = 0;
    /* SI NO HAY CUENTA DE DESCUENTO NI ADICIONAL CALCULE UN FACTOR PARA LAS VENTAS Y EL IVA */
    if (MERCANCIA <> 0) then
        FACTOR = CAST(VRSUBT AS DOUBLE PRECISION) / CAST(MERCANCIA AS DOUBLE PRECISION);
    ELSE
        FACTOR = 1;
    /* TRAIGA EL NUMERO DE DIGITOS PARA EL REDONDEO */
    SELECT CAST(CONF_VALOR AS INTEGER) FROM CONFIGURACION WHERE CONF_MODULO = 'FACTURACION' AND
        CONF_CATEGORIA = 'GENERAL' AND CONF_PROPIEDAD = 'REDONDEO AL MULTIPLO DE DIEZ EN TOTALES' INTO :DIG;
    /* CUENTAS DE VENTAS */
    if (VENTAS = 'A') then
        BEGIN
        FOR SELECT MAX(COAR_CTADEV), SUM(DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO), SUM(DVDE_IVAMONTO), SUM(DVDE_CONSUMO), MAX(B.bode_proy), MAX(B.bode_centro)
            FROM ARTICULO A, CONTABIL_ARTICULO C, DEVOLUCIONES_VENTAS_DETALLE F, BODEGA B
            WHERE F.DEVT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND B.bode_cod = F.bode_cod AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
            GROUP BY COAR_CTADEV
            INTO :CTAVENTAS, :MONTO, :IMPTOS, :VRCONSUMO, :proyi, :centi
            DO
            BEGIN
            if (FOMENTO = 'SI') then
                MONTO = MONTO + VRCONSUMO;
            if ((CTADTO IS NULL) OR (CTADTO = '')) then
                MONTO = MONTO * FACTOR;
            execute procedure redondee(MONTO, DIG) returning_values (MONTO);
            if (MONTO <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTAVENTAS, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT F.ARTI_COD, (DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO), (DVDE_IVAMONTO+DVDE_CONSUMO)
                        FROM ARTICULO A, CONTABIL_ARTICULO C, DEVOLUCIONES_VENTAS_DETALLE F
                        WHERE F.DEVT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTAINV = :CUENTA AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
                        INTO :ART, :MONTO, :IMPTOS
                    DO
                        BEGIN
                        if (IMPINC = 'S') then
                            MONTO = MONTO - IMPTOS;
                        if ((CTADTO IS NULL) OR (CTADTO = '')) then
                            MONTO = MONTO * FACTOR;
                        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        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, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                    NROI = NROI + 1;
                    SUMA = SUMA + MONTO;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    IF (CENT = 'B') THEN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROYI, :CENTI, NULL, NULL, NULL, NULL, 0, 0);
                    ELSE
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA + MONTO;
                    END
                END /* MONTO <> 0 */
            END /* FOR */
        END /* VENTAS X ARTICULO */
     IF ((VENTAS = 'C') OR (VENTAS = 'K')) THEN
        BEGIN
        IF (VENTAS = 'C') THEN
            CTAVENTAS = TCTAVENTA;
        SELECT SUM(DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO), SUM(DVDE_IVAMONTO), SUM(DVDE_CONSUMO)
            FROM DEVOLUCIONES_VENTAS_DETALLE F
            WHERE F.DEVT_ID = :IDDOC  AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
            INTO :MONTO, :IMPTOS, :VRCONSUMO;
        if (FOMENTO = 'SI') then
            MONTO = MONTO + VRCONSUMO;
        if ((CTADTO IS NULL) OR (CTADTO = '')) then
            MONTO = MONTO * FACTOR;
        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
        if (MONTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTAVENTAS, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT F.ARTI_COD, (DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO), (DVDE_IVAMONTO+DVDE_CONSUMO)
                    FROM ARTICULO A, DEVOLUCIONES_VENTAS_DETALLE F
                    WHERE F.DEVT_ID = :IDDOC AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
                    INTO :ART, :MONTO, :IMPTOS
                    DO
                    BEGIN
                    if (IMPINC = 'S') then
                        MONTO = MONTO - IMPTOS;
                    if ((CTADTO IS NULL) OR (CTADTO = '')) then
                        MONTO = MONTO * FACTOR;
                    execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                    NROI = NROI + 1;
                    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, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                NROI = NROI + 1;
                SUMA = SUMA + MONTO;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA + MONTO;
                END
            END /* MONTO <> 0 */
        END /* VENTAS DE CLIENTE O CONSTANTE */
    /* EL IVA EN VENTAS */
    if (IVA = 'A') then
        BEGIN
        FOR SELECT MAX(COAR_CTAIVAV), SUM(DVDE_IVAMONTO), SUM(DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO), SUM(DVDE_CONSUMO)
            FROM ARTICULO A, CONTABIL_ARTICULO C, DEVOLUCIONES_VENTAS_DETALLE F
            WHERE F.DEVT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
            GROUP BY COAR_CTAIVAV
            INTO :CTAIVA, :IMPTOS, :MONTO, :VALORADIC
        DO
            BEGIN
            if (FOMENTO = 'SI') then
                MONTO = MONTO + VALORADIC;
            MONTO = MONTO * -1;
            MONTO = MONTO * FACTOR;
            IMPTOS = IMPTOS * FACTOR;
            execute procedure redondee(MONTO, DIG) returning_values (MONTO);
            execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
            if (IMPTOS <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTAIVA, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT F.ARTI_COD, DVDE_IVAMONTO, (DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO), TAIV_PORC, DVDE_CONSUMO
                        FROM ARTICULO A, CONTABIL_ARTICULO C, DEVOLUCIONES_VENTAS_DETALLE F, TARIFA_IVA T
                        WHERE F.DEVT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND A.TAIV_COD = T.TAIV_COD AND COAR_CTAIVAV = :CUENTA AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
                        INTO :ART, :IMPTOS, :MONTO, :PORCIVA, :VALORADIC
                    DO
                        BEGIN
                        if (IMPINC = 'S') then
                            MONTO = MONTO - IMPTOS - VALORADIC;
                        MONTO = MONTO * -1;
                        MONTO = MONTO * FACTOR;
                        IMPTOS = IMPTOS * FACTOR;
                        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                        execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                        if (IMPTOS <> 0) then
                            BEGIN
                            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :IMPTOS, 0, :MONTO, :PORCIVA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                            NROI = NROI + 1;
                            SUMA = SUMA + IMPTOS;
                            END
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                    NROI = NROI + 1;
                    SUMA = SUMA + IMPTOS;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA + IMPTOS;
                    END
                END   /* IMPTOS <> 0 */
            END /* FOR */
        END /* IVA X ARTICULO */
    if (IVA = 'K') then /* IVA EN CTA CONSTANTE */
        BEGIN
        SELECT SUM(DVDE_IVAMONTO), SUM(DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO), SUM(DVDE_CONSUMO)
            FROM DEVOLUCIONES_VENTAS_DETALLE F
            WHERE F.DEVT_ID = :IDDOC  AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
            INTO :IMPTOS, :MONTO, :VALORADIC;
        if (FOMENTO = 'SI') then
            MONTO = MONTO + VALORADIC;
        MONTO = MONTO * -1;
        MONTO = MONTO * FACTOR;
        IMPTOS = IMPTOS * FACTOR;
        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
        execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
        if (IMPTOS <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTAIVA, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT F.ARTI_COD, (DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO), DVDE_IVAMONTO, TAIV_PORC, DVDE_CONSUMO
                    FROM ARTICULO A, DEVOLUCIONES_VENTAS_DETALLE F, TARIFA_IVA T
                    WHERE F.DEVT_ID = :IDDOC AND A.TAIV_COD = T.TAIV_COD AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
                    INTO :ART, :MONTO, :IMPTOS, :PORCIVA, :VALORADIC
                    DO
                    BEGIN
                    if (IMPINC = 'S') then
                        MONTO = MONTO - IMPTOS - VALORADIC;
                    MONTO = MONTO * -1;
                    MONTO = MONTO * FACTOR;
                    IMPTOS = IMPTOS * FACTOR;
                    execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                    execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                    if (IMPTOS <> 0) then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', :IMPTOS, 0, :MONTO, :PORCIVA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        SUMA = SUMA + IMPTOS;
                        END
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                NROI = NROI + 1;
                SUMA = SUMA + IMPTOS;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA + IMPTOS;
                END
            END /* IMPTOS <> 0 */
        END /* IVA EN CTA CONSTANTE */
    /* EL IMPOCONSUMO */
    if ((CONSUMO = 'A') AND (FOMENTO <> 'SI')) then
        BEGIN
        FOR SELECT MAX(COAR_CTACONS), SUM(DVDE_CONSUMO)
            FROM ARTICULO A, CONTABIL_ARTICULO C, DEVOLUCIONES_VENTAS_DETALLE F
            WHERE F.DEVT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
            GROUP BY COAR_CTACONS
            INTO :CTACONSUMO, :IMPTOS
        DO
            BEGIN
            if (IMPTOS <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTACONSUMO, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, REGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT F.ARTI_COD, DVDE_CONSUMO
                        FROM ARTICULO A, CONTABIL_ARTICULO C, DEVOLUCIONES_VENTAS_DETALLE F
                        WHERE F.DEVT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTACONS = :CUENTA AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
                        INTO :ART, :IMPTOS
                    DO
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 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, :NROI, :CUENTA, :CONC, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                    NROI = NROI + 1;
                    SUMA = SUMA + IMPTOS;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA + IMPTOS;
                    END
                END /* IMPTOS <> 0 */
            END /* FOR */
        END /* CONSUMO X ARTICULO */
    if ((CONSUMO = 'K') AND (FOMENTO <> 'SI')) then
        BEGIN
        SELECT SUM(DVDE_CONSUMO)
            FROM DEVOLUCIONES_VENTAS_DETALLE F
            WHERE F.DEVT_ID = :IDDOC AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
            INTO :IMPTOS;
        if (IMPTOS <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTACONSUMO, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT F.ARTI_COD, DVDE_CONSUMO
                    FROM ARTICULO A, DEVOLUCIONES_VENTAS_DETALLE F
                    WHERE F.DEVT_ID = :IDDOC  AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
                    INTO :ART, :IMPTOS
                    DO
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTACONSUMO, :CONC, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                    NROI = NROI + 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, :NROI, :CTACONSUMO, :CONC, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA + IMPTOS;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTACONSUMO, :CONC, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA + IMPTOS;
                END
            END /* IMPTOS <> 0 */
        END /* CONSUMO EN CTA CONSTANTE */
    /* DESCUENTO */
    if ((CTADTO IS NOT NULL) AND
        (CTADTO <> '') AND
        (VRDTO <> 0)) THEN
        BEGIN
        EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTADTO, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRDTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
            NROI = NROI + 1;
            SUMA = SUMA - VRDTO;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRDTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 33);
            NROI = NROI + 1;
            SUMA = SUMA - VRDTO;
            END
        END /* DESCUENTO */
    /* VALOR ADIC */
    if ((CTAADIC IS NOT NULL) AND
        (CTAADIC <> '') AND
        (VRADIC <> 0)) THEN
        BEGIN
        EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTAADIC, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRADIC, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
            NROI = NROI + 1;
            SUMA = SUMA + VRADIC;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRADIC, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 33);
            NROI = NROI + 1;
            SUMA = SUMA + VRADIC;
            END
        END /* VR. ADIC */
    /* VALOR EXTRA */
    if ((CTAEXTRA IS NOT NULL) AND
        (CTAEXTRA <> '') AND
        (VREXTRA <> 0)) THEN
        BEGIN
        EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTAEXTRA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VREXTRA, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
            NROI = NROI + 1;
            SUMA = SUMA + VREXTRA;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VREXTRA, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 33);
            NROI = NROI + 1;
            SUMA = SUMA + VREXTRA;
            END
        END /* VR. EXTRA */
    /* RETENCION FUENTE */
    if ((RTFTE = 'C') or (RTFTE = 'K')) then
      if (VRRTFTE <> 0) then
        BEGIN
        if (RTFTE = 'C') then
            CTARTFTE = TCTARTFTE;
        EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTARTFTE, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, (:VRSUBT*-1), :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
            NROI = NROI + 1;
            SUMA = SUMA - VRRTFTE;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, (:VRSUBT*-1), :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA - VRRTFTE;
            END
        /* AUTORETENCION */
        if (FAUTORET <= fecaux) then
            BEGIN
            EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'CUENTA DE AUTORETENCION EN LA FUENTE') returning_values (CTARTFTE);
            EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTARTFTE, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :VRSUBT, :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                NROI = NROI + 1;
                SUMA = SUMA + VRRTFTE;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :VRSUBT, :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA + VRRTFTE;
                END
            END
        END /* RTFTE */
    if (RTFTE = 'A') then
      BEGIN
      FOR SELECT MAX(COAR_CTARTFTEV), MAX(COAR_RTFTE), MIN(COAR_RTBASE), SUM(DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO), SUM((DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO)*COAR_RTFTE)
        FROM CONTABIL_ARTICULO C, devoluciones_ventas_detalle F
        WHERE F.devt_id = :IDDOC AND F.ARTI_COD = C.ARTI_COD AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
        GROUP BY COAR_CTARTFTEV
        INTO :CTARTFTE, :PRTFTE, :baseadic, :MONTO, :VRRTFTE
        DO
        BEGIN
        MONTO = MONTO * FACTOR;
        if (MONTO >= BASEADIC) then
            BEGIN
            VRRTFTE = VRRTFTE * FACTOR / 100;
            execute procedure redondee(VRRTFTE, DIG) returning_values (VRRTFTE);
            execute procedure redondee(MONTO, DIG) returning_values (MONTO);
            if (VRRTFTE <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTARTFTE, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, (:MONTO*-1), :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                    NROI = NROI + 1;
                    SUMA = SUMA - VRRTFTE;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, (:MONTO*-1), :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA - VRRTFTE;
                    END
                /* AUTORETENCION */
                if (FAUTORET <= fecaux) then
                    BEGIN
                    EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'CUENTA DE AUTORETENCION EN LA FUENTE') returning_values (CTARTFTE);
                    EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTARTFTE, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
                    if (ERRORC <> 0) then
                        ERROR = ERROR + 1;
                    if (TIPOCUEN = 'C') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :MONTO, :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                        NROI = NROI + 1;
                        SUMA = SUMA + VRRTFTE;
                        END
                    if (TIPOCUEN = 'N') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :MONTO, :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NROI = NROI + 1;
                        SUMA = SUMA + VRRTFTE;
                        END
                    END
                END
            END
        END /* RTFTE */
      END
    /* RETENCION IVA */
    if ((RTIVA = 'C') or (RTIVA = 'K')) then
      if (VRRTIVA <> 0) then
        BEGIN
        if (RTIVA = 'C') then
            CTARTIVA = TCTARTIVA;
        EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTARTIVA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTIVA, (:VRIVA*-1), :PORC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
            NROI = NROI + 1;
            SUMA = SUMA - VRRTIVA;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTIVA, (:VRIVA*-1), :PORC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA - VRRTIVA;
            END
        END /* RTIVA */
    /* RETENCION DE ICA */
    if ((RTICA = 'C') or (RTICA = 'K')) then
      if (VRRTICA <> 0) then
        BEGIN
        if (RTICA = 'C') then
            CTARTICA = TCTARTICA;
        EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTARTICA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTICA, (:VRSUBT*-1), :PRTICA, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
            NROI = NROI + 1;
            SUMA = SUMA - VRRTICA;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTICA, (:VRSUBT*-1), :PRTICA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA - VRRTICA;
            END
        END /* RTICA */
    /* CIERRE EL COMPROBANTE CONTRA LA CUENTA DEL TERCERO O LA CONSTANTE */
    if ((SUMA <> 0) and ((CARTERA = 'C') or (CARTERA = 'K') or (CARTERA = 'J'))) then
        BEGIN
        if (SUMA < 0) then
            BEGIN
            DEBITO = SUMA * -1;
            CREDITO = 0;
            END
        ELSE
            BEGIN
            DEBITO = 0;
            CREDITO = SUMA;
            END
        if (CARTERA = 'C') then
            CTACARTERA = TCTACLIEN;
        if (CARTERA = 'J') then
            BEGIN
            /* BUSQUE LA CUENTA DE LA CAJA */
            SELECT CAJA_CUENTA FROM CAJAS C, PUNTO_VENTA P
                WHERE P.CAJA_ID = C.CAJA_ID AND PTVT_ID = :PTOVTA
                INTO :CTACARTERA;
            END
        EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTACARTERA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :DEBITO, :CREDITO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
        if (TIPOCUEN = 'N') then
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :DEBITO, :CREDITO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
        NROI = NROI + 1;
        END /* SUMA EN CARTERA */
    /* CALCULE COSTOS EN VENTAS */
    EXECUTE PROCEDURE COSTO_EN_VENTAS(33, :IDDOC);
    if (COSTOS = 'A') then
        BEGIN
        FOR SELECT MAX(CTACOS), SUM(cast(CANT as double precision) * COSTO)
            FROM COSTO_VENTAS WHERE TIDO_COD = 33 AND COVE_ID = :IDDOC
            GROUP BY CTACOS
            INTO :CTACOSTOS, :MONTO
        DO
            BEGIN
            if (MONTO <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTACOSTOS, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT ARTI_COD, cast(CANT as double precision) * COSTO
                        FROM COSTO_VENTAS WHERE TIDO_COD = 33 AND COVE_ID = :IDDOC AND CTACOS = :CUENTA
                        INTO :ART, :MONTO
                    DO
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                    NROI = NROI + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    END
                END /* MONTO <> 0 */
            END /* FOR */
        END /* COSTOS */
    if (COSTOS = 'K') then
        BEGIN
        SELECT SUM(cast(CANT as double precision) * COSTO)
            FROM COSTO_VENTAS WHERE TIDO_COD = 33 AND COVE_ID = :IDDOC
            INTO :MONTO;
        if (MONTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTACOSTOS, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, REGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT ARTI_COD, cast(CANT as double precision) * COSTO
                    FROM COSTO_VENTAS WHERE TIDO_COD = 33 AND COVE_ID = :IDDOC
                    INTO :ART, :MONTO
                DO
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTACOSTOS, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                    NROI = NROI + 1;
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTACOSTOS, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                NROI = NROI + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTACOSTOS, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                END
            END /* MONTO <> 0 */
        END /* COSTOS = K */
    if (INVEN = 'A') then
        BEGIN
        FOR SELECT MAX(CTAINV), SUM(cast(CANT as double precision) * COSTO)
            FROM COSTO_VENTAS WHERE TIDO_COD = 33 AND COVE_ID = :IDDOC
            GROUP BY CTAINV
            INTO :CTAINVEN, :MONTO
        DO
            BEGIN
            if (MONTO <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTAINVEN, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, REGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT ARTI_COD, cast(CANT as double precision) * COSTO
                        FROM COSTO_VENTAS WHERE TIDO_COD = 33 AND COVE_ID = :IDDOC AND CTAINV = :CUENTA
                        INTO :ART, :MONTO
                    DO
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                    NROI = NROI + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    END
                END /* MONTO <> 0 */
            END /* FOR */
        END /* INVEN = A */
    if (INVEN = 'K') then
        BEGIN
        SELECT SUM(cast(CANT as double precision) * COSTO)
            FROM COSTO_VENTAS WHERE TIDO_COD = 33 AND COVE_ID = :IDDOC
            INTO :MONTO;
        if (MONTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTAINVEN, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT ARTI_COD, cast(CANT as double precision) * COSTO
                    FROM COSTO_VENTAS WHERE TIDO_COD = 33 AND COVE_ID = :IDDOC
                    INTO :ART, :MONTO
                DO
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTAINVEN, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                    NROI = NROI + 1;
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAINVEN, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                NROI = NROI + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAINVEN, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                END
            END /* MONTO <> 0 */
        END /* INVEN = K */
    /* recorra las cuentas adicionales */
    FOR SELECT INVC_CUENTA, INVC_BASE, INVC_PORC, INVC_VALOR, INVC_DB
        FROM INTERFAZ_VENTAS_CTAS WHERE INVE_ID = :IDINTER
        INTO :CTADIC, :BASEADIC, :PORCADIC, :VALORADIC, :DBADIC
        DO
        BEGIN
        if (valoradic <> 0) then
            monto = valoradic;
        else
            BEGIN
            if (:BASEADIC = 'SUBTOTAL') then
                VALORADIC = vrsubt;
            if (:BASEADIC = 'DESCUENTO') then
                VALORADIC = VRDTO;
            if (:BASEADIC = 'IVA') then
                VALORADIC = VRIVA;
            if (:BASEADIC = 'ADICIONAL') then
                VALORADIC = VRADIC;
            if (:BASEADIC = 'EXTRA') then
                VALORADIC = VREXTRA;
            if (:BASEADIC = 'TOTAL') then
                VALORADIC = VRTOTAL;
            MONTO = VALORADIC * PORCADIC;
            END
        if (MONTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTADIC, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                if (DBADIC = 'S') then
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                ELSE
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                NROI = NROI + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                if (DBADIC = 'S') then
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                ELSE
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                END
            NROI = NROI + 1;
            END
        END
    if (error > 0) then
        ver = 'S';
    SUSPEND;
    END
   END /* EXISTE LA INTERFAZ */
  ELSE
    BEGIN
    EXECUTE PROCEDURE ERROR (33, :IDDOC, :PREF, 1);
    ERROR = ERROR + 1;
    VER = 'S';
    SUSPEND;
    END
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE DEVOLUCIONES_SIN_CONTABILIDAD(
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    ID INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    ESTADO VARCHAR(20),
    IDI INTEGER,
    IDC INTEGER)
AS
DECLARE VARIABLE VER CHAR(2);
declare variable FECICNT VARCHAR(10);
declare variable FECFCNT VARCHAR(10);
declare variable ERROR INTEGER;
declare variable idref INTEGER;
BEGIN
EXECUTE PROCEDURE fecha_a_conta(FECINI) returning_values (FECICNT);
EXECUTE PROCEDURE fecha_a_conta(FECFIN) returning_values (FECFCNT);
FOR SELECT DEVT_ID, PREF_PRE, DEVT_NUMERO FROM devoluciones_ventas WHERE DEVT_ANULADO = 'N' AND
    DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN
    INTO :ID, :PREF, :NUMERO
DO
  BEGIN
  idref = null;
  SELECT ENCO_IDREF FROM COMPROBANTE_ENCABEZADO WHERE ENCO_TIPOREF = 33 AND ENCO_FECHA >= :FECICNT AND ENCO_FECHA <= :FECFCNT and ENCO_IDREF = :id into :idref;
  if (idref IS NULL) then
  begin
   ESTADO = 'PROCESANDO';
   SUSPEND;
   SELECT MAX(INVE_ID) FROM INTERFAZ_VENTAS WHERE PREF_PRE = :PREF AND TIDO_COD = 33 INTO :IDI;
   EXECUTE PROCEDURE contabil_devolcli (:ID, :IDI) RETURNING_VALUES (:ERROR, :VER, :IDC);
   if (ERROR = 0) then
    BEGIN
    EXECUTE PROCEDURE CONTABILIZA_PENDIENTE (:IDC);
    ESTADO = 'OK';
    END
   ELSE
    ESTADO = 'ERROR';
   suspend;
  End
  END
END

^

SET TERM ; ^


/* 20100204C */
/* si articulo mas proporcion por dias multiplicaba por 100 el porcentaje */

SET TERM ^ ;

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

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

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

SET TERM ; ^


/* 20100204D */
/* NATURALEZA DE CUENTAS INVERTIDA */
SET TERM ^ ;

CREATE OR ALTER procedure CONTABIL_APLICAPR (
    IDDOC integer,
    IDINTER integer)
returns (
    ERROR integer,
    VER char(1),
    IDC integer)
AS
declare variable PREF VARCHAR(4);
declare variable NUM VARCHAR(6);
declare variable NUMERO VARCHAR(10);
declare variable NUMDOC VARCHAR(10);
declare variable FECAUX DATE;
declare variable FECHA CHAR(8);
declare variable CONC CHAR(120);
declare variable VRSUBT NUMERIC(18, 2);
declare variable TIPOCOMP VARCHAR(3);
declare variable PREFCONT VARCHAR(4);
declare variable BASE CHAR(1);
declare variable CTABASE VARCHAR(20);
declare variable CLIE CHAR(1);
declare variable CTACLIE VARCHAR(20);
declare variable EXISTE CHAR(1);
declare variable CUENTA VARCHAR(20);
declare variable TIPOCUEN CHAR(1);
declare variable NIT VARCHAR(20);
declare variable PROY VARCHAR(4);
declare variable CENTRO VARCHAR(4);
declare variable NROI INTEGER;
declare variable TCTACLIEN VARCHAR(20);
declare variable TCTABASE VARCHAR(20);
declare variable ANULADO CHAR(1);
declare variable TIPODOC INTEGER;
declare variable RETES CHAR(2);
declare variable APLICADO NUMERIC(18,2);
BEGIN
execute procedure lee_configuracion('CXPAGAR', 'SALDOS', 'DESCONTAR RETENCIONES POR CAUSACION') returning_values (RETES);
ERROR = 0;
/* BUSQUE LA INTERFACE */
EXISTE = 'N';
SELECT 'S', TICO_COD, PRCO_PRE, INCP_BASE, INCP_PROV, INCP_CTABASE, INCP_CTAPROV, INCP_CONFIRMAR
  FROM INTERFAZ_CXPAGAR
  WHERE INCP_ID = :IDINTER
  INTO :EXISTE, :TIPOCOMP, :PREFCONT, :BASE, :CLIE, :CTABASE, :CTACLIE, :VER;

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

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

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

    FOR SELECT APPD_APLICADO+APPD_RTFTE+APPD_RTIVA+APPD_RTICA, APPD_PREFIJO || APPD_NUMERO, APPD_TIPODOC, APPD_APLICADO
        FROM aplicacion_proveedor_detalle
        WHERE APPR_ID = :IDDOC
        INTO :vrsubt, :numdoc, :tipodoc, :aplicado
        DO
        BEGIN
        if (RETES = 'SI') then
            vrsubt = aplicado;
        IF ((VRSUBT < 0) AND ((BASE = 'T') OR (BASE = 'K'))) THEN
            BEGIN
            IF (BASE = 'T') THEN
                CTABASE = TCTABASE;
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTABASE INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERROR (53, :IDDOC, :CTABASE, 2);
                CUENTA = CTABASE;
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERROR (53, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, ABS(:VRSUBT), 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, :numdoc, :FECHA, NULL, :tipodoc, 43);
                NROI = NROI + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, ABS(:VRSUBT), 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                END
            END /* MONTO <> 0 */
        if ((VRSUBT > 0) and ((CLIE = 'T') or (CLIE = 'K'))) then
            BEGIN
            if (CLIE = 'T') then
                CTACLIE = TCTACLIEN;
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTACLIE INTO :CUENTA, :TIPOCUEN;
            IF (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERROR (53, :IDDOC, :CTACLIE, 2);
                CUENTA = CTACLIE;
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERROR (53, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :vrsubt, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, :numdoc, :FECHA, NULL, :tipodoc, 43);
            if (TIPOCUEN = 'N') then
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :vrsubt, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            END /* CARTERA */
        END /* DO */
    END
  if (ERROR > 0) then
    VER = 'S';
  SUSPEND;
  END /* EXISTE LA INTERFAZ */
ELSE
    BEGIN
    EXECUTE PROCEDURE ERROR (53, :IDDOC, :PREF, 1);
    ERROR = ERROR + 1;
    VER = 'S';
    SUSPEND;
    END
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE APLICACIONPR_SIN_CONTABILIDAD(
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    ID INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    ESTADO VARCHAR(20),
    IDI INTEGER,
    IDC INTEGER,
    ERROR INTEGER)
AS
DECLARE VARIABLE VER CHAR(2);
declare variable FECICNT VARCHAR(10);
declare variable FECFCNT VARCHAR(10);
declare variable idref INTEGER;
BEGIN
EXECUTE PROCEDURE fecha_a_conta(FECINI) returning_values (FECICNT);
EXECUTE PROCEDURE fecha_a_conta(FECFIN) returning_values (FECFCNT);
FOR SELECT APPR_ID, PREF_PRE, APPR_NUMERO FROM aplicacion_provedor WHERE APPR_ANULADO = 'N' AND
    APPR_FECHA >= :FECINI AND APPR_FECHA <= :FECFIN ORDER BY APPR_ID
    INTO :ID, :PREF, :NUMERO
DO
  BEGIN
  idref = null;
  SELECT ENCO_IDREF FROM COMPROBANTE_ENCABEZADO WHERE ENCO_TIPOREF = 53 AND ENCO_FECHA >= :FECICNT AND ENCO_FECHA <= :FECFCNT and ENCO_IDREF = :id into :idref;
  if (idref IS NULL) then
  begin
   ESTADO = 'PROCESANDO';
   SUSPEND;
   SELECT MAX(INCP_ID) FROM interfaz_cxpagar WHERE PREF_PRE = :PREF AND TIDO_COD = 53 INTO :IDI;
   EXECUTE PROCEDURE contabil_aplicapr (:ID, :IDI) RETURNING_VALUES (:ERROR, :VER, :IDC);
   if (ERROR = 0) then
    BEGIN
    EXECUTE PROCEDURE CONTABILIZA_PENDIENTE (:IDC);
    ESTADO = 'OK';
    END
   ELSE
    ESTADO = 'ERROR';
   suspend;
  end
  END
END

^

SET TERM ; ^



/* 20100205 */
/* EVITAR UN MULTIPLE ROWS SI HAY MAS DE UNA CUENTA DEL PASIVO EN EL DOC. A PAGAR */
SET TERM ^ ;

CREATE OR ALTER procedure CONTABIL_EGRESO (
    IDDOC integer,
    IDINTER integer)
returns (
    ERROR integer,
    VER char(1),
    IDC integer)
AS
declare variable PREF VARCHAR(4);
declare variable NUM VARCHAR(6);
declare variable FECAUX DATE;
declare variable FECHA CHAR(8);
declare variable CONC CHAR(120);
declare variable VRDTO NUMERIC(18, 2);
declare variable VRRTFTE NUMERIC(18, 2);
declare variable VRRTIVA NUMERIC(18, 2);
declare variable VRRTICA NUMERIC(18, 2);
declare variable VRTOTAL NUMERIC(18, 2);
declare variable TIPOCOMP VARCHAR(3);
declare variable PREFCONT VARCHAR(4);
declare variable BASE CHAR(1);
declare variable CTABASE VARCHAR(20);
declare variable CAJA CHAR(1);
declare variable CTACAJA VARCHAR(20);
declare variable RTFTE CHAR(1);
declare variable CTARTFTE VARCHAR(20);
declare variable RTIVA CHAR(1);
declare variable CTARTIVA VARCHAR(20);
declare variable RTICA CHAR(1);
declare variable CTARTICA VARCHAR(20);
declare variable DTO CHAR(1);
declare variable CTADTO VARCHAR(20);
declare variable EXISTE CHAR(1);
declare variable CUENTA VARCHAR(20);
declare variable MONTO NUMERIC(18,2);
declare variable ES_RETENCION CHAR(1);
declare variable TIPOCUEN CHAR(1);
declare variable NIT VARCHAR(20);
declare variable PROY VARCHAR(4);
declare variable CENTRO VARCHAR(4);
declare variable MONTOBASE NUMERIC(18,2);
declare variable PORC NUMERIC(9,2);
declare variable DEBITO NUMERIC(18,2);
declare variable CREDITO NUMERIC(18,2);
declare variable NROI INTEGER;
declare variable SUMA NUMERIC(18,2);
declare variable TCTACLIEN VARCHAR(20);
declare variable TCTARTFTE VARCHAR(20);
declare variable TCTARTIVA VARCHAR(20);
declare variable TCTARTICA VARCHAR(20);
declare variable TCTACART VARCHAR(20);
declare variable TIPOIT INTEGER;
declare variable IDIT INTEGER;
declare variable PREFIT VARCHAR(4);
declare variable NUMIT VARCHAR(6);
declare variable NUMEROIT VARCHAR(10);
declare variable ABONOIT NUMERIC(18,2);
declare variable CTADIC VARCHAR(20);
declare variable BASEADIC VARCHAR(20);
declare variable PORCADIC NUMERIC(5,2);
declare variable VALORADIC NUMERIC(18,2);
declare variable DBADIC CHAR(1);
declare variable VRBASE NUMERIC(18,2);
declare variable GMF CHAR(1);
declare variable CODBCO INTEGER;
declare variable NUMCHEQ VARCHAR(20);
declare variable CRUCES NUMERIC(18,2);
declare variable VRCAJA NUMERIC(18,2);
declare variable OK INTEGER;
declare variable DIFCAMBIO NUMERIC(18,2);
declare variable CTADIF VARCHAR(20);
declare variable RTFTEC NUMERIC(18,2);
declare variable RTIVAC NUMERIC(18,2);
declare variable RTICAC NUMERIC(18,2);
declare variable RTFTER CHAR(1);
declare variable CTARTFTER VARCHAR(20);
declare variable RTIVAR CHAR(1);
declare variable CTARTIVAR VARCHAR(20);
declare variable RTICAR CHAR(1);
declare variable CTARTICAR VARCHAR(20);
declare variable RET CHAR(2);
declare variable RTIT NUMERIC(18,2);
declare variable NITBCO VARCHAR(20);
declare variable NUMPROV CHAR(8);
BEGIN
/* BUSQUE LA INTERFACE */
EXISTE = 'N';
SELECT 'S', TICO_COD, PRCO_PRE, INCJ_BASE, INCJ_DTOPP, INCJ_RTFTE, INCJ_RTIVA, INCJ_RTICA, INCJ_CAJA, INCJ_CTABASE, INCJ_CTADTO, INCJ_CTARTFTE, INCJ_CTARTIVA, INCJ_CTARTICA, INCJ_CTACAJA, INCJ_CONFIRMAR
    FROM INTERFAZ_CAJA
    WHERE INCJ_ID = :IDINTER
    INTO :EXISTE, :TIPOCOMP, :PREFCONT, :BASE, :DTO, :RTFTE, :RTIVA, :RTICA, :CAJA, :CTABASE, :CTADTO, :CTARTFTE, :CTARTIVA, :CTARTICA, :CTACAJA, :VER;
if (EXISTE = 'S') then
    BEGIN
    OK = 0;
    FOR SELECT CNTB_ID FROM CONTABILIZACION WHERE CNTB_TIPOREF = 62 AND CNTB_IDREF = :IDDOC INTO :OK DO
        BEGIN
        DELETE FROM CONTABILIZACION_DET WHERE CNTB_ID = :OK;
        DELETE FROM CONTABILIZACION WHERE CNTB_ID = :OK;
        END

    /* TRAIGA EL ENCABEZADO DEL EGRESO */
    SELECT PREF_PRE, EGRE_NUMERO, EGRE_FECHA, E.TERC_NIT, EGRE_CONC, EGRE_DTOF, EGRE_MONTO, EGRE_RTFTEMONTO, EGRE_RTIVAMONTO, EGRE_RTICAMONTO, TERC_CTARTFTE, TERC_CTARTIVA, TERC_CTARTICA, TERC_CTACLIENTE
        FROM EGRESOS E, TERCEROS T
        WHERE EGRE_ID = :IDDOC AND E.TERC_NIT = T.TERC_NIT
        INTO :PREF, :NUM, :FECAUX, :NIT, :CONC, :VRDTO, :VRTOTAL, :VRRTFTE, :VRRTIVA, :VRRTICA, :TCTARTFTE, TCTARTIVA, TCTARTICA, TCTACLIEN;
    /* SI ES PROVEEDOR, SOBREESCIBE LAS CUENTAS  */
    SELECT PROV_CTAPAGAR, PROV_CTARTFTE, PROV_CTARTIVA, PROV_CTARTICA
        FROM PROVEEDORES WHERE TERC_NIT = :NIT
        INTO TCTACLIEN, TCTARTFTE, TCTARTIVA, TCTARTICA;
    SELECT PREF_CENTRO, PREF_PROY FROM PREFIJOS
        WHERE PREF_PRE = :PREF AND TIDO_COD = 62 INTO :CENTRO, :PROY;
    EXECUTE PROCEDURE FECHA_A_CONTA(:FECAUX) returning_values (:FECHA);
    /* REGISTRE EL ENCABEZADO CONTABLE */
    IDC = GEN_ID(ID_CONTABILIZA, 1);
    INSERT INTO CONTABILIZACION (CNTB_ID, CNTB_TIPOCOMP, CNTB_PREFCNT, CNTB_NUMERO, CNTB_FECHA, CNTB_CONCEPTO, CNTB_REF, CNTB_TIPOREF, CNTB_IDREF, CNTB_PREFREF, CNTB_NUMREF, CNTB_PROCESADO)
        VALUES (:IDC, :TIPOCOMP, :PREFCONT, :NUM, :FECHA, :CONC, '', 62, :IDDOC, :PREF, :NUM, 'N');
    /* SUME LOS CRUCES PARA LLEVARLOS A LA CUENTA X PAGAR Y RESTAR DE LA CAJA */
    SELECT SUM(EGCC_ABONO) FROM EGRESOS_CRUCEC WHERE EGRE_ID = :iddoc INTO :CRUCES;
    if (CRUCES IS NULL) then
        CRUCES = 0;
    VRCAJA = VRTOTAL;
    NROI = 0;
    SUMA = 0;
    ERROR = 0;
    /* EL CREDITO EN LA CAJA O EL BANCO */
    IF ((CAJA = 'K')) THEN
        BEGIN
        if (VRCAJA <> 0) then
            BEGIN
            CUENTA = NULL;
            EXECUTE PROCEDURE VALIDE_CUENTA_C (CTACAJA) RETURNING_VALUES (:OK);
            IF (OK = 0) THEN
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :CTACAJA INTO :CUENTA, :TIPOCUEN;
            ELSE
                begin
                EXECUTE PROCEDURE ERROR (62, :IDDOC, :CTACAJA, 2);
                CUENTA = CTACAJA;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 4);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRCAJA, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - VRCAJA;
                END
            END /* VRCAJA <> 0 */
        END /* CAJA CONSTANTE */
    IF ((CAJA = 'F')) THEN
        BEGIN
        /* mueva la cuenta de la caja o el banco o ambas */
        /* PRIMERO LA CAJA */
        FOR SELECT CAJA_CUENTA, EGCA_MONTO FROM EGRESOS_CAJA E, CAJAS C
            WHERE C.CAJA_ID = E.CAJA_ID AND EGRE_ID = :IDDOC
            INTO :CTACAJA, :MONTO
            DO
            BEGIN
            if (MONTO <> 0) then
                BEGIN
                CUENTA = NULL;
                EXECUTE PROCEDURE VALIDE_CUENTA_C (CTACAJA) RETURNING_VALUES (:OK);
                IF (OK = 0) THEN
                    SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                        WHERE CUEN_COD = :CTACAJA INTO :CUENTA, :TIPOCUEN;
                ELSE
                    begin
                    EXECUTE PROCEDURE ERROR (62, :IDDOC, :CTACAJA, 2);
                    CUENTA = CTACAJA;
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 4);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA - MONTO;
                    END
                END /* MONTO <> 0 */
            END /* DO CAJA */
        /* AHORA EL BANCO */
        MONTO = 0;
        SELECT CUBA_CTACONTA, EGBC_MONTO, EGBC_GMF, E.CUBA_COD, CUBA_GMFPOR, EGBC_NUMERO, BANC_NIT
            FROM EGRESOS_BANCO E, CUENTAS_BANCO C, BANCOS B
            WHERE E.CUBA_COD = C.CUBA_COD AND EGRE_ID = :IDDOC AND B.banc_cod = C.banc_cod
            INTO :CTACAJA, :MONTO, :GMF, :CODBCO, :PORC, :NUMCHEQ, :nitbco;
        if (MONTO <> 0) then
            BEGIN
            if (MONTO <> 0) then
                BEGIN
                CUENTA = NULL;
                EXECUTE PROCEDURE VALIDE_CUENTA_C (CTACAJA) RETURNING_VALUES (:OK);
                IF (OK = 0) THEN
                    SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                        WHERE CUEN_COD = :CTACAJA INTO :CUENTA, :TIPOCUEN;
                ELSE
                    begin
                    EXECUTE PROCEDURE ERROR (62, :IDDOC, :CTACAJA, 2);
                    CUENTA = CTACAJA;
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 4);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, :NUMCHEQ, 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA - MONTO;
                    END
                /* EL GMF */
                if ((GMF = 'S') AND (PORC <> 0)) then
                    BEGIN
                    if (NITBCO IS NULL) then
                        NITBCO = NIT;
                    EXECUTE procedure REDONDEE(:MONTO * :PORC / 1000, 0) returning_values (MONTO);
                    /* REGISTRE EL GMF EN LA MISMA CUENTA DEL BANCO COMO CREDITO */
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, :NUMCHEQ, 0, :MONTO, 0, 0, :NITBCO, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA - MONTO;

                    /* AHORA LA CUENTA DEL GASTO */
                    SELECT CUBA_CTAGMF FROM CUENTAS_BANCO
                        where CUBA_COD = :CODBCO INTO :CTACAJA;
                    EXECUTE PROCEDURE VALIDE_CUENTA_C (CTACAJA) RETURNING_VALUES (:OK);
                    IF (OK = 0) THEN
                        SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                            WHERE CUEN_COD = :CTACAJA INTO :CUENTA, :TIPOCUEN;
                    ELSE
                        begin
                        EXECUTE PROCEDURE ERROR (62, :IDDOC, :CTACAJA, 2);
                        CUENTA = CTACAJA;
                        TIPOCUEN = 'N';
                        ERROR = ERROR + 1;
                        end
                    if (TIPOCUEN = 'I') then
                        BEGIN
                        EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
                        TIPOCUEN = 'N';
                        ERROR = ERROR + 1;
                        END
                    if (TIPOCUEN = 'C') then
                        BEGIN
                        EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 4);
                        TIPOCUEN = 'N';
                        ERROR = ERROR + 1;
                        END
                    if (TIPOCUEN = 'N') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, :NUMCHEQ, :MONTO, 0, 0, 0, :NITBCO, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NROI = NROI + 1;
                        SUMA = SUMA + MONTO;
                        END
                    END /* GMF */
                END /* MONTO <> 0 */
            END /* EGRESO_BANCO */
        END /* CAJA = F */

    /* LOS CRUCES CON CUENTAS X COBRAR */
    if (CRUCES <> 0) then
        BEGIN
        SELECT TERC_CTACLIENTE FROM TERCEROS WHERE TERC_NIT = :nit INTO :tctacart;
        if (tctacart IS NULL) then
            tctacart = tctaclien;
        CUENTA = NULL;
        EXECUTE PROCEDURE VALIDE_CUENTA_C (tctacart) RETURNING_VALUES (:OK);
        IF (OK = 0) THEN
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :tctacart INTO :CUENTA, :TIPOCUEN;
        ELSE
            begin
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :tctacart, 2);
            CUENTA = tctacart;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            /* DEBERIA RECORRER DOCUMENTO POR DOCUMENTO */
            FOR SELECT EGCC_TIPODOC, EGCC_PREFIJO, EGCC_NUMERO, EGCC_ABONO+EGCC_RTFTE+EGCC_RTIVA+EGCC_RTICA+EGCC_DTOF
                FROM egresos_crucec WHERE EGRE_ID = :IDDOC
                INTO :TIPOIT, PREFIT, NUMIT, ABONOIT
                DO
                BEGIN
                NUMEROIT = PREFIT || NUMIT;
                if (ABONOIT > 0) then
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :ABONOIT, 0, 0, :NIT, :PROY, :CENTRO, NULL, :NUMEROIT, NULL, NULL, :TIPOIT, 0);
                else
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', abs(:ABONOIT), 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, :NUMEROIT, NULL, NULL, :TIPOIT, 0);
                SUMA = SUMA - ABONOIT;
                NROI = NROI + 1;
                END
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            if (CRUCES > 0) then
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :CRUCES, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            else
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', abs(:CRUCES), 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            SUMA = SUMA - CRUCES;
            NROI = NROI + 1;
            END
        /* LA DIFERENCIA EN CAMBIO */
        SELECT SUM(EGCC_DIFCAMBIO) FROM egresos_crucec WHERE EGRE_ID = :iddoc INTO :DIFCAMBIO;
        IF ((DIFCAMBIO IS NOT NULL) AND (DIFCAMBIO <> 0)) THEN
            BEGIN
            if (DIFCAMBIO > 0) then
                execute procedure lee_configuracion('GENERAL','GENERAL','CUENTA DE INGRESO POR DIFERENCIA EN CAMBIO PARA OPERACIONES EN OTRA MONEDA') returning_values (:ctadif);
            else
                execute procedure lee_configuracion('GENERAL','GENERAL','CUENTA DE GASTO POR DIFERENCIA EN CAMBIO PARA OPERACIONES EN OTRA MONEDA') returning_values (:ctadif);
            CUENTA = NULL;
            EXECUTE PROCEDURE VALIDE_CUENTA_C (ctadif) RETURNING_VALUES (:OK);
            IF (OK = 0) THEN
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :ctadif INTO :CUENTA, :TIPOCUEN;
            ELSE
                begin
                EXECUTE PROCEDURE ERROR (62, :IDDOC, :ctadif, 2);
                CUENTA = ctadif;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 4);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                if (DIFCAMBIO > 0) then
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :difcambio, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                else
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', ABS(:difcambio), 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - difcambio;
                END
            END
        /* RETEFUENTE DEL CRUCE */
        SELECT first 1 INCJ_RTFTE, INCJ_RTIVA, INCJ_RTICA, INCJ_CTARTFTE, INCJ_CTARTIVA, INCJ_CTARTICA
            FROM INTERFAZ_CAJA WHERE tido_cod = 61 into :RTFTER, :RTIVAR, :RTICAR, :CTARTFTER, :CTARTIVAR, :CTARTICAR;
        SELECT SUM(EGCC_RTFTE) FROM egresos_crucec WHERE EGRE_ID = :iddoc INTO :rtftec;
        IF ((rtftec IS NOT NULL) AND (rtftec <> 0)) THEN
            BEGIN
            if ((RTFTER = 'T') or (RTFTER = 'K')) then
                BEGIN
                if (RTFTER = 'T') then
                    SELECT TERC_CTARTFTE FROM TERCEROS WHERE TERC_NIT = :NIT INTO CTARTFTER;
                CUENTA = NULL;
                EXECUTE PROCEDURE VALIDE_CUENTA_C (ctartfter) RETURNING_VALUES (:OK);
                IF (OK = 0) THEN
                    SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                        WHERE CUEN_COD = :ctartfter INTO :CUENTA, :TIPOCUEN;
                ELSE
                    begin
                    EXECUTE PROCEDURE ERROR (62, :IDDOC, :ctartfter, 2);
                    CUENTA = ctartfter;
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 4);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    if (rtftec > 0) then
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :rtftec, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    else
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, abs(:rtftec), 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA + rtftec;
                    END
                END
            END
        /* RETEIVA DEL CRUCE */
        SELECT SUM(EGCC_RTIVA) FROM egresos_crucec WHERE EGRE_ID = :iddoc INTO :rtivac;
        IF ((rtivac IS NOT NULL) AND (rtivac <> 0)) THEN
            BEGIN
            if ((RTIVAR = 'T') or (RTIVAR = 'K')) then
                BEGIN
                if (RTIVAR = 'T') then
                    SELECT TERC_CTARTIVA FROM TERCEROS WHERE TERC_NIT = :NIT INTO CTARTIVAR;
                CUENTA = NULL;
                EXECUTE PROCEDURE VALIDE_CUENTA_C (ctartivar) RETURNING_VALUES (:OK);
                IF (OK = 0) THEN
                    SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                        WHERE CUEN_COD = :ctartivar INTO :CUENTA, :TIPOCUEN;
                ELSE
                    begin
                    EXECUTE PROCEDURE ERROR (62, :IDDOC, :ctartivar, 2);
                    CUENTA = ctartivar;
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 4);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    if (rtivac > 0) then
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :rtivac, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    else
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, abs(:rtivac), 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA + rtivac;
                    END
                END
            END
        /* RETEICA DEL CRUCE */
        SELECT SUM(EGCC_RTICA) FROM egresos_crucec WHERE EGRE_ID = :iddoc INTO :rticac;
        IF ((rticac IS NOT NULL) AND (rtivac <> 0)) THEN
            BEGIN
            if ((RTICAR = 'T') or (RTICAR = 'K')) then
                BEGIN
                if (RTICAR = 'T') then
                    SELECT TERC_CTARTICA FROM TERCEROS WHERE TERC_NIT = :NIT INTO CTARTICAR;
                CUENTA = NULL;
                EXECUTE PROCEDURE VALIDE_CUENTA_C (ctarticar) RETURNING_VALUES (:OK);
                IF (OK = 0) THEN
                    SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                        WHERE CUEN_COD = :ctarticar INTO :CUENTA, :TIPOCUEN;
                ELSE
                    begin
                    EXECUTE PROCEDURE ERROR (62, :IDDOC, :ctarticar, 2);
                    CUENTA = ctarticar;
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 4);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    if (rticac > 0) then
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :rticac, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    else
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, abs(:rticac), 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA + rticac;
                    END
                END
            END
        END /* cruces */

    if (DTO = 'K') then /* DTO EN CTA CONSTANTE */
        BEGIN
        if (VRDTO <> 0) then
            BEGIN
            CUENTA = NULL;
            EXECUTE PROCEDURE VALIDE_CUENTA_C (CTADTO) RETURNING_VALUES (:OK);
            IF (OK = 0) THEN
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :CTADTO INTO :CUENTA, :TIPOCUEN;
            ELSE
                begin
                EXECUTE PROCEDURE ERROR (62, :IDDOC, :CTADTO, 2);
                CUENTA = CTADTO;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 4);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRDTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - VRDTO;
                END
            END /* VRDTO <> 0 */
        END /* DTO EN CTA CONSTANTE */

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

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE EGRESOS_SIN_CONTABILIDAD(
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    ID INTEGER,
    IDI INTEGER,
    IDC INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    ESTADO VARCHAR(20),
    ERROR INTEGER)
AS
DECLARE VARIABLE VER CHAR(2);
declare variable FECICNT VARCHAR(10);
declare variable FECFCNT VARCHAR(10);
declare variable idref INTEGER;
BEGIN
EXECUTE PROCEDURE fecha_a_conta(FECINI) returning_values (FECICNT);
EXECUTE PROCEDURE fecha_a_conta(FECFIN) returning_values (FECFCNT);
FOR SELECT EGRE_ID, PREF_PRE, egre_numero FROM EGRESOS WHERE EGRE_ANULADO = 'N' AND PREF_PRE <> 'R004' AND
    EGRE_FECHA >= :FECINI AND EGRE_FECHA <= :FECFIN ORDER BY EGRE_ID INTO :ID, :PREF, :NUMERO
DO
  BEGIN
  idref = null;
  SELECT ENCO_IDREF FROM COMPROBANTE_ENCABEZADO WHERE ENCO_TIPOREF = 62 AND ENCO_FECHA >= :FECICNT AND ENCO_FECHA <= :FECFCNT and ENCO_IDREF = :ID into :idref;
  if (idref IS NULL) then
  begin
   ESTADO = 'PROCESANDO';
   SUSPEND;
   SELECT MAX(INCJ_ID) FROM INTERFAZ_CAJA WHERE PREF_PRE = :PREF AND TIDO_COD = 62 INTO :IDI;
   EXECUTE PROCEDURE CONTABIL_EGRESO (:ID, :IDI) RETURNING_VALUES (:ERROR, :VER, :IDC);
   IF (ERROR = 0) THEN
      BEGIN
      EXECUTE PROCEDURE CONTABILIZA_PENDIENTE (:IDC);
      ESTADO = 'OK';
      END
   ELSE
    ESTADO = 'ERROR';
   suspend;
  end
  END
END

^

SET TERM ; ^


/* 20100206 */
/* AUDITORIA DE PARAMETROS DE CONFIGURACION */

INSERT INTO TIPO_DOCUMENTO (TIDO_COD, TIDO_NOMCORTO, TIDO_NOMLARGO, TIDO_MODULO, TIDO_INVE, TIDO_CART, TIDO_CXP, TIDO_CAJA, TIDO_BCOS) VALUES (140, 'CONFIGUR', 'CONFIGURACION', NULL, 'N', 'N', 'N', 'N', 'N');
COMMIT WORK;

SET TERM ^ ;

create trigger CONFIGURACION_AU for CONFIGURACION
active AFTER UPDATE position 0
as
begin
INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD, AUDI_RAZON)
    VALUES (USER, 140, 0, 'U', NEW.conf_modulo, NEW.conf_categoria || ',' || NEW.conf_propiedad || ',' || NEW.conf_valor);
end
^

SET TERM ; ^


/* 20100206B */
/* conciliacion banco vs conta si conta null no reportaba  */

SET TERM ^ ;

CREATE OR ALTER procedure CONCILIA_BANCO_CONTA (
    FECINI date,
    FECFIN date,
    BANCO varchar(3),
    CTABANCO varchar(20),
    NULO1 char(1))
returns (
    FECHA date,
    TIPODOC varchar(10),
    TIPO integer,
    ID integer,
    PREF varchar(4),
    NUMERO varchar(6),
    FECCONTA char(10),
    MONTO numeric(18,2),
    MONTOC numeric(18,2),
    DIFERENCIA numeric(18,2))
AS
declare variable FECINIC char(10);
declare variable FECFINC char(10);
declare variable db char(1);
begin
DELETE FROM concilia_banco_conta_aux;
FOR select m.moba_tipodoc, m.moba_idref, m.moba_total, m.moba_fecha, m.moba_pref, m.moba_numero, m.moba_db
    from movimiento_banco m, cuentas_banco c
    where c.cuba_cod = m.cuba_cod and c.cuba_codcta = :banco and m.moba_fecha >= :FECINI and m.moba_fecha <= :FECFIN
    into :TIPO, :ID, :monto, :fecha, :pref, :numero, :db
    DO
    BEGIN
    SELECT TIDO_NOMCORTO FROM tipo_documento WHERE TIDO_COD = :tipo INTO :tipodoc;
    if (db = 'N') then
        monto = monto * -1;
    /* BUSQUE EL CONTABLE */
    montoc = 0;
    if (TIPO = 72) then
        begin
        TIPO = 62;
        select ch.cheq_idegreso from cheques ch where ch.cheq_id = :id into :id;
        end
    if (TIPO = 73) then
        begin
        TIPO = 62;
        select r.reti_idegreso from retiros r where r.reti_id = :id into :id;
        end

    SELECT sum(CODE_DEBITO-CODE_CREDITO) FROM comprobante_detalle D, comprobante_encabezado C
        where C.enco_consec = D.enco_consec AND C.enco_tiporef = :TIPO AND C.enco_idref = :ID AND D.cuen_cod = :ctabanco
        INTO :montoc;
    if (montoc is null) then
    montoc = 0;
    diferencia = (monto - montoc);
    if (DIFERENCIA <> 0) then
        SUSPEND;
    INSERT INTO concilia_banco_conta_aux (COBC_TIPO, COBC_ID) VALUES(:TIPO, :ID);
    END
/* AGREGUE LAS QUE NO TIENEN MOVBANCO */
fecha = null;
monto = 0;
EXECUTE PROCEDURE fecha_a_conta (:FECINI) returning_values (:FECINIC);
EXECUTE PROCEDURE fecha_a_conta (:FECFIN) returning_values (:FECFINC);
FOR SELECT e.tico_cod, e.enco_fecha, e.prco_pref, e.enco_numero, CODE_DEBITO-CODE_CREDITO, e.enco_tiporef, e.enco_idref FROM comprobante_detalle D, comprobante_encabezado e
    where e.enco_consec = D.enco_consec AND CUEN_COD = :ctabanco AND e.enco_fecha >= :fecinic AND e.enco_fecha <= :fecfinc AND
    not exists (select cobc_id FROM concilia_banco_conta_aux WHERE cobc_tipo = e.enco_tiporef and cobc_id = e.enco_idref)
    INTO :tipodoc, :fecconta, :pref, :numero, :montoc, :tipo, :id
    do
    BEGIN
    diferencia = montoc;
    SUSPEND;
    END
end
^

SET TERM ; ^

/* 20100208 */

INSERT INTO CONFIGURACION (CONF_MODULO, CONF_CATEGORIA, CONF_PROPIEDAD, CONF_VALOR, CONF_POSIBLES, CONF_AYUDA) VALUES ('FACTURACION', 'POS', 'PREGUNTAR VENDEDOR EN CADA NUEVA FACTURA', 'NO', 'SI,NO', 'SI: Permite cambiar el vendedor en cada nueva factura ubicandose en el encabezado de la factura. NO: Toma el vendedor con que se ingresó al pos.');
commit work;

/* 20100209 */
/* merma como porcentaje hacia arriba */

SET TERM ^ ;

CREATE OR ALTER PROCEDURE CONSOLIDE_PRODUCCION(
    PLANID INTEGER)
AS
declare variable item integer;
declare variable artic varchar(20);
declare variable cant numeric(18,4);
declare variable cantpro numeric(18,4);
declare variable codcmp varchar(20);
declare variable cantcmp numeric(18,4);
declare variable porcmp float;
declare variable undcmp varchar(8);
declare variable factor float;
declare variable pesocmp numeric(18,4);
declare variable peso numeric(18,4);
declare variable merma numeric(18,4);
declare variable tipoord integer;
declare variable numrows integer;
declare variable total float;
declare variable descr varchar(60);
declare variable unidad varchar(8);
begin
ITEM = 0;
FOR SELECT ARTI_COD, PLPD_CANT * PLPD_FACTOR, PLPD_PESO
    from PLAN_PRODUCCION_DET WHERE PLPR_ID = :PLANID
    INTO :ARTIC, :CANTPRO, :PESO
    DO
    BEGIN
    select sum(arpr_porc) from articulos_producto where arti_cod = :artic into :total;
    FOR SELECT arpr_comp, ARPR_CANT, ARPR_UNIDAD, ARPR_PORC, ARTI_UNIDAD, ARTI_DES, arti_peso, arpr_merma
        from articulos_producto AP, ARTICULO A2
        WHERE AP.arpr_comp = A2.arti_cod AND AP.arti_cod = :ARTIC ORDER by ARPR_ITEM
        INTO :codcmp, :cantcmp, :undcmp, :porcmp, :unidad, :descr, :pesocmp, :MERMA
        DO
        BEGIN
        EXECUTE PROCEDURE factor_unidad_cant(:codcmp, :undcmp) returning_values (:FACTOR);
        if (((cantcmp is null) or (cantcmp = 0)) AND (PORCMP IS NOT NULL) AND (porcmp <> 0)) then
            BEGIN
            /* ES PORCENTUAL AL PESO LA MEZCLA SOBRE EL 1ER ARTICULO */
            CANT = cantpro * PESO;
            CANT = CANT / TOTAL * porcmp; /* APLICA LA PROPORCION */
            if ((MERMA IS NOT NULL) AND (MERMA <> 0)) then
                CANT = CANT / ((100 - MERMA) / 100);
            END
        ELSE
            BEGIN
            CANT = cantpro * CANTCMP * factor * pesocmp;
            END

        SELECT COUNT(ARTI_COD) FROM articulos_producto WHERE ARTI_COD = :codcmp INTO :NUMROWS;
        if (NUMROWS <> 0) then
           TIPOORD = 19;
        else
            TIPOORD = 24;

        /* INSERTE O ACTUALICE EL COMPONENTE */
        if (NOT EXISTS (SELECT PLPC_ITEM FROM plan_produccion_cons WHERE PLPD_ID = :planid AND ARTI_COD = :codcmp)) then
            BEGIN
            ITEM = ITEM + 1;
            INSERT INTO plan_produccion_cons (PLPD_ID, PLPC_ITEM, PLPC_CODBAR, ARTI_COD, PLPC_CANT, PLPC_UNIDAD, PLPC_EXIST, PLPC_ORDENAR, PLPC_ORDENTIPO, PLPC_ORDENID, PLPC_ANULADO, PLPC_TRANSMIT, PLPC_DESC)
                VALUES (:planid, :item, :codcmp, :codcmp, :cant, :undcmp, 0, 0, :tipoord, 0, 'N', 'N', :descr);
            END
        ELSE
            UPDATE plan_produccion_cons SET PLPC_CANT = PLPC_CANT + :CANT
                WHERE PLPD_ID = :planid AND ARTI_COD = :codcmp;
        END
    END
end
^

SET TERM ; ^

/* 20100209B */
/* AFECTAR INVENTARIO CON EL PLAN DE PRODUCCION CONFIRMADO */

ALTER TABLE PLAN_PRODUCCION
ADD PLPR_ENTRADA T_BOOLEANO;
ALTER TABLE PLAN_PRODUCCION
ADD PLPR_BODORI VARCHAR(2);
ALTER TABLE PLAN_PRODUCCION
ADD PLPR_BODDES VARCHAR(2);
ALTER TABLE PLAN_PRODUCCION_DET
ADD PLPD_LOTE T_LOTE;

SET TERM ^ ;

create trigger PLAN_PRODUCCION_BI for PLAN_PRODUCCION
active BEFORE INSERT position 0
as
declare variable NUMERO VARCHAR(6);
declare variable AUTOM CHAR(1);
declare variable EXISTE CHAR(1);
BEGIN
if (NEW.plpr_numok = 'N') then
  BEGIN
  /* Actualice el contador del prefijo */
  SELECT PREF_ACTUAL, PREF_AUTO FROM PREFIJOS WHERE TIDO_COD = 27 AND PREF_PRE = NEW.plpr_pref INTO :NUMERO, :AUTOM;
  /* ACTUALICE EL NUMERO EN COMPROBANTE_ENCABEZADO  */
  if (AUTOM = 'S') then
    BEGIN
    NEW.plpr_numero = NUMERO;
    NUMERO = CAST((CAST(NUMERO AS INTEGER) + 1) AS CHAR(6));
    UPDATE PREFIJOS
      SET PREF_ACTUAL = :NUMERO
    WHERE TIDO_COD = 27 AND PREF_PRE = NEW.plpr_pref;
    END
  ELSE
    BEGIN
    if (CAST(NUMERO AS INTEGER) = CAST(NEW.plpr_numero AS INTEGER)) then
        UPDATE PREFIJOS
          SET PREF_ACTUAL = CAST((CAST(PREF_ACTUAL AS INTEGER) + 1) AS CHAR(6))
        WHERE TIDO_COD = 27 AND PREF_PRE = NEW.plpr_pref;
    END
  EXECUTE PROCEDURE COMPLETA_CEROS (NEW.plpr_numero) returning_values (NEW.plpr_numero);
  NEW.plpr_numok = 'S';
  END
/* Verifique que el numero no existe previamente */
EXISTE = 'N';
SELECT 'S' FROM plan_produccion WHERE PLPR_PREF = NEW.plpr_pref AND PLPR_NUMERO = NEW.plpr_numero INTO :EXISTE;
if (EXISTE = 'S') then
    EXCEPTION DOCUMENTO_REGISTRADO 'Ya existe un plan con el número ' || new.plpr_pref || new.plpr_numero;
end
^

SET TERM ; ^

SET TERM ^ ;

create trigger PLAN_PRODUCCION_AI for PLAN_PRODUCCION
active AFTER INSERT position 0
as
begin
IF ((NEW.plpr_id <> 0) AND (NEW.plpr_anulado = 'N')) THEN
  BEGIN
  INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
    VALUES (USER, 27, NEW.plpr_id, 'I', NEW.plpr_pref || NEW.plpr_numero);
  END
end
^

SET TERM ; ^

SET TERM ^ ;

create trigger PLAN_PRODUCCION_AD for PLAN_PRODUCCION
active AFTER DELETE position 0
as
declare variable consec integer;
begin
select enco_consec from comprobante_encabezado where enco_tiporef = 27 and enco_idref = old.plpr_id into :consec;
if (NOT consec is null) then
    delete from comprobante_detalle where enco_consec = :consec;
delete from comprobante_encabezado where enco_tiporef = 27 and enco_idref = old.plpr_id;
INSERT INTO AUDITORIA (AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
    VALUES (USER, 27, old.plpr_id, 'D', old.plpr_pref || old.plpr_numero);
end
^

SET TERM ; ^


SET TERM ^ ;

CREATE OR ALTER TRIGGER PLAN_PRODUCCION_CONS_AI FOR PLAN_PRODUCCION_CONS
ACTIVE AFTER INSERT POSITION 0
as
declare variable fec date;
declare variable CONC VARCHAR(60);
declare variable factor numeric(18,4);
declare variable Pref varchar(4);
declare variable Num varchar(6);
declare variable Bod varchar(2);
BEGIN
  if ((NEW.plpd_id <> 0) and (new.plpc_anulado = 'N')) then
    BEGIN
    select plpr_fecini, plpr_conc, plpr_pref, plpr_numero, plpr_bodori from plan_produccion
        where plpr_id = new.plpd_id into :fec, :conc, :Pref, :Num, :Bod;
    execute procedure factor_unidad_cant(new.arti_cod, new.plpc_unidad) returning_values(factor);
    INSERT INTO MOVIMIENTO_ARTICULO
      (ARTI_COD, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM, TERC_NIT)
      VALUES(NEW.ARTI_COD, :bod, :FEC, 27, NEW.plpd_id,
      :CONC, :factor * new.plpc_cant, 0, 'N', null, :Pref, :Num, new.plpc_item, null);
    end
end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER PLAN_PRODUCCION_CONS_AU FOR PLAN_PRODUCCION_CONS
ACTIVE AFTER UPDATE POSITION 0
as
declare variable fec date;
declare variable CONC VARCHAR(60);
declare variable factor numeric(18,4);
declare variable Pref varchar(4);
declare variable Num varchar(6);
declare variable Bod varchar(2);
BEGIN
if ((old.arti_cod <> new.arti_cod) or (old.plpc_cant <> new.plpc_cant) or (old.plpc_unidad <> new.plpc_unidad) or
    (old.plpc_anulado <> new.plpc_anulado) or (old.plpc_transmit <> new.plpc_transmit)) then
  begin
  /* Anule el anterior */
  if ((old.plpd_id <> 0) and (old.plpc_anulado = 'N')) then
    begin
    delete from movimiento_articulo where (mvar_tipodoc = 27) and (mvar_idref = old.plpd_id) and (mvar_item = old.plpc_item);
    END
  /* Registre el nuevo */
  if ((new.plpd_id <> 0) and (new.plpc_anulado = 'N')) then
    BEGIN
    select plpr_fecini, plpr_conc, plpr_pref, plpr_numero, plpr_bodori from plan_produccion
        where plpr_id = new.plpd_id into :fec, :conc, :Pref, :Num, :Bod;
    execute procedure factor_unidad_cant(new.arti_cod, new.plpc_unidad) returning_values(factor);
    INSERT INTO MOVIMIENTO_ARTICULO
      (ARTI_COD, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM, TERC_NIT)
      VALUES(NEW.ARTI_COD, :bod, :FEC, 27, NEW.plpd_id,
      :CONC, :factor * new.plpc_cant, 0, 'N', null, :Pref, :Num, new.plpc_item, null);
    END
  end
end
^

SET TERM ; ^

SET TERM ^ ;

create or alter trigger PLAN_PRODUCCION_DET_AU for PLAN_PRODUCCION_DET
active AFTER UPDATE position 0
as
declare variable fec date;
declare variable CONC VARCHAR(60);
declare variable Pref varchar(4);
declare variable Num varchar(6);
declare variable COSTO NUMERIC(18,2);
declare variable COSTOTAL NUMERIC(18,2);
declare variable Bod VARCHAR(2);
declare variable PORC FLOAT;
declare variable MERMAC NUMERIC(18,4);
declare variable PESOCMP NUMERIC(18,4);
declare variable TOTAL FLOAT;
declare variable FACTOR FLOAT;
declare variable CODCOMP VARCHAR(20);
declare variable CANTCOMP NUMERIC(18,4);
declare variable UNICOMP VARCHAR(8);
declare variable ENTRADA CHAR(1);
BEGIN
if ((OLD.plpr_id <> 0) and (OLD.plpd_anulado = 'N')) then
    BEGIN
    DELETE FROM movimiento_articulo M WHERE M.mvar_tipodoc = 27 AND M.mvar_idref = OLD.plpr_id AND M.mvar_item = OLD.plpd_item;
    END

if ((NEW.plpr_id <> 0) and (new.plpd_anulado = 'N')) then
    BEGIN
    select plpr_fecfin, plpr_conc, plpr_pref, plpr_numero, plpr_boddes, plpr_entrada
        from plan_produccion where plpr_id = new.plpr_id
        into :fec, :conc, :Pref, :Num, :Bod, :entrada;
    if (entrada = 'S') then
        begin
        COSTOTAL = 0;
        select sum(arpr_porc) from articulos_producto where arti_cod = NEW.arti_cod into :total;
        /* CALCULE EL COSTO RECORRIENDO LA FORMULA */
        for select arpr_comp, arpr_cant, arpr_unidad, ARPR_PORC, ARPR_MERMA, arti_peso
            from articulos_producto P, ARTICULO A
            where P.arpr_comp = A.arti_cod AND p.arti_cod = NEW.arti_cod
            into :codcomp, :cantcomp, :unicomp, :porc, :mermac, :pesocmp
            DO
            BEGIN
            execute procedure factor_unidad_cant(:codcomp, :unicomp) returning_values (:factor);
            if (((cantcomp is null) or (cantcomp = 0)) AND (PORC IS NOT NULL) AND (porc <> 0)) then
                BEGIN
                /* ES PORCENTUAL AL PESO LA MEZCLA SOBRE EL 1ER ARTICULO */
                cantcomp = NEW.plpd_cant * NEW.plpd_factor * NEW.plpd_peso / TOTAL * PORC; /* APLICA LA PROPORCION */
                if ((MERMAC IS NOT NULL) AND (MERMAC <> 0)) then
                    cantcomp = cantcomp / ((100 - MERMAC) / 100);
                END
            else
                BEGIN
                cantcomp = cantcomp * FACTOR * pesocmp * NEW.plpd_cant * NEW.plpd_factor;
                END
            EXECUTE PROCEDURE costo_promedio(:CODCOMP, :fec) returning_values (:COSTO);
            COSTOTAL = COSTOTAL + COSTO * CANTCOMP;
            END
        INSERT INTO MOVIMIENTO_ARTICULO
          (ARTI_COD, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM, TERC_NIT)
          VALUES(NEW.arti_cod, :bod, :FEC, 27, NEW.plpr_id,
          :CONC, NEW.plpd_factor * new.plpd_cant, :costotal, 'S', new.plpd_lote, :Pref, :Num, new.plpd_item, '');
        end
    END
end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER PLAN_PRODUCCION_DET_AI FOR PLAN_PRODUCCION_DET
ACTIVE AFTER INSERT POSITION 0
as
declare variable fec date;
declare variable CONC VARCHAR(60);
declare variable Pref varchar(4);
declare variable Num varchar(6);
declare variable COSTO NUMERIC(18,2);
declare variable COSTOTAL NUMERIC(18,2);
declare variable Bod VARCHAR(2);
declare variable PORC FLOAT;
declare variable MERMAC NUMERIC(18,4);
declare variable PESOCMP NUMERIC(18,4);
declare variable TOTAL FLOAT;
declare variable FACTOR FLOAT;
declare variable CODCOMP VARCHAR(20);
declare variable CANTCOMP NUMERIC(18,4);
declare variable UNICOMP VARCHAR(8);
declare variable entrada CHAR(1);
BEGIN
if ((NEW.plpr_id <> 0) and (new.plpd_anulado = 'N')) then
    BEGIN
    select plpr_fecfin, plpr_conc, plpr_pref, plpr_numero, plpr_boddes, plpr_entrada
        from plan_produccion where plpr_id = new.plpr_id
        into :fec, :conc, :Pref, :Num, :Bod, :entrada;
    if (entrada = 'S') then
        begin
        COSTOTAL = 0;
        select sum(arpr_porc) from articulos_producto where arti_cod = NEW.arti_cod into :total;
        /* CALCULE EL COSTO RECORRIENDO LA FORMULA */
        for select arpr_comp, arpr_cant, arpr_unidad, ARPR_PORC, ARPR_MERMA, arti_peso
            from articulos_producto P, ARTICULO A
            where P.arpr_comp = A.arti_cod AND p.arti_cod = NEW.arti_cod
            into :codcomp, :cantcomp, :unicomp, :porc, :mermac, :pesocmp
            DO
            BEGIN
            execute procedure factor_unidad_cant(:codcomp, :unicomp) returning_values (:factor);
            if (((cantcomp is null) or (cantcomp = 0)) AND (PORC IS NOT NULL) AND (porc <> 0)) then
                BEGIN
                /* ES PORCENTUAL AL PESO LA MEZCLA SOBRE EL 1ER ARTICULO */
                cantcomp = NEW.plpd_cant * NEW.plpd_factor * NEW.plpd_peso / TOTAL * PORC; /* APLICA LA PROPORCION */
                if ((MERMAC IS NOT NULL) AND (MERMAC <> 0)) then
                    cantcomp = cantcomp / ((100 - MERMAC) / 100);
                END     
            else
                BEGIN
                cantcomp = cantcomp * FACTOR * pesocmp * NEW.plpd_cant * NEW.plpd_factor;
                END
            EXECUTE PROCEDURE costo_promedio(:CODCOMP, :fec) returning_values (:COSTO);
            COSTOTAL = COSTOTAL + COSTO * CANTCOMP;
            END
        INSERT INTO MOVIMIENTO_ARTICULO
          (ARTI_COD, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM, TERC_NIT)
          VALUES(NEW.arti_cod, :bod, :FEC, 27, NEW.plpr_id,
          :CONC, NEW.plpd_factor * new.plpd_cant, :costotal, 'S', new.plpd_lote, :Pref, :Num, new.plpd_item, '');
        end
    END
end
^

SET TERM ; ^

SET TERM ^ ;

create trigger PLAN_PRODUCCION_DET_AD for PLAN_PRODUCCION_DET
active AFTER DELETE position 0
as
begin
if ((OLD.plpr_id <> 0) and (OLD.plpd_anulado = 'N')) then
    BEGIN
    DELETE FROM movimiento_articulo M WHERE M.mvar_tipodoc = 27 AND M.mvar_idref = OLD.plpr_id AND M.mvar_item = OLD.plpd_item;
    END
end
^

SET TERM ; ^

/* 20100209C */
SET TERM ^ ;

CREATE OR ALTER procedure CONTADOS_SIN_RECIBO (
    FECINI date,
    FECFIN date)
returns (
    ID integer,
    PREF varchar(4),
    NUMERO varchar(6),
    FECHA date,
    VEND INTEGER,
    NIT varchar(20),
    NOMBRE varchar(60),
    MONTO numeric(18,2),
    IVAM numeric(18,2),
    RTFTE numeric(18,2),
    RTIVA numeric(18,2),
    RTICA numeric(18,2),
    SALDO numeric(18,2),
    CAJA INTEGER,
    SUCURSAL VARCHAR(10))
AS
begin
FOR SELECT FACT_ID, F.PREF_PRE, FACT_NUMERO, FACT_FECHA, F.TERC_NIT, VEND_COD, FACT_NOMCLIENTE, FACT_TOTAL, FACT_IVAMONTO, FACT_RTFTEMONTO, FACT_RTIVAMONTO, FACT_RTICAMONTO, V.CAJA_ID, FACT_SUCURSAL
    FROM FACTURAS F, PREFIJOS P, AUTORIZACIONES A, punto_venta V
    WHERE F.pref_pre = P.pref_pre AND P.pref_pre = A.pref_pre AND P.tido_cod = 31 AND
    ((A.auto_contado = 'S') or (A.auto_nitcontado = F.terc_nit)) AND
    FACT_FECHA >= :FECINI AND FACT_FECHA <= :fecfin AND F.ptvt_id = V.ptvt_id
    INTO :ID, :PREF, :NUMERO, :FECHA, :NIT, :VEND, :NOMBRE, :MONTO, :IVAM, :RTFTE, :RTIVA, :RTICA, :CAJA, :SUCURSAL
    DO
    BEGIN
    EXECUTE PROCEDURE SALDO_DOC_CARTERA(31, :ID, '9999/12/31', 0) returning_values (:SALDO);
    if (SALDO <> 0) then
        suspend;
    END
end
^

SET TERM ; ^


grant EXECUTE on PROCEDURE contados_sin_recibo to PUBLIC;



/* 20100212 CONCILIACION DETALLE CON VARIOS DOCUMENTOS A UNO DEL EXTRACTO */

CREATE TABLE CONCILIACION_DETALLE (
    COBN_ID T_ID NOT NULL,
    COBN_ITEM T_ID NOT NULL,
    COBN_DET T_ID NOT NULL,
    COBD_TIPODOC T_ID,
    COBD_IDDOC T_ID,
    COBD_ANULADO T_BOOLEANO);
alter table CONCILIACION_DETALLE add constraint PK_CONCILIACION_DETALLE primary key (COBN_ID,COBN_ITEM,COBN_DET);

ALTER TABLE CONCILIACION_DETALLE
ADD COBD_PREFIJO VARCHAR(4);
ALTER TABLE CONCILIACION_DETALLE
ADD COBD_NUMERO T_NUMDOC;
alter table CONCILIACION_DETALLE
add constraint FK_CONCILIACION_DETALLE_1
foreign key (COBN_ID,COBN_ITEM)
references CONCILIACION_BANCARIA(COBN_ID,COBN_ITEM)
on delete CASCADE
on update CASCADE;

SET TERM ^ ;

CREATE OR ALTER procedure CONCILIA_BANCO (
    ID integer)
AS
declare variable fecini date;
declare variable fecfin date;
declare variable item integer;
declare variable db char(1);
declare variable cuenta integer;
declare variable tipodoc integer;
declare variable iddoc integer;
declare variable prefijo varchar(4);
declare variable numero varchar(6);
declare variable fecha date;
declare variable concepto varchar(60);
declare variable monto numeric(18,2);
declare variable CONANT INTEGER;
begin
select CUBA_COD, COBN_FECINI, COBN_FECFIN FROM conciliacion_encabezado WHERE COBN_ID = :ID INTO :CUENTA, :FECINI, :FECFIN;
SELECT MAX(COBN_ITEM) FROM conciliacion_bancaria WHERE COBN_ID = :ID INTO :item;
/* AGREGUE LOS PENDIENTES DE LA ULTIMA CONCILIACION DE ESA CUENTA */
SELECT FIRST 1 COBN_ID FROM conciliacion_encabezado WHERE CUBA_COD = :CUENTA AND COBN_FECINI < :FECINI ORDER BY COBN_FECINI DESC INTO :CONANT;
FOR SELECT COBN_FEC, COBN_TIPODOC, COBN_DB, COBN_CONC, ABS(COBN_MONTO) FROM conciliacion_bancaria
    WHERE COBN_OK = 'N' and COBN_ID = :CONANT
    INTO :fecha, :tipodoc, :db, :concepto, :monto
    DO
    BEGIN
    ITEM = ITEM + 1;
    if (DB = 'N') then
        INSERT INTO conciliacion_bancaria (CUBA_COD, COBN_ID, COBN_ITEM, COBN_FEC, COBN_PREFIJO, COBN_NUMERO, COBN_MONTO, COBN_TIPODOC, COBN_ANULADO, COBN_OK, COBN_CONC, COBN_IDDOC, COBN_DB, COBN_CLASE)
            VALUES (:CUENTA, :ID, :ITEM, :FECHA, NULL, NULL, :monto, :TIPODOC, 'N', 'N', :concepto, NULL, :DB, '2');
    else
        INSERT INTO conciliacion_bancaria (CUBA_COD, COBN_ID, COBN_ITEM, COBN_FEC, COBN_PREFIJO, COBN_NUMERO, COBN_MONTO, COBN_TIPODOC, COBN_ANULADO, COBN_OK, COBN_CONC, COBN_IDDOC, COBN_DB, COBN_CLASE)
            VALUES (:CUENTA, :ID, :ITEM, :FECHA, NULL, NULL, :monto, :TIPODOC, 'N', 'N', :concepto, NULL, :DB, '1');
    END

/* COMPARE LA TABLA CON LOS MOVIMIENTOS DEL BANCO */
FOR SELECT COBN_ITEM, ABS(COBN_MONTO), COBN_FEC, COBN_TIPODOC, COBN_DB, COBN_CONC
    FROM CONCILIACION_BANCARIA
    WHERE COBN_ID = :ID AND ((COBN_IDDOC = 0) or (cobn_iddoc is null))
    INTO :ITEM, :MONTO, :FECHA, :TIPODOC, :DB, :concepto
    DO
    BEGIN
    PREFIJO = '';
    NUMERO = '';
    IDDOC = 0;
    /* BUSQUE LA OPERACION  */
    if (TIPODOC <> 0) then
        BEGIN
        SELECT FIRST 1 MOBA_PREF, MOBA_NUMERO, MOBA_IDREF
            FROM movimiento_banco M WHERE MOBA_TIPODOC = :tipodoc AND MOBA_TOTAL = :MONTO AND M.cuba_cod = :cuenta AND MOBA_FECHA >= :FECINI AND MOBA_FECHA <= :FECFIN  AND
                NOT EXISTS (SELECT COBN_ITEM FROM CONCILIACION_BANCARIA WHERE COBN_IDDOC = m.moba_idref AND COBN_TIPODOC = :tipodoc and COBN_ID = :ID)
            ORDER BY ABS(MOBA_FECHA - :FECHA)
            INTO :prefijo, :numero, :IDDOC;
        if (PREFIJO <> '') then
            BEGIN
            insert into conciliacion_detalle (COBN_ID, COBN_ITEM, COBN_DET, COBD_TIPODOC, COBD_IDDOC, COBD_PREFIJO, COBD_NUMERO, COBD_ANULADO)
                VALUES (:ID, :ITEM, 1, :TIPODOC, :IDDOC, :PREFIJO, :NUMERO, 'N');
            UPDATE conciliacion_bancaria SET COBN_OK = 'S', COBN_CLASE = '0'
                WHERE COBN_ID = :ID AND COBN_ITEM = :ITEM;
            END
        ELSE
            BEGIN
            /* BUSQUELO COMO DEBITO O CREDITO SIN IMPORTAR EL TIPO */
            SELECT FIRST 1 MOBA_PREF, MOBA_NUMERO, MOBA_IDREF
                FROM movimiento_banco M WHERE MOBA_DB = :DB AND MOBA_TOTAL = :MONTO AND M.cuba_cod = :cuenta AND MOBA_FECHA >= :FECINI AND MOBA_FECHA <= :FECFIN AND
                    NOT EXISTS (SELECT COBN_ITEM FROM CONCILIACION_BANCARIA WHERE COBN_IDDOC = m.moba_idref AND COBN_TIPODOC = :tipodoc and COBN_ID = :ID)
                ORDER BY ABS(MOBA_FECHA - :FECHA)
                INTO :prefijo, :numero, :IDDOC;
            if (PREFIJO <> '') then
                BEGIN
                insert into conciliacion_detalle (COBN_ID, COBN_ITEM, COBN_DET, COBD_TIPODOC, COBD_IDDOC, COBD_PREFIJO, COBD_NUMERO, COBD_ANULADO)
                    VALUES (:ID, :ITEM, 1, :TIPODOC, :IDDOC, :PREFIJO, :NUMERO, 'N');
                UPDATE conciliacion_bancaria SET COBN_PREFIJO = :PREFIJO, COBN_NUMERO = :NUMERO, COBN_IDDOC = :iddoc, COBN_OK = 'S', COBN_CLASE = '0'
                    WHERE COBN_ID = :ID AND COBN_ITEM = :ITEM;
                END
            ELSE
                BEGIN
                if (DB = 'N') then
                    UPDATE conciliacion_bancaria SET COBN_OK = 'N', COBN_CLASE = '2'
                        WHERE COBN_ID = :ID AND COBN_ITEM = :ITEM;
                else
                    UPDATE conciliacion_bancaria SET COBN_OK = 'N', COBN_CLASE = '1'
                        WHERE COBN_ID = :ID AND COBN_ITEM = :ITEM;
                END
            END
        END
    ELSE
        BEGIN
        /* BUSQUELO COMO DEBITO O CREDITO SIN IMPORTAR EL TIPO */
        SELECT FIRST 1 MOBA_PREF, MOBA_NUMERO, MOBA_IDREF, MOBA_TIPODOC
            FROM movimiento_banco M WHERE MOBA_DB = :DB AND MOBA_TOTAL = :MONTO AND M.cuba_cod = :cuenta AND MOBA_FECHA >= :FECINI AND MOBA_FECHA <= :FECFIN AND
                NOT EXISTS (SELECT COBN_ITEM FROM CONCILIACION_BANCARIA WHERE COBN_IDDOC = m.moba_idref AND COBN_DB = :DB and COBN_ID = :ID)
            ORDER BY ABS(MOBA_FECHA - :FECHA)
            INTO :prefijo, :numero, :IDDOC, :TIPODOC;
        if (PREFIJO <> '') then
            BEGIN
            insert into conciliacion_detalle (COBN_ID, COBN_ITEM, COBN_DET, COBD_TIPODOC, COBD_IDDOC, COBD_PREFIJO, COBD_NUMERO, COBD_ANULADO)
                VALUES (:ID, :ITEM, 1, :TIPODOC, :IDDOC, :PREFIJO, :NUMERO, 'N');
            UPDATE conciliacion_bancaria SET COBN_TIPODOC = :TIPODOC, COBN_OK = 'S', COBN_CLASE = '0'
                WHERE COBN_ID = :ID AND COBN_ITEM = :ITEM;
            END
        ELSE
            BEGIN
            if (DB = 'N') then
                UPDATE conciliacion_bancaria SET COBN_OK = 'N', COBN_CLASE = '2'
                    WHERE COBN_ID = :ID AND COBN_ITEM = :ITEM;
            else
                UPDATE conciliacion_bancaria SET COBN_OK = 'N', COBN_CLASE = '1'
                    WHERE COBN_ID = :ID AND COBN_ITEM = :ITEM;
            END
        END
    END
/* AGREGUE LOS DOCUMENTOS SIN UBICAR */
FOR SELECT MOBA_PREF, MOBA_NUMERO, MOBA_FECHA, MOBA_TOTAL, MOBA_CONCEPTO, MOBA_TIPODOC, MOBA_IDREF, MOBA_DB
    FROM MOVIMIENTO_BANCO M
    WHERE MOBA_FECHA >= :FECINI AND MOBA_FECHA <= :FECFIN  AND M.cuba_cod = :cuenta AND
        NOT EXISTS (SELECT COBN_DET FROM conciliacion_detalle WHERE COBD_TIPODOC = M.moba_tipodoc AND COBD_IDDOC = M.moba_idref and COBN_ID = :ID)
    INTO :prefijo, :numero, :fecha, :monto, :concepto, :tipodoc, :iddoc, :DB
    DO
    BEGIN
    ITEM = ITEM + 1;
    if (DB = 'N') then
        INSERT INTO conciliacion_bancaria (CUBA_COD, COBN_ID, COBN_ITEM, COBN_FEC, COBN_PREFIJO, COBN_NUMERO, COBN_MONTO, COBN_TIPODOC, COBN_ANULADO, COBN_OK, COBN_CONC, COBN_IDDOC, COBN_DB, COBN_CLASE)
            VALUES (:CUENTA, :ID, :ITEM, :FECHA, :PREFIJO, :NUMERO, :monto, :TIPODOC, 'N', 'N', :concepto, :iddoc, :DB, '4');
    else
        INSERT INTO conciliacion_bancaria (CUBA_COD, COBN_ID, COBN_ITEM, COBN_FEC, COBN_PREFIJO, COBN_NUMERO, COBN_MONTO, COBN_TIPODOC, COBN_ANULADO, COBN_OK, COBN_CONC, COBN_IDDOC, COBN_DB, COBN_CLASE)
            VALUES (:CUENTA, :ID, :ITEM, :FECHA, :PREFIJO, :NUMERO, :monto, :TIPODOC, 'N', 'N', :concepto, :iddoc, :DB, '3');
    END
end
^

SET TERM ; ^

/* 20100213 REP. UTILIDAD POR GRUPO DIRECTO DESDE LA BD */

ALTER TABLE REP_UTILIDAD
ADD TIPO T_ID not null;
ALTER TABLE REP_UTILIDAD DROP CONSTRAINT PK_REP_UTILIDAD;

alter table REP_UTILIDAD add constraint PK_REP_UTILIDAD primary key (ID,TIPO,CODIGO);

SET TERM ^ ;

CREATE OR ALTER procedure REP_UTILIDAD_VENTAS (
    TIPO integer,
    DETALLE char(1),
    FECINI date,
    FECFIN date,
    ARTINI varchar(15),
    ARTFIN varchar(15),
    GRPINI varchar(3),
    GRPFIN varchar(3),
    ORDEN char(1),
    AGRUPA char(1),
    ULTIMO char(1),
    CEROS char(1),
    SUBEMPRESA integer)
returns (
    ARTICULO varchar(15),
    DESCRIPCION varchar(60),
    CODGRUPO varchar(2),
    NOMGRUPO varchar(30),
    CODSUBG varchar(3),
    NOMSUBG varchar(30),
    CODMARC varchar(3),
    NOMMARC varchar(30),
    UNIDAD varchar(8),
    CANTIDAD numeric(18,4),
    BASE numeric(18,4),
    COSTO numeric(18,4),
    UTILIDAD numeric(18,4),
    PORC numeric(9,2),
    IVA numeric(18,4),
    CONSUMO numeric(18,4),
    PREFIJO varchar(4),
    NUMERO varchar(6),
    FECHA date,
    TIPODOC integer,
    PART float)
AS
DECLARE VARIABLE COSTOUNIT NUMERIC(18,4);
DECLARE VARIABLE CANTDET NUMERIC(18,4);
DECLARE VARIABLE TOTAL NUMERIC(18,2);
declare variable CODINI VARCHAR(15);
declare variable CODFIN VARCHAR(15);
declare variable DESINI VARCHAR(15);
declare variable DESFIN VARCHAR(15);
declare variable MARINI VARCHAR(3);
declare variable MARFIN VARCHAR(3);
declare variable UOM VARCHAR(20);
declare variable ULTCOS NUMERIC(18,2);
declare variable IDREP INTEGER;
BEGIN
if (ORDEN = 'C') then
    BEGIN
    CODINI = ARTINI;
    CODFIN = ARTFIN;
    DESINI = '';
    DESFIN = 'zz';
    END
ELSE
    BEGIN
    DESINI = ARTINI;
    DESFIN = ARTFIN;
    CODINI = '';
    CODFIN = 'zz';
    END
if (AGRUPA = 'G') then
    BEGIN
    MARINI = '';
    MARFIN = 'zz';
    END
ELSE
    if (AGRUPA = 'M') then
        BEGIN
        MARINI = GRPINI;
        MARFIN = GRPFIN;
        GRPINI = '';
        GRPFIN = 'zz';
        END
    ELSE
        BEGIN
        MARINI = '';
        MARFIN = 'zz';
        GRPINI = '';
        GRPFIN = 'zz';
        END
EXECUTE PROCEDURE lee_configuracion ('FACTURACION', 'ARTICULOS', 'SUGERIR PRECIOS CON PORCENTAJE DE MARGEN O UTILIDAD') returning_values (:UOM);
IDREP = GEN_ID(id_reputilidad, 1);
if (DETALLE = 'N') then
    BEGIN
    if (BIN_AND(TIPO, 1) <> 0) then
        BEGIN
        TIPODOC = 31;
        FOR SELECT MAX(D.ARTI_COD), SUM(FADE_CANT * FADE_FACTOR), SUM((FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO)*FACT_FACTOR), SUM(FADE_IVAMONTO*FACT_FACTOR), SUM(FADE_CONSUMO)
            FROM FACTURAS_DETALLE D, FACTURAS F, PREFIJOS P, ARTICULO A
            WHERE F.FACT_ID = D.FACT_ID AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND D.ARTI_COD = A.arti_cod AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            FACT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) and substring(a.arti_cod from 1 FOR 2) <> '.t'
            GROUP BY D.ARTI_COD
            INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO
            DO
            BEGIN
            COSTO = 0;
            FOR SELECT FADE_CANT * FADE_FACTOR, FACT_FECHA FROM FACTURAS_DETALLE D, FACTURAS F, PREFIJOS P
                WHERE F.FACT_ID = D.FACT_ID AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND
                FACT_ANULADO = 'N' AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                and D.ARTI_COD = :articulo  INTO :cantdet, :fecha
                DO
                BEGIN
                EXECUTE PROCEDURE costo_promedio_y_ultimo(:ARTICULO, :FECHA) returning_values (:costounit, :ultcos);
                if (ULTIMO = 'S') then
                    COSTO = COSTO + ultcos * cantdet;
                else
                    COSTO = COSTO + costounit * cantdet;
                END
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            INSERT INTO REP_UTILIDAD(ID, TIPO, CODIGO, BASE, IVA, CONSUMO, COSTO) VALUES (:IDREP, 31, :articulo, :base, :iva, :consumo, :costo);
            if (CEROS = 'S') then
                INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (2, USER, :ARTICULO);
            END /* FOR */
        SELECT SUM(BASE-COSTO) FROM REP_UTILIDAD WHERE id = :IDREP AND TIPO = 31 INTO :TOTAL;
        FOR SELECT ARTI_COD, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD FROM ARTICULO A
            WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND
            (A.MARC_COD <= :MARFIN))) AND substring(a.arti_cod from 1 FOR 2) <> '.t'
            INTO :ARTICULO, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
            DO
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            BASE = 0;
            IVA = 0;
            CONSUMO = 0;
            COSTO = 0;
            UTILIDAD = 0;
            PORC = 0;
            PART = 0;
            SELECT BASE, IVA, CONSUMO, COSTO FROM rep_utilidad WHERE ID = :IDREP AND TIPO = 31 AND CODIGO = :articulo INTO :BASE, :IVA, :consumo,  :costo;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            EXECUTE PROCEDURE PORCENTAJE (utilidad,  TOTAL, 'S') returning_values (part);
            if ((CEROS = 'S') or (BASE <> 0) or (COSTO <> 0)) then
                SUSPEND;
            END /* FOR */
            BEGIN
            COSTO = 0;
            END
        END
    if (BIN_AND(TIPO, 2) <> 0) then
        BEGIN
        TIPODOC = 32;
        FOR SELECT MAX(D.ARTI_COD), SUM(RVDE_CANT * RVDE_FACTOR), SUM(RVDE_TOTAL-RVDE_IVAMONTO-RVDE_CONSUMO), SUM(RVDE_IVAMONTO), SUM(RVDE_CONSUMO)
            FROM REMISIONES_VENTA_DETALLE D, REMISIONES_VENTA R, PREFIJOS P, ARTICULO A
            WHERE R.REVT_ID = D.REVT_ID AND P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = 32 AND D.ARTI_COD = A.arti_cod AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            REVT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY D.ARTI_COD
            INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO
            DO
            BEGIN
            COSTO = 0;
            FOR SELECT RVDE_CANT * RVDE_FACTOR, REVT_FECHA FROM remisiones_venta_detalle D, remisiones_venta F, PREFIJOS P
                WHERE F.revt_id = D.revt_id AND REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN AND
                REVT_ANULADO = 'N' AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 32 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                and D.ARTI_COD = :articulo  INTO :cantdet, :fecha
                DO
                BEGIN
                EXECUTE PROCEDURE costo_promedio_y_ultimo(:ARTICULO, :FECHA) returning_values (:costounit, :ultcos);
                if (ULTIMO = 'S') then
                    COSTO = COSTO + ultcos * cantdet;
                else
                    COSTO = COSTO + costounit * cantdet;
                END
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            if (CEROS = 'S') then
                INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (2, USER, :ARTICULO);
            INSERT INTO REP_UTILIDAD(ID, TIPO, CODIGO, BASE, IVA, CONSUMO, COSTO) VALUES (:IDREP, 32, :articulo, :base, :iva, :consumo, :costo);
            END /* FOR */
        SELECT SUM(BASE-COSTO) FROM REP_UTILIDAD WHERE id = :IDREP AND TIPO = 32 INTO :TOTAL;
        FOR SELECT ARTI_COD, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD FROM ARTICULO A
            WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND
            (A.MARC_COD <= :MARFIN))) AND substring(a.arti_cod from 1 FOR 2) <> '.t'
            INTO :ARTICULO, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
            DO
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            BASE = 0;
            IVA = 0;
            CONSUMO = 0;
            COSTO = 0;
            UTILIDAD = 0;
            PORC = 0;
            SELECT BASE, IVA, CONSUMO, COSTO FROM rep_utilidad WHERE ID = :IDREP AND TIPO = 32 AND CODIGO = :articulo INTO :BASE, :IVA, :consumo,  :costo;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            EXECUTE PROCEDURE PORCENTAJE (utilidad,  TOTAL, 'S') returning_values (part);
            if ((CEROS = 'S') or (BASE <> 0) or (COSTO <> 0)) then
                SUSPEND;
            END /* FOR */
        END
    if (BIN_AND(TIPO, 4) <> 0) then
        BEGIN
        TIPODOC = 33;
        FOR SELECT MAX(D.ARTI_COD), SUM(DVDE_CANT * DVDE_FACTOR), SUM((DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO)*DEVT_FACTOR), SUM(DVDE_IVAMONTO*DEVT_FACTOR), SUM(DVDE_CONSUMO)
            FROM devoluciones_ventas_detalle D, DEVOLUCIONES_VENTAS V, PREFIJOS P, ARTICULO A
            WHERE V.DEVT_ID = D.DEVT_ID AND P.PREF_PRE = V.PREF_PRE AND P.TIDO_COD = 33 AND D.ARTI_COD = A.arti_cod AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            DEVT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY D.ARTI_COD
            INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO
            DO
            BEGIN
            COSTO = 0;
            FOR SELECT DVDE_CANT * DVDE_FACTOR, DEVT_FECHA FROM devoluciones_ventas_detalle D, devoluciones_ventas F, PREFIJOS P
                WHERE F.devt_id = D.devt_id AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND
                DEVT_ANULADO = 'N' AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 33 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                and D.ARTI_COD = :articulo  INTO :cantdet, :fecha
                DO
                BEGIN
                EXECUTE PROCEDURE costo_promedio_y_ultimo(:ARTICULO, :FECHA) returning_values (:costounit, :ultcos);
                if (ULTIMO = 'S') then
                    COSTO = COSTO + ultcos * cantdet;
                else
                    COSTO = COSTO + costounit * cantdet;
                END
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            else
                CANTIDAD = CANTIDAD * -1;
            if (BASE IS NULL) then
                BASE = 0;
            else
                BASE = BASE * -1;
            if (IVA IS NULL) then
                IVA = 0;
            else
                IVA = IVA * -1;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            else
                CONSUMO = CONSUMO * -1;
            COSTO = costo * -1;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            if (CEROS = 'S') then
                INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (2, USER, :ARTICULO);
            INSERT INTO REP_UTILIDAD(ID, TIPO, CODIGO, BASE, IVA, CONSUMO, COSTO) VALUES (:IDREP, 33, :articulo, :base, :iva, :consumo, :costo);
            END /* FOR */
        SELECT SUM(BASE-COSTO) FROM REP_UTILIDAD WHERE id = :IDREP AND TIPO = 33 INTO :TOTAL;
        FOR SELECT ARTI_COD, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD FROM ARTICULO A
            WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND
            (A.MARC_COD <= :MARFIN))) AND substring(a.arti_cod from 1 FOR 2) <> '.t'
            INTO :ARTICULO, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
            DO
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            BASE = 0;
            IVA = 0;
            CONSUMO = 0;
            COSTO = 0;
            UTILIDAD = 0;
            PORC = 0;
            SELECT BASE, IVA, CONSUMO, COSTO FROM rep_utilidad WHERE ID = :IDREP AND TIPO = 33 AND CODIGO = :articulo INTO :BASE, :IVA, :consumo,  :costo;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            EXECUTE PROCEDURE PORCENTAJE (utilidad,  TOTAL, 'S') returning_values (part);
            if ((CEROS = 'S') or (BASE <> 0) or (COSTO <> 0)) then
                SUSPEND;
            END /* FOR */
        END
    if (BIN_AND(TIPO, 8) <> 0) then
        BEGIN
        TIPODOC = 34;
        /* BORRA LA TABLA AUXILIAR */
        DELETE FROM reportes_aux WHERE REPA_ID = 2 AND REPA_USER = USER;

        FOR SELECT MAX(D.ARTI_COD), SUM(PEDE_CANT * PEDE_FACTOR), SUM((PEDE_TOTAL-PEDE_IVAMONTO-PEDE_CONSUMO)*PEDI_FACTOR), SUM(PEDE_IVAMONTO*PEDI_FACTOR), SUM(PEDE_CONSUMO)
            FROM PEDIDOS_DETALLE D, PEDIDOS P, PREFIJOS R, ARTICULO A
            WHERE P.PEDI_ID = D.PEDI_ID AND P.PREF_PRE = R.PREF_PRE AND R.TIDO_COD = 34 AND D.ARTI_COD = A.arti_cod AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            PEDI_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY D.ARTI_COD
            INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO
            DO
            BEGIN
            COSTO = 0;
            FOR SELECT PEDE_CANT * PEDE_FACTOR, PEDI_FECHA FROM pedidos_detalle D, pedidos F, PREFIJOS P
                WHERE F.pedi_id = D.pedi_id AND PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND
                PEDI_ANULADO = 'N' AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                and D.ARTI_COD = :articulo  INTO :cantdet, :fecha
                DO
                BEGIN
                EXECUTE PROCEDURE costo_promedio_y_ultimo(:ARTICULO, :FECHA) returning_values (:costounit, :ultcos);
                if (ULTIMO = 'S') then
                    COSTO = COSTO + ultcos * cantdet;
                else
                    COSTO = COSTO + costounit * cantdet;
                END
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            if (CEROS = 'S') then
                INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (2, USER, :ARTICULO);
            INSERT INTO REP_UTILIDAD(ID, TIPO, CODIGO, BASE, IVA, CONSUMO, COSTO) VALUES (:IDREP, 34, :articulo, :base, :iva, :consumo, :costo);
            END /* FOR */
        SELECT SUM(BASE-COSTO) FROM REP_UTILIDAD WHERE id = :IDREP AND TIPO = 34 INTO :TOTAL;
        FOR SELECT ARTI_COD, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD FROM ARTICULO A
            WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND
            (A.MARC_COD <= :MARFIN))) AND substring(a.arti_cod from 1 FOR 2) <> '.t'
            INTO :ARTICULO, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
            DO
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            BASE = 0;
            IVA = 0;
            CONSUMO = 0;
            COSTO = 0;
            UTILIDAD = 0;
            PORC = 0;
            SELECT BASE, IVA, CONSUMO, COSTO FROM rep_utilidad WHERE ID = :IDREP AND TIPO = 34 AND CODIGO = :articulo INTO :BASE, :IVA, :consumo,  :costo;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            EXECUTE PROCEDURE PORCENTAJE (utilidad,  TOTAL, 'S') returning_values (part);
            if ((CEROS = 'S') or (BASE <> 0) or (COSTO <> 0)) then
                SUSPEND;
            END /* FOR */
        END
    if (BIN_AND(TIPO, 16) <> 0) then
        BEGIN
        TIPODOC = 35;
        FOR SELECT MAX(D.ARTI_COD), SUM(CTDE_CANT * CTDE_FACTOR), SUM((CTDE_TOTAL-CTDE_IVAMONTO-CTDE_CONSUMO)*COTI_FACTOR), SUM(CTDE_IVAMONTO), SUM(CTDE_CONSUMO)
            FROM COTIZACIONES_DETALLE D, COTIZACIONES C, PREFIJOS P, ARTICULO A
            WHERE C.COTI_ID = D.COTI_ID AND P.PREF_PRE = C.PREF_PRE AND P.TIDO_COD = 35 AND D.ARTI_COD = A.arti_cod AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND COTI_FECHA >= :FECINI AND COTI_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            COTI_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY D.ARTI_COD
            INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO
            DO
            BEGIN
            COSTO = 0;
            FOR SELECT CTDE_CANT * CTDE_FACTOR, COTI_FECHA FROM cotizaciones_detalle D, cotizaciones F, PREFIJOS P
                WHERE F.coti_id = D.coti_id AND COTI_FECHA >= :FECINI AND COTI_FECHA <= :FECFIN AND
                COTI_ANULADO = 'N' AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 35 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                and D.ARTI_COD = :articulo  INTO :cantdet, :fecha
                DO
                BEGIN
                EXECUTE PROCEDURE costo_promedio_y_ultimo(:ARTICULO, :FECHA) returning_values (:costounit, :ultcos);
                if (ULTIMO = 'S') then
                    COSTO = COSTO + ultcos * cantdet;
                else
                    COSTO = COSTO + costounit * cantdet;
                END
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            if (CEROS = 'S') then
                INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (2, USER, :ARTICULO);
            INSERT INTO REP_UTILIDAD(ID, TIPO, CODIGO, BASE, IVA, CONSUMO, COSTO) VALUES (:IDREP, 35, :articulo, :base, :iva, :consumo, :costo);
            END /* FOR */
        SELECT SUM(BASE-COSTO) FROM REP_UTILIDAD WHERE id = :IDREP AND TIPO = 35 INTO :TOTAL;
        FOR SELECT ARTI_COD, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD FROM ARTICULO A
            WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND
            (A.MARC_COD <= :MARFIN))) AND substring(a.arti_cod from 1 FOR 2) <> '.t'
            INTO :ARTICULO, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
            DO
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            BASE = 0;
            IVA = 0;
            CONSUMO = 0;
            COSTO = 0;
            UTILIDAD = 0;
            PORC = 0;
            SELECT BASE, IVA, CONSUMO, COSTO FROM rep_utilidad WHERE ID = :IDREP AND TIPO = 35 AND CODIGO = :articulo INTO :BASE, :IVA, :consumo,  :costo;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            EXECUTE PROCEDURE PORCENTAJE (utilidad,  TOTAL, 'S') returning_values (part);
            if ((CEROS = 'S') or (BASE <> 0) or (COSTO <> 0)) then
                SUSPEND;
            END /* FOR */
        END
    END
ELSE
  if (DETALLE = 'G') then
    BEGIN
    if (BIN_AND(TIPO, 1) <> 0) then
        BEGIN
        TIPODOC = 31;
        FOR SELECT MAX(a.grup_cod), SUM((FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO)*FACT_FACTOR), SUM(FADE_IVAMONTO*FACT_FACTOR), SUM(FADE_CONSUMO)
            FROM FACTURAS_DETALLE D, FACTURAS F, PREFIJOS P, ARTICULO A
            WHERE F.FACT_ID = D.FACT_ID AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND D.ARTI_COD = A.arti_cod AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            FACT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) and substring(a.arti_cod from 1 FOR 2) <> '.t'
            GROUP BY a.grup_cod
            INTO :codgrupo, :BASE, :IVA, :CONSUMO
            DO
            BEGIN
            COSTO = 0;
            FOR SELECT MAX(D.arti_cod), SUM(FADE_CANT * FADE_FACTOR), MAX(FACT_FECHA) FROM FACTURAS_DETALLE D, FACTURAS F, PREFIJOS P, ARTICULO A
                WHERE A.arti_cod = D.arti_cod AND F.FACT_ID = D.FACT_ID AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND
                FACT_ANULADO = 'N' AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                and a.grup_cod = :codgrupo GROUP BY D.ARTI_COD, FACT_FECHA INTO :ARTICULO, cantdet, :fecha
                DO
                BEGIN
                EXECUTE PROCEDURE costo_promedio_y_ultimo(:ARTICULO, :FECHA) returning_values (:costounit, :ultcos);
                if (ULTIMO = 'S') then
                    COSTO = COSTO + ultcos * cantdet;
                else
                    COSTO = COSTO + costounit * cantdet;
                END
            CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            INSERT INTO REP_UTILIDAD(ID, TIPO, CODIGO, BASE, IVA, CONSUMO, COSTO) VALUES (:IDREP, 31, :codgrupo, :base, :iva, :consumo, :costo);
            if (CEROS = 'S') then
                INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (2, USER, :codgrupo);
            END /* FOR */
        SELECT SUM(BASE-COSTO) FROM REP_UTILIDAD WHERE id = :IDREP AND TIPO = 31 INTO :TOTAL;
        FOR SELECT GRUP_COD, GRUP_NOM FROM GRUPO
            WHERE GRUP_COD >= :GRPINI AND GRUP_COD <= :grpfin
            INTO :ARTICULO, :DESCRIPCION
            DO
            BEGIN
            BASE = 0;
            IVA = 0;
            CONSUMO = 0;
            COSTO = 0;
            UTILIDAD = 0;
            PORC = 0;
            PART = 0;
            SELECT BASE, IVA, CONSUMO, COSTO FROM rep_utilidad WHERE ID = :IDREP AND TIPO = 31 AND CODIGO = :articulo INTO :BASE, :IVA, :consumo,  :costo;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            EXECUTE PROCEDURE PORCENTAJE (utilidad,  TOTAL, 'S') returning_values (part);
            if ((CEROS = 'S') or (BASE <> 0) or (COSTO <> 0)) then
                SUSPEND;
            END /* FOR */
            BEGIN
            COSTO = 0;
            END
        END
    if (BIN_AND(TIPO, 2) <> 0) then
        BEGIN
        TIPODOC = 32;
        FOR SELECT MAX(a.grup_cod), SUM(RVDE_TOTAL-RVDE_IVAMONTO-RVDE_CONSUMO), SUM(RVDE_IVAMONTO), SUM(RVDE_CONSUMO)
            FROM REMISIONES_VENTA_DETALLE D, REMISIONES_VENTA R, PREFIJOS P, ARTICULO A
            WHERE R.REVT_ID = D.REVT_ID AND P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = 32 AND D.ARTI_COD = A.arti_cod AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            REVT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY a.grup_cod
            INTO :codgrupo, :BASE, :IVA, :CONSUMO
            DO
            BEGIN
            COSTO = 0;
            FOR SELECT MAX(D.arti_cod), SUM(RVDE_CANT * RVDE_FACTOR), MAX(REVT_FECHA) FROM remisiones_venta_detalle D, remisiones_venta F, PREFIJOS P, ARTICULO A
                WHERE A.arti_cod = D.arti_cod AND F.revt_id = D.revt_id AND REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN AND
                REVT_ANULADO = 'N' AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 32 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                and a.grup_cod = :codgrupo GROUP BY D.ARTI_COD, REVT_FECHA INTO :ARTICULO, cantdet, :fecha
                DO
                BEGIN
                EXECUTE PROCEDURE costo_promedio_y_ultimo(:ARTICULO, :FECHA) returning_values (:costounit, :ultcos);
                if (ULTIMO = 'S') then
                    COSTO = COSTO + ultcos * cantdet;
                else
                    COSTO = COSTO + costounit * cantdet;
                END
            CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            if (CEROS = 'S') then
                INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (2, USER, :codgrupo);
            INSERT INTO REP_UTILIDAD(ID, TIPO, CODIGO, BASE, IVA, CONSUMO, COSTO) VALUES (:IDREP, 32, :codgrupo, :base, :iva, :consumo, :costo);
            END /* FOR */
        SELECT SUM(BASE-COSTO) FROM REP_UTILIDAD WHERE id = :IDREP AND TIPO = 32 INTO :TOTAL;
        FOR SELECT GRUP_COD, GRUP_NOM FROM GRUPO
            WHERE GRUP_COD >= :GRPINI AND GRUP_COD <= :grpfin
            INTO :ARTICULO, :DESCRIPCION
            DO
            BEGIN
            BASE = 0;
            IVA = 0;
            CONSUMO = 0;
            COSTO = 0;
            UTILIDAD = 0;
            PORC = 0;
            SELECT BASE, IVA, CONSUMO, COSTO FROM rep_utilidad WHERE ID = :IDREP AND TIPO = 32 AND CODIGO = :articulo INTO :BASE, :IVA, :consumo,  :costo;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            EXECUTE PROCEDURE PORCENTAJE (utilidad,  TOTAL, 'S') returning_values (part);
            if ((CEROS = 'S') or (BASE <> 0) or (COSTO <> 0)) then
                SUSPEND;
            END /* FOR */
        END
    if (BIN_AND(TIPO, 4) <> 0) then
        BEGIN
        TIPODOC = 33;
        FOR SELECT MAX(a.grup_cod), SUM((DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO)*DEVT_FACTOR), SUM(DVDE_IVAMONTO*DEVT_FACTOR), SUM(DVDE_CONSUMO)
            FROM devoluciones_ventas_detalle D, DEVOLUCIONES_VENTAS V, PREFIJOS P, ARTICULO A
            WHERE V.DEVT_ID = D.DEVT_ID AND P.PREF_PRE = V.PREF_PRE AND P.TIDO_COD = 33 AND D.ARTI_COD = A.arti_cod AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            DEVT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY a.grup_cod
            INTO :codgrupo, :BASE, :IVA, :CONSUMO
            DO
            BEGIN
            COSTO = 0;
            FOR SELECT MAX(D.arti_cod), SUM(DVDE_CANT * DVDE_FACTOR), MAX(DEVT_FECHA) FROM devoluciones_ventas_detalle D, devoluciones_ventas F, PREFIJOS P, ARTICULO A
                WHERE A.arti_cod = D.arti_cod AND F.devt_id = D.devt_id AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND
                DEVT_ANULADO = 'N' AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 33 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                and a.grup_cod = :codgrupo GROUP BY D.ARTI_COD, DEVT_FECHA INTO :ARTICULO, cantdet, :fecha
                DO
                BEGIN
                EXECUTE PROCEDURE costo_promedio_y_ultimo(:ARTICULO, :FECHA) returning_values (:costounit, :ultcos);
                if (ULTIMO = 'S') then
                    COSTO = COSTO + ultcos * cantdet;
                else
                    COSTO = COSTO + costounit * cantdet;
                END
            CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            else
                BASE = BASE * -1;
            if (IVA IS NULL) then
                IVA = 0;
            else
                IVA = IVA * -1;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            else
                CONSUMO = CONSUMO * -1;
            COSTO = costo * -1;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            if (CEROS = 'S') then
                INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (2, USER, :codgrupo);
            INSERT INTO REP_UTILIDAD(ID, TIPO, CODIGO, BASE, IVA, CONSUMO, COSTO) VALUES (:IDREP, 33, :codgrupo, :base, :iva, :consumo, :costo);
            END /* FOR */
        SELECT SUM(BASE-COSTO) FROM REP_UTILIDAD WHERE id = :IDREP AND TIPO = 33 INTO :TOTAL;
        FOR SELECT GRUP_COD, GRUP_NOM FROM GRUPO
            WHERE GRUP_COD >= :GRPINI AND GRUP_COD <= :grpfin
            INTO :ARTICULO, :DESCRIPCION
            DO
            BEGIN
            BASE = 0;
            IVA = 0;
            CONSUMO = 0;
            COSTO = 0;
            UTILIDAD = 0;
            PORC = 0;
            SELECT BASE, IVA, CONSUMO, COSTO FROM rep_utilidad WHERE ID = :IDREP AND TIPO = 33 AND CODIGO = :articulo INTO :BASE, :IVA, :consumo,  :costo;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            EXECUTE PROCEDURE PORCENTAJE (utilidad,  TOTAL, 'S') returning_values (part);
            if ((CEROS = 'S') or (BASE <> 0) or (COSTO <> 0)) then
                SUSPEND;
            END /* FOR */
        END
    if (BIN_AND(TIPO, 8) <> 0) then
        BEGIN
        TIPODOC = 34;
        /* BORRA LA TABLA AUXILIAR */
        DELETE FROM reportes_aux WHERE REPA_ID = 2 AND REPA_USER = USER;

        FOR SELECT MAX(a.grup_cod), SUM((PEDE_TOTAL-PEDE_IVAMONTO-PEDE_CONSUMO)*PEDI_FACTOR), SUM(PEDE_IVAMONTO*PEDI_FACTOR), SUM(PEDE_CONSUMO)
            FROM PEDIDOS_DETALLE D, PEDIDOS P, PREFIJOS R, ARTICULO A
            WHERE P.PEDI_ID = D.PEDI_ID AND P.PREF_PRE = R.PREF_PRE AND R.TIDO_COD = 34 AND D.ARTI_COD = A.arti_cod AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            PEDI_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY a.grup_cod
            INTO :codgrupo, :BASE, :IVA, :CONSUMO
            DO
            BEGIN
            COSTO = 0;
            FOR SELECT MAX(D.arti_cod), SUM(PEDE_CANT * PEDE_FACTOR), MAX(pedi_FECHA) FROM pedidos_detalle D, pedidos F, PREFIJOS P, ARTICULO A
                WHERE A.arti_cod = D.arti_cod AND F.pedi_id = D.pedi_id AND PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND
                PEDI_ANULADO = 'N' AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 34 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                and a.grup_cod = :codgrupo GROUP BY D.ARTI_COD, PEDI_FECHA INTO :ARTICULO, cantdet, :fecha
                DO
                BEGIN
                EXECUTE PROCEDURE costo_promedio_y_ultimo(:ARTICULO, :FECHA) returning_values (:costounit, :ultcos);
                if (ULTIMO = 'S') then
                    COSTO = COSTO + ultcos * cantdet;
                else
                    COSTO = COSTO + costounit * cantdet;
                END
            CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            if (CEROS = 'S') then
                INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (2, USER, :codgrupo);
            INSERT INTO REP_UTILIDAD(ID, TIPO, CODIGO, BASE, IVA, CONSUMO, COSTO) VALUES (:IDREP, 34, :codgrupo, :base, :iva, :consumo, :costo);
            END /* FOR */
        SELECT SUM(BASE-COSTO) FROM REP_UTILIDAD WHERE id = :IDREP AND TIPO = 34 INTO :TOTAL;
        FOR SELECT GRUP_COD, GRUP_NOM FROM GRUPO
            WHERE GRUP_COD >= :GRPINI AND GRUP_COD <= :grpfin
            INTO :ARTICULO, :DESCRIPCION
            DO
            BEGIN
            BASE = 0;
            IVA = 0;
            CONSUMO = 0;
            COSTO = 0;
            UTILIDAD = 0;
            PORC = 0;
            SELECT BASE, IVA, CONSUMO, COSTO FROM rep_utilidad WHERE ID = :IDREP AND TIPO = 34 AND CODIGO = :articulo INTO :BASE, :IVA, :consumo,  :costo;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            EXECUTE PROCEDURE PORCENTAJE (utilidad,  TOTAL, 'S') returning_values (part);
            if ((CEROS = 'S') or (BASE <> 0) or (COSTO <> 0)) then
                SUSPEND;
            END /* FOR */
        END
    if (BIN_AND(TIPO, 16) <> 0) then
        BEGIN
        TIPODOC = 35;
        FOR SELECT MAX(a.grup_cod), SUM((CTDE_TOTAL-CTDE_IVAMONTO-CTDE_CONSUMO)*COTI_FACTOR), SUM(CTDE_IVAMONTO), SUM(CTDE_CONSUMO)
            FROM COTIZACIONES_DETALLE D, COTIZACIONES C, PREFIJOS P, ARTICULO A
            WHERE C.COTI_ID = D.COTI_ID AND P.PREF_PRE = C.PREF_PRE AND P.TIDO_COD = 35 AND D.ARTI_COD = A.arti_cod AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND COTI_FECHA >= :FECINI AND COTI_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            COTI_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY A.grup_cod
            INTO :codgrupo, :BASE, :IVA, :CONSUMO
            DO
            BEGIN
            COSTO = 0;
            FOR SELECT MAX(D.arti_cod), SUM(CTDE_CANT * CTDE_FACTOR), MAX(COTI_FECHA) FROM cotizaciones_detalle D, cotizaciones F, PREFIJOS P, ARTICULO A
                WHERE A.arti_cod = D.arti_cod AND F.coti_id = D.coti_id AND COTI_FECHA >= :FECINI AND COTI_FECHA <= :FECFIN AND
                COTI_ANULADO = 'N' AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 35 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                and a.grup_cod = :codgrupo GROUP BY D.ARTI_COD, COTI_FECHA INTO :ARTICULO, cantdet, :fecha
                DO
                BEGIN
                EXECUTE PROCEDURE costo_promedio_y_ultimo(:ARTICULO, :FECHA) returning_values (:costounit, :ultcos);
                if (ULTIMO = 'S') then
                    COSTO = COSTO + ultcos * cantdet;
                else
                    COSTO = COSTO + costounit * cantdet;
                END
            CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            if (CEROS = 'S') then
                INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (2, USER, :codgrupo);
            INSERT INTO REP_UTILIDAD(ID, TIPO, CODIGO, BASE, IVA, CONSUMO, COSTO) VALUES (:IDREP, 35, :codgrupo, :base, :iva, :consumo, :costo);
            END /* FOR */
        SELECT SUM(BASE-COSTO) FROM REP_UTILIDAD WHERE id = :IDREP AND TIPO = 35 INTO :TOTAL;
        FOR SELECT GRUP_COD, GRUP_NOM FROM GRUPO
            WHERE GRUP_COD >= :GRPINI AND GRUP_COD <= :grpfin
            INTO :ARTICULO, :DESCRIPCION
            DO
            BEGIN
            BASE = 0;
            IVA = 0;
            CONSUMO = 0;
            COSTO = 0;
            UTILIDAD = 0;
            PORC = 0;
            SELECT BASE, IVA, CONSUMO, COSTO FROM rep_utilidad WHERE ID = :IDREP AND TIPO = 35 AND CODIGO = :articulo INTO :BASE, :IVA, :consumo,  :costo;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            EXECUTE PROCEDURE PORCENTAJE (utilidad,  TOTAL, 'S') returning_values (part);
            if ((CEROS = 'S') or (BASE <> 0) or (COSTO <> 0)) then
                SUSPEND;
            END /* FOR */
        END
    END
  ELSE
    BEGIN
    if (BIN_AND(TIPO, 1) <> 0) then
        BEGIN
        TIPODOC = 31;
        FOR SELECT F.PREF_PRE, FACT_NUMERO, FACT_FECHA, D.ARTI_COD, FADE_CANT * FADE_FACTOR, (FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO)*FACT_FACTOR, FADE_IVAMONTO*FACT_FACTOR, FADE_CONSUMO,
            ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
            FROM FACTURAS F, FACTURAS_DETALLE D, PREFIJOS P, ARTICULO A
            WHERE F.FACT_ID = D.FACT_ID AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND D.ARTI_COD = A.arti_cod AND
                A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
                A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND FACT_FECHA >= :FECINI AND
                (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
                FACT_FECHA <= :FECFIN AND FACT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) and substring(a.arti_cod from 1 FOR 2) <> '.t'
            ORDER BY D.ARTI_COD, FACT_FECHA, F.FACT_ID, FADE_ITEM
            INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,
                :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
            DO
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            EXECUTE PROCEDURE costo_promedio_y_ultimo(:ARTICULO, :FECHA) returning_values (:costounit, :ultcos);
            if (ULTIMO = 'S') then
                COSTO = ultcos * cantidad;
            else
                COSTO = costounit * cantidad;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            SUSPEND;
            END
        END
    if (BIN_AND(TIPO, 2) <> 0) then
        BEGIN
        TIPODOC = 32;
        FOR SELECT R.PREF_PRE, REVT_NUMERO, REVT_FECHA, D.ARTI_COD, RVDE_CANT * RVDE_FACTOR, RVDE_TOTAL-RVDE_IVAMONTO-RVDE_CONSUMO, RVDE_IVAMONTO, RVDE_CONSUMO,
            ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
            FROM REMISIONES_VENTA R, REMISIONES_VENTA_DETALLE D, PREFIJOS P, ARTICULO A
            WHERE R.REVT_ID = D.REVT_ID AND P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = 32 AND D.ARTI_COD = A.arti_cod AND
                A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
                A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN AND
                (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
                REVT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            ORDER BY D.ARTI_COD, REVT_FECHA, R.REVT_ID, RVDE_ITEM
            INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,
                :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
            DO
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            EXECUTE PROCEDURE costo_promedio_y_ultimo(:ARTICULO, :FECHA) returning_values (:costounit, :ultcos);
            if (ULTIMO = 'S') then
                COSTO = ultcos * cantidad;
            else
                COSTO = costounit * cantidad;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            SUSPEND;
            END
        END
    if (BIN_AND(TIPO, 4) <> 0) then
        BEGIN
        TIPODOC = 33;
        FOR SELECT V.PREF_PRE, DEVT_NUMERO, DEVT_FECHA, D.ARTI_COD, DVDE_CANT * DVDE_FACTOR, (DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO)*DEVT_FACTOR, DVDE_IVAMONTO*DEVT_FACTOR, DVDE_CONSUMO,
            ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
            FROM DEVOLUCIONES_VENTAS V, DEVOLUCIONES_VENTAS_DETALLE D, PREFIJOS P, ARTICULO A
            WHERE V.DEVT_ID = D.DEVT_ID AND P.PREF_PRE = V.PREF_PRE AND P.TIDO_COD = 33 AND D.ARTI_COD = A.arti_cod AND
                A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
                A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND
                (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
                DEVT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            ORDER BY D.ARTI_COD, DEVT_FECHA, V.DEVT_ID, DVDE_ITEM
            INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,
                :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
            DO
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            CANTIDAD = CANTIDAD * -1;
            EXECUTE PROCEDURE costo_promedio_y_ultimo(:ARTICULO, :FECHA) returning_values (:costounit, :ultcos);
            if (ULTIMO = 'S') then
                COSTO = ultcos * cantidad;
            else
                COSTO = costounit * cantidad;
            BASE = BASE * -1;
            IVA = IVA * -1;
            CONSUMO = CONSUMO * -1;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            SUSPEND;
            END
        END
    if (BIN_AND(TIPO, 8) <> 0) then
        BEGIN
        TIPODOC = 34;
        FOR SELECT P.PREF_PRE, PEDI_NUMERO, PEDI_FECHA, D.ARTI_COD, PEDE_CANT * PEDE_FACTOR, (PEDE_TOTAL-PEDE_IVAMONTO-PEDE_CONSUMO)*PEDI_FACTOR, PEDE_IVAMONTO*PEDI_FACTOR, PEDE_CONSUMO,
            ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD 
            FROM PEDIDOS P, PEDIDOS_DETALLE D, PREFIJOS R, ARTICULO A
            WHERE P.PEDI_ID = D.PEDI_ID AND P.PREF_PRE = R.PREF_PRE AND R.TIDO_COD = 34 AND D.ARTI_COD = A.arti_cod AND
                A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
                A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND
                (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
                PEDI_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            ORDER BY D.ARTI_COD, PEDI_FECHA, P.PEDI_ID, PEDE_ITEM
            INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,
                :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
            DO
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            EXECUTE PROCEDURE costo_promedio_y_ultimo(:ARTICULO, :FECHA) returning_values (:costounit, :ultcos);
            if (ULTIMO = 'S') then
                COSTO = ultcos * cantidad;
            else
                COSTO = costounit * cantidad;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            SUSPEND;
            END
        END
    if (BIN_AND(TIPO, 16) <> 0) then
        BEGIN
        TIPODOC = 35;
        FOR SELECT C.PREF_PRE, COTI_NUMERO, COTI_FECHA, D.ARTI_COD, CTDE_CANT * CTDE_FACTOR, (CTDE_TOTAL-CTDE_IVAMONTO-CTDE_CONSUMO)*COTI_FACTOR, CTDE_IVAMONTO*COTI_FACTOR, CTDE_CONSUMO,
            ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD 
            FROM COTIZACIONES C, COTIZACIONES_DETALLE D, PREFIJOS P, ARTICULO A
            WHERE C.COTI_ID = D.COTI_ID AND P.PREF_PRE = C.PREF_PRE AND P.TIDO_COD = 35 AND D.ARTI_COD = A.arti_cod AND
                A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
                A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND COTI_FECHA >= :FECINI AND COTI_FECHA <= :FECFIN AND
                (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
                COTI_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            ORDER BY D.ARTI_COD, COTI_FECHA, C.COTI_ID, CTDE_ITEM
            INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,
                :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
            DO
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            EXECUTE PROCEDURE costo_promedio_y_ultimo(:ARTICULO, :FECHA) returning_values (:costounit, :ultcos);
            if (ULTIMO = 'S') then
                COSTO = ultcos * cantidad;
            else
                COSTO = costounit * cantidad;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            SUSPEND;
            END
        END
    END
END
^

SET TERM ; ^


/* 20100214 */
/* CONTABILIZACION DE VENTAS Y DEVOLUCIONES MAS EXACTO EN MOVIMIENTOS CON DIF. COSTO DEL MISMO DIA */
SET TERM ^ ;

CREATE OR ALTER procedure RECONTABILICE_COSTOS_VENTAS (
    FECINI date,
    FECFIN date)
returns (
    ID integer,
    PREF varchar(4),
    NUMERO varchar(6),
    IDC integer)
AS
declare variable IDI INTEGER;
begin
FOR SELECT FACT_ID, PREF_PRE, FACT_NUMERO FROM FACTURAS WHERE fact_anulado = 'N' and FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN ORDER BY FACT_FECHA, FACT_ID INTO :ID, :PREF, :NUMERO
do  
    BEGIN
    SELECT MAX(INVE_ID) FROM INTERFAZ_VENTAS WHERE PREF_PRE = :PREF AND TIDO_COD = 31 INTO :IDI;
/*    EXECUTE PROCEDURE CONTABILICE_COSTO_VENTAS(:ID, :IDI) returning_values (:IDC);*/
    suspend;
    END
end
^

SET TERM ; ^


SET TERM ^ ;

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

SET TERM ; ^

SET TERM ^ ;

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

SET TERM ; ^

SET TERM ^ ;

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

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER EXISTENCIA_BU FOR EXISTENCIA
ACTIVE BEFORE UPDATE POSITION 0
AS
declare variable ACCION VARCHAR(12);
BEGIN
  /* Verifique que no quede negativo */
  if ((NEW.EXIS_SALDO + NEW.EXIS_ENTR - NEW.EXIS_SAL) < 0) then
    BEGIN
    EXECUTE PROCEDURE LEE_CONFIGURACION('INVENTARIO', 'EXISTENCIAS', 'ACCION A TOMAR SI LA EXISTENCIA ES INSUFICIENTE') returning_values (:ACCION);
    if (ACCION = 'PROHIBIR') then
        EXCEPTION EXISTENCIA_INSUFICIENTE 'La existencia del articulo ' || new.arti_cod || ' quedará negativa en ' || (NEW.EXIS_SALDO + NEW.EXIS_ENTR - NEW.EXIS_SAL) || ' en ' || new.exis_fecha;
    END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER EXISTENCIA_BI FOR EXISTENCIA
ACTIVE BEFORE INSERT POSITION 0
AS
declare variable ACCION VARCHAR(12);
BEGIN
  /* Verifique que no quede negativo */
  if ((NEW.EXIS_SALDO + NEW.EXIS_ENTR - NEW.EXIS_SAL) < 0) then
    BEGIN
    EXECUTE PROCEDURE LEE_CONFIGURACION('INVENTARIO', 'EXISTENCIAS', 'ACCION A TOMAR SI LA EXISTENCIA ES INSUFICIENTE') returning_values (:ACCION);
    if (ACCION = 'PROHIBIR') then
        EXCEPTION EXISTENCIA_INSUFICIENTE 'La existencia del articulo ' || new.arti_cod || ' quedará negativa en ' || (NEW.EXIS_SALDO + NEW.EXIS_ENTR - NEW.EXIS_SAL) || ' en ' || new.exis_fecha;
    END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure REP_UTILIDAD_VENTAS (
    TIPO integer,
    DETALLE char(1),
    FECINI date,
    FECFIN date,
    ARTINI varchar(15),
    ARTFIN varchar(15),
    GRPINI varchar(3),
    GRPFIN varchar(3),
    ORDEN char(1),
    AGRUPA char(1),
    ULTIMO char(1),
    CEROS char(1),
    SUBEMPRESA integer)
returns (
    ARTICULO varchar(15),
    DESCRIPCION varchar(60),
    CODGRUPO varchar(2),
    NOMGRUPO varchar(30),
    CODSUBG varchar(3),
    NOMSUBG varchar(30),
    CODMARC varchar(3),
    NOMMARC varchar(30),
    UNIDAD varchar(8),
    CANTIDAD numeric(18,4),
    BASE numeric(18,4),
    COSTO numeric(18,4),
    UTILIDAD numeric(18,4),
    PORC numeric(9,2),
    IVA numeric(18,4),
    CONSUMO numeric(18,4),
    PREFIJO varchar(4),
    NUMERO varchar(6),
    FECHA date,
    TIPODOC integer,
    PART float)
AS
DECLARE VARIABLE COSTOUNIT NUMERIC(18,4);
DECLARE VARIABLE CANTDET NUMERIC(18,4);
DECLARE VARIABLE TOTAL NUMERIC(18,2);
declare variable CODINI VARCHAR(15);
declare variable CODFIN VARCHAR(15);
declare variable DESINI VARCHAR(15);
declare variable DESFIN VARCHAR(15);
declare variable MARINI VARCHAR(3);
declare variable MARFIN VARCHAR(3);
declare variable UOM VARCHAR(20);
declare variable ULTCOS NUMERIC(18,2);
declare variable IDREP INTEGER;
declare variable ID integer;
declare variable ITEM integer;
BEGIN
if (ORDEN = 'C') then
    BEGIN
    CODINI = ARTINI;
    CODFIN = ARTFIN;
    DESINI = '';
    DESFIN = 'zz';
    END
ELSE
    BEGIN
    DESINI = ARTINI;
    DESFIN = ARTFIN;
    CODINI = '';
    CODFIN = 'zz';
    END
if (AGRUPA = 'G') then
    BEGIN
    MARINI = '';
    MARFIN = 'zz';
    END
ELSE
    if (AGRUPA = 'M') then
        BEGIN
        MARINI = GRPINI;
        MARFIN = GRPFIN;
        GRPINI = '';
        GRPFIN = 'zz';
        END
    ELSE
        BEGIN
        MARINI = '';
        MARFIN = 'zz';
        GRPINI = '';
        GRPFIN = 'zz';
        END
EXECUTE PROCEDURE lee_configuracion ('FACTURACION', 'ARTICULOS', 'SUGERIR PRECIOS CON PORCENTAJE DE MARGEN O UTILIDAD') returning_values (:UOM);
IDREP = GEN_ID(id_reputilidad, 1);
if (DETALLE = 'N') then
    BEGIN
    if (BIN_AND(TIPO, 1) <> 0) then
        BEGIN
        TIPODOC = 31;
        FOR SELECT MAX(D.ARTI_COD), SUM(FADE_CANT * FADE_FACTOR), SUM((FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO)*FACT_FACTOR), SUM(FADE_IVAMONTO*FACT_FACTOR), SUM(FADE_CONSUMO)
            FROM FACTURAS_DETALLE D, FACTURAS F, PREFIJOS P, ARTICULO A
            WHERE F.FACT_ID = D.FACT_ID AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND D.ARTI_COD = A.arti_cod AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            FACT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) and substring(a.arti_cod from 1 FOR 2) <> '.t'
            GROUP BY D.ARTI_COD
            INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO
            DO
            BEGIN
            COSTO = 0;
            FOR SELECT FADE_CANT * FADE_FACTOR, FACT_FECHA, F.FACT_ID, FADE_ITEM FROM FACTURAS_DETALLE D, FACTURAS F, PREFIJOS P
                WHERE F.FACT_ID = D.FACT_ID AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND
                FACT_ANULADO = 'N' AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                and D.ARTI_COD = :articulo  INTO :cantdet, :fecha, :id, :item
                DO
                BEGIN
                if (EXISTS (SELECT COST_SALP / COST_SALC FROM COSTOS C, MOVIMIENTO_ARTICULO M
                    WHERE COST_IDMOV = MVAR_CONS AND MVAR_TIPODOC = 31 AND MVAR_IDREF = :ID AND COST_SALC <> 0 AND MVAR_ITEM = :ITEM)) then
                    SELECT COST_SALP / COST_SALC, COST_ULTIMO FROM COSTOS C, MOVIMIENTO_ARTICULO M
                    WHERE COST_IDMOV = MVAR_CONS AND MVAR_TIPODOC = 31 AND MVAR_IDREF = :ID AND COST_SALC <> 0 AND MVAR_ITEM = :ITEM INTO :costounit, :ultcos;
                else
                    EXECUTE PROCEDURE costo_promedio_y_ultimo(:ARTICULO, :FECHA) returning_values (:costounit, :ultcos);
                if (ULTIMO = 'S') then
                    COSTO = COSTO + ultcos * cantdet;
                else
                    COSTO = COSTO + costounit * cantdet;
                END
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            INSERT INTO REP_UTILIDAD(ID, TIPO, CODIGO, BASE, IVA, CONSUMO, COSTO) VALUES (:IDREP, 31, :articulo, :base, :iva, :consumo, :costo);
            if (CEROS = 'S') then
                INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (2, USER, :ARTICULO);
            END /* FOR */
        SELECT SUM(BASE-COSTO) FROM REP_UTILIDAD WHERE id = :IDREP AND TIPO = 31 INTO :TOTAL;
        FOR SELECT ARTI_COD, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD FROM ARTICULO A
            WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND
            (A.MARC_COD <= :MARFIN))) AND substring(a.arti_cod from 1 FOR 2) <> '.t'
            INTO :ARTICULO, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
            DO
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            BASE = 0;
            IVA = 0;
            CONSUMO = 0;
            COSTO = 0;
            UTILIDAD = 0;
            PORC = 0;
            PART = 0;
            SELECT BASE, IVA, CONSUMO, COSTO FROM rep_utilidad WHERE ID = :IDREP AND TIPO = 31 AND CODIGO = :articulo INTO :BASE, :IVA, :consumo,  :costo;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            EXECUTE PROCEDURE PORCENTAJE (utilidad,  TOTAL, 'S') returning_values (part);
            if ((CEROS = 'S') or (BASE <> 0) or (COSTO <> 0)) then
                SUSPEND;
            END /* FOR */
            BEGIN
            COSTO = 0;
            END
        END
    if (BIN_AND(TIPO, 2) <> 0) then
        BEGIN
        TIPODOC = 32;
        FOR SELECT MAX(D.ARTI_COD), SUM(RVDE_CANT * RVDE_FACTOR), SUM(RVDE_TOTAL-RVDE_IVAMONTO-RVDE_CONSUMO), SUM(RVDE_IVAMONTO), SUM(RVDE_CONSUMO)
            FROM REMISIONES_VENTA_DETALLE D, REMISIONES_VENTA R, PREFIJOS P, ARTICULO A
            WHERE R.REVT_ID = D.REVT_ID AND P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = 32 AND D.ARTI_COD = A.arti_cod AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            REVT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY D.ARTI_COD
            INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO
            DO
            BEGIN
            COSTO = 0;
            FOR SELECT RVDE_CANT * RVDE_FACTOR, REVT_FECHA, F.REVT_ID, RVDE_ITEM FROM remisiones_venta_detalle D, remisiones_venta F, PREFIJOS P
                WHERE F.revt_id = D.revt_id AND REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN AND
                REVT_ANULADO = 'N' AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 32 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                and D.ARTI_COD = :articulo  INTO :cantdet, :fecha, :id, :item
                DO
                BEGIN
                if (EXISTS (SELECT COST_SALP / COST_SALC FROM COSTOS C, MOVIMIENTO_ARTICULO M
                    WHERE COST_IDMOV = MVAR_CONS AND MVAR_TIPODOC = 32 AND MVAR_IDREF = :ID AND COST_SALC <> 0 AND MVAR_ITEM = :ITEM)) then
                    SELECT COST_SALP / COST_SALC, cost_ultimo FROM COSTOS C, MOVIMIENTO_ARTICULO M
                    WHERE COST_IDMOV = MVAR_CONS AND MVAR_TIPODOC = 32 AND MVAR_IDREF = :ID AND COST_SALC <> 0 AND MVAR_ITEM = :ITEM INTO :costounit, :ultcos;
                else
                    EXECUTE PROCEDURE costo_promedio_y_ultimo(:ARTICULO, :FECHA) returning_values (:costounit, :ultcos);
                if (ULTIMO = 'S') then
                    COSTO = COSTO + ultcos * cantdet;
                else
                    COSTO = COSTO + costounit * cantdet;
                END
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            if (CEROS = 'S') then
                INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (2, USER, :ARTICULO);
            INSERT INTO REP_UTILIDAD(ID, TIPO, CODIGO, BASE, IVA, CONSUMO, COSTO) VALUES (:IDREP, 32, :articulo, :base, :iva, :consumo, :costo);
            END /* FOR */
        SELECT SUM(BASE-COSTO) FROM REP_UTILIDAD WHERE id = :IDREP AND TIPO = 32 INTO :TOTAL;
        FOR SELECT ARTI_COD, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD FROM ARTICULO A
            WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND
            (A.MARC_COD <= :MARFIN))) AND substring(a.arti_cod from 1 FOR 2) <> '.t'
            INTO :ARTICULO, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
            DO
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            BASE = 0;
            IVA = 0;
            CONSUMO = 0;
            COSTO = 0;
            UTILIDAD = 0;
            PORC = 0;
            SELECT BASE, IVA, CONSUMO, COSTO FROM rep_utilidad WHERE ID = :IDREP AND TIPO = 32 AND CODIGO = :articulo INTO :BASE, :IVA, :consumo,  :costo;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            EXECUTE PROCEDURE PORCENTAJE (utilidad,  TOTAL, 'S') returning_values (part);
            if ((CEROS = 'S') or (BASE <> 0) or (COSTO <> 0)) then
                SUSPEND;
            END /* FOR */
        END
    if (BIN_AND(TIPO, 4) <> 0) then
        BEGIN
        TIPODOC = 33;
        FOR SELECT MAX(D.ARTI_COD), SUM(DVDE_CANT * DVDE_FACTOR), SUM((DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO)*DEVT_FACTOR), SUM(DVDE_IVAMONTO*DEVT_FACTOR), SUM(DVDE_CONSUMO)
            FROM devoluciones_ventas_detalle D, DEVOLUCIONES_VENTAS V, PREFIJOS P, ARTICULO A
            WHERE V.DEVT_ID = D.DEVT_ID AND P.PREF_PRE = V.PREF_PRE AND P.TIDO_COD = 33 AND D.ARTI_COD = A.arti_cod AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            DEVT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY D.ARTI_COD
            INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO
            DO
            BEGIN
            COSTO = 0;
            FOR SELECT DVDE_CANT * DVDE_FACTOR, DEVT_FECHA, F.DEVT_ID, DVDE_ITEM FROM devoluciones_ventas_detalle D, devoluciones_ventas F, PREFIJOS P
                WHERE F.devt_id = D.devt_id AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND
                DEVT_ANULADO = 'N' AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 33 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                and D.ARTI_COD = :articulo  INTO :cantdet, :fecha, :id, :item
                DO
                BEGIN
                if (EXISTS (SELECT COST_ENTP / COST_ENTC FROM COSTOS C, MOVIMIENTO_ARTICULO M
                    WHERE COST_IDMOV = MVAR_CONS AND MVAR_TIPODOC = 33 AND MVAR_IDREF = :ID AND COST_ENTC <> 0 AND MVAR_ITEM = :ITEM)) then
                    SELECT COST_ENTP / COST_ENTC, COST_ULTIMO FROM COSTOS C, MOVIMIENTO_ARTICULO M
                        WHERE COST_IDMOV = MVAR_CONS AND MVAR_TIPODOC = 33 AND MVAR_IDREF = :ID AND COST_ENTC <> 0 AND MVAR_ITEM = :ITEM INTO :costounit, :ultcos;
                else
                    EXECUTE PROCEDURE costo_promedio_y_ultimo(:ARTICULO, :FECHA) returning_values (:costounit, :ultcos);
                if (ULTIMO = 'S') then
                    COSTO = COSTO + ultcos * cantdet;
                else
                    COSTO = COSTO + costounit * cantdet;
                END
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            else
                CANTIDAD = CANTIDAD * -1;
            if (BASE IS NULL) then
                BASE = 0;
            else
                BASE = BASE * -1;
            if (IVA IS NULL) then
                IVA = 0;
            else
                IVA = IVA * -1;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            else
                CONSUMO = CONSUMO * -1;
            COSTO = costo * -1;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            if (CEROS = 'S') then
                INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (2, USER, :ARTICULO);
            INSERT INTO REP_UTILIDAD(ID, TIPO, CODIGO, BASE, IVA, CONSUMO, COSTO) VALUES (:IDREP, 33, :articulo, :base, :iva, :consumo, :costo);
            END /* FOR */
        SELECT SUM(BASE-COSTO) FROM REP_UTILIDAD WHERE id = :IDREP AND TIPO = 33 INTO :TOTAL;
        FOR SELECT ARTI_COD, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD FROM ARTICULO A
            WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND
            (A.MARC_COD <= :MARFIN))) AND substring(a.arti_cod from 1 FOR 2) <> '.t'
            INTO :ARTICULO, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
            DO
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            BASE = 0;
            IVA = 0;
            CONSUMO = 0;
            COSTO = 0;
            UTILIDAD = 0;
            PORC = 0;
            SELECT BASE, IVA, CONSUMO, COSTO FROM rep_utilidad WHERE ID = :IDREP AND TIPO = 33 AND CODIGO = :articulo INTO :BASE, :IVA, :consumo,  :costo;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            EXECUTE PROCEDURE PORCENTAJE (utilidad,  TOTAL, 'S') returning_values (part);
            if ((CEROS = 'S') or (BASE <> 0) or (COSTO <> 0)) then
                SUSPEND;
            END /* FOR */
        END
    if (BIN_AND(TIPO, 8) <> 0) then
        BEGIN
        TIPODOC = 34;
        /* BORRA LA TABLA AUXILIAR */
        DELETE FROM reportes_aux WHERE REPA_ID = 2 AND REPA_USER = USER;

        FOR SELECT MAX(D.ARTI_COD), SUM(PEDE_CANT * PEDE_FACTOR), SUM((PEDE_TOTAL-PEDE_IVAMONTO-PEDE_CONSUMO)*PEDI_FACTOR), SUM(PEDE_IVAMONTO*PEDI_FACTOR), SUM(PEDE_CONSUMO)
            FROM PEDIDOS_DETALLE D, PEDIDOS P, PREFIJOS R, ARTICULO A
            WHERE P.PEDI_ID = D.PEDI_ID AND P.PREF_PRE = R.PREF_PRE AND R.TIDO_COD = 34 AND D.ARTI_COD = A.arti_cod AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            PEDI_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY D.ARTI_COD
            INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO
            DO
            BEGIN
            COSTO = 0;
            FOR SELECT PEDE_CANT * PEDE_FACTOR, PEDI_FECHA FROM pedidos_detalle D, pedidos F, PREFIJOS P
                WHERE F.pedi_id = D.pedi_id AND PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND
                PEDI_ANULADO = 'N' AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                and D.ARTI_COD = :articulo  INTO :cantdet, :fecha
                DO
                BEGIN
                EXECUTE PROCEDURE costo_promedio_y_ultimo(:ARTICULO, :FECHA) returning_values (:costounit, :ultcos);
                if (ULTIMO = 'S') then
                    COSTO = COSTO + ultcos * cantdet;
                else
                    COSTO = COSTO + costounit * cantdet;
                END
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            if (CEROS = 'S') then
                INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (2, USER, :ARTICULO);
            INSERT INTO REP_UTILIDAD(ID, TIPO, CODIGO, BASE, IVA, CONSUMO, COSTO) VALUES (:IDREP, 34, :articulo, :base, :iva, :consumo, :costo);
            END /* FOR */
        SELECT SUM(BASE-COSTO) FROM REP_UTILIDAD WHERE id = :IDREP AND TIPO = 34 INTO :TOTAL;
        FOR SELECT ARTI_COD, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD FROM ARTICULO A
            WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND
            (A.MARC_COD <= :MARFIN))) AND substring(a.arti_cod from 1 FOR 2) <> '.t'
            INTO :ARTICULO, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
            DO
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            BASE = 0;
            IVA = 0;
            CONSUMO = 0;
            COSTO = 0;
            UTILIDAD = 0;
            PORC = 0;
            SELECT BASE, IVA, CONSUMO, COSTO FROM rep_utilidad WHERE ID = :IDREP AND TIPO = 34 AND CODIGO = :articulo INTO :BASE, :IVA, :consumo,  :costo;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            EXECUTE PROCEDURE PORCENTAJE (utilidad,  TOTAL, 'S') returning_values (part);
            if ((CEROS = 'S') or (BASE <> 0) or (COSTO <> 0)) then
                SUSPEND;
            END /* FOR */
        END
    if (BIN_AND(TIPO, 16) <> 0) then
        BEGIN
        TIPODOC = 35;
        FOR SELECT MAX(D.ARTI_COD), SUM(CTDE_CANT * CTDE_FACTOR), SUM((CTDE_TOTAL-CTDE_IVAMONTO-CTDE_CONSUMO)*COTI_FACTOR), SUM(CTDE_IVAMONTO), SUM(CTDE_CONSUMO)
            FROM COTIZACIONES_DETALLE D, COTIZACIONES C, PREFIJOS P, ARTICULO A
            WHERE C.COTI_ID = D.COTI_ID AND P.PREF_PRE = C.PREF_PRE AND P.TIDO_COD = 35 AND D.ARTI_COD = A.arti_cod AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND COTI_FECHA >= :FECINI AND COTI_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            COTI_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY D.ARTI_COD
            INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO
            DO
            BEGIN
            COSTO = 0;
            FOR SELECT CTDE_CANT * CTDE_FACTOR, COTI_FECHA FROM cotizaciones_detalle D, cotizaciones F, PREFIJOS P
                WHERE F.coti_id = D.coti_id AND COTI_FECHA >= :FECINI AND COTI_FECHA <= :FECFIN AND
                COTI_ANULADO = 'N' AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 35 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                and D.ARTI_COD = :articulo  INTO :cantdet, :fecha
                DO
                BEGIN
                EXECUTE PROCEDURE costo_promedio_y_ultimo(:ARTICULO, :FECHA) returning_values (:costounit, :ultcos);
                if (ULTIMO = 'S') then
                    COSTO = COSTO + ultcos * cantdet;
                else
                    COSTO = COSTO + costounit * cantdet;
                END
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            if (CEROS = 'S') then
                INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (2, USER, :ARTICULO);
            INSERT INTO REP_UTILIDAD(ID, TIPO, CODIGO, BASE, IVA, CONSUMO, COSTO) VALUES (:IDREP, 35, :articulo, :base, :iva, :consumo, :costo);
            END /* FOR */
        SELECT SUM(BASE-COSTO) FROM REP_UTILIDAD WHERE id = :IDREP AND TIPO = 35 INTO :TOTAL;
        FOR SELECT ARTI_COD, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD FROM ARTICULO A
            WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND
            (A.MARC_COD <= :MARFIN))) AND substring(a.arti_cod from 1 FOR 2) <> '.t'
            INTO :ARTICULO, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
            DO
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            BASE = 0;
            IVA = 0;
            CONSUMO = 0;
            COSTO = 0;
            UTILIDAD = 0;
            PORC = 0;
            SELECT BASE, IVA, CONSUMO, COSTO FROM rep_utilidad WHERE ID = :IDREP AND TIPO = 35 AND CODIGO = :articulo INTO :BASE, :IVA, :consumo,  :costo;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            EXECUTE PROCEDURE PORCENTAJE (utilidad,  TOTAL, 'S') returning_values (part);
            if ((CEROS = 'S') or (BASE <> 0) or (COSTO <> 0)) then
                SUSPEND;
            END /* FOR */
        END
    END
ELSE
  if (DETALLE = 'G') then
    BEGIN
    if (BIN_AND(TIPO, 1) <> 0) then
        BEGIN
        TIPODOC = 31;
        FOR SELECT MAX(a.grup_cod), SUM((FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO)*FACT_FACTOR), SUM(FADE_IVAMONTO*FACT_FACTOR), SUM(FADE_CONSUMO)
            FROM FACTURAS_DETALLE D, FACTURAS F, PREFIJOS P, ARTICULO A
            WHERE F.FACT_ID = D.FACT_ID AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND D.ARTI_COD = A.arti_cod AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            FACT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) and substring(a.arti_cod from 1 FOR 2) <> '.t'
            GROUP BY a.grup_cod
            INTO :codgrupo, :BASE, :IVA, :CONSUMO
            DO
            BEGIN
            COSTO = 0;
            FOR SELECT D.arti_cod, FADE_CANT * FADE_FACTOR, FACT_FECHA, F.fact_id, D.fade_item FROM FACTURAS_DETALLE D, FACTURAS F, PREFIJOS P, ARTICULO A
                WHERE A.arti_cod = D.arti_cod AND F.FACT_ID = D.FACT_ID AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND
                FACT_ANULADO = 'N' AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                and a.grup_cod = :codgrupo INTO :ARTICULO, cantdet, :fecha, :id, :item
                DO
                BEGIN
                if (EXISTS (SELECT COST_SALP / COST_SALC FROM COSTOS C, MOVIMIENTO_ARTICULO M
                    WHERE COST_IDMOV = MVAR_CONS AND MVAR_TIPODOC = 31 AND MVAR_IDREF = :ID AND COST_SALC <> 0 AND MVAR_ITEM = :ITEM)) then
                    SELECT COST_SALP / COST_SALC, COST_ULTIMO FROM COSTOS C, MOVIMIENTO_ARTICULO M
                        WHERE COST_IDMOV = MVAR_CONS AND MVAR_TIPODOC = 31 AND MVAR_IDREF = :ID AND COST_SALC <> 0 AND MVAR_ITEM = :ITEM INTO :costounit, :ultcos;
                else
                    EXECUTE PROCEDURE costo_promedio_y_ultimo(:ARTICULO, :FECHA) returning_values (:costounit, :ultcos);
                if (ULTIMO = 'S') then
                    COSTO = COSTO + ultcos * cantdet;
                else
                    COSTO = COSTO + costounit * cantdet;
                END
            CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            INSERT INTO REP_UTILIDAD(ID, TIPO, CODIGO, BASE, IVA, CONSUMO, COSTO) VALUES (:IDREP, 31, :codgrupo, :base, :iva, :consumo, :costo);
            if (CEROS = 'S') then
                INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (2, USER, :codgrupo);
            END /* FOR */
        SELECT SUM(BASE-COSTO) FROM REP_UTILIDAD WHERE id = :IDREP AND TIPO = 31 INTO :TOTAL;
        FOR SELECT GRUP_COD, GRUP_NOM FROM GRUPO
            WHERE GRUP_COD >= :GRPINI AND GRUP_COD <= :grpfin
            INTO :ARTICULO, :DESCRIPCION
            DO
            BEGIN
            BASE = 0;
            IVA = 0;
            CONSUMO = 0;
            COSTO = 0;
            UTILIDAD = 0;
            PORC = 0;
            PART = 0;
            SELECT BASE, IVA, CONSUMO, COSTO FROM rep_utilidad WHERE ID = :IDREP AND TIPO = 31 AND CODIGO = :articulo INTO :BASE, :IVA, :consumo,  :costo;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            EXECUTE PROCEDURE PORCENTAJE (utilidad,  TOTAL, 'S') returning_values (part);
            if ((CEROS = 'S') or (BASE <> 0) or (COSTO <> 0)) then
                SUSPEND;
            END /* FOR */
            BEGIN
            COSTO = 0;
            END
        END
    if (BIN_AND(TIPO, 2) <> 0) then
        BEGIN
        TIPODOC = 32;
        FOR SELECT MAX(a.grup_cod), SUM(RVDE_TOTAL-RVDE_IVAMONTO-RVDE_CONSUMO), SUM(RVDE_IVAMONTO), SUM(RVDE_CONSUMO)
            FROM REMISIONES_VENTA_DETALLE D, REMISIONES_VENTA R, PREFIJOS P, ARTICULO A
            WHERE R.REVT_ID = D.REVT_ID AND P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = 32 AND D.ARTI_COD = A.arti_cod AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            REVT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY a.grup_cod
            INTO :codgrupo, :BASE, :IVA, :CONSUMO
            DO
            BEGIN
            COSTO = 0;
            FOR SELECT D.arti_cod, RVDE_CANT * RVDE_FACTOR, REVT_FECHA, F.REVT_ID, RVDE_ITEM FROM remisiones_venta_detalle D, remisiones_venta F, PREFIJOS P, ARTICULO A
                WHERE A.arti_cod = D.arti_cod AND F.revt_id = D.revt_id AND REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN AND
                REVT_ANULADO = 'N' AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 32 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                and a.grup_cod = :codgrupo INTO :ARTICULO, cantdet, :fecha, :ID, :ITEM
                DO
                BEGIN
                if (EXISTS (SELECT COST_SALP / COST_SALC FROM COSTOS C, MOVIMIENTO_ARTICULO M
                    WHERE COST_IDMOV = MVAR_CONS AND MVAR_TIPODOC = 32 AND MVAR_IDREF = :ID AND COST_SALC <> 0 AND MVAR_ITEM = :ITEM)) then
                    SELECT COST_SALP / COST_SALC, COST_ULTIMO FROM COSTOS C, MOVIMIENTO_ARTICULO M
                        WHERE COST_IDMOV = MVAR_CONS AND MVAR_TIPODOC = 32 AND MVAR_IDREF = :ID AND COST_SALC <> 0 AND MVAR_ITEM = :ITEM INTO :costounit, :ultcos;
                else
                    EXECUTE PROCEDURE costo_promedio_y_ultimo(:ARTICULO, :FECHA) returning_values (:costounit, :ultcos);
                if (ULTIMO = 'S') then
                    COSTO = COSTO + ultcos * cantdet;
                else
                    COSTO = COSTO + costounit * cantdet;
                END
            CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            if (CEROS = 'S') then
                INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (2, USER, :codgrupo);
            INSERT INTO REP_UTILIDAD(ID, TIPO, CODIGO, BASE, IVA, CONSUMO, COSTO) VALUES (:IDREP, 32, :codgrupo, :base, :iva, :consumo, :costo);
            END /* FOR */
        SELECT SUM(BASE-COSTO) FROM REP_UTILIDAD WHERE id = :IDREP AND TIPO = 32 INTO :TOTAL;
        FOR SELECT GRUP_COD, GRUP_NOM FROM GRUPO
            WHERE GRUP_COD >= :GRPINI AND GRUP_COD <= :grpfin
            INTO :ARTICULO, :DESCRIPCION
            DO
            BEGIN
            BASE = 0;
            IVA = 0;
            CONSUMO = 0;
            COSTO = 0;
            UTILIDAD = 0;
            PORC = 0;
            SELECT BASE, IVA, CONSUMO, COSTO FROM rep_utilidad WHERE ID = :IDREP AND TIPO = 32 AND CODIGO = :articulo INTO :BASE, :IVA, :consumo,  :costo;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            EXECUTE PROCEDURE PORCENTAJE (utilidad,  TOTAL, 'S') returning_values (part);
            if ((CEROS = 'S') or (BASE <> 0) or (COSTO <> 0)) then
                SUSPEND;
            END /* FOR */
        END
    if (BIN_AND(TIPO, 4) <> 0) then
        BEGIN
        TIPODOC = 33;
        FOR SELECT MAX(a.grup_cod), SUM((DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO)*DEVT_FACTOR), SUM(DVDE_IVAMONTO*DEVT_FACTOR), SUM(DVDE_CONSUMO)
            FROM devoluciones_ventas_detalle D, DEVOLUCIONES_VENTAS V, PREFIJOS P, ARTICULO A
            WHERE V.DEVT_ID = D.DEVT_ID AND P.PREF_PRE = V.PREF_PRE AND P.TIDO_COD = 33 AND D.ARTI_COD = A.arti_cod AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            DEVT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY a.grup_cod
            INTO :codgrupo, :BASE, :IVA, :CONSUMO
            DO
            BEGIN
            COSTO = 0;
            FOR SELECT D.arti_cod, DVDE_CANT * DVDE_FACTOR, DEVT_FECHA, F.devt_id, D.dvde_item FROM devoluciones_ventas_detalle D, devoluciones_ventas F, PREFIJOS P, ARTICULO A
                WHERE A.arti_cod = D.arti_cod AND F.devt_id = D.devt_id AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND
                DEVT_ANULADO = 'N' AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 33 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                and a.grup_cod = :codgrupo INTO :ARTICULO, cantdet, :fecha, :ID, :ITEM
                DO
                BEGIN
                if (EXISTS (SELECT COST_ENTP / COST_ENTC FROM COSTOS C, MOVIMIENTO_ARTICULO M
                    WHERE COST_IDMOV = MVAR_CONS AND MVAR_TIPODOC = 33 AND MVAR_IDREF = :ID AND COST_ENTC <> 0 AND MVAR_ITEM = :ITEM)) then
                    SELECT COST_ENTP / COST_ENTC, COST_ULTIMO FROM COSTOS C, MOVIMIENTO_ARTICULO M
                        WHERE COST_IDMOV = MVAR_CONS AND MVAR_TIPODOC = 33 AND MVAR_IDREF = :ID AND COST_ENTC <> 0 AND MVAR_ITEM = :ITEM INTO :costounit, :ultcos;
                else
                    EXECUTE PROCEDURE costo_promedio_y_ultimo(:ARTICULO, :FECHA) returning_values (:costounit, :ultcos);
                if (ULTIMO = 'S') then
                    COSTO = COSTO + ultcos * cantdet;
                else
                    COSTO = COSTO + costounit * cantdet;
                END
            CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            else
                BASE = BASE * -1;
            if (IVA IS NULL) then
                IVA = 0;
            else
                IVA = IVA * -1;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            else
                CONSUMO = CONSUMO * -1;
            COSTO = costo * -1;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            if (CEROS = 'S') then
                INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (2, USER, :codgrupo);
            INSERT INTO REP_UTILIDAD(ID, TIPO, CODIGO, BASE, IVA, CONSUMO, COSTO) VALUES (:IDREP, 33, :codgrupo, :base, :iva, :consumo, :costo);
            END /* FOR */
        SELECT SUM(BASE-COSTO) FROM REP_UTILIDAD WHERE id = :IDREP AND TIPO = 33 INTO :TOTAL;
        FOR SELECT GRUP_COD, GRUP_NOM FROM GRUPO
            WHERE GRUP_COD >= :GRPINI AND GRUP_COD <= :grpfin
            INTO :ARTICULO, :DESCRIPCION
            DO
            BEGIN
            BASE = 0;
            IVA = 0;
            CONSUMO = 0;
            COSTO = 0;
            UTILIDAD = 0;
            PORC = 0;
            SELECT BASE, IVA, CONSUMO, COSTO FROM rep_utilidad WHERE ID = :IDREP AND TIPO = 33 AND CODIGO = :articulo INTO :BASE, :IVA, :consumo,  :costo;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            EXECUTE PROCEDURE PORCENTAJE (utilidad,  TOTAL, 'S') returning_values (part);
            if ((CEROS = 'S') or (BASE <> 0) or (COSTO <> 0)) then
                SUSPEND;
            END /* FOR */
        END
    if (BIN_AND(TIPO, 8) <> 0) then
        BEGIN
        TIPODOC = 34;
        /* BORRA LA TABLA AUXILIAR */
        DELETE FROM reportes_aux WHERE REPA_ID = 2 AND REPA_USER = USER;

        FOR SELECT MAX(a.grup_cod), SUM((PEDE_TOTAL-PEDE_IVAMONTO-PEDE_CONSUMO)*PEDI_FACTOR), SUM(PEDE_IVAMONTO*PEDI_FACTOR), SUM(PEDE_CONSUMO)
            FROM PEDIDOS_DETALLE D, PEDIDOS P, PREFIJOS R, ARTICULO A
            WHERE P.PEDI_ID = D.PEDI_ID AND P.PREF_PRE = R.PREF_PRE AND R.TIDO_COD = 34 AND D.ARTI_COD = A.arti_cod AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            PEDI_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY a.grup_cod
            INTO :codgrupo, :BASE, :IVA, :CONSUMO
            DO
            BEGIN
            COSTO = 0;
            FOR SELECT MAX(D.arti_cod), SUM(PEDE_CANT * PEDE_FACTOR), MAX(pedi_FECHA) FROM pedidos_detalle D, pedidos F, PREFIJOS P, ARTICULO A
                WHERE A.arti_cod = D.arti_cod AND F.pedi_id = D.pedi_id AND PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND
                PEDI_ANULADO = 'N' AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 34 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                and a.grup_cod = :codgrupo GROUP BY D.ARTI_COD, PEDI_FECHA INTO :ARTICULO, cantdet, :fecha
                DO
                BEGIN
                EXECUTE PROCEDURE costo_promedio_y_ultimo(:ARTICULO, :FECHA) returning_values (:costounit, :ultcos);
                if (ULTIMO = 'S') then
                    COSTO = COSTO + ultcos * cantdet;
                else
                    COSTO = COSTO + costounit * cantdet;
                END
            CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            if (CEROS = 'S') then
                INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (2, USER, :codgrupo);
            INSERT INTO REP_UTILIDAD(ID, TIPO, CODIGO, BASE, IVA, CONSUMO, COSTO) VALUES (:IDREP, 34, :codgrupo, :base, :iva, :consumo, :costo);
            END /* FOR */
        SELECT SUM(BASE-COSTO) FROM REP_UTILIDAD WHERE id = :IDREP AND TIPO = 34 INTO :TOTAL;
        FOR SELECT GRUP_COD, GRUP_NOM FROM GRUPO
            WHERE GRUP_COD >= :GRPINI AND GRUP_COD <= :grpfin
            INTO :ARTICULO, :DESCRIPCION
            DO
            BEGIN
            BASE = 0;
            IVA = 0;
            CONSUMO = 0;
            COSTO = 0;
            UTILIDAD = 0;
            PORC = 0;
            SELECT BASE, IVA, CONSUMO, COSTO FROM rep_utilidad WHERE ID = :IDREP AND TIPO = 34 AND CODIGO = :articulo INTO :BASE, :IVA, :consumo,  :costo;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            EXECUTE PROCEDURE PORCENTAJE (utilidad,  TOTAL, 'S') returning_values (part);
            if ((CEROS = 'S') or (BASE <> 0) or (COSTO <> 0)) then
                SUSPEND;
            END /* FOR */
        END
    if (BIN_AND(TIPO, 16) <> 0) then
        BEGIN
        TIPODOC = 35;
        FOR SELECT MAX(a.grup_cod), SUM((CTDE_TOTAL-CTDE_IVAMONTO-CTDE_CONSUMO)*COTI_FACTOR), SUM(CTDE_IVAMONTO), SUM(CTDE_CONSUMO)
            FROM COTIZACIONES_DETALLE D, COTIZACIONES C, PREFIJOS P, ARTICULO A
            WHERE C.COTI_ID = D.COTI_ID AND P.PREF_PRE = C.PREF_PRE AND P.TIDO_COD = 35 AND D.ARTI_COD = A.arti_cod AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND COTI_FECHA >= :FECINI AND COTI_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            COTI_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY A.grup_cod
            INTO :codgrupo, :BASE, :IVA, :CONSUMO
            DO
            BEGIN
            COSTO = 0;
            FOR SELECT MAX(D.arti_cod), SUM(CTDE_CANT * CTDE_FACTOR), MAX(COTI_FECHA) FROM cotizaciones_detalle D, cotizaciones F, PREFIJOS P, ARTICULO A
                WHERE A.arti_cod = D.arti_cod AND F.coti_id = D.coti_id AND COTI_FECHA >= :FECINI AND COTI_FECHA <= :FECFIN AND
                COTI_ANULADO = 'N' AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 35 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                and a.grup_cod = :codgrupo GROUP BY D.ARTI_COD, COTI_FECHA INTO :ARTICULO, cantdet, :fecha
                DO
                BEGIN
                EXECUTE PROCEDURE costo_promedio_y_ultimo(:ARTICULO, :FECHA) returning_values (:costounit, :ultcos);
                if (ULTIMO = 'S') then
                    COSTO = COSTO + ultcos * cantdet;
                else
                    COSTO = COSTO + costounit * cantdet;
                END
            CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            if (CEROS = 'S') then
                INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (2, USER, :codgrupo);
            INSERT INTO REP_UTILIDAD(ID, TIPO, CODIGO, BASE, IVA, CONSUMO, COSTO) VALUES (:IDREP, 35, :codgrupo, :base, :iva, :consumo, :costo);
            END /* FOR */
        SELECT SUM(BASE-COSTO) FROM REP_UTILIDAD WHERE id = :IDREP AND TIPO = 35 INTO :TOTAL;
        FOR SELECT GRUP_COD, GRUP_NOM FROM GRUPO
            WHERE GRUP_COD >= :GRPINI AND GRUP_COD <= :grpfin
            INTO :ARTICULO, :DESCRIPCION
            DO
            BEGIN
            BASE = 0;
            IVA = 0;
            CONSUMO = 0;
            COSTO = 0;
            UTILIDAD = 0;
            PORC = 0;
            SELECT BASE, IVA, CONSUMO, COSTO FROM rep_utilidad WHERE ID = :IDREP AND TIPO = 35 AND CODIGO = :articulo INTO :BASE, :IVA, :consumo,  :costo;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            EXECUTE PROCEDURE PORCENTAJE (utilidad,  TOTAL, 'S') returning_values (part);
            if ((CEROS = 'S') or (BASE <> 0) or (COSTO <> 0)) then
                SUSPEND;
            END /* FOR */
        END
    END
  ELSE
    BEGIN
    if (BIN_AND(TIPO, 1) <> 0) then
        BEGIN
        TIPODOC = 31;
        FOR SELECT F.PREF_PRE, FACT_NUMERO, FACT_FECHA, D.ARTI_COD, FADE_CANT * FADE_FACTOR, (FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO)*FACT_FACTOR, FADE_IVAMONTO*FACT_FACTOR, FADE_CONSUMO,
            ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD, F.FACT_ID, FADE_ITEM
            FROM FACTURAS F, FACTURAS_DETALLE D, PREFIJOS P, ARTICULO A
            WHERE F.FACT_ID = D.FACT_ID AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND D.ARTI_COD = A.arti_cod AND
                A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
                A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND FACT_FECHA >= :FECINI AND
                (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
                FACT_FECHA <= :FECFIN AND FACT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) and substring(a.arti_cod from 1 FOR 2) <> '.t'
            ORDER BY D.ARTI_COD, FACT_FECHA, F.FACT_ID, FADE_ITEM
            INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,
                :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :ID, :ITEM
            DO
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (EXISTS (SELECT COST_SALP / COST_SALC FROM COSTOS C, MOVIMIENTO_ARTICULO M
                WHERE COST_IDMOV = MVAR_CONS AND MVAR_TIPODOC = 31 AND MVAR_IDREF = :ID AND COST_SALC <> 0 AND MVAR_ITEM = :ITEM)) then
                SELECT COST_SALP / COST_SALC, COST_ULTIMO FROM COSTOS C, MOVIMIENTO_ARTICULO M
                    WHERE COST_IDMOV = MVAR_CONS AND MVAR_TIPODOC = 31 AND MVAR_IDREF = :ID AND COST_SALC <> 0 AND MVAR_ITEM = :ITEM INTO :costounit, :ultcos;
            else
                EXECUTE PROCEDURE costo_promedio_y_ultimo(:ARTICULO, :FECHA) returning_values (:costounit, :ultcos);
            if (ULTIMO = 'S') then
                COSTO = ultcos * cantidad;
            else
                COSTO = costounit * cantidad;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            SUSPEND;
            END
        END
    if (BIN_AND(TIPO, 2) <> 0) then
        BEGIN
        TIPODOC = 32;
        FOR SELECT R.PREF_PRE, REVT_NUMERO, REVT_FECHA, D.ARTI_COD, RVDE_CANT * RVDE_FACTOR, RVDE_TOTAL-RVDE_IVAMONTO-RVDE_CONSUMO, RVDE_IVAMONTO, RVDE_CONSUMO,
            ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD, R.REVT_ID, RVDE_ITEM
            FROM REMISIONES_VENTA R, REMISIONES_VENTA_DETALLE D, PREFIJOS P, ARTICULO A
            WHERE R.REVT_ID = D.REVT_ID AND P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = 32 AND D.ARTI_COD = A.arti_cod AND
                A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
                A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN AND
                (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
                REVT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            ORDER BY D.ARTI_COD, REVT_FECHA, R.REVT_ID, RVDE_ITEM
            INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,
                :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :ID, :ITEM
            DO
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (EXISTS (SELECT COST_SALP / COST_SALC FROM COSTOS C, MOVIMIENTO_ARTICULO M
                WHERE COST_IDMOV = MVAR_CONS AND MVAR_TIPODOC = 32 AND MVAR_IDREF = :ID AND COST_SALC <> 0 AND MVAR_ITEM = :ITEM)) then
                SELECT COST_SALP / COST_SALC, COST_ULTIMO FROM COSTOS C, MOVIMIENTO_ARTICULO M
                    WHERE COST_IDMOV = MVAR_CONS AND MVAR_TIPODOC = 32 AND MVAR_IDREF = :ID AND COST_SALC <> 0 AND MVAR_ITEM = :ITEM INTO :costounit, :ultcos;
            else
                EXECUTE PROCEDURE costo_promedio_y_ultimo(:ARTICULO, :FECHA) returning_values (:costounit, :ultcos);
            if (ULTIMO = 'S') then
                COSTO = ultcos * cantidad;
            else
                COSTO = costounit * cantidad;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            SUSPEND;
            END
        END
    if (BIN_AND(TIPO, 4) <> 0) then
        BEGIN
        TIPODOC = 33;
        FOR SELECT V.PREF_PRE, DEVT_NUMERO, DEVT_FECHA, D.ARTI_COD, DVDE_CANT * DVDE_FACTOR, (DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO)*DEVT_FACTOR, DVDE_IVAMONTO*DEVT_FACTOR, DVDE_CONSUMO,
            ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD, V.DEVT_ID, DVDE_ITEM
            FROM DEVOLUCIONES_VENTAS V, DEVOLUCIONES_VENTAS_DETALLE D, PREFIJOS P, ARTICULO A
            WHERE V.DEVT_ID = D.DEVT_ID AND P.PREF_PRE = V.PREF_PRE AND P.TIDO_COD = 33 AND D.ARTI_COD = A.arti_cod AND
                A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
                A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND
                (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
                DEVT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            ORDER BY D.ARTI_COD, DEVT_FECHA, V.DEVT_ID, DVDE_ITEM
            INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,
                :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :ID, :ITEM
            DO
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            CANTIDAD = CANTIDAD * -1;
            if (EXISTS (SELECT COST_ENTP / COST_ENTC FROM COSTOS C, MOVIMIENTO_ARTICULO M
                WHERE COST_IDMOV = MVAR_CONS AND MVAR_TIPODOC = 33 AND MVAR_IDREF = :ID AND COST_ENTC <> 0 AND MVAR_ITEM = :ITEM)) then
                SELECT COST_ENTP / COST_ENTC, COST_ULTIMO FROM COSTOS C, MOVIMIENTO_ARTICULO M
                    WHERE COST_IDMOV = MVAR_CONS AND MVAR_TIPODOC = 33 AND MVAR_IDREF = :ID AND COST_ENTC <> 0 AND MVAR_ITEM = :ITEM INTO :costounit, :ultcos;
            else
                EXECUTE PROCEDURE costo_promedio_y_ultimo(:ARTICULO, :FECHA) returning_values (:costounit, :ultcos);
            if (ULTIMO = 'S') then
                COSTO = ultcos * cantidad;
            else
                COSTO = costounit * cantidad;
            BASE = BASE * -1;
            IVA = IVA * -1;
            CONSUMO = CONSUMO * -1;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            SUSPEND;
            END
        END
    if (BIN_AND(TIPO, 8) <> 0) then
        BEGIN
        TIPODOC = 34;
        FOR SELECT P.PREF_PRE, PEDI_NUMERO, PEDI_FECHA, D.ARTI_COD, PEDE_CANT * PEDE_FACTOR, (PEDE_TOTAL-PEDE_IVAMONTO-PEDE_CONSUMO)*PEDI_FACTOR, PEDE_IVAMONTO*PEDI_FACTOR, PEDE_CONSUMO,
            ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD 
            FROM PEDIDOS P, PEDIDOS_DETALLE D, PREFIJOS R, ARTICULO A
            WHERE P.PEDI_ID = D.PEDI_ID AND P.PREF_PRE = R.PREF_PRE AND R.TIDO_COD = 34 AND D.ARTI_COD = A.arti_cod AND
                A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
                A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND
                (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
                PEDI_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            ORDER BY D.ARTI_COD, PEDI_FECHA, P.PEDI_ID, PEDE_ITEM
            INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,
                :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
            DO
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            EXECUTE PROCEDURE costo_promedio_y_ultimo(:ARTICULO, :FECHA) returning_values (:costounit, :ultcos);
            if (ULTIMO = 'S') then
                COSTO = ultcos * cantidad;
            else
                COSTO = costounit * cantidad;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            SUSPEND;
            END
        END
    if (BIN_AND(TIPO, 16) <> 0) then
        BEGIN
        TIPODOC = 35;
        FOR SELECT C.PREF_PRE, COTI_NUMERO, COTI_FECHA, D.ARTI_COD, CTDE_CANT * CTDE_FACTOR, (CTDE_TOTAL-CTDE_IVAMONTO-CTDE_CONSUMO)*COTI_FACTOR, CTDE_IVAMONTO*COTI_FACTOR, CTDE_CONSUMO,
            ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD 
            FROM COTIZACIONES C, COTIZACIONES_DETALLE D, PREFIJOS P, ARTICULO A
            WHERE C.COTI_ID = D.COTI_ID AND P.PREF_PRE = C.PREF_PRE AND P.TIDO_COD = 35 AND D.ARTI_COD = A.arti_cod AND
                A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
                A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND COTI_FECHA >= :FECINI AND COTI_FECHA <= :FECFIN AND
                (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
                COTI_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            ORDER BY D.ARTI_COD, COTI_FECHA, C.COTI_ID, CTDE_ITEM
            INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,
                :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
            DO
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (EXISTS (SELECT COST_ENTP / COST_ENTC FROM COSTOS C, MOVIMIENTO_ARTICULO M
                WHERE COST_IDMOV = MVAR_CONS AND MVAR_TIPODOC = 33 AND MVAR_IDREF = :ID AND COST_ENTC <> 0)) then
                SELECT COST_ENTP / COST_ENTC FROM COSTOS C, MOVIMIENTO_ARTICULO M
                    WHERE COST_IDMOV = MVAR_CONS AND MVAR_TIPODOC = 33 AND MVAR_IDREF = :ID AND COST_ENTC <> 0 INTO :COSTO;
            else
                EXECUTE PROCEDURE costo_promedio_y_ultimo(:ARTICULO, :FECHA) returning_values (:costounit, :ultcos);
            if (ULTIMO = 'S') then
                COSTO = ultcos * cantidad;
            else
                COSTO = costounit * cantidad;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            SUSPEND;
            END
        END
    END
END
^

SET TERM ; ^

SET TERM ^ ;

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

SET TERM ; ^

SET TERM ^ ;

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

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE CONTABIL_DEVOLCLI(
    IDDOC INTEGER,
    IDINTER INTEGER)
RETURNS (
    ERROR INTEGER,
    VER CHAR(1),
    IDC INTEGER)
AS
declare variable PREF VARCHAR(4);
declare variable NUM VARCHAR(6);
declare variable NUMERO VARCHAR(10);
declare variable FECAUX DATE;
declare variable FECHA CHAR(8);
declare variable CONC CHAR(120);
declare variable NUMFAC VARCHAR(10);
declare variable VRDTO NUMERIC(18, 2);
declare variable VRADIC NUMERIC(18, 2);
declare variable VRSUBT NUMERIC(18, 2);
declare variable VRIVA NUMERIC(18, 2);
declare variable PRTFTE NUMERIC(9, 2);
declare variable VRRTFTE NUMERIC(18, 2);
declare variable VRRTIVA NUMERIC(18, 2);
declare variable PRTICA NUMERIC(9, 2);
declare variable VRRTICA NUMERIC(18, 2);
declare variable VRTOTAL NUMERIC(18, 2);
declare variable VREXTRA NUMERIC(18, 2);
declare variable TIPOCOMP VARCHAR(3);
declare variable PREFCONT VARCHAR(4);
declare variable VENTAS CHAR(1);
declare variable CTAVENTAS VARCHAR(20);
declare variable IVA CHAR(1);
declare variable CTAIVA VARCHAR(20);
declare variable CONSUMO CHAR(1);
declare variable CTACONSUMO VARCHAR(20);
declare variable CARTERA CHAR(1);
declare variable CTACARTERA VARCHAR(20);
declare variable RTFTE CHAR(1);
declare variable CTARTFTE VARCHAR(20);
declare variable RTIVA CHAR(1);
declare variable CTARTIVA VARCHAR(20);
declare variable RTICA CHAR(1);
declare variable CTARTICA VARCHAR(20);
declare variable INVEN CHAR(1);
declare variable CTAINVEN VARCHAR(20);
declare variable COSTOS CHAR(1);
declare variable CTACOSTOS VARCHAR(20);
declare variable CTADTO VARCHAR(20);
declare variable CTAADIC VARCHAR(20);
declare variable CTAEXTRA VARCHAR(20);
declare variable EXISTE CHAR(1);
declare variable CUENTA VARCHAR(20);
declare variable MONTO NUMERIC(18,2);
declare variable TIPOCUEN CHAR(1);
declare variable NIT VARCHAR(20);
declare variable PROY VARCHAR(4);
declare variable CENTRO VARCHAR(4);
declare variable PROYI VARCHAR(4);
declare variable CENTI VARCHAR(4);
declare variable PORC NUMERIC(5,2);
declare variable DEBITO NUMERIC(18,2);
declare variable CREDITO NUMERIC(18,2);
declare variable NROI INTEGER;
declare variable ART VARCHAR(15);
declare variable IMPINC CHAR(1);
declare variable IMPTOS NUMERIC(18, 2);
declare variable SUMA NUMERIC(18,2);
declare variable PORCIVA NUMERIC(9,2);
declare variable TCTACLIEN VARCHAR(20);
declare variable TCTAVENTA VARCHAR(20);
declare variable TCTARTFTE VARCHAR(20);
declare variable TCTARTIVA VARCHAR(20);
declare variable TCTARTICA VARCHAR(20);
declare variable CTADIC VARCHAR(20);
declare variable BASEADIC VARCHAR(20);
declare variable PORCADIC NUMERIC(5,2);
declare variable VALORADIC NUMERIC(18,2);
declare variable DBADIC CHAR(1);
declare variable PTOVTA INTEGER;
declare variable ANULADO CHAR(1);
declare variable CENT CHAR(1);
DECLARE VARIABLE MERCANCIA NUMERIC(18,2);
declare variable FACTOR DOUBLE PRECISION;
declare variable DIG INTEGER;
DECLARE VARIABLE FOMENTO VARCHAR(2);
DECLARE VARIABLE VRCONSUMO NUMERIC(18,2);
declare variable AUTORET VARCHAR(10);
declare variable FAUTORET DATE;
declare variable IDREM INTEGER;
declare variable DTOXIT CHAR(2);
declare variable ERRORC INTEGER;
BEGIN
EXECUTE PROCEDURE LEE_CONFIGURACION('COMPRAS', 'FACTURAS', 'USAR IMPOCONSUMO COMO PORCENTAJE DE FOMENTO') returning_values (FOMENTO);
EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'FECHA AUTORETENEDOR NO DESCONTAR RETENCIONES DEL SALDO PERO SI CONTABILIZARLAS') returning_values (AUTORET);
if (AUTORET <> '') then
    FAUTORET = CAST(AUTORET AS DATE);
else
    FAUTORET = '9999/12/31';
  /* BUSQUE LA INTERFACE */
  EXISTE = 'N';
  SELECT 'S', TICO_COD, PRCO_PRE, INVE_VENTAS, INVE_IVA, INVE_CONSUMO, INVE_CARTERA, INVE_RTFTE, INVE_RTIVA, INVE_RTICA, INVE_COSTO, INVE_INVEN, INVE_CTAVENTAS, INVE_CTAIVA, INVE_CTACONSUMO, INVE_CTADTO, INVE_CTAADIC, INVE_CTAEXTRA, INVE_CTACARTERA, INVE_CTARTFTE, INVE_CTARTIVA, INVE_CTARTICA, INVE_CTAINVEN, INVE_CTACOSTOS, INVE_CONFIRMAR, INVE_CENTRO
    FROM INTERFAZ_VENTAS
    WHERE INVE_ID = :IDINTER
    INTO :EXISTE, :TIPOCOMP, :PREFCONT, :VENTAS, :IVA, :CONSUMO, :CARTERA, :RTFTE, :RTIVA, :RTICA, :COSTOS, :INVEN, :CTAVENTAS, :CTAIVA, :CTACONSUMO, :CTADTO, :CTAADIC, :CTAEXTRA, :CTACARTERA, :CTARTFTE, :CTARTIVA, :CTARTICA, :CTAINVEN, :CTACOSTOS, :VER, :CENT;
  if (EXISTE = 'S') then
   BEGIN
    /* BORRE CUALQUEIR CONTABILIZACION PREVIA */
    DELETE FROM CONTABILIZACION WHERE CNTB_TIPOREF = 33 AND CNTB_IDREF = :IDDOC;
    /* TRAIGA EL ENCABEZADO DE LA DEVOLUCION */
   SELECT PREF_PRE, DEVT_NUMERO, DEVT_FECHA, F.TERC_NIT, DEVT_IVAINC, PTVT_ID, DEVT_FACTURA, DEVT_DTOMONTO, DEVT_ADICIONAL, DEVT_IVAMONTO, DEVT_EXTRA, DEVT_TOTAL, DEVT_RTFTEPORC, DEVT_RTFTEMONTO, DEVT_RTIVAPORC, DEVT_RTIVAMONTO, DEVT_RTICAPORC, DEVT_RTICAMONTO, TERC_CTARTFTE, TERC_CTARTIVA, TERC_CTARTICA, TERC_CTAVENTA, TERC_CTACLIENTE, DEVT_ANULADO, DEVT_REMID
        FROM DEVOLUCIONES_VENTAS F, TERCEROS T
        WHERE DEVT_ID = :IDDOC AND F.TERC_NIT = T.TERC_NIT
        INTO :PREF, :NUM, :FECAUX, :NIT, :IMPINC, :PTOVTA, :NUMFAC, :VRDTO, :VRADIC, :VRIVA, :VREXTRA, :VRTOTAL, :PRTFTE, :VRRTFTE, :PORC, :VRRTIVA, :PRTICA, :VRRTICA, :TCTARTFTE, TCTARTIVA, TCTARTICA, TCTAVENTA, TCTACLIEN, ANULADO, :IDREM;
   if (idrem is null) Then
    IDREM = 0;
   if ((ANULADO = 'N') AND (IDREM = 0)) then
    BEGIN
    NUMERO = PREF || NUM;
    SELECT SUM(DVDE_CONSUMO) FROM devoluciones_ventas_detalle WHERE DEVT_ID = :iddoc AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL)) INTO :MERCANCIA;
    VRSUBT = VRTOTAL - VREXTRA - VRIVA - MERCANCIA; /* BASE DE RETEFTE Y RETEICA */
    EXECUTE PROCEDURE lee_configuracion ('FACTURACION', 'DEVOLUCIONES', 'DESCUENTO PIE DEVOLUCION IGUAL A SUMA DE DESCUENTOS POR ITEM') returning_values (:DTOXIT);
    if (DTOXIT = 'SI') then
        VRDTO = 0;
    MERCANCIA = VRSUBT - VRADIC + VRDTO;
    IF (CENT = 'B') THEN
        SELECT B.BODE_CENTRO, B.BODE_PROY FROM BODEGA B, DEVOLUCIONES_VENTAS F
            WHERE B.BODE_COD = F.BODE_COD AND F.DEVT_ID = :IDDOC INTO :CENTRO, :PROY;
    IF (CENT = 'V') THEN
        SELECT V.CENT_COD, V.PROY_COD FROM VENDEDORES V, DEVOLUCIONES_VENTAS F
            WHERE V.VEND_COD = F.VEND_COD AND F.DEVT_ID = :IDDOC INTO :CENTRO, :PROY;
    IF (CENT = 'P') THEN
        SELECT P.PREF_CENTRO,P.PREF_PROY  FROM PREFIJOS P, DEVOLUCIONES_VENTAS F
            WHERE P.PREF_PRE = F.PREF_PRE AND F.DEVT_ID = :IDDOC AND P.TIDO_COD = 33 INTO :CENTRO, :PROY;
    EXECUTE PROCEDURE FECHA_A_CONTA(:FECAUX) returning_values (:FECHA);
    /* REGISTRE EL ENCABEZADO CONTABLE */
    IDC = GEN_ID(ID_CONTABILIZA, 1);
    CONC = 'DEVOLUCION VENTAS No. ' || NUMERO || ' EN FACTURA ' || NUMFAC;
    CONC = SUBSTR(CONC, 1, 60);
    INSERT INTO CONTABILIZACION (CNTB_ID, CNTB_TIPOCOMP, CNTB_PREFCNT, CNTB_NUMERO, CNTB_FECHA, CNTB_CONCEPTO, CNTB_REF, CNTB_TIPOREF, CNTB_IDREF, CNTB_PREFREF, CNTB_NUMREF, CNTB_PROCESADO)
        VALUES (:IDC, :TIPOCOMP, :PREFCONT, :NUM, :FECHA, :CONC, '', 33, :IDDOC, :PREF, :NUM, 'N');
    NROI = 0;
    SUMA = 0;
    ERROR = 0;
    /* SI NO HAY CUENTA DE DESCUENTO NI ADICIONAL CALCULE UN FACTOR PARA LAS VENTAS Y EL IVA */
    if (MERCANCIA <> 0) then
        FACTOR = CAST(VRSUBT AS DOUBLE PRECISION) / CAST(MERCANCIA AS DOUBLE PRECISION);
    ELSE
        FACTOR = 1;
    /* TRAIGA EL NUMERO DE DIGITOS PARA EL REDONDEO */
    SELECT CAST(CONF_VALOR AS INTEGER) FROM CONFIGURACION WHERE CONF_MODULO = 'FACTURACION' AND
        CONF_CATEGORIA = 'GENERAL' AND CONF_PROPIEDAD = 'REDONDEO AL MULTIPLO DE DIEZ EN TOTALES' INTO :DIG;
    /* CUENTAS DE VENTAS */
    if (VENTAS = 'A') then
        BEGIN
        FOR SELECT MAX(COAR_CTADEV), SUM(DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO), SUM(DVDE_IVAMONTO), SUM(DVDE_CONSUMO), MAX(B.bode_proy), MAX(B.bode_centro)
            FROM ARTICULO A, CONTABIL_ARTICULO C, DEVOLUCIONES_VENTAS_DETALLE F, BODEGA B
            WHERE F.DEVT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND B.bode_cod = F.bode_cod AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
            GROUP BY COAR_CTADEV
            INTO :CTAVENTAS, :MONTO, :IMPTOS, :VRCONSUMO, :proyi, :centi
            DO
            BEGIN
            if (FOMENTO = 'SI') then
                MONTO = MONTO + VRCONSUMO;
            if ((CTADTO IS NULL) OR (CTADTO = '')) then
                MONTO = MONTO * FACTOR;
            execute procedure redondee(MONTO, DIG) returning_values (MONTO);
            if (MONTO <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTAVENTAS, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT F.ARTI_COD, (DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO), (DVDE_IVAMONTO+DVDE_CONSUMO)
                        FROM ARTICULO A, CONTABIL_ARTICULO C, DEVOLUCIONES_VENTAS_DETALLE F
                        WHERE F.DEVT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTAINV = :CUENTA AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
                        INTO :ART, :MONTO, :IMPTOS
                    DO
                        BEGIN
                        if (IMPINC = 'S') then
                            MONTO = MONTO - IMPTOS;
                        if ((CTADTO IS NULL) OR (CTADTO = '')) then
                            MONTO = MONTO * FACTOR;
                        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        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, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                    NROI = NROI + 1;
                    SUMA = SUMA + MONTO;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    IF (CENT = 'B') THEN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROYI, :CENTI, NULL, NULL, NULL, NULL, 0, 0);
                    ELSE
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA + MONTO;
                    END
                END /* MONTO <> 0 */
            END /* FOR */
        END /* VENTAS X ARTICULO */
     IF ((VENTAS = 'C') OR (VENTAS = 'K')) THEN
        BEGIN
        IF (VENTAS = 'C') THEN
            CTAVENTAS = TCTAVENTA;
        SELECT SUM(DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO), SUM(DVDE_IVAMONTO), SUM(DVDE_CONSUMO)
            FROM DEVOLUCIONES_VENTAS_DETALLE F
            WHERE F.DEVT_ID = :IDDOC  AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
            INTO :MONTO, :IMPTOS, :VRCONSUMO;
        if (FOMENTO = 'SI') then
            MONTO = MONTO + VRCONSUMO;
        if ((CTADTO IS NULL) OR (CTADTO = '')) then
            MONTO = MONTO * FACTOR;
        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
        if (MONTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTAVENTAS, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT F.ARTI_COD, (DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO), (DVDE_IVAMONTO+DVDE_CONSUMO)
                    FROM ARTICULO A, DEVOLUCIONES_VENTAS_DETALLE F
                    WHERE F.DEVT_ID = :IDDOC AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
                    INTO :ART, :MONTO, :IMPTOS
                    DO
                    BEGIN
                    if (IMPINC = 'S') then
                        MONTO = MONTO - IMPTOS;
                    if ((CTADTO IS NULL) OR (CTADTO = '')) then
                        MONTO = MONTO * FACTOR;
                    execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                    NROI = NROI + 1;
                    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, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                NROI = NROI + 1;
                SUMA = SUMA + MONTO;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA + MONTO;
                END
            END /* MONTO <> 0 */
        END /* VENTAS DE CLIENTE O CONSTANTE */
    /* EL IVA EN VENTAS */
    if (IVA = 'A') then
        BEGIN
        FOR SELECT MAX(COAR_CTAIVAV), SUM(DVDE_IVAMONTO), SUM(DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO), SUM(DVDE_CONSUMO)
            FROM ARTICULO A, CONTABIL_ARTICULO C, DEVOLUCIONES_VENTAS_DETALLE F
            WHERE F.DEVT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
            GROUP BY COAR_CTAIVAV
            INTO :CTAIVA, :IMPTOS, :MONTO, :VALORADIC
        DO
            BEGIN
            if (FOMENTO = 'SI') then
                MONTO = MONTO + VALORADIC;
            MONTO = MONTO * -1;
            MONTO = MONTO * FACTOR;
            IMPTOS = IMPTOS * FACTOR;
            execute procedure redondee(MONTO, DIG) returning_values (MONTO);
            execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
            if (IMPTOS <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTAIVA, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT F.ARTI_COD, DVDE_IVAMONTO, (DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO), TAIV_PORC, DVDE_CONSUMO
                        FROM ARTICULO A, CONTABIL_ARTICULO C, DEVOLUCIONES_VENTAS_DETALLE F, TARIFA_IVA T
                        WHERE F.DEVT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND A.TAIV_COD = T.TAIV_COD AND COAR_CTAIVAV = :CUENTA AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
                        INTO :ART, :IMPTOS, :MONTO, :PORCIVA, :VALORADIC
                    DO
                        BEGIN
                        if (IMPINC = 'S') then
                            MONTO = MONTO - IMPTOS - VALORADIC;
                        MONTO = MONTO * -1;
                        MONTO = MONTO * FACTOR;
                        IMPTOS = IMPTOS * FACTOR;
                        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                        execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                        if (IMPTOS <> 0) then
                            BEGIN
                            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :IMPTOS, 0, :MONTO, :PORCIVA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                            NROI = NROI + 1;
                            SUMA = SUMA + IMPTOS;
                            END
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                    NROI = NROI + 1;
                    SUMA = SUMA + IMPTOS;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA + IMPTOS;
                    END
                END   /* IMPTOS <> 0 */
            END /* FOR */
        END /* IVA X ARTICULO */
    if (IVA = 'K') then /* IVA EN CTA CONSTANTE */
        BEGIN
        SELECT SUM(DVDE_IVAMONTO), SUM(DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO), SUM(DVDE_CONSUMO)
            FROM DEVOLUCIONES_VENTAS_DETALLE F
            WHERE F.DEVT_ID = :IDDOC  AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
            INTO :IMPTOS, :MONTO, :VALORADIC;
        if (FOMENTO = 'SI') then
            MONTO = MONTO + VALORADIC;
        MONTO = MONTO * -1;
        MONTO = MONTO * FACTOR;
        IMPTOS = IMPTOS * FACTOR;
        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
        execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
        if (IMPTOS <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTAIVA, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT F.ARTI_COD, (DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO), DVDE_IVAMONTO, TAIV_PORC, DVDE_CONSUMO
                    FROM ARTICULO A, DEVOLUCIONES_VENTAS_DETALLE F, TARIFA_IVA T
                    WHERE F.DEVT_ID = :IDDOC AND A.TAIV_COD = T.TAIV_COD AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
                    INTO :ART, :MONTO, :IMPTOS, :PORCIVA, :VALORADIC
                    DO
                    BEGIN
                    if (IMPINC = 'S') then
                        MONTO = MONTO - IMPTOS - VALORADIC;
                    MONTO = MONTO * -1;
                    MONTO = MONTO * FACTOR;
                    IMPTOS = IMPTOS * FACTOR;
                    execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                    execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                    if (IMPTOS <> 0) then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', :IMPTOS, 0, :MONTO, :PORCIVA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        SUMA = SUMA + IMPTOS;
                        END
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                NROI = NROI + 1;
                SUMA = SUMA + IMPTOS;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA + IMPTOS;
                END
            END /* IMPTOS <> 0 */
        END /* IVA EN CTA CONSTANTE */
    /* EL IMPOCONSUMO */
    if ((CONSUMO = 'A') AND (FOMENTO <> 'SI')) then
        BEGIN
        FOR SELECT MAX(COAR_CTACONS), SUM(DVDE_CONSUMO)
            FROM ARTICULO A, CONTABIL_ARTICULO C, DEVOLUCIONES_VENTAS_DETALLE F
            WHERE F.DEVT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
            GROUP BY COAR_CTACONS
            INTO :CTACONSUMO, :IMPTOS
        DO
            BEGIN
            if (IMPTOS <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTACONSUMO, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, REGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT F.ARTI_COD, DVDE_CONSUMO
                        FROM ARTICULO A, CONTABIL_ARTICULO C, DEVOLUCIONES_VENTAS_DETALLE F
                        WHERE F.DEVT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTACONS = :CUENTA AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
                        INTO :ART, :IMPTOS
                    DO
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 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, :NROI, :CUENTA, :CONC, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                    NROI = NROI + 1;
                    SUMA = SUMA + IMPTOS;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA + IMPTOS;
                    END
                END /* IMPTOS <> 0 */
            END /* FOR */
        END /* CONSUMO X ARTICULO */
    if ((CONSUMO = 'K') AND (FOMENTO <> 'SI')) then
        BEGIN
        SELECT SUM(DVDE_CONSUMO)
            FROM DEVOLUCIONES_VENTAS_DETALLE F
            WHERE F.DEVT_ID = :IDDOC AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
            INTO :IMPTOS;
        if (IMPTOS <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTACONSUMO, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT F.ARTI_COD, DVDE_CONSUMO
                    FROM ARTICULO A, DEVOLUCIONES_VENTAS_DETALLE F
                    WHERE F.DEVT_ID = :IDDOC  AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
                    INTO :ART, :IMPTOS
                    DO
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTACONSUMO, :CONC, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                    NROI = NROI + 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, :NROI, :CTACONSUMO, :CONC, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA + IMPTOS;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTACONSUMO, :CONC, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA + IMPTOS;
                END
            END /* IMPTOS <> 0 */
        END /* CONSUMO EN CTA CONSTANTE */
    /* DESCUENTO */
    if ((CTADTO IS NOT NULL) AND
        (CTADTO <> '') AND
        (VRDTO <> 0)) THEN
        BEGIN
        EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTADTO, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRDTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
            NROI = NROI + 1;
            SUMA = SUMA - VRDTO;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRDTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 33);
            NROI = NROI + 1;
            SUMA = SUMA - VRDTO;
            END
        END /* DESCUENTO */
    /* VALOR ADIC */
    if ((CTAADIC IS NOT NULL) AND
        (CTAADIC <> '') AND
        (VRADIC <> 0)) THEN
        BEGIN
        EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTAADIC, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRADIC, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
            NROI = NROI + 1;
            SUMA = SUMA + VRADIC;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRADIC, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 33);
            NROI = NROI + 1;
            SUMA = SUMA + VRADIC;
            END
        END /* VR. ADIC */
    /* VALOR EXTRA */
    if ((CTAEXTRA IS NOT NULL) AND
        (CTAEXTRA <> '') AND
        (VREXTRA <> 0)) THEN
        BEGIN
        EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTAEXTRA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VREXTRA, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
            NROI = NROI + 1;
            SUMA = SUMA + VREXTRA;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VREXTRA, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 33);
            NROI = NROI + 1;
            SUMA = SUMA + VREXTRA;
            END
        END /* VR. EXTRA */
    /* RETENCION FUENTE */
    if ((RTFTE = 'C') or (RTFTE = 'K')) then
      if (VRRTFTE <> 0) then
        BEGIN
        if (RTFTE = 'C') then
            CTARTFTE = TCTARTFTE;
        EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTARTFTE, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, (:VRSUBT*-1), :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
            NROI = NROI + 1;
            SUMA = SUMA - VRRTFTE;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, (:VRSUBT*-1), :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA - VRRTFTE;
            END
        /* AUTORETENCION */
        if (FAUTORET <= fecaux) then
            BEGIN
            EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'CUENTA DE AUTORETENCION EN LA FUENTE') returning_values (CTARTFTE);
            EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTARTFTE, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :VRSUBT, :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                NROI = NROI + 1;
                SUMA = SUMA + VRRTFTE;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :VRSUBT, :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA + VRRTFTE;
                END
            END
        END /* RTFTE */
    if (RTFTE = 'A') then
      BEGIN
      FOR SELECT MAX(COAR_CTARTFTEV), MAX(COAR_RTFTE), MIN(COAR_RTBASE), SUM(DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO), SUM((DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO)*COAR_RTFTE)
        FROM CONTABIL_ARTICULO C, devoluciones_ventas_detalle F
        WHERE F.devt_id = :IDDOC AND F.ARTI_COD = C.ARTI_COD AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
        GROUP BY COAR_CTARTFTEV
        INTO :CTARTFTE, :PRTFTE, :baseadic, :MONTO, :VRRTFTE
        DO
        BEGIN
        MONTO = MONTO * FACTOR;
        if (MONTO >= BASEADIC) then
            BEGIN
            VRRTFTE = VRRTFTE * FACTOR / 100;
            execute procedure redondee(VRRTFTE, DIG) returning_values (VRRTFTE);
            execute procedure redondee(MONTO, DIG) returning_values (MONTO);
            if (VRRTFTE <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTARTFTE, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, (:MONTO*-1), :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                    NROI = NROI + 1;
                    SUMA = SUMA - VRRTFTE;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, (:MONTO*-1), :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA - VRRTFTE;
                    END
                /* AUTORETENCION */
                if (FAUTORET <= fecaux) then
                    BEGIN
                    EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'CUENTA DE AUTORETENCION EN LA FUENTE') returning_values (CTARTFTE);
                    EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTARTFTE, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
                    if (ERRORC <> 0) then
                        ERROR = ERROR + 1;
                    if (TIPOCUEN = 'C') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :MONTO, :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                        NROI = NROI + 1;
                        SUMA = SUMA + VRRTFTE;
                        END
                    if (TIPOCUEN = 'N') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :MONTO, :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NROI = NROI + 1;
                        SUMA = SUMA + VRRTFTE;
                        END
                    END
                END
            END
        END /* RTFTE */
      END
    /* RETENCION IVA */
    if ((RTIVA = 'C') or (RTIVA = 'K')) then
      if (VRRTIVA <> 0) then
        BEGIN
        if (RTIVA = 'C') then
            CTARTIVA = TCTARTIVA;
        EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTARTIVA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTIVA, (:VRIVA*-1), :PORC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
            NROI = NROI + 1;
            SUMA = SUMA - VRRTIVA;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTIVA, (:VRIVA*-1), :PORC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA - VRRTIVA;
            END
        END /* RTIVA */
    /* RETENCION DE ICA */
    if ((RTICA = 'C') or (RTICA = 'K')) then
      if (VRRTICA <> 0) then
        BEGIN
        if (RTICA = 'C') then
            CTARTICA = TCTARTICA;
        EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTARTICA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTICA, (:VRSUBT*-1), :PRTICA, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
            NROI = NROI + 1;
            SUMA = SUMA - VRRTICA;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTICA, (:VRSUBT*-1), :PRTICA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA - VRRTICA;
            END
        END /* RTICA */
    /* CIERRE EL COMPROBANTE CONTRA LA CUENTA DEL TERCERO O LA CONSTANTE */
    if ((SUMA <> 0) and ((CARTERA = 'C') or (CARTERA = 'K') or (CARTERA = 'J'))) then
        BEGIN
        if (SUMA < 0) then
            BEGIN
            DEBITO = SUMA * -1;
            CREDITO = 0;
            END
        ELSE
            BEGIN
            DEBITO = 0;
            CREDITO = SUMA;
            END
        if (CARTERA = 'C') then
            CTACARTERA = TCTACLIEN;
        if (CARTERA = 'J') then
            BEGIN
            /* BUSQUE LA CUENTA DE LA CAJA */
            SELECT CAJA_CUENTA FROM CAJAS C, PUNTO_VENTA P
                WHERE P.CAJA_ID = C.CAJA_ID AND PTVT_ID = :PTOVTA
                INTO :CTACARTERA;
            END
        EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTACARTERA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :DEBITO, :CREDITO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
        if (TIPOCUEN = 'N') then
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :DEBITO, :CREDITO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
        NROI = NROI + 1;
        END /* SUMA EN CARTERA */
    /* CALCULE COSTOS EN VENTAS */
    EXECUTE PROCEDURE COSTO_EN_VENTAS(33, :IDDOC);
    if (COSTOS = 'A') then
        BEGIN
        FOR SELECT MAX(CTACOS), SUM(cast(CANT as double precision) * COSTO)
            FROM COSTO_VENTAS WHERE TIDO_COD = 33 AND COVE_ID = :IDDOC
            GROUP BY CTACOS
            INTO :CTACOSTOS, :MONTO
        DO
            BEGIN
            if (MONTO <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTACOSTOS, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT ARTI_COD, cast(CANT as double precision) * COSTO
                        FROM COSTO_VENTAS WHERE TIDO_COD = 33 AND COVE_ID = :IDDOC AND CTACOS = :CUENTA
                        INTO :ART, :MONTO
                    DO
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                    NROI = NROI + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    END
                END /* MONTO <> 0 */
            END /* FOR */
        END /* COSTOS */
    if (COSTOS = 'K') then
        BEGIN
        SELECT SUM(cast(CANT as double precision) * COSTO)
            FROM COSTO_VENTAS WHERE TIDO_COD = 33 AND COVE_ID = :IDDOC
            INTO :MONTO;
        if (MONTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTACOSTOS, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, REGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT ARTI_COD, cast(CANT as double precision) * COSTO
                    FROM COSTO_VENTAS WHERE TIDO_COD = 33 AND COVE_ID = :IDDOC
                    INTO :ART, :MONTO
                DO
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTACOSTOS, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                    NROI = NROI + 1;
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTACOSTOS, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                NROI = NROI + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTACOSTOS, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                END
            END /* MONTO <> 0 */
        END /* COSTOS = K */
    if (INVEN = 'A') then
        BEGIN
        FOR SELECT MAX(CTAINV), SUM(cast(CANT as double precision) * COSTO)
            FROM COSTO_VENTAS WHERE TIDO_COD = 33 AND COVE_ID = :IDDOC
            GROUP BY CTAINV
            INTO :CTAINVEN, :MONTO
        DO
            BEGIN
            if (MONTO <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTAINVEN, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, REGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT ARTI_COD, cast(CANT as double precision) * COSTO
                        FROM COSTO_VENTAS WHERE TIDO_COD = 33 AND COVE_ID = :IDDOC AND CTAINV = :CUENTA
                        INTO :ART, :MONTO
                    DO
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                    NROI = NROI + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    END
                END /* MONTO <> 0 */
            END /* FOR */
        END /* INVEN = A */
    if (INVEN = 'K') then
        BEGIN
        SELECT SUM(cast(CANT as double precision) * COSTO)
            FROM COSTO_VENTAS WHERE TIDO_COD = 33 AND COVE_ID = :IDDOC
            INTO :MONTO;
        if (MONTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTAINVEN, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT ARTI_COD, cast(CANT as double precision) * COSTO
                    FROM COSTO_VENTAS WHERE TIDO_COD = 33 AND COVE_ID = :IDDOC
                    INTO :ART, :MONTO
                DO
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTAINVEN, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                    NROI = NROI + 1;
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAINVEN, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                NROI = NROI + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAINVEN, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                END
            END /* MONTO <> 0 */
        END /* INVEN = K */
    /* recorra las cuentas adicionales */
    FOR SELECT INVC_CUENTA, INVC_BASE, INVC_PORC, INVC_VALOR, INVC_DB
        FROM INTERFAZ_VENTAS_CTAS WHERE INVE_ID = :IDINTER
        INTO :CTADIC, :BASEADIC, :PORCADIC, :VALORADIC, :DBADIC
        DO
        BEGIN
        if (valoradic <> 0) then
            monto = valoradic;
        else
            BEGIN
            if (:BASEADIC = 'SUBTOTAL') then
                VALORADIC = vrsubt;
            if (:BASEADIC = 'DESCUENTO') then
                VALORADIC = VRDTO;
            if (:BASEADIC = 'IVA') then
                VALORADIC = VRIVA;
            if (:BASEADIC = 'ADICIONAL') then
                VALORADIC = VRADIC;
            if (:BASEADIC = 'EXTRA') then
                VALORADIC = VREXTRA;
            if (:BASEADIC = 'TOTAL') then
                VALORADIC = VRTOTAL;
            MONTO = VALORADIC * PORCADIC;
            END
        if (MONTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTADIC, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                if (DBADIC = 'S') then
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                ELSE
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                NROI = NROI + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                if (DBADIC = 'S') then
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                ELSE
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                END
            NROI = NROI + 1;
            END
        END
    if (error > 0) then
        ver = 'S';
    SUSPEND;
    END
   END /* EXISTE LA INTERFAZ */
  ELSE
    BEGIN
    EXECUTE PROCEDURE ERROR (33, :IDDOC, :PREF, 1);
    ERROR = ERROR + 1;
    VER = 'S';
    SUSPEND;
    END
END

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE CONTABIL_FACTURA(
    IDDOC INTEGER,
    IDINTER INTEGER)
RETURNS (
    ERROR INTEGER,
    VER CHAR(1),
    IDC INTEGER)
AS
declare variable pref varchar(4);
declare variable num varchar(6);
declare variable numero varchar(10);
declare variable fecaux date;
declare variable fecha char(8);
declare variable conc varchar(60);
declare variable venceaux date;
declare variable vence char(8);
declare variable vrdto numeric(18,2);
declare variable vradic numeric(18,2);
declare variable vrsubt numeric(18,2);
declare variable vriva numeric(18,2);
declare variable prtfte numeric(9,2);
declare variable vrrtfte numeric(18,2);
declare variable vrrtiva numeric(18,2);
declare variable prtica numeric(9,2);
declare variable vrrtica numeric(18,2);
declare variable vrtotal numeric(18,2);
declare variable vrextra numeric(18,2);
declare variable tipocomp varchar(3);
declare variable prefcont varchar(4);
declare variable ventas char(1);
declare variable ctaventas varchar(20);
declare variable iva char(1);
declare variable ctaiva varchar(20);
declare variable consumo char(1);
declare variable ctaconsumo varchar(20);
declare variable cartera char(1);
declare variable ctacartera varchar(20);
declare variable rtfte char(1);
declare variable ctartfte varchar(20);
declare variable rtiva char(1);
declare variable ctartiva varchar(20);
declare variable rtica char(1);
declare variable ctartica varchar(20);
declare variable inven char(1);
declare variable ctainven varchar(20);
declare variable costos char(1);
declare variable ctacostos varchar(20);
declare variable ctadto varchar(20);
declare variable ctaadic varchar(20);
declare variable ctaextra varchar(20);
declare variable existe char(1);
declare variable cuenta varchar(20);
declare variable monto numeric(18,2);
declare variable tipocuen char(1);
declare variable nit varchar(20);
declare variable nombre varchar(60);
declare variable proy varchar(4);
declare variable centro varchar(4);
declare variable proyi varchar(4);
declare variable centi varchar(4);
declare variable porc numeric(5,2);
declare variable debito numeric(18,2);
declare variable credito numeric(18,2);
declare variable nroi integer;
declare variable art varchar(15);
declare variable imptos numeric(18,2);
declare variable suma numeric(18,2);
declare variable porciva numeric(9,2);
declare variable tctaclien varchar(20);
declare variable tctaventa varchar(20);
declare variable tctartfte varchar(20);
declare variable tctartiva varchar(20);
declare variable tctartica varchar(20);
declare variable ctadic varchar(20);
declare variable baseadic varchar(20);
declare variable porcadic numeric(5,2);
declare variable valoradic numeric(18,2);
declare variable dbadic char(1);
declare variable ptovta integer;
declare variable anulado char(1);
declare variable dig integer;
declare variable mercancia numeric(18,2);
declare variable fomento varchar(2);
declare variable DTOXIT varchar(2);
declare variable vrconsumo numeric(18,2);
declare variable factor double precision;
declare variable cent char(1);
declare variable AUTORET VARCHAR(10);
declare variable FAUTORET DATE;
declare variable ERRORC INTEGER;
BEGIN
EXECUTE PROCEDURE LEE_CONFIGURACION('COMPRAS', 'FACTURAS', 'USAR IMPOCONSUMO COMO PORCENTAJE DE FOMENTO') returning_values (FOMENTO);
EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'FECHA AUTORETENEDOR NO DESCONTAR RETENCIONES DEL SALDO PERO SI CONTABILIZARLAS') returning_values (AUTORET);
if (AUTORET <> '') then
    FAUTORET = CAST(AUTORET AS DATE);
else
    FAUTORET = '9999/12/31';
/* BUSQUE LA INTERFACE */
EXISTE = 'N';
SELECT 'S', TICO_COD, PRCO_PRE, INVE_VENTAS, INVE_IVA, INVE_CONSUMO, INVE_CARTERA, INVE_RTFTE, INVE_RTIVA, INVE_RTICA, INVE_COSTO, INVE_INVEN, INVE_CTAVENTAS, INVE_CTAIVA, INVE_CTACONSUMO, INVE_CTADTO, INVE_CTAADIC, INVE_CTAEXTRA, INVE_CTACARTERA, INVE_CTARTFTE, INVE_CTARTIVA, INVE_CTARTICA, INVE_CTAINVEN, INVE_CTACOSTOS, INVE_CONFIRMAR, INVE_CENTRO
    FROM INTERFAZ_VENTAS
    WHERE INVE_ID = :IDINTER
    INTO :EXISTE, :TIPOCOMP, :PREFCONT, :VENTAS, :IVA, :CONSUMO, :CARTERA, :RTFTE, :RTIVA, :RTICA, :COSTOS, :INVEN, :CTAVENTAS, :CTAIVA, :CTACONSUMO, :CTADTO, :CTAADIC, :CTAEXTRA, :CTACARTERA, :CTARTFTE, :CTARTIVA, :CTARTICA, :CTAINVEN, :CTACOSTOS, :VER, :CENT;
if (EXISTE = 'S') then
  BEGIN
    /* BORRE CUALQUEIR CONTABILIZACION PREVIA */
    DELETE FROM CONTABILIZACION WHERE CNTB_TIPOREF = 31 AND CNTB_IDREF = :IDDOC;

  /* TRAIGA EL ENCABEZADO DE LA FACTURA */
  SELECT PREF_PRE, FACT_NUMERO, FACT_FECHA, F.TERC_NIT, PTVT_ID, FACT_VENCE, FACT_DTOMONTO, FACT_ADICIONAL, FACT_IVAMONTO, FACT_EXTRA, FACT_TOTAL, FACT_RTFTEPOR, FACT_RTFTEMONTO, FACT_RTIVAPOR, FACT_RTIVAMONTO, FACT_RTICAPOR, FACT_RTICAMONTO, FACT_NOMCLIENTE, TERC_CTARTFTE, TERC_CTARTIVA, TERC_CTARTICA, TERC_CTAVENTA, TERC_CTACLIENTE, FACT_ANULADO
        FROM FACTURAS F, TERCEROS T
        WHERE FACT_ID = :IDDOC AND F.TERC_NIT = T.TERC_NIT
        INTO :PREF, :NUM, :FECAUX, :NIT, :PTOVTA, :VENCEAUX, :VRDTO, :VRADIC, :VRIVA, :VREXTRA, :VRTOTAL, :PRTFTE, :VRRTFTE, :PORC, :VRRTIVA, :PRTICA, :VRRTICA, :NOMBRE, TCTARTFTE, TCTARTIVA, TCTARTICA, TCTAVENTA, TCTACLIEN, ANULADO;
  if (ANULADO = 'N') then
    BEGIN
    /* BUSQUE EL CENTRO DEL PUNTO, LA BODEGA, O EL PREFIJO  */
    IF (CENT = 'B') THEN
        SELECT B.BODE_CENTRO, B.BODE_PROY FROM BODEGA B, FACTURAS F
            WHERE B.BODE_COD = F.BODE_COD AND F.FACT_ID = :IDDOC INTO :CENTRO, :PROY;
    IF (CENT = 'V') THEN
        SELECT V.CENT_COD, V.PROY_COD FROM VENDEDORES V, FACTURAS F
            WHERE V.VEND_COD = F.VEND_COD AND F.FACT_ID = :IDDOC INTO :CENTRO, :PROY;
    IF (CENT = 'P') THEN
        SELECT P.PREF_CENTRO,P.PREF_PROY  FROM PREFIJOS P, FACTURAS F
            WHERE P.PREF_PRE = F.PREF_PRE AND F.FACT_ID = :IDDOC AND P.TIDO_COD = 31 INTO :CENTRO, :PROY;
    NUMERO = PREF || NUM;
    SELECT SUM (FADE_CONSUMO) FROM FACTURAS_DETALLE WHERE FACT_ID = :IDDOC  AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
        INTO MERCANCIA;
    VRSUBT = VRTOTAL - VREXTRA - VRIVA - MERCANCIA; /* BASE DE RETEFTE Y RETEICA */

    EXECUTE PROCEDURE lee_configuracion ('FACTURACION', 'FACTURAS', 'DESCUENTO PIE FACTURA IGUAL A SUMA DE DESCUENTOS POR ITEM') returning_values (:DTOXIT);
    if (DTOXIT = 'SI') then
        VRDTO = 0;
    MERCANCIA = VRSUBT - VRADIC + VRDTO;
    EXECUTE PROCEDURE FECHA_A_CONTA(:FECAUX) returning_values (:FECHA);
    EXECUTE PROCEDURE FECHA_A_CONTA(:VENCEAUX) returning_values (:VENCE);
    /* REGISTRE EL ENCABEZADO CONTABLE */
    IDC = GEN_ID(ID_CONTABILIZA, 1);
    if (STRLEN(NOMBRE)> 43 ) then
      CONC = 'FV No.' || NUMERO || '-' || SUBSTR(NOMBRE,1,43);
    ELSE
      CONC = 'FV No.' || NUMERO || '-' || NOMBRE;
    INSERT INTO CONTABILIZACION (CNTB_ID, CNTB_TIPOCOMP, CNTB_PREFCNT, CNTB_NUMERO, CNTB_FECHA, CNTB_CONCEPTO, CNTB_REF, CNTB_TIPOREF, CNTB_IDREF, CNTB_PREFREF, CNTB_NUMREF, CNTB_PROCESADO)
        VALUES (:IDC, :TIPOCOMP, :PREFCONT, :NUM, :FECHA, :CONC, '', 31, :IDDOC, :PREF, :NUM, 'N');
    NROI = 0;
    SUMA = 0;
    ERROR = 0;
    /* SI NO HAY CUENTA DE DESCUENTO NI ADICIONAL CALCULE UN FACTOR PARA LAS VENTAS Y EL IVA */
    if (MERCANCIA <> 0) then
        FACTOR = CAST(VRSUBT AS DOUBLE PRECISION) / CAST(MERCANCIA AS DOUBLE PRECISION);
    ELSE
        FACTOR = 1;
    /* TRAIGA EL NUMERO DE DIGITOS PARA EL REDONDEO */
    SELECT CAST(CONF_VALOR AS INTEGER) FROM CONFIGURACION WHERE CONF_MODULO = 'FACTURACION' AND
        CONF_CATEGORIA = 'GENERAL' AND CONF_PROPIEDAD = 'REDONDEO AL MULTIPLO DE DIEZ EN TOTALES' INTO :DIG;
    /* CUENTAS DE VENTAS */
    if (VENTAS = 'A') then
        BEGIN
        FOR SELECT MAX(COAR_CTAVNT), SUM(FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), SUM(FADE_IVAMONTO), SUM(FADE_CONSUMO), MAX(B.bode_proy), MAX(B.bode_centro)
            FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_DETALLE F, bodega b
            WHERE F.FACT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL)) and
            f.bode_cod = b.bode_cod
            GROUP BY COAR_CTAVNT
            INTO :CTAVENTAS, :MONTO, :IMPTOS, :VRCONSUMO, :PROYI, :CENTI
            DO
            BEGIN
            if (FOMENTO = 'SI') then
                MONTO = MONTO + VRCONSUMO;
            if ((CTADTO IS NULL) OR (CTADTO = '')) then
                MONTO = MONTO * FACTOR;
            execute procedure redondee(MONTO, DIG) returning_values (MONTO);
            if (MONTO <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTAVENTAS, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT F.ARTI_COD, (FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), FADE_CONSUMO
                        FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_DETALLE F
                        WHERE F.FACT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTAINV = :CUENTA AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
                        INTO :ART, :MONTO, :IMPTOS
                    DO
                        BEGIN
                        if (FOMENTO = 'SI') then
                            MONTO = MONTO + IMPTOS;
                        if ((CTADTO IS NULL) OR (CTADTO = '')) then
                            MONTO = MONTO * FACTOR;
                        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                        if (MONTO <> 0) then
                            BEGIN
                            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                            NROI = NROI + 1;
                            SUMA = SUMA - MONTO;
                            END
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    NROI = NROI + 1;
                    SUMA = SUMA - MONTO;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    IF (CENT = 'B') THEN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROYI, :CENTI, NULL, NULL, NULL, NULL, 0, 0);
                    ELSE
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA - MONTO;
                    END
                END /* MONTO <> 0 */
            END /* FOR */
        END /* VENTAS X ARTICULO */
     IF ((VENTAS = 'C') OR (VENTAS = 'K')) THEN
        BEGIN
        IF (VENTAS = 'C') THEN
            CTAVENTAS = TCTAVENTA;
        SELECT SUM(FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), SUM(FADE_IVAMONTO), SUM (FADE_CONSUMO)
            FROM FACTURAS_DETALLE F
            WHERE F.FACT_ID = :IDDOC AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
            INTO :MONTO, :IMPTOS, :VRCONSUMO;
        if (FOMENTO = 'SI') then
            MONTO = MONTO + VRCONSUMO;
        if ((CTADTO IS NULL) OR (CTADTO = '')) then
            MONTO = MONTO * FACTOR;
        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
        if (MONTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTAVENTAS, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT F.ARTI_COD, (FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), FADE_CONSUMO
                    FROM ARTICULO A, FACTURAS_DETALLE F
                    WHERE F.FACT_ID = :IDDOC AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
                    INTO :ART, :MONTO, :IMPTOS
                    DO
                    BEGIN
                    if (FOMENTO = 'SI') then
                        MONTO = MONTO + VRCONSUMO;
                    if ((CTADTO IS NULL) OR (CTADTO = '')) then
                        MONTO = MONTO * FACTOR;
                    execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                    if (MONTO <> 0) then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        SUMA = SUMA - MONTO;
                        END
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - MONTO;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - MONTO;
                END
            END /* MONTO <> 0 */
        END /* VENTAS DE CLIENTE O CONSTANTE */
    /* EL IVA EN VENTAS */
    if (IVA = 'A') then
        BEGIN
        FOR SELECT MAX(COAR_CTAIVAV), SUM(FADE_IVAMONTO), SUM(FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), sum(FADE_CONSUMO)
            FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_DETALLE F
            WHERE F.FACT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
            GROUP BY COAR_CTAIVAV
            INTO :CTAIVA, :IMPTOS, :MONTO, :VALORADIC
        DO
            BEGIN
            if (FOMENTO = 'SI') then
                MONTO = MONTO + VALORADIC;
            MONTO = MONTO * -1;
            MONTO = MONTO * FACTOR;
            IMPTOS = IMPTOS * FACTOR;
            execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
            execute procedure redondee(MONTO, DIG) returning_values (MONTO);
            if (IMPTOS <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTAIVA, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT F.ARTI_COD, FADE_IVAMONTO, (FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), TAIV_PORC, FADE_CONSUMO
                        FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_DETALLE F, TARIFA_IVA T
                        WHERE F.FACT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTAIVAV = :CUENTA AND A.TAIV_COD = T.TAIV_COD AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
                        INTO :ART, :IMPTOS, :MONTO, :PORCIVA, :VALORADIC
                    DO
                        BEGIN
                        if (FOMENTO = 'SI') then
                            MONTO = MONTO + VALORADIC;
                        MONTO = MONTO * -1;
                        MONTO = MONTO * FACTOR;
                        IMPTOS = IMPTOS * FACTOR;
                        execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                        if (IMPTOS <> 0) then
                            BEGIN
                            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, :MONTO, :PORCIVA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                            NROI = NROI + 1;
                            SUMA = SUMA + DEBITO - CREDITO;
                            END
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, :MONTO, ABS(:IMPTOS*100/:MONTO), :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    NROI = NROI + 1;
                    SUMA = SUMA - IMPTOS;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, :MONTO, ABS(:IMPTOS*100/:MONTO), :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA - IMPTOS;
                    END
                END   /* IMPTOS <> 0 */
            END /* FOR */
        END /* IVA X ARTICULO */
    if (IVA = 'K') then /* IVA EN CTA CONSTANTE */
        BEGIN
        SELECT SUM(FADE_IVAMONTO), SUM(FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), SUM(FADE_CONSUMO)
            FROM FACTURAS_DETALLE F
            WHERE F.FACT_ID = :IDDOC and FADE_IVAMONTO <> 0 AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
            INTO :IMPTOS, :MONTO, :valoradic;
        if (FOMENTO = 'SI') then
            MONTO = MONTO + VALORADIC;
        MONTO = MONTO * -1;
        MONTO = MONTO * FACTOR;
        IMPTOS = IMPTOS * FACTOR;
        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
        execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
        if (IMPTOS <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTAIVA, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT F.ARTI_COD, (FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), FADE_IVAMONTO, TAIV_PORC, FADE_CONSUMO
                    FROM ARTICULO A, FACTURAS_DETALLE F, TARIFA_IVA T
                    WHERE F.FACT_ID = :IDDOC AND A.TAIV_COD = T.TAIV_COD AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
                    INTO :ART, :MONTO, :IMPTOS, :PORCIVA, :VALORADIC
                    DO
                    BEGIN
                    if (FOMENTO = 'SI') then
                        MONTO = MONTO + VALORADIC;
                    MONTO = MONTO * -1;
                    MONTO = MONTO * FACTOR;
                    IMPTOS = IMPTOS * FACTOR;
                    execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                    execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                    if (IMPTOS <> 0) then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', 0, :IMPTOS, :MONTO, :PORCIVA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        SUMA = SUMA - IMPTOS;
                        END
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', 0, :IMPTOS, :MONTO, ABS(:IMPTOS*100/:MONTO), :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - IMPTOS;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', 0, :IMPTOS, :MONTO, ABS(:IMPTOS*100/:MONTO), :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - IMPTOS;
                END
            END /* IMPTOS <> 0 */
        END /* IVA EN CTA CONSTANTE */
    /* EL IMPOCONSUMO */
    if ((CONSUMO = 'A') AND (FOMENTO <> 'SI')) then
        BEGIN
        FOR SELECT MAX(COAR_CTACONS), SUM(FADE_CONSUMO)
            FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_DETALLE F
            WHERE F.FACT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
            GROUP BY COAR_CTACONS
            INTO :CTACONSUMO, :IMPTOS
        DO
            BEGIN
            execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
            if (IMPTOS <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTACONSUMO, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, REGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT F.ARTI_COD, FADE_CONSUMO
                        FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_DETALLE F
                        WHERE F.FACT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTACONS = :CUENTA AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
                        INTO :ART, :IMPTOS
                    DO
                        BEGIN
                        execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                        if (IMPTOS <> 0) then
                            BEGIN
                            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                            NROI = NROI + 1;
                            SUMA = SUMA - IMPTOS;
                            END
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    NROI = NROI + 1;
                    SUMA = SUMA - IMPTOS;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA - IMPTOS;
                    END
                END /* IMPTOS <> 0 */
            END /* FOR */
        END /* CONSUMO X ARTICULO */
    if ((CONSUMO = 'K') AND (FOMENTO <> 'SI')) then /* CONSUMO EN CTA CONSTANTE */
        BEGIN
        SELECT SUM(FADE_CONSUMO)
            FROM FACTURAS_DETALLE F
            WHERE F.FACT_ID = :IDDOC AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
            INTO :IMPTOS;
        execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
        if (IMPTOS <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTACONSUMO, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT F.ARTI_COD, FADE_CONSUMO
                    FROM ARTICULO A, FACTURAS_DETALLE F
                    WHERE F.FACT_ID = :IDDOC AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
                    INTO :ART, :IMPTOS
                    DO
                    BEGIN
                    execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                    if (IMPTOS <> 0) then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CTACONSUMO, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        SUMA = SUMA - IMPTOS;
                        END
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTACONSUMO, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - IMPTOS;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTACONSUMO, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - IMPTOS;
                END
            END /* IMPTOS <> 0 */
        END /* CONSUMO EN CTA CONSTANTE */
    /* DESCUENTO */
    if ((CTADTO IS NOT NULL) AND (CTADTO <> '')) then
        BEGIN
        execute procedure redondee(VRDTO, DIG) returning_values (VRDTO);
        if (VRDTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTADTO, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRDTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA + VRDTO;
                END
            if (TIPOCUEN = 'N') then
                    BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRDTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA + VRDTO;
                END
            END
        END /* DESCUENTO */
    /* VALOR ADIC */
    if ((CTAADIC IS NOT NULL) AND (CTAADIC <> '')) then
        BEGIN
        execute procedure redondee(VRADIC, DIG) returning_values (VRADIC);
        if (VRADIC <> 0) THEN
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTAADIC, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRADIC, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - VRADIC;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRADIC, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - VRADIC;
                END
            END
        END /* VR. ADIC */
    /* VALOR EXTRA */
    if ((CTAEXTRA IS NOT NULL) AND (CTAEXTRA <> '')) THEN
        BEGIN
        execute procedure redondee(VREXTRA, DIG) returning_values (VREXTRA);
        if (VREXTRA <> 0) THEN
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTAEXTRA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VREXTRA, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - VREXTRA;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VREXTRA, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - VREXTRA;
                END
            END
        END /* VR. EXTRA */
    /* DESCUENTE EL IMPOCONSUMO */
    SELECT SUM(FADE_CONSUMO)
        FROM FACTURAS_DETALLE F WHERE F.FACT_ID = :IDDOC AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL)) INTO :IMPTOS;
    vrsubt = vrsubt - IMPTOS;
    /* RETENCION FUENTE */
    if ((RTFTE = 'C') or (RTFTE = 'K')) then
      BEGIN
      execute procedure redondee(VRRTFTE, DIG) returning_values (VRRTFTE);
      if (VRRTFTE <> 0) then
        BEGIN
        if (RTFTE = 'C') then
            CTARTFTE = TCTARTFTE;
        EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTARTFTE, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :VRSUBT, :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTFTE;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :VRSUBT, :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTFTE;
            END
        /* AUTORETENCION */
        if (FAUTORET <= fecaux) then
            BEGIN
            EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'CUENTA DE AUTORETENCION EN LA FUENTE') returning_values (CTARTFTE);
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTARTFTE INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERROR (31, :IDDOC, :CTARTFTE, 2);
                CUENTA = CTARTFTE;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                begin
                EXECUTE PROCEDURE ERROR (31, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, (:VRSUBT*-1), :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - VRRTFTE;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, (:VRSUBT*-1), :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - VRRTFTE;
                END
            END
        END /* RTFTE */
      END
    if (RTFTE = 'A') then
      BEGIN
      FOR SELECT MAX(COAR_CTARTFTEV), MAX(COAR_RTFTE), MIN(COAR_RTBASE), SUM(FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), SUM((FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO)*COAR_RTFTE)
        FROM CONTABIL_ARTICULO C, FACTURAS_DETALLE F
        WHERE F.FACT_ID = :IDDOC AND F.ARTI_COD = C.ARTI_COD AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
        GROUP BY COAR_CTARTFTEV
        INTO :CTARTFTE, :PRTFTE, :baseadic, :MONTO, :VRRTFTE
        DO
        BEGIN
        MONTO = MONTO * FACTOR;
        if (MONTO >= BASEADIC) then
            BEGIN
            VRRTFTE = VRRTFTE * FACTOR / 100;
            execute procedure redondee(VRRTFTE, DIG) returning_values (VRRTFTE);
            execute procedure redondee(MONTO, DIG) returning_values (MONTO);
            if (VRRTFTE <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTARTFTE, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :MONTO, :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    NROI = NROI + 1;
                    SUMA = SUMA + VRRTFTE;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :MONTO, :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA + VRRTFTE;
                    END
                /* AUTORETENCION */
                if (FAUTORET <= fecaux) then
                    BEGIN
                    EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'CUENTA DE AUTORETENCION EN LA FUENTE') returning_values (CTARTFTE);
                    EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTARTFTE, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
                    if (ERRORC <> 0) then
                        ERROR = ERROR + 1;
                    if (TIPOCUEN = 'C') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, (:MONTO*-1), :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                        NROI = NROI + 1;
                        SUMA = SUMA - VRRTFTE;
                        END
                    if (TIPOCUEN = 'N') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, (:MONTO*-1), :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NROI = NROI + 1;
                        SUMA = SUMA - VRRTFTE;
                        END
                    END
                END
            END
        END /* RTFTE */
      END
    /* RETENCION IVA */
    if ((RTIVA = 'C') or (RTIVA = 'K')) then
      BEGIN
      execute procedure redondee(VRRTIVA, DIG) returning_values (VRRTIVA);
      if (VRRTIVA <> 0) then
        BEGIN
        if (RTIVA = 'C') then
            CTARTIVA = TCTARTIVA;
        EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTARTIVA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTIVA, 0, :VRIVA, :PORC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTIVA;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTIVA, 0, :VRIVA, :PORC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTIVA;
            END
        END /* RTIVA */
      END
    /* RETENCION DE ICA */
    if ((RTICA = 'C') or (RTICA = 'K')) then
      BEGIN
      execute procedure redondee(VRRTICA, DIG) returning_values (VRRTICA);
      if (VRRTICA <> 0) then
        BEGIN
        if (RTICA = 'C') then
            CTARTICA = TCTARTICA;
        EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTARTICA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTICA, 0, :VRSUBT, :PRTICA, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTICA;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTICA, 0, :VRSUBT, :PRTICA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTICA;
            END
        END /* RTICA */
      END
    /* CIERRE EL COMPROBANTE CONTRA LA CUENTA DEL TERCERO O LA CONSTANTE */
    if ((SUMA <> 0) and ((CARTERA = 'C') or (CARTERA = 'K') or (CARTERA = 'J'))) then
        BEGIN
        if (SUMA < 0) then
            BEGIN
            DEBITO = SUMA * -1;
            CREDITO = 0;
            END
        ELSE
            BEGIN
            DEBITO = 0;
            CREDITO = SUMA;
            END
        if (CARTERA = 'C') then
            CTACARTERA = TCTACLIEN;
        if (CARTERA = 'J') then
            BEGIN
            /* BUSQUE LA CUENTA DE LA CAJA */
            SELECT CAJA_CUENTA FROM CAJAS C, PUNTO_VENTA P
                WHERE P.CAJA_ID = C.CAJA_ID AND PTVT_ID = :PTOVTA
                INTO :CTACARTERA;
            END
        EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTACARTERA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :DEBITO, :CREDITO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
        if (TIPOCUEN = 'N') then
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :DEBITO, :CREDITO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
        NROI = NROI + 1;
        END /* SUMA EN CARTERA */
    /* CALCULE COSTOS EN VENTAS */
    EXECUTE PROCEDURE COSTO_EN_VENTAS(31, :IDDOC);
    if (COSTOS = 'A') then
        BEGIN
        FOR SELECT MAX(CTACOS), SUM(CAST(CANT AS DOUBLE PRECISION) * COSTO)
            FROM COSTO_VENTAS WHERE TIDO_COD = 31 AND COVE_ID = :iddoc
            GROUP BY CTACOS
            INTO :CTACOSTOS, :MONTO
        DO
            BEGIN
            if (MONTO <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTACOSTOS, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT ARTI_COD, CANT * COSTO
                        FROM COSTO_VENTAS WHERE TIDO_COD = 31 AND COVE_ID = :iddoc AND CTACOS = :CUENTA
                        INTO :ART, :MONTO
                    DO
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    NROI = NROI + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    END
                END /* MONTO <> 0 */
            END /* FOR */
        END /* COSTOS */
    if (COSTOS = 'K') then
        BEGIN
        SELECT SUM(CAST(CANT AS DOUBLE PRECISION) * COSTO)
            FROM COSTO_VENTAS WHERE TIDO_COD = 31 AND COVE_ID = :iddoc
            INTO :MONTO;
        if (MONTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTACOSTOS, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, REGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT ARTI_COD, CANT * COSTO
                    FROM COSTO_VENTAS WHERE TIDO_COD = 31 AND COVE_ID = :iddoc
                    INTO :ART, :MONTO
                DO
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTACOSTOS, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                    NROI = NROI + 1;
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTACOSTOS, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTACOSTOS, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                END
            END /* MONTO <> 0 */
        END /* COSTOS = K */
    if (INVEN = 'A') then
        BEGIN
        FOR SELECT MAX(CTAINV), SUM(CAST(CANT AS DOUBLE PRECISION) * COSTO)
            FROM COSTO_VENTAS WHERE TIDO_COD = 31 AND COVE_ID = :iddoc
            GROUP BY CTAINV
            INTO :CTAINVEN, :MONTO
        DO
            BEGIN
            if (MONTO <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTAINVEN, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, REGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT ARTI_COD, CANT * COSTO
                        FROM COSTO_VENTAS WHERE TIDO_COD = 31 AND COVE_ID = :iddoc AND CTAINV = :CUENTA
                        INTO :ART, :MONTO
                    DO
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    NROI = NROI + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    END
                END /* MONTO <> 0 */
            END /* FOR */
        END /* INVEN = A */
    if (INVEN = 'K') then
        BEGIN
        SELECT SUM(CAST(CANT AS DOUBLE PRECISION) * COSTO)
            FROM COSTO_VENTAS WHERE TIDO_COD = 31 AND COVE_ID = :iddoc
            INTO :MONTO;
        if (MONTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTAINVEN, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT ARTI_COD, CANT * COSTO
                    FROM COSTO_VENTAS WHERE TIDO_COD = 31 AND COVE_ID = :iddoc
                    INTO :ART, :MONTO
                DO
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTAINVEN, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                    NROI = NROI + 1;
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAINVEN, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAINVEN, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                END
            END /* MONTO <> 0 */
        END /* INVEN = K */
    /* recorra las cuentas adicionales */
    FOR SELECT INVC_CUENTA, INVC_BASE, INVC_PORC, INVC_VALOR, INVC_DB
        FROM INTERFAZ_VENTAS_CTAS
        WHERE INVE_ID = :IDINTER
        INTO :CTADIC, :BASEADIC, :PORCADIC, :VALORADIC, :DBADIC
        DO
        BEGIN
        if (VALORADIC <> 0) then
            MONTO = VALORADIC;
        ELSE
            BEGIN
            if (:BASEADIC = 'SUBTOTAL') then
                VALORADIC = vrsubt;
            if (:BASEADIC = 'DESCUENTO') then
                VALORADIC = VRDTO;
            if (:BASEADIC = 'IVA') then
                VALORADIC = VRIVA;
            if (:BASEADIC = 'ADICIONAL') then
                VALORADIC = VRADIC;
            if (:BASEADIC = 'EXTRA') then
                VALORADIC = VREXTRA;
            if (:BASEADIC = 'TOTAL') then
                VALORADIC = VRTOTAL;
            MONTO = VALORADIC * PORCADIC / 100;
            END
        if (MONTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTADIC, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                if (DBADIC = 'S') then
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                ELSE
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                if (DBADIC = 'S') then
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                ELSE
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                END
            NROI = NROI + 1;
            END
        END
    if (ERROR > 0) then
        VER = 'S';
    SUSPEND;
    END /* NO ANULADO */
  END /* EXISTE LA INTERFAZ */
ELSE
    BEGIN
    EXECUTE PROCEDURE ERROR (31, :IDDOC, :PREF, 1);
    ERROR = ERROR + 1;
    VER = 'S';
    SUSPEND;
    END
END

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE CONTABIL_FACTURA_IVA(
    IDDOC INTEGER,
    IDINTER INTEGER)
RETURNS (
    ERROR INTEGER,
    VER CHAR(1),
    IDC INTEGER)
AS
declare variable pref varchar(4);
declare variable num varchar(6);
declare variable numero varchar(10);
declare variable fecaux date;
declare variable fecha char(8);
declare variable conc varchar(60);
declare variable venceaux date;
declare variable vence char(8);
declare variable vrdto numeric(18,2);
declare variable vradic numeric(18,2);
declare variable vrsubt numeric(18,2);
declare variable vriva numeric(18,2);
declare variable prtfte numeric(9,2);
declare variable vrrtfte numeric(18,2);
declare variable vrrtiva numeric(18,2);
declare variable prtica numeric(9,2);
declare variable vrrtica numeric(18,2);
declare variable vrtotal numeric(18,2);
declare variable vrextra numeric(18,2);
declare variable tipocomp varchar(3);
declare variable prefcont varchar(4);
declare variable ventas char(1);
declare variable ctaventas varchar(20);
declare variable iva char(1);
declare variable ctaiva varchar(20);
declare variable consumo char(1);
declare variable ctaconsumo varchar(20);
declare variable cartera char(1);
declare variable ctacartera varchar(20);
declare variable rtfte char(1);
declare variable ctartfte varchar(20);
declare variable rtiva char(1);
declare variable ctartiva varchar(20);
declare variable rtica char(1);
declare variable ctartica varchar(20);
declare variable inven char(1);
declare variable ctainven varchar(20);
declare variable costos char(1);
declare variable ctacostos varchar(20);
declare variable ctadto varchar(20);
declare variable ctaadic varchar(20);
declare variable ctaextra varchar(20);
declare variable existe char(1);
declare variable cuenta varchar(20);
declare variable monto numeric(18,2);
declare variable tipocuen char(1);
declare variable nit varchar(20);
declare variable nombre varchar(60);
declare variable proy varchar(4);
declare variable centro varchar(4);
declare variable porc numeric(5,2);
declare variable debito numeric(18,2);
declare variable credito numeric(18,2);
declare variable nroi integer;
declare variable art varchar(15);
declare variable imptos numeric(18,2);
declare variable suma numeric(18,2);
declare variable porciva numeric(9,2);
declare variable tctaclien varchar(20);
declare variable tctaventa varchar(20);
declare variable tctartfte varchar(20);
declare variable tctartiva varchar(20);
declare variable tctartica varchar(20);
declare variable ctadic varchar(20);
declare variable baseadic varchar(20);
declare variable porcadic numeric(5,2);
declare variable valoradic numeric(18,2);
declare variable dbadic char(1);
declare variable ptovta integer;
declare variable anulado char(1);
declare variable dig integer;
declare variable mercancia numeric(18,2);
declare variable fomento varchar(2);
declare variable DTOXIT varchar(2);
declare variable vrconsumo numeric(18,2);
declare variable factor double precision;
declare variable cent char(1);
declare variable AUTORET VARCHAR(10);
declare variable FAUTORET DATE;
declare variable ERRORC INTEGER;
BEGIN
EXECUTE PROCEDURE LEE_CONFIGURACION('COMPRAS', 'FACTURAS', 'USAR IMPOCONSUMO COMO PORCENTAJE DE FOMENTO') returning_values (FOMENTO);
EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'FECHA AUTORETENEDOR NO DESCONTAR RETENCIONES DEL SALDO PERO SI CONTABILIZARLAS') returning_values (AUTORET);
if (AUTORET <> '') then
    FAUTORET = CAST(AUTORET AS DATE);
else
    FAUTORET = '9999/12/31';
/* BUSQUE LA INTERFACE */
EXISTE = 'N';
SELECT 'S', TICO_COD, PRCO_PRE, INVE_VENTAS, INVE_IVA, INVE_CONSUMO, INVE_CARTERA, INVE_RTFTE, INVE_RTIVA, INVE_RTICA, INVE_COSTO, INVE_INVEN, INVE_CTAVENTAS, INVE_CTAIVA, INVE_CTACONSUMO, INVE_CTADTO, INVE_CTAADIC, INVE_CTAEXTRA, INVE_CTACARTERA, INVE_CTARTFTE, INVE_CTARTIVA, INVE_CTARTICA, INVE_CTAINVEN, INVE_CTACOSTOS, INVE_CONFIRMAR, INVE_CENTRO
    FROM INTERFAZ_VENTAS
    WHERE INVE_ID = :IDINTER
    INTO :EXISTE, :TIPOCOMP, :PREFCONT, :VENTAS, :IVA, :CONSUMO, :CARTERA, :RTFTE, :RTIVA, :RTICA, :COSTOS, :INVEN, :CTAVENTAS, :CTAIVA, :CTACONSUMO, :CTADTO, :CTAADIC, :CTAEXTRA, :CTACARTERA, :CTARTFTE, :CTARTIVA, :CTARTICA, :CTAINVEN, :CTACOSTOS, :VER, :CENT;
if (EXISTE = 'S') then
  BEGIN
    /* BORRE CUALQUEIR CONTABILIZACION PREVIA */
    DELETE FROM CONTABILIZACION WHERE CNTB_TIPOREF = 31 AND CNTB_IDREF = :IDDOC;

  /* TRAIGA EL ENCABEZADO DE LA FACTURA */
  SELECT PREF_PRE, FACT_NUMERO, FACT_FECHA, F.TERC_NIT, PTVT_ID, FACT_VENCE, FACT_DTOMONTO, FACT_ADICIONAL, FACT_IVAMONTO, FACT_EXTRA, FACT_TOTAL, FACT_RTFTEPOR, FACT_RTFTEMONTO, FACT_RTIVAPOR, FACT_RTIVAMONTO, FACT_RTICAPOR, FACT_RTICAMONTO, FACT_NOMCLIENTE, TERC_CTARTFTE, TERC_CTARTIVA, TERC_CTARTICA, TERC_CTAVENTA, TERC_CTACLIENTE, FACT_ANULADO
        FROM FACTURAS F, TERCEROS T
        WHERE FACT_ID = :IDDOC AND F.TERC_NIT = T.TERC_NIT
        INTO :PREF, :NUM, :FECAUX, :NIT, :PTOVTA, :VENCEAUX, :VRDTO, :VRADIC, :VRIVA, :VREXTRA, :VRTOTAL, :PRTFTE, :VRRTFTE, :PORC, :VRRTIVA, :PRTICA, :VRRTICA, :NOMBRE, TCTARTFTE, TCTARTIVA, TCTARTICA, TCTAVENTA, TCTACLIEN, ANULADO;
  if (ANULADO = 'N') then
    BEGIN
    /* BUSQUE EL CENTRO DEL PUNTO, LA BODEGA, O EL PREFIJO  */
    IF (CENT = 'B') THEN
        SELECT B.BODE_CENTRO, B.BODE_PROY FROM BODEGA B, FACTURAS F
            WHERE B.BODE_COD = F.BODE_COD AND F.FACT_ID = :IDDOC INTO :CENTRO, :PROY;
    IF (CENT = 'V') THEN
        SELECT V.CENT_COD, V.PROY_COD FROM VENDEDORES V, FACTURAS F
            WHERE V.VEND_COD = F.VEND_COD AND F.FACT_ID = :IDDOC INTO :CENTRO, :PROY;
    IF (CENT = 'P') THEN
        SELECT P.PREF_CENTRO,P.PREF_PROY  FROM PREFIJOS P, FACTURAS F
            WHERE P.PREF_PRE = F.PREF_PRE AND F.FACT_ID = :IDDOC AND P.TIDO_COD = 31 INTO :CENTRO, :PROY;
    NUMERO = PREF || NUM;
    SELECT SUM (FADE_CONSUMO) FROM FACTURAS_DETALLE WHERE FACT_ID = :IDDOC  AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
        INTO MERCANCIA;
    VRSUBT = VRTOTAL - VREXTRA - VRIVA - MERCANCIA; /* BASE DE RETEFTE Y RETEICA */

    EXECUTE PROCEDURE lee_configuracion ('FACTURACION', 'FACTURAS', 'DESCUENTO PIE FACTURA IGUAL A SUMA DE DESCUENTOS POR ITEM') returning_values (:DTOXIT);
    if (DTOXIT = 'SI') then
        VRDTO = 0;
    MERCANCIA = VRSUBT - VRADIC + VRDTO;
    EXECUTE PROCEDURE FECHA_A_CONTA(:FECAUX) returning_values (:FECHA);
    EXECUTE PROCEDURE FECHA_A_CONTA(:VENCEAUX) returning_values (:VENCE);
    /* REGISTRE EL ENCABEZADO CONTABLE */
    IDC = GEN_ID(ID_CONTABILIZA, 1);
    if (STRLEN(NOMBRE)> 43 ) then
      CONC = 'FV No.' || NUMERO || '-' || SUBSTR(NOMBRE,1,43);
    ELSE
      CONC = 'FV No.' || NUMERO || '-' || NOMBRE;
    INSERT INTO CONTABILIZACION (CNTB_ID, CNTB_TIPOCOMP, CNTB_PREFCNT, CNTB_NUMERO, CNTB_FECHA, CNTB_CONCEPTO, CNTB_REF, CNTB_TIPOREF, CNTB_IDREF, CNTB_PREFREF, CNTB_NUMREF, CNTB_PROCESADO)
        VALUES (:IDC, :TIPOCOMP, :PREFCONT, :NUM, :FECHA, :CONC, '', 31, :IDDOC, :PREF, :NUM, 'N');
    NROI = 0;
    SUMA = 0;
    ERROR = 0;
    /* SI NO HAY CUENTA DE DESCUENTO NI ADICIONAL CALCULE UN FACTOR PARA LAS VENTAS Y EL IVA */
    if (MERCANCIA <> 0) then
        FACTOR = CAST(VRSUBT AS DOUBLE PRECISION) / CAST(MERCANCIA AS DOUBLE PRECISION);
    ELSE
        FACTOR = 1;
    /* TRAIGA EL NUMERO DE DIGITOS PARA EL REDONDEO */
    SELECT CAST(CONF_VALOR AS INTEGER) FROM CONFIGURACION WHERE CONF_MODULO = 'FACTURACION' AND
        CONF_CATEGORIA = 'GENERAL' AND CONF_PROPIEDAD = 'REDONDEO AL MULTIPLO DE DIEZ EN TOTALES' INTO :DIG;
    /* CUENTAS DE VENTAS */
    if (VENTAS = 'A') then
        BEGIN
        FOR SELECT MAX(TAIV_CTAVTA), SUM(FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), SUM(FADE_IVAMONTO), SUM(FADE_CONSUMO)
            FROM TARIFA_IVA T, FACTURAS_DETALLE F
            WHERE F.FACT_ID = :IDDOC AND F.fade_ivaporc = T.taiv_porc AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
            GROUP BY TAIV_CTAVTA
            INTO :CTAVENTAS, :MONTO, :IMPTOS, :VRCONSUMO
            DO
            BEGIN
            if (FOMENTO = 'SI') then
                MONTO = MONTO + VRCONSUMO;
            if ((CTADTO IS NULL) OR (CTADTO = '')) then
                MONTO = MONTO * FACTOR;
            execute procedure redondee(MONTO, DIG) returning_values (MONTO);
            if (MONTO <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTAVENTAS, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT F.ARTI_COD, (FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), FADE_CONSUMO
                        FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_DETALLE F
                        WHERE F.FACT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTAINV = :CUENTA AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
                        INTO :ART, :MONTO, :IMPTOS
                    DO
                        BEGIN
                        if (FOMENTO = 'SI') then
                            MONTO = MONTO + IMPTOS;
                        if ((CTADTO IS NULL) OR (CTADTO = '')) then
                            MONTO = MONTO * FACTOR;
                        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                        if (MONTO <> 0) then
                            BEGIN
                            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                            NROI = NROI + 1;
                            SUMA = SUMA - MONTO;
                            END
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    NROI = NROI + 1;
                    SUMA = SUMA - MONTO;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA - MONTO;
                    END
                END /* MONTO <> 0 */
            END /* FOR */
        END /* VENTAS X ARTICULO */
     IF ((VENTAS = 'C') OR (VENTAS = 'K')) THEN
        BEGIN
        IF (VENTAS = 'C') THEN
            CTAVENTAS = TCTAVENTA;
        SELECT SUM(FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), SUM(FADE_IVAMONTO), SUM (FADE_CONSUMO)
            FROM FACTURAS_DETALLE F
            WHERE F.FACT_ID = :IDDOC AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
            INTO :MONTO, :IMPTOS, :VRCONSUMO;
        if (FOMENTO = 'SI') then
            MONTO = MONTO + VRCONSUMO;
        if ((CTADTO IS NULL) OR (CTADTO = '')) then
            MONTO = MONTO * FACTOR;
        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
        if (MONTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTAVENTAS, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT F.ARTI_COD, (FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), FADE_CONSUMO
                    FROM ARTICULO A, FACTURAS_DETALLE F
                    WHERE F.FACT_ID = :IDDOC AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
                    INTO :ART, :MONTO, :IMPTOS
                    DO
                    BEGIN
                    if (FOMENTO = 'SI') then
                        MONTO = MONTO + VRCONSUMO;
                    if ((CTADTO IS NULL) OR (CTADTO = '')) then
                        MONTO = MONTO * FACTOR;
                    execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                    if (MONTO <> 0) then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        SUMA = SUMA - MONTO;
                        END
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - MONTO;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - MONTO;
                END
            END /* MONTO <> 0 */
        END /* VENTAS DE CLIENTE O CONSTANTE */
    /* EL IVA EN VENTAS */
    if (IVA = 'A') then
        BEGIN
        FOR SELECT MAX(TAIV_CTAIVAVNT), SUM(FADE_IVAMONTO), SUM(FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), sum(FADE_CONSUMO)
            FROM TARIFA_IVA T, FACTURAS_DETALLE F
            WHERE F.FACT_ID = :IDDOC AND F.fade_ivaporc = T.taiv_porc AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
            GROUP BY TAIV_CTAIVAVNT
            INTO :CTAIVA, :IMPTOS, :MONTO, :VALORADIC
        DO
            BEGIN
            if (FOMENTO = 'SI') then
                MONTO = MONTO + VALORADIC;
            MONTO = MONTO * -1;
            MONTO = MONTO * FACTOR;
            IMPTOS = IMPTOS * FACTOR;
            execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
            execute procedure redondee(MONTO, DIG) returning_values (MONTO);
            if (IMPTOS <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTAIVA, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT F.ARTI_COD, FADE_IVAMONTO, (FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), TAIV_PORC, FADE_CONSUMO
                        FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_DETALLE F, TARIFA_IVA T
                        WHERE F.FACT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTAIVAV = :CUENTA AND A.TAIV_COD = T.TAIV_COD AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
                        INTO :ART, :IMPTOS, :MONTO, :PORCIVA, :VALORADIC
                    DO
                        BEGIN
                        if (FOMENTO = 'SI') then
                            MONTO = MONTO + VALORADIC;
                        MONTO = MONTO * -1;
                        MONTO = MONTO * FACTOR;
                        IMPTOS = IMPTOS * FACTOR;
                        execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                        if (IMPTOS <> 0) then
                            BEGIN
                            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, :MONTO, :PORCIVA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                            NROI = NROI + 1;
                            SUMA = SUMA + DEBITO - CREDITO;
                            END
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, :MONTO, ABS(:IMPTOS*100/:MONTO), :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    NROI = NROI + 1;
                    SUMA = SUMA - IMPTOS;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, :MONTO, ABS(:IMPTOS*100/:MONTO), :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA - IMPTOS;
                    END
                END   /* IMPTOS <> 0 */
            END /* FOR */
        END /* IVA X ARTICULO */
    if (IVA = 'K') then /* IVA EN CTA CONSTANTE */
        BEGIN
        SELECT SUM(FADE_IVAMONTO), SUM(FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), SUM(FADE_CONSUMO)
            FROM FACTURAS_DETALLE F
            WHERE F.FACT_ID = :IDDOC and FADE_IVAMONTO <> 0 AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
            INTO :IMPTOS, :MONTO, :valoradic;
        if (FOMENTO = 'SI') then
            MONTO = MONTO + VALORADIC;
        MONTO = MONTO * -1;
        MONTO = MONTO * FACTOR;
        IMPTOS = IMPTOS * FACTOR;
        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
        execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
        if (IMPTOS <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTAIVA, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT F.ARTI_COD, (FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), FADE_IVAMONTO, TAIV_PORC, FADE_CONSUMO
                    FROM ARTICULO A, FACTURAS_DETALLE F, TARIFA_IVA T
                    WHERE F.FACT_ID = :IDDOC AND A.TAIV_COD = T.TAIV_COD AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
                    INTO :ART, :MONTO, :IMPTOS, :PORCIVA, :VALORADIC
                    DO
                    BEGIN
                    if (FOMENTO = 'SI') then
                        MONTO = MONTO + VALORADIC;
                    MONTO = MONTO * -1;
                    MONTO = MONTO * FACTOR;
                    IMPTOS = IMPTOS * FACTOR;
                    execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                    execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                    if (IMPTOS <> 0) then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', 0, :IMPTOS, :MONTO, :PORCIVA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        SUMA = SUMA - IMPTOS;
                        END
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', 0, :IMPTOS, :MONTO, ABS(:IMPTOS*100/:MONTO), :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - IMPTOS;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', 0, :IMPTOS, :MONTO, ABS(:IMPTOS*100/:MONTO), :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - IMPTOS;
                END
            END /* IMPTOS <> 0 */
        END /* IVA EN CTA CONSTANTE */
    /* EL IMPOCONSUMO */
    if ((CONSUMO = 'A') AND (FOMENTO <> 'SI')) then
        BEGIN
        FOR SELECT MAX(COAR_CTACONS), SUM(FADE_CONSUMO)
            FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_DETALLE F
            WHERE F.FACT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
            GROUP BY COAR_CTACONS
            INTO :CTACONSUMO, :IMPTOS
        DO
            BEGIN
            execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
            if (IMPTOS <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTACONSUMO, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, REGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT F.ARTI_COD, FADE_CONSUMO
                        FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_DETALLE F
                        WHERE F.FACT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTACONS = :CUENTA AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
                        INTO :ART, :IMPTOS
                    DO
                        BEGIN
                        execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                        if (IMPTOS <> 0) then
                            BEGIN
                            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                            NROI = NROI + 1;
                            SUMA = SUMA - IMPTOS;
                            END
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    NROI = NROI + 1;
                    SUMA = SUMA - IMPTOS;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA - IMPTOS;
                    END
                END /* IMPTOS <> 0 */
            END /* FOR */
        END /* CONSUMO X ARTICULO */
    if ((CONSUMO = 'K') AND (FOMENTO <> 'SI')) then /* CONSUMO EN CTA CONSTANTE */
        BEGIN
        SELECT SUM(FADE_CONSUMO)
            FROM FACTURAS_DETALLE F
            WHERE F.FACT_ID = :IDDOC AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
            INTO :IMPTOS;
        execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
        if (IMPTOS <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTACONSUMO, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT F.ARTI_COD, FADE_CONSUMO
                    FROM ARTICULO A, FACTURAS_DETALLE F
                    WHERE F.FACT_ID = :IDDOC AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
                    INTO :ART, :IMPTOS
                    DO
                    BEGIN
                    execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                    if (IMPTOS <> 0) then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CTACONSUMO, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        SUMA = SUMA - IMPTOS;
                        END
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTACONSUMO, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - IMPTOS;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTACONSUMO, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - IMPTOS;
                END
            END /* IMPTOS <> 0 */
        END /* CONSUMO EN CTA CONSTANTE */
    /* DESCUENTO */
    if ((CTADTO IS NOT NULL) AND (CTADTO <> '')) then
        BEGIN
        execute procedure redondee(VRDTO, DIG) returning_values (VRDTO);
        if (VRDTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTADTO, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRDTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA + VRDTO;
                END
            if (TIPOCUEN = 'N') then
                    BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRDTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA + VRDTO;
                END
            END
        END /* DESCUENTO */
    /* VALOR ADIC */
    if ((CTAADIC IS NOT NULL) AND (CTAADIC <> '')) then
        BEGIN
        execute procedure redondee(VRADIC, DIG) returning_values (VRADIC);
        if (VRADIC <> 0) THEN
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTAADIC, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRADIC, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - VRADIC;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRADIC, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - VRADIC;
                END
            END
        END /* VR. ADIC */
    /* VALOR EXTRA */
    if ((CTAEXTRA IS NOT NULL) AND (CTAEXTRA <> '')) THEN
        BEGIN
        execute procedure redondee(VREXTRA, DIG) returning_values (VREXTRA);
        if (VREXTRA <> 0) THEN
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTAEXTRA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VREXTRA, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - VREXTRA;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VREXTRA, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - VREXTRA;
                END
            END
        END /* VR. EXTRA */
    /* DESCUENTE EL IMPOCONSUMO */
    SELECT SUM(FADE_CONSUMO)
        FROM FACTURAS_DETALLE F WHERE F.FACT_ID = :IDDOC AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL)) INTO :IMPTOS;
    vrsubt = vrsubt - IMPTOS;
    /* RETENCION FUENTE */
    if ((RTFTE = 'C') or (RTFTE = 'K')) then
      BEGIN
      execute procedure redondee(VRRTFTE, DIG) returning_values (VRRTFTE);
      if (VRRTFTE <> 0) then
        BEGIN
        if (RTFTE = 'C') then
            CTARTFTE = TCTARTFTE;
        EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTARTFTE, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :VRSUBT, :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTFTE;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :VRSUBT, :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTFTE;
            END
        /* AUTORETENCION */
        if (FAUTORET <= fecaux) then
            BEGIN
            EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'CUENTA DE AUTORETENCION EN LA FUENTE') returning_values (CTARTFTE);
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTARTFTE INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERROR (31, :IDDOC, :CTARTFTE, 2);
                CUENTA = CTARTFTE;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                begin
                EXECUTE PROCEDURE ERROR (31, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, (:VRSUBT*-1), :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - VRRTFTE;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, (:VRSUBT*-1), :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - VRRTFTE;
                END
            END
        END /* RTFTE */
      END
    if (RTFTE = 'A') then
      BEGIN
      FOR SELECT MAX(COAR_CTARTFTEV), MAX(COAR_RTFTE), MIN(COAR_RTBASE), SUM(FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), SUM((FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO)*COAR_RTFTE)
        FROM CONTABIL_ARTICULO C, FACTURAS_DETALLE F
        WHERE F.FACT_ID = :IDDOC AND F.ARTI_COD = C.ARTI_COD AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
        GROUP BY COAR_CTARTFTEV
        INTO :CTARTFTE, :PRTFTE, :baseadic, :MONTO, :VRRTFTE
        DO
        BEGIN
        MONTO = MONTO * FACTOR;
        if (MONTO >= BASEADIC) then
            BEGIN
            VRRTFTE = VRRTFTE * FACTOR / 100;
            execute procedure redondee(VRRTFTE, DIG) returning_values (VRRTFTE);
            execute procedure redondee(MONTO, DIG) returning_values (MONTO);
            if (VRRTFTE <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTARTFTE, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :MONTO, :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    NROI = NROI + 1;
                    SUMA = SUMA + VRRTFTE;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :MONTO, :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA + VRRTFTE;
                    END
                /* AUTORETENCION */
                if (FAUTORET <= fecaux) then
                    BEGIN
                    EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'CUENTA DE AUTORETENCION EN LA FUENTE') returning_values (CTARTFTE);
                    EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTARTFTE, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
                    if (ERRORC <> 0) then
                        ERROR = ERROR + 1;
                    if (TIPOCUEN = 'C') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, (:MONTO*-1), :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                        NROI = NROI + 1;
                        SUMA = SUMA - VRRTFTE;
                        END
                    if (TIPOCUEN = 'N') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, (:MONTO*-1), :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NROI = NROI + 1;
                        SUMA = SUMA - VRRTFTE;
                        END
                    END
                END
            END
        END /* RTFTE */
      END
    /* RETENCION IVA */
    if ((RTIVA = 'C') or (RTIVA = 'K')) then
      BEGIN
      execute procedure redondee(VRRTIVA, DIG) returning_values (VRRTIVA);
      if (VRRTIVA <> 0) then
        BEGIN
        if (RTIVA = 'C') then
            CTARTIVA = TCTARTIVA;
        EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTARTIVA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTIVA, 0, :VRIVA, :PORC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTIVA;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTIVA, 0, :VRIVA, :PORC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTIVA;
            END
        END /* RTIVA */
      END
    /* RETENCION DE ICA */
    if ((RTICA = 'C') or (RTICA = 'K')) then
      BEGIN
      execute procedure redondee(VRRTICA, DIG) returning_values (VRRTICA);
      if (VRRTICA <> 0) then
        BEGIN
        if (RTICA = 'C') then
            CTARTICA = TCTARTICA;
        EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTARTICA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTICA, 0, :VRSUBT, :PRTICA, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTICA;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTICA, 0, :VRSUBT, :PRTICA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTICA;
            END
        END /* RTICA */
      END
    /* CIERRE EL COMPROBANTE CONTRA LA CUENTA DEL TERCERO O LA CONSTANTE */
    if ((SUMA <> 0) and ((CARTERA = 'C') or (CARTERA = 'K') or (CARTERA = 'J'))) then
        BEGIN
        if (SUMA < 0) then
            BEGIN
            DEBITO = SUMA * -1;
            CREDITO = 0;
            END
        ELSE
            BEGIN
            DEBITO = 0;
            CREDITO = SUMA;
            END
        if (CARTERA = 'C') then
            CTACARTERA = TCTACLIEN;
        if (CARTERA = 'J') then
            BEGIN
            /* BUSQUE LA CUENTA DE LA CAJA */
            SELECT CAJA_CUENTA FROM CAJAS C, PUNTO_VENTA P
                WHERE P.CAJA_ID = C.CAJA_ID AND PTVT_ID = :PTOVTA
                INTO :CTACARTERA;
            END
        EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTACARTERA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :DEBITO, :CREDITO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
        if (TIPOCUEN = 'N') then
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :DEBITO, :CREDITO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
        NROI = NROI + 1;
        END /* SUMA EN CARTERA */
    /* CALCULE COSTOS EN VENTAS */
    EXECUTE PROCEDURE COSTO_EN_VENTAS(31, :IDDOC);
    if (COSTOS = 'A') then
        BEGIN
        FOR SELECT MAX(CTACOS), SUM(CAST(CANT AS DOUBLE PRECISION) * COSTO)
            FROM COSTO_VENTAS WHERE TIDO_COD = 31 AND COVE_ID = :IDDOC
            GROUP BY CTACOS
            INTO :CTACOSTOS, :MONTO
        DO
            BEGIN
            if (MONTO <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTACOSTOS, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT ARTI_COD, CANT * COSTO
                        FROM COSTO_VENTAS WHERE TIDO_COD = 31 AND COVE_ID = :IDDOC AND CTACOS = :CUENTA
                        INTO :ART, :MONTO
                    DO
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    NROI = NROI + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    END
                END /* MONTO <> 0 */
            END /* FOR */
        END /* COSTOS */
    if (COSTOS = 'K') then
        BEGIN
        SELECT SUM(CAST(CANT AS DOUBLE PRECISION) * COSTO)
            FROM COSTO_VENTAS WHERE TIDO_COD = 31 AND COVE_ID = :IDDOC
            INTO :MONTO;
        if (MONTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTACOSTOS, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, REGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT ARTI_COD, CANT * COSTO
                    FROM COSTO_VENTAS WHERE TIDO_COD = 31 AND COVE_ID = :IDDOC
                    INTO :ART, :MONTO
                DO
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTACOSTOS, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                    NROI = NROI + 1;
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTACOSTOS, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTACOSTOS, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                END
            END /* MONTO <> 0 */
        END /* COSTOS = K */
    if (INVEN = 'A') then
        BEGIN
        FOR SELECT MAX(CTAINV), SUM(CAST(CANT AS DOUBLE PRECISION) * COSTO)
            FROM COSTO_VENTAS WHERE TIDO_COD = 31 AND COVE_ID = :IDDOC
            GROUP BY CTAINV
            INTO :CTAINVEN, :MONTO
        DO
            BEGIN
            if (MONTO <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTAINVEN, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, REGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT ARTI_COD, CANT * COSTO
                        FROM COSTO_VENTAS WHERE TIDO_COD = 31 AND COVE_ID = :IDDOC AND CTAINV = :CUENTA
                        INTO :ART, :MONTO
                    DO
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    NROI = NROI + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    END
                END /* MONTO <> 0 */
            END /* FOR */
        END /* INVEN = A */
    if (INVEN = 'K') then
        BEGIN
        SELECT SUM(CAST(CANT AS DOUBLE PRECISION) * COSTO)
            FROM COSTO_VENTAS WHERE TIDO_COD = 31 AND COVE_ID = :IDDOC
            INTO :MONTO;
        if (MONTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTAINVEN, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT ARTI_COD, CANT * COSTO
                    FROM COSTO_VENTAS WHERE TIDO_COD = 31 AND COVE_ID = :IDDOC
                    INTO :ART, :MONTO
                DO
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTAINVEN, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                    NROI = NROI + 1;
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAINVEN, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAINVEN, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                END
            END /* MONTO <> 0 */
        END /* INVEN = K */
    /* recorra las cuentas adicionales */
    FOR SELECT INVC_CUENTA, INVC_BASE, INVC_PORC, INVC_VALOR, INVC_DB
        FROM INTERFAZ_VENTAS_CTAS
        WHERE INVE_ID = :IDINTER
        INTO :CTADIC, :BASEADIC, :PORCADIC, :VALORADIC, :DBADIC
        DO
        BEGIN
        if (VALORADIC <> 0) then
            MONTO = VALORADIC;
        ELSE
            BEGIN
            if (:BASEADIC = 'SUBTOTAL') then
                VALORADIC = vrsubt;
            if (:BASEADIC = 'DESCUENTO') then
                VALORADIC = VRDTO;
            if (:BASEADIC = 'IVA') then
                VALORADIC = VRIVA;
            if (:BASEADIC = 'ADICIONAL') then
                VALORADIC = VRADIC;
            if (:BASEADIC = 'EXTRA') then
                VALORADIC = VREXTRA;
            if (:BASEADIC = 'TOTAL') then
                VALORADIC = VRTOTAL;
            MONTO = VALORADIC * PORCADIC / 100;
            END
        if (MONTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTADIC, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                if (DBADIC = 'S') then
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                ELSE
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                if (DBADIC = 'S') then
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                ELSE
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                END
            NROI = NROI + 1;
            END
        END
    if (ERROR > 0) then
        VER = 'S';
    SUSPEND;
    END /* NO ANULADO */
  END /* EXISTE LA INTERFAZ */
ELSE
    BEGIN
    EXECUTE PROCEDURE ERROR (31, :IDDOC, :PREF, 1);
    ERROR = ERROR + 1;
    VER = 'S';
    SUSPEND;
    END
END

^

SET TERM ; ^

SET TERM ^ ;

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

^

SET TERM ; ^

SET TERM ^ ;

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

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE DEVOLUCIONES_SIN_CONTABILIDAD(
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    ID INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    ESTADO VARCHAR(20),
    IDI INTEGER,
    IDC INTEGER)
AS
DECLARE VARIABLE VER CHAR(2);
declare variable FECICNT VARCHAR(10);
declare variable FECFCNT VARCHAR(10);
declare variable ERROR INTEGER;
declare variable idref INTEGER;
BEGIN
EXECUTE PROCEDURE fecha_a_conta(FECINI) returning_values (FECICNT);
EXECUTE PROCEDURE fecha_a_conta(FECFIN) returning_values (FECFCNT);
FOR SELECT DEVT_ID, PREF_PRE, DEVT_NUMERO FROM devoluciones_ventas WHERE DEVT_ANULADO = 'N' AND
    DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN
    INTO :ID, :PREF, :NUMERO
DO
  BEGIN
  idref = null;
  SELECT ENCO_IDREF FROM COMPROBANTE_ENCABEZADO WHERE ENCO_TIPOREF = 33 AND ENCO_FECHA >= :FECICNT AND ENCO_FECHA <= :FECFCNT and ENCO_IDREF = :id into :idref;
  if (idref IS NULL) then
  begin
   ESTADO = 'PROCESANDO';
   SUSPEND;
   SELECT MAX(INVE_ID) FROM INTERFAZ_VENTAS WHERE PREF_PRE = :PREF AND TIDO_COD = 33 INTO :IDI;
   EXECUTE PROCEDURE contabil_devolcli (:ID, :IDI) RETURNING_VALUES (:ERROR, :VER, :IDC);
   if (ERROR = 0) then
    BEGIN
    EXECUTE PROCEDURE CONTABILIZA_PENDIENTE (:IDC);
    ESTADO = 'OK';
    END
   ELSE
    ESTADO = 'ERROR';
   suspend;
  End
  END
END

^

SET TERM ; ^

SET TERM ^ ;

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

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE FACTURAS_SIN_CONTABILIDAD(
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    ID INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    ESTADO VARCHAR(20),
    IDI INTEGER,
    IDC INTEGER)
AS
DECLARE VARIABLE VER CHAR(2);
declare variable FECICNT VARCHAR(10);
declare variable FECFCNT VARCHAR(10);
declare variable ERROR INTEGER;
declare variable idref INTEGER;
BEGIN
EXECUTE PROCEDURE fecha_a_conta(FECINI) returning_values (FECICNT);
EXECUTE PROCEDURE fecha_a_conta(FECFIN) returning_values (FECFCNT);
FOR SELECT FACT_ID, PREF_PRE, FACT_NUMERO FROM FACTURAS WHERE FACT_ANULADO = 'N' AND
    FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN INTO :ID, :PREF, :NUMERO
DO
  BEGIN
  idref = null;
  SELECT ENCO_IDREF FROM COMPROBANTE_ENCABEZADO WHERE ENCO_TIPOREF = 31 AND ENCO_FECHA >= :FECICNT AND ENCO_FECHA <= :FECFCNT and ENCO_IDREF = :ID into :idref;
  if (idref IS NULL) then
  begin
   ESTADO = 'PROCESANDO';
   ERROR = NULL;
   SUSPEND;
   SELECT MAX(INVE_ID) FROM INTERFAZ_VENTAS WHERE PREF_PRE = :PREF AND TIDO_COD = 31 INTO :IDI;
   EXECUTE PROCEDURE CONTABIL_FACTURA (:ID, :IDI) RETURNING_VALUES (:ERROR, VER, :IDC);
   if ((ERROR = 0) or (error IS NULL)) then
    BEGIN
    EXECUTE PROCEDURE CONTABILIZA_PENDIENTE (:IDC);
    ESTADO = 'OK';
    END
   ELSE
    ESTADO = 'ERROR';
   suspend;
  end
  END
END

^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure UTILIDAD_VENTAS (
    TIPO integer,
    DETALLE char(1),
    FECINI date,
    FECFIN date,
    PREFIJO varchar(4),
    ULTIMO char(1),
    SUBEMPRESA integer)
returns (
    PREF varchar(4),
    NUMERO varchar(6),
    FECHA date,
    PTVTID integer,
    VENDCOD integer,
    NIT varchar(20),
    NOMTERCERO varchar(60),
    ARTICULO varchar(15),
    ARTIDES varchar(60),
    CANT numeric(18,4),
    UNIDAD varchar(8),
    PRECIO numeric(18,2),
    COSTO numeric(18,2),
    UTILIDAD numeric(18,2),
    PORC numeric(9,2))
AS
declare variable IMPTOS CHAR(1);
declare variable ID INTEGER;
declare variable IVA NUMERIC(18,2);
declare variable COSTOT NUMERIC(18,2);
declare variable ULTCOS NUMERIC(18,2);
declare variable PRECIOT NUMERIC(18,2);
declare variable UOM VARCHAR(20);
declare variable icoinc char(2);
declare variable consumo NUMERIC(18,2);
declare variable factor NUMERIC(18,4);
declare variable ITEM INTEGER;
BEGIN
EXECUTE PROCEDURE lee_configuracion ('FACTURACION', 'ARTICULOS', 'SUGERIR PRECIOS CON PORCENTAJE DE MARGEN O UTILIDAD') returning_values (:UOM);
EXECUTE PROCEDURE lee_configuracion ('FACTURACION', 'ARTICULOS', 'IMPOCONSUMO INCLUIDO EN EL PRECIO BASE DE VENTA ANTES DE IVA') returning_values (:icoinc);
/* DETERMINE LA TABLA A EXAMINAR */
if (TIPO = 31) then
    BEGIN
    /* FACTURA */
    FOR SELECT FACT_ID, F.PREF_PRE, FACT_NUMERO, FACT_FECHA, PTVT_ID, VEND_COD, TERC_NIT, FACT_NOMCLIENTE, FACT_IVAINC, fact_factor
        FROM FACTURAS F, PREFIJOS P
        WHERE FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND FACT_ANULADO = 'N'
         AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = :TIPO AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
        ORDER BY FACT_FECHA, F.PREF_PRE, FACT_NUMERO
        INTO :ID, :PREF, :NUMERO, :FECHA, :PTVTID, :VENDCOD, :NIT, :NOMTERCERO, :IMPTOS, :factor
        DO
        if ((PREFIJO = '') or (PREFIJO = PREF)) then
          BEGIN
          COSTOT = 0;
          PRECIOT = 0;
          FOR SELECT FADE_ITEM, D.ARTI_COD, SUBSTR(FADE_DESC,1,60), FADE_CANT * FADE_FACTOR, FADE_UNIDAD, (FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO)*:FACTOR, FADE_IVAMONTO, fade_consumo
            FROM FACTURAS_DETALLE D
            WHERE FACT_ID = :ID and substring(D.arti_cod from 1 FOR 2) <> '.t'
            INTO :ITEM, :ARTICULO, :ARTIDES, :CANT, :UNIDAD, :PRECIO, :IVA, :consumo
            DO
                BEGIN
                if (EXISTS (SELECT COST_SALP / COST_SALC FROM COSTOS C, MOVIMIENTO_ARTICULO M
                    WHERE COST_IDMOV = MVAR_CONS AND MVAR_TIPODOC = 31 AND MVAR_IDREF = :ID AND COST_SALC <> 0 AND MVAR_ITEM = :ITEM)) then
                    SELECT COST_SALP / COST_SALC, COST_ULTIMO FROM COSTOS C, MOVIMIENTO_ARTICULO M
                        WHERE COST_IDMOV = MVAR_CONS AND MVAR_TIPODOC = 31 AND MVAR_IDREF = :ID AND COST_SALC <> 0 AND MVAR_ITEM = :ITEM INTO :costo, :ultcos;
                else
                    EXECUTE PROCEDURE costo_promedio_y_ultimo(:ARTICULO, :FECHA) returning_values (:COSTO, :ultcos);
                if (ULTIMO = 'S') then
                    COSTO = ultcos * CANT;
                else
                    COSTO = COSTO * CANT;
                if (DETALLE = 'S') then
                    BEGIN
                    UTILIDAD = PRECIO - COSTO;
                    if (UOM = 'UTILIDAD') then
                        EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                    else
                        EXECUTE PROCEDURE PORCENTAJE (utilidad,  PRECIO, 'S') returning_values (PORC);
                    SUSPEND;
                    END
                ELSE
                    BEGIN
                    COSTOT = COSTOT + COSTO;
                    PRECIOT = PRECIOT + PRECIO;
                    END
                END
          if (DETALLE <> 'S') then
            BEGIN
            COSTO = COSTOT;
            PRECIO = PRECIOT;
            UTILIDAD = PRECIO - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  PRECIO, 'S') returning_values (PORC);
            SUSPEND;
            END
          END
    END
  if (TIPO = 32) then
    BEGIN
    /* REMISION */
    FOR SELECT REVT_ID, R.PREF_PRE, REVT_NUMERO, REVT_FECHA, PTVT_ID, VEND_COD, TERC_NIT, REVT_NOMTERC, REVT_IVAINC
        FROM REMISIONES_VENTA R, PREFIJOS P
        WHERE REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN AND REVT_ANULADO = 'N'
         AND P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = :TIPO AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
        ORDER BY REVT_FECHA, R.PREF_PRE, REVT_NUMERO
        INTO :ID, :PREF, :NUMERO, :FECHA, :PTVTID, :VENDCOD, :NIT, :NOMTERCERO, :IMPTOS
        DO
        if ((PREFIJO = '') or (PREFIJO = PREF)) then
          BEGIN
          COSTOT = 0;
          PRECIOT = 0;
          FOR SELECT RVDE_ITEM, D.ARTI_COD, SUBSTR(RVDE_DESC,1,60), RVDE_CANT * RVDE_FACTOR, RVDE_UNIDAD, (RVDE_TOTAL-RVDE_IVAMONTO-RVDE_CONSUMO), RVDE_IVAMONTO, rvde_consumo
            FROM REMISIONES_VENTA_DETALLE D
            WHERE REVT_ID = :ID and substring(D.arti_cod from 1 FOR 2) <> '.t'
            INTO :ITEM, :ARTICULO, :ARTIDES, :CANT, :UNIDAD, :PRECIO, :IVA, :consumo
            DO
                BEGIN
                if (EXISTS (SELECT COST_SALP / COST_SALC FROM COSTOS C, MOVIMIENTO_ARTICULO M
                    WHERE COST_IDMOV = MVAR_CONS AND MVAR_TIPODOC = 32 AND MVAR_IDREF = :ID AND COST_SALC <> 0 AND MVAR_ITEM = :ITEM)) then
                    SELECT COST_SALP / COST_SALC, COST_ULTIMO FROM COSTOS C, MOVIMIENTO_ARTICULO M
                        WHERE COST_IDMOV = MVAR_CONS AND MVAR_TIPODOC = 32 AND MVAR_IDREF = :ID AND COST_SALC <> 0 AND MVAR_ITEM = :ITEM INTO :costo, :ultcos;
                else
                    EXECUTE PROCEDURE costo_promedio_y_ultimo(:ARTICULO, :FECHA) returning_values (:COSTO, :ultcos);
                if (ULTIMO = 'S') then
                    COSTO = ultcos * CANT;
                else
                    COSTO = COSTO * CANT;
                if (DETALLE = 'S') then
                    BEGIN
                    UTILIDAD = PRECIO - COSTO;
                    if (UOM = 'UTILIDAD') then
                        EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                    else
                        EXECUTE PROCEDURE PORCENTAJE (utilidad,  PRECIO, 'S') returning_values (PORC);
                    SUSPEND;
                    END
                ELSE
                    BEGIN
                    COSTOT = COSTOT + COSTO;
                    PRECIOT = PRECIOT + PRECIO;
                    END
                END
          if (DETALLE <> 'S') then
            BEGIN
            COSTO = COSTOT;
            PRECIO = PRECIOT;
            UTILIDAD = PRECIO - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  PRECIO, 'S') returning_values (PORC);
            SUSPEND;
            END
          END
    END
  if (TIPO = 33) then
    BEGIN
    /* DEVOLUCION */
    FOR SELECT DEVT_ID, D.PREF_PRE, DEVT_NUMERO, DEVT_FECHA, PTVT_ID, VEND_COD, TERC_NIT, DEVT_NOMTERC, DEVT_IVAINC, DEVT_FACTOR
        FROM DEVOLUCIONES_VENTAS D, PREFIJOS P
        WHERE DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND DEVT_ANULADO = 'N'
         AND P.PREF_PRE = D.PREF_PRE AND P.TIDO_COD = :TIPO AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
        ORDER BY DEVT_FECHA, D.PREF_PRE, DEVT_NUMERO
        INTO :ID, :PREF, :NUMERO, :FECHA, :PTVTID, :VENDCOD, :NIT, :NOMTERCERO, :IMPTOS, :FACTOR
        DO
        if ((PREFIJO = '') or (PREFIJO = PREF)) then
          BEGIN
          COSTOT = 0;
          PRECIOT = 0;
          FOR SELECT DVDE_ITEM, D.ARTI_COD, SUBSTR(DVDE_DESC,1,60), DVDE_CANT * DVDE_FACTOR, DVDE_UNIDAD, (DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO)*:FACTOR, DVDE_IVAMONTO, dvde_consumo
            FROM DEVOLUCIONES_VENTAS_DETALLE D
            WHERE DEVT_ID = :ID and substring(D.arti_cod from 1 FOR 2) <> '.t'
            INTO :ITEM, :ARTICULO, :ARTIDES, :CANT, :UNIDAD, :PRECIO, :IVA, :consumo
            DO
                BEGIN
                if (EXISTS (SELECT COST_ENTP / COST_ENTC FROM COSTOS C, MOVIMIENTO_ARTICULO M
                    WHERE COST_IDMOV = MVAR_CONS AND MVAR_TIPODOC = 33 AND MVAR_IDREF = :ID AND COST_ENTC <> 0 AND MVAR_ITEM = :ITEM)) then
                    SELECT COST_ENTP / COST_ENTC FROM COSTOS C, MOVIMIENTO_ARTICULO M
                        WHERE COST_IDMOV = MVAR_CONS AND MVAR_TIPODOC = 33 AND MVAR_IDREF = :ID AND COST_ENTC <> 0 AND MVAR_ITEM = :ITEM INTO :costo;
                else
                    EXECUTE PROCEDURE costo_promedio_y_ultimo(:ARTICULO, :FECHA) returning_values (:COSTO, :ultcos);
                if (ULTIMO = 'S') then
                    COSTO = ultcos * CANT;
                else
                    COSTO = COSTO * CANT;
                if (DETALLE = 'S') then
                    BEGIN
                    UTILIDAD = PRECIO - COSTO;
                    if (UOM = 'UTILIDAD') then
                        EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                    else
                        EXECUTE PROCEDURE PORCENTAJE (utilidad,  PRECIO, 'S') returning_values (PORC);
                    SUSPEND;
                    END
                ELSE
                    BEGIN
                    COSTOT = COSTOT + COSTO;
                    PRECIOT = PRECIOT + PRECIO;
                    END
                END
        if (DETALLE <> 'S') then
            BEGIN
            COSTO = COSTOT;
            PRECIO = PRECIOT;
            UTILIDAD = PRECIO - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  PRECIO, 'S') returning_values (PORC);
            SUSPEND;
            END
        END
    END
  if (TIPO = 34) then
    BEGIN
    /* PEDIDO */
    FOR SELECT PEDI_ID, P.PREF_PRE, PEDI_NUMERO, PEDI_FECHA, PTVT_ID, VEND_COD, TERC_NIT, PEDI_NOMTERC, PEDI_IVAINC, PEDI_FACTOR
        FROM PEDIDOS P, PREFIJOS R
        WHERE PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND PEDI_ANULADO = 'N'
         AND P.PREF_PRE = R.PREF_PRE AND R.TIDO_COD = :TIPO AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
        ORDER BY PEDI_FECHA, P.PREF_PRE, PEDI_NUMERO
        INTO :ID, :PREF, :NUMERO, :FECHA, :PTVTID, :VENDCOD, :NIT, :NOMTERCERO, :IMPTOS, :FACTOR
        DO
        if ((PREFIJO = '') or (PREFIJO = PREF)) then
          BEGIN
          COSTOT = 0;
          PRECIOT = 0;
          FOR SELECT ARTI_COD, SUBSTR(PEDE_DESC,1,60), PEDE_CANT * PEDE_FACTOR, PEDE_UNIDAD, (PEDE_TOTAL-PEDE_IVAMONTO-PEDE_CONSUMO)*:FACTOR, PEDE_IVAMONTO, pede_consumo
            FROM PEDIDOS_DETALLE
            WHERE PEDI_ID = :ID
            INTO :ARTICULO, :ARTIDES, :CANT, :UNIDAD, :PRECIO, :IVA, :consumo
            DO
                BEGIN
                EXECUTE PROCEDURE costo_promedio_y_ultimo(:ARTICULO, :FECHA) returning_values (:COSTO, :ultcos);
                if (ULTIMO = 'S') then
                    COSTO = ultcos * CANT;
                else
                    COSTO = COSTO * CANT;
                if (DETALLE = 'S') then
                    BEGIN
                    UTILIDAD = PRECIO - COSTO;
                    if (UOM = 'UTILIDAD') then
                        EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                    else
                        EXECUTE PROCEDURE PORCENTAJE (utilidad,  PRECIO, 'S') returning_values (PORC);
                    SUSPEND;
                    END
                ELSE
                    BEGIN
                    COSTOT = COSTOT + COSTO;
                    PRECIOT = PRECIOT + PRECIO;
                    END
                END
        if (DETALLE <> 'S') then
            BEGIN
            COSTO = COSTOT;
            PRECIO = PRECIOT;
            UTILIDAD = PRECIO - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  PRECIO, 'S') returning_values (PORC);
            SUSPEND;
            END
        END
    END
  if (TIPO = 35) then
    BEGIN
    /* COTIZACION */
    FOR SELECT COTI_ID, C.PREF_PRE, COTI_NUMERO, COTI_FECHA, PTVT_ID, VEND_COD, TERC_NIT, COTI_NOMTERC, COTI_IMPTOS, COTI_FACTOR
        FROM COTIZACIONES C, PREFIJOS P
        WHERE COTI_FECHA >= :FECINI AND COTI_FECHA <= :FECFIN AND COTI_ANULADO = 'N'
         AND P.PREF_PRE = C.PREF_PRE AND P.TIDO_COD = :TIPO AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
        ORDER BY COTI_FECHA, C.PREF_PRE, COTI_NUMERO
        INTO :ID, :PREF, :NUMERO, :FECHA, :PTVTID, :VENDCOD, :NIT, :NOMTERCERO, :IMPTOS, :FACTOR
        DO
        if ((PREFIJO = '') or (PREFIJO = PREF)) then
          BEGIN
          COSTOT = 0;
          PRECIOT = 0;
          FOR SELECT ARTI_COD, SUBSTR(CTDE_DESC,1,60), CTDE_CANT * CTDE_FACTOR, CTDE_UNIDAD, (CTDE_TOTAL-CTDE_IVAMONTO-CTDE_CONSUMO)*:FACTOR, CTDE_IVAMONTO, ctde_consumo
            FROM COTIZACIONES_DETALLE
            WHERE COTI_ID = :ID
            INTO :ARTICULO, :ARTIDES, :CANT, :UNIDAD, :PRECIO, :IVA, :consumo
            DO
                BEGIN
                EXECUTE PROCEDURE costo_promedio_y_ultimo(:ARTICULO, :FECHA) returning_values (:COSTO, :ultcos);
                if (ULTIMO = 'S') then
                    COSTO = ultcos * CANT;
                else
                    COSTO = COSTO * CANT;
                if (DETALLE = 'S') then
                    BEGIN
                    UTILIDAD = PRECIO - COSTO;
                    if (UOM = 'UTILIDAD') then
                        EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                    else
                        EXECUTE PROCEDURE PORCENTAJE (utilidad,  PRECIO, 'S') returning_values (PORC);
                    SUSPEND;
                    END
                ELSE
                    BEGIN
                    COSTOT = COSTOT + COSTO;
                    PRECIOT = PRECIOT + PRECIO;
                    END
                END
        if (DETALLE <> 'S') then
            BEGIN
            COSTO = COSTOT;
            PRECIO = PRECIOT;
            UTILIDAD = PRECIO - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  PRECIO, 'S') returning_values (PORC);
            SUSPEND;
            END
        END
    END
END
^

SET TERM ; ^

SET TERM ^ ;

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

        FOR SELECT MAX(T.TERC_NIT), MAX(TERC_NOM), MAX(TERC_TEL), MAX(TERC_CIU), MAX(ZONA_COD), MAX(D.ARTI_COD), SUM(FADE_CANT * FADE_FACTOR), SUM(FACT_FACTOR*(FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO)),
            SUM(FACT_FACTOR*FADE_IVAMONTO), SUM(FACT_FACTOR*FADE_TOTAL),
            MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD), max(f.fact_sucursal)
            FROM FACTURAS_DETALLE D, FACTURAS F, PREFIJOS P, terceros T, CLIENTES C, ARTICULO A
            WHERE C.TERC_NIT = T.TERC_NIT AND TERC_CLIE = 'S' AND F.terc_nit = T.terc_nit AND T.TERC_NIT >= :TERINI AND T.TERC_NIT <= :TERFIN AND
            F.FACT_ID = D.FACT_ID AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND FACT_ANULADO = 'N'
            AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) and substring(D.arti_cod from 1 FOR 2) <> '.t'
            AND D.ARTI_COD = A.arti_cod AND A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN
            GROUP BY T.TERC_NIT, f.fact_sucursal, D.ARTI_COD
            INTO :NIT, :NOMBRE, :TELEFONO, :CIUDAD, :CODZONA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :TOTAL,
            :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :sucursal
            DO
            BEGIN
            COSTO = 0;
            FOR SELECT F.FACT_ID, FADE_ITEM, FADE_CANT * FADE_FACTOR, FACT_FECHA FROM FACTURAS_DETALLE D, FACTURAS F, PREFIJOS P
                WHERE F.TERC_NIT = :NIT AND F.FACT_ID = D.FACT_ID AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND
                FACT_ANULADO = 'N' AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                and D.ARTI_COD = :articulo  INTO :ID, :ITEM, :cantdet, :fecha
                DO
                BEGIN
                if (EXISTS (SELECT COST_SALP / COST_SALC FROM COSTOS C, MOVIMIENTO_ARTICULO M
                    WHERE COST_IDMOV = MVAR_CONS AND MVAR_TIPODOC = 31 AND MVAR_IDREF = :ID AND COST_SALC <> 0 AND MVAR_ITEM = :ITEM)) then
                    SELECT COST_SALP / COST_SALC FROM COSTOS C, MOVIMIENTO_ARTICULO M
                        WHERE COST_IDMOV = MVAR_CONS AND MVAR_TIPODOC = 31 AND MVAR_IDREF = :ID AND COST_SALC <> 0 AND MVAR_ITEM = :ITEM INTO :costounit;
                else
                    EXECUTE PROCEDURE COSTO_PROMEDIO(:ARTICULO, :FECHA) returning_values (:costounit);
                COSTO = COSTO + costounit * cantdet;
                END
            SELECT ZONA_NOM FROM ZONAS WHERE ZONA_COD = :CODZONA INTO :NOMZONA;
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            if (CEROS = 'S') then
                INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (3, USER, :ARTICULO);
            SUSPEND;
            END /* FOR */
        if (CEROS = 'S') then
            BEGIN
            COSTO = 0;
            UTILIDAD = 0;
            PORC = 0;
            /* agregue los articulos sin factura */
            FOR SELECT ARTI_COD, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN
                INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                DO
                BEGIN
                SELECT COUNT(REPA_ARTICULO) FROM REPORTES_AUX WHERE REPA_ID = 3 AND REPA_USER = USER AND REPA_ARTICULO = :articulo INTO :numrows;
                if (numrows = 0) then
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        END
    if (BIN_AND(TIPO, 2) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 32 INTO :NOMTIPO;
        /* BORRA LA TABLA AUXILIAR */
        DELETE FROM reportes_aux WHERE REPA_ID = 3 AND REPA_USER = USER;

        FOR SELECT MAX(T.TERC_NIT), MAX(TERC_NOM), MAX(TERC_TEL), MAX(TERC_CIU), MAX(ZONA_COD), MAX(D.ARTI_COD), SUM(RVDE_CANT * RVDE_FACTOR), SUM(RVDE_TOTAL-RVDE_IVAMONTO-RVDE_CONSUMO), SUM(RVDE_IVAMONTO), SUM(RVDE_TOTAL),
            MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD), max(r.revt_sucursal)
            FROM REMISIONES_VENTA_DETALLE D, REMISIONES_VENTA R, PREFIJOS P, terceros T, CLIENTES C, ARTICULO A
            WHERE C.TERC_NIT = T.TERC_NIT AND TERC_CLIE = 'S' AND R.terc_nit = T.terc_nit AND T.TERC_NIT >= :TERINI AND T.TERC_NIT <= :TERFIN AND
            R.REVT_ID = D.REVT_ID AND REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN AND REVT_ANULADO = 'N'
            AND P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = 32 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            AND D.ARTI_COD = A.arti_cod AND A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN
            GROUP BY T.TERC_NIT, r.revt_sucursal, D.ARTI_COD
            INTO :NIT, :NOMBRE, :TELEFONO, :CIUDAD, :CODZONA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :TOTAL,
                :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :sucursal
            DO
                BEGIN
                COSTO = 0;
                FOR SELECT R.REVT_ID, RVDE_ITEM, RVDE_CANT * RVDE_FACTOR, REVT_FECHA
                    FROM REMISIONES_VENTA_DETALLE D, REMISIONES_VENTA R, PREFIJOS P
                    WHERE R.terc_nit = :nit AND R.REVT_ID = D.REVT_ID AND REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN AND REVT_ANULADO = 'N'
                    AND P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = 32 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                    AND D.ARTI_COD = :articulo INTO :ID, :ITEM, :cantdet, :fecha
                    DO
                    BEGIN
                    if (EXISTS (SELECT COST_SALP / COST_SALC FROM COSTOS C, MOVIMIENTO_ARTICULO M
                        WHERE COST_IDMOV = MVAR_CONS AND MVAR_TIPODOC = 32 AND MVAR_IDREF = :ID AND COST_SALC <> 0 AND MVAR_ITEM = :ITEM)) then
                        SELECT COST_SALP / COST_SALC FROM COSTOS C, MOVIMIENTO_ARTICULO M
                            WHERE COST_IDMOV = MVAR_CONS AND MVAR_TIPODOC = 32 AND MVAR_IDREF = :ID AND COST_SALC <> 0 AND MVAR_ITEM = :ITEM INTO :costounit;
                    else
                        EXECUTE PROCEDURE COSTO_PROMEDIO(:ARTICULO, :FECHA) returning_values (:costounit);
                    COSTO = COSTO + costounit * cantdet;
                    END
                SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                if (CANTIDAD IS NULL) then
                    CANTIDAD = 0;
                if (BASE IS NULL) then
                    BASE = 0;
                if (IVA IS NULL) then
                    IVA = 0;
                UTILIDAD = BASE - COSTO;
                if (UOM = 'UTILIDAD') then
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                else
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            if (CEROS = 'S') then
                INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (3, USER, :ARTICULO);
            SUSPEND;
            END /* FOR */
        if (CEROS = 'S') then
            BEGIN
            COSTO = 0;
            UTILIDAD = 0;
            PORC = 0;
            /* agregue los articulos sin factura */
            FOR SELECT ARTI_COD, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN
                INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                DO
                BEGIN
                SELECT COUNT(REPA_ARTICULO) FROM REPORTES_AUX WHERE REPA_ID = 3 AND REPA_USER = USER AND REPA_ARTICULO = :articulo INTO :numrows;
                if (numrows = 0) then
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        END
    if (BIN_AND(TIPO, 4) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 33 INTO :NOMTIPO;
        /* BORRA LA TABLA AUXILIAR */
        DELETE FROM reportes_aux WHERE REPA_ID = 3 AND REPA_USER = USER;

        FOR SELECT MAX(T.TERC_NIT), MAX(TERC_NOM), MAX(TERC_TEL), MAX(TERC_CIU), MAX(ZONA_COD), MAX(D.ARTI_COD), SUM(DVDE_CANT * DVDE_FACTOR), SUM(DEVT_FACTOR*(DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO)),
            SUM(DEVT_FACTOR*DVDE_IVAMONTO), SUM(DEVT_FACTOR*DVDE_TOTAL),
            MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD), max(v.devt_sucursal)
            FROM devoluciones_ventas_detalle D, DEVOLUCIONES_VENTAS V, PREFIJOS P, terceros T, CLIENTES C, ARTICULO A
            WHERE C.TERC_NIT = T.TERC_NIT AND TERC_CLIE = 'S' AND V.terc_nit = T.terc_nit AND T.TERC_NIT >= :TERINI AND T.TERC_NIT <= :TERFIN AND
            V.DEVT_ID = D.DEVT_ID AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND DEVT_ANULADO = 'N'
            AND P.PREF_PRE = V.PREF_PRE AND P.TIDO_COD = 33 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) and substring(D.arti_cod from 1 FOR 2) <> '.t'
            AND D.ARTI_COD = A.arti_cod AND A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN
            GROUP BY T.TERC_NIT, v.devt_sucursal, D.ARTI_COD
            INTO :NIT, :NOMBRE, :TELEFONO, :CIUDAD, :CODZONA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :TOTAL,
                :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :sucursal
            DO
            BEGIN
            COSTO = 0;
            FOR SELECT V.DEVT_ID, DVDE_ITEM, DVDE_CANT * DVDE_FACTOR, DEVT_FECHA
                FROM devoluciones_ventas_detalle D, DEVOLUCIONES_VENTAS V, PREFIJOS P
                WHERE V.terc_nit = :nit AND V.DEVT_ID = D.DEVT_ID AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND DEVT_ANULADO = 'N'
                AND P.PREF_PRE = V.PREF_PRE AND P.TIDO_COD = 33 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                AND D.ARTI_COD = :articulo INTO :ID, :ITEM, :cantdet, :fecha
                DO
                BEGIN
                if (EXISTS (SELECT COST_ENTP / COST_ENTC FROM COSTOS C, MOVIMIENTO_ARTICULO M
                    WHERE COST_IDMOV = MVAR_CONS AND MVAR_TIPODOC = 33 AND MVAR_IDREF = :ID AND COST_ENTC <> 0 AND MVAR_ITEM = :ITEM)) then
                    SELECT COST_ENTP / COST_ENTC FROM COSTOS C, MOVIMIENTO_ARTICULO M
                        WHERE COST_IDMOV = MVAR_CONS AND MVAR_TIPODOC = 33 AND MVAR_IDREF = :ID AND COST_ENTC <> 0 AND MVAR_ITEM = :ITEM INTO :costounit;
                else
                    EXECUTE PROCEDURE COSTO_PROMEDIO(:ARTICULO, :FECHA) returning_values (:costounit);
                COSTO = COSTO + costounit * cantdet;
                END
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            TOTAL = TOTAL * -1;
            IVA = IVA * -1;
            BASE = BASE * -1;
            CANTIDAD = CANTIDAD * -1;
            COSTO = COSTO * -1;
            UTILIDAD = UTILIDAD * -1;
            if (CEROS = 'S') then
                INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (3, USER, :ARTICULO);
            SUSPEND;
            END /* FOR */
        if (CEROS = 'S') then
            BEGIN
            COSTO = 0;
            UTILIDAD = 0;
            PORC = 0;
            /* agregue los articulos sin factura */
            FOR SELECT ARTI_COD, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN
                INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                DO
                BEGIN
                SELECT COUNT(REPA_ARTICULO) FROM REPORTES_AUX WHERE REPA_ID = 3 AND REPA_USER = USER AND REPA_ARTICULO = :articulo INTO :numrows;
                if (numrows = 0) then
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        END
    if (BIN_AND(TIPO, 8) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 34 INTO :NOMTIPO;
        /* BORRA LA TABLA AUXILIAR */
        DELETE FROM reportes_aux WHERE REPA_ID = 3 AND REPA_USER = USER;

        FOR SELECT MAX(T.TERC_NIT), MAX(TERC_NOM), MAX(TERC_TEL), MAX(TERC_CIU), MAX(ZONA_COD), MAX(D.ARTI_COD), SUM(PEDE_CANT * PEDE_FACTOR),
            SUM(PEDI_FACTOR*(PEDE_TOTAL-PEDE_IVAMONTO-PEDE_CONSUMO)), SUM(PEDI_FACTOR*PEDE_IVAMONTO), SUM(PEDI_FACTOR*PEDE_TOTAL),
            MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD), max(p.pedi_sucursal)
            FROM PEDIDOS_DETALLE D, PEDIDOS P, PREFIJOS PR, terceros T, CLIENTES C, ARTICULO A
            WHERE C.TERC_NIT = T.TERC_NIT AND TERC_CLIE = 'S' AND P.terc_nit = T.terc_nit AND T.TERC_NIT >= :TERINI AND T.TERC_NIT <= :TERFIN AND
            P.PEDI_ID = D.PEDI_ID AND PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND PEDI_ANULADO = 'N'
            AND PR.PREF_PRE = P.PREF_PRE AND P.TIDO_COD = 34 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY T.TERC_NIT, p.pedi_sucursal, D.ARTI_COD
            INTO :NIT, :NOMBRE, :TELEFONO, :CIUDAD, :CODZONA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :TOTAL,
                :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :sucursal
            DO
            BEGIN
            COSTO = 0;
            FOR SELECT PEDE_CANT * PEDE_FACTOR, PEDI_FECHA
                FROM PEDIDOS_DETALLE D, PEDIDOS PE, PREFIJOS P
                WHERE PE.terc_nit = :nit AND PE.PEDI_ID = D.PEDI_ID AND PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND PEDI_ANULADO = 'N'
                AND P.PREF_PRE = PE.PREF_PRE AND P.TIDO_COD = 34 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                AND D.ARTI_COD = :articulo INTO :cantdet, :fecha
                DO
                BEGIN
                EXECUTE PROCEDURE COSTO_PROMEDIO(:ARTICULO, :FECHA) returning_values (:costounit);
                COSTO = COSTO + costounit * cantdet;
                END
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            if (CEROS = 'S') then
                INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (3, USER, :ARTICULO);
            SUSPEND;
            END /* FOR */
        if (CEROS = 'S') then
            BEGIN
            COSTO = 0;
            UTILIDAD = 0;
            PORC = 0;
            /* agregue los articulos sin factura */
            FOR SELECT ARTI_COD, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN
                INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                DO
                BEGIN
                SELECT COUNT(REPA_ARTICULO) FROM REPORTES_AUX WHERE REPA_ID = 3 AND REPA_USER = USER AND REPA_ARTICULO = :articulo INTO :numrows;
                if (numrows = 0) then
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        END
    if (BIN_AND(TIPO, 16) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 35 INTO :NOMTIPO;
        /* BORRA LA TABLA AUXILIAR */
        DELETE FROM reportes_aux WHERE REPA_ID = 3 AND REPA_USER = USER;

        FOR SELECT MAX(T.TERC_NIT), MAX(TERC_NOM), MAX(TERC_TEL), MAX(TERC_CIU), MAX(ZONA_COD), MAX(D.ARTI_COD), SUM(CTDE_CANT * CTDE_FACTOR),
            SUM(COTI_FACTOR*(CTDE_TOTAL-CTDE_IVAMONTO-CTDE_CONSUMO)), SUM(COTI_FACTOR*CTDE_IVAMONTO), SUM(COTI_FACTOR*CTDE_TOTAL),
            MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD), max(ct.coti_sucursal)
            FROM COTIZACIONES_DETALLE D, COTIZACIONES CT, PREFIJOS P, terceros T, CLIENTES C, ARTICULO A
            WHERE C.TERC_NIT = T.TERC_NIT AND TERC_CLIE = 'S' AND C.terc_nit = T.terc_nit AND T.TERC_NIT >= :TERINI AND T.TERC_NIT <= :TERFIN AND
            CT.COTI_ID = D.COTI_ID AND COTI_FECHA >= :FECINI AND COTI_FECHA <= :FECFIN AND COTI_ANULADO = 'N'
            AND P.PREF_PRE = CT.PREF_PRE AND P.TIDO_COD = 35 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY T.TERC_NIT, ct.coti_sucursal, D.ARTI_COD
            INTO :NIT, :NOMBRE, :TELEFONO, :CIUDAD, :CODZONA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :TOTAL,
                :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :sucursal
            DO
            BEGIN
            COSTO = 0;
            FOR SELECT CTDE_CANT * CTDE_FACTOR, COTI_FECHA
                FROM COTIZACIONES_DETALLE D, COTIZACIONES C, PREFIJOS P
                WHERE C.terc_nit = :nit AND C.COTI_ID = D.coti_id AND COTI_FECHA >= :FECINI AND COTI_FECHA <= :FECFIN AND COTI_ANULADO = 'N'
                AND P.PREF_PRE = C.PREF_PRE AND P.TIDO_COD = 35 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                AND D.ARTI_COD = :articulo INTO :cantdet, :fecha
                DO
                BEGIN
                EXECUTE PROCEDURE COSTO_PROMEDIO(:ARTICULO, :FECHA) returning_values (:costounit);
                COSTO = COSTO + costounit * cantdet;
                END
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            EXECUTE PROCEDURE costo_promedio (:ARTICULO, :FECFIN) RETURNING_VALUES (:COSTOUNIT);
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            if (CEROS = 'S') then
                INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (3, USER, :ARTICULO);
            SUSPEND;
            END /* FOR */
        if (CEROS = 'S') then
            BEGIN
            COSTO = 0;
            UTILIDAD = 0;
            PORC = 0;
            /* agregue los articulos sin factura */
            FOR SELECT ARTI_COD, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN
                INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                DO
                BEGIN
                SELECT COUNT(REPA_ARTICULO) FROM REPORTES_AUX WHERE REPA_ID = 3 AND REPA_USER = USER AND REPA_ARTICULO = :articulo INTO :numrows;
                if (numrows = 0) then
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        END
    END
ELSE
    BEGIN
    if (BIN_AND(TIPO, 1) <> 0) then
            BEGIN
            SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 31 INTO :NOMTIPO;
            FOR SELECT F.PREF_PRE, FACT_NUMERO, FACT_FECHA, ARTI_COD, FADE_CANT * FADE_FACTOR, (FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO)*FACT_FACTOR,
                FADE_IVAMONTO*FACT_FACTOR, FADE_DTOPORC, FADE_TOTAL*FACT_FACTOR, F.terc_nit, F.fact_nomcliente, f.fact_sucursal
                FROM FACTURAS F, FACTURAS_DETALLE D, PREFIJOS P
                WHERE F.FACT_ID = D.FACT_ID AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND F.TERC_NIT >= :TERINI AND F.TERC_NIT <= :TERFIN AND FACT_ANULADO = 'N'
                 AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) and substring(D.arti_cod from 1 FOR 2) <> '.t'
                ORDER BY f.terc_nit, f.fact_sucursal, ARTI_COD, FACT_FECHA, F.FACT_ID, FADE_ITEM
                INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :DTO, :TOTAL, :NIT, :nombre, :sucursal
                DO
                BEGIN
                SELECT ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO WHERE ARTI_COD = :ARTICULO
                    INTO :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC;
                SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                EXECUTE PROCEDURE costo_promedio (:ARTICULO, :FECHA) RETURNING_VALUES (:COSTOUNIT);
                COSTO = COSTOUNIT * CANTIDAD;
                UTILIDAD = BASE - COSTO;
                if (UOM = 'UTILIDAD') then
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                else
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
                SUSPEND;
                END
            END
    if (BIN_AND(TIPO, 2) <> 0) then
            BEGIN
            SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 32 INTO :NOMTIPO;
            FOR SELECT R.PREF_PRE, REVT_NUMERO, REVT_FECHA, ARTI_COD, RVDE_CANT * RVDE_FACTOR,
                (RVDE_TOTAL - RVDE_IVAMONTO), RVDE_IVAMONTO, RVDE_DTOPORC, RVDE_TOTAL, R.terc_nit, R.revt_nomterc, r.revt_sucursal
                FROM REMISIONES_VENTA R, REMISIONES_VENTA_DETALLE D, PREFIJOS P
                WHERE R.REVT_ID = D.REVT_ID AND REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN AND R.TERC_NIT >= :TERINI AND R.TERC_NIT <= :TERFIN AND REVT_ANULADO = 'N'
                 AND P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = 32 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                ORDER BY r.terc_nit, r.revt_sucursal, ARTI_COD, REVT_FECHA, R.REVT_ID, RVDE_ITEM
                INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :DTO, :TOTAL, :NIT, :nombre, :sucursal
                DO
                BEGIN
                SELECT ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO WHERE ARTI_COD = :ARTICULO
                    INTO :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC;
                SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                EXECUTE PROCEDURE costo_promedio (:ARTICULO, :FECHA) RETURNING_VALUES (:COSTOUNIT);
                COSTO = COSTOUNIT * CANTIDAD;
                UTILIDAD = BASE - COSTO;
                if (UOM = 'UTILIDAD') then
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                else
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
                SUSPEND;
                END
            END
    if (BIN_AND(TIPO, 4) <> 0) then
            BEGIN
            SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 33 INTO :NOMTIPO;
            FOR SELECT V.PREF_PRE, DEVT_NUMERO, DEVT_FECHA, ARTI_COD, DVDE_CANT * DVDE_FACTOR, (DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO)*DEVT_FACTOR,
                DVDE_IVAMONTO*DEVT_FACTOR, DVDE_DTOPORC, DVDE_TOTAL*DEVT_FACTOR, V.terc_nit, V.devt_nomterc, v.devt_sucursal
                FROM DEVOLUCIONES_VENTAS V, DEVOLUCIONES_VENTAS_DETALLE D, PREFIJOS P
                WHERE V.DEVT_ID = D.DEVT_ID AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND V.TERC_NIT >= :TERINI AND V.TERC_NIT <= :TERFIN AND DEVT_ANULADO = 'N'
                 AND P.PREF_PRE = V.PREF_PRE AND P.TIDO_COD = 33 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))  and substring(D.arti_cod from 1 FOR 2) <> '.t'
                ORDER BY v.terc_nit, v.devt_sucursal, ARTI_COD, DEVT_FECHA, D.DEVT_ID, DVDE_ITEM
                INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :DTO, :TOTAL, :NIT, :nombre, :sucursal
                DO
                BEGIN
                SELECT ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO WHERE ARTI_COD = :ARTICULO
                    INTO :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC;
                SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                EXECUTE PROCEDURE costo_promedio (:ARTICULO, :FECHA) RETURNING_VALUES (:COSTOUNIT);
                COSTO = COSTOUNIT * CANTIDAD;
                UTILIDAD = BASE - COSTO;
                if (UOM = 'UTILIDAD') then
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                else
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
                TOTAL = TOTAL * -1;
                IVA = IVA * -1;
                BASE = BASE * -1;
                CANTIDAD = CANTIDAD * -1;
                COSTO = COSTO * -1;
                UTILIDAD = UTILIDAD * -1;
                SUSPEND;
                END
            END
    if (BIN_AND(TIPO, 8) <> 0) then
            BEGIN
            SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 34 INTO :NOMTIPO;
            FOR SELECT P.PREF_PRE, PEDI_NUMERO, PEDI_FECHA, ARTI_COD, PEDE_CANT * PEDE_FACTOR, (PEDE_TOTAL-PEDE_IVAMONTO-PEDE_CONSUMO)*PEDI_FACTOR,
                PEDE_IVAMONTO*PEDI_FACTOR, PEDE_DTOPORC, PEDE_TOTAL*PEDI_FACTOR, P.terc_nit, P.pedi_nomterc, p.pedi_sucursal
                FROM PEDIDOS P, PEDIDOS_DETALLE D, PREFIJOS PR
                WHERE P.PEDI_ID = D.PEDI_ID AND PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND P.TERC_NIT >= :TERINI AND P.TERC_NIT <= :TERFIN AND PEDI_ANULADO = 'N'
                 AND P.PREF_PRE = PR.PREF_PRE AND P.TIDO_COD = 34 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                ORDER BY p.terc_nit, p.pedi_sucursal, ARTI_COD, PEDI_FECHA, P.PEDI_ID, PEDE_ITEM
                INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :DTO, :TOTAL, :NIT, :nombre, :sucursal
                DO
                BEGIN
                SELECT ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO WHERE ARTI_COD = :ARTICULO
                    INTO :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC;
                SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                EXECUTE PROCEDURE costo_promedio (:ARTICULO, :FECHA) RETURNING_VALUES (:COSTOUNIT);
                COSTO = COSTOUNIT * CANTIDAD;
                UTILIDAD = BASE - COSTO;
                if (UOM = 'UTILIDAD') then
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                else
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
                SUSPEND;
                END
            END
    if (BIN_AND(TIPO, 16) <> 0) then
            BEGIN
            SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 35 INTO :NOMTIPO;
            FOR SELECT C.PREF_PRE, COTI_NUMERO, COTI_FECHA, ARTI_COD, CTDE_CANT * CTDE_FACTOR, (CTDE_TOTAL-CTDE_IVAMONTO-CTDE_CONSUMO)*COTI_FACTOR,
                CTDE_IVAMONTO*COTI_FACTOR, CTDE_DTOPORC, CTDE_TOTAL*COTI_FACTOR, C.terc_nit, C.coti_nomterc, c.coti_sucursal
                FROM COTIZACIONES C, COTIZACIONES_DETALLE D, PREFIJOS P
                WHERE C.COTI_ID = D.COTI_ID AND ARTI_COD = :ARTICULO AND COTI_FECHA >= :FECINI AND COTI_FECHA <= :FECFIN AND C.TERC_NIT >= :TERINI AND C.TERC_NIT <= :TERFIN AND COTI_ANULADO = 'N'
                 AND P.PREF_PRE = C.PREF_PRE AND P.TIDO_COD = 35 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                ORDER BY c.terc_nit, c.coti_sucursal, COTI_FECHA, C.COTI_ID, CTDE_ITEM
                INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :DTO, :TOTAL, :NIT, :nombre, :sucursal
                DO
                BEGIN
                SELECT ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO WHERE ARTI_COD = :ARTICULO
                    INTO :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC;
                SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                EXECUTE PROCEDURE costo_promedio (:ARTICULO, :FECHA) RETURNING_VALUES (:COSTOUNIT);
                COSTO = COSTOUNIT * CANTIDAD;
                UTILIDAD = BASE - COSTO;
                if (UOM = 'UTILIDAD') then
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                else
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
                SUSPEND;
                END
            END
    END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure REP_UTILIDAD_VENDEDOR (
    TIPO integer,
    DETALLE char(1),
    VENINI varchar(20),
    VENFIN varchar(20),
    FECINI date,
    FECFIN date,
    ARTINI varchar(15),
    ARTFIN varchar(15),
    ORDEN char(1),
    CEROS char(1),
    SUBEMPRESA integer)
returns (
    CODVEND varchar(20),
    NOMVEND varchar(60),
    NOMTIPO varchar(50),
    ARTICULO varchar(15),
    DESCRIPCION varchar(60),
    CODGRUPO varchar(2),
    NOMGRUPO varchar(30),
    CODSUBG varchar(3),
    NOMSUBG varchar(30),
    CODMARC varchar(3),
    NOMMARC varchar(30),
    UNIDAD varchar(8),
    CANTIDAD numeric(18,4),
    BASE numeric(18,2),
    IVA numeric(18,2),
    CONSUMO numeric(18,2),
    COSTO numeric(18,2),
    UTILIDAD numeric(18,4),
    PORC numeric(9,2),
    TOTAL numeric(18,2),
    LISTA numeric(18,2),
    PREFIJO varchar(4),
    NUMERO varchar(6),
    FECHA date,
    DTO numeric(9,2))
AS
DECLARE VARIABLE COSTOUNIT NUMERIC(18,4);
DECLARE VARIABLE CANTDET NUMERIC(18,4);
DECLARE VARIABLE CODINI VARCHAR(15);
DECLARE VARIABLE CODFIN VARCHAR(15);
DECLARE VARIABLE DESINI VARCHAR(15);
DECLARE VARIABLE DESFIN VARCHAR(15);
declare variable UOM VARCHAR(20);
declare variable CODLISTA INTEGER;
declare variable ID INTEGER;
declare variable ITEM INTEGER;
BEGIN
if (ORDEN = 'C') then
    BEGIN
    CODINI = ARTINI;
    CODFIN = ARTFIN;
    DESINI = '';
    DESFIN = 'zz';
    END
ELSE
    BEGIN
    DESINI = ARTINI;
    DESFIN = ARTFIN;
    CODINI = '';
    CODFIN = 'zz';
    END
  EXECUTE PROCEDURE lee_configuracion ('FACTURACION', 'ARTICULOS', 'SUGERIR PRECIOS CON PORCENTAJE DE MARGEN O UTILIDAD') returning_values (:UOM);
  SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = :TIPO INTO :NOMTIPO;
  FOR select VEND_COD, VEND_NOMBRE
    from VENDEDORES
    where VEND_COD >= :VENINI AND VEND_COD <= :VENFIN
    INTO :CODVEND, :NOMVEND
    DO  
    BEGIN
    if (DETALLE = 'N') then
        BEGIN
        if (BIN_AND(TIPO, 1) <> 0) then
            BEGIN
            SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 31 INTO :NOMTIPO;
            /* BORRA LA TABLA AUXILIAR */
            DELETE FROM reportes_aux WHERE REPA_ID = 4 AND REPA_USER = USER;
            FOR SELECT MAX(D.ARTI_COD), SUM(FADE_CANT * FADE_FACTOR), SUM(FACT_FACTOR*(FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO)),
                SUM(FACT_FACTOR*FADE_IVAMONTO), SUM(FACT_FACTOR*FADE_TOTAL), SUM(FADE_CONSUMO),
                MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD)
                FROM FACTURAS_DETALLE D, FACTURAS F, PREFIJOS P, ARTICULO A
                WHERE F.FACT_ID = D.FACT_ID AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND VEND_COD = :CODVEND AND FACT_ANULADO = 'N'
                 AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) and substring(D.arti_cod from 1 FOR 2) <> '.t'
                 AND D.ARTI_COD = A.arti_cod AND A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN
                GROUP BY D.ARTI_COD
                INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :TOTAL, :CONSUMO,
                    :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                DO
                BEGIN
                COSTO = 0;
                FOR SELECT F.FACT_ID, FADE_ITEM, FADE_CANT * FADE_FACTOR, FACT_FECHA FROM FACTURAS_DETALLE D, FACTURAS F, PREFIJOS P
                    WHERE F.VEND_COD = :codvend AND F.FACT_ID = D.FACT_ID AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND
                    FACT_ANULADO = 'N' AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                    and D.ARTI_COD = :articulo  INTO :ID, :ITEM, :cantdet, :fecha
                    DO
                    BEGIN
                    if (EXISTS (SELECT COST_SALP / COST_SALC FROM COSTOS C, MOVIMIENTO_ARTICULO M
                        WHERE COST_IDMOV = MVAR_CONS AND MVAR_TIPODOC = 31 AND MVAR_IDREF = :ID AND COST_SALC <> 0 AND MVAR_ITEM = :ITEM)) then
                        SELECT COST_SALP / COST_SALC FROM COSTOS C, MOVIMIENTO_ARTICULO M
                            WHERE COST_IDMOV = MVAR_CONS AND MVAR_TIPODOC = 31 AND MVAR_IDREF = :ID AND COST_SALC <> 0 AND MVAR_ITEM = :ITEM INTO :costounit;
                    else
                        EXECUTE PROCEDURE COSTO_PROMEDIO(:ARTICULO, :FECHA) returning_values (:costounit);
                    COSTO = COSTO + costounit * cantdet;
                    END
                SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                if (CANTIDAD IS NULL) then
                    CANTIDAD = 0;
                if (BASE IS NULL) then
                    BASE = 0;
                if (IVA IS NULL) then
                    IVA = 0;
                UTILIDAD = BASE - COSTO;
                if (UOM = 'UTILIDAD') then
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                else
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
                if (CEROS = 'S') then
                    begin
                    INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (4, USER, :ARTICULO);
                    SUSPEND;
                    end
                ELSE
                    if ((BASE <> 0) AND (CANTIDAD <> 0)) then
                        SUSPEND;
                END
            if (CEROS = 'S') then
                BEGIN
                COSTO = 0;
                UTILIDAD = 0;
                PORC = 0;
                /* agregue los articulos sin factura */
                FOR SELECT ARTI_COD, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN and
                    not exists (select REPA_ARTICULO FROM REPORTES_AUX WHERE REPA_ID = 4 AND REPA_USER = USER AND REPA_ARTICULO = a.arti_cod)
                    INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                    DO
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        if (BIN_AND(TIPO, 2) <> 0) then
            BEGIN
            SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 32 INTO :NOMTIPO;
            FOR SELECT MAX(D.ARTI_COD), SUM(RVDE_CANT * RVDE_FACTOR), SUM(RVDE_TOTAL-RVDE_IVAMONTO-RVDE_CONSUMO), SUM(RVDE_IVAMONTO), SUM(RVDE_TOTAL), SUM(RVDE_CONSUMO),
                MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD)
                FROM REMISIONES_VENTA_DETALLE D, REMISIONES_VENTA R, PREFIJOS P, ARTICULO A
                WHERE R.REVT_ID = D.REVT_ID AND REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN AND VEND_COD = :CODVEND AND REVT_ANULADO = 'N'
                 AND P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = 32 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                 AND D.ARTI_COD = A.arti_cod AND A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN
                GROUP BY D.ARTI_COD
                INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :TOTAL, :CONSUMO,
                    :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                DO
                BEGIN
                COSTO = 0;
                FOR SELECT F.REVT_ID, RVDE_ITEM, RVDE_CANT * RVDE_FACTOR, REVT_FECHA FROM remisiones_venta_detalle D, remisiones_venta F, PREFIJOS P
                    WHERE F.VEND_COD = :codvend AND F.revt_id = D.revt_id AND REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN AND
                    REVT_ANULADO = 'N' AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 32 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                    and D.ARTI_COD = :articulo  INTO :ID, :ITEM, :cantdet, :fecha
                    DO
                    BEGIN
                    if (EXISTS (SELECT COST_SALP / COST_SALC FROM COSTOS C, MOVIMIENTO_ARTICULO M
                        WHERE COST_IDMOV = MVAR_CONS AND MVAR_TIPODOC = 32 AND MVAR_IDREF = :ID AND COST_SALC <> 0 AND MVAR_ITEM = :ITEM)) then
                        SELECT COST_SALP / COST_SALC FROM COSTOS C, MOVIMIENTO_ARTICULO M
                            WHERE COST_IDMOV = MVAR_CONS AND MVAR_TIPODOC = 32 AND MVAR_IDREF = :ID AND COST_SALC <> 0 AND MVAR_ITEM = :ITEM INTO :costounit;
                    else
                        EXECUTE PROCEDURE COSTO_PROMEDIO(:ARTICULO, :FECHA) returning_values (:costounit);
                    COSTO = COSTO + costounit * cantdet;
                    END
                SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                if (CANTIDAD IS NULL) then
                    CANTIDAD = 0;
                if (BASE IS NULL) then
                    BASE = 0;
                if (IVA IS NULL) then
                    IVA = 0;
                UTILIDAD = BASE - COSTO;
                if (UOM = 'UTILIDAD') then
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                else
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
                if (CEROS = 'S') then
                    begin
                    INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (4, USER, :ARTICULO);
                    SUSPEND;
                    end
                ELSE
                    if ((BASE <> 0) AND (CANTIDAD <> 0)) then
                        SUSPEND;
                END
            if (CEROS = 'S') then
                BEGIN
                COSTO = 0;
                UTILIDAD = 0;
                PORC = 0;
                /* agregue los articulos sin factura */
                FOR SELECT ARTI_COD, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN and
                    not exists (select REPA_ARTICULO FROM REPORTES_AUX WHERE REPA_ID = 4 AND REPA_USER = USER AND REPA_ARTICULO = a.arti_cod)
                    INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                    DO
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        if (BIN_AND(TIPO, 4) <> 0) then
            BEGIN
            SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 33 INTO :NOMTIPO;
            FOR SELECT MAX(D.ARTI_COD), SUM(DVDE_CANT * DVDE_FACTOR), SUM(DEVT_FACTOR*(DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO)),
                SUM(DEVT_FACTOR*DVDE_IVAMONTO), SUM(DEVT_FACTOR*DVDE_TOTAL), SUM(DVDE_CONSUMO),
                MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD)
                FROM devoluciones_ventas_detalle D, DEVOLUCIONES_VENTAS V, PREFIJOS P, ARTICULO A
                WHERE V.DEVT_ID = D.DEVT_ID AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND VEND_COD = :CODVEND AND DEVT_ANULADO = 'N'
                 AND P.PREF_PRE = V.PREF_PRE AND P.TIDO_COD = 33 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) and substring(D.arti_cod from 1 FOR 2) <> '.t'
                 AND D.ARTI_COD = A.arti_cod AND A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN
                GROUP BY D.ARTI_COD
                INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :TOTAL, :CONSUMO,
                    :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                DO
                BEGIN
                COSTO = 0;
                FOR SELECT F.DEVT_ID, DVDE_ITEM, DVDE_CANT * DVDE_FACTOR, DEVT_FECHA FROM devoluciones_ventas_detalle D, devoluciones_ventas F, PREFIJOS P
                    WHERE F.VEND_COD = :codvend AND F.devt_id = D.devt_id AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND
                    DEVT_ANULADO = 'N' AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 33 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                    and D.ARTI_COD = :articulo  INTO :ID, :ITEM, :cantdet, :fecha
                    DO
                    BEGIN
                    if (EXISTS (SELECT COST_ENTP / COST_ENTC FROM COSTOS C, MOVIMIENTO_ARTICULO M
                        WHERE COST_IDMOV = MVAR_CONS AND MVAR_TIPODOC = 33 AND MVAR_IDREF = :ID AND COST_ENTC <> 0 AND MVAR_ITEM = :ITEM)) then
                        SELECT COST_ENTP / COST_ENTC FROM COSTOS C, MOVIMIENTO_ARTICULO M
                            WHERE COST_IDMOV = MVAR_CONS AND MVAR_TIPODOC = 33 AND MVAR_IDREF = :ID AND COST_ENTC <> 0 AND MVAR_ITEM = :ITEM INTO :costounit;
                    else
                        EXECUTE PROCEDURE COSTO_PROMEDIO(:ARTICULO, :FECHA) returning_values (:costounit);
                    COSTO = COSTO + costounit * cantdet;
                    END
                SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                if (CANTIDAD IS NULL) then
                    CANTIDAD = 0;
                if (BASE IS NULL) then
                    BASE = 0;
                if (IVA IS NULL) then
                    IVA = 0;
                UTILIDAD = BASE - COSTO;
                if (UOM = 'UTILIDAD') then
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                else
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
                TOTAL = TOTAL * -1;
                IVA = IVA * -1;
                BASE = BASE * -1;
                CANTIDAD = CANTIDAD * -1;
                COSTO = COSTO * -1;
                UTILIDAD = UTILIDAD * -1;
                if (CEROS = 'S') then
                    begin
                    INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (4, USER, :ARTICULO);
                    SUSPEND;
                    end
                ELSE
                    if ((BASE <> 0) AND (CANTIDAD <> 0)) then
                        SUSPEND;
                END
            if (CEROS = 'S') then
                BEGIN
                COSTO = 0;
                UTILIDAD = 0;
                PORC = 0;
                /* agregue los articulos sin factura */
                FOR SELECT ARTI_COD, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN and
                    not exists (select REPA_ARTICULO FROM REPORTES_AUX WHERE REPA_ID = 4 AND REPA_USER = USER AND REPA_ARTICULO = a.arti_cod)
                    INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                    DO
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        if (BIN_AND(TIPO, 8) <> 0) then
            BEGIN
            SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 34 INTO :NOMTIPO;
            FOR SELECT MAX(D.ARTI_COD), SUM(PEDE_CANT * PEDE_FACTOR), SUM(PEDI_FACTOR*(PEDE_TOTAL-PEDE_IVAMONTO-PEDE_CONSUMO)),
                SUM(PEDI_FACTOR*PEDE_IVAMONTO), SUM(PEDI_FACTOR*PEDE_TOTAL), SUM(PEDE_CONSUMO),
                MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD)
                FROM PEDIDOS_DETALLE D, PEDIDOS P, PREFIJOS PR, articulo A
                WHERE P.PEDI_ID = D.PEDI_ID AND PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND VEND_COD = :CODVEND AND PEDI_ANULADO = 'N'
                 AND PR.PREF_PRE = P.PREF_PRE AND P.TIDO_COD = 34 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                 AND D.ARTI_COD = A.arti_cod AND A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN
                GROUP BY D.ARTI_COD
                INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :TOTAL, :CONSUMO,
                    :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                DO
                BEGIN
                COSTO = 0;
                FOR SELECT PEDE_CANT * PEDE_FACTOR, PEDI_FECHA FROM pedidos_detalle D, PEDIDOS F, PREFIJOS P
                    WHERE F.VEND_COD = :codvend AND F.pedi_id = D.pedi_id AND PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND
                    PEDI_ANULADO = 'N' AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 34 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                    and D.ARTI_COD = :articulo  INTO :cantdet, :fecha
                    DO
                    BEGIN
                    EXECUTE PROCEDURE COSTO_PROMEDIO(:ARTICULO, :FECHA) returning_values (:costounit);
                    COSTO = COSTO + costounit * cantdet;
                    END
                SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                if (CANTIDAD IS NULL) then
                    CANTIDAD = 0;
                if (BASE IS NULL) then
                    BASE = 0;
                if (IVA IS NULL) then
                    IVA = 0;
                UTILIDAD = BASE - COSTO;
                if (UOM = 'UTILIDAD') then
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                else
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
                if (CEROS = 'S') then
                    begin
                    INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (4, USER, :ARTICULO);
                    SUSPEND;
                    end
                ELSE
                    if ((BASE <> 0) AND (CANTIDAD <> 0)) then
                        SUSPEND;
                END
            if (CEROS = 'S') then
                BEGIN
                COSTO = 0;
                UTILIDAD = 0;
                PORC = 0;
                /* agregue los articulos sin factura */
                FOR SELECT ARTI_COD, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN and
                    not exists (select REPA_ARTICULO FROM REPORTES_AUX WHERE REPA_ID = 4 AND REPA_USER = USER AND REPA_ARTICULO = a.arti_cod)
                    INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                    DO
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        if (BIN_AND(TIPO, 16) <> 0) then
            BEGIN
            SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 35 INTO :NOMTIPO;
            FOR SELECT MAX(D.ARTI_COD), SUM(CTDE_CANT * CTDE_FACTOR), SUM(COTI_FACTOR*(CTDE_TOTAL-CTDE_IVAMONTO-CTDE_CONSUMO)),
                SUM(COTI_FACTOR*CTDE_IVAMONTO), SUM(COTI_FACTOR*CTDE_TOTAL), SUM(CTDE_CONSUMO),
                MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD)
                FROM COTIZACIONES_DETALLE D, COTIZACIONES C, PREFIJOS P, ARTICULO A
                WHERE C.COTI_ID = D.COTI_ID AND COTI_FECHA >= :FECINI AND COTI_FECHA <= :FECFIN AND VEND_COD = :CODVEND AND COTI_ANULADO = 'N'
                 AND P.PREF_PRE = C.PREF_PRE AND P.TIDO_COD = 35 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                 AND D.ARTI_COD = A.arti_cod AND A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN
                GROUP BY D.ARTI_COD
                INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :TOTAL, :CONSUMO,
                    :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                DO
                BEGIN
                COSTO = 0;
                FOR SELECT PEDE_CANT * PEDE_FACTOR, PEDI_FECHA FROM pedidos_detalle D, PEDIDOS F, PREFIJOS P
                    WHERE F.VEND_COD = :codvend AND F.pedi_id = D.pedi_id AND PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND
                    PEDI_ANULADO = 'N' AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 34 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                    and D.ARTI_COD = :articulo  INTO :cantdet, :fecha
                    DO
                    BEGIN
                    EXECUTE PROCEDURE COSTO_PROMEDIO(:ARTICULO, :FECHA) returning_values (:costounit);
                    COSTO = COSTO + costounit * cantdet;
                    END
                SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                if (CANTIDAD IS NULL) then
                    CANTIDAD = 0;
                if (BASE IS NULL) then
                    BASE = 0;
                if (IVA IS NULL) then
                    IVA = 0;
                COSTO = CANTIDAD * COSTOUNIT;
                UTILIDAD = BASE - COSTO;
                if (UOM = 'UTILIDAD') then
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                else
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
                if (CEROS = 'S') then
                    begin
                    INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (4, USER, :ARTICULO);
                    SUSPEND;
                    end
                ELSE
                    if ((BASE <> 0) AND (CANTIDAD <> 0)) then
                        SUSPEND;
                END
            if (CEROS = 'S') then
                BEGIN
                COSTO = 0;
                UTILIDAD = 0;
                PORC = 0;
                /* agregue los articulos sin factura */
                FOR SELECT ARTI_COD, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN and
                    not exists (select REPA_ARTICULO FROM REPORTES_AUX WHERE REPA_ID = 4 AND REPA_USER = USER AND REPA_ARTICULO = a.arti_cod)
                    INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                    DO
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        END
    ELSE
        BEGIN
        if (BIN_AND(TIPO, 1) <> 0) then
            BEGIN
            SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 31 INTO :NOMTIPO;
            FOR SELECT F.fact_id, D.fade_item, F.PREF_PRE, FACT_NUMERO, FACT_FECHA, ARTI_COD, FADE_CANT * FADE_FACTOR, (FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO)*FACT_FACTOR,
                FADE_IVAMONTO*FACT_FACTOR, FADE_DTOPORC, FADE_TOTAL*FACT_FACTOR, FADE_CONSUMO, D.lipr_cod
                FROM FACTURAS F, FACTURAS_DETALLE D, PREFIJOS P
                WHERE F.FACT_ID = D.FACT_ID AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND VEND_COD = :CODVEND AND FACT_ANULADO = 'N'
                 AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) and substring(D.arti_cod from 1 FOR 2) <> '.t'
                ORDER BY ARTI_COD, FACT_FECHA, F.FACT_ID, FADE_ITEM
                INTO :ID, :ITEM, :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :DTO, :TOTAL, :CONSUMO, :codlista
                DO
                BEGIN
                SELECT ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO WHERE ARTI_COD = :ARTICULO
                    INTO :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC;
                SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                if (EXISTS (SELECT COST_SALP / COST_SALC FROM COSTOS C, MOVIMIENTO_ARTICULO M
                    WHERE COST_IDMOV = MVAR_CONS AND MVAR_TIPODOC = 31 AND MVAR_IDREF = :ID AND COST_SALC <> 0 AND MVAR_ITEM = :ITEM)) then
                    SELECT COST_SALP / COST_SALC FROM COSTOS C, MOVIMIENTO_ARTICULO M
                        WHERE COST_IDMOV = MVAR_CONS AND MVAR_TIPODOC = 31 AND MVAR_IDREF = :ID AND COST_SALC <> 0 AND MVAR_ITEM = :ITEM INTO :costounit;
                else
                    EXECUTE PROCEDURE costo_promedio (:ARTICULO, :FECHA) RETURNING_VALUES (:COSTOUNIT);
                LISTA = 0;
                SELECT PRAR_FIJO FROM precios_articulo WHERE LIPR_COD = :CODLISTA AND ARTI_COD = :ARTICULO INTO :LISTA;
                COSTO = COSTOUNIT * CANTIDAD;
                UTILIDAD = BASE - COSTO;
                if (UOM = 'UTILIDAD') then
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                else
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
                if (CEROS = 'S') then
                    INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (4, USER, :ARTICULO);
                SUSPEND;
                END
            if (CEROS = 'S') then
                BEGIN
                COSTO = 0;
                UTILIDAD = 0;
                PORC = 0;
                /* agregue los articulos sin factura */
                FOR SELECT ARTI_COD, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN and
                    not exists (select REPA_ARTICULO FROM REPORTES_AUX WHERE REPA_ID = 4 AND REPA_USER = USER AND REPA_ARTICULO = a.arti_cod)
                    INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                    DO
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        if (BIN_AND(TIPO, 2) <> 0) then
            BEGIN
            SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 32 INTO :NOMTIPO;
            FOR SELECT R.REVT_ID, RVDE_ITEM, R.PREF_PRE, REVT_NUMERO, REVT_FECHA, ARTI_COD, RVDE_CANT * RVDE_FACTOR, (RVDE_TOTAL - RVDE_IVAMONTO), RVDE_IVAMONTO, RVDE_DTOPORC, RVDE_TOTAL, RVDE_CONSUMO, D.lipr_cod
                FROM REMISIONES_VENTA R, REMISIONES_VENTA_DETALLE D, PREFIJOS P
                WHERE R.REVT_ID = D.REVT_ID AND REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN AND VEND_COD = :CODVEND AND REVT_ANULADO = 'N'
                 AND P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = 32 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) and substring(D.arti_cod from 1 FOR 2) <> '.t'
                ORDER BY ARTI_COD, REVT_FECHA, R.REVT_ID, RVDE_ITEM
                INTO :ID, :ITEM, :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :DTO, :TOTAL, :CONSUMO, :codlista
                DO
                BEGIN
                SELECT ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO WHERE ARTI_COD = :ARTICULO
                    INTO :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC;
                SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                if (EXISTS (SELECT COST_SALP / COST_SALC FROM COSTOS C, MOVIMIENTO_ARTICULO M
                    WHERE COST_IDMOV = MVAR_CONS AND MVAR_TIPODOC = 32 AND MVAR_IDREF = :ID AND COST_SALC <> 0 AND MVAR_ITEM = :ITEM)) then
                    SELECT COST_SALP / COST_SALC FROM COSTOS C, MOVIMIENTO_ARTICULO M
                        WHERE COST_IDMOV = MVAR_CONS AND MVAR_TIPODOC = 32 AND MVAR_IDREF = :ID AND COST_SALC <> 0 AND MVAR_ITEM = :ITEM INTO :costounit;
                else
                    EXECUTE PROCEDURE costo_promedio (:ARTICULO, :FECHA) RETURNING_VALUES (:COSTOUNIT);
                LISTA = 0;
                SELECT PRAR_FIJO FROM precios_articulo WHERE LIPR_COD = :CODLISTA AND ARTI_COD = :ARTICULO INTO :LISTA;
                COSTO = COSTOUNIT * CANTIDAD;
                UTILIDAD = BASE - COSTO;
                if (UOM = 'UTILIDAD') then
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                else
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
                if (CEROS = 'S') then
                    INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (4, USER, :ARTICULO);
                SUSPEND;
                END
            if (CEROS = 'S') then
                BEGIN
                COSTO = 0;
                UTILIDAD = 0;
                PORC = 0;
                /* agregue los articulos sin factura */
                FOR SELECT ARTI_COD, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN and
                    not exists (select REPA_ARTICULO FROM REPORTES_AUX WHERE REPA_ID = 4 AND REPA_USER = USER AND REPA_ARTICULO = a.arti_cod)
                    INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                    DO
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        if (BIN_AND(TIPO, 4) <> 0) then
            BEGIN
            SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 33 INTO :NOMTIPO;
            FOR SELECT V.DEVT_ID, DVDE_ITEM, V.PREF_PRE, DEVT_NUMERO, DEVT_FECHA, ARTI_COD, DVDE_CANT * DVDE_FACTOR, (DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO)*DEVT_FACTOR,
                DVDE_IVAMONTO*DEVT_FACTOR, DVDE_DTOPORC, DVDE_TOTAL*DEVT_FACTOR, DVDE_CONSUMO
                FROM DEVOLUCIONES_VENTAS V, DEVOLUCIONES_VENTAS_DETALLE D, PREFIJOS P
                WHERE V.DEVT_ID = D.DEVT_ID AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND VEND_COD = :CODVEND AND DEVT_ANULADO = 'N'
                 AND P.PREF_PRE = V.PREF_PRE AND P.TIDO_COD = 33 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) and substring(D.arti_cod from 1 FOR 2) <> '.t'
                ORDER BY ARTI_COD, DEVT_FECHA, D.DEVT_ID, DVDE_ITEM
                INTO :ID, :ITEM, :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :DTO, :TOTAL, :CONSUMO
                DO
                BEGIN
                SELECT ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO WHERE ARTI_COD = :ARTICULO
                    INTO :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC;
                SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                if (EXISTS (SELECT COST_ENTP / COST_ENTC FROM COSTOS C, MOVIMIENTO_ARTICULO M
                    WHERE COST_IDMOV = MVAR_CONS AND MVAR_TIPODOC = 33 AND MVAR_IDREF = :ID AND COST_ENTC <> 0 AND MVAR_ITEM = :ITEM)) then
                    SELECT COST_ENTP / COST_ENTC FROM COSTOS C, MOVIMIENTO_ARTICULO M
                        WHERE COST_IDMOV = MVAR_CONS AND MVAR_TIPODOC = 33 AND MVAR_IDREF = :ID AND COST_ENTC <> 0 AND MVAR_ITEM = :ITEM INTO :costounit;
                else
                    EXECUTE PROCEDURE costo_promedio (:ARTICULO, :FECHA) RETURNING_VALUES (:COSTOUNIT);
                LISTA = 0;
                COSTO = COSTOUNIT * CANTIDAD;
                UTILIDAD = BASE - COSTO;
                if (UOM = 'UTILIDAD') then
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                else
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
                TOTAL = TOTAL * -1;
                IVA = IVA * -1;
                BASE = BASE * -1;
                CANTIDAD = CANTIDAD * -1;
                COSTO = COSTO * -1;
                UTILIDAD = UTILIDAD * -1;
                if (CEROS = 'S') then
                    INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (4, USER, :ARTICULO);
                SUSPEND;
                END
            if (CEROS = 'S') then
                BEGIN
                COSTO = 0;
                UTILIDAD = 0;
                PORC = 0;
                /* agregue los articulos sin factura */
                FOR SELECT ARTI_COD, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN and
                    not exists (select REPA_ARTICULO FROM REPORTES_AUX WHERE REPA_ID = 4 AND REPA_USER = USER AND REPA_ARTICULO = a.arti_cod)
                    INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                    DO
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        if (BIN_AND(TIPO, 8) <> 0) then
            BEGIN
            SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 34 INTO :NOMTIPO;
            FOR SELECT P.PREF_PRE, PEDI_NUMERO, PEDI_FECHA, ARTI_COD, PEDE_CANT * PEDE_FACTOR, (PEDE_TOTAL-PEDE_IVAMONTO-PEDE_CONSUMO)*PEDI_FACTOR,
                PEDE_IVAMONTO*PEDI_FACTOR, PEDE_DTOPORC, PEDE_TOTAL*PEDI_FACTOR, PEDE_CONSUMO, D.lipr_cod
                FROM PEDIDOS P, PEDIDOS_DETALLE D, PREFIJOS PR
                WHERE P.PEDI_ID = D.PEDI_ID AND PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND VEND_COD = :CODVEND AND PEDI_ANULADO = 'N'
                 AND P.PREF_PRE = PR.PREF_PRE AND P.TIDO_COD = 34 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                ORDER BY ARTI_COD, PEDI_FECHA, P.PEDI_ID, PEDE_ITEM
                INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :DTO, :TOTAL, :CONSUMO, :codlista
                DO
                BEGIN
                SELECT ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO WHERE ARTI_COD = :ARTICULO
                    INTO :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC;
                SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                EXECUTE PROCEDURE costo_promedio (:ARTICULO, :FECHA) RETURNING_VALUES (:COSTOUNIT);
                LISTA = 0;
                SELECT PRAR_FIJO FROM precios_articulo WHERE LIPR_COD = :CODLISTA AND ARTI_COD = :ARTICULO INTO :LISTA;
                COSTO = COSTOUNIT * CANTIDAD;
                UTILIDAD = BASE - COSTO;
                if (UOM = 'UTILIDAD') then
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                else
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
                if (CEROS = 'S') then
                    INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (4, USER, :ARTICULO);
                SUSPEND;
                END
            if (CEROS = 'S') then
                BEGIN
                COSTO = 0;
                UTILIDAD = 0;
                PORC = 0;
                /* agregue los articulos sin factura */
                FOR SELECT ARTI_COD, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN and
                    not exists (select REPA_ARTICULO FROM REPORTES_AUX WHERE REPA_ID = 4 AND REPA_USER = USER AND REPA_ARTICULO = a.arti_cod)
                    INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                    DO
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        if (BIN_AND(TIPO, 16) <> 0) then
            BEGIN
            SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 35 INTO :NOMTIPO;
            FOR SELECT C.PREF_PRE, COTI_NUMERO, COTI_FECHA, ARTI_COD, CTDE_CANT * CTDE_FACTOR, (CTDE_TOTAL-CTDE_IVAMONTO-CTDE_CONSUMO)*COTI_FACTOR,
                CTDE_IVAMONTO*COTI_FACTOR, CTDE_DTOPORC, CTDE_TOTAL*COTI_FACTOR, CTDE_CONSUMO, D.lipr_cod
                FROM COTIZACIONES C, COTIZACIONES_DETALLE D, PREFIJOS P
                WHERE C.COTI_ID = D.COTI_ID AND ARTI_COD = :ARTICULO AND COTI_FECHA >= :FECINI AND COTI_FECHA <= :FECFIN AND VEND_COD = :CODVEND AND COTI_ANULADO = 'N'
                 AND P.PREF_PRE = C.PREF_PRE AND P.TIDO_COD = 35 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                ORDER BY COTI_FECHA, C.COTI_ID, CTDE_ITEM
                INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :DTO, :TOTAL, :CONSUMO, :codlista
                DO
                BEGIN
                SELECT ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO WHERE ARTI_COD = :ARTICULO
                    INTO :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC;
                SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                LISTA = 0;
                SELECT PRAR_FIJO FROM precios_articulo WHERE LIPR_COD = :CODLISTA AND ARTI_COD = :ARTICULO INTO :LISTA;
                EXECUTE PROCEDURE costo_promedio (:ARTICULO, :FECHA) RETURNING_VALUES (:COSTOUNIT);
                COSTO = COSTOUNIT * CANTIDAD;
                UTILIDAD = BASE - COSTO;
                if (UOM = 'UTILIDAD') then
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                else
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
                if (CEROS = 'S') then
                    INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (4, USER, :ARTICULO);
                SUSPEND;
                END
            if (CEROS = 'S') then
                BEGIN
                COSTO = 0;
                UTILIDAD = 0;
                PORC = 0;
                /* agregue los articulos sin factura */
                FOR SELECT ARTI_COD, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN and
                    not exists (select REPA_ARTICULO FROM REPORTES_AUX WHERE REPA_ID = 4 AND REPA_USER = USER AND REPA_ARTICULO = a.arti_cod)
                    INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                    DO
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        END
    END
END
^

SET TERM ; ^

/* 20100215 */
/* multiple rows si hay mas de una contabilización */

SET TERM ^ ;

CREATE OR ALTER TRIGGER RECIBOS_CAJA_AU FOR RECIBOS_CAJA
ACTIVE AFTER UPDATE POSITION 0
AS
declare variable consec INTEGER;
BEGIN
/* Borre la contabilizacion */
if (new.reca_anulado = 'S') then
    begin
    for select enco_consec from comprobante_encabezado where enco_tiporef = 61 and enco_idref = old.reca_id into :consec
        do
        begin
        if (NOT consec is null) then
          delete from comprobante_detalle where enco_consec = :consec;
        delete from comprobante_encabezado where enco_tiporef = 61 and enco_idref = old.reca_id;
        end
    INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
        VALUES (USER, 61, NEW.reca_id, 'A', NEW.pref_pre || NEW.reca_numero);
    end

/* si existia un recibo provisional borrelo */
if ((old.reca_id <> 0) and (old.reca_anulado = 'N')) then
    if ((old.reca_provid is not null) and (old.reca_provid <> 0)) then
        update recibo_provisional set rcpr_idcruce = 0, rcpr_feccruce = null where rcpr_id = old.reca_provid;
if ((new.reca_id <> 0) and (new.reca_anulado = 'N')) then
    BEGIN
    if ((new.reca_provid is not null) and (new.reca_provid <> 0)) then
        update recibo_provisional set rcpr_idcruce = new.reca_id, rcpr_feccruce = new.reca_fecha where rcpr_id = new.reca_provid;
    INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
        VALUES (USER, 61, NEW.reca_id, 'U', NEW.pref_pre || NEW.reca_numero);
    END
/* si cambio fecha o numero actualice detalles */
if ((OLD.pref_pre <> NEW.pref_pre) or
    (OLD.reca_numero <> NEW.reca_numero) or
    (OLD.caja_id <> NEW.caja_id) or
    (OLD.reca_fecha <> NEW.reca_fecha)) then
    BEGIN
    UPDATE recibos_caja_pago SET RCPA_TRANSMIT = 'N' WHERE RECA_ID = NEW.RECA_ID;
    UPDATE recibos_caja_detalle SET RCDE_TRANSMIT = 'N' WHERE RECA_ID = NEW.RECA_ID;
    UPDATE recibos_caja_crucec SET RCCR_TRANSMIT = 'N' WHERE RECA_ID = NEW.RECA_ID;
    END
/* ACTUALICE EL ANULADO EN LOS DETALLES */
if (OLD.RECA_anulado <> NEW.RECA_anulado) then
    BEGIN
    UPDATE recibos_caja_pago SET RCPA_ANULADO = NEW.RECA_anulado WHERE RECA_ID = NEW.RECA_ID;
    UPDATE recibos_caja_detalle SET RCDE_ANULADO = NEW.RECA_anulado WHERE RECA_ID = NEW.RECA_ID;
    UPDATE recibos_caja_crucec SET RCCR_ANULADO = NEW.RECA_anulado WHERE RECA_ID = NEW.RECA_ID;
    END
if (OLD.reca_transmit <> NEW.reca_transmit) then
    BEGIN
    UPDATE recibos_caja_pago SET RCPA_TRANSMIT = NEW.reca_transmit WHERE RECA_ID = NEW.RECA_ID;
    UPDATE recibos_caja_detalle SET RCDE_TRANSMIT = NEW.reca_transmit WHERE RECA_ID = NEW.RECA_ID;
    UPDATE recibos_caja_crucec SET RCCR_TRANSMIT = NEW.reca_transmit WHERE RECA_ID = NEW.RECA_ID;
    END
END
^

SET TERM ; ^

/* 20100215B */
/* COMO TODO SE MULTIPLICA POR EL PESO, DEJE LA UNIDAD COMO GRAMO */
SET TERM ^ ;

CREATE OR ALTER procedure CONSOLIDE_PRODUCCION (
    PLANID integer)
AS
declare variable item integer;
declare variable artic varchar(20);
declare variable cant numeric(18,4);
declare variable cantpro numeric(18,4);
declare variable codcmp varchar(20);
declare variable cantcmp numeric(18,4);
declare variable porcmp float;
declare variable undcmp varchar(8);
declare variable factor float;
declare variable pesocmp numeric(18,4);
declare variable peso numeric(18,4);
declare variable merma numeric(18,4);
declare variable tipoord integer;
declare variable numrows integer;
declare variable total float;
declare variable descr varchar(60);
declare variable unidad varchar(8);
begin
ITEM = 0;
FOR SELECT ARTI_COD, PLPD_CANT * PLPD_FACTOR, PLPD_PESO
    from PLAN_PRODUCCION_DET WHERE PLPR_ID = :PLANID
    INTO :ARTIC, :CANTPRO, :PESO
    DO
    BEGIN
    select sum(arpr_porc) from articulos_producto where arti_cod = :artic into :total;
    FOR SELECT arpr_comp, ARPR_CANT, ARPR_UNIDAD, ARPR_PORC, ARTI_UNIDAD, ARTI_DES, arti_peso, arpr_merma
        from articulos_producto AP, ARTICULO A2
        WHERE AP.arpr_comp = A2.arti_cod AND AP.arti_cod = :ARTIC ORDER by ARPR_ITEM
        INTO :codcmp, :cantcmp, :undcmp, :porcmp, :unidad, :descr, :pesocmp, :MERMA
        DO
        BEGIN
        EXECUTE PROCEDURE factor_unidad_cant(:codcmp, :undcmp) returning_values (:FACTOR);
        if (((cantcmp is null) or (cantcmp = 0)) AND (PORCMP IS NOT NULL) AND (porcmp <> 0)) then
            BEGIN
            /* ES PORCENTUAL AL PESO LA MEZCLA SOBRE EL 1ER ARTICULO */
            CANT = cantpro * PESO;
            CANT = CANT / TOTAL * porcmp; /* APLICA LA PROPORCION */
            if ((MERMA IS NOT NULL) AND (MERMA <> 0)) then
                CANT = CANT / ((100 - MERMA) / 100);
            END
        ELSE
            BEGIN
            CANT = cantpro * CANTCMP * factor * pesocmp;
            END
        undcmp = 'GRAMO';

        SELECT COUNT(ARTI_COD) FROM articulos_producto WHERE ARTI_COD = :codcmp INTO :NUMROWS;
        if (NUMROWS <> 0) then
           TIPOORD = 19;
        else
            TIPOORD = 24;

        /* INSERTE O ACTUALICE EL COMPONENTE */
        if (NOT EXISTS (SELECT PLPC_ITEM FROM plan_produccion_cons WHERE PLPD_ID = :planid AND ARTI_COD = :codcmp)) then
            BEGIN
            ITEM = ITEM + 1;
            INSERT INTO plan_produccion_cons (PLPD_ID, PLPC_ITEM, PLPC_CODBAR, ARTI_COD, PLPC_CANT, PLPC_UNIDAD, PLPC_EXIST, PLPC_ORDENAR, PLPC_ORDENTIPO, PLPC_ORDENID, PLPC_ANULADO, PLPC_TRANSMIT, PLPC_DESC)
                VALUES (:planid, :item, :codcmp, :codcmp, :cant, :undcmp, 0, 0, :tipoord, 0, 'N', 'N', :descr);
            END
        ELSE
            UPDATE plan_produccion_cons SET PLPC_CANT = PLPC_CANT + :CANT
                WHERE PLPD_ID = :planid AND ARTI_COD = :codcmp;
        END
    END
end
^

SET TERM ; ^


/* 20100215C */
/* INGRESO DE MAT. SOBRANTE */
SET TERM ^ ;

CREATE OR ALTER procedure CONSOLIDE_PRODUCCION (
    PLANID integer)
AS
declare variable item integer;
declare variable artic varchar(20);
declare variable cant numeric(18,4);
declare variable cantpro numeric(18,4);
declare variable codcmp varchar(20);
declare variable cantcmp numeric(18,4);
declare variable porcmp float;
declare variable undcmp varchar(8);
declare variable factor float;
declare variable pesocmp numeric(18,4);
declare variable peso numeric(18,4);
declare variable merma numeric(18,4);
declare variable tipoord integer;
declare variable numrows integer;
declare variable total float;
declare variable descr varchar(60);
declare variable unidad varchar(8);
declare variable sobrante varchar(15);
declare variable porsob numeric(9,4);
declare variable fec date;
declare variable Pref varchar(4);
declare variable Num varchar(6);
declare variable Bod varchar(2);
begin
ITEM = 0;
select plpr_fecini, plpr_pref, plpr_numero, plpr_bodori from plan_produccion
    where plpr_id = :planid into :fec, :Pref, :Num, :Bod;
FOR SELECT D.ARTI_COD, PLPD_CANT * PLPD_FACTOR, PLPD_PESO, arti_sobrante, arti_porcsobr
    from PLAN_PRODUCCION_DET d, articulo ar
    WHERE d.arti_cod = ar.arti_cod and PLPR_ID = :PLANID
    INTO :ARTIC, :CANTPRO, :PESO, :sobrante, :porsob
    DO
    BEGIN
    select sum(arpr_porc) from articulos_producto where arti_cod = :artic into :total;
    FOR SELECT arpr_comp, ARPR_CANT, ARPR_UNIDAD, ARPR_PORC, ARTI_UNIDAD, ARTI_DES, arti_peso, arpr_merma
        from articulos_producto AP, ARTICULO A2
        WHERE AP.arpr_comp = A2.arti_cod AND AP.arti_cod = :ARTIC ORDER by ARPR_ITEM
        INTO :codcmp, :cantcmp, :undcmp, :porcmp, :unidad, :descr, :pesocmp, :MERMA
        DO
        BEGIN
        EXECUTE PROCEDURE factor_unidad_cant(:codcmp, :undcmp) returning_values (:FACTOR);
        if (((cantcmp is null) or (cantcmp = 0)) AND (PORCMP IS NOT NULL) AND (porcmp <> 0)) then
            BEGIN
            /* ES PORCENTUAL AL PESO LA MEZCLA SOBRE EL 1ER ARTICULO */
            CANT = cantpro * PESO;
            CANT = CANT / TOTAL * porcmp; /* APLICA LA PROPORCION */
            if ((MERMA IS NOT NULL) AND (MERMA <> 0)) then
                CANT = CANT / ((100 - MERMA) / 100);
            END
        ELSE
            BEGIN
            CANT = cantpro * CANTCMP * factor * pesocmp;
            END
        undcmp = 'GRAMO';

        SELECT COUNT(ARTI_COD) FROM articulos_producto WHERE ARTI_COD = :codcmp INTO :NUMROWS;
        if (NUMROWS <> 0) then
           TIPOORD = 19;
        else
            TIPOORD = 24;

        /* INSERTE O ACTUALICE EL COMPONENTE */
        if (NOT EXISTS (SELECT PLPC_ITEM FROM plan_produccion_cons WHERE PLPD_ID = :planid AND ARTI_COD = :codcmp)) then
            BEGIN
            ITEM = ITEM + 1;
            INSERT INTO plan_produccion_cons (PLPD_ID, PLPC_ITEM, PLPC_CODBAR, ARTI_COD, PLPC_CANT, PLPC_UNIDAD, PLPC_EXIST, PLPC_ORDENAR, PLPC_ORDENTIPO, PLPC_ORDENID, PLPC_ANULADO, PLPC_TRANSMIT, PLPC_DESC)
                VALUES (:planid, :item, :codcmp, :codcmp, :cant, :undcmp, 0, 0, :tipoord, 0, 'N', 'N', :descr);
            END
        ELSE
            UPDATE plan_produccion_cons SET PLPC_CANT = PLPC_CANT + :CANT
                WHERE PLPD_ID = :planid AND ARTI_COD = :codcmp;
        END
    /* ingrese el sobrante */
    if ((sobrante <> '') and (porsob <> 0)) then
      INSERT INTO MOVIMIENTO_ARTICULO
          (ARTI_COD, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM, TERC_NIT)
          VALUES(:sobrante, :bod, :FEC, 27, :planid, 'SOBRANTE PLAN PRODUCCION ' || :PREF || :num || ' ARTICULO:' || :ARTIC,
          :porsob * :total /100, 0, 'S', null, :Pref, :Num, 0, null);
    END
end
^

SET TERM ; ^


/* 20100219 */
/* SOLO ENSAMBLE LO QUE HAGA FALTA */
SET TERM ^ ;

CREATE OR ALTER TRIGGER MOVIMIENTO_ARTICULO_BI FOR MOVIMIENTO_ARTICULO
ACTIVE BEFORE INSERT POSITION 0
AS
declare variable LOTE CHAR(1);
declare variable ENSAMBLE CHAR(1);
declare variable IDENS INTEGER;
declare variable PREFENS VARCHAR(4);
declare variable unidad varchar(8);
declare variable DESCR varchar(60);
declare variable CODPR varchar(8);
declare variable DESPR varchar(60);
declare variable UNIPR varchar(8);
declare variable CANTPR numeric(18,4);
declare variable FACTOR numeric(18,4);
declare variable COSTO numeric(18,2);
declare variable COSTOTOT numeric(18,2);
declare variable PORCPR numeric(9,4);
declare variable MERMAPR numeric(9,4);
declare variable PESO numeric(18,4);
declare variable PESOPR numeric(18,4);
declare variable ITEM INTEGER;
declare variable IVA NUMERIC(9,4);
declare variable IVAM NUMERIC(18,2);
declare variable CONSUMO NUMERIC(18,2);
declare variable TOTAL NUMERIC(9,4);
declare variable SALDO NUMERIC(18,2);
BEGIN
/* INSERTE EL NUEVO LOTE */
SELECT ARTI_EXIST
    FROM   ARTICULO
    WHERE  ARTICULO.ARTI_COD = NEW.ARTI_COD
    INTO :LOTE;
if (LOTE = 'L') then
    BEGIN
      if ((NEW.mvar_lote IS NULL) or (NEW.mvar_lote = '')) then
        if (new.mvar_entrada = 'S') then
            new.mvar_lote = cast(new.mvar_cons as varchar(15));
        else
            begin
            /* NO HAY LOTE, ENTONCES CALCULELO SEGUN CONFIGURACION */
            EXCEPTION LOTE_NEGATIVO 'No se indicó un lote para el artículo ' || new.arti_cod;
            end
    END
/* ENSAMBLE EL PRODUCTO */
SELECT ARTI_ENSAMBLE, ARTI_UNIDAD, ARTI_DES, ARTI_PESO
    FROM ARTICULO WHERE ARTI_COD = NEW.arti_cod INTO :ensamble, :unidad, :descr, :peso;
if ((NEW.mvar_entrada = 'N') AND (ENSAMBLE = 'S')) then
    BEGIN
    EXECUTE PROCEDURE saldo_inventario(NEW.arti_cod, NEW.bode_cod, NEW.mvar_fecha) returning_values (:SALDO);
    if (saldo < NEW.mvar_cant) then
        BEGIN
        IDENS = gen_id(id_ensamble, 1);
        EXECUTE PROCEDURE lee_configuracion('INVENTARIO', 'ENSAMBLES', 'PREFIJO PARA ENSAMBLES AUTOMATICOS AL SACAR PRODUCTOS') returning_values (:prefens);
        INSERT INTO ENSAMBLES(ENSA_ID, TIDO_COD, PREF_PRE, BODE_COD, ENSA_NUMERO, ENSA_FECHA, ENSA_CONC, ENSA_REFER, ENSA_CANT, ENSA_UNIDAD, ENSA_FACTOR, ENSA_ANULADO, ENSA_TRANSMIT,
            ARTI_COD, ENSA_DESC, ENSA_CODBAR, ENSA_LOTE, ENSA_OBS, TERC_NIT, ENSA_USUARIO, NUMOK, ENSA_COSTO, LOTE_VENCE, ENSA_CODRETAL, ENSA_CANTRETAL, ENSA_OPER, ENSA_MAQUINA, ENSA_PESO, ENSA_BODRETAL, ENSA_TIPOREF, ENSA_IDREF)
            VALUES (:IDENS, 15, :prefens, NEW.bode_cod, '000001', new.mvar_fecha, new.mvar_conc, '', new.mvar_cant, :unidad, 1, 'N', 'N',
            NEW.arti_cod, :descr, NEW.arti_cod, NEW.mvar_lote, NULL, NULL, USER, 'N', NEW.mvar_costo, NULL, NULL, 0, null,  NULL, 0, NEW.bode_cod, NEW.mvar_tipodoc, NEW.mvar_idref);
        ITEM = 0;
        COSTOTOT = 0;
        select sum(arpr_porc) from articulos_producto where arti_cod = NEW.arti_cod into :total;
        FOR SELECT ARPR_CANT, ARPR_UNIDAD, ARPR_COMP, ARTI_DES, TAIV_PORC, ARTI_CONSUMO, ARPR_PORC, ARPR_MERMA, ARTI_PESO
            FROM articulos_producto P, ARTICULO A, TARIFA_IVA T
            WHERE P.ARTI_COD = NEW.arti_cod AND A.arti_cod = P.arpr_comp AND A.taiv_cod = T.taiv_cod
            INTO :CANTPR, :UNIPR, :CODPR, :DESPR, :IVA, :CONSUMO, :PORCPR, :MERMAPR, :PESOPR
            DO
            BEGIN
            ITEM = ITEM + 1;
            EXECUTE PROCEDURE costo_promedio_unidad (:codpr, NEW.mvar_fecha, :UNIPR) returning_values (:COSTO);
            EXECUTE PROCEDURE factor_unidad_cant(:codpr,  :unipr) returning_values (:FACTOR);
            IVAM = costo * cantpr * iva / 100;
            if (((cantpr is null) or (cantpr = 0)) AND (porcpr IS NOT NULL) AND (porcpr <> 0)) then
                BEGIN
                /* ES PORCENTUAL AL PESO LA MEZCLA SOBRE EL 1ER ARTICULO */
                CANTPR = NEW.mvar_cant * PESO;
                if ((mermapr IS NOT NULL) AND (mermapr <> 0)) then
                    CANTPR = CANTPR * (100 + mermapr) / 100;
                CANTPR = CANTPR * porcpr / TOTAL; /* APLICA LA PROPORCION */
                CANTPR = CANTPR / pesopr; /* LO LLEVA A LA UNIDAD PRINCIPAL */
                END
            COSTOTOT = COSTOTOT + COSTO * CANTPR;
            INSERT INTO ENSAMBLES_DETALLE(ENSA_ID, ESDE_ITEM, ARTI_COD, BODE_COD, ESDE_CANT, ESDE_UNIDAD, ESDE_COSTO, ESDE_LOTE, ESDE_FACTOR, ESDE_IVAPORC, ESDE_IVAMONTO, ESDE_CONSUMO, ESDE_CODBAR, ESDE_ANULADO, ESDE_TRANSMIT, ESDE_DESC, ESDE_TOTAL, ESDE_PESO)
                VALUES (:idens, :ITEM, :codpr,  NEW.bode_cod, :cantpr, :unipr, :costo, NULL, :FACTOR, :IVA, :ivam, :consumo, :codpr, 'N', 'N', :despr, :COSTO * :cantpr, 0);
            END
        UPDATE ENSAMBLES SET ENSA_COSTO = :costotot WHERE ENSA_ID = :idens;
        END
    END
if (new.mvar_cons is null) then
    NEW.mvar_cons = GEN_ID(ID_MOVARTI,1);
END
^

SET TERM ; ^

/* 20100219B */
/* MAL CALCULO DEL TOTAL AL ACTUALIZAR SALIDA_DETALLE */
SET TERM ^ ;

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

SET TERM ; ^


SET TERM ^ ;

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

SET TERM ; ^

/* 20100219C */
/* PREGUNTAR SI SE REPITEN ARTICULOS AL FACTURAR */
UPDATE CONFIGURACION
SET CONF_POSIBLES = 'SI,NO,PREGUNTAR'
WHERE (CONF_MODULO = 'FACTURACION') AND (CONF_CATEGORIA = 'DOCUMENTOS') AND (CONF_PROPIEDAD = 'PERMITIR VARIAS OCURRENCIAS DEL MISMO ARTICULO EN UN DOCUMENTO');
COMMIT WORK;

/* 20100219D */
/* OMITIR UNA REFERENCIA ESPECIFICA DE LA CONSOLIDACION DE PENDIENTES POR FACTURAR */

INSERT INTO CONFIGURACION (CONF_MODULO, CONF_CATEGORIA, CONF_PROPIEDAD, CONF_VALOR, CONF_POSIBLES, CONF_AYUDA) VALUES ('FACTURACION', 'DOCUMENTOS', 'CODIGO DE ARTICULO A OMITIR EN LA CONSOLIDACION DE PENDIENTES', '', '', 'Indique el código de artículo que se debe omitir de los pendientes por documento. Ejemplo obsequio');
commit work;

SET TERM ^ ;

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

if (CANT IS NULL) then
    CANT = 0;
if (ARTIC <> codomite) then
    BEGIN
    /* RECORRA LOS USOS EN CONSOLIDE_DOCS */
    SELECT SUM(COFA_CANT * COFA_FACTOR) FROM consolidado_faltantes
        WHERE COFA_TIPOORI = :tipori AND COFA_IDORI = :IDDOC AND COFA_ITEMORI = :ITEM AND COFA_TIPODES = :TIPDES AND COFA_OK = 'S'
        INTO :cantaux;
    if (CANTAUX IS NULL) then
        CANTAUX = 0;
    if (CANTAUX > (CANT * FACTOR)) then
        CANT = 0;
    ELSE
        CANT = ((CANT * FACTOR) - CANTAUX) / FACTOR;
    END
ELSE
    CANT = 0;
suspend;
end
^

SET TERM ; ^

SET TERM ^ ;

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

^

SET TERM ; ^

SET TERM ^ ;

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

^

SET TERM ; ^

SET TERM ^ ;

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

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

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE EXISTENCIAS_COMPRAS(
    ARTICULO VARCHAR(15),
    FECHA DATE,
    UNIDAD VARCHAR(8))
RETURNS (
    BODEGA VARCHAR(2),
    EXISTENCIA NUMERIC(18,2),
    RESERVADO NUMERIC(18,2),
    ORDENADO NUMERIC(18,2),
    PROMEDIO NUMERIC(18,2),
    VENTAMES NUMERIC(18,2),
    FECHACMP DATE,
    CANTCMP NUMERIC(18,2),
    DIAS INTEGER,
    SUGERIDO NUMERIC(18,2),
    STAND VARCHAR(20))
AS
declare variable FACTOR NUMERIC(15,4);
declare variable ORDENC NUMERIC(18,4);
declare variable PEDIDO NUMERIC(18,4);
declare variable ITEM INTEGER;
declare variable ID INTEGER;
declare variable UND VARCHAR(8);
declare variable CANT NUMERIC(18,4);
declare variable FACTOR2 NUMERIC(18,4);
declare variable fecini DATE;
declare variable FECHAAUX VARCHAR(10);
declare variable AGENCIA INTEGER;
declare variable DEVMES NUMERIC(18,2);
declare variable MFAC INTEGER;
declare variable MDEV INTEGER;
declare variable IVAF NUMERIC(18,2);
declare variable IVAD NUMERIC(18,2);
declare variable DIA_ART VARCHAR(2) CHARACTER SET NONE;
declare variable DIASC VARCHAR(255);
declare variable PEDAUTO CHAR(2);
declare variable SALIDAS NUMERIC(18,4);
BEGIN
  for select bode_cod, SUCU_ID from bodega into :bodega, :agencia
    do
    begin
    execute procedure saldo_inventario (:articulo, :bodega, :fecha) returning_values (:Existencia);
    EXECUTE PROCEDURE FACTOR_UNIDAD_CANT(:ARTICULO, :UNIDAD) returning_values (:FACTOR);
    if (FACTOR <> 0) then
        EXISTENCIA = EXISTENCIA / FACTOR;
    else
        EXISTENCIA = 0;
    STAND = '';
    SELECT STAND_COD FROM STANDS WHERE ARTI_COD = :ARTICULO AND STAND_BODEGA = :BODEGA INTO :stand;
    EXECUTE PROCEDURE promedio_salidas_articulo (:ARTICULO, :FECHA, :BODEGA) returning_values (:PROMEDIO, :SALIDAS);
    EXECUTE PROCEDURE lee_configuracion ('INVENTARIO', 'EXISTENCIAS', 'PROMEDIAR LAS SALIDAS DEL INVENTARIO CON EL NUMERO DE DIAS ASIGNADO A CADA ARTICULO') returning_values (:DIA_ART);
    if (DIA_ART = 'NO') then
        BEGIN
        EXECUTE PROCEDURE lee_configuracion ('INVENTARIO', 'EXISTENCIAS', 'NUMERO DE DIAS PARA PROMEDIO DE SALIDAS POR ARTICULO') returning_values (DIASC);
        DIAS = CAST(DIASC AS INTEGER);
        END
    ELSE
        SELECT ARTI_DIAS FROM ARTICULO WHERE ARTI_COD = :ARTICULO INTO :DIAS;
    if (DIAS is null) then
        DIAS = 0;
    PROMEDIO = DIAS * PROMEDIO;
    if (FACTOR <> 0) then
        PROMEDIO = PROMEDIO / FACTOR;
    SUGERIDO = PROMEDIO - EXISTENCIA;
    SELECT SUM(ORID_ENTREGAR)
      FROM ORDENINVENTARIO_DETALLE OD, ordenes_inventario O
      WHERE O.ORIN_ID = OD.ORIN_ID AND ARTI_COD = :ARTICULO AND ORIN_FECHA <= :FECHA AND ORIN_FECLLEGA >= :FECHA AND ORID_ANULADO = 'N' AND OD.BODE_COD = :BODEGA
      INTO :ORDENADO;
    if (ORDENADO IS NULL) then
        ORDENADO = 0;
    ORDENC = 0;
    FOR SELECT O.ORDC_ID, OCDE_ITEM, OCDE_CANT * OCDE_FACTOR
        FROM ORDENES_COMPRA O, ORDENES_COMPRA_DETALLE OD
        WHERE O.ORDC_ID = OD.ORDC_ID AND OD.ARTI_COD = :ARTICULO AND (ORDC_FECHA+ORDC_VALIDEZ) >= :FECHA AND ORDC_FECHA <= :FECHA AND OCDE_ANULADO = 'N' AND OD.BODE_COD = :BODEGA
        INTO :ID, :ITEM, :CANT
        do
        BEGIN
        EXECUTE PROCEDURE FALTANTE(23, 21, ID, ITEM) returning_values (PEDIDO, UND, FACTOR2);
        if (PEDIDO * FACTOR2 = CANT) then /* SI NO SE HA FACTURADO MIRE A VER SI SE REMISIONO */
            EXECUTE PROCEDURE FALTANTE(23, 22, ID, ITEM) returning_values (PEDIDO, UND, FACTOR2);
        if (PEDIDO IS NULL) then
            PEDIDO = 0;
        ORDENC = ORDENC + PEDIDO * FACTOR2;
        END
    ORDENADO = ORDENADO + ORDENC;
    if (FACTOR <> 0) then
        ORDENADO = ORDENADO / FACTOR;
    SELECT SUM(RSDE_LIBERAR)
      FROM RESERVAS_DETALLE RD, RESERVAS R
      WHERE R.RESE_ID = RD.RESE_ID AND ARTI_COD = :ARTICULO AND RESE_FECHA <= :FECHA AND RESE_VENCE >= :FECHA AND RD.BODE_COD = :BODEGA AND RSDE_ANULADO = 'N'
      INTO :RESERVADO;
    if (RESERVADO IS NULL) then
        RESERVADO = 0;
    PEDIDO = 0;
    FOR SELECT P.PEDI_ID, PEDE_ITEM, PEDE_CANT * PEDE_FACTOR
        FROM PEDIDOS P, PEDIDOS_DETALLE PD
        WHERE P.PEDI_ID = PD.PEDI_ID AND PD.ARTI_COD = :ARTICULO AND (PEDI_FECHA+PEDI_VALIDEZ) >= :FECHA AND PEDI_FECHA <= :FECHA AND PEDE_ANULADO = 'N' AND BODE_COD = :BODEGA
        INTO :ID, :ITEM, :CANT
        do
        BEGIN
        EXECUTE PROCEDURE FALTANTE(34, 31, ID, ITEM) returning_values (ORDENC, UND, FACTOR2);
        EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION', 'FACTURAS', 'GENERAR PEDIDO AUTOMATICAMENTE CON LA FACTURA') returning_values (pedauto);
        if ((ORDENC * FACTOR2 = CANT) or (PEDAUTO = 'SI')) then /* SI NO SE HA FACTURADO MIRE A VER SI SE REMISIONO */
            EXECUTE PROCEDURE FALTANTE(34, 32, ID, ITEM) returning_values (ORDENC, UND, FACTOR2);
        if (ORDENC IS NULL) then
            ORDENC = 0;
        PEDIDO = PEDIDO + ORDENC * FACTOR2;
        END
    RESERVADO = RESERVADO + PEDIDO;
    if (FACTOR <> 0) then
        RESERVADO = RESERVADO / FACTOR;
    /* VENTAS MES */
    FECHAAUX = CAST (FECHA AS VARCHAR(10));
    FECHAAUX = SUBSTR(FECHAAUX, 1, 7) || '/01';
    FECINI = CAST (FECHAAUX AS DATE);
    EXECUTE PROCEDURE ventas_articulo (:ARTICULO, :FECINI, :FECHA, :agencia) returning_values (:ventames, :mfac, :devmes, :mdev, :ivaf, :ivad);
    ventames = ventames - devmes;
    if (FACTOR <> 0) then
        ventames = ventames / FACTOR;
    /* FECHA COMPRA */
    fechacmp = null;
    cantcmp = 0;
    SELECT FIRST 1 FACO_FECHA, FCDE_CANT * FCDE_FACTOR FROM FACTURAS_COMPRA F, FACTURAS_COMPRAS_DETALLE D
        WHERE F.FACO_ID = D.faco_id AND D.ARTI_COD = :articulo AND FACO_FECHA <= :FECHA AND D.bode_cod = :BODEGA
        ORDER BY FACO_FECHA DESC, F.FACO_ID DESC
        INTO :fechacmp, :cantcmp;
    SUSPEND;
    end
END

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE EXISTENCIAS_DESDE_HASTA(
    FECHA DATE,
    ARTINI VARCHAR(20),
    ARTFIN VARCHAR(20),
    GRPINI VARCHAR(3),
    GRPFIN VARCHAR(3),
    BODINI VARCHAR(2),
    BODFIN VARCHAR(2),
    ORDEN CHAR(1),
    AGRUPA CHAR(1),
    DETALLE CHAR(1),
    RESERVA CHAR(1),
    ENPESO CHAR(1),
    MASIVA CHAR(1),
    SUCURSAL INTEGER)
RETURNS (
    CANT NUMERIC(18,4),
    COSTO NUMERIC(18,2),
    COSTO_LOTE NUMERIC(18,2),
    CODIGO VARCHAR(15),
    NOMBRE VARCHAR(60),
    UNIDAD VARCHAR(8),
    STAND VARCHAR(20),
    CODGRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    CODSUBG VARCHAR(3),
    NOMSUBG VARCHAR(30),
    CODMARC VARCHAR(3),
    NOMMARC VARCHAR(30),
    CODBOD VARCHAR(2),
    LOTE VARCHAR(15),
    NOMBOD VARCHAR(30),
    COSTOTOT NUMERIC(18,2),
    ULTCOSTO NUMERIC(18,2),
    FECHACOSTO DATE,
    CONSUMO NUMERIC(18,2),
    RESERVADO NUMERIC(18,4),
    ORDENADO NUMERIC(18,4),
    IVA NUMERIC(9,2),
    PESOUNIT NUMERIC(18,4),
    PESOTOTAL NUMERIC(18,4),
    PRECIO NUMERIC(18,2),
    CODBAR VARCHAR(20))
AS
declare variable exist char(1);
declare variable codini varchar(20);
declare variable codfin varchar(20);
declare variable desini varchar(20);
declare variable desfin varchar(20);
declare variable ordenc numeric(18,4);
declare variable pedido numeric(18,4);
declare variable ok char(1);
declare variable id integer;
declare variable item integer;
declare variable und varchar(8);
declare variable factor numeric(18,4);
declare variable cant2 numeric(18,4);
declare variable PEDAUTO CHAR(2);
DECLARE VARIABLE LISTA INTEGER;
BEGIN
EXECUTE PROCEDURE lee_configuracion ('FACTURACION','FACTURAS', 'CODIGO DE LA LISTA DE PRECIOS A MOSTRAR EN ARTICULOS') returning_values (:LISTA);
if (ORDEN = 'C') then
    BEGIN
    CODINI = ARTINI;
    CODFIN = ARTFIN;
    DESINI = '';
    DESFIN = 'zz';
    END
ELSE
    BEGIN
    DESINI = ARTINI;
    DESFIN = ARTFIN;
    CODINI = '';
    CODFIN = 'zz';
    END
EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION', 'FACTURAS', 'GENERAR PEDIDO AUTOMATICAMENTE CON LA FACTURA') returning_values (pedauto);
if (DETALLE = 'B') then
  BEGIN
  FOR SELECT ARTI_COD, ARTI_DES, ARTI_UNIDAD, ARTI_EXIST, TAIV_PORC, A.GRUP_COD, A.SUBG_COD, A.MARC_COD, BODE_COD, BODE_NOM, ARTI_CONSUMO, ARTI_PESO/1000
      FROM ARTICULO A, BODEGA B, TARIFA_IVA T
      WHERE ARTI_COD >= :CODINI AND ARTI_COD <= :CODFIN AND ARTI_DES >= :DESINI AND ARTI_DES <= :DESFIN AND ESAR_COD <> 'I' AND BODE_COD >= :BODINI AND
      BODE_COD <= :BODFIN AND ((SUCU_ID = :SUCURSAL) or (:SUCURSAL = 0)) AND A.TAIV_COD = T.TAIV_COD
      INTO :CODIGO, :NOMBRE, :UNIDAD, :EXIST, :IVA, :CODGRUPO, :CODSUBG, :CODMARC, :CODBOD, :NOMBOD, :CONSUMO, :pesounit
      DO
        BEGIN
        STAND = '';
        OK = 'N';
        if (AGRUPA = 'G') then
            BEGIN
            if ((CODGRUPO >= GRPINI) AND (CODGRUPO <= GRPFIN)) then
                OK = 'S';
            end
        ELSE
            if (AGRUPA = 'M') then
                BEGIN
                if ((CODMARC >= GRPINI) AND (CODMARC <= GRPFIN)) then
                    OK = 'S';
                END
        if (OK = 'S') then
            BEGIN
            NOMGRUPO = '';
            NOMMARC = '';
            NOMSUBG = '';
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            SELECT MAX(COBA_COD) FROM BARRAS_ARTICULO WHERE ARTI_COD = :codigo AND COBA_UNIDAD = :unidad INTO :codbar;
            if (CODBAR IS NULL) then
                CODBAR = CODIGO;
            if (EXIST <> 'N') then
                BEGIN
                SELECT STAND_COD FROM STANDS WHERE ARTI_COD = :CODIGO AND STAND_BODEGA = :CODBOD INTO :STAND;
                EXECUTE PROCEDURE SALDO_INICIAL_INVENTARIO(CODIGO, FECHA, :CODBOD) returning_values (CANT);
                EXECUTE PROCEDURE costo_promedio_y_ultimo_unidad(CODIGO, FECHA, UNIDAD) returning_values (COSTO, ULTCOSTO);
                SELECT MAX(MVAR_FECHA) FROM MOVIMIENTO_ARTICULO WHERE ARTI_COD = :CODIGO AND MVAR_ENTRADA = 'S' AND MVAR_FECHA <= :FECHA INTO :FECHACOSTO;
                if (MASIVA = 'S') then
                    COSTO = COSTO * (100 + :IVA) / 100 + :CONSUMO;
                COSTOTOT = :CANT * :COSTO;
                CONSUMO = CONSUMO * CANT;
                if (RESERVA = 'S') then
                    BEGIN
                    SELECT SUM(ORID_ENTREGAR)
                        FROM ORDENINVENTARIO_DETALLE OD, ordenes_inventario O
                        WHERE O.ORIN_ID = OD.ORIN_ID AND ARTI_COD = :CODIGO AND ORIN_FECHA <= :FECHA AND ORIN_FECLLEGA >= :FECHA AND ORID_ANULADO = 'N' AND OD.BODE_COD = :CODBOD
                        INTO :ORDENADO;
                    if (ORDENADO IS NULL) then
                        ORDENADO = 0;
                    ORDENC = 0;
                    FOR SELECT O.ORDC_ID, OCDE_ITEM, OCDE_CANT * OCDE_FACTOR
                        FROM ORDENES_COMPRA O, ORDENES_COMPRA_DETALLE OD
                        WHERE O.ORDC_ID = OD.ORDC_ID AND OD.ARTI_COD = :CODIGO AND ORDC_VENCE >= :FECHA AND ORDC_FECHA <= :FECHA AND OCDE_ANULADO = 'N' AND OD.BODE_COD = :CODBOD
                        INTO :ID, :ITEM, :CANT2
                        do
                        BEGIN
                        EXECUTE PROCEDURE FALTANTE(23, 21, ID, ITEM) returning_values (PEDIDO, UND, FACTOR);
                        if (PEDIDO * FACTOR = CANT2) then /* SI NO SE HA FACTURADO MIRE A VER SI SE REMISIONO */
                            EXECUTE PROCEDURE FALTANTE(23, 22, ID, ITEM) returning_values (PEDIDO, UND, FACTOR);
                        if (PEDIDO IS NULL) then
                            PEDIDO = 0;
                        ORDENC = ORDENC + PEDIDO * FACTOR;
                        END
                    ORDENADO = ORDENADO + ORDENC;
                    SELECT SUM(RSDE_LIBERAR)
                        FROM RESERVAS_DETALLE RD, RESERVAS R
                        WHERE R.RESE_ID = RD.RESE_ID AND ARTI_COD = :CODIGO AND RESE_FECHA <= :FECHA AND RESE_VENCE >= :FECHA AND RD.BODE_COD = :CODBOD AND RSDE_ANULADO = 'N'
                        INTO :RESERVADO;
                    if (RESERVADO IS NULL) then
                        RESERVADO = 0;
                    PEDIDO = 0;
                    FOR SELECT P.PEDI_ID, PEDE_ITEM, PEDE_CANT * PEDE_FACTOR
                        FROM PEDIDOS P, PEDIDOS_DETALLE PD
                        WHERE P.PEDI_ID = PD.PEDI_ID AND PD.ARTI_COD = :CODIGO AND PEDI_VENCE >= :FECHA AND PEDI_FECHA <= :FECHA AND PEDE_ANULADO = 'N' AND BODE_COD = :CODBOD
                        INTO :ID, :ITEM, :CANT2
                        do
                        BEGIN
                        EXECUTE PROCEDURE FALTANTE(34, 31, ID, ITEM) returning_values (ORDENC, UND, FACTOR);
                        if ((ORDENC * FACTOR = CANT2) or (PEDAUTO = 'SI')) then /* SI NO SE HA FACTURADO MIRE A VER SI SE REMISIONO */
                            EXECUTE PROCEDURE FALTANTE(34, 32, ID, ITEM) returning_values (ORDENC, UND, FACTOR);
                        if (ORDENC IS NULL) then
                            ORDENC = 0;
                        PEDIDO = PEDIDO + ORDENC * FACTOR;
                        END
                    RESERVADO = RESERVADO + PEDIDO;
                    END
                ELSE
                    BEGIN
                    RESERVADO = 0;
                    ORDENADO = 0;
                    END
                if (LISTA > 0) then
                    SELECT prar_fijo FROM precios_articulo WHERE arti_cod = :CODIGO and lipr_cod = :LISTA INTO :PRECIO;
                if (ENPESO = 'S') then
                    BEGIN
                    if (pesounit IS NULL) then
                        pesounit = 0;
                    if (PESOUNIT <> 0) then
                        BEGIN
                        pesototal = PESOUNIT * cant;
                        SUSPEND;
                        END
                    END
                ELSE
                    SUSPEND;
                END
            END
        END
  END

if (DETALLE = 'L') then
  BEGIN
  FOR SELECT A.ARTI_COD, ARTI_DES, ARTI_UNIDAD, ARTI_EXIST, TAIV_PORC, A.GRUP_COD, A.SUBG_COD, A.MARC_COD, L.lote_nro, L.lote_nro||' - '||L.lote_vence, ARTI_CONSUMO,l.bode_cod, L.lote_saldo,l.lote_costo, ARTI_PESO/1000
      FROM ARTICULO A, LOTES l, TARIFA_IVA T
      WHERE A.ARTI_COD >= '0' AND A.ARTI_COD <= 'zz' AND ARTI_DES >= '' AND ARTI_DES <= 'zz' AND ESAR_COD <> 'I' AND A.TAIV_COD = T.TAIV_COD and a.arti_cod = l.arti_cod
      INTO :CODIGO, :NOMBRE, :UNIDAD, :EXIST, :IVA, :CODGRUPO, :CODSUBG, :CODMARC, :LOTE, :NOMBOD, :CONSUMO, :codbod, :cant, :costo_lote, :pesounit
      DO
        BEGIN
        OK = 'N';
        if (AGRUPA = 'G') then
            BEGIN
            if ((CODGRUPO >= GRPINI) AND (CODGRUPO <= GRPFIN)) then
                OK = 'S';
            end
        ELSE
            if (AGRUPA = 'M') then
                BEGIN
                if ((CODMARC >= GRPINI) AND (CODMARC <= GRPFIN)) then
                    OK = 'S';
                END
        if (OK = 'S') then
            BEGIN
            NOMGRUPO = '';
            NOMMARC = '';
            NOMSUBG = '';
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            SELECT MAX(COBA_COD) FROM BARRAS_ARTICULO WHERE ARTI_COD = :codigo AND COBA_UNIDAD = :unidad INTO :codbar;
            if (CODBAR IS NULL) then
                CODBAR = CODIGO;

            if (EXIST <> 'N') then
                BEGIN
                EXECUTE PROCEDURE COSTO_PROMEDIO_UNIDAD(CODIGO, FECHA, UNIDAD) returning_values (COSTO);
                EXECUTE PROCEDURE ULTIMO_COSTO(CODIGO, FECHA, UNIDAD) returning_values (ULTCOSTO);
                SELECT MAX(MVAR_FECHA) FROM MOVIMIENTO_ARTICULO WHERE ARTI_COD = :CODIGO AND MVAR_ENTRADA = 'S' AND MVAR_FECHA <= :FECHA INTO :FECHACOSTO;
                if (MASIVA = 'S') then
                    COSTO = COSTO * (100 + :IVA) / 100 + :CONSUMO;
                COSTOTOT = :CANT * :COSTO;
                CONSUMO = CONSUMO * CANT;
                if (RESERVA = 'S') then
                    BEGIN
                    SELECT SUM(ORID_ENTREGAR)
                        FROM ORDENINVENTARIO_DETALLE OD, ordenes_inventario O
                        WHERE O.ORIN_ID = OD.ORIN_ID AND ARTI_COD = :CODIGO AND ORIN_FECHA <= :FECHA AND ORIN_FECLLEGA >= :FECHA AND ORID_ANULADO = 'N'
                        INTO :ORDENADO;
                    if (ORDENADO IS NULL) then
                        ORDENADO = 0;
                    ORDENC = 0;
                    FOR SELECT O.ORDC_ID, OCDE_ITEM, OCDE_CANT * OCDE_FACTOR
                        FROM ORDENES_COMPRA O, ORDENES_COMPRA_DETALLE OD
                        WHERE O.ORDC_ID = OD.ORDC_ID AND OD.ARTI_COD = :CODIGO AND ORDC_VENCE >= :FECHA AND ORDC_FECHA <= :FECHA AND OCDE_ANULADO = 'N'
                        INTO :ID, :ITEM, :CANT2
                        do
                        BEGIN
                        EXECUTE PROCEDURE FALTANTE(23, 21, ID, ITEM) returning_values (PEDIDO, UND, FACTOR);
                        if (PEDIDO * FACTOR = CANT2) then /* SI NO SE HA FACTURADO MIRE A VER SI SE REMISIONO */
                            EXECUTE PROCEDURE FALTANTE(23, 22, ID, ITEM) returning_values (PEDIDO, UND, FACTOR);
                        if (PEDIDO IS NULL) then
                            PEDIDO = 0;
                        ORDENC = ORDENC + PEDIDO * FACTOR;
                        END
                    ORDENADO = ORDENADO + ORDENC;
                    SELECT SUM(RSDE_LIBERAR)
                        FROM RESERVAS_DETALLE RD, RESERVAS R
                        WHERE R.RESE_ID = RD.RESE_ID AND ARTI_COD = :CODIGO AND RESE_FECHA <= :FECHA AND RESE_VENCE >= :FECHA AND RSDE_ANULADO = 'N'
                        INTO :RESERVADO;
                    if (RESERVADO IS NULL) then
                        RESERVADO = 0;
                    PEDIDO = 0;
                    FOR SELECT P.PEDI_ID, PEDE_ITEM, PEDE_CANT * PEDE_FACTOR
                        FROM PEDIDOS P, PEDIDOS_DETALLE PD
                        WHERE P.PEDI_ID = PD.PEDI_ID AND PD.ARTI_COD = :CODIGO AND PEDI_VENCE >= :FECHA AND PEDI_FECHA <= :FECHA AND PEDE_ANULADO = 'N'
                        INTO :ID, :ITEM, :CANT2
                        do
                        BEGIN
                        EXECUTE PROCEDURE FALTANTE(34, 31, ID, ITEM) returning_values (ORDENC, UND, FACTOR);
                        if ((ORDENC * FACTOR = CANT2) or (PEDAUTO = 'SI')) then /* SI NO SE HA FACTURADO MIRE A VER SI SE REMISIONO */
                            EXECUTE PROCEDURE FALTANTE(34, 32, ID, ITEM) returning_values (ORDENC, UND, FACTOR);
                        if (ORDENC IS NULL) then
                            ORDENC = 0;
                        PEDIDO = PEDIDO + ORDENC * FACTOR;
                        END
                    RESERVADO = RESERVADO + PEDIDO;
                    END
                ELSE
                    BEGIN
                    RESERVADO = 0;
                    ORDENADO = 0;
                    END
                if (LISTA > 0) then
                    SELECT prar_fijo FROM precios_articulo WHERE arti_cod = :CODIGO and lipr_cod = :LISTA INTO :PRECIO;
                if (ENPESO = 'S') then
                    BEGIN
                    if (pesounit IS NULL) then
                        pesounit = 0;
                    if (PESOUNIT <> 0) then
                        BEGIN
                        pesototal = PESOUNIT * cant;
                        SUSPEND;
                        END
                    END
                ELSE
                    SUSPEND;
                END
            END
        END
  end
if (DETALLE = 'N') then
  BEGIN
  FOR SELECT ARTI_COD, ARTI_DES, ARTI_UNIDAD, ARTI_EXIST, TAIV_PORC, A.GRUP_COD, A.SUBG_COD, A.MARC_COD, ARTI_CONSUMO, ARTI_PESO/1000
      FROM ARTICULO A, TARIFA_IVA T
      WHERE ARTI_COD >= :CODINI AND ARTI_COD <= :CODFIN AND ARTI_DES >= :DESINI AND ARTI_DES <= :DESFIN AND ESAR_COD <> 'I' AND A.TAIV_COD = T.TAIV_COD
      INTO :CODIGO, :NOMBRE, :UNIDAD, :EXIST, :IVA, :CODGRUPO, :CODSUBG, :CODMARC, :CONSUMO, :pesounit
      DO
        BEGIN
        OK = 'N';
        if (AGRUPA = 'G') then
            BEGIN
            if ((GRPINI = '0') AND (GRPFIN = 'zz')) then
                OK = 'S';
            else
                if ((CODGRUPO >= GRPINI) AND (CODGRUPO <= GRPFIN)) then
                    OK = 'S';
            end
        ELSE
            if (AGRUPA = 'M') then
                BEGIN
                if ((GRPINI = '0') AND (GRPFIN = 'zzz')) then
                    OK = 'S';
                else
                    if ((CODMARC >= GRPINI) AND (CODMARC <= GRPFIN)) then
                        OK = 'S';
                END
        if (OK = 'S') then
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            SELECT MAX(COBA_COD) FROM BARRAS_ARTICULO WHERE ARTI_COD = :codigo AND COBA_UNIDAD = :unidad INTO :codbar;
            if (CODBAR IS NULL) then
                CODBAR = CODIGO;

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

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

^

SET TERM ; ^

SET TERM ^ ;

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

^

SET TERM ; ^

SET TERM ^ ;

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

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE FALTANTES_VENTAS_ARTICULO(
    DESDE VARCHAR(20),
    HASTA VARCHAR(20),
    FECINI DATE,
    FECFIN DATE,
    DETALLE CHAR(1),
    TIPO INTEGER,
    DESTINO INTEGER,
    ORDEN CHAR(1),
    CEROS CHAR(1),
    SUCURSAL INTEGER)
RETURNS (
    ARTICULO VARCHAR(15),
    DESCRIPCION VARCHAR(60),
    CODGRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    CODSUBG VARCHAR(3),
    NOMSUBG VARCHAR(30),
    CODMARC VARCHAR(3),
    NOMMARC VARCHAR(30),
    CANTIDAD NUMERIC(18,4),
    UNIDAD VARCHAR(8),
    FALTANTE NUMERIC(18,4),
    BASE NUMERIC(18,2),
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    OBS VARCHAR(255))
AS
declare variable ID INTEGER;
declare variable ITEM INTEGER;
declare variable CANT NUMERIC(18,2);
declare variable CODINI VARCHAR(15);
declare variable CODFIN VARCHAR(15);
declare variable DESINI VARCHAR(15);
declare variable DESFIN VARCHAR(15);
declare variable MONTO NUMERIC(18,2);
declare variable FACTOR NUMERIC(18,4);
BEGIN
if (ORDEN = 'C') then
    BEGIN
    CODINI = DESDE;
    CODFIN = HASTA;
    DESINI = '';
    DESFIN = 'zz';
    END
ELSE
    BEGIN
    DESINI = DESDE;
    DESFIN = HASTA;
    CODINI = '';
    CODFIN = 'zz';
    END
  FOR SELECT ARTI_COD, ARTI_DES, ARTI_UNIDAD, A.GRUP_COD, A.SUBG_COD, A.MARC_COD FROM ARTICULO A
      WHERE ARTI_COD >= :CODINI AND ARTI_COD <= :CODFIN AND ARTI_DES >= :DESINI AND ARTI_DES <= :DESFIN
      INTO :ARTICULO, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
  DO
    BEGIN
    CANTIDAD = 0;
    faltante = 0;
    base = 0;
    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
    if (DETALLE = 'N') then
        BEGIN
        if (TIPO = 31) then
            BEGIN
            FOR SELECT F.FACT_ID, FADE_ITEM, FADE_CANT * FADE_FACTOR, (FADE_PRUNIT-FADE_DTOMONTO)
                FROM FACTURAS_DETALLE D, FACTURAS F, PREFIJOS P
                WHERE F.FACT_ID = D.FACT_ID AND ARTI_COD = :ARTICULO AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND FACT_ANULADO = 'N' AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND ((SUCU_ID = :SUCURSAL) or (:SUCURSAL = 0)) and substring(arti_cod from 1 FOR 2) <> '.t'
                ORDER BY F.FACT_ID, FADE_ITEM INTO :ID, :ITEM, :CANT, :MONTO
                DO
                BEGIN
                CANTIDAD = CANTIDAD + CANT;
                EXECUTE PROCEDURE FALTANTE(:TIPO, :DESTINO, :ID, :ITEM) returning_values (:CANT, :UNIDAD, :FACTOR);
                FALTANTE = FALTANTE + CANT;
                BASE = BASE + MONTO * CANT;
                END
            END
        if (TIPO = 32) then
            BEGIN
            FOR SELECT R.revt_id, rvde_item, RVDE_CANT * RVDE_FACTOR, (RVDE_PRUNIT-RVDE_DTOMONTO)
                FROM REMISIONES_VENTA_DETALLE D, REMISIONES_VENTA R, PREFIJOS P
                WHERE R.REVT_ID = D.REVT_ID AND ARTI_COD = :ARTICULO AND REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN AND REVT_ANULADO = 'N' AND P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = 32  AND ((SUCU_ID = :SUCURSAL) or (:SUCURSAL = 0))
                ORDER BY R.REVT_ID, RVDE_ITEM INTO :ID, :ITEM, :CANT, :MONTO
                DO
                BEGIN
                CANTIDAD = CANTIDAD + CANT;
                EXECUTE PROCEDURE FALTANTE(:TIPO, :DESTINO, :ID, :ITEM) returning_values (:CANT, :UNIDAD, :FACTOR);
                FALTANTE = FALTANTE + CANT;
                BASE = BASE + MONTO * CANT;
                END
            END
        if (TIPO = 34) then
            BEGIN
            FOR SELECT P.PEDI_ID, PEDE_ITEM, PEDE_CANT * PEDE_FACTOR, (PEDE_PRUNIT-PEDE_DTOMONTO)
                FROM PEDIDOS_DETALLE D, PEDIDOS P, PREFIJOS R
                WHERE P.PEDI_ID = D.PEDI_ID AND ARTI_COD = :ARTICULO AND PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND PEDI_ANULADO = 'N' AND P.PREF_PRE = R.PREF_PRE AND R.TIDO_COD = 34  AND ((SUCU_ID = :SUCURSAL) or (:SUCURSAL = 0))
                ORDER BY P.PEDI_ID, PEDE_ITEM INTO :ID, :ITEM, :CANT, :MONTO
                DO
                BEGIN
                CANTIDAD = CANTIDAD + CANT;
                EXECUTE PROCEDURE FALTANTE(:TIPO, :DESTINO, :ID, :ITEM) returning_values (:CANT, :UNIDAD, :FACTOR);
                FALTANTE = FALTANTE + CANT;
                BASE = BASE + MONTO * CANT;
                END
            END
        if (TIPO = 35) then
            BEGIN
            FOR SELECT C.COTI_ID, CTDE_ITEM, CTDE_CANT * CTDE_FACTOR, (CTDE_PRUNIT-CTDE_DTOMONTO)
                FROM COTIZACIONES_DETALLE D, COTIZACIONES C, PREFIJOS P
                WHERE C.COTI_ID = D.COTI_ID AND ARTI_COD = :ARTICULO AND COTI_FECHA >= :FECINI AND COTI_FECHA <= :FECFIN AND COTI_ANULADO = 'N' AND P.PREF_PRE = C.PREF_PRE AND P.TIDO_COD = 35  AND ((SUCU_ID = :SUCURSAL) or (:SUCURSAL = 0))
                ORDER BY C.COTI_ID, CTDE_ITEM INTO :ID, :ITEM, :CANT, :MONTO
                DO
                BEGIN
                CANTIDAD = CANTIDAD + CANT;
                EXECUTE PROCEDURE FALTANTE(:TIPO, :DESTINO, :ID, :ITEM) returning_values (:CANT, :UNIDAD, :FACTOR);
                FALTANTE = FALTANTE + CANT;
                BASE = BASE + MONTO * CANT;
                END
            END
        if (CANTIDAD IS NULL) then
            CANTIDAD = 0;
        if (BASE IS NULL) then
            BASE = 0;
        if (FALTANTE IS NULL) then
            FALTANTE = 0;
        if (CEROS = 'S') then
            SUSPEND;
        ELSE
            if (FALTANTE <> 0) then
                SUSPEND;
        END
    ELSE
        BEGIN
        if (TIPO = 31) then
            FOR SELECT F.FACT_ID, FADE_ITEM, F.PREF_PRE, FACT_NUMERO, FACT_FECHA, FADE_CANT * FADE_FACTOR, (FADE_PRUNIT-FADE_DTOMONTO), SUBSTRING(FACT_OBS FROM 1 FOR 255)
                FROM FACTURAS F, FACTURAS_DETALLE D, PREFIJOS P
                WHERE F.FACT_ID = D.FACT_ID AND ARTI_COD = :ARTICULO AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND FACT_ANULADO = 'N' AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND ((SUCU_ID = :SUCURSAL) or (:SUCURSAL = 0)) and substring(arti_cod from 1 FOR 2) <> '.t'
                ORDER BY F.FACT_ID, FADE_ITEM
                INTO :ID, :ITEM, :PREFIJO, :NUMERO, :FECHA, :CANTIDAD, :BASE, :OBS
                DO
                    BEGIN
                    EXECUTE PROCEDURE FALTANTE(:TIPO, :DESTINO, :ID, :ITEM) returning_values (:FALTANTE, :UNIDAD, :FACTOR);
                    if ((CEROS = 'S') or (FALTANTE <> 0)) then
                        SUSPEND;
                    END
        if (TIPO = 32) then
            FOR SELECT R.REVT_ID, RVDE_ITEM, R.PREF_PRE, REVT_NUMERO, REVT_FECHA, RVDE_CANT * RVDE_FACTOR, (RVDE_PRUNIT-RVDE_DTOMONTO), SUBSTRING(REVT_OBS FROM 1 FOR 255)
                FROM REMISIONES_VENTA R, REMISIONES_VENTA_DETALLE D, PREFIJOS P
                WHERE R.REVT_ID = D.REVT_ID AND ARTI_COD = :ARTICULO AND REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN AND REVT_ANULADO = 'N' AND P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = 32 AND ((SUCU_ID = :SUCURSAL) or (:SUCURSAL = 0))
                INTO :ID, :ITEM, :PREFIJO, :NUMERO, :FECHA, :CANTIDAD, :BASE, :OBS
                DO
                    BEGIN
                    EXECUTE PROCEDURE FALTANTE(:TIPO, :DESTINO, :ID, :ITEM) returning_values (:FALTANTE, :UNIDAD, :FACTOR);
                    if ((CEROS = 'S') or (FALTANTE <> 0)) then
                        SUSPEND;
                    END
        if (TIPO = 34) then
            FOR SELECT P.PEDI_ID, PEDE_ITEM, P.PREF_PRE, PEDI_NUMERO, PEDI_FECHA, PEDE_CANT * PEDE_FACTOR, (PEDE_PRUNIT-PEDE_DTOMONTO), SUBSTRING(PEDI_OBS FROM 1 FOR 255)
                FROM PEDIDOS P, PEDIDOS_DETALLE D, PREFIJOS R
                WHERE P.PEDI_ID = D.PEDI_ID AND ARTI_COD = :ARTICULO AND PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND PEDI_ANULADO = 'N' AND P.PREF_PRE = R.PREF_PRE AND R.TIDO_COD = 34 AND ((SUCU_ID = :SUCURSAL) or (:SUCURSAL = 0))
                INTO :ID, :ITEM, PREFIJO, :NUMERO, :FECHA, :CANTIDAD, :BASE, :OBS
                DO
                    BEGIN
                    EXECUTE PROCEDURE FALTANTE(:TIPO, :DESTINO, :ID, :ITEM) returning_values (:FALTANTE, :UNIDAD, :FACTOR);
                    if ((CEROS = 'S') or (FALTANTE <> 0)) then
                        SUSPEND;
                    END
        if (TIPO = 35) then
            FOR SELECT C.COTI_ID, CTDE_ITEM, C.PREF_PRE, COTI_NUMERO, COTI_FECHA, CTDE_CANT * CTDE_FACTOR, (CTDE_PRUNIT-CTDE_DTOMONTO), SUBSTRING(COTI_OBS FROM 1 FOR 255)
                FROM COTIZACIONES C, COTIZACIONES_DETALLE D, PREFIJOS P
                WHERE C.COTI_ID = D.COTI_ID AND ARTI_COD = :ARTICULO AND COTI_FECHA >= :FECINI AND COTI_FECHA <= :FECFIN AND COTI_ANULADO = 'N' AND P.PREF_PRE = C.PREF_PRE AND P.TIDO_COD = 35 AND ((SUCU_ID = :SUCURSAL) or (:SUCURSAL = 0))
                INTO :ID, :ITEM, PREFIJO, :NUMERO, :FECHA, :CANTIDAD, :BASE, :OBS
                DO
                    BEGIN
                    EXECUTE PROCEDURE FALTANTE(:TIPO, :DESTINO, :ID, :ITEM) returning_values (:FALTANTE, :UNIDAD, :FACTOR);
                    if ((CEROS = 'S') or (FALTANTE <> 0)) then
                        SUSPEND;
                    END
        END
    END
END

^

SET TERM ; ^

SET TERM ^ ;

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

^

SET TERM ; ^

SET TERM ^ ;

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

^

SET TERM ; ^

SET TERM ^ ;

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

^

SET TERM ; ^

SET TERM ^ ;

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

^

SET TERM ; ^

SET TERM ^ ;

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

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

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

^

SET TERM ; ^

SET TERM ^ ;

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

^

SET TERM ; ^

SET TERM ^ ;

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

^

SET TERM ; ^

SET TERM ^ ;

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

^

SET TERM ; ^

SET TERM ^ ;

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

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

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE REP_FALTANTES_VENTA(
    TIPOORI INTEGER,
    FECINI DATE,
    FECFIN DATE,
    TIPODES INTEGER,
    CEROS CHAR(1),
    SUBEMPRESA INTEGER)
RETURNS (
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    NIT VARCHAR(20),
    NOMCLIENTE VARCHAR(60),
    VENCE DATE,
    ARTICULO VARCHAR(15),
    DESCRIPCION VARCHAR(60),
    CANTIDAD NUMERIC(18,4),
    UNIDAD VARCHAR(8),
    PRECIO NUMERIC(18,2),
    DESCUENTO NUMERIC(9,4),
    FALTANTE NUMERIC(18,4),
    OBS VARCHAR(255))
AS
declare variable ID INTEGER;
declare variable ITEM INTEGER;
declare variable FACTOR NUMERIC(18,4);
BEGIN
if (TIPOORI = 32) then
    FOR SELECT R.REVT_ID, R.PREF_PRE, REVT_NUMERO, REVT_FECHA, REVT_FECHA VENCE, RVDE_ITEM, R.TERC_NIT, REVT_NOMTERC, ARTI_COD, SUBSTR(RVDE_DESC,1,60), RVDE_UNIDAD, RVDE_CANT, RVDE_PRUNIT, RVDE_DTOPORC, SUBSTRING(REVT_OBS FROM 1 FOR 255)
      FROM REMISIONES_VENTA R, REMISIONES_VENTA_DETALLE D, PREFIJOS P
      WHERE R.REVT_ID = D.REVT_ID AND REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN and REVT_ANULADO = 'N'
       AND P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = 32 AND ((P.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
      ORDER BY REVT_FECHA, R.PREF_PRE, REVT_NUMERO, RVDE_ITEM
      INTO :ID, :PREFIJO, :NUMERO, :FECHA, :VENCE, :ITEM, :NIT, :NOMCLIENTE, :ARTICULO, :DESCRIPCION, :UNIDAD, :CANTIDAD, :PRECIO, :DESCUENTO, :OBS
      DO
        BEGIN
        EXECUTE PROCEDURE FALTANTE(:TIPOORI, :TIPODES, :ID,  :ITEM) returning_values (:FALTANTE, :UNIDAD, :FACTOR);
        if ((CEROS = 'S') or (FALTANTE <> 0)) then
          SUSPEND;
        END
if (TIPOORI = 34) then
    FOR SELECT P.PEDI_ID, P.PREF_PRE, PEDI_NUMERO, PEDI_FECHA, (PEDI_FECHA + PEDI_VALIDEZ), PEDE_ITEM, P.TERC_NIT, PEDI_NOMTERC, ARTI_COD, SUBSTR(PEDE_DESC,1,60), PEDE_UNIDAD, PEDE_CANT, PEDE_PRUNIT, PEDE_DTOPORC, SUBSTRING(PEDI_OBS FROM 1 FOR 255)
      FROM PEDIDOS P, PEDIDOS_DETALLE D, PREFIJOS PR
      WHERE P.PEDI_ID = D.PEDI_ID AND PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND PEDI_ANULADO = 'N'
       AND PR.PREF_PRE = P.PREF_PRE AND PR.TIDO_COD = 34 AND ((PR.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
      ORDER BY PEDI_FECHA, P.PREF_PRE, PEDI_NUMERO, PEDE_ITEM
      INTO :ID, :PREFIJO, :NUMERO, :FECHA, :VENCE, :ITEM, :NIT, :NOMCLIENTE, :ARTICULO, :DESCRIPCION, :UNIDAD, :CANTIDAD, :PRECIO, :DESCUENTO, :OBS
      DO
        BEGIN
        EXECUTE PROCEDURE FALTANTE(:TIPOORI, :TIPODES, :ID,  :ITEM) returning_values (:FALTANTE, :UNIDAD, :FACTOR);
        if ((CEROS = 'S') or (FALTANTE <> 0)) then
          SUSPEND;
        END
if (TIPOORI = 35) then
    FOR SELECT C.COTI_ID, C.PREF_PRE, COTI_NUMERO, COTI_FECHA, (COTI_FECHA + COTI_VALIDEZ), CTDE_ITEM, C.TERC_NIT, COTI_NOMTERC, ARTI_COD, SUBSTR(CTDE_DESC,1,60), CTDE_UNIDAD, CTDE_CANT, CTDE_PRUNIT, CTDE_DTOPORC, SUBSTRING(COTI_OBS FROM 1 FOR 255)
      FROM COTIZACIONES C, COTIZACIONES_DETALLE D, PREFIJOS P
      WHERE C.COTI_ID = D.COTI_ID AND COTI_FECHA >= :FECINI AND COTI_FECHA <= :FECFIN AND COTI_ANULADO = 'N'
       AND P.PREF_PRE = C.PREF_PRE AND P.TIDO_COD = 35 AND ((P.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
      ORDER BY COTI_FECHA, C.PREF_PRE, COTI_NUMERO, CTDE_ITEM
      INTO :ID, :PREFIJO, :NUMERO, :FECHA, :VENCE, :ITEM, :NIT, :NOMCLIENTE, :ARTICULO, :DESCRIPCION, :UNIDAD, :CANTIDAD, :PRECIO, :DESCUENTO, :OBS
      DO
        BEGIN
        EXECUTE PROCEDURE FALTANTE(:TIPOORI, :TIPODES, :ID,  :ITEM) returning_values (:FALTANTE, :UNIDAD, :FACTOR);
        if ((CEROS = 'S') or (FALTANTE <> 0)) then
          SUSPEND;
        END
END

^

SET TERM ; ^

SET TERM ^ ;

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

^

SET TERM ; ^

SET TERM ^ ;

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

^

SET TERM ; ^

SET TERM ^ ;

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

^

SET TERM ; ^

SET TERM ^ ;

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

^

SET TERM ; ^

SET TERM ^ ;

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

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

SET TERM ; ^


/* 20100220 */
/* SI HAY IMPOCOSUMO Y SOLO DESCUENTO DE PIE DE FACTURA TOME DIRECTAMENTE EL PORCENTAJE */

SET TERM ^ ;

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

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

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

    /* ACTUALICE EL PENDIENTE  */
    if (CONSOLIDA <> 0) then
        BEGIN
        UPDATE consolidado_faltantes SET COFA_OK = 'S' WHERE COFA_ID = :consolida AND COFA_ITEM = NEW.FCDE_ITEM AND ARTI_COD = NEW.arti_cod;
        EXECUTE procedure LEE_CONFIGURACION ('COMPRAS','DOCUMENTOS','SUMAR CANTIDADES PENDIENTES AL CONSOLIDAR DOCUMENTOS') returning_values (CONSO);
        /* IGNORE LA CONSOLIDACION SI SE VALIDAN CODIGOS DE LA ORDEN */
        SELECT MIN(CEFA_TIPOORI) FROM consolide_faltantes WHERE CEFA_ID = :CONSOLIDA INTO :NUMROWS;
        if (NUMROWS = 23) then
            BEGIN
            EXECUTE PROCEDURE LEE_CONFIGURACION('COMPRAS', 'FACTURAS', 'VERIFICAR CODIGOS DE LA ORDEN') returning_values (MENORV);
            if (MENORV = 'SI') then
                CONSO = 'NO';
            END
        SELECT COUNT(CEFA_ITEM) FROM consolide_faltantes WHERE CEFA_ID = :CONSOLIDA INTO :NUMROWS;
        if ((CONSO = 'SI') AND (NUMROWS > 1)) then
            UPDATE consolidado_faltantes SET COFA_IDDES = NEW.faco_id, COFA_OK = 'S' WHERE COFA_ID = :consolida;
        else
            BEGIN
            /* BUSQUE EL CONSOLIDADO EN EL MISMO ITEM Y SI ES DIFERENTE ACTUALICELO */
            select COFA_CANT * COFA_FACTOR FROM consolidado_faltantes WHERE COFA_ID = :consolida AND COFA_ITEM = NEW.FCDE_ITEM AND ARTI_COD = NEW.arti_cod INTO :CANTREL;
            if (NEW.FCDE_CANT * NEW.FCDE_FACTOR < CANTREL) then
                UPDATE consolidado_faltantes SET COFA_IDDES = NEW.faco_id, COFA_CANT = NEW.FCDE_CANT, COFA_FACTOR = NEW.FCDE_FACTOR
                    WHERE COFA_ID = :consolida AND COFA_ITEM = NEW.FCDE_ITEM AND ARTI_COD = NEW.arti_cod;
            END
        END
    /* ACTUALICE EL STAND */
    if (new.fcde_stand is not null) then
      if (exists(select stand_cod from stands where arti_cod = new.arti_cod and stand_bodega = new.bode_cod)) then
        UPDATE stands set stand_cod = new.fcde_stand where arti_cod = new.arti_cod and stand_bodega = new.bode_cod;
      else
        INSERT INTO stands (ARTI_COD, STAND_BODEGA, STAND_COD) VALUES (NEW.arti_cod, NEW.bode_cod, NEW.fcde_stand);
    END
END
^

SET TERM ; ^


SET TERM ^ ;

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

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

        if (CONSOLIDA <> 0) then
            begin
            UPDATE consolidado_faltantes SET COFA_OK = 'S' WHERE COFA_ID = :consolida AND COFA_ITEM = NEW.FCDE_ITEM AND ARTI_COD = NEW.arti_cod;
            EXECUTE procedure LEE_CONFIGURACION ('COMPRAS','DOCUMENTOS','SUMAR CANTIDADES PENDIENTES AL CONSOLIDAR DOCUMENTOS') returning_values (CONSO);
            /* IGNORE LA CONSOLIDACION SI SE VALIDAN CODIGOS DE LA ORDEN */
            SELECT MIN(CEFA_TIPOORI) FROM consolide_faltantes WHERE CEFA_ID = :CONSOLIDA INTO :NUMROWS;
            if (NUMROWS = 23) then
                BEGIN
                EXECUTE PROCEDURE LEE_CONFIGURACION('COMPRAS', 'FACTURAS', 'VERIFICAR CODIGOS DE LA ORDEN') returning_values (MENORV);
                if (MENORV = 'SI') then
                    CONSO = 'NO';
                END
            SELECT COUNT(CEFA_ITEM) FROM consolide_faltantes WHERE CEFA_ID = :CONSOLIDA INTO :NUMROWS;
            if ((CONSO = 'SI') AND (NUMROWS > 1)) then
                UPDATE consolidado_faltantes SET COFA_IDDES = NEW.faco_id, COFA_OK = 'S' WHERE COFA_ID = :consolida;
            else
                BEGIN
                /* BUSQUE EL CONSOLIDADO EN EL MISMO ITEM Y SI ES DIFERENTE ACTUALICELO */
                select COFA_CANT * COFA_FACTOR FROM consolidado_faltantes WHERE COFA_ID = :consolida AND COFA_ITEM = NEW.FCDE_ITEM AND ARTI_COD = NEW.arti_cod INTO :CANTREL;
                if (NEW.FCDE_CANT * NEW.FCDE_FACTOR < CANTREL) then
                    UPDATE consolidado_faltantes SET COFA_IDDES = NEW.faco_id, COFA_CANT = NEW.FCDE_CANT, COFA_FACTOR = NEW.FCDE_FACTOR
                        WHERE COFA_ID = :consolida AND COFA_ITEM = NEW.FCDE_ITEM AND ARTI_COD = NEW.arti_cod;
                END
            end
        /* ACTUALICE EL STAND */
        if (new.fcde_stand is not null) then
          if (exists(select stand_cod from stands where arti_cod = new.arti_cod and stand_bodega = new.bode_cod)) then
            UPDATE stands set stand_cod = new.fcde_stand where arti_cod = new.arti_cod and stand_bodega = new.bode_cod;
          else
            INSERT INTO stands (ARTI_COD, STAND_BODEGA, STAND_COD) VALUES (NEW.arti_cod, NEW.bode_cod, NEW.fcde_stand);
        END
    end
END
^

SET TERM ; ^


/* 20100223 */
/* BASE PARA CALCULO DE PRECIOS ASOCIADOS AL COSTO CONFIGURABLE POR GRUPO */

ALTER TABLE GRUPO
ADD GRUP_BASEPRECIO VARCHAR(10);

SET TERM ^ ;

CREATE OR ALTER TRIGGER PRECIOS_ARTICULO_BU FOR PRECIOS_ARTICULO
ACTIVE BEFORE UPDATE POSITION 0
as
declare variable UNIDAD VARCHAR(8);
declare variable UOR VARCHAR(20);
declare variable DIG INTEGER;
declare variable IVAINC CHAR(1);
declare variable TARIVA NUMERIC(9,4);
declare variable CAMBIO CHAR(7);
declare variable BASE VARCHAR(10);
declare variable REP CHAR(2);
declare variable COSTOP NUMERIC(18, 2);
declare variable COSTOU NUMERIC(18, 2);
declare variable COSTO NUMERIC(18, 2);
declare variable CONSUMO NUMERIC(18, 2);
declare variable LISTA INTEGER;
declare variable PRECIO NUMERIC(18, 4);
declare variable IVAINC1 CHAR(1);
declare variable ICOINC CHAR(2);
begin
if (NEW.prar_auto = 'S') then
    BEGIN
    EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION','ARTICULOS','CAMBIO DE PRECIOS AUTOMATICO AL CAMBIAR COSTO O PRECIO') returning_values (CAMBIO);
    EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION', 'ARTICULOS', 'SUGERIR PRECIOS CON PORCENTAJE DE MARGEN O UTILIDAD') RETURNING_VALUES (:UOR);
    EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION', 'ARTICULOS', 'REDONDEO AL MULTIPLO DE DIEZ EN PRECIOS') RETURNING_VALUES (:DIG);
    EXECUTE PROCEDURE LEE_CONFIGURACION('INVENTARIO', 'ARTICULOS', 'REPLICAR CAMBIOS EN ARTICULOS') RETURNING_VALUES (:REP);
    SELECT LIPR_MODIF FROM LISTA_PRECIOS L
        WHERE LIPR_COD = NEW.LIPR_COD INTO :IVAINC;
    
    if (CAMBIO <> 'PRECIO') then
      begin
      if (REP <> 'SI') then
        BEGIN
        SELECT ARTI_UNIDAD, TAIV_PORC, ARTI_CONSUMO FROM ARTICULO A, TARIFA_IVA T
            WHERE A.TAIV_COD = T.TAIV_COD AND ARTI_COD = NEW.arti_cod INTO :UNIDAD, :TARIVA, :CONSUMO;
        SELECT GRUP_BASEPRECIO FROM GRUPO G, ARTICULO A WHERE G.GRUP_COD = A.grup_cod AND A.ARTI_COD = NEW.arti_cod INTO :BASE;
        if ((BASE IS NULL) or (BASE = '')) then
            EXECUTE PROCEDURE lee_configuracion('FACTURACION','ARTICULOS','COSTO BASE PARA CALCULO DE PRECIOS DE VENTA AUTOMATICOS') returning_values (:BASE);
        EXECUTE PROCEDURE costo_promedio_y_ultimo (NEW.arti_cod, 'NOW') RETURNING_VALUES(:COSTOP, :COSTOU);
        if (base = 'ULTIMO') then
            COSTO = COSTOU;
        ELSE
            BEGIN
            COSTO = COSTOP;
            if (base = 'MAYOR') then
                if (COSTOP < COSTOU) then
                    COSTO = COSTOU;
            END
        if (IVAINC = 'S') then
            BEGIN
            COSTO = COSTO * (1 + TARIVA/100);
            EXECUTE PROCEDURE lee_configuracion ('FACTURACION', 'ARTICULOS', 'IMPOCONSUMO INCLUIDO EN EL PRECIO BASE DE VENTA ANTES DE IVA') returning_values(:icoinc);
            if (icoinc = 'SI') then
                COSTO = COSTO + consumo;
            END
            
        if (UOR = 'UTILIDAD') then
            BEGIN
            COSTO = COSTO * (1 + NEW.prar_util/100);
            EXECUTE PROCEDURE REDONDEE (COSTO, DIG) returning_values (COSTO);
            new.prar_fijo = :COSTO;
            END
        ELSE
            BEGIN
            COSTO = COSTO / (1 - NEW.prar_margen/100);
            EXECUTE PROCEDURE REDONDEE (COSTO, DIG) returning_values (COSTO);
            NEW.PRAR_FIJO = :COSTO;
            END
        END
      end
    else
        begin
        /* PRECIO */
        EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION','ARTICULOS','CODIGO DE LA LISTA DE PRECIOS BASE PARA CAMBIO DE PRECIOS AUTOMATICO') returning_values (LISTA);
        if (NEW.lipr_cod <> :LISTA) then
            BEGIN
            SELECT PRAR_FIJO FROM PRECIOS_ARTICULO WHERE LIPR_COD = :LISTA AND ARTI_COD = NEW.arti_cod INTO :PRECIO;
            SELECT LIPR_MODIF FROM LISTA_PRECIOS L
                WHERE LIPR_COD = :lista INTO :IVAINC1;
            if (ivainc = 'S') then
                if (IVAINC1 = 'S') then
                    NEW.prar_fijo = precio;
                else
                    NEW.prar_fijo = precio * (1 + TARIVA/100);
            ELSE
                if (IVAINC1 = 'S') then
                    NEW.prar_fijo = precio / (1 + TARIVA/100);
                else
                    NEW.prar_fijo = precio;
            if (UOR = 'UTILIDAD') then
                NEW.prar_fijo = NEW.prar_fijo * (1 + NEW.prar_util/100);
            ELSE
                NEW.prar_fijo = NEW.prar_fijo / (1 - NEW.prar_margen/100);
            EXECUTE PROCEDURE REDONDEE (NEW.prar_fijo, DIG) returning_values (NEW.prar_fijo);
            END
        end
    END
end
^

SET TERM ; ^


SET TERM ^ ;

CREATE OR ALTER procedure CALCULA_PRECIOS (
    ARTICULO varchar(20),
    FECHA date)
AS
declare variable LISTA INTEGER;
declare variable MARGEN NUMERIC(9, 4);
declare variable UTIL NUMERIC(9, 4);
declare variable UNIDAD VARCHAR(8);
declare variable UOR VARCHAR(20);
declare variable COSTOP NUMERIC(18, 2);
declare variable COSTOU NUMERIC(18, 2);
declare variable COSTO NUMERIC(18, 2);
declare variable DIG INTEGER;
declare variable IVAINC CHAR(1);
declare variable TARIVA NUMERIC(9,2);
declare variable AUTOM CHAR(1);
declare variable BASE varchar(10);
declare variable CAMBIO CHAR(7);
BEGIN
EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION','ARTICULOS','CAMBIO DE PRECIOS AUTOMATICO AL CAMBIAR COSTO O PRECIO') returning_values (CAMBIO);
if (CAMBIO = 'COSTO') then
  BEGIN
  FOR SELECT P.LIPR_COD, PRAR_MARGEN, PRAR_UTIL, LIPR_MODIF, PRAR_AUTO
    FROM PRECIOS_ARTICULO P, LISTA_PRECIOS L
    WHERE P.LIPR_COD = L.LIPR_COD AND ARTI_COD = :articulo
    INTO :LISTA, :MARGEN, :UTIL, :IVAINC, :AUTOM
    DO
      if (AUTOM = 'S') then
        BEGIN
        if (UTIL IS NULL) then
            UTIL = 0;
        if (MARGEN IS NULL) then
            MARGEN = 0;
        SELECT ARTI_UNIDAD, TAIV_PORC FROM ARTICULO A, TARIFA_IVA T WHERE A.TAIV_COD = T.TAIV_COD AND ARTI_COD = :ARTICULO INTO :UNIDAD, :TARIVA;
        SELECT GRUP_BASEPRECIO FROM GRUPO G, ARTICULO A WHERE G.GRUP_COD = A.grup_cod AND A.ARTI_COD = :articulo INTO :BASE;
        if ((BASE IS NULL) or (BASE = '')) then
            EXECUTE PROCEDURE lee_configuracion('FACTURACION','ARTICULOS','COSTO BASE PARA CALCULO DE PRECIOS DE VENTA AUTOMATICOS') returning_values (:BASE);
        EXECUTE PROCEDURE costo_promedio_y_ultimo (:ARTICULO, :FECHA) RETURNING_VALUES(:COSTOP, :COSTOU);
        if (base = 'ULTIMO') then
            COSTO = COSTOU;
        ELSE
            BEGIN
            COSTO = COSTOP;
            if (base = 'MAYOR') then
                if (COSTOP < COSTOU) then
                    COSTO = COSTOU;
            END
        if (IVAINC = 'S') then
            COSTO = COSTO * (1 + TARIVA/100);
        EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION', 'ARTICULOS', 'SUGERIR PRECIOS CON PORCENTAJE DE MARGEN O UTILIDAD') RETURNING_VALUES (:UOR);
        EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION', 'ARTICULOS', 'REDONDEO AL MULTIPLO DE DIEZ EN PRECIOS') RETURNING_VALUES (:DIG);
        if (UOR = 'UTILIDAD') then
            BEGIN
            COSTO = COSTO * (1 + :UTIL/100);
            EXECUTE PROCEDURE REDONDEE (COSTO, DIG) returning_values (COSTO);
            UPDATE PRECIOS_ARTICULO
                SET PRAR_FIJO = :COSTO
                WHERE ARTI_COD = :ARTICULO AND LIPR_COD = :LISTA;
            END
        ELSE
            BEGIN
            COSTO = COSTO / (1 - :MARGEN/100);
            EXECUTE PROCEDURE REDONDEE (COSTO, DIG) returning_values (COSTO);
            UPDATE PRECIOS_ARTICULO
                SET PRAR_FIJO = :COSTO
                WHERE ARTI_COD = :ARTICULO AND LIPR_COD = :LISTA;
            END
        END
  END
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE CAMBIO_PRECIOS(
    FECHA DATE)
AS
declare variable ART VARCHAR(20);
BEGIN
FOR SELECT ARTI_COD FROM ARTICULO INTO :ART DO
    EXECUTE PROCEDURE CALCULA_PRECIOS(:ART, :FECHA);
  SUSPEND;
END

^

SET TERM ; ^

SET TERM ^ ;

ALTER TRIGGER DESENSAMBLES_DETALLE_AI
AS
declare variable fec date;
declare variable CONC VARCHAR(60);
declare variable factor numeric(18,4);
declare variable COSTO numeric(18,2);
declare variable Pref varchar(4);
declare variable Num varchar(6);
declare variable CANT NUMERIC(18,2);
declare variable CANTOT CHAR(2);
BEGIN
  if ((NEW.DESE_id <> 0) and (new.dede_anulado = 'N')) then
    begin
    select dese_fecha, dese_conc, pref_pre, dese_numero, dese_cant * dese_factor
        from desensambles where dese_id = new.dese_id into :fec, :conc, :Pref, :Num, :CANT;
    execute procedure factor_unidad_cant(new.arti_cod, new.dede_unidad) returning_values(factor);
    execute procedure costo_promedio(new.arti_cod, :FEC) returning_values (:COSTO);
    EXECUTE PROCEDURE LEE_CONFIGURACION('INVENTARIO', 'ENSAMBLES', 'FORMACIONES CON CANTIDADES TOTALES') returning_values (:CANTOT);
    if (CANTOT <> 'SI') then
        CANT = CANT * factor * new.dede_cant;
    ELSE
        CANT = factor * new.dede_cant;
    INSERT INTO MOVIMIENTO_ARTICULO
      (ARTI_COD, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM)
      VALUES(NEW.ARTI_COD, NEW.BODE_COD, :FEC, 16, NEW.dese_id,
      :CONC, :CANT, :COSTO, 'S', new.dede_lote, :Pref, :Num, new.dese_item);

    /* RECORRA LAS LISTAS DE PRECIOS Y CAMBIE EL PRECIO */
    EXECUTE PROCEDURE CALCULA_PRECIOS(NEW.ARTI_COD, :fec);
    END
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER TRIGGER DESENSAMBLES_DETALLE_AU
AS
declare variable fec date;
declare variable CONC VARCHAR(60);
declare variable Pref varchar(4);
declare variable Num varchar(6);
declare variable factor numeric(18,4);
declare variable COSTO numeric(18,2);
declare variable CANT NUMERIC(18,2);
declare variable CANTOT CHAR(2);
BEGIN
/* Anule el anterior */
if ((OLD.DESE_ID <> 0) AND (OLD.dede_anulado = 'N')) then
    delete from movimiento_articulo where (mvar_tipodoc = 16) and (mvar_idref = old.DESE_id) and (mvar_item = old.dese_item);
if ((NEW.dese_id <> 0) AND (new.dede_anulado = 'N')) then
    BEGIN
    EXECUTE PROCEDURE LEE_CONFIGURACION('INVENTARIO', 'ENSAMBLES', 'FORMACIONES CON CANTIDADES TOTALES') returning_values (:CANTOT);
    select dese_fecha, dese_conc, pref_pre, dese_numero, dese_cant * dese_factor
        from desensambles where dese_id = new.dese_id into :fec, :conc, :Pref, :Num, :CANT;
    execute procedure factor_unidad_cant(new.arti_cod, new.dede_unidad) returning_values(factor);
    execute procedure costo_promedio(new.arti_cod, :FEC) returning_values (:COSTO);
    if (CANTOT <> 'SI') then
        CANT = CANT * factor * new.dede_cant;
    ELSE
        CANT = factor * new.dede_cant;
    INSERT INTO MOVIMIENTO_ARTICULO
        (ARTI_COD, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM)
        VALUES(NEW.ARTI_COD, NEW.BODE_COD, :FEC, 16, NEW.dese_id,
        :CONC, :CANT, :COSTO, 'S', new.dede_lote, :Pref, :Num, new.dese_item);

    /* RECORRA LAS LISTAS DE PRECIOS Y CAMBIE EL PRECIO */
    EXECUTE PROCEDURE CALCULA_PRECIOS(NEW.ARTI_COD, :fec);
    END
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER TRIGGER ENSAMBLES_AI
AS
declare variable COSTO NUMERIC(18,2);
declare variable ARTPRIN VARCHAR(2);
BEGIN
if ((NEW.ENSA_id <> 0) and (new.ensa_anulado = 'N')) then
  begin
  COSTO = new.ensa_costo / NEW.ensa_factor;
  INSERT INTO MOVIMIENTO_ARTICULO
    (ARTI_COD, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM)
    VALUES(NEW.ARTI_COD, new.bode_cod, new.ensa_fecha, 15, NEW.ensa_id,
    new.ensa_conc, NEW.ensa_factor * new.ensa_cant, :COSTO, 'S', new.ensa_lote, new.pref_pre, new.ensa_numero, 0);

  /* RECORRA LAS LISTAS DE PRECIOS Y CAMBIE EL PRECIO */
  EXECUTE PROCEDURE CALCULA_PRECIOS(NEW.ARTI_COD, new.ensa_fecha);

  /* ingrese el retal */
  execute procedure lee_configuracion('INVENTARIO', 'ENSAMBLES', 'ENSAMBLES CON UN ARTICULO PRINCIPAL COMO BASE') returning_values (:ARTPRIN);
  if (ARTPRIN = 'SI') then
    BEGIN
    if ((new.ensa_codretal is not null) and (new.ensa_codretal <> '')) then
      INSERT INTO MOVIMIENTO_ARTICULO
        (ARTI_COD, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM)
        VALUES(NEW.ensa_codretal, new.ensa_bodretal, new.ensa_fecha, 15, NEW.ensa_id,
        new.ensa_conc, new.ensa_cantretal, 0, 'N', new.ensa_lote, new.pref_pre, new.ensa_numero, 999);
    END
  else
    BEGIN
    if ((new.ensa_codretal is not null) and (new.ensa_codretal <> '')) then
      INSERT INTO MOVIMIENTO_ARTICULO
        (ARTI_COD, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM)
        VALUES(NEW.ensa_codretal, new.ensa_bodretal, new.ensa_fecha, 15, NEW.ensa_id,
        new.ensa_conc, new.ensa_cantretal, :COSTO, 'S', new.ensa_lote, new.pref_pre, new.ensa_numero, 999);
    END
  INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
    VALUES (USER, 15, NEW.ensa_id, 'I', NEW.pref_pre || NEW.ensa_numero);
  end
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER TRIGGER ENSAMBLES_AU
AS
declare variable COSTO NUMERIC(18,2);
declare variable consec INTEGER;
declare variable ARTPRIN VARCHAR(2);
BEGIN
/* BORRE LA CONTABILIZACION */
if (NEW.ensa_anulado = 'S') then
    BEGIN
    select enco_consec from comprobante_encabezado where enco_tiporef = 15 and enco_idref = old.ensa_id into :consec;
    if (NOT consec is null) then
     delete from comprobante_detalle where enco_consec = :consec;
    delete from comprobante_encabezado where enco_tiporef = 15 and enco_idref = old.ensa_id;
    INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
        VALUES (USER, 15, NEW.ensa_id, 'A', NEW.pref_pre || NEW.ensa_numero);
    END

/* BORRE EL ANTERIOR Y GRABE EL NUEVO */
if ((OLD.ensa_id <> 0) AND (OLD.ensa_anulado = 'N')) then
    begin
    delete from movimiento_articulo where (mvar_tipodoc = 15) and (mvar_idref = old.ensa_id) and (mvar_item = 0);
    delete from movimiento_articulo where (mvar_tipodoc = 15) and (mvar_idref = old.ensa_id) and (mvar_item = 999);
    end
if ((new.ensa_id <> 0) AND (NEW.ensa_anulado = 'N')) then
    begin
    COSTO = new.ensa_costo / NEW.ensa_factor;
    INSERT INTO MOVIMIENTO_ARTICULO
        (ARTI_COD, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM)
        VALUES(NEW.ARTI_COD, new.ensa_bodretal, new.ensa_fecha, 15, NEW.ensa_id,
        new.ensa_conc, NEW.ensa_factor * new.ensa_cant, :COSTO, 'S', new.ensa_lote, new.pref_pre, new.ensa_numero, 0);

    /* RECORRA LAS LISTAS DE PRECIOS Y CAMBIE EL PRECIO */
    EXECUTE PROCEDURE CALCULA_PRECIOS(NEW.ARTI_COD, new.ensa_fecha);

    /* ingrese el retal */
    execute procedure lee_configuracion('INVENTARIO', 'ENSAMBLES', 'ENSAMBLES CON UN ARTICULO PRINCIPAL COMO BASE') returning_values (:ARTPRIN);
    if (ARTPRIN = 'SI') then
        BEGIN
        if ((new.ensa_codretal is not null) and (new.ensa_codretal <> '')) then
            INSERT INTO MOVIMIENTO_ARTICULO
                (ARTI_COD, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM)
                VALUES(NEW.ensa_codretal, new.ensa_bodretal, new.ensa_fecha, 15, NEW.ensa_id,
                new.ensa_conc, new.ensa_cantretal, 0, 'N', new.ensa_lote, new.pref_pre, new.ensa_numero, 999);
        END
    else
        BEGIN
        if ((new.ensa_codretal is not null) and (new.ensa_codretal <> '')) then
            INSERT INTO MOVIMIENTO_ARTICULO
                (ARTI_COD, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM)
                VALUES(NEW.ensa_codretal, new.bode_cod, new.ensa_fecha, 15, NEW.ensa_id,
                new.ensa_conc, new.ensa_cantretal, :COSTO, 'S', new.ensa_lote, new.pref_pre, new.ensa_numero, 999);
        END
    INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
        VALUES (USER, 15, NEW.ensa_id, 'U', NEW.pref_pre || NEW.ensa_numero);
    end
/* SI CAMBIO LA FECHA ACTUALICE LOS DETALLES */
if ((OLD.pref_pre <> NEW.pref_pre) or
    (OLD.ensa_numero <> NEW.ensa_numero) or
    (OLD.ensa_fecha <> NEW.ensa_fecha) ) then
    UPDATE ENSAMBLES_DETALLE SET ESDE_TRANSMIT = 'N' WHERE ENSA_ID = OLD.ENSA_ID;

if (OLD.ensa_anulado <> NEW.ensa_anulado) then
    UPDATE ENSAMBLES_DETALLE SET ESDE_ANULADO = NEW.ensa_anulado WHERE ENSA_ID = OLD.ENSA_ID;

if (OLD.ensa_transmit <> NEW.ensa_transmit) then
    UPDATE ENSAMBLES_DETALLE SET ESDE_TRANSMIT = NEW.ensa_transmit WHERE ENSA_ID = OLD.ENSA_ID;
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER TRIGGER ENTRADAS_DETALLE_AI
AS
declare variable fec date;
declare variable CONC VARCHAR(60);
declare variable factor numeric(18,4);
declare variable Pref varchar(4);
declare variable Num varchar(6);
declare variable Nit varchar(20);
declare variable IVAINC CHAR(2);
declare variable ICOINC CHAR(2);
declare variable COSTO NUMERIC(18,2);
BEGIN
  if ((NEW.entr_id <> 0) and (new.ende_anulado = 'N')) then
    BEGIN
    select entr_fecha, entr_conc, pref_pre, entr_numero, terc_nit, entr_imptos
        from entradas where entr_id = new.entr_id
        into :fec, :conc, :Pref, :Num, :Nit, :ivainc;
    execute procedure factor_unidad_cant(new.arti_cod, new.ende_unidad) returning_values(factor);
    COSTO = ((new.ende_costo - NEW.ende_dtomonto) / :factor);
    if (IVAINC = 'S') then
        BEGIN
        EXECUTE PROCEDURE lee_configuracion ('FACTURACION', 'ARTICULOS', 'IMPOCONSUMO INCLUIDO EN EL PRECIO BASE DE VENTA ANTES DE IVA') returning_values(:icoinc);
        if (icoinc = 'SI') then
            COSTO = COSTO - NEW.ende_consumo;
        COSTO = COSTO / (1 + NEW.ende_ivaporc/100);
        END
    INSERT INTO MOVIMIENTO_ARTICULO
      (ARTI_COD, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM, TERC_NIT)
      VALUES(NEW.ARTI_COD, NEW.BODE_COD, :FEC, 11, NEW.entr_id,
      :CONC, :factor * new.ende_cant, :costo, 'S', new.ende_lote, :Pref, :Num, new.ende_item, :Nit);
    /* RECORRA LAS LISTAS DE PRECIOS Y CAMBIE EL PRECIO */
    EXECUTE PROCEDURE CALCULA_PRECIOS(NEW.ARTI_COD, :FEC);
    /* ACTUALICE EL STAND */
    if (new.ende_stand is not null) then
      if (exists(select stand_cod from stands where arti_cod = new.arti_cod and stand_bodega = new.bode_cod)) then
        UPDATE stands set stand_cod = new.ende_stand where arti_cod = new.arti_cod and stand_bodega = new.bode_cod;
      else
        INSERT INTO stands (ARTI_COD, STAND_BODEGA, STAND_COD) VALUES (NEW.arti_cod, NEW.bode_cod, NEW.ende_stand);
    END
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER TRIGGER ENTRADAS_DETALLE_AU
as
declare variable fec date;
declare variable CONC VARCHAR(60);
declare variable Pref varchar(4);
declare variable Num varchar(6);
declare variable Nit varchar(20);
declare variable factor numeric(18,4);
declare variable IVAINC CHAR(2);
declare variable ICOINC CHAR(2);
declare variable COSTO NUMERIC(18,2);
BEGIN
if ((OLD.entr_id <> 0) AND (OLD.ende_anulado = 'N')) then
    DELETE FROM MOVIMIENTO_ARTICULO WHERE (mvar_tipodoc = 11) and (mvar_idref = new.entr_id) and (mvar_item = old.ende_item);
if ((NEW.entr_id <> 0) AND (NEW.ende_anulado = 'N')) then
    begin
    select entr_fecha, entr_conc, pref_pre, entr_numero, terc_nit, entr_imptos
        from entradas where entr_id = new.entr_id
        into :fec, :conc, :Pref, :Num, :Nit, :ivainc;
    execute procedure factor_unidad_cant(new.arti_cod, new.ende_unidad) returning_values(factor);
    COSTO = ((new.ende_costo - NEW.ende_dtomonto) / :factor);
    if (IVAINC = 'S') then
        BEGIN
        EXECUTE PROCEDURE lee_configuracion ('FACTURACION', 'ARTICULOS', 'IMPOCONSUMO INCLUIDO EN EL PRECIO BASE DE VENTA ANTES DE IVA') returning_values(:icoinc);
        if (icoinc = 'SI') then
            COSTO = COSTO - NEW.ende_consumo;
        COSTO = COSTO / (1 + NEW.ende_ivaporc/100);
        END
    INSERT INTO MOVIMIENTO_ARTICULO
        (ARTI_COD, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM, TERC_NIT)
        VALUES(NEW.ARTI_COD, NEW.BODE_COD, :FEC, 11, NEW.entr_id,
        :CONC, :factor * new.ende_cant, :COSTO, 'S', new.ende_lote, :Pref, :Num, new.ende_item, :Nit);
    /* RECORRA LAS LISTAS DE PRECIOS Y CAMBIE EL PRECIO */
    EXECUTE PROCEDURE CALCULA_PRECIOS(NEW.ARTI_COD, :FEC);
    /* ACTUALICE EL STAND */
    if (new.ende_stand is not null) then
      if (exists(select stand_cod from stands where arti_cod = new.arti_cod and stand_bodega = new.bode_cod)) then
        UPDATE stands set stand_cod = new.ende_stand where arti_cod = new.arti_cod and stand_bodega = new.bode_cod;
      else
        INSERT INTO stands (ARTI_COD, STAND_BODEGA, STAND_COD) VALUES (NEW.arti_cod, NEW.bode_cod, NEW.ende_stand);
    END
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER TRIGGER FACTCOMP_DETALLE_AD
AS
declare variable fec date;
declare variable CONSO VARCHAR(2);
declare variable CONSOLIDA INTEGER;
declare variable NUMROWS INTEGER;
declare variable VERIF CHAR(2);
BEGIN
if ((old.fcde_anulado = 'N') and (OLD.faco_id <> 0)) then
    begin
    select faco_fecha, faco_consolida from facturas_compra where faco_id = old.faco_id into :fec, :consolida;
    DELETE FROM MOVIMIENTO_ARTICULO WHERE (mvar_tipodoc = 21) and (mvar_idref = old.faco_id) and (mvar_item = old.fcde_item);
    /* RECORRA LAS LISTAS DE PRECIOS Y CAMBIE EL PRECIO */
    EXECUTE PROCEDURE CALCULA_PRECIOS(old.ARTI_COD, :FEC);
    /* LOS PENDIENTES */
    if (CONSOLIDA <> 0) then
        BEGIN
        UPDATE consolidado_faltantes SET COFA_OK = 'N' WHERE COFA_ID = :consolida AND COFA_ITEM = old.FCDE_ITEM AND ARTI_COD = old.arti_cod;
        SELECT COUNT(CEFA_ITEM) FROM consolide_faltantes WHERE CEFA_ID = :CONSOLIDA INTO :NUMROWS;
        EXECUTE procedure LEE_CONFIGURACION ('COMPRAS','DOCUMENTOS','SUMAR CANTIDADES PENDIENTES AL CONSOLIDAR DOCUMENTOS') returning_values (CONSO);
        /* IGNORE LA CONSOLIDACION SI SE VALIDAN CODIGOS DE LA ORDEN */
        SELECT MIN(CEFA_TIPOORI) FROM consolide_faltantes WHERE CEFA_ID = :CONSOLIDA INTO :NUMROWS;
        if (NUMROWS = 23) then
            BEGIN
            EXECUTE PROCEDURE LEE_CONFIGURACION('COMPRAS', 'FACTURAS', 'VERIFICAR CODIGOS DE LA ORDEN') returning_values (VERIF);
            if (VERIF = 'SI') then
                CONSO = 'NO';
            END
        SELECT COUNT(CEFA_ITEM) FROM consolide_faltantes WHERE CEFA_ID = :CONSOLIDA INTO :NUMROWS;
        if ((CONSO = 'SI') AND (NUMROWS > 1)) then
            UPDATE consolidado_faltantes SET COFA_OK = 'N' WHERE COFA_ID = :consolida;
        END
    enD
END
^

SET TERM ; ^

SET TERM ^ ;

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

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

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

    /* ACTUALICE EL PENDIENTE  */
    if (CONSOLIDA <> 0) then
        BEGIN
        UPDATE consolidado_faltantes SET COFA_OK = 'S' WHERE COFA_ID = :consolida AND COFA_ITEM = NEW.FCDE_ITEM AND ARTI_COD = NEW.arti_cod;
        EXECUTE procedure LEE_CONFIGURACION ('COMPRAS','DOCUMENTOS','SUMAR CANTIDADES PENDIENTES AL CONSOLIDAR DOCUMENTOS') returning_values (CONSO);
        /* IGNORE LA CONSOLIDACION SI SE VALIDAN CODIGOS DE LA ORDEN */
        SELECT MIN(CEFA_TIPOORI) FROM consolide_faltantes WHERE CEFA_ID = :CONSOLIDA INTO :NUMROWS;
        if (NUMROWS = 23) then
            BEGIN
            EXECUTE PROCEDURE LEE_CONFIGURACION('COMPRAS', 'FACTURAS', 'VERIFICAR CODIGOS DE LA ORDEN') returning_values (MENORV);
            if (MENORV = 'SI') then
                CONSO = 'NO';
            END
        SELECT COUNT(CEFA_ITEM) FROM consolide_faltantes WHERE CEFA_ID = :CONSOLIDA INTO :NUMROWS;
        if ((CONSO = 'SI') AND (NUMROWS > 1)) then
            UPDATE consolidado_faltantes SET COFA_IDDES = NEW.faco_id, COFA_OK = 'S' WHERE COFA_ID = :consolida;
        else
            BEGIN
            /* BUSQUE EL CONSOLIDADO EN EL MISMO ITEM Y SI ES DIFERENTE ACTUALICELO */
            select COFA_CANT * COFA_FACTOR FROM consolidado_faltantes WHERE COFA_ID = :consolida AND COFA_ITEM = NEW.FCDE_ITEM AND ARTI_COD = NEW.arti_cod INTO :CANTREL;
            if (NEW.FCDE_CANT * NEW.FCDE_FACTOR < CANTREL) then
                UPDATE consolidado_faltantes SET COFA_IDDES = NEW.faco_id, COFA_CANT = NEW.FCDE_CANT, COFA_FACTOR = NEW.FCDE_FACTOR
                    WHERE COFA_ID = :consolida AND COFA_ITEM = NEW.FCDE_ITEM AND ARTI_COD = NEW.arti_cod;
            END
        END
    /* ACTUALICE EL STAND */
    if (new.fcde_stand is not null) then
      if (exists(select stand_cod from stands where arti_cod = new.arti_cod and stand_bodega = new.bode_cod)) then
        UPDATE stands set stand_cod = new.fcde_stand where arti_cod = new.arti_cod and stand_bodega = new.bode_cod;
      else
        INSERT INTO stands (ARTI_COD, STAND_BODEGA, STAND_COD) VALUES (NEW.arti_cod, NEW.bode_cod, NEW.fcde_stand);
    END
END
^

SET TERM ; ^

SET TERM ^ ;

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

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

        if (CONSOLIDA <> 0) then
            begin
            UPDATE consolidado_faltantes SET COFA_OK = 'S' WHERE COFA_ID = :consolida AND COFA_ITEM = NEW.FCDE_ITEM AND ARTI_COD = NEW.arti_cod;
            EXECUTE procedure LEE_CONFIGURACION ('COMPRAS','DOCUMENTOS','SUMAR CANTIDADES PENDIENTES AL CONSOLIDAR DOCUMENTOS') returning_values (CONSO);
            /* IGNORE LA CONSOLIDACION SI SE VALIDAN CODIGOS DE LA ORDEN */
            SELECT MIN(CEFA_TIPOORI) FROM consolide_faltantes WHERE CEFA_ID = :CONSOLIDA INTO :NUMROWS;
            if (NUMROWS = 23) then
                BEGIN
                EXECUTE PROCEDURE LEE_CONFIGURACION('COMPRAS', 'FACTURAS', 'VERIFICAR CODIGOS DE LA ORDEN') returning_values (MENORV);
                if (MENORV = 'SI') then
                    CONSO = 'NO';
                END
            SELECT COUNT(CEFA_ITEM) FROM consolide_faltantes WHERE CEFA_ID = :CONSOLIDA INTO :NUMROWS;
            if ((CONSO = 'SI') AND (NUMROWS > 1)) then
                UPDATE consolidado_faltantes SET COFA_IDDES = NEW.faco_id, COFA_OK = 'S' WHERE COFA_ID = :consolida;
            else
                BEGIN
                /* BUSQUE EL CONSOLIDADO EN EL MISMO ITEM Y SI ES DIFERENTE ACTUALICELO */
                select COFA_CANT * COFA_FACTOR FROM consolidado_faltantes WHERE COFA_ID = :consolida AND COFA_ITEM = NEW.FCDE_ITEM AND ARTI_COD = NEW.arti_cod INTO :CANTREL;
                if (NEW.FCDE_CANT * NEW.FCDE_FACTOR < CANTREL) then
                    UPDATE consolidado_faltantes SET COFA_IDDES = NEW.faco_id, COFA_CANT = NEW.FCDE_CANT, COFA_FACTOR = NEW.FCDE_FACTOR
                        WHERE COFA_ID = :consolida AND COFA_ITEM = NEW.FCDE_ITEM AND ARTI_COD = NEW.arti_cod;
                END
            end
        /* ACTUALICE EL STAND */
        if (new.fcde_stand is not null) then
          if (exists(select stand_cod from stands where arti_cod = new.arti_cod and stand_bodega = new.bode_cod)) then
            UPDATE stands set stand_cod = new.fcde_stand where arti_cod = new.arti_cod and stand_bodega = new.bode_cod;
          else
            INSERT INTO stands (ARTI_COD, STAND_BODEGA, STAND_COD) VALUES (NEW.arti_cod, NEW.bode_cod, NEW.fcde_stand);
        END
    end
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER TRIGGER NOTAS_CREDITO_PROVEEDOR_AI
AS
declare variable COSTO NUMERIC(18,2);
declare variable EXISTENCIA NUMERIC(18,4);
declare variable CODBOD VARCHAR(3);
BEGIN
if ((NEW.NCPR_ID <> 0) and (new.ncpr_anulado = 'N')) then
    BEGIN
    /* Registre el nuevo saldo del documento */
    INSERT INTO SALDOS_DOC_CXPAGAR (SDCP_TIPOREF, SDCP_IDREF, SDCP_FECHA, TERC_NIT, SDCP_RTEFTE, SDCP_RTIVA, SDCP_RTICA, SDCP_ABONO, SDCP_ABRTFTE, SDCP_ABRTIVA, SDCP_ABRTICA, SDCP_DEBITO, SDCP_MONTO, SDCP_TRM)
        VALUES (52, NEW.NCPR_ID, NEW.ncpr_fecha, NEW.terc_nit, (NEW.ncpr_rtftemonto * -1), (NEW.ncpr_rtivamonto * -1), (NEW.ncpr_rticamonto * -1), 0, 0, 0, 0, 'N', (NEW.ncpr_monto+NEW.ncpr_ivamonto)*-1, NEW.ncpr_trm);
    /* Registre el movimiento del proveedor */
    INSERT INTO MOVIMIENTO_PROVEEDOR (MVPR_ID, TERC_NIT, MVPR_TIPOREF, MVPR_IDREF, MVPR_FECHA, MVPR_VENCE, MVPR_CONC, MVPR_MONTO, MVPR_RTFTE, MVPR_RTIVA, MVPR_RTICA, MVPR_DEBITO, MVPR_ABONO, MVPR_PREFIJO, MVPR_NUMERO, MVPR_TRM)
      VALUES (GEN_ID(ID_MOVPROV, 1), NEW.TERC_NIT, 52, NEW.NCPR_ID, NEW.NCPR_FECHA, NEW.NCPR_FECHA, NEW.NCPR_CONC, NEW.NCPR_MONTO+NEW.NCPR_IVAMONTO, NEW.NCPR_RTFTEMONTO, NEW.NCPR_RTIVAMONTO, NEW.NCPR_RTICAMONTO, 'N', 'N', NEW.pref_pre, NEW.ncpr_numero, NEW.ncpr_trm);
    /* afecte el articulo */
    if (new.arti_cod <> '') then
        begin
        /* CALCULE EL NUEVO COSTO */
        execute procedure costo_promedio (new.arti_cod, new.ncpr_fecha) returning_values (:COSTO);
        execute procedure saldo_total_inventario (new.arti_cod, new.ncpr_fecha) returning_values (:EXISTENCIA);
        COSTO = ((COSTO * EXISTENCIA) - NEW.ncpr_monto) / EXISTENCIA;
        FOR SELECT DISTINCT BODE_COD FROM EXISTENCIA WHERE ARTI_COD = NEW.ARTI_COD INTO :CODBOD do
            BEGIN
            execute procedure saldo_inventario (new.arti_cod, :CODBOD, new.ncpr_fecha) returning_values (:EXISTENCIA);
            if (EXISTENCIA <> 0) then
                BEGIN
                /* SAQUE TODO LO QUE TENGA */
                INSERT INTO MOVIMIENTO_ARTICULO
                  (ARTI_COD, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM, TERC_NIT)
                  VALUES(NEW.ARTI_COD, :CODBOD, new.ncpr_fecha, 52, NEW.ncpr_id,
                  new.ncpr_conc, :EXISTENCIA, 0, 'N', '', new.pref_pre, new.ncpr_numero, 1, new.terc_nit);
                END
            END
        FOR SELECT DISTINCT BODE_COD, MVAR_CANT FROM MOVIMIENTO_ARTICULO WHERE MVAR_TIPODOC = 52 AND MVAR_IDREF = NEW.ncpr_id
            INTO :CODBOD, :existencia do
            BEGIN
            /* META TODO CON EL NUEVO COSTO */
            INSERT INTO MOVIMIENTO_ARTICULO
              (ARTI_COD, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM, TERC_NIT)
              VALUES(NEW.ARTI_COD, :CODBOD, new.ncpr_fecha, 52, NEW.ncpr_id,
              new.ncpr_conc, :EXISTENCIA, :COSTO, 'S', '', new.pref_pre, new.ncpr_numero, 1, new.terc_nit);
            END
        /* RECORRA LAS LISTAS DE PRECIOS Y CAMBIE EL PRECIO */
        EXECUTE PROCEDURE CALCULA_PRECIOS(NEW.ARTI_COD, new.ncpr_fecha);
        end
    INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
        VALUES (USER, 52, NEW.ncpr_id, 'I', NEW.pref_pre || NEW.ncpr_numero);
    END
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER TRIGGER NOTAS_CREDITO_PROVEEDOR_AU
AS
declare variable ABONOS char(1);
declare variable consec INTEGER;
declare variable COSTO NUMERIC(18,2);
declare variable EXISTENCIA NUMERIC(18,4);
declare variable CODBOD VARCHAR(3);
BEGIN
if (new.ncpr_anulado = 'S') then
    begin
    select enco_consec from comprobante_encabezado where enco_tiporef = 52 and enco_idref = old.ncpr_id into :consec;
    if (NOT consec is null) then
      delete from comprobante_detalle where enco_consec = :consec;
    delete from comprobante_encabezado where enco_tiporef = 52 and enco_idref = old.ncpr_id;
    INSERT INTO AUDITORIA (AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
        VALUES (USER, 52, new.ncpr_id, 'A', NEW.pref_pre || NEW.ncpr_numero);
    end

/* BORRE EL REGISTRO PREVIO */
if ((old.ncpr_id <> 0) and (old.ncpr_anulado = 'N')) then
    begin
    /* Verifique si habia abonos a la nota */
    ABONOS = 'N';
    select 'S' FROM SALDOS_DOC_CXPAGAR WHERE SDCP_TIPOREF = 52 AND SDCP_IDREF = OLD.NCPR_ID AND SDCP_ABONO <> 0 INTO :ABONOS;
    if (ABONOS = 'N') then
        BEGIN
        /* BORRE EL REGISTRO PREVIO */
        delete from saldos_doc_cxpagar where sdcp_tiporef = 52 and sdcp_idref = old.ncpr_id;
        delete from movimiento_PROVEEDOR where (mvpr_tiporef = 52) and (mvpr_idref = old.ncpr_id);
        delete from movimiento_articulo where  (mvar_tipodoc = 52) and (mvar_idref = old.ncpr_id);
        END
    else
        exception DOCUMENTO_CON_ABONOS 'El descuento de proveedor ' || old.pref_pre || old.ncpr_numero || ' tiene abonos registrados.';
    end
if ((new.ncpr_id <> 0) and (new.ncpr_anulado = 'N')) then
    begin
    /* Registre el nuevo saldo del documento */
    INSERT INTO SALDOS_DOC_CXPAGAR (SDCP_TIPOREF, SDCP_IDREF, SDCP_FECHA, TERC_NIT, SDCP_RTEFTE, SDCP_RTIVA, SDCP_RTICA, SDCP_ABONO, SDCP_ABRTFTE, SDCP_ABRTIVA, SDCP_ABRTICA, SDCP_DEBITO, SDCP_MONTO, SDCP_TRM)
        VALUES (52, NEW.NCPR_ID, NEW.ncpr_fecha, NEW.terc_nit, (NEW.ncpr_rtftemonto * -1), (NEW.ncpr_rtivamonto * -1), (NEW.ncpr_rticamonto * -1), 0, 0, 0, 0, 'N', (NEW.ncpr_monto+NEW.ncpr_ivamonto)*-1, NEW.ncpr_trm);
    /* Registre el movimiento del proveedor */
    INSERT INTO MOVIMIENTO_PROVEEDOR (MVPR_ID, TERC_NIT, MVPR_TIPOREF, MVPR_IDREF, MVPR_FECHA, MVPR_VENCE, MVPR_CONC, MVPR_MONTO, MVPR_RTFTE, MVPR_RTIVA, MVPR_RTICA, MVPR_DEBITO, MVPR_ABONO, MVPR_PREFIJO, MVPR_NUMERO, MVPR_TRM)
        VALUES (GEN_ID(ID_MOVPROV, 1), NEW.TERC_NIT, 52, NEW.NCPR_ID, NEW.NCPR_FECHA, NEW.NCPR_FECHA, NEW.NCPR_CONC, NEW.NCPR_MONTO+NEW.ncpr_ivamonto, NEW.NCPR_RTFTEMONTO, NEW.NCPR_RTIVAMONTO, NEW.NCPR_RTICAMONTO, 'N', 'N', NEW.pref_pre, NEW.ncpr_numero, NEW.ncpr_trm);
    /* afecte el articulo */
    if (new.arti_cod <> '') then
        begin
        /* CALCULE EL NUEVO COSTO */
        execute procedure costo_promedio (new.arti_cod, new.ncpr_fecha) returning_values (:COSTO);
        execute procedure saldo_total_inventario (new.arti_cod, new.ncpr_fecha) returning_values (:EXISTENCIA);
        COSTO = ((COSTO * EXISTENCIA) - NEW.ncpr_monto) / EXISTENCIA;
        FOR SELECT DISTINCT BODE_COD FROM EXISTENCIA WHERE ARTI_COD = NEW.ARTI_COD INTO :CODBOD do
            BEGIN
            execute procedure saldo_inventario (new.arti_cod, :CODBOD, new.ncpr_fecha) returning_values (:EXISTENCIA);
            if (EXISTENCIA <> 0) then
                BEGIN
                /* SAQUE TODO LO QUE TENGA */
                INSERT INTO MOVIMIENTO_ARTICULO
                    (ARTI_COD, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM, TERC_NIT)
                    VALUES(NEW.ARTI_COD, :CODBOD, new.ncpr_fecha, 52, NEW.ncpr_id,
                    new.ncpr_conc, :EXISTENCIA, 0, 'N', '', new.pref_pre, new.ncpr_numero, 1, new.terc_nit);
                end
            END
        FOR SELECT DISTINCT BODE_COD, MVAR_CANT FROM MOVIMIENTO_ARTICULO WHERE MVAR_TIPODOC = 52 AND MVAR_IDREF = NEW.ncpr_id
            INTO :CODBOD, :existencia do
            BEGIN
            /* META TODO CON EL NUEVO COSTO */
            INSERT INTO MOVIMIENTO_ARTICULO
                (ARTI_COD, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM, TERC_NIT)
                VALUES(NEW.ARTI_COD, :CODBOD, new.ncpr_fecha, 52, NEW.ncpr_id,
                new.ncpr_conc, :EXISTENCIA, :COSTO, 'S', '', new.pref_pre, new.ncpr_numero, 1, new.terc_nit);
            END
        /* RECORRA LAS LISTAS DE PRECIOS Y CAMBIE EL PRECIO */
        EXECUTE PROCEDURE CALCULA_PRECIOS(NEW.ARTI_COD, new.ncpr_fecha);
        end
    INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
        VALUES (USER, 52, NEW.ncpr_id, 'U', NEW.pref_pre || NEW.ncpr_numero);
    end
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER TRIGGER NOTAS_DEBITO_PROVEEDOR_AI
AS
declare variable COSTO NUMERIC(18,2);
declare variable EXISTENCIA NUMERIC(18,4);
declare variable CODBOD VARCHAR(3);
BEGIN
  if ((NEW.NDPR_ID <> 0) and (new.ndpr_anulado = 'N')) then
    BEGIN
    INSERT INTO SALDOS_DOC_CXPAGAR (SDCP_TIPOREF, SDCP_IDREF, SDCP_FECHA, TERC_NIT, SDCP_RTEFTE, SDCP_RTIVA, SDCP_RTICA, SDCP_ABONO, SDCP_ABRTFTE, SDCP_ABRTIVA, SDCP_ABRTICA, SDCP_DEBITO, SDCP_MONTO, SDCP_TRM)
        VALUES (51, NEW.NDPR_ID, NEW.ndpr_fecha, NEW.terc_nit, NEW.ndpr_rtftemonto, NEW.ndpr_rtivamonto, NEW.ndpr_rticamonto, 0, 0, 0, 0, 'S', NEW.ndpr_monto+NEW.ndpr_ivamonto, NEW.ndpr_trm);
    /* Registre el movimiento del proveedor */
    INSERT INTO MOVIMIENTO_PROVEEDOR (MVPR_ID, TERC_NIT, MVPR_TIPOREF, MVPR_IDREF, MVPR_FECHA, MVPR_VENCE, MVPR_CONC, MVPR_MONTO, MVPR_RTFTE, MVPR_RTIVA, MVPR_RTICA, MVPR_DEBITO, MVPR_ABONO, MVPR_PREFIJO, MVPR_NUMERO, MVPR_TRM)
      VALUES (GEN_ID(ID_MOVPROV, 1), NEW.TERC_NIT, 51, NEW.NDPR_ID, NEW.NDPR_FECHA, NEW.NDPR_VENCE, NEW.NDPR_CONC, NEW.NDPR_MONTO+NEW.ndpr_Ivamonto, NEW.NDPR_RTFTEMONTO, NEW.NDPR_RTIVAMONTO, NEW.NDPR_RTICAMONTO, 'S', 'N', NEW.pref_pre, NEW.ndpr_numero, NEW.ndpr_trm);
    /* afecte el articulo */
    if (new.arti_cod <> '') then
        begin
        /* CALCULE EL NUEVO COSTO */
        execute procedure costo_promedio (new.arti_cod, new.ndpr_fecha) returning_values (:COSTO);
        execute procedure saldo_total_inventario (new.arti_cod, new.ndpr_fecha) returning_values (:EXISTENCIA);
        COSTO = (COSTO * EXISTENCIA + (NEW.ndpr_monto)) / EXISTENCIA;
        FOR SELECT DISTINCT BODE_COD FROM EXISTENCIA WHERE ARTI_COD = NEW.ARTI_COD INTO :CODBOD do
            BEGIN
            execute procedure saldo_inventario (new.arti_cod, :CODBOD, new.ndpr_fecha) returning_values (:EXISTENCIA);
            if (existencia <> 0) then
                BEGIN
                /* SAQUE TODO LO QUE TENGA */
                INSERT INTO MOVIMIENTO_ARTICULO
                  (ARTI_COD, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM, TERC_NIT)
                  VALUES(NEW.ARTI_COD, :CODBOD, new.ndpr_fecha, 51, NEW.ndpr_id,
                  new.ndpr_conc, :EXISTENCIA, 0, 'N', '', new.pref_pre, new.ndpr_numero, 1, new.terc_nit);
                END
            END
        FOR SELECT DISTINCT BODE_COD, MVAR_CANT FROM MOVIMIENTO_ARTICULO WHERE MVAR_TIPODOC = 51 AND MVAR_IDREF = NEW.ndpr_id
            INTO :CODBOD, :existencia do
            BEGIN
            /* META TODO CON EL NUEVO COSTO */
            INSERT INTO MOVIMIENTO_ARTICULO
              (ARTI_COD, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM, TERC_NIT)
              VALUES(NEW.ARTI_COD, :CODBOD, new.ndpr_fecha, 51, NEW.ndpr_id,
              new.ndpr_conc, :EXISTENCIA, :COSTO, 'S', '', new.pref_pre, new.ndpr_numero, 1, new.terc_nit);
            END
        /* RECORRA LAS LISTAS DE PRECIOS Y CAMBIE EL PRECIO */
        EXECUTE PROCEDURE CALCULA_PRECIOS(NEW.ARTI_COD, new.ndpr_fecha);
        end
    INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
        VALUES (USER, 51, NEW.ndpr_id, 'I', NEW.pref_pre || NEW.ndpr_numero);
    END
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER TRIGGER NOTAS_DEBITO_PROVEEDOR_AU
AS
declare variable ABONOS char(1);
declare variable consec INTEGER;
declare variable COSTO NUMERIC(18,2);
declare variable EXISTENCIA NUMERIC(18,4);
declare variable CODBOD VARCHAR(3);
BEGIN
if (new.ndpr_anulado = 'S') then
    begin
    select enco_consec from comprobante_encabezado where enco_tiporef = 51 and enco_idref = old.ndpr_id into :consec;
    if (NOT consec is null) then
      delete from comprobante_detalle where enco_consec = :consec;
    delete from comprobante_encabezado where enco_tiporef = 51 and enco_idref = old.ndpr_id;
    INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
        VALUES (USER, 51, NEW.ndpr_id, 'A', NEW.pref_pre || NEW.ndpr_numero);
    end

/* BORRE EL REGISTRO PREVIO */
if ((old.ndpr_id <> 0) and (old.ndpr_anulado = 'N')) then
    begin
    /* Verifique si habia abonos a la nota */
    ABONOS = 'N';
    select 'S' FROM SALDOS_DOC_CXPAGAR WHERE SDCP_TIPOREF = 51 AND SDCP_IDREF = OLD.NDPR_ID AND SDCP_ABONO <> 0 INTO :ABONOS;
    if (ABONOS = 'N') then
        BEGIN
        /* BORRE EL REGISTRO PREVIO */
        delete from saldos_doc_cxpagar where sdcp_tiporef = 51 and sdcp_idref = old.ndpr_id;
        delete from movimiento_PROVEEDOR where (mvpr_tiporef = 51) and (mvpr_idref = old.ndpr_id);
        delete from movimiento_articulo where  (mvar_tipodoc = 51) and (mvar_idref = old.ndpr_id);
        END
    else
        exception DOCUMENTO_CON_ABONOS 'El cargo de proveedor ' || old.pref_pre || old.ndpr_numero || ' tiene abonos registrados.';
    end
if ((new.ndpr_id <> 0) and (new.ndpr_anulado = 'N')) then
    begin
    /* Registre el nuevo saldo del documento */
    INSERT INTO SALDOS_DOC_CXPAGAR (SDCP_TIPOREF, SDCP_IDREF, SDCP_FECHA, TERC_NIT, SDCP_RTEFTE, SDCP_RTIVA, SDCP_RTICA, SDCP_ABONO, SDCP_ABRTFTE, SDCP_ABRTIVA, SDCP_ABRTICA, SDCP_DEBITO, SDCP_MONTO, SDCP_TRM)
        VALUES (51, NEW.NDPR_ID, NEW.ndpr_fecha, NEW.terc_nit, NEW.ndpr_rtftemonto, NEW.ndpr_rtivamonto, NEW.ndpr_rticamonto, 0, 0, 0, 0, 'N', NEW.ndpr_monto+NEW.ndpr_ivamonto, NEW.ndpr_trm);
    /* Registre el movimiento del proveedor */
    INSERT INTO MOVIMIENTO_PROVEEDOR (MVPR_ID, TERC_NIT, MVPR_TIPOREF, MVPR_IDREF, MVPR_FECHA, MVPR_VENCE, MVPR_CONC, MVPR_MONTO, MVPR_RTFTE, MVPR_RTIVA, MVPR_RTICA, MVPR_DEBITO, MVPR_ABONO, MVPR_PREFIJO, MVPR_NUMERO, MVPR_TRM)
        VALUES (GEN_ID(ID_MOVPROV, 1), NEW.TERC_NIT, 51, NEW.NDPR_ID, NEW.NDPR_FECHA, NEW.ndpr_vence, NEW.NDPR_CONC, NEW.NDPR_MONTO+NEW.ndpr_ivamonto, NEW.NDPR_RTFTEMONTO, NEW.NDPR_RTIVAMONTO, NEW.NDPR_RTICAMONTO, 'S', 'N', NEW.pref_pre, NEW.ndpr_numero, NEW.ndpr_trm);
    if (new.arti_cod <> '') then
        begin
        /* CALCULE EL NUEVO COSTO */
        execute procedure costo_promedio (new.arti_cod, new.ndpr_fecha) returning_values (:COSTO);
        execute procedure saldo_total_inventario (new.arti_cod, new.ndpr_fecha) returning_values (:EXISTENCIA);
        COSTO = (COSTO * EXISTENCIA + (NEW.ndpr_monto)) / EXISTENCIA;
        FOR SELECT DISTINCT BODE_COD FROM EXISTENCIA WHERE ARTI_COD = NEW.ARTI_COD INTO :CODBOD do
            BEGIN
            execute procedure saldo_inventario (new.arti_cod, :CODBOD, new.ndpr_fecha) returning_values (:EXISTENCIA);
            if (existencia <> 0) then
                BEGIN
                /* SAQUE TODO LO QUE TENGA */
                INSERT INTO MOVIMIENTO_ARTICULO
                  (ARTI_COD, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM, TERC_NIT)
                  VALUES(NEW.ARTI_COD, :CODBOD, new.ndpr_fecha, 51, NEW.ndpr_id,
                  new.ndpr_conc, :EXISTENCIA, 0, 'N', '', new.pref_pre, new.ndpr_numero, 1, new.terc_nit);
                END
            END
        FOR SELECT DISTINCT BODE_COD, MVAR_CANT FROM MOVIMIENTO_ARTICULO WHERE MVAR_TIPODOC = 51 AND MVAR_IDREF = NEW.ndpr_id
            INTO :CODBOD, :existencia do
            BEGIN
            /* META TODO CON EL NUEVO COSTO */
            INSERT INTO MOVIMIENTO_ARTICULO
              (ARTI_COD, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM, TERC_NIT)
              VALUES(NEW.ARTI_COD, :CODBOD, new.ndpr_fecha, 51, NEW.ndpr_id,
              new.ndpr_conc, :EXISTENCIA, :COSTO, 'S', '', new.pref_pre, new.ndpr_numero, 1, new.terc_nit);
            END
        /* RECORRA LAS LISTAS DE PRECIOS Y CAMBIE EL PRECIO */
        EXECUTE PROCEDURE CALCULA_PRECIOS(NEW.ARTI_COD, new.ndpr_fecha);
        end
    INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
        VALUES (USER, 51, NEW.ndpr_id, 'U', NEW.pref_pre || NEW.ndpr_numero);
    end
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER TRIGGER REMISION_PROVEEDOR_DET_AI
AS
declare variable fec date;
declare variable CONC VARCHAR(60);
declare variable factor numeric(18,4);
declare variable Pref varchar(4);
declare variable Num varchar(6);
declare variable EXISTE CHAR(1);
declare variable NIT VARCHAR(20);
declare variable NUMPROV VARCHAR(20);
declare variable Tipo Integer;
declare variable idfact integer;
declare variable numrows integer;
declare variable IVAINC CHAR(2);
declare variable ICOINC CHAR(2);
declare variable COSTO NUMERIC(18,2);
declare variable CANTREL NUMERIC(18,4);
declare variable NUMPED VARCHAR(30);
declare variable CONSO CHAR(2);
declare variable CONSOLIDA INTEGER;
declare variable DTOPIE NUMERIC(18,2);
declare variable ADICIONAL NUMERIC(18,2);
declare variable TOTAL NUMERIC(18,2);
declare variable IVAMONTO NUMERIC(18,2);
declare variable EXTRA NUMERIC(18,2);
declare variable FACT NUMERIC(18,4);
declare variable MENORV CHAR(2);
declare variable CEROS CHAR(2);
declare variable ACTREM CHAR(2);
BEGIN
  if ((NEW.repr_id <> 0) and (new.rpvd_anulado = 'N')) then
    BEGIN
    select max(rprd_tiporel), max(rprd_idrel) from remision_proveedor_docrela
        where repr_id = new.repr_id into :Tipo, :idfact;
    if (Tipo is null) then
        Tipo = 0;
    /* si se hizo con base en una factura que afecto el inventario no afecte inventario */
    numrows = 0;
    if (Tipo = 21) Then
        select count(*) from movimiento_articulo where mvar_tipodoc = 21 and mvar_idref = :idfact into :numrows;
    if (numrows is null) then
        numrows = 0;
    if (numrows = 0) then
        begin
        select repr_fecha, pref_pre, repr_numero, REPR_IMPTOS, terc_nit, REPR_NUMPROV, REPR_ORDEN, REPR_CONSOLIDA, repr_dtomonto, repr_adicional, repr_total, repr_ivamonto, repr_extra
            from remision_proveedor where repr_id = new.repr_id
            into :fec, :Pref, :Num, :IVAINC, :NIT, :NUMPROV, :numped, :CONSOLIDA, :dtopie, :adicional, :total, :ivamonto, :extra;
        execute procedure factor_unidad_cant(new.arti_cod, new.rpvd_unidad) returning_values(factor);
        CONC = 'REMISION PROVEEDOR No.' || PREF || NUM || '-' || NUMPROV;
        if (numped <> '') then
            conc = conc || '-ORDEN ' || NUMPED;
        COSTO = ((new.rpvd_prunit - NEW.rpvd_dtomonto) / :factor);
        if (IVAINC = 'S') then
            BEGIN
            EXECUTE PROCEDURE lee_configuracion ('FACTURACION', 'ARTICULOS', 'IMPOCONSUMO INCLUIDO EN EL PRECIO BASE DE VENTA ANTES DE IVA') returning_values(:icoinc);
            if (icoinc = 'SI') then
                COSTO = COSTO - (NEW.rpvd_consumo/(NEW.rpvd_cant * new.rpvd_factor));
            COSTO = COSTO / (1 + NEW.rpvd_ivaporc/100);
            END
        EXECUTE PROCEDURE lee_configuracion('COMPRAS','FACTURAS','DESCUENTO Y VALOR ADICIONAL DEL DOCUMENTO COMO MENOR VALOR DEL COSTO') returning_values (:MENORV);
        if (MENORV = 'SI') then
            BEGIN
            FACT = (TOTAL - EXTRA - IVAMONTO);
            if ((FACT - ADICIONAL + DTOPIE) <> 0) then
                FACT = FACT / (FACT - ADICIONAL + DTOPIE);
            ELSE
                FACT = 1;
            COSTO = COSTO * FACT;
            END
        if (COSTO = 0) then
            BEGIN
            EXECUTE PROCEDURE lee_configuracion('COMPRAS', 'REMISIONES', 'PERMITIR CEROS EN COSTOS DE MERCANCIA') returning_values (:ceros);
            EXECUTE PROCEDURE lee_configuracion('COMPRAS', 'FACTURAS', 'ACTUALIZAR COSTOS DE LA REMISION RELACIONADA AL GRABAR LA FACTURA') returning_values (:ACTREM);
            if ((ACTREM = 'SI') and (CEROS = 'NO')) then
                execute procedure costo_promedio(NEW.arti_cod, :fec) returning_values (:COSTO);
            END
        INSERT INTO MOVIMIENTO_ARTICULO
          (ARTI_COD, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM, TERC_NIT)
          VALUES(NEW.ARTI_COD, NEW.BODE_COD, :FEC, 22, NEW.repr_id,
          :CONC, :factor * new.rpvd_cant, :COSTO, 'S', new.rpvd_lote, :Pref, :Num, new.rpvd_item, :Nit);

        /* RECORRA LAS LISTAS DE PRECIOS Y CAMBIE EL PRECIO */
        EXECUTE PROCEDURE CALCULA_PRECIOS(NEW.ARTI_COD, :FEC);

        if (COSTO > 0 ) then
         BEGIN
          /* GRABE PROV X ARTICULO */
          EXISTE = 'N';
          SELECT 'S' FROM PROVEEDOR_ARTICULO WHERE TERC_NIT = :NIT AND ARTI_COD = NEW.ARTI_COD INTO :EXISTE;
          if (EXISTE = 'S') then
            UPDATE PROVEEDOR_ARTICULO 
                SET PVAR_FECHA = :FEC, PVAR_COSTO = :COSTO, PVAR_COD = NEW.rpvd_codprov
                WHERE TERC_NIT = :NIT AND ARTI_COD = NEW.ARTI_COD;
          ELSE
            INSERT INTO PROVEEDOR_ARTICULO (TERC_NIT, ARTI_COD, PVAR_COSTO, PVAR_FECHA, PVAR_COD,PVAR_DES)
                VALUES (:NIT, NEW.ARTI_COD, :COSTO, :FEC, NEW.rpvd_codprov,NEW.rpvd_desc);
         END
        end

    /* ACTUALICE EL PENDIENTE  */
    if (CONSOLIDA <> 0) then
        BEGIN
        EXECUTE PROCEDURE LEE_CONFIGURACION ('COMPRAS','DOCUMENTOS','SUMAR CANTIDADES PENDIENTES AL CONSOLIDAR DOCUMENTOS') returning_values (CONSO);
        SELECT MIN(CEFA_TIPOORI) FROM consolide_faltantes WHERE CEFA_ID = :CONSOLIDA INTO :NUMROWS;
        if (NUMROWS = 23) then
            BEGIN
            EXECUTE PROCEDURE LEE_CONFIGURACION('COMPRAS', 'REMISIONES', 'VERIFICAR CODIGOS DE LA ORDEN') returning_values (MENORV);
            if (MENORV = 'SI') then
                CONSO = 'NO';
            END
        SELECT COUNT(CEFA_ITEM) FROM consolide_faltantes WHERE CEFA_ID = :CONSOLIDA INTO :NUMROWS;
        if ((CONSO = 'SI') AND (NUMROWS > 1)) then
            UPDATE consolidado_faltantes SET COFA_OK = 'S' WHERE COFA_ID = :consolida;
        ELSE
            BEGIN
            /* BUSQUE EL CONSOLIDADO EN EL MISMO ITEM Y SI ES DIFERENTE ACTUALICELO */
            select COFA_CANT * COFA_FACTOR FROM consolidado_faltantes WHERE COFA_ID = :consolida AND COFA_ITEM = NEW.RPVD_ITEM AND ARTI_COD = NEW.arti_cod INTO :CANTREL;
            if (NEW.RPVD_CANT * NEW.RPVD_FACTOR < CANTREL) then
                UPDATE consolidado_faltantes SET COFA_IDDES = NEW.repr_id, COFA_CANT = NEW.RPVD_CANT, COFA_FACTOR = NEW.RPVD_FACTOR
                    WHERE COFA_ID = :consolida AND COFA_ITEM = NEW.RPVD_ITEM AND ARTI_COD = NEW.arti_cod;
            ELSE
                UPDATE consolidado_faltantes SET COFA_IDDES = NEW.repr_id, COFA_OK = 'S' WHERE COFA_ID = :consolida AND COFA_ITEM = NEW.RPVD_ITEM AND ARTI_COD = NEW.arti_cod;
            END
        END
    /* ACTUALICE EL STAND */
    if (new.rpvd_stand is not null) then
      if (exists(select stand_cod from stands where arti_cod = new.arti_cod and stand_bodega = new.bode_cod)) then
        UPDATE stands set stand_cod = new.rpvd_stand where arti_cod = new.arti_cod and stand_bodega = new.bode_cod;
      else
        INSERT INTO stands (ARTI_COD, STAND_BODEGA, STAND_COD) VALUES (NEW.arti_cod, NEW.bode_cod, NEW.rpvd_stand);
    END
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER TRIGGER REMISION_PROVEEDOR_DET_AU
AS
declare variable fec date;
declare variable CONC VARCHAR(60);
declare variable Pref varchar(4);
declare variable Num varchar(6);
declare variable factor numeric(18,4);
declare variable EXISTE CHAR(1);
declare variable NIT VARCHAR(20);
declare variable NUMPROV VARCHAR(20);
declare variable Tipo integer;
declare variable idfact integer;
declare variable numrows integer;
declare variable IVAINC CHAR(2);
declare variable ICOINC CHAR(2);
declare variable COSTO NUMERIC(18,2);
declare variable CANTREL NUMERIC(18,4);
declare variable NUMPED VARCHAR(30);
declare variable CONSO CHAR(2);
declare variable CONSOLIDA INTEGER;
declare variable DTOPIE NUMERIC(18,2);
declare variable ADICIONAL NUMERIC(18,2);
declare variable TOTAL NUMERIC(18,2);
declare variable IVAMONTO NUMERIC(18,2);
declare variable EXTRA NUMERIC(18,2);
declare variable FACT NUMERIC(18,4);
declare variable MENORV CHAR(2);
declare variable CEROS CHAR(2);
declare variable ACTREM CHAR(2);
BEGIN
if ((OLD.repr_id <> 0) AND (OLD.rpvd_anulado = 'N')) then
    begin
    DELETE FROM MOVIMIENTO_ARTICULO WHERE (mvar_tipodoc = 22) and (mvar_idref = new.repr_id) and (mvar_item = old.rpvd_item);
    select REPR_CONSOLIDA from remision_proveedor where repr_id = old.repr_id into :CONSOLIDA;
    if (CONSOLIDA <> 0) then
        begin
        EXECUTE PROCEDURE LEE_CONFIGURACION ('COMPRAS','DOCUMENTOS','SUMAR CANTIDADES PENDIENTES AL CONSOLIDAR DOCUMENTOS') returning_values (CONSO);
        SELECT COUNT(CEFA_ITEM) FROM consolide_faltantes WHERE CEFA_ID = :CONSOLIDA INTO :NUMROWS;
        if ((NUMROWS = 1) OR (CONSO = 'NO')) then
            UPDATE consolidado_faltantes SET COFA_OK = 'N' WHERE COFA_ID = :consolida AND COFA_ITEM = old.RPVD_ITEM AND ARTI_COD = old.arti_cod;
        else
            UPDATE consolidado_faltantes SET COFA_OK = 'N' WHERE COFA_ID = :consolida;
        END
    end
/* Registre el nuevo */
if ((new.repr_id <> 0) AND (new.rpvd_anulado = 'N')) then
    begin
    select repr_fecha, pref_pre, repr_numero, repr_imptos, terc_nit, REPR_NUMPROV, REPR_ORDEN, REPR_CONSOLIDA, repr_dtomonto, repr_adicional, repr_total, repr_ivamonto, repr_extra
        from remision_proveedor where repr_id = new.repr_id
        into :fec, :Pref, :Num, :IVAINC, :NIT, :NUMPROV, :numped, :CONSOLIDA, :dtopie, :adicional, :total, :ivamonto, :extra;
    CONC = 'REMISION PROVEEDOR No.' || PREF || NUM || '-' || NUMPROV;
    if (numped <> '') then
        conc = conc || '-ORDEN ' || NUMPED;
    SELECT MAX(CEFA_TIPOORI) FROM consolide_faltantes WHERE CEFA_ID = :CONSOLIDA INTO :TIPO;
    if (Tipo is null) then
        Tipo = 0;
    select FACO_ID from FACTURAS_COMPRA WHERE FACO_CONSOLIDA = :consolida INTO :IDFACT;
    if (Idfact is null) then
        Idfact = 0;
    /* si se hizo con base en una factura que afecto el inventario no afecte inventario */
    numrows = 0;
    if (Tipo = 21) Then
        select count(*) from movimiento_articulo where mvar_tipodoc = 21 and mvar_idref = :idfact into :numrows;
    if (numrows is null) then
        numrows = 0;
    if (numrows = 0) then
        begin
        execute procedure factor_unidad_cant(new.arti_cod, new.rpvd_unidad) returning_values(factor);
        COSTO = ((new.rpvd_prunit - NEW.rpvd_dtomonto) / :factor);
        if (IVAINC = 'S') then
            BEGIN
            EXECUTE PROCEDURE lee_configuracion ('FACTURACION', 'ARTICULOS', 'IMPOCONSUMO INCLUIDO EN EL PRECIO BASE DE VENTA ANTES DE IVA') returning_values(:icoinc);
            if (icoinc = 'SI') then
                COSTO = COSTO - (NEW.rpvd_consumo/(NEW.rpvd_cant * new.rpvd_factor));
            COSTO = COSTO / (1 + NEW.rpvd_ivaporc/100);
            END
        EXECUTE PROCEDURE lee_configuracion('COMPRAS','FACTURAS','DESCUENTO Y VALOR ADICIONAL DEL DOCUMENTO COMO MENOR VALOR DEL COSTO') returning_values (:MENORV);
        if (MENORV = 'SI') then
            BEGIN
            FACT = (TOTAL - EXTRA - IVAMONTO);
            if ((FACT - ADICIONAL + DTOPIE) <> 0) then
                FACT = FACT / (FACT - ADICIONAL + DTOPIE);
            ELSE
                FACT = 1;
            COSTO = COSTO * FACT;
            END
        if (COSTO = 0) then
            BEGIN
            EXECUTE PROCEDURE lee_configuracion('COMPRAS', 'REMISIONES', 'PERMITIR CEROS EN COSTOS DE MERCANCIA') returning_values (:ceros);
            EXECUTE PROCEDURE lee_configuracion('COMPRAS', 'FACTURAS', 'ACTUALIZAR COSTOS DE LA REMISION RELACIONADA AL GRABAR LA FACTURA') returning_values (:ACTREM);
            if ((ACTREM = 'SI') and (CEROS = 'NO')) then
                execute procedure costo_promedio(NEW.arti_cod, :fec) returning_values (:COSTO);
            END
        INSERT INTO MOVIMIENTO_ARTICULO
            (ARTI_COD, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM, TERC_NIT)
            VALUES(NEW.ARTI_COD, NEW.BODE_COD, :FEC, 22, NEW.repr_id,
            :CONC, :factor * new.rpvd_cant, :COSTO, 'S', new.rpvd_lote, :Pref, :Num, new.rpvd_item, :Nit);
            
        /* RECORRA LAS LISTAS DE PRECIOS Y CAMBIE EL PRECIO */
        EXECUTE PROCEDURE CALCULA_PRECIOS(NEW.ARTI_COD, :FEC);
          
        if (COSTO > 0 ) then
         BEGIN
          /* GRABE PROV X ARTICULO */
          EXISTE = 'N';
          SELECT 'S' FROM PROVEEDOR_ARTICULO WHERE TERC_NIT = :NIT AND ARTI_COD = NEW.ARTI_COD INTO :EXISTE;
          if (EXISTE = 'S') then
            UPDATE PROVEEDOR_ARTICULO
                SET PVAR_FECHA = :FEC, PVAR_COSTO = :COSTO, PVAR_COD = NEW.rpvd_codprov
                WHERE TERC_NIT = :NIT AND ARTI_COD = NEW.ARTI_COD;
          ELSE
            INSERT INTO PROVEEDOR_ARTICULO (TERC_NIT, ARTI_COD, PVAR_COSTO, PVAR_FECHA, PVAR_COD,PVAR_DES)
                VALUES (:NIT, NEW.ARTI_COD, :COSTO, :FEC, NEW.rpvd_codprov,NEW.rpvd_desc);
         END
        end
    if (CONSOLIDA <> 0) then
        BEGIN
        EXECUTE PROCEDURE LEE_CONFIGURACION ('COMPRAS','DOCUMENTOS','SUMAR CANTIDADES PENDIENTES AL CONSOLIDAR DOCUMENTOS') returning_values (CONSO);
        /* IGNORE LA CONSOLIDACION SI SE VALIDAN CODIGOS DE LA ORDEN */
        SELECT MIN(CEFA_TIPOORI) FROM consolide_faltantes WHERE CEFA_ID = :CONSOLIDA INTO :NUMROWS;
        if (NUMROWS = 23) then
            BEGIN
            EXECUTE PROCEDURE LEE_CONFIGURACION('COMPRAS', 'REMISIONES', 'VERIFICAR CODIGOS DE LA ORDEN') returning_values (MENORV);
            if (MENORV = 'SI') then
                CONSO = 'NO';
            END
        SELECT COUNT(CEFA_ITEM) FROM consolide_faltantes WHERE CEFA_ID = :CONSOLIDA INTO :NUMROWS;
        if ((CONSO = 'SI') AND (NUMROWS > 1)) then
            UPDATE consolidado_faltantes SET COFA_IDDES = NEW.repr_id, COFA_OK = 'S' WHERE COFA_ID = :consolida;
        ELSE
            BEGIN
            /* BUSQUE EL CONSOLIDADO EN EL MISMO ITEM Y SI ES DIFERENTE ACTUALICELO */
            select COFA_CANT * COFA_FACTOR FROM consolidado_faltantes WHERE COFA_ID = :consolida AND COFA_ITEM = NEW.RPVD_ITEM AND ARTI_COD = NEW.arti_cod INTO :CANTREL;
            if (NEW.RPVD_CANT * NEW.RPVD_FACTOR < CANTREL) then
                UPDATE consolidado_faltantes SET COFA_IDDES = NEW.repr_id, COFA_CANT = NEW.RPVD_CANT, COFA_FACTOR = NEW.RPVD_FACTOR
                    WHERE COFA_ID = :consolida AND COFA_ITEM = NEW.RPVD_ITEM AND ARTI_COD = NEW.arti_cod;
            else
                UPDATE consolidado_faltantes SET COFA_IDDES = NEW.repr_id, COFA_OK = 'S' WHERE COFA_ID = :consolida AND COFA_ITEM = NEW.RPVD_ITEM AND ARTI_COD = NEW.arti_cod;
            END
        END
    /* ACTUALICE EL STAND */
    if (new.rpvd_stand is not null) then
      if (exists(select stand_cod from stands where arti_cod = new.arti_cod and stand_bodega = new.bode_cod)) then
        UPDATE stands set stand_cod = new.rpvd_stand where arti_cod = new.arti_cod and stand_bodega = new.bode_cod;
      else
        INSERT INTO stands (ARTI_COD, STAND_BODEGA, STAND_COD) VALUES (NEW.arti_cod, NEW.bode_cod, NEW.rpvd_stand);
    END
END
^

SET TERM ; ^


/* 20100224B */
/* ultimo contacto con el cliente */

SET TERM ^ ;

CREATE OR ALTER procedure REP_CLIENTES_CRM (
    DESDE varchar(20),
    HASTA varchar(20),
    ZONINI varchar(5),
    ZONFIN varchar(5),
    VENINI integer,
    VENFIN integer,
    AGRUPA char(1),
    ORDEN char(1),
    INACTIVOS char(1))
returns (
    NIT varchar(20),
    NOM varchar(60),
    DIR varchar(60),
    CIU varchar(40),
    TEL varchar(40),
    CONTACTO varchar(60),
    OBS varchar(255),
    EMAIL varchar(100),
    FAX varchar(25),
    CEL varchar(25),
    CODCLIE varchar(20),
    CODCIU varchar(6),
    ZONA varchar(2),
    ESTADO char(1),
    COBR integer,
    VEND integer,
    GRUPOC integer,
    CLASE integer,
    ANIV date,
    CLIDESDE date,
    CALIFICA integer,
    TIPO integer,
    GRUPCRM integer,
    CAMPO1 varchar(60),
    CAMPO2 varchar(60),
    CAMPO3 varchar(60),
    FECHA1 date,
    FECHA2 date,
    MONTO1 numeric(18,2),
    MONTO2 numeric(18,2),
    MONTO3 numeric(18,2),
    ESTERC char(1),
    NOMVEND varchar(60),
    NOMCOBR varchar(60),
    NOMZONA varchar(60),
    NOMCIUD varchar(60),
    NOMGRP varchar(60),
    NOMTIPO varchar(60),
    NOMAGRUPA varchar(60),
    ULTEVENFEC DATE,
    ULTEVENASE INTEGER)
AS
declare variable NITINI VARCHAR(20);
declare variable NITFIN VARCHAR(20);
declare variable NOMINI VARCHAR(20);
declare variable NOMFIN VARCHAR(20);
begin
if (ORDEN = 'C') then
    BEGIN
    NITINI = DESDE;
    NITFIN = HASTA;
    NOMINI = '';
    NOMFIN = 'zz';
    END
ELSE
    BEGIN
    NOMINI = DESDE;
    NOMFIN = HASTA;
    NITINI = '';
    NITFIN = 'zz';
    END

for select t.crcl_nit,t.crcl_nom,t.crcl_dir,t.crcl_ciu,t.crcl_tel,t.crcl_contacto,SUBSTRING(T.crcl_obs FROM 1 FOR 255),
    t.crcl_email,t.crcl_fax,t.crcl_cel,t.crcl_estado,c.zona_cod, t.crcl_aniv,t.crcl_tiporela, t.crcl_clase, c.clie_cod,
    c.vend_cod, c.cobr_cod, c.clie_fecha, t.crcl_agrupa, t.crcl_califica, t.crcl_campo1, t.crcl_campo2, t.crcl_campo3,
    t.crcl_fecha1, t.crcl_fecha2, t.crcl_monto1, t.crcl_monto2, t.crcl_monto3, t.crcl_estercero, t.ciud_cod, c.grca_cod
    from crm_clientes t, clientes c where t.crcl_nit = c.terc_nit and t.crcl_nit >= :nitini and t.crcl_nit <= :nitfin and t.crcl_nom >= :nomini and t.crcl_nom <= :nomfin
    into :nit, :nom, :dir, :ciu, :tel, :contacto, :obs,
    :email, :fax, :cel, :estado, :zona, :aniv, :tipo, :clase, :codclie,
    :vend, :cobr, :clidesde, :grupcrm, :califica, :campo1, :campo2, :campo3,
    :fecha1, :fecha2, :monto1, :monto2, :monto3, :esterc, :codciu, :grupoc
    do
    begin
    if ((inactivos = 'S') or (estado <> 'I'))  then
        begin
        nomzona = '';
        nomcobr = '';
        nomciud = '';
        nomvend = '';
        ultevenase = 0;
        select first 1 crev_fecha, crev_asesor from crm_eventos where crcl_nit = :nit
            order by crev_fecha desc into :ultevenfec, :ultevenase;
        select zona_nom from zonas where zona_cod = :zona into :nomzona;
        select cobr_nom from cobradores where cobr_cod = :cobr into nomcobr;
        select vend_nombre from vendedores where vend_cod = :vend into nomvend;
        select ciud_nom from ciudades where ciud_cod = :codciu into nomciud;
        select GRCA_NOMBRE from grupo_cartera where grca_cod = :grupoc into nomgrp;
        select CRTR_NOMBRE from crm_tiporelacion where crtr_id = :tipo into nomtipo;
        select CRAG_NOMBRE from crm_agrupacion where crag_id = :grupcrm into nomagrupa;
        if (AGRUPA = 'V') then
            begin
            if ((vend >= :venini) and (vend <= :venfin)) then
                suspend;
            end
        else
            if (AGRUPA = 'B') then
                begin
                if ((cobr >= :venini) and (cobr <= :venfin)) then
                    suspend;
                end
            else
                if (AGRUPA = 'Z') then
                    begin
                    if ((zona >= :zonini) and (zona <= :zonfin)) then
                        suspend;
                    end
                else
                    if (AGRUPA = 'C') then
                        begin
                        if ((codciu >= :zonini) and (codciu <= :zonfin)) then
                            suspend;
                        end
                    else
                        if (AGRUPA = 'T') then
                            begin
                            if ((tipo >= :venini) and (tipo <= :venfin)) then
                                suspend;
                            end
                        else
                            if (AGRUPA = 'G') then
                                begin
                                if ((grupcrm >= :venini) and (grupcrm <= :venfin)) then
                                    suspend;
                                end
                            else
                                suspend;
        end
    end
end
^

SET TERM ; ^

grant EXECUTE on PROCEDURE REP_CLIENTES_CRM to PUBLIC;

/* 20100224C */
/* REPORTE DE FALTANTES CONSOLIDADO CON NUMERO DE DOCUMENTO DE CRUCE */

SET TERM ^ ;

CREATE OR ALTER procedure REP_FALTANTES_VENTA (
    TIPOORI integer,
    FECINI date,
    FECFIN date,
    TIPODES integer,
    CEROS char(1),
    DETALLE CHAR(1),
    SUBEMPRESA integer)
returns (
    PREFIJO varchar(4),
    NUMERO varchar(6),
    FECHA date,
    NIT varchar(20),
    NOMCLIENTE varchar(60),
    VENCE date,
    ARTICULO varchar(15),
    DESCRIPCION varchar(60),
    CANTIDAD numeric(18,4),
    UNIDAD varchar(8),
    PRECIO numeric(18,2),
    DESCUENTO numeric(9,4),
    FALTANTE numeric(18,4),
    OBS varchar(255),
    NUMCRUCE VARCHAR(10))
AS
declare variable ID INTEGER;
declare variable ITEM INTEGER;
declare variable FACTOR NUMERIC(18,4);
BEGIN
if (detalle = 'S') then
  BEGIN
  if (TIPOORI = 32) then
    FOR SELECT R.REVT_ID, R.PREF_PRE, REVT_NUMERO, REVT_FECHA, REVT_FECHA VENCE, RVDE_ITEM, R.TERC_NIT, REVT_NOMTERC, ARTI_COD, SUBSTR(RVDE_DESC,1,60), RVDE_UNIDAD, RVDE_CANT, RVDE_PRUNIT, RVDE_DTOPORC, SUBSTRING(REVT_OBS FROM 1 FOR 255)
      FROM REMISIONES_VENTA R, REMISIONES_VENTA_DETALLE D, PREFIJOS P
      WHERE R.REVT_ID = D.REVT_ID AND REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN and REVT_ANULADO = 'N'
       AND P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = 32 AND ((P.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
      ORDER BY REVT_FECHA, R.PREF_PRE, REVT_NUMERO, RVDE_ITEM
      INTO :ID, :PREFIJO, :NUMERO, :FECHA, :VENCE, :ITEM, :NIT, :NOMCLIENTE, :ARTICULO, :DESCRIPCION, :UNIDAD, :CANTIDAD, :PRECIO, :DESCUENTO, :OBS
      DO
        BEGIN
        EXECUTE PROCEDURE FALTANTE(:TIPOORI, :TIPODES, :ID,  :ITEM) returning_values (:FALTANTE, :UNIDAD, :FACTOR);
        if ((CEROS = 'S') or (FALTANTE <> 0)) then
          SUSPEND;
        END
  if (TIPOORI = 34) then
    FOR SELECT P.PEDI_ID, P.PREF_PRE, PEDI_NUMERO, PEDI_FECHA, (PEDI_FECHA + PEDI_VALIDEZ), PEDE_ITEM, P.TERC_NIT, PEDI_NOMTERC, ARTI_COD, SUBSTR(PEDE_DESC,1,60), PEDE_UNIDAD, PEDE_CANT, PEDE_PRUNIT, PEDE_DTOPORC, SUBSTRING(PEDI_OBS FROM 1 FOR 255)
      FROM PEDIDOS P, PEDIDOS_DETALLE D, PREFIJOS PR
      WHERE P.PEDI_ID = D.PEDI_ID AND PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND PEDI_ANULADO = 'N'
       AND PR.PREF_PRE = P.PREF_PRE AND PR.TIDO_COD = 34 AND ((PR.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
      ORDER BY PEDI_FECHA, P.PREF_PRE, PEDI_NUMERO, PEDE_ITEM
      INTO :ID, :PREFIJO, :NUMERO, :FECHA, :VENCE, :ITEM, :NIT, :NOMCLIENTE, :ARTICULO, :DESCRIPCION, :UNIDAD, :CANTIDAD, :PRECIO, :DESCUENTO, :OBS
      DO
        BEGIN
        EXECUTE PROCEDURE FALTANTE(:TIPOORI, :TIPODES, :ID,  :ITEM) returning_values (:FALTANTE, :UNIDAD, :FACTOR);
        if ((CEROS = 'S') or (FALTANTE <> 0)) then
          SUSPEND;
        END
  if (TIPOORI = 35) then
    FOR SELECT C.COTI_ID, C.PREF_PRE, COTI_NUMERO, COTI_FECHA, (COTI_FECHA + COTI_VALIDEZ), CTDE_ITEM, C.TERC_NIT, COTI_NOMTERC, ARTI_COD, SUBSTR(CTDE_DESC,1,60), CTDE_UNIDAD, CTDE_CANT, CTDE_PRUNIT, CTDE_DTOPORC, SUBSTRING(COTI_OBS FROM 1 FOR 255)
      FROM COTIZACIONES C, COTIZACIONES_DETALLE D, PREFIJOS P
      WHERE C.COTI_ID = D.COTI_ID AND COTI_FECHA >= :FECINI AND COTI_FECHA <= :FECFIN AND COTI_ANULADO = 'N'
       AND P.PREF_PRE = C.PREF_PRE AND P.TIDO_COD = 35 AND ((P.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
      ORDER BY COTI_FECHA, C.PREF_PRE, COTI_NUMERO, CTDE_ITEM
      INTO :ID, :PREFIJO, :NUMERO, :FECHA, :VENCE, :ITEM, :NIT, :NOMCLIENTE, :ARTICULO, :DESCRIPCION, :UNIDAD, :CANTIDAD, :PRECIO, :DESCUENTO, :OBS
      DO
        BEGIN
        EXECUTE PROCEDURE FALTANTE(:TIPOORI, :TIPODES, :ID,  :ITEM) returning_values (:FALTANTE, :UNIDAD, :FACTOR);
        if ((CEROS = 'S') or (FALTANTE <> 0)) then
          SUSPEND;
        END
  END
ELSE
  BEGIN
  if (TIPOORI = 32) then
    FOR SELECT R.REVT_ID, R.PREF_PRE, REVT_NUMERO, REVT_FECHA, REVT_FECHA VENCE, R.TERC_NIT, REVT_NOMTERC,
        SUBSTRING(REVT_OBS FROM 1 FOR 255)
      FROM REMISIONES_VENTA R, PREFIJOS P
      WHERE REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN and REVT_ANULADO = 'N'
       AND P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = 32 AND ((P.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
      ORDER BY REVT_FECHA, R.PREF_PRE, REVT_NUMERO
      INTO :ID, :PREFIJO, :NUMERO, :FECHA, :VENCE, :NIT, :NOMCLIENTE, :OBS
      DO
        BEGIN
        NUMCRUCE = '';
        if (TIPODES = 31) then
            SELECT FIRST 1 PREF_PRE || FACT_NUMERO FROM FACTURAS F, consolidado_faltantes C
                WHERE F.fact_consolida = C.cofa_id AND C.cofa_tipoori = 32 AND C.cofa_idori = :ID AND
                C.cofa_tipodes = 31 AND C.cofa_ok = 'S' AND FACT_ANULADO = 'N'
                INTO :numcruce;
        if ((CEROS = 'S') or (NUMCRUCE <> '')) then
          SUSPEND;
        END
  if (TIPOORI = 34) then
    FOR SELECT P.PEDI_ID, P.PREF_PRE, PEDI_NUMERO, PEDI_FECHA, (PEDI_FECHA + PEDI_VALIDEZ), P.TERC_NIT, PEDI_NOMTERC, SUBSTRING(PEDI_OBS FROM 1 FOR 255)
      FROM PEDIDOS P, PREFIJOS PR
      WHERE PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND PEDI_ANULADO = 'N'
       AND PR.PREF_PRE = P.PREF_PRE AND PR.TIDO_COD = 34 AND ((PR.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
      ORDER BY PEDI_FECHA, P.PREF_PRE, PEDI_NUMERO
      INTO :ID, :PREFIJO, :NUMERO, :FECHA, :VENCE, :NIT, :NOMCLIENTE, :OBS
      DO
        BEGIN
        NUMCRUCE = '';
        if (TIPODES = 31) then
            SELECT FIRST 1 PREF_PRE || FACT_NUMERO FROM FACTURAS F, consolidado_faltantes C
                WHERE F.fact_consolida = C.cofa_id AND C.cofa_tipoori = 34 AND C.cofa_idori = :ID AND
                C.cofa_tipodes = 31 AND C.cofa_ok = 'S' AND FACT_ANULADO = 'N'
                INTO :numcruce;
        if (TIPODES = 32) then
            SELECT FIRST 1 PREF_PRE || REVT_NUMERO FROM remisiones_venta F, consolidado_faltantes C
                WHERE F.revt_consolida = C.cofa_id AND C.cofa_tipoori = 34 AND C.cofa_idori = :ID AND
                C.cofa_tipodes = 32 AND C.cofa_ok = 'S' AND REVT_ANULADO = 'N'
                INTO :numcruce;
        if ((CEROS = 'S') or (NUMCRUCE <> '')) then
          SUSPEND;
        END
  if (TIPOORI = 35) then
    FOR SELECT C.COTI_ID, C.PREF_PRE, COTI_NUMERO, COTI_FECHA, (COTI_FECHA + COTI_VALIDEZ), C.TERC_NIT, COTI_NOMTERC, SUBSTRING(COTI_OBS FROM 1 FOR 255)
      FROM COTIZACIONES C, PREFIJOS P
      WHERE COTI_FECHA >= :FECINI AND COTI_FECHA <= :FECFIN AND COTI_ANULADO = 'N'
       AND P.PREF_PRE = C.PREF_PRE AND P.TIDO_COD = 35 AND ((P.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
      ORDER BY COTI_FECHA, C.PREF_PRE, COTI_NUMERO
      INTO :ID, :PREFIJO, :NUMERO, :FECHA, :VENCE, :NIT, :NOMCLIENTE, :OBS
      DO
        BEGIN
        NUMCRUCE = '';
        if (TIPODES = 31) then
            SELECT FIRST 1 PREF_PRE || FACT_NUMERO FROM FACTURAS F, consolidado_faltantes C
                WHERE F.fact_consolida = C.cofa_id AND C.cofa_tipoori = 35 AND C.cofa_idori = :ID AND
                C.cofa_tipodes = 31 AND C.cofa_ok = 'S' AND FACT_ANULADO = 'N'
                INTO :numcruce;
        if (TIPODES = 32) then
            SELECT FIRST 1 PREF_PRE || REVT_NUMERO FROM remisiones_venta F, consolidado_faltantes C
                WHERE F.revt_consolida = C.cofa_id AND C.cofa_tipoori = 35 AND C.cofa_idori = :ID AND
                C.cofa_tipodes = 32 AND C.cofa_ok = 'S' AND REVT_ANULADO = 'N'
                INTO :numcruce;
        if (TIPODES = 34) then
            SELECT FIRST 1 PREF_PRE || PEDI_NUMERO FROM PEDIDOS F, consolidado_faltantes C
                WHERE F.pedi_consolida = C.cofa_id AND C.cofa_tipoori = 35 AND C.cofa_idori = :ID AND
                C.cofa_tipodes = 34 AND C.cofa_ok = 'S' AND PEDI_ANULADO = 'N'
                INTO :numcruce;
        if ((CEROS = 'S') or (NUMCRUCE <> '')) then
          SUSPEND;
        END
  END
END
^

SET TERM ; ^


/* 20100225 */
/* GRABE LA COMPOSICION Y PESO DEL PRODUCTO AL MOMENTO DE LA PRODUCCION */

CREATE TABLE PLAN_PRODUCCION_PRODUCTOS (
    PLPR_ID T_ID NOT NULL,
    PLPD_ITEM T_ID NOT NULL,
    PLPP_NROCMOP T_ID NOT NULL,
    ARPR_COMP T_COD_ARTICULO,
    ARPR_CANT T_CANTIDAD,
    ARPR_PORC T_PORCENTAJE,
    ARPR_UNIDAD T_UNIDAD,
    ARPR_MERMA T_PORCENTAJE,
    ARTI_PESO T_CANTIDAD);
alter table PLAN_PRODUCCION_PRODUCTOS
add constraint PK_PLAN_PRODUCCION_PRODUCTOS
primary key (PLPR_ID,PLPD_ITEM,PLPP_NROCMOP);

alter table PLAN_PRODUCCION_PRODUCTOS
add constraint FK_PLAN_PRODUCCION_PRODUCTOS_1
foreign key (PLPR_ID,PLPD_ITEM)
references PLAN_PRODUCCION_DET(PLPR_ID,PLPD_ITEM)
on delete CASCADE
on update CASCADE;

SET TERM ^ ;

CREATE OR ALTER TRIGGER PLAN_PRODUCCION_DET_AI FOR PLAN_PRODUCCION_DET
ACTIVE AFTER INSERT POSITION 0
as
declare variable fec date;
declare variable CONC VARCHAR(60);
declare variable Pref varchar(4);
declare variable Num varchar(6);
declare variable COSTO NUMERIC(18,2);
declare variable COSTOTAL NUMERIC(18,2);
declare variable Bod VARCHAR(2);
declare variable PORC FLOAT;
declare variable MERMAC NUMERIC(18,4);
declare variable PESOCMP NUMERIC(18,4);
declare variable TOTAL FLOAT;
declare variable FACTOR FLOAT;
declare variable CODCOMP VARCHAR(20);
declare variable CANTCOMP NUMERIC(18,4);
declare variable UNICOMP VARCHAR(8);
declare variable entrada CHAR(1);
declare variable i integer;
BEGIN
if ((NEW.plpr_id <> 0) and (new.plpd_anulado = 'N')) then
    BEGIN
    select plpr_fecfin, plpr_conc, plpr_pref, plpr_numero, plpr_boddes, plpr_entrada
        from plan_produccion where plpr_id = new.plpr_id
        into :fec, :conc, :Pref, :Num, :Bod, :entrada;
    if (entrada = 'S') then
        begin
        COSTOTAL = 0;
        i = 0;
        select sum(arpr_porc) from articulos_producto where arti_cod = NEW.arti_cod into :total;
        /* CALCULE EL COSTO RECORRIENDO LA FORMULA */
        for select arpr_comp, arpr_cant, arpr_unidad, ARPR_PORC, ARPR_MERMA, arti_peso
            from articulos_producto P, ARTICULO A
            where P.arpr_comp = A.arti_cod AND p.arti_cod = NEW.arti_cod
            into :codcomp, :cantcomp, :unicomp, :porc, :mermac, :pesocmp
            DO
            BEGIN
            insert into plan_produccion_productos (plpr_id, plpd_item, plpp_nrocmop, arpr_comp, arpr_cant, arpr_porc, arpr_unidad, arpr_merma, arti_peso)
                values(new.plpr_id, new.plpd_item, :i, :codcomp,  :cantcomp, :porc, :unicomp, :mermac, :pesocmp);
            i = i + 1;
            execute procedure factor_unidad_cant(:codcomp, :unicomp) returning_values (:factor);
            if (((cantcomp is null) or (cantcomp = 0)) AND (PORC IS NOT NULL) AND (porc <> 0)) then
                BEGIN
                /* ES PORCENTUAL AL PESO LA MEZCLA SOBRE EL 1ER ARTICULO */
                cantcomp = NEW.plpd_cant * NEW.plpd_factor * NEW.plpd_peso / TOTAL * PORC; /* APLICA LA PROPORCION */
                if ((MERMAC IS NOT NULL) AND (MERMAC <> 0)) then
                    cantcomp = cantcomp / ((100 - MERMAC) / 100);
                END     
            else
                BEGIN
                cantcomp = cantcomp * FACTOR * pesocmp * NEW.plpd_cant * NEW.plpd_factor;
                END
            EXECUTE PROCEDURE costo_promedio(:CODCOMP, :fec) returning_values (:COSTO);
            COSTOTAL = COSTOTAL + COSTO * CANTCOMP;
            END
        INSERT INTO MOVIMIENTO_ARTICULO
          (ARTI_COD, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM, TERC_NIT)
          VALUES(NEW.arti_cod, :bod, :FEC, 27, NEW.plpr_id,
          :CONC, NEW.plpd_factor * new.plpd_cant, :costotal, 'S', new.plpd_lote, :Pref, :Num, new.plpd_item, '');
        end
    END
end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER PLAN_PRODUCCION_DET_AU FOR PLAN_PRODUCCION_DET
ACTIVE AFTER UPDATE POSITION 0
as
declare variable fec date;
declare variable CONC VARCHAR(60);
declare variable Pref varchar(4);
declare variable Num varchar(6);
declare variable COSTO NUMERIC(18,2);
declare variable COSTOTAL NUMERIC(18,2);
declare variable Bod VARCHAR(2);
declare variable PORC FLOAT;
declare variable MERMAC NUMERIC(18,4);
declare variable PESOCMP NUMERIC(18,4);
declare variable TOTAL FLOAT;
declare variable FACTOR FLOAT;
declare variable CODCOMP VARCHAR(20);
declare variable CANTCOMP NUMERIC(18,4);
declare variable UNICOMP VARCHAR(8);
declare variable ENTRADA CHAR(1);
declare variable i integer;
BEGIN
if ((OLD.plpr_id <> 0) and (OLD.plpd_anulado = 'N')) then
    BEGIN
    DELETE FROM movimiento_articulo M WHERE M.mvar_tipodoc = 27 AND M.mvar_idref = OLD.plpr_id AND M.mvar_item = OLD.plpd_item;
    delete from plan_produccion_productos where plpr_id = old.plpr_id and plpd_item = old.plpd_item;
    END

if ((NEW.plpr_id <> 0) and (new.plpd_anulado = 'N')) then
    BEGIN
    select plpr_fecfin, plpr_conc, plpr_pref, plpr_numero, plpr_boddes, plpr_entrada
        from plan_produccion where plpr_id = new.plpr_id
        into :fec, :conc, :Pref, :Num, :Bod, :entrada;
    if (entrada = 'S') then
        begin
        COSTOTAL = 0;
        select sum(arpr_porc) from articulos_producto where arti_cod = NEW.arti_cod into :total;
        /* CALCULE EL COSTO RECORRIENDO LA FORMULA */
        for select arpr_comp, arpr_cant, arpr_unidad, ARPR_PORC, ARPR_MERMA, arti_peso
            from articulos_producto P, ARTICULO A
            where P.arpr_comp = A.arti_cod AND p.arti_cod = NEW.arti_cod
            into :codcomp, :cantcomp, :unicomp, :porc, :mermac, :pesocmp
            DO
            BEGIN
            insert into plan_produccion_productos (plpr_id, plpd_item, plpp_nrocmop, arpr_comp, arpr_cant, arpr_porc, arpr_unidad, arpr_merma, arti_peso)
                values(new.plpr_id, new.plpd_item, :i, :codcomp,  :cantcomp, :porc, :unicomp, :mermac, :pesocmp);
            i = i + 1;
            execute procedure factor_unidad_cant(:codcomp, :unicomp) returning_values (:factor);
            if (((cantcomp is null) or (cantcomp = 0)) AND (PORC IS NOT NULL) AND (porc <> 0)) then
                BEGIN
                /* ES PORCENTUAL AL PESO LA MEZCLA SOBRE EL 1ER ARTICULO */
                cantcomp = NEW.plpd_cant * NEW.plpd_factor * NEW.plpd_peso / TOTAL * PORC; /* APLICA LA PROPORCION */
                if ((MERMAC IS NOT NULL) AND (MERMAC <> 0)) then
                    cantcomp = cantcomp / ((100 - MERMAC) / 100);
                END
            else
                BEGIN
                cantcomp = cantcomp * FACTOR * pesocmp * NEW.plpd_cant * NEW.plpd_factor;
                END
            EXECUTE PROCEDURE costo_promedio(:CODCOMP, :fec) returning_values (:COSTO);
            if (pesocmp <> 0) then
                COSTOTAL = COSTOTAL + (COSTO * CANTCOMP / pesocmp);
            else
                COSTOTAL = COSTOTAL + (COSTO * CANTCOMP);
            END
        INSERT INTO MOVIMIENTO_ARTICULO
          (ARTI_COD, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM, TERC_NIT)
          VALUES(NEW.arti_cod, :bod, :FEC, 27, NEW.plpr_id,
          :CONC, NEW.plpd_factor * new.plpd_cant, :costotal, 'S', new.plpd_lote, :Pref, :Num, new.plpd_item, '');
        end
    END
end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER PLAN_PRODUCCION_DET_AD FOR PLAN_PRODUCCION_DET
ACTIVE AFTER DELETE POSITION 0
as
begin
if ((OLD.plpr_id <> 0) and (OLD.plpd_anulado = 'N')) then
    BEGIN
    DELETE FROM movimiento_articulo M WHERE M.mvar_tipodoc = 27 AND M.mvar_idref = OLD.plpr_id AND M.mvar_item = OLD.plpd_item;
    delete from plan_produccion_productos where plpr_id = old.plpr_id and plpd_item = old.plpd_item;
    END
end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER PROCEDURE IMPR_PLANPROD(
    ID INTEGER)
RETURNS (
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    FECFIN DATE,
    CONCEPTO VARCHAR(60),
    RESPONSABLE VARCHAR(60),
    OBS BLOB SUB_TYPE 0 SEGMENT SIZE 80,
    ITEM INTEGER,
    ARTICULO VARCHAR(15),
    CODBAR VARCHAR(15),
    ARTIDES VARCHAR(60),
    CANT NUMERIC(18,4),
    UNIDAD VARCHAR(8),
    MERMA NUMERIC(18,4),
    PESO NUMERIC(18,4),
    OBSITEM BLOB SUB_TYPE 0 SEGMENT SIZE 80,
    CODCOMP VARCHAR(20),
    DESCOMP VARCHAR(60),
    CANTCOMP NUMERIC(18,4),
    UNICOMP VARCHAR(8))
AS
declare variable CODPROD VARCHAR(20);
declare variable PORC FLOAT;
declare variable MERMAC NUMERIC(18,4);
declare variable PESOPRO NUMERIC(18,4);
declare variable PESOCMP NUMERIC(18,4);
declare variable TOTAL FLOAT;
declare variable CANTPRO NUMERIC(18,4);
declare variable UNIART VARCHAR(8);
declare variable FACTOR FLOAT;
BEGIN
SELECT PLPR_PREF, PLPR_NUMERO, PLPR_FECINI, PLPR_FECFIN, PLPR_CONC, PLPR_RESPONSABLE, PLPR_OBS
    FROM plan_produccion O WHERE PLPR_ID = :ID into
    :PREF, :NUMERO, :FECHA,
    :FECFIN, :CONCEPTO, :RESPONSABLE, :OBS;
FOR SELECT PLPD_ITEM, ARTI_COD, PLPD_CODBAR, PLPD_DESC, PLPD_CANT, PLPD_UNIDAD, PLPD_MERMA, PLPD_PESO, PLPD_OBS
    FROM plan_produccion_det WHERE PLPR_ID = :ID
    ORDER BY PLPD_ITEM
    INTO :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :MERMA, :PESO, :OBSITEM
    DO
      BEGIN
      codcomp = '';
      descomp = '';
      cantcomp = 0;
      unicomp = '';
      SUSPEND;
      CODPROD = ARTICULO;
      pesopro = peso;
      execute procedure factor_unidad_cant(:codprod, :unidad) returning_values (:factor);
      CANTPRO = CANT * FACTOR;
      select sum(arpr_porc) from plan_produccion_productos where plpr_id = :id and plpd_item = :item into :total;
      for select arpr_comp, arti_des, arpr_cant, arpr_unidad, arti_unidad, ARPR_PORC, ARPR_MERMA, p.arti_peso
        from plan_produccion_productos P, ARTICULO A
        where p.plpr_id = :id and p.plpd_item = :item and P.arpr_comp = A.arti_cod
        into :codcomp, :descomp, :cantcomp, :unicomp, :uniart, :porc, :mermac, :pesocmp
        DO
        BEGIN
        ARTICULO = '';
        CODBAR = '';
        ARTIDES = '';
        CANT = 0;
        UNIDAD = '';
        MERMA = 0;
        PESO = 0;
        OBSITEM = '';
        execute procedure factor_unidad_cant(:codcomp, :unicomp) returning_values (:factor);
        if (((cantcomp is null) or (cantcomp = 0)) AND (PORC IS NOT NULL) AND (porc <> 0)) then
            BEGIN
            /* ES PORCENTUAL AL PESO LA MEZCLA SOBRE EL 1ER ARTICULO */
            cantcomp = cantpro * pesopro / TOTAL * PORC; /* APLICA LA PROPORCION */
            if ((MERMAC IS NOT NULL) AND (MERMAC <> 0)) then
                cantcomp = cantcomp * (100 + MERMAC) / 100;
            END
        else
            BEGIN
            cantcomp = cantcomp * FACTOR * pesocmp * cantpro;
            END
        SUSPEND;
        END
      END
END
^

SET TERM ; ^

CREATE TABLE PLAN_PRODUCCION_CONS_PROD (
    PLPD_ID T_ID NOT NULL,
    PLPC_ITEM T_ID NOT NULL,
    PLCP_NROCOMP T_ID NOT NULL,
    ARPR_COMP T_COD_ARTICULO,
    ARPR_CANT T_CANTIDAD,
    ARPR_PORC T_PORCENTAJE,
    ARPR_MERMA T_PORCENTAJE,
    ARPR_UNIDAD T_UNIDAD,
    ARTI_PESO T_CANTIDAD);
alter table PLAN_PRODUCCION_CONS_PROD
add constraint PK_PLAN_PRODUCCION_CONS_PROD
primary key (PLPD_ID,PLPC_ITEM,PLCP_NROCOMP);

alter table PLAN_PRODUCCION_CONS_PROD
add constraint FK_PLAN_PRODUCCION_CONS_PROD_1
foreign key (PLPD_ID,PLPC_ITEM)
references PLAN_PRODUCCION_CONS(PLPD_ID,PLPC_ITEM)
on delete CASCADE
on update CASCADE;

SET TERM ^ ;

CREATE OR ALTER TRIGGER PLAN_PRODUCCION_CONS_AI FOR PLAN_PRODUCCION_CONS
ACTIVE AFTER INSERT POSITION 0
as
declare variable fec date;
declare variable CONC VARCHAR(60);
declare variable factor numeric(18,4);
declare variable Pref varchar(4);
declare variable Num varchar(6);
declare variable Bod varchar(2);
BEGIN
  if ((NEW.plpd_id <> 0) and (new.plpc_anulado = 'N')) then
    BEGIN
    select plpr_fecini, plpr_conc, plpr_pref, plpr_numero, plpr_bodori from plan_produccion
        where plpr_id = new.plpd_id into :fec, :conc, :Pref, :Num, :Bod;
    execute procedure factor_unidad_cant(new.arti_cod, new.plpc_unidad) returning_values(factor);

    insert into plan_produccion_cons_prod(plpd_id, plpc_item, plcp_nrocomp, arpr_comp, arpr_cant, arpr_porc, arpr_unidad, arpr_merma, arti_peso)
        SELECT new.plpd_id, new.plpc_item, ARPR_ITEM, ARPR_COMP, ARPR_CANT, ARPR_PORC, ARPR_UNIDAD, ARPR_MERMA, ARTI_PESO
        from articulos_producto P, ARTICULO A
        where P.arpr_comp = A.arti_cod AND p.arti_cod = NEW.arti_cod;
    INSERT INTO MOVIMIENTO_ARTICULO
      (ARTI_COD, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM, TERC_NIT)
      VALUES(NEW.ARTI_COD, :bod, :FEC, 27, NEW.plpd_id,
      :CONC, :factor * new.plpc_cant, 0, 'N', null, :Pref, :Num, new.plpc_item, null);
    end
end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER PLAN_PRODUCCION_CONS_AU FOR PLAN_PRODUCCION_CONS
ACTIVE AFTER UPDATE POSITION 0
as
declare variable fec date;
declare variable CONC VARCHAR(60);
declare variable factor numeric(18,4);
declare variable Pref varchar(4);
declare variable Num varchar(6);
declare variable Bod varchar(2);
BEGIN
if ((old.arti_cod <> new.arti_cod) or (old.plpc_cant <> new.plpc_cant) or (old.plpc_unidad <> new.plpc_unidad) or
    (old.plpc_anulado <> new.plpc_anulado) or (old.plpc_transmit <> new.plpc_transmit)) then
  begin
  /* Anule el anterior */
  if ((old.plpd_id <> 0) and (old.plpc_anulado = 'N')) then
    begin
    delete from movimiento_articulo where (mvar_tipodoc = 27) and (mvar_idref = old.plpd_id) and (mvar_item = old.plpc_item);
    DELETE FROM plan_produccion_cons_prod WHERE PLPD_ID = OLD.plpd_id AND PLPC_ITEM = OLD.plpc_item;
    END
  /* Registre el nuevo */
  if ((new.plpd_id <> 0) and (new.plpc_anulado = 'N')) then
    BEGIN
    select plpr_fecini, plpr_conc, plpr_pref, plpr_numero, plpr_bodori from plan_produccion
        where plpr_id = new.plpd_id into :fec, :conc, :Pref, :Num, :Bod;
    execute procedure factor_unidad_cant(new.arti_cod, new.plpc_unidad) returning_values(factor);
    insert into plan_produccion_cons_prod(plpd_id, plpc_item, plcp_nrocomp, arpr_comp, arpr_cant, arpr_porc, arpr_unidad, arpr_merma, arti_peso)
        SELECT new.plpd_id, new.plpc_item, ARPR_ITEM, ARPR_COMP, ARPR_CANT, ARPR_PORC, ARPR_UNIDAD, ARPR_MERMA, ARTI_PESO
        from articulos_producto P, ARTICULO A
        where P.arpr_comp = A.arti_cod AND p.arti_cod = NEW.arti_cod;
    INSERT INTO MOVIMIENTO_ARTICULO
      (ARTI_COD, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM, TERC_NIT)
      VALUES(NEW.ARTI_COD, :bod, :FEC, 27, NEW.plpd_id,
      :CONC, :factor * new.plpc_cant, 0, 'N', null, :Pref, :Num, new.plpc_item, null);
    END
  end
end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER PLAN_PRODUCCION_CONS_AD FOR PLAN_PRODUCCION_CONS
ACTIVE AFTER DELETE POSITION 0
as
begin
if ((old.plpd_id <> 0) and (old.plpc_anulado = 'N')) then
    begin
    delete from movimiento_articulo
      where (mvar_tipodoc = 27) and (mvar_idref = old.plpd_id) and (mvar_item = old.plpc_item);
    DELETE FROM plan_produccion_cons_prod WHERE PLPD_ID = OLD.plpd_id AND PLPC_ITEM = OLD.plpc_item;
    end
end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER PROCEDURE IMPR_PLANPROD_CONS(
    ID INTEGER)
RETURNS (
    ITEM INTEGER,
    ARTICULO VARCHAR(15),
    CODBAR VARCHAR(15),
    ARTIDES VARCHAR(60),
    CANT NUMERIC(18,4),
    UNIDAD VARCHAR(8),
    EXISTEN NUMERIC(18,4),
    ORDENADO NUMERIC(18,4),
    OBSITEM BLOB SUB_TYPE 0 SEGMENT SIZE 80,
    CODCOMP VARCHAR(20),
    DESCOMP VARCHAR(60),
    CANTCOMP NUMERIC(18,4),
    UNICOMP VARCHAR(8))
AS
declare variable CODPROD VARCHAR(20);
declare variable PORC FLOAT;
declare variable MERMA NUMERIC(18,4);
declare variable PESOPRO NUMERIC(18,4);
declare variable PESOCMP NUMERIC(18,4);
declare variable TOTAL FLOAT;
declare variable CANTPRO NUMERIC(18,4);
declare variable UNIART VARCHAR(8);
declare variable FACTOR FLOAT;
BEGIN
FOR SELECT PLPC_ITEM, ARTI_COD, PLPC_CODBAR, PLPC_DESC, PLPC_CANT, PLPC_UNIDAD, PLPC_EXIST, PLPC_ORDENAR, PLPC_OBS
    FROM plan_produccion_cons WHERE PLPD_ID = :ID
    ORDER BY PLPC_ITEM
    INTO :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :existen, :ordenado, :OBSITEM
    DO
      BEGIN
      codcomp = '';
      descomp = '';
      cantcomp = 0;
      unicomp = '';
      SUSPEND;
      CODPROD = ARTICULO;
      SELECT ARTI_PESO FROM ARTICULO WHERE ARTI_COD = :codprod INTO :PESOPRO;
      execute procedure factor_unidad_cant(:codprod, :unidad) returning_values (:factor);
      CANTPRO = CANT * FACTOR;
      select sum(arpr_porc) from plan_produccion_cons_prod where plpd_id = :id AND plpc_item = :item into :total;
      for select arpr_comp, arti_des, arpr_cant, arpr_unidad, arti_unidad, ARPR_PORC, ARPR_MERMA, P.arti_peso
        from plan_produccion_cons_prod P, ARTICULO A
        where P.arpr_comp = A.arti_cod AND p.plpd_id = :id AND P.plpc_item = :item ORDER BY P.plcp_nrocomp
        into :codcomp, :descomp, :cantcomp, :unicomp, :uniart, :porc, :merma, :pesocmp
        DO
        BEGIN
        ARTICULO = '';
        CODBAR = '';
        ARTIDES = '';
        CANT = 0;
        UNIDAD = '';
        EXISTEN = 0;        
        ORDENADO = 0;
        OBSITEM = '';
        execute procedure factor_unidad_cant(:codcomp, :unicomp) returning_values (:factor);
        if (((cantcomp is null) or (cantcomp = 0)) AND (PORC IS NOT NULL) AND (porc <> 0)) then
            BEGIN
            /* ES PORCENTUAL AL PESO LA MEZCLA SOBRE EL 1ER ARTICULO */
            cantcomp = cantpro * pesopro * porc / TOTAL; /* APLICA LA PROPORCION */
            if ((MERMA IS NOT NULL) AND (MERMA <> 0)) then
                cantcomp = cantcomp * (100 + MERMA) / 100;
            END
        else
            BEGIN
            cantcomp = cantcomp * FACTOR * pesocmp * cantpro;
            END
        SUSPEND;
        END
       END
END
^

SET TERM ; ^

grant select, delete, insert, update on plan_produccion_cons_prod  to public;
grant select, delete, insert, update on plan_produccion_productos  to public;

CREATE EXCEPTION ARTICULO_SIN_PESO 'Debe indicar el peso del artículo';

SET TERM ^ ;

CREATE OR ALTER TRIGGER PLAN_PRODUCCION_DET_BI FOR PLAN_PRODUCCION_DET
ACTIVE BEFORE INSERT POSITION 0
as
declare variable peso numeric(18,4);
declare variable des varchar(60);
begin
if (NEW.plpd_factor IS NULL) then
    NEW.plpd_factor = 1;
select arti_peso, arti_des from articulo where arti_cod = new.arti_cod into :peso, :des;
if ((peso is null) or (peso = 0)) then
    exception articulo_sin_peso 'Debe indicar el peso del artículo ' || new.arti_cod || '-' || :des;
end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER PLAN_PRODUCCION_CONS_BI FOR PLAN_PRODUCCION_CONS
ACTIVE BEFORE INSERT POSITION 0
as
declare variable FEC DATE;
declare variable peso numeric(18,4);
declare variable des varchar(60);
begin
SELECT PLPR_FECINI FROM plan_produccion WHERE PLPR_ID = NEW.plpd_id INTO :FEC;
EXECUTE PROCEDURE saldo_total_inventario (NEW.arti_cod, :FEC) returning_values (NEW.plpc_exist);
if (NEW.plpc_cant > NEW.plpc_exist) then
    NEW.plpc_ordenar = NEW.plpc_cant - NEW.plpc_exist;
ELSE
    NEW.plpc_ordenar = 0;
if (exists (select arpr_item from articulos_producto where arti_cod = new.arti_cod)) then
    begin
    select arti_peso, arti_des from articulo where arti_cod = new.arti_cod into :peso, :des;
    if ((peso is null) or (peso = 0)) then
        exception articulo_sin_peso 'Debe indicar el peso del artículo ' || new.arti_cod || '-' || :des;
    end
end
^

SET TERM ; ^

SET TERM ^ ;

create trigger PLAN_PRODUCCION_DET_BU for PLAN_PRODUCCION_DET
active BEFORE UPDATE position 0
as
declare variable peso numeric(18,4);
declare variable des varchar(60);
begin
if (NEW.plpd_factor IS NULL) then
    NEW.plpd_factor = 1;
select arti_peso, arti_des from articulo where arti_cod = new.arti_cod into :peso, :des;
if ((peso is null) or (peso = 0)) then
    exception articulo_sin_peso 'Debe indicar el peso del artículo ' || new.arti_cod || '-' || :des;
end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER PLAN_PRODUCCION_CONS_BU FOR PLAN_PRODUCCION_CONS
ACTIVE BEFORE UPDATE POSITION 0
as
declare variable peso numeric(18,4);
declare variable des varchar(60);
begin
if (NEW.plpc_cant > NEW.plpc_exist) then
    NEW.plpc_ordenar = NEW.plpc_cant - NEW.plpc_exist;
ELSE
    NEW.plpc_ordenar = 0;
if (exists (select arpr_item from articulos_producto where arti_cod = new.arti_cod)) then
    begin
    select arti_peso, arti_des from articulo where arti_cod = new.arti_cod into :peso, :des;
    if ((peso is null) or (peso = 0)) then
        exception articulo_sin_peso 'Debe indicar el peso del artículo ' || new.arti_cod || '-' || :des;
    end
end
^

SET TERM ; ^


/* 20100225B */
/* si consolidado y retenciones con recibo solo debe mirar lo abonado y no lo causado */
SET TERM ^ ;

CREATE OR ALTER procedure REP_RETENCION_CLIENTE (
    DESDE varchar(20),
    HASTA varchar(20),
    GRPINI varchar(5),
    GRPFIN varchar(5),
    FECINI date,
    FECFIN date,
    DETALLE char(1),
    ORDEN char(1),
    AGRUPA char(1),
    SUBEMPRESA integer)
returns (
    NIT varchar(20),
    NOMBRE varchar(60),
    TELEFONO varchar(40),
    CIUDAD varchar(40),
    CODZONA varchar(2),
    NOMZONA varchar(60),
    CODCOBR integer,
    NOMCOBR varchar(60),
    SUCURSAL varchar(10),
    NOMSUC varchar(60),
    DV char(1),
    CODCIUD char(5),
    NOMCIUD varchar(60),
    TIPODOC varchar(8),
    IDDOC integer,
    PREFIJO varchar(4),
    NUMERO varchar(6),
    FECHA date,
    CONCEPTO varchar(60),
    DEBITO numeric(18,2),
    CREDITO numeric(18,2),
    RTFTE numeric(18,2),
    RTIVA numeric(18,2),
    RTICA numeric(18,2))
AS
declare variable NITINI VARCHAR(20);
declare variable NITFIN VARCHAR(20);
declare variable NOMINI VARCHAR(20);
declare variable NOMFIN VARCHAR(20);
declare variable RETES VARCHAR(2);
declare variable OK CHAR(1);
declare variable DB CHAR(1);
declare variable ARTFTE NUMERIC(18,2);
declare variable ARTIVA NUMERIC(18,2);
declare variable ARTICA NUMERIC(18,2);
BEGIN
EXECUTE PROCEDURE LEE_CONFIGURACION ('CARTERA', 'SALDOS', 'DESCONTAR RETENCIONES POR CAUSACION') returning_values (RETES);
if (ORDEN = 'C') then
    BEGIN
    NITINI = DESDE;
    NITFIN = HASTA;
    NOMINI = '';
    NOMFIN = 'zz';
    END
ELSE
    BEGIN
    NOMINI = DESDE;
    NOMFIN = HASTA;
    NITINI = '';
    NITFIN = 'zz';
    END

if (DETALLE = 'S') then
    BEGIN
    if (RETES = 'SI') then
        FOR select T.TERC_NIT, TERC_NOM, TERC_DV, TERC_TEL, TERC_CIU, S.COBR_COD, C.ZONA_COD, T.CIUD_COD, CLCU_COD, CLSU_NOMBRE,
            tido_nomcorto, mvcl_idref, mvcl_prefref, mvcl_numref, mvcl_fecha, mvcl_conc, mvcl_monto, mvcl_debito, mvcl_rtefte, mvcl_rteiva, mvcl_rteica
            from movimiento_clientes m, tipo_documento TD, terceros T, CLIENTES C, CLIENTE_SUCURSALES S
            where m.mvcl_tiporef = td.tido_cod and mvcl_fecha >= :FECINI and mvcl_fecha <= :FECFIN AND mvcl_abono = 'N'
            and C.TERC_NIT = T.TERC_NIT AND TERC_CLIE = 'S' AND S.TERC_NIT = C.TERC_NIT AND M.terc_nit = T.terc_nit AND M.mvcl_sucursal = S.clcu_cod AND
            T.TERC_NIT >= :NITINI AND T.TERC_NIT <= :NITFIN AND TERC_NOM >= :NOMINI AND TERC_NOM <= :NOMFIN AND ((sucu_id = :subempresa) or (:subempresa = 0))
            AND ((MVCL_RTEFTE <> 0) or (MVCL_RTEIVA <> 0) or (MVCL_RTEICA <> 0))
            ORDER BY T.TERC_NIT, MVCL_FECHA, MVCL_ID
            into :NIT, :NOMBRE, :DV, :TELEFONO, :CIUDAD, :CODCOBR, :CODZONA, :CODCIUD, :SUCURSAL, :NOMSUC,
            :TIPODOC, :IDDOC, :PREFIJO, :NUMERO, :FECHA, :CONCEPTO, :DEBITO, :DB, :RTFTE, :RTIVA, :RTICA
            DO
            BEGIN
            OK = 'N';
            if (AGRUPA = 'Z') then
                BEGIN
                if (GRPINI = '') then
                    BEGIN
                    if ((CODZONA IS NULL) or (CODZONA >= :GRPINI AND CODZONA <= :GRPFIN)) then
                        OK = 'S';
                    END
                ELSE
                    if (CODZONA >= :GRPINI AND CODZONA <= :GRPFIN) then
                        OK = 'S';
                END
            if (AGRUPA = 'C') then
                BEGIN
                if (GRPINI = '') then
                    BEGIN
                    if ((CODCOBR IS NULL) or (CODCOBR >= :GRPINI AND CODCOBR <= :GRPFIN)) then
                        OK = 'S';
                    END
                ELSE
                    if (CODCOBR >= :GRPINI AND CODCOBR <= :GRPFIN) then
                        OK = 'S';
                END
            if (AGRUPA = 'I') then
                BEGIN
                if (GRPINI = '') then
                    BEGIN
                    if ((CODCIUD IS NULL) or (CODCIUD >= :GRPINI AND CODCIUD <= :GRPFIN)) then
                        OK = 'S';
                    END
                ELSE
                    if (CODCIUD >= :GRPINI AND CODCIUD <= :GRPFIN) then
                        OK = 'S';
                END
            if (AGRUPA = 'N') then
                OK = 'S';
        
            if (OK = 'S') then
                BEGIN
                SELECT COBR_NOM FROM COBRADORES WHERE COBR_COD = :CODCOBR INTO :NOMCOBR;
                SELECT ZONA_NOM FROM ZONAS WHERE ZONA_COD = :CODZONA INTO :NOMZONA;
                SELECT CIUD_NOM FROM CIUDADES WHERE CIUD_COD = :CODCIUD INTO :NOMCIUD;
                if (RTFTE IS NULL) then
                    RTFTE = 0;
                if (RTIVA IS NULL) then
                    RTIVA = 0;
                if (RTICA IS NULL) then
                    RTICA = 0;
                if (DB = 'N') then
                    BEGIN
                    CREDITO = DEBITO;
                    DEBITO = 0;
                    RTFTE = rtfte * -1;
                    RTIVA = rtiva * -1;
                    RTICA = rtica * -1;
                    END
                ELSE
                    CREDITO = 0;
                SUSPEND;
                END
            END
    ELSE
        FOR select T.TERC_NIT, TERC_NOM, TERC_DV, TERC_TEL, TERC_CIU, S.COBR_COD, C.ZONA_COD, T.CIUD_COD, CLCU_COD, CLSU_NOMBRE,
            tido_nomcorto, mvcl_idref, mvcl_prefref, mvcl_numref, mvcl_fecha, mvcl_conc, mvcl_monto, mvcl_debito, mvcl_rtefte, mvcl_rteiva, mvcl_rteica
            from movimiento_clientes m, tipo_documento TD, terceros T, CLIENTES C, CLIENTE_SUCURSALES S
            where m.mvcl_tiporef = td.tido_cod and mvcl_fecha >= :FECINI and mvcl_fecha <= :FECFIN AND mvcl_abono = 'S'
            and C.TERC_NIT = T.TERC_NIT AND TERC_CLIE = 'S' AND S.TERC_NIT = C.TERC_NIT AND M.terc_nit = T.terc_nit AND M.mvcl_sucursal = S.clcu_cod AND
            T.TERC_NIT >= :NITINI AND T.TERC_NIT <= :NITFIN AND TERC_NOM >= :NOMINI AND TERC_NOM <= :NOMFIN AND ((sucu_id = :subempresa) or (:subempresa = 0))
            ORDER BY T.TERC_NIT, MVCL_FECHA, MVCL_ID
            into :NIT, :NOMBRE, :DV, :TELEFONO, :CIUDAD, :CODCOBR, :CODZONA, :CODCIUD, :SUCURSAL, :NOMSUC,
            :TIPODOC, :IDDOC, :PREFIJO, :NUMERO, :FECHA, :CONCEPTO, :DEBITO, :DB, :RTFTE, :RTIVA, :RTICA
            DO
            BEGIN
            if (RTFTE IS NULL) then
                RTFTE = 0;
            if (RTIVA IS NULL) then
                RTIVA = 0;
            if (RTICA IS NULL) then
                RTICA = 0;
            if ((RTFTE <> 0) or (RTIVA <> 0) or (RTICA <> 0)) then
                BEGIN
                OK = 'N';
                if (AGRUPA = 'Z') then
                    BEGIN
                    if (GRPINI = '') then
                        BEGIN
                        if ((CODZONA IS NULL) or (CODZONA >= :GRPINI AND CODZONA <= :GRPFIN)) then
                            OK = 'S';
                        END
                    ELSE
                        if (CODZONA >= :GRPINI AND CODZONA <= :GRPFIN) then
                            OK = 'S';
                    END
                if (AGRUPA = 'C') then
                    BEGIN
                    if (GRPINI = '') then
                        BEGIN
                        if ((CODCOBR IS NULL) or (CODCOBR >= :GRPINI AND CODCOBR <= :GRPFIN)) then
                            OK = 'S';
                        END
                    ELSE
                        if (CODCOBR >= :GRPINI AND CODCOBR <= :GRPFIN) then
                            OK = 'S';
                    END
                if (AGRUPA = 'I') then
                    BEGIN
                    if (GRPINI = '') then
                        BEGIN
                        if ((CODCIUD IS NULL) or (CODCIUD >= :GRPINI AND CODCIUD <= :GRPFIN)) then
                            OK = 'S';
                        END
                    ELSE
                        if (CODCIUD >= :GRPINI AND CODCIUD <= :GRPFIN) then
                            OK = 'S';
                    END
                if (AGRUPA = 'N') then
                    OK = 'S';
            
                if (OK = 'S') then
                    BEGIN
                    SELECT COBR_NOM FROM COBRADORES WHERE COBR_COD = :CODCOBR INTO :NOMCOBR;
                    SELECT ZONA_NOM FROM ZONAS WHERE ZONA_COD = :CODZONA INTO :NOMZONA;
                    SELECT CIUD_NOM FROM CIUDADES WHERE CIUD_COD = :CODCIUD INTO :NOMCIUD;
                    if (DB = 'N') then
                        BEGIN
                        CREDITO = DEBITO;
                        DEBITO = 0;
                        END
                    ELSE
                        CREDITO = 0;
                    SUSPEND;
                    END
                END
            END
    END
ELSE
    BEGIN
    if (RETES = 'SI') then
        BEGIN
        FOR select MAX(T.TERC_NIT), MAX(TERC_NOM), MAX(TERC_DV), MAX(TERC_TEL), MAX(TERC_CIU), MAX(S.COBR_COD), MAX(C.ZONA_COD), MAX(T.CIUD_COD), MAX(CLCU_COD), MAX(CLSU_NOMBRE)
            from movimiento_clientes m, terceros T, CLIENTES C, CLIENTE_SUCURSALES S
            where mvcl_fecha >= :FECINI and mvcl_fecha <= :FECFIN AND mvcl_abono = 'N'
            and C.TERC_NIT = T.TERC_NIT AND TERC_CLIE = 'S' AND S.TERC_NIT = C.TERC_NIT AND M.terc_nit = T.terc_nit AND M.mvcl_sucursal = S.clcu_cod AND
            T.TERC_NIT >= :NITINI AND T.TERC_NIT <= :NITFIN AND TERC_NOM >= :NOMINI AND TERC_NOM <= :NOMFIN AND ((sucu_id = :subempresa) or (:subempresa = 0))
            GROUP BY T.TERC_NIT
            into :NIT, :NOMBRE, :DV, :TELEFONO, :CIUDAD, :CODCOBR, :CODZONA, :CODCIUD, :SUCURSAL, :NOMSUC
            DO
            BEGIN
            SELECT SUM(MVCL_RTEFTE), SUM(MVCL_RTEIVA), SUM(MVCL_RTEICA) FROM movimiento_clientes WHERE TERC_NIT = :nit AND mvcl_sucursal = :sucursal AND
                mvcl_fecha >= :FECINI and mvcl_fecha <= :FECFIN AND mvcl_abono = 'N' AND MVCL_DEBITO = 'S'
                INTO :RTFTE, :RTIVA, :RTICA;
            if (RTFTE IS NULL) then
                RTFTE = 0;
            if (RTIVA IS NULL) then
                RTIVA = 0;
            if (RTICA IS NULL) then
                RTICA = 0;
            SELECT SUM(MVCL_RTEFTE), SUM(MVCL_RTEIVA), SUM(MVCL_RTEICA) FROM movimiento_clientes WHERE TERC_NIT = :nit AND mvcl_sucursal = :sucursal AND
                mvcl_fecha >= :FECINI and mvcl_fecha <= :FECFIN AND mvcl_abono = 'N' AND MVCL_DEBITO = 'N'
                INTO :ARTFTE, :ARTIVA, :ARTICA;
            if (ARTFTE IS NULL) then
                ARTFTE = 0;
            if (ARTIVA IS NULL) then
                ARTIVA = 0;
            if (ARTICA IS NULL) then
                ARTICA = 0;
            RTFTE = RTFTE - ARTFTE;
            RTIVA = RTIVA - ARTIVA;
            RTICA = RTICA - ARTICA;
            if ((RTFTE <> 0) or (RTIVA <> 0) or (RTICA <> 0)) then
                BEGIN
                OK = 'N';
                if (AGRUPA = 'Z') then
                    BEGIN
                    if (GRPINI = '') then
                        BEGIN
                        if ((CODZONA IS NULL) or (CODZONA >= :GRPINI AND CODZONA <= :GRPFIN)) then
                            OK = 'S';
                        END
                    ELSE
                        if (CODZONA >= :GRPINI AND CODZONA <= :GRPFIN) then
                            OK = 'S';
                    END
                if (AGRUPA = 'C') then
                    BEGIN
                    if (GRPINI = '') then
                        BEGIN
                        if ((CODCOBR IS NULL) or (CODCOBR >= :GRPINI AND CODCOBR <= :GRPFIN)) then
                            OK = 'S';
                        END
                    ELSE
                        if (CODCOBR >= :GRPINI AND CODCOBR <= :GRPFIN) then
                            OK = 'S';
                    END
                if (AGRUPA = 'I') then
                    BEGIN
                    if (GRPINI = '') then
                        BEGIN
                        if ((CODCIUD IS NULL) or (CODCIUD >= :GRPINI AND CODCIUD <= :GRPFIN)) then
                            OK = 'S';
                        END
                    ELSE
                        if (CODCIUD >= :GRPINI AND CODCIUD <= :GRPFIN) then
                            OK = 'S';
                    END
                if (AGRUPA = 'N') then
                    OK = 'S';
            
                if (OK = 'S') then
                    BEGIN
                    SELECT SUM(MVCL_MONTO) FROM movimiento_clientes WHERE TERC_NIT = :NIT and mvcl_sucursal = :sucursal AND MVCL_FECHA >= :FECINI AND MVCL_FECHA <= :FECFIN AND MVCL_DEBITO = 'S' AND MVCL_ABONO = 'N' AND (MVCL_RTEFTE <> 0 OR MVCL_RTEIVA <> 0 OR MVCL_RTEICA <> 0) and ((sucu_id = :subempresa) or (:subempresa = 0)) INTO :DEBITO;
                    SELECT SUM(MVCL_MONTO) FROM movimiento_clientes WHERE TERC_NIT = :NIT and mvcl_sucursal = :sucursal AND MVCL_FECHA >= :FECINI AND MVCL_FECHA <= :FECFIN AND MVCL_DEBITO = 'N'  AND MVCL_ABONO = 'N' AND (MVCL_RTEFTE <> 0 OR MVCL_RTEIVA <> 0 OR MVCL_RTEICA <> 0) and ((sucu_id = :subempresa) or (:subempresa = 0)) INTO :CREDITO;
                    if (DEBITO IS NULL) then
                        DEBITO = 0;
                    if (CREDITO IS NULL) then
                        CREDITO = 0;
                    SELECT COBR_NOM FROM COBRADORES WHERE COBR_COD = :CODCOBR INTO :NOMCOBR;
                    SELECT ZONA_NOM FROM ZONAS WHERE ZONA_COD = :CODZONA INTO :NOMZONA;
                    SELECT CIUD_NOM FROM CIUDADES WHERE CIUD_COD = :CODCIUD INTO :NOMCIUD;
                    SUSPEND;
                    END
                END
            END
        end
    ELSE
        BEGIN
        FOR select MAX(T.TERC_NIT), MAX(TERC_NOM), MAX(TERC_DV), MAX(TERC_TEL), MAX(TERC_CIU), MAX(S.COBR_COD), MAX(C.ZONA_COD), MAX(T.CIUD_COD), MAX(CLCU_COD), MAX(CLSU_NOMBRE)
            from movimiento_clientes m, terceros T, CLIENTES C, CLIENTE_SUCURSALES S
            where mvcl_fecha >= :FECINI and mvcl_fecha <= :FECFIN AND mvcl_abono = 'S'
            and C.TERC_NIT = T.TERC_NIT AND TERC_CLIE = 'S' AND S.TERC_NIT = C.TERC_NIT AND M.terc_nit = T.terc_nit AND M.mvcl_sucursal = S.clcu_cod AND
            T.TERC_NIT >= :NITINI AND T.TERC_NIT <= :NITFIN AND TERC_NOM >= :NOMINI AND TERC_NOM <= :NOMFIN AND ((sucu_id = :subempresa) or (:subempresa = 0))
            GROUP BY T.TERC_NIT
            into :NIT, :NOMBRE, :DV, :TELEFONO, :CIUDAD, :CODCOBR, :CODZONA, :CODCIUD, :SUCURSAL, :NOMSUC
            DO
            BEGIN
            SELECT SUM(MVCL_RTEFTE), SUM(MVCL_RTEIVA), SUM(MVCL_RTEICA) FROM movimiento_clientes WHERE TERC_NIT = :nit AND mvcl_sucursal = :sucursal AND
                mvcl_fecha >= :FECINI and mvcl_fecha <= :FECFIN AND mvcl_abono = 'S'
                INTO :RTFTE, :RTIVA, :RTICA;
            if (RTFTE IS NULL) then
                RTFTE = 0;
            if (RTIVA IS NULL) then
                RTIVA = 0;
            if (RTICA IS NULL) then
                RTICA = 0;
            if ((RTFTE <> 0) or (RTIVA <> 0) or (RTICA <> 0)) then
                BEGIN
                OK = 'N';
                if (AGRUPA = 'Z') then
                    BEGIN
                    if (GRPINI = '') then
                        BEGIN
                        if ((CODZONA IS NULL) or (CODZONA >= :GRPINI AND CODZONA <= :GRPFIN)) then
                            OK = 'S';
                        END
                    ELSE
                        if (CODZONA >= :GRPINI AND CODZONA <= :GRPFIN) then
                            OK = 'S';
                    END
                if (AGRUPA = 'C') then
                    BEGIN
                    if (GRPINI = '') then
                        BEGIN
                        if ((CODCOBR IS NULL) or (CODCOBR >= :GRPINI AND CODCOBR <= :GRPFIN)) then
                            OK = 'S';
                        END
                    ELSE
                        if (CODCOBR >= :GRPINI AND CODCOBR <= :GRPFIN) then
                            OK = 'S';
                    END
                if (AGRUPA = 'I') then
                    BEGIN
                    if (GRPINI = '') then
                        BEGIN
                        if ((CODCIUD IS NULL) or (CODCIUD >= :GRPINI AND CODCIUD <= :GRPFIN)) then
                            OK = 'S';
                        END
                    ELSE
                        if (CODCIUD >= :GRPINI AND CODCIUD <= :GRPFIN) then
                            OK = 'S';
                    END
                if (AGRUPA = 'N') then
                    OK = 'S';
            
                if (OK = 'S') then
                    BEGIN
                    SELECT SUM(MVCL_MONTO) FROM movimiento_clientes WHERE TERC_NIT = :NIT and mvcl_sucursal = :sucursal AND MVCL_FECHA >= :FECINI AND MVCL_FECHA <= :FECFIN AND MVCL_DEBITO = 'S' AND MVCL_ABONO = 'S' AND (MVCL_RTEFTE <> 0 OR MVCL_RTEIVA <> 0 OR MVCL_RTEICA <> 0) and ((sucu_id = :subempresa) or (:subempresa = 0)) INTO :DEBITO;
                    SELECT SUM(MVCL_MONTO) FROM movimiento_clientes WHERE TERC_NIT = :NIT and mvcl_sucursal = :sucursal AND MVCL_FECHA >= :FECINI AND MVCL_FECHA <= :FECFIN AND MVCL_DEBITO = 'N'  AND MVCL_ABONO = 'S' AND (MVCL_RTEFTE <> 0 OR MVCL_RTEIVA <> 0 OR MVCL_RTEICA <> 0) and ((sucu_id = :subempresa) or (:subempresa = 0)) INTO :CREDITO;
                    if (DEBITO IS NULL) then
                        DEBITO = 0;
                    if (CREDITO IS NULL) then
                        CREDITO = 0;
                    SELECT COBR_NOM FROM COBRADORES WHERE COBR_COD = :CODCOBR INTO :NOMCOBR;
                    SELECT ZONA_NOM FROM ZONAS WHERE ZONA_COD = :CODZONA INTO :NOMZONA;
                    SELECT CIUD_NOM FROM CIUDADES WHERE CIUD_COD = :CODCIUD INTO :NOMCIUD;
                    SUSPEND;
                    END
                END
            END
        END
    END
END
^

SET TERM ; ^

/* 20100225C */
/* SI CONSOLIDADO CALCULE RETENCIONES DB Y CR POR SEPAADO Y RESTE */
SET TERM ^ ;

CREATE OR ALTER procedure REP_RETENCION_PROVEEDOR (
    DESDE varchar(20),
    HASTA varchar(20),
    GRPINI varchar(5),
    GRPFIN varchar(5),
    FECINI date,
    FECFIN date,
    DETALLE char(1),
    ORDEN char(1),
    AGRUPA char(1))
returns (
    NIT varchar(20),
    NOMBRE varchar(60),
    TELEFONO varchar(40),
    CIUDAD varchar(40),
    CODZONA varchar(2),
    NOMZONA varchar(60),
    DV char(1),
    CODCIUD char(5),
    NOMCIUD varchar(60),
    TIPODOC varchar(8),
    IDDOC integer,
    PREFIJO varchar(4),
    NUMERO varchar(6),
    FECHA date,
    CONCEPTO varchar(60),
    DEBITO numeric(18,2),
    CREDITO numeric(18,2),
    RTFTE numeric(18,2),
    RTIVA numeric(18,2),
    RTICA numeric(18,2))
AS
declare variable NITINI VARCHAR(20);
declare variable NITFIN VARCHAR(20);
declare variable NOMINI VARCHAR(20);
declare variable NOMFIN VARCHAR(20);
declare variable OK CHAR(1);
declare variable DB CHAR(1);
declare variable AB CHAR(1);
declare variable DESCRETE CHAR(2);
declare variable artfte numeric(18,2);
declare variable artiva numeric(18,2);
declare variable artica numeric(18,2);
BEGIN
if (ORDEN = 'C') then
    BEGIN
    NITINI = DESDE;
    NITFIN = HASTA;
    NOMINI = '';
    NOMFIN = 'zz';
    END
ELSE
    BEGIN
    NOMINI = DESDE;
    NOMFIN = HASTA;
    NITINI = '';
    NITFIN = 'zz';
    END
EXECUTE PROCEDURE LEE_CONFIGURACION('CXPAGAR', 'SALDOS', 'DESCONTAR RETENCIONES POR CAUSACION') returning_values (DESCRETE);
/* Ubique el NIT */
FOR select T.TERC_NIT, TERC_NOM, TERC_DV, TERC_TEL, TERC_CIU, P.GRPR_COD, T.CIUD_COD
    from terceros T, PROVEEDORES P
    where P.TERC_NIT = T.TERC_NIT AND TERC_PROV = 'S' AND T.TERC_NIT >= :NITINI AND T.TERC_NIT <= :NITFIN AND
        TERC_NOM >= :NOMINI AND TERC_NOM <= :NOMFIN
    INTO :NIT, :NOMBRE, :DV, :TELEFONO, :CIUDAD, :CODZONA, :CODCIUD
    DO  
    BEGIN
    OK = 'N';
    if (AGRUPA = 'Z') then
        BEGIN
        if (GRPINI = '') then
            BEGIN
            if ((CODZONA IS NULL) or (CODZONA >= :GRPINI AND CODZONA <= :GRPFIN)) then
                OK = 'S';
            END
        ELSE
            if (CODZONA >= :GRPINI AND CODZONA <= :GRPFIN) then
                OK = 'S';
        END
    if (AGRUPA = 'C') then
        BEGIN
        if (GRPINI = '') then
            BEGIN
            if ((CODCIUD IS NULL) or (CODCIUD >= :GRPINI AND CODCIUD <= :GRPFIN)) then
                OK = 'S';
            END
        ELSE
            if (CODCIUD >= :GRPINI AND CODCIUD <= :GRPFIN) then
                OK = 'S';
        END
    if (AGRUPA = 'N') then
        OK = 'S';
        
    if (OK = 'S') then
        BEGIN
        select GRPR_NOM from GRUPOS_PROVEEDORES where GRPR_COD = :codzona into :NOMZONA;
        select CIUD_NOM from CIUDADES where CIUD_COD = :codciud into :nomciud;
        if (DETALLE = 'S') then
            BEGIN
            if (DESCRETE = 'SI') then
                FOR select tido_nomcorto, mvpr_idref, mvpr_prefijo, mvpr_numero, mvpr_fecha, mvpr_conc, mvpr_monto, mvpr_debito, mvpr_rtfte, mvpr_rtiva, mvpr_rtica, mvpr_abono
                    from movimiento_proveedor m, tipo_documento t
                    where m.mvpr_tiporef = t.tido_cod and terc_nit = :NIT and mvpr_fecha >= :FECINI and mvpr_fecha <= :FECFIN AND MVPR_TIPOREF <> 55 AND mvpr_abono = 'N' AND (MVPR_RTFTE <> 0 OR MVPR_RTIVA <> 0 OR MVPR_RTICA <> 0) 
                    order by mvpr_fecha, mvpr_tiporef
                    into :TIPODOC, :IDDOC, :PREFIJO, :NUMERO, :FECHA, :CONCEPTO, :DEBITO, :DB, :RTFTE, :RTIVA, :RTICA, :AB
                    DO
                    BEGIN
                    if (RTFTE IS NULL) then
                        RTFTE = 0;
                    if (RTIVA IS NULL) then
                        RTIVA = 0;
                    if (RTICA IS NULL) then
                        RTICA = 0;
                    if (DB = 'N') then
                        BEGIN
                        CREDITO = DEBITO;
                        DEBITO = 0;
                        RTFTE = RTFTE * -1;
                        RTIVA = RTIVA * -1;
                        RTICA = RTICA * -1;
                        END
                    ELSE
                        CREDITO = 0;
                    if ((RTFTE <> 0) or (RTIVA <> 0) or (RTICA <> 0)) then
                        SUSPEND;
                    END
            ELSE
                FOR select tido_nomcorto, mvpr_idref, mvpr_prefijo, mvpr_numero, mvpr_fecha, mvpr_conc, mvpr_monto, mvpr_debito, mvpr_rtfte, mvpr_rtiva, mvpr_rtica, mvpr_abono
                    from movimiento_proveedor m, tipo_documento t
                    where m.mvpr_tiporef = t.tido_cod and terc_nit = :NIT and mvpr_fecha >= :FECINI and mvpr_fecha <= :FECFIN AND mvpr_abono = 'S' AND (MVPR_RTFTE <> 0 OR MVPR_RTIVA <> 0 OR MVPR_RTICA <> 0)
                    order by mvpr_fecha, mvpr_tiporef
                    into :TIPODOC, :IDDOC, :PREFIJO, :NUMERO, :FECHA, :CONCEPTO, :DEBITO, :DB, :RTFTE, :RTIVA, :RTICA, :AB
                    DO
                    BEGIN
                    if (RTFTE IS NULL) then
                        RTFTE = 0;
                    if (RTIVA IS NULL) then
                        RTIVA = 0;
                    if (RTICA IS NULL) then
                        RTICA = 0;
                    if (DB = 'N') then
                        BEGIN
                        CREDITO = DEBITO;
                        DEBITO = 0;
                        RTFTE = RTFTE * -1;
                        RTIVA = RTIVA * -1;
                        RTICA = RTICA * -1;
                        END
                    ELSE
                        CREDITO = 0;
                    if ((RTFTE <> 0) or (RTIVA <> 0) or (RTICA <> 0)) then
                        SUSPEND;
                    END
            END
        ELSE
            BEGIN
            if (DESCRETE = 'SI') then
                BEGIN
                SELECT SUM(MVPR_MONTO), sum(mvpr_rtfte), sum(mvpr_rtiva), sum(mvpr_rtica)
                    FROM movimiento_proveedor WHERE TERC_NIT = :NIT AND MVPR_FECHA >= :FECINI AND MVPR_FECHA <= :FECFIN AND MVPR_DEBITO = 'S' and MVPR_ABONO = 'N' AND (MVPR_RTFTE <> 0 OR MVPR_RTIVA <> 0 OR MVPR_RTICA <> 0)
                    INTO :DEBITO, :RTFTE, :RTIVA, :RTICA;
                if (RTFTE IS NULL) then
                    RTFTE = 0;
                if (RTIVA IS NULL) then
                    RTIVA = 0;
                if (RTICA IS NULL) then
                    RTICA = 0;
                SELECT SUM(MVPR_MONTO), sum(mvpr_rtfte), sum(mvpr_rtiva), sum(mvpr_rtica)
                    FROM movimiento_proveedor WHERE TERC_NIT = :NIT AND MVPR_FECHA >= :FECINI AND MVPR_FECHA <= :FECFIN AND MVPR_DEBITO = 'N' AND MVPR_TIPOREF <> 55 AND MVPR_ABONO = 'N' AND (MVPR_RTFTE <> 0 OR MVPR_RTIVA <> 0 OR MVPR_RTICA <> 0)
                    INTO :CREDITO, :ARTFTE, :ARTIVA, :ARTICA;
                if (ARTFTE IS NULL) then
                    ARTFTE = 0;
                if (ARTIVA IS NULL) then
                    ARTIVA = 0;
                if (ARTICA IS NULL) then
                    ARTICA = 0;
                RTFTE = RTFTE - ARTFTE;
                RTIVA = RTIVA - ARTIVA;
                RTICA = RTICA - ARTICA;
                END
            else
                BEGIN
                SELECT SUM(MVPR_MONTO) FROM movimiento_proveedor WHERE TERC_NIT = :NIT AND MVPR_FECHA >= :FECINI AND MVPR_FECHA <= :FECFIN AND MVPR_DEBITO = 'S' and MVPR_ABONO = 'S' AND (MVPR_RTFTE <> 0 OR MVPR_RTIVA <> 0 OR MVPR_RTICA <> 0) INTO :DEBITO;
                SELECT SUM(MVPR_MONTO) FROM movimiento_proveedor WHERE TERC_NIT = :NIT AND MVPR_FECHA >= :FECINI AND MVPR_FECHA <= :FECFIN AND MVPR_DEBITO = 'N' AND MVPR_TIPOREF <> 55 AND MVPR_ABONO = 'S' AND (MVPR_RTFTE <> 0 OR MVPR_RTIVA <> 0 OR MVPR_RTICA <> 0) INTO :CREDITO;
                SELECT sum(mvpr_rtfte), sum(mvpr_rtiva), sum(mvpr_rtica) FROM movimiento_proveedor WHERE TERC_NIT = :NIT AND MVPR_FECHA >= :FECINI AND MVPR_FECHA <= :FECFIN AND MVPR_ABONO = 'S' INTO :RTFTE, :RTIVA, :RTICA;
                END
            if (DEBITO IS NULL) then
                DEBITO = 0;
            if (CREDITO IS NULL) then
                CREDITO = 0;
            if (RTFTE IS NULL) then
                RTFTE = 0;
            if (RTIVA IS NULL) then
                RTIVA = 0;
            if (RTICA IS NULL) then
                RTICA = 0;
            if ((RTFTE <> 0) or (RTIVA <> 0) or (RTICA <> 0)) then
                SUSPEND;
            END
        END
    END
END
^

SET TERM ; ^


/* 20100226 */

CREATE TABLE GRUPO_VENDEDOR (
    GRVR_COD     T_ID NOT NULL,
    GRVE_NOM     T_CONCEPTO,
    GRVE_GRUPO   T_CONCEPTO,
    GRVE_GRUPO2  T_CONCEPTO,
    GRVE_GRUPO3  T_CONCEPTO
);
ALTER TABLE GRUPO_VENDEDOR ADD CONSTRAINT PK_GRUPO_VENDEDOR PRIMARY KEY (GRVR_COD);


CREATE TABLE VENDEDORES_GRUPO (
    GRVE_ID   T_ID NOT NULL,
    VEND_COD  T_ID NOT NULL
);
ALTER TABLE VENDEDORES_GRUPO ADD CONSTRAINT PK_VENDEDORES_GRUPO PRIMARY KEY (GRVE_ID, VEND_COD);


SET TERM ^ ;

CREATE or ALTER PROCEDURE REP_VENTAS_VENDEDOR_GRUPO (
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    CODVEN INTEGER,
    NOMVEN VARCHAR(60) CHARACTER SET NONE,
    VENTAS NUMERIC(18,2),
    DEVOL NUMERIC(18,2),
    NETO NUMERIC(18,2),
    GRUPO VARCHAR(60) CHARACTER SET NONE,
    GRUPO2 VARCHAR(60) CHARACTER SET NONE,
    GRUPO3 VARCHAR(60) CHARACTER SET NONE,
    GRUPO4 VARCHAR(60) CHARACTER SET NONE)
AS
begin
FOR SELECT MAX(VEND_COD), SUM(FACT_TOTAL-FACT_IVAMONTO) FROM FACTURAS
    WHERE FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND FACT_ANULADO = 'N'
    GROUP BY VEND_COD INTO :CODVEN, :VENTAS
    DO
    BEGIN
    DEVOL = NULL;
    SELECT SUM(DEVT_TOTAL-DEVT_IVAMONTO) FROM devoluciones_ventas
        WHERE VEND_COD = :codven AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND DEVT_ANULADO = 'N' INTO :devol;
    if (DEVOL IS NULL) then
        DEVOL = 0;
    NETO = VENTAS - DEVOL;
    SELECT VEND_NOMBRE FROM VENDEDORES WHERE VEND_COD = :codven INTO :nomven;
    SELECT GRVE_NOM, GRVE_GRUPO, GRVE_GRUPO2, GRVE_GRUPO3
        FROM grupo_vendedor G, VENDEDORES_GRUPO V
        WHERE V.vend_cod = :CODVEN AND V.grve_id = G.grvr_cod INTO :grupo, :grupo2, :grupo3, :grupo4;
    suspend;
    END
end^

SET TERM ; ^

ALTER TABLE VENDEDORES
ADD VEND_GRUPO T_CONCEPTO;

SET TERM ^ ;

CREATE OR ALTER procedure REP_VENTAS_VENDEDOR_GRUPO (
    FECINI date,
    FECFIN date)
returns (
    CODVEN integer,
    NOMVEN varchar(60),
    VENTAS numeric(18,2),
    DEVOL numeric(18,2),
    NETO numeric(18,2),
    GRUPO varchar(60),
    GRUPO2 varchar(60),
    GRUPO3 varchar(60),
    GRUPO4 varchar(60))
AS
begin
FOR SELECT MAX(VEND_COD), SUM(FACT_TOTAL-FACT_IVAMONTO) FROM FACTURAS
    WHERE FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND FACT_ANULADO = 'N'
    GROUP BY VEND_COD INTO :CODVEN, :VENTAS
    DO
    BEGIN
    DEVOL = NULL;
    SELECT SUM(DEVT_TOTAL-DEVT_IVAMONTO) FROM devoluciones_ventas
        WHERE VEND_COD = :codven AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND DEVT_ANULADO = 'N' INTO :devol;
    if (DEVOL IS NULL) then
        DEVOL = 0;
    NETO = VENTAS - DEVOL;
    SELECT VEND_GRUPO FROM VENDEDORES WHERE VEND_COD = :codven INTO :nomven;
    SELECT GRVE_NOM, GRVE_GRUPO, GRVE_GRUPO2, GRVE_GRUPO3
        FROM grupo_vendedor G, VENDEDORES_GRUPO V
        WHERE V.vend_cod = :CODVEN AND V.grve_id = G.grvr_cod INTO :grupo, :grupo2, :grupo3, :grupo4;
    suspend;
    END
end
^

SET TERM ; ^

grant EXECUTE on PROCEDURE rep_ventas_vendedor_grupo to PUBLIC;
grant select, delete, insert, update on vendedores_grupo to PUBLIC;
grant select, delete, insert, update on grupo_vendedor to PUBLIC;

/* 20100227 */
/* BASE E IVA TOTAL EN REPORTE DE COSTOS MAS IMPUESTOS */

SET TERM ^ ;

CREATE OR ALTER procedure EXISTENCIAS_DESDE_HASTA (
    FECHA date,
    ARTINI varchar(20),
    ARTFIN varchar(20),
    GRPINI varchar(3),
    GRPFIN varchar(3),
    BODINI varchar(2),
    BODFIN varchar(2),
    ORDEN char(1),
    AGRUPA char(1),
    DETALLE char(1),
    RESERVA char(1),
    ENPESO char(1),
    MASIVA char(1),
    SUCURSAL integer)
returns (
    CANT numeric(18,4),
    COSTO numeric(18,2),
    COSTO_LOTE numeric(18,2),
    CODIGO varchar(15),
    NOMBRE varchar(60),
    UNIDAD varchar(8),
    STAND varchar(20),
    CODGRUPO varchar(2),
    NOMGRUPO varchar(30),
    CODSUBG varchar(3),
    NOMSUBG varchar(30),
    CODMARC varchar(3),
    NOMMARC varchar(30),
    CODBOD varchar(2),
    LOTE varchar(15),
    NOMBOD varchar(30),
    COSTOTOT numeric(18,2),
    COSTOIVA numeric(18,2),
    ULTCOSTO numeric(18,2),
    FECHACOSTO date,
    CONSUMO numeric(18,2),
    RESERVADO numeric(18,4),
    ORDENADO numeric(18,4),
    IVA numeric(9,2),
    IVAMONTO numeric(18,2),
    PESOUNIT numeric(18,4),
    PESOTOTAL numeric(18,4),
    PRECIO numeric(18,2),
    CODBAR varchar(20))
AS
declare variable exist char(1);
declare variable codini varchar(20);
declare variable codfin varchar(20);
declare variable desini varchar(20);
declare variable desfin varchar(20);
declare variable ordenc numeric(18,4);
declare variable pedido numeric(18,4);
declare variable ok char(1);
declare variable id integer;
declare variable item integer;
declare variable und varchar(8);
declare variable factor numeric(18,4);
declare variable cant2 numeric(18,4);
declare variable PEDAUTO CHAR(2);
DECLARE VARIABLE LISTA INTEGER;
BEGIN
EXECUTE PROCEDURE lee_configuracion ('FACTURACION','FACTURAS', 'CODIGO DE LA LISTA DE PRECIOS A MOSTRAR EN ARTICULOS') returning_values (:LISTA);
if (ORDEN = 'C') then
    BEGIN
    CODINI = ARTINI;
    CODFIN = ARTFIN;
    DESINI = '';
    DESFIN = 'zz';
    END
ELSE
    BEGIN
    DESINI = ARTINI;
    DESFIN = ARTFIN;
    CODINI = '';
    CODFIN = 'zz';
    END
EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION', 'FACTURAS', 'GENERAR PEDIDO AUTOMATICAMENTE CON LA FACTURA') returning_values (pedauto);
if (DETALLE = 'B') then
  BEGIN
  FOR SELECT ARTI_COD, ARTI_DES, ARTI_UNIDAD, ARTI_EXIST, TAIV_PORC, A.GRUP_COD, A.SUBG_COD, A.MARC_COD, BODE_COD, BODE_NOM, ARTI_CONSUMO, ARTI_PESO/1000
      FROM ARTICULO A, BODEGA B, TARIFA_IVA T
      WHERE ARTI_COD >= :CODINI AND ARTI_COD <= :CODFIN AND ARTI_DES >= :DESINI AND ARTI_DES <= :DESFIN AND ESAR_COD <> 'I' AND BODE_COD >= :BODINI AND
      BODE_COD <= :BODFIN AND ((SUCU_ID = :SUCURSAL) or (:SUCURSAL = 0)) AND A.TAIV_COD = T.TAIV_COD
      INTO :CODIGO, :NOMBRE, :UNIDAD, :EXIST, :IVA, :CODGRUPO, :CODSUBG, :CODMARC, :CODBOD, :NOMBOD, :CONSUMO, :pesounit
      DO
        BEGIN
        STAND = '';
        OK = 'N';
        if (AGRUPA = 'G') then
            BEGIN
            if ((CODGRUPO >= GRPINI) AND (CODGRUPO <= GRPFIN)) then
                OK = 'S';
            end
        ELSE
            if (AGRUPA = 'M') then
                BEGIN
                if ((CODMARC >= GRPINI) AND (CODMARC <= GRPFIN)) then
                    OK = 'S';
                END
        if (OK = 'S') then
            BEGIN
            NOMGRUPO = '';
            NOMMARC = '';
            NOMSUBG = '';
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            SELECT MAX(COBA_COD) FROM BARRAS_ARTICULO WHERE ARTI_COD = :codigo AND COBA_UNIDAD = :unidad INTO :codbar;
            if (CODBAR IS NULL) then
                CODBAR = CODIGO;
            if (EXIST <> 'N') then
                BEGIN
                SELECT STAND_COD FROM STANDS WHERE ARTI_COD = :CODIGO AND STAND_BODEGA = :CODBOD INTO :STAND;
                EXECUTE PROCEDURE SALDO_INICIAL_INVENTARIO(CODIGO, FECHA, :CODBOD) returning_values (CANT);
                EXECUTE PROCEDURE costo_promedio_y_ultimo_unidad(CODIGO, FECHA, UNIDAD) returning_values (COSTO, ULTCOSTO);
                SELECT MAX(MVAR_FECHA) FROM MOVIMIENTO_ARTICULO WHERE ARTI_COD = :CODIGO AND MVAR_ENTRADA = 'S' AND MVAR_FECHA <= :FECHA INTO :FECHACOSTO;
                COSTOTOT = :CANT * :COSTO;
                IVAMONTO = COSTOTOT /100 * IVA;
                COSTOIVA = COSTOTOT;
                if (MASIVA = 'S') then
                    BEGIN
                    COSTOIVA = COSTOTOT + IVAMONTO;
                    COSTO = COSTO * (100 + :IVA) / 100 + :CONSUMO;
                    END
                CONSUMO = CONSUMO * CANT;
                COSTOIVA = COSTOIVA + CONSUMO;
                if (RESERVA = 'S') then
                    BEGIN
                    SELECT SUM(ORID_ENTREGAR)
                        FROM ORDENINVENTARIO_DETALLE OD, ordenes_inventario O
                        WHERE O.ORIN_ID = OD.ORIN_ID AND ARTI_COD = :CODIGO AND ORIN_FECHA <= :FECHA AND ORIN_FECLLEGA >= :FECHA AND ORID_ANULADO = 'N' AND OD.BODE_COD = :CODBOD
                        INTO :ORDENADO;
                    if (ORDENADO IS NULL) then
                        ORDENADO = 0;
                    ORDENC = 0;
                    FOR SELECT O.ORDC_ID, OCDE_ITEM, OCDE_CANT * OCDE_FACTOR
                        FROM ORDENES_COMPRA O, ORDENES_COMPRA_DETALLE OD
                        WHERE O.ORDC_ID = OD.ORDC_ID AND OD.ARTI_COD = :CODIGO AND ORDC_VENCE >= :FECHA AND ORDC_FECHA <= :FECHA AND OCDE_ANULADO = 'N' AND OD.BODE_COD = :CODBOD
                        INTO :ID, :ITEM, :CANT2
                        do
                        BEGIN
                        EXECUTE PROCEDURE FALTANTE(23, 21, ID, ITEM) returning_values (PEDIDO, UND, FACTOR);
                        if (PEDIDO * FACTOR = CANT2) then /* SI NO SE HA FACTURADO MIRE A VER SI SE REMISIONO */
                            EXECUTE PROCEDURE FALTANTE(23, 22, ID, ITEM) returning_values (PEDIDO, UND, FACTOR);
                        if (PEDIDO IS NULL) then
                            PEDIDO = 0;
                        ORDENC = ORDENC + PEDIDO * FACTOR;
                        END
                    ORDENADO = ORDENADO + ORDENC;
                    SELECT SUM(RSDE_LIBERAR)
                        FROM RESERVAS_DETALLE RD, RESERVAS R
                        WHERE R.RESE_ID = RD.RESE_ID AND ARTI_COD = :CODIGO AND RESE_FECHA <= :FECHA AND RESE_VENCE >= :FECHA AND RD.BODE_COD = :CODBOD AND RSDE_ANULADO = 'N'
                        INTO :RESERVADO;
                    if (RESERVADO IS NULL) then
                        RESERVADO = 0;
                    PEDIDO = 0;
                    FOR SELECT P.PEDI_ID, PEDE_ITEM, PEDE_CANT * PEDE_FACTOR
                        FROM PEDIDOS P, PEDIDOS_DETALLE PD
                        WHERE P.PEDI_ID = PD.PEDI_ID AND PD.ARTI_COD = :CODIGO AND PEDI_VENCE >= :FECHA AND PEDI_FECHA <= :FECHA AND PEDE_ANULADO = 'N' AND BODE_COD = :CODBOD
                        INTO :ID, :ITEM, :CANT2
                        do
                        BEGIN
                        EXECUTE PROCEDURE FALTANTE(34, 31, ID, ITEM) returning_values (ORDENC, UND, FACTOR);
                        if ((ORDENC * FACTOR = CANT2) or (PEDAUTO = 'SI')) then /* SI NO SE HA FACTURADO MIRE A VER SI SE REMISIONO */
                            EXECUTE PROCEDURE FALTANTE(34, 32, ID, ITEM) returning_values (ORDENC, UND, FACTOR);
                        if (ORDENC IS NULL) then
                            ORDENC = 0;
                        PEDIDO = PEDIDO + ORDENC * FACTOR;
                        END
                    RESERVADO = RESERVADO + PEDIDO;
                    END
                ELSE
                    BEGIN
                    RESERVADO = 0;
                    ORDENADO = 0;
                    END
                if (LISTA > 0) then
                    SELECT prar_fijo FROM precios_articulo WHERE arti_cod = :CODIGO and lipr_cod = :LISTA INTO :PRECIO;
                if (ENPESO = 'S') then
                    BEGIN
                    if (pesounit IS NULL) then
                        pesounit = 0;
                    if (PESOUNIT <> 0) then
                        BEGIN
                        pesototal = PESOUNIT * cant;
                        SUSPEND;
                        END
                    END
                ELSE
                    SUSPEND;
                END
            END
        END
  END

if (DETALLE = 'L') then
  BEGIN
  FOR SELECT A.ARTI_COD, ARTI_DES, ARTI_UNIDAD, ARTI_EXIST, TAIV_PORC, A.GRUP_COD, A.SUBG_COD, A.MARC_COD, L.lote_nro, L.lote_nro||' - '||L.lote_vence, ARTI_CONSUMO,l.bode_cod, L.lote_saldo,l.lote_costo, ARTI_PESO/1000
      FROM ARTICULO A, LOTES l, TARIFA_IVA T
      WHERE A.ARTI_COD >= '0' AND A.ARTI_COD <= 'zz' AND ARTI_DES >= '' AND ARTI_DES <= 'zz' AND ESAR_COD <> 'I' AND A.TAIV_COD = T.TAIV_COD and a.arti_cod = l.arti_cod
      INTO :CODIGO, :NOMBRE, :UNIDAD, :EXIST, :IVA, :CODGRUPO, :CODSUBG, :CODMARC, :LOTE, :NOMBOD, :CONSUMO, :codbod, :cant, :costo_lote, :pesounit
      DO
        BEGIN
        OK = 'N';
        if (AGRUPA = 'G') then
            BEGIN
            if ((CODGRUPO >= GRPINI) AND (CODGRUPO <= GRPFIN)) then
                OK = 'S';
            end
        ELSE
            if (AGRUPA = 'M') then
                BEGIN
                if ((CODMARC >= GRPINI) AND (CODMARC <= GRPFIN)) then
                    OK = 'S';
                END
        if (OK = 'S') then
            BEGIN
            NOMGRUPO = '';
            NOMMARC = '';
            NOMSUBG = '';
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            SELECT MAX(COBA_COD) FROM BARRAS_ARTICULO WHERE ARTI_COD = :codigo AND COBA_UNIDAD = :unidad INTO :codbar;
            if (CODBAR IS NULL) then
                CODBAR = CODIGO;

            if (EXIST <> 'N') then
                BEGIN
                EXECUTE PROCEDURE COSTO_PROMEDIO_UNIDAD(CODIGO, FECHA, UNIDAD) returning_values (COSTO);
                EXECUTE PROCEDURE ULTIMO_COSTO(CODIGO, FECHA, UNIDAD) returning_values (ULTCOSTO);
                SELECT MAX(MVAR_FECHA) FROM MOVIMIENTO_ARTICULO WHERE ARTI_COD = :CODIGO AND MVAR_ENTRADA = 'S' AND MVAR_FECHA <= :FECHA INTO :FECHACOSTO;
                COSTOTOT = :CANT * :COSTO;
                IVAMONTO = COSTOTOT /100 * IVA;
                COSTOIVA = COSTOTOT;
                if (MASIVA = 'S') then
                    BEGIN
                    COSTOIVA = COSTOTOT + IVAMONTO;
                    COSTO = COSTO * (100 + :IVA) / 100 + :CONSUMO;
                    END
                CONSUMO = CONSUMO * CANT;
                COSTOIVA = COSTOIVA + CONSUMO;
                if (RESERVA = 'S') then
                    BEGIN
                    SELECT SUM(ORID_ENTREGAR)
                        FROM ORDENINVENTARIO_DETALLE OD, ordenes_inventario O
                        WHERE O.ORIN_ID = OD.ORIN_ID AND ARTI_COD = :CODIGO AND ORIN_FECHA <= :FECHA AND ORIN_FECLLEGA >= :FECHA AND ORID_ANULADO = 'N'
                        INTO :ORDENADO;
                    if (ORDENADO IS NULL) then
                        ORDENADO = 0;
                    ORDENC = 0;
                    FOR SELECT O.ORDC_ID, OCDE_ITEM, OCDE_CANT * OCDE_FACTOR
                        FROM ORDENES_COMPRA O, ORDENES_COMPRA_DETALLE OD
                        WHERE O.ORDC_ID = OD.ORDC_ID AND OD.ARTI_COD = :CODIGO AND ORDC_VENCE >= :FECHA AND ORDC_FECHA <= :FECHA AND OCDE_ANULADO = 'N'
                        INTO :ID, :ITEM, :CANT2
                        do
                        BEGIN
                        EXECUTE PROCEDURE FALTANTE(23, 21, ID, ITEM) returning_values (PEDIDO, UND, FACTOR);
                        if (PEDIDO * FACTOR = CANT2) then /* SI NO SE HA FACTURADO MIRE A VER SI SE REMISIONO */
                            EXECUTE PROCEDURE FALTANTE(23, 22, ID, ITEM) returning_values (PEDIDO, UND, FACTOR);
                        if (PEDIDO IS NULL) then
                            PEDIDO = 0;
                        ORDENC = ORDENC + PEDIDO * FACTOR;
                        END
                    ORDENADO = ORDENADO + ORDENC;
                    SELECT SUM(RSDE_LIBERAR)
                        FROM RESERVAS_DETALLE RD, RESERVAS R
                        WHERE R.RESE_ID = RD.RESE_ID AND ARTI_COD = :CODIGO AND RESE_FECHA <= :FECHA AND RESE_VENCE >= :FECHA AND RSDE_ANULADO = 'N'
                        INTO :RESERVADO;
                    if (RESERVADO IS NULL) then
                        RESERVADO = 0;
                    PEDIDO = 0;
                    FOR SELECT P.PEDI_ID, PEDE_ITEM, PEDE_CANT * PEDE_FACTOR
                        FROM PEDIDOS P, PEDIDOS_DETALLE PD
                        WHERE P.PEDI_ID = PD.PEDI_ID AND PD.ARTI_COD = :CODIGO AND PEDI_VENCE >= :FECHA AND PEDI_FECHA <= :FECHA AND PEDE_ANULADO = 'N'
                        INTO :ID, :ITEM, :CANT2
                        do
                        BEGIN
                        EXECUTE PROCEDURE FALTANTE(34, 31, ID, ITEM) returning_values (ORDENC, UND, FACTOR);
                        if ((ORDENC * FACTOR = CANT2) or (PEDAUTO = 'SI')) then /* SI NO SE HA FACTURADO MIRE A VER SI SE REMISIONO */
                            EXECUTE PROCEDURE FALTANTE(34, 32, ID, ITEM) returning_values (ORDENC, UND, FACTOR);
                        if (ORDENC IS NULL) then
                            ORDENC = 0;
                        PEDIDO = PEDIDO + ORDENC * FACTOR;
                        END
                    RESERVADO = RESERVADO + PEDIDO;
                    END
                ELSE
                    BEGIN
                    RESERVADO = 0;
                    ORDENADO = 0;
                    END
                if (LISTA > 0) then
                    SELECT prar_fijo FROM precios_articulo WHERE arti_cod = :CODIGO and lipr_cod = :LISTA INTO :PRECIO;
                if (ENPESO = 'S') then
                    BEGIN
                    if (pesounit IS NULL) then
                        pesounit = 0;
                    if (PESOUNIT <> 0) then
                        BEGIN
                        pesototal = PESOUNIT * cant;
                        SUSPEND;
                        END
                    END
                ELSE
                    SUSPEND;
                END
            END
        END
  end
if (DETALLE = 'N') then
  BEGIN
  FOR SELECT ARTI_COD, ARTI_DES, ARTI_UNIDAD, ARTI_EXIST, TAIV_PORC, A.GRUP_COD, A.SUBG_COD, A.MARC_COD, ARTI_CONSUMO, ARTI_PESO/1000
      FROM ARTICULO A, TARIFA_IVA T
      WHERE ARTI_COD >= :CODINI AND ARTI_COD <= :CODFIN AND ARTI_DES >= :DESINI AND ARTI_DES <= :DESFIN AND ESAR_COD <> 'I' AND A.TAIV_COD = T.TAIV_COD
      INTO :CODIGO, :NOMBRE, :UNIDAD, :EXIST, :IVA, :CODGRUPO, :CODSUBG, :CODMARC, :CONSUMO, :pesounit
      DO
        BEGIN
        OK = 'N';
        if (AGRUPA = 'G') then
            BEGIN
            if ((GRPINI = '0') AND (GRPFIN = 'zz')) then
                OK = 'S';
            else
                if ((CODGRUPO >= GRPINI) AND (CODGRUPO <= GRPFIN)) then
                    OK = 'S';
            end
        ELSE
            if (AGRUPA = 'M') then
                BEGIN
                if ((GRPINI = '0') AND (GRPFIN = 'zzz')) then
                    OK = 'S';
                else
                    if ((CODMARC >= GRPINI) AND (CODMARC <= GRPFIN)) then
                        OK = 'S';
                END
        if (OK = 'S') then
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            SELECT MAX(COBA_COD) FROM BARRAS_ARTICULO WHERE ARTI_COD = :codigo AND COBA_UNIDAD = :unidad INTO :codbar;
            if (CODBAR IS NULL) then
                CODBAR = CODIGO;

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

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

SET TERM ; ^

/* 20100227B */
/* STRING TRUNCATION EN COMPRAS CON VARIAS ORDENES */

SET TERM ^ ;

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

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

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

    /* ACTUALICE EL PENDIENTE  */
    if (CONSOLIDA <> 0) then
        BEGIN
        UPDATE consolidado_faltantes SET COFA_OK = 'S' WHERE COFA_ID = :consolida AND COFA_ITEM = NEW.FCDE_ITEM AND ARTI_COD = NEW.arti_cod;
        EXECUTE procedure LEE_CONFIGURACION ('COMPRAS','DOCUMENTOS','SUMAR CANTIDADES PENDIENTES AL CONSOLIDAR DOCUMENTOS') returning_values (CONSO);
        /* IGNORE LA CONSOLIDACION SI SE VALIDAN CODIGOS DE LA ORDEN */
        SELECT MIN(CEFA_TIPOORI) FROM consolide_faltantes WHERE CEFA_ID = :CONSOLIDA INTO :NUMROWS;
        if (NUMROWS = 23) then
            BEGIN
            EXECUTE PROCEDURE LEE_CONFIGURACION('COMPRAS', 'FACTURAS', 'VERIFICAR CODIGOS DE LA ORDEN') returning_values (MENORV);
            if (MENORV = 'SI') then
                CONSO = 'NO';
            END
        SELECT COUNT(CEFA_ITEM) FROM consolide_faltantes WHERE CEFA_ID = :CONSOLIDA INTO :NUMROWS;
        if ((CONSO = 'SI') AND (NUMROWS > 1)) then
            UPDATE consolidado_faltantes SET COFA_IDDES = NEW.faco_id, COFA_OK = 'S' WHERE COFA_ID = :consolida;
        else
            BEGIN
            /* BUSQUE EL CONSOLIDADO EN EL MISMO ITEM Y SI ES DIFERENTE ACTUALICELO */
            select COFA_CANT * COFA_FACTOR FROM consolidado_faltantes WHERE COFA_ID = :consolida AND COFA_ITEM = NEW.FCDE_ITEM AND ARTI_COD = NEW.arti_cod INTO :CANTREL;
            if (NEW.FCDE_CANT * NEW.FCDE_FACTOR < CANTREL) then
                UPDATE consolidado_faltantes SET COFA_IDDES = NEW.faco_id, COFA_CANT = NEW.FCDE_CANT, COFA_FACTOR = NEW.FCDE_FACTOR
                    WHERE COFA_ID = :consolida AND COFA_ITEM = NEW.FCDE_ITEM AND ARTI_COD = NEW.arti_cod;
            END
        END
    /* ACTUALICE EL STAND */
    if (new.fcde_stand is not null) then
      if (exists(select stand_cod from stands where arti_cod = new.arti_cod and stand_bodega = new.bode_cod)) then
        UPDATE stands set stand_cod = new.fcde_stand where arti_cod = new.arti_cod and stand_bodega = new.bode_cod;
      else
        INSERT INTO stands (ARTI_COD, STAND_BODEGA, STAND_COD) VALUES (NEW.arti_cod, NEW.bode_cod, NEW.fcde_stand);
    END
END
^

SET TERM ; ^

/* 2010/02/27C */
/* DATOS DE CONTACTO DEL TERCERO EN EL BALANCE A EXCEL */
SET TERM ^ ;

CREATE OR ALTER procedure BALANCE_CON_TERCEROS_MES (
    ANO char(4),
    MES integer,
    CTAINI varchar(20),
    CTAFIN varchar(20),
    NITINI varchar(20),
    NITFIN varchar(20))
returns (
    CUENTA varchar(20),
    NOM_CUENTA varchar(60),
    NIT varchar(20),
    DV char(1),
    NOM_TERCERO varchar(60),
    DIR VARCHAR(60),
    CIUDAD VARCHAR(40),
    CODCIU VARCHAR(5),
    TEL VARCHAR(40),
    FAX VARCHAR(40),
    CEL VARCHAR(40),
    INICIAL numeric(18,2),
    DEBITOS numeric(18,2),
    CREDITOS numeric(18,2),
    FINAL numeric(18,2),
    SCLASE numeric(18,2),
    SGRUPO numeric(18,2),
    SSUBGRUPO numeric(18,2),
    SCUENTA numeric(18,2),
    STERCERO numeric(18,2),
    NOMCTATER varchar(120),
    NIVEL integer)
AS
DECLARE VARIABLE OK CHAR(1);
declare variable ES_TERC CHAR(1);
BEGIN
FOR SELECT CUEN_COD, CUEN_NOM, CUEN_TERCERO FROM CUENTAS
    WHERE CUEN_COD >= :CTAINI AND CUEN_COD <= :CTAFIN
    order by CUEN_COD INTO CUENTA, NOM_CUENTA, ES_TERC
DO
  BEGIN
  SCLASE = 0;
  SGRUPO = 0;
  SSUBGRUPO = 0;
  SCUENTA = 0;
  STERCERO = 0;
  EXECUTE PROCEDURE SALDO_CUENTA_MES(CUENTA, ANO, MES, 'S') RETURNING_VALUES (INICIAL);
  EXECUTE PROCEDURE MOVIMIENTO_CUENTA_MES(CUENTA, ANO, MES, 'S') RETURNING_VALUES(DEBITOS);
  EXECUTE PROCEDURE MOVIMIENTO_CUENTA_MES(CUENTA, ANO, MES, 'N') RETURNING_VALUES(CREDITOS);
  FINAL = INICIAL + DEBITOS - CREDITOS;
  NIT = '';
  NOM_TERCERO = '';
  EXECUTE PROCEDURE VALIDE_ESTRUCTURA (CUENTA) RETURNING_VALUES (:NIVEL);
  if (NIVEL = 1) then
    SCLASE = FINAL;
  if (NIVEL = 2) then
    SGRUPO = FINAL;
  if (NIVEL = 3) then
    SSUBGRUPO = FINAL;
  if (NIVEL = 4) then
    SCUENTA = FINAL;
  NOMCTATER = NOM_CUENTA;
  SUSPEND;
  EXECUTE PROCEDURE ES_AFECTABLE(CUENTA) RETURNING_VALUES (OK);
  IF ((OK = 'S') AND (ES_TERC = 'S')) THEN
    BEGIN
    FOR SELECT distinct TERC_NIT FROM SALDOS_TERCEROS
        WHERE CUEN_COD = :CUENTA AND TERC_NIT >= :NITINI AND TERC_NIT <= :NITFIN
        ORDER BY TERC_NIT 
        INTO :NIT
        do
        BEGIN
        SELECT TERC_NOM, TERC_DV, TERC_DIR, TERC_CIU, TERC_TEL, TERC_CEL, TERC_FAX, CIUD_COD FROM TERCEROS
            WHERE TERC_NIT = :NIT INTO NOM_TERCERO, :DV, :DIR, :ciudad, :tel, :cel, :fax, :codciu;
        EXECUTE PROCEDURE SALDO_TERCERO_MES(CUENTA, NIT, ANO, MES, 'S') RETURNING_VALUES (INICIAL);
        EXECUTE PROCEDURE MOVIMIENTO_TERCERO_MES(CUENTA, NIT, ANO, MES, 'S') RETURNING_VALUES(DEBITOS);
        EXECUTE PROCEDURE MOVIMIENTO_TERCERO_MES(CUENTA, NIT, ANO, MES, 'N') RETURNING_VALUES(CREDITOS);
        FINAL = INICIAL + DEBITOS - CREDITOS;
        NOM_CUENTA = '';
        SCUENTA = 0;
        STERCERO = FINAL;
        NOMCTATER = NOM_TERCERO;
        if ((final <> 0) or (inicial <> 0) or (debitos <> 0) or (creditos <> 0)) then
          SUSPEND;
        END
    END
  END
END

^

SET TERM ; ^


/* 20100301 */
/* INDEPENDIZAR LAS DEVOLUCIONES DEL POS DE LAS DEL FRENTE DEL PROGRAMA */
INSERT INTO CONFIGURACION (CONF_MODULO, CONF_CATEGORIA, CONF_PROPIEDAD, CONF_VALOR, CONF_POSIBLES, CONF_AYUDA) VALUES ('FACTURACION', 'POS', 'PERMITIR DEVOLVER ITEMS NO FACTURADOS', 'NO', 'SI,NO', 'SI: Se puede devolver un artículo que no pertenezca a la factura (se usa durante el proceso de implementación). NO: No permite ingresar un artículo que no este previamente facturado');
INSERT INTO CONFIGURACION (CONF_MODULO, CONF_CATEGORIA, CONF_PROPIEDAD, CONF_VALOR, CONF_POSIBLES, CONF_AYUDA) VALUES ('FACTURACION', 'POS', 'PERMITIR CREAR CLIENTES DESDE EL POS', 'NO', 'SI,NO', 'SI: Permite crear y modificar clientes desde el POS. NO: Sólo se pueden crear o modificar los datos del cliente desde el módulo de cartera o facturación.');
COMMIT WORK;

/* 20100302 */
/* BORRABA MOVIMIENTOS DE ENTRADA DE PRODUCTOS AL HACER LA CONSOLIDACION POR USAR EL MISMO TIPO E ITEM */
SET TERM ^ ;

CREATE OR ALTER procedure CONSOLIDE_PRODUCCION (
    PLANID integer)
AS
declare variable item integer;
declare variable artic varchar(20);
declare variable cant numeric(18,4);
declare variable cantpro numeric(18,4);
declare variable codcmp varchar(20);
declare variable cantcmp numeric(18,4);
declare variable porcmp float;
declare variable undcmp varchar(8);
declare variable factor float;
declare variable pesocmp numeric(18,4);
declare variable peso numeric(18,4);
declare variable merma numeric(18,4);
declare variable tipoord integer;
declare variable numrows integer;
declare variable total float;
declare variable descr varchar(60);
declare variable unidad varchar(8);
declare variable sobrante varchar(15);
declare variable porsob numeric(9,4);
declare variable fec date;
declare variable Pref varchar(4);
declare variable Num varchar(6);
declare variable Bod varchar(2);
begin
ITEM = 0;
select plpr_fecini, plpr_pref, plpr_numero, plpr_bodori from plan_produccion
    where plpr_id = :planid into :fec, :Pref, :Num, :Bod;
FOR SELECT D.ARTI_COD, PLPD_CANT * PLPD_FACTOR, PLPD_PESO, arti_sobrante, arti_porcsobr
    from PLAN_PRODUCCION_DET d, articulo ar
    WHERE d.arti_cod = ar.arti_cod and PLPR_ID = :PLANID
    INTO :ARTIC, :CANTPRO, :PESO, :sobrante, :porsob
    DO
    BEGIN
    select sum(arpr_porc) from articulos_producto where arti_cod = :artic into :total;
    FOR SELECT arpr_comp, ARPR_CANT, ARPR_UNIDAD, ARPR_PORC, ARTI_UNIDAD, ARTI_DES, arti_peso, arpr_merma
        from articulos_producto AP, ARTICULO A2
        WHERE AP.arpr_comp = A2.arti_cod AND AP.arti_cod = :ARTIC ORDER by ARPR_ITEM
        INTO :codcmp, :cantcmp, :undcmp, :porcmp, :unidad, :descr, :pesocmp, :MERMA
        DO
        BEGIN
        EXECUTE PROCEDURE factor_unidad_cant(:codcmp, :undcmp) returning_values (:FACTOR);
        if (((cantcmp is null) or (cantcmp = 0)) AND (PORCMP IS NOT NULL) AND (porcmp <> 0)) then
            BEGIN
            /* ES PORCENTUAL AL PESO LA MEZCLA SOBRE EL 1ER ARTICULO */
            CANT = cantpro * PESO;
            CANT = CANT / TOTAL * porcmp; /* APLICA LA PROPORCION */
            if ((MERMA IS NOT NULL) AND (MERMA <> 0)) then
                CANT = CANT / ((100 - MERMA) / 100);
            END
        ELSE
            BEGIN
            CANT = cantpro * CANTCMP * factor * pesocmp;
            END
        undcmp = 'GRAMO';

        SELECT COUNT(ARTI_COD) FROM articulos_producto WHERE ARTI_COD = :codcmp INTO :NUMROWS;
        if (NUMROWS <> 0) then
           TIPOORD = 19;
        else
            TIPOORD = 24;

        /* INSERTE O ACTUALICE EL COMPONENTE */
        if (NOT EXISTS (SELECT PLPC_ITEM FROM plan_produccion_cons WHERE PLPD_ID = :planid AND ARTI_COD = :codcmp)) then
            BEGIN
            ITEM = ITEM + 1;
            INSERT INTO plan_produccion_cons (PLPD_ID, PLPC_ITEM, PLPC_CODBAR, ARTI_COD, PLPC_CANT, PLPC_UNIDAD, PLPC_EXIST, PLPC_ORDENAR, PLPC_ORDENTIPO, PLPC_ORDENID, PLPC_ANULADO, PLPC_TRANSMIT, PLPC_DESC)
                VALUES (:planid, :item, :codcmp, :codcmp, :cant, :undcmp, 0, 0, :tipoord, 0, 'N', 'N', :descr);
            END
        ELSE
            UPDATE plan_produccion_cons SET PLPC_CANT = PLPC_CANT + :CANT
                WHERE PLPD_ID = :planid AND ARTI_COD = :codcmp;
        END
    /* ingrese el sobrante */
    if ((sobrante <> '') and (porsob <> 0)) then
      INSERT INTO MOVIMIENTO_ARTICULO
          (ARTI_COD, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM, TERC_NIT)
          VALUES(:sobrante, :bod, :FEC, 27, :planid, 'SOBRANTE PLAN PRODUCCION ' || :PREF || :num || ' ARTICULO:' || :ARTIC,
          :porsob * :total /100, 0, 'S', null, :Pref, :Num, 0, null);
    END
end
^

SET TERM ; ^


SET TERM ^ ;

CREATE OR ALTER TRIGGER PLAN_PRODUCCION_CONS_AI FOR PLAN_PRODUCCION_CONS
ACTIVE AFTER INSERT POSITION 0
as
declare variable fec date;
declare variable CONC VARCHAR(60);
declare variable factor numeric(18,4);
declare variable Pref varchar(4);
declare variable Num varchar(6);
declare variable Bod varchar(2);
BEGIN
  if ((NEW.plpd_id <> 0) and (new.plpc_anulado = 'N')) then
    BEGIN
    select plpr_fecini, plpr_conc, plpr_pref, plpr_numero, plpr_bodori from plan_produccion
        where plpr_id = new.plpd_id into :fec, :conc, :Pref, :Num, :Bod;
    execute procedure factor_unidad_cant(new.arti_cod, new.plpc_unidad) returning_values(factor);

    insert into plan_produccion_cons_prod(plpd_id, plpc_item, plcp_nrocomp, arpr_comp, arpr_cant, arpr_porc, arpr_unidad, arpr_merma, arti_peso)
        SELECT new.plpd_id, new.plpc_item, ARPR_ITEM, ARPR_COMP, ARPR_CANT, ARPR_PORC, ARPR_UNIDAD, ARPR_MERMA, ARTI_PESO
        from articulos_producto P, ARTICULO A
        where P.arpr_comp = A.arti_cod AND p.arti_cod = NEW.arti_cod;
    INSERT INTO MOVIMIENTO_ARTICULO
      (ARTI_COD, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM, TERC_NIT)
      VALUES(NEW.ARTI_COD, :bod, :FEC, 27, NEW.plpd_id,
      :CONC, :factor * new.plpc_cant, 0, 'N', null, :Pref, :Num, new.plpc_item+1000, null);
    end
end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER PLAN_PRODUCCION_CONS_AU FOR PLAN_PRODUCCION_CONS
ACTIVE AFTER UPDATE POSITION 0
as
declare variable fec date;
declare variable CONC VARCHAR(60);
declare variable factor numeric(18,4);
declare variable Pref varchar(4);
declare variable Num varchar(6);
declare variable Bod varchar(2);
BEGIN
if ((old.arti_cod <> new.arti_cod) or (old.plpc_cant <> new.plpc_cant) or (old.plpc_unidad <> new.plpc_unidad) or
    (old.plpc_anulado <> new.plpc_anulado) or (old.plpc_transmit <> new.plpc_transmit)) then
  begin
  /* Anule el anterior */
  if ((old.plpd_id <> 0) and (old.plpc_anulado = 'N')) then
    begin
    delete from movimiento_articulo where (mvar_tipodoc = 27) and (mvar_idref = old.plpd_id) and (mvar_item = old.plpc_item+1000);
    DELETE FROM plan_produccion_cons_prod WHERE PLPD_ID = OLD.plpd_id AND PLPC_ITEM = OLD.plpc_item;
    END
  /* Registre el nuevo */
  if ((new.plpd_id <> 0) and (new.plpc_anulado = 'N')) then
    BEGIN
    select plpr_fecini, plpr_conc, plpr_pref, plpr_numero, plpr_bodori from plan_produccion
        where plpr_id = new.plpd_id into :fec, :conc, :Pref, :Num, :Bod;
    execute procedure factor_unidad_cant(new.arti_cod, new.plpc_unidad) returning_values(factor);
    insert into plan_produccion_cons_prod(plpd_id, plpc_item, plcp_nrocomp, arpr_comp, arpr_cant, arpr_porc, arpr_unidad, arpr_merma, arti_peso)
        SELECT new.plpd_id, new.plpc_item, ARPR_ITEM, ARPR_COMP, ARPR_CANT, ARPR_PORC, ARPR_UNIDAD, ARPR_MERMA, ARTI_PESO
        from articulos_producto P, ARTICULO A
        where P.arpr_comp = A.arti_cod AND p.arti_cod = NEW.arti_cod;
    INSERT INTO MOVIMIENTO_ARTICULO
      (ARTI_COD, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM, TERC_NIT)
      VALUES(NEW.ARTI_COD, :bod, :FEC, 27, NEW.plpd_id,
      :CONC, :factor * new.plpc_cant, 0, 'N', null, :Pref, :Num, new.plpc_item+1000, null);
    END
  end
end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER PLAN_PRODUCCION_DET_AD FOR PLAN_PRODUCCION_DET
ACTIVE AFTER DELETE POSITION 0
as
begin
if ((OLD.plpr_id <> 0) and (OLD.plpd_anulado = 'N')) then
    BEGIN
    DELETE FROM movimiento_articulo M WHERE M.mvar_tipodoc = 27 AND M.mvar_idref = OLD.plpr_id AND M.mvar_item = OLD.plpd_item+1000;
    delete from plan_produccion_productos where plpr_id = old.plpr_id and plpd_item = old.plpd_item;
    END
end
^

SET TERM ; ^


/* 20100304 */
/* no incluya los inactivos */

SET TERM ^ ;

CREATE OR ALTER procedure ORDEN_SUGERIDA (
    PROVEEDOR varchar(20),
    FECHA date)
returns (
    ARTICULO varchar(15),
    BODEGA varchar(2),
    CANT numeric(18,4),
    UNIDAD varchar(8),
    COSTO numeric(18,2))
AS
declare variable FACTOR NUMERIC(15,4);
declare variable DIAS INTEGER;
declare variable EXISTENCIA NUMERIC(18,4);
declare variable PROMEDIO NUMERIC(18,4);
declare variable AGENCIA INTEGER;
declare variable DIA_ART VARCHAR(2) CHARACTER SET NONE;
declare variable DIASC VARCHAR(255);
declare variable SALIDAS NUMERIC(18,4);
BEGIN
FOR SELECT a.ARTI_COD, PVAR_COSTO, ARTI_UNIDAD, ARTI_DIAS FROM proveedor_articulo p, articulo a
    WHERE p.arti_cod = a.arti_cod and TERC_NIT = :proveedor and esar_cod <> 'I' order by a.arti_des
    INTO :articulo, :costo, :unidad, :DIAS
  DO BEGIN
  for select bode_cod, SUCU_ID from bodega into :bodega, :agencia
    do
    begin
    execute procedure saldo_inventario (:articulo, :bodega, :fecha) returning_values (:Existencia);
    EXECUTE PROCEDURE FACTOR_UNIDAD_CANT(:ARTICULO, :UNIDAD) returning_values (:FACTOR);
    if (FACTOR <> 0) then
        EXISTENCIA = EXISTENCIA / FACTOR;
    else
        EXISTENCIA = 0;
    EXECUTE PROCEDURE promedio_salidas_articulo (:ARTICULO, :FECHA, :BODEGA) returning_values (:PROMEDIO, :SALIDAS);
    EXECUTE PROCEDURE lee_configuracion ('INVENTARIO', 'EXISTENCIAS', 'PROMEDIAR LAS SALIDAS DEL INVENTARIO CON EL NUMERO DE DIAS ASIGNADO A CADA ARTICULO') returning_values (:DIA_ART);
    if (DIA_ART = 'NO') then
        BEGIN
        EXECUTE PROCEDURE lee_configuracion ('INVENTARIO', 'EXISTENCIAS', 'NUMERO DE DIAS PARA PROMEDIO DE SALIDAS POR ARTICULO') returning_values (DIASC);
        DIAS = CAST(DIASC AS INTEGER);
        END
    if (DIAS is null) then
        DIAS = 0;
    PROMEDIO = DIAS * PROMEDIO;
    if (FACTOR <> 0) then
        PROMEDIO = PROMEDIO / FACTOR;
    CANT = PROMEDIO - EXISTENCIA;
    if (CANT > 0) then
        SUSPEND;
    end
  END
END
^

SET TERM ; ^


/* 20100304B */
/* SI DEVOLUCION SOBRE REMISION, PERMITA SIN FACTURA  */
SET TERM ^ ;

CREATE OR ALTER TRIGGER DEVOLUCIONES_VENTAS_BI FOR DEVOLUCIONES_VENTAS
ACTIVE BEFORE INSERT POSITION 0
AS
declare variable NUMERO VARCHAR(6);
declare variable AUTOM CHAR(1);
declare variable EXISTE CHAR(1);
declare variable SITOT CHAR(2);
declare variable CODCOBR INTEGER;
declare variable CODVEND INTEGER;
declare variable FECSERVER CHAR(2);
declare variable PREGTASA CHAR(2);
BEGIN
if ((NEW.devt_trm IS NULL) or (NEW.devt_trm = 0)) then
    NEW.devt_trm = 1;
EXECUTE PROCEDURE LEE_CONFIGURACION('GENERAL', 'GENERAL', 'PREGUNTAR TASA DE CAMBIO EN DOCUMENTOS DE CARTERA') returning_values (:pregtasa);
if (PREGTASA = 'SI') then
    BEGIN
    NEW.devt_adicional = NEW.devt_adicional * NEW.devt_trm;
    NEW.devt_ivamonto = NEW.devt_ivamonto * NEW.devt_trm;
    NEW.devt_extra = NEW.devt_extra * NEW.devt_trm;
    NEW.devt_rtftemonto = NEW.devt_rtftemonto * NEW.devt_trm;
    NEW.devt_rtivamonto = NEW.devt_rtivamonto * NEW.devt_trm;
    NEW.devt_rticamonto = NEW.devt_rticamonto * NEW.devt_trm;
    NEW.devt_dtomonto = NEW.devt_dtomonto * NEW.devt_trm;
    END
EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION', 'DOCUMENTOS', 'INHABILITAR FECHA EN DOCUMENTOS') returning_values (:fecserver);
if (FECSERVER = 'SI') then
    NEW.devt_fecha = CAST ('NOW' AS DATE);
if (new.devt_remid is null) then
    NEW.devt_remid = 0;
execute procedure LEE_CONFIGURACION ('FACTURACION','DEVOLUCIONES','PERMITIR DEVOLVER ITEMS NO FACTURADOS') returning_values (:SITOT);
if ((SITOT = 'NO') AND (NEW.devt_factid = 0) AND (NEW.devt_remid = 0)) then
    exception factura_no_existe;
/* CALCULE LA COMISION CON BASE EN LA FACTURA */
EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION', 'VENDEDORES', 'COMISIONES EN VENTA INCLUYENDO IMPUESTOS') returning_values (:SITOT);
SELECT FACT_COMIPORC FROM FACTURAS WHERE FACT_ID = NEW.devt_factid INTO NEW.devt_comiporc;
if (NEW.devt_comiporc IS NULL) then
    NEW.devt_comiporc = 0;

if (SITOT = 'SI') then
    NEW.devt_comimonto = NEW.devt_total * NEW.devt_comiporc / 100;
ELSE
    NEW.devt_comimonto = (NEW.devt_total - NEW.devt_ivamonto) * NEW.devt_comiporc / 100;

if (NEW.numok = 'N') then
  BEGIN
  /* Actualice el contador del prefijo */
  SELECT PREF_ACTUAL, PREF_AUTO FROM PREFIJOS WHERE TIDO_COD = 33 AND PREF_PRE = NEW.PREF_PRE INTO :NUMERO, :AUTOM;
  /* ACTUALICE EL NUMERO EN COMPROBANTE_ENCABEZADO  */
  if (AUTOM = 'S') then
    BEGIN
    NEW.DEVT_NUMERO = NUMERO;
    NUMERO = CAST((CAST(NUMERO AS INTEGER) + 1) AS CHAR(6));
    UPDATE PREFIJOS
      SET PREF_ACTUAL = :NUMERO
    WHERE TIDO_COD = 33 AND PREF_PRE = NEW.PREF_PRE;
    END
  ELSE
    BEGIN
    if (CAST(NUMERO AS INTEGER) = CAST(NEW.DEVT_NUMERO AS INTEGER)) then
        UPDATE PREFIJOS
          SET PREF_ACTUAL = CAST((CAST(PREF_ACTUAL AS INTEGER) + 1) AS CHAR(6))
        WHERE TIDO_COD = 33 AND PREF_PRE = NEW.PREF_PRE;
    END
  EXECUTE PROCEDURE COMPLETA_CEROS (NEW.DEVT_numero) returning_values (NEW.DEVT_numero);
  NEW.numok = 'S';
  END
/* Verifique que el numero no existe previamente */
EXISTE = 'N';
SELECT 'S' FROM DEVOLUCIONES_VENTAS WHERE PREF_PRE = NEW.PREF_PRE AND DEVT_NUMERO = NEW.DEVT_NUMERO INTO :EXISTE;
if (EXISTE = 'S') then
    EXCEPTION DOCUMENTO_REGISTRADO 'Ya existe una devolución con el número ' || new.pref_pre || new.devt_numero;
select COBR_COD, VEND_COD FROM CLIENTES WHERE TERC_NIT = NEW.terc_nit INTO :CODCOBR, CODVEND;
if (NEW.cobr_cod IS NULL) then
    NEW.cobr_cod = :CODCOBR;
if (NEW.vend_cod IS NULL) then
    NEW.vend_cod = :CODVEND;
if ((new.DEVT_TOTAL-new.DEVT_IVAMONTO+new.DEVT_DTOMONTO-new.DEVT_ADICIONAL) = 0) then
    NEW.DEVT_FACTOR = 1;
else
    NEW.DEVT_FACTOR = (new.DEVT_TOTAL-new.DEVT_IVAMONTO)/(new.DEVT_TOTAL-new.DEVT_IVAMONTO+new.DEVT_DTOMONTO-new.DEVT_ADICIONAL);
END
^

SET TERM ; ^

/* 20100305: ANALISIS DE CXPAGAR CON VR EN MONEDA ORIGINAL Y TRM */
SET TERM ^ ;

CREATE OR ALTER PROCEDURE REP_ANALISIS_CXPAGAR(
    DESDE VARCHAR(20),
    HASTA VARCHAR(20),
    GRPINI VARCHAR(5),
    GRPFIN VARCHAR(5),
    FECHA DATE,
    DETALLE CHAR(1),
    ORDEN CHAR(1),
    AGRUPA CHAR(1),
    DIASR INTEGER,
    MONEDA INTEGER)
RETURNS (
    NIT VARCHAR(20),
    NOMBRE VARCHAR(60),
    TELEFONO VARCHAR(40),
    CIUDAD VARCHAR(40),
    GRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(60),
    TIPO INTEGER,
    ID INTEGER,
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(6),
    DIAS INTEGER,
    SALDO NUMERIC(18,2),
    SALDOMON NUMERIC(18,2),
    TRM NUMERIC(18,2),
    CORRIENTE NUMERIC(18,2),
    CERO NUMERIC(18,2),
    TREINTA NUMERIC(18,2),
    SESENTA NUMERIC(18,2),
    NOVENTA NUMERIC(18,2),
    TIPONOM VARCHAR(8),
    FECDOC DATE,
    VENCE DATE,
    NUMPROV VARCHAR(20))
AS
declare variable nitini varchar(20);
declare variable nitfin varchar(20);
declare variable nomini varchar(20);
declare variable nomfin varchar(20);
declare variable ok char(1);
declare variable rtfte numeric(18,2);
declare variable rtiva numeric(18,2);
declare variable rtica numeric(18,2);
declare variable vencimiento varchar(12);
BEGIN
if (ORDEN = 'C') then
    BEGIN
    NITINI = DESDE;
    NITFIN = HASTA;
    NOMINI = '';
    NOMFIN = 'zz';
    END
ELSE
    BEGIN
    NOMINI = DESDE;
    NOMFIN = HASTA;
    NITINI = '';
    NITFIN = 'zz';
    END
/* Ubique el NIT */
FOR select T.TERC_NIT, TERC_NOM,  TERC_TEL, TERC_CIU, GRPR_COD
    from terceros T, PROVEEDORES P
    where P.TERC_NIT = T.TERC_NIT AND TERC_PROV = 'S' AND T.TERC_NIT >= :NITINI AND T.TERC_NIT <= :NITFIN AND
        TERC_NOM >= :NOMINI AND TERC_NOM <= :NOMFIN
    INTO :NIT, :NOMBRE, :TELEFONO, :CIUDAD, :GRUPO
    DO  
    BEGIN
    SELECT GRPR_NOM FROM GRUPOS_PROVEEDORES WHERE GRPR_COD = :GRUPO INTO :NOMGRUPO;
    OK = 'N';
    if (AGRUPA = 'G') then
        BEGIN
        if (GRPINI = '') then
            BEGIN
            if ((GRUPO IS NULL) or (GRUPO >= :GRPINI AND GRUPO <= :GRPFIN)) then
                OK = 'S';
            END
        ELSE
            if (GRUPO >= :GRPINI AND GRUPO <= :GRPFIN) then
                OK = 'S';
        END
    if (AGRUPA = 'N') then
        OK = 'S';
    if (OK = 'S') then
        BEGIN
        CORRIENTE = 0;
        CERO = 0;
        TREINTA = 0;
        SESENTA = 0;
        NOVENTA = 0;
        /* BUSQUE EN SALDOS_DOC_CXPAGAR LOS QUE TENGAN SALDO > 0 */
        FOR SELECT MVPR_TIPOREF, MVPR_IDREF, MVPR_PREFIJO, MVPR_NUMERO, MVPR_FECHA, MVPR_VENCE, MVPR_TRM
            FROM MOVIMIENTO_PROVEEDOR M
            WHERE TERC_NIT = :NIT AND MVPR_FECHA <= :FECHA AND MVPR_ABONO = 'N' AND ((:MONEDA = 0) or (MVPR_TRM <> 1))
            INTO :TIPO, :ID, :PREFIJO, :NUMERO, :FECDOC, :VENCE, :TRM
            DO
            BEGIN
            EXECUTE PROCEDURE saldo_doc_cxpagar(TIPO, ID, FECHA, MONEDA) returning_values (SALDO);
            if (SALDO <> 0) then
                BEGIN
                SELECT TIDO_NOMCORTO FROM TIPO_DOCUMENTO WHERE TIDO_COD = :TIPO INTO :TIPONOM;
                if (MONEDA = 0) then
                BEGIN
                    SELECT SUM(SDCP_RTEFTE - SDCP_ABRTFTE), SUM(SDCP_RTIVA - SDCP_ABRTIVA), SUM(SDCP_RTICA - SDCP_ABRTICA)
                        FROM SALDOS_DOC_CXPAGAR WHERE SDCP_TIPOREF = :TIPO AND SDCP_IDREF = :ID
                        INTO :RTFTE, :RTIVA, :RTICA;
                    if (TRM <> 1) then
                    SALDOMON = (:SALDO / :TRM);
                    else
                    begin
                    SALDOMON = NULL;
                    TRM = NULL;
                    end
                END
                else
                BEGIN
                    SELECT SUM((SDCP_RTEFTE-SDCP_ABRTFTE)/SDCP_TRM), SUM((SDCP_RTIVA-SDCP_ABRTIVA)/SDCP_TRM), SUM((SDCP_RTICA-SDCP_ABRTICA)/SDCP_TRM)
                        FROM SALDOS_DOC_CXPAGAR WHERE SDCP_TIPOREF = :TIPO AND SDCP_IDREF = :ID
                        INTO :RTFTE, :RTIVA, :RTICA;
                END
                if (RTFTE IS NULL) then
                    RTFTE = 0;
                if ((TIPO = 52) or (TIPO = 55) or (TIPO = 24)) THEN
                    BEGIN
                    if (RTFTE > 0) then
                        RTFTE = 0;
                    END
                ELSE
                    BEGIN
                    if (RTFTE < 0) then
                        RTFTE = 0;
                    END

                if (RTIVA IS NULL) then
                    RTIVA = 0;
                if ((TIPO = 52) or (TIPO = 55) or (TIPO = 24)) THEN
                    BEGIN
                    if (RTIVA > 0) then
                        RTIVA = 0;
                    END
                ELSE
                    BEGIN
                    if (RTIVA < 0) then
                        RTIVA = 0;
                    END

                if (RTICA IS NULL) then
                    RTICA = 0;
                if ((TIPO = 52) or (TIPO = 55) or (TIPO = 24)) THEN
                    BEGIN
                    if (RTICA > 0) then
                        RTICA = 0;
                    END
                ELSE
                    BEGIN
                    if (RTICA < 0) then
                        RTICA = 0;
                    END
                /* AHORA CLASIFIQUE LOS DIAS */
                if (DETALLE = 'S') then
                    BEGIN
                    CORRIENTE = 0;
                    CERO = 0;
                    TREINTA = 0;
                    SESENTA = 0;
                    NOVENTA = 0;
                    END
                EXECUTE PROCEDURE LEE_CONFIGURACION('CXPAGAR', 'SALDOS', 'ANALISIS DE CXPAGAR CON FECHA FACTURA O VENCIMIENTO') returning_values (VENCIMIENTO);
                if (VENCIMIENTO = 'FECHA') then
                    DIAS = FECHA - FECDOC;
                ELSE
                    DIAS = FECHA - VENCE;
                if (DIAS < 0) then
                    CORRIENTE = CORRIENTE + SALDO;
                ELSE
                    if (DIAS < DIASR) then
                        CERO = CERO + SALDO;
                    ELSE
                        if (DIAS < (DIASR * 2)) then
                            TREINTA = TREINTA + SALDO;
                        ELSE
                            if (DIAS < (DIASR * 3)) then
                                SESENTA = SESENTA + SALDO;
                            ELSE
                                NOVENTA = NOVENTA + SALDO;
                if (DETALLE = 'S') then
                    BEGIN
                    if (TIPO = 51) then
                        SELECT NDPR_NUMPROV FROM NOTAS_DEBITO_PROVEEDOR WHERE NDPR_ID = :ID INTO :NUMPROV;
                    ELSE
                        if (TIPO = 21) then
                            SELECT FACO_NUMPROV FROM FACTURAS_COMPRA WHERE FACO_ID = :ID INTO :NUMPROV;
                        ELSE
                            NUMPROV = '';
                    SUSPEND;
                    END
                END /* SALDO <> 0 */
            END /* FOR MVPR */
        if (DETALLE = 'N') then
            begin
            SALDO = CORRIENTE + CERO + TREINTA + SESENTA + NOVENTA;
            if (TRM <> 1) then
             SALDOMON = (:SALDO / :TRM);
            else
             begin
             SALDOMON = null;
             trm = null;
             end
            SUSPEND;
            end
        END /* OK */
    END /* FOR NIT */
END
^

SET TERM ; ^


/* 20100305B */
/* INCLUYA LOS SALDOS INICIALES SI LA FECHA INICIAL DEL REPORTE ES ANTERIOR A LA FECHA DE INICIO CONTABLE */
SET TERM ^ ;

CREATE OR ALTER procedure CERTIFICADOS_RETENCION (
    NITINI varchar(20),
    NITFIN varchar(20),
    CTAINI varchar(20),
    CTAFIN varchar(20),
    FECINI varchar(8),
    FECFIN varchar(8),
    FECEXP date,
    ADMON varchar(60),
    NUMERAR char(1),
    INICIAL varchar(6))
returns (
    NIT varchar(20),
    NOMBRE varchar(60),
    DIRECCION varchar(60),
    CIUDAD varchar(40),
    CODCUENTA varchar(20),
    NOMCUENTA varchar(60),
    BASE numeric(18,2),
    RETENCION numeric(18,2),
    FECHAEXP date,
    ADMINISTRACION varchar(60),
    NUMERO varchar(20))
AS
declare variable actual integer;
declare variable ANOINI CHAR(4);
declare variable MESINI CHAR(2);
declare variable FECHAINI CHAR(8);
declare variable SALDORET NUMERIC(18,2);
declare variable SALDOBASE NUMERIC(18,2);
declare variable PORC NUMERIC(9,2);
begin
EXECUTE PROCEDURE LEE_CONFIGURACION ('CONTABILIDAD', 'GENERAL', 'AÑO DE INICIO') RETURNING_VALUES (:ANOINI);
EXECUTE PROCEDURE LEE_CONFIGURACION ('CONTABILIDAD', 'GENERAL', 'MES DE INICIO') RETURNING_VALUES (:MESINI);
execute procedure compone_fecha_conta (:ANOINI, CAST(:MESINI AS INTEGER), 1) returning_values (FECHAINI);
FECHAEXP = FECEXP;
ADMINISTRACION = ADMON;
ACTUAL = CAST(INICIAL AS INTEGER);
FOR SELECT TERC_NIT, TERC_NOM, TERC_DIR, TERC_CIU FROM TERCEROS
  WHERE TERC_NIT >= :NITINI AND TERC_NIT <= :NITFIN ORDER BY TERC_NIT
  INTO :NIT, :NOMBRE, :DIRECCION, :CIUDAD
  DO
    BEGIN
    FOR SELECT CUEN_COD, CUEN_NOM FROM CUENTAS WHERE CUEN_RETENCION = 'S' AND
      CUEN_COD >= :CTAINI AND CUEN_COD <= :CTAFIN
      INTO :CODCUENTA, :NOMCUENTA
      DO
        BEGIN
        if (FECHAINI > FECINI) then
            BEGIN
            /* INCLUYA LOS SALDOS INICIALES EN EL CERTIFICADO */
            SELECT SUM(SAIN_DEBITO-SAIN_CREDITO) FROM SALDOS_INICIALES
                WHERE CUEN_COD = :CODCUENTA AND TERC_NIT = :NIT
                INTO :SALDORET;
            if (SALDORET IS NULL) then
                SALDORET = 0;
            SELECT CUEN_PORC FROM CUENTAS WHERE CUEN_COD = :CODCUENTA INTO :PORC;
            if (PORC <> 0) then
                SALDOBASE = SALDORET * 100 / PORC;
            END
        SELECT SUM(CODE_BASE), SUM(CODE_DEBITO - CODE_CREDITO)
          FROM COMPROBANTE_ENCABEZADO E, COMPROBANTE_DETALLE D
          WHERE E.ENCO_CONSEC = D.ENCO_CONSEC AND CUEN_COD = :CODCUENTA AND D.TERC_NIT = :NIT AND
          ENCO_FECHA >= :FECINI AND ENCO_FECHA <= :FECFIN
          INTO :base,  :RETENCION;
        BASE = BASE + SALDOBASE;
        RETENCION = RETENCION + SALDORET;
        if (RETENCION <> 0) then
            begin
            if (substr(CODCUENTA, 1, 1) = '2') then
                BEGIN
                BASE = BASE * -1;
                RETENCION = RETENCION * -1;
                END
            if (numerar = 'S') then
                BEGIN
                NUMERO = CAST(ACTUAL AS CHAR(6));
                EXECUTE PROCEDURE COMPLETA_CEROS(NUMERO) returning_values (NUMERO);
                NUMERO = 'NUMERO: ' || NUMERO;
                ACTUAL = ACTUAL + 1;
                END
            ELSE
                NUMERO = '';
            SUSPEND;
            end
        END
    END
end
^

SET TERM ; ^

/* 20100306 */
/* NO INCLUYA LOS QUE NO SE HAN AJUSTADO */
SET TERM ^ ;

CREATE OR ALTER PROCEDURE REP_AJUSTES_ARTICULO(
    DETALLE CHAR(1),
    FECINI DATE,
    FECFIN DATE,
    ARTINI VARCHAR(20),
    ARTFIN VARCHAR(20),
    GRPINI VARCHAR(2),
    GRPFIN VARCHAR(2),
    ORDEN CHAR(1),
    SUBEMPRESA INTEGER)
RETURNS (
    CODIGO VARCHAR(15),
    NOMBRE VARCHAR(60),
    UNIDAD VARCHAR(8),
    CODGRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    CODSUBG VARCHAR(3),
    NOMSUBG VARCHAR(30),
    CODMARC VARCHAR(3),
    NOMMARC VARCHAR(30),
    CODBOD VARCHAR(2),
    STAND VARCHAR(20),
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    CANTANT NUMERIC(18,4),
    CANTNUE NUMERIC(18,4),
    AJUSCANT NUMERIC(18,4),
    COSTO NUMERIC(18,2),
    AJUSTOT NUMERIC(18,2),
    PORCENTA NUMERIC(9,2))
AS
declare variable codini varchar(20);
declare variable codfin varchar(20);
declare variable desini varchar(20);
declare variable desfin varchar(20);
BEGIN
if (ORDEN = 'C') then
    BEGIN
    CODINI = ARTINI;
    CODFIN = ARTFIN;
    DESINI = '';
    DESFIN = 'zz';
    END
ELSE
    BEGIN
    DESINI = ARTINI;
    DESFIN = ARTFIN;
    CODINI = '';
    CODFIN = 'zz';
    END
if (DETALLE = 'S') then
    FOR SELECT A.ARTI_COD, ARTI_DES, A.arti_unidad, A.GRUP_COD, A.SUBG_COD, A.MARC_COD, j.bode_cod, j.ajus_stand,
        J.pref_pre, J.ajus_numero, J.ajus_fecha, D.ajus_exant, D.ajus_exnue*d.ajus_factor, (ajus_exnue*d.ajus_factor)-ajus_exant, D.ajde_costo
      FROM ARTICULO A, AJUSTES J, AJUSTES_DETALLE D, prefijos p
      WHERE A.arti_cod = D.arti_cod AND J.ajus_id = D.ajus_id AND J.ajus_fecha >= :fecini AND J.ajus_fecha <= :fecfin AND J.ajus_anulado = 'N' AND
      A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :GRPFIN AND ARTI_DES >= :DESINI AND ARTI_DES <= :DESFIN and
      j.pref_pre = p.pref_pre and p.tido_cod = 14 and ((:subempresa = 0) or (p.sucu_id = :subempresa)) AND J.ajus_noajustar = 'N'
      INTO :CODIGO, :NOMBRE, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :codbod, :stand,
        :PREFIJO, :NUMERO, :FECHA, :cantant, :cantnue, :ajuscant, :costo
      DO
        BEGIN
        NOMMARC = '';
        NOMSUBG = '';
        SELECT GRUP_NOM FROM GRUPO WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
        SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
        SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
        ajustot = ajuscant * COSTO;
        if ((cantant <> 0) AND (costo <> 0)) then
            PORCENTA = ajustot / (cantant * costo) * 100;
        else
            PORCENTA = 0;
        SUSPEND;
        END
ELSE
    FOR SELECT MAX(A.ARTI_COD), MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(A.GRUP_COD), MAX(A.SUBG_COD), MAX(A.MARC_COD),
        SUM(D.ajus_exant), SUM(D.ajus_exnue), SUM(ajus_exnue-ajus_exant), SUM((ajus_exnue-ajus_exant)*ajde_costo), SUM(AJUS_EXANT*AJDE_COSTO)
      FROM ARTICULO A, AJUSTES J, AJUSTES_DETALLE D, prefijos p
      WHERE A.arti_cod = D.arti_cod AND J.ajus_id = D.ajus_id AND J.ajus_fecha >= :fecini AND J.ajus_fecha <= :fecfin AND J.ajus_anulado = 'N' AND
      A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :GRPFIN AND ARTI_DES >= :DESINI AND ARTI_DES <= :DESFIN and
      j.pref_pre = p.pref_pre and p.tido_cod = 14 and ((:subempresa = 0) or (p.sucu_id = :subempresa)) AND J.ajus_noajustar = 'N'
      GROUP BY J.bode_cod,  A.arti_cod
      INTO :CODIGO, :NOMBRE, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :cantant, :cantnue, :ajuscant, :ajustot, :COSTO
      DO
        BEGIN
        NOMMARC = '';
        NOMSUBG = '';
        SELECT GRUP_NOM FROM GRUPO WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
        SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
        SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
        if (costo <> 0) then
            PORCENTA = ajustot / costo * 100;
        else
            PORCENTA = 0;
        SUSPEND;
        END

END
^

SET TERM ; ^



/* 20100308 */
/* IMPOCONSUMO COMO VALOR DEL INGRESO Y COSTO PARA COMERCIALIZADORES NO RESPONSABLES DEL IMPUESTO */

INSERT INTO CONFIGURACION (CONF_MODULO, CONF_CATEGORIA, CONF_PROPIEDAD, CONF_VALOR, CONF_POSIBLES, CONF_AYUDA) VALUES ('FACTURACION', 'ARTICULOS', 'IMPOCONSUMO COMO MAYOR VALOR DEL COSTO Y DEL INGRESO', 'NO', 'SI,NO', 'SI:El valor del impoconsumo solo se usa para el cálculo de retenciones pero hace parte del ingreso y del costo en ventas. NO: El impoconsumo se maneja como cuenta corriente que suma al comprar y resta al vender el producto');
commit work;


SET TERM ^ ;

CREATE OR ALTER procedure CONTABIL_FACTURA (
    IDDOC integer,
    IDINTER integer)
returns (
    ERROR integer,
    VER char(1),
    IDC integer)
AS
declare variable pref varchar(4);
declare variable num varchar(6);
declare variable numero varchar(10);
declare variable fecaux date;
declare variable fecha char(8);
declare variable conc varchar(60);
declare variable venceaux date;
declare variable vence char(8);
declare variable vrdto numeric(18,2);
declare variable vradic numeric(18,2);
declare variable vrsubt numeric(18,2);
declare variable vriva numeric(18,2);
declare variable prtfte numeric(9,2);
declare variable vrrtfte numeric(18,2);
declare variable vrrtiva numeric(18,2);
declare variable prtica numeric(9,2);
declare variable vrrtica numeric(18,2);
declare variable vrtotal numeric(18,2);
declare variable vrextra numeric(18,2);
declare variable tipocomp varchar(3);
declare variable prefcont varchar(4);
declare variable ventas char(1);
declare variable ctaventas varchar(20);
declare variable iva char(1);
declare variable ctaiva varchar(20);
declare variable consumo char(1);
declare variable ctaconsumo varchar(20);
declare variable cartera char(1);
declare variable ctacartera varchar(20);
declare variable rtfte char(1);
declare variable ctartfte varchar(20);
declare variable rtiva char(1);
declare variable ctartiva varchar(20);
declare variable rtica char(1);
declare variable ctartica varchar(20);
declare variable inven char(1);
declare variable ctainven varchar(20);
declare variable costos char(1);
declare variable ctacostos varchar(20);
declare variable ctadto varchar(20);
declare variable ctaadic varchar(20);
declare variable ctaextra varchar(20);
declare variable existe char(1);
declare variable cuenta varchar(20);
declare variable monto numeric(18,2);
declare variable tipocuen char(1);
declare variable nit varchar(20);
declare variable nombre varchar(60);
declare variable proy varchar(4);
declare variable centro varchar(4);
declare variable proyi varchar(4);
declare variable centi varchar(4);
declare variable porc numeric(5,2);
declare variable debito numeric(18,2);
declare variable credito numeric(18,2);
declare variable nroi integer;
declare variable art varchar(15);
declare variable imptos numeric(18,2);
declare variable suma numeric(18,2);
declare variable porciva numeric(9,2);
declare variable tctaclien varchar(20);
declare variable tctaventa varchar(20);
declare variable tctartfte varchar(20);
declare variable tctartiva varchar(20);
declare variable tctartica varchar(20);
declare variable ctadic varchar(20);
declare variable baseadic varchar(20);
declare variable porcadic numeric(5,2);
declare variable valoradic numeric(18,2);
declare variable dbadic char(1);
declare variable ptovta integer;
declare variable anulado char(1);
declare variable dig integer;
declare variable mercancia numeric(18,2);
declare variable fomento varchar(2);
declare variable DTOXIT varchar(2);
declare variable vrconsumo numeric(18,2);
declare variable factor double precision;
declare variable cent char(1);
declare variable AUTORET VARCHAR(10);
declare variable FAUTORET DATE;
declare variable ERRORC INTEGER;
declare variable ICOING CHAR(2);
BEGIN
EXECUTE PROCEDURE LEE_CONFIGURACION('COMPRAS', 'FACTURAS', 'USAR IMPOCONSUMO COMO PORCENTAJE DE FOMENTO') returning_values (FOMENTO);
EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION', 'ARTICULOS', 'IMPOCONSUMO COMO MAYOR VALOR DEL COSTO Y DEL INGRESO') returning_values (ICOING);
EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'FECHA AUTORETENEDOR NO DESCONTAR RETENCIONES DEL SALDO PERO SI CONTABILIZARLAS') returning_values (AUTORET);
if (AUTORET <> '') then
    FAUTORET = CAST(AUTORET AS DATE);
else
    FAUTORET = '9999/12/31';
/* BUSQUE LA INTERFACE */
EXISTE = 'N';
SELECT 'S', TICO_COD, PRCO_PRE, INVE_VENTAS, INVE_IVA, INVE_CONSUMO, INVE_CARTERA, INVE_RTFTE, INVE_RTIVA, INVE_RTICA, INVE_COSTO, INVE_INVEN, INVE_CTAVENTAS, INVE_CTAIVA, INVE_CTACONSUMO, INVE_CTADTO, INVE_CTAADIC, INVE_CTAEXTRA, INVE_CTACARTERA, INVE_CTARTFTE, INVE_CTARTIVA, INVE_CTARTICA, INVE_CTAINVEN, INVE_CTACOSTOS, INVE_CONFIRMAR, INVE_CENTRO
    FROM INTERFAZ_VENTAS
    WHERE INVE_ID = :IDINTER
    INTO :EXISTE, :TIPOCOMP, :PREFCONT, :VENTAS, :IVA, :CONSUMO, :CARTERA, :RTFTE, :RTIVA, :RTICA, :COSTOS, :INVEN, :CTAVENTAS, :CTAIVA, :CTACONSUMO, :CTADTO, :CTAADIC, :CTAEXTRA, :CTACARTERA, :CTARTFTE, :CTARTIVA, :CTARTICA, :CTAINVEN, :CTACOSTOS, :VER, :CENT;
if (EXISTE = 'S') then
  BEGIN
    /* BORRE CUALQUEIR CONTABILIZACION PREVIA */
    DELETE FROM CONTABILIZACION WHERE CNTB_TIPOREF = 31 AND CNTB_IDREF = :IDDOC;

  /* TRAIGA EL ENCABEZADO DE LA FACTURA */
  SELECT PREF_PRE, FACT_NUMERO, FACT_FECHA, F.TERC_NIT, PTVT_ID, FACT_VENCE, FACT_DTOMONTO, FACT_ADICIONAL, FACT_IVAMONTO, FACT_EXTRA, FACT_TOTAL, FACT_RTFTEPOR, FACT_RTFTEMONTO, FACT_RTIVAPOR, FACT_RTIVAMONTO, FACT_RTICAPOR, FACT_RTICAMONTO, FACT_NOMCLIENTE, TERC_CTARTFTE, TERC_CTARTIVA, TERC_CTARTICA, TERC_CTAVENTA, TERC_CTACLIENTE, FACT_ANULADO
        FROM FACTURAS F, TERCEROS T
        WHERE FACT_ID = :IDDOC AND F.TERC_NIT = T.TERC_NIT
        INTO :PREF, :NUM, :FECAUX, :NIT, :PTOVTA, :VENCEAUX, :VRDTO, :VRADIC, :VRIVA, :VREXTRA, :VRTOTAL, :PRTFTE, :VRRTFTE, :PORC, :VRRTIVA, :PRTICA, :VRRTICA, :NOMBRE, TCTARTFTE, TCTARTIVA, TCTARTICA, TCTAVENTA, TCTACLIEN, ANULADO;
  if (ANULADO = 'N') then
    BEGIN
    /* BUSQUE EL CENTRO DEL PUNTO, LA BODEGA, O EL PREFIJO  */
    IF (CENT = 'B') THEN
        SELECT B.BODE_CENTRO, B.BODE_PROY FROM BODEGA B, FACTURAS F
            WHERE B.BODE_COD = F.BODE_COD AND F.FACT_ID = :IDDOC INTO :CENTRO, :PROY;
    IF (CENT = 'V') THEN
        SELECT V.CENT_COD, V.PROY_COD FROM VENDEDORES V, FACTURAS F
            WHERE V.VEND_COD = F.VEND_COD AND F.FACT_ID = :IDDOC INTO :CENTRO, :PROY;
    IF (CENT = 'P') THEN
        SELECT P.PREF_CENTRO,P.PREF_PROY  FROM PREFIJOS P, FACTURAS F
            WHERE P.PREF_PRE = F.PREF_PRE AND F.FACT_ID = :IDDOC AND P.TIDO_COD = 31 INTO :CENTRO, :PROY;
    NUMERO = PREF || NUM;
    SELECT SUM (FADE_CONSUMO) FROM FACTURAS_DETALLE WHERE FACT_ID = :IDDOC  AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
        INTO MERCANCIA;
    VRSUBT = VRTOTAL - VREXTRA - VRIVA - MERCANCIA; /* BASE DE RETEFTE Y RETEICA */

    EXECUTE PROCEDURE lee_configuracion ('FACTURACION', 'FACTURAS', 'DESCUENTO PIE FACTURA IGUAL A SUMA DE DESCUENTOS POR ITEM') returning_values (:DTOXIT);
    if (DTOXIT = 'SI') then
        VRDTO = 0;
    MERCANCIA = VRSUBT - VRADIC + VRDTO;
    EXECUTE PROCEDURE FECHA_A_CONTA(:FECAUX) returning_values (:FECHA);
    EXECUTE PROCEDURE FECHA_A_CONTA(:VENCEAUX) returning_values (:VENCE);
    /* REGISTRE EL ENCABEZADO CONTABLE */
    IDC = GEN_ID(ID_CONTABILIZA, 1);
    if (STRLEN(NOMBRE)> 43 ) then
      CONC = 'FV No.' || NUMERO || '-' || SUBSTR(NOMBRE,1,43);
    ELSE
      CONC = 'FV No.' || NUMERO || '-' || NOMBRE;
    INSERT INTO CONTABILIZACION (CNTB_ID, CNTB_TIPOCOMP, CNTB_PREFCNT, CNTB_NUMERO, CNTB_FECHA, CNTB_CONCEPTO, CNTB_REF, CNTB_TIPOREF, CNTB_IDREF, CNTB_PREFREF, CNTB_NUMREF, CNTB_PROCESADO)
        VALUES (:IDC, :TIPOCOMP, :PREFCONT, :NUM, :FECHA, :CONC, '', 31, :IDDOC, :PREF, :NUM, 'N');
    NROI = 0;
    SUMA = 0;
    ERROR = 0;
    /* SI NO HAY CUENTA DE DESCUENTO NI ADICIONAL CALCULE UN FACTOR PARA LAS VENTAS Y EL IVA */
    if (MERCANCIA <> 0) then
        FACTOR = CAST(VRSUBT AS DOUBLE PRECISION) / CAST(MERCANCIA AS DOUBLE PRECISION);
    ELSE
        FACTOR = 1;
    /* TRAIGA EL NUMERO DE DIGITOS PARA EL REDONDEO */
    SELECT CAST(CONF_VALOR AS INTEGER) FROM CONFIGURACION WHERE CONF_MODULO = 'FACTURACION' AND
        CONF_CATEGORIA = 'GENERAL' AND CONF_PROPIEDAD = 'REDONDEO AL MULTIPLO DE DIEZ EN TOTALES' INTO :DIG;
    /* CUENTAS DE VENTAS */
    if (VENTAS = 'A') then
        BEGIN
        FOR SELECT MAX(COAR_CTAVNT), SUM(FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), SUM(FADE_IVAMONTO), SUM(FADE_CONSUMO), MAX(B.bode_proy), MAX(B.bode_centro)
            FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_DETALLE F, bodega b
            WHERE F.FACT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL)) and
            f.bode_cod = b.bode_cod
            GROUP BY COAR_CTAVNT
            INTO :CTAVENTAS, :MONTO, :IMPTOS, :VRCONSUMO, :PROYI, :CENTI
            DO
            BEGIN
            if ((FOMENTO = 'SI') or (icoing = 'SI')) then
                MONTO = MONTO + VRCONSUMO;
            if ((CTADTO IS NULL) OR (CTADTO = '')) then
                MONTO = MONTO * FACTOR;
            execute procedure redondee(MONTO, DIG) returning_values (MONTO);
            if (MONTO <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTAVENTAS, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT F.ARTI_COD, (FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), FADE_CONSUMO
                        FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_DETALLE F
                        WHERE F.FACT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTAINV = :CUENTA AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
                        INTO :ART, :MONTO, :IMPTOS
                    DO
                        BEGIN
                        if ((FOMENTO = 'SI') or (ICOING = 'SI')) then
                            MONTO = MONTO + IMPTOS;
                        if ((CTADTO IS NULL) OR (CTADTO = '')) then
                            MONTO = MONTO * FACTOR;
                        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                        if (MONTO <> 0) then
                            BEGIN
                            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                            NROI = NROI + 1;
                            SUMA = SUMA - MONTO;
                            END
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    NROI = NROI + 1;
                    SUMA = SUMA - MONTO;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    IF (CENT = 'B') THEN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROYI, :CENTI, NULL, NULL, NULL, NULL, 0, 0);
                    ELSE
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA - MONTO;
                    END
                END /* MONTO <> 0 */
            END /* FOR */
        END /* VENTAS X ARTICULO */
     IF ((VENTAS = 'C') OR (VENTAS = 'K')) THEN
        BEGIN
        IF (VENTAS = 'C') THEN
            CTAVENTAS = TCTAVENTA;
        SELECT SUM(FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), SUM(FADE_IVAMONTO), SUM (FADE_CONSUMO)
            FROM FACTURAS_DETALLE F
            WHERE F.FACT_ID = :IDDOC AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
            INTO :MONTO, :IMPTOS, :VRCONSUMO;
        if ((FOMENTO = 'SI') or (ICOING = 'SI')) then
            MONTO = MONTO + VRCONSUMO;
        if ((CTADTO IS NULL) OR (CTADTO = '')) then
            MONTO = MONTO * FACTOR;
        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
        if (MONTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTAVENTAS, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT F.ARTI_COD, (FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), FADE_CONSUMO
                    FROM ARTICULO A, FACTURAS_DETALLE F
                    WHERE F.FACT_ID = :IDDOC AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
                    INTO :ART, :MONTO, :IMPTOS
                    DO
                    BEGIN
                    if ((FOMENTO = 'SI') or (ICOING = 'SI')) then
                        MONTO = MONTO + VRCONSUMO;
                    if ((CTADTO IS NULL) OR (CTADTO = '')) then
                        MONTO = MONTO * FACTOR;
                    execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                    if (MONTO <> 0) then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        SUMA = SUMA - MONTO;
                        END
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - MONTO;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - MONTO;
                END
            END /* MONTO <> 0 */
        END /* VENTAS DE CLIENTE O CONSTANTE */
    /* EL IVA EN VENTAS */
    if (IVA = 'A') then
        BEGIN
        FOR SELECT MAX(COAR_CTAIVAV), SUM(FADE_IVAMONTO), SUM(FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), sum(FADE_CONSUMO)
            FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_DETALLE F
            WHERE F.FACT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
            GROUP BY COAR_CTAIVAV
            INTO :CTAIVA, :IMPTOS, :MONTO, :VALORADIC
        DO
            BEGIN
            if (FOMENTO = 'SI') then
                MONTO = MONTO + VALORADIC;
            MONTO = MONTO * -1;
            MONTO = MONTO * FACTOR;
            IMPTOS = IMPTOS * FACTOR;
            execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
            execute procedure redondee(MONTO, DIG) returning_values (MONTO);
            if (IMPTOS <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTAIVA, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT F.ARTI_COD, FADE_IVAMONTO, (FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), TAIV_PORC, FADE_CONSUMO
                        FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_DETALLE F, TARIFA_IVA T
                        WHERE F.FACT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTAIVAV = :CUENTA AND A.TAIV_COD = T.TAIV_COD AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
                        INTO :ART, :IMPTOS, :MONTO, :PORCIVA, :VALORADIC
                    DO
                        BEGIN
                        if (FOMENTO = 'SI') then
                            MONTO = MONTO + VALORADIC;
                        MONTO = MONTO * -1;
                        MONTO = MONTO * FACTOR;
                        IMPTOS = IMPTOS * FACTOR;
                        execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                        if (IMPTOS <> 0) then
                            BEGIN
                            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, :MONTO, :PORCIVA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                            NROI = NROI + 1;
                            SUMA = SUMA + DEBITO - CREDITO;
                            END
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, :MONTO, ABS(:IMPTOS*100/:MONTO), :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    NROI = NROI + 1;
                    SUMA = SUMA - IMPTOS;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, :MONTO, ABS(:IMPTOS*100/:MONTO), :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA - IMPTOS;
                    END
                END   /* IMPTOS <> 0 */
            END /* FOR */
        END /* IVA X ARTICULO */
    if (IVA = 'K') then /* IVA EN CTA CONSTANTE */
        BEGIN
        SELECT SUM(FADE_IVAMONTO), SUM(FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), SUM(FADE_CONSUMO)
            FROM FACTURAS_DETALLE F
            WHERE F.FACT_ID = :IDDOC and FADE_IVAMONTO <> 0 AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
            INTO :IMPTOS, :MONTO, :valoradic;
        if (FOMENTO = 'SI') then
            MONTO = MONTO + VALORADIC;
        MONTO = MONTO * -1;
        MONTO = MONTO * FACTOR;
        IMPTOS = IMPTOS * FACTOR;
        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
        execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
        if (IMPTOS <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTAIVA, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT F.ARTI_COD, (FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), FADE_IVAMONTO, TAIV_PORC, FADE_CONSUMO
                    FROM ARTICULO A, FACTURAS_DETALLE F, TARIFA_IVA T
                    WHERE F.FACT_ID = :IDDOC AND A.TAIV_COD = T.TAIV_COD AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
                    INTO :ART, :MONTO, :IMPTOS, :PORCIVA, :VALORADIC
                    DO
                    BEGIN
                    if (FOMENTO = 'SI') then
                        MONTO = MONTO + VALORADIC;
                    MONTO = MONTO * -1;
                    MONTO = MONTO * FACTOR;
                    IMPTOS = IMPTOS * FACTOR;
                    execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                    execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                    if (IMPTOS <> 0) then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', 0, :IMPTOS, :MONTO, :PORCIVA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        SUMA = SUMA - IMPTOS;
                        END
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', 0, :IMPTOS, :MONTO, ABS(:IMPTOS*100/:MONTO), :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - IMPTOS;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', 0, :IMPTOS, :MONTO, ABS(:IMPTOS*100/:MONTO), :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - IMPTOS;
                END
            END /* IMPTOS <> 0 */
        END /* IVA EN CTA CONSTANTE */
    /* EL IMPOCONSUMO */
    if ((CONSUMO = 'A') AND (FOMENTO <> 'SI')) then
        BEGIN
        FOR SELECT MAX(COAR_CTACONS), SUM(FADE_CONSUMO)
            FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_DETALLE F
            WHERE F.FACT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
            GROUP BY COAR_CTACONS
            INTO :CTACONSUMO, :IMPTOS
        DO
            BEGIN
            execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
            if (IMPTOS <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTACONSUMO, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, REGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT F.ARTI_COD, FADE_CONSUMO
                        FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_DETALLE F
                        WHERE F.FACT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTACONS = :CUENTA AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
                        INTO :ART, :IMPTOS
                    DO
                        BEGIN
                        execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                        if (IMPTOS <> 0) then
                            BEGIN
                            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                            NROI = NROI + 1;
                            SUMA = SUMA - IMPTOS;
                            END
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    NROI = NROI + 1;
                    SUMA = SUMA - IMPTOS;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA - IMPTOS;
                    END
                END /* IMPTOS <> 0 */
            END /* FOR */
        END /* CONSUMO X ARTICULO */
    if ((CONSUMO = 'K') AND (FOMENTO <> 'SI')) then /* CONSUMO EN CTA CONSTANTE */
        BEGIN
        SELECT SUM(FADE_CONSUMO)
            FROM FACTURAS_DETALLE F
            WHERE F.FACT_ID = :IDDOC AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
            INTO :IMPTOS;
        execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
        if (IMPTOS <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTACONSUMO, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT F.ARTI_COD, FADE_CONSUMO
                    FROM ARTICULO A, FACTURAS_DETALLE F
                    WHERE F.FACT_ID = :IDDOC AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
                    INTO :ART, :IMPTOS
                    DO
                    BEGIN
                    execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                    if (IMPTOS <> 0) then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CTACONSUMO, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        SUMA = SUMA - IMPTOS;
                        END
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTACONSUMO, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - IMPTOS;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTACONSUMO, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - IMPTOS;
                END
            END /* IMPTOS <> 0 */
        END /* CONSUMO EN CTA CONSTANTE */
    /* DESCUENTO */
    if ((CTADTO IS NOT NULL) AND (CTADTO <> '')) then
        BEGIN
        execute procedure redondee(VRDTO, DIG) returning_values (VRDTO);
        if (VRDTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTADTO, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRDTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA + VRDTO;
                END
            if (TIPOCUEN = 'N') then
                    BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRDTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA + VRDTO;
                END
            END
        END /* DESCUENTO */
    /* VALOR ADIC */
    if ((CTAADIC IS NOT NULL) AND (CTAADIC <> '')) then
        BEGIN
        execute procedure redondee(VRADIC, DIG) returning_values (VRADIC);
        if (VRADIC <> 0) THEN
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTAADIC, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRADIC, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - VRADIC;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRADIC, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - VRADIC;
                END
            END
        END /* VR. ADIC */
    /* VALOR EXTRA */
    if ((CTAEXTRA IS NOT NULL) AND (CTAEXTRA <> '')) THEN
        BEGIN
        execute procedure redondee(VREXTRA, DIG) returning_values (VREXTRA);
        if (VREXTRA <> 0) THEN
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTAEXTRA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VREXTRA, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - VREXTRA;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VREXTRA, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - VREXTRA;
                END
            END
        END /* VR. EXTRA */
    /* DESCUENTE EL IMPOCONSUMO */
    SELECT SUM(FADE_CONSUMO)
        FROM FACTURAS_DETALLE F WHERE F.FACT_ID = :IDDOC AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL)) INTO :IMPTOS;
    vrsubt = vrsubt - IMPTOS;
    /* RETENCION FUENTE */
    if ((RTFTE = 'C') or (RTFTE = 'K')) then
      BEGIN
      execute procedure redondee(VRRTFTE, DIG) returning_values (VRRTFTE);
      if (VRRTFTE <> 0) then
        BEGIN
        if (RTFTE = 'C') then
            CTARTFTE = TCTARTFTE;
        EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTARTFTE, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :VRSUBT, :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTFTE;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :VRSUBT, :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTFTE;
            END
        /* AUTORETENCION */
        if (FAUTORET <= fecaux) then
            BEGIN
            EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'CUENTA DE AUTORETENCION EN LA FUENTE') returning_values (CTARTFTE);
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTARTFTE INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERROR (31, :IDDOC, :CTARTFTE, 2);
                CUENTA = CTARTFTE;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                begin
                EXECUTE PROCEDURE ERROR (31, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, (:VRSUBT*-1), :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - VRRTFTE;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, (:VRSUBT*-1), :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - VRRTFTE;
                END
            END
        END /* RTFTE */
      END
    if (RTFTE = 'A') then
      BEGIN
      FOR SELECT MAX(COAR_CTARTFTEV), MAX(COAR_RTFTE), MIN(COAR_RTBASE), SUM(FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), SUM((FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO)*COAR_RTFTE)
        FROM CONTABIL_ARTICULO C, FACTURAS_DETALLE F
        WHERE F.FACT_ID = :IDDOC AND F.ARTI_COD = C.ARTI_COD AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
        GROUP BY COAR_CTARTFTEV
        INTO :CTARTFTE, :PRTFTE, :baseadic, :MONTO, :VRRTFTE
        DO
        BEGIN
        MONTO = MONTO * FACTOR;
        if (MONTO >= BASEADIC) then
            BEGIN
            VRRTFTE = VRRTFTE * FACTOR / 100;
            execute procedure redondee(VRRTFTE, DIG) returning_values (VRRTFTE);
            execute procedure redondee(MONTO, DIG) returning_values (MONTO);
            if (VRRTFTE <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTARTFTE, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :MONTO, :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    NROI = NROI + 1;
                    SUMA = SUMA + VRRTFTE;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :MONTO, :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA + VRRTFTE;
                    END
                /* AUTORETENCION */
                if (FAUTORET <= fecaux) then
                    BEGIN
                    EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'CUENTA DE AUTORETENCION EN LA FUENTE') returning_values (CTARTFTE);
                    EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTARTFTE, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
                    if (ERRORC <> 0) then
                        ERROR = ERROR + 1;
                    if (TIPOCUEN = 'C') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, (:MONTO*-1), :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                        NROI = NROI + 1;
                        SUMA = SUMA - VRRTFTE;
                        END
                    if (TIPOCUEN = 'N') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, (:MONTO*-1), :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NROI = NROI + 1;
                        SUMA = SUMA - VRRTFTE;
                        END
                    END
                END
            END
        END /* RTFTE */
      END
    /* RETENCION IVA */
    if ((RTIVA = 'C') or (RTIVA = 'K')) then
      BEGIN
      execute procedure redondee(VRRTIVA, DIG) returning_values (VRRTIVA);
      if (VRRTIVA <> 0) then
        BEGIN
        if (RTIVA = 'C') then
            CTARTIVA = TCTARTIVA;
        EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTARTIVA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTIVA, 0, :VRIVA, :PORC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTIVA;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTIVA, 0, :VRIVA, :PORC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTIVA;
            END
        END /* RTIVA */
      END
    /* RETENCION DE ICA */
    if ((RTICA = 'C') or (RTICA = 'K')) then
      BEGIN
      execute procedure redondee(VRRTICA, DIG) returning_values (VRRTICA);
      if (VRRTICA <> 0) then
        BEGIN
        if (RTICA = 'C') then
            CTARTICA = TCTARTICA;
        EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTARTICA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTICA, 0, :VRSUBT, :PRTICA, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTICA;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTICA, 0, :VRSUBT, :PRTICA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTICA;
            END
        END /* RTICA */
      END
    /* CIERRE EL COMPROBANTE CONTRA LA CUENTA DEL TERCERO O LA CONSTANTE */
    if ((SUMA <> 0) and ((CARTERA = 'C') or (CARTERA = 'K') or (CARTERA = 'J'))) then
        BEGIN
        if (icoing = 'SI') then
            /* DESCUENTE EL IMPOCONSUMO QUE HACE PARTE DEL COSTO */
            SUMA = SUMA + IMPTOS;
        if (SUMA < 0) then
            BEGIN
            DEBITO = SUMA * -1;
            CREDITO = 0;
            END
        ELSE
            BEGIN
            DEBITO = 0;
            CREDITO = SUMA;
            END
        if (CARTERA = 'C') then
            CTACARTERA = TCTACLIEN;
        if (CARTERA = 'J') then
            BEGIN
            /* BUSQUE LA CUENTA DE LA CAJA */
            SELECT CAJA_CUENTA FROM CAJAS C, PUNTO_VENTA P
                WHERE P.CAJA_ID = C.CAJA_ID AND PTVT_ID = :PTOVTA
                INTO :CTACARTERA;
            END
        EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTACARTERA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :DEBITO, :CREDITO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
        if (TIPOCUEN = 'N') then
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :DEBITO, :CREDITO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
        NROI = NROI + 1;
        END /* SUMA EN CARTERA */
    /* CALCULE COSTOS EN VENTAS */
    EXECUTE PROCEDURE COSTO_EN_VENTAS(31, :IDDOC);
    if (COSTOS = 'A') then
        BEGIN
        FOR SELECT MAX(CTACOS), SUM(CAST(CANT AS DOUBLE PRECISION) * COSTO), SUM(FADE_CONSUMO)
            FROM COSTO_VENTAS CV, FACTURAS_DETALLE D WHERE CV.arti_cod = D.arti_cod AND D.fact_id = :iddoc
            GROUP BY CTACOS
            INTO :CTACOSTOS, :MONTO, :vrconsumo
            DO
            BEGIN
            if (icoing = 'SI') then
                MONTO = MONTO + VRCONSUMO;
            if (MONTO <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTACOSTOS, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT ARTI_COD, CANT * COSTO
                        FROM COSTO_VENTAS WHERE TIDO_COD = 31 AND COVE_ID = :iddoc AND CTACOS = :CUENTA
                        INTO :ART, :MONTO
                    DO
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    NROI = NROI + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    END
                END /* MONTO <> 0 */
            END /* FOR */
        END /* COSTOS */
    if (COSTOS = 'K') then
        BEGIN
        SELECT SUM(CAST(CANT AS DOUBLE PRECISION) * COSTO)
            FROM COSTO_VENTAS WHERE TIDO_COD = 31 AND COVE_ID = :iddoc
            INTO :MONTO;
        if (icoing = 'SI') then
            MONTO = MONTO + imptos;
        if (MONTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTACOSTOS, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, REGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT ARTI_COD, CANT * COSTO
                    FROM COSTO_VENTAS WHERE TIDO_COD = 31 AND COVE_ID = :iddoc
                    INTO :ART, :MONTO
                DO
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTACOSTOS, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                    NROI = NROI + 1;
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTACOSTOS, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTACOSTOS, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                END
            END /* MONTO <> 0 */
        END /* COSTOS = K */
    if (INVEN = 'A') then
        BEGIN
        FOR SELECT MAX(CTAINV), SUM(CAST(CANT AS DOUBLE PRECISION) * COSTO)
            FROM COSTO_VENTAS WHERE TIDO_COD = 31 AND COVE_ID = :iddoc
            GROUP BY CTAINV
            INTO :CTAINVEN, :MONTO
        DO
            BEGIN
            if (MONTO <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTAINVEN, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, REGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT ARTI_COD, CANT * COSTO
                        FROM COSTO_VENTAS WHERE TIDO_COD = 31 AND COVE_ID = :iddoc AND CTAINV = :CUENTA
                        INTO :ART, :MONTO
                    DO
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    NROI = NROI + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    END
                END /* MONTO <> 0 */
            END /* FOR */
        END /* INVEN = A */
    if (INVEN = 'K') then
        BEGIN
        SELECT SUM(CAST(CANT AS DOUBLE PRECISION) * COSTO)
            FROM COSTO_VENTAS WHERE TIDO_COD = 31 AND COVE_ID = :iddoc
            INTO :MONTO;
        if (MONTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTAINVEN, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT ARTI_COD, CANT * COSTO
                    FROM COSTO_VENTAS WHERE TIDO_COD = 31 AND COVE_ID = :iddoc
                    INTO :ART, :MONTO
                DO
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTAINVEN, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                    NROI = NROI + 1;
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAINVEN, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAINVEN, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                END
            END /* MONTO <> 0 */
        END /* INVEN = K */
    /* recorra las cuentas adicionales */
    FOR SELECT INVC_CUENTA, INVC_BASE, INVC_PORC, INVC_VALOR, INVC_DB
        FROM INTERFAZ_VENTAS_CTAS
        WHERE INVE_ID = :IDINTER
        INTO :CTADIC, :BASEADIC, :PORCADIC, :VALORADIC, :DBADIC
        DO
        BEGIN
        if (VALORADIC <> 0) then
            MONTO = VALORADIC;
        ELSE
            BEGIN
            if (:BASEADIC = 'SUBTOTAL') then
                VALORADIC = vrsubt;
            if (:BASEADIC = 'DESCUENTO') then
                VALORADIC = VRDTO;
            if (:BASEADIC = 'IVA') then
                VALORADIC = VRIVA;
            if (:BASEADIC = 'ADICIONAL') then
                VALORADIC = VRADIC;
            if (:BASEADIC = 'EXTRA') then
                VALORADIC = VREXTRA;
            if (:BASEADIC = 'TOTAL') then
                VALORADIC = VRTOTAL;
            MONTO = VALORADIC * PORCADIC / 100;
            END
        if (MONTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTADIC, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                if (DBADIC = 'S') then
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                ELSE
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                if (DBADIC = 'S') then
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                ELSE
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                END
            NROI = NROI + 1;
            END
        END
    if (ERROR > 0) then
        VER = 'S';
    SUSPEND;
    END /* NO ANULADO */
  END /* EXISTE LA INTERFAZ */
ELSE
    BEGIN
    EXECUTE PROCEDURE ERROR (31, :IDDOC, :PREF, 1);
    ERROR = ERROR + 1;
    VER = 'S';
    SUSPEND;
    END
END
^

SET TERM ; ^

SET TERM ^ ;

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

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE FACTURAS_SIN_CONTABILIDAD(
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    ID INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    ESTADO VARCHAR(20),
    IDI INTEGER,
    IDC INTEGER)
AS
DECLARE VARIABLE VER CHAR(2);
declare variable FECICNT VARCHAR(10);
declare variable FECFCNT VARCHAR(10);
declare variable ERROR INTEGER;
declare variable idref INTEGER;
BEGIN
EXECUTE PROCEDURE fecha_a_conta(FECINI) returning_values (FECICNT);
EXECUTE PROCEDURE fecha_a_conta(FECFIN) returning_values (FECFCNT);
FOR SELECT FACT_ID, PREF_PRE, FACT_NUMERO FROM FACTURAS WHERE FACT_ANULADO = 'N' AND
    FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN INTO :ID, :PREF, :NUMERO
DO
  BEGIN
  idref = null;
  SELECT ENCO_IDREF FROM COMPROBANTE_ENCABEZADO WHERE ENCO_TIPOREF = 31 AND ENCO_FECHA >= :FECICNT AND ENCO_FECHA <= :FECFCNT and ENCO_IDREF = :ID into :idref;
  if (idref IS NULL) then
  begin
   ESTADO = 'PROCESANDO';
   ERROR = NULL;
   SUSPEND;
   SELECT MAX(INVE_ID) FROM INTERFAZ_VENTAS WHERE PREF_PRE = :PREF AND TIDO_COD = 31 INTO :IDI;
   EXECUTE PROCEDURE CONTABIL_FACTURA (:ID, :IDI) RETURNING_VALUES (:ERROR, VER, :IDC);
   if ((ERROR = 0) or (error IS NULL)) then
    BEGIN
    EXECUTE PROCEDURE CONTABILIZA_PENDIENTE (:IDC);
    ESTADO = 'OK';
    END
   ELSE
    ESTADO = 'ERROR';
   suspend;
  end
  END
END

^

SET TERM ; ^


/* 20100309: IMPOCONSUMO POSITIVO EN DEVOLUCIONES */
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(6),
    FECHA date,
    NIT varchar(20),
    NUMPROV varchar(10),
    NOMTERCERO varchar(60),
    SUBTOTAL numeric(18,2),
    DTOMONTO numeric(18,2),
    ADICIONAL numeric(18,2),
    IVAMONTO numeric(18,2),
    CONSUMO numeric(18,2),
    EXENTOS numeric(18,2),
    IVA1 numeric(18,2),
    IVA2 numeric(18,2),
    IVA3 numeric(18,2),
    GRAVADOS1 numeric(18,2),
    GRAVADOS2 numeric(18,2),
    GRAVADOS3 numeric(18,2),
    EXTRA numeric(18,2),
    TOTAL numeric(18,2),
    RTFTEMONTO numeric(18,2),
    RTIVAMONTO numeric(18,2),
    RTICAMONTO 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);
BEGIN
/* FACTURA */
TIPO = 21;
SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 21 INTO :NOMTIPO;

FOR SELECT FACO_ID, PREF_PRE, FACO_NUMERO, FACO_FECHA, TERC_NIT, FACO_ADICIONAL-FACO_DTOMONTO, FACO_IVAMONTO, FACO_RTFTEMONTO, FACO_RTIVAMONTO, FACO_RTICAMONTO, FACO_EXTRA, FACO_TOTAL, FACO_ANULADO, FACO_NUMPROV
    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, :EXTRA, :TOTAL, :ANULADO, :numprov
    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
        if ((ANULADOS = 'S') or (ANULADO = 'N')) then
            BEGIN
            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;
              END
            ELSE
              BEGIN
              SELECT SUM(FCDE_TOTAL - FCDE_IVAMONTO - FCDE_CONSUMO) FROM FACTURAS_COMPRAS_DETALLE D WHERE FACO_ID = :ID AND FCDE_IVAPORC = 0 INTO :EXENTOS;
              SELECT SUM(FCDE_TOTAL - FCDE_IVAMONTO - FCDE_CONSUMO), SUM(FCDE_IVAMONTO) FROM FACTURAS_COMPRAS_DETALLE D, TARIFA_IVA T WHERE FACO_ID = :ID AND FCDE_IVAPORC = TAIV_PORC AND TAIV_COD = 1 INTO :GRAVADOS1, :IVA1;
              SELECT SUM(FCDE_TOTAL - FCDE_IVAMONTO - FCDE_CONSUMO), SUM(FCDE_IVAMONTO) FROM FACTURAS_COMPRAS_DETALLE D, TARIFA_IVA T WHERE FACO_ID = :ID AND FCDE_IVAPORC = TAIV_PORC AND TAIV_COD = 2 INTO :GRAVADOS2, :IVA2;
              SELECT SUM(FCDE_TOTAL - FCDE_IVAMONTO - FCDE_CONSUMO), SUM(FCDE_IVAMONTO) FROM FACTURAS_COMPRAS_DETALLE D, TARIFA_IVA T WHERE FACO_ID = :ID AND FCDE_IVAPORC = TAIV_PORC AND TAIV_COD = 3 INTO :GRAVADOS3, :IVA3;

              SELECT SUM(FCDE_CONSUMO) FROM FACTURAS_COMPRAS_DETALLE WHERE FACO_ID = :ID INTO :CONSUMO;
              SUBTOTAL = TOTAL - EXTRA - IVAMONTO - DTOMONTO;
              NETO = TOTAL - RTFTEMONTO - RTIVAMONTO - RTICAMONTO;
              END
            if (exentos is null) then
                exentos = 0;
            if (gravados1 is null) then
                gravados1 = 0;
            if (gravados2 is null) then
                gravados2 = 0;
            if (gravados3 is null) then
                gravados3 = 0;
            if (iva1 is null) then
                iva1 = 0;
            if (iva2 is null) then
                iva2 = 0;
            if (iva3 is null) then
                iva3 = 0;
            if (consumo is null) then
                consumo = 0;
            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, TERC_NIT, DVCO_ADICIONAL-DVCO_DTOMONTO, DVCO_IVAMONTO, DVCO_RTFTEMONTO, DVCO_RTIVAMONTO, DVCO_RTICAMONTO, DVCO_EXTRA, DVCO_TOTAL, DVCO_ANULADO, ''
    FROM DEVOLUCIONES_COMPRAS
    WHERE DVCO_FECHA >= :FECINI AND DVCO_FECHA <= :FECFIN ORDER BY DVCO_FECHA, PREF_PRE, DVCO_NUMERO
    INTO :ID, :PREF, :NUMERO, :FECHA, :NIT, :DTOMONTO, :IVAMONTO, :RTFTEMONTO, :RTIVAMONTO, :RTICAMONTO, :EXTRA, :TOTAL, :ANULADO, :numprov
    DO
    BEGIN
    if ((PREFIJO = '') or (PREFIJO IS NULL) or (PREF = PREFIJO)) then
        if ((ANULADOS = 'S') or (ANULADO = 'N')) then
            BEGIN
            SELECT TERC_NOM, TERC_EXENTO FROM TERCEROS WHERE TERC_NIT = :NIT INTO :NOMTERCERO, :TER_EXENTO;
            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;
             END
            ELSE
             BEGIN
              DTOMONTO = DTOMONTO * -1;
              ADICIONAL = ADICIONAL * -1;
              IVAMONTO = IVAMONTO * -1;
              EXTRA = EXTRA * -1;
              TOTAL = TOTAL * -1;
              RTFTEMONTO = RTFTEMONTO * -1;
              RTIVAMONTO = RTIVAMONTO * -1;
              RTICAMONTO = RTICAMONTO * -1;
              /* CALCULE LAS DIFERENTES TARIFAS */
               SELECT SUM(DVCD_TOTAL - DVCD_IVAMONTO - DVCD_CONSUMO) FROM DEVOLUCIONES_COMPRAS_DET D WHERE DVCO_ID = :ID AND DVCD_IVAPORC = 0 INTO :EXENTOS;
               SELECT SUM(DVCD_TOTAL - DVCD_IVAMONTO - DVCD_CONSUMO), SUM(DVCD_IVAMONTO) FROM DEVOLUCIONES_COMPRAS_DET D, TARIFA_IVA T WHERE DVCO_ID = :ID AND DVCD_IVAPORC = TAIV_PORC AND TAIV_COD = 1 INTO :GRAVADOS1, :IVA1;
               SELECT SUM(DVCD_TOTAL - DVCD_IVAMONTO - DVCD_CONSUMO), SUM(DVCD_IVAMONTO) FROM DEVOLUCIONES_COMPRAS_DET D, TARIFA_IVA T WHERE DVCO_ID = :ID AND DVCD_IVAPORC = TAIV_PORC AND TAIV_COD = 2 INTO :GRAVADOS2, :IVA2;
               SELECT SUM(DVCD_TOTAL - DVCD_IVAMONTO - DVCD_CONSUMO), SUM(DVCD_IVAMONTO) FROM DEVOLUCIONES_COMPRAS_DET D, TARIFA_IVA T WHERE DVCO_ID = :ID AND DVCD_IVAPORC = TAIV_PORC AND TAIV_COD = 3 INTO :GRAVADOS3, :IVA3;

              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;
              SUBTOTAL = TOTAL - EXTRA - IVAMONTO - DTOMONTO;
              NETO = TOTAL - RTFTEMONTO - RTIVAMONTO - RTICAMONTO;
             END
            if (iva1 is null) then
                iva1 = 0;
            if (iva2 is null) then
                iva2 = 0;
            if (iva3 is null) then
                iva3 = 0;
            if (consumo is null) then
                consumo = 0;
            SUSPEND;
            END
    END

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, 0, NCPR_MONTO + NCPR_IVAMONTO, NCPR_ANULADO, '', NCPR_BASE0, NCPR_BASE1, NCPR_BASE2, NCPR_IVA1, NCPR_IVA2
       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, :EXTRA, :TOTAL, :ANULADO, :numprov, :exentos, :gravados1, :gravados2, :iva1, :iva2
       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
          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;
           END
          ELSE
           BEGIN
            if (GRAVADOS1 is NULL) then
              GRAVADOS1 = 0;
            ELSE
              GRAVADOS1 = GRAVADOS1 * -1;
            if (GRAVADOS2 is NULL) then
              GRAVADOS2 = 0;
            ELSE
              GRAVADOS2 = GRAVADOS2 * -1;
            if (iva1 is NULL) then
              iva1 = 0;
            ELSE
              iva1 = iva1 * -1;
            if (iva2 is NULL) then
              iva2 = 0;
            ELSE
              iva2 = iva2 * -1;
            GRAVADOS3 = 0;
            IVA3 = 0;
            DTOMONTO = DTOMONTO * -1;
            ADICIONAL = ADICIONAL * -1;
            IVAMONTO = IVAMONTO * -1;
            EXTRA = EXTRA * -1;
            TOTAL = TOTAL * -1;
            RTFTEMONTO = RTFTEMONTO * -1;
            RTIVAMONTO = RTIVAMONTO * -1;
            RTICAMONTO = RTICAMONTO * -1;
            CONSUMO = 0;
            SUBTOTAL = TOTAL - EXTRA - IVAMONTO - DTOMONTO;
            NETO = TOTAL - RTFTEMONTO - RTIVAMONTO - RTICAMONTO;
           END
         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, 0, NDPR_MONTO + NDPR_IVAMONTO, NDPR_ANULADO, NDPR_NUMPROV, NDPR_BASE0, NDPR_BASE1, NDPR_BASE2, NDPR_IVA1, NDPR_IVA2 
       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, :EXTRA, :TOTAL, :ANULADO, :numprov, :exentos, :gravados1, :gravados2, :iva1, :iva2
       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
          GRAVADOS3 = 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;
           END
          ELSE
           BEGIN
            GRAVADOS3 = 0;
            IVA3 = 0;
            SUBTOTAL = TOTAL - EXTRA - IVAMONTO - DTOMONTO;
            NETO = TOTAL - RTFTEMONTO - RTIVAMONTO - RTICAMONTO;
           END
         suspend;
         END
       END
    END
END
^

SET TERM ; ^


update revision set revi_FECHA = '2010/03/09';
COMMIT WORK;

/* 20100309: IMPOCONSUMO POSITIVO EN DEVOLUCIONES */
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(6),
    FECHA date,
    NIT varchar(20),
    NUMPROV varchar(10),
    NOMTERCERO varchar(60),
    SUBTOTAL numeric(18,2),
    DTOMONTO numeric(18,2),
    ADICIONAL numeric(18,2),
    IVAMONTO numeric(18,2),
    CONSUMO numeric(18,2),
    EXENTOS numeric(18,2),
    IVA1 numeric(18,2),
    IVA2 numeric(18,2),
    IVA3 numeric(18,2),
    GRAVADOS1 numeric(18,2),
    GRAVADOS2 numeric(18,2),
    GRAVADOS3 numeric(18,2),
    EXTRA numeric(18,2),
    TOTAL numeric(18,2),
    RTFTEMONTO numeric(18,2),
    RTIVAMONTO numeric(18,2),
    RTICAMONTO 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);
BEGIN
/* FACTURA */
TIPO = 21;
SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 21 INTO :NOMTIPO;

FOR SELECT FACO_ID, PREF_PRE, FACO_NUMERO, FACO_FECHA, TERC_NIT, FACO_ADICIONAL-FACO_DTOMONTO, FACO_IVAMONTO, FACO_RTFTEMONTO, FACO_RTIVAMONTO, FACO_RTICAMONTO, FACO_EXTRA, FACO_TOTAL, FACO_ANULADO, FACO_NUMPROV
    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, :EXTRA, :TOTAL, :ANULADO, :numprov
    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
        if ((ANULADOS = 'S') or (ANULADO = 'N')) then
            BEGIN
            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;
              END
            ELSE
              BEGIN
              SELECT SUM(FCDE_TOTAL - FCDE_IVAMONTO - FCDE_CONSUMO) FROM FACTURAS_COMPRAS_DETALLE D WHERE FACO_ID = :ID AND FCDE_IVAPORC = 0 INTO :EXENTOS;
              SELECT SUM(FCDE_TOTAL - FCDE_IVAMONTO - FCDE_CONSUMO), SUM(FCDE_IVAMONTO) FROM FACTURAS_COMPRAS_DETALLE D, TARIFA_IVA T WHERE FACO_ID = :ID AND FCDE_IVAPORC = TAIV_PORC AND TAIV_COD = 1 INTO :GRAVADOS1, :IVA1;
              SELECT SUM(FCDE_TOTAL - FCDE_IVAMONTO - FCDE_CONSUMO), SUM(FCDE_IVAMONTO) FROM FACTURAS_COMPRAS_DETALLE D, TARIFA_IVA T WHERE FACO_ID = :ID AND FCDE_IVAPORC = TAIV_PORC AND TAIV_COD = 2 INTO :GRAVADOS2, :IVA2;
              SELECT SUM(FCDE_TOTAL - FCDE_IVAMONTO - FCDE_CONSUMO), SUM(FCDE_IVAMONTO) FROM FACTURAS_COMPRAS_DETALLE D, TARIFA_IVA T WHERE FACO_ID = :ID AND FCDE_IVAPORC = TAIV_PORC AND TAIV_COD = 3 INTO :GRAVADOS3, :IVA3;

              SELECT SUM(FCDE_CONSUMO) FROM FACTURAS_COMPRAS_DETALLE WHERE FACO_ID = :ID INTO :CONSUMO;
              SUBTOTAL = TOTAL - EXTRA - IVAMONTO - DTOMONTO;
              NETO = TOTAL - RTFTEMONTO - RTIVAMONTO - RTICAMONTO;
              END
            if (exentos is null) then
                exentos = 0;
            if (gravados1 is null) then
                gravados1 = 0;
            if (gravados2 is null) then
                gravados2 = 0;
            if (gravados3 is null) then
                gravados3 = 0;
            if (iva1 is null) then
                iva1 = 0;
            if (iva2 is null) then
                iva2 = 0;
            if (iva3 is null) then
                iva3 = 0;
            if (consumo is null) then
                consumo = 0;
            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, TERC_NIT, DVCO_ADICIONAL-DVCO_DTOMONTO, DVCO_IVAMONTO, DVCO_RTFTEMONTO, DVCO_RTIVAMONTO, DVCO_RTICAMONTO, DVCO_EXTRA, DVCO_TOTAL, DVCO_ANULADO, ''
    FROM DEVOLUCIONES_COMPRAS
    WHERE DVCO_FECHA >= :FECINI AND DVCO_FECHA <= :FECFIN ORDER BY DVCO_FECHA, PREF_PRE, DVCO_NUMERO
    INTO :ID, :PREF, :NUMERO, :FECHA, :NIT, :DTOMONTO, :IVAMONTO, :RTFTEMONTO, :RTIVAMONTO, :RTICAMONTO, :EXTRA, :TOTAL, :ANULADO, :numprov
    DO
    BEGIN
    if ((PREFIJO = '') or (PREFIJO IS NULL) or (PREF = PREFIJO)) then
        if ((ANULADOS = 'S') or (ANULADO = 'N')) then
            BEGIN
            SELECT TERC_NOM, TERC_EXENTO FROM TERCEROS WHERE TERC_NIT = :NIT INTO :NOMTERCERO, :TER_EXENTO;
            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;
             END
            ELSE
             BEGIN
              DTOMONTO = DTOMONTO * -1;
              ADICIONAL = ADICIONAL * -1;
              IVAMONTO = IVAMONTO * -1;
              EXTRA = EXTRA * -1;
              TOTAL = TOTAL * -1;
              RTFTEMONTO = RTFTEMONTO * -1;
              RTIVAMONTO = RTIVAMONTO * -1;
              RTICAMONTO = RTICAMONTO * -1;
              /* CALCULE LAS DIFERENTES TARIFAS */
               SELECT SUM(DVCD_TOTAL - DVCD_IVAMONTO - DVCD_CONSUMO) FROM DEVOLUCIONES_COMPRAS_DET D WHERE DVCO_ID = :ID AND DVCD_IVAPORC = 0 INTO :EXENTOS;
               SELECT SUM(DVCD_TOTAL - DVCD_IVAMONTO - DVCD_CONSUMO), SUM(DVCD_IVAMONTO) FROM DEVOLUCIONES_COMPRAS_DET D, TARIFA_IVA T WHERE DVCO_ID = :ID AND DVCD_IVAPORC = TAIV_PORC AND TAIV_COD = 1 INTO :GRAVADOS1, :IVA1;
               SELECT SUM(DVCD_TOTAL - DVCD_IVAMONTO - DVCD_CONSUMO), SUM(DVCD_IVAMONTO) FROM DEVOLUCIONES_COMPRAS_DET D, TARIFA_IVA T WHERE DVCO_ID = :ID AND DVCD_IVAPORC = TAIV_PORC AND TAIV_COD = 2 INTO :GRAVADOS2, :IVA2;
               SELECT SUM(DVCD_TOTAL - DVCD_IVAMONTO - DVCD_CONSUMO), SUM(DVCD_IVAMONTO) FROM DEVOLUCIONES_COMPRAS_DET D, TARIFA_IVA T WHERE DVCO_ID = :ID AND DVCD_IVAPORC = TAIV_PORC AND TAIV_COD = 3 INTO :GRAVADOS3, :IVA3;

              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;
              SUBTOTAL = TOTAL - EXTRA - IVAMONTO - DTOMONTO;
              NETO = TOTAL - RTFTEMONTO - RTIVAMONTO - RTICAMONTO;
             END
            if (iva1 is null) then
                iva1 = 0;
            if (iva2 is null) then
                iva2 = 0;
            if (iva3 is null) then
                iva3 = 0;
            if (consumo is null) then
                consumo = 0;
            SUSPEND;
            END
    END

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, 0, NCPR_MONTO + NCPR_IVAMONTO, NCPR_ANULADO, '', NCPR_BASE0, NCPR_BASE1, NCPR_BASE2, NCPR_IVA1, NCPR_IVA2
       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, :EXTRA, :TOTAL, :ANULADO, :numprov, :exentos, :gravados1, :gravados2, :iva1, :iva2
       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
          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;
           END
          ELSE
           BEGIN
            if (GRAVADOS1 is NULL) then
              GRAVADOS1 = 0;
            ELSE
              GRAVADOS1 = GRAVADOS1 * -1;
            if (GRAVADOS2 is NULL) then
              GRAVADOS2 = 0;
            ELSE
              GRAVADOS2 = GRAVADOS2 * -1;
            if (iva1 is NULL) then
              iva1 = 0;
            ELSE
              iva1 = iva1 * -1;
            if (iva2 is NULL) then
              iva2 = 0;
            ELSE
              iva2 = iva2 * -1;
            GRAVADOS3 = 0;
            IVA3 = 0;
            DTOMONTO = DTOMONTO * -1;
            ADICIONAL = ADICIONAL * -1;
            IVAMONTO = IVAMONTO * -1;
            EXTRA = EXTRA * -1;
            TOTAL = TOTAL * -1;
            RTFTEMONTO = RTFTEMONTO * -1;
            RTIVAMONTO = RTIVAMONTO * -1;
            RTICAMONTO = RTICAMONTO * -1;
            CONSUMO = 0;
            SUBTOTAL = TOTAL - EXTRA - IVAMONTO - DTOMONTO;
            NETO = TOTAL - RTFTEMONTO - RTIVAMONTO - RTICAMONTO;
           END
         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, 0, NDPR_MONTO + NDPR_IVAMONTO, NDPR_ANULADO, NDPR_NUMPROV, NDPR_BASE0, NDPR_BASE1, NDPR_BASE2, NDPR_IVA1, NDPR_IVA2 
       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, :EXTRA, :TOTAL, :ANULADO, :numprov, :exentos, :gravados1, :gravados2, :iva1, :iva2
       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
          GRAVADOS3 = 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;
           END
          ELSE
           BEGIN
            GRAVADOS3 = 0;
            IVA3 = 0;
            SUBTOTAL = TOTAL - EXTRA - IVAMONTO - DTOMONTO;
            NETO = TOTAL - RTFTEMONTO - RTIVAMONTO - RTICAMONTO;
           END
         suspend;
         END
       END
    END
END
^

SET TERM ; ^

/* 20100310C */
/* confirmación de cartera en devoluciones */

UPDATE CONFIGURACION
SET CONF_POSIBLES = 'SI,NO,PEDIDO',
    CONF_AYUDA = 'SI: Permite hacer devoluciones de mercancía remisionada sin afectar la cartera y controlando la cantidad neta por facturar. PEDIDO: Permite hacer la devolución sobre un pedido facturado o no.'
WHERE (CONF_MODULO = 'FACTURACION') AND (CONF_CATEGORIA = 'DEVOLUCIONES') AND (CONF_PROPIEDAD = 'HACER DEVOLUCIONES SOBRE REMISIONES');

INSERT INTO CONFIGURACION (CONF_MODULO, CONF_CATEGORIA, CONF_PROPIEDAD, CONF_VALOR, CONF_POSIBLES, CONF_AYUDA) VALUES ('FACTURACION', 'DEVOLUCIONES', 'AFECTAR CARTERA CON LA DEVOLUCION', 'SI', 'SI,NO,PREGUNTAR', 'SI: Siempre registra el crédito ne cartera, NO: Hay que hacer manualmente la nota crédito de cartera. PREGUNTAR: Deja pendiente la nota de cartera hasta que se confirme');
commit work;

ALTER TABLE DEVOLUCIONES_VENTAS
ADD DEVT_CONFIRMACXC T_BOOLEANO;

ALTER TRIGGER DEVOLUCIONES_VENTAS_AU INACTIVE;
update devoluciones_ventas set DEVT_CONFIRMACXC = 'S';
COMMIT WORK;
ALTER TRIGGER DEVOLUCIONES_VENTAS_AU ACTIVE;

ALTER TABLE DEVOLUCIONES_VENTAS
ADD DEVT_PEDIDO VARCHAR(10);
ALTER TABLE DEVOLUCIONES_VENTAS
ADD DEVT_PEDID T_ID;

SET TERM ^ ;

CREATE OR ALTER TRIGGER DEVOLUCIONES_VENTAS_AI FOR DEVOLUCIONES_VENTAS
ACTIVE AFTER INSERT POSITION 0
AS
declare variable CONC VARCHAR(60);
declare variable crmeven char(2);
BEGIN
if ((NEW.DEVT_ID <> 0) and (new.devt_anulado = 'N')) then
    BEGIN
    if ((new.devt_remid IS NULL) or (new.devt_remid = 0) or (new.devt_pedid IS NULL) or (new.devt_pedid = 0)) then
      if (new.devt_confirmacxc = 'S') then
        begin
        /* Registre el nuevo saldo del documento */
        INSERT INTO SALDOS_DOC_CARTERA (SDCA_TIPOREF, SDCA_IDREF, SDCA_FECHA, TERC_NIT, SDCA_RTFTE, SDCA_RTIVA, SDCA_RTICA, SDCA_ABONO, SDCA_ABRTFTE, SDCA_ABRTIVA, SDCA_ABRTICA, SDCA_DEBITO, SDCA_MONTO, SDCA_TRM)
            VALUES (33, NEW.DEVT_ID, NEW.DEVT_fecha, NEW.terc_nit, (NEW.DEVT_rtftemonto*-1), (NEW.DEVT_rtivamonto*-1), (NEW.DEVT_rticamonto*-1), 0, 0, 0, 0, 'N', (NEW.DEVT_TOTAL*-1), new.devt_trm);
        /* Registre el movimiento del cliente */
        CONC = 'DEVOLUCION VENTA No.' || NEW.PREF_PRE || NEW.DEVT_NUMERO || ' EN FACTURA ' || NEW.devt_factura;
        INSERT INTO MOVIMIENTO_CLIENTES (MVCL_ID, TERC_NIT, MVCL_TIPOREF, MVCL_IDREF, MVCL_FECHA, MVCL_VENCE, MVCL_CONC, MVCL_MONTO, MVCL_RTEFTE, MVCL_RTEIVA, MVCL_RTEICA, MVCL_DEBITO, MVCL_ABONO, MVCL_PREFREF, MVCL_NUMREF, MVCL_SUCURSAL, COBR_COD, MVCL_TRM)
          VALUES (GEN_ID(ID_MOVCLI, 1), NEW.TERC_NIT, 33, NEW.DEVT_ID, NEW.DEVT_FECHA, NEW.DEVT_FECHA, :CONC, NEW.DEVT_TOTAL, NEW.DEVT_RTFTEMONTO, NEW.DEVT_RTIVAMONTO, NEW.DEVT_RTICAMONTO, 'N', 'N', NEW.pref_pre, NEW.DEVT_numero, NEW.devt_sucursal, NEW.cobr_cod, new.devt_trm);
        end
    /* ACTUALICE LA CONSOLIDACION */
    if (NEW.DEVT_CONSOLIDA <> 0) then
        UPDATE consolidado_faltantes SET COFA_IDDES = NEW.devt_id, COFA_OK = 'S' WHERE COFA_ID = NEW.devt_consolida;
    execute procedure lee_configuracion ('CRM', 'EVENTOS', 'GRABAR EVENTOS AUTOMATICAMENTE DESDE DOCUMENTOS DE VENTAS') returning_values (:crmeven);
    if (crmeven = 'SI') then
        begin
        if (new.devt_confirmacxc = 'S') then
            insert into crm_eventos (CREV_TIPO, CREV_ORIGEN, CREV_FECHA, CREV_HORA, CREV_MOTIVO, CREV_ASESOR, CREV_VALOR, CREV_EXPLICA, CREV_OBS, CREV_ACTIVIDAD, CRCL_NIT, CREV_ANULADO)
                VALUES (905, new.devt_id, new.devt_fecha, cast('now' as time), 6, new.vend_cod, new.devt_total, 'Devolución No. ' || new.pref_pre || new.devt_numero, new.devt_obs, 0, new.terc_nit, new.devt_anulado);
        else
            insert into crm_eventos (CREV_TIPO, CREV_ORIGEN, CREV_FECHA, CREV_HORA, CREV_MOTIVO, CREV_ASESOR, CREV_VALOR, CREV_EXPLICA, CREV_OBS, CREV_ACTIVIDAD, CRCL_NIT, CREV_ANULADO)
                VALUES (905, new.devt_id, new.devt_fecha, cast('now' as time), 6, new.vend_cod, new.devt_total, 'Devolución No. ' || new.pref_pre || new.devt_numero || ' sin confirmar cartera.', new.devt_obs, 0, new.terc_nit, new.devt_anulado);
        end
    if (new.devt_factid <> 0) then
        if (new.devt_confirmacxc = 'S') then
            INSERT INTO notas_documento (NODO_ID, TIDO_COD, NODO_IDDOC, NODO_FECHA, NODO_USER, NODO_RESUMEN, NODO_TIPO)
                VALUES (GEN_ID(id_notadoc, 1), 31, new.devt_factid, NEW.devt_fecha, user, 'Devolución No. ' || new.pref_pre || new.devt_numero, 7);
        else
            INSERT INTO notas_documento (NODO_ID, TIDO_COD, NODO_IDDOC, NODO_FECHA, NODO_USER, NODO_RESUMEN, NODO_TIPO)
                VALUES (GEN_ID(id_notadoc, 1), 31, new.devt_factid, NEW.devt_fecha, user, 'Devolución No. ' || new.pref_pre || new.devt_numero || ' sin confirmar cartera', 7);
        
    INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
        VALUES (USER, 33, NEW.devt_id, 'I', NEW.pref_pre || NEW.devt_numero);
    END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER DEVOLUCIONES_VENTAS_AU FOR DEVOLUCIONES_VENTAS
ACTIVE AFTER UPDATE POSITION 0
AS
declare variable ABONOS integer;
declare variable CONC VARCHAR(60);
declare variable consec INTEGER;
declare variable crmeven char(2);
BEGIN
if (new.devt_anulado = 'S') then
    begin
    select enco_consec from comprobante_encabezado where enco_tiporef = 33 and enco_idref = old.devt_id into :consec;
    if (NOT consec is null) then
      delete from comprobante_detalle where enco_consec = :consec;
    delete from comprobante_encabezado where enco_tiporef = 33 and enco_idref = old.devt_id;
    delete from crm_eventos where crev_tipo = 905 and crev_origen = old.devt_id;

    DELETE FROM puntos_cliente WHERE PTCL_TIPODOC = 33 AND PTCL_IDDOC = OLD.devt_id;

    INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
        VALUES (USER, 33, NEW.devt_id, 'A', NEW.pref_pre || NEW.devt_numero);
    end
if ((old.DEVT_id <> 0) and (old.devt_anulado = 'N')) then
    begin
    if ((old.devt_remid = 0) or (old.devt_remid is null) or (old.devt_pedid = 0) or (old.devt_pedid is null)) then
        begin
        ABONOS = 0;
        select COUNT(*) FROM SALDOS_DOC_CARTERA WHERE SDCA_TIPOREF = 33 AND SDCA_IDREF = OLD.DEVT_ID AND SDCA_ABONO <> 0 INTO :ABONOS;
        if (ABONOS = 0) then
            BEGIN
            /* BORRE EL REGISTRO PREVIO */
            delete from saldos_doc_cartera where sdca_tiporef = 33 and sdca_idref = old.devt_id;
            delete from movimiento_clientes where (mvcl_tiporef = 33) and (mvcl_idref = old.devt_id);

            /* ACTUALICE LA CONSOLIDACION */
            if (OLD.DEVT_CONSOLIDA <> 0) then
                UPDATE consolidado_faltantes SET COFA_OK = 'N' WHERE COFA_ID = old.devt_consolida;
            END
        else
            exception DOCUMENTO_CON_ABONOS 'La devolución ' || old.pref_pre || old.devt_numero || ' tiene abonos registrados.';
        end
    else
        if (OLD.DEVT_CONSOLIDA <> 0) then
            UPDATE consolidado_faltantes SET COFA_OK = 'N' WHERE COFA_ID = old.devt_consolida;
    END
if ((new.DEVT_id <> 0) and (new.devt_anulado = 'N')) then
    BEGIN
    if ((new.devt_remid IS NULL) or (new.devt_remid = 0) or (new.devt_pedid IS NULL) or (new.devt_pedid = 0)) then
        begin
        if (new.devt_confirmacxc = 'S') then
            begin
            /* Registre el nuevo saldo del documento */
            INSERT INTO SALDOS_DOC_CARTERA (SDCA_TIPOREF, SDCA_IDREF, SDCA_FECHA, TERC_NIT, SDCA_RTFTE, SDCA_RTIVA, SDCA_RTICA, SDCA_ABONO, SDCA_ABRTFTE, SDCA_ABRTIVA, SDCA_ABRTICA, SDCA_DEBITO, SDCA_MONTO, SDCA_TRM)
                VALUES (33, NEW.DEVT_ID, NEW.DEVT_fecha, NEW.terc_nit, (NEW.DEVT_rtftemonto*-1), (NEW.DEVT_rtivamonto*-1), (NEW.DEVT_rticamonto*-1), 0, 0, 0, 0, 'N', (NEW.DEVT_TOTAL*-1), NEW.devt_trm);
            /* Registre el movimiento del cliente */
            CONC = 'DEVOLUCION VENTA No.' || NEW.PREF_PRE || NEW.DEVT_NUMERO || ' EN FACTURA ' || NEW.devt_factura;
            INSERT INTO MOVIMIENTO_CLIENTES (MVCL_ID, TERC_NIT, MVCL_TIPOREF, MVCL_IDREF, MVCL_FECHA, MVCL_VENCE, MVCL_CONC, MVCL_MONTO, MVCL_RTEFTE, MVCL_RTEIVA, MVCL_RTEICA, MVCL_DEBITO, MVCL_ABONO, MVCL_PREFREF, MVCL_NUMREF, MVCL_SUCURSAL, COBR_COD, MVCL_TRM)
                VALUES (GEN_ID(ID_MOVCLI, 1), NEW.TERC_NIT, 33, NEW.DEVT_ID, NEW.DEVT_FECHA, NEW.DEVT_FECHA, :CONC, NEW.DEVT_TOTAL, NEW.DEVT_RTFTEMONTO, NEW.DEVT_RTIVAMONTO, NEW.DEVT_RTICAMONTO, 'N', 'N', NEW.pref_pre, NEW.DEVT_numero, NEW.devt_sucursal, NEW.cobr_cod, NEW.devt_trm);
            end
        /* ACTUALICE LA CONSOLIDACION */
        if (NEW.DEVT_CONSOLIDA <> 0) then
            UPDATE consolidado_faltantes SET COFA_IDDES = NEW.devt_id, COFA_OK = 'S' WHERE COFA_ID = NEW.devt_consolida;
        end
    INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
        VALUES (USER, 33, NEW.devt_id, 'U', NEW.pref_pre || NEW.devt_numero);
    END
/* si cambio un dato critico actualice el detalle */
if ((OLD.devt_fecha <> NEW.devt_fecha) or
    (OLD.devt_numero <> NEW.devt_numero) or
    (OLD.pref_pre <> NEW.pref_pre) or
    (OLD.devt_factid <> NEW.devt_factid)) then
    UPDATE DEVOLUCIONES_VENTAS_DETALLE
        SET DVDE_TRANSMIT = 'N'
        WHERE DEVT_ID = NEW.DEVT_ID;
/* ACTUALICE EL ANULADO EN LOS DETALLES */
if (OLD.DEVT_anulado <> NEW.DEVT_anulado) then
    UPDATE DEVOLUCIONES_VENTAS_DETALLE
        SET DVDE_ANULADO = NEW.DEVT_anulado
        WHERE DEVT_ID = NEW.DEVT_ID;
if (OLD.devt_transmit <> NEW.devt_transmit) then
    UPDATE DEVOLUCIONES_VENTAS_DETALLE
        SET DVDE_TRANSMIT = NEW.devt_transmit
        WHERE DEVT_ID = NEW.DEVT_ID;
END
^

SET TERM ; ^


/* 20100311 */
/* NO INCLUIA SALDOS SIN MOVIMIENTO */

SET TERM ^ ;

CREATE OR ALTER procedure CERTIFICADOS_RETENCION (
    NITINI varchar(20),
    NITFIN varchar(20),
    CTAINI varchar(20),
    CTAFIN varchar(20),
    FECINI varchar(8),
    FECFIN varchar(8),
    FECEXP date,
    ADMON varchar(60),
    NUMERAR char(1),
    INICIAL varchar(6))
returns (
    NIT varchar(20),
    NOMBRE varchar(60),
    DIRECCION varchar(60),
    CIUDAD varchar(40),
    CODCUENTA varchar(20),
    NOMCUENTA varchar(60),
    BASE numeric(18,2),
    RETENCION numeric(18,2),
    FECHAEXP date,
    ADMINISTRACION varchar(60),
    NUMERO varchar(20))
AS
declare variable actual integer;
declare variable ANOINI CHAR(4);
declare variable MESINI CHAR(2);
declare variable FECHAINI CHAR(8);
declare variable SALDORET NUMERIC(18,2);
declare variable SALDOBASE NUMERIC(18,2);
declare variable PORC NUMERIC(9,2);
begin
EXECUTE PROCEDURE LEE_CONFIGURACION ('CONTABILIDAD', 'GENERAL', 'AÑO DE INICIO') RETURNING_VALUES (:ANOINI);
EXECUTE PROCEDURE LEE_CONFIGURACION ('CONTABILIDAD', 'GENERAL', 'MES DE INICIO') RETURNING_VALUES (:MESINI);
execute procedure compone_fecha_conta (:ANOINI, CAST(:MESINI AS INTEGER), 1) returning_values (FECHAINI);
FECHAEXP = FECEXP;
ADMINISTRACION = ADMON;
ACTUAL = CAST(INICIAL AS INTEGER);
FOR SELECT TERC_NIT, TERC_NOM, TERC_DIR, TERC_CIU FROM TERCEROS
  WHERE TERC_NIT >= :NITINI AND TERC_NIT <= :NITFIN ORDER BY TERC_NIT
  INTO :NIT, :NOMBRE, :DIRECCION, :CIUDAD
  DO
    BEGIN
    FOR SELECT CUEN_COD, CUEN_NOM FROM CUENTAS WHERE CUEN_RETENCION = 'S' AND
      CUEN_COD >= :CTAINI AND CUEN_COD <= :CTAFIN
      INTO :CODCUENTA, :NOMCUENTA
      DO
        BEGIN
        if (FECHAINI > FECINI) then
            BEGIN
            /* INCLUYA LOS SALDOS INICIALES EN EL CERTIFICADO */
            SELECT SUM(SAIN_DEBITO-SAIN_CREDITO) FROM SALDOS_INICIALES
                WHERE CUEN_COD = :CODCUENTA AND TERC_NIT = :NIT
                INTO :SALDORET;
            if (SALDORET IS NULL) then
                SALDORET = 0;
            SELECT CUEN_PORC FROM CUENTAS WHERE CUEN_COD = :CODCUENTA INTO :PORC;
            if (PORC <> 0) then
                SALDOBASE = SALDORET * 100 / PORC;
            END
        SELECT SUM(CODE_BASE), SUM(CODE_DEBITO - CODE_CREDITO)
          FROM COMPROBANTE_ENCABEZADO E, COMPROBANTE_DETALLE D
          WHERE E.ENCO_CONSEC = D.ENCO_CONSEC AND CUEN_COD = :CODCUENTA AND D.TERC_NIT = :NIT AND
          ENCO_FECHA >= :FECINI AND ENCO_FECHA <= :FECFIN
          INTO :base,  :RETENCION;
        if (BASE is null) then
            BASE = 0;
        if (RETENCION is null) then
            RETENCION = 0;
        BASE = BASE + SALDOBASE;
        RETENCION = RETENCION + SALDORET;
        if (RETENCION <> 0) then
            begin
            if (substr(CODCUENTA, 1, 1) = '2') then
                BEGIN
                BASE = BASE * -1;
                RETENCION = RETENCION * -1;
                END
            if (numerar = 'S') then
                BEGIN
                NUMERO = CAST(ACTUAL AS CHAR(6));
                EXECUTE PROCEDURE COMPLETA_CEROS(NUMERO) returning_values (NUMERO);
                NUMERO = 'NUMERO: ' || NUMERO;
                ACTUAL = ACTUAL + 1;
                END
            ELSE
                NUMERO = '';
            SUSPEND;
            end
        END
    END
end
^

SET TERM ; ^



/* 20100312 */
/* faltantes consolidado mas rapido y con total y vendedor */

CREATE INDEX PEDIDOS_IDX5
ON PEDIDOS (PEDI_CONSOLIDA);
CREATE INDEX FACTURAS_IDX5
ON FACTURAS (FACT_CONSOLIDA);
CREATE INDEX REMISIONES_VENTA_IDX4
ON REMISIONES_VENTA (REVT_CONSOLIDA);

SET TERM ^ ;

CREATE OR ALTER procedure REP_FALTANTES_VENTA (
    TIPOORI integer,
    FECINI date,
    FECFIN date,
    TIPODES integer,
    CEROS char(1),
    DETALLE char(1),
    SUBEMPRESA integer)
returns (
    PREFIJO varchar(4),
    NUMERO varchar(6),
    FECHA date,
    NIT varchar(20),
    NOMCLIENTE varchar(60),
    VEND integer,
    NOMVEND varchar(60),
    VENCE date,
    ARTICULO varchar(15),
    DESCRIPCION varchar(60),
    CANTIDAD numeric(18,4),
    UNIDAD varchar(8),
    PRECIO numeric(18,2),
    DESCUENTO numeric(9,4),
    FALTANTE numeric(18,4),
    OBS varchar(255),
    NUMCRUCE varchar(10))
AS
declare variable ID INTEGER;
declare variable ITEM INTEGER;
declare variable FACTOR NUMERIC(18,4);
BEGIN
if (detalle = 'S') then
  BEGIN
  if (TIPOORI = 32) then
    FOR SELECT R.REVT_ID, R.PREF_PRE, REVT_NUMERO, REVT_FECHA, REVT_FECHA VENCE, RVDE_ITEM, R.TERC_NIT, REVT_NOMTERC, ARTI_COD, SUBSTR(RVDE_DESC,1,60), RVDE_UNIDAD, RVDE_CANT, RVDE_PRUNIT, RVDE_DTOPORC, SUBSTRING(REVT_OBS FROM 1 FOR 255)
      FROM REMISIONES_VENTA R, REMISIONES_VENTA_DETALLE D, PREFIJOS P
      WHERE R.REVT_ID = D.REVT_ID AND REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN and REVT_ANULADO = 'N'
       AND P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = 32 AND ((P.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
      ORDER BY REVT_FECHA, R.PREF_PRE, REVT_NUMERO, RVDE_ITEM
      INTO :ID, :PREFIJO, :NUMERO, :FECHA, :VENCE, :ITEM, :NIT, :NOMCLIENTE, :ARTICULO, :DESCRIPCION, :UNIDAD, :CANTIDAD, :PRECIO, :DESCUENTO, :OBS
      DO
        BEGIN
        EXECUTE PROCEDURE FALTANTE(:TIPOORI, :TIPODES, :ID,  :ITEM) returning_values (:FALTANTE, :UNIDAD, :FACTOR);
        if ((CEROS = 'N') or (FALTANTE = cantidad)) then
          SUSPEND;
        END
  if (TIPOORI = 34) then
    FOR SELECT P.PEDI_ID, P.PREF_PRE, PEDI_NUMERO, PEDI_FECHA, (PEDI_FECHA + PEDI_VALIDEZ), PEDE_ITEM, P.TERC_NIT, PEDI_NOMTERC, ARTI_COD, SUBSTR(PEDE_DESC,1,60), PEDE_UNIDAD, PEDE_CANT, PEDE_PRUNIT, PEDE_DTOPORC, SUBSTRING(PEDI_OBS FROM 1 FOR 255)
      FROM PEDIDOS P, PEDIDOS_DETALLE D, PREFIJOS PR
      WHERE P.PEDI_ID = D.PEDI_ID AND PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND PEDI_ANULADO = 'N'
       AND PR.PREF_PRE = P.PREF_PRE AND PR.TIDO_COD = 34 AND ((PR.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
      ORDER BY PEDI_FECHA, P.PREF_PRE, PEDI_NUMERO, PEDE_ITEM
      INTO :ID, :PREFIJO, :NUMERO, :FECHA, :VENCE, :ITEM, :NIT, :NOMCLIENTE, :ARTICULO, :DESCRIPCION, :UNIDAD, :CANTIDAD, :PRECIO, :DESCUENTO, :OBS
      DO
        BEGIN
        EXECUTE PROCEDURE FALTANTE(:TIPOORI, :TIPODES, :ID,  :ITEM) returning_values (:FALTANTE, :UNIDAD, :FACTOR);
        if ((CEROS = 'N') or (FALTANTE = cantidad)) then
          SUSPEND;
        END
  if (TIPOORI = 35) then
    FOR SELECT C.COTI_ID, C.PREF_PRE, COTI_NUMERO, COTI_FECHA, (COTI_FECHA + COTI_VALIDEZ), CTDE_ITEM, C.TERC_NIT, COTI_NOMTERC, ARTI_COD, SUBSTR(CTDE_DESC,1,60), CTDE_UNIDAD, CTDE_CANT, CTDE_PRUNIT, CTDE_DTOPORC, SUBSTRING(COTI_OBS FROM 1 FOR 255)
      FROM COTIZACIONES C, COTIZACIONES_DETALLE D, PREFIJOS P
      WHERE C.COTI_ID = D.COTI_ID AND COTI_FECHA >= :FECINI AND COTI_FECHA <= :FECFIN AND COTI_ANULADO = 'N'
       AND P.PREF_PRE = C.PREF_PRE AND P.TIDO_COD = 35 AND ((P.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
      ORDER BY COTI_FECHA, C.PREF_PRE, COTI_NUMERO, CTDE_ITEM
      INTO :ID, :PREFIJO, :NUMERO, :FECHA, :VENCE, :ITEM, :NIT, :NOMCLIENTE, :ARTICULO, :DESCRIPCION, :UNIDAD, :CANTIDAD, :PRECIO, :DESCUENTO, :OBS
      DO
        BEGIN
        EXECUTE PROCEDURE FALTANTE(:TIPOORI, :TIPODES, :ID,  :ITEM) returning_values (:FALTANTE, :UNIDAD, :FACTOR);
        if ((CEROS = 'N') or (FALTANTE = cantidad)) then
          SUSPEND;
        END
  END
ELSE
  BEGIN
  if (TIPOORI = 32) then
    FOR SELECT R.REVT_ID, R.PREF_PRE, REVT_NUMERO, REVT_FECHA, REVT_FECHA VENCE, R.TERC_NIT,
        REVT_NOMTERC, SUBSTRING(REVT_OBS FROM 1 FOR 255), R.VEND_COD, REVT_TOTAL
      FROM REMISIONES_VENTA R, PREFIJOS P
      WHERE REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN and REVT_ANULADO = 'N'
       AND P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = 32 AND ((P.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
      ORDER BY REVT_FECHA, R.PREF_PRE, REVT_NUMERO
      INTO :ID, :PREFIJO, :NUMERO, :FECHA, :VENCE, :NIT, :NOMCLIENTE, :OBS, :VEND, :PRECIO
      DO
        BEGIN
        NUMCRUCE = '';
        SELECT VEND_NOMBRE FROM VENDEDORES WHERE VEND_COD = :VEND INTO :NOMVEND;
        if (TIPODES = 31) then
            SELECT FIRST 1 PREF_PRE || FACT_NUMERO FROM FACTURAS F, consolidado_faltantes C
                WHERE F.fact_consolida = C.cofa_id AND C.cofa_tipoori = 32 AND C.cofa_idori = :ID AND
                C.cofa_tipodes = 31 AND C.cofa_ok = 'S' AND FACT_ANULADO = 'N'
                INTO :numcruce;
        if ((CEROS = 'N') or (NUMCRUCE = '')) then
          SUSPEND;
        END
  if (TIPOORI = 34) then
    FOR SELECT P.PEDI_ID, P.PREF_PRE, PEDI_NUMERO, PEDI_FECHA, (PEDI_FECHA + PEDI_VALIDEZ), P.TERC_NIT,
    PEDI_NOMTERC, SUBSTRING(PEDI_OBS FROM 1 FOR 255), P.VEND_COD, PEDI_TOTAL
      FROM PEDIDOS P, PREFIJOS PR
      WHERE PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND PEDI_ANULADO = 'N'
       AND PR.PREF_PRE = P.PREF_PRE AND PR.TIDO_COD = 34 AND ((PR.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
      ORDER BY PEDI_FECHA, P.PREF_PRE, PEDI_NUMERO
      INTO :ID, :PREFIJO, :NUMERO, :FECHA, :VENCE, :NIT, :NOMCLIENTE, :OBS, :VEND, :PRECIO
      DO
        BEGIN
        NUMCRUCE = '';
        SELECT VEND_NOMBRE FROM VENDEDORES WHERE VEND_COD = :VEND INTO :NOMVEND;
        if (TIPODES = 31) then
            SELECT FIRST 1 PREF_PRE || FACT_NUMERO FROM FACTURAS F, consolidado_faltantes C
                WHERE F.fact_consolida = C.cofa_id AND C.cofa_tipoori = 34 AND C.cofa_idori = :ID AND
                C.cofa_tipodes = 31 AND C.cofa_ok = 'S' AND FACT_ANULADO = 'N'
                INTO :numcruce;
        if (TIPODES = 32) then
            SELECT FIRST 1 PREF_PRE || REVT_NUMERO FROM remisiones_venta F, consolidado_faltantes C
                WHERE F.revt_consolida = C.cofa_id AND C.cofa_tipoori = 34 AND C.cofa_idori = :ID AND
                C.cofa_tipodes = 32 AND C.cofa_ok = 'S' AND REVT_ANULADO = 'N'
                INTO :numcruce;
        if ((CEROS = 'N') or (NUMCRUCE = '')) then
          SUSPEND;
        END
  if (TIPOORI = 35) then
    FOR SELECT C.COTI_ID, C.PREF_PRE, COTI_NUMERO, COTI_FECHA, (COTI_FECHA + COTI_VALIDEZ), C.TERC_NIT,
      COTI_NOMTERC, SUBSTRING(COTI_OBS FROM 1 FOR 255), C.VEND_COD, COTI_TOTAL
      FROM COTIZACIONES C, PREFIJOS P
      WHERE COTI_FECHA >= :FECINI AND COTI_FECHA <= :FECFIN AND COTI_ANULADO = 'N'
       AND P.PREF_PRE = C.PREF_PRE AND P.TIDO_COD = 35 AND ((P.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
      ORDER BY COTI_FECHA, C.PREF_PRE, COTI_NUMERO
      INTO :ID, :PREFIJO, :NUMERO, :FECHA, :VENCE, :NIT, :NOMCLIENTE, :OBS, :VEND, :PRECIO
      DO
        BEGIN
        NUMCRUCE = '';
        SELECT VEND_NOMBRE FROM VENDEDORES WHERE VEND_COD = :VEND INTO :NOMVEND;
        if (TIPODES = 31) then
            SELECT FIRST 1 PREF_PRE || FACT_NUMERO FROM FACTURAS F, consolidado_faltantes C
                WHERE F.fact_consolida = C.cofa_id AND C.cofa_tipoori = 35 AND C.cofa_idori = :ID AND
                C.cofa_tipodes = 31 AND C.cofa_ok = 'S' AND FACT_ANULADO = 'N'
                INTO :numcruce;
        if (TIPODES = 32) then
            SELECT FIRST 1 PREF_PRE || REVT_NUMERO FROM remisiones_venta F, consolidado_faltantes C
                WHERE F.revt_consolida = C.cofa_id AND C.cofa_tipoori = 35 AND C.cofa_idori = :ID AND
                C.cofa_tipodes = 32 AND C.cofa_ok = 'S' AND REVT_ANULADO = 'N'
                INTO :numcruce;
        if (TIPODES = 34) then
            SELECT FIRST 1 PREF_PRE || PEDI_NUMERO FROM PEDIDOS F, consolidado_faltantes C
                WHERE F.pedi_consolida = C.cofa_id AND C.cofa_tipoori = 35 AND C.cofa_idori = :ID AND
                C.cofa_tipodes = 34 AND C.cofa_ok = 'S' AND PEDI_ANULADO = 'N'
                INTO :numcruce;
        if ((CEROS = 'N') or (NUMCRUCE = '')) then
          SUSPEND;
        END
  END
END
^

SET TERM ; ^


/* 20100312c */
/* SI DEVOLUCION SOBRE REMISION, PERMITA SIN FACTURA  */

SET TERM ^ ;

CREATE OR ALTER TRIGGER DEVOLUCIONES_VENTAS_BI FOR DEVOLUCIONES_VENTAS
ACTIVE BEFORE INSERT POSITION 0
AS
declare variable NUMERO VARCHAR(6);
declare variable AUTOM CHAR(1);
declare variable EXISTE CHAR(1);
declare variable SITOT CHAR(2);
declare variable CODCOBR INTEGER;
declare variable CODVEND INTEGER;
declare variable FECSERVER CHAR(2);
declare variable PREGTASA CHAR(2);
BEGIN
if ((NEW.devt_trm IS NULL) or (NEW.devt_trm = 0)) then
    NEW.devt_trm = 1;
EXECUTE PROCEDURE LEE_CONFIGURACION('GENERAL', 'GENERAL', 'PREGUNTAR TASA DE CAMBIO EN DOCUMENTOS DE CARTERA') returning_values (:pregtasa);
if (PREGTASA = 'SI') then
    BEGIN
    NEW.devt_adicional = NEW.devt_adicional * NEW.devt_trm;
    NEW.devt_ivamonto = NEW.devt_ivamonto * NEW.devt_trm;
    NEW.devt_extra = NEW.devt_extra * NEW.devt_trm;
    NEW.devt_rtftemonto = NEW.devt_rtftemonto * NEW.devt_trm;
    NEW.devt_rtivamonto = NEW.devt_rtivamonto * NEW.devt_trm;
    NEW.devt_rticamonto = NEW.devt_rticamonto * NEW.devt_trm;
    NEW.devt_dtomonto = NEW.devt_dtomonto * NEW.devt_trm;
    END
EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION', 'DOCUMENTOS', 'INHABILITAR FECHA EN DOCUMENTOS') returning_values (:fecserver);
if (FECSERVER = 'SI') then
    NEW.devt_fecha = CAST ('NOW' AS DATE);
if (new.devt_remid is null) then
    NEW.devt_remid = 0;
execute procedure LEE_CONFIGURACION ('FACTURACION','DEVOLUCIONES','PERMITIR DEVOLVER ITEMS NO FACTURADOS') returning_values (:SITOT);
if ((SITOT = 'NO') AND (NEW.devt_factid = 0) AND (NEW.devt_remid = 0) AND (NEW.devt_pedid = 0)) then
    exception factura_no_existe;
/* CALCULE LA COMISION CON BASE EN LA FACTURA */
EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION', 'VENDEDORES', 'COMISIONES EN VENTA INCLUYENDO IMPUESTOS') returning_values (:SITOT);
SELECT FACT_COMIPORC FROM FACTURAS WHERE FACT_ID = NEW.devt_factid INTO NEW.devt_comiporc;
if (NEW.devt_comiporc IS NULL) then
    NEW.devt_comiporc = 0;

if (SITOT = 'SI') then
    NEW.devt_comimonto = NEW.devt_total * NEW.devt_comiporc / 100;
ELSE
    NEW.devt_comimonto = (NEW.devt_total - NEW.devt_ivamonto) * NEW.devt_comiporc / 100;

if (NEW.numok = 'N') then
  BEGIN
  /* Actualice el contador del prefijo */
  SELECT PREF_ACTUAL, PREF_AUTO FROM PREFIJOS WHERE TIDO_COD = 33 AND PREF_PRE = NEW.PREF_PRE INTO :NUMERO, :AUTOM;
  /* ACTUALICE EL NUMERO EN COMPROBANTE_ENCABEZADO  */
  if (AUTOM = 'S') then
    BEGIN
    NEW.DEVT_NUMERO = NUMERO;
    NUMERO = CAST((CAST(NUMERO AS INTEGER) + 1) AS CHAR(6));
    UPDATE PREFIJOS
      SET PREF_ACTUAL = :NUMERO
    WHERE TIDO_COD = 33 AND PREF_PRE = NEW.PREF_PRE;
    END
  ELSE
    BEGIN
    if (CAST(NUMERO AS INTEGER) = CAST(NEW.DEVT_NUMERO AS INTEGER)) then
        UPDATE PREFIJOS
          SET PREF_ACTUAL = CAST((CAST(PREF_ACTUAL AS INTEGER) + 1) AS CHAR(6))
        WHERE TIDO_COD = 33 AND PREF_PRE = NEW.PREF_PRE;
    END
  EXECUTE PROCEDURE COMPLETA_CEROS (NEW.DEVT_numero) returning_values (NEW.DEVT_numero);
  NEW.numok = 'S';
  END
/* Verifique que el numero no existe previamente */
EXISTE = 'N';
SELECT 'S' FROM DEVOLUCIONES_VENTAS WHERE PREF_PRE = NEW.PREF_PRE AND DEVT_NUMERO = NEW.DEVT_NUMERO INTO :EXISTE;
if (EXISTE = 'S') then
    EXCEPTION DOCUMENTO_REGISTRADO 'Ya existe una devolución con el número ' || new.pref_pre || new.devt_numero;
select COBR_COD, VEND_COD FROM CLIENTES WHERE TERC_NIT = NEW.terc_nit INTO :CODCOBR, CODVEND;
if (NEW.cobr_cod IS NULL) then
    NEW.cobr_cod = :CODCOBR;
if (NEW.vend_cod IS NULL) then
    NEW.vend_cod = :CODVEND;
if ((new.DEVT_TOTAL-new.DEVT_IVAMONTO+new.DEVT_DTOMONTO-new.DEVT_ADICIONAL) = 0) then
    NEW.DEVT_FACTOR = 1;
else
    NEW.DEVT_FACTOR = (new.DEVT_TOTAL-new.DEVT_IVAMONTO)/(new.DEVT_TOTAL-new.DEVT_IVAMONTO+new.DEVT_DTOMONTO-new.DEVT_ADICIONAL);
END
^

SET TERM ; ^


/* 20100313 */
/* devoluciones consolidadas base positiva */
SET TERM ^ ;

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

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

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

SET TERM ; ^



/* 20100317 */

INSERT INTO CONFIGURACION (CONF_MODULO, CONF_CATEGORIA, CONF_PROPIEDAD, CONF_VALOR, CONF_POSIBLES, CONF_AYUDA) VALUES ('CRM', 'EVENTOS', 'NUMERO DE MINUTOS MAXIMO ENTRE PEDIDO Y CUMPLIDO DEL COMPROMISO', '10', '', 'Indique el númer máximo de minutos que pueden transcurrir entre el cumplido del compromiso y el pedido para incluir el pedido en las comisiones del asesor');
commit work;

SET TERM ^ ;

CREATE OR ALTER procedure COMISIONES_CALLCENTER (
    ASEINI integer,
    ASEFIN integer,
    FECINI date,
    FECFIN date)
returns (
    ASESOR integer,
    NOMBRE varchar(60),
    ID integer,
    PEDIDO varchar(10),
    VEND INTEGER,
    FECHA date,
    CLIENTE varchar(20),
    NOMCLIENTE varchar(60),
    BASE numeric(18,2),
    IVA numeric(18,2),
    TOTAL numeric(18,2),
    FECREG date,
    HORAREG time,
    HORAEV time,
    MINS integer)
AS
declare variable MINUT integer;
begin
execute procedure lee_configuracion('CRM', 'EVENTOS', 'NUMERO DE MINUTOS MAXIMO ENTRE PEDIDO Y CUMPLIDO DEL COMPROMISO') returning_values (:minut);
FOR SELECT PEDI_ID, PREF_PRE || PEDI_NUMERO, PEDI_FECHA, TERC_NIT, PEDI_NOMTERC, PEDI_TOTAL, PEDI_IVAMONTO, A.audi_fecha, A.audi_hora, VEND_COD
    FROM PEDIDOS P, AUDITORIA A WHERE PEDI_FECHA >= :fecini AND PEDI_FECHA <= :fecfin AND P.pedi_id = A.audi_iddoc
    AND A.tido_cod = 34 and a.audi_oper = 'I' AND PEDI_ANULADO = 'N'
    INTO :ID, :PEDIDO, :FECHA, :CLIENTE, :NOMCLIENTE, :TOTAL, :IVA, :FECREG, :HORAREG, :vend
    DO
    BEGIN
    BASE = TOTAL - IVA;
    asesor = null;
    /* BUSQUE UN COMPROMISO CUMPLIDO DE ESE CLIENTE ANTERIOR AL PEDIDO DEL MISMO DIA Y HORA CERCANA */
    select max(CREV_HORA), max(CREV_ASESOR) FROM crm_eventos
        WHERE CREV_TIPO = 907 AND CRCL_NIT = :CLIENTE AND CREV_FECHA = :FECHA AND CREV_HORA < :HORAREG AND CREV_ASESOR >= :aseini AND CREV_ASESOR <= :asefin
        INTO :horaev, :asesor;
    if (asesor is not null) then
        begin
        MINS = (HORAREG - horaev) / 60;
        if (MINS <= MINUT) THEN
            BEGIN
            NOMBRE = '';
            SELECT CRAS_NOMBRE FROM CRM_ASESOR WHERE CRAS_ID = :ASESOR INTO :nombre;
            suspend;
            END
        end
    END
end
^

SET TERM ; ^

grant EXECUTE on PROCEDURE comisiones_callcenter to PUBLIC;


/* 20100317B */
/* OPTIMIZACION DE AUXILIARES */
SET TERM ^ ;

CREATE OR ALTER procedure AUXILIAR_CUENTA_MES (
    CUENTA varchar(20),
    ANO char(4),
    PERIODO integer)
returns (
    ID integer,
    TIPOCOMP varchar(3),
    PREFIJO varchar(4),
    NUMERO varchar(6),
    FECHA char(8),
    CONCEPTO varchar(60),
    NIT varchar(20),
    REF varchar(20),
    BASE numeric(18,2),
    PORC numeric(9,4),
    DEBITO numeric(18,2),
    CREDITO numeric(18,2),
    PROYECTO varchar(4),
    CENTRO varchar(4),
    TIPOREF integer,
    IDREF integer)
AS
BEGIN
  /* TRAE LOS MOV. DEL MES DE LA CUENTA DADA */
  FOR SELECT E.ENCO_CONSEC, TICO_COD, PRCO_PREF, ENCO_NUMERO, ENCO_FECHA, CODE_CONCEPTO, D.TERC_NIT, CODE_REFER, CODE_BASE, CODE_PORC, CODE_DEBITO, CODE_CREDITO, PROY_COD, CENT_COD, ENCO_TIPOREF, ENCO_IDREF
    FROM COMPROBANTE_ENCABEZADO E, COMPROBANTE_DETALLE D
    WHERE E.ENCO_CONSEC = D.ENCO_CONSEC AND CUEN_COD = :CUENTA AND SUBSTRING(ENCO_FECHA FROM 1 FOR 4) = :ANO AND SUBSTRING(ENCO_FECHA FROM 5 FOR 2) = :PERIODO
    ORDER BY ENCO_FECHA, PRCO_PREF, ENCO_NUMERO
    INTO :ID, :TIPOCOMP, :PREFIJO, :NUMERO, :FECHA, :CONCEPTO, :NIT, :REF, :BASE, :PORC, :DEBITO, :CREDITO, :PROYECTO, :centro, :TIPOREF, :IDREF
    DO
    SUSPEND;
END
^

SET TERM ; ^


SET TERM ^ ;

CREATE OR ALTER procedure AUXILIAR_TERCERO_MES (
    CUENTA varchar(20),
    TERCERO varchar(20),
    ANO char(4),
    PERIODO integer)
returns (
    ID integer,
    TIPOCOMP varchar(3),
    PREFIJO varchar(4),
    NUMERO varchar(6),
    FECHA char(8),
    CONCEPTO varchar(60),
    REF varchar(20),
    BASE numeric(18,2),
    PORC numeric(9,4),
    DEBITO numeric(18,2),
    CREDITO numeric(18,2),
    PROYECTO varchar(4),
    CENTRO varchar(4),
    TIPOREF integer,
    IDREF integer)
AS
BEGIN
  /* TRAE LOS MOV. DEL MES DE LA CUENTA DADA */
  FOR SELECT E.ENCO_CONSEC, TICO_COD, PRCO_PREF, ENCO_NUMERO, ENCO_FECHA, CODE_CONCEPTO, CODE_REFER, CODE_BASE, CODE_PORC, CODE_DEBITO, CODE_CREDITO, PROY_COD, CENT_COD, ENCO_TIPOREF, ENCO_IDREF
    FROM COMPROBANTE_ENCABEZADO E, COMPROBANTE_DETALLE D
    WHERE E.ENCO_CONSEC = D.ENCO_CONSEC AND CUEN_COD = :CUENTA AND D.TERC_NIT = :TERCERO AND SUBSTRING(ENCO_FECHA FROM 1 FOR 4) = :ANO AND SUBSTRING(ENCO_FECHA FROM 5 FOR 2) = :PERIODO
    INTO :ID, :TIPOCOMP, :PREFIJO, :NUMERO, :FECHA, :CONCEPTO, :REF, :BASE, :PORC, :DEBITO, :CREDITO, :PROYECTO, :centro, :TIPOREF, :IDREF
    DO
    SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure AUXILIAR_CENTRO_MES (
    CUENTA varchar(20),
    PROYECTO varchar(4),
    CENTRO varchar(4),
    ANO char(4),
    PERIODO integer)
returns (
    ID integer,
    TIPOCOMP varchar(3),
    PREFIJO varchar(4),
    NUMERO varchar(6),
    FECHA char(8),
    CONCEPTO varchar(60),
    REF varchar(20),
    BASE numeric(18,2),
    PORC numeric(9,4),
    DEBITO numeric(18,2),
    CREDITO numeric(18,2),
    NIT varchar(20),
    TIPOREF integer,
    IDREF integer)
AS
BEGIN
  /* TRAE LOS MOV. DEL MES DE LA CUENTA DADA */
  FOR SELECT E.ENCO_CONSEC, TICO_COD, PRCO_PREF, ENCO_NUMERO, ENCO_FECHA, CODE_CONCEPTO, CODE_REFER, CODE_BASE, CODE_PORC, CODE_DEBITO, CODE_CREDITO, D.TERC_NIT, ENCO_TIPOREF, ENCO_IDREF
    FROM COMPROBANTE_ENCABEZADO E, COMPROBANTE_DETALLE D
    WHERE E.ENCO_CONSEC = D.ENCO_CONSEC AND CUEN_COD = :CUENTA AND PROY_COD = :PROYECTO AND CENT_COD = :CENTRO AND SUBSTRING(ENCO_FECHA FROM 1 FOR 4) = :ANO AND SUBSTRING(ENCO_FECHA FROM 5 FOR 2) = :PERIODO
    INTO :ID, :TIPOCOMP, :PREFIJO, :NUMERO, :FECHA, :CONCEPTO, :REF, :BASE, :PORC, :DEBITO, :CREDITO, :NIT, :TIPOREF, :IDREF
    DO
    SUSPEND;
END
^

SET TERM ; ^

/* 20100319: stand en pedido */

SET TERM ^ ;

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

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

SET TERM ; ^


/* 20100319b */
/* poder borrar las notas */
SET TERM ^ ;

CREATE OR ALTER procedure BUSQUEDA_NOTASDOC (
    TIPO integer,
    IDDOC integer)
returns (
    ID INTEGER,
    USUARIO T_USUARIO,
    FECHA date,
    TIPONOTA T_CONCEPTO,
    RESUMEN T_CONCEPTO,
    IMAGEN varchar(250),
    TEXTO blob sub_type 1 segment size 80)
AS
begin
for select nodo_id, n.nodo_user, n.nodo_fecha, t.tind_nombre, n.nodo_texto, n.nodo_resumen, n.nodo_imagen
    from notas_documento n, tipo_notadoc t
    where t.tind_id = n.nodo_tipo and n.tido_cod = :tipo and n.nodo_iddoc = :iddoc
    order by n.nodo_tipo, n.nodo_fecha
    into :id, :usuario, :fecha, :tiponota, :texto, :resumen, :imagen
    do
    suspend;
end
^

SET TERM ; ^

/* 20100319c */
/* NO INCLUYA LOS PEDIDOS DESCARGADOS (VALIDEZ < 0) */
SET TERM ^ ;

CREATE OR ALTER procedure REP_FALTANTES_VENTA (
    TIPOORI integer,
    FECINI date,
    FECFIN date,
    TIPODES integer,
    CEROS char(1),
    DETALLE char(1),
    SUBEMPRESA integer)
returns (
    PREFIJO varchar(4),
    NUMERO varchar(6),
    FECHA date,
    NIT varchar(20),
    NOMCLIENTE varchar(60),
    VEND integer,
    NOMVEND varchar(60),
    VENCE date,
    ARTICULO varchar(15),
    DESCRIPCION varchar(60),
    CANTIDAD numeric(18,4),
    UNIDAD varchar(8),
    PRECIO numeric(18,2),
    DESCUENTO numeric(9,4),
    FALTANTE numeric(18,4),
    OBS varchar(255),
    NUMCRUCE varchar(10))
AS
declare variable ID INTEGER;
declare variable ITEM INTEGER;
declare variable FACTOR NUMERIC(18,4);
BEGIN
if (detalle = 'S') then
  BEGIN
  if (TIPOORI = 32) then
    FOR SELECT R.REVT_ID, R.PREF_PRE, REVT_NUMERO, REVT_FECHA, REVT_FECHA VENCE, RVDE_ITEM, R.TERC_NIT, REVT_NOMTERC, ARTI_COD, SUBSTR(RVDE_DESC,1,60), RVDE_UNIDAD, RVDE_CANT, RVDE_PRUNIT, RVDE_DTOPORC, SUBSTRING(REVT_OBS FROM 1 FOR 255)
      FROM REMISIONES_VENTA R, REMISIONES_VENTA_DETALLE D, PREFIJOS P
      WHERE R.REVT_ID = D.REVT_ID AND REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN and REVT_ANULADO = 'N'
       AND P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = 32 AND ((P.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
      ORDER BY REVT_FECHA, R.PREF_PRE, REVT_NUMERO, RVDE_ITEM
      INTO :ID, :PREFIJO, :NUMERO, :FECHA, :VENCE, :ITEM, :NIT, :NOMCLIENTE, :ARTICULO, :DESCRIPCION, :UNIDAD, :CANTIDAD, :PRECIO, :DESCUENTO, :OBS
      DO
        BEGIN
        EXECUTE PROCEDURE FALTANTE(:TIPOORI, :TIPODES, :ID,  :ITEM) returning_values (:FALTANTE, :UNIDAD, :FACTOR);
        if ((CEROS = 'N') or (FALTANTE = cantidad)) then
          SUSPEND;
        END
  if (TIPOORI = 34) then
    FOR SELECT P.PEDI_ID, P.PREF_PRE, PEDI_NUMERO, PEDI_FECHA, (PEDI_FECHA + PEDI_VALIDEZ), PEDE_ITEM, P.TERC_NIT, PEDI_NOMTERC, ARTI_COD, SUBSTR(PEDE_DESC,1,60), PEDE_UNIDAD, PEDE_CANT, PEDE_PRUNIT, PEDE_DTOPORC, SUBSTRING(PEDI_OBS FROM 1 FOR 255)
      FROM PEDIDOS P, PEDIDOS_DETALLE D, PREFIJOS PR
      WHERE P.PEDI_ID = D.PEDI_ID AND PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND PEDI_ANULADO = 'N' AND PEDI_VALIDEZ >= 0
       AND PR.PREF_PRE = P.PREF_PRE AND PR.TIDO_COD = 34 AND ((PR.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
      ORDER BY PEDI_FECHA, P.PREF_PRE, PEDI_NUMERO, PEDE_ITEM
      INTO :ID, :PREFIJO, :NUMERO, :FECHA, :VENCE, :ITEM, :NIT, :NOMCLIENTE, :ARTICULO, :DESCRIPCION, :UNIDAD, :CANTIDAD, :PRECIO, :DESCUENTO, :OBS
      DO
        BEGIN
        EXECUTE PROCEDURE FALTANTE(:TIPOORI, :TIPODES, :ID,  :ITEM) returning_values (:FALTANTE, :UNIDAD, :FACTOR);
        if ((CEROS = 'N') or (FALTANTE = cantidad)) then
          SUSPEND;
        END
  if (TIPOORI = 35) then
    FOR SELECT C.COTI_ID, C.PREF_PRE, COTI_NUMERO, COTI_FECHA, (COTI_FECHA + COTI_VALIDEZ), CTDE_ITEM, C.TERC_NIT, COTI_NOMTERC, ARTI_COD, SUBSTR(CTDE_DESC,1,60), CTDE_UNIDAD, CTDE_CANT, CTDE_PRUNIT, CTDE_DTOPORC, SUBSTRING(COTI_OBS FROM 1 FOR 255)
      FROM COTIZACIONES C, COTIZACIONES_DETALLE D, PREFIJOS P
      WHERE C.COTI_ID = D.COTI_ID AND COTI_FECHA >= :FECINI AND COTI_FECHA <= :FECFIN AND COTI_ANULADO = 'N'
       AND P.PREF_PRE = C.PREF_PRE AND P.TIDO_COD = 35 AND ((P.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
      ORDER BY COTI_FECHA, C.PREF_PRE, COTI_NUMERO, CTDE_ITEM
      INTO :ID, :PREFIJO, :NUMERO, :FECHA, :VENCE, :ITEM, :NIT, :NOMCLIENTE, :ARTICULO, :DESCRIPCION, :UNIDAD, :CANTIDAD, :PRECIO, :DESCUENTO, :OBS
      DO
        BEGIN
        EXECUTE PROCEDURE FALTANTE(:TIPOORI, :TIPODES, :ID,  :ITEM) returning_values (:FALTANTE, :UNIDAD, :FACTOR);
        if ((CEROS = 'N') or (FALTANTE = cantidad)) then
          SUSPEND;
        END
  END
ELSE
  BEGIN
  if (TIPOORI = 32) then
    FOR SELECT R.REVT_ID, R.PREF_PRE, REVT_NUMERO, REVT_FECHA, REVT_FECHA VENCE, R.TERC_NIT,
        REVT_NOMTERC, SUBSTRING(REVT_OBS FROM 1 FOR 255), R.VEND_COD, REVT_TOTAL
      FROM REMISIONES_VENTA R, PREFIJOS P
      WHERE REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN and REVT_ANULADO = 'N'
       AND P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = 32 AND ((P.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
      ORDER BY REVT_FECHA, R.PREF_PRE, REVT_NUMERO
      INTO :ID, :PREFIJO, :NUMERO, :FECHA, :VENCE, :NIT, :NOMCLIENTE, :OBS, :VEND, :PRECIO
      DO
        BEGIN
        NUMCRUCE = '';
        SELECT VEND_NOMBRE FROM VENDEDORES WHERE VEND_COD = :VEND INTO :NOMVEND;
        if (TIPODES = 31) then
            SELECT FIRST 1 PREF_PRE || FACT_NUMERO FROM FACTURAS F, consolidado_faltantes C
                WHERE F.fact_consolida = C.cofa_id AND C.cofa_tipoori = 32 AND C.cofa_idori = :ID AND
                C.cofa_tipodes = 31 AND C.cofa_ok = 'S' AND FACT_ANULADO = 'N'
                INTO :numcruce;
        if ((CEROS = 'N') or (NUMCRUCE = '')) then
          SUSPEND;
        END
  if (TIPOORI = 34) then
    FOR SELECT P.PEDI_ID, P.PREF_PRE, PEDI_NUMERO, PEDI_FECHA, (PEDI_FECHA + PEDI_VALIDEZ), P.TERC_NIT,
    PEDI_NOMTERC, SUBSTRING(PEDI_OBS FROM 1 FOR 255), P.VEND_COD, PEDI_TOTAL
      FROM PEDIDOS P, PREFIJOS PR
      WHERE PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND PEDI_ANULADO = 'N' AND PEDI_VALIDEZ >= 0
       AND PR.PREF_PRE = P.PREF_PRE AND PR.TIDO_COD = 34 AND ((PR.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
      ORDER BY PEDI_FECHA, P.PREF_PRE, PEDI_NUMERO
      INTO :ID, :PREFIJO, :NUMERO, :FECHA, :VENCE, :NIT, :NOMCLIENTE, :OBS, :VEND, :PRECIO
      DO
        BEGIN
        NUMCRUCE = '';
        SELECT VEND_NOMBRE FROM VENDEDORES WHERE VEND_COD = :VEND INTO :NOMVEND;
        if (TIPODES = 31) then
            SELECT FIRST 1 PREF_PRE || FACT_NUMERO FROM FACTURAS F, consolidado_faltantes C
                WHERE F.fact_consolida = C.cofa_id AND C.cofa_tipoori = 34 AND C.cofa_idori = :ID AND
                C.cofa_tipodes = 31 AND C.cofa_ok = 'S' AND FACT_ANULADO = 'N'
                INTO :numcruce;
        if (TIPODES = 32) then
            SELECT FIRST 1 PREF_PRE || REVT_NUMERO FROM remisiones_venta F, consolidado_faltantes C
                WHERE F.revt_consolida = C.cofa_id AND C.cofa_tipoori = 34 AND C.cofa_idori = :ID AND
                C.cofa_tipodes = 32 AND C.cofa_ok = 'S' AND REVT_ANULADO = 'N'
                INTO :numcruce;
        if ((CEROS = 'N') or (NUMCRUCE = '')) then
          SUSPEND;
        END
  if (TIPOORI = 35) then
    FOR SELECT C.COTI_ID, C.PREF_PRE, COTI_NUMERO, COTI_FECHA, (COTI_FECHA + COTI_VALIDEZ), C.TERC_NIT,
      COTI_NOMTERC, SUBSTRING(COTI_OBS FROM 1 FOR 255), C.VEND_COD, COTI_TOTAL
      FROM COTIZACIONES C, PREFIJOS P
      WHERE COTI_FECHA >= :FECINI AND COTI_FECHA <= :FECFIN AND COTI_ANULADO = 'N'
       AND P.PREF_PRE = C.PREF_PRE AND P.TIDO_COD = 35 AND ((P.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
      ORDER BY COTI_FECHA, C.PREF_PRE, COTI_NUMERO
      INTO :ID, :PREFIJO, :NUMERO, :FECHA, :VENCE, :NIT, :NOMCLIENTE, :OBS, :VEND, :PRECIO
      DO
        BEGIN
        NUMCRUCE = '';
        SELECT VEND_NOMBRE FROM VENDEDORES WHERE VEND_COD = :VEND INTO :NOMVEND;
        if (TIPODES = 31) then
            SELECT FIRST 1 PREF_PRE || FACT_NUMERO FROM FACTURAS F, consolidado_faltantes C
                WHERE F.fact_consolida = C.cofa_id AND C.cofa_tipoori = 35 AND C.cofa_idori = :ID AND
                C.cofa_tipodes = 31 AND C.cofa_ok = 'S' AND FACT_ANULADO = 'N'
                INTO :numcruce;
        if (TIPODES = 32) then
            SELECT FIRST 1 PREF_PRE || REVT_NUMERO FROM remisiones_venta F, consolidado_faltantes C
                WHERE F.revt_consolida = C.cofa_id AND C.cofa_tipoori = 35 AND C.cofa_idori = :ID AND
                C.cofa_tipodes = 32 AND C.cofa_ok = 'S' AND REVT_ANULADO = 'N'
                INTO :numcruce;
        if (TIPODES = 34) then
            SELECT FIRST 1 PREF_PRE || PEDI_NUMERO FROM PEDIDOS F, consolidado_faltantes C
                WHERE F.pedi_consolida = C.cofa_id AND C.cofa_tipoori = 35 AND C.cofa_idori = :ID AND
                C.cofa_tipodes = 34 AND C.cofa_ok = 'S' AND PEDI_ANULADO = 'N'
                INTO :numcruce;
        if ((CEROS = 'N') or (NUMCRUCE = '')) then
          SUSPEND;
        END
  END
END
^

SET TERM ; ^


/* 20100324 */
/* PREFIJO Y NUMERO EN CONCILIACION_BANCARIA SI OK = 'S' */

SET TERM ^ ;

CREATE OR ALTER procedure CONCILIA_BANCO (
    ID integer)
AS
declare variable fecini date;
declare variable fecfin date;
declare variable item integer;
declare variable db char(1);
declare variable cuenta integer;
declare variable tipodoc integer;
declare variable iddoc integer;
declare variable prefijo varchar(4);
declare variable numero varchar(6);
declare variable fecha date;
declare variable concepto varchar(60);
declare variable monto numeric(18,2);
declare variable CONANT INTEGER;
begin
select CUBA_COD, COBN_FECINI, COBN_FECFIN FROM conciliacion_encabezado WHERE COBN_ID = :ID INTO :CUENTA, :FECINI, :FECFIN;
SELECT MAX(COBN_ITEM) FROM conciliacion_bancaria WHERE COBN_ID = :ID INTO :item;
/* AGREGUE LOS PENDIENTES DE LA ULTIMA CONCILIACION DE ESA CUENTA */
SELECT FIRST 1 COBN_ID FROM conciliacion_encabezado WHERE CUBA_COD = :CUENTA AND COBN_FECINI < :FECINI ORDER BY COBN_FECINI DESC INTO :CONANT;
FOR SELECT COBN_FEC, COBN_TIPODOC, COBN_DB, COBN_CONC, ABS(COBN_MONTO) FROM conciliacion_bancaria
    WHERE COBN_OK = 'N' and COBN_ID = :CONANT
    INTO :fecha, :tipodoc, :db, :concepto, :monto
    DO
    BEGIN
    ITEM = ITEM + 1;
    if (DB = 'N') then
        INSERT INTO conciliacion_bancaria (CUBA_COD, COBN_ID, COBN_ITEM, COBN_FEC, COBN_PREFIJO, COBN_NUMERO, COBN_MONTO, COBN_TIPODOC, COBN_ANULADO, COBN_OK, COBN_CONC, COBN_IDDOC, COBN_DB, COBN_CLASE)
            VALUES (:CUENTA, :ID, :ITEM, :FECHA, NULL, NULL, :monto, :TIPODOC, 'N', 'N', :concepto, NULL, :DB, '2');
    else
        INSERT INTO conciliacion_bancaria (CUBA_COD, COBN_ID, COBN_ITEM, COBN_FEC, COBN_PREFIJO, COBN_NUMERO, COBN_MONTO, COBN_TIPODOC, COBN_ANULADO, COBN_OK, COBN_CONC, COBN_IDDOC, COBN_DB, COBN_CLASE)
            VALUES (:CUENTA, :ID, :ITEM, :FECHA, NULL, NULL, :monto, :TIPODOC, 'N', 'N', :concepto, NULL, :DB, '1');
    END

/* COMPARE LA TABLA CON LOS MOVIMIENTOS DEL BANCO */
FOR SELECT COBN_ITEM, ABS(COBN_MONTO), COBN_FEC, COBN_TIPODOC, COBN_DB, COBN_CONC
    FROM CONCILIACION_BANCARIA
    WHERE COBN_ID = :ID AND ((COBN_IDDOC = 0) or (cobn_iddoc is null))
    INTO :ITEM, :MONTO, :FECHA, :TIPODOC, :DB, :concepto
    DO
    BEGIN
    PREFIJO = '';
    NUMERO = '';
    IDDOC = 0;
    /* BUSQUE LA OPERACION  */
    if (TIPODOC <> 0) then
        BEGIN
        SELECT FIRST 1 MOBA_PREF, MOBA_NUMERO, MOBA_IDREF
            FROM movimiento_banco M WHERE MOBA_TIPODOC = :tipodoc AND MOBA_TOTAL = :MONTO AND M.cuba_cod = :cuenta AND MOBA_FECHA >= :FECINI AND MOBA_FECHA <= :FECFIN  AND
                NOT EXISTS (SELECT COBN_ITEM FROM CONCILIACION_BANCARIA WHERE COBN_IDDOC = m.moba_idref AND COBN_TIPODOC = :tipodoc and COBN_ID = :ID)
            ORDER BY ABS(MOBA_FECHA - :FECHA)
            INTO :prefijo, :numero, :IDDOC;
        if (PREFIJO <> '') then
            BEGIN
            insert into conciliacion_detalle (COBN_ID, COBN_ITEM, COBN_DET, COBD_TIPODOC, COBD_IDDOC, COBD_PREFIJO, COBD_NUMERO, COBD_ANULADO)
                VALUES (:ID, :ITEM, 1, :TIPODOC, :IDDOC, :PREFIJO, :NUMERO, 'N');
            UPDATE conciliacion_bancaria SET COBN_OK = 'S', COBN_CLASE = '0',
                COBN_PREFIJO = :PREFIJO, COBN_NUMERO = :NUMERO
                WHERE COBN_ID = :ID AND COBN_ITEM = :ITEM;
            END
        ELSE
            BEGIN
            /* BUSQUELO COMO DEBITO O CREDITO SIN IMPORTAR EL TIPO */
            SELECT FIRST 1 MOBA_PREF, MOBA_NUMERO, MOBA_IDREF
                FROM movimiento_banco M WHERE MOBA_DB = :DB AND MOBA_TOTAL = :MONTO AND M.cuba_cod = :cuenta AND MOBA_FECHA >= :FECINI AND MOBA_FECHA <= :FECFIN AND
                    NOT EXISTS (SELECT COBN_ITEM FROM CONCILIACION_BANCARIA WHERE COBN_IDDOC = m.moba_idref AND COBN_TIPODOC = :tipodoc and COBN_ID = :ID)
                ORDER BY ABS(MOBA_FECHA - :FECHA)
                INTO :prefijo, :numero, :IDDOC;
            if (PREFIJO <> '') then
                BEGIN
                insert into conciliacion_detalle (COBN_ID, COBN_ITEM, COBN_DET, COBD_TIPODOC, COBD_IDDOC, COBD_PREFIJO, COBD_NUMERO, COBD_ANULADO)
                    VALUES (:ID, :ITEM, 1, :TIPODOC, :IDDOC, :PREFIJO, :NUMERO, 'N');
                UPDATE conciliacion_bancaria SET COBN_PREFIJO = :PREFIJO, COBN_NUMERO = :NUMERO, COBN_IDDOC = :iddoc, COBN_OK = 'S', COBN_CLASE = '0'
                    WHERE COBN_ID = :ID AND COBN_ITEM = :ITEM;
                END
            ELSE
                BEGIN
                if (DB = 'N') then
                    UPDATE conciliacion_bancaria SET COBN_OK = 'N', COBN_CLASE = '2'
                        WHERE COBN_ID = :ID AND COBN_ITEM = :ITEM;
                else
                    UPDATE conciliacion_bancaria SET COBN_OK = 'N', COBN_CLASE = '1'
                        WHERE COBN_ID = :ID AND COBN_ITEM = :ITEM;
                END
            END
        END
    ELSE
        BEGIN
        /* BUSQUELO COMO DEBITO O CREDITO SIN IMPORTAR EL TIPO */
        SELECT FIRST 1 MOBA_PREF, MOBA_NUMERO, MOBA_IDREF, MOBA_TIPODOC
            FROM movimiento_banco M WHERE MOBA_DB = :DB AND MOBA_TOTAL = :MONTO AND M.cuba_cod = :cuenta AND MOBA_FECHA >= :FECINI AND MOBA_FECHA <= :FECFIN AND
                NOT EXISTS (SELECT COBN_ITEM FROM CONCILIACION_BANCARIA WHERE COBN_IDDOC = m.moba_idref AND COBN_DB = :DB and COBN_ID = :ID)
            ORDER BY ABS(MOBA_FECHA - :FECHA)
            INTO :prefijo, :numero, :IDDOC, :TIPODOC;
        if (PREFIJO <> '') then
            BEGIN
            insert into conciliacion_detalle (COBN_ID, COBN_ITEM, COBN_DET, COBD_TIPODOC, COBD_IDDOC, COBD_PREFIJO, COBD_NUMERO, COBD_ANULADO)
                VALUES (:ID, :ITEM, 1, :TIPODOC, :IDDOC, :PREFIJO, :NUMERO, 'N');
            UPDATE conciliacion_bancaria SET COBN_TIPODOC = :TIPODOC, COBN_OK = 'S', COBN_CLASE = '0',
                COBN_PREFIJO = :PREFIJO, COBN_NUMERO = :NUMERO
                WHERE COBN_ID = :ID AND COBN_ITEM = :ITEM;
            END
        ELSE
            BEGIN
            if (DB = 'N') then
                UPDATE conciliacion_bancaria SET COBN_OK = 'N', COBN_CLASE = '2'
                    WHERE COBN_ID = :ID AND COBN_ITEM = :ITEM;
            else
                UPDATE conciliacion_bancaria SET COBN_OK = 'N', COBN_CLASE = '1'
                    WHERE COBN_ID = :ID AND COBN_ITEM = :ITEM;
            END
        END
    END
/* AGREGUE LOS DOCUMENTOS SIN UBICAR */
FOR SELECT MOBA_PREF, MOBA_NUMERO, MOBA_FECHA, MOBA_TOTAL, MOBA_CONCEPTO, MOBA_TIPODOC, MOBA_IDREF, MOBA_DB
    FROM MOVIMIENTO_BANCO M
    WHERE MOBA_FECHA >= :FECINI AND MOBA_FECHA <= :FECFIN  AND M.cuba_cod = :cuenta AND
        NOT EXISTS (SELECT COBN_DET FROM conciliacion_detalle WHERE COBD_TIPODOC = M.moba_tipodoc AND COBD_IDDOC = M.moba_idref and COBN_ID = :ID)
    INTO :prefijo, :numero, :fecha, :monto, :concepto, :tipodoc, :iddoc, :DB
    DO
    BEGIN
    ITEM = ITEM + 1;
    if (DB = 'N') then
        INSERT INTO conciliacion_bancaria (CUBA_COD, COBN_ID, COBN_ITEM, COBN_FEC, COBN_PREFIJO, COBN_NUMERO, COBN_MONTO, COBN_TIPODOC, COBN_ANULADO, COBN_OK, COBN_CONC, COBN_IDDOC, COBN_DB, COBN_CLASE)
            VALUES (:CUENTA, :ID, :ITEM, :FECHA, :PREFIJO, :NUMERO, :monto, :TIPODOC, 'N', 'N', :concepto, :iddoc, :DB, '4');
    else
        INSERT INTO conciliacion_bancaria (CUBA_COD, COBN_ID, COBN_ITEM, COBN_FEC, COBN_PREFIJO, COBN_NUMERO, COBN_MONTO, COBN_TIPODOC, COBN_ANULADO, COBN_OK, COBN_CONC, COBN_IDDOC, COBN_DB, COBN_CLASE)
            VALUES (:CUENTA, :ID, :ITEM, :FECHA, :PREFIJO, :NUMERO, :monto, :TIPODOC, 'N', 'N', :concepto, :iddoc, :DB, '3');
    END
end
^

SET TERM ; ^


SET TERM ^ ;

CREATE OR ALTER procedure NUMERO_CONCILIACION (
    ID integer)
returns (
    ITEM integer,
    PREF varchar(4),
    NUMERO varchar(6))
AS
declare variable NUMROWS INTEGER;
begin
FOR SELECT COBN_ITEM, COBD_PREFIJO, COBD_NUMERO FROM CONCILIACION_DETALLE WHERE COBN_ID = :ID
    INTO :item, pref, :numero
    DO
    BEGIN
    SELECT COUNT(*) FROM CONCILIACION_DETALLE  WHERE COBN_ID = :ID AND COBN_ITEM = :item INTO :numrows;
    if (NUMROWS = 1) then
        UPDATE conciliacion_bancaria SET COBN_PREFIJO = :pref, COBN_NUMERO = :numero
            WHERE COBN_ID = :ID AND COBN_ITEM = :item AND COBN_OK = 'S' AND ((COBN_NUMERO = '') or (COBN_NUMERO IS NULL));
    ELSE
        BEGIN
        PREF = '';
        NUMERO = 'VARIOS';
        UPDATE conciliacion_bancaria SET COBN_PREFIJO = :pref, COBN_NUMERO = :numero
            WHERE COBN_ID = :ID AND COBN_ITEM = :item AND COBN_OK = 'S' AND ((COBN_NUMERO = '') or (COBN_NUMERO IS NULL));
        END
    suspend;
    END
end
^

SET TERM ; ^

/* 20100324B */
/* preguntar por factura si consolidar cantidades */

UPDATE CONFIGURACION
SET CONF_POSIBLES = 'SI,NO,PREGUNTAR'
WHERE (CONF_MODULO = 'FACTURACION') AND (CONF_CATEGORIA = 'DOCUMENTOS') AND (CONF_PROPIEDAD = 'SUMAR CANTIDADES PENDIENTES AL CONSOLIDAR DOCUMENTOS');
COMMIT WORK;

/* 20100324C */
/* PODIA REPETIRSE UN ID DE DOC DE SYS */

SET TERM ^ ;

CREATE OR ALTER procedure CONCILIA_BANCO (
    ID integer)
AS
declare variable fecini date;
declare variable fecfin date;
declare variable item integer;
declare variable db char(1);
declare variable cuenta integer;
declare variable tipodoc integer;
declare variable iddoc integer;
declare variable prefijo varchar(4);
declare variable numero varchar(6);
declare variable fecha date;
declare variable concepto varchar(60);
declare variable monto numeric(18,2);
declare variable CONANT INTEGER;
begin
select CUBA_COD, COBN_FECINI, COBN_FECFIN FROM conciliacion_encabezado WHERE COBN_ID = :ID INTO :CUENTA, :FECINI, :FECFIN;
SELECT MAX(COBN_ITEM) FROM conciliacion_bancaria WHERE COBN_ID = :ID INTO :item;
/* AGREGUE LOS PENDIENTES DE LA ULTIMA CONCILIACION DE ESA CUENTA */
SELECT FIRST 1 COBN_ID FROM conciliacion_encabezado WHERE CUBA_COD = :CUENTA AND COBN_FECINI < :FECINI ORDER BY COBN_FECINI DESC INTO :CONANT;
FOR SELECT COBN_FEC, COBN_TIPODOC, COBN_DB, COBN_CONC, ABS(COBN_MONTO) FROM conciliacion_bancaria
    WHERE COBN_OK = 'N' and COBN_ID = :CONANT
    INTO :fecha, :tipodoc, :db, :concepto, :monto
    DO
    BEGIN
    ITEM = ITEM + 1;
    if (DB = 'N') then
        INSERT INTO conciliacion_bancaria (CUBA_COD, COBN_ID, COBN_ITEM, COBN_FEC, COBN_PREFIJO, COBN_NUMERO, COBN_MONTO, COBN_TIPODOC, COBN_ANULADO, COBN_OK, COBN_CONC, COBN_IDDOC, COBN_DB, COBN_CLASE)
            VALUES (:CUENTA, :ID, :ITEM, :FECHA, NULL, NULL, :monto, :TIPODOC, 'N', 'N', :concepto, NULL, :DB, '2');
    else
        INSERT INTO conciliacion_bancaria (CUBA_COD, COBN_ID, COBN_ITEM, COBN_FEC, COBN_PREFIJO, COBN_NUMERO, COBN_MONTO, COBN_TIPODOC, COBN_ANULADO, COBN_OK, COBN_CONC, COBN_IDDOC, COBN_DB, COBN_CLASE)
            VALUES (:CUENTA, :ID, :ITEM, :FECHA, NULL, NULL, :monto, :TIPODOC, 'N', 'N', :concepto, NULL, :DB, '1');
    END

/* COMPARE LA TABLA CON LOS MOVIMIENTOS DEL BANCO */
FOR SELECT COBN_ITEM, ABS(COBN_MONTO), COBN_FEC, COBN_TIPODOC, COBN_DB, COBN_CONC
    FROM CONCILIACION_BANCARIA
    WHERE COBN_ID = :ID AND ((COBN_IDDOC = 0) or (cobn_iddoc is null))
    INTO :ITEM, :MONTO, :FECHA, :TIPODOC, :DB, :concepto
    DO
    BEGIN
    PREFIJO = '';
    NUMERO = '';
    IDDOC = 0;
    /* BUSQUE LA OPERACION  */
    if (TIPODOC <> 0) then
        BEGIN
        SELECT FIRST 1 MOBA_PREF, MOBA_NUMERO, MOBA_IDREF
            FROM movimiento_banco M WHERE MOBA_TIPODOC = :tipodoc AND MOBA_TOTAL = :MONTO AND M.cuba_cod = :cuenta AND MOBA_FECHA >= :FECINI AND MOBA_FECHA <= :FECFIN  AND
                NOT EXISTS (SELECT COBN_ITEM FROM CONCILIACION_DETALLE WHERE COBD_IDDOC = m.moba_idref AND COBD_TIPODOC = :tipodoc and COBN_ID = :ID)
            ORDER BY ABS(MOBA_FECHA - :FECHA)
            INTO :prefijo, :numero, :IDDOC;
        if (PREFIJO <> '') then
            BEGIN
            insert into conciliacion_detalle (COBN_ID, COBN_ITEM, COBN_DET, COBD_TIPODOC, COBD_IDDOC, COBD_PREFIJO, COBD_NUMERO, COBD_ANULADO)
                VALUES (:ID, :ITEM, 1, :TIPODOC, :IDDOC, :PREFIJO, :NUMERO, 'N');
            UPDATE conciliacion_bancaria SET COBN_OK = 'S', COBN_CLASE = '0',
                COBN_PREFIJO = :PREFIJO, COBN_NUMERO = :NUMERO
                WHERE COBN_ID = :ID AND COBN_ITEM = :ITEM;
            END
        ELSE
            BEGIN
            /* BUSQUELO COMO DEBITO O CREDITO SIN IMPORTAR EL TIPO */
            SELECT FIRST 1 MOBA_PREF, MOBA_NUMERO, MOBA_IDREF
                FROM movimiento_banco M WHERE MOBA_DB = :DB AND MOBA_TOTAL = :MONTO AND M.cuba_cod = :cuenta AND MOBA_FECHA >= :FECINI AND MOBA_FECHA <= :FECFIN AND
                    NOT EXISTS (SELECT COBN_ITEM FROM CONCILIACION_DETALLE WHERE COBD_IDDOC = m.moba_idref AND COBD_TIPODOC = :tipodoc and COBN_ID = :ID)
                ORDER BY ABS(MOBA_FECHA - :FECHA)
                INTO :prefijo, :numero, :IDDOC;
            if (PREFIJO <> '') then
                BEGIN
                insert into conciliacion_detalle (COBN_ID, COBN_ITEM, COBN_DET, COBD_TIPODOC, COBD_IDDOC, COBD_PREFIJO, COBD_NUMERO, COBD_ANULADO)
                    VALUES (:ID, :ITEM, 1, :TIPODOC, :IDDOC, :PREFIJO, :NUMERO, 'N');
                UPDATE conciliacion_bancaria SET COBN_PREFIJO = :PREFIJO, COBN_NUMERO = :NUMERO, COBN_IDDOC = :iddoc, COBN_OK = 'S', COBN_CLASE = '0'
                    WHERE COBN_ID = :ID AND COBN_ITEM = :ITEM;
                END
            ELSE
                BEGIN
                if (DB = 'N') then
                    UPDATE conciliacion_bancaria SET COBN_OK = 'N', COBN_CLASE = '2'
                        WHERE COBN_ID = :ID AND COBN_ITEM = :ITEM;
                else
                    UPDATE conciliacion_bancaria SET COBN_OK = 'N', COBN_CLASE = '1'
                        WHERE COBN_ID = :ID AND COBN_ITEM = :ITEM;
                END
            END
        END
    ELSE
        BEGIN
        /* BUSQUELO COMO DEBITO O CREDITO SIN IMPORTAR EL TIPO */
        SELECT FIRST 1 MOBA_PREF, MOBA_NUMERO, MOBA_IDREF, MOBA_TIPODOC
            FROM movimiento_banco M WHERE MOBA_DB = :DB AND MOBA_TOTAL = :MONTO AND M.cuba_cod = :cuenta AND MOBA_FECHA >= :FECINI AND MOBA_FECHA <= :FECFIN AND
                NOT EXISTS (SELECT COBN_ITEM FROM CONCILIACION_DETALLE WHERE COBD_IDDOC = m.moba_idref AND COBD_TIPODOC = :tipodoc and COBN_ID = :ID)
            ORDER BY ABS(MOBA_FECHA - :FECHA)
            INTO :prefijo, :numero, :IDDOC, :TIPODOC;
        if (PREFIJO <> '') then
            BEGIN
            insert into conciliacion_detalle (COBN_ID, COBN_ITEM, COBN_DET, COBD_TIPODOC, COBD_IDDOC, COBD_PREFIJO, COBD_NUMERO, COBD_ANULADO)
                VALUES (:ID, :ITEM, 1, :TIPODOC, :IDDOC, :PREFIJO, :NUMERO, 'N');
            UPDATE conciliacion_bancaria SET COBN_TIPODOC = :TIPODOC, COBN_OK = 'S', COBN_CLASE = '0',
                COBN_PREFIJO = :PREFIJO, COBN_NUMERO = :NUMERO
                WHERE COBN_ID = :ID AND COBN_ITEM = :ITEM;
            END
        ELSE
            BEGIN
            if (DB = 'N') then
                UPDATE conciliacion_bancaria SET COBN_OK = 'N', COBN_CLASE = '2'
                    WHERE COBN_ID = :ID AND COBN_ITEM = :ITEM;
            else
                UPDATE conciliacion_bancaria SET COBN_OK = 'N', COBN_CLASE = '1'
                    WHERE COBN_ID = :ID AND COBN_ITEM = :ITEM;
            END
        END
    END
/* AGREGUE LOS DOCUMENTOS SIN UBICAR */
FOR SELECT MOBA_PREF, MOBA_NUMERO, MOBA_FECHA, MOBA_TOTAL, MOBA_CONCEPTO, MOBA_TIPODOC, MOBA_IDREF, MOBA_DB
    FROM MOVIMIENTO_BANCO M
    WHERE MOBA_FECHA >= :FECINI AND MOBA_FECHA <= :FECFIN  AND M.cuba_cod = :cuenta AND
        NOT EXISTS (SELECT COBN_ITEM FROM CONCILIACION_DETALLE WHERE COBD_IDDOC = m.moba_idref AND COBD_TIPODOC = :tipodoc and COBN_ID = :ID)
    INTO :prefijo, :numero, :fecha, :monto, :concepto, :tipodoc, :iddoc, :DB
    DO
    BEGIN
    ITEM = ITEM + 1;
    if (DB = 'N') then
        INSERT INTO conciliacion_bancaria (CUBA_COD, COBN_ID, COBN_ITEM, COBN_FEC, COBN_PREFIJO, COBN_NUMERO, COBN_MONTO, COBN_TIPODOC, COBN_ANULADO, COBN_OK, COBN_CONC, COBN_IDDOC, COBN_DB, COBN_CLASE)
            VALUES (:CUENTA, :ID, :ITEM, :FECHA, :PREFIJO, :NUMERO, :monto, :TIPODOC, 'N', 'N', :concepto, :iddoc, :DB, '4');
    else
        INSERT INTO conciliacion_bancaria (CUBA_COD, COBN_ID, COBN_ITEM, COBN_FEC, COBN_PREFIJO, COBN_NUMERO, COBN_MONTO, COBN_TIPODOC, COBN_ANULADO, COBN_OK, COBN_CONC, COBN_IDDOC, COBN_DB, COBN_CLASE)
            VALUES (:CUENTA, :ID, :ITEM, :FECHA, :PREFIJO, :NUMERO, :monto, :TIPODOC, 'N', 'N', :concepto, :iddoc, :DB, '3');
    END
end
^

SET TERM ; ^


/* 20100325 */
/* devoluciones a proveedor sin afectar cxpagar configurable */

INSERT INTO CONFIGURACION (CONF_MODULO, CONF_CATEGORIA, CONF_PROPIEDAD, CONF_VALOR, CONF_POSIBLES, CONF_AYUDA) VALUES ('COMPRAS', 'DEVOLUCIONES', 'AFECTAR CUENTAS POR PAGAR CON LA DEVOLUCION AL PROVEEDOR', 'SI', 'SI,NO', 'SI: Al hacer la devolución se afecta la cuenta por pagar al proveedor automáticamente. NO: Se debe hacer manualmente una nota de descuento al proveedor ya que la devolución solo reversa el inventario');
commit work;

SET TERM ^ ;

CREATE OR ALTER TRIGGER DEVOLUCIONES_COMPRAS_AI FOR DEVOLUCIONES_COMPRAS
ACTIVE AFTER INSERT POSITION 0
AS
declare variable CONC VARCHAR(60);
declare variable CXP CHAR(2);
BEGIN
if ((NEW.DVCO_ID <> 0) and (new.dvco_anulado = 'N')) then
    BEGIN
    execute procedure lee_configuracion ('COMPRAS', 'DEVOLUCIONES', 'AFECTAR CUENTAS POR PAGAR CON LA DEVOLUCION AL PROVEEDOR') returning_values (CXP);
    if (CXP = 'SI') then
        BEGIN
        /* Registre el nuevo saldo del documento */
        INSERT INTO saldos_doc_cxpagar (SDCP_TIPOREF, SDCP_IDREF, SDCP_FECHA, TERC_NIT, SDCP_RTEFTE, SDCP_RTIVA, SDCP_RTICA, SDCP_ABONO, SDCP_ABRTFTE, SDCP_ABRTIVA, SDCP_ABRTICA, SDCP_DEBITO, SDCP_MONTO, SDCP_TRM)
            VALUES (24, NEW.DVCO_ID, NEW.DVCO_fecha, NEW.terc_nit, (NEW.DVCO_rtftemonto*-1), (NEW.DVCO_rtivamonto*-1), (NEW.DVCO_rticamonto*-1), 0, 0, 0, 0, 'N', (NEW.DVCO_TOTAL*-1), NEW.dvco_trm);
        /* Registre el movimiento del cliente */
        CONC = 'DEVOLUCION COMPRA No.' || NEW.PREF_PRE || NEW.DVCO_NUMERO;
        INSERT INTO movimiento_proveedor (MVPR_ID, TERC_NIT, MVPR_TIPOREF, MVPR_IDREF, MVPR_FECHA, MVPR_VENCE, MVPR_CONC, MVPR_MONTO, MVPR_RTFTE, MVPR_RTIVA, MVPR_RTICA, MVPR_DEBITO, MVPR_ABONO, MVPR_PREFIJO, MVPR_NUMERO, MVPR_TRM)
          VALUES (GEN_ID(ID_MOVPROV, 1), NEW.TERC_NIT, 24, NEW.DVCO_ID, NEW.DVCO_FECHA, NEW.DVCO_FECHA, :CONC, NEW.DVCO_TOTAL, NEW.DVCO_RTFTEMONTO, NEW.DVCO_RTIVAMONTO, NEW.DVCO_RTICAMONTO, 'N', 'N', NEW.pref_pre, NEW.DVCO_numero, NEW.dvco_trm);
        END
    /* ACTUALICE LA CONSOLIDACION */
    if (NEW.DVCO_CONSOLIDA <> 0) then
        UPDATE consolidado_faltantes SET COFA_IDDES = NEW.dvco_id, COFA_OK = 'S' WHERE COFA_ID = NEW.dvco_consolida;
    INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
        VALUES (USER, 24, NEW.dvco_id, 'I', NEW.pref_pre || NEW.dvco_numero);
    END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER DEVOLUCIONES_COMPRAS_AU FOR DEVOLUCIONES_COMPRAS
ACTIVE AFTER UPDATE POSITION 0
AS
declare variable ABONOS integer;
declare variable CONC VARCHAR(60);
declare variable consec INTEGER;
declare variable CXP CHAR(2);
BEGIN
/* BORRE LA CONTABILIZACION */
if (new.dvco_anulado = 'S') then
    begin
    select enco_consec from comprobante_encabezado where enco_tiporef = 24 and enco_idref = old.dvco_id into :consec;
    if (NOT consec is null) then
      delete from comprobante_detalle where enco_consec = :consec;
    delete from comprobante_encabezado where enco_tiporef = 24 and enco_idref = old.dvco_id;
    INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
        VALUES (USER, 24, NEW.dvco_id, 'A', NEW.pref_pre || NEW.dvco_numero);
    end

/* deshaga lo viejo y gabe lo nuevo*/
if ((old.DVCO_id <> 0) and (old.dvco_anulado = 'N')) then
    begin
    /* Verifique si habia abonos a la nota */
    ABONOS = 0;
    select COUNT(*) FROM saldos_doc_cxpagar WHERE SDCP_TIPOREF = 24 AND SDCP_IDREF = OLD.DVCO_ID AND SDCP_ABONO <> 0 INTO :ABONOS;
    if (ABONOS = 0) then
        BEGIN
        /* BORRE EL REGISTRO PREVIO */
        delete from saldos_doc_cxpagar where sdcp_tiporef = 24 and sdcp_idref = old.dvco_id;
        delete from movimiento_proveedor where (mvpr_tiporef = 24) and (mvpr_idref = old.dvco_id);
        /* ACTUALICE LA CONSOLIDACION */
        if (OLD.DVCO_CONSOLIDA <> 0) then
            UPDATE consolidado_faltantes SET COFA_OK = 'N' WHERE COFA_ID = OLD.dvco_consolida;
        END
    else
        exception DOCUMENTO_CON_ABONOS 'La devolución ' || old.pref_pre || old.dvco_numero || 'tiene abonos registrados.';
    END
/* registre lo nuevo */
if ((new.DVCO_id <> 0) and (new.dvco_anulado = 'N')) then
    begin
    execute procedure lee_configuracion ('COMPRAS', 'DEVOLUCIONES', 'AFECTAR CUENTAS POR PAGAR CON LA DEVOLUCION AL PROVEEDOR') returning_values (CXP);
    if (CXP = 'SI') then
        BEGIN
        /* Registre el nuevo saldo del documento */
        INSERT INTO saldos_doc_cxpagar (SDCP_TIPOREF, SDCP_IDREF, SDCP_FECHA, TERC_NIT, SDCP_RTEFTE, SDCP_RTIVA, SDCP_RTICA, SDCP_ABONO, SDCP_ABRTFTE, SDCP_ABRTIVA, SDCP_ABRTICA, SDCP_DEBITO, SDCP_MONTO, SDCP_TRM)
            VALUES (24, NEW.DVCO_ID, NEW.DVCO_fecha, NEW.terc_nit, (NEW.DVCO_rtftemonto*-1), (NEW.DVCO_rtivamonto*-1), (NEW.DVCO_rticamonto*-1), 0, 0, 0, 0, 'N', (NEW.DVCO_TOTAL*-1), NEW.dvco_trm);
        /* Registre el movimiento del cliente */
        CONC = 'DEVOLUCION COMPRA No.' || NEW.PREF_PRE || NEW.DVCO_NUMERO;
        INSERT INTO MOVIMIENTO_PROVEEDOR (MVPR_ID, TERC_NIT, MVPR_TIPOREF, MVPR_IDREF, MVPR_FECHA, MVPR_VENCE, MVPR_CONC, MVPR_MONTO, MVPR_RTFTE, MVPR_RTIVA, MVPR_RTICA, MVPR_DEBITO, MVPR_ABONO, MVPR_PREFIJO, MVPR_NUMERO, MVPR_TRM)
            VALUES (GEN_ID(ID_MOVPROV, 1), NEW.TERC_NIT, 24, NEW.DVCO_ID, NEW.DVCO_FECHA, NEW.DVCO_FECHA, :CONC, NEW.DVCO_TOTAL, NEW.DVCO_RTFTEMONTO, NEW.DVCO_RTIVAMONTO, NEW.DVCO_RTICAMONTO, 'N', 'N', NEW.pref_pre, NEW.DVCO_numero, NEW.dvco_trm);
        END
    /* ACTUALICE LA CONSOLIDACION */
    if (NEW.DVCO_CONSOLIDA <> 0) then
        UPDATE consolidado_faltantes SET COFA_IDDES = NEW.dvco_id, COFA_OK = 'S' WHERE COFA_ID = NEW.dvco_consolida;
    INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
        VALUES (USER, 24, NEW.dvco_id, 'U', NEW.pref_pre || NEW.dvco_numero);
    END
/* si cambio un dato critico actualice el detalle */
if ((OLD.dvco_fecha <> NEW.dvco_fecha) or
    (OLD.dvco_numero <> NEW.dvco_numero) or
    (OLD.pref_pre <> NEW.pref_pre) ) then
    UPDATE devoluciones_compras_det SET DVCD_TRANSMIT = 'N'
      WHERE DVCO_ID = OLD.dvco_id;
/* ACTUALICE EL ANULADO EN LOS DETALLES */
if (OLD.DVCO_anulado <> NEW.DVCO_anulado) then
    UPDATE devoluciones_compras_det SET DVCD_ANULADO = NEW.DVCO_anulado
        WHERE DVCO_ID = NEW.DVCO_ID;
if (OLD.dvco_transmit <> NEW.dvco_transmit) then
    UPDATE devoluciones_compras_det SET DVCD_TRANSMIT = NEW.dvco_transmit
        WHERE DVCO_ID = NEW.DVCO_ID;
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(6),
    FECHA date,
    NIT varchar(20),
    NUMPROV varchar(10),
    NOMTERCERO varchar(60),
    SUBTOTAL numeric(18,2),
    DTOMONTO numeric(18,2),
    ADICIONAL numeric(18,2),
    IVAMONTO numeric(18,2),
    CONSUMO numeric(18,2),
    EXENTOS numeric(18,2),
    IVA1 numeric(18,2),
    IVA2 numeric(18,2),
    IVA3 numeric(18,2),
    GRAVADOS1 numeric(18,2),
    GRAVADOS2 numeric(18,2),
    GRAVADOS3 numeric(18,2),
    EXTRA numeric(18,2),
    TOTAL numeric(18,2),
    RTFTEMONTO numeric(18,2),
    RTIVAMONTO numeric(18,2),
    RTICAMONTO 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);
BEGIN
/* FACTURA */
TIPO = 21;
SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 21 INTO :NOMTIPO;

FOR SELECT FACO_ID, PREF_PRE, FACO_NUMERO, FACO_FECHA, TERC_NIT, FACO_ADICIONAL-FACO_DTOMONTO, FACO_IVAMONTO, FACO_RTFTEMONTO, FACO_RTIVAMONTO, FACO_RTICAMONTO, FACO_EXTRA, FACO_TOTAL, FACO_ANULADO, FACO_NUMPROV
    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, :EXTRA, :TOTAL, :ANULADO, :numprov
    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
        if ((ANULADOS = 'S') or (ANULADO = 'N')) then
            BEGIN
            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;
              END
            ELSE
              BEGIN
              SELECT SUM(FCDE_TOTAL - FCDE_IVAMONTO - FCDE_CONSUMO) FROM FACTURAS_COMPRAS_DETALLE D WHERE FACO_ID = :ID AND FCDE_IVAPORC = 0 INTO :EXENTOS;
              SELECT SUM(FCDE_TOTAL - FCDE_IVAMONTO - FCDE_CONSUMO), SUM(FCDE_IVAMONTO) FROM FACTURAS_COMPRAS_DETALLE D, TARIFA_IVA T WHERE FACO_ID = :ID AND FCDE_IVAPORC = TAIV_PORC AND TAIV_COD = 1 INTO :GRAVADOS1, :IVA1;
              SELECT SUM(FCDE_TOTAL - FCDE_IVAMONTO - FCDE_CONSUMO), SUM(FCDE_IVAMONTO) FROM FACTURAS_COMPRAS_DETALLE D, TARIFA_IVA T WHERE FACO_ID = :ID AND FCDE_IVAPORC = TAIV_PORC AND TAIV_COD = 2 INTO :GRAVADOS2, :IVA2;
              SELECT SUM(FCDE_TOTAL - FCDE_IVAMONTO - FCDE_CONSUMO), SUM(FCDE_IVAMONTO) FROM FACTURAS_COMPRAS_DETALLE D, TARIFA_IVA T WHERE FACO_ID = :ID AND FCDE_IVAPORC = TAIV_PORC AND TAIV_COD = 3 INTO :GRAVADOS3, :IVA3;

              SELECT SUM(FCDE_CONSUMO) FROM FACTURAS_COMPRAS_DETALLE WHERE FACO_ID = :ID INTO :CONSUMO;
              SUBTOTAL = TOTAL - EXTRA - IVAMONTO - DTOMONTO;
              NETO = TOTAL - RTFTEMONTO - RTIVAMONTO - RTICAMONTO;
              END
            if (exentos is null) then
                exentos = 0;
            if (gravados1 is null) then
                gravados1 = 0;
            if (gravados2 is null) then
                gravados2 = 0;
            if (gravados3 is null) then
                gravados3 = 0;
            if (iva1 is null) then
                iva1 = 0;
            if (iva2 is null) then
                iva2 = 0;
            if (iva3 is null) then
                iva3 = 0;
            if (consumo is null) then
                consumo = 0;
            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_EXTRA, DVCO_TOTAL, DVCO_ANULADO, ''
    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, :EXTRA, :TOTAL, :ANULADO, :numprov
    DO
    BEGIN
    if ((PREFIJO = '') or (PREFIJO IS NULL) or (PREF = PREFIJO)) then
        if ((ANULADOS = 'S') or (ANULADO = 'N')) then
            BEGIN
            SELECT TERC_NOM, TERC_EXENTO FROM TERCEROS WHERE TERC_NIT = :NIT INTO :NOMTERCERO, :TER_EXENTO;
            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;
             END
            ELSE
             BEGIN
              DTOMONTO = DTOMONTO * -1;
              ADICIONAL = ADICIONAL * -1;
              IVAMONTO = IVAMONTO * -1;
              EXTRA = EXTRA * -1;
              TOTAL = TOTAL * -1;
              RTFTEMONTO = RTFTEMONTO * -1;
              RTIVAMONTO = RTIVAMONTO * -1;
              RTICAMONTO = RTICAMONTO * -1;
              /* CALCULE LAS DIFERENTES TARIFAS */
               SELECT SUM(DVCD_TOTAL - DVCD_IVAMONTO - DVCD_CONSUMO) FROM DEVOLUCIONES_COMPRAS_DET D WHERE DVCO_ID = :ID AND DVCD_IVAPORC = 0 INTO :EXENTOS;
               SELECT SUM(DVCD_TOTAL - DVCD_IVAMONTO - DVCD_CONSUMO), SUM(DVCD_IVAMONTO) FROM DEVOLUCIONES_COMPRAS_DET D, TARIFA_IVA T WHERE DVCO_ID = :ID AND DVCD_IVAPORC = TAIV_PORC AND TAIV_COD = 1 INTO :GRAVADOS1, :IVA1;
               SELECT SUM(DVCD_TOTAL - DVCD_IVAMONTO - DVCD_CONSUMO), SUM(DVCD_IVAMONTO) FROM DEVOLUCIONES_COMPRAS_DET D, TARIFA_IVA T WHERE DVCO_ID = :ID AND DVCD_IVAPORC = TAIV_PORC AND TAIV_COD = 2 INTO :GRAVADOS2, :IVA2;
               SELECT SUM(DVCD_TOTAL - DVCD_IVAMONTO - DVCD_CONSUMO), SUM(DVCD_IVAMONTO) FROM DEVOLUCIONES_COMPRAS_DET D, TARIFA_IVA T WHERE DVCO_ID = :ID AND DVCD_IVAPORC = TAIV_PORC AND TAIV_COD = 3 INTO :GRAVADOS3, :IVA3;

              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;
              SUBTOTAL = TOTAL - EXTRA - IVAMONTO - DTOMONTO;
              NETO = TOTAL - RTFTEMONTO - RTIVAMONTO - RTICAMONTO;
             END
            if (iva1 is null) then
                iva1 = 0;
            if (iva2 is null) then
                iva2 = 0;
            if (iva3 is null) then
                iva3 = 0;
            if (consumo is null) then
                consumo = 0;
            SUSPEND;
            END
    END

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, 0, NCPR_MONTO + NCPR_IVAMONTO, NCPR_ANULADO, '', NCPR_BASE0, NCPR_BASE1, NCPR_BASE2, NCPR_IVA1, NCPR_IVA2
       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, :EXTRA, :TOTAL, :ANULADO, :numprov, :exentos, :gravados1, :gravados2, :iva1, :iva2
       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
          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;
           END
          ELSE
           BEGIN
            if (GRAVADOS1 is NULL) then
              GRAVADOS1 = 0;
            ELSE
              GRAVADOS1 = GRAVADOS1 * -1;
            if (GRAVADOS2 is NULL) then
              GRAVADOS2 = 0;
            ELSE
              GRAVADOS2 = GRAVADOS2 * -1;
            if (iva1 is NULL) then
              iva1 = 0;
            ELSE
              iva1 = iva1 * -1;
            if (iva2 is NULL) then
              iva2 = 0;
            ELSE
              iva2 = iva2 * -1;
            GRAVADOS3 = 0;
            IVA3 = 0;
            DTOMONTO = DTOMONTO * -1;
            ADICIONAL = ADICIONAL * -1;
            IVAMONTO = IVAMONTO * -1;
            EXTRA = EXTRA * -1;
            TOTAL = TOTAL * -1;
            RTFTEMONTO = RTFTEMONTO * -1;
            RTIVAMONTO = RTIVAMONTO * -1;
            RTICAMONTO = RTICAMONTO * -1;
            CONSUMO = 0;
            SUBTOTAL = TOTAL - EXTRA - IVAMONTO - DTOMONTO;
            NETO = TOTAL - RTFTEMONTO - RTIVAMONTO - RTICAMONTO;
           END
         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, 0, NDPR_MONTO + NDPR_IVAMONTO, NDPR_ANULADO, NDPR_NUMPROV, NDPR_BASE0, NDPR_BASE1, NDPR_BASE2, NDPR_IVA1, NDPR_IVA2 
       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, :EXTRA, :TOTAL, :ANULADO, :numprov, :exentos, :gravados1, :gravados2, :iva1, :iva2
       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
          GRAVADOS3 = 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;
           END
          ELSE
           BEGIN
            GRAVADOS3 = 0;
            IVA3 = 0;
            SUBTOTAL = TOTAL - EXTRA - IVAMONTO - DTOMONTO;
            NETO = TOTAL - RTFTEMONTO - RTIVAMONTO - RTICAMONTO;
           END
         suspend;
         END
       END
    END
END
^

SET TERM ; ^


/* 20100325B */
/* ACTUALIZAR CANTIDADES DE LA REMISION RELACIONADA A LA FACTURA */
INSERT INTO CONFIGURACION (CONF_MODULO, CONF_CATEGORIA, CONF_PROPIEDAD, CONF_VALOR, CONF_POSIBLES, CONF_AYUDA) VALUES ('COMPRAS', 'FACTURAS', 'ACTUALIZAR CANTIDADES DE LA REMISION RELACIONADA AL GRABAR LA FACTURA', 'NO', 'SI,NO', 'SI:Al grabar la factura se modifican los costos de la remisión previamente registrada asociada a la factura');
COMMIT WORK;

SET TERM ^ ;

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

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

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

    /* ACTUALICE EL PENDIENTE  */
    if (CONSOLIDA <> 0) then
        BEGIN
        UPDATE consolidado_faltantes SET COFA_OK = 'S' WHERE COFA_ID = :consolida AND COFA_ITEM = NEW.FCDE_ITEM AND ARTI_COD = NEW.arti_cod;
        EXECUTE procedure LEE_CONFIGURACION ('COMPRAS','DOCUMENTOS','SUMAR CANTIDADES PENDIENTES AL CONSOLIDAR DOCUMENTOS') returning_values (CONSO);
        /* IGNORE LA CONSOLIDACION SI SE VALIDAN CODIGOS DE LA ORDEN */
        SELECT MIN(CEFA_TIPOORI) FROM consolide_faltantes WHERE CEFA_ID = :CONSOLIDA INTO :NUMROWS;
        if (NUMROWS = 23) then
            BEGIN
            EXECUTE PROCEDURE LEE_CONFIGURACION('COMPRAS', 'FACTURAS', 'VERIFICAR CODIGOS DE LA ORDEN') returning_values (MENORV);
            if (MENORV = 'SI') then
                CONSO = 'NO';
            END
        SELECT COUNT(CEFA_ITEM) FROM consolide_faltantes WHERE CEFA_ID = :CONSOLIDA INTO :NUMROWS;
        if ((CONSO = 'SI') AND (NUMROWS > 1)) then
            UPDATE consolidado_faltantes SET COFA_IDDES = NEW.faco_id, COFA_OK = 'S' WHERE COFA_ID = :consolida;
        else
            BEGIN
            /* BUSQUE EL CONSOLIDADO EN EL MISMO ITEM Y SI ES DIFERENTE ACTUALICELO */
            select COFA_CANT * COFA_FACTOR FROM consolidado_faltantes WHERE COFA_ID = :consolida AND COFA_ITEM = NEW.FCDE_ITEM AND ARTI_COD = NEW.arti_cod INTO :CANTREL;
            if (NEW.FCDE_CANT * NEW.FCDE_FACTOR < CANTREL) then
                UPDATE consolidado_faltantes SET COFA_IDDES = NEW.faco_id, COFA_CANT = NEW.FCDE_CANT, COFA_FACTOR = NEW.FCDE_FACTOR
                    WHERE COFA_ID = :consolida AND COFA_ITEM = NEW.FCDE_ITEM AND ARTI_COD = NEW.arti_cod;
            END
        END
    /* ACTUALICE EL STAND */
    if (new.fcde_stand is not null) then
      if (exists(select stand_cod from stands where arti_cod = new.arti_cod and stand_bodega = new.bode_cod)) then
        UPDATE stands set stand_cod = new.fcde_stand where arti_cod = new.arti_cod and stand_bodega = new.bode_cod;
      else
        INSERT INTO stands (ARTI_COD, STAND_BODEGA, STAND_COD) VALUES (NEW.arti_cod, NEW.bode_cod, NEW.fcde_stand);
    END
END
^

SET TERM ; ^

SET TERM ^ ;

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

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

        if (CONSOLIDA <> 0) then
            begin
            UPDATE consolidado_faltantes SET COFA_OK = 'S' WHERE COFA_ID = :consolida AND COFA_ITEM = NEW.FCDE_ITEM AND ARTI_COD = NEW.arti_cod;
            EXECUTE procedure LEE_CONFIGURACION ('COMPRAS','DOCUMENTOS','SUMAR CANTIDADES PENDIENTES AL CONSOLIDAR DOCUMENTOS') returning_values (CONSO);
            /* IGNORE LA CONSOLIDACION SI SE VALIDAN CODIGOS DE LA ORDEN */
            SELECT MIN(CEFA_TIPOORI) FROM consolide_faltantes WHERE CEFA_ID = :CONSOLIDA INTO :NUMROWS;
            if (NUMROWS = 23) then
                BEGIN
                EXECUTE PROCEDURE LEE_CONFIGURACION('COMPRAS', 'FACTURAS', 'VERIFICAR CODIGOS DE LA ORDEN') returning_values (MENORV);
                if (MENORV = 'SI') then
                    CONSO = 'NO';
                END
            SELECT COUNT(CEFA_ITEM) FROM consolide_faltantes WHERE CEFA_ID = :CONSOLIDA INTO :NUMROWS;
            if ((CONSO = 'SI') AND (NUMROWS > 1)) then
                UPDATE consolidado_faltantes SET COFA_IDDES = NEW.faco_id, COFA_OK = 'S' WHERE COFA_ID = :consolida;
            else
                BEGIN
                /* BUSQUE EL CONSOLIDADO EN EL MISMO ITEM Y SI ES DIFERENTE ACTUALICELO */
                select COFA_CANT * COFA_FACTOR FROM consolidado_faltantes WHERE COFA_ID = :consolida AND COFA_ITEM = NEW.FCDE_ITEM AND ARTI_COD = NEW.arti_cod INTO :CANTREL;
                if (NEW.FCDE_CANT * NEW.FCDE_FACTOR < CANTREL) then
                    UPDATE consolidado_faltantes SET COFA_IDDES = NEW.faco_id, COFA_CANT = NEW.FCDE_CANT, COFA_FACTOR = NEW.FCDE_FACTOR
                        WHERE COFA_ID = :consolida AND COFA_ITEM = NEW.FCDE_ITEM AND ARTI_COD = NEW.arti_cod;
                END
            end
        /* ACTUALICE EL STAND */
        if (new.fcde_stand is not null) then
          if (exists(select stand_cod from stands where arti_cod = new.arti_cod and stand_bodega = new.bode_cod)) then
            UPDATE stands set stand_cod = new.fcde_stand where arti_cod = new.arti_cod and stand_bodega = new.bode_cod;
          else
            INSERT INTO stands (ARTI_COD, STAND_BODEGA, STAND_COD) VALUES (NEW.arti_cod, NEW.bode_cod, NEW.fcde_stand);
        END
    end
END
^

SET TERM ; ^


/* 20100325C */
/* no permitir traer varias veces un documento relacionado asi tenga pendientes */

SET TERM ^ ;

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

SET TERM ; ^



/* 20100325D */
/* ALGUNOS CONCEPTOS SON DE SALDO INICIAL Y NO FINAL */

SET TERM ^ ;

ALTER PROCEDURE MM_1011 (
    inicio char(8),
    final char(8))
as
declare variable concepto integer;
declare variable saldo numeric(18,0);
declare variable saldoaux numeric(18,0);
declare variable item integer;
declare variable ano char(4);
declare variable cuenta varchar(20);
begin
ITEM = 1;
ANO = SUBSTR(INICIO,1,4);
FOR SELECT COME_ITEM, COME_RESPUESTA FROM CONFIGURA_MEDIOSMAG
    WHERE COME_FORMATO = '1011'
    ORDER BY COME_RESPUESTA INTO :ITEM, :CONCEPTO
    DO
    BEGIN
    SALDO = 0;
    FOR SELECT mmcu_cuenta FROM mediosmag_cuentas
        WHERE mmcu_item = :item INTO :cuenta
        DO
        BEGIN
        if ((CONCEPTO = '1401') or (CONCEPTO = '1413'))  then
            EXECUTE PROCEDURE saldo_cuenta (CUENTA, INICIO) returning_values (SALDOAUX);
        ELSE
            EXECUTE PROCEDURE saldo_cuenta (CUENTA, FINAL) returning_values (SALDOAUX);
        SALDO = SALDO + SALDOAUX;
        END
    if (saldo <> 0) then
        begin
        insert into medios_magneticos_datos (memg_formato, memg_ano, memg_item, memg_concepto, memg_pago)
            values (1011, :ANO, :item,  :concepto, ABS(:SALDO));
        ITEM = ITEM + 1;
        end
    END
end
^

SET TERM ; ^

/* 20100325E */
/* BASE POSITIVA SI TERCERO NO ES PROVEEDOR */
SET TERM ^ ;

CREATE OR ALTER procedure CONTABIL_EGRESO (
    IDDOC integer,
    IDINTER integer)
returns (
    ERROR integer,
    VER char(1),
    IDC integer)
AS
declare variable PREF VARCHAR(4);
declare variable NUM VARCHAR(6);
declare variable FECAUX DATE;
declare variable FECHA CHAR(8);
declare variable CONC CHAR(120);
declare variable VRDTO NUMERIC(18, 2);
declare variable VRRTFTE NUMERIC(18, 2);
declare variable VRRTIVA NUMERIC(18, 2);
declare variable VRRTICA NUMERIC(18, 2);
declare variable VRTOTAL NUMERIC(18, 2);
declare variable TIPOCOMP VARCHAR(3);
declare variable PREFCONT VARCHAR(4);
declare variable BASE CHAR(1);
declare variable CTABASE VARCHAR(20);
declare variable CAJA CHAR(1);
declare variable CTACAJA VARCHAR(20);
declare variable RTFTE CHAR(1);
declare variable CTARTFTE VARCHAR(20);
declare variable RTIVA CHAR(1);
declare variable CTARTIVA VARCHAR(20);
declare variable RTICA CHAR(1);
declare variable CTARTICA VARCHAR(20);
declare variable DTO CHAR(1);
declare variable CTADTO VARCHAR(20);
declare variable EXISTE CHAR(1);
declare variable CUENTA VARCHAR(20);
declare variable MONTO NUMERIC(18,2);
declare variable ES_RETENCION CHAR(1);
declare variable TIPOCUEN CHAR(1);
declare variable NIT VARCHAR(20);
declare variable PROY VARCHAR(4);
declare variable CENTRO VARCHAR(4);
declare variable MONTOBASE NUMERIC(18,2);
declare variable PORC NUMERIC(9,2);
declare variable DEBITO NUMERIC(18,2);
declare variable CREDITO NUMERIC(18,2);
declare variable NROI INTEGER;
declare variable SUMA NUMERIC(18,2);
declare variable TCTACLIEN VARCHAR(20);
declare variable TCTARTFTE VARCHAR(20);
declare variable TCTARTIVA VARCHAR(20);
declare variable TCTARTICA VARCHAR(20);
declare variable TCTACART VARCHAR(20);
declare variable TIPOIT INTEGER;
declare variable IDIT INTEGER;
declare variable PREFIT VARCHAR(4);
declare variable NUMIT VARCHAR(6);
declare variable NUMEROIT VARCHAR(10);
declare variable ABONOIT NUMERIC(18,2);
declare variable CTADIC VARCHAR(20);
declare variable BASEADIC VARCHAR(20);
declare variable PORCADIC NUMERIC(5,2);
declare variable VALORADIC NUMERIC(18,2);
declare variable DBADIC CHAR(1);
declare variable VRBASE NUMERIC(18,2);
declare variable GMF CHAR(1);
declare variable CODBCO INTEGER;
declare variable NUMCHEQ VARCHAR(20);
declare variable CRUCES NUMERIC(18,2);
declare variable VRCAJA NUMERIC(18,2);
declare variable OK INTEGER;
declare variable DIFCAMBIO NUMERIC(18,2);
declare variable CTADIF VARCHAR(20);
declare variable RTFTEC NUMERIC(18,2);
declare variable RTIVAC NUMERIC(18,2);
declare variable RTICAC NUMERIC(18,2);
declare variable RTFTER CHAR(1);
declare variable CTARTFTER VARCHAR(20);
declare variable RTIVAR CHAR(1);
declare variable CTARTIVAR VARCHAR(20);
declare variable RTICAR CHAR(1);
declare variable CTARTICAR VARCHAR(20);
declare variable RET CHAR(2);
declare variable RTIT NUMERIC(18,2);
declare variable NITBCO VARCHAR(20);
declare variable NUMPROV CHAR(8);
BEGIN
/* BUSQUE LA INTERFACE */
EXISTE = 'N';
SELECT 'S', TICO_COD, PRCO_PRE, INCJ_BASE, INCJ_DTOPP, INCJ_RTFTE, INCJ_RTIVA, INCJ_RTICA, INCJ_CAJA, INCJ_CTABASE, INCJ_CTADTO, INCJ_CTARTFTE, INCJ_CTARTIVA, INCJ_CTARTICA, INCJ_CTACAJA, INCJ_CONFIRMAR
    FROM INTERFAZ_CAJA
    WHERE INCJ_ID = :IDINTER
    INTO :EXISTE, :TIPOCOMP, :PREFCONT, :BASE, :DTO, :RTFTE, :RTIVA, :RTICA, :CAJA, :CTABASE, :CTADTO, :CTARTFTE, :CTARTIVA, :CTARTICA, :CTACAJA, :VER;
if (EXISTE = 'S') then
    BEGIN
    OK = 0;
    FOR SELECT CNTB_ID FROM CONTABILIZACION WHERE CNTB_TIPOREF = 62 AND CNTB_IDREF = :IDDOC INTO :OK DO
        BEGIN
        DELETE FROM CONTABILIZACION_DET WHERE CNTB_ID = :OK;
        DELETE FROM CONTABILIZACION WHERE CNTB_ID = :OK;
        END

    /* TRAIGA EL ENCABEZADO DEL EGRESO */
    SELECT PREF_PRE, EGRE_NUMERO, EGRE_FECHA, E.TERC_NIT, EGRE_CONC, EGRE_DTOF, EGRE_MONTO, EGRE_RTFTEMONTO, EGRE_RTIVAMONTO, EGRE_RTICAMONTO, TERC_CTARTFTE, TERC_CTARTIVA, TERC_CTARTICA, TERC_CTACLIENTE
        FROM EGRESOS E, TERCEROS T
        WHERE EGRE_ID = :IDDOC AND E.TERC_NIT = T.TERC_NIT
        INTO :PREF, :NUM, :FECAUX, :NIT, :CONC, :VRDTO, :VRTOTAL, :VRRTFTE, :VRRTIVA, :VRRTICA, :TCTARTFTE, TCTARTIVA, TCTARTICA, TCTACLIEN;
    /* SI ES PROVEEDOR, SOBREESCIBE LAS CUENTAS  */
    SELECT PROV_CTAPAGAR, PROV_CTARTFTE, PROV_CTARTIVA, PROV_CTARTICA
        FROM PROVEEDORES WHERE TERC_NIT = :NIT
        INTO TCTACLIEN, TCTARTFTE, TCTARTIVA, TCTARTICA;
    SELECT PREF_CENTRO, PREF_PROY FROM PREFIJOS
        WHERE PREF_PRE = :PREF AND TIDO_COD = 62 INTO :CENTRO, :PROY;
    EXECUTE PROCEDURE FECHA_A_CONTA(:FECAUX) returning_values (:FECHA);
    /* REGISTRE EL ENCABEZADO CONTABLE */
    IDC = GEN_ID(ID_CONTABILIZA, 1);
    INSERT INTO CONTABILIZACION (CNTB_ID, CNTB_TIPOCOMP, CNTB_PREFCNT, CNTB_NUMERO, CNTB_FECHA, CNTB_CONCEPTO, CNTB_REF, CNTB_TIPOREF, CNTB_IDREF, CNTB_PREFREF, CNTB_NUMREF, CNTB_PROCESADO)
        VALUES (:IDC, :TIPOCOMP, :PREFCONT, :NUM, :FECHA, :CONC, '', 62, :IDDOC, :PREF, :NUM, 'N');
    /* SUME LOS CRUCES PARA LLEVARLOS A LA CUENTA X PAGAR Y RESTAR DE LA CAJA */
    SELECT SUM(EGCC_ABONO) FROM EGRESOS_CRUCEC WHERE EGRE_ID = :iddoc INTO :CRUCES;
    if (CRUCES IS NULL) then
        CRUCES = 0;
    VRCAJA = VRTOTAL;
    NROI = 0;
    SUMA = 0;
    ERROR = 0;
    /* EL CREDITO EN LA CAJA O EL BANCO */
    IF ((CAJA = 'K')) THEN
        BEGIN
        if (VRCAJA <> 0) then
            BEGIN
            CUENTA = NULL;
            EXECUTE PROCEDURE VALIDE_CUENTA_C (CTACAJA) RETURNING_VALUES (:OK);
            IF (OK = 0) THEN
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :CTACAJA INTO :CUENTA, :TIPOCUEN;
            ELSE
                begin
                EXECUTE PROCEDURE ERROR (62, :IDDOC, :CTACAJA, 2);
                CUENTA = CTACAJA;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 4);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRCAJA, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - VRCAJA;
                END
            END /* VRCAJA <> 0 */
        END /* CAJA CONSTANTE */
    IF ((CAJA = 'F')) THEN
        BEGIN
        /* mueva la cuenta de la caja o el banco o ambas */
        /* PRIMERO LA CAJA */
        FOR SELECT CAJA_CUENTA, EGCA_MONTO FROM EGRESOS_CAJA E, CAJAS C
            WHERE C.CAJA_ID = E.CAJA_ID AND EGRE_ID = :IDDOC
            INTO :CTACAJA, :MONTO
            DO
            BEGIN
            if (MONTO <> 0) then
                BEGIN
                CUENTA = NULL;
                EXECUTE PROCEDURE VALIDE_CUENTA_C (CTACAJA) RETURNING_VALUES (:OK);
                IF (OK = 0) THEN
                    SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                        WHERE CUEN_COD = :CTACAJA INTO :CUENTA, :TIPOCUEN;
                ELSE
                    begin
                    EXECUTE PROCEDURE ERROR (62, :IDDOC, :CTACAJA, 2);
                    CUENTA = CTACAJA;
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 4);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA - MONTO;
                    END
                END /* MONTO <> 0 */
            END /* DO CAJA */
        /* AHORA EL BANCO */
        MONTO = 0;
        SELECT CUBA_CTACONTA, EGBC_MONTO, EGBC_GMF, E.CUBA_COD, CUBA_GMFPOR, EGBC_NUMERO, BANC_NIT
            FROM EGRESOS_BANCO E, CUENTAS_BANCO C, BANCOS B
            WHERE E.CUBA_COD = C.CUBA_COD AND EGRE_ID = :IDDOC AND B.banc_cod = C.banc_cod
            INTO :CTACAJA, :MONTO, :GMF, :CODBCO, :PORC, :NUMCHEQ, :nitbco;
        if (MONTO <> 0) then
            BEGIN
            if (MONTO <> 0) then
                BEGIN
                CUENTA = NULL;
                EXECUTE PROCEDURE VALIDE_CUENTA_C (CTACAJA) RETURNING_VALUES (:OK);
                IF (OK = 0) THEN
                    SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                        WHERE CUEN_COD = :CTACAJA INTO :CUENTA, :TIPOCUEN;
                ELSE
                    begin
                    EXECUTE PROCEDURE ERROR (62, :IDDOC, :CTACAJA, 2);
                    CUENTA = CTACAJA;
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 4);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, :NUMCHEQ, 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA - MONTO;
                    END
                /* EL GMF */
                if ((GMF = 'S') AND (PORC <> 0)) then
                    BEGIN
                    if (NITBCO IS NULL) then
                        NITBCO = NIT;
                    EXECUTE procedure REDONDEE(:MONTO * :PORC / 1000, 0) returning_values (MONTO);
                    /* REGISTRE EL GMF EN LA MISMA CUENTA DEL BANCO COMO CREDITO */
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, :NUMCHEQ, 0, :MONTO, 0, 0, :NITBCO, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA - MONTO;

                    /* AHORA LA CUENTA DEL GASTO */
                    SELECT CUBA_CTAGMF FROM CUENTAS_BANCO
                        where CUBA_COD = :CODBCO INTO :CTACAJA;
                    EXECUTE PROCEDURE VALIDE_CUENTA_C (CTACAJA) RETURNING_VALUES (:OK);
                    IF (OK = 0) THEN
                        SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                            WHERE CUEN_COD = :CTACAJA INTO :CUENTA, :TIPOCUEN;
                    ELSE
                        begin
                        EXECUTE PROCEDURE ERROR (62, :IDDOC, :CTACAJA, 2);
                        CUENTA = CTACAJA;
                        TIPOCUEN = 'N';
                        ERROR = ERROR + 1;
                        end
                    if (TIPOCUEN = 'I') then
                        BEGIN
                        EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
                        TIPOCUEN = 'N';
                        ERROR = ERROR + 1;
                        END
                    if (TIPOCUEN = 'C') then
                        BEGIN
                        EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 4);
                        TIPOCUEN = 'N';
                        ERROR = ERROR + 1;
                        END
                    if (TIPOCUEN = 'N') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, :NUMCHEQ, :MONTO, 0, 0, 0, :NITBCO, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NROI = NROI + 1;
                        SUMA = SUMA + MONTO;
                        END
                    END /* GMF */
                END /* MONTO <> 0 */
            END /* EGRESO_BANCO */
        END /* CAJA = F */

    /* LOS CRUCES CON CUENTAS X COBRAR */
    if (CRUCES <> 0) then
        BEGIN
        SELECT TERC_CTACLIENTE FROM TERCEROS WHERE TERC_NIT = :nit INTO :tctacart;
        if (tctacart IS NULL) then
            tctacart = tctaclien;
        CUENTA = NULL;
        EXECUTE PROCEDURE VALIDE_CUENTA_C (tctacart) RETURNING_VALUES (:OK);
        IF (OK = 0) THEN
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :tctacart INTO :CUENTA, :TIPOCUEN;
        ELSE
            begin
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :tctacart, 2);
            CUENTA = tctacart;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            /* DEBERIA RECORRER DOCUMENTO POR DOCUMENTO */
            FOR SELECT EGCC_TIPODOC, EGCC_PREFIJO, EGCC_NUMERO, EGCC_ABONO+EGCC_RTFTE+EGCC_RTIVA+EGCC_RTICA+EGCC_DTOF
                FROM egresos_crucec WHERE EGRE_ID = :IDDOC
                INTO :TIPOIT, PREFIT, NUMIT, ABONOIT
                DO
                BEGIN
                NUMEROIT = PREFIT || NUMIT;
                if (ABONOIT > 0) then
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :ABONOIT, 0, 0, :NIT, :PROY, :CENTRO, NULL, :NUMEROIT, NULL, NULL, :TIPOIT, 0);
                else
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', abs(:ABONOIT), 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, :NUMEROIT, NULL, NULL, :TIPOIT, 0);
                SUMA = SUMA - ABONOIT;
                NROI = NROI + 1;
                END
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            if (CRUCES > 0) then
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :CRUCES, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            else
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', abs(:CRUCES), 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            SUMA = SUMA - CRUCES;
            NROI = NROI + 1;
            END
        /* LA DIFERENCIA EN CAMBIO */
        SELECT SUM(EGCC_DIFCAMBIO) FROM egresos_crucec WHERE EGRE_ID = :iddoc INTO :DIFCAMBIO;
        IF ((DIFCAMBIO IS NOT NULL) AND (DIFCAMBIO <> 0)) THEN
            BEGIN
            if (DIFCAMBIO > 0) then
                execute procedure lee_configuracion('GENERAL','GENERAL','CUENTA DE INGRESO POR DIFERENCIA EN CAMBIO PARA OPERACIONES EN OTRA MONEDA') returning_values (:ctadif);
            else
                execute procedure lee_configuracion('GENERAL','GENERAL','CUENTA DE GASTO POR DIFERENCIA EN CAMBIO PARA OPERACIONES EN OTRA MONEDA') returning_values (:ctadif);
            CUENTA = NULL;
            EXECUTE PROCEDURE VALIDE_CUENTA_C (ctadif) RETURNING_VALUES (:OK);
            IF (OK = 0) THEN
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :ctadif INTO :CUENTA, :TIPOCUEN;
            ELSE
                begin
                EXECUTE PROCEDURE ERROR (62, :IDDOC, :ctadif, 2);
                CUENTA = ctadif;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 4);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                if (DIFCAMBIO > 0) then
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :difcambio, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                else
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', ABS(:difcambio), 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - difcambio;
                END
            END
        /* RETEFUENTE DEL CRUCE */
        SELECT first 1 INCJ_RTFTE, INCJ_RTIVA, INCJ_RTICA, INCJ_CTARTFTE, INCJ_CTARTIVA, INCJ_CTARTICA
            FROM INTERFAZ_CAJA WHERE tido_cod = 61 into :RTFTER, :RTIVAR, :RTICAR, :CTARTFTER, :CTARTIVAR, :CTARTICAR;
        SELECT SUM(EGCC_RTFTE) FROM egresos_crucec WHERE EGRE_ID = :iddoc INTO :rtftec;
        IF ((rtftec IS NOT NULL) AND (rtftec <> 0)) THEN
            BEGIN
            if ((RTFTER = 'T') or (RTFTER = 'K')) then
                BEGIN
                if (RTFTER = 'T') then
                    SELECT TERC_CTARTFTE FROM TERCEROS WHERE TERC_NIT = :NIT INTO CTARTFTER;
                CUENTA = NULL;
                EXECUTE PROCEDURE VALIDE_CUENTA_C (ctartfter) RETURNING_VALUES (:OK);
                IF (OK = 0) THEN
                    SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                        WHERE CUEN_COD = :ctartfter INTO :CUENTA, :TIPOCUEN;
                ELSE
                    begin
                    EXECUTE PROCEDURE ERROR (62, :IDDOC, :ctartfter, 2);
                    CUENTA = ctartfter;
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 4);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    if (rtftec > 0) then
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :rtftec, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    else
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, abs(:rtftec), 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA + rtftec;
                    END
                END
            END
        /* RETEIVA DEL CRUCE */
        SELECT SUM(EGCC_RTIVA) FROM egresos_crucec WHERE EGRE_ID = :iddoc INTO :rtivac;
        IF ((rtivac IS NOT NULL) AND (rtivac <> 0)) THEN
            BEGIN
            if ((RTIVAR = 'T') or (RTIVAR = 'K')) then
                BEGIN
                if (RTIVAR = 'T') then
                    SELECT TERC_CTARTIVA FROM TERCEROS WHERE TERC_NIT = :NIT INTO CTARTIVAR;
                CUENTA = NULL;
                EXECUTE PROCEDURE VALIDE_CUENTA_C (ctartivar) RETURNING_VALUES (:OK);
                IF (OK = 0) THEN
                    SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                        WHERE CUEN_COD = :ctartivar INTO :CUENTA, :TIPOCUEN;
                ELSE
                    begin
                    EXECUTE PROCEDURE ERROR (62, :IDDOC, :ctartivar, 2);
                    CUENTA = ctartivar;
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 4);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    if (rtivac > 0) then
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :rtivac, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    else
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, abs(:rtivac), 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA + rtivac;
                    END
                END
            END
        /* RETEICA DEL CRUCE */
        SELECT SUM(EGCC_RTICA) FROM egresos_crucec WHERE EGRE_ID = :iddoc INTO :rticac;
        IF ((rticac IS NOT NULL) AND (rtivac <> 0)) THEN
            BEGIN
            if ((RTICAR = 'T') or (RTICAR = 'K')) then
                BEGIN
                if (RTICAR = 'T') then
                    SELECT TERC_CTARTICA FROM TERCEROS WHERE TERC_NIT = :NIT INTO CTARTICAR;
                CUENTA = NULL;
                EXECUTE PROCEDURE VALIDE_CUENTA_C (ctarticar) RETURNING_VALUES (:OK);
                IF (OK = 0) THEN
                    SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                        WHERE CUEN_COD = :ctarticar INTO :CUENTA, :TIPOCUEN;
                ELSE
                    begin
                    EXECUTE PROCEDURE ERROR (62, :IDDOC, :ctarticar, 2);
                    CUENTA = ctarticar;
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 4);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    if (rticac > 0) then
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :rticac, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    else
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, abs(:rticac), 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA + rticac;
                    END
                END
            END
        END /* cruces */

    if (DTO = 'K') then /* DTO EN CTA CONSTANTE */
        BEGIN
        if (VRDTO <> 0) then
            BEGIN
            CUENTA = NULL;
            EXECUTE PROCEDURE VALIDE_CUENTA_C (CTADTO) RETURNING_VALUES (:OK);
            IF (OK = 0) THEN
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :CTADTO INTO :CUENTA, :TIPOCUEN;
            ELSE
                begin
                EXECUTE PROCEDURE ERROR (62, :IDDOC, :CTADTO, 2);
                CUENTA = CTADTO;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 4);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRDTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - VRDTO;
                END
            END /* VRDTO <> 0 */
        END /* DTO EN CTA CONSTANTE */

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

SET TERM ; ^


/* 20100326 */
/* CPN: INSTRUCCIONES PARA PEDIDOS Y ENTREGAS */
ALTER TABLE CLIENTES
ADD CLIE_PEDIDOS VARCHAR(255);

SET TERM ^ ;

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

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

SET TERM ; ^

/* 20100326B */
/* conserve el iddoc, prefijo y numero */

SET TERM ^ ;

ALTER PROCEDURE CONCILIA_BANCO(
    ID INTEGER)
AS
declare variable fecini date;
declare variable fecfin date;
declare variable item integer;
declare variable db char(1);
declare variable cuenta integer;
declare variable tipodoc integer;
declare variable iddoc integer;
declare variable prefijo varchar(4);
declare variable numero varchar(6);
declare variable fecha date;
declare variable concepto varchar(60);
declare variable monto numeric(18,2);
declare variable CONANT INTEGER;
declare variable CLASE CHAR(1);
begin
select CUBA_COD, COBN_FECINI, COBN_FECFIN FROM conciliacion_encabezado WHERE COBN_ID = :ID INTO :CUENTA, :FECINI, :FECFIN;
SELECT MAX(COBN_ITEM) FROM conciliacion_bancaria WHERE COBN_ID = :ID INTO :item;
/* AGREGUE LOS PENDIENTES DE LA ULTIMA CONCILIACION DE ESA CUENTA */
SELECT FIRST 1 COBN_ID FROM conciliacion_encabezado WHERE CUBA_COD = :CUENTA AND COBN_FECINI < :FECINI ORDER BY COBN_FECINI DESC INTO :CONANT;
FOR SELECT COBN_FEC, COBN_TIPODOC, COBN_DB, COBN_CONC, ABS(COBN_MONTO), COBN_CLASE, cobn_iddoc, cobn_prefijo, cobn_numero
    FROM conciliacion_bancaria
    WHERE COBN_OK = 'N' and COBN_ID = :CONANT
    INTO :fecha, :tipodoc, :db, :concepto, :monto, :clase, :iddoc, :prefijo, :numero
    DO
    BEGIN
    ITEM = ITEM + 1;
    INSERT INTO conciliacion_bancaria (CUBA_COD, COBN_ID, COBN_ITEM, COBN_FEC, COBN_PREFIJO, COBN_NUMERO, COBN_MONTO, COBN_TIPODOC, COBN_ANULADO, COBN_OK, COBN_CONC, COBN_IDDOC, COBN_DB, COBN_CLASE)
        VALUES (:CUENTA, :ID, :ITEM, :FECHA, :prefijo, :numero, :monto, :TIPODOC, 'N', 'N', :concepto, :iddoc, :DB, :clase);
    END

/* COMPARE LA TABLA CON LOS MOVIMIENTOS DEL BANCO */
FOR SELECT COBN_ITEM, ABS(COBN_MONTO), COBN_FEC, COBN_TIPODOC, COBN_DB, COBN_CONC
    FROM CONCILIACION_BANCARIA
    WHERE COBN_ID = :ID AND ((COBN_IDDOC = 0) or (cobn_iddoc is null))
    INTO :ITEM, :MONTO, :FECHA, :TIPODOC, :DB, :concepto
    DO
    BEGIN
    PREFIJO = '';
    NUMERO = '';
    IDDOC = 0;
    /* BUSQUE LA OPERACION  */
    if (TIPODOC <> 0) then
        BEGIN
        SELECT FIRST 1 MOBA_PREF, MOBA_NUMERO, MOBA_IDREF
            FROM movimiento_banco M WHERE MOBA_TIPODOC = :tipodoc AND MOBA_TOTAL = :MONTO AND M.cuba_cod = :cuenta AND MOBA_FECHA >= :FECINI AND MOBA_FECHA <= :FECFIN  AND
                NOT EXISTS (SELECT COBN_ITEM FROM CONCILIACION_DETALLE WHERE COBD_IDDOC = m.moba_idref AND COBD_TIPODOC = :tipodoc and COBN_ID = :ID)
            ORDER BY ABS(MOBA_FECHA - :FECHA)
            INTO :prefijo, :numero, :IDDOC;
        if (PREFIJO <> '') then
            BEGIN
            insert into conciliacion_detalle (COBN_ID, COBN_ITEM, COBN_DET, COBD_TIPODOC, COBD_IDDOC, COBD_PREFIJO, COBD_NUMERO, COBD_ANULADO)
                VALUES (:ID, :ITEM, 1, :TIPODOC, :IDDOC, :PREFIJO, :NUMERO, 'N');
            UPDATE conciliacion_bancaria SET COBN_OK = 'S', COBN_CLASE = '0',
                COBN_PREFIJO = :PREFIJO, COBN_NUMERO = :NUMERO
                WHERE COBN_ID = :ID AND COBN_ITEM = :ITEM;
            END
        ELSE
            BEGIN
            /* BUSQUELO COMO DEBITO O CREDITO SIN IMPORTAR EL TIPO */
            SELECT FIRST 1 MOBA_PREF, MOBA_NUMERO, MOBA_IDREF
                FROM movimiento_banco M WHERE MOBA_DB = :DB AND MOBA_TOTAL = :MONTO AND M.cuba_cod = :cuenta AND MOBA_FECHA >= :FECINI AND MOBA_FECHA <= :FECFIN AND
                    NOT EXISTS (SELECT COBN_ITEM FROM CONCILIACION_DETALLE WHERE COBD_IDDOC = m.moba_idref AND COBD_TIPODOC = :tipodoc and COBN_ID = :ID)
                ORDER BY ABS(MOBA_FECHA - :FECHA)
                INTO :prefijo, :numero, :IDDOC;
            if (PREFIJO <> '') then
                BEGIN
                insert into conciliacion_detalle (COBN_ID, COBN_ITEM, COBN_DET, COBD_TIPODOC, COBD_IDDOC, COBD_PREFIJO, COBD_NUMERO, COBD_ANULADO)
                    VALUES (:ID, :ITEM, 1, :TIPODOC, :IDDOC, :PREFIJO, :NUMERO, 'N');
                UPDATE conciliacion_bancaria SET COBN_PREFIJO = :PREFIJO, COBN_NUMERO = :NUMERO, COBN_IDDOC = :iddoc, COBN_OK = 'S', COBN_CLASE = '0'
                    WHERE COBN_ID = :ID AND COBN_ITEM = :ITEM;
                END
            ELSE
                BEGIN
                if (DB = 'N') then
                    UPDATE conciliacion_bancaria SET COBN_OK = 'N', COBN_CLASE = '2'
                        WHERE COBN_ID = :ID AND COBN_ITEM = :ITEM;
                else
                    UPDATE conciliacion_bancaria SET COBN_OK = 'N', COBN_CLASE = '1'
                        WHERE COBN_ID = :ID AND COBN_ITEM = :ITEM;
                END
            END
        END
    ELSE
        BEGIN
        /* BUSQUELO COMO DEBITO O CREDITO SIN IMPORTAR EL TIPO */
        SELECT FIRST 1 MOBA_PREF, MOBA_NUMERO, MOBA_IDREF, MOBA_TIPODOC
            FROM movimiento_banco M WHERE MOBA_DB = :DB AND MOBA_TOTAL = :MONTO AND M.cuba_cod = :cuenta AND MOBA_FECHA >= :FECINI AND MOBA_FECHA <= :FECFIN AND
                NOT EXISTS (SELECT COBN_ITEM FROM CONCILIACION_DETALLE WHERE COBD_IDDOC = m.moba_idref AND COBD_TIPODOC = :tipodoc and COBN_ID = :ID)
            ORDER BY ABS(MOBA_FECHA - :FECHA)
            INTO :prefijo, :numero, :IDDOC, :TIPODOC;
        if (PREFIJO <> '') then
            BEGIN
            insert into conciliacion_detalle (COBN_ID, COBN_ITEM, COBN_DET, COBD_TIPODOC, COBD_IDDOC, COBD_PREFIJO, COBD_NUMERO, COBD_ANULADO)
                VALUES (:ID, :ITEM, 1, :TIPODOC, :IDDOC, :PREFIJO, :NUMERO, 'N');
            UPDATE conciliacion_bancaria SET COBN_TIPODOC = :TIPODOC, COBN_OK = 'S', COBN_CLASE = '0',
                COBN_PREFIJO = :PREFIJO, COBN_NUMERO = :NUMERO
                WHERE COBN_ID = :ID AND COBN_ITEM = :ITEM;
            END
        ELSE
            BEGIN
            if (DB = 'N') then
                UPDATE conciliacion_bancaria SET COBN_OK = 'N', COBN_CLASE = '2'
                    WHERE COBN_ID = :ID AND COBN_ITEM = :ITEM;
            else
                UPDATE conciliacion_bancaria SET COBN_OK = 'N', COBN_CLASE = '1'
                    WHERE COBN_ID = :ID AND COBN_ITEM = :ITEM;
            END
        END
    END
/* AGREGUE LOS DOCUMENTOS SIN UBICAR */
FOR SELECT MOBA_PREF, MOBA_NUMERO, MOBA_FECHA, MOBA_TOTAL, MOBA_CONCEPTO, MOBA_TIPODOC, MOBA_IDREF, MOBA_DB
    FROM MOVIMIENTO_BANCO M
    WHERE MOBA_FECHA >= :FECINI AND MOBA_FECHA <= :FECFIN  AND M.cuba_cod = :cuenta AND
        NOT EXISTS (SELECT COBN_ITEM FROM CONCILIACION_DETALLE WHERE COBD_IDDOC = m.moba_idref AND COBD_TIPODOC = M.moba_tipodoc)
    INTO :prefijo, :numero, :fecha, :monto, :concepto, :tipodoc, :iddoc, :DB
    DO
    BEGIN
    ITEM = ITEM + 1;
    if (DB = 'N') then
        INSERT INTO conciliacion_bancaria (CUBA_COD, COBN_ID, COBN_ITEM, COBN_FEC, COBN_PREFIJO, COBN_NUMERO, COBN_MONTO, COBN_TIPODOC, COBN_ANULADO, COBN_OK, COBN_CONC, COBN_IDDOC, COBN_DB, COBN_CLASE)
            VALUES (:CUENTA, :ID, :ITEM, :FECHA, :PREFIJO, :NUMERO, :monto, :TIPODOC, 'N', 'N', :concepto, :iddoc, :DB, '4');
    else
        INSERT INTO conciliacion_bancaria (CUBA_COD, COBN_ID, COBN_ITEM, COBN_FEC, COBN_PREFIJO, COBN_NUMERO, COBN_MONTO, COBN_TIPODOC, COBN_ANULADO, COBN_OK, COBN_CONC, COBN_IDDOC, COBN_DB, COBN_CLASE)
            VALUES (:CUENTA, :ID, :ITEM, :FECHA, :PREFIJO, :NUMERO, :monto, :TIPODOC, 'N', 'N', :concepto, :iddoc, :DB, '3');
    END
end
^

SET TERM ; ^


/* 2010327 */
/* INDEPENDICE LA VARIBALE ITEM PARA CONSERVAR EL MAXIMO DESPUES DE RECORRER CONCILIANDO */

SET TERM ^ ;

ALTER PROCEDURE CONCILIA_BANCO(
    ID INTEGER)
AS
declare variable fecini date;
declare variable fecfin date;
declare variable item integer;
declare variable itemax integer;
declare variable db char(1);
declare variable cuenta integer;
declare variable tipodoc integer;
declare variable iddoc integer;
declare variable prefijo varchar(4);
declare variable numero varchar(6);
declare variable fecha date;
declare variable concepto varchar(60);
declare variable monto numeric(18,2);
declare variable CONANT INTEGER;
declare variable CLASE CHAR(1);
begin
select CUBA_COD, COBN_FECINI, COBN_FECFIN FROM conciliacion_encabezado WHERE COBN_ID = :ID INTO :CUENTA, :FECINI, :FECFIN;
SELECT MAX(COBN_ITEM) FROM conciliacion_bancaria WHERE COBN_ID = :ID INTO :itemax;
/* AGREGUE LOS PENDIENTES DE LA ULTIMA CONCILIACION DE ESA CUENTA */
SELECT FIRST 1 COBN_ID FROM conciliacion_encabezado WHERE CUBA_COD = :CUENTA AND COBN_FECINI < :FECINI ORDER BY COBN_FECINI DESC INTO :CONANT;
FOR SELECT COBN_FEC, COBN_TIPODOC, COBN_DB, COBN_CONC, ABS(COBN_MONTO), COBN_CLASE, cobn_iddoc, cobn_prefijo, cobn_numero
    FROM conciliacion_bancaria
    WHERE COBN_OK = 'N' and COBN_ID = :CONANT
    INTO :fecha, :tipodoc, :db, :concepto, :monto, :clase, :iddoc, :prefijo, :numero
    DO
    BEGIN
    ITEMAX = ITEMAX + 1;
    INSERT INTO conciliacion_bancaria (CUBA_COD, COBN_ID, COBN_ITEM, COBN_FEC, COBN_PREFIJO, COBN_NUMERO, COBN_MONTO, COBN_TIPODOC, COBN_ANULADO, COBN_OK, COBN_CONC, COBN_IDDOC, COBN_DB, COBN_CLASE)
        VALUES (:CUENTA, :ID, :ITEMAX, :FECHA, :prefijo, :numero, :monto, :TIPODOC, 'N', 'N', :concepto, :iddoc, :DB, :clase);
    END

/* COMPARE LA TABLA CON LOS MOVIMIENTOS DEL BANCO */
FOR SELECT COBN_ITEM, ABS(COBN_MONTO), COBN_FEC, COBN_TIPODOC, COBN_DB, COBN_CONC
    FROM CONCILIACION_BANCARIA
    WHERE COBN_ID = :ID AND ((COBN_IDDOC = 0) or (cobn_iddoc is null))
    INTO :ITEM, :MONTO, :FECHA, :TIPODOC, :DB, :concepto
    DO
    BEGIN
    PREFIJO = '';
    NUMERO = '';
    IDDOC = 0;
    /* BUSQUE LA OPERACION  */
    if (TIPODOC <> 0) then
        BEGIN
        SELECT FIRST 1 MOBA_PREF, MOBA_NUMERO, MOBA_IDREF
            FROM movimiento_banco M WHERE MOBA_TIPODOC = :tipodoc AND MOBA_TOTAL = :MONTO AND M.cuba_cod = :cuenta AND MOBA_FECHA >= :FECINI AND MOBA_FECHA <= :FECFIN  AND
                NOT EXISTS (SELECT COBN_ITEM FROM CONCILIACION_DETALLE WHERE COBD_IDDOC = m.moba_idref AND COBD_TIPODOC = :tipodoc and COBN_ID = :ID)
            ORDER BY ABS(MOBA_FECHA - :FECHA)
            INTO :prefijo, :numero, :IDDOC;
        if (PREFIJO <> '') then
            BEGIN
            insert into conciliacion_detalle (COBN_ID, COBN_ITEM, COBN_DET, COBD_TIPODOC, COBD_IDDOC, COBD_PREFIJO, COBD_NUMERO, COBD_ANULADO)
                VALUES (:ID, :ITEM, 1, :TIPODOC, :IDDOC, :PREFIJO, :NUMERO, 'N');
            UPDATE conciliacion_bancaria SET COBN_OK = 'S', COBN_CLASE = '0',
                COBN_PREFIJO = :PREFIJO, COBN_NUMERO = :NUMERO
                WHERE COBN_ID = :ID AND COBN_ITEM = :ITEM;
            END
        ELSE
            BEGIN
            /* BUSQUELO COMO DEBITO O CREDITO SIN IMPORTAR EL TIPO */
            SELECT FIRST 1 MOBA_PREF, MOBA_NUMERO, MOBA_IDREF
                FROM movimiento_banco M WHERE MOBA_DB = :DB AND MOBA_TOTAL = :MONTO AND M.cuba_cod = :cuenta AND MOBA_FECHA >= :FECINI AND MOBA_FECHA <= :FECFIN AND
                    NOT EXISTS (SELECT COBN_ITEM FROM CONCILIACION_DETALLE WHERE COBD_IDDOC = m.moba_idref AND COBD_TIPODOC = :tipodoc and COBN_ID = :ID)
                ORDER BY ABS(MOBA_FECHA - :FECHA)
                INTO :prefijo, :numero, :IDDOC;
            if (PREFIJO <> '') then
                BEGIN
                insert into conciliacion_detalle (COBN_ID, COBN_ITEM, COBN_DET, COBD_TIPODOC, COBD_IDDOC, COBD_PREFIJO, COBD_NUMERO, COBD_ANULADO)
                    VALUES (:ID, :ITEM, 1, :TIPODOC, :IDDOC, :PREFIJO, :NUMERO, 'N');
                UPDATE conciliacion_bancaria SET COBN_PREFIJO = :PREFIJO, COBN_NUMERO = :NUMERO, COBN_IDDOC = :iddoc, COBN_OK = 'S', COBN_CLASE = '0'
                    WHERE COBN_ID = :ID AND COBN_ITEM = :ITEM;
                END
            ELSE
                BEGIN
                if (DB = 'N') then
                    UPDATE conciliacion_bancaria SET COBN_OK = 'N', COBN_CLASE = '2'
                        WHERE COBN_ID = :ID AND COBN_ITEM = :ITEM;
                else
                    UPDATE conciliacion_bancaria SET COBN_OK = 'N', COBN_CLASE = '1'
                        WHERE COBN_ID = :ID AND COBN_ITEM = :ITEM;
                END
            END
        END
    ELSE
        BEGIN
        /* BUSQUELO COMO DEBITO O CREDITO SIN IMPORTAR EL TIPO */
        SELECT FIRST 1 MOBA_PREF, MOBA_NUMERO, MOBA_IDREF, MOBA_TIPODOC
            FROM movimiento_banco M WHERE MOBA_DB = :DB AND MOBA_TOTAL = :MONTO AND M.cuba_cod = :cuenta AND MOBA_FECHA >= :FECINI AND MOBA_FECHA <= :FECFIN AND
                NOT EXISTS (SELECT COBN_ITEM FROM CONCILIACION_DETALLE WHERE COBD_IDDOC = m.moba_idref AND COBD_TIPODOC = :tipodoc and COBN_ID = :ID)
            ORDER BY ABS(MOBA_FECHA - :FECHA)
            INTO :prefijo, :numero, :IDDOC, :TIPODOC;
        if (PREFIJO <> '') then
            BEGIN
            insert into conciliacion_detalle (COBN_ID, COBN_ITEM, COBN_DET, COBD_TIPODOC, COBD_IDDOC, COBD_PREFIJO, COBD_NUMERO, COBD_ANULADO)
                VALUES (:ID, :ITEM, 1, :TIPODOC, :IDDOC, :PREFIJO, :NUMERO, 'N');
            UPDATE conciliacion_bancaria SET COBN_TIPODOC = :TIPODOC, COBN_OK = 'S', COBN_CLASE = '0',
                COBN_PREFIJO = :PREFIJO, COBN_NUMERO = :NUMERO
                WHERE COBN_ID = :ID AND COBN_ITEM = :ITEM;
            END
        ELSE
            BEGIN
            if (DB = 'N') then
                UPDATE conciliacion_bancaria SET COBN_OK = 'N', COBN_CLASE = '2'
                    WHERE COBN_ID = :ID AND COBN_ITEM = :ITEM;
            else
                UPDATE conciliacion_bancaria SET COBN_OK = 'N', COBN_CLASE = '1'
                    WHERE COBN_ID = :ID AND COBN_ITEM = :ITEM;
            END
        END
    END
/* AGREGUE LOS DOCUMENTOS SIN UBICAR */
FOR SELECT MOBA_PREF, MOBA_NUMERO, MOBA_FECHA, MOBA_TOTAL, MOBA_CONCEPTO, MOBA_TIPODOC, MOBA_IDREF, MOBA_DB
    FROM MOVIMIENTO_BANCO M
    WHERE MOBA_FECHA >= :FECINI AND MOBA_FECHA <= :FECFIN  AND M.cuba_cod = :cuenta AND
        NOT EXISTS (SELECT COBN_ITEM FROM CONCILIACION_DETALLE WHERE COBD_IDDOC = m.moba_idref AND COBD_TIPODOC = M.moba_tipodoc)
    INTO :prefijo, :numero, :fecha, :monto, :concepto, :tipodoc, :iddoc, :DB
    DO
    BEGIN
    ITEMAX = ITEMAX + 1;
    if (DB = 'N') then
        INSERT INTO conciliacion_bancaria (CUBA_COD, COBN_ID, COBN_ITEM, COBN_FEC, COBN_PREFIJO, COBN_NUMERO, COBN_MONTO, COBN_TIPODOC, COBN_ANULADO, COBN_OK, COBN_CONC, COBN_IDDOC, COBN_DB, COBN_CLASE)
            VALUES (:CUENTA, :ID, :ITEMAX, :FECHA, :PREFIJO, :NUMERO, :monto, :TIPODOC, 'N', 'N', :concepto, :iddoc, :DB, '4');
    else
        INSERT INTO conciliacion_bancaria (CUBA_COD, COBN_ID, COBN_ITEM, COBN_FEC, COBN_PREFIJO, COBN_NUMERO, COBN_MONTO, COBN_TIPODOC, COBN_ANULADO, COBN_OK, COBN_CONC, COBN_IDDOC, COBN_DB, COBN_CLASE)
            VALUES (:CUENTA, :ID, :ITEMAX, :FECHA, :PREFIJO, :NUMERO, :monto, :TIPODOC, 'N', 'N', :concepto, :iddoc, :DB, '3');
    END
end
^

SET TERM ; ^


/* 20100327B */
/* BORRABA LA CONTABILIZACION AL HACER UN UPDATE CUALQUIERA */
SET TERM ^ ;

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

/* ANULE EL DOCUMENTO anterior */
if ((old.ndbc_id <> 0) and (old.ndbc_anulado = 'N')) then
    begin
    /* ANULE EL MOV */
    IF (NEW.ndbc_anulado = 'S') then
        UPDATE MOVIMIENTO_BANCO
            SET MOBA_CONCEPTO = 'ANULADO', MOBA_TOTAL = 0
            WHERE MOBA_TIPODOC = 74 AND MOBA_IDREF = OLD.ndbc_id;
    ELSE
        DELETE FROM MOVIMIENTO_BANCO
            WHERE MOBA_TIPODOC = 74 AND MOBA_IDREF = OLD.ndbc_id;
    DELETE FROM MOVIMIENTO_BANCO
        WHERE MOBA_TIPOREF = 74 AND MOBA_IDREF = OLD.ndbc_id;
    END
/* GRABE LO NUEVO*/
if ((NEW.ndbc_id <> 0) AND (NEW.NDBC_ANULADO = 'N')) then
    BEGIN
    /* Actualice el movimiento del banco */
    INSERT INTO MOVIMIENTO_BANCO
        (MOBA_ID, CUBA_COD, MOBA_TIPODOC, MOBA_PREF, MOBA_NUMERO, MOBA_FECHA, MOBA_CONCEPTO, MOBA_TOTAL, MOBA_DB, MOBA_IDREF, MOBA_TIPOREF)
        VALUES(GEN_ID(ID_MOVBANCO,1), NEW.cuba_cod, 74, NEW.PRBA_PREF, NEW.ndbc_numero, NEW.ndbc_fecha, NEW.ndbc_concepto, NEW.ndbc_monto, 'N', new.ndbc_id, 74);
    if (new.ndbc_ivamonto <> 0) then
        begin
        conc = 'IVA EN NOTA DEBITO No. ' || NEW.PRBA_PREF || NEW.NDBC_NUMERO;
        INSERT INTO MOVIMIENTO_BANCO
            (MOBA_ID, CUBA_COD, MOBA_TIPODOC, MOBA_PREF, MOBA_NUMERO, MOBA_FECHA, MOBA_CONCEPTO, MOBA_TOTAL, MOBA_DB, MOBA_IDREF, MOBA_TIPOREF)
            VALUES(GEN_ID(ID_MOVBANCO,1), NEW.cuba_cod, 78, NEW.PRBA_PREF, NEW.ndbc_numero, NEW.ndbc_fecha, :conc, NEW.ndbc_ivamonto, 'N', new.ndbc_id, 74);
        end
    if (new.ndbc_gmfmonto <> 0) then
        begin
        conc = 'GMF EN NOTA DEBITO No. ' || NEW.PRBA_PREF || NEW.NDBC_NUMERO;
        INSERT INTO MOVIMIENTO_BANCO
            (MOBA_ID, CUBA_COD, MOBA_TIPODOC, MOBA_PREF, MOBA_NUMERO, MOBA_FECHA, MOBA_CONCEPTO, MOBA_TOTAL, MOBA_DB, MOBA_IDREF, MOBA_TIPOREF)
            VALUES(GEN_ID(ID_MOVBANCO,1), NEW.cuba_cod, 79, NEW.PRBA_PREF, NEW.ndbc_numero, NEW.ndbc_fecha, :conc, NEW.ndbc_gmfmonto, 'N', new.ndbc_id, 74);
        end
    INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD, AUDI_TICO)
        VALUES (USER, 74, NEW.ndbc_id, 'U', NEW.prba_pref || NEW.ndbc_numero, NEW.cuba_cod);
    END
END
^

SET TERM ; ^


/* 20100328 */
/* solo produzca la diferencia si el saldo es positivo */

SET TERM ^ ;

CREATE OR ALTER TRIGGER MOVIMIENTO_ARTICULO_BI FOR MOVIMIENTO_ARTICULO
ACTIVE BEFORE INSERT POSITION 0
AS
declare variable LOTE CHAR(1);
declare variable ENSAMBLE CHAR(1);
declare variable IDENS INTEGER;
declare variable PREFENS VARCHAR(4);
declare variable unidad varchar(8);
declare variable DESCR varchar(60);
declare variable CODPR varchar(8);
declare variable DESPR varchar(60);
declare variable UNIPR varchar(8);
declare variable CANTPR numeric(18,4);
declare variable FACTOR numeric(18,4);
declare variable COSTO numeric(18,2);
declare variable COSTOTOT numeric(18,2);
declare variable PORCPR numeric(9,4);
declare variable MERMAPR numeric(9,4);
declare variable PESO numeric(18,4);
declare variable PESOPR numeric(18,4);
declare variable ITEM INTEGER;
declare variable IVA NUMERIC(9,4);
declare variable IVAM NUMERIC(18,2);
declare variable CONSUMO NUMERIC(18,2);
declare variable TOTAL float;
declare variable SALDO NUMERIC(18,4);
BEGIN
/* INSERTE EL NUEVO LOTE */
SELECT ARTI_EXIST
    FROM   ARTICULO
    WHERE  ARTICULO.ARTI_COD = NEW.ARTI_COD
    INTO :LOTE;
if (LOTE = 'L') then
    BEGIN
      if ((NEW.mvar_lote IS NULL) or (NEW.mvar_lote = '')) then
        if (new.mvar_entrada = 'S') then
            new.mvar_lote = cast(new.mvar_cons as varchar(15));
        else
            begin
            /* NO HAY LOTE, ENTONCES CALCULELO SEGUN CONFIGURACION */
            EXCEPTION LOTE_NEGATIVO 'No se indicó un lote para el artículo ' || new.arti_cod;
            end
    END
/* ENSAMBLE EL PRODUCTO */
SELECT ARTI_ENSAMBLE, ARTI_UNIDAD, ARTI_DES, ARTI_PESO
    FROM ARTICULO WHERE ARTI_COD = NEW.arti_cod INTO :ensamble, :unidad, :descr, :peso;
if ((NEW.mvar_entrada = 'N') AND (ENSAMBLE = 'S')) then
    BEGIN
    /* verifique si la existecia es insufieciente */
    execute procedure saldo_inventario(new.arti_cod, new.bode_cod, new.mvar_fecha) returning_values (:saldo);
    if (NEW.mvar_cant > :SALDO) then
        BEGIN
        if (SALDO > 0) then
            SALDO = NEW.mvar_cant - :SALDO;
        else
            SALDO = NEW.mvar_cant;
        IDENS = gen_id(id_ensamble, 1);
        EXECUTE PROCEDURE lee_configuracion('INVENTARIO', 'ENSAMBLES', 'PREFIJO PARA ENSAMBLES AUTOMATICOS AL SACAR PRODUCTOS') returning_values (:prefens);
        INSERT INTO ENSAMBLES(ENSA_ID, TIDO_COD, PREF_PRE, BODE_COD, ENSA_NUMERO, ENSA_FECHA, ENSA_CONC, ENSA_REFER, ENSA_CANT, ENSA_UNIDAD, ENSA_FACTOR, ENSA_ANULADO, ENSA_TRANSMIT,
            ARTI_COD, ENSA_DESC, ENSA_CODBAR, ENSA_LOTE, ENSA_OBS, TERC_NIT, ENSA_USUARIO, NUMOK, ENSA_COSTO, LOTE_VENCE, ENSA_CODRETAL, ENSA_CANTRETAL, ENSA_OPER, ENSA_MAQUINA, ENSA_PESO, ENSA_BODRETAL, ENSA_TIPOREF, ENSA_IDREF)
            VALUES (:IDENS, 15, :prefens, NEW.bode_cod, '000001', new.mvar_fecha, new.mvar_conc, '', :SALDO, :unidad, 1, 'N', 'N',
            NEW.arti_cod, :descr, NEW.arti_cod, NEW.mvar_lote, NULL, NULL, USER, 'N', NEW.mvar_costo, NULL, NULL, 0, null,  NULL, 0, NEW.bode_cod, NEW.mvar_tipodoc, NEW.mvar_idref);
        ITEM = 0;
        COSTOTOT = 0;
        select sum(arpr_porc) from articulos_producto where arti_cod = NEW.arti_cod into :total;
        FOR SELECT ARPR_CANT, ARPR_UNIDAD, ARPR_COMP, ARTI_DES, TAIV_PORC, ARTI_CONSUMO, ARPR_PORC, ARPR_MERMA, ARTI_PESO
            FROM articulos_producto P, ARTICULO A, TARIFA_IVA T
            WHERE P.ARTI_COD = NEW.arti_cod AND A.arti_cod = P.arpr_comp AND A.taiv_cod = T.taiv_cod
            INTO :CANTPR, :UNIPR, :CODPR, :DESPR, :IVA, :CONSUMO, :PORCPR, :MERMAPR, :PESOPR
            DO
            BEGIN
            ITEM = ITEM + 1;
            EXECUTE PROCEDURE factor_unidad_cant(:codpr, :unipr) returning_values (:factor);
            EXECUTE PROCEDURE costo_promedio_unidad (:codpr, NEW.mvar_fecha, :UNIPR) returning_values (:COSTO);
            IVAM = costo * cantpr * iva / 100;
            if (((cantpr is null) or (cantpr = 0)) AND (porcpr IS NOT NULL) AND (porcpr <> 0)) then
                BEGIN
                /* ES PORCENTUAL AL PESO LA MEZCLA SOBRE EL 1ER ARTICULO */
                CANTPR = :SALDO * PESO;
                CANTPR = CANTPR / TOTAL * porcpr; /* APLICA LA PROPORCION */
                if ((mermapr IS NOT NULL) AND (mermapr <> 0)) then
                    CANTPR = CANTPR * (100 + mermapr) / 100;
/*                CANTPR = CANTPR / pesopr; /* LO LLEVA A LA UNIDAD PRINCIPAL */
                UNIPR = 'GRAMO';
                END
            ELSE
                BEGIN
                CANTPR = CANTPR * :SALDO * pesopr;
                END
            COSTOTOT = COSTOTOT + COSTO * CANTPR;
            INSERT INTO ENSAMBLES_DETALLE(ENSA_ID, ESDE_ITEM, ARTI_COD, BODE_COD, ESDE_CANT, ESDE_UNIDAD, ESDE_COSTO, ESDE_LOTE, ESDE_FACTOR, ESDE_IVAPORC, ESDE_IVAMONTO, ESDE_CONSUMO, ESDE_CODBAR, ESDE_ANULADO, ESDE_TRANSMIT, ESDE_DESC, ESDE_TOTAL, ESDE_PESO)
                VALUES (:idens, :ITEM, :codpr,  NEW.bode_cod, :cantpr, :unipr, :costo, NULL, :FACTOR, :IVA, :ivam, :consumo, :codpr, 'N', 'N', :despr, :COSTO * :cantpr, 0);
            END
        END
    UPDATE ENSAMBLES SET ENSA_COSTO = :costotot WHERE ENSA_ID = :idens;
    END
if (new.mvar_cons is null) then
    NEW.mvar_cons = GEN_ID(ID_MOVARTI,1);
END
^

SET TERM ; ^

/* 20100329C */
/* imprima el exedente por sobrante dentro de la composicion del producto */
SET TERM ^ ;

CREATE OR ALTER PROCEDURE IMPR_PLANPROD(
    ID INTEGER)
RETURNS (
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    FECFIN DATE,
    CONCEPTO VARCHAR(60),
    RESPONSABLE VARCHAR(60),
    OBS BLOB SUB_TYPE 0 SEGMENT SIZE 80,
    ITEM INTEGER,
    ARTICULO VARCHAR(15),
    CODBAR VARCHAR(15),
    ARTIDES VARCHAR(60),
    CANT NUMERIC(18,4),
    UNIDAD VARCHAR(8),
    MERMA NUMERIC(18,4),
    PESO NUMERIC(18,4),
    OBSITEM BLOB SUB_TYPE 0 SEGMENT SIZE 80,
    CODCOMP VARCHAR(20),
    DESCOMP VARCHAR(60),
    CANTCOMP NUMERIC(18,4),
    UNICOMP VARCHAR(8))
AS
declare variable CODPROD VARCHAR(20);
declare variable PORC FLOAT;
declare variable MERMAC NUMERIC(18,4);
declare variable PESOPRO NUMERIC(18,4);
declare variable PESOCMP NUMERIC(18,4);
declare variable TOTAL FLOAT;
declare variable CANTPRO NUMERIC(18,4);
declare variable CANTSOB NUMERIC(18,4);
declare variable UNIART VARCHAR(8);
declare variable FACTOR FLOAT;
declare variable sobrante varchar(15);
declare variable porsob numeric(9,4);
BEGIN
SELECT PLPR_PREF, PLPR_NUMERO, PLPR_FECINI, PLPR_FECFIN, PLPR_CONC, PLPR_RESPONSABLE, PLPR_OBS
    FROM plan_produccion O WHERE PLPR_ID = :ID into
    :PREF, :NUMERO, :FECHA,
    :FECFIN, :CONCEPTO, :RESPONSABLE, :OBS;
FOR SELECT PLPD_ITEM, p.ARTI_COD, PLPD_CODBAR, PLPD_DESC, PLPD_CANT, PLPD_UNIDAD, PLPD_MERMA, PLPD_PESO, PLPD_OBS, arti_sobrante, arti_porcsobr
    FROM plan_produccion_det p, articulo a WHERE a.arti_cod = p.arti_cod and PLPR_ID = :ID
    ORDER BY PLPD_ITEM
    INTO :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :MERMA, :PESO, :OBSITEM, :sobrante, :porsob
    DO
      BEGIN
      codcomp = '';
      descomp = '';
      cantcomp = 0;
      unicomp = '';
      SUSPEND;
      CODPROD = ARTICULO;
      pesopro = peso;
      execute procedure factor_unidad_cant(:codprod, :unidad) returning_values (:factor);
      CANTPRO = CANT * FACTOR;
      select sum(arpr_porc) from plan_produccion_productos where plpr_id = :id and plpd_item = :item into :total;
      for select arpr_comp, arti_des, arpr_cant, arpr_unidad, arti_unidad, ARPR_PORC, ARPR_MERMA, p.arti_peso
        from plan_produccion_productos P, ARTICULO A
        where p.plpr_id = :id and p.plpd_item = :item and P.arpr_comp = A.arti_cod
        into :codcomp, :descomp, :cantcomp, :unicomp, :uniart, :porc, :mermac, :pesocmp
        DO
        BEGIN
        ARTICULO = '';
        CODBAR = '';
        ARTIDES = '';
        CANT = 0;
        UNIDAD = '';
        MERMA = 0;
        PESO = 0;
        OBSITEM = '';
        execute procedure factor_unidad_cant(:codcomp, :unicomp) returning_values (:factor);
        if (((cantcomp is null) or (cantcomp = 0)) AND (PORC IS NOT NULL) AND (porc <> 0)) then
            BEGIN
            /* ES PORCENTUAL AL PESO LA MEZCLA SOBRE EL 1ER ARTICULO */
            cantcomp = cantpro * pesopro / TOTAL * PORC; /* APLICA LA PROPORCION */
            if ((MERMAC IS NOT NULL) AND (MERMAC <> 0)) then
                cantcomp = cantcomp * (100 + MERMAC) / 100;
            if ((sobrante <> '') and (porsob <> 0) and (sobrante = codcomp)) then
                begin
                cantsob = cantpro * PESO;
                cantsob = cantsob / TOTAL * porsob; /* APLICA LA PROPORCION */
                cantcomp = cantcomp + cantsob;
                end
            END
        else
            BEGIN
            cantcomp = cantcomp * FACTOR * pesocmp * cantpro;
            END
        SUSPEND;
        END
      END
END
^

SET TERM ; ^


/* 20100329D */
/* mal cantidad del sobrante en el movimiento x articulo */
SET TERM ^ ;

CREATE OR ALTER PROCEDURE CONSOLIDE_PRODUCCION(
    PLANID INTEGER)
AS
declare variable item integer;
declare variable artic varchar(20);
declare variable cant numeric(18,4);
declare variable cantpro numeric(18,4);
declare variable codcmp varchar(20);
declare variable cantcmp numeric(18,4);
declare variable porcmp float;
declare variable undcmp varchar(8);
declare variable factor float;
declare variable pesocmp numeric(18,4);
declare variable peso numeric(18,4);
declare variable merma numeric(18,4);
declare variable tipoord integer;
declare variable numrows integer;
declare variable total float;
declare variable descr varchar(60);
declare variable unidad varchar(8);
declare variable sobrante varchar(15);
declare variable porsob numeric(9,4);
declare variable fec date;
declare variable Pref varchar(4);
declare variable Num varchar(6);
declare variable Bod varchar(2);
declare variable totcant numeric(18,4);
begin
ITEM = 0;
select plpr_fecini, plpr_pref, plpr_numero, plpr_bodori from plan_produccion
    where plpr_id = :planid into :fec, :Pref, :Num, :Bod;
FOR SELECT D.ARTI_COD, PLPD_CANT * PLPD_FACTOR, PLPD_PESO, arti_sobrante, arti_porcsobr
    from PLAN_PRODUCCION_DET d, articulo ar
    WHERE d.arti_cod = ar.arti_cod and PLPR_ID = :PLANID
    INTO :ARTIC, :CANTPRO, :PESO, :sobrante, :porsob
    DO
    BEGIN
    totcant = 0;
    select sum(arpr_porc) from articulos_producto where arti_cod = :artic into :total;
    FOR SELECT arpr_comp, ARPR_CANT, ARPR_UNIDAD, ARPR_PORC, ARTI_UNIDAD, ARTI_DES, arti_peso, arpr_merma
        from articulos_producto AP, ARTICULO A2
        WHERE AP.arpr_comp = A2.arti_cod AND AP.arti_cod = :ARTIC ORDER by ARPR_ITEM
        INTO :codcmp, :cantcmp, :undcmp, :porcmp, :unidad, :descr, :pesocmp, :MERMA
        DO
        BEGIN
        EXECUTE PROCEDURE factor_unidad_cant(:codcmp, :undcmp) returning_values (:FACTOR);
        if (((cantcmp is null) or (cantcmp = 0)) AND (PORCMP IS NOT NULL) AND (porcmp <> 0)) then
            BEGIN
            /* ES PORCENTUAL AL PESO LA MEZCLA SOBRE EL 1ER ARTICULO */
            CANT = cantpro * PESO;
            CANT = CANT / TOTAL * porcmp; /* APLICA LA PROPORCION */
            if ((MERMA IS NOT NULL) AND (MERMA <> 0)) then
                CANT = CANT / ((100 - MERMA) / 100);
            undcmp = 'GRAMO';
            totcant = totcant + cant;
            END
        ELSE
            BEGIN
            CANT = cantpro * CANTCMP * factor * pesocmp;
            END

        SELECT COUNT(ARTI_COD) FROM articulos_producto WHERE ARTI_COD = :codcmp INTO :NUMROWS;
        if (NUMROWS <> 0) then
           TIPOORD = 19;
        else
            TIPOORD = 24;

        /* INSERTE O ACTUALICE EL COMPONENTE */
        if (NOT EXISTS (SELECT PLPC_ITEM FROM plan_produccion_cons WHERE PLPD_ID = :planid AND ARTI_COD = :codcmp)) then
            BEGIN
            ITEM = ITEM + 1;
            INSERT INTO plan_produccion_cons (PLPD_ID, PLPC_ITEM, PLPC_CODBAR, ARTI_COD, PLPC_CANT, PLPC_UNIDAD, PLPC_EXIST, PLPC_ORDENAR, PLPC_ORDENTIPO, PLPC_ORDENID, PLPC_ANULADO, PLPC_TRANSMIT, PLPC_DESC)
                VALUES (:planid, :item, :codcmp, :codcmp, :cant, :undcmp, 0, 0, :tipoord, 0, 'N', 'N', :descr);
            END
        ELSE
            UPDATE plan_produccion_cons SET PLPC_CANT = PLPC_CANT + :CANT
                WHERE PLPD_ID = :planid AND ARTI_COD = :codcmp;
        END
    /* ingrese el sobrante */
    if ((sobrante <> '') and (porsob <> 0)) then
      begin
      select arti_peso from articulo where arti_cod = :sobrante into :pesocmp;
      INSERT INTO MOVIMIENTO_ARTICULO
          (ARTI_COD, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM, TERC_NIT)
          VALUES(:sobrante, :bod, :FEC, 27, :planid, 'SOBRANTE PLAN PRODUCCION ' || :PREF || :num || ' ARTICULO:' || :ARTIC,
          (:porsob * :totcant /100)/:pesocmp, 0, 'S', null, :Pref, :Num, 0, null);
      /* si es un componente sumelo a la consolidacion */
      if (EXISTS (SELECT PLPC_ITEM FROM plan_produccion_cons WHERE PLPD_ID = :planid AND ARTI_COD = :sobrante)) then
        UPDATE plan_produccion_cons SET PLPC_CANT = PLPC_CANT + (:porsob * :totcant /100)
            WHERE PLPD_ID = :planid AND ARTI_COD = :sobrante;
      end
    END
end
^

SET TERM ; ^

/* 20100329E */
/* no borraba los sobrantes al anular o borrar el plan de produccion */

SET TERM ^ ;

CREATE OR ALTER TRIGGER PLAN_PRODUCCION_AU FOR PLAN_PRODUCCION
ACTIVE AFTER UPDATE POSITION 0
as
declare variable consec INTEGER;
BEGIN
/* borre la contabilizacion */
if (new.plpr_anulado = 'S') then
    begin
    DELETE FROM movimiento_articulo M WHERE M.mvar_tipodoc = 27 AND M.mvar_idref = OLD.plpr_id AND M.mvar_item = 0;
    select enco_consec from comprobante_encabezado where enco_tiporef = 27 and enco_idref = old.plpr_id into :consec;
    if (NOT consec is null) then
      delete from comprobante_detalle where enco_consec = :consec;
    delete from comprobante_encabezado where enco_tiporef = 27 and enco_idref = old.plpr_id;
    INSERT INTO AUDITORIA (AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
        VALUES (USER, 27, new.plpr_id, 'A', NEW.plpr_pref || NEW.plpr_numero);
    end

if ((new.plpr_id <> 0) and (new.plpr_anulado = 'N')) then
    BEGIN
    INSERT INTO AUDITORIA (AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
        VALUES (USER, 27, new.plpr_id, 'U', NEW.plpr_pref || NEW.plpr_numero);
    END
/* si cambia fecha o numero actualice los detalles */
if ((OLD.plpr_pref <> NEW.plpr_pref) or
    (OLD.plpr_numero <> NEW.plpr_numero) or
    (OLD.plpr_fecini <> NEW.plpr_fecini)) then
    BEGIN
    UPDATE plan_produccion_det SET PLPD_TRANSMIT = 'N' WHERE PLPR_ID = NEW.plpr_id;
    UPDATE plan_produccion_cons SET PLPC_TRANSMIT = 'N' WHERE PLPD_ID = NEW.plpr_id;
    END
/* actualice los anulados y trasmitidos */
if (OLD.plpr_anulado <> NEW.plpr_anulado) then
    BEGIN
    UPDATE plan_produccion_det SET PLPD_ANULADO = NEW.plpr_anulado WHERE PLPR_ID = NEW.plpr_id;
    UPDATE plan_produccion_cons SET PLPC_ANULADO = NEW.plpr_anulado WHERE PLPD_ID = NEW.plpr_id;
    END
if (OLD.plpr_transmit <> NEW.plpr_transmit) then
    BEGIN
    UPDATE plan_produccion_det SET PLPD_TRANSMIT = NEW.plpr_transmit WHERE PLPR_ID = NEW.plpr_id;
    UPDATE plan_produccion_cons SET PLPC_TRANSMIT = NEW.plpr_transmit WHERE PLPD_ID = NEW.plpr_id;
    END
end
^

SET TERM ; ^


SET TERM ^ ;

CREATE OR ALTER TRIGGER PLAN_PRODUCCION_AD FOR PLAN_PRODUCCION
ACTIVE AFTER DELETE POSITION 0
as
declare variable consec integer;
begin
DELETE FROM movimiento_articulo M WHERE M.mvar_tipodoc = 27 AND M.mvar_idref = OLD.plpr_id AND M.mvar_item = 0;
select enco_consec from comprobante_encabezado where enco_tiporef = 27 and enco_idref = old.plpr_id into :consec;
if (NOT consec is null) then
    delete from comprobante_detalle where enco_consec = :consec;
delete from comprobante_encabezado where enco_tiporef = 27 and enco_idref = old.plpr_id;
INSERT INTO AUDITORIA (AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
    VALUES (USER, 27, old.plpr_id, 'D', old.plpr_pref || old.plpr_numero);
end
^

SET TERM ; ^

/* 20100329F */
/* REUSAR O NO EL SOBRANTE, SI SI SE INCREMENTA EL CONSUMO */
ALTER TABLE ARTICULO
ADD ARTI_REUSOB T_BOOLEANO;

SET TERM ^ ;

CREATE OR ALTER PROCEDURE CONSOLIDE_PRODUCCION(
    PLANID INTEGER)
AS
declare variable item integer;
declare variable artic varchar(20);
declare variable cant numeric(18,4);
declare variable cantpro numeric(18,4);
declare variable codcmp varchar(20);
declare variable cantcmp numeric(18,4);
declare variable porcmp float;
declare variable undcmp varchar(8);
declare variable factor float;
declare variable pesocmp numeric(18,4);
declare variable peso numeric(18,4);
declare variable merma numeric(18,4);
declare variable tipoord integer;
declare variable numrows integer;
declare variable total float;
declare variable descr varchar(60);
declare variable unidad varchar(8);
declare variable sobrante varchar(15);
declare variable porsob numeric(9,4);
declare variable fec date;
declare variable Pref varchar(4);
declare variable Num varchar(6);
declare variable Bod varchar(2);
declare variable totcant numeric(18,4);
declare variable REUSO CHAR(1);
begin
ITEM = 0;
select plpr_fecini, plpr_pref, plpr_numero, plpr_bodori from plan_produccion
    where plpr_id = :planid into :fec, :Pref, :Num, :Bod;
FOR SELECT D.ARTI_COD, PLPD_CANT * PLPD_FACTOR, PLPD_PESO, arti_sobrante, arti_porcsobr, ARTI_REUSOB
    from PLAN_PRODUCCION_DET d, articulo ar
    WHERE d.arti_cod = ar.arti_cod and PLPR_ID = :PLANID
    INTO :ARTIC, :CANTPRO, :PESO, :sobrante, :porsob, :reuso
    DO
    BEGIN
    totcant = 0;
    select sum(arpr_porc) from articulos_producto where arti_cod = :artic into :total;
    FOR SELECT arpr_comp, ARPR_CANT, ARPR_UNIDAD, ARPR_PORC, ARTI_UNIDAD, ARTI_DES, arti_peso, arpr_merma
        from articulos_producto AP, ARTICULO A2
        WHERE AP.arpr_comp = A2.arti_cod AND AP.arti_cod = :ARTIC ORDER by ARPR_ITEM
        INTO :codcmp, :cantcmp, :undcmp, :porcmp, :unidad, :descr, :pesocmp, :MERMA
        DO
        BEGIN
        EXECUTE PROCEDURE factor_unidad_cant(:codcmp, :undcmp) returning_values (:FACTOR);
        if (((cantcmp is null) or (cantcmp = 0)) AND (PORCMP IS NOT NULL) AND (porcmp <> 0)) then
            BEGIN
            /* ES PORCENTUAL AL PESO LA MEZCLA SOBRE EL 1ER ARTICULO */
            CANT = cantpro * PESO;
            CANT = CANT / TOTAL * porcmp; /* APLICA LA PROPORCION */
            if ((MERMA IS NOT NULL) AND (MERMA <> 0)) then
                CANT = CANT / ((100 - MERMA) / 100);
            undcmp = 'GRAMO';
            totcant = totcant + cant;
            END
        ELSE
            BEGIN
            CANT = cantpro * CANTCMP * factor * pesocmp;
            END

        SELECT COUNT(ARTI_COD) FROM articulos_producto WHERE ARTI_COD = :codcmp INTO :NUMROWS;
        if (NUMROWS <> 0) then
           TIPOORD = 19;
        else
            TIPOORD = 24;

        /* INSERTE O ACTUALICE EL COMPONENTE */
        if (NOT EXISTS (SELECT PLPC_ITEM FROM plan_produccion_cons WHERE PLPD_ID = :planid AND ARTI_COD = :codcmp)) then
            BEGIN
            ITEM = ITEM + 1;
            INSERT INTO plan_produccion_cons (PLPD_ID, PLPC_ITEM, PLPC_CODBAR, ARTI_COD, PLPC_CANT, PLPC_UNIDAD, PLPC_EXIST, PLPC_ORDENAR, PLPC_ORDENTIPO, PLPC_ORDENID, PLPC_ANULADO, PLPC_TRANSMIT, PLPC_DESC)
                VALUES (:planid, :item, :codcmp, :codcmp, :cant, :undcmp, 0, 0, :tipoord, 0, 'N', 'N', :descr);
            END
        ELSE
            UPDATE plan_produccion_cons SET PLPC_CANT = PLPC_CANT + :CANT
                WHERE PLPD_ID = :planid AND ARTI_COD = :codcmp;
        END
    /* ingrese el sobrante */
    if ((sobrante <> '') and (porsob <> 0) AND (REUSO = 'N')) then
      begin
      select arti_peso from articulo where arti_cod = :sobrante into :pesocmp;
      INSERT INTO MOVIMIENTO_ARTICULO
          (ARTI_COD, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM, TERC_NIT)
          VALUES(:sobrante, :bod, :FEC, 27, :planid, 'SOBRANTE PLAN PRODUCCION ' || :PREF || :num || ' ARTICULO:' || :ARTIC,
          (:porsob * :totcant /100)/:pesocmp, 0, 'S', null, :Pref, :Num, 0, null);
      /* si es un componente sumelo a la consolidacion */
      if (EXISTS (SELECT PLPC_ITEM FROM plan_produccion_cons WHERE PLPD_ID = :planid AND ARTI_COD = :sobrante)) then
        UPDATE plan_produccion_cons SET PLPC_CANT = PLPC_CANT + (:porsob * :totcant /100)
            WHERE PLPD_ID = :planid AND ARTI_COD = :sobrante;
      end
    END
end
^

SET TERM ; ^


/* 20100329G */
/* NO IMPRIMA LA MERMA SI NO EL RECORTE */
SET TERM ^ ;

CREATE OR ALTER PROCEDURE IMPR_PLANPROD(
    ID INTEGER)
RETURNS (
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    FECFIN DATE,
    CONCEPTO VARCHAR(60),
    RESPONSABLE VARCHAR(60),
    OBS BLOB SUB_TYPE 0 SEGMENT SIZE 80,
    ITEM INTEGER,
    ARTICULO VARCHAR(15),
    CODBAR VARCHAR(15),
    ARTIDES VARCHAR(60),
    CANT NUMERIC(18,4),
    UNIDAD VARCHAR(8),
    MERMA NUMERIC(18,4),
    PESO NUMERIC(18,4),
    OBSITEM BLOB SUB_TYPE 0 SEGMENT SIZE 80,
    CODCOMP VARCHAR(20),
    DESCOMP VARCHAR(60),
    CANTCOMP NUMERIC(18,4),
    UNICOMP VARCHAR(8))
AS
declare variable CODPROD VARCHAR(20);
declare variable PORC FLOAT;
declare variable MERMAC NUMERIC(18,4);
declare variable PESOPRO NUMERIC(18,4);
declare variable PESOCMP NUMERIC(18,4);
declare variable TOTAL FLOAT;
declare variable CANTPRO NUMERIC(18,4);
declare variable CANTSOB NUMERIC(18,4);
declare variable UNIART VARCHAR(8);
declare variable FACTOR FLOAT;
declare variable sobrante varchar(15);
declare variable porsob numeric(9,4);
BEGIN
SELECT PLPR_PREF, PLPR_NUMERO, PLPR_FECINI, PLPR_FECFIN, PLPR_CONC, PLPR_RESPONSABLE, PLPR_OBS
    FROM plan_produccion O WHERE PLPR_ID = :ID into
    :PREF, :NUMERO, :FECHA,
    :FECFIN, :CONCEPTO, :RESPONSABLE, :OBS;
FOR SELECT PLPD_ITEM, p.ARTI_COD, PLPD_CODBAR, PLPD_DESC, PLPD_CANT, PLPD_UNIDAD, PLPD_PESO, PLPD_OBS, arti_sobrante, arti_porcsobr
    FROM plan_produccion_det p, articulo a WHERE a.arti_cod = p.arti_cod and PLPR_ID = :ID
    ORDER BY PLPD_ITEM
    INTO :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :PESO, :OBSITEM, :sobrante, :porsob
    DO
      BEGIN
      codcomp = '';
      descomp = '';
      cantcomp = 0;
      unicomp = '';
      SUSPEND;
      CODPROD = ARTICULO;
      pesopro = peso;
      execute procedure factor_unidad_cant(:codprod, :unidad) returning_values (:factor);
      CANTPRO = CANT * FACTOR;
      select sum(arpr_porc) from plan_produccion_productos where plpr_id = :id and plpd_item = :item into :total;
      for select arpr_comp, arti_des, arpr_cant, arpr_unidad, arti_unidad, ARPR_PORC, ARPR_MERMA, p.arti_peso
        from plan_produccion_productos P, ARTICULO A
        where p.plpr_id = :id and p.plpd_item = :item and P.arpr_comp = A.arti_cod
        into :codcomp, :descomp, :cantcomp, :unicomp, :uniart, :porc, :mermac, :pesocmp
        DO
        BEGIN
        ARTICULO = '';
        CODBAR = '';
        ARTIDES = '';
        CANT = 0;
        UNIDAD = '';
        MERMA = 0;
        PESO = 0;
        OBSITEM = '';
        execute procedure factor_unidad_cant(:codcomp, :unicomp) returning_values (:factor);
        if (((cantcomp is null) or (cantcomp = 0)) AND (PORC IS NOT NULL) AND (porc <> 0)) then
            BEGIN
            /* ES PORCENTUAL AL PESO LA MEZCLA SOBRE EL 1ER ARTICULO */
            cantcomp = cantpro * pesopro / TOTAL * PORC; /* APLICA LA PROPORCION */
            if ((MERMAC IS NOT NULL) AND (MERMAC <> 0)) then
                cantcomp = cantcomp * (100 + MERMAC) / 100;
            if ((sobrante <> '') and (porsob <> 0) and (sobrante = codcomp)) then
                begin
                cantsob = cantpro * pesopro;
                cantsob = cantsob / TOTAL * porsob; /* APLICA LA PROPORCION */
                cantcomp = cantcomp + cantsob;
                merma = cantsob;
                end
            END
        else
            BEGIN
            cantcomp = cantcomp * FACTOR * pesocmp * cantpro;
            END
        SUSPEND;
        END
      END
END
^

SET TERM ; ^


/* 20100329H */
/* merma del segundo nivel estaba diercta y la 1a invertida */
SET TERM ^ ;

CREATE OR ALTER PROCEDURE IMPR_PLANPROD_CONS(
    ID INTEGER)
RETURNS (
    ITEM INTEGER,
    ARTICULO VARCHAR(15),
    CODBAR VARCHAR(15),
    ARTIDES VARCHAR(60),
    CANT NUMERIC(18,4),
    UNIDAD VARCHAR(8),
    EXISTEN NUMERIC(18,4),
    ORDENADO NUMERIC(18,4),
    OBSITEM BLOB SUB_TYPE 0 SEGMENT SIZE 80,
    CODCOMP VARCHAR(20),
    DESCOMP VARCHAR(60),
    CANTCOMP NUMERIC(18,4),
    UNICOMP VARCHAR(8))
AS
declare variable CODPROD VARCHAR(20);
declare variable PORC FLOAT;
declare variable MERMA NUMERIC(18,4);
declare variable PESOPRO NUMERIC(18,4);
declare variable PESOCMP NUMERIC(18,4);
declare variable TOTAL FLOAT;
declare variable CANTPRO NUMERIC(18,4);
declare variable UNIART VARCHAR(8);
declare variable FACTOR FLOAT;
BEGIN
FOR SELECT PLPC_ITEM, ARTI_COD, PLPC_CODBAR, PLPC_DESC, PLPC_CANT, PLPC_UNIDAD, PLPC_EXIST, PLPC_ORDENAR, PLPC_OBS
    FROM plan_produccion_cons WHERE PLPD_ID = :ID
    ORDER BY PLPC_ITEM
    INTO :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :existen, :ordenado, :OBSITEM
    DO
      BEGIN
      codcomp = '';
      descomp = '';
      cantcomp = 0;
      unicomp = '';
      SUSPEND;
      CODPROD = ARTICULO;
      SELECT ARTI_PESO FROM ARTICULO WHERE ARTI_COD = :codprod INTO :PESOPRO;
      execute procedure factor_unidad_cant(:codprod, :unidad) returning_values (:factor);
      CANTPRO = CANT * FACTOR;
      select sum(arpr_porc) from plan_produccion_cons_prod where plpd_id = :id AND plpc_item = :item into :total;
      for select arpr_comp, arti_des, arpr_cant, arpr_unidad, arti_unidad, ARPR_PORC, ARPR_MERMA, P.arti_peso
        from plan_produccion_cons_prod P, ARTICULO A
        where P.arpr_comp = A.arti_cod AND p.plpd_id = :id AND P.plpc_item = :item ORDER BY P.plcp_nrocomp
        into :codcomp, :descomp, :cantcomp, :unicomp, :uniart, :porc, :merma, :pesocmp
        DO
        BEGIN
        ARTICULO = '';
        CODBAR = '';
        ARTIDES = '';
        CANT = 0;
        UNIDAD = '';
        EXISTEN = 0;
        ORDENADO = 0;
        OBSITEM = '';
        execute procedure factor_unidad_cant(:codcomp, :unicomp) returning_values (:factor);
        if (((cantcomp is null) or (cantcomp = 0)) AND (PORC IS NOT NULL) AND (porc <> 0)) then
            BEGIN
            /* ES PORCENTUAL AL PESO LA MEZCLA SOBRE EL 1ER ARTICULO */
            cantcomp = cantpro * pesopro * porc / TOTAL; /* APLICA LA PROPORCION */
            if ((MERMA IS NOT NULL) AND (MERMA <> 0)) then
                cantcomp = cantcomp / ((100 - MERMA) / 100);
            END
        else
            BEGIN
            cantcomp = cantcomp * FACTOR * pesocmp * cantpro;
            END
        SUSPEND;
        END
       END
END
^

SET TERM ; ^


/* 20100331 */
/* devoluciones sobre pedido EXCLUIR DE REPORTES Y CONTABILIZACION */
SET TERM ^ ;

CREATE OR ALTER TRIGGER DEVOLUCIONES_VENTAS_AI FOR DEVOLUCIONES_VENTAS
ACTIVE AFTER INSERT POSITION 0
AS
declare variable CONC VARCHAR(60);
declare variable crmeven char(2);
BEGIN
if ((NEW.DEVT_ID <> 0) and (new.devt_anulado = 'N')) then
    BEGIN
    if (((new.devt_remid IS NULL) or (new.devt_remid = 0)) and ((new.devt_pedid IS NULL) or (new.devt_pedid = 0))) then
      if (new.devt_confirmacxc = 'S') then
        begin
        /* Registre el nuevo saldo del documento */
        INSERT INTO SALDOS_DOC_CARTERA (SDCA_TIPOREF, SDCA_IDREF, SDCA_FECHA, TERC_NIT, SDCA_RTFTE, SDCA_RTIVA, SDCA_RTICA, SDCA_ABONO, SDCA_ABRTFTE, SDCA_ABRTIVA, SDCA_ABRTICA, SDCA_DEBITO, SDCA_MONTO, SDCA_TRM)
            VALUES (33, NEW.DEVT_ID, NEW.DEVT_fecha, NEW.terc_nit, (NEW.DEVT_rtftemonto*-1), (NEW.DEVT_rtivamonto*-1), (NEW.DEVT_rticamonto*-1), 0, 0, 0, 0, 'N', (NEW.DEVT_TOTAL*-1), new.devt_trm);
        /* Registre el movimiento del cliente */
        CONC = 'DEVOLUCION VENTA No.' || NEW.PREF_PRE || NEW.DEVT_NUMERO || ' EN FACTURA ' || NEW.devt_factura;
        INSERT INTO MOVIMIENTO_CLIENTES (MVCL_ID, TERC_NIT, MVCL_TIPOREF, MVCL_IDREF, MVCL_FECHA, MVCL_VENCE, MVCL_CONC, MVCL_MONTO, MVCL_RTEFTE, MVCL_RTEIVA, MVCL_RTEICA, MVCL_DEBITO, MVCL_ABONO, MVCL_PREFREF, MVCL_NUMREF, MVCL_SUCURSAL, COBR_COD, MVCL_TRM)
          VALUES (GEN_ID(ID_MOVCLI, 1), NEW.TERC_NIT, 33, NEW.DEVT_ID, NEW.DEVT_FECHA, NEW.DEVT_FECHA, :CONC, NEW.DEVT_TOTAL, NEW.DEVT_RTFTEMONTO, NEW.DEVT_RTIVAMONTO, NEW.DEVT_RTICAMONTO, 'N', 'N', NEW.pref_pre, NEW.DEVT_numero, NEW.devt_sucursal, NEW.cobr_cod, new.devt_trm);
        end
    /* ACTUALICE LA CONSOLIDACION */
    if (NEW.DEVT_CONSOLIDA <> 0) then
        UPDATE consolidado_faltantes SET COFA_IDDES = NEW.devt_id, COFA_OK = 'S' WHERE COFA_ID = NEW.devt_consolida;
    execute procedure lee_configuracion ('CRM', 'EVENTOS', 'GRABAR EVENTOS AUTOMATICAMENTE DESDE DOCUMENTOS DE VENTAS') returning_values (:crmeven);
    if (crmeven = 'SI') then
        begin
        if (new.devt_confirmacxc = 'S') then
            insert into crm_eventos (CREV_TIPO, CREV_ORIGEN, CREV_FECHA, CREV_HORA, CREV_MOTIVO, CREV_ASESOR, CREV_VALOR, CREV_EXPLICA, CREV_OBS, CREV_ACTIVIDAD, CRCL_NIT, CREV_ANULADO)
                VALUES (905, new.devt_id, new.devt_fecha, cast('now' as time), 6, new.vend_cod, new.devt_total, 'Devolución No. ' || new.pref_pre || new.devt_numero, new.devt_obs, 0, new.terc_nit, new.devt_anulado);
        else
            insert into crm_eventos (CREV_TIPO, CREV_ORIGEN, CREV_FECHA, CREV_HORA, CREV_MOTIVO, CREV_ASESOR, CREV_VALOR, CREV_EXPLICA, CREV_OBS, CREV_ACTIVIDAD, CRCL_NIT, CREV_ANULADO)
                VALUES (905, new.devt_id, new.devt_fecha, cast('now' as time), 6, new.vend_cod, new.devt_total, 'Devolución No. ' || new.pref_pre || new.devt_numero || ' sin confirmar cartera.', new.devt_obs, 0, new.terc_nit, new.devt_anulado);
        end
    if (new.devt_factid <> 0) then
        if (new.devt_confirmacxc = 'S') then
            INSERT INTO notas_documento (NODO_ID, TIDO_COD, NODO_IDDOC, NODO_FECHA, NODO_USER, NODO_RESUMEN, NODO_TIPO)
                VALUES (GEN_ID(id_notadoc, 1), 31, new.devt_factid, NEW.devt_fecha, user, 'Devolución No. ' || new.pref_pre || new.devt_numero, 7);
        else
            INSERT INTO notas_documento (NODO_ID, TIDO_COD, NODO_IDDOC, NODO_FECHA, NODO_USER, NODO_RESUMEN, NODO_TIPO)
                VALUES (GEN_ID(id_notadoc, 1), 31, new.devt_factid, NEW.devt_fecha, user, 'Devolución No. ' || new.pref_pre || new.devt_numero || ' sin confirmar cartera', 7);
        
    INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
        VALUES (USER, 33, NEW.devt_id, 'I', NEW.pref_pre || NEW.devt_numero);
    END
END
^

SET TERM ; ^


SET TERM ^ ;

CREATE OR ALTER TRIGGER DEVOLUCIONES_VENTAS_AU FOR DEVOLUCIONES_VENTAS
ACTIVE AFTER UPDATE POSITION 0
AS
declare variable ABONOS integer;
declare variable CONC VARCHAR(60);
declare variable consec INTEGER;
declare variable crmeven char(2);
BEGIN
if (new.devt_anulado = 'S') then
    begin
    select enco_consec from comprobante_encabezado where enco_tiporef = 33 and enco_idref = old.devt_id into :consec;
    if (NOT consec is null) then
      delete from comprobante_detalle where enco_consec = :consec;
    delete from comprobante_encabezado where enco_tiporef = 33 and enco_idref = old.devt_id;
    delete from crm_eventos where crev_tipo = 905 and crev_origen = old.devt_id;

    DELETE FROM puntos_cliente WHERE PTCL_TIPODOC = 33 AND PTCL_IDDOC = OLD.devt_id;

    INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
        VALUES (USER, 33, NEW.devt_id, 'A', NEW.pref_pre || NEW.devt_numero);
    end
if ((old.DEVT_id <> 0) and (old.devt_anulado = 'N')) then
    begin
    if (((old.devt_remid = 0) or (old.devt_remid is null)) and ((old.devt_pedid = 0) or (old.devt_pedid is null))) then
        begin
        ABONOS = 0;
        select COUNT(*) FROM SALDOS_DOC_CARTERA WHERE SDCA_TIPOREF = 33 AND SDCA_IDREF = OLD.DEVT_ID AND SDCA_ABONO <> 0 INTO :ABONOS;
        if (ABONOS = 0) then
            BEGIN
            /* BORRE EL REGISTRO PREVIO */
            delete from saldos_doc_cartera where sdca_tiporef = 33 and sdca_idref = old.devt_id;
            delete from movimiento_clientes where (mvcl_tiporef = 33) and (mvcl_idref = old.devt_id);

            /* ACTUALICE LA CONSOLIDACION */
            if (OLD.DEVT_CONSOLIDA <> 0) then
                UPDATE consolidado_faltantes SET COFA_OK = 'N' WHERE COFA_ID = old.devt_consolida;
            END
        else
            exception DOCUMENTO_CON_ABONOS 'La devolución ' || old.pref_pre || old.devt_numero || ' tiene abonos registrados.';
        end
    else
        if (OLD.DEVT_CONSOLIDA <> 0) then
            UPDATE consolidado_faltantes SET COFA_OK = 'N' WHERE COFA_ID = old.devt_consolida;
    END
if ((new.DEVT_id <> 0) and (new.devt_anulado = 'N')) then
    BEGIN
    if (((new.devt_remid IS NULL) or (new.devt_remid = 0)) and ((new.devt_pedid IS NULL) or (new.devt_pedid = 0))) then
        begin
        if (new.devt_confirmacxc = 'S') then
            begin
            /* Registre el nuevo saldo del documento */
            INSERT INTO SALDOS_DOC_CARTERA (SDCA_TIPOREF, SDCA_IDREF, SDCA_FECHA, TERC_NIT, SDCA_RTFTE, SDCA_RTIVA, SDCA_RTICA, SDCA_ABONO, SDCA_ABRTFTE, SDCA_ABRTIVA, SDCA_ABRTICA, SDCA_DEBITO, SDCA_MONTO, SDCA_TRM)
                VALUES (33, NEW.DEVT_ID, NEW.DEVT_fecha, NEW.terc_nit, (NEW.DEVT_rtftemonto*-1), (NEW.DEVT_rtivamonto*-1), (NEW.DEVT_rticamonto*-1), 0, 0, 0, 0, 'N', (NEW.DEVT_TOTAL*-1), NEW.devt_trm);
            /* Registre el movimiento del cliente */
            CONC = 'DEVOLUCION VENTA No.' || NEW.PREF_PRE || NEW.DEVT_NUMERO || ' EN FACTURA ' || NEW.devt_factura;
            INSERT INTO MOVIMIENTO_CLIENTES (MVCL_ID, TERC_NIT, MVCL_TIPOREF, MVCL_IDREF, MVCL_FECHA, MVCL_VENCE, MVCL_CONC, MVCL_MONTO, MVCL_RTEFTE, MVCL_RTEIVA, MVCL_RTEICA, MVCL_DEBITO, MVCL_ABONO, MVCL_PREFREF, MVCL_NUMREF, MVCL_SUCURSAL, COBR_COD, MVCL_TRM)
                VALUES (GEN_ID(ID_MOVCLI, 1), NEW.TERC_NIT, 33, NEW.DEVT_ID, NEW.DEVT_FECHA, NEW.DEVT_FECHA, :CONC, NEW.DEVT_TOTAL, NEW.DEVT_RTFTEMONTO, NEW.DEVT_RTIVAMONTO, NEW.DEVT_RTICAMONTO, 'N', 'N', NEW.pref_pre, NEW.DEVT_numero, NEW.devt_sucursal, NEW.cobr_cod, NEW.devt_trm);
            end
        /* ACTUALICE LA CONSOLIDACION */
        if (NEW.DEVT_CONSOLIDA <> 0) then
            UPDATE consolidado_faltantes SET COFA_IDDES = NEW.devt_id, COFA_OK = 'S' WHERE COFA_ID = NEW.devt_consolida;
        end
    INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
        VALUES (USER, 33, NEW.devt_id, 'U', NEW.pref_pre || NEW.devt_numero);
    END
/* si cambio un dato critico actualice el detalle */
if ((OLD.devt_fecha <> NEW.devt_fecha) or
    (OLD.devt_numero <> NEW.devt_numero) or
    (OLD.pref_pre <> NEW.pref_pre) or
    (OLD.devt_factid <> NEW.devt_factid)) then
    UPDATE DEVOLUCIONES_VENTAS_DETALLE
        SET DVDE_TRANSMIT = 'N'
        WHERE DEVT_ID = NEW.DEVT_ID;
/* ACTUALICE EL ANULADO EN LOS DETALLES */
if (OLD.DEVT_anulado <> NEW.DEVT_anulado) then
    UPDATE DEVOLUCIONES_VENTAS_DETALLE
        SET DVDE_ANULADO = NEW.DEVT_anulado
        WHERE DEVT_ID = NEW.DEVT_ID;
if (OLD.devt_transmit <> NEW.devt_transmit) then
    UPDATE DEVOLUCIONES_VENTAS_DETALLE
        SET DVDE_TRANSMIT = NEW.devt_transmit
        WHERE DEVT_ID = NEW.DEVT_ID;
END
^

SET TERM ; ^

SET TERM ^ ;

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

SET TERM ; ^

SET TERM ^ ;

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

^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure CONTABIL_DEVOLCLI (
    IDDOC integer,
    IDINTER integer)
returns (
    ERROR integer,
    VER char(1),
    IDC integer)
AS
declare variable PREF VARCHAR(4);
declare variable NUM VARCHAR(6);
declare variable NUMERO VARCHAR(10);
declare variable FECAUX DATE;
declare variable FECHA CHAR(8);
declare variable CONC CHAR(120);
declare variable NUMFAC VARCHAR(10);
declare variable VRDTO NUMERIC(18, 2);
declare variable VRADIC NUMERIC(18, 2);
declare variable VRSUBT NUMERIC(18, 2);
declare variable VRIVA NUMERIC(18, 2);
declare variable PRTFTE NUMERIC(9, 2);
declare variable VRRTFTE NUMERIC(18, 2);
declare variable VRRTIVA NUMERIC(18, 2);
declare variable PRTICA NUMERIC(9, 2);
declare variable VRRTICA NUMERIC(18, 2);
declare variable VRTOTAL NUMERIC(18, 2);
declare variable VREXTRA NUMERIC(18, 2);
declare variable TIPOCOMP VARCHAR(3);
declare variable PREFCONT VARCHAR(4);
declare variable VENTAS CHAR(1);
declare variable CTAVENTAS VARCHAR(20);
declare variable IVA CHAR(1);
declare variable CTAIVA VARCHAR(20);
declare variable CONSUMO CHAR(1);
declare variable CTACONSUMO VARCHAR(20);
declare variable CARTERA CHAR(1);
declare variable CTACARTERA VARCHAR(20);
declare variable RTFTE CHAR(1);
declare variable CTARTFTE VARCHAR(20);
declare variable RTIVA CHAR(1);
declare variable CTARTIVA VARCHAR(20);
declare variable RTICA CHAR(1);
declare variable CTARTICA VARCHAR(20);
declare variable INVEN CHAR(1);
declare variable CTAINVEN VARCHAR(20);
declare variable COSTOS CHAR(1);
declare variable CTACOSTOS VARCHAR(20);
declare variable CTADTO VARCHAR(20);
declare variable CTAADIC VARCHAR(20);
declare variable CTAEXTRA VARCHAR(20);
declare variable EXISTE CHAR(1);
declare variable CUENTA VARCHAR(20);
declare variable MONTO NUMERIC(18,2);
declare variable TIPOCUEN CHAR(1);
declare variable NIT VARCHAR(20);
declare variable PROY VARCHAR(4);
declare variable CENTRO VARCHAR(4);
declare variable PROYI VARCHAR(4);
declare variable CENTI VARCHAR(4);
declare variable PORC NUMERIC(5,2);
declare variable DEBITO NUMERIC(18,2);
declare variable CREDITO NUMERIC(18,2);
declare variable NROI INTEGER;
declare variable ART VARCHAR(15);
declare variable IMPINC CHAR(1);
declare variable IMPTOS NUMERIC(18, 2);
declare variable SUMA NUMERIC(18,2);
declare variable PORCIVA NUMERIC(9,2);
declare variable TCTACLIEN VARCHAR(20);
declare variable TCTAVENTA VARCHAR(20);
declare variable TCTARTFTE VARCHAR(20);
declare variable TCTARTIVA VARCHAR(20);
declare variable TCTARTICA VARCHAR(20);
declare variable CTADIC VARCHAR(20);
declare variable BASEADIC VARCHAR(20);
declare variable PORCADIC NUMERIC(5,2);
declare variable VALORADIC NUMERIC(18,2);
declare variable DBADIC CHAR(1);
declare variable PTOVTA INTEGER;
declare variable ANULADO CHAR(1);
declare variable CENT CHAR(1);
DECLARE VARIABLE MERCANCIA NUMERIC(18,2);
declare variable FACTOR DOUBLE PRECISION;
declare variable DIG INTEGER;
DECLARE VARIABLE FOMENTO VARCHAR(2);
DECLARE VARIABLE VRCONSUMO NUMERIC(18,2);
declare variable AUTORET VARCHAR(10);
declare variable FAUTORET DATE;
declare variable IDREM INTEGER;
declare variable IDPED INTEGER;
declare variable DTOXIT CHAR(2);
declare variable ERRORC INTEGER;
BEGIN
EXECUTE PROCEDURE LEE_CONFIGURACION('COMPRAS', 'FACTURAS', 'USAR IMPOCONSUMO COMO PORCENTAJE DE FOMENTO') returning_values (FOMENTO);
EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'FECHA AUTORETENEDOR NO DESCONTAR RETENCIONES DEL SALDO PERO SI CONTABILIZARLAS') returning_values (AUTORET);
if (AUTORET <> '') then
    FAUTORET = CAST(AUTORET AS DATE);
else
    FAUTORET = '9999/12/31';
  /* BUSQUE LA INTERFACE */
  EXISTE = 'N';
  SELECT 'S', TICO_COD, PRCO_PRE, INVE_VENTAS, INVE_IVA, INVE_CONSUMO, INVE_CARTERA, INVE_RTFTE, INVE_RTIVA, INVE_RTICA, INVE_COSTO, INVE_INVEN, INVE_CTAVENTAS, INVE_CTAIVA, INVE_CTACONSUMO, INVE_CTADTO, INVE_CTAADIC, INVE_CTAEXTRA, INVE_CTACARTERA, INVE_CTARTFTE, INVE_CTARTIVA, INVE_CTARTICA, INVE_CTAINVEN, INVE_CTACOSTOS, INVE_CONFIRMAR, INVE_CENTRO
    FROM INTERFAZ_VENTAS
    WHERE INVE_ID = :IDINTER
    INTO :EXISTE, :TIPOCOMP, :PREFCONT, :VENTAS, :IVA, :CONSUMO, :CARTERA, :RTFTE, :RTIVA, :RTICA, :COSTOS, :INVEN, :CTAVENTAS, :CTAIVA, :CTACONSUMO, :CTADTO, :CTAADIC, :CTAEXTRA, :CTACARTERA, :CTARTFTE, :CTARTIVA, :CTARTICA, :CTAINVEN, :CTACOSTOS, :VER, :CENT;
  if (EXISTE = 'S') then
   BEGIN
    /* BORRE CUALQUEIR CONTABILIZACION PREVIA */
    DELETE FROM CONTABILIZACION WHERE CNTB_TIPOREF = 33 AND CNTB_IDREF = :IDDOC;
    /* TRAIGA EL ENCABEZADO DE LA DEVOLUCION */
   SELECT PREF_PRE, DEVT_NUMERO, DEVT_FECHA, F.TERC_NIT, DEVT_IVAINC, PTVT_ID, DEVT_FACTURA, DEVT_DTOMONTO, DEVT_ADICIONAL, DEVT_IVAMONTO, DEVT_EXTRA, DEVT_TOTAL, DEVT_RTFTEPORC, DEVT_RTFTEMONTO, DEVT_RTIVAPORC, DEVT_RTIVAMONTO, DEVT_RTICAPORC, DEVT_RTICAMONTO, TERC_CTARTFTE, TERC_CTARTIVA, TERC_CTARTICA, TERC_CTAVENTA, TERC_CTACLIENTE, DEVT_ANULADO, DEVT_REMID, DEVT_PEDID
        FROM DEVOLUCIONES_VENTAS F, TERCEROS T
        WHERE DEVT_ID = :IDDOC AND F.TERC_NIT = T.TERC_NIT
        INTO :PREF, :NUM, :FECAUX, :NIT, :IMPINC, :PTOVTA, :NUMFAC, :VRDTO, :VRADIC, :VRIVA, :VREXTRA, :VRTOTAL, :PRTFTE, :VRRTFTE, :PORC, :VRRTIVA, :PRTICA, :VRRTICA, :TCTARTFTE, TCTARTIVA, TCTARTICA, TCTAVENTA, TCTACLIEN, ANULADO, :IDREM, :IDPED;
   if (idrem is null) Then
    IDREM = 0;
   if (idped is null) Then
    IDPED = 0;
   if ((ANULADO = 'N') AND (IDREM = 0) AND (IDPED = 0)) then
    BEGIN
    NUMERO = PREF || NUM;
    SELECT SUM(DVDE_CONSUMO) FROM devoluciones_ventas_detalle WHERE DEVT_ID = :iddoc AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL)) INTO :MERCANCIA;
    VRSUBT = VRTOTAL - VREXTRA - VRIVA - MERCANCIA; /* BASE DE RETEFTE Y RETEICA */
    EXECUTE PROCEDURE lee_configuracion ('FACTURACION', 'DEVOLUCIONES', 'DESCUENTO PIE DEVOLUCION IGUAL A SUMA DE DESCUENTOS POR ITEM') returning_values (:DTOXIT);
    if (DTOXIT = 'SI') then
        VRDTO = 0;
    MERCANCIA = VRSUBT - VRADIC + VRDTO;
    IF (CENT = 'B') THEN
        SELECT B.BODE_CENTRO, B.BODE_PROY FROM BODEGA B, DEVOLUCIONES_VENTAS F
            WHERE B.BODE_COD = F.BODE_COD AND F.DEVT_ID = :IDDOC INTO :CENTRO, :PROY;
    IF (CENT = 'V') THEN
        SELECT V.CENT_COD, V.PROY_COD FROM VENDEDORES V, DEVOLUCIONES_VENTAS F
            WHERE V.VEND_COD = F.VEND_COD AND F.DEVT_ID = :IDDOC INTO :CENTRO, :PROY;
    IF (CENT = 'P') THEN
        SELECT P.PREF_CENTRO,P.PREF_PROY  FROM PREFIJOS P, DEVOLUCIONES_VENTAS F
            WHERE P.PREF_PRE = F.PREF_PRE AND F.DEVT_ID = :IDDOC AND P.TIDO_COD = 33 INTO :CENTRO, :PROY;
    EXECUTE PROCEDURE FECHA_A_CONTA(:FECAUX) returning_values (:FECHA);
    /* REGISTRE EL ENCABEZADO CONTABLE */
    IDC = GEN_ID(ID_CONTABILIZA, 1);
    CONC = 'DEVOLUCION VENTAS No. ' || NUMERO || ' EN FACTURA ' || NUMFAC;
    CONC = SUBSTR(CONC, 1, 60);
    INSERT INTO CONTABILIZACION (CNTB_ID, CNTB_TIPOCOMP, CNTB_PREFCNT, CNTB_NUMERO, CNTB_FECHA, CNTB_CONCEPTO, CNTB_REF, CNTB_TIPOREF, CNTB_IDREF, CNTB_PREFREF, CNTB_NUMREF, CNTB_PROCESADO)
        VALUES (:IDC, :TIPOCOMP, :PREFCONT, :NUM, :FECHA, :CONC, '', 33, :IDDOC, :PREF, :NUM, 'N');
    NROI = 0;
    SUMA = 0;
    ERROR = 0;
    /* SI NO HAY CUENTA DE DESCUENTO NI ADICIONAL CALCULE UN FACTOR PARA LAS VENTAS Y EL IVA */
    if (MERCANCIA <> 0) then
        FACTOR = CAST(VRSUBT AS DOUBLE PRECISION) / CAST(MERCANCIA AS DOUBLE PRECISION);
    ELSE
        FACTOR = 1;
    /* TRAIGA EL NUMERO DE DIGITOS PARA EL REDONDEO */
    SELECT CAST(CONF_VALOR AS INTEGER) FROM CONFIGURACION WHERE CONF_MODULO = 'FACTURACION' AND
        CONF_CATEGORIA = 'GENERAL' AND CONF_PROPIEDAD = 'REDONDEO AL MULTIPLO DE DIEZ EN TOTALES' INTO :DIG;
    /* CUENTAS DE VENTAS */
    if (VENTAS = 'A') then
        BEGIN
        FOR SELECT MAX(COAR_CTADEV), SUM(DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO), SUM(DVDE_IVAMONTO), SUM(DVDE_CONSUMO), MAX(B.bode_proy), MAX(B.bode_centro)
            FROM ARTICULO A, CONTABIL_ARTICULO C, DEVOLUCIONES_VENTAS_DETALLE F, BODEGA B
            WHERE F.DEVT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND B.bode_cod = F.bode_cod AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
            GROUP BY COAR_CTADEV
            INTO :CTAVENTAS, :MONTO, :IMPTOS, :VRCONSUMO, :proyi, :centi
            DO
            BEGIN
            if (FOMENTO = 'SI') then
                MONTO = MONTO + VRCONSUMO;
            if ((CTADTO IS NULL) OR (CTADTO = '')) then
                MONTO = MONTO * FACTOR;
            execute procedure redondee(MONTO, DIG) returning_values (MONTO);
            if (MONTO <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTAVENTAS, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT F.ARTI_COD, (DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO), (DVDE_IVAMONTO+DVDE_CONSUMO)
                        FROM ARTICULO A, CONTABIL_ARTICULO C, DEVOLUCIONES_VENTAS_DETALLE F
                        WHERE F.DEVT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTAINV = :CUENTA AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
                        INTO :ART, :MONTO, :IMPTOS
                    DO
                        BEGIN
                        if (IMPINC = 'S') then
                            MONTO = MONTO - IMPTOS;
                        if ((CTADTO IS NULL) OR (CTADTO = '')) then
                            MONTO = MONTO * FACTOR;
                        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        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, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                    NROI = NROI + 1;
                    SUMA = SUMA + MONTO;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    IF (CENT = 'B') THEN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROYI, :CENTI, NULL, NULL, NULL, NULL, 0, 0);
                    ELSE
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA + MONTO;
                    END
                END /* MONTO <> 0 */
            END /* FOR */
        END /* VENTAS X ARTICULO */
     IF ((VENTAS = 'C') OR (VENTAS = 'K')) THEN
        BEGIN
        IF (VENTAS = 'C') THEN
            CTAVENTAS = TCTAVENTA;
        SELECT SUM(DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO), SUM(DVDE_IVAMONTO), SUM(DVDE_CONSUMO)
            FROM DEVOLUCIONES_VENTAS_DETALLE F
            WHERE F.DEVT_ID = :IDDOC  AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
            INTO :MONTO, :IMPTOS, :VRCONSUMO;
        if (FOMENTO = 'SI') then
            MONTO = MONTO + VRCONSUMO;
        if ((CTADTO IS NULL) OR (CTADTO = '')) then
            MONTO = MONTO * FACTOR;
        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
        if (MONTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTAVENTAS, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT F.ARTI_COD, (DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO), (DVDE_IVAMONTO+DVDE_CONSUMO)
                    FROM ARTICULO A, DEVOLUCIONES_VENTAS_DETALLE F
                    WHERE F.DEVT_ID = :IDDOC AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
                    INTO :ART, :MONTO, :IMPTOS
                    DO
                    BEGIN
                    if (IMPINC = 'S') then
                        MONTO = MONTO - IMPTOS;
                    if ((CTADTO IS NULL) OR (CTADTO = '')) then
                        MONTO = MONTO * FACTOR;
                    execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                    NROI = NROI + 1;
                    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, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                NROI = NROI + 1;
                SUMA = SUMA + MONTO;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA + MONTO;
                END
            END /* MONTO <> 0 */
        END /* VENTAS DE CLIENTE O CONSTANTE */
    /* EL IVA EN VENTAS */
    if (IVA = 'A') then
        BEGIN
        FOR SELECT MAX(COAR_CTAIVAV), SUM(DVDE_IVAMONTO), SUM(DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO), SUM(DVDE_CONSUMO)
            FROM ARTICULO A, CONTABIL_ARTICULO C, DEVOLUCIONES_VENTAS_DETALLE F
            WHERE F.DEVT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
            GROUP BY COAR_CTAIVAV
            INTO :CTAIVA, :IMPTOS, :MONTO, :VALORADIC
        DO
            BEGIN
            if (FOMENTO = 'SI') then
                MONTO = MONTO + VALORADIC;
            MONTO = MONTO * -1;
            MONTO = MONTO * FACTOR;
            IMPTOS = IMPTOS * FACTOR;
            execute procedure redondee(MONTO, DIG) returning_values (MONTO);
            execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
            if (IMPTOS <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTAIVA, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT F.ARTI_COD, DVDE_IVAMONTO, (DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO), TAIV_PORC, DVDE_CONSUMO
                        FROM ARTICULO A, CONTABIL_ARTICULO C, DEVOLUCIONES_VENTAS_DETALLE F, TARIFA_IVA T
                        WHERE F.DEVT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND A.TAIV_COD = T.TAIV_COD AND COAR_CTAIVAV = :CUENTA AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
                        INTO :ART, :IMPTOS, :MONTO, :PORCIVA, :VALORADIC
                    DO
                        BEGIN
                        if (IMPINC = 'S') then
                            MONTO = MONTO - IMPTOS - VALORADIC;
                        MONTO = MONTO * -1;
                        MONTO = MONTO * FACTOR;
                        IMPTOS = IMPTOS * FACTOR;
                        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                        execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                        if (IMPTOS <> 0) then
                            BEGIN
                            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :IMPTOS, 0, :MONTO, :PORCIVA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                            NROI = NROI + 1;
                            SUMA = SUMA + IMPTOS;
                            END
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                    NROI = NROI + 1;
                    SUMA = SUMA + IMPTOS;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA + IMPTOS;
                    END
                END   /* IMPTOS <> 0 */
            END /* FOR */
        END /* IVA X ARTICULO */
    if (IVA = 'K') then /* IVA EN CTA CONSTANTE */
        BEGIN
        SELECT SUM(DVDE_IVAMONTO), SUM(DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO), SUM(DVDE_CONSUMO)
            FROM DEVOLUCIONES_VENTAS_DETALLE F
            WHERE F.DEVT_ID = :IDDOC  AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
            INTO :IMPTOS, :MONTO, :VALORADIC;
        if (FOMENTO = 'SI') then
            MONTO = MONTO + VALORADIC;
        MONTO = MONTO * -1;
        MONTO = MONTO * FACTOR;
        IMPTOS = IMPTOS * FACTOR;
        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
        execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
        if (IMPTOS <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTAIVA, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT F.ARTI_COD, (DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO), DVDE_IVAMONTO, TAIV_PORC, DVDE_CONSUMO
                    FROM ARTICULO A, DEVOLUCIONES_VENTAS_DETALLE F, TARIFA_IVA T
                    WHERE F.DEVT_ID = :IDDOC AND A.TAIV_COD = T.TAIV_COD AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
                    INTO :ART, :MONTO, :IMPTOS, :PORCIVA, :VALORADIC
                    DO
                    BEGIN
                    if (IMPINC = 'S') then
                        MONTO = MONTO - IMPTOS - VALORADIC;
                    MONTO = MONTO * -1;
                    MONTO = MONTO * FACTOR;
                    IMPTOS = IMPTOS * FACTOR;
                    execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                    execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                    if (IMPTOS <> 0) then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', :IMPTOS, 0, :MONTO, :PORCIVA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        SUMA = SUMA + IMPTOS;
                        END
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                NROI = NROI + 1;
                SUMA = SUMA + IMPTOS;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA + IMPTOS;
                END
            END /* IMPTOS <> 0 */
        END /* IVA EN CTA CONSTANTE */
    /* EL IMPOCONSUMO */
    if ((CONSUMO = 'A') AND (FOMENTO <> 'SI')) then
        BEGIN
        FOR SELECT MAX(COAR_CTACONS), SUM(DVDE_CONSUMO)
            FROM ARTICULO A, CONTABIL_ARTICULO C, DEVOLUCIONES_VENTAS_DETALLE F
            WHERE F.DEVT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
            GROUP BY COAR_CTACONS
            INTO :CTACONSUMO, :IMPTOS
        DO
            BEGIN
            if (IMPTOS <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTACONSUMO, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, REGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT F.ARTI_COD, DVDE_CONSUMO
                        FROM ARTICULO A, CONTABIL_ARTICULO C, DEVOLUCIONES_VENTAS_DETALLE F
                        WHERE F.DEVT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTACONS = :CUENTA AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
                        INTO :ART, :IMPTOS
                    DO
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 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, :NROI, :CUENTA, :CONC, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                    NROI = NROI + 1;
                    SUMA = SUMA + IMPTOS;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA + IMPTOS;
                    END
                END /* IMPTOS <> 0 */
            END /* FOR */
        END /* CONSUMO X ARTICULO */
    if ((CONSUMO = 'K') AND (FOMENTO <> 'SI')) then
        BEGIN
        SELECT SUM(DVDE_CONSUMO)
            FROM DEVOLUCIONES_VENTAS_DETALLE F
            WHERE F.DEVT_ID = :IDDOC AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
            INTO :IMPTOS;
        if (IMPTOS <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTACONSUMO, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT F.ARTI_COD, DVDE_CONSUMO
                    FROM ARTICULO A, DEVOLUCIONES_VENTAS_DETALLE F
                    WHERE F.DEVT_ID = :IDDOC  AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
                    INTO :ART, :IMPTOS
                    DO
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTACONSUMO, :CONC, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                    NROI = NROI + 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, :NROI, :CTACONSUMO, :CONC, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA + IMPTOS;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTACONSUMO, :CONC, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA + IMPTOS;
                END
            END /* IMPTOS <> 0 */
        END /* CONSUMO EN CTA CONSTANTE */
    /* DESCUENTO */
    if ((CTADTO IS NOT NULL) AND
        (CTADTO <> '') AND
        (VRDTO <> 0)) THEN
        BEGIN
        EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTADTO, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRDTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
            NROI = NROI + 1;
            SUMA = SUMA - VRDTO;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRDTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 33);
            NROI = NROI + 1;
            SUMA = SUMA - VRDTO;
            END
        END /* DESCUENTO */
    /* VALOR ADIC */
    if ((CTAADIC IS NOT NULL) AND
        (CTAADIC <> '') AND
        (VRADIC <> 0)) THEN
        BEGIN
        EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTAADIC, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRADIC, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
            NROI = NROI + 1;
            SUMA = SUMA + VRADIC;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRADIC, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 33);
            NROI = NROI + 1;
            SUMA = SUMA + VRADIC;
            END
        END /* VR. ADIC */
    /* VALOR EXTRA */
    if ((CTAEXTRA IS NOT NULL) AND
        (CTAEXTRA <> '') AND
        (VREXTRA <> 0)) THEN
        BEGIN
        EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTAEXTRA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VREXTRA, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
            NROI = NROI + 1;
            SUMA = SUMA + VREXTRA;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VREXTRA, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 33);
            NROI = NROI + 1;
            SUMA = SUMA + VREXTRA;
            END
        END /* VR. EXTRA */
    /* RETENCION FUENTE */
    if ((RTFTE = 'C') or (RTFTE = 'K')) then
      if (VRRTFTE <> 0) then
        BEGIN
        if (RTFTE = 'C') then
            CTARTFTE = TCTARTFTE;
        EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTARTFTE, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, (:VRSUBT*-1), :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
            NROI = NROI + 1;
            SUMA = SUMA - VRRTFTE;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, (:VRSUBT*-1), :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA - VRRTFTE;
            END
        /* AUTORETENCION */
        if (FAUTORET <= fecaux) then
            BEGIN
            EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'CUENTA DE AUTORETENCION EN LA FUENTE') returning_values (CTARTFTE);
            EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTARTFTE, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :VRSUBT, :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                NROI = NROI + 1;
                SUMA = SUMA + VRRTFTE;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :VRSUBT, :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA + VRRTFTE;
                END
            END
        END /* RTFTE */
    if (RTFTE = 'A') then
      BEGIN
      FOR SELECT MAX(COAR_CTARTFTEV), MAX(COAR_RTFTE), MIN(COAR_RTBASE), SUM(DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO), SUM((DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO)*COAR_RTFTE)
        FROM CONTABIL_ARTICULO C, devoluciones_ventas_detalle F
        WHERE F.devt_id = :IDDOC AND F.ARTI_COD = C.ARTI_COD AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
        GROUP BY COAR_CTARTFTEV
        INTO :CTARTFTE, :PRTFTE, :baseadic, :MONTO, :VRRTFTE
        DO
        BEGIN
        MONTO = MONTO * FACTOR;
        if (MONTO >= BASEADIC) then
            BEGIN
            VRRTFTE = VRRTFTE * FACTOR / 100;
            execute procedure redondee(VRRTFTE, DIG) returning_values (VRRTFTE);
            execute procedure redondee(MONTO, DIG) returning_values (MONTO);
            if (VRRTFTE <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTARTFTE, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, (:MONTO*-1), :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                    NROI = NROI + 1;
                    SUMA = SUMA - VRRTFTE;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, (:MONTO*-1), :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA - VRRTFTE;
                    END
                /* AUTORETENCION */
                if (FAUTORET <= fecaux) then
                    BEGIN
                    EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'CUENTA DE AUTORETENCION EN LA FUENTE') returning_values (CTARTFTE);
                    EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTARTFTE, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
                    if (ERRORC <> 0) then
                        ERROR = ERROR + 1;
                    if (TIPOCUEN = 'C') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :MONTO, :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                        NROI = NROI + 1;
                        SUMA = SUMA + VRRTFTE;
                        END
                    if (TIPOCUEN = 'N') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :MONTO, :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NROI = NROI + 1;
                        SUMA = SUMA + VRRTFTE;
                        END
                    END
                END
            END
        END /* RTFTE */
      END
    /* RETENCION IVA */
    if ((RTIVA = 'C') or (RTIVA = 'K')) then
      if (VRRTIVA <> 0) then
        BEGIN
        if (RTIVA = 'C') then
            CTARTIVA = TCTARTIVA;
        EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTARTIVA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTIVA, (:VRIVA*-1), :PORC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
            NROI = NROI + 1;
            SUMA = SUMA - VRRTIVA;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTIVA, (:VRIVA*-1), :PORC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA - VRRTIVA;
            END
        END /* RTIVA */
    /* RETENCION DE ICA */
    if ((RTICA = 'C') or (RTICA = 'K')) then
      if (VRRTICA <> 0) then
        BEGIN
        if (RTICA = 'C') then
            CTARTICA = TCTARTICA;
        EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTARTICA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTICA, (:VRSUBT*-1), :PRTICA, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
            NROI = NROI + 1;
            SUMA = SUMA - VRRTICA;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTICA, (:VRSUBT*-1), :PRTICA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA - VRRTICA;
            END
        END /* RTICA */
    /* CIERRE EL COMPROBANTE CONTRA LA CUENTA DEL TERCERO O LA CONSTANTE */
    if ((SUMA <> 0) and ((CARTERA = 'C') or (CARTERA = 'K') or (CARTERA = 'J'))) then
        BEGIN
        if (SUMA < 0) then
            BEGIN
            DEBITO = SUMA * -1;
            CREDITO = 0;
            END
        ELSE
            BEGIN
            DEBITO = 0;
            CREDITO = SUMA;
            END
        if (CARTERA = 'C') then
            CTACARTERA = TCTACLIEN;
        if (CARTERA = 'J') then
            BEGIN
            /* BUSQUE LA CUENTA DE LA CAJA */
            SELECT CAJA_CUENTA FROM CAJAS C, PUNTO_VENTA P
                WHERE P.CAJA_ID = C.CAJA_ID AND PTVT_ID = :PTOVTA
                INTO :CTACARTERA;
            END
        EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTACARTERA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :DEBITO, :CREDITO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
        if (TIPOCUEN = 'N') then
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :DEBITO, :CREDITO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
        NROI = NROI + 1;
        END /* SUMA EN CARTERA */
    /* CALCULE COSTOS EN VENTAS */
    EXECUTE PROCEDURE COSTO_EN_VENTAS(33, :IDDOC);
    if (COSTOS = 'A') then
        BEGIN
        FOR SELECT MAX(CTACOS), SUM(cast(CANT as double precision) * COSTO)
            FROM COSTO_VENTAS WHERE TIDO_COD = 33 AND COVE_ID = :IDDOC
            GROUP BY CTACOS
            INTO :CTACOSTOS, :MONTO
        DO
            BEGIN
            if (MONTO <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTACOSTOS, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT ARTI_COD, cast(CANT as double precision) * COSTO
                        FROM COSTO_VENTAS WHERE TIDO_COD = 33 AND COVE_ID = :IDDOC AND CTACOS = :CUENTA
                        INTO :ART, :MONTO
                    DO
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                    NROI = NROI + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    END
                END /* MONTO <> 0 */
            END /* FOR */
        END /* COSTOS */
    if (COSTOS = 'K') then
        BEGIN
        SELECT SUM(cast(CANT as double precision) * COSTO)
            FROM COSTO_VENTAS WHERE TIDO_COD = 33 AND COVE_ID = :IDDOC
            INTO :MONTO;
        if (MONTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTACOSTOS, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, REGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT ARTI_COD, cast(CANT as double precision) * COSTO
                    FROM COSTO_VENTAS WHERE TIDO_COD = 33 AND COVE_ID = :IDDOC
                    INTO :ART, :MONTO
                DO
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTACOSTOS, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                    NROI = NROI + 1;
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTACOSTOS, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                NROI = NROI + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTACOSTOS, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                END
            END /* MONTO <> 0 */
        END /* COSTOS = K */
    if (INVEN = 'A') then
        BEGIN
        FOR SELECT MAX(CTAINV), SUM(cast(CANT as double precision) * COSTO)
            FROM COSTO_VENTAS WHERE TIDO_COD = 33 AND COVE_ID = :IDDOC
            GROUP BY CTAINV
            INTO :CTAINVEN, :MONTO
        DO
            BEGIN
            if (MONTO <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTAINVEN, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, REGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT ARTI_COD, cast(CANT as double precision) * COSTO
                        FROM COSTO_VENTAS WHERE TIDO_COD = 33 AND COVE_ID = :IDDOC AND CTAINV = :CUENTA
                        INTO :ART, :MONTO
                    DO
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                    NROI = NROI + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    END
                END /* MONTO <> 0 */
            END /* FOR */
        END /* INVEN = A */
    if (INVEN = 'K') then
        BEGIN
        SELECT SUM(cast(CANT as double precision) * COSTO)
            FROM COSTO_VENTAS WHERE TIDO_COD = 33 AND COVE_ID = :IDDOC
            INTO :MONTO;
        if (MONTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTAINVEN, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT ARTI_COD, cast(CANT as double precision) * COSTO
                    FROM COSTO_VENTAS WHERE TIDO_COD = 33 AND COVE_ID = :IDDOC
                    INTO :ART, :MONTO
                DO
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTAINVEN, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                    NROI = NROI + 1;
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAINVEN, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                NROI = NROI + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAINVEN, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                END
            END /* MONTO <> 0 */
        END /* INVEN = K */
    /* recorra las cuentas adicionales */
    FOR SELECT INVC_CUENTA, INVC_BASE, INVC_PORC, INVC_VALOR, INVC_DB
        FROM INTERFAZ_VENTAS_CTAS WHERE INVE_ID = :IDINTER
        INTO :CTADIC, :BASEADIC, :PORCADIC, :VALORADIC, :DBADIC
        DO
        BEGIN
        if (valoradic <> 0) then
            monto = valoradic;
        else
            BEGIN
            if (:BASEADIC = 'SUBTOTAL') then
                VALORADIC = vrsubt;
            if (:BASEADIC = 'DESCUENTO') then
                VALORADIC = VRDTO;
            if (:BASEADIC = 'IVA') then
                VALORADIC = VRIVA;
            if (:BASEADIC = 'ADICIONAL') then
                VALORADIC = VRADIC;
            if (:BASEADIC = 'EXTRA') then
                VALORADIC = VREXTRA;
            if (:BASEADIC = 'TOTAL') then
                VALORADIC = VRTOTAL;
            MONTO = VALORADIC * PORCADIC;
            END
        if (MONTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTADIC, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                if (DBADIC = 'S') then
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                ELSE
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                NROI = NROI + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                if (DBADIC = 'S') then
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                ELSE
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                END
            NROI = NROI + 1;
            END
        END
    if (error > 0) then
        ver = 'S';
    SUSPEND;
    END
   END /* EXISTE LA INTERFAZ */
  ELSE
    BEGIN
    EXECUTE PROCEDURE ERROR (33, :IDDOC, :PREF, 1);
    ERROR = ERROR + 1;
    VER = 'S';
    SUSPEND;
    END
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE DEVOLUCIONES_SIN_CONTABILIDAD(
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    ID INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    ESTADO VARCHAR(20),
    IDI INTEGER,
    IDC INTEGER)
AS
DECLARE VARIABLE VER CHAR(2);
declare variable FECICNT VARCHAR(10);
declare variable FECFCNT VARCHAR(10);
declare variable ERROR INTEGER;
declare variable idref INTEGER;
BEGIN
EXECUTE PROCEDURE fecha_a_conta(FECINI) returning_values (FECICNT);
EXECUTE PROCEDURE fecha_a_conta(FECFIN) returning_values (FECFCNT);
FOR SELECT DEVT_ID, PREF_PRE, DEVT_NUMERO FROM devoluciones_ventas WHERE DEVT_ANULADO = 'N' AND
    DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN
    INTO :ID, :PREF, :NUMERO
DO
  BEGIN
  idref = null;
  SELECT ENCO_IDREF FROM COMPROBANTE_ENCABEZADO WHERE ENCO_TIPOREF = 33 AND ENCO_FECHA >= :FECICNT AND ENCO_FECHA <= :FECFCNT and ENCO_IDREF = :id into :idref;
  if (idref IS NULL) then
  begin
   ESTADO = 'PROCESANDO';
   SUSPEND;
   SELECT MAX(INVE_ID) FROM INTERFAZ_VENTAS WHERE PREF_PRE = :PREF AND TIDO_COD = 33 INTO :IDI;
   EXECUTE PROCEDURE contabil_devolcli (:ID, :IDI) RETURNING_VALUES (:ERROR, :VER, :IDC);
   if (ERROR = 0) then
    BEGIN
    EXECUTE PROCEDURE CONTABILIZA_PENDIENTE (:IDC);
    ESTADO = 'OK';
    END
   ELSE
    ESTADO = 'ERROR';
   suspend;
  End
  END
END

^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure CRUCES_DOCUMENTOS (
    TIPOORI integer,
    IDORI integer)
returns (
    TIPODES integer,
    ID integer,
    NOMTIPO varchar(8),
    PREFIJO varchar(4),
    NUMERO varchar(6),
    FECHA date)
AS
declare variable IDC INTEGER;
declare variable PEDAUTO CHAR(2);
begin
EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION','FACTURAS','GENERAR PEDIDO AUTOMATICAMENTE CON LA FACTURA') RETURNING_VALUES (PEDAUTO);
FOR SELECT DISTINCT COFA_TIPODES, COFA_ID FROM CONSOLIDADO_FALTANTES
    WHERE COFA_TIPOORI = :TIPOORI AND COFA_IDORI = :IDORI AND COFA_OK = 'S' INTO :TIPODES, :IDC
    DO
    BEGIN
    SELECT TIDO_NOMCORTO FROM tipo_documento WHERE TIDO_COD = :tipodes INTO :nomtipo;
    if (TIPODES = 21) then
        SELECT FACO_ID, PREF_PRE, FACO_NUMERO, FACO_FECHA FROM FACTURAS_COMPRA WHERE FACO_CONSOLIDA = :IDC AND FACO_ANULADO = 'N' INTO :ID, :PREFIJO, :NUMERO, :FECHA;
    if (TIPODES = 22) then
        SELECT REPR_ID, PREF_PRE, REPR_NUMERO, REPR_FECHA FROM remision_proveedor WHERE REPR_CONSOLIDA = :IDC AND REPR_ANULADO = 'N' INTO :ID, :PREFIJO, :NUMERO, :FECHA;
    if (TIPODES = 23) then
        SELECT ORDC_ID, PREF_PRE, ORDC_NUMERO, ORDC_FECHA FROM ORDENES_COMPRA WHERE ORDC_CONSOLIDA = :IDC AND ORDC_ANULADO = 'N' INTO :ID, :PREFIJO, :NUMERO, :FECHA;
    if (TIPODES = 31) then
        SELECT FACT_ID, PREF_PRE, FACT_NUMERO, FACT_FECHA FROM FACTURAS WHERE FACT_CONSOLIDA = :IDC AND FACT_ANULADO = 'N' INTO :ID, :PREFIJO, :NUMERO, :FECHA;
    if (TIPODES = 32) then
        SELECT REVT_ID, PREF_PRE, REVT_NUMERO, REVT_FECHA FROM remisiones_venta WHERE REVT_CONSOLIDA = :IDC AND REVT_ANULADO = 'N' INTO :ID, :PREFIJO, :NUMERO, :FECHA;
    if (TIPODES = 34) then
        SELECT PEDI_ID, PREF_PRE, PEDI_NUMERO, PEDI_FECHA FROM PEDIDOS WHERE PEDI_CONSOLIDA = :IDC AND PEDI_ANULADO = 'N' INTO :ID, :PREFIJO, :NUMERO, :FECHA;
    suspend;
    END

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

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

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

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure DETALLE_VENTAS_CLIENTE (
    NIT varchar(20),
    FECINI date,
    FECFIN date)
returns (
    TIPO varchar(8),
    PREFIJO varchar(4),
    NUMERO varchar(6),
    ID integer,
    FECDOC date,
    SUBTOTAL numeric(18,2),
    IVA numeric(18,2),
    CONSUMO numeric(18,2),
    TOTAL numeric(18,2))
AS
BEGIN
  TIPO = 'FACTVENT';
  FOR SELECT FACT_ID, PREF_PRE, FACT_NUMERO, FACT_FECHA
    FROM FACTURAS
    WHERE TERC_NIT = :NIT AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND FACT_ANULADO = 'N'
    INTO :ID, :PREFIJO, :NUMERO, :FECDOC DO
    BEGIN
    EXECUTE PROCEDURE TOTAL_DOC_VENTAS(31, ID) returning_values (SUBTOTAL, IVA, CONSUMO);
    TOTAL = SUBTOTAL + IVA + CONSUMO;
    SUSPEND;
    END
    
  TIPO = 'DEVOLCLI';
  FOR SELECT DEVT_ID, PREF_PRE, DEVT_NUMERO, DEVT_FECHA
    FROM DEVOLUCIONES_VENTAS
    WHERE TERC_NIT = :NIT AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND DEVT_ANULADO = 'N' AND ((DEVT_REMID IS NULL) or (DEVT_REMID = 0))  AND ((DEVT_PEDID IS NULL) or (DEVT_PEDID = 0))
    INTO :ID, :PREFIJO, :NUMERO, :FECDOC DO
    BEGIN
    EXECUTE PROCEDURE TOTAL_DOC_VENTAS(33, ID) returning_values (SUBTOTAL, IVA, CONSUMO);
    TOTAL = SUBTOTAL + IVA + CONSUMO;
    SUBTOTAL = SUBTOTAL * -1;
    IVA = IVA * -1;
    CONSUMO = CONSUMO * -1;
    TOTAL = TOTAL * -1;
    SUSPEND;
    END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure DETALLE_VENTAS_VENDEDOR (
    VEND integer,
    FECINI date,
    FECFIN date)
returns (
    TIPO varchar(8),
    PREFIJO varchar(4),
    NUMERO varchar(6),
    ID integer,
    FECDOC date,
    CLIENTE varchar(60),
    SUBTOTAL numeric(18,2),
    IVA numeric(18,2),
    CONSUMO numeric(18,2),
    TOTAL numeric(18,2))
AS
BEGIN
  TIPO = 'FACTVENT';
  FOR SELECT FACT_ID, PREF_PRE, FACT_NUMERO, FACT_FECHA, FACT_NOMCLIENTE
    FROM FACTURAS
    WHERE VEND_COD = :VEND AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN  AND FACT_ANULADO = 'N'
    INTO :ID, :PREFIJO, :NUMERO, :FECDOC, :CLIENTE DO
    BEGIN
    EXECUTE PROCEDURE TOTAL_DOC_VENTAS(31, ID) returning_values (SUBTOTAL, IVA, CONSUMO);
    TOTAL = SUBTOTAL + IVA + CONSUMO;
    SUSPEND;
    END
    
  TIPO = 'DEVOLCLI';
  FOR SELECT DEVT_ID, PREF_PRE, DEVT_NUMERO, DEVT_FECHA, DEVT_NOMTERC
    FROM DEVOLUCIONES_VENTAS
    WHERE VEND_COD = :VEND AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND DEVT_ANULADO = 'N' AND ((DEVT_REMID IS NULL) or (DEVT_REMID = 0)) AND ((DEVT_PEDID IS NULL) or (DEVT_PEDID = 0))
    INTO :ID, :PREFIJO, :NUMERO, :FECDOC, :CLIENTE DO
    BEGIN
    EXECUTE PROCEDURE TOTAL_DOC_VENTAS(33, ID) returning_values (SUBTOTAL, IVA, CONSUMO);
    TOTAL = SUBTOTAL + IVA + CONSUMO;
    SUBTOTAL = SUBTOTAL * -1;
    IVA = IVA * -1;
    CONSUMO = CONSUMO * -1;
    TOTAL = TOTAL * -1;
    SUSPEND;
    END
END
^

SET TERM ; ^

SET TERM ^ ;

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

SET TERM ; ^

SET TERM ^ ;

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

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

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure REP_VENTAS_ARTICULO (
    TIPO integer,
    ARTINI varchar(20),
    ARTFIN varchar(20),
    DETALLE char(1),
    FECINI date,
    FECFIN date,
    GRPINI varchar(3),
    GRPFIN varchar(3),
    PTOINI integer,
    PTOFIN integer,
    ORDEN char(1),
    AGRUPA char(1),
    CEROS char(1),
    UNIDADES char(1),
    SUBEMPRESA integer)
returns (
    ARTICULO varchar(15),
    DESCRIPCION varchar(60),
    CODGRUPO varchar(2),
    NOMGRUPO varchar(30),
    CODSUBG varchar(3),
    NOMSUBG varchar(30),
    CODMARC varchar(3),
    NOMMARC varchar(30),
    UNIDAD varchar(8),
    CANTIDAD numeric(18,4),
    BASE numeric(18,2),
    IVA numeric(18,2),
    CONSUMO numeric(18,2),
    PREFIJO varchar(4),
    NUMERO varchar(6),
    FECHA date,
    DTO numeric(9,2),
    TRANSP varchar(60),
    ALTERNATIVAS numeric(18,4),
    NOMTIPO varchar(50))
AS
DECLARE VARIABLE CODINI VARCHAR(20);
DECLARE VARIABLE CODFIN VARCHAR(20);
DECLARE VARIABLE DESINI VARCHAR(20);
DECLARE VARIABLE DESFIN VARCHAR(20);
declare variable MARINI VARCHAR(3);
declare variable MARFIN VARCHAR(3);
declare variable NUMROWS INTEGER;
declare variable CANTAUX NUMERIC(18,4);
BEGIN
if (ORDEN = 'C') then
    BEGIN
    CODINI = ARTINI;
    CODFIN = ARTFIN;
    DESINI = '';
    DESFIN = 'zz';
    END
ELSE
    BEGIN
    DESINI = ARTINI;
    DESFIN = ARTFIN;
    CODINI = '0';
    CODFIN = 'zz';
    END
if (AGRUPA = 'G') then
    BEGIN
    MARINI = '';
    MARFIN = 'zz';
    END
ELSE
    if (AGRUPA = 'M') then
        BEGIN
        MARINI = GRPINI;
        MARFIN = GRPFIN;
        GRPINI = '';
        GRPFIN = 'zz';
        END
    ELSE
        BEGIN
        MARINI = '';
        MARFIN = 'zz';
        END
/* BORRA LA TABLA AUXILIAR */
DELETE FROM reportes_aux WHERE REPA_ID = 1 AND REPA_USER = USER;

if (DETALLE = 'N') then
    BEGIN
    if (BIN_AND(TIPO, 1) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 31 INTO :NOMTIPO;
        /* BORRA LA TABLA AUXILIAR */
        DELETE FROM reportes_aux WHERE REPA_ID = 1 AND REPA_USER = USER;

        FOR SELECT MAX(D.ARTI_COD), SUM(FADE_CANT * FADE_FACTOR), SUM(FACT_FACTOR*(FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO)),
            SUM(FACT_FACTOR*FADE_IVAMONTO), SUM(FADE_CONSUMO), MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD)
            FROM FACTURAS_DETALLE D, FACTURAS F, PREFIJOS P, ARTICULO A WHERE F.PTVT_ID >= :PTOINI AND F.PTVT_ID <= :PTOFIN AND
            F.FACT_ID = D.FACT_ID AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND D.ARTI_COD = A.arti_cod AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            FACT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) and substring(a.arti_cod from 1 FOR 2) <> '.t'
            GROUP BY D.ARTI_COD
            INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,
            :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
            DO
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            if (UNIDADES = 'S') then
                BEGIN
                cantaux = 1;
                select max(unar_faccan) from unidad_articulo where arti_cod = :articulo into :cantaux;
                if (cantaux IS NULL) then
                    cantaux = 1;
                alternativas = floor(cantidad / cantaux);
                cantidad = cantidad - alternativas * cantaux;
                END
            if (CEROS = 'S') then
                INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (1, USER, :ARTICULO);
            SUSPEND;
            END
        if (CEROS = 'S') then
            BEGIN
            /* agregue los articulos sin factura */
            FOR SELECT ARTI_COD, 0, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND
                    A.ARTI_DES <= :DESFIN AND A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND
                    (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN)))
                INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,:DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                DO
                BEGIN
                SELECT COUNT(REPA_ARTICULO) FROM REPORTES_AUX WHERE REPA_ID = 1 AND REPA_USER = USER AND REPA_ARTICULO = :articulo INTO :numrows;
                if (numrows = 0) then
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        END

    if (BIN_AND(TIPO, 2) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 32 INTO :NOMTIPO;
        /* BORRA LA TABLA AUXILIAR */
        DELETE FROM reportes_aux WHERE REPA_ID = 1 AND REPA_USER = USER;

        FOR SELECT MAX(D.ARTI_COD), SUM(RVDE_CANT * RVDE_FACTOR), SUM((RVDE_TOTAL-RVDE_IVAMONTO-RVDE_CONSUMO)), SUM(RVDE_IVAMONTO),
            SUM(RVDE_CONSUMO), MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD)
            FROM REMISIONES_VENTA_DETALLE D, REMISIONES_VENTA R, PREFIJOS P, ARTICULO A WHERE R.PTVT_ID >= :PTOINI AND R.PTVT_ID <= :PTOFIN AND
            R.REVT_ID = D.REVT_ID AND P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = 32 AND D.ARTI_COD = A.arti_cod AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            REVT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY D.ARTI_COD
            INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,
            :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
            DO
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            if (UNIDADES = 'S') then
                BEGIN
                cantaux = 1;
                select max(unar_faccan) from unidad_articulo where arti_cod = :articulo into :cantaux;
                if (cantaux IS NULL) then
                    cantaux = 1;
                alternativas = floor(cantidad / cantaux);
                cantidad = cantidad - alternativas * cantaux;
                END
            if (CEROS = 'S') then
                INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (1, USER, :ARTICULO);
            SUSPEND;
            END
        if (CEROS = 'S') then
            BEGIN
            /* agregue los articulos sin factura */
            FOR SELECT ARTI_COD, 0, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND
                    A.ARTI_DES <= :DESFIN AND A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND
                    (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN)))
                INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,:DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                DO
                BEGIN
                SELECT COUNT(REPA_ARTICULO) FROM REPORTES_AUX WHERE REPA_ID = 1 AND REPA_USER = USER AND REPA_ARTICULO = :articulo INTO :numrows;
                if (numrows = 0) then
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        END

    if (BIN_AND(TIPO, 4) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 33 INTO :NOMTIPO;
        /* BORRA LA TABLA AUXILIAR */
        DELETE FROM reportes_aux WHERE REPA_ID = 1 AND REPA_USER = USER;

        FOR SELECT MAX(D.ARTI_COD), SUM(DVDE_CANT * DVDE_FACTOR), SUM(DEVT_FACTOR*(DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO)),
            SUM(DEVT_FACTOR*DVDE_IVAMONTO), SUM(DVDE_CONSUMO), MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD)
            FROM devoluciones_ventas_detalle D, DEVOLUCIONES_VENTAS V, PREFIJOS P, ARTICULO A WHERE V.PTVT_ID >= :PTOINI AND V.PTVT_ID <= :PTOFIN AND
            V.DEVT_ID = D.DEVT_ID AND P.PREF_PRE = V.PREF_PRE AND P.TIDO_COD = 33 AND D.ARTI_COD = A.arti_cod AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            DEVT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) AND ((DEVT_REMID = 0) or (DEVT_REMID IS NULL)) AND ((DEVT_PEDID = 0) or (DEVT_PEDID IS NULL))
            GROUP BY D.ARTI_COD
            INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,
            :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
            DO
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            CANTIDAD = CANTIDAD * -1;
            BASE = BASE * -1;
            IVA = IVA * -1;
            CONSUMO = CONSUMO * -1;
            if (UNIDADES = 'S') then
                BEGIN
                cantaux = 1;
                select max(unar_faccan) from unidad_articulo where arti_cod = :articulo into :cantaux;
                if (cantaux IS NULL) then
                    cantaux = 1;
                alternativas = floor(cantidad / cantaux);
                cantidad = cantidad - alternativas * cantaux;
                END
            if (CEROS = 'S') then
                INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (1, USER, :ARTICULO);
            SUSPEND;
            END
        if (CEROS = 'S') then
            BEGIN
            /* agregue los articulos sin factura */
            FOR SELECT ARTI_COD, 0, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND
                    A.ARTI_DES <= :DESFIN AND A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND
                    (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN)))
                INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,:DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                DO
                BEGIN
                SELECT COUNT(REPA_ARTICULO) FROM REPORTES_AUX WHERE REPA_ID = 1 AND REPA_USER = USER AND REPA_ARTICULO = :articulo INTO :numrows;
                if (numrows = 0) then
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        END
    if (BIN_AND(TIPO, 8) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 34 INTO :NOMTIPO;
        /* BORRA LA TABLA AUXILIAR */
        DELETE FROM reportes_aux WHERE REPA_ID = 1 AND REPA_USER = USER;

        FOR SELECT MAX(D.ARTI_COD), SUM(PEDE_CANT * PEDE_FACTOR), SUM(PEDI_FACTOR*(PEDE_TOTAL-PEDE_IVAMONTO-PEDE_CONSUMO)),
            SUM(PEDI_FACTOR*PEDE_IVAMONTO), SUM(PEDE_CONSUMO),
            MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD)
            FROM PEDIDOS_DETALLE D, PEDIDOS P, PREFIJOS R, ARTICULO A WHERE P.PTVT_ID >= :PTOINI AND P.PTVT_ID <= :PTOFIN AND
            P.PEDI_ID = D.PEDI_ID AND P.PREF_PRE = R.PREF_PRE AND R.TIDO_COD = 34 AND D.ARTI_COD = A.arti_cod AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            PEDI_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY D.ARTI_COD
            INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,
            :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
            DO
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            if (UNIDADES = 'S') then
                BEGIN
                cantaux = 1;
                select max(unar_faccan) from unidad_articulo where arti_cod = :articulo into :cantaux;
                if (cantaux IS NULL) then
                    cantaux = 1;
                alternativas = floor(cantidad / cantaux);
                cantidad = cantidad - alternativas * cantaux;
                END
            if (CEROS = 'S') then
                INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (1, USER, :ARTICULO);
            SUSPEND;
            END
        if (CEROS = 'S') then
            BEGIN
            /* agregue los articulos sin factura */
            FOR SELECT ARTI_COD, 0, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND
                    A.ARTI_DES <= :DESFIN AND A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND
                    (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN)))
                INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,:DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                DO
                BEGIN
                SELECT COUNT(REPA_ARTICULO) FROM REPORTES_AUX WHERE REPA_ID = 1 AND REPA_USER = USER AND REPA_ARTICULO = :articulo INTO :numrows;
                if (numrows = 0) then
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        END
    if (BIN_AND(TIPO, 16) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 35 INTO :NOMTIPO;
        /* BORRA LA TABLA AUXILIAR */
        DELETE FROM reportes_aux WHERE REPA_ID = 1 AND REPA_USER = USER;

        FOR SELECT MAX(D.ARTI_COD), SUM(CTDE_CANT * CTDE_FACTOR), SUM(COTI_FACTOR*(CTDE_TOTAL-CTDE_IVAMONTO-CTDE_CONSUMO)),
            SUM(COTI_FACTOR*CTDE_IVAMONTO), SUM(CTDE_CONSUMO),
            MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD)
            FROM COTIZACIONES_DETALLE D, COTIZACIONES C, PREFIJOS P, ARTICULO A WHERE C.PTVT_ID >= :PTOINI AND C.PTVT_ID <= :PTOFIN AND
            C.COTI_ID = D.COTI_ID AND P.PREF_PRE = C.PREF_PRE AND P.TIDO_COD = 35 AND D.ARTI_COD = A.arti_cod AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND COTI_FECHA >= :FECINI AND COTI_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            COTI_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY D.ARTI_COD
            INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,
            :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
            DO
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            if (UNIDADES = 'S') then
                BEGIN
                cantaux = 1;
                select max(unar_faccan) from unidad_articulo where arti_cod = :articulo into :cantaux;
                if (cantaux IS NULL) then
                    cantaux = 1;
                alternativas = floor(cantidad / cantaux);
                cantidad = cantidad - alternativas * cantaux;
                END
            if (CEROS = 'S') then
                INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (1, USER, :ARTICULO);
            SUSPEND;
            END
        if (CEROS = 'S') then
            BEGIN
            /* agregue los articulos sin factura */
            FOR SELECT ARTI_COD, 0, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND
                    A.ARTI_DES <= :DESFIN AND A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND
                    (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN)))
                INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,:DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                DO
                BEGIN
                SELECT COUNT(REPA_ARTICULO) FROM REPORTES_AUX WHERE REPA_ID = 1 AND REPA_USER = USER AND REPA_ARTICULO = :articulo INTO :numrows;
                if (numrows = 0) then
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        END
    END
ELSE
  if (DETALLE = 'S') then
    BEGIN
    if (BIN_AND(TIPO, 1) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 31 INTO :NOMTIPO;
        FOR SELECT F.PREF_PRE, FACT_NUMERO, FACT_FECHA, D.ARTI_COD, FADE_CANT * FADE_FACTOR, (FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO)*FACT_FACTOR,
        FADE_IVAMONTO*FACT_FACTOR, FADE_CONSUMO, FADE_DTOPORC,
            ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD, FACT_TRANSP
            FROM FACTURAS F, FACTURAS_DETALLE D, PREFIJOS P, ARTICULO A WHERE F.PTVT_ID >= :PTOINI AND F.PTVT_ID <= :PTOFIN AND
                F.FACT_ID = D.FACT_ID AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND D.ARTI_COD = A.arti_cod AND
                A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
                A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND FACT_FECHA >= :FECINI AND
                (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
                FACT_FECHA <= :FECFIN AND FACT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) and substring(a.arti_cod from 1 FOR 2) <> '.t'
            /*ORDER BY D.ARTI_COD, FACT_FECHA, FACT_ID, FADE_ITEM*/
            INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO, :DTO,
                :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :transp
            DO
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            SUSPEND;
            END
        END
    if (BIN_AND(TIPO, 2) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 32 INTO :NOMTIPO;
        FOR SELECT R.PREF_PRE, REVT_NUMERO, REVT_FECHA, D.ARTI_COD, RVDE_CANT * RVDE_FACTOR, (RVDE_TOTAL-RVDE_IVAMONTO-RVDE_CONSUMO), RVDE_IVAMONTO, RVDE_CONSUMO, RVDE_DTOPORC,
            ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD, REVT_TRANSP
            FROM REMISIONES_VENTA R, REMISIONES_VENTA_DETALLE D, PREFIJOS P, ARTICULO A
            WHERE R.REVT_ID = D.REVT_ID AND P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = 32 AND D.ARTI_COD = A.arti_cod AND
                A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
                A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN AND
                (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
                REVT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO, :DTO,
                :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :transp
            DO
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            SUSPEND;
            END
        END
    if (BIN_AND(TIPO, 4) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 33 INTO :NOMTIPO;
        FOR SELECT V.PREF_PRE, DEVT_NUMERO, DEVT_FECHA, D.ARTI_COD, DVDE_CANT * DVDE_FACTOR, (DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO)*DEVT_FACTOR,
            DVDE_IVAMONTO*DEVT_FACTOR, DVDE_CONSUMO, DVDE_DTOPORC,
            ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD 
            FROM DEVOLUCIONES_VENTAS V, DEVOLUCIONES_VENTAS_DETALLE D, PREFIJOS P, ARTICULO A WHERE V.PTVT_ID >= :PTOINI AND V.PTVT_ID <= :PTOFIN AND
                V.DEVT_ID = D.DEVT_ID AND P.PREF_PRE = V.PREF_PRE AND P.TIDO_COD = 33 AND D.ARTI_COD = A.arti_cod AND
                A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
                A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND
                (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
                DEVT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) AND ((DEVT_REMID = 0) or (DEVT_REMID IS NULL))  AND ((DEVT_PEDID = 0) or (DEVT_PEDID IS NULL))
            /*ORDER BY D.ARTI_COD, DEVT_FECHA, DEVT_ID, DVDE_ITEM*/
            INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO, :DTO,
                :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
            DO
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            CANTIDAD = CANTIDAD * -1;
            BASE = BASE * -1;
            IVA = IVA * -1;
            CONSUMO = CONSUMO * -1;
            SUSPEND;
            END
        END
    if (BIN_AND(TIPO, 8) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 34 INTO :NOMTIPO;
        FOR SELECT P.PREF_PRE, PEDI_NUMERO, PEDI_FECHA, D.ARTI_COD, PEDE_CANT * PEDE_FACTOR, (PEDE_TOTAL-PEDE_IVAMONTO-PEDE_CONSUMO)*PEDI_FACTOR,
                PEDE_IVAMONTO*PEDI_FACTOR, PEDE_CONSUMO, PEDE_DTOPORC,
            ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD 
            FROM PEDIDOS P, PEDIDOS_DETALLE D, PREFIJOS R, ARTICULO A WHERE P.PTVT_ID >= :PTOINI AND P.PTVT_ID <= :PTOFIN AND
                P.PEDI_ID = D.PEDI_ID AND P.PREF_PRE = R.PREF_PRE AND R.TIDO_COD = 34 AND D.ARTI_COD = A.arti_cod AND
                A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
                A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND
                (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
                PEDI_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            /*ORDER BY D.ARTI_COD, PEDI_FECHA, PEDI_ID, PEDE_ITEM*/
            INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO, :DTO,
                :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
            DO
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            SUSPEND;
            END
        END
    if (BIN_AND(TIPO, 16) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 35 INTO :NOMTIPO;
        FOR SELECT C.PREF_PRE, COTI_NUMERO, COTI_FECHA, D.ARTI_COD, CTDE_CANT * CTDE_FACTOR, (CTDE_TOTAL-CTDE_IVAMONTO-CTDE_CONSUMO)*COTI_FACTOR,
                CTDE_IVAMONTO*COTI_FACTOR, CTDE_CONSUMO, CTDE_DTOPORC,
            ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD 
            FROM COTIZACIONES C, COTIZACIONES_DETALLE D, PREFIJOS P, ARTICULO A WHERE C.PTVT_ID >= :PTOINI AND C.PTVT_ID <= :PTOFIN AND
                C.COTI_ID = D.COTI_ID AND P.PREF_PRE = C.PREF_PRE AND P.TIDO_COD = 35 AND D.ARTI_COD = A.arti_cod AND
                A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
                A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND COTI_FECHA >= :FECINI AND COTI_FECHA <= :FECFIN AND
                (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
                COTI_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            /*ORDER BY D.ARTI_COD, COTI_FECHA, COTI_ID, CTDE_ITEM*/
            INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO, :DTO,
                :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
            DO
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            SUSPEND;
            END
        END
    END
  ELSE
    BEGIN
    if (BIN_AND(TIPO, 1) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 31 INTO :NOMTIPO;
        FOR SELECT MAX(D.ARTI_COD), SUM(FADE_CANT * FADE_FACTOR), SUM((FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO)*FACT_FACTOR),
            SUM(FACT_FACTOR*FADE_IVAMONTO), SUM(FADE_CONSUMO), MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD), MAX(FACT_TRANSP)
            FROM FACTURAS_DETALLE D, FACTURAS F, PREFIJOS P, ARTICULO A WHERE F.PTVT_ID >= :PTOINI AND F.PTVT_ID <= :PTOFIN AND
            F.FACT_ID = D.FACT_ID AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND D.ARTI_COD = A.arti_cod AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            FACT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) and substring(a.arti_cod from 1 FOR 2) <> '.t'
            GROUP BY FACT_TRANSP, D.ARTI_COD
            INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,
            :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :transp
            DO
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            if (CEROS = 'S') then
                SUSPEND;
            ELSE
                if ((BASE <> 0) AND (CANTIDAD <> 0)) then
                    SUSPEND;
            END
        END

    if (BIN_AND(TIPO, 2) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 32 INTO :NOMTIPO;
        FOR SELECT MAX(D.ARTI_COD), SUM(RVDE_CANT * RVDE_FACTOR), SUM((RVDE_TOTAL-RVDE_IVAMONTO-RVDE_CONSUMO)), SUM(RVDE_IVAMONTO),
            SUM(RVDE_CONSUMO), MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD), MAX(REVT_TRANSP)
            FROM REMISIONES_VENTA_DETALLE D, REMISIONES_VENTA R, PREFIJOS P, ARTICULO A WHERE R.PTVT_ID >= :PTOINI AND R.PTVT_ID <= :PTOFIN AND
            R.REVT_ID = D.REVT_ID AND P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = 32 AND D.ARTI_COD = A.arti_cod AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            REVT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY REVT_TRANSP, D.ARTI_COD
            INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,
            :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :transp
            DO
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            if (CEROS = 'S') then
                SUSPEND;
            ELSE
                if ((BASE <> 0) AND (CANTIDAD <> 0)) then
                    SUSPEND;
            END
        END
    END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure REP_VENTAS_CLIENTE (
    TIPO integer,
    NITDESDE varchar(20),
    NITHASTA varchar(20),
    FECINI date,
    FECFIN date,
    DETALLE char(1),
    ORDEN char(1),
    CEROS char(1),
    SUBEMPRESA integer)
returns (
    NIT varchar(20),
    NOMBRE varchar(60),
    DV char(1),
    TELEFONO varchar(40),
    CIUDAD varchar(40),
    CODZONA varchar(2),
    NOMZONA varchar(30),
    NOMTIPO varchar(50),
    PREFIJO varchar(4),
    NUMERO varchar(6),
    SUCURSAL varchar(10),
    ID integer,
    FECDOC date,
    CANTIDAD integer,
    SUBTOTAL numeric(18,2),
    DTO numeric(18,2),
    ADICIONAL numeric(18,2),
    IVA numeric(18,2),
    EXTRA numeric(18,2),
    TOTAL numeric(18,2),
    RTFTE numeric(18,2),
    RTIVA numeric(18,2),
    RTICA numeric(18,2),
    NETO numeric(18,2),
    ULTVENTA date,
    APELLIDO1 varchar(60),
    APELLIDO2 varchar(60),
    NOMBRE1 varchar(60),
    NOMBRE2 varchar(60),
    CODCIU varchar(5))
AS
DECLARE VARIABLE NITINI VARCHAR(15);
DECLARE VARIABLE NITFIN VARCHAR(15);
DECLARE VARIABLE NOMINI VARCHAR(15);
DECLARE VARIABLE NOMFIN VARCHAR(15);
BEGIN
if (ORDEN = 'C') then
    BEGIN
    NITINI = NITDESDE;
    NITFIN = NITHASTA;
    NOMINI = '';
    NOMFIN = 'zz';
    END
ELSE
    BEGIN
    NITINI = NITDESDE;
    NITFIN = NITHASTA;
    NOMINI = '';
    NOMFIN = 'zz';
    END

SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = :TIPO INTO :NOMTIPO;
if (DETALLE = 'N') then
    BEGIN
    if (BIN_AND(TIPO, 1) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 31 INTO :NOMTIPO;
        FOR SELECT MAX(T.TERC_NIT), MAX(TERC_NOM), MAX(TERC_TEL), MAX(TERC_CIU), MAX(ZONA_COD), MAX(TERC_DV),
            MAX(TERC_APELLIDO1), MAX(TERC_APELLIDO2), MAX(TERC_NOMBRE1), MAX(TERC_NOMBRE2), MAX(T.CIUD_COD), max(FACT_FECHA),
            COUNT(*), SUM(FACT_DTOMONTO), SUM(FACT_ADICIONAL), SUM(FACT_IVAMONTO), SUM(FACT_EXTRA), SUM(FACT_RTFTEMONTO), SUM(FACT_RTIVAMONTO), SUM(FACT_RTICAMONTO), SUM(FACT_TOTAL)
            FROM FACTURAS F, PREFIJOS P, terceros T, CLIENTES C
            where C.TERC_NIT = T.TERC_NIT AND T.TERC_CLIE = 'S' AND T.TERC_NIT >= :NITINI AND T.TERC_NIT <= :NITFIN AND TERC_NOM >= :NOMINI AND TERC_NOM <= :NOMFIN
             AND F.TERC_NIT = T.terc_nit AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND FACT_ANULADO = 'N'
             AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY F.terc_nit
            INTO :NIT, :NOMBRE, :TELEFONO, :CIUDAD, :CODZONA, :DV,
            :APELLIDO1, :APELLIDO2, :NOMBRE1, :NOMBRE2, :CODCIU, :ultventa,
            :CANTIDAD, :DTO, :ADICIONAL, :IVA, :EXTRA, :RTFTE, :RTIVA, :RTICA, :TOTAL
            DO
            BEGIN
            SELECT ZONA_NOM FROM ZONAS WHERE ZONA_COD = :codzona INTO :NOMZONA;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (DTO IS NULL) then
                DTO = 0;
            if (ADICIONAL IS NULL) then
                ADICIONAL = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (EXTRA IS NULL) then
                EXTRA = 0;
            if (RTFTE IS NULL) then
                RTFTE = 0;
            if (RTIVA IS NULL) then
                RTIVA = 0;
            if (RTICA IS NULL) then
                RTICA = 0;
            SUBTOTAL = TOTAL - EXTRA - IVA - ADICIONAL + DTO;
            NETO = TOTAL - RTFTE - RTIVA - RTICA;
            if (CEROS = 'S') then
              SUSPEND;
            ELSE
              if (CANTIDAD > 0) then
                SUSPEND;
            END
        END
    if (BIN_AND(TIPO, 2) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 32 INTO :NOMTIPO;
        FOR SELECT MAX(T.TERC_NIT), MAX(TERC_NOM), MAX(TERC_TEL), MAX(TERC_CIU), MAX(ZONA_COD), MAX(TERC_DV),
            MAX(TERC_APELLIDO1), MAX(TERC_APELLIDO2), MAX(TERC_NOMBRE1), MAX(TERC_NOMBRE2), MAX(T.CIUD_COD), MAX(REVT_FECHA),
            COUNT(*), 0, 0, SUM(REVT_IVAMONTO), 0, 0, 0, 0, SUM(REVT_TOTAL)
            FROM REMISIONES_VENTA R, PREFIJOS P, terceros T, CLIENTES C
            where C.TERC_NIT = T.TERC_NIT AND T.TERC_CLIE = 'S' AND T.TERC_NIT >= :NITINI AND T.TERC_NIT <= :NITFIN AND TERC_NOM >= :NOMINI AND TERC_NOM <= :NOMFIN
             AND R.TERC_NIT = T.terc_nit AND REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN AND REVT_ANULADO = 'N'
             AND P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = 32 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY R.terc_nit
            INTO :NIT, :NOMBRE, :TELEFONO, :CIUDAD, :CODZONA, :DV,
            :APELLIDO1, :APELLIDO2, :NOMBRE1, :NOMBRE2, :CODCIU, :ultventa,
            :CANTIDAD, :DTO, :ADICIONAL, :IVA, :EXTRA, :RTFTE, :RTIVA, :RTICA, :TOTAL
            DO
            BEGIN
            SELECT ZONA_NOM FROM ZONAS WHERE ZONA_COD = :codzona INTO :NOMZONA;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (DTO IS NULL) then
                DTO = 0;
            if (ADICIONAL IS NULL) then
                ADICIONAL = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (EXTRA IS NULL) then
                EXTRA = 0;
            if (RTFTE IS NULL) then
                RTFTE = 0;
            if (RTIVA IS NULL) then
                RTIVA = 0;
            if (RTICA IS NULL) then
                RTICA = 0;
            SUBTOTAL = TOTAL - EXTRA - IVA - ADICIONAL + DTO;
            NETO = TOTAL - RTFTE - RTIVA - RTICA;
            if (CEROS = 'S') then
              SUSPEND;
            ELSE
              if (CANTIDAD > 0) then
                SUSPEND;
            END
        END
    if (BIN_AND(TIPO, 4) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 33 INTO :NOMTIPO;
        FOR SELECT MAX(T.TERC_NIT), MAX(TERC_NOM), MAX(TERC_TEL), MAX(TERC_CIU), MAX(ZONA_COD), MAX(TERC_DV),
            MAX(TERC_APELLIDO1), MAX(TERC_APELLIDO2), MAX(TERC_NOMBRE1), MAX(TERC_NOMBRE2), MAX(T.CIUD_COD), MAX(DEVT_FECHA),
            COUNT(*), SUM(DEVT_DTOMONTO), SUM(DEVT_ADICIONAL), SUM(DEVT_IVAMONTO), SUM(DEVT_EXTRA), SUM(DEVT_RTFTEMONTO), SUM(DEVT_RTIVAMONTO), SUM(DEVT_RTICAMONTO), SUM(DEVT_TOTAL)
            FROM DEVOLUCIONES_VENTAS V, PREFIJOS P, terceros T, CLIENTES C
            where C.TERC_NIT = T.TERC_NIT AND T.TERC_CLIE = 'S' AND T.TERC_NIT >= :NITINI AND T.TERC_NIT <= :NITFIN AND TERC_NOM >= :NOMINI AND TERC_NOM <= :NOMFIN
             AND V.TERC_NIT = T.terc_nit AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND DEVT_ANULADO = 'N'
             AND P.PREF_PRE = V.PREF_PRE AND P.TIDO_COD = 33 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) AND ((DEVT_REMID = 0) or (DEVT_REMID IS NULL)) AND ((DEVT_PEDID = 0) or (DEVT_PEDID IS NULL))
            GROUP BY V.terc_nit
            INTO :NIT, :NOMBRE, :TELEFONO, :CIUDAD, :CODZONA, :DV,
            :APELLIDO1, :APELLIDO2, :NOMBRE1, :NOMBRE2, :CODCIU, :ultventa,
             :CANTIDAD, :DTO, :ADICIONAL, :IVA, :EXTRA, :RTFTE, :RTIVA, :RTICA, :TOTAL
            DO
            BEGIN
            SELECT ZONA_NOM FROM ZONAS WHERE ZONA_COD = :codzona INTO :NOMZONA;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (DTO IS NULL) then
                DTO = 0;
            if (ADICIONAL IS NULL) then
                ADICIONAL = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (EXTRA IS NULL) then
                EXTRA = 0;
            if (RTFTE IS NULL) then
                RTFTE = 0;
            if (RTIVA IS NULL) then
                RTIVA = 0;
            if (RTICA IS NULL) then
                RTICA = 0;
            SUBTOTAL = TOTAL - EXTRA - IVA - ADICIONAL + DTO;
            NETO = TOTAL - RTFTE - RTIVA - RTICA;
            CANTIDAD = CANTIDAD * -1;
            SUBTOTAL = SUBTOTAL * -1;
            TOTAL = TOTAL * -1;
            IVA = IVA * -1;
            EXTRA = EXTRA * -1;
            DTO = DTO * -1;
            ADICIONAL = ADICIONAL * -1;
            RTFTE = RTFTE * -1;
            RTIVA = RTIVA * -1;
            RTICA = RTICA * -1;
            if (CEROS = 'S') then
              SUSPEND;
            ELSE
              if (CANTIDAD <> 0) then
                SUSPEND;
            END
        END
    if (BIN_AND(TIPO, 8) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 34 INTO :NOMTIPO;
        FOR SELECT MAX(T.TERC_NIT), MAX(TERC_NOM), MAX(TERC_TEL), MAX(TERC_CIU), MAX(ZONA_COD), MAX(TERC_DV),
            MAX(TERC_APELLIDO1), MAX(TERC_APELLIDO2), MAX(TERC_NOMBRE1), MAX(TERC_NOMBRE2), MAX(T.CIUD_COD), MAX(PEDI_FECHA),
            COUNT(*), SUM(PEDI_DTOMONTO), SUM(PEDI_ADICIONAL), SUM(PEDI_IVAMONTO), SUM(PEDI_EXTRA), 0, 0, 0, SUM(PEDI_TOTAL)
            FROM PEDIDOS P, PREFIJOS PR, terceros T, CLIENTES C
            where C.TERC_NIT = T.TERC_NIT AND T.TERC_CLIE = 'S' AND T.TERC_NIT >= :NITINI AND T.TERC_NIT <= :NITFIN AND TERC_NOM >= :NOMINI AND TERC_NOM <= :NOMFIN
             AND P.TERC_NIT = T.terc_nit AND PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND PEDI_ANULADO = 'N'
             AND PR.PREF_PRE = P.PREF_PRE AND P.TIDO_COD = 34 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY P.terc_nit
            INTO :NIT, :NOMBRE, :TELEFONO, :CIUDAD, :CODZONA, :DV,
            :APELLIDO1, :APELLIDO2, :NOMBRE1, :NOMBRE2, :CODCIU, :ultventa,
            :CANTIDAD, :DTO, :ADICIONAL, :IVA, :EXTRA, :RTFTE, :RTIVA, :RTICA, :TOTAL
            DO
            BEGIN
            SELECT ZONA_NOM FROM ZONAS WHERE ZONA_COD = :codzona INTO :NOMZONA;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (DTO IS NULL) then
                DTO = 0;
            if (ADICIONAL IS NULL) then
                ADICIONAL = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (EXTRA IS NULL) then
                EXTRA = 0;
            if (RTFTE IS NULL) then
                RTFTE = 0;
            if (RTIVA IS NULL) then
                RTIVA = 0;
            if (RTICA IS NULL) then
                RTICA = 0;
            SUBTOTAL = TOTAL - EXTRA - IVA - ADICIONAL + DTO;
            NETO = TOTAL - RTFTE - RTIVA - RTICA;
            if (CEROS = 'S') then
              SUSPEND;
            ELSE
              if (CANTIDAD > 0) then
                SUSPEND;
            END
        END
    if (BIN_AND(TIPO, 16) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 35 INTO :NOMTIPO;
        FOR SELECT MAX(T.TERC_NIT), MAX(TERC_NOM), MAX(TERC_TEL), MAX(TERC_CIU), MAX(ZONA_COD), MAX(TERC_DV),
            MAX(TERC_APELLIDO1), MAX(TERC_APELLIDO2), MAX(TERC_NOMBRE1), MAX(TERC_NOMBRE2), MAX(T.CIUD_COD), MAX(COTI_FECHA),
            COUNT(*), SUM(COTI_DTOMONTO), SUM(COTI_ADICIONAL), SUM(COTI_IVAMONTO), SUM(COTI_EXTRA), 0, 0, 0, SUM(COTI_TOTAL)
            FROM COTIZACIONES CT, PREFIJOS P, terceros T, CLIENTES C
            where C.TERC_NIT = T.TERC_NIT AND T.TERC_CLIE = 'S' AND T.TERC_NIT >= :NITINI AND T.TERC_NIT <= :NITFIN AND TERC_NOM >= :NOMINI AND TERC_NOM <= :NOMFIN
             AND CT.TERC_NIT = T.terc_nit AND COTI_FECHA >= :FECINI AND COTI_FECHA <= :FECFIN AND COTI_ANULADO = 'N'
             AND P.PREF_PRE = CT.PREF_PRE AND P.TIDO_COD = 35 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY C.terc_nit
            INTO :NIT, :NOMBRE, :TELEFONO, :CIUDAD, :CODZONA, :DV,
            :APELLIDO1, :APELLIDO2, :NOMBRE1, :NOMBRE2, :CODCIU, :ultventa,
            :CANTIDAD, :DTO, :ADICIONAL, :IVA, :EXTRA, :RTFTE, :RTIVA, :RTICA, :TOTAL
            DO
            BEGIN
            SELECT ZONA_NOM FROM ZONAS WHERE ZONA_COD = :codzona INTO :NOMZONA;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (DTO IS NULL) then
                DTO = 0;
            if (ADICIONAL IS NULL) then
                ADICIONAL = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (EXTRA IS NULL) then
                EXTRA = 0;
            if (RTFTE IS NULL) then
                RTFTE = 0;
            if (RTIVA IS NULL) then
                RTIVA = 0;
            if (RTICA IS NULL) then
                RTICA = 0;
            SUBTOTAL = TOTAL - EXTRA - IVA - ADICIONAL + DTO;
            NETO = TOTAL - RTFTE - RTIVA - RTICA;
            if (CEROS = 'S') then
              SUSPEND;
            ELSE
              if (CANTIDAD > 0) then
                SUSPEND;
            END
        END
    END
ELSE
    BEGIN
    if (BIN_AND(TIPO, 1) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 31 INTO :NOMTIPO;
        FOR SELECT FACT_ID, F.PREF_PRE, FACT_NUMERO, FACT_FECHA, FACT_DTOMONTO, FACT_ADICIONAL, FACT_IVAMONTO, FACT_EXTRA, FACT_TOTAL, FACT_RTFTEMONTO, FACT_RTIVAMONTO, FACT_RTICAMONTO,
            T.TERC_NIT, TERC_NOM, ZONA_COD, TERC_TEL, TERC_CIU, TERC_DV, TERC_APELLIDO1, TERC_APELLIDO2, TERC_NOMBRE1, TERC_NOMBRE2, T.CIUD_COD, F.fact_sucursal
            FROM FACTURAS F, PREFIJOS P, terceros T, CLIENTES C
            where C.TERC_NIT = T.TERC_NIT AND T.TERC_CLIE = 'S' AND T.TERC_NIT >= :NITINI AND T.TERC_NIT <= :NITFIN AND TERC_NOM >= :NOMINI AND TERC_NOM <= :NOMFIN
             AND F.TERC_NIT = T.terc_nit AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND FACT_ANULADO = 'N'
             AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            ORDER BY FACT_FECHA, FACT_ID
            INTO :ID, :PREFIJO, :NUMERO, :FECDOC, :DTO, :ADICIONAL, :IVA, :EXTRA, :TOTAL, :RTFTE, :RTIVA, :RTICA, :nit, :nombre, :codzona, :telefono, :ciudad, :dv, :APELLIDO1, :APELLIDO2, :NOMBRE1, :NOMBRE2, :CODCIU, :sucursal
            DO
            BEGIN
            SELECT ZONA_NOM FROM ZONAS WHERE ZONA_COD = :codzona INTO :NOMZONA;
            SUBTOTAL = TOTAL - EXTRA - IVA - ADICIONAL + DTO;
            NETO = TOTAL - RTFTE - RTIVA - RTICA;
            SUSPEND;
            END
        END
    if (BIN_AND(TIPO, 2) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 32 INTO :NOMTIPO;
        FOR SELECT REVT_ID, R.PREF_PRE, REVT_NUMERO, REVT_FECHA, 0, 0, REVT_IVAMONTO, 0, REVT_TOTAL, 0, 0, 0,
        T.TERC_NIT, TERC_NOM, ZONA_COD, TERC_TEL, TERC_CIU, TERC_DV, TERC_APELLIDO1, TERC_APELLIDO2, TERC_NOMBRE1, TERC_NOMBRE2, T.CIUD_COD, R.revt_sucursal
            FROM REMISIONES_VENTA R, PREFIJOS P, terceros T, CLIENTES C
            where C.TERC_NIT = T.TERC_NIT AND T.TERC_CLIE = 'S' AND T.TERC_NIT >= :NITINI AND T.TERC_NIT <= :NITFIN AND TERC_NOM >= :NOMINI AND TERC_NOM <= :NOMFIN
             AND R.TERC_NIT = T.terc_nit AND REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN AND REVT_ANULADO = 'N'
             AND P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = 32 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            ORDER BY REVT_FECHA, REVT_ID
            INTO :ID, :PREFIJO, :NUMERO, :FECDOC, :DTO, :ADICIONAL, :IVA, :EXTRA, :TOTAL, :RTFTE, :RTIVA, :RTICA, :nit, :nombre, :codzona, :telefono, :ciudad, :DV, :APELLIDO1, :APELLIDO2, :NOMBRE1, :NOMBRE2, :CODCIU, :sucursal
            DO
            BEGIN
            SELECT ZONA_NOM FROM ZONAS WHERE ZONA_COD = :codzona INTO :NOMZONA;
            SUBTOTAL = TOTAL - EXTRA - IVA - ADICIONAL + DTO;
            NETO = TOTAL - RTFTE - RTIVA - RTICA;
            SUSPEND;
            END
        END
    if (BIN_AND(TIPO, 4) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 33 INTO :NOMTIPO;
        FOR SELECT DEVT_ID, V.PREF_PRE, DEVT_NUMERO, DEVT_FECHA, DEVT_DTOMONTO, DEVT_ADICIONAL, DEVT_IVAMONTO, DEVT_EXTRA, DEVT_TOTAL, DEVT_RTFTEMONTO, DEVT_RTIVAMONTO, DEVT_RTICAMONTO,
            T.TERC_NIT, TERC_NOM, ZONA_COD, TERC_TEL, TERC_CIU, TERC_DV, TERC_APELLIDO1, TERC_APELLIDO2, TERC_NOMBRE1, TERC_NOMBRE2, T.CIUD_COD, V.devt_sucursal
            FROM DEVOLUCIONES_VENTAS V, PREFIJOS P, terceros T, CLIENTES C
            where C.TERC_NIT = T.TERC_NIT AND T.TERC_CLIE = 'S' AND T.TERC_NIT >= :NITINI AND T.TERC_NIT <= :NITFIN AND TERC_NOM >= :NOMINI AND TERC_NOM <= :NOMFIN
             AND V.TERC_NIT = T.terc_nit AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND DEVT_ANULADO = 'N'
             AND P.PREF_PRE = V.PREF_PRE AND P.TIDO_COD = 33 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) AND ((DEVT_REMID = 0) or (DEVT_REMID IS NULL)) AND ((DEVT_PEDID = 0) or (DEVT_PEDID IS NULL))
            ORDER BY DEVT_FECHA, DEVT_ID
            INTO :ID, :PREFIJO, :NUMERO, :FECDOC, :DTO, :ADICIONAL, :IVA, :EXTRA, :TOTAL, :RTFTE, :RTIVA, :RTICA, :nit, :nombre, :codzona, :telefono, :ciudad, :DV, :APELLIDO1, :APELLIDO2, :NOMBRE1, :NOMBRE2, :CODCIU, :sucursal
            DO
            BEGIN
            SELECT ZONA_NOM FROM ZONAS WHERE ZONA_COD = :codzona INTO :NOMZONA;
            SUBTOTAL = TOTAL - EXTRA - IVA - ADICIONAL + DTO;
            NETO = TOTAL - RTFTE - RTIVA - RTICA;
            CANTIDAD = CANTIDAD * -1;
            SUBTOTAL = SUBTOTAL * -1;
            TOTAL = TOTAL * -1;
            IVA = IVA * -1;
            EXTRA = EXTRA * -1;
            DTO = DTO * -1;
            ADICIONAL = ADICIONAL * -1;
            RTFTE = RTFTE * -1;
            RTIVA = RTIVA * -1;
            RTICA = RTICA * -1;
            SUSPEND;
            END
        END
    if (BIN_AND(TIPO, 8) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 34 INTO :NOMTIPO;
        FOR SELECT PEDI_ID, P.PREF_PRE, PEDI_NUMERO, PEDI_FECHA, PEDI_DTOMONTO, PEDI_ADICIONAL, PEDI_IVAMONTO, PEDI_EXTRA, PEDI_TOTAL, 0, 0, 0,
            T.TERC_NIT, TERC_NOM, ZONA_COD, TERC_TEL, TERC_CIU, TERC_DV, TERC_APELLIDO1, TERC_APELLIDO2, TERC_NOMBRE1, TERC_NOMBRE2, T.CIUD_COD, P.pedi_sucursal
            FROM PEDIDOS P, PREFIJOS PR, terceros T, CLIENTES C
            where C.TERC_NIT = T.TERC_NIT AND T.TERC_CLIE = 'S' AND T.TERC_NIT >= :NITINI AND T.TERC_NIT <= :NITFIN AND TERC_NOM >= :NOMINI AND TERC_NOM <= :NOMFIN
             AND P.TERC_NIT = T.terc_nit AND PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND PEDI_ANULADO = 'N'
             AND P.PREF_PRE = PR.PREF_PRE AND P.TIDO_COD = 34 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            ORDER BY PEDI_FECHA, PEDI_ID
            INTO :ID, :PREFIJO, :NUMERO, :FECDOC, :DTO, :ADICIONAL, :IVA, :EXTRA, :TOTAL, :RTFTE, :RTIVA, :RTICA, :nit, :nombre, :codzona, :telefono, :ciudad, :DV, :APELLIDO1, :APELLIDO2, :NOMBRE1, :NOMBRE2, :CODCIU, :sucursal
            DO
            BEGIN
            SELECT ZONA_NOM FROM ZONAS WHERE ZONA_COD = :codzona INTO :NOMZONA;
            SUBTOTAL = TOTAL - EXTRA - IVA - ADICIONAL + DTO;
            NETO = TOTAL - RTFTE - RTIVA - RTICA;
            SUSPEND;
            END
        END
    if (BIN_AND(TIPO, 16) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 35 INTO :NOMTIPO;
        FOR SELECT COTI_ID, CT.PREF_PRE, COTI_NUMERO, COTI_FECHA, COTI_DTOMONTO, COTI_ADICIONAL, COTI_IVAMONTO, COTI_EXTRA, COTI_TOTAL, 0, 0, 0,
            T.TERC_NIT, TERC_NOM, ZONA_COD, TERC_TEL, TERC_CIU, TERC_DV, TERC_APELLIDO1, TERC_APELLIDO2, TERC_NOMBRE1, TERC_NOMBRE2, T.CIUD_COD, CT.coti_sucursal
            FROM COTIZACIONES CT, PREFIJOS P, terceros T, CLIENTES C
            where C.TERC_NIT = T.TERC_NIT AND T.TERC_CLIE = 'S' AND T.TERC_NIT >= :NITINI AND T.TERC_NIT <= :NITFIN AND TERC_NOM >= :NOMINI AND TERC_NOM <= :NOMFIN
             AND CT.TERC_NIT = T.terc_nit AND COTI_FECHA >= :FECINI AND COTI_FECHA <= :FECFIN AND COTI_ANULADO = 'N'
             AND P.PREF_PRE = CT.PREF_PRE AND P.TIDO_COD = 35 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            ORDER BY COTI_FECHA, COTI_ID
            INTO :ID, :PREFIJO, :NUMERO, :FECDOC, :DTO, :ADICIONAL, :IVA, :EXTRA, :TOTAL, :RTFTE, :RTIVA, :RTICA, :nit, :nombre, :codzona, :telefono, :ciudad, :DV, :APELLIDO1, :APELLIDO2, :NOMBRE1, :NOMBRE2, :CODCIU, :sucursal
            DO
            BEGIN
            SELECT ZONA_NOM FROM ZONAS WHERE ZONA_COD = :codzona INTO :NOMZONA;
            SUBTOTAL = TOTAL - EXTRA - IVA - ADICIONAL + DTO;
            NETO = TOTAL - RTFTE - RTIVA - RTICA;
            SUSPEND;
            END
        END
    END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure REP_VENTAS_VENDEDOR (
    TIPO integer,
    DESDE varchar(20),
    HASTA varchar(20),
    FECINI date,
    FECFIN date,
    DETALLE char(1),
    CEROS char(1),
    SUBEMPRESA integer)
returns (
    CODVEND integer,
    NOMVEND varchar(60),
    NOMTIPO varchar(50),
    PREFIJO varchar(4),
    NUMERO varchar(6),
    NIT varchar(20),
    NOMBRE varchar(60),
    ID integer,
    FECDOC date,
    CANTIDAD integer,
    SUBTOTAL numeric(18,2),
    DTO numeric(18,2),
    ADICIONAL numeric(18,2),
    CONSUMO numeric(18,2),
    IVA numeric(18,2),
    EXTRA numeric(18,2),
    TOTAL numeric(18,2),
    RTFTE numeric(18,2),
    RTIVA numeric(18,2),
    RTICA numeric(18,2),
    NETO numeric(18,2))
AS
BEGIN
if (DETALLE = 'N') then
    BEGIN
    NIT = '';
    NOMBRE = '';
    if (BIN_AND(TIPO, 1) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 31 INTO :NOMTIPO;
        FOR SELECT MAX(F.VEND_COD), MAX(VEND_NOMBRE), COUNT(*), SUM(FACT_DTOMONTO), SUM(FACT_ADICIONAL), SUM(FACT_IVAMONTO), SUM(FACT_EXTRA), SUM(FACT_RTFTEMONTO), SUM(FACT_RTIVAMONTO), SUM(FACT_RTICAMONTO), SUM(FACT_TOTAL)
            FROM FACTURAS F, PREFIJOS P, VENDEDORES V
            WHERE F.VEND_COD >= :DESDE AND F.VEND_COD <= :HASTA AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND FACT_ANULADO = 'N'
             AND F.vend_cod = V.vend_cod AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND ((P.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY F.VEND_COD
            INTO :CODVEND, :NOMVEND, :CANTIDAD, :DTO, :ADICIONAL, :IVA, :EXTRA, :RTFTE, :RTIVA, :RTICA, :TOTAL
            DO
            BEGIN
            SELECT SUM(FADE_CONSUMO) FROM FACTURAS_DETALLE D, FACTURAS F WHERE F.FACT_ID = D.FACT_ID AND
                VEND_COD = :CODVEND AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND FACT_ANULADO = 'N' and substring(D.arti_cod from 1 FOR 2) <> '.t'
                INTO :CONSUMO;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (DTO IS NULL) then
                DTO = 0;
            if (ADICIONAL IS NULL) then
                ADICIONAL = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (EXTRA IS NULL) then
                EXTRA = 0;
            if (RTFTE IS NULL) then
                RTFTE = 0;
            if (RTIVA IS NULL) then
                RTIVA = 0;
            if (RTICA IS NULL) then
                RTICA = 0;
            SUBTOTAL = TOTAL - EXTRA - IVA - ADICIONAL + DTO - CONSUMO;
            NETO = TOTAL - RTFTE - RTIVA - RTICA;
            if (CEROS = 'S') then
              SUSPEND;
            ELSE
              if (CANTIDAD > 0) then
                SUSPEND;
            END
        END
    if (BIN_AND(TIPO, 2) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 32 INTO :NOMTIPO;
        FOR SELECT MAX(R.VEND_COD), MAX(VEND_NOMBRE), COUNT(*), 0, 0, SUM(REVT_IVAMONTO), 0, 0, 0, 0, SUM(REVT_TOTAL)
            FROM REMISIONES_VENTA R, PREFIJOS P, VENDEDORES V
            WHERE R.VEND_COD >= :DESDE AND R.VEND_COD <= :HASTA
             AND R.vend_cod = V.vend_cod AND REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN AND REVT_ANULADO = 'N'
             AND P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = 32 AND ((P.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY R.VEND_COD
            INTO :CODVEND, :NOMVEND, :CANTIDAD, :DTO, :ADICIONAL, :IVA, :EXTRA, :RTFTE, :RTIVA, :RTICA, :TOTAL
            DO
            BEGIN
            SELECT SUM(RVDE_CONSUMO) FROM REMISIONES_VENTA R, REMISIONES_VENTA_DETALLE D WHERE R.REVT_ID = D.REVT_ID AND
                VEND_COD = :CODVEND AND REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN AND REVT_ANULADO = 'N'
                INTO :CONSUMO;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (DTO IS NULL) then
                DTO = 0;
            if (ADICIONAL IS NULL) then
                ADICIONAL = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (EXTRA IS NULL) then
                EXTRA = 0;
            if (RTFTE IS NULL) then
                RTFTE = 0;
            if (RTIVA IS NULL) then
                RTIVA = 0;
            if (RTICA IS NULL) then
                RTICA = 0;
            SUBTOTAL = TOTAL - EXTRA - IVA - ADICIONAL + DTO - CONSUMO;
            NETO = TOTAL - RTFTE - RTIVA - RTICA;
            if (CEROS = 'S') then
              SUSPEND;
            ELSE
              if (CANTIDAD > 0) then
                SUSPEND;
            END
        END
    if (BIN_AND(TIPO, 4) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 33 INTO :NOMTIPO;
        FOR SELECT MAX(D.VEND_COD), MAX(VEND_NOMBRE), COUNT(*), SUM(DEVT_DTOMONTO), SUM(DEVT_ADICIONAL), SUM(DEVT_IVAMONTO), SUM(DEVT_EXTRA), SUM(DEVT_RTFTEMONTO), SUM(DEVT_RTIVAMONTO), SUM(DEVT_RTICAMONTO), SUM(DEVT_TOTAL)
            FROM DEVOLUCIONES_VENTAS D, PREFIJOS P, VENDEDORES V
            WHERE D.VEND_COD >= :DESDE AND D.VEND_COD <= :HASTA
             AND D.vend_cod = V.vend_cod AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND DEVT_ANULADO = 'N'
             AND P.PREF_PRE = D.PREF_PRE AND P.TIDO_COD = 33 AND ((P.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) AND ((DEVT_REMID = 0) or (DEVT_REMID IS NULL)) AND ((DEVT_PEDID = 0) or (DEVT_PEDID IS NULL))
            GROUP BY D.VEND_COD
            INTO :CODVEND, :NOMVEND, :CANTIDAD, :DTO, :ADICIONAL, :IVA, :EXTRA, :RTFTE, :RTIVA, :RTICA, :TOTAL
            DO
            BEGIN
            SELECT SUM(DVDE_CONSUMO) FROM DEVOLUCIONES_VENTAS V, DEVOLUCIONES_VENTAS_DETALLE D WHERE V.DEVT_ID = D.DEVT_ID AND
                VEND_COD = :CODVEND AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND DEVT_ANULADO = 'N' and substring(D.arti_cod from 1 FOR 2) <> '.t'
                INTO :CONSUMO;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (DTO IS NULL) then
                DTO = 0;
            if (ADICIONAL IS NULL) then
                ADICIONAL = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (EXTRA IS NULL) then
                EXTRA = 0;
            if (RTFTE IS NULL) then
                RTFTE = 0;
            if (RTIVA IS NULL) then
                RTIVA = 0;
            if (RTICA IS NULL) then
                RTICA = 0;
            SUBTOTAL = TOTAL - EXTRA - IVA - ADICIONAL + DTO - CONSUMO;
            NETO = TOTAL - RTFTE - RTIVA - RTICA;
            CANTIDAD = CANTIDAD * -1;
            SUBTOTAL = SUBTOTAL * -1;
            TOTAL = TOTAL * -1;
            IVA = IVA * -1;
            EXTRA = EXTRA * -1;
            DTO = DTO * -1;
            ADICIONAL = ADICIONAL * -1;
            RTFTE = RTFTE * -1;
            RTIVA = RTIVA * -1;
            RTICA = RTICA * -1;
            if (CEROS = 'S') then
              SUSPEND;
            ELSE
              if (CANTIDAD <> 0) then
                SUSPEND;
            END
        END
    if (BIN_AND(TIPO, 8) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 34 INTO :NOMTIPO;
        FOR SELECT MAX(P.VEND_COD), MAX(VEND_NOMBRE), COUNT(*), SUM(PEDI_DTOMONTO), SUM(PEDI_ADICIONAL), SUM(PEDI_IVAMONTO), SUM(PEDI_EXTRA), 0, 0, 0, SUM(PEDI_TOTAL)
            FROM PEDIDOS P, PREFIJOS PR, VENDEDORES V
            WHERE V.VEND_COD >= :DESDE AND V.VEND_COD <= :HASTA
             AND P.vend_cod = V.vend_cod AND PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND PEDI_ANULADO = 'N'
             AND P.PREF_PRE = PR.PREF_PRE AND PR.TIDO_COD = 34 AND ((PR.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY P.VEND_COD
            INTO :CODVEND, :NOMVEND, :CANTIDAD, :DTO, :ADICIONAL, :IVA, :EXTRA, :RTFTE, :RTIVA, :RTICA, :TOTAL
            DO
            BEGIN
            SELECT SUM(PEDE_CONSUMO) FROM PEDIDOS P, PEDIDOS_DETALLE D WHERE P.PEDI_ID = D.PEDI_ID AND
                VEND_COD = :CODVEND AND PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND PEDI_ANULADO = 'N'
                INTO :CONSUMO;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (DTO IS NULL) then
                DTO = 0;
            if (ADICIONAL IS NULL) then
                ADICIONAL = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (EXTRA IS NULL) then
                EXTRA = 0;
            if (RTFTE IS NULL) then
                RTFTE = 0;
            if (RTIVA IS NULL) then
                RTIVA = 0;
            if (RTICA IS NULL) then
                RTICA = 0;
            SUBTOTAL = TOTAL - EXTRA - IVA - ADICIONAL + DTO - CONSUMO;
            NETO = TOTAL - RTFTE - RTIVA - RTICA;
            if (CEROS = 'S') then
              SUSPEND;
            ELSE
              if (CANTIDAD > 0) then
                SUSPEND;
            END
        END
    if (BIN_AND(TIPO, 16) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 35 INTO :NOMTIPO;
        FOR SELECT MAX(C.VEND_COD), MAX(VEND_NOMBRE), COUNT(*), SUM(COTI_DTOMONTO), SUM(COTI_ADICIONAL), SUM(COTI_IVAMONTO), SUM(COTI_EXTRA), 0, 0, 0, SUM(COTI_TOTAL)
            FROM COTIZACIONES C, PREFIJOS P, VENDEDORES V
            WHERE V.VEND_COD >= :DESDE AND V.VEND_COD <= :HASTA
             AND C.vend_cod = V.vend_cod AND COTI_FECHA >= :FECINI AND COTI_FECHA <= :FECFIN AND COTI_ANULADO = 'N'
             AND P.PREF_PRE = C.PREF_PRE AND P.TIDO_COD = 35 AND ((P.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY C.VEND_COD
            INTO :CODVEND, :NOMVEND, :CANTIDAD, :DTO, :ADICIONAL, :IVA, :EXTRA, :RTFTE, :RTIVA, :RTICA, :TOTAL
            DO
            BEGIN
            SELECT SUM(CTDE_CONSUMO) FROM COTIZACIONES C, COTIZACIONES_DETALLE D WHERE C.COTI_ID = D.COTI_ID AND
                VEND_COD = :CODVEND AND COTI_FECHA >= :FECINI AND COTI_FECHA <= :FECFIN AND COTI_ANULADO = 'N'
                INTO :CONSUMO;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (DTO IS NULL) then
                DTO = 0;
            if (ADICIONAL IS NULL) then
                ADICIONAL = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (EXTRA IS NULL) then
                EXTRA = 0;
            if (RTFTE IS NULL) then
                RTFTE = 0;
            if (RTIVA IS NULL) then
                RTIVA = 0;
            if (RTICA IS NULL) then
                RTICA = 0;
            SUBTOTAL = TOTAL - EXTRA - IVA - ADICIONAL + DTO - CONSUMO;
            NETO = TOTAL - RTFTE - RTIVA - RTICA;
            if (CEROS = 'S') then
              SUSPEND;
            ELSE
              if (CANTIDAD > 0) then
                SUSPEND;
            END
        END
    END
ELSE
    BEGIN
    if (BIN_AND(TIPO, 1) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 31 INTO :NOMTIPO;
        FOR SELECT F.VEND_COD, VEND_NOMBRE, F.FACT_ID, F.PREF_PRE, FACT_NUMERO, FACT_FECHA, FACT_DTOMONTO, FACT_ADICIONAL, FACT_IVAMONTO, FACT_EXTRA, FACT_TOTAL, FACT_RTFTEMONTO, FACT_RTIVAMONTO, FACT_RTICAMONTO, TERC_NIT, FACT_NOMCLIENTE
            FROM FACTURAS F, PREFIJOS P, VENDEDORES V WHERE F.vend_cod = V.vend_cod AND F.VEND_COD >= :DESDE AND F.VEND_COD <= :HASTA AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND FACT_ANULADO = 'N'
             AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND ((P.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            ORDER BY V.VEND_COD, FACT_FECHA, FACT_ID
            INTO :CODVEND, :NOMVEND, :ID, :PREFIJO, :NUMERO, :FECDOC, :DTO, :ADICIONAL, :IVA, :EXTRA, :TOTAL, :RTFTE, :RTIVA, :RTICA, :NIT, :NOMBRE
            DO
            BEGIN
            SELECT SUM(FADE_CONSUMO) FROM FACTURAS_DETALLE WHERE FACT_ID = :ID and substring(arti_cod from 1 FOR 2) <> '.t'
                INTO :CONSUMO;
            SUBTOTAL = TOTAL - EXTRA - IVA - ADICIONAL + DTO - CONSUMO;
            NETO = TOTAL - RTFTE - RTIVA - RTICA;
            SUSPEND;
            END
         END
    if (BIN_AND(TIPO, 2) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 32 INTO :NOMTIPO;
        FOR SELECT R.VEND_COD, VEND_NOMBRE, REVT_ID, R.PREF_PRE, REVT_NUMERO, REVT_FECHA, 0, 0, REVT_IVAMONTO, 0, REVT_TOTAL, 0, 0, 0, TERC_NIT, REVT_NOMTERC
            FROM REMISIONES_VENTA R, PREFIJOS P, VENDEDORES V WHERE R.vend_cod = V.vend_cod AND R.VEND_COD >= :DESDE AND R.VEND_COD <= :HASTA AND REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN AND REVT_ANULADO = 'N'
             AND P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = 32 AND ((P.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            ORDER BY V.VEND_COD, REVT_FECHA, REVT_ID
            INTO :CODVEND, :NOMVEND, :ID, :PREFIJO, :NUMERO, :FECDOC, :DTO, :ADICIONAL, :IVA, :EXTRA, :TOTAL, :RTFTE, :RTIVA, :RTICA, :NIT, :NOMBRE
            DO
            BEGIN
            SELECT SUM(RVDE_CONSUMO) FROM REMISIONES_VENTA_DETALLE WHERE REVT_ID = :ID
                INTO :CONSUMO;
            SUBTOTAL = TOTAL - EXTRA - IVA - ADICIONAL + DTO - CONSUMO;
            NETO = TOTAL - RTFTE - RTIVA - RTICA;
            SUSPEND;
            END
         END
    if (BIN_AND(TIPO, 4) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 33 INTO :NOMTIPO;
        FOR SELECT V.VEND_COD, VEND_NOMBRE, DEVT_ID, D.PREF_PRE, DEVT_NUMERO, DEVT_FECHA, DEVT_DTOMONTO, DEVT_ADICIONAL, DEVT_IVAMONTO, DEVT_EXTRA, DEVT_TOTAL, DEVT_RTFTEMONTO, DEVT_RTIVAMONTO, DEVT_RTICAMONTO, TERC_NIT, DEVT_NOMTERC
            FROM DEVOLUCIONES_VENTAS D, PREFIJOS P, VENDEDORES V WHERE D.vend_cod = V.vend_cod AND V.VEND_COD >= :DESDE AND V.VEND_COD <= :HASTA AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND DEVT_ANULADO = 'N'
             AND P.PREF_PRE = D.PREF_PRE AND P.TIDO_COD = 33 AND ((P.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) AND ((DEVT_REMID = 0) or (DEVT_REMID IS NULL)) AND ((DEVT_PEDID = 0) or (DEVT_PEDID IS NULL))
            ORDER BY V.VEND_COD, DEVT_FECHA, DEVT_ID
            INTO :CODVEND, :NOMVEND, :ID, :PREFIJO, :NUMERO, :FECDOC, :DTO, :ADICIONAL, :IVA, :EXTRA, :TOTAL, :RTFTE, :RTIVA, :RTICA, :NIT, :NOMBRE
            DO
            BEGIN
            SELECT SUM(DVDE_CONSUMO) FROM DEVOLUCIONES_VENTAS_DETALLE WHERE DEVT_ID = :ID and substring(arti_cod from 1 FOR 2) <> '.t'
                INTO :CONSUMO;
            SUBTOTAL = TOTAL - EXTRA - IVA - ADICIONAL + DTO - CONSUMO;
            NETO = TOTAL - RTFTE - RTIVA - RTICA;
            SUBTOTAL = SUBTOTAL * -1;
            TOTAL = TOTAL * -1;
            IVA = IVA * -1;
            EXTRA = EXTRA * -1;
            DTO = DTO * -1;
            ADICIONAL = ADICIONAL * -1;
            RTFTE = RTFTE * -1;
            RTIVA = RTIVA * -1;
            RTICA = RTICA * -1;
            SUSPEND;
            END
         END
    if (BIN_AND(TIPO, 8) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 34 INTO :NOMTIPO;
        FOR SELECT P.VEND_COD, VEND_NOMBRE, PEDI_ID, P.PREF_PRE, PEDI_NUMERO, PEDI_FECHA, PEDI_DTOMONTO, PEDI_ADICIONAL, PEDI_IVAMONTO, PEDI_EXTRA, PEDI_TOTAL, 0, 0, 0, TERC_NIT, PEDI_NOMTERC
            FROM PEDIDOS P, PREFIJOS PR, VENDEDORES V WHERE P.vend_cod = V.vend_cod AND P.VEND_COD >= :DESDE AND P.VEND_COD <= :HASTA AND PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND PEDI_ANULADO = 'N'
             AND P.PREF_PRE = PR.PREF_PRE AND PR.TIDO_COD = 34 AND ((PR.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            ORDER BY V.VEND_COD, PEDI_FECHA, PEDI_ID
            INTO :CODVEND, :NOMVEND, :ID, :PREFIJO, :NUMERO, :FECDOC, :DTO, :ADICIONAL, :IVA, :EXTRA, :TOTAL, :RTFTE, :RTIVA, :RTICA, :NIT, :NOMBRE
            DO
            BEGIN
            SELECT SUM(PEDE_CONSUMO) FROM PEDIDOS_DETALLE WHERE PEDI_ID = :ID
                INTO :CONSUMO;
            SUBTOTAL = TOTAL - EXTRA - IVA - ADICIONAL + DTO - CONSUMO;
            NETO = TOTAL - RTFTE - RTIVA - RTICA;
            SUSPEND;
            END
         END
    if (BIN_AND(TIPO, 16) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 35 INTO :NOMTIPO;
        FOR SELECT C.VEND_COD, VEND_NOMBRE, COTI_ID, C.PREF_PRE, COTI_NUMERO, COTI_FECHA, COTI_DTOMONTO, COTI_ADICIONAL, COTI_IVAMONTO, COTI_EXTRA, COTI_TOTAL, 0, 0, 0, TERC_NIT, COTI_NOMTERC
            FROM COTIZACIONES C, PREFIJOS P, VENDEDORES V WHERE C.vend_cod = V.vend_cod AND C.VEND_COD >= :DESDE AND C.VEND_COD <= :HASTA AND COTI_FECHA >= :FECINI AND COTI_FECHA <= :FECFIN AND COTI_ANULADO = 'N'
             AND P.PREF_PRE = C.PREF_PRE AND P.TIDO_COD = 35 AND ((P.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            ORDER BY V.VEND_COD, COTI_FECHA, COTI_ID
            INTO :CODVEND, :NOMVEND, :ID, :PREFIJO, :NUMERO, :FECDOC, :DTO, :ADICIONAL, :IVA, :EXTRA, :TOTAL, :RTFTE, :RTIVA, :RTICA, :NIT, :NOMBRE
            DO
            BEGIN
            SELECT SUM(CTDE_CONSUMO) FROM COTIZACIONES_DETALLE WHERE COTI_ID = :ID
                INTO :CONSUMO;
            SUBTOTAL = TOTAL - EXTRA - IVA - ADICIONAL + DTO - CONSUMO;
            NETO = TOTAL - RTFTE - RTIVA - RTICA;
            SUSPEND;
            END
        END
    END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure VENTAS_ARTICULO_MES (
    FECINI date,
    FECFIN date,
    SUBEMPRESA integer)
returns (
    ARTICULO varchar(15),
    DESCRIPCION varchar(60),
    CODGRUPO varchar(2),
    NOMGRUPO varchar(30),
    CODSUBG varchar(3),
    NOMSUBG varchar(30),
    CODMARC varchar(3),
    NOMMARC varchar(30),
    UNIDAD varchar(8),
    CANTVTAS numeric(18,4),
    BASEVTAS numeric(18,2),
    IVAVTAS numeric(18,2),
    CANTDEV numeric(18,4),
    BASEDEV numeric(18,2),
    IVADEV numeric(18,2))
AS
BEGIN
FOR SELECT MAX(ARTI_COD), SUM(FADE_CANT * FADE_FACTOR), SUM((cast(FADE_TOTAL as double precision)-FADE_IVAMONTO-FADE_CONSUMO)*FACT_FACTOR),
    SUM(FADE_IVAMONTO*FACT_FACTOR)
    FROM FACTURAS_DETALLE D, FACTURAS F, PREFIJOS P
    WHERE F.FACT_ID = D.FACT_ID AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND FACT_ANULADO = 'N'
       AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) and substring(D.arti_cod from 1 FOR 2) <> '.t'
    GROUP BY ARTI_COD
    INTO :ARTICULO, :CANTVTAS, :BASEVTAS, :IVAVTAS
    DO
    BEGIN
    SELECT ARTI_DES, ARTI_UNIDAD, A.GRUP_COD, A.SUBG_COD, A.MARC_COD, GRUP_NOM 
        FROM ARTICULO A, GRUPO G WHERE A.ARTI_COD = :articulo AND A.GRUP_COD = G.grup_cod
        INTO :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :NOMGRUPO;
    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
    SELECT SUM(DVDE_CANT * DVDE_FACTOR), SUM((cast(DVDE_TOTAL as double precision)-DVDE_IVAMONTO-DVDE_CONSUMO)*DEVT_FACTOR),
        SUM(DVDE_IVAMONTO*DEVT_FACTOR)
        FROM DEVOLUCIONES_VENTAS F, devoluciones_ventas_DETALLE D, PREFIJOS P
        WHERE F.DEVT_ID = D.DEVT_ID AND ARTI_COD = :ARTICULO AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND DEVT_ANULADO = 'N' AND ((devt_remid is null) or (DEVT_REMID = 0)) AND ((devt_pedid is null) or (DEVT_PEDID = 0))
        AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 33 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
        INTO :CANTDEV, :BASEDEV, :IVADEV;
    if (cantvtas IS NULL) then
        cantvtas = 0;
    if (cantdev IS NULL) then
        cantdev = 0;
    if (ivavtas IS NULL) then
        ivavtas = 0;
    if (IVADEV IS NULL) then
        IVADEV = 0;
    if (basevtas IS NULL) then
        basevtas = 0;
    if (basedev IS NULL) then
        basedev = 0;
    if ((CANTVTAS <> 0) or (CANTDEV <> 0)) then
        SUSPEND;
    END
FOR SELECT MAX(ARTI_COD), SUM(DVDE_CANT * DVDE_FACTOR), SUM((cast(DVDE_TOTAL as double precision)-DVDE_IVAMONTO-DVDE_CONSUMO)*DEVT_FACTOR),
    SUM(DVDE_IVAMONTO*DEVT_FACTOR)
    FROM DEVOLUCIONES_VENTAS F, devoluciones_ventas_DETALLE D, PREFIJOS P
    WHERE F.DEVT_ID = D.DEVT_ID AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND DEVT_ANULADO = 'N' AND ((devt_remid is null) or (DEVT_REMID = 0)) AND ((devt_pedid is null) or (DEVT_PEDID = 0))
    AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 33 AND ((P.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
    AND NOT EXISTS (SELECT FD.FACT_ID FROM FACTURAS_DETALLE FD, FACTURAS FF, PREFIJOS PF
    WHERE FF.FACT_ID = FD.FACT_ID AND FF.FACT_FECHA >= :FECINI AND FF.FACT_FECHA <= :FECFIN AND FF.FACT_ANULADO = 'N' AND FD.arti_cod = D.arti_cod
       AND PF.PREF_PRE = FF.PREF_PRE AND PF.TIDO_COD = 31 AND ((PF.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) and substring(FD.arti_cod from 1 FOR 2) <> '.t')
    GROUP BY ARTI_COD
    INTO :ARTICULO, :CANTDEV, :BASEDEV, :IVADEV
    DO
    BEGIN
    cantvtas = 0;
    if (cantdev IS NULL) then
        cantdev = 0;
    ivavtas = 0;
    if (IVADEV IS NULL) then
        IVADEV = 0;
    basevtas = 0;
    if (basedev IS NULL) then
        basedev = 0;
    if (CANTDEV <> 0) then
        BEGIN
        SELECT ARTI_DES, ARTI_UNIDAD, A.GRUP_COD, A.SUBG_COD, A.MARC_COD, GRUP_NOM 
            FROM ARTICULO A, GRUPO G WHERE A.ARTI_COD = :articulo AND A.GRUP_COD = G.grup_cod
            INTO :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :NOMGRUPO;
        SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
        SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
        SUSPEND;
        END
    END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure VENTAS_CLIENTE (
    NIT varchar(20),
    FECINI date,
    FECFIN date,
    SUBEMPRESA integer)
returns (
    FACTURAS integer,
    MFACTURAS numeric(18,2),
    DEVOLUCIONES integer,
    MDEVOLUCIONES numeric(18,2),
    IVAFACT numeric(18,2),
    IVADEV numeric(18,2),
    CONSUMOF numeric(18,2),
    CONSUMOD numeric(18,2))
AS
BEGIN
  SELECT COUNT(*), SUM(FACT_TOTAL-FACT_IVAMONTO), SUM(FACT_IVAMONTO)
    FROM FACTURAS F, PREFIJOS P
    WHERE TERC_NIT = :NIT AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND FACT_ANULADO = 'N'
     AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
    INTO :FACTURAS, :MFACTURAS, :IVAFACT;
  SELECT COUNT(*), SUM(DEVT_TOTAL-DEVT_IVAMONTO), SUM(DEVT_IVAMONTO)
    FROM devoluciones_ventas F, PREFIJOS P
    WHERE TERC_NIT = :NIT AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND DEVT_ANULADO = 'N'
     AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 33 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) and ((devt_remid is null) or (DEVT_REMID = 0)) and ((devt_pedid is null) or (DEVT_PEDID = 0))
    INTO :DEVOLUCIONES, :MDEVOLUCIONES, :IVADEV;
  if (MFACTURAS IS NULL) then
    MFACTURAS = 0;
  if (MDEVOLUCIONES IS NULL) then
    MDEVOLUCIONES = 0;
  if (IVAFACT IS NULL) then
    IVAFACT = 0;
  if (IVADEV IS NULL) then
    IVADEV = 0;
  select sum(fade_consumo) from facturas_detalle d, facturas f, PREFIJOS P
    where d.fact_id = f.fact_id and TERC_NIT = :NIT AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND FACT_ANULADO = 'N'
     AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) and substring(d.arti_cod from 1 FOR 2) <> '.t'
    into :consumof;
    if (consumof is null) then
        consumof = 0;
    mfacturas = mfacturas - consumof;
  select sum(dvde_consumo) from devoluciones_ventas_detalle d, devoluciones_ventas f, PREFIJOS P
    where d.devt_id = f.devt_id and TERC_NIT = :NIT AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND DEVT_ANULADO = 'N'
     AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 33 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) and ((devt_remid is null) or (DEVT_REMID = 0)) and ((devt_pedid is null) or (DEVT_PEDID = 0)) and substring(d.arti_cod from 1 FOR 2) <> '.t'
    into :consumod;
    if (consumod is null) then
        consumod = 0;
    mdevoluciones = mdevoluciones - consumod;
  SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE VENTAS_CLIENTE_MES(
    FECINI DATE,
    FECFIN DATE,
    SUBEMPRESA INTEGER)
RETURNS (
    NIT VARCHAR(20),
    NOMBRE VARCHAR(60),
    ZONA CHAR(2),
    VEND INTEGER,
    COBR INTEGER,
    GRUP INTEGER,
    FACTURAS INTEGER,
    MFACTURAS NUMERIC(18,2),
    DEVOLUCIONES INTEGER,
    MDEVOLUCIONES NUMERIC(18,2),
    IVAFACT NUMERIC(18,2),
    IVADEV NUMERIC(18,2),
    CONSUMOF NUMERIC(18,2),
    CONSUMOD NUMERIC(18,2))
AS
BEGIN
  for select T.TERC_NIT, TERC_NOM, ZONA_COD, VEND_COD, COBR_COD, GRCA_COD
    from TERCEROS T, CLIENTES C WHERE T.terc_nit = C.terc_nit AND TERC_CLIE = 'S'
    into :NIT, :NOMBRE, :zona, :vend, :cobr, :grup
  DO
    BEGIN
    EXECUTE PROCEDURE VENTAS_CLIENTE (NIT, FECINI, FECFIN, SUBEMPRESA) returning_values (FACTURAS, MFACTURAS, DEVOLUCIONES, MDEVOLUCIONES, IVAFACT, IVADEV, CONSUMOF, CONSUMOD);
    SUSPEND;
    END
END

^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure VENTAS_VENDEDOR (
    CODVEND integer,
    FECINI date,
    FECFIN date,
    SUBEMPRESA integer)
returns (
    FACTURAS integer,
    MFACTURAS numeric(18,2),
    DEVOLUCIONES integer,
    MDEVOLUCIONES numeric(18,2),
    IVAFACT numeric(18,2),
    IVADEV numeric(18,2),
    CONSUMOF numeric(18,2),
    CONSUMOD numeric(18,2))
AS
BEGIN
  SELECT COUNT(*), SUM(FACT_TOTAL-FACT_IVAMONTO), SUM(FACT_IVAMONTO)
    FROM FACTURAS F, PREFIJOS P
      WHERE VEND_COD = :CODVEND AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND FACT_ANULADO = 'N'
       AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
      INTO :FACTURAS, :MFACTURAS, :IVAFACT;
  SELECT COUNT(*), SUM(DEVT_TOTAL-DEVT_IVAMONTO), SUM(DEVT_IVAMONTO)
    FROM devoluciones_ventas F, PREFIJOS P
      WHERE VEND_COD = :CODVEND AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN  AND DEVT_ANULADO = 'N'
       AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 33 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) and ((devt_remid is null) or (DEVT_REMID = 0)) and ((devt_pedid is null) or (DEVT_PEDID = 0))
      INTO :DEVOLUCIONES, :MDEVOLUCIONES, :IVADEV;
  if (MFACTURAS IS NULL) then
    MFACTURAS = 0;
  if (MDEVOLUCIONES IS NULL) then
    MDEVOLUCIONES = 0;
  if (IVAFACT IS NULL) then
    IVAFACT = 0;
  if (IVADEV IS NULL) then
    IVADEV = 0;
  select sum(fade_consumo) from facturas_detalle d, facturas f, PREFIJOS P
    where d.fact_id = f.fact_id and VEND_COD = :CODVEND AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND FACT_ANULADO = 'N'
     AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) and substring(d.arti_cod from 1 FOR 2) <> '.t'
    into :consumof;
    if (consumof is null) then
        consumof = 0;
    mfacturas = mfacturas - consumof;
  select sum(dvde_consumo) from devoluciones_ventas_detalle d, devoluciones_ventas f, PREFIJOS P
    where d.devt_id = f.devt_id and VEND_COD = :CODVEND AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND DEVT_ANULADO = 'N'
     AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 33 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) and ((devt_remid is null) or (DEVT_REMID = 0)) and ((devt_pedid is null) or (DEVT_PEDID = 0)) and substring(d.arti_cod from 1 FOR 2) <> '.t'
    into :consumod;
    if (consumod is null) then
        consumod = 0;
    mdevoluciones = mdevoluciones - consumod;
  SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE VENTAS_VENDEDOR_MES(
    FECINI DATE,
    FECFIN DATE,
    SUBEMPRESA INTEGER)
RETURNS (
    CODIGO INTEGER,
    NOMBRE VARCHAR(60),
    FACTURAS INTEGER,
    MFACTURAS NUMERIC(18,2),
    DEVOLUCIONES INTEGER,
    MDEVOLUCIONES NUMERIC(18,2),
    IVAFACT NUMERIC(18,2),
    IVADEV NUMERIC(18,2),
    CONSUMOF NUMERIC(18,2),
    CONSUMOD NUMERIC(18,2))
AS
BEGIN
  for select VEND_COD, VEND_NOMBRE from VENDEDORES into :CODIGO, :NOMBRE
  DO
    BEGIN
    EXECUTE PROCEDURE VENTAS_VENDEDOR (CODIGO, FECINI, FECFIN, SUBEMPRESA) returning_values (FACTURAS, MFACTURAS, DEVOLUCIONES, MDEVOLUCIONES, IVAFACT, IVADEV, CONSUMOF, CONSUMOD);
    SUSPEND;
    END
END

^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER DEVOLUCIONES_VENTAS_BI FOR DEVOLUCIONES_VENTAS
ACTIVE BEFORE INSERT POSITION 0
AS
declare variable NUMERO VARCHAR(6);
declare variable AUTOM CHAR(1);
declare variable EXISTE CHAR(1);
declare variable SITOT CHAR(2);
declare variable CODCOBR INTEGER;
declare variable CODVEND INTEGER;
declare variable FECSERVER CHAR(2);
declare variable PREGTASA CHAR(2);
BEGIN
if ((NEW.devt_trm IS NULL) or (NEW.devt_trm = 0)) then
    NEW.devt_trm = 1;
EXECUTE PROCEDURE LEE_CONFIGURACION('GENERAL', 'GENERAL', 'PREGUNTAR TASA DE CAMBIO EN DOCUMENTOS DE CARTERA') returning_values (:pregtasa);
if (PREGTASA = 'SI') then
    BEGIN
    NEW.devt_adicional = NEW.devt_adicional * NEW.devt_trm;
    NEW.devt_ivamonto = NEW.devt_ivamonto * NEW.devt_trm;
    NEW.devt_extra = NEW.devt_extra * NEW.devt_trm;
    NEW.devt_rtftemonto = NEW.devt_rtftemonto * NEW.devt_trm;
    NEW.devt_rtivamonto = NEW.devt_rtivamonto * NEW.devt_trm;
    NEW.devt_rticamonto = NEW.devt_rticamonto * NEW.devt_trm;
    NEW.devt_dtomonto = NEW.devt_dtomonto * NEW.devt_trm;
    END
EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION', 'DOCUMENTOS', 'INHABILITAR FECHA EN DOCUMENTOS') returning_values (:fecserver);
if (FECSERVER = 'SI') then
    NEW.devt_fecha = CAST ('NOW' AS DATE);
if (new.devt_remid is null) then
    NEW.devt_remid = 0;
if (new.devt_pedid is null) then
    NEW.devt_pedid = 0;
execute procedure LEE_CONFIGURACION ('FACTURACION','DEVOLUCIONES','PERMITIR DEVOLVER ITEMS NO FACTURADOS') returning_values (:SITOT);
if ((SITOT = 'NO') AND (NEW.devt_factid = 0) AND (NEW.devt_remid = 0) AND (NEW.devt_pedid = 0)) then
    exception factura_no_existe;
/* CALCULE LA COMISION CON BASE EN LA FACTURA */
EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION', 'VENDEDORES', 'COMISIONES EN VENTA INCLUYENDO IMPUESTOS') returning_values (:SITOT);
SELECT FACT_COMIPORC FROM FACTURAS WHERE FACT_ID = NEW.devt_factid INTO NEW.devt_comiporc;
if (NEW.devt_comiporc IS NULL) then
    NEW.devt_comiporc = 0;

if (SITOT = 'SI') then
    NEW.devt_comimonto = NEW.devt_total * NEW.devt_comiporc / 100;
ELSE
    NEW.devt_comimonto = (NEW.devt_total - NEW.devt_ivamonto) * NEW.devt_comiporc / 100;

if (NEW.numok = 'N') then
  BEGIN
  /* Actualice el contador del prefijo */
  SELECT PREF_ACTUAL, PREF_AUTO FROM PREFIJOS WHERE TIDO_COD = 33 AND PREF_PRE = NEW.PREF_PRE INTO :NUMERO, :AUTOM;
  /* ACTUALICE EL NUMERO EN COMPROBANTE_ENCABEZADO  */
  if (AUTOM = 'S') then
    BEGIN
    NEW.DEVT_NUMERO = NUMERO;
    NUMERO = CAST((CAST(NUMERO AS INTEGER) + 1) AS CHAR(6));
    UPDATE PREFIJOS
      SET PREF_ACTUAL = :NUMERO
    WHERE TIDO_COD = 33 AND PREF_PRE = NEW.PREF_PRE;
    END
  ELSE
    BEGIN
    if (CAST(NUMERO AS INTEGER) = CAST(NEW.DEVT_NUMERO AS INTEGER)) then
        UPDATE PREFIJOS
          SET PREF_ACTUAL = CAST((CAST(PREF_ACTUAL AS INTEGER) + 1) AS CHAR(6))
        WHERE TIDO_COD = 33 AND PREF_PRE = NEW.PREF_PRE;
    END
  EXECUTE PROCEDURE COMPLETA_CEROS (NEW.DEVT_numero) returning_values (NEW.DEVT_numero);
  NEW.numok = 'S';
  END
/* Verifique que el numero no existe previamente */
EXISTE = 'N';
SELECT 'S' FROM DEVOLUCIONES_VENTAS WHERE PREF_PRE = NEW.PREF_PRE AND DEVT_NUMERO = NEW.DEVT_NUMERO INTO :EXISTE;
if (EXISTE = 'S') then
    EXCEPTION DOCUMENTO_REGISTRADO 'Ya existe una devolución con el número ' || new.pref_pre || new.devt_numero;
select COBR_COD, VEND_COD FROM CLIENTES WHERE TERC_NIT = NEW.terc_nit INTO :CODCOBR, CODVEND;
if (NEW.cobr_cod IS NULL) then
    NEW.cobr_cod = :CODCOBR;
if (NEW.vend_cod IS NULL) then
    NEW.vend_cod = :CODVEND;
if ((new.DEVT_TOTAL-new.DEVT_IVAMONTO+new.DEVT_DTOMONTO-new.DEVT_ADICIONAL) = 0) then
    NEW.DEVT_FACTOR = 1;
else
    NEW.DEVT_FACTOR = (new.DEVT_TOTAL-new.DEVT_IVAMONTO)/(new.DEVT_TOTAL-new.DEVT_IVAMONTO+new.DEVT_DTOMONTO-new.DEVT_ADICIONAL);
END
^

SET TERM ; ^

ALTER TABLE PEDIDOS_DETALLE
ADD PEDE_DEVUELTO T_CANTIDAD;

SET TERM ^ ;

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

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

SET TERM ; ^

SET TERM ^ ;

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

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER DEVOLUCIONES_VENTAS_DETALLE_AD FOR DEVOLUCIONES_VENTAS_DETALLE
ACTIVE AFTER DELETE POSITION 0
AS
declare variable ID INTEGER;
declare variable ITEM INTEGER;
declare variable CANTAUX NUMERIC(18, 4);
declare variable CANT NUMERIC(18, 4);
declare variable FACTOR NUMERIC(18, 4);
declare variable DEVUELTO NUMERIC(18, 4);
declare variable IDREM INTEGER;
declare variable IDPED INTEGER;
declare variable devrem CHAR(8);
begin
execute procedure lee_configuracion ('FACTURACION', 'DEVOLUCIONES', 'HACER DEVOLUCIONES SOBRE REMISIONES') returning_values (:devrem);
if ((OLD.devt_id <> 0) AND (OLD.dvde_anulado = 'N')) then
    BEGIN
    delete from movimiento_articulo
      where (mvar_tipodoc = 33) and (mvar_idref = old.devt_id) and (mvar_item = old.dvde_item);
  
    /* DESHAGA LO DEVUELTO EN LA FACTURA */
    SELECT DEVT_FACTID FROM DEVOLUCIONES_VENTAS
        WHERE DEVT_ID = OLD.DEVT_ID INTO :ID;
    if (ID <> 0) then
        BEGIN
        CANTAUX = OLD.dvde_cant * OLD.dvde_factor;
        FOR SELECT FADE_CANT, FADE_FACTOR, FADE_DEVUELTO, FADE_ITEM
            FROM FACTURAS_DETALLE
            WHERE FACT_ID = :ID AND ARTI_COD = OLD.ARTI_COD
            INTO :CANT, :FACTOR, :DEVUELTO, :ITEM
            DO
                BEGIN
                if (CANTAUX > 0) then
                  if (CANTAUX > DEVUELTO) then
                    BEGIN
                    UPDATE FACTURAS_DETALLE
                        SET FADE_DEVUELTO = 0
                        WHERE FACT_ID = :ID AND ARTI_COD = OLD.ARTI_COD AND FADE_ITEM = :ITEM;
                    CANTAUX = CANTAUX - DEVUELTO;
                    END
                  ELSE
                    BEGIN
                    UPDATE FACTURAS_DETALLE
                        SET FADE_DEVUELTO = FADE_DEVUELTO - :CANTAUX
                        WHERE FACT_ID = :ID AND ARTI_COD = OLD.ARTI_COD AND FADE_ITEM = :ITEM;
                    CANTAUX = 0;
                    END
                END
        END
    if (devrem = 'SI') then
        begin
        idrem = 0;
        SELECT DEVT_REMID FROM DEVOLUCIONES_VENTAS
            WHERE DEVT_ID = OLD.DEVT_ID INTO :idrem;
        if (idrem <> 0) then
            BEGIN
            CANTAUX = OLD.dvde_cant * OLD.dvde_factor;
            FOR SELECT RVDE_CANT, RVDE_FACTOR, RVDE_DEVUELTO, RVDE_ITEM
                FROM remisiones_venta_detalle
                WHERE REVT_ID = :idrem AND ARTI_COD = OLD.ARTI_COD
                INTO :CANT, :FACTOR, :DEVUELTO, :ITEM
                DO
                BEGIN
                if (CANTAUX > 0) then
                    if (CANTAUX > DEVUELTO) then
                        BEGIN
                        UPDATE remisiones_venta_detalle
                            SET RVDE_DEVUELTO = 0
                            WHERE REVT_ID = :idrem AND ARTI_COD = OLD.ARTI_COD AND RVDE_ITEM = :ITEM;
                        CANTAUX = CANTAUX - DEVUELTO;
                        END
                    ELSE
                        BEGIN
                        UPDATE remisiones_venta_detalle
                            SET RVDE_DEVUELTO = RVDE_DEVUELTO - :CANTAUX
                            WHERE REVT_ID = :idrem AND ARTI_COD = OLD.ARTI_COD AND RVDE_ITEM = :ITEM;
                        CANTAUX = 0;
                        END
                END
            END
        end
    if (devrem = 'PEDIDO') then
        begin
        idrem = 0;
        SELECT DEVT_PEDID FROM DEVOLUCIONES_VENTAS
            WHERE DEVT_ID = OLD.DEVT_ID INTO :idped;
        if (idped <> 0) then
            BEGIN
            CANTAUX = OLD.dvde_cant * OLD.dvde_factor;
            FOR SELECT PEDE_CANT, PEDE_FACTOR, PEDE_DEVUELTO, PEDE_ITEM
                FROM pedidos_detalle
                WHERE PEDI_ID = :idped AND ARTI_COD = OLD.ARTI_COD
                INTO :CANT, :FACTOR, :DEVUELTO, :ITEM
                DO
                BEGIN
                if (CANTAUX > 0) then
                    if (CANTAUX > DEVUELTO) then
                        BEGIN
                        UPDATE pedidos_detalle
                            SET PEDE_DEVUELTO = 0
                            WHERE PEDI_ID = :idped AND ARTI_COD = OLD.ARTI_COD AND PEDE_ITEM = :ITEM;
                        CANTAUX = CANTAUX - DEVUELTO;
                        END
                    ELSE
                        BEGIN
                        UPDATE pedidos_detalle
                            SET PEDE_DEVUELTO = PEDE_DEVUELTO - :CANTAUX
                            WHERE PEDI_ID = :idped AND ARTI_COD = OLD.ARTI_COD AND PEDE_ITEM = :ITEM;
                        CANTAUX = 0;
                        END
                END
            END
        end
    END
END
^

SET TERM ; ^


/* 20100331B */
/* DESCUENTO LO DEVUELTO DEL PEDIDO */
SET TERM ^ ;

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

if (CANT IS NULL) then
    CANT = 0;
if (ARTIC <> codomite) then
    BEGIN
    /* RECORRA LOS USOS EN CONSOLIDE_DOCS */
    SELECT SUM(COFA_CANT * COFA_FACTOR) FROM consolidado_faltantes
        WHERE COFA_TIPOORI = :tipori AND COFA_IDORI = :IDDOC AND COFA_ITEMORI = :ITEM AND COFA_TIPODES = :TIPDES AND COFA_OK = 'S'
        INTO :cantaux;
    if (CANTAUX IS NULL) then
        CANTAUX = 0;
    if (CANTAUX > (CANT * FACTOR)) then
        CANT = 0;
    ELSE
        CANT = ((CANT * FACTOR) - CANTAUX) / FACTOR;
    END
ELSE
    CANT = 0;
suspend;
end
^

SET TERM ; ^

SET TERM ^ ;

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

^

SET TERM ; ^

SET TERM ^ ;

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

^

SET TERM ; ^

SET TERM ^ ;

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

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

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE EXISTENCIAS_COMPRAS(
    ARTICULO VARCHAR(15),
    FECHA DATE,
    UNIDAD VARCHAR(8))
RETURNS (
    BODEGA VARCHAR(2),
    EXISTENCIA NUMERIC(18,2),
    RESERVADO NUMERIC(18,2),
    ORDENADO NUMERIC(18,2),
    PROMEDIO NUMERIC(18,2),
    VENTAMES NUMERIC(18,2),
    FECHACMP DATE,
    CANTCMP NUMERIC(18,2),
    DIAS INTEGER,
    SUGERIDO NUMERIC(18,2),
    STAND VARCHAR(20))
AS
declare variable FACTOR NUMERIC(15,4);
declare variable ORDENC NUMERIC(18,4);
declare variable PEDIDO NUMERIC(18,4);
declare variable ITEM INTEGER;
declare variable ID INTEGER;
declare variable UND VARCHAR(8);
declare variable CANT NUMERIC(18,4);
declare variable FACTOR2 NUMERIC(18,4);
declare variable fecini DATE;
declare variable FECHAAUX VARCHAR(10);
declare variable AGENCIA INTEGER;
declare variable DEVMES NUMERIC(18,2);
declare variable MFAC INTEGER;
declare variable MDEV INTEGER;
declare variable IVAF NUMERIC(18,2);
declare variable IVAD NUMERIC(18,2);
declare variable DIA_ART VARCHAR(2) CHARACTER SET NONE;
declare variable DIASC VARCHAR(255);
declare variable PEDAUTO CHAR(2);
declare variable SALIDAS NUMERIC(18,4);
BEGIN
  for select bode_cod, SUCU_ID from bodega into :bodega, :agencia
    do
    begin
    execute procedure saldo_inventario (:articulo, :bodega, :fecha) returning_values (:Existencia);
    EXECUTE PROCEDURE FACTOR_UNIDAD_CANT(:ARTICULO, :UNIDAD) returning_values (:FACTOR);
    if (FACTOR <> 0) then
        EXISTENCIA = EXISTENCIA / FACTOR;
    else
        EXISTENCIA = 0;
    STAND = '';
    SELECT STAND_COD FROM STANDS WHERE ARTI_COD = :ARTICULO AND STAND_BODEGA = :BODEGA INTO :stand;
    EXECUTE PROCEDURE promedio_salidas_articulo (:ARTICULO, :FECHA, :BODEGA) returning_values (:PROMEDIO, :SALIDAS);
    EXECUTE PROCEDURE lee_configuracion ('INVENTARIO', 'EXISTENCIAS', 'PROMEDIAR LAS SALIDAS DEL INVENTARIO CON EL NUMERO DE DIAS ASIGNADO A CADA ARTICULO') returning_values (:DIA_ART);
    if (DIA_ART = 'NO') then
        BEGIN
        EXECUTE PROCEDURE lee_configuracion ('INVENTARIO', 'EXISTENCIAS', 'NUMERO DE DIAS PARA PROMEDIO DE SALIDAS POR ARTICULO') returning_values (DIASC);
        DIAS = CAST(DIASC AS INTEGER);
        END
    ELSE
        SELECT ARTI_DIAS FROM ARTICULO WHERE ARTI_COD = :ARTICULO INTO :DIAS;
    if (DIAS is null) then
        DIAS = 0;
    PROMEDIO = DIAS * PROMEDIO;
    if (FACTOR <> 0) then
        PROMEDIO = PROMEDIO / FACTOR;
    SUGERIDO = PROMEDIO - EXISTENCIA;
    SELECT SUM(ORID_ENTREGAR)
      FROM ORDENINVENTARIO_DETALLE OD, ordenes_inventario O
      WHERE O.ORIN_ID = OD.ORIN_ID AND ARTI_COD = :ARTICULO AND ORIN_FECHA <= :FECHA AND ORIN_FECLLEGA >= :FECHA AND ORID_ANULADO = 'N' AND OD.BODE_COD = :BODEGA
      INTO :ORDENADO;
    if (ORDENADO IS NULL) then
        ORDENADO = 0;
    ORDENC = 0;
    FOR SELECT O.ORDC_ID, OCDE_ITEM, OCDE_CANT * OCDE_FACTOR
        FROM ORDENES_COMPRA O, ORDENES_COMPRA_DETALLE OD
        WHERE O.ORDC_ID = OD.ORDC_ID AND OD.ARTI_COD = :ARTICULO AND (ORDC_FECHA+ORDC_VALIDEZ) >= :FECHA AND ORDC_FECHA <= :FECHA AND OCDE_ANULADO = 'N' AND OD.BODE_COD = :BODEGA
        INTO :ID, :ITEM, :CANT
        do
        BEGIN
        EXECUTE PROCEDURE FALTANTE(23, 21, ID, ITEM) returning_values (PEDIDO, UND, FACTOR2);
        if (PEDIDO * FACTOR2 = CANT) then /* SI NO SE HA FACTURADO MIRE A VER SI SE REMISIONO */
            EXECUTE PROCEDURE FALTANTE(23, 22, ID, ITEM) returning_values (PEDIDO, UND, FACTOR2);
        if (PEDIDO IS NULL) then
            PEDIDO = 0;
        ORDENC = ORDENC + PEDIDO * FACTOR2;
        END
    ORDENADO = ORDENADO + ORDENC;
    if (FACTOR <> 0) then
        ORDENADO = ORDENADO / FACTOR;
    SELECT SUM(RSDE_LIBERAR)
      FROM RESERVAS_DETALLE RD, RESERVAS R
      WHERE R.RESE_ID = RD.RESE_ID AND ARTI_COD = :ARTICULO AND RESE_FECHA <= :FECHA AND RESE_VENCE >= :FECHA AND RD.BODE_COD = :BODEGA AND RSDE_ANULADO = 'N'
      INTO :RESERVADO;
    if (RESERVADO IS NULL) then
        RESERVADO = 0;
    PEDIDO = 0;
    FOR SELECT P.PEDI_ID, PEDE_ITEM, PEDE_CANT * PEDE_FACTOR
        FROM PEDIDOS P, PEDIDOS_DETALLE PD
        WHERE P.PEDI_ID = PD.PEDI_ID AND PD.ARTI_COD = :ARTICULO AND (PEDI_FECHA+PEDI_VALIDEZ) >= :FECHA AND PEDI_FECHA <= :FECHA AND PEDE_ANULADO = 'N' AND BODE_COD = :BODEGA
        INTO :ID, :ITEM, :CANT
        do
        BEGIN
        EXECUTE PROCEDURE FALTANTE(34, 31, ID, ITEM) returning_values (ORDENC, UND, FACTOR2);
        EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION', 'FACTURAS', 'GENERAR PEDIDO AUTOMATICAMENTE CON LA FACTURA') returning_values (pedauto);
        if ((ORDENC * FACTOR2 = CANT) or (PEDAUTO = 'SI')) then /* SI NO SE HA FACTURADO MIRE A VER SI SE REMISIONO */
            EXECUTE PROCEDURE FALTANTE(34, 32, ID, ITEM) returning_values (ORDENC, UND, FACTOR2);
        if (ORDENC IS NULL) then
            ORDENC = 0;
        PEDIDO = PEDIDO + ORDENC * FACTOR2;
        END
    RESERVADO = RESERVADO + PEDIDO;
    if (FACTOR <> 0) then
        RESERVADO = RESERVADO / FACTOR;
    /* VENTAS MES */
    FECHAAUX = CAST (FECHA AS VARCHAR(10));
    FECHAAUX = SUBSTR(FECHAAUX, 1, 7) || '/01';
    FECINI = CAST (FECHAAUX AS DATE);
    EXECUTE PROCEDURE ventas_articulo (:ARTICULO, :FECINI, :FECHA, :agencia) returning_values (:ventames, :mfac, :devmes, :mdev, :ivaf, :ivad);
    ventames = ventames - devmes;
    if (FACTOR <> 0) then
        ventames = ventames / FACTOR;
    /* FECHA COMPRA */
    fechacmp = null;
    cantcmp = 0;
    SELECT FIRST 1 FACO_FECHA, FCDE_CANT * FCDE_FACTOR FROM FACTURAS_COMPRA F, FACTURAS_COMPRAS_DETALLE D
        WHERE F.FACO_ID = D.faco_id AND D.ARTI_COD = :articulo AND FACO_FECHA <= :FECHA AND D.bode_cod = :BODEGA
        ORDER BY FACO_FECHA DESC, F.FACO_ID DESC
        INTO :fechacmp, :cantcmp;
    SUSPEND;
    end
END

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE EXISTENCIAS_DESDE_HASTA(
    FECHA DATE,
    ARTINI VARCHAR(20),
    ARTFIN VARCHAR(20),
    GRPINI VARCHAR(3),
    GRPFIN VARCHAR(3),
    BODINI VARCHAR(2),
    BODFIN VARCHAR(2),
    ORDEN CHAR(1),
    AGRUPA CHAR(1),
    DETALLE CHAR(1),
    RESERVA CHAR(1),
    ENPESO CHAR(1),
    MASIVA CHAR(1),
    SUCURSAL INTEGER)
RETURNS (
    CANT NUMERIC(18,4),
    COSTO NUMERIC(18,2),
    COSTO_LOTE NUMERIC(18,2),
    CODIGO VARCHAR(15),
    NOMBRE VARCHAR(60),
    UNIDAD VARCHAR(8),
    STAND VARCHAR(20),
    CODGRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    CODSUBG VARCHAR(3),
    NOMSUBG VARCHAR(30),
    CODMARC VARCHAR(3),
    NOMMARC VARCHAR(30),
    CODBOD VARCHAR(2),
    LOTE VARCHAR(15),
    NOMBOD VARCHAR(30),
    COSTOTOT NUMERIC(18,2),
    COSTOIVA NUMERIC(18,2),
    ULTCOSTO NUMERIC(18,2),
    FECHACOSTO DATE,
    CONSUMO NUMERIC(18,2),
    RESERVADO NUMERIC(18,4),
    ORDENADO NUMERIC(18,4),
    IVA NUMERIC(9,2),
    IVAMONTO NUMERIC(18,2),
    PESOUNIT NUMERIC(18,4),
    PESOTOTAL NUMERIC(18,4),
    PRECIO NUMERIC(18,2),
    CODBAR VARCHAR(20))
AS
declare variable exist char(1);
declare variable codini varchar(20);
declare variable codfin varchar(20);
declare variable desini varchar(20);
declare variable desfin varchar(20);
declare variable ordenc numeric(18,4);
declare variable pedido numeric(18,4);
declare variable ok char(1);
declare variable id integer;
declare variable item integer;
declare variable und varchar(8);
declare variable factor numeric(18,4);
declare variable cant2 numeric(18,4);
declare variable PEDAUTO CHAR(2);
DECLARE VARIABLE LISTA INTEGER;
BEGIN
EXECUTE PROCEDURE lee_configuracion ('FACTURACION','FACTURAS', 'CODIGO DE LA LISTA DE PRECIOS A MOSTRAR EN ARTICULOS') returning_values (:LISTA);
if (ORDEN = 'C') then
    BEGIN
    CODINI = ARTINI;
    CODFIN = ARTFIN;
    DESINI = '';
    DESFIN = 'zz';
    END
ELSE
    BEGIN
    DESINI = ARTINI;
    DESFIN = ARTFIN;
    CODINI = '';
    CODFIN = 'zz';
    END
EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION', 'FACTURAS', 'GENERAR PEDIDO AUTOMATICAMENTE CON LA FACTURA') returning_values (pedauto);
if (DETALLE = 'B') then
  BEGIN
  FOR SELECT ARTI_COD, ARTI_DES, ARTI_UNIDAD, ARTI_EXIST, TAIV_PORC, A.GRUP_COD, A.SUBG_COD, A.MARC_COD, BODE_COD, BODE_NOM, ARTI_CONSUMO, ARTI_PESO/1000
      FROM ARTICULO A, BODEGA B, TARIFA_IVA T
      WHERE ARTI_COD >= :CODINI AND ARTI_COD <= :CODFIN AND ARTI_DES >= :DESINI AND ARTI_DES <= :DESFIN AND ESAR_COD <> 'I' AND BODE_COD >= :BODINI AND
      BODE_COD <= :BODFIN AND ((SUCU_ID = :SUCURSAL) or (:SUCURSAL = 0)) AND A.TAIV_COD = T.TAIV_COD
      INTO :CODIGO, :NOMBRE, :UNIDAD, :EXIST, :IVA, :CODGRUPO, :CODSUBG, :CODMARC, :CODBOD, :NOMBOD, :CONSUMO, :pesounit
      DO
        BEGIN
        STAND = '';
        OK = 'N';
        if (AGRUPA = 'G') then
            BEGIN
            if ((CODGRUPO >= GRPINI) AND (CODGRUPO <= GRPFIN)) then
                OK = 'S';
            end
        ELSE
            if (AGRUPA = 'M') then
                BEGIN
                if ((CODMARC >= GRPINI) AND (CODMARC <= GRPFIN)) then
                    OK = 'S';
                END
        if (OK = 'S') then
            BEGIN
            NOMGRUPO = '';
            NOMMARC = '';
            NOMSUBG = '';
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            SELECT MAX(COBA_COD) FROM BARRAS_ARTICULO WHERE ARTI_COD = :codigo AND COBA_UNIDAD = :unidad INTO :codbar;
            if (CODBAR IS NULL) then
                CODBAR = CODIGO;
            if (EXIST <> 'N') then
                BEGIN
                SELECT STAND_COD FROM STANDS WHERE ARTI_COD = :CODIGO AND STAND_BODEGA = :CODBOD INTO :STAND;
                EXECUTE PROCEDURE SALDO_INICIAL_INVENTARIO(CODIGO, FECHA, :CODBOD) returning_values (CANT);
                EXECUTE PROCEDURE costo_promedio_y_ultimo_unidad(CODIGO, FECHA, UNIDAD) returning_values (COSTO, ULTCOSTO);
                SELECT MAX(MVAR_FECHA) FROM MOVIMIENTO_ARTICULO WHERE ARTI_COD = :CODIGO AND MVAR_ENTRADA = 'S' AND MVAR_FECHA <= :FECHA INTO :FECHACOSTO;
                COSTOTOT = :CANT * :COSTO;
                IVAMONTO = COSTOTOT /100 * IVA;
                COSTOIVA = COSTOTOT;
                if (MASIVA = 'S') then
                    BEGIN
                    COSTOIVA = COSTOTOT + IVAMONTO;
                    COSTO = COSTO * (100 + :IVA) / 100 + :CONSUMO;
                    END
                CONSUMO = CONSUMO * CANT;
                COSTOIVA = COSTOIVA + CONSUMO;
                if (RESERVA = 'S') then
                    BEGIN
                    SELECT SUM(ORID_ENTREGAR)
                        FROM ORDENINVENTARIO_DETALLE OD, ordenes_inventario O
                        WHERE O.ORIN_ID = OD.ORIN_ID AND ARTI_COD = :CODIGO AND ORIN_FECHA <= :FECHA AND ORIN_FECLLEGA >= :FECHA AND ORID_ANULADO = 'N' AND OD.BODE_COD = :CODBOD
                        INTO :ORDENADO;
                    if (ORDENADO IS NULL) then
                        ORDENADO = 0;
                    ORDENC = 0;
                    FOR SELECT O.ORDC_ID, OCDE_ITEM, OCDE_CANT * OCDE_FACTOR
                        FROM ORDENES_COMPRA O, ORDENES_COMPRA_DETALLE OD
                        WHERE O.ORDC_ID = OD.ORDC_ID AND OD.ARTI_COD = :CODIGO AND ORDC_VENCE >= :FECHA AND ORDC_FECHA <= :FECHA AND OCDE_ANULADO = 'N' AND OD.BODE_COD = :CODBOD
                        INTO :ID, :ITEM, :CANT2
                        do
                        BEGIN
                        EXECUTE PROCEDURE FALTANTE(23, 21, ID, ITEM) returning_values (PEDIDO, UND, FACTOR);
                        if (PEDIDO * FACTOR = CANT2) then /* SI NO SE HA FACTURADO MIRE A VER SI SE REMISIONO */
                            EXECUTE PROCEDURE FALTANTE(23, 22, ID, ITEM) returning_values (PEDIDO, UND, FACTOR);
                        if (PEDIDO IS NULL) then
                            PEDIDO = 0;
                        ORDENC = ORDENC + PEDIDO * FACTOR;
                        END
                    ORDENADO = ORDENADO + ORDENC;
                    SELECT SUM(RSDE_LIBERAR)
                        FROM RESERVAS_DETALLE RD, RESERVAS R
                        WHERE R.RESE_ID = RD.RESE_ID AND ARTI_COD = :CODIGO AND RESE_FECHA <= :FECHA AND RESE_VENCE >= :FECHA AND RD.BODE_COD = :CODBOD AND RSDE_ANULADO = 'N'
                        INTO :RESERVADO;
                    if (RESERVADO IS NULL) then
                        RESERVADO = 0;
                    PEDIDO = 0;
                    FOR SELECT P.PEDI_ID, PEDE_ITEM, PEDE_CANT * PEDE_FACTOR
                        FROM PEDIDOS P, PEDIDOS_DETALLE PD
                        WHERE P.PEDI_ID = PD.PEDI_ID AND PD.ARTI_COD = :CODIGO AND PEDI_VENCE >= :FECHA AND PEDI_FECHA <= :FECHA AND PEDE_ANULADO = 'N' AND BODE_COD = :CODBOD
                        INTO :ID, :ITEM, :CANT2
                        do
                        BEGIN
                        EXECUTE PROCEDURE FALTANTE(34, 31, ID, ITEM) returning_values (ORDENC, UND, FACTOR);
                        if ((ORDENC * FACTOR = CANT2) or (PEDAUTO = 'SI')) then /* SI NO SE HA FACTURADO MIRE A VER SI SE REMISIONO */
                            EXECUTE PROCEDURE FALTANTE(34, 32, ID, ITEM) returning_values (ORDENC, UND, FACTOR);
                        if (ORDENC IS NULL) then
                            ORDENC = 0;
                        PEDIDO = PEDIDO + ORDENC * FACTOR;
                        END
                    RESERVADO = RESERVADO + PEDIDO;
                    END
                ELSE
                    BEGIN
                    RESERVADO = 0;
                    ORDENADO = 0;
                    END
                if (LISTA > 0) then
                    SELECT prar_fijo FROM precios_articulo WHERE arti_cod = :CODIGO and lipr_cod = :LISTA INTO :PRECIO;
                if (ENPESO = 'S') then
                    BEGIN
                    if (pesounit IS NULL) then
                        pesounit = 0;
                    if (PESOUNIT <> 0) then
                        BEGIN
                        pesototal = PESOUNIT * cant;
                        SUSPEND;
                        END
                    END
                ELSE
                    SUSPEND;
                END
            END
        END
  END

if (DETALLE = 'L') then
  BEGIN
  FOR SELECT A.ARTI_COD, ARTI_DES, ARTI_UNIDAD, ARTI_EXIST, TAIV_PORC, A.GRUP_COD, A.SUBG_COD, A.MARC_COD, L.lote_nro, L.lote_nro||' - '||L.lote_vence, ARTI_CONSUMO,l.bode_cod, L.lote_saldo,l.lote_costo, ARTI_PESO/1000
      FROM ARTICULO A, LOTES l, TARIFA_IVA T
      WHERE A.ARTI_COD >= '0' AND A.ARTI_COD <= 'zz' AND ARTI_DES >= '' AND ARTI_DES <= 'zz' AND ESAR_COD <> 'I' AND A.TAIV_COD = T.TAIV_COD and a.arti_cod = l.arti_cod
      INTO :CODIGO, :NOMBRE, :UNIDAD, :EXIST, :IVA, :CODGRUPO, :CODSUBG, :CODMARC, :LOTE, :NOMBOD, :CONSUMO, :codbod, :cant, :costo_lote, :pesounit
      DO
        BEGIN
        OK = 'N';
        if (AGRUPA = 'G') then
            BEGIN
            if ((CODGRUPO >= GRPINI) AND (CODGRUPO <= GRPFIN)) then
                OK = 'S';
            end
        ELSE
            if (AGRUPA = 'M') then
                BEGIN
                if ((CODMARC >= GRPINI) AND (CODMARC <= GRPFIN)) then
                    OK = 'S';
                END
        if (OK = 'S') then
            BEGIN
            NOMGRUPO = '';
            NOMMARC = '';
            NOMSUBG = '';
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            SELECT MAX(COBA_COD) FROM BARRAS_ARTICULO WHERE ARTI_COD = :codigo AND COBA_UNIDAD = :unidad INTO :codbar;
            if (CODBAR IS NULL) then
                CODBAR = CODIGO;

            if (EXIST <> 'N') then
                BEGIN
                EXECUTE PROCEDURE COSTO_PROMEDIO_UNIDAD(CODIGO, FECHA, UNIDAD) returning_values (COSTO);
                EXECUTE PROCEDURE ULTIMO_COSTO(CODIGO, FECHA, UNIDAD) returning_values (ULTCOSTO);
                SELECT MAX(MVAR_FECHA) FROM MOVIMIENTO_ARTICULO WHERE ARTI_COD = :CODIGO AND MVAR_ENTRADA = 'S' AND MVAR_FECHA <= :FECHA INTO :FECHACOSTO;
                COSTOTOT = :CANT * :COSTO;
                IVAMONTO = COSTOTOT /100 * IVA;
                COSTOIVA = COSTOTOT;
                if (MASIVA = 'S') then
                    BEGIN
                    COSTOIVA = COSTOTOT + IVAMONTO;
                    COSTO = COSTO * (100 + :IVA) / 100 + :CONSUMO;
                    END
                CONSUMO = CONSUMO * CANT;
                COSTOIVA = COSTOIVA + CONSUMO;
                if (RESERVA = 'S') then
                    BEGIN
                    SELECT SUM(ORID_ENTREGAR)
                        FROM ORDENINVENTARIO_DETALLE OD, ordenes_inventario O
                        WHERE O.ORIN_ID = OD.ORIN_ID AND ARTI_COD = :CODIGO AND ORIN_FECHA <= :FECHA AND ORIN_FECLLEGA >= :FECHA AND ORID_ANULADO = 'N'
                        INTO :ORDENADO;
                    if (ORDENADO IS NULL) then
                        ORDENADO = 0;
                    ORDENC = 0;
                    FOR SELECT O.ORDC_ID, OCDE_ITEM, OCDE_CANT * OCDE_FACTOR
                        FROM ORDENES_COMPRA O, ORDENES_COMPRA_DETALLE OD
                        WHERE O.ORDC_ID = OD.ORDC_ID AND OD.ARTI_COD = :CODIGO AND ORDC_VENCE >= :FECHA AND ORDC_FECHA <= :FECHA AND OCDE_ANULADO = 'N'
                        INTO :ID, :ITEM, :CANT2
                        do
                        BEGIN
                        EXECUTE PROCEDURE FALTANTE(23, 21, ID, ITEM) returning_values (PEDIDO, UND, FACTOR);
                        if (PEDIDO * FACTOR = CANT2) then /* SI NO SE HA FACTURADO MIRE A VER SI SE REMISIONO */
                            EXECUTE PROCEDURE FALTANTE(23, 22, ID, ITEM) returning_values (PEDIDO, UND, FACTOR);
                        if (PEDIDO IS NULL) then
                            PEDIDO = 0;
                        ORDENC = ORDENC + PEDIDO * FACTOR;
                        END
                    ORDENADO = ORDENADO + ORDENC;
                    SELECT SUM(RSDE_LIBERAR)
                        FROM RESERVAS_DETALLE RD, RESERVAS R
                        WHERE R.RESE_ID = RD.RESE_ID AND ARTI_COD = :CODIGO AND RESE_FECHA <= :FECHA AND RESE_VENCE >= :FECHA AND RSDE_ANULADO = 'N'
                        INTO :RESERVADO;
                    if (RESERVADO IS NULL) then
                        RESERVADO = 0;
                    PEDIDO = 0;
                    FOR SELECT P.PEDI_ID, PEDE_ITEM, PEDE_CANT * PEDE_FACTOR
                        FROM PEDIDOS P, PEDIDOS_DETALLE PD
                        WHERE P.PEDI_ID = PD.PEDI_ID AND PD.ARTI_COD = :CODIGO AND PEDI_VENCE >= :FECHA AND PEDI_FECHA <= :FECHA AND PEDE_ANULADO = 'N'
                        INTO :ID, :ITEM, :CANT2
                        do
                        BEGIN
                        EXECUTE PROCEDURE FALTANTE(34, 31, ID, ITEM) returning_values (ORDENC, UND, FACTOR);
                        if ((ORDENC * FACTOR = CANT2) or (PEDAUTO = 'SI')) then /* SI NO SE HA FACTURADO MIRE A VER SI SE REMISIONO */
                            EXECUTE PROCEDURE FALTANTE(34, 32, ID, ITEM) returning_values (ORDENC, UND, FACTOR);
                        if (ORDENC IS NULL) then
                            ORDENC = 0;
                        PEDIDO = PEDIDO + ORDENC * FACTOR;
                        END
                    RESERVADO = RESERVADO + PEDIDO;
                    END
                ELSE
                    BEGIN
                    RESERVADO = 0;
                    ORDENADO = 0;
                    END
                if (LISTA > 0) then
                    SELECT prar_fijo FROM precios_articulo WHERE arti_cod = :CODIGO and lipr_cod = :LISTA INTO :PRECIO;
                if (ENPESO = 'S') then
                    BEGIN
                    if (pesounit IS NULL) then
                        pesounit = 0;
                    if (PESOUNIT <> 0) then
                        BEGIN
                        pesototal = PESOUNIT * cant;
                        SUSPEND;
                        END
                    END
                ELSE
                    SUSPEND;
                END
            END
        END
  end
if (DETALLE = 'N') then
  BEGIN
  FOR SELECT ARTI_COD, ARTI_DES, ARTI_UNIDAD, ARTI_EXIST, TAIV_PORC, A.GRUP_COD, A.SUBG_COD, A.MARC_COD, ARTI_CONSUMO, ARTI_PESO/1000
      FROM ARTICULO A, TARIFA_IVA T
      WHERE ARTI_COD >= :CODINI AND ARTI_COD <= :CODFIN AND ARTI_DES >= :DESINI AND ARTI_DES <= :DESFIN AND ESAR_COD <> 'I' AND A.TAIV_COD = T.TAIV_COD
      INTO :CODIGO, :NOMBRE, :UNIDAD, :EXIST, :IVA, :CODGRUPO, :CODSUBG, :CODMARC, :CONSUMO, :pesounit
      DO
        BEGIN
        OK = 'N';
        if (AGRUPA = 'G') then
            BEGIN
            if ((GRPINI = '0') AND (GRPFIN = 'zz')) then
                OK = 'S';
            else
                if ((CODGRUPO >= GRPINI) AND (CODGRUPO <= GRPFIN)) then
                    OK = 'S';
            end
        ELSE
            if (AGRUPA = 'M') then
                BEGIN
                if ((GRPINI = '0') AND (GRPFIN = 'zzz')) then
                    OK = 'S';
                else
                    if ((CODMARC >= GRPINI) AND (CODMARC <= GRPFIN)) then
                        OK = 'S';
                END
        if (OK = 'S') then
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            SELECT MAX(COBA_COD) FROM BARRAS_ARTICULO WHERE ARTI_COD = :codigo AND COBA_UNIDAD = :unidad INTO :codbar;
            if (CODBAR IS NULL) then
                CODBAR = CODIGO;

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

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

^

SET TERM ; ^

SET TERM ^ ;

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

^

SET TERM ; ^

SET TERM ^ ;

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

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE FALTANTES_VENTAS_ARTICULO(
    DESDE VARCHAR(20),
    HASTA VARCHAR(20),
    FECINI DATE,
    FECFIN DATE,
    DETALLE CHAR(1),
    TIPO INTEGER,
    DESTINO INTEGER,
    ORDEN CHAR(1),
    CEROS CHAR(1),
    SUCURSAL INTEGER)
RETURNS (
    ARTICULO VARCHAR(15),
    DESCRIPCION VARCHAR(60),
    CODGRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    CODSUBG VARCHAR(3),
    NOMSUBG VARCHAR(30),
    CODMARC VARCHAR(3),
    NOMMARC VARCHAR(30),
    CANTIDAD NUMERIC(18,4),
    UNIDAD VARCHAR(8),
    FALTANTE NUMERIC(18,4),
    BASE NUMERIC(18,2),
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    OBS VARCHAR(255))
AS
declare variable ID INTEGER;
declare variable ITEM INTEGER;
declare variable CANT NUMERIC(18,2);
declare variable CODINI VARCHAR(15);
declare variable CODFIN VARCHAR(15);
declare variable DESINI VARCHAR(15);
declare variable DESFIN VARCHAR(15);
declare variable MONTO NUMERIC(18,2);
declare variable FACTOR NUMERIC(18,4);
BEGIN
if (ORDEN = 'C') then
    BEGIN
    CODINI = DESDE;
    CODFIN = HASTA;
    DESINI = '';
    DESFIN = 'zz';
    END
ELSE
    BEGIN
    DESINI = DESDE;
    DESFIN = HASTA;
    CODINI = '';
    CODFIN = 'zz';
    END
  FOR SELECT ARTI_COD, ARTI_DES, ARTI_UNIDAD, A.GRUP_COD, A.SUBG_COD, A.MARC_COD FROM ARTICULO A
      WHERE ARTI_COD >= :CODINI AND ARTI_COD <= :CODFIN AND ARTI_DES >= :DESINI AND ARTI_DES <= :DESFIN
      INTO :ARTICULO, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
  DO
    BEGIN
    CANTIDAD = 0;
    faltante = 0;
    base = 0;
    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
    if (DETALLE = 'N') then
        BEGIN
        if (TIPO = 31) then
            BEGIN
            FOR SELECT F.FACT_ID, FADE_ITEM, FADE_CANT * FADE_FACTOR, (FADE_PRUNIT-FADE_DTOMONTO)
                FROM FACTURAS_DETALLE D, FACTURAS F, PREFIJOS P
                WHERE F.FACT_ID = D.FACT_ID AND ARTI_COD = :ARTICULO AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND FACT_ANULADO = 'N' AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND ((SUCU_ID = :SUCURSAL) or (:SUCURSAL = 0)) and substring(arti_cod from 1 FOR 2) <> '.t'
                ORDER BY F.FACT_ID, FADE_ITEM INTO :ID, :ITEM, :CANT, :MONTO
                DO
                BEGIN
                CANTIDAD = CANTIDAD + CANT;
                EXECUTE PROCEDURE FALTANTE(:TIPO, :DESTINO, :ID, :ITEM) returning_values (:CANT, :UNIDAD, :FACTOR);
                FALTANTE = FALTANTE + CANT;
                BASE = BASE + MONTO * CANT;
                END
            END
        if (TIPO = 32) then
            BEGIN
            FOR SELECT R.revt_id, rvde_item, RVDE_CANT * RVDE_FACTOR, (RVDE_PRUNIT-RVDE_DTOMONTO)
                FROM REMISIONES_VENTA_DETALLE D, REMISIONES_VENTA R, PREFIJOS P
                WHERE R.REVT_ID = D.REVT_ID AND ARTI_COD = :ARTICULO AND REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN AND REVT_ANULADO = 'N' AND P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = 32  AND ((SUCU_ID = :SUCURSAL) or (:SUCURSAL = 0))
                ORDER BY R.REVT_ID, RVDE_ITEM INTO :ID, :ITEM, :CANT, :MONTO
                DO
                BEGIN
                CANTIDAD = CANTIDAD + CANT;
                EXECUTE PROCEDURE FALTANTE(:TIPO, :DESTINO, :ID, :ITEM) returning_values (:CANT, :UNIDAD, :FACTOR);
                FALTANTE = FALTANTE + CANT;
                BASE = BASE + MONTO * CANT;
                END
            END
        if (TIPO = 34) then
            BEGIN
            FOR SELECT P.PEDI_ID, PEDE_ITEM, PEDE_CANT * PEDE_FACTOR, (PEDE_PRUNIT-PEDE_DTOMONTO)
                FROM PEDIDOS_DETALLE D, PEDIDOS P, PREFIJOS R
                WHERE P.PEDI_ID = D.PEDI_ID AND ARTI_COD = :ARTICULO AND PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND PEDI_ANULADO = 'N' AND P.PREF_PRE = R.PREF_PRE AND R.TIDO_COD = 34  AND ((SUCU_ID = :SUCURSAL) or (:SUCURSAL = 0))
                ORDER BY P.PEDI_ID, PEDE_ITEM INTO :ID, :ITEM, :CANT, :MONTO
                DO
                BEGIN
                CANTIDAD = CANTIDAD + CANT;
                EXECUTE PROCEDURE FALTANTE(:TIPO, :DESTINO, :ID, :ITEM) returning_values (:CANT, :UNIDAD, :FACTOR);
                FALTANTE = FALTANTE + CANT;
                BASE = BASE + MONTO * CANT;
                END
            END
        if (TIPO = 35) then
            BEGIN
            FOR SELECT C.COTI_ID, CTDE_ITEM, CTDE_CANT * CTDE_FACTOR, (CTDE_PRUNIT-CTDE_DTOMONTO)
                FROM COTIZACIONES_DETALLE D, COTIZACIONES C, PREFIJOS P
                WHERE C.COTI_ID = D.COTI_ID AND ARTI_COD = :ARTICULO AND COTI_FECHA >= :FECINI AND COTI_FECHA <= :FECFIN AND COTI_ANULADO = 'N' AND P.PREF_PRE = C.PREF_PRE AND P.TIDO_COD = 35  AND ((SUCU_ID = :SUCURSAL) or (:SUCURSAL = 0))
                ORDER BY C.COTI_ID, CTDE_ITEM INTO :ID, :ITEM, :CANT, :MONTO
                DO
                BEGIN
                CANTIDAD = CANTIDAD + CANT;
                EXECUTE PROCEDURE FALTANTE(:TIPO, :DESTINO, :ID, :ITEM) returning_values (:CANT, :UNIDAD, :FACTOR);
                FALTANTE = FALTANTE + CANT;
                BASE = BASE + MONTO * CANT;
                END
            END
        if (CANTIDAD IS NULL) then
            CANTIDAD = 0;
        if (BASE IS NULL) then
            BASE = 0;
        if (FALTANTE IS NULL) then
            FALTANTE = 0;
        if (CEROS = 'S') then
            SUSPEND;
        ELSE
            if (FALTANTE <> 0) then
                SUSPEND;
        END
    ELSE
        BEGIN
        if (TIPO = 31) then
            FOR SELECT F.FACT_ID, FADE_ITEM, F.PREF_PRE, FACT_NUMERO, FACT_FECHA, FADE_CANT * FADE_FACTOR, (FADE_PRUNIT-FADE_DTOMONTO), SUBSTRING(FACT_OBS FROM 1 FOR 255)
                FROM FACTURAS F, FACTURAS_DETALLE D, PREFIJOS P
                WHERE F.FACT_ID = D.FACT_ID AND ARTI_COD = :ARTICULO AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND FACT_ANULADO = 'N' AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND ((SUCU_ID = :SUCURSAL) or (:SUCURSAL = 0)) and substring(arti_cod from 1 FOR 2) <> '.t'
                ORDER BY F.FACT_ID, FADE_ITEM
                INTO :ID, :ITEM, :PREFIJO, :NUMERO, :FECHA, :CANTIDAD, :BASE, :OBS
                DO
                    BEGIN
                    EXECUTE PROCEDURE FALTANTE(:TIPO, :DESTINO, :ID, :ITEM) returning_values (:FALTANTE, :UNIDAD, :FACTOR);
                    if ((CEROS = 'S') or (FALTANTE <> 0)) then
                        SUSPEND;
                    END
        if (TIPO = 32) then
            FOR SELECT R.REVT_ID, RVDE_ITEM, R.PREF_PRE, REVT_NUMERO, REVT_FECHA, RVDE_CANT * RVDE_FACTOR, (RVDE_PRUNIT-RVDE_DTOMONTO), SUBSTRING(REVT_OBS FROM 1 FOR 255)
                FROM REMISIONES_VENTA R, REMISIONES_VENTA_DETALLE D, PREFIJOS P
                WHERE R.REVT_ID = D.REVT_ID AND ARTI_COD = :ARTICULO AND REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN AND REVT_ANULADO = 'N' AND P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = 32 AND ((SUCU_ID = :SUCURSAL) or (:SUCURSAL = 0))
                INTO :ID, :ITEM, :PREFIJO, :NUMERO, :FECHA, :CANTIDAD, :BASE, :OBS
                DO
                    BEGIN
                    EXECUTE PROCEDURE FALTANTE(:TIPO, :DESTINO, :ID, :ITEM) returning_values (:FALTANTE, :UNIDAD, :FACTOR);
                    if ((CEROS = 'S') or (FALTANTE <> 0)) then
                        SUSPEND;
                    END
        if (TIPO = 34) then
            FOR SELECT P.PEDI_ID, PEDE_ITEM, P.PREF_PRE, PEDI_NUMERO, PEDI_FECHA, PEDE_CANT * PEDE_FACTOR, (PEDE_PRUNIT-PEDE_DTOMONTO), SUBSTRING(PEDI_OBS FROM 1 FOR 255)
                FROM PEDIDOS P, PEDIDOS_DETALLE D, PREFIJOS R
                WHERE P.PEDI_ID = D.PEDI_ID AND ARTI_COD = :ARTICULO AND PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND PEDI_ANULADO = 'N' AND P.PREF_PRE = R.PREF_PRE AND R.TIDO_COD = 34 AND ((SUCU_ID = :SUCURSAL) or (:SUCURSAL = 0))
                INTO :ID, :ITEM, PREFIJO, :NUMERO, :FECHA, :CANTIDAD, :BASE, :OBS
                DO
                    BEGIN
                    EXECUTE PROCEDURE FALTANTE(:TIPO, :DESTINO, :ID, :ITEM) returning_values (:FALTANTE, :UNIDAD, :FACTOR);
                    if ((CEROS = 'S') or (FALTANTE <> 0)) then
                        SUSPEND;
                    END
        if (TIPO = 35) then
            FOR SELECT C.COTI_ID, CTDE_ITEM, C.PREF_PRE, COTI_NUMERO, COTI_FECHA, CTDE_CANT * CTDE_FACTOR, (CTDE_PRUNIT-CTDE_DTOMONTO), SUBSTRING(COTI_OBS FROM 1 FOR 255)
                FROM COTIZACIONES C, COTIZACIONES_DETALLE D, PREFIJOS P
                WHERE C.COTI_ID = D.COTI_ID AND ARTI_COD = :ARTICULO AND COTI_FECHA >= :FECINI AND COTI_FECHA <= :FECFIN AND COTI_ANULADO = 'N' AND P.PREF_PRE = C.PREF_PRE AND P.TIDO_COD = 35 AND ((SUCU_ID = :SUCURSAL) or (:SUCURSAL = 0))
                INTO :ID, :ITEM, PREFIJO, :NUMERO, :FECHA, :CANTIDAD, :BASE, :OBS
                DO
                    BEGIN
                    EXECUTE PROCEDURE FALTANTE(:TIPO, :DESTINO, :ID, :ITEM) returning_values (:FALTANTE, :UNIDAD, :FACTOR);
                    if ((CEROS = 'S') or (FALTANTE <> 0)) then
                        SUSPEND;
                    END
        END
    END
END

^

SET TERM ; ^

SET TERM ^ ;

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

^

SET TERM ; ^

SET TERM ^ ;

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

^

SET TERM ; ^

SET TERM ^ ;

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

^

SET TERM ; ^

SET TERM ^ ;

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

^

SET TERM ; ^

SET TERM ^ ;

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

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

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

^

SET TERM ; ^

SET TERM ^ ;

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

^

SET TERM ; ^

SET TERM ^ ;

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

^

SET TERM ; ^

SET TERM ^ ;

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

^

SET TERM ; ^

SET TERM ^ ;

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

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

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE REP_FALTANTES_VENTA(
    TIPOORI INTEGER,
    FECINI DATE,
    FECFIN DATE,
    TIPODES INTEGER,
    CEROS CHAR(1),
    DETALLE CHAR(1),
    SUBEMPRESA INTEGER)
RETURNS (
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    NIT VARCHAR(20),
    NOMCLIENTE VARCHAR(60),
    VEND INTEGER,
    NOMVEND VARCHAR(60),
    VENCE DATE,
    ARTICULO VARCHAR(15),
    DESCRIPCION VARCHAR(60),
    CANTIDAD NUMERIC(18,4),
    UNIDAD VARCHAR(8),
    PRECIO NUMERIC(18,2),
    DESCUENTO NUMERIC(9,4),
    FALTANTE NUMERIC(18,4),
    OBS VARCHAR(255),
    NUMCRUCE VARCHAR(10))
AS
declare variable ID INTEGER;
declare variable ITEM INTEGER;
declare variable FACTOR NUMERIC(18,4);
BEGIN
if (detalle = 'S') then
  BEGIN
  if (TIPOORI = 32) then
    FOR SELECT R.REVT_ID, R.PREF_PRE, REVT_NUMERO, REVT_FECHA, REVT_FECHA VENCE, RVDE_ITEM, R.TERC_NIT, REVT_NOMTERC, ARTI_COD, SUBSTR(RVDE_DESC,1,60), RVDE_UNIDAD, RVDE_CANT, RVDE_PRUNIT, RVDE_DTOPORC, SUBSTRING(REVT_OBS FROM 1 FOR 255)
      FROM REMISIONES_VENTA R, REMISIONES_VENTA_DETALLE D, PREFIJOS P
      WHERE R.REVT_ID = D.REVT_ID AND REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN and REVT_ANULADO = 'N'
       AND P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = 32 AND ((P.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
      ORDER BY REVT_FECHA, R.PREF_PRE, REVT_NUMERO, RVDE_ITEM
      INTO :ID, :PREFIJO, :NUMERO, :FECHA, :VENCE, :ITEM, :NIT, :NOMCLIENTE, :ARTICULO, :DESCRIPCION, :UNIDAD, :CANTIDAD, :PRECIO, :DESCUENTO, :OBS
      DO
        BEGIN
        EXECUTE PROCEDURE FALTANTE(:TIPOORI, :TIPODES, :ID,  :ITEM) returning_values (:FALTANTE, :UNIDAD, :FACTOR);
        if ((CEROS = 'N') or (FALTANTE = cantidad)) then
          SUSPEND;
        END
  if (TIPOORI = 34) then
    FOR SELECT P.PEDI_ID, P.PREF_PRE, PEDI_NUMERO, PEDI_FECHA, (PEDI_FECHA + PEDI_VALIDEZ), PEDE_ITEM, P.TERC_NIT, PEDI_NOMTERC, ARTI_COD, SUBSTR(PEDE_DESC,1,60), PEDE_UNIDAD, PEDE_CANT, PEDE_PRUNIT, PEDE_DTOPORC, SUBSTRING(PEDI_OBS FROM 1 FOR 255)
      FROM PEDIDOS P, PEDIDOS_DETALLE D, PREFIJOS PR
      WHERE P.PEDI_ID = D.PEDI_ID AND PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND PEDI_ANULADO = 'N' AND PEDI_VALIDEZ >= 0
       AND PR.PREF_PRE = P.PREF_PRE AND PR.TIDO_COD = 34 AND ((PR.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
      ORDER BY PEDI_FECHA, P.PREF_PRE, PEDI_NUMERO, PEDE_ITEM
      INTO :ID, :PREFIJO, :NUMERO, :FECHA, :VENCE, :ITEM, :NIT, :NOMCLIENTE, :ARTICULO, :DESCRIPCION, :UNIDAD, :CANTIDAD, :PRECIO, :DESCUENTO, :OBS
      DO
        BEGIN
        EXECUTE PROCEDURE FALTANTE(:TIPOORI, :TIPODES, :ID,  :ITEM) returning_values (:FALTANTE, :UNIDAD, :FACTOR);
        if ((CEROS = 'N') or (FALTANTE = cantidad)) then
          SUSPEND;
        END
  if (TIPOORI = 35) then
    FOR SELECT C.COTI_ID, C.PREF_PRE, COTI_NUMERO, COTI_FECHA, (COTI_FECHA + COTI_VALIDEZ), CTDE_ITEM, C.TERC_NIT, COTI_NOMTERC, ARTI_COD, SUBSTR(CTDE_DESC,1,60), CTDE_UNIDAD, CTDE_CANT, CTDE_PRUNIT, CTDE_DTOPORC, SUBSTRING(COTI_OBS FROM 1 FOR 255)
      FROM COTIZACIONES C, COTIZACIONES_DETALLE D, PREFIJOS P
      WHERE C.COTI_ID = D.COTI_ID AND COTI_FECHA >= :FECINI AND COTI_FECHA <= :FECFIN AND COTI_ANULADO = 'N'
       AND P.PREF_PRE = C.PREF_PRE AND P.TIDO_COD = 35 AND ((P.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
      ORDER BY COTI_FECHA, C.PREF_PRE, COTI_NUMERO, CTDE_ITEM
      INTO :ID, :PREFIJO, :NUMERO, :FECHA, :VENCE, :ITEM, :NIT, :NOMCLIENTE, :ARTICULO, :DESCRIPCION, :UNIDAD, :CANTIDAD, :PRECIO, :DESCUENTO, :OBS
      DO
        BEGIN
        EXECUTE PROCEDURE FALTANTE(:TIPOORI, :TIPODES, :ID,  :ITEM) returning_values (:FALTANTE, :UNIDAD, :FACTOR);
        if ((CEROS = 'N') or (FALTANTE = cantidad)) then
          SUSPEND;
        END
  END
ELSE
  BEGIN
  if (TIPOORI = 32) then
    FOR SELECT R.REVT_ID, R.PREF_PRE, REVT_NUMERO, REVT_FECHA, REVT_FECHA VENCE, R.TERC_NIT,
        REVT_NOMTERC, SUBSTRING(REVT_OBS FROM 1 FOR 255), R.VEND_COD, REVT_TOTAL
      FROM REMISIONES_VENTA R, PREFIJOS P
      WHERE REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN and REVT_ANULADO = 'N'
       AND P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = 32 AND ((P.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
      ORDER BY REVT_FECHA, R.PREF_PRE, REVT_NUMERO
      INTO :ID, :PREFIJO, :NUMERO, :FECHA, :VENCE, :NIT, :NOMCLIENTE, :OBS, :VEND, :PRECIO
      DO
        BEGIN
        NUMCRUCE = '';
        SELECT VEND_NOMBRE FROM VENDEDORES WHERE VEND_COD = :VEND INTO :NOMVEND;
        if (TIPODES = 31) then
            SELECT FIRST 1 PREF_PRE || FACT_NUMERO FROM FACTURAS F, consolidado_faltantes C
                WHERE F.fact_consolida = C.cofa_id AND C.cofa_tipoori = 32 AND C.cofa_idori = :ID AND
                C.cofa_tipodes = 31 AND C.cofa_ok = 'S' AND FACT_ANULADO = 'N'
                INTO :numcruce;
        if ((CEROS = 'N') or (NUMCRUCE = '')) then
          SUSPEND;
        END
  if (TIPOORI = 34) then
    FOR SELECT P.PEDI_ID, P.PREF_PRE, PEDI_NUMERO, PEDI_FECHA, (PEDI_FECHA + PEDI_VALIDEZ), P.TERC_NIT,
    PEDI_NOMTERC, SUBSTRING(PEDI_OBS FROM 1 FOR 255), P.VEND_COD, PEDI_TOTAL
      FROM PEDIDOS P, PREFIJOS PR
      WHERE PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND PEDI_ANULADO = 'N' AND PEDI_VALIDEZ >= 0
       AND PR.PREF_PRE = P.PREF_PRE AND PR.TIDO_COD = 34 AND ((PR.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
      ORDER BY PEDI_FECHA, P.PREF_PRE, PEDI_NUMERO
      INTO :ID, :PREFIJO, :NUMERO, :FECHA, :VENCE, :NIT, :NOMCLIENTE, :OBS, :VEND, :PRECIO
      DO
        BEGIN
        NUMCRUCE = '';
        SELECT VEND_NOMBRE FROM VENDEDORES WHERE VEND_COD = :VEND INTO :NOMVEND;
        if (TIPODES = 31) then
            SELECT FIRST 1 PREF_PRE || FACT_NUMERO FROM FACTURAS F, consolidado_faltantes C
                WHERE F.fact_consolida = C.cofa_id AND C.cofa_tipoori = 34 AND C.cofa_idori = :ID AND
                C.cofa_tipodes = 31 AND C.cofa_ok = 'S' AND FACT_ANULADO = 'N'
                INTO :numcruce;
        if (TIPODES = 32) then
            SELECT FIRST 1 PREF_PRE || REVT_NUMERO FROM remisiones_venta F, consolidado_faltantes C
                WHERE F.revt_consolida = C.cofa_id AND C.cofa_tipoori = 34 AND C.cofa_idori = :ID AND
                C.cofa_tipodes = 32 AND C.cofa_ok = 'S' AND REVT_ANULADO = 'N'
                INTO :numcruce;
        if ((CEROS = 'N') or (NUMCRUCE = '')) then
          SUSPEND;
        END
  if (TIPOORI = 35) then
    FOR SELECT C.COTI_ID, C.PREF_PRE, COTI_NUMERO, COTI_FECHA, (COTI_FECHA + COTI_VALIDEZ), C.TERC_NIT,
      COTI_NOMTERC, SUBSTRING(COTI_OBS FROM 1 FOR 255), C.VEND_COD, COTI_TOTAL
      FROM COTIZACIONES C, PREFIJOS P
      WHERE COTI_FECHA >= :FECINI AND COTI_FECHA <= :FECFIN AND COTI_ANULADO = 'N'
       AND P.PREF_PRE = C.PREF_PRE AND P.TIDO_COD = 35 AND ((P.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
      ORDER BY COTI_FECHA, C.PREF_PRE, COTI_NUMERO
      INTO :ID, :PREFIJO, :NUMERO, :FECHA, :VENCE, :NIT, :NOMCLIENTE, :OBS, :VEND, :PRECIO
      DO
        BEGIN
        NUMCRUCE = '';
        SELECT VEND_NOMBRE FROM VENDEDORES WHERE VEND_COD = :VEND INTO :NOMVEND;
        if (TIPODES = 31) then
            SELECT FIRST 1 PREF_PRE || FACT_NUMERO FROM FACTURAS F, consolidado_faltantes C
                WHERE F.fact_consolida = C.cofa_id AND C.cofa_tipoori = 35 AND C.cofa_idori = :ID AND
                C.cofa_tipodes = 31 AND C.cofa_ok = 'S' AND FACT_ANULADO = 'N'
                INTO :numcruce;
        if (TIPODES = 32) then
            SELECT FIRST 1 PREF_PRE || REVT_NUMERO FROM remisiones_venta F, consolidado_faltantes C
                WHERE F.revt_consolida = C.cofa_id AND C.cofa_tipoori = 35 AND C.cofa_idori = :ID AND
                C.cofa_tipodes = 32 AND C.cofa_ok = 'S' AND REVT_ANULADO = 'N'
                INTO :numcruce;
        if (TIPODES = 34) then
            SELECT FIRST 1 PREF_PRE || PEDI_NUMERO FROM PEDIDOS F, consolidado_faltantes C
                WHERE F.pedi_consolida = C.cofa_id AND C.cofa_tipoori = 35 AND C.cofa_idori = :ID AND
                C.cofa_tipodes = 34 AND C.cofa_ok = 'S' AND PEDI_ANULADO = 'N'
                INTO :numcruce;
        if ((CEROS = 'N') or (NUMCRUCE = '')) then
          SUSPEND;
        END
  END
END

^

SET TERM ; ^

SET TERM ^ ;

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

^

SET TERM ; ^

SET TERM ^ ;

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

^

SET TERM ; ^

SET TERM ^ ;

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

^

SET TERM ; ^

SET TERM ^ ;

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

^

SET TERM ; ^

SET TERM ^ ;

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

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

SET TERM ; ^


/* 20100401 */
/* AGREGUE A LA CONCILIACION DOCUMENTOS NUEVOS DEL MISMO MES NO CONCILIADOS */
SET TERM ^ ;

create or ALTER PROCEDURE CONCILIA_BANCO_ACT(
    ID INTEGER)
AS
declare variable fecini date;
declare variable fecfin date;
declare variable itemax integer;
declare variable db char(1);
declare variable cuenta integer;
declare variable tipodoc integer;
declare variable iddoc integer;
declare variable prefijo varchar(4);
declare variable numero varchar(6);
declare variable fecha date;
declare variable concepto varchar(60);
declare variable monto numeric(18,2);
begin
select CUBA_COD, COBN_FECINI, COBN_FECFIN FROM conciliacion_encabezado WHERE COBN_ID = :ID INTO :CUENTA, :FECINI, :FECFIN;
SELECT MAX(COBN_ITEM) FROM conciliacion_bancaria WHERE COBN_ID = :ID INTO :itemax;
/* AGREGUE LOS DOCUMENTOS SIN UBICAR */
FOR SELECT MOBA_PREF, MOBA_NUMERO, MOBA_FECHA, MOBA_TOTAL, MOBA_CONCEPTO, MOBA_TIPODOC, MOBA_IDREF, MOBA_DB
    FROM MOVIMIENTO_BANCO M
    WHERE MOBA_FECHA >= :FECINI AND MOBA_FECHA <= :FECFIN  AND M.cuba_cod = :cuenta AND MOBA_TOTAL <> 0
        and NOT EXISTS (SELECT COBN_ITEM FROM CONCILIACION_bancaria WHERE COBN_IDDOC = m.moba_idref AND COBN_TIPODOC = M.moba_tipodoc)
        and NOT EXISTS (SELECT COBN_ITEM FROM CONCILIACION_detalle WHERE COBD_IDDOC = m.moba_idref AND COBD_TIPODOC = M.moba_tipodoc)
    INTO :prefijo, :numero, :fecha, :monto, :concepto, :tipodoc, :iddoc, :DB
    DO
    BEGIN
    ITEMAX = ITEMAX + 1;
    if (DB = 'N') then
        INSERT INTO conciliacion_bancaria (CUBA_COD, COBN_ID, COBN_ITEM, COBN_FEC, COBN_PREFIJO, COBN_NUMERO, COBN_MONTO, COBN_TIPODOC, COBN_ANULADO, COBN_OK, COBN_CONC, COBN_IDDOC, COBN_DB, COBN_CLASE)
            VALUES (:CUENTA, :ID, :ITEMAX, :FECHA, :PREFIJO, :NUMERO, :monto, :TIPODOC, 'N', 'N', :concepto, :iddoc, :DB, '4');
    else
        INSERT INTO conciliacion_bancaria (CUBA_COD, COBN_ID, COBN_ITEM, COBN_FEC, COBN_PREFIJO, COBN_NUMERO, COBN_MONTO, COBN_TIPODOC, COBN_ANULADO, COBN_OK, COBN_CONC, COBN_IDDOC, COBN_DB, COBN_CLASE)
            VALUES (:CUENTA, :ID, :ITEMAX, :FECHA, :PREFIJO, :NUMERO, :monto, :TIPODOC, 'N', 'N', :concepto, :iddoc, :DB, '3');
    END
end
^

SET TERM ; ^


grant EXECUTE on PROCEDURE CONCILIA_BANCO_ACT  to PUBLIC;


/* 20100402 */
/* revision simultanea de todas las listas de un artículo */
SET TERM ^ ;

CREATE OR ALTER procedure REVISA_PRECIOS_ARTICULO (
    ARTICULO varchar(20),
    FECHA date)
returns (
    LISTA integer,
    NOMLISTA VARCHAR(30),
    DESCR varchar(60),
    GRUPO varchar(2),
    SUBGRUPO varchar(3),
    MARCA varchar(3),
    COSTO numeric(18,2),
    FIJO numeric(18,2),
    UNIDAD varchar(8),
    PORC numeric(9,4),
    SUGERIDO numeric(18,2),
    DIFER numeric(18,2),
    NUEVO numeric(18,2),
    OK char(1))
AS
declare variable marg numeric(9,4);
declare variable UOM VARCHAR(10);
declare variable BASE VARCHAR(10);
declare variable CAMBIO VARCHAR(10);
declare variable COSTOP numeric(18,2);
declare variable COSTOU numeric(18,2);
declare variable DIFMAX numeric(18,2);
declare variable DIG INTEGER;
declare variable TARIVA NUMERIC(9,4);
declare variable IVAINC CHAR(1);
declare variable LISTAREF INTEGER;
begin
execute procedure lee_configuracion ('FACTURACION', 'ARTICULOS', 'SUGERIR PRECIOS CON PORCENTAJE DE MARGEN O UTILIDAD') returning_values (:UOM);
EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION', 'ARTICULOS', 'REDONDEO AL MULTIPLO DE DIEZ EN PRECIOS') RETURNING_VALUES (:DIG);
EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION','ARTICULOS','CAMBIO DE PRECIOS AUTOMATICO AL CAMBIAR COSTO O PRECIO') returning_values (CAMBIO);
EXECUTE PROCEDURE lee_configuracion('FACTURACION','ARTICULOS','COSTO BASE PARA CALCULO DE PRECIOS DE VENTA AUTOMATICOS') returning_values (:BASE);
EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION','ARTICULOS','CODIGO DE LA LISTA DE PRECIOS BASE PARA CAMBIO DE PRECIOS AUTOMATICO') returning_values (LISTAREF);
EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION','ARTICULOS','DIFERENCIA EN PESOS MAXIMA A PERMITIR PARA CAMBIAR PRECIOS') returning_values (DIFMAX);
for select A.arti_des, A.grup_cod, A.subg_cod, A.marc_cod, A.arti_unidad, prar_fijo, prar_margen, prar_util, TAIV_PORC, LIPR_COD
    from precios_articulo p, articulo a, tarifa_iva T
    where a.arti_cod = p.arti_cod and a.ARTI_COD = :articulo and a.taiv_cod = t.taiv_cod
    order by lipr_cod
    into :descr, :grupo, :subgrupo, :marca, :unidad, :fijo, :marg, :porc, :tariva, :lista
    do
    begin
    SELECT LIPR_NOM FROM lista_precios WHERE LIPR_COD = :lista INTO :nomlista;
    if (UOM <> 'UTILIDAD') then
        PORC = MARG;
    if (CAMBIO = 'COSTO') then
        BEGIN
        EXECUTE PROCEDURE costo_promedio_y_ultimo (:ARTICULO, :FECHA) RETURNING_VALUES(:COSTOP, :COSTOU);
        if (base = 'ULTIMO') then
            COSTO = COSTOU;
        ELSE
            BEGIN
            COSTO = COSTOP;
            if (base = 'MAYOR') then
                if (COSTOP < COSTOU) then
                    COSTO = COSTOU;
            END
        SELECT LIPR_MODIF FROM LISTA_PRECIOS WHERE LIPR_COD = :lista INTO :IVAINC;
        if (IVAINC = 'S') then
            COSTO = COSTO * (1 + TARIVA/100);
        if (UOM = 'UTILIDAD') then
            SUGERIDO = COSTO * (1 + :PORC/100);
        ELSE
            SUGERIDO = COSTO / (1 - :PORC/100);
        END
    ELSE
        if (LISTA <> LISTAREF) then
            BEGIN
            SELECT PRAR_FIJO FROM PRECIOS_ARTICULO WHERE ARTI_COD = :articulo AND LIPR_COD = :LISTAREF INTO :SUGERIDO;
            if (IVAINC = 'S') then
                SUGERIDO = SUGERIDO / (1 + TARIVA/100);
            if (UOM = 'UTILIDAD') then
                SUGERIDO = SUGERIDO * (1 + :PORC/100);
            ELSE
                SUGERIDO = SUGERIDO / (1 - :PORC/100);
            END
    EXECUTE PROCEDURE REDONDEE (SUGERIDO, DIG) returning_values (SUGERIDO);
    DIFER = SUGERIDO - FIJO;
    NUEVO = SUGERIDO;
    OK = 'S';
    if ((abs(DIFER) > DIFMAX) and (sugerido <> 0)) then
        suspend;
    end
end
^

SET TERM ; ^

grant execute on procedure revisa_precios_articulo to public;

/* 20100402B */
/* SUGERIR PRECIO DESDE LA MISMA OPCION ANTES DE GRABAR */

SET TERM ^ ;

create or alter procedure SUGIERE_PRECIO (
    ARTICULO varchar(20),
    CODLISTA INTEGER,
    FECHA date,
    PORC NUMERIC(9,2),
    UOM CHAR(1))
returns (PRECIO NUMERIC(18,2))
AS
declare variable LISTA INTEGER;
declare variable COSTOP NUMERIC(18, 2);
declare variable COSTOU NUMERIC(18, 2);
declare variable DIG INTEGER;
declare variable IVAINC CHAR(1);
declare variable TARIVA NUMERIC(9,2);
declare variable BASE varchar(10);
declare variable CAMBIO CHAR(7);
BEGIN
EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION','ARTICULOS','CAMBIO DE PRECIOS AUTOMATICO AL CAMBIAR COSTO O PRECIO') returning_values (CAMBIO);
EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION', 'ARTICULOS', 'REDONDEO AL MULTIPLO DE DIEZ EN PRECIOS') RETURNING_VALUES (:DIG);
SELECT LIPR_MODIF FROM lista_precios WHERE LIPR_COD = :codlista INTO :ivainc;
SELECT TAIV_PORC FROM ARTICULO A, TARIFA_IVA T
    WHERE A.TAIV_COD = T.TAIV_COD AND ARTI_COD = :ARTICULO INTO :TARIVA;
if (CAMBIO = 'COSTO') then
  BEGIN
  SELECT GRUP_BASEPRECIO FROM GRUPO G, ARTICULO A WHERE G.GRUP_COD = A.grup_cod AND A.ARTI_COD = :articulo INTO :BASE;
  if ((BASE IS NULL) or (BASE = '')) then
    EXECUTE PROCEDURE lee_configuracion('FACTURACION','ARTICULOS','COSTO BASE PARA CALCULO DE PRECIOS DE VENTA AUTOMATICOS') returning_values (:BASE);
  EXECUTE PROCEDURE costo_promedio_y_ultimo (:ARTICULO, :FECHA) RETURNING_VALUES(:COSTOP, :COSTOU);
  if (base = 'ULTIMO') then
    PRECIO = COSTOU;
  ELSE
    BEGIN
    PRECIO = COSTOP;
    if (base = 'MAYOR') then
        if (COSTOP < COSTOU) then
            PRECIO = COSTOU;
    END
  END
ELSE
  if (CAMBIO = 'PRECIO') then
    BEGIN
    EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION','ARTICULOS','CODIGO DE LA LISTA DE PRECIOS BASE PARA CAMBIO DE PRECIOS AUTOMATICO') returning_values (LISTA);
    SELECT PRAR_FIJO FROM PRECIOS_ARTICULO WHERE LIPR_COD = :LISTA AND ARTI_COD = :articulo INTO :PRECIO;
    END
if (IVAINC = 'S') then
    PRECIO = PRECIO * (1 + TARIVA/100);
if (UOM = 'U') then
    BEGIN
    PRECIO = PRECIO * (1 + :PORC/100);
    EXECUTE PROCEDURE REDONDEE (PRECIO, DIG) returning_values (PRECIO);
    END
ELSE
    BEGIN
    PRECIO = PRECIO / (1 - :PORC/100);
    EXECUTE PROCEDURE REDONDEE (PRECIO, DIG) returning_values (PRECIO);
    END
SUSPEND;
END
^

SET TERM ; ^

GRANT EXECUTE ON PROCEDURE sugiere_precio TO PUBLIC;

/* 20100403: CORRECCIONES DEVOLUCIONES SOBRE PEDIDOS */

SET TERM ^ ;

CREATE OR ALTER TRIGGER PEDIDOS_DETALLE_BI FOR PEDIDOS_DETALLE
ACTIVE BEFORE INSERT POSITION 0
AS
declare variable FACTOR NUMERIC(18,4);
BEGIN
  /* CALCULE LO POR LIBERAR */
  EXECUTE PROCEDURE factor_unidad_cant(NEW.ARTI_COD, NEW.pede_unidad) returning_values (FACTOR);
  NEW.pede_reserva = NEW.pede_cant * FACTOR;
  if (NEW.pede_dtoporc IS NULL) then
    NEW.pede_dtoporc = 0;
  /* CALCULE EL MONTO DEL DESCUENTO */
  NEW.PEDE_DTOMONTO = NEW.pede_prunit * NEW.pede_dtoporc / 100;
if (new.bode_cod is null) then
    new.bode_cod = '01';
if (new.pede_devuelto is null) then
    new.pede_devuelto = 0;
END
^

SET TERM ; ^

ALTER TRIGGER PEDIDOS_DETALLE_AU INACTIVE;

update pedidos_detalle set pede_devuelto = 0;
commit work;

ALTER TRIGGER PEDIDOS_DETALLE_AU ACTIVE;

/* MAL FALTANTE DE PEDIDOS CON DEVOLUCIONES */
SET TERM ^ ;

CREATE OR ALTER procedure FALTANTE (
    TIPORI integer,
    TIPDES integer,
    IDDOC integer,
    ITEM integer)
returns (
    CANT numeric(18,4),
    UNIDAD varchar(8),
    FACTOR numeric(18,4))
AS
declare variable CANTAUX NUMERIC(18,4);
declare variable PEDAUTO CHAR(2);
declare variable ARTIC VARCHAR(20);
declare variable CODOMITE VARCHAR(20);
begin
/* BUSQUE EL DOCUMENTO Y RECORRA LOS ITEMS */
EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION', 'DOCUMENTOS', 'CODIGO DE ARTICULO A OMITIR EN LA CONSOLIDACION DE PENDIENTES') returning_values (:codomite);
if (TIPORI = 21) then
    BEGIN
    SELECT ARTI_COD, FCDE_CANT, FCDE_FACTOR, FCDE_UNIDAD FROM FACTURAS_COMPRAS_DETALLE
        WHERE FACO_ID = :IDDOC AND FCDE_ITEM = :ITEM AND FCDE_ANULADO = 'N' INTO :ARTIC, :CANT, :FACTOR, :UNIDAD;
    END
if (TIPORI = 22) then
    BEGIN
    SELECT ARTI_COD, RPVD_CANT, RPVD_FACTOR, RPVD_UNIDAD FROM remision_proveedor_det
        WHERE REPR_ID = :IDDOC AND RPVD_ITEM = :ITEM AND RPVD_ANULADO = 'N' INTO :ARTIC, :CANT, :FACTOR, :UNIDAD;
    END
if (TIPORI = 23) then
    BEGIN
    SELECT ARTI_COD, OCDE_CANT, OCDE_FACTOR, OCDE_UNIDAD FROM ORDENES_COMPRA_DETALLE
        WHERE ORDC_ID = :IDDOC AND OCDE_ITEM = :ITEM AND OCDE_ANULADO = 'N'  INTO :ARTIC, :CANT, :FACTOR, :UNIDAD;
    END
if (TIPORI = 25) then
    BEGIN
    SELECT ARTI_COD, CPRD_CANT, CPRD_FACTOR, CPRD_UNIDAD FROM COTIZACIONES_PROVEEDOR_DET
        WHERE COPR_ID = :IDDOC AND CPRD_ITEM = :ITEM AND CPRD_ANULADO = 'N' INTO :ARTIC, :CANT, :FACTOR, :UNIDAD;
    END
if (TIPORI = 31) then
    BEGIN
    SELECT ARTI_COD, ((FADE_CANT * FADE_FACTOR)-FADE_DEVUELTO) / FADE_FACTOR, FADE_FACTOR, FADE_UNIDAD
        FROM FACTURAS_DETALLE WHERE FACT_ID = :IDDOC AND FADE_ITEM = :ITEM AND FADE_ANULADO = 'N'
        INTO :ARTIC, :CANT, :FACTOR, :UNIDAD;
    END
if (TIPORI = 32) then
    BEGIN
    SELECT ARTI_COD, ((RVDE_CANT * RVDE_FACTOR)-RVDE_DEVUELTO) / RVDE_FACTOR, RVDE_FACTOR, RVDE_UNIDAD
        FROM remisiones_venta_detalle WHERE REVT_ID = :IDDOC AND RVDE_ITEM = :ITEM AND RVDE_ANULADO = 'N'
        INTO :ARTIC, :CANT, :FACTOR, :UNIDAD;
    END
if (TIPORI = 34) then
    BEGIN
    SELECT ARTI_COD, ((PEDE_CANT * PEDE_FACTOR)-PEDE_DEVUELTO) / PEDE_FACTOR, PEDE_FACTOR, PEDE_UNIDAD FROM PEDIDOS_DETALLE
        WHERE PEDI_ID = :IDDOC AND PEDE_ITEM = :ITEM AND PEDE_ANULADO = 'N' INTO :ARTIC, :CANT, :FACTOR, :UNIDAD;
    EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION', 'FACTURAS', 'GENERAR PEDIDO AUTOMATICAMENTE CON LA FACTURA') returning_values (pedauto);
    if ((PEDAUTO = 'SI') and (ARTIC <> :codomite)) then
        begin
        /* RESTE LAS DEVOLUCIONES DE LA FACTURA ORIGINAL */
        SELECT SUM(FADE_DEVUELTO) FROM FACTURAS_DETALLE D, FACTURAS F, PEDIDOS P
            WHERE P.pedi_id = :IDDOC AND P.pref_pre = F.pref_pre AND P.pedi_numero = F.fact_numero AND D.fact_id = F.fact_id AND D.fade_item = :item AND FACT_ANULADO = 'N'
            INTO :cantaux;
        if (cantaux > 0) then
            CANT = (CANT * FACTOR - CANTAUX) / FACTOR;
        end
    END
if (TIPORI = 35) then
    BEGIN
    SELECT ARTI_COD, CTDE_CANT, CTDE_FACTOR, CTDE_UNIDAD FROM COTIZACIONES_DETALLE
        WHERE COTI_ID = :IDDOC AND CTDE_ITEM = :ITEM AND CTDE_ANULADO = 'N' INTO :ARTIC, :CANT, :FACTOR, :UNIDAD;
    END

if (CANT IS NULL) then
    CANT = 0;
if (ARTIC <> codomite) then
    BEGIN
    /* RECORRA LOS USOS EN CONSOLIDE_DOCS */
    SELECT SUM(COFA_CANT * COFA_FACTOR) FROM consolidado_faltantes
        WHERE COFA_TIPOORI = :tipori AND COFA_IDORI = :IDDOC AND COFA_ITEMORI = :ITEM AND COFA_TIPODES = :TIPDES AND COFA_OK = 'S'
        INTO :cantaux;
    if (CANTAUX IS NULL) then
        CANTAUX = 0;
    if (CANTAUX > (CANT * FACTOR)) then
        CANT = 0;
    ELSE
        CANT = ((CANT * FACTOR) - CANTAUX) / FACTOR;
    END
ELSE
    CANT = 0;
suspend;
end
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE CONSOLIDE_PENDIENTES(
    IDCONS INTEGER)
AS
declare variable TIPDES INTEGER;
declare variable TIPORI INTEGER;
declare variable IDORI INTEGER;
declare variable ITEM INTEGER;
declare variable ARTI VARCHAR(20);
declare variable CANT NUMERIC(18,4);
declare variable ITCONS INTEGER;
declare variable CODBAR VARCHAR(20);
declare variable UNIDAD VARCHAR(8);
declare variable LOTE VARCHAR(15);
declare variable LOTE_VENCE DATE;
declare variable FACTOR NUMERIC(18,4);
declare variable PRUNIT NUMERIC(18,2);
declare variable DESCITE VARCHAR(255);
declare variable BOD VARCHAR(2);
declare variable DTO NUMERIC(9,4);
declare variable LISTA INTEGER;
declare variable OBS BLOB SUB_TYPE 1 SEGMENT SIZE 8192;
declare variable REF VARCHAR(60);
begin
ITCONS = 1;
/* DADOS LOS IDS DE LOS DOCUMENTOS EN LA TABLA CONSOLIDE GENERE EL CONSOLIDADO */
FOR SELECT CEFA_TIPODES, CEFA_TIPOORI, CEFA_IDORI FROM consolide_faltantes
    WHERE CEFA_ID = :idcons ORDER BY CEFA_ITEM INTO :TIPDES, :TIPORI, :IDORI do
    BEGIN
    if (TIPORI = 21) then
        BEGIN
        FOR SELECT FCDE_ITEM, ARTI_COD, FCDE_CODBAR, FCDE_PRUNIT, FCDE_DESC, BODE_COD, FCDE_DTOPORC, FCDE_LOTE, LOTE_VENCE, FCDE_OBS, FCDE_REFERENCIA
            FROM FACTURAS_COMPRAS_DETALLE
            WHERE FACO_ID = :IDORI ORDER BY FCDE_ITEM INTO :ITEM, :ARTI, :CODBAR, :PRUNIT, :DESCITE, :BOD, :DTO, :LOTE, :LOTE_VENCE, :OBS, :REF
            DO
            BEGIN
            if (((CODBAR IS NULL) or (CODBAR = '')) AND (ARTI <> '')) then
                CODBAR = ARTI;
            EXECUTE PROCEDURE faltante(:TIPORI, :TIPDES, :IDORI, :ITEM) returning_values (:CANT, :UNIDAD, :FACTOR);
            if (CANT > 0) then
                BEGIN
                INSERT INTO CONSOLIDADO_FALTANTES (COFA_ID, COFA_ITEM, COFA_TIPODES, COFA_TIPOORI, COFA_IDORI, COFA_ITEMORI, ARTI_COD, COFA_CANT, COFA_CODBAR, COFA_UNIDAD, COFA_FACTOR, COFA_OK, COFA_PRUNIT, COFA_DESCITE, COFA_BODEGA, COFA_DTOITE, COFA_LOTE, LOTE_VENCE, CODE_OBSIT, CODE_REF)
                    VALUES (:IDCONS, :ITCONS, :tipdes,  :tipori, :idori, :item, :arti, :cant, :CODBAR, :UNIDAD, :FACTOR, 'N', :PRUNIT, :DESCITE, :BOD, :DTO, :LOTE, :LOTE_VENCE, :OBS, :REF);
                ITCONS = ITCONS + 1;
                END
            END
        END
    if (TIPORI = 22) then
        BEGIN
        FOR SELECT RPVD_ITEM, ARTI_COD, RPVD_CODBAR, RPVD_PRUNIT, RPVD_DESC, BODE_COD, RPVD_DTOPORC, RPVD_LOTE, LOTE_VENCE, RPVD_OBS
            FROM remision_proveedor_det
            WHERE REPR_ID = :IDORI ORDER BY RPVD_ITEM INTO :ITEM, :ARTI, :CODBAR, :PRUNIT, :DESCITE, :BOD, :DTO, :LOTE, :LOTE_VENCE, :OBS
            DO
            BEGIN
            if (((CODBAR IS NULL) or (CODBAR = '')) AND (ARTI <> '')) then
                CODBAR = ARTI;
            EXECUTE PROCEDURE faltante(:TIPORI, :TIPDES, :IDORI, :ITEM) returning_values (:CANT, :UNIDAD, :FACTOR);
            if (CANT > 0) then
                BEGIN
                INSERT INTO CONSOLIDADO_FALTANTES (COFA_ID, COFA_ITEM, COFA_TIPODES, COFA_TIPOORI, COFA_IDORI, COFA_ITEMORI, ARTI_COD, COFA_CANT, COFA_CODBAR, COFA_UNIDAD, COFA_FACTOR, COFA_OK, COFA_PRUNIT, COFA_DESCITE, COFA_BODEGA, COFA_DTOITE, COFA_LOTE, LOTE_VENCE, CODE_OBSIT)
                    VALUES (:IDCONS, :ITCONS, :tipdes,  :tipori, :idori, :item, :arti, :cant, :CODBAR, :UNIDAD, :FACTOR, 'N', :PRUNIT, :descite, :BOD, :DTO, :LOTE, :LOTE_VENCE, :OBS);
                ITCONS = ITCONS + 1;
                END
            END
        END
    if (TIPORI = 23) then
        BEGIN
        FOR SELECT OCDE_ITEM, ARTI_COD, OCDE_CODBAR, OCDE_PRUNIT, OCDE_DESC, BODE_COD, OCDE_DTOPORC, NULL, CAST('NOW' AS DATE), OCDE_OBS
            FROM ORDENES_COMPRA_DETALLE
            WHERE ORDC_ID = :IDORI ORDER BY OCDE_ITEM INTO :ITEM, :ARTI, :CODBAR, :PRUNIT, :DESCITE, :BOD, :DTO, :LOTE, :LOTE_VENCE, :OBS
            DO
            BEGIN
            if (((CODBAR IS NULL) or (CODBAR = '')) AND (ARTI <> '')) then
                CODBAR = ARTI;
            EXECUTE PROCEDURE faltante(:TIPORI, :TIPDES, :IDORI, :ITEM) returning_values (:CANT, :UNIDAD, :FACTOR);
            if (CANT > 0) then
                BEGIN
                INSERT INTO CONSOLIDADO_FALTANTES (COFA_ID, COFA_ITEM, COFA_TIPODES, COFA_TIPOORI, COFA_IDORI, COFA_ITEMORI, ARTI_COD, COFA_CANT, COFA_CODBAR, COFA_UNIDAD, COFA_FACTOR, COFA_OK, COFA_PRUNIT, COFA_DESCITE, COFA_BODEGA, COFA_DTOITE, COFA_LOTE, LOTE_VENCE, CODE_OBSIT)
                    VALUES (:IDCONS, :ITCONS, :tipdes,  :tipori, :idori, :item, :arti, :cant, :CODBAR, :UNIDAD, :FACTOR, 'N', :PRUNIT, :DESCITE, :BOD, :DTO, :LOTE, :LOTE_VENCE, :OBS);
                ITCONS = ITCONS + 1;
                END
            END
        END
    if (TIPORI = 25) then
        BEGIN
        FOR SELECT CPRD_ITEM, ARTI_COD, CPRD_CODBAR, CPRD_PRUNIT, CPRD_DESC, BODE_COD, CPRD_DTOPORC, NULL, CAST('NOW' AS DATE), CPRD_OBS
            FROM COTIZACIONES_PROVEEDOR_DET
            WHERE COPR_ID = :IDORI ORDER BY CPRD_ITEM INTO :ITEM, :ARTI, :CODBAR, :PRUNIT, :DESCITE, :BOD, :DTO, :LOTE, :LOTE_VENCE, :OBS
            DO
            BEGIN
            if (((CODBAR IS NULL) or (CODBAR = '')) AND (ARTI <> '')) then
                CODBAR = ARTI;
            EXECUTE PROCEDURE faltante(:TIPORI, :TIPDES, :IDORI, :ITEM) returning_values (:CANT, :UNIDAD, :FACTOR);
            if (CANT > 0) then
                BEGIN
                INSERT INTO CONSOLIDADO_FALTANTES (COFA_ID, COFA_ITEM, COFA_TIPODES, COFA_TIPOORI, COFA_IDORI, COFA_ITEMORI, ARTI_COD, COFA_CANT, COFA_CODBAR, COFA_UNIDAD, COFA_FACTOR, COFA_OK, COFA_PRUNIT, COFA_DESCITE, COFA_BODEGA, COFA_DTOITE, COFA_LOTE, LOTE_VENCE, CODE_OBSIT)
                    VALUES (:IDCONS, :ITCONS, :tipdes,  :tipori, :idori, :item, :arti, :cant, :CODBAR, :UNIDAD, :FACTOR, 'N', :PRUNIT, :DESCITE, :BOD, :DTO, :LOTE, :LOTE_VENCE, :OBS);
                ITCONS = ITCONS + 1;
                END
            END
        END
    if (TIPORI = 31) then
        BEGIN
        FOR SELECT FADE_ITEM, ARTI_COD, FADE_CODBAR, FADE_PRUNIT, SUBSTRING(FADE_DESC FROM 1 FOR 60), BODE_COD, FADE_DTOPORC, FADE_LOTE, CAST('NOW' AS DATE), LIPR_COD, FADE_OBS, FADE_REFERENCIA
            FROM FACTURAS_DETALLE
            WHERE FACT_ID = :IDORI ORDER BY FADE_ITEM INTO :ITEM, :ARTI, :CODBAR, :PRUNIT, :DESCITE, :BOD, :DTO, :LOTE, :LOTE_VENCE, :LISTA, :OBS, :REF
            DO
            BEGIN
            if (((CODBAR IS NULL) or (CODBAR = '')) AND (ARTI <> '')) then
                CODBAR = ARTI;
            EXECUTE PROCEDURE faltante(:TIPORI, :TIPDES, :IDORI, :ITEM) returning_values (:CANT, :UNIDAD, :FACTOR);
            if ((CANT > 0) or (arti = '.t')) then
                BEGIN
                INSERT INTO CONSOLIDADO_FALTANTES (COFA_ID, COFA_ITEM, COFA_TIPODES, COFA_TIPOORI, COFA_IDORI, COFA_ITEMORI, ARTI_COD, COFA_CANT, COFA_CODBAR, COFA_UNIDAD, COFA_FACTOR, COFA_OK, COFA_PRUNIT, COFA_DESCITE, COFA_BODEGA, COFA_DTOITE, COFA_LOTE, LOTE_VENCE, COFA_LISTA, CODE_OBSIT, CODE_REF)
                    VALUES (:IDCONS, :ITCONS, :tipdes,  :tipori, :idori, :item, :arti, :cant, :CODBAR, :UNIDAD, :FACTOR, 'N', :PRUNIT, :DESCITE, :BOD, :DTO, :LOTE, :LOTE_VENCE, :LISTA, :obs,  :REF);
                ITCONS = ITCONS + 1;
                END
            END
        END
    if (TIPORI = 32) then
        BEGIN
        FOR SELECT RVDE_ITEM, ARTI_COD, RVDE_CODBAR, RVDE_PRUNIT, SUBSTRING(RVDE_DESC FROM 1 FOR 60), BODE_COD, RVDE_DTOPORC, RVDE_LOTE, CAST('NOW' AS DATE), LIPR_COD, RVDE_OBS, RVDE_REFERENCIA
            FROM remisiones_venta_detalle
            WHERE REVT_ID = :IDORI ORDER BY RVDE_ITEM INTO :ITEM, :ARTI, :CODBAR, :PRUNIT, :DESCITE, :BOD, :DTO, :LOTE, :LOTE_VENCE, :LISTA, :obs, :ref DO
            BEGIN
            if (((CODBAR IS NULL) or (CODBAR = '')) AND (ARTI <> '')) then
                CODBAR = ARTI;
            EXECUTE PROCEDURE faltante(:TIPORI, :TIPDES, :IDORI, :ITEM) returning_values (:CANT, :UNIDAD, :FACTOR);
            if ((CANT > 0) or (arti = '.t')) then
                BEGIN
                INSERT INTO CONSOLIDADO_FALTANTES (COFA_ID, COFA_ITEM, COFA_TIPODES, COFA_TIPOORI, COFA_IDORI, COFA_ITEMORI, ARTI_COD, COFA_CANT, COFA_CODBAR, COFA_UNIDAD, COFA_FACTOR, COFA_OK, COFA_PRUNIT, COFA_DESCITE, COFA_BODEGA, COFA_DTOITE, COFA_LOTE, LOTE_VENCE, COFA_LISTA, CODE_OBSIT, CODE_REF)
                    VALUES (:IDCONS, :ITCONS, :tipdes,  :tipori, :idori, :item, :arti, :cant, :CODBAR, :UNIDAD, :FACTOR, 'N', :PRUNIT, :DESCITE, :BOD, :DTO, :LOTE, :LOTE_VENCE, :LISTA, :obs, :ref);
                ITCONS = ITCONS + 1;
                END
            END
        END
    if (TIPORI = 34) then
        BEGIN
        FOR SELECT PEDE_ITEM, ARTI_COD, PEDE_CODBAR, PEDE_PRUNIT, SUBSTRING(PEDE_DESC FROM 1 FOR 60), BODE_COD, PEDE_DTOPORC, NULL, CAST('NOW' AS DATE), D.LIPR_COD, PEDE_OBS, PEDE_REFERENCIA
            FROM PEDIDOS_DETALLE D, PEDIDOS P
            WHERE P.PEDI_ID = :IDORI AND P.pedi_id = D.pedi_id ORDER BY PEDE_ITEM
            INTO :ITEM, :ARTI, :CODBAR, :PRUNIT, :DESCITE, :BOD, :DTO, :LOTE, :LOTE_VENCE, :LISTA, :obs, :ref DO
            BEGIN
            if (((CODBAR IS NULL) or (CODBAR = '')) AND (ARTI <> '')) then
                CODBAR = ARTI;
            EXECUTE PROCEDURE faltante(:TIPORI, :TIPDES, :IDORI, :ITEM) returning_values (:CANT, :UNIDAD, :FACTOR);
            if ((CANT > 0) or (arti = '.t')) then
                BEGIN
                INSERT INTO CONSOLIDADO_FALTANTES (COFA_ID, COFA_ITEM, COFA_TIPODES, COFA_TIPOORI, COFA_IDORI, COFA_ITEMORI, ARTI_COD, COFA_CANT, COFA_CODBAR, COFA_UNIDAD, COFA_FACTOR, COFA_OK, COFA_PRUNIT, COFA_DESCITE, COFA_BODEGA, COFA_DTOITE, COFA_LOTE, LOTE_VENCE, COFA_LISTA, CODE_OBSIT, CODE_REF)
                    VALUES (:IDCONS, :ITCONS, :tipdes,  :tipori, :idori, :item, :arti, :cant, :CODBAR, :UNIDAD, :FACTOR, 'N', :PRUNIT, :DESCITE, :BOD, :DTO, :LOTE, :LOTE_VENCE, :LISTA, :obs, :ref);
                ITCONS = ITCONS + 1;
                END
            END
        END
    if (TIPORI = 35) then
        BEGIN
        FOR SELECT CTDE_ITEM, ARTI_COD, CTDE_CODBAR, CTDE_PRUNIT, SUBSTRING(CTDE_DESC FROM 1 FOR 60), P.BODE_COD, CTDE_DTOPORC, NULL, CAST('NOW' AS DATE), D.LIPR_COD, CTDE_OBS, CTDE_REFERENCIA
            FROM COTIZACIONES_DETALLE D, cotizaciones C, punto_venta P
            WHERE C.COTI_ID = :IDORI AND C.coti_id = D.coti_id AND C.ptvt_id = P.ptvt_id ORDER BY CTDE_ITEM INTO :ITEM, :ARTI, :CODBAR, :PRUNIT, :DESCITE, :BOD, :DTO, :LOTE, :LOTE_VENCE, :LISTA, :obs, :ref DO
            BEGIN
            if (((CODBAR IS NULL) or (CODBAR = '')) AND (ARTI <> '')) then
                CODBAR = ARTI;
            EXECUTE PROCEDURE faltante(:TIPORI, :TIPDES, :IDORI, :ITEM) returning_values (:CANT, :UNIDAD, :FACTOR);
            if ((CANT > 0) or (arti = '.t')) then
                BEGIN
                INSERT INTO CONSOLIDADO_FALTANTES (COFA_ID, COFA_ITEM, COFA_TIPODES, COFA_TIPOORI, COFA_IDORI, COFA_ITEMORI, ARTI_COD, COFA_CANT, COFA_CODBAR, COFA_UNIDAD, COFA_FACTOR, COFA_OK, COFA_PRUNIT, COFA_DESCITE, COFA_BODEGA, COFA_DTOITE, COFA_LOTE, LOTE_VENCE, COFA_LISTA, CODE_OBSIT, CODE_REF)
                    VALUES (:IDCONS, :ITCONS, :tipdes,  :tipori, :idori, :item, :arti, :cant, :CODBAR, :UNIDAD, :FACTOR, 'N', :PRUNIT, :DESCITE, :BOD, :DTO, :LOTE, :LOTE_VENCE, :LISTA, :obs, :ref);
                ITCONS = ITCONS + 1;
                END
            END
        END
    END /* FOR CONSOLIDE */
end

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE DOCCOMPRA_X_PROVEEDOR(
    NIT VARCHAR(20),
    TIPODOC INTEGER,
    TIPODES INTEGER,
    FECHA DATE)
RETURNS (
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(6),
    NROPROV VARCHAR(10),
    VALIDEZ INTEGER,
    ID INTEGER,
    FECDOC DATE,
    SUBTOTAL NUMERIC(18,2),
    IVA NUMERIC(18,2),
    CONSUMO NUMERIC(18,2),
    TOTAL NUMERIC(18,2))
AS
declare variable VENCE DATE;
declare variable ITEM INTEGER;
declare variable FALTA NUMERIC(18,4);
declare variable FALTAT NUMERIC(18,4);
declare variable UNIDAD VARCHAR(8);
declare variable FACTOR NUMERIC(18,4);
declare variable DIAS INTEGER;
declare variable usado CHAR(2);
declare variable NUMROWS INTEGER;
declare variable IDF INTEGER;
BEGIN
EXECUTE PROCEDURE lee_configuracion('COMPRAS','DOCUMENTOS','NUMERO DE DIAS MAXIMO PARA CRUZAR DOCUMENTO') returning_values (DIAS);
  if (TIPODOC = 21) then /* FACTURA */
    BEGIN
    FOR SELECT FACO_ID, PREF_PRE, FACO_NUMERO, FACO_FECHA, FACO_VENCE, FACO_NUMPROV
        FROM FACTURAS_COMPRA WHERE TERC_NIT = :NIT AND FACO_FECHA <= :FECHA AND (FACO_FECHA >= (:FECHA-:DIAS)) AND FACO_ANULADO = 'N'
        INTO :ID, :PREFIJO, :NUMERO, :FECDOC, :VENCE, :nroprov DO
        BEGIN
        EXECUTE PROCEDURE TOTAL_DOC_COMPRA(TIPODOC, ID) returning_values (SUBTOTAL, IVA, CONSUMO);
        TOTAL = SUBTOTAL + IVA + CONSUMO;
        VALIDEZ = VENCE - FECDOC;
        if (TIPODES <> 0) then
            BEGIN
            /* RECORRA LOS ITEMS PARA VER SI TODO ESTA DEVUELTO */
            FALTAT = 0;
            FOR SELECT FCDE_ITEM, (FCDE_CANT*FCDE_FACTOR-FCDE_DEVUELTO) FROM FACTURAS_COMPRAS_DETALLE
                WHERE FACO_ID = :ID ORDER BY FCDE_ITEM INTO :ITEM, :FALTA DO
                BEGIN
                if (tipodes <> 24) then
                    EXECUTE procedure FALTANTE(TIPODOC, TIPODES, :ID, :ITEM) returning_values (:FALTA, :unidad,  :FACTOR);
                FALTAT = FALTAT + FALTA;
                END
            if (FALTAT <> 0) then
                SUSPEND;
            END
        ELSE
            SUSPEND;
        END
    END
  if (TIPODOC = 22) then /* REMISION */
    BEGIN
    FOR SELECT REPR_ID, PREF_PRE, REPR_NUMERO, REPR_FECHA, 0, REPR_NUMPROV
        FROM remision_proveedor WHERE TERC_NIT = :NIT AND REPR_FECHA <= :FECHA AND (REPR_FECHA >= (:FECHA-:DIAS)) AND REPR_ANULADO = 'N'
        INTO :ID, :PREFIJO, :NUMERO, :FECDOC, :VALIDEZ, :nroprov DO
        BEGIN
        EXECUTE PROCEDURE TOTAL_DOC_COMPRA(TIPODOC, ID) returning_values (SUBTOTAL, IVA, CONSUMO);
        TOTAL = SUBTOTAL + IVA + CONSUMO;
        if (TIPODES <> 0) then
            BEGIN
            /* RECORRA LOS ITEMS PARA VER SI TODO ESTA DEVUELTO */
            FALTAT = 0;
            FOR SELECT RPVD_ITEM FROM remision_proveedor_det WHERE REPR_ID = :ID ORDER BY RPVD_ITEM INTO :ITEM DO
                BEGIN
                EXECUTE procedure FALTANTE(TIPODOC, TIPODES, :ID, :ITEM) returning_values (:FALTA, :unidad,  :FACTOR);
                FALTAT = FALTAT + FALTA;
                END
            if (FALTAT <> 0) then
                SUSPEND;
            END
        ELSE
            SUSPEND;
        END
    END
  if (TIPODOC = 24) then /* DEVOLUCION */
    BEGIN
    FOR SELECT DVCO_ID, PREF_PRE, DVCO_NUMERO, DVCO_FECHA, 0, DVCO_FACTID
        FROM DEVOLUCIONES_COMPRAS WHERE TERC_NIT = :NIT AND DVCO_FECHA <= :FECHA AND DVCO_ANULADO = 'N'
        INTO :ID, :PREFIJO, :NUMERO, :FECDOC, :VALIDEZ, :idf DO
        BEGIN
        nroprov = '';
        SELECT FACO_NUMPROV FROM facturas_compra WHERE FACO_ID = :idF INTO :nroprov;
        EXECUTE PROCEDURE TOTAL_DOC_COMPRA(TIPODOC, ID) returning_values (SUBTOTAL, IVA, CONSUMO);
        TOTAL = SUBTOTAL + IVA + CONSUMO;
        SUSPEND;
        END
    END
  if (TIPODOC = 23) then /* ORDEN */
    BEGIN
    FOR SELECT ORDC_ID, PREF_PRE, ORDC_NUMERO, ORDC_FECHA, ORDC_VALIDEZ, ''
        FROM ORDENES_COMPRA WHERE TERC_NIT = :NIT AND ORDC_FECHA <= :FECHA AND ((ORDC_FECHA+ORDC_VALIDEZ) >= :FECHA) AND ORDC_ANULADO = 'N'
        INTO :ID, :PREFIJO, :NUMERO, :FECDOC, :VALIDEZ, :nroprov DO
        BEGIN
        EXECUTE PROCEDURE TOTAL_DOC_COMPRA(TIPODOC, ID) returning_values (SUBTOTAL, IVA, CONSUMO);
        TOTAL = SUBTOTAL + IVA + CONSUMO;
        if (TIPODES <> 0) then
            BEGIN
            /* RECORRA LOS ITEMS PARA VER SI TODO ESTA USADO */
            FALTAT = 0;
            EXECUTE PROCEDURE lee_configuracion('COMPRAS','DOCUMENTOS','PERMITIR LLAMAR DOCUMENTOS PREVIAMENTE USADOS EN OTRO TIPO DE DOCUMENTO') returning_values (:USADO);
            if (USADO = 'NO') then
                SELECT COUNT(*) FROM consolide_faltantes WHERE CEFA_TIPOORI = 23 AND CEFA_IDORI = :ID AND CEFA_TIPODES <> :tipodes INTO :NUMROWS;
            ELSE
                NUMROWS = 0;
            if (NUMROWS = 0) then
                FOR SELECT OCDE_ITEM FROM ordenes_compra_detalle WHERE ORDC_ID = :ID ORDER BY OCDE_ITEM INTO :ITEM DO
                    BEGIN
                    EXECUTE procedure FALTANTE(TIPODOC, TIPODES, :ID, :ITEM) returning_values (:FALTA, :unidad,  :FACTOR);
                    FALTAT = FALTAT + FALTA;
                    END
            if (FALTAT <> 0) then
                SUSPEND;
            END
        ELSE
            SUSPEND;
        END
    END
  if (TIPODOC = 25) then /* COTIZACION */
    BEGIN
    FOR SELECT COPR_ID, PREF_PRE, COPR_NUMERO, COPR_FECHA, COPR_VALIDEZ, ''
        FROM cotizacion_PROVEEDOR WHERE TERC_NIT = :NIT AND COPR_FECHA <= :FECHA AND ((COPR_FECHA+COPR_VALIDEZ) >= :FECHA) AND COPR_ANULADO = 'N'
        INTO :ID, :PREFIJO, :NUMERO, :FECDOC, :VALIDEZ, :nroprov DO
        BEGIN
        EXECUTE PROCEDURE TOTAL_DOC_COMPRA(TIPODOC, ID) returning_values (SUBTOTAL, IVA, CONSUMO);
        TOTAL = SUBTOTAL + IVA + CONSUMO;
        if (TIPODES <> 0) then
            BEGIN
            /* RECORRA LOS ITEMS PARA VER SI TODO ESTA DEVUELTO */
            FALTAT = 0;
            EXECUTE PROCEDURE lee_configuracion('COMPRAS','DOCUMENTOS','PERMITIR LLAMAR DOCUMENTOS PREVIAMENTE USADOS EN OTRO TIPO DE DOCUMENTO') returning_values (:USADO);
            if (USADO = 'NO') then
                SELECT COUNT(*) FROM consolide_faltantes WHERE CEFA_TIPOORI = 25 AND CEFA_IDORI = :ID AND CEFA_TIPODES <> :tipodes INTO :NUMROWS;
            ELSE
                NUMROWS = 0;
            if (NUMROWS = 0) then
                FOR SELECT CPRD_ITEM FROM cotizaciones_proveedor_det WHERE COPR_ID = :ID ORDER BY CPRD_ITEM INTO :ITEM DO
                    BEGIN
                    EXECUTE procedure FALTANTE(TIPODOC, TIPODES, :ID, :ITEM) returning_values (:FALTA, :unidad,  :FACTOR);
                    FALTAT = FALTAT + FALTA;
                    END
            if (FALTAT <> 0) then
                SUSPEND;
            END
        ELSE
            SUSPEND;
        END
    END
END

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE DOCVENTAS_X_CLIENTE(
    NIT VARCHAR(20),
    TIPODOC INTEGER,
    TIPODES INTEGER,
    FECHA DATE,
    SUCURSAL VARCHAR(10))
RETURNS (
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(6),
    VALIDEZ INTEGER,
    VEND INTEGER,
    ID INTEGER,
    FECDOC DATE,
    SUBTOTAL NUMERIC(18,2),
    IVA NUMERIC(18,2),
    CONSUMO NUMERIC(18,2),
    TOTAL NUMERIC(18,2),
    SUCUR VARCHAR(10))
AS
declare variable VENCE DATE;
declare variable ITEM INTEGER;
declare variable FALTA NUMERIC(18,4);
declare variable FALTAT NUMERIC(18,4);
declare variable UNIDAD VARCHAR(8);
declare variable FACTOR NUMERIC(18,4);
declare variable DIAS INTEGER;
declare variable usado CHAR(2);
declare variable NUMROWS INTEGER;
declare variable TRAERCONTADO CHAR(2);
declare variable CONSOL INTEGER;
declare variable TIPOORI INTEGER;
declare variable OK CHAR(1);
BEGIN
EXECUTE PROCEDURE lee_configuracion('FACTURACION','DOCUMENTOS','NUMERO DE DIAS MAXIMO PARA CRUZAR DOCUMENTO') returning_values (DIAS);
EXECUTE PROCEDURE lee_configuracion('FACTURACION', 'DOCUMENTOS', 'TRAER DOCUMENTOS PENDIENTES DEL CLIENTE DE CONTADO EN DOCUMENTOS DE OTROS CLIENTES') returning_values (TRAERCONTADO);

if (TIPODOC = 31) then /* FACTURA */
    BEGIN
    FOR SELECT FACT_ID, PREF_PRE, FACT_NUMERO, FACT_FECHA, FACT_VENCE, FACT_SUCURSAL, VEND_COD, FACT_CONSOLIDA
        FROM FACTURAS
        WHERE TERC_NIT = :NIT AND FACT_FECHA <= :FECHA AND (FACT_FECHA >= (:FECHA - :DIAS)) AND
            FACT_ANULADO = 'N' AND ((FACT_SUCURSAL = :SUCURSAL) or (:SUCURSAL = 'Todas'))
        INTO :ID, :PREFIJO, :NUMERO, :FECDOC, :VENCE, :SUCUR, :VEND, :CONSOL DO
        BEGIN
        EXECUTE PROCEDURE TOTAL_DOC_VENTAS(TIPODOC, ID) returning_values (SUBTOTAL, IVA, CONSUMO);
        TOTAL = SUBTOTAL + IVA + CONSUMO;
        VALIDEZ = VENCE - FECDOC;
        if (TIPODES = 33) then
            BEGIN
            /* VERIFIQUE SI HAY PENDIENTES */
            SELECT SUM(FADE_CANT * FADE_FACTOR - FADE_DEVUELTO) FROM FACTURAS_DETALLE WHERE FACT_ID = :ID and substring(arti_cod from 1 FOR 2) <> '.t' and FADE_cant > 0 INTO :FALTA;
            if (FALTA <> 0) then
                suspend;
            END
        ELSE
            BEGIN
            /* VERIFIQUE QUE NO ESTE HECHA CON BASE EN UN DOCUMENTO DE ORIGEN */
            FALTAT = 0;
            OK = 'N';
            if ((CONSOL <> 0) AND (CONSOL IS NOT NULL)) then
                BEGIN
                SELECT MAX(COFA_TIPOORI) FROM consolidado_faltantes WHERE COFA_ID = :CONSOL AND COFA_OK = 'S' INTO :tipoori;
                if (TIPOORI <> TIPODES) then
                    OK = 'S';
                END
            ELSE
                OK = 'S';
            if (OK = 'S') then
                BEGIN
                /* RECORRA LOS ITEMS PARA VER SI TODO ESTA USADO */
                FOR SELECT FADE_ITEM FROM FACTURAS_DETALLE WHERE FACT_ID = :ID and substring(arti_cod from 1 FOR 2) <> '.t' ORDER BY FADE_ITEM INTO :ITEM DO
                    BEGIN
                    EXECUTE procedure FALTANTE(TIPODOC, :TIPODES, :ID, :ITEM) returning_values (:FALTA, :UNIDAD, :FACTOR);
                    FALTAT = FALTAT + FALTA;
                    END
                if (FALTAT <> 0) then
                    SUSPEND;
                END
            END
        END
    END
  if (TIPODOC = 32) then /* REMISION */
    BEGIN
    FOR SELECT REVT_ID, PREF_PRE, REVT_NUMERO, REVT_FECHA, 0, REVT_SUCURSAL, VEND_COD, REVT_CONSOLIDA
        FROM remisiones_venta
        WHERE TERC_NIT = :NIT AND REVT_FECHA <= :FECHA AND (REVT_FECHA >= (:FECHA - :DIAS)) AND
            REVT_ANULADO = 'N' AND ((REVT_SUCURSAL = :SUCURSAL) or (:SUCURSAL = 'Todas'))
        INTO :ID, :PREFIJO, :NUMERO, :FECDOC, :VALIDEZ, :SUCUR, :VEND, :CONSOL DO
        BEGIN
        EXECUTE PROCEDURE TOTAL_DOC_VENTAS(TIPODOC, ID) returning_values (SUBTOTAL, IVA, CONSUMO);
        TOTAL = SUBTOTAL + IVA + CONSUMO;
        if (TIPODES <> 0) then
            BEGIN
            /* VERIFIQUE QUE NO ESTE HECHA CON BASE EN UN DOCUMENTO DE ORIGEN */
            FALTAT = 0;
            OK = 'N';
            if ((CONSOL <> 0) AND (CONSOL IS NOT NULL)) then
                BEGIN
                SELECT MAX(COFA_TIPOORI) FROM consolidado_faltantes WHERE COFA_ID = :CONSOL AND COFA_OK = 'S' INTO :tipoori;
                if (TIPOORI <> TIPODES) then
                    OK = 'S';
                END
            ELSE
                OK = 'S';
            if (OK = 'S') then
                BEGIN
                /* RECORRA LOS ITEMS PARA VER SI TODO ESTA USADO */
                FOR SELECT RVDE_ITEM FROM REMISIONES_VENTA_DETALLE WHERE REVT_ID = :ID ORDER BY RVDE_ITEM INTO :ITEM DO
                    BEGIN
                    EXECUTE procedure FALTANTE(TIPODOC, :TIPODES, :ID, :ITEM) returning_values (:FALTA, :UNIDAD, :FACTOR);
                    FALTAT = FALTAT + FALTA;
                    END
                if (FALTAT <> 0) then
                    SUSPEND;
                END
            END
        END
    END
  if (TIPODOC = 33) then /* DEVOLUCION */
    BEGIN
    FOR SELECT DEVT_ID, PREF_PRE, DEVT_NUMERO, DEVT_FECHA, 0, DEVT_SUCURSAL, VEND_COD
        FROM DEVOLUCIONES_VENTAS
        WHERE TERC_NIT = :NIT AND DEVT_FECHA <= :FECHA AND DEVT_ANULADO = 'N' AND ((DEVT_SUCURSAL = :SUCURSAL) or (:SUCURSAL = 'Todas'))
        INTO :ID, :PREFIJO, :NUMERO, :FECDOC, :VALIDEZ, :SUCUR, :VEND DO
        BEGIN
        EXECUTE PROCEDURE TOTAL_DOC_VENTAS(TIPODOC, ID) returning_values (SUBTOTAL, IVA, CONSUMO);
        TOTAL = SUBTOTAL + IVA + CONSUMO;
        SUSPEND;
        END
    END
  if (TIPODOC = 34) then /* PEDIDO */
    BEGIN
    FOR SELECT PEDI_ID, PREF_PRE, PEDI_NUMERO, PEDI_FECHA, PEDI_VALIDEZ, PEDI_SUCURSAL, VEND_COD
        FROM PEDIDOS
        WHERE ((TERC_NIT = :NIT) OR ((:traercontado = 'SI') AND (TERC_NIT IN (SELECT TERC_NIT FROM PUNTO_VENTA))))
        AND PEDI_FECHA <= :FECHA AND PEDI_FECHA+PEDI_VALIDEZ >= :FECHA AND PEDI_ANULADO = 'N' AND ((PEDI_SUCURSAL = :SUCURSAL) or (:SUCURSAL = 'Todas'))
        INTO :ID, :PREFIJO, :NUMERO, :FECDOC, :VALIDEZ, :SUCUR, :VEND DO
        BEGIN
        EXECUTE PROCEDURE TOTAL_DOC_VENTAS(TIPODOC, ID) returning_values (SUBTOTAL, IVA, CONSUMO);
        TOTAL = SUBTOTAL + IVA + CONSUMO;
        if (TIPODES <> 0) then
            BEGIN
            /* RECORRA LOS ITEMS PARA VER SI TODO ESTA USADO */
            FALTAT = 0;
            EXECUTE PROCEDURE lee_configuracion('FACTURACION','DOCUMENTOS','PERMITIR LLAMAR DOCUMENTOS PREVIAMENTE USADOS EN OTRO TIPO DE DOCUMENTO') returning_values (:USADO);
            if (USADO = 'NO') then
                SELECT COUNT(*) FROM consolide_faltantes WHERE CEFA_TIPOORI = 34 AND CEFA_IDORI = :ID AND CEFA_TIPODES <> :tipodes INTO :NUMROWS;
            ELSE
                NUMROWS = 0;
            if (NUMROWS = 0) then
                FOR SELECT PEDE_ITEM FROM PEDIDOS_DETALLE WHERE PEDI_ID = :ID ORDER BY PEDE_ITEM INTO :ITEM DO
                    BEGIN
                    EXECUTE procedure FALTANTE(TIPODOC, :TIPODES, :ID, :ITEM) returning_values (:FALTA, :UNIDAD, :FACTOR);
                    FALTAT = FALTAT + FALTA;
                    END
            if (FALTAT <> 0) then
                SUSPEND;
            END
        ELSE
            SUSPEND;
        END
    END
  if (TIPODOC = 35) then /* COTIZACION */
    BEGIN
    FOR SELECT COTI_ID, PREF_PRE, COTI_NUMERO, COTI_FECHA, COTI_VALIDEZ, COTI_SUCURSAL, VEND_COD
        FROM cotizaciones
        WHERE ((TERC_NIT = :NIT) OR ((:traercontado = 'SI') AND (TERC_NIT IN (SELECT TERC_NIT FROM PUNTO_VENTA))))
        AND COTI_FECHA <= :FECHA AND COTI_FECHA+COTI_VALIDEZ >= :FECHA AND COTI_ANULADO = 'N'
        AND ((COTI_SUCURSAL = :SUCURSAL) or (:SUCURSAL = 'Todas'))
        INTO :ID, :PREFIJO, :NUMERO, :FECDOC, :VALIDEZ, :SUCUR, :VEND DO
        BEGIN
        EXECUTE PROCEDURE TOTAL_DOC_VENTAS(TIPODOC, ID) returning_values (SUBTOTAL, IVA, CONSUMO);
        TOTAL = SUBTOTAL + IVA + CONSUMO;
        if (TIPODES <> 0) then
            BEGIN
            /* RECORRA LOS ITEMS PARA VER SI TODO ESTA USADO */
            FALTAT = 0;
            EXECUTE PROCEDURE lee_configuracion('FACTURACION','DOCUMENTOS','PERMITIR LLAMAR DOCUMENTOS PREVIAMENTE USADOS EN OTRO TIPO DE DOCUMENTO') returning_values (:USADO);
            if (USADO = 'NO') then
                SELECT COUNT(*) FROM consolide_faltantes WHERE CEFA_TIPOORI = 35 AND CEFA_IDORI = :ID AND CEFA_TIPODES <> :tipodes INTO :NUMROWS;
            ELSE
                NUMROWS = 0;
            if (NUMROWS = 0) then
                FOR SELECT CTDE_ITEM FROM COTIZACIONES_DETALLE WHERE COTI_ID = :ID ORDER BY CTDE_ITEM INTO :ITEM DO
                    BEGIN
                    EXECUTE procedure FALTANTE(TIPODOC, :TIPODES, :ID, :ITEM) returning_values (:FALTA, :UNIDAD, :FACTOR);
                    FALTAT = FALTAT + FALTA;
                    END
            if (FALTAT <> 0) then
                SUSPEND;
            END
        ELSE
            SUSPEND;
        END
    END
END

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE EXISTENCIAS_COMPRAS(
    ARTICULO VARCHAR(15),
    FECHA DATE,
    UNIDAD VARCHAR(8))
RETURNS (
    BODEGA VARCHAR(2),
    EXISTENCIA NUMERIC(18,2),
    RESERVADO NUMERIC(18,2),
    ORDENADO NUMERIC(18,2),
    PROMEDIO NUMERIC(18,2),
    VENTAMES NUMERIC(18,2),
    FECHACMP DATE,
    CANTCMP NUMERIC(18,2),
    DIAS INTEGER,
    SUGERIDO NUMERIC(18,2),
    STAND VARCHAR(20))
AS
declare variable FACTOR NUMERIC(15,4);
declare variable ORDENC NUMERIC(18,4);
declare variable PEDIDO NUMERIC(18,4);
declare variable ITEM INTEGER;
declare variable ID INTEGER;
declare variable UND VARCHAR(8);
declare variable CANT NUMERIC(18,4);
declare variable FACTOR2 NUMERIC(18,4);
declare variable fecini DATE;
declare variable FECHAAUX VARCHAR(10);
declare variable AGENCIA INTEGER;
declare variable DEVMES NUMERIC(18,2);
declare variable MFAC INTEGER;
declare variable MDEV INTEGER;
declare variable IVAF NUMERIC(18,2);
declare variable IVAD NUMERIC(18,2);
declare variable DIA_ART VARCHAR(2) CHARACTER SET NONE;
declare variable DIASC VARCHAR(255);
declare variable PEDAUTO CHAR(2);
declare variable SALIDAS NUMERIC(18,4);
BEGIN
  for select bode_cod, SUCU_ID from bodega into :bodega, :agencia
    do
    begin
    execute procedure saldo_inventario (:articulo, :bodega, :fecha) returning_values (:Existencia);
    EXECUTE PROCEDURE FACTOR_UNIDAD_CANT(:ARTICULO, :UNIDAD) returning_values (:FACTOR);
    if (FACTOR <> 0) then
        EXISTENCIA = EXISTENCIA / FACTOR;
    else
        EXISTENCIA = 0;
    STAND = '';
    SELECT STAND_COD FROM STANDS WHERE ARTI_COD = :ARTICULO AND STAND_BODEGA = :BODEGA INTO :stand;
    EXECUTE PROCEDURE promedio_salidas_articulo (:ARTICULO, :FECHA, :BODEGA) returning_values (:PROMEDIO, :SALIDAS);
    EXECUTE PROCEDURE lee_configuracion ('INVENTARIO', 'EXISTENCIAS', 'PROMEDIAR LAS SALIDAS DEL INVENTARIO CON EL NUMERO DE DIAS ASIGNADO A CADA ARTICULO') returning_values (:DIA_ART);
    if (DIA_ART = 'NO') then
        BEGIN
        EXECUTE PROCEDURE lee_configuracion ('INVENTARIO', 'EXISTENCIAS', 'NUMERO DE DIAS PARA PROMEDIO DE SALIDAS POR ARTICULO') returning_values (DIASC);
        DIAS = CAST(DIASC AS INTEGER);
        END
    ELSE
        SELECT ARTI_DIAS FROM ARTICULO WHERE ARTI_COD = :ARTICULO INTO :DIAS;
    if (DIAS is null) then
        DIAS = 0;
    PROMEDIO = DIAS * PROMEDIO;
    if (FACTOR <> 0) then
        PROMEDIO = PROMEDIO / FACTOR;
    SUGERIDO = PROMEDIO - EXISTENCIA;
    SELECT SUM(ORID_ENTREGAR)
      FROM ORDENINVENTARIO_DETALLE OD, ordenes_inventario O
      WHERE O.ORIN_ID = OD.ORIN_ID AND ARTI_COD = :ARTICULO AND ORIN_FECHA <= :FECHA AND ORIN_FECLLEGA >= :FECHA AND ORID_ANULADO = 'N' AND OD.BODE_COD = :BODEGA
      INTO :ORDENADO;
    if (ORDENADO IS NULL) then
        ORDENADO = 0;
    ORDENC = 0;
    FOR SELECT O.ORDC_ID, OCDE_ITEM, OCDE_CANT * OCDE_FACTOR
        FROM ORDENES_COMPRA O, ORDENES_COMPRA_DETALLE OD
        WHERE O.ORDC_ID = OD.ORDC_ID AND OD.ARTI_COD = :ARTICULO AND (ORDC_FECHA+ORDC_VALIDEZ) >= :FECHA AND ORDC_FECHA <= :FECHA AND OCDE_ANULADO = 'N' AND OD.BODE_COD = :BODEGA
        INTO :ID, :ITEM, :CANT
        do
        BEGIN
        EXECUTE PROCEDURE FALTANTE(23, 21, ID, ITEM) returning_values (PEDIDO, UND, FACTOR2);
        if (PEDIDO * FACTOR2 = CANT) then /* SI NO SE HA FACTURADO MIRE A VER SI SE REMISIONO */
            EXECUTE PROCEDURE FALTANTE(23, 22, ID, ITEM) returning_values (PEDIDO, UND, FACTOR2);
        if (PEDIDO IS NULL) then
            PEDIDO = 0;
        ORDENC = ORDENC + PEDIDO * FACTOR2;
        END
    ORDENADO = ORDENADO + ORDENC;
    if (FACTOR <> 0) then
        ORDENADO = ORDENADO / FACTOR;
    SELECT SUM(RSDE_LIBERAR)
      FROM RESERVAS_DETALLE RD, RESERVAS R
      WHERE R.RESE_ID = RD.RESE_ID AND ARTI_COD = :ARTICULO AND RESE_FECHA <= :FECHA AND RESE_VENCE >= :FECHA AND RD.BODE_COD = :BODEGA AND RSDE_ANULADO = 'N'
      INTO :RESERVADO;
    if (RESERVADO IS NULL) then
        RESERVADO = 0;
    PEDIDO = 0;
    FOR SELECT P.PEDI_ID, PEDE_ITEM, PEDE_CANT * PEDE_FACTOR
        FROM PEDIDOS P, PEDIDOS_DETALLE PD
        WHERE P.PEDI_ID = PD.PEDI_ID AND PD.ARTI_COD = :ARTICULO AND (PEDI_FECHA+PEDI_VALIDEZ) >= :FECHA AND PEDI_FECHA <= :FECHA AND PEDE_ANULADO = 'N' AND BODE_COD = :BODEGA
        INTO :ID, :ITEM, :CANT
        do
        BEGIN
        EXECUTE PROCEDURE FALTANTE(34, 31, ID, ITEM) returning_values (ORDENC, UND, FACTOR2);
        EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION', 'FACTURAS', 'GENERAR PEDIDO AUTOMATICAMENTE CON LA FACTURA') returning_values (pedauto);
        if ((ORDENC * FACTOR2 = CANT) or (PEDAUTO = 'SI')) then /* SI NO SE HA FACTURADO MIRE A VER SI SE REMISIONO */
            EXECUTE PROCEDURE FALTANTE(34, 32, ID, ITEM) returning_values (ORDENC, UND, FACTOR2);
        if (ORDENC IS NULL) then
            ORDENC = 0;
        PEDIDO = PEDIDO + ORDENC * FACTOR2;
        END
    RESERVADO = RESERVADO + PEDIDO;
    if (FACTOR <> 0) then
        RESERVADO = RESERVADO / FACTOR;
    /* VENTAS MES */
    FECHAAUX = CAST (FECHA AS VARCHAR(10));
    FECHAAUX = SUBSTR(FECHAAUX, 1, 7) || '/01';
    FECINI = CAST (FECHAAUX AS DATE);
    EXECUTE PROCEDURE ventas_articulo (:ARTICULO, :FECINI, :FECHA, :agencia) returning_values (:ventames, :mfac, :devmes, :mdev, :ivaf, :ivad);
    ventames = ventames - devmes;
    if (FACTOR <> 0) then
        ventames = ventames / FACTOR;
    /* FECHA COMPRA */
    fechacmp = null;
    cantcmp = 0;
    SELECT FIRST 1 FACO_FECHA, FCDE_CANT * FCDE_FACTOR FROM FACTURAS_COMPRA F, FACTURAS_COMPRAS_DETALLE D
        WHERE F.FACO_ID = D.faco_id AND D.ARTI_COD = :articulo AND FACO_FECHA <= :FECHA AND D.bode_cod = :BODEGA
        ORDER BY FACO_FECHA DESC, F.FACO_ID DESC
        INTO :fechacmp, :cantcmp;
    SUSPEND;
    end
END

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE EXISTENCIAS_DESDE_HASTA(
    FECHA DATE,
    ARTINI VARCHAR(20),
    ARTFIN VARCHAR(20),
    GRPINI VARCHAR(3),
    GRPFIN VARCHAR(3),
    BODINI VARCHAR(2),
    BODFIN VARCHAR(2),
    ORDEN CHAR(1),
    AGRUPA CHAR(1),
    DETALLE CHAR(1),
    RESERVA CHAR(1),
    ENPESO CHAR(1),
    MASIVA CHAR(1),
    SUCURSAL INTEGER)
RETURNS (
    CANT NUMERIC(18,4),
    COSTO NUMERIC(18,2),
    COSTO_LOTE NUMERIC(18,2),
    CODIGO VARCHAR(15),
    NOMBRE VARCHAR(60),
    UNIDAD VARCHAR(8),
    STAND VARCHAR(20),
    CODGRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    CODSUBG VARCHAR(3),
    NOMSUBG VARCHAR(30),
    CODMARC VARCHAR(3),
    NOMMARC VARCHAR(30),
    CODBOD VARCHAR(2),
    LOTE VARCHAR(15),
    NOMBOD VARCHAR(30),
    COSTOTOT NUMERIC(18,2),
    COSTOIVA NUMERIC(18,2),
    ULTCOSTO NUMERIC(18,2),
    FECHACOSTO DATE,
    CONSUMO NUMERIC(18,2),
    RESERVADO NUMERIC(18,4),
    ORDENADO NUMERIC(18,4),
    IVA NUMERIC(9,2),
    IVAMONTO NUMERIC(18,2),
    PESOUNIT NUMERIC(18,4),
    PESOTOTAL NUMERIC(18,4),
    PRECIO NUMERIC(18,2),
    CODBAR VARCHAR(20))
AS
declare variable exist char(1);
declare variable codini varchar(20);
declare variable codfin varchar(20);
declare variable desini varchar(20);
declare variable desfin varchar(20);
declare variable ordenc numeric(18,4);
declare variable pedido numeric(18,4);
declare variable ok char(1);
declare variable id integer;
declare variable item integer;
declare variable und varchar(8);
declare variable factor numeric(18,4);
declare variable cant2 numeric(18,4);
declare variable PEDAUTO CHAR(2);
DECLARE VARIABLE LISTA INTEGER;
BEGIN
EXECUTE PROCEDURE lee_configuracion ('FACTURACION','FACTURAS', 'CODIGO DE LA LISTA DE PRECIOS A MOSTRAR EN ARTICULOS') returning_values (:LISTA);
if (ORDEN = 'C') then
    BEGIN
    CODINI = ARTINI;
    CODFIN = ARTFIN;
    DESINI = '';
    DESFIN = 'zz';
    END
ELSE
    BEGIN
    DESINI = ARTINI;
    DESFIN = ARTFIN;
    CODINI = '';
    CODFIN = 'zz';
    END
EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION', 'FACTURAS', 'GENERAR PEDIDO AUTOMATICAMENTE CON LA FACTURA') returning_values (pedauto);
if (DETALLE = 'B') then
  BEGIN
  FOR SELECT ARTI_COD, ARTI_DES, ARTI_UNIDAD, ARTI_EXIST, TAIV_PORC, A.GRUP_COD, A.SUBG_COD, A.MARC_COD, BODE_COD, BODE_NOM, ARTI_CONSUMO, ARTI_PESO/1000
      FROM ARTICULO A, BODEGA B, TARIFA_IVA T
      WHERE ARTI_COD >= :CODINI AND ARTI_COD <= :CODFIN AND ARTI_DES >= :DESINI AND ARTI_DES <= :DESFIN AND ESAR_COD <> 'I' AND BODE_COD >= :BODINI AND
      BODE_COD <= :BODFIN AND ((SUCU_ID = :SUCURSAL) or (:SUCURSAL = 0)) AND A.TAIV_COD = T.TAIV_COD
      INTO :CODIGO, :NOMBRE, :UNIDAD, :EXIST, :IVA, :CODGRUPO, :CODSUBG, :CODMARC, :CODBOD, :NOMBOD, :CONSUMO, :pesounit
      DO
        BEGIN
        STAND = '';
        OK = 'N';
        if (AGRUPA = 'G') then
            BEGIN
            if ((CODGRUPO >= GRPINI) AND (CODGRUPO <= GRPFIN)) then
                OK = 'S';
            end
        ELSE
            if (AGRUPA = 'M') then
                BEGIN
                if ((CODMARC >= GRPINI) AND (CODMARC <= GRPFIN)) then
                    OK = 'S';
                END
        if (OK = 'S') then
            BEGIN
            NOMGRUPO = '';
            NOMMARC = '';
            NOMSUBG = '';
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            SELECT MAX(COBA_COD) FROM BARRAS_ARTICULO WHERE ARTI_COD = :codigo AND COBA_UNIDAD = :unidad INTO :codbar;
            if (CODBAR IS NULL) then
                CODBAR = CODIGO;
            if (EXIST <> 'N') then
                BEGIN
                SELECT STAND_COD FROM STANDS WHERE ARTI_COD = :CODIGO AND STAND_BODEGA = :CODBOD INTO :STAND;
                EXECUTE PROCEDURE SALDO_INICIAL_INVENTARIO(CODIGO, FECHA, :CODBOD) returning_values (CANT);
                EXECUTE PROCEDURE costo_promedio_y_ultimo_unidad(CODIGO, FECHA, UNIDAD) returning_values (COSTO, ULTCOSTO);
                SELECT MAX(MVAR_FECHA) FROM MOVIMIENTO_ARTICULO WHERE ARTI_COD = :CODIGO AND MVAR_ENTRADA = 'S' AND MVAR_FECHA <= :FECHA INTO :FECHACOSTO;
                COSTOTOT = :CANT * :COSTO;
                IVAMONTO = COSTOTOT /100 * IVA;
                COSTOIVA = COSTOTOT;
                if (MASIVA = 'S') then
                    BEGIN
                    COSTOIVA = COSTOTOT + IVAMONTO;
                    COSTO = COSTO * (100 + :IVA) / 100 + :CONSUMO;
                    END
                CONSUMO = CONSUMO * CANT;
                COSTOIVA = COSTOIVA + CONSUMO;
                if (RESERVA = 'S') then
                    BEGIN
                    SELECT SUM(ORID_ENTREGAR)
                        FROM ORDENINVENTARIO_DETALLE OD, ordenes_inventario O
                        WHERE O.ORIN_ID = OD.ORIN_ID AND ARTI_COD = :CODIGO AND ORIN_FECHA <= :FECHA AND ORIN_FECLLEGA >= :FECHA AND ORID_ANULADO = 'N' AND OD.BODE_COD = :CODBOD
                        INTO :ORDENADO;
                    if (ORDENADO IS NULL) then
                        ORDENADO = 0;
                    ORDENC = 0;
                    FOR SELECT O.ORDC_ID, OCDE_ITEM, OCDE_CANT * OCDE_FACTOR
                        FROM ORDENES_COMPRA O, ORDENES_COMPRA_DETALLE OD
                        WHERE O.ORDC_ID = OD.ORDC_ID AND OD.ARTI_COD = :CODIGO AND ORDC_VENCE >= :FECHA AND ORDC_FECHA <= :FECHA AND OCDE_ANULADO = 'N' AND OD.BODE_COD = :CODBOD
                        INTO :ID, :ITEM, :CANT2
                        do
                        BEGIN
                        EXECUTE PROCEDURE FALTANTE(23, 21, ID, ITEM) returning_values (PEDIDO, UND, FACTOR);
                        if (PEDIDO * FACTOR = CANT2) then /* SI NO SE HA FACTURADO MIRE A VER SI SE REMISIONO */
                            EXECUTE PROCEDURE FALTANTE(23, 22, ID, ITEM) returning_values (PEDIDO, UND, FACTOR);
                        if (PEDIDO IS NULL) then
                            PEDIDO = 0;
                        ORDENC = ORDENC + PEDIDO * FACTOR;
                        END
                    ORDENADO = ORDENADO + ORDENC;
                    SELECT SUM(RSDE_LIBERAR)
                        FROM RESERVAS_DETALLE RD, RESERVAS R
                        WHERE R.RESE_ID = RD.RESE_ID AND ARTI_COD = :CODIGO AND RESE_FECHA <= :FECHA AND RESE_VENCE >= :FECHA AND RD.BODE_COD = :CODBOD AND RSDE_ANULADO = 'N'
                        INTO :RESERVADO;
                    if (RESERVADO IS NULL) then
                        RESERVADO = 0;
                    PEDIDO = 0;
                    FOR SELECT P.PEDI_ID, PEDE_ITEM, PEDE_CANT * PEDE_FACTOR
                        FROM PEDIDOS P, PEDIDOS_DETALLE PD
                        WHERE P.PEDI_ID = PD.PEDI_ID AND PD.ARTI_COD = :CODIGO AND PEDI_VENCE >= :FECHA AND PEDI_FECHA <= :FECHA AND PEDE_ANULADO = 'N' AND BODE_COD = :CODBOD
                        INTO :ID, :ITEM, :CANT2
                        do
                        BEGIN
                        EXECUTE PROCEDURE FALTANTE(34, 31, ID, ITEM) returning_values (ORDENC, UND, FACTOR);
                        if ((ORDENC * FACTOR = CANT2) or (PEDAUTO = 'SI')) then /* SI NO SE HA FACTURADO MIRE A VER SI SE REMISIONO */
                            EXECUTE PROCEDURE FALTANTE(34, 32, ID, ITEM) returning_values (ORDENC, UND, FACTOR);
                        if (ORDENC IS NULL) then
                            ORDENC = 0;
                        PEDIDO = PEDIDO + ORDENC * FACTOR;
                        END
                    RESERVADO = RESERVADO + PEDIDO;
                    END
                ELSE
                    BEGIN
                    RESERVADO = 0;
                    ORDENADO = 0;
                    END
                if (LISTA > 0) then
                    SELECT prar_fijo FROM precios_articulo WHERE arti_cod = :CODIGO and lipr_cod = :LISTA INTO :PRECIO;
                if (ENPESO = 'S') then
                    BEGIN
                    if (pesounit IS NULL) then
                        pesounit = 0;
                    if (PESOUNIT <> 0) then
                        BEGIN
                        pesototal = PESOUNIT * cant;
                        SUSPEND;
                        END
                    END
                ELSE
                    SUSPEND;
                END
            END
        END
  END

if (DETALLE = 'L') then
  BEGIN
  FOR SELECT A.ARTI_COD, ARTI_DES, ARTI_UNIDAD, ARTI_EXIST, TAIV_PORC, A.GRUP_COD, A.SUBG_COD, A.MARC_COD, L.lote_nro, L.lote_nro||' - '||L.lote_vence, ARTI_CONSUMO,l.bode_cod, L.lote_saldo,l.lote_costo, ARTI_PESO/1000
      FROM ARTICULO A, LOTES l, TARIFA_IVA T
      WHERE A.ARTI_COD >= '0' AND A.ARTI_COD <= 'zz' AND ARTI_DES >= '' AND ARTI_DES <= 'zz' AND ESAR_COD <> 'I' AND A.TAIV_COD = T.TAIV_COD and a.arti_cod = l.arti_cod
      INTO :CODIGO, :NOMBRE, :UNIDAD, :EXIST, :IVA, :CODGRUPO, :CODSUBG, :CODMARC, :LOTE, :NOMBOD, :CONSUMO, :codbod, :cant, :costo_lote, :pesounit
      DO
        BEGIN
        OK = 'N';
        if (AGRUPA = 'G') then
            BEGIN
            if ((CODGRUPO >= GRPINI) AND (CODGRUPO <= GRPFIN)) then
                OK = 'S';
            end
        ELSE
            if (AGRUPA = 'M') then
                BEGIN
                if ((CODMARC >= GRPINI) AND (CODMARC <= GRPFIN)) then
                    OK = 'S';
                END
        if (OK = 'S') then
            BEGIN
            NOMGRUPO = '';
            NOMMARC = '';
            NOMSUBG = '';
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            SELECT MAX(COBA_COD) FROM BARRAS_ARTICULO WHERE ARTI_COD = :codigo AND COBA_UNIDAD = :unidad INTO :codbar;
            if (CODBAR IS NULL) then
                CODBAR = CODIGO;

            if (EXIST <> 'N') then
                BEGIN
                EXECUTE PROCEDURE COSTO_PROMEDIO_UNIDAD(CODIGO, FECHA, UNIDAD) returning_values (COSTO);
                EXECUTE PROCEDURE ULTIMO_COSTO(CODIGO, FECHA, UNIDAD) returning_values (ULTCOSTO);
                SELECT MAX(MVAR_FECHA) FROM MOVIMIENTO_ARTICULO WHERE ARTI_COD = :CODIGO AND MVAR_ENTRADA = 'S' AND MVAR_FECHA <= :FECHA INTO :FECHACOSTO;
                COSTOTOT = :CANT * :COSTO;
                IVAMONTO = COSTOTOT /100 * IVA;
                COSTOIVA = COSTOTOT;
                if (MASIVA = 'S') then
                    BEGIN
                    COSTOIVA = COSTOTOT + IVAMONTO;
                    COSTO = COSTO * (100 + :IVA) / 100 + :CONSUMO;
                    END
                CONSUMO = CONSUMO * CANT;
                COSTOIVA = COSTOIVA + CONSUMO;
                if (RESERVA = 'S') then
                    BEGIN
                    SELECT SUM(ORID_ENTREGAR)
                        FROM ORDENINVENTARIO_DETALLE OD, ordenes_inventario O
                        WHERE O.ORIN_ID = OD.ORIN_ID AND ARTI_COD = :CODIGO AND ORIN_FECHA <= :FECHA AND ORIN_FECLLEGA >= :FECHA AND ORID_ANULADO = 'N'
                        INTO :ORDENADO;
                    if (ORDENADO IS NULL) then
                        ORDENADO = 0;
                    ORDENC = 0;
                    FOR SELECT O.ORDC_ID, OCDE_ITEM, OCDE_CANT * OCDE_FACTOR
                        FROM ORDENES_COMPRA O, ORDENES_COMPRA_DETALLE OD
                        WHERE O.ORDC_ID = OD.ORDC_ID AND OD.ARTI_COD = :CODIGO AND ORDC_VENCE >= :FECHA AND ORDC_FECHA <= :FECHA AND OCDE_ANULADO = 'N'
                        INTO :ID, :ITEM, :CANT2
                        do
                        BEGIN
                        EXECUTE PROCEDURE FALTANTE(23, 21, ID, ITEM) returning_values (PEDIDO, UND, FACTOR);
                        if (PEDIDO * FACTOR = CANT2) then /* SI NO SE HA FACTURADO MIRE A VER SI SE REMISIONO */
                            EXECUTE PROCEDURE FALTANTE(23, 22, ID, ITEM) returning_values (PEDIDO, UND, FACTOR);
                        if (PEDIDO IS NULL) then
                            PEDIDO = 0;
                        ORDENC = ORDENC + PEDIDO * FACTOR;
                        END
                    ORDENADO = ORDENADO + ORDENC;
                    SELECT SUM(RSDE_LIBERAR)
                        FROM RESERVAS_DETALLE RD, RESERVAS R
                        WHERE R.RESE_ID = RD.RESE_ID AND ARTI_COD = :CODIGO AND RESE_FECHA <= :FECHA AND RESE_VENCE >= :FECHA AND RSDE_ANULADO = 'N'
                        INTO :RESERVADO;
                    if (RESERVADO IS NULL) then
                        RESERVADO = 0;
                    PEDIDO = 0;
                    FOR SELECT P.PEDI_ID, PEDE_ITEM, PEDE_CANT * PEDE_FACTOR
                        FROM PEDIDOS P, PEDIDOS_DETALLE PD
                        WHERE P.PEDI_ID = PD.PEDI_ID AND PD.ARTI_COD = :CODIGO AND PEDI_VENCE >= :FECHA AND PEDI_FECHA <= :FECHA AND PEDE_ANULADO = 'N'
                        INTO :ID, :ITEM, :CANT2
                        do
                        BEGIN
                        EXECUTE PROCEDURE FALTANTE(34, 31, ID, ITEM) returning_values (ORDENC, UND, FACTOR);
                        if ((ORDENC * FACTOR = CANT2) or (PEDAUTO = 'SI')) then /* SI NO SE HA FACTURADO MIRE A VER SI SE REMISIONO */
                            EXECUTE PROCEDURE FALTANTE(34, 32, ID, ITEM) returning_values (ORDENC, UND, FACTOR);
                        if (ORDENC IS NULL) then
                            ORDENC = 0;
                        PEDIDO = PEDIDO + ORDENC * FACTOR;
                        END
                    RESERVADO = RESERVADO + PEDIDO;
                    END
                ELSE
                    BEGIN
                    RESERVADO = 0;
                    ORDENADO = 0;
                    END
                if (LISTA > 0) then
                    SELECT prar_fijo FROM precios_articulo WHERE arti_cod = :CODIGO and lipr_cod = :LISTA INTO :PRECIO;
                if (ENPESO = 'S') then
                    BEGIN
                    if (pesounit IS NULL) then
                        pesounit = 0;
                    if (PESOUNIT <> 0) then
                        BEGIN
                        pesototal = PESOUNIT * cant;
                        SUSPEND;
                        END
                    END
                ELSE
                    SUSPEND;
                END
            END
        END
  end
if (DETALLE = 'N') then
  BEGIN
  FOR SELECT ARTI_COD, ARTI_DES, ARTI_UNIDAD, ARTI_EXIST, TAIV_PORC, A.GRUP_COD, A.SUBG_COD, A.MARC_COD, ARTI_CONSUMO, ARTI_PESO/1000
      FROM ARTICULO A, TARIFA_IVA T
      WHERE ARTI_COD >= :CODINI AND ARTI_COD <= :CODFIN AND ARTI_DES >= :DESINI AND ARTI_DES <= :DESFIN AND ESAR_COD <> 'I' AND A.TAIV_COD = T.TAIV_COD
      INTO :CODIGO, :NOMBRE, :UNIDAD, :EXIST, :IVA, :CODGRUPO, :CODSUBG, :CODMARC, :CONSUMO, :pesounit
      DO
        BEGIN
        OK = 'N';
        if (AGRUPA = 'G') then
            BEGIN
            if ((GRPINI = '0') AND (GRPFIN = 'zz')) then
                OK = 'S';
            else
                if ((CODGRUPO >= GRPINI) AND (CODGRUPO <= GRPFIN)) then
                    OK = 'S';
            end
        ELSE
            if (AGRUPA = 'M') then
                BEGIN
                if ((GRPINI = '0') AND (GRPFIN = 'zzz')) then
                    OK = 'S';
                else
                    if ((CODMARC >= GRPINI) AND (CODMARC <= GRPFIN)) then
                        OK = 'S';
                END
        if (OK = 'S') then
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            SELECT MAX(COBA_COD) FROM BARRAS_ARTICULO WHERE ARTI_COD = :codigo AND COBA_UNIDAD = :unidad INTO :codbar;
            if (CODBAR IS NULL) then
                CODBAR = CODIGO;

            if (EXIST <> 'N') then
                BEGIN
                EXECUTE PROCEDURE SALDO_INICIAL_TOTAL_INV(CODIGO, FECHA) returning_values (CANT);
                EXECUTE PROCEDURE COSTO_PROMEDIO_UNIDAD(CODIGO, FECHA, UNIDAD) returning_values (COSTO);
                EXECUTE PROCEDURE ULTIMO_COSTO(CODIGO, FECHA, UNIDAD) returning_values (ULTCOSTO);
                SELECT MAX(MVAR_FECHA) FROM MOVIMIENTO_ARTICULO WHERE ARTI_COD = :CODIGO AND MVAR_ENTRADA = 'S' AND MVAR_FECHA <= :FECHA INTO :FECHACOSTO;
                COSTOTOT = :CANT * :COSTO;
                IVAMONTO = COSTOTOT /100 * IVA;
                COSTOIVA = COSTOTOT;
                if (MASIVA = 'S') then
                    BEGIN
                    COSTOIVA = COSTOTOT + IVAMONTO;
                    COSTO = COSTO * (100 + :IVA) / 100 + :CONSUMO;
                    END
                CONSUMO = CONSUMO * CANT;
                COSTOIVA = COSTOIVA + CONSUMO;
                if (RESERVA = 'S') then
                    BEGIN
                    SELECT SUM(ORID_ENTREGAR)
                        FROM ORDENINVENTARIO_DETALLE OD, ordenes_inventario O
                        WHERE O.ORIN_ID = OD.ORIN_ID AND ARTI_COD = :CODIGO AND ORIN_FECHA <= :FECHA AND ORIN_FECLLEGA >= :FECHA AND ORID_ANULADO = 'N'
                        INTO :ORDENADO;
                        if (ORDENADO IS NULL) then
                            ORDENADO = 0;
                    ORDENC = 0;
                    FOR SELECT O.ORDC_ID, OCDE_ITEM, OCDE_CANT * OCDE_FACTOR
                        FROM ORDENES_COMPRA O, ORDENES_COMPRA_DETALLE OD
                        WHERE O.ORDC_ID = OD.ORDC_ID AND OD.ARTI_COD = :CODIGO AND ORDC_VENCE >= :FECHA AND ORDC_FECHA <= :FECHA AND OCDE_ANULADO = 'N'
                        INTO :ID, :ITEM, :CANT2
                        do
                        BEGIN
                        EXECUTE PROCEDURE FALTANTE(23, 21, ID, ITEM) returning_values (PEDIDO, UND, FACTOR);
                        if (PEDIDO * FACTOR = CANT2) then /* SI NO SE HA FACTURADO MIRE A VER SI SE REMISIONO */
                            EXECUTE PROCEDURE FALTANTE(23, 22, ID, ITEM) returning_values (PEDIDO, UND, FACTOR);
                        if (PEDIDO IS NULL) then
                            PEDIDO = 0;
                        ORDENC = ORDENC + PEDIDO * FACTOR;
                        END
                    ORDENADO = ORDENADO + ORDENC;
                    SELECT SUM(RSDE_LIBERAR)
                        FROM RESERVAS_DETALLE RD, RESERVAS R
                        WHERE R.RESE_ID = RD.RESE_ID AND ARTI_COD = :CODIGO AND RESE_FECHA <= :FECHA AND RESE_VENCE >= :FECHA AND RSDE_ANULADO = 'N'
                        INTO :RESERVADO;
                    if (RESERVADO IS NULL) then
                        RESERVADO = 0;
                    PEDIDO = 0;
                    FOR SELECT P.PEDI_ID, PEDE_ITEM, PEDE_CANT * PEDE_FACTOR
                        FROM PEDIDOS P, PEDIDOS_DETALLE PD, PUNTO_VENTA PT
                        WHERE P.PEDI_ID = PD.PEDI_ID AND PD.ARTI_COD = :CODIGO AND PT.ptvt_id = P.PTVT_ID AND PEDI_VENCE >= :FECHA AND PEDI_FECHA <= :FECHA AND PEDE_ANULADO = 'N'
                        INTO :ID, :ITEM, :CANT2
                        do
                        BEGIN
                        EXECUTE PROCEDURE FALTANTE(34, 31, ID, ITEM) returning_values (ORDENC, UND, FACTOR);
                        if ((ORDENC * FACTOR = CANT2) or (PEDAUTO = 'SI')) then /* SI NO SE HA FACTURADO MIRE A VER SI SE REMISIONO */
                            EXECUTE PROCEDURE FALTANTE(34, 32, ID, ITEM) returning_values (ORDENC, UND, FACTOR);
                        if (ORDENC IS NULL) then
                            ORDENC = 0;
                        PEDIDO = PEDIDO + ORDENC * FACTOR;
                        END
                    if (PEDIDO IS NULL) then
                        PEDIDO = 0;
                    RESERVADO = RESERVADO + PEDIDO;
                    END
                ELSE
                    BEGIN
                    RESERVADO = 0;
                    ORDENADO = 0;
                    END
                if (LISTA > 0) then
                    SELECT prar_fijo FROM precios_articulo WHERE arti_cod = :CODIGO and lipr_cod = :LISTA INTO :PRECIO;

                if (ENPESO = 'S') then
                    BEGIN
                    if (pesounit IS NULL) then
                        pesounit = 0;
                    if (PESOUNIT <> 0) then
                        BEGIN
                        pesototal = PESOUNIT * cant;
                        SUSPEND;
                        END
                    END
                ELSE
                    SUSPEND;
                END
            END
        END
  END
END

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE EXISTENCIAS_UNIDAD(
    ARTICULO VARCHAR(15),
    FECHA DATE,
    UNIDAD VARCHAR(8))
RETURNS (
    BODEGA VARCHAR(2),
    EXISTENCIA NUMERIC(18,2),
    RESERVADO NUMERIC(18,2),
    ORDENADO NUMERIC(18,2),
    STAND VARCHAR(20))
AS
declare variable FACTOR NUMERIC(15,4);
declare variable ORDENC NUMERIC(18,4);
declare variable PEDIDO NUMERIC(18,4);
declare variable ITEM INTEGER;
declare variable ID INTEGER;
declare variable UND VARCHAR(8);
declare variable CANT NUMERIC(18,4);
declare variable factor2 NUMERIC(18,4);
declare variable PEDAUTO CHAR(2);
BEGIN
EXECUTE PROCEDURE FACTOR_UNIDAD_CANT(:ARTICULO, :UNIDAD) returning_values (:FACTOR);
for select bode_cod from bodega into :bodega
    do
    begin
    SELECT STAND_COD FROM STANDS WHERE ARTI_COD = :ARTICULO AND STAND_BODEGA = :BODEGA INTO :stand;
    execute procedure saldo_inventario (:articulo, :bodega, :fecha) returning_values (:Existencia);
    if (FACTOR <> 0) then
        EXISTENCIA = EXISTENCIA / FACTOR;
    else
        EXISTENCIA = 0;
    /* LO ORDENADO */
    SELECT SUM(ORID_ENTREGAR)
      FROM ORDENINVENTARIO_DETALLE OD, ordenes_inventario O
      WHERE O.ORIN_ID = OD.ORIN_ID AND ARTI_COD = :ARTICULO AND ORIN_FECHA <= :FECHA AND ORIN_FECLLEGA >= :FECHA AND ORID_ANULADO = 'N' AND OD.BODE_COD = :BODEGA
      INTO :ORDENADO;
    if (ORDENADO IS NULL) then
        ORDENADO = 0;
    ORDENC = 0;
    FOR SELECT O.ORDC_ID, OCDE_ITEM, OCDE_CANT * OCDE_FACTOR
        FROM ORDENES_COMPRA O, ORDENES_COMPRA_DETALLE OD
        WHERE O.ORDC_ID = OD.ORDC_ID AND OD.ARTI_COD = :ARTICULO AND (ORDC_FECHA+ORDC_VALIDEZ) >= :FECHA AND ORDC_FECHA <= :FECHA AND OCDE_ANULADO = 'N' AND OD.BODE_COD = :BODEGA
        INTO :ID, :ITEM, :CANT
        do
        BEGIN
        EXECUTE PROCEDURE FALTANTE(23, 21, ID, ITEM) returning_values (PEDIDO, UND, FACTOR2);
        if (PEDIDO * FACTOR2 = CANT) then /* SI NO SE HA FACTURADO MIRE A VER SI SE REMISIONO */
            EXECUTE PROCEDURE FALTANTE(23, 22, ID, ITEM) returning_values (PEDIDO, UND, FACTOR2);
        if (PEDIDO IS NULL) then
            PEDIDO = 0;
        ORDENC = ORDENC + PEDIDO * FACTOR2;
        END
    ORDENADO = ORDENADO + ORDENC;
    if (FACTOR <> 0) then
        ORDENADO = ORDENADO / FACTOR;
    /* LO RESERVADO */
    SELECT SUM(RSDE_LIBERAR)
      FROM RESERVAS_DETALLE RD, RESERVAS R
      WHERE R.RESE_ID = RD.RESE_ID AND ARTI_COD = :ARTICULO AND RESE_FECHA <= :FECHA AND RESE_VENCE >= :FECHA AND RD.BODE_COD = :BODEGA AND RSDE_ANULADO = 'N'
      INTO :RESERVADO;
    if (RESERVADO IS NULL) then
        RESERVADO = 0;
    PEDIDO = 0;
    FOR SELECT P.PEDI_ID, PEDE_ITEM, PEDE_CANT * PEDE_FACTOR
        FROM PEDIDOS P, PEDIDOS_DETALLE PD
        WHERE P.PEDI_ID = PD.PEDI_ID AND PD.ARTI_COD = :ARTICULO AND (PEDI_FECHA+PEDI_VALIDEZ) >= :FECHA AND PEDI_FECHA <= :FECHA AND PEDE_ANULADO = 'N' AND BODE_COD = :BODEGA
        INTO :ID, :ITEM, :CANT
        do
        BEGIN
        EXECUTE PROCEDURE FALTANTE(34, 31, ID, ITEM) returning_values (ORDENC, UND, FACTOR2);
        EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION', 'FACTURAS', 'GENERAR PEDIDO AUTOMATICAMENTE CON LA FACTURA') returning_values (pedauto);
        if ((ORDENC * FACTOR2 = CANT) or (PEDAUTO = 'SI')) then /* SI NO SE HA FACTURADO MIRE A VER SI SE REMISIONO */
            EXECUTE PROCEDURE FALTANTE(34, 32, ID, ITEM) returning_values (ORDENC, UND, FACTOR2);
        if (ORDENC IS NULL) then
            ORDENC = 0;
        PEDIDO = PEDIDO + ORDENC * FACTOR2;
        END
    RESERVADO = RESERVADO + PEDIDO;
    if (FACTOR <> 0) then
        RESERVADO = RESERVADO / FACTOR;
    SUSPEND;
    end
END

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE FALTANTES_COMPRAS_ARTICULO(
    DESDE VARCHAR(20),
    HASTA VARCHAR(20),
    FECINI DATE,
    FECFIN DATE,
    DETALLE CHAR(1),
    TIPO INTEGER,
    DESTINO INTEGER,
    ORDEN CHAR(1),
    CEROS CHAR(1),
    SUCURSAL INTEGER)
RETURNS (
    ARTICULO VARCHAR(15),
    DESCRIPCION VARCHAR(60),
    CODGRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    CODSUBG VARCHAR(3),
    NOMSUBG VARCHAR(30),
    CODMARC VARCHAR(3),
    NOMMARC VARCHAR(30),
    CANTIDAD NUMERIC(18,4),
    UNIDAD VARCHAR(8),
    FALTANTE NUMERIC(18,4),
    BASE NUMERIC(18,2),
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(6),
    NROPROV VARCHAR(8),
    FECHA DATE)
AS
declare variable CODINI VARCHAR(15);
declare variable CODFIN VARCHAR(15);
declare variable DESINI VARCHAR(15);
declare variable DESFIN VARCHAR(15);
declare variable ID INTEGER;
declare variable ITEM INTEGER;
declare variable CANT NUMERIC(18,2);
declare variable MONTO NUMERIC(18,2);
declare variable FACTOR NUMERIC(18,4);
BEGIN
if (ORDEN = 'C') then
    BEGIN
    CODINI = DESDE;
    CODFIN = HASTA;
    DESINI = '';
    DESFIN = 'zz';
    END
ELSE
    BEGIN
    DESINI = DESDE;
    DESFIN = HASTA;
    CODINI = '';
    CODFIN = 'zz';
    END
FOR SELECT ARTI_COD, ARTI_DES, ARTI_UNIDAD, A.GRUP_COD, A.SUBG_COD, A.MARC_COD FROM ARTICULO A
    WHERE ARTI_COD >= :CODINI AND ARTI_COD <= :CODFIN AND ARTI_DES >= :DESINI AND ARTI_DES <= :DESFIN
    INTO :ARTICULO, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
  DO
    BEGIN
    CANTIDAD = 0;
    faltante = 0;
    base = 0;
    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
    if (DETALLE = 'N') then
        BEGIN
        if (TIPO = 21) then
            BEGIN
            FOR SELECT F.FACO_ID, FCDE_ITEM, FCDE_CANT * FCDE_FACTOR, (FCDE_PRUNIT-FCDE_DTOMONTO), FACO_NUMPROV
                FROM FACTURAS_COMPRAS_DETALLE D, FACTURAS_COMPRA F, prefijos P
                WHERE F.FACO_ID = D.FACO_ID AND ARTI_COD = :ARTICULO AND FACO_FECHA >= :FECINI AND FACO_FECHA <= :FECFIN AND FACO_ANULADO = 'N' AND P.PREF_PRE = F.PREF_PRE AND ((SUCU_ID = :SUCURSAL) or (:SUCURSAL = 0))
                ORDER BY F.FACO_ID, FCDE_ITEM INTO :ID, :ITEM, :CANT, :MONTO, :nroprov
                DO
                BEGIN
                CANTIDAD = CANTIDAD + CANT;
                EXECUTE PROCEDURE FALTANTE(:TIPO, :DESTINO, :ID, :ITEM) returning_values (:CANT, :UNIDAD, :FACTOR);
                FALTANTE = FALTANTE + CANT;
                BASE = BASE + MONTO * CANT;
                END
            END
        if (TIPO = 22) then
            BEGIN
            FOR SELECT R.repr_id, rpvd_item, rpvd_cant * rpvd_factor, (rpvd_prunit-rpvd_dtomonto), REPR_NUMPROV
                FROM REMISION_PROVEEDOR_DET D, REMISION_PROVEEDOR R, PREFIJOS P
                WHERE R.REPR_ID = D.REPR_ID AND ARTI_COD = :ARTICULO AND REPR_FECHA >= :FECINI AND REPR_FECHA < :FECFIN AND REPR_ANULADO = 'N' AND P.PREF_PRE = R.PREF_PRE AND ((SUCU_ID = :SUCURSAL) or (:SUCURSAL = 0))
                ORDER BY R.REPR_ID, RPVD_ITEM INTO :ID, :ITEM, :CANT, :MONTO, :nroprov
                DO
                BEGIN
                CANTIDAD = CANTIDAD + CANT;
                EXECUTE PROCEDURE FALTANTE(:TIPO, :DESTINO, :ID, :ITEM) returning_values (:CANT, :UNIDAD, :FACTOR);
                FALTANTE = FALTANTE + CANT;
                BASE = BASE + MONTO * CANT;
                END
            END
        if (TIPO = 23) then
            BEGIN
            FOR SELECT O.ORDC_ID, OCDE_ITEM, OCDE_CANT * OCDE_FACTOR, (OCDE_PRUNIT-OCDE_DTOMONTO)
                FROM ORDENES_COMPRA_DETALLE D, ORDENES_COMPRA O, PREFIJOS P
                WHERE O.ORDC_ID = D.ORDC_ID AND ARTI_COD = :ARTICULO AND ORDC_FECHA >= :FECINI AND ORDC_FECHA < :FECFIN AND ORDC_ANULADO = 'N' AND P.PREF_PRE = O.PREF_PRE AND ((SUCU_ID = :SUCURSAL) or (:SUCURSAL = 0))
                ORDER BY O.ORDC_ID, OCDE_ITEM INTO :ID, :ITEM, :CANT, :MONTO
                DO
                BEGIN
                NROPROV = '';
                CANTIDAD = CANTIDAD + CANT;
                EXECUTE PROCEDURE FALTANTE(:TIPO, :DESTINO, :ID, :ITEM) returning_values (:CANT, :UNIDAD, :FACTOR);
                FALTANTE = FALTANTE + CANT;
                BASE = BASE + MONTO * CANT;
                END
            END
        if (TIPO = 25) then
            BEGIN
            FOR SELECT C.COPR_ID, CPRD_ITEM, CPRD_CANT * CPRD_FACTOR, (CPRD_PRUNIT-CPRD_DTOMONTO)
                FROM COTIZACIONES_PROVEEDOR_DET D, COTIZACION_PROVEEDOR C, PREFIJOS P
                WHERE C.COPR_ID = D.COPR_ID AND ARTI_COD = :ARTICULO AND COPR_FECHA >= :FECINI AND COPR_FECHA < :FECFIN AND COPR_ANULADO = 'N' AND P.PREF_PRE = C.PREF_PRE AND ((SUCU_ID = :SUCURSAL) or (:SUCURSAL = 0))
                ORDER BY C.COPR_ID, CPRD_ITEM INTO :ID, :ITEM, :CANT, :MONTO
                DO
                BEGIN
                NROPROV = '';
                CANTIDAD = CANTIDAD + CANT;
                EXECUTE PROCEDURE FALTANTE(:TIPO, :DESTINO, :ID, :ITEM) returning_values (:CANT, :UNIDAD, :FACTOR);
                FALTANTE = FALTANTE + CANT;
                BASE = BASE + MONTO * CANT;
                END
            END
        if (CANTIDAD IS NULL) then
            CANTIDAD = 0;
        if (BASE IS NULL) then
            BASE = 0;
        if (FALTANTE IS NULL) then
            FALTANTE = 0;
        if (CEROS = 'S') then
            SUSPEND;
        ELSE
            if (FALTANTE <> 0) then
                SUSPEND;
        END
    ELSE
        BEGIN
        if (TIPO = 21) then
            FOR SELECT F.FACO_ID, FCDE_ITEM, F.PREF_PRE, FACO_NUMERO, FACO_FECHA, FCDE_CANT * FCDE_FACTOR, (FCDE_PRUNIT-FCDE_DTOMONTO), FACO_NUMPROV
                FROM FACTURAS_COMPRA F, FACTURAS_COMPRAS_DETALLE D, prefijos P
                WHERE F.FACO_ID = D.FACO_ID AND ARTI_COD = :ARTICULO AND FACO_FECHA >= :FECINI AND FACO_FECHA < :FECFIN  AND FACO_ANULADO = 'N' AND P.PREF_PRE = F.PREF_PRE AND ((SUCU_ID = :SUCURSAL) or (:SUCURSAL = 0))
                ORDER BY F.FACO_ID, FCDE_ITEM
                INTO :ID, :ITEM, :PREFIJO, :NUMERO, :FECHA, :CANTIDAD, :BASE, :nroprov
                DO
                    BEGIN
                    EXECUTE PROCEDURE FALTANTE(:TIPO, :DESTINO, :ID, :ITEM) returning_values (:FALTANTE, :UNIDAD, :FACTOR);
                    if ((CEROS = 'S') or (FALTANTE <> 0)) then
                        SUSPEND;
                    END
        if (TIPO = 22) then
            FOR SELECT R.REPR_ID, RPVD_ITEM, R.PREF_PRE, REPR_NUMERO, REPR_FECHA, RPVD_CANT * RPVD_FACTOR, (RPVD_PRUNIT-RPVD_DTOMONTO), REPR_NUMPROV
                FROM REMISION_PROVEEDOR R, REMISION_PROVEEDOR_DET D, PREFIJOS P
                WHERE R.REPR_ID = D.REPR_ID AND ARTI_COD = :ARTICULO AND REPR_FECHA >= :FECINI AND REPR_FECHA < :FECFIN AND REPR_ANULADO = 'N' AND P.PREF_PRE = R.PREF_PRE AND ((SUCU_ID = :SUCURSAL) or (:SUCURSAL = 0))
                INTO :ID, :ITEM, :PREFIJO, :NUMERO, :FECHA, :CANTIDAD, :BASE, :nroprov
                DO
                    BEGIN
                    EXECUTE PROCEDURE FALTANTE(:TIPO, :DESTINO, :ID, :ITEM) returning_values (:FALTANTE, :UNIDAD, :FACTOR);
                    if ((CEROS = 'S') or (FALTANTE <> 0)) then
                        SUSPEND;
                    END
        if (TIPO = 23) then
            FOR SELECT O.ORDC_ID, OCDE_ITEM, O.PREF_PRE, ORDC_NUMERO, ORDC_FECHA, OCDE_CANT * OCDE_FACTOR, (OCDE_PRUNIT-OCDE_DTOMONTO)
                FROM ORDENES_COMPRA O, ORDENES_COMPRA_DETALLE D, PREFIJOS P
                WHERE O.ORDC_ID = D.ORDC_ID AND ARTI_COD = :ARTICULO AND ORDC_FECHA >= :FECINI AND ORDC_FECHA < :FECFIN AND ORDC_ANULADO = 'N' AND P.PREF_PRE = O.PREF_PRE AND ((SUCU_ID = :SUCURSAL) or (:SUCURSAL = 0))
                INTO :ID, :ITEM, PREFIJO, :NUMERO, :FECHA, :CANTIDAD, :BASE
                DO
                    BEGIN
                    NROPROV = '';
                    EXECUTE PROCEDURE FALTANTE(:TIPO, :DESTINO, :ID, :ITEM) returning_values (:FALTANTE, :UNIDAD, :FACTOR);
                    if ((CEROS = 'S') or (FALTANTE <> 0)) then
                        SUSPEND;
                    END
        if (TIPO = 25) then
            FOR SELECT C.COPR_ID, CPRD_ITEM, C.PREF_PRE, COPR_NUMERO, COPR_FECHA, CPRD_CANT * CPRD_FACTOR, (CPRD_PRUNIT-CPRD_DTOMONTO)
                FROM COTIZACION_PROVEEDOR C, COTIZACIONES_PROVEEDOR_DET D, PREFIJOS P
                WHERE C.COPR_ID = D.COPR_ID AND ARTI_COD = :ARTICULO AND COPR_FECHA >= :FECINI AND COPR_FECHA < :FECFIN AND COPR_ANULADO = 'N' AND P.PREF_PRE = C.PREF_PRE AND ((SUCU_ID = :SUCURSAL) or (:SUCURSAL = 0))
                INTO :ID, :ITEM, PREFIJO, :NUMERO, :FECHA, :CANTIDAD, :BASE
                DO
                    BEGIN
                    NROPROV = '';
                    EXECUTE PROCEDURE FALTANTE(:TIPO, :DESTINO, :ID, :ITEM) returning_values (:FALTANTE, :UNIDAD, :FACTOR);
                    if ((CEROS = 'S') or (FALTANTE <> 0)) then
                        SUSPEND;
                    END
        END
    END
END

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE FALTANTES_VENTAS_ARTICULO(
    DESDE VARCHAR(20),
    HASTA VARCHAR(20),
    FECINI DATE,
    FECFIN DATE,
    DETALLE CHAR(1),
    TIPO INTEGER,
    DESTINO INTEGER,
    ORDEN CHAR(1),
    CEROS CHAR(1),
    SUCURSAL INTEGER)
RETURNS (
    ARTICULO VARCHAR(15),
    DESCRIPCION VARCHAR(60),
    CODGRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    CODSUBG VARCHAR(3),
    NOMSUBG VARCHAR(30),
    CODMARC VARCHAR(3),
    NOMMARC VARCHAR(30),
    CANTIDAD NUMERIC(18,4),
    UNIDAD VARCHAR(8),
    FALTANTE NUMERIC(18,4),
    BASE NUMERIC(18,2),
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    OBS VARCHAR(255))
AS
declare variable ID INTEGER;
declare variable ITEM INTEGER;
declare variable CANT NUMERIC(18,2);
declare variable CODINI VARCHAR(15);
declare variable CODFIN VARCHAR(15);
declare variable DESINI VARCHAR(15);
declare variable DESFIN VARCHAR(15);
declare variable MONTO NUMERIC(18,2);
declare variable FACTOR NUMERIC(18,4);
BEGIN
if (ORDEN = 'C') then
    BEGIN
    CODINI = DESDE;
    CODFIN = HASTA;
    DESINI = '';
    DESFIN = 'zz';
    END
ELSE
    BEGIN
    DESINI = DESDE;
    DESFIN = HASTA;
    CODINI = '';
    CODFIN = 'zz';
    END
  FOR SELECT ARTI_COD, ARTI_DES, ARTI_UNIDAD, A.GRUP_COD, A.SUBG_COD, A.MARC_COD FROM ARTICULO A
      WHERE ARTI_COD >= :CODINI AND ARTI_COD <= :CODFIN AND ARTI_DES >= :DESINI AND ARTI_DES <= :DESFIN
      INTO :ARTICULO, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
  DO
    BEGIN
    CANTIDAD = 0;
    faltante = 0;
    base = 0;
    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
    if (DETALLE = 'N') then
        BEGIN
        if (TIPO = 31) then
            BEGIN
            FOR SELECT F.FACT_ID, FADE_ITEM, FADE_CANT * FADE_FACTOR, (FADE_PRUNIT-FADE_DTOMONTO)
                FROM FACTURAS_DETALLE D, FACTURAS F, PREFIJOS P
                WHERE F.FACT_ID = D.FACT_ID AND ARTI_COD = :ARTICULO AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND FACT_ANULADO = 'N' AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND ((SUCU_ID = :SUCURSAL) or (:SUCURSAL = 0)) and substring(arti_cod from 1 FOR 2) <> '.t'
                ORDER BY F.FACT_ID, FADE_ITEM INTO :ID, :ITEM, :CANT, :MONTO
                DO
                BEGIN
                CANTIDAD = CANTIDAD + CANT;
                EXECUTE PROCEDURE FALTANTE(:TIPO, :DESTINO, :ID, :ITEM) returning_values (:CANT, :UNIDAD, :FACTOR);
                FALTANTE = FALTANTE + CANT;
                BASE = BASE + MONTO * CANT;
                END
            END
        if (TIPO = 32) then
            BEGIN
            FOR SELECT R.revt_id, rvde_item, RVDE_CANT * RVDE_FACTOR, (RVDE_PRUNIT-RVDE_DTOMONTO)
                FROM REMISIONES_VENTA_DETALLE D, REMISIONES_VENTA R, PREFIJOS P
                WHERE R.REVT_ID = D.REVT_ID AND ARTI_COD = :ARTICULO AND REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN AND REVT_ANULADO = 'N' AND P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = 32  AND ((SUCU_ID = :SUCURSAL) or (:SUCURSAL = 0))
                ORDER BY R.REVT_ID, RVDE_ITEM INTO :ID, :ITEM, :CANT, :MONTO
                DO
                BEGIN
                CANTIDAD = CANTIDAD + CANT;
                EXECUTE PROCEDURE FALTANTE(:TIPO, :DESTINO, :ID, :ITEM) returning_values (:CANT, :UNIDAD, :FACTOR);
                FALTANTE = FALTANTE + CANT;
                BASE = BASE + MONTO * CANT;
                END
            END
        if (TIPO = 34) then
            BEGIN
            FOR SELECT P.PEDI_ID, PEDE_ITEM, PEDE_CANT * PEDE_FACTOR, (PEDE_PRUNIT-PEDE_DTOMONTO)
                FROM PEDIDOS_DETALLE D, PEDIDOS P, PREFIJOS R
                WHERE P.PEDI_ID = D.PEDI_ID AND ARTI_COD = :ARTICULO AND PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND PEDI_ANULADO = 'N' AND P.PREF_PRE = R.PREF_PRE AND R.TIDO_COD = 34  AND ((SUCU_ID = :SUCURSAL) or (:SUCURSAL = 0))
                ORDER BY P.PEDI_ID, PEDE_ITEM INTO :ID, :ITEM, :CANT, :MONTO
                DO
                BEGIN
                CANTIDAD = CANTIDAD + CANT;
                EXECUTE PROCEDURE FALTANTE(:TIPO, :DESTINO, :ID, :ITEM) returning_values (:CANT, :UNIDAD, :FACTOR);
                FALTANTE = FALTANTE + CANT;
                BASE = BASE + MONTO * CANT;
                END
            END
        if (TIPO = 35) then
            BEGIN
            FOR SELECT C.COTI_ID, CTDE_ITEM, CTDE_CANT * CTDE_FACTOR, (CTDE_PRUNIT-CTDE_DTOMONTO)
                FROM COTIZACIONES_DETALLE D, COTIZACIONES C, PREFIJOS P
                WHERE C.COTI_ID = D.COTI_ID AND ARTI_COD = :ARTICULO AND COTI_FECHA >= :FECINI AND COTI_FECHA <= :FECFIN AND COTI_ANULADO = 'N' AND P.PREF_PRE = C.PREF_PRE AND P.TIDO_COD = 35  AND ((SUCU_ID = :SUCURSAL) or (:SUCURSAL = 0))
                ORDER BY C.COTI_ID, CTDE_ITEM INTO :ID, :ITEM, :CANT, :MONTO
                DO
                BEGIN
                CANTIDAD = CANTIDAD + CANT;
                EXECUTE PROCEDURE FALTANTE(:TIPO, :DESTINO, :ID, :ITEM) returning_values (:CANT, :UNIDAD, :FACTOR);
                FALTANTE = FALTANTE + CANT;
                BASE = BASE + MONTO * CANT;
                END
            END
        if (CANTIDAD IS NULL) then
            CANTIDAD = 0;
        if (BASE IS NULL) then
            BASE = 0;
        if (FALTANTE IS NULL) then
            FALTANTE = 0;
        if (CEROS = 'S') then
            SUSPEND;
        ELSE
            if (FALTANTE <> 0) then
                SUSPEND;
        END
    ELSE
        BEGIN
        if (TIPO = 31) then
            FOR SELECT F.FACT_ID, FADE_ITEM, F.PREF_PRE, FACT_NUMERO, FACT_FECHA, FADE_CANT * FADE_FACTOR, (FADE_PRUNIT-FADE_DTOMONTO), SUBSTRING(FACT_OBS FROM 1 FOR 255)
                FROM FACTURAS F, FACTURAS_DETALLE D, PREFIJOS P
                WHERE F.FACT_ID = D.FACT_ID AND ARTI_COD = :ARTICULO AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND FACT_ANULADO = 'N' AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND ((SUCU_ID = :SUCURSAL) or (:SUCURSAL = 0)) and substring(arti_cod from 1 FOR 2) <> '.t'
                ORDER BY F.FACT_ID, FADE_ITEM
                INTO :ID, :ITEM, :PREFIJO, :NUMERO, :FECHA, :CANTIDAD, :BASE, :OBS
                DO
                    BEGIN
                    EXECUTE PROCEDURE FALTANTE(:TIPO, :DESTINO, :ID, :ITEM) returning_values (:FALTANTE, :UNIDAD, :FACTOR);
                    if ((CEROS = 'S') or (FALTANTE <> 0)) then
                        SUSPEND;
                    END
        if (TIPO = 32) then
            FOR SELECT R.REVT_ID, RVDE_ITEM, R.PREF_PRE, REVT_NUMERO, REVT_FECHA, RVDE_CANT * RVDE_FACTOR, (RVDE_PRUNIT-RVDE_DTOMONTO), SUBSTRING(REVT_OBS FROM 1 FOR 255)
                FROM REMISIONES_VENTA R, REMISIONES_VENTA_DETALLE D, PREFIJOS P
                WHERE R.REVT_ID = D.REVT_ID AND ARTI_COD = :ARTICULO AND REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN AND REVT_ANULADO = 'N' AND P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = 32 AND ((SUCU_ID = :SUCURSAL) or (:SUCURSAL = 0))
                INTO :ID, :ITEM, :PREFIJO, :NUMERO, :FECHA, :CANTIDAD, :BASE, :OBS
                DO
                    BEGIN
                    EXECUTE PROCEDURE FALTANTE(:TIPO, :DESTINO, :ID, :ITEM) returning_values (:FALTANTE, :UNIDAD, :FACTOR);
                    if ((CEROS = 'S') or (FALTANTE <> 0)) then
                        SUSPEND;
                    END
        if (TIPO = 34) then
            FOR SELECT P.PEDI_ID, PEDE_ITEM, P.PREF_PRE, PEDI_NUMERO, PEDI_FECHA, PEDE_CANT * PEDE_FACTOR, (PEDE_PRUNIT-PEDE_DTOMONTO), SUBSTRING(PEDI_OBS FROM 1 FOR 255)
                FROM PEDIDOS P, PEDIDOS_DETALLE D, PREFIJOS R
                WHERE P.PEDI_ID = D.PEDI_ID AND ARTI_COD = :ARTICULO AND PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND PEDI_ANULADO = 'N' AND P.PREF_PRE = R.PREF_PRE AND R.TIDO_COD = 34 AND ((SUCU_ID = :SUCURSAL) or (:SUCURSAL = 0))
                INTO :ID, :ITEM, PREFIJO, :NUMERO, :FECHA, :CANTIDAD, :BASE, :OBS
                DO
                    BEGIN
                    EXECUTE PROCEDURE FALTANTE(:TIPO, :DESTINO, :ID, :ITEM) returning_values (:FALTANTE, :UNIDAD, :FACTOR);
                    if ((CEROS = 'S') or (FALTANTE <> 0)) then
                        SUSPEND;
                    END
        if (TIPO = 35) then
            FOR SELECT C.COTI_ID, CTDE_ITEM, C.PREF_PRE, COTI_NUMERO, COTI_FECHA, CTDE_CANT * CTDE_FACTOR, (CTDE_PRUNIT-CTDE_DTOMONTO), SUBSTRING(COTI_OBS FROM 1 FOR 255)
                FROM COTIZACIONES C, COTIZACIONES_DETALLE D, PREFIJOS P
                WHERE C.COTI_ID = D.COTI_ID AND ARTI_COD = :ARTICULO AND COTI_FECHA >= :FECINI AND COTI_FECHA <= :FECFIN AND COTI_ANULADO = 'N' AND P.PREF_PRE = C.PREF_PRE AND P.TIDO_COD = 35 AND ((SUCU_ID = :SUCURSAL) or (:SUCURSAL = 0))
                INTO :ID, :ITEM, PREFIJO, :NUMERO, :FECHA, :CANTIDAD, :BASE, :OBS
                DO
                    BEGIN
                    EXECUTE PROCEDURE FALTANTE(:TIPO, :DESTINO, :ID, :ITEM) returning_values (:FALTANTE, :UNIDAD, :FACTOR);
                    if ((CEROS = 'S') or (FALTANTE <> 0)) then
                        SUSPEND;
                    END
        END
    END
END

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE FALTANTE_DOCUMENTO(
    TIPORI INTEGER,
    TIPDES INTEGER,
    IDORI INTEGER)
RETURNS (
    ARTI VARCHAR(20),
    DES VARCHAR(60),
    CANT NUMERIC(18,4),
    UNIDAD VARCHAR(8),
    BOD VARCHAR(2),
    PRUNIT NUMERIC(18,2),
    DTO NUMERIC(9,2),
    TOTAL NUMERIC(18,2))
AS
declare variable ITEM INTEGER;
declare variable FACTOR NUMERIC(18,4);
begin
    if (TIPORI = 21) then
        BEGIN
        FOR SELECT FCDE_ITEM, FCDE_CODBAR, FCDE_DESC, BODE_COD, FCDE_PRUNIT, FCDE_DTOPORC, FCDE_TOTAL FROM FACTURAS_COMPRAS_DETALLE
            WHERE FACO_ID = :IDORI ORDER BY FCDE_ITEM INTO :ITEM, :ARTI, :DES, :BOD, :PRUNIT, :DTO, :TOTAL DO
            BEGIN
            EXECUTE PROCEDURE faltante(:TIPORI, :TIPDES, :IDORI, :ITEM) returning_values (:CANT, :UNIDAD, :FACTOR);
            if (CANT <> 0) then
                SUSPEND;
            END
        END
    if (TIPORI = 22) then
        BEGIN
        FOR SELECT RPVD_ITEM, RPVD_CODBAR, RPVD_DESC, BODE_COD, RPVD_PRUNIT, RPVD_DTOPORC, RPVD_TOTAL  FROM remision_proveedor_det
            WHERE REPR_ID = :IDORI ORDER BY RPVD_ITEM INTO :ITEM, :ARTI, :DES, :BOD, :PRUNIT, :DTO, :TOTAL DO
            BEGIN
            EXECUTE PROCEDURE faltante(:TIPORI, :TIPDES, :IDORI, :ITEM) returning_values (:CANT, :UNIDAD, :FACTOR);
            if (CANT <> 0) then
                SUSPEND;
            END
        END
    if (TIPORI = 23) then
        BEGIN
        FOR SELECT OCDE_ITEM, OCDE_CODBAR, OCDE_DESC, BODE_COD, OCDE_PRUNIT, OCDE_DTOPORC, OCDE_TOTAL FROM ORDENES_COMPRA_DETALLE
            WHERE ORDC_ID = :IDORI ORDER BY OCDE_ITEM INTO :ITEM, :ARTI, :DES, :BOD, :PRUNIT, :DTO, :TOTAL DO
            BEGIN
            EXECUTE PROCEDURE faltante(:TIPORI, :TIPDES, :IDORI, :ITEM) returning_values (:CANT, :UNIDAD, :FACTOR);
            if (CANT <> 0) then
                SUSPEND;
            END
        END
    if (TIPORI = 25) then
        BEGIN
        FOR SELECT CPRD_ITEM, CPRD_CODBAR, CPRD_DESC, BODE_COD, CPRD_PRUNIT, CPRD_DTOPORC, CPRD_TOTAL FROM COTIZACIONES_PROVEEDOR_DET
            WHERE COPR_ID = :IDORI ORDER BY CPRD_ITEM INTO :ITEM, :ARTI, :DES, :BOD, :PRUNIT, :DTO, :TOTAL DO
            BEGIN
            EXECUTE PROCEDURE faltante(:TIPORI, :TIPDES, :IDORI, :ITEM) returning_values (:CANT, :UNIDAD, :FACTOR);
            if (CANT <> 0) then
                SUSPEND;
            END
        END
    if (TIPORI = 31) then
        BEGIN
        FOR SELECT FADE_ITEM, FADE_CODBAR, FADE_DESC, BODE_COD, FADE_PRUNIT, FADE_DTOPORC, FADE_TOTAL FROM FACTURAS_DETALLE
            WHERE FACT_ID = :IDORI and substring(arti_cod from 1 FOR 2) <> '.t' ORDER BY FADE_ITEM INTO :ITEM, :ARTI, :DES, :BOD, :PRUNIT, :DTO, :TOTAL DO
            BEGIN
            EXECUTE PROCEDURE faltante(:TIPORI, :TIPDES, :IDORI, :ITEM) returning_values (:CANT, :UNIDAD, :FACTOR);
            if (CANT <> 0) then
                SUSPEND;
            END
        END
    if (TIPORI = 32) then
        BEGIN
        FOR SELECT RVDE_ITEM, RVDE_CODBAR, RVDE_DESC, BODE_COD, RVDE_PRUNIT, RVDE_DTOPORC, RVDE_TOTAL FROM remisiones_venta_detalle
            WHERE REVT_ID = :IDORI ORDER BY RVDE_ITEM INTO :ITEM, :ARTI, :DES, :BOD, :PRUNIT, :DTO, :TOTAL DO
            BEGIN
            EXECUTE PROCEDURE faltante(:TIPORI, :TIPDES, :IDORI, :ITEM) returning_values (:CANT, :UNIDAD, :FACTOR);
            if (CANT <> 0) then
                SUSPEND;
            END
        END
    if (TIPORI = 34) then
        BEGIN
        FOR SELECT PEDE_ITEM, PEDE_CODBAR, PEDE_DESC, BODE_COD, PEDE_PRUNIT, PEDE_DTOPORC, PEDE_TOTAL FROM PEDIDOS_DETALLE
            WHERE PEDI_ID = :IDORI ORDER BY PEDE_ITEM INTO :ITEM, :ARTI, :DES, :BOD, :PRUNIT, :DTO, :TOTAL DO
            BEGIN
            EXECUTE PROCEDURE faltante(:TIPORI, :TIPDES, :IDORI, :ITEM) returning_values (:CANT, :UNIDAD, :FACTOR);
            if (CANT <> 0) then
                SUSPEND;
            END
        END
    if (TIPORI = 35) then
        BEGIN
        FOR SELECT CTDE_ITEM, CTDE_CODBAR, CTDE_DESC, CTDE_PRUNIT, CTDE_DTOPORC, CTDE_TOTAL FROM COTIZACIONES_DETALLE
            WHERE COTI_ID = :IDORI ORDER BY CTDE_ITEM INTO :ITEM, :ARTI, :DES, :PRUNIT, :DTO, :TOTAL DO
            BEGIN
            EXECUTE PROCEDURE faltante(:TIPORI, :TIPDES, :IDORI, :ITEM) returning_values (:CANT, :UNIDAD, :FACTOR);
            if (CANT <> 0) then
                SUSPEND;
            END
        END
end

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE ORDENES_ARTICULO(
    FECHA DATE,
    DETALLE CHAR(1))
RETURNS (
    CODIGO VARCHAR(15),
    NOMBRE VARCHAR(60),
    ORDEN NUMERIC(18,4),
    EXIST NUMERIC(18,2),
    SUMA NUMERIC(18,2),
    COSTO NUMERIC(18,2),
    UNIDAD VARCHAR(8),
    CODGRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    CODSUBG VARCHAR(3),
    NOMSUBG VARCHAR(30),
    CODMARC VARCHAR(3),
    NOMMARC VARCHAR(30),
    COSTOTOT NUMERIC(18,2),
    CLIENTE VARCHAR(60),
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHADOC DATE)
AS
declare variable ORDENC NUMERIC(18,4);
declare variable ID INTEGER;
declare variable ITEM INTEGER;
declare variable UND VARCHAR(8);
declare variable FACTOR NUMERIC(18,4);
declare variable FACT NUMERIC(18,4);
declare variable CANT NUMERIC(18,4);
BEGIN
  FOR
    SELECT ARTI_COD, ARTI_DES, ARTI_UNIDAD, A.GRUP_COD, A.SUBG_COD, A.MARC_COD
      FROM ARTICULO A
      INTO :CODIGO, :NOMBRE, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
      DO
        BEGIN
        EXECUTE PROCEDURE SALDO_TOTAL_INVENTARIO(CODIGO, FECHA) returning_values (EXIST);
        EXECUTE PROCEDURE COSTO_PROMEDIO(CODIGO, FECHA) returning_values (COSTO);
        if (DETALLE = 'N') then
            BEGIN
            NOMMARC = '';
            NOMSUBG = '';
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            SELECT SUM(ORID_ENTREGAR) FROM ordenes_inventario O, ordeninventario_detalle OD
                WHERE O.ORIN_ID = OD.ORIN_ID AND OD.ARTI_COD = :CODIGO AND ORIN_FECHA <= :FECHA AND ORIN_FECLLEGA >= :FECHA AND ORIN_ANULADO = 'N'
                INTO :ORDEN;
            if (ORDEN IS NULL) then
                ORDEN = 0;
            FOR SELECT O.ORDC_ID, OCDE_ITEM, OCDE_CANT * OCDE_FACTOR
                FROM ORDENES_COMPRA O, ORDENES_COMPRA_DETALLE OD
                WHERE O.ORDC_ID = OD.ORDC_ID AND OD.ARTI_COD = :CODIGO AND (ORDC_FECHA+ORDC_VALIDEZ) >= :FECHA AND ORDC_FECHA <= :FECHA AND ORDC_ANULADO = 'N'
                INTO :ID, :item, :CANT
                DO
                BEGIN
                EXECUTE PROCEDURE FALTANTE(23, 21, ID, ITEM) returning_values (ORDENC, UND, FACT);
                if (ORDENC * FACT = CANT) then
                    EXECUTE PROCEDURE FALTANTE(23, 22, ID, ITEM) returning_values (ORDENC, UND, FACT);
                if (ORDENC IS NULL) then
                    ORDENC = 0;
                if (ORDENC <> 0) then
                    BEGIN
                    ORDEN = ORDEN + ORDENC;
                    END
                END
            SUMA = ORDEN + EXIST;
            COSTOTOT = ORDEN * :COSTO;
            if (ORDEN <> 0) then
                SUSPEND;
            END
        ELSE
            BEGIN
            FOR SELECT ORIN_FECHA, PREF_PRE, ORIN_NUMERO, ORIN_NOMTERC, ORID_CANT, ORID_UNIDAD, ORID_ENTREGAR
                FROM ordenes_inventario O, ordeninventario_detalle OD
                WHERE O.ORIN_ID = OD.ORIN_ID AND OD.ARTI_COD = :CODIGO AND ORIN_FECHA <= :FECHA AND ORIN_FECLLEGA > :FECHA AND ORIN_ANULADO = 'N'
                INTO :FECHADOC, :PREFIJO, :NUMERO, :CLIENTE, :EXIST, :UNIDAD, :ORDEN
                DO
                BEGIN
                COSTOTOT = ORDEN * :COSTO;
                SUSPEND;
                END
            FOR SELECT O.ORDC_ID, OCDE_ITEM, ORDC_FECHA, PREF_PRE, ORDC_NUMERO, TERC_NOM, OCDE_CANT, OCDE_UNIDAD, OCDE_ORDENADO, OCDE_FACTOR
                FROM ordenes_compra O, ordenes_compra_detalle OD, TERCEROS T
                WHERE O.ORDC_ID = OD.ORDC_ID AND OD.ARTI_COD = :CODIGO AND O.TERC_NIT = T.TERC_NIT AND ORDC_FECHA <= :FECHA AND (ORDC_FECHA+ordc_validez) > :FECHA AND ORDC_ANULADO = 'N'
                INTO :ID, :ITEM, :FECHADOC, :PREFIJO, :NUMERO, :CLIENTE, :CANT, :UNIDAD, :ORDEN, :FACTOR
                DO
                BEGIN
                EXECUTE PROCEDURE FALTANTE(23, 21, ID, ITEM) returning_values (ORDEN, UND, FACT);
                if (ORDEN * FACT = CANT * FACTOR) then
                    EXECUTE PROCEDURE FALTANTE(23, 22, ID, ITEM) returning_values (ORDEN, UND, FACTOR);
                if (ORDEN IS NULL) then
                    ORDEN = 0;
                COSTOTOT = ORDEN * :COSTO;
                if (ORDEN <> 0) then
                    SUSPEND;
                END
            END
        END
END

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE ORDENES_ARTICULO_FECHA(
    ARTICULO VARCHAR(15),
    FECHA DATE)
RETURNS (
    FECORD DATE,
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(6),
    FECLLEGA DATE,
    PROVEEDOR VARCHAR(60),
    CANTIDAD NUMERIC(18,2),
    UNIDAD VARCHAR(8),
    TIPO INTEGER,
    ID INTEGER)
AS
declare variable ITEM INTEGER;
declare variable FACTOR NUMERIC(18,4);
declare variable UND VARCHAR(8);
declare variable FACT NUMERIC(18,4);
declare variable ORDENC NUMERIC(18,4);
BEGIN
TIPO = 18;
  /* MUESTRA LAS RESERVAS DEL ARTICULO QUE NO SE HAN VENCIDO */
  FOR SELECT OI.ORIN_ID, ORIN_FECHA, PREF_PRE, ORIN_NUMERO, ORIN_FECLLEGA, ORIN_NOMTERC, ORID_CANT, ORID_UNIDAD
    FROM ORDENES_INVENTARIO OI, ORDENINVENTARIO_DETALLE OD
    WHERE OI.ORIN_ID = OD.ORIN_ID AND OD.ARTI_COD = :ARTICULO AND OI.ORIN_FECLLEGA > :FECHA AND ORIN_FECHA <= :FECHA AND ORID_ANULADO = 'N'
    INTO :ID, :FECORD, :PREFIJO, :NUMERO, :FECLLEGA, :PROVEEDOR, :CANTIDAD, :UNIDAD
        DO
          SUSPEND;
TIPO = 23;
  FOR SELECT O.ORDC_ID, OCDE_ITEM, ORDC_FECHA, PREF_PRE, ORDC_NUMERO, (ORDC_FECHA+ORDC_VALIDEZ), TERC_NOM, OCDE_CANT, OCDE_UNIDAD
    FROM ORDENES_COMPRA O, ORDENES_COMPRA_DETALLE OD, TERCEROS T
    WHERE O.ORDC_ID = OD.ORDC_ID AND OD.ARTI_COD = :ARTICULO AND O.TERC_NIT = T.TERC_NIT AND (ORDC_FECHA+ORDC_VALIDEZ) > :FECHA AND ORDC_FECHA <= :FECHA AND ORDC_ANULADO = 'N'
    INTO :ID, :item, :FECORD, :PREFIJO, :NUMERO, :FECLLEGA, :PROVEEDOR, :CANTIDAD, :UNIDAD
        DO
        BEGIN
        EXECUTE PROCEDURE FALTANTE(23, 21, ID, ITEM) returning_values (ORDENC, UND, FACT);
        if (ORDENC = CANTIDAD) then
            EXECUTE PROCEDURE FALTANTE(23, 22, ID, ITEM) returning_values (ORDENC, UND, FACTOR);
        if (ORDENC IS NULL) then
            ORDENC = 0;
        if (ORDENC <> 0) then
            BEGIN
            CANTIDAD = ORDENC;
            UNIDAD = UND;
            SUSPEND;
            END
        END
END

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE ORDEN_PROVEEDOR(
    NIT VARCHAR(20),
    FECHA DATE)
RETURNS (
    ARTICULO VARCHAR(20),
    DESCRIPCION VARCHAR(60),
    UNIDAD VARCHAR(8),
    BODEGA VARCHAR(2),
    EXISTENCIA NUMERIC(18,4),
    RESERVADO NUMERIC(18,4),
    ORDENADO NUMERIC(18,4),
    PROMEDIO NUMERIC(18,4),
    VENTAMES NUMERIC(18,4),
    FECHACMP DATE,
    DIAS INTEGER,
    SUGERIDO NUMERIC(18,4),
    STAND VARCHAR(20))
AS
declare variable FACTOR NUMERIC(15,4);
declare variable ORDENC NUMERIC(18,4);
declare variable PEDIDO NUMERIC(18,4);
declare variable ITEM INTEGER;
declare variable ID INTEGER;
declare variable UND VARCHAR(8);
declare variable CANT NUMERIC(18,4);
declare variable FACTOR2 NUMERIC(18,4);
declare variable fecini DATE;
declare variable FECHAAUX VARCHAR(10);
declare variable DEVMES NUMERIC(18,2);
declare variable DIA_ART VARCHAR(2) CHARACTER SET NONE;
declare variable DIASC VARCHAR(255);
declare variable PEDAUTO CHAR(2);
declare variable SALIDAS NUMERIC(18,4);
BEGIN
FOR SELECT A.ARTI_COD, A.ARTI_DES, A.ARTI_UNIDAD FROM ARTICULO A, proveedor_articulo P
  WHERE A.arti_cod = P.arti_cod AND P.terc_nit = :NIT INTO :articulo, :descripcion, :unidad
  DO
  for select bode_cod from bodega into :bodega
    do
    begin
    execute procedure saldo_inventario (:articulo, :bodega, :fecha) returning_values (:Existencia);
    EXECUTE PROCEDURE FACTOR_UNIDAD_CANT(:ARTICULO, :UNIDAD) returning_values (:FACTOR);
    if (FACTOR <> 0) then
        EXISTENCIA = EXISTENCIA / FACTOR;
    else
        EXISTENCIA = 0;
    SELECT STAND_COD FROM STANDS WHERE ARTI_COD = :articulo AND STAND_BODEGA = :bodega INTO :STAND;
    EXECUTE PROCEDURE promedio_salidas_articulo (:ARTICULO, :FECHA, :BODEGA) returning_values (:PROMEDIO, :SALIDAS);
    EXECUTE PROCEDURE lee_configuracion ('INVENTARIO', 'EXISTENCIAS', 'PROMEDIAR LAS SALIDAS DEL INVENTARIO CON EL NUMERO DE DIAS ASIGNADO A CADA ARTICULO') returning_values (:DIA_ART);
    if (DIA_ART = 'NO') then
        BEGIN
        EXECUTE PROCEDURE lee_configuracion ('INVENTARIO', 'EXISTENCIAS', 'NUMERO DE DIAS PARA PROMEDIO DE SALIDAS POR ARTICULO') returning_values (DIASC);
        DIAS = CAST(DIASC AS INTEGER);
        END
    ELSE
        SELECT ARTI_DIAS FROM ARTICULO WHERE ARTI_COD = :ARTICULO INTO :DIAS;
    if (DIAS is null) then
        DIAS = 0;
    PROMEDIO = DIAS * PROMEDIO;
    if (FACTOR <> 0) then
        PROMEDIO = PROMEDIO / FACTOR;
    SUGERIDO = PROMEDIO - EXISTENCIA;
    SELECT SUM(ORID_ENTREGAR)
      FROM ORDENINVENTARIO_DETALLE OD, ordenes_inventario O
      WHERE O.ORIN_ID = OD.ORIN_ID AND ARTI_COD = :ARTICULO AND ORIN_FECHA <= :FECHA AND ORIN_FECLLEGA >= :FECHA AND ORID_ANULADO = 'N' AND OD.BODE_COD = :BODEGA
      INTO :ORDENADO;
    if (ORDENADO IS NULL) then
        ORDENADO = 0;
    ORDENC = 0;
    FOR SELECT O.ORDC_ID, OCDE_ITEM, OCDE_CANT * OCDE_FACTOR
        FROM ORDENES_COMPRA O, ORDENES_COMPRA_DETALLE OD
        WHERE O.ORDC_ID = OD.ORDC_ID AND OD.ARTI_COD = :ARTICULO AND (ORDC_FECHA+ORDC_VALIDEZ) >= :FECHA AND ORDC_FECHA <= :FECHA AND OCDE_ANULADO = 'N' AND OD.BODE_COD = :BODEGA
        INTO :ID, :ITEM, :CANT
        do
        BEGIN
        EXECUTE PROCEDURE FALTANTE(23, 21, ID, ITEM) returning_values (PEDIDO, UND, FACTOR2);
        if (PEDIDO * FACTOR2 = CANT) then /* SI NO SE HA FACTURADO MIRE A VER SI SE REMISIONO */
            EXECUTE PROCEDURE FALTANTE(23, 22, ID, ITEM) returning_values (PEDIDO, UND, FACTOR2);
        if (PEDIDO IS NULL) then
            PEDIDO = 0;
        ORDENC = ORDENC + PEDIDO * FACTOR2;
        END
    ORDENADO = ORDENADO + ORDENC;
    if (FACTOR <> 0) then
        ORDENADO = ORDENADO / FACTOR;
    SELECT SUM(RSDE_LIBERAR)
      FROM RESERVAS_DETALLE RD, RESERVAS R
      WHERE R.RESE_ID = RD.RESE_ID AND ARTI_COD = :ARTICULO AND RESE_FECHA <= :FECHA AND RESE_VENCE >= :FECHA AND RD.BODE_COD = :BODEGA AND RSDE_ANULADO = 'N'
      INTO :RESERVADO;
    if (RESERVADO IS NULL) then
        RESERVADO = 0;
    PEDIDO = 0;
    FOR SELECT P.PEDI_ID, PEDE_ITEM, PEDE_CANT * PEDE_FACTOR
        FROM PEDIDOS P, PEDIDOS_DETALLE PD
        WHERE P.PEDI_ID = PD.PEDI_ID AND PD.ARTI_COD = :ARTICULO AND (PEDI_FECHA+PEDI_VALIDEZ) >= :FECHA AND PEDI_FECHA <= :FECHA AND PEDE_ANULADO = 'N' AND BODE_COD = :BODEGA
        INTO :ID, :ITEM, :CANT
        do
        BEGIN
        EXECUTE PROCEDURE FALTANTE(34, 31, ID, ITEM) returning_values (ORDENC, UND, FACTOR2);
        EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION', 'FACTURAS', 'GENERAR PEDIDO AUTOMATICAMENTE CON LA FACTURA') returning_values (pedauto);
        if ((ORDENC * FACTOR2 = CANT) or (PEDAUTO = 'SI')) then /* SI NO SE HA FACTURADO MIRE A VER SI SE REMISIONO */
            EXECUTE PROCEDURE FALTANTE(34, 32, ID, ITEM) returning_values (ORDENC, UND, FACTOR2);
        if (ORDENC IS NULL) then
            ORDENC = 0;
        PEDIDO = PEDIDO + ORDENC * FACTOR2;
        END
    RESERVADO = RESERVADO + PEDIDO;
    if (FACTOR <> 0) then
        RESERVADO = RESERVADO / FACTOR;
    /* VENTAS MES */
    FECHAAUX = CAST (FECHA AS VARCHAR(10));
    FECHAAUX = SUBSTR(FECHAAUX, 1, 7) || '/01';
    FECINI = CAST (FECHAAUX AS DATE);
    /* VENTAS MENSUALES */
    SELECT SUM(FADE_CANT * FADE_FACTOR)
        FROM FACTURAS_DETALLE D, FACTURAS F, punto_venta P
        WHERE F.FACT_ID = D.FACT_ID AND ARTI_COD = :ARTICULO AND FACT_FECHA >= :FECINI AND FACT_FECHA < :FECHA AND FACT_ANULADO = 'N'
        AND P.ptvt_id = F.ptvt_id AND P.bode_cod = :bodega INTO :ventames;
    SELECT SUM(DVDE_CANT * DVDE_FACTOR)
        FROM DEVOLUCIONES_VENTAS F, devoluciones_ventas_DETALLE D, punto_venta P
        WHERE F.DEVT_ID = D.DEVT_ID AND ARTI_COD = :ARTICULO AND DEVT_FECHA >= :FECINI AND DEVT_FECHA < :FECHA AND DEVT_ANULADO = 'N'
        AND P.ptvt_id = F.ptvt_id AND P.bode_cod = :bodega INTO :devmes;
    if (ventames IS NULL) then
        ventames = 0;
    if (devmes IS NULL) then
        devmes = 0;
    ventames = ventames - devmes;
    if (FACTOR <> 0) then
        ventames = ventames / FACTOR;
    /* FECHA COMPRA */
    SELECT MAX(FACO_FECHA) FROM FACTURAS_COMPRA F, FACTURAS_COMPRAS_DETALLE D
        WHERE F.FACO_ID = D.faco_id AND D.ARTI_COD = :articulo AND FACO_FECHA <= :FECHA AND D.bode_cod = :BODEGA
        INTO :fechacmp;
    SUSPEND;
    end
END

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE REP_FALTANTES_CLIENTES(
    TERINI VARCHAR(20),
    TERFIN VARCHAR(20),
    FECINI DATE,
    FECFIN DATE,
    DETALLE CHAR(1),
    TIPO INTEGER,
    DESTINO INTEGER,
    ARTINI VARCHAR(15),
    ARTFIN VARCHAR(15),
    ORDEN CHAR(1),
    CEROS CHAR(1),
    SUBEMPRESA INTEGER)
RETURNS (
    NIT VARCHAR(20),
    SUCURSAL VARCHAR(10),
    NOMBRE VARCHAR(60),
    TELEFONO VARCHAR(40),
    CIUDAD VARCHAR(40),
    CODZONA VARCHAR(2),
    NOMZONA VARCHAR(30),
    NOMTIPO VARCHAR(50),
    ARTICULO VARCHAR(15),
    DESCRIPCION VARCHAR(60),
    CODGRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    CODSUBG VARCHAR(3),
    NOMSUBG VARCHAR(30),
    CODMARC VARCHAR(3),
    NOMMARC VARCHAR(30),
    CANTIDAD NUMERIC(18,4),
    UNIDAD VARCHAR(8),
    FALTANTE NUMERIC(18,4),
    BASE NUMERIC(18,2),
    IVA NUMERIC(18,2),
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    OBS VARCHAR(255))
AS
declare variable ID INTEGER;
declare variable ITEM INTEGER;
declare variable CODINI VARCHAR(15);
declare variable CODFIN VARCHAR(15);
declare variable DESINI VARCHAR(15);
declare variable DESFIN VARCHAR(15);
declare variable FACTOR NUMERIC(18,4);
declare variable CANT NUMERIC(18,4);
declare variable MONTO NUMERIC(18,2);
declare variable artiaux VARCHAR(20);
BEGIN
if (ORDEN = 'C') then
    BEGIN
    CODINI = ARTINI;
    CODFIN = ARTFIN;
    DESINI = '';
    DESFIN = 'zz';
    END
ELSE
    BEGIN
    DESINI = ARTINI;
    DESFIN = ARTFIN;
    CODINI = '';
    CODFIN = 'zz';
    END
SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = :TIPO INTO :NOMTIPO;
/*FOR select T.TERC_NIT, TERC_NOM,  TERC_TEL, TERC_CIU, ZONA_COD
    from terceros T, CLIENTES C*/
FOR select c.terc_nit,s.clsu_nombre,s.clsu_tel,s.clsu_ciudad,s.zona_cod,s.clcu_cod
    from clientes c, cliente_sucursales s
    where C.TERC_NIT = s.TERC_NIT and C.TERC_NIT >= :TERINI AND C.TERC_NIT <= :TERFIN
    INTO :NIT, :NOMBRE, :TELEFONO, :CIUDAD, :CODZONA, :sucursal
    DO  
    BEGIN
    CANTIDAD = 0;
    FALTANTE = 0;
    BASE = 0;
    SELECT ZONA_NOM FROM ZONAS WHERE ZONA_COD = :CODZONA INTO :NOMZONA;
    if (DETALLE = 'N') then
        BEGIN
        ARTICULO = '';
        if (TIPO = 31) then
            FOR SELECT F.FACT_ID, FADE_ITEM, D.ARTI_COD, FADE_CANT * FADE_FACTOR, (FADE_PRUNIT-FADE_DTOMONTO)
                FROM FACTURAS_DETALLE D, FACTURAS F, ARTICULO A, PREFIJOS P
                WHERE F.FACT_ID = D.FACT_ID AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND TERC_NIT = :NIT AND FACT_ANULADO = 'N' AND
                      D.ARTI_COD = A.ARTI_COD AND D.ARTI_COD >= :CODINI AND D.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
                      P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND ((P.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) and f.fact_sucursal = :sucursal and substring(a.arti_cod from 1 FOR 2) <> '.t'
                ORDER BY ARTI_COD, F.FACT_ID, FADE_ITEM INTO :ID, :ITEM, :ARTIAUX, :CANT,  :MONTO
                DO
                BEGIN
                if (artiaux <> articulo) then
                    begin
                    if (ARTICULO <> '') then
                        SUSPEND;
                    SELECT ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                        FROM articulo WHERE ARTI_COD = :ARTIAUX
                        INTO :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC;
                    SELECT GRUP_NOM FROM GRUPO WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    ARTICULO = ARTIAUX;
                    CANTIDAD = 0;
                    FALTANTE = 0;
                    BASE = 0;
                    end
                CANTIDAD = CANTIDAD + CANT;
                EXECUTE PROCEDURE FALTANTE(:TIPO, :DESTINO, :ID, :ITEM) returning_values (:CANT, :UNIDAD, :FACTOR);
                FALTANTE = FALTANTE + CANT;
                BASE = BASE + (MONTO * CANT);
                END
        if (TIPO = 32) then
            FOR SELECT R.revt_id, rvde_item, D.ARTI_COD, RVDE_CANT * RVDE_FACTOR, (RVDE_PRUNIT-RVDE_DTOMONTO)
                FROM REMISIONES_VENTA_DETALLE D, REMISIONES_VENTA R, ARTICULO A, PREFIJOS P
                WHERE R.REVT_ID = D.REVT_ID AND REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN AND TERC_NIT = :NIT AND REVT_ANULADO = 'N' AND
                      D.ARTI_COD = A.ARTI_COD AND D.ARTI_COD >= :CODINI AND D.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
                      P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = 32 AND ((P.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) and r.revt_sucursal = :sucursal
                ORDER BY ARTI_COD, R.REVT_ID, RVDE_ITEM INTO :ID, :ITEM, :ARTIAUX, :CANT, :MONTO
                DO
                BEGIN
                if (artiaux <> articulo) then
                    begin
                    if (ARTICULO <> '') then
                        SUSPEND;
                    SELECT ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                        FROM articulo WHERE ARTI_COD = :ARTIAUX
                        INTO :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC;
                    SELECT GRUP_NOM FROM GRUPO WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    ARTICULO = ARTIAUX;
                    CANTIDAD = 0;
                    FALTANTE = 0;
                    BASE = 0;
                    end
                CANTIDAD = CANTIDAD + CANT;
                EXECUTE PROCEDURE FALTANTE(:TIPO, :DESTINO, :ID, :ITEM) returning_values (:CANT, :UNIDAD, :FACTOR);
                FALTANTE = FALTANTE + CANT;
                BASE = BASE + (MONTO * CANT);
                END
        if (TIPO = 34) then
            FOR SELECT P.PEDI_ID, PEDE_ITEM, D.ARTI_COD, PEDE_CANT * PEDE_FACTOR, (PEDE_PRUNIT-PEDE_DTOMONTO)
                FROM PEDIDOS_DETALLE D, PEDIDOS P, ARTICULO A, PREFIJOS PR
                WHERE P.PEDI_ID = D.PEDI_ID AND PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND TERC_NIT = :NIT AND PEDI_ANULADO = 'N' AND
                      D.ARTI_COD = A.ARTI_COD AND D.ARTI_COD >= :CODINI AND D.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
                      PR.PREF_PRE = P.PREF_PRE AND PR.TIDO_COD = 34 AND ((PR.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) and p.pedi_sucursal = :sucursal
                ORDER BY ARTI_COD, P.PEDI_ID, PEDE_ITEM INTO :ID, :ITEM, :ARTIAUX, :CANT, :MONTO
                DO
                BEGIN
                if (artiaux <> articulo) then
                    begin
                    if (ARTICULO <> '') then
                        SUSPEND;
                    SELECT ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                        FROM articulo WHERE ARTI_COD = :ARTIAUX
                        INTO :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC;
                    SELECT GRUP_NOM FROM GRUPO WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    ARTICULO = ARTIAUX;
                    CANTIDAD = 0;
                    FALTANTE = 0;
                    BASE = 0;
                    end
                CANTIDAD = CANTIDAD + CANT;
                EXECUTE PROCEDURE FALTANTE(:TIPO, :DESTINO, :ID, :ITEM) returning_values (:CANT, :UNIDAD, :FACTOR);
                FALTANTE = FALTANTE + CANT;
                BASE = BASE + (MONTO * CANT);
                END
        if (TIPO = 35) then
            FOR SELECT C.COTI_ID, CTDE_ITEM, D.ARTI_COD, CTDE_CANT * CTDE_FACTOR, (CTDE_PRUNIT-CTDE_DTOMONTO)
                FROM COTIZACIONES_DETALLE D, COTIZACIONES C, ARTICULO A, PREFIJOS P
                WHERE C.COTI_ID = D.COTI_ID AND COTI_FECHA >= :FECINI AND COTI_FECHA <= :FECFIN AND TERC_NIT = :NIT AND COTI_ANULADO = 'N' AND
                      D.ARTI_COD = A.ARTI_COD AND D.ARTI_COD >= :CODINI AND D.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
                      P.PREF_PRE = C.PREF_PRE AND P.TIDO_COD = 35 AND ((P.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) and c.coti_sucursal = :sucursal
                ORDER BY ARTI_COD, C.COTI_ID, CTDE_ITEM INTO :ID, :ITEM, :ARTIAUX, :CANT, :MONTO
                DO
                BEGIN
                if (artiaux <> articulo) then
                    begin
                    if (ARTICULO <> '') then
                        SUSPEND;
                    SELECT ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                        FROM articulo WHERE ARTI_COD = :ARTIAUX
                        INTO :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC;
                    SELECT GRUP_NOM FROM GRUPO WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    ARTICULO = ARTIAUX;
                    CANTIDAD = 0;
                    FALTANTE = 0;
                    BASE = 0;
                    end
                CANTIDAD = CANTIDAD + CANT;
                EXECUTE PROCEDURE FALTANTE(:TIPO, :DESTINO, :ID, :ITEM) returning_values (:CANT, :UNIDAD, :FACTOR);
                FALTANTE = FALTANTE + CANT;
                BASE = BASE + (MONTO * CANT);
                END
        if (FALTANTE IS NULL) then
            FALTANTE = 0;
        if (BASE IS NULL) then
            BASE = 0;
        if (IVA IS NULL) then
            IVA = 0;
        if ((CEROS = 'S') or (FALTANTE <> 0)) then
            SUSPEND;
        END
    ELSE
        BEGIN
        if (TIPO = 31) then
            FOR SELECT F.FACT_ID, FADE_ITEM, F.PREF_PRE, FACT_NUMERO, FACT_FECHA, FADE_CANT * FADE_FACTOR, (FADE_PRUNIT-FADE_DTOMONTO), FADE_IVAMONTO, D.ARTI_COD, ARTI_DES, ARTI_UNIDAD, A.GRUP_COD, A.SUBG_COD, A.MARC_COD, SUBSTRING(FACT_OBS FROM 1 FOR 255)
                FROM FACTURAS F, FACTURAS_DETALLE D, ARTICULO A, PREFIJOS P
                WHERE F.FACT_ID = D.FACT_ID AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN  AND TERC_NIT = :NIT AND FACT_ANULADO = 'N' AND
                      D.ARTI_COD = A.ARTI_COD AND D.ARTI_COD >= :CODINI AND D.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
                      P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND ((P.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) and f.fact_sucursal = :sucursal and substring(a.arti_cod from 1 FOR 2) <> '.t'
                ORDER BY D.ARTI_COD, F.FACT_ID, FADE_ITEM
                INTO :ID, :ITEM, :PREFIJO, :NUMERO, :FECHA, :CANTIDAD, :BASE, :IVA, :ARTICULO, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :OBS
                DO
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    EXECUTE PROCEDURE FALTANTE(:TIPO, :DESTINO, :ID, :ITEM) returning_values (:FALTANTE, :UNIDAD, :FACTOR);
                    if ((CEROS = 'S') or (FALTANTE <> 0)) then
                        SUSPEND;
                    END
        if (TIPO = 32) then
            FOR SELECT R.REVT_ID, RVDE_ITEM, R.PREF_PRE, REVT_NUMERO, REVT_FECHA, RVDE_CANT * RVDE_FACTOR, (RVDE_PRUNIT-RVDE_DTOMONTO), RVDE_IVAMONTO, D.ARTI_COD, ARTI_DES, ARTI_UNIDAD, A.GRUP_COD, A.SUBG_COD, A.MARC_COD, SUBSTRING(REVT_OBS FROM 1 FOR 255)
                FROM REMISIONES_VENTA R, REMISIONES_VENTA_DETALLE D, ARTICULO A, PREFIJOS P
                WHERE R.REVT_ID = D.REVT_ID AND REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN AND TERC_NIT = :NIT AND REVT_ANULADO = 'N' AND
                      D.ARTI_COD = A.ARTI_COD AND D.ARTI_COD >= :CODINI AND D.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
                      P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = 33 AND ((P.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) and r.revt_sucursal = :sucursal
                ORDER BY D.ARTI_COD, R.REVT_ID, RVDE_ITEM
                INTO :ID, :ITEM, :PREFIJO, :NUMERO, :FECHA, :CANTIDAD, :BASE, :IVA, :ARTICULO, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :OBS
                DO
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    EXECUTE PROCEDURE FALTANTE(:TIPO, :DESTINO, :ID, :ITEM) returning_values (:FALTANTE, :UNIDAD, :FACTOR);
                    if ((CEROS = 'S') or (FALTANTE <> 0)) then
                        SUSPEND;
                    END
        if (TIPO = 34) then
            FOR SELECT P.PEDI_ID, PEDE_ITEM, P.PREF_PRE, PEDI_NUMERO, PEDI_FECHA, PEDE_CANT * PEDE_FACTOR, (PEDE_PRUNIT-PEDE_DTOMONTO), PEDE_IVAMONTO, D.ARTI_COD, ARTI_DES, ARTI_UNIDAD, A.GRUP_COD, A.SUBG_COD, A.MARC_COD, SUBSTRING(PEDI_OBS FROM 1 FOR 255)
                FROM PEDIDOS P, PEDIDOS_DETALLE D, ARTICULO A, PREFIJOS PR
                WHERE P.PEDI_ID = D.PEDI_ID AND PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND TERC_NIT = :NIT AND PEDI_ANULADO = 'N' AND
                      D.ARTI_COD = A.ARTI_COD AND D.ARTI_COD >= :CODINI AND D.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
                      P.PREF_PRE = PR.PREF_PRE AND PR.TIDO_COD = 34 AND ((PR.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) and p.pedi_sucursal = :sucursal
                ORDER BY D.ARTI_COD, P.PEDI_ID, PEDE_ITEM
                INTO :ID, :ITEM, PREFIJO, :NUMERO, :FECHA, :CANTIDAD, :BASE, :IVA, :ARTICULO, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :OBS
                DO
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    EXECUTE PROCEDURE FALTANTE(:TIPO, :DESTINO, :ID, :ITEM) returning_values (:FALTANTE, :UNIDAD, :FACTOR);
                    if ((CEROS = 'S') or (FALTANTE <> 0)) then
                        SUSPEND;
                    END
        if (TIPO = 35) then
            FOR SELECT C.COTI_ID, CTDE_ITEM, C.PREF_PRE, COTI_NUMERO, COTI_FECHA, CTDE_CANT * CTDE_FACTOR, (CTDE_PRUNIT-CTDE_DTOMONTO), CTDE_IVAMONTO, D.ARTI_COD, ARTI_DES, ARTI_UNIDAD, A.GRUP_COD, A.SUBG_COD, A.MARC_COD, SUBSTRING(COTI_OBS FROM 1 FOR 255)
                FROM COTIZACIONES C, COTIZACIONES_DETALLE D, ARTICULO A, PREFIJOS P
                WHERE C.COTI_ID = D.COTI_ID AND COTI_FECHA >= :FECINI AND COTI_FECHA <= :FECFIN AND TERC_NIT = :NIT AND COTI_ANULADO = 'N' AND
                      D.ARTI_COD = A.ARTI_COD AND D.ARTI_COD >= :CODINI AND D.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
                      P.PREF_PRE = C.PREF_PRE AND P.TIDO_COD = 35 AND ((P.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) and c.coti_sucursal = :sucursal
                ORDER BY D.ARTI_COD, C.COTI_ID, CTDE_ITEM
                INTO :ID, :ITEM, PREFIJO, :NUMERO, :FECHA, :CANTIDAD, :BASE, :IVA, :ARTICULO, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :OBS
                DO
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    EXECUTE PROCEDURE FALTANTE(:TIPO, :DESTINO, :ID, :ITEM) returning_values (:FALTANTE, :UNIDAD, :FACTOR);
                    if ((CEROS = 'S') or (FALTANTE <> 0)) then
                        SUSPEND;
                    END
        END
    END
END

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE REP_FALTANTES_COMPRA(
    TIPOORI INTEGER,
    FECINI DATE,
    FECFIN DATE,
    TIPODES INTEGER,
    CEROS CHAR(1),
    SUBEMPRESA INTEGER)
RETURNS (
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    NIT VARCHAR(20),
    NOMCLIENTE VARCHAR(60),
    NROPROV VARCHAR(8),
    VENCE DATE,
    ARTICULO VARCHAR(15),
    DESCRIPCION VARCHAR(60),
    CANTIDAD NUMERIC(18,4),
    UNIDAD VARCHAR(8),
    PRECIO NUMERIC(18,2),
    FALTANTE NUMERIC(18,4))
AS
declare variable ID INTEGER;
declare variable ITEM INTEGER;
declare variable FACTOR NUMERIC(18,4);
BEGIN
if (TIPOORI = 22) then
    FOR SELECT R.REPR_ID, R.PREF_PRE, REPR_NUMERO, REPR_FECHA, REPR_FECHA VENCE, RPVD_ITEM, R.TERC_NIT, TERC_NOM, ARTI_COD, SUBSTR(RPVD_DESC,1,60), RPVD_UNIDAD, RPVD_CANT, RPVD_PRUNIT, REPR_NUMPROV
      FROM REMISION_PROVEEDOR R, REMISION_PROVEEDOR_DET D, TERCEROS T, PREFIJOS P
      WHERE R.REPR_ID = D.REPR_ID AND REPR_FECHA >= :FECINI AND REPR_FECHA <= :FECFIN AND T.TERC_NIT = R.TERC_NIT and REPR_ANULADO = 'N'
       AND P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = 22 AND ((P.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
      ORDER BY REPR_FECHA, R.PREF_PRE, REPR_NUMERO, RPVD_ITEM
      INTO :ID, :PREFIJO, :NUMERO, :FECHA, :VENCE, :ITEM, :NIT, :NOMCLIENTE, :ARTICULO, :DESCRIPCION, :UNIDAD, :CANTIDAD, :PRECIO, :nroprov
      DO
        BEGIN
        EXECUTE PROCEDURE FALTANTE(:TIPOORI, :TIPODES, :ID,  :ITEM) returning_values (:FALTANTE, :UNIDAD, :FACTOR);
        if ((CEROS = 'S') or (FALTANTE <> 0)) then
          SUSPEND;
        END
if (TIPOORI = 23) then
    FOR SELECT O.ORDC_ID, O.PREF_PRE, ORDC_NUMERO, ORDC_FECHA, (ORDC_FECHA + ORDC_VALIDEZ), OCDE_ITEM, O.TERC_NIT, TERC_NOM, ARTI_COD, SUBSTR(OCDE_DESC,1,60), OCDE_UNIDAD, OCDE_CANT, OCDE_PRUNIT
      FROM ORDENES_COMPRA O, ORDENES_COMPRA_DETALLE D, TERCEROS T, PREFIJOS P
      WHERE O.ORDC_ID = D.ORDC_ID AND ORDC_FECHA >= :FECINI AND ORDC_FECHA <= :FECFIN AND T.TERC_NIT = O.TERC_NIT AND ORDC_ANULADO = 'N'
       AND P.PREF_PRE = O.PREF_PRE AND P.TIDO_COD = 23 AND ((P.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
      ORDER BY ORDC_FECHA, O.PREF_PRE, ORDC_NUMERO, OCDE_ITEM
      INTO :ID, :PREFIJO, :NUMERO, :FECHA, :VENCE, :ITEM, :NIT, :NOMCLIENTE, :ARTICULO, :DESCRIPCION, :UNIDAD, :CANTIDAD, :PRECIO
      DO
        BEGIN
        nroprov = '';
        EXECUTE PROCEDURE FALTANTE(:TIPOORI, :TIPODES, :ID,  :ITEM) returning_values (:FALTANTE, :UNIDAD, :FACTOR);
        if ((CEROS = 'S') or (FALTANTE <> 0)) then
          SUSPEND;
        END
if (TIPOORI = 25) then
    FOR SELECT C.COPR_ID, C.PREF_PRE, COPR_NUMERO, COPR_FECHA, (COPR_FECHA + COPR_VALIDEZ), CPRD_ITEM, C.TERC_NIT, TERC_NOM, ARTI_COD, SUBSTR(CPRD_DESC,1,60), CPRD_UNIDAD, CPRD_CANT, CPRD_PRUNIT
      FROM COTIZACION_PROVEEDOR C, COTIZACIONES_PROVEEDOR_DET D, TERCEROS T, PREFIJOS P
      WHERE C.COPR_ID = D.COPR_ID AND COPR_FECHA >= :FECINI AND COPR_FECHA <= :FECFIN AND T.TERC_NIT = C.TERC_NIT AND COPR_ANULADO = 'N'
       AND P.PREF_PRE = C.PREF_PRE AND P.TIDO_COD = 25 AND ((P.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
      ORDER BY COPR_FECHA, PREF_PRE, COPR_NUMERO, CPRD_ITEM
      INTO :ID, :PREFIJO, :NUMERO, :FECHA, :VENCE, :ITEM, :NIT, :NOMCLIENTE, :ARTICULO, :DESCRIPCION, :UNIDAD, :CANTIDAD, :PRECIO
      DO
        BEGIN
        nroprov = '';
        EXECUTE PROCEDURE FALTANTE(:TIPOORI, :TIPODES, :ID,  :ITEM) returning_values (:FALTANTE, :UNIDAD, :FACTOR);
        if ((CEROS = 'S') or (FALTANTE <> 0)) then
          SUSPEND;
        END
END

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE REP_FALTANTES_PROVEEDOR(
    TERINI VARCHAR(20),
    TERFIN VARCHAR(20),
    FECINI DATE,
    FECFIN DATE,
    DETALLE CHAR(1),
    TIPO INTEGER,
    DESTINO INTEGER,
    ARTINI VARCHAR(15),
    ARTFIN VARCHAR(15),
    ORDEN CHAR(1),
    CEROS CHAR(1),
    SUBEMPRESA INTEGER)
RETURNS (
    NIT VARCHAR(20),
    NOMBRE VARCHAR(60),
    TELEFONO VARCHAR(40),
    CIUDAD VARCHAR(40),
    CODZONA VARCHAR(2),
    NOMZONA VARCHAR(30),
    NOMTIPO VARCHAR(50),
    ARTICULO VARCHAR(15),
    DESCRIPCION VARCHAR(60),
    CODGRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    CODSUBG VARCHAR(3),
    NOMSUBG VARCHAR(30),
    CODMARC VARCHAR(3),
    NOMMARC VARCHAR(30),
    CANTIDAD NUMERIC(18,4),
    UNIDAD VARCHAR(8),
    FALTANTE NUMERIC(18,4),
    BASE NUMERIC(18,2),
    IVA NUMERIC(18,2),
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(6),
    NROPROV VARCHAR(8),
    FECHA DATE)
AS
declare variable ID INTEGER;
declare variable ITEM INTEGER;
declare variable CANT NUMERIC(18,4);
declare variable MONTO NUMERIC(18,2);
declare variable FACTOR NUMERIC(18,4);
declare variable CODINI VARCHAR(15);
declare variable CODFIN VARCHAR(15);
declare variable DESINI VARCHAR(15);
declare variable DESFIN VARCHAR(15);
BEGIN
if (ORDEN = 'C') then
    BEGIN
    CODINI = ARTINI;
    CODFIN = ARTFIN;
    DESINI = '';
    DESFIN = 'zz';
    END
ELSE
    BEGIN
    DESINI = ARTINI;
    DESFIN = ARTFIN;
    CODINI = '';
    CODFIN = 'zz';
    END
SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = :TIPO INTO :NOMTIPO;
FOR select T.TERC_NIT, TERC_NOM,  TERC_TEL, TERC_CIU, P.GRPR_COD
    from terceros T, PROVEEDORES P
    where P.TERC_NIT = T.TERC_NIT AND TERC_PROV = 'S' and T.TERC_NIT >= :TERINI AND T.TERC_NIT <= :TERFIN
    INTO :NIT, :NOMBRE, :TELEFONO, :CIUDAD, :CODZONA
    DO  
    BEGIN
    select GRPR_NOM from GRUPOS_PROVEEDORES where GRPR_COD = :CODZONA INTO :NOMZONA;
    FOR SELECT ARTI_COD, ARTI_DES, ARTI_UNIDAD, A.GRUP_COD, A.SUBG_COD, A.MARC_COD FROM ARTICULO A
        WHERE ARTI_COD >= :CODINI AND ARTI_COD <= :CODFIN AND ARTI_DES >= :DESINI AND ARTI_DES <= :DESFIN
      INTO :ARTICULO, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
    DO
      BEGIN
      SELECT GRUP_NOM FROM GRUPO WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
      SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
      SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
      if (DETALLE = 'N') then
        BEGIN
        FALTANTE = 0;
        CANTIDAD = 0;
        BASE = 0;
        if (TIPO = 21) then
            FOR SELECT F.FACO_ID, FCDE_ITEM, FCDE_CANT, (FCDE_PRUNIT-FCDE_DTOMONTO), FACO_NUMPROV
                FROM FACTURAS_COMPRAS_DETALLE D, FACTURAS_COMPRA F, PREFIJOS P
                WHERE F.FACO_ID = D.FACO_ID AND ARTI_COD = :ARTICULO AND FACO_FECHA >= :FECINI AND FACO_FECHA < :FECFIN AND TERC_NIT = :NIT AND FACO_ANULADO = 'N'
                 AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 21 AND ((P.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                ORDER BY F.FACO_ID, FCDE_ITEM INTO :ID, :ITEM, :CANT, :MONTO, :nroprov
                DO
                BEGIN
                CANTIDAD = CANTIDAD + CANT;
                EXECUTE PROCEDURE FALTANTE(:TIPO, :DESTINO, :ID, :ITEM) returning_values (:CANT, :UNIDAD, :FACTOR);
                FALTANTE = FALTANTE + CANT;
                BASE = BASE + MONTO;
                END
        if (TIPO = 22) then
            FOR SELECT R.REPR_ID, RPVD_ITEM, RPVD_CANT, (RPVD_PRUNIT-RPVD_DTOMONTO), REPR_NUMPROV
                FROM REMISION_PROVEEDOR_DET D, REMISION_PROVEEDOR R, PREFIJOS P
                WHERE R.REPR_ID = D.REPR_ID AND ARTI_COD = :ARTICULO AND REPR_FECHA >= :FECINI AND REPR_FECHA < :FECFIN AND TERC_NIT = :NIT AND REPR_ANULADO = 'N'
                 AND P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = 22 AND ((P.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                ORDER BY R.REPR_ID, RPVD_ITEM INTO :ID, :ITEM, :CANT, :MONTO, :nroprov
                do
                BEGIN
                CANTIDAD = CANTIDAD + CANT;
                EXECUTE PROCEDURE FALTANTE(:TIPO, :DESTINO, :ID, :ITEM) returning_values (:CANT, :UNIDAD, :FACTOR);
                FALTANTE = FALTANTE + CANT;
                BASE = BASE + MONTO;
                END
        if (TIPO = 23) then
            FOR SELECT O.ORDC_ID, OCDE_ITEM, OCDE_CANT, (OCDE_PRUNIT-OCDE_DTOMONTO)
                FROM ORDENES_COMPRA_DETALLE D, ORDENES_COMPRA O, PREFIJOS P
                WHERE O.ORDC_ID = D.ORDC_ID AND ARTI_COD = :ARTICULO AND ORDC_FECHA >= :FECINI AND ORDC_FECHA < :FECFIN AND TERC_NIT = :NIT AND ORDC_ANULADO = 'N'
                 AND P.PREF_PRE = O.PREF_PRE AND P.TIDO_COD = 23 AND ((P.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                ORDER BY O.ORDC_ID, OCDE_ITEM INTO :ID, :ITEM, :CANT, :MONTO
                DO
                BEGIN
                NROPROV = '';
                CANTIDAD = CANTIDAD + CANT;
                EXECUTE PROCEDURE FALTANTE(:TIPO, :DESTINO, :ID, :ITEM) returning_values (:CANT, :UNIDAD, :FACTOR);
                FALTANTE = FALTANTE + CANT;
                BASE = BASE + MONTO;
                END
        if (TIPO = 25) then
            FOR SELECT C.COPR_ID, CPRD_ITEM, CPRD_CANT, (CPRD_PRUNIT-CPRD_DTOMONTO)
                FROM COTIZACIONES_PROVEEDOR_DET D, COTIZACION_PROVEEDOR C, PREFIJOS P
                WHERE C.COPR_ID = D.COPR_ID AND ARTI_COD = :ARTICULO AND COPR_FECHA >= :FECINI AND COPR_FECHA < :FECFIN AND TERC_NIT = :NIT AND COPR_ANULADO = 'N'
                 AND P.PREF_PRE = C.PREF_PRE AND P.TIDO_COD = 25 AND ((P.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                ORDER BY C.COPR_ID, CPRD_ITEM INTO :ID, :ITEM, :CANT, :MONTO
                DO
                BEGIN
                NROPROV = '';
                CANTIDAD = CANTIDAD + CANT;
                EXECUTE PROCEDURE FALTANTE(:TIPO, :DESTINO, :ID, :ITEM) returning_values (:CANT, :UNIDAD, :FACTOR);
                FALTANTE = FALTANTE + CANT;
                BASE = BASE + MONTO;
                END
        if (FALTANTE IS NULL) then
            FALTANTE = 0;
        if (BASE IS NULL) then
            BASE = 0;
        if (CEROS = 'S') then
            SUSPEND;
        ELSE
            if (FALTANTE <> 0) then
                SUSPEND;
        END
      ELSE
        BEGIN
        if (TIPO = 21) then
            FOR SELECT F.FACO_ID, FCDE_ITEM, F.PREF_PRE, FACO_NUMERO, FACO_FECHA, FCDE_CANT * FCDE_FACTOR, (FCDE_PRUNIT-FCDE_DTOMONTO) * FCDE_CANT, FCDE_IVAMONTO, FACO_NUMPROV
                FROM FACTURAS_COMPRA F, FACTURAS_COMPRAS_DETALLE D, PREFIJOS P
                WHERE F.FACO_ID = D.FACO_ID AND ARTI_COD = :ARTICULO AND FACO_FECHA >= :FECINI AND FACO_FECHA < :FECFIN  AND TERC_NIT = :NIT AND FACO_ANULADO = 'N'
                 AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 21 AND ((P.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                INTO :ID, :ITEM, :PREFIJO, :NUMERO, :FECHA, :CANTIDAD, :BASE, :IVA, :nroprov
                DO
                    BEGIN
                    EXECUTE PROCEDURE FALTANTE(:TIPO, :DESTINO, :ID, :ITEM) returning_values (:FALTANTE, :UNIDAD, :FACTOR);
                    if ((CEROS = 'S') or (FALTANTE <> 0)) then
                      SUSPEND;
                    END
        if (TIPO = 22) then
            FOR SELECT R.REPR_ID, RPVD_ITEM, R.PREF_PRE, REPR_NUMERO, REPR_FECHA, RPVD_CANT * RPVD_FACTOR, (RPVD_PRUNIT-RPVD_DTOMONTO) * RPVD_CANT, RPVD_IVAMONTO, REPR_NUMPROV
                FROM REMISION_PROVEEDOR R, REMISION_PROVEEDOR_DET D, PREFIJOS P
                WHERE R.REPR_ID = D.REPR_ID AND ARTI_COD = :ARTICULO AND REPR_FECHA >= :FECINI AND REPR_FECHA < :FECFIN AND TERC_NIT = :NIT AND REPR_ANULADO = 'N'
                 AND P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = 22 AND ((P.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                INTO :ID, :ITEM, :PREFIJO, :NUMERO, :FECHA, :CANTIDAD, :BASE, :IVA, :nroprov
                DO
                    BEGIN
                    EXECUTE PROCEDURE FALTANTE(:TIPO, :DESTINO, :ID, :ITEM) returning_values (:FALTANTE, :UNIDAD, :FACTOR);
                    if ((CEROS = 'S') or (FALTANTE <> 0)) then
                      SUSPEND;
                    END
        if (TIPO = 23) then
            FOR SELECT O.ORDC_ID, OCDE_ITEM, O.PREF_PRE, ORDC_NUMERO, ORDC_FECHA, OCDE_CANT * OCDE_FACTOR, (OCDE_PRUNIT-OCDE_DTOMONTO) * OCDE_CANT, OCDE_IVAMONTO
                FROM ORDENES_COMPRA O, ORDENES_COMPRA_DETALLE D, PREFIJOS P
                WHERE O.ORDC_ID = D.ORDC_ID AND ARTI_COD = :ARTICULO AND ORDC_FECHA >= :FECINI AND ORDC_FECHA < :FECFIN AND TERC_NIT = :NIT AND ORDC_ANULADO = 'N'
                 AND P.PREF_PRE = O.PREF_PRE AND P.TIDO_COD = 23 AND ((P.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                INTO :ID, :ITEM, :PREFIJO, :NUMERO, :FECHA, :CANTIDAD, :BASE, :IVA
                DO
                    BEGIN
                    nroprov = '';
                    EXECUTE PROCEDURE FALTANTE(:TIPO, :DESTINO, :ID, :ITEM) returning_values (:FALTANTE, :UNIDAD, :FACTOR);
                    if ((CEROS = 'S') or (FALTANTE <> 0) ) then
                      SUSPEND;
                    END
        if (TIPO = 25) then
            FOR SELECT C.COPR_ID, CPRD_ITEM, C.PREF_PRE, C.COPR_NUMERO, COPR_FECHA, CPRD_CANT * CPRD_FACTOR, (CPRD_PRUNIT-CPRD_DTOMONTO) * CPRD_CANT, CPRD_IVAMONTO
                FROM COTIZACION_PROVEEDOR C, COTIZACIONES_PROVEEDOR_DET D, PREFIJOS P
                WHERE C.COPR_ID = D.COPR_ID AND ARTI_COD = :ARTICULO AND COPR_FECHA >= :FECINI AND COPR_FECHA < :FECFIN AND TERC_NIT = :NIT AND COPR_ANULADO = 'N'
                 AND P.PREF_PRE = C.PREF_PRE AND P.TIDO_COD = 25 AND ((P.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                INTO :ID, :ITEM, :PREFIJO, :NUMERO, :FECHA, :CANTIDAD, :BASE, :IVA
                DO
                    BEGIN
                    nroprov = '';
                    EXECUTE PROCEDURE FALTANTE(:TIPO, :DESTINO, :ID, :ITEM) returning_values (:FALTANTE, :UNIDAD, :FACTOR);
                    if ((CEROS = 'S') or (FALTANTE <> 0)) then
                      SUSPEND;
                    END
        END
      END
    END
END

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE REP_FALTANTES_VENDEDOR(
    VENINI VARCHAR(20),
    VENFIN VARCHAR(20),
    FECINI DATE,
    FECFIN DATE,
    DETALLE CHAR(1),
    TIPO INTEGER,
    DESTINO INTEGER,
    ARTINI VARCHAR(15),
    ARTFIN VARCHAR(15),
    ORDEN CHAR(1),
    CEROS CHAR(1),
    SUBEMPRESA INTEGER)
RETURNS (
    CODVEND VARCHAR(20),
    NOMVEND VARCHAR(60),
    NOMTIPO VARCHAR(50),
    ARTICULO VARCHAR(15),
    DESCRIPCION VARCHAR(60),
    CODGRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    CODSUBG VARCHAR(3),
    NOMSUBG VARCHAR(30),
    CODMARC VARCHAR(3),
    NOMMARC VARCHAR(30),
    CANTIDAD NUMERIC(18,4),
    UNIDAD VARCHAR(8),
    FALTANTE NUMERIC(18,4),
    BASE NUMERIC(18,2),
    IVA NUMERIC(18,2),
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    OBS VARCHAR(255))
AS
declare variable ID INTEGER;
declare variable ITEM INTEGER;
declare variable CODINI VARCHAR(15);
declare variable CODFIN VARCHAR(15);
declare variable DESINI VARCHAR(15);
declare variable DESFIN VARCHAR(15);
declare variable FACTOR NUMERIC(18,4);
declare variable CANT NUMERIC(18,4);
declare variable MONTO NUMERIC(18,2);
declare variable artiaux VARCHAR(20);
BEGIN
if (ORDEN = 'C') then
    BEGIN
    CODINI = ARTINI;
    CODFIN = ARTFIN;
    DESINI = '';
    DESFIN = 'zz';
    END
ELSE
    BEGIN
    DESINI = ARTINI;
    DESFIN = ARTFIN;
    CODINI = '';
    CODFIN = 'zz';
    END

  SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = :TIPO INTO :NOMTIPO;
  /*FOR select VEND_COD, VEND_NOMBRE
    from VENDEDORES where VEND_COD >= :VENINI AND VEND_COD <= :VENFIN
    INTO :CODVEND, :NOMVEND
    DO  
    BEGIN*/
    if (DETALLE = 'N') then
        BEGIN
        ARTICULO = '';
        if (TIPO = 31) then
            FOR SELECT F.FACT_ID, FADE_ITEM, D.ARTI_COD, FADE_CANT * FADE_FACTOR, (FADE_PRUNIT-FADE_DTOMONTO),f.vend_cod
                FROM FACTURAS_DETALLE D, FACTURAS F, ARTICULO A, PREFIJOS P
                WHERE F.FACT_ID = D.FACT_ID AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND VEND_COD >= :VENINI AND VEND_COD <= :VENFIN AND FACT_ANULADO = 'N' AND
                      D.ARTI_COD = A.ARTI_COD AND D.ARTI_COD >= :CODINI AND D.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
                      P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND ((P.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) and substring(a.arti_cod from 1 FOR 2) <> '.t'
                ORDER BY VEND_COD,ARTI_COD, F.FACT_ID, FADE_ITEM INTO :ID, :ITEM, :ARTIAUX, :CANT,  :MONTO,:CODVEND
                DO
                BEGIN
                select VEND_NOMBRE from VENDEDORES where  VEND_COD = :CODVEND INTO :NOMVEND;
                if (artiaux <> articulo) then
                    begin
                    if (ARTICULO <> '') then
                      if ((CEROS = 'S') or (FALTANTE <> 0)) then
                        SUSPEND;
                    SELECT ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                        FROM articulo WHERE ARTI_COD = :ARTIAUX
                        INTO :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC;
                    SELECT GRUP_NOM FROM GRUPO WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    ARTICULO = ARTIAUX;
                    CANTIDAD = 0;
                    FALTANTE = 0;
                    BASE = 0;
                    end
                CANTIDAD = CANTIDAD + CANT;
                EXECUTE PROCEDURE FALTANTE(:TIPO, :DESTINO, :ID, :ITEM) returning_values (:CANT, :UNIDAD, :FACTOR);
                FALTANTE = FALTANTE + CANT;
                BASE = BASE + (MONTO * CANT);
                END
        if (TIPO = 32) then
            FOR SELECT R.revt_id, rvde_item, D.ARTI_COD, RVDE_CANT * RVDE_FACTOR, (RVDE_PRUNIT-RVDE_DTOMONTO),R.vend_cod
                FROM REMISIONES_VENTA_DETALLE D, REMISIONES_VENTA R, ARTICULO A, PREFIJOS P
                WHERE R.REVT_ID = D.REVT_ID AND REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN AND VEND_COD >= :VENINI AND VEND_COD <= :VENFIN AND REVT_ANULADO = 'N' AND
                      D.ARTI_COD = A.ARTI_COD AND D.ARTI_COD >= :CODINI AND D.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
                      P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = 32 AND ((P.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                ORDER BY VEND_COD,ARTI_COD, R.REVT_ID, RVDE_ITEM INTO :ID, :ITEM, :ARTIAUX, :CANT, :MONTO,:CODVEND
                DO
                BEGIN
                select VEND_NOMBRE from VENDEDORES where  VEND_COD = :CODVEND INTO :NOMVEND;
                if (artiaux <> articulo) then
                    begin
                    if (ARTICULO <> '') then
                      if ((CEROS = 'S') or (FALTANTE <> 0)) then
                        SUSPEND;
                    SELECT ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                        FROM articulo WHERE ARTI_COD = :ARTIAUX
                        INTO :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC;
                    SELECT GRUP_NOM FROM GRUPO WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    ARTICULO = ARTIAUX;
                    CANTIDAD = 0;
                    FALTANTE = 0;
                    BASE = 0;
                    end
                CANTIDAD = CANTIDAD + CANT;
                EXECUTE PROCEDURE FALTANTE(:TIPO, :DESTINO, :ID, :ITEM) returning_values (:CANT, :UNIDAD, :FACTOR);
                FALTANTE = FALTANTE + CANT;
                BASE = BASE + (MONTO * CANT);
                END
        if (TIPO = 34) then
            FOR SELECT P.PEDI_ID, PEDE_ITEM, D.ARTI_COD, PEDE_CANT * PEDE_FACTOR, (PEDE_PRUNIT-PEDE_DTOMONTO),p.vend_cod
                FROM PEDIDOS_DETALLE D, PEDIDOS P, ARTICULO A, PREFIJOS PR
                WHERE P.PEDI_ID = D.PEDI_ID AND PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND VEND_COD >= :VENINI AND VEND_COD <= :VENFIN AND PEDI_ANULADO = 'N' AND
                      D.ARTI_COD = A.ARTI_COD AND D.ARTI_COD >= :CODINI AND D.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
                      PR.PREF_PRE = P.PREF_PRE AND PR.TIDO_COD = 34 AND ((PR.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                ORDER BY VEND_COD,ARTI_COD, P.PEDI_ID, PEDE_ITEM INTO :ID, :ITEM, :ARTIAUX, :CANT, :MONTO,:CODVEND
                DO
                BEGIN
                select VEND_NOMBRE from VENDEDORES where  VEND_COD = :CODVEND INTO :NOMVEND;
                if (artiaux <> articulo) then
                    begin
                    if (ARTICULO <> '') then
                      if ((CEROS = 'S') or (FALTANTE <> 0)) then
                        SUSPEND;
                    SELECT ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                        FROM articulo WHERE ARTI_COD = :ARTIAUX
                        INTO :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC;
                    SELECT GRUP_NOM FROM GRUPO WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    ARTICULO = ARTIAUX;
                    CANTIDAD = 0;
                    FALTANTE = 0;
                    BASE = 0;
                    end
                CANTIDAD = CANTIDAD + CANT;
                EXECUTE PROCEDURE FALTANTE(:TIPO, :DESTINO, :ID, :ITEM) returning_values (:CANT, :UNIDAD, :FACTOR);
                FALTANTE = FALTANTE + CANT;
                BASE = BASE + (MONTO * CANT);
                END
        if (TIPO = 35) then
            FOR SELECT C.COTI_ID, CTDE_ITEM, D.ARTI_COD, CTDE_CANT * CTDE_FACTOR, (CTDE_PRUNIT-CTDE_DTOMONTO),c.vend_cod
                FROM COTIZACIONES_DETALLE D, COTIZACIONES C, ARTICULO A, PREFIJOS P
                WHERE C.COTI_ID = D.COTI_ID AND COTI_FECHA >= :FECINI AND COTI_FECHA <= :FECFIN AND VEND_COD >= :VENINI AND VEND_COD <= :VENFIN AND COTI_ANULADO = 'N' AND
                      D.ARTI_COD = A.ARTI_COD AND D.ARTI_COD >= :CODINI AND D.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
                      P.PREF_PRE = C.PREF_PRE AND P.TIDO_COD = 35 AND ((P.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                ORDER BY VEND_COD,ARTI_COD, C.COTI_ID, CTDE_ITEM INTO :ID, :ITEM, :ARTIAUX, :CANT, :MONTO,:CODVEND
                DO
                BEGIN
                select VEND_NOMBRE from VENDEDORES where  VEND_COD = :CODVEND INTO :NOMVEND;
                if (artiaux <> articulo) then
                    begin
                    if (ARTICULO <> '') then
                      if ((CEROS = 'S') or (FALTANTE <> 0)) then
                        SUSPEND;
                    SELECT ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                        FROM articulo WHERE ARTI_COD = :ARTIAUX
                        INTO :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC;
                    SELECT GRUP_NOM FROM GRUPO WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    ARTICULO = ARTIAUX;
                    CANTIDAD = 0;
                    FALTANTE = 0;
                    BASE = 0;
                    end
                CANTIDAD = CANTIDAD + CANT;
                EXECUTE PROCEDURE FALTANTE(:TIPO, :DESTINO, :ID, :ITEM) returning_values (:CANT, :UNIDAD, :FACTOR);
                FALTANTE = FALTANTE + CANT;
                BASE = BASE + (MONTO * CANT);
                END
        if (FALTANTE IS NULL) then
            FALTANTE = 0;
        if (BASE IS NULL) then
            BASE = 0;
        if (IVA IS NULL) then
            IVA = 0;
        if ((CEROS = 'S') or (FALTANTE <> 0)) then
            SUSPEND;
        END
    ELSE
        BEGIN
        if (TIPO = 31) then
            FOR SELECT F.FACT_ID, FADE_ITEM, F.PREF_PRE, FACT_NUMERO, FACT_FECHA, FADE_CANT * FADE_FACTOR, (FADE_PRUNIT-FADE_DTOMONTO), FADE_IVAMONTO, D.ARTI_COD, ARTI_DES, ARTI_UNIDAD, A.GRUP_COD, A.SUBG_COD, A.MARC_COD,f.vend_cod, SUBSTRING(FACT_OBS FROM 1 FOR 255)
                FROM FACTURAS F, FACTURAS_DETALLE D, ARTICULO A, PREFIJOS P
                WHERE F.FACT_ID = D.FACT_ID AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN  AND VEND_COD >= :VENINI AND VEND_COD <= :VENFIN AND FACT_ANULADO = 'N' AND
                      D.ARTI_COD = A.ARTI_COD AND D.ARTI_COD >= :CODINI AND D.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
                      P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND ((P.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) and substring(a.arti_cod from 1 FOR 2) <> '.t'
                ORDER BY VEND_COD,ARTI_COD, F.FACT_ID, FADE_ITEM
                INTO :ID, :ITEM, :PREFIJO, :NUMERO, :FECHA, :CANTIDAD, :BASE, :IVA, :ARTICULO, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC,:CODVEND, :OBS
                DO
                    BEGIN
                    select VEND_NOMBRE from VENDEDORES where  VEND_COD = :CODVEND INTO :NOMVEND;
                    SELECT GRUP_NOM FROM GRUPO WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    EXECUTE PROCEDURE FALTANTE(:TIPO, :DESTINO, :ID, :ITEM) returning_values (:FALTANTE, :UNIDAD, :FACTOR);
                    if ((CEROS = 'S') or (FALTANTE <> 0)) then
                        SUSPEND;
                    END
        if (TIPO = 32) then
            FOR SELECT R.REVT_ID, RVDE_ITEM, R.PREF_PRE, REVT_NUMERO, REVT_FECHA, RVDE_CANT * RVDE_FACTOR, (RVDE_PRUNIT-RVDE_DTOMONTO), RVDE_IVAMONTO, D.ARTI_COD, ARTI_DES, ARTI_UNIDAD, A.GRUP_COD, A.SUBG_COD, A.MARC_COD,R.vend_cod, SUBSTRING(REVT_OBS FROM 1 FOR 255)
                FROM REMISIONES_VENTA R, REMISIONES_VENTA_DETALLE D, ARTICULO A, PREFIJOS P
                WHERE R.REVT_ID = D.REVT_ID AND REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN AND VEND_COD >= :VENINI AND VEND_COD <= :VENFIN AND REVT_ANULADO = 'N' AND
                      D.ARTI_COD = A.ARTI_COD AND D.ARTI_COD >= :CODINI AND D.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
                      P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = 33 AND ((P.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                ORDER BY VEND_COD,ARTI_COD, R.REVT_ID, RVDE_ITEM
                INTO :ID, :ITEM, :PREFIJO, :NUMERO, :FECHA, :CANTIDAD, :BASE, :IVA, :ARTICULO, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC,:CODVEND, :OBS
                DO
                    BEGIN
                    select VEND_NOMBRE from VENDEDORES where  VEND_COD = :CODVEND INTO :NOMVEND;
                    SELECT GRUP_NOM FROM GRUPO WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    EXECUTE PROCEDURE FALTANTE(:TIPO, :DESTINO, :ID, :ITEM) returning_values (:FALTANTE, :UNIDAD, :FACTOR);
                    if ((CEROS = 'S') or (FALTANTE <> 0)) then
                        SUSPEND;
                    END
        if (TIPO = 34) then
            FOR SELECT P.PEDI_ID, PEDE_ITEM, P.PREF_PRE, PEDI_NUMERO, PEDI_FECHA, PEDE_CANT * PEDE_FACTOR, (PEDE_PRUNIT-PEDE_DTOMONTO), PEDE_IVAMONTO, D.ARTI_COD, ARTI_DES, ARTI_UNIDAD, A.GRUP_COD, A.SUBG_COD, A.MARC_COD,P.vend_cod, SUBSTRING(PEDI_OBS FROM 1 FOR 255)
                FROM PEDIDOS P, PEDIDOS_DETALLE D, ARTICULO A, PREFIJOS PR
                WHERE P.PEDI_ID = D.PEDI_ID AND PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND VEND_COD >= :VENINI AND VEND_COD <= :VENFIN AND PEDI_ANULADO = 'N' AND
                      D.ARTI_COD = A.ARTI_COD AND D.ARTI_COD >= :CODINI AND D.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
                      P.PREF_PRE = PR.PREF_PRE AND PR.TIDO_COD = 34 AND ((PR.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                ORDER BY VEND_COD,ARTI_COD, P.PEDI_ID, PEDE_ITEM
                INTO :ID, :ITEM, PREFIJO, :NUMERO, :FECHA, :CANTIDAD, :BASE, :IVA, :ARTICULO, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC,:CODVEND, :OBS
                DO
                    BEGIN
                    select VEND_NOMBRE from VENDEDORES where  VEND_COD = :CODVEND INTO :NOMVEND;
                    SELECT GRUP_NOM FROM GRUPO WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    EXECUTE PROCEDURE FALTANTE(:TIPO, :DESTINO, :ID, :ITEM) returning_values (:FALTANTE, :UNIDAD, :FACTOR);
                    if ((CEROS = 'S') or (FALTANTE <> 0)) then
                        SUSPEND;
                    END
        if (TIPO = 35) then
            FOR SELECT C.COTI_ID, CTDE_ITEM, C.PREF_PRE, COTI_NUMERO, COTI_FECHA, CTDE_CANT * CTDE_FACTOR, (CTDE_PRUNIT-CTDE_DTOMONTO), CTDE_IVAMONTO, D.ARTI_COD, ARTI_DES, ARTI_UNIDAD, A.GRUP_COD, A.SUBG_COD, A.MARC_COD,C.vend_cod, SUBSTRING(COTI_OBS FROM 1 FOR 255)
                FROM COTIZACIONES C, COTIZACIONES_DETALLE D, ARTICULO A, PREFIJOS P
                WHERE C.COTI_ID = D.COTI_ID AND COTI_FECHA >= :FECINI AND COTI_FECHA <= :FECFIN AND VEND_COD >= :VENINI AND VEND_COD <= :VENFIN AND COTI_ANULADO = 'N' AND
                      D.ARTI_COD = A.ARTI_COD AND D.ARTI_COD >= :CODINI AND D.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
                      P.PREF_PRE = C.PREF_PRE AND P.TIDO_COD = 35 AND ((P.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                ORDER BY VEND_COD,ARTI_COD, C.COTI_ID, CTDE_ITEM
                INTO :ID, :ITEM, PREFIJO, :NUMERO, :FECHA, :CANTIDAD, :BASE, :IVA, :ARTICULO, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC,:CODVEND, :OBS
                DO
                    BEGIN
                    select VEND_NOMBRE from VENDEDORES where  VEND_COD = :CODVEND INTO :NOMVEND;
                    SELECT GRUP_NOM FROM GRUPO WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    EXECUTE PROCEDURE FALTANTE(:TIPO, :DESTINO, :ID, :ITEM) returning_values (:FALTANTE, :UNIDAD, :FACTOR);
                    if ((CEROS = 'S') or (FALTANTE <> 0)) then
                        SUSPEND;
                    END
        END
   /* END*/
END

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE REP_FALTANTES_VENTA(
    TIPOORI INTEGER,
    FECINI DATE,
    FECFIN DATE,
    TIPODES INTEGER,
    CEROS CHAR(1),
    DETALLE CHAR(1),
    SUBEMPRESA INTEGER)
RETURNS (
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    NIT VARCHAR(20),
    NOMCLIENTE VARCHAR(60),
    VEND INTEGER,
    NOMVEND VARCHAR(60),
    VENCE DATE,
    ARTICULO VARCHAR(15),
    DESCRIPCION VARCHAR(60),
    CANTIDAD NUMERIC(18,4),
    UNIDAD VARCHAR(8),
    PRECIO NUMERIC(18,2),
    DESCUENTO NUMERIC(9,4),
    FALTANTE NUMERIC(18,4),
    OBS VARCHAR(255),
    NUMCRUCE VARCHAR(10))
AS
declare variable ID INTEGER;
declare variable ITEM INTEGER;
declare variable FACTOR NUMERIC(18,4);
BEGIN
if (detalle = 'S') then
  BEGIN
  if (TIPOORI = 32) then
    FOR SELECT R.REVT_ID, R.PREF_PRE, REVT_NUMERO, REVT_FECHA, REVT_FECHA VENCE, RVDE_ITEM, R.TERC_NIT, REVT_NOMTERC, ARTI_COD, SUBSTR(RVDE_DESC,1,60), RVDE_UNIDAD, RVDE_CANT, RVDE_PRUNIT, RVDE_DTOPORC, SUBSTRING(REVT_OBS FROM 1 FOR 255)
      FROM REMISIONES_VENTA R, REMISIONES_VENTA_DETALLE D, PREFIJOS P
      WHERE R.REVT_ID = D.REVT_ID AND REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN and REVT_ANULADO = 'N'
       AND P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = 32 AND ((P.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
      ORDER BY REVT_FECHA, R.PREF_PRE, REVT_NUMERO, RVDE_ITEM
      INTO :ID, :PREFIJO, :NUMERO, :FECHA, :VENCE, :ITEM, :NIT, :NOMCLIENTE, :ARTICULO, :DESCRIPCION, :UNIDAD, :CANTIDAD, :PRECIO, :DESCUENTO, :OBS
      DO
        BEGIN
        EXECUTE PROCEDURE FALTANTE(:TIPOORI, :TIPODES, :ID,  :ITEM) returning_values (:FALTANTE, :UNIDAD, :FACTOR);
        if ((CEROS = 'N') or (FALTANTE = cantidad)) then
          SUSPEND;
        END
  if (TIPOORI = 34) then
    FOR SELECT P.PEDI_ID, P.PREF_PRE, PEDI_NUMERO, PEDI_FECHA, (PEDI_FECHA + PEDI_VALIDEZ), PEDE_ITEM, P.TERC_NIT, PEDI_NOMTERC, ARTI_COD, SUBSTR(PEDE_DESC,1,60), PEDE_UNIDAD, PEDE_CANT, PEDE_PRUNIT, PEDE_DTOPORC, SUBSTRING(PEDI_OBS FROM 1 FOR 255)
      FROM PEDIDOS P, PEDIDOS_DETALLE D, PREFIJOS PR
      WHERE P.PEDI_ID = D.PEDI_ID AND PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND PEDI_ANULADO = 'N' AND PEDI_VALIDEZ >= 0
       AND PR.PREF_PRE = P.PREF_PRE AND PR.TIDO_COD = 34 AND ((PR.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
      ORDER BY PEDI_FECHA, P.PREF_PRE, PEDI_NUMERO, PEDE_ITEM
      INTO :ID, :PREFIJO, :NUMERO, :FECHA, :VENCE, :ITEM, :NIT, :NOMCLIENTE, :ARTICULO, :DESCRIPCION, :UNIDAD, :CANTIDAD, :PRECIO, :DESCUENTO, :OBS
      DO
        BEGIN
        EXECUTE PROCEDURE FALTANTE(:TIPOORI, :TIPODES, :ID,  :ITEM) returning_values (:FALTANTE, :UNIDAD, :FACTOR);
        if ((CEROS = 'N') or (FALTANTE = cantidad)) then
          SUSPEND;
        END
  if (TIPOORI = 35) then
    FOR SELECT C.COTI_ID, C.PREF_PRE, COTI_NUMERO, COTI_FECHA, (COTI_FECHA + COTI_VALIDEZ), CTDE_ITEM, C.TERC_NIT, COTI_NOMTERC, ARTI_COD, SUBSTR(CTDE_DESC,1,60), CTDE_UNIDAD, CTDE_CANT, CTDE_PRUNIT, CTDE_DTOPORC, SUBSTRING(COTI_OBS FROM 1 FOR 255)
      FROM COTIZACIONES C, COTIZACIONES_DETALLE D, PREFIJOS P
      WHERE C.COTI_ID = D.COTI_ID AND COTI_FECHA >= :FECINI AND COTI_FECHA <= :FECFIN AND COTI_ANULADO = 'N'
       AND P.PREF_PRE = C.PREF_PRE AND P.TIDO_COD = 35 AND ((P.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
      ORDER BY COTI_FECHA, C.PREF_PRE, COTI_NUMERO, CTDE_ITEM
      INTO :ID, :PREFIJO, :NUMERO, :FECHA, :VENCE, :ITEM, :NIT, :NOMCLIENTE, :ARTICULO, :DESCRIPCION, :UNIDAD, :CANTIDAD, :PRECIO, :DESCUENTO, :OBS
      DO
        BEGIN
        EXECUTE PROCEDURE FALTANTE(:TIPOORI, :TIPODES, :ID,  :ITEM) returning_values (:FALTANTE, :UNIDAD, :FACTOR);
        if ((CEROS = 'N') or (FALTANTE = cantidad)) then
          SUSPEND;
        END
  END
ELSE
  BEGIN
  if (TIPOORI = 32) then
    FOR SELECT R.REVT_ID, R.PREF_PRE, REVT_NUMERO, REVT_FECHA, REVT_FECHA VENCE, R.TERC_NIT,
        REVT_NOMTERC, SUBSTRING(REVT_OBS FROM 1 FOR 255), R.VEND_COD, REVT_TOTAL
      FROM REMISIONES_VENTA R, PREFIJOS P
      WHERE REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN and REVT_ANULADO = 'N'
       AND P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = 32 AND ((P.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
      ORDER BY REVT_FECHA, R.PREF_PRE, REVT_NUMERO
      INTO :ID, :PREFIJO, :NUMERO, :FECHA, :VENCE, :NIT, :NOMCLIENTE, :OBS, :VEND, :PRECIO
      DO
        BEGIN
        NUMCRUCE = '';
        SELECT VEND_NOMBRE FROM VENDEDORES WHERE VEND_COD = :VEND INTO :NOMVEND;
        if (TIPODES = 31) then
            SELECT FIRST 1 PREF_PRE || FACT_NUMERO FROM FACTURAS F, consolidado_faltantes C
                WHERE F.fact_consolida = C.cofa_id AND C.cofa_tipoori = 32 AND C.cofa_idori = :ID AND
                C.cofa_tipodes = 31 AND C.cofa_ok = 'S' AND FACT_ANULADO = 'N'
                INTO :numcruce;
        if ((CEROS = 'N') or (NUMCRUCE = '')) then
          SUSPEND;
        END
  if (TIPOORI = 34) then
    FOR SELECT P.PEDI_ID, P.PREF_PRE, PEDI_NUMERO, PEDI_FECHA, (PEDI_FECHA + PEDI_VALIDEZ), P.TERC_NIT,
    PEDI_NOMTERC, SUBSTRING(PEDI_OBS FROM 1 FOR 255), P.VEND_COD, PEDI_TOTAL
      FROM PEDIDOS P, PREFIJOS PR
      WHERE PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND PEDI_ANULADO = 'N' AND PEDI_VALIDEZ >= 0
       AND PR.PREF_PRE = P.PREF_PRE AND PR.TIDO_COD = 34 AND ((PR.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
      ORDER BY PEDI_FECHA, P.PREF_PRE, PEDI_NUMERO
      INTO :ID, :PREFIJO, :NUMERO, :FECHA, :VENCE, :NIT, :NOMCLIENTE, :OBS, :VEND, :PRECIO
      DO
        BEGIN
        NUMCRUCE = '';
        SELECT VEND_NOMBRE FROM VENDEDORES WHERE VEND_COD = :VEND INTO :NOMVEND;
        if (TIPODES = 31) then
            SELECT FIRST 1 PREF_PRE || FACT_NUMERO FROM FACTURAS F, consolidado_faltantes C
                WHERE F.fact_consolida = C.cofa_id AND C.cofa_tipoori = 34 AND C.cofa_idori = :ID AND
                C.cofa_tipodes = 31 AND C.cofa_ok = 'S' AND FACT_ANULADO = 'N'
                INTO :numcruce;
        if (TIPODES = 32) then
            SELECT FIRST 1 PREF_PRE || REVT_NUMERO FROM remisiones_venta F, consolidado_faltantes C
                WHERE F.revt_consolida = C.cofa_id AND C.cofa_tipoori = 34 AND C.cofa_idori = :ID AND
                C.cofa_tipodes = 32 AND C.cofa_ok = 'S' AND REVT_ANULADO = 'N'
                INTO :numcruce;
        if ((CEROS = 'N') or (NUMCRUCE = '')) then
          SUSPEND;
        END
  if (TIPOORI = 35) then
    FOR SELECT C.COTI_ID, C.PREF_PRE, COTI_NUMERO, COTI_FECHA, (COTI_FECHA + COTI_VALIDEZ), C.TERC_NIT,
      COTI_NOMTERC, SUBSTRING(COTI_OBS FROM 1 FOR 255), C.VEND_COD, COTI_TOTAL
      FROM COTIZACIONES C, PREFIJOS P
      WHERE COTI_FECHA >= :FECINI AND COTI_FECHA <= :FECFIN AND COTI_ANULADO = 'N'
       AND P.PREF_PRE = C.PREF_PRE AND P.TIDO_COD = 35 AND ((P.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
      ORDER BY COTI_FECHA, C.PREF_PRE, COTI_NUMERO
      INTO :ID, :PREFIJO, :NUMERO, :FECHA, :VENCE, :NIT, :NOMCLIENTE, :OBS, :VEND, :PRECIO
      DO
        BEGIN
        NUMCRUCE = '';
        SELECT VEND_NOMBRE FROM VENDEDORES WHERE VEND_COD = :VEND INTO :NOMVEND;
        if (TIPODES = 31) then
            SELECT FIRST 1 PREF_PRE || FACT_NUMERO FROM FACTURAS F, consolidado_faltantes C
                WHERE F.fact_consolida = C.cofa_id AND C.cofa_tipoori = 35 AND C.cofa_idori = :ID AND
                C.cofa_tipodes = 31 AND C.cofa_ok = 'S' AND FACT_ANULADO = 'N'
                INTO :numcruce;
        if (TIPODES = 32) then
            SELECT FIRST 1 PREF_PRE || REVT_NUMERO FROM remisiones_venta F, consolidado_faltantes C
                WHERE F.revt_consolida = C.cofa_id AND C.cofa_tipoori = 35 AND C.cofa_idori = :ID AND
                C.cofa_tipodes = 32 AND C.cofa_ok = 'S' AND REVT_ANULADO = 'N'
                INTO :numcruce;
        if (TIPODES = 34) then
            SELECT FIRST 1 PREF_PRE || PEDI_NUMERO FROM PEDIDOS F, consolidado_faltantes C
                WHERE F.pedi_consolida = C.cofa_id AND C.cofa_tipoori = 35 AND C.cofa_idori = :ID AND
                C.cofa_tipodes = 34 AND C.cofa_ok = 'S' AND PEDI_ANULADO = 'N'
                INTO :numcruce;
        if ((CEROS = 'N') or (NUMCRUCE = '')) then
          SUSPEND;
        END
  END
END

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE RESERVAS_ARTICULO(
    FECHA DATE,
    DETALLE CHAR(1))
RETURNS (
    CODIGO VARCHAR(15),
    NOMBRE VARCHAR(60),
    RESERVA NUMERIC(18,4),
    EXIST NUMERIC(18,2),
    FALTANTE NUMERIC(18,2),
    COSTO NUMERIC(18,2),
    UNIDAD VARCHAR(8),
    CODGRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    CODSUBG VARCHAR(3),
    NOMSUBG VARCHAR(30),
    CODMARC VARCHAR(3),
    NOMMARC VARCHAR(30),
    COSTOTOT NUMERIC(18,2),
    CLIENTE VARCHAR(60),
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHADOC DATE)
AS
declare variable PEDIDO NUMERIC(18,4);
declare variable ID INTEGER;
declare variable ITEM INTEGER;
declare variable UND VARCHAR(8);
declare variable FACTOR NUMERIC(18,4);
declare variable FACT NUMERIC(18,4);
declare variable CANT NUMERIC(18,4);
declare variable PEDAUTO CHAR(2);
BEGIN
EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION', 'FACTURAS', 'GENERAR PEDIDO AUTOMATICAMENTE CON LA FACTURA') returning_values (pedauto);
  FOR
    SELECT ARTI_COD, ARTI_DES, ARTI_UNIDAD, A.GRUP_COD, A.SUBG_COD, A.MARC_COD
      FROM ARTICULO A
      INTO :CODIGO, :NOMBRE, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
      DO
        BEGIN
        NOMMARC = '';
        NOMSUBG = '';
        SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
        SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
        SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
        EXECUTE PROCEDURE SALDO_TOTAL_INVENTARIO(CODIGO, FECHA) returning_values (EXIST);
        if (DETALLE = 'N') then
            BEGIN
            EXECUTE PROCEDURE COSTO_PROMEDIO(CODIGO, FECHA) returning_values (COSTO);
            SELECT SUM(RSDE_LIBERAR) FROM RESERVAS R, RESERVAS_DETALLE RD
                WHERE R.RESE_ID = RD.RESE_ID AND RD.ARTI_COD = :CODIGO AND RESE_FECHA <= :FECHA AND RESE_VENCE > :FECHA AND RESE_ANULADO = 'N'
                INTO :RESERVA;
            if (RESERVA IS NULL) then
                RESERVA = 0;
            FOR SELECT P.PEDI_ID, PEDE_ITEM, PEDE_CANT * PEDE_FACTOR
                FROM PEDIDOS P, PEDIDOS_DETALLE D
                WHERE P.PEDI_ID = D.PEDI_ID AND D.ARTI_COD = :CODIGO AND (PEDI_FECHA+PEDI_VALIDEZ) >= :FECHA AND PEDI_FECHA <= :FECHA AND PEDI_ANULADO = 'N'
                INTO :ID, :item, :CANT
                DO
                BEGIN
                EXECUTE PROCEDURE FALTANTE(34, 31, ID, ITEM) returning_values (PEDIDO, UND, FACT);
                if (PEDIDO * FACT = CANT) then
                    EXECUTE PROCEDURE FALTANTE(34, 32, ID, ITEM) returning_values (PEDIDO, UND, FACT);
                if (PEDIDO IS NULL) then
                    PEDIDO = 0;
                RESERVA = RESERVA + PEDIDO;
                END
            if (RESERVA > EXIST) then
                FALTANTE = RESERVA - EXIST;
            ELSE
                FALTANTE = 0;
            COSTOTOT = RESERVA * COSTO;
            if (RESERVA > 0) then
                SUSPEND;
            END
        ELSE
            BEGIN
            FOR SELECT RESE_FECHA, PREF_PRE, RESE_NUMERO, RESE_NOMTERC, RDSE_CANT, RSDE_UNIDAD, RSDE_LIBERAR
                FROM RESERVAS R, RESERVAS_DETALLE RD
                WHERE R.RESE_ID = RD.RESE_ID AND RD.ARTI_COD = :CODIGO AND RESE_FECHA <= :FECHA AND RESE_VENCE > :FECHA AND RESE_ANULADO = 'N'
                INTO :FECHADOC, :PREFIJO, :NUMERO, :CLIENTE, :RESERVA, :UNIDAD, :FALTANTE
                DO
                BEGIN
                if (RESERVA > EXIST) then
                    FALTANTE = RESERVA - EXIST;
                ELSE
                    FALTANTE = 0;
                COSTOTOT = RESERVA * COSTO;
                SUSPEND;
                END
            FOR SELECT P.PEDI_ID, PEDE_ITEM, PEDI_FECHA, PREF_PRE, PEDI_NUMERO, PEDI_NOMTERC, PEDE_CANT, PEDE_UNIDAD, PEDE_RESERVA, PEDE_FACTOR
                FROM PEDIDOS P, PEDIDOS_DETALLE PD
                WHERE P.PEDI_ID = PD.PEDI_ID AND PD.ARTI_COD = :CODIGO AND PEDI_FECHA <= :FECHA AND (PEDI_FECHA+PEDI_VALIDEZ) >= :FECHA AND PEDI_ANULADO = 'N'
                INTO :ID, :ITEM, :FECHADOC, :PREFIJO, :NUMERO, :CLIENTE, :CANT, :UNIDAD, :FALTANTE, :FACTOR
                DO
                BEGIN
                EXECUTE PROCEDURE FALTANTE(34, 31, ID, ITEM) returning_values (RESERVA, UND, FACT);
                if ((RESERVA * FACT = CANT * FACTOR) or (PEDAUTO = 'SI')) then
                    EXECUTE PROCEDURE FALTANTE(34, 31, ID, ITEM) returning_values (RESERVA, UND, FACTOR);
                if (RESERVA IS NULL) then
                    RESERVA = 0;
                if (RESERVA > 0) then
                    BEGIN
                    if (RESERVA > EXIST) then
                        FALTANTE = RESERVA - EXIST;
                    ELSE
                        FALTANTE = 0;
                    COSTOTOT = RESERVA * COSTO;
                    SUSPEND;
                    END
                END
            END
        END
END

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE RESERVAS_ARTICULO_FECHA(
    ARTICULO VARCHAR(15),
    FECHA DATE)
RETURNS (
    FECRES DATE,
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(6),
    VENCE DATE,
    CLIENTE VARCHAR(60),
    CANTIDAD NUMERIC(18,2),
    UNIDAD VARCHAR(8),
    TIPO INTEGER,
    ID INTEGER)
AS
declare variable ITEM INTEGER;
declare variable FACTOR NUMERIC(18,4);
declare variable UND VARCHAR(8);
declare variable FACT NUMERIC(18,4);
declare variable ORDENC NUMERIC(18,4);
declare variable PEDAUTO CHAR(2);
BEGIN
TIPO = 17;
  /* MUESTRA LAS RESERVAS DEL ARTICULO QUE NO SE HAN VENCIDO */
  FOR SELECT R.RESE_ID, RESE_FECHA, PREF_PRE, RESE_NUMERO, RESE_VENCE, RESE_NOMTERC, RDSE_CANT, RSDE_UNIDAD
    FROM RESERVAS R, RESERVAS_DETALLE RD
    WHERE R.RESE_ID = RD.RESE_ID AND RD.ARTI_COD = :ARTICULO AND RESE_VENCE >= :FECHA AND RESE_FECHA <= :FECHA AND RSDE_ANULADO = 'N'
    INTO :ID, :FECRES, :PREFIJO, :NUMERO, :VENCE, :CLIENTE, :CANTIDAD, :UNIDAD
        DO
          SUSPEND;
TIPO = 34;
  /* MUESTRA LOS PEDIDOS DEL ARTICULO QUE NO SE HAN VENCIDO */
  FOR SELECT P.PEDI_ID, PEDE_ITEM, PEDI_FECHA, PREF_PRE, PEDI_NUMERO, (PEDI_FECHA + PEDI_VALIDEZ), PEDI_NOMTERC, PEDE_CANT, PEDE_UNIDAD, PEDE_FACTOR
    FROM PEDIDOS P, PEDIDOS_DETALLE PD
    WHERE P.PEDI_ID = PD.PEDI_ID AND PD.ARTI_COD = :ARTICULO AND (PEDI_FECHA+PEDI_VALIDEZ) >= :FECHA AND PEDI_FECHA <= :FECHA AND PEDE_ANULADO = 'N'
    INTO :ID, :ITEM, :FECRES, :PREFIJO, :NUMERO, :VENCE, :CLIENTE, :CANTIDAD, :UNIDAD, :FACTOR
    DO
        BEGIN
        EXECUTE PROCEDURE FALTANTE(34, 31, ID, ITEM) returning_values (ORDENC, UND, FACT);
        if ((ORDENC * FACT = CANTIDAD * FACTOR) or (PEDAUTO = 'SI')) then
            EXECUTE PROCEDURE FALTANTE(34, 32, ID, ITEM) returning_values (ORDENC, UND, FACTOR);
        if (ORDENC IS NULL) then
            ORDENC = 0;
        if (ORDENC <> 0) then
            BEGIN
            CANTIDAD = ORDENC;
            UNIDAD = UND;
            SUSPEND;
            END
        END
END

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE DESCARGA_REMIPROV_FALTANTE(
    REMISION1 VARCHAR(10),
    REMISION2 VARCHAR(10),
    REMISION3 VARCHAR(10),
    REMISION4 VARCHAR(10),
    REMISION5 VARCHAR(10),
    REMISION6 VARCHAR(10),
    PREFAC VARCHAR(4),
    NUMFAC VARCHAR(6))
RETURNS (
    IDCON INTEGER)
AS
declare variable IDF INTEGER;
declare variable IDR6 INTEGER;
declare variable IDR5 INTEGER;
declare variable IDR4 INTEGER;
declare variable IDR3 INTEGER;
declare variable IDR2 INTEGER;
declare variable IDR1 INTEGER;
declare variable ITEM INTEGER;
begin
IDR1 = 0;
IDR2 = 0;
IDR3 = 0;
IDR4 = 0;
IDR5 = 0;
IDR6 = 0;
ITEM = 0;
SELECT REPR_ID FROM remision_proveedor WHERE PREF_PRE = SUBSTR(:remision1, 1, 4) AND REPR_NUMERO = SUBSTR(:remision1, 5, 10) INTO :IDR1;
SELECT REPR_ID FROM remision_proveedor WHERE PREF_PRE = SUBSTR(:remision2, 1, 4) AND REPR_NUMERO = SUBSTR(:remision2, 5, 10) INTO :IDR2;
SELECT REPR_ID FROM remision_proveedor WHERE PREF_PRE = SUBSTR(:remision3, 1, 4) AND REPR_NUMERO = SUBSTR(:remision3, 5, 10) INTO :IDR3;
SELECT REPR_ID FROM remision_proveedor WHERE PREF_PRE = SUBSTR(:remision4, 1, 4) AND REPR_NUMERO = SUBSTR(:remision4, 5, 10) INTO :IDR4;
SELECT REPR_ID FROM remision_proveedor WHERE PREF_PRE = SUBSTR(:remision5, 1, 4) AND REPR_NUMERO = SUBSTR(:remision5, 5, 10) INTO :IDR5;
SELECT REPR_ID FROM remision_proveedor WHERE PREF_PRE = SUBSTR(:remision6, 1, 4) AND REPR_NUMERO = SUBSTR(:remision6, 5, 10) INTO :IDR6;
IF (IDR1 <> 0) THEN
    BEGIN
    ITEM = ITEM + 1;
    SELECT FACO_ID FROM facturas_compra WHERE PREF_PRE = :prefac AND FACO_NUMERO = :numfac INTO :IDF;
    IDCON = GEN_ID(ID_CONS, 1);
    UPDATE facturas_compra SET FACO_CONSOLIDA = :idcon WHERE FACO_ID = :IDF;
    INSERT INTO CONSOLIDE_FALTANTES (CEFA_ID, CEFA_ITEM, CEFA_TIPODES, CEFA_TIPOORI, CEFA_IDORI)
        VALUES (:IDCON, :ITEM, 21, 22, :IDR1);
    IF (IDR2 <> 0) THEN
        BEGIN
        ITEM = ITEM + 1;
        INSERT INTO CONSOLIDE_FALTANTES (CEFA_ID, CEFA_ITEM, CEFA_TIPODES, CEFA_TIPOORI, CEFA_IDORI)
            VALUES (:IDCON, :ITEM, 21, 22, :IDR2);
        END
    IF (IDR3 <> 0) THEN
        BEGIN
        ITEM = ITEM + 1;
        INSERT INTO CONSOLIDE_FALTANTES (CEFA_ID, CEFA_ITEM, CEFA_TIPODES, CEFA_TIPOORI, CEFA_IDORI)
            VALUES (:IDCON, :ITEM, 21, 22, :IDR3);
        END
    IF (IDR4 <> 0) THEN
        BEGIN
        ITEM = ITEM + 1;
        INSERT INTO CONSOLIDE_FALTANTES (CEFA_ID, CEFA_ITEM, CEFA_TIPODES, CEFA_TIPOORI, CEFA_IDORI)
            VALUES (:IDCON, :ITEM, 21, 22, :IDR4);
        END
    IF (IDR5 <> 0) THEN
        BEGIN
        ITEM = ITEM + 1;
        INSERT INTO CONSOLIDE_FALTANTES (CEFA_ID, CEFA_ITEM, CEFA_TIPODES, CEFA_TIPOORI, CEFA_IDORI)
            VALUES (:IDCON, :ITEM, 21, 22, :IDR5);
        END
    IF (IDR6 <> 0) THEN
        BEGIN
        ITEM = ITEM + 1;
        INSERT INTO CONSOLIDE_FALTANTES (CEFA_ID, CEFA_ITEM, CEFA_TIPODES, CEFA_TIPOORI, CEFA_IDORI)
            VALUES (:IDCON, :ITEM, 21, 22, :IDR6);
        END
    EXECUTE PROCEDURE consolide_pendientes (:IDCON);
    UPDATE consolidado_faltantes SET COFA_OK = 'S' WHERE COFA_ID = :idcon;
    suspend;
    END
end

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE DESCARGA_REMISION_FALTANTE(
    REMISION1 VARCHAR(10),
    REMISION2 VARCHAR(10),
    REMISION3 VARCHAR(10),
    REMISION4 VARCHAR(10),
    REMISION5 VARCHAR(10),
    REMISION6 VARCHAR(10),
    PREFAC VARCHAR(4),
    NUMFAC VARCHAR(6))
RETURNS (
    IDCON INTEGER)
AS
declare variable IDF INTEGER;
declare variable IDR6 INTEGER;
declare variable IDR5 INTEGER;
declare variable IDR4 INTEGER;
declare variable IDR3 INTEGER;
declare variable IDR2 INTEGER;
declare variable IDR1 INTEGER;
declare variable ITEM INTEGER;
begin
IDR1 = 0;
IDR2 = 0;
IDR3 = 0;
IDR4 = 0;
IDR5 = 0;
IDR6 = 0;
ITEM = 0;
SELECT REVT_ID FROM REMISIONES_VENTA WHERE PREF_PRE = SUBSTR(:remision1, 1, 4) AND REVT_NUMERO = SUBSTR(:remision1, 5, 10) INTO :IDR1;
SELECT REVT_ID FROM REMISIONES_VENTA WHERE PREF_PRE = SUBSTR(:remision2, 1, 4) AND REVT_NUMERO = SUBSTR(:remision2, 5, 10) INTO :IDR2;
SELECT REVT_ID FROM REMISIONES_VENTA WHERE PREF_PRE = SUBSTR(:remision3, 1, 4) AND REVT_NUMERO = SUBSTR(:remision3, 5, 10) INTO :IDR3;
SELECT REVT_ID FROM REMISIONES_VENTA WHERE PREF_PRE = SUBSTR(:remision4, 1, 4) AND REVT_NUMERO = SUBSTR(:remision4, 5, 10) INTO :IDR4;
SELECT REVT_ID FROM REMISIONES_VENTA WHERE PREF_PRE = SUBSTR(:remision5, 1, 4) AND REVT_NUMERO = SUBSTR(:remision5, 5, 10) INTO :IDR5;
SELECT REVT_ID FROM REMISIONES_VENTA WHERE PREF_PRE = SUBSTR(:remision6, 1, 4) AND REVT_NUMERO = SUBSTR(:remision6, 5, 10) INTO :IDR6;
IF (IDR1 <> 0) THEN
    BEGIN
    ITEM = ITEM + 1;
    SELECT FACT_ID FROM FACTURAS WHERE PREF_PRE = :prefac AND FACT_NUMERO = :numfac INTO :IDF;
    IDCON = GEN_ID(ID_CONS, 1);
    UPDATE FACTURAS SET FACT_CONSOLIDA = :idcon WHERE FACT_ID = :IDF;
    INSERT INTO CONSOLIDE_FALTANTES (CEFA_ID, CEFA_ITEM, CEFA_TIPODES, CEFA_TIPOORI, CEFA_IDORI)
        VALUES (:IDCON, :ITEM, 31, 32, :IDR1);
    IF (IDR2 <> 0) THEN
        BEGIN
        ITEM = ITEM + 1;
        INSERT INTO CONSOLIDE_FALTANTES (CEFA_ID, CEFA_ITEM, CEFA_TIPODES, CEFA_TIPOORI, CEFA_IDORI)
            VALUES (:IDCON, :ITEM, 31, 32, :IDR2);
        END
    IF (IDR3 <> 0) THEN
        BEGIN
        ITEM = ITEM + 1;
        INSERT INTO CONSOLIDE_FALTANTES (CEFA_ID, CEFA_ITEM, CEFA_TIPODES, CEFA_TIPOORI, CEFA_IDORI)
            VALUES (:IDCON, :ITEM, 31, 32, :IDR3);
        END
    IF (IDR4 <> 0) THEN
        BEGIN
        ITEM = ITEM + 1;
        INSERT INTO CONSOLIDE_FALTANTES (CEFA_ID, CEFA_ITEM, CEFA_TIPODES, CEFA_TIPOORI, CEFA_IDORI)
            VALUES (:IDCON, :ITEM, 31, 32, :IDR4);
        END
    IF (IDR5 <> 0) THEN
        BEGIN
        ITEM = ITEM + 1;
        INSERT INTO CONSOLIDE_FALTANTES (CEFA_ID, CEFA_ITEM, CEFA_TIPODES, CEFA_TIPOORI, CEFA_IDORI)
            VALUES (:IDCON, :ITEM, 31, 32, :IDR5);
        END
    IF (IDR6 <> 0) THEN
        BEGIN
        ITEM = ITEM + 1;
        INSERT INTO CONSOLIDE_FALTANTES (CEFA_ID, CEFA_ITEM, CEFA_TIPODES, CEFA_TIPOORI, CEFA_IDORI)
            VALUES (:IDCON, :ITEM, 31, 32, :IDR6);
        END
    EXECUTE PROCEDURE consolide_pendientes (:IDCON);
    suspend;
    END
end

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE RECALCULA_FALTANTES_VENTAS2(
    FECINI DATE,
    FECFIN DATE,
    PREF VARCHAR(4))
RETURNS (
    FACTURA VARCHAR(6),
    REMISION VARCHAR(30),
    IDCON INTEGER)
AS
declare variable IDF INTEGER;
declare variable IDR INTEGER;
begin
FOR SELECT FACT_REMISION, FACT_NUMERO, FACT_ID FROM FACTURAS WHERE ((FACT_CONSOLIDA IS NULL) or (FACT_CONSOLIDA = 0)) AND
    (FACT_ANULADO = 'N') AND (FACT_REMISION IS NOT NULL) AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND PREF_PRE = :PREF
    INTO :REMISION, :FACTURA, :IDF
    DO
    BEGIN
    if (STRLEN(REMISION) = 10) then
        BEGIN
        IDR = 0;
        SELECT REVT_ID FROM REMISIONES_VENTA WHERE PREF_PRE = SUBSTR(:remision, 1, 4) AND REVT_NUMERO = SUBSTR(:remision, 5, 10) INTO :IDR;
        IF (IDR <> 0) THEN
            BEGIN
            IDCON = GEN_ID(ID_CONS, 1);
            INSERT INTO CONSOLIDE_FALTANTES (CEFA_ID, CEFA_ITEM, CEFA_TIPODES, CEFA_TIPOORI, CEFA_IDORI)
                VALUES (:IDCON, 1, 31, 32, :IDR);
            EXECUTE PROCEDURE consolide_pendientes (:IDCON);
            UPDATE FACTURAS SET FACT_CONSOLIDA = :idcon WHERE FACT_ID = :IDF;
            suspend;
            END
        END
    END
end

^

SET TERM ; ^

SET TERM ^ ;

ALTER TRIGGER REMISIONES_VENTA_BI
AS
declare variable NUMERO VARCHAR(6);
declare variable AUTOM CHAR(1);
declare variable EXISTE CHAR(1);
declare variable PEDAUTO CHAR(2);
declare variable ITEM INTEGER;
declare variable IDF INTEGER;
declare variable IDP INTEGER;
declare variable IDC INTEGER;
declare variable FECSERVER CHAR(2);
declare variable PEDIDOREP char(2);
declare variable TIPO VARCHAR(8);
declare variable NUMROWS INTEGER;
declare variable IDPEDIDO INTEGER;
declare variable NUMPEDIDO VARCHAR(10);
BEGIN
EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION', 'DOCUMENTOS', 'INHABILITAR FECHA EN DOCUMENTOS') returning_values (:fecserver);
if (FECSERVER = 'SI') then
    NEW.revt_fecha = CAST ('NOW' AS DATE);
if (NEW.numok = 'N') then
  BEGIN
  /* Actualice el contador del prefijo */
  SELECT PREF_ACTUAL, PREF_AUTO FROM PREFIJOS WHERE TIDO_COD = 32 AND PREF_PRE = NEW.PREF_PRE INTO :NUMERO, :AUTOM;
  /* ACTUALICE EL NUMERO EN COMPROBANTE_ENCABEZADO  */
  if (AUTOM = 'S') then
    BEGIN
    NEW.REVT_NUMERO = NUMERO;
    NUMERO = CAST((CAST(NUMERO AS INTEGER) + 1) AS CHAR(6));
    UPDATE PREFIJOS
      SET PREF_ACTUAL = :NUMERO
    WHERE TIDO_COD = 32 AND PREF_PRE = NEW.PREF_PRE;
    END
  ELSE
    BEGIN
    if (CAST(NUMERO AS INTEGER) = CAST(NEW.REVT_NUMERO AS INTEGER)) then
        UPDATE PREFIJOS
          SET PREF_ACTUAL = CAST((CAST(PREF_ACTUAL AS INTEGER) + 1) AS CHAR(6))
        WHERE TIDO_COD = 32 AND PREF_PRE = NEW.PREF_PRE;
    END
  EXECUTE PROCEDURE COMPLETA_CEROS (NEW.REVT_numero) returning_values (NEW.REVT_numero);
  NEW.numok = 'S';
  END
/* Verifique que el numero no existe previamente */
EXISTE = 'N';
SELECT 'S' FROM REMISIONES_VENTA WHERE PREF_PRE = NEW.PREF_PRE AND REVT_NUMERO = NEW.REVT_NUMERO INTO :EXISTE;
if (EXISTE = 'S') then
    EXCEPTION DOCUMENTO_REGISTRADO 'Ya existe una remisión a cliente con el número ' || new.pref_pre || new.revt_numero;

/* si hay pedido automatico saque una copia de la consolidacion */
EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION', 'FACTURAS', 'GENERAR PEDIDO AUTOMATICAMENTE CON LA FACTURA') returning_values (pedauto);
if (PEDAUTO = 'SI') then
    begin
    IDC = gen_id(id_cons,1);
    for select cefa_item, cefa_idori from consolide_faltantes where cefa_id = new.revt_consolida
        into :item, :idf
        do
        begin
        SELECT PEDI_ID FROM PEDIDOS P, FACTURAS F WHERE P.PREF_PRE = F.pref_pre AND P.pedi_numero = F.fact_numero AND F.fact_id = :IDF INTO :IDP;
        insert into consolide_faltantes (cefa_id, cefa_item, cefa_tipodes, cefa_tipoori, cefa_idori)
            VALUES(:IDC, :item, 32, 34, :IDP);
        end
    EXECUTE PROCEDURE consolide_pendientes (:IDC);
    NEW.lipr_cod = :IDC;
    end
if (NEW.revt_consolida <> 0) then
    BEGIN
    execute procedure lee_configuracion ('FACTURACION', 'REMISIONES', 'PERMITIR VARIOS DESPACHOS PARCIALES DEL MISMO PEDIDO/FACTURA') returning_values (:pedidorep);
    if (pedidorep <> 'SI') then
        BEGIN
        SELECT COUNT(C2.COFA_ID), MAX(TIDO_NOMCORTO), max(c2.cofa_idori) FROM consolidado_faltantes C1, consolidado_faltantes C2, tipo_documento t
            WHERE C1.cofa_id <> C2.cofa_id and C1.cofa_id = NEW.revt_consolida AND C1.cofa_tipodes = 32 AND
            C2.cofa_tipodes = 32 AND C1.cofa_tipoori = C2.cofa_tipoori AND C1.cofa_idori = C2.cofa_idori and
            c1.cofa_tipoori = t.tido_cod and c1.cofa_ok = 'S' and c2.cofa_ok = 'S'
            INTO :NUMROWS, :TIPO, :idpedido;
        if (NUMROWS <> 0) then
            begin
            if (TIPO = 'PEDIDCLI') then
                SELECT PREF_PRE || PEDI_NUMERO FROM PEDIDOS WHERE PEDI_ID = :idpedido INTO :numpedido;
            if (TIPO = 'FACTVENT') then
                SELECT PREF_PRE || FACT_NUMERO FROM FACTURAS WHERE FACT_ID = :idpedido INTO :numpedido;
            exception documento_cruzado 'El documento ' || :tipo || ' ' || :numpedido || ' ya fue utilizado en otra remisión.';
            end
        END
    END
END
^

SET TERM ; ^


/* 20100405 */
/* COMPRAS PROVEEDOR POR AGENCIA */
SET TERM ^ ;

CREATE OR ALTER procedure REP_COMPRAS_PROVEEDOR (
    TIPO integer,
    NITDESDE varchar(20),
    NITHASTA varchar(20),
    FECINI date,
    FECFIN date,
    DETALLE char(1),
    ORDEN char(1),
    CEROS char(1),
    SUBEMPRESA INTEGER)
returns (
    NIT varchar(20),
    NOMBRE varchar(60),
    TELEFONO varchar(40),
    CIUDAD varchar(40),
    CODZONA varchar(2),
    NOMZONA varchar(60),
    NOMTIPO varchar(50),
    PREFIJO varchar(4),
    NUMERO varchar(6),
    NUMPROV varchar(20),
    ID integer,
    FECDOC date,
    CANTIDAD integer,
    SUBTOTAL numeric(18,2),
    DTO numeric(18,2),
    ADICIONAL numeric(18,2),
    IVA numeric(18,2),
    EXTRA numeric(18,2),
    TOTAL numeric(18,2),
    RTFTE numeric(18,2),
    RTIVA numeric(18,2),
    RTICA numeric(18,2),
    NETO numeric(18,2))
AS
declare variable NITINI VARCHAR(15);
declare variable NITFIN VARCHAR(15);
declare variable NOMINI VARCHAR(15);
declare variable NOMFIN VARCHAR(15);
BEGIN
if (ORDEN = 'C') then
    BEGIN
    NITINI = NITDESDE;
    NITFIN = NITHASTA;
    NOMINI = '';
    NOMFIN = 'zz';
    END
ELSE
    BEGIN
    NITINI = NITDESDE;
    NITFIN = NITHASTA;
    NOMINI = '';
    NOMFIN = 'zz';
    END

SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = :TIPO INTO :NOMTIPO;
FOR select T.TERC_NIT, TERC_NOM,  TERC_TEL, TERC_CIU, P.GRPR_COD
    from terceros T, PROVEEDORES P
    where P.TERC_NIT = T.TERC_NIT AND TERC_PROV = 'S' AND T.TERC_NIT >= :NITINI AND T.TERC_NIT <= :NITFIN AND TERC_NOM >= :NOMINI AND TERC_NOM <= :NOMFIN
    INTO :NIT, :NOMBRE, :TELEFONO, :CIUDAD, :CODZONA
    DO  
    BEGIN
    SELECT GRPR_NOM FROM GRUPOS_PROVEEDORES WHERE GRPR_COD = :CODZONA INTO :NOMZONA;
    if (DETALLE = 'N') then
        BEGIN
        if (TIPO = 21) then
          SELECT COUNT(*), SUM(FACO_DTOMONTO), SUM(FACO_ADICIONAL), SUM(FACO_IVAMONTO), SUM(FACO_EXTRA), SUM(FACO_RTFTEMONTO), SUM(FACO_RTIVAMONTO), SUM(FACO_RTICAMONTO), SUM(FACO_TOTAL)
            FROM FACTURAS_COMPRA F, PREFIJOS P
            WHERE F.pref_pre = P.pref_pre AND P.tido_cod = 21 AND ((:subempresa = 0) or (P.sucu_id = :subempresa))
            AND TERC_NIT = :NIT AND FACO_FECHA >= :FECINI AND FACO_FECHA <= :FECFIN AND FACO_ANULADO = 'N'
            INTO :CANTIDAD, :DTO, :ADICIONAL, :IVA, :EXTRA, :RTFTE, :RTIVA, :RTICA, :TOTAL;
        if (TIPO = 22) then
          SELECT COUNT(*), 0, 0, SUM(REPR_IVAMONTO), 0, 0, 0, 0, SUM(REPR_TOTAL)
            FROM REMISION_PROVEEDOR R, PREFIJOS P
            WHERE R.pref_pre = P.pref_pre AND P.tido_cod = 22 AND ((:subempresa = 0) or (P.sucu_id = :subempresa))
            AND TERC_NIT = :NIT AND REPR_FECHA >= :FECINI AND REPR_FECHA <= :FECFIN AND REPR_ANULADO = 'N'
            INTO :CANTIDAD, :DTO, :ADICIONAL, :IVA, :EXTRA, :RTFTE, :RTIVA, :RTICA, :TOTAL;
        if (TIPO = 24) then
          SELECT COUNT(*), SUM(DVCO_DTOMONTO), SUM(DVCO_ADICIONAL), SUM(DVCO_IVAMONTO), SUM(DVCO_EXTRA), SUM(DVCO_RTFTEMONTO), SUM(DVCO_RTIVAMONTO), SUM(DVCO_RTICAMONTO), SUM(DVCO_TOTAL)
            FROM DEVOLUCIONES_COMPRAS D, PREFIJOS P
            WHERE D.pref_pre = P.pref_pre AND P.tido_cod = 24 AND ((:subempresa = 0) or (P.sucu_id = :subempresa))
            AND TERC_NIT = :NIT AND DVCO_FECHA >= :FECINI AND DVCO_FECHA <= :FECFIN AND DVCO_ANULADO = 'N'
            INTO :CANTIDAD, :DTO, :ADICIONAL, :IVA, :EXTRA, :RTFTE, :RTIVA, :RTICA, :TOTAL;
        if (TIPO = 23) then
          SELECT COUNT(*), SUM(ORDC_DTOMONTO), SUM(ORDC_ADICIONAL), SUM(ORDC_IVAMONTO), SUM(ORDC_EXTRA), 0, 0, 0, SUM(ORDC_TOTAL)
            FROM ORDENES_COMPRA F, PREFIJOS P
            WHERE F.pref_pre = P.pref_pre AND P.tido_cod = 23 AND ((:subempresa = 0) or (P.sucu_id = :subempresa))
            AND TERC_NIT = :NIT AND ORDC_FECHA >= :FECINI AND ORDC_FECHA <= :FECFIN AND ORDC_ANULADO = 'N'
            INTO :CANTIDAD, :DTO, :ADICIONAL, :IVA, :EXTRA, :RTFTE, :RTIVA, :RTICA, :TOTAL;
        if (TIPO = 25) then
          SELECT COUNT(*), SUM(COPR_DTOMONTO), SUM(COPR_ADICIONAL), SUM(COPR_IVAMONTO), SUM(COPR_EXTRA), 0, 0, 0, SUM(COPR_TOTAL)
            FROM COTIZACION_PROVEEDOR F, PREFIJOS P
            WHERE F.pref_pre = P.pref_pre AND P.tido_cod = 25 AND ((:subempresa = 0) or (P.sucu_id = :subempresa))
            AND TERC_NIT = :NIT AND COPR_FECHA >= :FECINI AND COPR_FECHA <= :FECFIN AND COPR_ANULADO = 'N'
            INTO :CANTIDAD, :DTO, :ADICIONAL, :IVA, :EXTRA, :RTFTE, :RTIVA, :RTICA, :TOTAL;
        if (CANTIDAD IS NULL) then
            CANTIDAD = 0;
        if (DTO IS NULL) then
            DTO = 0;
        if (ADICIONAL IS NULL) then
            ADICIONAL = 0;
        if (IVA IS NULL) then
            IVA = 0;
        if (EXTRA IS NULL) then
            EXTRA = 0;
        if (RTFTE IS NULL) then
            RTFTE = 0;
        if (RTIVA IS NULL) then
            RTIVA = 0;
        if (RTICA IS NULL) then
            RTICA = 0;
        SUBTOTAL = TOTAL - EXTRA - IVA - ADICIONAL + DTO;
        NETO = TOTAL - RTFTE - RTIVA - RTICA;
        if (CEROS = 'S') then
          SUSPEND;
        ELSE
          if (CANTIDAD > 0) then
            SUSPEND;
        END
    ELSE
        BEGIN
        if (TIPO = 21) THEN
          FOR SELECT FACO_ID, F.PREF_PRE, FACO_NUMERO, FACO_NUMPROV, FACO_FECHA, FACO_DTOMONTO, FACO_ADICIONAL, FACO_IVAMONTO, FACO_EXTRA, FACO_TOTAL, FACO_RTFTEMONTO, FACO_RTIVAMONTO, FACO_RTICAMONTO
            FROM FACTURAS_COMPRA  F, PREFIJOS P
            WHERE F.pref_pre = P.pref_pre AND P.tido_cod = 21 AND ((:subempresa = 0) or (P.sucu_id = :subempresa)) AND TERC_NIT = :NIT AND FACO_FECHA >= :FECINI AND FACO_FECHA <= :FECFIN AND FACO_ANULADO = 'N'
            ORDER BY FACO_FECHA, FACO_ID
            INTO :ID, :PREFIJO, :NUMERO, :NUMPROV, :FECDOC, :DTO, :ADICIONAL, :IVA, :EXTRA, :TOTAL, :RTFTE, :RTIVA, :RTICA
            DO
            BEGIN
            SUBTOTAL = TOTAL - EXTRA - IVA - ADICIONAL + DTO;
            NETO = TOTAL - RTFTE - RTIVA - RTICA;
            SUSPEND;
            END
        if (TIPO = 22) THEN
          FOR SELECT REPR_ID, F.PREF_PRE, REPR_NUMERO, REPR_NUMPROV, REPR_FECHA, 0, 0, REPR_IVAMONTO, 0, REPR_TOTAL, 0, 0, 0
            FROM REMISION_PROVEEDOR F, PREFIJOS P
            WHERE F.pref_pre = P.pref_pre AND P.tido_cod = 22 AND ((:subempresa = 0) or (P.sucu_id = :subempresa)) AND TERC_NIT = :NIT AND REPR_FECHA >= :FECINI AND REPR_FECHA <= :FECFIN AND REPR_ANULADO = 'N'
            ORDER BY REPR_FECHA, REPR_ID
            INTO :ID, :PREFIJO, :NUMERO, :NUMPROV, :FECDOC, :DTO, :ADICIONAL, :IVA, :EXTRA, :TOTAL, :RTFTE, :RTIVA, :RTICA
            DO
            BEGIN
            SUBTOTAL = TOTAL - EXTRA - IVA - ADICIONAL + DTO;
            NETO = TOTAL - RTFTE - RTIVA - RTICA;
            SUSPEND;
            END
        if (TIPO = 24) then
          FOR SELECT DVCO_ID, F.PREF_PRE, DVCO_NUMERO, '', DVCO_FECHA, DVCO_DTOMONTO, DVCO_ADICIONAL, DVCO_IVAMONTO, DVCO_EXTRA, DVCO_TOTAL, DVCO_RTFTEMONTO, DVCO_RTIVAMONTO, DVCO_RTICAMONTO
            FROM DEVOLUCIONES_COMPRAS  F, PREFIJOS P
            WHERE F.pref_pre = P.pref_pre AND P.tido_cod = 24 AND ((:subempresa = 0) or (P.sucu_id = :subempresa)) AND TERC_NIT = :NIT AND DVCO_FECHA >= :FECINI AND DVCO_FECHA <= :FECFIN AND DVCO_ANULADO = 'N'
            ORDER BY DVCO_FECHA, DVCO_ID
            INTO :ID, :PREFIJO, :NUMERO, :NUMPROV, :FECDOC, :DTO, :ADICIONAL, :IVA, :EXTRA, :TOTAL, :RTFTE, :RTIVA, :RTICA
            DO
            BEGIN
            SUBTOTAL = TOTAL - EXTRA - IVA - ADICIONAL + DTO;
            NETO = TOTAL - RTFTE - RTIVA - RTICA;
            SUSPEND;
            END
        if (TIPO = 23) THEN
          FOR SELECT ORDC_ID, F.PREF_PRE, ORDC_NUMERO, '', ORDC_FECHA, ORDC_DTOMONTO, ORDC_ADICIONAL, ORDC_IVAMONTO, ORDC_EXTRA, ORDC_TOTAL, 0, 0, 0
            FROM ORDENES_COMPRA  F, PREFIJOS P
            WHERE F.pref_pre = P.pref_pre AND P.tido_cod = 23 AND ((:subempresa = 0) or (P.sucu_id = :subempresa)) AND TERC_NIT = :NIT AND ORDC_FECHA >= :FECINI AND ORDC_FECHA <= :FECFIN AND ORDC_ANULADO = 'N'
            ORDER BY ORDC_FECHA, ORDC_ID
            INTO :ID, :PREFIJO, :NUMERO, :NUMPROV, :FECDOC, :DTO, :ADICIONAL, :IVA, :EXTRA, :TOTAL, :RTFTE, :RTIVA, :RTICA
            DO
            BEGIN
            SUBTOTAL = TOTAL - EXTRA - IVA - ADICIONAL + DTO;
            NETO = TOTAL - RTFTE - RTIVA - RTICA;
            SUSPEND;
            END
        if (TIPO = 25) THEN
          FOR SELECT COPR_ID, F.PREF_PRE, COPR_NUMERO, '', COPR_FECHA, COPR_DTOMONTO, COPR_ADICIONAL, COPR_IVAMONTO, COPR_EXTRA, COPR_TOTAL, 0, 0, 0
            FROM COTIZACION_PROVEEDOR  F, PREFIJOS P
            WHERE F.pref_pre = P.pref_pre AND P.tido_cod = 25 AND ((:subempresa = 0) or (P.sucu_id = :subempresa)) AND TERC_NIT = :NIT AND COPR_FECHA >= :FECINI AND COPR_FECHA <= :FECFIN AND COPR_ANULADO = 'N'
            ORDER BY COPR_FECHA, COPR_ID
            INTO :ID, :PREFIJO, :NUMERO, :NUMPROV, :FECDOC, :DTO, :ADICIONAL, :IVA, :EXTRA, :TOTAL, :RTFTE, :RTIVA, :RTICA
            DO
            BEGIN
            SUBTOTAL = TOTAL - EXTRA - IVA - ADICIONAL + DTO;
            NETO = TOTAL - RTFTE - RTIVA - RTICA;
            SUSPEND;
            END
        END
    END
END
^

SET TERM ; ^


/* 20100406 */
/* AUTOMATICAMENTE HAGA LOS CRUCES DE CARTERA */
SET TERM ^ ;

CREATE OR ALTER PROCEDURE REGISTRE_APLICACIONES_CLIENTES(
    NITINI VARCHAR(20),
    NITFIN VARCHAR(20),
    PREF VARCHAR(4),
    FECHA DATE)
RETURNS (
    ID INTEGER,
    NIT VARCHAR(20),
    SUCURSAL VARCHAR(10),
    NUMERO VARCHAR(6),
    PREFD VARCHAR(4),
    NUMD VARCHAR(6),
    PREFF VARCHAR(4),
    NUMF VARCHAR(6),
    MONTO NUMERIC(18,2))
AS
declare variable IDF INTEGER;
declare variable IDD INTEGER;
declare variable TIPOD INTEGER;
declare variable TIPOF INTEGER;
declare variable MONTOF NUMERIC(18,2);
declare variable nomtipod VARCHAR(8);
declare variable nomtipoF VARCHAR(8);
declare variable COBR INTEGER;
begin
FOR select TERC_NIT, CLCU_COD
    from CLIENTE_SUCURSALES S
    where TERC_NIT >= :NITINI AND TERC_NIT <= :NITFIN
    INTO :NIT, :SUCURSAL
    DO  
    BEGIN
    FOR SELECT MVCL_TIPOREF, MVCL_IDREF, MVCL_PREFREF, MVCL_NUMREF
        FROM MOVIMIENTO_CLIENTES WHERE TERC_NIT = :NIT AND MVCL_SUCURSAL = :SUCURSAL AND MVCL_FECHA <= :FECHA AND
        MVCL_ABONO = 'N' AND MVCL_DEBITO = 'N'
        INTO :TIPOD, :IDD, :PREFD, :NUMD
        DO
        BEGIN
        EXECUTE PROCEDURE saldo_doc_cartera(TIPOD, IDD, FECHA, 0) returning_values (MONTO);
        if (MONTO <> 0) then
            BEGIN
            /* BUSQUE UN MOVIMIENTO DEL MISMO VALOR DEBITO */
            FOR SELECT MVCL_TIPOREF, MVCL_IDREF, MVCL_PREFREF, MVCL_NUMREF, COBR_COD
                FROM MOVIMIENTO_CLIENTES WHERE TERC_NIT = :NIT AND MVCL_SUCURSAL = :SUCURSAL AND MVCL_FECHA <= :FECHA AND
                MVCL_ABONO = 'N' AND MVCL_DEBITO = 'S'
                INTO :TIPOF, :IDF, :PREFF, :NUMF, :COBR
                DO
                BEGIN
                EXECUTE PROCEDURE saldo_doc_cartera(TIPOF, IDF, FECHA, 0) returning_values (MONTOF);
                if ((ABS(monto) = ABS(montof)) AND (monto <> 0)) then
                    BEGIN
                    ID = gen_id(id_aplicaclie, 1);
                    SELECT PREF_ACTUAL FROM PREFIJOS WHERE PREF_PRE = :PREF AND TIDO_COD = 43 INTO :numero;
                    SELECT TIDO_NOMCORTO FROM tipo_documento WHERE TIDO_COD = :TIPOD INTO :nomtipod;
                    SELECT TIDO_NOMCORTO FROM tipo_documento WHERE TIDO_COD = :TIPOF INTO :nomtipof;
                    INSERT INTO APLICACION_CLIENTE (APCL_ID, TERC_NIT, TIDO_COD, PREF_PRE, APCL_NUMERO,
                        APCL_FECHA, APCL_CONCEPTO, APCL_OBS, APCL_ANULADO, APCL_TRANSMIT, COBR_COD,
                        APCL_USUARIO, APCL_SUCURSAL, NUMOK, APCL_TRM)
                        VALUES (:ID, :NIT, 43, :PREF, :NUMERO, :FECHA,
                        'APLICACION ' || :nomtipod || ' ' || :prefd || :numd || ' A ' || :nomtipof || ' ' || :preff || :numf, NULL, 'N', 'N', :COBR,
                        NULL, :sucursal, 'N', 1);
                    INSERT INTO APLICACION_CLIENTE_DETALLE (APCL_ID, ACDE_ITEM, ACDE_TIPODOC, ACDE_IDDOC,
                        ACDE_PREFIJO, ACDE_NUMERO, ACDE_APLICADO, ACDE_RTFTE, ACDE_RTIVA, ACDE_RTICA,
                        ACDE_ANULADO, ACDE_TRANSMIT, ACDE_DIFCAMBIO)
                        VALUES (:ID, 1, :tipod, :IDD, :prefd, :numd, :MONTO, 0, 0, 0, 'N', 'N', 0);
                    INSERT INTO APLICACION_CLIENTE_DETALLE (APCL_ID, ACDE_ITEM, ACDE_TIPODOC, ACDE_IDDOC,
                        ACDE_PREFIJO, ACDE_NUMERO, ACDE_APLICADO, ACDE_RTFTE, ACDE_RTIVA, ACDE_RTICA,
                        ACDE_ANULADO, ACDE_TRANSMIT, ACDE_DIFCAMBIO)
                        VALUES (:ID, 2, :tipof, :idf, :preff, :numf, :MONTOF, 0, 0, 0, 'N', 'N', 0);
                    suspend;
                    MONTO = 0;
                    END
                END
            END
        END
    END
end
^

SET TERM ; ^


/* 20100407 */
/* naturaeza en reportes de IVA */
SET TERM ^ ;

CREATE OR ALTER procedure MM_1005 (
    INICIO char(8),
    FINAL char(8))
AS
declare variable TIPODOC INTEGER;
declare variable NIT VARCHAR(15) CHARACTER SET NONE;
declare variable DV CHAR(1) CHARACTER SET NONE;
declare variable APELLIDO1 VARCHAR(60) CHARACTER SET NONE;
declare variable APELLIDO2 VARCHAR(60) CHARACTER SET NONE;
declare variable NOMBRE1 VARCHAR(60) CHARACTER SET NONE;
declare variable NOMBRE2 VARCHAR(60) CHARACTER SET NONE;
declare variable RAZONSOCIAL VARCHAR(450) CHARACTER SET NONE;
declare variable IVA NUMERIC(18,0);
declare variable ITEM INTEGER;
declare variable DEBITOS NUMERIC(18,2);
declare variable CREDITOS NUMERIC(18,2);
declare variable NATUR CHAR(1);
begin
ITEM = 0;
/* IVA DESCONTABLE */
SELECT first 1 COME_NATUR FROM CONFIGURA_MEDIOSMAG WHERE COME_FORMATO = '1005' INTO :NATUR;
FOR SELECT MAX(D.TERC_NIT), SUM(CODE_DEBITO-CODE_CREDITO), SUM(CODE_DEBITO), SUM(CODE_CREDITO)
    FROM COMPROBANTE_DETALLE D, COMPROBANTE_ENCABEZADO E, mediosmag_cuentas M
    WHERE M.mmcu_item = 111 AND SUBSTR(CUEN_COD,1,STRLEN(M.mmcu_cuenta)) = M.mmcu_cuenta AND
    E.ENCO_CONSEC = D.ENCO_CONSEC AND ENCO_FECHA >= :INICIO AND ENCO_FECHA <= :FINAL
    GROUP BY D.TERC_NIT
    INTO :NIT, :IVA, :debitos, :creditos
    DO
    BEGIN
    if (NATUR = 'D') then
        IVA = debitos;
    if (NATUR = 'C') then
        IVA = creditos;
    if (IVA > 0) then
        BEGIN
        SELECT TERC_NOM, TERC_NOMBRE1, TERC_NOMBRE2, TERC_APELLIDO1, TERC_APELLIDO2, TERC_DV, TIID_CODIGO
            FROM TERCEROS T left outer join TIPO_ID IT on (T.TERC_TIPOID = IT.TIID_COD) WHERE TERC_NIT = :NIT
            INTO :RAZONSOCIAL, :NOMBRE1, :NOMBRE2, :APELLIDO1, :APELLIDO2, :DV, :TIPODOC;
        ITEM = ITEM + 1;
        insert into medios_magneticos_datos (memg_formato, memg_ano, memg_item, memg_tipodoc, memg_nit, memg_dv,memg_apellido1, memg_apellido2,
            memg_nombre1, memg_nombre2, memg_razonsocial, memg_pago)
            values (1005, substr(:inicio,1,4), :item, :tipodoc, :nit, :dv, :apellido1, :apellido2,
            :nombre1, :nombre2, :razonsocial, :iva);
        END
    END
end
^

SET TERM ; ^


SET TERM ^ ;

CREATE OR ALTER procedure MM_1006 (
    INICIO char(8),
    FINAL char(8))
AS
declare variable TIPODOC INTEGER;
declare variable NIT VARCHAR(15) CHARACTER SET NONE;
declare variable DV CHAR(1) CHARACTER SET NONE;
declare variable APELLIDO1 VARCHAR(60) CHARACTER SET NONE;
declare variable APELLIDO2 VARCHAR(60) CHARACTER SET NONE;
declare variable NOMBRE1 VARCHAR(60) CHARACTER SET NONE;
declare variable NOMBRE2 VARCHAR(60) CHARACTER SET NONE;
declare variable RAZONSOCIAL VARCHAR(450) CHARACTER SET NONE;
declare variable IVA NUMERIC(18,0);
declare variable ITEM INTEGER;
declare variable DIRMENOR VARCHAR(200) CHARACTER SET NONE;
declare variable DEPMENOR CHAR(2) CHARACTER SET NONE;
declare variable MUNMENOR CHAR(3) CHARACTER SET NONE;
declare variable PAISMENOR CHAR(3) CHARACTER SET NONE;
declare variable MENORCUANTIA NUMERIC(18,2);
declare variable MINIMO NUMERIC(18,2);
declare variable DEBITOS NUMERIC(18,2);
declare variable CREDITOS NUMERIC(18,2);
declare variable NATUR CHAR(1);
begin
ITEM = 0;
MENORCUANTIA = 0;
SELECT COME_MINIMO, COME_NATUR FROM configura_mediosmag WHERE COME_ITEM = 115 INTO :MINIMO, :natur;
/* IVA GENERADO */
FOR SELECT MAX(D.TERC_NIT), SUM(CODE_CREDITO-CODE_DEBITO), SUM(CODE_DEBITO), SUM(CODE_CREDITO)
    FROM COMPROBANTE_DETALLE D, COMPROBANTE_ENCABEZADO E, mediosmag_cuentas M
    WHERE M.mmcu_item = 115 AND SUBSTR(CUEN_COD,1,STRLEN(M.mmcu_cuenta)) = M.mmcu_cuenta AND
    E.ENCO_CONSEC = D.ENCO_CONSEC AND ENCO_FECHA >= :INICIO AND ENCO_FECHA <= :FINAL
    GROUP BY D.TERC_NIT
    INTO :NIT, :IVA, :debitos, :creditos
    DO
    BEGIN
    if (NATUR = 'D') then
        IVA = debitos;
    if (NATUR = 'C') then
        IVA = creditos;
    if (iva > 0) then
      if (IVA > MINIMO) then
        BEGIN
        SELECT TERC_NOM, TERC_NOMBRE1, TERC_NOMBRE2, TERC_APELLIDO1, TERC_APELLIDO2, TERC_DV, TIID_CODIGO
            FROM TERCEROS T left outer join TIPO_ID IT on (T.TERC_TIPOID = IT.TIID_COD) WHERE TERC_NIT = :NIT
            INTO :RAZONSOCIAL, :NOMBRE1, :NOMBRE2, :APELLIDO1, :APELLIDO2, :DV, :TIPODOC;
        ITEM = ITEM + 1;
        insert into medios_magneticos_datos (memg_formato, memg_ano, memg_item, memg_tipodoc, memg_nit, memg_dv,memg_apellido1, memg_apellido2,
            memg_nombre1, memg_nombre2, memg_razonsocial, memg_pago)
            values (1006, substr(:inicio,1,4), :item, :tipodoc, :nit, :dv, :apellido1, :apellido2,
            :nombre1, :nombre2, :razonsocial, :iva);
        END
      ELSE
        MENORCUANTIA = MENORCUANTIA + iva;
    END
if (MENORCUANTIA > 0) then
    BEGIN
    EXECUTE PROCEDURE lee_configuracion('CONTABILIDAD', 'GENERAL', 'NIT COMPAÑIA') returning_values (:NIT);
    SELECT TERC_DIR, SUBSTR(CIUD_COD,1,2), SUBSTR(CIUD_COD,3,5), PAIS_ID FROM TERCEROS WHERE TERC_NIT = :NIT
    INTO :dirmenor, :depmenor, :munmenor, :paismenor;
    ITEM = ITEM + 1;
    insert into medios_magneticos_datos (memg_formato, memg_ano, memg_item, memg_tipodoc, memg_nit, memg_dv,memg_apellido1, memg_apellido2,
        memg_nombre1, memg_nombre2, memg_razonsocial, memg_direccion, memg_departamento, memg_municipio, memg_pago, memg_pais)
        values (1006, substr(:inicio,1,4), :item,  43, '222222222', '', '', '',
        '', '', 'CUANTIAS MENORES', :dirmenor, :depmenor, :munmenor, :menorcuantia, :paismenor);
    END
end
^

SET TERM ; ^

/* 20100407B */
/* FALTO INICIALIZAR LAS VARIABLES DE SALDOS SI LA FECHA INICIAL ES POSTERIOR AL INICIO DE LA CIA  */
SET TERM ^ ;

CREATE OR ALTER procedure CERTIFICADOS_RETENCION (
    NITINI varchar(20),
    NITFIN varchar(20),
    CTAINI varchar(20),
    CTAFIN varchar(20),
    FECINI varchar(8),
    FECFIN varchar(8),
    FECEXP date,
    ADMON varchar(60),
    NUMERAR char(1),
    INICIAL varchar(6))
returns (
    NIT varchar(20),
    NOMBRE varchar(60),
    DIRECCION varchar(60),
    CIUDAD varchar(40),
    CODCUENTA varchar(20),
    NOMCUENTA varchar(60),
    BASE numeric(18,2),
    RETENCION numeric(18,2),
    FECHAEXP date,
    ADMINISTRACION varchar(60),
    NUMERO varchar(20))
AS
declare variable actual integer;
declare variable ANOINI CHAR(4);
declare variable MESINI CHAR(2);
declare variable FECHAINI CHAR(8);
declare variable SALDORET NUMERIC(18,2);
declare variable SALDOBASE NUMERIC(18,2);
declare variable PORC NUMERIC(9,2);
begin
EXECUTE PROCEDURE LEE_CONFIGURACION ('CONTABILIDAD', 'GENERAL', 'AÑO DE INICIO') RETURNING_VALUES (:ANOINI);
EXECUTE PROCEDURE LEE_CONFIGURACION ('CONTABILIDAD', 'GENERAL', 'MES DE INICIO') RETURNING_VALUES (:MESINI);
execute procedure compone_fecha_conta (:ANOINI, CAST(:MESINI AS INTEGER), 1) returning_values (FECHAINI);
FECHAEXP = FECEXP;
ADMINISTRACION = ADMON;
ACTUAL = CAST(INICIAL AS INTEGER);
FOR SELECT TERC_NIT, TERC_NOM, TERC_DIR, TERC_CIU FROM TERCEROS
  WHERE TERC_NIT >= :NITINI AND TERC_NIT <= :NITFIN ORDER BY TERC_NIT
  INTO :NIT, :NOMBRE, :DIRECCION, :CIUDAD
  DO
    BEGIN
    FOR SELECT CUEN_COD, CUEN_NOM FROM CUENTAS WHERE CUEN_RETENCION = 'S' AND
      CUEN_COD >= :CTAINI AND CUEN_COD <= :CTAFIN
      INTO :CODCUENTA, :NOMCUENTA
      DO
        BEGIN
        SALDORET = 0;
        SALDOBASE = 0;
        if (FECHAINI > FECINI) then
            BEGIN
            /* INCLUYA LOS SALDOS INICIALES EN EL CERTIFICADO */
            SELECT SUM(SAIN_DEBITO-SAIN_CREDITO) FROM SALDOS_INICIALES
                WHERE CUEN_COD = :CODCUENTA AND TERC_NIT = :NIT
                INTO :SALDORET;
            if (SALDORET IS NULL) then
                SALDORET = 0;
            SELECT CUEN_PORC FROM CUENTAS WHERE CUEN_COD = :CODCUENTA INTO :PORC;
            if (PORC <> 0) then
                SALDOBASE = SALDORET * 100 / PORC;
            END
        SELECT SUM(CODE_BASE), SUM(CODE_DEBITO - CODE_CREDITO)
          FROM COMPROBANTE_ENCABEZADO E, COMPROBANTE_DETALLE D
          WHERE E.ENCO_CONSEC = D.ENCO_CONSEC AND CUEN_COD = :CODCUENTA AND D.TERC_NIT = :NIT AND
          ENCO_FECHA >= :FECINI AND ENCO_FECHA <= :FECFIN
          INTO :base,  :RETENCION;
        if (BASE is null) then
            BASE = 0;
        if (RETENCION is null) then
            RETENCION = 0;
        BASE = BASE + SALDOBASE;
        RETENCION = RETENCION + SALDORET;
        if (RETENCION <> 0) then
            begin
            if (substr(CODCUENTA, 1, 1) = '2') then
                BEGIN
                BASE = BASE * -1;
                RETENCION = RETENCION * -1;
                END
            if (numerar = 'S') then
                BEGIN
                NUMERO = CAST(ACTUAL AS CHAR(6));
                EXECUTE PROCEDURE COMPLETA_CEROS(NUMERO) returning_values (NUMERO);
                NUMERO = 'NUMERO: ' || NUMERO;
                ACTUAL = ACTUAL + 1;
                END
            ELSE
                NUMERO = '';
            SUSPEND;
            end
        END
    END
end
^

SET TERM ; ^


/* 20100409 : aplicaciones por la bd directamente */

ALTER TABLE DEVOLUCIONES_VENTAS
ADD DEVT_APLICA T_BOOLEANO;
ALTER TRIGGER DEVOLUCIONES_VENTAS_AU INACTIVE;
update devoluciones_ventas set devt_aplica = 'N';
commit work;
ALTER TRIGGER DEVOLUCIONES_VENTAS_AU ACTIVE;

SET TERM ^ ;

CREATE OR ALTER procedure SALDOS_FACTURA (
    ID INTEGER,
    FECHA date)
returns (
    SALDO numeric(18,2),
    RTFTE numeric(18,2),
    RTIVA numeric(18,2),
    RTICA numeric(18,2))
AS
declare variable desc_rtes char(2);
declare variable AUTORET VARCHAR(10);
declare variable FAUTORET DATE;
declare variable FECDOC DATE;
declare variable TRM numeric(18,2);
declare variable MONEDA INTEGER;
BEGIN
SELECT FACT_TRM FROM FACTURAS WHERE FACT_ID = :ID INTO :TRM;
/* CALCULE LOS SALDOS */
SELECT SUM(SDCA_RTFTE - SDCA_ABRTFTE), SUM(SDCA_RTIVA - SDCA_ABRTIVA), SUM(SDCA_RTICA - SDCA_ABRTICA)
    FROM SALDOS_DOC_CARTERA WHERE SDCA_TIPOREF = 31 AND SDCA_IDREF = :ID
    INTO :RTFTE, :RTIVA, :RTICA;
if ((RTFTE IS NULL) or (RTFTE < 0))  then
    RTFTE = 0;
if ((RTIVA IS NULL) or (RTIVA < 0 ))  then
    RTIVA = 0;
if ((RTICA IS NULL) or (RTICA < 0))  then
    RTICA = 0;
/* TRAIGA EL SALDO NETO */
if (TRM <> 1) then
    execute procedure lee_configuracion ('GENERAL', 'GENERAL', 'MONEDA PREDETERMINADA EN OPERACIONES CON EL EXTERIOR') returning_values (:moneda);
else
    MONEDA = 0;
EXECUTE PROCEDURE SALDO_DOC_CARTERA(31, ID, FECHA, MONEDA) returning_values (SALDO);
if (TRM <> 0) then
    BEGIN
    RTFTE = RTFTE / TRM;
    RTIVA = RTIVA / TRM;
    RTICA = RTICA / TRM;
    END
if (SALDO <> 0) then
    BEGIN
    EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'FECHA AUTORETENEDOR NO DESCONTAR RETENCIONES DEL SALDO PERO SI CONTABILIZARLAS') returning_values (AUTORET);
    if (AUTORET <> '') then
        FAUTORET = CAST(AUTORET AS DATE);
    else
        FAUTORET = '9999/12/31';
    /* BUSQUE LA FECHA DEL DOCUMENTO */
    SELECT MIN(SDCA_FECHA) FROM SALDOS_DOC_CARTERA WHERE (SDCA_TIPOREF = 31) AND (SDCA_IDREF = :ID) AND (SDCA_MONTO <> 0) INTO :FECDOC;
    if (FAUTORET <= FECDOC) then
        BEGIN
        RTFTE = 0;
        RTIVA = 0;
        RTICA = 0;
        END
    /* RESTE LAS RETENCIONES YA QUE SE SUGERIRAN */
    EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'DESCONTAR RETENCIONES POR CAUSACION') returning_values (DESC_RTES);
    if (DESC_RTES = 'NO') then
        SALDO = SALDO - RTFTE - RTIVA - RTICA;
    SALDO = SALDO;
    END
SUSPEND;
END
^

SET TERM ; ^

grant EXECUTE on PROCEDURE saldos_factura to PUBLIC;

SET TERM ^ ;

CREATE OR ALTER TRIGGER DEVOLUCIONES_VENTAS_AI FOR DEVOLUCIONES_VENTAS
ACTIVE AFTER INSERT POSITION 0
AS
declare variable CONC VARCHAR(60);
declare variable crmeven char(2);
declare variable ID INTEGER;
declare variable nomtipod VARCHAR(8);
declare variable nomtipoF VARCHAR(8);
declare variable PREF VARCHAR(4);
declare variable numero varchar(6);
declare variable SALDO NUMERIC(18,2);
declare variable RTFTE NUMERIC(18,2);
declare variable RTIVA NUMERIC(18,2);
declare variable RTICA NUMERIC(18,2);
declare variable AGENCIA INTEGER;
declare variable IDC INTEGER;
BEGIN
if ((NEW.DEVT_ID <> 0) and (new.devt_anulado = 'N')) then
    BEGIN
    if (((new.devt_remid IS NULL) or (new.devt_remid = 0)) and ((new.devt_pedid IS NULL) or (new.devt_pedid = 0))) then
      if (new.devt_confirmacxc = 'S') then
        begin
        /* Registre el nuevo saldo del documento */
        INSERT INTO SALDOS_DOC_CARTERA (SDCA_TIPOREF, SDCA_IDREF, SDCA_FECHA, TERC_NIT, SDCA_RTFTE, SDCA_RTIVA, SDCA_RTICA, SDCA_ABONO, SDCA_ABRTFTE, SDCA_ABRTIVA, SDCA_ABRTICA, SDCA_DEBITO, SDCA_MONTO, SDCA_TRM)
            VALUES (33, NEW.DEVT_ID, NEW.DEVT_fecha, NEW.terc_nit, (NEW.DEVT_rtftemonto*-1), (NEW.DEVT_rtivamonto*-1), (NEW.DEVT_rticamonto*-1), 0, 0, 0, 0, 'N', (NEW.DEVT_TOTAL*-1), new.devt_trm);
        /* Registre el movimiento del cliente */
        CONC = 'DEVOLUCION VENTA No.' || NEW.PREF_PRE || NEW.DEVT_NUMERO || ' EN FACTURA ' || NEW.devt_factura;
        INSERT INTO MOVIMIENTO_CLIENTES (MVCL_ID, TERC_NIT, MVCL_TIPOREF, MVCL_IDREF, MVCL_FECHA, MVCL_VENCE, MVCL_CONC, MVCL_MONTO, MVCL_RTEFTE, MVCL_RTEIVA, MVCL_RTEICA, MVCL_DEBITO, MVCL_ABONO, MVCL_PREFREF, MVCL_NUMREF, MVCL_SUCURSAL, COBR_COD, MVCL_TRM)
          VALUES (GEN_ID(ID_MOVCLI, 1), NEW.TERC_NIT, 33, NEW.DEVT_ID, NEW.DEVT_FECHA, NEW.DEVT_FECHA, :CONC, NEW.DEVT_TOTAL, NEW.DEVT_RTFTEMONTO, NEW.DEVT_RTIVAMONTO, NEW.DEVT_RTICAMONTO, 'N', 'N', NEW.pref_pre, NEW.DEVT_numero, NEW.devt_sucursal, NEW.cobr_cod, new.devt_trm);
        end
    /* ACTUALICE LA CONSOLIDACION */
    if (NEW.DEVT_CONSOLIDA <> 0) then
        UPDATE consolidado_faltantes SET COFA_IDDES = NEW.devt_id, COFA_OK = 'S' WHERE COFA_ID = NEW.devt_consolida;
    execute procedure lee_configuracion ('CRM', 'EVENTOS', 'GRABAR EVENTOS AUTOMATICAMENTE DESDE DOCUMENTOS DE VENTAS') returning_values (:crmeven);
    if (crmeven = 'SI') then
        begin
        if (new.devt_confirmacxc = 'S') then
            insert into crm_eventos (CREV_TIPO, CREV_ORIGEN, CREV_FECHA, CREV_HORA, CREV_MOTIVO, CREV_ASESOR, CREV_VALOR, CREV_EXPLICA, CREV_OBS, CREV_ACTIVIDAD, CRCL_NIT, CREV_ANULADO)
                VALUES (905, new.devt_id, new.devt_fecha, cast('now' as time), 6, new.vend_cod, new.devt_total, 'Devolución No. ' || new.pref_pre || new.devt_numero, new.devt_obs, 0, new.terc_nit, new.devt_anulado);
        else
            insert into crm_eventos (CREV_TIPO, CREV_ORIGEN, CREV_FECHA, CREV_HORA, CREV_MOTIVO, CREV_ASESOR, CREV_VALOR, CREV_EXPLICA, CREV_OBS, CREV_ACTIVIDAD, CRCL_NIT, CREV_ANULADO)
                VALUES (905, new.devt_id, new.devt_fecha, cast('now' as time), 6, new.vend_cod, new.devt_total, 'Devolución No. ' || new.pref_pre || new.devt_numero || ' sin confirmar cartera.', new.devt_obs, 0, new.terc_nit, new.devt_anulado);
        end
    if (new.devt_factid <> 0) then
        begin
        if (new.devt_confirmacxc = 'S') then
            BEGIN
            INSERT INTO notas_documento (NODO_ID, TIDO_COD, NODO_IDDOC, NODO_FECHA, NODO_USER, NODO_RESUMEN, NODO_TIPO)
                VALUES (GEN_ID(id_notadoc, 1), 31, new.devt_factid, NEW.devt_fecha, user, 'Devolución No. ' || new.pref_pre || new.devt_numero, 7);
        
            EXECUTE PROCEDURE SALDOS_FACTURA(NEW.devt_factid, '9999/12/31') returning_values (:SALDO, :rtfte, :rtiva, :rtica);
            if ((new.devt_aplica = 'S') AND (SALDO >= NEW.devt_total) AND (RTFTE >= NEW.devt_RTFTEMONTO) AND (RTIVA >= NEW.devt_rtivamonto) AND (RTICA >= NEW.devt_rticamonto)) then
                begin
                ID = gen_id(id_aplicaclie, 1);
                SELECT SUCU_ID FROM PREFIJOS WHERE PREF_PRE = NEW.pref_pre AND TIDO_COD = 33 INTO :AGENCIA;
                if (agencia is null) then
                    agencia = 0;
                SELECT FIRST 1 PREF_PRE, PREF_ACTUAL FROM PREFIJOS WHERE ((SUCU_ID = :AGENCIA) or (:AGENCIA = 0)) AND TIDO_COD = 43 and pref_activo = 'S' INTO :PREF, :numero;
                SELECT TIDO_NOMCORTO FROM tipo_documento WHERE TIDO_COD = 33 INTO :nomtipod;
                SELECT TIDO_NOMCORTO FROM tipo_documento WHERE TIDO_COD = 31 INTO :nomtipof;
                INSERT INTO APLICACION_CLIENTE (APCL_ID, TERC_NIT, TIDO_COD, PREF_PRE, APCL_NUMERO,
                    APCL_FECHA, APCL_CONCEPTO, APCL_OBS, APCL_ANULADO, APCL_TRANSMIT, COBR_COD,
                    APCL_USUARIO, APCL_SUCURSAL, NUMOK, APCL_TRM)
                    VALUES (:ID, NEW.terc_nit, 43, :PREF, :NUMERO, NEW.devt_fecha,
                    'APLICACION ' || :nomtipod || ' ' || NEW.pref_pre || NEW.devt_numero || ' A ' || :nomtipof || ' ' || NEW.devt_factura, NULL, 'N', 'N', NEW.cobr_cod,
                    NULL, NEW.devt_sucursal, 'N', 1);
                INSERT INTO APLICACION_CLIENTE_DETALLE (APCL_ID, ACDE_ITEM, ACDE_TIPODOC, ACDE_IDDOC,
                    ACDE_PREFIJO, ACDE_NUMERO, ACDE_APLICADO, ACDE_RTFTE, ACDE_RTIVA, ACDE_RTICA,
                    ACDE_ANULADO, ACDE_TRANSMIT, ACDE_DIFCAMBIO)
                    VALUES (:ID, 1, 33, NEW.devt_id, NEW.pref_pre, NEW.devt_numero, NEW.devt_total*-1, new.devt_rtftemonto*-1, new.devt_rtivamonto*-1, new.devt_rticamonto*-1, 'N', 'N', 0);
                SELECT PREF_PRE, FACT_NUMERO FROM FACTURAS WHERE FACT_ID = NEW.devt_factid INTO :pref, :numero;
                INSERT INTO APLICACION_CLIENTE_DETALLE (APCL_ID, ACDE_ITEM, ACDE_TIPODOC, ACDE_IDDOC,
                    ACDE_PREFIJO, ACDE_NUMERO, ACDE_APLICADO, ACDE_RTFTE, ACDE_RTIVA, ACDE_RTICA,
                    ACDE_ANULADO, ACDE_TRANSMIT, ACDE_DIFCAMBIO)
                    VALUES (:ID, 2, 31, NEW.devt_factid, :pref, :numero, NEW.devt_total, new.devt_rtftemonto, new.devt_rtivamonto, new.devt_rticamonto, 'N', 'N', 0);
                IDC = gen_id(id_cons, 1);
                INSERT INTO CONSOLIDE_FALTANTES (CEFA_ID, CEFA_ITEM, CEFA_TIPODES, CEFA_TIPOORI, CEFA_IDORI)
                    VALUES (:IDC, 0, 43, 33, NEW.devt_id);
                INSERT INTO CONSOLIDADO_FALTANTES (COFA_ITEM, COFA_ID, COFA_TIPODES, COFA_TIPOORI, COFA_IDORI, COFA_IDDES, COFA_OK)
                    VALUES (1, :IDC, 43, 33, NEW.devt_id, :ID, 'S');
                end
            END
        else
            INSERT INTO notas_documento (NODO_ID, TIDO_COD, NODO_IDDOC, NODO_FECHA, NODO_USER, NODO_RESUMEN, NODO_TIPO)
                VALUES (GEN_ID(id_notadoc, 1), 31, new.devt_factid, NEW.devt_fecha, user, 'Devolución No. ' || new.pref_pre || new.devt_numero || ' sin confirmar cartera', 7);
        end

    INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
        VALUES (USER, 33, NEW.devt_id, 'I', NEW.pref_pre || NEW.devt_numero);
    END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER DEVOLUCIONES_VENTAS_AU FOR DEVOLUCIONES_VENTAS
ACTIVE AFTER UPDATE POSITION 0
AS
declare variable ABONOS integer;
declare variable CONC VARCHAR(60);
declare variable consec INTEGER;
declare variable ID INTEGER;
declare variable nomtipod VARCHAR(8);
declare variable nomtipoF VARCHAR(8);
declare variable PREF VARCHAR(4);
declare variable numero varchar(6);
declare variable SALDO NUMERIC(18,2);
declare variable RTFTE NUMERIC(18,2);
declare variable RTIVA NUMERIC(18,2);
declare variable RTICA NUMERIC(18,2);
declare variable AGENCIA INTEGER;
declare variable IDC INTEGER;
BEGIN
if (new.devt_anulado = 'S') then
    begin
    select enco_consec from comprobante_encabezado where enco_tiporef = 33 and enco_idref = old.devt_id into :consec;
    if (NOT consec is null) then
      delete from comprobante_detalle where enco_consec = :consec;
    delete from comprobante_encabezado where enco_tiporef = 33 and enco_idref = old.devt_id;
    delete from crm_eventos where crev_tipo = 905 and crev_origen = old.devt_id;

    DELETE FROM puntos_cliente WHERE PTCL_TIPODOC = 33 AND PTCL_IDDOC = OLD.devt_id;

    /* SI SE HIZO APLICACION ANULELA */
    ID = 0;
    SELECT COFA_IDDES FROM consolidado_faltantes WHERE COFA_TIPODES = 43 AND COFA_TIPOORI = 33 AND COFA_IDORI = OLD.devt_id INTO :ID;
    if (ID <> 0) then
        UPDATE aplicacion_cliente SET APCL_ANULADO = 'S' WHERE APCL_ID = :ID;

    INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
        VALUES (USER, 33, NEW.devt_id, 'A', NEW.pref_pre || NEW.devt_numero);
    end
ELSE
    BEGIN
    /* SI SE HIZO APLICACION ANULELA */
    ID = 0;
    SELECT COFA_IDDES FROM consolidado_faltantes WHERE COFA_TIPODES = 43 AND COFA_TIPOORI = 33 AND COFA_IDORI = OLD.devt_id INTO :ID;
    if (ID <> 0) then
        BEGIN
        DELETE FROM aplicacion_cliente_detalle WHERE APCL_ID = :ID;
        DELETE FROM aplicacion_cliente WHERE APCL_ID = :ID;
        delete from consolidado_faltantes WHERE COFA_TIPODES = 43 AND COFA_TIPOORI = 33 AND COFA_IDORI = OLD.devt_id;
        END
    END
if ((old.DEVT_id <> 0) and (old.devt_anulado = 'N')) then
    begin
    if (((old.devt_remid = 0) or (old.devt_remid is null)) and ((old.devt_pedid = 0) or (old.devt_pedid is null))) then
        begin
        ABONOS = 0;
        select COUNT(*) FROM SALDOS_DOC_CARTERA WHERE SDCA_TIPOREF = 33 AND SDCA_IDREF = OLD.DEVT_ID AND SDCA_ABONO <> 0 INTO :ABONOS;
        if (ABONOS = 0) then
            BEGIN
            /* BORRE EL REGISTRO PREVIO */
            delete from saldos_doc_cartera where sdca_tiporef = 33 and sdca_idref = old.devt_id;
            delete from movimiento_clientes where (mvcl_tiporef = 33) and (mvcl_idref = old.devt_id);

            /* ACTUALICE LA CONSOLIDACION */
            if (OLD.DEVT_CONSOLIDA <> 0) then
                UPDATE consolidado_faltantes SET COFA_OK = 'N' WHERE COFA_ID = old.devt_consolida;
            END
        else
            exception DOCUMENTO_CON_ABONOS 'La devolución ' || old.pref_pre || old.devt_numero || ' tiene abonos registrados.';
        end
    else
        if (OLD.DEVT_CONSOLIDA <> 0) then
            UPDATE consolidado_faltantes SET COFA_OK = 'N' WHERE COFA_ID = old.devt_consolida;
    END
if ((new.DEVT_id <> 0) and (new.devt_anulado = 'N')) then
    BEGIN
    if (((new.devt_remid IS NULL) or (new.devt_remid = 0)) and ((new.devt_pedid IS NULL) or (new.devt_pedid = 0))) then
        begin
        if (new.devt_confirmacxc = 'S') then
            begin
            /* Registre el nuevo saldo del documento */
            INSERT INTO SALDOS_DOC_CARTERA (SDCA_TIPOREF, SDCA_IDREF, SDCA_FECHA, TERC_NIT, SDCA_RTFTE, SDCA_RTIVA, SDCA_RTICA, SDCA_ABONO, SDCA_ABRTFTE, SDCA_ABRTIVA, SDCA_ABRTICA, SDCA_DEBITO, SDCA_MONTO, SDCA_TRM)
                VALUES (33, NEW.DEVT_ID, NEW.DEVT_fecha, NEW.terc_nit, (NEW.DEVT_rtftemonto*-1), (NEW.DEVT_rtivamonto*-1), (NEW.DEVT_rticamonto*-1), 0, 0, 0, 0, 'N', (NEW.DEVT_TOTAL*-1), NEW.devt_trm);
            /* Registre el movimiento del cliente */
            CONC = 'DEVOLUCION VENTA No.' || NEW.PREF_PRE || NEW.DEVT_NUMERO || ' EN FACTURA ' || NEW.devt_factura;
            INSERT INTO MOVIMIENTO_CLIENTES (MVCL_ID, TERC_NIT, MVCL_TIPOREF, MVCL_IDREF, MVCL_FECHA, MVCL_VENCE, MVCL_CONC, MVCL_MONTO, MVCL_RTEFTE, MVCL_RTEIVA, MVCL_RTEICA, MVCL_DEBITO, MVCL_ABONO, MVCL_PREFREF, MVCL_NUMREF, MVCL_SUCURSAL, COBR_COD, MVCL_TRM)
                VALUES (GEN_ID(ID_MOVCLI, 1), NEW.TERC_NIT, 33, NEW.DEVT_ID, NEW.DEVT_FECHA, NEW.DEVT_FECHA, :CONC, NEW.DEVT_TOTAL, NEW.DEVT_RTFTEMONTO, NEW.DEVT_RTIVAMONTO, NEW.DEVT_RTICAMONTO, 'N', 'N', NEW.pref_pre, NEW.DEVT_numero, NEW.devt_sucursal, NEW.cobr_cod, NEW.devt_trm);

            if (new.devt_factid <> 0) then
                begin
                EXECUTE PROCEDURE SALDOS_FACTURA(NEW.devt_factid, '9999/12/31') returning_values (:SALDO, :rtfte, :rtiva, :rtica);
                if ((new.devt_aplica = 'S') AND (SALDO >= NEW.devt_total) AND (RTFTE >= NEW.devt_RTFTEMONTO) AND (RTIVA >= NEW.devt_rtivamonto) AND (RTICA >= NEW.devt_rticamonto)) then
                    begin
                    ID = gen_id(id_aplicaclie, 1);
                    SELECT SUCU_ID FROM PREFIJOS WHERE PREF_PRE = NEW.pref_pre AND TIDO_COD = 33 INTO :AGENCIA;
                    if (agencia is null) then
                        agencia = 0;
                    SELECT FIRST 1 PREF_PRE, PREF_ACTUAL FROM PREFIJOS WHERE ((SUCU_ID = :AGENCIA) or (:AGENCIA = 0)) AND TIDO_COD = 43 and pref_activo = 'S' INTO :PREF, :numero;
                    SELECT TIDO_NOMCORTO FROM tipo_documento WHERE TIDO_COD = 33 INTO :nomtipod;
                    SELECT TIDO_NOMCORTO FROM tipo_documento WHERE TIDO_COD = 31 INTO :nomtipof;
                    INSERT INTO APLICACION_CLIENTE (APCL_ID, TERC_NIT, TIDO_COD, PREF_PRE, APCL_NUMERO,
                        APCL_FECHA, APCL_CONCEPTO, APCL_OBS, APCL_ANULADO, APCL_TRANSMIT, COBR_COD,
                        APCL_USUARIO, APCL_SUCURSAL, NUMOK, APCL_TRM)
                        VALUES (:ID, NEW.terc_nit, 43, :PREF, :NUMERO, NEW.devt_fecha,
                        'APLICACION ' || :nomtipod || ' ' || NEW.pref_pre || NEW.devt_numero || ' A ' || :nomtipof || ' ' || NEW.devt_factura, NULL, 'N', 'N', NEW.cobr_cod,
                        NULL, NEW.devt_sucursal, 'N', 1);
                    INSERT INTO APLICACION_CLIENTE_DETALLE (APCL_ID, ACDE_ITEM, ACDE_TIPODOC, ACDE_IDDOC,
                        ACDE_PREFIJO, ACDE_NUMERO, ACDE_APLICADO, ACDE_RTFTE, ACDE_RTIVA, ACDE_RTICA,
                        ACDE_ANULADO, ACDE_TRANSMIT, ACDE_DIFCAMBIO)
                        VALUES (:ID, 1, 33, NEW.devt_id, NEW.pref_pre, NEW.devt_numero, NEW.devt_total*-1, new.devt_rtftemonto*-1, new.devt_rtivamonto*-1, new.devt_rticamonto*-1, 'N', 'N', 0);
                    SELECT PREF_PRE, FACT_NUMERO FROM FACTURAS WHERE FACT_ID = NEW.devt_factid INTO :pref, :numero;
                    INSERT INTO APLICACION_CLIENTE_DETALLE (APCL_ID, ACDE_ITEM, ACDE_TIPODOC, ACDE_IDDOC,
                        ACDE_PREFIJO, ACDE_NUMERO, ACDE_APLICADO, ACDE_RTFTE, ACDE_RTIVA, ACDE_RTICA,
                        ACDE_ANULADO, ACDE_TRANSMIT, ACDE_DIFCAMBIO)
                        VALUES (:ID, 2, 31, NEW.devt_factid, :pref, :numero, NEW.devt_total, new.devt_rtftemonto, new.devt_rtivamonto, new.devt_rticamonto, 'N', 'N', 0);
                    IDC = gen_id(id_cons, 1);
                    INSERT INTO CONSOLIDE_FALTANTES (CEFA_ID, CEFA_ITEM, CEFA_TIPODES, CEFA_TIPOORI, CEFA_IDORI)
                        VALUES (:IDC, 0, 43, 33, NEW.devt_id);
                    INSERT INTO CONSOLIDADO_FALTANTES (COFA_ITEM, COFA_ID, COFA_TIPODES, COFA_TIPOORI, COFA_IDORI, COFA_IDDES, COFA_OK)
                        VALUES (1, :IDC, 43, 33, NEW.devt_id, :ID, 'S');
                    end
                end
            end
        /* ACTUALICE LA CONSOLIDACION */
        if (NEW.DEVT_CONSOLIDA <> 0) then
            UPDATE consolidado_faltantes SET COFA_IDDES = NEW.devt_id, COFA_OK = 'S' WHERE COFA_ID = NEW.devt_consolida;
        end
    INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
        VALUES (USER, 33, NEW.devt_id, 'U', NEW.pref_pre || NEW.devt_numero);
    END
/* si cambio un dato critico actualice el detalle */
if ((OLD.devt_fecha <> NEW.devt_fecha) or
    (OLD.devt_numero <> NEW.devt_numero) or
    (OLD.pref_pre <> NEW.pref_pre) or
    (OLD.devt_factid <> NEW.devt_factid)) then
    UPDATE DEVOLUCIONES_VENTAS_DETALLE
        SET DVDE_TRANSMIT = 'N'
        WHERE DEVT_ID = NEW.DEVT_ID;
/* ACTUALICE EL ANULADO EN LOS DETALLES */
if (OLD.DEVT_anulado <> NEW.DEVT_anulado) then
    UPDATE DEVOLUCIONES_VENTAS_DETALLE
        SET DVDE_ANULADO = NEW.DEVT_anulado
        WHERE DEVT_ID = NEW.DEVT_ID;
if (OLD.devt_transmit <> NEW.devt_transmit) then
    UPDATE DEVOLUCIONES_VENTAS_DETALLE
        SET DVDE_TRANSMIT = NEW.devt_transmit
        WHERE DEVT_ID = NEW.DEVT_ID;
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER DEVOLUCIONES_VENTAS_AD FOR DEVOLUCIONES_VENTAS
ACTIVE AFTER DELETE POSITION 0
as
declare variable ABONOS INTEGER;
declare variable consec INTEGER;
declare variable ID INTEGER;
begin
select enco_consec from comprobante_encabezado where enco_tiporef = 33 and enco_idref = old.devt_id into :consec;
if (NOT consec is null) then
 delete from comprobante_detalle where enco_consec = :consec;
delete from comprobante_encabezado where enco_tiporef = 33 and enco_idref = old.devt_id;

DELETE FROM puntos_cliente WHERE PTCL_TIPODOC = 33 AND PTCL_IDDOC = OLD.devt_id;
delete from crm_eventos where crev_tipo = 905 and crev_origen = old.devt_id;

/* SI SE HIZO APLICACION ANULELA */
ID = 0;
SELECT COFA_IDDES FROM consolidado_faltantes WHERE COFA_TIPODES = 43 AND COFA_TIPOORI = 33 AND COFA_IDORI = OLD.devt_id INTO :ID;
if (ID <> 0) then
    BEGIN
    DELETE FROM aplicacion_cliente_detalle WHERE APCL_ID = :ID;
    DELETE FROM aplicacion_cliente WHERE APCL_ID = :ID;
    delete from consolidado_faltantes WHERE COFA_TIPODES = 43 AND COFA_TIPOORI = 33 AND COFA_IDORI = OLD.devt_id;
    END

INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
    VALUES (USER, 33, OLD.devt_id, 'D', OLD.pref_pre || OLD.devt_numero);
if ((OLD.DEVT_anulado = 'N') AND (OLD.DEVT_ID <> 0)) then
    begin
    /* Verifique si habia abonos */
    ABONOS = 0;
    select COUNT(*) FROM SALDOS_DOC_CARTERA WHERE SDCA_TIPOREF = 33 AND SDCA_IDREF = OLD.DEVT_ID AND SDCA_ABONO <> 0 INTO :ABONOS;
    if (ABONOS = 0) then
        BEGIN
        /* BORRE EL REGISTRO PREVIO */
        delete from saldos_doc_cartera where sdca_tiporef = 33 and sdca_idref = old.devt_id;
        delete from movimiento_clientes where (mvcl_tiporef = 33) and (mvcl_idref = old.devt_id);
        END
    else
        exception DOCUMENTO_CON_ABONOS 'La devolución ' || old.pref_pre || old.devt_numero || ' tiene abonos registrados.';
    END
end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER DEVOLUCIONES_VENTAS_BI FOR DEVOLUCIONES_VENTAS
ACTIVE BEFORE INSERT POSITION 0
AS
declare variable NUMERO VARCHAR(6);
declare variable AUTOM CHAR(1);
declare variable EXISTE CHAR(1);
declare variable SITOT CHAR(2);
declare variable CODCOBR INTEGER;
declare variable CODVEND INTEGER;
declare variable FECSERVER CHAR(2);
declare variable PREGTASA CHAR(2);
BEGIN
if ((NEW.devt_trm IS NULL) or (NEW.devt_trm = 0)) then
    NEW.devt_trm = 1;
EXECUTE PROCEDURE LEE_CONFIGURACION('GENERAL', 'GENERAL', 'PREGUNTAR TASA DE CAMBIO EN DOCUMENTOS DE CARTERA') returning_values (:pregtasa);
if (PREGTASA = 'SI') then
    BEGIN
    NEW.devt_adicional = NEW.devt_adicional * NEW.devt_trm;
    NEW.devt_ivamonto = NEW.devt_ivamonto * NEW.devt_trm;
    NEW.devt_extra = NEW.devt_extra * NEW.devt_trm;
    NEW.devt_rtftemonto = NEW.devt_rtftemonto * NEW.devt_trm;
    NEW.devt_rtivamonto = NEW.devt_rtivamonto * NEW.devt_trm;
    NEW.devt_rticamonto = NEW.devt_rticamonto * NEW.devt_trm;
    NEW.devt_dtomonto = NEW.devt_dtomonto * NEW.devt_trm;
    END
EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION', 'DOCUMENTOS', 'INHABILITAR FECHA EN DOCUMENTOS') returning_values (:fecserver);
if (FECSERVER = 'SI') then
    NEW.devt_fecha = CAST ('NOW' AS DATE);
if (new.devt_remid is null) then
    NEW.devt_remid = 0;
if (new.devt_pedid is null) then
    NEW.devt_pedid = 0;
execute procedure LEE_CONFIGURACION ('FACTURACION','DEVOLUCIONES','PERMITIR DEVOLVER ITEMS NO FACTURADOS') returning_values (:SITOT);
if ((SITOT = 'NO') AND (NEW.devt_factid = 0) AND (NEW.devt_remid = 0) AND (NEW.devt_pedid = 0)) then
    exception factura_no_existe;
/* CALCULE LA COMISION CON BASE EN LA FACTURA */
EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION', 'VENDEDORES', 'COMISIONES EN VENTA INCLUYENDO IMPUESTOS') returning_values (:SITOT);
SELECT FACT_COMIPORC FROM FACTURAS WHERE FACT_ID = NEW.devt_factid INTO NEW.devt_comiporc;
if (NEW.devt_comiporc IS NULL) then
    NEW.devt_comiporc = 0;

if (SITOT = 'SI') then
    NEW.devt_comimonto = NEW.devt_total * NEW.devt_comiporc / 100;
ELSE
    NEW.devt_comimonto = (NEW.devt_total - NEW.devt_ivamonto) * NEW.devt_comiporc / 100;

if (NEW.numok = 'N') then
  BEGIN
  /* Actualice el contador del prefijo */
  SELECT PREF_ACTUAL, PREF_AUTO FROM PREFIJOS WHERE TIDO_COD = 33 AND PREF_PRE = NEW.PREF_PRE INTO :NUMERO, :AUTOM;
  /* ACTUALICE EL NUMERO EN COMPROBANTE_ENCABEZADO  */
  if (AUTOM = 'S') then
    BEGIN
    NEW.DEVT_NUMERO = NUMERO;
    NUMERO = CAST((CAST(NUMERO AS INTEGER) + 1) AS CHAR(6));
    UPDATE PREFIJOS
      SET PREF_ACTUAL = :NUMERO
    WHERE TIDO_COD = 33 AND PREF_PRE = NEW.PREF_PRE;
    END
  ELSE
    BEGIN
    if (CAST(NUMERO AS INTEGER) = CAST(NEW.DEVT_NUMERO AS INTEGER)) then
        UPDATE PREFIJOS
          SET PREF_ACTUAL = CAST((CAST(PREF_ACTUAL AS INTEGER) + 1) AS CHAR(6))
        WHERE TIDO_COD = 33 AND PREF_PRE = NEW.PREF_PRE;
    END
  EXECUTE PROCEDURE COMPLETA_CEROS (NEW.DEVT_numero) returning_values (NEW.DEVT_numero);
  NEW.numok = 'S';
  END
/* Verifique que el numero no existe previamente */
EXISTE = 'N';
SELECT 'S' FROM DEVOLUCIONES_VENTAS WHERE PREF_PRE = NEW.PREF_PRE AND DEVT_NUMERO = NEW.DEVT_NUMERO INTO :EXISTE;
if (EXISTE = 'S') then
    EXCEPTION DOCUMENTO_REGISTRADO 'Ya existe una devolución con el número ' || new.pref_pre || new.devt_numero;
select COBR_COD, VEND_COD FROM CLIENTES WHERE TERC_NIT = NEW.terc_nit INTO :CODCOBR, CODVEND;
if (NEW.cobr_cod IS NULL) then
    NEW.cobr_cod = :CODCOBR;
if (NEW.vend_cod IS NULL) then
    NEW.vend_cod = :CODVEND;
if (NEW.devt_aplica IS NULL) then
    NEW.devt_aplica = 'N';
if ((new.DEVT_TOTAL-new.DEVT_IVAMONTO+new.DEVT_DTOMONTO-new.DEVT_ADICIONAL) = 0) then
    NEW.DEVT_FACTOR = 1;
else
    NEW.DEVT_FACTOR = (new.DEVT_TOTAL-new.DEVT_IVAMONTO)/(new.DEVT_TOTAL-new.DEVT_IVAMONTO+new.DEVT_DTOMONTO-new.DEVT_ADICIONAL);
END
^

SET TERM ; ^


/* 20100409B */
/* ACTUALICE CONSOLIDADO RECURSIVAMENTE */
SET TERM ^ ;

CREATE OR ALTER TRIGGER FACTURAS_DETALLE_AI FOR FACTURAS_DETALLE
ACTIVE AFTER INSERT POSITION 0
AS
declare variable fec date;
declare variable NOMCLI VARCHAR(60);
declare variable CONC VARCHAR(60);
declare variable Pref varchar(4);
declare variable Num varchar(6);
declare variable Nit varchar(20);
declare variable TIPO INTEGER;
declare variable INVFAC CHAR(2);
declare variable PEDAUTO CHAR(2);
declare variable CANTREL NUMERIC(18,4);
declare variable CONSO CHAR(2);
declare variable CONSOLIDA INTEGER;
declare variable ESPOS CHAR(1);
declare variable BONOS CHAR(2);
declare variable VRBONO NUMERIC(18,2);
declare variable I INTEGER;
declare variable ITEM INTEGER;
declare variable CANTAUX NUMERIC(18,4);
declare variable CANT NUMERIC(18,4);
declare variable FACTOR NUMERIC(18,2);
BEGIN
select fact_fecha, pref_pre, fact_numero, terc_nit, fact_nomcliente, fact_consolida
    from facturas where fact_id = new.fact_id
    into :fec, :Pref, :Num, :Nit, :Nomcli, :Consolida;
if ((NEW.fact_id <> 0) and (new.fade_anulado = 'N')) then
    BEGIN
    EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION','FACTURAS','GENERAR PEDIDO AUTOMATICAMENTE CON LA FACTURA') RETURNING_VALUES (PEDAUTO);
    SELECT MAX(CEFA_TIPOORI) FROM consolide_faltantes WHERE CEFA_ID = :CONSOLIDA INTO :TIPO;
    if (Tipo IS NULL) then
        Tipo = 0;
    execute procedure lee_configuracion('FACTURACION', 'FACTURAS', 'AFECTAR INVENTARIO CON LA FACTURA') returning_values (:INVFAC);
    SELECT MIN(AUTO_ESPOS) FROM AUTORIZACIONES WHERE PREF_PRE = :pref INTO :ESPOS;
    if (ESPOS = 'S') then
        BEGIN
        INVFAC = 'SI';
        PEDAUTO = 'NO';
        END
    /* si se hizo con base en una remisi¢n no afecte inventario */
    if ((Tipo <> 32) and (INVFAC = 'SI')) then
        begin
        if (STRLEN(NOMCLI) > 42) then
            CONC = 'FV No.' || :pref || :num || '-' || SUBSTR(NOMCLI, 1, 42);
        ELSE
            CONC = 'FV No.' || :pref || :NUM || '-' || NOMCLI;
        INSERT INTO MOVIMIENTO_ARTICULO
            (ARTI_COD, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM, TERC_NIT)
            VALUES(NEW.ARTI_COD, NEW.BODE_COD, :FEC, 31, NEW.fact_id,
            :CONC, new.fade_factor * new.fade_cant, 0, 'N', new.fade_lote, :Pref, :Num, new.fade_item, :Nit);
        end
    if (PEDAUTO = 'SI') then
        BEGIN
        INSERT INTO PEDIDOS_DETALLE (PEDI_ID, PEDE_ITEM, ARTI_COD, PEDE_CANT, PEDE_UNIDAD, PEDE_DTOPORC, PEDE_DTOMONTO, PEDE_IVAPORC, PEDE_IVAMONTO, PEDE_CONSUMO, PEDE_FACTOR, PEDE_DESC, PEDE_OBS, PEDE_CODBAR, PEDE_TOTAL, PEDE_ANULADO, PEDE_TRANSMIT, LIPR_COD, PEDE_REFERENCIA, PEDE_PRUNIT, PEDE_FACTURAD, PEDE_REMISIONAD, PEDE_RESERVA, BODE_COD)
            VALUES (GEN_ID(id_pedido,0), NEW.FADE_ITEM, NEW.ARTI_COD, NEW.FADE_CANT, NEW.FADE_UNIDAD, NEW.FADE_DTOPORC, NEW.FADE_DTOMONTO, NEW.FADE_IVAPORC, NEW.FADE_IVAMONTO, NEW.FADE_CONSUMO, NEW.FADE_FACTOR, NEW.FADE_DESC, NEW.FADE_OBS, NEW.FADE_CODBAR, NEW.FADE_TOTAL, 'N', 'N', NEW.LIPR_COD, NEW.FADE_REFERENCIA, NEW.FADE_PRUNIT, NEW.FADE_CANT * NEW.FADE_FACTOR, 0, NEW.FADE_CANT * NEW.FADE_FACTOR, NEW.bode_cod);
        END
    ELSE
        BEGIN
        if (CONSOLIDA <> 0) then
            BEGIN
            EXECUTE procedure LEE_CONFIGURACION ('FACTURACION','DOCUMENTOS','DEJAR PENDIENTES LOS ARTICULOS NO INCLUIDOS AL TRAER DOCUMENTOS RELACIONADOS') returning_values (CONSO);
            if (CONSO = 'NO') then
                UPDATE consolidado_faltantes SET COFA_IDDES = NEW.fact_id, COFA_OK = 'S' WHERE COFA_ID = :consolida;
            ELSE
                BEGIN
                CANTAUX = NEW.fade_cant * NEW.fade_factor;
                FOR SELECT COFA_ITEM, COFA_CANT, COFA_FACTOR FROM consolidado_faltantes
                    WHERE COFA_ID = :CONSOLIDA AND ARTI_COD = NEW.ARTI_COD AND COFA_OK = 'N'
                    INTO :ITEM, :CANT, :FACTOR
                    DO
                    BEGIN
                    if ((CANTAUX > 0) and ((CANT * FACTOR) > 0))then
                        if ((CANT * FACTOR) < CANTAUX) then
                            BEGIN
                            UPDATE consolidado_faltantes
                                SET COFA_IDDES = NEW.fact_id, COFA_OK = 'S'
                                WHERE COFA_ID = :consolida AND COFA_ITEM = :ITEM;
                            CANTAUX = CANTAUX - (CANT * FACTOR);
                            END
                        ELSE
                            BEGIN
                                UPDATE consolidado_faltantes
                                    SET COFA_IDDES = NEW.fact_id, COFA_CANT = :CANTAUX, COFA_FACTOR = 1, COFA_OK = 'S'
                                    WHERE COFA_ID = :consolida AND COFA_ITEM = :ITEM;
                            CANTAUX = 0;
                            END
                    END
                END
            END
        END
    EXECUTE procedure LEE_CONFIGURACION ('FACTURACION', 'ARTICULOS', 'PERMITIR GENERAR BONOS DE PAGO AL FACTURAR ARTICULOS SELECCIONADOS') returning_values (BONOS);
    if (BONOS = 'SI') then
        BEGIN
        SELECT ARTI_VALORBONO FROM ARTICULO WHERE ARTI_COD = NEW.arti_cod INTO :VRBONO;
        if (VRBONO <> 0) then
            BEGIN
            I = 1;
            WHILE (I <= (NEW.fade_cant * NEW.fade_factor)) DO
                BEGIN
                INSERT INTO BONOS_PAGO (BOPA_ID, BOPA_FACTURA, BOPA_PREF, BOPA_NUMERO, BOPA_FECHA, BOPA_ITEM, BOPA_MONTO, BOPA_IDRDC)
                    VALUES (GEN_ID(ID_BONOPAGO, 1), NEW.fact_id, :pref, :num, :fec, :I, :VRBONO, 0);
                I = I + 1;
                END
            END
        END
    END
END
^

SET TERM ; ^


SET TERM ^ ;

CREATE OR ALTER TRIGGER FACTURAS_DETALLE_AU FOR FACTURAS_DETALLE
ACTIVE AFTER UPDATE POSITION 0
as
declare variable fec date;
declare variable CONC VARCHAR(60);
declare variable NOMCLI varchar(60);
declare variable Pref varchar(4);
declare variable Num varchar(6);
declare variable Nit varchar(20);
declare variable factor numeric(18,4);
declare variable INVFAC CHAR(2);
declare variable TIPO INTEGER;
declare variable PEDAUTO CHAR(2);
declare variable CANTREL NUMERIC(18,4);
declare variable CONSO CHAR(2);
declare variable CONSOLIDA INTEGER;
declare variable consec INTEGER;
declare variable ESPOS CHAR(1);
declare variable BONOS CHAR(2);
declare variable VRBONO NUMERIC(18,2);
declare variable I INTEGER;
declare variable ITEM INTEGER;
declare variable CANTAUX NUMERIC(18,4);
declare variable CANT NUMERIC(18,4);
BEGIN
EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION','FACTURAS','GENERAR PEDIDO AUTOMATICAMENTE CON LA FACTURA') RETURNING_VALUES (PEDAUTO);
if ((OLD.fact_id <> 0) AND (OLD.fade_anulado = 'N')) then
    BEGIN
    if ((OLD.FADE_CANT * OLD.FADE_FACTOR <> NEW.fade_cant * NEW.fade_factor) or (OLD.fade_total <> NEW.fade_total) or (OLD.arti_cod <> NEW.arti_cod) or (NEW.fade_anulado = 'S')) then
        begin
        DELETE FROM MOVIMIENTO_ARTICULO WHERE (mvar_tipodoc = 31) and (mvar_idref = OLD.fact_id) and (mvar_item = old.fade_item);

        if (PEDAUTO = 'SI') then
            BEGIN
            SELECT pref_pre, fact_numero from facturas where fact_id = OLD.fact_id
                into :Pref, :Num;
            SELECT PEDI_ID FROM PEDIDOS WHERE PREF_PRE = :pref AND PEDI_NUMERO = :num into :consec;
            if (consec is not null) then
              DELETE FROM PEDIDOS_DETALLE WHERE PEDE_ITEM = OLD.FADE_ITEM AND PEDI_ID = :consec;
            END
        ELSE
            BEGIN
            /* DESHAGA LOS PENDIENTES */
            SELECT fact_consolida from facturas where fact_id = OLD.fact_id into :Consolida;
            if (CONSOLIDA <> 0) then
                BEGIN
                CANTAUX = OLD.fade_cant * OLD.fade_factor;
                FOR SELECT COFA_ITEM, COFA_CANT, COFA_FACTOR FROM consolidado_faltantes
                    WHERE COFA_ID = :CONSOLIDA AND ARTI_COD = OLD.ARTI_COD AND COFA_OK = 'S'
                    INTO :ITEM, :CANT, :FACTOR
                    DO
                    BEGIN
                    if ((CANTAUX > 0) and ((CANT * FACTOR) > 0))then
                        BEGIN
                        UPDATE consolidado_faltantes
                            SET COFA_IDDES = 0, COFA_OK = 'N'
                            WHERE COFA_ID = :consolida AND COFA_ITEM = :ITEM;
                        CANTAUX = CANTAUX - (CANT * FACTOR);
                        END
                    END
                END
            END
        delete from bonos_pago where bopa_factura = old.fact_id;
        end
    END
if ((NEW.fact_id <> 0) and (new.fade_anulado = 'N')) then
    if ((OLD.fact_id = 0) OR (OLD.FADE_CANT * OLD.FADE_FACTOR <> NEW.fade_cant * NEW.fade_factor) or (OLD.fade_total <> NEW.fade_total) or (OLD.arti_cod <> NEW.arti_cod) or (OLD.fade_anulado = 'S')) then
      BEGIN
      select fact_fecha, pref_pre, fact_numero, terc_nit, fact_nomcliente, fact_consolida
            from facturas where fact_id = new.fact_id
            into :fec, :Pref, :Num, :Nit, :Nomcli, :Consolida;
      SELECT MAX(CEFA_TIPOORI) FROM consolide_faltantes WHERE CEFA_ID = :CONSOLIDA INTO :TIPO;
      if (Tipo IS NULL) then
        Tipo = 0;
      execute procedure lee_configuracion('FACTURACION', 'FACTURAS', 'AFECTAR INVENTARIO CON LA FACTURA') returning_values (:INVFAC);
      SELECT MIN(AUTO_ESPOS) FROM AUTORIZACIONES WHERE PREF_PRE = :pref INTO :ESPOS;
      if (ESPOS = 'S') then
        BEGIN
        INVFAC = 'SI';
        PEDAUTO = 'NO';
        END
       /* si se hizo con base en una remisi¢n no afecte inventario */
      if ((Tipo <> 32) and (INVFAC = 'SI')) then
        begin
        if (STRLEN(NOMCLI) > 29) then
            CONC = 'FACTURA DE VENTA No.' || PREF || NUM || '-' || SUBSTR(NOMCLI,1,29);
        ELSE
            CONC = 'FACTURA DE VENTA No.' || PREF || NUM || '-' || NOMCLI;
        DELETE FROM MOVIMIENTO_ARTICULO WHERE (mvar_tipodoc = 31) and (mvar_idref = OLD.fact_id) and (mvar_item = old.fade_item);
        execute procedure factor_unidad_cant(new.arti_cod, new.fade_unidad) returning_values(factor);
        INSERT INTO MOVIMIENTO_ARTICULO
            (ARTI_COD, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM, TERC_NIT)
            VALUES(NEW.ARTI_COD, NEW.BODE_COD, :FEC, 31, NEW.fact_id,
            :CONC, :factor * new.fade_cant, 0, 'N', new.fade_lote, :Pref, :Num, new.fade_item, :Nit);
        end
      if (PEDAUTO = 'SI') then
        BEGIN
        INSERT INTO PEDIDOS_DETALLE (PEDI_ID, PEDE_ITEM, ARTI_COD, PEDE_CANT, PEDE_UNIDAD, PEDE_DTOPORC, PEDE_DTOMONTO, PEDE_IVAPORC, PEDE_IVAMONTO, PEDE_CONSUMO, PEDE_FACTOR, PEDE_DESC, PEDE_OBS, PEDE_CODBAR, PEDE_TOTAL, PEDE_ANULADO, PEDE_TRANSMIT, LIPR_COD, PEDE_REFERENCIA, PEDE_PRUNIT, PEDE_FACTURAD, PEDE_REMISIONAD, PEDE_RESERVA, BODE_COD)
            VALUES (0, NEW.FADE_ITEM, NEW.ARTI_COD, NEW.FADE_CANT, NEW.FADE_UNIDAD, NEW.FADE_DTOPORC, NEW.FADE_DTOMONTO, NEW.FADE_IVAPORC, NEW.FADE_IVAMONTO, NEW.FADE_CONSUMO, NEW.FADE_FACTOR, NEW.FADE_DESC, NEW.FADE_OBS, NEW.FADE_CODBAR, NEW.FADE_TOTAL, 'N', 'N', NEW.LIPR_COD, NEW.FADE_REFERENCIA, NEW.FADE_PRUNIT, NEW.FADE_CANT * NEW.FADE_FACTOR, 0, NEW.FADE_CANT * NEW.FADE_FACTOR, NEW.bode_cod);
        END
      ELSE
        BEGIN
        if (CONSOLIDA <> 0) then
            BEGIN
            EXECUTE procedure LEE_CONFIGURACION ('FACTURACION','DOCUMENTOS','DEJAR PENDIENTES LOS ARTICULOS NO INCLUIDOS AL TRAER DOCUMENTOS RELACIONADOS') returning_values (CONSO);
            if (CONSO = 'NO') then
                UPDATE consolidado_faltantes SET COFA_IDDES = NEW.fact_id, COFA_OK = 'S' WHERE COFA_ID = :consolida;
            ELSE
                BEGIN
                CANTAUX = NEW.fade_cant * NEW.fade_factor;
                FOR SELECT COFA_ITEM, COFA_CANT, COFA_FACTOR FROM consolidado_faltantes
                    WHERE COFA_ID = :CONSOLIDA AND ARTI_COD = NEW.ARTI_COD AND COFA_OK = 'N'
                    INTO :ITEM, :CANT, :FACTOR
                    DO
                    BEGIN
                    if ((CANTAUX > 0) and ((CANT * FACTOR) > 0))then
                        if ((CANT * FACTOR) < CANTAUX) then
                            BEGIN
                            UPDATE consolidado_faltantes
                                SET COFA_IDDES = NEW.fact_id, COFA_OK = 'S'
                                WHERE COFA_ID = :consolida AND COFA_ITEM = :ITEM;
                            CANTAUX = CANTAUX - (CANT * FACTOR);
                            END
                        ELSE
                            BEGIN
                                UPDATE consolidado_faltantes
                                    SET COFA_IDDES = NEW.fact_id, COFA_CANT = :CANTAUX, COFA_FACTOR = 1, COFA_OK = 'S'
                                    WHERE COFA_ID = :consolida AND COFA_ITEM = :ITEM;
                            CANTAUX = 0;
                            END
                    END
                END
            END
        END
      EXECUTE procedure LEE_CONFIGURACION ('FACTURACION', 'ARTICULOS', 'PERMITIR GENERAR BONOS DE PAGO AL FACTURAR ARTICULOS SELECCIONADOS') returning_values (BONOS);
      if (BONOS = 'SI') then
        BEGIN
        SELECT ARTI_VALORBONO FROM ARTICULO WHERE ARTI_COD = NEW.arti_cod INTO :VRBONO;
        if (VRBONO <> 0) then
            BEGIN
            I = 1;
            WHILE (I <= (NEW.fade_cant * NEW.fade_factor)) DO
                BEGIN
                INSERT INTO BONOS_PAGO (BOPA_ID, BOPA_FACTURA, BOPA_PREF, BOPA_NUMERO, BOPA_FECHA, BOPA_ITEM, BOPA_MONTO, BOPA_IDRDC)
                    VALUES (GEN_ID(ID_BONOPAGO, 1), NEW.fact_id, :pref, :num, :fec, :I, :VRBONO, 0);
                I = I + 1;
                END
            END
        END
      END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER FACTURAS_DETALLE_AD FOR FACTURAS_DETALLE
ACTIVE AFTER DELETE POSITION 0
AS
declare variable PEDAUTO CHAR(2);
declare variable Pref varchar(4);
declare variable Num varchar(6);
declare variable CONSO CHAR(2);
declare variable CONSOLIDA INTEGER;
declare variable consec INTEGER;
declare variable ITEM INTEGER;
declare variable CANTAUX NUMERIC(18,4);
declare variable CANT NUMERIC(18,4);
declare variable FACTOR NUMERIC(18,4);
BEGIN
if ((OLD.fact_id <> 0) AND (OLD.fade_anulado = 'N')) then
    BEGIN
    DELETE FROM MOVIMIENTO_ARTICULO WHERE (mvar_tipodoc = 31) and (mvar_idref = OLD.fact_id) and (mvar_item = old.fade_item);

    EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION','FACTURAS','GENERAR PEDIDO AUTOMATICAMENTE CON LA FACTURA') RETURNING_VALUES (PEDAUTO);
    if (PEDAUTO = 'SI') then
        BEGIN
        SELECT pref_pre, fact_numero from facturas where fact_id = OLD.fact_id
            into :Pref, :Num;
        SELECT PEDI_ID FROM PEDIDOS WHERE PREF_PRE = :pref AND PEDI_NUMERO = :num into :consec;
        if (consec is not null) then
          DELETE FROM PEDIDOS_DETALLE WHERE PEDE_ITEM = OLD.FADE_ITEM AND PEDI_ID = :consec;
        END
    ELSE
        BEGIN
        /* DESHAGA LOS PENDIENTES */
        SELECT fact_consolida from facturas where fact_id = OLD.fact_id into :Consolida;
        if (CONSOLIDA <> 0) then
            BEGIN
            CANTAUX = OLD.fade_cant * OLD.fade_factor;
            FOR SELECT COFA_ITEM, COFA_CANT, COFA_FACTOR FROM consolidado_faltantes
                WHERE COFA_ID = :CONSOLIDA AND ARTI_COD = OLD.ARTI_COD AND COFA_OK = 'S'
                INTO :ITEM, :CANT, :FACTOR
                DO
                BEGIN
                if ((CANTAUX > 0) and ((CANT * FACTOR) > 0))then
                    BEGIN
                    UPDATE consolidado_faltantes
                        SET COFA_IDDES = 0, COFA_OK = 'N'
                        WHERE COFA_ID = :consolida AND COFA_ITEM = :ITEM;
                    CANTAUX = CANTAUX - (CANT * FACTOR);
                    END
                END
            END
        END
    delete from bonos_pago where bopa_factura = old.fact_id;
    END
END
^

SET TERM ; ^


/* 20100413 */
/* actualiza el consolidado recursivamente por articulo */

SET TERM ^ ;

CREATE OR ALTER TRIGGER REMISIONES_VENTA_DETALLE_AI FOR REMISIONES_VENTA_DETALLE
ACTIVE AFTER INSERT POSITION 0
AS
declare variable fec date;
declare variable CONC VARCHAR(60);
declare variable NOMCLI VARCHAR(60);
declare variable factor numeric(18,4);
declare variable Pref varchar(4);
declare variable Num varchar(6);
declare variable Nit varchar(20);
declare variable Tipo integer;
declare variable idfact integer;
declare variable numrows integer;
declare variable CANTREL NUMERIC(18,4);
declare variable CONSO CHAR(2);
declare variable CONSOLIDA INTEGER;
declare variable PEDAUTO CHAR(2);
declare variable VALPEDIDO CHAR(2);
declare variable IDPED INTEGER;
declare variable ITEM INTEGER;
declare variable CANTAUX NUMERIC(18,4);
declare variable CANT NUMERIC(18,4);
BEGIN
  if ((NEW.revt_id <> 0) and (new.rvde_anulado = 'N')) then
    BEGIN
    select revt_fecha, pref_pre, revt_numero, terc_nit, revt_nomterc, REVT_CONSOLIDA, LIPR_COD
        from remisiones_venta where revt_id = new.revt_id
        into :fec, :Pref, :Num, :Nit, :Nomcli, :consolida, :idped;
    if (strlen(nomcli) > 27) then
        CONC = 'REMISION A CLIENTE No.' || PREF || NUM || '-' ||SUBSTR(NOMCLI, 1, 27);
    else
        CONC = 'REMISION A CLIENTE No.' || PREF || NUM || '-' ||NOMCLI;

    SELECT MAX(CEFA_TIPOORI), MAX(CEFA_IDORI) FROM consolide_faltantes WHERE CEFA_ID = :CONSOLIDA INTO :TIPO, :IDFACT;
    if (Tipo is null) then
        Tipo = 0;
    if (Idfact is null) then
        Idfact = 0;
    /* si se hizo con base en una factura que afecto el inventario no afecte inventario */
    numrows = 0;
    if (Tipo = 31) Then
        begin
        select count(*) from movimiento_articulo where mvar_tipodoc = 31 and mvar_idref = :idfact into :numrows;
        if (numrows is null) then
          numrows = 0;
        end
    if (numrows = 0) then
        begin
        /* Registre el nuevo */
        execute procedure factor_unidad_cant(new.arti_cod, new.rvde_unidad) returning_values(factor);
        INSERT INTO MOVIMIENTO_ARTICULO
            (ARTI_COD, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM, TERC_NIT)
            VALUES(NEW.ARTI_COD, NEW.BODE_COD, :FEC, 32, NEW.revt_id,
            :CONC, :factor * new.rvde_cant, 0, 'N', new.rvde_lote, :Pref, :Num, new.rvde_item, :Nit);
        end

    /* ACTUALICE EL PENDIENTE  */
    if ((NEW.REVT_ID <> 0) AND (CONSOLIDA <> 0)) then
        begin
        EXECUTE procedure LEE_CONFIGURACION ('FACTURACION','DOCUMENTOS','DEJAR PENDIENTES LOS ARTICULOS NO INCLUIDOS AL TRAER DOCUMENTOS RELACIONADOS') returning_values (CONSO);
        /* IGNORELA SI SE VALIDAN CODIGOS DEL PEDIDO */
        SELECT MIN(CEFA_TIPOORI) FROM consolide_faltantes WHERE CEFA_ID = :CONSOLIDA INTO :NUMROWS;
        if (NUMROWS = 34) then
            BEGIN
            EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION', 'REMISIONES', 'VERIFICAR CODIGOS DEL PEDIDO') returning_values (VALPEDIDO);
            if (VALPEDIDO = 'SI') then
                CONSO = 'SI';
            END
        SELECT COUNT(CEFA_ITEM) FROM consolide_faltantes WHERE CEFA_ID = :CONSOLIDA INTO :NUMROWS;
        if (CONSO = 'NO') then
            UPDATE consolidado_faltantes SET COFA_IDDES = NEW.revt_id, COFA_OK = 'S' WHERE COFA_ID = :consolida;
        ELSE
            BEGIN
            CANTAUX = NEW.rvde_cant * NEW.rvde_factor;
            FOR SELECT COFA_ITEM, COFA_CANT, COFA_FACTOR FROM consolidado_faltantes
                WHERE COFA_ID = :CONSOLIDA AND ARTI_COD = NEW.ARTI_COD AND COFA_OK = 'N'
                INTO :ITEM, :CANT, :FACTOR
                DO
                BEGIN
                if ((CANTAUX > 0) and ((CANT * FACTOR) > 0))then
                    if ((CANT * FACTOR) < CANTAUX) then
                        BEGIN
                        UPDATE consolidado_faltantes
                            SET COFA_IDDES = NEW.revt_id, COFA_OK = 'S'
                            WHERE COFA_ID = :consolida AND COFA_ITEM = :ITEM;
                        CANTAUX = CANTAUX - (CANT * FACTOR);
                        END
                    ELSE
                        BEGIN
                        UPDATE consolidado_faltantes
                            SET COFA_IDDES = NEW.revt_id, COFA_CANT = :CANTAUX, COFA_FACTOR = 1, COFA_OK = 'S'
                            WHERE COFA_ID = :consolida AND COFA_ITEM = :ITEM;
                        CANTAUX = 0;
                        END
                END
            END

        /* SI HAY PEDIDO AUTOMATICO ACTUALICE EL FALTANTE DEL PEDIDO */
        EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION', 'FACTURAS', 'GENERAR PEDIDO AUTOMATICAMENTE CON LA FACTURA') returning_values (pedauto);
        if (PEDAUTO = 'SI') then
            BEGIN
            if (CONSO = 'NO') then
                UPDATE consolidado_faltantes SET COFA_IDDES = NEW.revt_id, COFA_OK = 'S' WHERE COFA_ID = :idped;
            ELSE
                BEGIN
                CANTAUX = NEW.rvde_cant * NEW.rvde_factor;
                FOR SELECT COFA_ITEM, COFA_CANT, COFA_FACTOR FROM consolidado_faltantes
                    WHERE COFA_ID = :idped AND ARTI_COD = NEW.ARTI_COD AND COFA_OK = 'N'
                    INTO :ITEM, :CANT, :FACTOR
                    DO
                    BEGIN
                    if ((CANTAUX > 0) and ((CANT * FACTOR) > 0))then
                        if ((CANT * FACTOR) < CANTAUX) then
                            BEGIN
                            UPDATE consolidado_faltantes
                                SET COFA_IDDES = NEW.revt_id, COFA_OK = 'S'
                                WHERE COFA_ID = :idped AND COFA_ITEM = :ITEM;
                            CANTAUX = CANTAUX - (CANT * FACTOR);
                            END
                        ELSE
                            BEGIN
                            UPDATE consolidado_faltantes
                                SET COFA_IDDES = NEW.revt_id, COFA_CANT = :CANTAUX, COFA_FACTOR = 1, COFA_OK = 'S'
                                WHERE COFA_ID = :idped AND COFA_ITEM = :ITEM;
                            CANTAUX = 0;
                            END
                    END
                END
            END
        end
    END
END
^

SET TERM ; ^


SET TERM ^ ;

CREATE OR ALTER TRIGGER REMISIONES_VENTA_DETALLE_AU FOR REMISIONES_VENTA_DETALLE
ACTIVE AFTER UPDATE POSITION 0
AS
declare variable fec date;
declare variable CONC VARCHAR(60);
declare variable NOMCLI varchar(60);
declare variable Pref varchar(4);
declare variable Num varchar(6);
declare variable Nit varchar(20);
declare variable factor numeric(18,4);
declare variable Tipo integer;
declare variable idfact integer;
declare variable numrows integer;
declare variable CONSO CHAR(2);
declare variable CONSOLIDA INTEGER;
declare variable IDPED INTEGER;
declare variable ITEM INTEGER;
declare variable CANTAUX NUMERIC(18,4);
declare variable CANT NUMERIC(18,4);
declare variable VALPEDIDO CHAR(2);
BEGIN
/* Anule el anterior */
if ((OLD.revt_id <> 0) AND (OLD.rvde_anulado = 'N')) then
  if ((OLD.rvde_cant * OLD.rvde_factor <> NEW.rvde_cant * NEW.rvde_factor) or (OLD.rvde_total <> NEW.rvde_total) or (OLD.arti_cod <> NEW.arti_cod) or (NEW.rvde_anulado = 'S')) then
    begin
    delete from movimiento_articulo where (mvar_tipodoc = 32) and (mvar_idref = old.revt_id) and (mvar_item = old.rvde_item);
    select REVT_CONSOLIDA, LIPR_COD from remisiones_venta where revt_id = old.revt_id into :CONSOLIDA, :IDPED;
    if (CONSOLIDA <> 0) then
        BEGIN
        CANTAUX = OLD.rvde_cant * OLD.rvde_factor;
        FOR SELECT COFA_ITEM, COFA_CANT, COFA_FACTOR FROM consolidado_faltantes
            WHERE COFA_ID = :CONSOLIDA AND ARTI_COD = OLD.ARTI_COD AND COFA_OK = 'S'
            INTO :ITEM, :CANT, :FACTOR
            DO
            BEGIN
            if ((CANTAUX > 0) and ((CANT * FACTOR) > 0))then
                BEGIN
                UPDATE consolidado_faltantes
                    SET COFA_IDDES = 0, COFA_OK = 'N'
                    WHERE COFA_ID = :consolida AND COFA_ITEM = :ITEM;
                CANTAUX = CANTAUX - (CANT * FACTOR);
                END
            END
        END
    if (idped <> 0) then
        BEGIN
        CANTAUX = OLD.rvde_cant * OLD.rvde_factor;
        FOR SELECT COFA_ITEM, COFA_CANT, COFA_FACTOR FROM consolidado_faltantes
            WHERE COFA_ID = :idped AND ARTI_COD = OLD.ARTI_COD AND COFA_OK = 'S'
            INTO :ITEM, :CANT, :FACTOR
            DO
            BEGIN
            if ((CANTAUX > 0) and ((CANT * FACTOR) > 0))then
                BEGIN
                UPDATE consolidado_faltantes
                    SET COFA_IDDES = 0, COFA_OK = 'N'
                    WHERE COFA_ID = :idped AND COFA_ITEM = :ITEM;
                CANTAUX = CANTAUX - (CANT * FACTOR);
                END
            END
        END
    end
/* Registre el nuevo */
if ((new.revt_id <> 0) AND (new.rvde_anulado = 'N')) then
  if ((OLD.rvde_cant * OLD.rvde_factor <> NEW.rvde_cant * NEW.rvde_factor) or (OLD.rvde_total <> NEW.rvde_total) or (OLD.arti_cod <> NEW.arti_cod) or (OLD.rvde_anulado = 'S')) then
    begin
    select revt_fecha, pref_pre, revt_numero, terc_nit, revt_nomterc, REVT_CONSOLIDA, lipr_cod
        from remisiones_venta where revt_id = new.revt_id
        into :fec, :Pref, :Num, :Nit, :Nomcli, :CONSOLIDA, :idped;
    CONC = 'REMISION A CLIENTE No.' || PREF || NUM;
    NOMCLI = SUBSTR(NOMCLI, 1, 24);
    conc = conc || '-' || NOMCLI;

    SELECT MAX(CEFA_TIPOORI), MAX(CEFA_IDORI) FROM consolide_faltantes WHERE CEFA_ID = :CONSOLIDA INTO :TIPO, :IDFACT;
    if (Tipo is null) then
        Tipo = 0;
    if (Idfact is null) then
        Idfact = 0;
    /* si se hizo con base en una factura que afecto el inventario no afecte inventario */
    numrows = 0;
    if (Tipo = 31) Then
        begin
        select count(*) from movimiento_articulo where mvar_tipodoc = 31 and mvar_idref = :idfact into :numrows;
        if (numrows is null) then
            numrows = 0;
        end
    if (numrows = 0) then
        begin
        /* Registre el nuevo */
        execute procedure factor_unidad_cant(new.arti_cod, new.rvde_unidad) returning_values(factor);
        INSERT INTO MOVIMIENTO_ARTICULO
            (ARTI_COD, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM, TERC_NIT)
            VALUES(NEW.ARTI_COD, NEW.BODE_COD, :FEC, 32, NEW.revt_id,
            :CONC, :factor * new.rvde_cant, 0, 'N', new.rvde_lote, :Pref, :Num, new.rvde_item, :Nit);
        end
    /* ACTUALICE EL PENDIENTE  */
    if (CONSOLIDA <> 0) then
        begin
        EXECUTE procedure LEE_CONFIGURACION ('FACTURACION','DOCUMENTOS','DEJAR PENDIENTES LOS ARTICULOS NO INCLUIDOS AL TRAER DOCUMENTOS RELACIONADOS') returning_values (CONSO);
        /* IGNORELA SI SE VALIDAN CODIGOS DEL PEDIDO */
        SELECT MIN(CEFA_TIPOORI) FROM consolide_faltantes WHERE CEFA_ID = :CONSOLIDA INTO :NUMROWS;
        if (NUMROWS = 34) then
            BEGIN
            EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION', 'REMISIONES', 'VERIFICAR CODIGOS DEL PEDIDO') returning_values (VALPEDIDO);
            if (VALPEDIDO = 'SI') then
                CONSO = 'SI';
            END
        SELECT COUNT(CEFA_ITEM) FROM consolide_faltantes WHERE CEFA_ID = :CONSOLIDA INTO :NUMROWS;
        if (CONSO = 'NO') then
            UPDATE consolidado_faltantes SET COFA_IDDES = NEW.revt_id, COFA_OK = 'S' WHERE COFA_ID = :consolida;
        ELSE
            BEGIN
            CANTAUX = NEW.rvde_cant * NEW.rvde_factor;
            FOR SELECT COFA_ITEM, COFA_CANT, COFA_FACTOR FROM consolidado_faltantes
                WHERE COFA_ID = :CONSOLIDA AND ARTI_COD = NEW.ARTI_COD AND COFA_OK = 'N'
                INTO :ITEM, :CANT, :FACTOR
                DO
                BEGIN
                if ((CANTAUX > 0) and ((CANT * FACTOR) > 0))then
                    if ((CANT * FACTOR) < CANTAUX) then
                        BEGIN
                        UPDATE consolidado_faltantes
                            SET COFA_IDDES = NEW.revt_id, COFA_OK = 'S'
                            WHERE COFA_ID = :consolida AND COFA_ITEM = :ITEM;
                        CANTAUX = CANTAUX - (CANT * FACTOR);
                        END
                    ELSE
                        BEGIN
                        UPDATE consolidado_faltantes
                            SET COFA_IDDES = NEW.revt_id, COFA_CANT = :CANTAUX, COFA_FACTOR = 1, COFA_OK = 'S'
                            WHERE COFA_ID = :consolida AND COFA_ITEM = :ITEM;
                        CANTAUX = 0;
                        END
                END
            END
        END
    end
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER REMISIONES_VENTA_DETALLE_AD FOR REMISIONES_VENTA_DETALLE
ACTIVE AFTER DELETE POSITION 0
AS
declare variable CONSOLIDA INTEGER;
declare variable IDPED INTEGER;
declare variable ITEM INTEGER;
declare variable CANTAUX NUMERIC(18,4);
declare variable CANT NUMERIC(18,4);
declare variable factor NUMERIC(18,4);
BEGIN
if ((OLD.revt_id <> 0) AND (OLD.rvde_anulado = 'N')) then
    begin
    delete from movimiento_articulo where (mvar_tipodoc = 32) and (mvar_idref = old.revt_id) and (mvar_item = old.rvde_item);
    select REVT_CONSOLIDA, lipr_cod from remisiones_venta where revt_id = old.revt_id into :CONSOLIDA, :idped;
    if (CONSOLIDA <> 0) then
        BEGIN
        CANTAUX = OLD.rvde_cant * OLD.rvde_factor;
        FOR SELECT COFA_ITEM, COFA_CANT, COFA_FACTOR FROM consolidado_faltantes
            WHERE COFA_ID = :CONSOLIDA AND ARTI_COD = OLD.ARTI_COD AND COFA_OK = 'S'
            INTO :ITEM, :CANT, :FACTOR
            DO
            BEGIN
            if ((CANTAUX > 0) and ((CANT * FACTOR) > 0))then
                BEGIN
                UPDATE consolidado_faltantes
                    SET COFA_IDDES = 0, COFA_OK = 'N'
                    WHERE COFA_ID = :consolida AND COFA_ITEM = :ITEM;
                CANTAUX = CANTAUX - (CANT * FACTOR);
                END
            END
        END
    if (idped <> 0) then
        BEGIN
        CANTAUX = OLD.rvde_cant * OLD.rvde_factor;
        FOR SELECT COFA_ITEM, COFA_CANT, COFA_FACTOR FROM consolidado_faltantes
            WHERE COFA_ID = :idped AND ARTI_COD = OLD.ARTI_COD AND COFA_OK = 'S'
            INTO :ITEM, :CANT, :FACTOR
            DO
            BEGIN
            if ((CANTAUX > 0) and ((CANT * FACTOR) > 0))then
                BEGIN
                UPDATE consolidado_faltantes
                    SET COFA_IDDES = 0, COFA_OK = 'N'
                    WHERE COFA_ID = :idped AND COFA_ITEM = :ITEM;
                CANTAUX = CANTAUX - (CANT * FACTOR);
                END
            END
        END
    end
END
^

SET TERM ; ^

/* 20100416 */
/* CAMBIO EN EL LEFT OUTER JOIN POR SI ACASO */
SET TERM ^ ;

CREATE OR ALTER procedure MM_1002 (
    INICIO char(8),
    FINAL char(8))
AS
declare variable CONCEPTO INTEGER;
declare variable TIPODOC INTEGER;
declare variable NIT VARCHAR(15) CHARACTER SET NONE;
declare variable DV CHAR(1) CHARACTER SET NONE;
declare variable APELLIDO1 VARCHAR(60) CHARACTER SET NONE;
declare variable APELLIDO2 VARCHAR(60) CHARACTER SET NONE;
declare variable NOMBRE1 VARCHAR(60) CHARACTER SET NONE;
declare variable NOMBRE2 VARCHAR(60) CHARACTER SET NONE;
declare variable RAZONSOCIAL VARCHAR(450) CHARACTER SET NONE;
declare variable DIRECCION VARCHAR(200) CHARACTER SET NONE;
declare variable DEPARTAMENTO CHAR(2) CHARACTER SET NONE;
declare variable MUNICIPIO CHAR(3) CHARACTER SET NONE;
declare variable PAIS CHAR(3) CHARACTER SET NONE;
declare variable PAGO NUMERIC(18,0);
declare variable RETENCION NUMERIC(18,0);
declare variable ITEM INTEGER;
declare variable IDCONC INTEGER;
begin
ITEM = 0;
FOR select COME_ITEM, COME_RESPUESTA FROM configura_mediosmag WHERE COME_FORMATO = 1002
    INTO :idconc, :CONCEPTO
    DO
    BEGIN
    FOR SELECT MAX(D.TERC_NIT), SUM(CODE_CREDITO-CODE_DEBITO), SUM(CODE_BASE)
        FROM COMPROBANTE_DETALLE D, COMPROBANTE_ENCABEZADO E, mediosmag_cuentas M
        WHERE M.mmcu_item = :idconc AND E.ENCO_CONSEC = D.ENCO_CONSEC AND ENCO_FECHA >= :INICIO AND ENCO_FECHA <= :FINAL AND
        SUBSTR(CUEN_COD,1,STRLEN(M.mmcu_cuenta)) = M.mmcu_cuenta AND ((CODE_CREDITO <> 0) or (CODE_DEBITO <> 0))
        GROUP BY D.TERC_NIT
        INTO :NIT, :RETENCION, :PAGO
        DO
        BEGIN
        if (RETENCION > 0) then
            BEGIN
            PAGO = PAGO * -1;
            SELECT TERC_NOM, TERC_NOMBRE1, TERC_NOMBRE2, TERC_APELLIDO1, TERC_APELLIDO2, TERC_DV, TIID_CODIGO,
                TERC_DIR, SUBSTR(CIUD_COD,1,2), SUBSTR(CIUD_COD,3,5), PAIS_ID
                FROM TERCEROS T, TIPO_ID IT WHERE TERC_NIT = :NIT AND T.TERC_TIPOID = IT.TIID_COD
                INTO :RAZONSOCIAL, :NOMBRE1, :NOMBRE2, :APELLIDO1, :APELLIDO2, :DV, :TIPODOC, :DIRECCION, :DEPARTAMENTO, :MUNICIPIO, :PAIS;
            ITEM = ITEM + 1;
            insert into medios_magneticos_datos (memg_formato, memg_ano, memg_item, memg_concepto, memg_tipodoc, memg_nit, memg_dv,memg_apellido1, memg_apellido2, 
                memg_nombre1, memg_nombre2, memg_razonsocial, memg_direccion, memg_departamento, memg_municipio, memg_pago, memg_retencion, memg_pais)
                values (1002, substr(:inicio,1,4), :item,  :concepto, :tipodoc, :nit, :dv, :apellido1, :apellido2,
                :nombre1, :nombre2, :razonsocial, :direccion, :departamento, :municipio, :pago, :retencion, :pais);
            END
        END
    END
end
^

SET TERM ; ^


/* 20100417 */
/* NULL EN MOV ARTI */
SET TERM ^ ;

CREATE OR ALTER TRIGGER MOVIMIENTO_ARTICULO_BI FOR MOVIMIENTO_ARTICULO
ACTIVE BEFORE INSERT POSITION 0
AS
declare variable LOTE CHAR(1);
declare variable ENSAMBLE CHAR(1);
declare variable IDENS INTEGER;
declare variable PREFENS VARCHAR(4);
declare variable unidad varchar(8);
declare variable DESCR varchar(60);
declare variable CODPR varchar(8);
declare variable DESPR varchar(60);
declare variable UNIPR varchar(8);
declare variable CANTPR numeric(18,4);
declare variable FACTOR numeric(18,4);
declare variable COSTO numeric(18,2);
declare variable COSTOTOT numeric(18,2);
declare variable PORCPR numeric(9,4);
declare variable MERMAPR numeric(9,4);
declare variable PESO numeric(18,4);
declare variable PESOPR numeric(18,4);
declare variable ITEM INTEGER;
declare variable IVA NUMERIC(9,4);
declare variable IVAM NUMERIC(18,2);
declare variable CONSUMO NUMERIC(18,2);
declare variable TOTAL float;
declare variable SALDO NUMERIC(18,4);
BEGIN
/* INSERTE EL NUEVO LOTE */
if (NEW.mvar_cant IS NULL) then
    NEW.mvar_cant = 0;
SELECT ARTI_EXIST
    FROM   ARTICULO
    WHERE  ARTICULO.ARTI_COD = NEW.ARTI_COD
    INTO :LOTE;
if (LOTE = 'L') then
    BEGIN
      if ((NEW.mvar_lote IS NULL) or (NEW.mvar_lote = '')) then
        if (new.mvar_entrada = 'S') then
            new.mvar_lote = cast(new.mvar_cons as varchar(15));
        else
            begin
            /* NO HAY LOTE, ENTONCES CALCULELO SEGUN CONFIGURACION */
            EXCEPTION LOTE_NEGATIVO 'No se indicó un lote para el artículo ' || new.arti_cod;
            end
    END
/* ENSAMBLE EL PRODUCTO */
SELECT ARTI_ENSAMBLE, ARTI_UNIDAD, ARTI_DES, ARTI_PESO
    FROM ARTICULO WHERE ARTI_COD = NEW.arti_cod INTO :ensamble, :unidad, :descr, :peso;
if ((NEW.mvar_entrada = 'N') AND (ENSAMBLE = 'S')) then
    BEGIN
    /* verifique si la existecia es insufieciente */
    execute procedure saldo_inventario(new.arti_cod, new.bode_cod, new.mvar_fecha) returning_values (:saldo);
    if (NEW.mvar_cant > :SALDO) then
        BEGIN
        if (SALDO > 0) then
            SALDO = NEW.mvar_cant - :SALDO;
        else
            SALDO = NEW.mvar_cant;
        IDENS = gen_id(id_ensamble, 1);
        EXECUTE PROCEDURE lee_configuracion('INVENTARIO', 'ENSAMBLES', 'PREFIJO PARA ENSAMBLES AUTOMATICOS AL SACAR PRODUCTOS') returning_values (:prefens);
        INSERT INTO ENSAMBLES(ENSA_ID, TIDO_COD, PREF_PRE, BODE_COD, ENSA_NUMERO, ENSA_FECHA, ENSA_CONC, ENSA_REFER, ENSA_CANT, ENSA_UNIDAD, ENSA_FACTOR, ENSA_ANULADO, ENSA_TRANSMIT,
            ARTI_COD, ENSA_DESC, ENSA_CODBAR, ENSA_LOTE, ENSA_OBS, TERC_NIT, ENSA_USUARIO, NUMOK, ENSA_COSTO, LOTE_VENCE, ENSA_CODRETAL, ENSA_CANTRETAL, ENSA_OPER, ENSA_MAQUINA, ENSA_PESO, ENSA_BODRETAL, ENSA_TIPOREF, ENSA_IDREF)
            VALUES (:IDENS, 15, :prefens, NEW.bode_cod, '000001', new.mvar_fecha, new.mvar_conc, '', :SALDO, :unidad, 1, 'N', 'N',
            NEW.arti_cod, :descr, NEW.arti_cod, NEW.mvar_lote, NULL, NULL, USER, 'N', NEW.mvar_costo, NULL, NULL, 0, null,  NULL, 0, NEW.bode_cod, NEW.mvar_tipodoc, NEW.mvar_idref);
        ITEM = 0;
        COSTOTOT = 0;
        select sum(arpr_porc) from articulos_producto where arti_cod = NEW.arti_cod into :total;
        FOR SELECT ARPR_CANT, ARPR_UNIDAD, ARPR_COMP, ARTI_DES, TAIV_PORC, ARTI_CONSUMO, ARPR_PORC, ARPR_MERMA, ARTI_PESO
            FROM articulos_producto P, ARTICULO A, TARIFA_IVA T
            WHERE P.ARTI_COD = NEW.arti_cod AND A.arti_cod = P.arpr_comp AND A.taiv_cod = T.taiv_cod
            INTO :CANTPR, :UNIPR, :CODPR, :DESPR, :IVA, :CONSUMO, :PORCPR, :MERMAPR, :PESOPR
            DO
            BEGIN
            ITEM = ITEM + 1;
            EXECUTE PROCEDURE factor_unidad_cant(:codpr, :unipr) returning_values (:factor);
            EXECUTE PROCEDURE costo_promedio_unidad (:codpr, NEW.mvar_fecha, :UNIPR) returning_values (:COSTO);
            IVAM = costo * cantpr * iva / 100;
            if (((cantpr is null) or (cantpr = 0)) AND (porcpr IS NOT NULL) AND (porcpr <> 0)) then
                BEGIN
                /* ES PORCENTUAL AL PESO LA MEZCLA SOBRE EL 1ER ARTICULO */
                CANTPR = :SALDO * PESO;
                CANTPR = CANTPR / TOTAL * porcpr; /* APLICA LA PROPORCION */
                if ((mermapr IS NOT NULL) AND (mermapr <> 0)) then
                    CANTPR = CANTPR * (100 + mermapr) / 100;
/*                CANTPR = CANTPR / pesopr; /* LO LLEVA A LA UNIDAD PRINCIPAL */
                UNIPR = 'GRAMO';
                END
            ELSE
                BEGIN
                CANTPR = CANTPR * :SALDO * pesopr;
                END
            COSTOTOT = COSTOTOT + COSTO * CANTPR;
            INSERT INTO ENSAMBLES_DETALLE(ENSA_ID, ESDE_ITEM, ARTI_COD, BODE_COD, ESDE_CANT, ESDE_UNIDAD, ESDE_COSTO, ESDE_LOTE, ESDE_FACTOR, ESDE_IVAPORC, ESDE_IVAMONTO, ESDE_CONSUMO, ESDE_CODBAR, ESDE_ANULADO, ESDE_TRANSMIT, ESDE_DESC, ESDE_TOTAL, ESDE_PESO)
                VALUES (:idens, :ITEM, :codpr,  NEW.bode_cod, :cantpr, :unipr, :costo, NULL, :FACTOR, :IVA, :ivam, :consumo, :codpr, 'N', 'N', :despr, :COSTO * :cantpr, 0);
            END
        END
    UPDATE ENSAMBLES SET ENSA_COSTO = :costotot WHERE ENSA_ID = :idens;
    END
if (new.mvar_cons is null) then
    NEW.mvar_cons = GEN_ID(ID_MOVARTI,1);
END
^

SET TERM ; ^

SET TERM ^ ;

create trigger MOVIMIENTO_ARTICULO_BU for MOVIMIENTO_ARTICULO
active BEFORE UPDATE position 0
as
begin
if (NEW.mvar_cant IS NULL) then
    NEW.mvar_cant = 0;
end
^

SET TERM ; ^


/* hacia antes el ingreso del sobrante que la salida del producto */
SET TERM ^ ;

CREATE OR ALTER PROCEDURE CONSOLIDE_PRODUCCION(
    PLANID INTEGER)
AS
declare variable item integer;
declare variable artic varchar(20);
declare variable cant numeric(18,4);
declare variable cantpro numeric(18,4);
declare variable codcmp varchar(20);
declare variable cantcmp numeric(18,4);
declare variable porcmp float;
declare variable undcmp varchar(8);
declare variable factor float;
declare variable pesocmp numeric(18,4);
declare variable peso numeric(18,4);
declare variable merma numeric(18,4);
declare variable tipoord integer;
declare variable numrows integer;
declare variable total float;
declare variable descr varchar(60);
declare variable unidad varchar(8);
declare variable sobrante varchar(15);
declare variable porsob numeric(9,4);
declare variable fec date;
declare variable Pref varchar(4);
declare variable Num varchar(6);
declare variable Bod varchar(2);
declare variable totcant numeric(18,4);
declare variable REUSO CHAR(1);
begin
ITEM = 0;
select plpr_fecini, plpr_pref, plpr_numero, plpr_bodori from plan_produccion
    where plpr_id = :planid into :fec, :Pref, :Num, :Bod;
FOR SELECT D.ARTI_COD, PLPD_CANT * PLPD_FACTOR, PLPD_PESO, arti_sobrante, arti_porcsobr, ARTI_REUSOB
    from PLAN_PRODUCCION_DET d, articulo ar
    WHERE d.arti_cod = ar.arti_cod and PLPR_ID = :PLANID
    INTO :ARTIC, :CANTPRO, :PESO, :sobrante, :porsob, :reuso
    DO
    BEGIN
    totcant = 0;
    select sum(arpr_porc) from articulos_producto where arti_cod = :artic into :total;
    FOR SELECT arpr_comp, ARPR_CANT, ARPR_UNIDAD, ARPR_PORC, ARTI_UNIDAD, ARTI_DES, arti_peso, arpr_merma
        from articulos_producto AP, ARTICULO A2
        WHERE AP.arpr_comp = A2.arti_cod AND AP.arti_cod = :ARTIC ORDER by ARPR_ITEM
        INTO :codcmp, :cantcmp, :undcmp, :porcmp, :unidad, :descr, :pesocmp, :MERMA
        DO
        BEGIN
        EXECUTE PROCEDURE factor_unidad_cant(:codcmp, :undcmp) returning_values (:FACTOR);
        if (((cantcmp is null) or (cantcmp = 0)) AND (PORCMP IS NOT NULL) AND (porcmp <> 0)) then
            BEGIN
            /* ES PORCENTUAL AL PESO LA MEZCLA SOBRE EL 1ER ARTICULO */
            CANT = cantpro * PESO;
            CANT = CANT / TOTAL * porcmp; /* APLICA LA PROPORCION */
            if ((MERMA IS NOT NULL) AND (MERMA <> 0)) then
                CANT = CANT / ((100 - MERMA) / 100);
            undcmp = 'GRAMO';
            totcant = totcant + cant;
            END
        ELSE
            BEGIN
            CANT = cantpro * CANTCMP * factor * pesocmp;
            END

        SELECT COUNT(ARTI_COD) FROM articulos_producto WHERE ARTI_COD = :codcmp INTO :NUMROWS;
        if (NUMROWS <> 0) then
           TIPOORD = 19;
        else
            TIPOORD = 24;

        /* INSERTE O ACTUALICE EL COMPONENTE */
        if (NOT EXISTS (SELECT PLPC_ITEM FROM plan_produccion_cons WHERE PLPD_ID = :planid AND ARTI_COD = :codcmp)) then
            BEGIN
            ITEM = ITEM + 1;
            INSERT INTO plan_produccion_cons (PLPD_ID, PLPC_ITEM, PLPC_CODBAR, ARTI_COD, PLPC_CANT, PLPC_UNIDAD, PLPC_EXIST, PLPC_ORDENAR, PLPC_ORDENTIPO, PLPC_ORDENID, PLPC_ANULADO, PLPC_TRANSMIT, PLPC_DESC)
                VALUES (:planid, :item, :codcmp, :codcmp, :cant, :undcmp, 0, 0, :tipoord, 0, 'N', 'N', :descr);
            END
        ELSE
            UPDATE plan_produccion_cons SET PLPC_CANT = PLPC_CANT + :CANT
                WHERE PLPD_ID = :planid AND ARTI_COD = :codcmp;
        END
    /* ingrese el sobrante */
    if ((sobrante <> '') and (porsob <> 0) AND (REUSO = 'N')) then
      begin
      select arti_peso from articulo where arti_cod = :sobrante into :pesocmp;
      /* si es un componente sumelo a la consolidacion */
      if (EXISTS (SELECT PLPC_ITEM FROM plan_produccion_cons WHERE PLPD_ID = :planid AND ARTI_COD = :sobrante)) then
        UPDATE plan_produccion_cons SET PLPC_CANT = PLPC_CANT + (:porsob * :totcant /100)
            WHERE PLPD_ID = :planid AND ARTI_COD = :sobrante;
      INSERT INTO MOVIMIENTO_ARTICULO
          (ARTI_COD, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM, TERC_NIT)
          VALUES(:sobrante, :bod, :FEC, 27, :planid, 'SOBRANTE PLAN PRODUCCION ' || :PREF || :num || ' ARTICULO:' || :ARTIC,
          (:porsob * :totcant /100)/:pesocmp, 0, 'S', null, :Pref, :Num, 0, null);
      end
    END
end
^

SET TERM ; ^


/* 20100419 */
SET TERM ^ ;

CREATE OR ALTER procedure DV (
    NIT varchar(20))
returns (
    DV integer)
AS
declare variable LON INTEGER;
declare variable N1 INTEGER;
declare variable N2 INTEGER;
declare variable N3 INTEGER;
declare variable N4 INTEGER;
declare variable N5 INTEGER;
declare variable N6 INTEGER;
declare variable N7 INTEGER;
declare variable N8 INTEGER;
declare variable N9 INTEGER;
declare variable N10 INTEGER;
declare variable N11 INTEGER;
declare variable N12 INTEGER;
declare variable N13 INTEGER;
declare variable N14 INTEGER;
declare variable N15 INTEGER;
declare variable N16 INTEGER;
declare variable N17 INTEGER;
declare variable N18 INTEGER;
declare variable N19 INTEGER;
declare variable N20 INTEGER;
declare variable SUMA INTEGER;
declare variable CAR CHAR(1);
begin
LON = STRLEN(NIT);
CAR = SUBSTR(NIT,1,1);
if ((CAR >= '0') AND (CAR <= '9')) then
  BEGIN
  N1 = CAST(CAR AS INTEGER);
  SUMA = N1*3;
  if (LON >= 2) then
    begin
    CAR = SUBSTR(NIT,2,2);
    if ((CAR >= '0') AND (CAR <= '9')) then
      BEGIN
      N2 = CAST(CAR AS INTEGER);
      SUMA = N2*3 + N1*7;
      if (LON >= 3) then
        begin
        CAR = SUBSTR(NIT,3,3);
        if ((CAR >= '0') AND (CAR <= '9')) then
          BEGIN
          N3 = CAST(CAR AS INTEGER);
          SUMA = N3*3 + N2*7 + N1*13;
          if (LON >= 4) then
            begin
            CAR = SUBSTR(NIT,4,4);
            if ((CAR >= '0') AND (CAR <= '9')) then
              BEGIN
              N4 = CAST(CAR AS INTEGER);
              SUMA = N4*3 + N3*7 + N2*13 + N1*17;
              if (LON >= 5) then
                begin
                CAR = SUBSTR(NIT,5,5);
                if ((CAR >= '0') AND (CAR <= '9')) then
                  BEGIN
                  N5 = CAST(CAR AS INTEGER);
                  SUMA = N5*3 + N4*7 + N3*13 + N2*17 + N1*19;
                  if (LON >= 6) then
                    begin
                    CAR = SUBSTR(NIT,6,6);
                    if ((CAR >= '0') AND (CAR <= '9')) then
                      BEGIN
                      N6 = CAST(CAR AS INTEGER);
                      SUMA = N6*3 + N5*7 + N4*13 + N3*17 + N2*19 + N1*23;
                      if (LON >= 7) then
                        begin
                        CAR = SUBSTR(NIT,7,7);
                        if ((CAR >= '0') AND (CAR <= '9')) then
                          BEGIN
                          N7 = CAST(CAR AS INTEGER);
                          SUMA = N7*3 + N6*7 + N5*13 + N4*17 + N3*19 + N2*23 + N1*29;
                          if (LON >= 8) then
                            begin
                            CAR = SUBSTR(NIT,8,8);
                            if ((CAR >= '0') AND (CAR <= '9')) then
                              BEGIN
                              N8 = CAST(CAR AS INTEGER);
                              SUMA = N8*3 + N7*7 + N6*13 + N5*17 + N4*19 + N3*23 + N2*29 + N1*37;
                              if (LON >= 9) then
                                begin
                                CAR = SUBSTR(NIT,9,9);
                                if ((CAR >= '0') AND (CAR <= '9')) then
                                  BEGIN
                                  N9 = CAST(CAR AS INTEGER);
                                  SUMA = N9*3 + N8*7 + N7*13 + N6*17 + N5*19 + N4*23 + N3*29 + N2*37 + N1*41;
                                  if (LON >= 10) then
                                    begin
                                    CAR = SUBSTR(NIT,10,10);
                                    if ((CAR >= '0') AND (CAR <= '9')) then
                                      BEGIN
                                      N10 = CAST(CAR AS INTEGER);
                                      SUMA = N10*3 + N9*7 + N8*13 + N7*17 + N6*19 + N5*23 + N4*29 + N3*37 + N2*41 + N1*43;
                                      if (LON >= 11) then
                                        begin
                                        CAR = SUBSTR(NIT,11,11);
                                        if ((CAR >= '0') AND (CAR <= '9')) then
                                          BEGIN
                                          N11 = CAST(CAR AS INTEGER);
                                          SUMA = N11*3 + N10*7 + N9*13 + N8*17 + N7*19 + N6*23 + N5*29 + N4*37 + N3*41 + N2*43 + N1*47;
                                          if (LON >= 12) then
                                            begin
                                            CAR = SUBSTR(NIT,12,12);
                                            if ((CAR >= '0') AND (CAR <= '9')) then
                                              BEGIN
                                              N12 = CAST(CAR AS INTEGER);
                                              SUMA = N12*3 + N11*7 + N10*13 + N9*17 + N8*19 + N7*23 + N6*29 + N5*37 + N4*41 + N3*43 + N2*47 + N1*53;
                                              if (LON >= 13) then
                                                begin
                                                CAR = SUBSTR(NIT,13,13);
                                                if ((CAR >= '0') AND (CAR <= '9')) then
                                                  BEGIN
                                                  N13 = CAST(SUBSTR(NIT,13,13) AS INTEGER);
                                                  SUMA = N13*3 + N12*7 + N11*13 + N10*17 + N9*19 + N8*23 + N7*29 + N6*37 + N5*41 + N4*43 + N3*47 + N2*53 + N1*59;
                                                  if (LON >= 14) then
                                                    begin
                                                    CAR = SUBSTR(NIT,14,14);
                                                    if ((CAR >= '0') AND (CAR <= '9')) then
                                                      BEGIN
                                                      N14 = CAST(CAR AS INTEGER);
                                                      SUMA = N14*3 + N13*7 + N12*13 + N11*17 + N10*19 + N9*23 + N8*29 + N7*37 + N6*41 + N5*43 + N4*47 + N3*53 + N2*59 + N1*67;
                                                      if (LON >= 15) then
                                                        begin
                                                        CAR = SUBSTR(NIT,15,15);
                                                        if ((CAR >= '0') AND (CAR <= '9')) then
                                                          BEGIN
                                                          N15 = CAST(CAR AS INTEGER);
                                                          SUMA = N15*3 + N14*7 + N13*13 + N12*17 + N11*19 + N10*23 + N9*29 + N8*37 + N7*41 + N6*43 + N5*47 + N4*53 + N3*59 + N2*67 + N1*71;
                                                          if (LON >= 16) then
                                                            begin
                                                            CAR = SUBSTR(NIT,16,16);
                                                            if ((CAR >= '0') AND (CAR <= '9')) then
                                                              BEGIN
                                                              N16 = CAST(CAR AS INTEGER);
                                                              SUMA = N16*3 + N15*7 + N14*13 + N13*17 + N12*19 + N11*23 + N10*29 + N9*37 + N8*41 + N7*43 + N6*47 + N5*53 + N4*59 + N3*67 + N2*71 + N1*73;
                                                              if (LON >= 17) then
                                                                begin
                                                                CAR = SUBSTR(NIT,17,17);
                                                                if ((CAR >= '0') AND (CAR <= '9')) then
                                                                  BEGIN
                                                                  N17 = CAST(CAR AS INTEGER);
                                                                  SUMA = N17*3 + N16*7 + N15*13 + N14*17 + N13*19 + N12*23 + N11*29 + N10*37 + N9*41 + N8*43 + N7*47 + N6*53 + N5*59 + N4*67 + N3*71 + N2*73 + N1*79;
                                                                  if (LON >= 18) then
                                                                    begin
                                                                    CAR = SUBSTR(NIT,18,18);
                                                                    if ((CAR >= '0') AND (CAR <= '9')) then
                                                                      BEGIN
                                                                      N18 = CAST(CAR AS INTEGER);
                                                                      SUMA = N18*3 + N17*7 + N16*13 + N15*17 + N14*19 + N13*23 + N12*29 + N11*37 + N10*41 + N9*43 + N8*47 + N7*53 + N6*59 + N5*67 + N4*71 + N3*73 + N2*79 + N1*83;
                                                                      if (LON >= 19) then
                                                                        begin
                                                                        CAR = SUBSTR(NIT,19,19);
                                                                        if ((CAR >= '0') AND (CAR <= '9')) then
                                                                          BEGIN
                                                                          N19 = CAST(SUBSTR(NIT,19,19) AS INTEGER);
                                                                          SUMA = N19*3 + N18*7 + N17*13 + N16*17 + N15*19 + N14*23 + N13*29 + N12*37 + N11*41 + N10*43 + N9*47 + N8*53 + N7*59 + N6*67 + N5*71 + N4*73 + N3*79 + N2*83 + N1*89;
                                                                          if (LON >= 20) then
                                                                            begin
                                                                            CAR = SUBSTR(NIT,20,20);
                                                                            if ((CAR >= '0') AND (CAR <= '9')) then
                                                                              BEGIN
                                                                              N20 = CAST(SUBSTR(NIT,20,20) AS INTEGER);
                                                                              SUMA = N20*3 + N19*7 + N18*13 + N17*17 + N16*19 + N15*23 + N14*29 + N13*37 + N12*41 + N11*43 + N10*47 + N9*53 + N8*59 + N7*67 + N6*71 + N5*73 + N4*79 + N3*83 + N2*89 + N1*97;
                                                                              END
                                                                            end
                                                                          END
                                                                        end
                                                                      END
                                                                    end
                                                                  END
                                                                end
                                                              END
                                                            end
                                                          END
                                                        end
                                                      END
                                                    end
                                                  END
                                                end
                                              END
                                            end
                                          END
                                        end
                                      END
                                    end
                                  END
                                end
                              END
                            end
                          END
                        end
                      END
                    end
                  END
                end
              END
            end
          END
        end
      END
    end
  DV = MOD(SUMA, 11);
  if (DV > 1) Then
    DV = 11 - DV;
  END
suspend;
end
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE CALCULE_DV
RETURNS (
    NIT VARCHAR(20),
    DV INTEGER)
AS
begin
FOR SELECT TERC_NIT FROM TERCEROS WHERE TERC_DV IS NULL AND ((TERC_TIPOID = 'J') or (TERC_TIPOID = 'N')) ORDER BY TERC_NIT INTO :NIT
  DO
  BEGIN
  EXECUTE PROCEDURE DV(:NIT) returning_values (:DV);
  UPDATE TERCEROS SET TERC_DV = :DV WHERE TERC_NIT = :NIT;
  suspend;
  END
end

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE FORM_INTEGRADO_ELECTRONICO(
    IDDOC INTEGER,
    FECLIQ VARCHAR(8),
    CODOPER VARCHAR(2))
RETURNS (
    DATOS VARCHAR(591))
AS
DECLARE VARIABLE tipreg VARCHAR(2);
DECLARE VARIABLE sec VARCHAR(5);
DECLARE VARIABLE nomcia VARCHAR(200);
DECLARE VARIABLE tipdocaport VARCHAR(2);
DECLARE VARIABLE nitcia VARCHAR(16);
DECLARE VARIABLE dvcia VARCHAR(1);
DECLARE VARIABLE formapresent VARCHAR(1);
DECLARE VARIABLE codsucur VARCHAR(10);
DECLARE VARIABLE nomsucur VARCHAR(40);
DECLARE VARIABLE codarp VARCHAR(6);
DECLARE VARIABLE perliq VARCHAR(7);
DECLARE VARIABLE perliqsalud CHAR(6);
DECLARE VARIABLE numform VARCHAR(10);
DECLARE VARIABLE vlornomi VARCHAR(12);
DECLARE VARIABLE vlornomiint INTEGER;
DECLARE VARIABLE nitempl VARCHAR(16);
DECLARE VARIABLE SECINT INTEGER;
DECLARE VARIABLE TIPOID VARCHAR(2);
DECLARE VARIABLE TIPOCOT VARCHAR(2);
DECLARE VARIABLE NOM1 VARCHAR(20);
DECLARE VARIABLE NOM2 VARCHAR(30);
DECLARE VARIABLE APE1 VARCHAR(20);
DECLARE VARIABLE APE2 VARCHAR(30);
DECLARE VARIABLE fecing DATE;
DECLARE VARIABLE fecret DATE;
DECLARE VARIABLE countnov INTEGER;
DECLARE VARIABLE novedad VARCHAR(1);
DECLARE VARIABLE codadmin VARCHAR(6);
DECLARE VARIABLE diaslab VARCHAR(3);
DECLARE VARIABLE salminimo VARCHAR(22);
DECLARE VARIABLE fecanomes CHAR(7);
DECLARE VARIABLE salbasic VARCHAR(22);
declare variable incap VARCHAR(2);
BEGIN
TIPREG = '01';
DATOS = :tipreg;
SEC = '00001';
DATOS = :DATOS || :sec;
EXECUTE PROCEDURE LEE_CONFIGURACION ('GENERAL','GENERAL','NOMBRE COMPAÑIA') RETURNING_VALUES (:nomcia);
EXECUTE PROCEDURE CEROS_ANCHO_FIJO (:nomcia, 200, 'A') RETURNING_VALUES (:nomcia);
DATOS = :DATOS || :nomcia;
DATOS = :DATOS || 'NI';
EXECUTE PROCEDURE LEE_CONFIGURACION ('CONTABILIDAD','GENERAL','NIT COMPAÑIA') RETURNING_VALUES (:nitcia);
EXECUTE PROCEDURE DV (nitcia) RETURNING_VALUES (dvcia);
EXECUTE PROCEDURE CEROS_ANCHO_FIJO (:nitcia, 16, 'A') RETURNING_VALUES (:nitcia);
DATOS = :DATOS || :nitcia;
DATOS = :DATOS || :dvcia;
FORMAPRESENT = 'U';
DATOS = :DATOS || :formapresent;
codsucur = '';
EXECUTE PROCEDURE CEROS_ANCHO_FIJO (:codsucur, 10, 'A') RETURNING_VALUES (:codsucur);
DATOS = :DATOS || :codsucur;
nomsucur = '';
EXECUTE PROCEDURE CEROS_ANCHO_FIJO (:nomsucur, 40, 'A') RETURNING_VALUES (:nomsucur);
DATOS = :DATOS || :nomsucur;
SELECT ADMI_CODARP FROM ADMINISTRADORA A, PARAMETROS_ANO P WHERE P.paan_nitarp = A.terc_nit INTO :codarp;
EXECUTE PROCEDURE CEROS_ANCHO_FIJO (:codarp, 6, 'A') RETURNING_VALUES (:codarp);
DATOS = :DATOS || :codarp;
SELECT SUBSTRING(P.pgap_fecha FROM 1 FOR 7) FROM PAGO_APORTES P WHERE P.pgap_id = :iddoc AND p.pgap_item = 1 INTO :perliq;
perliq = substr(perliq, 1,4) || substr(perliq, 6,8);
DATOS = :DATOS || :perliq;
perliqsalud = :perliq;
DATOS = :DATOS || :perliqsalud;
SELECT pgap_formulario FROM PAGO_APORTES WHERE PGAP_ID = :iddoc AND pgap_item = 1 INTO :numform;
EXECUTE PROCEDURE CEROS_ANCHO_FIJO (:numform, 10, 'A') RETURNING_VALUES (:numform);
DATOS = :DATOS || :numform;
DATOS = :DATOS || :fecliq;
/*EXECUTE PROCEDURE CEROS_ANCHO_FIJO (:nroemple, 5, 'N') RETURNING_VALUES (:nroemple);
DATOS = :DATOS || :nroemple; */
SELECT SUM(pade_ibc) FROM PAGO_APORTES_DETALLE WHERE PGAP_ID = :iddoc INTO :vlornomi;
vlornomiint = CAST(:vlornomi AS INTEGER);
vlornomi = CAST(vlornomiint AS VARCHAR(12));
EXECUTE PROCEDURE CEROS_ANCHO_FIJO (:vlornomi, 12, 'N') RETURNING_VALUES (:vlornomi);
DATOS = :DATOS || :vlornomi;
EXECUTE PROCEDURE CEROS_ANCHO_FIJO (:codoper, 2, 'N') RETURNING_VALUES (:codoper);
DATOS = :DATOS || :codoper;
SUSPEND;
datos = '';
secint = 1;
FOR SELECT e.terc_nit, T.terc_tipoid, E.tcot_cod, T.terc_nombre1, T.terc_nombre2, T.terc_apellido1, T.terc_apellido2, E.empl_fecing, e.empl_fecret FROM empleados e, TERCEROS T
WHERE (e.empl_fecret > substr(:fecliq,1,4) || '/' || substr(:fecliq,5,6) || '/' || substr(:fecliq,7,8) OR (e.empl_fecret IS NULL))  AND e.empl_fecing < substr(:fecliq,1,4) || '/' || substr(:fecliq,5,6) || '/' || substr(:fecliq,7,8) AND T.terc_nit = E.terc_nit
INTO :nitempl, :tipoid, :tipocot, :nom1, :nom2, :ape1, :ape2, :fecing, :fecret
DO
 BEGIN
    tipreg  = '02';
    DATOS = :datos || tipreg;
    secint = secint + 1;
    EXECUTE PROCEDURE CEROS_ANCHO_FIJO (CAST(secint AS VARCHAR(200)), 5, 'N') RETURNING_VALUES (:sec);
    DATOS = DATOS || :SEC;
    IF (:tipoid = 'N') THEN
    tipoid = 'NI';
    IF (:tipoid = 'C') THEN
    tipoid = 'CC';
    IF (:tipoid = 'E') THEN
    tipoid = 'CE';
    IF (:tipoid = 'T') THEN
    tipoid = 'TI';
    IF (:tipoid = 'R') THEN
    tipoid = 'RC';
    IF (:tipoid = 'P') THEN
    tipoid = 'PA';
    IF (:tipoid = 'J') THEN
    tipoid = 'CC';
    DATOS = DATOS || tipoid;
    EXECUTE PROCEDURE CEROS_ANCHO_FIJO (:nitempl, 16, 'A') RETURNING_VALUES (:nitempl);
    DATOS = DATOS || :nitempl;
    datos = datos || '0';
    EXECUTE PROCEDURE CEROS_ANCHO_FIJO (:tipocot, 1, 'N') RETURNING_VALUES (:tipocot);
    datos = datos || :tipocot;
    EXECUTE PROCEDURE CEROS_ANCHO_FIJO (:ape1, 20, 'A') RETURNING_VALUES (:ape1);
    IF (ape1 IS NULL) THEN
    ape1 = '';
    DATOS = DATOS || :ape1;
    EXECUTE PROCEDURE CEROS_ANCHO_FIJO (:ape2, 30, 'A') RETURNING_VALUES (:ape2);
    IF (ape2 IS NULL) THEN
    ape2 = '';
    DATOS = DATOS || :ape2;
    EXECUTE PROCEDURE CEROS_ANCHO_FIJO (:nom1, 20, 'A') RETURNING_VALUES (:nom1);
    IF (nom1 IS NULL) THEN
    nom1 = '';
    DATOS = DATOS || :nom1;
    EXECUTE PROCEDURE CEROS_ANCHO_FIJO (:nom2, 30, 'A') RETURNING_VALUES (:nom2);
    IF (nom2 IS NULL) THEN
    nom2 = '';
    DATOS = DATOS || :nom2;
    IF ((substr(:fecing,6,7) = substr(:fecliq,5,6)) AND (substr(:fecing,1,4) = substr(:fecliq,1,4))) THEN
    novedad = 'X';
    ELSE
    novedad = ' ';
    datos = :datos || :novedad;
    IF (:fecret IS NOT NULL AND (substr(:fecret,6,7) = substr(:fecliq,5,6))) THEN
    novedad = 'X';
    ELSE
    novedad = ' ';
    datos = :datos || :novedad;
    SELECT COUNT(*) FROM nomina_novedades v WHERE (substr(nono_fecha, 1,4) = substr(:fecliq,1,4)) AND (substr(nono_fecha, 6,7) = substr(:fecliq,6,7)) AND v.tnov_cod = 5 AND V.nono_tipoadm = 'E' INTO :countnov;
    IF (:countnov > 0) THEN
    novedad = 'X';
    ELSE
    novedad = ' ';
    datos = :datos || :novedad;
   SELECT COUNT(*) FROM nomina_novedades v WHERE (substr(nono_fecha, 1,4) = substr(:fecliq,1,4)) AND (substr(nono_fecha, 6,7) = substr(:fecliq,6,7)) AND v.tnov_cod = 5 AND V.nono_tipoadm = 'E' INTO :countnov;
    IF (:countnov > 0) THEN
    novedad = 'X';
    ELSE
    novedad = ' ';
    datos = :datos || :novedad;
    SELECT COUNT(*) FROM nomina_novedades v WHERE (substr(nono_fecha, 1,4) = substr(:fecliq,1,4)) AND (substr(nono_fecha, 6,7) = substr(:fecliq,6,7)) AND v.tnov_cod = 5 AND V.nono_tipoadm = 'A' INTO :countnov;
    IF (:countnov > 0) THEN
    novedad = 'X';
    ELSE
    novedad = ' ';
    datos = :datos || :novedad;    
    SELECT COUNT(*) FROM nomina_novedades v WHERE (substr(nono_fecha, 1,4) = substr(:fecliq,1,4)) AND (substr(nono_fecha, 6,7) = substr(:fecliq,6,7)) AND v.tnov_cod = 5 AND V.nono_tipoadm = 'A' INTO :countnov;
    IF (:countnov > 0) THEN
    novedad = 'X';
    ELSE
    novedad = ' ';
    datos = :datos || :novedad;
    SELECT COUNT(*) FROM nomina_novedades v WHERE (substr(nono_fecha, 1,4) = substr(:fecliq,1,4)) AND (substr(nono_fecha, 6,7) = substr(:fecliq,6,7)) AND v.tnov_cod = 8 AND V.nono_tipoadm = 'A' INTO :countnov;
    IF (:countnov > 0) THEN
    novedad = 'X';
    ELSE
    novedad = ' ';
    datos = :datos || :novedad;
    SELECT COUNT(*) FROM nomina_novedades v WHERE (substr(nono_fecha, 1,4) = substr(:fecliq,1,4)) AND (substr(nono_fecha, 6,7) = substr(:fecliq,6,7)) AND v.tnov_cod = 10 AND V.nono_tipoadm = 'A' INTO :countnov;
    IF (:countnov > 0) THEN
    novedad = 'X';
    ELSE
    novedad = ' ';
    datos = :datos || :novedad;
    SELECT COUNT(*) FROM nomina_novedades v WHERE (substr(nono_fecha, 1,4) = substr(:fecliq,1,4)) AND (substr(nono_fecha, 6,7) = substr(:fecliq,6,7)) AND v.tnov_cod = 11 INTO :countnov;
    IF (:countnov > 0) THEN
    novedad = 'X';
    ELSE
    novedad = ' ';
    datos = :datos || :novedad;    
    SELECT COUNT(*) FROM nomina_novedades v WHERE (substr(nono_fecha, 1,4) = substr(:fecliq,1,4)) AND (substr(nono_fecha, 6,7) = substr(:fecliq,6,7)) AND v.tnov_cod = 9 INTO :countnov;
    IF (:countnov > 0) THEN
    novedad = 'X';
    ELSE
    novedad = ' ';
    datos = :datos || :novedad;    
    SELECT COUNT(*) FROM nomina_novedades v WHERE (substr(nono_fecha, 1,4) = substr(:fecliq,1,4)) AND (substr(nono_fecha, 6,7) = substr(:fecliq,6,7)) AND v.tnov_cod = 2 INTO :countnov;
    IF (:countnov > 0) THEN
    novedad = 'X';
    ELSE
    novedad = ' ';
    datos = :datos || :novedad;    
    SELECT COUNT(*) FROM nomina_novedades v WHERE (substr(nono_fecha, 1,4) = substr(:fecliq,1,4)) AND (substr(nono_fecha, 6,7) = substr(:fecliq,6,7)) AND v.tnov_cod = 4 INTO :countnov;
    IF (:countnov > 0) THEN
    novedad = 'X';
    ELSE
    novedad = ' ';
    datos = :datos || :novedad;
    SELECT COUNT(*) FROM nomina_novedades v WHERE (substr(nono_fecha, 1,4) = substr(:fecliq,1,4)) AND (substr(nono_fecha, 6,7) = substr(:fecliq,6,7)) AND v.tnov_cod = 6 INTO :countnov;
    IF (:countnov > 0) THEN
    novedad = 'X';
    ELSE
    novedad = ' ';
    datos = :datos || :novedad;    
    SELECT COUNT(*) FROM nomina_novedades v WHERE (substr(nono_fecha, 1,4) = substr(:fecliq,1,4)) AND (substr(nono_fecha, 6,7) = substr(:fecliq,6,7)) AND v.tnov_cod = 1 INTO :countnov;
    IF (:countnov > 0) THEN
    novedad = 'X';
    ELSE
    novedad = ' ';
    datos = :datos || :novedad;    
    SELECT COUNT(*) FROM nomina_novedades v WHERE (substr(nono_fecha, 1,4) = substr(:fecliq,1,4)) AND (substr(nono_fecha, 6,7) = substr(:fecliq,6,7)) AND v.tnov_cod = 7 INTO :countnov;
    IF (:countnov > 0) THEN
    novedad = 'X';
    ELSE
    novedad = ' ';
    datos = :datos || :novedad;
    SELECT v.nono_dura FROM nomina_novedades v WHERE (substr(nono_fecha, 1,4) = substr(:fecliq,1,4)) AND (substr(nono_fecha, 6,7) = substr(:fecliq,6,7)) AND v.tnov_cod = 3 INTO :countnov;
    IF (:countnov > 0) THEN
    BEGIN
    novedad = :countnov;
    END
    ELSE
    BEGIN
    countnov = 0;
    END
    EXECUTE PROCEDURE CEROS_ANCHO_FIJO (:countnov, 2, 'N') RETURNING_VALUES (:incap);
    datos = :datos || :incap;
    SELECT a.admi_codafp FROM ADMINISTRADORA A, EMPLEADOS E WHERE E.empl_afp = A.terc_nit AND E.terc_nit = :nitempl INTO :codadmin;
    IF (:codadmin IS NULL) THEN
    codadmin = ' ';
    EXECUTE PROCEDURE CEROS_ANCHO_FIJO (:codadmin, 6, 'A') RETURNING_VALUES (:codadmin);
    datos = :datos || :codadmin;
    codadmin = '';
    SELECT A.admi_codafp FROM nomina_novedades v, EMPLEADOS E, ADMINISTRADORA A WHERE (substr(nono_fecha, 1,4) = substr(:fecliq,1,4)) AND (substr(nono_fecha, 6,7) = substr(:fecliq,6,7)) AND v.tnov_cod = 5 AND V.nono_tipoadm = 'A' AND V.nono_nvaadm = A.terc_nit INTO :codadmin;
    IF (:codadmin IS NULL) THEN
    codadmin = ' ';
    EXECUTE PROCEDURE CEROS_ANCHO_FIJO (:codadmin, 6, 'A') RETURNING_VALUES (:codadmin);
    datos = :datos || :codadmin;
    codadmin = '';
    SELECT a.admi_codeps FROM ADMINISTRADORA A, EMPLEADOS E WHERE E.empl_eps = A.terc_nit AND E.terc_nit = :nitempl INTO :codadmin;
    IF (:codadmin IS NULL) THEN
    codadmin = ' ';
    EXECUTE PROCEDURE CEROS_ANCHO_FIJO (:codadmin, 6, 'A') RETURNING_VALUES (:codadmin);
    datos = :datos || :codadmin;
    codadmin = '';
    SELECT A.admi_codeps FROM nomina_novedades v, EMPLEADOS E, ADMINISTRADORA A WHERE (substr(nono_fecha, 1,4) = substr(:fecliq,1,4)) AND (substr(nono_fecha, 6,7) = substr(:fecliq,6,7)) AND v.tnov_cod = 5 AND V.nono_tipoadm = 'E' AND V.nono_nvaadm = A.terc_nit INTO :codadmin;
    IF (:codadmin IS NULL) THEN
    codadmin = ' ';
    SELECT A.admi_codeps FROM nomina_novedades v, EMPLEADOS E, ADMINISTRADORA A WHERE (substr(nono_fecha, 1,4) = substr(:fecliq,1,4)) AND (substr(nono_fecha, 6,7) = substr(:fecliq,6,7)) AND v.tnov_cod = 5 AND V.nono_tipoadm = 'E' AND V.nono_nvaadm = A.terc_nit INTO :codadmin;
    IF (:codadmin IS NULL) THEN
    codadmin = ' ';
    EXECUTE PROCEDURE CEROS_ANCHO_FIJO (:codadmin, 6, 'A') RETURNING_VALUES (:codadmin);
    datos = :datos || :codadmin;
    codadmin = '';
    SELECT A.admi_codeps FROM nomina_novedades v, EMPLEADOS E, ADMINISTRADORA A WHERE (substr(nono_fecha, 1,4) = substr(:fecliq,1,4)) AND (substr(nono_fecha, 6,7) = substr(:fecliq,6,7)) AND v.tnov_cod = 5 AND V.nono_tipoadm = 'E' AND V.nono_nvaadm = A.terc_nit INTO :codadmin;
    IF (:codadmin IS NULL) THEN
    codadmin = ' ';
    EXECUTE PROCEDURE CEROS_ANCHO_FIJO (:codadmin, 6, 'A') RETURNING_VALUES (:codadmin);
    datos = :datos || :codadmin;
    codadmin = '';
/*    SELECT A.admi_ccf FROM EMPLEADOS E, ADMINISTRADORA A WHERE A.terc_nit = E.terc_nit AND E.terc_nit = :nitempl INTO :codadmin;
    EXECUTE PROCEDURE CEROS_ANCHO_FIJO (:codadmin, 6, 'A') RETURNING_VALUES (:codadmin);
    datos = :datos || :codadmin;
    codadmin = '';*/
    fecanomes = substr(:fecliq,1,4) || '-' || substr(:fecliq,5,6);
    SELECT SUM(ND.node_diaslab) FROM NOMINA N, NOMINA_DETALLE ND WHERE SUBSTR(N.nomi_feccausa, 1,7) = :fecanomes AND N.nomi_id = ND.nomi_id AND ND.terc_nit = :nitempl INTO :diaslab;
    IF (:diaslab IS NULL) THEN
    diaslab = '00';
    EXECUTE PROCEDURE CEROS_ANCHO_FIJO (:diaslab, 2, 'N') RETURNING_VALUES (:diaslab);
    Datos = :datos || :diaslab;
    SELECT SUM(ND.node_diaslab) FROM NOMINA N, NOMINA_DETALLE ND WHERE SUBSTR(N.nomi_feccausa, 1,7) = :fecanomes AND N.nomi_id = ND.nomi_id AND ND.terc_nit = :nitempl INTO :diaslab;
    IF (:diaslab IS NULL) THEN
    diaslab = '00';
    EXECUTE PROCEDURE CEROS_ANCHO_FIJO (:diaslab, 2, 'N') RETURNING_VALUES (:diaslab);
    Datos = :datos || :diaslab;
    SELECT SUM(ND.node_diaslab) FROM NOMINA N, NOMINA_DETALLE ND WHERE SUBSTR(N.nomi_feccausa, 1,7) = :fecanomes AND N.nomi_id = ND.nomi_id AND ND.terc_nit = :nitempl INTO :diaslab;
    IF (:diaslab IS NULL) THEN
    diaslab = '00';
    EXECUTE PROCEDURE CEROS_ANCHO_FIJO (:diaslab, 2, 'N') RETURNING_VALUES (:diaslab);
    Datos = :datos || :diaslab;
    SELECT e.empl_salario FROM empleados e WHERE e.terc_nit = :nitempl INTO :salbasic;
    IF (:salbasic IS NULL) THEN
    salbasic = '0';
    salbasic = substr(salbasic,1,strlen(salbasic)-3);
    EXECUTE PROCEDURE CEROS_ANCHO_FIJO (:salbasic, 9, 'N') RETURNING_VALUES (:salbasic);
    Datos = :datos || :salbasic;
    SELECT e.empl_salario FROM empleados e WHERE e.terc_nit = :nitempl INTO :salbasic;
    IF (:salbasic IS NULL) THEN
    salbasic = '0';
    execute procedure redondee (salbasic,1000)returning_values(salbasic);
    salbasic = substr(salbasic,1,strlen(salbasic)-5);
    EXECUTE PROCEDURE CEROS_ANCHO_FIJO (:salbasic, 9, 'N') RETURNING_VALUES (:salbasic);
    Datos = :datos || :salbasic;
    Datos = :datos || :salbasic;
    Datos = :datos || :salbasic;
    Datos = :datos || :salbasic;
    Datos = :datos || :salbasic;
    datos = :datos || '0.15';
/*    datos = :datos || '30';
    datos = :datos || '00';
    select P.paan_salminimo from PARAMETROS_ANO P WHERE P.paan_ano = SUBSTR(:fecpago, 1,8) INTO :salminimo;
  */
    SUSPEND;
    datos = '';
    END
END

^

SET TERM ; ^

/* 20100420 */
/* anulaba todos los ensambles automaticos de un documento y no especificamente el del artículo */
SET TERM ^ ;

CREATE OR ALTER TRIGGER MOVIMIENTO_ARTICULO_AD FOR MOVIMIENTO_ARTICULO
ACTIVE AFTER DELETE POSITION 0
AS
declare variable LOTE CHAR(1);
declare variable ensamble char(1);
BEGIN
  /* INSERTE EL NUEVO LOTE */
  SELECT ARTI_EXIST
    FROM   ARTICULO
    WHERE  ARTICULO.ARTI_COD = OLD.ARTI_COD
    INTO :LOTE;
  /* BORRE LOS VIEJOS */
  if (old.mvar_tipodoc <> 13) then
      BEGIN
      EXECUTE PROCEDURE actualice_costo(old.arti_cod, old.mvar_fecha, old.mvar_costo, old.mvar_cant, old.mvar_entrada, 'S', OLD.mvar_cons, OLD.mvar_tipodoc);
      if (OLD.mvar_entrada = 'S') then
          EXECUTE PROCEDURE chequeo_costos(old.arti_cod, old.mvar_fecha-1); /* PARA OBLIGAR A RECALCULAR LOS MOV. DEL MISMO DIA */
      else
          EXECUTE PROCEDURE chequeo_costos(old.arti_cod, old.mvar_fecha);
      END
  /* actualice existencias */
  if (old.mvar_entrada = 'S') then
    BEGIN
    execute procedure sume_existencia(old.arti_cod, old.bode_cod, old.mvar_fecha, old.mvar_cant, 'S');
    if (LOTE = 'L') then
        UPDATE LOTES
            set lote_saldo = lote_saldo - old.mvar_cant
            where (arti_cod = old.ARTI_COD) and (bode_cod = old.bode_cod) and (lote_nro = old.mvar_lote);
    END
  else
    BEGIN
    SELECT ARTI_ENSAMBLE FROM ARTICULO WHERE ARTI_COD = old.arti_cod INTO :ensamble;
    if (ENSAMBLE = 'S') then
        delete from ensambles where ensa_tiporef = old.mvar_tipodoc and ensa_idref = old.mvar_idref and arti_cod = old.arti_cod;

    execute procedure reste_existencia(old.arti_cod, old.bode_cod, old.mvar_fecha, old.mvar_cant, 'S');
    if (LOTE = 'L') then
        UPDATE LOTES
            set lote_saldo = lote_saldo + old.mvar_cant
            where (arti_cod = old.ARTI_COD) and (bode_cod = old.bode_cod) and (lote_nro = old.mvar_lote);
    END
END
^

SET TERM ; ^



/* 20100421 */
/* BASE E IVA EN CONSULTA DE PRECIOS */
SET TERM ^ ;

CREATE OR ALTER procedure PRECIOS_UNIDAD (
    ARTICULO varchar(20),
    UNIDAD varchar(8))
returns (
    LISTA integer,
    PRECIOB numeric(18,2),
    IVAPORC NUMERIC(9,2),
    IVAMONTO numeric(18,2),
    PRECIOT numeric(18,2),
    RENTA numeric(9,2),
    UTIL numeric(9,2),
    AUTOM char(1),
    COMIPORC numeric(9,2),
    CANTMIN numeric(18,4),
    SUBEMPRESA integer)
AS
DECLARE VARIABLE FACTOR NUMERIC(18,4);
declare variable IVAINC CHAR(1);
BEGIN
FOR SELECT P.LIPR_COD, PRAR_FIJO, PRAR_MARGEN, PRAR_UTIL, PRAR_AUTO, PRAR_COMI, PRAR_CANTMIN, sucu_id, LIPR_MODIF, TAIV_PORC
    FROM PRECIOS_ARTICULO P, lista_precios L, ARTICULO A, TARIFA_IVA T
    WHERE P.ARTI_COD = :ARTICULO AND A.ARTI_COD = P.arti_cod AND A.taiv_cod = T.taiv_cod AND P.lipr_cod = L.lipr_cod AND L.lipr_fecini <= cast('now' as DATE) AND L.lipr_fecfin >= cast('now' as DATE)
    INTO :LISTA, :PRECIOT, :RENTA, :UTIL, :AUTOM, :COMIPORC, :CANTMIN, :SUBEMPRESA, :IVAINC, :IVAPORC
    DO
    BEGIN
    EXECUTE PROCEDURE FACTOR_UNIDAD_PRE (:ARTICULO, :UNIDAD) returning_values (:FACTOR);
    PRECIOT = PRECIOT * FACTOR;
    if (IVAINC = 'S') then
        BEGIN
        IVAMONTO = PRECIOT / (100 + IVAPORC) * IVAPORC;
        preciob = PRECIOT - IVAMONTO;
        END
    ELSE
        BEGIN
        PRECIOB = PRECIOT;
        IVAMONTO = PRECIOB * IVAPORC;
        PRECIOT = PRECIOB + IVAMONTO;
        END
    SUSPEND;
    END
END
^

SET TERM ; ^


/* 20100421B */
/* LISTA DE PRECIOS PREDETERMINADA POR AGENCIA, REEMPLAZA PARAMETRO DE CONF. LISTA A MOSTRAR */
ALTER TABLE LISTA_PRECIOS
ADD LIPR_PREDET T_BOOLEANO;

UPDATE LISTA_PRECIOS SET LIPR_PREDET = 'N';

UPDATE LISTA_PRECIOS SET LIPR_PREDET = 'S' WHERE LIPR_COD = (SELECT CONF_VALOR FROM configuracion
    WHERE CONF_MODULO = 'FACTURACION' AND CONF_CATEGORIA = 'FACTURAS' AND CONF_PROPIEDAD = 'CODIGO DE LA LISTA DE PRECIOS A MOSTRAR EN ARTICULOS');
COMMIT WORK;

UPDATE USUARIO SET SUCU_ID = 0 WHERE SUCU_ID IS NULL;
COMMIT WORK;

SET TERM ^ ;

CREATE OR ALTER procedure CONSULTA_ARTICULOS_VTAS (
    FECHA date,
    INACTIVOS char(1),
    MODULO varchar(20),
    BUSCAR varchar(100),
    CUALQUIERA char(1),
    COLUMNA integer,
    BUSCAR2 varchar(30),
    BUSCAR3 varchar(30),
    BUSCAR4 varchar(30),
    BUSCAR5 varchar(30))
returns (
    CODIGO varchar(20),
    DES varchar(60),
    REF varchar(20),
    GRUPO varchar(30),
    MARCA varchar(30),
    UNIDAD varchar(8),
    ESTADO varchar(30),
    IVA numeric(9,2),
    EXISTEN numeric(18,2),
    PRECIO numeric(18,2),
    CLASE char(1))
AS
DECLARE VARIABLE LISTA INTEGER;
DECLARE VARIABLE EXIST CHAR(2);
DECLARE VARIABLE SINEXIST CHAR(2);
declare variable DIG INTEGER;
declare variable OK CHAR(1);
BEGIN
EXISTEN = 0;
EXECUTE PROCEDURE lee_configuracion ('FACTURACION','ARTICULOS', 'VER EXISTENCIA EN CONSULTA ARTICULOS') returning_values (:EXIST);
SELECT FIRST 1 LIPR_COD FROM LISTA_PRECIOS L, USUARIO U WHERE USER_COD = USER AND ((L.SUCU_ID = U.sucu_id) or (L.SUCU_ID = 0) or (U.SUCU_ID = 0)) AND LIPR_PREDET = 'S'
    INTO :LISTA;
if (modulo = 'FACTURACION') then
  EXECUTE PROCEDURE lee_configuracion ('FACTURACION','ARTICULOS','VER ARTICULOS SIN EXISTENCIA EN CONSULTA DE ARTICULOS') returning_values (:sinexist);
else
  sinexist = 'SI';
EXECUTE PROCEDURE LEE_CONFIGURACION ('FACTURACION', 'ARTICULOS', 'REDONDEO AL MULTIPLO DE DIEZ EN PRECIOS') returning_values (DIG);
if (LISTA > 0) then
    BEGIN
    if ((BUSCAR IS NOT NULL) AND (BUSCAR <> '')) then
        FOR select a.arti_cod, arti_des, grup_cod, arti_unidad, esar_cod, taiv_porc, marc_cod,arti_clase
            from articulo a, tarifa_iva t
            where a.taiv_cod = t.taiv_cod and substring(a.arti_cod from 1 FOR 2) <> '.t' and
            ((:INACTIVOS = 'S') or (esar_cod = 'A') or ((:INACTIVOS = 'C') AND (esar_cod = 'N'))) AND
            ((:COLUMNA <> 0) or (upper(A.ARTI_COD) like upper(:buscar))) AND
            ((:columna <> 1) or (upper(A.ARTI_DES) like upper(:buscar))) AND
            ((:columna <> 2) or (upper(A.ARTI_OBS) like upper(:buscar)) or (upper(A.ARTI_DES) like upper(:buscar)))
            INTO :CODIGO, :DES, :GRUPO, :UNIDAD, :ESTADO, :IVA, :MARCA, :CLASE
            do
            begin
            ref = '';
            select first 1 coba_cod from barras_articulo where arti_cod = :codigo into :ref;
            if ((COLUMNA <> 3) or (upper(REF) like upper(:buscar))) then
                BEGIN
                OK = 'N';
                PRECIO = 0;
                SELECT prar_fijo PRECIO FROM precios_articulo WHERE arti_cod = :CODIGO and lipr_cod = :LISTA INTO :PRECIO;
                EXECUTE PROCEDURE redondee(PRECIO, DIG) returning_values (PRECIO);
                if (EXIST = 'SI') then
                    BEGIN
                    EXECUTE PROCEDURE saldo_total_inventario (:CODIGO, :FECHA) returning_values (:EXISTEN);
                    if ((SINEXIST = 'SI')  or (existen <> 0)) then
                        OK = 'S';
                    END
                ELSE
                    OK = 'S';
                if (ok = 'S') then
                    if (CUALQUIERA = 'S') then
                        SUSPEND;
                    ELSE
                        if (BUSCAR2 <> '') then
                            BEGIN
                            IF (NOT EXISTS (SELECT ARTI_COD FROM ARTICULO WHERE ARTI_COD = :CODIGO AND ((upper(ARTI_DES) like upper(:BUSCAR2)) or (UPPER(ARTI_OBS) LIKE UPPER(:BUSCAR2))))) THEN
                                OK = 'N';
                            if ((OK = 'S') AND (BUSCAR3 <> '')) then
                                IF (NOT EXISTS (SELECT ARTI_COD FROM ARTICULO WHERE ARTI_COD = :CODIGO AND ((upper(ARTI_DES) like upper(:BUSCAR3)) or (UPPER(ARTI_OBS) LIKE UPPER(:BUSCAR3))))) THEN
                                    OK = 'N';
                            if ((OK = 'S') AND (BUSCAR4 <> '')) then
                                IF (NOT EXISTS (SELECT ARTI_COD FROM ARTICULO WHERE ARTI_COD = :CODIGO AND ((upper(ARTI_DES) like upper(:BUSCAR4)) or (UPPER(ARTI_OBS) LIKE UPPER(:BUSCAR4))))) THEN
                                    OK = 'N';
                            if ((OK = 'S') AND (BUSCAR4 <> '')) then
                                IF (NOT EXISTS (SELECT ARTI_COD FROM ARTICULO WHERE ARTI_COD = :CODIGO AND ((upper(ARTI_DES) like upper(:BUSCAR4)) or (UPPER(ARTI_OBS) LIKE UPPER(:BUSCAR4))))) THEN
                                    OK = 'N';
                            if ((OK = 'S') AND (BUSCAR5 <> '')) then
                                IF (NOT EXISTS (SELECT ARTI_COD FROM ARTICULO WHERE ARTI_COD = :CODIGO AND ((upper(ARTI_DES) like upper(:BUSCAR5)) or (UPPER(ARTI_OBS) LIKE UPPER(:BUSCAR5))))) THEN
                                    OK = 'N';
                            if (OK = 'S') then
                                SUSPEND;
                            END
                        ELSE
                            SUSPEND;
                END
            end
    ELSE
        FOR select a.arti_cod, arti_des, grup_cod, arti_unidad, esar_cod, taiv_porc, marc_cod,arti_clase
            from articulo a, tarifa_iva t
            where a.taiv_cod = t.taiv_cod and substring(a.arti_cod from 1 FOR 2) <> '.t' and
            ((:INACTIVOS = 'S') or (esar_cod = 'A') or ((:INACTIVOS = 'C') AND (esar_cod = 'N')))
            INTO :CODIGO, :DES, :GRUPO, :UNIDAD, :ESTADO, :IVA, :MARCA, :CLASE
            do
            begin
            ref = '';
            select first 1 coba_cod from barras_articulo where arti_cod = :codigo into :ref;
            PRECIO = 0;
            SELECT prar_fijo PRECIO FROM precios_articulo WHERE arti_cod = :CODIGO and lipr_cod = :LISTA INTO :PRECIO;
            EXECUTE PROCEDURE redondee(PRECIO, DIG) returning_values (PRECIO);
            if (EXIST = 'SI') then
                BEGIN
                EXECUTE PROCEDURE saldo_total_inventario (:CODIGO, :FECHA) returning_values (:EXISTEN);
                if ((SINEXIST = 'SI')  or (existen <> 0)) then
                    SUSPEND;
                END
            ELSE
                SUSPEND;
            END
    END
ELSE
    if ((BUSCAR IS NOT NULL) AND (BUSCAR <> '')) then
        FOR select arti_cod, arti_des, grup_cod, arti_unidad, esar_cod, taiv_porc, arti_precio, marc_cod, arti_clase
            from articulo a, tarifa_iva t
            where a.taiv_cod = t.taiv_cod and substring(a.arti_cod from 1 FOR 2) <> '.t' and
            ((:INACTIVOS = 'S') or (esar_cod = 'A') or ((:INACTIVOS = 'C') AND (esar_cod = 'N'))) AND
            ((:COLUMNA <> 0) or (upper(A.ARTI_COD) like upper(:buscar))) AND
            ((:columna <> 1) or (upper(A.ARTI_DES) like upper(:buscar))) AND
            ((:columna <> 2) or (upper(A.ARTI_OBS) like upper(:buscar)) or (upper(A.ARTI_DES) like upper(:buscar)))
            INTO :CODIGO, :DES, :GRUPO, :UNIDAD, :ESTADO, :IVA, :PRECIO, :MARCA, :CLASE
            do
            begin
            ref = '';
            select first 1 coba_cod from barras_articulo where arti_cod = :codigo into :ref;
            if ((COLUMNA <> 3) or (upper(REF) like upper(:buscar))) then
                BEGIN
                if (EXIST = 'SI') then
                    BEGIN
                    EXECUTE PROCEDURE saldo_total_inventario (:CODIGO, :FECHA) returning_values (:EXISTEN);
                    if ((SINEXIST = 'SI') or (existen <> 0)) then
                        OK = 'S';
                    END
                ELSE
                    OK = 'S';
                if (ok = 'S') then
                    if (CUALQUIERA = 'S') then
                        SUSPEND;
                    ELSE
                        if (BUSCAR2 <> '') then
                            BEGIN
                            IF (NOT EXISTS (SELECT ARTI_COD FROM ARTICULO WHERE ARTI_COD = :CODIGO AND ((upper(ARTI_DES) like upper(:BUSCAR2)) or (UPPER(ARTI_OBS) LIKE UPPER(:BUSCAR2))))) THEN
                                OK = 'N';
                            if ((OK = 'S') AND (BUSCAR3 <> '')) then
                                IF (NOT EXISTS (SELECT ARTI_COD FROM ARTICULO WHERE ARTI_COD = :CODIGO AND ((upper(ARTI_DES) like upper(:BUSCAR3)) or (UPPER(ARTI_OBS) LIKE UPPER(:BUSCAR3))))) THEN
                                    OK = 'N';
                            if ((OK = 'S') AND (BUSCAR4 <> '')) then
                                IF (NOT EXISTS (SELECT ARTI_COD FROM ARTICULO WHERE ARTI_COD = :CODIGO AND ((upper(ARTI_DES) like upper(:BUSCAR4)) or (UPPER(ARTI_OBS) LIKE UPPER(:BUSCAR4))))) THEN
                                    OK = 'N';
                            if ((OK = 'S') AND (BUSCAR4 <> '')) then
                                IF (NOT EXISTS (SELECT ARTI_COD FROM ARTICULO WHERE ARTI_COD = :CODIGO AND ((upper(ARTI_DES) like upper(:BUSCAR4)) or (UPPER(ARTI_OBS) LIKE UPPER(:BUSCAR4))))) THEN
                                    OK = 'N';
                            if ((OK = 'S') AND (BUSCAR5 <> '')) then
                                IF (NOT EXISTS (SELECT ARTI_COD FROM ARTICULO WHERE ARTI_COD = :CODIGO AND ((upper(ARTI_DES) like upper(:BUSCAR5)) or (UPPER(ARTI_OBS) LIKE UPPER(:BUSCAR5))))) THEN
                                    OK = 'N';
                            if (OK = 'S') then
                                SUSPEND;
                            END
                        ELSE
                            SUSPEND;
                END
            end
    ELSE
        FOR select arti_cod, arti_des, grup_cod, arti_unidad, esar_cod, taiv_porc, arti_precio, marc_cod, arti_clase
            from articulo a, tarifa_iva t
            where a.taiv_cod = t.taiv_cod and substring(a.arti_cod from 1 FOR 2) <> '.t' and
            ((:INACTIVOS = 'S') or (esar_cod = 'A') or ((:INACTIVOS = 'C') AND (esar_cod = 'N')))
            INTO :CODIGO, :DES, :GRUPO, :UNIDAD, :ESTADO, :IVA, :PRECIO, :MARCA, :CLASE
            do
            begin
            ref = '';
            select first 1 coba_cod from barras_articulo where arti_cod = :codigo into :ref;
            if (EXIST = 'SI') then
                BEGIN
                EXECUTE PROCEDURE saldo_total_inventario (:CODIGO, :FECHA) returning_values (:EXISTEN);
                if ((SINEXIST = 'SI') or (existen <> 0)) then
                    SUSPEND;
                END
            ELSE
                SUSPEND;
            end
END
^

SET TERM ; ^

/* 20100421C */
/* DISPONIBLE EN CONSULTA DE EXISTENCIAS */
SET TERM ^ ;

CREATE OR ALTER procedure EXISTENCIAS_UNIDAD (
    ARTICULO varchar(15),
    FECHA date,
    UNIDAD varchar(8))
returns (
    BODEGA varchar(2),
    EXISTENCIA numeric(18,2),
    RESERVADO numeric(18,2),
    DISPONIBLE numeric(18,2),
    ORDENADO numeric(18,2),
    STAND varchar(20))
AS
declare variable FACTOR NUMERIC(15,4);
declare variable ORDENC NUMERIC(18,4);
declare variable PEDIDO NUMERIC(18,4);
declare variable ITEM INTEGER;
declare variable ID INTEGER;
declare variable UND VARCHAR(8);
declare variable CANT NUMERIC(18,4);
declare variable factor2 NUMERIC(18,4);
declare variable PEDAUTO CHAR(2);
BEGIN
EXECUTE PROCEDURE FACTOR_UNIDAD_CANT(:ARTICULO, :UNIDAD) returning_values (:FACTOR);
for select bode_cod from bodega into :bodega
    do
    begin
    SELECT STAND_COD FROM STANDS WHERE ARTI_COD = :ARTICULO AND STAND_BODEGA = :BODEGA INTO :stand;
    execute procedure saldo_inventario (:articulo, :bodega, :fecha) returning_values (:Existencia);
    if (FACTOR <> 0) then
        EXISTENCIA = EXISTENCIA / FACTOR;
    else
        EXISTENCIA = 0;
    /* LO ORDENADO */
    SELECT SUM(ORID_ENTREGAR)
      FROM ORDENINVENTARIO_DETALLE OD, ordenes_inventario O
      WHERE O.ORIN_ID = OD.ORIN_ID AND ARTI_COD = :ARTICULO AND ORIN_FECHA <= :FECHA AND ORIN_FECLLEGA >= :FECHA AND ORID_ANULADO = 'N' AND OD.BODE_COD = :BODEGA
      INTO :ORDENADO;
    if (ORDENADO IS NULL) then
        ORDENADO = 0;
    ORDENC = 0;
    FOR SELECT O.ORDC_ID, OCDE_ITEM, OCDE_CANT * OCDE_FACTOR
        FROM ORDENES_COMPRA O, ORDENES_COMPRA_DETALLE OD
        WHERE O.ORDC_ID = OD.ORDC_ID AND OD.ARTI_COD = :ARTICULO AND (ORDC_FECHA+ORDC_VALIDEZ) >= :FECHA AND ORDC_FECHA <= :FECHA AND OCDE_ANULADO = 'N' AND OD.BODE_COD = :BODEGA
        INTO :ID, :ITEM, :CANT
        do
        BEGIN
        EXECUTE PROCEDURE FALTANTE(23, 21, ID, ITEM) returning_values (PEDIDO, UND, FACTOR2);
        if (PEDIDO * FACTOR2 = CANT) then /* SI NO SE HA FACTURADO MIRE A VER SI SE REMISIONO */
            EXECUTE PROCEDURE FALTANTE(23, 22, ID, ITEM) returning_values (PEDIDO, UND, FACTOR2);
        if (PEDIDO IS NULL) then
            PEDIDO = 0;
        ORDENC = ORDENC + PEDIDO * FACTOR2;
        END
    ORDENADO = ORDENADO + ORDENC;
    if (FACTOR <> 0) then
        ORDENADO = ORDENADO / FACTOR;
    /* LO RESERVADO */
    SELECT SUM(RSDE_LIBERAR)
      FROM RESERVAS_DETALLE RD, RESERVAS R
      WHERE R.RESE_ID = RD.RESE_ID AND ARTI_COD = :ARTICULO AND RESE_FECHA <= :FECHA AND RESE_VENCE >= :FECHA AND RD.BODE_COD = :BODEGA AND RSDE_ANULADO = 'N'
      INTO :RESERVADO;
    if (RESERVADO IS NULL) then
        RESERVADO = 0;
    PEDIDO = 0;
    FOR SELECT P.PEDI_ID, PEDE_ITEM, PEDE_CANT * PEDE_FACTOR
        FROM PEDIDOS P, PEDIDOS_DETALLE PD
        WHERE P.PEDI_ID = PD.PEDI_ID AND PD.ARTI_COD = :ARTICULO AND (PEDI_FECHA+PEDI_VALIDEZ) >= :FECHA AND PEDI_FECHA <= :FECHA AND PEDE_ANULADO = 'N' AND BODE_COD = :BODEGA
        INTO :ID, :ITEM, :CANT
        do
        BEGIN
        EXECUTE PROCEDURE FALTANTE(34, 31, ID, ITEM) returning_values (ORDENC, UND, FACTOR2);
        EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION', 'FACTURAS', 'GENERAR PEDIDO AUTOMATICAMENTE CON LA FACTURA') returning_values (pedauto);
        if ((ORDENC * FACTOR2 = CANT) or (PEDAUTO = 'SI')) then /* SI NO SE HA FACTURADO MIRE A VER SI SE REMISIONO */
            EXECUTE PROCEDURE FALTANTE(34, 32, ID, ITEM) returning_values (ORDENC, UND, FACTOR2);
        if (ORDENC IS NULL) then
            ORDENC = 0;
        PEDIDO = PEDIDO + ORDENC * FACTOR2;
        END
    RESERVADO = RESERVADO + PEDIDO;
    if (FACTOR <> 0) then
        RESERVADO = RESERVADO / FACTOR;
    DISPONIBLE = EXISTENCIA - RESERVADO;
    SUSPEND;
    end
END
^

SET TERM ; ^


SET TERM ^ ;

CREATE OR ALTER procedure EXISTENCIAS_COMPRAS (
    ARTICULO varchar(15),
    FECHA date,
    UNIDAD varchar(8))
returns (
    BODEGA varchar(2),
    EXISTENCIA numeric(18,2),
    RESERVADO numeric(18,2),
    DISPONIBLE numeric(18,2),
    ORDENADO numeric(18,2),
    PROMEDIO numeric(18,2),
    VENTAMES numeric(18,2),
    FECHACMP date,
    CANTCMP numeric(18,2),
    DIAS integer,
    SUGERIDO numeric(18,2),
    STAND varchar(20))
AS
declare variable FACTOR NUMERIC(15,4);
declare variable ORDENC NUMERIC(18,4);
declare variable PEDIDO NUMERIC(18,4);
declare variable ITEM INTEGER;
declare variable ID INTEGER;
declare variable UND VARCHAR(8);
declare variable CANT NUMERIC(18,4);
declare variable FACTOR2 NUMERIC(18,4);
declare variable fecini DATE;
declare variable FECHAAUX VARCHAR(10);
declare variable AGENCIA INTEGER;
declare variable DEVMES NUMERIC(18,2);
declare variable MFAC INTEGER;
declare variable MDEV INTEGER;
declare variable IVAF NUMERIC(18,2);
declare variable IVAD NUMERIC(18,2);
declare variable DIA_ART VARCHAR(2) CHARACTER SET NONE;
declare variable DIASC VARCHAR(255);
declare variable PEDAUTO CHAR(2);
declare variable SALIDAS NUMERIC(18,4);
BEGIN
  for select bode_cod, SUCU_ID from bodega into :bodega, :agencia
    do
    begin
    execute procedure saldo_inventario (:articulo, :bodega, :fecha) returning_values (:Existencia);
    EXECUTE PROCEDURE FACTOR_UNIDAD_CANT(:ARTICULO, :UNIDAD) returning_values (:FACTOR);
    if (FACTOR <> 0) then
        EXISTENCIA = EXISTENCIA / FACTOR;
    else
        EXISTENCIA = 0;
    STAND = '';
    SELECT STAND_COD FROM STANDS WHERE ARTI_COD = :ARTICULO AND STAND_BODEGA = :BODEGA INTO :stand;
    EXECUTE PROCEDURE promedio_salidas_articulo (:ARTICULO, :FECHA, :BODEGA) returning_values (:PROMEDIO, :SALIDAS);
    EXECUTE PROCEDURE lee_configuracion ('INVENTARIO', 'EXISTENCIAS', 'PROMEDIAR LAS SALIDAS DEL INVENTARIO CON EL NUMERO DE DIAS ASIGNADO A CADA ARTICULO') returning_values (:DIA_ART);
    if (DIA_ART = 'NO') then
        BEGIN
        EXECUTE PROCEDURE lee_configuracion ('INVENTARIO', 'EXISTENCIAS', 'NUMERO DE DIAS PARA PROMEDIO DE SALIDAS POR ARTICULO') returning_values (DIASC);
        DIAS = CAST(DIASC AS INTEGER);
        END
    ELSE
        SELECT ARTI_DIAS FROM ARTICULO WHERE ARTI_COD = :ARTICULO INTO :DIAS;
    if (DIAS is null) then
        DIAS = 0;
    PROMEDIO = DIAS * PROMEDIO;
    if (FACTOR <> 0) then
        PROMEDIO = PROMEDIO / FACTOR;
    SUGERIDO = PROMEDIO - EXISTENCIA;
    SELECT SUM(ORID_ENTREGAR)
      FROM ORDENINVENTARIO_DETALLE OD, ordenes_inventario O
      WHERE O.ORIN_ID = OD.ORIN_ID AND ARTI_COD = :ARTICULO AND ORIN_FECHA <= :FECHA AND ORIN_FECLLEGA >= :FECHA AND ORID_ANULADO = 'N' AND OD.BODE_COD = :BODEGA
      INTO :ORDENADO;
    if (ORDENADO IS NULL) then
        ORDENADO = 0;
    ORDENC = 0;
    FOR SELECT O.ORDC_ID, OCDE_ITEM, OCDE_CANT * OCDE_FACTOR
        FROM ORDENES_COMPRA O, ORDENES_COMPRA_DETALLE OD
        WHERE O.ORDC_ID = OD.ORDC_ID AND OD.ARTI_COD = :ARTICULO AND (ORDC_FECHA+ORDC_VALIDEZ) >= :FECHA AND ORDC_FECHA <= :FECHA AND OCDE_ANULADO = 'N' AND OD.BODE_COD = :BODEGA
        INTO :ID, :ITEM, :CANT
        do
        BEGIN
        EXECUTE PROCEDURE FALTANTE(23, 21, ID, ITEM) returning_values (PEDIDO, UND, FACTOR2);
        if (PEDIDO * FACTOR2 = CANT) then /* SI NO SE HA FACTURADO MIRE A VER SI SE REMISIONO */
            EXECUTE PROCEDURE FALTANTE(23, 22, ID, ITEM) returning_values (PEDIDO, UND, FACTOR2);
        if (PEDIDO IS NULL) then
            PEDIDO = 0;
        ORDENC = ORDENC + PEDIDO * FACTOR2;
        END
    ORDENADO = ORDENADO + ORDENC;
    if (FACTOR <> 0) then
        ORDENADO = ORDENADO / FACTOR;
    SELECT SUM(RSDE_LIBERAR)
      FROM RESERVAS_DETALLE RD, RESERVAS R
      WHERE R.RESE_ID = RD.RESE_ID AND ARTI_COD = :ARTICULO AND RESE_FECHA <= :FECHA AND RESE_VENCE >= :FECHA AND RD.BODE_COD = :BODEGA AND RSDE_ANULADO = 'N'
      INTO :RESERVADO;
    if (RESERVADO IS NULL) then
        RESERVADO = 0;
    PEDIDO = 0;
    FOR SELECT P.PEDI_ID, PEDE_ITEM, PEDE_CANT * PEDE_FACTOR
        FROM PEDIDOS P, PEDIDOS_DETALLE PD
        WHERE P.PEDI_ID = PD.PEDI_ID AND PD.ARTI_COD = :ARTICULO AND (PEDI_FECHA+PEDI_VALIDEZ) >= :FECHA AND PEDI_FECHA <= :FECHA AND PEDE_ANULADO = 'N' AND BODE_COD = :BODEGA
        INTO :ID, :ITEM, :CANT
        do
        BEGIN
        EXECUTE PROCEDURE FALTANTE(34, 31, ID, ITEM) returning_values (ORDENC, UND, FACTOR2);
        EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION', 'FACTURAS', 'GENERAR PEDIDO AUTOMATICAMENTE CON LA FACTURA') returning_values (pedauto);
        if ((ORDENC * FACTOR2 = CANT) or (PEDAUTO = 'SI')) then /* SI NO SE HA FACTURADO MIRE A VER SI SE REMISIONO */
            EXECUTE PROCEDURE FALTANTE(34, 32, ID, ITEM) returning_values (ORDENC, UND, FACTOR2);
        if (ORDENC IS NULL) then
            ORDENC = 0;
        PEDIDO = PEDIDO + ORDENC * FACTOR2;
        END
    RESERVADO = RESERVADO + PEDIDO;
    if (FACTOR <> 0) then
        RESERVADO = RESERVADO / FACTOR;
    DISPONIBLE = EXISTENCIA - RESERVADO;
    /* VENTAS MES */
    FECHAAUX = CAST (FECHA AS VARCHAR(10));
    FECHAAUX = SUBSTR(FECHAAUX, 1, 7) || '/01';
    FECINI = CAST (FECHAAUX AS DATE);
    EXECUTE PROCEDURE ventas_articulo (:ARTICULO, :FECINI, :FECHA, :agencia) returning_values (:ventames, :mfac, :devmes, :mdev, :ivaf, :ivad);
    ventames = ventames - devmes;
    if (FACTOR <> 0) then
        ventames = ventames / FACTOR;
    /* FECHA COMPRA */
    fechacmp = null;
    cantcmp = 0;
    SELECT FIRST 1 FACO_FECHA, FCDE_CANT * FCDE_FACTOR FROM FACTURAS_COMPRA F, FACTURAS_COMPRAS_DETALLE D
        WHERE F.FACO_ID = D.faco_id AND D.ARTI_COD = :articulo AND FACO_FECHA <= :FECHA AND D.bode_cod = :BODEGA
        ORDER BY FACO_FECHA DESC, F.FACO_ID DESC
        INTO :fechacmp, :cantcmp;
    SUSPEND;
    end
END
^

SET TERM ; ^


/* 20100421D */
/* LEIDO EN ALERTAS DE ARTICULOS */

ALTER TABLE ARTICULO_ALERTAS
ADD ARAL_LEIDO T_BOOLEANO;

SET TERM ^ ;

CREATE OR ALTER TRIGGER ARTICULO_ALERTAS_BI FOR ARTICULO_ALERTAS
ACTIVE BEFORE INSERT POSITION 0
as
begin
if ((new.arti_item is null) or (new.arti_item = 0)) then
    NEW.arti_item = gen_id(ID_ALERTAS, 1);
NEW.aral_usuario = USER;
if (new.aral_leido IS null) then
    new.aral_leido = 'N';
if (new.aral_fechaini is null) then
    new.aral_fechaini = cast('now' as date);
if (new.aral_fechafin is null) then
    new.aral_fechafin = cast('now' as date);
end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER PRECIOS_ARTICULO_AU FOR PRECIOS_ARTICULO
ACTIVE AFTER UPDATE POSITION 0
as
declare variable LISTA INTEGER;
declare variable MARGEN NUMERIC(18, 4);
declare variable UTIL NUMERIC(18, 4);
declare variable UNIDAD VARCHAR(8);
declare variable UOR VARCHAR(20);
declare variable PRECIO NUMERIC(18, 4);
declare variable DIG INTEGER;
declare variable IVAINCOR CHAR(1);
declare variable IVAINC CHAR(1);
declare variable TARIVA NUMERIC(9,4);
declare variable AUTOM CHAR(1);
declare variable CAMBIO CHAR(7);
declare variable NOTIF integer;
declare variable DESCR VARCHAR(60);
begin
/* inserte en auditoria para que el envio pase los cambios de precios automático */
INSERT INTO AUDITORIA(TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
    VALUES (126, 1, 'U', NEW.arti_cod);

SELECT ARTI_DES, ARTI_UNIDAD, TAIV_PORC FROM ARTICULO A, TARIFA_IVA T WHERE A.TAIV_COD = T.TAIV_COD AND ARTI_COD = NEW.arti_cod
    INTO :DESCR, :UNIDAD, :TARIVA;
EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION','ARTICULOS','CAMBIO DE PRECIOS AUTOMATICO AL CAMBIAR COSTO O PRECIO') returning_values (CAMBIO);
if (CAMBIO = 'PRECIO') then
    BEGIN
    EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION','ARTICULOS','CODIGO DE LA LISTA DE PRECIOS BASE PARA CAMBIO DE PRECIOS AUTOMATICO') returning_values (LISTA);
    if (NEW.lipr_cod = :LISTA) then
        BEGIN
        EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION', 'ARTICULOS', 'SUGERIR PRECIOS CON PORCENTAJE DE MARGEN O UTILIDAD') RETURNING_VALUES (:UOR);
        EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION', 'ARTICULOS', 'REDONDEO AL MULTIPLO DE DIEZ EN PRECIOS') RETURNING_VALUES (:DIG);
        SELECT LIPR_MODIF FROM lista_precios WHERE LIPR_COD = NEW.lipr_cod INTO :IVAINCOR;

        FOR SELECT P.LIPR_COD, PRAR_MARGEN, PRAR_UTIL, LIPR_MODIF, PRAR_AUTO
            FROM PRECIOS_ARTICULO P, LISTA_PRECIOS L
            WHERE P.LIPR_COD = L.LIPR_COD AND ARTI_COD = NEW.arti_cod AND P.LIPR_COD <> NEW.lipr_cod AND PRAR_AUTO = 'S'
            INTO :LISTA, :MARGEN, :UTIL, :IVAINC, :AUTOM
            DO
            BEGIN
            if (UTIL IS NULL) then
                UTIL = 0;
            if (MARGEN IS NULL) then
                MARGEN = 0;
            if (IVAINCOR = 'S') then
                PRECIO = NEW.prar_fijo / (1 + TARIVA/100);
            else
                PRECIO = NEW.prar_fijo;
            if (IVAINC = 'S') then
                PRECIO = PRECIO * (1 + TARIVA/100);
            if (UOR = 'UTILIDAD') then
                BEGIN
                PRECIO = PRECIO * (1 + :UTIL/100);
                EXECUTE PROCEDURE REDONDEE (PRECIO, DIG) returning_values (PRECIO);
                UPDATE PRECIOS_ARTICULO
                    SET PRAR_FIJO = :PRECIO
                    WHERE ARTI_COD = NEW.arti_cod AND LIPR_COD = :LISTA;
                END
            ELSE
                BEGIN
                PRECIO = PRECIO / (1 - :MARGEN/100);
                EXECUTE PROCEDURE REDONDEE (PRECIO, DIG) returning_values (PRECIO);
                UPDATE PRECIOS_ARTICULO
                    SET PRAR_FIJO = :PRECIO
                    WHERE ARTI_COD = NEW.arti_cod AND LIPR_COD = :LISTA;
                END
            END
        END
    END

if (NEW.prar_fijo <> OLD.prar_fijo) then
    BEGIN
    EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION','ARTICULOS','LISTA DE PRECIOS A NOTIFICAR LOS CAMBIOS A TODOS LOS USUARIOS') returning_values (NOTIF);
    if ((NOTIF <> '0') AND (NEW.lipr_cod = CAST(NOTIF AS INTEGER))) then
        BEGIN
        if (NEW.prar_fijo > OLD.prar_fijo) then
            insert INTO articulo_alertas (ARTI_COD, ARAL_MENSAJE)
                VALUES (NEW.arti_cod, 'CAMBIO PRECIO ARTICULO ' || NEW.arti_cod || ':' || :DESCR || '<BR>ANTES:' || OLD.prar_fijo || ' AHORA:' || NEW.prar_fijo);
        ELSE
            insert INTO articulo_alertas (ARTI_COD, ARAL_MENSAJE)
                VALUES (NEW.arti_cod, 'PROMOCION ARTICULO ' || NEW.arti_cod || ':' || :DESCR || '<BR>ANTES:' || OLD.prar_fijo || ' AHORA:' || NEW.prar_fijo);
        END
    END

end
^

SET TERM ; ^

/* 20100421e: eventos de cartera en crm */
ALTER TABLE CRM_COMPROMISOS
ADD CRCO_IDDOC T_ID;
ALTER TABLE CRM_COMPROMISOS
ADD CRCO_TIPODOC T_ID;

CREATE INDEX CRM_COMPROMISOS_IDX3
ON CRM_COMPROMISOS (CRCO_TIPODOC,CRCO_IDDOC);

INSERT INTO CONFIGURACION (CONF_MODULO, CONF_CATEGORIA, CONF_PROPIEDAD, CONF_VALOR, CONF_POSIBLES, CONF_AYUDA) VALUES ('CARTERA', 'SALDOS', 'NUMERO DE DIAS AL VENCIMIENTO PARA COMPROMISOS DE CARTERA', '0', '-5,-3,-1,0,1,2,3,5,7,10,15', 'Indique el número días antes (-) o después del vencimiento para recordar al encargado de cartera el cobro de los documentos pendientes de pago del cliente');
INSERT INTO CONFIGURACION (CONF_MODULO, CONF_CATEGORIA, CONF_PROPIEDAD, CONF_VALOR, CONF_POSIBLES, CONF_AYUDA) VALUES ('CARTERA', 'SALDOS', 'MENSAJE ADICIONAL PARA COMPROMISOS DE CARTERA', '', '', 'Indique el mensaje que se agregará junto con los datos de la factura al recordatorio de cobro de cartera.');
INSERT INTO CONFIGURACION (CONF_MODULO, CONF_CATEGORIA, CONF_PROPIEDAD, CONF_VALOR, CONF_POSIBLES, CONF_AYUDA) VALUES ('CARTERA', 'SALDOS', 'CODIGO DEL ASESOR QUE RECIBE LOS RECORDATORIOS DE CARTERA', '0', '', 'Indique el código del asesor de CRM que recibe en su agenda los recordatorios de cartera de clientes por cada documento a vencer o vencido según el número de días al vencimiento indicado');
commit work;


INSERT INTO CRM_TIPOEVENTO (CRTE_ID, CRTE_NOMBRE) VALUES (890, 'Cartera cliente');
INSERT INTO CRM_TIPOEVENTO (CRTE_ID, CRTE_NOMBRE) VALUES (891, 'Cancelación factura');
INSERT INTO CRM_TIPOEVENTO (CRTE_ID, CRTE_NOMBRE) VALUES (892, 'Cancelación nota débito');
INSERT INTO CRM_TIPOEVENTO (CRTE_ID, CRTE_NOMBRE) VALUES (893, 'Cancelación cheque devuelto');
commit work;

SET TERM ^ ;

CREATE OR ALTER TRIGGER SALDOS_DOC_CARTERA_AI FOR SALDOS_DOC_CARTERA
ACTIVE AFTER INSERT POSITION 0
as
declare variable CRMASES INTEGER;
declare variable VENCE DATE;
declare variable DIAS INTEGER;
declare variable DOCUMENTO VARCHAR(100);
declare variable MENSAJE VARCHAR(150);
declare variable SALDO numeric(18,2);
declare variable TIPOEVEN INTEGER;
begin
execute procedure lee_configuracion ('CARTERA', 'SALDOS', 'CODIGO DEL ASESOR QUE RECIBE LOS RECORDATORIOS DE CARTERA') returning_values (:crmases);
if ((CRMASES <> 0) AND (NEW.sdca_debito = 'S')) then
    BEGIN
    execute procedure lee_configuracion ('CARTERA', 'SALDOS', 'NUMERO DE DIAS AL VENCIMIENTO PARA COMPROMISOS DE CARTERA') returning_values(:DIAS);
    execute procedure lee_configuracion ('CARTERA', 'SALDOS', 'MENSAJE ADICIONAL PARA COMPROMISOS DE CARTERA') returning_values (:mensaje);

    SELECT MVCL_VENCE, tido_nomlargo || ' No.' || m.mvcl_prefref || m.mvcl_numref || ' Vence:' || m.mvcl_vence || ' Valor:' || new.sdca_monto
        FROM movimiento_clientes m, tipo_documento t
        WHERE MVCL_TIPOREF = NEW.sdca_tiporef AND MVCL_IDREF = NEW.sdca_idref and m.mvcl_tiporef = t.tido_cod
        INTO :VENCE, :documento;
    if ((NEW.sdca_monto <> 0) AND (NEW.sdca_abono <> NEW.sdca_monto)) then
        BEGIN
        /* QUEDA PENDIENTE GRABE EL COMPROMISO */
        insert into crm_compromisos (crco_id, crco_nit, crco_fecha, crco_hora, crco_tipo, crco_obs, crco_asesor, crco_cumplido, crco_horaaviso, crco_contacto, crco_anulado, crco_prioridad, crco_fecreg, crco_usuario, CRCO_TIPODOC, CRCO_IDDOC)
            values (gen_id(id_compromiso, 1), NEW.terc_nit, :VENCE + :DIAS, '8:00', 890, :documento || :mensaje, :crmases, 'N', '8:00', null, 'N', 'N', cast('now' as DATE), user, NEW.sdca_tiporef, NEW.sdca_idref);
        END
    ELSE
        BEGIN
        EXECUTE PROCEDURE saldo_doc_cartera(NEW.sdca_tiporef, NEW.sdca_idref, NEW.sdca_fecha, 0) returning_values (:SALDO);
        if (SALDO = 0) then
            BEGIN
            /* CANCELE CUALQUIER COMPROMISO DE CARTERA ASOCIADO A ESE DOCUMENTO */
            UPDATE crm_compromisos SET CRCO_CUMPLIDO = 'S'
                WHERE CRCO_TIPO = 890 AND CRCO_TIPODOC = NEW.sdca_tiporef AND CRCO_IDDOC = NEW.sdca_idref;
            if (NEW.sdca_tiporef = 31) then
                TIPOEVEN = 891;
            if (NEW.sdca_tiporef = 33) then
                TIPOEVEN = 892;
            if (NEW.sdca_tiporef = 41) then
                TIPOEVEN = 893;
            if (NEW.sdca_tiporef = 42) then
                TIPOEVEN = 894;
            insert into crm_eventos (CREV_TIPO, CREV_ORIGEN, CREV_FECHA, CREV_HORA, CREV_MOTIVO, CREV_ASESOR, CREV_VALOR, CREV_EXPLICA, CREV_OBS, CREV_ACTIVIDAD, CRCL_NIT, CREV_ANULADO)
                VALUES (:TIPOEVEN, new.sdca_idref, cast('now' as DATE), cast('now' as time), 4, :crmases, new.sdca_abono, 'Cancela ' || :documento, null, 0, new.terc_nit, 'N');
            END
        END
    END
end
^

SET TERM ; ^

SET TERM ^ ;

create or alter trigger SALDOS_DOC_CARTERA_AD for SALDOS_DOC_CARTERA
active AFTER DELETE position 0
as
declare variable TIPOEVEN INTEGER;
begin
if (old.sdca_monto <> 0) then
    delete from crm_compromisos where crco_tipo = 890 and crco_tipodoc = old.sdca_tiporef and crco_iddoc = old.sdca_idref;
else
    if (old.sdca_abono <> 0) then
        BEGIN
        if (old.sdca_tiporef = 31) then
            TIPOEVEN = 891;
        if (old.sdca_tiporef = 33) then
            TIPOEVEN = 892;
        if (old.sdca_tiporef = 41) then
            TIPOEVEN = 893;
        if (old.sdca_tiporef = 42) then
            TIPOEVEN = 894;
        delete from crm_compromisos where crco_tipo = :tipoeven and crco_tipodoc = old.sdca_tiporef and crco_iddoc = old.sdca_idref;
        END
end
^

SET TERM ; ^

SET TERM ^ ;

create trigger SALDOS_DOC_CARTERA_AU for SALDOS_DOC_CARTERA
active AFTER UPDATE position 0
as
declare variable CRMASES INTEGER;
declare variable DOCUMENTO VARCHAR(100);
declare variable SALDO numeric(18,2);
declare variable TIPOEVEN INTEGER;
begin
execute procedure lee_configuracion ('CARTERA', 'SALDOS', 'CODIGO DEL ASESOR QUE RECIBE LOS RECORDATORIOS DE CARTERA') returning_values (:crmases);
if ((CRMASES <> 0) AND (OLD.sdca_debito = 'S')) then
    begin
    if (old.sdca_abono <> 0) then
        BEGIN
        if (old.sdca_tiporef = 31) then
            TIPOEVEN = 891;
        if (old.sdca_tiporef = 33) then
            TIPOEVEN = 892;
        if (old.sdca_tiporef = 41) then
            TIPOEVEN = 893;
        if (old.sdca_tiporef = 42) then
            TIPOEVEN = 894;
        delete from crm_compromisos where crco_tipo = :tipoeven and crco_tipodoc = old.sdca_tiporef and crco_iddoc = old.sdca_idref;
        END
    EXECUTE PROCEDURE saldo_doc_cartera(NEW.sdca_tiporef, NEW.sdca_idref, NEW.sdca_fecha, 0) returning_values (:SALDO);
    if (SALDO = 0) then
        BEGIN
        SELECT tido_nomlargo || ' No.' || m.mvcl_prefref || m.mvcl_numref || ' Vence:' || m.mvcl_vence || ' Valor:' || new.sdca_monto
            FROM movimiento_clientes m, tipo_documento t
            WHERE MVCL_TIPOREF = NEW.sdca_tiporef AND MVCL_IDREF = NEW.sdca_idref and m.mvcl_tiporef = t.tido_cod
            INTO :documento;
        /* CANCELE CUALQUIER COMPROMISO DE CARTERA ASOCIADO A ESE DOCUMENTO */
        UPDATE crm_compromisos SET CRCO_CUMPLIDO = 'S'
            WHERE CRCO_TIPO = 890 AND CRCO_TIPODOC = NEW.sdca_tiporef AND CRCO_IDDOC = NEW.sdca_idref;
        if (NEW.sdca_tiporef = 31) then
            TIPOEVEN = 891;
        if (NEW.sdca_tiporef = 41) then
            TIPOEVEN = 892;
        if (NEW.sdca_tiporef = 77) then
            TIPOEVEN = 893;
        insert into crm_eventos (CREV_TIPO, CREV_ORIGEN, CREV_FECHA, CREV_HORA, CREV_MOTIVO, CREV_ASESOR, CREV_VALOR, CREV_EXPLICA, CREV_OBS, CREV_ACTIVIDAD, CRCL_NIT, CREV_ANULADO)
            VALUES (:Tipoeven, new.sdca_idref, cast('now' as DATE), cast('now' as time), 4, :crmases, new.sdca_abono, 'Cancela ' || :documento, null, 0, new.terc_nit, 'N');
        END
    end
end
^

SET TERM ; ^


/* 20100422 */
/* BASE EN ARCHIVO DE RETENCIONES QUE LE PRACTICARON */

UPDATE MEDIOSMAG_ARCHIVOS SET
    MEDM_VERSION = '07',
    MEDM_VALOR1 = 'BASE',
    MEDM_VALOR2 = 'RETENCION'
WHERE (MEDM_FORMATO = 1003);

commit WORK;

SET TERM ^ ;

CREATE OR ALTER procedure MM_1003 (
    INICIO char(8),
    FINAL char(8))
AS
declare variable IDCONC INTEGER;
declare variable CONCEPTO INTEGER;
declare variable TIPODOC INTEGER;
declare variable NIT VARCHAR(15) CHARACTER SET NONE;
declare variable DV CHAR(1) CHARACTER SET NONE;
declare variable APELLIDO1 VARCHAR(60) CHARACTER SET NONE;
declare variable APELLIDO2 VARCHAR(60) CHARACTER SET NONE;
declare variable NOMBRE1 VARCHAR(60) CHARACTER SET NONE;
declare variable NOMBRE2 VARCHAR(60) CHARACTER SET NONE;
declare variable RAZONSOCIAL VARCHAR(450) CHARACTER SET NONE;
declare variable DIRECCION VARCHAR(200) CHARACTER SET NONE;
declare variable DEPARTAMENTO CHAR(2) CHARACTER SET NONE;
declare variable MUNICIPIO CHAR(3) CHARACTER SET NONE;
declare variable PAGO NUMERIC(18,0);
declare variable RETENCION NUMERIC(18,0);
declare variable ITEM INTEGER;
begin
ITEM = 0;
FOR select COME_ITEM, COME_RESPUESTA FROM configura_mediosmag WHERE COME_FORMATO = 1003
    INTO :idconc, :CONCEPTO
    DO
    BEGIN
    FOR SELECT MAX(D.TERC_NIT), SUM(CODE_DEBITO-CODE_CREDITO), SUM(CODE_BASE)
        FROM COMPROBANTE_DETALLE D, COMPROBANTE_ENCABEZADO E, mediosmag_cuentas M
        WHERE M.mmcu_item = :idconc AND SUBSTR(CUEN_COD,1,STRLEN(M.mmcu_cuenta)) = M.mmcu_cuenta AND
        E.ENCO_CONSEC = D.ENCO_CONSEC AND ENCO_FECHA >= :INICIO AND ENCO_FECHA <= :FINAL AND
        ((CODE_CREDITO <> 0) or (CODE_DEBITO <> 0))
        GROUP BY D.TERC_NIT
        INTO :NIT, :RETENCION, :PAGO
        DO
        BEGIN
        if (RETENCION > 0) then
            BEGIN
            SELECT TERC_NOM, TERC_NOMBRE1, TERC_NOMBRE2, TERC_APELLIDO1, TERC_APELLIDO2, TERC_DV, TIID_CODIGO,
                TERC_DIR, SUBSTR(CIUD_COD,1,2), SUBSTR(CIUD_COD,3,5)
                FROM TERCEROS T left outer join TIPO_ID IT on (T.TERC_TIPOID = IT.TIID_COD) WHERE TERC_NIT = :NIT
                INTO :RAZONSOCIAL, :NOMBRE1, :NOMBRE2, :APELLIDO1, :APELLIDO2, :DV, :TIPODOC, :DIRECCION, :DEPARTAMENTO, :MUNICIPIO;
            ITEM = ITEM + 1;
            insert into medios_magneticos_datos (memg_formato, memg_ano, memg_item, memg_concepto, memg_tipodoc, memg_nit, memg_dv,memg_apellido1, memg_apellido2, 
                memg_nombre1, memg_nombre2, memg_razonsocial, memg_direccion, memg_departamento, memg_municipio, memg_pago, memg_retencion)
                values (1003, substr(:inicio,1,4), :item,  :concepto, :tipodoc, :nit, :dv, :apellido1, :apellido2,
                :nombre1, :nombre2, :razonsocial, :direccion, :departamento, :municipio, :pago, :retencion);
            END
        END
    END
end
^

SET TERM ; ^

/* 20100423 */
/* confirmacxc en si si no se indica */

SET TERM ^ ;

CREATE OR ALTER TRIGGER DEVOLUCIONES_VENTAS_BI FOR DEVOLUCIONES_VENTAS
ACTIVE BEFORE INSERT POSITION 0
AS
declare variable NUMERO VARCHAR(6);
declare variable AUTOM CHAR(1);
declare variable EXISTE CHAR(1);
declare variable SITOT CHAR(2);
declare variable CODCOBR INTEGER;
declare variable CODVEND INTEGER;
declare variable FECSERVER CHAR(2);
declare variable PREGTASA CHAR(2);
BEGIN
if (NEW.devt_confirmacxc IS NULL) Then
    NEW.devt_confirmacxc = 'S';
if ((NEW.devt_trm IS NULL) or (NEW.devt_trm = 0)) then
    NEW.devt_trm = 1;
EXECUTE PROCEDURE LEE_CONFIGURACION('GENERAL', 'GENERAL', 'PREGUNTAR TASA DE CAMBIO EN DOCUMENTOS DE CARTERA') returning_values (:pregtasa);
if (PREGTASA = 'SI') then
    BEGIN
    NEW.devt_adicional = NEW.devt_adicional * NEW.devt_trm;
    NEW.devt_ivamonto = NEW.devt_ivamonto * NEW.devt_trm;
    NEW.devt_extra = NEW.devt_extra * NEW.devt_trm;
    NEW.devt_rtftemonto = NEW.devt_rtftemonto * NEW.devt_trm;
    NEW.devt_rtivamonto = NEW.devt_rtivamonto * NEW.devt_trm;
    NEW.devt_rticamonto = NEW.devt_rticamonto * NEW.devt_trm;
    NEW.devt_dtomonto = NEW.devt_dtomonto * NEW.devt_trm;
    END
EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION', 'DOCUMENTOS', 'INHABILITAR FECHA EN DOCUMENTOS') returning_values (:fecserver);
if (FECSERVER = 'SI') then
    NEW.devt_fecha = CAST ('NOW' AS DATE);
if (new.devt_remid is null) then
    NEW.devt_remid = 0;
if (new.devt_pedid is null) then
    NEW.devt_pedid = 0;
execute procedure LEE_CONFIGURACION ('FACTURACION','DEVOLUCIONES','PERMITIR DEVOLVER ITEMS NO FACTURADOS') returning_values (:SITOT);
if ((SITOT = 'NO') AND (NEW.devt_factid = 0) AND (NEW.devt_remid = 0) AND (NEW.devt_pedid = 0)) then
    exception factura_no_existe;
/* CALCULE LA COMISION CON BASE EN LA FACTURA */
EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION', 'VENDEDORES', 'COMISIONES EN VENTA INCLUYENDO IMPUESTOS') returning_values (:SITOT);
SELECT FACT_COMIPORC FROM FACTURAS WHERE FACT_ID = NEW.devt_factid INTO NEW.devt_comiporc;
if (NEW.devt_comiporc IS NULL) then
    NEW.devt_comiporc = 0;

if (SITOT = 'SI') then
    NEW.devt_comimonto = NEW.devt_total * NEW.devt_comiporc / 100;
ELSE
    NEW.devt_comimonto = (NEW.devt_total - NEW.devt_ivamonto) * NEW.devt_comiporc / 100;

if (NEW.numok = 'N') then
  BEGIN
  /* Actualice el contador del prefijo */
  SELECT PREF_ACTUAL, PREF_AUTO FROM PREFIJOS WHERE TIDO_COD = 33 AND PREF_PRE = NEW.PREF_PRE INTO :NUMERO, :AUTOM;
  /* ACTUALICE EL NUMERO EN COMPROBANTE_ENCABEZADO  */
  if (AUTOM = 'S') then
    BEGIN
    NEW.DEVT_NUMERO = NUMERO;
    NUMERO = CAST((CAST(NUMERO AS INTEGER) + 1) AS CHAR(6));
    UPDATE PREFIJOS
      SET PREF_ACTUAL = :NUMERO
    WHERE TIDO_COD = 33 AND PREF_PRE = NEW.PREF_PRE;
    END
  ELSE
    BEGIN
    if (CAST(NUMERO AS INTEGER) = CAST(NEW.DEVT_NUMERO AS INTEGER)) then
        UPDATE PREFIJOS
          SET PREF_ACTUAL = CAST((CAST(PREF_ACTUAL AS INTEGER) + 1) AS CHAR(6))
        WHERE TIDO_COD = 33 AND PREF_PRE = NEW.PREF_PRE;
    END
  EXECUTE PROCEDURE COMPLETA_CEROS (NEW.DEVT_numero) returning_values (NEW.DEVT_numero);
  NEW.numok = 'S';
  END
/* Verifique que el numero no existe previamente */
EXISTE = 'N';
SELECT 'S' FROM DEVOLUCIONES_VENTAS WHERE PREF_PRE = NEW.PREF_PRE AND DEVT_NUMERO = NEW.DEVT_NUMERO INTO :EXISTE;
if (EXISTE = 'S') then
    EXCEPTION DOCUMENTO_REGISTRADO 'Ya existe una devolución con el número ' || new.pref_pre || new.devt_numero;
select COBR_COD, VEND_COD FROM CLIENTES WHERE TERC_NIT = NEW.terc_nit INTO :CODCOBR, CODVEND;
if (NEW.cobr_cod IS NULL) then
    NEW.cobr_cod = :CODCOBR;
if (NEW.vend_cod IS NULL) then
    NEW.vend_cod = :CODVEND;
if (NEW.devt_aplica IS NULL) then
    NEW.devt_aplica = 'N';
if ((new.DEVT_TOTAL-new.DEVT_IVAMONTO+new.DEVT_DTOMONTO-new.DEVT_ADICIONAL) = 0) then
    NEW.DEVT_FACTOR = 1;
else
    NEW.DEVT_FACTOR = (new.DEVT_TOTAL-new.DEVT_IVAMONTO)/(new.DEVT_TOTAL-new.DEVT_IVAMONTO+new.DEVT_DTOMONTO-new.DEVT_ADICIONAL);
END
^

SET TERM ; ^


/* 20100424 */
CREATE TABLE REPLICA_VENTAS (
    RPVE_COD       CHAR(3) NOT NULL,
    RPVE_NOMBRE    T_CONCEPTO /* T_CONCEPTO = VARCHAR(60) */,
    RPVE_SERVIDOR  T_CONCEPTO /* T_CONCEPTO = VARCHAR(60) */,
    RPVE_PREF      VARCHAR(4),
    RPVE_PTVT      INTEGER,
    RPVE_PREFDES   VARCHAR(4),
    RPVE_PTVTDES   INTEGER
);

ALTER TABLE REPLICA_VENTAS ADD CONSTRAINT PK_REPLICA_VENTAS PRIMARY KEY (RPVE_COD);

grant select, delete, insert, update on  replica_ventas to public;

/* 20100421 */

/* BASE E IVA EN CONSULTA DE PRECIOS */
SET TERM ^ ;

CREATE OR ALTER procedure PRECIOS_UNIDAD (
    ARTICULO varchar(20),
    UNIDAD varchar(8))
returns (
    LISTA integer,
    PRECIOB numeric(18,2),
    IVAPORC NUMERIC(9,2),
    IVAMONTO numeric(18,2),
    PRECIOT numeric(18,2),
    RENTA numeric(9,2),
    UTIL numeric(9,2),
    AUTOM char(1),
    COMIPORC numeric(9,2),
    CANTMIN numeric(18,4),
    SUBEMPRESA integer)
AS
DECLARE VARIABLE FACTOR NUMERIC(18,4);
declare variable IVAINC CHAR(1);
BEGIN
FOR SELECT P.LIPR_COD, PRAR_FIJO, PRAR_MARGEN, PRAR_UTIL, PRAR_AUTO, PRAR_COMI, PRAR_CANTMIN, sucu_id, LIPR_MODIF, TAIV_PORC
    FROM PRECIOS_ARTICULO P, lista_precios L, ARTICULO A, TARIFA_IVA T
    WHERE P.ARTI_COD = :ARTICULO AND A.ARTI_COD = P.arti_cod AND A.taiv_cod = T.taiv_cod AND P.lipr_cod = L.lipr_cod AND L.lipr_fecini <= cast('now' as DATE) AND L.lipr_fecfin >= cast('now' as DATE)
    INTO :LISTA, :PRECIOT, :RENTA, :UTIL, :AUTOM, :COMIPORC, :CANTMIN, :SUBEMPRESA, :IVAINC, :IVAPORC
    DO
    BEGIN
    EXECUTE PROCEDURE FACTOR_UNIDAD_PRE (:ARTICULO, :UNIDAD) returning_values (:FACTOR);
    PRECIOT = PRECIOT * FACTOR;
    if (IVAINC = 'S') then
        BEGIN
        IVAMONTO = PRECIOT / (100 + IVAPORC) * IVAPORC;
        preciob = PRECIOT - IVAMONTO;
        END
    ELSE
        BEGIN
        PRECIOB = PRECIOT;
        IVAMONTO = PRECIOB * IVAPORC / 100;
        PRECIOT = PRECIOB + IVAMONTO;
        END
    SUSPEND;
    END
END
^

SET TERM ; ^


/* 20100428 */
/* demora al calcular el costo en ventas en rep. de utilidad y contabilizacion */

SET TERM ^ ;

CREATE OR ALTER procedure COSTO_EN_VENTAS (
    TIPO integer,
    ID integer)
AS
declare variable FECHA DATE;
declare variable ARTICULO VARCHAR(20);
declare variable CANTIDAD NUMERIC(18,4);
declare variable COSTO NUMERIC(18,2);
declare variable CTACOSTO VARCHAR(20);
declare variable CTAINVEN VARCHAR(20);
declare variable ITEM INTEGER;
BEGIN
DELETE FROM COSTO_VENTAS WHERE TIDO_COD = :TIPO AND COVE_ID = :ID;
if (TIPO = 31) then
    BEGIN
    /* FACTURA DE VENTA */
    FOR SELECT D.ARTI_COD, FADE_CANT * FADE_FACTOR, FACT_FECHA, fade_item
        FROM ARTICULO A, FACTURAS F, FACTURAS_DETALLE D
        WHERE F.FACT_ID = D.FACT_ID AND A.ARTI_COD = D.ARTI_COD AND F.FACT_ID = :ID AND FACT_ANULADO = 'N'
        INTO :ARTICULO, :CANTIDAD, :FECHA, :ITEM
        DO
        BEGIN
        SELECT COAR_CTACOS, COAR_CTAINV FROM CONTABIL_ARTICULO WHERE ARTI_COD = :articulo INTO :CTACOSTO, :CTAINVEN;
        if (EXISTS (SELECT COST_SALP / COST_SALC FROM COSTOS C, MOVIMIENTO_ARTICULO M
                WHERE C.arti_cod = M.arti_cod AND COST_IDMOV = MVAR_CONS AND MVAR_TIPODOC = 31 AND MVAR_IDREF = :ID AND COST_SALC <> 0 AND MVAR_ITEM = :ITEM)) then
            SELECT COST_SALP / COST_SALC FROM COSTOS C, MOVIMIENTO_ARTICULO M
                WHERE C.arti_cod = M.arti_cod AND COST_IDMOV = MVAR_CONS AND MVAR_TIPODOC = 31 AND MVAR_IDREF = :ID AND COST_SALC <> 0 AND MVAR_ITEM = :ITEM INTO :COSTO;
        else
            EXECUTE PROCEDURE COSTO_PROMEDIO(:ARTICULO, :FECHA) returning_values (:COSTO);
        INSERT INTO COSTO_VENTAS (TIDO_COD, COVE_ID, ARTI_COD, CANT, COSTO,  CTACOS, CTAINV)
            VALUES (:TIPO, :ID, :ARTICULO, :CANTIDAD, :COSTO, :CTACOSTO, :CTAINVEN);
        END
    END
if (TIPO = 32) then
    BEGIN
    /* REMISION */
    FOR SELECT D.ARTI_COD, RVDE_CANT * RVDE_FACTOR, REVT_FECHA, RVDE_ITEM
        FROM ARTICULO A, REMISIONES_VENTA R, REMISIONES_VENTA_DETALLE D
        WHERE R.REVT_ID = D.REVT_ID AND A.ARTI_COD = D.ARTI_COD AND R.REVT_ID = :ID AND REVT_ANULADO = 'N'
        INTO :ARTICULO, :CANTIDAD, :FECHA, :ITEM
        DO
        BEGIN
        SELECT COAR_CTACOS, COAR_CTAINV FROM CONTABIL_ARTICULO WHERE ARTI_COD = :articulo INTO :CTACOSTO, :CTAINVEN;
        if (EXISTS (SELECT COST_SALP / COST_SALC FROM COSTOS C, MOVIMIENTO_ARTICULO M
                WHERE C.arti_cod = M.arti_cod AND COST_IDMOV = MVAR_CONS AND MVAR_TIPODOC = 32 AND MVAR_IDREF = :ID AND COST_SALC <> 0 AND MVAR_ITEM = :ITEM)) then
            SELECT COST_SALP / COST_SALC FROM COSTOS C, MOVIMIENTO_ARTICULO M
                WHERE C.arti_cod = M.arti_cod AND COST_IDMOV = MVAR_CONS AND MVAR_TIPODOC = 31 AND MVAR_IDREF = :ID AND COST_SALC <> 0 AND MVAR_ITEM = :ITEM INTO :COSTO;
        else
            EXECUTE PROCEDURE COSTO_PROMEDIO(:ARTICULO, :FECHA) returning_values (:COSTO);
        INSERT INTO COSTO_VENTAS (TIDO_COD, COVE_ID, ARTI_COD, CANT, COSTO,  CTACOS, CTAINV)
            VALUES (:TIPO, :ID, :ARTICULO, :CANTIDAD, :COSTO, :CTACOSTO, :CTAINVEN);
        END
    END
if (TIPO = 33) then
    BEGIN
    /* DEVOLUCION */
    FOR SELECT D.ARTI_COD, DVDE_CANT * DVDE_FACTOR, DEVT_FECHA, DVDE_ITEM
        FROM ARTICULO A, DEVOLUCIONES_VENTAS DV, DEVOLUCIONES_VENTAS_DETALLE D
        WHERE DV.DEVT_ID = D.DEVT_ID AND A.ARTI_COD = D.ARTI_COD AND DV.DEVT_ID = :ID AND DEVT_ANULADO = 'N'
        INTO :ARTICULO, :CANTIDAD, :FECHA, :ITEM
        DO
        BEGIN
        SELECT COAR_CTACOS, COAR_CTAINV FROM CONTABIL_ARTICULO WHERE ARTI_COD = :articulo INTO :CTACOSTO, :CTAINVEN;
        if (EXISTS (SELECT COST_ENTP / COST_ENTC FROM COSTOS C, MOVIMIENTO_ARTICULO M
                WHERE C.arti_cod = M.arti_cod AND COST_IDMOV = MVAR_CONS AND MVAR_TIPODOC = 33 AND MVAR_IDREF = :ID AND COST_ENTC <> 0 AND MVAR_ITEM = :ITEM)) then
            SELECT COST_ENTP / COST_ENTC FROM COSTOS C, MOVIMIENTO_ARTICULO M
                WHERE C.arti_cod = M.arti_cod AND COST_IDMOV = MVAR_CONS AND MVAR_TIPODOC = 33 AND MVAR_IDREF = :ID AND COST_ENTC <> 0 AND MVAR_ITEM = :ITEM INTO :COSTO;
        else
            EXECUTE PROCEDURE COSTO_PROMEDIO(:ARTICULO, :FECHA) returning_values (:COSTO);
        INSERT INTO COSTO_VENTAS (TIDO_COD, COVE_ID, ARTI_COD, CANT, COSTO,  CTACOS, CTAINV)
            VALUES (:TIPO, :ID, :ARTICULO, :CANTIDAD, :COSTO, :CTACOSTO, :CTAINVEN);
        END
    END
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE CONTABILICE_COSTO_VENTAS(
    TIPO INTEGER,
    ID INTEGER,
    IDINTER INTEGER)
RETURNS (
    IDC INTEGER)
AS
declare variable PREF VARCHAR(4);
declare variable NUM VARCHAR(6);
declare variable NUMERO VARCHAR(10);
declare variable INVEN CHAR(1);
declare variable CTAINVEN VARCHAR(20);
declare variable COSTOS CHAR(1);
declare variable CTACOSTOS VARCHAR(20);
declare variable EXISTE CHAR(1);
declare variable CUENTA VARCHAR(20);
declare variable MONTO NUMERIC(18,2);
declare variable TIPOCUEN CHAR(1);
declare variable NIT VARCHAR(20);
declare variable PROY VARCHAR(4);
declare variable CENTRO VARCHAR(4);
declare variable ART VARCHAR(15);
declare variable ANULADO CHAR(1);
declare variable NROI INTEGER;
declare variable NUMROWS INTEGER;
declare variable CONC CHAR(120);
declare variable VENCEAUX DATE;
declare variable VENCE CHAR(8);
declare variable IDREM INTEGER;
declare variable IDPED INTEGER;
declare variable CENT CHAR(1);
declare variable ERRORC INTEGER;
begin
/* TRAIGA EL ID DEL ENCABEZADO DEL COMPROBANTE CONTABLE */
SELECT ENCO_CONSEC FROM COMPROBANTE_ENCABEZADO WHERE ENCO_TIPOREF = :TIPO AND ENCO_IDREF = :ID INTO :IDC;
SELECT MAX(CODE_ITEM) FROM COMPROBANTE_DETALLE WHERE ENCO_CONSEC = :idc INTO :NROI;
NROI = NROI + 1;
/* EJECUTE LA PARTE DE CONTABIL_FACTURA QUE CORRESPONDE A LOS COSTOS */
EXISTE = 'N';
SELECT 'S', INVE_COSTO, INVE_INVEN, INVE_CTAINVEN, INVE_CTACOSTOS, INVE_CENTRO
    FROM INTERFAZ_VENTAS
    WHERE INVE_ID = :IDINTER
    INTO :EXISTE, :COSTOS, :INVEN, :CTAINVEN, :CTACOSTOS, :cent;
if (EXISTE = 'S') then
  BEGIN
  if (tipo = 31) then
    begin
    SELECT FACT_ANULADO, PREF_PRE, FACT_NUMERO, FACT_VENCE, TERC_NIT FROM FACTURAS F
        WHERE FACT_ID = :ID INTO :ANULADO, :PREF, :NUMERO, :VENCEAUX, :NIT;
    NUMERO = PREF || NUM;
    CONC = 'COSTO EN VENTAS FACTURA ' || :NUMERO;
    EXECUTE PROCEDURE FECHA_A_CONTA(:VENCEAUX) returning_values (:VENCE);
    if (ANULADO = 'N') then
        BEGIN
        SELECT BODE_CENTRO, BODE_PROY FROM BODEGA B, FACTURAS F, PUNTO_VENTA P
            WHERE B.BODE_COD = P.BODE_COD AND P.PTVT_ID = F.PTVT_ID AND F.FACT_ID = :ID INTO :CENTRO, :PROY;
        /* SE ASUME QUE NO HAN CAMBIADO LAS CUENTAS DE COSTOS, POR ESO SE HACE UPDATE A LOS MOVIMIENTOS DE ESAS CUENTAS */
        EXECUTE PROCEDURE COSTO_EN_VENTAS(31, :ID);
        if (COSTOS = 'A') then
            BEGIN
            FOR SELECT MAX(CTACOS), SUM(CANT * COSTO)
                FROM COSTO_VENTAS WHERE TIDO_COD = 31 AND COVE_ID = :ID
                GROUP BY CTACOS
                INTO :CTACOSTOS, :MONTO
                DO
                BEGIN
                if (MONTO <> 0) then
                    BEGIN
                    CUENTA = NULL;
                    SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                        WHERE CUEN_COD = :CTACOSTOS INTO :CUENTA, :TIPOCUEN;
                    IF (CUENTA IS NULL) THEN
                        begin
                        EXCEPTION CUENTA_NO_EXISTE 'La cuenta ' || :ctacostos || ' no existe.';
                        end
                    if (TIPOCUEN = 'I') then
                        BEGIN
                        /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                        FOR SELECT ARTI_COD, CANT * COSTO
                            FROM COSTO_VENTAS WHERE TIDO_COD = 31 AND COVE_ID = :ID AND CTACOS = :CUENTA
                            INTO :ART, :MONTO
                            DO
                            BEGIN
                            SELECT COUNT(*) FROM COMPROBANTE_DETALLE WHERE CUEN_COD = :CUENTA AND ENCO_CONSEC = :IDC AND ARTI_COD = :ART INTO :NUMROWS;
                            if (NUMROWS = 0) then
                                BEGIN
                                INSERT INTO comprobante_detalle (ENCO_CONSEC, CODE_ITEM, CUEN_COD, CODE_CONCEPTO, CODE_REFER, CODE_DEBITO, CODE_CREDITO, CODE_BASE, CODE_PORC, TERC_NIT, PROY_COD, CENT_COD, CNDE_DOCNUMERO, CNDE_DOCAPLICA, DOCO_VENCE, ARTI_COD, CODE_TIPOAPL, CODE_TIPONUE)
                                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                                NROI = NROI + 1;
                                END
                            ELSE
                                UPDATE COMPROBANTE_DETALLE
                                    SET CODE_DEBITO = :MONTO
                                WHERE CUEN_COD = :CUENTA AND ENCO_CONSEC = :IDC AND ARTI_COD = :ART;
                            END
                        END
                    ELSE
                        BEGIN
                        SELECT COUNT(*) FROM COMPROBANTE_DETALLE WHERE CUEN_COD = :CUENTA AND ENCO_CONSEC = :IDC INTO :NUMROWS;
                        if (NUMROWS = 0) then
                            BEGIN
                            if (TIPOCUEN = 'C') then
                                INSERT INTO comprobante_detalle (ENCO_CONSEC, CODE_ITEM, CUEN_COD, CODE_CONCEPTO, CODE_REFER, CODE_DEBITO, CODE_CREDITO, CODE_BASE, CODE_PORC, TERC_NIT, PROY_COD, CENT_COD, CNDE_DOCNUMERO, CNDE_DOCAPLICA, DOCO_VENCE, ARTI_COD, CODE_TIPOAPL, CODE_TIPONUE)
                                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                            ELSE
                                INSERT INTO comprobante_detalle (ENCO_CONSEC, CODE_ITEM, CUEN_COD, CODE_CONCEPTO, CODE_REFER, CODE_DEBITO, CODE_CREDITO, CODE_BASE, CODE_PORC, TERC_NIT, PROY_COD, CENT_COD, CNDE_DOCNUMERO, CNDE_DOCAPLICA, DOCO_VENCE, ARTI_COD, CODE_TIPOAPL, CODE_TIPONUE)
                                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                            NROI = NROI + 1;
                            END
                        ELSE
                            UPDATE COMPROBANTE_DETALLE
                                SET CODE_DEBITO = :MONTO
                            WHERE CUEN_COD = :CUENTA AND ENCO_CONSEC = :IDC;
                        END
                    END /* MONTO <> 0 */
                END /* FOR */
            END /* COSTOS */
        if (COSTOS = 'K') then
            BEGIN
            SELECT SUM(CANT * COSTO)
                FROM COSTO_VENTAS WHERE TIDO_COD = 31 AND COVE_ID = :ID
                INTO :MONTO;
            if (MONTO <> 0) then
                BEGIN
                CUENTA = NULL;
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :CTACOSTOS INTO :CUENTA, :TIPOCUEN;
                IF (CUENTA IS NULL) THEN
                    begin
                    EXCEPTION CUENTA_NO_EXISTE 'La cuenta ' || :ctacostos || ' no existe.';
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, REGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT ARTI_COD, CANT * COSTO
                        FROM COSTO_VENTAS WHERE TIDO_COD = 31 AND COVE_ID = :ID
                        INTO :ART, :MONTO
                        DO
                        BEGIN
                        SELECT COUNT(*) FROM COMPROBANTE_DETALLE WHERE CUEN_COD = :CUENTA AND ENCO_CONSEC = :IDC AND ARTI_COD = :ART INTO :NUMROWS;
                        if (NUMROWS = 0) then
                            BEGIN
                            INSERT INTO comprobante_detalle (ENCO_CONSEC, CODE_ITEM, CUEN_COD, CODE_CONCEPTO, CODE_REFER, CODE_DEBITO, CODE_CREDITO, CODE_BASE, CODE_PORC, TERC_NIT, PROY_COD, CENT_COD, CNDE_DOCNUMERO, CNDE_DOCAPLICA, DOCO_VENCE, ARTI_COD, CODE_TIPOAPL, CODE_TIPONUE)
                                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                            NROI = NROI + 1;
                            END
                        ELSE
                            UPDATE COMPROBANTE_DETALLE
                                SET CODE_DEBITO = :MONTO
                            WHERE CUEN_COD = :CUENTA AND ENCO_CONSEC = :IDC AND ARTI_COD = :ART;
                        END
                    END
                ELSE
                    BEGIN
                    SELECT COUNT(*) FROM COMPROBANTE_DETALLE WHERE CUEN_COD = :CUENTA AND ENCO_CONSEC = :IDC INTO :NUMROWS;
                    if (NUMROWS = 0) then
                        BEGIN
                        if (TIPOCUEN = 'C') then
                            INSERT INTO comprobante_detalle (ENCO_CONSEC, CODE_ITEM, CUEN_COD, CODE_CONCEPTO, CODE_REFER, CODE_DEBITO, CODE_CREDITO, CODE_BASE, CODE_PORC, TERC_NIT, PROY_COD, CENT_COD, CNDE_DOCNUMERO, CNDE_DOCAPLICA, DOCO_VENCE, ARTI_COD, CODE_TIPOAPL, CODE_TIPONUE)
                                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                        ELSE
                            INSERT INTO comprobante_detalle (ENCO_CONSEC, CODE_ITEM, CUEN_COD, CODE_CONCEPTO, CODE_REFER, CODE_DEBITO, CODE_CREDITO, CODE_BASE, CODE_PORC, TERC_NIT, PROY_COD, CENT_COD, CNDE_DOCNUMERO, CNDE_DOCAPLICA, DOCO_VENCE, ARTI_COD, CODE_TIPOAPL, CODE_TIPONUE)
                                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NROI = NROI + 1;
                        END
                    ELSE
                        UPDATE COMPROBANTE_DETALLE
                            SET CODE_DEBITO = :MONTO
                        WHERE CUEN_COD = :CUENTA AND ENCO_CONSEC = :IDC;
                    END
                END /* MONTO <> 0 */
            END /* COSTOS = K */
        if (INVEN = 'A') then
            BEGIN
            FOR SELECT MAX(CTAINV), SUM(CANT * COSTO)
                FROM COSTO_VENTAS WHERE TIDO_COD = 31 AND COVE_ID = :ID
                GROUP BY CTAINV
                INTO :CTAINVEN, :MONTO
                DO
                BEGIN
                if (MONTO <> 0) then
                    BEGIN
                    CUENTA = NULL;
                    SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                        WHERE CUEN_COD = :CTAINVEN INTO :CUENTA, :TIPOCUEN;
                    IF (CUENTA IS NULL) THEN
                        begin
                        EXCEPTION CUENTA_NO_EXISTE 'La cuenta ' || :ctainven || ' no existe.';
                        end
                    if (TIPOCUEN = 'I') then
                        BEGIN
                        /* ES UNA CUENTA DE INVENTARIO, REGISTRE UNO A UNO LOS ARTICULOS */
                        FOR SELECT ARTI_COD, CANT * COSTO
                            FROM COSTO_VENTAS WHERE TIDO_COD = 31 AND COVE_ID = :ID AND CTAINV = :CUENTA
                            INTO :ART, :MONTO
                            DO
                            BEGIN
                            SELECT COUNT(*) FROM COMPROBANTE_DETALLE WHERE CUEN_COD = :CUENTA AND ENCO_CONSEC = :IDC AND ARTI_COD = :ART INTO :NUMROWS;
                            if (NUMROWS = 0) then
                                BEGIN
                                INSERT INTO comprobante_detalle (ENCO_CONSEC, CODE_ITEM, CUEN_COD, CODE_CONCEPTO, CODE_REFER, CODE_DEBITO, CODE_CREDITO, CODE_BASE, CODE_PORC, TERC_NIT, PROY_COD, CENT_COD, CNDE_DOCNUMERO, CNDE_DOCAPLICA, DOCO_VENCE, ARTI_COD, CODE_TIPOAPL, CODE_TIPONUE)
                                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                                NROI = NROI + 1;
                                END
                            ELSE    
                                UPDATE COMPROBANTE_DETALLE
                                    SET CODE_CREDITO = :MONTO
                                WHERE CUEN_COD = :CUENTA AND ENCO_CONSEC = :IDC AND ARTI_COD = :ART;
                            END
                        END
                    ELSE
                        BEGIN
                        SELECT COUNT(*) FROM COMPROBANTE_DETALLE WHERE CUEN_COD = :CUENTA AND ENCO_CONSEC = :IDC INTO :NUMROWS;
                        if (NUMROWS = 0) then
                            BEGIN
                            if (TIPOCUEN = 'C') then
                                INSERT INTO comprobante_detalle (ENCO_CONSEC, CODE_ITEM, CUEN_COD, CODE_CONCEPTO, CODE_REFER, CODE_DEBITO, CODE_CREDITO, CODE_BASE, CODE_PORC, TERC_NIT, PROY_COD, CENT_COD, CNDE_DOCNUMERO, CNDE_DOCAPLICA, DOCO_VENCE, ARTI_COD, CODE_TIPOAPL, CODE_TIPONUE)
                                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                            ELSE
                                INSERT INTO comprobante_detalle (ENCO_CONSEC, CODE_ITEM, CUEN_COD, CODE_CONCEPTO, CODE_REFER, CODE_DEBITO, CODE_CREDITO, CODE_BASE, CODE_PORC, TERC_NIT, PROY_COD, CENT_COD, CNDE_DOCNUMERO, CNDE_DOCAPLICA, DOCO_VENCE, ARTI_COD, CODE_TIPOAPL, CODE_TIPONUE)
                                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                            NROI = NROI + 1;
                            END
                        ELSE
                            UPDATE COMPROBANTE_DETALLE
                                SET CODE_CREDITO = :MONTO
                            WHERE CUEN_COD = :CUENTA AND ENCO_CONSEC = :IDC;
                        END
                    END /* MONTO <> 0 */
                END /* FOR */
            END /* INVEN = A */
        if (INVEN = 'K') then
            BEGIN
            SELECT SUM(CANT * COSTO)
                FROM COSTO_VENTAS WHERE TIDO_COD = 31 AND COVE_ID = :ID
                INTO :MONTO;
            if (MONTO <> 0) then
                BEGIN
                CUENTA = NULL;
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :CTAINVEN INTO :CUENTA, :TIPOCUEN;
                IF (CUENTA IS NULL) THEN
                    begin
                    EXCEPTION CUENTA_NO_EXISTE 'La cuenta ' || :ctainven || ' no existe.';
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT ARTI_COD, CANT * COSTO
                        FROM COSTO_VENTAS WHERE TIDO_COD = 31 AND COVE_ID = :ID
                        INTO :ART, :MONTO
                        DO
                        BEGIN
                        SELECT COUNT(*) FROM COMPROBANTE_DETALLE WHERE CUEN_COD = :CUENTA AND ENCO_CONSEC = :IDC AND ARTI_COD = :ART INTO :NUMROWS;
                        if (NUMROWS = 0) then
                            BEGIN
                            INSERT INTO comprobante_detalle (ENCO_CONSEC, CODE_ITEM, CUEN_COD, CODE_CONCEPTO, CODE_REFER, CODE_DEBITO, CODE_CREDITO, CODE_BASE, CODE_PORC, TERC_NIT, PROY_COD, CENT_COD, CNDE_DOCNUMERO, CNDE_DOCAPLICA, DOCO_VENCE, ARTI_COD, CODE_TIPOAPL, CODE_TIPONUE)
                                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                            NROI = NROI + 1;
                            END
                        ELSE
                            UPDATE COMPROBANTE_DETALLE
                                SET CODE_CREDITO = :MONTO
                            WHERE CUEN_COD = :CUENTA AND ENCO_CONSEC = :IDC AND ARTI_COD = :ART;
                        END
                    END
                ELSE
                    BEGIN
                    SELECT COUNT(*) FROM COMPROBANTE_DETALLE WHERE CUEN_COD = :CUENTA AND ENCO_CONSEC = :IDC INTO :NUMROWS;
                    if (NUMROWS = 0) then
                        BEGIN
                        if (TIPOCUEN = 'C') then
                            INSERT INTO comprobante_detalle (ENCO_CONSEC, CODE_ITEM, CUEN_COD, CODE_CONCEPTO, CODE_REFER, CODE_DEBITO, CODE_CREDITO, CODE_BASE, CODE_PORC, TERC_NIT, PROY_COD, CENT_COD, CNDE_DOCNUMERO, CNDE_DOCAPLICA, DOCO_VENCE, ARTI_COD, CODE_TIPOAPL, CODE_TIPONUE)
                                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                        ELSE
                            INSERT INTO comprobante_detalle (ENCO_CONSEC, CODE_ITEM, CUEN_COD, CODE_CONCEPTO, CODE_REFER, CODE_DEBITO, CODE_CREDITO, CODE_BASE, CODE_PORC, TERC_NIT, PROY_COD, CENT_COD, CNDE_DOCNUMERO, CNDE_DOCAPLICA, DOCO_VENCE, ARTI_COD, CODE_TIPOAPL, CODE_TIPONUE)
                                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NROI = NROI + 1;
                        END
                    ELSE
                        UPDATE COMPROBANTE_DETALLE
                            SET CODE_CREDITO = :MONTO
                        WHERE CUEN_COD = :CUENTA AND ENCO_CONSEC = :IDC;
                    END
                END /* MONTO <> 0 */
            END /* INVEN = K */
        END
    end
  if (TIPO = 33) then
    BEGIN
    SELECT DEVT_ANULADO, PREF_PRE, DEVT_NUMERO, DEVT_FECHA, TERC_NIT, DEVT_REMID, devt_pedid
        FROM DEVOLUCIONES_VENTAS
        WHERE DEVT_ID = :ID INTO :ANULADO, :PREF, :NUM, :VENCEAUX, :NIT, :IDREM, :IDPED;
    if (idrem is null) Then
        IDREM = 0;
    if (idped is null) Then
        IDPED = 0;
    if ((ANULADO = 'N') AND (IDREM = 0) AND (IDPED = 0)) then
        BEGIN
        NUMERO = PREF || NUM;
        CONC = 'COSTO EN VENTAS DEVOLUCION ' || :NUMERO;
        EXECUTE PROCEDURE FECHA_A_CONTA(:VENCEAUX) returning_values (:VENCE);
        IF (CENT = 'B') THEN
            SELECT B.BODE_CENTRO, B.BODE_PROY FROM BODEGA B, DEVOLUCIONES_VENTAS F
                WHERE B.BODE_COD = F.BODE_COD AND F.DEVT_ID = :ID INTO :CENTRO, :PROY;
        IF (CENT = 'V') THEN
            SELECT V.CENT_COD, V.PROY_COD FROM VENDEDORES V, DEVOLUCIONES_VENTAS F
                WHERE V.VEND_COD = F.VEND_COD AND F.DEVT_ID = :ID INTO :CENTRO, :PROY;
        IF (CENT = 'P') THEN
            SELECT P.PREF_CENTRO,P.PREF_PROY  FROM PREFIJOS P, DEVOLUCIONES_VENTAS F
                WHERE P.PREF_PRE = F.PREF_PRE AND F.DEVT_ID = :ID AND P.TIDO_COD = 33 INTO :CENTRO, :PROY;
        EXECUTE PROCEDURE COSTO_EN_VENTAS(33, :ID);
        if (COSTOS = 'A') then
            BEGIN
            FOR SELECT MAX(CTACOS), SUM(cast(CANT as double precision) * COSTO)
                FROM COSTO_VENTAS WHERE TIDO_COD = 33 AND COVE_ID = :ID
                GROUP BY CTACOS
                INTO :CTACOSTOS, :MONTO
                DO
                BEGIN
                if (MONTO <> 0) then
                    BEGIN
                    EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :ID, :CTACOSTOS, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                    if (TIPOCUEN = 'I') then
                        BEGIN
                        /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                        FOR SELECT ARTI_COD, cast(CANT as double precision) * COSTO
                            FROM COSTO_VENTAS WHERE TIDO_COD = 33 AND COVE_ID = :ID AND CTACOS = :CUENTA
                            INTO :ART, :MONTO
                            DO
                            BEGIN
                            SELECT COUNT(*) FROM COMPROBANTE_DETALLE WHERE CUEN_COD = :CUENTA AND ENCO_CONSEC = :IDC AND ARTI_COD = :ART INTO :NUMROWS;
                            if (NUMROWS = 0) then
                                BEGIN
                                INSERT INTO comprobante_detalle (ENCO_CONSEC, CODE_ITEM, CUEN_COD, CODE_CONCEPTO, CODE_REFER, CODE_DEBITO, CODE_CREDITO, CODE_BASE, CODE_PORC, TERC_NIT, PROY_COD, CENT_COD, CNDE_DOCNUMERO, CNDE_DOCAPLICA, DOCO_VENCE, ARTI_COD, CODE_TIPOAPL, CODE_TIPONUE)
                                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                                NROI = NROI + 1;
                                END
                            ELSE
                                UPDATE COMPROBANTE_DETALLE
                                    SET CODE_CREDITO = :MONTO
                                WHERE CUEN_COD = :CUENTA AND ENCO_CONSEC = :IDC AND ARTI_COD = :ART;
                            END
                        END
                    SELECT COUNT(*) FROM COMPROBANTE_DETALLE WHERE CUEN_COD = :CUENTA AND ENCO_CONSEC = :IDC INTO :NUMROWS;
                    if (NUMROWS = 0) then
                        BEGIN
                        if (TIPOCUEN = 'C') then
                            INSERT INTO comprobante_detalle (ENCO_CONSEC, CODE_ITEM, CUEN_COD, CODE_CONCEPTO, CODE_REFER, CODE_DEBITO, CODE_CREDITO, CODE_BASE, CODE_PORC, TERC_NIT, PROY_COD, CENT_COD, CNDE_DOCNUMERO, CNDE_DOCAPLICA, DOCO_VENCE, ARTI_COD, CODE_TIPOAPL, CODE_TIPONUE)
                                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :vence, NULL, 0, 33);
                        else
                            INSERT INTO comprobante_detalle (ENCO_CONSEC, CODE_ITEM, CUEN_COD, CODE_CONCEPTO, CODE_REFER, CODE_DEBITO, CODE_CREDITO, CODE_BASE, CODE_PORC, TERC_NIT, PROY_COD, CENT_COD, CNDE_DOCNUMERO, CNDE_DOCAPLICA, DOCO_VENCE, ARTI_COD, CODE_TIPOAPL, CODE_TIPONUE)
                                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NROI = NROI + 1;
                        END
                    ELSE
                        UPDATE COMPROBANTE_DETALLE
                            SET CODE_CREDITO = :MONTO
                            WHERE CUEN_COD = :CUENTA AND ENCO_CONSEC = :IDC;
                    END /* MONTO <> 0 */
                END /* FOR */
            END /* COSTOS */
        if (COSTOS = 'K') then
            BEGIN
            SELECT SUM(cast(CANT as double precision) * COSTO)
                FROM COSTO_VENTAS WHERE TIDO_COD = 33 AND COVE_ID = :ID
                INTO :MONTO;
            if (MONTO <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :ID, :CTACOSTOS, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, REGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT ARTI_COD, cast(CANT as double precision) * COSTO
                        FROM COSTO_VENTAS WHERE TIDO_COD = 33 AND COVE_ID = :ID
                        INTO :ART, :MONTO
                        DO
                        BEGIN
                        SELECT COUNT(*) FROM COMPROBANTE_DETALLE WHERE CUEN_COD = :CUENTA AND ENCO_CONSEC = :IDC AND ARTI_COD = :ART INTO :NUMROWS;
                        if (NUMROWS = 0) then
                            BEGIN
                            INSERT INTO comprobante_detalle (ENCO_CONSEC, CODE_ITEM, CUEN_COD, CODE_CONCEPTO, CODE_REFER, CODE_DEBITO, CODE_CREDITO, CODE_BASE, CODE_PORC, TERC_NIT, PROY_COD, CENT_COD, CNDE_DOCNUMERO, CNDE_DOCAPLICA, DOCO_VENCE, ARTI_COD, CODE_TIPOAPL, CODE_TIPONUE)
                                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                            NROI = NROI + 1;
                            END
                        ELSE
                            UPDATE COMPROBANTE_DETALLE
                                SET CODE_CREDITO = :MONTO
                                WHERE CUEN_COD = :CUENTA AND ENCO_CONSEC = :IDC AND ARTI_COD = :ART;
                        END
                    END
                SELECT COUNT(*) FROM COMPROBANTE_DETALLE WHERE CUEN_COD = :CUENTA AND ENCO_CONSEC = :IDC INTO :NUMROWS;
                if (NUMROWS = 0) then
                    BEGIN
                    if (TIPOCUEN = 'C') then
                        INSERT INTO comprobante_detalle (ENCO_CONSEC, CODE_ITEM, CUEN_COD, CODE_CONCEPTO, CODE_REFER, CODE_DEBITO, CODE_CREDITO, CODE_BASE, CODE_PORC, TERC_NIT, PROY_COD, CENT_COD, CNDE_DOCNUMERO, CNDE_DOCAPLICA, DOCO_VENCE, ARTI_COD, CODE_TIPOAPL, CODE_TIPONUE)
                            VALUES (:IDC, :NROI, :CTACOSTOS, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :vence, NULL, 0, 33);
                    else
                        INSERT INTO comprobante_detalle (ENCO_CONSEC, CODE_ITEM, CUEN_COD, CODE_CONCEPTO, CODE_REFER, CODE_DEBITO, CODE_CREDITO, CODE_BASE, CODE_PORC, TERC_NIT, PROY_COD, CENT_COD, CNDE_DOCNUMERO, CNDE_DOCAPLICA, DOCO_VENCE, ARTI_COD, CODE_TIPOAPL, CODE_TIPONUE)
                            VALUES (:IDC, :NROI, :CTACOSTOS, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, null, NULL, null, NULL, 0, 0);
                    NROI = NROI + 1;
                    END
                ELSE
                    UPDATE COMPROBANTE_DETALLE
                        SET CODE_CREDITO = :MONTO
                        WHERE CUEN_COD = :CUENTA AND ENCO_CONSEC = :IDC;
                END /* MONTO <> 0 */
            END /* COSTOS = K */
        if (INVEN = 'A') then
            BEGIN
            FOR SELECT MAX(CTAINV), SUM(cast(CANT as double precision) * COSTO)
                FROM COSTO_VENTAS WHERE TIDO_COD = 33 AND COVE_ID = :ID
                GROUP BY CTAINV
                INTO :CTAINVEN, :MONTO
                DO
                BEGIN
                if (MONTO <> 0) then
                    BEGIN
                    EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :ID, :CTAINVEN, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                    if (TIPOCUEN = 'I') then
                        BEGIN
                        /* ES UNA CUENTA DE INVENTARIO, REGISTRE UNO A UNO LOS ARTICULOS */
                        FOR SELECT ARTI_COD, cast(CANT as double precision) * COSTO
                            FROM COSTO_VENTAS WHERE TIDO_COD = 33 AND COVE_ID = :ID AND CTAINV = :CUENTA
                            INTO :ART, :MONTO
                            DO
                            BEGIN
                            SELECT COUNT(*) FROM COMPROBANTE_DETALLE WHERE CUEN_COD = :CUENTA AND ENCO_CONSEC = :IDC AND ARTI_COD = :ART INTO :NUMROWS;
                            if (NUMROWS = 0) then
                                BEGIN
                                INSERT INTO comprobante_detalle (ENCO_CONSEC, CODE_ITEM, CUEN_COD, CODE_CONCEPTO, CODE_REFER, CODE_DEBITO, CODE_CREDITO, CODE_BASE, CODE_PORC, TERC_NIT, PROY_COD, CENT_COD, CNDE_DOCNUMERO, CNDE_DOCAPLICA, DOCO_VENCE, ARTI_COD, CODE_TIPOAPL, CODE_TIPONUE)
                                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                                NROI = NROI + 1;
                                END
                            ELSE
                                UPDATE COMPROBANTE_DETALLE
                                    SET CODE_DEBITO = :MONTO
                                    WHERE CUEN_COD = :CUENTA AND ENCO_CONSEC = :IDC AND ARTI_COD = :ART;
                            END
                        END
                    SELECT COUNT(*) FROM COMPROBANTE_DETALLE WHERE CUEN_COD = :CUENTA AND ENCO_CONSEC = :IDC INTO :NUMROWS;
                    if (NUMROWS = 0) then
                        BEGIN
                        if (TIPOCUEN = 'C') then
                            INSERT INTO comprobante_detalle (ENCO_CONSEC, CODE_ITEM, CUEN_COD, CODE_CONCEPTO, CODE_REFER, CODE_DEBITO, CODE_CREDITO, CODE_BASE, CODE_PORC, TERC_NIT, PROY_COD, CENT_COD, CNDE_DOCNUMERO, CNDE_DOCAPLICA, DOCO_VENCE, ARTI_COD, CODE_TIPOAPL, CODE_TIPONUE)
                                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :vence, NULL, 0, 33);
                        else
                            INSERT INTO comprobante_detalle (ENCO_CONSEC, CODE_ITEM, CUEN_COD, CODE_CONCEPTO, CODE_REFER, CODE_DEBITO, CODE_CREDITO, CODE_BASE, CODE_PORC, TERC_NIT, PROY_COD, CENT_COD, CNDE_DOCNUMERO, CNDE_DOCAPLICA, DOCO_VENCE, ARTI_COD, CODE_TIPOAPL, CODE_TIPONUE)
                                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NROI = NROI + 1;
                        END
                    ELSE
                        UPDATE COMPROBANTE_DETALLE
                            SET CODE_DEBITO = :MONTO
                            WHERE CUEN_COD = :CUENTA AND ENCO_CONSEC = :IDC;
                    END /* MONTO <> 0 */
                END /* FOR */
            END /* INVEN = A */
        if (INVEN = 'K') then
            BEGIN
            SELECT SUM(cast(CANT as double precision) * COSTO)
                FROM COSTO_VENTAS WHERE TIDO_COD = 33 AND COVE_ID = :ID
                INTO :MONTO;
            if (MONTO <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :ID, :CTAINVEN, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT ARTI_COD, cast(CANT as double precision) * COSTO
                        FROM COSTO_VENTAS WHERE TIDO_COD = 33 AND COVE_ID = :ID
                        INTO :ART, :MONTO
                        DO
                        BEGIN
                        SELECT COUNT(*) FROM COMPROBANTE_DETALLE WHERE CUEN_COD = :CUENTA AND ENCO_CONSEC = :IDC AND ARTI_COD = :ART INTO :NUMROWS;
                        if (NUMROWS = 0) then
                            BEGIN
                            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                VALUES (:IDC, :NROI, :CTAINVEN, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                            NROI = NROI + 1;
                            END
                        ELSE
                            UPDATE COMPROBANTE_DETALLE
                                SET CODE_DEBITO = :MONTO
                                WHERE CUEN_COD = :CUENTA AND ENCO_CONSEC = :IDC AND ARTI_COD = :ART;
                        END
                    END
                SELECT COUNT(*) FROM COMPROBANTE_DETALLE WHERE CUEN_COD = :CUENTA AND ENCO_CONSEC = :IDC INTO :NUMROWS;
                if (NUMROWS = 0) then
                    BEGIN
                    if (TIPOCUEN = 'C') then
                        INSERT INTO comprobante_detalle (ENCO_CONSEC, CODE_ITEM, CUEN_COD, CODE_CONCEPTO, CODE_REFER, CODE_DEBITO, CODE_CREDITO, CODE_BASE, CODE_PORC, TERC_NIT, PROY_COD, CENT_COD, CNDE_DOCNUMERO, CNDE_DOCAPLICA, DOCO_VENCE, ARTI_COD, CODE_TIPOAPL, CODE_TIPONUE)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :vence, NULL, 0, 33);
                    else
                        INSERT INTO comprobante_detalle (ENCO_CONSEC, CODE_ITEM, CUEN_COD, CODE_CONCEPTO, CODE_REFER, CODE_DEBITO, CODE_CREDITO, CODE_BASE, CODE_PORC, TERC_NIT, PROY_COD, CENT_COD, CNDE_DOCNUMERO, CNDE_DOCAPLICA, DOCO_VENCE, ARTI_COD, CODE_TIPOAPL, CODE_TIPONUE)
                            VALUES (:IDC, :NROI, :CTAINVEN, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    END
                ELSE
                    UPDATE COMPROBANTE_DETALLE
                        SET CODE_DEBITO = :MONTO
                        WHERE CUEN_COD = :CUENTA AND ENCO_CONSEC = :IDC;
                END /* MONTO <> 0 */
            END  /* INVEN = K */
        END
    END
  END
end

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE CONTABIL_DEVOLCLI(
    IDDOC INTEGER,
    IDINTER INTEGER)
RETURNS (
    ERROR INTEGER,
    VER CHAR(1),
    IDC INTEGER)
AS
declare variable PREF VARCHAR(4);
declare variable NUM VARCHAR(6);
declare variable NUMERO VARCHAR(10);
declare variable FECAUX DATE;
declare variable FECHA CHAR(8);
declare variable CONC CHAR(120);
declare variable NUMFAC VARCHAR(10);
declare variable VRDTO NUMERIC(18, 2);
declare variable VRADIC NUMERIC(18, 2);
declare variable VRSUBT NUMERIC(18, 2);
declare variable VRIVA NUMERIC(18, 2);
declare variable PRTFTE NUMERIC(9, 2);
declare variable VRRTFTE NUMERIC(18, 2);
declare variable VRRTIVA NUMERIC(18, 2);
declare variable PRTICA NUMERIC(9, 2);
declare variable VRRTICA NUMERIC(18, 2);
declare variable VRTOTAL NUMERIC(18, 2);
declare variable VREXTRA NUMERIC(18, 2);
declare variable TIPOCOMP VARCHAR(3);
declare variable PREFCONT VARCHAR(4);
declare variable VENTAS CHAR(1);
declare variable CTAVENTAS VARCHAR(20);
declare variable IVA CHAR(1);
declare variable CTAIVA VARCHAR(20);
declare variable CONSUMO CHAR(1);
declare variable CTACONSUMO VARCHAR(20);
declare variable CARTERA CHAR(1);
declare variable CTACARTERA VARCHAR(20);
declare variable RTFTE CHAR(1);
declare variable CTARTFTE VARCHAR(20);
declare variable RTIVA CHAR(1);
declare variable CTARTIVA VARCHAR(20);
declare variable RTICA CHAR(1);
declare variable CTARTICA VARCHAR(20);
declare variable INVEN CHAR(1);
declare variable CTAINVEN VARCHAR(20);
declare variable COSTOS CHAR(1);
declare variable CTACOSTOS VARCHAR(20);
declare variable CTADTO VARCHAR(20);
declare variable CTAADIC VARCHAR(20);
declare variable CTAEXTRA VARCHAR(20);
declare variable EXISTE CHAR(1);
declare variable CUENTA VARCHAR(20);
declare variable MONTO NUMERIC(18,2);
declare variable TIPOCUEN CHAR(1);
declare variable NIT VARCHAR(20);
declare variable PROY VARCHAR(4);
declare variable CENTRO VARCHAR(4);
declare variable PROYI VARCHAR(4);
declare variable CENTI VARCHAR(4);
declare variable PORC NUMERIC(5,2);
declare variable DEBITO NUMERIC(18,2);
declare variable CREDITO NUMERIC(18,2);
declare variable NROI INTEGER;
declare variable ART VARCHAR(15);
declare variable IMPINC CHAR(1);
declare variable IMPTOS NUMERIC(18, 2);
declare variable SUMA NUMERIC(18,2);
declare variable PORCIVA NUMERIC(9,2);
declare variable TCTACLIEN VARCHAR(20);
declare variable TCTAVENTA VARCHAR(20);
declare variable TCTARTFTE VARCHAR(20);
declare variable TCTARTIVA VARCHAR(20);
declare variable TCTARTICA VARCHAR(20);
declare variable CTADIC VARCHAR(20);
declare variable BASEADIC VARCHAR(20);
declare variable PORCADIC NUMERIC(5,2);
declare variable VALORADIC NUMERIC(18,2);
declare variable DBADIC CHAR(1);
declare variable PTOVTA INTEGER;
declare variable ANULADO CHAR(1);
declare variable CENT CHAR(1);
DECLARE VARIABLE MERCANCIA NUMERIC(18,2);
declare variable FACTOR DOUBLE PRECISION;
declare variable DIG INTEGER;
DECLARE VARIABLE FOMENTO VARCHAR(2);
DECLARE VARIABLE VRCONSUMO NUMERIC(18,2);
declare variable AUTORET VARCHAR(10);
declare variable FAUTORET DATE;
declare variable IDREM INTEGER;
declare variable IDPED INTEGER;
declare variable DTOXIT CHAR(2);
declare variable ERRORC INTEGER;
BEGIN
EXECUTE PROCEDURE LEE_CONFIGURACION('COMPRAS', 'FACTURAS', 'USAR IMPOCONSUMO COMO PORCENTAJE DE FOMENTO') returning_values (FOMENTO);
EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'FECHA AUTORETENEDOR NO DESCONTAR RETENCIONES DEL SALDO PERO SI CONTABILIZARLAS') returning_values (AUTORET);
if (AUTORET <> '') then
    FAUTORET = CAST(AUTORET AS DATE);
else
    FAUTORET = '9999/12/31';
  /* BUSQUE LA INTERFACE */
  EXISTE = 'N';
  SELECT 'S', TICO_COD, PRCO_PRE, INVE_VENTAS, INVE_IVA, INVE_CONSUMO, INVE_CARTERA, INVE_RTFTE, INVE_RTIVA, INVE_RTICA, INVE_COSTO, INVE_INVEN, INVE_CTAVENTAS, INVE_CTAIVA, INVE_CTACONSUMO, INVE_CTADTO, INVE_CTAADIC, INVE_CTAEXTRA, INVE_CTACARTERA, INVE_CTARTFTE, INVE_CTARTIVA, INVE_CTARTICA, INVE_CTAINVEN, INVE_CTACOSTOS, INVE_CONFIRMAR, INVE_CENTRO
    FROM INTERFAZ_VENTAS
    WHERE INVE_ID = :IDINTER
    INTO :EXISTE, :TIPOCOMP, :PREFCONT, :VENTAS, :IVA, :CONSUMO, :CARTERA, :RTFTE, :RTIVA, :RTICA, :COSTOS, :INVEN, :CTAVENTAS, :CTAIVA, :CTACONSUMO, :CTADTO, :CTAADIC, :CTAEXTRA, :CTACARTERA, :CTARTFTE, :CTARTIVA, :CTARTICA, :CTAINVEN, :CTACOSTOS, :VER, :CENT;
  if (EXISTE = 'S') then
   BEGIN
    /* BORRE CUALQUEIR CONTABILIZACION PREVIA */
    DELETE FROM CONTABILIZACION WHERE CNTB_TIPOREF = 33 AND CNTB_IDREF = :IDDOC;
    /* TRAIGA EL ENCABEZADO DE LA DEVOLUCION */
   SELECT PREF_PRE, DEVT_NUMERO, DEVT_FECHA, F.TERC_NIT, DEVT_IVAINC, PTVT_ID, DEVT_FACTURA, DEVT_DTOMONTO, DEVT_ADICIONAL, DEVT_IVAMONTO, DEVT_EXTRA, DEVT_TOTAL, DEVT_RTFTEPORC, DEVT_RTFTEMONTO, DEVT_RTIVAPORC, DEVT_RTIVAMONTO, DEVT_RTICAPORC, DEVT_RTICAMONTO, TERC_CTARTFTE, TERC_CTARTIVA, TERC_CTARTICA, TERC_CTAVENTA, TERC_CTACLIENTE, DEVT_ANULADO, DEVT_REMID, DEVT_PEDID
        FROM DEVOLUCIONES_VENTAS F, TERCEROS T
        WHERE DEVT_ID = :IDDOC AND F.TERC_NIT = T.TERC_NIT
        INTO :PREF, :NUM, :FECAUX, :NIT, :IMPINC, :PTOVTA, :NUMFAC, :VRDTO, :VRADIC, :VRIVA, :VREXTRA, :VRTOTAL, :PRTFTE, :VRRTFTE, :PORC, :VRRTIVA, :PRTICA, :VRRTICA, :TCTARTFTE, TCTARTIVA, TCTARTICA, TCTAVENTA, TCTACLIEN, ANULADO, :IDREM, :IDPED;
   if (idrem is null) Then
    IDREM = 0;
   if (idped is null) Then
    IDPED = 0;
   if ((ANULADO = 'N') AND (IDREM = 0) AND (IDPED = 0)) then
    BEGIN
    NUMERO = PREF || NUM;
    SELECT SUM(DVDE_CONSUMO) FROM devoluciones_ventas_detalle WHERE DEVT_ID = :iddoc AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL)) INTO :MERCANCIA;
    VRSUBT = VRTOTAL - VREXTRA - VRIVA - MERCANCIA; /* BASE DE RETEFTE Y RETEICA */
    EXECUTE PROCEDURE lee_configuracion ('FACTURACION', 'DEVOLUCIONES', 'DESCUENTO PIE DEVOLUCION IGUAL A SUMA DE DESCUENTOS POR ITEM') returning_values (:DTOXIT);
    if (DTOXIT = 'SI') then
        VRDTO = 0;
    MERCANCIA = VRSUBT - VRADIC + VRDTO;
    IF (CENT = 'B') THEN
        SELECT B.BODE_CENTRO, B.BODE_PROY FROM BODEGA B, DEVOLUCIONES_VENTAS F
            WHERE B.BODE_COD = F.BODE_COD AND F.DEVT_ID = :IDDOC INTO :CENTRO, :PROY;
    IF (CENT = 'V') THEN
        SELECT V.CENT_COD, V.PROY_COD FROM VENDEDORES V, DEVOLUCIONES_VENTAS F
            WHERE V.VEND_COD = F.VEND_COD AND F.DEVT_ID = :IDDOC INTO :CENTRO, :PROY;
    IF (CENT = 'P') THEN
        SELECT P.PREF_CENTRO,P.PREF_PROY  FROM PREFIJOS P, DEVOLUCIONES_VENTAS F
            WHERE P.PREF_PRE = F.PREF_PRE AND F.DEVT_ID = :IDDOC AND P.TIDO_COD = 33 INTO :CENTRO, :PROY;
    EXECUTE PROCEDURE FECHA_A_CONTA(:FECAUX) returning_values (:FECHA);
    /* REGISTRE EL ENCABEZADO CONTABLE */
    IDC = GEN_ID(ID_CONTABILIZA, 1);
    CONC = 'DEVOLUCION VENTAS No. ' || NUMERO || ' EN FACTURA ' || NUMFAC;
    CONC = SUBSTR(CONC, 1, 60);
    INSERT INTO CONTABILIZACION (CNTB_ID, CNTB_TIPOCOMP, CNTB_PREFCNT, CNTB_NUMERO, CNTB_FECHA, CNTB_CONCEPTO, CNTB_REF, CNTB_TIPOREF, CNTB_IDREF, CNTB_PREFREF, CNTB_NUMREF, CNTB_PROCESADO)
        VALUES (:IDC, :TIPOCOMP, :PREFCONT, :NUM, :FECHA, :CONC, '', 33, :IDDOC, :PREF, :NUM, 'N');
    NROI = 0;
    SUMA = 0;
    ERROR = 0;
    /* SI NO HAY CUENTA DE DESCUENTO NI ADICIONAL CALCULE UN FACTOR PARA LAS VENTAS Y EL IVA */
    if (MERCANCIA <> 0) then
        FACTOR = CAST(VRSUBT AS DOUBLE PRECISION) / CAST(MERCANCIA AS DOUBLE PRECISION);
    ELSE
        FACTOR = 1;
    /* TRAIGA EL NUMERO DE DIGITOS PARA EL REDONDEO */
    SELECT CAST(CONF_VALOR AS INTEGER) FROM CONFIGURACION WHERE CONF_MODULO = 'FACTURACION' AND
        CONF_CATEGORIA = 'GENERAL' AND CONF_PROPIEDAD = 'REDONDEO AL MULTIPLO DE DIEZ EN TOTALES' INTO :DIG;
    /* CUENTAS DE VENTAS */
    if (VENTAS = 'A') then
        BEGIN
        FOR SELECT MAX(COAR_CTADEV), SUM(DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO), SUM(DVDE_IVAMONTO), SUM(DVDE_CONSUMO), MAX(B.bode_proy), MAX(B.bode_centro)
            FROM ARTICULO A, CONTABIL_ARTICULO C, DEVOLUCIONES_VENTAS_DETALLE F, BODEGA B
            WHERE F.DEVT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND B.bode_cod = F.bode_cod AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
            GROUP BY COAR_CTADEV
            INTO :CTAVENTAS, :MONTO, :IMPTOS, :VRCONSUMO, :proyi, :centi
            DO
            BEGIN
            if (FOMENTO = 'SI') then
                MONTO = MONTO + VRCONSUMO;
            if ((CTADTO IS NULL) OR (CTADTO = '')) then
                MONTO = MONTO * FACTOR;
            execute procedure redondee(MONTO, DIG) returning_values (MONTO);
            if (MONTO <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTAVENTAS, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT F.ARTI_COD, (DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO), (DVDE_IVAMONTO+DVDE_CONSUMO)
                        FROM ARTICULO A, CONTABIL_ARTICULO C, DEVOLUCIONES_VENTAS_DETALLE F
                        WHERE F.DEVT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTAINV = :CUENTA AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
                        INTO :ART, :MONTO, :IMPTOS
                    DO
                        BEGIN
                        if (IMPINC = 'S') then
                            MONTO = MONTO - IMPTOS;
                        if ((CTADTO IS NULL) OR (CTADTO = '')) then
                            MONTO = MONTO * FACTOR;
                        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        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, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                    NROI = NROI + 1;
                    SUMA = SUMA + MONTO;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    IF (CENT = 'B') THEN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROYI, :CENTI, NULL, NULL, NULL, NULL, 0, 0);
                    ELSE
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA + MONTO;
                    END
                END /* MONTO <> 0 */
            END /* FOR */
        END /* VENTAS X ARTICULO */
     IF ((VENTAS = 'C') OR (VENTAS = 'K')) THEN
        BEGIN
        IF (VENTAS = 'C') THEN
            CTAVENTAS = TCTAVENTA;
        SELECT SUM(DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO), SUM(DVDE_IVAMONTO), SUM(DVDE_CONSUMO)
            FROM DEVOLUCIONES_VENTAS_DETALLE F
            WHERE F.DEVT_ID = :IDDOC  AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
            INTO :MONTO, :IMPTOS, :VRCONSUMO;
        if (FOMENTO = 'SI') then
            MONTO = MONTO + VRCONSUMO;
        if ((CTADTO IS NULL) OR (CTADTO = '')) then
            MONTO = MONTO * FACTOR;
        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
        if (MONTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTAVENTAS, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT F.ARTI_COD, (DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO), (DVDE_IVAMONTO+DVDE_CONSUMO)
                    FROM ARTICULO A, DEVOLUCIONES_VENTAS_DETALLE F
                    WHERE F.DEVT_ID = :IDDOC AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
                    INTO :ART, :MONTO, :IMPTOS
                    DO
                    BEGIN
                    if (IMPINC = 'S') then
                        MONTO = MONTO - IMPTOS;
                    if ((CTADTO IS NULL) OR (CTADTO = '')) then
                        MONTO = MONTO * FACTOR;
                    execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                    NROI = NROI + 1;
                    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, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                NROI = NROI + 1;
                SUMA = SUMA + MONTO;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA + MONTO;
                END
            END /* MONTO <> 0 */
        END /* VENTAS DE CLIENTE O CONSTANTE */
    /* EL IVA EN VENTAS */
    if (IVA = 'A') then
        BEGIN
        FOR SELECT MAX(COAR_CTAIVAV), SUM(DVDE_IVAMONTO), SUM(DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO), SUM(DVDE_CONSUMO)
            FROM ARTICULO A, CONTABIL_ARTICULO C, DEVOLUCIONES_VENTAS_DETALLE F
            WHERE F.DEVT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
            GROUP BY COAR_CTAIVAV
            INTO :CTAIVA, :IMPTOS, :MONTO, :VALORADIC
        DO
            BEGIN
            if (FOMENTO = 'SI') then
                MONTO = MONTO + VALORADIC;
            MONTO = MONTO * -1;
            MONTO = MONTO * FACTOR;
            IMPTOS = IMPTOS * FACTOR;
            execute procedure redondee(MONTO, DIG) returning_values (MONTO);
            execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
            if (IMPTOS <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTAIVA, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT F.ARTI_COD, DVDE_IVAMONTO, (DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO), TAIV_PORC, DVDE_CONSUMO
                        FROM ARTICULO A, CONTABIL_ARTICULO C, DEVOLUCIONES_VENTAS_DETALLE F, TARIFA_IVA T
                        WHERE F.DEVT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND A.TAIV_COD = T.TAIV_COD AND COAR_CTAIVAV = :CUENTA AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
                        INTO :ART, :IMPTOS, :MONTO, :PORCIVA, :VALORADIC
                    DO
                        BEGIN
                        if (IMPINC = 'S') then
                            MONTO = MONTO - IMPTOS - VALORADIC;
                        MONTO = MONTO * -1;
                        MONTO = MONTO * FACTOR;
                        IMPTOS = IMPTOS * FACTOR;
                        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                        execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                        if (IMPTOS <> 0) then
                            BEGIN
                            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :IMPTOS, 0, :MONTO, :PORCIVA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                            NROI = NROI + 1;
                            SUMA = SUMA + IMPTOS;
                            END
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                    NROI = NROI + 1;
                    SUMA = SUMA + IMPTOS;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA + IMPTOS;
                    END
                END   /* IMPTOS <> 0 */
            END /* FOR */
        END /* IVA X ARTICULO */
    if (IVA = 'K') then /* IVA EN CTA CONSTANTE */
        BEGIN
        SELECT SUM(DVDE_IVAMONTO), SUM(DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO), SUM(DVDE_CONSUMO)
            FROM DEVOLUCIONES_VENTAS_DETALLE F
            WHERE F.DEVT_ID = :IDDOC  AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
            INTO :IMPTOS, :MONTO, :VALORADIC;
        if (FOMENTO = 'SI') then
            MONTO = MONTO + VALORADIC;
        MONTO = MONTO * -1;
        MONTO = MONTO * FACTOR;
        IMPTOS = IMPTOS * FACTOR;
        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
        execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
        if (IMPTOS <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTAIVA, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT F.ARTI_COD, (DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO), DVDE_IVAMONTO, TAIV_PORC, DVDE_CONSUMO
                    FROM ARTICULO A, DEVOLUCIONES_VENTAS_DETALLE F, TARIFA_IVA T
                    WHERE F.DEVT_ID = :IDDOC AND A.TAIV_COD = T.TAIV_COD AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
                    INTO :ART, :MONTO, :IMPTOS, :PORCIVA, :VALORADIC
                    DO
                    BEGIN
                    if (IMPINC = 'S') then
                        MONTO = MONTO - IMPTOS - VALORADIC;
                    MONTO = MONTO * -1;
                    MONTO = MONTO * FACTOR;
                    IMPTOS = IMPTOS * FACTOR;
                    execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                    execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                    if (IMPTOS <> 0) then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', :IMPTOS, 0, :MONTO, :PORCIVA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        SUMA = SUMA + IMPTOS;
                        END
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                NROI = NROI + 1;
                SUMA = SUMA + IMPTOS;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA + IMPTOS;
                END
            END /* IMPTOS <> 0 */
        END /* IVA EN CTA CONSTANTE */
    /* EL IMPOCONSUMO */
    if ((CONSUMO = 'A') AND (FOMENTO <> 'SI')) then
        BEGIN
        FOR SELECT MAX(COAR_CTACONS), SUM(DVDE_CONSUMO)
            FROM ARTICULO A, CONTABIL_ARTICULO C, DEVOLUCIONES_VENTAS_DETALLE F
            WHERE F.DEVT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
            GROUP BY COAR_CTACONS
            INTO :CTACONSUMO, :IMPTOS
        DO
            BEGIN
            if (IMPTOS <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTACONSUMO, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, REGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT F.ARTI_COD, DVDE_CONSUMO
                        FROM ARTICULO A, CONTABIL_ARTICULO C, DEVOLUCIONES_VENTAS_DETALLE F
                        WHERE F.DEVT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTACONS = :CUENTA AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
                        INTO :ART, :IMPTOS
                    DO
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 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, :NROI, :CUENTA, :CONC, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                    NROI = NROI + 1;
                    SUMA = SUMA + IMPTOS;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA + IMPTOS;
                    END
                END /* IMPTOS <> 0 */
            END /* FOR */
        END /* CONSUMO X ARTICULO */
    if ((CONSUMO = 'K') AND (FOMENTO <> 'SI')) then
        BEGIN
        SELECT SUM(DVDE_CONSUMO)
            FROM DEVOLUCIONES_VENTAS_DETALLE F
            WHERE F.DEVT_ID = :IDDOC AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
            INTO :IMPTOS;
        if (IMPTOS <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTACONSUMO, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT F.ARTI_COD, DVDE_CONSUMO
                    FROM ARTICULO A, DEVOLUCIONES_VENTAS_DETALLE F
                    WHERE F.DEVT_ID = :IDDOC  AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
                    INTO :ART, :IMPTOS
                    DO
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTACONSUMO, :CONC, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                    NROI = NROI + 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, :NROI, :CTACONSUMO, :CONC, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA + IMPTOS;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTACONSUMO, :CONC, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA + IMPTOS;
                END
            END /* IMPTOS <> 0 */
        END /* CONSUMO EN CTA CONSTANTE */
    /* DESCUENTO */
    if ((CTADTO IS NOT NULL) AND
        (CTADTO <> '') AND
        (VRDTO <> 0)) THEN
        BEGIN
        EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTADTO, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRDTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
            NROI = NROI + 1;
            SUMA = SUMA - VRDTO;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRDTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 33);
            NROI = NROI + 1;
            SUMA = SUMA - VRDTO;
            END
        END /* DESCUENTO */
    /* VALOR ADIC */
    if ((CTAADIC IS NOT NULL) AND
        (CTAADIC <> '') AND
        (VRADIC <> 0)) THEN
        BEGIN
        EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTAADIC, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRADIC, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
            NROI = NROI + 1;
            SUMA = SUMA + VRADIC;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRADIC, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 33);
            NROI = NROI + 1;
            SUMA = SUMA + VRADIC;
            END
        END /* VR. ADIC */
    /* VALOR EXTRA */
    if ((CTAEXTRA IS NOT NULL) AND
        (CTAEXTRA <> '') AND
        (VREXTRA <> 0)) THEN
        BEGIN
        EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTAEXTRA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VREXTRA, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
            NROI = NROI + 1;
            SUMA = SUMA + VREXTRA;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VREXTRA, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 33);
            NROI = NROI + 1;
            SUMA = SUMA + VREXTRA;
            END
        END /* VR. EXTRA */
    /* RETENCION FUENTE */
    if ((RTFTE = 'C') or (RTFTE = 'K')) then
      if (VRRTFTE <> 0) then
        BEGIN
        if (RTFTE = 'C') then
            CTARTFTE = TCTARTFTE;
        EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTARTFTE, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, (:VRSUBT*-1), :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
            NROI = NROI + 1;
            SUMA = SUMA - VRRTFTE;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, (:VRSUBT*-1), :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA - VRRTFTE;
            END
        /* AUTORETENCION */
        if (FAUTORET <= fecaux) then
            BEGIN
            EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'CUENTA DE AUTORETENCION EN LA FUENTE') returning_values (CTARTFTE);
            EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTARTFTE, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :VRSUBT, :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                NROI = NROI + 1;
                SUMA = SUMA + VRRTFTE;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :VRSUBT, :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA + VRRTFTE;
                END
            END
        END /* RTFTE */
    if (RTFTE = 'A') then
      BEGIN
      FOR SELECT MAX(COAR_CTARTFTEV), MAX(COAR_RTFTE), MIN(COAR_RTBASE), SUM(DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO), SUM((DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO)*COAR_RTFTE)
        FROM CONTABIL_ARTICULO C, devoluciones_ventas_detalle F
        WHERE F.devt_id = :IDDOC AND F.ARTI_COD = C.ARTI_COD AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
        GROUP BY COAR_CTARTFTEV
        INTO :CTARTFTE, :PRTFTE, :baseadic, :MONTO, :VRRTFTE
        DO
        BEGIN
        MONTO = MONTO * FACTOR;
        if (MONTO >= BASEADIC) then
            BEGIN
            VRRTFTE = VRRTFTE * FACTOR / 100;
            execute procedure redondee(VRRTFTE, DIG) returning_values (VRRTFTE);
            execute procedure redondee(MONTO, DIG) returning_values (MONTO);
            if (VRRTFTE <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTARTFTE, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, (:MONTO*-1), :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                    NROI = NROI + 1;
                    SUMA = SUMA - VRRTFTE;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, (:MONTO*-1), :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA - VRRTFTE;
                    END
                /* AUTORETENCION */
                if (FAUTORET <= fecaux) then
                    BEGIN
                    EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'CUENTA DE AUTORETENCION EN LA FUENTE') returning_values (CTARTFTE);
                    EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTARTFTE, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
                    if (ERRORC <> 0) then
                        ERROR = ERROR + 1;
                    if (TIPOCUEN = 'C') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :MONTO, :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                        NROI = NROI + 1;
                        SUMA = SUMA + VRRTFTE;
                        END
                    if (TIPOCUEN = 'N') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :MONTO, :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NROI = NROI + 1;
                        SUMA = SUMA + VRRTFTE;
                        END
                    END
                END
            END
        END /* RTFTE */
      END
    /* RETENCION IVA */
    if ((RTIVA = 'C') or (RTIVA = 'K')) then
      if (VRRTIVA <> 0) then
        BEGIN
        if (RTIVA = 'C') then
            CTARTIVA = TCTARTIVA;
        EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTARTIVA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTIVA, (:VRIVA*-1), :PORC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
            NROI = NROI + 1;
            SUMA = SUMA - VRRTIVA;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTIVA, (:VRIVA*-1), :PORC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA - VRRTIVA;
            END
        END /* RTIVA */
    /* RETENCION DE ICA */
    if ((RTICA = 'C') or (RTICA = 'K')) then
      if (VRRTICA <> 0) then
        BEGIN
        if (RTICA = 'C') then
            CTARTICA = TCTARTICA;
        EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTARTICA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTICA, (:VRSUBT*-1), :PRTICA, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
            NROI = NROI + 1;
            SUMA = SUMA - VRRTICA;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTICA, (:VRSUBT*-1), :PRTICA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA - VRRTICA;
            END
        END /* RTICA */
    /* CIERRE EL COMPROBANTE CONTRA LA CUENTA DEL TERCERO O LA CONSTANTE */
    if ((SUMA <> 0) and ((CARTERA = 'C') or (CARTERA = 'K') or (CARTERA = 'J'))) then
        BEGIN
        if (SUMA < 0) then
            BEGIN
            DEBITO = SUMA * -1;
            CREDITO = 0;
            END
        ELSE
            BEGIN
            DEBITO = 0;
            CREDITO = SUMA;
            END
        if (CARTERA = 'C') then
            CTACARTERA = TCTACLIEN;
        if (CARTERA = 'J') then
            BEGIN
            /* BUSQUE LA CUENTA DE LA CAJA */
            SELECT CAJA_CUENTA FROM CAJAS C, PUNTO_VENTA P
                WHERE P.CAJA_ID = C.CAJA_ID AND PTVT_ID = :PTOVTA
                INTO :CTACARTERA;
            END
        EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTACARTERA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :DEBITO, :CREDITO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
        if (TIPOCUEN = 'N') then
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :DEBITO, :CREDITO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
        NROI = NROI + 1;
        END /* SUMA EN CARTERA */
    /* CALCULE COSTOS EN VENTAS */
    EXECUTE PROCEDURE COSTO_EN_VENTAS(33, :IDDOC);
    if (COSTOS = 'A') then
        BEGIN
        FOR SELECT MAX(CTACOS), SUM(cast(CANT as double precision) * COSTO)
            FROM COSTO_VENTAS WHERE TIDO_COD = 33 AND COVE_ID = :IDDOC
            GROUP BY CTACOS
            INTO :CTACOSTOS, :MONTO
        DO
            BEGIN
            if (MONTO <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTACOSTOS, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT ARTI_COD, cast(CANT as double precision) * COSTO
                        FROM COSTO_VENTAS WHERE TIDO_COD = 33 AND COVE_ID = :IDDOC AND CTACOS = :CUENTA
                        INTO :ART, :MONTO
                    DO
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                    NROI = NROI + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    END
                END /* MONTO <> 0 */
            END /* FOR */
        END /* COSTOS */
    if (COSTOS = 'K') then
        BEGIN
        SELECT SUM(cast(CANT as double precision) * COSTO)
            FROM COSTO_VENTAS WHERE TIDO_COD = 33 AND COVE_ID = :IDDOC
            INTO :MONTO;
        if (MONTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTACOSTOS, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, REGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT ARTI_COD, cast(CANT as double precision) * COSTO
                    FROM COSTO_VENTAS WHERE TIDO_COD = 33 AND COVE_ID = :IDDOC
                    INTO :ART, :MONTO
                DO
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTACOSTOS, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                    NROI = NROI + 1;
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTACOSTOS, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                NROI = NROI + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTACOSTOS, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                END
            END /* MONTO <> 0 */
        END /* COSTOS = K */
    if (INVEN = 'A') then
        BEGIN
        FOR SELECT MAX(CTAINV), SUM(cast(CANT as double precision) * COSTO)
            FROM COSTO_VENTAS WHERE TIDO_COD = 33 AND COVE_ID = :IDDOC
            GROUP BY CTAINV
            INTO :CTAINVEN, :MONTO
        DO
            BEGIN
            if (MONTO <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTAINVEN, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, REGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT ARTI_COD, cast(CANT as double precision) * COSTO
                        FROM COSTO_VENTAS WHERE TIDO_COD = 33 AND COVE_ID = :IDDOC AND CTAINV = :CUENTA
                        INTO :ART, :MONTO
                    DO
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                    NROI = NROI + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    END
                END /* MONTO <> 0 */
            END /* FOR */
        END /* INVEN = A */
    if (INVEN = 'K') then
        BEGIN
        SELECT SUM(cast(CANT as double precision) * COSTO)
            FROM COSTO_VENTAS WHERE TIDO_COD = 33 AND COVE_ID = :IDDOC
            INTO :MONTO;
        if (MONTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTAINVEN, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT ARTI_COD, cast(CANT as double precision) * COSTO
                    FROM COSTO_VENTAS WHERE TIDO_COD = 33 AND COVE_ID = :IDDOC
                    INTO :ART, :MONTO
                DO
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTAINVEN, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                    NROI = NROI + 1;
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAINVEN, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                NROI = NROI + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAINVEN, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                END
            END /* MONTO <> 0 */
        END /* INVEN = K */
    /* recorra las cuentas adicionales */
    FOR SELECT INVC_CUENTA, INVC_BASE, INVC_PORC, INVC_VALOR, INVC_DB
        FROM INTERFAZ_VENTAS_CTAS WHERE INVE_ID = :IDINTER
        INTO :CTADIC, :BASEADIC, :PORCADIC, :VALORADIC, :DBADIC
        DO
        BEGIN
        if (valoradic <> 0) then
            monto = valoradic;
        else
            BEGIN
            if (:BASEADIC = 'SUBTOTAL') then
                VALORADIC = vrsubt;
            if (:BASEADIC = 'DESCUENTO') then
                VALORADIC = VRDTO;
            if (:BASEADIC = 'IVA') then
                VALORADIC = VRIVA;
            if (:BASEADIC = 'ADICIONAL') then
                VALORADIC = VRADIC;
            if (:BASEADIC = 'EXTRA') then
                VALORADIC = VREXTRA;
            if (:BASEADIC = 'TOTAL') then
                VALORADIC = VRTOTAL;
            MONTO = VALORADIC * PORCADIC;
            END
        if (MONTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTADIC, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                if (DBADIC = 'S') then
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                ELSE
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                NROI = NROI + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                if (DBADIC = 'S') then
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                ELSE
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                END
            NROI = NROI + 1;
            END
        END
    if (error > 0) then
        ver = 'S';
    SUSPEND;
    END
   END /* EXISTE LA INTERFAZ */
  ELSE
    BEGIN
    EXECUTE PROCEDURE ERROR (33, :IDDOC, :PREF, 1);
    ERROR = ERROR + 1;
    VER = 'S';
    SUSPEND;
    END
END

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE CONTABIL_FACTURA(
    IDDOC INTEGER,
    IDINTER INTEGER)
RETURNS (
    ERROR INTEGER,
    VER CHAR(1),
    IDC INTEGER)
AS
declare variable pref varchar(4);
declare variable num varchar(6);
declare variable numero varchar(10);
declare variable fecaux date;
declare variable fecha char(8);
declare variable conc varchar(60);
declare variable venceaux date;
declare variable vence char(8);
declare variable vrdto numeric(18,2);
declare variable vradic numeric(18,2);
declare variable vrsubt numeric(18,2);
declare variable vriva numeric(18,2);
declare variable prtfte numeric(9,2);
declare variable vrrtfte numeric(18,2);
declare variable vrrtiva numeric(18,2);
declare variable prtica numeric(9,2);
declare variable vrrtica numeric(18,2);
declare variable vrtotal numeric(18,2);
declare variable vrextra numeric(18,2);
declare variable tipocomp varchar(3);
declare variable prefcont varchar(4);
declare variable ventas char(1);
declare variable ctaventas varchar(20);
declare variable iva char(1);
declare variable ctaiva varchar(20);
declare variable consumo char(1);
declare variable ctaconsumo varchar(20);
declare variable cartera char(1);
declare variable ctacartera varchar(20);
declare variable rtfte char(1);
declare variable ctartfte varchar(20);
declare variable rtiva char(1);
declare variable ctartiva varchar(20);
declare variable rtica char(1);
declare variable ctartica varchar(20);
declare variable inven char(1);
declare variable ctainven varchar(20);
declare variable costos char(1);
declare variable ctacostos varchar(20);
declare variable ctadto varchar(20);
declare variable ctaadic varchar(20);
declare variable ctaextra varchar(20);
declare variable existe char(1);
declare variable cuenta varchar(20);
declare variable monto numeric(18,2);
declare variable tipocuen char(1);
declare variable nit varchar(20);
declare variable nombre varchar(60);
declare variable proy varchar(4);
declare variable centro varchar(4);
declare variable proyi varchar(4);
declare variable centi varchar(4);
declare variable porc numeric(5,2);
declare variable debito numeric(18,2);
declare variable credito numeric(18,2);
declare variable nroi integer;
declare variable art varchar(15);
declare variable imptos numeric(18,2);
declare variable suma numeric(18,2);
declare variable porciva numeric(9,2);
declare variable tctaclien varchar(20);
declare variable tctaventa varchar(20);
declare variable tctartfte varchar(20);
declare variable tctartiva varchar(20);
declare variable tctartica varchar(20);
declare variable ctadic varchar(20);
declare variable baseadic varchar(20);
declare variable porcadic numeric(5,2);
declare variable valoradic numeric(18,2);
declare variable dbadic char(1);
declare variable ptovta integer;
declare variable anulado char(1);
declare variable dig integer;
declare variable mercancia numeric(18,2);
declare variable fomento varchar(2);
declare variable DTOXIT varchar(2);
declare variable vrconsumo numeric(18,2);
declare variable factor double precision;
declare variable cent char(1);
declare variable AUTORET VARCHAR(10);
declare variable FAUTORET DATE;
declare variable ERRORC INTEGER;
declare variable ICOING CHAR(2);
BEGIN
EXECUTE PROCEDURE LEE_CONFIGURACION('COMPRAS', 'FACTURAS', 'USAR IMPOCONSUMO COMO PORCENTAJE DE FOMENTO') returning_values (FOMENTO);
EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION', 'ARTICULOS', 'IMPOCONSUMO COMO MAYOR VALOR DEL COSTO Y DEL INGRESO') returning_values (ICOING);
EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'FECHA AUTORETENEDOR NO DESCONTAR RETENCIONES DEL SALDO PERO SI CONTABILIZARLAS') returning_values (AUTORET);
if (AUTORET <> '') then
    FAUTORET = CAST(AUTORET AS DATE);
else
    FAUTORET = '9999/12/31';
/* BUSQUE LA INTERFACE */
EXISTE = 'N';
SELECT 'S', TICO_COD, PRCO_PRE, INVE_VENTAS, INVE_IVA, INVE_CONSUMO, INVE_CARTERA, INVE_RTFTE, INVE_RTIVA, INVE_RTICA, INVE_COSTO, INVE_INVEN, INVE_CTAVENTAS, INVE_CTAIVA, INVE_CTACONSUMO, INVE_CTADTO, INVE_CTAADIC, INVE_CTAEXTRA, INVE_CTACARTERA, INVE_CTARTFTE, INVE_CTARTIVA, INVE_CTARTICA, INVE_CTAINVEN, INVE_CTACOSTOS, INVE_CONFIRMAR, INVE_CENTRO
    FROM INTERFAZ_VENTAS
    WHERE INVE_ID = :IDINTER
    INTO :EXISTE, :TIPOCOMP, :PREFCONT, :VENTAS, :IVA, :CONSUMO, :CARTERA, :RTFTE, :RTIVA, :RTICA, :COSTOS, :INVEN, :CTAVENTAS, :CTAIVA, :CTACONSUMO, :CTADTO, :CTAADIC, :CTAEXTRA, :CTACARTERA, :CTARTFTE, :CTARTIVA, :CTARTICA, :CTAINVEN, :CTACOSTOS, :VER, :CENT;
if (EXISTE = 'S') then
  BEGIN
    /* BORRE CUALQUEIR CONTABILIZACION PREVIA */
    DELETE FROM CONTABILIZACION WHERE CNTB_TIPOREF = 31 AND CNTB_IDREF = :IDDOC;

  /* TRAIGA EL ENCABEZADO DE LA FACTURA */
  SELECT PREF_PRE, FACT_NUMERO, FACT_FECHA, F.TERC_NIT, PTVT_ID, FACT_VENCE, FACT_DTOMONTO, FACT_ADICIONAL, FACT_IVAMONTO, FACT_EXTRA, FACT_TOTAL, FACT_RTFTEPOR, FACT_RTFTEMONTO, FACT_RTIVAPOR, FACT_RTIVAMONTO, FACT_RTICAPOR, FACT_RTICAMONTO, FACT_NOMCLIENTE, TERC_CTARTFTE, TERC_CTARTIVA, TERC_CTARTICA, TERC_CTAVENTA, TERC_CTACLIENTE, FACT_ANULADO
        FROM FACTURAS F, TERCEROS T
        WHERE FACT_ID = :IDDOC AND F.TERC_NIT = T.TERC_NIT
        INTO :PREF, :NUM, :FECAUX, :NIT, :PTOVTA, :VENCEAUX, :VRDTO, :VRADIC, :VRIVA, :VREXTRA, :VRTOTAL, :PRTFTE, :VRRTFTE, :PORC, :VRRTIVA, :PRTICA, :VRRTICA, :NOMBRE, TCTARTFTE, TCTARTIVA, TCTARTICA, TCTAVENTA, TCTACLIEN, ANULADO;
  if (ANULADO = 'N') then
    BEGIN
    /* BUSQUE EL CENTRO DEL PUNTO, LA BODEGA, O EL PREFIJO  */
    IF (CENT = 'B') THEN
        SELECT B.BODE_CENTRO, B.BODE_PROY FROM BODEGA B, FACTURAS F
            WHERE B.BODE_COD = F.BODE_COD AND F.FACT_ID = :IDDOC INTO :CENTRO, :PROY;
    IF (CENT = 'V') THEN
        SELECT V.CENT_COD, V.PROY_COD FROM VENDEDORES V, FACTURAS F
            WHERE V.VEND_COD = F.VEND_COD AND F.FACT_ID = :IDDOC INTO :CENTRO, :PROY;
    IF (CENT = 'P') THEN
        SELECT P.PREF_CENTRO,P.PREF_PROY  FROM PREFIJOS P, FACTURAS F
            WHERE P.PREF_PRE = F.PREF_PRE AND F.FACT_ID = :IDDOC AND P.TIDO_COD = 31 INTO :CENTRO, :PROY;
    NUMERO = PREF || NUM;
    SELECT SUM (FADE_CONSUMO) FROM FACTURAS_DETALLE WHERE FACT_ID = :IDDOC  AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
        INTO MERCANCIA;
    VRSUBT = VRTOTAL - VREXTRA - VRIVA - MERCANCIA; /* BASE DE RETEFTE Y RETEICA */

    EXECUTE PROCEDURE lee_configuracion ('FACTURACION', 'FACTURAS', 'DESCUENTO PIE FACTURA IGUAL A SUMA DE DESCUENTOS POR ITEM') returning_values (:DTOXIT);
    if (DTOXIT = 'SI') then
        VRDTO = 0;
    MERCANCIA = VRSUBT - VRADIC + VRDTO;
    EXECUTE PROCEDURE FECHA_A_CONTA(:FECAUX) returning_values (:FECHA);
    EXECUTE PROCEDURE FECHA_A_CONTA(:VENCEAUX) returning_values (:VENCE);
    /* REGISTRE EL ENCABEZADO CONTABLE */
    IDC = GEN_ID(ID_CONTABILIZA, 1);
    if (STRLEN(NOMBRE)> 43 ) then
      CONC = 'FV No.' || NUMERO || '-' || SUBSTR(NOMBRE,1,43);
    ELSE
      CONC = 'FV No.' || NUMERO || '-' || NOMBRE;
    INSERT INTO CONTABILIZACION (CNTB_ID, CNTB_TIPOCOMP, CNTB_PREFCNT, CNTB_NUMERO, CNTB_FECHA, CNTB_CONCEPTO, CNTB_REF, CNTB_TIPOREF, CNTB_IDREF, CNTB_PREFREF, CNTB_NUMREF, CNTB_PROCESADO)
        VALUES (:IDC, :TIPOCOMP, :PREFCONT, :NUM, :FECHA, :CONC, '', 31, :IDDOC, :PREF, :NUM, 'N');
    NROI = 0;
    SUMA = 0;
    ERROR = 0;
    /* SI NO HAY CUENTA DE DESCUENTO NI ADICIONAL CALCULE UN FACTOR PARA LAS VENTAS Y EL IVA */
    if (MERCANCIA <> 0) then
        FACTOR = CAST(VRSUBT AS DOUBLE PRECISION) / CAST(MERCANCIA AS DOUBLE PRECISION);
    ELSE
        FACTOR = 1;
    /* TRAIGA EL NUMERO DE DIGITOS PARA EL REDONDEO */
    SELECT CAST(CONF_VALOR AS INTEGER) FROM CONFIGURACION WHERE CONF_MODULO = 'FACTURACION' AND
        CONF_CATEGORIA = 'GENERAL' AND CONF_PROPIEDAD = 'REDONDEO AL MULTIPLO DE DIEZ EN TOTALES' INTO :DIG;
    /* CUENTAS DE VENTAS */
    if (VENTAS = 'A') then
        BEGIN
        FOR SELECT MAX(COAR_CTAVNT), SUM(FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), SUM(FADE_IVAMONTO), SUM(FADE_CONSUMO), MAX(B.bode_proy), MAX(B.bode_centro)
            FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_DETALLE F, bodega b
            WHERE F.FACT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL)) and
            f.bode_cod = b.bode_cod
            GROUP BY COAR_CTAVNT
            INTO :CTAVENTAS, :MONTO, :IMPTOS, :VRCONSUMO, :PROYI, :CENTI
            DO
            BEGIN
            if ((FOMENTO = 'SI') or (icoing = 'SI')) then
                MONTO = MONTO + VRCONSUMO;
            if ((CTADTO IS NULL) OR (CTADTO = '')) then
                MONTO = MONTO * FACTOR;
            execute procedure redondee(MONTO, DIG) returning_values (MONTO);
            if (MONTO <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTAVENTAS, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT F.ARTI_COD, (FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), FADE_CONSUMO
                        FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_DETALLE F
                        WHERE F.FACT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTAINV = :CUENTA AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
                        INTO :ART, :MONTO, :IMPTOS
                    DO
                        BEGIN
                        if ((FOMENTO = 'SI') or (ICOING = 'SI')) then
                            MONTO = MONTO + IMPTOS;
                        if ((CTADTO IS NULL) OR (CTADTO = '')) then
                            MONTO = MONTO * FACTOR;
                        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                        if (MONTO <> 0) then
                            BEGIN
                            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                            NROI = NROI + 1;
                            SUMA = SUMA - MONTO;
                            END
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    NROI = NROI + 1;
                    SUMA = SUMA - MONTO;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    IF (CENT = 'B') THEN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROYI, :CENTI, NULL, NULL, NULL, NULL, 0, 0);
                    ELSE
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA - MONTO;
                    END
                END /* MONTO <> 0 */
            END /* FOR */
        END /* VENTAS X ARTICULO */
     IF ((VENTAS = 'C') OR (VENTAS = 'K')) THEN
        BEGIN
        IF (VENTAS = 'C') THEN
            CTAVENTAS = TCTAVENTA;
        SELECT SUM(FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), SUM(FADE_IVAMONTO), SUM (FADE_CONSUMO)
            FROM FACTURAS_DETALLE F
            WHERE F.FACT_ID = :IDDOC AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
            INTO :MONTO, :IMPTOS, :VRCONSUMO;
        if ((FOMENTO = 'SI') or (ICOING = 'SI')) then
            MONTO = MONTO + VRCONSUMO;
        if ((CTADTO IS NULL) OR (CTADTO = '')) then
            MONTO = MONTO * FACTOR;
        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
        if (MONTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTAVENTAS, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT F.ARTI_COD, (FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), FADE_CONSUMO
                    FROM ARTICULO A, FACTURAS_DETALLE F
                    WHERE F.FACT_ID = :IDDOC AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
                    INTO :ART, :MONTO, :IMPTOS
                    DO
                    BEGIN
                    if ((FOMENTO = 'SI') or (ICOING = 'SI')) then
                        MONTO = MONTO + VRCONSUMO;
                    if ((CTADTO IS NULL) OR (CTADTO = '')) then
                        MONTO = MONTO * FACTOR;
                    execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                    if (MONTO <> 0) then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        SUMA = SUMA - MONTO;
                        END
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - MONTO;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - MONTO;
                END
            END /* MONTO <> 0 */
        END /* VENTAS DE CLIENTE O CONSTANTE */
    /* EL IVA EN VENTAS */
    if (IVA = 'A') then
        BEGIN
        FOR SELECT MAX(COAR_CTAIVAV), SUM(FADE_IVAMONTO), SUM(FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), sum(FADE_CONSUMO)
            FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_DETALLE F
            WHERE F.FACT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
            GROUP BY COAR_CTAIVAV
            INTO :CTAIVA, :IMPTOS, :MONTO, :VALORADIC
        DO
            BEGIN
            if (FOMENTO = 'SI') then
                MONTO = MONTO + VALORADIC;
            MONTO = MONTO * -1;
            MONTO = MONTO * FACTOR;
            IMPTOS = IMPTOS * FACTOR;
            execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
            execute procedure redondee(MONTO, DIG) returning_values (MONTO);
            if (IMPTOS <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTAIVA, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT F.ARTI_COD, FADE_IVAMONTO, (FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), TAIV_PORC, FADE_CONSUMO
                        FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_DETALLE F, TARIFA_IVA T
                        WHERE F.FACT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTAIVAV = :CUENTA AND A.TAIV_COD = T.TAIV_COD AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
                        INTO :ART, :IMPTOS, :MONTO, :PORCIVA, :VALORADIC
                    DO
                        BEGIN
                        if (FOMENTO = 'SI') then
                            MONTO = MONTO + VALORADIC;
                        MONTO = MONTO * -1;
                        MONTO = MONTO * FACTOR;
                        IMPTOS = IMPTOS * FACTOR;
                        execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                        if (IMPTOS <> 0) then
                            BEGIN
                            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, :MONTO, :PORCIVA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                            NROI = NROI + 1;
                            SUMA = SUMA + DEBITO - CREDITO;
                            END
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, :MONTO, ABS(:IMPTOS*100/:MONTO), :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    NROI = NROI + 1;
                    SUMA = SUMA - IMPTOS;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, :MONTO, ABS(:IMPTOS*100/:MONTO), :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA - IMPTOS;
                    END
                END   /* IMPTOS <> 0 */
            END /* FOR */
        END /* IVA X ARTICULO */
    if (IVA = 'K') then /* IVA EN CTA CONSTANTE */
        BEGIN
        SELECT SUM(FADE_IVAMONTO), SUM(FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), SUM(FADE_CONSUMO)
            FROM FACTURAS_DETALLE F
            WHERE F.FACT_ID = :IDDOC and FADE_IVAMONTO <> 0 AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
            INTO :IMPTOS, :MONTO, :valoradic;
        if (FOMENTO = 'SI') then
            MONTO = MONTO + VALORADIC;
        MONTO = MONTO * -1;
        MONTO = MONTO * FACTOR;
        IMPTOS = IMPTOS * FACTOR;
        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
        execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
        if (IMPTOS <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTAIVA, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT F.ARTI_COD, (FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), FADE_IVAMONTO, TAIV_PORC, FADE_CONSUMO
                    FROM ARTICULO A, FACTURAS_DETALLE F, TARIFA_IVA T
                    WHERE F.FACT_ID = :IDDOC AND A.TAIV_COD = T.TAIV_COD AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
                    INTO :ART, :MONTO, :IMPTOS, :PORCIVA, :VALORADIC
                    DO
                    BEGIN
                    if (FOMENTO = 'SI') then
                        MONTO = MONTO + VALORADIC;
                    MONTO = MONTO * -1;
                    MONTO = MONTO * FACTOR;
                    IMPTOS = IMPTOS * FACTOR;
                    execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                    execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                    if (IMPTOS <> 0) then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', 0, :IMPTOS, :MONTO, :PORCIVA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        SUMA = SUMA - IMPTOS;
                        END
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', 0, :IMPTOS, :MONTO, ABS(:IMPTOS*100/:MONTO), :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - IMPTOS;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', 0, :IMPTOS, :MONTO, ABS(:IMPTOS*100/:MONTO), :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - IMPTOS;
                END
            END /* IMPTOS <> 0 */
        END /* IVA EN CTA CONSTANTE */
    /* EL IMPOCONSUMO */
    if ((CONSUMO = 'A') AND (FOMENTO <> 'SI')) then
        BEGIN
        FOR SELECT MAX(COAR_CTACONS), SUM(FADE_CONSUMO)
            FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_DETALLE F
            WHERE F.FACT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
            GROUP BY COAR_CTACONS
            INTO :CTACONSUMO, :IMPTOS
        DO
            BEGIN
            execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
            if (IMPTOS <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTACONSUMO, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, REGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT F.ARTI_COD, FADE_CONSUMO
                        FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_DETALLE F
                        WHERE F.FACT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTACONS = :CUENTA AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
                        INTO :ART, :IMPTOS
                    DO
                        BEGIN
                        execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                        if (IMPTOS <> 0) then
                            BEGIN
                            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                            NROI = NROI + 1;
                            SUMA = SUMA - IMPTOS;
                            END
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    NROI = NROI + 1;
                    SUMA = SUMA - IMPTOS;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA - IMPTOS;
                    END
                END /* IMPTOS <> 0 */
            END /* FOR */
        END /* CONSUMO X ARTICULO */
    if ((CONSUMO = 'K') AND (FOMENTO <> 'SI')) then /* CONSUMO EN CTA CONSTANTE */
        BEGIN
        SELECT SUM(FADE_CONSUMO)
            FROM FACTURAS_DETALLE F
            WHERE F.FACT_ID = :IDDOC AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
            INTO :IMPTOS;
        execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
        if (IMPTOS <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTACONSUMO, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT F.ARTI_COD, FADE_CONSUMO
                    FROM ARTICULO A, FACTURAS_DETALLE F
                    WHERE F.FACT_ID = :IDDOC AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
                    INTO :ART, :IMPTOS
                    DO
                    BEGIN
                    execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                    if (IMPTOS <> 0) then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CTACONSUMO, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        SUMA = SUMA - IMPTOS;
                        END
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTACONSUMO, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - IMPTOS;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTACONSUMO, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - IMPTOS;
                END
            END /* IMPTOS <> 0 */
        END /* CONSUMO EN CTA CONSTANTE */
    /* DESCUENTO */
    if ((CTADTO IS NOT NULL) AND (CTADTO <> '')) then
        BEGIN
        execute procedure redondee(VRDTO, DIG) returning_values (VRDTO);
        if (VRDTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTADTO, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRDTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA + VRDTO;
                END
            if (TIPOCUEN = 'N') then
                    BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRDTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA + VRDTO;
                END
            END
        END /* DESCUENTO */
    /* VALOR ADIC */
    if ((CTAADIC IS NOT NULL) AND (CTAADIC <> '')) then
        BEGIN
        execute procedure redondee(VRADIC, DIG) returning_values (VRADIC);
        if (VRADIC <> 0) THEN
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTAADIC, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRADIC, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - VRADIC;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRADIC, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - VRADIC;
                END
            END
        END /* VR. ADIC */
    /* VALOR EXTRA */
    if ((CTAEXTRA IS NOT NULL) AND (CTAEXTRA <> '')) THEN
        BEGIN
        execute procedure redondee(VREXTRA, DIG) returning_values (VREXTRA);
        if (VREXTRA <> 0) THEN
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTAEXTRA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VREXTRA, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - VREXTRA;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VREXTRA, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - VREXTRA;
                END
            END
        END /* VR. EXTRA */
    /* DESCUENTE EL IMPOCONSUMO */
    SELECT SUM(FADE_CONSUMO)
        FROM FACTURAS_DETALLE F WHERE F.FACT_ID = :IDDOC AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL)) INTO :IMPTOS;
    vrsubt = vrsubt - IMPTOS;
    /* RETENCION FUENTE */
    if ((RTFTE = 'C') or (RTFTE = 'K')) then
      BEGIN
      execute procedure redondee(VRRTFTE, DIG) returning_values (VRRTFTE);
      if (VRRTFTE <> 0) then
        BEGIN
        if (RTFTE = 'C') then
            CTARTFTE = TCTARTFTE;
        EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTARTFTE, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :VRSUBT, :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTFTE;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :VRSUBT, :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTFTE;
            END
        /* AUTORETENCION */
        if (FAUTORET <= fecaux) then
            BEGIN
            EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'CUENTA DE AUTORETENCION EN LA FUENTE') returning_values (CTARTFTE);
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTARTFTE INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERROR (31, :IDDOC, :CTARTFTE, 2);
                CUENTA = CTARTFTE;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                begin
                EXECUTE PROCEDURE ERROR (31, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, (:VRSUBT*-1), :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - VRRTFTE;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, (:VRSUBT*-1), :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - VRRTFTE;
                END
            END
        END /* RTFTE */
      END
    if (RTFTE = 'A') then
      BEGIN
      FOR SELECT MAX(COAR_CTARTFTEV), MAX(COAR_RTFTE), MIN(COAR_RTBASE), SUM(FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), SUM((FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO)*COAR_RTFTE)
        FROM CONTABIL_ARTICULO C, FACTURAS_DETALLE F
        WHERE F.FACT_ID = :IDDOC AND F.ARTI_COD = C.ARTI_COD AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
        GROUP BY COAR_CTARTFTEV
        INTO :CTARTFTE, :PRTFTE, :baseadic, :MONTO, :VRRTFTE
        DO
        BEGIN
        MONTO = MONTO * FACTOR;
        if (MONTO >= BASEADIC) then
            BEGIN
            VRRTFTE = VRRTFTE * FACTOR / 100;
            execute procedure redondee(VRRTFTE, DIG) returning_values (VRRTFTE);
            execute procedure redondee(MONTO, DIG) returning_values (MONTO);
            if (VRRTFTE <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTARTFTE, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :MONTO, :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    NROI = NROI + 1;
                    SUMA = SUMA + VRRTFTE;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :MONTO, :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA + VRRTFTE;
                    END
                /* AUTORETENCION */
                if (FAUTORET <= fecaux) then
                    BEGIN
                    EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'CUENTA DE AUTORETENCION EN LA FUENTE') returning_values (CTARTFTE);
                    EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTARTFTE, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
                    if (ERRORC <> 0) then
                        ERROR = ERROR + 1;
                    if (TIPOCUEN = 'C') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, (:MONTO*-1), :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                        NROI = NROI + 1;
                        SUMA = SUMA - VRRTFTE;
                        END
                    if (TIPOCUEN = 'N') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, (:MONTO*-1), :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NROI = NROI + 1;
                        SUMA = SUMA - VRRTFTE;
                        END
                    END
                END
            END
        END /* RTFTE */
      END
    /* RETENCION IVA */
    if ((RTIVA = 'C') or (RTIVA = 'K')) then
      BEGIN
      execute procedure redondee(VRRTIVA, DIG) returning_values (VRRTIVA);
      if (VRRTIVA <> 0) then
        BEGIN
        if (RTIVA = 'C') then
            CTARTIVA = TCTARTIVA;
        EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTARTIVA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTIVA, 0, :VRIVA, :PORC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTIVA;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTIVA, 0, :VRIVA, :PORC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTIVA;
            END
        END /* RTIVA */
      END
    /* RETENCION DE ICA */
    if ((RTICA = 'C') or (RTICA = 'K')) then
      BEGIN
      execute procedure redondee(VRRTICA, DIG) returning_values (VRRTICA);
      if (VRRTICA <> 0) then
        BEGIN
        if (RTICA = 'C') then
            CTARTICA = TCTARTICA;
        EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTARTICA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTICA, 0, :VRSUBT, :PRTICA, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTICA;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTICA, 0, :VRSUBT, :PRTICA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTICA;
            END
        END /* RTICA */
      END
    /* CIERRE EL COMPROBANTE CONTRA LA CUENTA DEL TERCERO O LA CONSTANTE */
    if ((SUMA <> 0) and ((CARTERA = 'C') or (CARTERA = 'K') or (CARTERA = 'J'))) then
        BEGIN
        if (icoing = 'SI') then
            /* DESCUENTE EL IMPOCONSUMO QUE HACE PARTE DEL COSTO */
            SUMA = SUMA + IMPTOS;
        if (SUMA < 0) then
            BEGIN
            DEBITO = SUMA * -1;
            CREDITO = 0;
            END
        ELSE
            BEGIN
            DEBITO = 0;
            CREDITO = SUMA;
            END
        if (CARTERA = 'C') then
            CTACARTERA = TCTACLIEN;
        if (CARTERA = 'J') then
            BEGIN
            /* BUSQUE LA CUENTA DE LA CAJA */
            SELECT CAJA_CUENTA FROM CAJAS C, PUNTO_VENTA P
                WHERE P.CAJA_ID = C.CAJA_ID AND PTVT_ID = :PTOVTA
                INTO :CTACARTERA;
            END
        EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTACARTERA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :DEBITO, :CREDITO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
        if (TIPOCUEN = 'N') then
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :DEBITO, :CREDITO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
        NROI = NROI + 1;
        END /* SUMA EN CARTERA */
    /* CALCULE COSTOS EN VENTAS */
    EXECUTE PROCEDURE COSTO_EN_VENTAS(31, :IDDOC);
    if (COSTOS = 'A') then
        BEGIN
        FOR SELECT MAX(CTACOS), SUM(CAST(CANT AS DOUBLE PRECISION) * COSTO), SUM(FADE_CONSUMO)
            FROM COSTO_VENTAS CV, FACTURAS_DETALLE D WHERE CV.arti_cod = D.arti_cod AND D.fact_id = :iddoc
            AND TIDO_COD = 31 AND COVE_ID = :iddoc
            GROUP BY CTACOS
            INTO :CTACOSTOS, :MONTO, :vrconsumo
            DO
            BEGIN
            if (icoing = 'SI') then
                MONTO = MONTO + VRCONSUMO;
            if (MONTO <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTACOSTOS, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT ARTI_COD, CANT * COSTO
                        FROM COSTO_VENTAS WHERE TIDO_COD = 31 AND COVE_ID = :iddoc AND CTACOS = :CUENTA
                        INTO :ART, :MONTO
                    DO
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    NROI = NROI + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    END
                END /* MONTO <> 0 */
            END /* FOR */
        END /* COSTOS */
    if (COSTOS = 'K') then
        BEGIN
        SELECT SUM(CAST(CANT AS DOUBLE PRECISION) * COSTO)
            FROM COSTO_VENTAS WHERE TIDO_COD = 31 AND COVE_ID = :iddoc
            INTO :MONTO;
        if (icoing = 'SI') then
            MONTO = MONTO + imptos;
        if (MONTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTACOSTOS, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, REGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT ARTI_COD, CANT * COSTO
                    FROM COSTO_VENTAS WHERE TIDO_COD = 31 AND COVE_ID = :iddoc
                    INTO :ART, :MONTO
                DO
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTACOSTOS, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                    NROI = NROI + 1;
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTACOSTOS, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTACOSTOS, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                END
            END /* MONTO <> 0 */
        END /* COSTOS = K */
    if (INVEN = 'A') then
        BEGIN
        FOR SELECT MAX(CTAINV), SUM(CAST(CANT AS DOUBLE PRECISION) * COSTO)
            FROM COSTO_VENTAS WHERE TIDO_COD = 31 AND COVE_ID = :iddoc
            GROUP BY CTAINV
            INTO :CTAINVEN, :MONTO
        DO
            BEGIN
            if (MONTO <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTAINVEN, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, REGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT ARTI_COD, CANT * COSTO
                        FROM COSTO_VENTAS WHERE TIDO_COD = 31 AND COVE_ID = :iddoc AND CTAINV = :CUENTA
                        INTO :ART, :MONTO
                    DO
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    NROI = NROI + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    END
                END /* MONTO <> 0 */
            END /* FOR */
        END /* INVEN = A */
    if (INVEN = 'K') then
        BEGIN
        SELECT SUM(CAST(CANT AS DOUBLE PRECISION) * COSTO)
            FROM COSTO_VENTAS WHERE TIDO_COD = 31 AND COVE_ID = :iddoc
            INTO :MONTO;
        if (MONTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTAINVEN, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT ARTI_COD, CANT * COSTO
                    FROM COSTO_VENTAS WHERE TIDO_COD = 31 AND COVE_ID = :iddoc
                    INTO :ART, :MONTO
                DO
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTAINVEN, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                    NROI = NROI + 1;
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAINVEN, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAINVEN, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                END
            END /* MONTO <> 0 */
        END /* INVEN = K */
    /* recorra las cuentas adicionales */
    FOR SELECT INVC_CUENTA, INVC_BASE, INVC_PORC, INVC_VALOR, INVC_DB
        FROM INTERFAZ_VENTAS_CTAS
        WHERE INVE_ID = :IDINTER
        INTO :CTADIC, :BASEADIC, :PORCADIC, :VALORADIC, :DBADIC
        DO
        BEGIN
        if (VALORADIC <> 0) then
            MONTO = VALORADIC;
        ELSE
            BEGIN
            if (:BASEADIC = 'SUBTOTAL') then
                VALORADIC = vrsubt;
            if (:BASEADIC = 'DESCUENTO') then
                VALORADIC = VRDTO;
            if (:BASEADIC = 'IVA') then
                VALORADIC = VRIVA;
            if (:BASEADIC = 'ADICIONAL') then
                VALORADIC = VRADIC;
            if (:BASEADIC = 'EXTRA') then
                VALORADIC = VREXTRA;
            if (:BASEADIC = 'TOTAL') then
                VALORADIC = VRTOTAL;
            MONTO = VALORADIC * PORCADIC / 100;
            END
        if (MONTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTADIC, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                if (DBADIC = 'S') then
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                ELSE
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                if (DBADIC = 'S') then
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                ELSE
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                END
            NROI = NROI + 1;
            END
        END
    if (ERROR > 0) then
        VER = 'S';
    SUSPEND;
    END /* NO ANULADO */
  END /* EXISTE LA INTERFAZ */
ELSE
    BEGIN
    EXECUTE PROCEDURE ERROR (31, :IDDOC, :PREF, 1);
    ERROR = ERROR + 1;
    VER = 'S';
    SUSPEND;
    END
END

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE CONTABIL_FACTURA_IVA(
    IDDOC INTEGER,
    IDINTER INTEGER)
RETURNS (
    ERROR INTEGER,
    VER CHAR(1),
    IDC INTEGER)
AS
declare variable pref varchar(4);
declare variable num varchar(6);
declare variable numero varchar(10);
declare variable fecaux date;
declare variable fecha char(8);
declare variable conc varchar(60);
declare variable venceaux date;
declare variable vence char(8);
declare variable vrdto numeric(18,2);
declare variable vradic numeric(18,2);
declare variable vrsubt numeric(18,2);
declare variable vriva numeric(18,2);
declare variable prtfte numeric(9,2);
declare variable vrrtfte numeric(18,2);
declare variable vrrtiva numeric(18,2);
declare variable prtica numeric(9,2);
declare variable vrrtica numeric(18,2);
declare variable vrtotal numeric(18,2);
declare variable vrextra numeric(18,2);
declare variable tipocomp varchar(3);
declare variable prefcont varchar(4);
declare variable ventas char(1);
declare variable ctaventas varchar(20);
declare variable iva char(1);
declare variable ctaiva varchar(20);
declare variable consumo char(1);
declare variable ctaconsumo varchar(20);
declare variable cartera char(1);
declare variable ctacartera varchar(20);
declare variable rtfte char(1);
declare variable ctartfte varchar(20);
declare variable rtiva char(1);
declare variable ctartiva varchar(20);
declare variable rtica char(1);
declare variable ctartica varchar(20);
declare variable inven char(1);
declare variable ctainven varchar(20);
declare variable costos char(1);
declare variable ctacostos varchar(20);
declare variable ctadto varchar(20);
declare variable ctaadic varchar(20);
declare variable ctaextra varchar(20);
declare variable existe char(1);
declare variable cuenta varchar(20);
declare variable monto numeric(18,2);
declare variable tipocuen char(1);
declare variable nit varchar(20);
declare variable nombre varchar(60);
declare variable proy varchar(4);
declare variable centro varchar(4);
declare variable porc numeric(5,2);
declare variable debito numeric(18,2);
declare variable credito numeric(18,2);
declare variable nroi integer;
declare variable art varchar(15);
declare variable imptos numeric(18,2);
declare variable suma numeric(18,2);
declare variable porciva numeric(9,2);
declare variable tctaclien varchar(20);
declare variable tctaventa varchar(20);
declare variable tctartfte varchar(20);
declare variable tctartiva varchar(20);
declare variable tctartica varchar(20);
declare variable ctadic varchar(20);
declare variable baseadic varchar(20);
declare variable porcadic numeric(5,2);
declare variable valoradic numeric(18,2);
declare variable dbadic char(1);
declare variable ptovta integer;
declare variable anulado char(1);
declare variable dig integer;
declare variable mercancia numeric(18,2);
declare variable fomento varchar(2);
declare variable DTOXIT varchar(2);
declare variable vrconsumo numeric(18,2);
declare variable factor double precision;
declare variable cent char(1);
declare variable AUTORET VARCHAR(10);
declare variable FAUTORET DATE;
declare variable ERRORC INTEGER;
BEGIN
EXECUTE PROCEDURE LEE_CONFIGURACION('COMPRAS', 'FACTURAS', 'USAR IMPOCONSUMO COMO PORCENTAJE DE FOMENTO') returning_values (FOMENTO);
EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'FECHA AUTORETENEDOR NO DESCONTAR RETENCIONES DEL SALDO PERO SI CONTABILIZARLAS') returning_values (AUTORET);
if (AUTORET <> '') then
    FAUTORET = CAST(AUTORET AS DATE);
else
    FAUTORET = '9999/12/31';
/* BUSQUE LA INTERFACE */
EXISTE = 'N';
SELECT 'S', TICO_COD, PRCO_PRE, INVE_VENTAS, INVE_IVA, INVE_CONSUMO, INVE_CARTERA, INVE_RTFTE, INVE_RTIVA, INVE_RTICA, INVE_COSTO, INVE_INVEN, INVE_CTAVENTAS, INVE_CTAIVA, INVE_CTACONSUMO, INVE_CTADTO, INVE_CTAADIC, INVE_CTAEXTRA, INVE_CTACARTERA, INVE_CTARTFTE, INVE_CTARTIVA, INVE_CTARTICA, INVE_CTAINVEN, INVE_CTACOSTOS, INVE_CONFIRMAR, INVE_CENTRO
    FROM INTERFAZ_VENTAS
    WHERE INVE_ID = :IDINTER
    INTO :EXISTE, :TIPOCOMP, :PREFCONT, :VENTAS, :IVA, :CONSUMO, :CARTERA, :RTFTE, :RTIVA, :RTICA, :COSTOS, :INVEN, :CTAVENTAS, :CTAIVA, :CTACONSUMO, :CTADTO, :CTAADIC, :CTAEXTRA, :CTACARTERA, :CTARTFTE, :CTARTIVA, :CTARTICA, :CTAINVEN, :CTACOSTOS, :VER, :CENT;
if (EXISTE = 'S') then
  BEGIN
    /* BORRE CUALQUEIR CONTABILIZACION PREVIA */
    DELETE FROM CONTABILIZACION WHERE CNTB_TIPOREF = 31 AND CNTB_IDREF = :IDDOC;

  /* TRAIGA EL ENCABEZADO DE LA FACTURA */
  SELECT PREF_PRE, FACT_NUMERO, FACT_FECHA, F.TERC_NIT, PTVT_ID, FACT_VENCE, FACT_DTOMONTO, FACT_ADICIONAL, FACT_IVAMONTO, FACT_EXTRA, FACT_TOTAL, FACT_RTFTEPOR, FACT_RTFTEMONTO, FACT_RTIVAPOR, FACT_RTIVAMONTO, FACT_RTICAPOR, FACT_RTICAMONTO, FACT_NOMCLIENTE, TERC_CTARTFTE, TERC_CTARTIVA, TERC_CTARTICA, TERC_CTAVENTA, TERC_CTACLIENTE, FACT_ANULADO
        FROM FACTURAS F, TERCEROS T
        WHERE FACT_ID = :IDDOC AND F.TERC_NIT = T.TERC_NIT
        INTO :PREF, :NUM, :FECAUX, :NIT, :PTOVTA, :VENCEAUX, :VRDTO, :VRADIC, :VRIVA, :VREXTRA, :VRTOTAL, :PRTFTE, :VRRTFTE, :PORC, :VRRTIVA, :PRTICA, :VRRTICA, :NOMBRE, TCTARTFTE, TCTARTIVA, TCTARTICA, TCTAVENTA, TCTACLIEN, ANULADO;
  if (ANULADO = 'N') then
    BEGIN
    /* BUSQUE EL CENTRO DEL PUNTO, LA BODEGA, O EL PREFIJO  */
    IF (CENT = 'B') THEN
        SELECT B.BODE_CENTRO, B.BODE_PROY FROM BODEGA B, FACTURAS F
            WHERE B.BODE_COD = F.BODE_COD AND F.FACT_ID = :IDDOC INTO :CENTRO, :PROY;
    IF (CENT = 'V') THEN
        SELECT V.CENT_COD, V.PROY_COD FROM VENDEDORES V, FACTURAS F
            WHERE V.VEND_COD = F.VEND_COD AND F.FACT_ID = :IDDOC INTO :CENTRO, :PROY;
    IF (CENT = 'P') THEN
        SELECT P.PREF_CENTRO,P.PREF_PROY  FROM PREFIJOS P, FACTURAS F
            WHERE P.PREF_PRE = F.PREF_PRE AND F.FACT_ID = :IDDOC AND P.TIDO_COD = 31 INTO :CENTRO, :PROY;
    NUMERO = PREF || NUM;
    SELECT SUM (FADE_CONSUMO) FROM FACTURAS_DETALLE WHERE FACT_ID = :IDDOC  AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
        INTO MERCANCIA;
    VRSUBT = VRTOTAL - VREXTRA - VRIVA - MERCANCIA; /* BASE DE RETEFTE Y RETEICA */

    EXECUTE PROCEDURE lee_configuracion ('FACTURACION', 'FACTURAS', 'DESCUENTO PIE FACTURA IGUAL A SUMA DE DESCUENTOS POR ITEM') returning_values (:DTOXIT);
    if (DTOXIT = 'SI') then
        VRDTO = 0;
    MERCANCIA = VRSUBT - VRADIC + VRDTO;
    EXECUTE PROCEDURE FECHA_A_CONTA(:FECAUX) returning_values (:FECHA);
    EXECUTE PROCEDURE FECHA_A_CONTA(:VENCEAUX) returning_values (:VENCE);
    /* REGISTRE EL ENCABEZADO CONTABLE */
    IDC = GEN_ID(ID_CONTABILIZA, 1);
    if (STRLEN(NOMBRE)> 43 ) then
      CONC = 'FV No.' || NUMERO || '-' || SUBSTR(NOMBRE,1,43);
    ELSE
      CONC = 'FV No.' || NUMERO || '-' || NOMBRE;
    INSERT INTO CONTABILIZACION (CNTB_ID, CNTB_TIPOCOMP, CNTB_PREFCNT, CNTB_NUMERO, CNTB_FECHA, CNTB_CONCEPTO, CNTB_REF, CNTB_TIPOREF, CNTB_IDREF, CNTB_PREFREF, CNTB_NUMREF, CNTB_PROCESADO)
        VALUES (:IDC, :TIPOCOMP, :PREFCONT, :NUM, :FECHA, :CONC, '', 31, :IDDOC, :PREF, :NUM, 'N');
    NROI = 0;
    SUMA = 0;
    ERROR = 0;
    /* SI NO HAY CUENTA DE DESCUENTO NI ADICIONAL CALCULE UN FACTOR PARA LAS VENTAS Y EL IVA */
    if (MERCANCIA <> 0) then
        FACTOR = CAST(VRSUBT AS DOUBLE PRECISION) / CAST(MERCANCIA AS DOUBLE PRECISION);
    ELSE
        FACTOR = 1;
    /* TRAIGA EL NUMERO DE DIGITOS PARA EL REDONDEO */
    SELECT CAST(CONF_VALOR AS INTEGER) FROM CONFIGURACION WHERE CONF_MODULO = 'FACTURACION' AND
        CONF_CATEGORIA = 'GENERAL' AND CONF_PROPIEDAD = 'REDONDEO AL MULTIPLO DE DIEZ EN TOTALES' INTO :DIG;
    /* CUENTAS DE VENTAS */
    if (VENTAS = 'A') then
        BEGIN
        FOR SELECT MAX(TAIV_CTAVTA), SUM(FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), SUM(FADE_IVAMONTO), SUM(FADE_CONSUMO)
            FROM TARIFA_IVA T, FACTURAS_DETALLE F
            WHERE F.FACT_ID = :IDDOC AND F.fade_ivaporc = T.taiv_porc AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
            GROUP BY TAIV_CTAVTA
            INTO :CTAVENTAS, :MONTO, :IMPTOS, :VRCONSUMO
            DO
            BEGIN
            if (FOMENTO = 'SI') then
                MONTO = MONTO + VRCONSUMO;
            if ((CTADTO IS NULL) OR (CTADTO = '')) then
                MONTO = MONTO * FACTOR;
            execute procedure redondee(MONTO, DIG) returning_values (MONTO);
            if (MONTO <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTAVENTAS, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT F.ARTI_COD, (FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), FADE_CONSUMO
                        FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_DETALLE F
                        WHERE F.FACT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTAINV = :CUENTA AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
                        INTO :ART, :MONTO, :IMPTOS
                    DO
                        BEGIN
                        if (FOMENTO = 'SI') then
                            MONTO = MONTO + IMPTOS;
                        if ((CTADTO IS NULL) OR (CTADTO = '')) then
                            MONTO = MONTO * FACTOR;
                        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                        if (MONTO <> 0) then
                            BEGIN
                            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                            NROI = NROI + 1;
                            SUMA = SUMA - MONTO;
                            END
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    NROI = NROI + 1;
                    SUMA = SUMA - MONTO;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA - MONTO;
                    END
                END /* MONTO <> 0 */
            END /* FOR */
        END /* VENTAS X ARTICULO */
     IF ((VENTAS = 'C') OR (VENTAS = 'K')) THEN
        BEGIN
        IF (VENTAS = 'C') THEN
            CTAVENTAS = TCTAVENTA;
        SELECT SUM(FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), SUM(FADE_IVAMONTO), SUM (FADE_CONSUMO)
            FROM FACTURAS_DETALLE F
            WHERE F.FACT_ID = :IDDOC AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
            INTO :MONTO, :IMPTOS, :VRCONSUMO;
        if (FOMENTO = 'SI') then
            MONTO = MONTO + VRCONSUMO;
        if ((CTADTO IS NULL) OR (CTADTO = '')) then
            MONTO = MONTO * FACTOR;
        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
        if (MONTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTAVENTAS, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT F.ARTI_COD, (FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), FADE_CONSUMO
                    FROM ARTICULO A, FACTURAS_DETALLE F
                    WHERE F.FACT_ID = :IDDOC AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
                    INTO :ART, :MONTO, :IMPTOS
                    DO
                    BEGIN
                    if (FOMENTO = 'SI') then
                        MONTO = MONTO + VRCONSUMO;
                    if ((CTADTO IS NULL) OR (CTADTO = '')) then
                        MONTO = MONTO * FACTOR;
                    execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                    if (MONTO <> 0) then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        SUMA = SUMA - MONTO;
                        END
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - MONTO;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - MONTO;
                END
            END /* MONTO <> 0 */
        END /* VENTAS DE CLIENTE O CONSTANTE */
    /* EL IVA EN VENTAS */
    if (IVA = 'A') then
        BEGIN
        FOR SELECT MAX(TAIV_CTAIVAVNT), SUM(FADE_IVAMONTO), SUM(FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), sum(FADE_CONSUMO)
            FROM TARIFA_IVA T, FACTURAS_DETALLE F
            WHERE F.FACT_ID = :IDDOC AND F.fade_ivaporc = T.taiv_porc AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
            GROUP BY TAIV_CTAIVAVNT
            INTO :CTAIVA, :IMPTOS, :MONTO, :VALORADIC
        DO
            BEGIN
            if (FOMENTO = 'SI') then
                MONTO = MONTO + VALORADIC;
            MONTO = MONTO * -1;
            MONTO = MONTO * FACTOR;
            IMPTOS = IMPTOS * FACTOR;
            execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
            execute procedure redondee(MONTO, DIG) returning_values (MONTO);
            if (IMPTOS <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTAIVA, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT F.ARTI_COD, FADE_IVAMONTO, (FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), TAIV_PORC, FADE_CONSUMO
                        FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_DETALLE F, TARIFA_IVA T
                        WHERE F.FACT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTAIVAV = :CUENTA AND A.TAIV_COD = T.TAIV_COD AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
                        INTO :ART, :IMPTOS, :MONTO, :PORCIVA, :VALORADIC
                    DO
                        BEGIN
                        if (FOMENTO = 'SI') then
                            MONTO = MONTO + VALORADIC;
                        MONTO = MONTO * -1;
                        MONTO = MONTO * FACTOR;
                        IMPTOS = IMPTOS * FACTOR;
                        execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                        if (IMPTOS <> 0) then
                            BEGIN
                            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, :MONTO, :PORCIVA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                            NROI = NROI + 1;
                            SUMA = SUMA + DEBITO - CREDITO;
                            END
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, :MONTO, ABS(:IMPTOS*100/:MONTO), :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    NROI = NROI + 1;
                    SUMA = SUMA - IMPTOS;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, :MONTO, ABS(:IMPTOS*100/:MONTO), :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA - IMPTOS;
                    END
                END   /* IMPTOS <> 0 */
            END /* FOR */
        END /* IVA X ARTICULO */
    if (IVA = 'K') then /* IVA EN CTA CONSTANTE */
        BEGIN
        SELECT SUM(FADE_IVAMONTO), SUM(FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), SUM(FADE_CONSUMO)
            FROM FACTURAS_DETALLE F
            WHERE F.FACT_ID = :IDDOC and FADE_IVAMONTO <> 0 AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
            INTO :IMPTOS, :MONTO, :valoradic;
        if (FOMENTO = 'SI') then
            MONTO = MONTO + VALORADIC;
        MONTO = MONTO * -1;
        MONTO = MONTO * FACTOR;
        IMPTOS = IMPTOS * FACTOR;
        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
        execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
        if (IMPTOS <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTAIVA, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT F.ARTI_COD, (FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), FADE_IVAMONTO, TAIV_PORC, FADE_CONSUMO
                    FROM ARTICULO A, FACTURAS_DETALLE F, TARIFA_IVA T
                    WHERE F.FACT_ID = :IDDOC AND A.TAIV_COD = T.TAIV_COD AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
                    INTO :ART, :MONTO, :IMPTOS, :PORCIVA, :VALORADIC
                    DO
                    BEGIN
                    if (FOMENTO = 'SI') then
                        MONTO = MONTO + VALORADIC;
                    MONTO = MONTO * -1;
                    MONTO = MONTO * FACTOR;
                    IMPTOS = IMPTOS * FACTOR;
                    execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                    execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                    if (IMPTOS <> 0) then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', 0, :IMPTOS, :MONTO, :PORCIVA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        SUMA = SUMA - IMPTOS;
                        END
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', 0, :IMPTOS, :MONTO, ABS(:IMPTOS*100/:MONTO), :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - IMPTOS;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', 0, :IMPTOS, :MONTO, ABS(:IMPTOS*100/:MONTO), :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - IMPTOS;
                END
            END /* IMPTOS <> 0 */
        END /* IVA EN CTA CONSTANTE */
    /* EL IMPOCONSUMO */
    if ((CONSUMO = 'A') AND (FOMENTO <> 'SI')) then
        BEGIN
        FOR SELECT MAX(COAR_CTACONS), SUM(FADE_CONSUMO)
            FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_DETALLE F
            WHERE F.FACT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
            GROUP BY COAR_CTACONS
            INTO :CTACONSUMO, :IMPTOS
        DO
            BEGIN
            execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
            if (IMPTOS <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTACONSUMO, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, REGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT F.ARTI_COD, FADE_CONSUMO
                        FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_DETALLE F
                        WHERE F.FACT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTACONS = :CUENTA AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
                        INTO :ART, :IMPTOS
                    DO
                        BEGIN
                        execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                        if (IMPTOS <> 0) then
                            BEGIN
                            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                            NROI = NROI + 1;
                            SUMA = SUMA - IMPTOS;
                            END
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    NROI = NROI + 1;
                    SUMA = SUMA - IMPTOS;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA - IMPTOS;
                    END
                END /* IMPTOS <> 0 */
            END /* FOR */
        END /* CONSUMO X ARTICULO */
    if ((CONSUMO = 'K') AND (FOMENTO <> 'SI')) then /* CONSUMO EN CTA CONSTANTE */
        BEGIN
        SELECT SUM(FADE_CONSUMO)
            FROM FACTURAS_DETALLE F
            WHERE F.FACT_ID = :IDDOC AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
            INTO :IMPTOS;
        execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
        if (IMPTOS <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTACONSUMO, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT F.ARTI_COD, FADE_CONSUMO
                    FROM ARTICULO A, FACTURAS_DETALLE F
                    WHERE F.FACT_ID = :IDDOC AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
                    INTO :ART, :IMPTOS
                    DO
                    BEGIN
                    execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                    if (IMPTOS <> 0) then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CTACONSUMO, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        SUMA = SUMA - IMPTOS;
                        END
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTACONSUMO, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - IMPTOS;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTACONSUMO, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - IMPTOS;
                END
            END /* IMPTOS <> 0 */
        END /* CONSUMO EN CTA CONSTANTE */
    /* DESCUENTO */
    if ((CTADTO IS NOT NULL) AND (CTADTO <> '')) then
        BEGIN
        execute procedure redondee(VRDTO, DIG) returning_values (VRDTO);
        if (VRDTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTADTO, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRDTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA + VRDTO;
                END
            if (TIPOCUEN = 'N') then
                    BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRDTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA + VRDTO;
                END
            END
        END /* DESCUENTO */
    /* VALOR ADIC */
    if ((CTAADIC IS NOT NULL) AND (CTAADIC <> '')) then
        BEGIN
        execute procedure redondee(VRADIC, DIG) returning_values (VRADIC);
        if (VRADIC <> 0) THEN
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTAADIC, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRADIC, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - VRADIC;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRADIC, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - VRADIC;
                END
            END
        END /* VR. ADIC */
    /* VALOR EXTRA */
    if ((CTAEXTRA IS NOT NULL) AND (CTAEXTRA <> '')) THEN
        BEGIN
        execute procedure redondee(VREXTRA, DIG) returning_values (VREXTRA);
        if (VREXTRA <> 0) THEN
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTAEXTRA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VREXTRA, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - VREXTRA;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VREXTRA, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - VREXTRA;
                END
            END
        END /* VR. EXTRA */
    /* DESCUENTE EL IMPOCONSUMO */
    SELECT SUM(FADE_CONSUMO)
        FROM FACTURAS_DETALLE F WHERE F.FACT_ID = :IDDOC AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL)) INTO :IMPTOS;
    vrsubt = vrsubt - IMPTOS;
    /* RETENCION FUENTE */
    if ((RTFTE = 'C') or (RTFTE = 'K')) then
      BEGIN
      execute procedure redondee(VRRTFTE, DIG) returning_values (VRRTFTE);
      if (VRRTFTE <> 0) then
        BEGIN
        if (RTFTE = 'C') then
            CTARTFTE = TCTARTFTE;
        EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTARTFTE, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :VRSUBT, :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTFTE;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :VRSUBT, :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTFTE;
            END
        /* AUTORETENCION */
        if (FAUTORET <= fecaux) then
            BEGIN
            EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'CUENTA DE AUTORETENCION EN LA FUENTE') returning_values (CTARTFTE);
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTARTFTE INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERROR (31, :IDDOC, :CTARTFTE, 2);
                CUENTA = CTARTFTE;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                begin
                EXECUTE PROCEDURE ERROR (31, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, (:VRSUBT*-1), :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - VRRTFTE;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, (:VRSUBT*-1), :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - VRRTFTE;
                END
            END
        END /* RTFTE */
      END
    if (RTFTE = 'A') then
      BEGIN
      FOR SELECT MAX(COAR_CTARTFTEV), MAX(COAR_RTFTE), MIN(COAR_RTBASE), SUM(FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), SUM((FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO)*COAR_RTFTE)
        FROM CONTABIL_ARTICULO C, FACTURAS_DETALLE F
        WHERE F.FACT_ID = :IDDOC AND F.ARTI_COD = C.ARTI_COD AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
        GROUP BY COAR_CTARTFTEV
        INTO :CTARTFTE, :PRTFTE, :baseadic, :MONTO, :VRRTFTE
        DO
        BEGIN
        MONTO = MONTO * FACTOR;
        if (MONTO >= BASEADIC) then
            BEGIN
            VRRTFTE = VRRTFTE * FACTOR / 100;
            execute procedure redondee(VRRTFTE, DIG) returning_values (VRRTFTE);
            execute procedure redondee(MONTO, DIG) returning_values (MONTO);
            if (VRRTFTE <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTARTFTE, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :MONTO, :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    NROI = NROI + 1;
                    SUMA = SUMA + VRRTFTE;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :MONTO, :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA + VRRTFTE;
                    END
                /* AUTORETENCION */
                if (FAUTORET <= fecaux) then
                    BEGIN
                    EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'CUENTA DE AUTORETENCION EN LA FUENTE') returning_values (CTARTFTE);
                    EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTARTFTE, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
                    if (ERRORC <> 0) then
                        ERROR = ERROR + 1;
                    if (TIPOCUEN = 'C') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, (:MONTO*-1), :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                        NROI = NROI + 1;
                        SUMA = SUMA - VRRTFTE;
                        END
                    if (TIPOCUEN = 'N') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, (:MONTO*-1), :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NROI = NROI + 1;
                        SUMA = SUMA - VRRTFTE;
                        END
                    END
                END
            END
        END /* RTFTE */
      END
    /* RETENCION IVA */
    if ((RTIVA = 'C') or (RTIVA = 'K')) then
      BEGIN
      execute procedure redondee(VRRTIVA, DIG) returning_values (VRRTIVA);
      if (VRRTIVA <> 0) then
        BEGIN
        if (RTIVA = 'C') then
            CTARTIVA = TCTARTIVA;
        EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTARTIVA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTIVA, 0, :VRIVA, :PORC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTIVA;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTIVA, 0, :VRIVA, :PORC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTIVA;
            END
        END /* RTIVA */
      END
    /* RETENCION DE ICA */
    if ((RTICA = 'C') or (RTICA = 'K')) then
      BEGIN
      execute procedure redondee(VRRTICA, DIG) returning_values (VRRTICA);
      if (VRRTICA <> 0) then
        BEGIN
        if (RTICA = 'C') then
            CTARTICA = TCTARTICA;
        EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTARTICA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTICA, 0, :VRSUBT, :PRTICA, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTICA;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTICA, 0, :VRSUBT, :PRTICA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTICA;
            END
        END /* RTICA */
      END
    /* CIERRE EL COMPROBANTE CONTRA LA CUENTA DEL TERCERO O LA CONSTANTE */
    if ((SUMA <> 0) and ((CARTERA = 'C') or (CARTERA = 'K') or (CARTERA = 'J'))) then
        BEGIN
        if (SUMA < 0) then
            BEGIN
            DEBITO = SUMA * -1;
            CREDITO = 0;
            END
        ELSE
            BEGIN
            DEBITO = 0;
            CREDITO = SUMA;
            END
        if (CARTERA = 'C') then
            CTACARTERA = TCTACLIEN;
        if (CARTERA = 'J') then
            BEGIN
            /* BUSQUE LA CUENTA DE LA CAJA */
            SELECT CAJA_CUENTA FROM CAJAS C, PUNTO_VENTA P
                WHERE P.CAJA_ID = C.CAJA_ID AND PTVT_ID = :PTOVTA
                INTO :CTACARTERA;
            END
        EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTACARTERA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :DEBITO, :CREDITO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
        if (TIPOCUEN = 'N') then
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :DEBITO, :CREDITO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
        NROI = NROI + 1;
        END /* SUMA EN CARTERA */
    /* CALCULE COSTOS EN VENTAS */
    EXECUTE PROCEDURE COSTO_EN_VENTAS(31, :IDDOC);
    if (COSTOS = 'A') then
        BEGIN
        FOR SELECT MAX(CTACOS), SUM(CAST(CANT AS DOUBLE PRECISION) * COSTO)
            FROM COSTO_VENTAS WHERE TIDO_COD = 31 AND COVE_ID = :IDDOC
            GROUP BY CTACOS
            INTO :CTACOSTOS, :MONTO
        DO
            BEGIN
            if (MONTO <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTACOSTOS, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT ARTI_COD, CANT * COSTO
                        FROM COSTO_VENTAS WHERE TIDO_COD = 31 AND COVE_ID = :IDDOC AND CTACOS = :CUENTA
                        INTO :ART, :MONTO
                    DO
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    NROI = NROI + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    END
                END /* MONTO <> 0 */
            END /* FOR */
        END /* COSTOS */
    if (COSTOS = 'K') then
        BEGIN
        SELECT SUM(CAST(CANT AS DOUBLE PRECISION) * COSTO)
            FROM COSTO_VENTAS WHERE TIDO_COD = 31 AND COVE_ID = :IDDOC
            INTO :MONTO;
        if (MONTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTACOSTOS, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, REGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT ARTI_COD, CANT * COSTO
                    FROM COSTO_VENTAS WHERE TIDO_COD = 31 AND COVE_ID = :IDDOC
                    INTO :ART, :MONTO
                DO
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTACOSTOS, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                    NROI = NROI + 1;
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTACOSTOS, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTACOSTOS, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                END
            END /* MONTO <> 0 */
        END /* COSTOS = K */
    if (INVEN = 'A') then
        BEGIN
        FOR SELECT MAX(CTAINV), SUM(CAST(CANT AS DOUBLE PRECISION) * COSTO)
            FROM COSTO_VENTAS WHERE TIDO_COD = 31 AND COVE_ID = :IDDOC
            GROUP BY CTAINV
            INTO :CTAINVEN, :MONTO
        DO
            BEGIN
            if (MONTO <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTAINVEN, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, REGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT ARTI_COD, CANT * COSTO
                        FROM COSTO_VENTAS WHERE TIDO_COD = 31 AND COVE_ID = :IDDOC AND CTAINV = :CUENTA
                        INTO :ART, :MONTO
                    DO
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    NROI = NROI + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    END
                END /* MONTO <> 0 */
            END /* FOR */
        END /* INVEN = A */
    if (INVEN = 'K') then
        BEGIN
        SELECT SUM(CAST(CANT AS DOUBLE PRECISION) * COSTO)
            FROM COSTO_VENTAS WHERE TIDO_COD = 31 AND COVE_ID = :IDDOC
            INTO :MONTO;
        if (MONTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTAINVEN, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT ARTI_COD, CANT * COSTO
                    FROM COSTO_VENTAS WHERE TIDO_COD = 31 AND COVE_ID = :IDDOC
                    INTO :ART, :MONTO
                DO
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTAINVEN, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                    NROI = NROI + 1;
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAINVEN, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAINVEN, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                END
            END /* MONTO <> 0 */
        END /* INVEN = K */
    /* recorra las cuentas adicionales */
    FOR SELECT INVC_CUENTA, INVC_BASE, INVC_PORC, INVC_VALOR, INVC_DB
        FROM INTERFAZ_VENTAS_CTAS
        WHERE INVE_ID = :IDINTER
        INTO :CTADIC, :BASEADIC, :PORCADIC, :VALORADIC, :DBADIC
        DO
        BEGIN
        if (VALORADIC <> 0) then
            MONTO = VALORADIC;
        ELSE
            BEGIN
            if (:BASEADIC = 'SUBTOTAL') then
                VALORADIC = vrsubt;
            if (:BASEADIC = 'DESCUENTO') then
                VALORADIC = VRDTO;
            if (:BASEADIC = 'IVA') then
                VALORADIC = VRIVA;
            if (:BASEADIC = 'ADICIONAL') then
                VALORADIC = VRADIC;
            if (:BASEADIC = 'EXTRA') then
                VALORADIC = VREXTRA;
            if (:BASEADIC = 'TOTAL') then
                VALORADIC = VRTOTAL;
            MONTO = VALORADIC * PORCADIC / 100;
            END
        if (MONTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTADIC, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                if (DBADIC = 'S') then
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                ELSE
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                if (DBADIC = 'S') then
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                ELSE
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                END
            NROI = NROI + 1;
            END
        END
    if (ERROR > 0) then
        VER = 'S';
    SUSPEND;
    END /* NO ANULADO */
  END /* EXISTE LA INTERFAZ */
ELSE
    BEGIN
    EXECUTE PROCEDURE ERROR (31, :IDDOC, :PREF, 1);
    ERROR = ERROR + 1;
    VER = 'S';
    SUSPEND;
    END
END

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE EXPORTA_FACTURAS(
    INI DATE,
    FIN DATE)
RETURNS (
    IDDOC INTEGER,
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA VARCHAR(8),
    VENCE VARCHAR(8),
    NIT VARCHAR(15),
    VENDEDOR INTEGER,
    BODEGA VARCHAR(2),
    OBSERVACION VARCHAR(255),
    ITEM INTEGER,
    CUENTA VARCHAR(20),
    PROY VARCHAR(4),
    CENTRO VARCHAR(4),
    ARTICULO VARCHAR(15),
    DESCR VARCHAR(60),
    LOTE VARCHAR(15),
    CANT NUMERIC(18,4),
    MONTO NUMERIC(18,2),
    DB CHAR(1))
AS
declare variable TOTAL NUMERIC(18,2);
declare variable CARTERA CHAR(1);
declare variable FECAUX DATE;
declare variable VENCEAUX DATE;
declare variable SUMA NUMERIC(18,2);
BEGIN
/* FACTURAS DEL RANGO QUE NO SE HAN TRANSMITIDO */
FOR SELECT FACT_ID, F.PREF_PRE, FACT_NUMERO, FACT_FECHA, FACT_VENCE, FACT_TOTAL, TERC_NIT, PREF_PROY, PREF_CENTRO, VEND_COD, BODE_COD, FACT_OBS
    FROM FACTURAS F, PREFIJOS P
    WHERE F.PREF_PRE = P.PREF_PRE AND P.TIDO_COD = 31 AND FACT_FECHA >= :INI AND FACT_FECHA <= :FIN AND FACT_TRANSMIT = 'N'
    INTO :IDDOC, :PREFIJO, :NUMERO, :FECAUX, :VENCEAUX, :TOTAL, :NIT, :PROY, :CENTRO, :VENDEDOR, :BODEGA, :OBSERVACION
    DO
    BEGIN
    EXECUTE PROCEDURE FECHA_A_CONTA(:FECAUX) returning_values (:FECHA);
    EXECUTE PROCEDURE FECHA_A_CONTA(:VENCEAUX) returning_values (:VENCE);
    SUMA = 0;
    /* VENTAS */
    FOR SELECT F.ARTI_COD, FADE_DESC, COAR_CTAVNT, FADE_LOTE, FADE_CANT, FADE_CANT * (FADE_PRUNIT - FADE_DTOMONTO), 'C'
        FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_DETALLE F
        WHERE F.FACT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
        INTO :ARTICULO, :DESCR, :CUENTA, :LOTE, :CANT, :MONTO, :DB
        DO
            BEGIN
            SUMA = SUMA + MONTO;
            SUSPEND;
            END
    /* IVA */
    FOR SELECT F.FADE_ITEM, F.ARTI_COD, FADE_DESC, COAR_CTAIVAV, FADE_LOTE, FADE_CANT, FADE_IVAMONTO, 'C'
        FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_DETALLE F
        WHERE F.FACT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
        INTO :ITEM, :ARTICULO, :DESCR, :CUENTA, :LOTE, :CANT, :MONTO, :DB
        DO 
            BEGIN
            SUMA = SUMA + MONTO;
            SUSPEND;
            END
    /* TOTAL */
    SELECT MAX(INVE_CARTERA), MAX(INVE_CTACARTERA)
    FROM INTERFAZ_VENTAS I
    WHERE TIDO_COD = 31 AND PREF_PRE = :PREFIJO
    INTO :CARTERA, :CUENTA;
    if (CARTERA = 'C') then
        SELECT TERC_CTACLIENTE FROM TERCEROS WHERE TERC_NIT = :NIT INTO :CUENTA;
    ARTICULO = '';
    DESCR = '';
    LOTE = '000';
    CANT = 0;
    MONTO = SUMA;
    DB = 'D';
    SUSPEND;
    /* INVENTARIO */
    EXECUTE PROCEDURE COSTO_EN_VENTAS(31, :IDDOC);
    FOR SELECT C.ARTI_COD, ARTI_DES, CTAINV, '000', CANT, CANT * COSTO, 'C'
        FROM COSTO_VENTAS C, ARTICULO A
        WHERE C.ARTI_COD = A.ARTI_COD AND TIDO_COD = 31 AND COVE_ID = :IDDOC
        INTO :ARTICULO, :DESCR, :CUENTA, :LOTE, :CANT, :MONTO, :DB
        DO SUSPEND;
    /* COSTO */
    FOR SELECT C.ARTI_COD, ARTI_DES, CTACOS, '000', CANT, CANT * COSTO, 'D'
        FROM COSTO_VENTAS C, ARTICULO A
        WHERE C.ARTI_COD = A.ARTI_COD AND TIDO_COD = 31 AND COVE_ID = :IDDOC
        INTO :ARTICULO, :DESCR, :CUENTA, :LOTE, :CANT, :MONTO, :DB
        DO SUSPEND;
    END
  SUSPEND;
END

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE RECONTABILICE_COSTOS_VENTAS(
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    ID INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    IDC INTEGER)
AS
declare variable IDI INTEGER;
begin
FOR SELECT FACT_ID, PREF_PRE, FACT_NUMERO FROM FACTURAS WHERE fact_anulado = 'N' and FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN ORDER BY FACT_FECHA, FACT_ID INTO :ID, :PREF, :NUMERO
    do  
    BEGIN
    SELECT MAX(INVE_ID) FROM INTERFAZ_VENTAS WHERE PREF_PRE = :PREF AND TIDO_COD = 31 INTO :IDI;
    EXECUTE PROCEDURE CONTABILICE_COSTO_VENTAS(31, :ID, :IDI) returning_values (:IDC);
    suspend;
    END
FOR SELECT DEVT_ID, PREF_PRE, DEVT_NUMERO FROM devoluciones_ventas WHERE devt_anulado = 'N' and DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN ORDER BY DEVT_FECHA, DEVT_ID INTO :ID, :PREF, :NUMERO
    do  
    BEGIN
    SELECT MAX(INVE_ID) FROM INTERFAZ_VENTAS WHERE PREF_PRE = :PREF AND TIDO_COD = 33 INTO :IDI;
    EXECUTE PROCEDURE CONTABILICE_COSTO_VENTAS(33, :ID, :IDI) returning_values (:IDC);
    suspend;
    END
end

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE DEVOLUCIONES_SIN_CONTABILIDAD(
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    ID INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    ESTADO VARCHAR(20),
    IDI INTEGER,
    IDC INTEGER)
AS
DECLARE VARIABLE VER CHAR(2);
declare variable FECICNT VARCHAR(10);
declare variable FECFCNT VARCHAR(10);
declare variable ERROR INTEGER;
declare variable idref INTEGER;
BEGIN
EXECUTE PROCEDURE fecha_a_conta(FECINI) returning_values (FECICNT);
EXECUTE PROCEDURE fecha_a_conta(FECFIN) returning_values (FECFCNT);
FOR SELECT DEVT_ID, PREF_PRE, DEVT_NUMERO FROM devoluciones_ventas WHERE DEVT_ANULADO = 'N' AND
    DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN
    INTO :ID, :PREF, :NUMERO
DO
  BEGIN
  idref = null;
  SELECT ENCO_IDREF FROM COMPROBANTE_ENCABEZADO WHERE ENCO_TIPOREF = 33 AND ENCO_FECHA >= :FECICNT AND ENCO_FECHA <= :FECFCNT and ENCO_IDREF = :id into :idref;
  if (idref IS NULL) then
  begin
   ESTADO = 'PROCESANDO';
   SUSPEND;
   SELECT MAX(INVE_ID) FROM INTERFAZ_VENTAS WHERE PREF_PRE = :PREF AND TIDO_COD = 33 INTO :IDI;
   EXECUTE PROCEDURE contabil_devolcli (:ID, :IDI) RETURNING_VALUES (:ERROR, :VER, :IDC);
   if (ERROR = 0) then
    BEGIN
    EXECUTE PROCEDURE CONTABILIZA_PENDIENTE (:IDC);
    ESTADO = 'OK';
    END
   ELSE
    ESTADO = 'ERROR';
   suspend;
  End
  END
END

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE CONTADO_MVERDE(
    FECINI DATE,
    FECFIN DATE,
    PREF VARCHAR(4))
RETURNS (
    FECHA DATE,
    PUNTO INTEGER,
    IDC INTEGER,
    ERROR INTEGER,
    VER CHAR(1))
AS
declare variable IDIN INTEGER;
declare variable IDF INTEGER;
declare variable NIT VARCHAR(20);
begin
FECHA = FECINI;
SELECT MAX(INVE_ID) FROM INTERFAZ_VENTAS WHERE TIDO_COD = 31 INTO :IDIN;
WHILE (FECHA <= fecfin) DO
    BEGIN
    /* LAS DE CONTADO */
    FOR SELECT PTVT_ID, TERC_NIT FROM punto_venta ORDER BY PTVT_ID INTO :PUNTO, :NIT
        do
        BEGIN
        EXECUTE PROCEDURE contabil_facturas_contado (FECHA, NIT, PREF, PUNTO, IDIN) returning_values (ERROR,  VER, IDC);
        EXECUTE PROCEDURE contabiliza_pendiente (IDC);
        suspend;
        END
    /* LAS DE CREDITO */
    FOR SELECT FACT_ID, PTVT_ID FROM facturas F WHERE fact_fecha = :fecha and pref_pre = :pref and
        NOT exists (select terc_nit from punto_venta p where terc_nit = f.terc_nit) into : IDF, :PUNTO
        DO
        BEGIN
        EXECUTE PROCEDURE contabil_factura(idf,  IDIN) returning_values (ERROR, VER, IDC);
        EXECUTE PROCEDURE contabiliza_pendiente (IDC);
        suspend;
        END
    FECHA = FECHA + 1;
    END
end

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE FACTURAS_SIN_CONTABILIDAD(
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    ID INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    ESTADO VARCHAR(20),
    IDI INTEGER,
    IDC INTEGER)
AS
DECLARE VARIABLE VER CHAR(2);
declare variable FECICNT VARCHAR(10);
declare variable FECFCNT VARCHAR(10);
declare variable ERROR INTEGER;
declare variable idref INTEGER;
BEGIN
EXECUTE PROCEDURE fecha_a_conta(FECINI) returning_values (FECICNT);
EXECUTE PROCEDURE fecha_a_conta(FECFIN) returning_values (FECFCNT);
FOR SELECT FACT_ID, PREF_PRE, FACT_NUMERO FROM FACTURAS WHERE FACT_ANULADO = 'N' AND
    FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN INTO :ID, :PREF, :NUMERO
DO
  BEGIN
  idref = null;
  SELECT ENCO_IDREF FROM COMPROBANTE_ENCABEZADO WHERE ENCO_TIPOREF = 31 AND ENCO_FECHA >= :FECICNT AND ENCO_FECHA <= :FECFCNT and ENCO_IDREF = :ID into :idref;
  if (idref IS NULL) then
  begin
   ESTADO = 'PROCESANDO';
   ERROR = NULL;
   SUSPEND;
   SELECT MAX(INVE_ID) FROM INTERFAZ_VENTAS WHERE PREF_PRE = :PREF AND TIDO_COD = 31 INTO :IDI;
   EXECUTE PROCEDURE CONTABIL_FACTURA (:ID, :IDI) RETURNING_VALUES (:ERROR, VER, :IDC);
   if ((ERROR = 0) or (error IS NULL)) then
    BEGIN
    EXECUTE PROCEDURE CONTABILIZA_PENDIENTE (:IDC);
    ESTADO = 'OK';
    END
   ELSE
    ESTADO = 'ERROR';
   suspend;
  end
  END
END

^

SET TERM ; ^


SET TERM ^ ;

CREATE OR ALTER procedure REP_UTILIDAD_VENTAS (
    TIPO integer,
    DETALLE char(1),
    FECINI date,
    FECFIN date,
    ARTINI varchar(15),
    ARTFIN varchar(15),
    GRPINI varchar(3),
    GRPFIN varchar(3),
    ORDEN char(1),
    AGRUPA char(1),
    ULTIMO char(1),
    CEROS char(1),
    SUBEMPRESA integer)
returns (
    ARTICULO varchar(15),
    DESCRIPCION varchar(60),
    CODGRUPO varchar(2),
    NOMGRUPO varchar(30),
    CODSUBG varchar(3),
    NOMSUBG varchar(30),
    CODMARC varchar(3),
    NOMMARC varchar(30),
    UNIDAD varchar(8),
    CANTIDAD numeric(18,4),
    BASE numeric(18,4),
    COSTO numeric(18,4),
    UTILIDAD numeric(18,4),
    PORC numeric(9,2),
    IVA numeric(18,4),
    CONSUMO numeric(18,4),
    PREFIJO varchar(4),
    NUMERO varchar(6),
    FECHA date,
    TIPODOC integer,
    PART float)
AS
DECLARE VARIABLE COSTOUNIT NUMERIC(18,4);
DECLARE VARIABLE CANTDET NUMERIC(18,4);
DECLARE VARIABLE TOTAL NUMERIC(18,2);
declare variable CODINI VARCHAR(15);
declare variable CODFIN VARCHAR(15);
declare variable DESINI VARCHAR(15);
declare variable DESFIN VARCHAR(15);
declare variable MARINI VARCHAR(3);
declare variable MARFIN VARCHAR(3);
declare variable UOM VARCHAR(20);
declare variable ULTCOS NUMERIC(18,2);
declare variable IDREP INTEGER;
declare variable ID integer;
declare variable ITEM integer;
BEGIN
if (ORDEN = 'C') then
    BEGIN
    CODINI = ARTINI;
    CODFIN = ARTFIN;
    DESINI = '';
    DESFIN = 'zz';
    END
ELSE
    BEGIN
    DESINI = ARTINI;
    DESFIN = ARTFIN;
    CODINI = '';
    CODFIN = 'zz';
    END
if (AGRUPA = 'G') then
    BEGIN
    MARINI = '';
    MARFIN = 'zz';
    END
ELSE
    if (AGRUPA = 'M') then
        BEGIN
        MARINI = GRPINI;
        MARFIN = GRPFIN;
        GRPINI = '';
        GRPFIN = 'zz';
        END
    ELSE
        BEGIN
        MARINI = '';
        MARFIN = 'zz';
        GRPINI = '';
        GRPFIN = 'zz';
        END
EXECUTE PROCEDURE lee_configuracion ('FACTURACION', 'ARTICULOS', 'SUGERIR PRECIOS CON PORCENTAJE DE MARGEN O UTILIDAD') returning_values (:UOM);
IDREP = GEN_ID(id_reputilidad, 1);
if (DETALLE = 'N') then
    BEGIN
    if (BIN_AND(TIPO, 1) <> 0) then
        BEGIN
        TIPODOC = 31;
        FOR SELECT MAX(D.ARTI_COD), SUM(FADE_CANT * FADE_FACTOR), SUM((FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO)*FACT_FACTOR), SUM(FADE_IVAMONTO*FACT_FACTOR), SUM(FADE_CONSUMO)
            FROM FACTURAS_DETALLE D, FACTURAS F, PREFIJOS P, ARTICULO A
            WHERE F.FACT_ID = D.FACT_ID AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND D.ARTI_COD = A.arti_cod AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            FACT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) and substring(a.arti_cod from 1 FOR 2) <> '.t'
            GROUP BY D.ARTI_COD
            INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO
            DO
            BEGIN
            COSTO = 0;
            FOR SELECT FADE_CANT * FADE_FACTOR, FACT_FECHA, F.FACT_ID, FADE_ITEM FROM FACTURAS_DETALLE D, FACTURAS F, PREFIJOS P
                WHERE F.FACT_ID = D.FACT_ID AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND
                FACT_ANULADO = 'N' AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                and D.ARTI_COD = :articulo  INTO :cantdet, :fecha, :id, :item
                DO
                BEGIN
                if (EXISTS (SELECT COST_SALP / COST_SALC FROM COSTOS C, MOVIMIENTO_ARTICULO M
                    WHERE C.arti_cod = M.arti_cod AND COST_IDMOV = MVAR_CONS AND MVAR_TIPODOC = 31 AND MVAR_IDREF = :ID AND COST_SALC <> 0 AND MVAR_ITEM = :ITEM)) then
                    SELECT COST_SALP / COST_SALC, COST_ULTIMO FROM COSTOS C, MOVIMIENTO_ARTICULO M
                    WHERE C.arti_cod = M.arti_cod AND COST_IDMOV = MVAR_CONS AND MVAR_TIPODOC = 31 AND MVAR_IDREF = :ID AND COST_SALC <> 0 AND MVAR_ITEM = :ITEM INTO :costounit, :ultcos;
                else
                    EXECUTE PROCEDURE costo_promedio_y_ultimo(:ARTICULO, :FECHA) returning_values (:costounit, :ultcos);
                if (ULTIMO = 'S') then
                    COSTO = COSTO + ultcos * cantdet;
                else
                    COSTO = COSTO + costounit * cantdet;
                END
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            INSERT INTO REP_UTILIDAD(ID, TIPO, CODIGO, BASE, IVA, CONSUMO, COSTO) VALUES (:IDREP, 31, :articulo, :base, :iva, :consumo, :costo);
            if (CEROS = 'S') then
                INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (2, USER, :ARTICULO);
            END /* FOR */
        SELECT SUM(BASE-COSTO) FROM REP_UTILIDAD WHERE id = :IDREP AND TIPO = 31 INTO :TOTAL;
        FOR SELECT ARTI_COD, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD FROM ARTICULO A
            WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND
            (A.MARC_COD <= :MARFIN))) AND substring(a.arti_cod from 1 FOR 2) <> '.t'
            INTO :ARTICULO, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
            DO
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            BASE = 0;
            IVA = 0;
            CONSUMO = 0;
            COSTO = 0;
            UTILIDAD = 0;
            PORC = 0;
            PART = 0;
            SELECT BASE, IVA, CONSUMO, COSTO FROM rep_utilidad WHERE ID = :IDREP AND TIPO = 31 AND CODIGO = :articulo INTO :BASE, :IVA, :consumo,  :costo;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            EXECUTE PROCEDURE PORCENTAJE (utilidad,  TOTAL, 'S') returning_values (part);
            if ((CEROS = 'S') or (BASE <> 0) or (COSTO <> 0)) then
                SUSPEND;
            END /* FOR */
            BEGIN
            COSTO = 0;
            END
        END
    if (BIN_AND(TIPO, 2) <> 0) then
        BEGIN
        TIPODOC = 32;
        FOR SELECT MAX(D.ARTI_COD), SUM(RVDE_CANT * RVDE_FACTOR), SUM(RVDE_TOTAL-RVDE_IVAMONTO-RVDE_CONSUMO), SUM(RVDE_IVAMONTO), SUM(RVDE_CONSUMO)
            FROM REMISIONES_VENTA_DETALLE D, REMISIONES_VENTA R, PREFIJOS P, ARTICULO A
            WHERE R.REVT_ID = D.REVT_ID AND P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = 32 AND D.ARTI_COD = A.arti_cod AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            REVT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY D.ARTI_COD
            INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO
            DO
            BEGIN
            COSTO = 0;
            FOR SELECT RVDE_CANT * RVDE_FACTOR, REVT_FECHA, F.REVT_ID, RVDE_ITEM FROM remisiones_venta_detalle D, remisiones_venta F, PREFIJOS P
                WHERE F.revt_id = D.revt_id AND REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN AND
                REVT_ANULADO = 'N' AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 32 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                and D.ARTI_COD = :articulo  INTO :cantdet, :fecha, :id, :item
                DO
                BEGIN
                if (EXISTS (SELECT COST_SALP / COST_SALC FROM COSTOS C, MOVIMIENTO_ARTICULO M
                    WHERE C.arti_cod = M.arti_cod AND COST_IDMOV = MVAR_CONS AND MVAR_TIPODOC = 32 AND MVAR_IDREF = :ID AND COST_SALC <> 0 AND MVAR_ITEM = :ITEM)) then
                    SELECT COST_SALP / COST_SALC, cost_ultimo FROM COSTOS C, MOVIMIENTO_ARTICULO M
                    WHERE C.arti_cod = M.arti_cod AND COST_IDMOV = MVAR_CONS AND MVAR_TIPODOC = 32 AND MVAR_IDREF = :ID AND COST_SALC <> 0 AND MVAR_ITEM = :ITEM INTO :costounit, :ultcos;
                else
                    EXECUTE PROCEDURE costo_promedio_y_ultimo(:ARTICULO, :FECHA) returning_values (:costounit, :ultcos);
                if (ULTIMO = 'S') then
                    COSTO = COSTO + ultcos * cantdet;
                else
                    COSTO = COSTO + costounit * cantdet;
                END
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            if (CEROS = 'S') then
                INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (2, USER, :ARTICULO);
            INSERT INTO REP_UTILIDAD(ID, TIPO, CODIGO, BASE, IVA, CONSUMO, COSTO) VALUES (:IDREP, 32, :articulo, :base, :iva, :consumo, :costo);
            END /* FOR */
        SELECT SUM(BASE-COSTO) FROM REP_UTILIDAD WHERE id = :IDREP AND TIPO = 32 INTO :TOTAL;
        FOR SELECT ARTI_COD, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD FROM ARTICULO A
            WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND
            (A.MARC_COD <= :MARFIN))) AND substring(a.arti_cod from 1 FOR 2) <> '.t'
            INTO :ARTICULO, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
            DO
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            BASE = 0;
            IVA = 0;
            CONSUMO = 0;
            COSTO = 0;
            UTILIDAD = 0;
            PORC = 0;
            SELECT BASE, IVA, CONSUMO, COSTO FROM rep_utilidad WHERE ID = :IDREP AND TIPO = 32 AND CODIGO = :articulo INTO :BASE, :IVA, :consumo,  :costo;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            EXECUTE PROCEDURE PORCENTAJE (utilidad,  TOTAL, 'S') returning_values (part);
            if ((CEROS = 'S') or (BASE <> 0) or (COSTO <> 0)) then
                SUSPEND;
            END /* FOR */
        END
    if (BIN_AND(TIPO, 4) <> 0) then
        BEGIN
        TIPODOC = 33;
        FOR SELECT MAX(D.ARTI_COD), SUM(DVDE_CANT * DVDE_FACTOR), SUM((DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO)*DEVT_FACTOR), SUM(DVDE_IVAMONTO*DEVT_FACTOR), SUM(DVDE_CONSUMO)
            FROM devoluciones_ventas_detalle D, DEVOLUCIONES_VENTAS V, PREFIJOS P, ARTICULO A
            WHERE V.DEVT_ID = D.DEVT_ID AND P.PREF_PRE = V.PREF_PRE AND P.TIDO_COD = 33 AND D.ARTI_COD = A.arti_cod AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            DEVT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY D.ARTI_COD
            INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO
            DO
            BEGIN
            COSTO = 0;
            FOR SELECT DVDE_CANT * DVDE_FACTOR, DEVT_FECHA, F.DEVT_ID, DVDE_ITEM FROM devoluciones_ventas_detalle D, devoluciones_ventas F, PREFIJOS P
                WHERE F.devt_id = D.devt_id AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND
                DEVT_ANULADO = 'N' AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 33 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                and D.ARTI_COD = :articulo  INTO :cantdet, :fecha, :id, :item
                DO
                BEGIN
                if (EXISTS (SELECT COST_ENTP / COST_ENTC FROM COSTOS C, MOVIMIENTO_ARTICULO M
                    WHERE C.arti_cod = M.arti_cod AND COST_IDMOV = MVAR_CONS AND MVAR_TIPODOC = 33 AND MVAR_IDREF = :ID AND COST_ENTC <> 0 AND MVAR_ITEM = :ITEM)) then
                    SELECT COST_ENTP / COST_ENTC, COST_ULTIMO FROM COSTOS C, MOVIMIENTO_ARTICULO M
                        WHERE C.arti_cod = M.arti_cod AND COST_IDMOV = MVAR_CONS AND MVAR_TIPODOC = 33 AND MVAR_IDREF = :ID AND COST_ENTC <> 0 AND MVAR_ITEM = :ITEM INTO :costounit, :ultcos;
                else
                    EXECUTE PROCEDURE costo_promedio_y_ultimo(:ARTICULO, :FECHA) returning_values (:costounit, :ultcos);
                if (ULTIMO = 'S') then
                    COSTO = COSTO + ultcos * cantdet;
                else
                    COSTO = COSTO + costounit * cantdet;
                END
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            else
                CANTIDAD = CANTIDAD * -1;
            if (BASE IS NULL) then
                BASE = 0;
            else
                BASE = BASE * -1;
            if (IVA IS NULL) then
                IVA = 0;
            else
                IVA = IVA * -1;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            else
                CONSUMO = CONSUMO * -1;
            COSTO = costo * -1;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            if (CEROS = 'S') then
                INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (2, USER, :ARTICULO);
            INSERT INTO REP_UTILIDAD(ID, TIPO, CODIGO, BASE, IVA, CONSUMO, COSTO) VALUES (:IDREP, 33, :articulo, :base, :iva, :consumo, :costo);
            END /* FOR */
        SELECT SUM(BASE-COSTO) FROM REP_UTILIDAD WHERE id = :IDREP AND TIPO = 33 INTO :TOTAL;
        FOR SELECT ARTI_COD, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD FROM ARTICULO A
            WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND
            (A.MARC_COD <= :MARFIN))) AND substring(a.arti_cod from 1 FOR 2) <> '.t'
            INTO :ARTICULO, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
            DO
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            BASE = 0;
            IVA = 0;
            CONSUMO = 0;
            COSTO = 0;
            UTILIDAD = 0;
            PORC = 0;
            SELECT BASE, IVA, CONSUMO, COSTO FROM rep_utilidad WHERE ID = :IDREP AND TIPO = 33 AND CODIGO = :articulo INTO :BASE, :IVA, :consumo,  :costo;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            EXECUTE PROCEDURE PORCENTAJE (utilidad,  TOTAL, 'S') returning_values (part);
            if ((CEROS = 'S') or (BASE <> 0) or (COSTO <> 0)) then
                SUSPEND;
            END /* FOR */
        END
    if (BIN_AND(TIPO, 8) <> 0) then
        BEGIN
        TIPODOC = 34;
        /* BORRA LA TABLA AUXILIAR */
        DELETE FROM reportes_aux WHERE REPA_ID = 2 AND REPA_USER = USER;

        FOR SELECT MAX(D.ARTI_COD), SUM(PEDE_CANT * PEDE_FACTOR), SUM((PEDE_TOTAL-PEDE_IVAMONTO-PEDE_CONSUMO)*PEDI_FACTOR), SUM(PEDE_IVAMONTO*PEDI_FACTOR), SUM(PEDE_CONSUMO)
            FROM PEDIDOS_DETALLE D, PEDIDOS P, PREFIJOS R, ARTICULO A
            WHERE P.PEDI_ID = D.PEDI_ID AND P.PREF_PRE = R.PREF_PRE AND R.TIDO_COD = 34 AND D.ARTI_COD = A.arti_cod AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            PEDI_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY D.ARTI_COD
            INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO
            DO
            BEGIN
            COSTO = 0;
            FOR SELECT PEDE_CANT * PEDE_FACTOR, PEDI_FECHA FROM pedidos_detalle D, pedidos F, PREFIJOS P
                WHERE F.pedi_id = D.pedi_id AND PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND
                PEDI_ANULADO = 'N' AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                and D.ARTI_COD = :articulo  INTO :cantdet, :fecha
                DO
                BEGIN
                EXECUTE PROCEDURE costo_promedio_y_ultimo(:ARTICULO, :FECHA) returning_values (:costounit, :ultcos);
                if (ULTIMO = 'S') then
                    COSTO = COSTO + ultcos * cantdet;
                else
                    COSTO = COSTO + costounit * cantdet;
                END
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            if (CEROS = 'S') then
                INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (2, USER, :ARTICULO);
            INSERT INTO REP_UTILIDAD(ID, TIPO, CODIGO, BASE, IVA, CONSUMO, COSTO) VALUES (:IDREP, 34, :articulo, :base, :iva, :consumo, :costo);
            END /* FOR */
        SELECT SUM(BASE-COSTO) FROM REP_UTILIDAD WHERE id = :IDREP AND TIPO = 34 INTO :TOTAL;
        FOR SELECT ARTI_COD, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD FROM ARTICULO A
            WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND
            (A.MARC_COD <= :MARFIN))) AND substring(a.arti_cod from 1 FOR 2) <> '.t'
            INTO :ARTICULO, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
            DO
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            BASE = 0;
            IVA = 0;
            CONSUMO = 0;
            COSTO = 0;
            UTILIDAD = 0;
            PORC = 0;
            SELECT BASE, IVA, CONSUMO, COSTO FROM rep_utilidad WHERE ID = :IDREP AND TIPO = 34 AND CODIGO = :articulo INTO :BASE, :IVA, :consumo,  :costo;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            EXECUTE PROCEDURE PORCENTAJE (utilidad,  TOTAL, 'S') returning_values (part);
            if ((CEROS = 'S') or (BASE <> 0) or (COSTO <> 0)) then
                SUSPEND;
            END /* FOR */
        END
    if (BIN_AND(TIPO, 16) <> 0) then
        BEGIN
        TIPODOC = 35;
        FOR SELECT MAX(D.ARTI_COD), SUM(CTDE_CANT * CTDE_FACTOR), SUM((CTDE_TOTAL-CTDE_IVAMONTO-CTDE_CONSUMO)*COTI_FACTOR), SUM(CTDE_IVAMONTO), SUM(CTDE_CONSUMO)
            FROM COTIZACIONES_DETALLE D, COTIZACIONES C, PREFIJOS P, ARTICULO A
            WHERE C.COTI_ID = D.COTI_ID AND P.PREF_PRE = C.PREF_PRE AND P.TIDO_COD = 35 AND D.ARTI_COD = A.arti_cod AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND COTI_FECHA >= :FECINI AND COTI_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            COTI_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY D.ARTI_COD
            INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO
            DO
            BEGIN
            COSTO = 0;
            FOR SELECT CTDE_CANT * CTDE_FACTOR, COTI_FECHA FROM cotizaciones_detalle D, cotizaciones F, PREFIJOS P
                WHERE F.coti_id = D.coti_id AND COTI_FECHA >= :FECINI AND COTI_FECHA <= :FECFIN AND
                COTI_ANULADO = 'N' AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 35 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                and D.ARTI_COD = :articulo  INTO :cantdet, :fecha
                DO
                BEGIN
                EXECUTE PROCEDURE costo_promedio_y_ultimo(:ARTICULO, :FECHA) returning_values (:costounit, :ultcos);
                if (ULTIMO = 'S') then
                    COSTO = COSTO + ultcos * cantdet;
                else
                    COSTO = COSTO + costounit * cantdet;
                END
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            if (CEROS = 'S') then
                INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (2, USER, :ARTICULO);
            INSERT INTO REP_UTILIDAD(ID, TIPO, CODIGO, BASE, IVA, CONSUMO, COSTO) VALUES (:IDREP, 35, :articulo, :base, :iva, :consumo, :costo);
            END /* FOR */
        SELECT SUM(BASE-COSTO) FROM REP_UTILIDAD WHERE id = :IDREP AND TIPO = 35 INTO :TOTAL;
        FOR SELECT ARTI_COD, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD FROM ARTICULO A
            WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND
            (A.MARC_COD <= :MARFIN))) AND substring(a.arti_cod from 1 FOR 2) <> '.t'
            INTO :ARTICULO, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
            DO
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            BASE = 0;
            IVA = 0;
            CONSUMO = 0;
            COSTO = 0;
            UTILIDAD = 0;
            PORC = 0;
            SELECT BASE, IVA, CONSUMO, COSTO FROM rep_utilidad WHERE ID = :IDREP AND TIPO = 35 AND CODIGO = :articulo INTO :BASE, :IVA, :consumo,  :costo;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            EXECUTE PROCEDURE PORCENTAJE (utilidad,  TOTAL, 'S') returning_values (part);
            if ((CEROS = 'S') or (BASE <> 0) or (COSTO <> 0)) then
                SUSPEND;
            END /* FOR */
        END
    END
ELSE
  if (DETALLE = 'G') then
    BEGIN
    if (BIN_AND(TIPO, 1) <> 0) then
        BEGIN
        TIPODOC = 31;
        FOR SELECT MAX(a.grup_cod), SUM((FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO)*FACT_FACTOR), SUM(FADE_IVAMONTO*FACT_FACTOR), SUM(FADE_CONSUMO)
            FROM FACTURAS_DETALLE D, FACTURAS F, PREFIJOS P, ARTICULO A
            WHERE F.FACT_ID = D.FACT_ID AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND D.ARTI_COD = A.arti_cod AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            FACT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) and substring(a.arti_cod from 1 FOR 2) <> '.t'
            GROUP BY a.grup_cod
            INTO :codgrupo, :BASE, :IVA, :CONSUMO
            DO
            BEGIN
            COSTO = 0;
            FOR SELECT D.arti_cod, FADE_CANT * FADE_FACTOR, FACT_FECHA, F.fact_id, D.fade_item FROM FACTURAS_DETALLE D, FACTURAS F, PREFIJOS P, ARTICULO A
                WHERE A.arti_cod = D.arti_cod AND F.FACT_ID = D.FACT_ID AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND
                FACT_ANULADO = 'N' AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                and a.grup_cod = :codgrupo INTO :ARTICULO, cantdet, :fecha, :id, :item
                DO
                BEGIN
                if (EXISTS (SELECT COST_SALP / COST_SALC FROM COSTOS C, MOVIMIENTO_ARTICULO M
                    WHERE C.arti_cod = M.arti_cod AND COST_IDMOV = MVAR_CONS AND MVAR_TIPODOC = 31 AND MVAR_IDREF = :ID AND COST_SALC <> 0 AND MVAR_ITEM = :ITEM)) then
                    SELECT COST_SALP / COST_SALC, COST_ULTIMO FROM COSTOS C, MOVIMIENTO_ARTICULO M
                        WHERE C.arti_cod = M.arti_cod AND COST_IDMOV = MVAR_CONS AND MVAR_TIPODOC = 31 AND MVAR_IDREF = :ID AND COST_SALC <> 0 AND MVAR_ITEM = :ITEM INTO :costounit, :ultcos;
                else
                    EXECUTE PROCEDURE costo_promedio_y_ultimo(:ARTICULO, :FECHA) returning_values (:costounit, :ultcos);
                if (ULTIMO = 'S') then
                    COSTO = COSTO + ultcos * cantdet;
                else
                    COSTO = COSTO + costounit * cantdet;
                END
            CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            INSERT INTO REP_UTILIDAD(ID, TIPO, CODIGO, BASE, IVA, CONSUMO, COSTO) VALUES (:IDREP, 31, :codgrupo, :base, :iva, :consumo, :costo);
            if (CEROS = 'S') then
                INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (2, USER, :codgrupo);
            END /* FOR */
        SELECT SUM(BASE-COSTO) FROM REP_UTILIDAD WHERE id = :IDREP AND TIPO = 31 INTO :TOTAL;
        FOR SELECT GRUP_COD, GRUP_NOM FROM GRUPO
            WHERE GRUP_COD >= :GRPINI AND GRUP_COD <= :grpfin
            INTO :ARTICULO, :DESCRIPCION
            DO
            BEGIN
            BASE = 0;
            IVA = 0;
            CONSUMO = 0;
            COSTO = 0;
            UTILIDAD = 0;
            PORC = 0;
            PART = 0;
            SELECT BASE, IVA, CONSUMO, COSTO FROM rep_utilidad WHERE ID = :IDREP AND TIPO = 31 AND CODIGO = :articulo INTO :BASE, :IVA, :consumo,  :costo;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            EXECUTE PROCEDURE PORCENTAJE (utilidad,  TOTAL, 'S') returning_values (part);
            if ((CEROS = 'S') or (BASE <> 0) or (COSTO <> 0)) then
                SUSPEND;
            END /* FOR */
            BEGIN
            COSTO = 0;
            END
        END
    if (BIN_AND(TIPO, 2) <> 0) then
        BEGIN
        TIPODOC = 32;
        FOR SELECT MAX(a.grup_cod), SUM(RVDE_TOTAL-RVDE_IVAMONTO-RVDE_CONSUMO), SUM(RVDE_IVAMONTO), SUM(RVDE_CONSUMO)
            FROM REMISIONES_VENTA_DETALLE D, REMISIONES_VENTA R, PREFIJOS P, ARTICULO A
            WHERE R.REVT_ID = D.REVT_ID AND P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = 32 AND D.ARTI_COD = A.arti_cod AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            REVT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY a.grup_cod
            INTO :codgrupo, :BASE, :IVA, :CONSUMO
            DO
            BEGIN
            COSTO = 0;
            FOR SELECT D.arti_cod, RVDE_CANT * RVDE_FACTOR, REVT_FECHA, F.REVT_ID, RVDE_ITEM FROM remisiones_venta_detalle D, remisiones_venta F, PREFIJOS P, ARTICULO A
                WHERE A.arti_cod = D.arti_cod AND F.revt_id = D.revt_id AND REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN AND
                REVT_ANULADO = 'N' AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 32 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                and a.grup_cod = :codgrupo INTO :ARTICULO, cantdet, :fecha, :ID, :ITEM
                DO
                BEGIN
                if (EXISTS (SELECT COST_SALP / COST_SALC FROM COSTOS C, MOVIMIENTO_ARTICULO M
                    WHERE C.arti_cod = M.arti_cod AND COST_IDMOV = MVAR_CONS AND MVAR_TIPODOC = 32 AND MVAR_IDREF = :ID AND COST_SALC <> 0 AND MVAR_ITEM = :ITEM)) then
                    SELECT COST_SALP / COST_SALC, COST_ULTIMO FROM COSTOS C, MOVIMIENTO_ARTICULO M
                        WHERE C.arti_cod = M.arti_cod AND COST_IDMOV = MVAR_CONS AND MVAR_TIPODOC = 32 AND MVAR_IDREF = :ID AND COST_SALC <> 0 AND MVAR_ITEM = :ITEM INTO :costounit, :ultcos;
                else
                    EXECUTE PROCEDURE costo_promedio_y_ultimo(:ARTICULO, :FECHA) returning_values (:costounit, :ultcos);
                if (ULTIMO = 'S') then
                    COSTO = COSTO + ultcos * cantdet;
                else
                    COSTO = COSTO + costounit * cantdet;
                END
            CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            if (CEROS = 'S') then
                INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (2, USER, :codgrupo);
            INSERT INTO REP_UTILIDAD(ID, TIPO, CODIGO, BASE, IVA, CONSUMO, COSTO) VALUES (:IDREP, 32, :codgrupo, :base, :iva, :consumo, :costo);
            END /* FOR */
        SELECT SUM(BASE-COSTO) FROM REP_UTILIDAD WHERE id = :IDREP AND TIPO = 32 INTO :TOTAL;
        FOR SELECT GRUP_COD, GRUP_NOM FROM GRUPO
            WHERE GRUP_COD >= :GRPINI AND GRUP_COD <= :grpfin
            INTO :ARTICULO, :DESCRIPCION
            DO
            BEGIN
            BASE = 0;
            IVA = 0;
            CONSUMO = 0;
            COSTO = 0;
            UTILIDAD = 0;
            PORC = 0;
            SELECT BASE, IVA, CONSUMO, COSTO FROM rep_utilidad WHERE ID = :IDREP AND TIPO = 32 AND CODIGO = :articulo INTO :BASE, :IVA, :consumo,  :costo;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            EXECUTE PROCEDURE PORCENTAJE (utilidad,  TOTAL, 'S') returning_values (part);
            if ((CEROS = 'S') or (BASE <> 0) or (COSTO <> 0)) then
                SUSPEND;
            END /* FOR */
        END
    if (BIN_AND(TIPO, 4) <> 0) then
        BEGIN
        TIPODOC = 33;
        FOR SELECT MAX(a.grup_cod), SUM((DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO)*DEVT_FACTOR), SUM(DVDE_IVAMONTO*DEVT_FACTOR), SUM(DVDE_CONSUMO)
            FROM devoluciones_ventas_detalle D, DEVOLUCIONES_VENTAS V, PREFIJOS P, ARTICULO A
            WHERE V.DEVT_ID = D.DEVT_ID AND P.PREF_PRE = V.PREF_PRE AND P.TIDO_COD = 33 AND D.ARTI_COD = A.arti_cod AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            DEVT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY a.grup_cod
            INTO :codgrupo, :BASE, :IVA, :CONSUMO
            DO
            BEGIN
            COSTO = 0;
            FOR SELECT D.arti_cod, DVDE_CANT * DVDE_FACTOR, DEVT_FECHA, F.devt_id, D.dvde_item FROM devoluciones_ventas_detalle D, devoluciones_ventas F, PREFIJOS P, ARTICULO A
                WHERE A.arti_cod = D.arti_cod AND F.devt_id = D.devt_id AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND
                DEVT_ANULADO = 'N' AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 33 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                and a.grup_cod = :codgrupo INTO :ARTICULO, cantdet, :fecha, :ID, :ITEM
                DO
                BEGIN
                if (EXISTS (SELECT COST_ENTP / COST_ENTC FROM COSTOS C, MOVIMIENTO_ARTICULO M
                    WHERE C.arti_cod = M.arti_cod AND COST_IDMOV = MVAR_CONS AND MVAR_TIPODOC = 33 AND MVAR_IDREF = :ID AND COST_ENTC <> 0 AND MVAR_ITEM = :ITEM)) then
                    SELECT COST_ENTP / COST_ENTC, COST_ULTIMO FROM COSTOS C, MOVIMIENTO_ARTICULO M
                        WHERE C.arti_cod = M.arti_cod AND COST_IDMOV = MVAR_CONS AND MVAR_TIPODOC = 33 AND MVAR_IDREF = :ID AND COST_ENTC <> 0 AND MVAR_ITEM = :ITEM INTO :costounit, :ultcos;
                else
                    EXECUTE PROCEDURE costo_promedio_y_ultimo(:ARTICULO, :FECHA) returning_values (:costounit, :ultcos);
                if (ULTIMO = 'S') then
                    COSTO = COSTO + ultcos * cantdet;
                else
                    COSTO = COSTO + costounit * cantdet;
                END
            CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            else
                BASE = BASE * -1;
            if (IVA IS NULL) then
                IVA = 0;
            else
                IVA = IVA * -1;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            else
                CONSUMO = CONSUMO * -1;
            COSTO = costo * -1;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            if (CEROS = 'S') then
                INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (2, USER, :codgrupo);
            INSERT INTO REP_UTILIDAD(ID, TIPO, CODIGO, BASE, IVA, CONSUMO, COSTO) VALUES (:IDREP, 33, :codgrupo, :base, :iva, :consumo, :costo);
            END /* FOR */
        SELECT SUM(BASE-COSTO) FROM REP_UTILIDAD WHERE id = :IDREP AND TIPO = 33 INTO :TOTAL;
        FOR SELECT GRUP_COD, GRUP_NOM FROM GRUPO
            WHERE GRUP_COD >= :GRPINI AND GRUP_COD <= :grpfin
            INTO :ARTICULO, :DESCRIPCION
            DO
            BEGIN
            BASE = 0;
            IVA = 0;
            CONSUMO = 0;
            COSTO = 0;
            UTILIDAD = 0;
            PORC = 0;
            SELECT BASE, IVA, CONSUMO, COSTO FROM rep_utilidad WHERE ID = :IDREP AND TIPO = 33 AND CODIGO = :articulo INTO :BASE, :IVA, :consumo,  :costo;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            EXECUTE PROCEDURE PORCENTAJE (utilidad,  TOTAL, 'S') returning_values (part);
            if ((CEROS = 'S') or (BASE <> 0) or (COSTO <> 0)) then
                SUSPEND;
            END /* FOR */
        END
    if (BIN_AND(TIPO, 8) <> 0) then
        BEGIN
        TIPODOC = 34;
        /* BORRA LA TABLA AUXILIAR */
        DELETE FROM reportes_aux WHERE REPA_ID = 2 AND REPA_USER = USER;

        FOR SELECT MAX(a.grup_cod), SUM((PEDE_TOTAL-PEDE_IVAMONTO-PEDE_CONSUMO)*PEDI_FACTOR), SUM(PEDE_IVAMONTO*PEDI_FACTOR), SUM(PEDE_CONSUMO)
            FROM PEDIDOS_DETALLE D, PEDIDOS P, PREFIJOS R, ARTICULO A
            WHERE P.PEDI_ID = D.PEDI_ID AND P.PREF_PRE = R.PREF_PRE AND R.TIDO_COD = 34 AND D.ARTI_COD = A.arti_cod AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            PEDI_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY a.grup_cod
            INTO :codgrupo, :BASE, :IVA, :CONSUMO
            DO
            BEGIN
            COSTO = 0;
            FOR SELECT MAX(D.arti_cod), SUM(PEDE_CANT * PEDE_FACTOR), MAX(pedi_FECHA) FROM pedidos_detalle D, pedidos F, PREFIJOS P, ARTICULO A
                WHERE A.arti_cod = D.arti_cod AND F.pedi_id = D.pedi_id AND PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND
                PEDI_ANULADO = 'N' AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 34 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                and a.grup_cod = :codgrupo GROUP BY D.ARTI_COD, PEDI_FECHA INTO :ARTICULO, cantdet, :fecha
                DO
                BEGIN
                EXECUTE PROCEDURE costo_promedio_y_ultimo(:ARTICULO, :FECHA) returning_values (:costounit, :ultcos);
                if (ULTIMO = 'S') then
                    COSTO = COSTO + ultcos * cantdet;
                else
                    COSTO = COSTO + costounit * cantdet;
                END
            CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            if (CEROS = 'S') then
                INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (2, USER, :codgrupo);
            INSERT INTO REP_UTILIDAD(ID, TIPO, CODIGO, BASE, IVA, CONSUMO, COSTO) VALUES (:IDREP, 34, :codgrupo, :base, :iva, :consumo, :costo);
            END /* FOR */
        SELECT SUM(BASE-COSTO) FROM REP_UTILIDAD WHERE id = :IDREP AND TIPO = 34 INTO :TOTAL;
        FOR SELECT GRUP_COD, GRUP_NOM FROM GRUPO
            WHERE GRUP_COD >= :GRPINI AND GRUP_COD <= :grpfin
            INTO :ARTICULO, :DESCRIPCION
            DO
            BEGIN
            BASE = 0;
            IVA = 0;
            CONSUMO = 0;
            COSTO = 0;
            UTILIDAD = 0;
            PORC = 0;
            SELECT BASE, IVA, CONSUMO, COSTO FROM rep_utilidad WHERE ID = :IDREP AND TIPO = 34 AND CODIGO = :articulo INTO :BASE, :IVA, :consumo,  :costo;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            EXECUTE PROCEDURE PORCENTAJE (utilidad,  TOTAL, 'S') returning_values (part);
            if ((CEROS = 'S') or (BASE <> 0) or (COSTO <> 0)) then
                SUSPEND;
            END /* FOR */
        END
    if (BIN_AND(TIPO, 16) <> 0) then
        BEGIN
        TIPODOC = 35;
        FOR SELECT MAX(a.grup_cod), SUM((CTDE_TOTAL-CTDE_IVAMONTO-CTDE_CONSUMO)*COTI_FACTOR), SUM(CTDE_IVAMONTO), SUM(CTDE_CONSUMO)
            FROM COTIZACIONES_DETALLE D, COTIZACIONES C, PREFIJOS P, ARTICULO A
            WHERE C.COTI_ID = D.COTI_ID AND P.PREF_PRE = C.PREF_PRE AND P.TIDO_COD = 35 AND D.ARTI_COD = A.arti_cod AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND COTI_FECHA >= :FECINI AND COTI_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            COTI_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY A.grup_cod
            INTO :codgrupo, :BASE, :IVA, :CONSUMO
            DO
            BEGIN
            COSTO = 0;
            FOR SELECT MAX(D.arti_cod), SUM(CTDE_CANT * CTDE_FACTOR), MAX(COTI_FECHA) FROM cotizaciones_detalle D, cotizaciones F, PREFIJOS P, ARTICULO A
                WHERE A.arti_cod = D.arti_cod AND F.coti_id = D.coti_id AND COTI_FECHA >= :FECINI AND COTI_FECHA <= :FECFIN AND
                COTI_ANULADO = 'N' AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 35 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                and a.grup_cod = :codgrupo GROUP BY D.ARTI_COD, COTI_FECHA INTO :ARTICULO, cantdet, :fecha
                DO
                BEGIN
                EXECUTE PROCEDURE costo_promedio_y_ultimo(:ARTICULO, :FECHA) returning_values (:costounit, :ultcos);
                if (ULTIMO = 'S') then
                    COSTO = COSTO + ultcos * cantdet;
                else
                    COSTO = COSTO + costounit * cantdet;
                END
            CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            if (CEROS = 'S') then
                INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (2, USER, :codgrupo);
            INSERT INTO REP_UTILIDAD(ID, TIPO, CODIGO, BASE, IVA, CONSUMO, COSTO) VALUES (:IDREP, 35, :codgrupo, :base, :iva, :consumo, :costo);
            END /* FOR */
        SELECT SUM(BASE-COSTO) FROM REP_UTILIDAD WHERE id = :IDREP AND TIPO = 35 INTO :TOTAL;
        FOR SELECT GRUP_COD, GRUP_NOM FROM GRUPO
            WHERE GRUP_COD >= :GRPINI AND GRUP_COD <= :grpfin
            INTO :ARTICULO, :DESCRIPCION
            DO
            BEGIN
            BASE = 0;
            IVA = 0;
            CONSUMO = 0;
            COSTO = 0;
            UTILIDAD = 0;
            PORC = 0;
            SELECT BASE, IVA, CONSUMO, COSTO FROM rep_utilidad WHERE ID = :IDREP AND TIPO = 35 AND CODIGO = :articulo INTO :BASE, :IVA, :consumo,  :costo;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            EXECUTE PROCEDURE PORCENTAJE (utilidad,  TOTAL, 'S') returning_values (part);
            if ((CEROS = 'S') or (BASE <> 0) or (COSTO <> 0)) then
                SUSPEND;
            END /* FOR */
        END
    END
  ELSE
    BEGIN
    if (BIN_AND(TIPO, 1) <> 0) then
        BEGIN
        TIPODOC = 31;
        FOR SELECT F.PREF_PRE, FACT_NUMERO, FACT_FECHA, D.ARTI_COD, FADE_CANT * FADE_FACTOR, (FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO)*FACT_FACTOR, FADE_IVAMONTO*FACT_FACTOR, FADE_CONSUMO,
            ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD, F.FACT_ID, FADE_ITEM
            FROM FACTURAS F, FACTURAS_DETALLE D, PREFIJOS P, ARTICULO A
            WHERE F.FACT_ID = D.FACT_ID AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND D.ARTI_COD = A.arti_cod AND
                A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
                A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND FACT_FECHA >= :FECINI AND
                (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
                FACT_FECHA <= :FECFIN AND FACT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) and substring(a.arti_cod from 1 FOR 2) <> '.t'
            ORDER BY D.ARTI_COD, FACT_FECHA, F.FACT_ID, FADE_ITEM
            INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,
                :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :ID, :ITEM
            DO
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (EXISTS (SELECT COST_SALP / COST_SALC FROM COSTOS C, MOVIMIENTO_ARTICULO M
                WHERE C.arti_cod = M.arti_cod AND COST_IDMOV = MVAR_CONS AND MVAR_TIPODOC = 31 AND MVAR_IDREF = :ID AND COST_SALC <> 0 AND MVAR_ITEM = :ITEM)) then
                SELECT COST_SALP / COST_SALC, COST_ULTIMO FROM COSTOS C, MOVIMIENTO_ARTICULO M
                    WHERE C.arti_cod = M.arti_cod AND COST_IDMOV = MVAR_CONS AND MVAR_TIPODOC = 31 AND MVAR_IDREF = :ID AND COST_SALC <> 0 AND MVAR_ITEM = :ITEM INTO :costounit, :ultcos;
            else
                EXECUTE PROCEDURE costo_promedio_y_ultimo(:ARTICULO, :FECHA) returning_values (:costounit, :ultcos);
            if (ULTIMO = 'S') then
                COSTO = ultcos * cantidad;
            else
                COSTO = costounit * cantidad;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            SUSPEND;
            END
        END
    if (BIN_AND(TIPO, 2) <> 0) then
        BEGIN
        TIPODOC = 32;
        FOR SELECT R.PREF_PRE, REVT_NUMERO, REVT_FECHA, D.ARTI_COD, RVDE_CANT * RVDE_FACTOR, RVDE_TOTAL-RVDE_IVAMONTO-RVDE_CONSUMO, RVDE_IVAMONTO, RVDE_CONSUMO,
            ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD, R.REVT_ID, RVDE_ITEM
            FROM REMISIONES_VENTA R, REMISIONES_VENTA_DETALLE D, PREFIJOS P, ARTICULO A
            WHERE R.REVT_ID = D.REVT_ID AND P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = 32 AND D.ARTI_COD = A.arti_cod AND
                A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
                A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN AND
                (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
                REVT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            ORDER BY D.ARTI_COD, REVT_FECHA, R.REVT_ID, RVDE_ITEM
            INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,
                :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :ID, :ITEM
            DO
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (EXISTS (SELECT COST_SALP / COST_SALC FROM COSTOS C, MOVIMIENTO_ARTICULO M
                WHERE C.arti_cod = M.arti_cod AND COST_IDMOV = MVAR_CONS AND MVAR_TIPODOC = 32 AND MVAR_IDREF = :ID AND COST_SALC <> 0 AND MVAR_ITEM = :ITEM)) then
                SELECT COST_SALP / COST_SALC, COST_ULTIMO FROM COSTOS C, MOVIMIENTO_ARTICULO M
                    WHERE C.arti_cod = M.arti_cod AND COST_IDMOV = MVAR_CONS AND MVAR_TIPODOC = 32 AND MVAR_IDREF = :ID AND COST_SALC <> 0 AND MVAR_ITEM = :ITEM INTO :costounit, :ultcos;
            else
                EXECUTE PROCEDURE costo_promedio_y_ultimo(:ARTICULO, :FECHA) returning_values (:costounit, :ultcos);
            if (ULTIMO = 'S') then
                COSTO = ultcos * cantidad;
            else
                COSTO = costounit * cantidad;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            SUSPEND;
            END
        END
    if (BIN_AND(TIPO, 4) <> 0) then
        BEGIN
        TIPODOC = 33;
        FOR SELECT V.PREF_PRE, DEVT_NUMERO, DEVT_FECHA, D.ARTI_COD, DVDE_CANT * DVDE_FACTOR, (DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO)*DEVT_FACTOR, DVDE_IVAMONTO*DEVT_FACTOR, DVDE_CONSUMO,
            ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD, V.DEVT_ID, DVDE_ITEM
            FROM DEVOLUCIONES_VENTAS V, DEVOLUCIONES_VENTAS_DETALLE D, PREFIJOS P, ARTICULO A
            WHERE V.DEVT_ID = D.DEVT_ID AND P.PREF_PRE = V.PREF_PRE AND P.TIDO_COD = 33 AND D.ARTI_COD = A.arti_cod AND
                A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
                A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND
                (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
                DEVT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            ORDER BY D.ARTI_COD, DEVT_FECHA, V.DEVT_ID, DVDE_ITEM
            INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,
                :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :ID, :ITEM
            DO
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            CANTIDAD = CANTIDAD * -1;
            if (EXISTS (SELECT COST_ENTP / COST_ENTC FROM COSTOS C, MOVIMIENTO_ARTICULO M
                WHERE C.arti_cod = M.arti_cod AND COST_IDMOV = MVAR_CONS AND MVAR_TIPODOC = 33 AND MVAR_IDREF = :ID AND COST_ENTC <> 0 AND MVAR_ITEM = :ITEM)) then
                SELECT COST_ENTP / COST_ENTC, COST_ULTIMO FROM COSTOS C, MOVIMIENTO_ARTICULO M
                    WHERE C.arti_cod = M.arti_cod AND COST_IDMOV = MVAR_CONS AND MVAR_TIPODOC = 33 AND MVAR_IDREF = :ID AND COST_ENTC <> 0 AND MVAR_ITEM = :ITEM INTO :costounit, :ultcos;
            else
                EXECUTE PROCEDURE costo_promedio_y_ultimo(:ARTICULO, :FECHA) returning_values (:costounit, :ultcos);
            if (ULTIMO = 'S') then
                COSTO = ultcos * cantidad;
            else
                COSTO = costounit * cantidad;
            BASE = BASE * -1;
            IVA = IVA * -1;
            CONSUMO = CONSUMO * -1;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            SUSPEND;
            END
        END
    if (BIN_AND(TIPO, 8) <> 0) then
        BEGIN
        TIPODOC = 34;
        FOR SELECT P.PREF_PRE, PEDI_NUMERO, PEDI_FECHA, D.ARTI_COD, PEDE_CANT * PEDE_FACTOR, (PEDE_TOTAL-PEDE_IVAMONTO-PEDE_CONSUMO)*PEDI_FACTOR, PEDE_IVAMONTO*PEDI_FACTOR, PEDE_CONSUMO,
            ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD 
            FROM PEDIDOS P, PEDIDOS_DETALLE D, PREFIJOS R, ARTICULO A
            WHERE P.PEDI_ID = D.PEDI_ID AND P.PREF_PRE = R.PREF_PRE AND R.TIDO_COD = 34 AND D.ARTI_COD = A.arti_cod AND
                A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
                A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND
                (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
                PEDI_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            ORDER BY D.ARTI_COD, PEDI_FECHA, P.PEDI_ID, PEDE_ITEM
            INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,
                :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
            DO
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            EXECUTE PROCEDURE costo_promedio_y_ultimo(:ARTICULO, :FECHA) returning_values (:costounit, :ultcos);
            if (ULTIMO = 'S') then
                COSTO = ultcos * cantidad;
            else
                COSTO = costounit * cantidad;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            SUSPEND;
            END
        END
    if (BIN_AND(TIPO, 16) <> 0) then
        BEGIN
        TIPODOC = 35;
        FOR SELECT C.PREF_PRE, COTI_NUMERO, COTI_FECHA, D.ARTI_COD, CTDE_CANT * CTDE_FACTOR, (CTDE_TOTAL-CTDE_IVAMONTO-CTDE_CONSUMO)*COTI_FACTOR, CTDE_IVAMONTO*COTI_FACTOR, CTDE_CONSUMO,
            ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD 
            FROM COTIZACIONES C, COTIZACIONES_DETALLE D, PREFIJOS P, ARTICULO A
            WHERE C.COTI_ID = D.COTI_ID AND P.PREF_PRE = C.PREF_PRE AND P.TIDO_COD = 35 AND D.ARTI_COD = A.arti_cod AND
                A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
                A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND COTI_FECHA >= :FECINI AND COTI_FECHA <= :FECFIN AND
                (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
                COTI_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            ORDER BY D.ARTI_COD, COTI_FECHA, C.COTI_ID, CTDE_ITEM
            INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,
                :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
            DO
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            EXECUTE PROCEDURE costo_promedio_y_ultimo(:ARTICULO, :FECHA) returning_values (:costounit, :ultcos);
            if (ULTIMO = 'S') then
                COSTO = ultcos * cantidad;
            else
                COSTO = costounit * cantidad;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            SUSPEND;
            END
        END
    END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure REP_UTILIDAD_VENDEDOR (
    TIPO integer,
    DETALLE char(1),
    VENINI varchar(20),
    VENFIN varchar(20),
    FECINI date,
    FECFIN date,
    ARTINI varchar(15),
    ARTFIN varchar(15),
    ORDEN char(1),
    CEROS char(1),
    SUBEMPRESA integer)
returns (
    CODVEND varchar(20),
    NOMVEND varchar(60),
    NOMTIPO varchar(50),
    ARTICULO varchar(15),
    DESCRIPCION varchar(60),
    CODGRUPO varchar(2),
    NOMGRUPO varchar(30),
    CODSUBG varchar(3),
    NOMSUBG varchar(30),
    CODMARC varchar(3),
    NOMMARC varchar(30),
    UNIDAD varchar(8),
    CANTIDAD numeric(18,4),
    BASE numeric(18,2),
    IVA numeric(18,2),
    CONSUMO numeric(18,2),
    COSTO numeric(18,2),
    UTILIDAD numeric(18,4),
    PORC numeric(9,2),
    TOTAL numeric(18,2),
    LISTA numeric(18,2),
    PREFIJO varchar(4),
    NUMERO varchar(6),
    FECHA date,
    DTO numeric(9,2))
AS
DECLARE VARIABLE COSTOUNIT NUMERIC(18,4);
DECLARE VARIABLE CANTDET NUMERIC(18,4);
DECLARE VARIABLE CODINI VARCHAR(15);
DECLARE VARIABLE CODFIN VARCHAR(15);
DECLARE VARIABLE DESINI VARCHAR(15);
DECLARE VARIABLE DESFIN VARCHAR(15);
declare variable UOM VARCHAR(20);
declare variable CODLISTA INTEGER;
declare variable ID INTEGER;
declare variable ITEM INTEGER;
BEGIN
if (ORDEN = 'C') then
    BEGIN
    CODINI = ARTINI;
    CODFIN = ARTFIN;
    DESINI = '';
    DESFIN = 'zz';
    END
ELSE
    BEGIN
    DESINI = ARTINI;
    DESFIN = ARTFIN;
    CODINI = '';
    CODFIN = 'zz';
    END
  EXECUTE PROCEDURE lee_configuracion ('FACTURACION', 'ARTICULOS', 'SUGERIR PRECIOS CON PORCENTAJE DE MARGEN O UTILIDAD') returning_values (:UOM);
  SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = :TIPO INTO :NOMTIPO;
  FOR select VEND_COD, VEND_NOMBRE
    from VENDEDORES
    where VEND_COD >= :VENINI AND VEND_COD <= :VENFIN
    INTO :CODVEND, :NOMVEND
    DO  
    BEGIN
    if (DETALLE = 'N') then
        BEGIN
        if (BIN_AND(TIPO, 1) <> 0) then
            BEGIN
            SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 31 INTO :NOMTIPO;
            /* BORRA LA TABLA AUXILIAR */
            DELETE FROM reportes_aux WHERE REPA_ID = 4 AND REPA_USER = USER;
            FOR SELECT MAX(D.ARTI_COD), SUM(FADE_CANT * FADE_FACTOR), SUM(FACT_FACTOR*(FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO)),
                SUM(FACT_FACTOR*FADE_IVAMONTO), SUM(FACT_FACTOR*FADE_TOTAL), SUM(FADE_CONSUMO),
                MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD)
                FROM FACTURAS_DETALLE D, FACTURAS F, PREFIJOS P, ARTICULO A
                WHERE F.FACT_ID = D.FACT_ID AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND VEND_COD = :CODVEND AND FACT_ANULADO = 'N'
                 AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) and substring(D.arti_cod from 1 FOR 2) <> '.t'
                 AND D.ARTI_COD = A.arti_cod AND A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN
                GROUP BY D.ARTI_COD
                INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :TOTAL, :CONSUMO,
                    :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                DO
                BEGIN
                COSTO = 0;
                FOR SELECT F.FACT_ID, FADE_ITEM, FADE_CANT * FADE_FACTOR, FACT_FECHA FROM FACTURAS_DETALLE D, FACTURAS F, PREFIJOS P
                    WHERE F.VEND_COD = :codvend AND F.FACT_ID = D.FACT_ID AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND
                    FACT_ANULADO = 'N' AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                    and D.ARTI_COD = :articulo  INTO :ID, :ITEM, :cantdet, :fecha
                    DO
                    BEGIN
                    if (EXISTS (SELECT COST_SALP / COST_SALC FROM COSTOS C, MOVIMIENTO_ARTICULO M
                        WHERE C.arti_cod = M.arti_cod AND COST_IDMOV = MVAR_CONS AND MVAR_TIPODOC = 31 AND MVAR_IDREF = :ID AND COST_SALC <> 0 AND MVAR_ITEM = :ITEM)) then
                        SELECT COST_SALP / COST_SALC FROM COSTOS C, MOVIMIENTO_ARTICULO M
                            WHERE C.arti_cod = M.arti_cod AND COST_IDMOV = MVAR_CONS AND MVAR_TIPODOC = 31 AND MVAR_IDREF = :ID AND COST_SALC <> 0 AND MVAR_ITEM = :ITEM INTO :costounit;
                    else
                        EXECUTE PROCEDURE COSTO_PROMEDIO(:ARTICULO, :FECHA) returning_values (:costounit);
                    COSTO = COSTO + costounit * cantdet;
                    END
                SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                if (CANTIDAD IS NULL) then
                    CANTIDAD = 0;
                if (BASE IS NULL) then
                    BASE = 0;
                if (IVA IS NULL) then
                    IVA = 0;
                UTILIDAD = BASE - COSTO;
                if (UOM = 'UTILIDAD') then
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                else
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
                if (CEROS = 'S') then
                    begin
                    INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (4, USER, :ARTICULO);
                    SUSPEND;
                    end
                ELSE
                    if ((BASE <> 0) AND (CANTIDAD <> 0)) then
                        SUSPEND;
                END
            if (CEROS = 'S') then
                BEGIN
                COSTO = 0;
                UTILIDAD = 0;
                PORC = 0;
                /* agregue los articulos sin factura */
                FOR SELECT ARTI_COD, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN and
                    not exists (select REPA_ARTICULO FROM REPORTES_AUX WHERE REPA_ID = 4 AND REPA_USER = USER AND REPA_ARTICULO = a.arti_cod)
                    INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                    DO
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        if (BIN_AND(TIPO, 2) <> 0) then
            BEGIN
            SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 32 INTO :NOMTIPO;
            FOR SELECT MAX(D.ARTI_COD), SUM(RVDE_CANT * RVDE_FACTOR), SUM(RVDE_TOTAL-RVDE_IVAMONTO-RVDE_CONSUMO), SUM(RVDE_IVAMONTO), SUM(RVDE_TOTAL), SUM(RVDE_CONSUMO),
                MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD)
                FROM REMISIONES_VENTA_DETALLE D, REMISIONES_VENTA R, PREFIJOS P, ARTICULO A
                WHERE R.REVT_ID = D.REVT_ID AND REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN AND VEND_COD = :CODVEND AND REVT_ANULADO = 'N'
                 AND P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = 32 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                 AND D.ARTI_COD = A.arti_cod AND A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN
                GROUP BY D.ARTI_COD
                INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :TOTAL, :CONSUMO,
                    :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                DO
                BEGIN
                COSTO = 0;
                FOR SELECT F.REVT_ID, RVDE_ITEM, RVDE_CANT * RVDE_FACTOR, REVT_FECHA FROM remisiones_venta_detalle D, remisiones_venta F, PREFIJOS P
                    WHERE F.VEND_COD = :codvend AND F.revt_id = D.revt_id AND REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN AND
                    REVT_ANULADO = 'N' AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 32 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                    and D.ARTI_COD = :articulo  INTO :ID, :ITEM, :cantdet, :fecha
                    DO
                    BEGIN
                    if (EXISTS (SELECT COST_SALP / COST_SALC FROM COSTOS C, MOVIMIENTO_ARTICULO M
                        WHERE C.arti_cod = M.arti_cod AND COST_IDMOV = MVAR_CONS AND MVAR_TIPODOC = 32 AND MVAR_IDREF = :ID AND COST_SALC <> 0 AND MVAR_ITEM = :ITEM)) then
                        SELECT COST_SALP / COST_SALC FROM COSTOS C, MOVIMIENTO_ARTICULO M
                            WHERE C.arti_cod = M.arti_cod AND COST_IDMOV = MVAR_CONS AND MVAR_TIPODOC = 32 AND MVAR_IDREF = :ID AND COST_SALC <> 0 AND MVAR_ITEM = :ITEM INTO :costounit;
                    else
                        EXECUTE PROCEDURE COSTO_PROMEDIO(:ARTICULO, :FECHA) returning_values (:costounit);
                    COSTO = COSTO + costounit * cantdet;
                    END
                SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                if (CANTIDAD IS NULL) then
                    CANTIDAD = 0;
                if (BASE IS NULL) then
                    BASE = 0;
                if (IVA IS NULL) then
                    IVA = 0;
                UTILIDAD = BASE - COSTO;
                if (UOM = 'UTILIDAD') then
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                else
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
                if (CEROS = 'S') then
                    begin
                    INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (4, USER, :ARTICULO);
                    SUSPEND;
                    end
                ELSE
                    if ((BASE <> 0) AND (CANTIDAD <> 0)) then
                        SUSPEND;
                END
            if (CEROS = 'S') then
                BEGIN
                COSTO = 0;
                UTILIDAD = 0;
                PORC = 0;
                /* agregue los articulos sin factura */
                FOR SELECT ARTI_COD, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN and
                    not exists (select REPA_ARTICULO FROM REPORTES_AUX WHERE REPA_ID = 4 AND REPA_USER = USER AND REPA_ARTICULO = a.arti_cod)
                    INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                    DO
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        if (BIN_AND(TIPO, 4) <> 0) then
            BEGIN
            SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 33 INTO :NOMTIPO;
            FOR SELECT MAX(D.ARTI_COD), SUM(DVDE_CANT * DVDE_FACTOR), SUM(DEVT_FACTOR*(DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO)),
                SUM(DEVT_FACTOR*DVDE_IVAMONTO), SUM(DEVT_FACTOR*DVDE_TOTAL), SUM(DVDE_CONSUMO),
                MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD)
                FROM devoluciones_ventas_detalle D, DEVOLUCIONES_VENTAS V, PREFIJOS P, ARTICULO A
                WHERE V.DEVT_ID = D.DEVT_ID AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND VEND_COD = :CODVEND AND DEVT_ANULADO = 'N'
                 AND P.PREF_PRE = V.PREF_PRE AND P.TIDO_COD = 33 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) and substring(D.arti_cod from 1 FOR 2) <> '.t'
                 AND D.ARTI_COD = A.arti_cod AND A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN
                GROUP BY D.ARTI_COD
                INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :TOTAL, :CONSUMO,
                    :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                DO
                BEGIN
                COSTO = 0;
                FOR SELECT F.DEVT_ID, DVDE_ITEM, DVDE_CANT * DVDE_FACTOR, DEVT_FECHA FROM devoluciones_ventas_detalle D, devoluciones_ventas F, PREFIJOS P
                    WHERE F.VEND_COD = :codvend AND F.devt_id = D.devt_id AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND
                    DEVT_ANULADO = 'N' AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 33 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                    and D.ARTI_COD = :articulo  INTO :ID, :ITEM, :cantdet, :fecha
                    DO
                    BEGIN
                    if (EXISTS (SELECT COST_ENTP / COST_ENTC FROM COSTOS C, MOVIMIENTO_ARTICULO M
                        WHERE C.arti_cod = M.arti_cod AND COST_IDMOV = MVAR_CONS AND MVAR_TIPODOC = 33 AND MVAR_IDREF = :ID AND COST_ENTC <> 0 AND MVAR_ITEM = :ITEM)) then
                        SELECT COST_ENTP / COST_ENTC FROM COSTOS C, MOVIMIENTO_ARTICULO M
                            WHERE C.arti_cod = M.arti_cod AND COST_IDMOV = MVAR_CONS AND MVAR_TIPODOC = 33 AND MVAR_IDREF = :ID AND COST_ENTC <> 0 AND MVAR_ITEM = :ITEM INTO :costounit;
                    else
                        EXECUTE PROCEDURE COSTO_PROMEDIO(:ARTICULO, :FECHA) returning_values (:costounit);
                    COSTO = COSTO + costounit * cantdet;
                    END
                SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                if (CANTIDAD IS NULL) then
                    CANTIDAD = 0;
                if (BASE IS NULL) then
                    BASE = 0;
                if (IVA IS NULL) then
                    IVA = 0;
                UTILIDAD = BASE - COSTO;
                if (UOM = 'UTILIDAD') then
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                else
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
                TOTAL = TOTAL * -1;
                IVA = IVA * -1;
                BASE = BASE * -1;
                CANTIDAD = CANTIDAD * -1;
                COSTO = COSTO * -1;
                UTILIDAD = UTILIDAD * -1;
                if (CEROS = 'S') then
                    begin
                    INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (4, USER, :ARTICULO);
                    SUSPEND;
                    end
                ELSE
                    if ((BASE <> 0) AND (CANTIDAD <> 0)) then
                        SUSPEND;
                END
            if (CEROS = 'S') then
                BEGIN
                COSTO = 0;
                UTILIDAD = 0;
                PORC = 0;
                /* agregue los articulos sin factura */
                FOR SELECT ARTI_COD, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN and
                    not exists (select REPA_ARTICULO FROM REPORTES_AUX WHERE REPA_ID = 4 AND REPA_USER = USER AND REPA_ARTICULO = a.arti_cod)
                    INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                    DO
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        if (BIN_AND(TIPO, 8) <> 0) then
            BEGIN
            SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 34 INTO :NOMTIPO;
            FOR SELECT MAX(D.ARTI_COD), SUM(PEDE_CANT * PEDE_FACTOR), SUM(PEDI_FACTOR*(PEDE_TOTAL-PEDE_IVAMONTO-PEDE_CONSUMO)),
                SUM(PEDI_FACTOR*PEDE_IVAMONTO), SUM(PEDI_FACTOR*PEDE_TOTAL), SUM(PEDE_CONSUMO),
                MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD)
                FROM PEDIDOS_DETALLE D, PEDIDOS P, PREFIJOS PR, articulo A
                WHERE P.PEDI_ID = D.PEDI_ID AND PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND VEND_COD = :CODVEND AND PEDI_ANULADO = 'N'
                 AND PR.PREF_PRE = P.PREF_PRE AND P.TIDO_COD = 34 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                 AND D.ARTI_COD = A.arti_cod AND A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN
                GROUP BY D.ARTI_COD
                INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :TOTAL, :CONSUMO,
                    :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                DO
                BEGIN
                COSTO = 0;
                FOR SELECT PEDE_CANT * PEDE_FACTOR, PEDI_FECHA FROM pedidos_detalle D, PEDIDOS F, PREFIJOS P
                    WHERE F.VEND_COD = :codvend AND F.pedi_id = D.pedi_id AND PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND
                    PEDI_ANULADO = 'N' AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 34 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                    and D.ARTI_COD = :articulo  INTO :cantdet, :fecha
                    DO
                    BEGIN
                    EXECUTE PROCEDURE COSTO_PROMEDIO(:ARTICULO, :FECHA) returning_values (:costounit);
                    COSTO = COSTO + costounit * cantdet;
                    END
                SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                if (CANTIDAD IS NULL) then
                    CANTIDAD = 0;
                if (BASE IS NULL) then
                    BASE = 0;
                if (IVA IS NULL) then
                    IVA = 0;
                UTILIDAD = BASE - COSTO;
                if (UOM = 'UTILIDAD') then
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                else
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
                if (CEROS = 'S') then
                    begin
                    INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (4, USER, :ARTICULO);
                    SUSPEND;
                    end
                ELSE
                    if ((BASE <> 0) AND (CANTIDAD <> 0)) then
                        SUSPEND;
                END
            if (CEROS = 'S') then
                BEGIN
                COSTO = 0;
                UTILIDAD = 0;
                PORC = 0;
                /* agregue los articulos sin factura */
                FOR SELECT ARTI_COD, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN and
                    not exists (select REPA_ARTICULO FROM REPORTES_AUX WHERE REPA_ID = 4 AND REPA_USER = USER AND REPA_ARTICULO = a.arti_cod)
                    INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                    DO
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        if (BIN_AND(TIPO, 16) <> 0) then
            BEGIN
            SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 35 INTO :NOMTIPO;
            FOR SELECT MAX(D.ARTI_COD), SUM(CTDE_CANT * CTDE_FACTOR), SUM(COTI_FACTOR*(CTDE_TOTAL-CTDE_IVAMONTO-CTDE_CONSUMO)),
                SUM(COTI_FACTOR*CTDE_IVAMONTO), SUM(COTI_FACTOR*CTDE_TOTAL), SUM(CTDE_CONSUMO),
                MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD)
                FROM COTIZACIONES_DETALLE D, COTIZACIONES C, PREFIJOS P, ARTICULO A
                WHERE C.COTI_ID = D.COTI_ID AND COTI_FECHA >= :FECINI AND COTI_FECHA <= :FECFIN AND VEND_COD = :CODVEND AND COTI_ANULADO = 'N'
                 AND P.PREF_PRE = C.PREF_PRE AND P.TIDO_COD = 35 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                 AND D.ARTI_COD = A.arti_cod AND A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN
                GROUP BY D.ARTI_COD
                INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :TOTAL, :CONSUMO,
                    :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                DO
                BEGIN
                COSTO = 0;
                FOR SELECT PEDE_CANT * PEDE_FACTOR, PEDI_FECHA FROM pedidos_detalle D, PEDIDOS F, PREFIJOS P
                    WHERE F.VEND_COD = :codvend AND F.pedi_id = D.pedi_id AND PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND
                    PEDI_ANULADO = 'N' AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 34 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                    and D.ARTI_COD = :articulo  INTO :cantdet, :fecha
                    DO
                    BEGIN
                    EXECUTE PROCEDURE COSTO_PROMEDIO(:ARTICULO, :FECHA) returning_values (:costounit);
                    COSTO = COSTO + costounit * cantdet;
                    END
                SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                if (CANTIDAD IS NULL) then
                    CANTIDAD = 0;
                if (BASE IS NULL) then
                    BASE = 0;
                if (IVA IS NULL) then
                    IVA = 0;
                COSTO = CANTIDAD * COSTOUNIT;
                UTILIDAD = BASE - COSTO;
                if (UOM = 'UTILIDAD') then
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                else
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
                if (CEROS = 'S') then
                    begin
                    INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (4, USER, :ARTICULO);
                    SUSPEND;
                    end
                ELSE
                    if ((BASE <> 0) AND (CANTIDAD <> 0)) then
                        SUSPEND;
                END
            if (CEROS = 'S') then
                BEGIN
                COSTO = 0;
                UTILIDAD = 0;
                PORC = 0;
                /* agregue los articulos sin factura */
                FOR SELECT ARTI_COD, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN and
                    not exists (select REPA_ARTICULO FROM REPORTES_AUX WHERE REPA_ID = 4 AND REPA_USER = USER AND REPA_ARTICULO = a.arti_cod)
                    INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                    DO
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        END
    ELSE
        BEGIN
        if (BIN_AND(TIPO, 1) <> 0) then
            BEGIN
            SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 31 INTO :NOMTIPO;
            FOR SELECT F.fact_id, D.fade_item, F.PREF_PRE, FACT_NUMERO, FACT_FECHA, ARTI_COD, FADE_CANT * FADE_FACTOR, (FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO)*FACT_FACTOR,
                FADE_IVAMONTO*FACT_FACTOR, FADE_DTOPORC, FADE_TOTAL*FACT_FACTOR, FADE_CONSUMO, D.lipr_cod
                FROM FACTURAS F, FACTURAS_DETALLE D, PREFIJOS P
                WHERE F.FACT_ID = D.FACT_ID AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND VEND_COD = :CODVEND AND FACT_ANULADO = 'N'
                 AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) and substring(D.arti_cod from 1 FOR 2) <> '.t'
                ORDER BY ARTI_COD, FACT_FECHA, F.FACT_ID, FADE_ITEM
                INTO :ID, :ITEM, :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :DTO, :TOTAL, :CONSUMO, :codlista
                DO
                BEGIN
                SELECT ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO WHERE ARTI_COD = :ARTICULO
                    INTO :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC;
                SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                if (EXISTS (SELECT COST_SALP / COST_SALC FROM COSTOS C, MOVIMIENTO_ARTICULO M
                    WHERE C.arti_cod = M.arti_cod AND COST_IDMOV = MVAR_CONS AND MVAR_TIPODOC = 31 AND MVAR_IDREF = :ID AND COST_SALC <> 0 AND MVAR_ITEM = :ITEM)) then
                    SELECT COST_SALP / COST_SALC FROM COSTOS C, MOVIMIENTO_ARTICULO M
                        WHERE C.arti_cod = M.arti_cod AND COST_IDMOV = MVAR_CONS AND MVAR_TIPODOC = 31 AND MVAR_IDREF = :ID AND COST_SALC <> 0 AND MVAR_ITEM = :ITEM INTO :costounit;
                else
                    EXECUTE PROCEDURE costo_promedio (:ARTICULO, :FECHA) RETURNING_VALUES (:COSTOUNIT);
                LISTA = 0;
                SELECT PRAR_FIJO FROM precios_articulo WHERE LIPR_COD = :CODLISTA AND ARTI_COD = :ARTICULO INTO :LISTA;
                COSTO = COSTOUNIT * CANTIDAD;
                UTILIDAD = BASE - COSTO;
                if (UOM = 'UTILIDAD') then
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                else
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
                if (CEROS = 'S') then
                    INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (4, USER, :ARTICULO);
                SUSPEND;
                END
            if (CEROS = 'S') then
                BEGIN
                COSTO = 0;
                UTILIDAD = 0;
                PORC = 0;
                /* agregue los articulos sin factura */
                FOR SELECT ARTI_COD, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN and
                    not exists (select REPA_ARTICULO FROM REPORTES_AUX WHERE REPA_ID = 4 AND REPA_USER = USER AND REPA_ARTICULO = a.arti_cod)
                    INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                    DO
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        if (BIN_AND(TIPO, 2) <> 0) then
            BEGIN
            SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 32 INTO :NOMTIPO;
            FOR SELECT R.REVT_ID, RVDE_ITEM, R.PREF_PRE, REVT_NUMERO, REVT_FECHA, ARTI_COD, RVDE_CANT * RVDE_FACTOR, (RVDE_TOTAL - RVDE_IVAMONTO), RVDE_IVAMONTO, RVDE_DTOPORC, RVDE_TOTAL, RVDE_CONSUMO, D.lipr_cod
                FROM REMISIONES_VENTA R, REMISIONES_VENTA_DETALLE D, PREFIJOS P
                WHERE R.REVT_ID = D.REVT_ID AND REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN AND VEND_COD = :CODVEND AND REVT_ANULADO = 'N'
                 AND P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = 32 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) and substring(D.arti_cod from 1 FOR 2) <> '.t'
                ORDER BY ARTI_COD, REVT_FECHA, R.REVT_ID, RVDE_ITEM
                INTO :ID, :ITEM, :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :DTO, :TOTAL, :CONSUMO, :codlista
                DO
                BEGIN
                SELECT ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO WHERE ARTI_COD = :ARTICULO
                    INTO :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC;
                SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                if (EXISTS (SELECT COST_SALP / COST_SALC FROM COSTOS C, MOVIMIENTO_ARTICULO M
                    WHERE C.arti_cod = M.arti_cod AND COST_IDMOV = MVAR_CONS AND MVAR_TIPODOC = 32 AND MVAR_IDREF = :ID AND COST_SALC <> 0 AND MVAR_ITEM = :ITEM)) then
                    SELECT COST_SALP / COST_SALC FROM COSTOS C, MOVIMIENTO_ARTICULO M
                        WHERE C.arti_cod = M.arti_cod AND COST_IDMOV = MVAR_CONS AND MVAR_TIPODOC = 32 AND MVAR_IDREF = :ID AND COST_SALC <> 0 AND MVAR_ITEM = :ITEM INTO :costounit;
                else
                    EXECUTE PROCEDURE costo_promedio (:ARTICULO, :FECHA) RETURNING_VALUES (:COSTOUNIT);
                LISTA = 0;
                SELECT PRAR_FIJO FROM precios_articulo WHERE LIPR_COD = :CODLISTA AND ARTI_COD = :ARTICULO INTO :LISTA;
                COSTO = COSTOUNIT * CANTIDAD;
                UTILIDAD = BASE - COSTO;
                if (UOM = 'UTILIDAD') then
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                else
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
                if (CEROS = 'S') then
                    INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (4, USER, :ARTICULO);
                SUSPEND;
                END
            if (CEROS = 'S') then
                BEGIN
                COSTO = 0;
                UTILIDAD = 0;
                PORC = 0;
                /* agregue los articulos sin factura */
                FOR SELECT ARTI_COD, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN and
                    not exists (select REPA_ARTICULO FROM REPORTES_AUX WHERE REPA_ID = 4 AND REPA_USER = USER AND REPA_ARTICULO = a.arti_cod)
                    INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                    DO
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        if (BIN_AND(TIPO, 4) <> 0) then
            BEGIN
            SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 33 INTO :NOMTIPO;
            FOR SELECT V.DEVT_ID, DVDE_ITEM, V.PREF_PRE, DEVT_NUMERO, DEVT_FECHA, ARTI_COD, DVDE_CANT * DVDE_FACTOR, (DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO)*DEVT_FACTOR,
                DVDE_IVAMONTO*DEVT_FACTOR, DVDE_DTOPORC, DVDE_TOTAL*DEVT_FACTOR, DVDE_CONSUMO
                FROM DEVOLUCIONES_VENTAS V, DEVOLUCIONES_VENTAS_DETALLE D, PREFIJOS P
                WHERE V.DEVT_ID = D.DEVT_ID AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND VEND_COD = :CODVEND AND DEVT_ANULADO = 'N'
                 AND P.PREF_PRE = V.PREF_PRE AND P.TIDO_COD = 33 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) and substring(D.arti_cod from 1 FOR 2) <> '.t'
                ORDER BY ARTI_COD, DEVT_FECHA, D.DEVT_ID, DVDE_ITEM
                INTO :ID, :ITEM, :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :DTO, :TOTAL, :CONSUMO
                DO
                BEGIN
                SELECT ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO WHERE ARTI_COD = :ARTICULO
                    INTO :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC;
                SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                if (EXISTS (SELECT COST_ENTP / COST_ENTC FROM COSTOS C, MOVIMIENTO_ARTICULO M
                    WHERE C.arti_cod = M.arti_cod AND COST_IDMOV = MVAR_CONS AND MVAR_TIPODOC = 33 AND MVAR_IDREF = :ID AND COST_ENTC <> 0 AND MVAR_ITEM = :ITEM)) then
                    SELECT COST_ENTP / COST_ENTC FROM COSTOS C, MOVIMIENTO_ARTICULO M
                        WHERE C.arti_cod = M.arti_cod AND COST_IDMOV = MVAR_CONS AND MVAR_TIPODOC = 33 AND MVAR_IDREF = :ID AND COST_ENTC <> 0 AND MVAR_ITEM = :ITEM INTO :costounit;
                else
                    EXECUTE PROCEDURE costo_promedio (:ARTICULO, :FECHA) RETURNING_VALUES (:COSTOUNIT);
                LISTA = 0;
                COSTO = COSTOUNIT * CANTIDAD;
                UTILIDAD = BASE - COSTO;
                if (UOM = 'UTILIDAD') then
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                else
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
                TOTAL = TOTAL * -1;
                IVA = IVA * -1;
                BASE = BASE * -1;
                CANTIDAD = CANTIDAD * -1;
                COSTO = COSTO * -1;
                UTILIDAD = UTILIDAD * -1;
                if (CEROS = 'S') then
                    INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (4, USER, :ARTICULO);
                SUSPEND;
                END
            if (CEROS = 'S') then
                BEGIN
                COSTO = 0;
                UTILIDAD = 0;
                PORC = 0;
                /* agregue los articulos sin factura */
                FOR SELECT ARTI_COD, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN and
                    not exists (select REPA_ARTICULO FROM REPORTES_AUX WHERE REPA_ID = 4 AND REPA_USER = USER AND REPA_ARTICULO = a.arti_cod)
                    INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                    DO
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        if (BIN_AND(TIPO, 8) <> 0) then
            BEGIN
            SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 34 INTO :NOMTIPO;
            FOR SELECT P.PREF_PRE, PEDI_NUMERO, PEDI_FECHA, ARTI_COD, PEDE_CANT * PEDE_FACTOR, (PEDE_TOTAL-PEDE_IVAMONTO-PEDE_CONSUMO)*PEDI_FACTOR,
                PEDE_IVAMONTO*PEDI_FACTOR, PEDE_DTOPORC, PEDE_TOTAL*PEDI_FACTOR, PEDE_CONSUMO, D.lipr_cod
                FROM PEDIDOS P, PEDIDOS_DETALLE D, PREFIJOS PR
                WHERE P.PEDI_ID = D.PEDI_ID AND PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND VEND_COD = :CODVEND AND PEDI_ANULADO = 'N'
                 AND P.PREF_PRE = PR.PREF_PRE AND P.TIDO_COD = 34 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                ORDER BY ARTI_COD, PEDI_FECHA, P.PEDI_ID, PEDE_ITEM
                INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :DTO, :TOTAL, :CONSUMO, :codlista
                DO
                BEGIN
                SELECT ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO WHERE ARTI_COD = :ARTICULO
                    INTO :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC;
                SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                EXECUTE PROCEDURE costo_promedio (:ARTICULO, :FECHA) RETURNING_VALUES (:COSTOUNIT);
                LISTA = 0;
                SELECT PRAR_FIJO FROM precios_articulo WHERE LIPR_COD = :CODLISTA AND ARTI_COD = :ARTICULO INTO :LISTA;
                COSTO = COSTOUNIT * CANTIDAD;
                UTILIDAD = BASE - COSTO;
                if (UOM = 'UTILIDAD') then
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                else
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
                if (CEROS = 'S') then
                    INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (4, USER, :ARTICULO);
                SUSPEND;
                END
            if (CEROS = 'S') then
                BEGIN
                COSTO = 0;
                UTILIDAD = 0;
                PORC = 0;
                /* agregue los articulos sin factura */
                FOR SELECT ARTI_COD, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN and
                    not exists (select REPA_ARTICULO FROM REPORTES_AUX WHERE REPA_ID = 4 AND REPA_USER = USER AND REPA_ARTICULO = a.arti_cod)
                    INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                    DO
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        if (BIN_AND(TIPO, 16) <> 0) then
            BEGIN
            SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 35 INTO :NOMTIPO;
            FOR SELECT C.PREF_PRE, COTI_NUMERO, COTI_FECHA, ARTI_COD, CTDE_CANT * CTDE_FACTOR, (CTDE_TOTAL-CTDE_IVAMONTO-CTDE_CONSUMO)*COTI_FACTOR,
                CTDE_IVAMONTO*COTI_FACTOR, CTDE_DTOPORC, CTDE_TOTAL*COTI_FACTOR, CTDE_CONSUMO, D.lipr_cod
                FROM COTIZACIONES C, COTIZACIONES_DETALLE D, PREFIJOS P
                WHERE C.COTI_ID = D.COTI_ID AND ARTI_COD = :ARTICULO AND COTI_FECHA >= :FECINI AND COTI_FECHA <= :FECFIN AND VEND_COD = :CODVEND AND COTI_ANULADO = 'N'
                 AND P.PREF_PRE = C.PREF_PRE AND P.TIDO_COD = 35 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                ORDER BY COTI_FECHA, C.COTI_ID, CTDE_ITEM
                INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :DTO, :TOTAL, :CONSUMO, :codlista
                DO
                BEGIN
                SELECT ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO WHERE ARTI_COD = :ARTICULO
                    INTO :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC;
                SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                LISTA = 0;
                SELECT PRAR_FIJO FROM precios_articulo WHERE LIPR_COD = :CODLISTA AND ARTI_COD = :ARTICULO INTO :LISTA;
                EXECUTE PROCEDURE costo_promedio (:ARTICULO, :FECHA) RETURNING_VALUES (:COSTOUNIT);
                COSTO = COSTOUNIT * CANTIDAD;
                UTILIDAD = BASE - COSTO;
                if (UOM = 'UTILIDAD') then
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                else
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
                if (CEROS = 'S') then
                    INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (4, USER, :ARTICULO);
                SUSPEND;
                END
            if (CEROS = 'S') then
                BEGIN
                COSTO = 0;
                UTILIDAD = 0;
                PORC = 0;
                /* agregue los articulos sin factura */
                FOR SELECT ARTI_COD, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN and
                    not exists (select REPA_ARTICULO FROM REPORTES_AUX WHERE REPA_ID = 4 AND REPA_USER = USER AND REPA_ARTICULO = a.arti_cod)
                    INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                    DO
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        END
    END
END
^

SET TERM ; ^


SET TERM ^ ;

CREATE OR ALTER procedure REP_UTILIDAD_CLIENTE (
    TIPO integer,
    DETALLE char(1),
    TERINI varchar(20),
    TERFIN varchar(20),
    FECINI date,
    FECFIN date,
    ARTINI varchar(15),
    ARTFIN varchar(15),
    ORDEN char(1),
    CEROS char(1),
    SUBEMPRESA integer)
returns (
    NIT varchar(20),
    NOMBRE varchar(60),
    SUCURSAL varchar(10),
    TELEFONO varchar(40),
    CIUDAD varchar(40),
    CODZONA varchar(2),
    NOMZONA varchar(30),
    NOMTIPO varchar(50),
    ARTICULO varchar(15),
    DESCRIPCION varchar(60),
    CODGRUPO varchar(2),
    NOMGRUPO varchar(30),
    CODSUBG varchar(3),
    NOMSUBG varchar(30),
    CODMARC varchar(3),
    NOMMARC varchar(30),
    UNIDAD varchar(8),
    CANTIDAD numeric(18,4),
    BASE numeric(18,2),
    IVA numeric(18,2),
    COSTO numeric(18,2),
    UTILIDAD numeric(18,4),
    PORC numeric(9,2),
    TOTAL numeric(18,2),
    PREFIJO varchar(4),
    NUMERO varchar(6),
    FECHA date,
    DTO numeric(9,2))
AS
DECLARE VARIABLE COSTOUNIT NUMERIC(18,4);
DECLARE VARIABLE CANTDET NUMERIC(18,4);
DECLARE VARIABLE CODINI VARCHAR(15);
DECLARE VARIABLE CODFIN VARCHAR(15);
DECLARE VARIABLE DESINI VARCHAR(15);
DECLARE VARIABLE DESFIN VARCHAR(15);
declare variable UOM VARCHAR(20);
declare variable NUMROWS INTEGER;
declare variable ID INTEGER;
declare variable ITEM INTEGER;
BEGIN
if (ORDEN = 'C') then
    BEGIN
    CODINI = ARTINI;
    CODFIN = ARTFIN;
    DESINI = '';
    DESFIN = 'zz';
    END
ELSE
    BEGIN
    DESINI = ARTINI;
    DESFIN = ARTFIN;
    CODINI = '';
    CODFIN = 'zz';
    END
EXECUTE PROCEDURE lee_configuracion ('FACTURACION', 'ARTICULOS', 'SUGERIR PRECIOS CON PORCENTAJE DE MARGEN O UTILIDAD') returning_values (:UOM);
SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = :TIPO INTO :NOMTIPO;
if (DETALLE = 'N') then
    BEGIN
    if (BIN_AND(TIPO, 1) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 31 INTO :NOMTIPO;
        /* BORRA LA TABLA AUXILIAR */
        DELETE FROM reportes_aux WHERE REPA_ID = 3 AND REPA_USER = USER;

        FOR SELECT MAX(T.TERC_NIT), MAX(TERC_NOM), MAX(TERC_TEL), MAX(TERC_CIU), MAX(ZONA_COD), MAX(D.ARTI_COD), SUM(FADE_CANT * FADE_FACTOR), SUM(FACT_FACTOR*(FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO)),
            SUM(FACT_FACTOR*FADE_IVAMONTO), SUM(FACT_FACTOR*FADE_TOTAL),
            MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD), max(f.fact_sucursal)
            FROM FACTURAS_DETALLE D, FACTURAS F, PREFIJOS P, terceros T, CLIENTES C, ARTICULO A
            WHERE C.TERC_NIT = T.TERC_NIT AND TERC_CLIE = 'S' AND F.terc_nit = T.terc_nit AND T.TERC_NIT >= :TERINI AND T.TERC_NIT <= :TERFIN AND
            F.FACT_ID = D.FACT_ID AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND FACT_ANULADO = 'N'
            AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) and substring(D.arti_cod from 1 FOR 2) <> '.t'
            AND D.ARTI_COD = A.arti_cod AND A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN
            GROUP BY T.TERC_NIT, f.fact_sucursal, D.ARTI_COD
            INTO :NIT, :NOMBRE, :TELEFONO, :CIUDAD, :CODZONA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :TOTAL,
            :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :sucursal
            DO
            BEGIN
            COSTO = 0;
            FOR SELECT F.FACT_ID, FADE_ITEM, FADE_CANT * FADE_FACTOR, FACT_FECHA FROM FACTURAS_DETALLE D, FACTURAS F, PREFIJOS P
                WHERE F.TERC_NIT = :NIT AND F.FACT_ID = D.FACT_ID AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND
                FACT_ANULADO = 'N' AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                and D.ARTI_COD = :articulo  INTO :ID, :ITEM, :cantdet, :fecha
                DO
                BEGIN
                if (EXISTS (SELECT COST_SALP / COST_SALC FROM COSTOS C, MOVIMIENTO_ARTICULO M
                    WHERE C.arti_cod = M.arti_cod AND COST_IDMOV = MVAR_CONS AND MVAR_TIPODOC = 31 AND MVAR_IDREF = :ID AND COST_SALC <> 0 AND MVAR_ITEM = :ITEM)) then
                    SELECT COST_SALP / COST_SALC FROM COSTOS C, MOVIMIENTO_ARTICULO M
                        WHERE C.arti_cod = M.arti_cod AND COST_IDMOV = MVAR_CONS AND MVAR_TIPODOC = 31 AND MVAR_IDREF = :ID AND COST_SALC <> 0 AND MVAR_ITEM = :ITEM INTO :costounit;
                else
                    EXECUTE PROCEDURE COSTO_PROMEDIO(:ARTICULO, :FECHA) returning_values (:costounit);
                COSTO = COSTO + costounit * cantdet;
                END
            SELECT ZONA_NOM FROM ZONAS WHERE ZONA_COD = :CODZONA INTO :NOMZONA;
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            if (CEROS = 'S') then
                INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (3, USER, :ARTICULO);
            SUSPEND;
            END /* FOR */
        if (CEROS = 'S') then
            BEGIN
            COSTO = 0;
            UTILIDAD = 0;
            PORC = 0;
            /* agregue los articulos sin factura */
            FOR SELECT ARTI_COD, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN
                INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                DO
                BEGIN
                SELECT COUNT(REPA_ARTICULO) FROM REPORTES_AUX WHERE REPA_ID = 3 AND REPA_USER = USER AND REPA_ARTICULO = :articulo INTO :numrows;
                if (numrows = 0) then
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        END
    if (BIN_AND(TIPO, 2) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 32 INTO :NOMTIPO;
        /* BORRA LA TABLA AUXILIAR */
        DELETE FROM reportes_aux WHERE REPA_ID = 3 AND REPA_USER = USER;

        FOR SELECT MAX(T.TERC_NIT), MAX(TERC_NOM), MAX(TERC_TEL), MAX(TERC_CIU), MAX(ZONA_COD), MAX(D.ARTI_COD), SUM(RVDE_CANT * RVDE_FACTOR), SUM(RVDE_TOTAL-RVDE_IVAMONTO-RVDE_CONSUMO), SUM(RVDE_IVAMONTO), SUM(RVDE_TOTAL),
            MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD), max(r.revt_sucursal)
            FROM REMISIONES_VENTA_DETALLE D, REMISIONES_VENTA R, PREFIJOS P, terceros T, CLIENTES C, ARTICULO A
            WHERE C.TERC_NIT = T.TERC_NIT AND TERC_CLIE = 'S' AND R.terc_nit = T.terc_nit AND T.TERC_NIT >= :TERINI AND T.TERC_NIT <= :TERFIN AND
            R.REVT_ID = D.REVT_ID AND REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN AND REVT_ANULADO = 'N'
            AND P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = 32 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            AND D.ARTI_COD = A.arti_cod AND A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN
            GROUP BY T.TERC_NIT, r.revt_sucursal, D.ARTI_COD
            INTO :NIT, :NOMBRE, :TELEFONO, :CIUDAD, :CODZONA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :TOTAL,
                :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :sucursal
            DO
                BEGIN
                COSTO = 0;
                FOR SELECT R.REVT_ID, RVDE_ITEM, RVDE_CANT * RVDE_FACTOR, REVT_FECHA
                    FROM REMISIONES_VENTA_DETALLE D, REMISIONES_VENTA R, PREFIJOS P
                    WHERE R.terc_nit = :nit AND R.REVT_ID = D.REVT_ID AND REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN AND REVT_ANULADO = 'N'
                    AND P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = 32 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                    AND D.ARTI_COD = :articulo INTO :ID, :ITEM, :cantdet, :fecha
                    DO
                    BEGIN
                    if (EXISTS (SELECT COST_SALP / COST_SALC FROM COSTOS C, MOVIMIENTO_ARTICULO M
                        WHERE C.arti_cod = M.arti_cod AND COST_IDMOV = MVAR_CONS AND MVAR_TIPODOC = 32 AND MVAR_IDREF = :ID AND COST_SALC <> 0 AND MVAR_ITEM = :ITEM)) then
                        SELECT COST_SALP / COST_SALC FROM COSTOS C, MOVIMIENTO_ARTICULO M
                            WHERE C.arti_cod = M.arti_cod AND COST_IDMOV = MVAR_CONS AND MVAR_TIPODOC = 32 AND MVAR_IDREF = :ID AND COST_SALC <> 0 AND MVAR_ITEM = :ITEM INTO :costounit;
                    else
                        EXECUTE PROCEDURE COSTO_PROMEDIO(:ARTICULO, :FECHA) returning_values (:costounit);
                    COSTO = COSTO + costounit * cantdet;
                    END
                SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                if (CANTIDAD IS NULL) then
                    CANTIDAD = 0;
                if (BASE IS NULL) then
                    BASE = 0;
                if (IVA IS NULL) then
                    IVA = 0;
                UTILIDAD = BASE - COSTO;
                if (UOM = 'UTILIDAD') then
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                else
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            if (CEROS = 'S') then
                INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (3, USER, :ARTICULO);
            SUSPEND;
            END /* FOR */
        if (CEROS = 'S') then
            BEGIN
            COSTO = 0;
            UTILIDAD = 0;
            PORC = 0;
            /* agregue los articulos sin factura */
            FOR SELECT ARTI_COD, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN
                INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                DO
                BEGIN
                SELECT COUNT(REPA_ARTICULO) FROM REPORTES_AUX WHERE REPA_ID = 3 AND REPA_USER = USER AND REPA_ARTICULO = :articulo INTO :numrows;
                if (numrows = 0) then
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        END
    if (BIN_AND(TIPO, 4) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 33 INTO :NOMTIPO;
        /* BORRA LA TABLA AUXILIAR */
        DELETE FROM reportes_aux WHERE REPA_ID = 3 AND REPA_USER = USER;

        FOR SELECT MAX(T.TERC_NIT), MAX(TERC_NOM), MAX(TERC_TEL), MAX(TERC_CIU), MAX(ZONA_COD), MAX(D.ARTI_COD), SUM(DVDE_CANT * DVDE_FACTOR), SUM(DEVT_FACTOR*(DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO)),
            SUM(DEVT_FACTOR*DVDE_IVAMONTO), SUM(DEVT_FACTOR*DVDE_TOTAL),
            MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD), max(v.devt_sucursal)
            FROM devoluciones_ventas_detalle D, DEVOLUCIONES_VENTAS V, PREFIJOS P, terceros T, CLIENTES C, ARTICULO A
            WHERE C.TERC_NIT = T.TERC_NIT AND TERC_CLIE = 'S' AND V.terc_nit = T.terc_nit AND T.TERC_NIT >= :TERINI AND T.TERC_NIT <= :TERFIN AND
            V.DEVT_ID = D.DEVT_ID AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND DEVT_ANULADO = 'N'
            AND P.PREF_PRE = V.PREF_PRE AND P.TIDO_COD = 33 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) and substring(D.arti_cod from 1 FOR 2) <> '.t'
            AND D.ARTI_COD = A.arti_cod AND A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN
            GROUP BY T.TERC_NIT, v.devt_sucursal, D.ARTI_COD
            INTO :NIT, :NOMBRE, :TELEFONO, :CIUDAD, :CODZONA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :TOTAL,
                :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :sucursal
            DO
            BEGIN
            COSTO = 0;
            FOR SELECT V.DEVT_ID, DVDE_ITEM, DVDE_CANT * DVDE_FACTOR, DEVT_FECHA
                FROM devoluciones_ventas_detalle D, DEVOLUCIONES_VENTAS V, PREFIJOS P
                WHERE V.terc_nit = :nit AND V.DEVT_ID = D.DEVT_ID AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND DEVT_ANULADO = 'N'
                AND P.PREF_PRE = V.PREF_PRE AND P.TIDO_COD = 33 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                AND D.ARTI_COD = :articulo INTO :ID, :ITEM, :cantdet, :fecha
                DO
                BEGIN
                if (EXISTS (SELECT COST_ENTP / COST_ENTC FROM COSTOS C, MOVIMIENTO_ARTICULO M
                    WHERE C.arti_cod = M.arti_cod AND COST_IDMOV = MVAR_CONS AND MVAR_TIPODOC = 33 AND MVAR_IDREF = :ID AND COST_ENTC <> 0 AND MVAR_ITEM = :ITEM)) then
                    SELECT COST_ENTP / COST_ENTC FROM COSTOS C, MOVIMIENTO_ARTICULO M
                        WHERE C.arti_cod = M.arti_cod AND COST_IDMOV = MVAR_CONS AND MVAR_TIPODOC = 33 AND MVAR_IDREF = :ID AND COST_ENTC <> 0 AND MVAR_ITEM = :ITEM INTO :costounit;
                else
                    EXECUTE PROCEDURE COSTO_PROMEDIO(:ARTICULO, :FECHA) returning_values (:costounit);
                COSTO = COSTO + costounit * cantdet;
                END
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            TOTAL = TOTAL * -1;
            IVA = IVA * -1;
            BASE = BASE * -1;
            CANTIDAD = CANTIDAD * -1;
            COSTO = COSTO * -1;
            UTILIDAD = UTILIDAD * -1;
            if (CEROS = 'S') then
                INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (3, USER, :ARTICULO);
            SUSPEND;
            END /* FOR */
        if (CEROS = 'S') then
            BEGIN
            COSTO = 0;
            UTILIDAD = 0;
            PORC = 0;
            /* agregue los articulos sin factura */
            FOR SELECT ARTI_COD, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN
                INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                DO
                BEGIN
                SELECT COUNT(REPA_ARTICULO) FROM REPORTES_AUX WHERE REPA_ID = 3 AND REPA_USER = USER AND REPA_ARTICULO = :articulo INTO :numrows;
                if (numrows = 0) then
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        END
    if (BIN_AND(TIPO, 8) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 34 INTO :NOMTIPO;
        /* BORRA LA TABLA AUXILIAR */
        DELETE FROM reportes_aux WHERE REPA_ID = 3 AND REPA_USER = USER;

        FOR SELECT MAX(T.TERC_NIT), MAX(TERC_NOM), MAX(TERC_TEL), MAX(TERC_CIU), MAX(ZONA_COD), MAX(D.ARTI_COD), SUM(PEDE_CANT * PEDE_FACTOR),
            SUM(PEDI_FACTOR*(PEDE_TOTAL-PEDE_IVAMONTO-PEDE_CONSUMO)), SUM(PEDI_FACTOR*PEDE_IVAMONTO), SUM(PEDI_FACTOR*PEDE_TOTAL),
            MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD), max(p.pedi_sucursal)
            FROM PEDIDOS_DETALLE D, PEDIDOS P, PREFIJOS PR, terceros T, CLIENTES C, ARTICULO A
            WHERE C.TERC_NIT = T.TERC_NIT AND TERC_CLIE = 'S' AND P.terc_nit = T.terc_nit AND T.TERC_NIT >= :TERINI AND T.TERC_NIT <= :TERFIN AND
            P.PEDI_ID = D.PEDI_ID AND PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND PEDI_ANULADO = 'N'
            AND PR.PREF_PRE = P.PREF_PRE AND P.TIDO_COD = 34 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY T.TERC_NIT, p.pedi_sucursal, D.ARTI_COD
            INTO :NIT, :NOMBRE, :TELEFONO, :CIUDAD, :CODZONA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :TOTAL,
                :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :sucursal
            DO
            BEGIN
            COSTO = 0;
            FOR SELECT PEDE_CANT * PEDE_FACTOR, PEDI_FECHA
                FROM PEDIDOS_DETALLE D, PEDIDOS PE, PREFIJOS P
                WHERE PE.terc_nit = :nit AND PE.PEDI_ID = D.PEDI_ID AND PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND PEDI_ANULADO = 'N'
                AND P.PREF_PRE = PE.PREF_PRE AND P.TIDO_COD = 34 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                AND D.ARTI_COD = :articulo INTO :cantdet, :fecha
                DO
                BEGIN
                EXECUTE PROCEDURE COSTO_PROMEDIO(:ARTICULO, :FECHA) returning_values (:costounit);
                COSTO = COSTO + costounit * cantdet;
                END
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            if (CEROS = 'S') then
                INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (3, USER, :ARTICULO);
            SUSPEND;
            END /* FOR */
        if (CEROS = 'S') then
            BEGIN
            COSTO = 0;
            UTILIDAD = 0;
            PORC = 0;
            /* agregue los articulos sin factura */
            FOR SELECT ARTI_COD, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN
                INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                DO
                BEGIN
                SELECT COUNT(REPA_ARTICULO) FROM REPORTES_AUX WHERE REPA_ID = 3 AND REPA_USER = USER AND REPA_ARTICULO = :articulo INTO :numrows;
                if (numrows = 0) then
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        END
    if (BIN_AND(TIPO, 16) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 35 INTO :NOMTIPO;
        /* BORRA LA TABLA AUXILIAR */
        DELETE FROM reportes_aux WHERE REPA_ID = 3 AND REPA_USER = USER;

        FOR SELECT MAX(T.TERC_NIT), MAX(TERC_NOM), MAX(TERC_TEL), MAX(TERC_CIU), MAX(ZONA_COD), MAX(D.ARTI_COD), SUM(CTDE_CANT * CTDE_FACTOR),
            SUM(COTI_FACTOR*(CTDE_TOTAL-CTDE_IVAMONTO-CTDE_CONSUMO)), SUM(COTI_FACTOR*CTDE_IVAMONTO), SUM(COTI_FACTOR*CTDE_TOTAL),
            MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD), max(ct.coti_sucursal)
            FROM COTIZACIONES_DETALLE D, COTIZACIONES CT, PREFIJOS P, terceros T, CLIENTES C, ARTICULO A
            WHERE C.TERC_NIT = T.TERC_NIT AND TERC_CLIE = 'S' AND C.terc_nit = T.terc_nit AND T.TERC_NIT >= :TERINI AND T.TERC_NIT <= :TERFIN AND
            CT.COTI_ID = D.COTI_ID AND COTI_FECHA >= :FECINI AND COTI_FECHA <= :FECFIN AND COTI_ANULADO = 'N'
            AND P.PREF_PRE = CT.PREF_PRE AND P.TIDO_COD = 35 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY T.TERC_NIT, ct.coti_sucursal, D.ARTI_COD
            INTO :NIT, :NOMBRE, :TELEFONO, :CIUDAD, :CODZONA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :TOTAL,
                :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :sucursal
            DO
            BEGIN
            COSTO = 0;
            FOR SELECT CTDE_CANT * CTDE_FACTOR, COTI_FECHA
                FROM COTIZACIONES_DETALLE D, COTIZACIONES C, PREFIJOS P
                WHERE C.terc_nit = :nit AND C.COTI_ID = D.coti_id AND COTI_FECHA >= :FECINI AND COTI_FECHA <= :FECFIN AND COTI_ANULADO = 'N'
                AND P.PREF_PRE = C.PREF_PRE AND P.TIDO_COD = 35 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                AND D.ARTI_COD = :articulo INTO :cantdet, :fecha
                DO
                BEGIN
                EXECUTE PROCEDURE COSTO_PROMEDIO(:ARTICULO, :FECHA) returning_values (:costounit);
                COSTO = COSTO + costounit * cantdet;
                END
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            EXECUTE PROCEDURE costo_promedio (:ARTICULO, :FECFIN) RETURNING_VALUES (:COSTOUNIT);
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            if (CEROS = 'S') then
                INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (3, USER, :ARTICULO);
            SUSPEND;
            END /* FOR */
        if (CEROS = 'S') then
            BEGIN
            COSTO = 0;
            UTILIDAD = 0;
            PORC = 0;
            /* agregue los articulos sin factura */
            FOR SELECT ARTI_COD, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN
                INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                DO
                BEGIN
                SELECT COUNT(REPA_ARTICULO) FROM REPORTES_AUX WHERE REPA_ID = 3 AND REPA_USER = USER AND REPA_ARTICULO = :articulo INTO :numrows;
                if (numrows = 0) then
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        END
    END
ELSE
    BEGIN
    if (BIN_AND(TIPO, 1) <> 0) then
            BEGIN
            SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 31 INTO :NOMTIPO;
            FOR SELECT F.PREF_PRE, FACT_NUMERO, FACT_FECHA, ARTI_COD, FADE_CANT * FADE_FACTOR, (FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO)*FACT_FACTOR,
                FADE_IVAMONTO*FACT_FACTOR, FADE_DTOPORC, FADE_TOTAL*FACT_FACTOR, F.terc_nit, F.fact_nomcliente, f.fact_sucursal
                FROM FACTURAS F, FACTURAS_DETALLE D, PREFIJOS P
                WHERE F.FACT_ID = D.FACT_ID AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND F.TERC_NIT >= :TERINI AND F.TERC_NIT <= :TERFIN AND FACT_ANULADO = 'N'
                 AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) and substring(D.arti_cod from 1 FOR 2) <> '.t'
                ORDER BY f.terc_nit, f.fact_sucursal, ARTI_COD, FACT_FECHA, F.FACT_ID, FADE_ITEM
                INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :DTO, :TOTAL, :NIT, :nombre, :sucursal
                DO
                BEGIN
                SELECT ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO WHERE ARTI_COD = :ARTICULO
                    INTO :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC;
                SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                EXECUTE PROCEDURE costo_promedio (:ARTICULO, :FECHA) RETURNING_VALUES (:COSTOUNIT);
                COSTO = COSTOUNIT * CANTIDAD;
                UTILIDAD = BASE - COSTO;
                if (UOM = 'UTILIDAD') then
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                else
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
                SUSPEND;
                END
            END
    if (BIN_AND(TIPO, 2) <> 0) then
            BEGIN
            SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 32 INTO :NOMTIPO;
            FOR SELECT R.PREF_PRE, REVT_NUMERO, REVT_FECHA, ARTI_COD, RVDE_CANT * RVDE_FACTOR,
                (RVDE_TOTAL - RVDE_IVAMONTO), RVDE_IVAMONTO, RVDE_DTOPORC, RVDE_TOTAL, R.terc_nit, R.revt_nomterc, r.revt_sucursal
                FROM REMISIONES_VENTA R, REMISIONES_VENTA_DETALLE D, PREFIJOS P
                WHERE R.REVT_ID = D.REVT_ID AND REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN AND R.TERC_NIT >= :TERINI AND R.TERC_NIT <= :TERFIN AND REVT_ANULADO = 'N'
                 AND P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = 32 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                ORDER BY r.terc_nit, r.revt_sucursal, ARTI_COD, REVT_FECHA, R.REVT_ID, RVDE_ITEM
                INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :DTO, :TOTAL, :NIT, :nombre, :sucursal
                DO
                BEGIN
                SELECT ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO WHERE ARTI_COD = :ARTICULO
                    INTO :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC;
                SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                EXECUTE PROCEDURE costo_promedio (:ARTICULO, :FECHA) RETURNING_VALUES (:COSTOUNIT);
                COSTO = COSTOUNIT * CANTIDAD;
                UTILIDAD = BASE - COSTO;
                if (UOM = 'UTILIDAD') then
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                else
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
                SUSPEND;
                END
            END
    if (BIN_AND(TIPO, 4) <> 0) then
            BEGIN
            SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 33 INTO :NOMTIPO;
            FOR SELECT V.PREF_PRE, DEVT_NUMERO, DEVT_FECHA, ARTI_COD, DVDE_CANT * DVDE_FACTOR, (DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO)*DEVT_FACTOR,
                DVDE_IVAMONTO*DEVT_FACTOR, DVDE_DTOPORC, DVDE_TOTAL*DEVT_FACTOR, V.terc_nit, V.devt_nomterc, v.devt_sucursal
                FROM DEVOLUCIONES_VENTAS V, DEVOLUCIONES_VENTAS_DETALLE D, PREFIJOS P
                WHERE V.DEVT_ID = D.DEVT_ID AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND V.TERC_NIT >= :TERINI AND V.TERC_NIT <= :TERFIN AND DEVT_ANULADO = 'N'
                 AND P.PREF_PRE = V.PREF_PRE AND P.TIDO_COD = 33 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))  and substring(D.arti_cod from 1 FOR 2) <> '.t'
                ORDER BY v.terc_nit, v.devt_sucursal, ARTI_COD, DEVT_FECHA, D.DEVT_ID, DVDE_ITEM
                INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :DTO, :TOTAL, :NIT, :nombre, :sucursal
                DO
                BEGIN
                SELECT ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO WHERE ARTI_COD = :ARTICULO
                    INTO :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC;
                SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                EXECUTE PROCEDURE costo_promedio (:ARTICULO, :FECHA) RETURNING_VALUES (:COSTOUNIT);
                COSTO = COSTOUNIT * CANTIDAD;
                UTILIDAD = BASE - COSTO;
                if (UOM = 'UTILIDAD') then
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                else
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
                TOTAL = TOTAL * -1;
                IVA = IVA * -1;
                BASE = BASE * -1;
                CANTIDAD = CANTIDAD * -1;
                COSTO = COSTO * -1;
                UTILIDAD = UTILIDAD * -1;
                SUSPEND;
                END
            END
    if (BIN_AND(TIPO, 8) <> 0) then
            BEGIN
            SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 34 INTO :NOMTIPO;
            FOR SELECT P.PREF_PRE, PEDI_NUMERO, PEDI_FECHA, ARTI_COD, PEDE_CANT * PEDE_FACTOR, (PEDE_TOTAL-PEDE_IVAMONTO-PEDE_CONSUMO)*PEDI_FACTOR,
                PEDE_IVAMONTO*PEDI_FACTOR, PEDE_DTOPORC, PEDE_TOTAL*PEDI_FACTOR, P.terc_nit, P.pedi_nomterc, p.pedi_sucursal
                FROM PEDIDOS P, PEDIDOS_DETALLE D, PREFIJOS PR
                WHERE P.PEDI_ID = D.PEDI_ID AND PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND P.TERC_NIT >= :TERINI AND P.TERC_NIT <= :TERFIN AND PEDI_ANULADO = 'N'
                 AND P.PREF_PRE = PR.PREF_PRE AND P.TIDO_COD = 34 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                ORDER BY p.terc_nit, p.pedi_sucursal, ARTI_COD, PEDI_FECHA, P.PEDI_ID, PEDE_ITEM
                INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :DTO, :TOTAL, :NIT, :nombre, :sucursal
                DO
                BEGIN
                SELECT ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO WHERE ARTI_COD = :ARTICULO
                    INTO :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC;
                SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                EXECUTE PROCEDURE costo_promedio (:ARTICULO, :FECHA) RETURNING_VALUES (:COSTOUNIT);
                COSTO = COSTOUNIT * CANTIDAD;
                UTILIDAD = BASE - COSTO;
                if (UOM = 'UTILIDAD') then
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                else
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
                SUSPEND;
                END
            END
    if (BIN_AND(TIPO, 16) <> 0) then
            BEGIN
            SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 35 INTO :NOMTIPO;
            FOR SELECT C.PREF_PRE, COTI_NUMERO, COTI_FECHA, ARTI_COD, CTDE_CANT * CTDE_FACTOR, (CTDE_TOTAL-CTDE_IVAMONTO-CTDE_CONSUMO)*COTI_FACTOR,
                CTDE_IVAMONTO*COTI_FACTOR, CTDE_DTOPORC, CTDE_TOTAL*COTI_FACTOR, C.terc_nit, C.coti_nomterc, c.coti_sucursal
                FROM COTIZACIONES C, COTIZACIONES_DETALLE D, PREFIJOS P
                WHERE C.COTI_ID = D.COTI_ID AND ARTI_COD = :ARTICULO AND COTI_FECHA >= :FECINI AND COTI_FECHA <= :FECFIN AND C.TERC_NIT >= :TERINI AND C.TERC_NIT <= :TERFIN AND COTI_ANULADO = 'N'
                 AND P.PREF_PRE = C.PREF_PRE AND P.TIDO_COD = 35 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                ORDER BY c.terc_nit, c.coti_sucursal, COTI_FECHA, C.COTI_ID, CTDE_ITEM
                INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :DTO, :TOTAL, :NIT, :nombre, :sucursal
                DO
                BEGIN
                SELECT ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO WHERE ARTI_COD = :ARTICULO
                    INTO :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC;
                SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                EXECUTE PROCEDURE costo_promedio (:ARTICULO, :FECHA) RETURNING_VALUES (:COSTOUNIT);
                COSTO = COSTOUNIT * CANTIDAD;
                UTILIDAD = BASE - COSTO;
                if (UOM = 'UTILIDAD') then
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                else
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
                SUSPEND;
                END
            END
    END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure UTILIDAD_VENTAS (
    TIPO integer,
    DETALLE char(1),
    FECINI date,
    FECFIN date,
    PREFIJO varchar(4),
    ULTIMO char(1),
    SUBEMPRESA integer)
returns (
    PREF varchar(4),
    NUMERO varchar(6),
    FECHA date,
    PTVTID integer,
    VENDCOD integer,
    NIT varchar(20),
    NOMTERCERO varchar(60),
    ARTICULO varchar(15),
    ARTIDES varchar(60),
    CANT numeric(18,4),
    UNIDAD varchar(8),
    PRECIO numeric(18,2),
    COSTO numeric(18,2),
    UTILIDAD numeric(18,2),
    PORC numeric(9,2))
AS
declare variable IMPTOS CHAR(1);
declare variable ID INTEGER;
declare variable IVA NUMERIC(18,2);
declare variable COSTOT NUMERIC(18,2);
declare variable ULTCOS NUMERIC(18,2);
declare variable PRECIOT NUMERIC(18,2);
declare variable UOM VARCHAR(20);
declare variable icoinc char(2);
declare variable consumo NUMERIC(18,2);
declare variable factor NUMERIC(18,4);
declare variable ITEM INTEGER;
BEGIN
EXECUTE PROCEDURE lee_configuracion ('FACTURACION', 'ARTICULOS', 'SUGERIR PRECIOS CON PORCENTAJE DE MARGEN O UTILIDAD') returning_values (:UOM);
EXECUTE PROCEDURE lee_configuracion ('FACTURACION', 'ARTICULOS', 'IMPOCONSUMO INCLUIDO EN EL PRECIO BASE DE VENTA ANTES DE IVA') returning_values (:icoinc);
/* DETERMINE LA TABLA A EXAMINAR */
if (TIPO = 31) then
    BEGIN
    /* FACTURA */
    FOR SELECT FACT_ID, F.PREF_PRE, FACT_NUMERO, FACT_FECHA, PTVT_ID, VEND_COD, TERC_NIT, FACT_NOMCLIENTE, FACT_IVAINC, fact_factor
        FROM FACTURAS F, PREFIJOS P
        WHERE FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND FACT_ANULADO = 'N'
         AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = :TIPO AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
        ORDER BY FACT_FECHA, F.PREF_PRE, FACT_NUMERO
        INTO :ID, :PREF, :NUMERO, :FECHA, :PTVTID, :VENDCOD, :NIT, :NOMTERCERO, :IMPTOS, :factor
        DO
        if ((PREFIJO = '') or (PREFIJO = PREF)) then
          BEGIN
          COSTOT = 0;
          PRECIOT = 0;
          FOR SELECT FADE_ITEM, D.ARTI_COD, SUBSTR(FADE_DESC,1,60), FADE_CANT * FADE_FACTOR, FADE_UNIDAD, (FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO)*:FACTOR, FADE_IVAMONTO, fade_consumo
            FROM FACTURAS_DETALLE D
            WHERE FACT_ID = :ID and substring(D.arti_cod from 1 FOR 2) <> '.t'
            INTO :ITEM, :ARTICULO, :ARTIDES, :CANT, :UNIDAD, :PRECIO, :IVA, :consumo
            DO
                BEGIN
                if (EXISTS (SELECT COST_SALP / COST_SALC FROM COSTOS C, MOVIMIENTO_ARTICULO M
                    WHERE C.arti_cod = M.arti_cod AND COST_IDMOV = MVAR_CONS AND MVAR_TIPODOC = 31 AND MVAR_IDREF = :ID AND COST_SALC <> 0 AND MVAR_ITEM = :ITEM)) then
                    SELECT COST_SALP / COST_SALC, COST_ULTIMO FROM COSTOS C, MOVIMIENTO_ARTICULO M
                        WHERE C.arti_cod = M.arti_cod AND COST_IDMOV = MVAR_CONS AND MVAR_TIPODOC = 31 AND MVAR_IDREF = :ID AND COST_SALC <> 0 AND MVAR_ITEM = :ITEM INTO :costo, :ultcos;
                else
                    EXECUTE PROCEDURE costo_promedio_y_ultimo(:ARTICULO, :FECHA) returning_values (:COSTO, :ultcos);
                if (ULTIMO = 'S') then
                    COSTO = ultcos * CANT;
                else
                    COSTO = COSTO * CANT;
                if (DETALLE = 'S') then
                    BEGIN
                    UTILIDAD = PRECIO - COSTO;
                    if (UOM = 'UTILIDAD') then
                        EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                    else
                        EXECUTE PROCEDURE PORCENTAJE (utilidad,  PRECIO, 'S') returning_values (PORC);
                    SUSPEND;
                    END
                ELSE
                    BEGIN
                    COSTOT = COSTOT + COSTO;
                    PRECIOT = PRECIOT + PRECIO;
                    END
                END
          if (DETALLE <> 'S') then
            BEGIN
            COSTO = COSTOT;
            PRECIO = PRECIOT;
            UTILIDAD = PRECIO - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  PRECIO, 'S') returning_values (PORC);
            SUSPEND;
            END
          END
    END
  if (TIPO = 32) then
    BEGIN
    /* REMISION */
    FOR SELECT REVT_ID, R.PREF_PRE, REVT_NUMERO, REVT_FECHA, PTVT_ID, VEND_COD, TERC_NIT, REVT_NOMTERC, REVT_IVAINC
        FROM REMISIONES_VENTA R, PREFIJOS P
        WHERE REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN AND REVT_ANULADO = 'N'
         AND P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = :TIPO AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
        ORDER BY REVT_FECHA, R.PREF_PRE, REVT_NUMERO
        INTO :ID, :PREF, :NUMERO, :FECHA, :PTVTID, :VENDCOD, :NIT, :NOMTERCERO, :IMPTOS
        DO
        if ((PREFIJO = '') or (PREFIJO = PREF)) then
          BEGIN
          COSTOT = 0;
          PRECIOT = 0;
          FOR SELECT RVDE_ITEM, D.ARTI_COD, SUBSTR(RVDE_DESC,1,60), RVDE_CANT * RVDE_FACTOR, RVDE_UNIDAD, (RVDE_TOTAL-RVDE_IVAMONTO-RVDE_CONSUMO), RVDE_IVAMONTO, rvde_consumo
            FROM REMISIONES_VENTA_DETALLE D
            WHERE REVT_ID = :ID and substring(D.arti_cod from 1 FOR 2) <> '.t'
            INTO :ITEM, :ARTICULO, :ARTIDES, :CANT, :UNIDAD, :PRECIO, :IVA, :consumo
            DO
                BEGIN
                if (EXISTS (SELECT COST_SALP / COST_SALC FROM COSTOS C, MOVIMIENTO_ARTICULO M
                    WHERE C.arti_cod = M.arti_cod AND COST_IDMOV = MVAR_CONS AND MVAR_TIPODOC = 32 AND MVAR_IDREF = :ID AND COST_SALC <> 0 AND MVAR_ITEM = :ITEM)) then
                    SELECT COST_SALP / COST_SALC, COST_ULTIMO FROM COSTOS C, MOVIMIENTO_ARTICULO M
                        WHERE C.arti_cod = M.arti_cod AND COST_IDMOV = MVAR_CONS AND MVAR_TIPODOC = 32 AND MVAR_IDREF = :ID AND COST_SALC <> 0 AND MVAR_ITEM = :ITEM INTO :costo, :ultcos;
                else
                    EXECUTE PROCEDURE costo_promedio_y_ultimo(:ARTICULO, :FECHA) returning_values (:COSTO, :ultcos);
                if (ULTIMO = 'S') then
                    COSTO = ultcos * CANT;
                else
                    COSTO = COSTO * CANT;
                if (DETALLE = 'S') then
                    BEGIN
                    UTILIDAD = PRECIO - COSTO;
                    if (UOM = 'UTILIDAD') then
                        EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                    else
                        EXECUTE PROCEDURE PORCENTAJE (utilidad,  PRECIO, 'S') returning_values (PORC);
                    SUSPEND;
                    END
                ELSE
                    BEGIN
                    COSTOT = COSTOT + COSTO;
                    PRECIOT = PRECIOT + PRECIO;
                    END
                END
          if (DETALLE <> 'S') then
            BEGIN
            COSTO = COSTOT;
            PRECIO = PRECIOT;
            UTILIDAD = PRECIO - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  PRECIO, 'S') returning_values (PORC);
            SUSPEND;
            END
          END
    END
  if (TIPO = 33) then
    BEGIN
    /* DEVOLUCION */
    FOR SELECT DEVT_ID, D.PREF_PRE, DEVT_NUMERO, DEVT_FECHA, PTVT_ID, VEND_COD, TERC_NIT, DEVT_NOMTERC, DEVT_IVAINC, DEVT_FACTOR
        FROM DEVOLUCIONES_VENTAS D, PREFIJOS P
        WHERE DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND DEVT_ANULADO = 'N'
         AND P.PREF_PRE = D.PREF_PRE AND P.TIDO_COD = :TIPO AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
        ORDER BY DEVT_FECHA, D.PREF_PRE, DEVT_NUMERO
        INTO :ID, :PREF, :NUMERO, :FECHA, :PTVTID, :VENDCOD, :NIT, :NOMTERCERO, :IMPTOS, :FACTOR
        DO
        if ((PREFIJO = '') or (PREFIJO = PREF)) then
          BEGIN
          COSTOT = 0;
          PRECIOT = 0;
          FOR SELECT DVDE_ITEM, D.ARTI_COD, SUBSTR(DVDE_DESC,1,60), DVDE_CANT * DVDE_FACTOR, DVDE_UNIDAD, (DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO)*:FACTOR, DVDE_IVAMONTO, dvde_consumo
            FROM DEVOLUCIONES_VENTAS_DETALLE D
            WHERE DEVT_ID = :ID and substring(D.arti_cod from 1 FOR 2) <> '.t'
            INTO :ITEM, :ARTICULO, :ARTIDES, :CANT, :UNIDAD, :PRECIO, :IVA, :consumo
            DO
                BEGIN
                if (EXISTS (SELECT COST_ENTP / COST_ENTC FROM COSTOS C, MOVIMIENTO_ARTICULO M
                    WHERE C.arti_cod = M.arti_cod AND COST_IDMOV = MVAR_CONS AND MVAR_TIPODOC = 33 AND MVAR_IDREF = :ID AND COST_ENTC <> 0 AND MVAR_ITEM = :ITEM)) then
                    SELECT COST_ENTP / COST_ENTC FROM COSTOS C, MOVIMIENTO_ARTICULO M
                        WHERE C.arti_cod = M.arti_cod AND COST_IDMOV = MVAR_CONS AND MVAR_TIPODOC = 33 AND MVAR_IDREF = :ID AND COST_ENTC <> 0 AND MVAR_ITEM = :ITEM INTO :costo;
                else
                    EXECUTE PROCEDURE costo_promedio_y_ultimo(:ARTICULO, :FECHA) returning_values (:COSTO, :ultcos);
                if (ULTIMO = 'S') then
                    COSTO = ultcos * CANT;
                else
                    COSTO = COSTO * CANT;
                if (DETALLE = 'S') then
                    BEGIN
                    UTILIDAD = PRECIO - COSTO;
                    if (UOM = 'UTILIDAD') then
                        EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                    else
                        EXECUTE PROCEDURE PORCENTAJE (utilidad,  PRECIO, 'S') returning_values (PORC);
                    SUSPEND;
                    END
                ELSE
                    BEGIN
                    COSTOT = COSTOT + COSTO;
                    PRECIOT = PRECIOT + PRECIO;
                    END
                END
        if (DETALLE <> 'S') then
            BEGIN
            COSTO = COSTOT;
            PRECIO = PRECIOT;
            UTILIDAD = PRECIO - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  PRECIO, 'S') returning_values (PORC);
            SUSPEND;
            END
        END
    END
  if (TIPO = 34) then
    BEGIN
    /* PEDIDO */
    FOR SELECT PEDI_ID, P.PREF_PRE, PEDI_NUMERO, PEDI_FECHA, PTVT_ID, VEND_COD, TERC_NIT, PEDI_NOMTERC, PEDI_IVAINC, PEDI_FACTOR
        FROM PEDIDOS P, PREFIJOS R
        WHERE PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND PEDI_ANULADO = 'N'
         AND P.PREF_PRE = R.PREF_PRE AND R.TIDO_COD = :TIPO AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
        ORDER BY PEDI_FECHA, P.PREF_PRE, PEDI_NUMERO
        INTO :ID, :PREF, :NUMERO, :FECHA, :PTVTID, :VENDCOD, :NIT, :NOMTERCERO, :IMPTOS, :FACTOR
        DO
        if ((PREFIJO = '') or (PREFIJO = PREF)) then
          BEGIN
          COSTOT = 0;
          PRECIOT = 0;
          FOR SELECT ARTI_COD, SUBSTR(PEDE_DESC,1,60), PEDE_CANT * PEDE_FACTOR, PEDE_UNIDAD, (PEDE_TOTAL-PEDE_IVAMONTO-PEDE_CONSUMO)*:FACTOR, PEDE_IVAMONTO, pede_consumo
            FROM PEDIDOS_DETALLE
            WHERE PEDI_ID = :ID
            INTO :ARTICULO, :ARTIDES, :CANT, :UNIDAD, :PRECIO, :IVA, :consumo
            DO
                BEGIN
                EXECUTE PROCEDURE costo_promedio_y_ultimo(:ARTICULO, :FECHA) returning_values (:COSTO, :ultcos);
                if (ULTIMO = 'S') then
                    COSTO = ultcos * CANT;
                else
                    COSTO = COSTO * CANT;
                if (DETALLE = 'S') then
                    BEGIN
                    UTILIDAD = PRECIO - COSTO;
                    if (UOM = 'UTILIDAD') then
                        EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                    else
                        EXECUTE PROCEDURE PORCENTAJE (utilidad,  PRECIO, 'S') returning_values (PORC);
                    SUSPEND;
                    END
                ELSE
                    BEGIN
                    COSTOT = COSTOT + COSTO;
                    PRECIOT = PRECIOT + PRECIO;
                    END
                END
        if (DETALLE <> 'S') then
            BEGIN
            COSTO = COSTOT;
            PRECIO = PRECIOT;
            UTILIDAD = PRECIO - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  PRECIO, 'S') returning_values (PORC);
            SUSPEND;
            END
        END
    END
  if (TIPO = 35) then
    BEGIN
    /* COTIZACION */
    FOR SELECT COTI_ID, C.PREF_PRE, COTI_NUMERO, COTI_FECHA, PTVT_ID, VEND_COD, TERC_NIT, COTI_NOMTERC, COTI_IMPTOS, COTI_FACTOR
        FROM COTIZACIONES C, PREFIJOS P
        WHERE COTI_FECHA >= :FECINI AND COTI_FECHA <= :FECFIN AND COTI_ANULADO = 'N'
         AND P.PREF_PRE = C.PREF_PRE AND P.TIDO_COD = :TIPO AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
        ORDER BY COTI_FECHA, C.PREF_PRE, COTI_NUMERO
        INTO :ID, :PREF, :NUMERO, :FECHA, :PTVTID, :VENDCOD, :NIT, :NOMTERCERO, :IMPTOS, :FACTOR
        DO
        if ((PREFIJO = '') or (PREFIJO = PREF)) then
          BEGIN
          COSTOT = 0;
          PRECIOT = 0;
          FOR SELECT ARTI_COD, SUBSTR(CTDE_DESC,1,60), CTDE_CANT * CTDE_FACTOR, CTDE_UNIDAD, (CTDE_TOTAL-CTDE_IVAMONTO-CTDE_CONSUMO)*:FACTOR, CTDE_IVAMONTO, ctde_consumo
            FROM COTIZACIONES_DETALLE
            WHERE COTI_ID = :ID
            INTO :ARTICULO, :ARTIDES, :CANT, :UNIDAD, :PRECIO, :IVA, :consumo
            DO
                BEGIN
                EXECUTE PROCEDURE costo_promedio_y_ultimo(:ARTICULO, :FECHA) returning_values (:COSTO, :ultcos);
                if (ULTIMO = 'S') then
                    COSTO = ultcos * CANT;
                else
                    COSTO = COSTO * CANT;
                if (DETALLE = 'S') then
                    BEGIN
                    UTILIDAD = PRECIO - COSTO;
                    if (UOM = 'UTILIDAD') then
                        EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                    else
                        EXECUTE PROCEDURE PORCENTAJE (utilidad,  PRECIO, 'S') returning_values (PORC);
                    SUSPEND;
                    END
                ELSE
                    BEGIN
                    COSTOT = COSTOT + COSTO;
                    PRECIOT = PRECIOT + PRECIO;
                    END
                END
        if (DETALLE <> 'S') then
            BEGIN
            COSTO = COSTOT;
            PRECIO = PRECIOT;
            UTILIDAD = PRECIO - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  PRECIO, 'S') returning_values (PORC);
            SUSPEND;
            END
        END
    END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER FACTCOMP_DETALLE_AI FOR FACTURAS_COMPRAS_DETALLE
ACTIVE AFTER INSERT POSITION 0
AS
declare variable fec date;
declare variable fecaux date;
declare variable aux varchar(90);
declare variable CONC VARCHAR(60);
declare variable factor numeric(18,4);
declare variable Pref varchar(4);
declare variable Num varchar(6);
declare variable Nit varchar(20);
declare variable TIPO INTEGER;
declare variable INVFAC CHAR(2);
declare variable IVAINC CHAR(2);
declare variable ICOINC CHAR(2);
declare variable COSTO NUMERIC(18,2);
declare variable CANTREL NUMERIC(18,4);
declare variable NUMPROV VARCHAR(10);
declare variable NUMPED VARCHAR(30);
declare variable NUMREM VARCHAR(30);
declare variable CONSO VARCHAR(2);
declare variable CONSOLIDA INTEGER;
declare variable NUMROWS INTEGER;
declare variable DTOPIE NUMERIC(18,2);
declare variable ADICIONAL NUMERIC(18,2);
declare variable TOTAL NUMERIC(18,2);
declare variable IVAMONTO NUMERIC(18,2);
declare variable EXTRA NUMERIC(18,2);
declare variable FACT NUMERIC(18,4);
declare variable MENORV CHAR(2);
declare variable ACTREM CHAR(2);
declare variable ACTCAN CHAR(2);
declare variable FECREM date;
declare variable IDREM INTEGER;
declare variable ITEREM INTEGER;
declare variable CANTREM NUMERIC(18,4);
declare variable LOTEREM VARCHAR(15);
declare variable PREFREM CHAR(4);
declare variable IDMOV INTEGER;
declare variable DTOPOR NUMERIC(18,4);
BEGIN
if ((NEW.faco_id <> 0) and (new.fcde_anulado = 'N')) then
    BEGIN
    select faco_fecha, pref_pre, faco_numero, terc_nit, faco_imptos, faco_numprov, faco_remision, faco_orden, FACO_CONSOLIDA,
        FACO_TOTAL, FACO_EXTRA, FACO_IVAMONTO, FACO_ADICIONAL, FACO_DTOMONTO, FACO_DTOPORC
        from facturas_compra where faco_id = new.faco_id
        into :fec, :Pref, :Num, :Nit, :ivainc, :numprov, :numrem, :numped, :CONSOLIDA,
        :total, :extra, :ivamonto, :adicional, :dtopie, :dtopor;
    conc = 'FACTURA DE COMPRA No.' || PREF || NUM || '-' || NUMPROV;
    if (NUMREM <> '') then
        BEGIN
        AUX = SUBSTR(NUMREM, 1, 15);
        conc = conc || '-REM:' || AUX;
        END
    else
        if (NUMPED <> '') then
            BEGIN
            AUX = SUBSTR(NUMPED, 1, 15);
            conc = conc || '-ORDEN ' || AUX;
            END
    SELECT MAX(CEFA_TIPOORI) FROM consolide_faltantes WHERE CEFA_ID = :CONSOLIDA INTO :TIPO;
    if (Tipo is null) then
        Tipo = 0;
    execute procedure lee_configuracion('COMPRAS', 'FACTURAS', 'AFECTAR INVENTARIO CON LA FACTURA') returning_values (:INVFAC);
    execute procedure factor_unidad_cant(new.arti_cod, new.fcde_unidad) returning_values(factor);
    COSTO = ((new.fcde_prunit - NEW.fcde_dtomonto) / :factor);
    if (IVAINC = 'S') then
        BEGIN
        EXECUTE PROCEDURE lee_configuracion ('FACTURACION', 'ARTICULOS', 'IMPOCONSUMO INCLUIDO EN EL PRECIO BASE DE VENTA ANTES DE IVA') returning_values(:icoinc);
        if (icoinc = 'SI') then
            COSTO = COSTO - (NEW.fcde_consumo/(NEW.fcde_cant * new.fcde_factor));
        COSTO = COSTO / (1 + NEW.fcde_ivaporc/100);
        END
    EXECUTE PROCEDURE lee_configuracion('COMPRAS','FACTURAS','DESCUENTO Y VALOR ADICIONAL DEL DOCUMENTO COMO MENOR VALOR DEL COSTO') returning_values (:MENORV);
    if (MENORV = 'SI') then
        BEGIN
        if ((adicional = 0) and (dtopie <> 0)) then
            FACT = (100 - DTOPOR) / 100;
        ELSE
            BEGIN
            FACT = (TOTAL - EXTRA - IVAMONTO);
            if ((FACT - ADICIONAL + DTOPIE) <> 0) then
                FACT = FACT / (FACT - ADICIONAL + DTOPIE);
            ELSE
                FACT = 1;
            END
        COSTO = COSTO * FACT;
        END
    /* si se hizo con base en una remision no afecte inventario */
    if (INVFAC = 'SI') then
      if (Tipo <> 22) then
        begin
        INSERT INTO MOVIMIENTO_ARTICULO
          (ARTI_COD, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM, TERC_NIT)
          VALUES(NEW.ARTI_COD, NEW.BODE_COD, :FEC, 21, NEW.faco_id,
          :CONC, :factor * new.fcde_cant, :COSTO, 'S', new.fcde_lote, :Pref, :Num, NEW.fcde_item, :Nit);

        if (COSTO > 0 ) then
         BEGIN
          /* ACTUALICE EL COSTO POR PROVEEDOR */
          SELECT PVAR_FECHA FROM PROVEEDOR_ARTICULO
            WHERE TERC_NIT = :Nit AND ARTI_COD = NEW.ARTI_COD
            INTO :FECAUX;
          if (FECAUX IS NULL) then
            INSERT INTO PROVEEDOR_ARTICULO (TERC_NIT, ARTI_COD, PVAR_COSTO, PVAR_FECHA, PVAR_COD,PVAR_DES)
                VALUES (:Nit, NEW.ARTI_COD, :COSTO, :fec, NEW.fcde_codprov,NEW.fcde_desc);
          else
            UPDATE PROVEEDOR_ARTICULO
                SET PVAR_COSTO = :COSTO, PVAR_FECHA = :fec, PVAR_COD = NEW.fcde_codprov
                WHERE ARTI_COD = NEW.ARTI_COD AND TERC_NIT = :Nit;
         END
        /* RECORRA LAS LISTAS DE PRECIOS Y CAMBIE EL PRECIO */
        EXECUTE PROCEDURE CALCULA_PRECIOS(NEW.ARTI_COD, :FEC);
        END /* AFECTAR INV */
    EXECUTE PROCEDURE lee_configuracion('COMPRAS', 'FACTURAS', 'ACTUALIZAR COSTOS DE LA REMISION RELACIONADA AL GRABAR LA FACTURA') returning_values (:ACTREM);
    if ((ACTREM = 'SI') and (Tipo = 22)) then
        BEGIN
        numrows = 0;
        select mvar_cons, MVAR_ITEM, MVAR_FECHA, MVAR_IDREF, MVAR_CANT, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO
            from movimiento_articulo M, consolidado_faltantes C
            where C.cofa_id = :CONSOLIDA AND mvar_tipodoc = 22 and mvar_idref = C.cofa_idori AND C.cofa_tipoori = 22 and m.arti_cod = new.arti_cod and m.mvar_item = c.cofa_itemori
            into :numrows, :iterem, :fecrem, :idrem, :cantrem, :loterem, :prefrem, :numrem;
        
        if (numrows <> 0) then
            BEGIN
            /* inserte primero para evitar existencias negativas */
            IDMOV = GEN_ID(ID_MOVARTI,1);
            EXECUTE PROCEDURE lee_configuracion('COMPRAS', 'FACTURAS', 'ACTUALIZAR CANTIDADES DE LA REMISION RELACIONADA AL GRABAR LA FACTURA') returning_values (:ACTCAN);
            if (ACTCAN = 'SI') then
                CANTREM = NEW.fcde_cant * NEW.fcde_factor;
            INSERT INTO MOVIMIENTO_ARTICULO
                (ARTI_COD, MVAR_CONS, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM, TERC_NIT)
                VALUES(NEW.ARTI_COD, :IDMOV, NEW.BODE_COD, :fecrem, 22, :idrem,
                :CONC, :cantrem, :costo, 'S', :loterem, :prefrem, :numrem, :iterem, :Nit);
            DELETE FROM MOVIMIENTO_ARTICULO WHERE MVAR_CONS = :numrows;
            /* reponga el consecutivo para no afectar el orden del kardex */
            update MOVIMIENTO_ARTICULO set mvar_cons = :numrows WHERE MVAR_CONS = :idmov;
            update costos set cost_idmov = :numrows WHERE cost_idmov = :idmov AND arti_cod = new.arti_cod;

            if (COSTO > 0 ) then
                BEGIN
                /* ACTUALICE EL COSTO POR PROVEEDOR */
                SELECT PVAR_FECHA FROM PROVEEDOR_ARTICULO
                    WHERE TERC_NIT = :Nit AND ARTI_COD = NEW.ARTI_COD
                    INTO :FECAUX;
                if (FECAUX IS NULL) then
                    INSERT INTO PROVEEDOR_ARTICULO (TERC_NIT, ARTI_COD, PVAR_COSTO, PVAR_FECHA, PVAR_COD,PVAR_DES)
                        VALUES (:Nit, NEW.ARTI_COD, :COSTO, :fec, NEW.fcde_codprov,NEW.fcde_desc);
                else
                    UPDATE PROVEEDOR_ARTICULO
                        SET PVAR_COSTO = :COSTO, PVAR_FECHA = :fec, PVAR_COD = NEW.fcde_codprov
                        WHERE ARTI_COD = NEW.ARTI_COD AND TERC_NIT = :Nit;
                END
            /* RECORRA LAS LISTAS DE PRECIOS Y CAMBIE EL PRECIO */
            EXECUTE PROCEDURE CALCULA_PRECIOS(NEW.ARTI_COD, :FEC);
            END
        END

    /* ACTUALICE EL PENDIENTE  */
    if (CONSOLIDA <> 0) then
        BEGIN
        UPDATE consolidado_faltantes SET COFA_OK = 'S' WHERE COFA_ID = :consolida AND COFA_ITEM = NEW.FCDE_ITEM AND ARTI_COD = NEW.arti_cod;
        EXECUTE procedure LEE_CONFIGURACION ('COMPRAS','DOCUMENTOS','SUMAR CANTIDADES PENDIENTES AL CONSOLIDAR DOCUMENTOS') returning_values (CONSO);
        /* IGNORE LA CONSOLIDACION SI SE VALIDAN CODIGOS DE LA ORDEN */
        SELECT MIN(CEFA_TIPOORI) FROM consolide_faltantes WHERE CEFA_ID = :CONSOLIDA INTO :NUMROWS;
        if (NUMROWS = 23) then
            BEGIN
            EXECUTE PROCEDURE LEE_CONFIGURACION('COMPRAS', 'FACTURAS', 'VERIFICAR CODIGOS DE LA ORDEN') returning_values (MENORV);
            if (MENORV = 'SI') then
                CONSO = 'NO';
            END
        SELECT COUNT(CEFA_ITEM) FROM consolide_faltantes WHERE CEFA_ID = :CONSOLIDA INTO :NUMROWS;
        if ((CONSO = 'SI') AND (NUMROWS > 1)) then
            UPDATE consolidado_faltantes SET COFA_IDDES = NEW.faco_id, COFA_OK = 'S' WHERE COFA_ID = :consolida;
        else
            BEGIN
            /* BUSQUE EL CONSOLIDADO EN EL MISMO ITEM Y SI ES DIFERENTE ACTUALICELO */
            select COFA_CANT * COFA_FACTOR FROM consolidado_faltantes WHERE COFA_ID = :consolida AND COFA_ITEM = NEW.FCDE_ITEM AND ARTI_COD = NEW.arti_cod INTO :CANTREL;
            if (NEW.FCDE_CANT * NEW.FCDE_FACTOR < CANTREL) then
                UPDATE consolidado_faltantes SET COFA_IDDES = NEW.faco_id, COFA_CANT = NEW.FCDE_CANT, COFA_FACTOR = NEW.FCDE_FACTOR
                    WHERE COFA_ID = :consolida AND COFA_ITEM = NEW.FCDE_ITEM AND ARTI_COD = NEW.arti_cod;
            END
        END
    /* ACTUALICE EL STAND */
    if (new.fcde_stand is not null) then
      if (exists(select stand_cod from stands where arti_cod = new.arti_cod and stand_bodega = new.bode_cod)) then
        UPDATE stands set stand_cod = new.fcde_stand where arti_cod = new.arti_cod and stand_bodega = new.bode_cod;
      else
        INSERT INTO stands (ARTI_COD, STAND_BODEGA, STAND_COD) VALUES (NEW.arti_cod, NEW.bode_cod, NEW.fcde_stand);
    END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER FACTCOMP_DETALLE_AU FOR FACTURAS_COMPRAS_DETALLE
ACTIVE AFTER UPDATE POSITION 0
as
declare variable fec date;
declare variable fecaux date;
declare variable AUX varchar(90);
declare variable CONC VARCHAR(60);
declare variable Pref varchar(4);
declare variable Num varchar(6);
declare variable Nit varchar(20);
declare variable factor numeric(18,4);
declare variable TIPO INTEGER;
declare variable INVFAC CHAR(2);
declare variable IVAINC CHAR(2);
declare variable ICOINC CHAR(2);
declare variable COSTO NUMERIC(18,2);
declare variable CANTREL NUMERIC(18,4);
declare variable NUMPROV VARCHAR(10);
declare variable NUMPED VARCHAR(30);
declare variable NUMREM VARCHAR(30);
declare variable CONSO VARCHAR(2);
declare variable CONSOLIDA INTEGER;
declare variable NUMROWS INTEGER;
declare variable DTOPIE NUMERIC(18,2);
declare variable ADICIONAL NUMERIC(18,2);
declare variable TOTAL NUMERIC(18,2);
declare variable IVAMONTO NUMERIC(18,2);
declare variable EXTRA NUMERIC(18,2);
declare variable FACT NUMERIC(18,4);
declare variable MENORV CHAR(2);
declare variable ACTREM CHAR(2);
declare variable ACTCAN CHAR(2);
declare variable FECREM date;
declare variable IDREM INTEGER;
declare variable ITEREM INTEGER;
declare variable CANTREM NUMERIC(18,4);
declare variable LOTEREM VARCHAR(15);
declare variable PREFREM CHAR(4);
declare variable IDMOV INTEGER;
declare variable DTOPOR NUMERIC(18,4);
BEGIN
if (old.fcde_devuelto = new.fcde_devuelto) then
    begin
    /* deshaga lo viejo */
    if ((old.fcde_anulado = 'N') and (OLD.faco_id <> 0)) then
        begin
        select faco_fecha, faco_consolida from facturas_compra where faco_id = old.faco_id into :fec, :consolida;
        DELETE FROM MOVIMIENTO_ARTICULO WHERE (mvar_tipodoc = 21) and (mvar_idref = old.faco_id) and (mvar_item = old.fcde_item);
        /* RECORRA LAS LISTAS DE PRECIOS Y CAMBIE EL PRECIO */
        EXECUTE PROCEDURE CALCULA_PRECIOS(old.ARTI_COD, :FEC);
        /* LOS PENDIENTES */
        if (CONSOLIDA <> 0) then
            BEGIN
            UPDATE consolidado_faltantes SET COFA_OK = 'N' WHERE COFA_ID = :consolida AND COFA_ITEM = old.FCDE_ITEM AND ARTI_COD = old.arti_cod;
            SELECT COUNT(CEFA_ITEM) FROM consolide_faltantes WHERE CEFA_ID = :CONSOLIDA INTO :NUMROWS;
            EXECUTE procedure LEE_CONFIGURACION ('COMPRAS','DOCUMENTOS','SUMAR CANTIDADES PENDIENTES AL CONSOLIDAR DOCUMENTOS') returning_values (CONSO);
            /* IGNORE LA CONSOLIDACION SI SE VALIDAN CODIGOS DE LA ORDEN */
            SELECT MIN(CEFA_TIPOORI) FROM consolide_faltantes WHERE CEFA_ID = :CONSOLIDA INTO :NUMROWS;
            if (NUMROWS = 23) then
                BEGIN
                EXECUTE PROCEDURE LEE_CONFIGURACION('COMPRAS', 'FACTURAS', 'VERIFICAR CODIGOS DE LA ORDEN') returning_values (MENORV);
                if (MENORV = 'SI') then
                    CONSO = 'NO';
                END
            if (CONSO = 'SI') then
                UPDATE consolidado_faltantes SET COFA_OK = 'N' WHERE COFA_ID = :consolida;
            END
        end
    /* Registre el nuevo */
    if ((new.fcde_anulado = 'N') and (new.faco_id <> 0)) then
        BEGIN
        select faco_fecha, pref_pre, faco_numero, terc_nit, faco_imptos, faco_numprov, faco_remision, faco_orden,
            faco_consolida, faco_dtomonto, faco_adicional, faco_total, faco_ivamonto, faco_extra, FACO_DTOPORC
            from facturas_compra where faco_id = new.faco_id
            into :fec, :Pref, :Num, :Nit, :ivainc, :numprov, :numrem, :numped,
            :consolida, :dtopie, :adicional, :total, :ivamonto, :extra, :dtopor;
        conc = 'FACTURA DE COMPRA No.' || PREF || NUM || '-' || NUMPROV;
        if (NUMREM <> '') then
            BEGIN
            AUX = SUBSTR(NUMREM, 1, 15);
            conc = conc || '-REM:' || AUX;
            END
        else
            if (NUMPED <> '') then
                BEGIN
                AUX = SUBSTR(NUMPED, 1, 15);
                conc = conc || '-ORDEN ' || AUX;
                END
        SELECT MAX(CEFA_TIPOORI) FROM consolide_faltantes WHERE CEFA_ID = :CONSOLIDA INTO :TIPO;
        if (Tipo is null) then
            Tipo = 0;
        execute procedure lee_configuracion('COMPRAS', 'FACTURAS', 'AFECTAR INVENTARIO CON LA FACTURA') returning_values (:INVFAC);
        /* si se hizo con base en una remision no afecte inventario */
        if ((Tipo <> 22) and (INVFAC = 'SI')) then
            begin
            execute procedure factor_unidad_cant(new.arti_cod, new.fcde_unidad) returning_values(factor);
            COSTO = ((new.fcde_prunit - NEW.fcde_dtomonto) / :factor);
            if (IVAINC = 'S') then
                BEGIN
                EXECUTE PROCEDURE lee_configuracion ('FACTURACION', 'ARTICULOS', 'IMPOCONSUMO INCLUIDO EN EL PRECIO BASE DE VENTA ANTES DE IVA') returning_values(:icoinc);
                if (icoinc = 'SI') then
                    COSTO = COSTO - (NEW.fcde_consumo/(NEW.fcde_cant * new.fcde_factor));
                COSTO = COSTO / (1 + NEW.fcde_ivaporc/100);
                END
            EXECUTE PROCEDURE lee_configuracion('COMPRAS','FACTURAS','DESCUENTO Y VALOR ADICIONAL DEL DOCUMENTO COMO MENOR VALOR DEL COSTO') returning_values (:MENORV);
            if (MENORV = 'SI') then
                BEGIN
                if ((adicional = 0) and (dtopie <> 0)) then
                    FACT = (100 - DTOPOR) / 100;
                ELSE
                    BEGIN
                    FACT = (TOTAL - EXTRA - IVAMONTO);
                    if ((FACT - ADICIONAL + DTOPIE) <> 0) then
                        FACT = FACT / (FACT - ADICIONAL + DTOPIE);
                    ELSE
                        FACT = 1;
                    END
                COSTO = COSTO * FACT;
                END
            INSERT INTO MOVIMIENTO_ARTICULO
                (ARTI_COD, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM, TERC_NIT)
                VALUES(NEW.ARTI_COD, NEW.BODE_COD, :FEC, 21, NEW.faco_id,
                :CONC, :factor * new.fcde_cant, :COSTO, 'S', new.fcde_lote, :Pref, :Num, NEW.fcde_item, :Nit);
            if (COSTO > 0 ) then
             BEGIN
              /* ACTUALICE EL COSTO POR PROVEEDOR */
              SELECT PVAR_FECHA FROM PROVEEDOR_ARTICULO
                WHERE TERC_NIT = :Nit AND ARTI_COD = NEW.ARTI_COD INTO :FECAUX;
              if (FECAUX IS NULL) then
                INSERT INTO PROVEEDOR_ARTICULO (TERC_NIT, ARTI_COD, PVAR_COSTO, PVAR_FECHA, PVAR_COD,PVAR_DES)
                    VALUES (:Nit, NEW.ARTI_COD, :COSTO, :fec, NEW.fcde_codprov,NEW.fcde_desc);
              else
                UPDATE PROVEEDOR_ARTICULO
                    SET PVAR_COSTO = :COSTO, PVAR_FECHA = :fec, PVAR_COD = NEW.fcde_codprov
                    WHERE ARTI_COD = NEW.ARTI_COD AND TERC_NIT = :Nit;
             END
            /* RECORRA LAS LISTAS DE PRECIOS Y CAMBIE EL PRECIO */
            EXECUTE PROCEDURE CALCULA_PRECIOS(NEW.ARTI_COD, :FEC);
            end
        EXECUTE PROCEDURE lee_configuracion('COMPRAS', 'FACTURAS', 'ACTUALIZAR COSTOS DE LA REMISION RELACIONADA AL GRABAR LA FACTURA') returning_values (:ACTREM);
        if ((ACTREM = 'SI') and (Tipo = 22)) then
            BEGIN
            numrows = 0;
            select mvar_cons, MVAR_ITEM, MVAR_FECHA, MVAR_IDREF, MVAR_CANT, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO
                from movimiento_articulo M, consolidado_faltantes C
                where C.cofa_id = :CONSOLIDA AND mvar_tipodoc = 22 and mvar_idref = C.cofa_idori AND C.cofa_tipoori = 22 and m.arti_cod = new.arti_cod
                into :numrows, :iterem, :fecrem, :idrem, :cantrem, :loterem, :prefrem, :numrem;
            
            if (numrows <> 0) then
                BEGIN
                /* inserte primero para evitar existencias negativas */
                IDMOV = GEN_ID(ID_MOVARTI,1);
                EXECUTE PROCEDURE lee_configuracion('COMPRAS', 'FACTURAS', 'ACTUALIZAR CANTIDADES DE LA REMISION RELACIONADA AL GRABAR LA FACTURA') returning_values (:ACTCAN);
                if (ACTCAN = 'SI') then
                    CANTREM = NEW.fcde_cant * NEW.fcde_factor;
                INSERT INTO MOVIMIENTO_ARTICULO
                    (ARTI_COD, MVAR_CONS, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM, TERC_NIT)
                    VALUES(NEW.ARTI_COD, :IDMOV, NEW.BODE_COD, :fecrem, 22, :idrem,
                    :CONC, :cantrem, :costo, 'S', :loterem, :prefrem, :numrem, :iterem, :Nit);
                DELETE FROM MOVIMIENTO_ARTICULO WHERE MVAR_CONS = :numrows;
                /* reponga el consecutivo para no afectar el orden del kardex */
                update MOVIMIENTO_ARTICULO set mvar_cons = :numrows WHERE MVAR_CONS = :idmov;
                update costos set cost_idmov = :numrows WHERE cost_idmov = :idmov and arti_cod = new.arti_cod;

                if (COSTO > 0 ) then
                    BEGIN
                    /* ACTUALICE EL COSTO POR PROVEEDOR */
                    SELECT PVAR_FECHA FROM PROVEEDOR_ARTICULO
                        WHERE TERC_NIT = :Nit AND ARTI_COD = NEW.ARTI_COD
                        INTO :FECAUX;
                    if (FECAUX IS NULL) then
                        INSERT INTO PROVEEDOR_ARTICULO (TERC_NIT, ARTI_COD, PVAR_COSTO, PVAR_FECHA, PVAR_COD,PVAR_DES)
                            VALUES (:Nit, NEW.ARTI_COD, :COSTO, :fec, NEW.fcde_codprov,NEW.fcde_desc);
                    else
                        UPDATE PROVEEDOR_ARTICULO
                            SET PVAR_COSTO = :COSTO, PVAR_FECHA = :fec, PVAR_COD = NEW.fcde_codprov
                            WHERE ARTI_COD = NEW.ARTI_COD AND TERC_NIT = :Nit;
                    END
                /* RECORRA LAS LISTAS DE PRECIOS Y CAMBIE EL PRECIO */
                EXECUTE PROCEDURE CALCULA_PRECIOS(NEW.ARTI_COD, :FEC);
                END
            END

        if (CONSOLIDA <> 0) then
            begin
            UPDATE consolidado_faltantes SET COFA_OK = 'S' WHERE COFA_ID = :consolida AND COFA_ITEM = NEW.FCDE_ITEM AND ARTI_COD = NEW.arti_cod;
            EXECUTE procedure LEE_CONFIGURACION ('COMPRAS','DOCUMENTOS','SUMAR CANTIDADES PENDIENTES AL CONSOLIDAR DOCUMENTOS') returning_values (CONSO);
            /* IGNORE LA CONSOLIDACION SI SE VALIDAN CODIGOS DE LA ORDEN */
            SELECT MIN(CEFA_TIPOORI) FROM consolide_faltantes WHERE CEFA_ID = :CONSOLIDA INTO :NUMROWS;
            if (NUMROWS = 23) then
                BEGIN
                EXECUTE PROCEDURE LEE_CONFIGURACION('COMPRAS', 'FACTURAS', 'VERIFICAR CODIGOS DE LA ORDEN') returning_values (MENORV);
                if (MENORV = 'SI') then
                    CONSO = 'NO';
                END
            SELECT COUNT(CEFA_ITEM) FROM consolide_faltantes WHERE CEFA_ID = :CONSOLIDA INTO :NUMROWS;
            if ((CONSO = 'SI') AND (NUMROWS > 1)) then
                UPDATE consolidado_faltantes SET COFA_IDDES = NEW.faco_id, COFA_OK = 'S' WHERE COFA_ID = :consolida;
            else
                BEGIN
                /* BUSQUE EL CONSOLIDADO EN EL MISMO ITEM Y SI ES DIFERENTE ACTUALICELO */
                select COFA_CANT * COFA_FACTOR FROM consolidado_faltantes WHERE COFA_ID = :consolida AND COFA_ITEM = NEW.FCDE_ITEM AND ARTI_COD = NEW.arti_cod INTO :CANTREL;
                if (NEW.FCDE_CANT * NEW.FCDE_FACTOR < CANTREL) then
                    UPDATE consolidado_faltantes SET COFA_IDDES = NEW.faco_id, COFA_CANT = NEW.FCDE_CANT, COFA_FACTOR = NEW.FCDE_FACTOR
                        WHERE COFA_ID = :consolida AND COFA_ITEM = NEW.FCDE_ITEM AND ARTI_COD = NEW.arti_cod;
                END
            end
        /* ACTUALICE EL STAND */
        if (new.fcde_stand is not null) then
          if (exists(select stand_cod from stands where arti_cod = new.arti_cod and stand_bodega = new.bode_cod)) then
            UPDATE stands set stand_cod = new.fcde_stand where arti_cod = new.arti_cod and stand_bodega = new.bode_cod;
          else
            INSERT INTO stands (ARTI_COD, STAND_BODEGA, STAND_COD) VALUES (NEW.arti_cod, NEW.bode_cod, NEW.fcde_stand);
        END
    end
END
^

SET TERM ; ^

/* 20100429 */
/* NOMBRE DE LA SUCURSAL PARA EL NUEVO ROMPIMIENTO DEL REPORTE */

SET TERM ^ ;

CREATE OR ALTER procedure REP_ARTICULOS_CLIENTE (
    TIPO integer,
    DETALLE char(1),
    TERINI varchar(20),
    TERFIN varchar(20),
    FECINI date,
    FECFIN date,
    ARTINI varchar(15),
    ARTFIN varchar(15),
    ORDEN char(1),
    CEROS char(1),
    SUBEMPRESA integer)
returns (
    NIT varchar(20),
    NOMBRE varchar(60),
    SUCURSAL varchar(10),
    DV char(1),
    TELEFONO varchar(40),
    CIUDAD varchar(40),
    CODZONA varchar(2),
    NOMZONA varchar(30),
    NOMTIPO varchar(50),
    ARTICULO varchar(15),
    DESCRIPCION varchar(60),
    CODGRUPO varchar(2),
    NOMGRUPO varchar(30),
    CODSUBG varchar(3),
    NOMSUBG varchar(30),
    CODMARC varchar(3),
    NOMMARC varchar(30),
    UNIDAD varchar(8),
    CANTIDAD numeric(18,4),
    BASE numeric(18,2),
    IVA numeric(18,2),
    CONSUMO numeric(18,2),
    TOTAL numeric(18,2),
    PREFIJO varchar(4),
    NUMERO varchar(6),
    FECHA date,
    DTO numeric(9,2),
    TIPODOC integer)
AS
declare variable CODINI VARCHAR(15);
declare variable CODFIN VARCHAR(15);
declare variable DESINI VARCHAR(15);
declare variable DESFIN VARCHAR(15);
BEGIN
if (ORDEN = 'C') then
    BEGIN
    CODINI = ARTINI;
    CODFIN = ARTFIN;
    DESINI = '';
    DESFIN = 'zz';
    END
ELSE
    BEGIN
    DESINI = ARTINI;
    DESFIN = ARTFIN;
    CODINI = '';
    CODFIN = 'zz';
    END

SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = :TIPO INTO :NOMTIPO;
if (DETALLE = 'N') then
    BEGIN
    if (BIN_AND(TIPO, 1) <> 0) then
        BEGIN
        TIPODOC = 31;
        FOR SELECT SUM(FADE_CANT * FADE_FACTOR), SUM((FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO)*FACT_FACTOR), SUM(FADE_IVAMONTO*FACT_FACTOR), SUM(FADE_CONSUMO), SUM(FADE_TOTAL*FACT_FACTOR),
            max(D.ARTI_COD), MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD), MAX(TERC_NIT), max(f.fact_sucursal)
            FROM FACTURAS_DETALLE D, FACTURAS F, PREFIJOS P, ARTICULO A
            WHERE F.FACT_ID = D.FACT_ID AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND D.ARTI_COD = A.ARTI_COD AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            TERC_NIT >= :TERINI AND TERC_NIT <= :TERFIN AND FACT_ANULADO = 'N' AND
            FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) and substring(a.arti_cod from 1 FOR 2) <> '.t'
            GROUP BY TERC_NIT, f.fact_sucursal, D.ARTI_COD
            INTO :CANTIDAD, :BASE, :IVA, :CONSUMO, :TOTAL, :ARTICULO, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :NIT, :sucursal
            DO
            BEGIN
            select S.clsu_nombre, TERC_TEL, TERC_CIU, C.ZONA_COD, TERC_DV from terceros T, CLIENTES C, cliente_sucursales S
                where C.TERC_NIT = T.TERC_NIT AND T.TERC_NIT = :NIT AND C.terc_nit = S.terc_nit AND S.clcu_cod = :sucursal
                INTO :NOMBRE, :TELEFONO, :CIUDAD, :CODZONA, :DV;
            SELECT ZONA_NOM FROM ZONAS WHERE ZONA_COD = :CODZONA INTO :NOMZONA;
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            if (CEROS = 'S') then
                SUSPEND;
            ELSE
                if ((BASE <> 0) AND (CANTIDAD <> 0)) then
                    SUSPEND;
            END
        END
    if (BIN_AND(TIPO, 2) <> 0) then
        BEGIN
        TIPODOC = 32;
        FOR SELECT SUM(RVDE_CANT * RVDE_FACTOR), SUM(RVDE_TOTAL-RVDE_IVAMONTO-RVDE_CONSUMO), SUM(RVDE_IVAMONTO), SUM(RVDE_CONSUMO), SUM(RVDE_TOTAL),
            max(D.ARTI_COD), MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD), MAX(TERC_NIT), max(r.revt_sucursal)
            FROM REMISIONES_VENTA_DETALLE D, REMISIONES_VENTA R, PREFIJOS P, ARTICULO A
            WHERE R.REVT_ID = D.REVT_ID AND P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = 32 AND D.ARTI_COD = A.ARTI_COD AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            TERC_NIT >= :TERINI AND TERC_NIT <= :TERFIN AND REVT_FECHA >= :FECINI AND
            REVT_FECHA <= :FECFIN AND REVT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY TERC_NIT, r.revt_sucursal, D.ARTI_COD
            INTO :CANTIDAD, :BASE, :IVA, :CONSUMO, :TOTAL, :ARTICULO, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :NIT, :sucursal
            DO
            BEGIN
            select S.clsu_nombre, TERC_TEL, TERC_CIU, C.ZONA_COD, TERC_DV from terceros T, CLIENTES C, cliente_sucursales S
                where C.TERC_NIT = T.TERC_NIT AND T.TERC_NIT = :NIT AND C.terc_nit = S.terc_nit AND S.clcu_cod = :sucursal
                INTO :NOMBRE, :TELEFONO, :CIUDAD, :CODZONA, :DV;
            SELECT ZONA_NOM FROM ZONAS WHERE ZONA_COD = :CODZONA INTO :NOMZONA;
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            if (CEROS = 'S') then
                SUSPEND;
            ELSE
                if ((BASE <> 0) AND (CANTIDAD <> 0)) then
                    SUSPEND;
            END
        END
    if (BIN_AND(TIPO, 4) <> 0) then
        BEGIN
        TIPODOC = 33;
        FOR SELECT SUM(DVDE_CANT * DVDE_FACTOR), SUM((DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO)*DEVT_FACTOR), SUM(DVDE_IVAMONTO*DEVT_FACTOR), SUM(DVDE_CONSUMO), SUM(DVDE_TOTAL*DEVT_FACTOR),
            max(D.ARTI_COD), MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD), MAX(TERC_NIT), max(v.devt_sucursal)
            FROM devoluciones_ventas_detalle D, DEVOLUCIONES_VENTAS V, PREFIJOS P, ARTICULO A
            WHERE V.DEVT_ID = D.DEVT_ID AND P.PREF_PRE = V.PREF_PRE AND P.TIDO_COD = 33 AND D.ARTI_COD = A.ARTI_COD AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            TERC_NIT >= :TERINI AND TERC_NIT <= :TERFIN AND DEVT_FECHA >= :FECINI AND
            DEVT_FECHA <= :FECFIN AND DEVT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY TERC_NIT, v.devt_sucursal, D.ARTI_COD
            INTO :CANTIDAD, :BASE, :IVA, :CONSUMO, :TOTAL, :ARTICULO, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :NIT, :sucursal
            DO
            BEGIN
            select S.clsu_nombre, TERC_TEL, TERC_CIU, C.ZONA_COD, TERC_DV from terceros T, CLIENTES C, cliente_sucursales S
                where C.TERC_NIT = T.TERC_NIT AND T.TERC_NIT = :NIT AND C.terc_nit = S.terc_nit AND S.clcu_cod = :sucursal
                INTO :NOMBRE, :TELEFONO, :CIUDAD, :CODZONA, :DV;
            SELECT ZONA_NOM FROM ZONAS WHERE ZONA_COD = :CODZONA INTO :NOMZONA;
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            CANTIDAD = CANTIDAD * -1;
            BASE = BASE * -1;
            TOTAL = TOTAL * -1;
            IVA = IVA * -1;
            CONSUMO = CONSUMO * -1;
            if (CEROS = 'S') then
                SUSPEND;
            ELSE
                if ((BASE <> 0) AND (CANTIDAD <> 0)) then
                    SUSPEND;
            END
        END
    if (BIN_AND(TIPO, 8) <> 0) then
        BEGIN
        TIPODOC = 34;
        FOR SELECT SUM(PEDE_CANT * PEDE_FACTOR), SUM((PEDE_TOTAL-PEDE_IVAMONTO-PEDE_CONSUMO)*PEDI_FACTOR), SUM(PEDE_IVAMONTO*PEDI_FACTOR), SUM(PEDE_CONSUMO), SUM(PEDE_TOTAL*PEDI_FACTOR),
            max(D.ARTI_COD), MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD), MAX(TERC_NIT), max(p.pedi_sucursal)
            FROM PEDIDOS_DETALLE D, PEDIDOS P, PREFIJOS R, ARTICULO A
            WHERE P.PEDI_ID = D.PEDI_ID AND R.PREF_PRE = P.PREF_PRE AND R.TIDO_COD = 34 AND D.ARTI_COD = A.ARTI_COD AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            TERC_NIT >= :TERINI AND TERC_NIT <= :TERFIN AND PEDI_FECHA >= :FECINI AND
            PEDI_FECHA <= :FECFIN AND PEDI_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY TERC_NIT, p.pedi_sucursal, D.ARTI_COD
            INTO :CANTIDAD, :BASE, :IVA, :CONSUMO, :TOTAL, :ARTICULO, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :NIT, :sucursal
            DO
            BEGIN
            select S.clsu_nombre, TERC_TEL, TERC_CIU, C.ZONA_COD, TERC_DV from terceros T, CLIENTES C, cliente_sucursales S
                where C.TERC_NIT = T.TERC_NIT AND T.TERC_NIT = :NIT AND C.terc_nit = S.terc_nit AND S.clcu_cod = :sucursal
                INTO :NOMBRE, :TELEFONO, :CIUDAD, :CODZONA, :DV;
            SELECT ZONA_NOM FROM ZONAS WHERE ZONA_COD = :CODZONA INTO :NOMZONA;
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            if (CEROS = 'S') then
                SUSPEND;
            ELSE
                if ((BASE <> 0) AND (CANTIDAD <> 0)) then
                    SUSPEND;
            END
        END
    if (BIN_AND(TIPO, 16) <> 0) then
        BEGIN
        TIPODOC = 35;
        FOR SELECT SUM(CTDE_CANT * CTDE_FACTOR), SUM((CTDE_TOTAL-CTDE_IVAMONTO-CTDE_CONSUMO)*COTI_FACTOR), SUM(CTDE_IVAMONTO*COTI_FACTOR), SUM(CTDE_CONSUMO), SUM(CTDE_TOTAL*COTI_FACTOR),
            max(D.ARTI_COD), MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD), MAX(TERC_NIT), max(c.coti_sucursal)
            FROM COTIZACIONES_DETALLE D, COTIZACIONES C, PREFIJOS P, ARTICULO A
            WHERE C.COTI_ID = D.COTI_ID AND P.PREF_PRE = C.PREF_PRE AND P.TIDO_COD = 35 AND D.ARTI_COD = A.ARTI_COD AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            TERC_NIT >= :TERINI AND TERC_NIT <= :TERFIN AND COTI_FECHA >= :FECINI AND
            COTI_FECHA <= :FECFIN AND COTI_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY TERC_NIT, c.coti_sucursal, D.ARTI_COD
            INTO :CANTIDAD, :BASE, :IVA, :CONSUMO, :TOTAL, :ARTICULO, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :NIT, :sucursal
            DO
            BEGIN
            select S.clsu_nombre, TERC_TEL, TERC_CIU, C.ZONA_COD, TERC_DV from terceros T, CLIENTES C, cliente_sucursales S
                where C.TERC_NIT = T.TERC_NIT AND T.TERC_NIT = :NIT AND C.terc_nit = S.terc_nit AND S.clcu_cod = :sucursal
                INTO :NOMBRE, :TELEFONO, :CIUDAD, :CODZONA, :DV;
            SELECT ZONA_NOM FROM ZONAS WHERE ZONA_COD = :CODZONA INTO :NOMZONA;
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            if (CEROS = 'S') then
                SUSPEND;
            ELSE
                if ((BASE <> 0) AND (CANTIDAD <> 0)) then
                    SUSPEND;
            END
        END
    END
ELSE
    BEGIN
    if (BIN_AND(TIPO, 1) <> 0) then
        BEGIN
        TIPODOC = 31;
        FOR SELECT F.PREF_PRE, FACT_NUMERO, FACT_FECHA, FADE_CANT * FADE_FACTOR, FADE_PRUNIT/FADE_FACTOR*FACT_FACTOR, FADE_IVAMONTO*FACT_FACTOR, FADE_CONSUMO, FADE_DTOPORC, FADE_TOTAL*FACT_FACTOR,
            D.ARTI_COD, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD, TERC_NIT, f.fact_sucursal
            FROM FACTURAS F, FACTURAS_DETALLE D, PREFIJOS P, ARTICULO A
            WHERE F.FACT_ID = D.FACT_ID AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND D.ARTI_COD = A.ARTI_COD AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            TERC_NIT >= :TERINI AND TERC_NIT <= :TERFIN AND FACT_FECHA >= :FECINI AND
            FACT_FECHA <= :FECFIN AND FACT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) and substring(a.arti_cod from 1 FOR 2) <> '.t'
            ORDER BY TERC_NIT, f.fact_sucursal, ARTI_COD, FACT_FECHA
            INTO :PREFIJO, :NUMERO, :FECHA, CANTIDAD, :BASE, :IVA, :CONSUMO, :dto, :TOTAL, :ARTICULO, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :NIT, :sucursal
            DO
            BEGIN
            select TERC_NOM, TERC_TEL, TERC_CIU, C.ZONA_COD, TERC_DV from terceros T, CLIENTES C, cliente_sucursales S
                where C.TERC_NIT = T.TERC_NIT AND T.TERC_NIT = :NIT AND C.terc_nit = S.terc_nit AND S.clcu_cod = :sucursal
                INTO :NOMBRE, :TELEFONO, :CIUDAD, :CODZONA, :DV;
            SELECT ZONA_NOM FROM ZONAS WHERE ZONA_COD = :CODZONA INTO :NOMZONA;
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            SUSPEND;
            END
        END
    if (BIN_AND(TIPO, 2) <> 0) then
        BEGIN
        TIPODOC = 32;
        FOR SELECT R.PREF_PRE, REVT_NUMERO, REVT_FECHA, RVDE_CANT * RVDE_FACTOR, RVDE_PRUNIT / RVDE_FACTOR, RVDE_IVAMONTO, RVDE_CONSUMO, RVDE_DTOPORC, RVDE_TOTAL,
            D.ARTI_COD, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD, TERC_NIT, r.revt_sucursal
            FROM REMISIONES_VENTA R, REMISIONES_VENTA_DETALLE D, PREFIJOS P, ARTICULO A
            WHERE R.REVT_ID = D.REVT_ID AND P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = 32 AND D.ARTI_COD = A.ARTI_COD AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            TERC_NIT >= :TERINI AND TERC_NIT <= :TERFIN AND REVT_FECHA >= :FECINI AND
            REVT_FECHA <= :FECFIN AND REVT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            ORDER BY TERC_NIT, r.revt_sucursal, ARTI_COD, REVT_FECHA
            INTO :PREFIJO, :NUMERO, :FECHA, CANTIDAD, :BASE, :IVA, :CONSUMO, :dto, :TOTAL, :ARTICULO, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :NIT, :sucursal
            DO
            BEGIN
            select TERC_NOM, TERC_TEL, TERC_CIU, C.ZONA_COD, TERC_DV from terceros T, CLIENTES C, cliente_sucursales S
                where C.TERC_NIT = T.TERC_NIT AND T.TERC_NIT = :NIT AND C.terc_nit = S.terc_nit AND S.clcu_cod = :sucursal
                INTO :NOMBRE, :TELEFONO, :CIUDAD, :CODZONA, :DV;
            SELECT ZONA_NOM FROM ZONAS WHERE ZONA_COD = :CODZONA INTO :NOMZONA;
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            SUSPEND;
            END
        END
    if (BIN_AND(TIPO, 4) <> 0) then
        BEGIN
        TIPODOC = 33;
        FOR SELECT V.PREF_PRE, DEVT_NUMERO, DEVT_FECHA, DVDE_CANT * DVDE_FACTOR, DVDE_PRUNIT/DVDE_FACTOR*DEVT_FACTOR, DVDE_IVAMONTO*DEVT_FACTOR, DVDE_CONSUMO, DVDE_DTOPORC, DVDE_TOTAL*DEVT_FACTOR,
            D.ARTI_COD, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD, TERC_NIT, v.devt_sucursal
            FROM DEVOLUCIONES_VENTAS V, DEVOLUCIONES_VENTAS_DETALLE D, PREFIJOS P, ARTICULO A
            WHERE V.DEVT_ID = D.DEVT_ID AND P.PREF_PRE = V.PREF_PRE AND P.TIDO_COD = 33 AND D.ARTI_COD = A.ARTI_COD AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            TERC_NIT >= :TERINI AND TERC_NIT <= :TERFIN AND DEVT_FECHA >= :FECINI AND
            DEVT_FECHA <= :FECFIN AND DEVT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            ORDER BY TERC_NIT, v.devt_sucursal, ARTI_COD, DEVT_FECHA
            INTO :PREFIJO, :NUMERO, :FECHA, CANTIDAD, :BASE, :IVA, :CONSUMO, :dto, :TOTAL, :ARTICULO, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :NIT, :sucursal
            DO
            BEGIN
            select TERC_NOM, TERC_TEL, TERC_CIU, C.ZONA_COD, TERC_DV from terceros T, CLIENTES C, cliente_sucursales S
                where C.TERC_NIT = T.TERC_NIT AND T.TERC_NIT = :NIT AND C.terc_nit = S.terc_nit AND S.clcu_cod = :sucursal
                INTO :NOMBRE, :TELEFONO, :CIUDAD, :CODZONA, :DV;
            SELECT ZONA_NOM FROM ZONAS WHERE ZONA_COD = :CODZONA INTO :NOMZONA;
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            CANTIDAD = CANTIDAD * -1;
            BASE = BASE * -1;
            TOTAL = TOTAL * -1;
            IVA = IVA * -1;
            CONSUMO = CONSUMO * -1;
            SUSPEND;
            END
        END
    if (BIN_AND(TIPO, 8) <> 0) then
        BEGIN
        TIPODOC = 34;
        FOR SELECT P.PREF_PRE, PEDI_NUMERO, PEDI_FECHA, PEDE_CANT * PEDE_FACTOR, PEDE_PRUNIT/PEDE_FACTOR*PEDI_FACTOR, PEDE_IVAMONTO*PEDI_FACTOR, PEDE_CONSUMO, PEDE_DTOPORC, PEDE_TOTAL*PEDI_FACTOR,
            D.ARTI_COD, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD, TERC_NIT, p.pedi_sucursal
            FROM PEDIDOS P, PEDIDOS_DETALLE D, PREFIJOS R, ARTICULO A
            WHERE P.PEDI_ID = D.PEDI_ID AND R.PREF_PRE = P.PREF_PRE AND R.TIDO_COD = 34 AND D.ARTI_COD = A.ARTI_COD AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            TERC_NIT >= :TERINI AND TERC_NIT <= :TERFIN AND PEDI_FECHA >= :FECINI AND
            PEDI_FECHA <= :FECFIN AND PEDI_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            ORDER BY TERC_NIT, p.pedi_sucursal, ARTI_COD, PEDI_FECHA
            INTO :PREFIJO, :NUMERO, :FECHA, CANTIDAD, :BASE, :IVA, :CONSUMO, :dto, :TOTAL, :ARTICULO, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :NIT, :sucursal
            DO
            BEGIN
            select TERC_NOM, TERC_TEL, TERC_CIU, C.ZONA_COD, TERC_DV from terceros T, CLIENTES C, cliente_sucursales S
                where C.TERC_NIT = T.TERC_NIT AND T.TERC_NIT = :NIT AND C.terc_nit = S.terc_nit AND S.clcu_cod = :sucursal
                INTO :NOMBRE, :TELEFONO, :CIUDAD, :CODZONA, :DV;
            SELECT ZONA_NOM FROM ZONAS WHERE ZONA_COD = :CODZONA INTO :NOMZONA;
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            SUSPEND;
            END
        END
    if (BIN_AND(TIPO, 16) <> 0) then
        BEGIN
        TIPODOC = 35;
        FOR SELECT C.PREF_PRE, COTI_NUMERO, COTI_FECHA, CTDE_CANT * CTDE_FACTOR, CTDE_PRUNIT/CTDE_FACTOR*COTI_FACTOR, CTDE_IVAMONTO*COTI_FACTOR, CTDE_CONSUMO, CTDE_DTOPORC, CTDE_TOTAL*COTI_FACTOR,
            D.ARTI_COD, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD, TERC_NIT, c.coti_sucursal
            FROM COTIZACIONES C, COTIZACIONES_DETALLE D, PREFIJOS P, ARTICULO A
            WHERE C.COTI_ID = D.COTI_ID AND P.PREF_PRE = C.PREF_PRE AND P.TIDO_COD = 34 AND D.ARTI_COD = A.ARTI_COD AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            TERC_NIT >= :TERINI AND TERC_NIT <= :TERFIN AND COTI_FECHA >= :FECINI AND
            COTI_FECHA <= :FECFIN AND COTI_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            ORDER BY TERC_NIT, c.coti_sucursal, ARTI_COD, COTI_FECHA
            INTO :PREFIJO, :NUMERO, :FECHA, CANTIDAD, :BASE, :IVA, :CONSUMO, :dto, :TOTAL, :ARTICULO, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :NIT, :sucursal
            DO
            BEGIN
            select TERC_NOM, TERC_TEL, TERC_CIU, C.ZONA_COD, TERC_DV from terceros T, CLIENTES C, cliente_sucursales S
                where C.TERC_NIT = T.TERC_NIT AND T.TERC_NIT = :NIT AND C.terc_nit = S.terc_nit AND S.clcu_cod = :sucursal
                INTO :NOMBRE, :TELEFONO, :CIUDAD, :CODZONA, :DV;
            SELECT ZONA_NOM FROM ZONAS WHERE ZONA_COD = :CODZONA INTO :NOMZONA;
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            SUSPEND;
            END
        END
    END
END
^

SET TERM ; ^


/* 20100430 */
/* PARAMETER MISTMATCH */
SET TERM ^ ;

CREATE OR ALTER procedure REP_ANALISIS_CXPAGAR (
    DESDE varchar(20),
    HASTA varchar(20),
    GRPINI varchar(5),
    GRPFIN varchar(5),
    FECHA date,
    DETALLE char(1),
    ORDEN char(1),
    AGRUPA char(1),
    DIASR integer,
    SUBEMPRESA INTEGER,
    MONEDA integer)
returns (
    NIT varchar(20),
    NOMBRE varchar(60),
    TELEFONO varchar(40),
    CIUDAD varchar(40),
    GRUPO varchar(2),
    NOMGRUPO varchar(60),
    TIPO integer,
    ID integer,
    PREFIJO varchar(4),
    NUMERO varchar(6),
    DIAS integer,
    SALDO numeric(18,2),
    SALDOMON numeric(18,2),
    TRM numeric(18,2),
    CORRIENTE numeric(18,2),
    CERO numeric(18,2),
    TREINTA numeric(18,2),
    SESENTA numeric(18,2),
    NOVENTA numeric(18,2),
    TIPONOM varchar(8),
    FECDOC date,
    VENCE date,
    NUMPROV varchar(20))
AS
declare variable nitini varchar(20);
declare variable nitfin varchar(20);
declare variable nomini varchar(20);
declare variable nomfin varchar(20);
declare variable ok char(1);
declare variable rtfte numeric(18,2);
declare variable rtiva numeric(18,2);
declare variable rtica numeric(18,2);
declare variable vencimiento varchar(12);
BEGIN
if (ORDEN = 'C') then
    BEGIN
    NITINI = DESDE;
    NITFIN = HASTA;
    NOMINI = '';
    NOMFIN = 'zz';
    END
ELSE
    BEGIN
    NOMINI = DESDE;
    NOMFIN = HASTA;
    NITINI = '';
    NITFIN = 'zz';
    END
/* Ubique el NIT */
FOR select T.TERC_NIT, TERC_NOM,  TERC_TEL, TERC_CIU, GRPR_COD
    from terceros T, PROVEEDORES P
    where P.TERC_NIT = T.TERC_NIT AND TERC_PROV = 'S' AND T.TERC_NIT >= :NITINI AND T.TERC_NIT <= :NITFIN AND
        TERC_NOM >= :NOMINI AND TERC_NOM <= :NOMFIN
    INTO :NIT, :NOMBRE, :TELEFONO, :CIUDAD, :GRUPO
    DO  
    BEGIN
    SELECT GRPR_NOM FROM GRUPOS_PROVEEDORES WHERE GRPR_COD = :GRUPO INTO :NOMGRUPO;
    OK = 'N';
    if (AGRUPA = 'G') then
        BEGIN
        if (GRPINI = '') then
            BEGIN
            if ((GRUPO IS NULL) or (GRUPO >= :GRPINI AND GRUPO <= :GRPFIN)) then
                OK = 'S';
            END
        ELSE
            if (GRUPO >= :GRPINI AND GRUPO <= :GRPFIN) then
                OK = 'S';
        END
    if (AGRUPA = 'N') then
        OK = 'S';
    if (OK = 'S') then
        BEGIN
        CORRIENTE = 0;
        CERO = 0;
        TREINTA = 0;
        SESENTA = 0;
        NOVENTA = 0;
        /* BUSQUE EN SALDOS_DOC_CXPAGAR LOS QUE TENGAN SALDO > 0 */
        FOR SELECT MVPR_TIPOREF, MVPR_IDREF, MVPR_PREFIJO, MVPR_NUMERO, MVPR_FECHA, MVPR_VENCE, MVPR_TRM
            FROM MOVIMIENTO_PROVEEDOR M, PREFIJOS P
            WHERE TERC_NIT = :NIT AND MVPR_FECHA <= :FECHA AND MVPR_ABONO = 'N' AND ((:MONEDA = 0) or (MVPR_TRM <> 1))
            AND P.tido_cod = M.mvpr_tiporef AND P.pref_pre = M.mvpr_prefijo AND ((P.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            INTO :TIPO, :ID, :PREFIJO, :NUMERO, :FECDOC, :VENCE, :TRM
            DO
            BEGIN
            EXECUTE PROCEDURE saldo_doc_cxpagar(TIPO, ID, FECHA, MONEDA) returning_values (SALDO);
            if (SALDO <> 0) then
                BEGIN
                SELECT TIDO_NOMCORTO FROM TIPO_DOCUMENTO WHERE TIDO_COD = :TIPO INTO :TIPONOM;
                if (MONEDA = 0) then
                BEGIN
                    SELECT SUM(SDCP_RTEFTE - SDCP_ABRTFTE), SUM(SDCP_RTIVA - SDCP_ABRTIVA), SUM(SDCP_RTICA - SDCP_ABRTICA)
                        FROM SALDOS_DOC_CXPAGAR WHERE SDCP_TIPOREF = :TIPO AND SDCP_IDREF = :ID
                        INTO :RTFTE, :RTIVA, :RTICA;
                    if (TRM <> 1) then
                    SALDOMON = (:SALDO / :TRM);
                    else
                    begin
                    SALDOMON = NULL;
                    TRM = NULL;
                    end
                END
                else
                BEGIN
                    SELECT SUM((SDCP_RTEFTE-SDCP_ABRTFTE)/SDCP_TRM), SUM((SDCP_RTIVA-SDCP_ABRTIVA)/SDCP_TRM), SUM((SDCP_RTICA-SDCP_ABRTICA)/SDCP_TRM)
                        FROM SALDOS_DOC_CXPAGAR WHERE SDCP_TIPOREF = :TIPO AND SDCP_IDREF = :ID
                        INTO :RTFTE, :RTIVA, :RTICA;
                END
                if (RTFTE IS NULL) then
                    RTFTE = 0;
                if ((TIPO = 52) or (TIPO = 55) or (TIPO = 24)) THEN
                    BEGIN
                    if (RTFTE > 0) then
                        RTFTE = 0;
                    END
                ELSE
                    BEGIN
                    if (RTFTE < 0) then
                        RTFTE = 0;
                    END

                if (RTIVA IS NULL) then
                    RTIVA = 0;
                if ((TIPO = 52) or (TIPO = 55) or (TIPO = 24)) THEN
                    BEGIN
                    if (RTIVA > 0) then
                        RTIVA = 0;
                    END
                ELSE
                    BEGIN
                    if (RTIVA < 0) then
                        RTIVA = 0;
                    END

                if (RTICA IS NULL) then
                    RTICA = 0;
                if ((TIPO = 52) or (TIPO = 55) or (TIPO = 24)) THEN
                    BEGIN
                    if (RTICA > 0) then
                        RTICA = 0;
                    END
                ELSE
                    BEGIN
                    if (RTICA < 0) then
                        RTICA = 0;
                    END
                /* AHORA CLASIFIQUE LOS DIAS */
                if (DETALLE = 'S') then
                    BEGIN
                    CORRIENTE = 0;
                    CERO = 0;
                    TREINTA = 0;
                    SESENTA = 0;
                    NOVENTA = 0;
                    END
                EXECUTE PROCEDURE LEE_CONFIGURACION('CXPAGAR', 'SALDOS', 'ANALISIS DE CXPAGAR CON FECHA FACTURA O VENCIMIENTO') returning_values (VENCIMIENTO);
                if (VENCIMIENTO = 'FECHA') then
                    DIAS = FECHA - FECDOC;
                ELSE
                    DIAS = FECHA - VENCE;
                if (DIAS < 0) then
                    CORRIENTE = CORRIENTE + SALDO;
                ELSE
                    if (DIAS < DIASR) then
                        CERO = CERO + SALDO;
                    ELSE
                        if (DIAS < (DIASR * 2)) then
                            TREINTA = TREINTA + SALDO;
                        ELSE
                            if (DIAS < (DIASR * 3)) then
                                SESENTA = SESENTA + SALDO;
                            ELSE
                                NOVENTA = NOVENTA + SALDO;
                if (DETALLE = 'S') then
                    BEGIN
                    if (TIPO = 51) then
                        SELECT NDPR_NUMPROV FROM NOTAS_DEBITO_PROVEEDOR WHERE NDPR_ID = :ID INTO :NUMPROV;
                    ELSE
                        if (TIPO = 21) then
                            SELECT FACO_NUMPROV FROM FACTURAS_COMPRA WHERE FACO_ID = :ID INTO :NUMPROV;
                        ELSE
                            NUMPROV = '';
                    SUSPEND;
                    END
                END /* SALDO <> 0 */
            END /* FOR MVPR */
        if (DETALLE = 'N') then
            begin
            SALDO = CORRIENTE + CERO + TREINTA + SESENTA + NOVENTA;
            if (TRM <> 1) then
             SALDOMON = (:SALDO / :TRM);
            else
             begin
             SALDOMON = null;
             trm = null;
             end
            SUSPEND;
            end
        END /* OK */
    END /* FOR NIT */
END
^

SET TERM ; ^

/* 20100501 */
/* REGISTRA UNA APLICACION CON PREFIJO INDICADO EN LA FECHA DEL DOCUMENTO ORIGINAL CON SALDO PENDIENTE DB Y CR IGUAL A LA DEL MISMO DIA, EL SALDO SE VERIFICA A LA FECHA INDICADA */
SET TERM ^ ;

CREATE OR ALTER procedure REGISTRE_APLICACIONES_CLIENTES (
    NITINI varchar(20),
    NITFIN varchar(20),
    PREF varchar(4),
    FECHA date)
returns (
    ID integer,
    NIT varchar(20),
    SUCURSAL varchar(10),
    NUMERO varchar(6),
    PREFD varchar(4),
    NUMD varchar(6),
    PREFF varchar(4),
    NUMF varchar(6),
    MONTO numeric(18,2))
AS
declare variable IDF INTEGER;
declare variable IDD INTEGER;
declare variable TIPOD INTEGER;
declare variable TIPOF INTEGER;
declare variable MONTOF NUMERIC(18,2);
declare variable nomtipod VARCHAR(8);
declare variable nomtipoF VARCHAR(8);
declare variable COBR INTEGER;
declare variable FECDEV DATE;
begin
FOR select TERC_NIT, CLCU_COD
    from CLIENTE_SUCURSALES S
    where TERC_NIT >= :NITINI AND TERC_NIT <= :NITFIN
    INTO :NIT, :SUCURSAL
    DO  
    BEGIN
    FOR SELECT MVCL_TIPOREF, MVCL_IDREF, MVCL_PREFREF, MVCL_NUMREF, MVCL_FECHA
        FROM MOVIMIENTO_CLIENTES WHERE TERC_NIT = :NIT AND MVCL_SUCURSAL = :SUCURSAL AND MVCL_FECHA <= :FECHA AND
        MVCL_ABONO = 'N' AND MVCL_DEBITO = 'N'
        INTO :TIPOD, :IDD, :PREFD, :NUMD, :FECDEV
        DO
        BEGIN
        EXECUTE PROCEDURE saldo_doc_cartera(TIPOD, IDD, FECHA, 0) returning_values (MONTO);
        if (MONTO <> 0) then
            BEGIN
            /* BUSQUE UN MOVIMIENTO DEL MISMO VALOR DEBITO DE LA MISMA FECHA */
            FOR SELECT MVCL_TIPOREF, MVCL_IDREF, MVCL_PREFREF, MVCL_NUMREF, COBR_COD
                FROM MOVIMIENTO_CLIENTES WHERE TERC_NIT = :NIT AND MVCL_SUCURSAL = :SUCURSAL AND MVCL_FECHA = :FECDEV AND
                MVCL_ABONO = 'N' AND MVCL_DEBITO = 'S'
                INTO :TIPOF, :IDF, :PREFF, :NUMF, :COBR
                DO
                BEGIN
                EXECUTE PROCEDURE saldo_doc_cartera(TIPOF, IDF, FECHA, 0) returning_values (MONTOF);
                if ((ABS(monto) = ABS(montof)) AND (monto <> 0)) then
                    BEGIN
                    ID = gen_id(id_aplicaclie, 1);
                    SELECT PREF_ACTUAL FROM PREFIJOS WHERE PREF_PRE = :PREF AND TIDO_COD = 43 INTO :numero;
                    SELECT TIDO_NOMCORTO FROM tipo_documento WHERE TIDO_COD = :TIPOD INTO :nomtipod;
                    SELECT TIDO_NOMCORTO FROM tipo_documento WHERE TIDO_COD = :TIPOF INTO :nomtipof;
                    INSERT INTO APLICACION_CLIENTE (APCL_ID, TERC_NIT, TIDO_COD, PREF_PRE, APCL_NUMERO,
                        APCL_FECHA, APCL_CONCEPTO, APCL_OBS, APCL_ANULADO, APCL_TRANSMIT, COBR_COD,
                        APCL_USUARIO, APCL_SUCURSAL, NUMOK, APCL_TRM)
                        VALUES (:ID, :NIT, 43, :PREF, :NUMERO, :FECDEV,
                        'APLICACION ' || :nomtipod || ' ' || :prefd || :numd || ' A ' || :nomtipof || ' ' || :preff || :numf, NULL, 'N', 'N', :COBR,
                        NULL, :sucursal, 'N', 1);
                    INSERT INTO APLICACION_CLIENTE_DETALLE (APCL_ID, ACDE_ITEM, ACDE_TIPODOC, ACDE_IDDOC,
                        ACDE_PREFIJO, ACDE_NUMERO, ACDE_APLICADO, ACDE_RTFTE, ACDE_RTIVA, ACDE_RTICA,
                        ACDE_ANULADO, ACDE_TRANSMIT, ACDE_DIFCAMBIO)
                        VALUES (:ID, 1, :tipod, :IDD, :prefd, :numd, :MONTO, 0, 0, 0, 'N', 'N', 0);
                    INSERT INTO APLICACION_CLIENTE_DETALLE (APCL_ID, ACDE_ITEM, ACDE_TIPODOC, ACDE_IDDOC,
                        ACDE_PREFIJO, ACDE_NUMERO, ACDE_APLICADO, ACDE_RTFTE, ACDE_RTIVA, ACDE_RTICA,
                        ACDE_ANULADO, ACDE_TRANSMIT, ACDE_DIFCAMBIO)
                        VALUES (:ID, 2, :tipof, :idf, :preff, :numf, :MONTOF, 0, 0, 0, 'N', 'N', 0);
                    suspend;
                    MONTO = 0;
                    END
                END
            END
        END
    END
end
^

SET TERM ; ^


/* 20100503 */
/* SOLO CUENTAS CON PRESUPUESTO O MOVIMIENTO */
SET TERM ^ ;

CREATE OR ALTER procedure PRESUPUESTO_MES (
    PERIODO integer,
    ANO char(4),
    CUENINI varchar(20),
    CUENFIN varchar(20))
returns (
    CUENTA varchar(20),
    NOMCUENTA varchar(60),
    PRDEBITO numeric(18,2),
    PRCREDITO numeric(18,2),
    MVDEBITO numeric(18,2),
    MVCREDITO numeric(18,2),
    DIFERENCIA numeric(18,2),
    PORCENTAJE numeric(9,2))
AS
BEGIN
  /* POR CADA CUENTA AFECTABLE CALCULE PRESUP Y MOV. */
  FOR SELECT CUEN_COD, CUEN_NOM FROM CUENTAS WHERE CUEN_COD >= :CUENINI AND CUEN_COD <= :CUENFIN
      order by cuen_cod INTO :CUENTA, :NOMCUENTA
  DO
    BEGIN
    /* CALCULE EL PRESUPUESTO */
    SELECT PRES_DEBITO, PRES_CREDITO FROM PRESUPUESTO
        WHERE CUEN_COD = :CUENTA AND PRES_PERIODO = :PERIODO
        INTO :PRDEBITO, :PRCREDITO;
    if (PRDEBITO IS NULL) then
        PRDEBITO = 0;
    if (PRCREDITO IS NULL) then
        PRCREDITO = 0;
    /* CALCULE EL MOVIMIENTO */
    EXECUTE PROCEDURE MOVIMIENTO_CUENTA_MES(:CUENTA, :ANO, :PERIODO, 'S') returning_values (:MVDEBITO);
    
    EXECUTE PROCEDURE MOVIMIENTO_CUENTA_MES(:CUENTA, :ANO, :PERIODO, 'N') returning_values (:MVCREDITO);
    
    DIFERENCIA = (PRDEBITO - MVDEBITO) - (PRCREDITO - MVCREDITO);
    if ((PRDEBITO - PRCREDITO) <> 0) then
        PORCENTAJE = 100 - (DIFERENCIA * 100 / (PRDEBITO - PRCREDITO));
    ELSE
        PORCENTAJE = 0;
    if ((PRDEBITO <> 0) or (PRCREDITO <> 0) or (MVDEBITO <> 0) or (MVCREDITO <> 0))  then
        SUSPEND;
    END
END
^

SET TERM ; ^


/* 20100505 */
/* PORCENTAJE DE IVA EN REPORTE DE UTILIDAD POR ARTICULO */
SET TERM ^ ;

create or alter procedure NOMBRES_GRUPOS_INVENTARIO (
    CODGRUP varchar(3),
    CODSUBG varchar(3),
    CODMARC varchar(3))
returns (
    NOMGRUP varchar(60),
    NOMSUBG varchar(60),
    NOMMARC varchar(60))
AS
begin
nomgrup = '';
NOMSUBG = '';
NOMMARC = '';
SELECT GRUP_NOM FROM grupo WHERE GRUP_COD = :CODGRUP INTO NOMGRUP;
SELECT SUBG_NOM FROM subgrupo WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUP INTO :NOMSUBG;
SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
suspend;
end
^

SET TERM ; ^

grant EXECUTE on PROCEDURE nombres_grupos_inventario to PUBLIC;


SET TERM ^ ;

CREATE OR ALTER procedure REP_UTILIDAD_VENTAS (
    TIPO integer,
    DETALLE char(1),
    FECINI date,
    FECFIN date,
    ARTINI varchar(15),
    ARTFIN varchar(15),
    GRPINI varchar(3),
    GRPFIN varchar(3),
    ORDEN char(1),
    AGRUPA char(1),
    ULTIMO char(1),
    CEROS char(1),
    SUBEMPRESA integer)
returns (
    ARTICULO varchar(15),
    DESCRIPCION varchar(60),
    CODGRUPO varchar(2),
    NOMGRUPO varchar(30),
    CODSUBG varchar(3),
    NOMSUBG varchar(30),
    CODMARC varchar(3),
    NOMMARC varchar(30),
    UNIDAD varchar(8),
    CANTIDAD numeric(18,4),
    BASE numeric(18,4),
    COSTO numeric(18,4),
    UTILIDAD numeric(18,4),
    PORC numeric(9,2),
    IVA numeric(18,4),
    IVAPOR numeric(9,2),
    CONSUMO numeric(18,4),
    PREFIJO varchar(4),
    NUMERO varchar(6),
    FECHA date,
    TIPODOC integer,
    PART float)
AS
DECLARE VARIABLE COSTOUNIT NUMERIC(18,4);
DECLARE VARIABLE CANTDET NUMERIC(18,4);
DECLARE VARIABLE TOTAL NUMERIC(18,2);
declare variable CODINI VARCHAR(15);
declare variable CODFIN VARCHAR(15);
declare variable DESINI VARCHAR(15);
declare variable DESFIN VARCHAR(15);
declare variable MARINI VARCHAR(3);
declare variable MARFIN VARCHAR(3);
declare variable UOM VARCHAR(20);
declare variable ULTCOS NUMERIC(18,2);
declare variable IDREP INTEGER;
declare variable ID integer;
declare variable ITEM integer;
BEGIN
if (ORDEN = 'C') then
    BEGIN
    CODINI = ARTINI;
    CODFIN = ARTFIN;
    DESINI = '';
    DESFIN = 'zz';
    END
ELSE
    BEGIN
    DESINI = ARTINI;
    DESFIN = ARTFIN;
    CODINI = '';
    CODFIN = 'zz';
    END
if (AGRUPA = 'G') then
    BEGIN
    MARINI = '';
    MARFIN = 'zz';
    END
ELSE
    if (AGRUPA = 'M') then
        BEGIN
        MARINI = GRPINI;
        MARFIN = GRPFIN;
        GRPINI = '';
        GRPFIN = 'zz';
        END
    ELSE
        BEGIN
        MARINI = '';
        MARFIN = 'zz';
        GRPINI = '';
        GRPFIN = 'zz';
        END
EXECUTE PROCEDURE lee_configuracion ('FACTURACION', 'ARTICULOS', 'SUGERIR PRECIOS CON PORCENTAJE DE MARGEN O UTILIDAD') returning_values (:UOM);
IDREP = GEN_ID(id_reputilidad, 1);
if (DETALLE = 'N') then
    BEGIN
    if (BIN_AND(TIPO, 1) <> 0) then
        BEGIN
        TIPODOC = 31;
        FOR SELECT MAX(D.ARTI_COD), SUM(FADE_CANT * FADE_FACTOR), SUM((FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO)*FACT_FACTOR), SUM(FADE_IVAMONTO*FACT_FACTOR), SUM(FADE_CONSUMO)
            FROM FACTURAS_DETALLE D, FACTURAS F, PREFIJOS P, ARTICULO A
            WHERE F.FACT_ID = D.FACT_ID AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND D.ARTI_COD = A.arti_cod AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            FACT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) and substring(a.arti_cod from 1 FOR 2) <> '.t'
            GROUP BY D.ARTI_COD
            INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO
            DO
            BEGIN
            COSTO = 0;
            FOR SELECT FADE_CANT * FADE_FACTOR, FACT_FECHA, F.FACT_ID, FADE_ITEM FROM FACTURAS_DETALLE D, FACTURAS F, PREFIJOS P
                WHERE F.FACT_ID = D.FACT_ID AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND
                FACT_ANULADO = 'N' AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                and D.ARTI_COD = :articulo  INTO :cantdet, :fecha, :id, :item
                DO
                BEGIN
                if (EXISTS (SELECT COST_SALP / COST_SALC FROM COSTOS C, MOVIMIENTO_ARTICULO M
                    WHERE C.arti_cod = M.arti_cod AND COST_IDMOV = MVAR_CONS AND MVAR_TIPODOC = 31 AND MVAR_IDREF = :ID AND COST_SALC <> 0 AND MVAR_ITEM = :ITEM)) then
                    SELECT COST_SALP / COST_SALC, COST_ULTIMO FROM COSTOS C, MOVIMIENTO_ARTICULO M
                    WHERE C.arti_cod = M.arti_cod AND COST_IDMOV = MVAR_CONS AND MVAR_TIPODOC = 31 AND MVAR_IDREF = :ID AND COST_SALC <> 0 AND MVAR_ITEM = :ITEM INTO :costounit, :ultcos;
                else
                    EXECUTE PROCEDURE costo_promedio_y_ultimo(:ARTICULO, :FECHA) returning_values (:costounit, :ultcos);
                if (ULTIMO = 'S') then
                    COSTO = COSTO + ultcos * cantdet;
                else
                    COSTO = COSTO + costounit * cantdet;
                END
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            INSERT INTO REP_UTILIDAD(ID, TIPO, CODIGO, BASE, IVA, CONSUMO, COSTO) VALUES (:IDREP, 31, :articulo, :base, :iva, :consumo, :costo);
            if (CEROS = 'S') then
                INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (2, USER, :ARTICULO);
            END /* FOR */
        SELECT SUM(BASE-COSTO) FROM REP_UTILIDAD WHERE id = :IDREP AND TIPO = 31 INTO :TOTAL;
        FOR SELECT ARTI_COD, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD, TAIV_PORC FROM ARTICULO A, TARIFA_IVA T
            WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND
            (A.MARC_COD <= :MARFIN))) AND substring(a.arti_cod from 1 FOR 2) <> '.t' AND A.taiv_cod = T.taiv_cod
            INTO :ARTICULO, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :ivapor
            DO
            BEGIN
            EXECUTE procedure nombres_grupos_inventario (CODGRUPO, CODSUBG, CODMARC)
                returning_values (NOMGRUPO, NOMSUBG, NOMMARC);
            BASE = 0;
            IVA = 0;
            CONSUMO = 0;
            COSTO = 0;
            UTILIDAD = 0;
            PORC = 0;
            PART = 0;
            SELECT BASE, IVA, CONSUMO, COSTO FROM rep_utilidad WHERE ID = :IDREP AND TIPO = 31 AND CODIGO = :articulo INTO :BASE, :IVA, :consumo,  :costo;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            EXECUTE PROCEDURE PORCENTAJE (utilidad,  TOTAL, 'S') returning_values (part);
            if ((CEROS = 'S') or (BASE <> 0) or (COSTO <> 0)) then
                SUSPEND;
            END /* FOR */
            BEGIN
            COSTO = 0;
            END
        END
    if (BIN_AND(TIPO, 2) <> 0) then
        BEGIN
        TIPODOC = 32;
        FOR SELECT MAX(D.ARTI_COD), SUM(RVDE_CANT * RVDE_FACTOR), SUM(RVDE_TOTAL-RVDE_IVAMONTO-RVDE_CONSUMO), SUM(RVDE_IVAMONTO), SUM(RVDE_CONSUMO)
            FROM REMISIONES_VENTA_DETALLE D, REMISIONES_VENTA R, PREFIJOS P, ARTICULO A
            WHERE R.REVT_ID = D.REVT_ID AND P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = 32 AND D.ARTI_COD = A.arti_cod AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            REVT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY D.ARTI_COD
            INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO
            DO
            BEGIN
            COSTO = 0;
            FOR SELECT RVDE_CANT * RVDE_FACTOR, REVT_FECHA, F.REVT_ID, RVDE_ITEM FROM remisiones_venta_detalle D, remisiones_venta F, PREFIJOS P
                WHERE F.revt_id = D.revt_id AND REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN AND
                REVT_ANULADO = 'N' AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 32 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                and D.ARTI_COD = :articulo  INTO :cantdet, :fecha, :id, :item
                DO
                BEGIN
                if (EXISTS (SELECT COST_SALP / COST_SALC FROM COSTOS C, MOVIMIENTO_ARTICULO M
                    WHERE C.arti_cod = M.arti_cod AND COST_IDMOV = MVAR_CONS AND MVAR_TIPODOC = 32 AND MVAR_IDREF = :ID AND COST_SALC <> 0 AND MVAR_ITEM = :ITEM)) then
                    SELECT COST_SALP / COST_SALC, cost_ultimo FROM COSTOS C, MOVIMIENTO_ARTICULO M
                    WHERE C.arti_cod = M.arti_cod AND COST_IDMOV = MVAR_CONS AND MVAR_TIPODOC = 32 AND MVAR_IDREF = :ID AND COST_SALC <> 0 AND MVAR_ITEM = :ITEM INTO :costounit, :ultcos;
                else
                    EXECUTE PROCEDURE costo_promedio_y_ultimo(:ARTICULO, :FECHA) returning_values (:costounit, :ultcos);
                if (ULTIMO = 'S') then
                    COSTO = COSTO + ultcos * cantdet;
                else
                    COSTO = COSTO + costounit * cantdet;
                END
            EXECUTE procedure nombres_grupos_inventario (CODGRUPO, CODSUBG, CODMARC)
                returning_values (NOMGRUPO, NOMSUBG, NOMMARC);
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            if (CEROS = 'S') then
                INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (2, USER, :ARTICULO);
            INSERT INTO REP_UTILIDAD(ID, TIPO, CODIGO, BASE, IVA, CONSUMO, COSTO) VALUES (:IDREP, 32, :articulo, :base, :iva, :consumo, :costo);
            END /* FOR */
        SELECT SUM(BASE-COSTO) FROM REP_UTILIDAD WHERE id = :IDREP AND TIPO = 32 INTO :TOTAL;
        FOR SELECT ARTI_COD, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD, TAIV_PORC FROM ARTICULO A, TARIFA_IVA T
            WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND
            (A.MARC_COD <= :MARFIN))) AND substring(a.arti_cod from 1 FOR 2) <> '.t' AND A.taiv_cod = T.taiv_cod
            INTO :ARTICULO, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :ivapor
            DO
            BEGIN
            EXECUTE procedure nombres_grupos_inventario (CODGRUPO, CODSUBG, CODMARC)
                returning_values (NOMGRUPO, NOMSUBG, NOMMARC);
            BASE = 0;
            IVA = 0;
            CONSUMO = 0;
            COSTO = 0;
            UTILIDAD = 0;
            PORC = 0;
            SELECT BASE, IVA, CONSUMO, COSTO FROM rep_utilidad WHERE ID = :IDREP AND TIPO = 32 AND CODIGO = :articulo INTO :BASE, :IVA, :consumo,  :costo;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            EXECUTE PROCEDURE PORCENTAJE (utilidad,  TOTAL, 'S') returning_values (part);
            if ((CEROS = 'S') or (BASE <> 0) or (COSTO <> 0)) then
                SUSPEND;
            END /* FOR */
        END
    if (BIN_AND(TIPO, 4) <> 0) then
        BEGIN
        TIPODOC = 33;
        FOR SELECT MAX(D.ARTI_COD), SUM(DVDE_CANT * DVDE_FACTOR), SUM((DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO)*DEVT_FACTOR), SUM(DVDE_IVAMONTO*DEVT_FACTOR), SUM(DVDE_CONSUMO)
            FROM devoluciones_ventas_detalle D, DEVOLUCIONES_VENTAS V, PREFIJOS P, ARTICULO A
            WHERE V.DEVT_ID = D.DEVT_ID AND P.PREF_PRE = V.PREF_PRE AND P.TIDO_COD = 33 AND D.ARTI_COD = A.arti_cod AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            DEVT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY D.ARTI_COD
            INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO
            DO
            BEGIN
            COSTO = 0;
            FOR SELECT DVDE_CANT * DVDE_FACTOR, DEVT_FECHA, F.DEVT_ID, DVDE_ITEM FROM devoluciones_ventas_detalle D, devoluciones_ventas F, PREFIJOS P
                WHERE F.devt_id = D.devt_id AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND
                DEVT_ANULADO = 'N' AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 33 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                and D.ARTI_COD = :articulo  INTO :cantdet, :fecha, :id, :item
                DO
                BEGIN
                if (EXISTS (SELECT COST_ENTP / COST_ENTC FROM COSTOS C, MOVIMIENTO_ARTICULO M
                    WHERE C.arti_cod = M.arti_cod AND COST_IDMOV = MVAR_CONS AND MVAR_TIPODOC = 33 AND MVAR_IDREF = :ID AND COST_ENTC <> 0 AND MVAR_ITEM = :ITEM)) then
                    SELECT COST_ENTP / COST_ENTC, COST_ULTIMO FROM COSTOS C, MOVIMIENTO_ARTICULO M
                        WHERE C.arti_cod = M.arti_cod AND COST_IDMOV = MVAR_CONS AND MVAR_TIPODOC = 33 AND MVAR_IDREF = :ID AND COST_ENTC <> 0 AND MVAR_ITEM = :ITEM INTO :costounit, :ultcos;
                else
                    EXECUTE PROCEDURE costo_promedio_y_ultimo(:ARTICULO, :FECHA) returning_values (:costounit, :ultcos);
                if (ULTIMO = 'S') then
                    COSTO = COSTO + ultcos * cantdet;
                else
                    COSTO = COSTO + costounit * cantdet;
                END
            EXECUTE procedure nombres_grupos_inventario (CODGRUPO, CODSUBG, CODMARC)
                returning_values (NOMGRUPO, NOMSUBG, NOMMARC);
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            else
                CANTIDAD = CANTIDAD * -1;
            if (BASE IS NULL) then
                BASE = 0;
            else
                BASE = BASE * -1;
            if (IVA IS NULL) then
                IVA = 0;
            else
                IVA = IVA * -1;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            else
                CONSUMO = CONSUMO * -1;
            COSTO = costo * -1;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            if (CEROS = 'S') then
                INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (2, USER, :ARTICULO);
            INSERT INTO REP_UTILIDAD(ID, TIPO, CODIGO, BASE, IVA, CONSUMO, COSTO) VALUES (:IDREP, 33, :articulo, :base, :iva, :consumo, :costo);
            END /* FOR */
        SELECT SUM(BASE-COSTO) FROM REP_UTILIDAD WHERE id = :IDREP AND TIPO = 33 INTO :TOTAL;
        FOR SELECT ARTI_COD, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD, TAIV_PORC FROM ARTICULO A, TARIFA_IVA T
            WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND
            (A.MARC_COD <= :MARFIN))) AND substring(a.arti_cod from 1 FOR 2) <> '.t' AND A.taiv_cod = T.taiv_cod
            INTO :ARTICULO, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :ivapor
            DO
            BEGIN
            EXECUTE procedure nombres_grupos_inventario (CODGRUPO, CODSUBG, CODMARC)
                returning_values (NOMGRUPO, NOMSUBG, NOMMARC);
            BASE = 0;
            IVA = 0;
            CONSUMO = 0;
            COSTO = 0;
            UTILIDAD = 0;
            PORC = 0;
            SELECT BASE, IVA, CONSUMO, COSTO FROM rep_utilidad WHERE ID = :IDREP AND TIPO = 33 AND CODIGO = :articulo INTO :BASE, :IVA, :consumo,  :costo;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            EXECUTE PROCEDURE PORCENTAJE (utilidad,  TOTAL, 'S') returning_values (part);
            if ((CEROS = 'S') or (BASE <> 0) or (COSTO <> 0)) then
                SUSPEND;
            END /* FOR */
        END
    if (BIN_AND(TIPO, 8) <> 0) then
        BEGIN
        TIPODOC = 34;
        /* BORRA LA TABLA AUXILIAR */
        DELETE FROM reportes_aux WHERE REPA_ID = 2 AND REPA_USER = USER;

        FOR SELECT MAX(D.ARTI_COD), SUM(PEDE_CANT * PEDE_FACTOR), SUM((PEDE_TOTAL-PEDE_IVAMONTO-PEDE_CONSUMO)*PEDI_FACTOR), SUM(PEDE_IVAMONTO*PEDI_FACTOR), SUM(PEDE_CONSUMO)
            FROM PEDIDOS_DETALLE D, PEDIDOS P, PREFIJOS R, ARTICULO A
            WHERE P.PEDI_ID = D.PEDI_ID AND P.PREF_PRE = R.PREF_PRE AND R.TIDO_COD = 34 AND D.ARTI_COD = A.arti_cod AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            PEDI_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY D.ARTI_COD
            INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO
            DO
            BEGIN
            COSTO = 0;
            FOR SELECT PEDE_CANT * PEDE_FACTOR, PEDI_FECHA FROM pedidos_detalle D, pedidos F, PREFIJOS P
                WHERE F.pedi_id = D.pedi_id AND PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND
                PEDI_ANULADO = 'N' AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                and D.ARTI_COD = :articulo  INTO :cantdet, :fecha
                DO
                BEGIN
                EXECUTE PROCEDURE costo_promedio_y_ultimo(:ARTICULO, :FECHA) returning_values (:costounit, :ultcos);
                if (ULTIMO = 'S') then
                    COSTO = COSTO + ultcos * cantdet;
                else
                    COSTO = COSTO + costounit * cantdet;
                END
            EXECUTE procedure nombres_grupos_inventario (CODGRUPO, CODSUBG, CODMARC)
                returning_values (NOMGRUPO, NOMSUBG, NOMMARC);
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            if (CEROS = 'S') then
                INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (2, USER, :ARTICULO);
            INSERT INTO REP_UTILIDAD(ID, TIPO, CODIGO, BASE, IVA, CONSUMO, COSTO) VALUES (:IDREP, 34, :articulo, :base, :iva, :consumo, :costo);
            END /* FOR */
        SELECT SUM(BASE-COSTO) FROM REP_UTILIDAD WHERE id = :IDREP AND TIPO = 34 INTO :TOTAL;
        FOR SELECT ARTI_COD, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD, TAIV_PORC FROM ARTICULO A, TARIFA_IVA T
            WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND
            (A.MARC_COD <= :MARFIN))) AND substring(a.arti_cod from 1 FOR 2) <> '.t' AND A.taiv_cod = T.taiv_cod
            INTO :ARTICULO, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :ivapor
            DO
            BEGIN
            EXECUTE procedure nombres_grupos_inventario (CODGRUPO, CODSUBG, CODMARC)
                returning_values (NOMGRUPO, NOMSUBG, NOMMARC);
            BASE = 0;
            IVA = 0;
            CONSUMO = 0;
            COSTO = 0;
            UTILIDAD = 0;
            PORC = 0;
            SELECT BASE, IVA, CONSUMO, COSTO FROM rep_utilidad WHERE ID = :IDREP AND TIPO = 34 AND CODIGO = :articulo INTO :BASE, :IVA, :consumo,  :costo;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            EXECUTE PROCEDURE PORCENTAJE (utilidad,  TOTAL, 'S') returning_values (part);
            if ((CEROS = 'S') or (BASE <> 0) or (COSTO <> 0)) then
                SUSPEND;
            END /* FOR */
        END
    if (BIN_AND(TIPO, 16) <> 0) then
        BEGIN
        TIPODOC = 35;
        FOR SELECT MAX(D.ARTI_COD), SUM(CTDE_CANT * CTDE_FACTOR), SUM((CTDE_TOTAL-CTDE_IVAMONTO-CTDE_CONSUMO)*COTI_FACTOR), SUM(CTDE_IVAMONTO), SUM(CTDE_CONSUMO)
            FROM COTIZACIONES_DETALLE D, COTIZACIONES C, PREFIJOS P, ARTICULO A
            WHERE C.COTI_ID = D.COTI_ID AND P.PREF_PRE = C.PREF_PRE AND P.TIDO_COD = 35 AND D.ARTI_COD = A.arti_cod AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND COTI_FECHA >= :FECINI AND COTI_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            COTI_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY D.ARTI_COD
            INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO
            DO
            BEGIN
            COSTO = 0;
            FOR SELECT CTDE_CANT * CTDE_FACTOR, COTI_FECHA FROM cotizaciones_detalle D, cotizaciones F, PREFIJOS P
                WHERE F.coti_id = D.coti_id AND COTI_FECHA >= :FECINI AND COTI_FECHA <= :FECFIN AND
                COTI_ANULADO = 'N' AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 35 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                and D.ARTI_COD = :articulo  INTO :cantdet, :fecha
                DO
                BEGIN
                EXECUTE PROCEDURE costo_promedio_y_ultimo(:ARTICULO, :FECHA) returning_values (:costounit, :ultcos);
                if (ULTIMO = 'S') then
                    COSTO = COSTO + ultcos * cantdet;
                else
                    COSTO = COSTO + costounit * cantdet;
                END
            EXECUTE procedure nombres_grupos_inventario (CODGRUPO, CODSUBG, CODMARC)
                returning_values (NOMGRUPO, NOMSUBG, NOMMARC);
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            if (CEROS = 'S') then
                INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (2, USER, :ARTICULO);
            INSERT INTO REP_UTILIDAD(ID, TIPO, CODIGO, BASE, IVA, CONSUMO, COSTO) VALUES (:IDREP, 35, :articulo, :base, :iva, :consumo, :costo);
            END /* FOR */
        SELECT SUM(BASE-COSTO) FROM REP_UTILIDAD WHERE id = :IDREP AND TIPO = 35 INTO :TOTAL;
        FOR SELECT ARTI_COD, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD, TAIV_PORC FROM ARTICULO A, TARIFA_IVA T
            WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND
            (A.MARC_COD <= :MARFIN))) AND substring(a.arti_cod from 1 FOR 2) <> '.t' AND A.taiv_cod = T.taiv_cod
            INTO :ARTICULO, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :ivapor
            DO
            BEGIN
            EXECUTE procedure nombres_grupos_inventario (CODGRUPO, CODSUBG, CODMARC)
                returning_values (NOMGRUPO, NOMSUBG, NOMMARC);
            BASE = 0;
            IVA = 0;
            CONSUMO = 0;
            COSTO = 0;
            UTILIDAD = 0;
            PORC = 0;
            SELECT BASE, IVA, CONSUMO, COSTO FROM rep_utilidad WHERE ID = :IDREP AND TIPO = 35 AND CODIGO = :articulo INTO :BASE, :IVA, :consumo,  :costo;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            EXECUTE PROCEDURE PORCENTAJE (utilidad,  TOTAL, 'S') returning_values (part);
            if ((CEROS = 'S') or (BASE <> 0) or (COSTO <> 0)) then
                SUSPEND;
            END /* FOR */
        END
    END
ELSE
  if (DETALLE = 'G') then
    BEGIN
    if (BIN_AND(TIPO, 1) <> 0) then
        BEGIN
        TIPODOC = 31;
        FOR SELECT MAX(a.grup_cod), SUM((FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO)*FACT_FACTOR), SUM(FADE_IVAMONTO*FACT_FACTOR), SUM(FADE_CONSUMO)
            FROM FACTURAS_DETALLE D, FACTURAS F, PREFIJOS P, ARTICULO A
            WHERE F.FACT_ID = D.FACT_ID AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND D.ARTI_COD = A.arti_cod AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            FACT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) and substring(a.arti_cod from 1 FOR 2) <> '.t'
            GROUP BY a.grup_cod
            INTO :codgrupo, :BASE, :IVA, :CONSUMO
            DO
            BEGIN
            COSTO = 0;
            FOR SELECT D.arti_cod, FADE_CANT * FADE_FACTOR, FACT_FECHA, F.fact_id, D.fade_item FROM FACTURAS_DETALLE D, FACTURAS F, PREFIJOS P, ARTICULO A
                WHERE A.arti_cod = D.arti_cod AND F.FACT_ID = D.FACT_ID AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND
                FACT_ANULADO = 'N' AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                and a.grup_cod = :codgrupo INTO :ARTICULO, cantdet, :fecha, :id, :item
                DO
                BEGIN
                if (EXISTS (SELECT COST_SALP / COST_SALC FROM COSTOS C, MOVIMIENTO_ARTICULO M
                    WHERE C.arti_cod = M.arti_cod AND COST_IDMOV = MVAR_CONS AND MVAR_TIPODOC = 31 AND MVAR_IDREF = :ID AND COST_SALC <> 0 AND MVAR_ITEM = :ITEM)) then
                    SELECT COST_SALP / COST_SALC, COST_ULTIMO FROM COSTOS C, MOVIMIENTO_ARTICULO M
                        WHERE C.arti_cod = M.arti_cod AND COST_IDMOV = MVAR_CONS AND MVAR_TIPODOC = 31 AND MVAR_IDREF = :ID AND COST_SALC <> 0 AND MVAR_ITEM = :ITEM INTO :costounit, :ultcos;
                else
                    EXECUTE PROCEDURE costo_promedio_y_ultimo(:ARTICULO, :FECHA) returning_values (:costounit, :ultcos);
                if (ULTIMO = 'S') then
                    COSTO = COSTO + ultcos * cantdet;
                else
                    COSTO = COSTO + costounit * cantdet;
                END
            CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            INSERT INTO REP_UTILIDAD(ID, TIPO, CODIGO, BASE, IVA, CONSUMO, COSTO) VALUES (:IDREP, 31, :codgrupo, :base, :iva, :consumo, :costo);
            if (CEROS = 'S') then
                INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (2, USER, :codgrupo);
            END /* FOR */
        SELECT SUM(BASE-COSTO) FROM REP_UTILIDAD WHERE id = :IDREP AND TIPO = 31 INTO :TOTAL;
        FOR SELECT GRUP_COD, GRUP_NOM FROM GRUPO
            WHERE GRUP_COD >= :GRPINI AND GRUP_COD <= :grpfin
            INTO :ARTICULO, :DESCRIPCION
            DO
            BEGIN
            BASE = 0;
            IVA = 0;
            CONSUMO = 0;
            COSTO = 0;
            UTILIDAD = 0;
            PORC = 0;
            PART = 0;
            SELECT BASE, IVA, CONSUMO, COSTO FROM rep_utilidad WHERE ID = :IDREP AND TIPO = 31 AND CODIGO = :articulo INTO :BASE, :IVA, :consumo,  :costo;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            EXECUTE PROCEDURE PORCENTAJE (utilidad,  TOTAL, 'S') returning_values (part);
            if ((CEROS = 'S') or (BASE <> 0) or (COSTO <> 0)) then
                SUSPEND;
            END /* FOR */
            BEGIN
            COSTO = 0;
            END
        END
    if (BIN_AND(TIPO, 2) <> 0) then
        BEGIN
        TIPODOC = 32;
        FOR SELECT MAX(a.grup_cod), SUM(RVDE_TOTAL-RVDE_IVAMONTO-RVDE_CONSUMO), SUM(RVDE_IVAMONTO), SUM(RVDE_CONSUMO)
            FROM REMISIONES_VENTA_DETALLE D, REMISIONES_VENTA R, PREFIJOS P, ARTICULO A
            WHERE R.REVT_ID = D.REVT_ID AND P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = 32 AND D.ARTI_COD = A.arti_cod AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            REVT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY a.grup_cod
            INTO :codgrupo, :BASE, :IVA, :CONSUMO
            DO
            BEGIN
            COSTO = 0;
            FOR SELECT D.arti_cod, RVDE_CANT * RVDE_FACTOR, REVT_FECHA, F.REVT_ID, RVDE_ITEM FROM remisiones_venta_detalle D, remisiones_venta F, PREFIJOS P, ARTICULO A
                WHERE A.arti_cod = D.arti_cod AND F.revt_id = D.revt_id AND REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN AND
                REVT_ANULADO = 'N' AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 32 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                and a.grup_cod = :codgrupo INTO :ARTICULO, cantdet, :fecha, :ID, :ITEM
                DO
                BEGIN
                if (EXISTS (SELECT COST_SALP / COST_SALC FROM COSTOS C, MOVIMIENTO_ARTICULO M
                    WHERE C.arti_cod = M.arti_cod AND COST_IDMOV = MVAR_CONS AND MVAR_TIPODOC = 32 AND MVAR_IDREF = :ID AND COST_SALC <> 0 AND MVAR_ITEM = :ITEM)) then
                    SELECT COST_SALP / COST_SALC, COST_ULTIMO FROM COSTOS C, MOVIMIENTO_ARTICULO M
                        WHERE C.arti_cod = M.arti_cod AND COST_IDMOV = MVAR_CONS AND MVAR_TIPODOC = 32 AND MVAR_IDREF = :ID AND COST_SALC <> 0 AND MVAR_ITEM = :ITEM INTO :costounit, :ultcos;
                else
                    EXECUTE PROCEDURE costo_promedio_y_ultimo(:ARTICULO, :FECHA) returning_values (:costounit, :ultcos);
                if (ULTIMO = 'S') then
                    COSTO = COSTO + ultcos * cantdet;
                else
                    COSTO = COSTO + costounit * cantdet;
                END
            CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            if (CEROS = 'S') then
                INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (2, USER, :codgrupo);
            INSERT INTO REP_UTILIDAD(ID, TIPO, CODIGO, BASE, IVA, CONSUMO, COSTO) VALUES (:IDREP, 32, :codgrupo, :base, :iva, :consumo, :costo);
            END /* FOR */
        SELECT SUM(BASE-COSTO) FROM REP_UTILIDAD WHERE id = :IDREP AND TIPO = 32 INTO :TOTAL;
        FOR SELECT GRUP_COD, GRUP_NOM FROM GRUPO
            WHERE GRUP_COD >= :GRPINI AND GRUP_COD <= :grpfin
            INTO :ARTICULO, :DESCRIPCION
            DO
            BEGIN
            BASE = 0;
            IVA = 0;
            CONSUMO = 0;
            COSTO = 0;
            UTILIDAD = 0;
            PORC = 0;
            SELECT BASE, IVA, CONSUMO, COSTO FROM rep_utilidad WHERE ID = :IDREP AND TIPO = 32 AND CODIGO = :articulo INTO :BASE, :IVA, :consumo,  :costo;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            EXECUTE PROCEDURE PORCENTAJE (utilidad,  TOTAL, 'S') returning_values (part);
            if ((CEROS = 'S') or (BASE <> 0) or (COSTO <> 0)) then
                SUSPEND;
            END /* FOR */
        END
    if (BIN_AND(TIPO, 4) <> 0) then
        BEGIN
        TIPODOC = 33;
        FOR SELECT MAX(a.grup_cod), SUM((DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO)*DEVT_FACTOR), SUM(DVDE_IVAMONTO*DEVT_FACTOR), SUM(DVDE_CONSUMO)
            FROM devoluciones_ventas_detalle D, DEVOLUCIONES_VENTAS V, PREFIJOS P, ARTICULO A
            WHERE V.DEVT_ID = D.DEVT_ID AND P.PREF_PRE = V.PREF_PRE AND P.TIDO_COD = 33 AND D.ARTI_COD = A.arti_cod AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            DEVT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY a.grup_cod
            INTO :codgrupo, :BASE, :IVA, :CONSUMO
            DO
            BEGIN
            COSTO = 0;
            FOR SELECT D.arti_cod, DVDE_CANT * DVDE_FACTOR, DEVT_FECHA, F.devt_id, D.dvde_item FROM devoluciones_ventas_detalle D, devoluciones_ventas F, PREFIJOS P, ARTICULO A
                WHERE A.arti_cod = D.arti_cod AND F.devt_id = D.devt_id AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND
                DEVT_ANULADO = 'N' AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 33 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                and a.grup_cod = :codgrupo INTO :ARTICULO, cantdet, :fecha, :ID, :ITEM
                DO
                BEGIN
                if (EXISTS (SELECT COST_ENTP / COST_ENTC FROM COSTOS C, MOVIMIENTO_ARTICULO M
                    WHERE C.arti_cod = M.arti_cod AND COST_IDMOV = MVAR_CONS AND MVAR_TIPODOC = 33 AND MVAR_IDREF = :ID AND COST_ENTC <> 0 AND MVAR_ITEM = :ITEM)) then
                    SELECT COST_ENTP / COST_ENTC, COST_ULTIMO FROM COSTOS C, MOVIMIENTO_ARTICULO M
                        WHERE C.arti_cod = M.arti_cod AND COST_IDMOV = MVAR_CONS AND MVAR_TIPODOC = 33 AND MVAR_IDREF = :ID AND COST_ENTC <> 0 AND MVAR_ITEM = :ITEM INTO :costounit, :ultcos;
                else
                    EXECUTE PROCEDURE costo_promedio_y_ultimo(:ARTICULO, :FECHA) returning_values (:costounit, :ultcos);
                if (ULTIMO = 'S') then
                    COSTO = COSTO + ultcos * cantdet;
                else
                    COSTO = COSTO + costounit * cantdet;
                END
            CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            else
                BASE = BASE * -1;
            if (IVA IS NULL) then
                IVA = 0;
            else
                IVA = IVA * -1;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            else
                CONSUMO = CONSUMO * -1;
            COSTO = costo * -1;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            if (CEROS = 'S') then
                INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (2, USER, :codgrupo);
            INSERT INTO REP_UTILIDAD(ID, TIPO, CODIGO, BASE, IVA, CONSUMO, COSTO) VALUES (:IDREP, 33, :codgrupo, :base, :iva, :consumo, :costo);
            END /* FOR */
        SELECT SUM(BASE-COSTO) FROM REP_UTILIDAD WHERE id = :IDREP AND TIPO = 33 INTO :TOTAL;
        FOR SELECT GRUP_COD, GRUP_NOM FROM GRUPO
            WHERE GRUP_COD >= :GRPINI AND GRUP_COD <= :grpfin
            INTO :ARTICULO, :DESCRIPCION
            DO
            BEGIN
            BASE = 0;
            IVA = 0;
            CONSUMO = 0;
            COSTO = 0;
            UTILIDAD = 0;
            PORC = 0;
            SELECT BASE, IVA, CONSUMO, COSTO FROM rep_utilidad WHERE ID = :IDREP AND TIPO = 33 AND CODIGO = :articulo INTO :BASE, :IVA, :consumo,  :costo;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            EXECUTE PROCEDURE PORCENTAJE (utilidad,  TOTAL, 'S') returning_values (part);
            if ((CEROS = 'S') or (BASE <> 0) or (COSTO <> 0)) then
                SUSPEND;
            END /* FOR */
        END
    if (BIN_AND(TIPO, 8) <> 0) then
        BEGIN
        TIPODOC = 34;
        /* BORRA LA TABLA AUXILIAR */
        DELETE FROM reportes_aux WHERE REPA_ID = 2 AND REPA_USER = USER;

        FOR SELECT MAX(a.grup_cod), SUM((PEDE_TOTAL-PEDE_IVAMONTO-PEDE_CONSUMO)*PEDI_FACTOR), SUM(PEDE_IVAMONTO*PEDI_FACTOR), SUM(PEDE_CONSUMO)
            FROM PEDIDOS_DETALLE D, PEDIDOS P, PREFIJOS R, ARTICULO A
            WHERE P.PEDI_ID = D.PEDI_ID AND P.PREF_PRE = R.PREF_PRE AND R.TIDO_COD = 34 AND D.ARTI_COD = A.arti_cod AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            PEDI_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY a.grup_cod
            INTO :codgrupo, :BASE, :IVA, :CONSUMO
            DO
            BEGIN
            COSTO = 0;
            FOR SELECT MAX(D.arti_cod), SUM(PEDE_CANT * PEDE_FACTOR), MAX(pedi_FECHA) FROM pedidos_detalle D, pedidos F, PREFIJOS P, ARTICULO A
                WHERE A.arti_cod = D.arti_cod AND F.pedi_id = D.pedi_id AND PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND
                PEDI_ANULADO = 'N' AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 34 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                and a.grup_cod = :codgrupo GROUP BY D.ARTI_COD, PEDI_FECHA INTO :ARTICULO, cantdet, :fecha
                DO
                BEGIN
                EXECUTE PROCEDURE costo_promedio_y_ultimo(:ARTICULO, :FECHA) returning_values (:costounit, :ultcos);
                if (ULTIMO = 'S') then
                    COSTO = COSTO + ultcos * cantdet;
                else
                    COSTO = COSTO + costounit * cantdet;
                END
            CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            if (CEROS = 'S') then
                INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (2, USER, :codgrupo);
            INSERT INTO REP_UTILIDAD(ID, TIPO, CODIGO, BASE, IVA, CONSUMO, COSTO) VALUES (:IDREP, 34, :codgrupo, :base, :iva, :consumo, :costo);
            END /* FOR */
        SELECT SUM(BASE-COSTO) FROM REP_UTILIDAD WHERE id = :IDREP AND TIPO = 34 INTO :TOTAL;
        FOR SELECT GRUP_COD, GRUP_NOM FROM GRUPO
            WHERE GRUP_COD >= :GRPINI AND GRUP_COD <= :grpfin
            INTO :ARTICULO, :DESCRIPCION
            DO
            BEGIN
            BASE = 0;
            IVA = 0;
            CONSUMO = 0;
            COSTO = 0;
            UTILIDAD = 0;
            PORC = 0;
            SELECT BASE, IVA, CONSUMO, COSTO FROM rep_utilidad WHERE ID = :IDREP AND TIPO = 34 AND CODIGO = :articulo INTO :BASE, :IVA, :consumo,  :costo;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            EXECUTE PROCEDURE PORCENTAJE (utilidad,  TOTAL, 'S') returning_values (part);
            if ((CEROS = 'S') or (BASE <> 0) or (COSTO <> 0)) then
                SUSPEND;
            END /* FOR */
        END
    if (BIN_AND(TIPO, 16) <> 0) then
        BEGIN
        TIPODOC = 35;
        FOR SELECT MAX(a.grup_cod), SUM((CTDE_TOTAL-CTDE_IVAMONTO-CTDE_CONSUMO)*COTI_FACTOR), SUM(CTDE_IVAMONTO), SUM(CTDE_CONSUMO)
            FROM COTIZACIONES_DETALLE D, COTIZACIONES C, PREFIJOS P, ARTICULO A
            WHERE C.COTI_ID = D.COTI_ID AND P.PREF_PRE = C.PREF_PRE AND P.TIDO_COD = 35 AND D.ARTI_COD = A.arti_cod AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND COTI_FECHA >= :FECINI AND COTI_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            COTI_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY A.grup_cod
            INTO :codgrupo, :BASE, :IVA, :CONSUMO
            DO
            BEGIN
            COSTO = 0;
            FOR SELECT MAX(D.arti_cod), SUM(CTDE_CANT * CTDE_FACTOR), MAX(COTI_FECHA) FROM cotizaciones_detalle D, cotizaciones F, PREFIJOS P, ARTICULO A
                WHERE A.arti_cod = D.arti_cod AND F.coti_id = D.coti_id AND COTI_FECHA >= :FECINI AND COTI_FECHA <= :FECFIN AND
                COTI_ANULADO = 'N' AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 35 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                and a.grup_cod = :codgrupo GROUP BY D.ARTI_COD, COTI_FECHA INTO :ARTICULO, cantdet, :fecha
                DO
                BEGIN
                EXECUTE PROCEDURE costo_promedio_y_ultimo(:ARTICULO, :FECHA) returning_values (:costounit, :ultcos);
                if (ULTIMO = 'S') then
                    COSTO = COSTO + ultcos * cantdet;
                else
                    COSTO = COSTO + costounit * cantdet;
                END
            CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            if (CEROS = 'S') then
                INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (2, USER, :codgrupo);
            INSERT INTO REP_UTILIDAD(ID, TIPO, CODIGO, BASE, IVA, CONSUMO, COSTO) VALUES (:IDREP, 35, :codgrupo, :base, :iva, :consumo, :costo);
            END /* FOR */
        SELECT SUM(BASE-COSTO) FROM REP_UTILIDAD WHERE id = :IDREP AND TIPO = 35 INTO :TOTAL;
        FOR SELECT GRUP_COD, GRUP_NOM FROM GRUPO
            WHERE GRUP_COD >= :GRPINI AND GRUP_COD <= :grpfin
            INTO :ARTICULO, :DESCRIPCION
            DO
            BEGIN
            BASE = 0;
            IVA = 0;
            CONSUMO = 0;
            COSTO = 0;
            UTILIDAD = 0;
            PORC = 0;
            SELECT BASE, IVA, CONSUMO, COSTO FROM rep_utilidad WHERE ID = :IDREP AND TIPO = 35 AND CODIGO = :articulo INTO :BASE, :IVA, :consumo,  :costo;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            EXECUTE PROCEDURE PORCENTAJE (utilidad,  TOTAL, 'S') returning_values (part);
            if ((CEROS = 'S') or (BASE <> 0) or (COSTO <> 0)) then
                SUSPEND;
            END /* FOR */
        END
    END
  ELSE
    BEGIN
    if (BIN_AND(TIPO, 1) <> 0) then
        BEGIN
        TIPODOC = 31;
        FOR SELECT F.PREF_PRE, FACT_NUMERO, FACT_FECHA, D.ARTI_COD, FADE_CANT * FADE_FACTOR, (FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO)*FACT_FACTOR, FADE_IVAMONTO*FACT_FACTOR, FADE_CONSUMO,
            ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD, F.FACT_ID, FADE_ITEM, TAIV_PORC
            FROM FACTURAS F, FACTURAS_DETALLE D, PREFIJOS P, ARTICULO A, TARIFA_IVA T
            WHERE F.FACT_ID = D.FACT_ID AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND D.ARTI_COD = A.arti_cod AND
                A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
                A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND FACT_FECHA >= :FECINI AND A.taiv_cod = T.taiv_cod AND
                (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
                FACT_FECHA <= :FECFIN AND FACT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) and substring(a.arti_cod from 1 FOR 2) <> '.t'
            ORDER BY D.ARTI_COD, FACT_FECHA, F.FACT_ID, FADE_ITEM
            INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,
                :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :ID, :ITEM, :ivapor
            DO
            BEGIN
            EXECUTE procedure nombres_grupos_inventario (CODGRUPO, CODSUBG, CODMARC)
                returning_values (NOMGRUPO, NOMSUBG, NOMMARC);
            if (EXISTS (SELECT COST_SALP / COST_SALC FROM COSTOS C, MOVIMIENTO_ARTICULO M
                WHERE C.arti_cod = M.arti_cod AND COST_IDMOV = MVAR_CONS AND MVAR_TIPODOC = 31 AND MVAR_IDREF = :ID AND COST_SALC <> 0 AND MVAR_ITEM = :ITEM)) then
                SELECT COST_SALP / COST_SALC, COST_ULTIMO FROM COSTOS C, MOVIMIENTO_ARTICULO M
                    WHERE C.arti_cod = M.arti_cod AND COST_IDMOV = MVAR_CONS AND MVAR_TIPODOC = 31 AND MVAR_IDREF = :ID AND COST_SALC <> 0 AND MVAR_ITEM = :ITEM INTO :costounit, :ultcos;
            else
                EXECUTE PROCEDURE costo_promedio_y_ultimo(:ARTICULO, :FECHA) returning_values (:costounit, :ultcos);
            if (ULTIMO = 'S') then
                COSTO = ultcos * cantidad;
            else
                COSTO = costounit * cantidad;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            SUSPEND;
            END
        END
    if (BIN_AND(TIPO, 2) <> 0) then
        BEGIN
        TIPODOC = 32;
        FOR SELECT R.PREF_PRE, REVT_NUMERO, REVT_FECHA, D.ARTI_COD, RVDE_CANT * RVDE_FACTOR, RVDE_TOTAL-RVDE_IVAMONTO-RVDE_CONSUMO, RVDE_IVAMONTO, RVDE_CONSUMO,
            ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD, R.REVT_ID, RVDE_ITEM, TAIV_PORC
            FROM REMISIONES_VENTA R, REMISIONES_VENTA_DETALLE D, PREFIJOS P, ARTICULO A, TARIFA_IVA T
            WHERE R.REVT_ID = D.REVT_ID AND P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = 32 AND D.ARTI_COD = A.arti_cod AND
                A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
                A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN AND
                (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
                REVT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) AND A.taiv_cod = T.taiv_cod
            ORDER BY D.ARTI_COD, REVT_FECHA, R.REVT_ID, RVDE_ITEM
            INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,
                :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :ID, :ITEM, :ivapor
            DO
            BEGIN
            EXECUTE procedure nombres_grupos_inventario (CODGRUPO, CODSUBG, CODMARC)
                returning_values (NOMGRUPO, NOMSUBG, NOMMARC);
            if (EXISTS (SELECT COST_SALP / COST_SALC FROM COSTOS C, MOVIMIENTO_ARTICULO M
                WHERE C.arti_cod = M.arti_cod AND COST_IDMOV = MVAR_CONS AND MVAR_TIPODOC = 32 AND MVAR_IDREF = :ID AND COST_SALC <> 0 AND MVAR_ITEM = :ITEM)) then
                SELECT COST_SALP / COST_SALC, COST_ULTIMO FROM COSTOS C, MOVIMIENTO_ARTICULO M
                    WHERE C.arti_cod = M.arti_cod AND COST_IDMOV = MVAR_CONS AND MVAR_TIPODOC = 32 AND MVAR_IDREF = :ID AND COST_SALC <> 0 AND MVAR_ITEM = :ITEM INTO :costounit, :ultcos;
            else
                EXECUTE PROCEDURE costo_promedio_y_ultimo(:ARTICULO, :FECHA) returning_values (:costounit, :ultcos);
            if (ULTIMO = 'S') then
                COSTO = ultcos * cantidad;
            else
                COSTO = costounit * cantidad;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            SUSPEND;
            END
        END
    if (BIN_AND(TIPO, 4) <> 0) then
        BEGIN
        TIPODOC = 33;
        FOR SELECT V.PREF_PRE, DEVT_NUMERO, DEVT_FECHA, D.ARTI_COD, DVDE_CANT * DVDE_FACTOR, (DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO)*DEVT_FACTOR, DVDE_IVAMONTO*DEVT_FACTOR, DVDE_CONSUMO,
            ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD, V.DEVT_ID, DVDE_ITEM, TAIV_PORC
            FROM DEVOLUCIONES_VENTAS V, DEVOLUCIONES_VENTAS_DETALLE D, PREFIJOS P, ARTICULO A, TARIFA_IVA T
            WHERE V.DEVT_ID = D.DEVT_ID AND P.PREF_PRE = V.PREF_PRE AND P.TIDO_COD = 33 AND D.ARTI_COD = A.arti_cod AND
                A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
                A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND
                (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
                DEVT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) AND A.taiv_cod = T.taiv_cod
            ORDER BY D.ARTI_COD, DEVT_FECHA, V.DEVT_ID, DVDE_ITEM
            INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,
                :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :ID, :ITEM, :ivapor
            DO
            BEGIN
            EXECUTE procedure nombres_grupos_inventario (CODGRUPO, CODSUBG, CODMARC)
                returning_values (NOMGRUPO, NOMSUBG, NOMMARC);
            CANTIDAD = CANTIDAD * -1;
            if (EXISTS (SELECT COST_ENTP / COST_ENTC FROM COSTOS C, MOVIMIENTO_ARTICULO M
                WHERE C.arti_cod = M.arti_cod AND COST_IDMOV = MVAR_CONS AND MVAR_TIPODOC = 33 AND MVAR_IDREF = :ID AND COST_ENTC <> 0 AND MVAR_ITEM = :ITEM)) then
                SELECT COST_ENTP / COST_ENTC, COST_ULTIMO FROM COSTOS C, MOVIMIENTO_ARTICULO M
                    WHERE C.arti_cod = M.arti_cod AND COST_IDMOV = MVAR_CONS AND MVAR_TIPODOC = 33 AND MVAR_IDREF = :ID AND COST_ENTC <> 0 AND MVAR_ITEM = :ITEM INTO :costounit, :ultcos;
            else
                EXECUTE PROCEDURE costo_promedio_y_ultimo(:ARTICULO, :FECHA) returning_values (:costounit, :ultcos);
            if (ULTIMO = 'S') then
                COSTO = ultcos * cantidad;
            else
                COSTO = costounit * cantidad;
            BASE = BASE * -1;
            IVA = IVA * -1;
            CONSUMO = CONSUMO * -1;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            SUSPEND;
            END
        END
    if (BIN_AND(TIPO, 8) <> 0) then
        BEGIN
        TIPODOC = 34;
        FOR SELECT P.PREF_PRE, PEDI_NUMERO, PEDI_FECHA, D.ARTI_COD, PEDE_CANT * PEDE_FACTOR, (PEDE_TOTAL-PEDE_IVAMONTO-PEDE_CONSUMO)*PEDI_FACTOR, PEDE_IVAMONTO*PEDI_FACTOR, PEDE_CONSUMO,
            ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD, TAIV_PORC 
            FROM PEDIDOS P, PEDIDOS_DETALLE D, PREFIJOS R, ARTICULO A, TARIFA_IVA T
            WHERE P.PEDI_ID = D.PEDI_ID AND P.PREF_PRE = R.PREF_PRE AND R.TIDO_COD = 34 AND D.ARTI_COD = A.arti_cod AND
                A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
                A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND
                (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
                PEDI_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) AND A.taiv_cod = T.taiv_cod
            ORDER BY D.ARTI_COD, PEDI_FECHA, P.PEDI_ID, PEDE_ITEM
            INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,
                :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :ivapor
            DO
            BEGIN
            EXECUTE procedure nombres_grupos_inventario (CODGRUPO, CODSUBG, CODMARC)
                returning_values (NOMGRUPO, NOMSUBG, NOMMARC);
            EXECUTE PROCEDURE costo_promedio_y_ultimo(:ARTICULO, :FECHA) returning_values (:costounit, :ultcos);
            if (ULTIMO = 'S') then
                COSTO = ultcos * cantidad;
            else
                COSTO = costounit * cantidad;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            SUSPEND;
            END
        END
    if (BIN_AND(TIPO, 16) <> 0) then
        BEGIN
        TIPODOC = 35;
        FOR SELECT C.PREF_PRE, COTI_NUMERO, COTI_FECHA, D.ARTI_COD, CTDE_CANT * CTDE_FACTOR, (CTDE_TOTAL-CTDE_IVAMONTO-CTDE_CONSUMO)*COTI_FACTOR, CTDE_IVAMONTO*COTI_FACTOR, CTDE_CONSUMO,
            ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD, TAIV_PORC
            FROM COTIZACIONES C, COTIZACIONES_DETALLE D, PREFIJOS P, ARTICULO A, TARIFA_IVA T
            WHERE C.COTI_ID = D.COTI_ID AND P.PREF_PRE = C.PREF_PRE AND P.TIDO_COD = 35 AND D.ARTI_COD = A.arti_cod AND
                A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
                A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND COTI_FECHA >= :FECINI AND COTI_FECHA <= :FECFIN AND
                (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
                COTI_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) AND A.taiv_cod = T.taiv_cod
            ORDER BY D.ARTI_COD, COTI_FECHA, C.COTI_ID, CTDE_ITEM
            INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,
                :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :ivapor
            DO
            BEGIN
            EXECUTE procedure nombres_grupos_inventario (CODGRUPO, CODSUBG, CODMARC)
                returning_values (NOMGRUPO, NOMSUBG, NOMMARC);
            EXECUTE PROCEDURE costo_promedio_y_ultimo(:ARTICULO, :FECHA) returning_values (:costounit, :ultcos);
            if (ULTIMO = 'S') then
                COSTO = ultcos * cantidad;
            else
                COSTO = costounit * cantidad;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            SUSPEND;
            END
        END
    END
END
^

SET TERM ; ^


/* 20100511b */
/* INCLUIA TODOS LOS TERCEROS Y NO SOLO LOS CLIENTES */

SET TERM ^ ;

CREATE OR ALTER procedure REPORTE_PUNTOS (
    NITINI varchar(20),
    NITFIN varchar(20),
    FECHA date,
    CEROS char(1))
returns (
    NIT varchar(60),
    NOMBRE varchar(60),
    DIRECCION varchar(60),
    TELEFONO varchar(40),
    PTACUM integer,
    PTVENCER integer)
AS
declare variable numrows integer;
declare variable anos integer;
declare variable fecaux date;
begin
FOR SELECT TERC_NIT, TERC_NOM, TERC_DIR, TERC_TEL
    FROM TERCEROS WHERE terc_clie = 'S' and TERC_NIT >= :NITINI AND TERC_NIT <= :NITFIN
    INTO :NIT, :NOMBRE, :DIRECCION, :TELEFONO
    DO
    BEGIN
    /* los puntos totales */
    numrows = 0;
    select max(ptcl_fecha) from puntos_cliente where ptcl_nit = :NIT and ptcl_fecha <= :fecha into :fecaux;
    if (fecaux is not null) then
        begin
        select ptcl_saldo + ptcl_db - ptcl_cr from puntos_cliente where ptcl_nit = :NIT and ptcl_fecha = :fecaux into :ptacum;
        end
    else
        ptacum = 0;
    /* reste los vencidos */
    execute procedure lee_configuracion('FACTURACION', 'FACTURAS', 'VENCIMIENTO DE PUNTOS POR CLIENTE EN AÑOS') returning_values (:anos);
    fecaux = fecha - (anos * 365);
    select max(ptcl_fecha) from puntos_cliente where ptcl_nit = :nit and ptcl_fecha <= :fecaux into :fecaux;
    if (fecaux is not null) then
        begin
        select ptcl_saldo + ptcl_db - ptcl_cr from puntos_cliente where ptcl_nit = :nit and ptcl_fecha = :fecaux into :ptvencer;
        end
    else
        ptvencer = 0;
    if ((CEROS = 'S') or (PTACUM <> 0)) then
        suspend;
    END
end
^

SET TERM ; ^

/* 20100512 */
/* VALIDE EL LOTE AL HACER DEVOLUCIONES EN COMPRAS */

SET TERM ^ ;

CREATE OR ALTER TRIGGER DEVOLUCIONES_COMPRAS_DET_AI FOR DEVOLUCIONES_COMPRAS_DET
ACTIVE AFTER INSERT POSITION 0
AS
declare variable fec date;
declare variable CONC VARCHAR(60);
declare variable factor numeric(18,4);
declare variable Pref varchar(4);
declare variable Num varchar(6);
declare variable Nit varchar(20);
declare variable ID INTEGER;
declare variable DEVUELTO NUMERIC(18,4);
declare variable CANT NUMERIC(18, 4);
declare variable CANTAUX NUMERIC(18, 4);
declare variable FACT VARCHAR(10);
declare variable SINFACT VARCHAR(2);
declare variable LOTE VARCHAR(20);
declare variable EXIST CHAR(1);
BEGIN
  if ((NEW.dvco_id <> 0) and (new.dvcd_anulado = 'N')) then
    BEGIN
    select dvco_fecha, pref_pre, dvco_numero, terc_nit, dvco_factura from devoluciones_compras where dvco_id = new.dvco_id into :fec, :Pref, :Num, :Nit, Fact;
    execute procedure factor_unidad_cant(new.arti_cod, new.dvcd_unidad) returning_values(factor);
    CONC = 'DEVOLUCION COMPRA No.' || PREF || NUM || ' - FACTURA ' || FACT;
    execute procedure LEE_CONFIGURACION ('COMPRAS','DEVOLUCIONES','PERMITIR DEVOLVER ARTICULOS NO FACTURADOS') returning_values (:SINFACT);
    /* ACTUALICE LO DEVUELTO EN LA FACTURA */
    SELECT DVCO_FACTID FROM DEVOLUCIONES_COMPRAS
      WHERE DVCO_ID = NEW.DVCO_ID INTO :ID;
    if ((ID <> 0) or (SINFACT = 'SI')) then
        BEGIN
        INSERT INTO MOVIMIENTO_ARTICULO
            (ARTI_COD, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF,
            MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM, TERC_NIT)
            VALUES(NEW.ARTI_COD, NEW.BODE_COD, :FEC, 24, NEW.dvco_id,
            :CONC, :factor * new.dvcd_cant, 0, 'N', new.dvcd_lote, :Pref, :Num, NEW.dvcd_item, :Nit);
        if (ID <> 0) THEN
            BEGIN
            CANTAUX = NEW.dvcd_cant * NEW.dvcd_factor;
            FOR SELECT FCDE_CANT, FCDE_FACTOR, FCDE_DEVUELTO, FCDE_LOTE
              FROM facturas_compras_detalle
              WHERE FACO_ID = :ID AND ARTI_COD = NEW.ARTI_COD AND BODE_COD = NEW.bode_cod
              INTO :CANT, :FACTOR, :DEVUELTO, :LOTE
              DO
                BEGIN
                select ARTI_EXIST from ARTICULO where ARTI_COD = new.ARTI_COD into :EXIST;
                if ((EXIST <> 'L') or (new.DVCD_LOTE = :LOTE)) then
                  if ((CANT * FACTOR - DEVUELTO) < CANTAUX) then
                    BEGIN
                    UPDATE FACTURAS_COMPRAS_DETALLE
                        SET FCDE_DEVUELTO = (:CANT * :FACTOR - :DEVUELTO)
                        WHERE FACO_ID = :ID AND ARTI_COD = NEW.ARTI_COD AND BODE_COD = NEW.bode_cod;
                    CANTAUX = CANTAUX - (CANT * FACTOR - DEVUELTO);
                    END
                  ELSE
                    BEGIN
                    UPDATE FACTURAS_COMPRAS_DETALLE
                        SET FCDE_DEVUELTO = FCDE_DEVUELTO + :CANTAUX
                        WHERE FACO_ID = :ID AND ARTI_COD = NEW.ARTI_COD AND BODE_COD = NEW.bode_cod;
                    CANTAUX = 0;
                    END
                END
            
            if (CANTAUX > 0) then
                EXCEPTION DEVOLUCION_MAYOR 'Esta devolviendo una cantidad mayor a la facturada del articulo ' || new.arti_cod;
            END
        END
    END
END
^

SET TERM ; ^


SET TERM ^ ;

CREATE OR ALTER TRIGGER DEVOLUCIONES_COMPRAS_DET_AU FOR DEVOLUCIONES_COMPRAS_DET
ACTIVE AFTER UPDATE POSITION 0
AS
declare variable fec date;
declare variable CONC VARCHAR(60);
declare variable Pref varchar(4);
declare variable Num varchar(6);
declare variable Nit varchar(20);
declare variable CANT NUMERIC(18, 4);
declare variable CANTAUX NUMERIC(18,4);
declare variable factor numeric(18,4);
declare variable DEVUELTO NUMERIC(18,4);
declare variable ID integer;
declare variable FACT VARCHAR(10);
declare variable SINFACT VARCHAR(2);
declare variable LOTE VARCHAR(20);
declare variable EXIST CHAR(1);
BEGIN
/* Anule el anterior */
if ((OLD.DVCO_ID <> 0) AND (OLD.dvcd_anulado = 'N')) then
    BEGIN
    DELETE FROM MOVIMIENTO_ARTICULO WHERE (mvar_tipodoc = 24) and (mvar_idref = new.dvco_id) and (mvar_item = old.dvcd_item);
    /* DESHAGA LO DEVUELTO EN LA FACTURA */
    SELECT DVCO_FACTID FROM DEVOLUCIONES_COMPRAS
        WHERE DVCO_ID = OLD.DVCO_ID INTO :ID;
    if (ID <> 0) then
        BEGIN
        CANTAUX = OLD.dvcd_cant * OLD.dvcd_factor;
        FOR SELECT FCDE_CANT, FCDE_FACTOR, FCDE_DEVUELTO, FCDE_LOTE
            FROM FACTURAS_COMPRAS_DETALLE
            WHERE FACO_ID = :ID AND ARTI_COD = OLD.ARTI_COD AND BODE_COD = OLD.bode_cod
            INTO :CANT, :FACTOR, :DEVUELTO, :LOTE
            DO
            BEGIN
            select ARTI_EXIST from ARTICULO where ARTI_COD = old.ARTI_COD into :EXIST;
            if ((EXIST <> 'L') or (OLD.DVCD_LOTE = :LOTE)) then
              if (CANTAUX > (CANT * FACTOR - DEVUELTO)) then
                BEGIN
                UPDATE FACTURAS_COMPRAS_DETALLE
                    SET FCDE_DEVUELTO = 0
                    WHERE FACO_ID = :ID AND ARTI_COD = OLD.ARTI_COD AND BODE_COD = OLD.bode_cod;
                CANTAUX = CANTAUX - (CANT * FACTOR - DEVUELTO);
                END
              ELSE
                BEGIN
                UPDATE FACTURAS_COMPRAS_DETALLE
                    SET FCDE_DEVUELTO = FCDE_DEVUELTO - :CANTAUX
                    WHERE FACO_ID = :ID AND ARTI_COD = OLD.ARTI_COD AND BODE_COD = OLD.bode_cod;
                CANTAUX = 0;
                END
            END
        END
    END
if ((NEW.DVCO_ID <> 0) AND (NEW.dvcd_anulado = 'N')) then
    BEGIN
    /* Registre el nuevo */
    select dvco_fecha, pref_pre, dvco_numero, terc_nit, dvco_factura from devoluciones_compras where dvco_id = new.dvco_id into :fec, :Pref, :Num, :Nit, Fact;
    execute procedure factor_unidad_cant(new.arti_cod, new.dvcd_unidad) returning_values(factor);
    CONC = 'DEVOLUCION COMPRA No.' || PREF || NUM || ' - FACTURA ' || FACT;
    execute procedure LEE_CONFIGURACION ('COMPRAS','DEVOLUCIONES','PERMITIR DEVOLVER ARTICULOS NO FACTURADOS') returning_values (:SINFACT);
    /* ACTUALICE LO DEVUELTO EN LA FACTURA */
    SELECT DVCO_FACTID FROM DEVOLUCIONES_COMPRAS
        WHERE DVCO_ID = NEW.DVCO_ID INTO :ID;
    if ((ID <> 0) or (SINFACT = 'SI')) then
        BEGIN
        INSERT INTO MOVIMIENTO_ARTICULO
            (ARTI_COD, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM, TERC_NIT)
            VALUES(NEW.ARTI_COD, NEW.BODE_COD, :FEC, 24, NEW.dvco_id,
            :CONC, :factor * new.dvcd_cant, 0, 'N', new.dvcd_lote, :Pref, :Num, NEW.dvcd_item, :Nit);
        if (ID <> 0) THEN
            BEGIN
            CANTAUX = NEW.dvcd_cant * NEW.dvcd_factor;
            FOR SELECT FCDE_CANT, FCDE_FACTOR, FCDE_DEVUELTO, FCDE_LOTE
                FROM FACTURAS_COMPRAS_DETALLE
                WHERE FACO_ID = :ID AND ARTI_COD = NEW.ARTI_COD AND BODE_COD = NEW.bode_cod
                INTO :CANT, :FACTOR, :DEVUELTO, :LOTE
                DO
                BEGIN
                select ARTI_EXIST from ARTICULO where ARTI_COD = new.ARTI_COD into :EXIST;
                if ((EXIST <> 'L') or (new.DVCD_LOTE = :LOTE)) then
                  if ((CANT * FACTOR - DEVUELTO) < CANTAUX) then
                    BEGIN
                    UPDATE FACTURAS_COMPRAS_DETALLE
                        SET FCDE_DEVUELTO = (:CANT * :FACTOR - :DEVUELTO)
                        WHERE FACO_ID = :ID AND ARTI_COD = NEW.ARTI_COD AND BODE_COD = NEW.bode_cod;
                    CANTAUX = CANTAUX - (CANT * FACTOR - DEVUELTO);
                    END
                  ELSE
                    BEGIN
                    UPDATE FACTURAS_COMPRAS_DETALLE
                        SET FCDE_DEVUELTO = FCDE_DEVUELTO + :CANTAUX
                        WHERE FACO_ID = :ID AND ARTI_COD = NEW.ARTI_COD AND BODE_COD = NEW.bode_cod;
                    CANTAUX = 0;
                    END
                END
            
            if (CANTAUX > 0) then
                EXCEPTION DEVOLUCION_MAYOR 'Esta devolviendo una cantidad mayor a la facturada del articulo ' || new.arti_cod;
            END
        END
    end
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER DEVOLUCIONES_COMPRAS_DET_AD FOR DEVOLUCIONES_COMPRAS_DET
ACTIVE AFTER DELETE POSITION 0
AS
declare variable ID INTEGER;
declare variable CANTAUX NUMERIC(18, 4);
declare variable CANT NUMERIC(18, 4);
declare variable FACTOR NUMERIC(18, 4);
declare variable DEVUELTO NUMERIC(18, 4);
declare variable LOTE VARCHAR(20);
declare variable EXIST CHAR(1);
begin
if ((OLD.dvco_id <> 0) AND (OLD.dvcd_anulado = 'N')) then
    BEGIN
    delete from movimiento_articulo
      where (mvar_tipodoc = 24) and (mvar_idref = old.dvco_id) and (mvar_item = old.dvcd_item);
  
    /* DESHAGA LO DEVUELTO EN LA FACTURA */
    SELECT DVCO_FACTID FROM DEVOLUCIONES_COMPRAS
        WHERE DVCO_ID = OLD.DVCO_ID INTO :ID;
    if (ID <> 0) then
        BEGIN
        CANTAUX = OLD.dvcd_cant * OLD.dvcd_factor;
        FOR SELECT FCDE_CANT, FCDE_FACTOR, FCDE_DEVUELTO, FCDE_LOTE
            FROM FACTURAS_COMPRAS_DETALLE
            WHERE FACO_ID = :ID AND ARTI_COD = OLD.ARTI_COD AND BODE_COD = OLD.bode_cod
            INTO :CANT, :FACTOR, :DEVUELTO, :LOTE
            DO
                BEGIN
                select ARTI_EXIST from ARTICULO where ARTI_COD = old.ARTI_COD into :EXIST;
                if ((EXIST <> 'L') or (old.DVCD_LOTE = :LOTE)) then
                  if (CANTAUX > (CANT * FACTOR - DEVUELTO)) then
                    BEGIN
                    UPDATE FACTURAS_COMPRAS_DETALLE
                        SET FCDE_DEVUELTO = 0
                        WHERE FACO_ID = :ID AND ARTI_COD = OLD.ARTI_COD AND BODE_COD = OLD.bode_cod;
                    CANTAUX = CANTAUX - (CANT * FACTOR - DEVUELTO);
                    END
                  ELSE
                    BEGIN
                    UPDATE FACTURAS_COMPRAS_DETALLE
                        SET FCDE_DEVUELTO = FCDE_DEVUELTO - :CANTAUX
                        WHERE FACO_ID = :ID AND ARTI_COD = OLD.ARTI_COD AND BODE_COD = OLD.bode_cod;
                    CANTAUX = 0;
                    END
                END
        END
    END
END
^

SET TERM ; ^


/* 20100512b */
/* CONFIGURAR SI PREMITIR OTROS INGRESOS DE CLIENTES */

INSERT INTO CONFIGURACION (CONF_MODULO, CONF_CATEGORIA, CONF_PROPIEDAD, CONF_VALOR, CONF_POSIBLES, CONF_AYUDA) VALUES ('CAJA', 'RECIBOS', 'PERMITIR REGISTRAR RECIBOS POR OTROS CONCEPTOS A CLIENTES', 'SI', 'SI,NO', 'SI:Permite cancelar el detalle del recibo y hacer un ingreso de un cliente por otros conceptos diferentes a cartera. NO: Obligatoriamente se requiere abonar un documento o anticipo para hacer un recibo de un cliente');
commit work;

/* 20100512C */
/* NUMERO DE CONTROL DE PLANILLA DE PAGO DEL PROVEEDOR */
ALTER TABLE NOTAS_DEBITO_PROVEEDOR
ADD NDPR_NUMCTR VARCHAR(30);

SET TERM ^ ;

CREATE OR ALTER procedure IMPR_NOTADBPR (
    ID integer)
returns (
    PREFIJO varchar(4),
    NUMERO varchar(6),
    NUMPROV varchar(8),
    FECHA date,
    CONCEPTO varchar(60),
    NIT varchar(20),
    NOMBRE varchar(60),
    DIR varchar(60),
    CIU varchar(40),
    TEL varchar(40),
    CONTACTO varchar(60),
    FAX varchar(25),
    CEL varchar(25),
    EMAIL varchar(100),
    VENCE date,
    NROCTR VARCHAR(30),
    MONTO numeric(18,2),
    IVAPORC numeric(9,2),
    IVAMONTO numeric(18,2),
    TOTAL numeric(18,2),
    TOTALPAGAR numeric(18,2),
    RTFTEPORC numeric(9,2),
    RTFTEMONTO numeric(18,2),
    RTIVAPORC numeric(9,2),
    RTIVAMONTO numeric(18,2),
    RTICAPORC numeric(9,2),
    RTICAMONTO numeric(18,2),
    DTOFECHA date,
    DTOPORC numeric(9,2),
    DTOMONTO numeric(18,2),
    OBS blob sub_type 1 segment size 80,
    PROV_COD varchar(15),
    PROV_CARTERA varchar(60),
    PROV_CODIGOINT varchar(15))
AS
BEGIN
  SELECT PREF_PRE, NDPR_NUMERO, NDPR_FECHA, NDPR_CONC, N.TERC_NIT, TERC_NOM, TERC_DIR, TERC_CIU, TERC_TEL, TERC_CONTACTO, TERC_FAX, TERC_CEL, TERC_EMAIL, NDPR_VENCE, NDPR_MONTO,
    NDPR_IVAPORC, NDPR_IVAMONTO, NDPR_RTFTEPORC, NDPR_RTFTEMONTO, NDPR_RTIVAPORC, NDPR_RTIVAMONTO, NDPR_RTICAPORC, NDPR_RTICAMONTO, NDPR_DTOFECHA, NDPR_DTOFPORC, NDPR_DTOFMONTO, NDPR_OBS, PROV_COD, PROV_CARTERA, PROV_CODIGOINT, NDPR_NUMPROV, NDPR_NUMCTR
    FROM NOTAS_DEBITO_PROVEEDOR N, TERCEROS T, PROVEEDORES P WHERE N.TERC_NIT = T.TERC_NIT AND T.TERC_NIT = P.TERC_NIT AND NDPR_ID = :ID
    INTO :PREFIJO, :NUMERO, :FECHA, :CONCEPTO, :NIT, :NOMBRE, :DIR, :CIU, :TEL, :CONTACTO, :FAX, :CEL, :EMAIL, :VENCE, :MONTO,
    :IVAPORC, :IVAMONTO, :RTFTEPORC, :RTFTEMONTO, :RTIVAPORC, :RTIVAMONTO, :RTICAPORC, :RTICAMONTO, :DTOFECHA, :DTOPORC, :DTOMONTO, :OBS, :PROV_COD, :PROV_CARTERA, :PROV_CODIGOINT, :NUMPROV, :nroctr;
  TOTAL = MONTO + IVAMONTO;
  TOTALPAGAR = TOTAL - RTFTEMONTO - RTIVAMONTO - RTICAMONTO;
  SUSPEND;
END
^

SET TERM ; ^

/* 20100512D */
SET TERM ^ ;

CREATE OR ALTER procedure UTILIDAD_VENTAS (
    TIPO integer,
    DETALLE char(1),
    FECINI date,
    FECFIN date,
    PREFIJO varchar(4),
    ULTIMO char(1),
    SUBEMPRESA integer)
returns (
    PREF varchar(4),
    NUMERO varchar(6),
    FECHA date,
    PTVTID integer,
    VENDCOD integer,
    NIT varchar(20),
    NOMTERCERO varchar(60),
    ARTICULO varchar(15),
    ARTIDES varchar(60),
    CANT numeric(18,4),
    UNIDAD varchar(8),
    PRECIO numeric(18,2),
    IVAPOR NUMERIC(9,2),
    COSTO numeric(18,2),
    UTILIDAD numeric(18,2),
    PORC numeric(9,2))
AS
declare variable IMPTOS CHAR(1);
declare variable ID INTEGER;
declare variable COSTOT NUMERIC(18,2);
declare variable ULTCOS NUMERIC(18,2);
declare variable PRECIOT NUMERIC(18,2);
declare variable UOM VARCHAR(20);
declare variable icoinc char(2);
declare variable consumo NUMERIC(18,2);
declare variable factor NUMERIC(18,4);
declare variable ITEM INTEGER;
BEGIN
EXECUTE PROCEDURE lee_configuracion ('FACTURACION', 'ARTICULOS', 'SUGERIR PRECIOS CON PORCENTAJE DE MARGEN O UTILIDAD') returning_values (:UOM);
EXECUTE PROCEDURE lee_configuracion ('FACTURACION', 'ARTICULOS', 'IMPOCONSUMO INCLUIDO EN EL PRECIO BASE DE VENTA ANTES DE IVA') returning_values (:icoinc);
/* DETERMINE LA TABLA A EXAMINAR */
if (TIPO = 31) then
    BEGIN
    /* FACTURA */
    FOR SELECT FACT_ID, F.PREF_PRE, FACT_NUMERO, FACT_FECHA, PTVT_ID, VEND_COD, TERC_NIT, FACT_NOMCLIENTE, FACT_IVAINC, fact_factor
        FROM FACTURAS F, PREFIJOS P
        WHERE FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND FACT_ANULADO = 'N'
         AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = :TIPO AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
        ORDER BY FACT_FECHA, F.PREF_PRE, FACT_NUMERO
        INTO :ID, :PREF, :NUMERO, :FECHA, :PTVTID, :VENDCOD, :NIT, :NOMTERCERO, :IMPTOS, :factor
        DO
        if ((PREFIJO = '') or (PREFIJO = PREF)) then
          BEGIN
          COSTOT = 0;
          PRECIOT = 0;
          FOR SELECT FADE_ITEM, D.ARTI_COD, SUBSTR(FADE_DESC,1,60), FADE_CANT * FADE_FACTOR, FADE_UNIDAD, (FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO)*:FACTOR, FADE_IVAPORC, fade_consumo
            FROM FACTURAS_DETALLE D
            WHERE FACT_ID = :ID and substring(D.arti_cod from 1 FOR 2) <> '.t'
            INTO :ITEM, :ARTICULO, :ARTIDES, :CANT, :UNIDAD, :PRECIO, :ivapor, :consumo
            DO
                BEGIN
                if (EXISTS (SELECT COST_SALP / COST_SALC FROM COSTOS C, MOVIMIENTO_ARTICULO M
                    WHERE C.arti_cod = M.arti_cod AND COST_IDMOV = MVAR_CONS AND MVAR_TIPODOC = 31 AND MVAR_IDREF = :ID AND COST_SALC <> 0 AND MVAR_ITEM = :ITEM)) then
                    SELECT COST_SALP / COST_SALC, COST_ULTIMO FROM COSTOS C, MOVIMIENTO_ARTICULO M
                        WHERE C.arti_cod = M.arti_cod AND COST_IDMOV = MVAR_CONS AND MVAR_TIPODOC = 31 AND MVAR_IDREF = :ID AND COST_SALC <> 0 AND MVAR_ITEM = :ITEM INTO :costo, :ultcos;
                else
                    EXECUTE PROCEDURE costo_promedio_y_ultimo(:ARTICULO, :FECHA) returning_values (:COSTO, :ultcos);
                if (ULTIMO = 'S') then
                    COSTO = ultcos * CANT;
                else
                    COSTO = COSTO * CANT;
                if (DETALLE = 'S') then
                    BEGIN
                    UTILIDAD = PRECIO - COSTO;
                    if (UOM = 'UTILIDAD') then
                        EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                    else
                        EXECUTE PROCEDURE PORCENTAJE (utilidad,  PRECIO, 'S') returning_values (PORC);
                    SUSPEND;
                    END
                ELSE
                    BEGIN
                    COSTOT = COSTOT + COSTO;
                    PRECIOT = PRECIOT + PRECIO;
                    END
                END
          if (DETALLE <> 'S') then
            BEGIN
            COSTO = COSTOT;
            PRECIO = PRECIOT;
            UTILIDAD = PRECIO - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  PRECIO, 'S') returning_values (PORC);
            SUSPEND;
            END
          END
    END
  if (TIPO = 32) then
    BEGIN
    /* REMISION */
    FOR SELECT REVT_ID, R.PREF_PRE, REVT_NUMERO, REVT_FECHA, PTVT_ID, VEND_COD, TERC_NIT, REVT_NOMTERC, REVT_IVAINC
        FROM REMISIONES_VENTA R, PREFIJOS P
        WHERE REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN AND REVT_ANULADO = 'N'
         AND P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = :TIPO AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
        ORDER BY REVT_FECHA, R.PREF_PRE, REVT_NUMERO
        INTO :ID, :PREF, :NUMERO, :FECHA, :PTVTID, :VENDCOD, :NIT, :NOMTERCERO, :IMPTOS
        DO
        if ((PREFIJO = '') or (PREFIJO = PREF)) then
          BEGIN
          COSTOT = 0;
          PRECIOT = 0;
          FOR SELECT RVDE_ITEM, D.ARTI_COD, SUBSTR(RVDE_DESC,1,60), RVDE_CANT * RVDE_FACTOR, RVDE_UNIDAD, (RVDE_TOTAL-RVDE_IVAMONTO-RVDE_CONSUMO), RVDE_IVAPORC, rvde_consumo
            FROM REMISIONES_VENTA_DETALLE D
            WHERE REVT_ID = :ID and substring(D.arti_cod from 1 FOR 2) <> '.t'
            INTO :ITEM, :ARTICULO, :ARTIDES, :CANT, :UNIDAD, :PRECIO, :ivapor, :consumo
            DO
                BEGIN
                if (EXISTS (SELECT COST_SALP / COST_SALC FROM COSTOS C, MOVIMIENTO_ARTICULO M
                    WHERE C.arti_cod = M.arti_cod AND COST_IDMOV = MVAR_CONS AND MVAR_TIPODOC = 32 AND MVAR_IDREF = :ID AND COST_SALC <> 0 AND MVAR_ITEM = :ITEM)) then
                    SELECT COST_SALP / COST_SALC, COST_ULTIMO FROM COSTOS C, MOVIMIENTO_ARTICULO M
                        WHERE C.arti_cod = M.arti_cod AND COST_IDMOV = MVAR_CONS AND MVAR_TIPODOC = 32 AND MVAR_IDREF = :ID AND COST_SALC <> 0 AND MVAR_ITEM = :ITEM INTO :costo, :ultcos;
                else
                    EXECUTE PROCEDURE costo_promedio_y_ultimo(:ARTICULO, :FECHA) returning_values (:COSTO, :ultcos);
                if (ULTIMO = 'S') then
                    COSTO = ultcos * CANT;
                else
                    COSTO = COSTO * CANT;
                if (DETALLE = 'S') then
                    BEGIN
                    UTILIDAD = PRECIO - COSTO;
                    if (UOM = 'UTILIDAD') then
                        EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                    else
                        EXECUTE PROCEDURE PORCENTAJE (utilidad,  PRECIO, 'S') returning_values (PORC);
                    SUSPEND;
                    END
                ELSE
                    BEGIN
                    COSTOT = COSTOT + COSTO;
                    PRECIOT = PRECIOT + PRECIO;
                    END
                END
          if (DETALLE <> 'S') then
            BEGIN
            COSTO = COSTOT;
            PRECIO = PRECIOT;
            UTILIDAD = PRECIO - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  PRECIO, 'S') returning_values (PORC);
            SUSPEND;
            END
          END
    END
  if (TIPO = 33) then
    BEGIN
    /* DEVOLUCION */
    FOR SELECT DEVT_ID, D.PREF_PRE, DEVT_NUMERO, DEVT_FECHA, PTVT_ID, VEND_COD, TERC_NIT, DEVT_NOMTERC, DEVT_IVAINC, DEVT_FACTOR
        FROM DEVOLUCIONES_VENTAS D, PREFIJOS P
        WHERE DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND DEVT_ANULADO = 'N'
         AND P.PREF_PRE = D.PREF_PRE AND P.TIDO_COD = :TIPO AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
        ORDER BY DEVT_FECHA, D.PREF_PRE, DEVT_NUMERO
        INTO :ID, :PREF, :NUMERO, :FECHA, :PTVTID, :VENDCOD, :NIT, :NOMTERCERO, :IMPTOS, :FACTOR
        DO
        if ((PREFIJO = '') or (PREFIJO = PREF)) then
          BEGIN
          COSTOT = 0;
          PRECIOT = 0;
          FOR SELECT DVDE_ITEM, D.ARTI_COD, SUBSTR(DVDE_DESC,1,60), DVDE_CANT * DVDE_FACTOR, DVDE_UNIDAD, (DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO)*:FACTOR, DVDE_IVAPORC, dvde_consumo
            FROM DEVOLUCIONES_VENTAS_DETALLE D
            WHERE DEVT_ID = :ID and substring(D.arti_cod from 1 FOR 2) <> '.t'
            INTO :ITEM, :ARTICULO, :ARTIDES, :CANT, :UNIDAD, :PRECIO, :ivapor, :consumo
            DO
                BEGIN
                if (EXISTS (SELECT COST_ENTP / COST_ENTC FROM COSTOS C, MOVIMIENTO_ARTICULO M
                    WHERE C.arti_cod = M.arti_cod AND COST_IDMOV = MVAR_CONS AND MVAR_TIPODOC = 33 AND MVAR_IDREF = :ID AND COST_ENTC <> 0 AND MVAR_ITEM = :ITEM)) then
                    SELECT COST_ENTP / COST_ENTC FROM COSTOS C, MOVIMIENTO_ARTICULO M
                        WHERE C.arti_cod = M.arti_cod AND COST_IDMOV = MVAR_CONS AND MVAR_TIPODOC = 33 AND MVAR_IDREF = :ID AND COST_ENTC <> 0 AND MVAR_ITEM = :ITEM INTO :costo;
                else
                    EXECUTE PROCEDURE costo_promedio_y_ultimo(:ARTICULO, :FECHA) returning_values (:COSTO, :ultcos);
                if (ULTIMO = 'S') then
                    COSTO = ultcos * CANT;
                else
                    COSTO = COSTO * CANT;
                if (DETALLE = 'S') then
                    BEGIN
                    UTILIDAD = PRECIO - COSTO;
                    if (UOM = 'UTILIDAD') then
                        EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                    else
                        EXECUTE PROCEDURE PORCENTAJE (utilidad,  PRECIO, 'S') returning_values (PORC);
                    SUSPEND;
                    END
                ELSE
                    BEGIN
                    COSTOT = COSTOT + COSTO;
                    PRECIOT = PRECIOT + PRECIO;
                    END
                END
        if (DETALLE <> 'S') then
            BEGIN
            COSTO = COSTOT;
            PRECIO = PRECIOT;
            UTILIDAD = PRECIO - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  PRECIO, 'S') returning_values (PORC);
            SUSPEND;
            END
        END
    END
  if (TIPO = 34) then
    BEGIN
    /* PEDIDO */
    FOR SELECT PEDI_ID, P.PREF_PRE, PEDI_NUMERO, PEDI_FECHA, PTVT_ID, VEND_COD, TERC_NIT, PEDI_NOMTERC, PEDI_IVAINC, PEDI_FACTOR
        FROM PEDIDOS P, PREFIJOS R
        WHERE PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND PEDI_ANULADO = 'N'
         AND P.PREF_PRE = R.PREF_PRE AND R.TIDO_COD = :TIPO AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
        ORDER BY PEDI_FECHA, P.PREF_PRE, PEDI_NUMERO
        INTO :ID, :PREF, :NUMERO, :FECHA, :PTVTID, :VENDCOD, :NIT, :NOMTERCERO, :IMPTOS, :FACTOR
        DO
        if ((PREFIJO = '') or (PREFIJO = PREF)) then
          BEGIN
          COSTOT = 0;
          PRECIOT = 0;
          FOR SELECT ARTI_COD, SUBSTR(PEDE_DESC,1,60), PEDE_CANT * PEDE_FACTOR, PEDE_UNIDAD, (PEDE_TOTAL-PEDE_IVAMONTO-PEDE_CONSUMO)*:FACTOR, PEDE_IVAPORC, pede_consumo
            FROM PEDIDOS_DETALLE
            WHERE PEDI_ID = :ID
            INTO :ARTICULO, :ARTIDES, :CANT, :UNIDAD, :PRECIO, :ivapor, :consumo
            DO
                BEGIN
                EXECUTE PROCEDURE costo_promedio_y_ultimo(:ARTICULO, :FECHA) returning_values (:COSTO, :ultcos);
                if (ULTIMO = 'S') then
                    COSTO = ultcos * CANT;
                else
                    COSTO = COSTO * CANT;
                if (DETALLE = 'S') then
                    BEGIN
                    UTILIDAD = PRECIO - COSTO;
                    if (UOM = 'UTILIDAD') then
                        EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                    else
                        EXECUTE PROCEDURE PORCENTAJE (utilidad,  PRECIO, 'S') returning_values (PORC);
                    SUSPEND;
                    END
                ELSE
                    BEGIN
                    COSTOT = COSTOT + COSTO;
                    PRECIOT = PRECIOT + PRECIO;
                    END
                END
        if (DETALLE <> 'S') then
            BEGIN
            COSTO = COSTOT;
            PRECIO = PRECIOT;
            UTILIDAD = PRECIO - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  PRECIO, 'S') returning_values (PORC);
            SUSPEND;
            END
        END
    END
  if (TIPO = 35) then
    BEGIN
    /* COTIZACION */
    FOR SELECT COTI_ID, C.PREF_PRE, COTI_NUMERO, COTI_FECHA, PTVT_ID, VEND_COD, TERC_NIT, COTI_NOMTERC, COTI_IMPTOS, COTI_FACTOR
        FROM COTIZACIONES C, PREFIJOS P
        WHERE COTI_FECHA >= :FECINI AND COTI_FECHA <= :FECFIN AND COTI_ANULADO = 'N'
         AND P.PREF_PRE = C.PREF_PRE AND P.TIDO_COD = :TIPO AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
        ORDER BY COTI_FECHA, C.PREF_PRE, COTI_NUMERO
        INTO :ID, :PREF, :NUMERO, :FECHA, :PTVTID, :VENDCOD, :NIT, :NOMTERCERO, :IMPTOS, :FACTOR
        DO
        if ((PREFIJO = '') or (PREFIJO = PREF)) then
          BEGIN
          COSTOT = 0;
          PRECIOT = 0;
          FOR SELECT ARTI_COD, SUBSTR(CTDE_DESC,1,60), CTDE_CANT * CTDE_FACTOR, CTDE_UNIDAD, (CTDE_TOTAL-CTDE_IVAMONTO-CTDE_CONSUMO)*:FACTOR, CTDE_IVAPORC, ctde_consumo
            FROM COTIZACIONES_DETALLE
            WHERE COTI_ID = :ID
            INTO :ARTICULO, :ARTIDES, :CANT, :UNIDAD, :PRECIO, :ivapor, :consumo
            DO
                BEGIN
                EXECUTE PROCEDURE costo_promedio_y_ultimo(:ARTICULO, :FECHA) returning_values (:COSTO, :ultcos);
                if (ULTIMO = 'S') then
                    COSTO = ultcos * CANT;
                else
                    COSTO = COSTO * CANT;
                if (DETALLE = 'S') then
                    BEGIN
                    UTILIDAD = PRECIO - COSTO;
                    if (UOM = 'UTILIDAD') then
                        EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                    else
                        EXECUTE PROCEDURE PORCENTAJE (utilidad,  PRECIO, 'S') returning_values (PORC);
                    SUSPEND;
                    END
                ELSE
                    BEGIN
                    COSTOT = COSTOT + COSTO;
                    PRECIOT = PRECIOT + PRECIO;
                    END
                END
        if (DETALLE <> 'S') then
            BEGIN
            COSTO = COSTOT;
            PRECIO = PRECIOT;
            UTILIDAD = PRECIO - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  PRECIO, 'S') returning_values (PORC);
            SUSPEND;
            END
        END
    END
END
^

SET TERM ; ^

/* 20100514 */
/* CONTROL DE FACTURACION MENSUAL */

ALTER TABLE CLIENTES
ADD CLIE_VALORMES T_MONTO;

CREATE TABLE FACTURAS_MES (
    FAME_NIT T_NIT NOT NULL,
    FAME_ANO SMALLINT NOT NULL,
    FAME_MES SMALLINT NOT NULL,
    FAME_IDFACT T_ID);
alter table FACTURAS_MES
add constraint PK_FACTURAS_MES
primary key (FAME_NIT,FAME_ANO,FAME_MES);

GRANT ALL ON FACTURAS_MES TO PUBLIC;

INSERT INTO CONFIGURACION (CONF_MODULO, CONF_CATEGORIA, CONF_PROPIEDAD, CONF_VALOR, CONF_POSIBLES, CONF_AYUDA) VALUES ('FACTURACION', 'FACTURAS', 'CONTROLAR FACTURACION MENSUAL POR CADA CLIENTE', 'NO', 'SI,NO', 'SI: Cada mes se marca como facturado al hacer la factura de forma que se pueda controlar que clientes no se han facturado este mes para controlar servicios mensuales');
INSERT INTO CONFIGURACION (CONF_MODULO, CONF_CATEGORIA, CONF_PROPIEDAD, CONF_VALOR, CONF_POSIBLES, CONF_AYUDA) VALUES ('FACTURACION', 'FACTURAS', 'GRUPO DE MERCANCIA PARA CONTROL MENSUAL DE FACTURACION', '', '', 'Indique el grupo de inventario correspondiente a los items con control de facturación mensual');
commit work;

CREATE EXCEPTION MES_YA_FACTURADO 'El tercero ya tiene una factura del mes';

SET TERM ^ ;

CREATE OR ALTER TRIGGER FACTURAS_DETALLE_AI FOR FACTURAS_DETALLE
ACTIVE AFTER INSERT POSITION 0
AS
declare variable fec date;
declare variable NOMCLI VARCHAR(60);
declare variable CONC VARCHAR(60);
declare variable Pref varchar(4);
declare variable Num varchar(6);
declare variable Nit varchar(20);
declare variable TIPO INTEGER;
declare variable INVFAC CHAR(2);
declare variable PEDAUTO CHAR(2);
declare variable CONSO CHAR(2);
declare variable CONSOLIDA INTEGER;
declare variable ESPOS CHAR(1);
declare variable BONOS CHAR(2);
declare variable VRBONO NUMERIC(18,2);
declare variable I INTEGER;
declare variable ITEM INTEGER;
declare variable CANTAUX NUMERIC(18,4);
declare variable CANT NUMERIC(18,4);
declare variable FACTOR NUMERIC(18,2);
declare variable factmes char(2);
declare variable ano integer;
declare variable mes integer;
declare variable MESES integer;
declare variable grpfm VARCHAR(3);
declare variable grp VARCHAR(3);
BEGIN
select fact_fecha, pref_pre, fact_numero, terc_nit, fact_nomcliente, fact_consolida
    from facturas where fact_id = new.fact_id
    into :fec, :Pref, :Num, :Nit, :Nomcli, :Consolida;
if ((NEW.fact_id <> 0) and (new.fade_anulado = 'N')) then
    BEGIN
    EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION','FACTURAS','GENERAR PEDIDO AUTOMATICAMENTE CON LA FACTURA') RETURNING_VALUES (PEDAUTO);
    SELECT MAX(CEFA_TIPOORI) FROM consolide_faltantes WHERE CEFA_ID = :CONSOLIDA INTO :TIPO;
    if (Tipo IS NULL) then
        Tipo = 0;
    execute procedure lee_configuracion('FACTURACION', 'FACTURAS', 'AFECTAR INVENTARIO CON LA FACTURA') returning_values (:INVFAC);
    SELECT MIN(AUTO_ESPOS) FROM AUTORIZACIONES WHERE PREF_PRE = :pref INTO :ESPOS;
    if (ESPOS = 'S') then
        BEGIN
        INVFAC = 'SI';
        PEDAUTO = 'NO';
        END
    /* si se hizo con base en una remisi¢n no afecte inventario */
    if ((Tipo <> 32) and (INVFAC = 'SI')) then
        begin
        if (STRLEN(NOMCLI) > 42) then
            CONC = 'FV No.' || :pref || :num || '-' || SUBSTR(NOMCLI, 1, 42);
        ELSE
            CONC = 'FV No.' || :pref || :NUM || '-' || NOMCLI;
        INSERT INTO MOVIMIENTO_ARTICULO
            (ARTI_COD, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM, TERC_NIT)
            VALUES(NEW.ARTI_COD, NEW.BODE_COD, :FEC, 31, NEW.fact_id,
            :CONC, new.fade_factor * new.fade_cant, 0, 'N', new.fade_lote, :Pref, :Num, new.fade_item, :Nit);
        end
    if (PEDAUTO = 'SI') then
        BEGIN
        INSERT INTO PEDIDOS_DETALLE (PEDI_ID, PEDE_ITEM, ARTI_COD, PEDE_CANT, PEDE_UNIDAD, PEDE_DTOPORC, PEDE_DTOMONTO, PEDE_IVAPORC, PEDE_IVAMONTO, PEDE_CONSUMO, PEDE_FACTOR, PEDE_DESC, PEDE_OBS, PEDE_CODBAR, PEDE_TOTAL, PEDE_ANULADO, PEDE_TRANSMIT, LIPR_COD, PEDE_REFERENCIA, PEDE_PRUNIT, PEDE_FACTURAD, PEDE_REMISIONAD, PEDE_RESERVA, BODE_COD)
            VALUES (GEN_ID(id_pedido,0), NEW.FADE_ITEM, NEW.ARTI_COD, NEW.FADE_CANT, NEW.FADE_UNIDAD, NEW.FADE_DTOPORC, NEW.FADE_DTOMONTO, NEW.FADE_IVAPORC, NEW.FADE_IVAMONTO, NEW.FADE_CONSUMO, NEW.FADE_FACTOR, NEW.FADE_DESC, NEW.FADE_OBS, NEW.FADE_CODBAR, NEW.FADE_TOTAL, 'N', 'N', NEW.LIPR_COD, NEW.FADE_REFERENCIA, NEW.FADE_PRUNIT, NEW.FADE_CANT * NEW.FADE_FACTOR, 0, NEW.FADE_CANT * NEW.FADE_FACTOR, NEW.bode_cod);
        END
    ELSE
        BEGIN
        if (CONSOLIDA <> 0) then
            BEGIN
            EXECUTE procedure LEE_CONFIGURACION ('FACTURACION','DOCUMENTOS','DEJAR PENDIENTES LOS ARTICULOS NO INCLUIDOS AL TRAER DOCUMENTOS RELACIONADOS') returning_values (CONSO);
            if (CONSO = 'NO') then
                UPDATE consolidado_faltantes SET COFA_IDDES = NEW.fact_id, COFA_OK = 'S' WHERE COFA_ID = :consolida;
            ELSE
                BEGIN
                CANTAUX = NEW.fade_cant * NEW.fade_factor;
                FOR SELECT COFA_ITEM, COFA_CANT, COFA_FACTOR FROM consolidado_faltantes
                    WHERE COFA_ID = :CONSOLIDA AND ARTI_COD = NEW.ARTI_COD AND COFA_OK = 'N'
                    INTO :ITEM, :CANT, :FACTOR
                    DO
                    BEGIN
                    if ((CANTAUX > 0) and ((CANT * FACTOR) > 0))then
                        if ((CANT * FACTOR) < CANTAUX) then
                            BEGIN
                            UPDATE consolidado_faltantes
                                SET COFA_IDDES = NEW.fact_id, COFA_OK = 'S'
                                WHERE COFA_ID = :consolida AND COFA_ITEM = :ITEM;
                            CANTAUX = CANTAUX - (CANT * FACTOR);
                            END
                        ELSE
                            BEGIN
                                UPDATE consolidado_faltantes
                                    SET COFA_IDDES = NEW.fact_id, COFA_CANT = :CANTAUX, COFA_FACTOR = 1, COFA_OK = 'S'
                                    WHERE COFA_ID = :consolida AND COFA_ITEM = :ITEM;
                            CANTAUX = 0;
                            END
                    END
                END
            END
        END
    EXECUTE procedure LEE_CONFIGURACION ('FACTURACION', 'ARTICULOS', 'PERMITIR GENERAR BONOS DE PAGO AL FACTURAR ARTICULOS SELECCIONADOS') returning_values (BONOS);
    if (BONOS = 'SI') then
        BEGIN
        SELECT ARTI_VALORBONO FROM ARTICULO WHERE ARTI_COD = NEW.arti_cod INTO :VRBONO;
        if (VRBONO <> 0) then
            BEGIN
            I = 1;
            WHILE (I <= (NEW.fade_cant * NEW.fade_factor)) DO
                BEGIN
                INSERT INTO BONOS_PAGO (BOPA_ID, BOPA_FACTURA, BOPA_PREF, BOPA_NUMERO, BOPA_FECHA, BOPA_ITEM, BOPA_MONTO, BOPA_IDRDC)
                    VALUES (GEN_ID(ID_BONOPAGO, 1), NEW.fact_id, :pref, :num, :fec, :I, :VRBONO, 0);
                I = I + 1;
                END
            END
        END
    execute procedure lee_configuracion('FACTURACION', 'FACTURAS', 'CONTROLAR FACTURACION MENSUAL POR CADA CLIENTE') returning_values (:factmes);
    if (factmes = 'SI') Then
        begin
        execute procedure lee_configuracion('FACTURACION', 'FACTURAS', 'GRUPO DE MERCANCIA PARA CONTROL MENSUAL DE FACTURACION') returning_values (:grpfm);
        SELECT GRUP_COD FROM ARTICULO WHERE ARTI_COD = NEW.arti_cod INTO :GRP;
        if (GRP = :GRPFM) then
            BEGIN
            /* actualice el control de facturacion */
            ano = extract(year from :fec);
            mes = extract(month from :fec);
            MESES = NEW.fade_cant;
            UPDATE movimiento_clientes SET MVCL_CONC = NEW.FADE_DESC || ' MES' WHERE MVCL_TIPOREF = 31 AND MVCL_IDREF = NEW.FACT_ID;
            while (meses > 0) DO
                BEGIN
                if (exists (select fame_nit from facturas_mes where fame_nit = :nit and fame_ano = :ano and fame_mes = :mes)) then
                    exception mes_ya_facturado 'El cliente ' || :NIT || ' ya tiene una factura de ' || :ano || '-' || :mes;
                else
                    INSERT INTO facturas_mes (FAME_NIT, FAME_ANO, FAME_MES, FAME_IDFACT)
                        VALUES (:nit, :ANO, :MES, NEW.fact_id);
                UPDATE movimiento_clientes SET MVCL_CONC = MVCL_CONC || ' ' || :MES WHERE MVCL_TIPOREF = 31 AND MVCL_IDREF = NEW.FACT_ID;
                MES = MES + 1;
                MESES = MESES - 1;
                END
            END
        end
    END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER FACTURAS_DETALLE_AU FOR FACTURAS_DETALLE
ACTIVE AFTER UPDATE POSITION 0
as
declare variable fec date;
declare variable CONC VARCHAR(60);
declare variable NOMCLI varchar(60);
declare variable Pref varchar(4);
declare variable Num varchar(6);
declare variable Nit varchar(20);
declare variable factor numeric(18,4);
declare variable INVFAC CHAR(2);
declare variable TIPO INTEGER;
declare variable PEDAUTO CHAR(2);
declare variable CONSO CHAR(2);
declare variable CONSOLIDA INTEGER;
declare variable consec INTEGER;
declare variable ESPOS CHAR(1);
declare variable BONOS CHAR(2);
declare variable VRBONO NUMERIC(18,2);
declare variable I INTEGER;
declare variable ITEM INTEGER;
declare variable CANTAUX NUMERIC(18,4);
declare variable CANT NUMERIC(18,4);
declare variable factmes char(2);
declare variable ano integer;
declare variable mes integer;
declare variable MESES integer;
declare variable grpfm VARCHAR(3);
declare variable grp VARCHAR(3);
BEGIN
EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION','FACTURAS','GENERAR PEDIDO AUTOMATICAMENTE CON LA FACTURA') RETURNING_VALUES (PEDAUTO);
execute procedure lee_configuracion('FACTURACION', 'FACTURAS', 'CONTROLAR FACTURACION MENSUAL POR CADA CLIENTE') returning_values (:factmes);
if ((OLD.fact_id <> 0) AND (OLD.fade_anulado = 'N')) then
    BEGIN
    if ((OLD.FADE_CANT * OLD.FADE_FACTOR <> NEW.fade_cant * NEW.fade_factor) or (OLD.fade_total <> NEW.fade_total) or (OLD.arti_cod <> NEW.arti_cod) or (NEW.fade_anulado = 'S')) then
        begin
        DELETE FROM MOVIMIENTO_ARTICULO WHERE (mvar_tipodoc = 31) and (mvar_idref = OLD.fact_id) and (mvar_item = old.fade_item);

        if (PEDAUTO = 'SI') then
            BEGIN
            SELECT pref_pre, fact_numero from facturas where fact_id = OLD.fact_id
                into :Pref, :Num;
            SELECT PEDI_ID FROM PEDIDOS WHERE PREF_PRE = :pref AND PEDI_NUMERO = :num into :consec;
            if (consec is not null) then
              DELETE FROM PEDIDOS_DETALLE WHERE PEDE_ITEM = OLD.FADE_ITEM AND PEDI_ID = :consec;
            END
        ELSE
            BEGIN
            /* DESHAGA LOS PENDIENTES */
            SELECT fact_consolida from facturas where fact_id = OLD.fact_id into :Consolida;
            if (CONSOLIDA <> 0) then
                BEGIN
                CANTAUX = OLD.fade_cant * OLD.fade_factor;
                FOR SELECT COFA_ITEM, COFA_CANT, COFA_FACTOR FROM consolidado_faltantes
                    WHERE COFA_ID = :CONSOLIDA AND ARTI_COD = OLD.ARTI_COD AND COFA_OK = 'S'
                    INTO :ITEM, :CANT, :FACTOR
                    DO
                    BEGIN
                    if ((CANTAUX > 0) and ((CANT * FACTOR) > 0))then
                        BEGIN
                        UPDATE consolidado_faltantes
                            SET COFA_IDDES = 0, COFA_OK = 'N'
                            WHERE COFA_ID = :consolida AND COFA_ITEM = :ITEM;
                        CANTAUX = CANTAUX - (CANT * FACTOR);
                        END
                    END
                END
            END
        delete from bonos_pago where bopa_factura = old.fact_id;
        if (factmes = 'SI') Then
            DELETE FROM facturas_mes WHERE FAME_IDFACT = OLD.fact_id;
        end
    END
if ((NEW.fact_id <> 0) and (new.fade_anulado = 'N')) then
    if ((OLD.fact_id = 0) OR (OLD.FADE_CANT * OLD.FADE_FACTOR <> NEW.fade_cant * NEW.fade_factor) or (OLD.fade_total <> NEW.fade_total) or (OLD.arti_cod <> NEW.arti_cod) or (OLD.fade_anulado = 'S')) then
      BEGIN
      select fact_fecha, pref_pre, fact_numero, terc_nit, fact_nomcliente, fact_consolida
            from facturas where fact_id = new.fact_id
            into :fec, :Pref, :Num, :Nit, :Nomcli, :Consolida;
      SELECT MAX(CEFA_TIPOORI) FROM consolide_faltantes WHERE CEFA_ID = :CONSOLIDA INTO :TIPO;
      if (Tipo IS NULL) then
        Tipo = 0;
      execute procedure lee_configuracion('FACTURACION', 'FACTURAS', 'AFECTAR INVENTARIO CON LA FACTURA') returning_values (:INVFAC);
      SELECT MIN(AUTO_ESPOS) FROM AUTORIZACIONES WHERE PREF_PRE = :pref INTO :ESPOS;
      if (ESPOS = 'S') then
        BEGIN
        INVFAC = 'SI';
        PEDAUTO = 'NO';
        END
       /* si se hizo con base en una remisi¢n no afecte inventario */
      if ((Tipo <> 32) and (INVFAC = 'SI')) then
        begin
        if (STRLEN(NOMCLI) > 29) then
            CONC = 'FACTURA DE VENTA No.' || PREF || NUM || '-' || SUBSTR(NOMCLI,1,29);
        ELSE
            CONC = 'FACTURA DE VENTA No.' || PREF || NUM || '-' || NOMCLI;
        DELETE FROM MOVIMIENTO_ARTICULO WHERE (mvar_tipodoc = 31) and (mvar_idref = OLD.fact_id) and (mvar_item = old.fade_item);
        execute procedure factor_unidad_cant(new.arti_cod, new.fade_unidad) returning_values(factor);
        INSERT INTO MOVIMIENTO_ARTICULO
            (ARTI_COD, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM, TERC_NIT)
            VALUES(NEW.ARTI_COD, NEW.BODE_COD, :FEC, 31, NEW.fact_id,
            :CONC, :factor * new.fade_cant, 0, 'N', new.fade_lote, :Pref, :Num, new.fade_item, :Nit);
        end
      if (PEDAUTO = 'SI') then
        BEGIN
        INSERT INTO PEDIDOS_DETALLE (PEDI_ID, PEDE_ITEM, ARTI_COD, PEDE_CANT, PEDE_UNIDAD, PEDE_DTOPORC, PEDE_DTOMONTO, PEDE_IVAPORC, PEDE_IVAMONTO, PEDE_CONSUMO, PEDE_FACTOR, PEDE_DESC, PEDE_OBS, PEDE_CODBAR, PEDE_TOTAL, PEDE_ANULADO, PEDE_TRANSMIT, LIPR_COD, PEDE_REFERENCIA, PEDE_PRUNIT, PEDE_FACTURAD, PEDE_REMISIONAD, PEDE_RESERVA, BODE_COD)
            VALUES (0, NEW.FADE_ITEM, NEW.ARTI_COD, NEW.FADE_CANT, NEW.FADE_UNIDAD, NEW.FADE_DTOPORC, NEW.FADE_DTOMONTO, NEW.FADE_IVAPORC, NEW.FADE_IVAMONTO, NEW.FADE_CONSUMO, NEW.FADE_FACTOR, NEW.FADE_DESC, NEW.FADE_OBS, NEW.FADE_CODBAR, NEW.FADE_TOTAL, 'N', 'N', NEW.LIPR_COD, NEW.FADE_REFERENCIA, NEW.FADE_PRUNIT, NEW.FADE_CANT * NEW.FADE_FACTOR, 0, NEW.FADE_CANT * NEW.FADE_FACTOR, NEW.bode_cod);
        END
      ELSE
        BEGIN
        if (CONSOLIDA <> 0) then
            BEGIN
            EXECUTE procedure LEE_CONFIGURACION ('FACTURACION','DOCUMENTOS','DEJAR PENDIENTES LOS ARTICULOS NO INCLUIDOS AL TRAER DOCUMENTOS RELACIONADOS') returning_values (CONSO);
            if (CONSO = 'NO') then
                UPDATE consolidado_faltantes SET COFA_IDDES = NEW.fact_id, COFA_OK = 'S' WHERE COFA_ID = :consolida;
            ELSE
                BEGIN
                CANTAUX = NEW.fade_cant * NEW.fade_factor;
                FOR SELECT COFA_ITEM, COFA_CANT, COFA_FACTOR FROM consolidado_faltantes
                    WHERE COFA_ID = :CONSOLIDA AND ARTI_COD = NEW.ARTI_COD AND COFA_OK = 'N'
                    INTO :ITEM, :CANT, :FACTOR
                    DO
                    BEGIN
                    if ((CANTAUX > 0) and ((CANT * FACTOR) > 0))then
                        if ((CANT * FACTOR) < CANTAUX) then
                            BEGIN
                            UPDATE consolidado_faltantes
                                SET COFA_IDDES = NEW.fact_id, COFA_OK = 'S'
                                WHERE COFA_ID = :consolida AND COFA_ITEM = :ITEM;
                            CANTAUX = CANTAUX - (CANT * FACTOR);
                            END
                        ELSE
                            BEGIN
                                UPDATE consolidado_faltantes
                                    SET COFA_IDDES = NEW.fact_id, COFA_CANT = :CANTAUX, COFA_FACTOR = 1, COFA_OK = 'S'
                                    WHERE COFA_ID = :consolida AND COFA_ITEM = :ITEM;
                            CANTAUX = 0;
                            END
                    END
                END
            END
        END
      EXECUTE procedure LEE_CONFIGURACION ('FACTURACION', 'ARTICULOS', 'PERMITIR GENERAR BONOS DE PAGO AL FACTURAR ARTICULOS SELECCIONADOS') returning_values (BONOS);
      if (BONOS = 'SI') then
        BEGIN
        SELECT ARTI_VALORBONO FROM ARTICULO WHERE ARTI_COD = NEW.arti_cod INTO :VRBONO;
        if (VRBONO <> 0) then
            BEGIN
            I = 1;
            WHILE (I <= (NEW.fade_cant * NEW.fade_factor)) DO
                BEGIN
                INSERT INTO BONOS_PAGO (BOPA_ID, BOPA_FACTURA, BOPA_PREF, BOPA_NUMERO, BOPA_FECHA, BOPA_ITEM, BOPA_MONTO, BOPA_IDRDC)
                    VALUES (GEN_ID(ID_BONOPAGO, 1), NEW.fact_id, :pref, :num, :fec, :I, :VRBONO, 0);
                I = I + 1;
                END
            END
        END
      if (factmes = 'SI') Then
        begin
        execute procedure lee_configuracion('FACTURACION', 'FACTURAS', 'GRUPO DE MERCANCIA PARA CONTROL MENSUAL DE FACTURACION') returning_values (:grpfm);
        SELECT GRUP_COD FROM ARTICULO WHERE ARTI_COD = NEW.arti_cod INTO :GRP;
        if (GRP = :GRPFM) then
            BEGIN
            /* actualice el control de facturacion */
            ano = extract(year from :fec);
            mes = extract(month from :fec);
            MESES = NEW.fade_cant;
            UPDATE movimiento_clientes SET MVCL_CONC = NEW.FADE_DESC || ' MES' WHERE MVCL_TIPOREF = 31 AND MVCL_IDREF = NEW.FACT_ID;
            while (meses > 0) DO
                BEGIN
                if (exists (select fame_nit from facturas_mes where fame_nit = :nit and fame_ano = :ano and fame_mes = :mes)) then
                    exception mes_ya_facturado 'El cliente ' || :NIT || ' ya tiene una factura de ' || :ano || '-' || :mes;
                else
                    INSERT INTO facturas_mes (FAME_NIT, FAME_ANO, FAME_MES, FAME_IDFACT)
                        VALUES (:nit, :ANO, :MES, NEW.fact_id);
                UPDATE movimiento_clientes SET MVCL_CONC = MVCL_CONC || ' ' || :MES WHERE MVCL_TIPOREF = 31 AND MVCL_IDREF = NEW.FACT_ID;
                MES = MES + 1;
                MESES = MESES - 1;
                END
            END
        end
      END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER FACTURAS_DETALLE_AD FOR FACTURAS_DETALLE
ACTIVE AFTER DELETE POSITION 0
AS
declare variable PEDAUTO CHAR(2);
declare variable Pref varchar(4);
declare variable Num varchar(6);
declare variable CONSOLIDA INTEGER;
declare variable consec INTEGER;
declare variable ITEM INTEGER;
declare variable CANTAUX NUMERIC(18,4);
declare variable CANT NUMERIC(18,4);
declare variable FACTOR NUMERIC(18,4);
declare variable factmes char(2);
BEGIN
if ((OLD.fact_id <> 0) AND (OLD.fade_anulado = 'N')) then
    BEGIN
    DELETE FROM MOVIMIENTO_ARTICULO WHERE (mvar_tipodoc = 31) and (mvar_idref = OLD.fact_id) and (mvar_item = old.fade_item);

    EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION','FACTURAS','GENERAR PEDIDO AUTOMATICAMENTE CON LA FACTURA') RETURNING_VALUES (PEDAUTO);
    if (PEDAUTO = 'SI') then
        BEGIN
        SELECT pref_pre, fact_numero from facturas where fact_id = OLD.fact_id
            into :Pref, :Num;
        SELECT PEDI_ID FROM PEDIDOS WHERE PREF_PRE = :pref AND PEDI_NUMERO = :num into :consec;
        if (consec is not null) then
          DELETE FROM PEDIDOS_DETALLE WHERE PEDE_ITEM = OLD.FADE_ITEM AND PEDI_ID = :consec;
        END
    ELSE
        BEGIN
        /* DESHAGA LOS PENDIENTES */
        SELECT fact_consolida from facturas where fact_id = OLD.fact_id into :Consolida;
        if (CONSOLIDA <> 0) then
            BEGIN
            CANTAUX = OLD.fade_cant * OLD.fade_factor;
            FOR SELECT COFA_ITEM, COFA_CANT, COFA_FACTOR FROM consolidado_faltantes
                WHERE COFA_ID = :CONSOLIDA AND ARTI_COD = OLD.ARTI_COD AND COFA_OK = 'S'
                INTO :ITEM, :CANT, :FACTOR
                DO
                BEGIN
                if ((CANTAUX > 0) and ((CANT * FACTOR) > 0))then
                    BEGIN
                    UPDATE consolidado_faltantes
                        SET COFA_IDDES = 0, COFA_OK = 'N'
                        WHERE COFA_ID = :consolida AND COFA_ITEM = :ITEM;
                    CANTAUX = CANTAUX - (CANT * FACTOR);
                    END
                END
            END
        END
    delete from bonos_pago where bopa_factura = old.fact_id;
    execute procedure lee_configuracion('FACTURACION', 'FACTURAS', 'CONTROLAR FACTURACION MENSUAL POR CADA CLIENTE') returning_values (:factmes);
    if (factmes = 'SI') Then
        DELETE FROM facturas_mes WHERE FAME_IDFACT = OLD.fact_id;
    END
END
^

SET TERM ; ^

SET TERM ^ ;

create procedure facturas_mes_nit (
    NIT VARCHAR(20),
    ANO INTEGER)
returns (
    MES VARCHAR(15),
    FACTURA VARCHAR(10))
as
declare variable IDMES INTEGER;
begin
FOR SELECT FAME_MES, PREF_PRE || FACT_NUMERO FROM FACTURAS_MES M, FACTURAS F
    WHERE F.fact_id = M.fame_idfact AND FAME_NIT = :NIT AND FAME_ANO = :ANO
    INTO :idmes, :factura
    DO
    BEGIN
    if (idmes = 1) then
        MES = 'ENERO';
    if (idmes = 2) then
        MES = 'FEBRERO';
    if (idmes = 3) then
        MES = 'MARZO';
    if (idmes = 4) then
        MES = 'ABRIL';
    if (idmes = 5) then
        MES = 'MAYO';
    if (idmes = 6) then
        MES = 'JUNIO';
    if (idmes = 7) then
        MES = 'JULIO';
    if (idmes = 8) then
        MES = 'AGOSTO';
    if (idmes = 9) then
        MES = 'SEPTIEMBRE';
    if (idmes = 10) then
        MES = 'OCTUBRE';
    if (idmes = 11) then
        MES = 'NOVIEMBRE';
    if (idmes = 12) then
        MES = 'DICIEMBRE';
    suspend;
    END
end
^

SET TERM ; ^

GRANT EXECUTE ON PROCEDURE facturas_mes_nit TO PUBLIC;

SET TERM ^ ;

CREATE OR ALTER procedure FACTURAR_CONCEPTOS (
    ID integer,
    NITINI varchar(20),
    NITFIN varchar(20),
    AGRINI varchar(20),
    AGRFIN varchar(20),
    AGRUPA integer,
    FECHA date)
returns (
    PREFIJO varchar(4),
    NUMERO varchar(6),
    NIT varchar(20),
    NOMBRE varchar(60),
    TOTAL numeric(18,2))
AS
declare variable IDF INTEGER;
declare variable IDC INTEGER;
declare variable VEND INTEGER;
declare variable PTVT INTEGER;
declare variable VENDINI INTEGER;
declare variable VENDFIN INTEGER;
declare variable ZONINI CHAR(2);
declare variable ZONFIN CHAR(2);
declare variable grpini INTEGER;
declare variable grpfin INTEGER;
declare variable DIAS INTEGER;
declare variable OBS VARCHAR(255);
declare variable IVAINC CHAR(1);
declare variable ITEM INTEGER;
declare variable ARTICULO VARCHAR(20);
declare variable DESCR VARCHAR(60);
declare variable CANT NUMERIC(18,2);
declare variable PRUNIT NUMERIC(18,2);
declare variable IVAP NUMERIC(18,2);
declare variable IVAM NUMERIC(18,2);
declare variable BASE NUMERIC(18,2);
declare variable RTFTE NUMERIC(9,2);
declare variable RTIVA NUMERIC(9,2);
declare variable RTICA NUMERIC(9,2);
declare variable RTFTEM NUMERIC(18,2);
declare variable RTIVAM NUMERIC(18,2);
declare variable RTICAM NUMERIC(18,2);
declare variable UNIDAD VARCHAR(8);
declare variable BOD VARCHAR(2);
declare variable ERROR INTEGER;
declare variable VER CHAR(1);
declare variable factmes varchar(2);
declare variable GRPFM VARCHAR(3);
declare variable OK CHAR(1);
begin
if (agrupa = 0) then
    BEGIN
    VENDINI = 0;
    VENDFIN = 999999;
    GRPINI = 0;
    GRPFIN = 999999;
    ZONINI = '';
    ZONFIN = 'zz';
    END
if (agrupa = 1) then
    BEGIN
    VENDINI = 0;
    VENDFIN = 999999;
    ZONINI = '';
    ZONFIN = 'zz';
    GRPINI = AGRINI;
    GRPFIN = AGRFIN;
    END
if (agrupa = 2) then
    BEGIN
    GRPINI = 0;
    GRPFIN = 999999;
    ZONINI = '';
    ZONFIN = 'zz';
    VENDINI = AGRINI;
    VENDFIN = AGRFIN;
    END
if (agrupa = 3) then
    BEGIN
    VENDINI = 0;
    VENDFIN = 999999;
    GRPINI = 0;
    GRPFIN = 999999;
    ZONINI = AGRINI;
    ZONFIN = AGRFIN;
    END
EXECUTE procedure lee_configuracion ('FACTURACION', 'FACTURAS', 'GRUPO DE MERCANCIA PARA CONTROL MENSUAL DE FACTURACION') returning_values (:GRPFM);
EXECUTE procedure lee_configuracion ('FACTURACION', 'FACTURAS', 'CONTROLAR FACTURACION MENSUAL POR CADA CLIENTE') returning_values (:factmes);
SELECT FACC_PREF, FACC_VEND, FACC_DIAS, FACC_PTVT, FACC_OBS FROM factura_concepto WHERE FACC_ID = :ID
    INTO :prefijo, :vend, :dias, :ptvt, :obs;
SELECT BODE_COD FROM punto_venta WHERE PTVT_ID = :PTVT INTO :BOD;
FOR SELECT T.TERC_NIT, TERC_NOM, C.vend_cod, C.clie_rtefte, C.clie_rteiva, C.clie_rteica, C.clie_rtftebase
    FROM TERCEROS T, CLIENTES C
    WHERE T.terc_nit = C.terc_nit AND T.TERC_NIT >= :NITINI AND T.TERC_NIT <= :NITFIN AND
        C.vend_cod >= :vendini AND C.vend_cod <= :vendfin AND ((c.grca_cod is null and :grpini = 0 ) or (C.grca_cod >= :grpini AND C.grca_cod <= :grpfin)) AND
        ((c.zona_cod is null and :zonini = '') or (C.zona_cod >= :zonini AND C.zona_cod <= :zonfin))
    INTO :NIT, :NOMBRE, :VEND, :RTFTE, :RTIVA, :RTICA, :RTFTEM
    DO
    BEGIN
    SELECT PREF_ACTUAL, PREF_IVAINC FROM PREFIJOS WHERE TIDO_COD = 31 AND PREF_PRE = :prefijo
        INTO :NUMERO, :IVAINC;
    select max(INVE_ID) FROM interfaz_ventas WHERE PREF_PRE = :prefijo AND TIDO_COD = 31 INTO :IDC;

    OK = 'S';
    if (FACTMES = 'SI') then
        begin
        if (EXISTS(SELECT FAME_IDFACT FROM FACTURAS_MES WHERE FAME_NIT = :nit AND FAME_ANO = EXTRACT(YEAR FROM :FECHA) AND FAME_MES = EXTRACT(MONTH FROM :FECHA))) then
            OK = 'N';
        end
    if (OK = 'S') then
        BEGIN
        IDF = GEN_ID(id_factura, 1);
        INSERT INTO FACTURAS (FACT_ID, PTVT_ID, VEND_COD, TERC_NIT, AUTO_NUMERO, FACT_NUMERO, FACT_FECHA, FACT_DESPACHO,
            FACT_VENCE, FACT_IVAINC, FACT_COMIPORC, FACT_COMIMONTO, FACT_DTOPOR, FACT_DTOMONTO, FACT_ADICIONAL,
            FACT_IVAMONTO, FACT_RTFTEPOR, FACT_RTFTEMONTO, FACT_RTIVAPOR, FACT_RTIVAMONTO, FACT_RTICAPOR, FACT_RTICAMONTO,
            FACT_EXTRA, FACT_DTOFPOR, FACT_DTOFMONTO, FACT_DTOFFECHA, PREF_PRE, FACT_TRANSP, FACT_NOMCLIENTE, FACT_COTIZACI,
            FACT_PEDIDO, FACT_REMISION, FACT_ANULADO, FACT_TRANSMIT, FACT_TOTAL, BODE_COD, FACT_OBS, VEHI_COD, FACT_CONSOLIDA,
            FACT_RECIBIDO, FACT_USUARIO, FACT_SUCURSAL, NUMOK, COBR_COD, FACT_FACTOR, FACT_DETCLI, FACT_DETCLINOM,
            FACT_DTOIT1, FACT_DTOIT2, FACT_DTOIT3, FACT_TRM)
            VALUES (:IDF, :PTVT, :VEND, :NIT, NULL, :NUMERO, :FECHA, NULL, (:FECHA + :DIAS), :IVAINC,
            0, 0, 0, 0, 0, :IVAM, :RTFTE, :RTFTEM, :RTIVA, :RTIVAM, :RTICA, :RTICAM, 0, 0, 0, :FECHA, :PREFIJO, NULL,
            :NOMBRE, NULL, NULL, NULL, 'N', 'N', :TOTAL, :BOD, :OBS, NULL, NULL, 0, USER, '01', 'N', :VEND, 1, NULL,
            NULL, NULL, NULL, NULL, 1);

        FOR SELECT FACI_ITEM, FC.ARTI_COD, FACI_CANT, FACI_PRUNIT, ARTI_UNIDAD, TAIV_PORC, FACI_DESC
            FROM factura_concepto_items FC, ARTICULO A, TARIFA_IVA I
            WHERE FC.arti_cod = A.arti_cod AND A.taiv_cod = I.taiv_cod AND FC.facc_id = :ID
            INTO :item, :articulo, :CANT, :prunit, :unidad, :ivap, :descr
            DO
            BEGIN
            /* busque el precio por cliente */
            if (EXISTS(SELECT ARTI_COD FROM ARTICULO WHERE ARTI_COD = :articulo AND GRUP_COD = :GRPFM)) then
                SELECT CLIE_VALORMES FROM CLIENTES WHERE TERC_NIT = :NIT INTO :PRUNIT;

            if (IVAINC = 'S') then
                BEGIN
                IVAM = :CANT * :PRUNIT / (100 + :IVAP) * :IVAP;
                BASE = :CANT * :PRUNIT;
                END
            ELSE
                BEGIN
                IVAM = :CANT * :PRUNIT * IVAP / 100;
                BASE = :CANT * :PRUNIT + IVAM;
                END
            INSERT INTO FACTURAS_DETALLE (FACT_ID, FADE_ITEM, BODE_COD, ARTI_COD, FADE_CANT, FADE_UNIDAD, FADE_LOTE,
                FADE_PRUNIT, FADE_DTOPORC, FADE_DTOMONTO, FADE_IVAPORC, FADE_IVAMONTO, FADE_CONSUMO, FADE_FACTOR,
                FADE_DESC, FADE_OBS, FADE_CODBAR, FADE_REMISIONADO, FADE_DEVUELTO, FADE_TOTAL, LIPR_COD, FADE_REFERENCIA,
                FADE_ANULADO, FADE_TRANSMIT, FADE_FACTORLISTA, FADE_DTO1, FADE_DTO2, FADE_DTO3, FADE_DTOM1, FADE_DTOM2,
                FADE_DTOM3, FADE_CAJAS)
                VALUES (:IDF, :ITEM, :BOD, :articulo, :CANT, :UNIDAD, NULL, :prunit, 0, 0, :IVAP, :ivam, 0, 1,
                :descr, NULL, :articulo, 0, 0, :BASE, 1, NULL, 'N', 'N', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
            END

        /* CALCULE EL TOTAL DE LA FACTURA XA EFECTOS DE IMPUESTOS */
        SELECT SUM(FADE_TOTAL), SUM(FADE_IVAMONTO) FROM facturas_detalle WHERE FACT_ID = :idf
            INTO :TOTAL, :IVAM;
        if (IVAINC = 'S') then
            BASE = TOTAL - IVAM;
        ELSE
            BASE = TOTAL;
        if (BASE >= RTFTEM) then
            BEGIN
            RTFTEM = BASE * RTFTE / 100;
            RTICAM = BASE * RTICA / 1000;
            RTIVAM = IVAM * RTIVA / 100;
            END
        ELSE
            BEGIN
            RTFTEM = 0;
            RTICAM = 0;
            RTIVAM = 0;
            END
        UPDATE FACTURAS SET FACT_TOTAL = :total,  FACT_IVAMONTO = :IVAM, FACT_RTFTEMONTO = :rtftem, 
            FACT_RTIVAMONTO = :rtivam, FACT_RTICAMONTO = :rticam WHERE FACT_ID = :IDF;

        /* contabilice */
        execute procedure CONTABIL_FACTURA(:idf,  :IDC) returning_values (:ERROR, :VER, :IDC);
        EXECUTE procedure contabiliza_pendiente (:IDC);
        suspend;
        END
    END
end
^

SET TERM ; ^

/* 20100514B */
/* VENTAS POR ARTICULO CON NIT Y NOMBRE DEL CLIENTE */

SET TERM ^ ;

CREATE OR ALTER procedure REP_VENTAS_ARTICULO (
    TIPO integer,
    ARTINI varchar(20),
    ARTFIN varchar(20),
    DETALLE char(1),
    FECINI date,
    FECFIN date,
    GRPINI varchar(3),
    GRPFIN varchar(3),
    PTOINI integer,
    PTOFIN integer,
    ORDEN char(1),
    AGRUPA char(1),
    CEROS char(1),
    UNIDADES char(1),
    SUBEMPRESA integer)
returns (
    ARTICULO varchar(15),
    DESCRIPCION varchar(60),
    CODGRUPO varchar(2),
    NOMGRUPO varchar(30),
    CODSUBG varchar(3),
    NOMSUBG varchar(30),
    CODMARC varchar(3),
    NOMMARC varchar(30),
    UNIDAD varchar(8),
    CANTIDAD numeric(18,4),
    BASE numeric(18,2),
    IVA numeric(18,2),
    CONSUMO numeric(18,2),
    PREFIJO varchar(4),
    NUMERO varchar(6),
    FECHA date,
    NIT VARCHAR(20),
    NOMBRE VARCHAR(60),
    DTO numeric(9,2),
    TRANSP varchar(60),
    ALTERNATIVAS numeric(18,4),
    NOMTIPO varchar(50))
AS
DECLARE VARIABLE CODINI VARCHAR(20);
DECLARE VARIABLE CODFIN VARCHAR(20);
DECLARE VARIABLE DESINI VARCHAR(20);
DECLARE VARIABLE DESFIN VARCHAR(20);
declare variable MARINI VARCHAR(3);
declare variable MARFIN VARCHAR(3);
declare variable NUMROWS INTEGER;
declare variable CANTAUX NUMERIC(18,4);
BEGIN
if (ORDEN = 'C') then
    BEGIN
    CODINI = ARTINI;
    CODFIN = ARTFIN;
    DESINI = '';
    DESFIN = 'zz';
    END
ELSE
    BEGIN
    DESINI = ARTINI;
    DESFIN = ARTFIN;
    CODINI = '0';
    CODFIN = 'zz';
    END
if (AGRUPA = 'G') then
    BEGIN
    MARINI = '';
    MARFIN = 'zz';
    END
ELSE
    if (AGRUPA = 'M') then
        BEGIN
        MARINI = GRPINI;
        MARFIN = GRPFIN;
        GRPINI = '';
        GRPFIN = 'zz';
        END
    ELSE
        BEGIN
        MARINI = '';
        MARFIN = 'zz';
        END
/* BORRA LA TABLA AUXILIAR */
DELETE FROM reportes_aux WHERE REPA_ID = 1 AND REPA_USER = USER;

if (DETALLE = 'N') then
    BEGIN
    if (BIN_AND(TIPO, 1) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 31 INTO :NOMTIPO;
        /* BORRA LA TABLA AUXILIAR */
        DELETE FROM reportes_aux WHERE REPA_ID = 1 AND REPA_USER = USER;

        FOR SELECT MAX(D.ARTI_COD), SUM(FADE_CANT * FADE_FACTOR), SUM(FACT_FACTOR*(FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO)),
            SUM(FACT_FACTOR*FADE_IVAMONTO), SUM(FADE_CONSUMO), MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD), MAX(TERC_NIT), MAX(FACT_NOMCLIENTE)
            FROM FACTURAS_DETALLE D, FACTURAS F, PREFIJOS P, ARTICULO A WHERE F.PTVT_ID >= :PTOINI AND F.PTVT_ID <= :PTOFIN AND
            F.FACT_ID = D.FACT_ID AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND D.ARTI_COD = A.arti_cod AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            FACT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) and substring(a.arti_cod from 1 FOR 2) <> '.t'
            GROUP BY D.ARTI_COD
            INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,
            :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :nit, :nombre
            DO
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            if (UNIDADES = 'S') then
                BEGIN
                cantaux = 1;
                select max(unar_faccan) from unidad_articulo where arti_cod = :articulo into :cantaux;
                if (cantaux IS NULL) then
                    cantaux = 1;
                alternativas = floor(cantidad / cantaux);
                cantidad = cantidad - alternativas * cantaux;
                END
            if (CEROS = 'S') then
                INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (1, USER, :ARTICULO);
            SUSPEND;
            END
        if (CEROS = 'S') then
            BEGIN
            /* agregue los articulos sin factura */
            FOR SELECT ARTI_COD, 0, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND
                    A.ARTI_DES <= :DESFIN AND A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND
                    (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN)))
                INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,:DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                DO
                BEGIN
                SELECT COUNT(REPA_ARTICULO) FROM REPORTES_AUX WHERE REPA_ID = 1 AND REPA_USER = USER AND REPA_ARTICULO = :articulo INTO :numrows;
                if (numrows = 0) then
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        END

    if (BIN_AND(TIPO, 2) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 32 INTO :NOMTIPO;
        /* BORRA LA TABLA AUXILIAR */
        DELETE FROM reportes_aux WHERE REPA_ID = 1 AND REPA_USER = USER;

        FOR SELECT MAX(D.ARTI_COD), SUM(RVDE_CANT * RVDE_FACTOR), SUM((RVDE_TOTAL-RVDE_IVAMONTO-RVDE_CONSUMO)), SUM(RVDE_IVAMONTO),
            SUM(RVDE_CONSUMO), MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD), MAX(TERC_NIT), MAX(R.revt_nomterc)
            FROM REMISIONES_VENTA_DETALLE D, REMISIONES_VENTA R, PREFIJOS P, ARTICULO A WHERE R.PTVT_ID >= :PTOINI AND R.PTVT_ID <= :PTOFIN AND
            R.REVT_ID = D.REVT_ID AND P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = 32 AND D.ARTI_COD = A.arti_cod AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            REVT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY D.ARTI_COD
            INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,
            :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :NIT, :nombre
            DO
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            if (UNIDADES = 'S') then
                BEGIN
                cantaux = 1;
                select max(unar_faccan) from unidad_articulo where arti_cod = :articulo into :cantaux;
                if (cantaux IS NULL) then
                    cantaux = 1;
                alternativas = floor(cantidad / cantaux);
                cantidad = cantidad - alternativas * cantaux;
                END
            if (CEROS = 'S') then
                INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (1, USER, :ARTICULO);
            SUSPEND;
            END
        if (CEROS = 'S') then
            BEGIN
            /* agregue los articulos sin factura */
            FOR SELECT ARTI_COD, 0, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND
                    A.ARTI_DES <= :DESFIN AND A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND
                    (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN)))
                INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,:DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                DO
                BEGIN
                SELECT COUNT(REPA_ARTICULO) FROM REPORTES_AUX WHERE REPA_ID = 1 AND REPA_USER = USER AND REPA_ARTICULO = :articulo INTO :numrows;
                if (numrows = 0) then
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        END

    if (BIN_AND(TIPO, 4) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 33 INTO :NOMTIPO;
        /* BORRA LA TABLA AUXILIAR */
        DELETE FROM reportes_aux WHERE REPA_ID = 1 AND REPA_USER = USER;

        FOR SELECT MAX(D.ARTI_COD), SUM(DVDE_CANT * DVDE_FACTOR), SUM(DEVT_FACTOR*(DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO)),
            SUM(DEVT_FACTOR*DVDE_IVAMONTO), SUM(DVDE_CONSUMO), MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD), MAX(TERC_NIT), MAX(V.devt_nomterc)
            FROM devoluciones_ventas_detalle D, DEVOLUCIONES_VENTAS V, PREFIJOS P, ARTICULO A WHERE V.PTVT_ID >= :PTOINI AND V.PTVT_ID <= :PTOFIN AND
            V.DEVT_ID = D.DEVT_ID AND P.PREF_PRE = V.PREF_PRE AND P.TIDO_COD = 33 AND D.ARTI_COD = A.arti_cod AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            DEVT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) AND ((DEVT_REMID = 0) or (DEVT_REMID IS NULL)) AND ((DEVT_PEDID = 0) or (DEVT_PEDID IS NULL))
            GROUP BY D.ARTI_COD
            INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,
            :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :nit, :nombre
            DO
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            CANTIDAD = CANTIDAD * -1;
            BASE = BASE * -1;
            IVA = IVA * -1;
            CONSUMO = CONSUMO * -1;
            if (UNIDADES = 'S') then
                BEGIN
                cantaux = 1;
                select max(unar_faccan) from unidad_articulo where arti_cod = :articulo into :cantaux;
                if (cantaux IS NULL) then
                    cantaux = 1;
                alternativas = floor(cantidad / cantaux);
                cantidad = cantidad - alternativas * cantaux;
                END
            if (CEROS = 'S') then
                INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (1, USER, :ARTICULO);
            SUSPEND;
            END
        if (CEROS = 'S') then
            BEGIN
            /* agregue los articulos sin factura */
            FOR SELECT ARTI_COD, 0, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND
                    A.ARTI_DES <= :DESFIN AND A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND
                    (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN)))
                INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,:DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                DO
                BEGIN
                SELECT COUNT(REPA_ARTICULO) FROM REPORTES_AUX WHERE REPA_ID = 1 AND REPA_USER = USER AND REPA_ARTICULO = :articulo INTO :numrows;
                if (numrows = 0) then
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        END
    if (BIN_AND(TIPO, 8) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 34 INTO :NOMTIPO;
        /* BORRA LA TABLA AUXILIAR */
        DELETE FROM reportes_aux WHERE REPA_ID = 1 AND REPA_USER = USER;

        FOR SELECT MAX(D.ARTI_COD), SUM(PEDE_CANT * PEDE_FACTOR), SUM(PEDI_FACTOR*(PEDE_TOTAL-PEDE_IVAMONTO-PEDE_CONSUMO)),
            SUM(PEDI_FACTOR*PEDE_IVAMONTO), SUM(PEDE_CONSUMO),
            MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD), MAX(TERC_NIT), MAX(P.pedi_nomterc)
            FROM PEDIDOS_DETALLE D, PEDIDOS P, PREFIJOS R, ARTICULO A WHERE P.PTVT_ID >= :PTOINI AND P.PTVT_ID <= :PTOFIN AND
            P.PEDI_ID = D.PEDI_ID AND P.PREF_PRE = R.PREF_PRE AND R.TIDO_COD = 34 AND D.ARTI_COD = A.arti_cod AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            PEDI_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY D.ARTI_COD
            INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,
            :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :nit, :nombre
            DO
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            if (UNIDADES = 'S') then
                BEGIN
                cantaux = 1;
                select max(unar_faccan) from unidad_articulo where arti_cod = :articulo into :cantaux;
                if (cantaux IS NULL) then
                    cantaux = 1;
                alternativas = floor(cantidad / cantaux);
                cantidad = cantidad - alternativas * cantaux;
                END
            if (CEROS = 'S') then
                INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (1, USER, :ARTICULO);
            SUSPEND;
            END
        if (CEROS = 'S') then
            BEGIN
            /* agregue los articulos sin factura */
            FOR SELECT ARTI_COD, 0, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND
                    A.ARTI_DES <= :DESFIN AND A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND
                    (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN)))
                INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,:DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                DO
                BEGIN
                SELECT COUNT(REPA_ARTICULO) FROM REPORTES_AUX WHERE REPA_ID = 1 AND REPA_USER = USER AND REPA_ARTICULO = :articulo INTO :numrows;
                if (numrows = 0) then
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        END
    if (BIN_AND(TIPO, 16) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 35 INTO :NOMTIPO;
        /* BORRA LA TABLA AUXILIAR */
        DELETE FROM reportes_aux WHERE REPA_ID = 1 AND REPA_USER = USER;

        FOR SELECT MAX(D.ARTI_COD), SUM(CTDE_CANT * CTDE_FACTOR), SUM(COTI_FACTOR*(CTDE_TOTAL-CTDE_IVAMONTO-CTDE_CONSUMO)),
            SUM(COTI_FACTOR*CTDE_IVAMONTO), SUM(CTDE_CONSUMO),
            MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD), MAX(TERC_NIT), MAX(C.coti_nomterc)
            FROM COTIZACIONES_DETALLE D, COTIZACIONES C, PREFIJOS P, ARTICULO A WHERE C.PTVT_ID >= :PTOINI AND C.PTVT_ID <= :PTOFIN AND
            C.COTI_ID = D.COTI_ID AND P.PREF_PRE = C.PREF_PRE AND P.TIDO_COD = 35 AND D.ARTI_COD = A.arti_cod AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND COTI_FECHA >= :FECINI AND COTI_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            COTI_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY D.ARTI_COD
            INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,
            :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :nit, :nombre
            DO
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            if (UNIDADES = 'S') then
                BEGIN
                cantaux = 1;
                select max(unar_faccan) from unidad_articulo where arti_cod = :articulo into :cantaux;
                if (cantaux IS NULL) then
                    cantaux = 1;
                alternativas = floor(cantidad / cantaux);
                cantidad = cantidad - alternativas * cantaux;
                END
            if (CEROS = 'S') then
                INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (1, USER, :ARTICULO);
            SUSPEND;
            END
        if (CEROS = 'S') then
            BEGIN
            /* agregue los articulos sin factura */
            FOR SELECT ARTI_COD, 0, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND
                    A.ARTI_DES <= :DESFIN AND A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND
                    (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN)))
                INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,:DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                DO
                BEGIN
                SELECT COUNT(REPA_ARTICULO) FROM REPORTES_AUX WHERE REPA_ID = 1 AND REPA_USER = USER AND REPA_ARTICULO = :articulo INTO :numrows;
                if (numrows = 0) then
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        END
    END
ELSE
  if (DETALLE = 'S') then
    BEGIN
    if (BIN_AND(TIPO, 1) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 31 INTO :NOMTIPO;
        FOR SELECT F.PREF_PRE, FACT_NUMERO, FACT_FECHA, D.ARTI_COD, FADE_CANT * FADE_FACTOR, (FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO)*FACT_FACTOR,
        FADE_IVAMONTO*FACT_FACTOR, FADE_CONSUMO, FADE_DTOPORC,
            ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD, FACT_TRANSP, F.TERC_NIT, FACT_NOMCLIENTE
            FROM FACTURAS F, FACTURAS_DETALLE D, PREFIJOS P, ARTICULO A WHERE F.PTVT_ID >= :PTOINI AND F.PTVT_ID <= :PTOFIN AND
                F.FACT_ID = D.FACT_ID AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND D.ARTI_COD = A.arti_cod AND
                A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
                A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND FACT_FECHA >= :FECINI AND
                (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
                FACT_FECHA <= :FECFIN AND FACT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) and substring(a.arti_cod from 1 FOR 2) <> '.t'
            /*ORDER BY D.ARTI_COD, FACT_FECHA, FACT_ID, FADE_ITEM*/
            INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO, :DTO,
                :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :transp, :nit, :nombre
            DO
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            SUSPEND;
            END
        END
    if (BIN_AND(TIPO, 2) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 32 INTO :NOMTIPO;
        FOR SELECT R.PREF_PRE, REVT_NUMERO, REVT_FECHA, D.ARTI_COD, RVDE_CANT * RVDE_FACTOR, (RVDE_TOTAL-RVDE_IVAMONTO-RVDE_CONSUMO), RVDE_IVAMONTO, RVDE_CONSUMO, RVDE_DTOPORC,
            ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD, REVT_TRANSP, R.TERC_NIT, R.revt_nomterc
            FROM REMISIONES_VENTA R, REMISIONES_VENTA_DETALLE D, PREFIJOS P, ARTICULO A
            WHERE R.REVT_ID = D.REVT_ID AND P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = 32 AND D.ARTI_COD = A.arti_cod AND
                A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
                A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN AND
                (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
                REVT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO, :DTO,
                :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :transp, :nit, :nombre
            DO
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            SUSPEND;
            END
        END
    if (BIN_AND(TIPO, 4) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 33 INTO :NOMTIPO;
        FOR SELECT V.PREF_PRE, DEVT_NUMERO, DEVT_FECHA, D.ARTI_COD, DVDE_CANT * DVDE_FACTOR, (DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO)*DEVT_FACTOR,
            DVDE_IVAMONTO*DEVT_FACTOR, DVDE_CONSUMO, DVDE_DTOPORC,
            ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD, V.TERC_NIT, V.devt_nomterc
            FROM DEVOLUCIONES_VENTAS V, DEVOLUCIONES_VENTAS_DETALLE D, PREFIJOS P, ARTICULO A WHERE V.PTVT_ID >= :PTOINI AND V.PTVT_ID <= :PTOFIN AND
                V.DEVT_ID = D.DEVT_ID AND P.PREF_PRE = V.PREF_PRE AND P.TIDO_COD = 33 AND D.ARTI_COD = A.arti_cod AND
                A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
                A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND
                (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
                DEVT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) AND ((DEVT_REMID = 0) or (DEVT_REMID IS NULL))  AND ((DEVT_PEDID = 0) or (DEVT_PEDID IS NULL))
            /*ORDER BY D.ARTI_COD, DEVT_FECHA, DEVT_ID, DVDE_ITEM*/
            INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO, :DTO,
                :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :nit, :nombre
            DO
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            CANTIDAD = CANTIDAD * -1;
            BASE = BASE * -1;
            IVA = IVA * -1;
            CONSUMO = CONSUMO * -1;
            SUSPEND;
            END
        END
    if (BIN_AND(TIPO, 8) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 34 INTO :NOMTIPO;
        FOR SELECT P.PREF_PRE, PEDI_NUMERO, PEDI_FECHA, D.ARTI_COD, PEDE_CANT * PEDE_FACTOR, (PEDE_TOTAL-PEDE_IVAMONTO-PEDE_CONSUMO)*PEDI_FACTOR,
                PEDE_IVAMONTO*PEDI_FACTOR, PEDE_CONSUMO, PEDE_DTOPORC,
            ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD, P.TERC_NIT, P.pedi_nomterc
            FROM PEDIDOS P, PEDIDOS_DETALLE D, PREFIJOS R, ARTICULO A WHERE P.PTVT_ID >= :PTOINI AND P.PTVT_ID <= :PTOFIN AND
                P.PEDI_ID = D.PEDI_ID AND P.PREF_PRE = R.PREF_PRE AND R.TIDO_COD = 34 AND D.ARTI_COD = A.arti_cod AND
                A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
                A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND
                (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
                PEDI_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            /*ORDER BY D.ARTI_COD, PEDI_FECHA, PEDI_ID, PEDE_ITEM*/
            INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO, :DTO,
                :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :nit, :nombre
            DO
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            SUSPEND;
            END
        END
    if (BIN_AND(TIPO, 16) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 35 INTO :NOMTIPO;
        FOR SELECT C.PREF_PRE, COTI_NUMERO, COTI_FECHA, D.ARTI_COD, CTDE_CANT * CTDE_FACTOR, (CTDE_TOTAL-CTDE_IVAMONTO-CTDE_CONSUMO)*COTI_FACTOR,
                CTDE_IVAMONTO*COTI_FACTOR, CTDE_CONSUMO, CTDE_DTOPORC,
            ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD, C.terc_nit, C.coti_nomterc
            FROM COTIZACIONES C, COTIZACIONES_DETALLE D, PREFIJOS P, ARTICULO A WHERE C.PTVT_ID >= :PTOINI AND C.PTVT_ID <= :PTOFIN AND
                C.COTI_ID = D.COTI_ID AND P.PREF_PRE = C.PREF_PRE AND P.TIDO_COD = 35 AND D.ARTI_COD = A.arti_cod AND
                A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
                A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND COTI_FECHA >= :FECINI AND COTI_FECHA <= :FECFIN AND
                (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
                COTI_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            /*ORDER BY D.ARTI_COD, COTI_FECHA, COTI_ID, CTDE_ITEM*/
            INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO, :DTO,
                :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :nit, :nombre
            DO
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            SUSPEND;
            END
        END
    END
  ELSE
    BEGIN
    if (BIN_AND(TIPO, 1) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 31 INTO :NOMTIPO;
        FOR SELECT MAX(D.ARTI_COD), SUM(FADE_CANT * FADE_FACTOR), SUM((FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO)*FACT_FACTOR),
            SUM(FACT_FACTOR*FADE_IVAMONTO), SUM(FADE_CONSUMO), MAX(ARTI_DES), MAX(ARTI_UNIDAD),
            MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD), MAX(FACT_TRANSP), MAX(F.terc_nit), MAX(F.fact_nomcliente)
            FROM FACTURAS_DETALLE D, FACTURAS F, PREFIJOS P, ARTICULO A WHERE F.PTVT_ID >= :PTOINI AND F.PTVT_ID <= :PTOFIN AND
            F.FACT_ID = D.FACT_ID AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND D.ARTI_COD = A.arti_cod AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            FACT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) and substring(a.arti_cod from 1 FOR 2) <> '.t'
            GROUP BY FACT_TRANSP, D.ARTI_COD
            INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,
            :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :transp, :nit, :nombre
            DO
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            if (CEROS = 'S') then
                SUSPEND;
            ELSE
                if ((BASE <> 0) AND (CANTIDAD <> 0)) then
                    SUSPEND;
            END
        END

    if (BIN_AND(TIPO, 2) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 32 INTO :NOMTIPO;
        FOR SELECT MAX(D.ARTI_COD), SUM(RVDE_CANT * RVDE_FACTOR), SUM((RVDE_TOTAL-RVDE_IVAMONTO-RVDE_CONSUMO)), SUM(RVDE_IVAMONTO),
            SUM(RVDE_CONSUMO), MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD), MAX(REVT_TRANSP), MAX(R.terc_nit), MAX(R.revt_nomterc)
            FROM REMISIONES_VENTA_DETALLE D, REMISIONES_VENTA R, PREFIJOS P, ARTICULO A WHERE R.PTVT_ID >= :PTOINI AND R.PTVT_ID <= :PTOFIN AND
            R.REVT_ID = D.REVT_ID AND P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = 32 AND D.ARTI_COD = A.arti_cod AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            REVT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY REVT_TRANSP, D.ARTI_COD
            INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,
            :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :transp, :nit, :nombre
            DO
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            if (CEROS = 'S') then
                SUSPEND;
            ELSE
                if ((BASE <> 0) AND (CANTIDAD <> 0)) then
                    SUSPEND;
            END
        END
    END
END
^

SET TERM ; ^



/* 20100514C */
/* ABONOS EN REPORTE DE VENTAS POR CLIENTE */

SET TERM ^ ;

CREATE OR ALTER procedure REP_VENTAS_CLIENTE (
    TIPO integer,
    NITDESDE varchar(20),
    NITHASTA varchar(20),
    FECINI date,
    FECFIN date,
    DETALLE char(1),
    ORDEN char(1),
    CEROS char(1),
    SUBEMPRESA integer)
returns (
    NIT varchar(20),
    NOMBRE varchar(60),
    DV char(1),
    TELEFONO varchar(40),
    CIUDAD varchar(40),
    CODZONA varchar(2),
    NOMZONA varchar(30),
    NOMTIPO varchar(50),
    PREFIJO varchar(4),
    NUMERO varchar(6),
    SUCURSAL varchar(10),
    ID integer,
    ABONOS NUMERIC(18,2),
    SALDO NUMERIC(18,2),
    FECDOC date,
    CANTIDAD integer,
    SUBTOTAL numeric(18,2),
    DTO numeric(18,2),
    ADICIONAL numeric(18,2),
    IVA numeric(18,2),
    EXTRA numeric(18,2),
    TOTAL numeric(18,2),
    RTFTE numeric(18,2),
    RTIVA numeric(18,2),
    RTICA numeric(18,2),
    NETO numeric(18,2),
    ULTVENTA date,
    APELLIDO1 varchar(60),
    APELLIDO2 varchar(60),
    NOMBRE1 varchar(60),
    NOMBRE2 varchar(60),
    CODCIU varchar(5))
AS
DECLARE VARIABLE NITINI VARCHAR(15);
DECLARE VARIABLE NITFIN VARCHAR(15);
DECLARE VARIABLE NOMINI VARCHAR(15);
DECLARE VARIABLE NOMFIN VARCHAR(15);
BEGIN
if (ORDEN = 'C') then
    BEGIN
    NITINI = NITDESDE;
    NITFIN = NITHASTA;
    NOMINI = '';
    NOMFIN = 'zz';
    END
ELSE
    BEGIN
    NITINI = NITDESDE;
    NITFIN = NITHASTA;
    NOMINI = '';
    NOMFIN = 'zz';
    END

SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = :TIPO INTO :NOMTIPO;
if (DETALLE = 'N') then
    BEGIN
    if (BIN_AND(TIPO, 1) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 31 INTO :NOMTIPO;
        FOR SELECT MAX(T.TERC_NIT), MAX(TERC_NOM), MAX(TERC_TEL), MAX(TERC_CIU), MAX(ZONA_COD), MAX(TERC_DV),
            MAX(TERC_APELLIDO1), MAX(TERC_APELLIDO2), MAX(TERC_NOMBRE1), MAX(TERC_NOMBRE2), MAX(T.CIUD_COD), max(FACT_FECHA),
            COUNT(*), SUM(FACT_DTOMONTO), SUM(FACT_ADICIONAL), SUM(FACT_IVAMONTO), SUM(FACT_EXTRA), SUM(FACT_RTFTEMONTO), SUM(FACT_RTIVAMONTO), SUM(FACT_RTICAMONTO), SUM(FACT_TOTAL)
            FROM FACTURAS F, PREFIJOS P, terceros T, CLIENTES C
            where C.TERC_NIT = T.TERC_NIT AND T.TERC_CLIE = 'S' AND T.TERC_NIT >= :NITINI AND T.TERC_NIT <= :NITFIN AND TERC_NOM >= :NOMINI AND TERC_NOM <= :NOMFIN
             AND F.TERC_NIT = T.terc_nit AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND FACT_ANULADO = 'N'
             AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY F.terc_nit
            INTO :NIT, :NOMBRE, :TELEFONO, :CIUDAD, :CODZONA, :DV,
            :APELLIDO1, :APELLIDO2, :NOMBRE1, :NOMBRE2, :CODCIU, :ultventa,
            :CANTIDAD, :DTO, :ADICIONAL, :IVA, :EXTRA, :RTFTE, :RTIVA, :RTICA, :TOTAL
            DO
            BEGIN
            SELECT ZONA_NOM FROM ZONAS WHERE ZONA_COD = :codzona INTO :NOMZONA;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (DTO IS NULL) then
                DTO = 0;
            if (ADICIONAL IS NULL) then
                ADICIONAL = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (EXTRA IS NULL) then
                EXTRA = 0;
            if (RTFTE IS NULL) then
                RTFTE = 0;
            if (RTIVA IS NULL) then
                RTIVA = 0;
            if (RTICA IS NULL) then
                RTICA = 0;
            SUBTOTAL = TOTAL - EXTRA - IVA - ADICIONAL + DTO;
            NETO = TOTAL - RTFTE - RTIVA - RTICA;
            if (CEROS = 'S') then
              SUSPEND;
            ELSE
              if (CANTIDAD > 0) then
                SUSPEND;
            END
        END
    if (BIN_AND(TIPO, 2) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 32 INTO :NOMTIPO;
        FOR SELECT MAX(T.TERC_NIT), MAX(TERC_NOM), MAX(TERC_TEL), MAX(TERC_CIU), MAX(ZONA_COD), MAX(TERC_DV),
            MAX(TERC_APELLIDO1), MAX(TERC_APELLIDO2), MAX(TERC_NOMBRE1), MAX(TERC_NOMBRE2), MAX(T.CIUD_COD), MAX(REVT_FECHA),
            COUNT(*), 0, 0, SUM(REVT_IVAMONTO), 0, 0, 0, 0, SUM(REVT_TOTAL)
            FROM REMISIONES_VENTA R, PREFIJOS P, terceros T, CLIENTES C
            where C.TERC_NIT = T.TERC_NIT AND T.TERC_CLIE = 'S' AND T.TERC_NIT >= :NITINI AND T.TERC_NIT <= :NITFIN AND TERC_NOM >= :NOMINI AND TERC_NOM <= :NOMFIN
             AND R.TERC_NIT = T.terc_nit AND REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN AND REVT_ANULADO = 'N'
             AND P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = 32 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY R.terc_nit
            INTO :NIT, :NOMBRE, :TELEFONO, :CIUDAD, :CODZONA, :DV,
            :APELLIDO1, :APELLIDO2, :NOMBRE1, :NOMBRE2, :CODCIU, :ultventa,
            :CANTIDAD, :DTO, :ADICIONAL, :IVA, :EXTRA, :RTFTE, :RTIVA, :RTICA, :TOTAL
            DO
            BEGIN
            SELECT ZONA_NOM FROM ZONAS WHERE ZONA_COD = :codzona INTO :NOMZONA;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (DTO IS NULL) then
                DTO = 0;
            if (ADICIONAL IS NULL) then
                ADICIONAL = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (EXTRA IS NULL) then
                EXTRA = 0;
            if (RTFTE IS NULL) then
                RTFTE = 0;
            if (RTIVA IS NULL) then
                RTIVA = 0;
            if (RTICA IS NULL) then
                RTICA = 0;
            SUBTOTAL = TOTAL - EXTRA - IVA - ADICIONAL + DTO;
            NETO = TOTAL - RTFTE - RTIVA - RTICA;
            if (CEROS = 'S') then
              SUSPEND;
            ELSE
              if (CANTIDAD > 0) then
                SUSPEND;
            END
        END
    if (BIN_AND(TIPO, 4) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 33 INTO :NOMTIPO;
        FOR SELECT MAX(T.TERC_NIT), MAX(TERC_NOM), MAX(TERC_TEL), MAX(TERC_CIU), MAX(ZONA_COD), MAX(TERC_DV),
            MAX(TERC_APELLIDO1), MAX(TERC_APELLIDO2), MAX(TERC_NOMBRE1), MAX(TERC_NOMBRE2), MAX(T.CIUD_COD), MAX(DEVT_FECHA),
            COUNT(*), SUM(DEVT_DTOMONTO), SUM(DEVT_ADICIONAL), SUM(DEVT_IVAMONTO), SUM(DEVT_EXTRA), SUM(DEVT_RTFTEMONTO), SUM(DEVT_RTIVAMONTO), SUM(DEVT_RTICAMONTO), SUM(DEVT_TOTAL)
            FROM DEVOLUCIONES_VENTAS V, PREFIJOS P, terceros T, CLIENTES C
            where C.TERC_NIT = T.TERC_NIT AND T.TERC_CLIE = 'S' AND T.TERC_NIT >= :NITINI AND T.TERC_NIT <= :NITFIN AND TERC_NOM >= :NOMINI AND TERC_NOM <= :NOMFIN
             AND V.TERC_NIT = T.terc_nit AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND DEVT_ANULADO = 'N'
             AND P.PREF_PRE = V.PREF_PRE AND P.TIDO_COD = 33 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) AND ((DEVT_REMID = 0) or (DEVT_REMID IS NULL)) AND ((DEVT_PEDID = 0) or (DEVT_PEDID IS NULL))
            GROUP BY V.terc_nit
            INTO :NIT, :NOMBRE, :TELEFONO, :CIUDAD, :CODZONA, :DV,
            :APELLIDO1, :APELLIDO2, :NOMBRE1, :NOMBRE2, :CODCIU, :ultventa,
             :CANTIDAD, :DTO, :ADICIONAL, :IVA, :EXTRA, :RTFTE, :RTIVA, :RTICA, :TOTAL
            DO
            BEGIN
            SELECT ZONA_NOM FROM ZONAS WHERE ZONA_COD = :codzona INTO :NOMZONA;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (DTO IS NULL) then
                DTO = 0;
            if (ADICIONAL IS NULL) then
                ADICIONAL = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (EXTRA IS NULL) then
                EXTRA = 0;
            if (RTFTE IS NULL) then
                RTFTE = 0;
            if (RTIVA IS NULL) then
                RTIVA = 0;
            if (RTICA IS NULL) then
                RTICA = 0;
            SUBTOTAL = TOTAL - EXTRA - IVA - ADICIONAL + DTO;
            NETO = TOTAL - RTFTE - RTIVA - RTICA;
            CANTIDAD = CANTIDAD * -1;
            SUBTOTAL = SUBTOTAL * -1;
            TOTAL = TOTAL * -1;
            IVA = IVA * -1;
            EXTRA = EXTRA * -1;
            DTO = DTO * -1;
            ADICIONAL = ADICIONAL * -1;
            RTFTE = RTFTE * -1;
            RTIVA = RTIVA * -1;
            RTICA = RTICA * -1;
            if (CEROS = 'S') then
              SUSPEND;
            ELSE
              if (CANTIDAD <> 0) then
                SUSPEND;
            END
        END
    if (BIN_AND(TIPO, 8) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 34 INTO :NOMTIPO;
        FOR SELECT MAX(T.TERC_NIT), MAX(TERC_NOM), MAX(TERC_TEL), MAX(TERC_CIU), MAX(ZONA_COD), MAX(TERC_DV),
            MAX(TERC_APELLIDO1), MAX(TERC_APELLIDO2), MAX(TERC_NOMBRE1), MAX(TERC_NOMBRE2), MAX(T.CIUD_COD), MAX(PEDI_FECHA),
            COUNT(*), SUM(PEDI_DTOMONTO), SUM(PEDI_ADICIONAL), SUM(PEDI_IVAMONTO), SUM(PEDI_EXTRA), 0, 0, 0, SUM(PEDI_TOTAL)
            FROM PEDIDOS P, PREFIJOS PR, terceros T, CLIENTES C
            where C.TERC_NIT = T.TERC_NIT AND T.TERC_CLIE = 'S' AND T.TERC_NIT >= :NITINI AND T.TERC_NIT <= :NITFIN AND TERC_NOM >= :NOMINI AND TERC_NOM <= :NOMFIN
             AND P.TERC_NIT = T.terc_nit AND PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND PEDI_ANULADO = 'N'
             AND PR.PREF_PRE = P.PREF_PRE AND P.TIDO_COD = 34 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY P.terc_nit
            INTO :NIT, :NOMBRE, :TELEFONO, :CIUDAD, :CODZONA, :DV,
            :APELLIDO1, :APELLIDO2, :NOMBRE1, :NOMBRE2, :CODCIU, :ultventa,
            :CANTIDAD, :DTO, :ADICIONAL, :IVA, :EXTRA, :RTFTE, :RTIVA, :RTICA, :TOTAL
            DO
            BEGIN
            SELECT ZONA_NOM FROM ZONAS WHERE ZONA_COD = :codzona INTO :NOMZONA;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (DTO IS NULL) then
                DTO = 0;
            if (ADICIONAL IS NULL) then
                ADICIONAL = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (EXTRA IS NULL) then
                EXTRA = 0;
            if (RTFTE IS NULL) then
                RTFTE = 0;
            if (RTIVA IS NULL) then
                RTIVA = 0;
            if (RTICA IS NULL) then
                RTICA = 0;
            SUBTOTAL = TOTAL - EXTRA - IVA - ADICIONAL + DTO;
            NETO = TOTAL - RTFTE - RTIVA - RTICA;
            if (CEROS = 'S') then
              SUSPEND;
            ELSE
              if (CANTIDAD > 0) then
                SUSPEND;
            END
        END
    if (BIN_AND(TIPO, 16) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 35 INTO :NOMTIPO;
        FOR SELECT MAX(T.TERC_NIT), MAX(TERC_NOM), MAX(TERC_TEL), MAX(TERC_CIU), MAX(ZONA_COD), MAX(TERC_DV),
            MAX(TERC_APELLIDO1), MAX(TERC_APELLIDO2), MAX(TERC_NOMBRE1), MAX(TERC_NOMBRE2), MAX(T.CIUD_COD), MAX(COTI_FECHA),
            COUNT(*), SUM(COTI_DTOMONTO), SUM(COTI_ADICIONAL), SUM(COTI_IVAMONTO), SUM(COTI_EXTRA), 0, 0, 0, SUM(COTI_TOTAL)
            FROM COTIZACIONES CT, PREFIJOS P, terceros T, CLIENTES C
            where C.TERC_NIT = T.TERC_NIT AND T.TERC_CLIE = 'S' AND T.TERC_NIT >= :NITINI AND T.TERC_NIT <= :NITFIN AND TERC_NOM >= :NOMINI AND TERC_NOM <= :NOMFIN
             AND CT.TERC_NIT = T.terc_nit AND COTI_FECHA >= :FECINI AND COTI_FECHA <= :FECFIN AND COTI_ANULADO = 'N'
             AND P.PREF_PRE = CT.PREF_PRE AND P.TIDO_COD = 35 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY C.terc_nit
            INTO :NIT, :NOMBRE, :TELEFONO, :CIUDAD, :CODZONA, :DV,
            :APELLIDO1, :APELLIDO2, :NOMBRE1, :NOMBRE2, :CODCIU, :ultventa,
            :CANTIDAD, :DTO, :ADICIONAL, :IVA, :EXTRA, :RTFTE, :RTIVA, :RTICA, :TOTAL
            DO
            BEGIN
            SELECT ZONA_NOM FROM ZONAS WHERE ZONA_COD = :codzona INTO :NOMZONA;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (DTO IS NULL) then
                DTO = 0;
            if (ADICIONAL IS NULL) then
                ADICIONAL = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (EXTRA IS NULL) then
                EXTRA = 0;
            if (RTFTE IS NULL) then
                RTFTE = 0;
            if (RTIVA IS NULL) then
                RTIVA = 0;
            if (RTICA IS NULL) then
                RTICA = 0;
            SUBTOTAL = TOTAL - EXTRA - IVA - ADICIONAL + DTO;
            NETO = TOTAL - RTFTE - RTIVA - RTICA;
            if (CEROS = 'S') then
              SUSPEND;
            ELSE
              if (CANTIDAD > 0) then
                SUSPEND;
            END
        END
    END
ELSE
    BEGIN
    if (BIN_AND(TIPO, 1) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 31 INTO :NOMTIPO;
        FOR SELECT FACT_ID, F.PREF_PRE, FACT_NUMERO, FACT_FECHA, FACT_DTOMONTO, FACT_ADICIONAL, FACT_IVAMONTO, FACT_EXTRA, FACT_TOTAL, FACT_RTFTEMONTO, FACT_RTIVAMONTO, FACT_RTICAMONTO,
            T.TERC_NIT, TERC_NOM, ZONA_COD, TERC_TEL, TERC_CIU, TERC_DV, TERC_APELLIDO1, TERC_APELLIDO2, TERC_NOMBRE1, TERC_NOMBRE2, T.CIUD_COD, F.fact_sucursal
            FROM FACTURAS F, PREFIJOS P, terceros T, CLIENTES C
            where C.TERC_NIT = T.TERC_NIT AND T.TERC_CLIE = 'S' AND T.TERC_NIT >= :NITINI AND T.TERC_NIT <= :NITFIN AND TERC_NOM >= :NOMINI AND TERC_NOM <= :NOMFIN
             AND F.TERC_NIT = T.terc_nit AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND FACT_ANULADO = 'N'
             AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            ORDER BY FACT_FECHA, FACT_ID
            INTO :ID, :PREFIJO, :NUMERO, :FECDOC, :DTO, :ADICIONAL, :IVA, :EXTRA, :TOTAL, :RTFTE, :RTIVA, :RTICA, :nit, :nombre, :codzona, :telefono, :ciudad, :dv, :APELLIDO1, :APELLIDO2, :NOMBRE1, :NOMBRE2, :CODCIU, :sucursal
            DO
            BEGIN
            EXECUTE PROCEDURE saldo_doc_cartera(31, :id, :fecfin, 0) returning_values (:saldo);
            abonos = TOTAL - SALDO;
            SELECT ZONA_NOM FROM ZONAS WHERE ZONA_COD = :codzona INTO :NOMZONA;
            SUBTOTAL = TOTAL - EXTRA - IVA - ADICIONAL + DTO;
            NETO = TOTAL - RTFTE - RTIVA - RTICA;
            SUSPEND;
            END
        END
    if (BIN_AND(TIPO, 2) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 32 INTO :NOMTIPO;
        FOR SELECT REVT_ID, R.PREF_PRE, REVT_NUMERO, REVT_FECHA, 0, 0, REVT_IVAMONTO, 0, REVT_TOTAL, 0, 0, 0,
        T.TERC_NIT, TERC_NOM, ZONA_COD, TERC_TEL, TERC_CIU, TERC_DV, TERC_APELLIDO1, TERC_APELLIDO2, TERC_NOMBRE1, TERC_NOMBRE2, T.CIUD_COD, R.revt_sucursal
            FROM REMISIONES_VENTA R, PREFIJOS P, terceros T, CLIENTES C
            where C.TERC_NIT = T.TERC_NIT AND T.TERC_CLIE = 'S' AND T.TERC_NIT >= :NITINI AND T.TERC_NIT <= :NITFIN AND TERC_NOM >= :NOMINI AND TERC_NOM <= :NOMFIN
             AND R.TERC_NIT = T.terc_nit AND REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN AND REVT_ANULADO = 'N'
             AND P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = 32 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            ORDER BY REVT_FECHA, REVT_ID
            INTO :ID, :PREFIJO, :NUMERO, :FECDOC, :DTO, :ADICIONAL, :IVA, :EXTRA, :TOTAL, :RTFTE, :RTIVA, :RTICA, :nit, :nombre, :codzona, :telefono, :ciudad, :DV, :APELLIDO1, :APELLIDO2, :NOMBRE1, :NOMBRE2, :CODCIU, :sucursal
            DO
            BEGIN
            SELECT ZONA_NOM FROM ZONAS WHERE ZONA_COD = :codzona INTO :NOMZONA;
            SUBTOTAL = TOTAL - EXTRA - IVA - ADICIONAL + DTO;
            NETO = TOTAL - RTFTE - RTIVA - RTICA;
            SUSPEND;
            END
        END
    if (BIN_AND(TIPO, 4) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 33 INTO :NOMTIPO;
        FOR SELECT DEVT_ID, V.PREF_PRE, DEVT_NUMERO, DEVT_FECHA, DEVT_DTOMONTO, DEVT_ADICIONAL, DEVT_IVAMONTO, DEVT_EXTRA, DEVT_TOTAL, DEVT_RTFTEMONTO, DEVT_RTIVAMONTO, DEVT_RTICAMONTO,
            T.TERC_NIT, TERC_NOM, ZONA_COD, TERC_TEL, TERC_CIU, TERC_DV, TERC_APELLIDO1, TERC_APELLIDO2, TERC_NOMBRE1, TERC_NOMBRE2, T.CIUD_COD, V.devt_sucursal
            FROM DEVOLUCIONES_VENTAS V, PREFIJOS P, terceros T, CLIENTES C
            where C.TERC_NIT = T.TERC_NIT AND T.TERC_CLIE = 'S' AND T.TERC_NIT >= :NITINI AND T.TERC_NIT <= :NITFIN AND TERC_NOM >= :NOMINI AND TERC_NOM <= :NOMFIN
             AND V.TERC_NIT = T.terc_nit AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND DEVT_ANULADO = 'N'
             AND P.PREF_PRE = V.PREF_PRE AND P.TIDO_COD = 33 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) AND ((DEVT_REMID = 0) or (DEVT_REMID IS NULL)) AND ((DEVT_PEDID = 0) or (DEVT_PEDID IS NULL))
            ORDER BY DEVT_FECHA, DEVT_ID
            INTO :ID, :PREFIJO, :NUMERO, :FECDOC, :DTO, :ADICIONAL, :IVA, :EXTRA, :TOTAL, :RTFTE, :RTIVA, :RTICA, :nit, :nombre, :codzona, :telefono, :ciudad, :DV, :APELLIDO1, :APELLIDO2, :NOMBRE1, :NOMBRE2, :CODCIU, :sucursal
            DO
            BEGIN
            EXECUTE PROCEDURE saldo_doc_cartera(33, :id, :fecfin, 0) returning_values (:saldo);
            abonos = TOTAL - SALDO;
            SELECT ZONA_NOM FROM ZONAS WHERE ZONA_COD = :codzona INTO :NOMZONA;
            SUBTOTAL = TOTAL - EXTRA - IVA - ADICIONAL + DTO;
            NETO = TOTAL - RTFTE - RTIVA - RTICA;
            CANTIDAD = CANTIDAD * -1;
            SUBTOTAL = SUBTOTAL * -1;
            TOTAL = TOTAL * -1;
            IVA = IVA * -1;
            EXTRA = EXTRA * -1;
            DTO = DTO * -1;
            ADICIONAL = ADICIONAL * -1;
            RTFTE = RTFTE * -1;
            RTIVA = RTIVA * -1;
            RTICA = RTICA * -1;
            SUSPEND;
            END
        END
    if (BIN_AND(TIPO, 8) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 34 INTO :NOMTIPO;
        FOR SELECT PEDI_ID, P.PREF_PRE, PEDI_NUMERO, PEDI_FECHA, PEDI_DTOMONTO, PEDI_ADICIONAL, PEDI_IVAMONTO, PEDI_EXTRA, PEDI_TOTAL, 0, 0, 0,
            T.TERC_NIT, TERC_NOM, ZONA_COD, TERC_TEL, TERC_CIU, TERC_DV, TERC_APELLIDO1, TERC_APELLIDO2, TERC_NOMBRE1, TERC_NOMBRE2, T.CIUD_COD, P.pedi_sucursal
            FROM PEDIDOS P, PREFIJOS PR, terceros T, CLIENTES C
            where C.TERC_NIT = T.TERC_NIT AND T.TERC_CLIE = 'S' AND T.TERC_NIT >= :NITINI AND T.TERC_NIT <= :NITFIN AND TERC_NOM >= :NOMINI AND TERC_NOM <= :NOMFIN
             AND P.TERC_NIT = T.terc_nit AND PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND PEDI_ANULADO = 'N'
             AND P.PREF_PRE = PR.PREF_PRE AND P.TIDO_COD = 34 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            ORDER BY PEDI_FECHA, PEDI_ID
            INTO :ID, :PREFIJO, :NUMERO, :FECDOC, :DTO, :ADICIONAL, :IVA, :EXTRA, :TOTAL, :RTFTE, :RTIVA, :RTICA, :nit, :nombre, :codzona, :telefono, :ciudad, :DV, :APELLIDO1, :APELLIDO2, :NOMBRE1, :NOMBRE2, :CODCIU, :sucursal
            DO
            BEGIN
            SELECT ZONA_NOM FROM ZONAS WHERE ZONA_COD = :codzona INTO :NOMZONA;
            SUBTOTAL = TOTAL - EXTRA - IVA - ADICIONAL + DTO;
            NETO = TOTAL - RTFTE - RTIVA - RTICA;
            SUSPEND;
            END
        END
    if (BIN_AND(TIPO, 16) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 35 INTO :NOMTIPO;
        FOR SELECT COTI_ID, CT.PREF_PRE, COTI_NUMERO, COTI_FECHA, COTI_DTOMONTO, COTI_ADICIONAL, COTI_IVAMONTO, COTI_EXTRA, COTI_TOTAL, 0, 0, 0,
            T.TERC_NIT, TERC_NOM, ZONA_COD, TERC_TEL, TERC_CIU, TERC_DV, TERC_APELLIDO1, TERC_APELLIDO2, TERC_NOMBRE1, TERC_NOMBRE2, T.CIUD_COD, CT.coti_sucursal
            FROM COTIZACIONES CT, PREFIJOS P, terceros T, CLIENTES C
            where C.TERC_NIT = T.TERC_NIT AND T.TERC_CLIE = 'S' AND T.TERC_NIT >= :NITINI AND T.TERC_NIT <= :NITFIN AND TERC_NOM >= :NOMINI AND TERC_NOM <= :NOMFIN
             AND CT.TERC_NIT = T.terc_nit AND COTI_FECHA >= :FECINI AND COTI_FECHA <= :FECFIN AND COTI_ANULADO = 'N'
             AND P.PREF_PRE = CT.PREF_PRE AND P.TIDO_COD = 35 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            ORDER BY COTI_FECHA, COTI_ID
            INTO :ID, :PREFIJO, :NUMERO, :FECDOC, :DTO, :ADICIONAL, :IVA, :EXTRA, :TOTAL, :RTFTE, :RTIVA, :RTICA, :nit, :nombre, :codzona, :telefono, :ciudad, :DV, :APELLIDO1, :APELLIDO2, :NOMBRE1, :NOMBRE2, :CODCIU, :sucursal
            DO
            BEGIN
            SELECT ZONA_NOM FROM ZONAS WHERE ZONA_COD = :codzona INTO :NOMZONA;
            SUBTOTAL = TOTAL - EXTRA - IVA - ADICIONAL + DTO;
            NETO = TOTAL - RTFTE - RTIVA - RTICA;
            SUSPEND;
            END
        END
    END
END
^

SET TERM ; ^


/* 20100515 */
/* mal costo del ensamble automatico */
SET TERM ^ ;

CREATE OR ALTER TRIGGER MOVIMIENTO_ARTICULO_BI FOR MOVIMIENTO_ARTICULO
ACTIVE BEFORE INSERT POSITION 0
AS
declare variable LOTE CHAR(1);
declare variable ENSAMBLE CHAR(1);
declare variable IDENS INTEGER;
declare variable PREFENS VARCHAR(4);
declare variable unidad varchar(8);
declare variable DESCR varchar(60);
declare variable CODPR varchar(8);
declare variable DESPR varchar(60);
declare variable UNIPR varchar(8);
declare variable CANTPR numeric(18,4);
declare variable FACTOR numeric(18,4);
declare variable COSTO numeric(18,2);
declare variable COSTOTOT numeric(18,2);
declare variable PORCPR numeric(9,4);
declare variable MERMAPR numeric(9,4);
declare variable PESO numeric(18,4);
declare variable PESOPR numeric(18,4);
declare variable ITEM INTEGER;
declare variable IVA NUMERIC(9,4);
declare variable IVAM NUMERIC(18,2);
declare variable CONSUMO NUMERIC(18,2);
declare variable TOTAL float;
declare variable SALDO NUMERIC(18,4);
BEGIN
/* INSERTE EL NUEVO LOTE */
if (NEW.mvar_cant IS NULL) then
    NEW.mvar_cant = 0;
SELECT ARTI_EXIST
    FROM   ARTICULO
    WHERE  ARTICULO.ARTI_COD = NEW.ARTI_COD
    INTO :LOTE;
if (LOTE = 'L') then
    BEGIN
      if ((NEW.mvar_lote IS NULL) or (NEW.mvar_lote = '')) then
        if (new.mvar_entrada = 'S') then
            new.mvar_lote = cast(new.mvar_cons as varchar(15));
        else
            begin
            /* NO HAY LOTE, ENTONCES CALCULELO SEGUN CONFIGURACION */
            EXCEPTION LOTE_NEGATIVO 'No se indicó un lote para el artículo ' || new.arti_cod;
            end
    END
/* ENSAMBLE EL PRODUCTO */
SELECT ARTI_ENSAMBLE, ARTI_UNIDAD, ARTI_DES, ARTI_PESO
    FROM ARTICULO WHERE ARTI_COD = NEW.arti_cod INTO :ensamble, :unidad, :descr, :peso;
if ((NEW.mvar_entrada = 'N') AND (ENSAMBLE = 'S')) then
    BEGIN
    /* verifique si la existecia es insufieciente */
    execute procedure saldo_inventario(new.arti_cod, new.bode_cod, new.mvar_fecha) returning_values (:saldo);
    if (NEW.mvar_cant > :SALDO) then
        BEGIN
        if (SALDO > 0) then
            SALDO = NEW.mvar_cant - :SALDO;
        else
            SALDO = NEW.mvar_cant;
        IDENS = gen_id(id_ensamble, 1);
        EXECUTE PROCEDURE lee_configuracion('INVENTARIO', 'ENSAMBLES', 'PREFIJO PARA ENSAMBLES AUTOMATICOS AL SACAR PRODUCTOS') returning_values (:prefens);
        INSERT INTO ENSAMBLES(ENSA_ID, TIDO_COD, PREF_PRE, BODE_COD, ENSA_NUMERO, ENSA_FECHA, ENSA_CONC, ENSA_REFER, ENSA_CANT, ENSA_UNIDAD, ENSA_FACTOR, ENSA_ANULADO, ENSA_TRANSMIT,
            ARTI_COD, ENSA_DESC, ENSA_CODBAR, ENSA_LOTE, ENSA_OBS, TERC_NIT, ENSA_USUARIO, NUMOK, ENSA_COSTO, LOTE_VENCE, ENSA_CODRETAL, ENSA_CANTRETAL, ENSA_OPER, ENSA_MAQUINA, ENSA_PESO, ENSA_BODRETAL, ENSA_TIPOREF, ENSA_IDREF)
            VALUES (:IDENS, 15, :prefens, NEW.bode_cod, '000001', new.mvar_fecha, new.mvar_conc, '', :SALDO, :unidad, 1, 'N', 'N',
            NEW.arti_cod, :descr, NEW.arti_cod, NEW.mvar_lote, NULL, NULL, USER, 'N', NEW.mvar_costo, NULL, NULL, 0, null,  NULL, 0, NEW.bode_cod, NEW.mvar_tipodoc, NEW.mvar_idref);
        ITEM = 0;
        COSTOTOT = 0;
        select sum(arpr_porc) from articulos_producto where arti_cod = NEW.arti_cod into :total;
        FOR SELECT ARPR_CANT, ARPR_UNIDAD, ARPR_COMP, ARTI_DES, TAIV_PORC, ARTI_CONSUMO, ARPR_PORC, ARPR_MERMA, ARTI_PESO
            FROM articulos_producto P, ARTICULO A, TARIFA_IVA T
            WHERE P.ARTI_COD = NEW.arti_cod AND A.arti_cod = P.arpr_comp AND A.taiv_cod = T.taiv_cod
            INTO :CANTPR, :UNIPR, :CODPR, :DESPR, :IVA, :CONSUMO, :PORCPR, :MERMAPR, :PESOPR
            DO
            BEGIN
            ITEM = ITEM + 1;
            EXECUTE PROCEDURE factor_unidad_cant(:codpr, :unipr) returning_values (:factor);
            EXECUTE PROCEDURE costo_promedio_unidad (:codpr, NEW.mvar_fecha, :UNIPR) returning_values (:COSTO);
            IVAM = costo * cantpr * iva / 100;
            if (((cantpr is null) or (cantpr = 0)) AND (porcpr IS NOT NULL) AND (porcpr <> 0)) then
                BEGIN
                /* ES PORCENTUAL AL PESO LA MEZCLA SOBRE EL 1ER ARTICULO */
                CANTPR = :SALDO * PESO;
                CANTPR = CANTPR / TOTAL * porcpr; /* APLICA LA PROPORCION */
                if ((mermapr IS NOT NULL) AND (mermapr <> 0)) then
                    CANTPR = CANTPR * (100 + mermapr) / 100;
/*                CANTPR = CANTPR / pesopr; /* LO LLEVA A LA UNIDAD PRINCIPAL */
                UNIPR = 'GRAMO';
                END
            ELSE
                BEGIN
                CANTPR = CANTPR * :SALDO * pesopr;
                END
            COSTOTOT = COSTOTOT + COSTO * CANTPR;
            INSERT INTO ENSAMBLES_DETALLE(ENSA_ID, ESDE_ITEM, ARTI_COD, BODE_COD, ESDE_CANT, ESDE_UNIDAD, ESDE_COSTO, ESDE_LOTE, ESDE_FACTOR, ESDE_IVAPORC, ESDE_IVAMONTO, ESDE_CONSUMO, ESDE_CODBAR, ESDE_ANULADO, ESDE_TRANSMIT, ESDE_DESC, ESDE_TOTAL, ESDE_PESO)
                VALUES (:idens, :ITEM, :codpr,  NEW.bode_cod, :cantpr, :unipr, :costo, NULL, :FACTOR, :IVA, :ivam, :consumo, :codpr, 'N', 'N', :despr, :COSTO * :cantpr, 0);
            END
        END
    UPDATE ENSAMBLES SET ENSA_COSTO = :costotot WHERE ENSA_ID = :idens;
    END
if (new.mvar_cons is null) then
    NEW.mvar_cons = GEN_ID(ID_MOVARTI,1);
END
^

SET TERM ; ^

/* 20100518 */
/* BALANCE ANUAL CON TERCEROS */
SET TERM ^ ;

CREATE OR ALTER procedure BALANCE_ANUAL (
    ANO char(4),
    CTAINI varchar(20),
    CTAFIN varchar(20),
    TERC char(1))
returns (
    CODIGO varchar(20),
    NOMBRE varchar(60),
    NIT varchar(20),
    NOMTERC varchar(60),
    INICIAL numeric(18,2),
    MVENE numeric(18,2),
    MVFEB numeric(18,2),
    MVMAR numeric(18,2),
    MVABR numeric(18,2),
    MVMAY numeric(18,2),
    MVJUN numeric(18,2),
    MVJUL numeric(18,2),
    MVAGO numeric(18,2),
    MVSEP numeric(18,2),
    MVOCT numeric(18,2),
    MVNOV numeric(18,2),
    MVDIC numeric(18,2),
    MVCIE numeric(18,2),
    FINAL numeric(18,2),
    NIVEL integer)
AS
declare variable DEBITOS NUMERIC(18,2);
declare variable CREDITOS NUMERIC(18,2);
declare variable MESAUX CHAR(2);
declare variable AFECTA CHAR(1);
BEGIN
FOR SELECT CUEN_COD, CUEN_NOM FROM CUENTAS WHERE CUEN_COD >= :CTAINI AND CUEN_COD <= :CTAFIN order by CUEN_COD INTO CODIGO, NOMBRE
  DO
  BEGIN
  execute procedure es_afectable(:CODIGO) returning_values (:AFECTA);
  if ((TERC = 'N') OR (AFECTA = 'N')) then
    BEGIN
    EXECUTE PROCEDURE SALDO_CUENTA_MES(CODIGO, ANO, 1, 'S') RETURNING_VALUES (INICIAL);
    FOR SELECT MAX(substr(SACU_FECHA, 5, 6)), SUM(SACU_DEBITO), SUM(SACU_CREDITO) FROM SALDOS_CUENTAS
      WHERE CUEN_COD = :CODIGO AND :ANO = SUBSTR(SACU_FECHA, 1, 4)
      GROUP by substr(SACU_FECHA, 5, 6)
      INTO :MESAUX, :DEBITOS, :CREDITOS
      DO
      BEGIN
      MVENE = 0;
      MVFEB = 0;
      MVMAR = 0;
      MVABR = 0;
      MVMAY = 0;
      MVJUN = 0;
      MVJUL = 0;
      MVAGO = 0;
      MVSEP = 0;
      MVOCT = 0;
      MVNOV = 0;
      MVDIC = 0;
      MVCIE = 0;
      if (MESAUX = '01') then
        MVENE = DEBITOS - CREDITOS;
      if (MESAUX = '02') then
        MVFEB = DEBITOS - CREDITOS;
      if (MESAUX = '03') then
        MVMAR = DEBITOS - CREDITOS;
      if (MESAUX = '04') then
        MVABR = DEBITOS - CREDITOS;
      if (MESAUX = '05') then
        MVMAY = DEBITOS - CREDITOS;
      if (MESAUX = '06') then
        MVJUN = DEBITOS - CREDITOS;
      if (MESAUX = '07') then
        MVJUL = DEBITOS - CREDITOS;
      if (MESAUX = '08') then
        MVAGO = DEBITOS - CREDITOS;
      if (MESAUX = '09') then
        MVSEP = DEBITOS - CREDITOS;
      if (MESAUX = '10') then
        MVOCT = DEBITOS - CREDITOS;
      if (MESAUX = '11') then
        MVNOV = DEBITOS - CREDITOS;
      if (MESAUX = '12') then
        MVDIC = DEBITOS - CREDITOS;
      if (MESAUX = '13') then
        MVCIE = DEBITOS - CREDITOS;
      END
    FINAL = INICIAL + MVENE + MVFEB + MVMAR + MVABR + MVMAY + MVJUN + MVJUL + MVAGO + MVSEP + MVOCT + MVNOV + MVDIC + MVCIE;
    EXECUTE PROCEDURE VALIDE_ESTRUCTURA (CODIGO) RETURNING_VALUES (:NIVEL);
    SUSPEND;
    END
   ELSE
    BEGIN
    EXECUTE PROCEDURE VALIDE_ESTRUCTURA (CODIGO) RETURNING_VALUES (:NIVEL);
    FOR SELECT TERC_NIT, TERC_NOM FROM TERCEROS T
        WHERE EXISTS (SELECT E.ENCO_CONSEC FROM comprobante_encabezado E, COMPROBANTE_DETALLE D
        WHERE E.enco_consec = D.enco_consec AND D.TERC_NIT = T.terc_nit and substring(e.enco_fecha from 1 for 4) = :ano
        and d.cuen_cod >= :ctaini and d.cuen_cod <= :ctafin)
        ORDER BY TERC_NIT
        INTO :nit, :nomterc
        DO
        BEGIN
        EXECUTE PROCEDURE saldo_tercero_mes(CODIGO, NIT, ANO, 1, 'S') RETURNING_VALUES (INICIAL);
        MVENE = 0;
        MVFEB = 0;
        MVMAR = 0;
        MVABR = 0;
        MVMAY = 0;
        MVJUN = 0;
        MVJUL = 0;
        MVAGO = 0;
        MVSEP = 0;
        MVOCT = 0;
        MVNOV = 0;
        MVDIC = 0;
        MVCIE = 0;
        FOR SELECT MAX(substr(SACU_FECHA, 5, 6)), SUM(SATE_DEBITO), SUM(SATE_CREDITO) FROM saldos_terceros
          WHERE CUEN_COD = :CODIGO AND TERC_NIT = :nit AND :ANO = SUBSTR(SACU_FECHA, 1, 4)
          GROUP by substr(SACU_FECHA, 5, 6)
          INTO :MESAUX, :DEBITOS, :CREDITOS
          DO
          BEGIN
          if (MESAUX = '01') then
            MVENE = DEBITOS - CREDITOS;
          if (MESAUX = '02') then
            MVFEB = DEBITOS - CREDITOS;
          if (MESAUX = '03') then
            MVMAR = DEBITOS - CREDITOS;
          if (MESAUX = '04') then
            MVABR = DEBITOS - CREDITOS;
          if (MESAUX = '05') then
            MVMAY = DEBITOS - CREDITOS;
          if (MESAUX = '06') then
            MVJUN = DEBITOS - CREDITOS;
          if (MESAUX = '07') then
            MVJUL = DEBITOS - CREDITOS;
          if (MESAUX = '08') then
            MVAGO = DEBITOS - CREDITOS;
          if (MESAUX = '09') then
            MVSEP = DEBITOS - CREDITOS;
          if (MESAUX = '10') then
            MVOCT = DEBITOS - CREDITOS;
          if (MESAUX = '11') then
            MVNOV = DEBITOS - CREDITOS;
          if (MESAUX = '12') then
            MVDIC = DEBITOS - CREDITOS;
          if (MESAUX = '13') then
            MVCIE = DEBITOS - CREDITOS;
          END
        FINAL = INICIAL + MVENE + MVFEB + MVMAR + MVABR + MVMAY + MVJUN + MVJUL + MVAGO + MVSEP + MVOCT + MVNOV + MVDIC + MVCIE;
        SUSPEND;
        END
    END
   END
END
^

SET TERM ; ^


/* 20100522 */
SET TERM ^ ;

CREATE OR ALTER procedure VENTAS_POR_HORA_ARTICULO (
    FECINI date,
    FECFIN date,
    ARTINI VARCHAR(20),
    ARTFIN VARCHAR(20),
    ORDEN CHAR(1))
returns (
    FECHA date,
    DIASEM varchar(15),
    HORA integer,
    CODIGO VARCHAR(20),
    DESCRIPCION VARCHAR(60),
    CANT NUMERIC(18,4),
    UNIDAD VARCHAR(8),
    SUBTOTAL numeric(18,2))
AS
declare variable DIA INTEGER;
begin
if (ORDEN = 'F') then
    FOR SELECT MAX(FACT_FECHA), MAX(EXTRACT(HOUR from AUDI_HORA)), SUM(FADE_TOTAL-FADE_IVAMONTO), MAX(EXTRACT(WEEKDAY from FACT_FECHA)),
        MAX(D.arti_cod), MAX(A.arti_des), MAX(A.arti_unidad), SUM(FADE_CANT * FADE_FACTOR)
        FROM FACTURAS F, FACTURAS_DETALLE D, auditoria AU, articulo A
        WHERE F.fact_id = D.fact_id AND D.arti_cod = A.arti_cod AND F.fact_fecha >= :FECINI AND F.fact_fecha <= :FECFIN AND
        F.fact_id = AU.audi_iddoc AND AU.tido_cod = 31 AND AU.audi_oper = 'I' AND A.arti_cod >= :artini AND A.arti_cod <= :artfin
        GROUP BY F.fact_fecha, EXTRACT(HOUR FROM AU.audi_hora), D.arti_cod
        INTO :FECHA, :HORA, :SUBTOTAL, :DIA, :CODIGO, :descripcion, :unidad, :cant
        DO
        BEGIN
        if (DIA = 0) then
            DIASEM = 'DOMINGO';
        if (DIA = 1) then
            DIASEM = 'LUNES';
        if (DIA = 2) then
            DIASEM = 'MARTES';
        if (DIA = 3) then
            DIASEM = 'MIERCOLES';
        if (DIA = 4) then
            DIASEM = 'JUEVES';
        if (DIA = 5) then
            DIASEM = 'VIERNES';
        if (DIA = 6) then
            DIASEM = 'SABADO';
        SUSPEND;
        END
ELSE
  if (ORDEN = 'A') then
    FOR SELECT MAX(FACT_FECHA), MAX(EXTRACT(HOUR from AUDI_HORA)), SUM(FADE_TOTAL-FADE_IVAMONTO), MAX(EXTRACT(WEEKDAY from FACT_FECHA)),
        MAX(D.arti_cod), MAX(A.arti_des), MAX(A.arti_unidad), SUM(FADE_CANT * FADE_FACTOR)
        FROM FACTURAS F, FACTURAS_DETALLE D, auditoria AU, articulo A
        WHERE F.fact_id = D.fact_id AND D.arti_cod = A.arti_cod AND F.fact_fecha >= :FECINI AND F.fact_fecha <= :FECFIN AND
        F.fact_id = AU.audi_iddoc AND AU.tido_cod = 31 AND AU.audi_oper = 'I' AND A.arti_cod >= :artini AND A.arti_cod <= :artfin
        GROUP BY D.arti_cod, F.fact_fecha, EXTRACT(HOUR FROM AU.audi_hora)
        INTO :FECHA, :HORA, :SUBTOTAL, :DIA, :CODIGO, :descripcion, :unidad, :cant
        DO
        BEGIN
        if (DIA = 0) then
            DIASEM = 'DOMINGO';
        if (DIA = 1) then
            DIASEM = 'LUNES';
        if (DIA = 2) then
            DIASEM = 'MARTES';
        if (DIA = 3) then
            DIASEM = 'MIERCOLES';
        if (DIA = 4) then
            DIASEM = 'JUEVES';
        if (DIA = 5) then
            DIASEM = 'VIERNES';
        if (DIA = 6) then
            DIASEM = 'SABADO';
        SUSPEND;
        END
  else
    FOR SELECT MAX(FACT_FECHA), MAX(EXTRACT(HOUR from AUDI_HORA)), SUM(FACT_TOTAL-FACT_IVAMONTO), MAX(EXTRACT(WEEKDAY from FACT_FECHA))
        FROM FACTURAS F, auditoria A
        WHERE F.fact_id = A.audi_iddoc AND A.tido_cod = 31 AND A.audi_oper = 'I' AND F.fact_fecha >= :FECINI AND F.fact_fecha <= :FECFIN
        GROUP BY F.fact_fecha, EXTRACT(HOUR FROM A.audi_hora)
        INTO :FECHA, :HORA, :SUBTOTAL, :DIA
        DO
        BEGIN
        if (DIA = 0) then
            DIASEM = 'DOMINGO';
        if (DIA = 1) then
            DIASEM = 'LUNES';
        if (DIA = 2) then
            DIASEM = 'MARTES';
        if (DIA = 3) then
            DIASEM = 'MIERCOLES';
        if (DIA = 4) then
            DIASEM = 'JUEVES';
        if (DIA = 5) then
            DIASEM = 'VIERNES';
        if (DIA = 6) then
            DIASEM = 'SABADO';
        SUSPEND;
        END
end
^

SET TERM ; ^


grant execute on procedure ventas_por_hora_articulo to public;

/* 20100524 */
/* si autoretenedor no validar retenciones contra el saldo */
/* SI FECHA AUTORETENEDOR VACIA DABA ERROR STRING CONVERSION '' */
SET TERM ^ ;

CREATE OR ALTER TRIGGER APLICACION_CLIENTE_DETALLE_AI FOR APLICACION_CLIENTE_DETALLE
ACTIVE AFTER INSERT POSITION 0
AS
declare variable EXISTE CHAR(1);
declare variable FEC DATE;
declare variable NIT VARCHAR(20);
declare variable CONCEPTO VARCHAR(60);
declare variable PREFIJO VARCHAR(4);
declare variable NUMERO VARCHAR(6);
declare variable SALDO NUMERIC(18,2);
declare variable RETES CHAR(2);
declare variable SUCURSAL VARCHAR(10);
declare variable COBR INTEGER;
declare variable TRM NUMERIC(18,2);
declare variable FECRET DATE;
declare variable AUTORET VARCHAR(10);
BEGIN
if ((NEW.APCL_ID <> 0) and (new.acde_anulado = 'N')) then
    BEGIN
    /* Abone el documento referenciado */
    select PREF_PRE, APCL_NUMERO, apcl_fecha, APCL_CONCEPTO, TERC_NIT, APCL_SUCURSAL, COBR_COD, APCL_TRM
        from aplicacion_cliente where apcl_id = new.apcl_id
        into :PREFIJO, :NUMERO, :FEC, :CONCEPTO, :NIT, :SUCURSAL, :COBR, :TRM;
    /* valide que no se pase del saldo */
    execute procedure saldo_doc_cartera(new.acde_tipodoc, new.acde_iddoc, '9999/12/31', 0) returning_values(saldo);
    execute procedure lee_configuracion('CARTERA', 'SALDOS', 'DESCONTAR RETENCIONES POR CAUSACION') returning_values (RETES);
    execute procedure lee_configuracion('CARTERA', 'SALDOS', 'FECHA AUTORETENEDOR NO DESCONTAR RETENCIONES DEL SALDO PERO SI CONTABILIZARLAS') returning_values (AUTORET);
    if (AUTORET <> '') then
        FECRET = CAST(AUTORET AS DATE);
    else
        FECRET = '9999/12/31';
    if (SALDO = 0) then
      EXCEPTION DOCUMENTO_ABONO_MAYOR 'EL SALDO DEL DOCUMENTO ' || NEW.acde_prefijo || NEW.acde_numero || ' ES INSUFICIENTE.';
    else
      if (SALDO < 0) then
        BEGIN
        if ((RETES = 'SI') or (:FECRET < :FEC)) then
            begin
            if (saldo > (NEW.acde_aplicado + NEW.acde_difcambio)) then
                EXCEPTION DOCUMENTO_ABONO_MAYOR 'EL SALDO DEL DOCUMENTO ' || NEW.acde_prefijo || NEW.acde_numero || ' ES INSUFICIENTE.';
            end
        ELSE
            begin
            if (saldo > (NEW.acde_aplicado + NEW.acde_rtfte + NEW.acde_rtiva + NEW.acde_rtica + NEW.acde_difcambio)) then
                EXCEPTION DOCUMENTO_ABONO_MAYOR 'EL SALDO DEL DOCUMENTO ' || NEW.acde_prefijo || NEW.acde_numero || ' ES INSUFICIENTE.';
            end
        END
      else
        BEGIN
        if ((RETES = 'SI') or (:FECRET < :FEC)) then
            begin
            if (saldo < (NEW.acde_aplicado + NEW.acde_difcambio)) then
                EXCEPTION DOCUMENTO_ABONO_MAYOR 'EL SALDO DEL DOCUMENTO ' || NEW.acde_prefijo || NEW.acde_numero || ' ES INSUFICIENTE.';
            end
        ELSE
            begin
            if (saldo < (NEW.acde_aplicado + NEW.acde_rtfte + NEW.acde_rtiva + NEW.acde_rtica + NEW.acde_difcambio)) then
                EXCEPTION DOCUMENTO_ABONO_MAYOR 'EL SALDO DEL DOCUMENTO ' || NEW.acde_prefijo || NEW.acde_numero || ' ES INSUFICIENTE.';
            end
        END
    select 'S' from saldos_doc_cartera where sdca_tiporef = new.acde_tipodoc and sdca_idref = new.acde_iddoc and sdca_fecha = :FEC into :EXISTE;
    if (Existe = 'S') then
        begin
        /* actualice el saldo del dia */
        UPDATE saldos_doc_cartera
            SET SDCA_ABONO = SDCA_ABONO + NEW.acde_aplicado + NEW.acde_difcambio,
                SDCA_ABRTFTE = SDCA_ABRTFTE + NEW.acde_RTFTE,
                SDCA_ABRTIVA = SDCA_ABRTIVA + NEW.acde_RTIVA,
                SDCA_ABRTICA = SDCA_ABRTICA + NEW.acde_RTICA,
                SDCA_TRM = :TRM
            WHERE SDCA_TIPOREF = NEW.ACDE_TIPODOC AND SDCA_IDREF = NEW.acde_IDDOC AND SDCA_FECHA = :FEC;
        END
    ELSE
        BEGIN
        /* Inserte un nuevo saldo diario */
        INSERT INTO SALDOS_DOC_CARTERA (SDCA_TIPOREF, SDCA_IDREF, SDCA_FECHA, TERC_NIT, SDCA_RTFTE, SDCA_RTIVA, SDCA_RTICA, SDCA_ABONO, SDCA_ABRTFTE, SDCA_ABRTIVA, SDCA_ABRTICA, SDCA_DEBITO, SDCA_MONTO, SDCA_TRM)
            VALUES (NEW.ACDE_TIPODOC, NEW.ACDE_IDDOC, :FEC, :NIT, 0, 0, 0, (NEW.acde_aplicado + NEW.acde_difcambio), NEW.acde_rtfte, NEW.acde_rtiva, NEW.acde_rtica, 'N', 0, :TRM);
        END
    /* actualice el registro en mov_cliente (por si son varios items) */
    EXISTE = 'N';
    SELECT 'S' FROM MOVIMIENTO_CLIENTES WHERE MVCL_TIPOREF = 43 AND MVCL_IDREF = NEW.APCL_ID INTO :EXISTE;
    if (EXISTE = 'S') then
        begin
        UPDATE movimiento_clientes
            SET MVCL_MONTO = MVCL_MONTO + NEW.acde_aplicado + NEW.acde_difcambio,
                MVCL_RTEFTE = MVCL_RTEFTE + NEW.acde_rtfte,
                MVCL_RTEIVA = MVCL_RTEIVA + NEW.acde_rtiva,
                MVCL_RTEICA = MVCL_RTEICA + NEW.acde_rtica,
                MVCL_TRM = :TRM
            WHERE MVCL_TIPOREF = 43 AND MVCL_IDREF = NEW.APCL_ID;
        end
    ELSE
        INSERT INTO MOVIMIENTO_CLIENTES (MVCL_ID, TERC_NIT, MVCL_TIPOREF, MVCL_IDREF, MVCL_FECHA, MVCL_VENCE, MVCL_CONC, MVCL_MONTO, MVCL_RTEFTE, MVCL_RTEIVA, MVCL_RTEICA, MVCL_DEBITO, MVCL_ABONO, MVCL_PREFREF, MVCL_NUMREF, MVCL_SUCURSAL, COBR_COD, MVCL_TRM)
            VALUES (GEN_ID(ID_MOVCLI, 1), :NIT, 43, NEW.APCL_ID, :FEC, :FEC, :CONCEPTO, (NEW.ACDE_APLICADO + NEW.acde_difcambio), NEW.ACDE_RTFTE, NEW.ACDE_RTIVA, NEW.ACDE_RTICA, 'N', 'S', :PREFIJO, :NUMERO, :SUCURSAL, :COBR, :TRM);

    INSERT INTO notas_documento (NODO_ID, TIDO_COD, NODO_IDDOC, NODO_FECHA, NODO_USER, NODO_RESUMEN, NODO_TIPO)
        VALUES (GEN_ID(id_notadoc, 1), new.acde_tipodoc, new.acde_iddoc, :fec, user, 'Aplicación No. ' || :prefijo || :numero, 4);
    end
END
^

SET TERM ; ^


/* 20100527 */
/* ERROR FALTANTES REMISIONES VS FACTURA MAL TIPO 33 DEBE SER 32 */
SET TERM ^ ;

CREATE OR ALTER procedure REP_FALTANTES_CLIENTES (
    TERINI varchar(20),
    TERFIN varchar(20),
    FECINI date,
    FECFIN date,
    DETALLE char(1),
    TIPO integer,
    DESTINO integer,
    ARTINI varchar(15),
    ARTFIN varchar(15),
    ORDEN char(1),
    CEROS char(1),
    SUBEMPRESA integer)
returns (
    NIT varchar(20),
    SUCURSAL varchar(10),
    NOMBRE varchar(60),
    TELEFONO varchar(40),
    CIUDAD varchar(40),
    CODZONA varchar(2),
    NOMZONA varchar(30),
    NOMTIPO varchar(50),
    ARTICULO varchar(15),
    DESCRIPCION varchar(60),
    CODGRUPO varchar(2),
    NOMGRUPO varchar(30),
    CODSUBG varchar(3),
    NOMSUBG varchar(30),
    CODMARC varchar(3),
    NOMMARC varchar(30),
    CANTIDAD numeric(18,4),
    UNIDAD varchar(8),
    FALTANTE numeric(18,4),
    BASE numeric(18,2),
    IVA numeric(18,2),
    PREFIJO varchar(4),
    NUMERO varchar(6),
    FECHA date,
    OBS varchar(255))
AS
declare variable ID INTEGER;
declare variable ITEM INTEGER;
declare variable CODINI VARCHAR(15);
declare variable CODFIN VARCHAR(15);
declare variable DESINI VARCHAR(15);
declare variable DESFIN VARCHAR(15);
declare variable FACTOR NUMERIC(18,4);
declare variable CANT NUMERIC(18,4);
declare variable MONTO NUMERIC(18,2);
declare variable artiaux VARCHAR(20);
BEGIN
if (ORDEN = 'C') then
    BEGIN
    CODINI = ARTINI;
    CODFIN = ARTFIN;
    DESINI = '';
    DESFIN = 'zz';
    END
ELSE
    BEGIN
    DESINI = ARTINI;
    DESFIN = ARTFIN;
    CODINI = '';
    CODFIN = 'zz';
    END
SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = :TIPO INTO :NOMTIPO;
/*FOR select T.TERC_NIT, TERC_NOM,  TERC_TEL, TERC_CIU, ZONA_COD
    from terceros T, CLIENTES C*/
FOR select c.terc_nit,s.clsu_nombre,s.clsu_tel,s.clsu_ciudad,s.zona_cod,s.clcu_cod
    from clientes c, cliente_sucursales s
    where C.TERC_NIT = s.TERC_NIT and C.TERC_NIT >= :TERINI AND C.TERC_NIT <= :TERFIN
    INTO :NIT, :NOMBRE, :TELEFONO, :CIUDAD, :CODZONA, :sucursal
    DO  
    BEGIN
    CANTIDAD = 0;
    FALTANTE = 0;
    BASE = 0;
    SELECT ZONA_NOM FROM ZONAS WHERE ZONA_COD = :CODZONA INTO :NOMZONA;
    if (DETALLE = 'N') then
        BEGIN
        ARTICULO = '';
        if (TIPO = 31) then
            FOR SELECT F.FACT_ID, FADE_ITEM, D.ARTI_COD, FADE_CANT * FADE_FACTOR, (FADE_PRUNIT-FADE_DTOMONTO)
                FROM FACTURAS_DETALLE D, FACTURAS F, ARTICULO A, PREFIJOS P
                WHERE F.FACT_ID = D.FACT_ID AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND TERC_NIT = :NIT AND FACT_ANULADO = 'N' AND
                      D.ARTI_COD = A.ARTI_COD AND D.ARTI_COD >= :CODINI AND D.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
                      P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND ((P.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) and f.fact_sucursal = :sucursal and substring(a.arti_cod from 1 FOR 2) <> '.t'
                ORDER BY ARTI_COD, F.FACT_ID, FADE_ITEM INTO :ID, :ITEM, :ARTIAUX, :CANT,  :MONTO
                DO
                BEGIN
                if (artiaux <> articulo) then
                    begin
                    if (ARTICULO <> '') then
                        SUSPEND;
                    SELECT ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                        FROM articulo WHERE ARTI_COD = :ARTIAUX
                        INTO :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC;
                    SELECT GRUP_NOM FROM GRUPO WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    ARTICULO = ARTIAUX;
                    CANTIDAD = 0;
                    FALTANTE = 0;
                    BASE = 0;
                    end
                CANTIDAD = CANTIDAD + CANT;
                EXECUTE PROCEDURE FALTANTE(:TIPO, :DESTINO, :ID, :ITEM) returning_values (:CANT, :UNIDAD, :FACTOR);
                FALTANTE = FALTANTE + CANT;
                BASE = BASE + (MONTO * CANT);
                END
        if (TIPO = 32) then
            FOR SELECT R.revt_id, rvde_item, D.ARTI_COD, RVDE_CANT * RVDE_FACTOR, (RVDE_PRUNIT-RVDE_DTOMONTO)
                FROM REMISIONES_VENTA_DETALLE D, REMISIONES_VENTA R, ARTICULO A, PREFIJOS P
                WHERE R.REVT_ID = D.REVT_ID AND REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN AND TERC_NIT = :NIT AND REVT_ANULADO = 'N' AND
                      D.ARTI_COD = A.ARTI_COD AND D.ARTI_COD >= :CODINI AND D.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
                      P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = 32 AND ((P.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) and r.revt_sucursal = :sucursal
                ORDER BY ARTI_COD, R.REVT_ID, RVDE_ITEM INTO :ID, :ITEM, :ARTIAUX, :CANT, :MONTO
                DO
                BEGIN
                if (artiaux <> articulo) then
                    begin
                    if (ARTICULO <> '') then
                        SUSPEND;
                    SELECT ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                        FROM articulo WHERE ARTI_COD = :ARTIAUX
                        INTO :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC;
                    SELECT GRUP_NOM FROM GRUPO WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    ARTICULO = ARTIAUX;
                    CANTIDAD = 0;
                    FALTANTE = 0;
                    BASE = 0;
                    end
                CANTIDAD = CANTIDAD + CANT;
                EXECUTE PROCEDURE FALTANTE(:TIPO, :DESTINO, :ID, :ITEM) returning_values (:CANT, :UNIDAD, :FACTOR);
                FALTANTE = FALTANTE + CANT;
                BASE = BASE + (MONTO * CANT);
                END
        if (TIPO = 34) then
            FOR SELECT P.PEDI_ID, PEDE_ITEM, D.ARTI_COD, PEDE_CANT * PEDE_FACTOR, (PEDE_PRUNIT-PEDE_DTOMONTO)
                FROM PEDIDOS_DETALLE D, PEDIDOS P, ARTICULO A, PREFIJOS PR
                WHERE P.PEDI_ID = D.PEDI_ID AND PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND TERC_NIT = :NIT AND PEDI_ANULADO = 'N' AND
                      D.ARTI_COD = A.ARTI_COD AND D.ARTI_COD >= :CODINI AND D.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
                      PR.PREF_PRE = P.PREF_PRE AND PR.TIDO_COD = 34 AND ((PR.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) and p.pedi_sucursal = :sucursal
                ORDER BY ARTI_COD, P.PEDI_ID, PEDE_ITEM INTO :ID, :ITEM, :ARTIAUX, :CANT, :MONTO
                DO
                BEGIN
                if (artiaux <> articulo) then
                    begin
                    if (ARTICULO <> '') then
                        SUSPEND;
                    SELECT ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                        FROM articulo WHERE ARTI_COD = :ARTIAUX
                        INTO :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC;
                    SELECT GRUP_NOM FROM GRUPO WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    ARTICULO = ARTIAUX;
                    CANTIDAD = 0;
                    FALTANTE = 0;
                    BASE = 0;
                    end
                CANTIDAD = CANTIDAD + CANT;
                EXECUTE PROCEDURE FALTANTE(:TIPO, :DESTINO, :ID, :ITEM) returning_values (:CANT, :UNIDAD, :FACTOR);
                FALTANTE = FALTANTE + CANT;
                BASE = BASE + (MONTO * CANT);
                END
        if (TIPO = 35) then
            FOR SELECT C.COTI_ID, CTDE_ITEM, D.ARTI_COD, CTDE_CANT * CTDE_FACTOR, (CTDE_PRUNIT-CTDE_DTOMONTO)
                FROM COTIZACIONES_DETALLE D, COTIZACIONES C, ARTICULO A, PREFIJOS P
                WHERE C.COTI_ID = D.COTI_ID AND COTI_FECHA >= :FECINI AND COTI_FECHA <= :FECFIN AND TERC_NIT = :NIT AND COTI_ANULADO = 'N' AND
                      D.ARTI_COD = A.ARTI_COD AND D.ARTI_COD >= :CODINI AND D.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
                      P.PREF_PRE = C.PREF_PRE AND P.TIDO_COD = 35 AND ((P.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) and c.coti_sucursal = :sucursal
                ORDER BY ARTI_COD, C.COTI_ID, CTDE_ITEM INTO :ID, :ITEM, :ARTIAUX, :CANT, :MONTO
                DO
                BEGIN
                if (artiaux <> articulo) then
                    begin
                    if (ARTICULO <> '') then
                        SUSPEND;
                    SELECT ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                        FROM articulo WHERE ARTI_COD = :ARTIAUX
                        INTO :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC;
                    SELECT GRUP_NOM FROM GRUPO WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    ARTICULO = ARTIAUX;
                    CANTIDAD = 0;
                    FALTANTE = 0;
                    BASE = 0;
                    end
                CANTIDAD = CANTIDAD + CANT;
                EXECUTE PROCEDURE FALTANTE(:TIPO, :DESTINO, :ID, :ITEM) returning_values (:CANT, :UNIDAD, :FACTOR);
                FALTANTE = FALTANTE + CANT;
                BASE = BASE + (MONTO * CANT);
                END
        if (FALTANTE IS NULL) then
            FALTANTE = 0;
        if (BASE IS NULL) then
            BASE = 0;
        if (IVA IS NULL) then
            IVA = 0;
        if ((CEROS = 'S') or (FALTANTE <> 0)) then
            SUSPEND;
        END
    ELSE
        BEGIN
        if (TIPO = 31) then
            FOR SELECT F.FACT_ID, FADE_ITEM, F.PREF_PRE, FACT_NUMERO, FACT_FECHA, FADE_CANT * FADE_FACTOR, (FADE_PRUNIT-FADE_DTOMONTO), FADE_IVAMONTO, D.ARTI_COD, ARTI_DES, ARTI_UNIDAD, A.GRUP_COD, A.SUBG_COD, A.MARC_COD, SUBSTRING(FACT_OBS FROM 1 FOR 255)
                FROM FACTURAS F, FACTURAS_DETALLE D, ARTICULO A, PREFIJOS P
                WHERE F.FACT_ID = D.FACT_ID AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN  AND TERC_NIT = :NIT AND FACT_ANULADO = 'N' AND
                      D.ARTI_COD = A.ARTI_COD AND D.ARTI_COD >= :CODINI AND D.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
                      P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND ((P.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) and f.fact_sucursal = :sucursal and substring(a.arti_cod from 1 FOR 2) <> '.t'
                ORDER BY D.ARTI_COD, F.FACT_ID, FADE_ITEM
                INTO :ID, :ITEM, :PREFIJO, :NUMERO, :FECHA, :CANTIDAD, :BASE, :IVA, :ARTICULO, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :OBS
                DO
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    EXECUTE PROCEDURE FALTANTE(:TIPO, :DESTINO, :ID, :ITEM) returning_values (:FALTANTE, :UNIDAD, :FACTOR);
                    if ((CEROS = 'S') or (FALTANTE <> 0)) then
                        SUSPEND;
                    END
        if (TIPO = 32) then
            FOR SELECT R.REVT_ID, RVDE_ITEM, R.PREF_PRE, REVT_NUMERO, REVT_FECHA, RVDE_CANT * RVDE_FACTOR, (RVDE_PRUNIT-RVDE_DTOMONTO), RVDE_IVAMONTO, D.ARTI_COD, ARTI_DES, ARTI_UNIDAD, A.GRUP_COD, A.SUBG_COD, A.MARC_COD, SUBSTRING(REVT_OBS FROM 1 FOR 255)
                FROM REMISIONES_VENTA R, REMISIONES_VENTA_DETALLE D, ARTICULO A, PREFIJOS P
                WHERE R.REVT_ID = D.REVT_ID AND REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN AND TERC_NIT = :NIT AND REVT_ANULADO = 'N' AND
                      D.ARTI_COD = A.ARTI_COD AND D.ARTI_COD >= :CODINI AND D.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
                      P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = 32 AND ((P.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) and r.revt_sucursal = :sucursal
                ORDER BY D.ARTI_COD, R.REVT_ID, RVDE_ITEM
                INTO :ID, :ITEM, :PREFIJO, :NUMERO, :FECHA, :CANTIDAD, :BASE, :IVA, :ARTICULO, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :OBS
                DO
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    EXECUTE PROCEDURE FALTANTE(:TIPO, :DESTINO, :ID, :ITEM) returning_values (:FALTANTE, :UNIDAD, :FACTOR);
                    if ((CEROS = 'S') or (FALTANTE <> 0)) then
                        SUSPEND;
                    END
        if (TIPO = 34) then
            FOR SELECT P.PEDI_ID, PEDE_ITEM, P.PREF_PRE, PEDI_NUMERO, PEDI_FECHA, PEDE_CANT * PEDE_FACTOR, (PEDE_PRUNIT-PEDE_DTOMONTO), PEDE_IVAMONTO, D.ARTI_COD, ARTI_DES, ARTI_UNIDAD, A.GRUP_COD, A.SUBG_COD, A.MARC_COD, SUBSTRING(PEDI_OBS FROM 1 FOR 255)
                FROM PEDIDOS P, PEDIDOS_DETALLE D, ARTICULO A, PREFIJOS PR
                WHERE P.PEDI_ID = D.PEDI_ID AND PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND TERC_NIT = :NIT AND PEDI_ANULADO = 'N' AND
                      D.ARTI_COD = A.ARTI_COD AND D.ARTI_COD >= :CODINI AND D.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
                      P.PREF_PRE = PR.PREF_PRE AND PR.TIDO_COD = 34 AND ((PR.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) and p.pedi_sucursal = :sucursal
                ORDER BY D.ARTI_COD, P.PEDI_ID, PEDE_ITEM
                INTO :ID, :ITEM, PREFIJO, :NUMERO, :FECHA, :CANTIDAD, :BASE, :IVA, :ARTICULO, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :OBS
                DO
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    EXECUTE PROCEDURE FALTANTE(:TIPO, :DESTINO, :ID, :ITEM) returning_values (:FALTANTE, :UNIDAD, :FACTOR);
                    if ((CEROS = 'S') or (FALTANTE <> 0)) then
                        SUSPEND;
                    END
        if (TIPO = 35) then
            FOR SELECT C.COTI_ID, CTDE_ITEM, C.PREF_PRE, COTI_NUMERO, COTI_FECHA, CTDE_CANT * CTDE_FACTOR, (CTDE_PRUNIT-CTDE_DTOMONTO), CTDE_IVAMONTO, D.ARTI_COD, ARTI_DES, ARTI_UNIDAD, A.GRUP_COD, A.SUBG_COD, A.MARC_COD, SUBSTRING(COTI_OBS FROM 1 FOR 255)
                FROM COTIZACIONES C, COTIZACIONES_DETALLE D, ARTICULO A, PREFIJOS P
                WHERE C.COTI_ID = D.COTI_ID AND COTI_FECHA >= :FECINI AND COTI_FECHA <= :FECFIN AND TERC_NIT = :NIT AND COTI_ANULADO = 'N' AND
                      D.ARTI_COD = A.ARTI_COD AND D.ARTI_COD >= :CODINI AND D.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
                      P.PREF_PRE = C.PREF_PRE AND P.TIDO_COD = 35 AND ((P.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) and c.coti_sucursal = :sucursal
                ORDER BY D.ARTI_COD, C.COTI_ID, CTDE_ITEM
                INTO :ID, :ITEM, PREFIJO, :NUMERO, :FECHA, :CANTIDAD, :BASE, :IVA, :ARTICULO, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :OBS
                DO
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    EXECUTE PROCEDURE FALTANTE(:TIPO, :DESTINO, :ID, :ITEM) returning_values (:FALTANTE, :UNIDAD, :FACTOR);
                    if ((CEROS = 'S') or (FALTANTE <> 0)) then
                        SUSPEND;
                    END
        END
    END
END
^

SET TERM ; ^



/* 20100529 */
alter table PLAN_PRODUCCION_DET
add constraint FK_PLAN_PRODUCCION_DET_1
foreign key (PLPR_ID)
references PLAN_PRODUCCION(PLPR_ID)
on delete CASCADE
on update CASCADE;

alter table PLAN_PRODUCCION_CONS
add constraint FK_PLAN_PRODUCCION_CONS_1
foreign key (PLPD_ID)
references PLAN_PRODUCCION(PLPR_ID)
on delete CASCADE
on update CASCADE;

SET TERM ^ ;

CREATE OR ALTER TRIGGER PLAN_PRODUCCION_DET_AI FOR PLAN_PRODUCCION_DET
ACTIVE AFTER INSERT POSITION 0
as
declare variable descr VARCHAR(60);
declare variable MERMA NUMERIC(18,4);
declare variable PESOCMP NUMERIC(18,4);
declare variable TOTAL FLOAT;
declare variable FACTOR FLOAT;
declare variable CODCMP VARCHAR(20);
declare variable CANTPRO NUMERIC(18,4);
declare variable CANTCMP NUMERIC(18,4);
declare variable CANTSOB NUMERIC(18,4);
declare variable UNDCMP VARCHAR(8);
declare variable PORCMP FLOAT;
declare variable entrada CHAR(1);
declare variable i integer;
declare variable sobrante varchar(15);
declare variable porsob numeric(9,4);
declare variable REUSO CHAR(1);
declare variable ITEM INTEGER;
declare variable NUMROWS INTEGER;
declare variable TIPOORD INTEGER;
BEGIN
if ((NEW.plpr_id <> 0) and (new.plpd_anulado = 'N')) then
    BEGIN
    CANTPRO = NEW.plpd_cant * NEW.plpd_factor;
    select plpr_entrada from plan_produccion where plpr_id = new.plpr_id into :entrada;
    if (entrada = 'S') then
        begin
        i = 0;
        select arti_sobrante, arti_porcsobr, ARTI_REUSOB from articulo
            where arti_cod = new.arti_cod into :sobrante, :porsob, :reuso;

        select sum(arpr_porc) from articulos_producto where arti_cod = new.arti_cod into :total;
        FOR SELECT arpr_comp, ARPR_CANT, ARPR_UNIDAD, ARPR_PORC, ARTI_DES, arti_peso, arpr_merma
            from articulos_producto AP, ARTICULO A2
            WHERE AP.arpr_comp = A2.arti_cod AND AP.arti_cod = new.arti_cod ORDER by ARPR_ITEM
            INTO :codcmp, :cantcmp, :undcmp, :porcmp, :descr, :pesocmp, :MERMA
            DO
            BEGIN
            EXECUTE PROCEDURE factor_unidad_cant(:codcmp, :undcmp) returning_values (:FACTOR);
            if (((cantcmp is null) or (cantcmp = 0)) AND (PORCMP IS NOT NULL) AND (porcmp <> 0)) then
                BEGIN
                cantcmp = NEW.plpd_cant * NEW.plpd_factor * NEW.plpd_peso / TOTAL * PORCMP; /* APLICA LA PROPORCION */
                if ((MERMA IS NOT NULL) AND (MERMA <> 0)) then
                    cantcmp = cantcmp * (100 + MERMA) / 100;
                if ((sobrante <> '') and (porsob <> 0) and (sobrante = codcmp) and (reuso = 'N')) then
                    begin
                    cantsob = cantpro * new.plpd_peso;
                    cantsob = cantsob / TOTAL * porsob; /* APLICA LA PROPORCION */
                    cantcmp = cantcmp + cantsob;
                    end
                END
            ELSE
                BEGIN
                cantcmp = cantcmp * FACTOR * pesocmp * NEW.plpd_cant * NEW.plpd_factor;
                END

            i = i + 1;
            insert into plan_produccion_productos (plpr_id, plpd_item, plpp_nrocmop, arpr_comp, arpr_cant, arpr_porc, arpr_unidad, arpr_merma, arti_peso)
                values(new.plpr_id, new.plpd_item, :i, :codcmp,  :cantcmp, :porcmp, :undcmp, :merma, :pesocmp);

            SELECT COUNT(ARTI_COD) FROM articulos_producto WHERE ARTI_COD = :codcmp INTO :NUMROWS;
            if (NUMROWS <> 0) then
               TIPOORD = 19;
            else
                TIPOORD = 24;

            /* INSERTE O ACTUALICE EL COMPONENTE */
            if (NOT EXISTS (SELECT PLPC_ITEM FROM plan_produccion_cons WHERE PLPD_ID = new.plpr_id AND ARTI_COD = :codcmp)) then
                BEGIN
                select max(plpc_item) from plan_produccion_cons where PLPD_ID = new.plpr_id into :item;
                if (item is null) then
                    item = 0;
                item = item + 1;
                INSERT INTO plan_produccion_cons (PLPD_ID, PLPC_ITEM, PLPC_CODBAR, ARTI_COD, PLPC_CANT, PLPC_UNIDAD, PLPC_EXIST, PLPC_ORDENAR, PLPC_ORDENTIPO, PLPC_ORDENID, PLPC_ANULADO, PLPC_TRANSMIT, PLPC_DESC)
                    VALUES (new.plpr_id, :item, :codcmp, :codcmp, :cantcmp, :undcmp, 0, 0, :tipoord, 0, 'N', 'N', :descr);
                END
            ELSE
                UPDATE plan_produccion_cons SET PLPC_CANT = PLPC_CANT + :cantcmp
                    WHERE PLPD_ID = NEW.plpr_id AND ARTI_COD = :codcmp;
            END
        end
    end
end
^

SET TERM ; ^


SET TERM ^ ;

CREATE OR ALTER TRIGGER PLAN_PRODUCCION_DET_AU FOR PLAN_PRODUCCION_DET
ACTIVE AFTER UPDATE POSITION 0
as
declare variable descr VARCHAR(60);
declare variable MERMA NUMERIC(18,4);
declare variable PESOCMP NUMERIC(18,4);
declare variable TOTAL FLOAT;
declare variable FACTOR FLOAT;
declare variable CODCMP VARCHAR(20);
declare variable CANTPRO NUMERIC(18,4);
declare variable CANTCMP NUMERIC(18,4);
declare variable CANTSOB NUMERIC(18,4);
declare variable UNDCMP VARCHAR(8);
declare variable PORCMP FLOAT;
declare variable entrada CHAR(1);
declare variable i integer;
declare variable sobrante varchar(15);
declare variable porsob numeric(9,4);
declare variable REUSO CHAR(1);
declare variable ITEM INTEGER;
declare variable NUMROWS INTEGER;
declare variable TIPOORD INTEGER;
BEGIN
if ((OLD.plpr_id <> 0) and (OLD.plpd_anulado = 'N')) then
    BEGIN
    FOR SELECT arpr_comp, ARPR_CANT
        from plan_produccion_productos where plpr_id = old.plpr_id and plpd_item = old.plpd_item
        INTO :codcmp, :cantcmp
        DO
        BEGIN
        /* INSERTE O ACTUALICE EL COMPONENTE */
        UPDATE plan_produccion_cons SET PLPC_CANT = PLPC_CANT - :cantcmp
            WHERE PLPD_ID = OLD.plpr_id AND ARTI_COD = :codcmp;
        END
    DELETE FROM plan_produccion_productos where plpr_id = old.plpr_id and plpd_item = old.plpd_item;
    END

if ((NEW.plpr_id <> 0) and (new.plpd_anulado = 'N')) then
    BEGIN
    CANTPRO = NEW.plpd_cant * NEW.plpd_factor;
    select plpr_entrada from plan_produccion where plpr_id = new.plpr_id into :entrada;
    if (entrada = 'S') then
        begin
        i = 0;
        select arti_sobrante, arti_porcsobr, ARTI_REUSOB from articulo
            where arti_cod = new.arti_cod into :sobrante, :porsob, :reuso;

        select sum(arpr_porc) from articulos_producto where arti_cod = new.arti_cod into :total;
        FOR SELECT arpr_comp, ARPR_CANT, ARPR_UNIDAD, ARPR_PORC, ARTI_DES, arti_peso, arpr_merma
            from articulos_producto AP, ARTICULO A2
            WHERE AP.arpr_comp = A2.arti_cod AND AP.arti_cod = new.arti_cod ORDER by ARPR_ITEM
            INTO :codcmp, :cantcmp, :undcmp, :porcmp, :descr, :pesocmp, :MERMA
            DO
            BEGIN
            EXECUTE PROCEDURE factor_unidad_cant(:codcmp, :undcmp) returning_values (:FACTOR);
            if (((cantcmp is null) or (cantcmp = 0)) AND (PORCMP IS NOT NULL) AND (porcmp <> 0)) then
                BEGIN
                cantcmp = NEW.plpd_cant * NEW.plpd_factor * NEW.plpd_peso / TOTAL * PORCMP; /* APLICA LA PROPORCION */
                if ((MERMA IS NOT NULL) AND (MERMA <> 0)) then
                    cantcmp = cantcmp * (100 + MERMA) / 100;
                if ((sobrante <> '') and (porsob <> 0) and (sobrante = codcmp) and (reuso = 'N')) then
                    begin
                    cantsob = cantpro * new.plpd_peso;
                    cantsob = cantsob / TOTAL * porsob; /* APLICA LA PROPORCION */
                    cantcmp = cantcmp + cantsob;
                    end
                END
            ELSE
                BEGIN
                cantcmp = cantcmp * FACTOR * pesocmp * NEW.plpd_cant * NEW.plpd_factor;
                END

            i = i + 1;
            insert into plan_produccion_productos (plpr_id, plpd_item, plpp_nrocmop, arpr_comp, arpr_cant, arpr_porc, arpr_unidad, arpr_merma, arti_peso)
                values(new.plpr_id, new.plpd_item, :i, :codcmp,  :cantcmp, :porcmp, :undcmp, :merma, :pesocmp);

            SELECT COUNT(ARTI_COD) FROM articulos_producto WHERE ARTI_COD = :codcmp INTO :NUMROWS;
            if (NUMROWS <> 0) then
               TIPOORD = 19;
            else
                TIPOORD = 24;

            /* INSERTE O ACTUALICE EL COMPONENTE */
            if (NOT EXISTS (SELECT PLPC_ITEM FROM plan_produccion_cons WHERE PLPD_ID = new.plpr_id AND ARTI_COD = :codcmp)) then
                BEGIN
                select max(plpc_item) from plan_produccion_cons where PLPD_ID = new.plpr_id into :item;
                item = item + 1;
                INSERT INTO plan_produccion_cons (PLPD_ID, PLPC_ITEM, PLPC_CODBAR, ARTI_COD, PLPC_CANT, PLPC_UNIDAD, PLPC_EXIST, PLPC_ORDENAR, PLPC_ORDENTIPO, PLPC_ORDENID, PLPC_ANULADO, PLPC_TRANSMIT, PLPC_DESC)
                    VALUES (new.plpr_id, :item, :codcmp, :codcmp, :cantcmp, :undcmp, 0, 0, :tipoord, 0, 'N', 'N', :descr);
                END
            ELSE
                UPDATE plan_produccion_cons SET PLPC_CANT = PLPC_CANT + :cantcmp
                    WHERE PLPD_ID = NEW.plpr_id AND ARTI_COD = :codcmp;
            END
        end
    end
end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER PLAN_PRODUCCION_DET_AD FOR PLAN_PRODUCCION_DET
ACTIVE AFTER DELETE POSITION 0
as
declare variable CODCMP VARCHAR(20);
declare variable CANTCMP NUMERIC(18,4);
begin
if ((OLD.plpr_id <> 0) and (OLD.plpd_anulado = 'N')) then
    BEGIN
    FOR SELECT arpr_comp, ARPR_CANT
        from plan_produccion_productos where plpr_id = old.plpr_id and plpd_item = old.plpd_item
        INTO :codcmp, :cantcmp
        DO
        BEGIN
        /* INSERTE O ACTUALICE EL COMPONENTE */
        UPDATE plan_produccion_cons SET PLPC_CANT = PLPC_CANT - :cantcmp
            WHERE PLPD_ID = OLD.plpr_id AND ARTI_COD = :codcmp;
        END
    DELETE FROM plan_produccion_productos where plpr_id = old.plpr_id and plpd_item = old.plpd_item;
    END
end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER PROCEDURE CONSOLIDE_PRODUCCION(
    PLANID INTEGER)
AS
declare variable item integer;
declare variable item2 integer;
declare variable artic varchar(20);
declare variable cant numeric(18,4);
declare variable cantpro numeric(18,4);
declare variable codcmp varchar(20);
declare variable cantcmp numeric(18,4);
declare variable undcmp varchar(8);
declare variable factor float;
declare variable total float;
declare variable unidad varchar(8);
declare variable costou numeric(18,4);
declare variable porc numeric(18,4);
declare variable merma numeric(18,4);
declare variable costot numeric(18,4);
declare variable pesocmp numeric(18,4);
declare variable pesopro numeric(18,4);
declare variable fec date;
declare variable CONC VARCHAR(60);
declare variable Pref varchar(4);
declare variable Num varchar(6);
declare variable BodOri varchar(2);
declare variable BodDes varchar(2);
declare variable entrada CHAR(1);
declare variable LOTE VARCHAR(20);
BEGIN
select plpr_fecfin, plpr_conc, plpr_pref, plpr_numero, plpr_bodori, plpr_boddes, plpr_entrada
    from plan_produccion where plpr_id = :planid
    into :fec, :conc, :Pref, :Num, :BodOri, :BodDes, :entrada;
/* RECORRA LOS COMPONENTES HACIENDO EL MOVIMIENTO QUE GENRA ENSAMBLES SI ES NECESARIO */
FOR SELECT plpc_item, arti_cod, plpc_cant, plpc_unidad
    from plan_produccion_cons WHERE plpd_id = :PLANID
    into :item, :artic, :cant, :unidad
    do
    BEGIN
    execute procedure factor_unidad_cant(:artic, :unidad) returning_values(factor);
    SELECT ARTI_PESO FROM ARTICULO WHERE ARTI_COD = :artic INTO :pesopro;
    CANTPRO = CANT * FACTOR;
    if (exists (select arpr_item from articulos_producto where arti_cod = :artic)) then
        begin
        select sum(arpr_porc) from articulos_producto where arti_cod = :artic into :total;
        for select arpr_item, arpr_comp, arpr_cant, arpr_unidad, ARPR_PORC, ARPR_MERMA, arti_peso
            from articulos_producto P, ARTICULO A
            where P.arpr_comp = A.arti_cod AND p.arti_cod = :artic ORDER BY P.arpr_item
            into :item2, :codcmp, :cantcmp, :undcmp, :porc, :merma, :pesocmp
            DO
            BEGIN
            execute procedure factor_unidad_cant(:codcmp, :undcmp) returning_values (:factor);
            if (((cantcmp is null) or (cantcmp = 0)) AND (PORC IS NOT NULL) AND (porc <> 0)) then
                BEGIN
                /* ES PORCENTUAL AL PESO LA MEZCLA SOBRE EL 1ER ARTICULO */
                cantcmp = cantpro * pesopro * porc / TOTAL; /* APLICA LA PROPORCION */
                if ((MERMA IS NOT NULL) AND (MERMA <> 0)) then
                    cantcmp = cantcmp / ((100 - MERMA) / 100);
                END
            else
                BEGIN
                cantcmp = cantcmp * FACTOR * pesocmp * cantpro;
                END
            insert into plan_produccion_cons_prod (plpd_id, plpc_item, plcp_nrocomp, arpr_comp, arpr_cant, arpr_porc, arpr_unidad, arpr_merma, arti_peso)
                values (:planid, :item, :item2, :codcmp, :cantcmp, :porc, :undcmp, :merma, :pesocmp);
            END
        END
    ELSE
        insert into plan_produccion_cons_prod (plpd_id, plpc_item, plcp_nrocomp, arpr_comp, arpr_cant, arpr_porc, arpr_unidad, arpr_merma, arti_peso)
            values (:planid, :item, 1, :artic, :cantpro, 0, :unidad, 0, :pesopro);

    INSERT INTO MOVIMIENTO_ARTICULO
      (ARTI_COD, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM, TERC_NIT)
      VALUES(:artic, :bodori, :FEC, 27, :planid, :CONC, :cantpro, 0, 'N', null, :Pref, :Num, :item+1000, null);
    end
/* recorra el detalle calculando costos y haciendo la entrada */
if (entrada = 'S') then
    begin
    for select plpd_item, arti_cod, plpd_cant, plpd_unidad, plpd_lote
        from plan_produccion_det where plpr_id = :planid
        into :item, :artic, :cant, :unidad, :lote
        do
        begin
        COSTOT = 0;
        execute procedure factor_unidad_cant(:artic, :unidad) returning_values (:factor);
        CANTPRO = :cant * :FACTOR;
        FOR SELECT ARPR_COMP, ARPR_CANT, ARPR_unidad
            FROM plan_produccion_productos WHERE PLPR_ID = :planid
            ORDER BY PLPD_ITEM
            INTO :codcmp, :cantcmp, :undcmp
            DO
            BEGIN
            EXECUTE PROCEDURE costo_promedio_unidad(:codcmp, :fec, :undcmp) returning_values (:COSTOU);
            COSTOT = COSTOT + (COSTOU * cantcmp);
            END
        if ((CANTPRO) <> 0) then
            costou = costot / cantpro;
        else
            costou = 0;
        INSERT INTO MOVIMIENTO_ARTICULO
          (ARTI_COD, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM, TERC_NIT)
          VALUES(:artic, :boddes, :fec, 27, :planid, :conc, :cant, :costou, 'S', :lote, :Pref, :Num, :item, '');
        end
    end
end
^

SET TERM ; ^

DROP TRIGGER PLAN_PRODUCCION_CONS_AI;
DROP TRIGGER PLAN_PRODUCCION_CONS_AU;
DROP TRIGGER PLAN_PRODUCCION_CONS_AU;

SET TERM ^ ;

CREATE OR ALTER PROCEDURE IMPR_PLANPROD(
    ID INTEGER)
RETURNS (
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    FECFIN DATE,
    CONCEPTO VARCHAR(60),
    RESPONSABLE VARCHAR(60),
    OBS BLOB SUB_TYPE 0 SEGMENT SIZE 80,
    ITEM INTEGER,
    ARTICULO VARCHAR(15),
    CODBAR VARCHAR(15),
    ARTIDES VARCHAR(60),
    CANT NUMERIC(18,4),
    UNIDAD VARCHAR(8),
    MERMA NUMERIC(18,4),
    PESO NUMERIC(18,4),
    OBSITEM BLOB SUB_TYPE 0 SEGMENT SIZE 80,
    CODCOMP VARCHAR(20),
    DESCOMP VARCHAR(60),
    CANTCOMP NUMERIC(18,4),
    UNICOMP VARCHAR(8))
AS
BEGIN
SELECT PLPR_PREF, PLPR_NUMERO, PLPR_FECINI, PLPR_FECFIN, PLPR_CONC, PLPR_RESPONSABLE, PLPR_OBS
    FROM plan_produccion O WHERE PLPR_ID = :ID into
    :PREF, :NUMERO, :FECHA,
    :FECFIN, :CONCEPTO, :RESPONSABLE, :OBS;
FOR SELECT PLPD_ITEM, p.ARTI_COD, PLPD_CODBAR, PLPD_DESC, PLPD_CANT, PLPD_UNIDAD, PLPD_PESO, PLPD_OBS
    FROM plan_produccion_det p, articulo a WHERE a.arti_cod = p.arti_cod and PLPR_ID = :ID
    ORDER BY PLPD_ITEM
    INTO :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :PESO, :OBSITEM
    DO
      BEGIN
      codcomp = '';
      descomp = '';
      cantcomp = 0;
      unicomp = '';
      SUSPEND;
      for select arpr_comp, arti_des, arpr_cant, arpr_unidad
        from plan_produccion_productos P, ARTICULO A
        where p.plpr_id = :id and p.plpd_item = :item and P.arpr_comp = A.arti_cod
        into :codcomp, :descomp, :cantcomp, :unicomp
        DO
        BEGIN
        ARTICULO = '';
        CODBAR = '';
        ARTIDES = '';
        CANT = 0;
        UNIDAD = '';
        MERMA = 0;
        PESO = 0;
        OBSITEM = '';
        SUSPEND;
        END
      END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER PLAN_PRODUCCION_AU FOR PLAN_PRODUCCION
ACTIVE AFTER UPDATE POSITION 0
as
declare variable consec INTEGER;
BEGIN
/* borre la contabilizacion */
if (new.plpr_anulado = 'S') then
    begin
    DELETE FROM movimiento_articulo M WHERE M.mvar_tipodoc = 27 AND M.mvar_idref = OLD.plpr_id;
    select enco_consec from comprobante_encabezado where enco_tiporef = 27 and enco_idref = old.plpr_id into :consec;
    if (NOT consec is null) then
      delete from comprobante_detalle where enco_consec = :consec;
    delete from comprobante_encabezado where enco_tiporef = 27 and enco_idref = old.plpr_id;
    INSERT INTO AUDITORIA (AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
        VALUES (USER, 27, new.plpr_id, 'A', NEW.plpr_pref || NEW.plpr_numero);
    end

if ((new.plpr_id <> 0) and (new.plpr_anulado = 'N')) then
    BEGIN
    INSERT INTO AUDITORIA (AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
        VALUES (USER, 27, new.plpr_id, 'U', NEW.plpr_pref || NEW.plpr_numero);
    END
/* si cambia fecha o numero actualice los detalles */
if ((OLD.plpr_pref <> NEW.plpr_pref) or
    (OLD.plpr_numero <> NEW.plpr_numero) or
    (OLD.plpr_fecini <> NEW.plpr_fecini)) then
    BEGIN
    UPDATE plan_produccion_det SET PLPD_TRANSMIT = 'N' WHERE PLPR_ID = NEW.plpr_id;
    UPDATE plan_produccion_cons SET PLPC_TRANSMIT = 'N' WHERE PLPD_ID = NEW.plpr_id;
    END
/* actualice los anulados y trasmitidos */
if (OLD.plpr_anulado <> NEW.plpr_anulado) then
    BEGIN
    UPDATE plan_produccion_det SET PLPD_ANULADO = NEW.plpr_anulado WHERE PLPR_ID = NEW.plpr_id;
    UPDATE plan_produccion_cons SET PLPC_ANULADO = NEW.plpr_anulado WHERE PLPD_ID = NEW.plpr_id;
    END
if (OLD.plpr_transmit <> NEW.plpr_transmit) then
    BEGIN
    UPDATE plan_produccion_det SET PLPD_TRANSMIT = NEW.plpr_transmit WHERE PLPR_ID = NEW.plpr_id;
    UPDATE plan_produccion_cons SET PLPC_TRANSMIT = NEW.plpr_transmit WHERE PLPD_ID = NEW.plpr_id;
    END
end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER PLAN_PRODUCCION_AD FOR PLAN_PRODUCCION
ACTIVE AFTER DELETE POSITION 0
as
declare variable consec integer;
begin
DELETE FROM movimiento_articulo M WHERE M.mvar_tipodoc = 27 AND M.mvar_idref = OLD.plpr_id;
select enco_consec from comprobante_encabezado where enco_tiporef = 27 and enco_idref = old.plpr_id into :consec;
if (NOT consec is null) then
    delete from comprobante_detalle where enco_consec = :consec;
delete from comprobante_encabezado where enco_tiporef = 27 and enco_idref = old.plpr_id;
INSERT INTO AUDITORIA (AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
    VALUES (USER, 27, old.plpr_id, 'D', old.plpr_pref || old.plpr_numero);
end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER PROCEDURE IMPR_PLANPROD_CONS(
    ID INTEGER)
RETURNS (
    ITEM INTEGER,
    ARTICULO VARCHAR(15),
    CODBAR VARCHAR(15),
    ARTIDES VARCHAR(60),
    CANT NUMERIC(18,4),
    UNIDAD VARCHAR(8),
    EXISTEN NUMERIC(18,4),
    ORDENADO NUMERIC(18,4),
    OBSITEM BLOB SUB_TYPE 0 SEGMENT SIZE 80,
    CODCOMP VARCHAR(20),
    DESCOMP VARCHAR(60),
    CANTCOMP NUMERIC(18,4),
    UNICOMP VARCHAR(8))
AS
declare variable CODPROD VARCHAR(20);
declare variable IDENSA INTEGER;
BEGIN
FOR SELECT PLPC_ITEM, ARTI_COD, PLPC_CODBAR, PLPC_DESC, PLPC_CANT, PLPC_UNIDAD, PLPC_EXIST, PLPC_ORDENAR, PLPC_OBS
    FROM plan_produccion_cons WHERE PLPD_ID = :ID
    ORDER BY PLPC_ITEM
    INTO :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :existen, :ordenado, :OBSITEM
    DO
      BEGIN
      codcomp = '';
      descomp = '';
      cantcomp = 0;
      unicomp = '';
      SUSPEND;
      CODPROD = ARTICULO;
      for select arpr_comp, arti_des, arpr_cant, arpr_unidad
        from plan_produccion_cons_prod P, ARTICULO A
        where P.arpr_comp = A.arti_cod AND p.plpd_id = :id AND P.plpc_item = :item ORDER BY P.plcp_nrocomp
        into :codcomp, :descomp, :cantcomp, :unicomp
        DO
        BEGIN
        ARTICULO = '';
        CODBAR = '';
        ARTIDES = '';
        CANT = 0;
        UNIDAD = '';
        EXISTEN = 0;
        ORDENADO = 0;
        OBSITEM = '';
        SUSPEND;
        END
      /* TRAIGA LOS SUBENSAMBLES ASOCIADOS AL PLAN */
      FOR SELECT ENSA_ID FROM ENSAMBLES
        WHERE ARTI_COD = :CODPROD AND ENSA_TIPOREF = 27 AND ENSA_IDREF = :ID
        INTO :IDENSA
        DO
        BEGIN
        FOR SELECT E.ARTI_COD, ENSA_DESC, D.ARTI_COD, ESDE_DESC, ESDE_CANT, ESDE_UNIDAD
            FROM ENSAMBLES E, ENSAMBLES_DETALLE D
            WHERE E.ensa_id = D.ensa_id AND E.ENSA_TIPOREF = 15 AND E.ENSA_IDREF = :IDENSA
                INTO :ARTICULO, :ARTIDES, :CODCOMP, descomp, :cantcomp, :unicomp
                DO
                SUSPEND;
        END
      END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER MOVIMIENTO_ARTICULO_BI FOR MOVIMIENTO_ARTICULO
ACTIVE BEFORE INSERT POSITION 0
AS
declare variable LOTE CHAR(1);
declare variable ENSAMBLE CHAR(1);
declare variable IDENS INTEGER;
declare variable PREFENS VARCHAR(4);
declare variable unidad varchar(8);
declare variable DESCR varchar(60);
declare variable CODPR varchar(8);
declare variable DESPR varchar(60);
declare variable UNIPR varchar(8);
declare variable CANTPR numeric(18,4);
declare variable FACTOR numeric(18,4);
declare variable COSTO numeric(18,2);
declare variable COSTOTOT numeric(18,2);
declare variable PORCPR numeric(9,4);
declare variable MERMAPR numeric(9,4);
declare variable PESO numeric(18,4);
declare variable PESOPR numeric(18,4);
declare variable ITEM INTEGER;
declare variable IVA NUMERIC(9,4);
declare variable IVAM NUMERIC(18,2);
declare variable CONSUMO NUMERIC(18,2);
declare variable TOTAL float;
declare variable SALDO NUMERIC(18,4);
BEGIN
/* INSERTE EL NUEVO LOTE */
if (NEW.mvar_cant IS NULL) then
    NEW.mvar_cant = 0;
SELECT ARTI_EXIST
    FROM   ARTICULO
    WHERE  ARTICULO.ARTI_COD = NEW.ARTI_COD
    INTO :LOTE;
if (LOTE = 'L') then
    BEGIN
      if ((NEW.mvar_lote IS NULL) or (NEW.mvar_lote = '')) then
        if (new.mvar_entrada = 'S') then
            new.mvar_lote = cast(new.mvar_cons as varchar(15));
        else
            begin
            /* NO HAY LOTE, ENTONCES CALCULELO SEGUN CONFIGURACION */
            EXCEPTION LOTE_NEGATIVO 'No se indicó un lote para el artículo ' || new.arti_cod;
            end
    END
/* ENSAMBLE EL PRODUCTO */
SELECT ARTI_ENSAMBLE, ARTI_UNIDAD, ARTI_DES, ARTI_PESO
    FROM ARTICULO WHERE ARTI_COD = NEW.arti_cod INTO :ensamble, :unidad, :descr, :peso;
if ((NEW.mvar_entrada = 'N') AND (ENSAMBLE = 'S')) then
    BEGIN
    /* verifique si la existecia es insufieciente */
/*    INSERT INTO audi_trig (EVENTO) VALUES ('movarti_bi ensamble' || NEW.arti_cod);*/
    execute procedure saldo_inventario(new.arti_cod, new.bode_cod, new.mvar_fecha) returning_values (:saldo);
/*    INSERT INTO audi_trig (EVENTO) VALUES ('movarti_bi ensamble ' || NEW.arti_cod || ' cant:' || new.mvar_cant || ' saldo:' || :saldo);*/
    if (NEW.mvar_cant > :SALDO) then
        BEGIN
        if (SALDO > 0) then
            SALDO = NEW.mvar_cant - :SALDO;
        else
            SALDO = NEW.mvar_cant;
        IDENS = gen_id(id_ensamble, 1);
        EXECUTE PROCEDURE lee_configuracion('INVENTARIO', 'ENSAMBLES', 'PREFIJO PARA ENSAMBLES AUTOMATICOS AL SACAR PRODUCTOS') returning_values (:prefens);
        INSERT INTO ENSAMBLES(ENSA_ID, TIDO_COD, PREF_PRE, BODE_COD, ENSA_NUMERO, ENSA_FECHA, ENSA_CONC, ENSA_REFER, ENSA_CANT, ENSA_UNIDAD, ENSA_FACTOR, ENSA_ANULADO, ENSA_TRANSMIT,
            ARTI_COD, ENSA_DESC, ENSA_CODBAR, ENSA_LOTE, ENSA_OBS, TERC_NIT, ENSA_USUARIO, NUMOK, ENSA_COSTO, LOTE_VENCE, ENSA_CODRETAL, ENSA_CANTRETAL, ENSA_OPER, ENSA_MAQUINA, ENSA_PESO, ENSA_BODRETAL, ENSA_TIPOREF, ENSA_IDREF)
            VALUES (:IDENS, 15, :prefens, NEW.bode_cod, '000001', new.mvar_fecha, new.mvar_conc, '', :SALDO, :unidad, 1, 'N', 'N',
            NEW.arti_cod, :descr, NEW.arti_cod, NEW.mvar_lote, NULL, NULL, USER, 'N', NEW.mvar_costo, NULL, NULL, 0, null,  NULL, 0, NEW.bode_cod, NEW.mvar_tipodoc, NEW.mvar_idref);
        ITEM = 0;
        COSTOTOT = 0;
        select sum(arpr_porc) from articulos_producto where arti_cod = NEW.arti_cod into :total;
        FOR SELECT ARPR_CANT, ARPR_UNIDAD, ARPR_COMP, ARTI_DES, TAIV_PORC, ARTI_CONSUMO, ARPR_PORC, ARPR_MERMA, ARTI_PESO
            FROM articulos_producto P, ARTICULO A, TARIFA_IVA T
            WHERE P.ARTI_COD = NEW.arti_cod AND A.arti_cod = P.arpr_comp AND A.taiv_cod = T.taiv_cod
            INTO :CANTPR, :UNIPR, :CODPR, :DESPR, :IVA, :CONSUMO, :PORCPR, :MERMAPR, :PESOPR
            DO
            BEGIN
            ITEM = ITEM + 1;
            EXECUTE PROCEDURE factor_unidad_cant(:codpr, :unipr) returning_values (:factor);
            EXECUTE PROCEDURE costo_promedio_unidad (:codpr, NEW.mvar_fecha, :UNIPR) returning_values (:COSTO);
            IVAM = costo * cantpr * iva / 100;
            if (((cantpr is null) or (cantpr = 0)) AND (porcpr IS NOT NULL) AND (porcpr <> 0)) then
                BEGIN
                /* ES PORCENTUAL AL PESO LA MEZCLA SOBRE EL 1ER ARTICULO */
                CANTPR = :SALDO * PESO;
                CANTPR = CANTPR / TOTAL * porcpr; /* APLICA LA PROPORCION */
                if ((mermapr IS NOT NULL) AND (mermapr <> 0)) then
                    CANTPR = CANTPR * (100 + mermapr) / 100;
/*                CANTPR = CANTPR / pesopr; /* LO LLEVA A LA UNIDAD PRINCIPAL */
                UNIPR = 'GRAMO';
                END
            ELSE
                BEGIN
                CANTPR = CANTPR * :SALDO * pesopr;
                END
            COSTOTOT = COSTOTOT + COSTO * CANTPR;
            INSERT INTO ENSAMBLES_DETALLE(ENSA_ID, ESDE_ITEM, ARTI_COD, BODE_COD, ESDE_CANT, ESDE_UNIDAD, ESDE_COSTO, ESDE_LOTE, ESDE_FACTOR, ESDE_IVAPORC, ESDE_IVAMONTO, ESDE_CONSUMO, ESDE_CODBAR, ESDE_ANULADO, ESDE_TRANSMIT, ESDE_DESC, ESDE_TOTAL, ESDE_PESO)
                VALUES (:idens, :ITEM, :codpr,  NEW.bode_cod, :cantpr, :unipr, :costo, NULL, :FACTOR, :IVA, :ivam, :consumo, :codpr, 'N', 'N', :despr, :COSTO * :cantpr, 0);
            END
        END
    if (NEW.mvar_cant <> 0) then
        COSTO = costotot / NEW.mvar_cant;
    else
        COSTO = 0;
    UPDATE ENSAMBLES SET ENSA_COSTO = :costo WHERE ENSA_ID = :idens;
    END
if (new.mvar_cons is null) then
    NEW.mvar_cons = GEN_ID(ID_MOVARTI,1);
END
^

SET TERM ; ^


/* 20100530 */
/* ERROR CODIGO DE BARRAS DEL ARTICULO ANTERIOR SI NO HAY CODIGO */
SET TERM ^ ;

CREATE OR ALTER procedure EXISTENCIAS_DESDE_HASTA (
    FECHA date,
    ARTINI varchar(20),
    ARTFIN varchar(20),
    GRPINI varchar(3),
    GRPFIN varchar(3),
    BODINI varchar(2),
    BODFIN varchar(2),
    ORDEN char(1),
    AGRUPA char(1),
    DETALLE char(1),
    RESERVA char(1),
    ENPESO char(1),
    MASIVA char(1),
    SUCURSAL integer)
returns (
    CANT numeric(18,4),
    COSTO numeric(18,2),
    COSTO_LOTE numeric(18,2),
    CODIGO varchar(15),
    NOMBRE varchar(60),
    UNIDAD varchar(8),
    STAND varchar(20),
    CODGRUPO varchar(2),
    NOMGRUPO varchar(30),
    CODSUBG varchar(3),
    NOMSUBG varchar(30),
    CODMARC varchar(3),
    NOMMARC varchar(30),
    CODBOD varchar(2),
    LOTE varchar(15),
    NOMBOD varchar(30),
    COSTOTOT numeric(18,2),
    COSTOIVA numeric(18,2),
    ULTCOSTO numeric(18,2),
    FECHACOSTO date,
    CONSUMO numeric(18,2),
    RESERVADO numeric(18,4),
    ORDENADO numeric(18,4),
    IVA numeric(9,2),
    IVAMONTO numeric(18,2),
    PESOUNIT numeric(18,4),
    PESOTOTAL numeric(18,4),
    PRECIO numeric(18,2),
    CODBAR varchar(20))
AS
declare variable exist char(1);
declare variable codini varchar(20);
declare variable codfin varchar(20);
declare variable desini varchar(20);
declare variable desfin varchar(20);
declare variable ordenc numeric(18,4);
declare variable pedido numeric(18,4);
declare variable ok char(1);
declare variable id integer;
declare variable item integer;
declare variable und varchar(8);
declare variable factor numeric(18,4);
declare variable cant2 numeric(18,4);
declare variable PEDAUTO CHAR(2);
DECLARE VARIABLE LISTA INTEGER;
BEGIN
EXECUTE PROCEDURE lee_configuracion ('FACTURACION','FACTURAS', 'CODIGO DE LA LISTA DE PRECIOS A MOSTRAR EN ARTICULOS') returning_values (:LISTA);
if (ORDEN = 'C') then
    BEGIN
    CODINI = ARTINI;
    CODFIN = ARTFIN;
    DESINI = '';
    DESFIN = 'zz';
    END
ELSE
    BEGIN
    DESINI = ARTINI;
    DESFIN = ARTFIN;
    CODINI = '';
    CODFIN = 'zz';
    END
EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION', 'FACTURAS', 'GENERAR PEDIDO AUTOMATICAMENTE CON LA FACTURA') returning_values (pedauto);
if (DETALLE = 'B') then
  BEGIN
  FOR SELECT ARTI_COD, ARTI_DES, ARTI_UNIDAD, ARTI_EXIST, TAIV_PORC, A.GRUP_COD, A.SUBG_COD, A.MARC_COD, BODE_COD, BODE_NOM, ARTI_CONSUMO, ARTI_PESO/1000
      FROM ARTICULO A, BODEGA B, TARIFA_IVA T
      WHERE ARTI_COD >= :CODINI AND ARTI_COD <= :CODFIN AND ARTI_DES >= :DESINI AND ARTI_DES <= :DESFIN AND ESAR_COD <> 'I' AND BODE_COD >= :BODINI AND
      BODE_COD <= :BODFIN AND ((SUCU_ID = :SUCURSAL) or (:SUCURSAL = 0)) AND A.TAIV_COD = T.TAIV_COD
      INTO :CODIGO, :NOMBRE, :UNIDAD, :EXIST, :IVA, :CODGRUPO, :CODSUBG, :CODMARC, :CODBOD, :NOMBOD, :CONSUMO, :pesounit
      DO
        BEGIN
        STAND = '';
        OK = 'N';
        if (AGRUPA = 'G') then
            BEGIN
            if ((CODGRUPO >= GRPINI) AND (CODGRUPO <= GRPFIN)) then
                OK = 'S';
            end
        ELSE
            if (AGRUPA = 'M') then
                BEGIN
                if ((CODMARC >= GRPINI) AND (CODMARC <= GRPFIN)) then
                    OK = 'S';
                END
        if (OK = 'S') then
            BEGIN
            NOMGRUPO = '';
            NOMMARC = '';
            NOMSUBG = '';
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            CODBAR = NULL;
            SELECT FIRST 1 COBA_COD FROM BARRAS_ARTICULO
                WHERE ARTI_COD = :codigo AND COBA_UNIDAD = :unidad ORDER BY STRLEN(COBA_COD) INTO :codbar;
            if (CODBAR IS NULL) then
                CODBAR = CODIGO;
            if (EXIST <> 'N') then
                BEGIN
                SELECT STAND_COD FROM STANDS WHERE ARTI_COD = :CODIGO AND STAND_BODEGA = :CODBOD INTO :STAND;
                EXECUTE PROCEDURE SALDO_INICIAL_INVENTARIO(CODIGO, FECHA, :CODBOD) returning_values (CANT);
                EXECUTE PROCEDURE costo_promedio_y_ultimo_unidad(CODIGO, FECHA, UNIDAD) returning_values (COSTO, ULTCOSTO);
                SELECT FIRST 1 MVAR_FECHA FROM MOVIMIENTO_ARTICULO WHERE ARTI_COD = :CODIGO AND MVAR_ENTRADA = 'S' AND MVAR_FECHA <= :FECHA
                    ORDER BY ARTI_COD DESC, MVAR_FECHA DESC INTO :FECHACOSTO;
                COSTOTOT = :CANT * :COSTO;
                IVAMONTO = COSTOTOT /100 * IVA;
                COSTOIVA = COSTOTOT;
                if (MASIVA = 'S') then
                    BEGIN
                    COSTOIVA = COSTOTOT + IVAMONTO;
                    COSTO = COSTO * (100 + :IVA) / 100 + :CONSUMO;
                    END
                CONSUMO = CONSUMO * CANT;
                COSTOIVA = COSTOIVA + CONSUMO;
                if (RESERVA = 'S') then
                    BEGIN
                    SELECT SUM(ORID_ENTREGAR)
                        FROM ORDENINVENTARIO_DETALLE OD, ordenes_inventario O
                        WHERE O.ORIN_ID = OD.ORIN_ID AND ARTI_COD = :CODIGO AND ORIN_FECHA <= :FECHA AND ORIN_FECLLEGA >= :FECHA AND ORID_ANULADO = 'N' AND OD.BODE_COD = :CODBOD
                        INTO :ORDENADO;
                    if (ORDENADO IS NULL) then
                        ORDENADO = 0;
                    ORDENC = 0;
                    FOR SELECT O.ORDC_ID, OCDE_ITEM, OCDE_CANT * OCDE_FACTOR
                        FROM ORDENES_COMPRA O, ORDENES_COMPRA_DETALLE OD
                        WHERE O.ORDC_ID = OD.ORDC_ID AND OD.ARTI_COD = :CODIGO AND ORDC_VENCE >= :FECHA AND ORDC_FECHA <= :FECHA AND OCDE_ANULADO = 'N' AND OD.BODE_COD = :CODBOD
                        INTO :ID, :ITEM, :CANT2
                        do
                        BEGIN
                        EXECUTE PROCEDURE FALTANTE(23, 21, ID, ITEM) returning_values (PEDIDO, UND, FACTOR);
                        if (PEDIDO * FACTOR = CANT2) then /* SI NO SE HA FACTURADO MIRE A VER SI SE REMISIONO */
                            EXECUTE PROCEDURE FALTANTE(23, 22, ID, ITEM) returning_values (PEDIDO, UND, FACTOR);
                        if (PEDIDO IS NULL) then
                            PEDIDO = 0;
                        ORDENC = ORDENC + PEDIDO * FACTOR;
                        END
                    ORDENADO = ORDENADO + ORDENC;
                    SELECT SUM(RSDE_LIBERAR)
                        FROM RESERVAS_DETALLE RD, RESERVAS R
                        WHERE R.RESE_ID = RD.RESE_ID AND ARTI_COD = :CODIGO AND RESE_FECHA <= :FECHA AND RESE_VENCE >= :FECHA AND RD.BODE_COD = :CODBOD AND RSDE_ANULADO = 'N'
                        INTO :RESERVADO;
                    if (RESERVADO IS NULL) then
                        RESERVADO = 0;
                    PEDIDO = 0;
                    FOR SELECT P.PEDI_ID, PEDE_ITEM, PEDE_CANT * PEDE_FACTOR
                        FROM PEDIDOS P, PEDIDOS_DETALLE PD
                        WHERE P.PEDI_ID = PD.PEDI_ID AND PD.ARTI_COD = :CODIGO AND PEDI_VENCE >= :FECHA AND PEDI_FECHA <= :FECHA AND PEDE_ANULADO = 'N' AND BODE_COD = :CODBOD
                        INTO :ID, :ITEM, :CANT2
                        do
                        BEGIN
                        EXECUTE PROCEDURE FALTANTE(34, 31, ID, ITEM) returning_values (ORDENC, UND, FACTOR);
                        if ((ORDENC * FACTOR = CANT2) or (PEDAUTO = 'SI')) then /* SI NO SE HA FACTURADO MIRE A VER SI SE REMISIONO */
                            EXECUTE PROCEDURE FALTANTE(34, 32, ID, ITEM) returning_values (ORDENC, UND, FACTOR);
                        if (ORDENC IS NULL) then
                            ORDENC = 0;
                        PEDIDO = PEDIDO + ORDENC * FACTOR;
                        END
                    RESERVADO = RESERVADO + PEDIDO;
                    END
                ELSE
                    BEGIN
                    RESERVADO = 0;
                    ORDENADO = 0;
                    END
                if (LISTA > 0) then
                    SELECT prar_fijo FROM precios_articulo WHERE arti_cod = :CODIGO and lipr_cod = :LISTA INTO :PRECIO;
                if (ENPESO = 'S') then
                    BEGIN
                    if (pesounit IS NULL) then
                        pesounit = 0;
                    if (PESOUNIT <> 0) then
                        BEGIN
                        pesototal = PESOUNIT * cant;
                        SUSPEND;
                        END
                    END
                ELSE
                    SUSPEND;
                END
            END
        END
  END

if (DETALLE = 'L') then
  BEGIN
  FOR SELECT A.ARTI_COD, ARTI_DES, ARTI_UNIDAD, ARTI_EXIST, TAIV_PORC, A.GRUP_COD, A.SUBG_COD, A.MARC_COD, L.lote_nro, L.lote_nro||' - '||L.lote_vence, ARTI_CONSUMO,l.bode_cod, L.lote_saldo,l.lote_costo, ARTI_PESO/1000
      FROM ARTICULO A, LOTES l, TARIFA_IVA T
      WHERE A.ARTI_COD >= '0' AND A.ARTI_COD <= 'zz' AND ARTI_DES >= '' AND ARTI_DES <= 'zz' AND ESAR_COD <> 'I' AND A.TAIV_COD = T.TAIV_COD and a.arti_cod = l.arti_cod
      INTO :CODIGO, :NOMBRE, :UNIDAD, :EXIST, :IVA, :CODGRUPO, :CODSUBG, :CODMARC, :LOTE, :NOMBOD, :CONSUMO, :codbod, :cant, :costo_lote, :pesounit
      DO
        BEGIN
        OK = 'N';
        if (AGRUPA = 'G') then
            BEGIN
            if ((CODGRUPO >= GRPINI) AND (CODGRUPO <= GRPFIN)) then
                OK = 'S';
            end
        ELSE
            if (AGRUPA = 'M') then
                BEGIN
                if ((CODMARC >= GRPINI) AND (CODMARC <= GRPFIN)) then
                    OK = 'S';
                END
        if (OK = 'S') then
            BEGIN
            NOMGRUPO = '';
            NOMMARC = '';
            NOMSUBG = '';
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            CODBAR = NULL;
            SELECT MAX(COBA_COD) FROM BARRAS_ARTICULO WHERE ARTI_COD = :codigo AND COBA_UNIDAD = :unidad INTO :codbar;
            if (CODBAR IS NULL) then
                CODBAR = CODIGO;

            if (EXIST <> 'N') then
                BEGIN
                EXECUTE PROCEDURE COSTO_PROMEDIO_UNIDAD(CODIGO, FECHA, UNIDAD) returning_values (COSTO);
                EXECUTE PROCEDURE ULTIMO_COSTO(CODIGO, FECHA, UNIDAD) returning_values (ULTCOSTO);
                SELECT FIRST 1 MVAR_FECHA FROM MOVIMIENTO_ARTICULO WHERE ARTI_COD = :CODIGO AND MVAR_ENTRADA = 'S' AND MVAR_FECHA <= :FECHA
                    ORDER BY ARTI_COD DESC, MVAR_FECHA DESC INTO :FECHACOSTO;
                COSTOTOT = :CANT * :COSTO;
                IVAMONTO = COSTOTOT /100 * IVA;
                COSTOIVA = COSTOTOT;
                if (MASIVA = 'S') then
                    BEGIN
                    COSTOIVA = COSTOTOT + IVAMONTO;
                    COSTO = COSTO * (100 + :IVA) / 100 + :CONSUMO;
                    END
                CONSUMO = CONSUMO * CANT;
                COSTOIVA = COSTOIVA + CONSUMO;
                if (RESERVA = 'S') then
                    BEGIN
                    SELECT SUM(ORID_ENTREGAR)
                        FROM ORDENINVENTARIO_DETALLE OD, ordenes_inventario O
                        WHERE O.ORIN_ID = OD.ORIN_ID AND ARTI_COD = :CODIGO AND ORIN_FECHA <= :FECHA AND ORIN_FECLLEGA >= :FECHA AND ORID_ANULADO = 'N'
                        INTO :ORDENADO;
                    if (ORDENADO IS NULL) then
                        ORDENADO = 0;
                    ORDENC = 0;
                    FOR SELECT O.ORDC_ID, OCDE_ITEM, OCDE_CANT * OCDE_FACTOR
                        FROM ORDENES_COMPRA O, ORDENES_COMPRA_DETALLE OD
                        WHERE O.ORDC_ID = OD.ORDC_ID AND OD.ARTI_COD = :CODIGO AND ORDC_VENCE >= :FECHA AND ORDC_FECHA <= :FECHA AND OCDE_ANULADO = 'N'
                        INTO :ID, :ITEM, :CANT2
                        do
                        BEGIN
                        EXECUTE PROCEDURE FALTANTE(23, 21, ID, ITEM) returning_values (PEDIDO, UND, FACTOR);
                        if (PEDIDO * FACTOR = CANT2) then /* SI NO SE HA FACTURADO MIRE A VER SI SE REMISIONO */
                            EXECUTE PROCEDURE FALTANTE(23, 22, ID, ITEM) returning_values (PEDIDO, UND, FACTOR);
                        if (PEDIDO IS NULL) then
                            PEDIDO = 0;
                        ORDENC = ORDENC + PEDIDO * FACTOR;
                        END
                    ORDENADO = ORDENADO + ORDENC;
                    SELECT SUM(RSDE_LIBERAR)
                        FROM RESERVAS_DETALLE RD, RESERVAS R
                        WHERE R.RESE_ID = RD.RESE_ID AND ARTI_COD = :CODIGO AND RESE_FECHA <= :FECHA AND RESE_VENCE >= :FECHA AND RSDE_ANULADO = 'N'
                        INTO :RESERVADO;
                    if (RESERVADO IS NULL) then
                        RESERVADO = 0;
                    PEDIDO = 0;
                    FOR SELECT P.PEDI_ID, PEDE_ITEM, PEDE_CANT * PEDE_FACTOR
                        FROM PEDIDOS P, PEDIDOS_DETALLE PD
                        WHERE P.PEDI_ID = PD.PEDI_ID AND PD.ARTI_COD = :CODIGO AND PEDI_VENCE >= :FECHA AND PEDI_FECHA <= :FECHA AND PEDE_ANULADO = 'N'
                        INTO :ID, :ITEM, :CANT2
                        do
                        BEGIN
                        EXECUTE PROCEDURE FALTANTE(34, 31, ID, ITEM) returning_values (ORDENC, UND, FACTOR);
                        if ((ORDENC * FACTOR = CANT2) or (PEDAUTO = 'SI')) then /* SI NO SE HA FACTURADO MIRE A VER SI SE REMISIONO */
                            EXECUTE PROCEDURE FALTANTE(34, 32, ID, ITEM) returning_values (ORDENC, UND, FACTOR);
                        if (ORDENC IS NULL) then
                            ORDENC = 0;
                        PEDIDO = PEDIDO + ORDENC * FACTOR;
                        END
                    RESERVADO = RESERVADO + PEDIDO;
                    END
                ELSE
                    BEGIN
                    RESERVADO = 0;
                    ORDENADO = 0;
                    END
                if (LISTA > 0) then
                    SELECT prar_fijo FROM precios_articulo WHERE arti_cod = :CODIGO and lipr_cod = :LISTA INTO :PRECIO;
                if (ENPESO = 'S') then
                    BEGIN
                    if (pesounit IS NULL) then
                        pesounit = 0;
                    if (PESOUNIT <> 0) then
                        BEGIN
                        pesototal = PESOUNIT * cant;
                        SUSPEND;
                        END
                    END
                ELSE
                    SUSPEND;
                END
            END
        END
  end
if (DETALLE = 'N') then
  BEGIN
  FOR SELECT ARTI_COD, ARTI_DES, ARTI_UNIDAD, ARTI_EXIST, TAIV_PORC, A.GRUP_COD, A.SUBG_COD, A.MARC_COD, ARTI_CONSUMO, ARTI_PESO/1000
      FROM ARTICULO A, TARIFA_IVA T
      WHERE ARTI_COD >= :CODINI AND ARTI_COD <= :CODFIN AND ARTI_DES >= :DESINI AND ARTI_DES <= :DESFIN AND ESAR_COD <> 'I' AND A.TAIV_COD = T.TAIV_COD
      INTO :CODIGO, :NOMBRE, :UNIDAD, :EXIST, :IVA, :CODGRUPO, :CODSUBG, :CODMARC, :CONSUMO, :pesounit
      DO
        BEGIN
        OK = 'N';
        if (AGRUPA = 'G') then
            BEGIN
            if ((GRPINI = '0') AND (GRPFIN = 'zz')) then
                OK = 'S';
            else
                if ((CODGRUPO >= GRPINI) AND (CODGRUPO <= GRPFIN)) then
                    OK = 'S';
            end
        ELSE
            if (AGRUPA = 'M') then
                BEGIN
                if ((GRPINI = '0') AND (GRPFIN = 'zzz')) then
                    OK = 'S';
                else
                    if ((CODMARC >= GRPINI) AND (CODMARC <= GRPFIN)) then
                        OK = 'S';
                END
        if (OK = 'S') then
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            CODBAR = NULL;
            SELECT MAX(COBA_COD) FROM BARRAS_ARTICULO WHERE ARTI_COD = :codigo AND COBA_UNIDAD = :unidad INTO :codbar;
            if (CODBAR IS NULL) then
                CODBAR = CODIGO;

            if (EXIST <> 'N') then
                BEGIN
                EXECUTE PROCEDURE SALDO_INICIAL_TOTAL_INV(CODIGO, FECHA) returning_values (CANT);
                EXECUTE PROCEDURE COSTO_PROMEDIO_UNIDAD(CODIGO, FECHA, UNIDAD) returning_values (COSTO);
                EXECUTE PROCEDURE ULTIMO_COSTO(CODIGO, FECHA, UNIDAD) returning_values (ULTCOSTO);
                SELECT FIRST 1 MVAR_FECHA FROM MOVIMIENTO_ARTICULO WHERE ARTI_COD = :CODIGO AND MVAR_ENTRADA = 'S' AND MVAR_FECHA <= :FECHA
                    ORDER BY ARTI_COD DESC, MVAR_FECHA DESC INTO :FECHACOSTO;
                COSTOTOT = :CANT * :COSTO;
                IVAMONTO = COSTOTOT /100 * IVA;
                COSTOIVA = COSTOTOT;
                if (MASIVA = 'S') then
                    BEGIN
                    COSTOIVA = COSTOTOT + IVAMONTO;
                    COSTO = COSTO * (100 + :IVA) / 100 + :CONSUMO;
                    END
                CONSUMO = CONSUMO * CANT;
                COSTOIVA = COSTOIVA + CONSUMO;
                if (RESERVA = 'S') then
                    BEGIN
                    SELECT SUM(ORID_ENTREGAR)
                        FROM ORDENINVENTARIO_DETALLE OD, ordenes_inventario O
                        WHERE O.ORIN_ID = OD.ORIN_ID AND ARTI_COD = :CODIGO AND ORIN_FECHA <= :FECHA AND ORIN_FECLLEGA >= :FECHA AND ORID_ANULADO = 'N'
                        INTO :ORDENADO;
                        if (ORDENADO IS NULL) then
                            ORDENADO = 0;
                    ORDENC = 0;
                    FOR SELECT O.ORDC_ID, OCDE_ITEM, OCDE_CANT * OCDE_FACTOR
                        FROM ORDENES_COMPRA O, ORDENES_COMPRA_DETALLE OD
                        WHERE O.ORDC_ID = OD.ORDC_ID AND OD.ARTI_COD = :CODIGO AND ORDC_VENCE >= :FECHA AND ORDC_FECHA <= :FECHA AND OCDE_ANULADO = 'N'
                        INTO :ID, :ITEM, :CANT2
                        do
                        BEGIN
                        EXECUTE PROCEDURE FALTANTE(23, 21, ID, ITEM) returning_values (PEDIDO, UND, FACTOR);
                        if (PEDIDO * FACTOR = CANT2) then /* SI NO SE HA FACTURADO MIRE A VER SI SE REMISIONO */
                            EXECUTE PROCEDURE FALTANTE(23, 22, ID, ITEM) returning_values (PEDIDO, UND, FACTOR);
                        if (PEDIDO IS NULL) then
                            PEDIDO = 0;
                        ORDENC = ORDENC + PEDIDO * FACTOR;
                        END
                    ORDENADO = ORDENADO + ORDENC;
                    SELECT SUM(RSDE_LIBERAR)
                        FROM RESERVAS_DETALLE RD, RESERVAS R
                        WHERE R.RESE_ID = RD.RESE_ID AND ARTI_COD = :CODIGO AND RESE_FECHA <= :FECHA AND RESE_VENCE >= :FECHA AND RSDE_ANULADO = 'N'
                        INTO :RESERVADO;
                    if (RESERVADO IS NULL) then
                        RESERVADO = 0;
                    PEDIDO = 0;
                    FOR SELECT P.PEDI_ID, PEDE_ITEM, PEDE_CANT * PEDE_FACTOR
                        FROM PEDIDOS P, PEDIDOS_DETALLE PD, PUNTO_VENTA PT
                        WHERE P.PEDI_ID = PD.PEDI_ID AND PD.ARTI_COD = :CODIGO AND PT.ptvt_id = P.PTVT_ID AND PEDI_VENCE >= :FECHA AND PEDI_FECHA <= :FECHA AND PEDE_ANULADO = 'N'
                        INTO :ID, :ITEM, :CANT2
                        do
                        BEGIN
                        EXECUTE PROCEDURE FALTANTE(34, 31, ID, ITEM) returning_values (ORDENC, UND, FACTOR);
                        if ((ORDENC * FACTOR = CANT2) or (PEDAUTO = 'SI')) then /* SI NO SE HA FACTURADO MIRE A VER SI SE REMISIONO */
                            EXECUTE PROCEDURE FALTANTE(34, 32, ID, ITEM) returning_values (ORDENC, UND, FACTOR);
                        if (ORDENC IS NULL) then
                            ORDENC = 0;
                        PEDIDO = PEDIDO + ORDENC * FACTOR;
                        END
                    if (PEDIDO IS NULL) then
                        PEDIDO = 0;
                    RESERVADO = RESERVADO + PEDIDO;
                    END
                ELSE
                    BEGIN
                    RESERVADO = 0;
                    ORDENADO = 0;
                    END
                if (LISTA > 0) then
                    SELECT prar_fijo FROM precios_articulo WHERE arti_cod = :CODIGO and lipr_cod = :LISTA INTO :PRECIO;

                if (ENPESO = 'S') then
                    BEGIN
                    if (pesounit IS NULL) then
                        pesounit = 0;
                    if (PESOUNIT <> 0) then
                        BEGIN
                        pesototal = PESOUNIT * cant;
                        SUSPEND;
                        END
                    END
                ELSE
                    SUSPEND;
                END
            END
        END
  END
END
^

SET TERM ; ^

/* 20100601 */
/* COSTO EN VENTAS CON ITEM DEL DOCUMENTO PARA PODER CALCULAR IMPOCOSUMO AL COSTO PARA NO RESPONSABLES */

DROP TRIGGER COSTO_VENTAS_BI;

SET TERM ^ ;

CREATE OR ALTER procedure COSTO_EN_VENTAS (
    TIPO integer,
    ID integer)
AS
declare variable FECHA DATE;
declare variable ARTICULO VARCHAR(20);
declare variable CANTIDAD NUMERIC(18,4);
declare variable COSTO NUMERIC(18,2);
declare variable CTACOSTO VARCHAR(20);
declare variable CTAINVEN VARCHAR(20);
declare variable ITEM INTEGER;
BEGIN
DELETE FROM COSTO_VENTAS WHERE TIDO_COD = :TIPO AND COVE_ID = :ID;
if (TIPO = 31) then
    BEGIN
    /* FACTURA DE VENTA */
    FOR SELECT D.ARTI_COD, FADE_CANT * FADE_FACTOR, FACT_FECHA, fade_item
        FROM ARTICULO A, FACTURAS F, FACTURAS_DETALLE D
        WHERE F.FACT_ID = D.FACT_ID AND A.ARTI_COD = D.ARTI_COD AND F.FACT_ID = :ID AND FACT_ANULADO = 'N'
        INTO :ARTICULO, :CANTIDAD, :FECHA, :ITEM
        DO
        BEGIN
        SELECT COAR_CTACOS, COAR_CTAINV FROM CONTABIL_ARTICULO WHERE ARTI_COD = :articulo INTO :CTACOSTO, :CTAINVEN;
        if (EXISTS (SELECT COST_SALP / COST_SALC FROM COSTOS C, MOVIMIENTO_ARTICULO M
                WHERE C.arti_cod = M.arti_cod AND COST_IDMOV = MVAR_CONS AND MVAR_TIPODOC = 31 AND MVAR_IDREF = :ID AND COST_SALC <> 0 AND MVAR_ITEM = :ITEM)) then
            SELECT COST_SALP / COST_SALC FROM COSTOS C, MOVIMIENTO_ARTICULO M
                WHERE C.arti_cod = M.arti_cod AND COST_IDMOV = MVAR_CONS AND MVAR_TIPODOC = 31 AND MVAR_IDREF = :ID AND COST_SALC <> 0 AND MVAR_ITEM = :ITEM INTO :COSTO;
        else
            EXECUTE PROCEDURE COSTO_PROMEDIO(:ARTICULO, :FECHA) returning_values (:COSTO);
        INSERT INTO COSTO_VENTAS (TIDO_COD, COVE_ID, ARTI_COD, CANT, COSTO,  CTACOS, CTAINV, COVE_ITEM)
            VALUES (:TIPO, :ID, :ARTICULO, :CANTIDAD, :COSTO, :CTACOSTO, :CTAINVEN, :ITEM);
        END
    END
if (TIPO = 32) then
    BEGIN
    /* REMISION */
    FOR SELECT D.ARTI_COD, RVDE_CANT * RVDE_FACTOR, REVT_FECHA, RVDE_ITEM
        FROM ARTICULO A, REMISIONES_VENTA R, REMISIONES_VENTA_DETALLE D
        WHERE R.REVT_ID = D.REVT_ID AND A.ARTI_COD = D.ARTI_COD AND R.REVT_ID = :ID AND REVT_ANULADO = 'N'
        INTO :ARTICULO, :CANTIDAD, :FECHA, :ITEM
        DO
        BEGIN
        SELECT COAR_CTACOS, COAR_CTAINV FROM CONTABIL_ARTICULO WHERE ARTI_COD = :articulo INTO :CTACOSTO, :CTAINVEN;
        if (EXISTS (SELECT COST_SALP / COST_SALC FROM COSTOS C, MOVIMIENTO_ARTICULO M
                WHERE C.arti_cod = M.arti_cod AND COST_IDMOV = MVAR_CONS AND MVAR_TIPODOC = 32 AND MVAR_IDREF = :ID AND COST_SALC <> 0 AND MVAR_ITEM = :ITEM)) then
            SELECT COST_SALP / COST_SALC FROM COSTOS C, MOVIMIENTO_ARTICULO M
                WHERE C.arti_cod = M.arti_cod AND COST_IDMOV = MVAR_CONS AND MVAR_TIPODOC = 31 AND MVAR_IDREF = :ID AND COST_SALC <> 0 AND MVAR_ITEM = :ITEM INTO :COSTO;
        else
            EXECUTE PROCEDURE COSTO_PROMEDIO(:ARTICULO, :FECHA) returning_values (:COSTO);
        INSERT INTO COSTO_VENTAS (TIDO_COD, COVE_ID, ARTI_COD, CANT, COSTO,  CTACOS, CTAINV, COVE_ITEM)
            VALUES (:TIPO, :ID, :ARTICULO, :CANTIDAD, :COSTO, :CTACOSTO, :CTAINVEN, :ITEM);
        END
    END
if (TIPO = 33) then
    BEGIN
    /* DEVOLUCION */
    FOR SELECT D.ARTI_COD, DVDE_CANT * DVDE_FACTOR, DEVT_FECHA, DVDE_ITEM
        FROM ARTICULO A, DEVOLUCIONES_VENTAS DV, DEVOLUCIONES_VENTAS_DETALLE D
        WHERE DV.DEVT_ID = D.DEVT_ID AND A.ARTI_COD = D.ARTI_COD AND DV.DEVT_ID = :ID AND DEVT_ANULADO = 'N'
        INTO :ARTICULO, :CANTIDAD, :FECHA, :ITEM
        DO
        BEGIN
        SELECT COAR_CTACOS, COAR_CTAINV FROM CONTABIL_ARTICULO WHERE ARTI_COD = :articulo INTO :CTACOSTO, :CTAINVEN;
        if (EXISTS (SELECT COST_ENTP / COST_ENTC FROM COSTOS C, MOVIMIENTO_ARTICULO M
                WHERE C.arti_cod = M.arti_cod AND COST_IDMOV = MVAR_CONS AND MVAR_TIPODOC = 33 AND MVAR_IDREF = :ID AND COST_ENTC <> 0 AND MVAR_ITEM = :ITEM)) then
            SELECT COST_ENTP / COST_ENTC FROM COSTOS C, MOVIMIENTO_ARTICULO M
                WHERE C.arti_cod = M.arti_cod AND COST_IDMOV = MVAR_CONS AND MVAR_TIPODOC = 33 AND MVAR_IDREF = :ID AND COST_ENTC <> 0 AND MVAR_ITEM = :ITEM INTO :COSTO;
        else
            EXECUTE PROCEDURE COSTO_PROMEDIO(:ARTICULO, :FECHA) returning_values (:COSTO);
        INSERT INTO COSTO_VENTAS (TIDO_COD, COVE_ID, ARTI_COD, CANT, COSTO,  CTACOS, CTAINV, COVE_ITEM)
            VALUES (:TIPO, :ID, :ARTICULO, :CANTIDAD, :COSTO, :CTACOSTO, :CTAINVEN, :ITEM);
        END
    END
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE CONTABILICE_COSTO_VENTAS(
    TIPO INTEGER,
    ID INTEGER,
    IDINTER INTEGER)
RETURNS (
    IDC INTEGER)
AS
declare variable PREF VARCHAR(4);
declare variable NUM VARCHAR(6);
declare variable NUMERO VARCHAR(10);
declare variable INVEN CHAR(1);
declare variable CTAINVEN VARCHAR(20);
declare variable COSTOS CHAR(1);
declare variable CTACOSTOS VARCHAR(20);
declare variable EXISTE CHAR(1);
declare variable CUENTA VARCHAR(20);
declare variable MONTO NUMERIC(18,2);
declare variable TIPOCUEN CHAR(1);
declare variable NIT VARCHAR(20);
declare variable PROY VARCHAR(4);
declare variable CENTRO VARCHAR(4);
declare variable ART VARCHAR(15);
declare variable ANULADO CHAR(1);
declare variable NROI INTEGER;
declare variable NUMROWS INTEGER;
declare variable CONC CHAR(120);
declare variable VENCEAUX DATE;
declare variable VENCE CHAR(8);
declare variable IDREM INTEGER;
declare variable IDPED INTEGER;
declare variable CENT CHAR(1);
declare variable ERRORC INTEGER;
begin
/* TRAIGA EL ID DEL ENCABEZADO DEL COMPROBANTE CONTABLE */
SELECT ENCO_CONSEC FROM COMPROBANTE_ENCABEZADO WHERE ENCO_TIPOREF = :TIPO AND ENCO_IDREF = :ID INTO :IDC;
SELECT MAX(CODE_ITEM) FROM COMPROBANTE_DETALLE WHERE ENCO_CONSEC = :idc INTO :NROI;
NROI = NROI + 1;
/* EJECUTE LA PARTE DE CONTABIL_FACTURA QUE CORRESPONDE A LOS COSTOS */
EXISTE = 'N';
SELECT 'S', INVE_COSTO, INVE_INVEN, INVE_CTAINVEN, INVE_CTACOSTOS, INVE_CENTRO
    FROM INTERFAZ_VENTAS
    WHERE INVE_ID = :IDINTER
    INTO :EXISTE, :COSTOS, :INVEN, :CTAINVEN, :CTACOSTOS, :cent;
if (EXISTE = 'S') then
  BEGIN
  if (tipo = 31) then
    begin
    SELECT FACT_ANULADO, PREF_PRE, FACT_NUMERO, FACT_VENCE, TERC_NIT FROM FACTURAS F
        WHERE FACT_ID = :ID INTO :ANULADO, :PREF, :NUMERO, :VENCEAUX, :NIT;
    NUMERO = PREF || NUM;
    CONC = 'COSTO EN VENTAS FACTURA ' || :NUMERO;
    EXECUTE PROCEDURE FECHA_A_CONTA(:VENCEAUX) returning_values (:VENCE);
    if (ANULADO = 'N') then
        BEGIN
        SELECT BODE_CENTRO, BODE_PROY FROM BODEGA B, FACTURAS F, PUNTO_VENTA P
            WHERE B.BODE_COD = P.BODE_COD AND P.PTVT_ID = F.PTVT_ID AND F.FACT_ID = :ID INTO :CENTRO, :PROY;
        /* SE ASUME QUE NO HAN CAMBIADO LAS CUENTAS DE COSTOS, POR ESO SE HACE UPDATE A LOS MOVIMIENTOS DE ESAS CUENTAS */
        EXECUTE PROCEDURE COSTO_EN_VENTAS(31, :ID);
        if (COSTOS = 'A') then
            BEGIN
            FOR SELECT MAX(CTACOS), SUM(CANT * COSTO)
                FROM COSTO_VENTAS WHERE TIDO_COD = 31 AND COVE_ID = :ID
                GROUP BY CTACOS
                INTO :CTACOSTOS, :MONTO
                DO
                BEGIN
                if (MONTO <> 0) then
                    BEGIN
                    CUENTA = NULL;
                    SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                        WHERE CUEN_COD = :CTACOSTOS INTO :CUENTA, :TIPOCUEN;
                    IF (CUENTA IS NULL) THEN
                        begin
                        EXCEPTION CUENTA_NO_EXISTE 'La cuenta ' || :ctacostos || ' no existe.';
                        end
                    if (TIPOCUEN = 'I') then
                        BEGIN
                        /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                        FOR SELECT ARTI_COD, CANT * COSTO
                            FROM COSTO_VENTAS WHERE TIDO_COD = 31 AND COVE_ID = :ID AND CTACOS = :CUENTA
                            INTO :ART, :MONTO
                            DO
                            BEGIN
                            SELECT COUNT(*) FROM COMPROBANTE_DETALLE WHERE CUEN_COD = :CUENTA AND ENCO_CONSEC = :IDC AND ARTI_COD = :ART INTO :NUMROWS;
                            if (NUMROWS = 0) then
                                BEGIN
                                INSERT INTO comprobante_detalle (ENCO_CONSEC, CODE_ITEM, CUEN_COD, CODE_CONCEPTO, CODE_REFER, CODE_DEBITO, CODE_CREDITO, CODE_BASE, CODE_PORC, TERC_NIT, PROY_COD, CENT_COD, CNDE_DOCNUMERO, CNDE_DOCAPLICA, DOCO_VENCE, ARTI_COD, CODE_TIPOAPL, CODE_TIPONUE)
                                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                                NROI = NROI + 1;
                                END
                            ELSE
                                UPDATE COMPROBANTE_DETALLE
                                    SET CODE_DEBITO = :MONTO
                                WHERE CUEN_COD = :CUENTA AND ENCO_CONSEC = :IDC AND ARTI_COD = :ART;
                            END
                        END
                    ELSE
                        BEGIN
                        SELECT COUNT(*) FROM COMPROBANTE_DETALLE WHERE CUEN_COD = :CUENTA AND ENCO_CONSEC = :IDC INTO :NUMROWS;
                        if (NUMROWS = 0) then
                            BEGIN
                            if (TIPOCUEN = 'C') then
                                INSERT INTO comprobante_detalle (ENCO_CONSEC, CODE_ITEM, CUEN_COD, CODE_CONCEPTO, CODE_REFER, CODE_DEBITO, CODE_CREDITO, CODE_BASE, CODE_PORC, TERC_NIT, PROY_COD, CENT_COD, CNDE_DOCNUMERO, CNDE_DOCAPLICA, DOCO_VENCE, ARTI_COD, CODE_TIPOAPL, CODE_TIPONUE)
                                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                            ELSE
                                INSERT INTO comprobante_detalle (ENCO_CONSEC, CODE_ITEM, CUEN_COD, CODE_CONCEPTO, CODE_REFER, CODE_DEBITO, CODE_CREDITO, CODE_BASE, CODE_PORC, TERC_NIT, PROY_COD, CENT_COD, CNDE_DOCNUMERO, CNDE_DOCAPLICA, DOCO_VENCE, ARTI_COD, CODE_TIPOAPL, CODE_TIPONUE)
                                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                            NROI = NROI + 1;
                            END
                        ELSE
                            UPDATE COMPROBANTE_DETALLE
                                SET CODE_DEBITO = :MONTO
                            WHERE CUEN_COD = :CUENTA AND ENCO_CONSEC = :IDC;
                        END
                    END /* MONTO <> 0 */
                END /* FOR */
            END /* COSTOS */
        if (COSTOS = 'K') then
            BEGIN
            SELECT SUM(CANT * COSTO)
                FROM COSTO_VENTAS WHERE TIDO_COD = 31 AND COVE_ID = :ID
                INTO :MONTO;
            if (MONTO <> 0) then
                BEGIN
                CUENTA = NULL;
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :CTACOSTOS INTO :CUENTA, :TIPOCUEN;
                IF (CUENTA IS NULL) THEN
                    begin
                    EXCEPTION CUENTA_NO_EXISTE 'La cuenta ' || :ctacostos || ' no existe.';
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, REGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT ARTI_COD, CANT * COSTO
                        FROM COSTO_VENTAS WHERE TIDO_COD = 31 AND COVE_ID = :ID
                        INTO :ART, :MONTO
                        DO
                        BEGIN
                        SELECT COUNT(*) FROM COMPROBANTE_DETALLE WHERE CUEN_COD = :CUENTA AND ENCO_CONSEC = :IDC AND ARTI_COD = :ART INTO :NUMROWS;
                        if (NUMROWS = 0) then
                            BEGIN
                            INSERT INTO comprobante_detalle (ENCO_CONSEC, CODE_ITEM, CUEN_COD, CODE_CONCEPTO, CODE_REFER, CODE_DEBITO, CODE_CREDITO, CODE_BASE, CODE_PORC, TERC_NIT, PROY_COD, CENT_COD, CNDE_DOCNUMERO, CNDE_DOCAPLICA, DOCO_VENCE, ARTI_COD, CODE_TIPOAPL, CODE_TIPONUE)
                                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                            NROI = NROI + 1;
                            END
                        ELSE
                            UPDATE COMPROBANTE_DETALLE
                                SET CODE_DEBITO = :MONTO
                            WHERE CUEN_COD = :CUENTA AND ENCO_CONSEC = :IDC AND ARTI_COD = :ART;
                        END
                    END
                ELSE
                    BEGIN
                    SELECT COUNT(*) FROM COMPROBANTE_DETALLE WHERE CUEN_COD = :CUENTA AND ENCO_CONSEC = :IDC INTO :NUMROWS;
                    if (NUMROWS = 0) then
                        BEGIN
                        if (TIPOCUEN = 'C') then
                            INSERT INTO comprobante_detalle (ENCO_CONSEC, CODE_ITEM, CUEN_COD, CODE_CONCEPTO, CODE_REFER, CODE_DEBITO, CODE_CREDITO, CODE_BASE, CODE_PORC, TERC_NIT, PROY_COD, CENT_COD, CNDE_DOCNUMERO, CNDE_DOCAPLICA, DOCO_VENCE, ARTI_COD, CODE_TIPOAPL, CODE_TIPONUE)
                                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                        ELSE
                            INSERT INTO comprobante_detalle (ENCO_CONSEC, CODE_ITEM, CUEN_COD, CODE_CONCEPTO, CODE_REFER, CODE_DEBITO, CODE_CREDITO, CODE_BASE, CODE_PORC, TERC_NIT, PROY_COD, CENT_COD, CNDE_DOCNUMERO, CNDE_DOCAPLICA, DOCO_VENCE, ARTI_COD, CODE_TIPOAPL, CODE_TIPONUE)
                                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NROI = NROI + 1;
                        END
                    ELSE
                        UPDATE COMPROBANTE_DETALLE
                            SET CODE_DEBITO = :MONTO
                        WHERE CUEN_COD = :CUENTA AND ENCO_CONSEC = :IDC;
                    END
                END /* MONTO <> 0 */
            END /* COSTOS = K */
        if (INVEN = 'A') then
            BEGIN
            FOR SELECT MAX(CTAINV), SUM(CANT * COSTO)
                FROM COSTO_VENTAS WHERE TIDO_COD = 31 AND COVE_ID = :ID
                GROUP BY CTAINV
                INTO :CTAINVEN, :MONTO
                DO
                BEGIN
                if (MONTO <> 0) then
                    BEGIN
                    CUENTA = NULL;
                    SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                        WHERE CUEN_COD = :CTAINVEN INTO :CUENTA, :TIPOCUEN;
                    IF (CUENTA IS NULL) THEN
                        begin
                        EXCEPTION CUENTA_NO_EXISTE 'La cuenta ' || :ctainven || ' no existe.';
                        end
                    if (TIPOCUEN = 'I') then
                        BEGIN
                        /* ES UNA CUENTA DE INVENTARIO, REGISTRE UNO A UNO LOS ARTICULOS */
                        FOR SELECT ARTI_COD, CANT * COSTO
                            FROM COSTO_VENTAS WHERE TIDO_COD = 31 AND COVE_ID = :ID AND CTAINV = :CUENTA
                            INTO :ART, :MONTO
                            DO
                            BEGIN
                            SELECT COUNT(*) FROM COMPROBANTE_DETALLE WHERE CUEN_COD = :CUENTA AND ENCO_CONSEC = :IDC AND ARTI_COD = :ART INTO :NUMROWS;
                            if (NUMROWS = 0) then
                                BEGIN
                                INSERT INTO comprobante_detalle (ENCO_CONSEC, CODE_ITEM, CUEN_COD, CODE_CONCEPTO, CODE_REFER, CODE_DEBITO, CODE_CREDITO, CODE_BASE, CODE_PORC, TERC_NIT, PROY_COD, CENT_COD, CNDE_DOCNUMERO, CNDE_DOCAPLICA, DOCO_VENCE, ARTI_COD, CODE_TIPOAPL, CODE_TIPONUE)
                                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                                NROI = NROI + 1;
                                END
                            ELSE    
                                UPDATE COMPROBANTE_DETALLE
                                    SET CODE_CREDITO = :MONTO
                                WHERE CUEN_COD = :CUENTA AND ENCO_CONSEC = :IDC AND ARTI_COD = :ART;
                            END
                        END
                    ELSE
                        BEGIN
                        SELECT COUNT(*) FROM COMPROBANTE_DETALLE WHERE CUEN_COD = :CUENTA AND ENCO_CONSEC = :IDC INTO :NUMROWS;
                        if (NUMROWS = 0) then
                            BEGIN
                            if (TIPOCUEN = 'C') then
                                INSERT INTO comprobante_detalle (ENCO_CONSEC, CODE_ITEM, CUEN_COD, CODE_CONCEPTO, CODE_REFER, CODE_DEBITO, CODE_CREDITO, CODE_BASE, CODE_PORC, TERC_NIT, PROY_COD, CENT_COD, CNDE_DOCNUMERO, CNDE_DOCAPLICA, DOCO_VENCE, ARTI_COD, CODE_TIPOAPL, CODE_TIPONUE)
                                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                            ELSE
                                INSERT INTO comprobante_detalle (ENCO_CONSEC, CODE_ITEM, CUEN_COD, CODE_CONCEPTO, CODE_REFER, CODE_DEBITO, CODE_CREDITO, CODE_BASE, CODE_PORC, TERC_NIT, PROY_COD, CENT_COD, CNDE_DOCNUMERO, CNDE_DOCAPLICA, DOCO_VENCE, ARTI_COD, CODE_TIPOAPL, CODE_TIPONUE)
                                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                            NROI = NROI + 1;
                            END
                        ELSE
                            UPDATE COMPROBANTE_DETALLE
                                SET CODE_CREDITO = :MONTO
                            WHERE CUEN_COD = :CUENTA AND ENCO_CONSEC = :IDC;
                        END
                    END /* MONTO <> 0 */
                END /* FOR */
            END /* INVEN = A */
        if (INVEN = 'K') then
            BEGIN
            SELECT SUM(CANT * COSTO)
                FROM COSTO_VENTAS WHERE TIDO_COD = 31 AND COVE_ID = :ID
                INTO :MONTO;
            if (MONTO <> 0) then
                BEGIN
                CUENTA = NULL;
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :CTAINVEN INTO :CUENTA, :TIPOCUEN;
                IF (CUENTA IS NULL) THEN
                    begin
                    EXCEPTION CUENTA_NO_EXISTE 'La cuenta ' || :ctainven || ' no existe.';
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT ARTI_COD, CANT * COSTO
                        FROM COSTO_VENTAS WHERE TIDO_COD = 31 AND COVE_ID = :ID
                        INTO :ART, :MONTO
                        DO
                        BEGIN
                        SELECT COUNT(*) FROM COMPROBANTE_DETALLE WHERE CUEN_COD = :CUENTA AND ENCO_CONSEC = :IDC AND ARTI_COD = :ART INTO :NUMROWS;
                        if (NUMROWS = 0) then
                            BEGIN
                            INSERT INTO comprobante_detalle (ENCO_CONSEC, CODE_ITEM, CUEN_COD, CODE_CONCEPTO, CODE_REFER, CODE_DEBITO, CODE_CREDITO, CODE_BASE, CODE_PORC, TERC_NIT, PROY_COD, CENT_COD, CNDE_DOCNUMERO, CNDE_DOCAPLICA, DOCO_VENCE, ARTI_COD, CODE_TIPOAPL, CODE_TIPONUE)
                                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                            NROI = NROI + 1;
                            END
                        ELSE
                            UPDATE COMPROBANTE_DETALLE
                                SET CODE_CREDITO = :MONTO
                            WHERE CUEN_COD = :CUENTA AND ENCO_CONSEC = :IDC AND ARTI_COD = :ART;
                        END
                    END
                ELSE
                    BEGIN
                    SELECT COUNT(*) FROM COMPROBANTE_DETALLE WHERE CUEN_COD = :CUENTA AND ENCO_CONSEC = :IDC INTO :NUMROWS;
                    if (NUMROWS = 0) then
                        BEGIN
                        if (TIPOCUEN = 'C') then
                            INSERT INTO comprobante_detalle (ENCO_CONSEC, CODE_ITEM, CUEN_COD, CODE_CONCEPTO, CODE_REFER, CODE_DEBITO, CODE_CREDITO, CODE_BASE, CODE_PORC, TERC_NIT, PROY_COD, CENT_COD, CNDE_DOCNUMERO, CNDE_DOCAPLICA, DOCO_VENCE, ARTI_COD, CODE_TIPOAPL, CODE_TIPONUE)
                                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                        ELSE
                            INSERT INTO comprobante_detalle (ENCO_CONSEC, CODE_ITEM, CUEN_COD, CODE_CONCEPTO, CODE_REFER, CODE_DEBITO, CODE_CREDITO, CODE_BASE, CODE_PORC, TERC_NIT, PROY_COD, CENT_COD, CNDE_DOCNUMERO, CNDE_DOCAPLICA, DOCO_VENCE, ARTI_COD, CODE_TIPOAPL, CODE_TIPONUE)
                                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NROI = NROI + 1;
                        END
                    ELSE
                        UPDATE COMPROBANTE_DETALLE
                            SET CODE_CREDITO = :MONTO
                        WHERE CUEN_COD = :CUENTA AND ENCO_CONSEC = :IDC;
                    END
                END /* MONTO <> 0 */
            END /* INVEN = K */
        END
    end
  if (TIPO = 33) then
    BEGIN
    SELECT DEVT_ANULADO, PREF_PRE, DEVT_NUMERO, DEVT_FECHA, TERC_NIT, DEVT_REMID, devt_pedid
        FROM DEVOLUCIONES_VENTAS
        WHERE DEVT_ID = :ID INTO :ANULADO, :PREF, :NUM, :VENCEAUX, :NIT, :IDREM, :IDPED;
    if (idrem is null) Then
        IDREM = 0;
    if (idped is null) Then
        IDPED = 0;
    if ((ANULADO = 'N') AND (IDREM = 0) AND (IDPED = 0)) then
        BEGIN
        NUMERO = PREF || NUM;
        CONC = 'COSTO EN VENTAS DEVOLUCION ' || :NUMERO;
        EXECUTE PROCEDURE FECHA_A_CONTA(:VENCEAUX) returning_values (:VENCE);
        IF (CENT = 'B') THEN
            SELECT B.BODE_CENTRO, B.BODE_PROY FROM BODEGA B, DEVOLUCIONES_VENTAS F
                WHERE B.BODE_COD = F.BODE_COD AND F.DEVT_ID = :ID INTO :CENTRO, :PROY;
        IF (CENT = 'V') THEN
            SELECT V.CENT_COD, V.PROY_COD FROM VENDEDORES V, DEVOLUCIONES_VENTAS F
                WHERE V.VEND_COD = F.VEND_COD AND F.DEVT_ID = :ID INTO :CENTRO, :PROY;
        IF (CENT = 'P') THEN
            SELECT P.PREF_CENTRO,P.PREF_PROY  FROM PREFIJOS P, DEVOLUCIONES_VENTAS F
                WHERE P.PREF_PRE = F.PREF_PRE AND F.DEVT_ID = :ID AND P.TIDO_COD = 33 INTO :CENTRO, :PROY;
        EXECUTE PROCEDURE COSTO_EN_VENTAS(33, :ID);
        if (COSTOS = 'A') then
            BEGIN
            FOR SELECT MAX(CTACOS), SUM(cast(CANT as double precision) * COSTO)
                FROM COSTO_VENTAS WHERE TIDO_COD = 33 AND COVE_ID = :ID
                GROUP BY CTACOS
                INTO :CTACOSTOS, :MONTO
                DO
                BEGIN
                if (MONTO <> 0) then
                    BEGIN
                    EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :ID, :CTACOSTOS, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                    if (TIPOCUEN = 'I') then
                        BEGIN
                        /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                        FOR SELECT ARTI_COD, cast(CANT as double precision) * COSTO
                            FROM COSTO_VENTAS WHERE TIDO_COD = 33 AND COVE_ID = :ID AND CTACOS = :CUENTA
                            INTO :ART, :MONTO
                            DO
                            BEGIN
                            SELECT COUNT(*) FROM COMPROBANTE_DETALLE WHERE CUEN_COD = :CUENTA AND ENCO_CONSEC = :IDC AND ARTI_COD = :ART INTO :NUMROWS;
                            if (NUMROWS = 0) then
                                BEGIN
                                INSERT INTO comprobante_detalle (ENCO_CONSEC, CODE_ITEM, CUEN_COD, CODE_CONCEPTO, CODE_REFER, CODE_DEBITO, CODE_CREDITO, CODE_BASE, CODE_PORC, TERC_NIT, PROY_COD, CENT_COD, CNDE_DOCNUMERO, CNDE_DOCAPLICA, DOCO_VENCE, ARTI_COD, CODE_TIPOAPL, CODE_TIPONUE)
                                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                                NROI = NROI + 1;
                                END
                            ELSE
                                UPDATE COMPROBANTE_DETALLE
                                    SET CODE_CREDITO = :MONTO
                                WHERE CUEN_COD = :CUENTA AND ENCO_CONSEC = :IDC AND ARTI_COD = :ART;
                            END
                        END
                    SELECT COUNT(*) FROM COMPROBANTE_DETALLE WHERE CUEN_COD = :CUENTA AND ENCO_CONSEC = :IDC INTO :NUMROWS;
                    if (NUMROWS = 0) then
                        BEGIN
                        if (TIPOCUEN = 'C') then
                            INSERT INTO comprobante_detalle (ENCO_CONSEC, CODE_ITEM, CUEN_COD, CODE_CONCEPTO, CODE_REFER, CODE_DEBITO, CODE_CREDITO, CODE_BASE, CODE_PORC, TERC_NIT, PROY_COD, CENT_COD, CNDE_DOCNUMERO, CNDE_DOCAPLICA, DOCO_VENCE, ARTI_COD, CODE_TIPOAPL, CODE_TIPONUE)
                                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :vence, NULL, 0, 33);
                        else
                            INSERT INTO comprobante_detalle (ENCO_CONSEC, CODE_ITEM, CUEN_COD, CODE_CONCEPTO, CODE_REFER, CODE_DEBITO, CODE_CREDITO, CODE_BASE, CODE_PORC, TERC_NIT, PROY_COD, CENT_COD, CNDE_DOCNUMERO, CNDE_DOCAPLICA, DOCO_VENCE, ARTI_COD, CODE_TIPOAPL, CODE_TIPONUE)
                                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NROI = NROI + 1;
                        END
                    ELSE
                        UPDATE COMPROBANTE_DETALLE
                            SET CODE_CREDITO = :MONTO
                            WHERE CUEN_COD = :CUENTA AND ENCO_CONSEC = :IDC;
                    END /* MONTO <> 0 */
                END /* FOR */
            END /* COSTOS */
        if (COSTOS = 'K') then
            BEGIN
            SELECT SUM(cast(CANT as double precision) * COSTO)
                FROM COSTO_VENTAS WHERE TIDO_COD = 33 AND COVE_ID = :ID
                INTO :MONTO;
            if (MONTO <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :ID, :CTACOSTOS, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, REGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT ARTI_COD, cast(CANT as double precision) * COSTO
                        FROM COSTO_VENTAS WHERE TIDO_COD = 33 AND COVE_ID = :ID
                        INTO :ART, :MONTO
                        DO
                        BEGIN
                        SELECT COUNT(*) FROM COMPROBANTE_DETALLE WHERE CUEN_COD = :CUENTA AND ENCO_CONSEC = :IDC AND ARTI_COD = :ART INTO :NUMROWS;
                        if (NUMROWS = 0) then
                            BEGIN
                            INSERT INTO comprobante_detalle (ENCO_CONSEC, CODE_ITEM, CUEN_COD, CODE_CONCEPTO, CODE_REFER, CODE_DEBITO, CODE_CREDITO, CODE_BASE, CODE_PORC, TERC_NIT, PROY_COD, CENT_COD, CNDE_DOCNUMERO, CNDE_DOCAPLICA, DOCO_VENCE, ARTI_COD, CODE_TIPOAPL, CODE_TIPONUE)
                                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                            NROI = NROI + 1;
                            END
                        ELSE
                            UPDATE COMPROBANTE_DETALLE
                                SET CODE_CREDITO = :MONTO
                                WHERE CUEN_COD = :CUENTA AND ENCO_CONSEC = :IDC AND ARTI_COD = :ART;
                        END
                    END
                SELECT COUNT(*) FROM COMPROBANTE_DETALLE WHERE CUEN_COD = :CUENTA AND ENCO_CONSEC = :IDC INTO :NUMROWS;
                if (NUMROWS = 0) then
                    BEGIN
                    if (TIPOCUEN = 'C') then
                        INSERT INTO comprobante_detalle (ENCO_CONSEC, CODE_ITEM, CUEN_COD, CODE_CONCEPTO, CODE_REFER, CODE_DEBITO, CODE_CREDITO, CODE_BASE, CODE_PORC, TERC_NIT, PROY_COD, CENT_COD, CNDE_DOCNUMERO, CNDE_DOCAPLICA, DOCO_VENCE, ARTI_COD, CODE_TIPOAPL, CODE_TIPONUE)
                            VALUES (:IDC, :NROI, :CTACOSTOS, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :vence, NULL, 0, 33);
                    else
                        INSERT INTO comprobante_detalle (ENCO_CONSEC, CODE_ITEM, CUEN_COD, CODE_CONCEPTO, CODE_REFER, CODE_DEBITO, CODE_CREDITO, CODE_BASE, CODE_PORC, TERC_NIT, PROY_COD, CENT_COD, CNDE_DOCNUMERO, CNDE_DOCAPLICA, DOCO_VENCE, ARTI_COD, CODE_TIPOAPL, CODE_TIPONUE)
                            VALUES (:IDC, :NROI, :CTACOSTOS, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, null, NULL, null, NULL, 0, 0);
                    NROI = NROI + 1;
                    END
                ELSE
                    UPDATE COMPROBANTE_DETALLE
                        SET CODE_CREDITO = :MONTO
                        WHERE CUEN_COD = :CUENTA AND ENCO_CONSEC = :IDC;
                END /* MONTO <> 0 */
            END /* COSTOS = K */
        if (INVEN = 'A') then
            BEGIN
            FOR SELECT MAX(CTAINV), SUM(cast(CANT as double precision) * COSTO)
                FROM COSTO_VENTAS WHERE TIDO_COD = 33 AND COVE_ID = :ID
                GROUP BY CTAINV
                INTO :CTAINVEN, :MONTO
                DO
                BEGIN
                if (MONTO <> 0) then
                    BEGIN
                    EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :ID, :CTAINVEN, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                    if (TIPOCUEN = 'I') then
                        BEGIN
                        /* ES UNA CUENTA DE INVENTARIO, REGISTRE UNO A UNO LOS ARTICULOS */
                        FOR SELECT ARTI_COD, cast(CANT as double precision) * COSTO
                            FROM COSTO_VENTAS WHERE TIDO_COD = 33 AND COVE_ID = :ID AND CTAINV = :CUENTA
                            INTO :ART, :MONTO
                            DO
                            BEGIN
                            SELECT COUNT(*) FROM COMPROBANTE_DETALLE WHERE CUEN_COD = :CUENTA AND ENCO_CONSEC = :IDC AND ARTI_COD = :ART INTO :NUMROWS;
                            if (NUMROWS = 0) then
                                BEGIN
                                INSERT INTO comprobante_detalle (ENCO_CONSEC, CODE_ITEM, CUEN_COD, CODE_CONCEPTO, CODE_REFER, CODE_DEBITO, CODE_CREDITO, CODE_BASE, CODE_PORC, TERC_NIT, PROY_COD, CENT_COD, CNDE_DOCNUMERO, CNDE_DOCAPLICA, DOCO_VENCE, ARTI_COD, CODE_TIPOAPL, CODE_TIPONUE)
                                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                                NROI = NROI + 1;
                                END
                            ELSE
                                UPDATE COMPROBANTE_DETALLE
                                    SET CODE_DEBITO = :MONTO
                                    WHERE CUEN_COD = :CUENTA AND ENCO_CONSEC = :IDC AND ARTI_COD = :ART;
                            END
                        END
                    SELECT COUNT(*) FROM COMPROBANTE_DETALLE WHERE CUEN_COD = :CUENTA AND ENCO_CONSEC = :IDC INTO :NUMROWS;
                    if (NUMROWS = 0) then
                        BEGIN
                        if (TIPOCUEN = 'C') then
                            INSERT INTO comprobante_detalle (ENCO_CONSEC, CODE_ITEM, CUEN_COD, CODE_CONCEPTO, CODE_REFER, CODE_DEBITO, CODE_CREDITO, CODE_BASE, CODE_PORC, TERC_NIT, PROY_COD, CENT_COD, CNDE_DOCNUMERO, CNDE_DOCAPLICA, DOCO_VENCE, ARTI_COD, CODE_TIPOAPL, CODE_TIPONUE)
                                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :vence, NULL, 0, 33);
                        else
                            INSERT INTO comprobante_detalle (ENCO_CONSEC, CODE_ITEM, CUEN_COD, CODE_CONCEPTO, CODE_REFER, CODE_DEBITO, CODE_CREDITO, CODE_BASE, CODE_PORC, TERC_NIT, PROY_COD, CENT_COD, CNDE_DOCNUMERO, CNDE_DOCAPLICA, DOCO_VENCE, ARTI_COD, CODE_TIPOAPL, CODE_TIPONUE)
                                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NROI = NROI + 1;
                        END
                    ELSE
                        UPDATE COMPROBANTE_DETALLE
                            SET CODE_DEBITO = :MONTO
                            WHERE CUEN_COD = :CUENTA AND ENCO_CONSEC = :IDC;
                    END /* MONTO <> 0 */
                END /* FOR */
            END /* INVEN = A */
        if (INVEN = 'K') then
            BEGIN
            SELECT SUM(cast(CANT as double precision) * COSTO)
                FROM COSTO_VENTAS WHERE TIDO_COD = 33 AND COVE_ID = :ID
                INTO :MONTO;
            if (MONTO <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :ID, :CTAINVEN, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT ARTI_COD, cast(CANT as double precision) * COSTO
                        FROM COSTO_VENTAS WHERE TIDO_COD = 33 AND COVE_ID = :ID
                        INTO :ART, :MONTO
                        DO
                        BEGIN
                        SELECT COUNT(*) FROM COMPROBANTE_DETALLE WHERE CUEN_COD = :CUENTA AND ENCO_CONSEC = :IDC AND ARTI_COD = :ART INTO :NUMROWS;
                        if (NUMROWS = 0) then
                            BEGIN
                            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                VALUES (:IDC, :NROI, :CTAINVEN, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                            NROI = NROI + 1;
                            END
                        ELSE
                            UPDATE COMPROBANTE_DETALLE
                                SET CODE_DEBITO = :MONTO
                                WHERE CUEN_COD = :CUENTA AND ENCO_CONSEC = :IDC AND ARTI_COD = :ART;
                        END
                    END
                SELECT COUNT(*) FROM COMPROBANTE_DETALLE WHERE CUEN_COD = :CUENTA AND ENCO_CONSEC = :IDC INTO :NUMROWS;
                if (NUMROWS = 0) then
                    BEGIN
                    if (TIPOCUEN = 'C') then
                        INSERT INTO comprobante_detalle (ENCO_CONSEC, CODE_ITEM, CUEN_COD, CODE_CONCEPTO, CODE_REFER, CODE_DEBITO, CODE_CREDITO, CODE_BASE, CODE_PORC, TERC_NIT, PROY_COD, CENT_COD, CNDE_DOCNUMERO, CNDE_DOCAPLICA, DOCO_VENCE, ARTI_COD, CODE_TIPOAPL, CODE_TIPONUE)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :vence, NULL, 0, 33);
                    else
                        INSERT INTO comprobante_detalle (ENCO_CONSEC, CODE_ITEM, CUEN_COD, CODE_CONCEPTO, CODE_REFER, CODE_DEBITO, CODE_CREDITO, CODE_BASE, CODE_PORC, TERC_NIT, PROY_COD, CENT_COD, CNDE_DOCNUMERO, CNDE_DOCAPLICA, DOCO_VENCE, ARTI_COD, CODE_TIPOAPL, CODE_TIPONUE)
                            VALUES (:IDC, :NROI, :CTAINVEN, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    END
                ELSE
                    UPDATE COMPROBANTE_DETALLE
                        SET CODE_DEBITO = :MONTO
                        WHERE CUEN_COD = :CUENTA AND ENCO_CONSEC = :IDC;
                END /* MONTO <> 0 */
            END  /* INVEN = K */
        END
    END
  END
end

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE CONTABIL_DEVOLCLI(
    IDDOC INTEGER,
    IDINTER INTEGER)
RETURNS (
    ERROR INTEGER,
    VER CHAR(1),
    IDC INTEGER)
AS
declare variable PREF VARCHAR(4);
declare variable NUM VARCHAR(6);
declare variable NUMERO VARCHAR(10);
declare variable FECAUX DATE;
declare variable FECHA CHAR(8);
declare variable CONC CHAR(120);
declare variable NUMFAC VARCHAR(10);
declare variable VRDTO NUMERIC(18, 2);
declare variable VRADIC NUMERIC(18, 2);
declare variable VRSUBT NUMERIC(18, 2);
declare variable VRIVA NUMERIC(18, 2);
declare variable PRTFTE NUMERIC(9, 2);
declare variable VRRTFTE NUMERIC(18, 2);
declare variable VRRTIVA NUMERIC(18, 2);
declare variable PRTICA NUMERIC(9, 2);
declare variable VRRTICA NUMERIC(18, 2);
declare variable VRTOTAL NUMERIC(18, 2);
declare variable VREXTRA NUMERIC(18, 2);
declare variable TIPOCOMP VARCHAR(3);
declare variable PREFCONT VARCHAR(4);
declare variable VENTAS CHAR(1);
declare variable CTAVENTAS VARCHAR(20);
declare variable IVA CHAR(1);
declare variable CTAIVA VARCHAR(20);
declare variable CONSUMO CHAR(1);
declare variable CTACONSUMO VARCHAR(20);
declare variable CARTERA CHAR(1);
declare variable CTACARTERA VARCHAR(20);
declare variable RTFTE CHAR(1);
declare variable CTARTFTE VARCHAR(20);
declare variable RTIVA CHAR(1);
declare variable CTARTIVA VARCHAR(20);
declare variable RTICA CHAR(1);
declare variable CTARTICA VARCHAR(20);
declare variable INVEN CHAR(1);
declare variable CTAINVEN VARCHAR(20);
declare variable COSTOS CHAR(1);
declare variable CTACOSTOS VARCHAR(20);
declare variable CTADTO VARCHAR(20);
declare variable CTAADIC VARCHAR(20);
declare variable CTAEXTRA VARCHAR(20);
declare variable EXISTE CHAR(1);
declare variable CUENTA VARCHAR(20);
declare variable MONTO NUMERIC(18,2);
declare variable TIPOCUEN CHAR(1);
declare variable NIT VARCHAR(20);
declare variable PROY VARCHAR(4);
declare variable CENTRO VARCHAR(4);
declare variable PROYI VARCHAR(4);
declare variable CENTI VARCHAR(4);
declare variable PORC NUMERIC(5,2);
declare variable DEBITO NUMERIC(18,2);
declare variable CREDITO NUMERIC(18,2);
declare variable NROI INTEGER;
declare variable ART VARCHAR(15);
declare variable IMPINC CHAR(1);
declare variable IMPTOS NUMERIC(18, 2);
declare variable SUMA NUMERIC(18,2);
declare variable PORCIVA NUMERIC(9,2);
declare variable TCTACLIEN VARCHAR(20);
declare variable TCTAVENTA VARCHAR(20);
declare variable TCTARTFTE VARCHAR(20);
declare variable TCTARTIVA VARCHAR(20);
declare variable TCTARTICA VARCHAR(20);
declare variable CTADIC VARCHAR(20);
declare variable BASEADIC VARCHAR(20);
declare variable PORCADIC NUMERIC(5,2);
declare variable VALORADIC NUMERIC(18,2);
declare variable DBADIC CHAR(1);
declare variable PTOVTA INTEGER;
declare variable ANULADO CHAR(1);
declare variable CENT CHAR(1);
DECLARE VARIABLE MERCANCIA NUMERIC(18,2);
declare variable FACTOR DOUBLE PRECISION;
declare variable DIG INTEGER;
DECLARE VARIABLE FOMENTO VARCHAR(2);
DECLARE VARIABLE VRCONSUMO NUMERIC(18,2);
declare variable AUTORET VARCHAR(10);
declare variable FAUTORET DATE;
declare variable IDREM INTEGER;
declare variable IDPED INTEGER;
declare variable DTOXIT CHAR(2);
declare variable ERRORC INTEGER;
BEGIN
EXECUTE PROCEDURE LEE_CONFIGURACION('COMPRAS', 'FACTURAS', 'USAR IMPOCONSUMO COMO PORCENTAJE DE FOMENTO') returning_values (FOMENTO);
EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'FECHA AUTORETENEDOR NO DESCONTAR RETENCIONES DEL SALDO PERO SI CONTABILIZARLAS') returning_values (AUTORET);
if (AUTORET <> '') then
    FAUTORET = CAST(AUTORET AS DATE);
else
    FAUTORET = '9999/12/31';
  /* BUSQUE LA INTERFACE */
  EXISTE = 'N';
  SELECT 'S', TICO_COD, PRCO_PRE, INVE_VENTAS, INVE_IVA, INVE_CONSUMO, INVE_CARTERA, INVE_RTFTE, INVE_RTIVA, INVE_RTICA, INVE_COSTO, INVE_INVEN, INVE_CTAVENTAS, INVE_CTAIVA, INVE_CTACONSUMO, INVE_CTADTO, INVE_CTAADIC, INVE_CTAEXTRA, INVE_CTACARTERA, INVE_CTARTFTE, INVE_CTARTIVA, INVE_CTARTICA, INVE_CTAINVEN, INVE_CTACOSTOS, INVE_CONFIRMAR, INVE_CENTRO
    FROM INTERFAZ_VENTAS
    WHERE INVE_ID = :IDINTER
    INTO :EXISTE, :TIPOCOMP, :PREFCONT, :VENTAS, :IVA, :CONSUMO, :CARTERA, :RTFTE, :RTIVA, :RTICA, :COSTOS, :INVEN, :CTAVENTAS, :CTAIVA, :CTACONSUMO, :CTADTO, :CTAADIC, :CTAEXTRA, :CTACARTERA, :CTARTFTE, :CTARTIVA, :CTARTICA, :CTAINVEN, :CTACOSTOS, :VER, :CENT;
  if (EXISTE = 'S') then
   BEGIN
    /* BORRE CUALQUEIR CONTABILIZACION PREVIA */
    DELETE FROM CONTABILIZACION WHERE CNTB_TIPOREF = 33 AND CNTB_IDREF = :IDDOC;
    /* TRAIGA EL ENCABEZADO DE LA DEVOLUCION */
   SELECT PREF_PRE, DEVT_NUMERO, DEVT_FECHA, F.TERC_NIT, DEVT_IVAINC, PTVT_ID, DEVT_FACTURA, DEVT_DTOMONTO, DEVT_ADICIONAL, DEVT_IVAMONTO, DEVT_EXTRA, DEVT_TOTAL, DEVT_RTFTEPORC, DEVT_RTFTEMONTO, DEVT_RTIVAPORC, DEVT_RTIVAMONTO, DEVT_RTICAPORC, DEVT_RTICAMONTO, TERC_CTARTFTE, TERC_CTARTIVA, TERC_CTARTICA, TERC_CTAVENTA, TERC_CTACLIENTE, DEVT_ANULADO, DEVT_REMID, DEVT_PEDID
        FROM DEVOLUCIONES_VENTAS F, TERCEROS T
        WHERE DEVT_ID = :IDDOC AND F.TERC_NIT = T.TERC_NIT
        INTO :PREF, :NUM, :FECAUX, :NIT, :IMPINC, :PTOVTA, :NUMFAC, :VRDTO, :VRADIC, :VRIVA, :VREXTRA, :VRTOTAL, :PRTFTE, :VRRTFTE, :PORC, :VRRTIVA, :PRTICA, :VRRTICA, :TCTARTFTE, TCTARTIVA, TCTARTICA, TCTAVENTA, TCTACLIEN, ANULADO, :IDREM, :IDPED;
   if (idrem is null) Then
    IDREM = 0;
   if (idped is null) Then
    IDPED = 0;
   if ((ANULADO = 'N') AND (IDREM = 0) AND (IDPED = 0)) then
    BEGIN
    NUMERO = PREF || NUM;
    SELECT SUM(DVDE_CONSUMO) FROM devoluciones_ventas_detalle WHERE DEVT_ID = :iddoc AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL)) INTO :MERCANCIA;
    VRSUBT = VRTOTAL - VREXTRA - VRIVA - MERCANCIA; /* BASE DE RETEFTE Y RETEICA */
    EXECUTE PROCEDURE lee_configuracion ('FACTURACION', 'DEVOLUCIONES', 'DESCUENTO PIE DEVOLUCION IGUAL A SUMA DE DESCUENTOS POR ITEM') returning_values (:DTOXIT);
    if (DTOXIT = 'SI') then
        VRDTO = 0;
    MERCANCIA = VRSUBT - VRADIC + VRDTO;
    IF (CENT = 'B') THEN
        SELECT B.BODE_CENTRO, B.BODE_PROY FROM BODEGA B, DEVOLUCIONES_VENTAS F
            WHERE B.BODE_COD = F.BODE_COD AND F.DEVT_ID = :IDDOC INTO :CENTRO, :PROY;
    IF (CENT = 'V') THEN
        SELECT V.CENT_COD, V.PROY_COD FROM VENDEDORES V, DEVOLUCIONES_VENTAS F
            WHERE V.VEND_COD = F.VEND_COD AND F.DEVT_ID = :IDDOC INTO :CENTRO, :PROY;
    IF (CENT = 'P') THEN
        SELECT P.PREF_CENTRO,P.PREF_PROY  FROM PREFIJOS P, DEVOLUCIONES_VENTAS F
            WHERE P.PREF_PRE = F.PREF_PRE AND F.DEVT_ID = :IDDOC AND P.TIDO_COD = 33 INTO :CENTRO, :PROY;
    EXECUTE PROCEDURE FECHA_A_CONTA(:FECAUX) returning_values (:FECHA);
    /* REGISTRE EL ENCABEZADO CONTABLE */
    IDC = GEN_ID(ID_CONTABILIZA, 1);
    CONC = 'DEVOLUCION VENTAS No. ' || NUMERO || ' EN FACTURA ' || NUMFAC;
    CONC = SUBSTR(CONC, 1, 60);
    INSERT INTO CONTABILIZACION (CNTB_ID, CNTB_TIPOCOMP, CNTB_PREFCNT, CNTB_NUMERO, CNTB_FECHA, CNTB_CONCEPTO, CNTB_REF, CNTB_TIPOREF, CNTB_IDREF, CNTB_PREFREF, CNTB_NUMREF, CNTB_PROCESADO)
        VALUES (:IDC, :TIPOCOMP, :PREFCONT, :NUM, :FECHA, :CONC, '', 33, :IDDOC, :PREF, :NUM, 'N');
    NROI = 0;
    SUMA = 0;
    ERROR = 0;
    /* SI NO HAY CUENTA DE DESCUENTO NI ADICIONAL CALCULE UN FACTOR PARA LAS VENTAS Y EL IVA */
    if (MERCANCIA <> 0) then
        FACTOR = CAST(VRSUBT AS DOUBLE PRECISION) / CAST(MERCANCIA AS DOUBLE PRECISION);
    ELSE
        FACTOR = 1;
    /* TRAIGA EL NUMERO DE DIGITOS PARA EL REDONDEO */
    SELECT CAST(CONF_VALOR AS INTEGER) FROM CONFIGURACION WHERE CONF_MODULO = 'FACTURACION' AND
        CONF_CATEGORIA = 'GENERAL' AND CONF_PROPIEDAD = 'REDONDEO AL MULTIPLO DE DIEZ EN TOTALES' INTO :DIG;
    /* CUENTAS DE VENTAS */
    if (VENTAS = 'A') then
        BEGIN
        FOR SELECT MAX(COAR_CTADEV), SUM(DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO), SUM(DVDE_IVAMONTO), SUM(DVDE_CONSUMO), MAX(B.bode_proy), MAX(B.bode_centro)
            FROM ARTICULO A, CONTABIL_ARTICULO C, DEVOLUCIONES_VENTAS_DETALLE F, BODEGA B
            WHERE F.DEVT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND B.bode_cod = F.bode_cod AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
            GROUP BY COAR_CTADEV
            INTO :CTAVENTAS, :MONTO, :IMPTOS, :VRCONSUMO, :proyi, :centi
            DO
            BEGIN
            if (FOMENTO = 'SI') then
                MONTO = MONTO + VRCONSUMO;
            if ((CTADTO IS NULL) OR (CTADTO = '')) then
                MONTO = MONTO * FACTOR;
            execute procedure redondee(MONTO, DIG) returning_values (MONTO);
            if (MONTO <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTAVENTAS, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT F.ARTI_COD, (DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO), (DVDE_IVAMONTO+DVDE_CONSUMO)
                        FROM ARTICULO A, CONTABIL_ARTICULO C, DEVOLUCIONES_VENTAS_DETALLE F
                        WHERE F.DEVT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTAINV = :CUENTA AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
                        INTO :ART, :MONTO, :IMPTOS
                    DO
                        BEGIN
                        if (IMPINC = 'S') then
                            MONTO = MONTO - IMPTOS;
                        if ((CTADTO IS NULL) OR (CTADTO = '')) then
                            MONTO = MONTO * FACTOR;
                        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        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, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                    NROI = NROI + 1;
                    SUMA = SUMA + MONTO;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    IF (CENT = 'B') THEN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROYI, :CENTI, NULL, NULL, NULL, NULL, 0, 0);
                    ELSE
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA + MONTO;
                    END
                END /* MONTO <> 0 */
            END /* FOR */
        END /* VENTAS X ARTICULO */
     IF ((VENTAS = 'C') OR (VENTAS = 'K')) THEN
        BEGIN
        IF (VENTAS = 'C') THEN
            CTAVENTAS = TCTAVENTA;
        SELECT SUM(DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO), SUM(DVDE_IVAMONTO), SUM(DVDE_CONSUMO)
            FROM DEVOLUCIONES_VENTAS_DETALLE F
            WHERE F.DEVT_ID = :IDDOC  AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
            INTO :MONTO, :IMPTOS, :VRCONSUMO;
        if (FOMENTO = 'SI') then
            MONTO = MONTO + VRCONSUMO;
        if ((CTADTO IS NULL) OR (CTADTO = '')) then
            MONTO = MONTO * FACTOR;
        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
        if (MONTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTAVENTAS, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT F.ARTI_COD, (DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO), (DVDE_IVAMONTO+DVDE_CONSUMO)
                    FROM ARTICULO A, DEVOLUCIONES_VENTAS_DETALLE F
                    WHERE F.DEVT_ID = :IDDOC AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
                    INTO :ART, :MONTO, :IMPTOS
                    DO
                    BEGIN
                    if (IMPINC = 'S') then
                        MONTO = MONTO - IMPTOS;
                    if ((CTADTO IS NULL) OR (CTADTO = '')) then
                        MONTO = MONTO * FACTOR;
                    execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                    NROI = NROI + 1;
                    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, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                NROI = NROI + 1;
                SUMA = SUMA + MONTO;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA + MONTO;
                END
            END /* MONTO <> 0 */
        END /* VENTAS DE CLIENTE O CONSTANTE */
    /* EL IVA EN VENTAS */
    if (IVA = 'A') then
        BEGIN
        FOR SELECT MAX(COAR_CTAIVAV), SUM(DVDE_IVAMONTO), SUM(DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO), SUM(DVDE_CONSUMO)
            FROM ARTICULO A, CONTABIL_ARTICULO C, DEVOLUCIONES_VENTAS_DETALLE F
            WHERE F.DEVT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
            GROUP BY COAR_CTAIVAV
            INTO :CTAIVA, :IMPTOS, :MONTO, :VALORADIC
        DO
            BEGIN
            if (FOMENTO = 'SI') then
                MONTO = MONTO + VALORADIC;
            MONTO = MONTO * -1;
            MONTO = MONTO * FACTOR;
            IMPTOS = IMPTOS * FACTOR;
            execute procedure redondee(MONTO, DIG) returning_values (MONTO);
            execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
            if (IMPTOS <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTAIVA, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT F.ARTI_COD, DVDE_IVAMONTO, (DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO), TAIV_PORC, DVDE_CONSUMO
                        FROM ARTICULO A, CONTABIL_ARTICULO C, DEVOLUCIONES_VENTAS_DETALLE F, TARIFA_IVA T
                        WHERE F.DEVT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND A.TAIV_COD = T.TAIV_COD AND COAR_CTAIVAV = :CUENTA AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
                        INTO :ART, :IMPTOS, :MONTO, :PORCIVA, :VALORADIC
                    DO
                        BEGIN
                        if (IMPINC = 'S') then
                            MONTO = MONTO - IMPTOS - VALORADIC;
                        MONTO = MONTO * -1;
                        MONTO = MONTO * FACTOR;
                        IMPTOS = IMPTOS * FACTOR;
                        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                        execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                        if (IMPTOS <> 0) then
                            BEGIN
                            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :IMPTOS, 0, :MONTO, :PORCIVA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                            NROI = NROI + 1;
                            SUMA = SUMA + IMPTOS;
                            END
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                    NROI = NROI + 1;
                    SUMA = SUMA + IMPTOS;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA + IMPTOS;
                    END
                END   /* IMPTOS <> 0 */
            END /* FOR */
        END /* IVA X ARTICULO */
    if (IVA = 'K') then /* IVA EN CTA CONSTANTE */
        BEGIN
        SELECT SUM(DVDE_IVAMONTO), SUM(DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO), SUM(DVDE_CONSUMO)
            FROM DEVOLUCIONES_VENTAS_DETALLE F
            WHERE F.DEVT_ID = :IDDOC  AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
            INTO :IMPTOS, :MONTO, :VALORADIC;
        if (FOMENTO = 'SI') then
            MONTO = MONTO + VALORADIC;
        MONTO = MONTO * -1;
        MONTO = MONTO * FACTOR;
        IMPTOS = IMPTOS * FACTOR;
        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
        execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
        if (IMPTOS <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTAIVA, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT F.ARTI_COD, (DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO), DVDE_IVAMONTO, TAIV_PORC, DVDE_CONSUMO
                    FROM ARTICULO A, DEVOLUCIONES_VENTAS_DETALLE F, TARIFA_IVA T
                    WHERE F.DEVT_ID = :IDDOC AND A.TAIV_COD = T.TAIV_COD AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
                    INTO :ART, :MONTO, :IMPTOS, :PORCIVA, :VALORADIC
                    DO
                    BEGIN
                    if (IMPINC = 'S') then
                        MONTO = MONTO - IMPTOS - VALORADIC;
                    MONTO = MONTO * -1;
                    MONTO = MONTO * FACTOR;
                    IMPTOS = IMPTOS * FACTOR;
                    execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                    execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                    if (IMPTOS <> 0) then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', :IMPTOS, 0, :MONTO, :PORCIVA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        SUMA = SUMA + IMPTOS;
                        END
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                NROI = NROI + 1;
                SUMA = SUMA + IMPTOS;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA + IMPTOS;
                END
            END /* IMPTOS <> 0 */
        END /* IVA EN CTA CONSTANTE */
    /* EL IMPOCONSUMO */
    if ((CONSUMO = 'A') AND (FOMENTO <> 'SI')) then
        BEGIN
        FOR SELECT MAX(COAR_CTACONS), SUM(DVDE_CONSUMO)
            FROM ARTICULO A, CONTABIL_ARTICULO C, DEVOLUCIONES_VENTAS_DETALLE F
            WHERE F.DEVT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
            GROUP BY COAR_CTACONS
            INTO :CTACONSUMO, :IMPTOS
        DO
            BEGIN
            if (IMPTOS <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTACONSUMO, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, REGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT F.ARTI_COD, DVDE_CONSUMO
                        FROM ARTICULO A, CONTABIL_ARTICULO C, DEVOLUCIONES_VENTAS_DETALLE F
                        WHERE F.DEVT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTACONS = :CUENTA AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
                        INTO :ART, :IMPTOS
                    DO
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 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, :NROI, :CUENTA, :CONC, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                    NROI = NROI + 1;
                    SUMA = SUMA + IMPTOS;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA + IMPTOS;
                    END
                END /* IMPTOS <> 0 */
            END /* FOR */
        END /* CONSUMO X ARTICULO */
    if ((CONSUMO = 'K') AND (FOMENTO <> 'SI')) then
        BEGIN
        SELECT SUM(DVDE_CONSUMO)
            FROM DEVOLUCIONES_VENTAS_DETALLE F
            WHERE F.DEVT_ID = :IDDOC AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
            INTO :IMPTOS;
        if (IMPTOS <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTACONSUMO, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT F.ARTI_COD, DVDE_CONSUMO
                    FROM ARTICULO A, DEVOLUCIONES_VENTAS_DETALLE F
                    WHERE F.DEVT_ID = :IDDOC  AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
                    INTO :ART, :IMPTOS
                    DO
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTACONSUMO, :CONC, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                    NROI = NROI + 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, :NROI, :CTACONSUMO, :CONC, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA + IMPTOS;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTACONSUMO, :CONC, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA + IMPTOS;
                END
            END /* IMPTOS <> 0 */
        END /* CONSUMO EN CTA CONSTANTE */
    /* DESCUENTO */
    if ((CTADTO IS NOT NULL) AND
        (CTADTO <> '') AND
        (VRDTO <> 0)) THEN
        BEGIN
        EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTADTO, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRDTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
            NROI = NROI + 1;
            SUMA = SUMA - VRDTO;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRDTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 33);
            NROI = NROI + 1;
            SUMA = SUMA - VRDTO;
            END
        END /* DESCUENTO */
    /* VALOR ADIC */
    if ((CTAADIC IS NOT NULL) AND
        (CTAADIC <> '') AND
        (VRADIC <> 0)) THEN
        BEGIN
        EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTAADIC, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRADIC, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
            NROI = NROI + 1;
            SUMA = SUMA + VRADIC;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRADIC, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 33);
            NROI = NROI + 1;
            SUMA = SUMA + VRADIC;
            END
        END /* VR. ADIC */
    /* VALOR EXTRA */
    if ((CTAEXTRA IS NOT NULL) AND
        (CTAEXTRA <> '') AND
        (VREXTRA <> 0)) THEN
        BEGIN
        EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTAEXTRA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VREXTRA, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
            NROI = NROI + 1;
            SUMA = SUMA + VREXTRA;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VREXTRA, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 33);
            NROI = NROI + 1;
            SUMA = SUMA + VREXTRA;
            END
        END /* VR. EXTRA */
    /* RETENCION FUENTE */
    if ((RTFTE = 'C') or (RTFTE = 'K')) then
      if (VRRTFTE <> 0) then
        BEGIN
        if (RTFTE = 'C') then
            CTARTFTE = TCTARTFTE;
        EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTARTFTE, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, (:VRSUBT*-1), :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
            NROI = NROI + 1;
            SUMA = SUMA - VRRTFTE;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, (:VRSUBT*-1), :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA - VRRTFTE;
            END
        /* AUTORETENCION */
        if (FAUTORET <= fecaux) then
            BEGIN
            EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'CUENTA DE AUTORETENCION EN LA FUENTE') returning_values (CTARTFTE);
            EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTARTFTE, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :VRSUBT, :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                NROI = NROI + 1;
                SUMA = SUMA + VRRTFTE;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :VRSUBT, :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA + VRRTFTE;
                END
            END
        END /* RTFTE */
    if (RTFTE = 'A') then
      BEGIN
      FOR SELECT MAX(COAR_CTARTFTEV), MAX(COAR_RTFTE), MIN(COAR_RTBASE), SUM(DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO), SUM((DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO)*COAR_RTFTE)
        FROM CONTABIL_ARTICULO C, devoluciones_ventas_detalle F
        WHERE F.devt_id = :IDDOC AND F.ARTI_COD = C.ARTI_COD AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
        GROUP BY COAR_CTARTFTEV
        INTO :CTARTFTE, :PRTFTE, :baseadic, :MONTO, :VRRTFTE
        DO
        BEGIN
        MONTO = MONTO * FACTOR;
        if (MONTO >= BASEADIC) then
            BEGIN
            VRRTFTE = VRRTFTE * FACTOR / 100;
            execute procedure redondee(VRRTFTE, DIG) returning_values (VRRTFTE);
            execute procedure redondee(MONTO, DIG) returning_values (MONTO);
            if (VRRTFTE <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTARTFTE, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, (:MONTO*-1), :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                    NROI = NROI + 1;
                    SUMA = SUMA - VRRTFTE;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, (:MONTO*-1), :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA - VRRTFTE;
                    END
                /* AUTORETENCION */
                if (FAUTORET <= fecaux) then
                    BEGIN
                    EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'CUENTA DE AUTORETENCION EN LA FUENTE') returning_values (CTARTFTE);
                    EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTARTFTE, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
                    if (ERRORC <> 0) then
                        ERROR = ERROR + 1;
                    if (TIPOCUEN = 'C') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :MONTO, :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                        NROI = NROI + 1;
                        SUMA = SUMA + VRRTFTE;
                        END
                    if (TIPOCUEN = 'N') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :MONTO, :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NROI = NROI + 1;
                        SUMA = SUMA + VRRTFTE;
                        END
                    END
                END
            END
        END /* RTFTE */
      END
    /* RETENCION IVA */
    if ((RTIVA = 'C') or (RTIVA = 'K')) then
      if (VRRTIVA <> 0) then
        BEGIN
        if (RTIVA = 'C') then
            CTARTIVA = TCTARTIVA;
        EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTARTIVA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTIVA, (:VRIVA*-1), :PORC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
            NROI = NROI + 1;
            SUMA = SUMA - VRRTIVA;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTIVA, (:VRIVA*-1), :PORC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA - VRRTIVA;
            END
        END /* RTIVA */
    /* RETENCION DE ICA */
    if ((RTICA = 'C') or (RTICA = 'K')) then
      if (VRRTICA <> 0) then
        BEGIN
        if (RTICA = 'C') then
            CTARTICA = TCTARTICA;
        EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTARTICA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTICA, (:VRSUBT*-1), :PRTICA, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
            NROI = NROI + 1;
            SUMA = SUMA - VRRTICA;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTICA, (:VRSUBT*-1), :PRTICA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA - VRRTICA;
            END
        END /* RTICA */
    /* CIERRE EL COMPROBANTE CONTRA LA CUENTA DEL TERCERO O LA CONSTANTE */
    if ((SUMA <> 0) and ((CARTERA = 'C') or (CARTERA = 'K') or (CARTERA = 'J'))) then
        BEGIN
        if (SUMA < 0) then
            BEGIN
            DEBITO = SUMA * -1;
            CREDITO = 0;
            END
        ELSE
            BEGIN
            DEBITO = 0;
            CREDITO = SUMA;
            END
        if (CARTERA = 'C') then
            CTACARTERA = TCTACLIEN;
        if (CARTERA = 'J') then
            BEGIN
            /* BUSQUE LA CUENTA DE LA CAJA */
            SELECT CAJA_CUENTA FROM CAJAS C, PUNTO_VENTA P
                WHERE P.CAJA_ID = C.CAJA_ID AND PTVT_ID = :PTOVTA
                INTO :CTACARTERA;
            END
        EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTACARTERA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :DEBITO, :CREDITO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
        if (TIPOCUEN = 'N') then
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :DEBITO, :CREDITO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
        NROI = NROI + 1;
        END /* SUMA EN CARTERA */
    /* CALCULE COSTOS EN VENTAS */
    EXECUTE PROCEDURE COSTO_EN_VENTAS(33, :IDDOC);
    if (COSTOS = 'A') then
        BEGIN
        FOR SELECT MAX(CTACOS), SUM(cast(CANT as double precision) * COSTO)
            FROM COSTO_VENTAS WHERE TIDO_COD = 33 AND COVE_ID = :IDDOC
            GROUP BY CTACOS
            INTO :CTACOSTOS, :MONTO
        DO
            BEGIN
            if (MONTO <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTACOSTOS, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT ARTI_COD, cast(CANT as double precision) * COSTO
                        FROM COSTO_VENTAS WHERE TIDO_COD = 33 AND COVE_ID = :IDDOC AND CTACOS = :CUENTA
                        INTO :ART, :MONTO
                    DO
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                    NROI = NROI + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    END
                END /* MONTO <> 0 */
            END /* FOR */
        END /* COSTOS */
    if (COSTOS = 'K') then
        BEGIN
        SELECT SUM(cast(CANT as double precision) * COSTO)
            FROM COSTO_VENTAS WHERE TIDO_COD = 33 AND COVE_ID = :IDDOC
            INTO :MONTO;
        if (MONTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTACOSTOS, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, REGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT ARTI_COD, cast(CANT as double precision) * COSTO
                    FROM COSTO_VENTAS WHERE TIDO_COD = 33 AND COVE_ID = :IDDOC
                    INTO :ART, :MONTO
                DO
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTACOSTOS, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                    NROI = NROI + 1;
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTACOSTOS, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                NROI = NROI + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTACOSTOS, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                END
            END /* MONTO <> 0 */
        END /* COSTOS = K */
    if (INVEN = 'A') then
        BEGIN
        FOR SELECT MAX(CTAINV), SUM(cast(CANT as double precision) * COSTO)
            FROM COSTO_VENTAS WHERE TIDO_COD = 33 AND COVE_ID = :IDDOC
            GROUP BY CTAINV
            INTO :CTAINVEN, :MONTO
        DO
            BEGIN
            if (MONTO <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTAINVEN, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, REGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT ARTI_COD, cast(CANT as double precision) * COSTO
                        FROM COSTO_VENTAS WHERE TIDO_COD = 33 AND COVE_ID = :IDDOC AND CTAINV = :CUENTA
                        INTO :ART, :MONTO
                    DO
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                    NROI = NROI + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    END
                END /* MONTO <> 0 */
            END /* FOR */
        END /* INVEN = A */
    if (INVEN = 'K') then
        BEGIN
        SELECT SUM(cast(CANT as double precision) * COSTO)
            FROM COSTO_VENTAS WHERE TIDO_COD = 33 AND COVE_ID = :IDDOC
            INTO :MONTO;
        if (MONTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTAINVEN, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT ARTI_COD, cast(CANT as double precision) * COSTO
                    FROM COSTO_VENTAS WHERE TIDO_COD = 33 AND COVE_ID = :IDDOC
                    INTO :ART, :MONTO
                DO
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTAINVEN, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                    NROI = NROI + 1;
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAINVEN, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                NROI = NROI + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAINVEN, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                END
            END /* MONTO <> 0 */
        END /* INVEN = K */
    /* recorra las cuentas adicionales */
    FOR SELECT INVC_CUENTA, INVC_BASE, INVC_PORC, INVC_VALOR, INVC_DB
        FROM INTERFAZ_VENTAS_CTAS WHERE INVE_ID = :IDINTER
        INTO :CTADIC, :BASEADIC, :PORCADIC, :VALORADIC, :DBADIC
        DO
        BEGIN
        if (valoradic <> 0) then
            monto = valoradic;
        else
            BEGIN
            if (:BASEADIC = 'SUBTOTAL') then
                VALORADIC = vrsubt;
            if (:BASEADIC = 'DESCUENTO') then
                VALORADIC = VRDTO;
            if (:BASEADIC = 'IVA') then
                VALORADIC = VRIVA;
            if (:BASEADIC = 'ADICIONAL') then
                VALORADIC = VRADIC;
            if (:BASEADIC = 'EXTRA') then
                VALORADIC = VREXTRA;
            if (:BASEADIC = 'TOTAL') then
                VALORADIC = VRTOTAL;
            MONTO = VALORADIC * PORCADIC;
            END
        if (MONTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTADIC, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                if (DBADIC = 'S') then
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                ELSE
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                NROI = NROI + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                if (DBADIC = 'S') then
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                ELSE
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                END
            NROI = NROI + 1;
            END
        END
    if (error > 0) then
        ver = 'S';
    SUSPEND;
    END
   END /* EXISTE LA INTERFAZ */
  ELSE
    BEGIN
    EXECUTE PROCEDURE ERROR (33, :IDDOC, :PREF, 1);
    ERROR = ERROR + 1;
    VER = 'S';
    SUSPEND;
    END
END

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE CONTABIL_FACTURA(
    IDDOC INTEGER,
    IDINTER INTEGER)
RETURNS (
    ERROR INTEGER,
    VER CHAR(1),
    IDC INTEGER)
AS
declare variable pref varchar(4);
declare variable num varchar(6);
declare variable numero varchar(10);
declare variable fecaux date;
declare variable fecha char(8);
declare variable conc varchar(60);
declare variable venceaux date;
declare variable vence char(8);
declare variable vrdto numeric(18,2);
declare variable vradic numeric(18,2);
declare variable vrsubt numeric(18,2);
declare variable vriva numeric(18,2);
declare variable prtfte numeric(9,2);
declare variable vrrtfte numeric(18,2);
declare variable vrrtiva numeric(18,2);
declare variable prtica numeric(9,2);
declare variable vrrtica numeric(18,2);
declare variable vrtotal numeric(18,2);
declare variable vrextra numeric(18,2);
declare variable tipocomp varchar(3);
declare variable prefcont varchar(4);
declare variable ventas char(1);
declare variable ctaventas varchar(20);
declare variable iva char(1);
declare variable ctaiva varchar(20);
declare variable consumo char(1);
declare variable ctaconsumo varchar(20);
declare variable cartera char(1);
declare variable ctacartera varchar(20);
declare variable rtfte char(1);
declare variable ctartfte varchar(20);
declare variable rtiva char(1);
declare variable ctartiva varchar(20);
declare variable rtica char(1);
declare variable ctartica varchar(20);
declare variable inven char(1);
declare variable ctainven varchar(20);
declare variable costos char(1);
declare variable ctacostos varchar(20);
declare variable ctadto varchar(20);
declare variable ctaadic varchar(20);
declare variable ctaextra varchar(20);
declare variable existe char(1);
declare variable cuenta varchar(20);
declare variable monto numeric(18,2);
declare variable tipocuen char(1);
declare variable nit varchar(20);
declare variable nombre varchar(60);
declare variable proy varchar(4);
declare variable centro varchar(4);
declare variable proyi varchar(4);
declare variable centi varchar(4);
declare variable porc numeric(5,2);
declare variable debito numeric(18,2);
declare variable credito numeric(18,2);
declare variable nroi integer;
declare variable art varchar(15);
declare variable imptos numeric(18,2);
declare variable suma numeric(18,2);
declare variable porciva numeric(9,2);
declare variable tctaclien varchar(20);
declare variable tctaventa varchar(20);
declare variable tctartfte varchar(20);
declare variable tctartiva varchar(20);
declare variable tctartica varchar(20);
declare variable ctadic varchar(20);
declare variable baseadic varchar(20);
declare variable porcadic numeric(5,2);
declare variable valoradic numeric(18,2);
declare variable dbadic char(1);
declare variable ptovta integer;
declare variable anulado char(1);
declare variable dig integer;
declare variable mercancia numeric(18,2);
declare variable fomento varchar(2);
declare variable DTOXIT varchar(2);
declare variable vrconsumo numeric(18,2);
declare variable factor double precision;
declare variable cent char(1);
declare variable AUTORET VARCHAR(10);
declare variable FAUTORET DATE;
declare variable ERRORC INTEGER;
declare variable ICOING CHAR(2);
BEGIN
EXECUTE PROCEDURE LEE_CONFIGURACION('COMPRAS', 'FACTURAS', 'USAR IMPOCONSUMO COMO PORCENTAJE DE FOMENTO') returning_values (FOMENTO);
EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION', 'ARTICULOS', 'IMPOCONSUMO COMO MAYOR VALOR DEL COSTO Y DEL INGRESO') returning_values (ICOING);
EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'FECHA AUTORETENEDOR NO DESCONTAR RETENCIONES DEL SALDO PERO SI CONTABILIZARLAS') returning_values (AUTORET);
if (AUTORET <> '') then
    FAUTORET = CAST(AUTORET AS DATE);
else
    FAUTORET = '9999/12/31';
/* BUSQUE LA INTERFACE */
EXISTE = 'N';
SELECT 'S', TICO_COD, PRCO_PRE, INVE_VENTAS, INVE_IVA, INVE_CONSUMO, INVE_CARTERA, INVE_RTFTE, INVE_RTIVA, INVE_RTICA, INVE_COSTO, INVE_INVEN, INVE_CTAVENTAS, INVE_CTAIVA, INVE_CTACONSUMO, INVE_CTADTO, INVE_CTAADIC, INVE_CTAEXTRA, INVE_CTACARTERA, INVE_CTARTFTE, INVE_CTARTIVA, INVE_CTARTICA, INVE_CTAINVEN, INVE_CTACOSTOS, INVE_CONFIRMAR, INVE_CENTRO
    FROM INTERFAZ_VENTAS
    WHERE INVE_ID = :IDINTER
    INTO :EXISTE, :TIPOCOMP, :PREFCONT, :VENTAS, :IVA, :CONSUMO, :CARTERA, :RTFTE, :RTIVA, :RTICA, :COSTOS, :INVEN, :CTAVENTAS, :CTAIVA, :CTACONSUMO, :CTADTO, :CTAADIC, :CTAEXTRA, :CTACARTERA, :CTARTFTE, :CTARTIVA, :CTARTICA, :CTAINVEN, :CTACOSTOS, :VER, :CENT;
if (EXISTE = 'S') then
  BEGIN
    /* BORRE CUALQUEIR CONTABILIZACION PREVIA */
    DELETE FROM CONTABILIZACION WHERE CNTB_TIPOREF = 31 AND CNTB_IDREF = :IDDOC;

  /* TRAIGA EL ENCABEZADO DE LA FACTURA */
  SELECT PREF_PRE, FACT_NUMERO, FACT_FECHA, F.TERC_NIT, PTVT_ID, FACT_VENCE, FACT_DTOMONTO, FACT_ADICIONAL, FACT_IVAMONTO, FACT_EXTRA, FACT_TOTAL, FACT_RTFTEPOR, FACT_RTFTEMONTO, FACT_RTIVAPOR, FACT_RTIVAMONTO, FACT_RTICAPOR, FACT_RTICAMONTO, FACT_NOMCLIENTE, TERC_CTARTFTE, TERC_CTARTIVA, TERC_CTARTICA, TERC_CTAVENTA, TERC_CTACLIENTE, FACT_ANULADO
        FROM FACTURAS F, TERCEROS T
        WHERE FACT_ID = :IDDOC AND F.TERC_NIT = T.TERC_NIT
        INTO :PREF, :NUM, :FECAUX, :NIT, :PTOVTA, :VENCEAUX, :VRDTO, :VRADIC, :VRIVA, :VREXTRA, :VRTOTAL, :PRTFTE, :VRRTFTE, :PORC, :VRRTIVA, :PRTICA, :VRRTICA, :NOMBRE, TCTARTFTE, TCTARTIVA, TCTARTICA, TCTAVENTA, TCTACLIEN, ANULADO;
  if (ANULADO = 'N') then
    BEGIN
    /* BUSQUE EL CENTRO DEL PUNTO, LA BODEGA, O EL PREFIJO  */
    IF (CENT = 'B') THEN
        SELECT B.BODE_CENTRO, B.BODE_PROY FROM BODEGA B, FACTURAS F
            WHERE B.BODE_COD = F.BODE_COD AND F.FACT_ID = :IDDOC INTO :CENTRO, :PROY;
    IF (CENT = 'V') THEN
        SELECT V.CENT_COD, V.PROY_COD FROM VENDEDORES V, FACTURAS F
            WHERE V.VEND_COD = F.VEND_COD AND F.FACT_ID = :IDDOC INTO :CENTRO, :PROY;
    IF (CENT = 'P') THEN
        SELECT P.PREF_CENTRO,P.PREF_PROY  FROM PREFIJOS P, FACTURAS F
            WHERE P.PREF_PRE = F.PREF_PRE AND F.FACT_ID = :IDDOC AND P.TIDO_COD = 31 INTO :CENTRO, :PROY;
    NUMERO = PREF || NUM;
    SELECT SUM (FADE_CONSUMO) FROM FACTURAS_DETALLE WHERE FACT_ID = :IDDOC  AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
        INTO MERCANCIA;
    VRSUBT = VRTOTAL - VREXTRA - VRIVA - MERCANCIA; /* BASE DE RETEFTE Y RETEICA */

    EXECUTE PROCEDURE lee_configuracion ('FACTURACION', 'FACTURAS', 'DESCUENTO PIE FACTURA IGUAL A SUMA DE DESCUENTOS POR ITEM') returning_values (:DTOXIT);
    if (DTOXIT = 'SI') then
        VRDTO = 0;
    MERCANCIA = VRSUBT - VRADIC + VRDTO;
    EXECUTE PROCEDURE FECHA_A_CONTA(:FECAUX) returning_values (:FECHA);
    EXECUTE PROCEDURE FECHA_A_CONTA(:VENCEAUX) returning_values (:VENCE);
    /* REGISTRE EL ENCABEZADO CONTABLE */
    IDC = GEN_ID(ID_CONTABILIZA, 1);
    if (STRLEN(NOMBRE)> 43 ) then
      CONC = 'FV No.' || NUMERO || '-' || SUBSTR(NOMBRE,1,43);
    ELSE
      CONC = 'FV No.' || NUMERO || '-' || NOMBRE;
    INSERT INTO CONTABILIZACION (CNTB_ID, CNTB_TIPOCOMP, CNTB_PREFCNT, CNTB_NUMERO, CNTB_FECHA, CNTB_CONCEPTO, CNTB_REF, CNTB_TIPOREF, CNTB_IDREF, CNTB_PREFREF, CNTB_NUMREF, CNTB_PROCESADO)
        VALUES (:IDC, :TIPOCOMP, :PREFCONT, :NUM, :FECHA, :CONC, '', 31, :IDDOC, :PREF, :NUM, 'N');
    NROI = 0;
    SUMA = 0;
    ERROR = 0;
    /* SI NO HAY CUENTA DE DESCUENTO NI ADICIONAL CALCULE UN FACTOR PARA LAS VENTAS Y EL IVA */
    if (MERCANCIA <> 0) then
        FACTOR = CAST(VRSUBT AS DOUBLE PRECISION) / CAST(MERCANCIA AS DOUBLE PRECISION);
    ELSE
        FACTOR = 1;
    /* TRAIGA EL NUMERO DE DIGITOS PARA EL REDONDEO */
    SELECT CAST(CONF_VALOR AS INTEGER) FROM CONFIGURACION WHERE CONF_MODULO = 'FACTURACION' AND
        CONF_CATEGORIA = 'GENERAL' AND CONF_PROPIEDAD = 'REDONDEO AL MULTIPLO DE DIEZ EN TOTALES' INTO :DIG;
    /* CUENTAS DE VENTAS */
    if (VENTAS = 'A') then
        BEGIN
        FOR SELECT MAX(COAR_CTAVNT), SUM(FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), SUM(FADE_IVAMONTO), SUM(FADE_CONSUMO), MAX(B.bode_proy), MAX(B.bode_centro)
            FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_DETALLE F, bodega b
            WHERE F.FACT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL)) and
            f.bode_cod = b.bode_cod
            GROUP BY COAR_CTAVNT
            INTO :CTAVENTAS, :MONTO, :IMPTOS, :VRCONSUMO, :PROYI, :CENTI
            DO
            BEGIN
            if ((FOMENTO = 'SI') or (icoing = 'SI')) then
                MONTO = MONTO + VRCONSUMO;
            if ((CTADTO IS NULL) OR (CTADTO = '')) then
                MONTO = MONTO * FACTOR;
            execute procedure redondee(MONTO, DIG) returning_values (MONTO);
            if (MONTO <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTAVENTAS, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT F.ARTI_COD, (FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), FADE_CONSUMO
                        FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_DETALLE F
                        WHERE F.FACT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTAINV = :CUENTA AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
                        INTO :ART, :MONTO, :IMPTOS
                    DO
                        BEGIN
                        if ((FOMENTO = 'SI') or (ICOING = 'SI')) then
                            MONTO = MONTO + IMPTOS;
                        if ((CTADTO IS NULL) OR (CTADTO = '')) then
                            MONTO = MONTO * FACTOR;
                        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                        if (MONTO <> 0) then
                            BEGIN
                            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                            NROI = NROI + 1;
                            SUMA = SUMA - MONTO;
                            END
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    NROI = NROI + 1;
                    SUMA = SUMA - MONTO;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    IF (CENT = 'B') THEN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROYI, :CENTI, NULL, NULL, NULL, NULL, 0, 0);
                    ELSE
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA - MONTO;
                    END
                END /* MONTO <> 0 */
            END /* FOR */
        END /* VENTAS X ARTICULO */
     IF ((VENTAS = 'C') OR (VENTAS = 'K')) THEN
        BEGIN
        IF (VENTAS = 'C') THEN
            CTAVENTAS = TCTAVENTA;
        SELECT SUM(FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), SUM(FADE_IVAMONTO), SUM (FADE_CONSUMO)
            FROM FACTURAS_DETALLE F
            WHERE F.FACT_ID = :IDDOC AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
            INTO :MONTO, :IMPTOS, :VRCONSUMO;
        if ((FOMENTO = 'SI') or (ICOING = 'SI')) then
            MONTO = MONTO + VRCONSUMO;
        if ((CTADTO IS NULL) OR (CTADTO = '')) then
            MONTO = MONTO * FACTOR;
        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
        if (MONTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTAVENTAS, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT F.ARTI_COD, (FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), FADE_CONSUMO
                    FROM ARTICULO A, FACTURAS_DETALLE F
                    WHERE F.FACT_ID = :IDDOC AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
                    INTO :ART, :MONTO, :IMPTOS
                    DO
                    BEGIN
                    if ((FOMENTO = 'SI') or (ICOING = 'SI')) then
                        MONTO = MONTO + VRCONSUMO;
                    if ((CTADTO IS NULL) OR (CTADTO = '')) then
                        MONTO = MONTO * FACTOR;
                    execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                    if (MONTO <> 0) then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        SUMA = SUMA - MONTO;
                        END
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - MONTO;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - MONTO;
                END
            END /* MONTO <> 0 */
        END /* VENTAS DE CLIENTE O CONSTANTE */
    /* EL IVA EN VENTAS */
    if (IVA = 'A') then
        BEGIN
        FOR SELECT MAX(COAR_CTAIVAV), SUM(FADE_IVAMONTO), SUM(FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), sum(FADE_CONSUMO)
            FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_DETALLE F
            WHERE F.FACT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
            GROUP BY COAR_CTAIVAV
            INTO :CTAIVA, :IMPTOS, :MONTO, :VALORADIC
        DO
            BEGIN
            if (FOMENTO = 'SI') then
                MONTO = MONTO + VALORADIC;
            MONTO = MONTO * -1;
            MONTO = MONTO * FACTOR;
            IMPTOS = IMPTOS * FACTOR;
            execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
            execute procedure redondee(MONTO, DIG) returning_values (MONTO);
            if (IMPTOS <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTAIVA, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT F.ARTI_COD, FADE_IVAMONTO, (FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), TAIV_PORC, FADE_CONSUMO
                        FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_DETALLE F, TARIFA_IVA T
                        WHERE F.FACT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTAIVAV = :CUENTA AND A.TAIV_COD = T.TAIV_COD AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
                        INTO :ART, :IMPTOS, :MONTO, :PORCIVA, :VALORADIC
                    DO
                        BEGIN
                        if (FOMENTO = 'SI') then
                            MONTO = MONTO + VALORADIC;
                        MONTO = MONTO * -1;
                        MONTO = MONTO * FACTOR;
                        IMPTOS = IMPTOS * FACTOR;
                        execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                        if (IMPTOS <> 0) then
                            BEGIN
                            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, :MONTO, :PORCIVA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                            NROI = NROI + 1;
                            SUMA = SUMA + DEBITO - CREDITO;
                            END
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, :MONTO, ABS(:IMPTOS*100/:MONTO), :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    NROI = NROI + 1;
                    SUMA = SUMA - IMPTOS;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, :MONTO, ABS(:IMPTOS*100/:MONTO), :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA - IMPTOS;
                    END
                END   /* IMPTOS <> 0 */
            END /* FOR */
        END /* IVA X ARTICULO */
    if (IVA = 'K') then /* IVA EN CTA CONSTANTE */
        BEGIN
        SELECT SUM(FADE_IVAMONTO), SUM(FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), SUM(FADE_CONSUMO)
            FROM FACTURAS_DETALLE F
            WHERE F.FACT_ID = :IDDOC and FADE_IVAMONTO <> 0 AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
            INTO :IMPTOS, :MONTO, :valoradic;
        if (FOMENTO = 'SI') then
            MONTO = MONTO + VALORADIC;
        MONTO = MONTO * -1;
        MONTO = MONTO * FACTOR;
        IMPTOS = IMPTOS * FACTOR;
        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
        execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
        if (IMPTOS <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTAIVA, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT F.ARTI_COD, (FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), FADE_IVAMONTO, TAIV_PORC, FADE_CONSUMO
                    FROM ARTICULO A, FACTURAS_DETALLE F, TARIFA_IVA T
                    WHERE F.FACT_ID = :IDDOC AND A.TAIV_COD = T.TAIV_COD AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
                    INTO :ART, :MONTO, :IMPTOS, :PORCIVA, :VALORADIC
                    DO
                    BEGIN
                    if (FOMENTO = 'SI') then
                        MONTO = MONTO + VALORADIC;
                    MONTO = MONTO * -1;
                    MONTO = MONTO * FACTOR;
                    IMPTOS = IMPTOS * FACTOR;
                    execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                    execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                    if (IMPTOS <> 0) then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', 0, :IMPTOS, :MONTO, :PORCIVA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        SUMA = SUMA - IMPTOS;
                        END
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', 0, :IMPTOS, :MONTO, ABS(:IMPTOS*100/:MONTO), :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - IMPTOS;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', 0, :IMPTOS, :MONTO, ABS(:IMPTOS*100/:MONTO), :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - IMPTOS;
                END
            END /* IMPTOS <> 0 */
        END /* IVA EN CTA CONSTANTE */
    /* EL IMPOCONSUMO */
    if ((CONSUMO = 'A') AND (FOMENTO <> 'SI')) then
        BEGIN
        FOR SELECT MAX(COAR_CTACONS), SUM(FADE_CONSUMO)
            FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_DETALLE F
            WHERE F.FACT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
            GROUP BY COAR_CTACONS
            INTO :CTACONSUMO, :IMPTOS
        DO
            BEGIN
            execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
            if (IMPTOS <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTACONSUMO, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, REGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT F.ARTI_COD, FADE_CONSUMO
                        FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_DETALLE F
                        WHERE F.FACT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTACONS = :CUENTA AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
                        INTO :ART, :IMPTOS
                    DO
                        BEGIN
                        execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                        if (IMPTOS <> 0) then
                            BEGIN
                            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                            NROI = NROI + 1;
                            SUMA = SUMA - IMPTOS;
                            END
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    NROI = NROI + 1;
                    SUMA = SUMA - IMPTOS;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA - IMPTOS;
                    END
                END /* IMPTOS <> 0 */
            END /* FOR */
        END /* CONSUMO X ARTICULO */
    if ((CONSUMO = 'K') AND (FOMENTO <> 'SI')) then /* CONSUMO EN CTA CONSTANTE */
        BEGIN
        SELECT SUM(FADE_CONSUMO)
            FROM FACTURAS_DETALLE F
            WHERE F.FACT_ID = :IDDOC AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
            INTO :IMPTOS;
        execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
        if (IMPTOS <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTACONSUMO, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT F.ARTI_COD, FADE_CONSUMO
                    FROM ARTICULO A, FACTURAS_DETALLE F
                    WHERE F.FACT_ID = :IDDOC AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
                    INTO :ART, :IMPTOS
                    DO
                    BEGIN
                    execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                    if (IMPTOS <> 0) then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CTACONSUMO, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        SUMA = SUMA - IMPTOS;
                        END
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTACONSUMO, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - IMPTOS;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTACONSUMO, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - IMPTOS;
                END
            END /* IMPTOS <> 0 */
        END /* CONSUMO EN CTA CONSTANTE */
    /* DESCUENTO */
    if ((CTADTO IS NOT NULL) AND (CTADTO <> '')) then
        BEGIN
        execute procedure redondee(VRDTO, DIG) returning_values (VRDTO);
        if (VRDTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTADTO, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRDTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA + VRDTO;
                END
            if (TIPOCUEN = 'N') then
                    BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRDTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA + VRDTO;
                END
            END
        END /* DESCUENTO */
    /* VALOR ADIC */
    if ((CTAADIC IS NOT NULL) AND (CTAADIC <> '')) then
        BEGIN
        execute procedure redondee(VRADIC, DIG) returning_values (VRADIC);
        if (VRADIC <> 0) THEN
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTAADIC, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRADIC, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - VRADIC;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRADIC, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - VRADIC;
                END
            END
        END /* VR. ADIC */
    /* VALOR EXTRA */
    if ((CTAEXTRA IS NOT NULL) AND (CTAEXTRA <> '')) THEN
        BEGIN
        execute procedure redondee(VREXTRA, DIG) returning_values (VREXTRA);
        if (VREXTRA <> 0) THEN
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTAEXTRA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VREXTRA, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - VREXTRA;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VREXTRA, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - VREXTRA;
                END
            END
        END /* VR. EXTRA */
    /* DESCUENTE EL IMPOCONSUMO */
    SELECT SUM(FADE_CONSUMO)
        FROM FACTURAS_DETALLE F WHERE F.FACT_ID = :IDDOC AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL)) INTO :IMPTOS;
    vrsubt = vrsubt - IMPTOS;
    /* RETENCION FUENTE */
    if ((RTFTE = 'C') or (RTFTE = 'K')) then
      BEGIN
      execute procedure redondee(VRRTFTE, DIG) returning_values (VRRTFTE);
      if (VRRTFTE <> 0) then
        BEGIN
        if (RTFTE = 'C') then
            CTARTFTE = TCTARTFTE;
        EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTARTFTE, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :VRSUBT, :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTFTE;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :VRSUBT, :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTFTE;
            END
        /* AUTORETENCION */
        if (FAUTORET <= fecaux) then
            BEGIN
            EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'CUENTA DE AUTORETENCION EN LA FUENTE') returning_values (CTARTFTE);
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTARTFTE INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERROR (31, :IDDOC, :CTARTFTE, 2);
                CUENTA = CTARTFTE;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                begin
                EXECUTE PROCEDURE ERROR (31, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, (:VRSUBT*-1), :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - VRRTFTE;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, (:VRSUBT*-1), :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - VRRTFTE;
                END
            END
        END /* RTFTE */
      END
    if (RTFTE = 'A') then
      BEGIN
      FOR SELECT MAX(COAR_CTARTFTEV), MAX(COAR_RTFTE), MIN(COAR_RTBASE), SUM(FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), SUM((FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO)*COAR_RTFTE)
        FROM CONTABIL_ARTICULO C, FACTURAS_DETALLE F
        WHERE F.FACT_ID = :IDDOC AND F.ARTI_COD = C.ARTI_COD AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
        GROUP BY COAR_CTARTFTEV
        INTO :CTARTFTE, :PRTFTE, :baseadic, :MONTO, :VRRTFTE
        DO
        BEGIN
        MONTO = MONTO * FACTOR;
        if (MONTO >= BASEADIC) then
            BEGIN
            VRRTFTE = VRRTFTE * FACTOR / 100;
            execute procedure redondee(VRRTFTE, DIG) returning_values (VRRTFTE);
            execute procedure redondee(MONTO, DIG) returning_values (MONTO);
            if (VRRTFTE <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTARTFTE, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :MONTO, :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    NROI = NROI + 1;
                    SUMA = SUMA + VRRTFTE;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :MONTO, :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA + VRRTFTE;
                    END
                /* AUTORETENCION */
                if (FAUTORET <= fecaux) then
                    BEGIN
                    EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'CUENTA DE AUTORETENCION EN LA FUENTE') returning_values (CTARTFTE);
                    EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTARTFTE, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
                    if (ERRORC <> 0) then
                        ERROR = ERROR + 1;
                    if (TIPOCUEN = 'C') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, (:MONTO*-1), :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                        NROI = NROI + 1;
                        SUMA = SUMA - VRRTFTE;
                        END
                    if (TIPOCUEN = 'N') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, (:MONTO*-1), :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NROI = NROI + 1;
                        SUMA = SUMA - VRRTFTE;
                        END
                    END
                END
            END
        END /* RTFTE */
      END
    /* RETENCION IVA */
    if ((RTIVA = 'C') or (RTIVA = 'K')) then
      BEGIN
      execute procedure redondee(VRRTIVA, DIG) returning_values (VRRTIVA);
      if (VRRTIVA <> 0) then
        BEGIN
        if (RTIVA = 'C') then
            CTARTIVA = TCTARTIVA;
        EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTARTIVA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTIVA, 0, :VRIVA, :PORC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTIVA;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTIVA, 0, :VRIVA, :PORC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTIVA;
            END
        END /* RTIVA */
      END
    /* RETENCION DE ICA */
    if ((RTICA = 'C') or (RTICA = 'K')) then
      BEGIN
      execute procedure redondee(VRRTICA, DIG) returning_values (VRRTICA);
      if (VRRTICA <> 0) then
        BEGIN
        if (RTICA = 'C') then
            CTARTICA = TCTARTICA;
        EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTARTICA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTICA, 0, :VRSUBT, :PRTICA, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTICA;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTICA, 0, :VRSUBT, :PRTICA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTICA;
            END
        END /* RTICA */
      END
    /* CIERRE EL COMPROBANTE CONTRA LA CUENTA DEL TERCERO O LA CONSTANTE */
    if ((SUMA <> 0) and ((CARTERA = 'C') or (CARTERA = 'K') or (CARTERA = 'J'))) then
        BEGIN
        if (icoing = 'SI') then
            /* DESCUENTE EL IMPOCONSUMO QUE HACE PARTE DEL COSTO */
            SUMA = SUMA + IMPTOS;
        if (SUMA < 0) then
            BEGIN
            DEBITO = SUMA * -1;
            CREDITO = 0;
            END
        ELSE
            BEGIN
            DEBITO = 0;
            CREDITO = SUMA;
            END
        if (CARTERA = 'C') then
            CTACARTERA = TCTACLIEN;
        if (CARTERA = 'J') then
            BEGIN
            /* BUSQUE LA CUENTA DE LA CAJA */
            SELECT CAJA_CUENTA FROM CAJAS C, PUNTO_VENTA P
                WHERE P.CAJA_ID = C.CAJA_ID AND PTVT_ID = :PTOVTA
                INTO :CTACARTERA;
            END
        EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTACARTERA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :DEBITO, :CREDITO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
        if (TIPOCUEN = 'N') then
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :DEBITO, :CREDITO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
        NROI = NROI + 1;
        END /* SUMA EN CARTERA */
    /* CALCULE COSTOS EN VENTAS */
    EXECUTE PROCEDURE COSTO_EN_VENTAS(31, :IDDOC);
    if (COSTOS = 'A') then
        BEGIN
        FOR SELECT MAX(CTACOS), SUM(CAST(CANT AS DOUBLE PRECISION) * COSTO), SUM(FADE_CONSUMO)
            FROM COSTO_VENTAS CV, FACTURAS_DETALLE D WHERE CV.arti_cod = D.arti_cod AND D.fact_id = :iddoc AND
            TIDO_COD = 31 AND COVE_ID = :iddoc
            GROUP BY CTACOS
            INTO :CTACOSTOS, :MONTO, :vrconsumo
            DO
            BEGIN
            if (icoing = 'SI') then
                MONTO = MONTO + VRCONSUMO;
            if (MONTO <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTACOSTOS, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT ARTI_COD, CANT * COSTO
                        FROM COSTO_VENTAS WHERE TIDO_COD = 31 AND COVE_ID = :iddoc AND CTACOS = :CUENTA
                        INTO :ART, :MONTO
                    DO
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    NROI = NROI + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    END
                END /* MONTO <> 0 */
            END /* FOR */
        END /* COSTOS */
    if (COSTOS = 'K') then
        BEGIN
        SELECT SUM(CAST(CANT AS DOUBLE PRECISION) * COSTO)
            FROM COSTO_VENTAS WHERE TIDO_COD = 31 AND COVE_ID = :iddoc
            INTO :MONTO;
        if (icoing = 'SI') then
            MONTO = MONTO + imptos;
        if (MONTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTACOSTOS, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, REGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT ARTI_COD, CANT * COSTO
                    FROM COSTO_VENTAS WHERE TIDO_COD = 31 AND COVE_ID = :iddoc
                    INTO :ART, :MONTO
                DO
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTACOSTOS, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                    NROI = NROI + 1;
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTACOSTOS, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTACOSTOS, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                END
            END /* MONTO <> 0 */
        END /* COSTOS = K */
    if (INVEN = 'A') then
        BEGIN
        FOR SELECT MAX(CTAINV), SUM(CAST(CANT AS DOUBLE PRECISION) * COSTO)
            FROM COSTO_VENTAS WHERE TIDO_COD = 31 AND COVE_ID = :iddoc
            GROUP BY CTAINV
            INTO :CTAINVEN, :MONTO
        DO
            BEGIN
            if (MONTO <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTAINVEN, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, REGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT ARTI_COD, CANT * COSTO
                        FROM COSTO_VENTAS WHERE TIDO_COD = 31 AND COVE_ID = :iddoc AND CTAINV = :CUENTA
                        INTO :ART, :MONTO
                    DO
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    NROI = NROI + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    END
                END /* MONTO <> 0 */
            END /* FOR */
        END /* INVEN = A */
    if (INVEN = 'K') then
        BEGIN
        SELECT SUM(CAST(CANT AS DOUBLE PRECISION) * COSTO)
            FROM COSTO_VENTAS WHERE TIDO_COD = 31 AND COVE_ID = :iddoc
            INTO :MONTO;
        if (MONTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTAINVEN, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT ARTI_COD, CANT * COSTO
                    FROM COSTO_VENTAS WHERE TIDO_COD = 31 AND COVE_ID = :iddoc
                    INTO :ART, :MONTO
                DO
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTAINVEN, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                    NROI = NROI + 1;
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAINVEN, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAINVEN, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                END
            END /* MONTO <> 0 */
        END /* INVEN = K */
    /* recorra las cuentas adicionales */
    FOR SELECT INVC_CUENTA, INVC_BASE, INVC_PORC, INVC_VALOR, INVC_DB
        FROM INTERFAZ_VENTAS_CTAS
        WHERE INVE_ID = :IDINTER
        INTO :CTADIC, :BASEADIC, :PORCADIC, :VALORADIC, :DBADIC
        DO
        BEGIN
        if (VALORADIC <> 0) then
            MONTO = VALORADIC;
        ELSE
            BEGIN
            if (:BASEADIC = 'SUBTOTAL') then
                VALORADIC = vrsubt;
            if (:BASEADIC = 'DESCUENTO') then
                VALORADIC = VRDTO;
            if (:BASEADIC = 'IVA') then
                VALORADIC = VRIVA;
            if (:BASEADIC = 'ADICIONAL') then
                VALORADIC = VRADIC;
            if (:BASEADIC = 'EXTRA') then
                VALORADIC = VREXTRA;
            if (:BASEADIC = 'TOTAL') then
                VALORADIC = VRTOTAL;
            MONTO = VALORADIC * PORCADIC / 100;
            END
        if (MONTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTADIC, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                if (DBADIC = 'S') then
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                ELSE
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                if (DBADIC = 'S') then
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                ELSE
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                END
            NROI = NROI + 1;
            END
        END
    if (ERROR > 0) then
        VER = 'S';
    SUSPEND;
    END /* NO ANULADO */
  END /* EXISTE LA INTERFAZ */
ELSE
    BEGIN
    EXECUTE PROCEDURE ERROR (31, :IDDOC, :PREF, 1);
    ERROR = ERROR + 1;
    VER = 'S';
    SUSPEND;
    END
END

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE CONTABIL_FACTURA_IVA(
    IDDOC INTEGER,
    IDINTER INTEGER)
RETURNS (
    ERROR INTEGER,
    VER CHAR(1),
    IDC INTEGER)
AS
declare variable pref varchar(4);
declare variable num varchar(6);
declare variable numero varchar(10);
declare variable fecaux date;
declare variable fecha char(8);
declare variable conc varchar(60);
declare variable venceaux date;
declare variable vence char(8);
declare variable vrdto numeric(18,2);
declare variable vradic numeric(18,2);
declare variable vrsubt numeric(18,2);
declare variable vriva numeric(18,2);
declare variable prtfte numeric(9,2);
declare variable vrrtfte numeric(18,2);
declare variable vrrtiva numeric(18,2);
declare variable prtica numeric(9,2);
declare variable vrrtica numeric(18,2);
declare variable vrtotal numeric(18,2);
declare variable vrextra numeric(18,2);
declare variable tipocomp varchar(3);
declare variable prefcont varchar(4);
declare variable ventas char(1);
declare variable ctaventas varchar(20);
declare variable iva char(1);
declare variable ctaiva varchar(20);
declare variable consumo char(1);
declare variable ctaconsumo varchar(20);
declare variable cartera char(1);
declare variable ctacartera varchar(20);
declare variable rtfte char(1);
declare variable ctartfte varchar(20);
declare variable rtiva char(1);
declare variable ctartiva varchar(20);
declare variable rtica char(1);
declare variable ctartica varchar(20);
declare variable inven char(1);
declare variable ctainven varchar(20);
declare variable costos char(1);
declare variable ctacostos varchar(20);
declare variable ctadto varchar(20);
declare variable ctaadic varchar(20);
declare variable ctaextra varchar(20);
declare variable existe char(1);
declare variable cuenta varchar(20);
declare variable monto numeric(18,2);
declare variable tipocuen char(1);
declare variable nit varchar(20);
declare variable nombre varchar(60);
declare variable proy varchar(4);
declare variable centro varchar(4);
declare variable porc numeric(5,2);
declare variable debito numeric(18,2);
declare variable credito numeric(18,2);
declare variable nroi integer;
declare variable art varchar(15);
declare variable imptos numeric(18,2);
declare variable suma numeric(18,2);
declare variable porciva numeric(9,2);
declare variable tctaclien varchar(20);
declare variable tctaventa varchar(20);
declare variable tctartfte varchar(20);
declare variable tctartiva varchar(20);
declare variable tctartica varchar(20);
declare variable ctadic varchar(20);
declare variable baseadic varchar(20);
declare variable porcadic numeric(5,2);
declare variable valoradic numeric(18,2);
declare variable dbadic char(1);
declare variable ptovta integer;
declare variable anulado char(1);
declare variable dig integer;
declare variable mercancia numeric(18,2);
declare variable fomento varchar(2);
declare variable DTOXIT varchar(2);
declare variable vrconsumo numeric(18,2);
declare variable factor double precision;
declare variable cent char(1);
declare variable AUTORET VARCHAR(10);
declare variable FAUTORET DATE;
declare variable ERRORC INTEGER;
BEGIN
EXECUTE PROCEDURE LEE_CONFIGURACION('COMPRAS', 'FACTURAS', 'USAR IMPOCONSUMO COMO PORCENTAJE DE FOMENTO') returning_values (FOMENTO);
EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'FECHA AUTORETENEDOR NO DESCONTAR RETENCIONES DEL SALDO PERO SI CONTABILIZARLAS') returning_values (AUTORET);
if (AUTORET <> '') then
    FAUTORET = CAST(AUTORET AS DATE);
else
    FAUTORET = '9999/12/31';
/* BUSQUE LA INTERFACE */
EXISTE = 'N';
SELECT 'S', TICO_COD, PRCO_PRE, INVE_VENTAS, INVE_IVA, INVE_CONSUMO, INVE_CARTERA, INVE_RTFTE, INVE_RTIVA, INVE_RTICA, INVE_COSTO, INVE_INVEN, INVE_CTAVENTAS, INVE_CTAIVA, INVE_CTACONSUMO, INVE_CTADTO, INVE_CTAADIC, INVE_CTAEXTRA, INVE_CTACARTERA, INVE_CTARTFTE, INVE_CTARTIVA, INVE_CTARTICA, INVE_CTAINVEN, INVE_CTACOSTOS, INVE_CONFIRMAR, INVE_CENTRO
    FROM INTERFAZ_VENTAS
    WHERE INVE_ID = :IDINTER
    INTO :EXISTE, :TIPOCOMP, :PREFCONT, :VENTAS, :IVA, :CONSUMO, :CARTERA, :RTFTE, :RTIVA, :RTICA, :COSTOS, :INVEN, :CTAVENTAS, :CTAIVA, :CTACONSUMO, :CTADTO, :CTAADIC, :CTAEXTRA, :CTACARTERA, :CTARTFTE, :CTARTIVA, :CTARTICA, :CTAINVEN, :CTACOSTOS, :VER, :CENT;
if (EXISTE = 'S') then
  BEGIN
    /* BORRE CUALQUEIR CONTABILIZACION PREVIA */
    DELETE FROM CONTABILIZACION WHERE CNTB_TIPOREF = 31 AND CNTB_IDREF = :IDDOC;

  /* TRAIGA EL ENCABEZADO DE LA FACTURA */
  SELECT PREF_PRE, FACT_NUMERO, FACT_FECHA, F.TERC_NIT, PTVT_ID, FACT_VENCE, FACT_DTOMONTO, FACT_ADICIONAL, FACT_IVAMONTO, FACT_EXTRA, FACT_TOTAL, FACT_RTFTEPOR, FACT_RTFTEMONTO, FACT_RTIVAPOR, FACT_RTIVAMONTO, FACT_RTICAPOR, FACT_RTICAMONTO, FACT_NOMCLIENTE, TERC_CTARTFTE, TERC_CTARTIVA, TERC_CTARTICA, TERC_CTAVENTA, TERC_CTACLIENTE, FACT_ANULADO
        FROM FACTURAS F, TERCEROS T
        WHERE FACT_ID = :IDDOC AND F.TERC_NIT = T.TERC_NIT
        INTO :PREF, :NUM, :FECAUX, :NIT, :PTOVTA, :VENCEAUX, :VRDTO, :VRADIC, :VRIVA, :VREXTRA, :VRTOTAL, :PRTFTE, :VRRTFTE, :PORC, :VRRTIVA, :PRTICA, :VRRTICA, :NOMBRE, TCTARTFTE, TCTARTIVA, TCTARTICA, TCTAVENTA, TCTACLIEN, ANULADO;
  if (ANULADO = 'N') then
    BEGIN
    /* BUSQUE EL CENTRO DEL PUNTO, LA BODEGA, O EL PREFIJO  */
    IF (CENT = 'B') THEN
        SELECT B.BODE_CENTRO, B.BODE_PROY FROM BODEGA B, FACTURAS F
            WHERE B.BODE_COD = F.BODE_COD AND F.FACT_ID = :IDDOC INTO :CENTRO, :PROY;
    IF (CENT = 'V') THEN
        SELECT V.CENT_COD, V.PROY_COD FROM VENDEDORES V, FACTURAS F
            WHERE V.VEND_COD = F.VEND_COD AND F.FACT_ID = :IDDOC INTO :CENTRO, :PROY;
    IF (CENT = 'P') THEN
        SELECT P.PREF_CENTRO,P.PREF_PROY  FROM PREFIJOS P, FACTURAS F
            WHERE P.PREF_PRE = F.PREF_PRE AND F.FACT_ID = :IDDOC AND P.TIDO_COD = 31 INTO :CENTRO, :PROY;
    NUMERO = PREF || NUM;
    SELECT SUM (FADE_CONSUMO) FROM FACTURAS_DETALLE WHERE FACT_ID = :IDDOC  AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
        INTO MERCANCIA;
    VRSUBT = VRTOTAL - VREXTRA - VRIVA - MERCANCIA; /* BASE DE RETEFTE Y RETEICA */

    EXECUTE PROCEDURE lee_configuracion ('FACTURACION', 'FACTURAS', 'DESCUENTO PIE FACTURA IGUAL A SUMA DE DESCUENTOS POR ITEM') returning_values (:DTOXIT);
    if (DTOXIT = 'SI') then
        VRDTO = 0;
    MERCANCIA = VRSUBT - VRADIC + VRDTO;
    EXECUTE PROCEDURE FECHA_A_CONTA(:FECAUX) returning_values (:FECHA);
    EXECUTE PROCEDURE FECHA_A_CONTA(:VENCEAUX) returning_values (:VENCE);
    /* REGISTRE EL ENCABEZADO CONTABLE */
    IDC = GEN_ID(ID_CONTABILIZA, 1);
    if (STRLEN(NOMBRE)> 43 ) then
      CONC = 'FV No.' || NUMERO || '-' || SUBSTR(NOMBRE,1,43);
    ELSE
      CONC = 'FV No.' || NUMERO || '-' || NOMBRE;
    INSERT INTO CONTABILIZACION (CNTB_ID, CNTB_TIPOCOMP, CNTB_PREFCNT, CNTB_NUMERO, CNTB_FECHA, CNTB_CONCEPTO, CNTB_REF, CNTB_TIPOREF, CNTB_IDREF, CNTB_PREFREF, CNTB_NUMREF, CNTB_PROCESADO)
        VALUES (:IDC, :TIPOCOMP, :PREFCONT, :NUM, :FECHA, :CONC, '', 31, :IDDOC, :PREF, :NUM, 'N');
    NROI = 0;
    SUMA = 0;
    ERROR = 0;
    /* SI NO HAY CUENTA DE DESCUENTO NI ADICIONAL CALCULE UN FACTOR PARA LAS VENTAS Y EL IVA */
    if (MERCANCIA <> 0) then
        FACTOR = CAST(VRSUBT AS DOUBLE PRECISION) / CAST(MERCANCIA AS DOUBLE PRECISION);
    ELSE
        FACTOR = 1;
    /* TRAIGA EL NUMERO DE DIGITOS PARA EL REDONDEO */
    SELECT CAST(CONF_VALOR AS INTEGER) FROM CONFIGURACION WHERE CONF_MODULO = 'FACTURACION' AND
        CONF_CATEGORIA = 'GENERAL' AND CONF_PROPIEDAD = 'REDONDEO AL MULTIPLO DE DIEZ EN TOTALES' INTO :DIG;
    /* CUENTAS DE VENTAS */
    if (VENTAS = 'A') then
        BEGIN
        FOR SELECT MAX(TAIV_CTAVTA), SUM(FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), SUM(FADE_IVAMONTO), SUM(FADE_CONSUMO)
            FROM TARIFA_IVA T, FACTURAS_DETALLE F
            WHERE F.FACT_ID = :IDDOC AND F.fade_ivaporc = T.taiv_porc AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
            GROUP BY TAIV_CTAVTA
            INTO :CTAVENTAS, :MONTO, :IMPTOS, :VRCONSUMO
            DO
            BEGIN
            if (FOMENTO = 'SI') then
                MONTO = MONTO + VRCONSUMO;
            if ((CTADTO IS NULL) OR (CTADTO = '')) then
                MONTO = MONTO * FACTOR;
            execute procedure redondee(MONTO, DIG) returning_values (MONTO);
            if (MONTO <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTAVENTAS, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT F.ARTI_COD, (FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), FADE_CONSUMO
                        FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_DETALLE F
                        WHERE F.FACT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTAINV = :CUENTA AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
                        INTO :ART, :MONTO, :IMPTOS
                    DO
                        BEGIN
                        if (FOMENTO = 'SI') then
                            MONTO = MONTO + IMPTOS;
                        if ((CTADTO IS NULL) OR (CTADTO = '')) then
                            MONTO = MONTO * FACTOR;
                        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                        if (MONTO <> 0) then
                            BEGIN
                            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                            NROI = NROI + 1;
                            SUMA = SUMA - MONTO;
                            END
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    NROI = NROI + 1;
                    SUMA = SUMA - MONTO;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA - MONTO;
                    END
                END /* MONTO <> 0 */
            END /* FOR */
        END /* VENTAS X ARTICULO */
     IF ((VENTAS = 'C') OR (VENTAS = 'K')) THEN
        BEGIN
        IF (VENTAS = 'C') THEN
            CTAVENTAS = TCTAVENTA;
        SELECT SUM(FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), SUM(FADE_IVAMONTO), SUM (FADE_CONSUMO)
            FROM FACTURAS_DETALLE F
            WHERE F.FACT_ID = :IDDOC AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
            INTO :MONTO, :IMPTOS, :VRCONSUMO;
        if (FOMENTO = 'SI') then
            MONTO = MONTO + VRCONSUMO;
        if ((CTADTO IS NULL) OR (CTADTO = '')) then
            MONTO = MONTO * FACTOR;
        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
        if (MONTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTAVENTAS, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT F.ARTI_COD, (FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), FADE_CONSUMO
                    FROM ARTICULO A, FACTURAS_DETALLE F
                    WHERE F.FACT_ID = :IDDOC AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
                    INTO :ART, :MONTO, :IMPTOS
                    DO
                    BEGIN
                    if (FOMENTO = 'SI') then
                        MONTO = MONTO + VRCONSUMO;
                    if ((CTADTO IS NULL) OR (CTADTO = '')) then
                        MONTO = MONTO * FACTOR;
                    execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                    if (MONTO <> 0) then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        SUMA = SUMA - MONTO;
                        END
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - MONTO;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - MONTO;
                END
            END /* MONTO <> 0 */
        END /* VENTAS DE CLIENTE O CONSTANTE */
    /* EL IVA EN VENTAS */
    if (IVA = 'A') then
        BEGIN
        FOR SELECT MAX(TAIV_CTAIVAVNT), SUM(FADE_IVAMONTO), SUM(FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), sum(FADE_CONSUMO)
            FROM TARIFA_IVA T, FACTURAS_DETALLE F
            WHERE F.FACT_ID = :IDDOC AND F.fade_ivaporc = T.taiv_porc AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
            GROUP BY TAIV_CTAIVAVNT
            INTO :CTAIVA, :IMPTOS, :MONTO, :VALORADIC
        DO
            BEGIN
            if (FOMENTO = 'SI') then
                MONTO = MONTO + VALORADIC;
            MONTO = MONTO * -1;
            MONTO = MONTO * FACTOR;
            IMPTOS = IMPTOS * FACTOR;
            execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
            execute procedure redondee(MONTO, DIG) returning_values (MONTO);
            if (IMPTOS <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTAIVA, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT F.ARTI_COD, FADE_IVAMONTO, (FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), TAIV_PORC, FADE_CONSUMO
                        FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_DETALLE F, TARIFA_IVA T
                        WHERE F.FACT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTAIVAV = :CUENTA AND A.TAIV_COD = T.TAIV_COD AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
                        INTO :ART, :IMPTOS, :MONTO, :PORCIVA, :VALORADIC
                    DO
                        BEGIN
                        if (FOMENTO = 'SI') then
                            MONTO = MONTO + VALORADIC;
                        MONTO = MONTO * -1;
                        MONTO = MONTO * FACTOR;
                        IMPTOS = IMPTOS * FACTOR;
                        execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                        if (IMPTOS <> 0) then
                            BEGIN
                            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, :MONTO, :PORCIVA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                            NROI = NROI + 1;
                            SUMA = SUMA + DEBITO - CREDITO;
                            END
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, :MONTO, ABS(:IMPTOS*100/:MONTO), :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    NROI = NROI + 1;
                    SUMA = SUMA - IMPTOS;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, :MONTO, ABS(:IMPTOS*100/:MONTO), :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA - IMPTOS;
                    END
                END   /* IMPTOS <> 0 */
            END /* FOR */
        END /* IVA X ARTICULO */
    if (IVA = 'K') then /* IVA EN CTA CONSTANTE */
        BEGIN
        SELECT SUM(FADE_IVAMONTO), SUM(FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), SUM(FADE_CONSUMO)
            FROM FACTURAS_DETALLE F
            WHERE F.FACT_ID = :IDDOC and FADE_IVAMONTO <> 0 AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
            INTO :IMPTOS, :MONTO, :valoradic;
        if (FOMENTO = 'SI') then
            MONTO = MONTO + VALORADIC;
        MONTO = MONTO * -1;
        MONTO = MONTO * FACTOR;
        IMPTOS = IMPTOS * FACTOR;
        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
        execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
        if (IMPTOS <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTAIVA, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT F.ARTI_COD, (FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), FADE_IVAMONTO, TAIV_PORC, FADE_CONSUMO
                    FROM ARTICULO A, FACTURAS_DETALLE F, TARIFA_IVA T
                    WHERE F.FACT_ID = :IDDOC AND A.TAIV_COD = T.TAIV_COD AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
                    INTO :ART, :MONTO, :IMPTOS, :PORCIVA, :VALORADIC
                    DO
                    BEGIN
                    if (FOMENTO = 'SI') then
                        MONTO = MONTO + VALORADIC;
                    MONTO = MONTO * -1;
                    MONTO = MONTO * FACTOR;
                    IMPTOS = IMPTOS * FACTOR;
                    execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                    execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                    if (IMPTOS <> 0) then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', 0, :IMPTOS, :MONTO, :PORCIVA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        SUMA = SUMA - IMPTOS;
                        END
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', 0, :IMPTOS, :MONTO, ABS(:IMPTOS*100/:MONTO), :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - IMPTOS;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', 0, :IMPTOS, :MONTO, ABS(:IMPTOS*100/:MONTO), :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - IMPTOS;
                END
            END /* IMPTOS <> 0 */
        END /* IVA EN CTA CONSTANTE */
    /* EL IMPOCONSUMO */
    if ((CONSUMO = 'A') AND (FOMENTO <> 'SI')) then
        BEGIN
        FOR SELECT MAX(COAR_CTACONS), SUM(FADE_CONSUMO)
            FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_DETALLE F
            WHERE F.FACT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
            GROUP BY COAR_CTACONS
            INTO :CTACONSUMO, :IMPTOS
        DO
            BEGIN
            execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
            if (IMPTOS <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTACONSUMO, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, REGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT F.ARTI_COD, FADE_CONSUMO
                        FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_DETALLE F
                        WHERE F.FACT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTACONS = :CUENTA AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
                        INTO :ART, :IMPTOS
                    DO
                        BEGIN
                        execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                        if (IMPTOS <> 0) then
                            BEGIN
                            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                            NROI = NROI + 1;
                            SUMA = SUMA - IMPTOS;
                            END
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    NROI = NROI + 1;
                    SUMA = SUMA - IMPTOS;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA - IMPTOS;
                    END
                END /* IMPTOS <> 0 */
            END /* FOR */
        END /* CONSUMO X ARTICULO */
    if ((CONSUMO = 'K') AND (FOMENTO <> 'SI')) then /* CONSUMO EN CTA CONSTANTE */
        BEGIN
        SELECT SUM(FADE_CONSUMO)
            FROM FACTURAS_DETALLE F
            WHERE F.FACT_ID = :IDDOC AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
            INTO :IMPTOS;
        execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
        if (IMPTOS <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTACONSUMO, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT F.ARTI_COD, FADE_CONSUMO
                    FROM ARTICULO A, FACTURAS_DETALLE F
                    WHERE F.FACT_ID = :IDDOC AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
                    INTO :ART, :IMPTOS
                    DO
                    BEGIN
                    execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                    if (IMPTOS <> 0) then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CTACONSUMO, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        SUMA = SUMA - IMPTOS;
                        END
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTACONSUMO, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - IMPTOS;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTACONSUMO, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - IMPTOS;
                END
            END /* IMPTOS <> 0 */
        END /* CONSUMO EN CTA CONSTANTE */
    /* DESCUENTO */
    if ((CTADTO IS NOT NULL) AND (CTADTO <> '')) then
        BEGIN
        execute procedure redondee(VRDTO, DIG) returning_values (VRDTO);
        if (VRDTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTADTO, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRDTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA + VRDTO;
                END
            if (TIPOCUEN = 'N') then
                    BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRDTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA + VRDTO;
                END
            END
        END /* DESCUENTO */
    /* VALOR ADIC */
    if ((CTAADIC IS NOT NULL) AND (CTAADIC <> '')) then
        BEGIN
        execute procedure redondee(VRADIC, DIG) returning_values (VRADIC);
        if (VRADIC <> 0) THEN
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTAADIC, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRADIC, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - VRADIC;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRADIC, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - VRADIC;
                END
            END
        END /* VR. ADIC */
    /* VALOR EXTRA */
    if ((CTAEXTRA IS NOT NULL) AND (CTAEXTRA <> '')) THEN
        BEGIN
        execute procedure redondee(VREXTRA, DIG) returning_values (VREXTRA);
        if (VREXTRA <> 0) THEN
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTAEXTRA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VREXTRA, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - VREXTRA;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VREXTRA, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - VREXTRA;
                END
            END
        END /* VR. EXTRA */
    /* DESCUENTE EL IMPOCONSUMO */
    SELECT SUM(FADE_CONSUMO)
        FROM FACTURAS_DETALLE F WHERE F.FACT_ID = :IDDOC AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL)) INTO :IMPTOS;
    vrsubt = vrsubt - IMPTOS;
    /* RETENCION FUENTE */
    if ((RTFTE = 'C') or (RTFTE = 'K')) then
      BEGIN
      execute procedure redondee(VRRTFTE, DIG) returning_values (VRRTFTE);
      if (VRRTFTE <> 0) then
        BEGIN
        if (RTFTE = 'C') then
            CTARTFTE = TCTARTFTE;
        EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTARTFTE, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :VRSUBT, :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTFTE;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :VRSUBT, :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTFTE;
            END
        /* AUTORETENCION */
        if (FAUTORET <= fecaux) then
            BEGIN
            EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'CUENTA DE AUTORETENCION EN LA FUENTE') returning_values (CTARTFTE);
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTARTFTE INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERROR (31, :IDDOC, :CTARTFTE, 2);
                CUENTA = CTARTFTE;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                begin
                EXECUTE PROCEDURE ERROR (31, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, (:VRSUBT*-1), :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - VRRTFTE;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, (:VRSUBT*-1), :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - VRRTFTE;
                END
            END
        END /* RTFTE */
      END
    if (RTFTE = 'A') then
      BEGIN
      FOR SELECT MAX(COAR_CTARTFTEV), MAX(COAR_RTFTE), MIN(COAR_RTBASE), SUM(FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), SUM((FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO)*COAR_RTFTE)
        FROM CONTABIL_ARTICULO C, FACTURAS_DETALLE F
        WHERE F.FACT_ID = :IDDOC AND F.ARTI_COD = C.ARTI_COD AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
        GROUP BY COAR_CTARTFTEV
        INTO :CTARTFTE, :PRTFTE, :baseadic, :MONTO, :VRRTFTE
        DO
        BEGIN
        MONTO = MONTO * FACTOR;
        if (MONTO >= BASEADIC) then
            BEGIN
            VRRTFTE = VRRTFTE * FACTOR / 100;
            execute procedure redondee(VRRTFTE, DIG) returning_values (VRRTFTE);
            execute procedure redondee(MONTO, DIG) returning_values (MONTO);
            if (VRRTFTE <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTARTFTE, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :MONTO, :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    NROI = NROI + 1;
                    SUMA = SUMA + VRRTFTE;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :MONTO, :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA + VRRTFTE;
                    END
                /* AUTORETENCION */
                if (FAUTORET <= fecaux) then
                    BEGIN
                    EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'CUENTA DE AUTORETENCION EN LA FUENTE') returning_values (CTARTFTE);
                    EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTARTFTE, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
                    if (ERRORC <> 0) then
                        ERROR = ERROR + 1;
                    if (TIPOCUEN = 'C') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, (:MONTO*-1), :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                        NROI = NROI + 1;
                        SUMA = SUMA - VRRTFTE;
                        END
                    if (TIPOCUEN = 'N') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, (:MONTO*-1), :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NROI = NROI + 1;
                        SUMA = SUMA - VRRTFTE;
                        END
                    END
                END
            END
        END /* RTFTE */
      END
    /* RETENCION IVA */
    if ((RTIVA = 'C') or (RTIVA = 'K')) then
      BEGIN
      execute procedure redondee(VRRTIVA, DIG) returning_values (VRRTIVA);
      if (VRRTIVA <> 0) then
        BEGIN
        if (RTIVA = 'C') then
            CTARTIVA = TCTARTIVA;
        EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTARTIVA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTIVA, 0, :VRIVA, :PORC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTIVA;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTIVA, 0, :VRIVA, :PORC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTIVA;
            END
        END /* RTIVA */
      END
    /* RETENCION DE ICA */
    if ((RTICA = 'C') or (RTICA = 'K')) then
      BEGIN
      execute procedure redondee(VRRTICA, DIG) returning_values (VRRTICA);
      if (VRRTICA <> 0) then
        BEGIN
        if (RTICA = 'C') then
            CTARTICA = TCTARTICA;
        EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTARTICA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTICA, 0, :VRSUBT, :PRTICA, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTICA;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTICA, 0, :VRSUBT, :PRTICA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTICA;
            END
        END /* RTICA */
      END
    /* CIERRE EL COMPROBANTE CONTRA LA CUENTA DEL TERCERO O LA CONSTANTE */
    if ((SUMA <> 0) and ((CARTERA = 'C') or (CARTERA = 'K') or (CARTERA = 'J'))) then
        BEGIN
        if (SUMA < 0) then
            BEGIN
            DEBITO = SUMA * -1;
            CREDITO = 0;
            END
        ELSE
            BEGIN
            DEBITO = 0;
            CREDITO = SUMA;
            END
        if (CARTERA = 'C') then
            CTACARTERA = TCTACLIEN;
        if (CARTERA = 'J') then
            BEGIN
            /* BUSQUE LA CUENTA DE LA CAJA */
            SELECT CAJA_CUENTA FROM CAJAS C, PUNTO_VENTA P
                WHERE P.CAJA_ID = C.CAJA_ID AND PTVT_ID = :PTOVTA
                INTO :CTACARTERA;
            END
        EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTACARTERA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :DEBITO, :CREDITO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
        if (TIPOCUEN = 'N') then
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :DEBITO, :CREDITO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
        NROI = NROI + 1;
        END /* SUMA EN CARTERA */
    /* CALCULE COSTOS EN VENTAS */
    EXECUTE PROCEDURE COSTO_EN_VENTAS(31, :IDDOC);
    if (COSTOS = 'A') then
        BEGIN
        FOR SELECT MAX(CTACOS), SUM(CAST(CANT AS DOUBLE PRECISION) * COSTO)
            FROM COSTO_VENTAS WHERE TIDO_COD = 31 AND COVE_ID = :IDDOC
            GROUP BY CTACOS
            INTO :CTACOSTOS, :MONTO
        DO
            BEGIN
            if (MONTO <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTACOSTOS, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT ARTI_COD, CANT * COSTO
                        FROM COSTO_VENTAS WHERE TIDO_COD = 31 AND COVE_ID = :IDDOC AND CTACOS = :CUENTA
                        INTO :ART, :MONTO
                    DO
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    NROI = NROI + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    END
                END /* MONTO <> 0 */
            END /* FOR */
        END /* COSTOS */
    if (COSTOS = 'K') then
        BEGIN
        SELECT SUM(CAST(CANT AS DOUBLE PRECISION) * COSTO)
            FROM COSTO_VENTAS WHERE TIDO_COD = 31 AND COVE_ID = :IDDOC
            INTO :MONTO;
        if (MONTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTACOSTOS, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, REGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT ARTI_COD, CANT * COSTO
                    FROM COSTO_VENTAS WHERE TIDO_COD = 31 AND COVE_ID = :IDDOC
                    INTO :ART, :MONTO
                DO
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTACOSTOS, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                    NROI = NROI + 1;
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTACOSTOS, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTACOSTOS, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                END
            END /* MONTO <> 0 */
        END /* COSTOS = K */
    if (INVEN = 'A') then
        BEGIN
        FOR SELECT MAX(CTAINV), SUM(CAST(CANT AS DOUBLE PRECISION) * COSTO)
            FROM COSTO_VENTAS WHERE TIDO_COD = 31 AND COVE_ID = :IDDOC
            GROUP BY CTAINV
            INTO :CTAINVEN, :MONTO
        DO
            BEGIN
            if (MONTO <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTAINVEN, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, REGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT ARTI_COD, CANT * COSTO
                        FROM COSTO_VENTAS WHERE TIDO_COD = 31 AND COVE_ID = :IDDOC AND CTAINV = :CUENTA
                        INTO :ART, :MONTO
                    DO
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    NROI = NROI + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    END
                END /* MONTO <> 0 */
            END /* FOR */
        END /* INVEN = A */
    if (INVEN = 'K') then
        BEGIN
        SELECT SUM(CAST(CANT AS DOUBLE PRECISION) * COSTO)
            FROM COSTO_VENTAS WHERE TIDO_COD = 31 AND COVE_ID = :IDDOC
            INTO :MONTO;
        if (MONTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTAINVEN, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT ARTI_COD, CANT * COSTO
                    FROM COSTO_VENTAS WHERE TIDO_COD = 31 AND COVE_ID = :IDDOC
                    INTO :ART, :MONTO
                DO
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTAINVEN, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                    NROI = NROI + 1;
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAINVEN, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAINVEN, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                END
            END /* MONTO <> 0 */
        END /* INVEN = K */
    /* recorra las cuentas adicionales */
    FOR SELECT INVC_CUENTA, INVC_BASE, INVC_PORC, INVC_VALOR, INVC_DB
        FROM INTERFAZ_VENTAS_CTAS
        WHERE INVE_ID = :IDINTER
        INTO :CTADIC, :BASEADIC, :PORCADIC, :VALORADIC, :DBADIC
        DO
        BEGIN
        if (VALORADIC <> 0) then
            MONTO = VALORADIC;
        ELSE
            BEGIN
            if (:BASEADIC = 'SUBTOTAL') then
                VALORADIC = vrsubt;
            if (:BASEADIC = 'DESCUENTO') then
                VALORADIC = VRDTO;
            if (:BASEADIC = 'IVA') then
                VALORADIC = VRIVA;
            if (:BASEADIC = 'ADICIONAL') then
                VALORADIC = VRADIC;
            if (:BASEADIC = 'EXTRA') then
                VALORADIC = VREXTRA;
            if (:BASEADIC = 'TOTAL') then
                VALORADIC = VRTOTAL;
            MONTO = VALORADIC * PORCADIC / 100;
            END
        if (MONTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTADIC, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                if (DBADIC = 'S') then
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                ELSE
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                if (DBADIC = 'S') then
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                ELSE
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                END
            NROI = NROI + 1;
            END
        END
    if (ERROR > 0) then
        VER = 'S';
    SUSPEND;
    END /* NO ANULADO */
  END /* EXISTE LA INTERFAZ */
ELSE
    BEGIN
    EXECUTE PROCEDURE ERROR (31, :IDDOC, :PREF, 1);
    ERROR = ERROR + 1;
    VER = 'S';
    SUSPEND;
    END
END

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE EXPORTA_FACTURAS(
    INI DATE,
    FIN DATE)
RETURNS (
    IDDOC INTEGER,
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA VARCHAR(8),
    VENCE VARCHAR(8),
    NIT VARCHAR(15),
    VENDEDOR INTEGER,
    BODEGA VARCHAR(2),
    OBSERVACION VARCHAR(255),
    ITEM INTEGER,
    CUENTA VARCHAR(20),
    PROY VARCHAR(4),
    CENTRO VARCHAR(4),
    ARTICULO VARCHAR(15),
    DESCR VARCHAR(60),
    LOTE VARCHAR(15),
    CANT NUMERIC(18,4),
    MONTO NUMERIC(18,2),
    DB CHAR(1))
AS
declare variable TOTAL NUMERIC(18,2);
declare variable CARTERA CHAR(1);
declare variable FECAUX DATE;
declare variable VENCEAUX DATE;
declare variable SUMA NUMERIC(18,2);
BEGIN
/* FACTURAS DEL RANGO QUE NO SE HAN TRANSMITIDO */
FOR SELECT FACT_ID, F.PREF_PRE, FACT_NUMERO, FACT_FECHA, FACT_VENCE, FACT_TOTAL, TERC_NIT, PREF_PROY, PREF_CENTRO, VEND_COD, BODE_COD, FACT_OBS
    FROM FACTURAS F, PREFIJOS P
    WHERE F.PREF_PRE = P.PREF_PRE AND P.TIDO_COD = 31 AND FACT_FECHA >= :INI AND FACT_FECHA <= :FIN AND FACT_TRANSMIT = 'N'
    INTO :IDDOC, :PREFIJO, :NUMERO, :FECAUX, :VENCEAUX, :TOTAL, :NIT, :PROY, :CENTRO, :VENDEDOR, :BODEGA, :OBSERVACION
    DO
    BEGIN
    EXECUTE PROCEDURE FECHA_A_CONTA(:FECAUX) returning_values (:FECHA);
    EXECUTE PROCEDURE FECHA_A_CONTA(:VENCEAUX) returning_values (:VENCE);
    SUMA = 0;
    /* VENTAS */
    FOR SELECT F.ARTI_COD, FADE_DESC, COAR_CTAVNT, FADE_LOTE, FADE_CANT, FADE_CANT * (FADE_PRUNIT - FADE_DTOMONTO), 'C'
        FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_DETALLE F
        WHERE F.FACT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
        INTO :ARTICULO, :DESCR, :CUENTA, :LOTE, :CANT, :MONTO, :DB
        DO
            BEGIN
            SUMA = SUMA + MONTO;
            SUSPEND;
            END
    /* IVA */
    FOR SELECT F.FADE_ITEM, F.ARTI_COD, FADE_DESC, COAR_CTAIVAV, FADE_LOTE, FADE_CANT, FADE_IVAMONTO, 'C'
        FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_DETALLE F
        WHERE F.FACT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
        INTO :ITEM, :ARTICULO, :DESCR, :CUENTA, :LOTE, :CANT, :MONTO, :DB
        DO 
            BEGIN
            SUMA = SUMA + MONTO;
            SUSPEND;
            END
    /* TOTAL */
    SELECT MAX(INVE_CARTERA), MAX(INVE_CTACARTERA)
    FROM INTERFAZ_VENTAS I
    WHERE TIDO_COD = 31 AND PREF_PRE = :PREFIJO
    INTO :CARTERA, :CUENTA;
    if (CARTERA = 'C') then
        SELECT TERC_CTACLIENTE FROM TERCEROS WHERE TERC_NIT = :NIT INTO :CUENTA;
    ARTICULO = '';
    DESCR = '';
    LOTE = '000';
    CANT = 0;
    MONTO = SUMA;
    DB = 'D';
    SUSPEND;
    /* INVENTARIO */
    EXECUTE PROCEDURE COSTO_EN_VENTAS(31, :IDDOC);
    FOR SELECT C.ARTI_COD, ARTI_DES, CTAINV, '000', CANT, CANT * COSTO, 'C'
        FROM COSTO_VENTAS C, ARTICULO A
        WHERE C.ARTI_COD = A.ARTI_COD AND TIDO_COD = 31 AND COVE_ID = :IDDOC
        INTO :ARTICULO, :DESCR, :CUENTA, :LOTE, :CANT, :MONTO, :DB
        DO SUSPEND;
    /* COSTO */
    FOR SELECT C.ARTI_COD, ARTI_DES, CTACOS, '000', CANT, CANT * COSTO, 'D'
        FROM COSTO_VENTAS C, ARTICULO A
        WHERE C.ARTI_COD = A.ARTI_COD AND TIDO_COD = 31 AND COVE_ID = :IDDOC
        INTO :ARTICULO, :DESCR, :CUENTA, :LOTE, :CANT, :MONTO, :DB
        DO SUSPEND;
    END
  SUSPEND;
END

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE RECONTABILICE_COSTOS_VENTAS(
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    ID INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    IDC INTEGER)
AS
declare variable IDI INTEGER;
begin
FOR SELECT FACT_ID, PREF_PRE, FACT_NUMERO FROM FACTURAS WHERE fact_anulado = 'N' and FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN ORDER BY FACT_FECHA, FACT_ID INTO :ID, :PREF, :NUMERO
    do  
    BEGIN
    SELECT MAX(INVE_ID) FROM INTERFAZ_VENTAS WHERE PREF_PRE = :PREF AND TIDO_COD = 31 INTO :IDI;
    EXECUTE PROCEDURE CONTABILICE_COSTO_VENTAS(31, :ID, :IDI) returning_values (:IDC);
    suspend;
    END
FOR SELECT DEVT_ID, PREF_PRE, DEVT_NUMERO FROM devoluciones_ventas WHERE devt_anulado = 'N' and DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN ORDER BY DEVT_FECHA, DEVT_ID INTO :ID, :PREF, :NUMERO
    do  
    BEGIN
    SELECT MAX(INVE_ID) FROM INTERFAZ_VENTAS WHERE PREF_PRE = :PREF AND TIDO_COD = 33 INTO :IDI;
    EXECUTE PROCEDURE CONTABILICE_COSTO_VENTAS(33, :ID, :IDI) returning_values (:IDC);
    suspend;
    END
end

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE DEVOLUCIONES_SIN_CONTABILIDAD(
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    ID INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    ESTADO VARCHAR(20),
    IDI INTEGER,
    IDC INTEGER)
AS
DECLARE VARIABLE VER CHAR(2);
declare variable FECICNT VARCHAR(10);
declare variable FECFCNT VARCHAR(10);
declare variable ERROR INTEGER;
declare variable idref INTEGER;
BEGIN
EXECUTE PROCEDURE fecha_a_conta(FECINI) returning_values (FECICNT);
EXECUTE PROCEDURE fecha_a_conta(FECFIN) returning_values (FECFCNT);
FOR SELECT DEVT_ID, PREF_PRE, DEVT_NUMERO FROM devoluciones_ventas WHERE DEVT_ANULADO = 'N' AND
    DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN
    INTO :ID, :PREF, :NUMERO
DO
  BEGIN
  idref = null;
  SELECT ENCO_IDREF FROM COMPROBANTE_ENCABEZADO WHERE ENCO_TIPOREF = 33 AND ENCO_FECHA >= :FECICNT AND ENCO_FECHA <= :FECFCNT and ENCO_IDREF = :id into :idref;
  if (idref IS NULL) then
  begin
   ESTADO = 'PROCESANDO';
   SUSPEND;
   SELECT MAX(INVE_ID) FROM INTERFAZ_VENTAS WHERE PREF_PRE = :PREF AND TIDO_COD = 33 INTO :IDI;
   EXECUTE PROCEDURE contabil_devolcli (:ID, :IDI) RETURNING_VALUES (:ERROR, :VER, :IDC);
   if (ERROR = 0) then
    BEGIN
    EXECUTE PROCEDURE CONTABILIZA_PENDIENTE (:IDC);
    ESTADO = 'OK';
    END
   ELSE
    ESTADO = 'ERROR';
   suspend;
  End
  END
END

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE CONTADO_MVERDE(
    FECINI DATE,
    FECFIN DATE,
    PREF VARCHAR(4))
RETURNS (
    FECHA DATE,
    PUNTO INTEGER,
    IDC INTEGER,
    ERROR INTEGER,
    VER CHAR(1))
AS
declare variable IDIN INTEGER;
declare variable IDF INTEGER;
declare variable NIT VARCHAR(20);
begin
FECHA = FECINI;
SELECT MAX(INVE_ID) FROM INTERFAZ_VENTAS WHERE TIDO_COD = 31 INTO :IDIN;
WHILE (FECHA <= fecfin) DO
    BEGIN
    /* LAS DE CONTADO */
    FOR SELECT PTVT_ID, TERC_NIT FROM punto_venta ORDER BY PTVT_ID INTO :PUNTO, :NIT
        do
        BEGIN
        EXECUTE PROCEDURE contabil_facturas_contado (FECHA, NIT, PREF, PUNTO, IDIN) returning_values (ERROR,  VER, IDC);
        EXECUTE PROCEDURE contabiliza_pendiente (IDC);
        suspend;
        END
    /* LAS DE CREDITO */
    FOR SELECT FACT_ID, PTVT_ID FROM facturas F WHERE fact_fecha = :fecha and pref_pre = :pref and
        NOT exists (select terc_nit from punto_venta p where terc_nit = f.terc_nit) into : IDF, :PUNTO
        DO
        BEGIN
        EXECUTE PROCEDURE contabil_factura(idf,  IDIN) returning_values (ERROR, VER, IDC);
        EXECUTE PROCEDURE contabiliza_pendiente (IDC);
        suspend;
        END
    FECHA = FECHA + 1;
    END
end

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE FACTURAR_CONCEPTOS(
    ID INTEGER,
    NITINI VARCHAR(20),
    NITFIN VARCHAR(20),
    AGRINI VARCHAR(20),
    AGRFIN VARCHAR(20),
    AGRUPA INTEGER,
    FECHA DATE)
RETURNS (
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(6),
    NIT VARCHAR(20),
    NOMBRE VARCHAR(60),
    TOTAL NUMERIC(18,2))
AS
declare variable IDF INTEGER;
declare variable IDC INTEGER;
declare variable VEND INTEGER;
declare variable PTVT INTEGER;
declare variable VENDINI INTEGER;
declare variable VENDFIN INTEGER;
declare variable ZONINI CHAR(2);
declare variable ZONFIN CHAR(2);
declare variable grpini INTEGER;
declare variable grpfin INTEGER;
declare variable DIAS INTEGER;
declare variable OBS VARCHAR(255);
declare variable IVAINC CHAR(1);
declare variable ITEM INTEGER;
declare variable ARTICULO VARCHAR(20);
declare variable DESCR VARCHAR(60);
declare variable CANT NUMERIC(18,2);
declare variable PRUNIT NUMERIC(18,2);
declare variable IVAP NUMERIC(18,2);
declare variable IVAM NUMERIC(18,2);
declare variable BASE NUMERIC(18,2);
declare variable RTFTE NUMERIC(9,2);
declare variable RTIVA NUMERIC(9,2);
declare variable RTICA NUMERIC(9,2);
declare variable RTFTEM NUMERIC(18,2);
declare variable RTIVAM NUMERIC(18,2);
declare variable RTICAM NUMERIC(18,2);
declare variable UNIDAD VARCHAR(8);
declare variable BOD VARCHAR(2);
declare variable ERROR INTEGER;
declare variable VER CHAR(1);
declare variable factmes varchar(2);
declare variable GRPFM VARCHAR(3);
declare variable OK CHAR(1);
begin
if (agrupa = 0) then
    BEGIN
    VENDINI = 0;
    VENDFIN = 999999;
    GRPINI = 0;
    GRPFIN = 999999;
    ZONINI = '';
    ZONFIN = 'zz';
    END
if (agrupa = 1) then
    BEGIN
    VENDINI = 0;
    VENDFIN = 999999;
    ZONINI = '';
    ZONFIN = 'zz';
    GRPINI = AGRINI;
    GRPFIN = AGRFIN;
    END
if (agrupa = 2) then
    BEGIN
    GRPINI = 0;
    GRPFIN = 999999;
    ZONINI = '';
    ZONFIN = 'zz';
    VENDINI = AGRINI;
    VENDFIN = AGRFIN;
    END
if (agrupa = 3) then
    BEGIN
    VENDINI = 0;
    VENDFIN = 999999;
    GRPINI = 0;
    GRPFIN = 999999;
    ZONINI = AGRINI;
    ZONFIN = AGRFIN;
    END
EXECUTE procedure lee_configuracion ('FACTURACION', 'FACTURAS', 'GRUPO DE MERCANCIA PARA CONTROL MENSUAL DE FACTURACION') returning_values (:GRPFM);
EXECUTE procedure lee_configuracion ('FACTURACION', 'FACTURAS', 'CONTROLAR FACTURACION MENSUAL POR CADA CLIENTE') returning_values (:factmes);
SELECT FACC_PREF, FACC_VEND, FACC_DIAS, FACC_PTVT, FACC_OBS FROM factura_concepto WHERE FACC_ID = :ID
    INTO :prefijo, :vend, :dias, :ptvt, :obs;
SELECT BODE_COD FROM punto_venta WHERE PTVT_ID = :PTVT INTO :BOD;
FOR SELECT T.TERC_NIT, TERC_NOM, C.vend_cod, C.clie_rtefte, C.clie_rteiva, C.clie_rteica, C.clie_rtftebase
    FROM TERCEROS T, CLIENTES C
    WHERE T.terc_nit = C.terc_nit AND T.TERC_NIT >= :NITINI AND T.TERC_NIT <= :NITFIN AND
        C.vend_cod >= :vendini AND C.vend_cod <= :vendfin AND ((c.grca_cod is null and :grpini = 0 ) or (C.grca_cod >= :grpini AND C.grca_cod <= :grpfin)) AND
        ((c.zona_cod is null and :zonini = '') or (C.zona_cod >= :zonini AND C.zona_cod <= :zonfin))
    INTO :NIT, :NOMBRE, :VEND, :RTFTE, :RTIVA, :RTICA, :RTFTEM
    DO
    BEGIN
    SELECT PREF_ACTUAL, PREF_IVAINC FROM PREFIJOS WHERE TIDO_COD = 31 AND PREF_PRE = :prefijo
        INTO :NUMERO, :IVAINC;
    select max(INVE_ID) FROM interfaz_ventas WHERE PREF_PRE = :prefijo AND TIDO_COD = 31 INTO :IDC;

    OK = 'S';
    if (FACTMES = 'SI') then
        begin
        if (EXISTS(SELECT FAME_IDFACT FROM FACTURAS_MES WHERE FAME_NIT = :nit AND FAME_ANO = EXTRACT(YEAR FROM :FECHA) AND FAME_MES = EXTRACT(MONTH FROM :FECHA))) then
            OK = 'N';
        end
    if (OK = 'S') then
        BEGIN
        IDF = GEN_ID(id_factura, 1);
        INSERT INTO FACTURAS (FACT_ID, PTVT_ID, VEND_COD, TERC_NIT, AUTO_NUMERO, FACT_NUMERO, FACT_FECHA, FACT_DESPACHO,
            FACT_VENCE, FACT_IVAINC, FACT_COMIPORC, FACT_COMIMONTO, FACT_DTOPOR, FACT_DTOMONTO, FACT_ADICIONAL,
            FACT_IVAMONTO, FACT_RTFTEPOR, FACT_RTFTEMONTO, FACT_RTIVAPOR, FACT_RTIVAMONTO, FACT_RTICAPOR, FACT_RTICAMONTO,
            FACT_EXTRA, FACT_DTOFPOR, FACT_DTOFMONTO, FACT_DTOFFECHA, PREF_PRE, FACT_TRANSP, FACT_NOMCLIENTE, FACT_COTIZACI,
            FACT_PEDIDO, FACT_REMISION, FACT_ANULADO, FACT_TRANSMIT, FACT_TOTAL, BODE_COD, FACT_OBS, VEHI_COD, FACT_CONSOLIDA,
            FACT_RECIBIDO, FACT_USUARIO, FACT_SUCURSAL, NUMOK, COBR_COD, FACT_FACTOR, FACT_DETCLI, FACT_DETCLINOM,
            FACT_DTOIT1, FACT_DTOIT2, FACT_DTOIT3, FACT_TRM)
            VALUES (:IDF, :PTVT, :VEND, :NIT, NULL, :NUMERO, :FECHA, NULL, (:FECHA + :DIAS), :IVAINC,
            0, 0, 0, 0, 0, :IVAM, :RTFTE, :RTFTEM, :RTIVA, :RTIVAM, :RTICA, :RTICAM, 0, 0, 0, :FECHA, :PREFIJO, NULL,
            :NOMBRE, NULL, NULL, NULL, 'N', 'N', :TOTAL, :BOD, :OBS, NULL, NULL, 0, USER, '01', 'N', :VEND, 1, NULL,
            NULL, NULL, NULL, NULL, 1);

        FOR SELECT FACI_ITEM, FC.ARTI_COD, FACI_CANT, FACI_PRUNIT, ARTI_UNIDAD, TAIV_PORC, FACI_DESC
            FROM factura_concepto_items FC, ARTICULO A, TARIFA_IVA I
            WHERE FC.arti_cod = A.arti_cod AND A.taiv_cod = I.taiv_cod AND FC.facc_id = :ID
            INTO :item, :articulo, :CANT, :prunit, :unidad, :ivap, :descr
            DO
            BEGIN
            /* busque el precio por cliente */
            if (EXISTS(SELECT ARTI_COD FROM ARTICULO WHERE ARTI_COD = :articulo AND GRUP_COD = :GRPFM)) then
                SELECT CLIE_VALORMES FROM CLIENTES WHERE TERC_NIT = :NIT INTO :PRUNIT;

            if (IVAINC = 'S') then
                BEGIN
                IVAM = :CANT * :PRUNIT / (100 + :IVAP) * :IVAP;
                BASE = :CANT * :PRUNIT;
                END
            ELSE
                BEGIN
                IVAM = :CANT * :PRUNIT * IVAP / 100;
                BASE = :CANT * :PRUNIT + IVAM;
                END
            INSERT INTO FACTURAS_DETALLE (FACT_ID, FADE_ITEM, BODE_COD, ARTI_COD, FADE_CANT, FADE_UNIDAD, FADE_LOTE,
                FADE_PRUNIT, FADE_DTOPORC, FADE_DTOMONTO, FADE_IVAPORC, FADE_IVAMONTO, FADE_CONSUMO, FADE_FACTOR,
                FADE_DESC, FADE_OBS, FADE_CODBAR, FADE_REMISIONADO, FADE_DEVUELTO, FADE_TOTAL, LIPR_COD, FADE_REFERENCIA,
                FADE_ANULADO, FADE_TRANSMIT, FADE_FACTORLISTA, FADE_DTO1, FADE_DTO2, FADE_DTO3, FADE_DTOM1, FADE_DTOM2,
                FADE_DTOM3, FADE_CAJAS)
                VALUES (:IDF, :ITEM, :BOD, :articulo, :CANT, :UNIDAD, NULL, :prunit, 0, 0, :IVAP, :ivam, 0, 1,
                :descr, NULL, :articulo, 0, 0, :BASE, 1, NULL, 'N', 'N', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
            END

        /* CALCULE EL TOTAL DE LA FACTURA XA EFECTOS DE IMPUESTOS */
        SELECT SUM(FADE_TOTAL), SUM(FADE_IVAMONTO) FROM facturas_detalle WHERE FACT_ID = :idf
            INTO :TOTAL, :IVAM;
        if (IVAINC = 'S') then
            BASE = TOTAL - IVAM;
        ELSE
            BASE = TOTAL;
        if (BASE >= RTFTEM) then
            BEGIN
            RTFTEM = BASE * RTFTE / 100;
            RTICAM = BASE * RTICA / 1000;
            RTIVAM = IVAM * RTIVA / 100;
            END
        ELSE
            BEGIN
            RTFTEM = 0;
            RTICAM = 0;
            RTIVAM = 0;
            END
        UPDATE FACTURAS SET FACT_TOTAL = :total,  FACT_IVAMONTO = :IVAM, FACT_RTFTEMONTO = :rtftem, 
            FACT_RTIVAMONTO = :rtivam, FACT_RTICAMONTO = :rticam WHERE FACT_ID = :IDF;

        /* contabilice */
        execute procedure CONTABIL_FACTURA(:idf,  :IDC) returning_values (:ERROR, :VER, :IDC);
        EXECUTE procedure contabiliza_pendiente (:IDC);
        suspend;
        END
    END
end

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE FACTURAS_SIN_CONTABILIDAD(
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    ID INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    ESTADO VARCHAR(20),
    IDI INTEGER,
    IDC INTEGER)
AS
DECLARE VARIABLE VER CHAR(2);
declare variable FECICNT VARCHAR(10);
declare variable FECFCNT VARCHAR(10);
declare variable ERROR INTEGER;
declare variable idref INTEGER;
BEGIN
EXECUTE PROCEDURE fecha_a_conta(FECINI) returning_values (FECICNT);
EXECUTE PROCEDURE fecha_a_conta(FECFIN) returning_values (FECFCNT);
FOR SELECT FACT_ID, PREF_PRE, FACT_NUMERO FROM FACTURAS WHERE FACT_ANULADO = 'N' AND
    FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN INTO :ID, :PREF, :NUMERO
DO
  BEGIN
  idref = null;
  SELECT ENCO_IDREF FROM COMPROBANTE_ENCABEZADO WHERE ENCO_TIPOREF = 31 AND ENCO_FECHA >= :FECICNT AND ENCO_FECHA <= :FECFCNT and ENCO_IDREF = :ID into :idref;
  if (idref IS NULL) then
  begin
   ESTADO = 'PROCESANDO';
   ERROR = NULL;
   SUSPEND;
   SELECT MAX(INVE_ID) FROM INTERFAZ_VENTAS WHERE PREF_PRE = :PREF AND TIDO_COD = 31 INTO :IDI;
   EXECUTE PROCEDURE CONTABIL_FACTURA (:ID, :IDI) RETURNING_VALUES (:ERROR, VER, :IDC);
   if ((ERROR = 0) or (error IS NULL)) then
    BEGIN
    EXECUTE PROCEDURE CONTABILIZA_PENDIENTE (:IDC);
    ESTADO = 'OK';
    END
   ELSE
    ESTADO = 'ERROR';
   suspend;
  end
  END
END

^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure CONTABIL_FACTURA (
    IDDOC integer,
    IDINTER integer)
returns (
    ERROR integer,
    VER char(1),
    IDC integer)
AS
declare variable pref varchar(4);
declare variable num varchar(6);
declare variable numero varchar(10);
declare variable fecaux date;
declare variable fecha char(8);
declare variable conc varchar(60);
declare variable venceaux date;
declare variable vence char(8);
declare variable vrdto numeric(18,2);
declare variable vradic numeric(18,2);
declare variable vrsubt numeric(18,2);
declare variable vriva numeric(18,2);
declare variable prtfte numeric(9,2);
declare variable vrrtfte numeric(18,2);
declare variable vrrtiva numeric(18,2);
declare variable prtica numeric(9,2);
declare variable vrrtica numeric(18,2);
declare variable vrtotal numeric(18,2);
declare variable vrextra numeric(18,2);
declare variable tipocomp varchar(3);
declare variable prefcont varchar(4);
declare variable ventas char(1);
declare variable ctaventas varchar(20);
declare variable iva char(1);
declare variable ctaiva varchar(20);
declare variable consumo char(1);
declare variable ctaconsumo varchar(20);
declare variable cartera char(1);
declare variable ctacartera varchar(20);
declare variable rtfte char(1);
declare variable ctartfte varchar(20);
declare variable rtiva char(1);
declare variable ctartiva varchar(20);
declare variable rtica char(1);
declare variable ctartica varchar(20);
declare variable inven char(1);
declare variable ctainven varchar(20);
declare variable costos char(1);
declare variable ctacostos varchar(20);
declare variable ctadto varchar(20);
declare variable ctaadic varchar(20);
declare variable ctaextra varchar(20);
declare variable existe char(1);
declare variable cuenta varchar(20);
declare variable monto numeric(18,2);
declare variable tipocuen char(1);
declare variable nit varchar(20);
declare variable nombre varchar(60);
declare variable proy varchar(4);
declare variable centro varchar(4);
declare variable proyi varchar(4);
declare variable centi varchar(4);
declare variable porc numeric(5,2);
declare variable debito numeric(18,2);
declare variable credito numeric(18,2);
declare variable nroi integer;
declare variable art varchar(15);
declare variable imptos numeric(18,2);
declare variable suma numeric(18,2);
declare variable porciva numeric(9,2);
declare variable tctaclien varchar(20);
declare variable tctaventa varchar(20);
declare variable tctartfte varchar(20);
declare variable tctartiva varchar(20);
declare variable tctartica varchar(20);
declare variable ctadic varchar(20);
declare variable baseadic varchar(20);
declare variable porcadic numeric(5,2);
declare variable valoradic numeric(18,2);
declare variable dbadic char(1);
declare variable ptovta integer;
declare variable anulado char(1);
declare variable dig integer;
declare variable mercancia numeric(18,2);
declare variable fomento varchar(2);
declare variable DTOXIT varchar(2);
declare variable vrconsumo numeric(18,2);
declare variable factor double precision;
declare variable cent char(1);
declare variable AUTORET VARCHAR(10);
declare variable FAUTORET DATE;
declare variable ERRORC INTEGER;
declare variable ICOING CHAR(2);
BEGIN
EXECUTE PROCEDURE LEE_CONFIGURACION('COMPRAS', 'FACTURAS', 'USAR IMPOCONSUMO COMO PORCENTAJE DE FOMENTO') returning_values (FOMENTO);
EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION', 'ARTICULOS', 'IMPOCONSUMO COMO MAYOR VALOR DEL COSTO Y DEL INGRESO') returning_values (ICOING);
EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'FECHA AUTORETENEDOR NO DESCONTAR RETENCIONES DEL SALDO PERO SI CONTABILIZARLAS') returning_values (AUTORET);
if (AUTORET <> '') then
    FAUTORET = CAST(AUTORET AS DATE);
else
    FAUTORET = '9999/12/31';
/* BUSQUE LA INTERFACE */
EXISTE = 'N';
SELECT 'S', TICO_COD, PRCO_PRE, INVE_VENTAS, INVE_IVA, INVE_CONSUMO, INVE_CARTERA, INVE_RTFTE, INVE_RTIVA, INVE_RTICA, INVE_COSTO, INVE_INVEN, INVE_CTAVENTAS, INVE_CTAIVA, INVE_CTACONSUMO, INVE_CTADTO, INVE_CTAADIC, INVE_CTAEXTRA, INVE_CTACARTERA, INVE_CTARTFTE, INVE_CTARTIVA, INVE_CTARTICA, INVE_CTAINVEN, INVE_CTACOSTOS, INVE_CONFIRMAR, INVE_CENTRO
    FROM INTERFAZ_VENTAS
    WHERE INVE_ID = :IDINTER
    INTO :EXISTE, :TIPOCOMP, :PREFCONT, :VENTAS, :IVA, :CONSUMO, :CARTERA, :RTFTE, :RTIVA, :RTICA, :COSTOS, :INVEN, :CTAVENTAS, :CTAIVA, :CTACONSUMO, :CTADTO, :CTAADIC, :CTAEXTRA, :CTACARTERA, :CTARTFTE, :CTARTIVA, :CTARTICA, :CTAINVEN, :CTACOSTOS, :VER, :CENT;
if (EXISTE = 'S') then
  BEGIN
    /* BORRE CUALQUEIR CONTABILIZACION PREVIA */
    DELETE FROM CONTABILIZACION WHERE CNTB_TIPOREF = 31 AND CNTB_IDREF = :IDDOC;

  /* TRAIGA EL ENCABEZADO DE LA FACTURA */
  SELECT PREF_PRE, FACT_NUMERO, FACT_FECHA, F.TERC_NIT, PTVT_ID, FACT_VENCE, FACT_DTOMONTO, FACT_ADICIONAL, FACT_IVAMONTO, FACT_EXTRA, FACT_TOTAL, FACT_RTFTEPOR, FACT_RTFTEMONTO, FACT_RTIVAPOR, FACT_RTIVAMONTO, FACT_RTICAPOR, FACT_RTICAMONTO, FACT_NOMCLIENTE, TERC_CTARTFTE, TERC_CTARTIVA, TERC_CTARTICA, TERC_CTAVENTA, TERC_CTACLIENTE, FACT_ANULADO
        FROM FACTURAS F, TERCEROS T
        WHERE FACT_ID = :IDDOC AND F.TERC_NIT = T.TERC_NIT
        INTO :PREF, :NUM, :FECAUX, :NIT, :PTOVTA, :VENCEAUX, :VRDTO, :VRADIC, :VRIVA, :VREXTRA, :VRTOTAL, :PRTFTE, :VRRTFTE, :PORC, :VRRTIVA, :PRTICA, :VRRTICA, :NOMBRE, TCTARTFTE, TCTARTIVA, TCTARTICA, TCTAVENTA, TCTACLIEN, ANULADO;
  if (ANULADO = 'N') then
    BEGIN
    /* BUSQUE EL CENTRO DEL PUNTO, LA BODEGA, O EL PREFIJO  */
    IF (CENT = 'B') THEN
        SELECT B.BODE_CENTRO, B.BODE_PROY FROM BODEGA B, FACTURAS F
            WHERE B.BODE_COD = F.BODE_COD AND F.FACT_ID = :IDDOC INTO :CENTRO, :PROY;
    IF (CENT = 'V') THEN
        SELECT V.CENT_COD, V.PROY_COD FROM VENDEDORES V, FACTURAS F
            WHERE V.VEND_COD = F.VEND_COD AND F.FACT_ID = :IDDOC INTO :CENTRO, :PROY;
    IF (CENT = 'P') THEN
        SELECT P.PREF_CENTRO,P.PREF_PROY  FROM PREFIJOS P, FACTURAS F
            WHERE P.PREF_PRE = F.PREF_PRE AND F.FACT_ID = :IDDOC AND P.TIDO_COD = 31 INTO :CENTRO, :PROY;
    NUMERO = PREF || NUM;
    SELECT SUM (FADE_CONSUMO) FROM FACTURAS_DETALLE WHERE FACT_ID = :IDDOC  AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
        INTO MERCANCIA;
    VRSUBT = VRTOTAL - VREXTRA - VRIVA - MERCANCIA; /* BASE DE RETEFTE Y RETEICA */

    EXECUTE PROCEDURE lee_configuracion ('FACTURACION', 'FACTURAS', 'DESCUENTO PIE FACTURA IGUAL A SUMA DE DESCUENTOS POR ITEM') returning_values (:DTOXIT);
    if (DTOXIT = 'SI') then
        VRDTO = 0;
    MERCANCIA = VRSUBT - VRADIC + VRDTO;
    EXECUTE PROCEDURE FECHA_A_CONTA(:FECAUX) returning_values (:FECHA);
    EXECUTE PROCEDURE FECHA_A_CONTA(:VENCEAUX) returning_values (:VENCE);
    /* REGISTRE EL ENCABEZADO CONTABLE */
    IDC = GEN_ID(ID_CONTABILIZA, 1);
    if (STRLEN(NOMBRE)> 43 ) then
      CONC = 'FV No.' || NUMERO || '-' || SUBSTR(NOMBRE,1,43);
    ELSE
      CONC = 'FV No.' || NUMERO || '-' || NOMBRE;
    INSERT INTO CONTABILIZACION (CNTB_ID, CNTB_TIPOCOMP, CNTB_PREFCNT, CNTB_NUMERO, CNTB_FECHA, CNTB_CONCEPTO, CNTB_REF, CNTB_TIPOREF, CNTB_IDREF, CNTB_PREFREF, CNTB_NUMREF, CNTB_PROCESADO)
        VALUES (:IDC, :TIPOCOMP, :PREFCONT, :NUM, :FECHA, :CONC, '', 31, :IDDOC, :PREF, :NUM, 'N');
    NROI = 0;
    SUMA = 0;
    ERROR = 0;
    /* SI NO HAY CUENTA DE DESCUENTO NI ADICIONAL CALCULE UN FACTOR PARA LAS VENTAS Y EL IVA */
    if (MERCANCIA <> 0) then
        FACTOR = CAST(VRSUBT AS DOUBLE PRECISION) / CAST(MERCANCIA AS DOUBLE PRECISION);
    ELSE
        FACTOR = 1;
    /* TRAIGA EL NUMERO DE DIGITOS PARA EL REDONDEO */
    SELECT CAST(CONF_VALOR AS INTEGER) FROM CONFIGURACION WHERE CONF_MODULO = 'FACTURACION' AND
        CONF_CATEGORIA = 'GENERAL' AND CONF_PROPIEDAD = 'REDONDEO AL MULTIPLO DE DIEZ EN TOTALES' INTO :DIG;
    /* CUENTAS DE VENTAS */
    if (VENTAS = 'A') then
        BEGIN
        FOR SELECT MAX(COAR_CTAVNT), SUM(FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), SUM(FADE_IVAMONTO), SUM(FADE_CONSUMO), MAX(B.bode_proy), MAX(B.bode_centro)
            FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_DETALLE F, bodega b
            WHERE F.FACT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL)) and
            f.bode_cod = b.bode_cod
            GROUP BY COAR_CTAVNT
            INTO :CTAVENTAS, :MONTO, :IMPTOS, :VRCONSUMO, :PROYI, :CENTI
            DO
            BEGIN
            if ((FOMENTO = 'SI') or (icoing = 'SI')) then
                MONTO = MONTO + VRCONSUMO;
            if ((CTADTO IS NULL) OR (CTADTO = '')) then
                MONTO = MONTO * FACTOR;
            execute procedure redondee(MONTO, DIG) returning_values (MONTO);
            if (MONTO <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTAVENTAS, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT F.ARTI_COD, (FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), FADE_CONSUMO
                        FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_DETALLE F
                        WHERE F.FACT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTAINV = :CUENTA AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
                        INTO :ART, :MONTO, :IMPTOS
                    DO
                        BEGIN
                        if ((FOMENTO = 'SI') or (ICOING = 'SI')) then
                            MONTO = MONTO + IMPTOS;
                        if ((CTADTO IS NULL) OR (CTADTO = '')) then
                            MONTO = MONTO * FACTOR;
                        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                        if (MONTO <> 0) then
                            BEGIN
                            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                            NROI = NROI + 1;
                            SUMA = SUMA - MONTO;
                            END
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    NROI = NROI + 1;
                    SUMA = SUMA - MONTO;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    IF (CENT = 'B') THEN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROYI, :CENTI, NULL, NULL, NULL, NULL, 0, 0);
                    ELSE
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA - MONTO;
                    END
                END /* MONTO <> 0 */
            END /* FOR */
        END /* VENTAS X ARTICULO */
     IF ((VENTAS = 'C') OR (VENTAS = 'K')) THEN
        BEGIN
        IF (VENTAS = 'C') THEN
            CTAVENTAS = TCTAVENTA;
        SELECT SUM(FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), SUM(FADE_IVAMONTO), SUM (FADE_CONSUMO)
            FROM FACTURAS_DETALLE F
            WHERE F.FACT_ID = :IDDOC AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
            INTO :MONTO, :IMPTOS, :VRCONSUMO;
        if ((FOMENTO = 'SI') or (ICOING = 'SI')) then
            MONTO = MONTO + VRCONSUMO;
        if ((CTADTO IS NULL) OR (CTADTO = '')) then
            MONTO = MONTO * FACTOR;
        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
        if (MONTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTAVENTAS, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT F.ARTI_COD, (FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), FADE_CONSUMO
                    FROM ARTICULO A, FACTURAS_DETALLE F
                    WHERE F.FACT_ID = :IDDOC AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
                    INTO :ART, :MONTO, :IMPTOS
                    DO
                    BEGIN
                    if ((FOMENTO = 'SI') or (ICOING = 'SI')) then
                        MONTO = MONTO + VRCONSUMO;
                    if ((CTADTO IS NULL) OR (CTADTO = '')) then
                        MONTO = MONTO * FACTOR;
                    execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                    if (MONTO <> 0) then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        SUMA = SUMA - MONTO;
                        END
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - MONTO;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - MONTO;
                END
            END /* MONTO <> 0 */
        END /* VENTAS DE CLIENTE O CONSTANTE */
    /* EL IVA EN VENTAS */
    if (IVA = 'A') then
        BEGIN
        FOR SELECT MAX(COAR_CTAIVAV), SUM(FADE_IVAMONTO), SUM(FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), sum(FADE_CONSUMO)
            FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_DETALLE F
            WHERE F.FACT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
            GROUP BY COAR_CTAIVAV
            INTO :CTAIVA, :IMPTOS, :MONTO, :VALORADIC
        DO
            BEGIN
            if (FOMENTO = 'SI') then
                MONTO = MONTO + VALORADIC;
            MONTO = MONTO * -1;
            MONTO = MONTO * FACTOR;
            IMPTOS = IMPTOS * FACTOR;
            execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
            execute procedure redondee(MONTO, DIG) returning_values (MONTO);
            if (IMPTOS <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTAIVA, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT F.ARTI_COD, FADE_IVAMONTO, (FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), TAIV_PORC, FADE_CONSUMO
                        FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_DETALLE F, TARIFA_IVA T
                        WHERE F.FACT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTAIVAV = :CUENTA AND A.TAIV_COD = T.TAIV_COD AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
                        INTO :ART, :IMPTOS, :MONTO, :PORCIVA, :VALORADIC
                    DO
                        BEGIN
                        if (FOMENTO = 'SI') then
                            MONTO = MONTO + VALORADIC;
                        MONTO = MONTO * -1;
                        MONTO = MONTO * FACTOR;
                        IMPTOS = IMPTOS * FACTOR;
                        execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                        if (IMPTOS <> 0) then
                            BEGIN
                            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, :MONTO, :PORCIVA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                            NROI = NROI + 1;
                            SUMA = SUMA + DEBITO - CREDITO;
                            END
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, :MONTO, ABS(:IMPTOS*100/:MONTO), :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    NROI = NROI + 1;
                    SUMA = SUMA - IMPTOS;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, :MONTO, ABS(:IMPTOS*100/:MONTO), :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA - IMPTOS;
                    END
                END   /* IMPTOS <> 0 */
            END /* FOR */
        END /* IVA X ARTICULO */
    if (IVA = 'K') then /* IVA EN CTA CONSTANTE */
        BEGIN
        SELECT SUM(FADE_IVAMONTO), SUM(FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), SUM(FADE_CONSUMO)
            FROM FACTURAS_DETALLE F
            WHERE F.FACT_ID = :IDDOC and FADE_IVAMONTO <> 0 AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
            INTO :IMPTOS, :MONTO, :valoradic;
        if (FOMENTO = 'SI') then
            MONTO = MONTO + VALORADIC;
        MONTO = MONTO * -1;
        MONTO = MONTO * FACTOR;
        IMPTOS = IMPTOS * FACTOR;
        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
        execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
        if (IMPTOS <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTAIVA, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT F.ARTI_COD, (FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), FADE_IVAMONTO, TAIV_PORC, FADE_CONSUMO
                    FROM ARTICULO A, FACTURAS_DETALLE F, TARIFA_IVA T
                    WHERE F.FACT_ID = :IDDOC AND A.TAIV_COD = T.TAIV_COD AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
                    INTO :ART, :MONTO, :IMPTOS, :PORCIVA, :VALORADIC
                    DO
                    BEGIN
                    if (FOMENTO = 'SI') then
                        MONTO = MONTO + VALORADIC;
                    MONTO = MONTO * -1;
                    MONTO = MONTO * FACTOR;
                    IMPTOS = IMPTOS * FACTOR;
                    execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                    execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                    if (IMPTOS <> 0) then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', 0, :IMPTOS, :MONTO, :PORCIVA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        SUMA = SUMA - IMPTOS;
                        END
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', 0, :IMPTOS, :MONTO, ABS(:IMPTOS*100/:MONTO), :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - IMPTOS;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', 0, :IMPTOS, :MONTO, ABS(:IMPTOS*100/:MONTO), :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - IMPTOS;
                END
            END /* IMPTOS <> 0 */
        END /* IVA EN CTA CONSTANTE */
    /* EL IMPOCONSUMO */
    if ((CONSUMO = 'A') AND (FOMENTO <> 'SI')) then
        BEGIN
        FOR SELECT MAX(COAR_CTACONS), SUM(FADE_CONSUMO)
            FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_DETALLE F
            WHERE F.FACT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
            GROUP BY COAR_CTACONS
            INTO :CTACONSUMO, :IMPTOS
        DO
            BEGIN
            execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
            if (IMPTOS <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTACONSUMO, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, REGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT F.ARTI_COD, FADE_CONSUMO
                        FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_DETALLE F
                        WHERE F.FACT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTACONS = :CUENTA AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
                        INTO :ART, :IMPTOS
                    DO
                        BEGIN
                        execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                        if (IMPTOS <> 0) then
                            BEGIN
                            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                            NROI = NROI + 1;
                            SUMA = SUMA - IMPTOS;
                            END
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    NROI = NROI + 1;
                    SUMA = SUMA - IMPTOS;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA - IMPTOS;
                    END
                END /* IMPTOS <> 0 */
            END /* FOR */
        END /* CONSUMO X ARTICULO */
    if ((CONSUMO = 'K') AND (FOMENTO <> 'SI')) then /* CONSUMO EN CTA CONSTANTE */
        BEGIN
        SELECT SUM(FADE_CONSUMO)
            FROM FACTURAS_DETALLE F
            WHERE F.FACT_ID = :IDDOC AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
            INTO :IMPTOS;
        execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
        if (IMPTOS <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTACONSUMO, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT F.ARTI_COD, FADE_CONSUMO
                    FROM ARTICULO A, FACTURAS_DETALLE F
                    WHERE F.FACT_ID = :IDDOC AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
                    INTO :ART, :IMPTOS
                    DO
                    BEGIN
                    execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                    if (IMPTOS <> 0) then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CTACONSUMO, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        SUMA = SUMA - IMPTOS;
                        END
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTACONSUMO, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - IMPTOS;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTACONSUMO, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - IMPTOS;
                END
            END /* IMPTOS <> 0 */
        END /* CONSUMO EN CTA CONSTANTE */
    /* DESCUENTO */
    if ((CTADTO IS NOT NULL) AND (CTADTO <> '')) then
        BEGIN
        execute procedure redondee(VRDTO, DIG) returning_values (VRDTO);
        if (VRDTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTADTO, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRDTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA + VRDTO;
                END
            if (TIPOCUEN = 'N') then
                    BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRDTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA + VRDTO;
                END
            END
        END /* DESCUENTO */
    /* VALOR ADIC */
    if ((CTAADIC IS NOT NULL) AND (CTAADIC <> '')) then
        BEGIN
        execute procedure redondee(VRADIC, DIG) returning_values (VRADIC);
        if (VRADIC <> 0) THEN
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTAADIC, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRADIC, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - VRADIC;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRADIC, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - VRADIC;
                END
            END
        END /* VR. ADIC */
    /* VALOR EXTRA */
    if ((CTAEXTRA IS NOT NULL) AND (CTAEXTRA <> '')) THEN
        BEGIN
        execute procedure redondee(VREXTRA, DIG) returning_values (VREXTRA);
        if (VREXTRA <> 0) THEN
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTAEXTRA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VREXTRA, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - VREXTRA;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VREXTRA, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - VREXTRA;
                END
            END
        END /* VR. EXTRA */
    /* DESCUENTE EL IMPOCONSUMO */
    SELECT SUM(FADE_CONSUMO)
        FROM FACTURAS_DETALLE F WHERE F.FACT_ID = :IDDOC AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL)) INTO :IMPTOS;
    vrsubt = vrsubt - IMPTOS;
    /* RETENCION FUENTE */
    if ((RTFTE = 'C') or (RTFTE = 'K')) then
      BEGIN
      execute procedure redondee(VRRTFTE, DIG) returning_values (VRRTFTE);
      if (VRRTFTE <> 0) then
        BEGIN
        if (RTFTE = 'C') then
            CTARTFTE = TCTARTFTE;
        EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTARTFTE, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :VRSUBT, :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTFTE;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :VRSUBT, :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTFTE;
            END
        /* AUTORETENCION */
        if (FAUTORET <= fecaux) then
            BEGIN
            EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'CUENTA DE AUTORETENCION EN LA FUENTE') returning_values (CTARTFTE);
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTARTFTE INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERROR (31, :IDDOC, :CTARTFTE, 2);
                CUENTA = CTARTFTE;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                begin
                EXECUTE PROCEDURE ERROR (31, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, (:VRSUBT*-1), :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - VRRTFTE;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, (:VRSUBT*-1), :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - VRRTFTE;
                END
            END
        END /* RTFTE */
      END
    if (RTFTE = 'A') then
      BEGIN
      FOR SELECT MAX(COAR_CTARTFTEV), MAX(COAR_RTFTE), MIN(COAR_RTBASE), SUM(FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), SUM((FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO)*COAR_RTFTE)
        FROM CONTABIL_ARTICULO C, FACTURAS_DETALLE F
        WHERE F.FACT_ID = :IDDOC AND F.ARTI_COD = C.ARTI_COD AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
        GROUP BY COAR_CTARTFTEV
        INTO :CTARTFTE, :PRTFTE, :baseadic, :MONTO, :VRRTFTE
        DO
        BEGIN
        MONTO = MONTO * FACTOR;
        if (MONTO >= BASEADIC) then
            BEGIN
            VRRTFTE = VRRTFTE * FACTOR / 100;
            execute procedure redondee(VRRTFTE, DIG) returning_values (VRRTFTE);
            execute procedure redondee(MONTO, DIG) returning_values (MONTO);
            if (VRRTFTE <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTARTFTE, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :MONTO, :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    NROI = NROI + 1;
                    SUMA = SUMA + VRRTFTE;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :MONTO, :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA + VRRTFTE;
                    END
                /* AUTORETENCION */
                if (FAUTORET <= fecaux) then
                    BEGIN
                    EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'CUENTA DE AUTORETENCION EN LA FUENTE') returning_values (CTARTFTE);
                    EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTARTFTE, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
                    if (ERRORC <> 0) then
                        ERROR = ERROR + 1;
                    if (TIPOCUEN = 'C') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, (:MONTO*-1), :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                        NROI = NROI + 1;
                        SUMA = SUMA - VRRTFTE;
                        END
                    if (TIPOCUEN = 'N') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, (:MONTO*-1), :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NROI = NROI + 1;
                        SUMA = SUMA - VRRTFTE;
                        END
                    END
                END
            END
        END /* RTFTE */
      END
    /* RETENCION IVA */
    if ((RTIVA = 'C') or (RTIVA = 'K')) then
      BEGIN
      execute procedure redondee(VRRTIVA, DIG) returning_values (VRRTIVA);
      if (VRRTIVA <> 0) then
        BEGIN
        if (RTIVA = 'C') then
            CTARTIVA = TCTARTIVA;
        EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTARTIVA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTIVA, 0, :VRIVA, :PORC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTIVA;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTIVA, 0, :VRIVA, :PORC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTIVA;
            END
        END /* RTIVA */
      END
    /* RETENCION DE ICA */
    if ((RTICA = 'C') or (RTICA = 'K')) then
      BEGIN
      execute procedure redondee(VRRTICA, DIG) returning_values (VRRTICA);
      if (VRRTICA <> 0) then
        BEGIN
        if (RTICA = 'C') then
            CTARTICA = TCTARTICA;
        EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTARTICA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTICA, 0, :VRSUBT, :PRTICA, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTICA;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTICA, 0, :VRSUBT, :PRTICA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTICA;
            END
        END /* RTICA */
      END
    /* CIERRE EL COMPROBANTE CONTRA LA CUENTA DEL TERCERO O LA CONSTANTE */
    if ((SUMA <> 0) and ((CARTERA = 'C') or (CARTERA = 'K') or (CARTERA = 'J'))) then
        BEGIN
        if (icoing = 'SI') then
            /* DESCUENTE EL IMPOCONSUMO QUE HACE PARTE DEL COSTO */
            SUMA = SUMA + IMPTOS;
        if (SUMA < 0) then
            BEGIN
            DEBITO = SUMA * -1;
            CREDITO = 0;
            END
        ELSE
            BEGIN
            DEBITO = 0;
            CREDITO = SUMA;
            END
        if (CARTERA = 'C') then
            CTACARTERA = TCTACLIEN;
        if (CARTERA = 'J') then
            BEGIN
            /* BUSQUE LA CUENTA DE LA CAJA */
            SELECT CAJA_CUENTA FROM CAJAS C, PUNTO_VENTA P
                WHERE P.CAJA_ID = C.CAJA_ID AND PTVT_ID = :PTOVTA
                INTO :CTACARTERA;
            END
        EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTACARTERA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :DEBITO, :CREDITO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
        if (TIPOCUEN = 'N') then
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :DEBITO, :CREDITO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
        NROI = NROI + 1;
        END /* SUMA EN CARTERA */
    /* CALCULE COSTOS EN VENTAS */
    EXECUTE PROCEDURE COSTO_EN_VENTAS(31, :IDDOC);
    if (COSTOS = 'A') then
        BEGIN
        FOR SELECT MAX(CTACOS), SUM(CAST(CANT AS DOUBLE PRECISION) * COSTO), SUM(FADE_CONSUMO)
            FROM COSTO_VENTAS CV, FACTURAS_DETALLE D WHERE CV.cove_item = D.fade_item AND D.fact_id = :iddoc AND
            TIDO_COD = 31 AND COVE_ID = :iddoc
            GROUP BY CTACOS
            INTO :CTACOSTOS, :MONTO, :vrconsumo
            DO
            BEGIN
            if (icoing = 'SI') then
                MONTO = MONTO + VRCONSUMO;
            if (MONTO <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTACOSTOS, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT ARTI_COD, CANT * COSTO
                        FROM COSTO_VENTAS WHERE TIDO_COD = 31 AND COVE_ID = :iddoc AND CTACOS = :CUENTA
                        INTO :ART, :MONTO
                    DO
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    NROI = NROI + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    END
                END /* MONTO <> 0 */
            END /* FOR */
        END /* COSTOS */
    if (COSTOS = 'K') then
        BEGIN
        SELECT SUM(CAST(CANT AS DOUBLE PRECISION) * COSTO)
            FROM COSTO_VENTAS WHERE TIDO_COD = 31 AND COVE_ID = :iddoc
            INTO :MONTO;
        if (icoing = 'SI') then
            MONTO = MONTO + imptos;
        if (MONTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTACOSTOS, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, REGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT ARTI_COD, CANT * COSTO
                    FROM COSTO_VENTAS WHERE TIDO_COD = 31 AND COVE_ID = :iddoc
                    INTO :ART, :MONTO
                DO
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTACOSTOS, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                    NROI = NROI + 1;
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTACOSTOS, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTACOSTOS, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                END
            END /* MONTO <> 0 */
        END /* COSTOS = K */
    if (INVEN = 'A') then
        BEGIN
        FOR SELECT MAX(CTAINV), SUM(CAST(CANT AS DOUBLE PRECISION) * COSTO)
            FROM COSTO_VENTAS WHERE TIDO_COD = 31 AND COVE_ID = :iddoc
            GROUP BY CTAINV
            INTO :CTAINVEN, :MONTO
        DO
            BEGIN
            if (MONTO <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTAINVEN, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, REGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT ARTI_COD, CANT * COSTO
                        FROM COSTO_VENTAS WHERE TIDO_COD = 31 AND COVE_ID = :iddoc AND CTAINV = :CUENTA
                        INTO :ART, :MONTO
                    DO
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    NROI = NROI + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    END
                END /* MONTO <> 0 */
            END /* FOR */
        END /* INVEN = A */
    if (INVEN = 'K') then
        BEGIN
        SELECT SUM(CAST(CANT AS DOUBLE PRECISION) * COSTO)
            FROM COSTO_VENTAS WHERE TIDO_COD = 31 AND COVE_ID = :iddoc
            INTO :MONTO;
        if (MONTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTAINVEN, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT ARTI_COD, CANT * COSTO
                    FROM COSTO_VENTAS WHERE TIDO_COD = 31 AND COVE_ID = :iddoc
                    INTO :ART, :MONTO
                DO
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTAINVEN, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                    NROI = NROI + 1;
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAINVEN, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAINVEN, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                END
            END /* MONTO <> 0 */
        END /* INVEN = K */
    /* recorra las cuentas adicionales */
    FOR SELECT INVC_CUENTA, INVC_BASE, INVC_PORC, INVC_VALOR, INVC_DB
        FROM INTERFAZ_VENTAS_CTAS
        WHERE INVE_ID = :IDINTER
        INTO :CTADIC, :BASEADIC, :PORCADIC, :VALORADIC, :DBADIC
        DO
        BEGIN
        if (VALORADIC <> 0) then
            MONTO = VALORADIC;
        ELSE
            BEGIN
            if (:BASEADIC = 'SUBTOTAL') then
                VALORADIC = vrsubt;
            if (:BASEADIC = 'DESCUENTO') then
                VALORADIC = VRDTO;
            if (:BASEADIC = 'IVA') then
                VALORADIC = VRIVA;
            if (:BASEADIC = 'ADICIONAL') then
                VALORADIC = VRADIC;
            if (:BASEADIC = 'EXTRA') then
                VALORADIC = VREXTRA;
            if (:BASEADIC = 'TOTAL') then
                VALORADIC = VRTOTAL;
            MONTO = VALORADIC * PORCADIC / 100;
            END
        if (MONTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTADIC, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                if (DBADIC = 'S') then
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                ELSE
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                if (DBADIC = 'S') then
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                ELSE
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                END
            NROI = NROI + 1;
            END
        END
    if (ERROR > 0) then
        VER = 'S';
    SUSPEND;
    END /* NO ANULADO */
  END /* EXISTE LA INTERFAZ */
ELSE
    BEGIN
    EXECUTE PROCEDURE ERROR (31, :IDDOC, :PREF, 1);
    ERROR = ERROR + 1;
    VER = 'S';
    SUSPEND;
    END
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE CONTADO_MVERDE(
    FECINI DATE,
    FECFIN DATE,
    PREF VARCHAR(4))
RETURNS (
    FECHA DATE,
    PUNTO INTEGER,
    IDC INTEGER,
    ERROR INTEGER,
    VER CHAR(1))
AS
declare variable IDIN INTEGER;
declare variable IDF INTEGER;
declare variable NIT VARCHAR(20);
begin
FECHA = FECINI;
SELECT MAX(INVE_ID) FROM INTERFAZ_VENTAS WHERE TIDO_COD = 31 INTO :IDIN;
WHILE (FECHA <= fecfin) DO
    BEGIN
    /* LAS DE CONTADO */
    FOR SELECT PTVT_ID, TERC_NIT FROM punto_venta ORDER BY PTVT_ID INTO :PUNTO, :NIT
        do
        BEGIN
        EXECUTE PROCEDURE contabil_facturas_contado (FECHA, NIT, PREF, PUNTO, IDIN) returning_values (ERROR,  VER, IDC);
        EXECUTE PROCEDURE contabiliza_pendiente (IDC);
        suspend;
        END
    /* LAS DE CREDITO */
    FOR SELECT FACT_ID, PTVT_ID FROM facturas F WHERE fact_fecha = :fecha and pref_pre = :pref and
        NOT exists (select terc_nit from punto_venta p where terc_nit = f.terc_nit) into : IDF, :PUNTO
        DO
        BEGIN
        EXECUTE PROCEDURE contabil_factura(idf,  IDIN) returning_values (ERROR, VER, IDC);
        EXECUTE PROCEDURE contabiliza_pendiente (IDC);
        suspend;
        END
    FECHA = FECHA + 1;
    END
end

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE FACTURAR_CONCEPTOS(
    ID INTEGER,
    NITINI VARCHAR(20),
    NITFIN VARCHAR(20),
    AGRINI VARCHAR(20),
    AGRFIN VARCHAR(20),
    AGRUPA INTEGER,
    FECHA DATE)
RETURNS (
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(6),
    NIT VARCHAR(20),
    NOMBRE VARCHAR(60),
    TOTAL NUMERIC(18,2))
AS
declare variable IDF INTEGER;
declare variable IDC INTEGER;
declare variable VEND INTEGER;
declare variable PTVT INTEGER;
declare variable VENDINI INTEGER;
declare variable VENDFIN INTEGER;
declare variable ZONINI CHAR(2);
declare variable ZONFIN CHAR(2);
declare variable grpini INTEGER;
declare variable grpfin INTEGER;
declare variable DIAS INTEGER;
declare variable OBS VARCHAR(255);
declare variable IVAINC CHAR(1);
declare variable ITEM INTEGER;
declare variable ARTICULO VARCHAR(20);
declare variable DESCR VARCHAR(60);
declare variable CANT NUMERIC(18,2);
declare variable PRUNIT NUMERIC(18,2);
declare variable IVAP NUMERIC(18,2);
declare variable IVAM NUMERIC(18,2);
declare variable BASE NUMERIC(18,2);
declare variable RTFTE NUMERIC(9,2);
declare variable RTIVA NUMERIC(9,2);
declare variable RTICA NUMERIC(9,2);
declare variable RTFTEM NUMERIC(18,2);
declare variable RTIVAM NUMERIC(18,2);
declare variable RTICAM NUMERIC(18,2);
declare variable UNIDAD VARCHAR(8);
declare variable BOD VARCHAR(2);
declare variable ERROR INTEGER;
declare variable VER CHAR(1);
declare variable factmes varchar(2);
declare variable GRPFM VARCHAR(3);
declare variable OK CHAR(1);
begin
if (agrupa = 0) then
    BEGIN
    VENDINI = 0;
    VENDFIN = 999999;
    GRPINI = 0;
    GRPFIN = 999999;
    ZONINI = '';
    ZONFIN = 'zz';
    END
if (agrupa = 1) then
    BEGIN
    VENDINI = 0;
    VENDFIN = 999999;
    ZONINI = '';
    ZONFIN = 'zz';
    GRPINI = AGRINI;
    GRPFIN = AGRFIN;
    END
if (agrupa = 2) then
    BEGIN
    GRPINI = 0;
    GRPFIN = 999999;
    ZONINI = '';
    ZONFIN = 'zz';
    VENDINI = AGRINI;
    VENDFIN = AGRFIN;
    END
if (agrupa = 3) then
    BEGIN
    VENDINI = 0;
    VENDFIN = 999999;
    GRPINI = 0;
    GRPFIN = 999999;
    ZONINI = AGRINI;
    ZONFIN = AGRFIN;
    END
EXECUTE procedure lee_configuracion ('FACTURACION', 'FACTURAS', 'GRUPO DE MERCANCIA PARA CONTROL MENSUAL DE FACTURACION') returning_values (:GRPFM);
EXECUTE procedure lee_configuracion ('FACTURACION', 'FACTURAS', 'CONTROLAR FACTURACION MENSUAL POR CADA CLIENTE') returning_values (:factmes);
SELECT FACC_PREF, FACC_VEND, FACC_DIAS, FACC_PTVT, FACC_OBS FROM factura_concepto WHERE FACC_ID = :ID
    INTO :prefijo, :vend, :dias, :ptvt, :obs;
SELECT BODE_COD FROM punto_venta WHERE PTVT_ID = :PTVT INTO :BOD;
FOR SELECT T.TERC_NIT, TERC_NOM, C.vend_cod, C.clie_rtefte, C.clie_rteiva, C.clie_rteica, C.clie_rtftebase
    FROM TERCEROS T, CLIENTES C
    WHERE T.terc_nit = C.terc_nit AND T.TERC_NIT >= :NITINI AND T.TERC_NIT <= :NITFIN AND
        C.vend_cod >= :vendini AND C.vend_cod <= :vendfin AND ((c.grca_cod is null and :grpini = 0 ) or (C.grca_cod >= :grpini AND C.grca_cod <= :grpfin)) AND
        ((c.zona_cod is null and :zonini = '') or (C.zona_cod >= :zonini AND C.zona_cod <= :zonfin))
    INTO :NIT, :NOMBRE, :VEND, :RTFTE, :RTIVA, :RTICA, :RTFTEM
    DO
    BEGIN
    SELECT PREF_ACTUAL, PREF_IVAINC FROM PREFIJOS WHERE TIDO_COD = 31 AND PREF_PRE = :prefijo
        INTO :NUMERO, :IVAINC;
    select max(INVE_ID) FROM interfaz_ventas WHERE PREF_PRE = :prefijo AND TIDO_COD = 31 INTO :IDC;

    OK = 'S';
    if (FACTMES = 'SI') then
        begin
        if (EXISTS(SELECT FAME_IDFACT FROM FACTURAS_MES WHERE FAME_NIT = :nit AND FAME_ANO = EXTRACT(YEAR FROM :FECHA) AND FAME_MES = EXTRACT(MONTH FROM :FECHA))) then
            OK = 'N';
        end
    if (OK = 'S') then
        BEGIN
        IDF = GEN_ID(id_factura, 1);
        INSERT INTO FACTURAS (FACT_ID, PTVT_ID, VEND_COD, TERC_NIT, AUTO_NUMERO, FACT_NUMERO, FACT_FECHA, FACT_DESPACHO,
            FACT_VENCE, FACT_IVAINC, FACT_COMIPORC, FACT_COMIMONTO, FACT_DTOPOR, FACT_DTOMONTO, FACT_ADICIONAL,
            FACT_IVAMONTO, FACT_RTFTEPOR, FACT_RTFTEMONTO, FACT_RTIVAPOR, FACT_RTIVAMONTO, FACT_RTICAPOR, FACT_RTICAMONTO,
            FACT_EXTRA, FACT_DTOFPOR, FACT_DTOFMONTO, FACT_DTOFFECHA, PREF_PRE, FACT_TRANSP, FACT_NOMCLIENTE, FACT_COTIZACI,
            FACT_PEDIDO, FACT_REMISION, FACT_ANULADO, FACT_TRANSMIT, FACT_TOTAL, BODE_COD, FACT_OBS, VEHI_COD, FACT_CONSOLIDA,
            FACT_RECIBIDO, FACT_USUARIO, FACT_SUCURSAL, NUMOK, COBR_COD, FACT_FACTOR, FACT_DETCLI, FACT_DETCLINOM,
            FACT_DTOIT1, FACT_DTOIT2, FACT_DTOIT3, FACT_TRM)
            VALUES (:IDF, :PTVT, :VEND, :NIT, NULL, :NUMERO, :FECHA, NULL, (:FECHA + :DIAS), :IVAINC,
            0, 0, 0, 0, 0, :IVAM, :RTFTE, :RTFTEM, :RTIVA, :RTIVAM, :RTICA, :RTICAM, 0, 0, 0, :FECHA, :PREFIJO, NULL,
            :NOMBRE, NULL, NULL, NULL, 'N', 'N', :TOTAL, :BOD, :OBS, NULL, NULL, 0, USER, '01', 'N', :VEND, 1, NULL,
            NULL, NULL, NULL, NULL, 1);

        FOR SELECT FACI_ITEM, FC.ARTI_COD, FACI_CANT, FACI_PRUNIT, ARTI_UNIDAD, TAIV_PORC, FACI_DESC
            FROM factura_concepto_items FC, ARTICULO A, TARIFA_IVA I
            WHERE FC.arti_cod = A.arti_cod AND A.taiv_cod = I.taiv_cod AND FC.facc_id = :ID
            INTO :item, :articulo, :CANT, :prunit, :unidad, :ivap, :descr
            DO
            BEGIN
            /* busque el precio por cliente */
            if (EXISTS(SELECT ARTI_COD FROM ARTICULO WHERE ARTI_COD = :articulo AND GRUP_COD = :GRPFM)) then
                SELECT CLIE_VALORMES FROM CLIENTES WHERE TERC_NIT = :NIT INTO :PRUNIT;

            if (IVAINC = 'S') then
                BEGIN
                IVAM = :CANT * :PRUNIT / (100 + :IVAP) * :IVAP;
                BASE = :CANT * :PRUNIT;
                END
            ELSE
                BEGIN
                IVAM = :CANT * :PRUNIT * IVAP / 100;
                BASE = :CANT * :PRUNIT + IVAM;
                END
            INSERT INTO FACTURAS_DETALLE (FACT_ID, FADE_ITEM, BODE_COD, ARTI_COD, FADE_CANT, FADE_UNIDAD, FADE_LOTE,
                FADE_PRUNIT, FADE_DTOPORC, FADE_DTOMONTO, FADE_IVAPORC, FADE_IVAMONTO, FADE_CONSUMO, FADE_FACTOR,
                FADE_DESC, FADE_OBS, FADE_CODBAR, FADE_REMISIONADO, FADE_DEVUELTO, FADE_TOTAL, LIPR_COD, FADE_REFERENCIA,
                FADE_ANULADO, FADE_TRANSMIT, FADE_FACTORLISTA, FADE_DTO1, FADE_DTO2, FADE_DTO3, FADE_DTOM1, FADE_DTOM2,
                FADE_DTOM3, FADE_CAJAS)
                VALUES (:IDF, :ITEM, :BOD, :articulo, :CANT, :UNIDAD, NULL, :prunit, 0, 0, :IVAP, :ivam, 0, 1,
                :descr, NULL, :articulo, 0, 0, :BASE, 1, NULL, 'N', 'N', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
            END

        /* CALCULE EL TOTAL DE LA FACTURA XA EFECTOS DE IMPUESTOS */
        SELECT SUM(FADE_TOTAL), SUM(FADE_IVAMONTO) FROM facturas_detalle WHERE FACT_ID = :idf
            INTO :TOTAL, :IVAM;
        if (IVAINC = 'S') then
            BASE = TOTAL - IVAM;
        ELSE
            BASE = TOTAL;
        if (BASE >= RTFTEM) then
            BEGIN
            RTFTEM = BASE * RTFTE / 100;
            RTICAM = BASE * RTICA / 1000;
            RTIVAM = IVAM * RTIVA / 100;
            END
        ELSE
            BEGIN
            RTFTEM = 0;
            RTICAM = 0;
            RTIVAM = 0;
            END
        UPDATE FACTURAS SET FACT_TOTAL = :total,  FACT_IVAMONTO = :IVAM, FACT_RTFTEMONTO = :rtftem, 
            FACT_RTIVAMONTO = :rtivam, FACT_RTICAMONTO = :rticam WHERE FACT_ID = :IDF;

        /* contabilice */
        execute procedure CONTABIL_FACTURA(:idf,  :IDC) returning_values (:ERROR, :VER, :IDC);
        EXECUTE procedure contabiliza_pendiente (:IDC);
        suspend;
        END
    END
end

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE FACTURAS_SIN_CONTABILIDAD(
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    ID INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    ESTADO VARCHAR(20),
    IDI INTEGER,
    IDC INTEGER)
AS
DECLARE VARIABLE VER CHAR(2);
declare variable FECICNT VARCHAR(10);
declare variable FECFCNT VARCHAR(10);
declare variable ERROR INTEGER;
declare variable idref INTEGER;
BEGIN
EXECUTE PROCEDURE fecha_a_conta(FECINI) returning_values (FECICNT);
EXECUTE PROCEDURE fecha_a_conta(FECFIN) returning_values (FECFCNT);
FOR SELECT FACT_ID, PREF_PRE, FACT_NUMERO FROM FACTURAS WHERE FACT_ANULADO = 'N' AND
    FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN INTO :ID, :PREF, :NUMERO
DO
  BEGIN
  idref = null;
  SELECT ENCO_IDREF FROM COMPROBANTE_ENCABEZADO WHERE ENCO_TIPOREF = 31 AND ENCO_FECHA >= :FECICNT AND ENCO_FECHA <= :FECFCNT and ENCO_IDREF = :ID into :idref;
  if (idref IS NULL) then
  begin
   ESTADO = 'PROCESANDO';
   ERROR = NULL;
   SUSPEND;
   SELECT MAX(INVE_ID) FROM INTERFAZ_VENTAS WHERE PREF_PRE = :PREF AND TIDO_COD = 31 INTO :IDI;
   EXECUTE PROCEDURE CONTABIL_FACTURA (:ID, :IDI) RETURNING_VALUES (:ERROR, VER, :IDC);
   if ((ERROR = 0) or (error IS NULL)) then
    BEGIN
    EXECUTE PROCEDURE CONTABILIZA_PENDIENTE (:IDC);
    ESTADO = 'OK';
    END
   ELSE
    ESTADO = 'ERROR';
   suspend;
  end
  END
END

^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure COSTO_EN_VENTAS_CONTADO (
    FECFAC date,
    PREF varchar(4),
    PTVTA integer)
AS
declare variable ARTICULO VARCHAR(20);
declare variable CANTIDAD NUMERIC(18,4);
declare variable COSTO NUMERIC(18,2);
declare variable CTACOSTO VARCHAR(20);
declare variable CTAINVEN VARCHAR(20);
declare variable ITEM INTEGER;
BEGIN
DELETE FROM COSTO_VENTAS WHERE TIDO_COD = 31 AND COVE_ID = 0;
ITEM = 0;
    /* FACTURA DE VENTA */
    FOR SELECT MAX(D.ARTI_COD), SUM(FADE_CANT * FADE_FACTOR), MAX(COAR_CTACOS), MAX(COAR_CTAINV)
        FROM ARTICULO A, FACTURAS F, FACTURAS_DETALLE D, CONTABIL_ARTICULO C
        WHERE F.FACT_ID = D.FACT_ID AND A.ARTI_COD = D.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND FACT_ANULADO = 'N' AND FACT_FECHA = :FECFAC AND F.PREF_PRE = :PREF AND F.PTVT_ID = :PTVTA and substring(a.arti_cod from 1 FOR 2) <> '.t'
        GROUP BY D.ARTI_COD
        INTO :ARTICULO, :CANTIDAD, :CTACOSTO, :CTAINVEN
        DO
        BEGIN
        ITEM = ITEM + 1;
        EXECUTE PROCEDURE COSTO_PROMEDIO(:ARTICULO, :FECFAC) returning_values (:COSTO);
        INSERT INTO COSTO_VENTAS (TIDO_COD, COVE_ID, ARTI_COD, CANT, COSTO,  CTACOS, CTAINV, COVE_ITEM)
            VALUES (31, 0, :ARTICULO, :CANTIDAD, :COSTO * :CANTIDAD, :CTACOSTO, :CTAINVEN, :ITEM);
        END
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE CONTABIL_FACTURAS_CONTADO(
    FECFAC DATE,
    NIT VARCHAR(20),
    PREF VARCHAR(4),
    PTVTA INTEGER,
    IDINTER INTEGER)
RETURNS (
    ERROR INTEGER,
    VER CHAR(1),
    IDC INTEGER)
AS
declare variable num varchar(8);
declare variable numero varchar(10);
declare variable fecha char(8);
declare variable conc char(120);
declare variable vence char(8);
declare variable vrdto numeric(18,2);
declare variable vradic numeric(18,2);
declare variable vrsubt numeric(18,2);
declare variable vriva numeric(18,2);
declare variable prtfte numeric(9,2);
declare variable vrrtfte numeric(18,2);
declare variable vrrtiva numeric(18,2);
declare variable prtica numeric(9,2);
declare variable vrrtica numeric(18,2);
declare variable vrtotal numeric(18,2);
declare variable vrextra numeric(18,2);
declare variable tipocomp varchar(3);
declare variable prefcont varchar(4);
declare variable ventas char(1);
declare variable ctaventas varchar(20);
declare variable iva char(1);
declare variable ctaiva varchar(20);
declare variable consumo char(1);
declare variable ctaconsumo varchar(20);
declare variable cartera char(1);
declare variable ctacartera varchar(20);
declare variable rtfte char(1);
declare variable ctartfte varchar(20);
declare variable rtiva char(1);
declare variable ctartiva varchar(20);
declare variable rtica char(1);
declare variable ctartica varchar(20);
declare variable inven char(1);
declare variable ctainven varchar(20);
declare variable costos char(1);
declare variable ctacostos varchar(20);
declare variable ctadto varchar(20);
declare variable ctaadic varchar(20);
declare variable ctaextra varchar(20);
declare variable existe char(1);
declare variable cuenta varchar(20);
declare variable monto numeric(18,2);
declare variable tipocuen char(1);
declare variable nombre varchar(60);
declare variable proy varchar(4);
declare variable centro varchar(4);
declare variable porc numeric(5,2);
declare variable debito numeric(18,2);
declare variable credito numeric(18,2);
declare variable nroi integer;
declare variable art varchar(15);
declare variable impinc char(1);
declare variable imptos numeric(18,2);
declare variable suma numeric(18,2);
declare variable porciva numeric(9,2);
declare variable tctaclien varchar(20);
declare variable tctaventa varchar(20);
declare variable tctartfte varchar(20);
declare variable tctartiva varchar(20);
declare variable tctartica varchar(20);
declare variable ctadic varchar(20);
declare variable baseadic varchar(20);
declare variable porcadic numeric(5,2);
declare variable valoradic numeric(18,2);
declare variable dbadic char(1);
declare variable ptovta integer;
declare variable dig integer;
declare variable mercancia numeric(18,2);
declare variable factor double precision;
declare variable cent char(1);
BEGIN
/* BUSQUE LA INTERFACE */
EXISTE = 'N';
SELECT 'S', TICO_COD, PRCO_PRE, INVE_VENTAS, INVE_IVA, INVE_CONSUMO, INVE_CARTERA, INVE_RTFTE, INVE_RTIVA, INVE_RTICA, INVE_COSTO, INVE_INVEN, INVE_CTAVENTAS, INVE_CTAIVA, INVE_CTACONSUMO, INVE_CTADTO, INVE_CTAADIC, INVE_CTAEXTRA, INVE_CTACARTERA, INVE_CTARTFTE, INVE_CTARTIVA, INVE_CTARTICA, INVE_CTAINVEN, INVE_CTACOSTOS, INVE_CONFIRMAR, INVE_CENTRO
    FROM INTERFAZ_VENTAS
    WHERE INVE_ID = :IDINTER
    INTO :EXISTE, :TIPOCOMP, :PREFCONT, :VENTAS, :IVA, :CONSUMO, :CARTERA, :RTFTE, :RTIVA, :RTICA, :COSTOS, :INVEN, :CTAVENTAS, :CTAIVA, :CTACONSUMO, :CTADTO, :CTAADIC, :CTAEXTRA, :CTACARTERA, :CTARTFTE, :CTARTIVA, :CTARTICA, :CTAINVEN, :CTACOSTOS, :VER, :CENT;
if (EXISTE = 'S') then
  BEGIN
  /* BORRE CUALQUEIR CONTABILIZACION PREVIA */
/*  DELETE FROM CONTABILIZACION WHERE CNTB_TIPOREF = 31 AND CNTB_IDREF = 0;
  /* BUSQUE EL CENTRO DEL PUNTO, LA BODEGA, O EL PREFIJO  */
  IF (CENT = 'B') THEN
    SELECT B.BODE_CENTRO, B.BODE_PROY FROM BODEGA B, PUNTO_VENTA P
        WHERE B.BODE_COD = P.BODE_COD AND P.ptvt_id = :ptvta INTO :CENTRO, :PROY;
  IF (CENT = 'V') THEN
    SELECT MAX(V.CENT_COD), MAX(V.PROY_COD) FROM VENDEDORES V
        WHERE V.PTVT_ID = :PTVTA INTO :CENTRO, :PROY;
  IF (CENT = 'P') THEN
    SELECT P.PREF_PROY, P.PREF_CENTRO FROM PREFIJOS P
        WHERE P.PREF_PRE = :PREF AND P.TIDO_COD = 31 INTO :CENTRO, :PROY;
  /* TRAIGA LOS DATOS DEL CLIENTE */
  SELECT TERC_NOM, TERC_CTARTFTE, TERC_CTARTIVA, TERC_CTARTICA, TERC_CTAVENTA, TERC_CTACLIENTE
        FROM TERCEROS T WHERE TERC_NIT = :NIT
        INTO :NOMBRE, TCTARTFTE, TCTARTIVA, TCTARTICA, TCTAVENTA, TCTACLIEN;
  SELECT SUM(FACT_DTOMONTO), SUM(FACT_ADICIONAL), SUM(FACT_IVAMONTO), SUM(FACT_EXTRA), SUM(FACT_TOTAL), SUM(FACT_RTFTEMONTO), SUM(FACT_RTIVAMONTO), SUM(FACT_RTICAMONTO), MAX(FACT_IVAINC)
        FROM FACTURAS F WHERE FACT_FECHA = :FECFAC AND FACT_ANULADO = 'N' AND PTVT_ID = :ptvta AND PREF_PRE = :PREF
        INTO :VRDTO, :VRADIC, :VRIVA, :VREXTRA, :VRTOTAL, :VRRTFTE, :VRRTIVA, :VRRTICA, :impinc;
  VRSUBT = VRTOTAL - VREXTRA - VRIVA; /* BASE DE RETEFTE Y RETEICA */
  MERCANCIA = VRSUBT - VRADIC + VRDTO;
  EXECUTE PROCEDURE FECHA_A_CONTA(:FECFAC) returning_values (:FECHA);
  VENCE = FECHA;
  /* REGISTRE EL ENCABEZADO CONTABLE */
  IDC = GEN_ID(ID_CONTABILIZA, 1);
  CONC = 'RESUMEN VENTAS ' || FECHA;
  NUM = SUBSTR(FECHA, 3, 8);
  INSERT INTO CONTABILIZACION (CNTB_ID, CNTB_TIPOCOMP, CNTB_PREFCNT, CNTB_NUMERO, CNTB_FECHA, CNTB_CONCEPTO, CNTB_REF, CNTB_TIPOREF, CNTB_IDREF, CNTB_PREFREF, CNTB_NUMREF, CNTB_PROCESADO)
        VALUES (:IDC, :TIPOCOMP, :PREFCONT, :NUM, :FECHA, :CONC, '', 0, 0, :PREF, :NUM, 'N');
  NROI = 0;
  SUMA = 0;
  ERROR = 0;
  /* SI NO HAY CUENTA DE DESCUENTO NI ADICIONAL CALCULE UN FACTOR PARA LAS VENTAS Y EL IVA */
  if (MERCANCIA <> 0) then
    FACTOR = CAST(VRSUBT AS DOUBLE PRECISION) / CAST(MERCANCIA AS DOUBLE PRECISION);
  ELSE
    FACTOR = 1;
  /* TRAIGA EL NUMERO DE DIGITOS PARA EL REDONDEO */
  SELECT CAST(CONF_VALOR AS INTEGER) FROM CONFIGURACION WHERE CONF_MODULO = 'FACTURACION' AND
        CONF_CATEGORIA = 'GENERAL' AND CONF_PROPIEDAD = 'REDONDEO AL MULTIPLO DE DIEZ EN TOTALES' INTO :DIG;
  /* CUENTAS DE VENTAS */
  if (VENTAS = 'A') then
        BEGIN
        FOR SELECT MAX(COAR_CTAVNT), SUM(CAST(FADE_CANT AS DOUBLE PRECISION) * (FADE_PRUNIT-FADE_DTOMONTO)), SUM(FADE_IVAMONTO+FADE_CONSUMO)
            FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_DETALLE FD, FACTURAS F
            WHERE F.FACT_ID = FD.FACT_ID AND FACT_FECHA = :FECFAC AND FD.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND F.PREF_PRE = :PREF AND F.PTVT_ID = :PTVTA AND FACT_ANULADO = 'N' AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
            GROUP BY COAR_CTAVNT
            INTO :CTAVENTAS, :MONTO, :IMPTOS
            DO
            BEGIN
            if (IMPINC = 'S') then
                MONTO = MONTO - IMPTOS;
            if ((CTADTO IS NULL) OR (CTADTO = '')) then
                MONTO = MONTO * FACTOR;
            execute procedure redondee(MONTO, DIG) returning_values (MONTO);
            if (MONTO <> 0) then
                BEGIN
                CUENTA = NULL;
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :CTAVENTAS INTO :CUENTA, :TIPOCUEN;
                if (CUENTA IS NULL) then
                    begin
                    EXECUTE PROCEDURE ERROR (31, 0, :CTAVENTAS, 2);
                    CUENTA = CTAVENTAS;
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT FD.ARTI_COD, (CAST(FADE_CANT AS DOUBLE PRECISION) * (FADE_PRUNIT-FADE_DTOMONTO)), (FADE_IVAMONTO+FADE_CONSUMO)
                        FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_DETALLE FD, FACTURAS F
                        WHERE F.FACT_ID = FD.FACT_ID AND FACT_FECHA = :FECFAC AND F.PREF_PRE = :PREF AND F.PTVT_ID = :PTVTA AND FD.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTAINV = :CUENTA AND FACT_ANULADO = 'N' AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
                        INTO :ART, :MONTO, :IMPTOS
                    DO
                        BEGIN
                        if (IMPINC = 'S') then
                            MONTO = MONTO - IMPTOS;
                        if ((CTADTO IS NULL) OR (CTADTO = '')) then
                            MONTO = MONTO * FACTOR;
                        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                        if (MONTO <> 0) then
                            BEGIN
                            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                            NROI = NROI + 1;
                            SUMA = SUMA - MONTO;
                            END
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    NROI = NROI + 1;
                    SUMA = SUMA - MONTO;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA - MONTO;
                    END
                END /* MONTO <> 0 */
            END /* FOR */
        END /* VENTAS X ARTICULO */
     IF ((VENTAS = 'C') OR (VENTAS = 'K')) THEN
        BEGIN
        IF (VENTAS = 'C') THEN
            CTAVENTAS = TCTAVENTA;
        SELECT SUM(CAST(FADE_CANT AS DOUBLE PRECISION) * (FADE_PRUNIT-FADE_DTOMONTO)), SUM(FADE_IVAMONTO+FADE_CONSUMO)
            FROM FACTURAS_DETALLE FD, FACTURAS F
            WHERE F.FACT_ID = FD.FACT_ID AND FACT_FECHA = :FECFAC AND F.PREF_PRE = :PREF AND F.PTVT_ID = :PTVTA AND FACT_ANULADO = 'N' AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
            INTO :MONTO, :IMPTOS;
        if (IMPINC = 'S') then
            MONTO = MONTO - IMPTOS;
        if ((CTADTO IS NULL) OR (CTADTO = '')) then
            MONTO = MONTO * FACTOR;
        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
        if (MONTO <> 0) then
            BEGIN
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTAVENTAS INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERROR (31, 0, :CTAVENTAS, 2);
                CUENTA = CTAVENTAS;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT FD.ARTI_COD, (CAST(FADE_CANT AS DOUBLE PRECISION) * (FADE_PRUNIT-FADE_DTOMONTO)), (FADE_IVAMONTO+FADE_CONSUMO)
                    FROM /*ARTICULO A,*/ FACTURAS_DETALLE FD, FACTURAS F
                    WHERE F.FACT_ID = FD.FACT_ID AND FACT_FECHA = :FECFAC AND F.PREF_PRE = :PREF AND F.PTVT_ID = :PTVTA AND FACT_ANULADO = 'N' AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
                    INTO :ART, :MONTO, :IMPTOS
                    DO
                    BEGIN
                    if (IMPINC = 'S') then
                        MONTO = MONTO - IMPTOS;
                    if ((CTADTO IS NULL) OR (CTADTO = '')) then
                        MONTO = MONTO * FACTOR;
                    execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                    if (MONTO <> 0) then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        SUMA = SUMA - MONTO;
                        END
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - MONTO;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - MONTO;
                END
            END /* MONTO <> 0 */
        END /* VENTAS DE CLIENTE O CONSTANTE */
    /* EL IVA EN VENTAS */
    if (IVA = 'A') then
        BEGIN
        FOR SELECT MAX(COAR_CTAIVAV), SUM(FADE_IVAMONTO), SUM(CAST(FADE_CANT AS DOUBLE PRECISION) * (FADE_PRUNIT-FADE_DTOMONTO)), sum(FADE_CONSUMO)
            FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_DETALLE FD, FACTURAS F
            WHERE F.FACT_ID = FD.FACT_ID AND FACT_FECHA = :FECFAC AND F.PREF_PRE = :PREF AND F.PTVT_ID = :PTVTA AND FD.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND FACT_ANULADO = 'N' AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
            GROUP BY COAR_CTAIVAV
            INTO :CTAIVA, :IMPTOS, :MONTO, :VALORADIC
        DO
            BEGIN
            if (IMPINC = 'S') then
                MONTO = MONTO - IMPTOS - VALORADIC;
            MONTO = MONTO * -1;
            MONTO = MONTO * FACTOR;
            IMPTOS = IMPTOS * FACTOR;
            execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
            execute procedure redondee(MONTO, DIG) returning_values (MONTO);
            if (IMPTOS <> 0) then
                BEGIN
                CUENTA = NULL;
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :CTAIVA INTO :CUENTA, :TIPOCUEN;
                if (CUENTA IS NULL) then
                    begin
                    EXECUTE PROCEDURE ERROR (31, 0, :CTAIVA, 2);
                    CUENTA = CTAIVA;
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT FD.ARTI_COD, FADE_IVAMONTO, (CAST(FADE_CANT AS DOUBLE PRECISION) * (FADE_PRUNIT-FADE_DTOMONTO)), TAIV_PORC, FADE_CONSUMO
                        FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_DETALLE FD, FACTURAS F, TARIFA_IVA T
                        WHERE F.FACT_ID = FD.FACT_ID AND FACT_FECHA = :FECFAC AND F.PREF_PRE = :PREF AND F.PTVT_ID = :PTVTA AND FD.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTAIVAV = :CUENTA AND A.TAIV_COD = T.TAIV_COD AND FACT_ANULADO = 'N' AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
                        INTO :ART, :IMPTOS, :MONTO, :PORCIVA, :VALORADIC
                    DO
                        BEGIN
                        if (IMPINC = 'S') then
                            MONTO = MONTO - IMPTOS - VALORADIC;
                        MONTO = MONTO * -1;
                        MONTO = MONTO * FACTOR;
                        IMPTOS = IMPTOS * FACTOR;
                        execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                        if (IMPTOS <> 0) then
                            BEGIN
                            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, :MONTO, :PORCIVA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                            NROI = NROI + 1;
                            SUMA = SUMA + DEBITO - CREDITO;
                            END
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, :MONTO, ABS(:IMPTOS*100/:MONTO), :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    NROI = NROI + 1;
                    SUMA = SUMA - IMPTOS;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, :MONTO, ABS(:IMPTOS*100/:MONTO), :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA - IMPTOS;
                    END
                END   /* IMPTOS <> 0 */
            END /* FOR */
        END /* IVA X ARTICULO */
    if (IVA = 'K') then /* IVA EN CTA CONSTANTE */
        BEGIN
        SELECT SUM(FADE_IVAMONTO), SUM(CAST(FADE_CANT AS DOUBLE PRECISION) * (FADE_PRUNIT-FADE_DTOMONTO)), SUM(FADE_CONSUMO)
            FROM FACTURAS_DETALLE FD, FACTURAS F
            WHERE F.FACT_ID = FD.FACT_ID AND FACT_FECHA = :FECFAC AND F.PREF_PRE = :PREF AND F.PTVT_ID = :PTVTA AND FACT_ANULADO = 'N' AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
            INTO :IMPTOS, :MONTO, :valoradic;
        if (IMPINC = 'S') then
            MONTO = MONTO - IMPTOS - VALORADIC;
        MONTO = MONTO * -1;
        MONTO = MONTO * FACTOR;
        IMPTOS = IMPTOS * FACTOR;
        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
        execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
        if (IMPTOS <> 0) then
            BEGIN
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTAIVA INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERROR (31, 0, :CTAIVA, 2);
                CUENTA = CTAIVA;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT FD.ARTI_COD, (CAST(FADE_CANT AS DOUBLE PRECISION) * (FADE_PRUNIT-FADE_DTOMONTO)), FADE_IVAMONTO, TAIV_PORC, FADE_CONSUMO
                    FROM ARTICULO A, FACTURAS_DETALLE FD, FACTURAS F, TARIFA_IVA T
                    WHERE F.FACT_ID = FD.FACT_ID AND FACT_FECHA = :FECFAC AND F.PREF_PRE = :PREF AND F.PTVT_ID = :PTVTA AND FD.arti_cod = A.arti_cod AND T.TAIV_COD=A.TAIV_COD AND FACT_ANULADO = 'N' AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
                    INTO :ART, :MONTO, :IMPTOS, :PORCIVA, :VALORADIC
                    DO
                    BEGIN
                    if (IMPINC = 'S') then
                        MONTO = MONTO - IMPTOS - VALORADIC;
                    MONTO = MONTO * -1;
                    MONTO = MONTO * FACTOR;
                    IMPTOS = IMPTOS * FACTOR;
                    execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                    execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                    if (IMPTOS <> 0) then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', 0, :IMPTOS, :MONTO, :PORCIVA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        SUMA = SUMA - IMPTOS;
                        END
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', 0, :IMPTOS, :MONTO, ABS(:IMPTOS*100/:MONTO), :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - IMPTOS;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', 0, :IMPTOS, :MONTO, ABS(:IMPTOS*100/:MONTO), :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - IMPTOS;
                END
            END /* IMPTOS <> 0 */
        END /* IVA EN CTA CONSTANTE */
    /* EL IMPOCONSUMO */
    if (CONSUMO = 'A') then
        BEGIN
        FOR SELECT MAX(COAR_CTACONS), SUM(FADE_CONSUMO)
            FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_DETALLE FD, FACTURAS F
            WHERE F.FACT_ID = FD.FACT_ID AND FACT_FECHA = :FECFAC AND F.PREF_PRE = :PREF AND F.PTVT_ID = :PTVTA AND FD.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND FACT_ANULADO = 'N' AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
            GROUP BY COAR_CTACONS
            INTO :CTACONSUMO, :IMPTOS
        DO
            BEGIN
            execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
            if (IMPTOS <> 0) then
                BEGIN
                CUENTA = NULL;
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :CTACONSUMO INTO :CUENTA, :TIPOCUEN;
                if (CUENTA IS NULL) then
                    begin
                    EXECUTE PROCEDURE ERROR (31, 0, :CTACONSUMO, 2);
                    CUENTA = CTACONSUMO;
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, REGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT FD.ARTI_COD, FADE_CONSUMO
                        FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_DETALLE FD, FACTURAS F
                        WHERE F.FACT_ID = FD.FACT_ID AND FACT_FECHA = :FECFAC AND F.PREF_PRE = :PREF AND F.PTVT_ID = :PTVTA AND FD.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTACONS = :CUENTA AND FACT_ANULADO = 'N' AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
                        INTO :ART, :IMPTOS
                    DO
                        BEGIN
                        execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                        if (IMPTOS <> 0) then
                            BEGIN
                            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                            NROI = NROI + 1;
                            SUMA = SUMA - IMPTOS;
                            END
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    NROI = NROI + 1;
                    SUMA = SUMA - IMPTOS;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA - CREDITO;
                    END
                END /* IMPTOS <> 0 */
            END /* FOR */
        END /* CONSUMO X ARTICULO */
    if (CONSUMO = 'K') then /* CONSUMO EN CTA CONSTANTE */
        BEGIN
        SELECT SUM(FADE_CONSUMO)
            FROM FACTURAS_DETALLE FD, FACTURAS F
            WHERE F.FACT_ID = FD.FACT_ID AND FACT_FECHA = :FECFAC AND F.PREF_PRE = :PREF AND F.PTVT_ID = :PTVTA AND FACT_ANULADO = 'N' AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
            INTO :IMPTOS;
        execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
        if (IMPTOS <> 0) then
            BEGIN
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTACONSUMO INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERROR (31, 0, :CTACONSUMO, 2);
                CUENTA = CTACONSUMO;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT FD.ARTI_COD, FADE_CONSUMO
                    FROM /*ARTICULO A,*/ FACTURAS_DETALLE FD, FACTURAS F
                    WHERE F.FACT_ID = FD.FACT_ID AND FACT_FECHA = :FECFAC AND F.PREF_PRE = :PREF AND F.PTVT_ID = :PTVTA AND FACT_ANULADO = 'N' AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
                    INTO :ART, :IMPTOS
                    DO
                    BEGIN
                    execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                    if (IMPTOS <> 0) then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CTACONSUMO, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        SUMA = SUMA - IMPTOS;
                        END
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTACONSUMO, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - IMPTOS;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTACONSUMO, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - IMPTOS;
                END
            END /* IMPTOS <> 0 */
        END /* CONSUMO EN CTA CONSTANTE */
    /* DESCUENTO */
    if ((CTADTO IS NOT NULL) AND (CTADTO <> '')) then
        BEGIN
        execute procedure redondee(VRDTO, DIG) returning_values (VRDTO);
        if (VRDTO <> 0) then
            BEGIN
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTADTO INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERROR (31, 0, :CTADTO, 2);
                CUENTA = CTADTO;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                begin
                EXECUTE PROCEDURE ERROR (31, 0, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRDTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA + VRDTO;
                END
            if (TIPOCUEN = 'N') then
                    BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRDTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA + VRDTO;
                END
            END
        END /* DESCUENTO */
    /* VALOR ADIC */
    if ((CTAADIC IS NOT NULL) AND (CTAADIC <> '')) then
        BEGIN
        execute procedure redondee(VRADIC, DIG) returning_values (VRADIC);
        if (VRADIC <> 0) THEN
            BEGIN
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTAADIC INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERROR (31, 0, :CTAADIC, 2);
                CUENTA = CTAADIC;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                begin
                EXECUTE PROCEDURE ERROR (31, 0, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRADIC, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - VRADIC;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRADIC, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - VRADIC;
                END
            END
        END /* VR. ADIC */
    /* VALOR EXTRA */
    if ((CTAEXTRA IS NOT NULL) AND (CTAEXTRA <> '')) THEN
        BEGIN
        execute procedure redondee(VREXTRA, DIG) returning_values (VREXTRA);
        if (VREXTRA <> 0) THEN
            BEGIN
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTAEXTRA INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERROR (31, 0, :CTAEXTRA, 2);
                CUENTA = CTAEXTRA;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                begin
                EXECUTE PROCEDURE ERROR (31, 0, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VREXTRA, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - VREXTRA;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VREXTRA, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - VREXTRA;
                END
            END
        END /* VR. EXTRA */
    /* RETENCION FUENTE */
    if ((RTFTE = 'C') or (RTFTE = 'K')) then
      BEGIN
      execute procedure redondee(VRRTFTE, DIG) returning_values (VRRTFTE);
      if (VRRTFTE <> 0) then
        BEGIN
        if (RTFTE = 'C') then
            CTARTFTE = TCTARTFTE;
        CUENTA = NULL;
        SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
            WHERE CUEN_COD = :CTARTFTE INTO :CUENTA, :TIPOCUEN;
        if (CUENTA IS NULL) then
            begin
            EXECUTE PROCEDURE ERROR (31, 0, :CTARTFTE, 2);
            CUENTA = CTARTFTE;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            begin
            EXECUTE PROCEDURE ERROR (31, 0, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :VRSUBT, :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTFTE;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :VRSUBT, :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTFTE;
            END
        END /* RTFTE */
      END
    /* RETENCION IVA */
    if ((RTIVA = 'C') or (RTIVA = 'K')) then
      BEGIN
      execute procedure redondee(VRRTIVA, DIG) returning_values (VRRTIVA);
      if (VRRTIVA <> 0) then
        BEGIN
        if (RTIVA = 'C') then
            CTARTIVA = TCTARTIVA;
        CUENTA = NULL;
        SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
            WHERE CUEN_COD = :CTARTIVA INTO :CUENTA, :TIPOCUEN;
        if (CUENTA IS NULL) then
            begin
            EXECUTE PROCEDURE ERROR (31, 0, :CTARTIVA, 2);
            CUENTA = CTARTIVA;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            begin
            EXECUTE PROCEDURE ERROR (31, 0, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTIVA, 0, :VRIVA, :PORC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTIVA;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTIVA, 0, :VRIVA, :PORC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTIVA;
            END
        END /* RTIVA */
      END
    /* RETENCION DE ICA */
    if ((RTICA = 'C') or (RTICA = 'K')) then
      BEGIN
      execute procedure redondee(VRRTICA, DIG) returning_values (VRRTICA);
      if (VRRTICA <> 0) then
        BEGIN
        if (RTICA = 'C') then
            CTARTICA = TCTARTICA;
        CUENTA = NULL;
        SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
            WHERE CUEN_COD = :CTARTICA INTO :CUENTA, :TIPOCUEN;
        if (CUENTA IS NULL) then
            begin
            EXECUTE PROCEDURE ERROR (31, 0, :CTARTICA, 2);
            CUENTA = CTARTICA;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            begin
            EXECUTE PROCEDURE ERROR (31, 0, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTICA, 0, :VRSUBT, :PRTICA, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTICA;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTICA, 0, :VRSUBT, :PRTICA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTICA;
            END
        END /* RTICA */
      END
    /* CIERRE EL COMPROBANTE CONTRA LA CUENTA DEL TERCERO O LA CONSTANTE */
    if ((SUMA <> 0) and ((CARTERA = 'C') or (CARTERA = 'K') or (CARTERA = 'J'))) then
        BEGIN
        if (SUMA < 0) then
            BEGIN
            DEBITO = SUMA * -1;
            CREDITO = 0;
            END
        ELSE
            BEGIN
            DEBITO = 0;
            CREDITO = SUMA;
            END
        if (CARTERA = 'C') then
            CTACARTERA = TCTACLIEN;
        if (CARTERA = 'J') then
            BEGIN
            /* BUSQUE LA CUENTA DE LA CAJA */
            SELECT CAJA_CUENTA FROM CAJAS C, PUNTO_VENTA P
                WHERE P.CAJA_ID = C.CAJA_ID AND PTVT_ID = :PTOVTA
                INTO :CTACARTERA;
            END
        CUENTA = NULL;
        SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
            WHERE CUEN_COD = :CTACARTERA INTO :CUENTA, :TIPOCUEN;
        if (CUENTA IS NULL) then
            begin
            EXECUTE PROCEDURE ERROR (31, 0, :CTACARTERA, 2);
            CUENTA = CTACARTERA;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            begin
            EXECUTE PROCEDURE ERROR (31, 0, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'C') then
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :DEBITO, :CREDITO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
        if (TIPOCUEN = 'N') then
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :DEBITO, :CREDITO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
        NROI = NROI + 1;
        END /* SUMA EN CARTERA */
    /* CALCULE LOS COSTOS */
    EXECUTE PROCEDURE costo_en_ventas_contado(:fecfac,  :pref, :ptvta);
    if (COSTOS = 'A') then
        BEGIN
        FOR SELECT MAX(CTACOS), SUM(COSTO)
            FROM COSTO_VENTAS WHERE TIDO_COD = 31 AND COVE_ID = 0
            GROUP BY CTACOS
            INTO :CTACOSTOS, :MONTO
        DO
            BEGIN
            if (MONTO <> 0) then
                BEGIN
                CUENTA = NULL;
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :CTACOSTOS INTO :CUENTA, :TIPOCUEN;
                IF (CUENTA IS NULL) THEN
                    begin
                    EXECUTE PROCEDURE ERROR (31, 0, :CTACOSTOS, 2);
                    CUENTA = CTARTFTE;
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT ARTI_COD, CANT * COSTO
                        FROM COSTO_VENTAS WHERE TIDO_COD = 31 AND COVE_ID = 0 AND CTACOS = :CUENTA
                        INTO :ART, :MONTO
                    DO
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    NROI = NROI + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    END
                END /* MONTO <> 0 */
            END /* FOR */
        END /* COSTOS */
    if (COSTOS = 'K') then
        BEGIN
        SELECT SUM(COSTO)
            FROM COSTO_VENTAS  WHERE TIDO_COD = 31 AND COVE_ID = 0
            INTO :MONTO;
        if (MONTO <> 0) then
            BEGIN
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTACOSTOS INTO :CUENTA, :TIPOCUEN;
            IF (CUENTA IS NULL) THEN
                begin
                EXECUTE PROCEDURE ERROR (31, 0, :CTACOSTOS, 2);
                CUENTA = CTARTFTE;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, REGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT ARTI_COD, CANT * COSTO
                    FROM COSTO_VENTAS WHERE TIDO_COD = 31 AND COVE_ID = 0
                    INTO :ART, :MONTO
                DO
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTACOSTOS, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                    NROI = NROI + 1;
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTACOSTOS, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTACOSTOS, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                END
            END /* MONTO <> 0 */
        END /* COSTOS = K */
    if (INVEN = 'A') then
        BEGIN
        FOR SELECT MAX(CTAINV), SUM(COSTO)
            FROM COSTO_VENTAS  WHERE TIDO_COD = 31 AND COVE_ID = 0
            GROUP BY CTAINV
            INTO :CTAINVEN, :MONTO
        DO
            BEGIN
            if (MONTO <> 0) then
                BEGIN
                CUENTA = NULL;
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :CTAINVEN INTO :CUENTA, :TIPOCUEN;
                IF (CUENTA IS NULL) THEN
                    begin
                    EXECUTE PROCEDURE ERROR (31, 0, :CTAINVEN, 2);
                    CUENTA = CTAINVEN;
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, REGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT ARTI_COD, CANT * COSTO
                        FROM COSTO_VENTAS WHERE TIDO_COD = 31 AND COVE_ID = 0 AND CTAINV = :CUENTA
                        INTO :ART, :MONTO
                    DO
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    NROI = NROI + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    END
                END /* MONTO <> 0 */
            END /* FOR */
        END /* INVEN = A */
    if (INVEN = 'K') then
        BEGIN
        SELECT SUM(COSTO)
            FROM COSTO_VENTAS WHERE TIDO_COD = 31 AND COVE_ID = 0
            INTO :MONTO;
        if (MONTO <> 0) then
            BEGIN
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTAINVEN INTO :CUENTA, :TIPOCUEN;
            IF (CUENTA IS NULL) THEN
                begin
                EXECUTE PROCEDURE ERROR (31, 0, :CTAINVEN, 2);
                CUENTA = CTAINVEN;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT ARTI_COD, CANT * COSTO
                    FROM COSTO_VENTAS  WHERE TIDO_COD = 31 AND COVE_ID = 0
                    INTO :ART, :MONTO
                DO
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTAINVEN, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                    NROI = NROI + 1;
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAINVEN, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAINVEN, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                END
            END /* MONTO <> 0 */
        END /* INVEN = K */
    /* recorra las cuentas adicionales */
    FOR SELECT INVC_CUENTA, INVC_BASE, INVC_PORC, INVC_VALOR, INVC_DB
        FROM INTERFAZ_VENTAS_CTAS
        WHERE INVE_ID = :IDINTER
        INTO :CTADIC, :BASEADIC, :PORCADIC, :VALORADIC, :DBADIC
        DO
        BEGIN
        if (VALORADIC <> 0) then
            MONTO = VALORADIC;
        ELSE
            BEGIN
            if (:BASEADIC = 'SUBTOTAL') then
                VALORADIC = vrsubt;
            if (:BASEADIC = 'DESCUENTO') then
                VALORADIC = VRDTO;
            if (:BASEADIC = 'IVA') then
                VALORADIC = VRIVA;
            if (:BASEADIC = 'ADICIONAL') then
                VALORADIC = VRADIC;
            if (:BASEADIC = 'EXTRA') then
                VALORADIC = VREXTRA;
            if (:BASEADIC = 'TOTAL') then
                VALORADIC = VRTOTAL;
            MONTO = VALORADIC * PORCADIC / 100;
            END
        if (MONTO <> 0) then
            BEGIN
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTADIC INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERROR (31, 0, :CTADIC, 2);
                CUENTA = CTADIC;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                begin
                EXECUTE PROCEDURE ERROR (31, 0, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'C') then
                BEGIN
                if (DBADIC = 'S') then
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                ELSE
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                if (DBADIC = 'S') then
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                ELSE
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                END
            NROI = NROI + 1;
            END
        END
    if (ERROR > 0) then
        VER = 'S';
    SUSPEND;
    END /* EXISTE LA INTERFAZ */
ELSE
    BEGIN
    EXECUTE PROCEDURE ERROR (31, 0, :PREF, 1);
    ERROR = ERROR + 1;
    VER = 'S';
    SUSPEND;
    END
END

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE CONTADO_MVERDE(
    FECINI DATE,
    FECFIN DATE,
    PREF VARCHAR(4))
RETURNS (
    FECHA DATE,
    PUNTO INTEGER,
    IDC INTEGER,
    ERROR INTEGER,
    VER CHAR(1))
AS
declare variable IDIN INTEGER;
declare variable IDF INTEGER;
declare variable NIT VARCHAR(20);
begin
FECHA = FECINI;
SELECT MAX(INVE_ID) FROM INTERFAZ_VENTAS WHERE TIDO_COD = 31 INTO :IDIN;
WHILE (FECHA <= fecfin) DO
    BEGIN
    /* LAS DE CONTADO */
    FOR SELECT PTVT_ID, TERC_NIT FROM punto_venta ORDER BY PTVT_ID INTO :PUNTO, :NIT
        do
        BEGIN
        EXECUTE PROCEDURE contabil_facturas_contado (FECHA, NIT, PREF, PUNTO, IDIN) returning_values (ERROR,  VER, IDC);
        EXECUTE PROCEDURE contabiliza_pendiente (IDC);
        suspend;
        END
    /* LAS DE CREDITO */
    FOR SELECT FACT_ID, PTVT_ID FROM facturas F WHERE fact_fecha = :fecha and pref_pre = :pref and
        NOT exists (select terc_nit from punto_venta p where terc_nit = f.terc_nit) into : IDF, :PUNTO
        DO
        BEGIN
        EXECUTE PROCEDURE contabil_factura(idf,  IDIN) returning_values (ERROR, VER, IDC);
        EXECUTE PROCEDURE contabiliza_pendiente (IDC);
        suspend;
        END
    FECHA = FECHA + 1;
    END
end

^

SET TERM ; ^

/* 20100602 */
/* descontar retegarantia en facturas AMP */

INSERT INTO CONFIGURACION (CONF_MODULO, CONF_CATEGORIA, CONF_PROPIEDAD, CONF_VALOR, CONF_POSIBLES, CONF_AYUDA) VALUES ('FACTURACION', 'FACTURAS', 'DESCONTAR GARANTIA DE LA LIQUIDACION DE LA FACTURA', 'NO', 'SI,NO', 'SI:Permitie digitar un valor por concepto de retegarantía en la factura que se descuenta del neto a pagar en la liquidación. Depende de activar el cruzar anticipo en la factura');
commit work;

ALTER TABLE FACTURAS ADD FACT_GARANTIA T_MONTO;

ALTER TRIGGER FACTURAS_AU INACTIVE;

UPDATE FACTURAS SET FACT_GARANTIA = 0 WHERE FACT_GARANTIA IS NULL;
COMMIT WORK;

ALTER TRIGGER FACTURAS_AU ACTIVE;

SET TERM ^ ;

CREATE OR ALTER procedure IMPR_FACTURA (
    ID integer)
returns (
    PREF varchar(4),
    NUMERO varchar(6),
    FECHA date,
    VENCE date,
    DIASVENCE integer,
    CONTCRED char(17),
    NIT varchar(20),
    NOMTERCERO varchar(60),
    NOMCLIENTE varchar(60),
    VENDEDOR integer,
    NOMVENDEDOR varchar(60),
    PUNTOVTA integer,
    NOMPUNTOVTA varchar(30),
    CODBODEGA varchar(2),
    NOMBODEGA varchar(30),
    AUTORIZACION varchar(20),
    DESPACHO varchar(255),
    TRANSPORTADOR varchar(60),
    COTIZACION varchar(30),
    PEDIDO varchar(30),
    REMISION varchar(30),
    PACIENTE varchar(20),
    NOMPACIENTE varchar(60),
    COMIPORC numeric(9,2),
    COMIMONTO numeric(18,2),
    SUBTOTAL numeric(18,2),
    INGTERCEROS numeric(18,2),
    INGPROPIOS numeric(18,2),
    DTOPORC numeric(9,2),
    DTOMONTO numeric(18,2),
    ADICIONAL numeric(18,2),
    IVAMONTO numeric(18,2),
    RTEFTEPORC numeric(9,2),
    RTEFTEMONTO numeric(18,2),
    RTEIVAPORC numeric(9,2),
    RTEIVAMONTO numeric(18,2),
    RTEICAPORC numeric(9,2),
    RTEICAMONTO numeric(18,2),
    EXTRA numeric(18,2),
    DTOFPORC numeric(9,2),
    DTOFMONTO numeric(18,2),
    FECHADTO date,
    ANTICIPO numeric(18,2),
    RETGARANTIA numeric(18,2),
    TOTALFAC numeric(18,2),
    TOTALPAGAR numeric(18,2),
    TOTALNETO numeric(18,2),
    OBS blob sub_type 1 segment size 80,
    ITEM integer,
    ARTICULO varchar(15),
    CODBAR varchar(15),
    ARTIDES varchar(60),
    DESCORTA varchar(30),
    CANT numeric(18,4),
    LOTE varchar(15),
    VLOTE date,
    UNIDAD varchar(8),
    CAJAS numeric(18,4),
    FACTOR numeric(18,4),
    LISTAPR integer,
    REFITEM varchar(60),
    BODITEM varchar(2),
    STAND varchar(20),
    PRUNIT numeric(18,2),
    DTOITPORC numeric(9,2),
    DTOITMONTO numeric(18,2),
    PRNETO numeric(18,2),
    PRNETOSINIVA numeric(18,2),
    BASE numeric(18,2),
    PORCBASE numeric(9,2),
    DTOIT1 numeric(9,2),
    DTOIT2 numeric(9,2),
    DTOIT3 numeric(9,2),
    IVAPORC numeric(9,2),
    IVAITMONTO numeric(18,2),
    CONSUMO numeric(18,2),
    SUBTOTIT numeric(18,2),
    TOTAL numeric(18,2),
    PESOTOT numeric(18,2),
    CODIGOCL varchar(20),
    ZONACOD varchar(2),
    ZONANOM varchar(60),
    DV char(1),
    DIRECCION varchar(60),
    CIUDAD varchar(40),
    TELEFONO varchar(40),
    CONTACTO varchar(60),
    FAX varchar(25),
    CEL varchar(25),
    GRUPO varchar(2),
    NOMGRUPO varchar(30),
    SUBGRUPO varchar(3),
    NOMSUBG varchar(30),
    MARCA varchar(3),
    NOMMARCA varchar(30),
    PESO numeric(18,4),
    ANCHO numeric(18,4),
    ALTO numeric(18,4),
    LARGO numeric(18,4),
    SUMA1 numeric(18,2),
    SUMA2 numeric(18,2),
    SUMA3 numeric(18,2),
    IVA1 numeric(18,2),
    IVA2 numeric(18,2),
    IVA3 numeric(18,2),
    SUMAEX numeric(18,2),
    SUMAGR numeric(18,2),
    TOTCONSUMO numeric(18,2),
    DTOIT1M numeric(18,2),
    DTOIT2M numeric(18,2),
    DTOIT3M numeric(18,2),
    TOTCAJAS numeric(18,2),
    TOTBASE numeric(18,2),
    VEHICULO varchar(8),
    RECIBIDO numeric(18,2),
    CAMBIO numeric(18,2),
    HORA time,
    FORMAPAGO1 varchar(30),
    MONTOPAGO1 numeric(18,2),
    FORMAPAGO2 varchar(30),
    MONTOPAGO2 numeric(18,2),
    FORMAPAGO3 varchar(30),
    MONTOPAGO3 numeric(18,2),
    PUNTOS integer,
    PUNTOSACUM integer,
    PUNTOSVENC integer,
    FECPTOS date,
    OBSITEM blob sub_type 1 segment size 80,
    SUCUR varchar(10),
    ALTERNATIVAS numeric(18,4),
    PRINCIPALES numeric(18,4))
AS
DECLARE VARIABLE IMPTOS CHAR(1);
DECLARE VARIABLE TARIFA INTEGER;
declare variable DEVUELTO NUMERIC(18,2);
declare variable ORDENCOD CHAR(8);
declare variable IMPRDEV CHAR(2);
declare variable IMPR CHAR(1);
declare variable ITEMFP INTEGER;
declare variable FORMAP VARCHAR(30);
declare variable MONTOP NUMERIC(18,2);
declare variable ICOINC CHAR(2);
declare variable DTOITM1 NUMERIC(18,2);
declare variable DTOITM2 NUMERIC(18,2);
declare variable DTOITM3 NUMERIC(18,2);
declare variable DTOITE3 CHAR(2);
declare variable SUMDTOIT NUMERIC(18,2);
declare variable AUTORET VARCHAR(10);
declare variable FAUTORET DATE;
declare variable FACTCANT NUMERIC(18,4);
declare variable ANULADO CHAR(1);
declare variable INGTER CHAR(2);
BEGIN
execute procedure lee_configuracion('FACTURACION', 'ARTICULOS', 'IMPOCONSUMO INCLUIDO EN EL PRECIO BASE DE VENTA ANTES DE IVA') returning_values (icoinc);
execute procedure lee_configuracion('FACTURACION', 'FACTURAS', 'COLUMNAS DE DESCUENTO POR ITEM ADICIONALES') returning_values (DTOITE3);
execute procedure lee_configuracion('FACTURACION', 'FACTURAS', 'GRUPO DE MERCANCIA PARA INGRESOS DE TERCEROS') returning_values (INGTER);
SELECT F.PREF_PRE, FACT_NUMERO, FACT_FECHA, FACT_VENCE, F.BODE_COD, BODE_NOM, F.TERC_NIT, FACT_NOMCLIENTE, F.VEND_COD, VEND_NOMBRE, F.PTVT_ID, PTVT_NOM,
    AUTO_NUMERO, FACT_DESPACHO, FACT_TRANSP, FACT_COTIZACI, FACT_PEDIDO, FACT_REMISION, FACT_COMIPORC, FACT_COMIMONTO, FACT_IVAINC, 
    FACT_DTOPOR, FACT_DTOMONTO, FACT_ADICIONAL, FACT_IVAMONTO, FACT_RTFTEPOR, FACT_RTFTEMONTO, FACT_RTIVAPOR, FACT_RTIVAMONTO, FACT_RTICAPOR, FACT_RTICAMONTO, FACT_EXTRA, FACT_DTOFPOR, FACT_DTOFMONTO, FACT_DTOFFECHA, FACT_TOTAL,
    TERC_DIR, TERC_CIU, TERC_TEL, TERC_CONTACTO, TERC_FAX, TERC_DV, TERC_CEL, FACT_DTOIT1, FACT_DTOIT2, FACT_DTOIT3,
    FACT_OBS, VEHI_COD, /*FACT_NROCOPIA,*/ FACT_RECIBIDO, FACT_SUCURSAL, FACT_DETCLI, FACT_DETCLINOM, TERC_NOM, FACT_ANULADO, FACT_ANTICIPO, FACT_GARANTIA
    FROM FACTURAS F, BODEGA B, VENDEDORES V, PUNTO_VENTA P, TERCEROS T
    WHERE F.BODE_COD = B.BODE_COD AND F.VEND_COD = V.VEND_COD AND F.PTVT_ID = P.PTVT_ID AND F.TERC_NIT = T.TERC_NIT AND F.FACT_ID = :ID
    into :PREF, :NUMERO, :FECHA, :VENCE, :CODBODEGA, :NOMBODEGA, :NIT, :NOMTERCERO, :VENDEDOR, :NOMVENDEDOR, :PUNTOVTA, :NOMPUNTOVTA,
    :AUTORIZACION, :DESPACHO, :TRANSPORTADOR, :COTIZACION, :PEDIDO, :REMISION, :COMIPORC, :COMIMONTO, :IMPTOS,
    :DTOPORC, :DTOMONTO, :ADICIONAL, :IVAMONTO, :RTEFTEPORC, :RTEFTEMONTO, :RTEIVAPORC, :RTEIVAMONTO, :RTEICAPORC, :RTEICAMONTO, :EXTRA, :DTOFPORC, :DTOFMONTO, :FECHADTO, :TOTALFAC,
    :DIRECCION, :CIUDAD, :TELEFONO, :CONTACTO, :FAX, :DV, :CEL, :dtoit1m, :dtoit2m, :dtoit3m,
    :OBS, :VEHICULO,/* :NROCOPIA,*/ :RECIBIDO, :SUCUR, :paciente, :nompaciente, :nomcliente, :ANULADO, :anticipo, :retgarantia;

/* ACUMULE LOS PUNTOS, SE HACE ACA POR SER POSTERIOR AL DETALLE */
if (ANULADO = 'N') then
    EXECUTE PROCEDURE acumula_puntos_cliente (31, :id, :nit, :fecha) returning_values (:PUNTOS);
EXECUTE PROCEDURE consulta_puntos_cliente (:id, :nit, :fecha) returning_values (:puntos, :puntosacum, :puntosvenc, :fecptos);
if (DTOIT1M IS NULL) then
    DTOIT1M = 0;
if (DTOIT2M IS NULL) then
    DTOIT2M = 0;
if (DTOIT3M IS NULL) then
    DTOIT3M = 0;
SELECT CLIE_COD, C.ZONA_COD, ZONA_NOM
    FROM CLIENTES C, ZONAS Z
    WHERE TERC_NIT = :NIT AND C.ZONA_COD = Z.ZONA_COD
    INTO :CODIGOCL, :ZONACOD, :ZONANOM;
SELECT CLSU_DIR, CLSU_CIUDAD, CLSU_TEL FROM CLIENTE_SUCURSALES WHERE TERC_NIT = :NIT AND CLCU_COD = :SUCUR
    INTO :DIRECCION, :CIUDAD, :TELEFONO;
DIASVENCE = VENCE - FECHA;
if (DIASVENCE > 0) then
    CONTCRED = 'CREDITO ' || CAST(DIASVENCE AS VARCHAR(3)) || ' DIAS';
ELSE
    CONTCRED = 'CONTADO';
SUBTOTAL = TOTALFAC - EXTRA - IVAMONTO - ADICIONAL + DTOMONTO;
SELECT SUM(FADE_DTOMONTO*FADE_CANT) FROM FACTURAS_DETALLE WHERE FACT_ID = :id INTO :sumdtoit;
if (DTOITE3 = 'SI') then
    BEGIN
    SUBTOTAL = SUBTOTAL + sumdtoit + dtoit1m + dtoit2m + dtoit3m;
    END
if (INGTER <> '') then
    BEGIN
    SELECT SUM(FADE_TOTAL) FROM FACTURAS_DETALLE D, ARTICULO A WHERE A.arti_cod = D.arti_cod AND FACT_ID = :id AND GRUP_COD = :ingter
        INTO :ingterceros;
    INGPROPIOS = SUBTOTAL - INGTERCEROS;
    END
EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'FECHA AUTORETENEDOR NO DESCONTAR RETENCIONES DEL SALDO PERO SI CONTABILIZARLAS') returning_values (AUTORET);
if (AUTORET <> '') then
    FAUTORET = CAST(AUTORET AS DATE);
else
    FAUTORET = '9999/12/31';
if (FECHA > fautoret) then
    TOTALPAGAR = TOTALFAC - RTEIVAMONTO - RTEICAMONTO - ANTICIPO - RETGARANTIA;
ELSE
    TOTALPAGAR = TOTALFAC - RTEFTEMONTO - RTEIVAMONTO - RTEICAMONTO - ANTICIPO - RETGARANTIA;
TOTALNETO = TOTALFAC - ANTICIPO - RETGARANTIA;
if (RECIBIDO <> 0) then
    CAMBIO = RECIBIDO - totalpagar;
ELSE
    CAMBIO = 0;
SUMAEX = 0;
SUMA1 = 0;
SUMA2 = 0;
SUMA3 = 0;
IVA1 = 0;
IVA2 = 0;
IVA3 = 0;
TOTCONSUMO = 0;
MONTOPAGO1 = 0;
PESOTOT = 0;
SELECT MAX(AUDI_HORA) FROM AUDITORIA WHERE TIDO_COD = 31 AND AUDI_IDDOC = :ID AND AUDI_OPER = 'I' INTO :HORA;
/* AHORA LAS FORMAS DE PAGO, BUSQUE EL ABONO DE HOY A LA FACTURA */
ITEMFP = 1;
MONTOPAGO1 = 0;
MONTOPAGO2 = 0;
MONTOPAGO3 = 0;
FOR SELECT FOPA_NOM, RCPA_MONTO FROM RECIBOS_CAJA_PAGO P, FORMAS_PAGO F, RECIBOS_CAJA R, RECIBOS_CAJA_DETALLE D
    WHERE R.RECA_ID = P.RECA_ID AND R.RECA_ID = D.RECA_ID AND P.FOPA_ID = F.FOPA_ID AND RECA_FECHA = :FECHA AND RCDE_TIPODOC = 31 AND RCDE_IDDOC = :ID
    INTO :formap, :MONTOP
    DO
    BEGIN
    if (ITEMFP = 1) then
        BEGIN
        FORMAPAGO1 = FORMAP;
        MONTOPAGO1 = MONTOP;
        END
    if (ITEMFP = 2) then
        BEGIN
        FORMAPAGO2 = FORMAP;
        MONTOPAGO2 = MONTOP;
        END
    if (ITEMFP = 3) then
        BEGIN
        FORMAPAGO3 = FORMAP;
        MONTOPAGO3 = MONTOP;
        END
    ITEMFP = ITEMFP + 1;
    END
EXECUTE PROCEDURE lee_configuracion ('FACTURACION','DOCUMENTOS','ORDENAR ITEMS POR CODIGO DE ARTICULO') returning_values (:ORDENCOD);
EXECUTE PROCEDURE lee_configuracion ('FACTURACION','POS', 'IMPRIMIR DEVOLUCIONES DE ARTICULOS NEGATIVOS') returning_values (:imprdev);
totcajas = 0;
totbase = 0;
if (ORDENCOD = 'SI') then
    BEGIN
    FOR SELECT FADE_ITEM, D.ARTI_COD, FADE_CODBAR, SUBSTR(FADE_DESC,1,60), ARTI_DESCORTA, FADE_CANT, FADE_UNIDAD, FADE_FACTOR, BODE_COD, FADE_LOTE, LIPR_COD, FADE_PRUNIT, FADE_DTOPORC, FADE_DTOMONTO, FADE_IVAPORC, FADE_IVAMONTO, FADE_CONSUMO, FADE_TOTAL, FADE_REFERENCIA,
        GRUP_COD, SUBG_COD, MARC_COD, ARTI_PESO, ARTI_ANCHO, ARTI_ALTO, ARTI_LARGO, TAIV_COD, FADE_DEVUELTO, FADE_OBS, FADE_DTO1, FADE_DTO2, FADE_DTO3, FADE_DTOM1, FADE_DTOM2, FADE_DTOM3, FADE_CAJAS, FADE_BASE, FADE_PORCBASE
        FROM FACTURAS_DETALLE D, ARTICULO A
        WHERE D.ARTI_COD = A.ARTI_COD AND D.FACT_ID = :ID
        ORDER BY D.ARTI_COD
        INTO :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :DESCORTA, :CANT, :UNIDAD, :FACTOR, :BODITEM, :LOTE, :LISTAPR, :PRUNIT, :DTOITPORC, :DTOITMONTO, :IVAPORC, :IVAITMONTO, :CONSUMO, :TOTAL, :refitem,
        :GRUPO, :SUBGRUPO, :MARCA, :PESO, :ANCHO, :ALTO, :LARGO, :TARIFA, :devuelto, :obsitem, :dtoit1, :dtoit2, :dtoit3, :dtoitm1, :dtoitm2, :dtoitm3, :cajas, :base, :porcbase
        DO
          BEGIN
          if (ARTICULO = CODBAR) then
            SELECT FIRST 1 COBA_COD FROM barras_articulo WHERE ARTI_COD = :articulo INTO :CODBAR;
          if (IMPRDEV <> 'SI') then
            BEGIN
            if ((CANT >= 0) AND (DEVUELTO = 0)) then
                IMPR = 'S';
            ELSE
                IMPR = 'N'; /* ES DEVOLUCION */
            END
          ELSE
            IMPR = 'S';
          if (IMPR = 'S') then
            BEGIN
            prneto = PRUNIT - DTOITMONTO - dtoitm1 - dtoitm2 - dtoitm3;
            if (IMPTOS = 'S') then
                if (cant <> 0) then
                    prnetosiniva = PRUNIT - DTOITMONTO - ((IVAITMONTO+CONSUMO) / CANT) - dtoitm1 - dtoitm2 - dtoitm3;
                else
                    prnetosiniva = PRUNIT - DTOITMONTO - dtoitm1 - dtoitm2 - dtoitm3;
            ELSE
                prnetosiniva = PRUNIT - DTOITMONTO - dtoit1m - dtoit2m - dtoit3m;
            if (ICOINC = 'SI') then
                SUBTOTIT = TOTAL - IVAITMONTO;
            else
                SUBTOTIT = TOTAL - IVAITMONTO - CONSUMO;
            TOTCONSUMO = TOTCONSUMO + CONSUMO;
            TOTBASE = TOTBASE + BASE;
            SELECT LOTE_VENCE FROM LOTES WHERE LOTE_NRO = :lote AND ARTI_COD = :ARTICULO AND BODE_COD = :boditem INTO :vlote;
            if ((REFITEM <> '.t') or (REFITEM IS NULL)) then
                BEGIN
                /* NO SUME LOS ENSAMBLES */
                if (IVAPORC = 0) then
                    SUMAEX = SUMAEX + TOTAL;
                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;
                END
            if (ANCHO IS NULL) then
                ANCHO = 0;
            if (ALTO IS NULL) then
                ALTO = 0;
            if (LARGO IS NULL) then
                LARGO = 0;
            if (PESO IS NULL) then
                PESO = 0;
            PESO = (PESO / 1000) * CANT * FACTOR;
            PESOTOT = PESOTOT + PESO;
            totcajas = totcajas + cajas;
            if (substr(ARTICULO,1,2) = '.t') then
                BEGIN
                REFITEM = '';
                TOTAL = 0;
                SUBTOTIT = 0;
                END
            SELECT STAND_COD FROM STANDS WHERE ARTI_COD = :ARTICULO AND STAND_BODEGA = :boditem INTO :stand;
            factcant = NULL;
            SELECT FIRST 1 UNAR_FACCAN FROM unidad_articulo WHERE ARTI_COD = :articulo INTO :factcant;
            if (factcant IS NULL) then
                BEGIN
                ALTERNATIVAS = 0;
                PRINCIPALES = (CANT * FACTOR);
                END
            ELSE
                BEGIN
                ALTERNATIVAS = FLOOR(CANT * factor / factcant);
                PRINCIPALES = (CANT * FACTOR) - (alternativas * factcant);
                END
            SUSPEND;
            END
          END
    END
ELSE
  if (ORDENCOD = 'UNIDAD') then
    BEGIN
    FOR SELECT FADE_ITEM, D.ARTI_COD, FADE_CODBAR, SUBSTR(FADE_DESC,1,60), ARTI_DESCORTA, FADE_CANT, FADE_UNIDAD, FADE_FACTOR, BODE_COD, FADE_LOTE, LIPR_COD, FADE_PRUNIT, FADE_DTOPORC, FADE_DTOMONTO, FADE_IVAPORC, FADE_IVAMONTO, FADE_CONSUMO, FADE_TOTAL, FADE_REFERENCIA,
        GRUP_COD, SUBG_COD, MARC_COD, ARTI_PESO, ARTI_ANCHO, ARTI_ALTO, ARTI_LARGO, TAIV_COD, FADE_DEVUELTO, FADE_OBS, FADE_DTO1, FADE_DTO2, FADE_DTO3, FADE_DTOM1, FADE_DTOM2, FADE_DTOM3, FADE_CAJAS, FADE_BASE, FADE_PORCBASE
        FROM FACTURAS_DETALLE D, ARTICULO A
        WHERE D.ARTI_COD = A.ARTI_COD AND D.FACT_ID = :ID
        ORDER BY D.fade_unidad, D.fade_desc
        INTO :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :DESCORTA, :CANT, :UNIDAD, :FACTOR, :BODITEM, :LOTE, :LISTAPR, :PRUNIT, :DTOITPORC, :DTOITMONTO, :IVAPORC, :IVAITMONTO, :CONSUMO, :TOTAL, :refitem,
        :GRUPO, :SUBGRUPO, :MARCA, :PESO, :ANCHO, :ALTO, :LARGO, :TARIFA, :devuelto, :obsitem, :dtoit1, :dtoit2, :dtoit3, :dtoitm1, :dtoitm2, :dtoitm3, :cajas, :base, :porcbase
        DO
          BEGIN
          if (ARTICULO = CODBAR) then
            SELECT FIRST 1 COBA_COD FROM barras_articulo WHERE ARTI_COD = :articulo INTO :CODBAR;
          if (IMPRDEV <> 'SI') then
            BEGIN
            if ((CANT >= 0) AND (DEVUELTO = 0)) then
                IMPR = 'S';
            ELSE
                IMPR = 'N'; /* ES DEVOLUCION */
            END
          ELSE
            IMPR = 'S';
          if (IMPR = 'S') then
            BEGIN
            prneto = PRUNIT - DTOITMONTO - dtoitm1 - dtoitm2 - dtoitm3;
            if (IMPTOS = 'S') then
                if (cant <> 0) then
                    prnetosiniva = PRUNIT - DTOITMONTO - ((IVAITMONTO+CONSUMO) / CANT) - dtoitm1 - dtoitm2 - dtoitm3;
                else
                    prnetosiniva = PRUNIT - DTOITMONTO - dtoitm1 - dtoitm2 - dtoitm3;
            ELSE
                prnetosiniva = PRUNIT - DTOITMONTO - dtoit1m - dtoit2m - dtoit3m;
            if (ICOINC = 'SI') then
                SUBTOTIT = TOTAL - IVAITMONTO;
            else
                SUBTOTIT = TOTAL - IVAITMONTO - CONSUMO;
            TOTCONSUMO = TOTCONSUMO + CONSUMO;
            TOTBASE = TOTBASE + BASE;
            SELECT LOTE_VENCE FROM LOTES WHERE LOTE_NRO = :lote AND ARTI_COD = :ARTICULO AND BODE_COD = :boditem INTO :vlote;
            if ((REFITEM <> '.t') or (REFITEM IS NULL)) then
                BEGIN
                /* NO SUME LOS ENSAMBLES */
                if (IVAPORC = 0) then
                    SUMAEX = SUMAEX + TOTAL;
                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;
                END
            if (ANCHO IS NULL) then
                ANCHO = 0;
            if (ALTO IS NULL) then
                ALTO = 0;
            if (LARGO IS NULL) then
                LARGO = 0;
            if (PESO IS NULL) then
                PESO = 0;
            PESO = (PESO / 1000) * CANT * FACTOR;
            PESOTOT = PESOTOT + PESO;
            totcajas = totcajas + cajas;
            if (substr(ARTICULO,1,2) = '.t') then
                BEGIN
                REFITEM = '';
                TOTAL = 0;
                SUBTOTIT = 0;
                END
            SELECT STAND_COD FROM STANDS WHERE ARTI_COD = :ARTICULO AND STAND_BODEGA = :boditem INTO :stand;
            factcant = NULL;
            SELECT FIRST 1 UNAR_FACCAN FROM unidad_articulo WHERE ARTI_COD = :articulo INTO :factcant;
            if ((factcant IS NULL) or (factcant = 0)) then
                BEGIN
                ALTERNATIVAS = 0;
                PRINCIPALES = (CANT * FACTOR);
                END
            ELSE
                BEGIN
                ALTERNATIVAS = FLOOR(CANT * factor / factcant);
                PRINCIPALES = (CANT * FACTOR) - (alternativas * factcant);
                END
            SUSPEND;
            END
          END
    END
  ELSE
    BEGIN
    FOR SELECT FADE_ITEM, D.ARTI_COD, FADE_CODBAR, SUBSTR(FADE_DESC,1,60), ARTI_DESCORTA, FADE_CANT, FADE_UNIDAD, FADE_FACTOR, BODE_COD, FADE_LOTE, LIPR_COD, FADE_PRUNIT, FADE_DTOPORC, FADE_DTOMONTO, FADE_IVAPORC, FADE_IVAMONTO, FADE_CONSUMO, FADE_TOTAL, FADE_REFERENCIA,
        GRUP_COD, SUBG_COD, MARC_COD, ARTI_PESO, ARTI_ANCHO, ARTI_ALTO, ARTI_LARGO, TAIV_COD, FADE_DEVUELTO, FADE_OBS, FADE_DTO1, FADE_DTO2, FADE_DTO3, FADE_DTOM1, FADE_DTOM2, FADE_DTOM3, FADE_CAJAS, FADE_BASE, FADE_PORCBASE
        FROM FACTURAS_DETALLE D, ARTICULO A
        WHERE D.ARTI_COD = A.ARTI_COD AND D.FACT_ID = :ID
        ORDER BY FADE_ITEM
        INTO :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :DESCORTA, :CANT, :UNIDAD, :FACTOR, :BODITEM, :LOTE, :LISTAPR, :PRUNIT, :DTOITPORC, :DTOITMONTO, :IVAPORC, :IVAITMONTO, :CONSUMO, :TOTAL, :refitem,
        :GRUPO, :SUBGRUPO, :MARCA, :PESO, :ANCHO, :ALTO, :LARGO, :TARIFA, :devuelto, :obsitem, :dtoit1, :dtoit2, :dtoit3, :dtoitm1, :dtoitm2, :dtoitm3, :cajas, :base, :porcbase
        DO
          BEGIN
          if (IMPRDEV <> 'SI') then
            BEGIN
            if ((CANT >= 0) AND (DEVUELTO = 0)) then
                IMPR = 'S';
            ELSE
                IMPR = 'N'; /* ES DEVOLUCION */
            END
          ELSE
            IMPR = 'S';
          if (IMPR = 'S') then
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :GRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :MARCA INTO NOMMARCA;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :SUBGRUPO AND GRUP_COD = :GRUPO INTO :NOMSUBG;
            prneto = PRUNIT - DTOITMONTO - dtoitm1 - dtoitm2 - dtoitm3;
            if (IMPTOS = 'S') then
                if (cant <> 0) then
                    prnetosiniva = PRUNIT - DTOITMONTO - ((IVAITMONTO+CONSUMO) / CANT) - dtoit1m - dtoit2m - dtoit3m;
                else
                    prnetosiniva = PRUNIT - DTOITMONTO - dtoitm1 - dtoitm2 - dtoitm3;
            ELSE
                prnetosiniva = PRUNIT - DTOITMONTO - dtoitm1 - dtoitm2 - dtoitm3;
            if (ICOINC = 'SI') then
                SUBTOTIT = TOTAL - IVAITMONTO;
            else
                SUBTOTIT = TOTAL - IVAITMONTO - CONSUMO;
            TOTCONSUMO = TOTCONSUMO + CONSUMO;
            TOTBASE = TOTBASE + BASE;
            SELECT LOTE_VENCE FROM LOTES WHERE LOTE_NRO = :lote AND ARTI_COD = :ARTICULO AND BODE_COD = :boditem INTO :vlote;
            if ((REFITEM <> '.t') or (REFITEM IS NULL)) then
                BEGIN
                /* NO SUME LOS ENSAMBLES */
                if (IVAPORC = 0) then
                    SUMAEX = SUMAEX + TOTAL;
                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;
                END
            if (ANCHO IS NULL) then
                ANCHO = 0;
            if (ALTO IS NULL) then
                ALTO = 0;
            if (LARGO IS NULL) then
                LARGO = 0;
            if (PESO IS NULL) then
                PESO = 0;
            PESO = (PESO / 1000)* CANT * FACTOR;
            PESOTOT = PESOTOT + PESO;
            totcajas = totcajas + cajas;
            if (substr(ARTICULO,1,2) = '.t') then
                BEGIN
                REFITEM = '';
                TOTAL = 0;
                SUBTOTIT = 0;
                END
            SELECT STAND_COD FROM STANDS WHERE ARTI_COD = :ARTICULO AND STAND_BODEGA = :boditem INTO :stand;
            factcant = NULL;
            SELECT FIRST 1 UNAR_FACCAN FROM unidad_articulo WHERE ARTI_COD = :articulo INTO :factcant;
            if ((factcant IS NULL) or (factcant = 0)) then
                BEGIN
                ALTERNATIVAS = 0;
                PRINCIPALES = (CANT * FACTOR);
                END
            ELSE
                BEGIN
                ALTERNATIVAS = FLOOR(CANT * factor / factcant);
                PRINCIPALES = (CANT * FACTOR) - (alternativas * factcant);
                END
            SUSPEND;
            END
          END
    END
END
^

SET TERM ; ^

/* 20100602b */
/* si se pide sin detalle por bodega debe usar el minimo del articulo ya que no se puede ubicar un stand */

SET TERM ^ ;

CREATE OR ALTER procedure REP_DISPONIBILIDAD (
    FECHA date,
    ARTINI varchar(20),
    ARTFIN varchar(20),
    GRPINI varchar(3),
    GRPFIN varchar(3),
    ORDEN char(1),
    CEROS char(1),
    DETALLE char(1),
    AGRUPA char(1),
    SUCURSAL integer)
returns (
    CODIGO varchar(15),
    NOMBRE varchar(60),
    UNIDAD varchar(8),
    CODGRUPO varchar(2),
    NOMGRUPO varchar(30),
    CODSUBG varchar(3),
    NOMSUBG varchar(30),
    CODMARC varchar(3),
    NOMMARC varchar(30),
    CODBOD varchar(2),
    NOMBOD varchar(30),
    EXIST numeric(18,4),
    PROMEDIO numeric(18,4),
    SALIDAS numeric(18,4),
    DISPONIBILIDAD integer,
    DIAS integer,
    PROMEDIADO integer,
    COSTO numeric(18,2),
    COSTOPRO numeric(18,2),
    SUGERIDO numeric(18,4),
    FECCOMPRA date)
AS
DECLARE VARIABLE CODINI VARCHAR(20);
DECLARE VARIABLE CODFIN VARCHAR(20);
DECLARE VARIABLE DESINI VARCHAR(20);
DECLARE VARIABLE DESFIN VARCHAR(20);
DECLARE VARIABLE MARINI VARCHAR(20);
DECLARE VARIABLE MARFIN VARCHAR(20);
declare variable DIASC VARCHAR(255);
declare variable DIA_ART VARCHAR(2) CHARACTER SET NONE;
declare variable PORART VARCHAR(8);
declare variable MAXDIA VARCHAR(2);
BEGIN
if (ORDEN = 'C') then
    BEGIN
    CODINI = ARTINI;
    CODFIN = ARTFIN;
    DESINI = '';
    DESFIN = 'zz';
    END
ELSE
    BEGIN
    DESINI = ARTINI;
    DESFIN = ARTFIN;
    CODINI = '';
    CODFIN = 'zz';
    END
if (AGRUPA = 'G') then
    BEGIN
    MARINI = '';
    MARFIN = 'zz';
    END
ELSE
    if (AGRUPA = 'M') then
        BEGIN
        MARINI = GRPINI;
        MARFIN = GRPFIN;
        GRPINI = '';
        GRPFIN = 'zz';
        END
EXECUTE PROCEDURE lee_configuracion ('INVENTARIO', 'EXISTENCIAS', 'PROMEDIAR LAS SALIDAS DEL INVENTARIO CON EL NUMERO DE DIAS ASIGNADO A CADA ARTICULO') returning_values (:DIA_ART);
EXECUTE PROCEDURE lee_configuracion ('INVENTARIO', 'EXISTENCIAS', 'NUMERO DE DIAS PARA PROMEDIO DE SALIDAS POR ARTICULO') returning_values (DIASC);
execute procedure lee_configuracion ('INVENTARIO', 'EXISTENCIAS', 'MAXIMO Y MINIMO POR STAND O POR ARTICULO') returning_values (:porart);
execute procedure lee_configuracion ('INVENTARIO', 'EXISTENCIAS', 'MAXIMO INVENTARIO EN DIAS') returning_values (:maxdia);
if (DETALLE = 'S') then
  BEGIN
  FOR SELECT ARTI_COD, ARTI_DES, ARTI_UNIDAD, ARTI_DIAS, A.GRUP_COD, GRUP_NOM, A.SUBG_COD, A.MARC_COD, BODE_COD, BODE_NOM, ARTI_DIANALIS
      FROM ARTICULO A, GRUPO G, BODEGA B
      WHERE ARTI_COD >= :CODINI AND ARTI_COD <= :CODFIN AND A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :GRPFIN AND ARTI_DES >= :DESINI AND ARTI_DES <= :DESFIN AND
      G.GRUP_COD = A.GRUP_COD AND A.ESAR_COD <> 'I' AND ((SUCU_ID = :SUCURSAL) or (:SUCURSAL = 0)) AND
      (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN)))
      INTO :CODIGO, :NOMBRE, :UNIDAD, :DIAS, :CODGRUPO, :NOMGRUPO, :CODSUBG, :CODMARC, :CODBOD, :NOMBOD, :PROMEDIADO
      DO
        BEGIN
        NOMMARC = '';
        NOMSUBG = '';
        SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO :NOMMARC;
        SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
        EXECUTE PROCEDURE costo_promedio_y_ultimo(:CODIGO, :FECHA) RETURNING_VALUES (:costopro, :COSTO);
        EXECUTE PROCEDURE DISPONIBILIDAD_ARTICULO(CODIGO, FECHA, :CODBOD) returning_values (:DISPONIBILIDAD, :EXIST, :PROMEDIO, :SALIDAS);
        if ((PORART = 'STAND') AND (MAXDIA = 'SI')) then
            BEGIN
            DIAS = 0;
            SELECT STAND_MIN FROM STANDS WHERE ARTI_COD = :CODIGO AND STAND_BODEGA = :codbod INTO :dias;
            END
        /*ESTABLECER CUAL ES EL VALOR DE DIAS PARA PROMEDIO*/
        if (DIA_ART = 'NO') then
          BEGIN
            PROMEDIADO = CAST(DIASC AS INTEGER);
          END
        if ((DISPONIBILIDAD < DIAS) and (PROMEDIO > 0))then
            SUGERIDO = (DIAS * PROMEDIO) - EXIST;
        ELSE
            SUGERIDO = 0;
        SELECT MAX(FACO_FECHA) FROM FACTURAS_COMPRA F, FACTURAS_COMPRAS_DETALLE D
            WHERE F.FACO_ID = D.faco_id AND D.ARTI_COD = :CODIGO AND FACO_FECHA <= :FECHA AND D.bode_cod = :codbod
            INTO :FECCOMPRA;
        if ((PROMEDIO > 0) or (EXIST <> 0) or (CEROS = 'S')) then
            SUSPEND;
        END
  END
ELSE
  BEGIN
  FOR SELECT ARTI_COD, ARTI_DES, ARTI_UNIDAD, ARTI_DIAS, A.GRUP_COD, GRUP_NOM, A.SUBG_COD, A.MARC_COD, ARTI_DIANALIS
      FROM ARTICULO A, GRUPO G
      WHERE ARTI_COD >= :CODINI AND ARTI_COD <= :CODFIN AND A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :GRPFIN AND ARTI_DES >= :DESINI AND ARTI_DES <= :DESFIN AND G.GRUP_COD = A.GRUP_COD AND
      A.ESAR_COD <> 'I' AND (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN)))
      INTO :CODIGO, :NOMBRE, :UNIDAD, :DIAS, :CODGRUPO, :NOMGRUPO, :CODSUBG, :CODMARC, :PROMEDIADO
      DO
        BEGIN
        NOMMARC = '';
        NOMSUBG = '';
        SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO :NOMMARC;
        SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
        EXECUTE PROCEDURE costo_promedio_y_ultimo(:CODIGO, :FECHA) RETURNING_VALUES (:costopro, :COSTO);
        EXECUTE PROCEDURE DISPONIBILIDAD_TOTAL_ARTICULO(CODIGO, FECHA) returning_values (:DISPONIBILIDAD, :EXIST, :PROMEDIO, :SALIDAS);
        /*ESTABLECER CUAL ES EL VALOR DE DIAS PARA PROMEDIO*/
        if (DIA_ART = 'NO') then
          BEGIN
            PROMEDIADO = CAST(DIASC AS INTEGER);
          END
        if ((DISPONIBILIDAD < DIAS) and (PROMEDIO > 0))then
            SUGERIDO = (DIAS * PROMEDIO) - EXIST;
        ELSE
            SUGERIDO = 0;
        SELECT MAX(FACO_FECHA) FROM FACTURAS_COMPRA F, FACTURAS_COMPRAS_DETALLE D
            WHERE F.FACO_ID = D.faco_id AND D.ARTI_COD = :CODIGO AND FACO_FECHA <= :FECHA
            INTO :FECCOMPRA;
        if ((PROMEDIO > 0) or (EXIST <> 0) or (CEROS = 'S')) then
            SUSPEND;
        END
  END
END
^

SET TERM ; ^




/* 20100604 */
/* NO RESPETABA EL RANGO DE BODEGAS AL PEDIR EL DETALLE POR LOTE */
SET TERM ^ ;

CREATE OR ALTER procedure EXISTENCIAS_DESDE_HASTA (
    FECHA date,
    ARTINI varchar(20),
    ARTFIN varchar(20),
    GRPINI varchar(3),
    GRPFIN varchar(3),
    BODINI varchar(2),
    BODFIN varchar(2),
    ORDEN char(1),
    AGRUPA char(1),
    DETALLE char(1),
    RESERVA char(1),
    ENPESO char(1),
    MASIVA char(1),
    SUCURSAL integer)
returns (
    CANT numeric(18,4),
    COSTO numeric(18,2),
    COSTO_LOTE numeric(18,2),
    CODIGO varchar(15),
    NOMBRE varchar(60),
    UNIDAD varchar(8),
    STAND varchar(20),
    CODGRUPO varchar(2),
    NOMGRUPO varchar(30),
    CODSUBG varchar(3),
    NOMSUBG varchar(30),
    CODMARC varchar(3),
    NOMMARC varchar(30),
    CODBOD varchar(2),
    LOTE varchar(15),
    NOMBOD varchar(30),
    COSTOTOT numeric(18,2),
    COSTOIVA numeric(18,2),
    ULTCOSTO numeric(18,2),
    FECHACOSTO date,
    CONSUMO numeric(18,2),
    RESERVADO numeric(18,4),
    ORDENADO numeric(18,4),
    IVA numeric(9,2),
    IVAMONTO numeric(18,2),
    PESOUNIT numeric(18,4),
    PESOTOTAL numeric(18,4),
    PRECIO numeric(18,2),
    CODBAR varchar(20))
AS
declare variable exist char(1);
declare variable codini varchar(20);
declare variable codfin varchar(20);
declare variable desini varchar(20);
declare variable desfin varchar(20);
declare variable ordenc numeric(18,4);
declare variable pedido numeric(18,4);
declare variable ok char(1);
declare variable id integer;
declare variable item integer;
declare variable und varchar(8);
declare variable factor numeric(18,4);
declare variable cant2 numeric(18,4);
declare variable PEDAUTO CHAR(2);
DECLARE VARIABLE LISTA INTEGER;
BEGIN
EXECUTE PROCEDURE lee_configuracion ('FACTURACION','FACTURAS', 'CODIGO DE LA LISTA DE PRECIOS A MOSTRAR EN ARTICULOS') returning_values (:LISTA);
if (ORDEN = 'C') then
    BEGIN
    CODINI = ARTINI;
    CODFIN = ARTFIN;
    DESINI = '';
    DESFIN = 'zz';
    END
ELSE
    BEGIN
    DESINI = ARTINI;
    DESFIN = ARTFIN;
    CODINI = '';
    CODFIN = 'zz';
    END
EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION', 'FACTURAS', 'GENERAR PEDIDO AUTOMATICAMENTE CON LA FACTURA') returning_values (pedauto);
if (DETALLE = 'B') then
  BEGIN
  FOR SELECT ARTI_COD, ARTI_DES, ARTI_UNIDAD, ARTI_EXIST, TAIV_PORC, A.GRUP_COD, A.SUBG_COD, A.MARC_COD, BODE_COD, BODE_NOM, ARTI_CONSUMO, ARTI_PESO/1000
      FROM ARTICULO A, BODEGA B, TARIFA_IVA T
      WHERE ARTI_COD >= :CODINI AND ARTI_COD <= :CODFIN AND ARTI_DES >= :DESINI AND ARTI_DES <= :DESFIN AND ESAR_COD <> 'I' AND BODE_COD >= :BODINI AND
      BODE_COD <= :BODFIN AND ((SUCU_ID = :SUCURSAL) or (:SUCURSAL = 0)) AND A.TAIV_COD = T.TAIV_COD
      INTO :CODIGO, :NOMBRE, :UNIDAD, :EXIST, :IVA, :CODGRUPO, :CODSUBG, :CODMARC, :CODBOD, :NOMBOD, :CONSUMO, :pesounit
      DO
        BEGIN
        STAND = '';
        OK = 'N';
        if (AGRUPA = 'G') then
            BEGIN
            if ((CODGRUPO >= GRPINI) AND (CODGRUPO <= GRPFIN)) then
                OK = 'S';
            end
        ELSE
            if (AGRUPA = 'M') then
                BEGIN
                if ((CODMARC >= GRPINI) AND (CODMARC <= GRPFIN)) then
                    OK = 'S';
                END
        if (OK = 'S') then
            BEGIN
            NOMGRUPO = '';
            NOMMARC = '';
            NOMSUBG = '';
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            CODBAR = NULL;
            SELECT FIRST 1 COBA_COD FROM BARRAS_ARTICULO
                WHERE ARTI_COD = :codigo AND COBA_UNIDAD = :unidad ORDER BY STRLEN(COBA_COD) INTO :codbar;
            if (CODBAR IS NULL) then
                CODBAR = CODIGO;
            if (EXIST <> 'N') then
                BEGIN
                SELECT STAND_COD FROM STANDS WHERE ARTI_COD = :CODIGO AND STAND_BODEGA = :CODBOD INTO :STAND;
                EXECUTE PROCEDURE SALDO_INICIAL_INVENTARIO(CODIGO, FECHA, :CODBOD) returning_values (CANT);
                EXECUTE PROCEDURE costo_promedio_y_ultimo_unidad(CODIGO, FECHA, UNIDAD) returning_values (COSTO, ULTCOSTO);
                SELECT FIRST 1 MVAR_FECHA FROM MOVIMIENTO_ARTICULO WHERE ARTI_COD = :CODIGO AND MVAR_ENTRADA = 'S' AND MVAR_FECHA <= :FECHA
                    ORDER BY ARTI_COD DESC, MVAR_FECHA DESC INTO :FECHACOSTO;
                COSTOTOT = :CANT * :COSTO;
                IVAMONTO = COSTOTOT /100 * IVA;
                COSTOIVA = COSTOTOT;
                if (MASIVA = 'S') then
                    BEGIN
                    COSTOIVA = COSTOTOT + IVAMONTO;
                    COSTO = COSTO * (100 + :IVA) / 100 + :CONSUMO;
                    END
                CONSUMO = CONSUMO * CANT;
                COSTOIVA = COSTOIVA + CONSUMO;
                if (RESERVA = 'S') then
                    BEGIN
                    SELECT SUM(ORID_ENTREGAR)
                        FROM ORDENINVENTARIO_DETALLE OD, ordenes_inventario O
                        WHERE O.ORIN_ID = OD.ORIN_ID AND ARTI_COD = :CODIGO AND ORIN_FECHA <= :FECHA AND ORIN_FECLLEGA >= :FECHA AND ORID_ANULADO = 'N' AND OD.BODE_COD = :CODBOD
                        INTO :ORDENADO;
                    if (ORDENADO IS NULL) then
                        ORDENADO = 0;
                    ORDENC = 0;
                    FOR SELECT O.ORDC_ID, OCDE_ITEM, OCDE_CANT * OCDE_FACTOR
                        FROM ORDENES_COMPRA O, ORDENES_COMPRA_DETALLE OD
                        WHERE O.ORDC_ID = OD.ORDC_ID AND OD.ARTI_COD = :CODIGO AND ORDC_VENCE >= :FECHA AND ORDC_FECHA <= :FECHA AND OCDE_ANULADO = 'N' AND OD.BODE_COD = :CODBOD
                        INTO :ID, :ITEM, :CANT2
                        do
                        BEGIN
                        EXECUTE PROCEDURE FALTANTE(23, 21, ID, ITEM) returning_values (PEDIDO, UND, FACTOR);
                        if (PEDIDO * FACTOR = CANT2) then /* SI NO SE HA FACTURADO MIRE A VER SI SE REMISIONO */
                            EXECUTE PROCEDURE FALTANTE(23, 22, ID, ITEM) returning_values (PEDIDO, UND, FACTOR);
                        if (PEDIDO IS NULL) then
                            PEDIDO = 0;
                        ORDENC = ORDENC + PEDIDO * FACTOR;
                        END
                    ORDENADO = ORDENADO + ORDENC;
                    SELECT SUM(RSDE_LIBERAR)
                        FROM RESERVAS_DETALLE RD, RESERVAS R
                        WHERE R.RESE_ID = RD.RESE_ID AND ARTI_COD = :CODIGO AND RESE_FECHA <= :FECHA AND RESE_VENCE >= :FECHA AND RD.BODE_COD = :CODBOD AND RSDE_ANULADO = 'N'
                        INTO :RESERVADO;
                    if (RESERVADO IS NULL) then
                        RESERVADO = 0;
                    PEDIDO = 0;
                    FOR SELECT P.PEDI_ID, PEDE_ITEM, PEDE_CANT * PEDE_FACTOR
                        FROM PEDIDOS P, PEDIDOS_DETALLE PD
                        WHERE P.PEDI_ID = PD.PEDI_ID AND PD.ARTI_COD = :CODIGO AND PEDI_VENCE >= :FECHA AND PEDI_FECHA <= :FECHA AND PEDE_ANULADO = 'N' AND BODE_COD = :CODBOD
                        INTO :ID, :ITEM, :CANT2
                        do
                        BEGIN
                        EXECUTE PROCEDURE FALTANTE(34, 31, ID, ITEM) returning_values (ORDENC, UND, FACTOR);
                        if ((ORDENC * FACTOR = CANT2) or (PEDAUTO = 'SI')) then /* SI NO SE HA FACTURADO MIRE A VER SI SE REMISIONO */
                            EXECUTE PROCEDURE FALTANTE(34, 32, ID, ITEM) returning_values (ORDENC, UND, FACTOR);
                        if (ORDENC IS NULL) then
                            ORDENC = 0;
                        PEDIDO = PEDIDO + ORDENC * FACTOR;
                        END
                    RESERVADO = RESERVADO + PEDIDO;
                    END
                ELSE
                    BEGIN
                    RESERVADO = 0;
                    ORDENADO = 0;
                    END
                if (LISTA > 0) then
                    SELECT prar_fijo FROM precios_articulo WHERE arti_cod = :CODIGO and lipr_cod = :LISTA INTO :PRECIO;
                if (ENPESO = 'S') then
                    BEGIN
                    if (pesounit IS NULL) then
                        pesounit = 0;
                    if (PESOUNIT <> 0) then
                        BEGIN
                        pesototal = PESOUNIT * cant;
                        SUSPEND;
                        END
                    END
                ELSE
                    SUSPEND;
                END
            END
        END
  END

if (DETALLE = 'L') then
  BEGIN
  FOR SELECT A.ARTI_COD, ARTI_DES, ARTI_UNIDAD, ARTI_EXIST, TAIV_PORC, A.GRUP_COD, A.SUBG_COD, A.MARC_COD, L.lote_nro, L.lote_nro||' - '||L.lote_vence, ARTI_CONSUMO,l.bode_cod, L.lote_saldo,l.lote_costo, ARTI_PESO/1000
      FROM ARTICULO A, LOTES l, TARIFA_IVA T
      WHERE A.ARTI_COD >= '0' AND A.ARTI_COD <= 'zz' AND ARTI_DES >= '' AND ARTI_DES <= 'zz' AND ESAR_COD <> 'I' AND A.TAIV_COD = T.TAIV_COD and a.arti_cod = l.arti_cod
      AND L.BODE_COD >= :BODINI AND L.BODE_COD <= :BODFIN
      INTO :CODIGO, :NOMBRE, :UNIDAD, :EXIST, :IVA, :CODGRUPO, :CODSUBG, :CODMARC, :LOTE, :NOMBOD, :CONSUMO, :codbod, :cant, :costo_lote, :pesounit
      DO
        BEGIN
        OK = 'N';
        if (AGRUPA = 'G') then
            BEGIN
            if ((CODGRUPO >= GRPINI) AND (CODGRUPO <= GRPFIN)) then
                OK = 'S';
            end
        ELSE
            if (AGRUPA = 'M') then
                BEGIN
                if ((CODMARC >= GRPINI) AND (CODMARC <= GRPFIN)) then
                    OK = 'S';
                END
        if (OK = 'S') then
            BEGIN
            NOMGRUPO = '';
            NOMMARC = '';
            NOMSUBG = '';
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            CODBAR = NULL;
            SELECT MAX(COBA_COD) FROM BARRAS_ARTICULO WHERE ARTI_COD = :codigo AND COBA_UNIDAD = :unidad INTO :codbar;
            if (CODBAR IS NULL) then
                CODBAR = CODIGO;

            if (EXIST <> 'N') then
                BEGIN
                EXECUTE PROCEDURE COSTO_PROMEDIO_UNIDAD(CODIGO, FECHA, UNIDAD) returning_values (COSTO);
                EXECUTE PROCEDURE ULTIMO_COSTO(CODIGO, FECHA, UNIDAD) returning_values (ULTCOSTO);
                SELECT FIRST 1 MVAR_FECHA FROM MOVIMIENTO_ARTICULO WHERE ARTI_COD = :CODIGO AND MVAR_ENTRADA = 'S' AND MVAR_FECHA <= :FECHA
                    ORDER BY ARTI_COD DESC, MVAR_FECHA DESC INTO :FECHACOSTO;
                COSTOTOT = :CANT * :COSTO;
                IVAMONTO = COSTOTOT /100 * IVA;
                COSTOIVA = COSTOTOT;
                if (MASIVA = 'S') then
                    BEGIN
                    COSTOIVA = COSTOTOT + IVAMONTO;
                    COSTO = COSTO * (100 + :IVA) / 100 + :CONSUMO;
                    END
                CONSUMO = CONSUMO * CANT;
                COSTOIVA = COSTOIVA + CONSUMO;
                if (RESERVA = 'S') then
                    BEGIN
                    SELECT SUM(ORID_ENTREGAR)
                        FROM ORDENINVENTARIO_DETALLE OD, ordenes_inventario O
                        WHERE O.ORIN_ID = OD.ORIN_ID AND ARTI_COD = :CODIGO AND ORIN_FECHA <= :FECHA AND ORIN_FECLLEGA >= :FECHA AND ORID_ANULADO = 'N'
                        INTO :ORDENADO;
                    if (ORDENADO IS NULL) then
                        ORDENADO = 0;
                    ORDENC = 0;
                    FOR SELECT O.ORDC_ID, OCDE_ITEM, OCDE_CANT * OCDE_FACTOR
                        FROM ORDENES_COMPRA O, ORDENES_COMPRA_DETALLE OD
                        WHERE O.ORDC_ID = OD.ORDC_ID AND OD.ARTI_COD = :CODIGO AND ORDC_VENCE >= :FECHA AND ORDC_FECHA <= :FECHA AND OCDE_ANULADO = 'N'
                        INTO :ID, :ITEM, :CANT2
                        do
                        BEGIN
                        EXECUTE PROCEDURE FALTANTE(23, 21, ID, ITEM) returning_values (PEDIDO, UND, FACTOR);
                        if (PEDIDO * FACTOR = CANT2) then /* SI NO SE HA FACTURADO MIRE A VER SI SE REMISIONO */
                            EXECUTE PROCEDURE FALTANTE(23, 22, ID, ITEM) returning_values (PEDIDO, UND, FACTOR);
                        if (PEDIDO IS NULL) then
                            PEDIDO = 0;
                        ORDENC = ORDENC + PEDIDO * FACTOR;
                        END
                    ORDENADO = ORDENADO + ORDENC;
                    SELECT SUM(RSDE_LIBERAR)
                        FROM RESERVAS_DETALLE RD, RESERVAS R
                        WHERE R.RESE_ID = RD.RESE_ID AND ARTI_COD = :CODIGO AND RESE_FECHA <= :FECHA AND RESE_VENCE >= :FECHA AND RSDE_ANULADO = 'N'
                        INTO :RESERVADO;
                    if (RESERVADO IS NULL) then
                        RESERVADO = 0;
                    PEDIDO = 0;
                    FOR SELECT P.PEDI_ID, PEDE_ITEM, PEDE_CANT * PEDE_FACTOR
                        FROM PEDIDOS P, PEDIDOS_DETALLE PD
                        WHERE P.PEDI_ID = PD.PEDI_ID AND PD.ARTI_COD = :CODIGO AND PEDI_VENCE >= :FECHA AND PEDI_FECHA <= :FECHA AND PEDE_ANULADO = 'N'
                        INTO :ID, :ITEM, :CANT2
                        do
                        BEGIN
                        EXECUTE PROCEDURE FALTANTE(34, 31, ID, ITEM) returning_values (ORDENC, UND, FACTOR);
                        if ((ORDENC * FACTOR = CANT2) or (PEDAUTO = 'SI')) then /* SI NO SE HA FACTURADO MIRE A VER SI SE REMISIONO */
                            EXECUTE PROCEDURE FALTANTE(34, 32, ID, ITEM) returning_values (ORDENC, UND, FACTOR);
                        if (ORDENC IS NULL) then
                            ORDENC = 0;
                        PEDIDO = PEDIDO + ORDENC * FACTOR;
                        END
                    RESERVADO = RESERVADO + PEDIDO;
                    END
                ELSE
                    BEGIN
                    RESERVADO = 0;
                    ORDENADO = 0;
                    END
                if (LISTA > 0) then
                    SELECT prar_fijo FROM precios_articulo WHERE arti_cod = :CODIGO and lipr_cod = :LISTA INTO :PRECIO;
                if (ENPESO = 'S') then
                    BEGIN
                    if (pesounit IS NULL) then
                        pesounit = 0;
                    if (PESOUNIT <> 0) then
                        BEGIN
                        pesototal = PESOUNIT * cant;
                        SUSPEND;
                        END
                    END
                ELSE
                    SUSPEND;
                END
            END
        END
  end
if (DETALLE = 'N') then
  BEGIN
  FOR SELECT ARTI_COD, ARTI_DES, ARTI_UNIDAD, ARTI_EXIST, TAIV_PORC, A.GRUP_COD, A.SUBG_COD, A.MARC_COD, ARTI_CONSUMO, ARTI_PESO/1000
      FROM ARTICULO A, TARIFA_IVA T
      WHERE ARTI_COD >= :CODINI AND ARTI_COD <= :CODFIN AND ARTI_DES >= :DESINI AND ARTI_DES <= :DESFIN AND ESAR_COD <> 'I' AND A.TAIV_COD = T.TAIV_COD
      INTO :CODIGO, :NOMBRE, :UNIDAD, :EXIST, :IVA, :CODGRUPO, :CODSUBG, :CODMARC, :CONSUMO, :pesounit
      DO
        BEGIN
        OK = 'N';
        if (AGRUPA = 'G') then
            BEGIN
            if ((GRPINI = '0') AND (GRPFIN = 'zz')) then
                OK = 'S';
            else
                if ((CODGRUPO >= GRPINI) AND (CODGRUPO <= GRPFIN)) then
                    OK = 'S';
            end
        ELSE
            if (AGRUPA = 'M') then
                BEGIN
                if ((GRPINI = '0') AND (GRPFIN = 'zzz')) then
                    OK = 'S';
                else
                    if ((CODMARC >= GRPINI) AND (CODMARC <= GRPFIN)) then
                        OK = 'S';
                END
        if (OK = 'S') then
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            CODBAR = NULL;
            SELECT MAX(COBA_COD) FROM BARRAS_ARTICULO WHERE ARTI_COD = :codigo AND COBA_UNIDAD = :unidad INTO :codbar;
            if (CODBAR IS NULL) then
                CODBAR = CODIGO;

            if (EXIST <> 'N') then
                BEGIN
                EXECUTE PROCEDURE SALDO_INICIAL_TOTAL_INV(CODIGO, FECHA) returning_values (CANT);
                EXECUTE PROCEDURE COSTO_PROMEDIO_UNIDAD(CODIGO, FECHA, UNIDAD) returning_values (COSTO);
                EXECUTE PROCEDURE ULTIMO_COSTO(CODIGO, FECHA, UNIDAD) returning_values (ULTCOSTO);
                SELECT FIRST 1 MVAR_FECHA FROM MOVIMIENTO_ARTICULO WHERE ARTI_COD = :CODIGO AND MVAR_ENTRADA = 'S' AND MVAR_FECHA <= :FECHA
                    ORDER BY ARTI_COD DESC, MVAR_FECHA DESC INTO :FECHACOSTO;
                COSTOTOT = :CANT * :COSTO;
                IVAMONTO = COSTOTOT /100 * IVA;
                COSTOIVA = COSTOTOT;
                if (MASIVA = 'S') then
                    BEGIN
                    COSTOIVA = COSTOTOT + IVAMONTO;
                    COSTO = COSTO * (100 + :IVA) / 100 + :CONSUMO;
                    END
                CONSUMO = CONSUMO * CANT;
                COSTOIVA = COSTOIVA + CONSUMO;
                if (RESERVA = 'S') then
                    BEGIN
                    SELECT SUM(ORID_ENTREGAR)
                        FROM ORDENINVENTARIO_DETALLE OD, ordenes_inventario O
                        WHERE O.ORIN_ID = OD.ORIN_ID AND ARTI_COD = :CODIGO AND ORIN_FECHA <= :FECHA AND ORIN_FECLLEGA >= :FECHA AND ORID_ANULADO = 'N'
                        INTO :ORDENADO;
                        if (ORDENADO IS NULL) then
                            ORDENADO = 0;
                    ORDENC = 0;
                    FOR SELECT O.ORDC_ID, OCDE_ITEM, OCDE_CANT * OCDE_FACTOR
                        FROM ORDENES_COMPRA O, ORDENES_COMPRA_DETALLE OD
                        WHERE O.ORDC_ID = OD.ORDC_ID AND OD.ARTI_COD = :CODIGO AND ORDC_VENCE >= :FECHA AND ORDC_FECHA <= :FECHA AND OCDE_ANULADO = 'N'
                        INTO :ID, :ITEM, :CANT2
                        do
                        BEGIN
                        EXECUTE PROCEDURE FALTANTE(23, 21, ID, ITEM) returning_values (PEDIDO, UND, FACTOR);
                        if (PEDIDO * FACTOR = CANT2) then /* SI NO SE HA FACTURADO MIRE A VER SI SE REMISIONO */
                            EXECUTE PROCEDURE FALTANTE(23, 22, ID, ITEM) returning_values (PEDIDO, UND, FACTOR);
                        if (PEDIDO IS NULL) then
                            PEDIDO = 0;
                        ORDENC = ORDENC + PEDIDO * FACTOR;
                        END
                    ORDENADO = ORDENADO + ORDENC;
                    SELECT SUM(RSDE_LIBERAR)
                        FROM RESERVAS_DETALLE RD, RESERVAS R
                        WHERE R.RESE_ID = RD.RESE_ID AND ARTI_COD = :CODIGO AND RESE_FECHA <= :FECHA AND RESE_VENCE >= :FECHA AND RSDE_ANULADO = 'N'
                        INTO :RESERVADO;
                    if (RESERVADO IS NULL) then
                        RESERVADO = 0;
                    PEDIDO = 0;
                    FOR SELECT P.PEDI_ID, PEDE_ITEM, PEDE_CANT * PEDE_FACTOR
                        FROM PEDIDOS P, PEDIDOS_DETALLE PD, PUNTO_VENTA PT
                        WHERE P.PEDI_ID = PD.PEDI_ID AND PD.ARTI_COD = :CODIGO AND PT.ptvt_id = P.PTVT_ID AND PEDI_VENCE >= :FECHA AND PEDI_FECHA <= :FECHA AND PEDE_ANULADO = 'N'
                        INTO :ID, :ITEM, :CANT2
                        do
                        BEGIN
                        EXECUTE PROCEDURE FALTANTE(34, 31, ID, ITEM) returning_values (ORDENC, UND, FACTOR);
                        if ((ORDENC * FACTOR = CANT2) or (PEDAUTO = 'SI')) then /* SI NO SE HA FACTURADO MIRE A VER SI SE REMISIONO */
                            EXECUTE PROCEDURE FALTANTE(34, 32, ID, ITEM) returning_values (ORDENC, UND, FACTOR);
                        if (ORDENC IS NULL) then
                            ORDENC = 0;
                        PEDIDO = PEDIDO + ORDENC * FACTOR;
                        END
                    if (PEDIDO IS NULL) then
                        PEDIDO = 0;
                    RESERVADO = RESERVADO + PEDIDO;
                    END
                ELSE
                    BEGIN
                    RESERVADO = 0;
                    ORDENADO = 0;
                    END
                if (LISTA > 0) then
                    SELECT prar_fijo FROM precios_articulo WHERE arti_cod = :CODIGO and lipr_cod = :LISTA INTO :PRECIO;

                if (ENPESO = 'S') then
                    BEGIN
                    if (pesounit IS NULL) then
                        pesounit = 0;
                    if (PESOUNIT <> 0) then
                        BEGIN
                        pesototal = PESOUNIT * cant;
                        SUSPEND;
                        END
                    END
                ELSE
                    SUSPEND;
                END
            END
        END
  END
END
^

SET TERM ; ^

/* 20100607 */
/* RANGO DE FECHAS EN MOVIMIENTO DIARIO */
SET TERM ^ ;

CREATE OR ALTER procedure REP_MOVIMIENTO_DIARIO (
    DESDE varchar(20),
    HASTA varchar(20),
    GRPINI varchar(5),
    GRPFIN varchar(5),
    FECINI date,
    FECFIN date,
    ORDEN char(1),
    AGRUPA char(1),
    SUBEMPRESA integer,
    MONEDA integer)
returns (
    NIT varchar(20),
    NOMBRE varchar(60),
    TELEFONO varchar(40),
    CIUDAD varchar(40),
    CODZONA varchar(2),
    NOMZONA varchar(60),
    CODCOBR integer,
    NOMCOBR varchar(60),
    SUCURSAL varchar(10),
    NOMSUC varchar(60),
    DV char(1),
    CODCIUD char(5),
    NOMCIUD varchar(60),
    INICIAL numeric(18,2),
    TIPODOC varchar(8),
    TIPOREF integer,
    IDDOC integer,
    PREFIJO varchar(4),
    NUMERO varchar(6),
    FECHA date,
    VENCE date,
    DEBITO numeric(18,2),
    CREDITO numeric(18,2),
    SALDO numeric(18,2),
    RTFTE numeric(18,2),
    RTIVA numeric(18,2),
    RTICA numeric(18,2),
    CUPO numeric(18,2))
AS
declare variable NITINI VARCHAR(20);
declare variable NITFIN VARCHAR(20);
declare variable NOMINI VARCHAR(20);
declare variable NOMFIN VARCHAR(20);
declare variable OK CHAR(1);
declare variable DB CHAR(1);
declare variable TRM NUMERIC(18,2);
BEGIN
if (ORDEN = 'C') then
    BEGIN
    NITINI = DESDE;
    NITFIN = HASTA;
    NOMINI = '';
    NOMFIN = 'zz';
    END
ELSE
    BEGIN
    NOMINI = DESDE;
    NOMFIN = HASTA;
    NITINI = '';
    NITFIN = 'zz';
    END
  /* Ubique el NIT */
  FOR select T.TERC_NIT, TERC_NOM, TERC_DV, CLSU_TEL, CLSU_CIUDAD, S.COBR_COD, S.ZONA_COD, T.CIUD_COD, CLIE_CUPO, CLCU_COD, CLSU_NOMBRE
    from terceros T, CLIENTES C, CLIENTE_SUCURSALES S
    where C.TERC_NIT  = T.TERC_NIT AND TERC_CLIE = 'S' AND S.TERC_NIT = C.TERC_NIT AND T.TERC_NIT >= :NITINI AND T.TERC_NIT <= :NITFIN AND
        TERC_NOM >= :NOMINI AND TERC_NOM <= :NOMFIN AND ((NOT EXISTS (SELECT AUTO_NUMERO FROM AUTORIZACIONES WHERE AUTO_NITCONTADO = T.terc_nit))) AND
        EXISTS (SELECT MVCL_ID FROM MOVIMIENTO_CLIENTES WHERE TERC_NIT = T.terc_nit AND MVCL_FECHA >= :fecini and MVCL_FECHA <= :fecfin)
    INTO :NIT, :NOMBRE, :DV, :TELEFONO, :CIUDAD, :CODCOBR, :CODZONA, :CODCIUD, :CUPO, :SUCURSAL, :NOMSUC
    DO  
    BEGIN
    SELECT COBR_NOM FROM COBRADORES WHERE COBR_COD = :CODCOBR INTO :NOMCOBR;
    SELECT ZONA_NOM FROM ZONAS WHERE ZONA_COD = :CODZONA INTO :NOMZONA;
    SELECT CIUD_NOM FROM CIUDADES WHERE CIUD_COD = :CODCIUD INTO :NOMCIUD;
    OK = 'N';
    if (AGRUPA = 'Z') then
        BEGIN
        if (GRPINI = '') then
            BEGIN
            if ((CODZONA IS NULL) or (CODZONA >= :GRPINI AND CODZONA <= :GRPFIN)) then
                OK = 'S';
            END
        ELSE
            if (CODZONA >= :GRPINI AND CODZONA <= :GRPFIN) then
                OK = 'S';
        END
    if (AGRUPA = 'I') then
        BEGIN
        if (GRPINI = '') then
            BEGIN
            if ((CODCIUD IS NULL) or (CODCIUD >= :GRPINI AND CODCIUD <= :GRPFIN)) then
                OK = 'S';
            END
        ELSE
            if (CODCIUD >= :GRPINI AND CODCIUD <= :GRPFIN) then
                OK = 'S';
        END
    if (AGRUPA = 'N') then
        OK = 'S';
        
    if (OK = 'S') then
        BEGIN
        INICIAL = 0;
        FECINI = FECINI - 1;
        FOR SELECT MVCL_TIPOREF, MVCL_IDREF FROM MOVIMIENTO_CLIENTES
          WHERE TERC_NIT = :NIT AND MVCL_SUCURSAL = :SUCURSAL AND MVCL_FECHA <= :FECINI AND
            MVCL_ABONO = 'N' AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA)) AND ((:MONEDA = 0) or (MVCL_TRM <> 1))
          INTO :TIPODOC, :IDDOC
          DO
            BEGIN
            EXECUTE PROCEDURE saldo_doc_cartera(TIPODOC, IDDOC, FECINI, MONEDA) returning_values (SALDO);
            INICIAL = INICIAL + SALDO;
            END
        SALDO = INICIAL;
        FECINI = FECINI + 1;
        FOR select mvcl_tiporef, tido_nomcorto, mvcl_idref, mvcl_prefref, mvcl_numref, mvcl_fecha, mvcl_monto, mvcl_debito, mvcl_rtefte, mvcl_rteiva, mvcl_rteica, mvcl_vence, MVCL_TRM
            from movimiento_clientes m, tipo_documento t
            where m.mvcl_tiporef = t.tido_cod and terc_nit = :NIT and MVCL_SUCURSAL = :SUCURSAL AND
                mvcl_fecha >= :FECINI and mvcl_fecha <= :FECFIN and mvcl_tiporef <> 45 AND MVCL_ABONO = 'N' AND
                ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA)) AND ((:MONEDA = 0) or (MVCL_TRM <> 1))
            order by mvcl_fecha, mvcl_tiporef, mvcl_idref
            into :TIPOREF, :TIPODOC, :IDDOC, :PREFIJO, :NUMERO, :FECHA, :DEBITO, :DB, :RTFTE, :RTIVA, :RTICA, :VENCE, :TRM
            DO
            BEGIN
/*            if ((NOT EXISTS (SELECT D.RECA_ID FROM RECIBOS_CAJA_DETALLE D, RECIBOS_CAJA R
                WHERE R.reca_id = D.reca_id AND D.RCDE_TIPODOC = :TIPOREF AND D.RCDE_IDDOC = :IDDOC AND R.reca_fecha = :FECHA AND R.reca_anulado = 'N')) AND
                (NOT EXISTS (SELECT P.APCL_ID FROM aplicacion_cliente_detalle P, aplicacion_cliente A
                WHERE A.apcl_id = P.apcl_id AND P.acde_tipodoc = :TIPOREF AND P.acde_iddoc = :IDDOC AND A.apcl_fecha = :FECHA AND A.apcl_anulado = 'N'))) then*/
            EXECUTE PROCEDURE saldo_doc_cartera(TIPOREF, IDDOC, FECFIN, MONEDA) returning_values (SALDO);
            if (SALDO <> 0) then
                BEGIN
                if (RTFTE IS NULL) then
                    RTFTE = 0;
                if (RTIVA IS NULL) then
                    RTIVA = 0;
                if (RTICA IS NULL) then
                    RTICA = 0;
                if (DB = 'N') then
                    BEGIN
                    CREDITO = DEBITO;
                    DEBITO = 0;
                    RTFTE = rtfte * -1;
                    RTIVA = rtiva * -1;
                    RTICA = rtica * -1;
                    END
                ELSE
                    CREDITO = 0;
                if ((MONEDA <> 0) AND (TRM <> 0)) then
                    BEGIN
                    SALDO = saldo / TRM;
                    DEBITO = DEBITO / TRM;
                    CREDITO = CREDITO / TRM;
                    RTFTE = RTFTE / TRM;
                    RTIVA = RTIVA / TRM;
                    RTICA = RTICA / TRM;
                    END
                SUSPEND;
                END
            END
        END
    if (AGRUPA = 'C') then
        BEGIN
        FOR SELECT DISTINCT COBR_COD FROM MOVIMIENTO_CLIENTES
            WHERE TERC_NIT = :NIT AND MVCL_SUCURSAL = :SUCURSAL AND MVCL_FECHA <= :FECINI AND
            MVCL_ABONO = 'N' AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA))
            INTO :codcobr
            DO
            BEGIN
            OK = 'N';
            if (GRPINI = '') then
                BEGIN
                if ((CODCOBR IS NULL) or (CODCOBR >= :GRPINI AND CODCOBR <= :GRPFIN)) then
                    OK = 'S';
                END
            ELSE
                if (CODCOBR >= :GRPINI AND CODCOBR <= :GRPFIN) then
                    OK = 'S';
            if (OK = 'S') then
                BEGIN
                SELECT COBR_NOM FROM COBRADORES WHERE COBR_COD = :CODCOBR INTO :NOMCOBR;
                INICIAL = 0;
                FECINI = FECINI - 1;
                FOR SELECT MVCL_TIPOREF, MVCL_IDREF FROM MOVIMIENTO_CLIENTES
                  WHERE TERC_NIT = :NIT AND MVCL_SUCURSAL = :SUCURSAL AND MVCL_FECHA <= :FECINI AND ((:MONEDA = 0) or (MVCL_TRM <> 1)) AND
                  COBR_COD = :CODCOBR AND MVCL_ABONO = 'N' AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA))
                  INTO :TIPODOC, :IDDOC
                  DO
                    BEGIN
                    EXECUTE PROCEDURE saldo_doc_cartera(TIPODOC, IDDOC, FECINI, MONEDA) returning_values (SALDO);
                    INICIAL = INICIAL + SALDO;
                    END
                SALDO = INICIAL;
                FECINI = FECINI + 1;
                FOR select mvcl_tiporef, tido_nomcorto, mvcl_idref, mvcl_prefref, mvcl_numref, mvcl_fecha, mvcl_monto, mvcl_debito, mvcl_rtefte, mvcl_rteiva, mvcl_rteica, mvcl_vence, mvcl_trm
                    from movimiento_clientes m, tipo_documento t
                    where m.mvcl_tiporef = t.tido_cod and terc_nit = :NIT and MVCL_SUCURSAL = :SUCURSAL AND
                    mvcl_fecha >= :FECINI and MVCL_FECHA <= :FECFIN and mvcl_tiporef <> 45 AND ((:MONEDA = 0) or (MVCL_TRM <> 1)) AND
                    COBR_COD = :CODCOBR AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA)) AND MVCL_ABONO = 'N'
                    order by mvcl_fecha, mvcl_tiporef, mvcl_idref
                    into :TIPOREF, :TIPODOC, :IDDOC, :PREFIJO, :NUMERO, :FECHA, :DEBITO, :DB, :RTFTE, :RTIVA, :RTICA, :VENCE, :TRM
                    DO
                    EXECUTE PROCEDURE saldo_doc_cartera(TIPOREF, IDDOC, FECFIN, MONEDA) returning_values (SALDO);
/*                    if ((NOT EXISTS (SELECT D.RECA_ID FROM RECIBOS_CAJA_DETALLE D, RECIBOS_CAJA R
                        WHERE R.reca_id = D.reca_id AND D.RCDE_TIPODOC = :TIPOREF AND D.RCDE_IDDOC = :IDDOC AND R.reca_fecha = :FECHA AND R.reca_anulado = 'N')) AND
                        (NOT EXISTS (SELECT P.APCL_ID FROM aplicacion_cliente_detalle P, aplicacion_cliente A
                        WHERE A.apcl_id = P.apcl_id AND P.acde_tipodoc = :TIPOREF AND P.acde_iddoc = :IDDOC AND A.apcl_fecha = :FECHA AND A.apcl_anulado = 'N'))) then*/
                    if (SALDO <> 0) then
                        BEGIN
                        if (RTFTE IS NULL) then
                            RTFTE = 0;
                        if (RTIVA IS NULL) then
                            RTIVA = 0;
                        if (RTICA IS NULL) then
                            RTICA = 0;
                        if (DB = 'N') then
                            BEGIN
                            CREDITO = DEBITO;
                            DEBITO = 0;
                            RTFTE = rtfte * -1;
                            RTIVA = rtiva * -1;
                            RTICA = rtica * -1;
                            END
                        ELSE
                            CREDITO = 0;
                        if ((MONEDA <> 0) AND (TRM <> 0)) then
                            BEGIN
                            SALDO = saldo / TRM;
                            DEBITO = DEBITO / TRM;
                            CREDITO = CREDITO / TRM;
                            RTFTE = RTFTE / TRM;
                            RTIVA = RTIVA / TRM;
                            RTICA = RTICA / TRM;
                            END
                        SUSPEND;
                        END
                END  /* ok = S */
            END  /* FOR COBRADOR */
        END  /* AGRUPA C */
    END  /* FOR NIT */
END
^

SET TERM ; ^


/* 20100610 */
/* reporte de puntos con tabla acumulada */
SET TERM ^ ;

CREATE OR ALTER procedure REPORTE_PUNTOS (
    NITINI varchar(20),
    NITFIN varchar(20),
    FECHA date,
    CEROS char(1))
returns (
    NIT varchar(60),
    NOMBRE varchar(60),
    DIRECCION varchar(60),
    TELEFONO varchar(40),
    PTACUM integer,
    PTVENCER integer)
AS
declare variable anos integer;
declare variable fecaux date;
declare variable PTAGENCIA varchar(2);
begin
EXECUTE PROCEDURE lee_configuracion ('FACTURACION', 'POS', 'MANEJAR TABLA DE PUNTOS DE CLIENTE ACUMULADOS PARA VARIAS AGENCIAS') returning_values (ptagencia);
FOR SELECT TERC_NIT, TERC_NOM, TERC_DIR, TERC_TEL
    FROM TERCEROS WHERE TERC_NIT >= :NITINI AND TERC_NIT <= :NITFIN
    INTO :NIT, :NOMBRE, :DIRECCION, :TELEFONO
    DO
    BEGIN
    /* los puntos totales */
    ptacum = 0;
    ptvencer = 0;
    if (PTAGENCIA = 'SI') then
        begin
        select first 1 ptca_acumulado, ptca_porvencer from puntos_cliente_acumulado where terc_nit = :NIT and ptca_fecha <= :fecha
            order by ptca_fecha desc into :ptacum, :ptvencer;
        end
    else
        begin
        select first 1 ptcl_saldo + ptcl_db - ptcl_cr from puntos_cliente where ptcl_nit = :NIT and ptcl_fecha <= :fecha
            order by ptcl_fecha desc into :ptacum;
        /* reste los vencidos */
        execute procedure lee_configuracion('FACTURACION', 'FACTURAS', 'VENCIMIENTO DE PUNTOS POR CLIENTE EN AÑOS') returning_values (:anos);
        fecaux = fecha - (anos * 365);
        select first 1 ptcl_saldo + ptcl_db - ptcl_cr from puntos_cliente where ptcl_nit = :nit and ptcl_fecha <= :fecaux
            order by ptcl_fecha desc into :ptvencer;
        end
    if ((CEROS = 'S') or (PTACUM <> 0)) then
        suspend;
    END
end
^

SET TERM ; ^


/* 20100610b */
/* CONFIRMAR CON CLAVE LAS DEVOLUCIONES AL GRABAR */

INSERT INTO CONFIGURACION (CONF_MODULO, CONF_CATEGORIA, CONF_PROPIEDAD, CONF_VALOR, CONF_POSIBLES, CONF_AYUDA) VALUES ('FACTURACION', 'DEVOLUCIONES', 'PREGUNTAR CLAVE DE USUARIO AL GRABAR LAS DEVOLUCIONES', 'NO', 'NO,SI', 'SI: Cada vez que se ingresa a la opción de devoluciones se pregunta nuevamente la clave del usuario para validar su identidad');
commit work;

/* 20100610c */
/* controlar fecha futura en cheques */
INSERT INTO CONFIGURACION (CONF_MODULO, CONF_CATEGORIA, CONF_PROPIEDAD, CONF_VALOR, CONF_POSIBLES, CONF_AYUDA) VALUES ('CAJA', 'EGRESOS', 'MAXIMO NUMERO DE DIAS PARA CHEQUES POSFECHADOS', '90', '', 'Indique el máximo número de días para girar cheques posfechados');
commit work;

/* 20100616 */
/* AL INCORPORAR LOS LOTES EN EL CONTROL SE DAÑA PARA ARTICULOS CON LOTE NULL, TOCO SEPARAR LAS SENTENCIAS */

SET TERM ^ ;

CREATE OR ALTER TRIGGER DEVOLUCIONES_COMPRAS_DET_AI FOR DEVOLUCIONES_COMPRAS_DET
ACTIVE AFTER INSERT POSITION 0
AS
declare variable fec date;
declare variable CONC VARCHAR(60);
declare variable factor numeric(18,4);
declare variable Pref varchar(4);
declare variable Num varchar(6);
declare variable Nit varchar(20);
declare variable ID INTEGER;
declare variable DEVUELTO NUMERIC(18,4);
declare variable CANT NUMERIC(18, 4);
declare variable CANTAUX NUMERIC(18, 4);
declare variable FACT VARCHAR(10);
declare variable SINFACT VARCHAR(2);
declare variable EXIST CHAR(1);
declare variable ITEM INTEGER;
BEGIN
  if ((NEW.dvco_id <> 0) and (new.dvcd_anulado = 'N')) then
    BEGIN
    select dvco_fecha, pref_pre, dvco_numero, terc_nit, dvco_factura from devoluciones_compras where dvco_id = new.dvco_id into :fec, :Pref, :Num, :Nit, Fact;
    execute procedure factor_unidad_cant(new.arti_cod, new.dvcd_unidad) returning_values(factor);
    CONC = 'DEVOLUCION COMPRA No.' || PREF || NUM || ' - FACTURA ' || FACT;
    execute procedure LEE_CONFIGURACION ('COMPRAS','DEVOLUCIONES','PERMITIR DEVOLVER ARTICULOS NO FACTURADOS') returning_values (:SINFACT);
    /* ACTUALICE LO DEVUELTO EN LA FACTURA */
    SELECT DVCO_FACTID FROM DEVOLUCIONES_COMPRAS
      WHERE DVCO_ID = NEW.DVCO_ID INTO :ID;
    if ((ID <> 0) or (SINFACT = 'SI')) then
        BEGIN
        INSERT INTO MOVIMIENTO_ARTICULO
            (ARTI_COD, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF,
            MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM, TERC_NIT)
            VALUES(NEW.ARTI_COD, NEW.BODE_COD, :FEC, 24, NEW.dvco_id,
            :CONC, :factor * new.dvcd_cant, 0, 'N', new.dvcd_lote, :Pref, :Num, NEW.dvcd_item, :Nit);
        if (ID <> 0) THEN
            BEGIN
            CANTAUX = NEW.dvcd_cant * NEW.dvcd_factor;
            select ARTI_EXIST from ARTICULO where ARTI_COD = new.ARTI_COD into :EXIST;
            if (EXIST <> 'L') then
                begin
                FOR SELECT FCDE_ITEM, FCDE_CANT, FCDE_FACTOR, FCDE_DEVUELTO
                    FROM facturas_compras_detalle
                    WHERE FACO_ID = :ID AND ARTI_COD = NEW.ARTI_COD AND BODE_COD = NEW.bode_cod
                    INTO :ITEM, :CANT, :FACTOR, :DEVUELTO
                    DO
                    BEGIN
                    if ((CANT * FACTOR - DEVUELTO) < CANTAUX) then
                        BEGIN
                        UPDATE FACTURAS_COMPRAS_DETALLE
                            SET FCDE_DEVUELTO = (:CANT * :FACTOR - :DEVUELTO)
                            WHERE FACO_ID = :ID AND FCDE_ITEM = :ITEM;
                        CANTAUX = CANTAUX - (CANT * FACTOR - DEVUELTO);
                        END
                    ELSE
                        BEGIN
                        UPDATE FACTURAS_COMPRAS_DETALLE
                            SET FCDE_DEVUELTO = FCDE_DEVUELTO + :CANTAUX
                            WHERE FACO_ID = :ID AND FCDE_ITEM = :ITEM;
                        CANTAUX = 0;
                        END
                    END
                end
            else
                begin
                FOR SELECT FCDE_ITEM, FCDE_CANT, FCDE_FACTOR, FCDE_DEVUELTO
                    FROM facturas_compras_detalle
                    WHERE FACO_ID = :ID AND ARTI_COD = NEW.ARTI_COD AND BODE_COD = NEW.bode_cod AND FCDE_LOTE = NEW.dvcd_lote
                    INTO :ITEM, :CANT, :FACTOR, :DEVUELTO
                    DO
                    BEGIN
                    if ((CANT * FACTOR - DEVUELTO) < CANTAUX) then
                        BEGIN
                        UPDATE FACTURAS_COMPRAS_DETALLE
                            SET FCDE_DEVUELTO = (:CANT * :FACTOR - :DEVUELTO)
                            WHERE FACO_ID = :ID AND FCDE_ITEM = :ITEM;
                        CANTAUX = CANTAUX - (CANT * FACTOR - DEVUELTO);
                        END
                      ELSE
                        BEGIN
                        UPDATE FACTURAS_COMPRAS_DETALLE
                            SET FCDE_DEVUELTO = FCDE_DEVUELTO + :CANTAUX
                            WHERE FACO_ID = :ID AND FCDE_ITEM = :ITEM;
                        CANTAUX = 0;
                        END
                    END
                end

            if (CANTAUX > 0) then
                EXCEPTION DEVOLUCION_MAYOR 'Esta devolviendo una cantidad mayor a la facturada del articulo ' || new.arti_cod || ' ' || cantaux || '-' || EXIST;
            END
        END
    END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER DEVOLUCIONES_COMPRAS_DET_AU FOR DEVOLUCIONES_COMPRAS_DET
ACTIVE AFTER UPDATE POSITION 0
AS
declare variable fec date;
declare variable CONC VARCHAR(60);
declare variable Pref varchar(4);
declare variable Num varchar(6);
declare variable Nit varchar(20);
declare variable CANT NUMERIC(18, 4);
declare variable CANTAUX NUMERIC(18,4);
declare variable factor numeric(18,4);
declare variable DEVUELTO NUMERIC(18,4);
declare variable ID integer;
declare variable FACT VARCHAR(10);
declare variable SINFACT VARCHAR(2);
declare variable EXIST CHAR(1);
declare variable ITEM INTEGER;
BEGIN
/* Anule el anterior */
if ((OLD.DVCO_ID <> 0) AND (OLD.dvcd_anulado = 'N')) then
    BEGIN
    DELETE FROM MOVIMIENTO_ARTICULO WHERE (mvar_tipodoc = 24) and (mvar_idref = new.dvco_id) and (mvar_item = old.dvcd_item);
    /* DESHAGA LO DEVUELTO EN LA FACTURA */
    SELECT DVCO_FACTID FROM DEVOLUCIONES_COMPRAS
        WHERE DVCO_ID = OLD.DVCO_ID INTO :ID;
    if (ID <> 0) then
        BEGIN
        CANTAUX = OLD.dvcd_cant * OLD.dvcd_factor;
        select ARTI_EXIST from ARTICULO where ARTI_COD = OLD.ARTI_COD into :EXIST;
        if (EXIST <> 'L') then
            begin
            FOR SELECT FCDE_ITEM, FCDE_CANT, FCDE_FACTOR, FCDE_DEVUELTO
                FROM FACTURAS_COMPRAS_DETALLE
                WHERE FACO_ID = :ID AND ARTI_COD = OLD.ARTI_COD AND BODE_COD = OLD.bode_cod
                INTO :ITEM, :CANT, :FACTOR, :DEVUELTO
                DO
                BEGIN
                if (CANTAUX > (CANT * FACTOR - DEVUELTO)) then
                    BEGIN
                    UPDATE FACTURAS_COMPRAS_DETALLE
                        SET FCDE_DEVUELTO = 0
                        WHERE FACO_ID = :ID AND FCDE_ITEM = :ITEM;
                    CANTAUX = CANTAUX - (CANT * FACTOR - DEVUELTO);
                    END
                ELSE
                    BEGIN
                    UPDATE FACTURAS_COMPRAS_DETALLE
                        SET FCDE_DEVUELTO = FCDE_DEVUELTO - :CANTAUX
                        WHERE FACO_ID = :ID AND FCDE_ITEM = :ITEM;
                    CANTAUX = 0;
                    END
                END
            end
        else
            begin
            FOR SELECT FCDE_ITEM, FCDE_CANT, FCDE_FACTOR, FCDE_DEVUELTO
                FROM FACTURAS_COMPRAS_DETALLE
                WHERE FACO_ID = :ID AND ARTI_COD = OLD.ARTI_COD AND BODE_COD = OLD.bode_cod and FCDE_LOTE = OLD.dvcd_lote
                INTO :ITEM, :CANT, :FACTOR, :DEVUELTO
                DO
                BEGIN
                if (CANTAUX > (CANT * FACTOR - DEVUELTO)) then
                    BEGIN
                    UPDATE FACTURAS_COMPRAS_DETALLE
                        SET FCDE_DEVUELTO = 0
                        WHERE FACO_ID = :ID AND FCDE_ITEM = :ITEM;
                    CANTAUX = CANTAUX - (CANT * FACTOR - DEVUELTO);
                    END
                ELSE
                    BEGIN
                    UPDATE FACTURAS_COMPRAS_DETALLE
                        SET FCDE_DEVUELTO = FCDE_DEVUELTO - :CANTAUX
                        WHERE FACO_ID = :ID AND FCDE_ITEM = :ITEM;
                    CANTAUX = 0;
                    END
                END
            end
        END
    END
if ((NEW.DVCO_ID <> 0) AND (NEW.dvcd_anulado = 'N')) then
    BEGIN
    /* Registre el nuevo */
    select dvco_fecha, pref_pre, dvco_numero, terc_nit, dvco_factura from devoluciones_compras where dvco_id = new.dvco_id into :fec, :Pref, :Num, :Nit, Fact;
    execute procedure factor_unidad_cant(new.arti_cod, new.dvcd_unidad) returning_values(factor);
    CONC = 'DEVOLUCION COMPRA No.' || PREF || NUM || ' - FACTURA ' || FACT;
    execute procedure LEE_CONFIGURACION ('COMPRAS','DEVOLUCIONES','PERMITIR DEVOLVER ARTICULOS NO FACTURADOS') returning_values (:SINFACT);
    /* ACTUALICE LO DEVUELTO EN LA FACTURA */
    SELECT DVCO_FACTID FROM DEVOLUCIONES_COMPRAS
        WHERE DVCO_ID = NEW.DVCO_ID INTO :ID;
    if ((ID <> 0) or (SINFACT = 'SI')) then
        BEGIN
        INSERT INTO MOVIMIENTO_ARTICULO
            (ARTI_COD, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM, TERC_NIT)
            VALUES(NEW.ARTI_COD, NEW.BODE_COD, :FEC, 24, NEW.dvco_id,
            :CONC, :factor * new.dvcd_cant, 0, 'N', new.dvcd_lote, :Pref, :Num, NEW.dvcd_item, :Nit);
        if (ID <> 0) THEN
            BEGIN
            CANTAUX = NEW.dvcd_cant * NEW.dvcd_factor;
            select ARTI_EXIST from ARTICULO where ARTI_COD = new.ARTI_COD into :EXIST;
            if (EXIST <> 'L') then
                begin
                FOR SELECT FCDE_ITEM, FCDE_CANT, FCDE_FACTOR, FCDE_DEVUELTO
                    FROM facturas_compras_detalle
                    WHERE FACO_ID = :ID AND ARTI_COD = NEW.ARTI_COD AND BODE_COD = NEW.bode_cod
                    INTO :ITEM, :CANT, :FACTOR, :DEVUELTO
                    DO
                    BEGIN
                    if ((CANT * FACTOR - DEVUELTO) < CANTAUX) then
                        BEGIN
                        UPDATE FACTURAS_COMPRAS_DETALLE
                            SET FCDE_DEVUELTO = (:CANT * :FACTOR - :DEVUELTO)
                            WHERE FACO_ID = :ID AND FCDE_ITEM = :ITEM;
                        CANTAUX = CANTAUX - (CANT * FACTOR - DEVUELTO);
                        END
                    ELSE
                        BEGIN
                        UPDATE FACTURAS_COMPRAS_DETALLE
                            SET FCDE_DEVUELTO = FCDE_DEVUELTO + :CANTAUX
                            WHERE FACO_ID = :ID AND FCDE_ITEM = :ITEM;
                        CANTAUX = 0;
                        END
                    END
                end
            else
                begin
                FOR SELECT FCDE_ITEM, FCDE_CANT, FCDE_FACTOR, FCDE_DEVUELTO
                    FROM facturas_compras_detalle
                    WHERE FACO_ID = :ID AND ARTI_COD = NEW.ARTI_COD AND BODE_COD = NEW.bode_cod AND FCDE_LOTE = NEW.dvcd_lote
                    INTO :ITEM, :CANT, :FACTOR, :DEVUELTO
                    DO
                    BEGIN
                    if ((CANT * FACTOR - DEVUELTO) < CANTAUX) then
                        BEGIN
                        UPDATE FACTURAS_COMPRAS_DETALLE
                            SET FCDE_DEVUELTO = (:CANT * :FACTOR - :DEVUELTO)
                            WHERE FACO_ID = :ID AND FCDE_ITEM = :ITEM;
                        CANTAUX = CANTAUX - (CANT * FACTOR - DEVUELTO);
                        END
                      ELSE
                        BEGIN
                        UPDATE FACTURAS_COMPRAS_DETALLE
                            SET FCDE_DEVUELTO = FCDE_DEVUELTO + :CANTAUX
                            WHERE FACO_ID = :ID AND FCDE_ITEM = :ITEM;
                        CANTAUX = 0;
                        END
                    END
                end

            if (CANTAUX > 0) then
                EXCEPTION DEVOLUCION_MAYOR 'Esta devolviendo una cantidad mayor a la facturada del articulo ' || new.arti_cod;
            END
        END
    end
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER DEVOLUCIONES_COMPRAS_DET_AD FOR DEVOLUCIONES_COMPRAS_DET
ACTIVE AFTER DELETE POSITION 0
AS
declare variable ID INTEGER;
declare variable CANTAUX NUMERIC(18, 4);
declare variable CANT NUMERIC(18, 4);
declare variable FACTOR NUMERIC(18, 4);
declare variable DEVUELTO NUMERIC(18, 4);
declare variable EXIST CHAR(1);
declare variable ITEM INTEGER;
begin
if ((OLD.dvco_id <> 0) AND (OLD.dvcd_anulado = 'N')) then
    BEGIN
    delete from movimiento_articulo
      where (mvar_tipodoc = 24) and (mvar_idref = old.dvco_id) and (mvar_item = old.dvcd_item);
  
    /* DESHAGA LO DEVUELTO EN LA FACTURA */
    SELECT DVCO_FACTID FROM DEVOLUCIONES_COMPRAS
        WHERE DVCO_ID = OLD.DVCO_ID INTO :ID;
    if (ID <> 0) then
        BEGIN
        CANTAUX = OLD.dvcd_cant * OLD.dvcd_factor;
        select ARTI_EXIST from ARTICULO where ARTI_COD = OLD.ARTI_COD into :EXIST;
        if (EXIST <> 'L') then
            begin
            FOR SELECT FCDE_ITEM, FCDE_CANT, FCDE_FACTOR, FCDE_DEVUELTO
                FROM FACTURAS_COMPRAS_DETALLE
                WHERE FACO_ID = :ID AND ARTI_COD = OLD.ARTI_COD AND BODE_COD = OLD.bode_cod
                INTO :ITEM, :CANT, :FACTOR, :DEVUELTO
                DO
                BEGIN
                if (CANTAUX > (CANT * FACTOR - DEVUELTO)) then
                    BEGIN
                    UPDATE FACTURAS_COMPRAS_DETALLE
                        SET FCDE_DEVUELTO = 0
                        WHERE FACO_ID = :ID AND FCDE_ITEM = :ITEM;
                    CANTAUX = CANTAUX - (CANT * FACTOR - DEVUELTO);
                    END
                ELSE
                    BEGIN
                    UPDATE FACTURAS_COMPRAS_DETALLE
                        SET FCDE_DEVUELTO = FCDE_DEVUELTO - :CANTAUX
                        WHERE FACO_ID = :ID AND FCDE_ITEM = :ITEM;
                    CANTAUX = 0;
                    END
                END
            end
        else
            begin
            FOR SELECT FCDE_ITEM, FCDE_CANT, FCDE_FACTOR, FCDE_DEVUELTO
                FROM FACTURAS_COMPRAS_DETALLE
                WHERE FACO_ID = :ID AND ARTI_COD = OLD.ARTI_COD AND BODE_COD = OLD.bode_cod and FCDE_LOTE = OLD.dvcd_lote
                INTO :ITEM, :CANT, :FACTOR, :DEVUELTO
                DO
                BEGIN
                if (CANTAUX > (CANT * FACTOR - DEVUELTO)) then
                    BEGIN
                    UPDATE FACTURAS_COMPRAS_DETALLE
                        SET FCDE_DEVUELTO = 0
                        WHERE FACO_ID = :ID AND FCDE_ITEM = :ITEM;
                    CANTAUX = CANTAUX - (CANT * FACTOR - DEVUELTO);
                    END
                ELSE
                    BEGIN
                    UPDATE FACTURAS_COMPRAS_DETALLE
                        SET FCDE_DEVUELTO = FCDE_DEVUELTO - :CANTAUX
                        WHERE FACO_ID = :ID AND FCDE_ITEM = :ITEM;
                    CANTAUX = 0;
                    END
                END
            end
        END
    END
END
^

SET TERM ; ^


/* 20100621B */
/* subgrupo en busqueda de articulos */

SET TERM ^ ;

CREATE OR ALTER procedure CONSULTA_ARTICULOS_VTAS (
    FECHA date,
    INACTIVOS char(1),
    MODULO varchar(20),
    BUSCAR varchar(100),
    CUALQUIERA char(1),
    COLUMNA integer,
    BUSCAR2 varchar(30),
    BUSCAR3 varchar(30),
    BUSCAR4 varchar(30),
    BUSCAR5 varchar(30))
returns (
    CODIGO varchar(20),
    DES varchar(60),
    REF varchar(20),
    GRUPO varchar(30),
    SUBGR VARCHAR(3),
    MARCA varchar(30),
    UNIDAD varchar(8),
    ESTADO varchar(30),
    IVA numeric(9,2),
    EXISTEN numeric(18,2),
    PRECIO numeric(18,2),
    CLASE char(1))
AS
DECLARE VARIABLE LISTA INTEGER;
DECLARE VARIABLE EXIST CHAR(2);
DECLARE VARIABLE SINEXIST CHAR(2);
declare variable DIG INTEGER;
declare variable OK CHAR(1);
BEGIN
EXISTEN = 0;
EXECUTE PROCEDURE lee_configuracion ('FACTURACION','ARTICULOS', 'VER EXISTENCIA EN CONSULTA ARTICULOS') returning_values (:EXIST);
SELECT FIRST 1 LIPR_COD FROM LISTA_PRECIOS L, USUARIO U WHERE USER_COD = USER AND ((L.SUCU_ID = U.sucu_id) or (L.SUCU_ID = 0) or (U.SUCU_ID = 0)) AND LIPR_PREDET = 'S'
    INTO :LISTA;
if (modulo = 'FACTURACION') then
  EXECUTE PROCEDURE lee_configuracion ('FACTURACION','ARTICULOS','VER ARTICULOS SIN EXISTENCIA EN CONSULTA DE ARTICULOS') returning_values (:sinexist);
else
  sinexist = 'SI';
EXECUTE PROCEDURE LEE_CONFIGURACION ('FACTURACION', 'ARTICULOS', 'REDONDEO AL MULTIPLO DE DIEZ EN PRECIOS') returning_values (DIG);
if (LISTA > 0) then
    BEGIN
    if ((BUSCAR IS NOT NULL) AND (BUSCAR <> '')) then
        FOR select a.arti_cod, arti_des, grup_cod, subg_cod, arti_unidad, esar_cod, taiv_porc, marc_cod,arti_clase
            from articulo a, tarifa_iva t
            where a.taiv_cod = t.taiv_cod and substring(a.arti_cod from 1 FOR 2) <> '.t' and
            ((:INACTIVOS = 'S') or (esar_cod = 'A') or ((:INACTIVOS = 'C') AND (esar_cod = 'N'))) AND
            ((:COLUMNA <> 0) or (upper(A.ARTI_COD) like upper(:buscar))) AND
            ((:columna <> 1) or (upper(A.ARTI_DES) like upper(:buscar))) AND
            ((:columna <> 2) or (upper(A.ARTI_OBS) like upper(:buscar)) or (upper(A.ARTI_DES) like upper(:buscar)))
            INTO :CODIGO, :DES, :GRUPO, :SUBGR, :UNIDAD, :ESTADO, :IVA, :MARCA, :CLASE
            do
            begin
            ref = '';
            select first 1 coba_cod from barras_articulo where arti_cod = :codigo into :ref;
            if ((COLUMNA <> 3) or (upper(REF) like upper(:buscar))) then
                BEGIN
                OK = 'N';
                PRECIO = 0;
                SELECT prar_fijo PRECIO FROM precios_articulo WHERE arti_cod = :CODIGO and lipr_cod = :LISTA INTO :PRECIO;
                EXECUTE PROCEDURE redondee(PRECIO, DIG) returning_values (PRECIO);
                if (EXIST = 'SI') then
                    BEGIN
                    EXECUTE PROCEDURE saldo_total_inventario (:CODIGO, :FECHA) returning_values (:EXISTEN);
                    if ((SINEXIST = 'SI')  or (existen <> 0)) then
                        OK = 'S';
                    END
                ELSE
                    OK = 'S';
                if (ok = 'S') then
                    if (CUALQUIERA = 'S') then
                        SUSPEND;
                    ELSE
                        if (BUSCAR2 <> '') then
                            BEGIN
                            IF (NOT EXISTS (SELECT ARTI_COD FROM ARTICULO WHERE ARTI_COD = :CODIGO AND ((upper(ARTI_DES) like upper(:BUSCAR2)) or (UPPER(ARTI_OBS) LIKE UPPER(:BUSCAR2))))) THEN
                                OK = 'N';
                            if ((OK = 'S') AND (BUSCAR3 <> '')) then
                                IF (NOT EXISTS (SELECT ARTI_COD FROM ARTICULO WHERE ARTI_COD = :CODIGO AND ((upper(ARTI_DES) like upper(:BUSCAR3)) or (UPPER(ARTI_OBS) LIKE UPPER(:BUSCAR3))))) THEN
                                    OK = 'N';
                            if ((OK = 'S') AND (BUSCAR4 <> '')) then
                                IF (NOT EXISTS (SELECT ARTI_COD FROM ARTICULO WHERE ARTI_COD = :CODIGO AND ((upper(ARTI_DES) like upper(:BUSCAR4)) or (UPPER(ARTI_OBS) LIKE UPPER(:BUSCAR4))))) THEN
                                    OK = 'N';
                            if ((OK = 'S') AND (BUSCAR4 <> '')) then
                                IF (NOT EXISTS (SELECT ARTI_COD FROM ARTICULO WHERE ARTI_COD = :CODIGO AND ((upper(ARTI_DES) like upper(:BUSCAR4)) or (UPPER(ARTI_OBS) LIKE UPPER(:BUSCAR4))))) THEN
                                    OK = 'N';
                            if ((OK = 'S') AND (BUSCAR5 <> '')) then
                                IF (NOT EXISTS (SELECT ARTI_COD FROM ARTICULO WHERE ARTI_COD = :CODIGO AND ((upper(ARTI_DES) like upper(:BUSCAR5)) or (UPPER(ARTI_OBS) LIKE UPPER(:BUSCAR5))))) THEN
                                    OK = 'N';
                            if (OK = 'S') then
                                SUSPEND;
                            END
                        ELSE
                            SUSPEND;
                END
            end
    ELSE
        FOR select a.arti_cod, arti_des, grup_cod, subg_cod, arti_unidad, esar_cod, taiv_porc, marc_cod,arti_clase
            from articulo a, tarifa_iva t
            where a.taiv_cod = t.taiv_cod and substring(a.arti_cod from 1 FOR 2) <> '.t' and
            ((:INACTIVOS = 'S') or (esar_cod = 'A') or ((:INACTIVOS = 'C') AND (esar_cod = 'N')))
            INTO :CODIGO, :DES, :GRUPO, :SUBGR, :UNIDAD, :ESTADO, :IVA, :MARCA, :CLASE
            do
            begin
            ref = '';
            select first 1 coba_cod from barras_articulo where arti_cod = :codigo into :ref;
            PRECIO = 0;
            SELECT prar_fijo PRECIO FROM precios_articulo WHERE arti_cod = :CODIGO and lipr_cod = :LISTA INTO :PRECIO;
            EXECUTE PROCEDURE redondee(PRECIO, DIG) returning_values (PRECIO);
            if (EXIST = 'SI') then
                BEGIN
                EXECUTE PROCEDURE saldo_total_inventario (:CODIGO, :FECHA) returning_values (:EXISTEN);
                if ((SINEXIST = 'SI')  or (existen <> 0)) then
                    SUSPEND;
                END
            ELSE
                SUSPEND;
            END
    END
ELSE
    if ((BUSCAR IS NOT NULL) AND (BUSCAR <> '')) then
        FOR select arti_cod, arti_des, grup_cod, subg_cod, arti_unidad, esar_cod, taiv_porc, arti_precio, marc_cod, arti_clase
            from articulo a, tarifa_iva t
            where a.taiv_cod = t.taiv_cod and substring(a.arti_cod from 1 FOR 2) <> '.t' and
            ((:INACTIVOS = 'S') or (esar_cod = 'A') or ((:INACTIVOS = 'C') AND (esar_cod = 'N'))) AND
            ((:COLUMNA <> 0) or (upper(A.ARTI_COD) like upper(:buscar))) AND
            ((:columna <> 1) or (upper(A.ARTI_DES) like upper(:buscar))) AND
            ((:columna <> 2) or (upper(A.ARTI_OBS) like upper(:buscar)) or (upper(A.ARTI_DES) like upper(:buscar)))
            INTO :CODIGO, :DES, :GRUPO, :SUBGR, :UNIDAD, :ESTADO, :IVA, :PRECIO, :MARCA, :CLASE
            do
            begin
            ref = '';
            select first 1 coba_cod from barras_articulo where arti_cod = :codigo into :ref;
            if ((COLUMNA <> 3) or (upper(REF) like upper(:buscar))) then
                BEGIN
                if (EXIST = 'SI') then
                    BEGIN
                    EXECUTE PROCEDURE saldo_total_inventario (:CODIGO, :FECHA) returning_values (:EXISTEN);
                    if ((SINEXIST = 'SI') or (existen <> 0)) then
                        OK = 'S';
                    END
                ELSE
                    OK = 'S';
                if (ok = 'S') then
                    if (CUALQUIERA = 'S') then
                        SUSPEND;
                    ELSE
                        if (BUSCAR2 <> '') then
                            BEGIN
                            IF (NOT EXISTS (SELECT ARTI_COD FROM ARTICULO WHERE ARTI_COD = :CODIGO AND ((upper(ARTI_DES) like upper(:BUSCAR2)) or (UPPER(ARTI_OBS) LIKE UPPER(:BUSCAR2))))) THEN
                                OK = 'N';
                            if ((OK = 'S') AND (BUSCAR3 <> '')) then
                                IF (NOT EXISTS (SELECT ARTI_COD FROM ARTICULO WHERE ARTI_COD = :CODIGO AND ((upper(ARTI_DES) like upper(:BUSCAR3)) or (UPPER(ARTI_OBS) LIKE UPPER(:BUSCAR3))))) THEN
                                    OK = 'N';
                            if ((OK = 'S') AND (BUSCAR4 <> '')) then
                                IF (NOT EXISTS (SELECT ARTI_COD FROM ARTICULO WHERE ARTI_COD = :CODIGO AND ((upper(ARTI_DES) like upper(:BUSCAR4)) or (UPPER(ARTI_OBS) LIKE UPPER(:BUSCAR4))))) THEN
                                    OK = 'N';
                            if ((OK = 'S') AND (BUSCAR4 <> '')) then
                                IF (NOT EXISTS (SELECT ARTI_COD FROM ARTICULO WHERE ARTI_COD = :CODIGO AND ((upper(ARTI_DES) like upper(:BUSCAR4)) or (UPPER(ARTI_OBS) LIKE UPPER(:BUSCAR4))))) THEN
                                    OK = 'N';
                            if ((OK = 'S') AND (BUSCAR5 <> '')) then
                                IF (NOT EXISTS (SELECT ARTI_COD FROM ARTICULO WHERE ARTI_COD = :CODIGO AND ((upper(ARTI_DES) like upper(:BUSCAR5)) or (UPPER(ARTI_OBS) LIKE UPPER(:BUSCAR5))))) THEN
                                    OK = 'N';
                            if (OK = 'S') then
                                SUSPEND;
                            END
                        ELSE
                            SUSPEND;
                END
            end
    ELSE
        FOR select arti_cod, arti_des, grup_cod, subg_cod, arti_unidad, esar_cod, taiv_porc, arti_precio, marc_cod, arti_clase
            from articulo a, tarifa_iva t
            where a.taiv_cod = t.taiv_cod and substring(a.arti_cod from 1 FOR 2) <> '.t' and
            ((:INACTIVOS = 'S') or (esar_cod = 'A') or ((:INACTIVOS = 'C') AND (esar_cod = 'N')))
            INTO :CODIGO, :DES, :GRUPO, :SUBGR, :UNIDAD, :ESTADO, :IVA, :PRECIO, :MARCA, :CLASE
            do
            begin
            ref = '';
            select first 1 coba_cod from barras_articulo where arti_cod = :codigo into :ref;
            if (EXIST = 'SI') then
                BEGIN
                EXECUTE PROCEDURE saldo_total_inventario (:CODIGO, :FECHA) returning_values (:EXISTEN);
                if ((SINEXIST = 'SI') or (existen <> 0)) then
                    SUSPEND;
                END
            ELSE
                SUSPEND;
            end
END
^

SET TERM ; ^

/* 20100621C */
/* consultas de compras no incluian el ultimo dia */
SET TERM ^ ;

CREATE OR ALTER procedure COMPRAS_ARTICULO (
    ARTICULO varchar(15),
    FECINI date,
    FECFIN date,
    SUCURSAL integer)
returns (
    FACTURAS integer,
    MFACTURAS numeric(18,2),
    DEVOLUCIONES integer,
    MDEVOLUCIONES numeric(18,2),
    IVAFACT numeric(18,2),
    IVADEV numeric(18,2))
AS
BEGIN
  SELECT SUM(FCDE_CANT * FCDE_FACTOR), SUM(FCDE_TOTAL-FCDE_IVAMONTO-FCDE_CONSUMO), SUM(FCDE_IVAMONTO)
    FROM FACTURAS_COMPRAS_DETALLE D, FACTURAS_COMPRA F, PREFIJOS P
    WHERE F.FACO_ID = D.FACO_ID AND ARTI_COD = :ARTICULO AND FACO_FECHA >= :FECINI AND FACO_FECHA <= :FECFIN AND FACO_ANULADO = 'N'
    AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 21 AND ((SUCU_ID = :SUCURSAL) OR (:SUCURSAL = 0))
    INTO :FACTURAS, :MFACTURAS, :IVAFACT;
  SELECT SUM(DVCD_CANT * DVCD_FACTOR), SUM(DVCD_TOTAL-DVCD_IVAMONTO-DVCD_CONSUMO), SUM(DVCD_IVAMONTO)
    FROM DEVOLUCIONES_COMPRAS F, devoluciones_compras_DET D, PREFIJOS P
    WHERE F.DVCO_ID = D.DVCO_ID AND ARTI_COD = :ARTICULO AND DVCO_FECHA >= :FECINI AND DVCO_FECHA <= :FECFIN AND DVCO_ANULADO = 'N'
    AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 24 AND ((SUCU_ID = :SUCURSAL) OR (:SUCURSAL = 0))
    INTO :DEVOLUCIONES, :MDEVOLUCIONES, :IVADEV;
  if (MFACTURAS IS NULL) then
    MFACTURAS = 0;
  if (MDEVOLUCIONES IS NULL) then
    MDEVOLUCIONES = 0;
  if (IVAFACT IS NULL) then
    IVAFACT = 0;
  if (IVADEV IS NULL) then
    IVADEV = 0;
  SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE COMPRAS_ARTICULO_MES(
    FECINI DATE,
    FECFIN DATE,
    SUCURSAL INTEGER)
RETURNS (
    ARTICULO VARCHAR(15),
    DESCRIPCION VARCHAR(60),
    CODGRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    CODSUBG VARCHAR(3),
    NOMSUBG VARCHAR(30),
    CODMARC VARCHAR(3),
    NOMMARC VARCHAR(30),
    UNIDAD VARCHAR(8),
    CANTVTAS NUMERIC(18,4),
    BASEVTAS NUMERIC(18,2),
    IVAVTAS NUMERIC(18,2),
    CANTDEV NUMERIC(18,4),
    BASEDEV NUMERIC(18,2),
    IVADEV NUMERIC(18,2))
AS
BEGIN
  FOR SELECT ARTI_COD, ARTI_DES, ARTI_UNIDAD, A.GRUP_COD, A.SUBG_COD, A.MARC_COD FROM ARTICULO A
      INTO :ARTICULO, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
  DO
    BEGIN
    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
    EXECUTE PROCEDURE COMPRAS_ARTICULO (:ARTICULO, :FECINI, :FECFIN, :SUCURSAL) returning_values (CANTVTAS, BASEVTAS, CANTDEV, BASEDEV, IVAVTAS, IVADEV);
    if ((CANTVTAS <> 0) or (CANTDEV <> 0)) then
        SUSPEND;
    END
END

^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure COMPRAS_PROVEEDOR (
    NIT varchar(20),
    FECINI date,
    FECFIN date,
    SUCURSAL integer)
returns (
    FACTURAS integer,
    MFACTURAS numeric(18,2),
    DEVOLUCIONES integer,
    MDEVOLUCIONES numeric(18,2),
    IVAFACT numeric(18,2),
    IVADEV numeric(18,2))
AS
BEGIN
  SELECT COUNT(*), SUM(FACO_TOTAL), SUM(FACO_IVAMONTO)
    FROM FACTURAS_COMPRA F, PREFIJOS P
    WHERE TERC_NIT = :NIT AND FACO_FECHA >= :FECINI AND FACO_FECHA <= :FECFIN AND FACO_ANULADO = 'N' AND P.tido_cod = 21 AND P.pref_pre = F.PREF_PRE AND ((SUCU_ID = :SUCURSAL) OR (:SUCURSAL = 0))
    INTO :FACTURAS, :MFACTURAS, :IVAFACT;
  SELECT COUNT(*), SUM(DVCO_TOTAL), SUM(DVCO_IVAMONTO)
    FROM devoluciones_compras D, PREFIJOS P
    WHERE TERC_NIT = :NIT AND DVCO_FECHA >= :FECINI AND DVCO_FECHA <= :FECFIN AND DVCO_ANULADO = 'N' AND P.tido_cod = 24 AND P.pref_pre = D.PREF_PRE AND ((SUCU_ID = :SUCURSAL) OR (:SUCURSAL = 0))
    INTO :DEVOLUCIONES, :MDEVOLUCIONES, :IVADEV;
  if (MFACTURAS IS NULL) then
    MFACTURAS = 0;
  if (MDEVOLUCIONES IS NULL) then
    MDEVOLUCIONES = 0;
  if (IVAFACT IS NULL) then
    IVAFACT = 0;
  if (IVADEV IS NULL) then
    IVADEV = 0;
  SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE COMPRAS_PROVEEDOR_MES(
    FECINI DATE,
    FECFIN DATE,
    SUCURSAL INTEGER)
RETURNS (
    NIT VARCHAR(20),
    NOMBRE VARCHAR(60),
    FACTURAS INTEGER,
    MFACTURAS NUMERIC(18,2),
    DEVOLUCIONES INTEGER,
    MDEVOLUCIONES NUMERIC(18,2),
    IVAFACT NUMERIC(18,2),
    IVADEV NUMERIC(18,2))
AS
BEGIN
  for select TERC_NIT, TERC_NOM from TERCEROS WHERE TERC_PROV = 'S' into :NIT, :NOMBRE
  DO
    BEGIN
    EXECUTE PROCEDURE COMPRAS_PROVEEDOR (NIT, FECINI, FECFIN, SUCURSAL) returning_values (FACTURAS, MFACTURAS, DEVOLUCIONES, MDEVOLUCIONES, IVAFACT, IVADEV);
    SUSPEND;
    END
END

^

SET TERM ; ^

/* 20100621D */
/* no grabe detalle de articulos sin composicion */

SET TERM ^ ;

CREATE OR ALTER PROCEDURE CONSOLIDE_PRODUCCION(
    PLANID INTEGER)
AS
declare variable item integer;
declare variable item2 integer;
declare variable artic varchar(20);
declare variable cant numeric(18,4);
declare variable cantpro numeric(18,4);
declare variable codcmp varchar(20);
declare variable cantcmp numeric(18,4);
declare variable undcmp varchar(8);
declare variable factor float;
declare variable total float;
declare variable unidad varchar(8);
declare variable costou numeric(18,4);
declare variable porc numeric(18,4);
declare variable merma numeric(18,4);
declare variable costot numeric(18,4);
declare variable pesocmp numeric(18,4);
declare variable pesopro numeric(18,4);
declare variable fec date;
declare variable CONC VARCHAR(60);
declare variable Pref varchar(4);
declare variable Num varchar(6);
declare variable BodOri varchar(2);
declare variable BodDes varchar(2);
declare variable entrada CHAR(1);
declare variable LOTE VARCHAR(20);
BEGIN
select plpr_fecfin, plpr_conc, plpr_pref, plpr_numero, plpr_bodori, plpr_boddes, plpr_entrada
    from plan_produccion where plpr_id = :planid
    into :fec, :conc, :Pref, :Num, :BodOri, :BodDes, :entrada;
/* RECORRA LOS COMPONENTES HACIENDO EL MOVIMIENTO QUE GENRA ENSAMBLES SI ES NECESARIO */
FOR SELECT plpc_item, arti_cod, plpc_cant, plpc_unidad
    from plan_produccion_cons WHERE plpd_id = :PLANID
    into :item, :artic, :cant, :unidad
    do
    BEGIN
    execute procedure factor_unidad_cant(:artic, :unidad) returning_values(factor);
    SELECT ARTI_PESO FROM ARTICULO WHERE ARTI_COD = :artic INTO :pesopro;
    CANTPRO = CANT * FACTOR;
    if (exists (select arpr_item from articulos_producto where arti_cod = :artic)) then
        begin
        select sum(arpr_porc) from articulos_producto where arti_cod = :artic into :total;
        for select arpr_item, arpr_comp, arpr_cant, arpr_unidad, ARPR_PORC, ARPR_MERMA, arti_peso
            from articulos_producto P, ARTICULO A
            where P.arpr_comp = A.arti_cod AND p.arti_cod = :artic ORDER BY P.arpr_item
            into :item2, :codcmp, :cantcmp, :undcmp, :porc, :merma, :pesocmp
            DO
            BEGIN
            execute procedure factor_unidad_cant(:codcmp, :undcmp) returning_values (:factor);
            if (((cantcmp is null) or (cantcmp = 0)) AND (PORC IS NOT NULL) AND (porc <> 0)) then
                BEGIN
                /* ES PORCENTUAL AL PESO LA MEZCLA SOBRE EL 1ER ARTICULO */
                cantcmp = cantpro * pesopro * porc / TOTAL; /* APLICA LA PROPORCION */
                if ((MERMA IS NOT NULL) AND (MERMA <> 0)) then
                    cantcmp = cantcmp / ((100 - MERMA) / 100);
                END
            else
                BEGIN
                cantcmp = cantcmp * FACTOR * pesocmp * cantpro;
                END
            insert into plan_produccion_cons_prod (plpd_id, plpc_item, plcp_nrocomp, arpr_comp, arpr_cant, arpr_porc, arpr_unidad, arpr_merma, arti_peso)
                values (:planid, :item, :item2, :codcmp, :cantcmp, :porc, :undcmp, :merma, :pesocmp);
            END
        END
/*    ELSE
        insert into plan_produccion_cons_prod (plpd_id, plpc_item, plcp_nrocomp, arpr_comp, arpr_cant, arpr_porc, arpr_unidad, arpr_merma, arti_peso)
            values (:planid, :item, 1, :artic, :cantpro, 0, :unidad, 0, :pesopro);*/

    INSERT INTO MOVIMIENTO_ARTICULO
      (ARTI_COD, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM, TERC_NIT)
      VALUES(:artic, :bodori, :FEC, 27, :planid, :CONC, :cantpro, 0, 'N', null, :Pref, :Num, :item+1000, null);
    end
/* recorra el detalle calculando costos y haciendo la entrada */
if (entrada = 'S') then
    begin
    for select plpd_item, arti_cod, plpd_cant, plpd_unidad, plpd_lote
        from plan_produccion_det where plpr_id = :planid
        into :item, :artic, :cant, :unidad, :lote
        do
        begin
        COSTOT = 0;
        execute procedure factor_unidad_cant(:artic, :unidad) returning_values (:factor);
        CANTPRO = :cant * :FACTOR;
        FOR SELECT ARPR_COMP, ARPR_CANT, ARPR_unidad
            FROM plan_produccion_productos WHERE PLPR_ID = :planid
            ORDER BY PLPD_ITEM
            INTO :codcmp, :cantcmp, :undcmp
            DO
            BEGIN
            EXECUTE PROCEDURE costo_promedio_unidad(:codcmp, :fec, :undcmp) returning_values (:COSTOU);
            COSTOT = COSTOT + (COSTOU * cantcmp);
            END
        if ((CANTPRO) <> 0) then
            costou = costot / cantpro;
        else
            costou = 0;
        INSERT INTO MOVIMIENTO_ARTICULO
          (ARTI_COD, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM, TERC_NIT)
          VALUES(:artic, :boddes, :fec, 27, :planid, :conc, :cant, :costou, 'S', :lote, :Pref, :Num, :item, '');
        end
    end
end
^

SET TERM ; ^

/* 20100628 */
/* STRING TRUNCATION NOMBRE PUNTO DEL VENTA */
SET TERM ^ ;

CREATE OR ALTER procedure IMPR_FACTURA (
    ID integer)
returns (
    PREF varchar(4),
    NUMERO varchar(6),
    FECHA date,
    VENCE date,
    DIASVENCE integer,
    CONTCRED char(17),
    NIT varchar(20),
    NOMTERCERO varchar(60),
    NOMCLIENTE varchar(60),
    VENDEDOR integer,
    NOMVENDEDOR varchar(60),
    PUNTOVTA integer,
    NOMPUNTOVTA varchar(60),
    CODBODEGA varchar(2),
    NOMBODEGA varchar(30),
    AUTORIZACION varchar(20),
    DESPACHO varchar(255),
    TRANSPORTADOR varchar(60),
    COTIZACION varchar(30),
    PEDIDO varchar(30),
    REMISION varchar(30),
    PACIENTE varchar(20),
    NOMPACIENTE varchar(60),
    COMIPORC numeric(9,2),
    COMIMONTO numeric(18,2),
    SUBTOTAL numeric(18,2),
    INGTERCEROS numeric(18,2),
    INGPROPIOS numeric(18,2),
    DTOPORC numeric(9,2),
    DTOMONTO numeric(18,2),
    ADICIONAL numeric(18,2),
    IVAMONTO numeric(18,2),
    RTEFTEPORC numeric(9,2),
    RTEFTEMONTO numeric(18,2),
    RTEIVAPORC numeric(9,2),
    RTEIVAMONTO numeric(18,2),
    RTEICAPORC numeric(9,2),
    RTEICAMONTO numeric(18,2),
    EXTRA numeric(18,2),
    DTOFPORC numeric(9,2),
    DTOFMONTO numeric(18,2),
    FECHADTO date,
    ANTICIPO numeric(18,2),
    RETGARANTIA numeric(18,2),
    TOTALFAC numeric(18,2),
    TOTALPAGAR numeric(18,2),
    TOTALNETO numeric(18,2),
    OBS blob sub_type 1 segment size 80,
    ITEM integer,
    ARTICULO varchar(15),
    CODBAR varchar(15),
    ARTIDES varchar(60),
    DESCORTA varchar(30),
    CANT numeric(18,4),
    LOTE varchar(15),
    VLOTE date,
    UNIDAD varchar(8),
    CAJAS numeric(18,4),
    FACTOR numeric(18,4),
    LISTAPR integer,
    REFITEM varchar(60),
    BODITEM varchar(2),
    STAND varchar(20),
    PRUNIT numeric(18,2),
    DTOITPORC numeric(9,2),
    DTOITMONTO numeric(18,2),
    PRNETO numeric(18,2),
    PRNETOSINIVA numeric(18,2),
    BASE numeric(18,2),
    PORCBASE numeric(9,2),
    DTOIT1 numeric(9,2),
    DTOIT2 numeric(9,2),
    DTOIT3 numeric(9,2),
    IVAPORC numeric(9,2),
    IVAITMONTO numeric(18,2),
    CONSUMO numeric(18,2),
    SUBTOTIT numeric(18,2),
    TOTAL numeric(18,2),
    PESOTOT numeric(18,2),
    CODIGOCL varchar(20),
    ZONACOD varchar(2),
    ZONANOM varchar(60),
    DV char(1),
    DIRECCION varchar(60),
    CIUDAD varchar(40),
    TELEFONO varchar(40),
    CONTACTO varchar(60),
    FAX varchar(25),
    CEL varchar(25),
    GRUPO varchar(2),
    NOMGRUPO varchar(30),
    SUBGRUPO varchar(3),
    NOMSUBG varchar(30),
    MARCA varchar(3),
    NOMMARCA varchar(30),
    PESO numeric(18,4),
    ANCHO numeric(18,4),
    ALTO numeric(18,4),
    LARGO numeric(18,4),
    SUMA1 numeric(18,2),
    SUMA2 numeric(18,2),
    SUMA3 numeric(18,2),
    IVA1 numeric(18,2),
    IVA2 numeric(18,2),
    IVA3 numeric(18,2),
    SUMAEX numeric(18,2),
    SUMAGR numeric(18,2),
    TOTCONSUMO numeric(18,2),
    DTOIT1M numeric(18,2),
    DTOIT2M numeric(18,2),
    DTOIT3M numeric(18,2),
    TOTCAJAS numeric(18,2),
    TOTBASE numeric(18,2),
    VEHICULO varchar(8),
    RECIBIDO numeric(18,2),
    CAMBIO numeric(18,2),
    HORA time,
    FORMAPAGO1 varchar(30),
    MONTOPAGO1 numeric(18,2),
    FORMAPAGO2 varchar(30),
    MONTOPAGO2 numeric(18,2),
    FORMAPAGO3 varchar(30),
    MONTOPAGO3 numeric(18,2),
    PUNTOS integer,
    PUNTOSACUM integer,
    PUNTOSVENC integer,
    FECPTOS date,
    OBSITEM blob sub_type 1 segment size 80,
    SUCUR varchar(10),
    ALTERNATIVAS numeric(18,4),
    PRINCIPALES numeric(18,4))
AS
DECLARE VARIABLE IMPTOS CHAR(1);
DECLARE VARIABLE TARIFA INTEGER;
declare variable DEVUELTO NUMERIC(18,2);
declare variable ORDENCOD CHAR(8);
declare variable IMPRDEV CHAR(2);
declare variable IMPR CHAR(1);
declare variable ITEMFP INTEGER;
declare variable FORMAP VARCHAR(30);
declare variable MONTOP NUMERIC(18,2);
declare variable ICOINC CHAR(2);
declare variable DTOITM1 NUMERIC(18,2);
declare variable DTOITM2 NUMERIC(18,2);
declare variable DTOITM3 NUMERIC(18,2);
declare variable DTOITE3 CHAR(2);
declare variable SUMDTOIT NUMERIC(18,2);
declare variable AUTORET VARCHAR(10);
declare variable FAUTORET DATE;
declare variable FACTCANT NUMERIC(18,4);
declare variable ANULADO CHAR(1);
declare variable INGTER CHAR(2);
BEGIN
execute procedure lee_configuracion('FACTURACION', 'ARTICULOS', 'IMPOCONSUMO INCLUIDO EN EL PRECIO BASE DE VENTA ANTES DE IVA') returning_values (icoinc);
execute procedure lee_configuracion('FACTURACION', 'FACTURAS', 'COLUMNAS DE DESCUENTO POR ITEM ADICIONALES') returning_values (DTOITE3);
execute procedure lee_configuracion('FACTURACION', 'FACTURAS', 'GRUPO DE MERCANCIA PARA INGRESOS DE TERCEROS') returning_values (INGTER);
SELECT F.PREF_PRE, FACT_NUMERO, FACT_FECHA, FACT_VENCE, F.BODE_COD, BODE_NOM, F.TERC_NIT, FACT_NOMCLIENTE, F.VEND_COD, VEND_NOMBRE, F.PTVT_ID, PTVT_NOM,
    AUTO_NUMERO, FACT_DESPACHO, FACT_TRANSP, FACT_COTIZACI, FACT_PEDIDO, FACT_REMISION, FACT_COMIPORC, FACT_COMIMONTO, FACT_IVAINC, 
    FACT_DTOPOR, FACT_DTOMONTO, FACT_ADICIONAL, FACT_IVAMONTO, FACT_RTFTEPOR, FACT_RTFTEMONTO, FACT_RTIVAPOR, FACT_RTIVAMONTO, FACT_RTICAPOR, FACT_RTICAMONTO, FACT_EXTRA, FACT_DTOFPOR, FACT_DTOFMONTO, FACT_DTOFFECHA, FACT_TOTAL,
    TERC_DIR, TERC_CIU, TERC_TEL, TERC_CONTACTO, TERC_FAX, TERC_DV, TERC_CEL, FACT_DTOIT1, FACT_DTOIT2, FACT_DTOIT3,
    FACT_OBS, VEHI_COD, /*FACT_NROCOPIA,*/ FACT_RECIBIDO, FACT_SUCURSAL, FACT_DETCLI, FACT_DETCLINOM, TERC_NOM, FACT_ANULADO, FACT_ANTICIPO, FACT_GARANTIA
    FROM FACTURAS F, BODEGA B, VENDEDORES V, PUNTO_VENTA P, TERCEROS T
    WHERE F.BODE_COD = B.BODE_COD AND F.VEND_COD = V.VEND_COD AND F.PTVT_ID = P.PTVT_ID AND F.TERC_NIT = T.TERC_NIT AND F.FACT_ID = :ID
    into :PREF, :NUMERO, :FECHA, :VENCE, :CODBODEGA, :NOMBODEGA, :NIT, :NOMTERCERO, :VENDEDOR, :NOMVENDEDOR, :PUNTOVTA, :NOMPUNTOVTA,
    :AUTORIZACION, :DESPACHO, :TRANSPORTADOR, :COTIZACION, :PEDIDO, :REMISION, :COMIPORC, :COMIMONTO, :IMPTOS,
    :DTOPORC, :DTOMONTO, :ADICIONAL, :IVAMONTO, :RTEFTEPORC, :RTEFTEMONTO, :RTEIVAPORC, :RTEIVAMONTO, :RTEICAPORC, :RTEICAMONTO, :EXTRA, :DTOFPORC, :DTOFMONTO, :FECHADTO, :TOTALFAC,
    :DIRECCION, :CIUDAD, :TELEFONO, :CONTACTO, :FAX, :DV, :CEL, :dtoit1m, :dtoit2m, :dtoit3m,
    :OBS, :VEHICULO,/* :NROCOPIA,*/ :RECIBIDO, :SUCUR, :paciente, :nompaciente, :nomcliente, :ANULADO, :anticipo, :retgarantia;

/* ACUMULE LOS PUNTOS, SE HACE ACA POR SER POSTERIOR AL DETALLE */
if (ANULADO = 'N') then
    EXECUTE PROCEDURE acumula_puntos_cliente (31, :id, :nit, :fecha) returning_values (:PUNTOS);
EXECUTE PROCEDURE consulta_puntos_cliente (:id, :nit, :fecha) returning_values (:puntos, :puntosacum, :puntosvenc, :fecptos);
if (DTOIT1M IS NULL) then
    DTOIT1M = 0;
if (DTOIT2M IS NULL) then
    DTOIT2M = 0;
if (DTOIT3M IS NULL) then
    DTOIT3M = 0;
SELECT CLIE_COD, C.ZONA_COD, ZONA_NOM
    FROM CLIENTES C, ZONAS Z
    WHERE TERC_NIT = :NIT AND C.ZONA_COD = Z.ZONA_COD
    INTO :CODIGOCL, :ZONACOD, :ZONANOM;
SELECT CLSU_DIR, CLSU_CIUDAD, CLSU_TEL FROM CLIENTE_SUCURSALES WHERE TERC_NIT = :NIT AND CLCU_COD = :SUCUR
    INTO :DIRECCION, :CIUDAD, :TELEFONO;
DIASVENCE = VENCE - FECHA;
if (DIASVENCE > 0) then
    CONTCRED = 'CREDITO ' || CAST(DIASVENCE AS VARCHAR(3)) || ' DIAS';
ELSE
    CONTCRED = 'CONTADO';
SUBTOTAL = TOTALFAC - EXTRA - IVAMONTO - ADICIONAL + DTOMONTO;
SELECT SUM(FADE_DTOMONTO*FADE_CANT) FROM FACTURAS_DETALLE WHERE FACT_ID = :id INTO :sumdtoit;
if (DTOITE3 = 'SI') then
    BEGIN
    SUBTOTAL = SUBTOTAL + sumdtoit + dtoit1m + dtoit2m + dtoit3m;
    END
if (INGTER <> '') then
    BEGIN
    SELECT SUM(FADE_TOTAL) FROM FACTURAS_DETALLE D, ARTICULO A WHERE A.arti_cod = D.arti_cod AND FACT_ID = :id AND GRUP_COD = :ingter
        INTO :ingterceros;
    INGPROPIOS = SUBTOTAL - INGTERCEROS;
    END
EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'FECHA AUTORETENEDOR NO DESCONTAR RETENCIONES DEL SALDO PERO SI CONTABILIZARLAS') returning_values (AUTORET);
if (AUTORET <> '') then
    FAUTORET = CAST(AUTORET AS DATE);
else
    FAUTORET = '9999/12/31';
if (FECHA > fautoret) then
    TOTALPAGAR = TOTALFAC - RTEIVAMONTO - RTEICAMONTO - ANTICIPO - RETGARANTIA;
ELSE
    TOTALPAGAR = TOTALFAC - RTEFTEMONTO - RTEIVAMONTO - RTEICAMONTO - ANTICIPO - RETGARANTIA;
TOTALNETO = TOTALFAC - ANTICIPO - RETGARANTIA;
if (RECIBIDO <> 0) then
    CAMBIO = RECIBIDO - totalpagar;
ELSE
    CAMBIO = 0;
SUMAEX = 0;
SUMA1 = 0;
SUMA2 = 0;
SUMA3 = 0;
IVA1 = 0;
IVA2 = 0;
IVA3 = 0;
TOTCONSUMO = 0;
MONTOPAGO1 = 0;
PESOTOT = 0;
SELECT MAX(AUDI_HORA) FROM AUDITORIA WHERE TIDO_COD = 31 AND AUDI_IDDOC = :ID AND AUDI_OPER = 'I' INTO :HORA;
/* AHORA LAS FORMAS DE PAGO, BUSQUE EL ABONO DE HOY A LA FACTURA */
ITEMFP = 1;
MONTOPAGO1 = 0;
MONTOPAGO2 = 0;
MONTOPAGO3 = 0;
FOR SELECT FOPA_NOM, RCPA_MONTO FROM RECIBOS_CAJA_PAGO P, FORMAS_PAGO F, RECIBOS_CAJA R, RECIBOS_CAJA_DETALLE D
    WHERE R.RECA_ID = P.RECA_ID AND R.RECA_ID = D.RECA_ID AND P.FOPA_ID = F.FOPA_ID AND RECA_FECHA = :FECHA AND RCDE_TIPODOC = 31 AND RCDE_IDDOC = :ID
    INTO :formap, :MONTOP
    DO
    BEGIN
    if (ITEMFP = 1) then
        BEGIN
        FORMAPAGO1 = FORMAP;
        MONTOPAGO1 = MONTOP;
        END
    if (ITEMFP = 2) then
        BEGIN
        FORMAPAGO2 = FORMAP;
        MONTOPAGO2 = MONTOP;
        END
    if (ITEMFP = 3) then
        BEGIN
        FORMAPAGO3 = FORMAP;
        MONTOPAGO3 = MONTOP;
        END
    ITEMFP = ITEMFP + 1;
    END
EXECUTE PROCEDURE lee_configuracion ('FACTURACION','DOCUMENTOS','ORDENAR ITEMS POR CODIGO DE ARTICULO') returning_values (:ORDENCOD);
EXECUTE PROCEDURE lee_configuracion ('FACTURACION','POS', 'IMPRIMIR DEVOLUCIONES DE ARTICULOS NEGATIVOS') returning_values (:imprdev);
totcajas = 0;
totbase = 0;
if (ORDENCOD = 'SI') then
    BEGIN
    FOR SELECT FADE_ITEM, D.ARTI_COD, FADE_CODBAR, SUBSTR(FADE_DESC,1,60), ARTI_DESCORTA, FADE_CANT, FADE_UNIDAD, FADE_FACTOR, BODE_COD, FADE_LOTE, LIPR_COD, FADE_PRUNIT, FADE_DTOPORC, FADE_DTOMONTO, FADE_IVAPORC, FADE_IVAMONTO, FADE_CONSUMO, FADE_TOTAL, FADE_REFERENCIA,
        GRUP_COD, SUBG_COD, MARC_COD, ARTI_PESO, ARTI_ANCHO, ARTI_ALTO, ARTI_LARGO, TAIV_COD, FADE_DEVUELTO, FADE_OBS, FADE_DTO1, FADE_DTO2, FADE_DTO3, FADE_DTOM1, FADE_DTOM2, FADE_DTOM3, FADE_CAJAS, FADE_BASE, FADE_PORCBASE
        FROM FACTURAS_DETALLE D, ARTICULO A
        WHERE D.ARTI_COD = A.ARTI_COD AND D.FACT_ID = :ID
        ORDER BY D.ARTI_COD
        INTO :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :DESCORTA, :CANT, :UNIDAD, :FACTOR, :BODITEM, :LOTE, :LISTAPR, :PRUNIT, :DTOITPORC, :DTOITMONTO, :IVAPORC, :IVAITMONTO, :CONSUMO, :TOTAL, :refitem,
        :GRUPO, :SUBGRUPO, :MARCA, :PESO, :ANCHO, :ALTO, :LARGO, :TARIFA, :devuelto, :obsitem, :dtoit1, :dtoit2, :dtoit3, :dtoitm1, :dtoitm2, :dtoitm3, :cajas, :base, :porcbase
        DO
          BEGIN
          if (ARTICULO = CODBAR) then
            SELECT FIRST 1 COBA_COD FROM barras_articulo WHERE ARTI_COD = :articulo INTO :CODBAR;
          if (IMPRDEV <> 'SI') then
            BEGIN
            if ((CANT >= 0) AND (DEVUELTO = 0)) then
                IMPR = 'S';
            ELSE
                IMPR = 'N'; /* ES DEVOLUCION */
            END
          ELSE
            IMPR = 'S';
          if (IMPR = 'S') then
            BEGIN
            prneto = PRUNIT - DTOITMONTO - dtoitm1 - dtoitm2 - dtoitm3;
            if (IMPTOS = 'S') then
                if (cant <> 0) then
                    prnetosiniva = PRUNIT - DTOITMONTO - ((IVAITMONTO+CONSUMO) / CANT) - dtoitm1 - dtoitm2 - dtoitm3;
                else
                    prnetosiniva = PRUNIT - DTOITMONTO - dtoitm1 - dtoitm2 - dtoitm3;
            ELSE
                prnetosiniva = PRUNIT - DTOITMONTO - dtoit1m - dtoit2m - dtoit3m;
            if (ICOINC = 'SI') then
                SUBTOTIT = TOTAL - IVAITMONTO;
            else
                SUBTOTIT = TOTAL - IVAITMONTO - CONSUMO;
            TOTCONSUMO = TOTCONSUMO + CONSUMO;
            TOTBASE = TOTBASE + BASE;
            SELECT LOTE_VENCE FROM LOTES WHERE LOTE_NRO = :lote AND ARTI_COD = :ARTICULO AND BODE_COD = :boditem INTO :vlote;
            if ((REFITEM <> '.t') or (REFITEM IS NULL)) then
                BEGIN
                /* NO SUME LOS ENSAMBLES */
                if (IVAPORC = 0) then
                    SUMAEX = SUMAEX + TOTAL;
                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;
                END
            if (ANCHO IS NULL) then
                ANCHO = 0;
            if (ALTO IS NULL) then
                ALTO = 0;
            if (LARGO IS NULL) then
                LARGO = 0;
            if (PESO IS NULL) then
                PESO = 0;
            PESO = (PESO / 1000) * CANT * FACTOR;
            PESOTOT = PESOTOT + PESO;
            totcajas = totcajas + cajas;
            if (substr(ARTICULO,1,2) = '.t') then
                BEGIN
                REFITEM = '';
                TOTAL = 0;
                SUBTOTIT = 0;
                END
            SELECT STAND_COD FROM STANDS WHERE ARTI_COD = :ARTICULO AND STAND_BODEGA = :boditem INTO :stand;
            factcant = NULL;
            SELECT FIRST 1 UNAR_FACCAN FROM unidad_articulo WHERE ARTI_COD = :articulo INTO :factcant;
            if (factcant IS NULL) then
                BEGIN
                ALTERNATIVAS = 0;
                PRINCIPALES = (CANT * FACTOR);
                END
            ELSE
                BEGIN
                ALTERNATIVAS = FLOOR(CANT * factor / factcant);
                PRINCIPALES = (CANT * FACTOR) - (alternativas * factcant);
                END
            SUSPEND;
            END
          END
    END
ELSE
  if (ORDENCOD = 'UNIDAD') then
    BEGIN
    FOR SELECT FADE_ITEM, D.ARTI_COD, FADE_CODBAR, SUBSTR(FADE_DESC,1,60), ARTI_DESCORTA, FADE_CANT, FADE_UNIDAD, FADE_FACTOR, BODE_COD, FADE_LOTE, LIPR_COD, FADE_PRUNIT, FADE_DTOPORC, FADE_DTOMONTO, FADE_IVAPORC, FADE_IVAMONTO, FADE_CONSUMO, FADE_TOTAL, FADE_REFERENCIA,
        GRUP_COD, SUBG_COD, MARC_COD, ARTI_PESO, ARTI_ANCHO, ARTI_ALTO, ARTI_LARGO, TAIV_COD, FADE_DEVUELTO, FADE_OBS, FADE_DTO1, FADE_DTO2, FADE_DTO3, FADE_DTOM1, FADE_DTOM2, FADE_DTOM3, FADE_CAJAS, FADE_BASE, FADE_PORCBASE
        FROM FACTURAS_DETALLE D, ARTICULO A
        WHERE D.ARTI_COD = A.ARTI_COD AND D.FACT_ID = :ID
        ORDER BY D.fade_unidad, D.fade_desc
        INTO :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :DESCORTA, :CANT, :UNIDAD, :FACTOR, :BODITEM, :LOTE, :LISTAPR, :PRUNIT, :DTOITPORC, :DTOITMONTO, :IVAPORC, :IVAITMONTO, :CONSUMO, :TOTAL, :refitem,
        :GRUPO, :SUBGRUPO, :MARCA, :PESO, :ANCHO, :ALTO, :LARGO, :TARIFA, :devuelto, :obsitem, :dtoit1, :dtoit2, :dtoit3, :dtoitm1, :dtoitm2, :dtoitm3, :cajas, :base, :porcbase
        DO
          BEGIN
          if (ARTICULO = CODBAR) then
            SELECT FIRST 1 COBA_COD FROM barras_articulo WHERE ARTI_COD = :articulo INTO :CODBAR;
          if (IMPRDEV <> 'SI') then
            BEGIN
            if ((CANT >= 0) AND (DEVUELTO = 0)) then
                IMPR = 'S';
            ELSE
                IMPR = 'N'; /* ES DEVOLUCION */
            END
          ELSE
            IMPR = 'S';
          if (IMPR = 'S') then
            BEGIN
            prneto = PRUNIT - DTOITMONTO - dtoitm1 - dtoitm2 - dtoitm3;
            if (IMPTOS = 'S') then
                if (cant <> 0) then
                    prnetosiniva = PRUNIT - DTOITMONTO - ((IVAITMONTO+CONSUMO) / CANT) - dtoitm1 - dtoitm2 - dtoitm3;
                else
                    prnetosiniva = PRUNIT - DTOITMONTO - dtoitm1 - dtoitm2 - dtoitm3;
            ELSE
                prnetosiniva = PRUNIT - DTOITMONTO - dtoit1m - dtoit2m - dtoit3m;
            if (ICOINC = 'SI') then
                SUBTOTIT = TOTAL - IVAITMONTO;
            else
                SUBTOTIT = TOTAL - IVAITMONTO - CONSUMO;
            TOTCONSUMO = TOTCONSUMO + CONSUMO;
            TOTBASE = TOTBASE + BASE;
            SELECT LOTE_VENCE FROM LOTES WHERE LOTE_NRO = :lote AND ARTI_COD = :ARTICULO AND BODE_COD = :boditem INTO :vlote;
            if ((REFITEM <> '.t') or (REFITEM IS NULL)) then
                BEGIN
                /* NO SUME LOS ENSAMBLES */
                if (IVAPORC = 0) then
                    SUMAEX = SUMAEX + TOTAL;
                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;
                END
            if (ANCHO IS NULL) then
                ANCHO = 0;
            if (ALTO IS NULL) then
                ALTO = 0;
            if (LARGO IS NULL) then
                LARGO = 0;
            if (PESO IS NULL) then
                PESO = 0;
            PESO = (PESO / 1000) * CANT * FACTOR;
            PESOTOT = PESOTOT + PESO;
            totcajas = totcajas + cajas;
            if (substr(ARTICULO,1,2) = '.t') then
                BEGIN
                REFITEM = '';
                TOTAL = 0;
                SUBTOTIT = 0;
                END
            SELECT STAND_COD FROM STANDS WHERE ARTI_COD = :ARTICULO AND STAND_BODEGA = :boditem INTO :stand;
            factcant = NULL;
            SELECT FIRST 1 UNAR_FACCAN FROM unidad_articulo WHERE ARTI_COD = :articulo INTO :factcant;
            if ((factcant IS NULL) or (factcant = 0)) then
                BEGIN
                ALTERNATIVAS = 0;
                PRINCIPALES = (CANT * FACTOR);
                END
            ELSE
                BEGIN
                ALTERNATIVAS = FLOOR(CANT * factor / factcant);
                PRINCIPALES = (CANT * FACTOR) - (alternativas * factcant);
                END
            SUSPEND;
            END
          END
    END
  ELSE
    BEGIN
    FOR SELECT FADE_ITEM, D.ARTI_COD, FADE_CODBAR, SUBSTR(FADE_DESC,1,60), ARTI_DESCORTA, FADE_CANT, FADE_UNIDAD, FADE_FACTOR, BODE_COD, FADE_LOTE, LIPR_COD, FADE_PRUNIT, FADE_DTOPORC, FADE_DTOMONTO, FADE_IVAPORC, FADE_IVAMONTO, FADE_CONSUMO, FADE_TOTAL, FADE_REFERENCIA,
        GRUP_COD, SUBG_COD, MARC_COD, ARTI_PESO, ARTI_ANCHO, ARTI_ALTO, ARTI_LARGO, TAIV_COD, FADE_DEVUELTO, FADE_OBS, FADE_DTO1, FADE_DTO2, FADE_DTO3, FADE_DTOM1, FADE_DTOM2, FADE_DTOM3, FADE_CAJAS, FADE_BASE, FADE_PORCBASE
        FROM FACTURAS_DETALLE D, ARTICULO A
        WHERE D.ARTI_COD = A.ARTI_COD AND D.FACT_ID = :ID
        ORDER BY FADE_ITEM
        INTO :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :DESCORTA, :CANT, :UNIDAD, :FACTOR, :BODITEM, :LOTE, :LISTAPR, :PRUNIT, :DTOITPORC, :DTOITMONTO, :IVAPORC, :IVAITMONTO, :CONSUMO, :TOTAL, :refitem,
        :GRUPO, :SUBGRUPO, :MARCA, :PESO, :ANCHO, :ALTO, :LARGO, :TARIFA, :devuelto, :obsitem, :dtoit1, :dtoit2, :dtoit3, :dtoitm1, :dtoitm2, :dtoitm3, :cajas, :base, :porcbase
        DO
          BEGIN
          if (IMPRDEV <> 'SI') then
            BEGIN
            if ((CANT >= 0) AND (DEVUELTO = 0)) then
                IMPR = 'S';
            ELSE
                IMPR = 'N'; /* ES DEVOLUCION */
            END
          ELSE
            IMPR = 'S';
          if (IMPR = 'S') then
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :GRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :MARCA INTO NOMMARCA;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :SUBGRUPO AND GRUP_COD = :GRUPO INTO :NOMSUBG;
            prneto = PRUNIT - DTOITMONTO - dtoitm1 - dtoitm2 - dtoitm3;
            if (IMPTOS = 'S') then
                if (cant <> 0) then
                    prnetosiniva = PRUNIT - DTOITMONTO - ((IVAITMONTO+CONSUMO) / CANT) - dtoit1m - dtoit2m - dtoit3m;
                else
                    prnetosiniva = PRUNIT - DTOITMONTO - dtoitm1 - dtoitm2 - dtoitm3;
            ELSE
                prnetosiniva = PRUNIT - DTOITMONTO - dtoitm1 - dtoitm2 - dtoitm3;
            if (ICOINC = 'SI') then
                SUBTOTIT = TOTAL - IVAITMONTO;
            else
                SUBTOTIT = TOTAL - IVAITMONTO - CONSUMO;
            TOTCONSUMO = TOTCONSUMO + CONSUMO;
            TOTBASE = TOTBASE + BASE;
            SELECT LOTE_VENCE FROM LOTES WHERE LOTE_NRO = :lote AND ARTI_COD = :ARTICULO AND BODE_COD = :boditem INTO :vlote;
            if ((REFITEM <> '.t') or (REFITEM IS NULL)) then
                BEGIN
                /* NO SUME LOS ENSAMBLES */
                if (IVAPORC = 0) then
                    SUMAEX = SUMAEX + TOTAL;
                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;
                END
            if (ANCHO IS NULL) then
                ANCHO = 0;
            if (ALTO IS NULL) then
                ALTO = 0;
            if (LARGO IS NULL) then
                LARGO = 0;
            if (PESO IS NULL) then
                PESO = 0;
            PESO = (PESO / 1000)* CANT * FACTOR;
            PESOTOT = PESOTOT + PESO;
            totcajas = totcajas + cajas;
            if (substr(ARTICULO,1,2) = '.t') then
                BEGIN
                REFITEM = '';
                TOTAL = 0;
                SUBTOTIT = 0;
                END
            SELECT STAND_COD FROM STANDS WHERE ARTI_COD = :ARTICULO AND STAND_BODEGA = :boditem INTO :stand;
            factcant = NULL;
            SELECT FIRST 1 UNAR_FACCAN FROM unidad_articulo WHERE ARTI_COD = :articulo INTO :factcant;
            if ((factcant IS NULL) or (factcant = 0)) then
                BEGIN
                ALTERNATIVAS = 0;
                PRINCIPALES = (CANT * FACTOR);
                END
            ELSE
                BEGIN
                ALTERNATIVAS = FLOOR(CANT * factor / factcant);
                PRINCIPALES = (CANT * FACTOR) - (alternativas * factcant);
                END
            SUSPEND;
            END
          END
    END
END
^

SET TERM ; ^


/* 20100628C */
/* STRING TRUNCATION CODPRO 8 C */
SET TERM ^ ;

CREATE OR ALTER TRIGGER MOVIMIENTO_ARTICULO_BI FOR MOVIMIENTO_ARTICULO
ACTIVE BEFORE INSERT POSITION 0
AS
declare variable LOTE CHAR(1);
declare variable ENSAMBLE CHAR(1);
declare variable IDENS INTEGER;
declare variable PREFENS VARCHAR(4);
declare variable unidad varchar(8);
declare variable DESCR varchar(60);
declare variable CODPR varchar(15);
declare variable DESPR varchar(60);
declare variable UNIPR varchar(8);
declare variable CANTPR numeric(18,4);
declare variable FACTOR numeric(18,4);
declare variable COSTO numeric(18,2);
declare variable COSTOTOT numeric(18,2);
declare variable PORCPR numeric(9,4);
declare variable MERMAPR numeric(9,4);
declare variable PESO numeric(18,4);
declare variable PESOPR numeric(18,4);
declare variable ITEM INTEGER;
declare variable IVA NUMERIC(9,4);
declare variable IVAM NUMERIC(18,2);
declare variable CONSUMO NUMERIC(18,2);
declare variable TOTAL float;
declare variable SALDO NUMERIC(18,4);
BEGIN
/* INSERTE EL NUEVO LOTE */
if (NEW.mvar_cant IS NULL) then
    NEW.mvar_cant = 0;
SELECT ARTI_EXIST
    FROM   ARTICULO
    WHERE  ARTICULO.ARTI_COD = NEW.ARTI_COD
    INTO :LOTE;
if (LOTE = 'L') then
    BEGIN
      if ((NEW.mvar_lote IS NULL) or (NEW.mvar_lote = '')) then
        if (new.mvar_entrada = 'S') then
            new.mvar_lote = cast(new.mvar_cons as varchar(15));
        else
            begin
            /* NO HAY LOTE, ENTONCES CALCULELO SEGUN CONFIGURACION */
            EXCEPTION LOTE_NEGATIVO 'No se indicó un lote para el artículo ' || new.arti_cod;
            end
    END
/* ENSAMBLE EL PRODUCTO */
SELECT ARTI_ENSAMBLE, ARTI_UNIDAD, ARTI_DES, ARTI_PESO
    FROM ARTICULO WHERE ARTI_COD = NEW.arti_cod INTO :ensamble, :unidad, :descr, :peso;
if ((NEW.mvar_entrada = 'N') AND (ENSAMBLE = 'S')) then
    BEGIN
    /* verifique si la existecia es insufieciente */
/*    INSERT INTO audi_trig (EVENTO) VALUES ('movarti_bi ensamble' || NEW.arti_cod);*/
    execute procedure saldo_inventario(new.arti_cod, new.bode_cod, new.mvar_fecha) returning_values (:saldo);
/*    INSERT INTO audi_trig (EVENTO) VALUES ('movarti_bi ensamble ' || NEW.arti_cod || ' cant:' || new.mvar_cant || ' saldo:' || :saldo);*/
    if (NEW.mvar_cant > :SALDO) then
        BEGIN
        if (SALDO > 0) then
            SALDO = NEW.mvar_cant - :SALDO;
        else
            SALDO = NEW.mvar_cant;
        IDENS = gen_id(id_ensamble, 1);
        EXECUTE PROCEDURE lee_configuracion('INVENTARIO', 'ENSAMBLES', 'PREFIJO PARA ENSAMBLES AUTOMATICOS AL SACAR PRODUCTOS') returning_values (:prefens);
        INSERT INTO ENSAMBLES(ENSA_ID, TIDO_COD, PREF_PRE, BODE_COD, ENSA_NUMERO, ENSA_FECHA, ENSA_CONC, ENSA_REFER, ENSA_CANT, ENSA_UNIDAD, ENSA_FACTOR, ENSA_ANULADO, ENSA_TRANSMIT,
            ARTI_COD, ENSA_DESC, ENSA_CODBAR, ENSA_LOTE, ENSA_OBS, TERC_NIT, ENSA_USUARIO, NUMOK, ENSA_COSTO, LOTE_VENCE, ENSA_CODRETAL, ENSA_CANTRETAL, ENSA_OPER, ENSA_MAQUINA, ENSA_PESO, ENSA_BODRETAL, ENSA_TIPOREF, ENSA_IDREF)
            VALUES (:IDENS, 15, :prefens, NEW.bode_cod, '000001', new.mvar_fecha, new.mvar_conc, '', :SALDO, :unidad, 1, 'N', 'N',
            NEW.arti_cod, :descr, NEW.arti_cod, NEW.mvar_lote, NULL, NULL, USER, 'N', NEW.mvar_costo, NULL, NULL, 0, null,  NULL, 0, NEW.bode_cod, NEW.mvar_tipodoc, NEW.mvar_idref);
        ITEM = 0;
        COSTOTOT = 0;
        select sum(arpr_porc) from articulos_producto where arti_cod = NEW.arti_cod into :total;
        FOR SELECT ARPR_CANT, ARPR_UNIDAD, ARPR_COMP, ARTI_DES, TAIV_PORC, ARTI_CONSUMO, ARPR_PORC, ARPR_MERMA, ARTI_PESO
            FROM articulos_producto P, ARTICULO A, TARIFA_IVA T
            WHERE P.ARTI_COD = NEW.arti_cod AND A.arti_cod = P.arpr_comp AND A.taiv_cod = T.taiv_cod
            INTO :CANTPR, :UNIPR, :CODPR, :DESPR, :IVA, :CONSUMO, :PORCPR, :MERMAPR, :PESOPR
            DO
            BEGIN
            ITEM = ITEM + 1;
            EXECUTE PROCEDURE factor_unidad_cant(:codpr, :unipr) returning_values (:factor);
            EXECUTE PROCEDURE costo_promedio_unidad (:codpr, NEW.mvar_fecha, :UNIPR) returning_values (:COSTO);
            IVAM = costo * cantpr * iva / 100;
            if (((cantpr is null) or (cantpr = 0)) AND (porcpr IS NOT NULL) AND (porcpr <> 0)) then
                BEGIN
                /* ES PORCENTUAL AL PESO LA MEZCLA SOBRE EL 1ER ARTICULO */
                CANTPR = :SALDO * PESO;
                CANTPR = CANTPR / TOTAL * porcpr; /* APLICA LA PROPORCION */
                if ((mermapr IS NOT NULL) AND (mermapr <> 0)) then
                    CANTPR = CANTPR * (100 + mermapr) / 100;
/*                CANTPR = CANTPR / pesopr; /* LO LLEVA A LA UNIDAD PRINCIPAL */
                UNIPR = 'GRAMO';
                END
            ELSE
                BEGIN
                CANTPR = CANTPR * :SALDO * pesopr;
                END
            COSTOTOT = COSTOTOT + COSTO * CANTPR;
            INSERT INTO ENSAMBLES_DETALLE(ENSA_ID, ESDE_ITEM, ARTI_COD, BODE_COD, ESDE_CANT, ESDE_UNIDAD, ESDE_COSTO, ESDE_LOTE, ESDE_FACTOR, ESDE_IVAPORC, ESDE_IVAMONTO, ESDE_CONSUMO, ESDE_CODBAR, ESDE_ANULADO, ESDE_TRANSMIT, ESDE_DESC, ESDE_TOTAL, ESDE_PESO)
                VALUES (:idens, :ITEM, :codpr,  NEW.bode_cod, :cantpr, :unipr, :costo, NULL, :FACTOR, :IVA, :ivam, :consumo, :codpr, 'N', 'N', :despr, :COSTO * :cantpr, 0);
            END
        END
    if (NEW.mvar_cant <> 0) then
        COSTO = costotot / NEW.mvar_cant;
    else
        COSTO = 0;
    UPDATE ENSAMBLES SET ENSA_COSTO = :costo WHERE ENSA_ID = :idens;
    END
if (new.mvar_cons is null) then
    NEW.mvar_cons = GEN_ID(ID_MOVARTI,1);
END
^

SET TERM ; ^

/* 20100701 */
/* avise si forma de pago repetida en caja */

SET TERM ^ ;

CREATE OR ALTER TRIGGER CAMBIODOC_ENTRADAS_AI FOR CAMBIODOC_ENTRADAS
ACTIVE AFTER INSERT POSITION 0
AS
declare variable PREF VARCHAR(4);
declare variable NUMERO VARCHAR(6);
declare variable CAJA INTEGER;
declare variable FEC DATE;
declare variable CONC VARCHAR(60);
declare variable EXISTE INTEGER;
declare variable VALFP char(2);
BEGIN
if ((NEW.CADO_ID <> 0) AND (NEW.CDEN_ANULADO = 'N')) then
    BEGIN
    EXECUTE PROCEDURE LEE_CONFIGURACION('BANCOS','CONSIGNACIONES','VALIDAR FORMAS DE PAGO EN CAJA') RETURNING_VALUES (VALFP);
    SELECT PREF_PRE, CADO_NUMERO, CADO_FECHA, CADO_CONC, CAJA_ID
        FROM CAMBIO_DOCUMENTOS WHERE CADO_ID = NEW.CADO_ID INTO :PREF, :numero, :FEC, :CONC, :CAJA;
    if (EXISTS (select MOCA_ID from movimiento_caja where moca_tiporef = 63 and moca_idref = new.cado_id and caja_id = :CAJA)) then
        begin
        update movimiento_caja
            set moca_creditos = moca_creditos + new.cden_monto
            where moca_tiporef = 63 and moca_idref = new.cado_id and caja_id = :CAJA;
        end
    else
        INSERT INTO MOVIMIENTO_CAJA
            (MOCA_ID, CAJA_ID, MOCA_TIPOREF, MOCA_PREFREF, MOCA_NUMREF, MOCA_FECHA, MOCA_CONC, MOCA_DEBITOS, MOCA_CREDITOS, MOCA_DB, MOCA_IDREF)
            VALUES(GEN_ID(ID_MOVCAJA,1), :CAJA, 63, :Pref, :Numero, :Fec, :Conc, 0, NEW.cden_monto, 'N', new.cado_id);
        
    /* ACTUALICE LA SALIDA DEL DOCUMENTO */
    if (NEW.FOPA_ID <> 1) then
      BEGIN
      SELECT COUNT(DPCA_ID) FROM DOCUMENTOS_PAGO_CAJA WHERE CAJA_ID = :CAJA AND NEW. FOPA_ID = NEW.FOPA_ID AND DPCA_BANCO = NEW.CDEN_BANCO AND DPCA_CUENTA = NEW.CDEN_CUENTA AND
            DPCA_NUMERO = NEW.CDEN_NUMERO AND DPCA_TIPOSAL = 0 AND DPCA_IDSAL = 0 INTO :EXISTE;
      if (EXISTE = 1) then
        UPDATE DOCUMENTOS_PAGO_CAJA
            SET DPCA_TIPOSAL = 63, DPCA_IDSAL = NEW.cado_id
            WHERE CAJA_ID = :CAJA AND FOPA_ID = NEW.FOPA_ID AND DPCA_BANCO = NEW.CDEN_BANCO AND DPCA_CUENTA = NEW.CDEN_CUENTA AND
            DPCA_NUMERO = NEW.CDEN_NUMERO AND DPCA_TIPOSAL = 0 AND DPCA_IDSAL = 0 AND DPCA_MONTO = NEW.cden_monto;
      ELSE
        if (EXISTE = 0) then
            BEGIN
            IF (VALFP = 'SI') THEN
              EXCEPTION documento_pago_salido 'La forma de pago ' || new.cden_banco || ' ' || new.cden_cuenta || ' ' || new.cden_numero || ' no se encuentra en la caja.';
            END
        ELSE
            BEGIN
            EXCEPTION documento_registrado 'La forma de pago ' || new.cden_banco || ' ' || new.cden_cuenta || ' ' || new.cden_numero || ' se encuentra repetida en la caja' || :caja;
            END
      END
    ELSE
        EXECUTE PROCEDURE RESTE_SALDO_EFECTIVO(:CAJA, :FEC, NEW.CDEN_MONTO, 'N');
    END
END
^

SET TERM ; ^


/* 20100702 */
/* notas de clientes que generen compromiso en crm */
SET TERM ^ ;

CREATE OR ALTER TRIGGER NOTAS_CLIENTES_AI FOR NOTAS_CLIENTES
ACTIVE AFTER INSERT POSITION 0
as
declare variable ASESOR INTEGER;
begin
/* GENERE UN COMPROMISO DEL CRM */
if (NEW.nocl_alarma IS NOT NULL) then
    BEGIN
    ASESOR = NULL;
    SELECT VEND_COD FROM USUARIO U, CRM_ASESOR C WHERE USER_COD = USER AND VEND_COD = CRAS_ID INTO :ASESOR;
    if (ASESOR IS NOT NULL) then
        BEGIN
        INSERT INTO crm_compromisos(CRCO_NIT, CRCO_FECHA, CRCO_HORA, CRCO_TIPO, CRCO_OBS, CRCO_ASESOR, CRCO_CUMPLIDO, CRCO_ANULADO, CRCO_PRIORIDAD, CRCO_IDDOC, CRCO_TIPODOC)
            VALUES (NEW.terc_nit, NEW.nocl_fecha, '08:00', 890, NEW.nocl_texto, :ASESOR, 'N', 'N', 'C', NEW.nocl_iddoc, NEW.nocl_tipodoc);
        END
    END
end
^

SET TERM ; ^



/* 20100705 */
SET TERM ^ ;

CREATE OR ALTER TRIGGER SALDO_CAJA_AU FOR SALDO_CAJA
ACTIVE AFTER UPDATE POSITION 0
as
begin
  /* SI QUEDO EN CEROS EL MONTO Y LAS RETES, ELIMINE EL REGISTRO */
  if ((NEW.saca_debitos = 0) AND (NEW.saca_creditos = 0) AND (NEW.saca_saldo = 0)) then
        DELETE FROM SALDO_CAJA WHERE caja_id = NEW.caja_id and saca_fecha = new.saca_fecha;
end
^

SET TERM ; ^


/* 20100707 */

INSERT INTO CONFIGURACION (CONF_MODULO, CONF_CATEGORIA, CONF_PROPIEDAD, CONF_VALOR, CONF_POSIBLES, CONF_AYUDA) VALUES ('FACTURACION', 'PEDIDOS', 'NUMERO DE COPIAS A IMPRIMIR DE FORMA PREDETERMINADA', '1', '1,2,3,4,5', 'Indique el número de copias que se mandarán a la impresora de forma predeterminada');
commit work;

/* 20100708 */

SET TERM ^ ;

CREATE OR ALTER procedure CONSULTA_PUNTOS_CLIENTE (
    IDDOC integer,
    CLIENTE varchar(20),
    FECHA date)
returns (
    PTDOC integer,
    PTACUM integer,
    PTVENCER integer,
    FECPTOS date)
AS
declare variable numrows integer;
declare variable anos integer;
declare variable fecaux date;
declare variable fecaux2 date;
declare variable nitcontado varchar(20);
declare variable ok integer;
declare variable ptaux integer;
declare variable PTAGENCIA CHAR(2);
begin
ptdoc = 0;
ptacum = 0;
ptvencer = 0;
ok = 1;
if (IDDOC <> 0) then
    begin
    /* verifique que no sea cliente de contado de la autorización */
    select max(auto_nitcontado) from facturas f, autorizaciones a
        where f.pref_pre = a.pref_pre and fact_id = :iddoc into :nitcontado;
    if (cliente = nitcontado) then
        ok = 0;

    if (ok <> 0) then
        begin
        select count(ptcl_id) from puntos_cliente where ptcl_nit = :cliente and ptcl_tipodoc = 31 and ptcl_iddoc = :iddoc into :numrows;
        if (numrows <> 0) then
            begin
            select SUM(ptcl_db-ptcl_cr) from puntos_cliente where ptcl_nit = :cliente and ptcl_tipodoc = 31 and ptcl_iddoc = :iddoc into :ptdoc;
            end
        end
    end
/* los puntos totales */
EXECUTE PROCEDURE lee_configuracion ('FACTURACION', 'POS', 'MANEJAR TABLA DE PUNTOS DE CLIENTE ACUMULADOS PARA VARIAS AGENCIAS') returning_values (ptagencia);
if (PTAGENCIA = 'SI') then
    BEGIN
    SELECT PTCA_ACUMULADO, PTCA_PORVENCER, PTCA_FECHA FROM puntos_cliente_acumulado WHERE TERC_NIT = :cliente
        INTO :ptacum, :ptvencer, :fecptos;
    SUSPEND;
    END
ELSE
    BEGIN
    select first 1 ptcl_saldo + ptcl_db - ptcl_cr from puntos_cliente
        where ptcl_nit = :cliente and ptcl_fecha <= :fecha order by ptcl_fecha desc, PTCL_ID desc into :ptacum;
    /* los vencidos */
    execute procedure lee_configuracion('FACTURACION', 'FACTURAS', 'VENCIMIENTO DE PUNTOS POR CLIENTE EN AÑOS') returning_values (:anos);
    fecaux = fecha - (anos * 365);
    select first 1 ptcl_saldo + ptcl_db - ptcl_cr from puntos_cliente
        where ptcl_nit = :cliente and ptcl_fecha <= :fecaux order by ptcl_fecha desc, ptcl_id desc into :ptvencer;
    /* al saldo de hace n años restele las redenciones entre esa fecha y hoy */
    ptaux = 0;
    select sum(ptcl_cr) from puntos_cliente where ptcl_nit = :cliente and ptcl_fecha >= :fecaux and
        ptcl_fecha <= :fecha and ptcl_tipodoc = 81 into :ptaux;
    if (ptaux is null) then
        ptaux = 0;
    else
        if (ptaux > ptvencer) then
            begin
            PTAUX = PTAUX - ptvencer;
            ptvencer = 0;
            end
        else
            begin
            ptvencer = ptvencer - ptaux;
            ptaux = 0;
            end
    ptacum = ptacum - ptvencer;

    /* los por vencer */
    execute procedure lee_configuracion('FACTURACION', 'FACTURAS', 'VENCIMIENTO DE PUNTOS POR CLIENTE EN AÑOS') returning_values (:anos);
    fecaux = fecha - (anos * 365);
    fecaux2 = fecha - (anos * 365) + 30;
    select sum(ptcl_db - ptcl_cr) from puntos_cliente where ptcl_nit = :cliente and ptcl_fecha >= :fecaux and ptcl_fecha <= :fecaux2 into :ptvencer;
    if (ptvencer is null) then
        ptvencer = 0;
    ptvencer = ptvencer - ptaux;
    fecptos = :fecha;
    suspend;
    END
end
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE IMPR_FACTURA(
    ID INTEGER)
RETURNS (
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    VENCE DATE,
    DIASVENCE INTEGER,
    CONTCRED CHAR(17),
    NIT VARCHAR(20),
    NOMTERCERO VARCHAR(60),
    NOMCLIENTE VARCHAR(60),
    VENDEDOR INTEGER,
    NOMVENDEDOR VARCHAR(60),
    PUNTOVTA INTEGER,
    NOMPUNTOVTA VARCHAR(60),
    CODBODEGA VARCHAR(2),
    NOMBODEGA VARCHAR(30),
    AUTORIZACION VARCHAR(20),
    DESPACHO VARCHAR(255),
    TRANSPORTADOR VARCHAR(60),
    COTIZACION VARCHAR(30),
    PEDIDO VARCHAR(30),
    REMISION VARCHAR(30),
    PACIENTE VARCHAR(20),
    NOMPACIENTE VARCHAR(60),
    COMIPORC NUMERIC(9,2),
    COMIMONTO NUMERIC(18,2),
    SUBTOTAL NUMERIC(18,2),
    INGTERCEROS NUMERIC(18,2),
    INGPROPIOS NUMERIC(18,2),
    DTOPORC NUMERIC(9,2),
    DTOMONTO NUMERIC(18,2),
    ADICIONAL NUMERIC(18,2),
    IVAMONTO NUMERIC(18,2),
    RTEFTEPORC NUMERIC(9,2),
    RTEFTEMONTO NUMERIC(18,2),
    RTEIVAPORC NUMERIC(9,2),
    RTEIVAMONTO NUMERIC(18,2),
    RTEICAPORC NUMERIC(9,2),
    RTEICAMONTO NUMERIC(18,2),
    EXTRA NUMERIC(18,2),
    DTOFPORC NUMERIC(9,2),
    DTOFMONTO NUMERIC(18,2),
    FECHADTO DATE,
    ANTICIPO NUMERIC(18,2),
    RETGARANTIA NUMERIC(18,2),
    TOTALFAC NUMERIC(18,2),
    TOTALPAGAR NUMERIC(18,2),
    TOTALNETO NUMERIC(18,2),
    OBS BLOB SUB_TYPE 1 SEGMENT SIZE 80,
    ITEM INTEGER,
    ARTICULO VARCHAR(15),
    CODBAR VARCHAR(15),
    ARTIDES VARCHAR(60),
    DESCORTA VARCHAR(30),
    CANT NUMERIC(18,4),
    LOTE VARCHAR(15),
    VLOTE DATE,
    UNIDAD VARCHAR(8),
    CAJAS NUMERIC(18,4),
    FACTOR NUMERIC(18,4),
    LISTAPR INTEGER,
    REFITEM VARCHAR(60),
    BODITEM VARCHAR(2),
    STAND VARCHAR(20),
    PRUNIT NUMERIC(18,2),
    DTOITPORC NUMERIC(9,2),
    DTOITMONTO NUMERIC(18,2),
    PRNETO NUMERIC(18,2),
    PRNETOSINIVA NUMERIC(18,2),
    BASE NUMERIC(18,2),
    PORCBASE NUMERIC(9,2),
    DTOIT1 NUMERIC(9,2),
    DTOIT2 NUMERIC(9,2),
    DTOIT3 NUMERIC(9,2),
    IVAPORC NUMERIC(9,2),
    IVAITMONTO NUMERIC(18,2),
    CONSUMO NUMERIC(18,2),
    SUBTOTIT NUMERIC(18,2),
    TOTAL NUMERIC(18,2),
    PESOTOT NUMERIC(18,2),
    CODIGOCL VARCHAR(20),
    ZONACOD VARCHAR(2),
    ZONANOM VARCHAR(60),
    DV CHAR(1),
    DIRECCION VARCHAR(60),
    CIUDAD VARCHAR(40),
    TELEFONO VARCHAR(40),
    CONTACTO VARCHAR(60),
    FAX VARCHAR(25),
    CEL VARCHAR(25),
    GRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    SUBGRUPO VARCHAR(3),
    NOMSUBG VARCHAR(30),
    MARCA VARCHAR(3),
    NOMMARCA VARCHAR(30),
    PESO NUMERIC(18,4),
    ANCHO NUMERIC(18,4),
    ALTO NUMERIC(18,4),
    LARGO NUMERIC(18,4),
    SUMA1 NUMERIC(18,2),
    SUMA2 NUMERIC(18,2),
    SUMA3 NUMERIC(18,2),
    IVA1 NUMERIC(18,2),
    IVA2 NUMERIC(18,2),
    IVA3 NUMERIC(18,2),
    SUMAEX NUMERIC(18,2),
    SUMAGR NUMERIC(18,2),
    TOTCONSUMO NUMERIC(18,2),
    DTOIT1M NUMERIC(18,2),
    DTOIT2M NUMERIC(18,2),
    DTOIT3M NUMERIC(18,2),
    TOTCAJAS NUMERIC(18,2),
    TOTBASE NUMERIC(18,2),
    VEHICULO VARCHAR(8),
    RECIBIDO NUMERIC(18,2),
    CAMBIO NUMERIC(18,2),
    HORA TIME,
    FORMAPAGO1 VARCHAR(30),
    MONTOPAGO1 NUMERIC(18,2),
    FORMAPAGO2 VARCHAR(30),
    MONTOPAGO2 NUMERIC(18,2),
    FORMAPAGO3 VARCHAR(30),
    MONTOPAGO3 NUMERIC(18,2),
    PUNTOS INTEGER,
    PUNTOSACUM INTEGER,
    PUNTOSVENC INTEGER,
    FECPTOS DATE,
    OBSITEM BLOB SUB_TYPE 1 SEGMENT SIZE 80,
    SUCUR VARCHAR(10),
    ALTERNATIVAS NUMERIC(18,4),
    PRINCIPALES NUMERIC(18,4))
AS
DECLARE VARIABLE IMPTOS CHAR(1);
DECLARE VARIABLE TARIFA INTEGER;
declare variable DEVUELTO NUMERIC(18,2);
declare variable ORDENCOD CHAR(8);
declare variable IMPRDEV CHAR(2);
declare variable IMPR CHAR(1);
declare variable ITEMFP INTEGER;
declare variable FORMAP VARCHAR(30);
declare variable MONTOP NUMERIC(18,2);
declare variable ICOINC CHAR(2);
declare variable DTOITM1 NUMERIC(18,2);
declare variable DTOITM2 NUMERIC(18,2);
declare variable DTOITM3 NUMERIC(18,2);
declare variable DTOITE3 CHAR(2);
declare variable SUMDTOIT NUMERIC(18,2);
declare variable AUTORET VARCHAR(10);
declare variable FAUTORET DATE;
declare variable FACTCANT NUMERIC(18,4);
declare variable ANULADO CHAR(1);
declare variable INGTER CHAR(2);
BEGIN
execute procedure lee_configuracion('FACTURACION', 'ARTICULOS', 'IMPOCONSUMO INCLUIDO EN EL PRECIO BASE DE VENTA ANTES DE IVA') returning_values (icoinc);
execute procedure lee_configuracion('FACTURACION', 'FACTURAS', 'COLUMNAS DE DESCUENTO POR ITEM ADICIONALES') returning_values (DTOITE3);
execute procedure lee_configuracion('FACTURACION', 'FACTURAS', 'GRUPO DE MERCANCIA PARA INGRESOS DE TERCEROS') returning_values (INGTER);
SELECT F.PREF_PRE, FACT_NUMERO, FACT_FECHA, FACT_VENCE, F.BODE_COD, BODE_NOM, F.TERC_NIT, FACT_NOMCLIENTE, F.VEND_COD, VEND_NOMBRE, F.PTVT_ID, PTVT_NOM,
    AUTO_NUMERO, FACT_DESPACHO, FACT_TRANSP, FACT_COTIZACI, FACT_PEDIDO, FACT_REMISION, FACT_COMIPORC, FACT_COMIMONTO, FACT_IVAINC, 
    FACT_DTOPOR, FACT_DTOMONTO, FACT_ADICIONAL, FACT_IVAMONTO, FACT_RTFTEPOR, FACT_RTFTEMONTO, FACT_RTIVAPOR, FACT_RTIVAMONTO, FACT_RTICAPOR, FACT_RTICAMONTO, FACT_EXTRA, FACT_DTOFPOR, FACT_DTOFMONTO, FACT_DTOFFECHA, FACT_TOTAL,
    TERC_DIR, TERC_CIU, TERC_TEL, TERC_CONTACTO, TERC_FAX, TERC_DV, TERC_CEL, FACT_DTOIT1, FACT_DTOIT2, FACT_DTOIT3,
    FACT_OBS, VEHI_COD, /*FACT_NROCOPIA,*/ FACT_RECIBIDO, FACT_SUCURSAL, FACT_DETCLI, FACT_DETCLINOM, TERC_NOM, FACT_ANULADO, FACT_ANTICIPO, FACT_GARANTIA
    FROM FACTURAS F, BODEGA B, VENDEDORES V, PUNTO_VENTA P, TERCEROS T
    WHERE F.BODE_COD = B.BODE_COD AND F.VEND_COD = V.VEND_COD AND F.PTVT_ID = P.PTVT_ID AND F.TERC_NIT = T.TERC_NIT AND F.FACT_ID = :ID
    into :PREF, :NUMERO, :FECHA, :VENCE, :CODBODEGA, :NOMBODEGA, :NIT, :NOMTERCERO, :VENDEDOR, :NOMVENDEDOR, :PUNTOVTA, :NOMPUNTOVTA,
    :AUTORIZACION, :DESPACHO, :TRANSPORTADOR, :COTIZACION, :PEDIDO, :REMISION, :COMIPORC, :COMIMONTO, :IMPTOS,
    :DTOPORC, :DTOMONTO, :ADICIONAL, :IVAMONTO, :RTEFTEPORC, :RTEFTEMONTO, :RTEIVAPORC, :RTEIVAMONTO, :RTEICAPORC, :RTEICAMONTO, :EXTRA, :DTOFPORC, :DTOFMONTO, :FECHADTO, :TOTALFAC,
    :DIRECCION, :CIUDAD, :TELEFONO, :CONTACTO, :FAX, :DV, :CEL, :dtoit1m, :dtoit2m, :dtoit3m,
    :OBS, :VEHICULO,/* :NROCOPIA,*/ :RECIBIDO, :SUCUR, :paciente, :nompaciente, :nomcliente, :ANULADO, :anticipo, :retgarantia;

/* ACUMULE LOS PUNTOS, SE HACE ACA POR SER POSTERIOR AL DETALLE */
if (ANULADO = 'N') then
    EXECUTE PROCEDURE acumula_puntos_cliente (31, :id, :nit, :fecha) returning_values (:PUNTOS);
EXECUTE PROCEDURE consulta_puntos_cliente (:id, :nit, :fecha) returning_values (:puntos, :puntosacum, :puntosvenc, :fecptos);
if (DTOIT1M IS NULL) then
    DTOIT1M = 0;
if (DTOIT2M IS NULL) then
    DTOIT2M = 0;
if (DTOIT3M IS NULL) then
    DTOIT3M = 0;
SELECT CLIE_COD, C.ZONA_COD, ZONA_NOM
    FROM CLIENTES C, ZONAS Z
    WHERE TERC_NIT = :NIT AND C.ZONA_COD = Z.ZONA_COD
    INTO :CODIGOCL, :ZONACOD, :ZONANOM;
SELECT CLSU_DIR, CLSU_CIUDAD, CLSU_TEL FROM CLIENTE_SUCURSALES WHERE TERC_NIT = :NIT AND CLCU_COD = :SUCUR
    INTO :DIRECCION, :CIUDAD, :TELEFONO;
DIASVENCE = VENCE - FECHA;
if (DIASVENCE > 0) then
    CONTCRED = 'CREDITO ' || CAST(DIASVENCE AS VARCHAR(3)) || ' DIAS';
ELSE
    CONTCRED = 'CONTADO';
SUBTOTAL = TOTALFAC - EXTRA - IVAMONTO - ADICIONAL + DTOMONTO;
SELECT SUM(FADE_DTOMONTO*FADE_CANT) FROM FACTURAS_DETALLE WHERE FACT_ID = :id INTO :sumdtoit;
if (DTOITE3 = 'SI') then
    BEGIN
    SUBTOTAL = SUBTOTAL + sumdtoit + dtoit1m + dtoit2m + dtoit3m;
    END
if (INGTER <> '') then
    BEGIN
    SELECT SUM(FADE_TOTAL) FROM FACTURAS_DETALLE D, ARTICULO A WHERE A.arti_cod = D.arti_cod AND FACT_ID = :id AND GRUP_COD = :ingter
        INTO :ingterceros;
    INGPROPIOS = SUBTOTAL - INGTERCEROS;
    END
EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'FECHA AUTORETENEDOR NO DESCONTAR RETENCIONES DEL SALDO PERO SI CONTABILIZARLAS') returning_values (AUTORET);
if (AUTORET <> '') then
    FAUTORET = CAST(AUTORET AS DATE);
else
    FAUTORET = '9999/12/31';
if (FECHA > fautoret) then
    TOTALPAGAR = TOTALFAC - RTEIVAMONTO - RTEICAMONTO - ANTICIPO - RETGARANTIA;
ELSE
    TOTALPAGAR = TOTALFAC - RTEFTEMONTO - RTEIVAMONTO - RTEICAMONTO - ANTICIPO - RETGARANTIA;
TOTALNETO = TOTALFAC - ANTICIPO - RETGARANTIA;
if (RECIBIDO <> 0) then
    CAMBIO = RECIBIDO - totalpagar;
ELSE
    CAMBIO = 0;
SUMAEX = 0;
SUMA1 = 0;
SUMA2 = 0;
SUMA3 = 0;
IVA1 = 0;
IVA2 = 0;
IVA3 = 0;
TOTCONSUMO = 0;
MONTOPAGO1 = 0;
PESOTOT = 0;
SELECT MAX(AUDI_HORA) FROM AUDITORIA WHERE TIDO_COD = 31 AND AUDI_IDDOC = :ID AND AUDI_OPER = 'I' INTO :HORA;
/* AHORA LAS FORMAS DE PAGO, BUSQUE EL ABONO DE HOY A LA FACTURA */
ITEMFP = 1;
MONTOPAGO1 = 0;
MONTOPAGO2 = 0;
MONTOPAGO3 = 0;
FOR SELECT FOPA_NOM, RCPA_MONTO FROM RECIBOS_CAJA_PAGO P, FORMAS_PAGO F, RECIBOS_CAJA R, RECIBOS_CAJA_DETALLE D
    WHERE R.RECA_ID = P.RECA_ID AND R.RECA_ID = D.RECA_ID AND P.FOPA_ID = F.FOPA_ID AND RECA_FECHA = :FECHA AND RCDE_TIPODOC = 31 AND RCDE_IDDOC = :ID
    INTO :formap, :MONTOP
    DO
    BEGIN
    if (ITEMFP = 1) then
        BEGIN
        FORMAPAGO1 = FORMAP;
        MONTOPAGO1 = MONTOP;
        END
    if (ITEMFP = 2) then
        BEGIN
        FORMAPAGO2 = FORMAP;
        MONTOPAGO2 = MONTOP;
        END
    if (ITEMFP = 3) then
        BEGIN
        FORMAPAGO3 = FORMAP;
        MONTOPAGO3 = MONTOP;
        END
    ITEMFP = ITEMFP + 1;
    END
EXECUTE PROCEDURE lee_configuracion ('FACTURACION','DOCUMENTOS','ORDENAR ITEMS POR CODIGO DE ARTICULO') returning_values (:ORDENCOD);
EXECUTE PROCEDURE lee_configuracion ('FACTURACION','POS', 'IMPRIMIR DEVOLUCIONES DE ARTICULOS NEGATIVOS') returning_values (:imprdev);
totcajas = 0;
totbase = 0;
if (ORDENCOD = 'SI') then
    BEGIN
    FOR SELECT FADE_ITEM, D.ARTI_COD, FADE_CODBAR, SUBSTR(FADE_DESC,1,60), ARTI_DESCORTA, FADE_CANT, FADE_UNIDAD, FADE_FACTOR, BODE_COD, FADE_LOTE, LIPR_COD, FADE_PRUNIT, FADE_DTOPORC, FADE_DTOMONTO, FADE_IVAPORC, FADE_IVAMONTO, FADE_CONSUMO, FADE_TOTAL, FADE_REFERENCIA,
        GRUP_COD, SUBG_COD, MARC_COD, ARTI_PESO, ARTI_ANCHO, ARTI_ALTO, ARTI_LARGO, TAIV_COD, FADE_DEVUELTO, FADE_OBS, FADE_DTO1, FADE_DTO2, FADE_DTO3, FADE_DTOM1, FADE_DTOM2, FADE_DTOM3, FADE_CAJAS, FADE_BASE, FADE_PORCBASE
        FROM FACTURAS_DETALLE D, ARTICULO A
        WHERE D.ARTI_COD = A.ARTI_COD AND D.FACT_ID = :ID
        ORDER BY D.ARTI_COD
        INTO :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :DESCORTA, :CANT, :UNIDAD, :FACTOR, :BODITEM, :LOTE, :LISTAPR, :PRUNIT, :DTOITPORC, :DTOITMONTO, :IVAPORC, :IVAITMONTO, :CONSUMO, :TOTAL, :refitem,
        :GRUPO, :SUBGRUPO, :MARCA, :PESO, :ANCHO, :ALTO, :LARGO, :TARIFA, :devuelto, :obsitem, :dtoit1, :dtoit2, :dtoit3, :dtoitm1, :dtoitm2, :dtoitm3, :cajas, :base, :porcbase
        DO
          BEGIN
          if (ARTICULO = CODBAR) then
            SELECT FIRST 1 COBA_COD FROM barras_articulo WHERE ARTI_COD = :articulo INTO :CODBAR;
          if (IMPRDEV <> 'SI') then
            BEGIN
            if ((CANT >= 0) AND (DEVUELTO = 0)) then
                IMPR = 'S';
            ELSE
                IMPR = 'N'; /* ES DEVOLUCION */
            END
          ELSE
            IMPR = 'S';
          if (IMPR = 'S') then
            BEGIN
            prneto = PRUNIT - DTOITMONTO - dtoitm1 - dtoitm2 - dtoitm3;
            if (IMPTOS = 'S') then
                if (cant <> 0) then
                    prnetosiniva = PRUNIT - DTOITMONTO - ((IVAITMONTO+CONSUMO) / CANT) - dtoitm1 - dtoitm2 - dtoitm3;
                else
                    prnetosiniva = PRUNIT - DTOITMONTO - dtoitm1 - dtoitm2 - dtoitm3;
            ELSE
                prnetosiniva = PRUNIT - DTOITMONTO - dtoit1m - dtoit2m - dtoit3m;
            if (ICOINC = 'SI') then
                SUBTOTIT = TOTAL - IVAITMONTO;
            else
                SUBTOTIT = TOTAL - IVAITMONTO - CONSUMO;
            TOTCONSUMO = TOTCONSUMO + CONSUMO;
            TOTBASE = TOTBASE + BASE;
            SELECT LOTE_VENCE FROM LOTES WHERE LOTE_NRO = :lote AND ARTI_COD = :ARTICULO AND BODE_COD = :boditem INTO :vlote;
            if ((REFITEM <> '.t') or (REFITEM IS NULL)) then
                BEGIN
                /* NO SUME LOS ENSAMBLES */
                if (IVAPORC = 0) then
                    SUMAEX = SUMAEX + TOTAL;
                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;
                END
            if (ANCHO IS NULL) then
                ANCHO = 0;
            if (ALTO IS NULL) then
                ALTO = 0;
            if (LARGO IS NULL) then
                LARGO = 0;
            if (PESO IS NULL) then
                PESO = 0;
            PESO = (PESO / 1000) * CANT * FACTOR;
            PESOTOT = PESOTOT + PESO;
            totcajas = totcajas + cajas;
            if (substr(ARTICULO,1,2) = '.t') then
                BEGIN
                REFITEM = '';
                TOTAL = 0;
                SUBTOTIT = 0;
                END
            SELECT STAND_COD FROM STANDS WHERE ARTI_COD = :ARTICULO AND STAND_BODEGA = :boditem INTO :stand;
            factcant = NULL;
            SELECT FIRST 1 UNAR_FACCAN FROM unidad_articulo WHERE ARTI_COD = :articulo INTO :factcant;
            if (factcant IS NULL) then
                BEGIN
                ALTERNATIVAS = 0;
                PRINCIPALES = (CANT * FACTOR);
                END
            ELSE
                BEGIN
                ALTERNATIVAS = FLOOR(CANT * factor / factcant);
                PRINCIPALES = (CANT * FACTOR) - (alternativas * factcant);
                END
            SUSPEND;
            END
          END
    END
ELSE
  if (ORDENCOD = 'UNIDAD') then
    BEGIN
    FOR SELECT FADE_ITEM, D.ARTI_COD, FADE_CODBAR, SUBSTR(FADE_DESC,1,60), ARTI_DESCORTA, FADE_CANT, FADE_UNIDAD, FADE_FACTOR, BODE_COD, FADE_LOTE, LIPR_COD, FADE_PRUNIT, FADE_DTOPORC, FADE_DTOMONTO, FADE_IVAPORC, FADE_IVAMONTO, FADE_CONSUMO, FADE_TOTAL, FADE_REFERENCIA,
        GRUP_COD, SUBG_COD, MARC_COD, ARTI_PESO, ARTI_ANCHO, ARTI_ALTO, ARTI_LARGO, TAIV_COD, FADE_DEVUELTO, FADE_OBS, FADE_DTO1, FADE_DTO2, FADE_DTO3, FADE_DTOM1, FADE_DTOM2, FADE_DTOM3, FADE_CAJAS, FADE_BASE, FADE_PORCBASE
        FROM FACTURAS_DETALLE D, ARTICULO A
        WHERE D.ARTI_COD = A.ARTI_COD AND D.FACT_ID = :ID
        ORDER BY D.fade_unidad, D.fade_desc
        INTO :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :DESCORTA, :CANT, :UNIDAD, :FACTOR, :BODITEM, :LOTE, :LISTAPR, :PRUNIT, :DTOITPORC, :DTOITMONTO, :IVAPORC, :IVAITMONTO, :CONSUMO, :TOTAL, :refitem,
        :GRUPO, :SUBGRUPO, :MARCA, :PESO, :ANCHO, :ALTO, :LARGO, :TARIFA, :devuelto, :obsitem, :dtoit1, :dtoit2, :dtoit3, :dtoitm1, :dtoitm2, :dtoitm3, :cajas, :base, :porcbase
        DO
          BEGIN
          if (ARTICULO = CODBAR) then
            SELECT FIRST 1 COBA_COD FROM barras_articulo WHERE ARTI_COD = :articulo INTO :CODBAR;
          if (IMPRDEV <> 'SI') then
            BEGIN
            if ((CANT >= 0) AND (DEVUELTO = 0)) then
                IMPR = 'S';
            ELSE
                IMPR = 'N'; /* ES DEVOLUCION */
            END
          ELSE
            IMPR = 'S';
          if (IMPR = 'S') then
            BEGIN
            prneto = PRUNIT - DTOITMONTO - dtoitm1 - dtoitm2 - dtoitm3;
            if (IMPTOS = 'S') then
                if (cant <> 0) then
                    prnetosiniva = PRUNIT - DTOITMONTO - ((IVAITMONTO+CONSUMO) / CANT) - dtoitm1 - dtoitm2 - dtoitm3;
                else
                    prnetosiniva = PRUNIT - DTOITMONTO - dtoitm1 - dtoitm2 - dtoitm3;
            ELSE
                prnetosiniva = PRUNIT - DTOITMONTO - dtoit1m - dtoit2m - dtoit3m;
            if (ICOINC = 'SI') then
                SUBTOTIT = TOTAL - IVAITMONTO;
            else
                SUBTOTIT = TOTAL - IVAITMONTO - CONSUMO;
            TOTCONSUMO = TOTCONSUMO + CONSUMO;
            TOTBASE = TOTBASE + BASE;
            SELECT LOTE_VENCE FROM LOTES WHERE LOTE_NRO = :lote AND ARTI_COD = :ARTICULO AND BODE_COD = :boditem INTO :vlote;
            if ((REFITEM <> '.t') or (REFITEM IS NULL)) then
                BEGIN
                /* NO SUME LOS ENSAMBLES */
                if (IVAPORC = 0) then
                    SUMAEX = SUMAEX + TOTAL;
                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;
                END
            if (ANCHO IS NULL) then
                ANCHO = 0;
            if (ALTO IS NULL) then
                ALTO = 0;
            if (LARGO IS NULL) then
                LARGO = 0;
            if (PESO IS NULL) then
                PESO = 0;
            PESO = (PESO / 1000) * CANT * FACTOR;
            PESOTOT = PESOTOT + PESO;
            totcajas = totcajas + cajas;
            if (substr(ARTICULO,1,2) = '.t') then
                BEGIN
                REFITEM = '';
                TOTAL = 0;
                SUBTOTIT = 0;
                END
            SELECT STAND_COD FROM STANDS WHERE ARTI_COD = :ARTICULO AND STAND_BODEGA = :boditem INTO :stand;
            factcant = NULL;
            SELECT FIRST 1 UNAR_FACCAN FROM unidad_articulo WHERE ARTI_COD = :articulo INTO :factcant;
            if ((factcant IS NULL) or (factcant = 0)) then
                BEGIN
                ALTERNATIVAS = 0;
                PRINCIPALES = (CANT * FACTOR);
                END
            ELSE
                BEGIN
                ALTERNATIVAS = FLOOR(CANT * factor / factcant);
                PRINCIPALES = (CANT * FACTOR) - (alternativas * factcant);
                END
            SUSPEND;
            END
          END
    END
  ELSE
    BEGIN
    FOR SELECT FADE_ITEM, D.ARTI_COD, FADE_CODBAR, SUBSTR(FADE_DESC,1,60), ARTI_DESCORTA, FADE_CANT, FADE_UNIDAD, FADE_FACTOR, BODE_COD, FADE_LOTE, LIPR_COD, FADE_PRUNIT, FADE_DTOPORC, FADE_DTOMONTO, FADE_IVAPORC, FADE_IVAMONTO, FADE_CONSUMO, FADE_TOTAL, FADE_REFERENCIA,
        GRUP_COD, SUBG_COD, MARC_COD, ARTI_PESO, ARTI_ANCHO, ARTI_ALTO, ARTI_LARGO, TAIV_COD, FADE_DEVUELTO, FADE_OBS, FADE_DTO1, FADE_DTO2, FADE_DTO3, FADE_DTOM1, FADE_DTOM2, FADE_DTOM3, FADE_CAJAS, FADE_BASE, FADE_PORCBASE
        FROM FACTURAS_DETALLE D, ARTICULO A
        WHERE D.ARTI_COD = A.ARTI_COD AND D.FACT_ID = :ID
        ORDER BY FADE_ITEM
        INTO :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :DESCORTA, :CANT, :UNIDAD, :FACTOR, :BODITEM, :LOTE, :LISTAPR, :PRUNIT, :DTOITPORC, :DTOITMONTO, :IVAPORC, :IVAITMONTO, :CONSUMO, :TOTAL, :refitem,
        :GRUPO, :SUBGRUPO, :MARCA, :PESO, :ANCHO, :ALTO, :LARGO, :TARIFA, :devuelto, :obsitem, :dtoit1, :dtoit2, :dtoit3, :dtoitm1, :dtoitm2, :dtoitm3, :cajas, :base, :porcbase
        DO
          BEGIN
          if (IMPRDEV <> 'SI') then
            BEGIN
            if ((CANT >= 0) AND (DEVUELTO = 0)) then
                IMPR = 'S';
            ELSE
                IMPR = 'N'; /* ES DEVOLUCION */
            END
          ELSE
            IMPR = 'S';
          if (IMPR = 'S') then
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :GRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :MARCA INTO NOMMARCA;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :SUBGRUPO AND GRUP_COD = :GRUPO INTO :NOMSUBG;
            prneto = PRUNIT - DTOITMONTO - dtoitm1 - dtoitm2 - dtoitm3;
            if (IMPTOS = 'S') then
                if (cant <> 0) then
                    prnetosiniva = PRUNIT - DTOITMONTO - ((IVAITMONTO+CONSUMO) / CANT) - dtoit1m - dtoit2m - dtoit3m;
                else
                    prnetosiniva = PRUNIT - DTOITMONTO - dtoitm1 - dtoitm2 - dtoitm3;
            ELSE
                prnetosiniva = PRUNIT - DTOITMONTO - dtoitm1 - dtoitm2 - dtoitm3;
            if (ICOINC = 'SI') then
                SUBTOTIT = TOTAL - IVAITMONTO;
            else
                SUBTOTIT = TOTAL - IVAITMONTO - CONSUMO;
            TOTCONSUMO = TOTCONSUMO + CONSUMO;
            TOTBASE = TOTBASE + BASE;
            SELECT LOTE_VENCE FROM LOTES WHERE LOTE_NRO = :lote AND ARTI_COD = :ARTICULO AND BODE_COD = :boditem INTO :vlote;
            if ((REFITEM <> '.t') or (REFITEM IS NULL)) then
                BEGIN
                /* NO SUME LOS ENSAMBLES */
                if (IVAPORC = 0) then
                    SUMAEX = SUMAEX + TOTAL;
                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;
                END
            if (ANCHO IS NULL) then
                ANCHO = 0;
            if (ALTO IS NULL) then
                ALTO = 0;
            if (LARGO IS NULL) then
                LARGO = 0;
            if (PESO IS NULL) then
                PESO = 0;
            PESO = (PESO / 1000)* CANT * FACTOR;
            PESOTOT = PESOTOT + PESO;
            totcajas = totcajas + cajas;
            if (substr(ARTICULO,1,2) = '.t') then
                BEGIN
                REFITEM = '';
                TOTAL = 0;
                SUBTOTIT = 0;
                END
            SELECT STAND_COD FROM STANDS WHERE ARTI_COD = :ARTICULO AND STAND_BODEGA = :boditem INTO :stand;
            factcant = NULL;
            SELECT FIRST 1 UNAR_FACCAN FROM unidad_articulo WHERE ARTI_COD = :articulo INTO :factcant;
            if ((factcant IS NULL) or (factcant = 0)) then
                BEGIN
                ALTERNATIVAS = 0;
                PRINCIPALES = (CANT * FACTOR);
                END
            ELSE
                BEGIN
                ALTERNATIVAS = FLOOR(CANT * factor / factcant);
                PRINCIPALES = (CANT * FACTOR) - (alternativas * factcant);
                END
            SUSPEND;
            END
          END
    END
END

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE IMPR_REDENCION(
    ID INTEGER)
RETURNS (
    NUMERO VARCHAR(6),
    FECHA DATE,
    NIT VARCHAR(20),
    NOMCLIENTE VARCHAR(60),
    DIR VARCHAR(60),
    TEL VARCHAR(60),
    PREMIO VARCHAR(15),
    NOMPREMIO VARCHAR(60),
    PUNTOS INTEGER,
    PUNTOSACUM INTEGER,
    PUNTOSVENC INTEGER,
    FECPTOS DATE)
AS
declare variable puntosaux INTEGER;
begin
SELECT PTRE_NUMERO, PTRE_FECHA, PTRE_NIT, TERC_NOM, TERC_DIR, TERC_TEL, R.PTPR_COD, PTPR_NOMBRE, PTRE_PUNTOS
    FROM PUNTOS_REDENCION R, puntos_premios P, TERCEROS T
    WHERE R.ptre_nit = T.terc_nit AND R.ptpr_cod = P.ptpr_cod AND R.ptre_id = :ID
    INTO :NUMERO, :FECHA, :NIT, :NOMCLIENTE, :DIR, :TEL, :PREMIO, :NOMPREMIO, :PUNTOS;
EXECUTE PROCEDURE consulta_puntos_cliente (0, :nit, :fecha) returning_values (:puntosaux, :puntosacum, :puntosvenc, :fecptos);
suspend;
end

^

SET TERM ; ^

SET TERM ^ ;

create or alter procedure RESUMEN_PUNTOS_TX (
    FECHA date)
returns (
    CLIENTE varchar(20),
    PTACUM numeric(18,2),
    PTVENCER numeric(18,2))
AS
declare variable ANOS INTEGER;
declare variable FECAUX DATE;
declare variable FECAUX2 DATE;
declare variable PTAUX NUMERIC(18,2);
begin
execute procedure lee_configuracion('FACTURACION', 'FACTURAS', 'VENCIMIENTO DE PUNTOS POR CLIENTE EN AÑOS') returning_values (:anos);
FOR SELECT DISTINCT PTCL_NIT FROM PUNTOS_CLIENTE
    INTO :CLIENTE
    DO
    BEGIN
    select first 1 ptcl_saldo + ptcl_db - ptcl_cr from puntos_cliente
        where ptcl_nit = :cliente and ptcl_fecha <= :fecha order by ptcl_fecha desc, PTCL_ID desc into :ptacum;
    /* los vencidos */
    fecaux = fecha - (anos * 365);
    select first 1 ptcl_saldo + ptcl_db - ptcl_cr from puntos_cliente
        where ptcl_nit = :cliente and ptcl_fecha <= :fecaux order by ptcl_fecha desc, ptcl_id desc into :ptvencer;
    /* al saldo de hace n años restele las redenciones entre esa fecha y hoy */
    ptaux = 0;
    select sum(ptcl_cr) from puntos_cliente where ptcl_nit = :cliente and ptcl_fecha >= :fecaux and
        ptcl_fecha <= :fecha and ptcl_tipodoc = 81 into :ptaux;
    if (ptaux is null) then
        ptaux = 0;
    else
        if (ptaux > ptvencer) then
            begin
            PTAUX = PTAUX - ptvencer;
            ptvencer = 0;
            end
        else
            begin
            ptvencer = ptvencer - ptaux;
            ptaux = 0;
            end
    ptacum = ptacum - ptvencer;

    /* los por vencer */
    fecaux = fecha - (anos * 365);
    fecaux2 = fecha - (anos * 365) + 30;
    select sum(ptcl_db - ptcl_cr) from puntos_cliente where ptcl_nit = :cliente and ptcl_fecha >= :fecaux and ptcl_fecha <= :fecaux2 into :ptvencer;
    if (ptvencer is null) then
        ptvencer = 0;
    ptvencer = ptvencer - ptaux;
    if ((ptacum <> 0) and (ptvencer <> 0)) then
        suspend;
    end
end
^

SET TERM ; ^


SET TERM ^ ;

CREATE OR ALTER procedure ACTUALIZA_PUNTOS_ACUMULADOS (
    CLIENTE varchar(20),
    FECHA date,
    PTOSVIG numeric(18,2),
    PTOSXVE numeric(18,2))
AS
declare variable NUMROWS INTEGER;
begin
SELECT COUNT(*) FROM puntos_cliente_acumulado WHERE TERC_NIT = :CLIENTE INTO NUMROWS;
if (NUMROWS = 0) then
    INSERT INTO puntos_cliente_acumulado (TERC_NIT, PTCA_FECHA, PTCA_ACUMULADO, PTCA_PORVENCER)
        VALUES (:CLIENTE, :FECHA, :ptosvig, 0);
ELSE
    UPDATE puntos_cliente_acumulado
        SET PTCA_FECHA = :FECHA,
        PTCA_ACUMULADO = PTCA_ACUMULADO + :ptosvig,
        PTCA_PORVENCER = PTCA_PORVENCER - :ptosxve
        WHERE TERC_NIT = :CLIENTE;
end
^

SET TERM ; ^


/* 20100708B */
/* NO IMPRIMA PUNTOS DEL CLIENTE DE CONTADO */
SET TERM ^ ;

CREATE OR ALTER procedure CONSULTA_PUNTOS_CLIENTE (
    IDDOC integer,
    CLIENTE varchar(20),
    FECHA date)
returns (
    PTDOC integer,
    PTACUM integer,
    PTVENCER integer,
    FECPTOS date)
AS
declare variable numrows integer;
declare variable anos integer;
declare variable fecaux date;
declare variable fecaux2 date;
declare variable nitcontado varchar(20);
declare variable ok integer;
declare variable ptaux integer;
declare variable PTAGENCIA CHAR(2);
begin
ptdoc = 0;
ptacum = 0;
ptvencer = 0;
FECPTOS = :FECHA;
ok = 1;
if (IDDOC <> 0) then
    begin
    /* verifique que no sea cliente de contado de la autorización */
    select max(auto_nitcontado) from facturas f, autorizaciones a
        where f.pref_pre = a.pref_pre and fact_id = :iddoc into :nitcontado;
    if (cliente = nitcontado) then
        ok = 0;

    if (ok <> 0) then
        begin
        select count(ptcl_id) from puntos_cliente where ptcl_nit = :cliente and ptcl_tipodoc = 31 and ptcl_iddoc = :iddoc into :numrows;
        if (numrows <> 0) then
            begin
            select SUM(ptcl_db-ptcl_cr) from puntos_cliente where ptcl_nit = :cliente and ptcl_tipodoc = 31 and ptcl_iddoc = :iddoc into :ptdoc;
            end
        end
    end
/* los puntos totales */
if (ok <> 0) then
  BEGIN
  EXECUTE PROCEDURE lee_configuracion ('FACTURACION', 'POS', 'MANEJAR TABLA DE PUNTOS DE CLIENTE ACUMULADOS PARA VARIAS AGENCIAS') returning_values (ptagencia);
  if (PTAGENCIA = 'SI') then
    BEGIN
    SELECT PTCA_ACUMULADO, PTCA_PORVENCER, PTCA_FECHA FROM puntos_cliente_acumulado WHERE TERC_NIT = :cliente
        INTO :ptacum, :ptvencer, :fecptos;
    SUSPEND;
    END
  ELSE
    BEGIN
    select first 1 ptcl_saldo + ptcl_db - ptcl_cr from puntos_cliente
        where ptcl_nit = :cliente and ptcl_fecha <= :fecha order by ptcl_fecha desc, PTCL_ID desc into :ptacum;
    /* los vencidos */
    execute procedure lee_configuracion('FACTURACION', 'FACTURAS', 'VENCIMIENTO DE PUNTOS POR CLIENTE EN AÑOS') returning_values (:anos);
    fecaux = fecha - (anos * 365);
    select first 1 ptcl_saldo + ptcl_db - ptcl_cr from puntos_cliente
        where ptcl_nit = :cliente and ptcl_fecha <= :fecaux order by ptcl_fecha desc, ptcl_id desc into :ptvencer;
    /* al saldo de hace n años restele las redenciones entre esa fecha y hoy */
    ptaux = 0;
    select sum(ptcl_cr) from puntos_cliente where ptcl_nit = :cliente and ptcl_fecha >= :fecaux and
        ptcl_fecha <= :fecha and ptcl_tipodoc = 81 into :ptaux;
    if (ptaux is null) then
        ptaux = 0;
    else
        if (ptaux > ptvencer) then
            begin
            PTAUX = PTAUX - ptvencer;
            ptvencer = 0;
            end
        else
            begin
            ptvencer = ptvencer - ptaux;
            ptaux = 0;
            end
    ptacum = ptacum - ptvencer;

    /* los por vencer */
    execute procedure lee_configuracion('FACTURACION', 'FACTURAS', 'VENCIMIENTO DE PUNTOS POR CLIENTE EN AÑOS') returning_values (:anos);
    fecaux = fecha - (anos * 365);
    fecaux2 = fecha - (anos * 365) + 30;
    select sum(ptcl_db - ptcl_cr) from puntos_cliente where ptcl_nit = :cliente and ptcl_fecha >= :fecaux and ptcl_fecha <= :fecaux2 into :ptvencer;
    if (ptvencer is null) then
        ptvencer = 0;
    ptvencer = ptvencer - ptaux;
    fecptos = :fecha;
    suspend;
    END
  END
ELSE
    SUSPEND;
end
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE IMPR_FACTURA(
    ID INTEGER)
RETURNS (
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    VENCE DATE,
    DIASVENCE INTEGER,
    CONTCRED CHAR(17),
    NIT VARCHAR(20),
    NOMTERCERO VARCHAR(60),
    NOMCLIENTE VARCHAR(60),
    VENDEDOR INTEGER,
    NOMVENDEDOR VARCHAR(60),
    PUNTOVTA INTEGER,
    NOMPUNTOVTA VARCHAR(60),
    CODBODEGA VARCHAR(2),
    NOMBODEGA VARCHAR(30),
    AUTORIZACION VARCHAR(20),
    DESPACHO VARCHAR(255),
    TRANSPORTADOR VARCHAR(60),
    COTIZACION VARCHAR(30),
    PEDIDO VARCHAR(30),
    REMISION VARCHAR(30),
    PACIENTE VARCHAR(20),
    NOMPACIENTE VARCHAR(60),
    COMIPORC NUMERIC(9,2),
    COMIMONTO NUMERIC(18,2),
    SUBTOTAL NUMERIC(18,2),
    INGTERCEROS NUMERIC(18,2),
    INGPROPIOS NUMERIC(18,2),
    DTOPORC NUMERIC(9,2),
    DTOMONTO NUMERIC(18,2),
    ADICIONAL NUMERIC(18,2),
    IVAMONTO NUMERIC(18,2),
    RTEFTEPORC NUMERIC(9,2),
    RTEFTEMONTO NUMERIC(18,2),
    RTEIVAPORC NUMERIC(9,2),
    RTEIVAMONTO NUMERIC(18,2),
    RTEICAPORC NUMERIC(9,2),
    RTEICAMONTO NUMERIC(18,2),
    EXTRA NUMERIC(18,2),
    DTOFPORC NUMERIC(9,2),
    DTOFMONTO NUMERIC(18,2),
    FECHADTO DATE,
    ANTICIPO NUMERIC(18,2),
    RETGARANTIA NUMERIC(18,2),
    TOTALFAC NUMERIC(18,2),
    TOTALPAGAR NUMERIC(18,2),
    TOTALNETO NUMERIC(18,2),
    OBS BLOB SUB_TYPE 1 SEGMENT SIZE 80,
    ITEM INTEGER,
    ARTICULO VARCHAR(15),
    CODBAR VARCHAR(15),
    ARTIDES VARCHAR(60),
    DESCORTA VARCHAR(30),
    CANT NUMERIC(18,4),
    LOTE VARCHAR(15),
    VLOTE DATE,
    UNIDAD VARCHAR(8),
    CAJAS NUMERIC(18,4),
    FACTOR NUMERIC(18,4),
    LISTAPR INTEGER,
    REFITEM VARCHAR(60),
    BODITEM VARCHAR(2),
    STAND VARCHAR(20),
    PRUNIT NUMERIC(18,2),
    DTOITPORC NUMERIC(9,2),
    DTOITMONTO NUMERIC(18,2),
    PRNETO NUMERIC(18,2),
    PRNETOSINIVA NUMERIC(18,2),
    BASE NUMERIC(18,2),
    PORCBASE NUMERIC(9,2),
    DTOIT1 NUMERIC(9,2),
    DTOIT2 NUMERIC(9,2),
    DTOIT3 NUMERIC(9,2),
    IVAPORC NUMERIC(9,2),
    IVAITMONTO NUMERIC(18,2),
    CONSUMO NUMERIC(18,2),
    SUBTOTIT NUMERIC(18,2),
    TOTAL NUMERIC(18,2),
    PESOTOT NUMERIC(18,2),
    CODIGOCL VARCHAR(20),
    ZONACOD VARCHAR(2),
    ZONANOM VARCHAR(60),
    DV CHAR(1),
    DIRECCION VARCHAR(60),
    CIUDAD VARCHAR(40),
    TELEFONO VARCHAR(40),
    CONTACTO VARCHAR(60),
    FAX VARCHAR(25),
    CEL VARCHAR(25),
    GRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    SUBGRUPO VARCHAR(3),
    NOMSUBG VARCHAR(30),
    MARCA VARCHAR(3),
    NOMMARCA VARCHAR(30),
    PESO NUMERIC(18,4),
    ANCHO NUMERIC(18,4),
    ALTO NUMERIC(18,4),
    LARGO NUMERIC(18,4),
    SUMA1 NUMERIC(18,2),
    SUMA2 NUMERIC(18,2),
    SUMA3 NUMERIC(18,2),
    IVA1 NUMERIC(18,2),
    IVA2 NUMERIC(18,2),
    IVA3 NUMERIC(18,2),
    SUMAEX NUMERIC(18,2),
    SUMAGR NUMERIC(18,2),
    TOTCONSUMO NUMERIC(18,2),
    DTOIT1M NUMERIC(18,2),
    DTOIT2M NUMERIC(18,2),
    DTOIT3M NUMERIC(18,2),
    TOTCAJAS NUMERIC(18,2),
    TOTBASE NUMERIC(18,2),
    VEHICULO VARCHAR(8),
    RECIBIDO NUMERIC(18,2),
    CAMBIO NUMERIC(18,2),
    HORA TIME,
    FORMAPAGO1 VARCHAR(30),
    MONTOPAGO1 NUMERIC(18,2),
    FORMAPAGO2 VARCHAR(30),
    MONTOPAGO2 NUMERIC(18,2),
    FORMAPAGO3 VARCHAR(30),
    MONTOPAGO3 NUMERIC(18,2),
    PUNTOS INTEGER,
    PUNTOSACUM INTEGER,
    PUNTOSVENC INTEGER,
    FECPTOS DATE,
    OBSITEM BLOB SUB_TYPE 1 SEGMENT SIZE 80,
    SUCUR VARCHAR(10),
    ALTERNATIVAS NUMERIC(18,4),
    PRINCIPALES NUMERIC(18,4))
AS
DECLARE VARIABLE IMPTOS CHAR(1);
DECLARE VARIABLE TARIFA INTEGER;
declare variable DEVUELTO NUMERIC(18,2);
declare variable ORDENCOD CHAR(8);
declare variable IMPRDEV CHAR(2);
declare variable IMPR CHAR(1);
declare variable ITEMFP INTEGER;
declare variable FORMAP VARCHAR(30);
declare variable MONTOP NUMERIC(18,2);
declare variable ICOINC CHAR(2);
declare variable DTOITM1 NUMERIC(18,2);
declare variable DTOITM2 NUMERIC(18,2);
declare variable DTOITM3 NUMERIC(18,2);
declare variable DTOITE3 CHAR(2);
declare variable SUMDTOIT NUMERIC(18,2);
declare variable AUTORET VARCHAR(10);
declare variable FAUTORET DATE;
declare variable FACTCANT NUMERIC(18,4);
declare variable ANULADO CHAR(1);
declare variable INGTER CHAR(2);
BEGIN
execute procedure lee_configuracion('FACTURACION', 'ARTICULOS', 'IMPOCONSUMO INCLUIDO EN EL PRECIO BASE DE VENTA ANTES DE IVA') returning_values (icoinc);
execute procedure lee_configuracion('FACTURACION', 'FACTURAS', 'COLUMNAS DE DESCUENTO POR ITEM ADICIONALES') returning_values (DTOITE3);
execute procedure lee_configuracion('FACTURACION', 'FACTURAS', 'GRUPO DE MERCANCIA PARA INGRESOS DE TERCEROS') returning_values (INGTER);
SELECT F.PREF_PRE, FACT_NUMERO, FACT_FECHA, FACT_VENCE, F.BODE_COD, BODE_NOM, F.TERC_NIT, FACT_NOMCLIENTE, F.VEND_COD, VEND_NOMBRE, F.PTVT_ID, PTVT_NOM,
    AUTO_NUMERO, FACT_DESPACHO, FACT_TRANSP, FACT_COTIZACI, FACT_PEDIDO, FACT_REMISION, FACT_COMIPORC, FACT_COMIMONTO, FACT_IVAINC, 
    FACT_DTOPOR, FACT_DTOMONTO, FACT_ADICIONAL, FACT_IVAMONTO, FACT_RTFTEPOR, FACT_RTFTEMONTO, FACT_RTIVAPOR, FACT_RTIVAMONTO, FACT_RTICAPOR, FACT_RTICAMONTO, FACT_EXTRA, FACT_DTOFPOR, FACT_DTOFMONTO, FACT_DTOFFECHA, FACT_TOTAL,
    TERC_DIR, TERC_CIU, TERC_TEL, TERC_CONTACTO, TERC_FAX, TERC_DV, TERC_CEL, FACT_DTOIT1, FACT_DTOIT2, FACT_DTOIT3,
    FACT_OBS, VEHI_COD, /*FACT_NROCOPIA,*/ FACT_RECIBIDO, FACT_SUCURSAL, FACT_DETCLI, FACT_DETCLINOM, TERC_NOM, FACT_ANULADO, FACT_ANTICIPO, FACT_GARANTIA
    FROM FACTURAS F, BODEGA B, VENDEDORES V, PUNTO_VENTA P, TERCEROS T
    WHERE F.BODE_COD = B.BODE_COD AND F.VEND_COD = V.VEND_COD AND F.PTVT_ID = P.PTVT_ID AND F.TERC_NIT = T.TERC_NIT AND F.FACT_ID = :ID
    into :PREF, :NUMERO, :FECHA, :VENCE, :CODBODEGA, :NOMBODEGA, :NIT, :NOMTERCERO, :VENDEDOR, :NOMVENDEDOR, :PUNTOVTA, :NOMPUNTOVTA,
    :AUTORIZACION, :DESPACHO, :TRANSPORTADOR, :COTIZACION, :PEDIDO, :REMISION, :COMIPORC, :COMIMONTO, :IMPTOS,
    :DTOPORC, :DTOMONTO, :ADICIONAL, :IVAMONTO, :RTEFTEPORC, :RTEFTEMONTO, :RTEIVAPORC, :RTEIVAMONTO, :RTEICAPORC, :RTEICAMONTO, :EXTRA, :DTOFPORC, :DTOFMONTO, :FECHADTO, :TOTALFAC,
    :DIRECCION, :CIUDAD, :TELEFONO, :CONTACTO, :FAX, :DV, :CEL, :dtoit1m, :dtoit2m, :dtoit3m,
    :OBS, :VEHICULO,/* :NROCOPIA,*/ :RECIBIDO, :SUCUR, :paciente, :nompaciente, :nomcliente, :ANULADO, :anticipo, :retgarantia;

/* ACUMULE LOS PUNTOS, SE HACE ACA POR SER POSTERIOR AL DETALLE */
if (ANULADO = 'N') then
    EXECUTE PROCEDURE acumula_puntos_cliente (31, :id, :nit, :fecha) returning_values (:PUNTOS);
EXECUTE PROCEDURE consulta_puntos_cliente (:id, :nit, :fecha) returning_values (:puntos, :puntosacum, :puntosvenc, :fecptos);
if (DTOIT1M IS NULL) then
    DTOIT1M = 0;
if (DTOIT2M IS NULL) then
    DTOIT2M = 0;
if (DTOIT3M IS NULL) then
    DTOIT3M = 0;
SELECT CLIE_COD, C.ZONA_COD, ZONA_NOM
    FROM CLIENTES C, ZONAS Z
    WHERE TERC_NIT = :NIT AND C.ZONA_COD = Z.ZONA_COD
    INTO :CODIGOCL, :ZONACOD, :ZONANOM;
SELECT CLSU_DIR, CLSU_CIUDAD, CLSU_TEL FROM CLIENTE_SUCURSALES WHERE TERC_NIT = :NIT AND CLCU_COD = :SUCUR
    INTO :DIRECCION, :CIUDAD, :TELEFONO;
DIASVENCE = VENCE - FECHA;
if (DIASVENCE > 0) then
    CONTCRED = 'CREDITO ' || CAST(DIASVENCE AS VARCHAR(3)) || ' DIAS';
ELSE
    CONTCRED = 'CONTADO';
SUBTOTAL = TOTALFAC - EXTRA - IVAMONTO - ADICIONAL + DTOMONTO;
SELECT SUM(FADE_DTOMONTO*FADE_CANT) FROM FACTURAS_DETALLE WHERE FACT_ID = :id INTO :sumdtoit;
if (DTOITE3 = 'SI') then
    BEGIN
    SUBTOTAL = SUBTOTAL + sumdtoit + dtoit1m + dtoit2m + dtoit3m;
    END
if (INGTER <> '') then
    BEGIN
    SELECT SUM(FADE_TOTAL) FROM FACTURAS_DETALLE D, ARTICULO A WHERE A.arti_cod = D.arti_cod AND FACT_ID = :id AND GRUP_COD = :ingter
        INTO :ingterceros;
    INGPROPIOS = SUBTOTAL - INGTERCEROS;
    END
EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'FECHA AUTORETENEDOR NO DESCONTAR RETENCIONES DEL SALDO PERO SI CONTABILIZARLAS') returning_values (AUTORET);
if (AUTORET <> '') then
    FAUTORET = CAST(AUTORET AS DATE);
else
    FAUTORET = '9999/12/31';
if (FECHA > fautoret) then
    TOTALPAGAR = TOTALFAC - RTEIVAMONTO - RTEICAMONTO - ANTICIPO - RETGARANTIA;
ELSE
    TOTALPAGAR = TOTALFAC - RTEFTEMONTO - RTEIVAMONTO - RTEICAMONTO - ANTICIPO - RETGARANTIA;
TOTALNETO = TOTALFAC - ANTICIPO - RETGARANTIA;
if (RECIBIDO <> 0) then
    CAMBIO = RECIBIDO - totalpagar;
ELSE
    CAMBIO = 0;
SUMAEX = 0;
SUMA1 = 0;
SUMA2 = 0;
SUMA3 = 0;
IVA1 = 0;
IVA2 = 0;
IVA3 = 0;
TOTCONSUMO = 0;
MONTOPAGO1 = 0;
PESOTOT = 0;
SELECT MAX(AUDI_HORA) FROM AUDITORIA WHERE TIDO_COD = 31 AND AUDI_IDDOC = :ID AND AUDI_OPER = 'I' INTO :HORA;
/* AHORA LAS FORMAS DE PAGO, BUSQUE EL ABONO DE HOY A LA FACTURA */
ITEMFP = 1;
MONTOPAGO1 = 0;
MONTOPAGO2 = 0;
MONTOPAGO3 = 0;
FOR SELECT FOPA_NOM, RCPA_MONTO FROM RECIBOS_CAJA_PAGO P, FORMAS_PAGO F, RECIBOS_CAJA R, RECIBOS_CAJA_DETALLE D
    WHERE R.RECA_ID = P.RECA_ID AND R.RECA_ID = D.RECA_ID AND P.FOPA_ID = F.FOPA_ID AND RECA_FECHA = :FECHA AND RCDE_TIPODOC = 31 AND RCDE_IDDOC = :ID
    INTO :formap, :MONTOP
    DO
    BEGIN
    if (ITEMFP = 1) then
        BEGIN
        FORMAPAGO1 = FORMAP;
        MONTOPAGO1 = MONTOP;
        END
    if (ITEMFP = 2) then
        BEGIN
        FORMAPAGO2 = FORMAP;
        MONTOPAGO2 = MONTOP;
        END
    if (ITEMFP = 3) then
        BEGIN
        FORMAPAGO3 = FORMAP;
        MONTOPAGO3 = MONTOP;
        END
    ITEMFP = ITEMFP + 1;
    END
EXECUTE PROCEDURE lee_configuracion ('FACTURACION','DOCUMENTOS','ORDENAR ITEMS POR CODIGO DE ARTICULO') returning_values (:ORDENCOD);
EXECUTE PROCEDURE lee_configuracion ('FACTURACION','POS', 'IMPRIMIR DEVOLUCIONES DE ARTICULOS NEGATIVOS') returning_values (:imprdev);
totcajas = 0;
totbase = 0;
if (ORDENCOD = 'SI') then
    BEGIN
    FOR SELECT FADE_ITEM, D.ARTI_COD, FADE_CODBAR, SUBSTR(FADE_DESC,1,60), ARTI_DESCORTA, FADE_CANT, FADE_UNIDAD, FADE_FACTOR, BODE_COD, FADE_LOTE, LIPR_COD, FADE_PRUNIT, FADE_DTOPORC, FADE_DTOMONTO, FADE_IVAPORC, FADE_IVAMONTO, FADE_CONSUMO, FADE_TOTAL, FADE_REFERENCIA,
        GRUP_COD, SUBG_COD, MARC_COD, ARTI_PESO, ARTI_ANCHO, ARTI_ALTO, ARTI_LARGO, TAIV_COD, FADE_DEVUELTO, FADE_OBS, FADE_DTO1, FADE_DTO2, FADE_DTO3, FADE_DTOM1, FADE_DTOM2, FADE_DTOM3, FADE_CAJAS, FADE_BASE, FADE_PORCBASE
        FROM FACTURAS_DETALLE D, ARTICULO A
        WHERE D.ARTI_COD = A.ARTI_COD AND D.FACT_ID = :ID
        ORDER BY D.ARTI_COD
        INTO :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :DESCORTA, :CANT, :UNIDAD, :FACTOR, :BODITEM, :LOTE, :LISTAPR, :PRUNIT, :DTOITPORC, :DTOITMONTO, :IVAPORC, :IVAITMONTO, :CONSUMO, :TOTAL, :refitem,
        :GRUPO, :SUBGRUPO, :MARCA, :PESO, :ANCHO, :ALTO, :LARGO, :TARIFA, :devuelto, :obsitem, :dtoit1, :dtoit2, :dtoit3, :dtoitm1, :dtoitm2, :dtoitm3, :cajas, :base, :porcbase
        DO
          BEGIN
          if (ARTICULO = CODBAR) then
            SELECT FIRST 1 COBA_COD FROM barras_articulo WHERE ARTI_COD = :articulo INTO :CODBAR;
          if (IMPRDEV <> 'SI') then
            BEGIN
            if ((CANT >= 0) AND (DEVUELTO = 0)) then
                IMPR = 'S';
            ELSE
                IMPR = 'N'; /* ES DEVOLUCION */
            END
          ELSE
            IMPR = 'S';
          if (IMPR = 'S') then
            BEGIN
            prneto = PRUNIT - DTOITMONTO - dtoitm1 - dtoitm2 - dtoitm3;
            if (IMPTOS = 'S') then
                if (cant <> 0) then
                    prnetosiniva = PRUNIT - DTOITMONTO - ((IVAITMONTO+CONSUMO) / CANT) - dtoitm1 - dtoitm2 - dtoitm3;
                else
                    prnetosiniva = PRUNIT - DTOITMONTO - dtoitm1 - dtoitm2 - dtoitm3;
            ELSE
                prnetosiniva = PRUNIT - DTOITMONTO - dtoit1m - dtoit2m - dtoit3m;
            if (ICOINC = 'SI') then
                SUBTOTIT = TOTAL - IVAITMONTO;
            else
                SUBTOTIT = TOTAL - IVAITMONTO - CONSUMO;
            TOTCONSUMO = TOTCONSUMO + CONSUMO;
            TOTBASE = TOTBASE + BASE;
            SELECT LOTE_VENCE FROM LOTES WHERE LOTE_NRO = :lote AND ARTI_COD = :ARTICULO AND BODE_COD = :boditem INTO :vlote;
            if ((REFITEM <> '.t') or (REFITEM IS NULL)) then
                BEGIN
                /* NO SUME LOS ENSAMBLES */
                if (IVAPORC = 0) then
                    SUMAEX = SUMAEX + TOTAL;
                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;
                END
            if (ANCHO IS NULL) then
                ANCHO = 0;
            if (ALTO IS NULL) then
                ALTO = 0;
            if (LARGO IS NULL) then
                LARGO = 0;
            if (PESO IS NULL) then
                PESO = 0;
            PESO = (PESO / 1000) * CANT * FACTOR;
            PESOTOT = PESOTOT + PESO;
            totcajas = totcajas + cajas;
            if (substr(ARTICULO,1,2) = '.t') then
                BEGIN
                REFITEM = '';
                TOTAL = 0;
                SUBTOTIT = 0;
                END
            SELECT STAND_COD FROM STANDS WHERE ARTI_COD = :ARTICULO AND STAND_BODEGA = :boditem INTO :stand;
            factcant = NULL;
            SELECT FIRST 1 UNAR_FACCAN FROM unidad_articulo WHERE ARTI_COD = :articulo INTO :factcant;
            if (factcant IS NULL) then
                BEGIN
                ALTERNATIVAS = 0;
                PRINCIPALES = (CANT * FACTOR);
                END
            ELSE
                BEGIN
                ALTERNATIVAS = FLOOR(CANT * factor / factcant);
                PRINCIPALES = (CANT * FACTOR) - (alternativas * factcant);
                END
            SUSPEND;
            END
          END
    END
ELSE
  if (ORDENCOD = 'UNIDAD') then
    BEGIN
    FOR SELECT FADE_ITEM, D.ARTI_COD, FADE_CODBAR, SUBSTR(FADE_DESC,1,60), ARTI_DESCORTA, FADE_CANT, FADE_UNIDAD, FADE_FACTOR, BODE_COD, FADE_LOTE, LIPR_COD, FADE_PRUNIT, FADE_DTOPORC, FADE_DTOMONTO, FADE_IVAPORC, FADE_IVAMONTO, FADE_CONSUMO, FADE_TOTAL, FADE_REFERENCIA,
        GRUP_COD, SUBG_COD, MARC_COD, ARTI_PESO, ARTI_ANCHO, ARTI_ALTO, ARTI_LARGO, TAIV_COD, FADE_DEVUELTO, FADE_OBS, FADE_DTO1, FADE_DTO2, FADE_DTO3, FADE_DTOM1, FADE_DTOM2, FADE_DTOM3, FADE_CAJAS, FADE_BASE, FADE_PORCBASE
        FROM FACTURAS_DETALLE D, ARTICULO A
        WHERE D.ARTI_COD = A.ARTI_COD AND D.FACT_ID = :ID
        ORDER BY D.fade_unidad, D.fade_desc
        INTO :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :DESCORTA, :CANT, :UNIDAD, :FACTOR, :BODITEM, :LOTE, :LISTAPR, :PRUNIT, :DTOITPORC, :DTOITMONTO, :IVAPORC, :IVAITMONTO, :CONSUMO, :TOTAL, :refitem,
        :GRUPO, :SUBGRUPO, :MARCA, :PESO, :ANCHO, :ALTO, :LARGO, :TARIFA, :devuelto, :obsitem, :dtoit1, :dtoit2, :dtoit3, :dtoitm1, :dtoitm2, :dtoitm3, :cajas, :base, :porcbase
        DO
          BEGIN
          if (ARTICULO = CODBAR) then
            SELECT FIRST 1 COBA_COD FROM barras_articulo WHERE ARTI_COD = :articulo INTO :CODBAR;
          if (IMPRDEV <> 'SI') then
            BEGIN
            if ((CANT >= 0) AND (DEVUELTO = 0)) then
                IMPR = 'S';
            ELSE
                IMPR = 'N'; /* ES DEVOLUCION */
            END
          ELSE
            IMPR = 'S';
          if (IMPR = 'S') then
            BEGIN
            prneto = PRUNIT - DTOITMONTO - dtoitm1 - dtoitm2 - dtoitm3;
            if (IMPTOS = 'S') then
                if (cant <> 0) then
                    prnetosiniva = PRUNIT - DTOITMONTO - ((IVAITMONTO+CONSUMO) / CANT) - dtoitm1 - dtoitm2 - dtoitm3;
                else
                    prnetosiniva = PRUNIT - DTOITMONTO - dtoitm1 - dtoitm2 - dtoitm3;
            ELSE
                prnetosiniva = PRUNIT - DTOITMONTO - dtoit1m - dtoit2m - dtoit3m;
            if (ICOINC = 'SI') then
                SUBTOTIT = TOTAL - IVAITMONTO;
            else
                SUBTOTIT = TOTAL - IVAITMONTO - CONSUMO;
            TOTCONSUMO = TOTCONSUMO + CONSUMO;
            TOTBASE = TOTBASE + BASE;
            SELECT LOTE_VENCE FROM LOTES WHERE LOTE_NRO = :lote AND ARTI_COD = :ARTICULO AND BODE_COD = :boditem INTO :vlote;
            if ((REFITEM <> '.t') or (REFITEM IS NULL)) then
                BEGIN
                /* NO SUME LOS ENSAMBLES */
                if (IVAPORC = 0) then
                    SUMAEX = SUMAEX + TOTAL;
                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;
                END
            if (ANCHO IS NULL) then
                ANCHO = 0;
            if (ALTO IS NULL) then
                ALTO = 0;
            if (LARGO IS NULL) then
                LARGO = 0;
            if (PESO IS NULL) then
                PESO = 0;
            PESO = (PESO / 1000) * CANT * FACTOR;
            PESOTOT = PESOTOT + PESO;
            totcajas = totcajas + cajas;
            if (substr(ARTICULO,1,2) = '.t') then
                BEGIN
                REFITEM = '';
                TOTAL = 0;
                SUBTOTIT = 0;
                END
            SELECT STAND_COD FROM STANDS WHERE ARTI_COD = :ARTICULO AND STAND_BODEGA = :boditem INTO :stand;
            factcant = NULL;
            SELECT FIRST 1 UNAR_FACCAN FROM unidad_articulo WHERE ARTI_COD = :articulo INTO :factcant;
            if ((factcant IS NULL) or (factcant = 0)) then
                BEGIN
                ALTERNATIVAS = 0;
                PRINCIPALES = (CANT * FACTOR);
                END
            ELSE
                BEGIN
                ALTERNATIVAS = FLOOR(CANT * factor / factcant);
                PRINCIPALES = (CANT * FACTOR) - (alternativas * factcant);
                END
            SUSPEND;
            END
          END
    END
  ELSE
    BEGIN
    FOR SELECT FADE_ITEM, D.ARTI_COD, FADE_CODBAR, SUBSTR(FADE_DESC,1,60), ARTI_DESCORTA, FADE_CANT, FADE_UNIDAD, FADE_FACTOR, BODE_COD, FADE_LOTE, LIPR_COD, FADE_PRUNIT, FADE_DTOPORC, FADE_DTOMONTO, FADE_IVAPORC, FADE_IVAMONTO, FADE_CONSUMO, FADE_TOTAL, FADE_REFERENCIA,
        GRUP_COD, SUBG_COD, MARC_COD, ARTI_PESO, ARTI_ANCHO, ARTI_ALTO, ARTI_LARGO, TAIV_COD, FADE_DEVUELTO, FADE_OBS, FADE_DTO1, FADE_DTO2, FADE_DTO3, FADE_DTOM1, FADE_DTOM2, FADE_DTOM3, FADE_CAJAS, FADE_BASE, FADE_PORCBASE
        FROM FACTURAS_DETALLE D, ARTICULO A
        WHERE D.ARTI_COD = A.ARTI_COD AND D.FACT_ID = :ID
        ORDER BY FADE_ITEM
        INTO :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :DESCORTA, :CANT, :UNIDAD, :FACTOR, :BODITEM, :LOTE, :LISTAPR, :PRUNIT, :DTOITPORC, :DTOITMONTO, :IVAPORC, :IVAITMONTO, :CONSUMO, :TOTAL, :refitem,
        :GRUPO, :SUBGRUPO, :MARCA, :PESO, :ANCHO, :ALTO, :LARGO, :TARIFA, :devuelto, :obsitem, :dtoit1, :dtoit2, :dtoit3, :dtoitm1, :dtoitm2, :dtoitm3, :cajas, :base, :porcbase
        DO
          BEGIN
          if (IMPRDEV <> 'SI') then
            BEGIN
            if ((CANT >= 0) AND (DEVUELTO = 0)) then
                IMPR = 'S';
            ELSE
                IMPR = 'N'; /* ES DEVOLUCION */
            END
          ELSE
            IMPR = 'S';
          if (IMPR = 'S') then
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :GRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :MARCA INTO NOMMARCA;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :SUBGRUPO AND GRUP_COD = :GRUPO INTO :NOMSUBG;
            prneto = PRUNIT - DTOITMONTO - dtoitm1 - dtoitm2 - dtoitm3;
            if (IMPTOS = 'S') then
                if (cant <> 0) then
                    prnetosiniva = PRUNIT - DTOITMONTO - ((IVAITMONTO+CONSUMO) / CANT) - dtoit1m - dtoit2m - dtoit3m;
                else
                    prnetosiniva = PRUNIT - DTOITMONTO - dtoitm1 - dtoitm2 - dtoitm3;
            ELSE
                prnetosiniva = PRUNIT - DTOITMONTO - dtoitm1 - dtoitm2 - dtoitm3;
            if (ICOINC = 'SI') then
                SUBTOTIT = TOTAL - IVAITMONTO;
            else
                SUBTOTIT = TOTAL - IVAITMONTO - CONSUMO;
            TOTCONSUMO = TOTCONSUMO + CONSUMO;
            TOTBASE = TOTBASE + BASE;
            SELECT LOTE_VENCE FROM LOTES WHERE LOTE_NRO = :lote AND ARTI_COD = :ARTICULO AND BODE_COD = :boditem INTO :vlote;
            if ((REFITEM <> '.t') or (REFITEM IS NULL)) then
                BEGIN
                /* NO SUME LOS ENSAMBLES */
                if (IVAPORC = 0) then
                    SUMAEX = SUMAEX + TOTAL;
                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;
                END
            if (ANCHO IS NULL) then
                ANCHO = 0;
            if (ALTO IS NULL) then
                ALTO = 0;
            if (LARGO IS NULL) then
                LARGO = 0;
            if (PESO IS NULL) then
                PESO = 0;
            PESO = (PESO / 1000)* CANT * FACTOR;
            PESOTOT = PESOTOT + PESO;
            totcajas = totcajas + cajas;
            if (substr(ARTICULO,1,2) = '.t') then
                BEGIN
                REFITEM = '';
                TOTAL = 0;
                SUBTOTIT = 0;
                END
            SELECT STAND_COD FROM STANDS WHERE ARTI_COD = :ARTICULO AND STAND_BODEGA = :boditem INTO :stand;
            factcant = NULL;
            SELECT FIRST 1 UNAR_FACCAN FROM unidad_articulo WHERE ARTI_COD = :articulo INTO :factcant;
            if ((factcant IS NULL) or (factcant = 0)) then
                BEGIN
                ALTERNATIVAS = 0;
                PRINCIPALES = (CANT * FACTOR);
                END
            ELSE
                BEGIN
                ALTERNATIVAS = FLOOR(CANT * factor / factcant);
                PRINCIPALES = (CANT * FACTOR) - (alternativas * factcant);
                END
            SUSPEND;
            END
          END
    END
END

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE IMPR_REDENCION(
    ID INTEGER)
RETURNS (
    NUMERO VARCHAR(6),
    FECHA DATE,
    NIT VARCHAR(20),
    NOMCLIENTE VARCHAR(60),
    DIR VARCHAR(60),
    TEL VARCHAR(60),
    PREMIO VARCHAR(15),
    NOMPREMIO VARCHAR(60),
    PUNTOS INTEGER,
    PUNTOSACUM INTEGER,
    PUNTOSVENC INTEGER,
    FECPTOS DATE)
AS
declare variable puntosaux INTEGER;
begin
SELECT PTRE_NUMERO, PTRE_FECHA, PTRE_NIT, TERC_NOM, TERC_DIR, TERC_TEL, R.PTPR_COD, PTPR_NOMBRE, PTRE_PUNTOS
    FROM PUNTOS_REDENCION R, puntos_premios P, TERCEROS T
    WHERE R.ptre_nit = T.terc_nit AND R.ptpr_cod = P.ptpr_cod AND R.ptre_id = :ID
    INTO :NUMERO, :FECHA, :NIT, :NOMCLIENTE, :DIR, :TEL, :PREMIO, :NOMPREMIO, :PUNTOS;
EXECUTE PROCEDURE consulta_puntos_cliente (0, :nit, :fecha) returning_values (:puntosaux, :puntosacum, :puntosvenc, :fecptos);
suspend;
end

^

SET TERM ; ^


/* 20100708C */
/* CHEQUEO DE SALDOS DE UNA SOLA CAJA DAÑABA SALDOS DE OTRAS CAJAS CON TRASLADOS */
SET TERM ^ ;

CREATE OR ALTER procedure CHEQUEO_SALDOS_CAJAS (
    CAJAINI integer,
    CAJAFIN integer)
AS
declare variable ID INTEGER;
declare variable Fec date;
declare variable Caja integer;
declare variable Conc VARCHAR(60);
declare variable Pref varchar(4);
declare variable Num varchar(6);
declare variable FORMA INTEGER;
declare variable BANCO VARCHAR(2);
declare variable CUENTA VARCHAR(20);
declare variable NUMERO VARCHAR(20);
declare variable FECHA DATE;
declare variable MONTO NUMERIC(18,2);
declare variable Existe INTEGER;
declare variable Dest INTEGER;
declare variable idref INTEGER;
begin
/* BORRE LOS MOVIMIENTOS CAJA, LOS DOCUMENTOS PAGO CAJA Y SALDO EFECTIVO */
DELETE FROM ANTICIPOS_CLIENTE WHERE RECA_ID = 0;
DELETE FROM ANTICIPOS_PROVEEDOR WHERE EGRE_ID = 0;
UPDATE DOCUMENTOS_PAGO_CAJA SET dpca_idsal = 0 WHERE CAJA_ID >= :cajaini AND CAJA_ID <= :cajafin;
DELETE FROM MOVIMIENTO_CAJA WHERE CAJA_ID >= :cajaini AND CAJA_ID <= :cajafin;
DELETE FROM DOCUMENTOS_PAGO_CAJA WHERE CAJA_ID >= :cajaini AND CAJA_ID <= :cajafin;
DELETE FROM SALDO_EFECTIVO WHERE CAJA_ID >= :cajaini AND CAJA_ID <= :cajafin;
DELETE FROM saldo_caja WHERE CAJA_ID >= :cajaini AND CAJA_ID <= :cajafin;

/* INCORPORE LOS RECIBOS DE CAJA */
FOR SELECT R.RECA_ID, reca_fecha, caja_id, reca_conc, pref_pre, reca_numero, FOPA_ID, RCPA_BANCO, RCPA_CUENTA, RCPA_NUMERO, RCPA_FECHA, RCPA_MONTO
    FROM recibos_caja R, RECIBOS_CAJA_PAGO P where R.reca_id = P.reca_id and reca_anulado = 'N' AND CAJA_ID >= :cajaini AND CAJA_ID <= :cajafin
    ORDER BY CAJA_ID, R.RECA_FECHA, R.RECA_ID, RCPA_ITEM
    INTO :ID, :Fec, :Caja, :Conc, :Pref, :Num, :forma,  :banco, :cuenta, :numero, :fecha, :monto
    DO
    BEGIN
    select COUNT(*) from movimiento_caja where moca_tiporef = 61 and moca_idref = :id into :Existe;
    if (Existe > 0) then
        update movimiento_caja
        set moca_debitos = moca_debitos + :monto
        where moca_tiporef = 61 and moca_idref = :id;
    else
        INSERT INTO MOVIMIENTO_CAJA
            (MOCA_ID, CAJA_ID, MOCA_TIPOREF, MOCA_PREFREF, MOCA_NUMREF, MOCA_FECHA, MOCA_CONC, MOCA_DEBITOS, MOCA_CREDITOS, MOCA_DB, MOCA_IDREF)
            VALUES(GEN_ID(id_movcaja,1), :Caja, 61, :Pref, :Num, :Fec, :Conc, :monto, 0, 'S', :id);
        /* GRABE EL DOCUMENTO DE PAGO EN CAJA */
        if (FORMA <> 1) then
            INSERT INTO DOCUMENTOS_PAGO_CAJA (DPCA_ID, FOPA_ID, CAJA_ID, DPCA_BANCO, DPCA_CUENTA, DPCA_NUMERO, DPCA_FECHA, DPCA_MONTO, DPCA_TIPOENT, DPCA_IDENT, DPCA_TIPOSAL, DPCA_IDSAL)
                VALUES (GEN_ID(ID_DOCPAGOCAJA, 1), :FORMA, :CAJA, :BANCO, :CUENTA, :NUMERO, :FECHA, :MONTO, 61, :ID, 0, 0);
        ELSE
            EXECUTE PROCEDURE SUME_SALDO_EFECTIVO (:CAJA, :FEC, :MONTO, 'N');
    END

/* LOS EGRESOS POR TRASLADO A CAJA */
for SELECT EGRE_ID, CAJA_ID, PREF_PRE, EGRE_NUMERO, EGRE_FECHA, EGRE_CONC, EGRE_MONTO FROM EGRESOS
    WHERE EGRE_TIPO = '2' AND CAJA_ID <> 0 AND egre_id <> 0 AND egre_anulado = 'N' AND CAJA_ID >= :cajaini AND CAJA_ID <= :cajafin
    ORDER BY CAJA_ID, EGRE_FECHA
    INTO :ID, :CAJA, :PREF, :NUM, :FEC, :CONC, :MONTO
    DO
    BEGIN
    SELECT MOCA_IDREF FROM movimiento_caja WHERE MOCA_TIPOREF = 62 AND MOCA_IDREF = :ID INTO :idref;
    if (idref IS NULL) then
     BEGIN
     INSERT INTO MOVIMIENTO_CAJA
        (MOCA_ID, CAJA_ID, MOCA_TIPOREF, MOCA_PREFREF, MOCA_NUMREF, MOCA_FECHA, MOCA_CONC, MOCA_DEBITOS, MOCA_CREDITOS, MOCA_DB, MOCA_IDREF)
        VALUES(GEN_ID(id_movcaja,1), :CAJA, 62, :PREF, :NUM, :FEC, :CONC, :MONTO, 0, 'S', :ID);
      /* GRABE EL DOCUMENTO DE PAGO EN CAJA */
      EXECUTE PROCEDURE SUME_SALDO_EFECTIVO (:caja, :fec, :monto, 'N');
     END
    END
/* LOS CAMBIOS */
FOR SELECT C.CADO_ID, cado_fecha, cado_conc, pref_pre, cado_numero, caja_id, FOPA_ID, CDSA_BANCO, CDSA_CUENTA, CDSA_NUMERO, CDSA_FECHA, CDSA_MONTO
    FROM CAMBIO_DOCUMENTOS C, CAMBIODOC_SALIDAS D where C.CADO_ID = D.CADO_ID and cado_anulado = 'N' AND CAJA_ID >= :cajaini AND CAJA_ID <= :cajafin
    ORDER BY CAJA_ID, C.CADO_FECHA, C.CADO_ID, CDSA_ITEM
    INTO :ID, :Fec, :Conc, :Pref, :Num, :Caja, :forma, :banco, :cuenta, :numero, :fecha, :monto
    DO
    BEGIN
    select COUNT(*) from movimiento_caja where moca_tiporef = 63 and moca_idref = :id and caja_id = :CAJA into :Existe;
    if (Existe > 0) then
        begin
        update movimiento_caja
            set moca_debitos = moca_debitos + :monto
            where moca_tiporef = 63 and moca_idref = :id and caja_id = :CAJA;
        end
    else
        INSERT INTO MOVIMIENTO_CAJA
            (MOCA_ID, CAJA_ID, MOCA_TIPOREF, MOCA_PREFREF, MOCA_NUMREF, MOCA_FECHA, MOCA_CONC, MOCA_DEBITOS, MOCA_CREDITOS, MOCA_DB, MOCA_IDREF)
            VALUES(GEN_ID(ID_MOVCAJA,1), :CAJA, 63, :Pref, :Num, :Fec, :Conc, :monto, 0, 'S', :id);
        
    if (FORMA <> 1) then
        INSERT INTO DOCUMENTOS_PAGO_CAJA (DPCA_ID, FOPA_ID, CAJA_ID, DPCA_BANCO, DPCA_CUENTA, DPCA_NUMERO, DPCA_FECHA, DPCA_MONTO, DPCA_TIPOENT, DPCA_IDENT, DPCA_TIPOSAL, DPCA_IDSAL)
            VALUES (GEN_ID(ID_DOCPAGOCAJA, 1), :FORMA, :CAJA, :BANCO, :CUENTA, :NUMERO, :FECHA, :MONTO, 63, :ID, 0, 0);
    ELSE
        EXECUTE PROCEDURE SUME_SALDO_EFECTIVO(:CAJA, :FEC, :MONTO, 'N');
    END
/* DEVOLUCIONES DE CHEQUES ojo fopa_id = 2 */
FOR SELECT DVCH_ID, dvch_fecha, caja_id, dvch_conc, prba_pref, dvch_numdoc, 2, DVCH_BANCO, DVCH_CUENTA, DVCH_NROCH, DVCH_FECCH, DVCH_MONTO
    FROM DEVOLUCION_CHEQUES where dvch_anulado = 'N' AND dvch_cartera <> 'S' AND CAJA_ID >= :cajaini AND CAJA_ID <= :cajafin
    ORDER BY CAJA_ID, DVCH_FECHA, DVCH_ID
    INTO :ID, :Fec, :Caja, :Conc, :Pref, :Num, :forma,  :banco, :cuenta, :numero, :fecha, :monto
    DO
    BEGIN
    select COUNT(*) from movimiento_caja where moca_tiporef = 77 and moca_idref = :id into :Existe;
    if (Existe > 0) then
        update movimiento_caja
        set moca_debitos = moca_debitos + :monto
        where moca_tiporef = 77 and moca_idref = :id;
    else
        INSERT INTO MOVIMIENTO_CAJA
            (MOCA_ID, CAJA_ID, MOCA_TIPOREF, MOCA_PREFREF, MOCA_NUMREF, MOCA_FECHA, MOCA_CONC, MOCA_DEBITOS, MOCA_CREDITOS, MOCA_DB, MOCA_IDREF)
            VALUES(GEN_ID(id_movcaja,1), :Caja, 77, :Pref, :Num, :Fec, :Conc, :monto, 0, 'S', :id);
        /* GRABE EL DOCUMENTO DE PAGO EN CAJA */
        INSERT INTO DOCUMENTOS_PAGO_CAJA (DPCA_ID, FOPA_ID, CAJA_ID, DPCA_BANCO, DPCA_CUENTA, DPCA_NUMERO, DPCA_FECHA, DPCA_MONTO, DPCA_TIPOENT, DPCA_IDENT, DPCA_TIPOSAL, DPCA_IDSAL)
            VALUES (GEN_ID(ID_DOCPAGOCAJA, 1), 2, :CAJA, :BANCO, :CUENTA, :NUMERO, :FECHA, :MONTO, 77, :ID, 0, 0);
    END

/* TRASLADOS ENTRE CAJAS INGRESOS */
FOR SELECT T.TRCJ_ID, trcj_fecha, caja_id, trcj_destino, trcj_conc, pref_pre, trcj_numero, fopa_id, TRCD_BANCO, TRCD_CUENTA, TRCD_NUMERO, TRCD_FECHA, TRCD_MONTO
    FROM TRASLADOS_CAJA T, TRASLADOS_CAJA_DET D where T.TRCJ_ID = D.TRCJ_ID AND trcj_anulado = 'N' AND TRCJ_DESTINO >= :cajaini AND TRCJ_DESTINO <= :cajafin
    ORDER BY CAJA_ID, TRCJ_FECHA, T.TRCJ_ID, TRCD_ITEM
    INTO :ID, :Fec, :Caja, :Dest, :Conc, :Pref, :Num, :forma,  :banco, :cuenta, :numero, :fecha, :monto
    DO
    BEGIN
    /* INGRESO A LA CAJA DESTINO */
    select COUNT(*) from movimiento_caja where moca_tiporef = 66 and moca_idref = :id and caja_id = :Dest into :Existe;
    if (Existe > 0) then
        begin
        update movimiento_caja
            set moca_debitos = moca_debitos + :monto
            where moca_tiporef = 66 and moca_idref = :id and caja_id = :Dest;
        end
    else
        INSERT INTO MOVIMIENTO_CAJA
            (MOCA_ID, CAJA_ID, MOCA_TIPOREF, MOCA_PREFREF, MOCA_NUMREF, MOCA_FECHA, MOCA_CONC, MOCA_DEBITOS, MOCA_CREDITOS, MOCA_DB, MOCA_IDREF)
            VALUES(GEN_ID(ID_MOVCAJA,1), :Dest, 66, :Pref, :Num, :Fec, :Conc, :monto, 0, 'S', :id);
    /* Ingrese el doc. de pago */
    if (FORMA <> 1) then
        INSERT INTO DOCUMENTOS_PAGO_CAJA (DPCA_ID, FOPA_ID, CAJA_ID, DPCA_BANCO, DPCA_CUENTA, DPCA_NUMERO, DPCA_FECHA, DPCA_MONTO, DPCA_TIPOENT, DPCA_IDENT, DPCA_TIPOSAL, DPCA_IDSAL)
            VALUES (GEN_ID(ID_DOCPAGOCAJA, 1), :FORMA, :Dest, :BANCO, :CUENTA, :NUMERO, :FECHA, :MONTO, 66, :ID, 0, 0);
    else
        EXECUTE PROCEDURE SUME_SALDO_EFECTIVO (:Dest, :Fec, :MONTO, 'N');
    END

/* TRASLADOS ENTRE CAJAS EGRESOS */
FOR SELECT T.TRCJ_ID, trcj_fecha, caja_id, trcj_destino, trcj_conc, pref_pre, trcj_numero, fopa_id, TRCD_BANCO, TRCD_CUENTA, TRCD_NUMERO, TRCD_FECHA, TRCD_MONTO
    FROM TRASLADOS_CAJA T, TRASLADOS_CAJA_DET D where T.TRCJ_ID = D.TRCJ_ID AND trcj_anulado = 'N' AND CAJA_ID >= :cajaini AND CAJA_ID <= :cajafin
    ORDER BY CAJA_ID, TRCJ_FECHA, T.TRCJ_ID, TRCD_ITEM
    INTO :ID, :Fec, :Caja, :Dest, :Conc, :Pref, :Num, :forma,  :banco, :cuenta, :numero, :fecha, :monto
    DO
    BEGIN
    select COUNT(*) from movimiento_caja where moca_tiporef = 66 and moca_idref = :id and caja_id = :caja into :Existe;
    if (Existe > 0) then
        begin
        update movimiento_caja
            set moca_creditos = moca_creditos + :monto
            where moca_tiporef = 66 and moca_idref = :id and caja_id = :caja;
        end
    else
        INSERT INTO MOVIMIENTO_CAJA
            (MOCA_ID, CAJA_ID, MOCA_TIPOREF, MOCA_PREFREF, MOCA_NUMREF, MOCA_FECHA, MOCA_CONC, MOCA_DEBITOS, MOCA_CREDITOS, MOCA_DB, MOCA_IDREF)
            VALUES(GEN_ID(ID_MOVCAJA,1), :CAJA, 66, :Pref, :Num, :Fec, :Conc, 0, :monto, 'N', :id);
    /* Actualice la salida del documento en la caja origen */
    if (FORMA <> 1) then
        UPDATE DOCUMENTOS_PAGO_CAJA
            SET DPCA_TIPOSAL = 66, DPCA_IDSAL = :ID
            WHERE FOPA_ID = :FORMA AND DPCA_BANCO = :BANCO AND DPCA_CUENTA = :CUENTA AND
            DPCA_NUMERO = :NUMERO AND CAJA_ID = :CAJA AND DPCA_TIPOSAL = 0 AND DPCA_IDSAL = 0 AND DPCA_MONTO = :MONTO;
    else
        EXECUTE PROCEDURE RESTE_SALDO_EFECTIVO (:CAJA, :Fec, :MONTO, 'N');
    END

/* INCORPORE LOS EGRESOS DE CAJA */
FOR SELECT E.EGRE_ID, egre_fecha, egre_conc, pref_pre, egre_numero, C.caja_id, FOPA_ID, EGCA_BANCO, EGCA_CUENTA, EGCA_NUMERO, EGCA_FECHA, EGCA_MONTO
    FROM EGRESOS E, EGRESOS_CAJA C where E.egre_id = C.egre_id and egre_anulado = 'N' AND C.CAJA_ID >= :cajaini AND C.CAJA_ID <= :cajafin
    ORDER BY CAJA_ID, E.EGRE_FECHA, E.EGRE_ID, EGCA_ITEM
    INTO :ID, :Fec, :Conc, :Pref, :Num, :Caja, :forma, :banco, :cuenta, :numero, :fecha, :monto
    DO
    BEGIN
    select COUNT(*) from movimiento_caja where moca_tiporef = 62 and moca_idref = :id and caja_id = :caja into :Existe;
    if (Existe > 0) then
        update movimiento_caja
        set moca_creditos = moca_creditos + :monto
        where moca_tiporef = 62 and moca_idref = :id and caja_id = :caja;
    else
        INSERT INTO MOVIMIENTO_CAJA
            (MOCA_ID, CAJA_ID, MOCA_TIPOREF, MOCA_PREFREF, MOCA_NUMREF, MOCA_FECHA, MOCA_CONC, MOCA_DEBITOS, MOCA_CREDITOS, MOCA_DB, MOCA_IDREF)
            VALUES(GEN_ID(ID_MOVCAJA,1), :caja, 62, :Pref, :Num, :Fec, :Conc, 0, :monto, 'N', :id);
    /* ACTUALICE LA SALIDA DEL DOCUMENTO */
    if (FORMA <> 1) then
        UPDATE DOCUMENTOS_PAGO_CAJA
            SET DPCA_TIPOSAL = 62, DPCA_IDSAL = :ID
            WHERE FOPA_ID = :FORMA AND DPCA_BANCO = :BANCO AND DPCA_CUENTA = :CUENTA AND
            DPCA_NUMERO = :NUMERO AND DPCA_TIPOSAL = 0 AND DPCA_IDSAL = 0 AND DPCA_MONTO = :MONTO;
    ELSE
        EXECUTE PROCEDURE RESTE_SALDO_EFECTIVO(:CAJA, :FEC, :MONTO, 'N');
    END

/* INCORPORE LAS CONSIGNACIONES */
FOR SELECT C.CONS_ID, cons_fecha, cons_concepto, prba_pref, cons_numero, caja_id, FOPA_ID, CODE_BANCO, CODE_CUENTA, CODE_NUMERO, CODE_FECHA, CODE_MONTO
    FROM CONSIGNA C, CONSIGNA_DETALLE D where C.CONS_ID = D.CONS_ID and cons_anulado = 'N' AND CAJA_ID >= :cajaini AND CAJA_ID <= :cajafin
    ORDER BY CAJA_ID, C.CONS_FECHA, C.CONS_ID, CODE_ITEM2
    INTO :ID, :Fec, :Conc, :Pref, :Num, :Caja, :forma, :banco, :cuenta, :numero, :fecha, :monto
    DO
    BEGIN
    select COUNT(*) from movimiento_caja where moca_tiporef = 71 and moca_idref = :id and caja_id = :caja into :Existe;
    if (Existe > 0) then
        update movimiento_caja
            set moca_creditos = moca_creditos + :monto
            where moca_tiporef = 71 and moca_idref = :id and caja_id = :caja;
    else
        INSERT INTO MOVIMIENTO_CAJA
            (MOCA_ID, CAJA_ID, MOCA_TIPOREF, MOCA_PREFREF, MOCA_NUMREF, MOCA_FECHA, MOCA_CONC, MOCA_DEBITOS, MOCA_CREDITOS, MOCA_DB, MOCA_IDREF)
            VALUES(GEN_ID(ID_MOVCAJA,1), :CAJA, 71, :Pref, :Num, :Fec, :Conc, 0, :monto, 'N', :id);
    /* ACTUALICE LA SALIDA DEL DOCUMENTO DE PAGO */
    if (FORMA <> 1) then
        UPDATE DOCUMENTOS_PAGO_CAJA
            SET DPCA_TIPOSAL = 71, DPCA_IDSAL = :id
            WHERE FOPA_ID = :FORMA AND DPCA_BANCO = :BANCO AND DPCA_CUENTA = :CUENTA AND
            DPCA_NUMERO = :NUMERO AND DPCA_TIPOSAL = 0 AND DPCA_IDSAL = 0 AND DPCA_MONTO = :MONTO;
    ELSE
        EXECUTE PROCEDURE RESTE_SALDO_EFECTIVO(:CAJA, :FEC, :MONTO, 'N');
    END

/* CONSIGNACIONES DE TARJETAS */
FOR SELECT C.COTJ_ID, cotj_fecha, cotj_concepto, pref_pre, cotj_numero, caja_id, FOPA_ID, TARJ_COD, CTJD_NROTJ, CTJD_COMPROB, COTJ_FECHA, CTJD_BASE
    FROM CONSIGNA_TARJETAS C, CONSIGNA_TARJETAS_DET D where C.cotj_id = D.cotj_id and cotj_anulado = 'N' AND CAJA_ID >= :cajaini AND CAJA_ID <= :cajafin
    ORDER BY CAJA_ID, C.COTJ_FECHA, C.cotj_id, CTJD_ITEM
    INTO :ID, :Fec, :Conc, :Pref, :Num, :Caja, :forma, :banco, :cuenta, :numero, :fecha, :monto
    DO
    BEGIN
    select COUNT(*) from movimiento_caja where moca_tiporef = 64 and moca_idref = :id into :Existe;
    if (Existe > 0) then
        update movimiento_caja
            set moca_creditos = moca_creditos + :monto
            where moca_tiporef = 64 and moca_idref = :id;
    else
        INSERT INTO MOVIMIENTO_CAJA
            (MOCA_ID, CAJA_ID, MOCA_TIPOREF, MOCA_PREFREF, MOCA_NUMREF, MOCA_FECHA, MOCA_CONC, MOCA_DEBITOS, MOCA_CREDITOS, MOCA_DB, MOCA_IDREF)
            VALUES(GEN_ID(ID_MOVCAJA,1), :Caja, 64, :Pref, :Num, :Fec, :Conc, 0, :monto, 'N', :id);

  /* ACTUALICE LA SALIDA DEL DOCUMENTO DE PAGO */
  UPDATE DOCUMENTOS_PAGO_CAJA
    SET DPCA_TIPOSAL = 64, DPCA_IDSAL = :id
    WHERE FOPA_ID = :FORMA AND DPCA_BANCO = :BANCO AND DPCA_CUENTA = :CUENTA AND
    DPCA_NUMERO = :NUMERO AND DPCA_TIPOSAL = 0 AND DPCA_IDSAL = 0 AND DPCA_MONTO = :MONTO;
  end

/* INCORPORE LOS CAMBIOS DE DOCUMENTOS */
FOR SELECT C.CADO_ID, cado_fecha, cado_conc, pref_pre, cado_numero, caja_id, FOPA_ID, CDEN_BANCO, CDEN_CUENTA, CDEN_NUMERO, CDEN_FECHA, CDEN_MONTO
    FROM CAMBIO_DOCUMENTOS C, CAMBIODOC_ENTRADAS D where C.CADO_ID = D.CADO_ID and cado_anulado = 'N' AND CAJA_ID >= :cajaini AND CAJA_ID <= :cajafin
    ORDER BY CAJA_ID, C.CADO_FECHA, C.CADO_ID, CDEN_ITEM
    INTO :ID, :Fec, :Conc, :Pref, :Num, :Caja, :forma, :banco, :cuenta, :numero, :fecha, :monto
    DO
    BEGIN
    select COUNT(*) from movimiento_caja where moca_tiporef = 63 and moca_idref = :id and caja_id = :CAJA into :Existe;
    if (Existe > 0) then
        begin
        update movimiento_caja
            set moca_creditos = moca_creditos + :monto
            where moca_tiporef = 63 and moca_idref = :id and caja_id = :CAJA;
        end
    else
        INSERT INTO MOVIMIENTO_CAJA
            (MOCA_ID, CAJA_ID, MOCA_TIPOREF, MOCA_PREFREF, MOCA_NUMREF, MOCA_FECHA, MOCA_CONC, MOCA_DEBITOS, MOCA_CREDITOS, MOCA_DB, MOCA_IDREF)
            VALUES(GEN_ID(ID_MOVCAJA,1), :CAJA, 63, :Pref, :Num, :Fec, :Conc, 0, :monto, 'N', :id);
        
    /* ACTUALICE LA SALIDA DEL DOCUMENTO */
    if (FORMA <> 1) then
        UPDATE DOCUMENTOS_PAGO_CAJA
            SET DPCA_TIPOSAL = 63, DPCA_IDSAL = :id
            WHERE FOPA_ID = :FORMA AND DPCA_BANCO = :BANCO AND DPCA_CUENTA = :CUENTA AND
            DPCA_NUMERO = :NUMERO AND DPCA_TIPOSAL = 0 AND DPCA_IDSAL = 0 AND DPCA_MONTO = :MONTO;
    ELSE
        EXECUTE PROCEDURE RESTE_SALDO_EFECTIVO(:CAJA, :FEC, :MONTO, 'N');
    END
end
^

SET TERM ; ^


/* 20100710 */
/* DEJAR EL DTOMONTO SOLO COMO INFORMATIVO YA QUE EL SUMARSELO AL SUBTOTAL CONFUNDE, ENB ESPECIAL EN LA VERSION CON IVAS DETALLADOS */

SET TERM ^ ;

CREATE OR ALTER procedure IMPUESTOS_VENTAS (
    FECINI date,
    FECFIN date,
    PREFIJO varchar(4),
    PTOINI integer,
    PTOFIN integer,
    ANULADOS char(1),
    SUBEMPRESA integer)
returns (
    TIPO integer,
    NOMTIPO varchar(30),
    PREF varchar(4),
    NUMERO varchar(6),
    FECHA date,
    NIT varchar(20),
    NOMTERCERO varchar(60),
    SUBTOTAL numeric(18,2),
    DTOMONTO numeric(18,2),
    ADICIONAL numeric(18,2),
    IVAMONTO numeric(18,2),
    CONSUMO numeric(18,2),
    EXENTOS numeric(18,2),
    GRAVADOS1 numeric(18,2),
    GRAVADOS2 numeric(18,2),
    GRAVADOS3 numeric(18,2),
    IVA1 numeric(18,2),
    IVA2 numeric(18,2),
    IVA3 numeric(18,2),
    EXTRA numeric(18,2),
    TOTAL numeric(18,2),
    RTFTEMONTO numeric(18,2),
    RTIVAMONTO numeric(18,2),
    RTICAMONTO numeric(18,2),
    NETO numeric(18,2),
    ANULADO char(1))
AS
declare variable ID INTEGER;
declare variable TER_exento CHAR(1);
declare variable NOTAS CHAR(2);
declare variable ajustar CHAR(1);
declare variable FACTOR NUMERIC(18,4);
declare variable NUEVO NUMERIC(18,2);
declare variable FACTENC NUMERIC(18,2);
BEGIN
/* FACTURA */
TIPO = 31;
SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 31 INTO :NOMTIPO;
ajustar = 'N';
FOR SELECT FACT_ID, F.PREF_PRE, FACT_NUMERO, FACT_FECHA, TERC_NIT, FACT_NOMCLIENTE, FACT_ADICIONAL-FACT_DTOMONTO, FACT_IVAMONTO, FACT_RTFTEMONTO, FACT_RTIVAMONTO, FACT_RTICAMONTO, FACT_EXTRA, FACT_TOTAL, FACT_ANULADO, fact_factor
    FROM FACTURAS F, PREFIJOS PR WHERE PTVT_ID >= :PTOINI AND PTVT_ID <= :PTOFIN AND
    FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND ((:PREFIJO = '') or (:PREFIJO IS NULL) or (F.PREF_PRE = :PREFIJO))
    AND PR.PREF_PRE = F.PREF_PRE AND PR.TIDO_COD = 31 AND ((PR.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
    ORDER BY FACT_FECHA, F.PREF_PRE, FACT_NUMERO
    INTO :ID, :PREF, :NUMERO, :FECHA, :NIT, :NOMTERCERO, :DTOMONTO, :IVAMONTO, :RTFTEMONTO, :RTIVAMONTO, :RTICAMONTO, :EXTRA, :TOTAL, :ANULADO, :FACTENC
    DO
    BEGIN
    SELECT TERC_EXENTO FROM TERCEROS WHERE TERC_NIT = :NIT INTO :TER_EXENTO;
    if ((ANULADOS = 'S') or (ANULADO = 'N')) then
        BEGIN
        if (ANULADO = 'S') then
            BEGIN
            EXENTOS = 0;
            GRAVADOS1 = 0;
            GRAVADOS2 = 0;
            GRAVADOS3 = 0;
            CONSUMO = 0;
            SUBTOTAL = 0;
            TOTAL = 0;
            EXTRA = 0;
            IVAMONTO = 0;
            IVA1 = 0;
            IVA2 = 0;
            IVA3 = 0;
            DTOMONTO = 0;
            NETO = 0;
            RTFTEMONTO = 0;
            RTIVAMONTO = 0;
            RTICAMONTO = 0;
            END
        else
            BEGIN
            /* CALCULE LAS DIFERENTES TARIFAS */
            if (TER_EXENTO = 'S') then
                BEGIN
                SELECT SUM(FADE_TOTAL - FADE_IVAMONTO - FADE_CONSUMO)*:FACTENC FROM FACTURAS_DETALLE D WHERE FACT_ID = :ID AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL)) AND FADE_IVAMONTO = 0 INTO :EXENTOS;
                SELECT SUM((FADE_TOTAL - FADE_IVAMONTO - FADE_CONSUMO)*:FACTENC), SUM(FADE_IVAMONTO*:FACTENC) FROM FACTURAS_DETALLE D, TARIFA_IVA T WHERE FACT_ID = :ID AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL)) AND FADE_IVAPORC = TAIV_PORC AND FADE_IVAPORC = 16 AND FADE_IVAMONTO <> 0 INTO :GRAVADOS1, :IVA1;
                SELECT SUM((FADE_TOTAL - FADE_IVAMONTO - FADE_CONSUMO)*:FACTENC), SUM(FADE_IVAMONTO*:FACTENC) FROM FACTURAS_DETALLE D, TARIFA_IVA T WHERE FACT_ID = :ID AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL)) AND FADE_IVAPORC = TAIV_PORC AND FADE_IVAPORC = 10 AND FADE_IVAMONTO <> 0 INTO :GRAVADOS2, :IVA2;
                GRAVADOS3 = 0;
                IVA3 = 0;
                end
            else
                begin
                SELECT SUM((FADE_TOTAL - FADE_IVAMONTO - FADE_CONSUMO)*:FACTENC) FROM FACTURAS_DETALLE D WHERE FACT_ID = :ID AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL)) AND FADE_IVAPORC = 0 INTO :EXENTOS;
                SELECT SUM((FADE_TOTAL - FADE_IVAMONTO - FADE_CONSUMO)*:FACTENC), SUM(FADE_IVAMONTO*:FACTENC) FROM FACTURAS_DETALLE D, TARIFA_IVA T WHERE FACT_ID = :ID AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL)) AND FADE_IVAPORC = TAIV_PORC AND TAIV_COD = 1 INTO :GRAVADOS1, :IVA1;
                SELECT SUM((FADE_TOTAL - FADE_IVAMONTO - FADE_CONSUMO)*:FACTENC), SUM(FADE_IVAMONTO*:FACTENC) FROM FACTURAS_DETALLE D, TARIFA_IVA T WHERE FACT_ID = :ID AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL)) AND FADE_IVAPORC = TAIV_PORC AND TAIV_COD = 2 INTO :GRAVADOS2, :IVA2;
                SELECT SUM((FADE_TOTAL - FADE_IVAMONTO - FADE_CONSUMO)*:FACTENC), SUM(FADE_IVAMONTO*:FACTENC) FROM FACTURAS_DETALLE D, TARIFA_IVA T WHERE FACT_ID = :ID AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL)) AND FADE_IVAPORC = TAIV_PORC AND TAIV_COD = 3 INTO :GRAVADOS3, :IVA3;
                end
            if (iva1 is null) then
                iva1 = 0;
            if (iva2 is null) then
                iva2 = 0;
            if (iva3 is null) then
                iva3 = 0;
            SELECT SUM(FADE_CONSUMO) FROM FACTURAS_DETALLE WHERE FACT_ID = :ID AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL)) INTO :CONSUMO;
            SUBTOTAL = TOTAL - EXTRA - IVAMONTO;
            NETO = TOTAL - RTFTEMONTO - RTIVAMONTO - RTICAMONTO;
            END
        if (exentos is null) then
            exentos = 0;
        if (gravados1 is null) then
            gravados1 = 0;
        if (gravados2 is null) then
            gravados2 = 0;
        if (gravados3 is null) then
            gravados3 = 0;
        if (consumo is null) then
            consumo = 0;
        FACTOR = 1;
        SELECT AJCI_FACTOR FROM ajuste_cierre WHERE AJCI_PORC = 0 AND AJCI_FECINI <= :FECHA AND AJCI_FECFIN >= :FECHA INTO :FACTOR;
        if (FACTOR IS null) then
            FACTOR = 1;
        if (factor <> 1) then
            ajustar = 'S';
        EXENTOS = EXENTOS * FACTOR;
        FACTOR = 1;
        SELECT AJCI_FACTOR FROM ajuste_cierre WHERE AJCI_PORC = 16 AND AJCI_FECINI <= :FECHA AND AJCI_FECFIN >= :FECHA INTO :FACTOR;
        if (FACTOR IS null) then
            FACTOR = 1;
        if (factor <> 1) then
            ajustar = 'S';
        gravados1 = GRAVADOS1 * FACTOR;
        IVA1 = IVA1 * FACTOR;
        FACTOR = 1;
        SELECT AJCI_FACTOR FROM ajuste_cierre WHERE AJCI_PORC = 10 AND AJCI_FECINI <= :FECHA AND AJCI_FECFIN >= :FECHA INTO :FACTOR;
        if (FACTOR IS null) then
            FACTOR = 1;
        if (factor <> 1) then
            ajustar = 'S';
        gravados2 = GRAVADOS2 * FACTOR;
        IVA2 = IVA2 * FACTOR;
        FACTOR = 1;
        SELECT AJCI_FACTOR FROM ajuste_cierre WHERE AJCI_PORC = 7 AND AJCI_FECINI <= :FECHA AND AJCI_FECFIN >= :FECHA INTO :FACTOR;
        if (FACTOR IS null) then
            FACTOR = 1;
        if (factor <> 1) then
            ajustar = 'S';
        gravados3 = GRAVADOS3 * FACTOR;
        IVA3 = IVA3 * FACTOR;
        NUEVO = exentos + gravados1 + gravados2 + gravados3;
        if ((TOTAL <> 0) and (ajustar = 'S')) then
            BEGIN
            IVAMONTO = IVA1 + IVA2 + IVA3;
            CONSUMO = CONSUMO * (NUEVO+ivamonto+consumo) / TOTAL;
            SUBTOTAL = SUBTOTAL * (NUEVO+ivamonto+consumo) / TOTAL;
            NETO = NETO * (NUEVO+ivamonto+consumo) / TOTAL;
            rtftemonto = rtftemonto * (NUEVO+ivamonto+consumo) / TOTAL;
            rticamonto = rticamonto * (NUEVO+ivamonto+consumo) / TOTAL;
            rtivamonto = rtivamonto * (NUEVO+ivamonto+consumo) / TOTAL;
            dtomonto = dtomonto * (NUEVO+ivamonto+consumo) / TOTAL;
            adicional = adicional * (NUEVO+ivamonto+consumo) / TOTAL;
            total = total * (NUEVO+ivamonto+consumo) / TOTAL;
            END
        SUSPEND;
        END
    END
    
TIPO = 33;
ajustar = 'N';
SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 33 INTO :NOMTIPO;
/* DEVOLUCIONES */
FOR SELECT DEVT_ID, D.PREF_PRE, DEVT_NUMERO, DEVT_FECHA, TERC_NIT, DEVT_NOMTERC, DEVT_ADICIONAL-DEVT_DTOMONTO, DEVT_IVAMONTO, DEVT_RTFTEMONTO, DEVT_RTIVAMONTO, DEVT_RTICAMONTO, DEVT_EXTRA, DEVT_TOTAL, DEVT_ANULADO, DEVT_FACTOR
    FROM DEVOLUCIONES_VENTAS D, PREFIJOS PR WHERE PTVT_ID >= :PTOINI AND PTVT_ID <= :PTOFIN AND
    DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND ((:PREFIJO = '') or (:PREFIJO IS NULL) or (D.PREF_PRE = :PREFIJO))
    AND PR.PREF_PRE = D.PREF_PRE AND PR.TIDO_COD = 33 AND ((PR.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) AND ((DEVT_REMID = 0) or (DEVT_REMID IS NULL)) AND ((DEVT_PEDID = 0) or (DEVT_PEDID IS NULL))
    ORDER BY DEVT_FECHA, D.PREF_PRE, DEVT_NUMERO
    INTO :ID, :PREF, :NUMERO, :FECHA, :NIT, :NOMTERCERO, :DTOMONTO, :IVAMONTO, :RTFTEMONTO, :RTIVAMONTO, :RTICAMONTO, :EXTRA, :TOTAL, :ANULADO, :FACTENC
    DO
    BEGIN
    SELECT TERC_EXENTO FROM TERCEROS WHERE TERC_NIT = :NIT INTO :TER_EXENTO;
    if ((ANULADOS = 'S') or (ANULADO = 'N')) then
        BEGIN
        if (ANULADO = 'S') then
            BEGIN
            EXENTOS = 0;
            GRAVADOS1 = 0;
            GRAVADOS2 = 0;
            GRAVADOS3 = 0;
            CONSUMO = 0;
            SUBTOTAL = 0;
            TOTAL = 0;
            EXTRA = 0;
            IVAMONTO = 0;
            IVA1 = 0;
            IVA2 = 0;
            IVA3 = 0;
            DTOMONTO = 0;
            NETO = 0;
            RTFTEMONTO = 0;
            RTIVAMONTO = 0;
            RTICAMONTO = 0;
            END
        else
            BEGIN
            DTOMONTO = DTOMONTO * -1;
            ADICIONAL = ADICIONAL * -1;
            IVAMONTO = IVAMONTO * -1;
            EXTRA = EXTRA * -1;
            TOTAL = TOTAL * -1;
            RTFTEMONTO = RTFTEMONTO * -1;
            RTIVAMONTO = RTIVAMONTO * -1;
            RTICAMONTO = RTICAMONTO * -1;
            /* CALCULE LAS DIFERENTES TARIFAS */
            if (TER_EXENTO = 'S') then
              BEGIN
              SELECT SUM((DVDE_TOTAL - DVDE_IVAMONTO - DVDE_CONSUMO)*:FACTENC) FROM DEVOLUCIONES_VENTAS_DETALLE D WHERE DEVT_ID = :ID AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL)) AND DVDE_IVAMONTO = 0 INTO :EXENTOS;
              SELECT SUM((DVDE_TOTAL - DVDE_IVAMONTO - DVDE_CONSUMO)*:FACTENC), SUM(DVDE_IVAMONTO*:FACTENC) FROM DEVOLUCIONES_VENTAS_DETALLE D WHERE DEVT_ID = :ID AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL)) AND DVDE_IVAPORC = 16 AND DVDE_IVAMONTO <> 0 INTO :GRAVADOS1, :IVA1;
              SELECT SUM((DVDE_TOTAL - DVDE_IVAMONTO - DVDE_CONSUMO)*:FACTENC), SUM(DVDE_IVAMONTO*:FACTENC) FROM DEVOLUCIONES_VENTAS_DETALLE D WHERE DEVT_ID = :ID AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL)) AND DVDE_IVAPORC = 10 AND DVDE_IVAMONTO <> 0 INTO :GRAVADOS2, :IVA2;
              GRAVADOS3 = 0;
              iVA3 = 0;
              end
            else
              begin
              SELECT SUM((DVDE_TOTAL - DVDE_IVAMONTO - DVDE_CONSUMO)*:FACTENC) FROM DEVOLUCIONES_VENTAS_DETALLE D WHERE DEVT_ID = :ID AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL)) AND DVDE_IVAPORC = 0 INTO :EXENTOS;
              SELECT SUM((DVDE_TOTAL - DVDE_IVAMONTO - DVDE_CONSUMO)*:FACTENC), SUM(DVDE_IVAMONTO*:FACTENC) FROM DEVOLUCIONES_VENTAS_DETALLE D, TARIFA_IVA T WHERE DEVT_ID = :ID AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL)) AND DVDE_IVAPORC = TAIV_PORC AND TAIV_COD = 1 INTO :GRAVADOS1, :IVA1;
              SELECT SUM((DVDE_TOTAL - DVDE_IVAMONTO - DVDE_CONSUMO)*:FACTENC), SUM(DVDE_IVAMONTO*:FACTENC) FROM DEVOLUCIONES_VENTAS_DETALLE D, TARIFA_IVA T WHERE DEVT_ID = :ID AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL)) AND DVDE_IVAPORC = TAIV_PORC AND TAIV_COD = 2 INTO :GRAVADOS2, :IVA2;
              SELECT SUM((DVDE_TOTAL - DVDE_IVAMONTO - DVDE_CONSUMO)*:FACTENC), SUM(DVDE_IVAMONTO*:FACTENC) FROM DEVOLUCIONES_VENTAS_DETALLE D, TARIFA_IVA T WHERE DEVT_ID = :ID AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL)) AND DVDE_IVAPORC = TAIV_PORC AND TAIV_COD = 3 INTO :GRAVADOS3, :IVA3;
              end
            if (iva1 is null) then
                iva1 = 0;
            if (iva2 is null) then
                iva2 = 0;
            if (iva3 is null) then
                iva3 = 0;
            SELECT SUM(DVDE_CONSUMO) FROM DEVOLUCIONES_VENTAS_DETALLE WHERE DEVT_ID = :ID AND DVDE_REFERENCIA <> '.t' INTO :CONSUMO;
            EXENTOS = EXENTOS * -1;
            GRAVADOS1 = GRAVADOS1 * -1;
            GRAVADOS2 = GRAVADOS2 * -1;
            GRAVADOS3 = GRAVADOS3 * -1;
            CONSUMO = CONSUMO * -1;
            IVA1 = IVA1 * -1;
            IVA2 = IVA2 * -1;
            IVA3 = IVA3 * -1;
            SUBTOTAL = TOTAL - EXTRA - IVAMONTO;
            NETO = TOTAL - RTFTEMONTO - RTIVAMONTO - RTICAMONTO;
            END
        if (exentos is null) then
            exentos = 0;
        if (gravados1 is null) then
            gravados1 = 0;
        if (gravados2 is null) then
            gravados2 = 0;
        if (gravados3 is null) then
            gravados3 = 0;
        if (consumo is null) then
            consumo = 0;
        FACTOR = 1;
        SELECT AJCI_FACTOR FROM ajuste_cierre WHERE AJCI_PORC = 0 AND AJCI_FECINI <= :FECHA AND AJCI_FECFIN >= :FECHA INTO :FACTOR;
        if (FACTOR IS null) then
            FACTOR = 1;
        if (factor <> 1) then
            ajustar = 'S';
        EXENTOS = EXENTOS * FACTOR;
        FACTOR = 1;
        SELECT AJCI_FACTOR FROM ajuste_cierre WHERE AJCI_PORC = 16 AND AJCI_FECINI <= :FECHA AND AJCI_FECFIN >= :FECHA INTO :FACTOR;
        if (FACTOR IS null) then
            FACTOR = 1;
        if (factor <> 1) then
            ajustar = 'S';
        gravados1 = GRAVADOS1 * FACTOR;
        IVA1 = IVA1 * FACTOR;
        FACTOR = 1;
        SELECT AJCI_FACTOR FROM ajuste_cierre WHERE AJCI_PORC = 10 AND AJCI_FECINI <= :FECHA AND AJCI_FECFIN >= :FECHA INTO :FACTOR;
        if (FACTOR IS null) then
            FACTOR = 1;
        if (factor <> 1) then
            ajustar = 'S';
        gravados2 = GRAVADOS2 * FACTOR;
        IVA2 = IVA2 * FACTOR;
        FACTOR = 1;
        SELECT AJCI_FACTOR FROM ajuste_cierre WHERE AJCI_PORC = 7 AND AJCI_FECINI <= :FECHA AND AJCI_FECFIN >= :FECHA INTO :FACTOR;
        if (FACTOR IS null) then
            FACTOR = 1;
        if (factor <> 1) then
            ajustar = 'S';
        gravados3 = GRAVADOS3 * FACTOR;
        IVA3 = IVA3 * FACTOR;
        NUEVO = exentos + gravados1 + gravados2 + gravados3;
        if ((TOTAL <> 0) and (ajustar = 'S')) then
            BEGIN
            IVAMONTO = IVA1 + IVA2 + IVA3;
            CONSUMO = CONSUMO * (NUEVO+ivamonto+consumo) / TOTAL;
            SUBTOTAL = SUBTOTAL * (NUEVO+ivamonto+consumo) / TOTAL;
            NETO = NETO * (NUEVO+ivamonto+consumo) / TOTAL;
            rtftemonto = rtftemonto * (NUEVO+ivamonto+consumo) / TOTAL;
            rticamonto = rticamonto * (NUEVO+ivamonto+consumo) / TOTAL;
            rtivamonto = rtivamonto * (NUEVO+ivamonto+consumo) / TOTAL;
            dtomonto = dtomonto * (NUEVO+ivamonto+consumo) / TOTAL;
            adicional = adicional * (NUEVO+ivamonto+consumo) / TOTAL;
            total = total * (NUEVO+ivamonto+consumo) / TOTAL;
            END
        SUSPEND;
        END
    END
execute procedure lee_configuracion ('FACTURACION', 'DOCUMENTOS', 'INCLUIR NOTAS DE CARTERA EN REPORTE DE IMPUESTOS EN VENTAS') returning_values (:NOTAS);
if (NOTAS = 'SI') then
    BEGIN
    TIPO = 41;
    SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 41 INTO :NOMTIPO;
    FOR SELECT NDCL_ID, N.PREF_PRE, NDCL_NUMERO, NDCL_FECHA, N.TERC_NIT, TERC_NOM, 0, NDCL_IVAMONTO, NDCL_RTFTEMONTO, NDCL_RTIVAMONTO, NDCL_RTICAMONTO, 0, NDCL_MONTO+NDCL_IVAMONTO, NDCL_ANULADO
        FROM NOTAS_DEBITO_CLIENTES N, TERCEROS T, PREFIJOS PR WHERE N.TERC_NIT = T.TERC_NIT AND
        NDCL_FECHA >= :FECINI AND NDCL_FECHA <= :FECFIN AND ((:PREFIJO = '') or (:PREFIJO IS NULL) or (N.PREF_PRE = :PREFIJO))
        AND PR.PREF_PRE = N.PREF_PRE AND PR.TIDO_COD = 41 AND ((PR.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
        ORDER BY NDCL_FECHA, N.PREF_PRE, NDCL_NUMERO
        INTO :ID, :PREF, :NUMERO, :FECHA, :NIT, :NOMTERCERO, :DTOMONTO, :IVAMONTO, :RTFTEMONTO, :RTIVAMONTO, :RTICAMONTO, :EXTRA, :TOTAL, :ANULADO
        DO
        BEGIN
        GRAVADOS2 = 0;
        GRAVADOS3 = 0;
        IVA2 = 0;
        IVA3 = 0;
        CONSUMO = 0;
        if (ANULADO = 'S') then
            BEGIN
            EXENTOS = 0;
            GRAVADOS1 = 0;
            SUBTOTAL = 0;
            TOTAL = 0;
            EXTRA = 0;
            IVAMONTO = 0;
            IVA1 = 0;
            DTOMONTO = 0;
            NETO = 0;
            RTFTEMONTO = 0;
            RTIVAMONTO = 0;
            RTICAMONTO = 0;
            END
        ELSE
            BEGIN
            if (IVAMONTO <> 0) then
                BEGIN
                GRAVADOS1 = TOTAL-IVAMONTO;
                IVA1 = IVAMONTO;
                exentos = 0;
                END
            ELSE
                BEGIN
                GRAVADOS1 = 0;
                IVA1 = 0;
                exentos = TOTAL;
                END
            SUBTOTAL = TOTAL - EXTRA - IVAMONTO;
            NETO = TOTAL - RTFTEMONTO - RTIVAMONTO - RTICAMONTO;
            END
        SUSPEND;
        END

    TIPO = 42;
    SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 42 INTO :NOMTIPO;
    FOR SELECT NCCL_ID, N.PREF_PRE, NCCL_NUMERO, NCCL_FECHA, N.TERC_NIT, TERC_NOM, 0, NCCL_IVAMONTO, NCCL_RTFTEMONTO, NCCL_RTIVAMONTO, NCCL_RTICAMONTO, 0, NCCL_MONTO+NCCL_IVAMONTO, NCCL_ANULADO
        FROM NOTAS_CREDITO_CLIENTES N, TERCEROS T, PREFIJOS PR WHERE N.TERC_NIT = T.TERC_NIT AND
        NCCL_FECHA >= :FECINI AND NCCL_FECHA <= :FECFIN AND ((:PREFIJO = '') or (:PREFIJO IS NULL) or (N.PREF_PRE = :PREFIJO))
        AND PR.PREF_PRE = N.PREF_PRE AND PR.TIDO_COD = 42 AND ((PR.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
        ORDER BY NCCL_FECHA, N.PREF_PRE, NCCL_NUMERO
        INTO :ID, :PREF, :NUMERO, :FECHA, :NIT, :NOMTERCERO, :DTOMONTO, :IVAMONTO, :RTFTEMONTO, :RTIVAMONTO, :RTICAMONTO, :EXTRA, :TOTAL, :ANULADO
        DO
        BEGIN
        GRAVADOS2 = 0;
        GRAVADOS3 = 0;
        IVA2 = 0;
        IVA3 = 0;
        CONSUMO = 0;
        if (ANULADO = 'S') then
            BEGIN
            EXENTOS = 0;
            GRAVADOS1 = 0;
            SUBTOTAL = 0;
            TOTAL = 0;
            EXTRA = 0;
            IVAMONTO = 0;
            IVA1 = 0;
            DTOMONTO = 0;
            NETO = 0;
            RTFTEMONTO = 0;
            RTIVAMONTO = 0;
            RTICAMONTO = 0;
            END
        ELSE
            BEGIN
            DTOMONTO = DTOMONTO * -1;
            ADICIONAL = ADICIONAL * -1;
            IVAMONTO = IVAMONTO * -1;
            EXTRA = EXTRA * -1;
            TOTAL = TOTAL * -1;
            RTFTEMONTO = RTFTEMONTO * -1;
            RTIVAMONTO = RTIVAMONTO * -1;
            RTICAMONTO = RTICAMONTO * -1;
            if (IVAMONTO <> 0) then
                BEGIN
                GRAVADOS1 = TOTAL-IVAMONTO;
                IVA1 = IVAMONTO;
                exentos = 0;
                END
            ELSE
                BEGIN
                GRAVADOS1 = 0;
                IVA1 = 0;
                exentos = TOTAL;
                END
            SUBTOTAL = TOTAL - EXTRA - IVAMONTO;
            NETO = TOTAL - RTFTEMONTO - RTIVAMONTO - RTICAMONTO;
            END
        SUSPEND;
        END
    END
END
^

SET TERM ; ^


/* 20100711 */
/* VENCIMIENTO DE LOTES AL IMPRIMIR DOCUMENTOS DE INVENTARIO */
SET TERM ^ ;

CREATE OR ALTER procedure IMPR_ENTRADA (
    ID integer)
returns (
    PREF varchar(4),
    NUMERO varchar(6),
    FECHA date,
    CONCEPTO varchar(60),
    REFER varchar(60),
    CODBODEGA varchar(2),
    NOMBODEGA varchar(30),
    NOMTERCERO varchar(60),
    OBS blob sub_type 1 segment size 80,
    ITEM integer,
    ARTICULO varchar(15),
    CODBAR varchar(15),
    ARTIDES varchar(60),
    CANT numeric(18,4),
    UNIDAD varchar(8),
    BODITEM varchar(2),
    STAND varchar(20),
    COSTO numeric(18,2),
    DTOPORC numeric(9,2),
    DTOMONTO numeric(18,2),
    IVAPORC numeric(9,2),
    IVAMONTO numeric(18,2),
    CONSUMO numeric(18,2),
    TOTAL numeric(18,2),
    PRECIO numeric(18,2),
    LOTE varchar(15),
    LOTEVENCE DATE,
    PESOUNIT numeric(18,4),
    PESOTOT numeric(18,4),
    VOLUMUNIT numeric(18,4),
    VOLUMTOT numeric(18,4),
    TOTALDOC numeric(18,2),
    CONSUMODOC numeric(18,2),
    TOTALMASIMP numeric(18,2))
AS
declare variable IMPTOS CHAR(1);
declare variable LARGO NUMERIC(18,4);
declare variable ANCHO NUMERIC(18,4);
declare variable ALTO NUMERIC(18,4);
declare variable LISTA CHAR(3);
declare variable ICOINC CHAR(2);
BEGIN
  /*  */
  PESOTOT = 0;
  VOLUMTOT = 0;
  SELECT PREF_PRE, ENTR_NUMERO, ENTR_FECHA, ENTR_CONC, ENTR_REFER, E.BODE_COD, BODE_NOM, ENTR_NOMTERC, ENTR_IMPTOS, ENTR_OBS
    FROM ENTRADAS E, BODEGA B
    WHERE E.BODE_COD = B.BODE_COD AND E.ENTR_ID = :ID
    into :PREF, :NUMERO, :FECHA, :CONCEPTO, :REFER, :CODBODEGA, :NOMBODEGA, :NOMTERCERO, :IMPTOS, :OBS;
  SELECT SUM(ENDE_TOTAL), SUM(ENDE_IVAMONTO), SUM(ENDE_CONSUMO*ENDE_CANT*ENDE_FACTOR) FROM ENTRADAS_DETALLE
    WHERE ENTR_ID = :ID INTO :TOTALDOC, :IVAMONTO, :CONSUMODOC;
  TOTALDOC = TOTALDOC - IVAMONTO;
  EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION','ARTICULOS','IMPOCONSUMO INCLUIDO EN EL PRECIO BASE DE VENTA ANTES DE IVA') returning_values (:ICOINC);
  if (ICOINC <> 'SI') then
      TOTALMASIMP = TOTALDOC + CONSUMODOC;
  FOR SELECT ENDE_ITEM, A.ARTI_COD, ENDE_CODBAR, SUBSTR(ENDE_DESC,1,60), ENDE_CANT, ENDE_UNIDAD, BODE_COD, ENDE_COSTO, ENDE_DTOPORC, ENDE_DTOMONTO, ENDE_IVAPORC, ENDE_IVAMONTO, ENDE_CONSUMO, ENDE_TOTAL, ENDE_LOTE, LOTE_VENCE,
    (ARTI_PESO / 1000 * ENDE_CANT * ENDE_FACTOR), (ARTI_LARGO / 100 * ENDE_FACTOR), (ARTI_ANCHO / 100 * ENDE_FACTOR), (ARTI_ALTO / 100 * ENDE_FACTOR)
    FROM ENTRADAS_DETALLE D, ARTICULO A
    WHERE D.ARTI_COD = A.ARTI_COD AND D.ENTR_ID = :ID
    ORDER BY ENDE_ITEM
    INTO :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :BODITEM, :COSTO, :DTOPORC, :DTOMONTO, :IVAPORC, :IVAMONTO, :CONSUMO, :TOTAL, :LOTE, :lotevence,
    :PESOUNIT, :LARGO, :ANCHO, :ALTO
    DO
      BEGIN
      EXECUTE PROCEDURE LEE_CONFIGURACION('INVENTARIO','DOCUMENTOS','CODIGO DE LISTA DE PRECIOS A IMPRIMIR EN DOCUMENTOS') returning_values (:LISTA);
      if (NOT lista IS NULL) then
          SELECT PRAR_FIJO FROM PRECIOS_ARTICULO WHERE ARTI_COD = :articulo AND LIPR_COD = :LISTA INTO :PRECIO;
      if (PESOUNIT IS NULL) then
        PESOUNIT = 0;
      PESOTOT = PESOTOT + PESOUNIT;
      VOLUMUNIT = ANCHO * ALTO * LARGO;
      volumunit = VOLUMUNIT * CANT;
      if (VOLUMUNIT IS NULL) then
        VOLUMUNIT = 0;
      VOLUMTOT = VOLUMTOT + VOLUMUNIT;
      TOTAL = TOTAL - IVAMONTO;
      SELECT STAND_COD FROM STANDS WHERE ARTI_COD = :ARTICULO AND STAND_BODEGA = :boditem INTO :stand;
      SUSPEND;
      END
END
^

SET TERM ; ^


SET TERM ^ ;

CREATE OR ALTER procedure IMPR_AJUSTE (
    ID integer)
returns (
    PREF varchar(4),
    NUMERO varchar(6),
    FECHA date,
    CONCEPTO varchar(60),
    CODBODEGA varchar(2),
    NOMBODEGA varchar(30),
    OBS blob sub_type 1 segment size 80,
    AJUSTAR char(2),
    STAND varchar(20),
    ITEM integer,
    ARTICULO varchar(15),
    CODBAR varchar(15),
    ARTIDES varchar(60),
    EXANT numeric(18,4),
    EXNUE numeric(18,4),
    CANT numeric(18,4),
    UNIDAD varchar(8),
    BODITEM varchar(2),
    LOTE varchar(15),
    LOTEVENCE DATE,
    COSTO numeric(18,2),
    TOTAL numeric(18,2))
AS
BEGIN
  /*  */
  SELECT PREF_PRE, AJUS_NUMERO, AJUS_FECHA, AJUS_CONC, A.BODE_COD, BODE_NOM, AJUS_OBS, AJUS_NOAJUSTAR, AJUS_STAND
    FROM AJUSTES A, BODEGA B WHERE A.BODE_COD = B.BODE_COD AND A.AJUS_ID = :ID into
    :PREF, :NUMERO, :FECHA, :CONCEPTO, :CODBODEGA, :NOMBODEGA, :OBS, :AJUSTAR, :STAND;
  if (AJUSTAR = 'S') then
    AJUSTAR = 'NO';
  else
    AJUSTAR = 'SI';
  FOR SELECT AJUS_ITEM, A.ARTI_COD, AJUS_CODBAR, AJDE_DESC, AJUS_EXANT, AJUS_UNIDAD, BODE_COD, AJUS_EXNUE, AJUS_LOTE
    FROM AJUSTES_DETALLE D, ARTICULO A
    WHERE D.ARTI_COD = A.ARTI_COD AND D.AJUS_ID = :ID
    ORDER BY AJUS_ITEM
    INTO :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :EXANT, :UNIDAD, :BODITEM, :EXNUE, :LOTE
    DO
      BEGIN
      EXECUTE PROCEDURE COSTO_PROMEDIO(:ARTICULO, :FECHA) returning_values (:COSTO);
      LOTEVENCE = NULL;
      SELECT LOTE_VENCE FROM LOTES WHERE ARTI_COD = :ARTICULO AND LOTE_NRO = :LOTE INTO :lotevence;
      CANT = EXNUE - EXANT;
      TOTAL = CANT * COSTO;
      SUSPEND;
      END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure IMPR_SALIDA (
    ID integer)
returns (
    PREF varchar(4),
    NUMERO varchar(6),
    FECHA date,
    CONCEPTO varchar(60),
    REFER varchar(60),
    CODBODEGA varchar(2),
    NOMBODEGA varchar(30),
    NOMTERCERO varchar(60),
    OBS blob sub_type 0 segment size 80,
    ITEM integer,
    ARTICULO varchar(15),
    CODBAR varchar(15),
    ARTIDES varchar(60),
    CANT numeric(18,4),
    UNIDAD varchar(8),
    BODITEM varchar(2),
    STAND varchar(20),
    COSTO numeric(18,2),
    IVAPORC numeric(9,2),
    IVAMONTO numeric(18,2),
    CONSUMO numeric(18,2),
    TOTAL numeric(18,2),
    TOTALITEM numeric(18,2),
    PRECIO numeric(18,2),
    LOTE varchar(15),
    LOTEVENCE DATE,
    PESOUNIT numeric(18,4),
    PESOTOT numeric(18,4),
    VOLUMUNIT numeric(18,4),
    VOLUMTOT numeric(18,4),
    TOTALDOC numeric(18,2),
    ULTIMO numeric(18,2),
    TOTALULT numeric(18,2),
    CONSUMODOC numeric(18,2),
    TOTALMASIMP numeric(18,2))
AS
declare variable IMPTOS CHAR(1);
declare variable LARGO NUMERIC(18,4);
declare variable ANCHO NUMERIC(18,4);
declare variable ALTO NUMERIC(18,4);
declare variable LISTA CHAR(3);
declare variable ICOINC CHAR(2);
BEGIN
  PESOTOT = 0;
  VOLUMTOT = 0;
  SELECT PREF_PRE, SALI_NUMERO, SALI_FECHA, SALI_CONC, SALI_REFER, S.BODE_COD, BODE_NOM, SALI_NOMTERC, SALI_IMPTOS, SALI_OBS
    FROM SALIDAS S, BODEGA B WHERE S.BODE_COD = B.BODE_COD AND S.SALI_ID = :ID into
    :PREF, :NUMERO, :FECHA, :CONCEPTO, :REFER, :CODBODEGA, :NOMBODEGA, :NOMTERCERO, :IMPTOS, :OBS;
  SELECT SUM(SADE_TOTAL), SUM(SADE_IVAMONTO), SUM(SADE_CONSUMO*SADE_CANT*SADE_FACTOR) FROM SALIDAS_DETALLE
    WHERE SALI_ID = :ID INTO :TOTALDOC, :IVAMONTO, :CONSUMODOC;
  TOTALDOC = TOTALDOC - IVAMONTO;
  EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION','ARTICULOS','IMPOCONSUMO INCLUIDO EN EL PRECIO BASE DE VENTA ANTES DE IVA') returning_values (:ICOINC);
  if (ICOINC <> 'SI') then
      TOTALMASIMP = TOTALDOC + CONSUMODOC;
  FOR SELECT SADE_ITEM, A.ARTI_COD, SADE_CODBAR, SADE_DESC, SADE_CANT, SADE_UNIDAD, BODE_COD, SADE_COSTO, SADE_IVAPORC, SADE_IVAMONTO, SADE_CONSUMO, SADE_TOTAL, SADE_LOTE,
    (ARTI_PESO / 1000 * SADE_CANT * SADE_FACTOR), (ARTI_LARGO / 100 * SADE_FACTOR), (ARTI_ANCHO / 100 * SADE_FACTOR), (ARTI_ALTO / 100 * SADE_FACTOR)
    FROM SALIDAS_DETALLE D, ARTICULO A
    WHERE D.ARTI_COD = A.ARTI_COD AND D.SALI_ID = :ID
    ORDER BY SADE_ITEM
    INTO :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :BODITEM, :COSTO, :IVAPORC, :IVAMONTO, :CONSUMO, :TOTAL, :LOTE,
    :PESOUNIT, :LARGO, :ANCHO, :ALTO
    DO
      BEGIN
      EXECUTE PROCEDURE LEE_CONFIGURACION('INVENTARIO','DOCUMENTOS','CODIGO DE LISTA DE PRECIOS A IMPRIMIR EN DOCUMENTOS') returning_values (:LISTA);
      if (NOT lista IS NULL) then
          SELECT PRAR_FIJO FROM PRECIOS_ARTICULO WHERE ARTI_COD = :articulo AND LIPR_COD = :LISTA INTO :PRECIO;
      EXECUTE PROCEDURE ultimo_costo(:articulo, :fecha,  :unidad) returning_values (:ultimo);
      TOTALULT = CANT * ULTIMO;
      TOTALITEM = COSTO + IVAMONTO + CONSUMO;
      TOTAL = TOTAL - IVAMONTO;
      if (PESOUNIT IS NULL) then
        PESOUNIT = 0;
      PESOTOT = PESOTOT + PESOUNIT;
      VOLUMUNIT = ANCHO * ALTO * LARGO;
      volumunit = VOLUMUNIT * CANT;
      if (VOLUMUNIT IS NULL) then
        VOLUMUNIT = 0;
      VOLUMTOT = VOLUMTOT + VOLUMUNIT;
      SELECT STAND_COD FROM STANDS WHERE ARTI_COD = :ARTICULO AND STAND_BODEGA = :boditem INTO :stand;
      LOTEVENCE = NULL;
      SELECT LOTE_VENCE FROM LOTES WHERE ARTI_COD = :ARTICULO AND LOTE_NRO = :LOTE INTO :lotevence;
      SUSPEND;
      END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure IMPR_TRASFERENCIA (
    ID integer)
returns (
    PREF varchar(4),
    NUMERO varchar(6),
    FECHA date,
    CONCEPTO varchar(60),
    REFER varchar(60),
    CODBODORI varchar(2),
    NOMBODORI varchar(30),
    CODBODDES varchar(2),
    NOMBODDES varchar(30),
    OBS blob sub_type 0 segment size 80,
    ITEM integer,
    ARTICULO varchar(15),
    CODBAR varchar(15),
    ARTIDES varchar(60),
    CANT numeric(18,4),
    UNIDAD varchar(8),
    BODITEM varchar(2),
    COSTO numeric(18,2),
    IVAPORC numeric(9,2),
    IVAMONTO numeric(18,2),
    CONSUMO numeric(18,2),
    TOTAL numeric(18,2),
    PRECIO numeric(18,2),
    LOTE varchar(15),
    LOTEVENCE DATE,
    PESOUNIT numeric(18,4),
    PESOTOT numeric(18,4),
    VOLUMUNIT numeric(18,4),
    VOLUMTOT numeric(18,4),
    TOTALDOC numeric(18,2),
    CONSUMODOC numeric(18,2),
    TOTALMASIMP numeric(18,2))
AS
declare variable IMPTOS CHAR(1);
declare variable LARGO NUMERIC(18,4);
declare variable ANCHO NUMERIC(18,4);
declare variable ALTO NUMERIC(18,4);
declare variable LISTA CHAR(3);
BEGIN
  /*  */
  SELECT PREF_PRE, TRAN_NUMERO, TRAN_FECHA, TRAN_CONC, TRAN_REFER, T.BODE_COD, BO.BODE_NOM, TRAN_BODDES, BD.BODE_NOM, TRAN_IMPTOS, TRAN_OBS
    FROM TRASFERENCIAS T, BODEGA BO, BODEGA BD WHERE T.BODE_COD = BO.BODE_COD AND T.TRAN_BODDES = BD.BODE_COD AND T.TRAN_ID = :ID into
    :PREF, :NUMERO, :FECHA, :CONCEPTO, :REFER, :CODBODORI, :NOMBODORI, :CODBODDES, :NOMBODDES, :IMPTOS, :OBS;
  SELECT SUM(TRAS_TOTAL), SUM(TRAS_IVAMONTO), SUM(TRAS_CONSUMO*TRAS_CANT*TRAS_FACTOR) FROM TRASFERENCIAS_DETALLE 
    WHERE TRAN_ID = :ID INTO :TOTALDOC, :IVAMONTO, :CONSUMODOC;
  TOTALMASIMP = TOTALDOC + CONSUMODOC;
  if (IMPTOS = 'N') then
    TOTALDOC = TOTALDOC - IVAMONTO;
  ITEM = 0;
  boditem = codbodori;
  FOR SELECT A.ARTI_COD, TRAS_CODBAR, TRAS_DESC, TRAS_CANT, TRAS_UNIDAD, TRAS_COSTO, TRAS_IVAPORC, TRAS_IVAMONTO, TRAS_CONSUMO, TRAS_TOTAL, TRAS_LOTE,
    (ARTI_PESO / 1000 * TRAS_CANT * TRAS_FACTOR), (ARTI_LARGO / 100 * TRAS_FACTOR), (ARTI_ANCHO / 100 * TRAS_FACTOR), (ARTI_ALTO / 100 * TRAS_FACTOR)
    FROM TRASFERENCIAS_DETALLE D, ARTICULO A
    WHERE D.ARTI_COD = A.ARTI_COD AND D.TRAN_ID = :ID
    ORDER BY TRAS_ITEM
    INTO :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :COSTO, :IVAPORC, :IVAMONTO, :CONSUMO, :TOTAL, :LOTE,
    :PESOUNIT, :LARGO, :ANCHO, :ALTO
    DO
      BEGIN
      EXECUTE PROCEDURE LEE_CONFIGURACION('INVENTARIO','DOCUMENTOS','CODIGO DE LISTA DE PRECIOS A IMPRIMIR EN DOCUMENTOS') returning_values (:LISTA);
      if (NOT lista IS NULL) then
          SELECT PRAR_FIJO FROM PRECIOS_ARTICULO WHERE ARTI_COD = :articulo AND LIPR_COD = :LISTA INTO :PRECIO;
      ITEM = ITEM + 1;
      if (PESOUNIT IS NULL) then
        PESOUNIT = 0;
      PESOTOT = PESOTOT + PESOUNIT;
      VOLUMUNIT = ANCHO * ALTO * LARGO;
      volumunit = VOLUMUNIT * CANT;
      if (VOLUMUNIT IS NULL) then
        VOLUMUNIT = 0;
      VOLUMTOT = VOLUMTOT + VOLUMUNIT;
      if (IMPTOS = 'N') then
        TOTAL = TOTAL - IVAMONTO;
      LOTEVENCE = NULL;
      SELECT LOTE_VENCE FROM LOTES WHERE ARTI_COD = :ARTICULO AND LOTE_NRO = :LOTE INTO :lotevence;
      SUSPEND;
      END
END
^

SET TERM ; ^

/* 20100715B */
/* CUADRE DE CAJA POR AGENCIA MAL LAS DEVOLUCIONES, EL DETALLE INCLUIA LAS DEV. Y NC. AUN EN CERO */
SET TERM ^ ;

CREATE OR ALTER procedure CUADRE_CAJA (
    FECHA date,
    AGENCIA integer)
returns (
    VTACONTADO numeric(18,2),
    VTACREDITO numeric(18,2),
    VTATOTAL numeric(18,2),
    VTARETS numeric(18,2),
    DEVCONTADO numeric(18,2),
    DEVCREDITO numeric(18,2),
    DEVTOTAL numeric(18,2),
    DEVOTRODIA numeric(18,2),
    DEVRETS numeric(18,2),
    NETOCONTADO numeric(18,2),
    NETOCREDITO numeric(18,2),
    NETOTOTAL numeric(18,2),
    NETORETS numeric(18,2),
    INGCONTADO numeric(18,2),
    INGDESCTO numeric(18,2),
    INGCXC numeric(18,2),
    INGOTROS numeric(18,2),
    INGTOTAL numeric(18,2),
    EGRCXP numeric(18,2),
    EGROTROS numeric(18,2),
    EGRTOTAL numeric(18,2),
    CONSIGNA numeric(18,2),
    FORMAP1 numeric(18,2),
    FORMAP2 numeric(18,2),
    FORMAP3 numeric(18,2),
    FORMAP4 numeric(18,2),
    FORMAP5 numeric(18,2),
    FORMAP6 numeric(18,2),
    FORMAP7 numeric(18,2),
    FORMAP8 numeric(18,2),
    FORMAP9 numeric(18,2),
    FORMAP0 numeric(18,2))
AS
declare variable DEVDSCTOS NUMERIC(18,2);
declare variable APLIDEV NUMERIC(18,2);
declare variable APLIFAC NUMERIC(18,2);
declare variable IDDOC INTEGER;
declare variable FECDOC DATE;
declare variable APLICA NUMERIC(18,2);
begin
/* ventas totales */
SELECT SUM(FACT_TOTAL), SUM(FACT_RTFTEMONTO+FACT_RTIVAMONTO+FACT_RTICAMONTO) FROM FACTURAS F, PREFIJOS P
    WHERE FACT_FECHA = :FECHA AND FACT_ANULADO = 'N' AND P.tido_cod = 31 AND P.pref_pre = F.pref_pre AND ((:AGENCIA = 0) or (P.sucu_id = :AGENCIA))
    INTO :VTATOTAL, :vtarets;
if (vtatotal IS NULL) then
    vtatotal = 0;
if (vtarets IS NULL) then
    vtarets = 0;
vtatotal = VTATOTAL - vtarets;
SELECT SUM(DEVT_TOTAL), SUM(DEVT_RTFTEMONTO+DEVT_RTIVAMONTO+DEVT_RTICAMONTO) FROM DEVOLUCIONES_VENTAS V, PREFIJOS P
    WHERE DEVT_FECHA = :FECHA AND DEVT_ANULADO = 'N' AND P.tido_cod = 33 AND P.pref_pre = V.pref_pre AND ((:AGENCIA = 0) or (P.sucu_id = :AGENCIA))
    INTO :DEVTOTAL, :devrets;
if (devtotal IS NULL) then
    devtotal = 0;
if (devrets IS NULL) then
    devrets = 0;
devtotal = DEVTOTAL - DEVRETS;
/* ventas contado */
SELECT SUM(RCDE_ABONO), SUM(RCDE_DTOF) FROM RECIBOS_CAJA_DETALLE D, RECIBOS_CAJA R,  FACTURAS F, PREFIJOS P
    WHERE FACT_FECHA = :FECHA AND D.rcde_tipodoc = 31 AND D.rcde_iddoc = F.fact_id AND R.reca_id = D.reca_id AND
        RECA_FECHA = :FECHA AND RCDE_ANULADO = 'N' AND P.tido_cod = 61 AND P.pref_pre = R.pref_pre AND ((:AGENCIA = 0) or (P.sucu_id = :AGENCIA))
    INTO :vtacontado, :ingdescto;
SELECT SUM(RCDE_ABONO), SUM(RCDE_DTOF) FROM RECIBOS_CAJA_DETALLE D, RECIBOS_CAJA R,  DEVOLUCIONES_VENTAS V, PREFIJOS P
    WHERE DEVT_FECHA = :FECHA AND D.rcde_tipodoc = 33 AND D.rcde_iddoc = V.devt_id AND R.reca_id = D.reca_id AND
    RECA_FECHA = :FECHA AND RCDE_ANULADO = 'N' AND P.tido_cod = 61 AND P.pref_pre = R.pref_pre AND ((:AGENCIA = 0) or (P.sucu_id = :AGENCIA))
    INTO :devcontado, :devdsctos;
if (vtacontado IS NULL) then
    vtacontado = 0;
if (ingdescto IS NULL) then
    ingdescto = 0;
if (devcontado IS NULL) then
    devcontado = 0;
else
    devcontado = devcontado * -1;
if (devdsctos IS NULL) then
    devdsctos = 0;
SELECT SUM(ACDE_APLICADO) FROM APLICACION_CLIENTE_DETALLE D, APLICACION_CLIENTE R,  FACTURAS F, PREFIJOS P
    WHERE FACT_FECHA = :FECHA AND D.acde_tipodoc = 31 AND D.acde_iddoc = F.fact_id AND R.apcl_id = D.apcl_id AND
    APCL_FECHA = :FECHA AND ACDE_ANULADO = 'N' AND P.tido_cod = 43 AND P.pref_pre = R.pref_pre AND ((:AGENCIA = 0) or (P.sucu_id = :AGENCIA))
    INTO :aplifac;
if (APLIFAC IS NULL) then
    APLIFAC = 0;
vtacontado = vtacontado + aplifac;
/* DESGLOCE LAS DEV DE HOY DE LAS DE AYER */
APLIDEV = 0;
devotrodia = 0;
FOR SELECT D.acde_iddoc, ACDE_APLICADO FROM APLICACION_CLIENTE_DETALLE D, APLICACION_CLIENTE R, PREFIJOS P
    WHERE R.apcl_id = D.apcl_id AND APCL_FECHA = :FECHA AND ACDE_ANULADO = 'N' AND D.acde_tipodoc = 33 AND P.tido_cod = 43 AND P.pref_pre = R.pref_pre AND ((:AGENCIA = 0) or (P.sucu_id = :AGENCIA))
    INTO :IDDOC, :aplica
    DO
    BEGIN
    SELECT DEVT_FECHA, DEVT_FACTID FROM DEVOLUCIONES_VENTAS WHERE DEVT_ID = :IDDOC INTO :FECDOC, :IDDOC;
    SELECT FACT_FECHA FROM FACTURAS WHERE FACT_ID = :IDDOC INTO :FECDOC;
    if (FECDOC = FECHA) then
        APLIDEV = APLIDEV + aplica;
    ELSE
        devotrodia = devotrodia + APLICA;
    END
aplidev = aplidev * -1;
devotrodia = devotrodia * -1;
devtotal = devtotal - devotrodia;
devcontado = devcontado + aplidev;
/* Ventas credito */
vtacredito = vtatotal - vtacontado;
devcredito = devtotal - devcontado;
netocontado = vtacontado - devcontado;
netocredito = vtacredito - devcredito;
netototal = vtatotal - devtotal;
netorets = vtarets - devrets;
/* recibos contado */
ingcontado = vtacontado - devcontado;
ingdescto = ingdescto - devdsctos;

/* recibos totales */
select sum(reca_monto) from recibos_caja r, prefijos p
    where reca_fecha = :fecha AND RECA_ANULADO = 'N' AND P.tido_cod = 61 AND P.pref_pre = r.pref_pre AND ((:AGENCIA = 0) or (P.sucu_id = :AGENCIA))
    into :ingtotal;
if (ingtotal IS NULL) then
    ingtotal = 0;
/* recibos otros */
select sum(reca_monto) from recibos_caja r, prefijos p
    where reca_fecha = :fecha AND RECA_ANULADO = 'N' AND P.tido_cod = 61 AND P.pref_pre = r.pref_pre AND ((:AGENCIA = 0) or (P.sucu_id = :AGENCIA))
    and NOT EXISTS (select reca_id from recibos_caja_detalle WHERE RECA_ID = R.reca_id) into :ingotros;
if (ingotros IS NULL) then
    ingotros = 0;
/* recibos cxc */
select sum(rcde_abono) from recibos_caja_detalle d, recibos_caja r,  movimiento_clientes m, prefijos p
    where r.reca_id = d.reca_id and r.reca_fecha = :fecha and d.rcde_tipodoc = m.mvcl_tiporef and d.rcde_iddoc = m.mvcl_idref
    AND RCDE_ANULADO = 'N' AND ((MVCL_TIPOREF <> 31 AND MVCL_TIPOREF <> 33) OR mvcl_fecha <> :fecha)
    AND P.tido_cod = 61 AND P.pref_pre = r.pref_pre AND ((:AGENCIA = 0) or (P.sucu_id = :AGENCIA))
    into :ingcxc;
if (ingcxc IS NULL) then
    ingcxc = 0;

/* EGRESOS totales */
select sum(egca_monto) from egresos e, egresos_caja c, prefijos p
    where e.egre_id = c.egre_id and C.egca_fecha = :fecha AND E.egre_anulado = 'N'
    AND P.tido_cod = 62 AND P.pref_pre = e.pref_pre AND ((:AGENCIA = 0) or (P.sucu_id = :AGENCIA))
    into :egrtotal;
if (egrtotal IS NULL) then
    egrtotal = 0;
/* EGRESOS otros */
select sum(egca_monto) from egresos e, egresos_caja c, prefijos p
    where e.egre_id = c.egre_id and C.egca_fecha = :fecha AND E.egre_anulado = 'N' and
    not exists (select egre_id from egresos_detalle WHERE EGRE_ID = E.egre_id)
    AND P.tido_cod = 62 AND P.pref_pre = e.pref_pre AND ((:AGENCIA = 0) or (P.sucu_id = :AGENCIA))
    into :egrotros;
if (egrotros IS NULL) then
    egrotros = 0;
/* EGRESOS cxp */
egrcxp = egrtotal - egrotros;

/* CONSIGNACIONES */
select sum(code_monto) from consigna c, consigna_detalle d, cajas j
    where c.cons_id = d.cons_id and cons_fecha = :fecha AND CONS_ANULADO = 'N' and
    d.caja_id = j.caja_id AND ((:AGENCIA = 0) or (j.sucu_id = :AGENCIA))
    into :consigna;
if (consigna IS NULL) then
    consigna = 0;

/* POR FORMA DE PAGO */
SELECT SUM(RCPA_MONTO) FROM RECIBOS_CAJA_PAGO G, RECIBOS_CAJA R, prefijos p
    WHERE R.RECA_ID = G.RECA_ID AND RECA_FECHA = :FECHA AND FOPA_ID = 1 and RECA_ANULADO = 'N'
    AND P.tido_cod = 61 AND P.pref_pre = r.pref_pre AND ((:AGENCIA = 0) or (P.sucu_id = :AGENCIA))
    INTO :FORMAP1;
SELECT SUM(RCPA_MONTO) FROM RECIBOS_CAJA_PAGO G, RECIBOS_CAJA R, prefijos p
    WHERE R.RECA_ID = G.RECA_ID AND RECA_FECHA = :FECHA AND FOPA_ID = 2 and RECA_ANULADO = 'N'
    AND P.tido_cod = 61 AND P.pref_pre = r.pref_pre AND ((:AGENCIA = 0) or (P.sucu_id = :AGENCIA))
    INTO :FORMAP2;
SELECT SUM(RCPA_MONTO) FROM RECIBOS_CAJA_PAGO G, RECIBOS_CAJA R, prefijos p
    WHERE R.RECA_ID = G.RECA_ID AND RECA_FECHA = :FECHA AND FOPA_ID = 3 and RECA_ANULADO = 'N'
    AND P.tido_cod = 61 AND P.pref_pre = r.pref_pre AND ((:AGENCIA = 0) or (P.sucu_id = :AGENCIA))
    INTO :FORMAP3;
SELECT SUM(RCPA_MONTO) FROM RECIBOS_CAJA_PAGO G, RECIBOS_CAJA R, prefijos p
    WHERE R.RECA_ID = G.RECA_ID AND RECA_FECHA = :FECHA AND FOPA_ID = 4 and RECA_ANULADO = 'N'
    AND P.tido_cod = 61 AND P.pref_pre = r.pref_pre AND ((:AGENCIA = 0) or (P.sucu_id = :AGENCIA))
    INTO :FORMAP4;
SELECT SUM(RCPA_MONTO) FROM RECIBOS_CAJA_PAGO G, RECIBOS_CAJA R, prefijos p
    WHERE R.RECA_ID = G.RECA_ID AND RECA_FECHA = :FECHA AND FOPA_ID = 5 and RECA_ANULADO = 'N'
    AND P.tido_cod = 61 AND P.pref_pre = r.pref_pre AND ((:AGENCIA = 0) or (P.sucu_id = :AGENCIA))
    INTO :FORMAP5;
SELECT SUM(RCPA_MONTO) FROM RECIBOS_CAJA_PAGO G, RECIBOS_CAJA R, prefijos p
    WHERE R.RECA_ID = G.RECA_ID AND RECA_FECHA = :FECHA AND FOPA_ID = 6 and RECA_ANULADO = 'N'
    AND P.tido_cod = 61 AND P.pref_pre = r.pref_pre AND ((:AGENCIA = 0) or (P.sucu_id = :AGENCIA))
    INTO :FORMAP6;
SELECT SUM(RCPA_MONTO) FROM RECIBOS_CAJA_PAGO G, RECIBOS_CAJA R, prefijos p
    WHERE R.RECA_ID = G.RECA_ID AND RECA_FECHA = :FECHA AND FOPA_ID = 7 and RECA_ANULADO = 'N'
    AND P.tido_cod = 61 AND P.pref_pre = r.pref_pre AND ((:AGENCIA = 0) or (P.sucu_id = :AGENCIA))
    INTO :FORMAP7;
SELECT SUM(RCPA_MONTO) FROM RECIBOS_CAJA_PAGO G, RECIBOS_CAJA R, prefijos p
    WHERE R.RECA_ID = G.RECA_ID AND RECA_FECHA = :FECHA AND FOPA_ID = 8 and RECA_ANULADO = 'N'
    AND P.tido_cod = 61 AND P.pref_pre = r.pref_pre AND ((:AGENCIA = 0) or (P.sucu_id = :AGENCIA))
    INTO :FORMAP8;
SELECT SUM(RCPA_MONTO) FROM RECIBOS_CAJA_PAGO G, RECIBOS_CAJA R, prefijos p
    WHERE R.RECA_ID = G.RECA_ID AND RECA_FECHA = :FECHA AND FOPA_ID = 9 and RECA_ANULADO = 'N'
    AND P.tido_cod = 61 AND P.pref_pre = r.pref_pre AND ((:AGENCIA = 0) or (P.sucu_id = :AGENCIA))
    INTO :FORMAP9;
SELECT SUM(RCPA_MONTO) FROM RECIBOS_CAJA_PAGO G, RECIBOS_CAJA R, prefijos p
    WHERE R.RECA_ID = G.RECA_ID AND RECA_FECHA = :FECHA AND FOPA_ID = 10 and RECA_ANULADO = 'N'
    AND P.tido_cod = 61 AND P.pref_pre = r.pref_pre AND ((:AGENCIA = 0) or (P.sucu_id = :AGENCIA))
    INTO :FORMAP0;
if (formap1 is null) then
    formap1 = 0;
if (formap2 is null) then
    formap2 = 0;
if (formap3 is null) then
    formap3 = 0;
if (formap4 is null) then
    formap4 = 0;
if (formap5 is null) then
    formap5 = 0;
if (formap6 is null) then
    formap6 = 0;
if (formap7 is null) then
    formap7 = 0;
if (formap8 is null) then
    formap8 = 0;
if (formap9 is null) then
    formap9 = 0;
if (formap0 is null) then
    formap0 = 0;
SUSPEND;
end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER PROCEDURE CUADRE_CAJA_DETALLE(
    FECHA DATE,
    AGENCIA INTEGER)
RETURNS (
    CXCTIPO VARCHAR(10),
    CXCNUMERO VARCHAR(10),
    CXCNIT VARCHAR(20),
    CXCNOMBRE VARCHAR(60),
    CXCMONTO NUMERIC(18,2))
AS
declare variable id integer;
declare variable TIPO integer;
declare variable ABONO NUMERIC(18,2);
begin
/* DETALLE DE LA CARTERA DEL DIA */
for SELECT MVCL_IDREF, terc_nit, mvcl_tiporef, TIDO_NOMCORTO, MVCL_PREFREF || MVCL_NUMREF, MVCL_MONTO
    FROM MOVIMIENTO_CLIENTES M, TIPO_DOCUMENTO T
    WHERE MVCL_FECHA = :FECHA AND MVCL_ABONO = 'N' AND M.mvcl_tiporef = T.tido_cod AND ((:AGENCIA = 0) or (M.sucu_id = :agencia))
    into :id, :cxcnit, :TIPO, :cxctipo, :cxcnumero, cxcmonto
    do
    BEGIN
    if (cxcmonto IS NULL) then
        cxcmonto = 0;
    if ((cxctipo = 'DEVOLCLI') or (cxctipo = 'NOTACRCL')) then
        CXCMONTO = CXCMONTO * -1;
    SELECT sum(SDCA_ABONO) FROM SALDOS_DOC_CARTERA WHERE sdca_idref = :id AND sdca_tiporef = :TIPO AND SDCA_FECHA = :FECHA AND SDCA_ABONO <> 0
        INTO :ABONO;
    if (ABONO IS NULL) then
        ABONO = 0;
    if (CXCMONTO <> ABONO) then
        BEGIN
        cxcmonto = cxcmonto - abono;
        cxcnombre = '';
        SELECT TERC_NOM FROM TERCEROS WHERE TERC_NIT = :cxcnit INTO :cxcnombre;
        SUSPEND;
        END
    END
end
^

SET TERM ; ^


/* 20100715C */
/* no trasmitia si no habia por vencer */
SET TERM ^ ;

CREATE OR ALTER procedure RESUMEN_PUNTOS_TX (
    FECHA date)
returns (
    CLIENTE varchar(20),
    PTACUM numeric(18,2),
    PTVENCER numeric(18,2))
AS
declare variable ANOS INTEGER;
declare variable FECAUX DATE;
declare variable FECAUX2 DATE;
declare variable PTAUX NUMERIC(18,2);
begin
execute procedure lee_configuracion('FACTURACION', 'FACTURAS', 'VENCIMIENTO DE PUNTOS POR CLIENTE EN AÑOS') returning_values (:anos);
FOR SELECT DISTINCT PTCL_NIT FROM PUNTOS_CLIENTE
    INTO :CLIENTE
    DO
    BEGIN
    select first 1 ptcl_saldo + ptcl_db - ptcl_cr from puntos_cliente
        where ptcl_nit = :cliente and ptcl_fecha <= :fecha order by ptcl_fecha desc, PTCL_ID desc into :ptacum;
    /* los vencidos */
    fecaux = fecha - (anos * 365);
    select first 1 ptcl_saldo + ptcl_db - ptcl_cr from puntos_cliente
        where ptcl_nit = :cliente and ptcl_fecha <= :fecaux order by ptcl_fecha desc, ptcl_id desc into :ptvencer;
    /* al saldo de hace n años restele las redenciones entre esa fecha y hoy */
    ptaux = 0;
    select sum(ptcl_cr) from puntos_cliente where ptcl_nit = :cliente and ptcl_fecha >= :fecaux and
        ptcl_fecha <= :fecha and ptcl_tipodoc = 81 into :ptaux;
    if (ptaux is null) then
        ptaux = 0;
    else
        if (ptaux > ptvencer) then
            begin
            PTAUX = PTAUX - ptvencer;
            ptvencer = 0;
            end
        else
            begin
            ptvencer = ptvencer - ptaux;
            ptaux = 0;
            end
    ptacum = ptacum - ptvencer;

    /* los por vencer */
    fecaux = fecha - (anos * 365);
    fecaux2 = fecha - (anos * 365) + 30;
    select sum(ptcl_db - ptcl_cr) from puntos_cliente where ptcl_nit = :cliente and ptcl_fecha >= :fecaux and ptcl_fecha <= :fecaux2 into :ptvencer;
    if (ptvencer is null) then
        ptvencer = 0;
    ptvencer = ptvencer - ptaux;
    if (ptacum <> 0) then
        suspend;
    end
end
^

SET TERM ; ^



/* 20100716 */
/* NO GRABE EL ENSAMBLE CON COSTO 0 Y LUEGO LO ACTUALICE YA QUE SE DEMORA MUCHISIMO */

SET TERM ^ ;

CREATE OR ALTER TRIGGER MOVIMIENTO_ARTICULO_BI FOR MOVIMIENTO_ARTICULO
ACTIVE BEFORE INSERT POSITION 0
AS
declare variable LOTE CHAR(1);
declare variable ENSAMBLE CHAR(1);
declare variable IDENS INTEGER;
declare variable PREFENS VARCHAR(4);
declare variable unidad varchar(8);
declare variable DESCR varchar(60);
declare variable CODPR varchar(8);
declare variable DESPR varchar(60);
declare variable UNIPR varchar(8);
declare variable CANTPR numeric(18,4);
declare variable FACTOR numeric(18,4);
declare variable COSTO numeric(18,2);
declare variable COSTOTOT numeric(18,2);
declare variable PORCPR numeric(9,4);
declare variable MERMAPR numeric(9,4);
declare variable PESO numeric(18,4);
declare variable PESOPR numeric(18,4);
declare variable ITEM INTEGER;
declare variable IVA NUMERIC(9,4);
declare variable IVAM NUMERIC(18,2);
declare variable CONSUMO NUMERIC(18,2);
declare variable TOTAL float;
declare variable SALDO NUMERIC(18,4);
BEGIN
/* INSERTE EL NUEVO LOTE */
if (NEW.mvar_cant IS NULL) then
    NEW.mvar_cant = 0;
SELECT ARTI_EXIST
    FROM   ARTICULO
    WHERE  ARTICULO.ARTI_COD = NEW.ARTI_COD
    INTO :LOTE;
if (LOTE = 'L') then
    BEGIN
      if ((NEW.mvar_lote IS NULL) or (NEW.mvar_lote = '')) then
        if (new.mvar_entrada = 'S') then
            new.mvar_lote = cast(new.mvar_cons as varchar(15));
        else
            begin
            /* NO HAY LOTE, ENTONCES CALCULELO SEGUN CONFIGURACION */
            EXCEPTION LOTE_NEGATIVO 'No se indicó un lote para el artículo ' || new.arti_cod;
            end
    END
/* ENSAMBLE EL PRODUCTO */
SELECT ARTI_ENSAMBLE, ARTI_UNIDAD, ARTI_DES, ARTI_PESO
    FROM ARTICULO WHERE ARTI_COD = NEW.arti_cod INTO :ensamble, :unidad, :descr, :peso;
if ((NEW.mvar_entrada = 'N') AND (ENSAMBLE = 'S')) then
    BEGIN
    /* verifique si la existecia es insufieciente */
/*    INSERT INTO audi_trig (EVENTO) VALUES ('movarti_bi ensamble' || NEW.arti_cod);*/
    execute procedure saldo_inventario(new.arti_cod, new.bode_cod, new.mvar_fecha) returning_values (:saldo);
/*    INSERT INTO audi_trig (EVENTO) VALUES ('movarti_bi ensamble ' || NEW.arti_cod || ' cant:' || new.mvar_cant || ' saldo:' || :saldo);*/
    if (NEW.mvar_cant > :SALDO) then
        BEGIN
        if (SALDO > 0) then
            SALDO = NEW.mvar_cant - :SALDO;
        else
            SALDO = NEW.mvar_cant;
        IDENS = gen_id(id_ensamble, 1);
        EXECUTE PROCEDURE lee_configuracion('INVENTARIO', 'ENSAMBLES', 'PREFIJO PARA ENSAMBLES AUTOMATICOS AL SACAR PRODUCTOS') returning_values (:prefens);
        /* CALCULE EL COSTO TOTAL DEL ENSAMBLE */
        select sum(arpr_porc) from articulos_producto where arti_cod = NEW.arti_cod into :total;
        COSTOTOT = 0;
        FOR SELECT ARPR_CANT, ARPR_UNIDAD, ARPR_COMP, ARPR_PORC, ARPR_MERMA, ARTI_PESO
            FROM articulos_producto P, ARTICULO A
            WHERE P.ARTI_COD = NEW.arti_cod AND A.arti_cod = P.arpr_comp
            INTO :CANTPR, :UNIPR, :CODPR, :PORCPR, :MERMAPR, :PESOPR
            DO
            BEGIN
            EXECUTE PROCEDURE factor_unidad_cant(:codpr, :unipr) returning_values (:factor);
            EXECUTE PROCEDURE costo_promedio_unidad (:codpr, NEW.mvar_fecha, :UNIPR) returning_values (:COSTO);
            IVAM = costo * cantpr * iva / 100;
            if (((cantpr is null) or (cantpr = 0)) AND (porcpr IS NOT NULL) AND (porcpr <> 0)) then
                BEGIN
                /* ES PORCENTUAL AL PESO LA MEZCLA SOBRE EL 1ER ARTICULO */
                CANTPR = :SALDO * PESO;
                CANTPR = CANTPR / TOTAL * porcpr; /* APLICA LA PROPORCION */
                if ((mermapr IS NOT NULL) AND (mermapr <> 0)) then
                    CANTPR = CANTPR * (100 + mermapr) / 100;
                END
            ELSE
                BEGIN
                CANTPR = CANTPR * :SALDO * pesopr;
                END
            COSTOTOT = COSTOTOT + COSTO * CANTPR;
            END
        if (NEW.mvar_cant <> 0) then
            COSTO = costotot / NEW.mvar_cant;
        else
            COSTO = 0;
        INSERT INTO ENSAMBLES(ENSA_ID, TIDO_COD, PREF_PRE, BODE_COD, ENSA_NUMERO, ENSA_FECHA, ENSA_CONC, ENSA_REFER, ENSA_CANT, ENSA_UNIDAD, ENSA_FACTOR, ENSA_ANULADO, ENSA_TRANSMIT,
            ARTI_COD, ENSA_DESC, ENSA_CODBAR, ENSA_LOTE, ENSA_OBS, TERC_NIT, ENSA_USUARIO, NUMOK, ENSA_COSTO, LOTE_VENCE, ENSA_CODRETAL, ENSA_CANTRETAL, ENSA_OPER, ENSA_MAQUINA, ENSA_PESO, ENSA_BODRETAL, ENSA_TIPOREF, ENSA_IDREF)
            VALUES (:IDENS, 15, :prefens, NEW.bode_cod, '000001', new.mvar_fecha, new.mvar_conc, '', :SALDO, :unidad, 1, 'N', 'N',
            NEW.arti_cod, :descr, NEW.arti_cod, NEW.mvar_lote, NULL, NULL, USER, 'N', :costo, NULL, NULL, 0, null,  NULL, 0, NEW.bode_cod, NEW.mvar_tipodoc, NEW.mvar_idref);
        /* LOS DETALLES DEL ENSAMBLE */
        ITEM = 0;
        FOR SELECT ARPR_CANT, ARPR_UNIDAD, ARPR_COMP, ARTI_DES, TAIV_PORC, ARTI_CONSUMO, ARPR_PORC, ARPR_MERMA, ARTI_PESO
            FROM articulos_producto P, ARTICULO A, TARIFA_IVA T
            WHERE P.ARTI_COD = NEW.arti_cod AND A.arti_cod = P.arpr_comp AND A.taiv_cod = T.taiv_cod
            INTO :CANTPR, :UNIPR, :CODPR, :DESPR, :IVA, :CONSUMO, :PORCPR, :MERMAPR, :PESOPR
            DO
            BEGIN
            ITEM = ITEM + 1;
            EXECUTE PROCEDURE factor_unidad_cant(:codpr, :unipr) returning_values (:factor);
            EXECUTE PROCEDURE costo_promedio_unidad (:codpr, NEW.mvar_fecha, :UNIPR) returning_values (:COSTO);
            IVAM = costo * cantpr * iva / 100;
            if (((cantpr is null) or (cantpr = 0)) AND (porcpr IS NOT NULL) AND (porcpr <> 0)) then
                BEGIN
                /* ES PORCENTUAL AL PESO LA MEZCLA SOBRE EL 1ER ARTICULO */
                CANTPR = :SALDO * PESO;
                CANTPR = CANTPR / TOTAL * porcpr; /* APLICA LA PROPORCION */
                if ((mermapr IS NOT NULL) AND (mermapr <> 0)) then
                    CANTPR = CANTPR * (100 + mermapr) / 100;
/*                CANTPR = CANTPR / pesopr; /* LO LLEVA A LA UNIDAD PRINCIPAL */
                UNIPR = 'GRAMO';
                END
            ELSE
                BEGIN
                CANTPR = CANTPR * :SALDO * pesopr;
                END
            INSERT INTO ENSAMBLES_DETALLE(ENSA_ID, ESDE_ITEM, ARTI_COD, BODE_COD, ESDE_CANT, ESDE_UNIDAD, ESDE_COSTO, ESDE_LOTE, ESDE_FACTOR, ESDE_IVAPORC, ESDE_IVAMONTO, ESDE_CONSUMO, ESDE_CODBAR, ESDE_ANULADO, ESDE_TRANSMIT, ESDE_DESC, ESDE_TOTAL, ESDE_PESO)
                VALUES (:idens, :ITEM, :codpr,  NEW.bode_cod, :cantpr, :unipr, :costo, NULL, :FACTOR, :IVA, :ivam, :consumo, :codpr, 'N', 'N', :despr, :COSTO * :cantpr, 0);
            END
        END
    END
if (new.mvar_cons is null) then
    NEW.mvar_cons = GEN_ID(ID_MOVARTI,1);
END
^

SET TERM ; ^



/* 20100716C */
/* SOLO CLIENTES CON VENTA CON EL PARAMETRO SINVENTA = 'C' */
SET TERM ^ ;

CREATE OR ALTER procedure REP_CLIENTES_ULTVENTA (
    DESDE varchar(20),
    HASTA varchar(20),
    ZONINI varchar(5),
    ZONFIN varchar(5),
    VENINI integer,
    VENFIN integer,
    AGRUPA char(1),
    ORDEN char(1),
    FECINI date,
    FECFIN date,
    SINVENTAS char(1))
returns (
    NIT varchar(20),
    NOM varchar(60),
    SUC varchar(10),
    DIR varchar(60),
    CIU varchar(40),
    TEL varchar(40),
    CONTACTO varchar(60),
    OBS varchar(255),
    EMAIL varchar(100),
    FAX varchar(25),
    CEL varchar(25),
    CODCLIE varchar(20),
    CODCIU varchar(6),
    ZONA varchar(2),
    ESTADO char(1),
    RTEFTE numeric(9,4),
    RTEIVA numeric(9,4),
    RTEICA numeric(9,4),
    RTFTEBASE numeric(18,2),
    DTOMAX numeric(9,4),
    CUPO numeric(18,2),
    COBR integer,
    VEND integer,
    GRUPOC integer,
    ANIV date,
    CLIDESDE date,
    LISTA integer,
    DIAS integer,
    DIASBLOQ integer,
    DETALLE char(1),
    ULTVENTA date,
    NOMLISTA varchar(30),
    NOMVEND varchar(60),
    NOMCOBR varchar(60),
    NOMZONA varchar(60),
    NOMCIUD varchar(60),
    NOMGRP varchar(60))
AS
declare variable NITINI VARCHAR(20);
declare variable NITFIN VARCHAR(20);
declare variable NOMINI VARCHAR(20);
declare variable NOMFIN VARCHAR(20);
declare variable NUMROWS INTEGER;
declare variable ok char(1);
begin
if (ORDEN = 'C') then
    BEGIN
    NITINI = DESDE;
    NITFIN = HASTA;
    NOMINI = '';
    NOMFIN = 'zz';
    END
ELSE
    BEGIN
    NOMINI = DESDE;
    NOMFIN = HASTA;
    NITINI = '';
    NITFIN = 'zz';
    END

for select t.terc_nit,terc_nom,terc_dir,terc_ciu,terc_tel,terc_contacto,SUBSTRING(TERC_OBS FROM 1 FOR 255),
    terc_email,terc_fax,terc_cel,c.clie_cod,c.zona_cod,c.clie_estado,c.clie_rtefte,c.clie_rteiva,c.clie_rteica,c.clie_rtftebase,c.clie_dtomax,
    c.clie_cupo,c.vend_cod, c.cobr_cod, c.clie_aniv, c.clie_fecha, c.lipr_cod, c.clie_dias, c.clie_diasbloq, c.clie_detalle,
    T.ciud_cod, c.grca_cod
    from terceros t,clientes c where t.terc_nit = c.terc_nit and t.terc_nit >= :nitini and t.terc_nit <= :nitfin and terc_nom >= :nomini and terc_nom <= :nomfin
    into :nit, :nom, :dir, :ciu, :tel, :contacto, :obs,
    :email, :fax, :cel, :codclie, :zona, :estado, :rtefte, :rteiva, :rteica,
    :rtftebase, :dtomax, :cupo, :vend, :cobr, :aniv, :clidesde, :lista, :dias, :diasbloq, :detalle,
    :codciu, :grupoc
    do
    begin
    if (estado <> 'I')  then
        begin
        SUC = '';
        nomlista = '';
        select lipr_nom from LISTA_PRECIOS where lipr_cod = :lista into nomlista;
        SELECT COUNT(*) FROM CLIENTE_SUCURSALES WHERE TERC_NIT = :NIT INTO :NUMROWS;
        if (NUMROWS > 1) then
            BEGIN
            FOR SELECT CLCU_COD, CLSU_NOMBRE, CLSU_DIR, CLSU_CIUDAD, CLSU_TEL, SUBSTRING(CLSU_OBS FROM 1 FOR 255), VEND_COD, COBR_COD, ZONA_COD
                FROM cliente_sucursales WHERE TERC_NIT = :NIT ORDER BY CLCU_COD
                INTO :SUC, :nom, :dir, :ciu, :tel, :obs, :vend, :cobr, :zona
                DO
                BEGIN
                OK = 'N';
                ULTVENTA = NULL;
                SELECT MAX(FACT_FECHA) FROM FACTURAS WHERE TERC_NIT = :NIT AND FACT_SUCURSAL = :SUC AND FACT_FECHA >= :fecini AND FACT_FECHA <= :FECFIN
                    INTO :ultventa;
                if (sinventas = 'S') then
                    BEGIN
                    if (ULTVENTA IS NULL) then
                        OK = 'S';
                    END
                ELSE
                    if (sinventas = 'C') then
                        BEGIN
                        if (ULTVENTA IS NOT NULL) then
                            OK = 'S';
                        END
                    ELSE
                        OK = 'S';
                if (OK = 'S') then
                    BEGIN
                    nomzona = '';
                    nomcobr = '';
                    nomciud = '';
                    nomvend = '';
                    select zona_nom from zonas where zona_cod = :zona into :nomzona;
                    select cobr_nom from cobradores where cobr_cod = :cobr into nomcobr;
                    select vend_nombre from vendedores where vend_cod = :vend into nomvend;
                    select ciud_nom from ciudades where ciud_cod = :codciu into nomciud;
                    select GRCA_NOMBRE from grupo_cartera where grca_cod = :grupoc into nomgrp;
                    if (AGRUPA = 'V') then
                        begin
                        if ((vend >= :venini) and (vend <= :venfin)) then
                            suspend;
                        end
                    else
                        if (AGRUPA = 'B') then
                            begin
                            if ((cobr >= :venini) and (cobr <= :venfin)) then
                                suspend;
                            end
                        else
                            if (AGRUPA = 'Z') then
                                begin
                                if ((zona >= :zonini) and (zona <= :zonfin)) then
                                    suspend;
                                end
                            else
                                if (AGRUPA = 'C') then
                                    begin
                                    if ((codciu >= :zonini) and (codciu <= :zonfin)) then
                                        suspend;
                                    end
                                else
                                    suspend;
                    END
                end
            END
        ELSE
            BEGIN
            OK = 'N';
            ULTVENTA = NULL;
            SELECT MAX(FACT_FECHA) FROM FACTURAS WHERE TERC_NIT = :NIT AND FACT_SUCURSAL = :SUC AND FACT_FECHA >= :fecini AND FACT_FECHA <= :FECFIN
                INTO :ultventa;
            if (sinventas = 'S') then
                BEGIN
                if (ULTVENTA IS NULL) then
                    OK = 'S';
                END
            ELSE
                if (sinventas = 'C') then
                    BEGIN
                    if (ULTVENTA IS NOT NULL) then
                        OK = 'S';
                    END
                ELSE
                    OK = 'S';
            if (OK = 'S') then
                BEGIN
                nomzona = '';
                nomcobr = '';
                nomciud = '';
                nomvend = '';
                select zona_nom from zonas where zona_cod = :zona into :nomzona;
                select cobr_nom from cobradores where cobr_cod = :cobr into nomcobr;
                select vend_nombre from vendedores where vend_cod = :vend into nomvend;
                select ciud_nom from ciudades where ciud_cod = :codciu into nomciud;
                select GRCA_NOMBRE from grupo_cartera where grca_cod = :grupoc into nomgrp;
                if (AGRUPA = 'V') then
                    begin
                    if ((vend >= :venini) and (vend <= :venfin)) then
                        suspend;
                    end
                else
                    if (AGRUPA = 'B') then
                        begin
                        if ((cobr >= :venini) and (cobr <= :venfin)) then
                            suspend;
                        end
                    else
                        if (AGRUPA = 'Z') then
                            begin
                                if ((zona >= :zonini) and (zona <= :zonfin)) then
                                    suspend;
                            end
                        else
                            if (AGRUPA = 'C') then
                                begin
                                if ((codciu >= :zonini) and (codciu <= :zonfin)) then
                                    suspend;
                                end
                            else
                                suspend;
                END
            end
        end
    end
end
^

SET TERM ; ^


/* 20100717 */
/* UBICAR SALIDAS DE DOC. DE PAGO QUE NO TENIAN REGISTRO DE ENTRADA */
SET TERM ^ ;

CREATE OR ALTER procedure DOCCAJA_SIN_ENTRADA
returns (
    TIPO varchar(8),
    ID integer,
    CAJA integer,
    FECHA date,
    PREF varchar(4),
    NUMDOC varchar(6),
    FP integer,
    BANCO varchar(3),
    CUENTA varchar(20),
    NUMERO varchar(20),
    MONTO numeric(18,2))
AS
begin
TIPO = 'CONSIGNA';
FOR SELECT C.CONS_ID, CONS_FECHA, D.caja_id, PRBA_PREF, CONS_NUMERO, FOPA_ID, CODE_BANCO, CODE_CUENTA, CODE_NUMERO, CODE_MONTO
    FROM CONSIGNA C, CONSIGNA_DETALLE D WHERE C.cons_id = D.cons_id AND D.FOPA_ID <> 1 AND
    NOT EXISTS (SELECT DPCA_ID FROM documentos_pago_caja WHERE FOPA_ID = D.fopa_id AND DPCA_BANCO = D.code_banco
    AND DPCA_CUENTA = D.code_cuenta AND DPCA_NUMERO = D.code_numero AND CAJA_ID = D.caja_id)
    INTO :ID, :FECHA, :CAJA, :PREF, :NUMDOC, :FP, :BANCO, :CUENTA, :NUMERO, :MONTO
    DO
    SUSPEND;
TIPO = 'CONSTARJ';
FOR SELECT C.COTJ_ID, C.cotj_fecha, C.caja_id, C.pref_pre, C.cotj_numero, FOPA_ID, TARJ_COD, CTJD_NROTJ, CTJD_COMPROB, CTJD_BASE
    FROM consigna_tarjetas_det D, consigna_tarjetas C WHERE D.cotj_id = C.cotj_id AND FOPA_ID <> 1 AND
    NOT EXISTS (SELECT DPCA_ID FROM documentos_pago_caja WHERE FOPA_ID = D.fopa_id AND DPCA_BANCO = D.tarj_cod
    AND DPCA_CUENTA = D.ctjd_nrotj AND DPCA_NUMERO = D.ctjd_comprob AND CAJA_ID = C.caja_id AND DPCA_MONTO = D.ctjd_base)
    INTO :ID, :FECHA, :CAJA, :PREF, :NUMDOC, :FP, :BANCO, :CUENTA, :NUMERO, :MONTO
    DO
    suspend;
TIPO = 'CAMBDOCU';
FOR SELECT C.cado_id, C.cado_fecha, C.caja_id, C.pref_pre, C.cado_numero, D.fopa_id, D.cden_banco, D.cden_cuenta, D.cden_numero, D.cden_monto
    FROM cambiodoc_entradas D, cambio_documentos C WHERE D.cado_id = C.cado_id AND D.fopa_id <> 1 AND
    NOT EXISTS (SELECT DPCA_ID FROM documentos_pago_caja WHERE FOPA_ID = D.fopa_id AND DPCA_BANCO = D.cden_banco
    AND DPCA_CUENTA = D.cden_cuenta AND DPCA_NUMERO = D.cden_numero AND CAJA_ID = C.caja_id AND DPCA_MONTO = D.cden_monto)
    INTO :ID, :FECHA, :CAJA, :PREF, :NUMDOC, :FP, :BANCO, :CUENTA, :NUMERO, :MONTO
    DO
    suspend;
TIPO = 'EGRESOS';
FOR SELECT C.egre_id, C.egre_fecha, D.caja_id, C.pref_pre, C.egre_numero, D.fopa_id, D.egca_banco, D.egca_cuenta, D.egca_numero, D.egca_monto
    FROM egresos_caja D, egresos C WHERE D.egre_id = C.egre_id AND D.fopa_id <> 1 AND
    NOT EXISTS (SELECT DPCA_ID FROM documentos_pago_caja WHERE FOPA_ID = D.fopa_id AND DPCA_BANCO = D.egca_banco
    AND DPCA_CUENTA = D.egca_cuenta AND DPCA_NUMERO = D.egca_numero AND CAJA_ID = D.caja_id AND DPCA_MONTO = D.egca_monto)
    INTO :ID, :FECHA, :CAJA, :PREF, :NUMDOC, :FP, :BANCO, :CUENTA, :NUMERO, :MONTO
    DO
    suspend;
TIPO = 'TRASCAJA';
FOR SELECT C.trcj_id, C.trcj_fecha, C.caja_id, C.pref_pre, C.trcj_numero, D.fopa_id, D.trcd_banco, D.trcd_cuenta, D.trcd_numero, D.trcd_monto
    FROM traslados_caja_det D, traslados_caja C WHERE D.trcj_id = C.trcj_id AND D.fopa_id <> 1 AND
    NOT EXISTS (SELECT DPCA_ID FROM documentos_pago_caja WHERE FOPA_ID = D.fopa_id AND DPCA_BANCO = D.trcd_banco
    AND DPCA_CUENTA = D.trcd_cuenta AND DPCA_NUMERO = D.trcd_numero AND CAJA_ID = C.caja_id AND DPCA_MONTO = D.trcd_monto)
    INTO :ID, :FECHA, :CAJA, :PREF, :NUMDOC, :FP, :BANCO, :CUENTA, :NUMERO, :MONTO
    DO
    suspend;
end
^

SET TERM ; ^


/* 20100718 */
/* verifique lote en devoluciones de ventas al afectar lo dvuelto de la factura */
SET TERM ^ ;

CREATE OR ALTER TRIGGER DEVOLUCIONES_VENTAS_DETALLE_AI FOR DEVOLUCIONES_VENTAS_DETALLE
ACTIVE AFTER INSERT POSITION 0
AS
declare variable fec date;
declare variable fecfac date;
declare variable CONC VARCHAR(60);
declare variable factor numeric(18,4);
declare variable Pref varchar(4);
declare variable Num varchar(6);
declare variable Nit varchar(20);
declare variable ID INTEGER;
declare variable ITEM INTEGER;
declare variable DEVUELTO NUMERIC(18,4);
declare variable CANT NUMERIC(18, 4);
declare variable CANTAUX NUMERIC(18, 4);
declare variable CNTFAC NUMERIC(18, 4);
declare variable FACT VARCHAR(10);
declare variable COSTO NUMERIC(18,2);
declare variable ULTIMO NUMERIC(18,2);
declare variable devnof CHAR(2);
declare variable numrows INTEGER;
declare variable OK CHAR(1);
declare variable PEDAUTO CHAR(2);
declare variable IDPED INTEGER;
declare variable IDREM INTEGER;
declare variable devrem CHAR(2);
declare variable EXIST CHAR(1);
BEGIN
execute procedure lee_configuracion ('FACTURACION', 'DEVOLUCIONES', 'HACER DEVOLUCIONES SOBRE REMISIONES') returning_values (:devrem);
if ((NEW.devt_id <> 0) and (new.dvde_anulado = 'N')) then
    BEGIN
    ID = 0;
    select devt_fecha, pref_pre, devt_numero, terc_nit, devt_factura, devt_remid, DEVT_FACTID , devt_pedid
        from devoluciones_ventas where devt_id = new.devt_id into :fec, :Pref, :Num, :Nit, :Fact, :idrem, :ID, :idped;
    execute procedure factor_unidad_cant(new.arti_cod, new.dvde_unidad) returning_values(factor);
    CONC = 'DEVOLUCION VENTA No.' || PREF || NUM || ' - FACTURA ' || FACT;
    /* si la factura afecto el inventario, afectelo */
    execute procedure lee_configuracion ('FACTURACION', 'DEVOLUCIONES', 'PERMITIR DEVOLVER ITEMS NO FACTURADOS') returning_values (:devnof);
    if (devnof = 'SI') then
        OK = 'S';
    else
        BEGIN
        if (id <> 0) then
            begin
            SELECT SUM(FADE_CANT * FADE_FACTOR) FROM FACTURAS_DETALLE WHERE FACT_ID = :ID AND ARTI_COD = NEW.arti_cod INTO :cntfac;
            /* verifique si afecto el inventario */
            select count(mvar_cons) from movimiento_articulo where mvar_tipodoc = 31 and mvar_idref = :id and arti_cod = new.arti_cod into :numrows;
            if (numrows > 0) then
                OK = 'S';
            else
                BEGIN
                /* busque remisiones que pudieron afectarlo */
                /* primero posteriores a la factura */
                select sum(cofa_cant * cofa_factor) from consolidado_faltantes where cofa_tipoori = 31 and cofa_idori = :id and cofa_tipodes = 32 and arti_cod = new.arti_cod and cofa_ok = 'S' into :cantaux;
                if ((cantaux <> 0) and (cantaux is not null)) then
                    BEGIN
                    if ((CNTFAC - (NEW.dvde_cant * NEW.dvde_factor)) <> CANTAUX) then
                        OK = 'S';
                    ELSE
                        OK = 'N';
                    END
                else
                    begin
                    /* si no, anteriores a la factura */
                    select sum(cofa_cant * cofa_factor) from consolidado_faltantes C, FACTURAS f where f.fact_consolida = c.cofa_id and cofa_tipoori = 32 and f.fact_id = :id and cofa_tipodes = 31 and arti_cod = new.arti_cod and cofa_ok = 'S' into :cantaux;
                    if ((cantaux <> 0) and (cantaux is not null)) then
                        OK = 'S';
                    else
                        BEGIN
                        /* si hacen pedido automatico, puede que la remisión este hecha con el pedido */
                        EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION','FACTURAS','GENERAR PEDIDO AUTOMATICAMENTE CON LA FACTURA') RETURNING_VALUES (PEDAUTO);
                        if (PEDAUTO = 'SI') then
                            BEGIN
                            SELECT PEDI_ID FROM PEDIDOS P, FACTURAS F WHERE P.PREF_PRE = F.pref_pre AND P.pedi_numero = F.fact_numero AND F.fact_id = :id INTO :IDped;
                            select sum(cofa_cant * cofa_factor) from consolidado_faltantes where cofa_tipoori = 34 and cofa_idori = :idped and cofa_tipodes = 32 and arti_cod = new.arti_cod and cofa_ok = 'S' into :cantaux;
                            if ((cantaux <> 0) and (cantaux is not null)) then
                                if ((CNTFAC - (NEW.dvde_cant * NEW.dvde_factor)) <> CANTAUX) then
                                    OK = 'S';
                                else
                                    OK = 'N';
                            else
                                OK = 'N';
                            END
                        ELSE
                            OK = 'N';
                        END
                    end
                END
            end
        else
          if ((idrem <> 0) and (devrem = 'SI')) then
            begin
            /* verifique si afecto el inventario */
            select count(mvar_cons) from movimiento_articulo where mvar_tipodoc = 32 and mvar_idref = :idrem and arti_cod = new.arti_cod into :numrows;
            if (numrows > 0) then
                OK = 'S';
            else
                OK = 'N';
            end
        END
    if (OK = 'S') then
        begin
        /* calcule el costo al que salio o el promedio */
        execute procedure costo_promedio(new.arti_cod, :FEC) returning_values (:COSTO);
        if (COSTO = 0) then
            BEGIN
            if (id <> 0) then
                begin
                SELECT FACT_FECHA FROM FACTURAS WHERE FACT_ID = :ID INTO :fecfac;
                execute procedure costo_promedio_y_ultimo(new.arti_cod, :FECFAC) returning_values (:COSTO, :ULTIMO);
                if (COSTO = 0) then
                    COSTO = ULTIMO;
                end
            if (idrem <> 0) then
                begin
                SELECT REVT_FECHA FROM remisiones_venta WHERE REVT_ID = :ID INTO :fecfac;
                execute procedure costo_promedio_y_ultimo(new.arti_cod, :FECFAC) returning_values (:COSTO, :ULTIMO);
                if (COSTO = 0) then
                    COSTO = ULTIMO;
                end
            END

        INSERT INTO MOVIMIENTO_ARTICULO
            (ARTI_COD, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF,
            MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM, TERC_NIT)
            VALUES(NEW.ARTI_COD, NEW.BODE_COD, :FEC, 33, NEW.devt_id,
            :CONC, :factor * new.dvde_cant, :COSTO, 'S', new.dvde_lote, :Pref, :Num, new.dvde_item, :Nit);
        end
    /* ACTUALICE LO DEVUELTO EN LA FACTURA */
    select ARTI_EXIST from ARTICULO where ARTI_COD = new.ARTI_COD into :EXIST;
    if (ID <> 0) then
        BEGIN
        CANTAUX = NEW.dvde_cant * NEW.dvde_factor;
        if (EXIST <> 'L') then
            begin
            FOR SELECT FADE_ITEM, FADE_CANT, FADE_FACTOR, FADE_DEVUELTO
                FROM FACTURAS_DETALLE
                WHERE FACT_ID = :ID AND ARTI_COD = NEW.ARTI_COD
                INTO :ITEM, :CANT, :FACTOR, :DEVUELTO
                DO
                BEGIN
                if ((CANTAUX > 0) and ((CANT * FACTOR) > 0))then
                    if ((CANT * FACTOR - DEVUELTO) < CANTAUX) then
                      BEGIN
                      UPDATE FACTURAS_DETALLE
                        SET FADE_DEVUELTO = (:CANT * :FACTOR)
                        WHERE FACT_ID = :ID AND FADE_ITEM = :ITEM AND ARTI_COD = NEW.ARTI_COD;
                      CANTAUX = CANTAUX - (CANT * FACTOR - DEVUELTO);
                      END
                    ELSE
                      BEGIN
                      UPDATE FACTURAS_DETALLE
                        SET FADE_DEVUELTO = FADE_DEVUELTO + :CANTAUX
                        WHERE FACT_ID = :ID AND FADE_ITEM = :ITEM AND ARTI_COD = NEW.ARTI_COD;
                      CANTAUX = 0;
                      END
                END
            end
        else
            begin
            FOR SELECT FADE_ITEM, FADE_CANT, FADE_FACTOR, FADE_DEVUELTO
                FROM FACTURAS_DETALLE
                WHERE FACT_ID = :ID AND ARTI_COD = NEW.ARTI_COD AND BODE_COD = NEW.bode_cod AND FADE_LOTE = NEW.dvde_lote
                INTO :ITEM, :CANT, :FACTOR, :DEVUELTO
                DO
                BEGIN
                if ((CANTAUX > 0) and ((CANT * FACTOR) > 0))then
                    if ((CANT * FACTOR - DEVUELTO) < CANTAUX) then
                      BEGIN
                      UPDATE FACTURAS_DETALLE
                        SET FADE_DEVUELTO = (:CANT * :FACTOR)
                        WHERE FACT_ID = :ID AND FADE_ITEM = :ITEM AND ARTI_COD = NEW.ARTI_COD;
                      CANTAUX = CANTAUX - (CANT * FACTOR - DEVUELTO);
                      END
                    ELSE
                      BEGIN
                      UPDATE FACTURAS_DETALLE
                        SET FADE_DEVUELTO = FADE_DEVUELTO + :CANTAUX
                        WHERE FACT_ID = :ID AND FADE_ITEM = :ITEM AND ARTI_COD = NEW.ARTI_COD;
                      CANTAUX = 0;
                      END
                END
            end
        if (CANTAUX > 0) then
            EXCEPTION DEVOLUCION_MAYOR 'Esta devolviendo una cantidad mayor a la facturada del articulo ' || new.arti_cod;
        END
    if ((idrem <> 0) and (devrem = 'SI')) then
        BEGIN
        CANTAUX = NEW.dvde_cant * NEW.dvde_factor;
        if (EXIST <> 'L') then
            begin
            FOR SELECT RVDE_ITEM, RVDE_CANT, RVDE_FACTOR, RVDE_DEVUELTO
                FROM remisiones_venta_detalle
                WHERE REVT_ID = :idrem AND ARTI_COD = NEW.ARTI_COD
                INTO :ITEM, :CANT, :FACTOR, :DEVUELTO
                DO
                BEGIN
                if (CANTAUX > 0) then
                    if ((CANT * FACTOR - DEVUELTO) < CANTAUX) then
                      BEGIN
                      UPDATE remisiones_venta_detalle
                        SET RVDE_DEVUELTO = (:CANT * :FACTOR)
                        WHERE REVT_ID = :IDREM AND RVDE_ITEM = :ITEM AND ARTI_COD = NEW.ARTI_COD;
                      CANTAUX = CANTAUX - (CANT * FACTOR - DEVUELTO);
                      END
                    ELSE
                      BEGIN
                      UPDATE remisiones_venta_detalle
                        SET RVDE_DEVUELTO = RVDE_DEVUELTO + :CANTAUX
                        WHERE REVT_ID = :IDREM AND RVDE_ITEM = :ITEM AND ARTI_COD = NEW.ARTI_COD;
                      CANTAUX = 0;
                      END
                END
            end
        else
            begin
            FOR SELECT RVDE_ITEM, RVDE_CANT, RVDE_FACTOR, RVDE_DEVUELTO
                FROM remisiones_venta_detalle
                WHERE REVT_ID = :idrem AND ARTI_COD = NEW.ARTI_COD AND BODE_COD = NEW.bode_cod AND RVDE_LOTE = NEW.dvde_lote
                INTO :ITEM, :CANT, :FACTOR, :DEVUELTO
                DO
                BEGIN
                if (CANTAUX > 0) then
                    if ((CANT * FACTOR - DEVUELTO) < CANTAUX) then
                      BEGIN
                      UPDATE remisiones_venta_detalle
                        SET RVDE_DEVUELTO = (:CANT * :FACTOR)
                        WHERE REVT_ID = :IDREM AND RVDE_ITEM = :ITEM AND ARTI_COD = NEW.ARTI_COD;
                      CANTAUX = CANTAUX - (CANT * FACTOR - DEVUELTO);
                      END
                    ELSE
                      BEGIN
                      UPDATE remisiones_venta_detalle
                        SET RVDE_DEVUELTO = RVDE_DEVUELTO + :CANTAUX
                        WHERE REVT_ID = :IDREM AND RVDE_ITEM = :ITEM AND ARTI_COD = NEW.ARTI_COD;
                      CANTAUX = 0;
                      END
                END
            end
        if (CANTAUX > 0) then
            EXCEPTION DEVOLUCION_MAYOR 'Esta devolviendo una cantidad mayor a la remisionada del articulo ' || new.arti_cod;
        END
    if ((idped <> 0) and (devrem = 'PEDIDO')) then
        BEGIN
        CANTAUX = NEW.dvde_cant * NEW.dvde_factor;
        FOR SELECT PEDE_ITEM, PEDE_CANT, PEDE_FACTOR, PEDE_DEVUELTO
            FROM pedidos_detalle
            WHERE PEDI_ID = :idped AND ARTI_COD = NEW.ARTI_COD
            INTO :ITEM, :CANT, :FACTOR, :DEVUELTO
            DO
                BEGIN
                if (CANTAUX > 0) then
                    if ((CANT * FACTOR - DEVUELTO) < CANTAUX) then
                      BEGIN
                      UPDATE pedidos_detalle
                        SET PEDE_DEVUELTO = (:CANT * :FACTOR)
                        WHERE PEDI_ID = :IDPED AND PEDE_ITEM = :ITEM AND ARTI_COD = NEW.ARTI_COD;
                      CANTAUX = CANTAUX - (CANT * FACTOR - DEVUELTO);
                      END
                    ELSE
                      BEGIN
                      UPDATE pedidos_detalle
                        SET PEDE_DEVUELTO = PEDE_DEVUELTO + :CANTAUX
                        WHERE PEDI_ID = :IDPED AND PEDE_ITEM = :ITEM AND ARTI_COD = NEW.ARTI_COD;
                      CANTAUX = 0;
                      END
                END
        if (CANTAUX > 0) then
            EXCEPTION DEVOLUCION_MAYOR 'Esta devolviendo una cantidad mayor a la pedido del articulo ' || new.arti_cod;
        END
    END
END
^

SET TERM ; ^


SET TERM ^ ;

CREATE OR ALTER TRIGGER DEVOLUCIONES_VENTAS_DETALLE_AU FOR DEVOLUCIONES_VENTAS_DETALLE
ACTIVE AFTER UPDATE POSITION 0
AS
declare variable fec date;
declare variable fecfac date;
declare variable CONC VARCHAR(60);
declare variable Pref varchar(4);
declare variable Num varchar(6);
declare variable Nit varchar(20);
declare variable CANT NUMERIC(18, 4);
declare variable CANTAUX NUMERIC(18,4);
declare variable CNTFAC NUMERIC(18, 4);
declare variable COSTO NUMERIC(18,2);
declare variable ULTIMO NUMERIC(18,2);
declare variable factor numeric(18,4);
declare variable DEVUELTO NUMERIC(18,4);
declare variable ID integer;
declare variable ITEM INTEGER;
declare variable FACT varchar(10);
declare variable devnof CHAR(2);
declare variable numrows INTEGER;
declare variable OK CHAR(1);
declare variable PEDAUTO CHAR(2);
declare variable IDPED INTEGER;
declare variable IDREM INTEGER;
declare variable devrem CHAR(2);
declare variable EXIST CHAR(1);
BEGIN
execute procedure lee_configuracion ('FACTURACION', 'DEVOLUCIONES', 'HACER DEVOLUCIONES SOBRE REMISIONES') returning_values (:devrem);
/* Anule el anterior */
if ((OLD.DEVT_ID <> 0) AND (OLD.dvde_anulado = 'N')) then
    BEGIN
    select ARTI_EXIST from ARTICULO where ARTI_COD = old.ARTI_COD into :EXIST;
    DELETE FROM MOVIMIENTO_ARTICULO WHERE (mvar_tipodoc = 33) and (mvar_idref = new.devt_id) and (mvar_item = old.dvde_item);
    /* DESHAGA LO DEVUELTO EN LA FACTURA */
    ID = 0;
    SELECT DEVT_FACTID FROM DEVOLUCIONES_VENTAS
        WHERE DEVT_ID = OLD.DEVT_ID INTO :ID;
    if (ID <> 0) then
        BEGIN
        CANTAUX = OLD.dvde_cant * OLD.dvde_factor;
        if (EXIST <> 'L') then
            begin
            FOR SELECT FADE_CANT, FADE_FACTOR, FADE_DEVUELTO, FADE_ITEM
                FROM FACTURAS_DETALLE
                WHERE FACT_ID = :ID AND ARTI_COD = OLD.ARTI_COD AND FADE_CANT > 0
                INTO :CANT, :FACTOR, :DEVUELTO, :ITEM
                DO
                BEGIN
                if (cantaux > 0) then
                    if (CANTAUX > DEVUELTO) then
                        BEGIN
                        UPDATE FACTURAS_DETALLE
                            SET FADE_DEVUELTO = 0
                            WHERE FACT_ID = :ID AND ARTI_COD = OLD.ARTI_COD AND FADE_ITEM = :ITEM;
                        CANTAUX = CANTAUX - DEVUELTO;
                        END
                    ELSE
                        BEGIN
                        UPDATE FACTURAS_DETALLE
                            SET FADE_DEVUELTO = FADE_DEVUELTO - :CANTAUX
                            WHERE FACT_ID = :ID AND ARTI_COD = OLD.ARTI_COD AND FADE_ITEM = :ITEM;
                        CANTAUX = 0;
                        END
                END
            end
        else
            begin
            FOR SELECT FADE_CANT, FADE_FACTOR, FADE_DEVUELTO, FADE_ITEM
                FROM FACTURAS_DETALLE
                WHERE FACT_ID = :ID AND ARTI_COD = OLD.ARTI_COD AND FADE_CANT > 0 and BODE_COD = old.bode_cod AND FADE_LOTE = OLD.dvde_lote
                INTO :CANT, :FACTOR, :DEVUELTO, :ITEM
                DO
                BEGIN
                if (cantaux > 0) then
                    if (CANTAUX > DEVUELTO) then
                        BEGIN
                        UPDATE FACTURAS_DETALLE
                            SET FADE_DEVUELTO = 0
                            WHERE FACT_ID = :ID AND ARTI_COD = OLD.ARTI_COD AND FADE_ITEM = :ITEM;
                        CANTAUX = CANTAUX - DEVUELTO;
                        END
                    ELSE
                        BEGIN
                        UPDATE FACTURAS_DETALLE
                            SET FADE_DEVUELTO = FADE_DEVUELTO - :CANTAUX
                            WHERE FACT_ID = :ID AND ARTI_COD = OLD.ARTI_COD AND FADE_ITEM = :ITEM;
                        CANTAUX = 0;
                        END
                END
            end
        END
    if (devrem = 'SI') then
        begin
        idrem = 0;
        SELECT DEVT_REMID FROM DEVOLUCIONES_VENTAS
            WHERE DEVT_ID = OLD.DEVT_ID INTO :idrem;
        if (idrem <> 0) then
            BEGIN
            CANTAUX = OLD.dvde_cant * OLD.dvde_factor;
            if (EXIST <> 'L') then
                begin
                FOR SELECT RVDE_CANT, RVDE_FACTOR, RVDE_DEVUELTO, RVDE_ITEM
                    FROM remisiones_venta_detalle
                    WHERE REVT_ID = :idrem AND ARTI_COD = OLD.ARTI_COD
                    INTO :CANT, :FACTOR, :DEVUELTO, :ITEM
                    DO
                    BEGIN
                    if (cantaux > 0) then
                        if (CANTAUX > DEVUELTO) then
                            BEGIN
                            UPDATE remisiones_venta_detalle
                                SET RVDE_DEVUELTO = 0
                                WHERE REVT_ID = :idrem AND ARTI_COD = OLD.ARTI_COD AND RVDE_ITEM = :ITEM;
                            CANTAUX = CANTAUX - DEVUELTO;
                            END
                        ELSE
                            BEGIN
                            UPDATE remisiones_venta_detalle
                                SET RVDE_DEVUELTO = RVDE_DEVUELTO - :CANTAUX
                                WHERE REVT_ID = :idrem AND ARTI_COD = OLD.ARTI_COD AND RVDE_ITEM = :ITEM;
                            CANTAUX = 0;
                            END
                        END
                end
            else
                begin
                FOR SELECT RVDE_CANT, RVDE_FACTOR, RVDE_DEVUELTO, RVDE_ITEM
                    FROM remisiones_venta_detalle
                    WHERE REVT_ID = :idrem AND ARTI_COD = OLD.ARTI_COD and BODE_COD = OLD.bode_cod AND RVDE_LOTE = OLD.dvde_lote
                    INTO :CANT, :FACTOR, :DEVUELTO, :ITEM
                    DO
                    BEGIN
                    if (cantaux > 0) then
                        if (CANTAUX > DEVUELTO) then
                            BEGIN
                            UPDATE remisiones_venta_detalle
                                SET RVDE_DEVUELTO = 0
                                WHERE REVT_ID = :idrem AND ARTI_COD = OLD.ARTI_COD AND RVDE_ITEM = :ITEM;
                            CANTAUX = CANTAUX - DEVUELTO;
                            END
                        ELSE
                            BEGIN
                            UPDATE remisiones_venta_detalle
                                SET RVDE_DEVUELTO = RVDE_DEVUELTO - :CANTAUX
                                WHERE REVT_ID = :idrem AND ARTI_COD = OLD.ARTI_COD AND RVDE_ITEM = :ITEM;
                            CANTAUX = 0;
                            END
                        END
                end
            END
        end
    if (devrem = 'PEDIDO') then
        begin
        idped = 0;
        SELECT DEVT_PEDID FROM DEVOLUCIONES_VENTAS
            WHERE DEVT_ID = OLD.DEVT_ID INTO :idped;
        if (idped <> 0) then
            BEGIN
            CANTAUX = OLD.dvde_cant * OLD.dvde_factor;
            FOR SELECT PEDE_CANT, PEDE_FACTOR, PEDE_DEVUELTO, PEDE_ITEM
                FROM pedidos_detalle
                WHERE PEDI_ID = :idped AND ARTI_COD = OLD.ARTI_COD
                INTO :CANT, :FACTOR, :DEVUELTO, :ITEM
                DO
                BEGIN
                if (cantaux > 0) then
                    if (CANTAUX > DEVUELTO) then
                        BEGIN
                        UPDATE pedidos_detalle
                            SET PEDE_DEVUELTO = 0
                            WHERE PEDI_ID = :idped AND ARTI_COD = OLD.ARTI_COD AND PEDE_ITEM = :ITEM;
                        CANTAUX = CANTAUX - DEVUELTO;
                        END
                    ELSE
                        BEGIN
                        UPDATE pedidos_detalle
                            SET PEDE_DEVUELTO = PEDE_DEVUELTO - :CANTAUX
                            WHERE PEDI_ID = :idped AND ARTI_COD = OLD.ARTI_COD AND PEDE_ITEM = :ITEM;
                        CANTAUX = 0;
                        END
                    END
            END
        end
    END
/* Registre el nuevo */
if ((NEW.DEVT_ID <> 0) AND (NEW.dvde_anulado = 'N')) then
    begin
    ID = 0;
    select ARTI_EXIST from ARTICULO where ARTI_COD = NEW.ARTI_COD into :EXIST;
    select devt_fecha, pref_pre, devt_numero, terc_nit, devt_factura, devt_remid, DEVT_FACTID, DEVT_PEDID
        from devoluciones_ventas where devt_id = new.devt_id into :fec, :Pref, :Num, :Nit, :Fact, :idrem, :ID, :idped;
    execute procedure factor_unidad_cant(new.arti_cod, new.dvde_unidad) returning_values(factor);
    CONC = 'DEVOLUCION VENTA No.' || PREF || NUM || '- FACTURA ' || FACT;
    execute procedure lee_configuracion ('FACTURACION', 'DEVOLUCIONES', 'PERMITIR DEVOLVER ITEMS NO FACTURADOS') returning_values (:devnof);
    if (devnof = 'SI') then
        OK = 'S';
    else
        if (id <> 0) then
            begin
            SELECT SUM(FADE_CANT * FADE_FACTOR) FROM FACTURAS_DETALLE WHERE FACT_ID = :ID AND ARTI_COD = NEW.arti_cod INTO :cntfac;
            /* verifique si afecto el inventario */
            select count(mvar_cons) from movimiento_articulo where mvar_tipodoc = 31 and mvar_idref = :id and arti_cod = new.arti_cod into :numrows;
            if (numrows > 0) then
                OK = 'S';
            else
                BEGIN
                /* busque remisiones que pudieron afectarlo */
                /* primero posteriores a la factura */
                select sum(cofa_cant * cofa_factor) from consolidado_faltantes where cofa_tipoori = 31 and cofa_idori = :id and cofa_tipodes = 32 and arti_cod = new.arti_cod and cofa_ok = 'S' into :cantaux;
                if ((cantaux <> 0) and (cantaux is not null)) then
                    BEGIN
                    if ((CNTFAC - (NEW.dvde_cant * NEW.dvde_factor)) <> CANTAUX) then
                        OK = 'S';
                    ELSE
                        OK = 'N';
                    END
                else
                    begin
                    /* si no, anteriores a la factura */
                    select sum(cofa_cant * cofa_factor) from consolidado_faltantes C, FACTURAS f where f.fact_consolida = c.cofa_id and cofa_tipoori = 32 and f.fact_id = :id and cofa_tipodes = 31 and arti_cod = new.arti_cod and cofa_ok = 'S' into :cantaux;
                    if ((cantaux <> 0) and (cantaux is not null)) then
                        OK = 'S';
                    else
                        BEGIN
                        /* si hacen pedido automatico, puede que la remisión este hecha con el pedido */
                        EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION','FACTURAS','GENERAR PEDIDO AUTOMATICAMENTE CON LA FACTURA') RETURNING_VALUES (PEDAUTO);
                        if (PEDAUTO = 'SI') then
                            BEGIN
                            SELECT PEDI_ID FROM PEDIDOS P, FACTURAS F WHERE P.PREF_PRE = F.pref_pre AND P.pedi_numero = F.fact_numero AND F.fact_id = :id INTO :IDped;
                            select sum(cofa_cant * cofa_factor) from consolidado_faltantes where cofa_tipoori = 34 and cofa_idori = :idped and cofa_tipodes = 32 and arti_cod = new.arti_cod and cofa_ok = 'S' into :cantaux;
                            if ((cantaux <> 0) and (cantaux is not null)) then
                                if ((CNTFAC - (NEW.dvde_cant * NEW.dvde_factor)) <> CANTAUX) then
                                    OK = 'S';
                                else
                                    OK = 'N';
                            else
                                OK = 'N';
                            END
                        ELSE
                            OK = 'N';
                        END
                    end
                END
            end
        else
          if ((idrem <> 0) and (devrem = 'SI')) then
            begin
            /* verifique si afecto el inventario */
            select count(mvar_cons) from movimiento_articulo where mvar_tipodoc = 32 and mvar_idref = :idrem and arti_cod = new.arti_cod into :numrows;
            if (numrows > 0) then
                OK = 'S';
            else
                OK = 'N';
            end
    if (OK = 'S') then
        begin
        execute procedure costo_promedio(new.arti_cod, :FEC) returning_values (:COSTO);
        if (COSTO = 0) then
            BEGIN
            if (id <> 0) then
                begin
                SELECT FACT_FECHA FROM FACTURAS WHERE FACT_ID = :ID INTO :fecfac;
                execute procedure costo_promedio_y_ultimo(new.arti_cod, :FECFAC) returning_values (:COSTO, :ULTIMO);
                if (COSTO = 0) then
                    COSTO = ULTIMO;
                end
            if (idrem <> 0) then
                begin
                SELECT REVT_FECHA FROM remisiones_venta WHERE REVT_ID = :ID INTO :fecfac;
                execute procedure costo_promedio_y_ultimo(new.arti_cod, :FECFAC) returning_values (:COSTO, :ULTIMO);
                if (COSTO = 0) then
                    COSTO = ULTIMO;
                end
            END
        INSERT INTO MOVIMIENTO_ARTICULO
            (ARTI_COD, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF,
            MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM, TERC_NIT)
            VALUES(NEW.ARTI_COD, NEW.BODE_COD, :FEC, 33, NEW.devt_id,
            :CONC, :factor * new.dvde_cant, :COSTO, 'S', new.dvde_lote, :Pref, :Num, new.dvde_item, :Nit);
        end
    /* ACTUALICE LO DEVUELTO EN LA FACTURA */
    if (ID <> 0) then
        BEGIN
        CANTAUX = NEW.dvde_cant * NEW.dvde_factor;
        if (EXIST <> 'L') then
            begin
            FOR SELECT FADE_ITEM, FADE_CANT, FADE_FACTOR, FADE_DEVUELTO
                FROM FACTURAS_DETALLE
                WHERE FACT_ID = :ID AND ARTI_COD = NEW.ARTI_COD
                INTO :ITEM, :CANT, :FACTOR, :DEVUELTO
                DO
                BEGIN
                if ((CANTAUX > 0) and ((CANT * FACTOR) > 0))then
                    if ((CANT * FACTOR - DEVUELTO) < CANTAUX) then
                        BEGIN
                        UPDATE FACTURAS_DETALLE
                            SET FADE_DEVUELTO = (:CANT * :FACTOR - :DEVUELTO)
                            WHERE FACT_ID = :ID AND FADE_ITEM = :ITEM AND ARTI_COD = NEW.ARTI_COD;
                        CANTAUX = CANTAUX - (CANT * FACTOR - DEVUELTO);
                        END
                    ELSE
                        BEGIN
                        UPDATE FACTURAS_DETALLE
                            SET FADE_DEVUELTO = FADE_DEVUELTO + :CANTAUX
                            WHERE FACT_ID = :ID AND FADE_ITEM = :ITEM AND ARTI_COD = NEW.ARTI_COD;
                        CANTAUX = 0;
                        END
                END
            end
        else
            begin
            FOR SELECT FADE_ITEM, FADE_CANT, FADE_FACTOR, FADE_DEVUELTO
                FROM FACTURAS_DETALLE
                WHERE FACT_ID = :ID AND ARTI_COD = NEW.ARTI_COD AND BODE_COD = NEW.bode_cod AND FADE_LOTE = NEW.dvde_lote
                INTO :ITEM, :CANT, :FACTOR, :DEVUELTO
                DO
                BEGIN
                if ((CANTAUX > 0) and ((CANT * FACTOR) > 0))then
                    if ((CANT * FACTOR - DEVUELTO) < CANTAUX) then
                        BEGIN
                        UPDATE FACTURAS_DETALLE
                            SET FADE_DEVUELTO = (:CANT * :FACTOR - :DEVUELTO)
                            WHERE FACT_ID = :ID AND FADE_ITEM = :ITEM AND ARTI_COD = NEW.ARTI_COD;
                        CANTAUX = CANTAUX - (CANT * FACTOR - DEVUELTO);
                        END
                    ELSE
                        BEGIN
                        UPDATE FACTURAS_DETALLE
                            SET FADE_DEVUELTO = FADE_DEVUELTO + :CANTAUX
                            WHERE FACT_ID = :ID AND FADE_ITEM = :ITEM AND ARTI_COD = NEW.ARTI_COD;
                        CANTAUX = 0;
                        END
                END
            end
        if (CANTAUX > 0) then
            EXCEPTION DEVOLUCION_MAYOR 'Esta devolviendo una cantidad mayor a la facturada del articulo ' || new.arti_cod;
        END
    if ((idrem <> 0) and (devrem = 'SI')) then
        BEGIN
        CANTAUX = NEW.dvde_cant * NEW.dvde_factor;
        if (EXIST <> 'L') then
            begin
            FOR SELECT RVDE_ITEM, RVDE_CANT, RVDE_FACTOR, RVDE_DEVUELTO
                FROM remisiones_venta_detalle
                WHERE REVT_ID = :idrem AND ARTI_COD = NEW.ARTI_COD
                INTO :ITEM, :CANT, :FACTOR, :DEVUELTO
                DO
                BEGIN
                if (CANTAUX > 0) then
                    if ((CANT * FACTOR - DEVUELTO) < CANTAUX) then
                      BEGIN
                      UPDATE remisiones_venta_detalle
                        SET RVDE_DEVUELTO = (:CANT * :FACTOR - :DEVUELTO)
                        WHERE REVT_ID = :ID AND RVDE_ITEM = :ITEM AND ARTI_COD = NEW.ARTI_COD;
                      CANTAUX = CANTAUX - (CANT * FACTOR - DEVUELTO);
                      END
                    ELSE
                      BEGIN
                      UPDATE remisiones_venta_detalle
                        SET RVDE_DEVUELTO = RVDE_DEVUELTO + :CANTAUX
                        WHERE REVT_ID = :ID AND RVDE_ITEM = :ITEM AND ARTI_COD = NEW.ARTI_COD;
                      CANTAUX = 0;
                      END
                END
            end
        else
            begin
            FOR SELECT RVDE_ITEM, RVDE_CANT, RVDE_FACTOR, RVDE_DEVUELTO
                FROM remisiones_venta_detalle
                WHERE REVT_ID = :idrem AND ARTI_COD = NEW.ARTI_COD and BODE_COD = NEW.bode_cod AND RVDE_LOTE = NEW.dvde_lote
                INTO :ITEM, :CANT, :FACTOR, :DEVUELTO
                DO
                BEGIN
                if (CANTAUX > 0) then
                    if ((CANT * FACTOR - DEVUELTO) < CANTAUX) then
                      BEGIN
                      UPDATE remisiones_venta_detalle
                        SET RVDE_DEVUELTO = (:CANT * :FACTOR - :DEVUELTO)
                        WHERE REVT_ID = :ID AND RVDE_ITEM = :ITEM AND ARTI_COD = NEW.ARTI_COD;
                      CANTAUX = CANTAUX - (CANT * FACTOR - DEVUELTO);
                      END
                    ELSE
                      BEGIN
                      UPDATE remisiones_venta_detalle
                        SET RVDE_DEVUELTO = RVDE_DEVUELTO + :CANTAUX
                        WHERE REVT_ID = :ID AND RVDE_ITEM = :ITEM AND ARTI_COD = NEW.ARTI_COD;
                      CANTAUX = 0;
                      END
                END
            end
        if (CANTAUX > 0) then
            EXCEPTION DEVOLUCION_MAYOR 'Esta devolviendo una cantidad mayor a la remisionada del articulo ' || new.arti_cod;
        END
    if ((idped <> 0) and (devrem = 'PEDIDO')) then
        BEGIN
        CANTAUX = NEW.dvde_cant * NEW.dvde_factor;
        FOR SELECT PEDE_ITEM, PEDE_CANT, PEDE_FACTOR, PEDE_DEVUELTO
            FROM pedidos_detalle
            WHERE PEDI_ID = :idped AND ARTI_COD = NEW.ARTI_COD
            INTO :ITEM, :CANT, :FACTOR, :DEVUELTO
            DO
                BEGIN
                if (CANTAUX > 0) then
                    if ((CANT * FACTOR - DEVUELTO) < CANTAUX) then
                      BEGIN
                      UPDATE pedidos_detalle
                        SET PEDE_DEVUELTO = (:CANT * :FACTOR - :DEVUELTO)
                        WHERE PEDI_ID = :ID AND PEDE_ITEM = :ITEM AND ARTI_COD = NEW.ARTI_COD;
                      CANTAUX = CANTAUX - (CANT * FACTOR - DEVUELTO);
                      END
                    ELSE
                      BEGIN
                      UPDATE pedidos_detalle
                        SET PEDE_DEVUELTO = PEDE_DEVUELTO + :CANTAUX
                        WHERE PEDI_ID = :ID AND PEDE_ITEM = :ITEM AND ARTI_COD = NEW.ARTI_COD;
                      CANTAUX = 0;
                      END
                END
        if (CANTAUX > 0) then
            EXCEPTION DEVOLUCION_MAYOR 'Esta devolviendo una cantidad mayor a la pedida del articulo ' || new.arti_cod;
        END
    END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER DEVOLUCIONES_VENTAS_DETALLE_AD FOR DEVOLUCIONES_VENTAS_DETALLE
ACTIVE AFTER DELETE POSITION 0
AS
declare variable ID INTEGER;
declare variable ITEM INTEGER;
declare variable CANTAUX NUMERIC(18, 4);
declare variable CANT NUMERIC(18, 4);
declare variable FACTOR NUMERIC(18, 4);
declare variable DEVUELTO NUMERIC(18, 4);
declare variable IDREM INTEGER;
declare variable IDPED INTEGER;
declare variable devrem CHAR(2);
declare variable EXIST CHAR(1);
begin
execute procedure lee_configuracion ('FACTURACION', 'DEVOLUCIONES', 'HACER DEVOLUCIONES SOBRE REMISIONES') returning_values (:devrem);
if ((OLD.devt_id <> 0) AND (OLD.dvde_anulado = 'N')) then
    BEGIN
    select ARTI_EXIST from ARTICULO where ARTI_COD = old.ARTI_COD into :EXIST;
    delete from movimiento_articulo
      where (mvar_tipodoc = 33) and (mvar_idref = old.devt_id) and (mvar_item = old.dvde_item);
  
    /* DESHAGA LO DEVUELTO EN LA FACTURA */
    SELECT DEVT_FACTID FROM DEVOLUCIONES_VENTAS
        WHERE DEVT_ID = OLD.DEVT_ID INTO :ID;
    if (ID <> 0) then
        BEGIN
        CANTAUX = OLD.dvde_cant * OLD.dvde_factor;
        if (EXIST <> 'L') then
            begin
            FOR SELECT FADE_CANT, FADE_FACTOR, FADE_DEVUELTO, FADE_ITEM
                FROM FACTURAS_DETALLE
                WHERE FACT_ID = :ID AND ARTI_COD = OLD.ARTI_COD
                INTO :CANT, :FACTOR, :DEVUELTO, :ITEM
                DO
                BEGIN
                if (CANTAUX > 0) then
                  if (CANTAUX > DEVUELTO) then
                    BEGIN
                    UPDATE FACTURAS_DETALLE
                        SET FADE_DEVUELTO = 0
                        WHERE FACT_ID = :ID AND ARTI_COD = OLD.ARTI_COD AND FADE_ITEM = :ITEM;
                    CANTAUX = CANTAUX - DEVUELTO;
                    END
                  ELSE
                    BEGIN
                    UPDATE FACTURAS_DETALLE
                        SET FADE_DEVUELTO = FADE_DEVUELTO - :CANTAUX
                        WHERE FACT_ID = :ID AND ARTI_COD = OLD.ARTI_COD AND FADE_ITEM = :ITEM;
                    CANTAUX = 0;
                    END
                END
            end
        else
            begin
            FOR SELECT FADE_CANT, FADE_FACTOR, FADE_DEVUELTO, FADE_ITEM
                FROM FACTURAS_DETALLE
                WHERE FACT_ID = :ID AND ARTI_COD = OLD.ARTI_COD AND BODE_COD = OLD.bode_cod AND FADE_LOTE = OLD.dvde_lote
                INTO :CANT, :FACTOR, :DEVUELTO, :ITEM
                DO
                BEGIN
                if (CANTAUX > 0) then
                  if (CANTAUX > DEVUELTO) then
                    BEGIN
                    UPDATE FACTURAS_DETALLE
                        SET FADE_DEVUELTO = 0
                        WHERE FACT_ID = :ID AND ARTI_COD = OLD.ARTI_COD AND FADE_ITEM = :ITEM;
                    CANTAUX = CANTAUX - DEVUELTO;
                    END
                  ELSE
                    BEGIN
                    UPDATE FACTURAS_DETALLE
                        SET FADE_DEVUELTO = FADE_DEVUELTO - :CANTAUX
                        WHERE FACT_ID = :ID AND ARTI_COD = OLD.ARTI_COD AND FADE_ITEM = :ITEM;
                    CANTAUX = 0;
                    END
                END
            end
        END
    if (devrem = 'SI') then
        begin
        idrem = 0;
        SELECT DEVT_REMID FROM DEVOLUCIONES_VENTAS
            WHERE DEVT_ID = OLD.DEVT_ID INTO :idrem;
        if (idrem <> 0) then
            BEGIN
            CANTAUX = OLD.dvde_cant * OLD.dvde_factor;
            if (EXIST <> 'L') then
                begin
                FOR SELECT RVDE_CANT, RVDE_FACTOR, RVDE_DEVUELTO, RVDE_ITEM
                    FROM remisiones_venta_detalle
                    WHERE REVT_ID = :idrem AND ARTI_COD = OLD.ARTI_COD
                    INTO :CANT, :FACTOR, :DEVUELTO, :ITEM
                    DO
                    BEGIN
                    if (CANTAUX > 0) then
                        if (CANTAUX > DEVUELTO) then
                            BEGIN
                            UPDATE remisiones_venta_detalle
                                SET RVDE_DEVUELTO = 0
                                WHERE REVT_ID = :idrem AND ARTI_COD = OLD.ARTI_COD AND RVDE_ITEM = :ITEM;
                            CANTAUX = CANTAUX - DEVUELTO;
                            END
                        ELSE
                            BEGIN
                            UPDATE remisiones_venta_detalle
                                SET RVDE_DEVUELTO = RVDE_DEVUELTO - :CANTAUX
                                WHERE REVT_ID = :idrem AND ARTI_COD = OLD.ARTI_COD AND RVDE_ITEM = :ITEM;
                            CANTAUX = 0;
                            END
                    END
                end
            else
                begin
                FOR SELECT RVDE_CANT, RVDE_FACTOR, RVDE_DEVUELTO, RVDE_ITEM
                    FROM remisiones_venta_detalle
                    WHERE REVT_ID = :idrem AND ARTI_COD = OLD.ARTI_COD AND BODE_COD = OLD.bode_cod AND RVDE_LOTE = OLD.dvde_lote
                    INTO :CANT, :FACTOR, :DEVUELTO, :ITEM
                    DO
                    BEGIN
                    if (CANTAUX > 0) then
                        if (CANTAUX > DEVUELTO) then
                            BEGIN
                            UPDATE remisiones_venta_detalle
                                SET RVDE_DEVUELTO = 0
                                WHERE REVT_ID = :idrem AND ARTI_COD = OLD.ARTI_COD AND RVDE_ITEM = :ITEM;
                            CANTAUX = CANTAUX - DEVUELTO;
                            END
                        ELSE
                            BEGIN
                            UPDATE remisiones_venta_detalle
                                SET RVDE_DEVUELTO = RVDE_DEVUELTO - :CANTAUX
                                WHERE REVT_ID = :idrem AND ARTI_COD = OLD.ARTI_COD AND RVDE_ITEM = :ITEM;
                            CANTAUX = 0;
                            END
                    END
                end
            END
        end
    if (devrem = 'PEDIDO') then
        begin
        idrem = 0;
        SELECT DEVT_PEDID FROM DEVOLUCIONES_VENTAS
            WHERE DEVT_ID = OLD.DEVT_ID INTO :idped;
        if (idped <> 0) then
            BEGIN
            CANTAUX = OLD.dvde_cant * OLD.dvde_factor;
            FOR SELECT PEDE_CANT, PEDE_FACTOR, PEDE_DEVUELTO, PEDE_ITEM
                FROM pedidos_detalle
                WHERE PEDI_ID = :idped AND ARTI_COD = OLD.ARTI_COD
                INTO :CANT, :FACTOR, :DEVUELTO, :ITEM
                DO
                BEGIN
                if (CANTAUX > 0) then
                    if (CANTAUX > DEVUELTO) then
                        BEGIN
                        UPDATE pedidos_detalle
                            SET PEDE_DEVUELTO = 0
                            WHERE PEDI_ID = :idped AND ARTI_COD = OLD.ARTI_COD AND PEDE_ITEM = :ITEM;
                        CANTAUX = CANTAUX - DEVUELTO;
                        END
                    ELSE
                        BEGIN
                        UPDATE pedidos_detalle
                            SET PEDE_DEVUELTO = PEDE_DEVUELTO - :CANTAUX
                            WHERE PEDI_ID = :idped AND ARTI_COD = OLD.ARTI_COD AND PEDE_ITEM = :ITEM;
                        CANTAUX = 0;
                        END
                END
            END
        end
    END
END
^

SET TERM ; ^


/* 20100719 */
/* ERROR SE ACTUALIZABA LA SALIDA DE DOCUMENTOS SIN VERIFICAR LA CAJA */

SET TERM ^ ;

CREATE OR ALTER TRIGGER CONSIGNA_TARJETAS_DET_AI FOR CONSIGNA_TARJETAS_DET
ACTIVE AFTER INSERT POSITION 0
as
declare variable Fec DATE;
declare variable Caja integer;
declare variable Conc VARCHAR(60);
declare variable Pref varchar(4);
declare variable Num varchar(6);
declare variable Existe char(1);
declare variable VALFP char(2);
BEGIN
EXECUTE PROCEDURE LEE_CONFIGURACION('BANCOS','CONSIGNACIONES','VALIDAR FORMAS DE PAGO EN CAJA') RETURNING_VALUES (VALFP);
if ((new.COTJ_ID <> 0) and (new.ctjd_anulado = 'N')) then
  begin
  /* afecte la caja */
  select cotj_fecha, cotj_concepto, pref_pre, cotj_numero, caja_id from consigna_tarjetas
    where cotj_id = new.cotj_id into :Fec, :Conc, :Pref, :Num, :caja;
  Existe = 'N';
  select 'S' from movimiento_caja where moca_tiporef = 64 and moca_idref = new.cotj_id into :Existe;
  if (Existe = 'S') then
    update movimiento_caja
      set moca_creditos = moca_creditos + new.ctjd_base
      where moca_tiporef = 64 and moca_idref = new.cotj_id;
  else
    INSERT INTO MOVIMIENTO_CAJA
        (MOCA_ID, CAJA_ID, MOCA_TIPOREF, MOCA_PREFREF, MOCA_NUMREF, MOCA_FECHA, MOCA_CONC, MOCA_DEBITOS, MOCA_CREDITOS, MOCA_DB, MOCA_IDREF)
        VALUES(GEN_ID(ID_MOVCAJA,1), :Caja, 64, :Pref, :Num, :Fec, :Conc, 0, NEW.ctjd_base, 'N', new.cotj_id);

  /* ACTUALICE LA SALIDA DEL DOCUMENTO DE PAGO */
  EXISTE = 'N';
  SELECT 'S' FROM DOCUMENTOS_PAGO_CAJA WHERE caja_id = :caja AND FOPA_ID = NEW.FOPA_ID AND DPCA_BANCO = NEW.TARJ_COD AND DPCA_CUENTA = NEW.CTJD_NROTJ AND
        DPCA_NUMERO = NEW.CTJD_COMPROB AND DPCA_TIPOSAL = 0 AND DPCA_IDSAL = 0 AND DPCA_MONTO = NEW.ctjd_base INTO :EXISTE;
  if (EXISTE = 'S') then
    UPDATE DOCUMENTOS_PAGO_CAJA
        SET DPCA_TIPOSAL = 64, DPCA_IDSAL = NEW.cotj_id
        WHERE caja_id = :caja AND FOPA_ID = NEW.FOPA_ID AND DPCA_BANCO = NEW.TARJ_COD AND DPCA_CUENTA = NEW.CTJD_NROTJ AND
        DPCA_NUMERO = NEW.CTJD_COMPROB AND DPCA_TIPOSAL = 0 AND DPCA_IDSAL = 0 AND DPCA_MONTO = NEW.ctjd_base;
  ELSE
    IF (VALFP = 'SI') THEN
        EXCEPTION documento_pago_salido 'No se encontró la tarjeta ' || new.tarj_cod || ' ' || new.ctjd_nrotj || ' ' || new.ctjd_comprob || ' en la caja.';
  end
end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure CHEQUEO_SALDOS_CAJAS (
    CAJAINI integer,
    CAJAFIN integer)
AS
declare variable ID INTEGER;
declare variable Fec date;
declare variable Caja integer;
declare variable Conc VARCHAR(60);
declare variable Pref varchar(4);
declare variable Num varchar(6);
declare variable FORMA INTEGER;
declare variable BANCO VARCHAR(2);
declare variable CUENTA VARCHAR(20);
declare variable NUMERO VARCHAR(20);
declare variable FECHA DATE;
declare variable MONTO NUMERIC(18,2);
declare variable Existe INTEGER;
declare variable Dest INTEGER;
declare variable idref INTEGER;
declare variable item integer;
begin
/* BORRE LOS MOVIMIENTOS CAJA, LOS DOCUMENTOS PAGO CAJA Y SALDO EFECTIVO */
DELETE FROM ANTICIPOS_CLIENTE WHERE RECA_ID = 0;
DELETE FROM ANTICIPOS_PROVEEDOR WHERE EGRE_ID = 0;
UPDATE DOCUMENTOS_PAGO_CAJA SET dpca_idsal = 0 WHERE CAJA_ID >= :cajaini AND CAJA_ID <= :cajafin;
DELETE FROM MOVIMIENTO_CAJA WHERE CAJA_ID >= :cajaini AND CAJA_ID <= :cajafin;
DELETE FROM DOCUMENTOS_PAGO_CAJA WHERE CAJA_ID >= :cajaini AND CAJA_ID <= :cajafin;
DELETE FROM SALDO_EFECTIVO WHERE CAJA_ID >= :cajaini AND CAJA_ID <= :cajafin;
DELETE FROM saldo_caja WHERE CAJA_ID >= :cajaini AND CAJA_ID <= :cajafin;

/* INCORPORE LOS RECIBOS DE CAJA */
FOR SELECT R.RECA_ID, reca_fecha, caja_id, reca_conc, pref_pre, reca_numero, FOPA_ID, RCPA_BANCO, RCPA_CUENTA, RCPA_NUMERO, RCPA_FECHA, RCPA_MONTO
    FROM recibos_caja R, RECIBOS_CAJA_PAGO P where R.reca_id = P.reca_id and reca_anulado = 'N' AND CAJA_ID >= :cajaini AND CAJA_ID <= :cajafin
    ORDER BY CAJA_ID, R.RECA_FECHA, R.RECA_ID, RCPA_ITEM
    INTO :ID, :Fec, :Caja, :Conc, :Pref, :Num, :forma,  :banco, :cuenta, :numero, :fecha, :monto
    DO
    BEGIN
    select COUNT(*) from movimiento_caja where moca_tiporef = 61 and moca_idref = :id into :Existe;
    if (Existe > 0) then
        update movimiento_caja
        set moca_debitos = moca_debitos + :monto
        where moca_tiporef = 61 and moca_idref = :id;
    else
        INSERT INTO MOVIMIENTO_CAJA
            (MOCA_ID, CAJA_ID, MOCA_TIPOREF, MOCA_PREFREF, MOCA_NUMREF, MOCA_FECHA, MOCA_CONC, MOCA_DEBITOS, MOCA_CREDITOS, MOCA_DB, MOCA_IDREF)
            VALUES(GEN_ID(id_movcaja,1), :Caja, 61, :Pref, :Num, :Fec, :Conc, :monto, 0, 'S', :id);
        /* GRABE EL DOCUMENTO DE PAGO EN CAJA */
        if (FORMA <> 1) then
            INSERT INTO DOCUMENTOS_PAGO_CAJA (DPCA_ID, FOPA_ID, CAJA_ID, DPCA_BANCO, DPCA_CUENTA, DPCA_NUMERO, DPCA_FECHA, DPCA_MONTO, DPCA_TIPOENT, DPCA_IDENT, DPCA_TIPOSAL, DPCA_IDSAL)
                VALUES (GEN_ID(ID_DOCPAGOCAJA, 1), :FORMA, :CAJA, :BANCO, :CUENTA, :NUMERO, :FECHA, :MONTO, 61, :ID, 0, 0);
        ELSE
            EXECUTE PROCEDURE SUME_SALDO_EFECTIVO (:CAJA, :FEC, :MONTO, 'N');
    END

/* LOS EGRESOS POR TRASLADO A CAJA */
for SELECT EGRE_ID, CAJA_ID, PREF_PRE, EGRE_NUMERO, EGRE_FECHA, EGRE_CONC, EGRE_MONTO FROM EGRESOS
    WHERE EGRE_TIPO = '2' AND CAJA_ID <> 0 AND egre_id <> 0 AND egre_anulado = 'N' AND CAJA_ID >= :cajaini AND CAJA_ID <= :cajafin
    ORDER BY CAJA_ID, EGRE_FECHA
    INTO :ID, :CAJA, :PREF, :NUM, :FEC, :CONC, :MONTO
    DO
    BEGIN
    SELECT MOCA_IDREF FROM movimiento_caja WHERE MOCA_TIPOREF = 62 AND MOCA_IDREF = :ID INTO :idref;
    if (idref IS NULL) then
     BEGIN
     INSERT INTO MOVIMIENTO_CAJA
        (MOCA_ID, CAJA_ID, MOCA_TIPOREF, MOCA_PREFREF, MOCA_NUMREF, MOCA_FECHA, MOCA_CONC, MOCA_DEBITOS, MOCA_CREDITOS, MOCA_DB, MOCA_IDREF)
        VALUES(GEN_ID(id_movcaja,1), :CAJA, 62, :PREF, :NUM, :FEC, :CONC, :MONTO, 0, 'S', :ID);
      /* GRABE EL DOCUMENTO DE PAGO EN CAJA */
      EXECUTE PROCEDURE SUME_SALDO_EFECTIVO (:caja, :fec, :monto, 'N');
     END
    END
/* LOS CAMBIOS */
FOR SELECT C.CADO_ID, cado_fecha, cado_conc, pref_pre, cado_numero, caja_id, FOPA_ID, CDSA_BANCO, CDSA_CUENTA, CDSA_NUMERO, CDSA_FECHA, CDSA_MONTO
    FROM CAMBIO_DOCUMENTOS C, CAMBIODOC_SALIDAS D where C.CADO_ID = D.CADO_ID and cado_anulado = 'N' AND CAJA_ID >= :cajaini AND CAJA_ID <= :cajafin
    ORDER BY CAJA_ID, C.CADO_FECHA, C.CADO_ID, CDSA_ITEM
    INTO :ID, :Fec, :Conc, :Pref, :Num, :Caja, :forma, :banco, :cuenta, :numero, :fecha, :monto
    DO
    BEGIN
    select COUNT(*) from movimiento_caja where moca_tiporef = 63 and moca_idref = :id and caja_id = :CAJA into :Existe;
    if (Existe > 0) then
        begin
        update movimiento_caja
            set moca_debitos = moca_debitos + :monto
            where moca_tiporef = 63 and moca_idref = :id and caja_id = :CAJA;
        end
    else
        INSERT INTO MOVIMIENTO_CAJA
            (MOCA_ID, CAJA_ID, MOCA_TIPOREF, MOCA_PREFREF, MOCA_NUMREF, MOCA_FECHA, MOCA_CONC, MOCA_DEBITOS, MOCA_CREDITOS, MOCA_DB, MOCA_IDREF)
            VALUES(GEN_ID(ID_MOVCAJA,1), :CAJA, 63, :Pref, :Num, :Fec, :Conc, :monto, 0, 'S', :id);
        
    if (FORMA <> 1) then
        INSERT INTO DOCUMENTOS_PAGO_CAJA (DPCA_ID, FOPA_ID, CAJA_ID, DPCA_BANCO, DPCA_CUENTA, DPCA_NUMERO, DPCA_FECHA, DPCA_MONTO, DPCA_TIPOENT, DPCA_IDENT, DPCA_TIPOSAL, DPCA_IDSAL)
            VALUES (GEN_ID(ID_DOCPAGOCAJA, 1), :FORMA, :CAJA, :BANCO, :CUENTA, :NUMERO, :FECHA, :MONTO, 63, :ID, 0, 0);
    ELSE
        EXECUTE PROCEDURE SUME_SALDO_EFECTIVO(:CAJA, :FEC, :MONTO, 'N');
    END
/* DEVOLUCIONES DE CHEQUES ojo fopa_id = 2 */
FOR SELECT DVCH_ID, dvch_fecha, caja_id, dvch_conc, prba_pref, dvch_numdoc, 2, DVCH_BANCO, DVCH_CUENTA, DVCH_NROCH, DVCH_FECCH, DVCH_MONTO
    FROM DEVOLUCION_CHEQUES where dvch_anulado = 'N' AND dvch_cartera <> 'S' AND CAJA_ID >= :cajaini AND CAJA_ID <= :cajafin
    ORDER BY CAJA_ID, DVCH_FECHA, DVCH_ID
    INTO :ID, :Fec, :Caja, :Conc, :Pref, :Num, :forma,  :banco, :cuenta, :numero, :fecha, :monto
    DO
    BEGIN
    select COUNT(*) from movimiento_caja where moca_tiporef = 77 and moca_idref = :id into :Existe;
    if (Existe > 0) then
        update movimiento_caja
        set moca_debitos = moca_debitos + :monto
        where moca_tiporef = 77 and moca_idref = :id;
    else
        INSERT INTO MOVIMIENTO_CAJA
            (MOCA_ID, CAJA_ID, MOCA_TIPOREF, MOCA_PREFREF, MOCA_NUMREF, MOCA_FECHA, MOCA_CONC, MOCA_DEBITOS, MOCA_CREDITOS, MOCA_DB, MOCA_IDREF)
            VALUES(GEN_ID(id_movcaja,1), :Caja, 77, :Pref, :Num, :Fec, :Conc, :monto, 0, 'S', :id);
        /* GRABE EL DOCUMENTO DE PAGO EN CAJA */
        INSERT INTO DOCUMENTOS_PAGO_CAJA (DPCA_ID, FOPA_ID, CAJA_ID, DPCA_BANCO, DPCA_CUENTA, DPCA_NUMERO, DPCA_FECHA, DPCA_MONTO, DPCA_TIPOENT, DPCA_IDENT, DPCA_TIPOSAL, DPCA_IDSAL)
            VALUES (GEN_ID(ID_DOCPAGOCAJA, 1), 2, :CAJA, :BANCO, :CUENTA, :NUMERO, :FECHA, :MONTO, 77, :ID, 0, 0);
    END

/* TRASLADOS ENTRE CAJAS INGRESOS */
FOR SELECT T.TRCJ_ID, trcj_fecha, caja_id, trcj_destino, trcj_conc, pref_pre, trcj_numero, fopa_id, TRCD_BANCO, TRCD_CUENTA, TRCD_NUMERO, TRCD_FECHA, TRCD_MONTO
    FROM TRASLADOS_CAJA T, TRASLADOS_CAJA_DET D where T.TRCJ_ID = D.TRCJ_ID AND trcj_anulado = 'N' AND TRCJ_DESTINO >= :cajaini AND TRCJ_DESTINO <= :cajafin
    ORDER BY CAJA_ID, TRCJ_FECHA, T.TRCJ_ID, TRCD_ITEM
    INTO :ID, :Fec, :Caja, :Dest, :Conc, :Pref, :Num, :forma,  :banco, :cuenta, :numero, :fecha, :monto
    DO
    BEGIN
    /* INGRESO A LA CAJA DESTINO */
    select COUNT(*) from movimiento_caja where moca_tiporef = 66 and moca_idref = :id and caja_id = :Dest into :Existe;
    if (Existe > 0) then
        begin
        update movimiento_caja
            set moca_debitos = moca_debitos + :monto
            where moca_tiporef = 66 and moca_idref = :id and caja_id = :Dest;
        end
    else
        INSERT INTO MOVIMIENTO_CAJA
            (MOCA_ID, CAJA_ID, MOCA_TIPOREF, MOCA_PREFREF, MOCA_NUMREF, MOCA_FECHA, MOCA_CONC, MOCA_DEBITOS, MOCA_CREDITOS, MOCA_DB, MOCA_IDREF)
            VALUES(GEN_ID(ID_MOVCAJA,1), :Dest, 66, :Pref, :Num, :Fec, :Conc, :monto, 0, 'S', :id);
    /* Ingrese el doc. de pago */
    if (FORMA <> 1) then
        INSERT INTO DOCUMENTOS_PAGO_CAJA (DPCA_ID, FOPA_ID, CAJA_ID, DPCA_BANCO, DPCA_CUENTA, DPCA_NUMERO, DPCA_FECHA, DPCA_MONTO, DPCA_TIPOENT, DPCA_IDENT, DPCA_TIPOSAL, DPCA_IDSAL)
            VALUES (GEN_ID(ID_DOCPAGOCAJA, 1), :FORMA, :Dest, :BANCO, :CUENTA, :NUMERO, :FECHA, :MONTO, 66, :ID, 0, 0);
    else
        EXECUTE PROCEDURE SUME_SALDO_EFECTIVO (:Dest, :Fec, :MONTO, 'N');
    END

/* TRASLADOS ENTRE CAJAS EGRESOS */
FOR SELECT T.TRCJ_ID, trcj_fecha, caja_id, trcj_destino, trcj_conc, pref_pre, trcj_numero, fopa_id, TRCD_BANCO, TRCD_CUENTA, TRCD_NUMERO, TRCD_FECHA, TRCD_MONTO, TRCD_ITEM
    FROM TRASLADOS_CAJA T, TRASLADOS_CAJA_DET D where T.TRCJ_ID = D.TRCJ_ID AND trcj_anulado = 'N' AND CAJA_ID >= :cajaini AND CAJA_ID <= :cajafin
    ORDER BY CAJA_ID, TRCJ_FECHA, T.TRCJ_ID, TRCD_ITEM
    INTO :ID, :Fec, :Caja, :Dest, :Conc, :Pref, :Num, :forma,  :banco, :cuenta, :numero, :fecha, :monto, :item
    DO
    BEGIN
    select COUNT(*) from movimiento_caja where moca_tiporef = 66 and moca_idref = :id and caja_id = :caja into :Existe;
    if (Existe > 0) then
        begin
        update movimiento_caja
            set moca_creditos = moca_creditos + :monto
            where moca_tiporef = 66 and moca_idref = :id and caja_id = :caja;
        end
    else
        INSERT INTO MOVIMIENTO_CAJA
            (MOCA_ID, CAJA_ID, MOCA_TIPOREF, MOCA_PREFREF, MOCA_NUMREF, MOCA_FECHA, MOCA_CONC, MOCA_DEBITOS, MOCA_CREDITOS, MOCA_DB, MOCA_IDREF)
            VALUES(GEN_ID(ID_MOVCAJA,1), :CAJA, 66, :Pref, :Num, :Fec, :Conc, 0, :monto, 'N', :id);
    /* Actualice la salida del documento en la caja origen */
    if (FORMA <> 1) then
        BEGIN
        if (EXISTS (SELECT DPCA_ID FROM DOCUMENTOS_PAGO_CAJA WHERE FOPA_ID = :FORMA AND DPCA_BANCO = :BANCO AND DPCA_CUENTA = :CUENTA AND
            DPCA_NUMERO = :NUMERO AND CAJA_ID = :CAJA AND DPCA_TIPOSAL = 0 AND DPCA_IDSAL = 0 AND DPCA_MONTO = :MONTO)) then
            UPDATE DOCUMENTOS_PAGO_CAJA
                SET DPCA_TIPOSAL = 66, DPCA_IDSAL = :ID
                WHERE FOPA_ID = :FORMA AND DPCA_BANCO = :BANCO AND DPCA_CUENTA = :CUENTA AND CAJA_ID = :CAJA AND
                DPCA_NUMERO = :NUMERO AND DPCA_TIPOSAL = 0 AND DPCA_IDSAL = 0 AND DPCA_MONTO = :MONTO;
        else
            BEGIN
            update traslados_caja_det set fopa_id = 1 where TRCJ_ID = :id and TRCD_ITEM = :item;
            EXECUTE PROCEDURE RESTE_SALDO_EFECTIVO(:CAJA, :FEC, :MONTO, 'N');
            END
        END
    else
        EXECUTE PROCEDURE RESTE_SALDO_EFECTIVO (:CAJA, :Fec, :MONTO, 'N');
    END

/* INCORPORE LOS EGRESOS DE CAJA */
FOR SELECT E.EGRE_ID, egre_fecha, egre_conc, pref_pre, egre_numero, C.caja_id, FOPA_ID, EGCA_BANCO, EGCA_CUENTA, EGCA_NUMERO, EGCA_FECHA, EGCA_MONTO, EGCA_ITEM
    FROM EGRESOS E, EGRESOS_CAJA C where E.egre_id = C.egre_id and egre_anulado = 'N' AND C.CAJA_ID >= :cajaini AND C.CAJA_ID <= :cajafin
    ORDER BY CAJA_ID, E.EGRE_FECHA, E.EGRE_ID, EGCA_ITEM
    INTO :ID, :Fec, :Conc, :Pref, :Num, :Caja, :forma, :banco, :cuenta, :numero, :fecha, :monto, :item
    DO
    BEGIN
    select COUNT(*) from movimiento_caja where moca_tiporef = 62 and moca_idref = :id and caja_id = :caja into :Existe;
    if (Existe > 0) then
        update movimiento_caja
        set moca_creditos = moca_creditos + :monto
        where moca_tiporef = 62 and moca_idref = :id and caja_id = :caja;
    else
        INSERT INTO MOVIMIENTO_CAJA
            (MOCA_ID, CAJA_ID, MOCA_TIPOREF, MOCA_PREFREF, MOCA_NUMREF, MOCA_FECHA, MOCA_CONC, MOCA_DEBITOS, MOCA_CREDITOS, MOCA_DB, MOCA_IDREF)
            VALUES(GEN_ID(ID_MOVCAJA,1), :caja, 62, :Pref, :Num, :Fec, :Conc, 0, :monto, 'N', :id);
    /* ACTUALICE LA SALIDA DEL DOCUMENTO */
    if (FORMA <> 1) then
        begin
        if (exists (select dpca_id from DOCUMENTOS_PAGO_CAJA WHERE FOPA_ID = :FORMA AND DPCA_BANCO = :BANCO AND DPCA_CUENTA = :CUENTA AND
            DPCA_NUMERO = :NUMERO AND DPCA_TIPOSAL = 0 AND DPCA_IDSAL = 0 AND DPCA_MONTO = :MONTO AND CAJA_ID = :CAJA)) then
            UPDATE DOCUMENTOS_PAGO_CAJA
                SET DPCA_TIPOSAL = 62, DPCA_IDSAL = :ID
                WHERE FOPA_ID = :FORMA AND DPCA_BANCO = :BANCO AND DPCA_CUENTA = :CUENTA AND CAJA_ID = :CAJA AND 
                DPCA_NUMERO = :NUMERO AND DPCA_TIPOSAL = 0 AND DPCA_IDSAL = 0 AND DPCA_MONTO = :MONTO;
        else
            begin
            update egresos_caja set fopa_id = 1 where egre_id = :id and EGCA_ITEM = :item;
            EXECUTE PROCEDURE RESTE_SALDO_EFECTIVO(:CAJA, :FEC, :MONTO, 'N');
            end
        end
    ELSE
        EXECUTE PROCEDURE RESTE_SALDO_EFECTIVO(:CAJA, :FEC, :MONTO, 'N');
    END

/* INCORPORE LAS CONSIGNACIONES */
FOR SELECT C.CONS_ID, cons_fecha, cons_concepto, prba_pref, cons_numero, caja_id, FOPA_ID, CODE_BANCO, CODE_CUENTA, CODE_NUMERO, CODE_FECHA, CODE_MONTO, CODE_ITEM2
    FROM CONSIGNA C, CONSIGNA_DETALLE D where C.CONS_ID = D.CONS_ID and cons_anulado = 'N' AND CAJA_ID >= :cajaini AND CAJA_ID <= :cajafin
    ORDER BY CAJA_ID, C.CONS_FECHA, C.CONS_ID, CODE_ITEM2
    INTO :ID, :Fec, :Conc, :Pref, :Num, :Caja, :forma, :banco, :cuenta, :numero, :fecha, :monto, :item
    DO
    BEGIN
    select COUNT(*) from movimiento_caja where moca_tiporef = 71 and moca_idref = :id and caja_id = :caja into :Existe;
    if (Existe > 0) then
        update movimiento_caja
            set moca_creditos = moca_creditos + :monto
            where moca_tiporef = 71 and moca_idref = :id and caja_id = :caja;
    else
        INSERT INTO MOVIMIENTO_CAJA
            (MOCA_ID, CAJA_ID, MOCA_TIPOREF, MOCA_PREFREF, MOCA_NUMREF, MOCA_FECHA, MOCA_CONC, MOCA_DEBITOS, MOCA_CREDITOS, MOCA_DB, MOCA_IDREF)
            VALUES(GEN_ID(ID_MOVCAJA,1), :CAJA, 71, :Pref, :Num, :Fec, :Conc, 0, :monto, 'N', :id);
    /* ACTUALICE LA SALIDA DEL DOCUMENTO DE PAGO */
    if (FORMA <> 1) then
        BEGIN
        if (EXISTS(SELECT DPCA_ID FROM DOCUMENTOS_PAGO_CAJA WHERE FOPA_ID = :FORMA AND DPCA_BANCO = :BANCO AND DPCA_CUENTA = :CUENTA AND
            DPCA_NUMERO = :NUMERO AND DPCA_TIPOSAL = 0 AND DPCA_IDSAL = 0 AND DPCA_MONTO = :MONTO AND CAJA_ID = :CAJA)) then
            UPDATE DOCUMENTOS_PAGO_CAJA
                SET DPCA_TIPOSAL = 71, DPCA_IDSAL = :id
                WHERE FOPA_ID = :FORMA AND DPCA_BANCO = :BANCO AND DPCA_CUENTA = :CUENTA AND CAJA_ID = :CAJA AND
                DPCA_NUMERO = :NUMERO AND DPCA_TIPOSAL = 0 AND DPCA_IDSAL = 0 AND DPCA_MONTO = :MONTO;
        ELSE
            BEGIN
            update consigna_detalle set fopa_id = 1 where CONS_ID = :id and CODE_ITEM2 = :item;
            EXECUTE PROCEDURE RESTE_SALDO_EFECTIVO(:CAJA, :FEC, :MONTO, 'N');
            END
        END
    ELSE
        EXECUTE PROCEDURE RESTE_SALDO_EFECTIVO(:CAJA, :FEC, :MONTO, 'N');
    END

/* CONSIGNACIONES DE TARJETAS */
FOR SELECT C.COTJ_ID, cotj_fecha, cotj_concepto, pref_pre, cotj_numero, caja_id, FOPA_ID, TARJ_COD, CTJD_NROTJ, CTJD_COMPROB, COTJ_FECHA, CTJD_BASE
    FROM CONSIGNA_TARJETAS C, CONSIGNA_TARJETAS_DET D where C.cotj_id = D.cotj_id and cotj_anulado = 'N' AND CAJA_ID >= :cajaini AND CAJA_ID <= :cajafin
    ORDER BY CAJA_ID, C.COTJ_FECHA, C.cotj_id, CTJD_ITEM
    INTO :ID, :Fec, :Conc, :Pref, :Num, :Caja, :forma, :banco, :cuenta, :numero, :fecha, :monto
    DO
    BEGIN
    select COUNT(*) from movimiento_caja where moca_tiporef = 64 and moca_idref = :id into :Existe;
    if (Existe > 0) then
        update movimiento_caja
            set moca_creditos = moca_creditos + :monto
            where moca_tiporef = 64 and moca_idref = :id;
    else
        INSERT INTO MOVIMIENTO_CAJA
            (MOCA_ID, CAJA_ID, MOCA_TIPOREF, MOCA_PREFREF, MOCA_NUMREF, MOCA_FECHA, MOCA_CONC, MOCA_DEBITOS, MOCA_CREDITOS, MOCA_DB, MOCA_IDREF)
            VALUES(GEN_ID(ID_MOVCAJA,1), :Caja, 64, :Pref, :Num, :Fec, :Conc, 0, :monto, 'N', :id);

  /* ACTUALICE LA SALIDA DEL DOCUMENTO DE PAGO */
  if (EXISTS(SELECT DPCA_ID FROM DOCUMENTOS_PAGO_CAJA WHERE FOPA_ID = :FORMA AND DPCA_BANCO = :BANCO AND DPCA_CUENTA = :CUENTA AND
    DPCA_NUMERO = :NUMERO AND DPCA_TIPOSAL = 0 AND DPCA_IDSAL = 0 AND DPCA_MONTO = :MONTO AND CAJA_ID = :CAJA)) then
      UPDATE DOCUMENTOS_PAGO_CAJA
        SET DPCA_TIPOSAL = 64, DPCA_IDSAL = :id
        WHERE FOPA_ID = :FORMA AND DPCA_BANCO = :BANCO AND DPCA_CUENTA = :CUENTA AND CAJA_ID = :CAJA AND
        DPCA_NUMERO = :NUMERO AND DPCA_TIPOSAL = 0 AND DPCA_IDSAL = 0 AND DPCA_MONTO = :MONTO;
  ELSE
    begin
    EXECUTE PROCEDURE RESTE_SALDO_EFECTIVO(:CAJA, :FEC, :MONTO, 'N');
    end
  end

/* INCORPORE LOS CAMBIOS DE DOCUMENTOS */
FOR SELECT C.CADO_ID, cado_fecha, cado_conc, pref_pre, cado_numero, caja_id, FOPA_ID, CDEN_BANCO, CDEN_CUENTA, CDEN_NUMERO, CDEN_FECHA, CDEN_MONTO, CDEN_ITEM
    FROM CAMBIO_DOCUMENTOS C, CAMBIODOC_ENTRADAS D where C.CADO_ID = D.CADO_ID and cado_anulado = 'N' AND CAJA_ID >= :cajaini AND CAJA_ID <= :cajafin
    ORDER BY CAJA_ID, C.CADO_FECHA, C.CADO_ID, CDEN_ITEM
    INTO :ID, :Fec, :Conc, :Pref, :Num, :Caja, :forma, :banco, :cuenta, :numero, :fecha, :monto, :item
    DO
    BEGIN
    select COUNT(*) from movimiento_caja where moca_tiporef = 63 and moca_idref = :id and caja_id = :CAJA into :Existe;
    if (Existe > 0) then
        begin
        update movimiento_caja
            set moca_creditos = moca_creditos + :monto
            where moca_tiporef = 63 and moca_idref = :id and caja_id = :CAJA;
        end
    else
        INSERT INTO MOVIMIENTO_CAJA
            (MOCA_ID, CAJA_ID, MOCA_TIPOREF, MOCA_PREFREF, MOCA_NUMREF, MOCA_FECHA, MOCA_CONC, MOCA_DEBITOS, MOCA_CREDITOS, MOCA_DB, MOCA_IDREF)
            VALUES(GEN_ID(ID_MOVCAJA,1), :CAJA, 63, :Pref, :Num, :Fec, :Conc, 0, :monto, 'N', :id);
        
    /* ACTUALICE LA SALIDA DEL DOCUMENTO */
    if (FORMA <> 1) then
        BEGIN
        if (EXISTS(SELECT DPCA_ID FROM DOCUMENTOS_PAGO_CAJA WHERE FOPA_ID = :FORMA AND DPCA_BANCO = :BANCO AND DPCA_CUENTA = :CUENTA AND
            DPCA_NUMERO = :NUMERO AND DPCA_TIPOSAL = 0 AND DPCA_IDSAL = 0 AND DPCA_MONTO = :MONTO AND CAJA_ID = :CAJA)) then
            UPDATE DOCUMENTOS_PAGO_CAJA
                SET DPCA_TIPOSAL = 63, DPCA_IDSAL = :id
                WHERE FOPA_ID = :FORMA AND DPCA_BANCO = :BANCO AND DPCA_CUENTA = :CUENTA AND CAJA_ID = :CAJA AND 
                DPCA_NUMERO = :NUMERO AND DPCA_TIPOSAL = 0 AND DPCA_IDSAL = 0 AND DPCA_MONTO = :MONTO;
        ELSE
            BEGIN
            update cambiodoc_entradas set fopa_id = 1 where CADO_ID = :id and CDEN_ITEM = :item;
            EXECUTE PROCEDURE RESTE_SALDO_EFECTIVO(:CAJA, :FEC, :MONTO, 'N');
            END
        END
    ELSE
        EXECUTE PROCEDURE RESTE_SALDO_EFECTIVO(:CAJA, :FEC, :MONTO, 'N');
    END
end
^

SET TERM ; ^



/* 20100720 */
/* CONTABILICE AL FINAL DEL PERIODO CON EL FACTOR */

INSERT INTO CONFIGURACION (CONF_MODULO, CONF_CATEGORIA, CONF_PROPIEDAD, CONF_VALOR, CONF_POSIBLES, CONF_AYUDA) VALUES ('FACTURACION', 'FACTURAS', 'CONTABILIZAR EN LINEA LAS FACTURAS DE VENTA Y DEVOLUCIONES DE CONTADO', 'SI', 'SI,NO', 'SI: Actualiza la contabilidad con cada factura de contado. NO: Se omite la contabilización, requiere proceso de contabilización en batch posterior');
commit work;

SET TERM ^ ;

CREATE OR ALTER procedure CONTABIL_FACTURAS_CONTADO (
    FECFAC date,
    NIT varchar(20),
    PREF varchar(4),
    PTVTA integer,
    IDINTER integer)
returns (
    ERROR integer,
    VER char(1),
    IDC integer)
AS
declare variable num varchar(8);
declare variable numero varchar(10);
declare variable fecha char(8);
declare variable conc char(120);
declare variable vence char(8);
declare variable vrdto numeric(18,2);
declare variable vradic numeric(18,2);
declare variable vrsubt numeric(18,2);
declare variable vriva numeric(18,2);
declare variable prtfte numeric(9,2);
declare variable vrrtfte numeric(18,2);
declare variable vrrtiva numeric(18,2);
declare variable prtica numeric(9,2);
declare variable vrrtica numeric(18,2);
declare variable vrtotal numeric(18,2);
declare variable vrextra numeric(18,2);
declare variable tipocomp varchar(3);
declare variable prefcont varchar(4);
declare variable ventas char(1);
declare variable ctaventas varchar(20);
declare variable iva char(1);
declare variable ctaiva varchar(20);
declare variable consumo char(1);
declare variable ctaconsumo varchar(20);
declare variable cartera char(1);
declare variable ctacartera varchar(20);
declare variable rtfte char(1);
declare variable ctartfte varchar(20);
declare variable rtiva char(1);
declare variable ctartiva varchar(20);
declare variable rtica char(1);
declare variable ctartica varchar(20);
declare variable inven char(1);
declare variable ctainven varchar(20);
declare variable costos char(1);
declare variable ctacostos varchar(20);
declare variable ctadto varchar(20);
declare variable ctaadic varchar(20);
declare variable ctaextra varchar(20);
declare variable existe char(1);
declare variable cuenta varchar(20);
declare variable monto numeric(18,2);
declare variable tipocuen char(1);
declare variable nombre varchar(60);
declare variable proy varchar(4);
declare variable centro varchar(4);
declare variable porc numeric(5,2);
declare variable porcajus numeric(9,2);
declare variable debito numeric(18,2);
declare variable credito numeric(18,2);
declare variable nroi integer;
declare variable art varchar(15);
declare variable impinc char(1);
declare variable imptos numeric(18,2);
declare variable suma numeric(18,2);
declare variable porciva numeric(9,2);
declare variable tctaclien varchar(20);
declare variable tctaventa varchar(20);
declare variable tctartfte varchar(20);
declare variable tctartiva varchar(20);
declare variable tctartica varchar(20);
declare variable ctadic varchar(20);
declare variable baseadic varchar(20);
declare variable porcadic numeric(5,2);
declare variable valoradic numeric(18,2);
declare variable dbadic char(1);
declare variable ptovta integer;
declare variable dig integer;
declare variable mercancia numeric(18,2);
declare variable factor double precision;
declare variable cent char(1);
declare variable factoraj double precision;
BEGIN
/* BUSQUE LA INTERFACE */
EXISTE = 'N';
SELECT 'S', TICO_COD, PRCO_PRE, INVE_VENTAS, INVE_IVA, INVE_CONSUMO, INVE_CARTERA, INVE_RTFTE, INVE_RTIVA, INVE_RTICA, INVE_COSTO, INVE_INVEN, INVE_CTAVENTAS, INVE_CTAIVA, INVE_CTACONSUMO, INVE_CTADTO, INVE_CTAADIC, INVE_CTAEXTRA, INVE_CTACARTERA, INVE_CTARTFTE, INVE_CTARTIVA, INVE_CTARTICA, INVE_CTAINVEN, INVE_CTACOSTOS, INVE_CONFIRMAR, INVE_CENTRO
    FROM INTERFAZ_VENTAS
    WHERE INVE_ID = :IDINTER
    INTO :EXISTE, :TIPOCOMP, :PREFCONT, :VENTAS, :IVA, :CONSUMO, :CARTERA, :RTFTE, :RTIVA, :RTICA, :COSTOS, :INVEN, :CTAVENTAS, :CTAIVA, :CTACONSUMO, :CTADTO, :CTAADIC, :CTAEXTRA, :CTACARTERA, :CTARTFTE, :CTARTIVA, :CTARTICA, :CTAINVEN, :CTACOSTOS, :VER, :CENT;
if (EXISTE = 'S') then
  BEGIN
  /* BORRE CUALQUEIR CONTABILIZACION PREVIA */
/*  DELETE FROM CONTABILIZACION WHERE CNTB_TIPOREF = 31 AND CNTB_IDREF = 0;
  /* BUSQUE EL CENTRO DEL PUNTO, LA BODEGA, O EL PREFIJO  */
  IF (CENT = 'B') THEN
    SELECT B.BODE_CENTRO, B.BODE_PROY FROM BODEGA B, PUNTO_VENTA P
        WHERE B.BODE_COD = P.BODE_COD AND P.ptvt_id = :ptvta INTO :CENTRO, :PROY;
  IF (CENT = 'V') THEN
    SELECT MAX(V.CENT_COD), MAX(V.PROY_COD) FROM VENDEDORES V
        WHERE V.PTVT_ID = :PTVTA INTO :CENTRO, :PROY;
  IF (CENT = 'P') THEN
    SELECT P.PREF_PROY, P.PREF_CENTRO FROM PREFIJOS P
        WHERE P.PREF_PRE = :PREF AND P.TIDO_COD = 31 INTO :CENTRO, :PROY;
  /* TRAIGA LOS DATOS DEL CLIENTE */
  SELECT TERC_NOM, TERC_CTARTFTE, TERC_CTARTIVA, TERC_CTARTICA, TERC_CTAVENTA, TERC_CTACLIENTE
        FROM TERCEROS T WHERE TERC_NIT = :NIT
        INTO :NOMBRE, TCTARTFTE, TCTARTIVA, TCTARTICA, TCTAVENTA, TCTACLIEN;
  SELECT SUM(FACT_DTOMONTO), SUM(FACT_ADICIONAL), SUM(FACT_IVAMONTO), SUM(FACT_EXTRA), SUM(FACT_TOTAL), SUM(FACT_RTFTEMONTO), SUM(FACT_RTIVAMONTO), SUM(FACT_RTICAMONTO), MAX(FACT_IVAINC)
        FROM FACTURAS F WHERE FACT_FECHA = :FECFAC AND FACT_ANULADO = 'N' AND PTVT_ID = :ptvta AND PREF_PRE = :PREF
        INTO :VRDTO, :VRADIC, :VRIVA, :VREXTRA, :VRTOTAL, :VRRTFTE, :VRRTIVA, :VRRTICA, :impinc;
  VRSUBT = VRTOTAL - VREXTRA - VRIVA; /* BASE DE RETEFTE Y RETEICA */
  MERCANCIA = VRSUBT - VRADIC + VRDTO;
  EXECUTE PROCEDURE FECHA_A_CONTA(:FECFAC) returning_values (:FECHA);
  VENCE = FECHA;
  /* REGISTRE EL ENCABEZADO CONTABLE */
  IDC = GEN_ID(ID_CONTABILIZA, 1);
  CONC = 'RESUMEN VENTAS ' || FECHA;
  NUM = SUBSTR(FECHA, 3, 8);
  INSERT INTO CONTABILIZACION (CNTB_ID, CNTB_TIPOCOMP, CNTB_PREFCNT, CNTB_NUMERO, CNTB_FECHA, CNTB_CONCEPTO, CNTB_REF, CNTB_TIPOREF, CNTB_IDREF, CNTB_PREFREF, CNTB_NUMREF, CNTB_PROCESADO)
        VALUES (:IDC, :TIPOCOMP, :PREFCONT, :NUM, :FECHA, :CONC, '', 0, 0, :PREF, :NUM, 'N');
  NROI = 0;
  SUMA = 0;
  ERROR = 0;
  /* SI NO HAY CUENTA DE DESCUENTO NI ADICIONAL CALCULE UN FACTOR PARA LAS VENTAS Y EL IVA */
  if (MERCANCIA <> 0) then
    FACTOR = CAST(VRSUBT AS DOUBLE PRECISION) / CAST(MERCANCIA AS DOUBLE PRECISION);
  ELSE
    FACTOR = 1;
  /* TRAIGA EL NUMERO DE DIGITOS PARA EL REDONDEO */
  SELECT CAST(CONF_VALOR AS INTEGER) FROM CONFIGURACION WHERE CONF_MODULO = 'FACTURACION' AND
        CONF_CATEGORIA = 'GENERAL' AND CONF_PROPIEDAD = 'REDONDEO AL MULTIPLO DE DIEZ EN TOTALES' INTO :DIG;
  /* CUENTAS DE VENTAS */
  if (VENTAS = 'A') then
        BEGIN
        FOR SELECT MAX(COAR_CTAVNT), SUM(CAST(FADE_CANT AS DOUBLE PRECISION) * (FADE_PRUNIT-FADE_DTOMONTO)), SUM(FADE_IVAMONTO+FADE_CONSUMO), MAX(TAIV_PORC)
            FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_DETALLE FD, FACTURAS F, tarifa_iva T
            WHERE F.FACT_ID = FD.FACT_ID AND FACT_FECHA = :FECFAC AND FD.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND A.taiv_cod = T.taiv_cod AND 
            F.PREF_PRE = :PREF AND F.PTVT_ID = :PTVTA AND FACT_ANULADO = 'N' AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
            GROUP BY COAR_CTAVNT, T.taiv_porc
            INTO :CTAVENTAS, :MONTO, :IMPTOS, :porcajus
            DO
            BEGIN
            if (IMPINC = 'S') then
                MONTO = MONTO - IMPTOS;
            factoraj = null;
            SELECT AJCI_FACTOR FROM AJUSTE_CIERRE
                WHERE AJCI_PORC = :porcajus AND AJCI_FECINI <= :fecfac AND AJCI_FECFIN >= :fecfac
                INTO :factoraj;
            if (factoraj is not null) then
                MONTO = MONTO * factoraj;

            if ((CTADTO IS NULL) OR (CTADTO = '')) then
                MONTO = MONTO * FACTOR;
            execute procedure redondee(MONTO, DIG) returning_values (MONTO);
            if (MONTO <> 0) then
                BEGIN
                CUENTA = NULL;
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :CTAVENTAS INTO :CUENTA, :TIPOCUEN;
                if (CUENTA IS NULL) then
                    begin
                    EXECUTE PROCEDURE ERROR (31, 0, :CTAVENTAS, 2);
                    CUENTA = CTAVENTAS;
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT FD.ARTI_COD, (CAST(FADE_CANT AS DOUBLE PRECISION) * (FADE_PRUNIT-FADE_DTOMONTO)), (FADE_IVAMONTO+FADE_CONSUMO)
                        FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_DETALLE FD, FACTURAS F
                        WHERE F.FACT_ID = FD.FACT_ID AND FACT_FECHA = :FECFAC AND F.PREF_PRE = :PREF AND F.PTVT_ID = :PTVTA AND FD.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTAINV = :CUENTA AND FACT_ANULADO = 'N' AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
                        INTO :ART, :MONTO, :IMPTOS
                    DO
                        BEGIN
                        if (IMPINC = 'S') then
                            MONTO = MONTO - IMPTOS;
                        if ((CTADTO IS NULL) OR (CTADTO = '')) then
                            MONTO = MONTO * FACTOR;
                        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                        if (MONTO <> 0) then
                            BEGIN
                            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                            NROI = NROI + 1;
                            SUMA = SUMA - MONTO;
                            END
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    NROI = NROI + 1;
                    SUMA = SUMA - MONTO;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA - MONTO;
                    END
                END /* MONTO <> 0 */
            END /* FOR */
        END /* VENTAS X ARTICULO */
     IF ((VENTAS = 'C') OR (VENTAS = 'K')) THEN
        BEGIN
        IF (VENTAS = 'C') THEN
            CTAVENTAS = TCTAVENTA;
        SELECT SUM(CAST(FADE_CANT AS DOUBLE PRECISION) * (FADE_PRUNIT-FADE_DTOMONTO)), SUM(FADE_IVAMONTO+FADE_CONSUMO)
            FROM FACTURAS_DETALLE FD, FACTURAS F
            WHERE F.FACT_ID = FD.FACT_ID AND FACT_FECHA = :FECFAC AND F.PREF_PRE = :PREF AND F.PTVT_ID = :PTVTA AND FACT_ANULADO = 'N' AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
            INTO :MONTO, :IMPTOS;
        if (IMPINC = 'S') then
            MONTO = MONTO - IMPTOS;
        if ((CTADTO IS NULL) OR (CTADTO = '')) then
            MONTO = MONTO * FACTOR;
        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
        if (MONTO <> 0) then
            BEGIN
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTAVENTAS INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERROR (31, 0, :CTAVENTAS, 2);
                CUENTA = CTAVENTAS;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT FD.ARTI_COD, (CAST(FADE_CANT AS DOUBLE PRECISION) * (FADE_PRUNIT-FADE_DTOMONTO)), (FADE_IVAMONTO+FADE_CONSUMO)
                    FROM /*ARTICULO A,*/ FACTURAS_DETALLE FD, FACTURAS F
                    WHERE F.FACT_ID = FD.FACT_ID AND FACT_FECHA = :FECFAC AND F.PREF_PRE = :PREF AND F.PTVT_ID = :PTVTA AND FACT_ANULADO = 'N' AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
                    INTO :ART, :MONTO, :IMPTOS
                    DO
                    BEGIN
                    if (IMPINC = 'S') then
                        MONTO = MONTO - IMPTOS;
                    if ((CTADTO IS NULL) OR (CTADTO = '')) then
                        MONTO = MONTO * FACTOR;
                    execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                    if (MONTO <> 0) then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        SUMA = SUMA - MONTO;
                        END
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - MONTO;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - MONTO;
                END
            END /* MONTO <> 0 */
        END /* VENTAS DE CLIENTE O CONSTANTE */
    /* EL IVA EN VENTAS */
    if (IVA = 'A') then
        BEGIN
        FOR SELECT MAX(COAR_CTAIVAV), SUM(FADE_IVAMONTO), SUM(CAST(FADE_CANT AS DOUBLE PRECISION) * (FADE_PRUNIT-FADE_DTOMONTO)), sum(FADE_CONSUMO), MAX(TAIV_PORC)
            FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_DETALLE FD, FACTURAS F, TARIFA_IVA T
            WHERE F.FACT_ID = FD.FACT_ID AND FACT_FECHA = :FECFAC AND F.PREF_PRE = :PREF AND F.PTVT_ID = :PTVTA AND A.taiv_cod = T.taiv_cod AND
            FD.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND FACT_ANULADO = 'N' AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
            GROUP BY COAR_CTAIVAV, T.taiv_porc
            INTO :CTAIVA, :IMPTOS, :MONTO, :VALORADIC, :porcajus
        DO
            BEGIN
            if (IMPINC = 'S') then
                MONTO = MONTO - IMPTOS - VALORADIC;
            MONTO = MONTO * -1;

            factoraj = null;
            SELECT AJCI_FACTOR FROM AJUSTE_CIERRE
                WHERE AJCI_PORC = :porcajus AND AJCI_FECINI <= :fecfac AND AJCI_FECFIN >= :fecfac
                INTO :factoraj;
            if (factoraj is not null) then
                BEGIN
                MONTO = MONTO * factoraj;
                IMPTOS = IMPTOS * factoraj;
                END

            MONTO = MONTO * FACTOR;
            IMPTOS = IMPTOS * FACTOR;
            execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
            execute procedure redondee(MONTO, DIG) returning_values (MONTO);
            if (IMPTOS <> 0) then
                BEGIN
                CUENTA = NULL;
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :CTAIVA INTO :CUENTA, :TIPOCUEN;
                if (CUENTA IS NULL) then
                    begin
                    EXECUTE PROCEDURE ERROR (31, 0, :CTAIVA, 2);
                    CUENTA = CTAIVA;
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT FD.ARTI_COD, FADE_IVAMONTO, (CAST(FADE_CANT AS DOUBLE PRECISION) * (FADE_PRUNIT-FADE_DTOMONTO)), TAIV_PORC, FADE_CONSUMO
                        FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_DETALLE FD, FACTURAS F, TARIFA_IVA T
                        WHERE F.FACT_ID = FD.FACT_ID AND FACT_FECHA = :FECFAC AND F.PREF_PRE = :PREF AND F.PTVT_ID = :PTVTA AND FD.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTAIVAV = :CUENTA AND A.TAIV_COD = T.TAIV_COD AND FACT_ANULADO = 'N' AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
                        INTO :ART, :IMPTOS, :MONTO, :PORCIVA, :VALORADIC
                    DO
                        BEGIN
                        if (IMPINC = 'S') then
                            MONTO = MONTO - IMPTOS - VALORADIC;
                        MONTO = MONTO * -1;
                        MONTO = MONTO * FACTOR;
                        IMPTOS = IMPTOS * FACTOR;
                        execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                        if (IMPTOS <> 0) then
                            BEGIN
                            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, :MONTO, :PORCIVA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                            NROI = NROI + 1;
                            SUMA = SUMA + DEBITO - CREDITO;
                            END
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, :MONTO, ABS(:IMPTOS*100/:MONTO), :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    NROI = NROI + 1;
                    SUMA = SUMA - IMPTOS;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, :MONTO, ABS(:IMPTOS*100/:MONTO), :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA - IMPTOS;
                    END
                END   /* IMPTOS <> 0 */
            END /* FOR */
        END /* IVA X ARTICULO */
    if (IVA = 'K') then /* IVA EN CTA CONSTANTE */
        BEGIN
        SELECT SUM(FADE_IVAMONTO), SUM(CAST(FADE_CANT AS DOUBLE PRECISION) * (FADE_PRUNIT-FADE_DTOMONTO)), SUM(FADE_CONSUMO)
            FROM FACTURAS_DETALLE FD, FACTURAS F
            WHERE F.FACT_ID = FD.FACT_ID AND FACT_FECHA = :FECFAC AND F.PREF_PRE = :PREF AND F.PTVT_ID = :PTVTA AND FACT_ANULADO = 'N' AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
            INTO :IMPTOS, :MONTO, :valoradic;
        if (IMPINC = 'S') then
            MONTO = MONTO - IMPTOS - VALORADIC;
        MONTO = MONTO * -1;
        MONTO = MONTO * FACTOR;
        IMPTOS = IMPTOS * FACTOR;
        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
        execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
        if (IMPTOS <> 0) then
            BEGIN
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTAIVA INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERROR (31, 0, :CTAIVA, 2);
                CUENTA = CTAIVA;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT FD.ARTI_COD, (CAST(FADE_CANT AS DOUBLE PRECISION) * (FADE_PRUNIT-FADE_DTOMONTO)), FADE_IVAMONTO, TAIV_PORC, FADE_CONSUMO
                    FROM ARTICULO A, FACTURAS_DETALLE FD, FACTURAS F, TARIFA_IVA T
                    WHERE F.FACT_ID = FD.FACT_ID AND FACT_FECHA = :FECFAC AND F.PREF_PRE = :PREF AND F.PTVT_ID = :PTVTA AND FD.arti_cod = A.arti_cod AND T.TAIV_COD=A.TAIV_COD AND FACT_ANULADO = 'N' AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
                    INTO :ART, :MONTO, :IMPTOS, :PORCIVA, :VALORADIC
                    DO
                    BEGIN
                    if (IMPINC = 'S') then
                        MONTO = MONTO - IMPTOS - VALORADIC;
                    MONTO = MONTO * -1;
                    MONTO = MONTO * FACTOR;
                    IMPTOS = IMPTOS * FACTOR;
                    execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                    execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                    if (IMPTOS <> 0) then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', 0, :IMPTOS, :MONTO, :PORCIVA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        SUMA = SUMA - IMPTOS;
                        END
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', 0, :IMPTOS, :MONTO, ABS(:IMPTOS*100/:MONTO), :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - IMPTOS;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', 0, :IMPTOS, :MONTO, ABS(:IMPTOS*100/:MONTO), :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - IMPTOS;
                END
            END /* IMPTOS <> 0 */
        END /* IVA EN CTA CONSTANTE */
    /* EL IMPOCONSUMO */
    if (CONSUMO = 'A') then
        BEGIN
        FOR SELECT MAX(COAR_CTACONS), SUM(FADE_CONSUMO)
            FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_DETALLE FD, FACTURAS F
            WHERE F.FACT_ID = FD.FACT_ID AND FACT_FECHA = :FECFAC AND F.PREF_PRE = :PREF AND F.PTVT_ID = :PTVTA AND FD.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND FACT_ANULADO = 'N' AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
            GROUP BY COAR_CTACONS
            INTO :CTACONSUMO, :IMPTOS
        DO
            BEGIN
            execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
            if (IMPTOS <> 0) then
                BEGIN
                CUENTA = NULL;
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :CTACONSUMO INTO :CUENTA, :TIPOCUEN;
                if (CUENTA IS NULL) then
                    begin
                    EXECUTE PROCEDURE ERROR (31, 0, :CTACONSUMO, 2);
                    CUENTA = CTACONSUMO;
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, REGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT FD.ARTI_COD, FADE_CONSUMO
                        FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_DETALLE FD, FACTURAS F
                        WHERE F.FACT_ID = FD.FACT_ID AND FACT_FECHA = :FECFAC AND F.PREF_PRE = :PREF AND F.PTVT_ID = :PTVTA AND FD.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTACONS = :CUENTA AND FACT_ANULADO = 'N' AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
                        INTO :ART, :IMPTOS
                    DO
                        BEGIN
                        execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                        if (IMPTOS <> 0) then
                            BEGIN
                            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                            NROI = NROI + 1;
                            SUMA = SUMA - IMPTOS;
                            END
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    NROI = NROI + 1;
                    SUMA = SUMA - IMPTOS;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA - CREDITO;
                    END
                END /* IMPTOS <> 0 */
            END /* FOR */
        END /* CONSUMO X ARTICULO */
    if (CONSUMO = 'K') then /* CONSUMO EN CTA CONSTANTE */
        BEGIN
        SELECT SUM(FADE_CONSUMO)
            FROM FACTURAS_DETALLE FD, FACTURAS F
            WHERE F.FACT_ID = FD.FACT_ID AND FACT_FECHA = :FECFAC AND F.PREF_PRE = :PREF AND F.PTVT_ID = :PTVTA AND FACT_ANULADO = 'N' AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
            INTO :IMPTOS;
        execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
        if (IMPTOS <> 0) then
            BEGIN
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTACONSUMO INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERROR (31, 0, :CTACONSUMO, 2);
                CUENTA = CTACONSUMO;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT FD.ARTI_COD, FADE_CONSUMO
                    FROM /*ARTICULO A,*/ FACTURAS_DETALLE FD, FACTURAS F
                    WHERE F.FACT_ID = FD.FACT_ID AND FACT_FECHA = :FECFAC AND F.PREF_PRE = :PREF AND F.PTVT_ID = :PTVTA AND FACT_ANULADO = 'N' AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
                    INTO :ART, :IMPTOS
                    DO
                    BEGIN
                    execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                    if (IMPTOS <> 0) then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CTACONSUMO, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        SUMA = SUMA - IMPTOS;
                        END
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTACONSUMO, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - IMPTOS;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTACONSUMO, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - IMPTOS;
                END
            END /* IMPTOS <> 0 */
        END /* CONSUMO EN CTA CONSTANTE */
    /* DESCUENTO */
    if ((CTADTO IS NOT NULL) AND (CTADTO <> '')) then
        BEGIN
        execute procedure redondee(VRDTO, DIG) returning_values (VRDTO);
        if (VRDTO <> 0) then
            BEGIN
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTADTO INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERROR (31, 0, :CTADTO, 2);
                CUENTA = CTADTO;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                begin
                EXECUTE PROCEDURE ERROR (31, 0, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRDTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA + VRDTO;
                END
            if (TIPOCUEN = 'N') then
                    BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRDTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA + VRDTO;
                END
            END
        END /* DESCUENTO */
    /* VALOR ADIC */
    if ((CTAADIC IS NOT NULL) AND (CTAADIC <> '')) then
        BEGIN
        execute procedure redondee(VRADIC, DIG) returning_values (VRADIC);
        if (VRADIC <> 0) THEN
            BEGIN
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTAADIC INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERROR (31, 0, :CTAADIC, 2);
                CUENTA = CTAADIC;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                begin
                EXECUTE PROCEDURE ERROR (31, 0, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRADIC, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - VRADIC;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRADIC, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - VRADIC;
                END
            END
        END /* VR. ADIC */
    /* VALOR EXTRA */
    if ((CTAEXTRA IS NOT NULL) AND (CTAEXTRA <> '')) THEN
        BEGIN
        execute procedure redondee(VREXTRA, DIG) returning_values (VREXTRA);
        if (VREXTRA <> 0) THEN
            BEGIN
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTAEXTRA INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERROR (31, 0, :CTAEXTRA, 2);
                CUENTA = CTAEXTRA;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                begin
                EXECUTE PROCEDURE ERROR (31, 0, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VREXTRA, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - VREXTRA;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VREXTRA, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - VREXTRA;
                END
            END
        END /* VR. EXTRA */
    /* RETENCION FUENTE */
    if ((RTFTE = 'C') or (RTFTE = 'K')) then
      BEGIN
      execute procedure redondee(VRRTFTE, DIG) returning_values (VRRTFTE);
      if (VRRTFTE <> 0) then
        BEGIN
        if (RTFTE = 'C') then
            CTARTFTE = TCTARTFTE;
        CUENTA = NULL;
        SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
            WHERE CUEN_COD = :CTARTFTE INTO :CUENTA, :TIPOCUEN;
        if (CUENTA IS NULL) then
            begin
            EXECUTE PROCEDURE ERROR (31, 0, :CTARTFTE, 2);
            CUENTA = CTARTFTE;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            begin
            EXECUTE PROCEDURE ERROR (31, 0, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :VRSUBT, :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTFTE;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :VRSUBT, :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTFTE;
            END
        END /* RTFTE */
      END
    /* RETENCION IVA */
    if ((RTIVA = 'C') or (RTIVA = 'K')) then
      BEGIN
      execute procedure redondee(VRRTIVA, DIG) returning_values (VRRTIVA);
      if (VRRTIVA <> 0) then
        BEGIN
        if (RTIVA = 'C') then
            CTARTIVA = TCTARTIVA;
        CUENTA = NULL;
        SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
            WHERE CUEN_COD = :CTARTIVA INTO :CUENTA, :TIPOCUEN;
        if (CUENTA IS NULL) then
            begin
            EXECUTE PROCEDURE ERROR (31, 0, :CTARTIVA, 2);
            CUENTA = CTARTIVA;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            begin
            EXECUTE PROCEDURE ERROR (31, 0, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTIVA, 0, :VRIVA, :PORC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTIVA;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTIVA, 0, :VRIVA, :PORC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTIVA;
            END
        END /* RTIVA */
      END
    /* RETENCION DE ICA */
    if ((RTICA = 'C') or (RTICA = 'K')) then
      BEGIN
      execute procedure redondee(VRRTICA, DIG) returning_values (VRRTICA);
      if (VRRTICA <> 0) then
        BEGIN
        if (RTICA = 'C') then
            CTARTICA = TCTARTICA;
        CUENTA = NULL;
        SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
            WHERE CUEN_COD = :CTARTICA INTO :CUENTA, :TIPOCUEN;
        if (CUENTA IS NULL) then
            begin
            EXECUTE PROCEDURE ERROR (31, 0, :CTARTICA, 2);
            CUENTA = CTARTICA;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            begin
            EXECUTE PROCEDURE ERROR (31, 0, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTICA, 0, :VRSUBT, :PRTICA, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTICA;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTICA, 0, :VRSUBT, :PRTICA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTICA;
            END
        END /* RTICA */
      END
    /* CIERRE EL COMPROBANTE CONTRA LA CUENTA DEL TERCERO O LA CONSTANTE */
    if ((SUMA <> 0) and ((CARTERA = 'C') or (CARTERA = 'K') or (CARTERA = 'J'))) then
        BEGIN
        if (SUMA < 0) then
            BEGIN
            DEBITO = SUMA * -1;
            CREDITO = 0;
            END
        ELSE
            BEGIN
            DEBITO = 0;
            CREDITO = SUMA;
            END
        if (CARTERA = 'C') then
            CTACARTERA = TCTACLIEN;
        if (CARTERA = 'J') then
            BEGIN
            /* BUSQUE LA CUENTA DE LA CAJA */
            SELECT CAJA_CUENTA FROM CAJAS C, PUNTO_VENTA P
                WHERE P.CAJA_ID = C.CAJA_ID AND PTVT_ID = :PTOVTA
                INTO :CTACARTERA;
            END
        CUENTA = NULL;
        SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
            WHERE CUEN_COD = :CTACARTERA INTO :CUENTA, :TIPOCUEN;
        if (CUENTA IS NULL) then
            begin
            EXECUTE PROCEDURE ERROR (31, 0, :CTACARTERA, 2);
            CUENTA = CTACARTERA;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            begin
            EXECUTE PROCEDURE ERROR (31, 0, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'C') then
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :DEBITO, :CREDITO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
        if (TIPOCUEN = 'N') then
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :DEBITO, :CREDITO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
        NROI = NROI + 1;
        END /* SUMA EN CARTERA */
    /* CALCULE LOS COSTOS */
    EXECUTE PROCEDURE costo_en_ventas_contado(:fecfac,  :pref, :ptvta);
    if (COSTOS = 'A') then
        BEGIN
        FOR SELECT MAX(CTACOS), SUM(COSTO)
            FROM COSTO_VENTAS WHERE TIDO_COD = 31 AND COVE_ID = 0
            GROUP BY CTACOS
            INTO :CTACOSTOS, :MONTO
        DO
            BEGIN
            if (MONTO <> 0) then
                BEGIN
                CUENTA = NULL;
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :CTACOSTOS INTO :CUENTA, :TIPOCUEN;
                IF (CUENTA IS NULL) THEN
                    begin
                    EXECUTE PROCEDURE ERROR (31, 0, :CTACOSTOS, 2);
                    CUENTA = CTARTFTE;
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT ARTI_COD, CANT * COSTO
                        FROM COSTO_VENTAS WHERE TIDO_COD = 31 AND COVE_ID = 0 AND CTACOS = :CUENTA
                        INTO :ART, :MONTO
                    DO
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    NROI = NROI + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    END
                END /* MONTO <> 0 */
            END /* FOR */
        END /* COSTOS */
    if (COSTOS = 'K') then
        BEGIN
        SELECT SUM(COSTO)
            FROM COSTO_VENTAS  WHERE TIDO_COD = 31 AND COVE_ID = 0
            INTO :MONTO;
        if (MONTO <> 0) then
            BEGIN
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTACOSTOS INTO :CUENTA, :TIPOCUEN;
            IF (CUENTA IS NULL) THEN
                begin
                EXECUTE PROCEDURE ERROR (31, 0, :CTACOSTOS, 2);
                CUENTA = CTARTFTE;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, REGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT ARTI_COD, CANT * COSTO
                    FROM COSTO_VENTAS WHERE TIDO_COD = 31 AND COVE_ID = 0
                    INTO :ART, :MONTO
                DO
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTACOSTOS, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                    NROI = NROI + 1;
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTACOSTOS, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTACOSTOS, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                END
            END /* MONTO <> 0 */
        END /* COSTOS = K */
    if (INVEN = 'A') then
        BEGIN
        FOR SELECT MAX(CTAINV), SUM(COSTO)
            FROM COSTO_VENTAS  WHERE TIDO_COD = 31 AND COVE_ID = 0
            GROUP BY CTAINV
            INTO :CTAINVEN, :MONTO
        DO
            BEGIN
            if (MONTO <> 0) then
                BEGIN
                CUENTA = NULL;
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :CTAINVEN INTO :CUENTA, :TIPOCUEN;
                IF (CUENTA IS NULL) THEN
                    begin
                    EXECUTE PROCEDURE ERROR (31, 0, :CTAINVEN, 2);
                    CUENTA = CTAINVEN;
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, REGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT ARTI_COD, CANT * COSTO
                        FROM COSTO_VENTAS WHERE TIDO_COD = 31 AND COVE_ID = 0 AND CTAINV = :CUENTA
                        INTO :ART, :MONTO
                    DO
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    NROI = NROI + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    END
                END /* MONTO <> 0 */
            END /* FOR */
        END /* INVEN = A */
    if (INVEN = 'K') then
        BEGIN
        SELECT SUM(COSTO)
            FROM COSTO_VENTAS WHERE TIDO_COD = 31 AND COVE_ID = 0
            INTO :MONTO;
        if (MONTO <> 0) then
            BEGIN
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTAINVEN INTO :CUENTA, :TIPOCUEN;
            IF (CUENTA IS NULL) THEN
                begin
                EXECUTE PROCEDURE ERROR (31, 0, :CTAINVEN, 2);
                CUENTA = CTAINVEN;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT ARTI_COD, CANT * COSTO
                    FROM COSTO_VENTAS  WHERE TIDO_COD = 31 AND COVE_ID = 0
                    INTO :ART, :MONTO
                DO
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTAINVEN, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                    NROI = NROI + 1;
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAINVEN, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAINVEN, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                END
            END /* MONTO <> 0 */
        END /* INVEN = K */
    /* recorra las cuentas adicionales */
    FOR SELECT INVC_CUENTA, INVC_BASE, INVC_PORC, INVC_VALOR, INVC_DB
        FROM INTERFAZ_VENTAS_CTAS
        WHERE INVE_ID = :IDINTER
        INTO :CTADIC, :BASEADIC, :PORCADIC, :VALORADIC, :DBADIC
        DO
        BEGIN
        if (VALORADIC <> 0) then
            MONTO = VALORADIC;
        ELSE
            BEGIN
            if (:BASEADIC = 'SUBTOTAL') then
                VALORADIC = vrsubt;
            if (:BASEADIC = 'DESCUENTO') then
                VALORADIC = VRDTO;
            if (:BASEADIC = 'IVA') then
                VALORADIC = VRIVA;
            if (:BASEADIC = 'ADICIONAL') then
                VALORADIC = VRADIC;
            if (:BASEADIC = 'EXTRA') then
                VALORADIC = VREXTRA;
            if (:BASEADIC = 'TOTAL') then
                VALORADIC = VRTOTAL;
            MONTO = VALORADIC * PORCADIC / 100;
            END
        if (MONTO <> 0) then
            BEGIN
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTADIC INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERROR (31, 0, :CTADIC, 2);
                CUENTA = CTADIC;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                begin
                EXECUTE PROCEDURE ERROR (31, 0, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'C') then
                BEGIN
                if (DBADIC = 'S') then
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                ELSE
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                if (DBADIC = 'S') then
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                ELSE
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                END
            NROI = NROI + 1;
            END
        END
    if (ERROR > 0) then
        VER = 'S';
    SUSPEND;
    END /* EXISTE LA INTERFAZ */
ELSE
    BEGIN
    EXECUTE PROCEDURE ERROR (31, 0, :PREF, 1);
    ERROR = ERROR + 1;
    VER = 'S';
    SUSPEND;
    END
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE CONTADO_MVERDE(
    FECINI DATE,
    FECFIN DATE,
    PREF VARCHAR(4))
RETURNS (
    FECHA DATE,
    PUNTO INTEGER,
    IDC INTEGER,
    ERROR INTEGER,
    VER CHAR(1))
AS
declare variable IDIN INTEGER;
declare variable IDF INTEGER;
declare variable NIT VARCHAR(20);
begin
FECHA = FECINI;
SELECT MAX(INVE_ID) FROM INTERFAZ_VENTAS WHERE TIDO_COD = 31 AND PREF_PRE = :PREF INTO :IDIN;
WHILE (FECHA <= fecfin) DO
    BEGIN
    /* LAS DE CONTADO */
    FOR SELECT PTVT_ID, TERC_NIT FROM punto_venta ORDER BY PTVT_ID INTO :PUNTO, :NIT
        do
        BEGIN
        EXECUTE PROCEDURE contabil_facturas_contado (FECHA, NIT, PREF, PUNTO, IDIN) returning_values (ERROR,  VER, IDC);
        EXECUTE PROCEDURE contabiliza_pendiente (IDC);
        suspend;
        END
    /* LAS DE CREDITO */
    FOR SELECT FACT_ID, PTVT_ID FROM facturas F WHERE fact_fecha = :fecha and pref_pre = :pref and
        NOT exists (select terc_nit from punto_venta p where terc_nit = f.terc_nit) into : IDF, :PUNTO
        DO
        BEGIN
        if (NOT EXISTS (SELECT ENCO_CONSEC FROM comprobante_encabezado WHERE ENCO_TIPOREF = 31 AND ENCO_IDREF = :IDF)) then
            BEGIN
            EXECUTE PROCEDURE contabil_factura(idf,  IDIN) returning_values (ERROR, VER, IDC);
            EXECUTE PROCEDURE contabiliza_pendiente (IDC);
            suspend;
            END
        END
    FECHA = FECHA + 1;
    END
end

^

SET TERM ; ^

SET TERM ^ ;

create or alter procedure CONTABIL_FACTURA_FACTOR (
    IDDOC integer,
    IDINTER integer)
returns (
    ERROR integer,
    VER char(1),
    IDC integer)
AS
declare variable pref varchar(4);
declare variable num varchar(6);
declare variable numero varchar(10);
declare variable fecaux date;
declare variable fecha char(8);
declare variable conc varchar(60);
declare variable venceaux date;
declare variable vence char(8);
declare variable vrdto numeric(18,2);
declare variable vradic numeric(18,2);
declare variable vrsubt numeric(18,2);
declare variable vriva numeric(18,2);
declare variable prtfte numeric(9,2);
declare variable vrrtfte numeric(18,2);
declare variable vrrtiva numeric(18,2);
declare variable prtica numeric(9,2);
declare variable vrrtica numeric(18,2);
declare variable vrtotal numeric(18,2);
declare variable vrextra numeric(18,2);
declare variable tipocomp varchar(3);
declare variable prefcont varchar(4);
declare variable ventas char(1);
declare variable ctaventas varchar(20);
declare variable iva char(1);
declare variable ctaiva varchar(20);
declare variable consumo char(1);
declare variable ctaconsumo varchar(20);
declare variable cartera char(1);
declare variable ctacartera varchar(20);
declare variable rtfte char(1);
declare variable ctartfte varchar(20);
declare variable rtiva char(1);
declare variable ctartiva varchar(20);
declare variable rtica char(1);
declare variable ctartica varchar(20);
declare variable inven char(1);
declare variable ctainven varchar(20);
declare variable costos char(1);
declare variable ctacostos varchar(20);
declare variable ctadto varchar(20);
declare variable ctaadic varchar(20);
declare variable ctaextra varchar(20);
declare variable existe char(1);
declare variable cuenta varchar(20);
declare variable monto numeric(18,2);
declare variable tipocuen char(1);
declare variable nit varchar(20);
declare variable nombre varchar(60);
declare variable proy varchar(4);
declare variable centro varchar(4);
declare variable proyi varchar(4);
declare variable centi varchar(4);
declare variable porc numeric(5,2);
declare variable debito numeric(18,2);
declare variable credito numeric(18,2);
declare variable nroi integer;
declare variable art varchar(15);
declare variable imptos numeric(18,2);
declare variable suma numeric(18,2);
declare variable porciva numeric(9,2);
declare variable tctaclien varchar(20);
declare variable tctaventa varchar(20);
declare variable tctartfte varchar(20);
declare variable tctartiva varchar(20);
declare variable tctartica varchar(20);
declare variable ctadic varchar(20);
declare variable baseadic varchar(20);
declare variable porcadic numeric(5,2);
declare variable valoradic numeric(18,2);
declare variable dbadic char(1);
declare variable ptovta integer;
declare variable anulado char(1);
declare variable dig integer;
declare variable mercancia numeric(18,2);
declare variable fomento varchar(2);
declare variable DTOXIT varchar(2);
declare variable vrconsumo numeric(18,2);
declare variable factor double precision;
declare variable cent char(1);
declare variable AUTORET VARCHAR(10);
declare variable FAUTORET DATE;
declare variable ERRORC INTEGER;
declare variable ICOING CHAR(2);
declare variable porcajus numeric(9,2);
declare variable factoraj double precision;
BEGIN
EXECUTE PROCEDURE LEE_CONFIGURACION('COMPRAS', 'FACTURAS', 'USAR IMPOCONSUMO COMO PORCENTAJE DE FOMENTO') returning_values (FOMENTO);
EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION', 'ARTICULOS', 'IMPOCONSUMO COMO MAYOR VALOR DEL COSTO Y DEL INGRESO') returning_values (ICOING);
EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'FECHA AUTORETENEDOR NO DESCONTAR RETENCIONES DEL SALDO PERO SI CONTABILIZARLAS') returning_values (AUTORET);
if (AUTORET <> '') then
    FAUTORET = CAST(AUTORET AS DATE);
else
    FAUTORET = '9999/12/31';
/* BUSQUE LA INTERFACE */
EXISTE = 'N';
SELECT 'S', TICO_COD, PRCO_PRE, INVE_VENTAS, INVE_IVA, INVE_CONSUMO, INVE_CARTERA, INVE_RTFTE, INVE_RTIVA, INVE_RTICA, INVE_COSTO, INVE_INVEN, INVE_CTAVENTAS, INVE_CTAIVA, INVE_CTACONSUMO, INVE_CTADTO, INVE_CTAADIC, INVE_CTAEXTRA, INVE_CTACARTERA, INVE_CTARTFTE, INVE_CTARTIVA, INVE_CTARTICA, INVE_CTAINVEN, INVE_CTACOSTOS, INVE_CONFIRMAR, INVE_CENTRO
    FROM INTERFAZ_VENTAS
    WHERE INVE_ID = :IDINTER
    INTO :EXISTE, :TIPOCOMP, :PREFCONT, :VENTAS, :IVA, :CONSUMO, :CARTERA, :RTFTE, :RTIVA, :RTICA, :COSTOS, :INVEN, :CTAVENTAS, :CTAIVA, :CTACONSUMO, :CTADTO, :CTAADIC, :CTAEXTRA, :CTACARTERA, :CTARTFTE, :CTARTIVA, :CTARTICA, :CTAINVEN, :CTACOSTOS, :VER, :CENT;
if (EXISTE = 'S') then
  BEGIN
    /* BORRE CUALQUEIR CONTABILIZACION PREVIA */
    DELETE FROM CONTABILIZACION WHERE CNTB_TIPOREF = 31 AND CNTB_IDREF = :IDDOC;

  /* TRAIGA EL ENCABEZADO DE LA FACTURA */
  SELECT PREF_PRE, FACT_NUMERO, FACT_FECHA, F.TERC_NIT, PTVT_ID, FACT_VENCE, FACT_DTOMONTO, FACT_ADICIONAL, FACT_IVAMONTO, FACT_EXTRA, FACT_TOTAL, FACT_RTFTEPOR, FACT_RTFTEMONTO, FACT_RTIVAPOR, FACT_RTIVAMONTO, FACT_RTICAPOR, FACT_RTICAMONTO, FACT_NOMCLIENTE, TERC_CTARTFTE, TERC_CTARTIVA, TERC_CTARTICA, TERC_CTAVENTA, TERC_CTACLIENTE, FACT_ANULADO
        FROM FACTURAS F, TERCEROS T
        WHERE FACT_ID = :IDDOC AND F.TERC_NIT = T.TERC_NIT
        INTO :PREF, :NUM, :FECAUX, :NIT, :PTOVTA, :VENCEAUX, :VRDTO, :VRADIC, :VRIVA, :VREXTRA, :VRTOTAL, :PRTFTE, :VRRTFTE, :PORC, :VRRTIVA, :PRTICA, :VRRTICA, :NOMBRE, TCTARTFTE, TCTARTIVA, TCTARTICA, TCTAVENTA, TCTACLIEN, ANULADO;
  if (ANULADO = 'N') then
    BEGIN
    /* BUSQUE EL CENTRO DEL PUNTO, LA BODEGA, O EL PREFIJO  */
    IF (CENT = 'B') THEN
        SELECT B.BODE_CENTRO, B.BODE_PROY FROM BODEGA B, FACTURAS F
            WHERE B.BODE_COD = F.BODE_COD AND F.FACT_ID = :IDDOC INTO :CENTRO, :PROY;
    IF (CENT = 'V') THEN
        SELECT V.CENT_COD, V.PROY_COD FROM VENDEDORES V, FACTURAS F
            WHERE V.VEND_COD = F.VEND_COD AND F.FACT_ID = :IDDOC INTO :CENTRO, :PROY;
    IF (CENT = 'P') THEN
        SELECT P.PREF_CENTRO,P.PREF_PROY  FROM PREFIJOS P, FACTURAS F
            WHERE P.PREF_PRE = F.PREF_PRE AND F.FACT_ID = :IDDOC AND P.TIDO_COD = 31 INTO :CENTRO, :PROY;
    NUMERO = PREF || NUM;
    SELECT SUM (FADE_CONSUMO) FROM FACTURAS_DETALLE WHERE FACT_ID = :IDDOC  AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
        INTO MERCANCIA;
    VRSUBT = VRTOTAL - VREXTRA - VRIVA - MERCANCIA; /* BASE DE RETEFTE Y RETEICA */

    EXECUTE PROCEDURE lee_configuracion ('FACTURACION', 'FACTURAS', 'DESCUENTO PIE FACTURA IGUAL A SUMA DE DESCUENTOS POR ITEM') returning_values (:DTOXIT);
    if (DTOXIT = 'SI') then
        VRDTO = 0;
    MERCANCIA = VRSUBT - VRADIC + VRDTO;
    EXECUTE PROCEDURE FECHA_A_CONTA(:FECAUX) returning_values (:FECHA);
    EXECUTE PROCEDURE FECHA_A_CONTA(:VENCEAUX) returning_values (:VENCE);
    /* REGISTRE EL ENCABEZADO CONTABLE */
    IDC = GEN_ID(ID_CONTABILIZA, 1);
    if (STRLEN(NOMBRE)> 43 ) then
      CONC = 'FV No.' || NUMERO || '-' || SUBSTR(NOMBRE,1,43);
    ELSE
      CONC = 'FV No.' || NUMERO || '-' || NOMBRE;
    INSERT INTO CONTABILIZACION (CNTB_ID, CNTB_TIPOCOMP, CNTB_PREFCNT, CNTB_NUMERO, CNTB_FECHA, CNTB_CONCEPTO, CNTB_REF, CNTB_TIPOREF, CNTB_IDREF, CNTB_PREFREF, CNTB_NUMREF, CNTB_PROCESADO)
        VALUES (:IDC, :TIPOCOMP, :PREFCONT, :NUM, :FECHA, :CONC, '', 31, :IDDOC, :PREF, :NUM, 'N');
    NROI = 0;
    SUMA = 0;
    ERROR = 0;
    /* SI NO HAY CUENTA DE DESCUENTO NI ADICIONAL CALCULE UN FACTOR PARA LAS VENTAS Y EL IVA */
    if (MERCANCIA <> 0) then
        FACTOR = CAST(VRSUBT AS DOUBLE PRECISION) / CAST(MERCANCIA AS DOUBLE PRECISION);
    ELSE
        FACTOR = 1;
    /* TRAIGA EL NUMERO DE DIGITOS PARA EL REDONDEO */
    SELECT CAST(CONF_VALOR AS INTEGER) FROM CONFIGURACION WHERE CONF_MODULO = 'FACTURACION' AND
        CONF_CATEGORIA = 'GENERAL' AND CONF_PROPIEDAD = 'REDONDEO AL MULTIPLO DE DIEZ EN TOTALES' INTO :DIG;
    /* CUENTAS DE VENTAS */
    if (VENTAS = 'A') then
        BEGIN
        FOR SELECT MAX(COAR_CTAVNT), SUM(FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), SUM(FADE_IVAMONTO), SUM(FADE_CONSUMO), MAX(B.bode_proy), MAX(B.bode_centro), MAX(T.taiv_porc)
            FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_DETALLE F, bodega b, TARIFA_IVA T
            WHERE F.FACT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND T.taiv_cod = A.taiv_cod AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL)) and
            f.bode_cod = b.bode_cod
            GROUP BY COAR_CTAVNT, TAIV_PORC
            INTO :CTAVENTAS, :MONTO, :IMPTOS, :VRCONSUMO, :PROYI, :CENTI, :porcajus
            DO
            BEGIN
            factoraj = null;
            SELECT AJCI_FACTOR FROM AJUSTE_CIERRE
                WHERE AJCI_PORC = :porcajus AND AJCI_FECINI <= :fecaux AND AJCI_FECFIN >= :fecaux
                INTO :factoraj;
            if (factoraj is not null) then
                MONTO = MONTO * factoraj;

            if ((FOMENTO = 'SI') or (icoing = 'SI')) then
                MONTO = MONTO + VRCONSUMO;
            if ((CTADTO IS NULL) OR (CTADTO = '')) then
                MONTO = MONTO * FACTOR;
            execute procedure redondee(MONTO, DIG) returning_values (MONTO);
            if (MONTO <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTAVENTAS, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT F.ARTI_COD, (FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), FADE_CONSUMO
                        FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_DETALLE F
                        WHERE F.FACT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTAINV = :CUENTA AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
                        INTO :ART, :MONTO, :IMPTOS
                    DO
                        BEGIN
                        if ((FOMENTO = 'SI') or (ICOING = 'SI')) then
                            MONTO = MONTO + IMPTOS;
                        if ((CTADTO IS NULL) OR (CTADTO = '')) then
                            MONTO = MONTO * FACTOR;
                        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                        if (MONTO <> 0) then
                            BEGIN
                            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                            NROI = NROI + 1;
                            SUMA = SUMA - MONTO;
                            END
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    NROI = NROI + 1;
                    SUMA = SUMA - MONTO;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    IF (CENT = 'B') THEN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROYI, :CENTI, NULL, NULL, NULL, NULL, 0, 0);
                    ELSE
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA - MONTO;
                    END
                END /* MONTO <> 0 */
            END /* FOR */
        END /* VENTAS X ARTICULO */
     IF ((VENTAS = 'C') OR (VENTAS = 'K')) THEN
        BEGIN
        IF (VENTAS = 'C') THEN
            CTAVENTAS = TCTAVENTA;
        SELECT SUM(FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), SUM(FADE_IVAMONTO), SUM (FADE_CONSUMO)
            FROM FACTURAS_DETALLE F
            WHERE F.FACT_ID = :IDDOC AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
            INTO :MONTO, :IMPTOS, :VRCONSUMO;
        if ((FOMENTO = 'SI') or (ICOING = 'SI')) then
            MONTO = MONTO + VRCONSUMO;
        if ((CTADTO IS NULL) OR (CTADTO = '')) then
            MONTO = MONTO * FACTOR;
        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
        if (MONTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTAVENTAS, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT F.ARTI_COD, (FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), FADE_CONSUMO
                    FROM ARTICULO A, FACTURAS_DETALLE F
                    WHERE F.FACT_ID = :IDDOC AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
                    INTO :ART, :MONTO, :IMPTOS
                    DO
                    BEGIN
                    if ((FOMENTO = 'SI') or (ICOING = 'SI')) then
                        MONTO = MONTO + VRCONSUMO;
                    if ((CTADTO IS NULL) OR (CTADTO = '')) then
                        MONTO = MONTO * FACTOR;
                    execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                    if (MONTO <> 0) then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        SUMA = SUMA - MONTO;
                        END
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - MONTO;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - MONTO;
                END
            END /* MONTO <> 0 */
        END /* VENTAS DE CLIENTE O CONSTANTE */
    /* EL IVA EN VENTAS */
    if (IVA = 'A') then
        BEGIN
        FOR SELECT MAX(COAR_CTAIVAV), SUM(FADE_IVAMONTO), SUM(FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), sum(FADE_CONSUMO), MAX(T.taiv_porc)
            FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_DETALLE F, TARIFA_IVA T
            WHERE F.FACT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND A.taiv_cod = T.taiv_cod AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
            GROUP BY COAR_CTAIVAV, T.taiv_porc
            INTO :CTAIVA, :IMPTOS, :MONTO, :VALORADIC, :porcajus
        DO
            BEGIN
            factoraj = null;
            SELECT AJCI_FACTOR FROM AJUSTE_CIERRE
                WHERE AJCI_PORC = :porcajus AND AJCI_FECINI <= :fecaux AND AJCI_FECFIN >= :fecaux
                INTO :factoraj;
            if (factoraj is not null) then
                BEGIN
                MONTO = MONTO * factoraj;
                IMPTOS = IMPTOS * factoraj;
                END

            if (FOMENTO = 'SI') then
                MONTO = MONTO + VALORADIC;
            MONTO = MONTO * -1;
            MONTO = MONTO * FACTOR;
            IMPTOS = IMPTOS * FACTOR;
            execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
            execute procedure redondee(MONTO, DIG) returning_values (MONTO);
            if (IMPTOS <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTAIVA, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT F.ARTI_COD, FADE_IVAMONTO, (FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), TAIV_PORC, FADE_CONSUMO
                        FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_DETALLE F, TARIFA_IVA T
                        WHERE F.FACT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTAIVAV = :CUENTA AND A.TAIV_COD = T.TAIV_COD AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
                        INTO :ART, :IMPTOS, :MONTO, :PORCIVA, :VALORADIC
                    DO
                        BEGIN
                        if (FOMENTO = 'SI') then
                            MONTO = MONTO + VALORADIC;
                        MONTO = MONTO * -1;
                        MONTO = MONTO * FACTOR;
                        IMPTOS = IMPTOS * FACTOR;
                        execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                        if (IMPTOS <> 0) then
                            BEGIN
                            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, :MONTO, :PORCIVA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                            NROI = NROI + 1;
                            SUMA = SUMA + DEBITO - CREDITO;
                            END
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, :MONTO, ABS(:IMPTOS*100/:MONTO), :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    NROI = NROI + 1;
                    SUMA = SUMA - IMPTOS;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, :MONTO, ABS(:IMPTOS*100/:MONTO), :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA - IMPTOS;
                    END
                END   /* IMPTOS <> 0 */
            END /* FOR */
        END /* IVA X ARTICULO */
    if (IVA = 'K') then /* IVA EN CTA CONSTANTE */
        BEGIN
        SELECT SUM(FADE_IVAMONTO), SUM(FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), SUM(FADE_CONSUMO)
            FROM FACTURAS_DETALLE F
            WHERE F.FACT_ID = :IDDOC and FADE_IVAMONTO <> 0 AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
            INTO :IMPTOS, :MONTO, :valoradic;
        if (FOMENTO = 'SI') then
            MONTO = MONTO + VALORADIC;
        MONTO = MONTO * -1;
        MONTO = MONTO * FACTOR;
        IMPTOS = IMPTOS * FACTOR;
        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
        execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
        if (IMPTOS <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTAIVA, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT F.ARTI_COD, (FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), FADE_IVAMONTO, TAIV_PORC, FADE_CONSUMO
                    FROM ARTICULO A, FACTURAS_DETALLE F, TARIFA_IVA T
                    WHERE F.FACT_ID = :IDDOC AND A.TAIV_COD = T.TAIV_COD AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
                    INTO :ART, :MONTO, :IMPTOS, :PORCIVA, :VALORADIC
                    DO
                    BEGIN
                    if (FOMENTO = 'SI') then
                        MONTO = MONTO + VALORADIC;
                    MONTO = MONTO * -1;
                    MONTO = MONTO * FACTOR;
                    IMPTOS = IMPTOS * FACTOR;
                    execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                    execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                    if (IMPTOS <> 0) then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', 0, :IMPTOS, :MONTO, :PORCIVA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        SUMA = SUMA - IMPTOS;
                        END
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', 0, :IMPTOS, :MONTO, ABS(:IMPTOS*100/:MONTO), :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - IMPTOS;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', 0, :IMPTOS, :MONTO, ABS(:IMPTOS*100/:MONTO), :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - IMPTOS;
                END
            END /* IMPTOS <> 0 */
        END /* IVA EN CTA CONSTANTE */
    /* EL IMPOCONSUMO */
    if ((CONSUMO = 'A') AND (FOMENTO <> 'SI')) then
        BEGIN
        FOR SELECT MAX(COAR_CTACONS), SUM(FADE_CONSUMO)
            FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_DETALLE F
            WHERE F.FACT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
            GROUP BY COAR_CTACONS
            INTO :CTACONSUMO, :IMPTOS
        DO
            BEGIN
            execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
            if (IMPTOS <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTACONSUMO, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, REGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT F.ARTI_COD, FADE_CONSUMO
                        FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_DETALLE F
                        WHERE F.FACT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTACONS = :CUENTA AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
                        INTO :ART, :IMPTOS
                    DO
                        BEGIN
                        execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                        if (IMPTOS <> 0) then
                            BEGIN
                            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                            NROI = NROI + 1;
                            SUMA = SUMA - IMPTOS;
                            END
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    NROI = NROI + 1;
                    SUMA = SUMA - IMPTOS;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA - IMPTOS;
                    END
                END /* IMPTOS <> 0 */
            END /* FOR */
        END /* CONSUMO X ARTICULO */
    if ((CONSUMO = 'K') AND (FOMENTO <> 'SI')) then /* CONSUMO EN CTA CONSTANTE */
        BEGIN
        SELECT SUM(FADE_CONSUMO)
            FROM FACTURAS_DETALLE F
            WHERE F.FACT_ID = :IDDOC AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
            INTO :IMPTOS;
        execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
        if (IMPTOS <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTACONSUMO, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT F.ARTI_COD, FADE_CONSUMO
                    FROM ARTICULO A, FACTURAS_DETALLE F
                    WHERE F.FACT_ID = :IDDOC AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
                    INTO :ART, :IMPTOS
                    DO
                    BEGIN
                    execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                    if (IMPTOS <> 0) then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CTACONSUMO, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        SUMA = SUMA - IMPTOS;
                        END
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTACONSUMO, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - IMPTOS;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTACONSUMO, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - IMPTOS;
                END
            END /* IMPTOS <> 0 */
        END /* CONSUMO EN CTA CONSTANTE */
    /* DESCUENTO */
    if ((CTADTO IS NOT NULL) AND (CTADTO <> '')) then
        BEGIN
        execute procedure redondee(VRDTO, DIG) returning_values (VRDTO);
        if (VRDTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTADTO, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRDTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA + VRDTO;
                END
            if (TIPOCUEN = 'N') then
                    BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRDTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA + VRDTO;
                END
            END
        END /* DESCUENTO */
    /* VALOR ADIC */
    if ((CTAADIC IS NOT NULL) AND (CTAADIC <> '')) then
        BEGIN
        execute procedure redondee(VRADIC, DIG) returning_values (VRADIC);
        if (VRADIC <> 0) THEN
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTAADIC, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRADIC, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - VRADIC;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRADIC, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - VRADIC;
                END
            END
        END /* VR. ADIC */
    /* VALOR EXTRA */
    if ((CTAEXTRA IS NOT NULL) AND (CTAEXTRA <> '')) THEN
        BEGIN
        execute procedure redondee(VREXTRA, DIG) returning_values (VREXTRA);
        if (VREXTRA <> 0) THEN
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTAEXTRA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VREXTRA, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - VREXTRA;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VREXTRA, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - VREXTRA;
                END
            END
        END /* VR. EXTRA */
    /* DESCUENTE EL IMPOCONSUMO */
    SELECT SUM(FADE_CONSUMO)
        FROM FACTURAS_DETALLE F WHERE F.FACT_ID = :IDDOC AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL)) INTO :IMPTOS;
    vrsubt = vrsubt - IMPTOS;
    /* RETENCION FUENTE */
    if ((RTFTE = 'C') or (RTFTE = 'K')) then
      BEGIN
      execute procedure redondee(VRRTFTE, DIG) returning_values (VRRTFTE);
      if (VRRTFTE <> 0) then
        BEGIN
        if (RTFTE = 'C') then
            CTARTFTE = TCTARTFTE;
        EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTARTFTE, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :VRSUBT, :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTFTE;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :VRSUBT, :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTFTE;
            END
        /* AUTORETENCION */
        if (FAUTORET <= fecaux) then
            BEGIN
            EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'CUENTA DE AUTORETENCION EN LA FUENTE') returning_values (CTARTFTE);
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTARTFTE INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERROR (31, :IDDOC, :CTARTFTE, 2);
                CUENTA = CTARTFTE;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                begin
                EXECUTE PROCEDURE ERROR (31, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, (:VRSUBT*-1), :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - VRRTFTE;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, (:VRSUBT*-1), :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - VRRTFTE;
                END
            END
        END /* RTFTE */
      END
    if (RTFTE = 'A') then
      BEGIN
      FOR SELECT MAX(COAR_CTARTFTEV), MAX(COAR_RTFTE), MIN(COAR_RTBASE), SUM(FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), SUM((FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO)*COAR_RTFTE)
        FROM CONTABIL_ARTICULO C, FACTURAS_DETALLE F
        WHERE F.FACT_ID = :IDDOC AND F.ARTI_COD = C.ARTI_COD AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
        GROUP BY COAR_CTARTFTEV
        INTO :CTARTFTE, :PRTFTE, :baseadic, :MONTO, :VRRTFTE
        DO
        BEGIN
        MONTO = MONTO * FACTOR;
        if (MONTO >= BASEADIC) then
            BEGIN
            VRRTFTE = VRRTFTE * FACTOR / 100;
            execute procedure redondee(VRRTFTE, DIG) returning_values (VRRTFTE);
            execute procedure redondee(MONTO, DIG) returning_values (MONTO);
            if (VRRTFTE <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTARTFTE, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :MONTO, :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    NROI = NROI + 1;
                    SUMA = SUMA + VRRTFTE;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :MONTO, :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA + VRRTFTE;
                    END
                /* AUTORETENCION */
                if (FAUTORET <= fecaux) then
                    BEGIN
                    EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'CUENTA DE AUTORETENCION EN LA FUENTE') returning_values (CTARTFTE);
                    EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTARTFTE, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
                    if (ERRORC <> 0) then
                        ERROR = ERROR + 1;
                    if (TIPOCUEN = 'C') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, (:MONTO*-1), :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                        NROI = NROI + 1;
                        SUMA = SUMA - VRRTFTE;
                        END
                    if (TIPOCUEN = 'N') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, (:MONTO*-1), :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NROI = NROI + 1;
                        SUMA = SUMA - VRRTFTE;
                        END
                    END
                END
            END
        END /* RTFTE */
      END
    /* RETENCION IVA */
    if ((RTIVA = 'C') or (RTIVA = 'K')) then
      BEGIN
      execute procedure redondee(VRRTIVA, DIG) returning_values (VRRTIVA);
      if (VRRTIVA <> 0) then
        BEGIN
        if (RTIVA = 'C') then
            CTARTIVA = TCTARTIVA;
        EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTARTIVA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTIVA, 0, :VRIVA, :PORC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTIVA;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTIVA, 0, :VRIVA, :PORC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTIVA;
            END
        END /* RTIVA */
      END
    /* RETENCION DE ICA */
    if ((RTICA = 'C') or (RTICA = 'K')) then
      BEGIN
      execute procedure redondee(VRRTICA, DIG) returning_values (VRRTICA);
      if (VRRTICA <> 0) then
        BEGIN
        if (RTICA = 'C') then
            CTARTICA = TCTARTICA;
        EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTARTICA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTICA, 0, :VRSUBT, :PRTICA, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTICA;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTICA, 0, :VRSUBT, :PRTICA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTICA;
            END
        END /* RTICA */
      END
    /* CIERRE EL COMPROBANTE CONTRA LA CUENTA DEL TERCERO O LA CONSTANTE */
    if ((SUMA <> 0) and ((CARTERA = 'C') or (CARTERA = 'K') or (CARTERA = 'J'))) then
        BEGIN
        if (icoing = 'SI') then
            /* DESCUENTE EL IMPOCONSUMO QUE HACE PARTE DEL COSTO */
            SUMA = SUMA + IMPTOS;
        if (SUMA < 0) then
            BEGIN
            DEBITO = SUMA * -1;
            CREDITO = 0;
            END
        ELSE
            BEGIN
            DEBITO = 0;
            CREDITO = SUMA;
            END
        if (CARTERA = 'C') then
            CTACARTERA = TCTACLIEN;
        if (CARTERA = 'J') then
            BEGIN
            /* BUSQUE LA CUENTA DE LA CAJA */
            SELECT CAJA_CUENTA FROM CAJAS C, PUNTO_VENTA P
                WHERE P.CAJA_ID = C.CAJA_ID AND PTVT_ID = :PTOVTA
                INTO :CTACARTERA;
            END
        EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTACARTERA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :DEBITO, :CREDITO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
        if (TIPOCUEN = 'N') then
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :DEBITO, :CREDITO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
        NROI = NROI + 1;
        END /* SUMA EN CARTERA */
    /* CALCULE COSTOS EN VENTAS */
    EXECUTE PROCEDURE COSTO_EN_VENTAS(31, :IDDOC);
    if (COSTOS = 'A') then
        BEGIN
        FOR SELECT MAX(CTACOS), SUM(CAST(CANT AS DOUBLE PRECISION) * COSTO), SUM(FADE_CONSUMO)
            FROM COSTO_VENTAS CV, FACTURAS_DETALLE D WHERE CV.cove_item = D.fade_item AND D.fact_id = :iddoc AND
            TIDO_COD = 31 AND COVE_ID = :iddoc
            GROUP BY CTACOS
            INTO :CTACOSTOS, :MONTO, :vrconsumo
            DO
            BEGIN
            if (icoing = 'SI') then
                MONTO = MONTO + VRCONSUMO;
            if (MONTO <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTACOSTOS, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT ARTI_COD, CANT * COSTO
                        FROM COSTO_VENTAS WHERE TIDO_COD = 31 AND COVE_ID = :iddoc AND CTACOS = :CUENTA
                        INTO :ART, :MONTO
                    DO
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    NROI = NROI + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    END
                END /* MONTO <> 0 */
            END /* FOR */
        END /* COSTOS */
    if (COSTOS = 'K') then
        BEGIN
        SELECT SUM(CAST(CANT AS DOUBLE PRECISION) * COSTO)
            FROM COSTO_VENTAS WHERE TIDO_COD = 31 AND COVE_ID = :iddoc
            INTO :MONTO;
        if (icoing = 'SI') then
            MONTO = MONTO + imptos;
        if (MONTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTACOSTOS, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, REGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT ARTI_COD, CANT * COSTO
                    FROM COSTO_VENTAS WHERE TIDO_COD = 31 AND COVE_ID = :iddoc
                    INTO :ART, :MONTO
                DO
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTACOSTOS, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                    NROI = NROI + 1;
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTACOSTOS, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTACOSTOS, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                END
            END /* MONTO <> 0 */
        END /* COSTOS = K */
    if (INVEN = 'A') then
        BEGIN
        FOR SELECT MAX(CTAINV), SUM(CAST(CANT AS DOUBLE PRECISION) * COSTO)
            FROM COSTO_VENTAS WHERE TIDO_COD = 31 AND COVE_ID = :iddoc
            GROUP BY CTAINV
            INTO :CTAINVEN, :MONTO
        DO
            BEGIN
            if (MONTO <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTAINVEN, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, REGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT ARTI_COD, CANT * COSTO
                        FROM COSTO_VENTAS WHERE TIDO_COD = 31 AND COVE_ID = :iddoc AND CTAINV = :CUENTA
                        INTO :ART, :MONTO
                    DO
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    NROI = NROI + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    END
                END /* MONTO <> 0 */
            END /* FOR */
        END /* INVEN = A */
    if (INVEN = 'K') then
        BEGIN
        SELECT SUM(CAST(CANT AS DOUBLE PRECISION) * COSTO)
            FROM COSTO_VENTAS WHERE TIDO_COD = 31 AND COVE_ID = :iddoc
            INTO :MONTO;
        if (MONTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTAINVEN, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT ARTI_COD, CANT * COSTO
                    FROM COSTO_VENTAS WHERE TIDO_COD = 31 AND COVE_ID = :iddoc
                    INTO :ART, :MONTO
                DO
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTAINVEN, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                    NROI = NROI + 1;
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAINVEN, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAINVEN, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                END
            END /* MONTO <> 0 */
        END /* INVEN = K */
    /* recorra las cuentas adicionales */
    FOR SELECT INVC_CUENTA, INVC_BASE, INVC_PORC, INVC_VALOR, INVC_DB
        FROM INTERFAZ_VENTAS_CTAS
        WHERE INVE_ID = :IDINTER
        INTO :CTADIC, :BASEADIC, :PORCADIC, :VALORADIC, :DBADIC
        DO
        BEGIN
        if (VALORADIC <> 0) then
            MONTO = VALORADIC;
        ELSE
            BEGIN
            if (:BASEADIC = 'SUBTOTAL') then
                VALORADIC = vrsubt;
            if (:BASEADIC = 'DESCUENTO') then
                VALORADIC = VRDTO;
            if (:BASEADIC = 'IVA') then
                VALORADIC = VRIVA;
            if (:BASEADIC = 'ADICIONAL') then
                VALORADIC = VRADIC;
            if (:BASEADIC = 'EXTRA') then
                VALORADIC = VREXTRA;
            if (:BASEADIC = 'TOTAL') then
                VALORADIC = VRTOTAL;
            MONTO = VALORADIC * PORCADIC / 100;
            END
        if (MONTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTADIC, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                if (DBADIC = 'S') then
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                ELSE
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                if (DBADIC = 'S') then
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                ELSE
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                END
            NROI = NROI + 1;
            END
        END
    if (ERROR > 0) then
        VER = 'S';
    SUSPEND;
    END /* NO ANULADO */
  END /* EXISTE LA INTERFAZ */
ELSE
    BEGIN
    EXECUTE PROCEDURE ERROR (31, :IDDOC, :PREF, 1);
    ERROR = ERROR + 1;
    VER = 'S';
    SUSPEND;
    END
END
^

SET TERM ; ^


SET TERM ^ ;

CREATE or ALTER PROCEDURE CONTADO_MVERDE2(
    FECINI DATE,
    FECFIN DATE,
    PREF VARCHAR(4))
RETURNS (
    FECHA DATE,
    PUNTO INTEGER,
    IDC INTEGER,
    ERROR INTEGER,
    VER CHAR(1))
AS
declare variable IDIN INTEGER;
declare variable IDF INTEGER;
declare variable NIT VARCHAR(20);
begin
FECHA = FECINI;
SELECT MAX(INVE_ID) FROM INTERFAZ_VENTAS WHERE TIDO_COD = 31 AND PREF_PRE = :PREF INTO :IDIN;
WHILE (FECHA <= fecfin) DO
    BEGIN
    FOR SELECT FACT_ID, PTVT_ID FROM facturas F WHERE fact_fecha = :fecha and pref_pre = :pref
        ORDER BY FACT_NUMERO into :IDF, :PUNTO
        DO
        BEGIN
        if (NOT EXISTS (SELECT ENCO_CONSEC FROM comprobante_encabezado WHERE ENCO_TIPOREF = 31 AND ENCO_IDREF = :IDF)) then
            BEGIN
            EXECUTE PROCEDURE contabil_factura_factor(idf,  IDIN) returning_values (ERROR, VER, IDC);
            EXECUTE PROCEDURE contabiliza_pendiente (IDC);
            suspend;
            END
        END
    FECHA = FECHA + 1;
    END
end
^

SET TERM ; ^

grant EXECUTE on PROCEDURE contabil_factura_factor to PUBLIC;
grant EXECUTE on PROCEDURE contado_mverde2 to PUBLIC;


/* 20100721 */
/* costo unitario repetido para todos los artículos */
SET TERM ^ ;

CREATE OR ALTER procedure REP_ABC_INVENTARIO (
    FECHA date,
    ARTINI varchar(20),
    ARTFIN varchar(20),
    GRPINI varchar(3),
    GRPFIN varchar(3),
    AGRUPA char(1),
    ORDEN char(1),
    DIAS integer)
returns (
    CODIGO varchar(15),
    NOMBRE varchar(60),
    UNIDAD varchar(8),
    CODGRUPO varchar(2),
    NOMGRUPO varchar(30),
    CODSUBG varchar(3),
    NOMSUBG varchar(30),
    CODMARC varchar(3),
    NOMMARC varchar(30),
    COSTO numeric(18,2),
    SALIDAT numeric(18,4),
    VPROMEDIO numeric(18,4),
    PORC numeric(9,2),
    CLASE char(1))
AS
DECLARE VARIABLE CODINI VARCHAR(20);
DECLARE VARIABLE CODFIN VARCHAR(20);
DECLARE VARIABLE DESINI VARCHAR(20);
DECLARE VARIABLE DESFIN VARCHAR(20);
declare variable MARINI VARCHAR(3);
declare variable MARFIN VARCHAR(3);
declare variable SUBINI VARCHAR(3);
declare variable SUBFIN VARCHAR(3);
declare variable ACUMULADO NUMERIC(18,2);
declare variable ACUMULAC NUMERIC(18,4);
declare variable ACUMPORC NUMERIC(9,2);
declare variable FECINI DATE;
declare variable A NUMERIC(9,2);
declare variable B NUMERIC(9,2);
declare variable C NUMERIC(9,2);
declare variable MODO VARCHAR(10);
declare variable VENTAS numeric(18,4);
declare variable DEVOL numeric(18,4);
declare variable FECAUX DATE;
BEGIN
if (ORDEN = 'C') then
    BEGIN
    CODINI = ARTINI;
    CODFIN = ARTFIN;
    DESINI = '';
    DESFIN = 'zz';
    END
ELSE
    BEGIN
    DESINI = ARTINI;
    DESFIN = ARTFIN;
    CODINI = '';
    CODFIN = 'zz';
    END
if (AGRUPA = 'G') then
    BEGIN
    MARINI = '';
    MARFIN = 'zz';
    SUBINI = '';
    SUBFIN = 'zz';
    END
ELSE
    if (AGRUPA = 'M') then
        BEGIN
        MARINI = GRPINI;
        MARFIN = GRPFIN;
        GRPINI = '';
        GRPFIN = 'zz';
        SUBINI = '';
        SUBFIN = 'zz';
        END
    ELSE
        if (AGRUPA = 'S') then
            BEGIN
            SUBINI = GRPINI;
            SUBFIN = GRPFIN;
            GRPINI = '';
            GRPFIN = 'zz';
            MARINI = '';
            MARFIN = 'zz';
            END
        ELSE
            BEGIN
            MARINI = '';
            MARFIN = 'zz';
            GRPINI = '';
            GRPFIN = 'zz';
            SUBINI = '';
            SUBFIN = 'zz';
            END
DELETE FROM analisis_abcinven;
acumporc = 0;
FECINI = FECHA - DIAS;
/* CALCULE LA VENTA PROMEDIO DE CADA ARTICULO */
EXECUTE PROCEDURE LEE_CONFIGURACION ('INVENTARIO', 'EXISTENCIAS', 'PORCENTAJE MINIMO PARA ARTICULO CLASE "A"') returning_values (A);
EXECUTE PROCEDURE LEE_CONFIGURACION ('INVENTARIO', 'EXISTENCIAS', 'PORCENTAJE MINIMO PARA ARTICULO CLASE "B"') returning_values (B);
EXECUTE PROCEDURE LEE_CONFIGURACION ('INVENTARIO', 'EXISTENCIAS', 'PORCENTAJE MINIMO PARA ARTICULO CLASE "C"') returning_values (C);
EXECUTE PROCEDURE LEE_CONFIGURACION ('INVENTARIO', 'EXISTENCIAS', 'REPORTE ABC DEL INVENTARIO CON LA UTILIDAD O EL VALOR DE VENTA') returning_values (MODO);
FOR SELECT ARTI_COD, ARTI_UNIDAD FROM ARTICULO A
      WHERE ARTI_COD >= :CODINI AND ARTI_COD <= :CODFIN AND A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :GRPFIN AND ARTI_DES >= :DESINI AND ARTI_DES <= :DESFIN AND A.ESAR_COD <> 'I'
      AND (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN)))
      AND (((:SUBINI = '') AND (:SUBFIN = 'zz')) or ((A.subg_cod >= :SUBINI) AND (A.subg_cod <= :SUBFIN)))
      INTO :CODIGO, :UNIDAD
      DO
      BEGIN
      SELECT SUM(FADE_TOTAL - FADE_CONSUMO - FADE_IVAMONTO) FROM FACTURAS_DETALLE D, FACTURAS F
            WHERE F.fact_id = D.fact_id AND ARTI_COD = :codigo AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECHA AND FADE_ANULADO = 'N' INTO :ventas;
      if (ventas IS NULL) then
          ventas = 0;
      SELECT SUM(DVDE_TOTAL - DVDE_CONSUMO - DVDE_IVAMONTO) FROM devoluciones_ventas_detalle D, devoluciones_ventas F
            WHERE F.devt_id = D.devt_id AND ARTI_COD = :codigo AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECHA AND DVDE_ANULADO = 'N' INTO :devol;
      if (devol IS NULL) then
          devol = 0;
      VENTAS = VENTAS - DEVOL;
      if (VENTAS > 0) then
        BEGIN
        acumulado = 0;
        acumulac = 0;
        if (MODO = 'UTILIDAD') then
            BEGIN
            FOR SELECT FACT_FECHA, FADE_CANT * FADE_FACTOR FROM FACTURAS_DETALLE D, FACTURAS F
                WHERE F.fact_id = D.fact_id AND ARTI_COD = :codigo AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECHA AND FADE_ANULADO = 'N'
                INTO :FECAUX, :salidat
                DO
                BEGIN
                EXECUTE PROCEDURE COSTO_PROMEDIO(:codigo, :fecaux) returning_values (:costo);
                acumulado = acumulado + costo * salidat;
                acumulac = acumulac + salidat;
                END
            FOR SELECT DEVT_FECHA, DVDE_CANT * DVDE_FACTOR FROM devoluciones_ventas_detalle D, devoluciones_ventas F
                WHERE F.devt_id = D.devt_id AND ARTI_COD = :codigo AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECHA AND DVDE_ANULADO = 'N'
                INTO :FECAUX, :salidat
                DO
                BEGIN
                EXECUTE PROCEDURE COSTO_PROMEDIO(:codigo, :fecaux) returning_values (:costo);
                acumulado = acumulado - costo * salidat;
                acumulac = acumulac - salidat;
                END
            ventas = ventas - acumulado;
            END
        insert into analisis_abcinven (ABCI_COD, ABCI_VENTA, ABCI_CANT) VALUES (:codigo, :ventas, :acumulac);
        END
    END
SELECT SUM(ABCI_VENTA) FROM analisis_abcinven INTO :acumulado;
FOR SELECT ARTI_COD, ARTI_DES, ARTI_UNIDAD, ARTI_DIAS, A.GRUP_COD, GRUP_NOM, A.SUBG_COD, A.MARC_COD, ABCI_VENTA, ABCI_CANT
      FROM ARTICULO A, GRUPO G, analisis_abcinven N
      WHERE A.ARTI_COD = N.abci_cod AND G.GRUP_COD = A.GRUP_COD
      ORDER BY ABCI_VENTA DESC
      INTO :CODIGO, :NOMBRE, :UNIDAD, :DIAS, :CODGRUPO, :NOMGRUPO, :CODSUBG, :CODMARC, :vpromedio, :salidat
      DO
        BEGIN
        NOMMARC = '';
        NOMSUBG = '';
        SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO :NOMMARC;
        SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
        if (acumulado <> 0) then
            PORC = vpromedio / acumulado * 100;
        ELSE
            PORC = 0;
        acumporc = acumporc + porc;
        if (acumporc < A) then
            CLASE = 'A';
        else
            if (acumporc < B) then
                CLASE = 'B';
            else
                if (acumporc < c) then
                    CLASE = 'C';
                else
                    CLASE = 'D';
        EXECUTE PROCEDURE COSTO_PROMEDIO(:codigo, :fecha) returning_values (:costo);
        SUSPEND;
        END
END
^

SET TERM ; ^

/* 20100721B */
/* SALDO INICIAL POR CENTRO DE COSTO */
SET TERM ^ ;

CREATE OR ALTER procedure AUXILIAR_TERCERO_DESDE_HASTA (
    CUENTAINI varchar(20),
    CUENTAFIN varchar(20),
    TERCINI varchar(20),
    TERCFIN varchar(20),
    DESDE char(8),
    HASTA char(8),
    PROYINI varchar(4),
    PROYFIN varchar(4),
    CENTINI varchar(4),
    CENTFIN varchar(4),
    CEROS char(1))
returns (
    ID integer,
    CUENTA varchar(20),
    TIPOCOMP varchar(3),
    PREFIJO varchar(4),
    NUMERO varchar(6),
    FECHA char(8),
    CONCEPTO varchar(60),
    NIT varchar(15),
    DV char(1),
    REF varchar(20),
    BASE numeric(18,2),
    PORC numeric(9,4),
    DEBITO numeric(18,2),
    CREDITO numeric(18,2),
    PROYECTO varchar(4),
    CENTRO varchar(4),
    TIPOREF integer,
    IDREF integer,
    SALDO numeric(18,2),
    NOMCUENTA varchar(60),
    NOMTERCERO varchar(60),
    CUENTANIT varchar(40),
    SALDOFIN numeric(18,2),
    SALDOCTA numeric(18,2),
    SALDOCTAF numeric(18,2))
AS
declare variable NUMROWS INTEGER;
BEGIN
EXECUTE PROCEDURE fecha_desde_conta (:DESDE) returning_values (:DESDE);
for SELECT CUEN_COD, CUEN_NOM
    FROM CUENTAS
    WHERE CUEN_COD >= :CUENTAINI AND CUEN_COD <= :CUENTAFIN
     ORDER BY CUEN_COD
    INTO :CUENTA, :NOMCUENTA
    DO
    BEGIN
    EXECUTE PROCEDURE saldo_cuenta(:CUENTA, :DESDE) RETURNING_VALUES (:SALDOCTA);
    SALDOCTAF = SALDOCTA;
    FOR SELECT distinct TERC_NIT FROM saldos_terceros WHERE CUEN_COD = :CUENTA AND
        TERC_NIT >= :TERCINI AND TERC_NIT <= :TERCFIN ORDER BY TERC_NIT INTO :NIT
        DO
        BEGIN
        FOR SELECT distinct PROY_COD, CENT_COD FROM saldos_centros WHERE CUEN_COD = :CUENTA AND
            PROY_COD >= :proyini AND PROY_COD <= :proyfin AND CENT_COD >= :centini AND CENT_COD <= :centfin ORDER BY PROY_COD, CENT_COD
            INTO :proyecto, :centro
            DO
            BEGIN
            EXECUTE PROCEDURE saldo_centro_tercero(:CUENTA, :proyecto, :centro, :nit, :desde) returning_values (:SALDO);
            SALDOFIN = SALDO;
            CUENTANIT = CUENTA || NIT;
            SELECT TERC_NOM, TERC_DV FROM TERCEROS WHERE TERC_NIT = :nit INTO :NOMTERCERO, :DV;
            NUMROWS = 0;
            /* TRAE LOS MOV. DE LA CUENTA Y TERCERO DADOS */
            FOR SELECT E.ENCO_CONSEC, TICO_COD, PRCO_PREF, ENCO_NUMERO, ENCO_FECHA, D.CUEN_COD, CODE_CONCEPTO, D.TERC_NIT, CODE_REFER, CODE_BASE, CODE_PORC, CODE_DEBITO, CODE_CREDITO, D.PROY_COD, D.CENT_COD, ENCO_TIPOREF, ENCO_IDREF
                FROM COMPROBANTE_ENCABEZADO E, COMPROBANTE_DETALLE D
                WHERE E.ENCO_CONSEC = D.ENCO_CONSEC AND D.CUEN_COD = :CUENTA AND ENCO_FECHA >= :DESDE AND ENCO_FECHA <= :HASTA
                AND D.TERC_NIT = :NIT AND D.PROY_COD = :proyecto AND D.CENT_COD = :centro
                ORDER BY D.CUEN_COD, D.TERC_NIT, ENCO_FECHA, PRCO_PREF, ENCO_NUMERO
                INTO :ID, :TIPOCOMP, :PREFIJO, :NUMERO, :FECHA, :CUENTA, :CONCEPTO, :NIT, :REF, :BASE, :PORC, :DEBITO, :CREDITO, :PROYECTO, :centro, :TIPOREF, :IDREF
                DO
                BEGIN
                SALDOFIN = SALDOFIN + DEBITO - CREDITO;
                SALDOCTAF = SALDOCTAF + DEBITO - CREDITO;
                NUMROWS = NUMROWS + 1;
                SUSPEND;
                END
            if ((CEROS = 'S') AND (NUMROWS = 0)) then
                BEGIN
                SALDOFIN = SALDO;
                if (SALDO <> 0) then
                    BEGIN
                    ID = NULL;
                    TIPOCOMP = NULL;
                    PREFIJO = NULL;
                    NUMERO = NULL;
                    FECHA = NULL;
                    CONCEPTO = NULL;
                    REF = NULL;
                    BASE = 0;
                    PORC = 0;
                    DEBITO = 0;
                    CREDITO = 0;
                    PROYECTO = NULL;
                    CENTRO = NULL;
                    TIPOREF = 0;
                    IDREF = 0;
                    SUSPEND;
                    END
                END
            END
        END
    END
END
^

SET TERM ; ^

/* 20100722 */
/* MULTIPLE ROWS POR EL VENCDIMIENTO DEL LOTE */

SET TERM ^ ;

CREATE OR ALTER procedure IMPR_TRASFERENCIA (
    ID integer)
returns (
    PREF varchar(4),
    NUMERO varchar(6),
    FECHA date,
    CONCEPTO varchar(60),
    REFER varchar(60),
    CODBODORI varchar(2),
    NOMBODORI varchar(30),
    CODBODDES varchar(2),
    NOMBODDES varchar(30),
    OBS blob sub_type 0 segment size 80,
    ITEM integer,
    ARTICULO varchar(15),
    CODBAR varchar(15),
    ARTIDES varchar(60),
    CANT numeric(18,4),
    UNIDAD varchar(8),
    BODITEM varchar(2),
    COSTO numeric(18,2),
    IVAPORC numeric(9,2),
    IVAMONTO numeric(18,2),
    CONSUMO numeric(18,2),
    TOTAL numeric(18,2),
    PRECIO numeric(18,2),
    LOTE varchar(15),
    LOTEVENCE date,
    PESOUNIT numeric(18,4),
    PESOTOT numeric(18,4),
    VOLUMUNIT numeric(18,4),
    VOLUMTOT numeric(18,4),
    TOTALDOC numeric(18,2),
    CONSUMODOC numeric(18,2),
    TOTALMASIMP numeric(18,2))
AS
declare variable IMPTOS CHAR(1);
declare variable LARGO NUMERIC(18,4);
declare variable ANCHO NUMERIC(18,4);
declare variable ALTO NUMERIC(18,4);
declare variable LISTA CHAR(3);
BEGIN
  /*  */
  SELECT PREF_PRE, TRAN_NUMERO, TRAN_FECHA, TRAN_CONC, TRAN_REFER, T.BODE_COD, BO.BODE_NOM, TRAN_BODDES, BD.BODE_NOM, TRAN_IMPTOS, TRAN_OBS
    FROM TRASFERENCIAS T, BODEGA BO, BODEGA BD WHERE T.BODE_COD = BO.BODE_COD AND T.TRAN_BODDES = BD.BODE_COD AND T.TRAN_ID = :ID into
    :PREF, :NUMERO, :FECHA, :CONCEPTO, :REFER, :CODBODORI, :NOMBODORI, :CODBODDES, :NOMBODDES, :IMPTOS, :OBS;
  SELECT SUM(TRAS_TOTAL), SUM(TRAS_IVAMONTO), SUM(TRAS_CONSUMO*TRAS_CANT*TRAS_FACTOR) FROM TRASFERENCIAS_DETALLE 
    WHERE TRAN_ID = :ID INTO :TOTALDOC, :IVAMONTO, :CONSUMODOC;
  TOTALMASIMP = TOTALDOC + CONSUMODOC;
  if (IMPTOS = 'N') then
    TOTALDOC = TOTALDOC - IVAMONTO;
  ITEM = 0;
  boditem = codbodori;
  FOR SELECT A.ARTI_COD, TRAS_CODBAR, TRAS_DESC, TRAS_CANT, TRAS_UNIDAD, TRAS_COSTO, TRAS_IVAPORC, TRAS_IVAMONTO, TRAS_CONSUMO, TRAS_TOTAL, TRAS_LOTE,
    (ARTI_PESO / 1000 * TRAS_CANT * TRAS_FACTOR), (ARTI_LARGO / 100 * TRAS_FACTOR), (ARTI_ANCHO / 100 * TRAS_FACTOR), (ARTI_ALTO / 100 * TRAS_FACTOR)
    FROM TRASFERENCIAS_DETALLE D, ARTICULO A
    WHERE D.ARTI_COD = A.ARTI_COD AND D.TRAN_ID = :ID
    ORDER BY TRAS_ITEM
    INTO :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :COSTO, :IVAPORC, :IVAMONTO, :CONSUMO, :TOTAL, :LOTE,
    :PESOUNIT, :LARGO, :ANCHO, :ALTO
    DO
      BEGIN
      EXECUTE PROCEDURE LEE_CONFIGURACION('INVENTARIO','DOCUMENTOS','CODIGO DE LISTA DE PRECIOS A IMPRIMIR EN DOCUMENTOS') returning_values (:LISTA);
      if (NOT lista IS NULL) then
          SELECT PRAR_FIJO FROM PRECIOS_ARTICULO WHERE ARTI_COD = :articulo AND LIPR_COD = :LISTA INTO :PRECIO;
      ITEM = ITEM + 1;
      if (PESOUNIT IS NULL) then
        PESOUNIT = 0;
      PESOTOT = PESOTOT + PESOUNIT;
      VOLUMUNIT = ANCHO * ALTO * LARGO;
      volumunit = VOLUMUNIT * CANT;
      if (VOLUMUNIT IS NULL) then
        VOLUMUNIT = 0;
      VOLUMTOT = VOLUMTOT + VOLUMUNIT;
      if (IMPTOS = 'N') then
        TOTAL = TOTAL - IVAMONTO;
      LOTEVENCE = NULL;
      SELECT LOTE_VENCE FROM LOTES WHERE ARTI_COD = :ARTICULO AND LOTE_NRO = :LOTE and BODE_COD = :boditem INTO :lotevence;
      SUSPEND;
      END
END
^

SET TERM ; ^


/* 20100723 */
/* request sync. error al intentar duplicar el registro en tabla aux con las consig. de tarjetas */
SET TERM ^ ;

CREATE OR ALTER procedure CONCILIA_BANCO_CONTA (
    FECINI date,
    FECFIN date,
    BANCO varchar(3),
    CTABANCO varchar(20),
    NULO1 char(1))
returns (
    FECHA date,
    TIPODOC varchar(10),
    TIPO integer,
    ID integer,
    PREF varchar(4),
    NUMERO varchar(6),
    FECCONTA char(10),
    MONTO numeric(18,2),
    MONTOC numeric(18,2),
    DIFERENCIA numeric(18,2))
AS
declare variable FECINIC char(10);
declare variable FECFINC char(10);
declare variable db char(1);
begin
DELETE FROM concilia_banco_conta_aux;
FOR select m.moba_tipodoc, m.moba_idref, m.moba_total, m.moba_fecha, m.moba_pref, m.moba_numero, m.moba_db
    from movimiento_banco m, cuentas_banco c
    where c.cuba_cod = m.cuba_cod and c.cuba_codcta = :banco and m.moba_fecha >= :FECINI and m.moba_fecha <= :FECFIN
    into :TIPO, :ID, :monto, :fecha, :pref, :numero, :db
    DO
    BEGIN
    SELECT TIDO_NOMCORTO FROM tipo_documento WHERE TIDO_COD = :tipo INTO :tipodoc;
    if (db = 'N') then
        monto = monto * -1;
    /* BUSQUE EL CONTABLE */
    montoc = 0;
    if (TIPO = 72) then
        begin
        TIPO = 62;
        select ch.cheq_idegreso from cheques ch where ch.cheq_id = :id into :id;
        end
    if (TIPO = 73) then
        begin
        TIPO = 62;
        select r.reti_idegreso from retiros r where r.reti_id = :id into :id;
        end

    SELECT sum(CODE_DEBITO-CODE_CREDITO) FROM comprobante_detalle D, comprobante_encabezado C
        where C.enco_consec = D.enco_consec AND C.enco_tiporef = :TIPO AND C.enco_idref = :ID AND D.cuen_cod = :ctabanco
        INTO :montoc;
    if (montoc is null) then
    montoc = 0;
    diferencia = (monto - montoc);
    if (DIFERENCIA <> 0) then
        SUSPEND;
    if (not exists(select cobc_id from concilia_banco_conta_aux where cobc_tipo = :tipo and cobc_id = :id)) then
        INSERT INTO concilia_banco_conta_aux (COBC_TIPO, COBC_ID) VALUES(:TIPO, :ID);
    END
/* AGREGUE LAS QUE NO TIENEN MOVBANCO */
fecha = null;
monto = 0;
EXECUTE PROCEDURE fecha_a_conta (:FECINI) returning_values (:FECINIC);
EXECUTE PROCEDURE fecha_a_conta (:FECFIN) returning_values (:FECFINC);
FOR SELECT e.tico_cod, e.enco_fecha, e.prco_pref, e.enco_numero, CODE_DEBITO-CODE_CREDITO, e.enco_tiporef, e.enco_idref FROM comprobante_detalle D, comprobante_encabezado e
    where e.enco_consec = D.enco_consec AND CUEN_COD = :ctabanco AND e.enco_fecha >= :fecinic AND e.enco_fecha <= :fecfinc AND
    not exists (select cobc_id FROM concilia_banco_conta_aux WHERE cobc_tipo = e.enco_tiporef and cobc_id = e.enco_idref)
    INTO :tipodoc, :fecconta, :pref, :numero, :montoc, :tipo, :id
    do
    BEGIN
    diferencia = montoc;
    SUSPEND;
    END
end
^

SET TERM ; ^

/* 20100723C */
/* configuracion para incluri cuentas mayores en reporte mayor y balance o solo afectables o ultimo nivel */
INSERT INTO CONFIGURACION (CONF_MODULO, CONF_CATEGORIA, CONF_PROPIEDAD, CONF_VALOR, CONF_POSIBLES, CONF_AYUDA) VALUES ('CONTABILIDAD', 'GENERAL', 'INCLUIR SOLO CUENTAS AFECTABLES EN LIBRO MAYOR Y BALANCES', 'SI', 'SI,NO', 'SI:Imprime solo las cuentas de último nivel sin cuentas mayores. NO: Incluye todas la cuentas mayores y afectables en el libro mayor y balance');
commit work;

SET TERM ^ ;

CREATE OR ALTER procedure MAYOR_Y_BALANCE (
    ANO char(4),
    MES integer,
    SIN_MOV char(1))
returns (
    CODIGO varchar(20),
    NOMBRE varchar(60),
    INIDB numeric(18,2),
    INICR numeric(18,2),
    DEBITOS numeric(18,2),
    CREDITOS numeric(18,2),
    FINDB numeric(18,2),
    FINCR numeric(18,2),
    NIVEL integer,
    INIDB1 numeric(18,2),
    INICR1 numeric(18,2),
    DEBITOS1 numeric(18,2),
    CREDITOS1 numeric(18,2),
    FINDB1 numeric(18,2),
    FINCR1 numeric(18,2))
AS
BEGIN
FOR SELECT CUEN_COD, CUEN_NOM FROM CUENTAS order by CUEN_COD INTO CODIGO, NOMBRE
DO
  BEGIN
  INICR = 0;
  EXECUTE PROCEDURE SALDO_CUENTA_MES(CODIGO, ANO, MES, 'S') RETURNING_VALUES (INIDB);
  if (INIDB < 0) then
    BEGIN
    INICR = INIDB * -1;
    INIDB = 0;
    END
  EXECUTE PROCEDURE MOVIMIENTO_CUENTA_MES(CODIGO, ANO, MES, 'S') RETURNING_VALUES(DEBITOS);
  EXECUTE PROCEDURE MOVIMIENTO_CUENTA_MES(CODIGO, ANO, MES, 'N') RETURNING_VALUES(CREDITOS);
  FINCR = 0;
  FINDB = INIDB - INICR + DEBITOS - CREDITOS;
  if (FINDB < 0) then
    BEGIN
    FINCR = FINDB * -1;
    FINDB = 0;
    END
  EXECUTE PROCEDURE VALIDE_ESTRUCTURA (CODIGO) RETURNING_VALUES (:NIVEL);
  if (NIVEL = 1) then
    BEGIN
    INIDB1 = INIDB;
    INICR1 = INICR;
    DEBITOS1 = DEBITOS;
    CREDITOS1 = CREDITOS;
    FINDB1 = FINDB;
    FINCR1 = FINCR;
    END
  ELSE
    BEGIN
    INIDB1 = 0;
    INICR1 = 0;
    DEBITOS1 = 0;
    CREDITOS1 = 0;
    FINDB1 = 0;
    FINCR1 = 0;
    END
  if ((SIN_MOV = 'S') or ((FINDB <> 0) OR (FINCR <> 0) or (INIDB <> 0) OR (INICR <> 0) or (DEBITOS <> 0) OR (CREDITOS <> 0) )) then
      SUSPEND;
  END
END
^

SET TERM ; ^


/* 20100726 */
/* string truncvation codpr estaba de 8c */

SET TERM ^ ;

CREATE OR ALTER TRIGGER MOVIMIENTO_ARTICULO_BI FOR MOVIMIENTO_ARTICULO
ACTIVE BEFORE INSERT POSITION 0
AS
declare variable LOTE CHAR(1);
declare variable ENSAMBLE CHAR(1);
declare variable IDENS INTEGER;
declare variable PREFENS VARCHAR(4);
declare variable unidad varchar(8);
declare variable DESCR varchar(60);
declare variable CODPR varchar(15);
declare variable DESPR varchar(60);
declare variable UNIPR varchar(8);
declare variable CANTPR numeric(18,4);
declare variable FACTOR numeric(18,4);
declare variable COSTO numeric(18,2);
declare variable COSTOTOT numeric(18,2);
declare variable PORCPR numeric(9,4);
declare variable MERMAPR numeric(9,4);
declare variable PESO numeric(18,4);
declare variable PESOPR numeric(18,4);
declare variable ITEM INTEGER;
declare variable IVA NUMERIC(9,4);
declare variable IVAM NUMERIC(18,2);
declare variable CONSUMO NUMERIC(18,2);
declare variable TOTAL float;
declare variable SALDO NUMERIC(18,4);
BEGIN
/* INSERTE EL NUEVO LOTE */
if (NEW.mvar_cant IS NULL) then
    NEW.mvar_cant = 0;
SELECT ARTI_EXIST
    FROM   ARTICULO
    WHERE  ARTICULO.ARTI_COD = NEW.ARTI_COD
    INTO :LOTE;
if (LOTE = 'L') then
    BEGIN
      if ((NEW.mvar_lote IS NULL) or (NEW.mvar_lote = '')) then
        if (new.mvar_entrada = 'S') then
            new.mvar_lote = cast(new.mvar_cons as varchar(15));
        else
            begin
            /* NO HAY LOTE, ENTONCES CALCULELO SEGUN CONFIGURACION */
            EXCEPTION LOTE_NEGATIVO 'No se indicó un lote para el artículo ' || new.arti_cod;
            end
    END
/* ENSAMBLE EL PRODUCTO */
SELECT ARTI_ENSAMBLE, ARTI_UNIDAD, ARTI_DES, ARTI_PESO
    FROM ARTICULO WHERE ARTI_COD = NEW.arti_cod INTO :ensamble, :unidad, :descr, :peso;
if ((NEW.mvar_entrada = 'N') AND (ENSAMBLE = 'S')) then
    BEGIN
    /* verifique si la existecia es insufieciente */
/*    INSERT INTO audi_trig (EVENTO) VALUES ('movarti_bi ensamble' || NEW.arti_cod);*/
    execute procedure saldo_inventario(new.arti_cod, new.bode_cod, new.mvar_fecha) returning_values (:saldo);
/*    INSERT INTO audi_trig (EVENTO) VALUES ('movarti_bi ensamble ' || NEW.arti_cod || ' cant:' || new.mvar_cant || ' saldo:' || :saldo);*/
    if (NEW.mvar_cant > :SALDO) then
        BEGIN
        if (SALDO > 0) then
            SALDO = NEW.mvar_cant - :SALDO;
        else
            SALDO = NEW.mvar_cant;
        IDENS = gen_id(id_ensamble, 1);
        EXECUTE PROCEDURE lee_configuracion('INVENTARIO', 'ENSAMBLES', 'PREFIJO PARA ENSAMBLES AUTOMATICOS AL SACAR PRODUCTOS') returning_values (:prefens);
        /* CALCULE EL COSTO TOTAL DEL ENSAMBLE */
        select sum(arpr_porc) from articulos_producto where arti_cod = NEW.arti_cod into :total;
        COSTOTOT = 0;
        FOR SELECT ARPR_CANT, ARPR_UNIDAD, ARPR_COMP, ARPR_PORC, ARPR_MERMA, ARTI_PESO
            FROM articulos_producto P, ARTICULO A
            WHERE P.ARTI_COD = NEW.arti_cod AND A.arti_cod = P.arpr_comp
            INTO :CANTPR, :UNIPR, :CODPR, :PORCPR, :MERMAPR, :PESOPR
            DO
            BEGIN
            EXECUTE PROCEDURE factor_unidad_cant(:codpr, :unipr) returning_values (:factor);
            EXECUTE PROCEDURE costo_promedio_unidad (:codpr, NEW.mvar_fecha, :UNIPR) returning_values (:COSTO);
            IVAM = costo * cantpr * iva / 100;
            if (((cantpr is null) or (cantpr = 0)) AND (porcpr IS NOT NULL) AND (porcpr <> 0)) then
                BEGIN
                /* ES PORCENTUAL AL PESO LA MEZCLA SOBRE EL 1ER ARTICULO */
                CANTPR = :SALDO * PESO;
                CANTPR = CANTPR / TOTAL * porcpr; /* APLICA LA PROPORCION */
                if ((mermapr IS NOT NULL) AND (mermapr <> 0)) then
                    CANTPR = CANTPR * (100 + mermapr) / 100;
                END
            ELSE
                BEGIN
                CANTPR = CANTPR * :SALDO * pesopr;
                END
            COSTOTOT = COSTOTOT + COSTO * CANTPR;
            END
        if (NEW.mvar_cant <> 0) then
            COSTO = costotot / NEW.mvar_cant;
        else
            COSTO = 0;
        INSERT INTO ENSAMBLES(ENSA_ID, TIDO_COD, PREF_PRE, BODE_COD, ENSA_NUMERO, ENSA_FECHA, ENSA_CONC, ENSA_REFER, ENSA_CANT, ENSA_UNIDAD, ENSA_FACTOR, ENSA_ANULADO, ENSA_TRANSMIT,
            ARTI_COD, ENSA_DESC, ENSA_CODBAR, ENSA_LOTE, ENSA_OBS, TERC_NIT, ENSA_USUARIO, NUMOK, ENSA_COSTO, LOTE_VENCE, ENSA_CODRETAL, ENSA_CANTRETAL, ENSA_OPER, ENSA_MAQUINA, ENSA_PESO, ENSA_BODRETAL, ENSA_TIPOREF, ENSA_IDREF)
            VALUES (:IDENS, 15, :prefens, NEW.bode_cod, '000001', new.mvar_fecha, new.mvar_conc, '', :SALDO, :unidad, 1, 'N', 'N',
            NEW.arti_cod, :descr, NEW.arti_cod, NEW.mvar_lote, NULL, NULL, USER, 'N', :costo, NULL, NULL, 0, null,  NULL, 0, NEW.bode_cod, NEW.mvar_tipodoc, NEW.mvar_idref);
        /* LOS DETALLES DEL ENSAMBLE */
        ITEM = 0;
        FOR SELECT ARPR_CANT, ARPR_UNIDAD, ARPR_COMP, ARTI_DES, TAIV_PORC, ARTI_CONSUMO, ARPR_PORC, ARPR_MERMA, ARTI_PESO
            FROM articulos_producto P, ARTICULO A, TARIFA_IVA T
            WHERE P.ARTI_COD = NEW.arti_cod AND A.arti_cod = P.arpr_comp AND A.taiv_cod = T.taiv_cod
            INTO :CANTPR, :UNIPR, :CODPR, :DESPR, :IVA, :CONSUMO, :PORCPR, :MERMAPR, :PESOPR
            DO
            BEGIN
            ITEM = ITEM + 1;
            EXECUTE PROCEDURE factor_unidad_cant(:codpr, :unipr) returning_values (:factor);
            EXECUTE PROCEDURE costo_promedio_unidad (:codpr, NEW.mvar_fecha, :UNIPR) returning_values (:COSTO);
            IVAM = costo * cantpr * iva / 100;
            if (((cantpr is null) or (cantpr = 0)) AND (porcpr IS NOT NULL) AND (porcpr <> 0)) then
                BEGIN
                /* ES PORCENTUAL AL PESO LA MEZCLA SOBRE EL 1ER ARTICULO */
                CANTPR = :SALDO * PESO;
                CANTPR = CANTPR / TOTAL * porcpr; /* APLICA LA PROPORCION */
                if ((mermapr IS NOT NULL) AND (mermapr <> 0)) then
                    CANTPR = CANTPR * (100 + mermapr) / 100;
/*                CANTPR = CANTPR / pesopr; /* LO LLEVA A LA UNIDAD PRINCIPAL */
                UNIPR = 'GRAMO';
                END
            ELSE
                BEGIN
                CANTPR = CANTPR * :SALDO * pesopr;
                END
            INSERT INTO ENSAMBLES_DETALLE(ENSA_ID, ESDE_ITEM, ARTI_COD, BODE_COD, ESDE_CANT, ESDE_UNIDAD, ESDE_COSTO, ESDE_LOTE, ESDE_FACTOR, ESDE_IVAPORC, ESDE_IVAMONTO, ESDE_CONSUMO, ESDE_CODBAR, ESDE_ANULADO, ESDE_TRANSMIT, ESDE_DESC, ESDE_TOTAL, ESDE_PESO)
                VALUES (:idens, :ITEM, :codpr,  NEW.bode_cod, :cantpr, :unipr, :costo, NULL, :FACTOR, :IVA, :ivam, :consumo, :codpr, 'N', 'N', :despr, :COSTO * :cantpr, 0);
            END
        END
    END
if (new.mvar_cons is null) then
    NEW.mvar_cons = GEN_ID(ID_MOVARTI,1);
END
^

SET TERM ; ^


/* 20100727 */

SET TERM ^ ;

CREATE OR ALTER procedure CONCILIA_CARTERA_DET (
    FECINI date,
    FECFIN date,
    CTACART varchar(20),
    NIT varchar(20),
    SOLODIF char(1))
returns (
    FECHA date,
    TIPODOC varchar(10),
    TIPO INTEGER,
    ID INTEGER,
    PREF varchar(4),
    NUMERO varchar(6),
    MONTO numeric(18,2),
    FECCONTA char(10),
    MONTOC numeric(18,2),
    DIFERENCIA numeric(18,2))
AS
declare variable FECINIC char(10);
declare variable FECFINC char(10);
declare variable DB CHAR(1);
declare variable RTFTE NUMERIC(18,2);
declare variable RTIVA NUMERIC(18,2);
declare variable RTICA NUMERIC(18,2);
begin
FOR select MVCL_TIPOREF, MVCL_IDREF, MVCL_MONTO, MVCL_FECHA, MVCL_PREFREF, MVCL_NUMREF, MVCL_DEBITO, MVCL_RTEFTE, MVCL_RTEIVA, MVCL_RTEICA
    from movimiento_clientes
    where TERC_NIT = :NIT and MVCL_FECHA >= :FECINI and MVCL_FECHA <= :FECFIN
    into :TIPO, :ID, :MONTO, :fecha, :pref, :numero, :DB, :RTFTE, :RTIVA, :RTICA
    DO
    BEGIN
    SELECT TIDO_NOMCORTO FROM tipo_documento WHERE TIDO_COD = :tipo INTO :tipodoc;
    MONTO = MONTO - RTFTE -RTIVA - RTICA;
    if (DB = 'N') then
        MONTO = MONTO * -1;
    /* BUSQUE EL CONTABLE */
    MONTOC = NULL;
    SELECT SUM(CODE_DEBITO-CODE_CREDITO) FROM comprobante_detalle D, comprobante_encabezado C
        where C.enco_consec = D.enco_consec AND C.enco_tiporef = :TIPO AND C.enco_idref = :ID AND D.cuen_cod = :ctacart
        INTO :montoc;
    if (MONTOC IS NULL) then
        BEGIN
/*        EXECUTE PROCEDURE fecha_a_conta (:FECHA) returning_values (:FECCONTA);
        SELECT SUM(CODE_DEBITO-CODE_CREDITO) FROM comprobante_detalle D, comprobante_encabezado C
            where C.enco_consec = D.enco_consec AND C.enco_fecha = :fecconta AND D.cuen_cod = :ctacart AND C.enco_numero = :numero
            INTO :montoc;
        if (MONTOC IS NULL) then*/
            MONTOC = 0;
        END
    diferencia = MONTO - MONTOC;
    if ((SOLODIF = 'N') or (DIFERENCIA <> 0)) then
        SUSPEND;
    END
/* AGREGUE LAS QUE NO TIENEN IDREF */
MONTO = 0;
EXECUTE PROCEDURE fecha_a_conta (:FECINI) returning_values (:FECINIC);
EXECUTE PROCEDURE fecha_a_conta (:FECFIN) returning_values (:FECFINC);
FOR SELECT C.tico_cod, C.enco_fecha, C.prco_pref, C.enco_numero, CODE_DEBITO-CODE_CREDITO FROM comprobante_detalle D, comprobante_encabezado C
    where C.enco_consec = D.enco_consec AND CUEN_COD = :ctacart AND D.terc_nit = :NIT AND C.enco_fecha >= :fecinic AND C.enco_fecha <= :fecfinc AND C.enco_idref = 0
    INTO :tipodoc, :fecconta, :pref, :numero, :montoc
    do
    BEGIN
    diferencia = MONTO - MONTOC;
    SUSPEND;
    END
end
^

SET TERM ; ^


/* 20100728 */
/* CONTADO/CREDITO NO TENIA EN CUENTA APLICACIONES */
SET TERM ^ ;

CREATE OR ALTER procedure REP_COMPROBANTES_FAC (
    TIPO integer,
    DETALLE char(1),
    FECINI date,
    FECFIN date,
    PREFINI varchar(4),
    PREFFIN varchar(4),
    PTOINI integer,
    PTOFIN integer,
    ANULADOS char(1),
    SUBEMPRESA integer)
returns (
    NOMTIPO varchar(30),
    ID integer,
    PREF varchar(4),
    NUMERO varchar(6),
    FECHA date,
    VENCE date,
    CODBOD varchar(2),
    NOMBOD varchar(30),
    AUTORIZA varchar(20),
    PTVTID integer,
    PTVTNOM varchar(60),
    VENDCOD integer,
    VENDNOM varchar(60),
    COMIPORC numeric(9,2),
    COMIMONTO numeric(18,2),
    NIT varchar(20),
    NOMTERCERO varchar(60),
    SUCURSAL varchar(10),
    PEDIDO varchar(30),
    COTIZACI varchar(30),
    REMISION varchar(30),
    OBS varchar(255),
    ITEM integer,
    ARTICULO varchar(15),
    CODBAR varchar(15),
    ARTIDES varchar(60),
    CANT numeric(18,4),
    UNIDAD varchar(8),
    BODITEM varchar(2),
    LOTE varchar(15),
    REFERENCIA varchar(60),
    PRECIO numeric(18,2),
    DTOPORCIT numeric(9,2),
    DTOMONTOIT numeric(18,2),
    IVAPORCIT numeric(9,2),
    IVAMONTOIT numeric(18,2),
    CONSUMOIT numeric(18,2),
    SUBTOTALIT numeric(18,2),
    DTOPOR numeric(9,2),
    DTOMONTO numeric(18,2),
    ADICIONAL numeric(18,2),
    IVAMONTO numeric(18,2),
    RTFTEPOR numeric(9,2),
    RTFTEMONTO numeric(18,2),
    RTIVAPOR numeric(9,2),
    RTIVAMONTO numeric(18,2),
    RTICAPOR numeric(9,2),
    RTICAMONTO numeric(18,2),
    EXTRA numeric(18,2),
    DTOFPOR numeric(9,2),
    DTOFMONTO numeric(18,2),
    DTOFFECHA date,
    TOTAL numeric(18,2),
    ANULADO char(1),
    VEHICULO varchar(8),
    FECREG date,
    HORAREG time,
    CONTADO numeric(18,2),
    CREDITO numeric(18,2))
AS
declare variable descaux varchar(255);
declare variable APLICA NUMERIC(18,2);
BEGIN
VEHICULO = '';
  /* DETERMINE LA TABLA A EXAMINAR */
  if (BIN_AND(TIPO, 1) <> 0) then
    BEGIN
    SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 31 INTO :NOMTIPO;
    FOR SELECT FACT_ID, F.PREF_PRE, FACT_NUMERO, FACT_FECHA, FACT_VENCE, F.BODE_COD, B.BODE_NOM, F.AUTO_NUMERO, F.PTVT_ID, PTVT_NOM, F.VEND_COD, VEND_NOMBRE, F.FACT_COMIPORC, F.FACT_COMIMONTO, F.TERC_NIT, FACT_NOMCLIENTE, FACT_PEDIDO, FACT_COTIZACI, FACT_REMISION, FACT_DTOPOR, FACT_DTOMONTO, FACT_ADICIONAL, FACT_IVAMONTO, FACT_RTFTEPOR, FACT_RTFTEMONTO, FACT_RTIVAPOR, FACT_RTIVAMONTO, FACT_RTICAPOR, FACT_RTICAMONTO, FACT_EXTRA, FACT_DTOFPOR, FACT_DTOFMONTO, FACT_DTOFFECHA, FACT_TOTAL, FACT_ANULADO, VEHI_COD, SUBSTRING(FACT_OBS FROM 1 FOR 255), FACT_SUCURSAL
        FROM FACTURAS F, BODEGA B, PUNTO_VENTA P, VENDEDORES V, PREFIJOS PR WHERE F.PTVT_ID >= :PTOINI AND F.PTVT_ID <= :PTOFIN AND
         F.BODE_COD = B.BODE_COD AND F.PTVT_ID = P.PTVT_ID AND F.VEND_COD = V.VEND_COD AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN
         AND PR.PREF_PRE = F.PREF_PRE AND PR.TIDO_COD = 31 AND ((PR.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) AND
         F.PREF_PRE >= :prefini AND F.PREF_PRE <= :preffin
        ORDER BY FACT_FECHA, FACT_ID
        INTO :ID, :PREF, :NUMERO, :FECHA, :VENCE, :CODBOD, :NOMBOD, :AUTORIZA, :PTVTID, :PTVTNOM, :VENDCOD, :VENDNOM, :COMIPORC, :COMIMONTO, :NIT, :NOMTERCERO, :PEDIDO, :COTIZACI, :REMISION, :DTOPOR, :DTOMONTO, :ADICIONAL, :IVAMONTO, :RTFTEPOR, :RTFTEMONTO, :RTIVAPOR, :RTIVAMONTO, :RTICAPOR, :RTICAMONTO, :EXTRA, :DTOFPOR, :DTOFMONTO, :DTOFFECHA, :TOTAL, :ANULADO, :VEHICULO, :OBS, :sucursal
        DO
        BEGIN
        if ((ANULADOS = 'S') or (ANULADO = 'N')) then
            BEGIN
            SELECT SUM(RCDE_ABONO+RCDE_DTOF) FROM RECIBOS_CAJA_DETALLE D, RECIBOS_CAJA R
                WHERE D.rcde_tipodoc = 31 AND D.rcde_iddoc = :id AND R.reca_id = D.reca_id AND RECA_FECHA = :FECHA AND RCDE_ANULADO = 'N'
                INTO :CONTADO;
            if (CONTADO IS NULL) then
                CONTADO = 0;
            SELECT SUM(D.acde_aplicado) FROM aplicacion_cliente_detalle D, aplicacion_cliente P
                WHERE D.acde_tipodoc = 31 AND D.acde_iddoc = :id AND P.apcl_id = D.apcl_id AND APCL_FECHA = :FECHA AND ACDE_ANULADO = 'N'
                INTO :aplica;
            if (APLICA IS NULL) then
                APLICA = 0;
            CONTADO = CONTADO + APLICA;
            CREDITO = TOTAL - CONTADO;
            SELECT AUDI_FECHA, AUDI_HORA FROM AUDITORIA
                WHERE AUDI_IDDOC = :ID AND TIDO_COD = 31 AND AUDI_OPER = 'I' INTO :FECREG, :HORAREG;
            if (anulado = 'S') then
                BEGIN
                COMIPORC = 0;
                COMIMONTO = 0;
                DTOPOR = 0;
                DTOMONTO = 0;
                ADICIONAL = 0;
                IVAMONTO = 0;
                RTFTEPOR = 0;
                RTFTEMONTO = 0;
                RTIVAPOR = 0;
                RTIVAMONTO = 0;
                RTICAPOR = 0;
                RTICAMONTO = 0;
                EXTRA = 0;
                DTOFPOR = 0;
                DTOFMONTO = 0;
                TOTAL = 0;
                END
            if (DETALLE = 'S') then
                BEGIN
                if (anulado = 'S') then
                    BEGIN
                    ITEM = 0;
                    ARTICULO = '';
                    CODBAR = '';
                    ARTIDES = '';
                    CANT = 0;
                    UNIDAD = '';
                    BODITEM = '';
                    LOTE = '';
                    REFERENCIA = '';
                    PRECIO = 0;
                    DTOPORCIT = 0;
                    DTOMONTOIT = 0;
                    IVAPORCIT = 0;
                    IVAMONTOIT = 0;
                    CONSUMOIT = 0;
                    SUBTOTALIT = 0;
                    SUSPEND;
                    END
                ELSE
                    BEGIN
                    FOR SELECT FADE_ITEM, ARTI_COD, FADE_CODBAR, FADE_DESC, FADE_CANT, FADE_UNIDAD, BODE_COD, FADE_LOTE, FADE_REFERENCIA, FADE_PRUNIT, FADE_DTOPORC, FADE_DTOMONTO, FADE_IVAPORC, FADE_IVAMONTO, FADE_CONSUMO, FADE_TOTAL
                        FROM FACTURAS_DETALLE
                        WHERE FACT_ID = :ID and substring(arti_cod from 1 FOR 2) <> '.t'
                        ORDER BY FADE_ITEM
                        INTO :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :BODITEM, :LOTE, :REFERENCIA, :PRECIO, :DTOPORCIT, :DTOMONTOIT, :IVAPORCIT, :IVAMONTOIT, :CONSUMOIT, :SUBTOTALIT
                        DO
                        SUSPEND;
                    END
                END
            ELSE
                SUSPEND;
            END
        END
    END
  if (BIN_AND(TIPO, 2) <> 0) then
    BEGIN
    SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 32 INTO :NOMTIPO;
    FOR SELECT REVT_ID, R.PREF_PRE, REVT_NUMERO, REVT_FECHA, REVT_FECHA VENCE, R.BODE_COD, B.BODE_NOM, '', R.PTVT_ID, PTVT_NOM, R.VEND_COD, VEND_NOMBRE, 0, 0, R.TERC_NIT, REVT_NOMTERC, '', '', '', 0, 0, 0, REVT_IVAMONTO, 0, 0, 0, 0, 0, 0, 0, 0, 0, REVT_FECHA DTOF, REVT_TOTAL, REVT_ANULADO, SUBSTRING(REVT_OBS FROM 1 FOR 255), REVT_SUCURSAL
        FROM REMISIONES_VENTA R, BODEGA B, PUNTO_VENTA P, VENDEDORES V, PREFIJOS PR WHERE R.PTVT_ID >= :PTOINI AND R.PTVT_ID <= :PTOFIN AND
         R.BODE_COD = B.BODE_COD AND R.PTVT_ID = P.PTVT_ID AND R.VEND_COD = V.VEND_COD AND REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN
         AND PR.PREF_PRE = R.PREF_PRE AND PR.TIDO_COD = 32 AND ((PR.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) AND
         R.PREF_PRE >= :prefini AND R.PREF_PRE <= :preffin
        ORDER BY REVT_FECHA, REVT_ID
        INTO :ID, :PREF, :NUMERO, :FECHA, :VENCE, :CODBOD, :NOMBOD, :AUTORIZA, :PTVTID, :PTVTNOM, :VENDCOD, :VENDNOM, :COMIPORC, :COMIMONTO, :NIT, :NOMTERCERO, :PEDIDO, :COTIZACI, :REMISION, :DTOPOR, :DTOMONTO, :ADICIONAL, :IVAMONTO, :RTFTEPOR, :RTFTEMONTO, :RTIVAPOR, :RTIVAMONTO, :RTICAPOR, :RTICAMONTO, :EXTRA, :DTOFPOR, :DTOFMONTO, :DTOFFECHA, :TOTAL, :ANULADO, :OBS, :sucursal
        DO
        BEGIN
        if ((ANULADOS = 'S') or (ANULADO = 'N')) then
            BEGIN
            SELECT AUDI_FECHA, AUDI_HORA FROM AUDITORIA
                WHERE AUDI_IDDOC = :ID AND TIDO_COD = 32 AND AUDI_OPER = 'I' INTO :FECREG, :HORAREG;
            CONTADO = 0;
            CREDITO = TOTAL;
            if (anulado = 'S') then
                BEGIN
                COMIPORC = 0;
                COMIMONTO = 0;
                DTOPOR = 0;
                DTOMONTO = 0;
                ADICIONAL = 0;
                IVAMONTO = 0;
                RTFTEPOR = 0;
                RTFTEMONTO = 0;
                RTIVAPOR = 0;
                RTIVAMONTO = 0;
                RTICAPOR = 0;
                RTICAMONTO = 0;
                EXTRA = 0;
                DTOFPOR = 0;
                DTOFMONTO = 0;
                TOTAL = 0;
                END
            if (DETALLE = 'S') then
                BEGIN
                if (anulado = 'S') then
                    BEGIN
                    ITEM = 0;
                    ARTICULO = '';
                    CODBAR = '';
                    ARTIDES = '';
                    CANT = 0;
                    UNIDAD = '';
                    BODITEM = '';
                    LOTE = '';
                    REFERENCIA = '';
                    PRECIO = 0;
                    DTOPORCIT = 0;
                    DTOMONTOIT = 0;
                    IVAPORCIT = 0;
                    IVAMONTOIT = 0;
                    CONSUMOIT = 0;
                    SUBTOTALIT = 0;
                    SUSPEND;
                    END
                ELSE
                    BEGIN
                    FOR SELECT RVDE_ITEM, ARTI_COD, RVDE_CODBAR, RVDE_DESC, RVDE_CANT, RVDE_UNIDAD, BODE_COD, RVDE_LOTE, RVDE_REFERENCIA, RVDE_PRUNIT, RVDE_DTOPORC, RVDE_DTOMONTO, RVDE_IVAPORC, RVDE_IVAMONTO, RVDE_CONSUMO, RVDE_TOTAL
                        FROM REMISIONES_VENTA_DETALLE
                        WHERE REVT_ID = :ID
                        ORDER BY RVDE_ITEM
                        INTO :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :BODITEM, :LOTE, :REFERENCIA, :PRECIO, :DTOPORCIT, :DTOMONTOIT, :IVAPORCIT, :IVAMONTOIT, :CONSUMOIT, :SUBTOTALIT
                        DO
                        SUSPEND;
                    END
                END
            ELSE
                SUSPEND;
            END
        END
    END
  if (BIN_AND(TIPO, 4) <> 0) then
    BEGIN
    SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 33 INTO :NOMTIPO;
    FOR SELECT DEVT_ID, D.PREF_PRE, DEVT_NUMERO, DEVT_FECHA, DEVT_FECHA VENCE, D.BODE_COD, B.BODE_NOM, '', D.PTVT_ID, PTVT_NOM, D.VEND_COD, VEND_NOMBRE, DEVT_COMIPORC, DEVT_COMIMONTO, D.TERC_NIT, DEVT_NOMTERC, '', '', '', DEVT_DTOPOR, DEVT_DTOMONTO, DEVT_ADICIONAL, DEVT_IVAMONTO, DEVT_RTFTEPORC, DEVT_RTFTEMONTO, DEVT_RTIVAPORC, DEVT_RTIVAMONTO, DEVT_RTICAPORC, DEVT_RTICAMONTO, DEVT_EXTRA, 0, 0, DEVT_FECHA DTOF, DEVT_TOTAL, DEVT_ANULADO, SUBSTRING(DEVT_OBS FROM 1 FOR 255), DEVT_SUCURSAL
        FROM DEVOLUCIONES_VENTAS D, BODEGA B, PUNTO_VENTA P, VENDEDORES V, PREFIJOS PR WHERE D.PTVT_ID >= :PTOINI AND D.PTVT_ID <= :PTOFIN AND
         D.BODE_COD = B.BODE_COD AND D.PTVT_ID = P.PTVT_ID AND D.VEND_COD = V.VEND_COD AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN
         AND PR.PREF_PRE = D.PREF_PRE AND PR.TIDO_COD = 33 AND ((PR.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) AND
         D.PREF_PRE >= :prefini AND D.PREF_PRE <= :preffin
        ORDER BY DEVT_FECHA, DEVT_ID
        INTO :ID, :PREF, :NUMERO, :FECHA, :VENCE, :CODBOD, :NOMBOD, :AUTORIZA, :PTVTID, :PTVTNOM, :VENDCOD, :VENDNOM, :COMIPORC, :COMIMONTO, :NIT, :NOMTERCERO, :PEDIDO, :COTIZACI, :REMISION, :DTOPOR, :DTOMONTO, :ADICIONAL, :IVAMONTO, :RTFTEPOR, :RTFTEMONTO, :RTIVAPOR, :RTIVAMONTO, :RTICAPOR, :RTICAMONTO, :EXTRA, :DTOFPOR, :DTOFMONTO, :DTOFFECHA, :TOTAL, :ANULADO, :OBS, :sucursal
        DO
        BEGIN
        if ((ANULADOS = 'S') or (ANULADO = 'N')) then
            BEGIN
            SELECT AUDI_FECHA, AUDI_HORA FROM AUDITORIA
                WHERE AUDI_IDDOC = :ID AND TIDO_COD = 33 AND AUDI_OPER = 'I' INTO :FECREG, :HORAREG;
            SELECT SUM(RCDE_ABONO+RCDE_DTOF) FROM RECIBOS_CAJA_DETALLE D, RECIBOS_CAJA R
                WHERE D.rcde_tipodoc = 33 AND D.rcde_iddoc = :id AND R.reca_id = D.reca_id AND RECA_FECHA = :FECHA AND RCDE_ANULADO = 'N'
                INTO :CONTADO;
            if (CONTADO IS NULL) then
                CONTADO = 0;
            ELSE
                CONTADO = CONTADO * -1;
            SELECT SUM(D.acde_aplicado) FROM aplicacion_cliente_detalle D, aplicacion_cliente P
                WHERE D.acde_tipodoc = 33 AND D.acde_iddoc = :id AND P.apcl_id = D.apcl_id AND APCL_FECHA = :FECHA AND ACDE_ANULADO = 'N'
                INTO :aplica;
            if (APLICA IS NULL) then
                APLICA = 0;
            ELSE
                APLICA = APLICA * -1;
            CONTADO = CONTADO + APLICA;
            CREDITO = TOTAL - CONTADO;
            if (anulado = 'S') then
                BEGIN
                COMIPORC = 0;
                COMIMONTO = 0;
                DTOPOR = 0;
                DTOMONTO = 0;
                ADICIONAL = 0;
                IVAMONTO = 0;
                RTFTEPOR = 0;
                RTFTEMONTO = 0;
                RTIVAPOR = 0;
                RTIVAMONTO = 0;
                RTICAPOR = 0;
                RTICAMONTO = 0;
                EXTRA = 0;
                DTOFPOR = 0;
                DTOFMONTO = 0;
                TOTAL = 0;
                END
            if (DETALLE = 'S') then
                BEGIN
                if (anulado = 'S') then
                    BEGIN
                    ITEM = 0;
                    ARTICULO = '';
                    CODBAR = '';
                    ARTIDES = '';
                    CANT = 0;
                    UNIDAD = '';
                    BODITEM = '';
                    LOTE = '';
                    REFERENCIA = '';
                    PRECIO = 0;
                    DTOPORCIT = 0;
                    DTOMONTOIT = 0;
                    IVAPORCIT = 0;
                    IVAMONTOIT = 0;
                    CONSUMOIT = 0;
                    SUBTOTALIT = 0;
                    SUSPEND;
                    END
                ELSE
                    BEGIN
                    FOR SELECT DVDE_ITEM, ARTI_COD, DVDE_CODBAR, DVDE_DESC, DVDE_CANT, DVDE_UNIDAD, BODE_COD, DVDE_LOTE, DVDE_REFERENCIA, DVDE_PRUNIT, DVDE_DTOPORC, DVDE_DTOMONTO, DVDE_IVAPORC, DVDE_IVAMONTO, DVDE_CONSUMO, DVDE_TOTAL
                        FROM DEVOLUCIONES_VENTAS_DETALLE
                        WHERE DEVT_ID = :ID and substring(arti_cod from 1 FOR 2) <> '.t'
                        ORDER BY DVDE_ITEM
                        INTO :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :BODITEM, :LOTE, :REFERENCIA, :PRECIO, :DTOPORCIT, :DTOMONTOIT, :IVAPORCIT, :IVAMONTOIT, :CONSUMOIT, :SUBTOTALIT
                        DO
                        SUSPEND;
                    END
                END
            ELSE
                SUSPEND;
            END
        END
    END
  if (BIN_AND(TIPO, 8) <> 0) then
    BEGIN
    SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 34 INTO :NOMTIPO;
    FOR SELECT PEDI_ID, P.PREF_PRE, PEDI_NUMERO, PEDI_FECHA, PEDI_FECHA VENCE, '', '', '', P.PTVT_ID, PTVT_NOM, P.VEND_COD, VEND_NOMBRE, 0, 0, P.TERC_NIT, PEDI_NOMTERC, '', '', '', PEDI_DTOPOR, PEDI_DTOMONTO, PEDI_ADICIONAL, PEDI_IVAMONTO, 0, 0, 0, 0, 0, 0, PEDI_EXTRA, 0, 0, PEDI_FECHA DTOF, PEDI_TOTAL, PEDI_ANULADO, SUBSTRING(PEDI_OBS FROM 1 FOR 255), PEDI_SUCURSAL
        FROM PEDIDOS P, PUNTO_VENTA PT, VENDEDORES V, PREFIJOS PR WHERE P.PTVT_ID >= :PTOINI AND P.PTVT_ID <= :PTOFIN AND
         P.PTVT_ID = PT.PTVT_ID AND P.VEND_COD = V.VEND_COD AND PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN
         AND PR.PREF_PRE = P.PREF_PRE AND PR.TIDO_COD = 34 AND ((PR.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) AND
         P.PREF_PRE >= :prefini AND P.PREF_PRE <= :preffin
        ORDER BY PEDI_FECHA, PEDI_ID
        INTO :ID, :PREF, :NUMERO, :FECHA, :VENCE, :CODBOD, :NOMBOD, :AUTORIZA, :PTVTID, :PTVTNOM, :VENDCOD, :VENDNOM, :COMIPORC, :COMIMONTO, :NIT, :NOMTERCERO, :PEDIDO, :COTIZACI, :REMISION, :DTOPOR, :DTOMONTO, :ADICIONAL, :IVAMONTO, :RTFTEPOR, :RTFTEMONTO, :RTIVAPOR, :RTIVAMONTO, :RTICAPOR, :RTICAMONTO, :EXTRA, :DTOFPOR, :DTOFMONTO, :DTOFFECHA, :TOTAL, :ANULADO, :OBS, :sucursal
        DO
        BEGIN
        if ((ANULADOS = 'S') or (ANULADO = 'N')) then
            BEGIN
            SELECT AUDI_FECHA, AUDI_HORA FROM AUDITORIA
                WHERE AUDI_IDDOC = :ID AND TIDO_COD = 34 AND AUDI_OPER = 'I' INTO :FECREG, :HORAREG;
            CONTADO = 0;
            CREDITO = TOTAL;
            if (anulado = 'S') then
                BEGIN
                COMIPORC = 0;
                COMIMONTO = 0;
                DTOPOR = 0;
                DTOMONTO = 0;
                ADICIONAL = 0;
                IVAMONTO = 0;
                RTFTEPOR = 0;
                RTFTEMONTO = 0;
                RTIVAPOR = 0;
                RTIVAMONTO = 0;
                RTICAPOR = 0;
                RTICAMONTO = 0;
                EXTRA = 0;
                DTOFPOR = 0;
                DTOFMONTO = 0;
                TOTAL = 0;
                END
            if (DETALLE = 'S') then
                BEGIN
                if (anulado = 'S') then
                    BEGIN
                    ITEM = 0;
                    ARTICULO = '';
                    CODBAR = '';
                    ARTIDES = '';
                    CANT = 0;
                    UNIDAD = '';
                    BODITEM = '';
                    LOTE = '';
                    REFERENCIA = '';
                    PRECIO = 0;
                    DTOPORCIT = 0;
                    DTOMONTOIT = 0;
                    IVAPORCIT = 0;
                    IVAMONTOIT = 0;
                    CONSUMOIT = 0;
                    SUBTOTALIT = 0;
                    SUSPEND;
                    END
                ELSE
                    BEGIN
                    FOR SELECT PEDE_ITEM, ARTI_COD, PEDE_CODBAR, PEDE_DESC, PEDE_CANT, PEDE_UNIDAD, '', '', PEDE_REFERENCIA, PEDE_PRUNIT, PEDE_DTOPORC, PEDE_DTOMONTO, PEDE_IVAPORC, PEDE_IVAMONTO, PEDE_CONSUMO, PEDE_TOTAL
                        FROM PEDIDOS_DETALLE
                        WHERE PEDI_ID = :ID
                        ORDER BY PEDE_ITEM
                        INTO :ITEM, :ARTICULO, :CODBAR, :descaux, :CANT, :UNIDAD, :BODITEM, :LOTE, :REFERENCIA, :PRECIO, :DTOPORCIT, :DTOMONTOIT, :IVAPORCIT, :IVAMONTOIT, :CONSUMOIT, :SUBTOTALIT
                        DO
                         begin
                          if (STRLEN(descaux)> 60 ) then
                            ARTIDES = SUBSTR(descaux,1,60);
                          ELSE
                            ARTIDES = :descaux;
                         end
                        SUSPEND;
                    END
                END
            ELSE
                SUSPEND;
            END
        END
    END
  if (BIN_AND(TIPO, 16) <> 0) then
    BEGIN
    SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 35 INTO :NOMTIPO;
    FOR SELECT COTI_ID, C.PREF_PRE, COTI_NUMERO, COTI_FECHA, COTI_FECHA VENCE, '', '', '', C.PTVT_ID, PTVT_NOM, C.VEND_COD, VEND_NOMBRE, 0, 0, C.TERC_NIT, COTI_NOMTERC, '', '', '', COTI_DTOPORC, COTI_DTOMONTO, COTI_ADICIONAL, COTI_IVAMONTO, 0, 0, 0, 0, 0, 0, COTI_EXTRA, 0, 0, COTI_FECHA DTOF, COTI_TOTAL, COTI_ANULADO, SUBSTRING(COTI_OBS FROM 1 FOR 255), COTI_SUCURSAL
        FROM COTIZACIONES C, PUNTO_VENTA P, VENDEDORES V, PREFIJOS PR WHERE C.PTVT_ID >= :PTOINI AND C.PTVT_ID <= :PTOFIN AND
         C.PTVT_ID = P.PTVT_ID AND C.VEND_COD = V.VEND_COD AND COTI_FECHA >= :FECINI AND COTI_FECHA <= :FECFIN
         AND PR.PREF_PRE = C.PREF_PRE AND PR.TIDO_COD = 35 AND ((PR.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) AND
         C.PREF_PRE >= :prefini AND C.PREF_PRE <= :preffin
        ORDER BY COTI_FECHA, COTI_ID
        INTO :ID, :PREF, :NUMERO, :FECHA, :VENCE, :CODBOD, :NOMBOD, :AUTORIZA, :PTVTID, :PTVTNOM, :VENDCOD, :VENDNOM, :COMIPORC, :COMIMONTO, :NIT, :NOMTERCERO, :PEDIDO, :COTIZACI, :REMISION, :DTOPOR, :DTOMONTO, :ADICIONAL, :IVAMONTO, :RTFTEPOR, :RTFTEMONTO, :RTIVAPOR, :RTIVAMONTO, :RTICAPOR, :RTICAMONTO, :EXTRA, :DTOFPOR, :DTOFMONTO, :DTOFFECHA, :TOTAL, :ANULADO, :OBS, :sucursal
        DO
        BEGIN
        if ((ANULADOS = 'S') or (ANULADO = 'N')) then
            BEGIN
            SELECT AUDI_FECHA, AUDI_HORA FROM AUDITORIA
                WHERE AUDI_IDDOC = :ID AND TIDO_COD = 35 AND AUDI_OPER = 'I' INTO :FECREG, :HORAREG;
            CONTADO = 0;
            CREDITO = TOTAL;
            if (anulado = 'S') then
                BEGIN
                COMIPORC = 0;
                COMIMONTO = 0;
                DTOPOR = 0;
                DTOMONTO = 0;
                ADICIONAL = 0;
                IVAMONTO = 0;
                RTFTEPOR = 0;
                RTFTEMONTO = 0;
                RTIVAPOR = 0;
                RTIVAMONTO = 0;
                RTICAPOR = 0;
                RTICAMONTO = 0;
                EXTRA = 0;
                DTOFPOR = 0;
                DTOFMONTO = 0;
                TOTAL = 0;
                END
            if (DETALLE = 'S') then
                BEGIN
                if (anulado = 'S') then
                    BEGIN
                    ITEM = 0;
                    ARTICULO = '';
                    CODBAR = '';
                    ARTIDES = '';
                    CANT = 0;
                    UNIDAD = '';
                    BODITEM = '';
                    LOTE = '';
                    REFERENCIA = '';
                    PRECIO = 0;
                    DTOPORCIT = 0;
                    DTOMONTOIT = 0;
                    IVAPORCIT = 0;
                    IVAMONTOIT = 0;
                    CONSUMOIT = 0;
                    SUBTOTALIT = 0;
                    SUSPEND;
                    END
                ELSE
                    BEGIN
                    FOR SELECT CTDE_ITEM, ARTI_COD, CTDE_CODBAR, CTDE_DESC, CTDE_CANT, CTDE_UNIDAD, '', '', CTDE_REFERENCIA, CTDE_PRUNIT, CTDE_DTOPORC, CTDE_DTOMONTO, CTDE_IVAPORC, CTDE_IVAMONTO, CTDE_CONSUMO, CTDE_TOTAL
                        FROM COTIZACIONES_DETALLE
                        WHERE COTI_ID = :ID
                        ORDER BY CTDE_ITEM
                        INTO :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :BODITEM, :LOTE, :REFERENCIA, :PRECIO, :DTOPORCIT, :DTOMONTOIT, :IVAPORCIT, :IVAMONTOIT, :CONSUMOIT, :SUBTOTALIT
                        DO
                        SUSPEND;
                    END
                END
            ELSE
                SUSPEND;
            END
        END
    END
END
^

SET TERM ; ^


/* 20100729 */
/* mejore un poquito el rendimiento al borrar plan de produccion */
SET TERM ^ ;

CREATE OR ALTER TRIGGER PLAN_PRODUCCION_CONS_BU FOR PLAN_PRODUCCION_CONS
ACTIVE BEFORE UPDATE POSITION 0
as
declare variable peso numeric(18,4);
declare variable des varchar(60);
begin
if (new.plpc_anulado = 'N') then
    begin
    if (NEW.plpc_cant > NEW.plpc_exist) then
        NEW.plpc_ordenar = NEW.plpc_cant - NEW.plpc_exist;
    ELSE
        NEW.plpc_ordenar = 0;
    if (exists (select arpr_item from articulos_producto where arti_cod = new.arti_cod)) then
        begin
        select arti_peso, arti_des from articulo where arti_cod = new.arti_cod into :peso, :des;
        if ((peso is null) or (peso = 0)) then
            exception articulo_sin_peso 'Debe indicar el peso del artículo ' || new.arti_cod || '-' || :des;
        end
    end
end
^

SET TERM ; ^


SET TERM ^ ;

CREATE OR ALTER TRIGGER PLAN_PRODUCCION_DET_BU FOR PLAN_PRODUCCION_DET
ACTIVE BEFORE UPDATE POSITION 0
as
declare variable peso numeric(18,4);
declare variable des varchar(60);
begin
if (new.plpd_anulado = 'N') then
    begin
    if (NEW.plpd_factor IS NULL) then
        NEW.plpd_factor = 1;
    select arti_peso, arti_des from articulo where arti_cod = new.arti_cod into :peso, :des;
    if ((peso is null) or (peso = 0)) then
        exception articulo_sin_peso 'Debe indicar el peso del artículo ' || new.arti_cod || '-' || :des;
    end
end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER ENSAMBLES_AD FOR ENSAMBLES
ACTIVE AFTER DELETE POSITION 0
AS
declare variable consec INTEGER;
BEGIN
delete from movimiento_articulo where (mvar_tipodoc = 15) and (mvar_idref = old.ensa_id) and (mvar_item = 0);
delete from movimiento_articulo where (mvar_tipodoc = 15) and (mvar_idref = old.ensa_id) and (mvar_item = 999);
select enco_consec from comprobante_encabezado where enco_tiporef = 15 and enco_idref = old.ensa_id into :consec;
if (NOT consec is null) then
  begin
  delete from comprobante_detalle where enco_consec = :consec;
  delete from comprobante_encabezado where enco_consec = :consec;
  end
INSERT INTO AUDITORIA (AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
    VALUES (USER, 15, old.ensa_id, 'D', old.pref_pre || old.ensa_numero);
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER ENSAMBLES_AU FOR ENSAMBLES
ACTIVE AFTER UPDATE POSITION 0
AS
declare variable COSTO NUMERIC(18,2);
declare variable consec INTEGER;
declare variable ARTPRIN VARCHAR(2);
BEGIN
/* BORRE LA CONTABILIZACION */
if (NEW.ensa_anulado = 'S') then
    BEGIN
    select enco_consec from comprobante_encabezado where enco_tiporef = 15 and enco_idref = old.ensa_id into :consec;
    if (NOT consec is null) then
      begin
      delete from comprobante_detalle where enco_consec = :consec;
      delete from comprobante_encabezado where enco_consec = :consec;
      end
    INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
        VALUES (USER, 15, NEW.ensa_id, 'A', NEW.pref_pre || NEW.ensa_numero);
    END

/* BORRE EL ANTERIOR Y GRABE EL NUEVO */
if ((OLD.ensa_id <> 0) AND (OLD.ensa_anulado = 'N')) then
    begin
    delete from movimiento_articulo where (mvar_tipodoc = 15) and (mvar_idref = old.ensa_id) and (mvar_item = 0);
    delete from movimiento_articulo where (mvar_tipodoc = 15) and (mvar_idref = old.ensa_id) and (mvar_item = 999);
    end
if ((new.ensa_id <> 0) AND (NEW.ensa_anulado = 'N')) then
    begin
    COSTO = new.ensa_costo / NEW.ensa_factor;
    INSERT INTO MOVIMIENTO_ARTICULO
        (ARTI_COD, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM)
        VALUES(NEW.ARTI_COD, new.ensa_bodretal, new.ensa_fecha, 15, NEW.ensa_id,
        new.ensa_conc, NEW.ensa_factor * new.ensa_cant, :COSTO, 'S', new.ensa_lote, new.pref_pre, new.ensa_numero, 0);

    /* RECORRA LAS LISTAS DE PRECIOS Y CAMBIE EL PRECIO */
    EXECUTE PROCEDURE CALCULA_PRECIOS(NEW.ARTI_COD, new.ensa_fecha);

    /* ingrese el retal */
    execute procedure lee_configuracion('INVENTARIO', 'ENSAMBLES', 'ENSAMBLES CON UN ARTICULO PRINCIPAL COMO BASE') returning_values (:ARTPRIN);
    if (ARTPRIN = 'SI') then
        BEGIN
        if ((new.ensa_codretal is not null) and (new.ensa_codretal <> '')) then
            INSERT INTO MOVIMIENTO_ARTICULO
                (ARTI_COD, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM)
                VALUES(NEW.ensa_codretal, new.ensa_bodretal, new.ensa_fecha, 15, NEW.ensa_id,
                new.ensa_conc, new.ensa_cantretal, 0, 'N', new.ensa_lote, new.pref_pre, new.ensa_numero, 999);
        END
    else
        BEGIN
        if ((new.ensa_codretal is not null) and (new.ensa_codretal <> '')) then
            INSERT INTO MOVIMIENTO_ARTICULO
                (ARTI_COD, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM)
                VALUES(NEW.ensa_codretal, new.bode_cod, new.ensa_fecha, 15, NEW.ensa_id,
                new.ensa_conc, new.ensa_cantretal, :COSTO, 'S', new.ensa_lote, new.pref_pre, new.ensa_numero, 999);
        END
    INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
        VALUES (USER, 15, NEW.ensa_id, 'U', NEW.pref_pre || NEW.ensa_numero);
    end
/* SI CAMBIO LA FECHA ACTUALICE LOS DETALLES */
if ((OLD.pref_pre <> NEW.pref_pre) or
    (OLD.ensa_numero <> NEW.ensa_numero) or
    (OLD.ensa_fecha <> NEW.ensa_fecha) ) then
    UPDATE ENSAMBLES_DETALLE SET ESDE_TRANSMIT = 'N' WHERE ENSA_ID = OLD.ENSA_ID;

if (OLD.ensa_anulado <> NEW.ensa_anulado) then
    UPDATE ENSAMBLES_DETALLE SET ESDE_ANULADO = NEW.ensa_anulado WHERE ENSA_ID = OLD.ENSA_ID;

if (OLD.ensa_transmit <> NEW.ensa_transmit) then
    UPDATE ENSAMBLES_DETALLE SET ESDE_TRANSMIT = NEW.ensa_transmit WHERE ENSA_ID = OLD.ENSA_ID;
END
^

SET TERM ; ^

/* 20100730 */
SET TERM ^ ;

CREATE OR ALTER procedure REP_EGRESOS (
    FECINI date,
    FECFIN date,
    PREF_INI varchar(4),
    PREF_FIN varchar(4),
    NITINI VARCHAR(20),
    NITFIN VARCHAR(20),
    DETALLE char(1),
    SUBEMPRESA integer)
returns (
    PREFIJO varchar(4),
    NUMERO varchar(8),
    FECHA date,
    NIT VARCHAR(20),
    CONCEPTO varchar(60),
    BENEFICIARIO varchar(60),
    CLASE varchar(60),
    MONTO numeric(18,2),
    DESCUENTO numeric(18,2),
    RTFTE numeric(18,2),
    RTIVA numeric(18,2),
    RTICA numeric(18,2),
    MONTOCAJA numeric(18,2),
    MONTOCHEQ numeric(18,2))
AS
declare variable ID INTEGER;
BEGIN
if (DETALLE = 'T') then
  begin
  FOR SELECT EGRE_ID, E.PREF_PRE, EGRE_NUMERO, E.terc_nit, EGRE_FECHA, EGRE_CONC, EGRE_NOMTERC, EGRE_MONTO, EGRE_DTOF, EGRE_RTFTEMONTO, EGRE_RTIVAMONTO, EGRE_RTICAMONTO, CLEG_NOMBRE
    FROM EGRESOS E, PREFIJOS P, clase_egreso C
    WHERE E.CLEG_ID = C.CLEG_ID AND EGRE_FECHA >= :FECINI AND EGRE_FECHA <= :FECFIN AND ((:PREF_INI IS NULL) or (:PREF_INI = '') or (E.PREF_PRE >= :PREF_INI AND E.PREF_PRE <=:PREF_FIN)) AND P.PREF_PRE = E.PREF_PRE AND P.TIDO_COD = 62
        AND E.terc_nit >= :NITINI AND E.terc_nit <= :NITFIN
        AND ((P.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) AND EGRE_ANULADO = 'N'
    ORDER BY E.CLEG_ID, TERC_NIT, EGRE_FECHA, EGRE_ID
    INTO :ID, :PREFIJO, :NUMERO, :NIT, :FECHA, :CONCEPTO, :BENEFICIARIO, :MONTO, :DESCUENTO, :RTFTE, :RTIVA, :RTICA, :CLASE
    do
    BEGIN
    SELECT SUM(EGCA_MONTO) FROM EGRESOS_CAJA WHERE EGRE_ID = :ID INTO :MONTOCAJA;
    if (MONTOCAJA IS NULL) then
        MONTOCAJA = 0;
    SELECT SUM(EGBC_MONTO) FROM EGRESOS_BANCO WHERE EGRE_ID = :ID INTO :MONTOCHEQ;
    if (MONTOCHEQ IS NULL) then
        MONTOCHEQ = 0;
    SUSPEND;
    END
  end
else
  if (DETALLE = 'S') then
    begin
    FOR SELECT EGRE_ID, E.PREF_PRE, EGRE_NUMERO, E.terc_nit, EGRE_FECHA, EGRE_CONC, EGRE_NOMTERC, EGRE_MONTO, EGRE_DTOF, EGRE_RTFTEMONTO, EGRE_RTIVAMONTO, EGRE_RTICAMONTO, CLEG_NOMBRE
        FROM EGRESOS E, PREFIJOS P, clase_egreso C
        WHERE E.CLEG_ID = C.CLEG_ID AND EGRE_FECHA >= :FECINI AND EGRE_FECHA <= :FECFIN AND ((:PREF_INI IS NULL) or (:PREF_INI = '') or (E.PREF_PRE >= :PREF_INI AND E.PREF_PRE <=:PREF_FIN)) AND P.PREF_PRE = E.PREF_PRE AND P.TIDO_COD = 62
        AND E.terc_nit >= :NITINI AND E.terc_nit <= :NITFIN
        AND ((P.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) AND EGRE_ANULADO = 'N'
        ORDER BY E.CLEG_ID, EGRE_FECHA, EGRE_ID
        INTO :ID, :PREFIJO, :NUMERO, :NIT, :FECHA, :CONCEPTO, :BENEFICIARIO, :MONTO, :DESCUENTO, :RTFTE, :RTIVA, :RTICA, :CLASE
        do
        BEGIN
        SELECT SUM(EGCA_MONTO) FROM EGRESOS_CAJA WHERE EGRE_ID = :ID INTO :MONTOCAJA;
        if (MONTOCAJA IS NULL) then
            MONTOCAJA = 0;
        SELECT SUM(EGBC_MONTO) FROM EGRESOS_BANCO WHERE EGRE_ID = :ID INTO :MONTOCHEQ;
        if (MONTOCHEQ IS NULL) then
            MONTOCHEQ = 0;
        SUSPEND;
        END
    end
  else
    begin
    FOR SELECT SUM(EGRE_MONTO), SUM(EGRE_DTOF), SUM(EGRE_RTFTEMONTO), SUM(EGRE_RTIVAMONTO), SUM(EGRE_RTICAMONTO), MAX(CLEG_NOMBRE), MAX(E.CLEG_ID)
        FROM EGRESOS E, PREFIJOS P, clase_egreso C
        WHERE E.CLEG_ID = C.CLEG_ID AND EGRE_FECHA >= :FECINI AND EGRE_FECHA <= :FECFIN AND ((:PREF_INI IS NULL) or (:PREF_INI = '') or (E.PREF_PRE >= :PREF_INI AND E.PREF_PRE <=:PREF_FIN)) AND P.PREF_PRE = E.PREF_PRE AND P.TIDO_COD = 62
        AND E.terc_nit >= :NITINI AND E.terc_nit <= :NITFIN
        AND ((P.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) AND EGRE_ANULADO = 'N'
        GROUP BY E.CLEG_ID
        INTO :MONTO, :DESCUENTO, :RTFTE, :RTIVA, :RTICA, :clase, :ID
        do
        BEGIN
        SELECT SUM(EGCA_MONTO) FROM EGRESOS_CAJA J, EGRESOS E WHERE E.egre_id = J.egre_id AND CLEG_ID = :ID INTO :MONTOCAJA;
        if (MONTOCAJA IS NULL) then
            MONTOCAJA = 0;
        SELECT SUM(EGBC_MONTO) FROM EGRESOS_BANCO B, EGRESOS E WHERE E.egre_id = B.egre_id AND CLEG_ID = :ID INTO :MONTOCHEQ;
        if (MONTOCHEQ IS NULL) then
            MONTOCHEQ = 0;
        SUSPEND;
        END
    end
END
^

SET TERM ; ^


/* 20100731 */
/* SE HABIA PERDIDO LA MODIFICACION DE PESOTOT */
SET TERM ^ ;

CREATE OR ALTER procedure IMPR_REMISION (
    ID integer)
returns (
    PREF varchar(4),
    NUMERO varchar(6),
    FECHA date,
    NIT varchar(20),
    NOMTERCERO varchar(60),
    VENDEDOR integer,
    NOMVENDEDOR varchar(60),
    PUNTOVTA integer,
    NOMPUNTOVTA varchar(30),
    CODBODEGA varchar(2),
    NOMBODEGA varchar(30),
    COTIZACION varchar(30),
    PEDIDO varchar(30),
    FACTURA varchar(30),
    SUBTOTAL numeric(18,2),
    IVAMONTO numeric(18,2),
    TOTALFAC numeric(18,2),
    DESPACHO varchar(255),
    TRANSPORTADOR varchar(60),
    OBS blob sub_type 1 segment size 80,
    ITEM integer,
    ARTICULO varchar(15),
    CODBAR varchar(15),
    ARTIDES varchar(60),
    CANT numeric(18,4),
    LOTE varchar(15),
    VLOTE date,
    UNIDAD varchar(8),
    FACTOR numeric(18,4),
    CAJAS numeric(18,4),
    DEVUELTO numeric(18,4),
    CONSUMIDO numeric(18,4),
    LISTAPR integer,
    REFITEM varchar(60),
    BODITEM varchar(2),
    STAND varchar(20),
    PRUNIT numeric(18,2),
    DTOITPORC numeric(9,2),
    DTOITMONTO numeric(18,2),
    PRNETOSINIVA numeric(18,2),
    PRNETO numeric(18,2),
    IVAPORC numeric(9,2),
    IVAITMONTO numeric(18,2),
    CONSUMO numeric(18,2),
    SUBTOTIT numeric(18,2),
    TOTAL numeric(18,2),
    PESOTOT numeric(18,4),
    CODIGOCL varchar(20),
    ZONACOD varchar(2),
    ZONANOM varchar(60),
    DV char(1),
    DIRECCION varchar(60),
    CIUDAD varchar(40),
    TELEFONO varchar(40),
    CONTACTO varchar(60),
    FAX varchar(25),
    CEL varchar(25),
    GRUPO varchar(2),
    NOMGRUPO varchar(30),
    SUBGRUPO varchar(3),
    NOMSUBG varchar(30),
    MARCA varchar(3),
    NOMMARCA varchar(30),
    PESO numeric(9,4),
    ANCHO numeric(18,4),
    ALTO numeric(18,4),
    LARGO numeric(18,4),
    SUMA1 numeric(18,2),
    SUMA2 numeric(18,2),
    SUMA3 numeric(18,2),
    IVA1 numeric(18,2),
    IVA2 numeric(18,2),
    IVA3 numeric(18,2),
    SUMAEX numeric(18,2),
    SUMAGR numeric(18,2),
    TOTCAJAS numeric(18,2),
    OBSITEM blob sub_type 1 segment size 80,
    ALTERNATIVAS numeric(18,4),
    PRINCIPALES numeric(18,4))
AS
DECLARE VARIABLE IMPTOS CHAR(1);
DECLARE VARIABLE TARIFA INTEGER;
declare variable ORDENCOD CHAR(8);
declare variable SUCUR VARCHAR(10);
declare variable ICOINC CHAR(2);
declare variable FACTCANT NUMERIC(18,4);
BEGIN
execute procedure lee_configuracion('FACTURACION', 'ARTICULOS', 'IMPOCONSUMO INCLUIDO EN EL PRECIO BASE DE VENTA ANTES DE IVA') returning_values (icoinc);
EXECUTE PROCEDURE lee_configuracion ('FACTURACION','DOCUMENTOS','ORDENAR ITEMS POR CODIGO DE ARTICULO') returning_values (:ORDENCOD);
SELECT F.PREF_PRE, REVT_NUMERO, REVT_FECHA, F.BODE_COD, BODE_NOM, F.TERC_NIT, REVT_NOMTERC, F.VEND_COD, VEND_NOMBRE, F.PTVT_ID, PTVT_NOM,
    REVT_COTIZACI, REVT_PEDIDO, REVT_FACTURA, REVT_IVAINC,
    REVT_IVAMONTO, REVT_TOTAL, REVT_DESPACHO, REVT_TRANSP,
    TERC_CONTACTO, TERC_FAX, TERC_DV, TERC_CEL, REVT_OBS, REVT_SUCURSAL
    FROM REMISIONES_VENTA F, BODEGA B, VENDEDORES V, PUNTO_VENTA P, TERCEROS T
    WHERE F.BODE_COD = B.BODE_COD AND F.VEND_COD = V.VEND_COD AND F.PTVT_ID = P.PTVT_ID AND F.TERC_NIT = T.TERC_NIT AND F.REVT_ID = :ID
    into :PREF, :NUMERO, :FECHA, :CODBODEGA, :NOMBODEGA, :NIT, :NOMTERCERO, :VENDEDOR, :NOMVENDEDOR, :PUNTOVTA, :NOMPUNTOVTA,
    :COTIZACION, :PEDIDO, :FACTURA, :IMPTOS,
    :IVAMONTO, :TOTALFAC, :DESPACHO, :transportador, 
    :CONTACTO, :FAX, :DV, :CEL, :OBS, :SUCUR;
SUBTOTAL = TOTALFAC - IVAMONTO;

SELECT CLIE_COD, C.ZONA_COD, ZONA_NOM
    FROM CLIENTES C, ZONAS Z
    WHERE TERC_NIT = :NIT AND C.ZONA_COD = Z.ZONA_COD
    INTO :CODIGOCL, :ZONACOD, :ZONANOM;
SELECT CLSU_DIR, CLSU_CIUDAD, CLSU_TEL FROM CLIENTE_SUCURSALES WHERE TERC_NIT = :NIT AND CLCU_COD = :SUCUR
    INTO :DIRECCION, :CIUDAD, :TELEFONO;
    
SUMAEX = 0;
SUMA1 = 0;
SUMA2 = 0;
SUMA3 = 0;
IVA1 = 0;
IVA2 = 0;
IVA3 = 0;
ITEM = 0;
totcajas = 0;
PESOTOT = 0;
if (ORDENCOD = 'SI') then
    BEGIN
    FOR SELECT D.ARTI_COD, RVDE_CODBAR, SUBSTR(RVDE_DESC,1,60), RVDE_CANT, RVDE_UNIDAD, BODE_COD, RVDE_LOTE, LIPR_COD, RVDE_PRUNIT, RVDE_DTOPORC, RVDE_DTOMONTO, RVDE_IVAPORC, RVDE_IVAMONTO, RVDE_CONSUMO, RVDE_TOTAL, RVDE_REFERENCIA,
        GRUP_COD, SUBG_COD, MARC_COD, ARTI_PESO, ARTI_ANCHO, ARTI_ALTO, ARTI_LARGO, TAIV_COD, RVDE_DEVUELTO, RVDE_OBS, RVDE_CAJAS, RVDE_FACTOR
        FROM REMISIONES_VENTA_DETALLE D, ARTICULO A
        WHERE D.ARTI_COD = A.ARTI_COD AND D.REVT_ID = :ID
        ORDER BY RVDE_CODBAR
        INTO :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :BODITEM, :LOTE, :LISTAPR, :PRUNIT, :DTOITPORC, :DTOITMONTO, :IVAPORC, :IVAITMONTO, :CONSUMO, :TOTAL, :refitem,
            :GRUPO, :SUBGRUPO, :MARCA, :PESO, :ANCHO, :ALTO, :LARGO, :TARIFA, :DEVUELTO, :obsitem, :CAJAS, :FACTOR
        DO
        BEGIN
        if (ARTICULO = CODBAR) then
            SELECT FIRST 1 COBA_COD FROM barras_articulo WHERE ARTI_COD = :articulo INTO :CODBAR;
        SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :GRUPO INTO NOMGRUPO;
        SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :MARCA INTO NOMMARCA;
        SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :SUBGRUPO AND GRUP_COD = :GRUPO INTO :NOMSUBG;
        SELECT LOTE_VENCE FROM LOTES WHERE LOTE_NRO = :lote AND ARTI_COD = :ARTICULO AND BODE_COD = :boditem INTO :vlote;
        if (ICOINC = 'SI') then
            SUBTOTIT = TOTAL - IVAITMONTO;
        else
            SUBTOTIT = TOTAL - IVAITMONTO - CONSUMO;
        CONSUMIDO = cant * factor - devuelto;
        ITEM = ITEM + 1;
        PRNETO = PRUNIT - DTOITMONTO;
        if (PESO IS NULL) then
            PESO = 0;
        PESO = PESO / 1000 * CANT * FACTOR;
        PESOTOT = PESOTOT + PESO;
        if (IMPTOS = 'S') then
            if (cant <> 0) then
                prnetosiniva = PRUNIT - DTOITMONTO - ((IVAITMONTO+CONSUMO) / CANT);
            else
                prnetosiniva = PRUNIT - DTOITMONTO;
        ELSE
            prnetosiniva = PRUNIT - DTOITMONTO;
        if (IVAPORC = 0) then
            SUMAEX = SUMAEX + TOTAL;
        if (TARIFA = 1) then
            BEGIN
            SUMA1 = SUMA1 + TOTAL - IVAITMONTO;
            IVA1 = IVA1 + IVAITMONTO;
            END
        if (TARIFA = 2) then
            BEGIN
            SUMA2 = SUMA2 + TOTAL - IVAITMONTO;
            IVA2 = IVA2 + IVAITMONTO;
            END
        if (TARIFA = 3) then
            BEGIN
            SUMA3 = SUMA3 + TOTAL - IVAITMONTO;
            IVA3 = IVA3 + IVAITMONTO;
            END
        SUMAGR = SUMA1 + SUMA2 + SUMA3;

        totcajas = totcajas + cajas;
        SELECT STAND_COD FROM STANDS WHERE ARTI_COD = :ARTICULO AND STAND_BODEGA = :boditem INTO :stand;
        factcant = NULL;
        SELECT FIRST 1 UNAR_FACCAN FROM unidad_articulo WHERE ARTI_COD = :articulo INTO :factcant;
        if (factcant IS NULL) then
            factcant = 1;
        if ((factcant = 1) or (factcant = 0)) then
            BEGIN
            ALTERNATIVAS = 0;
            PRINCIPALES = (CANT * FACTOR);
            END
        ELSE
            BEGIN
            ALTERNATIVAS = FLOOR(CANT * factor / factcant);
            PRINCIPALES = (CANT * FACTOR) - (alternativas * factcant);
            END
        SUSPEND;
        END
    END
ELSE
  if (ORDENCOD = 'UNIDAD') then
    BEGIN
    FOR SELECT D.ARTI_COD, RVDE_CODBAR, SUBSTR(RVDE_DESC,1,60), RVDE_CANT, RVDE_UNIDAD, BODE_COD, RVDE_LOTE, LIPR_COD, RVDE_PRUNIT, RVDE_DTOPORC, RVDE_DTOMONTO, RVDE_IVAPORC, RVDE_IVAMONTO, RVDE_CONSUMO, RVDE_TOTAL, RVDE_REFERENCIA,
        GRUP_COD, SUBG_COD, MARC_COD, ARTI_PESO, ARTI_ANCHO, ARTI_ALTO, ARTI_LARGO, TAIV_COD, RVDE_DEVUELTO, RVDE_OBS, RVDE_CAJAS, RVDE_FACTOR
        FROM REMISIONES_VENTA_DETALLE D, ARTICULO A
        WHERE D.ARTI_COD = A.ARTI_COD AND D.REVT_ID = :ID
        ORDER BY RVDE_CODBAR
        INTO :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :BODITEM, :LOTE, :LISTAPR, :PRUNIT, :DTOITPORC, :DTOITMONTO, :IVAPORC, :IVAITMONTO, :CONSUMO, :TOTAL, :refitem,
            :GRUPO, :SUBGRUPO, :MARCA, :PESO, :ANCHO, :ALTO, :LARGO, :TARIFA, :DEVUELTO, :obsitem, :CAJAS, :FACTOR
        DO
        BEGIN
        if (ARTICULO = CODBAR) then
            SELECT FIRST 1 COBA_COD FROM barras_articulo WHERE ARTI_COD = :articulo INTO :CODBAR;
        SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :GRUPO INTO NOMGRUPO;
        SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :MARCA INTO NOMMARCA;
        SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :SUBGRUPO AND GRUP_COD = :GRUPO INTO :NOMSUBG;
        SELECT LOTE_VENCE FROM LOTES WHERE LOTE_NRO = :lote AND ARTI_COD = :ARTICULO AND BODE_COD = :boditem INTO :vlote;
        if (ICOINC = 'SI') then
            SUBTOTIT = TOTAL - IVAITMONTO;
        else
            SUBTOTIT = TOTAL - IVAITMONTO - CONSUMO;
        CONSUMIDO = cant * factor - devuelto;
        ITEM = ITEM + 1;
        PRNETO = PRUNIT - DTOITMONTO;
        if (PESO IS NULL) then
            PESO = 0;
        PESO = PESO / 1000 * CANT * FACTOR;
        PESOTOT = PESOTOT + PESO;
        if (IMPTOS = 'S') then
            if (cant <> 0) then
                prnetosiniva = PRUNIT - DTOITMONTO - ((IVAITMONTO+CONSUMO) / CANT);
            else
                prnetosiniva = PRUNIT - DTOITMONTO;
        ELSE
            prnetosiniva = PRUNIT - DTOITMONTO;
        if (IVAPORC = 0) then
            SUMAEX = SUMAEX + TOTAL;
        if (TARIFA = 1) then
            BEGIN
            SUMA1 = SUMA1 + TOTAL - IVAITMONTO;
            IVA1 = IVA1 + IVAITMONTO;
            END
        if (TARIFA = 2) then
            BEGIN
            SUMA2 = SUMA2 + TOTAL - IVAITMONTO;
            IVA2 = IVA2 + IVAITMONTO;
            END
        if (TARIFA = 3) then
            BEGIN
            SUMA3 = SUMA3 + TOTAL - IVAITMONTO;
            IVA3 = IVA3 + IVAITMONTO;
            END
        SUMAGR = SUMA1 + SUMA2 + SUMA3;

        totcajas = totcajas + cajas;
        SELECT STAND_COD FROM STANDS WHERE ARTI_COD = :ARTICULO AND STAND_BODEGA = :boditem INTO :stand;
        factcant = NULL;
        SELECT FIRST 1 UNAR_FACCAN FROM unidad_articulo WHERE ARTI_COD = :articulo INTO :factcant;
        if (factcant IS NULL) then
            factcant = 1;
        if ((factcant = 1) or (factcant = 0)) then
            BEGIN
            ALTERNATIVAS = 0;
            PRINCIPALES = (CANT * FACTOR);
            END
        ELSE
            BEGIN
            ALTERNATIVAS = FLOOR(CANT * factor / factcant);
            PRINCIPALES = (CANT * FACTOR) - (alternativas * factcant);
            END
        SUSPEND;
        END
    END
  ELSE
    BEGIN
    FOR SELECT RVDE_ITEM, D.ARTI_COD, RVDE_CODBAR, SUBSTR(RVDE_DESC,1,60), RVDE_CANT, RVDE_UNIDAD, BODE_COD, RVDE_LOTE, LIPR_COD, RVDE_PRUNIT, RVDE_DTOPORC, RVDE_DTOMONTO, RVDE_IVAPORC, RVDE_IVAMONTO, RVDE_CONSUMO, RVDE_TOTAL, RVDE_REFERENCIA,
        GRUP_COD, SUBG_COD, MARC_COD, ARTI_PESO, ARTI_ANCHO, ARTI_ALTO, ARTI_LARGO, TAIV_COD, RVDE_DEVUELTO, RVDE_OBS, RVDE_CAJAS, RVDE_FACTOR
        FROM REMISIONES_VENTA_DETALLE D, ARTICULO A
        WHERE D.ARTI_COD = A.ARTI_COD AND D.REVT_ID = :ID
        ORDER BY RVDE_ITEM
        INTO :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :BODITEM, :LOTE, :LISTAPR, :PRUNIT, :DTOITPORC, :DTOITMONTO, :IVAPORC, :IVAITMONTO, :CONSUMO, :TOTAL, :refitem,
            :GRUPO, :SUBGRUPO, :MARCA, :PESO, :ANCHO, :ALTO, :LARGO, :TARIFA, :DEVUELTO, :obsitem, :CAJAS, :FACTOR
        DO
        BEGIN
        SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :GRUPO INTO NOMGRUPO;
        SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :MARCA INTO NOMMARCA;
        SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :SUBGRUPO AND GRUP_COD = :GRUPO INTO :NOMSUBG;
        SELECT LOTE_VENCE FROM LOTES WHERE LOTE_NRO = :lote AND ARTI_COD = :ARTICULO AND BODE_COD = :boditem INTO :vlote;
        if (ICOINC = 'SI') then
            SUBTOTIT = TOTAL - IVAITMONTO;
        else
            SUBTOTIT = TOTAL - IVAITMONTO - CONSUMO;
        CONSUMIDO = cant * factor - devuelto;
        ITEM = ITEM + 1;
        PRNETO = PRUNIT - DTOITMONTO;
        if (PESO IS NULL) then
            PESO = 0;
        PESO = PESO / 1000 * CANT * FACTOR;
        PESOTOT = PESOTOT + PESO;
        if (IMPTOS = 'S') then
            if (cant <> 0) then
                prnetosiniva = PRUNIT - DTOITMONTO - ((IVAITMONTO+CONSUMO) / CANT);
            else
                prnetosiniva = PRUNIT - DTOITMONTO;
        ELSE
            prnetosiniva = PRUNIT - DTOITMONTO;
        if (IVAPORC = 0) then
            SUMAEX = SUMAEX + TOTAL;
        if (TARIFA = 1) then
            BEGIN
            SUMA1 = SUMA1 + TOTAL - IVAITMONTO;
            IVA1 = IVA1 + IVAITMONTO;
            END
        if (TARIFA = 2) then
            BEGIN
            SUMA2 = SUMA2 + TOTAL - IVAITMONTO;
            IVA2 = IVA2 + IVAITMONTO;
            END
        if (TARIFA = 3) then
            BEGIN
            SUMA3 = SUMA3 + TOTAL - IVAITMONTO;
            IVA3 = IVA3 + IVAITMONTO;
            END
        SUMAGR = SUMA1 + SUMA2 + SUMA3;
        totcajas = totcajas + cajas;
        SELECT STAND_COD FROM STANDS WHERE ARTI_COD = :ARTICULO AND STAND_BODEGA = :boditem INTO :stand;
        factcant = NULL;
        SELECT FIRST 1 UNAR_FACCAN FROM unidad_articulo WHERE ARTI_COD = :articulo INTO :factcant;
        if (factcant IS NULL) then
            factcant = 1;
        if ((factcant = 1) or (factcant = 0)) then
            BEGIN
            ALTERNATIVAS = 0;
            PRINCIPALES = (CANT * FACTOR);
            END
        ELSE
            BEGIN
            ALTERNATIVAS = FLOOR(CANT * factor / factcant);
            PRINCIPALES = (CANT * FACTOR) - (alternativas * factcant);
            END
        SUSPEND;
        END
    END
END
^

SET TERM ; ^


/* 20100730C */
/* SI SE COMPRA EN UNIDAD ALTERNATIVA EL CONSUMO PUEDE DAR POR UNIDAD ALTERNATIVA Y EL REPORTE DE INV. LO ENTIENDE COMO UNITARIO */

SET TERM ^ ;

CREATE OR ALTER procedure CONSUMO_HISTORICO (
    ARTIC varchar(20),
    FECHA date)
returns (
    CONSUMO numeric(18,2))
AS
begin
CONSUMO = NULL;
SELECT FIRST 1 FCDE_CONSUMO/(FCDE_CANT*FCDE_FACTOR) FROM FACTURAS_COMPRAS_DETALLE D, FACTURAS_COMPRA F
    WHERE F.faco_id = D.faco_id AND D.ARTI_COD = :ARTIC AND F.FACO_FECHA <= :FECHA ORDER BY FACO_FECHA DESC
    INTO :CONSUMO;
if (CONSUMO IS NULL) then
    SELECT FIRST 1 FCDE_CONSUMO/(FCDE_CANT*FCDE_FACTOR) FROM FACTURAS_COMPRAS_DETALLE D, FACTURAS_COMPRA F
        WHERE F.faco_id = D.faco_id AND D.ARTI_COD = :ARTIC AND F.FACO_FECHA > :FECHA ORDER BY FACO_FECHA
        INTO :CONSUMO;
if (CONSUMO IS NULL) then
    SELECT ARTI_CONSUMO FROM ARTICULO WHERE ARTI_COD = :ARTIC INTO :CONSUMO;
suspend;
end
^

SET TERM ; ^

grant EXECUTE on PROCEDURE CONSUMO_HISTORICO to PUBLIC;

SET TERM ^ ;

CREATE OR ALTER procedure EXISTENCIAS_DESDE_HASTA (
    FECHA date,
    ARTINI varchar(20),
    ARTFIN varchar(20),
    GRPINI varchar(3),
    GRPFIN varchar(3),
    BODINI varchar(2),
    BODFIN varchar(2),
    ORDEN char(1),
    AGRUPA char(1),
    DETALLE char(1),
    RESERVA char(1),
    ENPESO char(1),
    MASIVA char(1),
    SUCURSAL integer)
returns (
    CANT numeric(18,4),
    COSTO numeric(18,2),
    COSTO_LOTE numeric(18,2),
    CODIGO varchar(15),
    NOMBRE varchar(60),
    UNIDAD varchar(8),
    STAND varchar(20),
    CODGRUPO varchar(2),
    NOMGRUPO varchar(30),
    CODSUBG varchar(3),
    NOMSUBG varchar(30),
    CODMARC varchar(3),
    NOMMARC varchar(30),
    CODBOD varchar(2),
    LOTE varchar(15),
    NOMBOD varchar(30),
    COSTOTOT numeric(18,2),
    COSTOIVA numeric(18,2),
    ULTCOSTO numeric(18,2),
    FECHACOSTO date,
    CONSUMO numeric(18,2),
    RESERVADO numeric(18,4),
    ORDENADO numeric(18,4),
    IVA numeric(9,2),
    IVAMONTO numeric(18,2),
    PESOUNIT numeric(18,4),
    PESOTOTAL numeric(18,4),
    PRECIO numeric(18,2),
    CODBAR varchar(20))
AS
declare variable exist char(1);
declare variable codini varchar(20);
declare variable codfin varchar(20);
declare variable desini varchar(20);
declare variable desfin varchar(20);
declare variable ordenc numeric(18,4);
declare variable pedido numeric(18,4);
declare variable ok char(1);
declare variable id integer;
declare variable item integer;
declare variable und varchar(8);
declare variable factor numeric(18,4);
declare variable cant2 numeric(18,4);
declare variable PEDAUTO CHAR(2);
DECLARE VARIABLE LISTA INTEGER;
BEGIN
EXECUTE PROCEDURE lee_configuracion ('FACTURACION','FACTURAS', 'CODIGO DE LA LISTA DE PRECIOS A MOSTRAR EN ARTICULOS') returning_values (:LISTA);
if (ORDEN = 'C') then
    BEGIN
    CODINI = ARTINI;
    CODFIN = ARTFIN;
    DESINI = '';
    DESFIN = 'zz';
    END
ELSE
    BEGIN
    DESINI = ARTINI;
    DESFIN = ARTFIN;
    CODINI = '';
    CODFIN = 'zz';
    END
EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION', 'FACTURAS', 'GENERAR PEDIDO AUTOMATICAMENTE CON LA FACTURA') returning_values (pedauto);
if (DETALLE = 'B') then
  BEGIN
  FOR SELECT ARTI_COD, ARTI_DES, ARTI_UNIDAD, ARTI_EXIST, TAIV_PORC, A.GRUP_COD, A.SUBG_COD, A.MARC_COD, BODE_COD, BODE_NOM, ARTI_CONSUMO, ARTI_PESO/1000
      FROM ARTICULO A, BODEGA B, TARIFA_IVA T
      WHERE ARTI_COD >= :CODINI AND ARTI_COD <= :CODFIN AND ARTI_DES >= :DESINI AND ARTI_DES <= :DESFIN AND ESAR_COD <> 'I' AND BODE_COD >= :BODINI AND
      BODE_COD <= :BODFIN AND ((SUCU_ID = :SUCURSAL) or (:SUCURSAL = 0)) AND A.TAIV_COD = T.TAIV_COD
      INTO :CODIGO, :NOMBRE, :UNIDAD, :EXIST, :IVA, :CODGRUPO, :CODSUBG, :CODMARC, :CODBOD, :NOMBOD, :CONSUMO, :pesounit
      DO
        BEGIN
        STAND = '';
        OK = 'N';
        if (AGRUPA = 'G') then
            BEGIN
            if ((CODGRUPO >= GRPINI) AND (CODGRUPO <= GRPFIN)) then
                OK = 'S';
            end
        ELSE
            if (AGRUPA = 'M') then
                BEGIN
                if ((CODMARC >= GRPINI) AND (CODMARC <= GRPFIN)) then
                    OK = 'S';
                END
        if (OK = 'S') then
            BEGIN
            NOMGRUPO = '';
            NOMMARC = '';
            NOMSUBG = '';
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            CODBAR = NULL;
            SELECT FIRST 1 COBA_COD FROM BARRAS_ARTICULO
                WHERE ARTI_COD = :codigo AND COBA_UNIDAD = :unidad ORDER BY STRLEN(COBA_COD) INTO :codbar;
            if (CODBAR IS NULL) then
                CODBAR = CODIGO;
            if (EXIST <> 'N') then
                BEGIN
                SELECT STAND_COD FROM STANDS WHERE ARTI_COD = :CODIGO AND STAND_BODEGA = :CODBOD INTO :STAND;
                EXECUTE PROCEDURE SALDO_INICIAL_INVENTARIO(CODIGO, FECHA, :CODBOD) returning_values (CANT);
                EXECUTE PROCEDURE costo_promedio_y_ultimo_unidad(CODIGO, FECHA, UNIDAD) returning_values (COSTO, ULTCOSTO);
                SELECT FIRST 1 MVAR_FECHA FROM MOVIMIENTO_ARTICULO WHERE ARTI_COD = :CODIGO AND MVAR_ENTRADA = 'S' AND MVAR_FECHA <= :FECHA
                    ORDER BY ARTI_COD DESC, MVAR_FECHA DESC INTO :FECHACOSTO;
                COSTOTOT = :CANT * :COSTO;
                IVAMONTO = COSTOTOT /100 * IVA;
                COSTOIVA = COSTOTOT;
                if (CONSUMO <> 0) then
                    EXECUTE PROCEDURE CONSUMO_HISTORICO (:CODIGO, :fecha) returning_values (:CONSUMO);
                if (MASIVA = 'S') then
                    BEGIN
                    COSTOIVA = COSTOTOT + IVAMONTO;
                    COSTO = COSTO * (100 + :IVA) / 100 + :CONSUMO;
                    END
                CONSUMO = CONSUMO * CANT;
                COSTOIVA = COSTOIVA + CONSUMO;
                if (RESERVA = 'S') then
                    BEGIN
                    SELECT SUM(ORID_ENTREGAR)
                        FROM ORDENINVENTARIO_DETALLE OD, ordenes_inventario O
                        WHERE O.ORIN_ID = OD.ORIN_ID AND ARTI_COD = :CODIGO AND ORIN_FECHA <= :FECHA AND ORIN_FECLLEGA >= :FECHA AND ORID_ANULADO = 'N' AND OD.BODE_COD = :CODBOD
                        INTO :ORDENADO;
                    if (ORDENADO IS NULL) then
                        ORDENADO = 0;
                    ORDENC = 0;
                    FOR SELECT O.ORDC_ID, OCDE_ITEM, OCDE_CANT * OCDE_FACTOR
                        FROM ORDENES_COMPRA O, ORDENES_COMPRA_DETALLE OD
                        WHERE O.ORDC_ID = OD.ORDC_ID AND OD.ARTI_COD = :CODIGO AND ORDC_VENCE >= :FECHA AND ORDC_FECHA <= :FECHA AND OCDE_ANULADO = 'N' AND OD.BODE_COD = :CODBOD
                        INTO :ID, :ITEM, :CANT2
                        do
                        BEGIN
                        EXECUTE PROCEDURE FALTANTE(23, 21, ID, ITEM) returning_values (PEDIDO, UND, FACTOR);
                        if (PEDIDO * FACTOR = CANT2) then /* SI NO SE HA FACTURADO MIRE A VER SI SE REMISIONO */
                            EXECUTE PROCEDURE FALTANTE(23, 22, ID, ITEM) returning_values (PEDIDO, UND, FACTOR);
                        if (PEDIDO IS NULL) then
                            PEDIDO = 0;
                        ORDENC = ORDENC + PEDIDO * FACTOR;
                        END
                    ORDENADO = ORDENADO + ORDENC;
                    SELECT SUM(RSDE_LIBERAR)
                        FROM RESERVAS_DETALLE RD, RESERVAS R
                        WHERE R.RESE_ID = RD.RESE_ID AND ARTI_COD = :CODIGO AND RESE_FECHA <= :FECHA AND RESE_VENCE >= :FECHA AND RD.BODE_COD = :CODBOD AND RSDE_ANULADO = 'N'
                        INTO :RESERVADO;
                    if (RESERVADO IS NULL) then
                        RESERVADO = 0;
                    PEDIDO = 0;
                    FOR SELECT P.PEDI_ID, PEDE_ITEM, PEDE_CANT * PEDE_FACTOR
                        FROM PEDIDOS P, PEDIDOS_DETALLE PD
                        WHERE P.PEDI_ID = PD.PEDI_ID AND PD.ARTI_COD = :CODIGO AND PEDI_VENCE >= :FECHA AND PEDI_FECHA <= :FECHA AND PEDE_ANULADO = 'N' AND BODE_COD = :CODBOD
                        INTO :ID, :ITEM, :CANT2
                        do
                        BEGIN
                        EXECUTE PROCEDURE FALTANTE(34, 31, ID, ITEM) returning_values (ORDENC, UND, FACTOR);
                        if ((ORDENC * FACTOR = CANT2) or (PEDAUTO = 'SI')) then /* SI NO SE HA FACTURADO MIRE A VER SI SE REMISIONO */
                            EXECUTE PROCEDURE FALTANTE(34, 32, ID, ITEM) returning_values (ORDENC, UND, FACTOR);
                        if (ORDENC IS NULL) then
                            ORDENC = 0;
                        PEDIDO = PEDIDO + ORDENC * FACTOR;
                        END
                    RESERVADO = RESERVADO + PEDIDO;
                    END
                ELSE
                    BEGIN
                    RESERVADO = 0;
                    ORDENADO = 0;
                    END
                if (LISTA > 0) then
                    SELECT prar_fijo FROM precios_articulo WHERE arti_cod = :CODIGO and lipr_cod = :LISTA INTO :PRECIO;
                if (ENPESO = 'S') then
                    BEGIN
                    if (pesounit IS NULL) then
                        pesounit = 0;
                    if (PESOUNIT <> 0) then
                        BEGIN
                        pesototal = PESOUNIT * cant;
                        SUSPEND;
                        END
                    END
                ELSE
                    SUSPEND;
                END
            END
        END
  END

if (DETALLE = 'L') then
  BEGIN
  FOR SELECT A.ARTI_COD, ARTI_DES, ARTI_UNIDAD, ARTI_EXIST, TAIV_PORC, A.GRUP_COD, A.SUBG_COD, A.MARC_COD, L.lote_nro, L.lote_nro||' - '||L.lote_vence, ARTI_CONSUMO,l.bode_cod, L.lote_saldo,l.lote_costo, ARTI_PESO/1000
      FROM ARTICULO A, LOTES l, TARIFA_IVA T
      WHERE A.ARTI_COD >= '0' AND A.ARTI_COD <= 'zz' AND ARTI_DES >= '' AND ARTI_DES <= 'zz' AND ESAR_COD <> 'I' AND A.TAIV_COD = T.TAIV_COD and a.arti_cod = l.arti_cod
      AND L.BODE_COD >= :BODINI AND L.BODE_COD <= :BODFIN
      INTO :CODIGO, :NOMBRE, :UNIDAD, :EXIST, :IVA, :CODGRUPO, :CODSUBG, :CODMARC, :LOTE, :NOMBOD, :CONSUMO, :codbod, :cant, :costo_lote, :pesounit
      DO
        BEGIN
        OK = 'N';
        if (AGRUPA = 'G') then
            BEGIN
            if ((CODGRUPO >= GRPINI) AND (CODGRUPO <= GRPFIN)) then
                OK = 'S';
            end
        ELSE
            if (AGRUPA = 'M') then
                BEGIN
                if ((CODMARC >= GRPINI) AND (CODMARC <= GRPFIN)) then
                    OK = 'S';
                END
        if (OK = 'S') then
            BEGIN
            NOMGRUPO = '';
            NOMMARC = '';
            NOMSUBG = '';
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            CODBAR = NULL;
            SELECT MAX(COBA_COD) FROM BARRAS_ARTICULO WHERE ARTI_COD = :codigo AND COBA_UNIDAD = :unidad INTO :codbar;
            if (CODBAR IS NULL) then
                CODBAR = CODIGO;

            if (EXIST <> 'N') then
                BEGIN
                EXECUTE PROCEDURE COSTO_PROMEDIO_UNIDAD(CODIGO, FECHA, UNIDAD) returning_values (COSTO);
                EXECUTE PROCEDURE ULTIMO_COSTO(CODIGO, FECHA, UNIDAD) returning_values (ULTCOSTO);
                SELECT FIRST 1 MVAR_FECHA FROM MOVIMIENTO_ARTICULO WHERE ARTI_COD = :CODIGO AND MVAR_ENTRADA = 'S' AND MVAR_FECHA <= :FECHA
                    ORDER BY ARTI_COD DESC, MVAR_FECHA DESC INTO :FECHACOSTO;
                COSTOTOT = :CANT * :COSTO;
                IVAMONTO = COSTOTOT /100 * IVA;
                COSTOIVA = COSTOTOT;
                if (CONSUMO <> 0) then
                    EXECUTE PROCEDURE CONSUMO_HISTORICO (:CODIGO, :fecha) returning_values (:CONSUMO);
                if (MASIVA = 'S') then
                    BEGIN
                    COSTOIVA = COSTOTOT + IVAMONTO;
                    COSTO = COSTO * (100 + :IVA) / 100 + :CONSUMO;
                    END
                CONSUMO = CONSUMO * CANT;
                COSTOIVA = COSTOIVA + CONSUMO;
                if (RESERVA = 'S') then
                    BEGIN
                    SELECT SUM(ORID_ENTREGAR)
                        FROM ORDENINVENTARIO_DETALLE OD, ordenes_inventario O
                        WHERE O.ORIN_ID = OD.ORIN_ID AND ARTI_COD = :CODIGO AND ORIN_FECHA <= :FECHA AND ORIN_FECLLEGA >= :FECHA AND ORID_ANULADO = 'N'
                        INTO :ORDENADO;
                    if (ORDENADO IS NULL) then
                        ORDENADO = 0;
                    ORDENC = 0;
                    FOR SELECT O.ORDC_ID, OCDE_ITEM, OCDE_CANT * OCDE_FACTOR
                        FROM ORDENES_COMPRA O, ORDENES_COMPRA_DETALLE OD
                        WHERE O.ORDC_ID = OD.ORDC_ID AND OD.ARTI_COD = :CODIGO AND ORDC_VENCE >= :FECHA AND ORDC_FECHA <= :FECHA AND OCDE_ANULADO = 'N'
                        INTO :ID, :ITEM, :CANT2
                        do
                        BEGIN
                        EXECUTE PROCEDURE FALTANTE(23, 21, ID, ITEM) returning_values (PEDIDO, UND, FACTOR);
                        if (PEDIDO * FACTOR = CANT2) then /* SI NO SE HA FACTURADO MIRE A VER SI SE REMISIONO */
                            EXECUTE PROCEDURE FALTANTE(23, 22, ID, ITEM) returning_values (PEDIDO, UND, FACTOR);
                        if (PEDIDO IS NULL) then
                            PEDIDO = 0;
                        ORDENC = ORDENC + PEDIDO * FACTOR;
                        END
                    ORDENADO = ORDENADO + ORDENC;
                    SELECT SUM(RSDE_LIBERAR)
                        FROM RESERVAS_DETALLE RD, RESERVAS R
                        WHERE R.RESE_ID = RD.RESE_ID AND ARTI_COD = :CODIGO AND RESE_FECHA <= :FECHA AND RESE_VENCE >= :FECHA AND RSDE_ANULADO = 'N'
                        INTO :RESERVADO;
                    if (RESERVADO IS NULL) then
                        RESERVADO = 0;
                    PEDIDO = 0;
                    FOR SELECT P.PEDI_ID, PEDE_ITEM, PEDE_CANT * PEDE_FACTOR
                        FROM PEDIDOS P, PEDIDOS_DETALLE PD
                        WHERE P.PEDI_ID = PD.PEDI_ID AND PD.ARTI_COD = :CODIGO AND PEDI_VENCE >= :FECHA AND PEDI_FECHA <= :FECHA AND PEDE_ANULADO = 'N'
                        INTO :ID, :ITEM, :CANT2
                        do
                        BEGIN
                        EXECUTE PROCEDURE FALTANTE(34, 31, ID, ITEM) returning_values (ORDENC, UND, FACTOR);
                        if ((ORDENC * FACTOR = CANT2) or (PEDAUTO = 'SI')) then /* SI NO SE HA FACTURADO MIRE A VER SI SE REMISIONO */
                            EXECUTE PROCEDURE FALTANTE(34, 32, ID, ITEM) returning_values (ORDENC, UND, FACTOR);
                        if (ORDENC IS NULL) then
                            ORDENC = 0;
                        PEDIDO = PEDIDO + ORDENC * FACTOR;
                        END
                    RESERVADO = RESERVADO + PEDIDO;
                    END
                ELSE
                    BEGIN
                    RESERVADO = 0;
                    ORDENADO = 0;
                    END
                if (LISTA > 0) then
                    SELECT prar_fijo FROM precios_articulo WHERE arti_cod = :CODIGO and lipr_cod = :LISTA INTO :PRECIO;
                if (ENPESO = 'S') then
                    BEGIN
                    if (pesounit IS NULL) then
                        pesounit = 0;
                    if (PESOUNIT <> 0) then
                        BEGIN
                        pesototal = PESOUNIT * cant;
                        SUSPEND;
                        END
                    END
                ELSE
                    SUSPEND;
                END
            END
        END
  end
if (DETALLE = 'N') then
  BEGIN
  FOR SELECT ARTI_COD, ARTI_DES, ARTI_UNIDAD, ARTI_EXIST, TAIV_PORC, A.GRUP_COD, A.SUBG_COD, A.MARC_COD, ARTI_CONSUMO, ARTI_PESO/1000
      FROM ARTICULO A, TARIFA_IVA T
      WHERE ARTI_COD >= :CODINI AND ARTI_COD <= :CODFIN AND ARTI_DES >= :DESINI AND ARTI_DES <= :DESFIN AND ESAR_COD <> 'I' AND A.TAIV_COD = T.TAIV_COD
      INTO :CODIGO, :NOMBRE, :UNIDAD, :EXIST, :IVA, :CODGRUPO, :CODSUBG, :CODMARC, :CONSUMO, :pesounit
      DO
        BEGIN
        OK = 'N';
        if (AGRUPA = 'G') then
            BEGIN
            if ((GRPINI = '0') AND (GRPFIN = 'zz')) then
                OK = 'S';
            else
                if ((CODGRUPO >= GRPINI) AND (CODGRUPO <= GRPFIN)) then
                    OK = 'S';
            end
        ELSE
            if (AGRUPA = 'M') then
                BEGIN
                if ((GRPINI = '0') AND (GRPFIN = 'zzz')) then
                    OK = 'S';
                else
                    if ((CODMARC >= GRPINI) AND (CODMARC <= GRPFIN)) then
                        OK = 'S';
                END
        if (OK = 'S') then
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            CODBAR = NULL;
            SELECT MAX(COBA_COD) FROM BARRAS_ARTICULO WHERE ARTI_COD = :codigo AND COBA_UNIDAD = :unidad INTO :codbar;
            if (CODBAR IS NULL) then
                CODBAR = CODIGO;

            if (EXIST <> 'N') then
                BEGIN
                EXECUTE PROCEDURE SALDO_INICIAL_TOTAL_INV(CODIGO, FECHA) returning_values (CANT);
                EXECUTE PROCEDURE COSTO_PROMEDIO_UNIDAD(CODIGO, FECHA, UNIDAD) returning_values (COSTO);
                EXECUTE PROCEDURE ULTIMO_COSTO(CODIGO, FECHA, UNIDAD) returning_values (ULTCOSTO);
                SELECT FIRST 1 MVAR_FECHA FROM MOVIMIENTO_ARTICULO WHERE ARTI_COD = :CODIGO AND MVAR_ENTRADA = 'S' AND MVAR_FECHA <= :FECHA
                    ORDER BY ARTI_COD DESC, MVAR_FECHA DESC INTO :FECHACOSTO;
                COSTOTOT = :CANT * :COSTO;
                IVAMONTO = COSTOTOT /100 * IVA;
                COSTOIVA = COSTOTOT;
                if (CONSUMO <> 0) then
                    EXECUTE PROCEDURE CONSUMO_HISTORICO (:CODIGO, :fecha) returning_values (:CONSUMO);
                if (MASIVA = 'S') then
                    BEGIN
                    COSTOIVA = COSTOTOT + IVAMONTO;
                    COSTO = COSTO * (100 + :IVA) / 100 + :CONSUMO;
                    END
                CONSUMO = CONSUMO * CANT;
                COSTOIVA = COSTOIVA + CONSUMO;
                if (RESERVA = 'S') then
                    BEGIN
                    SELECT SUM(ORID_ENTREGAR)
                        FROM ORDENINVENTARIO_DETALLE OD, ordenes_inventario O
                        WHERE O.ORIN_ID = OD.ORIN_ID AND ARTI_COD = :CODIGO AND ORIN_FECHA <= :FECHA AND ORIN_FECLLEGA >= :FECHA AND ORID_ANULADO = 'N'
                        INTO :ORDENADO;
                        if (ORDENADO IS NULL) then
                            ORDENADO = 0;
                    ORDENC = 0;
                    FOR SELECT O.ORDC_ID, OCDE_ITEM, OCDE_CANT * OCDE_FACTOR
                        FROM ORDENES_COMPRA O, ORDENES_COMPRA_DETALLE OD
                        WHERE O.ORDC_ID = OD.ORDC_ID AND OD.ARTI_COD = :CODIGO AND ORDC_VENCE >= :FECHA AND ORDC_FECHA <= :FECHA AND OCDE_ANULADO = 'N'
                        INTO :ID, :ITEM, :CANT2
                        do
                        BEGIN
                        EXECUTE PROCEDURE FALTANTE(23, 21, ID, ITEM) returning_values (PEDIDO, UND, FACTOR);
                        if (PEDIDO * FACTOR = CANT2) then /* SI NO SE HA FACTURADO MIRE A VER SI SE REMISIONO */
                            EXECUTE PROCEDURE FALTANTE(23, 22, ID, ITEM) returning_values (PEDIDO, UND, FACTOR);
                        if (PEDIDO IS NULL) then
                            PEDIDO = 0;
                        ORDENC = ORDENC + PEDIDO * FACTOR;
                        END
                    ORDENADO = ORDENADO + ORDENC;
                    SELECT SUM(RSDE_LIBERAR)
                        FROM RESERVAS_DETALLE RD, RESERVAS R
                        WHERE R.RESE_ID = RD.RESE_ID AND ARTI_COD = :CODIGO AND RESE_FECHA <= :FECHA AND RESE_VENCE >= :FECHA AND RSDE_ANULADO = 'N'
                        INTO :RESERVADO;
                    if (RESERVADO IS NULL) then
                        RESERVADO = 0;
                    PEDIDO = 0;
                    FOR SELECT P.PEDI_ID, PEDE_ITEM, PEDE_CANT * PEDE_FACTOR
                        FROM PEDIDOS P, PEDIDOS_DETALLE PD, PUNTO_VENTA PT
                        WHERE P.PEDI_ID = PD.PEDI_ID AND PD.ARTI_COD = :CODIGO AND PT.ptvt_id = P.PTVT_ID AND PEDI_VENCE >= :FECHA AND PEDI_FECHA <= :FECHA AND PEDE_ANULADO = 'N'
                        INTO :ID, :ITEM, :CANT2
                        do
                        BEGIN
                        EXECUTE PROCEDURE FALTANTE(34, 31, ID, ITEM) returning_values (ORDENC, UND, FACTOR);
                        if ((ORDENC * FACTOR = CANT2) or (PEDAUTO = 'SI')) then /* SI NO SE HA FACTURADO MIRE A VER SI SE REMISIONO */
                            EXECUTE PROCEDURE FALTANTE(34, 32, ID, ITEM) returning_values (ORDENC, UND, FACTOR);
                        if (ORDENC IS NULL) then
                            ORDENC = 0;
                        PEDIDO = PEDIDO + ORDENC * FACTOR;
                        END
                    if (PEDIDO IS NULL) then
                        PEDIDO = 0;
                    RESERVADO = RESERVADO + PEDIDO;
                    END
                ELSE
                    BEGIN
                    RESERVADO = 0;
                    ORDENADO = 0;
                    END
                if (LISTA > 0) then
                    SELECT prar_fijo FROM precios_articulo WHERE arti_cod = :CODIGO and lipr_cod = :LISTA INTO :PRECIO;

                if (ENPESO = 'S') then
                    BEGIN
                    if (pesounit IS NULL) then
                        pesounit = 0;
                    if (PESOUNIT <> 0) then
                        BEGIN
                        pesototal = PESOUNIT * cant;
                        SUSPEND;
                        END
                    END
                ELSE
                    SUSPEND;
                END
            END
        END
  END
END
^

SET TERM ; ^

/* 20100806 */

/* DECRETO 2799 CUCUTA */
INSERT INTO CONFIGURACION (CONF_MODULO, CONF_CATEGORIA, CONF_PROPIEDAD, CONF_VALOR, CONF_POSIBLES, CONF_AYUDA) VALUES ('FACTURACION', 'FACTURAS', 'DESCONTAR IVA DE PRODUCTOS DECRETO 2799', 'NO', 'SI,NO', NULL);
COMMIT WORK;
ALTER TABLE ARTICULO
ADD ARTI_DEC2799 T_BOOLEANO;
ALTER TABLE FACTURAS
ADD FACT_DEC2799 T_MONTO;
ALTER TABLE PUNTO_VENTA
ADD PTVT_DEC2799 T_BOOLEANO;

ALTER TABLE CONTABIL_ARTICULO
ADD COAR_CTAIVADEC T_CTA_CONTABLE;
ALTER TABLE INTERFAZ_VENTAS
ADD INVE_CTADTOIVA T_CTA_CONTABLE;

UPDATE PUNTO_VENTA SET PTVT_DEC2799 = 'N';
COMMIT WORK;

update contabil_articulo set coar_ctaivadec = coar_ctaivac;
COMMIT WORK;

SET TERM ^ ;

CREATE OR ALTER TRIGGER PUNTO_VENTA_BI FOR PUNTO_VENTA
ACTIVE BEFORE INSERT POSITION 0
as
begin
if (NEW.ptvt_color IS NULL) then
    NEW.ptvt_color = '0$CCCCCC';
if (NEW.ptvt_dec2799 IS NULL) then
    NEW.ptvt_dec2799 = 'N';
end
^

SET TERM ; ^

UPDATE ARTICULO SET ARTI_DEC2799 = 'N';
COMMIT WORK;

SET TERM ^ ;

CREATE OR ALTER TRIGGER ARTICULO_BI FOR ARTICULO
ACTIVE BEFORE INSERT POSITION 0
as
declare variable EXISTE char(1);
begin
  new.ARTI_FECHA = cast('now' as date);
  /* Verifique que el codigo no se repita */
  EXISTE = 'N';
  select 'S'
  from ARTICULO
  where ARTI_COD = new.ARTI_COD
  into :EXISTE;
  if (EXISTE = 'S') then
    exception ARTICULO_REGISTRADO 'Ya existe un artículo con el código ' || new.ARTI_COD;
  if (new.ARTI_ENSAMBLE is null) then
    new.ARTI_ENSAMBLE = 'N';
  if (new.ARTI_TIENDA is null) then
    new.ARTI_TIENDA = 'N';
  NEW.arti_dec2799 = 'N';
end
^

SET TERM ; ^


ALTER TRIGGER FACTURAS_AU INACTIVE;

UPDATE FACTURAS SET FACT_DEC2799 = 0;
COMMIT WORK;

ALTER TRIGGER FACTURAS_AU ACTIVE;

SET TERM ^ ;

CREATE OR ALTER TRIGGER FACTURAS_BI FOR FACTURAS
ACTIVE BEFORE INSERT POSITION 0
AS
declare variable NUMERO VARCHAR(6);
declare variable AUTOM CHAR(1);
declare variable EXISTE CHAR(1);
DECLARE VARIABLE VALCUPO CHAR(10);
declare variable DISPONIBLE NUMERIC(18,2);
declare variable OK CHAR(1);
declare variable SITOT CHAR(2);
declare variable CODCOBR INTEGER;
declare variable CODVEND INTEGER;
declare variable contado char(1);
declare variable BLOQAUTO CHAR(2);
declare variable FECCONTA VARCHAR(8);
declare variable FECBLO VARCHAR(8);
declare variable FECSERVER CHAR(2);
declare variable PREGTASA CHAR(2);
BEGIN
EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION', 'DOCUMENTOS', 'INHABILITAR FECHA EN DOCUMENTOS') returning_values (:fecserver);
if (FECSERVER = 'SI') then
    NEW.fact_fecha = CAST ('NOW' AS DATE);
if (NEW.fact_anticipo IS NULL) then
    NEW.fact_anticipo = 0;
/* doble moneda */
if ((NEW.fact_trm IS NULL) or (NEW.fact_trm = 0)) then
    NEW.fact_trm = 1;
EXECUTE PROCEDURE LEE_CONFIGURACION('GENERAL', 'GENERAL', 'PREGUNTAR TASA DE CAMBIO EN DOCUMENTOS DE CARTERA') returning_values (:pregtasa);
if (PREGTASA = 'SI') then
    BEGIN
    NEW.fact_dtomonto = NEW.fact_dtomonto * NEW.fact_trm;
    NEW.fact_comimonto = NEW.fact_comimonto * NEW.fact_trm;
    NEW.fact_adicional = NEW.fact_adicional * NEW.fact_trm;
    NEW.fact_ivamonto = NEW.fact_ivamonto * NEW.fact_trm;
    NEW.fact_rtftemonto = NEW.fact_rtftemonto * NEW.fact_trm;
    NEW.fact_rtivamonto = NEW.fact_rtivamonto * NEW.fact_trm;
    NEW.fact_rticamonto = NEW.fact_rticamonto * NEW.fact_trm;
    NEW.fact_extra = NEW.fact_extra * NEW.fact_trm;
    NEW.fact_dtofmonto = NEW.fact_dtofmonto * NEW.fact_trm;
    NEW.fact_total = NEW.fact_total * NEW.fact_trm;
    NEW.fact_dtoit1 = NEW.fact_dtoit1 * NEW.fact_trm;
    NEW.fact_dtoit2 = NEW.fact_dtoit2 * NEW.fact_trm;
    NEW.fact_dtoit3 = NEW.fact_dtoit3 * NEW.fact_trm;
    END
EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION', 'POS', 'CAMBIAR FECHA DE BLOQUEO AUTOMATICAMENTE AL CAMBIAR FECHA DE LA FACTURA') RETURNING_VALUES (:bloqauto);
if (bloqauto = 'SI') then
    BEGIN
    EXECUTE PROCEDURE LEE_CONFIGURACION ('CONTABILIDAD', 'GENERAL', 'FECHA DE BLOQUEO') RETURNING_VALUES (:FECBLO);
    EXECUTE PROCEDURE fecha_a_conta (NEW.fact_fecha) returning_values (:FECCONTA);
    if (FECBLO > FECCONTA) then
        EXCEPTION CONTABILIDAD_BLOQUEADA 'La contabilidad esta bloqueada a ' || :fecblo;
    if (FECBLO < FECCONTA) then
        UPDATE CONFIGURACION
            SET CONF_VALOR = :FECCONTA
            WHERE (CONF_MODULO = 'CONTABILIDAD') AND (CONF_CATEGORIA = 'GENERAL') AND (CONF_PROPIEDAD = 'FECHA DE BLOQUEO');
    END
OK = 'S';
EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'ACCION A TOMAR SI EL CUPO DE CREDITO ES INSUFICIENTE') RETURNING_VALUES (:VALCUPO);
select auto_contado, auto_numero from autorizaciones
    where pref_pre = new.pref_pre and tido_cod = 31 AND auto_inicial <= new.fact_numero and auto_final >= new.fact_numero and auto_fecha <= new.fact_fecha and auto_vence >= new.fact_fecha
    into :contado, new.auto_numero;
if (contado='N') then
    BEGIN
    IF (VALCUPO = 'PROHIBIR') THEN
        BEGIN
        OK = 'N';
        /* VERIFIQUE EL CUPO DE CREDITO */
        execute procedure cupo_disponible(new.TERC_NIT, NEW.fact_fecha, NEW.fact_sucursal) returning_values (:DISPONIBLE);
        if (DISPONIBLE >= (NEW.FACT_TOTAL-NEW.fact_recibido)) then
            OK = 'S';
        END
    END
else
    BEGIN
    /* ASEGURECE QUE QUEDA SIN DIAS DE CREDITO */
    NEW.fact_vence = NEW.fact_fecha;
    END
IF (OK = 'S') THEN
  begin
  /* calcule la comision */
  EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION', 'VENDEDORES', 'COMISIONES EN VENTA INCLUYENDO IMPUESTOS') returning_values (:SITOT);
  if ((NEW.fact_comiporc IS NULL) or (NEW.fact_comiporc = 0)) THEN
    BEGIN
    if (SITOT = 'SI') then
      SELECT MAX(COMI_PORC) FROM comisiones WHERE VEND_COD = NEW.vend_cod AND
        COMI_INICIAL <= NEW.fact_total AND COMI_FINAL >= NEW.fact_total
        INTO NEW.fact_comiporc;
    else
      SELECT MAX(COMI_PORC) FROM comisiones WHERE VEND_COD = NEW.vend_cod AND
        COMI_INICIAL <= (NEW.fact_total -NEW.fact_ivamonto) AND COMI_FINAL >= (NEW.fact_total -NEW.fact_ivamonto)
        INTO NEW.fact_comiporc;
    if (NEW.fact_comiporc IS NULL) then
        NEW.fact_comiporc = 0;
    END
  if (SITOT = 'SI') then
      NEW.fact_comimonto = NEW.fact_total * NEW.fact_comiporc / 100;
  ELSE
      NEW.fact_comimonto = (NEW.fact_total -NEW.fact_ivamonto) * NEW.fact_comiporc / 100;

  if (NEW.numok = 'N') then
    BEGIN
    /* Actualice el contador del prefijo */
    SELECT PREF_ACTUAL, PREF_AUTO FROM PREFIJOS WHERE TIDO_COD = 31 AND PREF_PRE = NEW.PREF_PRE INTO :NUMERO, :AUTOM;
    /* ACTUALICE EL NUMERO EN ENCABEZADO  */
    if (AUTOM = 'S') then
        BEGIN
        NEW.FACT_NUMERO = NUMERO;
        NUMERO = CAST((CAST(NUMERO AS INTEGER) + 1) AS CHAR(6));
        UPDATE PREFIJOS
            SET PREF_ACTUAL = :NUMERO
            WHERE TIDO_COD = 31 AND PREF_PRE = NEW.PREF_PRE;
        END
    ELSE
        BEGIN
        if (CAST(NUMERO AS INTEGER) = CAST(NEW.FACT_NUMERO AS INTEGER)) then
            UPDATE PREFIJOS
                SET PREF_ACTUAL = CAST((CAST(PREF_ACTUAL AS INTEGER) + 1) AS CHAR(6))
                WHERE TIDO_COD = 31 AND PREF_PRE = NEW.PREF_PRE;
        END
    EXECUTE PROCEDURE COMPLETA_CEROS (NEW.FACT_numero) returning_values (NEW.FACT_numero);
    NEW.numok = 'S';
    END
  /* Verifique que el numero no existe previamente */
  EXISTE = 'N';
  SELECT 'S' FROM FACTURAS WHERE PREF_PRE = NEW.PREF_PRE AND FACT_NUMERO = NEW.FACT_NUMERO INTO :EXISTE;
  if (EXISTE = 'S') then
    EXCEPTION DOCUMENTO_REGISTRADO 'Ya existe una factura con el número ' || new.pref_pre || new.fact_numero;
  end
else
  begin
  EXCEPTION CUPO_INSUFICIENTE;
  end

select COBR_COD, VEND_COD FROM CLIENTE_SUCURSALES WHERE TERC_NIT = NEW.terc_nit AND CLCU_COD = NEW.fact_sucursal INTO :CODCOBR, CODVEND;
if (NEW.vend_cod IS NULL) then
    NEW.vend_cod = :CODVEND;
if (NEW.cobr_cod IS NULL) then
    BEGIN
    EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'COMISIONES', 'UNIFICAR CODIGOS DE VENDEDORES Y COBRADORES') returning_values (:SITOT);
    if ((SITOT = 'SI') AND (NEW.vend_cod IS NOT NULL)) then
        NEW.cobr_cod = NEW.vend_cod;
    else
        NEW.cobr_cod = :CODCOBR;
    END
if ((new.FACT_TOTAL-new.FACT_IVAMONTO+new.FACT_DTOMONTO-new.FACT_ADICIONAL) = 0) then
    NEW.FACT_FACTOR = 1;
else
    NEW.FACT_FACTOR = (new.FACT_TOTAL-new.FACT_IVAMONTO)/(new.FACT_TOTAL-new.FACT_IVAMONTO+new.FACT_DTOMONTO-new.FACT_ADICIONAL);
if (new.fact_vence < new.fact_fecha) then
    new.fact_vence = new.fact_fecha;
if (NEW.fact_dec2799 IS NULL) then
    NEW.fact_dec2799 = 0;
END
^

SET TERM ; ^


ALTER TABLE DEVOLUCIONES_VENTAS
ADD DEVT_DEC2799 T_MONTO;

ALTER TRIGGER devoluciones_ventas_au INACTIVE;

UPDATE devoluciones_ventas SET DEVT_DEC2799 = 0;
COMMIT WORK;

ALTER TRIGGER devoluciones_ventas_au ACTIVE;

SET TERM ^ ;

CREATE OR ALTER TRIGGER DEVOLUCIONES_VENTAS_BI FOR DEVOLUCIONES_VENTAS
ACTIVE BEFORE INSERT POSITION 0
AS
declare variable NUMERO VARCHAR(6);
declare variable AUTOM CHAR(1);
declare variable EXISTE CHAR(1);
declare variable SITOT CHAR(2);
declare variable CODCOBR INTEGER;
declare variable CODVEND INTEGER;
declare variable FECSERVER CHAR(2);
declare variable PREGTASA CHAR(2);
BEGIN
if ((NEW.devt_trm IS NULL) or (NEW.devt_trm = 0)) then
    NEW.devt_trm = 1;
EXECUTE PROCEDURE LEE_CONFIGURACION('GENERAL', 'GENERAL', 'PREGUNTAR TASA DE CAMBIO EN DOCUMENTOS DE CARTERA') returning_values (:pregtasa);
if (PREGTASA = 'SI') then
    BEGIN
    NEW.devt_adicional = NEW.devt_adicional * NEW.devt_trm;
    NEW.devt_ivamonto = NEW.devt_ivamonto * NEW.devt_trm;
    NEW.devt_extra = NEW.devt_extra * NEW.devt_trm;
    NEW.devt_rtftemonto = NEW.devt_rtftemonto * NEW.devt_trm;
    NEW.devt_rtivamonto = NEW.devt_rtivamonto * NEW.devt_trm;
    NEW.devt_rticamonto = NEW.devt_rticamonto * NEW.devt_trm;
    NEW.devt_dtomonto = NEW.devt_dtomonto * NEW.devt_trm;
    END
EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION', 'DOCUMENTOS', 'INHABILITAR FECHA EN DOCUMENTOS') returning_values (:fecserver);
if (FECSERVER = 'SI') then
    NEW.devt_fecha = CAST ('NOW' AS DATE);
if (new.devt_remid is null) then
    NEW.devt_remid = 0;
if (new.devt_pedid is null) then
    NEW.devt_pedid = 0;
if (new.devt_dec2799 is null) then
    NEW.devt_dec2799 = 0;
execute procedure LEE_CONFIGURACION ('FACTURACION','DEVOLUCIONES','PERMITIR DEVOLVER ITEMS NO FACTURADOS') returning_values (:SITOT);
if ((SITOT = 'NO') AND (NEW.devt_factid = 0) AND (NEW.devt_remid = 0) AND (NEW.devt_pedid = 0)) then
    exception factura_no_existe;
/* CALCULE LA COMISION CON BASE EN LA FACTURA */
EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION', 'VENDEDORES', 'COMISIONES EN VENTA INCLUYENDO IMPUESTOS') returning_values (:SITOT);
SELECT FACT_COMIPORC FROM FACTURAS WHERE FACT_ID = NEW.devt_factid INTO NEW.devt_comiporc;
if (NEW.devt_comiporc IS NULL) then
    NEW.devt_comiporc = 0;

if (SITOT = 'SI') then
    NEW.devt_comimonto = NEW.devt_total * NEW.devt_comiporc / 100;
ELSE
    NEW.devt_comimonto = (NEW.devt_total - NEW.devt_ivamonto) * NEW.devt_comiporc / 100;

if (NEW.numok = 'N') then
  BEGIN
  /* Actualice el contador del prefijo */
  SELECT PREF_ACTUAL, PREF_AUTO FROM PREFIJOS WHERE TIDO_COD = 33 AND PREF_PRE = NEW.PREF_PRE INTO :NUMERO, :AUTOM;
  /* ACTUALICE EL NUMERO EN COMPROBANTE_ENCABEZADO  */
  if (AUTOM = 'S') then
    BEGIN
    NEW.DEVT_NUMERO = NUMERO;
    NUMERO = CAST((CAST(NUMERO AS INTEGER) + 1) AS CHAR(6));
    UPDATE PREFIJOS
      SET PREF_ACTUAL = :NUMERO
    WHERE TIDO_COD = 33 AND PREF_PRE = NEW.PREF_PRE;
    END
  ELSE
    BEGIN
    if (CAST(NUMERO AS INTEGER) = CAST(NEW.DEVT_NUMERO AS INTEGER)) then
        UPDATE PREFIJOS
          SET PREF_ACTUAL = CAST((CAST(PREF_ACTUAL AS INTEGER) + 1) AS CHAR(6))
        WHERE TIDO_COD = 33 AND PREF_PRE = NEW.PREF_PRE;
    END
  EXECUTE PROCEDURE COMPLETA_CEROS (NEW.DEVT_numero) returning_values (NEW.DEVT_numero);
  NEW.numok = 'S';
  END
/* Verifique que el numero no existe previamente */
EXISTE = 'N';
SELECT 'S' FROM DEVOLUCIONES_VENTAS WHERE PREF_PRE = NEW.PREF_PRE AND DEVT_NUMERO = NEW.DEVT_NUMERO INTO :EXISTE;
if (EXISTE = 'S') then
    EXCEPTION DOCUMENTO_REGISTRADO 'Ya existe una devolución con el número ' || new.pref_pre || new.devt_numero;
select COBR_COD, VEND_COD FROM CLIENTES WHERE TERC_NIT = NEW.terc_nit INTO :CODCOBR, CODVEND;
if (NEW.cobr_cod IS NULL) then
    NEW.cobr_cod = :CODCOBR;
if (NEW.vend_cod IS NULL) then
    NEW.vend_cod = :CODVEND;
if (NEW.devt_aplica IS NULL) then
    NEW.devt_aplica = 'N';
if ((new.DEVT_TOTAL-new.DEVT_IVAMONTO+new.DEVT_DTOMONTO-new.DEVT_ADICIONAL) = 0) then
    NEW.DEVT_FACTOR = 1;
else
    NEW.DEVT_FACTOR = (new.DEVT_TOTAL-new.DEVT_IVAMONTO)/(new.DEVT_TOTAL-new.DEVT_IVAMONTO+new.DEVT_DTOMONTO-new.DEVT_ADICIONAL);
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure CONTABIL_FACTURA (
    IDDOC integer,
    IDINTER integer)
returns (
    ERROR integer,
    VER char(1),
    IDC integer)
AS
declare variable pref varchar(4);
declare variable num varchar(6);
declare variable numero varchar(10);
declare variable fecaux date;
declare variable fecha char(8);
declare variable conc varchar(60);
declare variable venceaux date;
declare variable vence char(8);
declare variable vrdto numeric(18,2);
declare variable vradic numeric(18,2);
declare variable vrsubt numeric(18,2);
declare variable vriva numeric(18,2);
declare variable prtfte numeric(9,2);
declare variable vrrtfte numeric(18,2);
declare variable vrrtiva numeric(18,2);
declare variable prtica numeric(9,2);
declare variable vrrtica numeric(18,2);
declare variable vrtotal numeric(18,2);
declare variable vrextra numeric(18,2);
declare variable tipocomp varchar(3);
declare variable prefcont varchar(4);
declare variable ventas char(1);
declare variable ctaventas varchar(20);
declare variable iva char(1);
declare variable ctaiva varchar(20);
declare variable ctadtoiva varchar(20);
declare variable consumo char(1);
declare variable ctaconsumo varchar(20);
declare variable cartera char(1);
declare variable ctacartera varchar(20);
declare variable rtfte char(1);
declare variable ctartfte varchar(20);
declare variable rtiva char(1);
declare variable ctartiva varchar(20);
declare variable rtica char(1);
declare variable ctartica varchar(20);
declare variable inven char(1);
declare variable ctainven varchar(20);
declare variable costos char(1);
declare variable ctacostos varchar(20);
declare variable ctadto varchar(20);
declare variable ctaadic varchar(20);
declare variable ctaextra varchar(20);
declare variable existe char(1);
declare variable cuenta varchar(20);
declare variable monto numeric(18,2);
declare variable tipocuen char(1);
declare variable nit varchar(20);
declare variable nombre varchar(60);
declare variable proy varchar(4);
declare variable centro varchar(4);
declare variable proyi varchar(4);
declare variable centi varchar(4);
declare variable porc numeric(5,2);
declare variable debito numeric(18,2);
declare variable credito numeric(18,2);
declare variable nroi integer;
declare variable imptos numeric(18,2);
declare variable suma numeric(18,2);
declare variable tctaclien varchar(20);
declare variable tctaventa varchar(20);
declare variable tctartfte varchar(20);
declare variable tctartiva varchar(20);
declare variable tctartica varchar(20);
declare variable ctadic varchar(20);
declare variable baseadic varchar(20);
declare variable porcadic numeric(5,2);
declare variable valoradic numeric(18,2);
declare variable dbadic char(1);
declare variable ptovta integer;
declare variable anulado char(1);
declare variable dig integer;
declare variable mercancia numeric(18,2);
declare variable fomento varchar(2);
declare variable DTOXIT varchar(2);
declare variable vrconsumo numeric(18,2);
declare variable factor double precision;
declare variable cent char(1);
declare variable AUTORET VARCHAR(10);
declare variable FAUTORET DATE;
declare variable ERRORC INTEGER;
declare variable ICOING CHAR(2);
declare variable DEC2799 char(2);
BEGIN
EXECUTE PROCEDURE lee_configuracion ('FACTURACION', 'FACTURAS', 'DESCONTAR IVA DE PRODUCTOS DECRETO 2799') returning_values (:DEC2799);
EXECUTE PROCEDURE LEE_CONFIGURACION('COMPRAS', 'FACTURAS', 'USAR IMPOCONSUMO COMO PORCENTAJE DE FOMENTO') returning_values (FOMENTO);
EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION', 'ARTICULOS', 'IMPOCONSUMO COMO MAYOR VALOR DEL COSTO Y DEL INGRESO') returning_values (ICOING);
EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'FECHA AUTORETENEDOR NO DESCONTAR RETENCIONES DEL SALDO PERO SI CONTABILIZARLAS') returning_values (AUTORET);
if (AUTORET <> '') then
    FAUTORET = CAST(AUTORET AS DATE);
else
    FAUTORET = '9999/12/31';
/* BUSQUE LA INTERFACE */
EXISTE = 'N';
SELECT 'S', TICO_COD, PRCO_PRE, INVE_VENTAS, INVE_IVA, INVE_CONSUMO, INVE_CARTERA, INVE_RTFTE, INVE_RTIVA, INVE_RTICA, INVE_COSTO, INVE_INVEN, INVE_CTAVENTAS, INVE_CTAIVA, INVE_CTACONSUMO, INVE_CTADTO, INVE_CTAADIC, INVE_CTAEXTRA, INVE_CTACARTERA, INVE_CTARTFTE, INVE_CTARTIVA, INVE_CTARTICA, INVE_CTAINVEN, INVE_CTACOSTOS, INVE_CONFIRMAR, INVE_CENTRO, inve_ctadtoiva
    FROM INTERFAZ_VENTAS
    WHERE INVE_ID = :IDINTER
    INTO :EXISTE, :TIPOCOMP, :PREFCONT, :VENTAS, :IVA, :CONSUMO, :CARTERA, :RTFTE, :RTIVA, :RTICA, :COSTOS, :INVEN, :CTAVENTAS, :CTAIVA, :CTACONSUMO, :CTADTO, :CTAADIC, :CTAEXTRA, :CTACARTERA, :CTARTFTE, :CTARTIVA, :CTARTICA, :CTAINVEN, :CTACOSTOS, :VER, :CENT, :ctadtoiva;
if (EXISTE = 'S') then
  BEGIN
    /* BORRE CUALQUEIR CONTABILIZACION PREVIA */
    DELETE FROM CONTABILIZACION WHERE CNTB_TIPOREF = 31 AND CNTB_IDREF = :IDDOC;

  /* TRAIGA EL ENCABEZADO DE LA FACTURA */
  SELECT PREF_PRE, FACT_NUMERO, FACT_FECHA, F.TERC_NIT, PTVT_ID, FACT_VENCE, FACT_DTOMONTO, FACT_ADICIONAL, FACT_IVAMONTO, FACT_EXTRA, FACT_TOTAL, FACT_RTFTEPOR, FACT_RTFTEMONTO, FACT_RTIVAPOR, FACT_RTIVAMONTO, FACT_RTICAPOR, FACT_RTICAMONTO, FACT_NOMCLIENTE, TERC_CTARTFTE, TERC_CTARTIVA, TERC_CTARTICA, TERC_CTAVENTA, TERC_CTACLIENTE, FACT_ANULADO
        FROM FACTURAS F, TERCEROS T
        WHERE FACT_ID = :IDDOC AND F.TERC_NIT = T.TERC_NIT
        INTO :PREF, :NUM, :FECAUX, :NIT, :PTOVTA, :VENCEAUX, :VRDTO, :VRADIC, :VRIVA, :VREXTRA, :VRTOTAL, :PRTFTE, :VRRTFTE, :PORC, :VRRTIVA, :PRTICA, :VRRTICA, :NOMBRE, TCTARTFTE, TCTARTIVA, TCTARTICA, TCTAVENTA, TCTACLIEN, ANULADO;
  if (ANULADO = 'N') then
    BEGIN
    /* BUSQUE EL CENTRO DEL PUNTO, LA BODEGA, O EL PREFIJO  */
    IF (CENT = 'B') THEN
        SELECT B.BODE_CENTRO, B.BODE_PROY FROM BODEGA B, FACTURAS F
            WHERE B.BODE_COD = F.BODE_COD AND F.FACT_ID = :IDDOC INTO :CENTRO, :PROY;
    IF (CENT = 'V') THEN
        SELECT V.CENT_COD, V.PROY_COD FROM VENDEDORES V, FACTURAS F
            WHERE V.VEND_COD = F.VEND_COD AND F.FACT_ID = :IDDOC INTO :CENTRO, :PROY;
    IF (CENT = 'P') THEN
        SELECT P.PREF_CENTRO,P.PREF_PROY  FROM PREFIJOS P, FACTURAS F
            WHERE P.PREF_PRE = F.PREF_PRE AND F.FACT_ID = :IDDOC AND P.TIDO_COD = 31 INTO :CENTRO, :PROY;
    NUMERO = PREF || NUM;
    SELECT SUM (FADE_CONSUMO) FROM FACTURAS_DETALLE WHERE FACT_ID = :IDDOC  AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
        INTO MERCANCIA;
    VRSUBT = VRTOTAL - VREXTRA - VRIVA - MERCANCIA; /* BASE DE RETEFTE Y RETEICA */

    EXECUTE PROCEDURE lee_configuracion ('FACTURACION', 'FACTURAS', 'DESCUENTO PIE FACTURA IGUAL A SUMA DE DESCUENTOS POR ITEM') returning_values (:DTOXIT);
    if (DTOXIT = 'SI') then
        VRDTO = 0;
    MERCANCIA = VRSUBT - VRADIC + VRDTO;
    EXECUTE PROCEDURE FECHA_A_CONTA(:FECAUX) returning_values (:FECHA);
    EXECUTE PROCEDURE FECHA_A_CONTA(:VENCEAUX) returning_values (:VENCE);
    /* REGISTRE EL ENCABEZADO CONTABLE */
    IDC = GEN_ID(ID_CONTABILIZA, 1);
    if (STRLEN(NOMBRE)> 43 ) then
      CONC = 'FV No.' || NUMERO || '-' || SUBSTR(NOMBRE,1,43);
    ELSE
      CONC = 'FV No.' || NUMERO || '-' || NOMBRE;
    INSERT INTO CONTABILIZACION (CNTB_ID, CNTB_TIPOCOMP, CNTB_PREFCNT, CNTB_NUMERO, CNTB_FECHA, CNTB_CONCEPTO, CNTB_REF, CNTB_TIPOREF, CNTB_IDREF, CNTB_PREFREF, CNTB_NUMREF, CNTB_PROCESADO)
        VALUES (:IDC, :TIPOCOMP, :PREFCONT, :NUM, :FECHA, :CONC, '', 31, :IDDOC, :PREF, :NUM, 'N');
    NROI = 0;
    SUMA = 0;
    ERROR = 0;
    /* SI NO HAY CUENTA DE DESCUENTO NI ADICIONAL CALCULE UN FACTOR PARA LAS VENTAS Y EL IVA */
    if (MERCANCIA <> 0) then
        FACTOR = CAST(VRSUBT AS DOUBLE PRECISION) / CAST(MERCANCIA AS DOUBLE PRECISION);
    ELSE
        FACTOR = 1;
    /* TRAIGA EL NUMERO DE DIGITOS PARA EL REDONDEO */
    SELECT CAST(CONF_VALOR AS INTEGER) FROM CONFIGURACION WHERE CONF_MODULO = 'FACTURACION' AND
        CONF_CATEGORIA = 'GENERAL' AND CONF_PROPIEDAD = 'REDONDEO AL MULTIPLO DE DIEZ EN TOTALES' INTO :DIG;
    /* CUENTAS DE VENTAS */
    if (VENTAS = 'A') then
        BEGIN
        FOR SELECT MAX(COAR_CTAVNT), SUM(FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), SUM(FADE_IVAMONTO), SUM(FADE_CONSUMO), MAX(B.bode_proy), MAX(B.bode_centro)
            FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_DETALLE F, bodega b
            WHERE F.FACT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL)) and
            f.bode_cod = b.bode_cod
            GROUP BY COAR_CTAVNT
            INTO :CTAVENTAS, :MONTO, :IMPTOS, :VRCONSUMO, :PROYI, :CENTI
            DO
            BEGIN
            if ((FOMENTO = 'SI') or (icoing = 'SI')) then
                MONTO = MONTO + VRCONSUMO;
            if ((CTADTO IS NULL) OR (CTADTO = '')) then
                MONTO = MONTO * FACTOR;
            execute procedure redondee(MONTO, DIG) returning_values (MONTO);
            if (MONTO <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTAVENTAS, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (31, :IDDOC, :CUENTA, 3);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    NROI = NROI + 1;
                    SUMA = SUMA - MONTO;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    IF (CENT = 'B') THEN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROYI, :CENTI, NULL, NULL, NULL, NULL, 0, 0);
                    ELSE
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA - MONTO;
                    END
                END /* MONTO <> 0 */
            END /* FOR */
        END /* VENTAS X ARTICULO */
     IF ((VENTAS = 'C') OR (VENTAS = 'K')) THEN
        BEGIN
        IF (VENTAS = 'C') THEN
            CTAVENTAS = TCTAVENTA;
        SELECT SUM(FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), SUM(FADE_IVAMONTO), SUM (FADE_CONSUMO)
            FROM FACTURAS_DETALLE F
            WHERE F.FACT_ID = :IDDOC AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
            INTO :MONTO, :IMPTOS, :VRCONSUMO;
        if ((FOMENTO = 'SI') or (ICOING = 'SI')) then
            MONTO = MONTO + VRCONSUMO;
        if ((CTADTO IS NULL) OR (CTADTO = '')) then
            MONTO = MONTO * FACTOR;
        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
        if (MONTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTAVENTAS, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERROR (31, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - MONTO;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - MONTO;
                END
            END /* MONTO <> 0 */
        END /* VENTAS DE CLIENTE O CONSTANTE */
    /* EL IVA EN VENTAS */
    if (IVA = 'A') then
        BEGIN
        FOR SELECT MAX(COAR_CTAIVAV), SUM(FADE_IVAMONTO), SUM(FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), sum(FADE_CONSUMO)
            FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_DETALLE F
            WHERE F.FACT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
            GROUP BY COAR_CTAIVAV
            INTO :CTAIVA, :IMPTOS, :MONTO, :VALORADIC
            DO
            BEGIN
            if (FOMENTO = 'SI') then
                MONTO = MONTO + VALORADIC;
            MONTO = MONTO * -1;
            MONTO = MONTO * FACTOR;
            IMPTOS = IMPTOS * FACTOR;
            execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
            execute procedure redondee(MONTO, DIG) returning_values (MONTO);
            if (IMPTOS <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTAIVA, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (31, :IDDOC, :CUENTA, 3);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, :MONTO, ABS(:IMPTOS*100/:MONTO), :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    NROI = NROI + 1;
                    SUMA = SUMA - IMPTOS;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, :MONTO, ABS(:IMPTOS*100/:MONTO), :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA - IMPTOS;
                    END
                END   /* IMPTOS <> 0 */
            END /* FOR */
        if (DEC2799 = 'SI') then
            BEGIN
            FOR SELECT MAX(COAR_CTAIVADEC), SUM(FADE_IVAMONTO), SUM(FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), sum(FADE_CONSUMO)
                FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_DETALLE F
                WHERE F.FACT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
                    AND A.arti_dec2799 = 'S'
                GROUP BY COAR_CTAIVADEC
                INTO :CTADTOIVA, :IMPTOS, :MONTO, :VALORADIC
                DO
                BEGIN
                if (FOMENTO = 'SI') then
                    MONTO = MONTO + VALORADIC;
                MONTO = MONTO * -1;
                MONTO = MONTO * FACTOR;
                IMPTOS = IMPTOS * FACTOR;
                execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                if (IMPTOS <> 0) then
                    BEGIN
                    EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTADTOIVA, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                    if (ERRORC <> 0) then
                        ERROR = ERROR + 1;
                    if (TIPOCUEN = 'N') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :IMPTOS, 0, :MONTO, ABS(:IMPTOS*100/:MONTO), :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NROI = NROI + 1;
                        SUMA = SUMA + IMPTOS;
                        END
                    END   /* IMPTOS <> 0 */
                END
            END
        END /* IVA X ARTICULO */
    if (IVA = 'K') then /* IVA EN CTA CONSTANTE */
        BEGIN
        SELECT SUM(FADE_IVAMONTO), SUM(FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), SUM(FADE_CONSUMO)
            FROM FACTURAS_DETALLE F
            WHERE F.FACT_ID = :IDDOC and FADE_IVAMONTO <> 0 AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
            INTO :IMPTOS, :MONTO, :valoradic;
        if (FOMENTO = 'SI') then
            MONTO = MONTO + VALORADIC;
        MONTO = MONTO * -1;
        MONTO = MONTO * FACTOR;
        IMPTOS = IMPTOS * FACTOR;
        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
        execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
        if (IMPTOS <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTAIVA, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERROR (31, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', 0, :IMPTOS, :MONTO, ABS(:IMPTOS*100/:MONTO), :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - IMPTOS;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', 0, :IMPTOS, :MONTO, ABS(:IMPTOS*100/:MONTO), :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - IMPTOS;
                END
            END /* IMPTOS <> 0 */
        if (DEC2799 = 'SI') then
            BEGIN
            SELECT SUM(FADE_IVAMONTO), SUM(FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), SUM(FADE_CONSUMO)
                FROM FACTURAS_DETALLE F, ARTICULO A
                WHERE F.FACT_ID = :IDDOC and FADE_IVAMONTO <> 0 AND F.arti_cod = A.arti_cod AND
                ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL)) AND A.arti_dec2799 = 'S'
                INTO :IMPTOS, :MONTO, :valoradic;
            if (FOMENTO = 'SI') then
                MONTO = MONTO + VALORADIC;
            MONTO = MONTO * -1;
            MONTO = MONTO * FACTOR;
            IMPTOS = IMPTOS * FACTOR;
            execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
            execute procedure redondee(MONTO, DIG) returning_values (MONTO);
            if (IMPTOS <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTADTOIVA, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :IMPTOS, 0, :MONTO, ABS(:IMPTOS*100/:MONTO), :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA + IMPTOS;
                    END
                END   /* IMPTOS <> 0 */
            END
        END /* IVA EN CTA CONSTANTE */
    /* EL IMPOCONSUMO */
    if ((CONSUMO = 'A') AND (FOMENTO <> 'SI')) then
        BEGIN
        FOR SELECT MAX(COAR_CTACONS), SUM(FADE_CONSUMO)
            FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_DETALLE F
            WHERE F.FACT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
            GROUP BY COAR_CTACONS
            INTO :CTACONSUMO, :IMPTOS
        DO
            BEGIN
            execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
            if (IMPTOS <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTACONSUMO, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (31, :IDDOC, :CUENTA, 3);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    NROI = NROI + 1;
                    SUMA = SUMA - IMPTOS;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA - IMPTOS;
                    END
                END /* IMPTOS <> 0 */
            END /* FOR */
        END /* CONSUMO X ARTICULO */
    if ((CONSUMO = 'K') AND (FOMENTO <> 'SI')) then /* CONSUMO EN CTA CONSTANTE */
        BEGIN
        SELECT SUM(FADE_CONSUMO)
            FROM FACTURAS_DETALLE F
            WHERE F.FACT_ID = :IDDOC AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
            INTO :IMPTOS;
        execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
        if (IMPTOS <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTACONSUMO, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERROR (31, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTACONSUMO, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - IMPTOS;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTACONSUMO, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - IMPTOS;
                END
            END /* IMPTOS <> 0 */
        END /* CONSUMO EN CTA CONSTANTE */
    /* DESCUENTO */
    if ((CTADTO IS NOT NULL) AND (CTADTO <> '')) then
        BEGIN
        execute procedure redondee(VRDTO, DIG) returning_values (VRDTO);
        if (VRDTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTADTO, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRDTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA + VRDTO;
                END
            if (TIPOCUEN = 'N') then
                    BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRDTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA + VRDTO;
                END
            END
        END /* DESCUENTO */
    /* VALOR ADIC */
    if ((CTAADIC IS NOT NULL) AND (CTAADIC <> '')) then
        BEGIN
        execute procedure redondee(VRADIC, DIG) returning_values (VRADIC);
        if (VRADIC <> 0) THEN
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTAADIC, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRADIC, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - VRADIC;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRADIC, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - VRADIC;
                END
            END
        END /* VR. ADIC */
    /* VALOR EXTRA */
    if ((CTAEXTRA IS NOT NULL) AND (CTAEXTRA <> '')) THEN
        BEGIN
        execute procedure redondee(VREXTRA, DIG) returning_values (VREXTRA);
        if (VREXTRA <> 0) THEN
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTAEXTRA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VREXTRA, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - VREXTRA;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VREXTRA, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - VREXTRA;
                END
            END
        END /* VR. EXTRA */
    /* DESCUENTE EL IMPOCONSUMO */
    SELECT SUM(FADE_CONSUMO)
        FROM FACTURAS_DETALLE F WHERE F.FACT_ID = :IDDOC AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL)) INTO :IMPTOS;
    vrsubt = vrsubt - IMPTOS;
    /* RETENCION FUENTE */
    if ((RTFTE = 'C') or (RTFTE = 'K')) then
      BEGIN
      execute procedure redondee(VRRTFTE, DIG) returning_values (VRRTFTE);
      if (VRRTFTE <> 0) then
        BEGIN
        if (RTFTE = 'C') then
            CTARTFTE = TCTARTFTE;
        EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTARTFTE, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :VRSUBT, :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTFTE;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :VRSUBT, :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTFTE;
            END
        /* AUTORETENCION */
        if (FAUTORET <= fecaux) then
            BEGIN
            EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'CUENTA DE AUTORETENCION EN LA FUENTE') returning_values (CTARTFTE);
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTARTFTE INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERROR (31, :IDDOC, :CTARTFTE, 2);
                CUENTA = CTARTFTE;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                begin
                EXECUTE PROCEDURE ERROR (31, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, (:VRSUBT*-1), :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - VRRTFTE;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, (:VRSUBT*-1), :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - VRRTFTE;
                END
            END
        END /* RTFTE */
      END
    if (RTFTE = 'A') then
      BEGIN
      FOR SELECT MAX(COAR_CTARTFTEV), MAX(COAR_RTFTE), MIN(COAR_RTBASE), SUM(FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), SUM((FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO)*COAR_RTFTE)
        FROM CONTABIL_ARTICULO C, FACTURAS_DETALLE F
        WHERE F.FACT_ID = :IDDOC AND F.ARTI_COD = C.ARTI_COD AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
        GROUP BY COAR_CTARTFTEV
        INTO :CTARTFTE, :PRTFTE, :baseadic, :MONTO, :VRRTFTE
        DO
        BEGIN
        MONTO = MONTO * FACTOR;
        if (MONTO >= BASEADIC) then
            BEGIN
            VRRTFTE = VRRTFTE * FACTOR / 100;
            execute procedure redondee(VRRTFTE, DIG) returning_values (VRRTFTE);
            execute procedure redondee(MONTO, DIG) returning_values (MONTO);
            if (VRRTFTE <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTARTFTE, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :MONTO, :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    NROI = NROI + 1;
                    SUMA = SUMA + VRRTFTE;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :MONTO, :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA + VRRTFTE;
                    END
                /* AUTORETENCION */
                if (FAUTORET <= fecaux) then
                    BEGIN
                    EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'CUENTA DE AUTORETENCION EN LA FUENTE') returning_values (CTARTFTE);
                    EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTARTFTE, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
                    if (ERRORC <> 0) then
                        ERROR = ERROR + 1;
                    if (TIPOCUEN = 'C') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, (:MONTO*-1), :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                        NROI = NROI + 1;
                        SUMA = SUMA - VRRTFTE;
                        END
                    if (TIPOCUEN = 'N') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, (:MONTO*-1), :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NROI = NROI + 1;
                        SUMA = SUMA - VRRTFTE;
                        END
                    END
                END
            END
        END /* RTFTE */
      END
    /* RETENCION IVA */
    if ((RTIVA = 'C') or (RTIVA = 'K')) then
      BEGIN
      execute procedure redondee(VRRTIVA, DIG) returning_values (VRRTIVA);
      if (VRRTIVA <> 0) then
        BEGIN
        if (RTIVA = 'C') then
            CTARTIVA = TCTARTIVA;
        EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTARTIVA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTIVA, 0, :VRIVA, :PORC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTIVA;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTIVA, 0, :VRIVA, :PORC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTIVA;
            END
        END /* RTIVA */
      END
    /* RETENCION DE ICA */
    if ((RTICA = 'C') or (RTICA = 'K')) then
      BEGIN
      execute procedure redondee(VRRTICA, DIG) returning_values (VRRTICA);
      if (VRRTICA <> 0) then
        BEGIN
        if (RTICA = 'C') then
            CTARTICA = TCTARTICA;
        EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTARTICA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTICA, 0, :VRSUBT, :PRTICA, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTICA;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTICA, 0, :VRSUBT, :PRTICA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTICA;
            END
        END /* RTICA */
      END
    /* CIERRE EL COMPROBANTE CONTRA LA CUENTA DEL TERCERO O LA CONSTANTE */
    if ((SUMA <> 0) and ((CARTERA = 'C') or (CARTERA = 'K') or (CARTERA = 'J'))) then
        BEGIN
        if (icoing = 'SI') then
            /* DESCUENTE EL IMPOCONSUMO QUE HACE PARTE DEL COSTO */
            SUMA = SUMA + IMPTOS;
        if (SUMA < 0) then
            BEGIN
            DEBITO = SUMA * -1;
            CREDITO = 0;
            END
        ELSE
            BEGIN
            DEBITO = 0;
            CREDITO = SUMA;
            END
        if (CARTERA = 'C') then
            CTACARTERA = TCTACLIEN;
        if (CARTERA = 'J') then
            BEGIN
            /* BUSQUE LA CUENTA DE LA CAJA */
            SELECT CAJA_CUENTA FROM CAJAS C, PUNTO_VENTA P
                WHERE P.CAJA_ID = C.CAJA_ID AND PTVT_ID = :PTOVTA
                INTO :CTACARTERA;
            END
        EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTACARTERA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :DEBITO, :CREDITO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
        if (TIPOCUEN = 'N') then
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :DEBITO, :CREDITO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
        NROI = NROI + 1;
        END /* SUMA EN CARTERA */
    /* CALCULE COSTOS EN VENTAS */
    EXECUTE PROCEDURE COSTO_EN_VENTAS(31, :IDDOC);
    if (COSTOS = 'A') then
        BEGIN
        FOR SELECT MAX(CTACOS), SUM(CAST(CANT AS DOUBLE PRECISION) * COSTO), SUM(FADE_CONSUMO)
            FROM COSTO_VENTAS CV, FACTURAS_DETALLE D WHERE CV.cove_item = D.fade_item AND D.fact_id = :iddoc AND
            TIDO_COD = 31 AND COVE_ID = :iddoc
            GROUP BY CTACOS
            INTO :CTACOSTOS, :MONTO, :vrconsumo
            DO
            BEGIN
            if (icoing = 'SI') then
                MONTO = MONTO + VRCONSUMO;
            if (MONTO <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTACOSTOS, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (31, :IDDOC, :CUENTA, 3);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    NROI = NROI + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    END
                END /* MONTO <> 0 */
            END /* FOR */
        END /* COSTOS */
    if (COSTOS = 'K') then
        BEGIN
        SELECT SUM(CAST(CANT AS DOUBLE PRECISION) * COSTO)
            FROM COSTO_VENTAS WHERE TIDO_COD = 31 AND COVE_ID = :iddoc
            INTO :MONTO;
        if (icoing = 'SI') then
            MONTO = MONTO + imptos;
        if (MONTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTACOSTOS, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERROR (31, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTACOSTOS, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTACOSTOS, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                END
            END /* MONTO <> 0 */
        END /* COSTOS = K */
    if (INVEN = 'A') then
        BEGIN
        FOR SELECT MAX(CTAINV), SUM(CAST(CANT AS DOUBLE PRECISION) * COSTO)
            FROM COSTO_VENTAS WHERE TIDO_COD = 31 AND COVE_ID = :iddoc
            GROUP BY CTAINV
            INTO :CTAINVEN, :MONTO
        DO
            BEGIN
            if (MONTO <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTAINVEN, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (31, :IDDOC, :CUENTA, 3);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    NROI = NROI + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    END
                END /* MONTO <> 0 */
            END /* FOR */
        END /* INVEN = A */
    if (INVEN = 'K') then
        BEGIN
        SELECT SUM(CAST(CANT AS DOUBLE PRECISION) * COSTO)
            FROM COSTO_VENTAS WHERE TIDO_COD = 31 AND COVE_ID = :iddoc
            INTO :MONTO;
        if (MONTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTAINVEN, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERROR (31, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAINVEN, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAINVEN, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                END
            END /* MONTO <> 0 */
        END /* INVEN = K */
    /* recorra las cuentas adicionales */
    FOR SELECT INVC_CUENTA, INVC_BASE, INVC_PORC, INVC_VALOR, INVC_DB
        FROM INTERFAZ_VENTAS_CTAS
        WHERE INVE_ID = :IDINTER
        INTO :CTADIC, :BASEADIC, :PORCADIC, :VALORADIC, :DBADIC
        DO
        BEGIN
        if (VALORADIC <> 0) then
            MONTO = VALORADIC;
        ELSE
            BEGIN
            if (:BASEADIC = 'SUBTOTAL') then
                VALORADIC = vrsubt;
            if (:BASEADIC = 'DESCUENTO') then
                VALORADIC = VRDTO;
            if (:BASEADIC = 'IVA') then
                VALORADIC = VRIVA;
            if (:BASEADIC = 'ADICIONAL') then
                VALORADIC = VRADIC;
            if (:BASEADIC = 'EXTRA') then
                VALORADIC = VREXTRA;
            if (:BASEADIC = 'TOTAL') then
                VALORADIC = VRTOTAL;
            MONTO = VALORADIC * PORCADIC / 100;
            END
        if (MONTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTADIC, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                if (DBADIC = 'S') then
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                ELSE
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                if (DBADIC = 'S') then
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                ELSE
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                END
            NROI = NROI + 1;
            END
        END
    if (ERROR > 0) then
        VER = 'S';
    SUSPEND;
    END /* NO ANULADO */
  END /* EXISTE LA INTERFAZ */
ELSE
    BEGIN
    EXECUTE PROCEDURE ERROR (31, :IDDOC, :PREF, 1);
    ERROR = ERROR + 1;
    VER = 'S';
    SUSPEND;
    END
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE CONTADO_MVERDE(
    FECINI DATE,
    FECFIN DATE,
    PREF VARCHAR(4))
RETURNS (
    FECHA DATE,
    PUNTO INTEGER,
    IDC INTEGER,
    ERROR INTEGER,
    VER CHAR(1))
AS
declare variable IDIN INTEGER;
declare variable IDF INTEGER;
declare variable NIT VARCHAR(20);
begin
FECHA = FECINI;
SELECT MAX(INVE_ID) FROM INTERFAZ_VENTAS WHERE TIDO_COD = 31 AND PREF_PRE = :PREF INTO :IDIN;
WHILE (FECHA <= fecfin) DO
    BEGIN
    /* LAS DE CONTADO */
    FOR SELECT PTVT_ID, TERC_NIT FROM punto_venta ORDER BY PTVT_ID INTO :PUNTO, :NIT
        do
        BEGIN
        EXECUTE PROCEDURE contabil_facturas_contado (FECHA, NIT, PREF, PUNTO, IDIN) returning_values (ERROR,  VER, IDC);
        EXECUTE PROCEDURE contabiliza_pendiente (IDC);
        suspend;
        END
    /* LAS DE CREDITO */
    FOR SELECT FACT_ID, PTVT_ID FROM facturas F WHERE fact_fecha = :fecha and pref_pre = :pref and
        NOT exists (select terc_nit from punto_venta p where terc_nit = f.terc_nit) into : IDF, :PUNTO
        DO
        BEGIN
        if (NOT EXISTS (SELECT ENCO_CONSEC FROM comprobante_encabezado WHERE ENCO_TIPOREF = 31 AND ENCO_IDREF = :IDF)) then
            BEGIN
            EXECUTE PROCEDURE contabil_factura(idf,  IDIN) returning_values (ERROR, VER, IDC);
            EXECUTE PROCEDURE contabiliza_pendiente (IDC);
            suspend;
            END
        END
    FECHA = FECHA + 1;
    END
end

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE FACTURAR_CONCEPTOS(
    ID INTEGER,
    NITINI VARCHAR(20),
    NITFIN VARCHAR(20),
    AGRINI VARCHAR(20),
    AGRFIN VARCHAR(20),
    AGRUPA INTEGER,
    FECHA DATE)
RETURNS (
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(6),
    NIT VARCHAR(20),
    NOMBRE VARCHAR(60),
    TOTAL NUMERIC(18,2))
AS
declare variable IDF INTEGER;
declare variable IDC INTEGER;
declare variable VEND INTEGER;
declare variable PTVT INTEGER;
declare variable VENDINI INTEGER;
declare variable VENDFIN INTEGER;
declare variable ZONINI CHAR(2);
declare variable ZONFIN CHAR(2);
declare variable grpini INTEGER;
declare variable grpfin INTEGER;
declare variable DIAS INTEGER;
declare variable OBS VARCHAR(255);
declare variable IVAINC CHAR(1);
declare variable ITEM INTEGER;
declare variable ARTICULO VARCHAR(20);
declare variable DESCR VARCHAR(60);
declare variable CANT NUMERIC(18,2);
declare variable PRUNIT NUMERIC(18,2);
declare variable IVAP NUMERIC(18,2);
declare variable IVAM NUMERIC(18,2);
declare variable BASE NUMERIC(18,2);
declare variable RTFTE NUMERIC(9,2);
declare variable RTIVA NUMERIC(9,2);
declare variable RTICA NUMERIC(9,2);
declare variable RTFTEM NUMERIC(18,2);
declare variable RTIVAM NUMERIC(18,2);
declare variable RTICAM NUMERIC(18,2);
declare variable UNIDAD VARCHAR(8);
declare variable BOD VARCHAR(2);
declare variable ERROR INTEGER;
declare variable VER CHAR(1);
declare variable factmes varchar(2);
declare variable GRPFM VARCHAR(3);
declare variable OK CHAR(1);
begin
if (agrupa = 0) then
    BEGIN
    VENDINI = 0;
    VENDFIN = 999999;
    GRPINI = 0;
    GRPFIN = 999999;
    ZONINI = '';
    ZONFIN = 'zz';
    END
if (agrupa = 1) then
    BEGIN
    VENDINI = 0;
    VENDFIN = 999999;
    ZONINI = '';
    ZONFIN = 'zz';
    GRPINI = AGRINI;
    GRPFIN = AGRFIN;
    END
if (agrupa = 2) then
    BEGIN
    GRPINI = 0;
    GRPFIN = 999999;
    ZONINI = '';
    ZONFIN = 'zz';
    VENDINI = AGRINI;
    VENDFIN = AGRFIN;
    END
if (agrupa = 3) then
    BEGIN
    VENDINI = 0;
    VENDFIN = 999999;
    GRPINI = 0;
    GRPFIN = 999999;
    ZONINI = AGRINI;
    ZONFIN = AGRFIN;
    END
EXECUTE procedure lee_configuracion ('FACTURACION', 'FACTURAS', 'GRUPO DE MERCANCIA PARA CONTROL MENSUAL DE FACTURACION') returning_values (:GRPFM);
EXECUTE procedure lee_configuracion ('FACTURACION', 'FACTURAS', 'CONTROLAR FACTURACION MENSUAL POR CADA CLIENTE') returning_values (:factmes);
SELECT FACC_PREF, FACC_VEND, FACC_DIAS, FACC_PTVT, FACC_OBS FROM factura_concepto WHERE FACC_ID = :ID
    INTO :prefijo, :vend, :dias, :ptvt, :obs;
SELECT BODE_COD FROM punto_venta WHERE PTVT_ID = :PTVT INTO :BOD;
FOR SELECT T.TERC_NIT, TERC_NOM, C.vend_cod, C.clie_rtefte, C.clie_rteiva, C.clie_rteica, C.clie_rtftebase
    FROM TERCEROS T, CLIENTES C
    WHERE T.terc_nit = C.terc_nit AND T.TERC_NIT >= :NITINI AND T.TERC_NIT <= :NITFIN AND
        C.vend_cod >= :vendini AND C.vend_cod <= :vendfin AND ((c.grca_cod is null and :grpini = 0 ) or (C.grca_cod >= :grpini AND C.grca_cod <= :grpfin)) AND
        ((c.zona_cod is null and :zonini = '') or (C.zona_cod >= :zonini AND C.zona_cod <= :zonfin))
    INTO :NIT, :NOMBRE, :VEND, :RTFTE, :RTIVA, :RTICA, :RTFTEM
    DO
    BEGIN
    SELECT PREF_ACTUAL, PREF_IVAINC FROM PREFIJOS WHERE TIDO_COD = 31 AND PREF_PRE = :prefijo
        INTO :NUMERO, :IVAINC;
    select max(INVE_ID) FROM interfaz_ventas WHERE PREF_PRE = :prefijo AND TIDO_COD = 31 INTO :IDC;

    OK = 'S';
    if (FACTMES = 'SI') then
        begin
        if (EXISTS(SELECT FAME_IDFACT FROM FACTURAS_MES WHERE FAME_NIT = :nit AND FAME_ANO = EXTRACT(YEAR FROM :FECHA) AND FAME_MES = EXTRACT(MONTH FROM :FECHA))) then
            OK = 'N';
        end
    if (OK = 'S') then
        BEGIN
        IDF = GEN_ID(id_factura, 1);
        INSERT INTO FACTURAS (FACT_ID, PTVT_ID, VEND_COD, TERC_NIT, AUTO_NUMERO, FACT_NUMERO, FACT_FECHA, FACT_DESPACHO,
            FACT_VENCE, FACT_IVAINC, FACT_COMIPORC, FACT_COMIMONTO, FACT_DTOPOR, FACT_DTOMONTO, FACT_ADICIONAL,
            FACT_IVAMONTO, FACT_RTFTEPOR, FACT_RTFTEMONTO, FACT_RTIVAPOR, FACT_RTIVAMONTO, FACT_RTICAPOR, FACT_RTICAMONTO,
            FACT_EXTRA, FACT_DTOFPOR, FACT_DTOFMONTO, FACT_DTOFFECHA, PREF_PRE, FACT_TRANSP, FACT_NOMCLIENTE, FACT_COTIZACI,
            FACT_PEDIDO, FACT_REMISION, FACT_ANULADO, FACT_TRANSMIT, FACT_TOTAL, BODE_COD, FACT_OBS, VEHI_COD, FACT_CONSOLIDA,
            FACT_RECIBIDO, FACT_USUARIO, FACT_SUCURSAL, NUMOK, COBR_COD, FACT_FACTOR, FACT_DETCLI, FACT_DETCLINOM,
            FACT_DTOIT1, FACT_DTOIT2, FACT_DTOIT3, FACT_TRM)
            VALUES (:IDF, :PTVT, :VEND, :NIT, NULL, :NUMERO, :FECHA, NULL, (:FECHA + :DIAS), :IVAINC,
            0, 0, 0, 0, 0, :IVAM, :RTFTE, :RTFTEM, :RTIVA, :RTIVAM, :RTICA, :RTICAM, 0, 0, 0, :FECHA, :PREFIJO, NULL,
            :NOMBRE, NULL, NULL, NULL, 'N', 'N', :TOTAL, :BOD, :OBS, NULL, NULL, 0, USER, '01', 'N', :VEND, 1, NULL,
            NULL, NULL, NULL, NULL, 1);

        FOR SELECT FACI_ITEM, FC.ARTI_COD, FACI_CANT, FACI_PRUNIT, ARTI_UNIDAD, TAIV_PORC, FACI_DESC
            FROM factura_concepto_items FC, ARTICULO A, TARIFA_IVA I
            WHERE FC.arti_cod = A.arti_cod AND A.taiv_cod = I.taiv_cod AND FC.facc_id = :ID
            INTO :item, :articulo, :CANT, :prunit, :unidad, :ivap, :descr
            DO
            BEGIN
            /* busque el precio por cliente */
            if (EXISTS(SELECT ARTI_COD FROM ARTICULO WHERE ARTI_COD = :articulo AND GRUP_COD = :GRPFM)) then
                SELECT CLIE_VALORMES FROM CLIENTES WHERE TERC_NIT = :NIT INTO :PRUNIT;

            if (IVAINC = 'S') then
                BEGIN
                IVAM = :CANT * :PRUNIT / (100 + :IVAP) * :IVAP;
                BASE = :CANT * :PRUNIT;
                END
            ELSE
                BEGIN
                IVAM = :CANT * :PRUNIT * IVAP / 100;
                BASE = :CANT * :PRUNIT + IVAM;
                END
            INSERT INTO FACTURAS_DETALLE (FACT_ID, FADE_ITEM, BODE_COD, ARTI_COD, FADE_CANT, FADE_UNIDAD, FADE_LOTE,
                FADE_PRUNIT, FADE_DTOPORC, FADE_DTOMONTO, FADE_IVAPORC, FADE_IVAMONTO, FADE_CONSUMO, FADE_FACTOR,
                FADE_DESC, FADE_OBS, FADE_CODBAR, FADE_REMISIONADO, FADE_DEVUELTO, FADE_TOTAL, LIPR_COD, FADE_REFERENCIA,
                FADE_ANULADO, FADE_TRANSMIT, FADE_FACTORLISTA, FADE_DTO1, FADE_DTO2, FADE_DTO3, FADE_DTOM1, FADE_DTOM2,
                FADE_DTOM3, FADE_CAJAS)
                VALUES (:IDF, :ITEM, :BOD, :articulo, :CANT, :UNIDAD, NULL, :prunit, 0, 0, :IVAP, :ivam, 0, 1,
                :descr, NULL, :articulo, 0, 0, :BASE, 1, NULL, 'N', 'N', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
            END

        /* CALCULE EL TOTAL DE LA FACTURA XA EFECTOS DE IMPUESTOS */
        SELECT SUM(FADE_TOTAL), SUM(FADE_IVAMONTO) FROM facturas_detalle WHERE FACT_ID = :idf
            INTO :TOTAL, :IVAM;
        if (IVAINC = 'S') then
            BASE = TOTAL - IVAM;
        ELSE
            BASE = TOTAL;
        if (BASE >= RTFTEM) then
            BEGIN
            RTFTEM = BASE * RTFTE / 100;
            RTICAM = BASE * RTICA / 1000;
            RTIVAM = IVAM * RTIVA / 100;
            END
        ELSE
            BEGIN
            RTFTEM = 0;
            RTICAM = 0;
            RTIVAM = 0;
            END
        UPDATE FACTURAS SET FACT_TOTAL = :total,  FACT_IVAMONTO = :IVAM, FACT_RTFTEMONTO = :rtftem, 
            FACT_RTIVAMONTO = :rtivam, FACT_RTICAMONTO = :rticam WHERE FACT_ID = :IDF;

        /* contabilice */
        execute procedure CONTABIL_FACTURA(:idf,  :IDC) returning_values (:ERROR, :VER, :IDC);
        EXECUTE procedure contabiliza_pendiente (:IDC);
        suspend;
        END
    END
end

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE FACTURAS_SIN_CONTABILIDAD(
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    ID INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    ESTADO VARCHAR(20),
    IDI INTEGER,
    IDC INTEGER)
AS
DECLARE VARIABLE VER CHAR(2);
declare variable FECICNT VARCHAR(10);
declare variable FECFCNT VARCHAR(10);
declare variable ERROR INTEGER;
declare variable idref INTEGER;
BEGIN
EXECUTE PROCEDURE fecha_a_conta(FECINI) returning_values (FECICNT);
EXECUTE PROCEDURE fecha_a_conta(FECFIN) returning_values (FECFCNT);
FOR SELECT FACT_ID, PREF_PRE, FACT_NUMERO FROM FACTURAS WHERE FACT_ANULADO = 'N' AND
    FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN INTO :ID, :PREF, :NUMERO
DO
  BEGIN
  idref = null;
  SELECT ENCO_IDREF FROM COMPROBANTE_ENCABEZADO WHERE ENCO_TIPOREF = 31 AND ENCO_FECHA >= :FECICNT AND ENCO_FECHA <= :FECFCNT and ENCO_IDREF = :ID into :idref;
  if (idref IS NULL) then
  begin
   ESTADO = 'PROCESANDO';
   ERROR = NULL;
   SUSPEND;
   SELECT MAX(INVE_ID) FROM INTERFAZ_VENTAS WHERE PREF_PRE = :PREF AND TIDO_COD = 31 INTO :IDI;
   EXECUTE PROCEDURE CONTABIL_FACTURA (:ID, :IDI) RETURNING_VALUES (:ERROR, VER, :IDC);
   if ((ERROR = 0) or (error IS NULL)) then
    BEGIN
    EXECUTE PROCEDURE CONTABILIZA_PENDIENTE (:IDC);
    ESTADO = 'OK';
    END
   ELSE
    ESTADO = 'ERROR';
   suspend;
  end
  END
END

^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure CONTABIL_DEVOLCLI (
    IDDOC integer,
    IDINTER integer)
returns (
    ERROR integer,
    VER char(1),
    IDC integer)
AS
declare variable PREF VARCHAR(4);
declare variable NUM VARCHAR(6);
declare variable NUMERO VARCHAR(10);
declare variable FECAUX DATE;
declare variable FECHA CHAR(8);
declare variable CONC CHAR(120);
declare variable NUMFAC VARCHAR(10);
declare variable VRDTO NUMERIC(18, 2);
declare variable VRADIC NUMERIC(18, 2);
declare variable VRSUBT NUMERIC(18, 2);
declare variable VRIVA NUMERIC(18, 2);
declare variable PRTFTE NUMERIC(9, 2);
declare variable VRRTFTE NUMERIC(18, 2);
declare variable VRRTIVA NUMERIC(18, 2);
declare variable PRTICA NUMERIC(9, 2);
declare variable VRRTICA NUMERIC(18, 2);
declare variable VRTOTAL NUMERIC(18, 2);
declare variable VREXTRA NUMERIC(18, 2);
declare variable TIPOCOMP VARCHAR(3);
declare variable PREFCONT VARCHAR(4);
declare variable VENTAS CHAR(1);
declare variable CTAVENTAS VARCHAR(20);
declare variable IVA CHAR(1);
declare variable CTAIVA VARCHAR(20);
declare variable CONSUMO CHAR(1);
declare variable CTACONSUMO VARCHAR(20);
declare variable CARTERA CHAR(1);
declare variable CTACARTERA VARCHAR(20);
declare variable RTFTE CHAR(1);
declare variable CTARTFTE VARCHAR(20);
declare variable RTIVA CHAR(1);
declare variable CTARTIVA VARCHAR(20);
declare variable RTICA CHAR(1);
declare variable CTARTICA VARCHAR(20);
declare variable INVEN CHAR(1);
declare variable CTAINVEN VARCHAR(20);
declare variable COSTOS CHAR(1);
declare variable CTACOSTOS VARCHAR(20);
declare variable CTADTO VARCHAR(20);
declare variable CTAADIC VARCHAR(20);
declare variable CTAEXTRA VARCHAR(20);
declare variable EXISTE CHAR(1);
declare variable CUENTA VARCHAR(20);
declare variable MONTO NUMERIC(18,2);
declare variable TIPOCUEN CHAR(1);
declare variable NIT VARCHAR(20);
declare variable PROY VARCHAR(4);
declare variable CENTRO VARCHAR(4);
declare variable PROYI VARCHAR(4);
declare variable CENTI VARCHAR(4);
declare variable PORC NUMERIC(5,2);
declare variable DEBITO NUMERIC(18,2);
declare variable CREDITO NUMERIC(18,2);
declare variable NROI INTEGER;
declare variable ART VARCHAR(15);
declare variable IMPINC CHAR(1);
declare variable IMPTOS NUMERIC(18, 2);
declare variable SUMA NUMERIC(18,2);
declare variable PORCIVA NUMERIC(9,2);
declare variable TCTACLIEN VARCHAR(20);
declare variable TCTAVENTA VARCHAR(20);
declare variable TCTARTFTE VARCHAR(20);
declare variable TCTARTIVA VARCHAR(20);
declare variable TCTARTICA VARCHAR(20);
declare variable CTADIC VARCHAR(20);
declare variable BASEADIC VARCHAR(20);
declare variable PORCADIC NUMERIC(5,2);
declare variable VALORADIC NUMERIC(18,2);
declare variable DBADIC CHAR(1);
declare variable PTOVTA INTEGER;
declare variable ANULADO CHAR(1);
declare variable CENT CHAR(1);
DECLARE VARIABLE MERCANCIA NUMERIC(18,2);
declare variable FACTOR DOUBLE PRECISION;
declare variable DIG INTEGER;
DECLARE VARIABLE FOMENTO VARCHAR(2);
DECLARE VARIABLE VRCONSUMO NUMERIC(18,2);
declare variable AUTORET VARCHAR(10);
declare variable FAUTORET DATE;
declare variable IDREM INTEGER;
declare variable IDPED INTEGER;
declare variable DTOXIT CHAR(2);
declare variable ERRORC INTEGER;
declare variable DEC2799 char(2);
declare variable ctadtoiva varchar(20);
BEGIN
EXECUTE PROCEDURE lee_configuracion ('FACTURACION', 'FACTURAS', 'DESCONTAR IVA DE PRODUCTOS DECRETO 2799') returning_values (:DEC2799);
EXECUTE PROCEDURE LEE_CONFIGURACION('COMPRAS', 'FACTURAS', 'USAR IMPOCONSUMO COMO PORCENTAJE DE FOMENTO') returning_values (FOMENTO);
EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'FECHA AUTORETENEDOR NO DESCONTAR RETENCIONES DEL SALDO PERO SI CONTABILIZARLAS') returning_values (AUTORET);
if (AUTORET <> '') then
    FAUTORET = CAST(AUTORET AS DATE);
else
    FAUTORET = '9999/12/31';
  /* BUSQUE LA INTERFACE */
  EXISTE = 'N';
  SELECT 'S', TICO_COD, PRCO_PRE, INVE_VENTAS, INVE_IVA, INVE_CONSUMO, INVE_CARTERA, INVE_RTFTE, INVE_RTIVA, INVE_RTICA, INVE_COSTO, INVE_INVEN, INVE_CTAVENTAS, INVE_CTAIVA, INVE_CTACONSUMO, INVE_CTADTO, INVE_CTAADIC, INVE_CTAEXTRA, INVE_CTACARTERA, INVE_CTARTFTE, INVE_CTARTIVA, INVE_CTARTICA, INVE_CTAINVEN, INVE_CTACOSTOS, INVE_CONFIRMAR, INVE_CENTRO
    FROM INTERFAZ_VENTAS
    WHERE INVE_ID = :IDINTER
    INTO :EXISTE, :TIPOCOMP, :PREFCONT, :VENTAS, :IVA, :CONSUMO, :CARTERA, :RTFTE, :RTIVA, :RTICA, :COSTOS, :INVEN, :CTAVENTAS, :CTAIVA, :CTACONSUMO, :CTADTO, :CTAADIC, :CTAEXTRA, :CTACARTERA, :CTARTFTE, :CTARTIVA, :CTARTICA, :CTAINVEN, :CTACOSTOS, :VER, :CENT;
  if (EXISTE = 'S') then
   BEGIN
    /* BORRE CUALQUEIR CONTABILIZACION PREVIA */
    DELETE FROM CONTABILIZACION WHERE CNTB_TIPOREF = 33 AND CNTB_IDREF = :IDDOC;
    /* TRAIGA EL ENCABEZADO DE LA DEVOLUCION */
   SELECT PREF_PRE, DEVT_NUMERO, DEVT_FECHA, F.TERC_NIT, DEVT_IVAINC, PTVT_ID, DEVT_FACTURA, DEVT_DTOMONTO, DEVT_ADICIONAL, DEVT_IVAMONTO, DEVT_EXTRA, DEVT_TOTAL, DEVT_RTFTEPORC, DEVT_RTFTEMONTO, DEVT_RTIVAPORC, DEVT_RTIVAMONTO, DEVT_RTICAPORC, DEVT_RTICAMONTO, TERC_CTARTFTE, TERC_CTARTIVA, TERC_CTARTICA, TERC_CTAVENTA, TERC_CTACLIENTE, DEVT_ANULADO, DEVT_REMID, DEVT_PEDID
        FROM DEVOLUCIONES_VENTAS F, TERCEROS T
        WHERE DEVT_ID = :IDDOC AND F.TERC_NIT = T.TERC_NIT
        INTO :PREF, :NUM, :FECAUX, :NIT, :IMPINC, :PTOVTA, :NUMFAC, :VRDTO, :VRADIC, :VRIVA, :VREXTRA, :VRTOTAL, :PRTFTE, :VRRTFTE, :PORC, :VRRTIVA, :PRTICA, :VRRTICA, :TCTARTFTE, TCTARTIVA, TCTARTICA, TCTAVENTA, TCTACLIEN, ANULADO, :IDREM, :IDPED;
   if (idrem is null) Then
    IDREM = 0;
   if (idped is null) Then
    IDPED = 0;
   if ((ANULADO = 'N') AND (IDREM = 0) AND (IDPED = 0)) then
    BEGIN
    NUMERO = PREF || NUM;
    SELECT SUM(DVDE_CONSUMO) FROM devoluciones_ventas_detalle WHERE DEVT_ID = :iddoc AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL)) INTO :MERCANCIA;
    VRSUBT = VRTOTAL - VREXTRA - VRIVA - MERCANCIA; /* BASE DE RETEFTE Y RETEICA */
    EXECUTE PROCEDURE lee_configuracion ('FACTURACION', 'DEVOLUCIONES', 'DESCUENTO PIE DEVOLUCION IGUAL A SUMA DE DESCUENTOS POR ITEM') returning_values (:DTOXIT);
    if (DTOXIT = 'SI') then
        VRDTO = 0;
    MERCANCIA = VRSUBT - VRADIC + VRDTO;
    IF (CENT = 'B') THEN
        SELECT B.BODE_CENTRO, B.BODE_PROY FROM BODEGA B, DEVOLUCIONES_VENTAS F
            WHERE B.BODE_COD = F.BODE_COD AND F.DEVT_ID = :IDDOC INTO :CENTRO, :PROY;
    IF (CENT = 'V') THEN
        SELECT V.CENT_COD, V.PROY_COD FROM VENDEDORES V, DEVOLUCIONES_VENTAS F
            WHERE V.VEND_COD = F.VEND_COD AND F.DEVT_ID = :IDDOC INTO :CENTRO, :PROY;
    IF (CENT = 'P') THEN
        SELECT P.PREF_CENTRO,P.PREF_PROY  FROM PREFIJOS P, DEVOLUCIONES_VENTAS F
            WHERE P.PREF_PRE = F.PREF_PRE AND F.DEVT_ID = :IDDOC AND P.TIDO_COD = 33 INTO :CENTRO, :PROY;
    EXECUTE PROCEDURE FECHA_A_CONTA(:FECAUX) returning_values (:FECHA);
    /* REGISTRE EL ENCABEZADO CONTABLE */
    IDC = GEN_ID(ID_CONTABILIZA, 1);
    CONC = 'DEVOLUCION VENTAS No. ' || NUMERO || ' EN FACTURA ' || NUMFAC;
    CONC = SUBSTR(CONC, 1, 60);
    INSERT INTO CONTABILIZACION (CNTB_ID, CNTB_TIPOCOMP, CNTB_PREFCNT, CNTB_NUMERO, CNTB_FECHA, CNTB_CONCEPTO, CNTB_REF, CNTB_TIPOREF, CNTB_IDREF, CNTB_PREFREF, CNTB_NUMREF, CNTB_PROCESADO)
        VALUES (:IDC, :TIPOCOMP, :PREFCONT, :NUM, :FECHA, :CONC, '', 33, :IDDOC, :PREF, :NUM, 'N');
    NROI = 0;
    SUMA = 0;
    ERROR = 0;
    /* SI NO HAY CUENTA DE DESCUENTO NI ADICIONAL CALCULE UN FACTOR PARA LAS VENTAS Y EL IVA */
    if (MERCANCIA <> 0) then
        FACTOR = CAST(VRSUBT AS DOUBLE PRECISION) / CAST(MERCANCIA AS DOUBLE PRECISION);
    ELSE
        FACTOR = 1;
    /* TRAIGA EL NUMERO DE DIGITOS PARA EL REDONDEO */
    SELECT CAST(CONF_VALOR AS INTEGER) FROM CONFIGURACION WHERE CONF_MODULO = 'FACTURACION' AND
        CONF_CATEGORIA = 'GENERAL' AND CONF_PROPIEDAD = 'REDONDEO AL MULTIPLO DE DIEZ EN TOTALES' INTO :DIG;
    /* CUENTAS DE VENTAS */
    if (VENTAS = 'A') then
        BEGIN
        FOR SELECT MAX(COAR_CTADEV), SUM(DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO), SUM(DVDE_IVAMONTO), SUM(DVDE_CONSUMO), MAX(B.bode_proy), MAX(B.bode_centro)
            FROM ARTICULO A, CONTABIL_ARTICULO C, DEVOLUCIONES_VENTAS_DETALLE F, BODEGA B
            WHERE F.DEVT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND B.bode_cod = F.bode_cod AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
            GROUP BY COAR_CTADEV
            INTO :CTAVENTAS, :MONTO, :IMPTOS, :VRCONSUMO, :proyi, :centi
            DO
            BEGIN
            if (FOMENTO = 'SI') then
                MONTO = MONTO + VRCONSUMO;
            if ((CTADTO IS NULL) OR (CTADTO = '')) then
                MONTO = MONTO * FACTOR;
            execute procedure redondee(MONTO, DIG) returning_values (MONTO);
            if (MONTO <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTAVENTAS, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT F.ARTI_COD, (DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO), (DVDE_IVAMONTO+DVDE_CONSUMO)
                        FROM ARTICULO A, CONTABIL_ARTICULO C, DEVOLUCIONES_VENTAS_DETALLE F
                        WHERE F.DEVT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTAINV = :CUENTA AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
                        INTO :ART, :MONTO, :IMPTOS
                    DO
                        BEGIN
                        if (IMPINC = 'S') then
                            MONTO = MONTO - IMPTOS;
                        if ((CTADTO IS NULL) OR (CTADTO = '')) then
                            MONTO = MONTO * FACTOR;
                        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        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, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                    NROI = NROI + 1;
                    SUMA = SUMA + MONTO;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    IF (CENT = 'B') THEN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROYI, :CENTI, NULL, NULL, NULL, NULL, 0, 0);
                    ELSE
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA + MONTO;
                    END
                END /* MONTO <> 0 */
            END /* FOR */
        END /* VENTAS X ARTICULO */
     IF ((VENTAS = 'C') OR (VENTAS = 'K')) THEN
        BEGIN
        IF (VENTAS = 'C') THEN
            CTAVENTAS = TCTAVENTA;
        SELECT SUM(DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO), SUM(DVDE_IVAMONTO), SUM(DVDE_CONSUMO)
            FROM DEVOLUCIONES_VENTAS_DETALLE F
            WHERE F.DEVT_ID = :IDDOC  AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
            INTO :MONTO, :IMPTOS, :VRCONSUMO;
        if (FOMENTO = 'SI') then
            MONTO = MONTO + VRCONSUMO;
        if ((CTADTO IS NULL) OR (CTADTO = '')) then
            MONTO = MONTO * FACTOR;
        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
        if (MONTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTAVENTAS, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT F.ARTI_COD, (DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO), (DVDE_IVAMONTO+DVDE_CONSUMO)
                    FROM ARTICULO A, DEVOLUCIONES_VENTAS_DETALLE F
                    WHERE F.DEVT_ID = :IDDOC AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
                    INTO :ART, :MONTO, :IMPTOS
                    DO
                    BEGIN
                    if (IMPINC = 'S') then
                        MONTO = MONTO - IMPTOS;
                    if ((CTADTO IS NULL) OR (CTADTO = '')) then
                        MONTO = MONTO * FACTOR;
                    execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                    NROI = NROI + 1;
                    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, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                NROI = NROI + 1;
                SUMA = SUMA + MONTO;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA + MONTO;
                END
            END /* MONTO <> 0 */
        END /* VENTAS DE CLIENTE O CONSTANTE */
    /* EL IVA EN VENTAS */
    if (IVA = 'A') then
        BEGIN
        FOR SELECT MAX(COAR_CTAIVAV), SUM(DVDE_IVAMONTO), SUM(DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO), SUM(DVDE_CONSUMO)
            FROM ARTICULO A, CONTABIL_ARTICULO C, DEVOLUCIONES_VENTAS_DETALLE F
            WHERE F.DEVT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
            GROUP BY COAR_CTAIVAV
            INTO :CTAIVA, :IMPTOS, :MONTO, :VALORADIC
        DO
            BEGIN
            if (FOMENTO = 'SI') then
                MONTO = MONTO + VALORADIC;
            MONTO = MONTO * -1;
            MONTO = MONTO * FACTOR;
            IMPTOS = IMPTOS * FACTOR;
            execute procedure redondee(MONTO, DIG) returning_values (MONTO);
            execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
            if (IMPTOS <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTAIVA, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT F.ARTI_COD, DVDE_IVAMONTO, (DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO), TAIV_PORC, DVDE_CONSUMO
                        FROM ARTICULO A, CONTABIL_ARTICULO C, DEVOLUCIONES_VENTAS_DETALLE F, TARIFA_IVA T
                        WHERE F.DEVT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND A.TAIV_COD = T.TAIV_COD AND COAR_CTAIVAV = :CUENTA AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
                        INTO :ART, :IMPTOS, :MONTO, :PORCIVA, :VALORADIC
                    DO
                        BEGIN
                        if (IMPINC = 'S') then
                            MONTO = MONTO - IMPTOS - VALORADIC;
                        MONTO = MONTO * -1;
                        MONTO = MONTO * FACTOR;
                        IMPTOS = IMPTOS * FACTOR;
                        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                        execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                        if (IMPTOS <> 0) then
                            BEGIN
                            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :IMPTOS, 0, :MONTO, :PORCIVA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                            NROI = NROI + 1;
                            SUMA = SUMA + IMPTOS;
                            END
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                    NROI = NROI + 1;
                    SUMA = SUMA + IMPTOS;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA + IMPTOS;
                    END
                END   /* IMPTOS <> 0 */
            END /* FOR */
        if (DEC2799 = 'SI') then
            BEGIN
            FOR SELECT MAX(COAR_CTAIVADEC), SUM(FADE_IVAMONTO), SUM(FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), sum(FADE_CONSUMO)
                FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_DETALLE F
                WHERE F.FACT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
                    AND A.arti_dec2799 = 'S'
                GROUP BY COAR_CTAIVADEC
                INTO :CTADTOIVA, :IMPTOS, :MONTO, :VALORADIC
                DO
                BEGIN
                if (FOMENTO = 'SI') then
                    MONTO = MONTO + VALORADIC;
                MONTO = MONTO * -1;
                MONTO = MONTO * FACTOR;
                IMPTOS = IMPTOS * FACTOR;
                execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                if (IMPTOS <> 0) then
                    BEGIN
                    EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTADTOIVA, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                    if (ERRORC <> 0) then
                        ERROR = ERROR + 1;
                    if (TIPOCUEN = 'N') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :IMPTOS, 0, :MONTO, ABS(:IMPTOS*100/:MONTO), :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NROI = NROI + 1;
                        SUMA = SUMA + IMPTOS;
                        END
                    END   /* IMPTOS <> 0 */
                END
            END
        END /* IVA X ARTICULO */
    if (IVA = 'K') then /* IVA EN CTA CONSTANTE */
        BEGIN
        SELECT SUM(DVDE_IVAMONTO), SUM(DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO), SUM(DVDE_CONSUMO)
            FROM DEVOLUCIONES_VENTAS_DETALLE F
            WHERE F.DEVT_ID = :IDDOC  AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
            INTO :IMPTOS, :MONTO, :VALORADIC;
        if (FOMENTO = 'SI') then
            MONTO = MONTO + VALORADIC;
        MONTO = MONTO * -1;
        MONTO = MONTO * FACTOR;
        IMPTOS = IMPTOS * FACTOR;
        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
        execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
        if (IMPTOS <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTAIVA, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT F.ARTI_COD, (DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO), DVDE_IVAMONTO, TAIV_PORC, DVDE_CONSUMO
                    FROM ARTICULO A, DEVOLUCIONES_VENTAS_DETALLE F, TARIFA_IVA T
                    WHERE F.DEVT_ID = :IDDOC AND A.TAIV_COD = T.TAIV_COD AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
                    INTO :ART, :MONTO, :IMPTOS, :PORCIVA, :VALORADIC
                    DO
                    BEGIN
                    if (IMPINC = 'S') then
                        MONTO = MONTO - IMPTOS - VALORADIC;
                    MONTO = MONTO * -1;
                    MONTO = MONTO * FACTOR;
                    IMPTOS = IMPTOS * FACTOR;
                    execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                    execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                    if (IMPTOS <> 0) then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', :IMPTOS, 0, :MONTO, :PORCIVA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        SUMA = SUMA + IMPTOS;
                        END
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                NROI = NROI + 1;
                SUMA = SUMA + IMPTOS;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA + IMPTOS;
                END
            END /* IMPTOS <> 0 */
        if (DEC2799 = 'SI') then
            BEGIN
            SELECT SUM(FADE_IVAMONTO), SUM(FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), SUM(FADE_CONSUMO)
                FROM FACTURAS_DETALLE F, ARTICULO A
                WHERE F.FACT_ID = :IDDOC and FADE_IVAMONTO <> 0 AND F.arti_cod = A.arti_cod AND
                ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL)) AND A.arti_dec2799 = 'S'
                INTO :IMPTOS, :MONTO, :valoradic;
            if (FOMENTO = 'SI') then
                MONTO = MONTO + VALORADIC;
            MONTO = MONTO * -1;
            MONTO = MONTO * FACTOR;
            IMPTOS = IMPTOS * FACTOR;
            execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
            execute procedure redondee(MONTO, DIG) returning_values (MONTO);
            if (IMPTOS <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTADTOIVA, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :IMPTOS, 0, :MONTO, ABS(:IMPTOS*100/:MONTO), :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA + IMPTOS;
                    END
                END   /* IMPTOS <> 0 */
            END
        END /* IVA EN CTA CONSTANTE */
    /* EL IMPOCONSUMO */
    if ((CONSUMO = 'A') AND (FOMENTO <> 'SI')) then
        BEGIN
        FOR SELECT MAX(COAR_CTACONS), SUM(DVDE_CONSUMO)
            FROM ARTICULO A, CONTABIL_ARTICULO C, DEVOLUCIONES_VENTAS_DETALLE F
            WHERE F.DEVT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
            GROUP BY COAR_CTACONS
            INTO :CTACONSUMO, :IMPTOS
        DO
            BEGIN
            if (IMPTOS <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTACONSUMO, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, REGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT F.ARTI_COD, DVDE_CONSUMO
                        FROM ARTICULO A, CONTABIL_ARTICULO C, DEVOLUCIONES_VENTAS_DETALLE F
                        WHERE F.DEVT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTACONS = :CUENTA AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
                        INTO :ART, :IMPTOS
                    DO
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 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, :NROI, :CUENTA, :CONC, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                    NROI = NROI + 1;
                    SUMA = SUMA + IMPTOS;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA + IMPTOS;
                    END
                END /* IMPTOS <> 0 */
            END /* FOR */
        END /* CONSUMO X ARTICULO */
    if ((CONSUMO = 'K') AND (FOMENTO <> 'SI')) then
        BEGIN
        SELECT SUM(DVDE_CONSUMO)
            FROM DEVOLUCIONES_VENTAS_DETALLE F
            WHERE F.DEVT_ID = :IDDOC AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
            INTO :IMPTOS;
        if (IMPTOS <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTACONSUMO, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT F.ARTI_COD, DVDE_CONSUMO
                    FROM ARTICULO A, DEVOLUCIONES_VENTAS_DETALLE F
                    WHERE F.DEVT_ID = :IDDOC  AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
                    INTO :ART, :IMPTOS
                    DO
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTACONSUMO, :CONC, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                    NROI = NROI + 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, :NROI, :CTACONSUMO, :CONC, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA + IMPTOS;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTACONSUMO, :CONC, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA + IMPTOS;
                END
            END /* IMPTOS <> 0 */
        END /* CONSUMO EN CTA CONSTANTE */
    /* DESCUENTO */
    if ((CTADTO IS NOT NULL) AND
        (CTADTO <> '') AND
        (VRDTO <> 0)) THEN
        BEGIN
        EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTADTO, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRDTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
            NROI = NROI + 1;
            SUMA = SUMA - VRDTO;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRDTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 33);
            NROI = NROI + 1;
            SUMA = SUMA - VRDTO;
            END
        END /* DESCUENTO */
    /* VALOR ADIC */
    if ((CTAADIC IS NOT NULL) AND
        (CTAADIC <> '') AND
        (VRADIC <> 0)) THEN
        BEGIN
        EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTAADIC, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRADIC, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
            NROI = NROI + 1;
            SUMA = SUMA + VRADIC;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRADIC, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 33);
            NROI = NROI + 1;
            SUMA = SUMA + VRADIC;
            END
        END /* VR. ADIC */
    /* VALOR EXTRA */
    if ((CTAEXTRA IS NOT NULL) AND
        (CTAEXTRA <> '') AND
        (VREXTRA <> 0)) THEN
        BEGIN
        EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTAEXTRA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VREXTRA, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
            NROI = NROI + 1;
            SUMA = SUMA + VREXTRA;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VREXTRA, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 33);
            NROI = NROI + 1;
            SUMA = SUMA + VREXTRA;
            END
        END /* VR. EXTRA */
    /* RETENCION FUENTE */
    if ((RTFTE = 'C') or (RTFTE = 'K')) then
      if (VRRTFTE <> 0) then
        BEGIN
        if (RTFTE = 'C') then
            CTARTFTE = TCTARTFTE;
        EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTARTFTE, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, (:VRSUBT*-1), :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
            NROI = NROI + 1;
            SUMA = SUMA - VRRTFTE;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, (:VRSUBT*-1), :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA - VRRTFTE;
            END
        /* AUTORETENCION */
        if (FAUTORET <= fecaux) then
            BEGIN
            EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'CUENTA DE AUTORETENCION EN LA FUENTE') returning_values (CTARTFTE);
            EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTARTFTE, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :VRSUBT, :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                NROI = NROI + 1;
                SUMA = SUMA + VRRTFTE;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :VRSUBT, :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA + VRRTFTE;
                END
            END
        END /* RTFTE */
    if (RTFTE = 'A') then
      BEGIN
      FOR SELECT MAX(COAR_CTARTFTEV), MAX(COAR_RTFTE), MIN(COAR_RTBASE), SUM(DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO), SUM((DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO)*COAR_RTFTE)
        FROM CONTABIL_ARTICULO C, devoluciones_ventas_detalle F
        WHERE F.devt_id = :IDDOC AND F.ARTI_COD = C.ARTI_COD AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
        GROUP BY COAR_CTARTFTEV
        INTO :CTARTFTE, :PRTFTE, :baseadic, :MONTO, :VRRTFTE
        DO
        BEGIN
        MONTO = MONTO * FACTOR;
        if (MONTO >= BASEADIC) then
            BEGIN
            VRRTFTE = VRRTFTE * FACTOR / 100;
            execute procedure redondee(VRRTFTE, DIG) returning_values (VRRTFTE);
            execute procedure redondee(MONTO, DIG) returning_values (MONTO);
            if (VRRTFTE <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTARTFTE, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, (:MONTO*-1), :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                    NROI = NROI + 1;
                    SUMA = SUMA - VRRTFTE;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, (:MONTO*-1), :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA - VRRTFTE;
                    END
                /* AUTORETENCION */
                if (FAUTORET <= fecaux) then
                    BEGIN
                    EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'CUENTA DE AUTORETENCION EN LA FUENTE') returning_values (CTARTFTE);
                    EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTARTFTE, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
                    if (ERRORC <> 0) then
                        ERROR = ERROR + 1;
                    if (TIPOCUEN = 'C') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :MONTO, :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                        NROI = NROI + 1;
                        SUMA = SUMA + VRRTFTE;
                        END
                    if (TIPOCUEN = 'N') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :MONTO, :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NROI = NROI + 1;
                        SUMA = SUMA + VRRTFTE;
                        END
                    END
                END
            END
        END /* RTFTE */
      END
    /* RETENCION IVA */
    if ((RTIVA = 'C') or (RTIVA = 'K')) then
      if (VRRTIVA <> 0) then
        BEGIN
        if (RTIVA = 'C') then
            CTARTIVA = TCTARTIVA;
        EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTARTIVA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTIVA, (:VRIVA*-1), :PORC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
            NROI = NROI + 1;
            SUMA = SUMA - VRRTIVA;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTIVA, (:VRIVA*-1), :PORC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA - VRRTIVA;
            END
        END /* RTIVA */
    /* RETENCION DE ICA */
    if ((RTICA = 'C') or (RTICA = 'K')) then
      if (VRRTICA <> 0) then
        BEGIN
        if (RTICA = 'C') then
            CTARTICA = TCTARTICA;
        EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTARTICA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTICA, (:VRSUBT*-1), :PRTICA, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
            NROI = NROI + 1;
            SUMA = SUMA - VRRTICA;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTICA, (:VRSUBT*-1), :PRTICA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA - VRRTICA;
            END
        END /* RTICA */
    /* CIERRE EL COMPROBANTE CONTRA LA CUENTA DEL TERCERO O LA CONSTANTE */
    if ((SUMA <> 0) and ((CARTERA = 'C') or (CARTERA = 'K') or (CARTERA = 'J'))) then
        BEGIN
        if (SUMA < 0) then
            BEGIN
            DEBITO = SUMA * -1;
            CREDITO = 0;
            END
        ELSE
            BEGIN
            DEBITO = 0;
            CREDITO = SUMA;
            END
        if (CARTERA = 'C') then
            CTACARTERA = TCTACLIEN;
        if (CARTERA = 'J') then
            BEGIN
            /* BUSQUE LA CUENTA DE LA CAJA */
            SELECT CAJA_CUENTA FROM CAJAS C, PUNTO_VENTA P
                WHERE P.CAJA_ID = C.CAJA_ID AND PTVT_ID = :PTOVTA
                INTO :CTACARTERA;
            END
        EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTACARTERA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :DEBITO, :CREDITO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
        if (TIPOCUEN = 'N') then
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :DEBITO, :CREDITO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
        NROI = NROI + 1;
        END /* SUMA EN CARTERA */
    /* CALCULE COSTOS EN VENTAS */
    EXECUTE PROCEDURE COSTO_EN_VENTAS(33, :IDDOC);
    if (COSTOS = 'A') then
        BEGIN
        FOR SELECT MAX(CTACOS), SUM(cast(CANT as double precision) * COSTO)
            FROM COSTO_VENTAS WHERE TIDO_COD = 33 AND COVE_ID = :IDDOC
            GROUP BY CTACOS
            INTO :CTACOSTOS, :MONTO
        DO
            BEGIN
            if (MONTO <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTACOSTOS, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT ARTI_COD, cast(CANT as double precision) * COSTO
                        FROM COSTO_VENTAS WHERE TIDO_COD = 33 AND COVE_ID = :IDDOC AND CTACOS = :CUENTA
                        INTO :ART, :MONTO
                    DO
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                    NROI = NROI + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    END
                END /* MONTO <> 0 */
            END /* FOR */
        END /* COSTOS */
    if (COSTOS = 'K') then
        BEGIN
        SELECT SUM(cast(CANT as double precision) * COSTO)
            FROM COSTO_VENTAS WHERE TIDO_COD = 33 AND COVE_ID = :IDDOC
            INTO :MONTO;
        if (MONTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTACOSTOS, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, REGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT ARTI_COD, cast(CANT as double precision) * COSTO
                    FROM COSTO_VENTAS WHERE TIDO_COD = 33 AND COVE_ID = :IDDOC
                    INTO :ART, :MONTO
                DO
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTACOSTOS, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                    NROI = NROI + 1;
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTACOSTOS, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                NROI = NROI + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTACOSTOS, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                END
            END /* MONTO <> 0 */
        END /* COSTOS = K */
    if (INVEN = 'A') then
        BEGIN
        FOR SELECT MAX(CTAINV), SUM(cast(CANT as double precision) * COSTO)
            FROM COSTO_VENTAS WHERE TIDO_COD = 33 AND COVE_ID = :IDDOC
            GROUP BY CTAINV
            INTO :CTAINVEN, :MONTO
        DO
            BEGIN
            if (MONTO <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTAINVEN, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, REGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT ARTI_COD, cast(CANT as double precision) * COSTO
                        FROM COSTO_VENTAS WHERE TIDO_COD = 33 AND COVE_ID = :IDDOC AND CTAINV = :CUENTA
                        INTO :ART, :MONTO
                    DO
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                    NROI = NROI + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    END
                END /* MONTO <> 0 */
            END /* FOR */
        END /* INVEN = A */
    if (INVEN = 'K') then
        BEGIN
        SELECT SUM(cast(CANT as double precision) * COSTO)
            FROM COSTO_VENTAS WHERE TIDO_COD = 33 AND COVE_ID = :IDDOC
            INTO :MONTO;
        if (MONTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTAINVEN, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT ARTI_COD, cast(CANT as double precision) * COSTO
                    FROM COSTO_VENTAS WHERE TIDO_COD = 33 AND COVE_ID = :IDDOC
                    INTO :ART, :MONTO
                DO
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTAINVEN, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                    NROI = NROI + 1;
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAINVEN, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                NROI = NROI + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAINVEN, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                END
            END /* MONTO <> 0 */
        END /* INVEN = K */
    /* recorra las cuentas adicionales */
    FOR SELECT INVC_CUENTA, INVC_BASE, INVC_PORC, INVC_VALOR, INVC_DB
        FROM INTERFAZ_VENTAS_CTAS WHERE INVE_ID = :IDINTER
        INTO :CTADIC, :BASEADIC, :PORCADIC, :VALORADIC, :DBADIC
        DO
        BEGIN
        if (valoradic <> 0) then
            monto = valoradic;
        else
            BEGIN
            if (:BASEADIC = 'SUBTOTAL') then
                VALORADIC = vrsubt;
            if (:BASEADIC = 'DESCUENTO') then
                VALORADIC = VRDTO;
            if (:BASEADIC = 'IVA') then
                VALORADIC = VRIVA;
            if (:BASEADIC = 'ADICIONAL') then
                VALORADIC = VRADIC;
            if (:BASEADIC = 'EXTRA') then
                VALORADIC = VREXTRA;
            if (:BASEADIC = 'TOTAL') then
                VALORADIC = VRTOTAL;
            MONTO = VALORADIC * PORCADIC;
            END
        if (MONTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTADIC, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                if (DBADIC = 'S') then
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                ELSE
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                NROI = NROI + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                if (DBADIC = 'S') then
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                ELSE
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                END
            NROI = NROI + 1;
            END
        END
    if (error > 0) then
        ver = 'S';
    SUSPEND;
    END
   END /* EXISTE LA INTERFAZ */
  ELSE
    BEGIN
    EXECUTE PROCEDURE ERROR (33, :IDDOC, :PREF, 1);
    ERROR = ERROR + 1;
    VER = 'S';
    SUSPEND;
    END
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE DEVOLUCIONES_SIN_CONTABILIDAD(
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    ID INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    ESTADO VARCHAR(20),
    IDI INTEGER,
    IDC INTEGER)
AS
DECLARE VARIABLE VER CHAR(2);
declare variable FECICNT VARCHAR(10);
declare variable FECFCNT VARCHAR(10);
declare variable ERROR INTEGER;
declare variable idref INTEGER;
BEGIN
EXECUTE PROCEDURE fecha_a_conta(FECINI) returning_values (FECICNT);
EXECUTE PROCEDURE fecha_a_conta(FECFIN) returning_values (FECFCNT);
FOR SELECT DEVT_ID, PREF_PRE, DEVT_NUMERO FROM devoluciones_ventas WHERE DEVT_ANULADO = 'N' AND
    DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN
    INTO :ID, :PREF, :NUMERO
DO
  BEGIN
  idref = null;
  SELECT ENCO_IDREF FROM COMPROBANTE_ENCABEZADO WHERE ENCO_TIPOREF = 33 AND ENCO_FECHA >= :FECICNT AND ENCO_FECHA <= :FECFCNT and ENCO_IDREF = :id into :idref;
  if (idref IS NULL) then
  begin
   ESTADO = 'PROCESANDO';
   SUSPEND;
   SELECT MAX(INVE_ID) FROM INTERFAZ_VENTAS WHERE PREF_PRE = :PREF AND TIDO_COD = 33 INTO :IDI;
   EXECUTE PROCEDURE contabil_devolcli (:ID, :IDI) RETURNING_VALUES (:ERROR, :VER, :IDC);
   if (ERROR = 0) then
    BEGIN
    EXECUTE PROCEDURE CONTABILIZA_PENDIENTE (:IDC);
    ESTADO = 'OK';
    END
   ELSE
    ESTADO = 'ERROR';
   suspend;
  End
  END
END

^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure IMPUESTOS_VENTAS (
    FECINI date,
    FECFIN date,
    PREFIJO varchar(4),
    PTOINI integer,
    PTOFIN integer,
    ANULADOS char(1),
    SUBEMPRESA integer)
returns (
    TIPO integer,
    NOMTIPO varchar(30),
    PREF varchar(4),
    NUMERO varchar(6),
    FECHA date,
    NIT varchar(20),
    NOMTERCERO varchar(60),
    SUBTOTAL numeric(18,2),
    DTOMONTO numeric(18,2),
    ADICIONAL numeric(18,2),
    IVAMONTO numeric(18,2),
    CONSUMO numeric(18,2),
    EXENTOS numeric(18,2),
    GRAVADOS1 numeric(18,2),
    GRAVADOS2 numeric(18,2),
    GRAVADOS3 numeric(18,2),
    BASEDEC2799 numeric(18,2),
    IVA1 numeric(18,2),
    IVA2 numeric(18,2),
    IVA3 numeric(18,2),
    IVADEC2799 numeric(18,2),
    EXTRA numeric(18,2),
    TOTAL numeric(18,2),
    RTFTEMONTO numeric(18,2),
    RTIVAMONTO numeric(18,2),
    RTICAMONTO numeric(18,2),
    NETO numeric(18,2),
    ANULADO char(1))
AS
declare variable ID INTEGER;
declare variable TER_exento CHAR(1);
declare variable NOTAS CHAR(2);
declare variable ajustar CHAR(1);
declare variable FACTOR NUMERIC(18,4);
declare variable NUEVO NUMERIC(18,2);
declare variable FACTENC NUMERIC(18,2);
BEGIN
/* FACTURA */
TIPO = 31;
SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 31 INTO :NOMTIPO;
ajustar = 'N';
FOR SELECT FACT_ID, F.PREF_PRE, FACT_NUMERO, FACT_FECHA, TERC_NIT, FACT_NOMCLIENTE, FACT_ADICIONAL-FACT_DTOMONTO, FACT_IVAMONTO, FACT_RTFTEMONTO, FACT_RTIVAMONTO, FACT_RTICAMONTO, FACT_EXTRA, FACT_TOTAL, FACT_ANULADO, fact_factor
    FROM FACTURAS F, PREFIJOS PR WHERE PTVT_ID >= :PTOINI AND PTVT_ID <= :PTOFIN AND
    FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND ((:PREFIJO = '') or (:PREFIJO IS NULL) or (F.PREF_PRE = :PREFIJO))
    AND PR.PREF_PRE = F.PREF_PRE AND PR.TIDO_COD = 31 AND ((PR.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
    ORDER BY FACT_FECHA, F.PREF_PRE, FACT_NUMERO
    INTO :ID, :PREF, :NUMERO, :FECHA, :NIT, :NOMTERCERO, :DTOMONTO, :IVAMONTO, :RTFTEMONTO, :RTIVAMONTO, :RTICAMONTO, :EXTRA, :TOTAL, :ANULADO, :FACTENC
    DO
    BEGIN
    SELECT TERC_EXENTO FROM TERCEROS WHERE TERC_NIT = :NIT INTO :TER_EXENTO;
    if ((ANULADOS = 'S') or (ANULADO = 'N')) then
        BEGIN
        if (ANULADO = 'S') then
            BEGIN
            EXENTOS = 0;
            GRAVADOS1 = 0;
            GRAVADOS2 = 0;
            GRAVADOS3 = 0;
            CONSUMO = 0;
            SUBTOTAL = 0;
            TOTAL = 0;
            EXTRA = 0;
            IVAMONTO = 0;
            IVA1 = 0;
            IVA2 = 0;
            IVA3 = 0;
            DTOMONTO = 0;
            NETO = 0;
            RTFTEMONTO = 0;
            RTIVAMONTO = 0;
            RTICAMONTO = 0;
            basedec2799 = 0;
            ivadec2799 = 0;
            END
        else
            BEGIN
            /* CALCULE LAS DIFERENTES TARIFAS */
            if (TER_EXENTO = 'S') then
                BEGIN
                SELECT SUM(FADE_TOTAL - FADE_IVAMONTO - FADE_CONSUMO)*:FACTENC FROM FACTURAS_DETALLE D WHERE FACT_ID = :ID AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL)) AND FADE_IVAMONTO = 0 INTO :EXENTOS;
                SELECT SUM((FADE_TOTAL - FADE_IVAMONTO - FADE_CONSUMO)*:FACTENC), SUM(FADE_IVAMONTO*:FACTENC) FROM FACTURAS_DETALLE D, TARIFA_IVA T WHERE FACT_ID = :ID AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL)) AND FADE_IVAPORC = TAIV_PORC AND FADE_IVAPORC = 16 AND FADE_IVAMONTO <> 0 INTO :GRAVADOS1, :IVA1;
                SELECT SUM((FADE_TOTAL - FADE_IVAMONTO - FADE_CONSUMO)*:FACTENC), SUM(FADE_IVAMONTO*:FACTENC) FROM FACTURAS_DETALLE D, TARIFA_IVA T WHERE FACT_ID = :ID AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL)) AND FADE_IVAPORC = TAIV_PORC AND FADE_IVAPORC = 10 AND FADE_IVAMONTO <> 0 INTO :GRAVADOS2, :IVA2;
                GRAVADOS3 = 0;
                IVA3 = 0;
                basedec2799 = 0;
                ivadec2799 = 0;
                end
            else
                begin
                SELECT SUM((FADE_TOTAL - FADE_IVAMONTO - FADE_CONSUMO)*:FACTENC) FROM FACTURAS_DETALLE D WHERE FACT_ID = :ID AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL)) AND FADE_IVAPORC = 0 INTO :EXENTOS;
                SELECT SUM((FADE_TOTAL - FADE_IVAMONTO - FADE_CONSUMO)*:FACTENC), SUM(FADE_IVAMONTO*:FACTENC) FROM FACTURAS_DETALLE D, TARIFA_IVA T WHERE FACT_ID = :ID AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL)) AND FADE_IVAPORC = TAIV_PORC AND TAIV_COD = 1 INTO :GRAVADOS1, :IVA1;
                SELECT SUM((FADE_TOTAL - FADE_IVAMONTO - FADE_CONSUMO)*:FACTENC), SUM(FADE_IVAMONTO*:FACTENC) FROM FACTURAS_DETALLE D, TARIFA_IVA T WHERE FACT_ID = :ID AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL)) AND FADE_IVAPORC = TAIV_PORC AND TAIV_COD = 2 INTO :GRAVADOS2, :IVA2;
                SELECT SUM((FADE_TOTAL - FADE_IVAMONTO - FADE_CONSUMO)*:FACTENC), SUM(FADE_IVAMONTO*:FACTENC) FROM FACTURAS_DETALLE D, TARIFA_IVA T WHERE FACT_ID = :ID AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL)) AND FADE_IVAPORC = TAIV_PORC AND TAIV_COD = 3 INTO :GRAVADOS3, :IVA3;
                SELECT SUM((FADE_TOTAL - FADE_IVAMONTO - FADE_CONSUMO)*:FACTENC), SUM(FADE_IVAMONTO*:FACTENC) FROM FACTURAS_DETALLE D, ARTICULO A WHERE FACT_ID = :ID AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL)) AND D.arti_cod = A.arti_cod AND A.arti_dec2799 = 'S' INTO :basedec2799, :ivadec2799;
                end
            if (iva1 is null) then
                iva1 = 0;
            if (iva2 is null) then
                iva2 = 0;
            if (iva3 is null) then
                iva3 = 0;
            if (ivadec2799 is null) then
                ivadec2799 = 0;
            SELECT SUM(FADE_CONSUMO) FROM FACTURAS_DETALLE WHERE FACT_ID = :ID AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL)) INTO :CONSUMO;
            SUBTOTAL = TOTAL - EXTRA - IVAMONTO;
            NETO = TOTAL - RTFTEMONTO - RTIVAMONTO - RTICAMONTO;
            END
        if (exentos is null) then
            exentos = 0;
        if (gravados1 is null) then
            gravados1 = 0;
        if (gravados2 is null) then
            gravados2 = 0;
        if (gravados3 is null) then
            gravados3 = 0;
        if (basedec2799 is null) then
            basedec2799 = 0;
        if (consumo is null) then
            consumo = 0;
        FACTOR = 1;
        SELECT AJCI_FACTOR FROM ajuste_cierre WHERE AJCI_PORC = 0 AND AJCI_FECINI <= :FECHA AND AJCI_FECFIN >= :FECHA INTO :FACTOR;
        if (FACTOR IS null) then
            FACTOR = 1;
        if (factor <> 1) then
            ajustar = 'S';
        EXENTOS = EXENTOS * FACTOR;
        FACTOR = 1;
        SELECT AJCI_FACTOR FROM ajuste_cierre WHERE AJCI_PORC = 16 AND AJCI_FECINI <= :FECHA AND AJCI_FECFIN >= :FECHA INTO :FACTOR;
        if (FACTOR IS null) then
            FACTOR = 1;
        if (factor <> 1) then
            ajustar = 'S';
        gravados1 = GRAVADOS1 * FACTOR;
        IVA1 = IVA1 * FACTOR;
        FACTOR = 1;
        SELECT AJCI_FACTOR FROM ajuste_cierre WHERE AJCI_PORC = 10 AND AJCI_FECINI <= :FECHA AND AJCI_FECFIN >= :FECHA INTO :FACTOR;
        if (FACTOR IS null) then
            FACTOR = 1;
        if (factor <> 1) then
            ajustar = 'S';
        gravados2 = GRAVADOS2 * FACTOR;
        IVA2 = IVA2 * FACTOR;
        FACTOR = 1;
        SELECT AJCI_FACTOR FROM ajuste_cierre WHERE AJCI_PORC = 7 AND AJCI_FECINI <= :FECHA AND AJCI_FECFIN >= :FECHA INTO :FACTOR;
        if (FACTOR IS null) then
            FACTOR = 1;
        if (factor <> 1) then
            ajustar = 'S';
        gravados3 = GRAVADOS3 * FACTOR;
        IVA3 = IVA3 * FACTOR;
        NUEVO = exentos + gravados1 + gravados2 + gravados3;
        if ((TOTAL <> 0) and (ajustar = 'S')) then
            BEGIN
            IVAMONTO = IVA1 + IVA2 + IVA3;
            CONSUMO = CONSUMO * (NUEVO+ivamonto+consumo) / TOTAL;
            SUBTOTAL = SUBTOTAL * (NUEVO+ivamonto+consumo) / TOTAL;
            NETO = NETO * (NUEVO+ivamonto+consumo) / TOTAL;
            rtftemonto = rtftemonto * (NUEVO+ivamonto+consumo) / TOTAL;
            rticamonto = rticamonto * (NUEVO+ivamonto+consumo) / TOTAL;
            rtivamonto = rtivamonto * (NUEVO+ivamonto+consumo) / TOTAL;
            dtomonto = dtomonto * (NUEVO+ivamonto+consumo) / TOTAL;
            adicional = adicional * (NUEVO+ivamonto+consumo) / TOTAL;
            total = total * (NUEVO+ivamonto+consumo) / TOTAL;
            END
        SUSPEND;
        END
    END
    
TIPO = 33;
ajustar = 'N';
SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 33 INTO :NOMTIPO;
/* DEVOLUCIONES */
FOR SELECT DEVT_ID, D.PREF_PRE, DEVT_NUMERO, DEVT_FECHA, TERC_NIT, DEVT_NOMTERC, DEVT_ADICIONAL-DEVT_DTOMONTO, DEVT_IVAMONTO, DEVT_RTFTEMONTO, DEVT_RTIVAMONTO, DEVT_RTICAMONTO, DEVT_EXTRA, DEVT_TOTAL, DEVT_ANULADO, DEVT_FACTOR
    FROM DEVOLUCIONES_VENTAS D, PREFIJOS PR WHERE PTVT_ID >= :PTOINI AND PTVT_ID <= :PTOFIN AND
    DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND ((:PREFIJO = '') or (:PREFIJO IS NULL) or (D.PREF_PRE = :PREFIJO))
    AND PR.PREF_PRE = D.PREF_PRE AND PR.TIDO_COD = 33 AND ((PR.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) AND ((DEVT_REMID = 0) or (DEVT_REMID IS NULL)) AND ((DEVT_PEDID = 0) or (DEVT_PEDID IS NULL))
    ORDER BY DEVT_FECHA, D.PREF_PRE, DEVT_NUMERO
    INTO :ID, :PREF, :NUMERO, :FECHA, :NIT, :NOMTERCERO, :DTOMONTO, :IVAMONTO, :RTFTEMONTO, :RTIVAMONTO, :RTICAMONTO, :EXTRA, :TOTAL, :ANULADO, :FACTENC
    DO
    BEGIN
    SELECT TERC_EXENTO FROM TERCEROS WHERE TERC_NIT = :NIT INTO :TER_EXENTO;
    if ((ANULADOS = 'S') or (ANULADO = 'N')) then
        BEGIN
        if (ANULADO = 'S') then
            BEGIN
            EXENTOS = 0;
            GRAVADOS1 = 0;
            GRAVADOS2 = 0;
            GRAVADOS3 = 0;
            CONSUMO = 0;
            SUBTOTAL = 0;
            TOTAL = 0;
            EXTRA = 0;
            IVAMONTO = 0;
            IVA1 = 0;
            IVA2 = 0;
            IVA3 = 0;
            DTOMONTO = 0;
            NETO = 0;
            RTFTEMONTO = 0;
            RTIVAMONTO = 0;
            RTICAMONTO = 0;
            basedec2799 = 0;
            ivadec2799 = 0;
            END
        else
            BEGIN
            DTOMONTO = DTOMONTO * -1;
            ADICIONAL = ADICIONAL * -1;
            IVAMONTO = IVAMONTO * -1;
            EXTRA = EXTRA * -1;
            TOTAL = TOTAL * -1;
            RTFTEMONTO = RTFTEMONTO * -1;
            RTIVAMONTO = RTIVAMONTO * -1;
            RTICAMONTO = RTICAMONTO * -1;
            /* CALCULE LAS DIFERENTES TARIFAS */
            if (TER_EXENTO = 'S') then
              BEGIN
              SELECT SUM((DVDE_TOTAL - DVDE_IVAMONTO - DVDE_CONSUMO)*:FACTENC) FROM DEVOLUCIONES_VENTAS_DETALLE D WHERE DEVT_ID = :ID AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL)) AND DVDE_IVAMONTO = 0 INTO :EXENTOS;
              SELECT SUM((DVDE_TOTAL - DVDE_IVAMONTO - DVDE_CONSUMO)*:FACTENC), SUM(DVDE_IVAMONTO*:FACTENC) FROM DEVOLUCIONES_VENTAS_DETALLE D WHERE DEVT_ID = :ID AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL)) AND DVDE_IVAPORC = 16 AND DVDE_IVAMONTO <> 0 INTO :GRAVADOS1, :IVA1;
              SELECT SUM((DVDE_TOTAL - DVDE_IVAMONTO - DVDE_CONSUMO)*:FACTENC), SUM(DVDE_IVAMONTO*:FACTENC) FROM DEVOLUCIONES_VENTAS_DETALLE D WHERE DEVT_ID = :ID AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL)) AND DVDE_IVAPORC = 10 AND DVDE_IVAMONTO <> 0 INTO :GRAVADOS2, :IVA2;
              GRAVADOS3 = 0;
              iVA3 = 0;
              basedec2799 = 0;
              ivadec2799 = 0;
              end
            else
              begin
              SELECT SUM((DVDE_TOTAL - DVDE_IVAMONTO - DVDE_CONSUMO)*:FACTENC) FROM DEVOLUCIONES_VENTAS_DETALLE D WHERE DEVT_ID = :ID AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL)) AND DVDE_IVAPORC = 0 INTO :EXENTOS;
              SELECT SUM((DVDE_TOTAL - DVDE_IVAMONTO - DVDE_CONSUMO)*:FACTENC), SUM(DVDE_IVAMONTO*:FACTENC) FROM DEVOLUCIONES_VENTAS_DETALLE D, TARIFA_IVA T WHERE DEVT_ID = :ID AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL)) AND DVDE_IVAPORC = TAIV_PORC AND TAIV_COD = 1 INTO :GRAVADOS1, :IVA1;
              SELECT SUM((DVDE_TOTAL - DVDE_IVAMONTO - DVDE_CONSUMO)*:FACTENC), SUM(DVDE_IVAMONTO*:FACTENC) FROM DEVOLUCIONES_VENTAS_DETALLE D, TARIFA_IVA T WHERE DEVT_ID = :ID AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL)) AND DVDE_IVAPORC = TAIV_PORC AND TAIV_COD = 2 INTO :GRAVADOS2, :IVA2;
              SELECT SUM((DVDE_TOTAL - DVDE_IVAMONTO - DVDE_CONSUMO)*:FACTENC), SUM(DVDE_IVAMONTO*:FACTENC) FROM DEVOLUCIONES_VENTAS_DETALLE D, TARIFA_IVA T WHERE DEVT_ID = :ID AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL)) AND DVDE_IVAPORC = TAIV_PORC AND TAIV_COD = 3 INTO :GRAVADOS3, :IVA3;
              SELECT SUM((DVDE_TOTAL - DVDE_IVAMONTO - DVDE_CONSUMO)*:FACTENC), SUM(DVDE_IVAMONTO*:FACTENC) FROM DEVOLUCIONES_VENTAS_DETALLE D, ARTICULO A WHERE DEVT_ID = :ID AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL)) AND D.arti_cod = A.arti_cod AND A.arti_dec2799 = 'S' INTO :basedec2799, :ivadec2799;
              end
            if (iva1 is null) then
                iva1 = 0;
            if (iva2 is null) then
                iva2 = 0;
            if (iva3 is null) then
                iva3 = 0;
            if (ivadec2799 is null) then
                ivadec2799 = 0;
            SELECT SUM(DVDE_CONSUMO) FROM DEVOLUCIONES_VENTAS_DETALLE WHERE DEVT_ID = :ID AND DVDE_REFERENCIA <> '.t' INTO :CONSUMO;
            EXENTOS = EXENTOS * -1;
            GRAVADOS1 = GRAVADOS1 * -1;
            GRAVADOS2 = GRAVADOS2 * -1;
            GRAVADOS3 = GRAVADOS3 * -1;
            CONSUMO = CONSUMO * -1;
            IVA1 = IVA1 * -1;
            IVA2 = IVA2 * -1;
            IVA3 = IVA3 * -1;
            SUBTOTAL = TOTAL - EXTRA - IVAMONTO;
            NETO = TOTAL - RTFTEMONTO - RTIVAMONTO - RTICAMONTO;
            END
        if (exentos is null) then
            exentos = 0;
        if (gravados1 is null) then
            gravados1 = 0;
        if (gravados2 is null) then
            gravados2 = 0;
        if (gravados3 is null) then
            gravados3 = 0;
        if (consumo is null) then
            consumo = 0;
        if (basedec2799 is null) then
            basedec2799 = 0;
        FACTOR = 1;
        SELECT AJCI_FACTOR FROM ajuste_cierre WHERE AJCI_PORC = 0 AND AJCI_FECINI <= :FECHA AND AJCI_FECFIN >= :FECHA INTO :FACTOR;
        if (FACTOR IS null) then
            FACTOR = 1;
        if (factor <> 1) then
            ajustar = 'S';
        EXENTOS = EXENTOS * FACTOR;
        FACTOR = 1;
        SELECT AJCI_FACTOR FROM ajuste_cierre WHERE AJCI_PORC = 16 AND AJCI_FECINI <= :FECHA AND AJCI_FECFIN >= :FECHA INTO :FACTOR;
        if (FACTOR IS null) then
            FACTOR = 1;
        if (factor <> 1) then
            ajustar = 'S';
        gravados1 = GRAVADOS1 * FACTOR;
        IVA1 = IVA1 * FACTOR;
        FACTOR = 1;
        SELECT AJCI_FACTOR FROM ajuste_cierre WHERE AJCI_PORC = 10 AND AJCI_FECINI <= :FECHA AND AJCI_FECFIN >= :FECHA INTO :FACTOR;
        if (FACTOR IS null) then
            FACTOR = 1;
        if (factor <> 1) then
            ajustar = 'S';
        gravados2 = GRAVADOS2 * FACTOR;
        IVA2 = IVA2 * FACTOR;
        FACTOR = 1;
        SELECT AJCI_FACTOR FROM ajuste_cierre WHERE AJCI_PORC = 7 AND AJCI_FECINI <= :FECHA AND AJCI_FECFIN >= :FECHA INTO :FACTOR;
        if (FACTOR IS null) then
            FACTOR = 1;
        if (factor <> 1) then
            ajustar = 'S';
        gravados3 = GRAVADOS3 * FACTOR;
        IVA3 = IVA3 * FACTOR;
        NUEVO = exentos + gravados1 + gravados2 + gravados3;
        if ((TOTAL <> 0) and (ajustar = 'S')) then
            BEGIN
            IVAMONTO = IVA1 + IVA2 + IVA3;
            CONSUMO = CONSUMO * (NUEVO+ivamonto+consumo) / TOTAL;
            SUBTOTAL = SUBTOTAL * (NUEVO+ivamonto+consumo) / TOTAL;
            NETO = NETO * (NUEVO+ivamonto+consumo) / TOTAL;
            rtftemonto = rtftemonto * (NUEVO+ivamonto+consumo) / TOTAL;
            rticamonto = rticamonto * (NUEVO+ivamonto+consumo) / TOTAL;
            rtivamonto = rtivamonto * (NUEVO+ivamonto+consumo) / TOTAL;
            dtomonto = dtomonto * (NUEVO+ivamonto+consumo) / TOTAL;
            adicional = adicional * (NUEVO+ivamonto+consumo) / TOTAL;
            total = total * (NUEVO+ivamonto+consumo) / TOTAL;
            END
        SUSPEND;
        END
    END
execute procedure lee_configuracion ('FACTURACION', 'DOCUMENTOS', 'INCLUIR NOTAS DE CARTERA EN REPORTE DE IMPUESTOS EN VENTAS') returning_values (:NOTAS);
if (NOTAS = 'SI') then
    BEGIN
    TIPO = 41;
    SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 41 INTO :NOMTIPO;
    FOR SELECT NDCL_ID, N.PREF_PRE, NDCL_NUMERO, NDCL_FECHA, N.TERC_NIT, TERC_NOM, 0, NDCL_IVAMONTO, NDCL_RTFTEMONTO, NDCL_RTIVAMONTO, NDCL_RTICAMONTO, 0, NDCL_MONTO+NDCL_IVAMONTO, NDCL_ANULADO
        FROM NOTAS_DEBITO_CLIENTES N, TERCEROS T, PREFIJOS PR WHERE N.TERC_NIT = T.TERC_NIT AND
        NDCL_FECHA >= :FECINI AND NDCL_FECHA <= :FECFIN AND ((:PREFIJO = '') or (:PREFIJO IS NULL) or (N.PREF_PRE = :PREFIJO))
        AND PR.PREF_PRE = N.PREF_PRE AND PR.TIDO_COD = 41 AND ((PR.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
        ORDER BY NDCL_FECHA, N.PREF_PRE, NDCL_NUMERO
        INTO :ID, :PREF, :NUMERO, :FECHA, :NIT, :NOMTERCERO, :DTOMONTO, :IVAMONTO, :RTFTEMONTO, :RTIVAMONTO, :RTICAMONTO, :EXTRA, :TOTAL, :ANULADO
        DO
        BEGIN
        GRAVADOS2 = 0;
        GRAVADOS3 = 0;
        IVA2 = 0;
        IVA3 = 0;
        CONSUMO = 0;
        if (ANULADO = 'S') then
            BEGIN
            EXENTOS = 0;
            GRAVADOS1 = 0;
            SUBTOTAL = 0;
            TOTAL = 0;
            EXTRA = 0;
            IVAMONTO = 0;
            IVA1 = 0;
            DTOMONTO = 0;
            NETO = 0;
            RTFTEMONTO = 0;
            RTIVAMONTO = 0;
            RTICAMONTO = 0;
            END
        ELSE
            BEGIN
            if (IVAMONTO <> 0) then
                BEGIN
                GRAVADOS1 = TOTAL-IVAMONTO;
                IVA1 = IVAMONTO;
                exentos = 0;
                END
            ELSE
                BEGIN
                GRAVADOS1 = 0;
                IVA1 = 0;
                exentos = TOTAL;
                END
            SUBTOTAL = TOTAL - EXTRA - IVAMONTO;
            NETO = TOTAL - RTFTEMONTO - RTIVAMONTO - RTICAMONTO;
            END
        SUSPEND;
        END

    TIPO = 42;
    SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 42 INTO :NOMTIPO;
    FOR SELECT NCCL_ID, N.PREF_PRE, NCCL_NUMERO, NCCL_FECHA, N.TERC_NIT, TERC_NOM, 0, NCCL_IVAMONTO, NCCL_RTFTEMONTO, NCCL_RTIVAMONTO, NCCL_RTICAMONTO, 0, NCCL_MONTO+NCCL_IVAMONTO, NCCL_ANULADO
        FROM NOTAS_CREDITO_CLIENTES N, TERCEROS T, PREFIJOS PR WHERE N.TERC_NIT = T.TERC_NIT AND
        NCCL_FECHA >= :FECINI AND NCCL_FECHA <= :FECFIN AND ((:PREFIJO = '') or (:PREFIJO IS NULL) or (N.PREF_PRE = :PREFIJO))
        AND PR.PREF_PRE = N.PREF_PRE AND PR.TIDO_COD = 42 AND ((PR.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
        ORDER BY NCCL_FECHA, N.PREF_PRE, NCCL_NUMERO
        INTO :ID, :PREF, :NUMERO, :FECHA, :NIT, :NOMTERCERO, :DTOMONTO, :IVAMONTO, :RTFTEMONTO, :RTIVAMONTO, :RTICAMONTO, :EXTRA, :TOTAL, :ANULADO
        DO
        BEGIN
        GRAVADOS2 = 0;
        GRAVADOS3 = 0;
        IVA2 = 0;
        IVA3 = 0;
        CONSUMO = 0;
        if (ANULADO = 'S') then
            BEGIN
            EXENTOS = 0;
            GRAVADOS1 = 0;
            SUBTOTAL = 0;
            TOTAL = 0;
            EXTRA = 0;
            IVAMONTO = 0;
            IVA1 = 0;
            DTOMONTO = 0;
            NETO = 0;
            RTFTEMONTO = 0;
            RTIVAMONTO = 0;
            RTICAMONTO = 0;
            END
        ELSE
            BEGIN
            DTOMONTO = DTOMONTO * -1;
            ADICIONAL = ADICIONAL * -1;
            IVAMONTO = IVAMONTO * -1;
            EXTRA = EXTRA * -1;
            TOTAL = TOTAL * -1;
            RTFTEMONTO = RTFTEMONTO * -1;
            RTIVAMONTO = RTIVAMONTO * -1;
            RTICAMONTO = RTICAMONTO * -1;
            if (IVAMONTO <> 0) then
                BEGIN
                GRAVADOS1 = TOTAL-IVAMONTO;
                IVA1 = IVAMONTO;
                exentos = 0;
                END
            ELSE
                BEGIN
                GRAVADOS1 = 0;
                IVA1 = 0;
                exentos = TOTAL;
                END
            SUBTOTAL = TOTAL - EXTRA - IVAMONTO;
            NETO = TOTAL - RTFTEMONTO - RTIVAMONTO - RTICAMONTO;
            END
        SUSPEND;
        END
    END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure IMPR_FACTURA (
    ID integer)
returns (
    PREF varchar(4),
    NUMERO varchar(6),
    FECHA date,
    VENCE date,
    DIASVENCE integer,
    CONTCRED char(17),
    NIT varchar(20),
    NOMTERCERO varchar(60),
    NOMCLIENTE varchar(60),
    VENDEDOR integer,
    NOMVENDEDOR varchar(60),
    PUNTOVTA integer,
    NOMPUNTOVTA varchar(60),
    CODBODEGA varchar(2),
    NOMBODEGA varchar(30),
    AUTORIZACION varchar(20),
    DESPACHO varchar(255),
    TRANSPORTADOR varchar(60),
    COTIZACION varchar(30),
    PEDIDO varchar(30),
    REMISION varchar(30),
    PACIENTE varchar(20),
    NOMPACIENTE varchar(60),
    COMIPORC numeric(9,2),
    COMIMONTO numeric(18,2),
    SUBTOTAL numeric(18,2),
    INGTERCEROS numeric(18,2),
    INGPROPIOS numeric(18,2),
    DTOPORC numeric(9,2),
    DTOMONTO numeric(18,2),
    ADICIONAL numeric(18,2),
    IVAMONTO numeric(18,2),
    DEC2799 numeric(18,2),
    RTEFTEPORC numeric(9,2),
    RTEFTEMONTO numeric(18,2),
    RTEIVAPORC numeric(9,2),
    RTEIVAMONTO numeric(18,2),
    RTEICAPORC numeric(9,2),
    RTEICAMONTO numeric(18,2),
    EXTRA numeric(18,2),
    DTOFPORC numeric(9,2),
    DTOFMONTO numeric(18,2),
    FECHADTO date,
    ANTICIPO numeric(18,2),
    RETGARANTIA numeric(18,2),
    TOTALFAC numeric(18,2),
    TOTALPAGAR numeric(18,2),
    TOTALNETO numeric(18,2),
    OBS blob sub_type 1 segment size 80,
    ITEM integer,
    ARTICULO varchar(15),
    CODBAR varchar(15),
    ARTIDES varchar(60),
    DESCORTA varchar(30),
    CANT numeric(18,4),
    LOTE varchar(15),
    VLOTE date,
    UNIDAD varchar(8),
    CAJAS numeric(18,4),
    FACTOR numeric(18,4),
    LISTAPR integer,
    REFITEM varchar(60),
    BODITEM varchar(2),
    STAND varchar(20),
    PRUNIT numeric(18,2),
    DTOITPORC numeric(9,2),
    DTOITMONTO numeric(18,2),
    PRNETO numeric(18,2),
    PRNETOSINIVA numeric(18,2),
    BASE numeric(18,2),
    PORCBASE numeric(9,2),
    DTOIT1 numeric(9,2),
    DTOIT2 numeric(9,2),
    DTOIT3 numeric(9,2),
    IVAPORC numeric(9,2),
    IVAITMONTO numeric(18,2),
    CONSUMO numeric(18,2),
    SUBTOTIT numeric(18,2),
    TOTAL numeric(18,2),
    PESOTOT numeric(18,2),
    CODIGOCL varchar(20),
    ZONACOD varchar(2),
    ZONANOM varchar(60),
    DV char(1),
    DIRECCION varchar(60),
    CIUDAD varchar(40),
    TELEFONO varchar(40),
    CONTACTO varchar(60),
    FAX varchar(25),
    CEL varchar(25),
    GRUPO varchar(2),
    NOMGRUPO varchar(30),
    SUBGRUPO varchar(3),
    NOMSUBG varchar(30),
    MARCA varchar(3),
    NOMMARCA varchar(30),
    PESO numeric(18,4),
    ANCHO numeric(18,4),
    ALTO numeric(18,4),
    LARGO numeric(18,4),
    SUMA1 numeric(18,2),
    SUMA2 numeric(18,2),
    SUMA3 numeric(18,2),
    IVA1 numeric(18,2),
    IVA2 numeric(18,2),
    IVA3 numeric(18,2),
    SUMAEX numeric(18,2),
    SUMAGR numeric(18,2),
    TOTCONSUMO numeric(18,2),
    DTOIT1M numeric(18,2),
    DTOIT2M numeric(18,2),
    DTOIT3M numeric(18,2),
    TOTCAJAS numeric(18,2),
    TOTBASE numeric(18,2),
    VEHICULO varchar(8),
    RECIBIDO numeric(18,2),
    CAMBIO numeric(18,2),
    HORA time,
    FORMAPAGO1 varchar(30),
    MONTOPAGO1 numeric(18,2),
    FORMAPAGO2 varchar(30),
    MONTOPAGO2 numeric(18,2),
    FORMAPAGO3 varchar(30),
    MONTOPAGO3 numeric(18,2),
    PUNTOS integer,
    PUNTOSACUM integer,
    PUNTOSVENC integer,
    FECPTOS date,
    OBSITEM blob sub_type 1 segment size 80,
    SUCUR varchar(10),
    ALTERNATIVAS numeric(18,4),
    PRINCIPALES numeric(18,4))
AS
DECLARE VARIABLE IMPTOS CHAR(1);
DECLARE VARIABLE TARIFA INTEGER;
declare variable DEVUELTO NUMERIC(18,2);
declare variable ORDENCOD CHAR(8);
declare variable IMPRDEV CHAR(2);
declare variable IMPR CHAR(1);
declare variable ITEMFP INTEGER;
declare variable FORMAP VARCHAR(30);
declare variable MONTOP NUMERIC(18,2);
declare variable ICOINC CHAR(2);
declare variable DTOITM1 NUMERIC(18,2);
declare variable DTOITM2 NUMERIC(18,2);
declare variable DTOITM3 NUMERIC(18,2);
declare variable DTOITE3 CHAR(2);
declare variable SUMDTOIT NUMERIC(18,2);
declare variable AUTORET VARCHAR(10);
declare variable FAUTORET DATE;
declare variable FACTCANT NUMERIC(18,4);
declare variable ANULADO CHAR(1);
declare variable INGTER CHAR(2);
BEGIN
execute procedure lee_configuracion('FACTURACION', 'ARTICULOS', 'IMPOCONSUMO INCLUIDO EN EL PRECIO BASE DE VENTA ANTES DE IVA') returning_values (icoinc);
execute procedure lee_configuracion('FACTURACION', 'FACTURAS', 'COLUMNAS DE DESCUENTO POR ITEM ADICIONALES') returning_values (DTOITE3);
execute procedure lee_configuracion('FACTURACION', 'FACTURAS', 'GRUPO DE MERCANCIA PARA INGRESOS DE TERCEROS') returning_values (INGTER);
SELECT F.PREF_PRE, FACT_NUMERO, FACT_FECHA, FACT_VENCE, F.BODE_COD, BODE_NOM, F.TERC_NIT, FACT_NOMCLIENTE, F.VEND_COD, VEND_NOMBRE, F.PTVT_ID, PTVT_NOM,
    AUTO_NUMERO, FACT_DESPACHO, FACT_TRANSP, FACT_COTIZACI, FACT_PEDIDO, FACT_REMISION, FACT_COMIPORC, FACT_COMIMONTO, FACT_IVAINC, 
    FACT_DTOPOR, FACT_DTOMONTO, FACT_ADICIONAL, FACT_IVAMONTO, FACT_RTFTEPOR, FACT_RTFTEMONTO, FACT_RTIVAPOR, FACT_RTIVAMONTO, FACT_RTICAPOR, FACT_RTICAMONTO, FACT_EXTRA, FACT_DTOFPOR, FACT_DTOFMONTO, FACT_DTOFFECHA, FACT_TOTAL,
    TERC_DIR, TERC_CIU, TERC_TEL, TERC_CONTACTO, TERC_FAX, TERC_DV, TERC_CEL, FACT_DTOIT1, FACT_DTOIT2, FACT_DTOIT3, FACT_DEC2799,
    FACT_OBS, VEHI_COD, /*FACT_NROCOPIA,*/ FACT_RECIBIDO, FACT_SUCURSAL, FACT_DETCLI, FACT_DETCLINOM, TERC_NOM, FACT_ANULADO, FACT_ANTICIPO, FACT_GARANTIA
    FROM FACTURAS F, BODEGA B, VENDEDORES V, PUNTO_VENTA P, TERCEROS T
    WHERE F.BODE_COD = B.BODE_COD AND F.VEND_COD = V.VEND_COD AND F.PTVT_ID = P.PTVT_ID AND F.TERC_NIT = T.TERC_NIT AND F.FACT_ID = :ID
    into :PREF, :NUMERO, :FECHA, :VENCE, :CODBODEGA, :NOMBODEGA, :NIT, :NOMTERCERO, :VENDEDOR, :NOMVENDEDOR, :PUNTOVTA, :NOMPUNTOVTA,
    :AUTORIZACION, :DESPACHO, :TRANSPORTADOR, :COTIZACION, :PEDIDO, :REMISION, :COMIPORC, :COMIMONTO, :IMPTOS,
    :DTOPORC, :DTOMONTO, :ADICIONAL, :IVAMONTO, :RTEFTEPORC, :RTEFTEMONTO, :RTEIVAPORC, :RTEIVAMONTO, :RTEICAPORC, :RTEICAMONTO, :EXTRA, :DTOFPORC, :DTOFMONTO, :FECHADTO, :TOTALFAC,
    :DIRECCION, :CIUDAD, :TELEFONO, :CONTACTO, :FAX, :DV, :CEL, :dtoit1m, :dtoit2m, :dtoit3m, :dec2799,
    :OBS, :VEHICULO,/* :NROCOPIA,*/ :RECIBIDO, :SUCUR, :paciente, :nompaciente, :nomcliente, :ANULADO, :anticipo, :retgarantia;

/* ACUMULE LOS PUNTOS, SE HACE ACA POR SER POSTERIOR AL DETALLE */
if (ANULADO = 'N') then
    EXECUTE PROCEDURE acumula_puntos_cliente (31, :id, :nit, :fecha) returning_values (:PUNTOS);
EXECUTE PROCEDURE consulta_puntos_cliente (:id, :nit, :fecha) returning_values (:puntos, :puntosacum, :puntosvenc, :fecptos);
if (DTOIT1M IS NULL) then
    DTOIT1M = 0;
if (DTOIT2M IS NULL) then
    DTOIT2M = 0;
if (DTOIT3M IS NULL) then
    DTOIT3M = 0;
SELECT CLIE_COD, C.ZONA_COD, ZONA_NOM
    FROM CLIENTES C, ZONAS Z
    WHERE TERC_NIT = :NIT AND C.ZONA_COD = Z.ZONA_COD
    INTO :CODIGOCL, :ZONACOD, :ZONANOM;
SELECT CLSU_DIR, CLSU_CIUDAD, CLSU_TEL FROM CLIENTE_SUCURSALES WHERE TERC_NIT = :NIT AND CLCU_COD = :SUCUR
    INTO :DIRECCION, :CIUDAD, :TELEFONO;
DIASVENCE = VENCE - FECHA;
if (DIASVENCE > 0) then
    CONTCRED = 'CREDITO ' || CAST(DIASVENCE AS VARCHAR(3)) || ' DIAS';
ELSE
    CONTCRED = 'CONTADO';
SUBTOTAL = TOTALFAC - EXTRA - IVAMONTO - ADICIONAL + DTOMONTO + dec2799;
SELECT SUM(FADE_DTOMONTO*FADE_CANT) FROM FACTURAS_DETALLE WHERE FACT_ID = :id INTO :sumdtoit;
if (DTOITE3 = 'SI') then
    BEGIN
    SUBTOTAL = SUBTOTAL + sumdtoit + dtoit1m + dtoit2m + dtoit3m;
    END
if (INGTER <> '') then
    BEGIN
    SELECT SUM(FADE_TOTAL) FROM FACTURAS_DETALLE D, ARTICULO A WHERE A.arti_cod = D.arti_cod AND FACT_ID = :id AND GRUP_COD = :ingter
        INTO :ingterceros;
    INGPROPIOS = SUBTOTAL - INGTERCEROS;
    END
EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'FECHA AUTORETENEDOR NO DESCONTAR RETENCIONES DEL SALDO PERO SI CONTABILIZARLAS') returning_values (AUTORET);
if (AUTORET <> '') then
    FAUTORET = CAST(AUTORET AS DATE);
else
    FAUTORET = '9999/12/31';
if (FECHA > fautoret) then
    TOTALPAGAR = TOTALFAC - RTEIVAMONTO - RTEICAMONTO - ANTICIPO - RETGARANTIA;
ELSE
    TOTALPAGAR = TOTALFAC - RTEFTEMONTO - RTEIVAMONTO - RTEICAMONTO - ANTICIPO - RETGARANTIA;
TOTALNETO = TOTALFAC - ANTICIPO - RETGARANTIA;
if (RECIBIDO <> 0) then
    CAMBIO = RECIBIDO - totalpagar;
ELSE
    CAMBIO = 0;
SUMAEX = 0;
SUMA1 = 0;
SUMA2 = 0;
SUMA3 = 0;
IVA1 = 0;
IVA2 = 0;
IVA3 = 0;
TOTCONSUMO = 0;
MONTOPAGO1 = 0;
PESOTOT = 0;
SELECT MAX(AUDI_HORA) FROM AUDITORIA WHERE TIDO_COD = 31 AND AUDI_IDDOC = :ID AND AUDI_OPER = 'I' INTO :HORA;
/* AHORA LAS FORMAS DE PAGO, BUSQUE EL ABONO DE HOY A LA FACTURA */
ITEMFP = 1;
MONTOPAGO1 = 0;
MONTOPAGO2 = 0;
MONTOPAGO3 = 0;
FOR SELECT FOPA_NOM, RCPA_MONTO FROM RECIBOS_CAJA_PAGO P, FORMAS_PAGO F, RECIBOS_CAJA R, RECIBOS_CAJA_DETALLE D
    WHERE R.RECA_ID = P.RECA_ID AND R.RECA_ID = D.RECA_ID AND P.FOPA_ID = F.FOPA_ID AND RECA_FECHA = :FECHA AND RCDE_TIPODOC = 31 AND RCDE_IDDOC = :ID
    INTO :formap, :MONTOP
    DO
    BEGIN
    if (ITEMFP = 1) then
        BEGIN
        FORMAPAGO1 = FORMAP;
        MONTOPAGO1 = MONTOP;
        END
    if (ITEMFP = 2) then
        BEGIN
        FORMAPAGO2 = FORMAP;
        MONTOPAGO2 = MONTOP;
        END
    if (ITEMFP = 3) then
        BEGIN
        FORMAPAGO3 = FORMAP;
        MONTOPAGO3 = MONTOP;
        END
    ITEMFP = ITEMFP + 1;
    END
EXECUTE PROCEDURE lee_configuracion ('FACTURACION','DOCUMENTOS','ORDENAR ITEMS POR CODIGO DE ARTICULO') returning_values (:ORDENCOD);
EXECUTE PROCEDURE lee_configuracion ('FACTURACION','POS', 'IMPRIMIR DEVOLUCIONES DE ARTICULOS NEGATIVOS') returning_values (:imprdev);
totcajas = 0;
totbase = 0;
if (ORDENCOD = 'SI') then
    BEGIN
    FOR SELECT FADE_ITEM, D.ARTI_COD, FADE_CODBAR, SUBSTR(FADE_DESC,1,60), ARTI_DESCORTA, FADE_CANT, FADE_UNIDAD, FADE_FACTOR, BODE_COD, FADE_LOTE, LIPR_COD, FADE_PRUNIT, FADE_DTOPORC, FADE_DTOMONTO, FADE_IVAPORC, FADE_IVAMONTO, FADE_CONSUMO, FADE_TOTAL, FADE_REFERENCIA,
        GRUP_COD, SUBG_COD, MARC_COD, ARTI_PESO, ARTI_ANCHO, ARTI_ALTO, ARTI_LARGO, TAIV_COD, FADE_DEVUELTO, FADE_OBS, FADE_DTO1, FADE_DTO2, FADE_DTO3, FADE_DTOM1, FADE_DTOM2, FADE_DTOM3, FADE_CAJAS, FADE_BASE, FADE_PORCBASE
        FROM FACTURAS_DETALLE D, ARTICULO A
        WHERE D.ARTI_COD = A.ARTI_COD AND D.FACT_ID = :ID
        ORDER BY D.ARTI_COD
        INTO :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :DESCORTA, :CANT, :UNIDAD, :FACTOR, :BODITEM, :LOTE, :LISTAPR, :PRUNIT, :DTOITPORC, :DTOITMONTO, :IVAPORC, :IVAITMONTO, :CONSUMO, :TOTAL, :refitem,
        :GRUPO, :SUBGRUPO, :MARCA, :PESO, :ANCHO, :ALTO, :LARGO, :TARIFA, :devuelto, :obsitem, :dtoit1, :dtoit2, :dtoit3, :dtoitm1, :dtoitm2, :dtoitm3, :cajas, :base, :porcbase
        DO
          BEGIN
          if (ARTICULO = CODBAR) then
            SELECT FIRST 1 COBA_COD FROM barras_articulo WHERE ARTI_COD = :articulo INTO :CODBAR;
          if (IMPRDEV <> 'SI') then
            BEGIN
            if ((CANT >= 0) AND (DEVUELTO = 0)) then
                IMPR = 'S';
            ELSE
                IMPR = 'N'; /* ES DEVOLUCION */
            END
          ELSE
            IMPR = 'S';
          if (IMPR = 'S') then
            BEGIN
            prneto = PRUNIT - DTOITMONTO - dtoitm1 - dtoitm2 - dtoitm3;
            if (IMPTOS = 'S') then
                if (cant <> 0) then
                    prnetosiniva = PRUNIT - DTOITMONTO - ((IVAITMONTO+CONSUMO) / CANT) - dtoitm1 - dtoitm2 - dtoitm3;
                else
                    prnetosiniva = PRUNIT - DTOITMONTO - dtoitm1 - dtoitm2 - dtoitm3;
            ELSE
                prnetosiniva = PRUNIT - DTOITMONTO - dtoit1m - dtoit2m - dtoit3m;
            if (ICOINC = 'SI') then
                SUBTOTIT = TOTAL - IVAITMONTO;
            else
                SUBTOTIT = TOTAL - IVAITMONTO - CONSUMO;
            TOTCONSUMO = TOTCONSUMO + CONSUMO;
            TOTBASE = TOTBASE + BASE;
            SELECT LOTE_VENCE FROM LOTES WHERE LOTE_NRO = :lote AND ARTI_COD = :ARTICULO AND BODE_COD = :boditem INTO :vlote;
            if ((REFITEM <> '.t') or (REFITEM IS NULL)) then
                BEGIN
                /* NO SUME LOS ENSAMBLES */
                if (IVAPORC = 0) then
                    SUMAEX = SUMAEX + TOTAL;
                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;
                END
            if (ANCHO IS NULL) then
                ANCHO = 0;
            if (ALTO IS NULL) then
                ALTO = 0;
            if (LARGO IS NULL) then
                LARGO = 0;
            if (PESO IS NULL) then
                PESO = 0;
            PESO = (PESO / 1000) * CANT * FACTOR;
            PESOTOT = PESOTOT + PESO;
            totcajas = totcajas + cajas;
            if (substr(ARTICULO,1,2) = '.t') then
                BEGIN
                REFITEM = '';
                TOTAL = 0;
                SUBTOTIT = 0;
                END
            SELECT STAND_COD FROM STANDS WHERE ARTI_COD = :ARTICULO AND STAND_BODEGA = :boditem INTO :stand;
            factcant = NULL;
            SELECT FIRST 1 UNAR_FACCAN FROM unidad_articulo WHERE ARTI_COD = :articulo INTO :factcant;
            if (factcant IS NULL) then
                BEGIN
                ALTERNATIVAS = 0;
                PRINCIPALES = (CANT * FACTOR);
                END
            ELSE
                BEGIN
                ALTERNATIVAS = FLOOR(CANT * factor / factcant);
                PRINCIPALES = (CANT * FACTOR) - (alternativas * factcant);
                END
            SUSPEND;
            END
          END
    END
ELSE
  if (ORDENCOD = 'UNIDAD') then
    BEGIN
    FOR SELECT FADE_ITEM, D.ARTI_COD, FADE_CODBAR, SUBSTR(FADE_DESC,1,60), ARTI_DESCORTA, FADE_CANT, FADE_UNIDAD, FADE_FACTOR, BODE_COD, FADE_LOTE, LIPR_COD, FADE_PRUNIT, FADE_DTOPORC, FADE_DTOMONTO, FADE_IVAPORC, FADE_IVAMONTO, FADE_CONSUMO, FADE_TOTAL, FADE_REFERENCIA,
        GRUP_COD, SUBG_COD, MARC_COD, ARTI_PESO, ARTI_ANCHO, ARTI_ALTO, ARTI_LARGO, TAIV_COD, FADE_DEVUELTO, FADE_OBS, FADE_DTO1, FADE_DTO2, FADE_DTO3, FADE_DTOM1, FADE_DTOM2, FADE_DTOM3, FADE_CAJAS, FADE_BASE, FADE_PORCBASE
        FROM FACTURAS_DETALLE D, ARTICULO A
        WHERE D.ARTI_COD = A.ARTI_COD AND D.FACT_ID = :ID
        ORDER BY D.fade_unidad, D.fade_desc
        INTO :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :DESCORTA, :CANT, :UNIDAD, :FACTOR, :BODITEM, :LOTE, :LISTAPR, :PRUNIT, :DTOITPORC, :DTOITMONTO, :IVAPORC, :IVAITMONTO, :CONSUMO, :TOTAL, :refitem,
        :GRUPO, :SUBGRUPO, :MARCA, :PESO, :ANCHO, :ALTO, :LARGO, :TARIFA, :devuelto, :obsitem, :dtoit1, :dtoit2, :dtoit3, :dtoitm1, :dtoitm2, :dtoitm3, :cajas, :base, :porcbase
        DO
          BEGIN
          if (ARTICULO = CODBAR) then
            SELECT FIRST 1 COBA_COD FROM barras_articulo WHERE ARTI_COD = :articulo INTO :CODBAR;
          if (IMPRDEV <> 'SI') then
            BEGIN
            if ((CANT >= 0) AND (DEVUELTO = 0)) then
                IMPR = 'S';
            ELSE
                IMPR = 'N'; /* ES DEVOLUCION */
            END
          ELSE
            IMPR = 'S';
          if (IMPR = 'S') then
            BEGIN
            prneto = PRUNIT - DTOITMONTO - dtoitm1 - dtoitm2 - dtoitm3;
            if (IMPTOS = 'S') then
                if (cant <> 0) then
                    prnetosiniva = PRUNIT - DTOITMONTO - ((IVAITMONTO+CONSUMO) / CANT) - dtoitm1 - dtoitm2 - dtoitm3;
                else
                    prnetosiniva = PRUNIT - DTOITMONTO - dtoitm1 - dtoitm2 - dtoitm3;
            ELSE
                prnetosiniva = PRUNIT - DTOITMONTO - dtoit1m - dtoit2m - dtoit3m;
            if (ICOINC = 'SI') then
                SUBTOTIT = TOTAL - IVAITMONTO;
            else
                SUBTOTIT = TOTAL - IVAITMONTO - CONSUMO;
            TOTCONSUMO = TOTCONSUMO + CONSUMO;
            TOTBASE = TOTBASE + BASE;
            SELECT LOTE_VENCE FROM LOTES WHERE LOTE_NRO = :lote AND ARTI_COD = :ARTICULO AND BODE_COD = :boditem INTO :vlote;
            if ((REFITEM <> '.t') or (REFITEM IS NULL)) then
                BEGIN
                /* NO SUME LOS ENSAMBLES */
                if (IVAPORC = 0) then
                    SUMAEX = SUMAEX + TOTAL;
                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;
                END
            if (ANCHO IS NULL) then
                ANCHO = 0;
            if (ALTO IS NULL) then
                ALTO = 0;
            if (LARGO IS NULL) then
                LARGO = 0;
            if (PESO IS NULL) then
                PESO = 0;
            PESO = (PESO / 1000) * CANT * FACTOR;
            PESOTOT = PESOTOT + PESO;
            totcajas = totcajas + cajas;
            if (substr(ARTICULO,1,2) = '.t') then
                BEGIN
                REFITEM = '';
                TOTAL = 0;
                SUBTOTIT = 0;
                END
            SELECT STAND_COD FROM STANDS WHERE ARTI_COD = :ARTICULO AND STAND_BODEGA = :boditem INTO :stand;
            factcant = NULL;
            SELECT FIRST 1 UNAR_FACCAN FROM unidad_articulo WHERE ARTI_COD = :articulo INTO :factcant;
            if ((factcant IS NULL) or (factcant = 0)) then
                BEGIN
                ALTERNATIVAS = 0;
                PRINCIPALES = (CANT * FACTOR);
                END
            ELSE
                BEGIN
                ALTERNATIVAS = FLOOR(CANT * factor / factcant);
                PRINCIPALES = (CANT * FACTOR) - (alternativas * factcant);
                END
            SUSPEND;
            END
          END
    END
  ELSE
    BEGIN
    FOR SELECT FADE_ITEM, D.ARTI_COD, FADE_CODBAR, SUBSTR(FADE_DESC,1,60), ARTI_DESCORTA, FADE_CANT, FADE_UNIDAD, FADE_FACTOR, BODE_COD, FADE_LOTE, LIPR_COD, FADE_PRUNIT, FADE_DTOPORC, FADE_DTOMONTO, FADE_IVAPORC, FADE_IVAMONTO, FADE_CONSUMO, FADE_TOTAL, FADE_REFERENCIA,
        GRUP_COD, SUBG_COD, MARC_COD, ARTI_PESO, ARTI_ANCHO, ARTI_ALTO, ARTI_LARGO, TAIV_COD, FADE_DEVUELTO, FADE_OBS, FADE_DTO1, FADE_DTO2, FADE_DTO3, FADE_DTOM1, FADE_DTOM2, FADE_DTOM3, FADE_CAJAS, FADE_BASE, FADE_PORCBASE
        FROM FACTURAS_DETALLE D, ARTICULO A
        WHERE D.ARTI_COD = A.ARTI_COD AND D.FACT_ID = :ID
        ORDER BY FADE_ITEM
        INTO :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :DESCORTA, :CANT, :UNIDAD, :FACTOR, :BODITEM, :LOTE, :LISTAPR, :PRUNIT, :DTOITPORC, :DTOITMONTO, :IVAPORC, :IVAITMONTO, :CONSUMO, :TOTAL, :refitem,
        :GRUPO, :SUBGRUPO, :MARCA, :PESO, :ANCHO, :ALTO, :LARGO, :TARIFA, :devuelto, :obsitem, :dtoit1, :dtoit2, :dtoit3, :dtoitm1, :dtoitm2, :dtoitm3, :cajas, :base, :porcbase
        DO
          BEGIN
          if (IMPRDEV <> 'SI') then
            BEGIN
            if ((CANT >= 0) AND (DEVUELTO = 0)) then
                IMPR = 'S';
            ELSE
                IMPR = 'N'; /* ES DEVOLUCION */
            END
          ELSE
            IMPR = 'S';
          if (IMPR = 'S') then
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :GRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :MARCA INTO NOMMARCA;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :SUBGRUPO AND GRUP_COD = :GRUPO INTO :NOMSUBG;
            prneto = PRUNIT - DTOITMONTO - dtoitm1 - dtoitm2 - dtoitm3;
            if (IMPTOS = 'S') then
                if (cant <> 0) then
                    prnetosiniva = PRUNIT - DTOITMONTO - ((IVAITMONTO+CONSUMO) / CANT) - dtoit1m - dtoit2m - dtoit3m;
                else
                    prnetosiniva = PRUNIT - DTOITMONTO - dtoitm1 - dtoitm2 - dtoitm3;
            ELSE
                prnetosiniva = PRUNIT - DTOITMONTO - dtoitm1 - dtoitm2 - dtoitm3;
            if (ICOINC = 'SI') then
                SUBTOTIT = TOTAL - IVAITMONTO;
            else
                SUBTOTIT = TOTAL - IVAITMONTO - CONSUMO;
            TOTCONSUMO = TOTCONSUMO + CONSUMO;
            TOTBASE = TOTBASE + BASE;
            SELECT LOTE_VENCE FROM LOTES WHERE LOTE_NRO = :lote AND ARTI_COD = :ARTICULO AND BODE_COD = :boditem INTO :vlote;
            if ((REFITEM <> '.t') or (REFITEM IS NULL)) then
                BEGIN
                /* NO SUME LOS ENSAMBLES */
                if (IVAPORC = 0) then
                    SUMAEX = SUMAEX + TOTAL;
                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;
                END
            if (ANCHO IS NULL) then
                ANCHO = 0;
            if (ALTO IS NULL) then
                ALTO = 0;
            if (LARGO IS NULL) then
                LARGO = 0;
            if (PESO IS NULL) then
                PESO = 0;
            PESO = (PESO / 1000)* CANT * FACTOR;
            PESOTOT = PESOTOT + PESO;
            totcajas = totcajas + cajas;
            if (substr(ARTICULO,1,2) = '.t') then
                BEGIN
                REFITEM = '';
                TOTAL = 0;
                SUBTOTIT = 0;
                END
            SELECT STAND_COD FROM STANDS WHERE ARTI_COD = :ARTICULO AND STAND_BODEGA = :boditem INTO :stand;
            factcant = NULL;
            SELECT FIRST 1 UNAR_FACCAN FROM unidad_articulo WHERE ARTI_COD = :articulo INTO :factcant;
            if ((factcant IS NULL) or (factcant = 0)) then
                BEGIN
                ALTERNATIVAS = 0;
                PRINCIPALES = (CANT * FACTOR);
                END
            ELSE
                BEGIN
                ALTERNATIVAS = FLOOR(CANT * factor / factcant);
                PRINCIPALES = (CANT * FACTOR) - (alternativas * factcant);
                END
            SUSPEND;
            END
          END
    END
END
^

SET TERM ; ^


SET TERM ^ ;

CREATE OR ALTER procedure IMPR_DEVOLUCION (
    ID integer)
returns (
    PREF varchar(4),
    NUMERO varchar(6),
    FECHA date,
    NIT varchar(20),
    NOMTERCERO varchar(60),
    VENDEDOR integer,
    NOMVENDEDOR varchar(60),
    PUNTOVTA integer,
    NOMPUNTOVTA varchar(30),
    CODBODEGA varchar(2),
    NOMBODEGA varchar(30),
    FACTURA varchar(30),
    REMISION varchar(10),
    COMIPORC numeric(9,2),
    COMIMONTO numeric(18,2),
    SUBTOTAL numeric(18,2),
    DTOPORC numeric(9,2),
    DTOMONTO numeric(18,2),
    ADICIONAL numeric(18,2),
    IVAMONTO numeric(18,2),
    DEC2799 numeric(18,2),
    RTEFTEPORC numeric(9,2),
    RTEFTEMONTO numeric(18,2),
    RTEIVAPORC numeric(9,2),
    RTEIVAMONTO numeric(18,2),
    RTEICAPORC numeric(9,2),
    RTEICAMONTO numeric(18,2),
    EXTRA numeric(18,2),
    TOTALFAC numeric(18,2),
    TOTALPAGAR numeric(18,2),
    PESOTOT numeric(18,2),
    OBS blob sub_type 1 segment size 80,
    ITEM integer,
    ARTICULO varchar(15),
    CODBAR varchar(15),
    ARTIDES varchar(60),
    CANT numeric(18,4),
    LOTE varchar(15),
    UNIDAD varchar(8),
    FACTOR numeric(18,4),
    REFITEM varchar(60),
    BODITEM varchar(2),
    PRUNIT numeric(18,2),
    DTOITPORC numeric(9,2),
    DTOITMONTO numeric(18,2),
    PRNETO numeric(18,2),
    PRNETOSINIVA numeric(18,2),
    IVAPORC numeric(9,2),
    IVAITMONTO numeric(18,2),
    CONSUMO numeric(18,2),
    SUBTOTIT numeric(18,2),
    TOTAL numeric(18,2),
    CODIGOCL varchar(20),
    ZONACOD varchar(2),
    ZONANOM varchar(60),
    DV char(1),
    DIRECCION varchar(60),
    CIUDAD varchar(40),
    TELEFONO varchar(40),
    CONTACTO varchar(60),
    FAX varchar(25),
    CEL varchar(25),
    GRUPO varchar(2),
    NOMGRUPO varchar(30),
    SUBGRUPO varchar(3),
    NOMSUBG varchar(30),
    MARCA varchar(3),
    NOMMARCA varchar(30),
    PESO numeric(9,4),
    ANCHO numeric(18,4),
    ALTO numeric(18,4),
    LARGO numeric(18,4),
    SUMA1 numeric(18,2),
    SUMA2 numeric(18,2),
    SUMA3 numeric(18,2),
    IVA1 numeric(18,2),
    IVA2 numeric(18,2),
    IVA3 numeric(18,2),
    TOTCONSUMO numeric(18,2),
    SUMAEX numeric(18,2),
    SUMAGR numeric(18,2),
    OBSITEM blob sub_type 1 segment size 80,
    ALTERNATIVAS numeric(18,4),
    PRINCIPALES numeric(18,4))
AS
DECLARE VARIABLE IMPTOS CHAR(1);
DECLARE VARIABLE TARIFA INTEGER;
declare variable ORDENCOD CHAR(8);
declare variable SUCUR VARCHAR(10);
declare variable PUNTOS NUMERIC(18,4);
declare variable ICOINC CHAR(2);
declare variable FACTCANT NUMERIC(18,4);
declare variable ANULADO CHAR(1);
BEGIN
execute procedure lee_configuracion('FACTURACION', 'ARTICULOS', 'IMPOCONSUMO INCLUIDO EN EL PRECIO BASE DE VENTA ANTES DE IVA') returning_values (icoinc);
SELECT F.PREF_PRE, DEVT_NUMERO, DEVT_FECHA, F.BODE_COD, BODE_NOM, F.TERC_NIT, DEVT_NOMTERC, F.VEND_COD, VEND_NOMBRE, F.PTVT_ID, PTVT_NOM,
    DEVT_FACTURA, DEVT_COMIPORC, DEVT_COMIMONTO, DEVT_IVAINC, DEVT_DTOPOR, DEVT_DTOMONTO, DEVT_ADICIONAL, DEVT_IVAMONTO, DEVT_DEC2799,
    DEVT_RTFTEPORC, DEVT_RTFTEMONTO, DEVT_RTIVAPORC, DEVT_RTIVAMONTO, DEVT_RTICAPORC, DEVT_RTICAMONTO, DEVT_EXTRA, DEVT_TOTAL,
    TERC_CONTACTO, TERC_FAX, TERC_DV, TERC_CEL, DEVT_OBS, DEVT_SUCURSAL, DEVT_REMISION, DEVT_ANULADO
    FROM DEVOLUCIONES_VENTAS F, BODEGA B, VENDEDORES V, PUNTO_VENTA P, TERCEROS T
    WHERE F.BODE_COD = B.BODE_COD AND F.VEND_COD = V.VEND_COD AND F.PTVT_ID = P.PTVT_ID AND F.TERC_NIT = T.TERC_NIT AND F.DEVT_ID = :ID
    into :PREF, :NUMERO, :FECHA, :CODBODEGA, :NOMBODEGA, :NIT, :NOMTERCERO, :VENDEDOR, :NOMVENDEDOR, :PUNTOVTA, :NOMPUNTOVTA,
    :FACTURA, :COMIPORC, :COMIMONTO, :IMPTOS, :DTOPORC, :DTOMONTO, :ADICIONAL, :IVAMONTO, :dec2799,
    :RTEFTEPORC, :RTEFTEMONTO, :RTEIVAPORC, :RTEIVAMONTO, :RTEICAPORC, :RTEICAMONTO, :EXTRA, :TOTALFAC,
    :CONTACTO, :FAX, :DV, :CEL, :OBS, :SUCUR, :REMISION, :ANULADO;
SUBTOTAL = TOTALFAC - EXTRA - IVAMONTO - ADICIONAL + DTOMONTO + dec2799;
TOTALPAGAR = TOTALFAC - RTEFTEMONTO - RTEIVAMONTO - RTEICAMONTO;
if (ANULADO = 'N') then
    EXECUTE PROCEDURE acumula_puntos_cliente (33, :id, :nit, :fecha) returning_values (:PUNTOS);
SELECT CLIE_COD, C.ZONA_COD, ZONA_NOM
    FROM CLIENTES C, ZONAS Z
    WHERE TERC_NIT = :NIT AND C.ZONA_COD = Z.ZONA_COD
    INTO :CODIGOCL, :ZONACOD, :ZONANOM;
SELECT CLSU_DIR, CLSU_CIUDAD, CLSU_TEL FROM CLIENTE_SUCURSALES WHERE TERC_NIT = :NIT AND CLCU_COD = :SUCUR
    INTO :DIRECCION, :CIUDAD, :TELEFONO;
    
SUMAEX = 0;
SUMA1 = 0;
SUMA2 = 0;
SUMA3 = 0;
IVA1 = 0;
IVA2 = 0;
IVA3 = 0;
TOTCONSUMO = 0;
ITEM = 0;
EXECUTE PROCEDURE lee_configuracion ('FACTURACION','DOCUMENTOS','ORDENAR ITEMS POR CODIGO DE ARTICULO') returning_values (:ORDENCOD);
if (ORDENCOD = 'SI') then
    BEGIN
    FOR SELECT D.ARTI_COD, DVDE_CODBAR, SUBSTR(DVDE_DESC,1,60), DVDE_CANT, DVDE_UNIDAD, BODE_COD, DVDE_LOTE, DVDE_PRUNIT, DVDE_DTOPORC, DVDE_DTOMONTO, DVDE_IVAPORC, DVDE_IVAMONTO, DVDE_CONSUMO, DVDE_TOTAL, DVDE_REFERENCIA,
        GRUP_COD, SUBG_COD, MARC_COD, ARTI_PESO, ARTI_ANCHO, ARTI_ALTO, ARTI_LARGO, TAIV_COD, DVDE_OBS, DVDE_FACTOR
        FROM DEVOLUCIONES_VENTAS_DETALLE D, ARTICULO A
        WHERE D.ARTI_COD = A.ARTI_COD AND D.DEVT_ID = :ID
        ORDER BY DVDE_CODBAR
        INTO :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :BODITEM, :LOTE, :PRUNIT, :DTOITPORC, :DTOITMONTO, :IVAPORC, :IVAITMONTO, :CONSUMO, :TOTAL, :REFITEM,
        :GRUPO, :SUBGRUPO, :MARCA, :PESO, :ANCHO, :ALTO, :LARGO, :TARIFA, :obsitem, :FACTOR
        DO
        BEGIN
        if (ARTICULO = CODBAR) then
            SELECT FIRST 1 COBA_COD FROM barras_articulo WHERE ARTI_COD = :articulo INTO :CODBAR;
        ITEM = ITEM + 1;
        if (ICOINC = 'SI') then
            SUBTOTIT = TOTAL - IVAITMONTO;
        else
            SUBTOTIT = TOTAL - IVAITMONTO - CONSUMO;
        PRNETO = PRUNIT - DTOITMONTO;
        if (PESO IS NULL) then
            PESO = 0;
        PESO = PESO / 1000 * CANT * FACTOR;
        PESOTOT = PESOTOT + PESO;
        if (IMPTOS = 'S') then
            if (cant <> 0) then
                prnetosiniva = PRUNIT - DTOITMONTO - ((IVAITMONTO+CONSUMO) / CANT);
            else
                prnetosiniva = PRUNIT - DTOITMONTO;
        ELSE
            prnetosiniva = PRUNIT - DTOITMONTO;
        TOTCONSUMO = TOTCONSUMO + CONSUMO;
        if ((REFITEM <> '.t') or (REFITEM IS NULL)) then
            BEGIN
            /* NO SUME LOS ENSAMBLES */
            if (IVAPORC = 0) then
                SUMAEX = SUMAEX + TOTAL;
            if (TARIFA = 1) then
                BEGIN
                SUMA1 = SUMA1 + TOTAL - IVAITMONTO;
                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;
            END
        if (substr(ARTICULO,1,2) = '.t') then
            BEGIN
            REFITEM = '';
            TOTAL = 0;
            END
        factcant = NULL;
        SELECT FIRST 1 UNAR_FACCAN FROM unidad_articulo WHERE ARTI_COD = :articulo INTO :factcant;
        if (factcant IS NULL) then
            factcant = 1;
        if ((factcant = 1) or (factcant = 0)) then
            BEGIN
            ALTERNATIVAS = 0;
            PRINCIPALES = (CANT * FACTOR);
            END
        ELSE
            BEGIN
            ALTERNATIVAS = FLOOR(CANT * factor / factcant);
            PRINCIPALES = (CANT * FACTOR) - (alternativas * factcant);
            END
        SUSPEND;
        END
    END
ELSE
  if (ORDENCOD = 'UNIDAD') then
    BEGIN
    FOR SELECT D.ARTI_COD, DVDE_CODBAR, SUBSTR(DVDE_DESC,1,60), DVDE_CANT, DVDE_UNIDAD, BODE_COD, DVDE_LOTE, DVDE_PRUNIT, DVDE_DTOPORC, DVDE_DTOMONTO, DVDE_IVAPORC, DVDE_IVAMONTO, DVDE_CONSUMO, DVDE_TOTAL, DVDE_REFERENCIA,
        GRUP_COD, SUBG_COD, MARC_COD, ARTI_PESO, ARTI_ANCHO, ARTI_ALTO, ARTI_LARGO, TAIV_COD, DVDE_OBS, DVDE_FACTOR
        FROM DEVOLUCIONES_VENTAS_DETALLE D, ARTICULO A
        WHERE D.ARTI_COD = A.ARTI_COD AND D.DEVT_ID = :ID
        ORDER BY D.dvde_unidad, D.dvde_desc
        INTO :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :BODITEM, :LOTE, :PRUNIT, :DTOITPORC, :DTOITMONTO, :IVAPORC, :IVAITMONTO, :CONSUMO, :TOTAL, :REFITEM,
        :GRUPO, :SUBGRUPO, :MARCA, :PESO, :ANCHO, :ALTO, :LARGO, :TARIFA, :obsitem, :FACTOR
        DO
        BEGIN
        if (ARTICULO = CODBAR) then
            SELECT FIRST 1 COBA_COD FROM barras_articulo WHERE ARTI_COD = :articulo INTO :CODBAR;
        ITEM = ITEM + 1;
        if (ICOINC = 'SI') then
            SUBTOTIT = TOTAL - IVAITMONTO;
        else
            SUBTOTIT = TOTAL - IVAITMONTO - CONSUMO;
        PRNETO = PRUNIT - DTOITMONTO;
        if (PESO IS NULL) then
            PESO = 0;
        PESO = PESO / 1000 * CANT * FACTOR;
        PESOTOT = PESOTOT + PESO;
        if (IMPTOS = 'S') then
            if (cant <> 0) then
                prnetosiniva = PRUNIT - DTOITMONTO - ((IVAITMONTO+CONSUMO) / CANT);
            else
                prnetosiniva = PRUNIT - DTOITMONTO;
        ELSE
            prnetosiniva = PRUNIT - DTOITMONTO;
        TOTCONSUMO = TOTCONSUMO + CONSUMO;
        if ((REFITEM <> '.t') or (REFITEM IS NULL)) then
            BEGIN
            /* NO SUME LOS ENSAMBLES */
            if (IVAPORC = 0) then
                SUMAEX = SUMAEX + TOTAL;
            if (TARIFA = 1) then
                BEGIN
                SUMA1 = SUMA1 + TOTAL - IVAITMONTO;
                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;
            END
        if (substr(ARTICULO,1,2) = '.t') then
            BEGIN
            REFITEM = '';
            TOTAL = 0;
            END
        factcant = NULL;
        SELECT FIRST 1 UNAR_FACCAN FROM unidad_articulo WHERE ARTI_COD = :articulo INTO :factcant;
        if (factcant IS NULL) then
            factcant = 1;
        if ((factcant = 1) or (factcant = 0)) then
            BEGIN
            ALTERNATIVAS = 0;
            PRINCIPALES = (CANT * FACTOR);
            END
        ELSE
            BEGIN
            ALTERNATIVAS = FLOOR(CANT * factor / factcant);
            PRINCIPALES = (CANT * FACTOR) - (alternativas * factcant);
            END
        SUSPEND;
        END
    END
  ELSE
    BEGIN
    FOR SELECT D.ARTI_COD, DVDE_CODBAR, SUBSTR(DVDE_DESC,1,60), DVDE_CANT, DVDE_UNIDAD, BODE_COD, DVDE_LOTE, DVDE_PRUNIT, DVDE_DTOPORC, DVDE_DTOMONTO, DVDE_IVAPORC, DVDE_IVAMONTO, DVDE_CONSUMO, DVDE_TOTAL, DVDE_REFERENCIA,
        GRUP_COD, SUBG_COD, MARC_COD, ARTI_PESO, ARTI_ANCHO, ARTI_ALTO, ARTI_LARGO, TAIV_COD, DVDE_OBS, DVDE_FACTOR
        FROM DEVOLUCIONES_VENTAS_DETALLE D, ARTICULO A
        WHERE D.ARTI_COD = A.ARTI_COD AND D.DEVT_ID = :ID
        ORDER BY DVDE_ITEM
        INTO :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :BODITEM, :LOTE, :PRUNIT, :DTOITPORC, :DTOITMONTO, :IVAPORC, :IVAITMONTO, :CONSUMO, :TOTAL, :REFITEM,
        :GRUPO, :SUBGRUPO, :MARCA, :PESO, :ANCHO, :ALTO, :LARGO, :TARIFA, :obsitem, :FACTOR
        DO
        BEGIN
        if (ARTICULO = CODBAR) then
            SELECT FIRST 1 COBA_COD FROM barras_articulo WHERE ARTI_COD = :articulo INTO :CODBAR;
        SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :GRUPO INTO NOMGRUPO;
        SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :MARCA INTO NOMMARCA;
        SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :SUBGRUPO AND GRUP_COD = :GRUPO INTO :NOMSUBG;
        ITEM = ITEM + 1;
        if (ICOINC = 'SI') then
            SUBTOTIT = TOTAL - IVAITMONTO;
        else
            SUBTOTIT = TOTAL - IVAITMONTO - CONSUMO;
        PRNETO = PRUNIT - DTOITMONTO;
        if (PESO IS NULL) then
            PESO = 0;
        PESO = PESO / 1000 * CANT * FACTOR;
        PESOTOT = PESOTOT + PESO;
        if (IMPTOS = 'S') then
            if (cant <> 0) then
                prnetosiniva = PRUNIT - DTOITMONTO - ((IVAITMONTO+CONSUMO) / CANT);
            else
                prnetosiniva = PRUNIT - DTOITMONTO;
        ELSE
            prnetosiniva = PRUNIT - DTOITMONTO;
        TOTCONSUMO = TOTCONSUMO + CONSUMO;
        if ((REFITEM <> '.t') or (REFITEM IS NULL)) then
            BEGIN
            /* NO SUME LOS ENSAMBLES */
            if (IVAPORC = 0) then
                SUMAEX = SUMAEX + TOTAL;
            if (TARIFA = 1) then
                BEGIN
                SUMA1 = SUMA1 + TOTAL - IVAITMONTO;
                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;
            END
        if (substr(ARTICULO,1,2) = '.t') then
            BEGIN
            REFITEM = '';
            TOTAL = 0;
            END
        factcant = NULL;
        SELECT FIRST 1 UNAR_FACCAN FROM unidad_articulo WHERE ARTI_COD = :articulo INTO :factcant;
        if (factcant IS NULL) then
            factcant = 1;
        if ((factcant = 1) or (factcant = 0)) then
            BEGIN
            ALTERNATIVAS = 0;
            PRINCIPALES = (CANT * FACTOR);
            END
        ELSE
            BEGIN
            ALTERNATIVAS = FLOOR(CANT * factor / factcant);
            PRINCIPALES = (CANT * FACTOR) - (alternativas * factcant);
            END
        SUSPEND;
        END
    END
END
^

SET TERM ; ^

/* 20100810 */
/* TABLA DE FACTORES POR COSTO */
CREATE TABLE FACTOR_COSTO (
    FACO_FECINI DATE NOT NULL,
    FACO_FECFIN DATE NOT NULL,
    FACO_FACTOR NUMERIC(9,4));
alter table FACTOR_COSTO add constraint PK_FACTOR_COSTO primary key (FACO_FECINI);

grant select, delete, insert, update on factor_costo to PUBLIC;

SET TERM ^ ;

CREATE OR ALTER procedure REP_UTILIDAD_VENTAS (
    TIPO integer,
    DETALLE char(1),
    FECINI date,
    FECFIN date,
    ARTINI varchar(15),
    ARTFIN varchar(15),
    GRPINI varchar(3),
    GRPFIN varchar(3),
    ORDEN char(1),
    AGRUPA char(1),
    ULTIMO char(1),
    CEROS char(1),
    SUBEMPRESA integer)
returns (
    ARTICULO varchar(15),
    DESCRIPCION varchar(60),
    CODGRUPO varchar(2),
    NOMGRUPO varchar(30),
    CODSUBG varchar(3),
    NOMSUBG varchar(30),
    CODMARC varchar(3),
    NOMMARC varchar(30),
    UNIDAD varchar(8),
    CANTIDAD numeric(18,4),
    BASE numeric(18,4),
    COSTO numeric(18,4),
    UTILIDAD numeric(18,4),
    PORC numeric(9,2),
    IVA numeric(18,4),
    IVAPOR numeric(9,2),
    CONSUMO numeric(18,4),
    PREFIJO varchar(4),
    NUMERO varchar(6),
    FECHA date,
    TIPODOC integer,
    PART float)
AS
DECLARE VARIABLE COSTOUNIT NUMERIC(18,4);
DECLARE VARIABLE CANTDET NUMERIC(18,4);
DECLARE VARIABLE TOTAL NUMERIC(18,2);
declare variable CODINI VARCHAR(15);
declare variable CODFIN VARCHAR(15);
declare variable DESINI VARCHAR(15);
declare variable DESFIN VARCHAR(15);
declare variable MARINI VARCHAR(3);
declare variable MARFIN VARCHAR(3);
declare variable UOM VARCHAR(20);
declare variable ULTCOS NUMERIC(18,2);
declare variable FACCOST NUMERIC(18,4);
declare variable IDREP INTEGER;
declare variable ID integer;
declare variable ITEM integer;
BEGIN
if (ORDEN = 'C') then
    BEGIN
    CODINI = ARTINI;
    CODFIN = ARTFIN;
    DESINI = '';
    DESFIN = 'zz';
    END
ELSE
    BEGIN
    DESINI = ARTINI;
    DESFIN = ARTFIN;
    CODINI = '';
    CODFIN = 'zz';
    END
if (AGRUPA = 'G') then
    BEGIN
    MARINI = '';
    MARFIN = 'zz';
    END
ELSE
    if (AGRUPA = 'M') then
        BEGIN
        MARINI = GRPINI;
        MARFIN = GRPFIN;
        GRPINI = '';
        GRPFIN = 'zz';
        END
    ELSE
        BEGIN
        MARINI = '';
        MARFIN = 'zz';
        GRPINI = '';
        GRPFIN = 'zz';
        END
EXECUTE PROCEDURE lee_configuracion ('FACTURACION', 'ARTICULOS', 'SUGERIR PRECIOS CON PORCENTAJE DE MARGEN O UTILIDAD') returning_values (:UOM);
IDREP = GEN_ID(id_reputilidad, 1);
if (DETALLE = 'N') then
    BEGIN
    if (BIN_AND(TIPO, 1) <> 0) then
        BEGIN
        TIPODOC = 31;
        FOR SELECT MAX(D.ARTI_COD), SUM(FADE_CANT * FADE_FACTOR), SUM((FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO)*FACT_FACTOR), SUM(FADE_IVAMONTO*FACT_FACTOR), SUM(FADE_CONSUMO)
            FROM FACTURAS_DETALLE D, FACTURAS F, PREFIJOS P, ARTICULO A
            WHERE F.FACT_ID = D.FACT_ID AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND D.ARTI_COD = A.arti_cod AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            FACT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) and substring(a.arti_cod from 1 FOR 2) <> '.t'
            GROUP BY D.ARTI_COD
            INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO
            DO
            BEGIN
            COSTO = 0;
            FOR SELECT FADE_CANT * FADE_FACTOR, FACT_FECHA, F.FACT_ID, FADE_ITEM FROM FACTURAS_DETALLE D, FACTURAS F, PREFIJOS P
                WHERE F.FACT_ID = D.FACT_ID AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND
                FACT_ANULADO = 'N' AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                and D.ARTI_COD = :articulo  INTO :cantdet, :fecha, :id, :item
                DO
                BEGIN
                if (EXISTS (SELECT COST_SALP / COST_SALC FROM COSTOS C, MOVIMIENTO_ARTICULO M
                    WHERE C.arti_cod = M.arti_cod AND COST_IDMOV = MVAR_CONS AND MVAR_TIPODOC = 31 AND MVAR_IDREF = :ID AND COST_SALC <> 0 AND MVAR_ITEM = :ITEM)) then
                    SELECT COST_SALP / COST_SALC, COST_ULTIMO FROM COSTOS C, MOVIMIENTO_ARTICULO M
                    WHERE C.arti_cod = M.arti_cod AND COST_IDMOV = MVAR_CONS AND MVAR_TIPODOC = 31 AND MVAR_IDREF = :ID AND COST_SALC <> 0 AND MVAR_ITEM = :ITEM INTO :costounit, :ultcos;
                else
                    EXECUTE PROCEDURE costo_promedio_y_ultimo(:ARTICULO, :FECHA) returning_values (:costounit, :ultcos);

                /* EL FACTOR */
                FACCOST = 1;
                SELECT FIRST 1 FACO_FACTOR FROM factor_costo WHERE FACO_FECINI <= :FECHA AND FACO_FECFIN >= :FECHA INTO :FACCOST;
                ULTCOS = ULTCOS * FACCOST;
                COSTOUNIT = COSTOUNIT * FACCOST;

                if (ULTIMO = 'S') then
                    COSTO = COSTO + ultcos * cantdet;
                else
                    COSTO = COSTO + costounit * cantdet;
                END
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            INSERT INTO REP_UTILIDAD(ID, TIPO, CODIGO, BASE, IVA, CONSUMO, COSTO) VALUES (:IDREP, 31, :articulo, :base, :iva, :consumo, :costo);
            if (CEROS = 'S') then
                INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (2, USER, :ARTICULO);
            END /* FOR */
        SELECT SUM(BASE-COSTO) FROM REP_UTILIDAD WHERE id = :IDREP AND TIPO = 31 INTO :TOTAL;
        FOR SELECT ARTI_COD, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD, TAIV_PORC FROM ARTICULO A, TARIFA_IVA T
            WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND
            (A.MARC_COD <= :MARFIN))) AND substring(a.arti_cod from 1 FOR 2) <> '.t' AND A.taiv_cod = T.taiv_cod
            INTO :ARTICULO, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :ivapor
            DO
            BEGIN
            EXECUTE procedure nombres_grupos_inventario (CODGRUPO, CODSUBG, CODMARC)
                returning_values (NOMGRUPO, NOMSUBG, NOMMARC);
            BASE = 0;
            IVA = 0;
            CONSUMO = 0;
            COSTO = 0;
            UTILIDAD = 0;
            PORC = 0;
            PART = 0;
            SELECT BASE, IVA, CONSUMO, COSTO FROM rep_utilidad WHERE ID = :IDREP AND TIPO = 31 AND CODIGO = :articulo INTO :BASE, :IVA, :consumo,  :costo;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            EXECUTE PROCEDURE PORCENTAJE (utilidad,  TOTAL, 'S') returning_values (part);
            if ((CEROS = 'S') or (BASE <> 0) or (COSTO <> 0)) then
                SUSPEND;
            END /* FOR */
            BEGIN
            COSTO = 0;
            END
        END
    if (BIN_AND(TIPO, 2) <> 0) then
        BEGIN
        TIPODOC = 32;
        FOR SELECT MAX(D.ARTI_COD), SUM(RVDE_CANT * RVDE_FACTOR), SUM(RVDE_TOTAL-RVDE_IVAMONTO-RVDE_CONSUMO), SUM(RVDE_IVAMONTO), SUM(RVDE_CONSUMO)
            FROM REMISIONES_VENTA_DETALLE D, REMISIONES_VENTA R, PREFIJOS P, ARTICULO A
            WHERE R.REVT_ID = D.REVT_ID AND P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = 32 AND D.ARTI_COD = A.arti_cod AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            REVT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY D.ARTI_COD
            INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO
            DO
            BEGIN
            COSTO = 0;
            FOR SELECT RVDE_CANT * RVDE_FACTOR, REVT_FECHA, F.REVT_ID, RVDE_ITEM FROM remisiones_venta_detalle D, remisiones_venta F, PREFIJOS P
                WHERE F.revt_id = D.revt_id AND REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN AND
                REVT_ANULADO = 'N' AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 32 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                and D.ARTI_COD = :articulo  INTO :cantdet, :fecha, :id, :item
                DO
                BEGIN
                if (EXISTS (SELECT COST_SALP / COST_SALC FROM COSTOS C, MOVIMIENTO_ARTICULO M
                    WHERE C.arti_cod = M.arti_cod AND COST_IDMOV = MVAR_CONS AND MVAR_TIPODOC = 32 AND MVAR_IDREF = :ID AND COST_SALC <> 0 AND MVAR_ITEM = :ITEM)) then
                    SELECT COST_SALP / COST_SALC, cost_ultimo FROM COSTOS C, MOVIMIENTO_ARTICULO M
                    WHERE C.arti_cod = M.arti_cod AND COST_IDMOV = MVAR_CONS AND MVAR_TIPODOC = 32 AND MVAR_IDREF = :ID AND COST_SALC <> 0 AND MVAR_ITEM = :ITEM INTO :costounit, :ultcos;
                else
                    EXECUTE PROCEDURE costo_promedio_y_ultimo(:ARTICULO, :FECHA) returning_values (:costounit, :ultcos);
                /* EL FACTOR */
                FACCOST = 1;
                SELECT FIRST 1 FACO_FACTOR FROM factor_costo WHERE FACO_FECINI <= :FECHA AND FACO_FECFIN >= :FECHA INTO :FACCOST;
                ULTCOS = ULTCOS * FACCOST;
                COSTOUNIT = COSTOUNIT * FACCOST;

                if (ULTIMO = 'S') then
                    COSTO = COSTO + ultcos * cantdet;
                else
                    COSTO = COSTO + costounit * cantdet;
                END
            EXECUTE procedure nombres_grupos_inventario (CODGRUPO, CODSUBG, CODMARC)
                returning_values (NOMGRUPO, NOMSUBG, NOMMARC);
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            if (CEROS = 'S') then
                INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (2, USER, :ARTICULO);
            INSERT INTO REP_UTILIDAD(ID, TIPO, CODIGO, BASE, IVA, CONSUMO, COSTO) VALUES (:IDREP, 32, :articulo, :base, :iva, :consumo, :costo);
            END /* FOR */
        SELECT SUM(BASE-COSTO) FROM REP_UTILIDAD WHERE id = :IDREP AND TIPO = 32 INTO :TOTAL;
        FOR SELECT ARTI_COD, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD, TAIV_PORC FROM ARTICULO A, TARIFA_IVA T
            WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND
            (A.MARC_COD <= :MARFIN))) AND substring(a.arti_cod from 1 FOR 2) <> '.t' AND A.taiv_cod = T.taiv_cod
            INTO :ARTICULO, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :ivapor
            DO
            BEGIN
            EXECUTE procedure nombres_grupos_inventario (CODGRUPO, CODSUBG, CODMARC)
                returning_values (NOMGRUPO, NOMSUBG, NOMMARC);
            BASE = 0;
            IVA = 0;
            CONSUMO = 0;
            COSTO = 0;
            UTILIDAD = 0;
            PORC = 0;
            SELECT BASE, IVA, CONSUMO, COSTO FROM rep_utilidad WHERE ID = :IDREP AND TIPO = 32 AND CODIGO = :articulo INTO :BASE, :IVA, :consumo,  :costo;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            EXECUTE PROCEDURE PORCENTAJE (utilidad,  TOTAL, 'S') returning_values (part);
            if ((CEROS = 'S') or (BASE <> 0) or (COSTO <> 0)) then
                SUSPEND;
            END /* FOR */
        END
    if (BIN_AND(TIPO, 4) <> 0) then
        BEGIN
        TIPODOC = 33;
        FOR SELECT MAX(D.ARTI_COD), SUM(DVDE_CANT * DVDE_FACTOR), SUM((DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO)*DEVT_FACTOR), SUM(DVDE_IVAMONTO*DEVT_FACTOR), SUM(DVDE_CONSUMO)
            FROM devoluciones_ventas_detalle D, DEVOLUCIONES_VENTAS V, PREFIJOS P, ARTICULO A
            WHERE V.DEVT_ID = D.DEVT_ID AND P.PREF_PRE = V.PREF_PRE AND P.TIDO_COD = 33 AND D.ARTI_COD = A.arti_cod AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            DEVT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY D.ARTI_COD
            INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO
            DO
            BEGIN
            COSTO = 0;
            FOR SELECT DVDE_CANT * DVDE_FACTOR, DEVT_FECHA, F.DEVT_ID, DVDE_ITEM FROM devoluciones_ventas_detalle D, devoluciones_ventas F, PREFIJOS P
                WHERE F.devt_id = D.devt_id AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND
                DEVT_ANULADO = 'N' AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 33 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                and D.ARTI_COD = :articulo  INTO :cantdet, :fecha, :id, :item
                DO
                BEGIN
                if (EXISTS (SELECT COST_ENTP / COST_ENTC FROM COSTOS C, MOVIMIENTO_ARTICULO M
                    WHERE C.arti_cod = M.arti_cod AND COST_IDMOV = MVAR_CONS AND MVAR_TIPODOC = 33 AND MVAR_IDREF = :ID AND COST_ENTC <> 0 AND MVAR_ITEM = :ITEM)) then
                    SELECT COST_ENTP / COST_ENTC, COST_ULTIMO FROM COSTOS C, MOVIMIENTO_ARTICULO M
                        WHERE C.arti_cod = M.arti_cod AND COST_IDMOV = MVAR_CONS AND MVAR_TIPODOC = 33 AND MVAR_IDREF = :ID AND COST_ENTC <> 0 AND MVAR_ITEM = :ITEM INTO :costounit, :ultcos;
                else
                    EXECUTE PROCEDURE costo_promedio_y_ultimo(:ARTICULO, :FECHA) returning_values (:costounit, :ultcos);
                /* EL FACTOR */
                FACCOST = 1;
                SELECT FIRST 1 FACO_FACTOR FROM factor_costo WHERE FACO_FECINI <= :FECHA AND FACO_FECFIN >= :FECHA INTO :FACCOST;
                ULTCOS = ULTCOS * FACCOST;
                COSTOUNIT = COSTOUNIT * FACCOST;

                if (ULTIMO = 'S') then
                    COSTO = COSTO + ultcos * cantdet;
                else
                    COSTO = COSTO + costounit * cantdet;
                END
            EXECUTE procedure nombres_grupos_inventario (CODGRUPO, CODSUBG, CODMARC)
                returning_values (NOMGRUPO, NOMSUBG, NOMMARC);
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            else
                CANTIDAD = CANTIDAD * -1;
            if (BASE IS NULL) then
                BASE = 0;
            else
                BASE = BASE * -1;
            if (IVA IS NULL) then
                IVA = 0;
            else
                IVA = IVA * -1;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            else
                CONSUMO = CONSUMO * -1;
            COSTO = costo * -1;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            if (CEROS = 'S') then
                INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (2, USER, :ARTICULO);
            INSERT INTO REP_UTILIDAD(ID, TIPO, CODIGO, BASE, IVA, CONSUMO, COSTO) VALUES (:IDREP, 33, :articulo, :base, :iva, :consumo, :costo);
            END /* FOR */
        SELECT SUM(BASE-COSTO) FROM REP_UTILIDAD WHERE id = :IDREP AND TIPO = 33 INTO :TOTAL;
        FOR SELECT ARTI_COD, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD, TAIV_PORC FROM ARTICULO A, TARIFA_IVA T
            WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND
            (A.MARC_COD <= :MARFIN))) AND substring(a.arti_cod from 1 FOR 2) <> '.t' AND A.taiv_cod = T.taiv_cod
            INTO :ARTICULO, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :ivapor
            DO
            BEGIN
            EXECUTE procedure nombres_grupos_inventario (CODGRUPO, CODSUBG, CODMARC)
                returning_values (NOMGRUPO, NOMSUBG, NOMMARC);
            BASE = 0;
            IVA = 0;
            CONSUMO = 0;
            COSTO = 0;
            UTILIDAD = 0;
            PORC = 0;
            SELECT BASE, IVA, CONSUMO, COSTO FROM rep_utilidad WHERE ID = :IDREP AND TIPO = 33 AND CODIGO = :articulo INTO :BASE, :IVA, :consumo,  :costo;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            EXECUTE PROCEDURE PORCENTAJE (utilidad,  TOTAL, 'S') returning_values (part);
            if ((CEROS = 'S') or (BASE <> 0) or (COSTO <> 0)) then
                SUSPEND;
            END /* FOR */
        END
    if (BIN_AND(TIPO, 8) <> 0) then
        BEGIN
        TIPODOC = 34;
        /* BORRA LA TABLA AUXILIAR */
        DELETE FROM reportes_aux WHERE REPA_ID = 2 AND REPA_USER = USER;

        FOR SELECT MAX(D.ARTI_COD), SUM(PEDE_CANT * PEDE_FACTOR), SUM((PEDE_TOTAL-PEDE_IVAMONTO-PEDE_CONSUMO)*PEDI_FACTOR), SUM(PEDE_IVAMONTO*PEDI_FACTOR), SUM(PEDE_CONSUMO)
            FROM PEDIDOS_DETALLE D, PEDIDOS P, PREFIJOS R, ARTICULO A
            WHERE P.PEDI_ID = D.PEDI_ID AND P.PREF_PRE = R.PREF_PRE AND R.TIDO_COD = 34 AND D.ARTI_COD = A.arti_cod AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            PEDI_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY D.ARTI_COD
            INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO
            DO
            BEGIN
            COSTO = 0;
            FOR SELECT PEDE_CANT * PEDE_FACTOR, PEDI_FECHA FROM pedidos_detalle D, pedidos F, PREFIJOS P
                WHERE F.pedi_id = D.pedi_id AND PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND
                PEDI_ANULADO = 'N' AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                and D.ARTI_COD = :articulo  INTO :cantdet, :fecha
                DO
                BEGIN
                EXECUTE PROCEDURE costo_promedio_y_ultimo(:ARTICULO, :FECHA) returning_values (:costounit, :ultcos);
                /* EL FACTOR */
                FACCOST = 1;
                SELECT FIRST 1 FACO_FACTOR FROM factor_costo WHERE FACO_FECINI <= :FECHA AND FACO_FECFIN >= :FECHA INTO :FACCOST;
                ULTCOS = ULTCOS * FACCOST;
                COSTOUNIT = COSTOUNIT * FACCOST;

                if (ULTIMO = 'S') then
                    COSTO = COSTO + ultcos * cantdet;
                else
                    COSTO = COSTO + costounit * cantdet;
                END
            EXECUTE procedure nombres_grupos_inventario (CODGRUPO, CODSUBG, CODMARC)
                returning_values (NOMGRUPO, NOMSUBG, NOMMARC);
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            if (CEROS = 'S') then
                INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (2, USER, :ARTICULO);
            INSERT INTO REP_UTILIDAD(ID, TIPO, CODIGO, BASE, IVA, CONSUMO, COSTO) VALUES (:IDREP, 34, :articulo, :base, :iva, :consumo, :costo);
            END /* FOR */
        SELECT SUM(BASE-COSTO) FROM REP_UTILIDAD WHERE id = :IDREP AND TIPO = 34 INTO :TOTAL;
        FOR SELECT ARTI_COD, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD, TAIV_PORC FROM ARTICULO A, TARIFA_IVA T
            WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND
            (A.MARC_COD <= :MARFIN))) AND substring(a.arti_cod from 1 FOR 2) <> '.t' AND A.taiv_cod = T.taiv_cod
            INTO :ARTICULO, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :ivapor
            DO
            BEGIN
            EXECUTE procedure nombres_grupos_inventario (CODGRUPO, CODSUBG, CODMARC)
                returning_values (NOMGRUPO, NOMSUBG, NOMMARC);
            BASE = 0;
            IVA = 0;
            CONSUMO = 0;
            COSTO = 0;
            UTILIDAD = 0;
            PORC = 0;
            SELECT BASE, IVA, CONSUMO, COSTO FROM rep_utilidad WHERE ID = :IDREP AND TIPO = 34 AND CODIGO = :articulo INTO :BASE, :IVA, :consumo,  :costo;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            EXECUTE PROCEDURE PORCENTAJE (utilidad,  TOTAL, 'S') returning_values (part);
            if ((CEROS = 'S') or (BASE <> 0) or (COSTO <> 0)) then
                SUSPEND;
            END /* FOR */
        END
    if (BIN_AND(TIPO, 16) <> 0) then
        BEGIN
        TIPODOC = 35;
        FOR SELECT MAX(D.ARTI_COD), SUM(CTDE_CANT * CTDE_FACTOR), SUM((CTDE_TOTAL-CTDE_IVAMONTO-CTDE_CONSUMO)*COTI_FACTOR), SUM(CTDE_IVAMONTO), SUM(CTDE_CONSUMO)
            FROM COTIZACIONES_DETALLE D, COTIZACIONES C, PREFIJOS P, ARTICULO A
            WHERE C.COTI_ID = D.COTI_ID AND P.PREF_PRE = C.PREF_PRE AND P.TIDO_COD = 35 AND D.ARTI_COD = A.arti_cod AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND COTI_FECHA >= :FECINI AND COTI_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            COTI_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY D.ARTI_COD
            INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO
            DO
            BEGIN
            COSTO = 0;
            FOR SELECT CTDE_CANT * CTDE_FACTOR, COTI_FECHA FROM cotizaciones_detalle D, cotizaciones F, PREFIJOS P
                WHERE F.coti_id = D.coti_id AND COTI_FECHA >= :FECINI AND COTI_FECHA <= :FECFIN AND
                COTI_ANULADO = 'N' AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 35 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                and D.ARTI_COD = :articulo  INTO :cantdet, :fecha
                DO
                BEGIN
                EXECUTE PROCEDURE costo_promedio_y_ultimo(:ARTICULO, :FECHA) returning_values (:costounit, :ultcos);
                /* EL FACTOR */
                FACCOST = 1;
                SELECT FIRST 1 FACO_FACTOR FROM factor_costo WHERE FACO_FECINI <= :FECHA AND FACO_FECFIN >= :FECHA INTO :FACCOST;
                ULTCOS = ULTCOS * FACCOST;
                COSTOUNIT = COSTOUNIT * FACCOST;

                if (ULTIMO = 'S') then
                    COSTO = COSTO + ultcos * cantdet;
                else
                    COSTO = COSTO + costounit * cantdet;
                END
            EXECUTE procedure nombres_grupos_inventario (CODGRUPO, CODSUBG, CODMARC)
                returning_values (NOMGRUPO, NOMSUBG, NOMMARC);
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            if (CEROS = 'S') then
                INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (2, USER, :ARTICULO);
            INSERT INTO REP_UTILIDAD(ID, TIPO, CODIGO, BASE, IVA, CONSUMO, COSTO) VALUES (:IDREP, 35, :articulo, :base, :iva, :consumo, :costo);
            END /* FOR */
        SELECT SUM(BASE-COSTO) FROM REP_UTILIDAD WHERE id = :IDREP AND TIPO = 35 INTO :TOTAL;
        FOR SELECT ARTI_COD, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD, TAIV_PORC FROM ARTICULO A, TARIFA_IVA T
            WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND
            (A.MARC_COD <= :MARFIN))) AND substring(a.arti_cod from 1 FOR 2) <> '.t' AND A.taiv_cod = T.taiv_cod
            INTO :ARTICULO, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :ivapor
            DO
            BEGIN
            EXECUTE procedure nombres_grupos_inventario (CODGRUPO, CODSUBG, CODMARC)
                returning_values (NOMGRUPO, NOMSUBG, NOMMARC);
            BASE = 0;
            IVA = 0;
            CONSUMO = 0;
            COSTO = 0;
            UTILIDAD = 0;
            PORC = 0;
            SELECT BASE, IVA, CONSUMO, COSTO FROM rep_utilidad WHERE ID = :IDREP AND TIPO = 35 AND CODIGO = :articulo INTO :BASE, :IVA, :consumo,  :costo;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            EXECUTE PROCEDURE PORCENTAJE (utilidad,  TOTAL, 'S') returning_values (part);
            if ((CEROS = 'S') or (BASE <> 0) or (COSTO <> 0)) then
                SUSPEND;
            END /* FOR */
        END
    END
ELSE
  if (DETALLE = 'G') then
    BEGIN
    if (BIN_AND(TIPO, 1) <> 0) then
        BEGIN
        TIPODOC = 31;
        FOR SELECT MAX(a.grup_cod), SUM((FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO)*FACT_FACTOR), SUM(FADE_IVAMONTO*FACT_FACTOR), SUM(FADE_CONSUMO)
            FROM FACTURAS_DETALLE D, FACTURAS F, PREFIJOS P, ARTICULO A
            WHERE F.FACT_ID = D.FACT_ID AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND D.ARTI_COD = A.arti_cod AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            FACT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) and substring(a.arti_cod from 1 FOR 2) <> '.t'
            GROUP BY a.grup_cod
            INTO :codgrupo, :BASE, :IVA, :CONSUMO
            DO
            BEGIN
            COSTO = 0;
            FOR SELECT D.arti_cod, FADE_CANT * FADE_FACTOR, FACT_FECHA, F.fact_id, D.fade_item FROM FACTURAS_DETALLE D, FACTURAS F, PREFIJOS P, ARTICULO A
                WHERE A.arti_cod = D.arti_cod AND F.FACT_ID = D.FACT_ID AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND
                FACT_ANULADO = 'N' AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                and a.grup_cod = :codgrupo INTO :ARTICULO, cantdet, :fecha, :id, :item
                DO
                BEGIN
                if (EXISTS (SELECT COST_SALP / COST_SALC FROM COSTOS C, MOVIMIENTO_ARTICULO M
                    WHERE C.arti_cod = M.arti_cod AND COST_IDMOV = MVAR_CONS AND MVAR_TIPODOC = 31 AND MVAR_IDREF = :ID AND COST_SALC <> 0 AND MVAR_ITEM = :ITEM)) then
                    SELECT COST_SALP / COST_SALC, COST_ULTIMO FROM COSTOS C, MOVIMIENTO_ARTICULO M
                        WHERE C.arti_cod = M.arti_cod AND COST_IDMOV = MVAR_CONS AND MVAR_TIPODOC = 31 AND MVAR_IDREF = :ID AND COST_SALC <> 0 AND MVAR_ITEM = :ITEM INTO :costounit, :ultcos;
                else
                    EXECUTE PROCEDURE costo_promedio_y_ultimo(:ARTICULO, :FECHA) returning_values (:costounit, :ultcos);
                /* EL FACTOR */
                FACCOST = 1;
                SELECT FIRST 1 FACO_FACTOR FROM factor_costo WHERE FACO_FECINI <= :FECHA AND FACO_FECFIN >= :FECHA INTO :FACCOST;
                ULTCOS = ULTCOS * FACCOST;
                COSTOUNIT = COSTOUNIT * FACCOST;

                if (ULTIMO = 'S') then
                    COSTO = COSTO + ultcos * cantdet;
                else
                    COSTO = COSTO + costounit * cantdet;
                END
            CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            INSERT INTO REP_UTILIDAD(ID, TIPO, CODIGO, BASE, IVA, CONSUMO, COSTO) VALUES (:IDREP, 31, :codgrupo, :base, :iva, :consumo, :costo);
            if (CEROS = 'S') then
                INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (2, USER, :codgrupo);
            END /* FOR */
        SELECT SUM(BASE-COSTO) FROM REP_UTILIDAD WHERE id = :IDREP AND TIPO = 31 INTO :TOTAL;
        FOR SELECT GRUP_COD, GRUP_NOM FROM GRUPO
            WHERE GRUP_COD >= :GRPINI AND GRUP_COD <= :grpfin
            INTO :ARTICULO, :DESCRIPCION
            DO
            BEGIN
            BASE = 0;
            IVA = 0;
            CONSUMO = 0;
            COSTO = 0;
            UTILIDAD = 0;
            PORC = 0;
            PART = 0;
            SELECT BASE, IVA, CONSUMO, COSTO FROM rep_utilidad WHERE ID = :IDREP AND TIPO = 31 AND CODIGO = :articulo INTO :BASE, :IVA, :consumo,  :costo;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            EXECUTE PROCEDURE PORCENTAJE (utilidad,  TOTAL, 'S') returning_values (part);
            if ((CEROS = 'S') or (BASE <> 0) or (COSTO <> 0)) then
                SUSPEND;
            END /* FOR */
            BEGIN
            COSTO = 0;
            END
        END
    if (BIN_AND(TIPO, 2) <> 0) then
        BEGIN
        TIPODOC = 32;
        FOR SELECT MAX(a.grup_cod), SUM(RVDE_TOTAL-RVDE_IVAMONTO-RVDE_CONSUMO), SUM(RVDE_IVAMONTO), SUM(RVDE_CONSUMO)
            FROM REMISIONES_VENTA_DETALLE D, REMISIONES_VENTA R, PREFIJOS P, ARTICULO A
            WHERE R.REVT_ID = D.REVT_ID AND P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = 32 AND D.ARTI_COD = A.arti_cod AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            REVT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY a.grup_cod
            INTO :codgrupo, :BASE, :IVA, :CONSUMO
            DO
            BEGIN
            COSTO = 0;
            FOR SELECT D.arti_cod, RVDE_CANT * RVDE_FACTOR, REVT_FECHA, F.REVT_ID, RVDE_ITEM FROM remisiones_venta_detalle D, remisiones_venta F, PREFIJOS P, ARTICULO A
                WHERE A.arti_cod = D.arti_cod AND F.revt_id = D.revt_id AND REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN AND
                REVT_ANULADO = 'N' AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 32 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                and a.grup_cod = :codgrupo INTO :ARTICULO, cantdet, :fecha, :ID, :ITEM
                DO
                BEGIN
                if (EXISTS (SELECT COST_SALP / COST_SALC FROM COSTOS C, MOVIMIENTO_ARTICULO M
                    WHERE C.arti_cod = M.arti_cod AND COST_IDMOV = MVAR_CONS AND MVAR_TIPODOC = 32 AND MVAR_IDREF = :ID AND COST_SALC <> 0 AND MVAR_ITEM = :ITEM)) then
                    SELECT COST_SALP / COST_SALC, COST_ULTIMO FROM COSTOS C, MOVIMIENTO_ARTICULO M
                        WHERE C.arti_cod = M.arti_cod AND COST_IDMOV = MVAR_CONS AND MVAR_TIPODOC = 32 AND MVAR_IDREF = :ID AND COST_SALC <> 0 AND MVAR_ITEM = :ITEM INTO :costounit, :ultcos;
                else
                    EXECUTE PROCEDURE costo_promedio_y_ultimo(:ARTICULO, :FECHA) returning_values (:costounit, :ultcos);
                /* EL FACTOR */
                FACCOST = 1;
                SELECT FIRST 1 FACO_FACTOR FROM factor_costo WHERE FACO_FECINI <= :FECHA AND FACO_FECFIN >= :FECHA INTO :FACCOST;
                ULTCOS = ULTCOS * FACCOST;
                COSTOUNIT = COSTOUNIT * FACCOST;

                if (ULTIMO = 'S') then
                    COSTO = COSTO + ultcos * cantdet;
                else
                    COSTO = COSTO + costounit * cantdet;
                END
            CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            if (CEROS = 'S') then
                INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (2, USER, :codgrupo);
            INSERT INTO REP_UTILIDAD(ID, TIPO, CODIGO, BASE, IVA, CONSUMO, COSTO) VALUES (:IDREP, 32, :codgrupo, :base, :iva, :consumo, :costo);
            END /* FOR */
        SELECT SUM(BASE-COSTO) FROM REP_UTILIDAD WHERE id = :IDREP AND TIPO = 32 INTO :TOTAL;
        FOR SELECT GRUP_COD, GRUP_NOM FROM GRUPO
            WHERE GRUP_COD >= :GRPINI AND GRUP_COD <= :grpfin
            INTO :ARTICULO, :DESCRIPCION
            DO
            BEGIN
            BASE = 0;
            IVA = 0;
            CONSUMO = 0;
            COSTO = 0;
            UTILIDAD = 0;
            PORC = 0;
            SELECT BASE, IVA, CONSUMO, COSTO FROM rep_utilidad WHERE ID = :IDREP AND TIPO = 32 AND CODIGO = :articulo INTO :BASE, :IVA, :consumo,  :costo;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            EXECUTE PROCEDURE PORCENTAJE (utilidad,  TOTAL, 'S') returning_values (part);
            if ((CEROS = 'S') or (BASE <> 0) or (COSTO <> 0)) then
                SUSPEND;
            END /* FOR */
        END
    if (BIN_AND(TIPO, 4) <> 0) then
        BEGIN
        TIPODOC = 33;
        FOR SELECT MAX(a.grup_cod), SUM((DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO)*DEVT_FACTOR), SUM(DVDE_IVAMONTO*DEVT_FACTOR), SUM(DVDE_CONSUMO)
            FROM devoluciones_ventas_detalle D, DEVOLUCIONES_VENTAS V, PREFIJOS P, ARTICULO A
            WHERE V.DEVT_ID = D.DEVT_ID AND P.PREF_PRE = V.PREF_PRE AND P.TIDO_COD = 33 AND D.ARTI_COD = A.arti_cod AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            DEVT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY a.grup_cod
            INTO :codgrupo, :BASE, :IVA, :CONSUMO
            DO
            BEGIN
            COSTO = 0;
            FOR SELECT D.arti_cod, DVDE_CANT * DVDE_FACTOR, DEVT_FECHA, F.devt_id, D.dvde_item FROM devoluciones_ventas_detalle D, devoluciones_ventas F, PREFIJOS P, ARTICULO A
                WHERE A.arti_cod = D.arti_cod AND F.devt_id = D.devt_id AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND
                DEVT_ANULADO = 'N' AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 33 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                and a.grup_cod = :codgrupo INTO :ARTICULO, cantdet, :fecha, :ID, :ITEM
                DO
                BEGIN
                if (EXISTS (SELECT COST_ENTP / COST_ENTC FROM COSTOS C, MOVIMIENTO_ARTICULO M
                    WHERE C.arti_cod = M.arti_cod AND COST_IDMOV = MVAR_CONS AND MVAR_TIPODOC = 33 AND MVAR_IDREF = :ID AND COST_ENTC <> 0 AND MVAR_ITEM = :ITEM)) then
                    SELECT COST_ENTP / COST_ENTC, COST_ULTIMO FROM COSTOS C, MOVIMIENTO_ARTICULO M
                        WHERE C.arti_cod = M.arti_cod AND COST_IDMOV = MVAR_CONS AND MVAR_TIPODOC = 33 AND MVAR_IDREF = :ID AND COST_ENTC <> 0 AND MVAR_ITEM = :ITEM INTO :costounit, :ultcos;
                else
                    EXECUTE PROCEDURE costo_promedio_y_ultimo(:ARTICULO, :FECHA) returning_values (:costounit, :ultcos);
                /* EL FACTOR */
                FACCOST = 1;
                SELECT FIRST 1 FACO_FACTOR FROM factor_costo WHERE FACO_FECINI <= :FECHA AND FACO_FECFIN >= :FECHA INTO :FACCOST;
                ULTCOS = ULTCOS * FACCOST;
                COSTOUNIT = COSTOUNIT * FACCOST;

                if (ULTIMO = 'S') then
                    COSTO = COSTO + ultcos * cantdet;
                else
                    COSTO = COSTO + costounit * cantdet;
                END
            CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            else
                BASE = BASE * -1;
            if (IVA IS NULL) then
                IVA = 0;
            else
                IVA = IVA * -1;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            else
                CONSUMO = CONSUMO * -1;
            COSTO = costo * -1;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            if (CEROS = 'S') then
                INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (2, USER, :codgrupo);
            INSERT INTO REP_UTILIDAD(ID, TIPO, CODIGO, BASE, IVA, CONSUMO, COSTO) VALUES (:IDREP, 33, :codgrupo, :base, :iva, :consumo, :costo);
            END /* FOR */
        SELECT SUM(BASE-COSTO) FROM REP_UTILIDAD WHERE id = :IDREP AND TIPO = 33 INTO :TOTAL;
        FOR SELECT GRUP_COD, GRUP_NOM FROM GRUPO
            WHERE GRUP_COD >= :GRPINI AND GRUP_COD <= :grpfin
            INTO :ARTICULO, :DESCRIPCION
            DO
            BEGIN
            BASE = 0;
            IVA = 0;
            CONSUMO = 0;
            COSTO = 0;
            UTILIDAD = 0;
            PORC = 0;
            SELECT BASE, IVA, CONSUMO, COSTO FROM rep_utilidad WHERE ID = :IDREP AND TIPO = 33 AND CODIGO = :articulo INTO :BASE, :IVA, :consumo,  :costo;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            EXECUTE PROCEDURE PORCENTAJE (utilidad,  TOTAL, 'S') returning_values (part);
            if ((CEROS = 'S') or (BASE <> 0) or (COSTO <> 0)) then
                SUSPEND;
            END /* FOR */
        END
    if (BIN_AND(TIPO, 8) <> 0) then
        BEGIN
        TIPODOC = 34;
        /* BORRA LA TABLA AUXILIAR */
        DELETE FROM reportes_aux WHERE REPA_ID = 2 AND REPA_USER = USER;

        FOR SELECT MAX(a.grup_cod), SUM((PEDE_TOTAL-PEDE_IVAMONTO-PEDE_CONSUMO)*PEDI_FACTOR), SUM(PEDE_IVAMONTO*PEDI_FACTOR), SUM(PEDE_CONSUMO)
            FROM PEDIDOS_DETALLE D, PEDIDOS P, PREFIJOS R, ARTICULO A
            WHERE P.PEDI_ID = D.PEDI_ID AND P.PREF_PRE = R.PREF_PRE AND R.TIDO_COD = 34 AND D.ARTI_COD = A.arti_cod AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            PEDI_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY a.grup_cod
            INTO :codgrupo, :BASE, :IVA, :CONSUMO
            DO
            BEGIN
            COSTO = 0;
            FOR SELECT MAX(D.arti_cod), SUM(PEDE_CANT * PEDE_FACTOR), MAX(pedi_FECHA) FROM pedidos_detalle D, pedidos F, PREFIJOS P, ARTICULO A
                WHERE A.arti_cod = D.arti_cod AND F.pedi_id = D.pedi_id AND PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND
                PEDI_ANULADO = 'N' AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 34 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                and a.grup_cod = :codgrupo GROUP BY D.ARTI_COD, PEDI_FECHA INTO :ARTICULO, cantdet, :fecha
                DO
                BEGIN
                EXECUTE PROCEDURE costo_promedio_y_ultimo(:ARTICULO, :FECHA) returning_values (:costounit, :ultcos);
                /* EL FACTOR */
                FACCOST = 1;
                SELECT FIRST 1 FACO_FACTOR FROM factor_costo WHERE FACO_FECINI <= :FECHA AND FACO_FECFIN >= :FECHA INTO :FACCOST;
                ULTCOS = ULTCOS * FACCOST;
                COSTOUNIT = COSTOUNIT * FACCOST;

                if (ULTIMO = 'S') then
                    COSTO = COSTO + ultcos * cantdet;
                else
                    COSTO = COSTO + costounit * cantdet;
                END
            CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            if (CEROS = 'S') then
                INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (2, USER, :codgrupo);
            INSERT INTO REP_UTILIDAD(ID, TIPO, CODIGO, BASE, IVA, CONSUMO, COSTO) VALUES (:IDREP, 34, :codgrupo, :base, :iva, :consumo, :costo);
            END /* FOR */
        SELECT SUM(BASE-COSTO) FROM REP_UTILIDAD WHERE id = :IDREP AND TIPO = 34 INTO :TOTAL;
        FOR SELECT GRUP_COD, GRUP_NOM FROM GRUPO
            WHERE GRUP_COD >= :GRPINI AND GRUP_COD <= :grpfin
            INTO :ARTICULO, :DESCRIPCION
            DO
            BEGIN
            BASE = 0;
            IVA = 0;
            CONSUMO = 0;
            COSTO = 0;
            UTILIDAD = 0;
            PORC = 0;
            SELECT BASE, IVA, CONSUMO, COSTO FROM rep_utilidad WHERE ID = :IDREP AND TIPO = 34 AND CODIGO = :articulo INTO :BASE, :IVA, :consumo,  :costo;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            EXECUTE PROCEDURE PORCENTAJE (utilidad,  TOTAL, 'S') returning_values (part);
            if ((CEROS = 'S') or (BASE <> 0) or (COSTO <> 0)) then
                SUSPEND;
            END /* FOR */
        END
    if (BIN_AND(TIPO, 16) <> 0) then
        BEGIN
        TIPODOC = 35;
        FOR SELECT MAX(a.grup_cod), SUM((CTDE_TOTAL-CTDE_IVAMONTO-CTDE_CONSUMO)*COTI_FACTOR), SUM(CTDE_IVAMONTO), SUM(CTDE_CONSUMO)
            FROM COTIZACIONES_DETALLE D, COTIZACIONES C, PREFIJOS P, ARTICULO A
            WHERE C.COTI_ID = D.COTI_ID AND P.PREF_PRE = C.PREF_PRE AND P.TIDO_COD = 35 AND D.ARTI_COD = A.arti_cod AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND COTI_FECHA >= :FECINI AND COTI_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            COTI_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY A.grup_cod
            INTO :codgrupo, :BASE, :IVA, :CONSUMO
            DO
            BEGIN
            COSTO = 0;
            FOR SELECT MAX(D.arti_cod), SUM(CTDE_CANT * CTDE_FACTOR), MAX(COTI_FECHA) FROM cotizaciones_detalle D, cotizaciones F, PREFIJOS P, ARTICULO A
                WHERE A.arti_cod = D.arti_cod AND F.coti_id = D.coti_id AND COTI_FECHA >= :FECINI AND COTI_FECHA <= :FECFIN AND
                COTI_ANULADO = 'N' AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 35 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                and a.grup_cod = :codgrupo GROUP BY D.ARTI_COD, COTI_FECHA INTO :ARTICULO, cantdet, :fecha
                DO
                BEGIN
                EXECUTE PROCEDURE costo_promedio_y_ultimo(:ARTICULO, :FECHA) returning_values (:costounit, :ultcos);
                /* EL FACTOR */
                FACCOST = 1;
                SELECT FIRST 1 FACO_FACTOR FROM factor_costo WHERE FACO_FECINI <= :FECHA AND FACO_FECFIN >= :FECHA INTO :FACCOST;
                ULTCOS = ULTCOS * FACCOST;
                COSTOUNIT = COSTOUNIT * FACCOST;

                if (ULTIMO = 'S') then
                    COSTO = COSTO + ultcos * cantdet;
                else
                    COSTO = COSTO + costounit * cantdet;
                END
            CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            if (CEROS = 'S') then
                INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (2, USER, :codgrupo);
            INSERT INTO REP_UTILIDAD(ID, TIPO, CODIGO, BASE, IVA, CONSUMO, COSTO) VALUES (:IDREP, 35, :codgrupo, :base, :iva, :consumo, :costo);
            END /* FOR */
        SELECT SUM(BASE-COSTO) FROM REP_UTILIDAD WHERE id = :IDREP AND TIPO = 35 INTO :TOTAL;
        FOR SELECT GRUP_COD, GRUP_NOM FROM GRUPO
            WHERE GRUP_COD >= :GRPINI AND GRUP_COD <= :grpfin
            INTO :ARTICULO, :DESCRIPCION
            DO
            BEGIN
            BASE = 0;
            IVA = 0;
            CONSUMO = 0;
            COSTO = 0;
            UTILIDAD = 0;
            PORC = 0;
            SELECT BASE, IVA, CONSUMO, COSTO FROM rep_utilidad WHERE ID = :IDREP AND TIPO = 35 AND CODIGO = :articulo INTO :BASE, :IVA, :consumo,  :costo;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            EXECUTE PROCEDURE PORCENTAJE (utilidad,  TOTAL, 'S') returning_values (part);
            if ((CEROS = 'S') or (BASE <> 0) or (COSTO <> 0)) then
                SUSPEND;
            END /* FOR */
        END
    END
  ELSE
    BEGIN
    if (BIN_AND(TIPO, 1) <> 0) then
        BEGIN
        TIPODOC = 31;
        FOR SELECT F.PREF_PRE, FACT_NUMERO, FACT_FECHA, D.ARTI_COD, FADE_CANT * FADE_FACTOR, (FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO)*FACT_FACTOR, FADE_IVAMONTO*FACT_FACTOR, FADE_CONSUMO,
            ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD, F.FACT_ID, FADE_ITEM, TAIV_PORC
            FROM FACTURAS F, FACTURAS_DETALLE D, PREFIJOS P, ARTICULO A, TARIFA_IVA T
            WHERE F.FACT_ID = D.FACT_ID AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND D.ARTI_COD = A.arti_cod AND
                A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
                A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND FACT_FECHA >= :FECINI AND A.taiv_cod = T.taiv_cod AND
                (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
                FACT_FECHA <= :FECFIN AND FACT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) and substring(a.arti_cod from 1 FOR 2) <> '.t'
            ORDER BY D.ARTI_COD, FACT_FECHA, F.FACT_ID, FADE_ITEM
            INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,
                :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :ID, :ITEM, :ivapor
            DO
            BEGIN
            EXECUTE procedure nombres_grupos_inventario (CODGRUPO, CODSUBG, CODMARC)
                returning_values (NOMGRUPO, NOMSUBG, NOMMARC);
            if (EXISTS (SELECT COST_SALP / COST_SALC FROM COSTOS C, MOVIMIENTO_ARTICULO M
                WHERE C.arti_cod = M.arti_cod AND COST_IDMOV = MVAR_CONS AND MVAR_TIPODOC = 31 AND MVAR_IDREF = :ID AND COST_SALC <> 0 AND MVAR_ITEM = :ITEM)) then
                SELECT COST_SALP / COST_SALC, COST_ULTIMO FROM COSTOS C, MOVIMIENTO_ARTICULO M
                    WHERE C.arti_cod = M.arti_cod AND COST_IDMOV = MVAR_CONS AND MVAR_TIPODOC = 31 AND MVAR_IDREF = :ID AND COST_SALC <> 0 AND MVAR_ITEM = :ITEM INTO :costounit, :ultcos;
            else
                EXECUTE PROCEDURE costo_promedio_y_ultimo(:ARTICULO, :FECHA) returning_values (:costounit, :ultcos);
            /* EL FACTOR */
            FACCOST = 1;
            SELECT FIRST 1 FACO_FACTOR FROM factor_costo WHERE FACO_FECINI <= :FECHA AND FACO_FECFIN >= :FECHA INTO :FACCOST;
            ULTCOS = ULTCOS * FACCOST;
            COSTOUNIT = COSTOUNIT * FACCOST;

            if (ULTIMO = 'S') then
                COSTO = ultcos * cantidad;
            else
                COSTO = costounit * cantidad;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            SUSPEND;
            END
        END
    if (BIN_AND(TIPO, 2) <> 0) then
        BEGIN
        TIPODOC = 32;
        FOR SELECT R.PREF_PRE, REVT_NUMERO, REVT_FECHA, D.ARTI_COD, RVDE_CANT * RVDE_FACTOR, RVDE_TOTAL-RVDE_IVAMONTO-RVDE_CONSUMO, RVDE_IVAMONTO, RVDE_CONSUMO,
            ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD, R.REVT_ID, RVDE_ITEM, TAIV_PORC
            FROM REMISIONES_VENTA R, REMISIONES_VENTA_DETALLE D, PREFIJOS P, ARTICULO A, TARIFA_IVA T
            WHERE R.REVT_ID = D.REVT_ID AND P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = 32 AND D.ARTI_COD = A.arti_cod AND
                A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
                A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN AND
                (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
                REVT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) AND A.taiv_cod = T.taiv_cod
            ORDER BY D.ARTI_COD, REVT_FECHA, R.REVT_ID, RVDE_ITEM
            INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,
                :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :ID, :ITEM, :ivapor
            DO
            BEGIN
            EXECUTE procedure nombres_grupos_inventario (CODGRUPO, CODSUBG, CODMARC)
                returning_values (NOMGRUPO, NOMSUBG, NOMMARC);
            if (EXISTS (SELECT COST_SALP / COST_SALC FROM COSTOS C, MOVIMIENTO_ARTICULO M
                WHERE C.arti_cod = M.arti_cod AND COST_IDMOV = MVAR_CONS AND MVAR_TIPODOC = 32 AND MVAR_IDREF = :ID AND COST_SALC <> 0 AND MVAR_ITEM = :ITEM)) then
                SELECT COST_SALP / COST_SALC, COST_ULTIMO FROM COSTOS C, MOVIMIENTO_ARTICULO M
                    WHERE C.arti_cod = M.arti_cod AND COST_IDMOV = MVAR_CONS AND MVAR_TIPODOC = 32 AND MVAR_IDREF = :ID AND COST_SALC <> 0 AND MVAR_ITEM = :ITEM INTO :costounit, :ultcos;
            else
                EXECUTE PROCEDURE costo_promedio_y_ultimo(:ARTICULO, :FECHA) returning_values (:costounit, :ultcos);
            /* EL FACTOR */
            FACCOST = 1;
            SELECT FIRST 1 FACO_FACTOR FROM factor_costo WHERE FACO_FECINI <= :FECHA AND FACO_FECFIN >= :FECHA INTO :FACCOST;
            ULTCOS = ULTCOS * FACCOST;
            COSTOUNIT = COSTOUNIT * FACCOST;

            if (ULTIMO = 'S') then
                COSTO = ultcos * cantidad;
            else
                COSTO = costounit * cantidad;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            SUSPEND;
            END
        END
    if (BIN_AND(TIPO, 4) <> 0) then
        BEGIN
        TIPODOC = 33;
        FOR SELECT V.PREF_PRE, DEVT_NUMERO, DEVT_FECHA, D.ARTI_COD, DVDE_CANT * DVDE_FACTOR, (DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO)*DEVT_FACTOR, DVDE_IVAMONTO*DEVT_FACTOR, DVDE_CONSUMO,
            ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD, V.DEVT_ID, DVDE_ITEM, TAIV_PORC
            FROM DEVOLUCIONES_VENTAS V, DEVOLUCIONES_VENTAS_DETALLE D, PREFIJOS P, ARTICULO A, TARIFA_IVA T
            WHERE V.DEVT_ID = D.DEVT_ID AND P.PREF_PRE = V.PREF_PRE AND P.TIDO_COD = 33 AND D.ARTI_COD = A.arti_cod AND
                A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
                A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND
                (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
                DEVT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) AND A.taiv_cod = T.taiv_cod
            ORDER BY D.ARTI_COD, DEVT_FECHA, V.DEVT_ID, DVDE_ITEM
            INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,
                :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :ID, :ITEM, :ivapor
            DO
            BEGIN
            EXECUTE procedure nombres_grupos_inventario (CODGRUPO, CODSUBG, CODMARC)
                returning_values (NOMGRUPO, NOMSUBG, NOMMARC);
            CANTIDAD = CANTIDAD * -1;
            if (EXISTS (SELECT COST_ENTP / COST_ENTC FROM COSTOS C, MOVIMIENTO_ARTICULO M
                WHERE C.arti_cod = M.arti_cod AND COST_IDMOV = MVAR_CONS AND MVAR_TIPODOC = 33 AND MVAR_IDREF = :ID AND COST_ENTC <> 0 AND MVAR_ITEM = :ITEM)) then
                SELECT COST_ENTP / COST_ENTC, COST_ULTIMO FROM COSTOS C, MOVIMIENTO_ARTICULO M
                    WHERE C.arti_cod = M.arti_cod AND COST_IDMOV = MVAR_CONS AND MVAR_TIPODOC = 33 AND MVAR_IDREF = :ID AND COST_ENTC <> 0 AND MVAR_ITEM = :ITEM INTO :costounit, :ultcos;
            else
                EXECUTE PROCEDURE costo_promedio_y_ultimo(:ARTICULO, :FECHA) returning_values (:costounit, :ultcos);
            /* EL FACTOR */
            FACCOST = 1;
            SELECT FIRST 1 FACO_FACTOR FROM factor_costo WHERE FACO_FECINI <= :FECHA AND FACO_FECFIN >= :FECHA INTO :FACCOST;
            ULTCOS = ULTCOS * FACCOST;
            COSTOUNIT = COSTOUNIT * FACCOST;

            if (ULTIMO = 'S') then
                COSTO = ultcos * cantidad;
            else
                COSTO = costounit * cantidad;
            BASE = BASE * -1;
            IVA = IVA * -1;
            CONSUMO = CONSUMO * -1;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            SUSPEND;
            END
        END
    if (BIN_AND(TIPO, 8) <> 0) then
        BEGIN
        TIPODOC = 34;
        FOR SELECT P.PREF_PRE, PEDI_NUMERO, PEDI_FECHA, D.ARTI_COD, PEDE_CANT * PEDE_FACTOR, (PEDE_TOTAL-PEDE_IVAMONTO-PEDE_CONSUMO)*PEDI_FACTOR, PEDE_IVAMONTO*PEDI_FACTOR, PEDE_CONSUMO,
            ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD, TAIV_PORC 
            FROM PEDIDOS P, PEDIDOS_DETALLE D, PREFIJOS R, ARTICULO A, TARIFA_IVA T
            WHERE P.PEDI_ID = D.PEDI_ID AND P.PREF_PRE = R.PREF_PRE AND R.TIDO_COD = 34 AND D.ARTI_COD = A.arti_cod AND
                A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
                A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND
                (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
                PEDI_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) AND A.taiv_cod = T.taiv_cod
            ORDER BY D.ARTI_COD, PEDI_FECHA, P.PEDI_ID, PEDE_ITEM
            INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,
                :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :ivapor
            DO
            BEGIN
            EXECUTE procedure nombres_grupos_inventario (CODGRUPO, CODSUBG, CODMARC)
                returning_values (NOMGRUPO, NOMSUBG, NOMMARC);
            EXECUTE PROCEDURE costo_promedio_y_ultimo(:ARTICULO, :FECHA) returning_values (:costounit, :ultcos);
            /* EL FACTOR */
            FACCOST = 1;
            SELECT FIRST 1 FACO_FACTOR FROM factor_costo WHERE FACO_FECINI <= :FECHA AND FACO_FECFIN >= :FECHA INTO :FACCOST;
            ULTCOS = ULTCOS * FACCOST;
            COSTOUNIT = COSTOUNIT * FACCOST;

            if (ULTIMO = 'S') then
                COSTO = ultcos * cantidad;
            else
                COSTO = costounit * cantidad;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            SUSPEND;
            END
        END
    if (BIN_AND(TIPO, 16) <> 0) then
        BEGIN
        TIPODOC = 35;
        FOR SELECT C.PREF_PRE, COTI_NUMERO, COTI_FECHA, D.ARTI_COD, CTDE_CANT * CTDE_FACTOR, (CTDE_TOTAL-CTDE_IVAMONTO-CTDE_CONSUMO)*COTI_FACTOR, CTDE_IVAMONTO*COTI_FACTOR, CTDE_CONSUMO,
            ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD, TAIV_PORC
            FROM COTIZACIONES C, COTIZACIONES_DETALLE D, PREFIJOS P, ARTICULO A, TARIFA_IVA T
            WHERE C.COTI_ID = D.COTI_ID AND P.PREF_PRE = C.PREF_PRE AND P.TIDO_COD = 35 AND D.ARTI_COD = A.arti_cod AND
                A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
                A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND COTI_FECHA >= :FECINI AND COTI_FECHA <= :FECFIN AND
                (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
                COTI_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) AND A.taiv_cod = T.taiv_cod
            ORDER BY D.ARTI_COD, COTI_FECHA, C.COTI_ID, CTDE_ITEM
            INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,
                :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :ivapor
            DO
            BEGIN
            EXECUTE procedure nombres_grupos_inventario (CODGRUPO, CODSUBG, CODMARC)
                returning_values (NOMGRUPO, NOMSUBG, NOMMARC);
            EXECUTE PROCEDURE costo_promedio_y_ultimo(:ARTICULO, :FECHA) returning_values (:costounit, :ultcos);
            /* EL FACTOR */
            FACCOST = 1;
            SELECT FIRST 1 FACO_FACTOR FROM factor_costo WHERE FACO_FECINI <= :FECHA AND FACO_FECFIN >= :FECHA INTO :FACCOST;
            ULTCOS = ULTCOS * FACCOST;
            COSTOUNIT = COSTOUNIT * FACCOST;

            if (ULTIMO = 'S') then
                COSTO = ultcos * cantidad;
            else
                COSTO = costounit * cantidad;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            SUSPEND;
            END
        END
    END
END
^

SET TERM ; ^


SET TERM ^ ;

CREATE OR ALTER procedure REP_UTILIDAD_CLIENTE (
    TIPO integer,
    DETALLE char(1),
    TERINI varchar(20),
    TERFIN varchar(20),
    FECINI date,
    FECFIN date,
    ARTINI varchar(15),
    ARTFIN varchar(15),
    ORDEN char(1),
    CEROS char(1),
    SUBEMPRESA integer)
returns (
    NIT varchar(20),
    NOMBRE varchar(60),
    SUCURSAL varchar(10),
    TELEFONO varchar(40),
    CIUDAD varchar(40),
    CODZONA varchar(2),
    NOMZONA varchar(30),
    NOMTIPO varchar(50),
    ARTICULO varchar(15),
    DESCRIPCION varchar(60),
    CODGRUPO varchar(2),
    NOMGRUPO varchar(30),
    CODSUBG varchar(3),
    NOMSUBG varchar(30),
    CODMARC varchar(3),
    NOMMARC varchar(30),
    UNIDAD varchar(8),
    CANTIDAD numeric(18,4),
    BASE numeric(18,2),
    IVA numeric(18,2),
    COSTO numeric(18,2),
    UTILIDAD numeric(18,4),
    PORC numeric(9,2),
    TOTAL numeric(18,2),
    PREFIJO varchar(4),
    NUMERO varchar(6),
    FECHA date,
    DTO numeric(9,2))
AS
DECLARE VARIABLE COSTOUNIT NUMERIC(18,4);
DECLARE VARIABLE CANTDET NUMERIC(18,4);
DECLARE VARIABLE CODINI VARCHAR(15);
DECLARE VARIABLE CODFIN VARCHAR(15);
DECLARE VARIABLE DESINI VARCHAR(15);
DECLARE VARIABLE DESFIN VARCHAR(15);
declare variable UOM VARCHAR(20);
declare variable NUMROWS INTEGER;
declare variable ID INTEGER;
declare variable ITEM INTEGER;
declare variable FACCOST NUMERIC(18,4);
BEGIN
if (ORDEN = 'C') then
    BEGIN
    CODINI = ARTINI;
    CODFIN = ARTFIN;
    DESINI = '';
    DESFIN = 'zz';
    END
ELSE
    BEGIN
    DESINI = ARTINI;
    DESFIN = ARTFIN;
    CODINI = '';
    CODFIN = 'zz';
    END
EXECUTE PROCEDURE lee_configuracion ('FACTURACION', 'ARTICULOS', 'SUGERIR PRECIOS CON PORCENTAJE DE MARGEN O UTILIDAD') returning_values (:UOM);
SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = :TIPO INTO :NOMTIPO;
if (DETALLE = 'N') then
    BEGIN
    if (BIN_AND(TIPO, 1) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 31 INTO :NOMTIPO;
        /* BORRA LA TABLA AUXILIAR */
        DELETE FROM reportes_aux WHERE REPA_ID = 3 AND REPA_USER = USER;

        FOR SELECT MAX(T.TERC_NIT), MAX(TERC_NOM), MAX(TERC_TEL), MAX(TERC_CIU), MAX(ZONA_COD), MAX(D.ARTI_COD), SUM(FADE_CANT * FADE_FACTOR), SUM(FACT_FACTOR*(FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO)),
            SUM(FACT_FACTOR*FADE_IVAMONTO), SUM(FACT_FACTOR*FADE_TOTAL),
            MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD), max(f.fact_sucursal)
            FROM FACTURAS_DETALLE D, FACTURAS F, PREFIJOS P, terceros T, CLIENTES C, ARTICULO A
            WHERE C.TERC_NIT = T.TERC_NIT AND TERC_CLIE = 'S' AND F.terc_nit = T.terc_nit AND T.TERC_NIT >= :TERINI AND T.TERC_NIT <= :TERFIN AND
            F.FACT_ID = D.FACT_ID AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND FACT_ANULADO = 'N'
            AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) and substring(D.arti_cod from 1 FOR 2) <> '.t'
            AND D.ARTI_COD = A.arti_cod AND A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN
            GROUP BY T.TERC_NIT, f.fact_sucursal, D.ARTI_COD
            INTO :NIT, :NOMBRE, :TELEFONO, :CIUDAD, :CODZONA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :TOTAL,
            :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :sucursal
            DO
            BEGIN
            COSTO = 0;
            FOR SELECT F.FACT_ID, FADE_ITEM, FADE_CANT * FADE_FACTOR, FACT_FECHA FROM FACTURAS_DETALLE D, FACTURAS F, PREFIJOS P
                WHERE F.TERC_NIT = :NIT AND F.FACT_ID = D.FACT_ID AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND
                FACT_ANULADO = 'N' AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                and D.ARTI_COD = :articulo  INTO :ID, :ITEM, :cantdet, :fecha
                DO
                BEGIN
                if (EXISTS (SELECT COST_SALP / COST_SALC FROM COSTOS C, MOVIMIENTO_ARTICULO M
                    WHERE C.arti_cod = M.arti_cod AND COST_IDMOV = MVAR_CONS AND MVAR_TIPODOC = 31 AND MVAR_IDREF = :ID AND COST_SALC <> 0 AND MVAR_ITEM = :ITEM)) then
                    SELECT COST_SALP / COST_SALC FROM COSTOS C, MOVIMIENTO_ARTICULO M
                        WHERE C.arti_cod = M.arti_cod AND COST_IDMOV = MVAR_CONS AND MVAR_TIPODOC = 31 AND MVAR_IDREF = :ID AND COST_SALC <> 0 AND MVAR_ITEM = :ITEM INTO :costounit;
                else
                    EXECUTE PROCEDURE COSTO_PROMEDIO(:ARTICULO, :FECHA) returning_values (:costounit);
                /* EL FACTOR */
                FACCOST = 1;
                SELECT FIRST 1 FACO_FACTOR FROM factor_costo WHERE FACO_FECINI <= :FECHA AND FACO_FECFIN >= :FECHA INTO :FACCOST;
                COSTOUNIT = COSTOUNIT * FACCOST;

                COSTO = COSTO + costounit * cantdet;
                END
            SELECT ZONA_NOM FROM ZONAS WHERE ZONA_COD = :CODZONA INTO :NOMZONA;
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            if (CEROS = 'S') then
                INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (3, USER, :ARTICULO);
            SUSPEND;
            END /* FOR */
        if (CEROS = 'S') then
            BEGIN
            COSTO = 0;
            UTILIDAD = 0;
            PORC = 0;
            /* agregue los articulos sin factura */
            FOR SELECT ARTI_COD, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN
                INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                DO
                BEGIN
                SELECT COUNT(REPA_ARTICULO) FROM REPORTES_AUX WHERE REPA_ID = 3 AND REPA_USER = USER AND REPA_ARTICULO = :articulo INTO :numrows;
                if (numrows = 0) then
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        END
    if (BIN_AND(TIPO, 2) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 32 INTO :NOMTIPO;
        /* BORRA LA TABLA AUXILIAR */
        DELETE FROM reportes_aux WHERE REPA_ID = 3 AND REPA_USER = USER;

        FOR SELECT MAX(T.TERC_NIT), MAX(TERC_NOM), MAX(TERC_TEL), MAX(TERC_CIU), MAX(ZONA_COD), MAX(D.ARTI_COD), SUM(RVDE_CANT * RVDE_FACTOR), SUM(RVDE_TOTAL-RVDE_IVAMONTO-RVDE_CONSUMO), SUM(RVDE_IVAMONTO), SUM(RVDE_TOTAL),
            MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD), max(r.revt_sucursal)
            FROM REMISIONES_VENTA_DETALLE D, REMISIONES_VENTA R, PREFIJOS P, terceros T, CLIENTES C, ARTICULO A
            WHERE C.TERC_NIT = T.TERC_NIT AND TERC_CLIE = 'S' AND R.terc_nit = T.terc_nit AND T.TERC_NIT >= :TERINI AND T.TERC_NIT <= :TERFIN AND
            R.REVT_ID = D.REVT_ID AND REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN AND REVT_ANULADO = 'N'
            AND P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = 32 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            AND D.ARTI_COD = A.arti_cod AND A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN
            GROUP BY T.TERC_NIT, r.revt_sucursal, D.ARTI_COD
            INTO :NIT, :NOMBRE, :TELEFONO, :CIUDAD, :CODZONA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :TOTAL,
                :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :sucursal
            DO
                BEGIN
                COSTO = 0;
                FOR SELECT R.REVT_ID, RVDE_ITEM, RVDE_CANT * RVDE_FACTOR, REVT_FECHA
                    FROM REMISIONES_VENTA_DETALLE D, REMISIONES_VENTA R, PREFIJOS P
                    WHERE R.terc_nit = :nit AND R.REVT_ID = D.REVT_ID AND REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN AND REVT_ANULADO = 'N'
                    AND P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = 32 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                    AND D.ARTI_COD = :articulo INTO :ID, :ITEM, :cantdet, :fecha
                    DO
                    BEGIN
                    if (EXISTS (SELECT COST_SALP / COST_SALC FROM COSTOS C, MOVIMIENTO_ARTICULO M
                        WHERE C.arti_cod = M.arti_cod AND COST_IDMOV = MVAR_CONS AND MVAR_TIPODOC = 32 AND MVAR_IDREF = :ID AND COST_SALC <> 0 AND MVAR_ITEM = :ITEM)) then
                        SELECT COST_SALP / COST_SALC FROM COSTOS C, MOVIMIENTO_ARTICULO M
                            WHERE C.arti_cod = M.arti_cod AND COST_IDMOV = MVAR_CONS AND MVAR_TIPODOC = 32 AND MVAR_IDREF = :ID AND COST_SALC <> 0 AND MVAR_ITEM = :ITEM INTO :costounit;
                    else
                        EXECUTE PROCEDURE COSTO_PROMEDIO(:ARTICULO, :FECHA) returning_values (:costounit);
                    /* EL FACTOR */
                    FACCOST = 1;
                    SELECT FIRST 1 FACO_FACTOR FROM factor_costo WHERE FACO_FECINI <= :FECHA AND FACO_FECFIN >= :FECHA INTO :FACCOST;
                    COSTOUNIT = COSTOUNIT * FACCOST;

                    COSTO = COSTO + costounit * cantdet;
                    END
                SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                if (CANTIDAD IS NULL) then
                    CANTIDAD = 0;
                if (BASE IS NULL) then
                    BASE = 0;
                if (IVA IS NULL) then
                    IVA = 0;
                UTILIDAD = BASE - COSTO;
                if (UOM = 'UTILIDAD') then
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                else
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            if (CEROS = 'S') then
                INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (3, USER, :ARTICULO);
            SUSPEND;
            END /* FOR */
        if (CEROS = 'S') then
            BEGIN
            COSTO = 0;
            UTILIDAD = 0;
            PORC = 0;
            /* agregue los articulos sin factura */
            FOR SELECT ARTI_COD, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN
                INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                DO
                BEGIN
                SELECT COUNT(REPA_ARTICULO) FROM REPORTES_AUX WHERE REPA_ID = 3 AND REPA_USER = USER AND REPA_ARTICULO = :articulo INTO :numrows;
                if (numrows = 0) then
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        END
    if (BIN_AND(TIPO, 4) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 33 INTO :NOMTIPO;
        /* BORRA LA TABLA AUXILIAR */
        DELETE FROM reportes_aux WHERE REPA_ID = 3 AND REPA_USER = USER;

        FOR SELECT MAX(T.TERC_NIT), MAX(TERC_NOM), MAX(TERC_TEL), MAX(TERC_CIU), MAX(ZONA_COD), MAX(D.ARTI_COD), SUM(DVDE_CANT * DVDE_FACTOR), SUM(DEVT_FACTOR*(DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO)),
            SUM(DEVT_FACTOR*DVDE_IVAMONTO), SUM(DEVT_FACTOR*DVDE_TOTAL),
            MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD), max(v.devt_sucursal)
            FROM devoluciones_ventas_detalle D, DEVOLUCIONES_VENTAS V, PREFIJOS P, terceros T, CLIENTES C, ARTICULO A
            WHERE C.TERC_NIT = T.TERC_NIT AND TERC_CLIE = 'S' AND V.terc_nit = T.terc_nit AND T.TERC_NIT >= :TERINI AND T.TERC_NIT <= :TERFIN AND
            V.DEVT_ID = D.DEVT_ID AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND DEVT_ANULADO = 'N'
            AND P.PREF_PRE = V.PREF_PRE AND P.TIDO_COD = 33 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) and substring(D.arti_cod from 1 FOR 2) <> '.t'
            AND D.ARTI_COD = A.arti_cod AND A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN
            GROUP BY T.TERC_NIT, v.devt_sucursal, D.ARTI_COD
            INTO :NIT, :NOMBRE, :TELEFONO, :CIUDAD, :CODZONA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :TOTAL,
                :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :sucursal
            DO
            BEGIN
            COSTO = 0;
            FOR SELECT V.DEVT_ID, DVDE_ITEM, DVDE_CANT * DVDE_FACTOR, DEVT_FECHA
                FROM devoluciones_ventas_detalle D, DEVOLUCIONES_VENTAS V, PREFIJOS P
                WHERE V.terc_nit = :nit AND V.DEVT_ID = D.DEVT_ID AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND DEVT_ANULADO = 'N'
                AND P.PREF_PRE = V.PREF_PRE AND P.TIDO_COD = 33 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                AND D.ARTI_COD = :articulo INTO :ID, :ITEM, :cantdet, :fecha
                DO
                BEGIN
                if (EXISTS (SELECT COST_ENTP / COST_ENTC FROM COSTOS C, MOVIMIENTO_ARTICULO M
                    WHERE C.arti_cod = M.arti_cod AND COST_IDMOV = MVAR_CONS AND MVAR_TIPODOC = 33 AND MVAR_IDREF = :ID AND COST_ENTC <> 0 AND MVAR_ITEM = :ITEM)) then
                    SELECT COST_ENTP / COST_ENTC FROM COSTOS C, MOVIMIENTO_ARTICULO M
                        WHERE C.arti_cod = M.arti_cod AND COST_IDMOV = MVAR_CONS AND MVAR_TIPODOC = 33 AND MVAR_IDREF = :ID AND COST_ENTC <> 0 AND MVAR_ITEM = :ITEM INTO :costounit;
                else
                    EXECUTE PROCEDURE COSTO_PROMEDIO(:ARTICULO, :FECHA) returning_values (:costounit);
                /* EL FACTOR */
                FACCOST = 1;
                SELECT FIRST 1 FACO_FACTOR FROM factor_costo WHERE FACO_FECINI <= :FECHA AND FACO_FECFIN >= :FECHA INTO :FACCOST;
                COSTOUNIT = COSTOUNIT * FACCOST;

                COSTO = COSTO + costounit * cantdet;
                END
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            TOTAL = TOTAL * -1;
            IVA = IVA * -1;
            BASE = BASE * -1;
            CANTIDAD = CANTIDAD * -1;
            COSTO = COSTO * -1;
            UTILIDAD = UTILIDAD * -1;
            if (CEROS = 'S') then
                INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (3, USER, :ARTICULO);
            SUSPEND;
            END /* FOR */
        if (CEROS = 'S') then
            BEGIN
            COSTO = 0;
            UTILIDAD = 0;
            PORC = 0;
            /* agregue los articulos sin factura */
            FOR SELECT ARTI_COD, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN
                INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                DO
                BEGIN
                SELECT COUNT(REPA_ARTICULO) FROM REPORTES_AUX WHERE REPA_ID = 3 AND REPA_USER = USER AND REPA_ARTICULO = :articulo INTO :numrows;
                if (numrows = 0) then
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        END
    if (BIN_AND(TIPO, 8) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 34 INTO :NOMTIPO;
        /* BORRA LA TABLA AUXILIAR */
        DELETE FROM reportes_aux WHERE REPA_ID = 3 AND REPA_USER = USER;

        FOR SELECT MAX(T.TERC_NIT), MAX(TERC_NOM), MAX(TERC_TEL), MAX(TERC_CIU), MAX(ZONA_COD), MAX(D.ARTI_COD), SUM(PEDE_CANT * PEDE_FACTOR),
            SUM(PEDI_FACTOR*(PEDE_TOTAL-PEDE_IVAMONTO-PEDE_CONSUMO)), SUM(PEDI_FACTOR*PEDE_IVAMONTO), SUM(PEDI_FACTOR*PEDE_TOTAL),
            MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD), max(p.pedi_sucursal)
            FROM PEDIDOS_DETALLE D, PEDIDOS P, PREFIJOS PR, terceros T, CLIENTES C, ARTICULO A
            WHERE C.TERC_NIT = T.TERC_NIT AND TERC_CLIE = 'S' AND P.terc_nit = T.terc_nit AND T.TERC_NIT >= :TERINI AND T.TERC_NIT <= :TERFIN AND
            P.PEDI_ID = D.PEDI_ID AND PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND PEDI_ANULADO = 'N'
            AND PR.PREF_PRE = P.PREF_PRE AND P.TIDO_COD = 34 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY T.TERC_NIT, p.pedi_sucursal, D.ARTI_COD
            INTO :NIT, :NOMBRE, :TELEFONO, :CIUDAD, :CODZONA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :TOTAL,
                :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :sucursal
            DO
            BEGIN
            COSTO = 0;
            FOR SELECT PEDE_CANT * PEDE_FACTOR, PEDI_FECHA
                FROM PEDIDOS_DETALLE D, PEDIDOS PE, PREFIJOS P
                WHERE PE.terc_nit = :nit AND PE.PEDI_ID = D.PEDI_ID AND PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND PEDI_ANULADO = 'N'
                AND P.PREF_PRE = PE.PREF_PRE AND P.TIDO_COD = 34 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                AND D.ARTI_COD = :articulo INTO :cantdet, :fecha
                DO
                BEGIN
                EXECUTE PROCEDURE COSTO_PROMEDIO(:ARTICULO, :FECHA) returning_values (:costounit);
                /* EL FACTOR */
                FACCOST = 1;
                SELECT FIRST 1 FACO_FACTOR FROM factor_costo WHERE FACO_FECINI <= :FECHA AND FACO_FECFIN >= :FECHA INTO :FACCOST;
                COSTOUNIT = COSTOUNIT * FACCOST;

                COSTO = COSTO + costounit * cantdet;
                END
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            if (CEROS = 'S') then
                INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (3, USER, :ARTICULO);
            SUSPEND;
            END /* FOR */
        if (CEROS = 'S') then
            BEGIN
            COSTO = 0;
            UTILIDAD = 0;
            PORC = 0;
            /* agregue los articulos sin factura */
            FOR SELECT ARTI_COD, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN
                INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                DO
                BEGIN
                SELECT COUNT(REPA_ARTICULO) FROM REPORTES_AUX WHERE REPA_ID = 3 AND REPA_USER = USER AND REPA_ARTICULO = :articulo INTO :numrows;
                if (numrows = 0) then
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        END
    if (BIN_AND(TIPO, 16) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 35 INTO :NOMTIPO;
        /* BORRA LA TABLA AUXILIAR */
        DELETE FROM reportes_aux WHERE REPA_ID = 3 AND REPA_USER = USER;

        FOR SELECT MAX(T.TERC_NIT), MAX(TERC_NOM), MAX(TERC_TEL), MAX(TERC_CIU), MAX(ZONA_COD), MAX(D.ARTI_COD), SUM(CTDE_CANT * CTDE_FACTOR),
            SUM(COTI_FACTOR*(CTDE_TOTAL-CTDE_IVAMONTO-CTDE_CONSUMO)), SUM(COTI_FACTOR*CTDE_IVAMONTO), SUM(COTI_FACTOR*CTDE_TOTAL),
            MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD), max(ct.coti_sucursal)
            FROM COTIZACIONES_DETALLE D, COTIZACIONES CT, PREFIJOS P, terceros T, CLIENTES C, ARTICULO A
            WHERE C.TERC_NIT = T.TERC_NIT AND TERC_CLIE = 'S' AND C.terc_nit = T.terc_nit AND T.TERC_NIT >= :TERINI AND T.TERC_NIT <= :TERFIN AND
            CT.COTI_ID = D.COTI_ID AND COTI_FECHA >= :FECINI AND COTI_FECHA <= :FECFIN AND COTI_ANULADO = 'N'
            AND P.PREF_PRE = CT.PREF_PRE AND P.TIDO_COD = 35 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY T.TERC_NIT, ct.coti_sucursal, D.ARTI_COD
            INTO :NIT, :NOMBRE, :TELEFONO, :CIUDAD, :CODZONA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :TOTAL,
                :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :sucursal
            DO
            BEGIN
            COSTO = 0;
            FOR SELECT CTDE_CANT * CTDE_FACTOR, COTI_FECHA
                FROM COTIZACIONES_DETALLE D, COTIZACIONES C, PREFIJOS P
                WHERE C.terc_nit = :nit AND C.COTI_ID = D.coti_id AND COTI_FECHA >= :FECINI AND COTI_FECHA <= :FECFIN AND COTI_ANULADO = 'N'
                AND P.PREF_PRE = C.PREF_PRE AND P.TIDO_COD = 35 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                AND D.ARTI_COD = :articulo INTO :cantdet, :fecha
                DO
                BEGIN
                EXECUTE PROCEDURE COSTO_PROMEDIO(:ARTICULO, :FECHA) returning_values (:costounit);
                /* EL FACTOR */
                FACCOST = 1;
                SELECT FIRST 1 FACO_FACTOR FROM factor_costo WHERE FACO_FECINI <= :FECHA AND FACO_FECFIN >= :FECHA INTO :FACCOST;
                COSTOUNIT = COSTOUNIT * FACCOST;

                COSTO = COSTO + costounit * cantdet;
                END
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            EXECUTE PROCEDURE costo_promedio (:ARTICULO, :FECFIN) RETURNING_VALUES (:COSTOUNIT);
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            if (CEROS = 'S') then
                INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (3, USER, :ARTICULO);
            SUSPEND;
            END /* FOR */
        if (CEROS = 'S') then
            BEGIN
            COSTO = 0;
            UTILIDAD = 0;
            PORC = 0;
            /* agregue los articulos sin factura */
            FOR SELECT ARTI_COD, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN
                INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                DO
                BEGIN
                SELECT COUNT(REPA_ARTICULO) FROM REPORTES_AUX WHERE REPA_ID = 3 AND REPA_USER = USER AND REPA_ARTICULO = :articulo INTO :numrows;
                if (numrows = 0) then
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        END
    END
ELSE
    BEGIN
    if (BIN_AND(TIPO, 1) <> 0) then
            BEGIN
            SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 31 INTO :NOMTIPO;
            FOR SELECT F.PREF_PRE, FACT_NUMERO, FACT_FECHA, ARTI_COD, FADE_CANT * FADE_FACTOR, (FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO)*FACT_FACTOR,
                FADE_IVAMONTO*FACT_FACTOR, FADE_DTOPORC, FADE_TOTAL*FACT_FACTOR, F.terc_nit, F.fact_nomcliente, f.fact_sucursal
                FROM FACTURAS F, FACTURAS_DETALLE D, PREFIJOS P
                WHERE F.FACT_ID = D.FACT_ID AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND F.TERC_NIT >= :TERINI AND F.TERC_NIT <= :TERFIN AND FACT_ANULADO = 'N'
                 AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) and substring(D.arti_cod from 1 FOR 2) <> '.t'
                ORDER BY f.terc_nit, f.fact_sucursal, ARTI_COD, FACT_FECHA, F.FACT_ID, FADE_ITEM
                INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :DTO, :TOTAL, :NIT, :nombre, :sucursal
                DO
                BEGIN
                SELECT ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO WHERE ARTI_COD = :ARTICULO
                    INTO :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC;
                SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                EXECUTE PROCEDURE costo_promedio (:ARTICULO, :FECHA) RETURNING_VALUES (:COSTOUNIT);
                /* EL FACTOR */
                FACCOST = 1;
                SELECT FIRST 1 FACO_FACTOR FROM factor_costo WHERE FACO_FECINI <= :FECHA AND FACO_FECFIN >= :FECHA INTO :FACCOST;
                COSTOUNIT = COSTOUNIT * FACCOST;

                COSTO = COSTOUNIT * CANTIDAD;
                UTILIDAD = BASE - COSTO;
                if (UOM = 'UTILIDAD') then
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                else
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
                SUSPEND;
                END
            END
    if (BIN_AND(TIPO, 2) <> 0) then
            BEGIN
            SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 32 INTO :NOMTIPO;
            FOR SELECT R.PREF_PRE, REVT_NUMERO, REVT_FECHA, ARTI_COD, RVDE_CANT * RVDE_FACTOR,
                (RVDE_TOTAL - RVDE_IVAMONTO), RVDE_IVAMONTO, RVDE_DTOPORC, RVDE_TOTAL, R.terc_nit, R.revt_nomterc, r.revt_sucursal
                FROM REMISIONES_VENTA R, REMISIONES_VENTA_DETALLE D, PREFIJOS P
                WHERE R.REVT_ID = D.REVT_ID AND REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN AND R.TERC_NIT >= :TERINI AND R.TERC_NIT <= :TERFIN AND REVT_ANULADO = 'N'
                 AND P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = 32 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                ORDER BY r.terc_nit, r.revt_sucursal, ARTI_COD, REVT_FECHA, R.REVT_ID, RVDE_ITEM
                INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :DTO, :TOTAL, :NIT, :nombre, :sucursal
                DO
                BEGIN
                SELECT ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO WHERE ARTI_COD = :ARTICULO
                    INTO :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC;
                SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                EXECUTE PROCEDURE costo_promedio (:ARTICULO, :FECHA) RETURNING_VALUES (:COSTOUNIT);
                /* EL FACTOR */
                FACCOST = 1;
                SELECT FIRST 1 FACO_FACTOR FROM factor_costo WHERE FACO_FECINI <= :FECHA AND FACO_FECFIN >= :FECHA INTO :FACCOST;
                COSTOUNIT = COSTOUNIT * FACCOST;

                COSTO = COSTOUNIT * CANTIDAD;
                UTILIDAD = BASE - COSTO;
                if (UOM = 'UTILIDAD') then
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                else
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
                SUSPEND;
                END
            END
    if (BIN_AND(TIPO, 4) <> 0) then
            BEGIN
            SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 33 INTO :NOMTIPO;
            FOR SELECT V.PREF_PRE, DEVT_NUMERO, DEVT_FECHA, ARTI_COD, DVDE_CANT * DVDE_FACTOR, (DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO)*DEVT_FACTOR,
                DVDE_IVAMONTO*DEVT_FACTOR, DVDE_DTOPORC, DVDE_TOTAL*DEVT_FACTOR, V.terc_nit, V.devt_nomterc, v.devt_sucursal
                FROM DEVOLUCIONES_VENTAS V, DEVOLUCIONES_VENTAS_DETALLE D, PREFIJOS P
                WHERE V.DEVT_ID = D.DEVT_ID AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND V.TERC_NIT >= :TERINI AND V.TERC_NIT <= :TERFIN AND DEVT_ANULADO = 'N'
                 AND P.PREF_PRE = V.PREF_PRE AND P.TIDO_COD = 33 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))  and substring(D.arti_cod from 1 FOR 2) <> '.t'
                ORDER BY v.terc_nit, v.devt_sucursal, ARTI_COD, DEVT_FECHA, D.DEVT_ID, DVDE_ITEM
                INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :DTO, :TOTAL, :NIT, :nombre, :sucursal
                DO
                BEGIN
                SELECT ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO WHERE ARTI_COD = :ARTICULO
                    INTO :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC;
                SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                EXECUTE PROCEDURE costo_promedio (:ARTICULO, :FECHA) RETURNING_VALUES (:COSTOUNIT);
                /* EL FACTOR */
                FACCOST = 1;
                SELECT FIRST 1 FACO_FACTOR FROM factor_costo WHERE FACO_FECINI <= :FECHA AND FACO_FECFIN >= :FECHA INTO :FACCOST;
                COSTOUNIT = COSTOUNIT * FACCOST;

                COSTO = COSTOUNIT * CANTIDAD;
                UTILIDAD = BASE - COSTO;
                if (UOM = 'UTILIDAD') then
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                else
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
                TOTAL = TOTAL * -1;
                IVA = IVA * -1;
                BASE = BASE * -1;
                CANTIDAD = CANTIDAD * -1;
                COSTO = COSTO * -1;
                UTILIDAD = UTILIDAD * -1;
                SUSPEND;
                END
            END
    if (BIN_AND(TIPO, 8) <> 0) then
            BEGIN
            SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 34 INTO :NOMTIPO;
            FOR SELECT P.PREF_PRE, PEDI_NUMERO, PEDI_FECHA, ARTI_COD, PEDE_CANT * PEDE_FACTOR, (PEDE_TOTAL-PEDE_IVAMONTO-PEDE_CONSUMO)*PEDI_FACTOR,
                PEDE_IVAMONTO*PEDI_FACTOR, PEDE_DTOPORC, PEDE_TOTAL*PEDI_FACTOR, P.terc_nit, P.pedi_nomterc, p.pedi_sucursal
                FROM PEDIDOS P, PEDIDOS_DETALLE D, PREFIJOS PR
                WHERE P.PEDI_ID = D.PEDI_ID AND PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND P.TERC_NIT >= :TERINI AND P.TERC_NIT <= :TERFIN AND PEDI_ANULADO = 'N'
                 AND P.PREF_PRE = PR.PREF_PRE AND P.TIDO_COD = 34 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                ORDER BY p.terc_nit, p.pedi_sucursal, ARTI_COD, PEDI_FECHA, P.PEDI_ID, PEDE_ITEM
                INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :DTO, :TOTAL, :NIT, :nombre, :sucursal
                DO
                BEGIN
                SELECT ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO WHERE ARTI_COD = :ARTICULO
                    INTO :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC;
                SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                EXECUTE PROCEDURE costo_promedio (:ARTICULO, :FECHA) RETURNING_VALUES (:COSTOUNIT);
                /* EL FACTOR */
                FACCOST = 1;
                SELECT FIRST 1 FACO_FACTOR FROM factor_costo WHERE FACO_FECINI <= :FECHA AND FACO_FECFIN >= :FECHA INTO :FACCOST;
                COSTOUNIT = COSTOUNIT * FACCOST;

                COSTO = COSTOUNIT * CANTIDAD;
                UTILIDAD = BASE - COSTO;
                if (UOM = 'UTILIDAD') then
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                else
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
                SUSPEND;
                END
            END
    if (BIN_AND(TIPO, 16) <> 0) then
            BEGIN
            SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 35 INTO :NOMTIPO;
            FOR SELECT C.PREF_PRE, COTI_NUMERO, COTI_FECHA, ARTI_COD, CTDE_CANT * CTDE_FACTOR, (CTDE_TOTAL-CTDE_IVAMONTO-CTDE_CONSUMO)*COTI_FACTOR,
                CTDE_IVAMONTO*COTI_FACTOR, CTDE_DTOPORC, CTDE_TOTAL*COTI_FACTOR, C.terc_nit, C.coti_nomterc, c.coti_sucursal
                FROM COTIZACIONES C, COTIZACIONES_DETALLE D, PREFIJOS P
                WHERE C.COTI_ID = D.COTI_ID AND ARTI_COD = :ARTICULO AND COTI_FECHA >= :FECINI AND COTI_FECHA <= :FECFIN AND C.TERC_NIT >= :TERINI AND C.TERC_NIT <= :TERFIN AND COTI_ANULADO = 'N'
                 AND P.PREF_PRE = C.PREF_PRE AND P.TIDO_COD = 35 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                ORDER BY c.terc_nit, c.coti_sucursal, COTI_FECHA, C.COTI_ID, CTDE_ITEM
                INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :DTO, :TOTAL, :NIT, :nombre, :sucursal
                DO
                BEGIN
                SELECT ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO WHERE ARTI_COD = :ARTICULO
                    INTO :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC;
                SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                EXECUTE PROCEDURE costo_promedio (:ARTICULO, :FECHA) RETURNING_VALUES (:COSTOUNIT);
                /* EL FACTOR */
                FACCOST = 1;
                SELECT FIRST 1 FACO_FACTOR FROM factor_costo WHERE FACO_FECINI <= :FECHA AND FACO_FECFIN >= :FECHA INTO :FACCOST;
                COSTOUNIT = COSTOUNIT * FACCOST;

                COSTO = COSTOUNIT * CANTIDAD;
                UTILIDAD = BASE - COSTO;
                if (UOM = 'UTILIDAD') then
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                else
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
                SUSPEND;
                END
            END
    END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure REP_UTILIDAD_VENDEDOR (
    TIPO integer,
    DETALLE char(1),
    VENINI varchar(20),
    VENFIN varchar(20),
    FECINI date,
    FECFIN date,
    ARTINI varchar(15),
    ARTFIN varchar(15),
    ORDEN char(1),
    CEROS char(1),
    SUBEMPRESA integer)
returns (
    CODVEND varchar(20),
    NOMVEND varchar(60),
    NOMTIPO varchar(50),
    ARTICULO varchar(15),
    DESCRIPCION varchar(60),
    CODGRUPO varchar(2),
    NOMGRUPO varchar(30),
    CODSUBG varchar(3),
    NOMSUBG varchar(30),
    CODMARC varchar(3),
    NOMMARC varchar(30),
    UNIDAD varchar(8),
    CANTIDAD numeric(18,4),
    BASE numeric(18,2),
    IVA numeric(18,2),
    CONSUMO numeric(18,2),
    COSTO numeric(18,2),
    UTILIDAD numeric(18,4),
    PORC numeric(9,2),
    TOTAL numeric(18,2),
    LISTA numeric(18,2),
    PREFIJO varchar(4),
    NUMERO varchar(6),
    FECHA date,
    DTO numeric(9,2))
AS
DECLARE VARIABLE COSTOUNIT NUMERIC(18,4);
DECLARE VARIABLE CANTDET NUMERIC(18,4);
DECLARE VARIABLE CODINI VARCHAR(15);
DECLARE VARIABLE CODFIN VARCHAR(15);
DECLARE VARIABLE DESINI VARCHAR(15);
DECLARE VARIABLE DESFIN VARCHAR(15);
declare variable UOM VARCHAR(20);
declare variable CODLISTA INTEGER;
declare variable ID INTEGER;
declare variable ITEM INTEGER;
declare variable FACCOST NUMERIC(18,4);
BEGIN
if (ORDEN = 'C') then
    BEGIN
    CODINI = ARTINI;
    CODFIN = ARTFIN;
    DESINI = '';
    DESFIN = 'zz';
    END
ELSE
    BEGIN
    DESINI = ARTINI;
    DESFIN = ARTFIN;
    CODINI = '';
    CODFIN = 'zz';
    END
  EXECUTE PROCEDURE lee_configuracion ('FACTURACION', 'ARTICULOS', 'SUGERIR PRECIOS CON PORCENTAJE DE MARGEN O UTILIDAD') returning_values (:UOM);
  SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = :TIPO INTO :NOMTIPO;
  FOR select VEND_COD, VEND_NOMBRE
    from VENDEDORES
    where VEND_COD >= :VENINI AND VEND_COD <= :VENFIN
    INTO :CODVEND, :NOMVEND
    DO  
    BEGIN
    if (DETALLE = 'N') then
        BEGIN
        if (BIN_AND(TIPO, 1) <> 0) then
            BEGIN
            SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 31 INTO :NOMTIPO;
            /* BORRA LA TABLA AUXILIAR */
            DELETE FROM reportes_aux WHERE REPA_ID = 4 AND REPA_USER = USER;
            FOR SELECT MAX(D.ARTI_COD), SUM(FADE_CANT * FADE_FACTOR), SUM(FACT_FACTOR*(FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO)),
                SUM(FACT_FACTOR*FADE_IVAMONTO), SUM(FACT_FACTOR*FADE_TOTAL), SUM(FADE_CONSUMO),
                MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD)
                FROM FACTURAS_DETALLE D, FACTURAS F, PREFIJOS P, ARTICULO A
                WHERE F.FACT_ID = D.FACT_ID AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND VEND_COD = :CODVEND AND FACT_ANULADO = 'N'
                 AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) and substring(D.arti_cod from 1 FOR 2) <> '.t'
                 AND D.ARTI_COD = A.arti_cod AND A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN
                GROUP BY D.ARTI_COD
                INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :TOTAL, :CONSUMO,
                    :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                DO
                BEGIN
                COSTO = 0;
                FOR SELECT F.FACT_ID, FADE_ITEM, FADE_CANT * FADE_FACTOR, FACT_FECHA FROM FACTURAS_DETALLE D, FACTURAS F, PREFIJOS P
                    WHERE F.VEND_COD = :codvend AND F.FACT_ID = D.FACT_ID AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND
                    FACT_ANULADO = 'N' AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                    and D.ARTI_COD = :articulo  INTO :ID, :ITEM, :cantdet, :fecha
                    DO
                    BEGIN
                    if (EXISTS (SELECT COST_SALP / COST_SALC FROM COSTOS C, MOVIMIENTO_ARTICULO M
                        WHERE C.arti_cod = M.arti_cod AND COST_IDMOV = MVAR_CONS AND MVAR_TIPODOC = 31 AND MVAR_IDREF = :ID AND COST_SALC <> 0 AND MVAR_ITEM = :ITEM)) then
                        SELECT COST_SALP / COST_SALC FROM COSTOS C, MOVIMIENTO_ARTICULO M
                            WHERE C.arti_cod = M.arti_cod AND COST_IDMOV = MVAR_CONS AND MVAR_TIPODOC = 31 AND MVAR_IDREF = :ID AND COST_SALC <> 0 AND MVAR_ITEM = :ITEM INTO :costounit;
                    else
                        EXECUTE PROCEDURE COSTO_PROMEDIO(:ARTICULO, :FECHA) returning_values (:costounit);
                    /* EL FACTOR */
                    FACCOST = 1;
                    SELECT FIRST 1 FACO_FACTOR FROM factor_costo WHERE FACO_FECINI <= :FECHA AND FACO_FECFIN >= :FECHA INTO :FACCOST;
                    COSTOUNIT = COSTOUNIT * FACCOST;

                    COSTO = COSTO + costounit * cantdet;
                    END
                SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                if (CANTIDAD IS NULL) then
                    CANTIDAD = 0;
                if (BASE IS NULL) then
                    BASE = 0;
                if (IVA IS NULL) then
                    IVA = 0;
                UTILIDAD = BASE - COSTO;
                if (UOM = 'UTILIDAD') then
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                else
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
                if (CEROS = 'S') then
                    begin
                    INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (4, USER, :ARTICULO);
                    SUSPEND;
                    end
                ELSE
                    if ((BASE <> 0) AND (CANTIDAD <> 0)) then
                        SUSPEND;
                END
            if (CEROS = 'S') then
                BEGIN
                COSTO = 0;
                UTILIDAD = 0;
                PORC = 0;
                /* agregue los articulos sin factura */
                FOR SELECT ARTI_COD, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN and
                    not exists (select REPA_ARTICULO FROM REPORTES_AUX WHERE REPA_ID = 4 AND REPA_USER = USER AND REPA_ARTICULO = a.arti_cod)
                    INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                    DO
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        if (BIN_AND(TIPO, 2) <> 0) then
            BEGIN
            SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 32 INTO :NOMTIPO;
            FOR SELECT MAX(D.ARTI_COD), SUM(RVDE_CANT * RVDE_FACTOR), SUM(RVDE_TOTAL-RVDE_IVAMONTO-RVDE_CONSUMO), SUM(RVDE_IVAMONTO), SUM(RVDE_TOTAL), SUM(RVDE_CONSUMO),
                MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD)
                FROM REMISIONES_VENTA_DETALLE D, REMISIONES_VENTA R, PREFIJOS P, ARTICULO A
                WHERE R.REVT_ID = D.REVT_ID AND REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN AND VEND_COD = :CODVEND AND REVT_ANULADO = 'N'
                 AND P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = 32 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                 AND D.ARTI_COD = A.arti_cod AND A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN
                GROUP BY D.ARTI_COD
                INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :TOTAL, :CONSUMO,
                    :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                DO
                BEGIN
                COSTO = 0;
                FOR SELECT F.REVT_ID, RVDE_ITEM, RVDE_CANT * RVDE_FACTOR, REVT_FECHA FROM remisiones_venta_detalle D, remisiones_venta F, PREFIJOS P
                    WHERE F.VEND_COD = :codvend AND F.revt_id = D.revt_id AND REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN AND
                    REVT_ANULADO = 'N' AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 32 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                    and D.ARTI_COD = :articulo  INTO :ID, :ITEM, :cantdet, :fecha
                    DO
                    BEGIN
                    if (EXISTS (SELECT COST_SALP / COST_SALC FROM COSTOS C, MOVIMIENTO_ARTICULO M
                        WHERE C.arti_cod = M.arti_cod AND COST_IDMOV = MVAR_CONS AND MVAR_TIPODOC = 32 AND MVAR_IDREF = :ID AND COST_SALC <> 0 AND MVAR_ITEM = :ITEM)) then
                        SELECT COST_SALP / COST_SALC FROM COSTOS C, MOVIMIENTO_ARTICULO M
                            WHERE C.arti_cod = M.arti_cod AND COST_IDMOV = MVAR_CONS AND MVAR_TIPODOC = 32 AND MVAR_IDREF = :ID AND COST_SALC <> 0 AND MVAR_ITEM = :ITEM INTO :costounit;
                    else
                        EXECUTE PROCEDURE COSTO_PROMEDIO(:ARTICULO, :FECHA) returning_values (:costounit);
                    /* EL FACTOR */
                    FACCOST = 1;
                    SELECT FIRST 1 FACO_FACTOR FROM factor_costo WHERE FACO_FECINI <= :FECHA AND FACO_FECFIN >= :FECHA INTO :FACCOST;
                    COSTOUNIT = COSTOUNIT * FACCOST;

                    COSTO = COSTO + costounit * cantdet;
                    END
                SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                if (CANTIDAD IS NULL) then
                    CANTIDAD = 0;
                if (BASE IS NULL) then
                    BASE = 0;
                if (IVA IS NULL) then
                    IVA = 0;
                UTILIDAD = BASE - COSTO;
                if (UOM = 'UTILIDAD') then
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                else
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
                if (CEROS = 'S') then
                    begin
                    INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (4, USER, :ARTICULO);
                    SUSPEND;
                    end
                ELSE
                    if ((BASE <> 0) AND (CANTIDAD <> 0)) then
                        SUSPEND;
                END
            if (CEROS = 'S') then
                BEGIN
                COSTO = 0;
                UTILIDAD = 0;
                PORC = 0;
                /* agregue los articulos sin factura */
                FOR SELECT ARTI_COD, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN and
                    not exists (select REPA_ARTICULO FROM REPORTES_AUX WHERE REPA_ID = 4 AND REPA_USER = USER AND REPA_ARTICULO = a.arti_cod)
                    INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                    DO
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        if (BIN_AND(TIPO, 4) <> 0) then
            BEGIN
            SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 33 INTO :NOMTIPO;
            FOR SELECT MAX(D.ARTI_COD), SUM(DVDE_CANT * DVDE_FACTOR), SUM(DEVT_FACTOR*(DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO)),
                SUM(DEVT_FACTOR*DVDE_IVAMONTO), SUM(DEVT_FACTOR*DVDE_TOTAL), SUM(DVDE_CONSUMO),
                MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD)
                FROM devoluciones_ventas_detalle D, DEVOLUCIONES_VENTAS V, PREFIJOS P, ARTICULO A
                WHERE V.DEVT_ID = D.DEVT_ID AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND VEND_COD = :CODVEND AND DEVT_ANULADO = 'N'
                 AND P.PREF_PRE = V.PREF_PRE AND P.TIDO_COD = 33 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) and substring(D.arti_cod from 1 FOR 2) <> '.t'
                 AND D.ARTI_COD = A.arti_cod AND A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN
                GROUP BY D.ARTI_COD
                INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :TOTAL, :CONSUMO,
                    :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                DO
                BEGIN
                COSTO = 0;
                FOR SELECT F.DEVT_ID, DVDE_ITEM, DVDE_CANT * DVDE_FACTOR, DEVT_FECHA FROM devoluciones_ventas_detalle D, devoluciones_ventas F, PREFIJOS P
                    WHERE F.VEND_COD = :codvend AND F.devt_id = D.devt_id AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND
                    DEVT_ANULADO = 'N' AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 33 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                    and D.ARTI_COD = :articulo  INTO :ID, :ITEM, :cantdet, :fecha
                    DO
                    BEGIN
                    if (EXISTS (SELECT COST_ENTP / COST_ENTC FROM COSTOS C, MOVIMIENTO_ARTICULO M
                        WHERE C.arti_cod = M.arti_cod AND COST_IDMOV = MVAR_CONS AND MVAR_TIPODOC = 33 AND MVAR_IDREF = :ID AND COST_ENTC <> 0 AND MVAR_ITEM = :ITEM)) then
                        SELECT COST_ENTP / COST_ENTC FROM COSTOS C, MOVIMIENTO_ARTICULO M
                            WHERE C.arti_cod = M.arti_cod AND COST_IDMOV = MVAR_CONS AND MVAR_TIPODOC = 33 AND MVAR_IDREF = :ID AND COST_ENTC <> 0 AND MVAR_ITEM = :ITEM INTO :costounit;
                    else
                        EXECUTE PROCEDURE COSTO_PROMEDIO(:ARTICULO, :FECHA) returning_values (:costounit);
                    /* EL FACTOR */
                    FACCOST = 1;
                    SELECT FIRST 1 FACO_FACTOR FROM factor_costo WHERE FACO_FECINI <= :FECHA AND FACO_FECFIN >= :FECHA INTO :FACCOST;
                    COSTOUNIT = COSTOUNIT * FACCOST;

                    COSTO = COSTO + costounit * cantdet;
                    END
                SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                if (CANTIDAD IS NULL) then
                    CANTIDAD = 0;
                if (BASE IS NULL) then
                    BASE = 0;
                if (IVA IS NULL) then
                    IVA = 0;
                UTILIDAD = BASE - COSTO;
                if (UOM = 'UTILIDAD') then
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                else
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
                TOTAL = TOTAL * -1;
                IVA = IVA * -1;
                BASE = BASE * -1;
                CANTIDAD = CANTIDAD * -1;
                COSTO = COSTO * -1;
                UTILIDAD = UTILIDAD * -1;
                if (CEROS = 'S') then
                    begin
                    INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (4, USER, :ARTICULO);
                    SUSPEND;
                    end
                ELSE
                    if ((BASE <> 0) AND (CANTIDAD <> 0)) then
                        SUSPEND;
                END
            if (CEROS = 'S') then
                BEGIN
                COSTO = 0;
                UTILIDAD = 0;
                PORC = 0;
                /* agregue los articulos sin factura */
                FOR SELECT ARTI_COD, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN and
                    not exists (select REPA_ARTICULO FROM REPORTES_AUX WHERE REPA_ID = 4 AND REPA_USER = USER AND REPA_ARTICULO = a.arti_cod)
                    INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                    DO
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        if (BIN_AND(TIPO, 8) <> 0) then
            BEGIN
            SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 34 INTO :NOMTIPO;
            FOR SELECT MAX(D.ARTI_COD), SUM(PEDE_CANT * PEDE_FACTOR), SUM(PEDI_FACTOR*(PEDE_TOTAL-PEDE_IVAMONTO-PEDE_CONSUMO)),
                SUM(PEDI_FACTOR*PEDE_IVAMONTO), SUM(PEDI_FACTOR*PEDE_TOTAL), SUM(PEDE_CONSUMO),
                MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD)
                FROM PEDIDOS_DETALLE D, PEDIDOS P, PREFIJOS PR, articulo A
                WHERE P.PEDI_ID = D.PEDI_ID AND PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND VEND_COD = :CODVEND AND PEDI_ANULADO = 'N'
                 AND PR.PREF_PRE = P.PREF_PRE AND P.TIDO_COD = 34 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                 AND D.ARTI_COD = A.arti_cod AND A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN
                GROUP BY D.ARTI_COD
                INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :TOTAL, :CONSUMO,
                    :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                DO
                BEGIN
                COSTO = 0;
                FOR SELECT PEDE_CANT * PEDE_FACTOR, PEDI_FECHA FROM pedidos_detalle D, PEDIDOS F, PREFIJOS P
                    WHERE F.VEND_COD = :codvend AND F.pedi_id = D.pedi_id AND PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND
                    PEDI_ANULADO = 'N' AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 34 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                    and D.ARTI_COD = :articulo  INTO :cantdet, :fecha
                    DO
                    BEGIN
                    EXECUTE PROCEDURE COSTO_PROMEDIO(:ARTICULO, :FECHA) returning_values (:costounit);
                    /* EL FACTOR */
                    FACCOST = 1;
                    SELECT FIRST 1 FACO_FACTOR FROM factor_costo WHERE FACO_FECINI <= :FECHA AND FACO_FECFIN >= :FECHA INTO :FACCOST;
                    COSTOUNIT = COSTOUNIT * FACCOST;

                    COSTO = COSTO + costounit * cantdet;
                    END
                SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                if (CANTIDAD IS NULL) then
                    CANTIDAD = 0;
                if (BASE IS NULL) then
                    BASE = 0;
                if (IVA IS NULL) then
                    IVA = 0;
                UTILIDAD = BASE - COSTO;
                if (UOM = 'UTILIDAD') then
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                else
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
                if (CEROS = 'S') then
                    begin
                    INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (4, USER, :ARTICULO);
                    SUSPEND;
                    end
                ELSE
                    if ((BASE <> 0) AND (CANTIDAD <> 0)) then
                        SUSPEND;
                END
            if (CEROS = 'S') then
                BEGIN
                COSTO = 0;
                UTILIDAD = 0;
                PORC = 0;
                /* agregue los articulos sin factura */
                FOR SELECT ARTI_COD, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN and
                    not exists (select REPA_ARTICULO FROM REPORTES_AUX WHERE REPA_ID = 4 AND REPA_USER = USER AND REPA_ARTICULO = a.arti_cod)
                    INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                    DO
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        if (BIN_AND(TIPO, 16) <> 0) then
            BEGIN
            SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 35 INTO :NOMTIPO;
            FOR SELECT MAX(D.ARTI_COD), SUM(CTDE_CANT * CTDE_FACTOR), SUM(COTI_FACTOR*(CTDE_TOTAL-CTDE_IVAMONTO-CTDE_CONSUMO)),
                SUM(COTI_FACTOR*CTDE_IVAMONTO), SUM(COTI_FACTOR*CTDE_TOTAL), SUM(CTDE_CONSUMO),
                MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD)
                FROM COTIZACIONES_DETALLE D, COTIZACIONES C, PREFIJOS P, ARTICULO A
                WHERE C.COTI_ID = D.COTI_ID AND COTI_FECHA >= :FECINI AND COTI_FECHA <= :FECFIN AND VEND_COD = :CODVEND AND COTI_ANULADO = 'N'
                 AND P.PREF_PRE = C.PREF_PRE AND P.TIDO_COD = 35 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                 AND D.ARTI_COD = A.arti_cod AND A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN
                GROUP BY D.ARTI_COD
                INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :TOTAL, :CONSUMO,
                    :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                DO
                BEGIN
                COSTO = 0;
                FOR SELECT PEDE_CANT * PEDE_FACTOR, PEDI_FECHA FROM pedidos_detalle D, PEDIDOS F, PREFIJOS P
                    WHERE F.VEND_COD = :codvend AND F.pedi_id = D.pedi_id AND PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND
                    PEDI_ANULADO = 'N' AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 34 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                    and D.ARTI_COD = :articulo  INTO :cantdet, :fecha
                    DO
                    BEGIN
                    EXECUTE PROCEDURE COSTO_PROMEDIO(:ARTICULO, :FECHA) returning_values (:costounit);
                    /* EL FACTOR */
                    FACCOST = 1;
                    SELECT FIRST 1 FACO_FACTOR FROM factor_costo WHERE FACO_FECINI <= :FECHA AND FACO_FECFIN >= :FECHA INTO :FACCOST;
                    COSTOUNIT = COSTOUNIT * FACCOST;

                    COSTO = COSTO + costounit * cantdet;
                    END
                SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                if (CANTIDAD IS NULL) then
                    CANTIDAD = 0;
                if (BASE IS NULL) then
                    BASE = 0;
                if (IVA IS NULL) then
                    IVA = 0;
                COSTO = CANTIDAD * COSTOUNIT;
                UTILIDAD = BASE - COSTO;
                if (UOM = 'UTILIDAD') then
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                else
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
                if (CEROS = 'S') then
                    begin
                    INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (4, USER, :ARTICULO);
                    SUSPEND;
                    end
                ELSE
                    if ((BASE <> 0) AND (CANTIDAD <> 0)) then
                        SUSPEND;
                END
            if (CEROS = 'S') then
                BEGIN
                COSTO = 0;
                UTILIDAD = 0;
                PORC = 0;
                /* agregue los articulos sin factura */
                FOR SELECT ARTI_COD, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN and
                    not exists (select REPA_ARTICULO FROM REPORTES_AUX WHERE REPA_ID = 4 AND REPA_USER = USER AND REPA_ARTICULO = a.arti_cod)
                    INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                    DO
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        END
    ELSE
        BEGIN
        if (BIN_AND(TIPO, 1) <> 0) then
            BEGIN
            SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 31 INTO :NOMTIPO;
            FOR SELECT F.fact_id, D.fade_item, F.PREF_PRE, FACT_NUMERO, FACT_FECHA, ARTI_COD, FADE_CANT * FADE_FACTOR, (FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO)*FACT_FACTOR,
                FADE_IVAMONTO*FACT_FACTOR, FADE_DTOPORC, FADE_TOTAL*FACT_FACTOR, FADE_CONSUMO, D.lipr_cod
                FROM FACTURAS F, FACTURAS_DETALLE D, PREFIJOS P
                WHERE F.FACT_ID = D.FACT_ID AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND VEND_COD = :CODVEND AND FACT_ANULADO = 'N'
                 AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) and substring(D.arti_cod from 1 FOR 2) <> '.t'
                ORDER BY ARTI_COD, FACT_FECHA, F.FACT_ID, FADE_ITEM
                INTO :ID, :ITEM, :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :DTO, :TOTAL, :CONSUMO, :codlista
                DO
                BEGIN
                SELECT ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO WHERE ARTI_COD = :ARTICULO
                    INTO :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC;
                SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                if (EXISTS (SELECT COST_SALP / COST_SALC FROM COSTOS C, MOVIMIENTO_ARTICULO M
                    WHERE C.arti_cod = M.arti_cod AND COST_IDMOV = MVAR_CONS AND MVAR_TIPODOC = 31 AND MVAR_IDREF = :ID AND COST_SALC <> 0 AND MVAR_ITEM = :ITEM)) then
                    SELECT COST_SALP / COST_SALC FROM COSTOS C, MOVIMIENTO_ARTICULO M
                        WHERE C.arti_cod = M.arti_cod AND COST_IDMOV = MVAR_CONS AND MVAR_TIPODOC = 31 AND MVAR_IDREF = :ID AND COST_SALC <> 0 AND MVAR_ITEM = :ITEM INTO :costounit;
                else
                    EXECUTE PROCEDURE costo_promedio (:ARTICULO, :FECHA) RETURNING_VALUES (:COSTOUNIT);
                /* EL FACTOR */
                FACCOST = 1;
                SELECT FIRST 1 FACO_FACTOR FROM factor_costo WHERE FACO_FECINI <= :FECHA AND FACO_FECFIN >= :FECHA INTO :FACCOST;
                COSTOUNIT = COSTOUNIT * FACCOST;

                LISTA = 0;
                SELECT PRAR_FIJO FROM precios_articulo WHERE LIPR_COD = :CODLISTA AND ARTI_COD = :ARTICULO INTO :LISTA;
                COSTO = COSTOUNIT * CANTIDAD;
                UTILIDAD = BASE - COSTO;
                if (UOM = 'UTILIDAD') then
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                else
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
                if (CEROS = 'S') then
                    INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (4, USER, :ARTICULO);
                SUSPEND;
                END
            if (CEROS = 'S') then
                BEGIN
                COSTO = 0;
                UTILIDAD = 0;
                PORC = 0;
                /* agregue los articulos sin factura */
                FOR SELECT ARTI_COD, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN and
                    not exists (select REPA_ARTICULO FROM REPORTES_AUX WHERE REPA_ID = 4 AND REPA_USER = USER AND REPA_ARTICULO = a.arti_cod)
                    INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                    DO
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        if (BIN_AND(TIPO, 2) <> 0) then
            BEGIN
            SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 32 INTO :NOMTIPO;
            FOR SELECT R.REVT_ID, RVDE_ITEM, R.PREF_PRE, REVT_NUMERO, REVT_FECHA, ARTI_COD, RVDE_CANT * RVDE_FACTOR, (RVDE_TOTAL - RVDE_IVAMONTO), RVDE_IVAMONTO, RVDE_DTOPORC, RVDE_TOTAL, RVDE_CONSUMO, D.lipr_cod
                FROM REMISIONES_VENTA R, REMISIONES_VENTA_DETALLE D, PREFIJOS P
                WHERE R.REVT_ID = D.REVT_ID AND REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN AND VEND_COD = :CODVEND AND REVT_ANULADO = 'N'
                 AND P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = 32 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) and substring(D.arti_cod from 1 FOR 2) <> '.t'
                ORDER BY ARTI_COD, REVT_FECHA, R.REVT_ID, RVDE_ITEM
                INTO :ID, :ITEM, :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :DTO, :TOTAL, :CONSUMO, :codlista
                DO
                BEGIN
                SELECT ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO WHERE ARTI_COD = :ARTICULO
                    INTO :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC;
                SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                if (EXISTS (SELECT COST_SALP / COST_SALC FROM COSTOS C, MOVIMIENTO_ARTICULO M
                    WHERE C.arti_cod = M.arti_cod AND COST_IDMOV = MVAR_CONS AND MVAR_TIPODOC = 32 AND MVAR_IDREF = :ID AND COST_SALC <> 0 AND MVAR_ITEM = :ITEM)) then
                    SELECT COST_SALP / COST_SALC FROM COSTOS C, MOVIMIENTO_ARTICULO M
                        WHERE C.arti_cod = M.arti_cod AND COST_IDMOV = MVAR_CONS AND MVAR_TIPODOC = 32 AND MVAR_IDREF = :ID AND COST_SALC <> 0 AND MVAR_ITEM = :ITEM INTO :costounit;
                else
                    EXECUTE PROCEDURE costo_promedio (:ARTICULO, :FECHA) RETURNING_VALUES (:COSTOUNIT);
                /* EL FACTOR */
                FACCOST = 1;
                SELECT FIRST 1 FACO_FACTOR FROM factor_costo WHERE FACO_FECINI <= :FECHA AND FACO_FECFIN >= :FECHA INTO :FACCOST;
                COSTOUNIT = COSTOUNIT * FACCOST;

                LISTA = 0;
                SELECT PRAR_FIJO FROM precios_articulo WHERE LIPR_COD = :CODLISTA AND ARTI_COD = :ARTICULO INTO :LISTA;
                COSTO = COSTOUNIT * CANTIDAD;
                UTILIDAD = BASE - COSTO;
                if (UOM = 'UTILIDAD') then
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                else
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
                if (CEROS = 'S') then
                    INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (4, USER, :ARTICULO);
                SUSPEND;
                END
            if (CEROS = 'S') then
                BEGIN
                COSTO = 0;
                UTILIDAD = 0;
                PORC = 0;
                /* agregue los articulos sin factura */
                FOR SELECT ARTI_COD, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN and
                    not exists (select REPA_ARTICULO FROM REPORTES_AUX WHERE REPA_ID = 4 AND REPA_USER = USER AND REPA_ARTICULO = a.arti_cod)
                    INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                    DO
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        if (BIN_AND(TIPO, 4) <> 0) then
            BEGIN
            SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 33 INTO :NOMTIPO;
            FOR SELECT V.DEVT_ID, DVDE_ITEM, V.PREF_PRE, DEVT_NUMERO, DEVT_FECHA, ARTI_COD, DVDE_CANT * DVDE_FACTOR, (DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO)*DEVT_FACTOR,
                DVDE_IVAMONTO*DEVT_FACTOR, DVDE_DTOPORC, DVDE_TOTAL*DEVT_FACTOR, DVDE_CONSUMO
                FROM DEVOLUCIONES_VENTAS V, DEVOLUCIONES_VENTAS_DETALLE D, PREFIJOS P
                WHERE V.DEVT_ID = D.DEVT_ID AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND VEND_COD = :CODVEND AND DEVT_ANULADO = 'N'
                 AND P.PREF_PRE = V.PREF_PRE AND P.TIDO_COD = 33 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) and substring(D.arti_cod from 1 FOR 2) <> '.t'
                ORDER BY ARTI_COD, DEVT_FECHA, D.DEVT_ID, DVDE_ITEM
                INTO :ID, :ITEM, :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :DTO, :TOTAL, :CONSUMO
                DO
                BEGIN
                SELECT ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO WHERE ARTI_COD = :ARTICULO
                    INTO :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC;
                SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                if (EXISTS (SELECT COST_ENTP / COST_ENTC FROM COSTOS C, MOVIMIENTO_ARTICULO M
                    WHERE C.arti_cod = M.arti_cod AND COST_IDMOV = MVAR_CONS AND MVAR_TIPODOC = 33 AND MVAR_IDREF = :ID AND COST_ENTC <> 0 AND MVAR_ITEM = :ITEM)) then
                    SELECT COST_ENTP / COST_ENTC FROM COSTOS C, MOVIMIENTO_ARTICULO M
                        WHERE C.arti_cod = M.arti_cod AND COST_IDMOV = MVAR_CONS AND MVAR_TIPODOC = 33 AND MVAR_IDREF = :ID AND COST_ENTC <> 0 AND MVAR_ITEM = :ITEM INTO :costounit;
                else
                    EXECUTE PROCEDURE costo_promedio (:ARTICULO, :FECHA) RETURNING_VALUES (:COSTOUNIT);
                /* EL FACTOR */
                FACCOST = 1;
                SELECT FIRST 1 FACO_FACTOR FROM factor_costo WHERE FACO_FECINI <= :FECHA AND FACO_FECFIN >= :FECHA INTO :FACCOST;
                COSTOUNIT = COSTOUNIT * FACCOST;

                LISTA = 0;
                COSTO = COSTOUNIT * CANTIDAD;
                UTILIDAD = BASE - COSTO;
                if (UOM = 'UTILIDAD') then
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                else
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
                TOTAL = TOTAL * -1;
                IVA = IVA * -1;
                BASE = BASE * -1;
                CANTIDAD = CANTIDAD * -1;
                COSTO = COSTO * -1;
                UTILIDAD = UTILIDAD * -1;
                if (CEROS = 'S') then
                    INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (4, USER, :ARTICULO);
                SUSPEND;
                END
            if (CEROS = 'S') then
                BEGIN
                COSTO = 0;
                UTILIDAD = 0;
                PORC = 0;
                /* agregue los articulos sin factura */
                FOR SELECT ARTI_COD, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN and
                    not exists (select REPA_ARTICULO FROM REPORTES_AUX WHERE REPA_ID = 4 AND REPA_USER = USER AND REPA_ARTICULO = a.arti_cod)
                    INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                    DO
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        if (BIN_AND(TIPO, 8) <> 0) then
            BEGIN
            SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 34 INTO :NOMTIPO;
            FOR SELECT P.PREF_PRE, PEDI_NUMERO, PEDI_FECHA, ARTI_COD, PEDE_CANT * PEDE_FACTOR, (PEDE_TOTAL-PEDE_IVAMONTO-PEDE_CONSUMO)*PEDI_FACTOR,
                PEDE_IVAMONTO*PEDI_FACTOR, PEDE_DTOPORC, PEDE_TOTAL*PEDI_FACTOR, PEDE_CONSUMO, D.lipr_cod
                FROM PEDIDOS P, PEDIDOS_DETALLE D, PREFIJOS PR
                WHERE P.PEDI_ID = D.PEDI_ID AND PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND VEND_COD = :CODVEND AND PEDI_ANULADO = 'N'
                 AND P.PREF_PRE = PR.PREF_PRE AND P.TIDO_COD = 34 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                ORDER BY ARTI_COD, PEDI_FECHA, P.PEDI_ID, PEDE_ITEM
                INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :DTO, :TOTAL, :CONSUMO, :codlista
                DO
                BEGIN
                SELECT ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO WHERE ARTI_COD = :ARTICULO
                    INTO :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC;
                SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                EXECUTE PROCEDURE costo_promedio (:ARTICULO, :FECHA) RETURNING_VALUES (:COSTOUNIT);
                /* EL FACTOR */
                FACCOST = 1;
                SELECT FIRST 1 FACO_FACTOR FROM factor_costo WHERE FACO_FECINI <= :FECHA AND FACO_FECFIN >= :FECHA INTO :FACCOST;
                COSTOUNIT = COSTOUNIT * FACCOST;

                LISTA = 0;
                SELECT PRAR_FIJO FROM precios_articulo WHERE LIPR_COD = :CODLISTA AND ARTI_COD = :ARTICULO INTO :LISTA;
                COSTO = COSTOUNIT * CANTIDAD;
                UTILIDAD = BASE - COSTO;
                if (UOM = 'UTILIDAD') then
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                else
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
                if (CEROS = 'S') then
                    INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (4, USER, :ARTICULO);
                SUSPEND;
                END
            if (CEROS = 'S') then
                BEGIN
                COSTO = 0;
                UTILIDAD = 0;
                PORC = 0;
                /* agregue los articulos sin factura */
                FOR SELECT ARTI_COD, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN and
                    not exists (select REPA_ARTICULO FROM REPORTES_AUX WHERE REPA_ID = 4 AND REPA_USER = USER AND REPA_ARTICULO = a.arti_cod)
                    INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                    DO
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        if (BIN_AND(TIPO, 16) <> 0) then
            BEGIN
            SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 35 INTO :NOMTIPO;
            FOR SELECT C.PREF_PRE, COTI_NUMERO, COTI_FECHA, ARTI_COD, CTDE_CANT * CTDE_FACTOR, (CTDE_TOTAL-CTDE_IVAMONTO-CTDE_CONSUMO)*COTI_FACTOR,
                CTDE_IVAMONTO*COTI_FACTOR, CTDE_DTOPORC, CTDE_TOTAL*COTI_FACTOR, CTDE_CONSUMO, D.lipr_cod
                FROM COTIZACIONES C, COTIZACIONES_DETALLE D, PREFIJOS P
                WHERE C.COTI_ID = D.COTI_ID AND ARTI_COD = :ARTICULO AND COTI_FECHA >= :FECINI AND COTI_FECHA <= :FECFIN AND VEND_COD = :CODVEND AND COTI_ANULADO = 'N'
                 AND P.PREF_PRE = C.PREF_PRE AND P.TIDO_COD = 35 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                ORDER BY COTI_FECHA, C.COTI_ID, CTDE_ITEM
                INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :DTO, :TOTAL, :CONSUMO, :codlista
                DO
                BEGIN
                SELECT ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO WHERE ARTI_COD = :ARTICULO
                    INTO :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC;
                SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                LISTA = 0;
                SELECT PRAR_FIJO FROM precios_articulo WHERE LIPR_COD = :CODLISTA AND ARTI_COD = :ARTICULO INTO :LISTA;
                EXECUTE PROCEDURE costo_promedio (:ARTICULO, :FECHA) RETURNING_VALUES (:COSTOUNIT);
                /* EL FACTOR */
                FACCOST = 1;
                SELECT FIRST 1 FACO_FACTOR FROM factor_costo WHERE FACO_FECINI <= :FECHA AND FACO_FECFIN >= :FECHA INTO :FACCOST;
                COSTOUNIT = COSTOUNIT * FACCOST;

                COSTO = COSTOUNIT * CANTIDAD;
                UTILIDAD = BASE - COSTO;
                if (UOM = 'UTILIDAD') then
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                else
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
                if (CEROS = 'S') then
                    INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (4, USER, :ARTICULO);
                SUSPEND;
                END
            if (CEROS = 'S') then
                BEGIN
                COSTO = 0;
                UTILIDAD = 0;
                PORC = 0;
                /* agregue los articulos sin factura */
                FOR SELECT ARTI_COD, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN and
                    not exists (select REPA_ARTICULO FROM REPORTES_AUX WHERE REPA_ID = 4 AND REPA_USER = USER AND REPA_ARTICULO = a.arti_cod)
                    INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                    DO
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        END
    END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure UTILIDAD_VENTAS (
    TIPO integer,
    DETALLE char(1),
    FECINI date,
    FECFIN date,
    PREFIJO varchar(4),
    ULTIMO char(1),
    SUBEMPRESA integer)
returns (
    PREF varchar(4),
    NUMERO varchar(6),
    FECHA date,
    PTVTID integer,
    VENDCOD integer,
    NIT varchar(20),
    NOMTERCERO varchar(60),
    ARTICULO varchar(15),
    ARTIDES varchar(60),
    CANT numeric(18,4),
    UNIDAD varchar(8),
    PRECIO numeric(18,2),
    IVAPOR numeric(9,2),
    COSTO numeric(18,2),
    UTILIDAD numeric(18,2),
    PORC numeric(9,2))
AS
declare variable IMPTOS CHAR(1);
declare variable ID INTEGER;
declare variable COSTOT NUMERIC(18,2);
declare variable ULTCOS NUMERIC(18,2);
declare variable PRECIOT NUMERIC(18,2);
declare variable UOM VARCHAR(20);
declare variable icoinc char(2);
declare variable consumo NUMERIC(18,2);
declare variable factor NUMERIC(18,4);
declare variable ITEM INTEGER;
declare variable FACCOST NUMERIC(18,4);
BEGIN
EXECUTE PROCEDURE lee_configuracion ('FACTURACION', 'ARTICULOS', 'SUGERIR PRECIOS CON PORCENTAJE DE MARGEN O UTILIDAD') returning_values (:UOM);
EXECUTE PROCEDURE lee_configuracion ('FACTURACION', 'ARTICULOS', 'IMPOCONSUMO INCLUIDO EN EL PRECIO BASE DE VENTA ANTES DE IVA') returning_values (:icoinc);
/* DETERMINE LA TABLA A EXAMINAR */
if (TIPO = 31) then
    BEGIN
    /* FACTURA */
    FOR SELECT FACT_ID, F.PREF_PRE, FACT_NUMERO, FACT_FECHA, PTVT_ID, VEND_COD, TERC_NIT, FACT_NOMCLIENTE, FACT_IVAINC, fact_factor
        FROM FACTURAS F, PREFIJOS P
        WHERE FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND FACT_ANULADO = 'N'
         AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = :TIPO AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
        ORDER BY FACT_FECHA, F.PREF_PRE, FACT_NUMERO
        INTO :ID, :PREF, :NUMERO, :FECHA, :PTVTID, :VENDCOD, :NIT, :NOMTERCERO, :IMPTOS, :factor
        DO
        if ((PREFIJO = '') or (PREFIJO = PREF)) then
          BEGIN
          COSTOT = 0;
          PRECIOT = 0;
          FOR SELECT FADE_ITEM, D.ARTI_COD, SUBSTR(FADE_DESC,1,60), FADE_CANT * FADE_FACTOR, FADE_UNIDAD, (FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO)*:FACTOR, FADE_IVAPORC, fade_consumo
            FROM FACTURAS_DETALLE D
            WHERE FACT_ID = :ID and substring(D.arti_cod from 1 FOR 2) <> '.t'
            INTO :ITEM, :ARTICULO, :ARTIDES, :CANT, :UNIDAD, :PRECIO, :ivapor, :consumo
            DO
                BEGIN
                if (EXISTS (SELECT COST_SALP / COST_SALC FROM COSTOS C, MOVIMIENTO_ARTICULO M
                    WHERE C.arti_cod = M.arti_cod AND COST_IDMOV = MVAR_CONS AND MVAR_TIPODOC = 31 AND MVAR_IDREF = :ID AND COST_SALC <> 0 AND MVAR_ITEM = :ITEM)) then
                    SELECT COST_SALP / COST_SALC, COST_ULTIMO FROM COSTOS C, MOVIMIENTO_ARTICULO M
                        WHERE C.arti_cod = M.arti_cod AND COST_IDMOV = MVAR_CONS AND MVAR_TIPODOC = 31 AND MVAR_IDREF = :ID AND COST_SALC <> 0 AND MVAR_ITEM = :ITEM INTO :costo, :ultcos;
                else
                    EXECUTE PROCEDURE costo_promedio_y_ultimo(:ARTICULO, :FECHA) returning_values (:COSTO, :ultcos);
                /* EL FACTOR */
                FACCOST = 1;
                SELECT FIRST 1 FACO_FACTOR FROM factor_costo WHERE FACO_FECINI <= :FECHA AND FACO_FECFIN >= :FECHA INTO :FACCOST;
                ULTCOS = ULTCOS * FACCOST;
                COSTO = COSTO * FACCOST;

                if (ULTIMO = 'S') then
                    COSTO = ultcos * CANT;
                else
                    COSTO = COSTO * CANT;
                if (DETALLE = 'S') then
                    BEGIN
                    UTILIDAD = PRECIO - COSTO;
                    if (UOM = 'UTILIDAD') then
                        EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                    else
                        EXECUTE PROCEDURE PORCENTAJE (utilidad,  PRECIO, 'S') returning_values (PORC);
                    SUSPEND;
                    END
                ELSE
                    BEGIN
                    COSTOT = COSTOT + COSTO;
                    PRECIOT = PRECIOT + PRECIO;
                    END
                END
          if (DETALLE <> 'S') then
            BEGIN
            COSTO = COSTOT;
            PRECIO = PRECIOT;
            UTILIDAD = PRECIO - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  PRECIO, 'S') returning_values (PORC);
            SUSPEND;
            END
          END
    END
  if (TIPO = 32) then
    BEGIN
    /* REMISION */
    FOR SELECT REVT_ID, R.PREF_PRE, REVT_NUMERO, REVT_FECHA, PTVT_ID, VEND_COD, TERC_NIT, REVT_NOMTERC, REVT_IVAINC
        FROM REMISIONES_VENTA R, PREFIJOS P
        WHERE REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN AND REVT_ANULADO = 'N'
         AND P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = :TIPO AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
        ORDER BY REVT_FECHA, R.PREF_PRE, REVT_NUMERO
        INTO :ID, :PREF, :NUMERO, :FECHA, :PTVTID, :VENDCOD, :NIT, :NOMTERCERO, :IMPTOS
        DO
        if ((PREFIJO = '') or (PREFIJO = PREF)) then
          BEGIN
          COSTOT = 0;
          PRECIOT = 0;
          FOR SELECT RVDE_ITEM, D.ARTI_COD, SUBSTR(RVDE_DESC,1,60), RVDE_CANT * RVDE_FACTOR, RVDE_UNIDAD, (RVDE_TOTAL-RVDE_IVAMONTO-RVDE_CONSUMO), RVDE_IVAPORC, rvde_consumo
            FROM REMISIONES_VENTA_DETALLE D
            WHERE REVT_ID = :ID and substring(D.arti_cod from 1 FOR 2) <> '.t'
            INTO :ITEM, :ARTICULO, :ARTIDES, :CANT, :UNIDAD, :PRECIO, :ivapor, :consumo
            DO
                BEGIN
                if (EXISTS (SELECT COST_SALP / COST_SALC FROM COSTOS C, MOVIMIENTO_ARTICULO M
                    WHERE C.arti_cod = M.arti_cod AND COST_IDMOV = MVAR_CONS AND MVAR_TIPODOC = 32 AND MVAR_IDREF = :ID AND COST_SALC <> 0 AND MVAR_ITEM = :ITEM)) then
                    SELECT COST_SALP / COST_SALC, COST_ULTIMO FROM COSTOS C, MOVIMIENTO_ARTICULO M
                        WHERE C.arti_cod = M.arti_cod AND COST_IDMOV = MVAR_CONS AND MVAR_TIPODOC = 32 AND MVAR_IDREF = :ID AND COST_SALC <> 0 AND MVAR_ITEM = :ITEM INTO :costo, :ultcos;
                else
                    EXECUTE PROCEDURE costo_promedio_y_ultimo(:ARTICULO, :FECHA) returning_values (:COSTO, :ultcos);
                /* EL FACTOR */
                FACCOST = 1;
                SELECT FIRST 1 FACO_FACTOR FROM factor_costo WHERE FACO_FECINI <= :FECHA AND FACO_FECFIN >= :FECHA INTO :FACCOST;
                ULTCOS = ULTCOS * FACCOST;
                COSTO = COSTO * FACCOST;

                if (ULTIMO = 'S') then
                    COSTO = ultcos * CANT;
                else
                    COSTO = COSTO * CANT;
                if (DETALLE = 'S') then
                    BEGIN
                    UTILIDAD = PRECIO - COSTO;
                    if (UOM = 'UTILIDAD') then
                        EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                    else
                        EXECUTE PROCEDURE PORCENTAJE (utilidad,  PRECIO, 'S') returning_values (PORC);
                    SUSPEND;
                    END
                ELSE
                    BEGIN
                    COSTOT = COSTOT + COSTO;
                    PRECIOT = PRECIOT + PRECIO;
                    END
                END
          if (DETALLE <> 'S') then
            BEGIN
            COSTO = COSTOT;
            PRECIO = PRECIOT;
            UTILIDAD = PRECIO - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  PRECIO, 'S') returning_values (PORC);
            SUSPEND;
            END
          END
    END
  if (TIPO = 33) then
    BEGIN
    /* DEVOLUCION */
    FOR SELECT DEVT_ID, D.PREF_PRE, DEVT_NUMERO, DEVT_FECHA, PTVT_ID, VEND_COD, TERC_NIT, DEVT_NOMTERC, DEVT_IVAINC, DEVT_FACTOR
        FROM DEVOLUCIONES_VENTAS D, PREFIJOS P
        WHERE DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND DEVT_ANULADO = 'N'
         AND P.PREF_PRE = D.PREF_PRE AND P.TIDO_COD = :TIPO AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
        ORDER BY DEVT_FECHA, D.PREF_PRE, DEVT_NUMERO
        INTO :ID, :PREF, :NUMERO, :FECHA, :PTVTID, :VENDCOD, :NIT, :NOMTERCERO, :IMPTOS, :FACTOR
        DO
        if ((PREFIJO = '') or (PREFIJO = PREF)) then
          BEGIN
          COSTOT = 0;
          PRECIOT = 0;
          FOR SELECT DVDE_ITEM, D.ARTI_COD, SUBSTR(DVDE_DESC,1,60), DVDE_CANT * DVDE_FACTOR, DVDE_UNIDAD, (DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO)*:FACTOR, DVDE_IVAPORC, dvde_consumo
            FROM DEVOLUCIONES_VENTAS_DETALLE D
            WHERE DEVT_ID = :ID and substring(D.arti_cod from 1 FOR 2) <> '.t'
            INTO :ITEM, :ARTICULO, :ARTIDES, :CANT, :UNIDAD, :PRECIO, :ivapor, :consumo
            DO
                BEGIN
                if (EXISTS (SELECT COST_ENTP / COST_ENTC FROM COSTOS C, MOVIMIENTO_ARTICULO M
                    WHERE C.arti_cod = M.arti_cod AND COST_IDMOV = MVAR_CONS AND MVAR_TIPODOC = 33 AND MVAR_IDREF = :ID AND COST_ENTC <> 0 AND MVAR_ITEM = :ITEM)) then
                    SELECT COST_ENTP / COST_ENTC FROM COSTOS C, MOVIMIENTO_ARTICULO M
                        WHERE C.arti_cod = M.arti_cod AND COST_IDMOV = MVAR_CONS AND MVAR_TIPODOC = 33 AND MVAR_IDREF = :ID AND COST_ENTC <> 0 AND MVAR_ITEM = :ITEM INTO :costo;
                else
                    EXECUTE PROCEDURE costo_promedio_y_ultimo(:ARTICULO, :FECHA) returning_values (:COSTO, :ultcos);
                /* EL FACTOR */
                FACCOST = 1;
                SELECT FIRST 1 FACO_FACTOR FROM factor_costo WHERE FACO_FECINI <= :FECHA AND FACO_FECFIN >= :FECHA INTO :FACCOST;
                ULTCOS = ULTCOS * FACCOST;
                COSTO = COSTO * FACCOST;

                if (ULTIMO = 'S') then
                    COSTO = ultcos * CANT;
                else
                    COSTO = COSTO * CANT;
                if (DETALLE = 'S') then
                    BEGIN
                    UTILIDAD = PRECIO - COSTO;
                    if (UOM = 'UTILIDAD') then
                        EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                    else
                        EXECUTE PROCEDURE PORCENTAJE (utilidad,  PRECIO, 'S') returning_values (PORC);
                    SUSPEND;
                    END
                ELSE
                    BEGIN
                    COSTOT = COSTOT + COSTO;
                    PRECIOT = PRECIOT + PRECIO;
                    END
                END
        if (DETALLE <> 'S') then
            BEGIN
            COSTO = COSTOT;
            PRECIO = PRECIOT;
            UTILIDAD = PRECIO - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  PRECIO, 'S') returning_values (PORC);
            SUSPEND;
            END
        END
    END
  if (TIPO = 34) then
    BEGIN
    /* PEDIDO */
    FOR SELECT PEDI_ID, P.PREF_PRE, PEDI_NUMERO, PEDI_FECHA, PTVT_ID, VEND_COD, TERC_NIT, PEDI_NOMTERC, PEDI_IVAINC, PEDI_FACTOR
        FROM PEDIDOS P, PREFIJOS R
        WHERE PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND PEDI_ANULADO = 'N'
         AND P.PREF_PRE = R.PREF_PRE AND R.TIDO_COD = :TIPO AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
        ORDER BY PEDI_FECHA, P.PREF_PRE, PEDI_NUMERO
        INTO :ID, :PREF, :NUMERO, :FECHA, :PTVTID, :VENDCOD, :NIT, :NOMTERCERO, :IMPTOS, :FACTOR
        DO
        if ((PREFIJO = '') or (PREFIJO = PREF)) then
          BEGIN
          COSTOT = 0;
          PRECIOT = 0;
          FOR SELECT ARTI_COD, SUBSTR(PEDE_DESC,1,60), PEDE_CANT * PEDE_FACTOR, PEDE_UNIDAD, (PEDE_TOTAL-PEDE_IVAMONTO-PEDE_CONSUMO)*:FACTOR, PEDE_IVAPORC, pede_consumo
            FROM PEDIDOS_DETALLE
            WHERE PEDI_ID = :ID
            INTO :ARTICULO, :ARTIDES, :CANT, :UNIDAD, :PRECIO, :ivapor, :consumo
            DO
                BEGIN
                EXECUTE PROCEDURE costo_promedio_y_ultimo(:ARTICULO, :FECHA) returning_values (:COSTO, :ultcos);
                /* EL FACTOR */
                FACCOST = 1;
                SELECT FIRST 1 FACO_FACTOR FROM factor_costo WHERE FACO_FECINI <= :FECHA AND FACO_FECFIN >= :FECHA INTO :FACCOST;
                ULTCOS = ULTCOS * FACCOST;
                COSTO = COSTO * FACCOST;

                if (ULTIMO = 'S') then
                    COSTO = ultcos * CANT;
                else
                    COSTO = COSTO * CANT;
                if (DETALLE = 'S') then
                    BEGIN
                    UTILIDAD = PRECIO - COSTO;
                    if (UOM = 'UTILIDAD') then
                        EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                    else
                        EXECUTE PROCEDURE PORCENTAJE (utilidad,  PRECIO, 'S') returning_values (PORC);
                    SUSPEND;
                    END
                ELSE
                    BEGIN
                    COSTOT = COSTOT + COSTO;
                    PRECIOT = PRECIOT + PRECIO;
                    END
                END
        if (DETALLE <> 'S') then
            BEGIN
            COSTO = COSTOT;
            PRECIO = PRECIOT;
            UTILIDAD = PRECIO - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  PRECIO, 'S') returning_values (PORC);
            SUSPEND;
            END
        END
    END
  if (TIPO = 35) then
    BEGIN
    /* COTIZACION */
    FOR SELECT COTI_ID, C.PREF_PRE, COTI_NUMERO, COTI_FECHA, PTVT_ID, VEND_COD, TERC_NIT, COTI_NOMTERC, COTI_IMPTOS, COTI_FACTOR
        FROM COTIZACIONES C, PREFIJOS P
        WHERE COTI_FECHA >= :FECINI AND COTI_FECHA <= :FECFIN AND COTI_ANULADO = 'N'
         AND P.PREF_PRE = C.PREF_PRE AND P.TIDO_COD = :TIPO AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
        ORDER BY COTI_FECHA, C.PREF_PRE, COTI_NUMERO
        INTO :ID, :PREF, :NUMERO, :FECHA, :PTVTID, :VENDCOD, :NIT, :NOMTERCERO, :IMPTOS, :FACTOR
        DO
        if ((PREFIJO = '') or (PREFIJO = PREF)) then
          BEGIN
          COSTOT = 0;
          PRECIOT = 0;
          FOR SELECT ARTI_COD, SUBSTR(CTDE_DESC,1,60), CTDE_CANT * CTDE_FACTOR, CTDE_UNIDAD, (CTDE_TOTAL-CTDE_IVAMONTO-CTDE_CONSUMO)*:FACTOR, CTDE_IVAPORC, ctde_consumo
            FROM COTIZACIONES_DETALLE
            WHERE COTI_ID = :ID
            INTO :ARTICULO, :ARTIDES, :CANT, :UNIDAD, :PRECIO, :ivapor, :consumo
            DO
                BEGIN
                EXECUTE PROCEDURE costo_promedio_y_ultimo(:ARTICULO, :FECHA) returning_values (:COSTO, :ultcos);
                /* EL FACTOR */
                FACCOST = 1;
                SELECT FIRST 1 FACO_FACTOR FROM factor_costo WHERE FACO_FECINI <= :FECHA AND FACO_FECFIN >= :FECHA INTO :FACCOST;
                ULTCOS = ULTCOS * FACCOST;
                COSTO = COSTO * FACCOST;

                if (ULTIMO = 'S') then
                    COSTO = ultcos * CANT;
                else
                    COSTO = COSTO * CANT;
                if (DETALLE = 'S') then
                    BEGIN
                    UTILIDAD = PRECIO - COSTO;
                    if (UOM = 'UTILIDAD') then
                        EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                    else
                        EXECUTE PROCEDURE PORCENTAJE (utilidad,  PRECIO, 'S') returning_values (PORC);
                    SUSPEND;
                    END
                ELSE
                    BEGIN
                    COSTOT = COSTOT + COSTO;
                    PRECIOT = PRECIOT + PRECIO;
                    END
                END
        if (DETALLE <> 'S') then
            BEGIN
            COSTO = COSTOT;
            PRECIO = PRECIOT;
            UTILIDAD = PRECIO - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  PRECIO, 'S') returning_values (PORC);
            SUSPEND;
            END
        END
    END
END
^

SET TERM ; ^


/* 20100812 */
ALTER TABLE ARTICULO
ADD ARTI_SOBTOT T_BOOLEANO;

UPDATE ARTICULO SET ARTI_SOBTOT = 'N';
COMMIT WORK;

SET TERM ^ ;

CREATE OR ALTER TRIGGER PLAN_PRODUCCION_DET_AI FOR PLAN_PRODUCCION_DET
ACTIVE AFTER INSERT POSITION 0
as
declare variable descr VARCHAR(60);
declare variable MERMA NUMERIC(18,4);
declare variable PESOCMP NUMERIC(18,4);
declare variable TOTAL FLOAT;
declare variable FACTOR FLOAT;
declare variable CODCMP VARCHAR(20);
declare variable CANTPRO NUMERIC(18,4);
declare variable CANTCMP NUMERIC(18,4);
declare variable CANTSOB NUMERIC(18,4);
declare variable UNDCMP VARCHAR(8);
declare variable PORCMP FLOAT;
declare variable entrada CHAR(1);
declare variable i integer;
declare variable sobrante varchar(15);
declare variable porsob numeric(9,4);
declare variable REUSO CHAR(1);
declare variable ITEM INTEGER;
declare variable NUMROWS INTEGER;
declare variable TIPOORD INTEGER;
BEGIN
if ((NEW.plpr_id <> 0) and (new.plpd_anulado = 'N')) then
    BEGIN
    CANTPRO = NEW.plpd_cant * NEW.plpd_factor;
    select plpr_entrada from plan_produccion where plpr_id = new.plpr_id into :entrada;
    if (entrada = 'S') then
        begin
        i = 0;
        select arti_sobrante, arti_porcsobr, ARTI_REUSOB from articulo
            where arti_cod = new.arti_cod into :sobrante, :porsob, :reuso;

        select sum(arpr_porc) from articulos_producto where arti_cod = new.arti_cod into :total;
        FOR SELECT arpr_comp, ARPR_CANT, ARPR_UNIDAD, ARPR_PORC, ARTI_DES, arti_peso, arpr_merma
            from articulos_producto AP, ARTICULO A2
            WHERE AP.arpr_comp = A2.arti_cod AND AP.arti_cod = new.arti_cod ORDER by ARPR_ITEM
            INTO :codcmp, :cantcmp, :undcmp, :porcmp, :descr, :pesocmp, :MERMA
            DO
            BEGIN
            EXECUTE PROCEDURE factor_unidad_cant(:codcmp, :undcmp) returning_values (:FACTOR);
            if (((cantcmp is null) or (cantcmp = 0)) AND (PORCMP IS NOT NULL) AND (porcmp <> 0)) then
                BEGIN
                cantcmp = NEW.plpd_cant * NEW.plpd_factor * NEW.plpd_peso / TOTAL * PORCMP; /* APLICA LA PROPORCION */
                if ((MERMA IS NOT NULL) AND (MERMA <> 0)) then
                    cantcmp = cantcmp * (100 + MERMA) / 100;
                if ((sobrante <> '') and (porsob <> 0) and (sobrante = codcmp) and (reuso = 'N')) then
                    begin
                    cantsob = cantpro * new.plpd_peso;
                    cantsob = cantsob / TOTAL * porsob; /* APLICA LA PROPORCION */
                    cantcmp = cantcmp + cantsob;
                    end
                END
            ELSE
                BEGIN
                cantcmp = cantcmp * FACTOR * pesocmp * NEW.plpd_cant * NEW.plpd_factor;
                END

            i = i + 1;
            insert into plan_produccion_productos (plpr_id, plpd_item, plpp_nrocmop, arpr_comp, arpr_cant, arpr_porc, arpr_unidad, arpr_merma, arti_peso)
                values(new.plpr_id, new.plpd_item, :i, :codcmp,  :cantcmp, :porcmp, :undcmp, :merma, :pesocmp);

            SELECT COUNT(ARTI_COD) FROM articulos_producto WHERE ARTI_COD = :codcmp INTO :NUMROWS;
            if (NUMROWS <> 0) then
               TIPOORD = 19;
            else
                TIPOORD = 24;

            /* INSERTE O ACTUALICE EL COMPONENTE */
            if (NOT EXISTS (SELECT PLPC_ITEM FROM plan_produccion_cons WHERE PLPD_ID = new.plpr_id AND ARTI_COD = :codcmp)) then
                BEGIN
                select max(plpc_item) from plan_produccion_cons where PLPD_ID = new.plpr_id into :item;
                if (item is null) then
                    item = 0;
                item = item + 1;
                INSERT INTO plan_produccion_cons (PLPD_ID, PLPC_ITEM, PLPC_CODBAR, ARTI_COD, PLPC_CANT, PLPC_UNIDAD, PLPC_EXIST, PLPC_ORDENAR, PLPC_ORDENTIPO, PLPC_ORDENID, PLPC_ANULADO, PLPC_TRANSMIT, PLPC_DESC)
                    VALUES (new.plpr_id, :item, :codcmp, :codcmp, :cantcmp, :undcmp, 0, 0, :tipoord, 0, 'N', 'N', :descr);
                END
            ELSE
                UPDATE plan_produccion_cons SET PLPC_CANT = PLPC_CANT + :cantcmp
                    WHERE PLPD_ID = NEW.plpr_id AND ARTI_COD = :codcmp;
            END
        end
    end
end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER PLAN_PRODUCCION_DET_AU FOR PLAN_PRODUCCION_DET
ACTIVE AFTER UPDATE POSITION 0
as
declare variable descr VARCHAR(60);
declare variable MERMA NUMERIC(18,4);
declare variable PESOCMP NUMERIC(18,4);
declare variable TOTAL FLOAT;
declare variable FACTOR FLOAT;
declare variable CODCMP VARCHAR(20);
declare variable CANTPRO NUMERIC(18,4);
declare variable CANTCMP NUMERIC(18,4);
declare variable CANTSOB NUMERIC(18,4);
declare variable UNDCMP VARCHAR(8);
declare variable PORCMP FLOAT;
declare variable entrada CHAR(1);
declare variable i integer;
declare variable sobrante varchar(15);
declare variable porsob numeric(9,4);
declare variable REUSO CHAR(1);
declare variable ITEM INTEGER;
declare variable NUMROWS INTEGER;
declare variable TIPOORD INTEGER;
declare variable totcant numeric(18,4);
declare variable Pref varchar(4);
declare variable Num varchar(6);
declare variable BodDes varchar(2);
declare variable Fec Date;
declare variable SOBTOT CHAR(1);
BEGIN
if ((OLD.plpd_transmit <> NEW.plpd_transmit) AND (NEW.plpd_transmit = 'N')) then
    BEGIN
    totcant = 0;
    CANTPRO = NEW.plpd_cant * NEW.plpd_factor;
    select plpr_fecfin, plpr_pref, plpr_numero, plpr_entrada, plpr_boddes from plan_produccion
        where plpr_id = new.plpr_id into :fec, :Pref, :Num, :entrada, :boddes;
    if (entrada = 'S') then
        begin
        i = 0;
        select arti_sobrante, arti_porcsobr, ARTI_REUSOB, ARTI_SOBTOT from articulo
            where arti_cod = new.arti_cod into :sobrante, :porsob, :reuso, :sobtot;

        select sum(arpr_porc) from articulos_producto where arti_cod = new.arti_cod into :total;
        FOR SELECT arpr_comp, ARPR_CANT, ARPR_UNIDAD, ARPR_PORC, ARTI_DES, arti_peso, arpr_merma
            from articulos_producto AP, ARTICULO A2
            WHERE AP.arpr_comp = A2.arti_cod AND AP.arti_cod = new.arti_cod ORDER by ARPR_ITEM
            INTO :codcmp, :cantcmp, :undcmp, :porcmp, :descr, :pesocmp, :MERMA
            DO
            BEGIN
            EXECUTE PROCEDURE factor_unidad_cant(:codcmp, :undcmp) returning_values (:FACTOR);
            if (((cantcmp is null) or (cantcmp = 0)) AND (PORCMP IS NOT NULL) AND (porcmp <> 0)) then
                BEGIN
                cantcmp = NEW.plpd_cant * NEW.plpd_factor * NEW.plpd_peso / TOTAL * PORCMP; /* APLICA LA PROPORCION */
                if ((MERMA IS NOT NULL) AND (MERMA <> 0)) then
                    cantcmp = cantcmp * (100 + MERMA) / 100;
                if ((sobrante <> '') and (porsob <> 0) and (sobrante = codcmp) and (reuso = 'N')) then
                    begin
                    cantsob = cantpro * new.plpd_peso;
                    cantsob = cantsob / TOTAL * porsob; /* APLICA LA PROPORCION */
                    cantcmp = cantcmp + cantsob;
                    end
                totcant = totcant + cantcmp;
                END
            ELSE
                BEGIN
                cantcmp = cantcmp * FACTOR * pesocmp * NEW.plpd_cant * NEW.plpd_factor;
                if (SOBTOT = 'S') then
                    totcant = totcant + cantcmp;
                END
            END

        /* ingrese el sobrante */
        if (NEW.plpd_transmit = 'N') then
          if ((sobrante <> '') and (porsob <> 0) AND (REUSO = 'N')) then
              begin
              select arti_peso from articulo where arti_cod = :sobrante into :pesocmp;
              INSERT INTO MOVIMIENTO_ARTICULO
                (ARTI_COD, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM, TERC_NIT)
                VALUES(:sobrante, :boddes, :FEC, 27, new.plpr_id, 'SOBRANTE PLAN PRODUCCION ' || :PREF || :num || ' ARTICULO:' || new.arti_cod,
                (:porsob * :totcant /100)/:pesocmp, 0, 'S', null, :Pref, :Num, 0, null);
              end
        end
    END
ELSE
  BEGIN
  if ((OLD.plpr_id <> 0) and (OLD.plpd_anulado = 'N')) then
    BEGIN
    FOR SELECT arpr_comp, ARPR_CANT
        from plan_produccion_productos where plpr_id = old.plpr_id and plpd_item = old.plpd_item
        INTO :codcmp, :cantcmp
        DO
        BEGIN
        /* INSERTE O ACTUALICE EL COMPONENTE */
        UPDATE plan_produccion_cons SET PLPC_CANT = PLPC_CANT - :cantcmp
            WHERE PLPD_ID = OLD.plpr_id AND ARTI_COD = :codcmp;
        END
    DELETE FROM plan_produccion_productos where plpr_id = old.plpr_id and plpd_item = old.plpd_item;
    select arti_sobrante from articulo where arti_cod = OLD.arti_cod into :sobrante;
    DELETE FROM movimiento_articulo M WHERE M.mvar_tipodoc = 27 AND M.mvar_idref = OLD.plpr_id AND MVAR_ITEM = 0 AND ARTI_COD = :sobrante;
    END

  if ((NEW.plpr_id <> 0) and (new.plpd_anulado = 'N')) then
    BEGIN
    totcant = 0;
    CANTPRO = NEW.plpd_cant * NEW.plpd_factor;
    select plpr_fecfin, plpr_pref, plpr_numero, plpr_entrada, plpr_boddes from plan_produccion
        where plpr_id = new.plpr_id into :fec, :Pref, :Num, :entrada, :boddes;
    if (entrada = 'S') then
        begin
        i = 0;
        select arti_sobrante, arti_porcsobr, ARTI_REUSOB, ARTI_SOBTOT from articulo
            where arti_cod = new.arti_cod into :sobrante, :porsob, :reuso, :sobtot;

        select sum(arpr_porc) from articulos_producto where arti_cod = new.arti_cod into :total;
        FOR SELECT arpr_comp, ARPR_CANT, ARPR_UNIDAD, ARPR_PORC, ARTI_DES, arti_peso, arpr_merma
            from articulos_producto AP, ARTICULO A2
            WHERE AP.arpr_comp = A2.arti_cod AND AP.arti_cod = new.arti_cod ORDER by ARPR_ITEM
            INTO :codcmp, :cantcmp, :undcmp, :porcmp, :descr, :pesocmp, :MERMA
            DO
            BEGIN
            EXECUTE PROCEDURE factor_unidad_cant(:codcmp, :undcmp) returning_values (:FACTOR);
            if (((cantcmp is null) or (cantcmp = 0)) AND (PORCMP IS NOT NULL) AND (porcmp <> 0)) then
                BEGIN
                cantcmp = NEW.plpd_cant * NEW.plpd_factor * NEW.plpd_peso / TOTAL * PORCMP; /* APLICA LA PROPORCION */
                if ((MERMA IS NOT NULL) AND (MERMA <> 0)) then
                    cantcmp = cantcmp * (100 + MERMA) / 100;
                if ((sobrante <> '') and (porsob <> 0) and (sobrante = codcmp) and (reuso = 'N')) then
                    begin
                    cantsob = cantpro * new.plpd_peso;
                    cantsob = cantsob / TOTAL * porsob; /* APLICA LA PROPORCION */
                    cantcmp = cantcmp + cantsob;
                    end
                totcant = totcant + cantcmp;
                END
            ELSE
                BEGIN
                cantcmp = cantcmp * FACTOR * pesocmp * NEW.plpd_cant * NEW.plpd_factor;
                if (SOBTOT = 'S') then
                    totcant = totcant + cantcmp;
                END

            i = i + 1;
            insert into plan_produccion_productos (plpr_id, plpd_item, plpp_nrocmop, arpr_comp, arpr_cant, arpr_porc, arpr_unidad, arpr_merma, arti_peso)
                values(new.plpr_id, new.plpd_item, :i, :codcmp,  :cantcmp, :porcmp, :undcmp, :merma, :pesocmp);

            SELECT COUNT(ARTI_COD) FROM articulos_producto WHERE ARTI_COD = :codcmp INTO :NUMROWS;
            if (NUMROWS <> 0) then
               TIPOORD = 19;
            else
                TIPOORD = 24;

            /* INSERTE O ACTUALICE EL COMPONENTE */
            if (NOT EXISTS (SELECT PLPC_ITEM FROM plan_produccion_cons WHERE PLPD_ID = new.plpr_id AND ARTI_COD = :codcmp)) then
                BEGIN
                select max(plpc_item) from plan_produccion_cons where PLPD_ID = new.plpr_id into :item;
                item = item + 1;
                INSERT INTO plan_produccion_cons (PLPD_ID, PLPC_ITEM, PLPC_CODBAR, ARTI_COD, PLPC_CANT, PLPC_UNIDAD, PLPC_EXIST, PLPC_ORDENAR, PLPC_ORDENTIPO, PLPC_ORDENID, PLPC_ANULADO, PLPC_TRANSMIT, PLPC_DESC)
                    VALUES (new.plpr_id, :item, :codcmp, :codcmp, :cantcmp, :undcmp, 0, 0, :tipoord, 0, 'N', 'N', :descr);
                END
            ELSE
                UPDATE plan_produccion_cons SET PLPC_CANT = PLPC_CANT + :cantcmp
                    WHERE PLPD_ID = NEW.plpr_id AND ARTI_COD = :codcmp;
            END
        end
    end
  END
end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER PLAN_PRODUCCION_DET_AD FOR PLAN_PRODUCCION_DET
ACTIVE AFTER DELETE POSITION 0
as
declare variable CODCMP VARCHAR(20);
declare variable CANTCMP NUMERIC(18,4);
declare variable SOBRANTE VARCHAR(20);
begin
if ((OLD.plpr_id <> 0) and (OLD.plpd_anulado = 'N')) then
    BEGIN
    FOR SELECT arpr_comp, ARPR_CANT
        from plan_produccion_productos where plpr_id = old.plpr_id and plpd_item = old.plpd_item
        INTO :codcmp, :cantcmp
        DO
        BEGIN
        /* INSERTE O ACTUALICE EL COMPONENTE */
        UPDATE plan_produccion_cons SET PLPC_CANT = PLPC_CANT - :cantcmp
            WHERE PLPD_ID = OLD.plpr_id AND ARTI_COD = :codcmp;
        END
    DELETE FROM plan_produccion_productos where plpr_id = old.plpr_id and plpd_item = old.plpd_item;
    select arti_sobrante from articulo where arti_cod = OLD.arti_cod into :sobrante;
    DELETE FROM movimiento_articulo M WHERE M.mvar_tipodoc = 27 AND M.mvar_idref = OLD.plpr_id AND MVAR_ITEM = 0 AND ARTI_COD = :sobrante;
    END
end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER PROCEDURE CONSOLIDE_PRODUCCION(
    PLANID INTEGER)
AS
declare variable item integer;
declare variable item2 integer;
declare variable artic varchar(20);
declare variable cant numeric(18,4);
declare variable cantpro numeric(18,4);
declare variable codcmp varchar(20);
declare variable cantcmp numeric(18,4);
declare variable undcmp varchar(8);
declare variable factor float;
declare variable total float;
declare variable unidad varchar(8);
declare variable costou numeric(18,4);
declare variable porc numeric(18,4);
declare variable merma numeric(18,4);
declare variable costot numeric(18,4);
declare variable pesocmp numeric(18,4);
declare variable pesopro numeric(18,4);
declare variable fec date;
declare variable CONC VARCHAR(60);
declare variable Pref varchar(4);
declare variable Num varchar(6);
declare variable BodOri varchar(2);
declare variable BodDes varchar(2);
declare variable entrada CHAR(1);
declare variable LOTE VARCHAR(20);
BEGIN
select plpr_fecfin, plpr_conc, plpr_pref, plpr_numero, plpr_bodori, plpr_boddes, plpr_entrada
    from plan_produccion where plpr_id = :planid
    into :fec, :conc, :Pref, :Num, :BodOri, :BodDes, :entrada;
/* RECORRA LOS COMPONENTES HACIENDO EL MOVIMIENTO QUE GENRA ENSAMBLES SI ES NECESARIO */
FOR SELECT plpc_item, arti_cod, plpc_cant, plpc_unidad
    from plan_produccion_cons WHERE plpd_id = :PLANID
    into :item, :artic, :cant, :unidad
    do
    BEGIN
    execute procedure factor_unidad_cant(:artic, :unidad) returning_values(factor);
    SELECT ARTI_PESO FROM ARTICULO WHERE ARTI_COD = :artic INTO :pesopro;
    CANTPRO = CANT * FACTOR;
    if (exists (select arpr_item from articulos_producto where arti_cod = :artic)) then
        begin
        select sum(arpr_porc) from articulos_producto where arti_cod = :artic into :total;
        for select arpr_item, arpr_comp, arpr_cant, arpr_unidad, ARPR_PORC, ARPR_MERMA, arti_peso
            from articulos_producto P, ARTICULO A
            where P.arpr_comp = A.arti_cod AND p.arti_cod = :artic ORDER BY P.arpr_item
            into :item2, :codcmp, :cantcmp, :undcmp, :porc, :merma, :pesocmp
            DO
            BEGIN
            execute procedure factor_unidad_cant(:codcmp, :undcmp) returning_values (:factor);
            if (((cantcmp is null) or (cantcmp = 0)) AND (PORC IS NOT NULL) AND (porc <> 0)) then
                BEGIN
                /* ES PORCENTUAL AL PESO LA MEZCLA SOBRE EL 1ER ARTICULO */
                cantcmp = cantpro * pesopro * porc / TOTAL; /* APLICA LA PROPORCION */
                if ((MERMA IS NOT NULL) AND (MERMA <> 0)) then
                    cantcmp = cantcmp / ((100 - MERMA) / 100);
                END
            else
                BEGIN
                cantcmp = cantcmp * FACTOR * pesocmp * cantpro;
                END
            insert into plan_produccion_cons_prod (plpd_id, plpc_item, plcp_nrocomp, arpr_comp, arpr_cant, arpr_porc, arpr_unidad, arpr_merma, arti_peso)
                values (:planid, :item, :item2, :codcmp, :cantcmp, :porc, :undcmp, :merma, :pesocmp);
            END
        END
/*    ELSE
        insert into plan_produccion_cons_prod (plpd_id, plpc_item, plcp_nrocomp, arpr_comp, arpr_cant, arpr_porc, arpr_unidad, arpr_merma, arti_peso)
            values (:planid, :item, 1, :artic, :cantpro, 0, :unidad, 0, :pesopro);*/

    INSERT INTO MOVIMIENTO_ARTICULO
      (ARTI_COD, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM, TERC_NIT)
      VALUES(:artic, :bodori, :FEC, 27, :planid, :CONC, :cantpro, 0, 'N', null, :Pref, :Num, :item+1000, null);
    end
/* recorra el detalle calculando costos y haciendo la entrada */
if (entrada = 'S') then
    begin
    for select plpd_item, arti_cod, plpd_cant, plpd_unidad, plpd_lote
        from plan_produccion_det where plpr_id = :planid
        into :item, :artic, :cant, :unidad, :lote
        do
        begin
        COSTOT = 0;
        execute procedure factor_unidad_cant(:artic, :unidad) returning_values (:factor);
        CANTPRO = :cant * :FACTOR;
        FOR SELECT ARPR_COMP, ARPR_CANT, ARPR_unidad
            FROM plan_produccion_productos WHERE PLPR_ID = :planid
            ORDER BY PLPD_ITEM
            INTO :codcmp, :cantcmp, :undcmp
            DO
            BEGIN
            EXECUTE PROCEDURE costo_promedio_unidad(:codcmp, :fec, :undcmp) returning_values (:COSTOU);
            COSTOT = COSTOT + (COSTOU * cantcmp);
            END
        if ((CANTPRO) <> 0) then
            costou = costot / cantpro;
        else
            costou = 0;
        INSERT INTO MOVIMIENTO_ARTICULO
          (ARTI_COD, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM, TERC_NIT)
          VALUES(:artic, :boddes, :fec, 27, :planid, :conc, :cant, :costou, 'S', :lote, :Pref, :Num, :item, '');
        end
    end
end
^

SET TERM ; ^


/* 20100813 */
/* RETFTE POR ARTICULO BASE TOMABA EL SUBTOTAL, NO LA BASE DE LOS ARTICULOS POR CUENTA */

SET TERM ^ ;

CREATE OR ALTER procedure CONTABIL_FACTCOMP (
    IDDOC integer,
    IDINTER integer)
returns (
    ERROR integer,
    VER char(1),
    IDC integer)
AS
DECLARE VARIABLE PREFIJO VARCHAR(4);
DECLARE VARIABLE NUM VARCHAR(6);
DECLARE VARIABLE NUMERO VARCHAR(10);
DECLARE VARIABLE FECAUX DATE;
DECLARE VARIABLE FECHA CHAR(8);
DECLARE VARIABLE CONCEPTO CHAR(60);
DECLARE VARIABLE VENCEAUX DATE;
DECLARE VARIABLE VENCE CHAR(8);
DECLARE VARIABLE VRDTO NUMERIC(18,2);
DECLARE VARIABLE VRADIC NUMERIC(18,2);
DECLARE VARIABLE VRSUBT NUMERIC(18,2);
DECLARE VARIABLE VRIVA NUMERIC(18,2);
DECLARE VARIABLE PRTFTE NUMERIC(9,2);
DECLARE VARIABLE VRRTFTE NUMERIC(18,2);
DECLARE VARIABLE VRRTIVA NUMERIC(18,2);
DECLARE VARIABLE PRTICA NUMERIC(9,2);
DECLARE VARIABLE VRRTICA NUMERIC(18,2);
DECLARE VARIABLE VRTOTAL NUMERIC(18,2);
DECLARE VARIABLE VREXTRA NUMERIC(18,2);
DECLARE VARIABLE TIPOCOMP VARCHAR(3);
DECLARE VARIABLE PREFCONT VARCHAR(4);
DECLARE VARIABLE INVEN CHAR(1);
DECLARE VARIABLE CTAINVEN VARCHAR(20);
DECLARE VARIABLE IVA CHAR(1);
DECLARE VARIABLE CTAIVA VARCHAR(20);
DECLARE VARIABLE CONSUMO CHAR(1);
DECLARE VARIABLE CTACONSUMO VARCHAR(20);
DECLARE VARIABLE CXP CHAR(1);
DECLARE VARIABLE CTACXP VARCHAR(20);
DECLARE VARIABLE RTFTE CHAR(1);
DECLARE VARIABLE CTARTFTE VARCHAR(20);
DECLARE VARIABLE RTIVA CHAR(1);
DECLARE VARIABLE CTARTIVA VARCHAR(20);
DECLARE VARIABLE RTICA CHAR(1);
DECLARE VARIABLE CTARTICA VARCHAR(20);
DECLARE VARIABLE CTADTO VARCHAR(20);
DECLARE VARIABLE CTAADIC VARCHAR(20);
DECLARE VARIABLE CTAEXTRA VARCHAR(20);
DECLARE VARIABLE EXISTE CHAR(1);
DECLARE VARIABLE CUENTA VARCHAR(20);
DECLARE VARIABLE MONTO NUMERIC(18,2);
DECLARE VARIABLE TIPOCUEN CHAR(1);
DECLARE VARIABLE NIT VARCHAR(20);
DECLARE VARIABLE NOMBRE VARCHAR(60);
DECLARE VARIABLE PROY VARCHAR(4);
DECLARE VARIABLE CENTRO VARCHAR(4);
DECLARE VARIABLE PROYDET VARCHAR(4);
DECLARE VARIABLE CENTRODET VARCHAR(4);
DECLARE VARIABLE PORC NUMERIC(5,2);
DECLARE VARIABLE NUMITEMS INTEGER;
DECLARE VARIABLE ARTICULO VARCHAR(15);
DECLARE VARIABLE IMPINC CHAR(1);
DECLARE VARIABLE IMPTOS NUMERIC(18,2);
DECLARE VARIABLE SUMA NUMERIC(18,2);
DECLARE VARIABLE PORCIVA NUMERIC(9,2);
DECLARE VARIABLE TCTAPROV VARCHAR(20);
DECLARE VARIABLE TCTARTFTE VARCHAR(20);
DECLARE VARIABLE TCTARTIVA VARCHAR(20);
DECLARE VARIABLE TCTARTICA VARCHAR(20);
DECLARE VARIABLE CUENTAADIC VARCHAR(20);
DECLARE VARIABLE BASEADIC VARCHAR(20);
DECLARE VARIABLE PORCADIC NUMERIC(5,2);
DECLARE VARIABLE VALORADIC NUMERIC(18,2);
DECLARE VARIABLE DBADIC CHAR(1);
DECLARE VARIABLE FOMENTO CHAR(2);
DECLARE VARIABLE BODE_DET CHAR(2);
DECLARE VARIABLE NUMPROV VARCHAR(10);
DECLARE VARIABLE MERCANCIA NUMERIC(18,2);
declare variable FACTOR DOUBLE PRECISION;
DECLARE VARIABLE MENORV CHAR(2);
declare variable DIG INTEGER;
declare variable NETO NUMERIC(18,2);
declare variable CENT CHAR(1);
declare variable ANULADO CHAR(1);
declare variable ERRORC INTEGER;
BEGIN
  /* INTERFACE */
  EXISTE = 'N';
  SELECT 'S', TICO_COD, PRCO_PRE, INCO_INVEN, INCO_IVA, INCO_CONSUMO, INCO_CXP, INCO_RTFTE, INCO_RTIVA, INCO_RTICA, INCO_CTAINVEN, INCO_CTAIVA, INCO_CTACONSUMO, INCO_CTADTO, INCO_CTAADIC, INCO_CTAEXTRA, INCO_CTACXP, INCO_CTARTFTE, INCO_CTARTIVA, INCO_CTARTICA, INCO_CONFIRMAR, INCO_CENTRO
    FROM INTERFAZ_COMPRAS WHERE INCO_ID = :IDINTER INTO :EXISTE, :TIPOCOMP, :PREFCONT, :INVEN, :IVA, :CONSUMO, :CXP, :RTFTE, :RTIVA, :RTICA, :CTAINVEN, :CTAIVA, :CTACONSUMO, :CTADTO, :CTAADIC, :CTAEXTRA, :CTACXP, :CTARTFTE, :CTARTIVA, :CTARTICA, :VER, :CENT;
  if (EXISTE = 'S') then
    BEGIN
    /* BORRE CONTABILIZACION PREVIA */
    DELETE FROM CONTABILIZACION WHERE CNTB_TIPOREF = 21 AND CNTB_IDREF = :IDDOC;
    /* ENCABEZADO DE LA FACTURA */
    SELECT PREF_PRE, FACO_NUMERO, FACO_FECHA, F.TERC_NIT, FACO_IMPTOS, FACO_VENCE, FACO_DTOMONTO, FACO_ADICIONAL, FACO_IVAMONTO, FACO_EXTRA, FACO_TOTAL, FACO_RTFTEPORC, FACO_RTFTEMONTO, FACO_RTIVAPOR, FACO_RTIVAMONTO, FACO_RTICAPOR, FACO_RTICAMONTO, TERC_NOM, PROV_CTARTFTE, PROV_CTARTIVA, PROV_CTARTICA, PROV_CTAPAGAR, FACO_NUMPROV, FACO_ANULADO
        FROM FACTURAS_COMPRA F, TERCEROS T, PROVEEDORES P WHERE FACO_ID = :IDDOC AND F.TERC_NIT = T.TERC_NIT AND T.TERC_NIT = P.TERC_NIT
        INTO :PREFIJO, :NUM, :FECAUX, :NIT, :IMPINC, :VENCEAUX, :VRDTO, :VRADIC, :VRIVA, :VREXTRA, :VRTOTAL, :PRTFTE, :VRRTFTE, :PORC, :VRRTIVA, :PRTICA, :VRRTICA, :NOMBRE, TCTARTFTE, TCTARTIVA, TCTARTICA, TCTAPROV, :NUMPROV, :ANULADO;
    /* CENTRO DE LA BODEGA */
    IF (CENT = 'B') THEN
        SELECT BODE_CENTRO, BODE_PROY FROM BODEGA B, FACTURAS_COMPRA F WHERE B.BODE_COD = F.BODE_COD AND F.FACO_ID = :IDDOC INTO :CENTRO, :PROY;
    ELSE
        SELECT PREF_CENTRO,PREF_PROY  FROM PREFIJOS P, FACTURAS_COMPRA F WHERE P.PREF_PRE = F.PREF_PRE AND F.FACO_ID = :IDDOC AND P.TIDO_COD = 21 INTO :CENTRO, :PROY;
    if (ANULADO = 'N') then
        BEGIN
        NUMERO = PREFIJO || NUM;
        VRSUBT = VRTOTAL - VREXTRA - VRIVA;
        MERCANCIA = VRSUBT - VRADIC + VRDTO;
        EXECUTE PROCEDURE FECHA_A_CONTA(:FECAUX) returning_values (:FECHA);
        EXECUTE PROCEDURE FECHA_A_CONTA(:VENCEAUX) returning_values (:VENCE);
        if (NUMPROV IS NULL) then
            NUMPROV = NUMERO;
        CONCEPTO = 'FC No.' || NUMERO || '-' || SUBSTR(NOMBRE,1,26) || '-NPROV.' || NUMPROV;
        IDC = GEN_ID(ID_CONTABILIZA, 1);
        INSERT INTO CONTABILIZACION (CNTB_ID, CNTB_TIPOCOMP, CNTB_PREFCNT, CNTB_NUMERO, CNTB_FECHA, CNTB_CONCEPTO, CNTB_REF, CNTB_TIPOREF, CNTB_IDREF, CNTB_PREFREF, CNTB_NUMREF, CNTB_PROCESADO)
            VALUES (:IDC, :TIPOCOMP, :PREFCONT, :NUM, :FECHA, :CONCEPTO, '', 21, :IDDOC, :PREFIJO, :NUM, 'N');
        NUMITEMS = 0;
        SUMA = 0;
        NETO = 0;
        ERROR = 0;
        EXECUTE PROCEDURE LEE_CONFIGURACION('COMPRAS', 'FACTURAS', 'USAR IMPOCONSUMO COMO PORCENTAJE DE FOMENTO') RETURNING_VALUES (FOMENTO);
        EXECUTE PROCEDURE lee_configuracion('COMPRAS','FACTURAS','DESCUENTO Y VALOR ADICIONAL DEL DOCUMENTO COMO MENOR VALOR DEL COSTO') returning_values (:MENORV);
        SELECT SUM(FCDE_consumo) from facturas_compras_detalle where faco_id = :IDDOC into :valoradic;
        if (MENORV = 'SI') then
            if (MERCANCIA <> 0) then
                FACTOR = (CAST(VRSUBT AS DOUBLE PRECISION) - VALORADIC) / (CAST(MERCANCIA AS DOUBLE PRECISION) - VALORADIC);
            ELSE
                FACTOR = 1;
        ELSE
           FACTOR = 1;
        SELECT CAST(CONF_VALOR AS INTEGER) FROM CONFIGURACION WHERE CONF_MODULO = 'COMPRAS' AND CONF_CATEGORIA = 'DOCUMENTOS' AND CONF_PROPIEDAD = 'REDONDEO AL MULTIPLO DE DIEZ EN TOTALES' INTO :DIG;
        if (INVEN = 'A') then
            BEGIN
            FOR SELECT MAX(COAR_CTACOMP), SUM(CAST(FCDE_CANT AS DOUBLE PRECISION) * (FCDE_PRUNIT-FCDE_DTOMONTO)), SUM(FCDE_IVAMONTO), SUM(FCDE_CONSUMO), MAX(F.BODE_COD)
                FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_COMPRAS_DETALLE F WHERE F.FACO_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD
                GROUP BY COAR_CTACOMP, F.BODE_COD INTO :CTAINVEN, :MONTO, :IMPTOS, :VALORADIC, :BODE_DET DO
                BEGIN
                IF (CENT = 'B') THEN
                  SELECT BODE_CENTRO, BODE_PROY FROM BODEGA WHERE BODE_COD = :BODE_DET INTO :CENTRODET, :PROYDET;
                if (IMPINC = 'S') then
                    BEGIN
                    MONTO = MONTO - IMPTOS;
                    if (FOMENTO <> 'SI' ) then
                        MONTO = MONTO - VALORADIC;
                    END
                MONTO = MONTO * FACTOR;
                execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                EXECUTE PROCEDURE CUENTA_INTERFAZ(21, :IDDOC, :CTAINVEN, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    FOR SELECT F.ARTI_COD, (FCDE_CANT * (FCDE_PRUNIT-FCDE_DTOMONTO)), FCDE_IVAMONTO, FCDE_CONSUMO
                        FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_COMPRAS_DETALLE F WHERE F.FACO_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTACOMP = :CUENTA
                        INTO :ARTICULO, :MONTO, :IMPTOS, :VALORADIC DO
                        BEGIN
                        if (IMPINC = 'S') then
                            BEGIN
                            MONTO = MONTO - IMPTOS;
                            if (FOMENTO <> 'SI' ) then
                                MONTO = MONTO - VALORADIC;
                            END
                        MONTO = MONTO * FACTOR;
                        execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                        IF (CENT = 'B') THEN
                           INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                               VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROYDET, :CENTRODET, NULL, NULL, NULL, :ARTICULO, 0, 0);
                        ELSE
                           INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                               VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                        NUMITEMS = NUMITEMS + 1;
                        NETO = NETO + MONTO;
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    IF (CENT = 'B') THEN
                       INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                           VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROYDET, :CENTRODET, :NUMERO, NULL, :VENCE, NULL, 0, 21);
                    ELSE
                       INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                           VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 21);
                    NUMITEMS = NUMITEMS + 1;
                    NETO = NETO + MONTO;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    IF (CENT = 'B') THEN
                       INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                           VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROYDET, :CENTRODET, NULL, NULL, NULL, NULL, 0, 0);
                    ELSE
                       INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                           VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NUMITEMS = NUMITEMS + 1;
                    NETO = NETO + MONTO;
                    END
                END
            END
        if (INVEN = 'K') then
            BEGIN
            FOR SELECT SUM(CAST(FCDE_CANT AS DOUBLE PRECISION) * (FCDE_PRUNIT-FCDE_DTOMONTO)), SUM(FCDE_IVAMONTO), SUM(FCDE_CONSUMO), MAX(BODE_COD)
                FROM FACTURAS_COMPRAS_DETALLE WHERE FACO_ID = :IDDOC GROUP BY BODE_COD INTO :MONTO, :IMPTOS, :VALORADIC, :BODE_DET Do
                BEGIN
                  IF (CENT = 'B') THEN
                    SELECT BODE_CENTRO, BODE_PROY FROM BODEGA WHERE BODE_COD = :BODE_DET INTO :CENTRODET, :PROYDET;
                  if (IMPINC = 'S') then
                   BEGIN
                    MONTO = MONTO - IMPTOS;
                    if (FOMENTO <> 'SI' ) then
                      MONTO = MONTO - VALORADIC;
                   END
                  MONTO = MONTO * FACTOR;
                  execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                  execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                  EXECUTE PROCEDURE CUENTA_INTERFAZ(21, :IDDOC, :CTAINVEN, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                  if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                  if (TIPOCUEN = 'I') then
                   BEGIN
                    FOR SELECT ARTI_COD, (FCDE_CANT * (FCDE_PRUNIT-FCDE_DTOMONTO)), FCDE_IVAMONTO, FCDE_CONSUMO
                      FROM FACTURAS_COMPRAS_DETALLE WHERE FACO_ID = :IDDOC INTO :ARTICULO, :MONTO, :IMPTOS, :VALORADIC DO
                       BEGIN
                       if (IMPINC = 'S') then
                        BEGIN
                         MONTO = MONTO - IMPTOS;
                         if (FOMENTO <> 'SI' ) then
                            MONTO = MONTO - VALORADIC;
                        END
                       MONTO = MONTO * FACTOR;
                       execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                       execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                       IF (CENT = 'B') THEN
                          INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                             VALUES (:IDC, :NUMITEMS, :CTAINVEN, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROYDET, :CENTRODET, NULL, NULL, NULL, :ARTICULO, 0, 0);
                       ELSE
                          INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                             VALUES (:IDC, :NUMITEMS, :CTAINVEN, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                       NUMITEMS = NUMITEMS + 1;
                       NETO = NETO + MONTO;
                       END
                   END
                  if (TIPOCUEN = 'C') then
                   BEGIN
                    IF (CENT = 'B') THEN
                       INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                         VALUES (:IDC, :NUMITEMS, :CTAINVEN, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROYDET, :CENTRODET, :NUMERO, NULL, :VENCE, NULL, 0, 21);
                    ELSE
                       INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                         VALUES (:IDC, :NUMITEMS, :CTAINVEN, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 21);
                    NUMITEMS = NUMITEMS + 1;
                    NETO = NETO + MONTO;
                   END
                  if (TIPOCUEN = 'N') then
                   BEGIN
                    IF (CENT = 'B') THEN
                       INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                          VALUES (:IDC, :NUMITEMS, :CTAINVEN, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROYDET, :CENTRODET, NULL, NULL, NULL, NULL, 0, 0);
                    ELSE
                       INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                          VALUES (:IDC, :NUMITEMS, :CTAINVEN, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NUMITEMS = NUMITEMS + 1;
                    NETO = NETO + MONTO;
                   END
                END
            END
        /* EL IVA */
        if (IVA = 'A') then
            BEGIN
            FOR SELECT MAX(COAR_CTAIVAC), SUM(FCDE_IVAMONTO), SUM(CAST(FCDE_CANT AS DOUBLE PRECISION) * (FCDE_PRUNIT-FCDE_DTOMONTO)), SUM(FCDE_CONSUMO)
                FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_COMPRAS_DETALLE F
                WHERE F.FACO_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND FCDE_IVAMONTO <> 0
                GROUP BY COAR_CTAIVAC
                INTO :CTAIVA, :IMPTOS, :MONTO, :VALORADIC DO
              if (IMPTOS <> 0) then
                BEGIN
                IMPTOS = CAST(IMPTOS AS DOUBLE PRECISION) * VRSUBT / MERCANCIA;
                if (IMPINC = 'S') then
                    BEGIN
                    MONTO = MONTO - IMPTOS;
                    if (FOMENTO <> 'SI' ) then
                        MONTO = MONTO - VALORADIC;
                    END
                MONTO = CAST(MONTO AS DOUBLE PRECISION) * VRSUBT / MERCANCIA;
                execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                EXECUTE PROCEDURE CUENTA_INTERFAZ(21, :IDDOC, :CTAIVA, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    FOR SELECT F.ARTI_COD, FCDE_IVAMONTO, (FCDE_CANT * (FCDE_PRUNIT-FCDE_DTOMONTO)), TAIV_PORC, FCDE_CONSUMO
                        FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_COMPRAS_DETALLE F, TARIFA_IVA T WHERE F.FACO_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTAIVAV = :CUENTA AND A.TAIV_COD = T.TAIV_COD
                        INTO :ARTICULO, :IMPTOS, :MONTO, :PORCIVA, :VALORADIC
                    DO
                        BEGIN
                        IMPTOS = CAST(IMPTOS AS DOUBLE PRECISION) * VRSUBT / MERCANCIA;
                        if (IMPINC = 'S') then
                            BEGIN
                            MONTO = MONTO - IMPTOS;
                            if (FOMENTO <> 'SI' ) then
                                MONTO = MONTO - VALORADIC;
                            END
                        MONTO = CAST(MONTO AS DOUBLE PRECISION) * VRSUBT / MERCANCIA;
                        execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :IMPTOS, 0, :MONTO, :PORCIVA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                        NUMITEMS = NUMITEMS + 1;
                        NETO = NETO + IMPTOS;
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :IMPTOS, 0, :MONTO, :IMPTOS*100/:MONTO, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 21);
                    NUMITEMS = NUMITEMS + 1;
                    NETO = NETO + IMPTOS;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :IMPTOS, 0, :MONTO, CAST(:IMPTOS AS DOUBLE PRECISION)*100/CAST(:MONTO AS DOUBLE PRECISION), :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NUMITEMS = NUMITEMS + 1;
                    NETO = NETO + IMPTOS;
                    END
                END
            END
        if (IVA = 'K') then /* IVA EN CTA CONSTANTE */
            BEGIN
            SELECT SUM(FCDE_IVAMONTO), SUM(CAST(FCDE_CANT AS DOUBLE PRECISION) * (FCDE_PRUNIT-FCDE_DTOMONTO)), SUM(FCDE_CONSUMO)
                FROM FACTURAS_COMPRAS_DETALLE F
                WHERE F.FACO_ID = :IDDOC  AND FCDE_IVAMONTO <> 0
                INTO :IMPTOS, :MONTO, :VALORADIC;
            if (IMPTOS <> 0) then
                BEGIN
                IMPTOS = CAST(IMPTOS AS DOUBLE PRECISION) * VRSUBT / MERCANCIA;
                if (IMPINC = 'S') then
                    BEGIN
                    MONTO = MONTO - IMPTOS;
                    if (FOMENTO <> 'SI' ) then
                        MONTO = MONTO - VALORADIC;
                    END
                MONTO = CAST(MONTO AS DOUBLE PRECISION) * VRSUBT / MERCANCIA;
                execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                EXECUTE PROCEDURE CUENTA_INTERFAZ(21, :IDDOC, :CTAIVA, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    FOR SELECT F.ARTI_COD, (FCDE_CANT * (FCDE_PRUNIT-FCDE_DTOMONTO)), FCDE_IVAMONTO, TAIV_PORC, FCDE_CONSUMO
                        FROM ARTICULO A, FACTURAS_COMPRAS_DETALLE F, TARIFA_IVA T WHERE F.FACO_ID = :IDDOC AND A.TAIV_COD = T.TAIV_COD
                        INTO :ARTICULO, :MONTO, :IMPTOS, :PORCIVA, :VALORADIC DO
                        BEGIN
                        IMPTOS = CAST(IMPTOS AS DOUBLE PRECISION) * VRSUBT / MERCANCIA;
                        if (IMPINC = 'S') then
                            BEGIN
                            MONTO = MONTO - IMPTOS;
                            if (FOMENTO <> 'SI' ) then
                                MONTO = MONTO - VALORADIC;
                            END
                        MONTO = CAST(MONTO AS DOUBLE PRECISION) * VRSUBT / MERCANCIA;
                        execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                        if (IMPTOS <> 0) then
                            BEGIN
                            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                VALUES (:IDC, :NUMITEMS, :CTAIVA, :CONCEPTO, '', :IMPTOS, 0, :MONTO, :PORCIVA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                            NUMITEMS = NUMITEMS + 1;
                            NETO = NETO + IMPTOS;
                            END
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NUMITEMS, :CTAIVA, :CONCEPTO, '', :IMPTOS, 0, :MONTO, :IMPTOS*100/:MONTO, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 21);
                    NUMITEMS = NUMITEMS + 1;
                    NETO = NETO + IMPTOS;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NUMITEMS, :CTAIVA, :CONCEPTO, '', :IMPTOS, 0, :MONTO, :IMPTOS*100/:MONTO, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NUMITEMS = NUMITEMS + 1;
                    NETO = NETO + IMPTOS;
                    END
                END
            END
        /* EL IMPOCONSUMO */
        if (CONSUMO = 'A') then
            BEGIN
            FOR SELECT MAX(COAR_CTACONS), SUM(FCDE_CONSUMO) FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_COMPRAS_DETALLE F
                WHERE F.FACO_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD GROUP BY COAR_CTACONS INTO :CTACONSUMO, :IMPTOS
            DO
              if (IMPTOS <> 0) then
                BEGIN
                execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                EXECUTE PROCEDURE CUENTA_INTERFAZ(21, :IDDOC, :CTACONSUMO, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (FOMENTO <> 'SI') then
                    BEGIN
                    if (TIPOCUEN = 'I') then
                        BEGIN
                        FOR SELECT F.ARTI_COD, FCDE_CONSUMO FROM ARTICULO A, FACTURAS_COMPRAS_DETALLE F WHERE F.FACO_ID = :IDDOC INTO :ARTICULO, :IMPTOS
                            DO
                            BEGIN
                            if (IMPTOS <> 0) then
                                BEGIN
                                execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                    VALUES (:IDC, :NUMITEMS, :CTACONSUMO, :CONCEPTO, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                                NUMITEMS = NUMITEMS + 1;
                                NETO = NETO + IMPTOS;
                                END
                            END
                        END
                    if (TIPOCUEN = 'C') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CTACONSUMO, :CONCEPTO, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                        NUMITEMS = NUMITEMS + 1;
                        NETO = NETO + IMPTOS;
                        END
                    if (TIPOCUEN = 'N') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CTACONSUMO, :CONCEPTO, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NUMITEMS = NUMITEMS + 1;
                        NETO = NETO + IMPTOS;
                        END
                    END
                ELSE
                    BEGIN
                    if (TIPOCUEN = 'I') then
                        BEGIN
                        FOR SELECT F.ARTI_COD, FCDE_CONSUMO FROM ARTICULO A, FACTURAS_COMPRAS_DETALLE F WHERE F.FACO_ID = :IDDOC INTO :ARTICULO, :IMPTOS
                            DO
                            BEGIN
                            if (IMPTOS <> 0) then
                                BEGIN
                                execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                    VALUES (:IDC, :NUMITEMS, :CTACONSUMO, :CONCEPTO, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                                NUMITEMS = NUMITEMS + 1;
                                NETO = NETO - IMPTOS;
                                END
                            END
                        END
                    if (TIPOCUEN = 'C') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CTACONSUMO, :CONCEPTO, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                        NUMITEMS = NUMITEMS + 1;
                        NETO = NETO - IMPTOS;
                        END
                    if (TIPOCUEN = 'N') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CTACONSUMO, :CONCEPTO, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NUMITEMS = NUMITEMS + 1;
                        NETO = NETO - IMPTOS;
                        END
                    END
                END
            END
        if (CONSUMO = 'K') then /* CONSUMO EN CTA CONSTANTE */
            BEGIN
            SELECT SUM(FCDE_CONSUMO) FROM FACTURAS_COMPRAS_DETALLE F WHERE F.FACO_ID = :IDDOC INTO :IMPTOS;
            if (IMPTOS <> 0) then
              BEGIN
              execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
              /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
              EXECUTE PROCEDURE CUENTA_INTERFAZ(21, :IDDOC, :CTACONSUMO, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
              if (ERRORC <> 0) then
                ERROR = ERROR + 1;
              if (FOMENTO <> 'SI') then
                BEGIN
                /* DEPENDE DEL TIPO DE CUENTA */
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT F.ARTI_COD, FCDE_CONSUMO FROM ARTICULO A, FACTURAS_COMPRAS_DETALLE F WHERE F.FACO_ID = :IDDOC INTO :ARTICULO, :IMPTOS
                        DO
                        BEGIN
                        if (IMPTOS <> 0) then
                            BEGIN
                            execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                VALUES (:IDC, :NUMITEMS, :CTACONSUMO, :CONCEPTO, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                            NUMITEMS = NUMITEMS + 1;
                            NETO = NETO + IMPTOS;
                            END
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    /* INSERTE EL REGISTRO DE LA BASE */
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NUMITEMS, :CTACONSUMO, :CONCEPTO, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    NUMITEMS = NUMITEMS + 1;
                    NETO = NETO + IMPTOS;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NUMITEMS, :CTACONSUMO, :CONCEPTO, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NUMITEMS = NUMITEMS + 1;
                    NETO = NETO + IMPTOS;
                    END
                END
              ELSE
                BEGIN
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT F.ARTI_COD, FCDE_CONSUMO FROM ARTICULO A, FACTURAS_COMPRAS_DETALLE F WHERE F.FACO_ID = :IDDOC INTO :ARTICULO, :IMPTOS
                        DO
                        BEGIN
                        if (IMPTOS <> 0) then
                            BEGIN
                           execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                           INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                VALUES (:IDC, :NUMITEMS, :CTACONSUMO, :CONCEPTO, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                            NUMITEMS = NUMITEMS + 1;
                            NETO = NETO - IMPTOS;
                            END
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    /* INSERTE EL REGISTRO DE LA BASE */
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NUMITEMS, :CTACONSUMO, :CONCEPTO, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    NUMITEMS = NUMITEMS + 1;
                    NETO = NETO - IMPTOS;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NUMITEMS, :CTACONSUMO, :CONCEPTO, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NUMITEMS = NUMITEMS + 1;
                    NETO = NETO - IMPTOS;
                    END
                END
              end
            END
        /* DESCUENTO */
        if ((CTADTO IS NOT NULL) AND
            (CTADTO <> '')) THEN
          BEGIN
          execute procedure redondee(VRDTO, DIG) returning_values (VRDTO);
          if (VRDTO <> 0) then
            begin
            /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
            EXECUTE PROCEDURE CUENTA_INTERFAZ(21, :IDDOC, :CTADTO, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :VRDTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 21);
                NUMITEMS = NUMITEMS + 1;
                NETO = NETO - VRDTO;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                /* INSERTE EL REGISTRO DE LA BASE */
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :VRDTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NUMITEMS = NUMITEMS + 1;
                NETO = NETO - VRDTO;
                END
            end
          END
        /* VALOR ADIC */
        if ((CTAADIC IS NOT NULL) AND
            (CTAADIC <> '')) THEN
          BEGIN
          execute procedure redondee(VRADIC, DIG) returning_values (VRADIC);
          if (VRADIC <> 0) then
            begin
            /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
            EXECUTE PROCEDURE CUENTA_INTERFAZ(21, :IDDOC, :CTAADIC, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :VRADIC, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 21);
                NUMITEMS = NUMITEMS + 1;
                NETO = NETO + VRADIC;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :VRADIC, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NUMITEMS = NUMITEMS + 1;
                NETO = NETO + VRADIC;
                END
            end
          END
        /* VALOR EXTRA */
        if ((CTAEXTRA IS NOT NULL) AND
            (CTAEXTRA <> '')) THEN
          BEGIN
          execute procedure redondee(VREXTRA, DIG) returning_values (VREXTRA);
          if (VREXTRA <> 0) then
            begin
            /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
            EXECUTE PROCEDURE CUENTA_INTERFAZ(21, :IDDOC, :CTAEXTRA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :VREXTRA, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 21);
                NUMITEMS = NUMITEMS + 1;
                NETO = NETO + VREXTRA;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :VREXTRA, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NUMITEMS = NUMITEMS + 1;
                NETO = NETO + VREXTRA;
                END
            end
          END

        /* DESCUENTE EL IMPOCONSUMO */
        SELECT SUM(FCDE_CONSUMO) FROM FACTURAS_COMPRAS_DETALLE F WHERE F.FACO_ID = :IDDOC INTO :IMPTOS;
        if (IMPTOS IS NULL) then
            IMPTOS = 0;
        vrsubt = vrsubt - IMPTOS;
        /* RETENCION FUENTE */
        if ((RTFTE = 'P') or (RTFTE = 'K')) then
          BEGIN
          execute procedure redondee(VRRTFTE, DIG) returning_values (VRRTFTE);
          if (VRRTFTE <> 0) then
            begin
            if (RTFTE = 'P') then
                CTARTFTE = TCTARTFTE;
            EXECUTE PROCEDURE CUENTA_INTERFAZ(21, :IDDOC, :CTARTFTE, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :VRRTFTE, (:VRSUBT*-1), :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NUMITEMS = NUMITEMS + 1;
                NETO = NETO - VRRTFTE;
                SUMA = VRRTFTE;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :VRRTFTE, (:VRSUBT*-1), :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NUMITEMS = NUMITEMS + 1;
                NETO = NETO - VRRTFTE;
                SUMA = VRRTFTE;
                END
            end
          END
        if (RTFTE = 'A') then
          BEGIN
          FOR SELECT MAX(COAR_CTARTFTE), MAX(COAR_RTFTE), MIN(COAR_RTBASE), SUM(FCDE_TOTAL-FCDE_IVAMONTO-FCDE_CONSUMO), SUM((FCDE_TOTAL-FCDE_IVAMONTO-FCDE_CONSUMO)*COAR_RTFTE)
            FROM CONTABIL_ARTICULO C, FACTURAS_COMPRAS_DETALLE F
            WHERE F.faco_id = :IDDOC AND F.ARTI_COD = C.ARTI_COD
            GROUP BY COAR_CTARTFTE
            INTO :CTARTFTE, :PRTFTE, :baseadic,  :MONTO, :VRRTFTE
            DO
            BEGIN
            MONTO = MONTO * FACTOR * -1;
            if (ABS(MONTO) >= :baseadic) then
                BEGIN
                VRRTFTE = VRRTFTE * FACTOR / 100;
                execute procedure redondee(VRRTFTE, DIG) returning_values (VRRTFTE);
                execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                if (VRRTFTE <> 0) then
                    BEGIN
                    EXECUTE PROCEDURE CUENTA_INTERFAZ(21, :IDDOC, :CTARTFTE, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
                    if (ERRORC <> 0) then
                        ERROR = ERROR + 1;
                    if (TIPOCUEN = 'C') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :VRRTFTE, :MONTO, :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                        NUMITEMS = NUMITEMS + 1;
                        NETO = NETO - VRRTFTE;
                        SUMA = VRRTFTE;
                        END
                    if (TIPOCUEN = 'N') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :VRRTFTE, :MONTO, :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NUMITEMS = NUMITEMS + 1;
                        NETO = NETO - VRRTFTE;
                        SUMA = VRRTFTE;
                        END
                    end
                end
              END
          END
        /* RETENCION IVA */
        if ((RTIVA = 'P') or (RTIVA = 'K')) then
          BEGIN
          execute procedure redondee(VRRTIVA, DIG) returning_values (VRRTIVA);
          if (VRRTIVA <> 0) then
            begin
            if (RTIVA = 'P') then
                CTARTIVA = TCTARTIVA;
            EXECUTE PROCEDURE CUENTA_INTERFAZ(21, :IDDOC, :CTARTIVA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :VRRTIVA, (:VRIVA*-1), :PORC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 21);
                NUMITEMS = NUMITEMS + 1;
                NETO = NETO - VRRTIVA;
                SUMA = SUMA + VRRTIVA;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :VRRTIVA, (:VRIVA*-1), :PORC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NUMITEMS = NUMITEMS + 1;
                NETO = NETO - VRRTIVA;
                SUMA = SUMA + VRRTIVA;
                END
            end
          END
        /* RETENCION DE ICA */
        if ((RTICA = 'P') or (RTICA = 'K')) then
          BEGIN
          execute procedure redondee(VRRTICA, DIG) returning_values (VRRTICA);
          if (VRRTICA <> 0) then
            begin
            if (RTICA = 'P') then
                CTARTICA = TCTARTICA;
            EXECUTE PROCEDURE CUENTA_INTERFAZ(21, :IDDOC, :CTARTICA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :VRRTICA, (:VRSUBT*-1), :PRTICA, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 21);
                NUMITEMS = NUMITEMS + 1;
                NETO = NETO - VRRTICA;
                SUMA = SUMA + VRRTICA;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :VRRTICA, (:VRSUBT*-1), :PRTICA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NUMITEMS = NUMITEMS + 1;
                NETO = NETO - VRRTICA;
                SUMA = SUMA + VRRTICA;
                END
            end
          END
        /* CIERRE EL COMPROBANTE CONTRA LA CUENTA DEL TERCERO O LA CONSTANTE */
        if ((CXP = 'P') or (CXP = 'K')) then
            BEGIN
            SUMA = VRTOTAL - SUMA;
            execute procedure redondee(SUMA, DIG) returning_values (SUMA);
            if (CXP = 'P') then
                CTACXP = TCTAPROV;
            EXECUTE PROCEDURE CUENTA_INTERFAZ(21, :IDDOC, :CTACXP, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :SUMA, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 21);
            if (TIPOCUEN = 'N') then
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :SUMA, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NETO = NETO - SUMA;
            NUMITEMS = NUMITEMS + 1;
            END
        /* recorra las cuentas adicionales */
        FOR SELECT INCC_CUENTA, INCC_BASE, INCC_PORC, INCC_VALOR, INCC_DB FROM INTERFAZ_COMPRAS_CTAS
            WHERE INCO_ID = :IDINTER INTO :CUENTAADIC, :BASEADIC, :PORCADIC, :VALORADIC, :DBADIC
            DO
            BEGIN
            if (VALORADIC <> 0) then
                MONTO = VALORADIC;
            ELSE
                BEGIN
                if (:BASEADIC = 'SUBTOTAL') then
                    VALORADIC = VRTOTAL - VREXTRA - VRIVA - VRADIC + VRDTO;
                if (:BASEADIC = 'DESCUENTO') then
                    VALORADIC = VRDTO;
                if (:BASEADIC = 'IVA') then
                    VALORADIC = VRIVA;
                if (:BASEADIC = 'CONSUMO') then
                    SELECT SUM(FCDE_CONSUMO) FROM FACTURAS_COMPRAS_DETALLE F WHERE F.FACO_ID = :IDDOC INTO :VALORADIC;
                if (:BASEADIC = 'ADICIONAL') then
                    VALORADIC = VRADIC;
                if (:BASEADIC = 'EXTRA') then
                    VALORADIC = VREXTRA;
                if (:BASEADIC = 'TOTAL') then
                    VALORADIC = VRTOTAL;
                MONTO = CAST(VALORADIC AS DOUBLE PRECISION) * PORCADIC / 100;
                END
            if (MONTO <> 0) then
                BEGIN
                execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                EXECUTE PROCEDURE CUENTA_INTERFAZ(21, :IDDOC, :CUENTAADIC, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'C') then
                    BEGIN
                    if (DBADIC = 'S') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTAADIC, :CONCEPTO, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                        SUMA = SUMA + MONTO;
                        NETO = NETO + MONTO;
                        END
                    ELSE
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTAADIC, :CONCEPTO, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                        SUMA = SUMA - MONTO;
                        NETO = NETO - MONTO;
                        END
                    NUMITEMS = NUMITEMS + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    if (DBADIC = 'S') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTAADIC, :CONCEPTO, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        SUMA = SUMA + MONTO;
                        NETO = NETO + MONTO;
                        END
                    ELSE
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTAADIC, :CONCEPTO, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        SUMA = SUMA - MONTO;
                        NETO = NETO - MONTO;
                        END
                    NUMITEMS = NUMITEMS + 1;
                    END
                END
            END
        if (NETO <> 0) then
            BEGIN
            EXECUTE PROCEDURE lee_configuracion ('CONTABILIDAD','GENERAL','CUENTA PARA CUADRAR COMPROBANTES DESCUADRADOS DE INTERFAZ') returning_values (:ctaadic);
            if (ctaadic <> '') then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(21, :IDDOC, :CTAADIC, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'C') then
                    BEGIN
                    if (NETO < 0) then
                        BEGIN
                        NETO = NETO * -1;
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :NETO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                        END
                    ELSE
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :NETO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                        END
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    if (NETO < 0) then
                        BEGIN
                        NETO = NETO * -1;
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :NETO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        END
                    ELSE
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :NETO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        END
                    END
                END
            END
        END
    if (ERROR > 0) then
        VER = 'S';
    SUSPEND;
    END
ELSE
    BEGIN
    EXECUTE PROCEDURE ERROR (21, :IDDOC, :PREFIJO, 1);
    ERROR = ERROR + 1;
    VER = 'S';
    SUSPEND;
    END
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE CONTABILICE_COMP_SIMPLIFICADO(
    IDI INTEGER)
RETURNS (
    ID INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    ESTADO VARCHAR(20),
    IDC INTEGER)
AS
DECLARE VARIABLE VER CHAR(2);
declare variable ERROR INTEGER;
BEGIN
FOR SELECT FACO_ID, PREF_PRE, FACO_NUMERO FROM FACTURAS_COMPRA C, PROVEEDORES P WHERE
    C.TERC_NIT = P.TERC_NIT AND PROV_SIMPLIFICADO = 'S' AND FACO_ANULADO = 'N'
    ORDER BY FACO_ID INTO :ID, :PREF, :NUMERO
DO
  BEGIN
  ESTADO = 'PROCESANDO';
  SUSPEND;
  /* BORRE LA CONTABILIZACION */
/*  delete FROM comprobante_detalle WHERE ENCO_CONSEC IN (SELECT ENCO_CONSEC FROM COMPROBANTE_ENCABEZADO WHERE ENCO_TIPOREF = 21 AND ENCO_IDREF = :ID);
  DELETE FROM comprobante_encabezado  WHERE ENCO_TIPOREF = 21 AND ENCO_IDREF = :ID; */
  EXECUTE PROCEDURE CONTABIL_FACTCOMP (:ID, :IDI) RETURNING_VALUES (:ERROR, VER, :IDC);
  if (ERROR = 0) then
    BEGIN
/*    EXECUTE PROCEDURE CONTABILIZA_PENDIENTE (:IDC); */
    ESTADO = 'OK';
    END
  ELSE
    ESTADO = 'ERROR';
  suspend;
  END
END

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE FACTCOMP_SIN_CONTABILIDAD(
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    ID INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    ESTADO VARCHAR(20),
    IDI INTEGER,
    IDC INTEGER)
AS
DECLARE VARIABLE VER CHAR(2);
declare variable FECICNT VARCHAR(10);
declare variable FECFCNT VARCHAR(10);
declare variable ERROR INTEGER;
declare variable idref INTEGER;
BEGIN
EXECUTE PROCEDURE fecha_a_conta(FECINI) returning_values (FECICNT);
EXECUTE PROCEDURE fecha_a_conta(FECFIN) returning_values (FECFCNT);
FOR SELECT FACO_ID, PREF_PRE, FACO_NUMERO FROM FACTURAS_COMPRA WHERE FACO_ANULADO = 'N' AND
    FACO_FECHA >= :FECINI AND FACO_FECHA <= :FECFIN ORDER BY FACO_ID
    INTO :ID, :PREF, :NUMERO
DO
  BEGIN
  idref = null;
  SELECT ENCO_IDREF FROM COMPROBANTE_ENCABEZADO WHERE ENCO_TIPOREF = 21 AND ENCO_FECHA >= :FECICNT AND ENCO_FECHA <= :FECFCNT and ENCO_IDREF = :id into :idref;
  if (idref IS NULL) then
  begin
   ESTADO = 'PROCESANDO';
   SUSPEND;
   SELECT MAX(INCO_ID) FROM INTERFAZ_COMPRAS WHERE PREF_PRE = :PREF AND TIDO_COD = 21 INTO :IDI;
   EXECUTE PROCEDURE CONTABIL_FACTCOMP (:ID, :IDI) RETURNING_VALUES (:ERROR, VER, :IDC);
   if (ERROR = 0) then
    BEGIN
    EXECUTE PROCEDURE CONTABILIZA_PENDIENTE (:IDC);
    ESTADO = 'OK';
    END
   ELSE
    ESTADO = 'ERROR';
   suspend;
  End
  END
END

^

SET TERM ; ^


/* 20100814 */
/* devoluciones no tomaba el ico como mayor valor del ingreso ni del costo */
/* error en contabil_factura, mal la base de retenciones si ico como ingreso */

SET TERM ^ ;

CREATE OR ALTER procedure CONTABIL_DEVOLCLI (
    IDDOC integer,
    IDINTER integer)
returns (
    ERROR integer,
    VER char(1),
    IDC integer)
AS
declare variable PREF VARCHAR(4);
declare variable NUM VARCHAR(6);
declare variable NUMERO VARCHAR(10);
declare variable FECAUX DATE;
declare variable FECHA CHAR(8);
declare variable CONC CHAR(120);
declare variable NUMFAC VARCHAR(10);
declare variable VRDTO NUMERIC(18, 2);
declare variable VRADIC NUMERIC(18, 2);
declare variable VRSUBT NUMERIC(18, 2);
declare variable VRIVA NUMERIC(18, 2);
declare variable PRTFTE NUMERIC(9, 2);
declare variable VRRTFTE NUMERIC(18, 2);
declare variable VRRTIVA NUMERIC(18, 2);
declare variable PRTICA NUMERIC(9, 2);
declare variable VRRTICA NUMERIC(18, 2);
declare variable VRTOTAL NUMERIC(18, 2);
declare variable VREXTRA NUMERIC(18, 2);
declare variable TIPOCOMP VARCHAR(3);
declare variable PREFCONT VARCHAR(4);
declare variable VENTAS CHAR(1);
declare variable CTAVENTAS VARCHAR(20);
declare variable IVA CHAR(1);
declare variable CTAIVA VARCHAR(20);
declare variable CONSUMO CHAR(1);
declare variable CTACONSUMO VARCHAR(20);
declare variable CARTERA CHAR(1);
declare variable CTACARTERA VARCHAR(20);
declare variable RTFTE CHAR(1);
declare variable CTARTFTE VARCHAR(20);
declare variable RTIVA CHAR(1);
declare variable CTARTIVA VARCHAR(20);
declare variable RTICA CHAR(1);
declare variable CTARTICA VARCHAR(20);
declare variable INVEN CHAR(1);
declare variable CTAINVEN VARCHAR(20);
declare variable COSTOS CHAR(1);
declare variable CTACOSTOS VARCHAR(20);
declare variable CTADTO VARCHAR(20);
declare variable CTAADIC VARCHAR(20);
declare variable CTAEXTRA VARCHAR(20);
declare variable EXISTE CHAR(1);
declare variable CUENTA VARCHAR(20);
declare variable MONTO NUMERIC(18,2);
declare variable TIPOCUEN CHAR(1);
declare variable NIT VARCHAR(20);
declare variable PROY VARCHAR(4);
declare variable CENTRO VARCHAR(4);
declare variable PROYI VARCHAR(4);
declare variable CENTI VARCHAR(4);
declare variable PORC NUMERIC(5,2);
declare variable DEBITO NUMERIC(18,2);
declare variable CREDITO NUMERIC(18,2);
declare variable NROI INTEGER;
declare variable ART VARCHAR(15);
declare variable IMPINC CHAR(1);
declare variable IMPTOS NUMERIC(18, 2);
declare variable SUMA NUMERIC(18,2);
declare variable PORCIVA NUMERIC(9,2);
declare variable TCTACLIEN VARCHAR(20);
declare variable TCTAVENTA VARCHAR(20);
declare variable TCTARTFTE VARCHAR(20);
declare variable TCTARTIVA VARCHAR(20);
declare variable TCTARTICA VARCHAR(20);
declare variable CTADIC VARCHAR(20);
declare variable BASEADIC VARCHAR(20);
declare variable PORCADIC NUMERIC(5,2);
declare variable VALORADIC NUMERIC(18,2);
declare variable DBADIC CHAR(1);
declare variable PTOVTA INTEGER;
declare variable ANULADO CHAR(1);
declare variable CENT CHAR(1);
DECLARE VARIABLE MERCANCIA NUMERIC(18,2);
declare variable FACTOR DOUBLE PRECISION;
declare variable DIG INTEGER;
DECLARE VARIABLE FOMENTO VARCHAR(2);
DECLARE VARIABLE VRCONSUMO NUMERIC(18,2);
declare variable AUTORET VARCHAR(10);
declare variable FAUTORET DATE;
declare variable IDREM INTEGER;
declare variable IDPED INTEGER;
declare variable DTOXIT CHAR(2);
declare variable ERRORC INTEGER;
declare variable DEC2799 char(2);
declare variable ctadtoiva varchar(20);
declare variable ICOING CHAR(2);
BEGIN
EXECUTE PROCEDURE lee_configuracion ('FACTURACION', 'FACTURAS', 'DESCONTAR IVA DE PRODUCTOS DECRETO 2799') returning_values (:DEC2799);
EXECUTE PROCEDURE LEE_CONFIGURACION('COMPRAS', 'FACTURAS', 'USAR IMPOCONSUMO COMO PORCENTAJE DE FOMENTO') returning_values (FOMENTO);
EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'FECHA AUTORETENEDOR NO DESCONTAR RETENCIONES DEL SALDO PERO SI CONTABILIZARLAS') returning_values (AUTORET);
EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION', 'ARTICULOS', 'IMPOCONSUMO COMO MAYOR VALOR DEL COSTO Y DEL INGRESO') returning_values (ICOING);
if (AUTORET <> '') then
    FAUTORET = CAST(AUTORET AS DATE);
else
    FAUTORET = '9999/12/31';
  /* BUSQUE LA INTERFACE */
  EXISTE = 'N';
  SELECT 'S', TICO_COD, PRCO_PRE, INVE_VENTAS, INVE_IVA, INVE_CONSUMO, INVE_CARTERA, INVE_RTFTE, INVE_RTIVA, INVE_RTICA, INVE_COSTO, INVE_INVEN, INVE_CTAVENTAS, INVE_CTAIVA, INVE_CTACONSUMO, INVE_CTADTO, INVE_CTAADIC, INVE_CTAEXTRA, INVE_CTACARTERA, INVE_CTARTFTE, INVE_CTARTIVA, INVE_CTARTICA, INVE_CTAINVEN, INVE_CTACOSTOS, INVE_CONFIRMAR, INVE_CENTRO
    FROM INTERFAZ_VENTAS
    WHERE INVE_ID = :IDINTER
    INTO :EXISTE, :TIPOCOMP, :PREFCONT, :VENTAS, :IVA, :CONSUMO, :CARTERA, :RTFTE, :RTIVA, :RTICA, :COSTOS, :INVEN, :CTAVENTAS, :CTAIVA, :CTACONSUMO, :CTADTO, :CTAADIC, :CTAEXTRA, :CTACARTERA, :CTARTFTE, :CTARTIVA, :CTARTICA, :CTAINVEN, :CTACOSTOS, :VER, :CENT;
  if (EXISTE = 'S') then
   BEGIN
    /* BORRE CUALQUEIR CONTABILIZACION PREVIA */
    DELETE FROM CONTABILIZACION WHERE CNTB_TIPOREF = 33 AND CNTB_IDREF = :IDDOC;
    /* TRAIGA EL ENCABEZADO DE LA DEVOLUCION */
   SELECT PREF_PRE, DEVT_NUMERO, DEVT_FECHA, F.TERC_NIT, DEVT_IVAINC, PTVT_ID, DEVT_FACTURA, DEVT_DTOMONTO, DEVT_ADICIONAL, DEVT_IVAMONTO, DEVT_EXTRA, DEVT_TOTAL, DEVT_RTFTEPORC, DEVT_RTFTEMONTO, DEVT_RTIVAPORC, DEVT_RTIVAMONTO, DEVT_RTICAPORC, DEVT_RTICAMONTO, TERC_CTARTFTE, TERC_CTARTIVA, TERC_CTARTICA, TERC_CTAVENTA, TERC_CTACLIENTE, DEVT_ANULADO, DEVT_REMID, DEVT_PEDID
        FROM DEVOLUCIONES_VENTAS F, TERCEROS T
        WHERE DEVT_ID = :IDDOC AND F.TERC_NIT = T.TERC_NIT
        INTO :PREF, :NUM, :FECAUX, :NIT, :IMPINC, :PTOVTA, :NUMFAC, :VRDTO, :VRADIC, :VRIVA, :VREXTRA, :VRTOTAL, :PRTFTE, :VRRTFTE, :PORC, :VRRTIVA, :PRTICA, :VRRTICA, :TCTARTFTE, TCTARTIVA, TCTARTICA, TCTAVENTA, TCTACLIEN, ANULADO, :IDREM, :IDPED;
   if (idrem is null) Then
    IDREM = 0;
   if (idped is null) Then
    IDPED = 0;
   if ((ANULADO = 'N') AND (IDREM = 0) AND (IDPED = 0)) then
    BEGIN
    NUMERO = PREF || NUM;
    SELECT SUM(DVDE_CONSUMO) FROM devoluciones_ventas_detalle WHERE DEVT_ID = :iddoc AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
        INTO :MERCANCIA;
    VRSUBT = VRTOTAL - VREXTRA - VRIVA - MERCANCIA; /* BASE DE RETEFTE Y RETEICA */
    EXECUTE PROCEDURE lee_configuracion ('FACTURACION', 'DEVOLUCIONES', 'DESCUENTO PIE DEVOLUCION IGUAL A SUMA DE DESCUENTOS POR ITEM') returning_values (:DTOXIT);
    if (DTOXIT = 'SI') then
        VRDTO = 0;
    MERCANCIA = VRSUBT - VRADIC + VRDTO;
    IF (CENT = 'B') THEN
        SELECT B.BODE_CENTRO, B.BODE_PROY FROM BODEGA B, DEVOLUCIONES_VENTAS F
            WHERE B.BODE_COD = F.BODE_COD AND F.DEVT_ID = :IDDOC INTO :CENTRO, :PROY;
    IF (CENT = 'V') THEN
        SELECT V.CENT_COD, V.PROY_COD FROM VENDEDORES V, DEVOLUCIONES_VENTAS F
            WHERE V.VEND_COD = F.VEND_COD AND F.DEVT_ID = :IDDOC INTO :CENTRO, :PROY;
    IF (CENT = 'P') THEN
        SELECT P.PREF_CENTRO,P.PREF_PROY  FROM PREFIJOS P, DEVOLUCIONES_VENTAS F
            WHERE P.PREF_PRE = F.PREF_PRE AND F.DEVT_ID = :IDDOC AND P.TIDO_COD = 33 INTO :CENTRO, :PROY;
    EXECUTE PROCEDURE FECHA_A_CONTA(:FECAUX) returning_values (:FECHA);
    /* REGISTRE EL ENCABEZADO CONTABLE */
    IDC = GEN_ID(ID_CONTABILIZA, 1);
    CONC = 'DEVOLUCION VENTAS No. ' || NUMERO || ' EN FACTURA ' || NUMFAC;
    CONC = SUBSTR(CONC, 1, 60);
    INSERT INTO CONTABILIZACION (CNTB_ID, CNTB_TIPOCOMP, CNTB_PREFCNT, CNTB_NUMERO, CNTB_FECHA, CNTB_CONCEPTO, CNTB_REF, CNTB_TIPOREF, CNTB_IDREF, CNTB_PREFREF, CNTB_NUMREF, CNTB_PROCESADO)
        VALUES (:IDC, :TIPOCOMP, :PREFCONT, :NUM, :FECHA, :CONC, '', 33, :IDDOC, :PREF, :NUM, 'N');
    NROI = 0;
    SUMA = 0;
    ERROR = 0;
    /* SI NO HAY CUENTA DE DESCUENTO NI ADICIONAL CALCULE UN FACTOR PARA LAS VENTAS Y EL IVA */
    if (MERCANCIA <> 0) then
        FACTOR = CAST(VRSUBT AS DOUBLE PRECISION) / CAST(MERCANCIA AS DOUBLE PRECISION);
    ELSE
        FACTOR = 1;
    /* TRAIGA EL NUMERO DE DIGITOS PARA EL REDONDEO */
    SELECT CAST(CONF_VALOR AS INTEGER) FROM CONFIGURACION WHERE CONF_MODULO = 'FACTURACION' AND
        CONF_CATEGORIA = 'GENERAL' AND CONF_PROPIEDAD = 'REDONDEO AL MULTIPLO DE DIEZ EN TOTALES' INTO :DIG;
    /* CUENTAS DE VENTAS */
    if (VENTAS = 'A') then
        BEGIN
        FOR SELECT MAX(COAR_CTADEV), SUM(DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO), SUM(DVDE_IVAMONTO), SUM(DVDE_CONSUMO), MAX(B.bode_proy), MAX(B.bode_centro)
            FROM ARTICULO A, CONTABIL_ARTICULO C, DEVOLUCIONES_VENTAS_DETALLE F, BODEGA B
            WHERE F.DEVT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND B.bode_cod = F.bode_cod AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
            GROUP BY COAR_CTADEV
            INTO :CTAVENTAS, :MONTO, :IMPTOS, :VRCONSUMO, :proyi, :centi
            DO
            BEGIN
            if ((FOMENTO = 'SI') or (icoing = 'SI')) then
                MONTO = MONTO + VRCONSUMO;
            if ((CTADTO IS NULL) OR (CTADTO = '')) then
                MONTO = MONTO * FACTOR;
            execute procedure redondee(MONTO, DIG) returning_values (MONTO);
            if (MONTO <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTAVENTAS, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT F.ARTI_COD, (DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO), (DVDE_IVAMONTO+DVDE_CONSUMO)
                        FROM ARTICULO A, CONTABIL_ARTICULO C, DEVOLUCIONES_VENTAS_DETALLE F
                        WHERE F.DEVT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTAINV = :CUENTA AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
                        INTO :ART, :MONTO, :IMPTOS
                    DO
                        BEGIN
                        if (IMPINC = 'S') then
                            MONTO = MONTO - IMPTOS;
                        if ((CTADTO IS NULL) OR (CTADTO = '')) then
                            MONTO = MONTO * FACTOR;
                        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        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, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                    NROI = NROI + 1;
                    SUMA = SUMA + MONTO;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    IF (CENT = 'B') THEN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROYI, :CENTI, NULL, NULL, NULL, NULL, 0, 0);
                    ELSE
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA + MONTO;
                    END
                END /* MONTO <> 0 */
            END /* FOR */
        END /* VENTAS X ARTICULO */
     IF ((VENTAS = 'C') OR (VENTAS = 'K')) THEN
        BEGIN
        IF (VENTAS = 'C') THEN
            CTAVENTAS = TCTAVENTA;
        SELECT SUM(DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO), SUM(DVDE_IVAMONTO), SUM(DVDE_CONSUMO)
            FROM DEVOLUCIONES_VENTAS_DETALLE F
            WHERE F.DEVT_ID = :IDDOC  AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
            INTO :MONTO, :IMPTOS, :VRCONSUMO;
        if ((FOMENTO = 'SI') or (icoing = 'SI')) then
            MONTO = MONTO + VRCONSUMO;
        if ((CTADTO IS NULL) OR (CTADTO = '')) then
            MONTO = MONTO * FACTOR;
        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
        if (MONTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTAVENTAS, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT F.ARTI_COD, (DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO), (DVDE_IVAMONTO+DVDE_CONSUMO)
                    FROM ARTICULO A, DEVOLUCIONES_VENTAS_DETALLE F
                    WHERE F.DEVT_ID = :IDDOC AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
                    INTO :ART, :MONTO, :IMPTOS
                    DO
                    BEGIN
                    if (IMPINC = 'S') then
                        MONTO = MONTO - IMPTOS;
                    if ((CTADTO IS NULL) OR (CTADTO = '')) then
                        MONTO = MONTO * FACTOR;
                    execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                    NROI = NROI + 1;
                    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, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                NROI = NROI + 1;
                SUMA = SUMA + MONTO;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA + MONTO;
                END
            END /* MONTO <> 0 */
        END /* VENTAS DE CLIENTE O CONSTANTE */
    /* EL IVA EN VENTAS */
    if (IVA = 'A') then
        BEGIN
        FOR SELECT MAX(COAR_CTAIVAV), SUM(DVDE_IVAMONTO), SUM(DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO), SUM(DVDE_CONSUMO)
            FROM ARTICULO A, CONTABIL_ARTICULO C, DEVOLUCIONES_VENTAS_DETALLE F
            WHERE F.DEVT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
            GROUP BY COAR_CTAIVAV
            INTO :CTAIVA, :IMPTOS, :MONTO, :VALORADIC
        DO
            BEGIN
            if (FOMENTO = 'SI') then
                MONTO = MONTO + VALORADIC;
            MONTO = MONTO * -1;
            MONTO = MONTO * FACTOR;
            IMPTOS = IMPTOS * FACTOR;
            execute procedure redondee(MONTO, DIG) returning_values (MONTO);
            execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
            if (IMPTOS <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTAIVA, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT F.ARTI_COD, DVDE_IVAMONTO, (DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO), TAIV_PORC, DVDE_CONSUMO
                        FROM ARTICULO A, CONTABIL_ARTICULO C, DEVOLUCIONES_VENTAS_DETALLE F, TARIFA_IVA T
                        WHERE F.DEVT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND A.TAIV_COD = T.TAIV_COD AND COAR_CTAIVAV = :CUENTA AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
                        INTO :ART, :IMPTOS, :MONTO, :PORCIVA, :VALORADIC
                    DO
                        BEGIN
                        if (IMPINC = 'S') then
                            MONTO = MONTO - IMPTOS - VALORADIC;
                        MONTO = MONTO * -1;
                        MONTO = MONTO * FACTOR;
                        IMPTOS = IMPTOS * FACTOR;
                        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                        execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                        if (IMPTOS <> 0) then
                            BEGIN
                            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :IMPTOS, 0, :MONTO, :PORCIVA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                            NROI = NROI + 1;
                            SUMA = SUMA + IMPTOS;
                            END
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                    NROI = NROI + 1;
                    SUMA = SUMA + IMPTOS;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA + IMPTOS;
                    END
                END   /* IMPTOS <> 0 */
            END /* FOR */
        if (DEC2799 = 'SI') then
            BEGIN
            FOR SELECT MAX(COAR_CTAIVADEC), SUM(FADE_IVAMONTO), SUM(FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), sum(FADE_CONSUMO)
                FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_DETALLE F
                WHERE F.FACT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
                    AND A.arti_dec2799 = 'S'
                GROUP BY COAR_CTAIVADEC
                INTO :CTADTOIVA, :IMPTOS, :MONTO, :VALORADIC
                DO
                BEGIN
                if (FOMENTO = 'SI') then
                    MONTO = MONTO + VALORADIC;
                MONTO = MONTO * -1;
                MONTO = MONTO * FACTOR;
                IMPTOS = IMPTOS * FACTOR;
                execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                if (IMPTOS <> 0) then
                    BEGIN
                    EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTADTOIVA, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                    if (ERRORC <> 0) then
                        ERROR = ERROR + 1;
                    if (TIPOCUEN = 'N') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :IMPTOS, 0, :MONTO, ABS(:IMPTOS*100/:MONTO), :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NROI = NROI + 1;
                        SUMA = SUMA + IMPTOS;
                        END
                    END   /* IMPTOS <> 0 */
                END
            END
        END /* IVA X ARTICULO */
    if (IVA = 'K') then /* IVA EN CTA CONSTANTE */
        BEGIN
        SELECT SUM(DVDE_IVAMONTO), SUM(DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO), SUM(DVDE_CONSUMO)
            FROM DEVOLUCIONES_VENTAS_DETALLE F
            WHERE F.DEVT_ID = :IDDOC  AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
            INTO :IMPTOS, :MONTO, :VALORADIC;
        if (FOMENTO = 'SI') then
            MONTO = MONTO + VALORADIC;
        MONTO = MONTO * -1;
        MONTO = MONTO * FACTOR;
        IMPTOS = IMPTOS * FACTOR;
        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
        execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
        if (IMPTOS <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTAIVA, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT F.ARTI_COD, (DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO), DVDE_IVAMONTO, TAIV_PORC, DVDE_CONSUMO
                    FROM ARTICULO A, DEVOLUCIONES_VENTAS_DETALLE F, TARIFA_IVA T
                    WHERE F.DEVT_ID = :IDDOC AND A.TAIV_COD = T.TAIV_COD AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
                    INTO :ART, :MONTO, :IMPTOS, :PORCIVA, :VALORADIC
                    DO
                    BEGIN
                    if (IMPINC = 'S') then
                        MONTO = MONTO - IMPTOS - VALORADIC;
                    MONTO = MONTO * -1;
                    MONTO = MONTO * FACTOR;
                    IMPTOS = IMPTOS * FACTOR;
                    execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                    execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                    if (IMPTOS <> 0) then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', :IMPTOS, 0, :MONTO, :PORCIVA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        SUMA = SUMA + IMPTOS;
                        END
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                NROI = NROI + 1;
                SUMA = SUMA + IMPTOS;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA + IMPTOS;
                END
            END /* IMPTOS <> 0 */
        if (DEC2799 = 'SI') then
            BEGIN
            SELECT SUM(FADE_IVAMONTO), SUM(FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), SUM(FADE_CONSUMO)
                FROM FACTURAS_DETALLE F, ARTICULO A
                WHERE F.FACT_ID = :IDDOC and FADE_IVAMONTO <> 0 AND F.arti_cod = A.arti_cod AND
                ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL)) AND A.arti_dec2799 = 'S'
                INTO :IMPTOS, :MONTO, :valoradic;
            if (FOMENTO = 'SI') then
                MONTO = MONTO + VALORADIC;
            MONTO = MONTO * -1;
            MONTO = MONTO * FACTOR;
            IMPTOS = IMPTOS * FACTOR;
            execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
            execute procedure redondee(MONTO, DIG) returning_values (MONTO);
            if (IMPTOS <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTADTOIVA, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :IMPTOS, 0, :MONTO, ABS(:IMPTOS*100/:MONTO), :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA + IMPTOS;
                    END
                END   /* IMPTOS <> 0 */
            END
        END /* IVA EN CTA CONSTANTE */
    /* EL IMPOCONSUMO */
    if ((CONSUMO = 'A') AND (FOMENTO <> 'SI')) then
        BEGIN
        FOR SELECT MAX(COAR_CTACONS), SUM(DVDE_CONSUMO)
            FROM ARTICULO A, CONTABIL_ARTICULO C, DEVOLUCIONES_VENTAS_DETALLE F
            WHERE F.DEVT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
            GROUP BY COAR_CTACONS
            INTO :CTACONSUMO, :IMPTOS
        DO
            BEGIN
            if (IMPTOS <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTACONSUMO, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, REGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT F.ARTI_COD, DVDE_CONSUMO
                        FROM ARTICULO A, CONTABIL_ARTICULO C, DEVOLUCIONES_VENTAS_DETALLE F
                        WHERE F.DEVT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTACONS = :CUENTA AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
                        INTO :ART, :IMPTOS
                    DO
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 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, :NROI, :CUENTA, :CONC, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                    NROI = NROI + 1;
                    SUMA = SUMA + IMPTOS;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA + IMPTOS;
                    END
                END /* IMPTOS <> 0 */
            END /* FOR */
        END /* CONSUMO X ARTICULO */
    if ((CONSUMO = 'K') AND (FOMENTO <> 'SI')) then
        BEGIN
        SELECT SUM(DVDE_CONSUMO)
            FROM DEVOLUCIONES_VENTAS_DETALLE F
            WHERE F.DEVT_ID = :IDDOC AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
            INTO :IMPTOS;
        if (IMPTOS <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTACONSUMO, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT F.ARTI_COD, DVDE_CONSUMO
                    FROM ARTICULO A, DEVOLUCIONES_VENTAS_DETALLE F
                    WHERE F.DEVT_ID = :IDDOC  AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
                    INTO :ART, :IMPTOS
                    DO
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTACONSUMO, :CONC, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                    NROI = NROI + 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, :NROI, :CTACONSUMO, :CONC, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA + IMPTOS;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTACONSUMO, :CONC, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA + IMPTOS;
                END
            END /* IMPTOS <> 0 */
        END /* CONSUMO EN CTA CONSTANTE */
    /* DESCUENTO */
    if ((CTADTO IS NOT NULL) AND
        (CTADTO <> '') AND
        (VRDTO <> 0)) THEN
        BEGIN
        EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTADTO, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRDTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
            NROI = NROI + 1;
            SUMA = SUMA - VRDTO;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRDTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 33);
            NROI = NROI + 1;
            SUMA = SUMA - VRDTO;
            END
        END /* DESCUENTO */
    /* VALOR ADIC */
    if ((CTAADIC IS NOT NULL) AND
        (CTAADIC <> '') AND
        (VRADIC <> 0)) THEN
        BEGIN
        EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTAADIC, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRADIC, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
            NROI = NROI + 1;
            SUMA = SUMA + VRADIC;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRADIC, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 33);
            NROI = NROI + 1;
            SUMA = SUMA + VRADIC;
            END
        END /* VR. ADIC */
    /* VALOR EXTRA */
    if ((CTAEXTRA IS NOT NULL) AND
        (CTAEXTRA <> '') AND
        (VREXTRA <> 0)) THEN
        BEGIN
        EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTAEXTRA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VREXTRA, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
            NROI = NROI + 1;
            SUMA = SUMA + VREXTRA;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VREXTRA, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 33);
            NROI = NROI + 1;
            SUMA = SUMA + VREXTRA;
            END
        END /* VR. EXTRA */
    /* RETENCION FUENTE */
    if ((RTFTE = 'C') or (RTFTE = 'K')) then
      if (VRRTFTE <> 0) then
        BEGIN
        if (RTFTE = 'C') then
            CTARTFTE = TCTARTFTE;
        EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTARTFTE, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, (:VRSUBT*-1), :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
            NROI = NROI + 1;
            SUMA = SUMA - VRRTFTE;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, (:VRSUBT*-1), :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA - VRRTFTE;
            END
        /* AUTORETENCION */
        if (FAUTORET <= fecaux) then
            BEGIN
            EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'CUENTA DE AUTORETENCION EN LA FUENTE') returning_values (CTARTFTE);
            EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTARTFTE, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :VRSUBT, :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                NROI = NROI + 1;
                SUMA = SUMA + VRRTFTE;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :VRSUBT, :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA + VRRTFTE;
                END
            END
        END /* RTFTE */
    if (RTFTE = 'A') then
      BEGIN
      FOR SELECT MAX(COAR_CTARTFTEV), MAX(COAR_RTFTE), MIN(COAR_RTBASE), SUM(DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO), SUM((DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO)*COAR_RTFTE)
        FROM CONTABIL_ARTICULO C, devoluciones_ventas_detalle F
        WHERE F.devt_id = :IDDOC AND F.ARTI_COD = C.ARTI_COD AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
        GROUP BY COAR_CTARTFTEV
        INTO :CTARTFTE, :PRTFTE, :baseadic, :MONTO, :VRRTFTE
        DO
        BEGIN
        MONTO = MONTO * FACTOR;
        if (MONTO >= BASEADIC) then
            BEGIN
            VRRTFTE = VRRTFTE * FACTOR / 100;
            execute procedure redondee(VRRTFTE, DIG) returning_values (VRRTFTE);
            execute procedure redondee(MONTO, DIG) returning_values (MONTO);
            if (VRRTFTE <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTARTFTE, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, (:MONTO*-1), :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                    NROI = NROI + 1;
                    SUMA = SUMA - VRRTFTE;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, (:MONTO*-1), :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA - VRRTFTE;
                    END
                /* AUTORETENCION */
                if (FAUTORET <= fecaux) then
                    BEGIN
                    EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'CUENTA DE AUTORETENCION EN LA FUENTE') returning_values (CTARTFTE);
                    EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTARTFTE, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
                    if (ERRORC <> 0) then
                        ERROR = ERROR + 1;
                    if (TIPOCUEN = 'C') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :MONTO, :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                        NROI = NROI + 1;
                        SUMA = SUMA + VRRTFTE;
                        END
                    if (TIPOCUEN = 'N') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :MONTO, :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NROI = NROI + 1;
                        SUMA = SUMA + VRRTFTE;
                        END
                    END
                END
            END
        END /* RTFTE */
      END
    /* RETENCION IVA */
    if ((RTIVA = 'C') or (RTIVA = 'K')) then
      if (VRRTIVA <> 0) then
        BEGIN
        if (RTIVA = 'C') then
            CTARTIVA = TCTARTIVA;
        EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTARTIVA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTIVA, (:VRIVA*-1), :PORC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
            NROI = NROI + 1;
            SUMA = SUMA - VRRTIVA;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTIVA, (:VRIVA*-1), :PORC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA - VRRTIVA;
            END
        END /* RTIVA */
    /* RETENCION DE ICA */
    if ((RTICA = 'C') or (RTICA = 'K')) then
      if (VRRTICA <> 0) then
        BEGIN
        if (RTICA = 'C') then
            CTARTICA = TCTARTICA;
        EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTARTICA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTICA, (:VRSUBT*-1), :PRTICA, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
            NROI = NROI + 1;
            SUMA = SUMA - VRRTICA;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTICA, (:VRSUBT*-1), :PRTICA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA - VRRTICA;
            END
        END /* RTICA */
    /* CIERRE EL COMPROBANTE CONTRA LA CUENTA DEL TERCERO O LA CONSTANTE */
    if ((SUMA <> 0) and ((CARTERA = 'C') or (CARTERA = 'K') or (CARTERA = 'J'))) then
        BEGIN
        if (icoing = 'SI') then
            /* DESCUENTE EL IMPOCONSUMO QUE HACE PARTE DEL COSTO */
            BEGIN
            SELECT SUM(FADE_CONSUMO)
                FROM FACTURAS_DETALLE F WHERE F.FACT_ID = :IDDOC AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL)) INTO :IMPTOS;
            SUMA = SUMA - IMPTOS;
            END
        if (SUMA < 0) then
            BEGIN
            DEBITO = SUMA * -1;
            CREDITO = 0;
            END
        ELSE
            BEGIN
            DEBITO = 0;
            CREDITO = SUMA;
            END
        if (CARTERA = 'C') then
            CTACARTERA = TCTACLIEN;
        if (CARTERA = 'J') then
            BEGIN
            /* BUSQUE LA CUENTA DE LA CAJA */
            SELECT CAJA_CUENTA FROM CAJAS C, PUNTO_VENTA P
                WHERE P.CAJA_ID = C.CAJA_ID AND PTVT_ID = :PTOVTA
                INTO :CTACARTERA;
            END
        EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTACARTERA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :DEBITO, :CREDITO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
        if (TIPOCUEN = 'N') then
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :DEBITO, :CREDITO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
        NROI = NROI + 1;
        END /* SUMA EN CARTERA */
    /* CALCULE COSTOS EN VENTAS */
    EXECUTE PROCEDURE COSTO_EN_VENTAS(33, :IDDOC);
    if (COSTOS = 'A') then
        BEGIN
        FOR SELECT MAX(CTACOS), SUM(CAST(CANT AS DOUBLE PRECISION) * COSTO), SUM(DVDE_CONSUMO)
            FROM COSTO_VENTAS CV, devoluciones_ventas_detalle D WHERE CV.cove_item = D.dvde_item AND D.devt_id = :iddoc AND
            TIDO_COD = 33 AND COVE_ID = :iddoc
            GROUP BY CTACOS
            INTO :CTACOSTOS, :MONTO, :vrconsumo
        DO
            BEGIN
            if (icoing = 'SI') then
                MONTO = MONTO + VRCONSUMO;
            if (MONTO <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTACOSTOS, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT ARTI_COD, cast(CANT as double precision) * COSTO
                        FROM COSTO_VENTAS WHERE TIDO_COD = 33 AND COVE_ID = :IDDOC AND CTACOS = :CUENTA
                        INTO :ART, :MONTO
                    DO
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                    NROI = NROI + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    END
                END /* MONTO <> 0 */
            END /* FOR */
        END /* COSTOS */
    if (COSTOS = 'K') then
        BEGIN
        SELECT SUM(cast(CANT as double precision) * COSTO)
            FROM COSTO_VENTAS WHERE TIDO_COD = 33 AND COVE_ID = :IDDOC
            INTO :MONTO;
        if (icoing = 'SI') then
            MONTO = MONTO + imptos;
        if (MONTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTACOSTOS, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, REGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT ARTI_COD, cast(CANT as double precision) * COSTO
                    FROM COSTO_VENTAS WHERE TIDO_COD = 33 AND COVE_ID = :IDDOC
                    INTO :ART, :MONTO
                DO
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTACOSTOS, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                    NROI = NROI + 1;
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTACOSTOS, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                NROI = NROI + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTACOSTOS, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                END
            END /* MONTO <> 0 */
        END /* COSTOS = K */
    if (INVEN = 'A') then
        BEGIN
        FOR SELECT MAX(CTAINV), SUM(cast(CANT as double precision) * COSTO)
            FROM COSTO_VENTAS WHERE TIDO_COD = 33 AND COVE_ID = :IDDOC
            GROUP BY CTAINV
            INTO :CTAINVEN, :MONTO
        DO
            BEGIN
            if (MONTO <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTAINVEN, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, REGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT ARTI_COD, cast(CANT as double precision) * COSTO
                        FROM COSTO_VENTAS WHERE TIDO_COD = 33 AND COVE_ID = :IDDOC AND CTAINV = :CUENTA
                        INTO :ART, :MONTO
                    DO
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                    NROI = NROI + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    END
                END /* MONTO <> 0 */
            END /* FOR */
        END /* INVEN = A */
    if (INVEN = 'K') then
        BEGIN
        SELECT SUM(cast(CANT as double precision) * COSTO)
            FROM COSTO_VENTAS WHERE TIDO_COD = 33 AND COVE_ID = :IDDOC
            INTO :MONTO;
        if (MONTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTAINVEN, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT ARTI_COD, cast(CANT as double precision) * COSTO
                    FROM COSTO_VENTAS WHERE TIDO_COD = 33 AND COVE_ID = :IDDOC
                    INTO :ART, :MONTO
                DO
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTAINVEN, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                    NROI = NROI + 1;
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAINVEN, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                NROI = NROI + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAINVEN, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                END
            END /* MONTO <> 0 */
        END /* INVEN = K */
    /* recorra las cuentas adicionales */
    FOR SELECT INVC_CUENTA, INVC_BASE, INVC_PORC, INVC_VALOR, INVC_DB
        FROM INTERFAZ_VENTAS_CTAS WHERE INVE_ID = :IDINTER
        INTO :CTADIC, :BASEADIC, :PORCADIC, :VALORADIC, :DBADIC
        DO
        BEGIN
        if (valoradic <> 0) then
            monto = valoradic;
        else
            BEGIN
            if (:BASEADIC = 'SUBTOTAL') then
                VALORADIC = vrsubt;
            if (:BASEADIC = 'DESCUENTO') then
                VALORADIC = VRDTO;
            if (:BASEADIC = 'IVA') then
                VALORADIC = VRIVA;
            if (:BASEADIC = 'ADICIONAL') then
                VALORADIC = VRADIC;
            if (:BASEADIC = 'EXTRA') then
                VALORADIC = VREXTRA;
            if (:BASEADIC = 'TOTAL') then
                VALORADIC = VRTOTAL;
            MONTO = VALORADIC * PORCADIC;
            END
        if (MONTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTADIC, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                if (DBADIC = 'S') then
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                ELSE
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                NROI = NROI + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                if (DBADIC = 'S') then
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                ELSE
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                END
            NROI = NROI + 1;
            END
        END
    if (error > 0) then
        ver = 'S';
    SUSPEND;
    END
   END /* EXISTE LA INTERFAZ */
  ELSE
    BEGIN
    EXECUTE PROCEDURE ERROR (33, :IDDOC, :PREF, 1);
    ERROR = ERROR + 1;
    VER = 'S';
    SUSPEND;
    END
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE DEVOLUCIONES_SIN_CONTABILIDAD(
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    ID INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    ESTADO VARCHAR(20),
    IDI INTEGER,
    IDC INTEGER)
AS
DECLARE VARIABLE VER CHAR(2);
declare variable FECICNT VARCHAR(10);
declare variable FECFCNT VARCHAR(10);
declare variable ERROR INTEGER;
declare variable idref INTEGER;
BEGIN
EXECUTE PROCEDURE fecha_a_conta(FECINI) returning_values (FECICNT);
EXECUTE PROCEDURE fecha_a_conta(FECFIN) returning_values (FECFCNT);
FOR SELECT DEVT_ID, PREF_PRE, DEVT_NUMERO FROM devoluciones_ventas WHERE DEVT_ANULADO = 'N' AND
    DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN
    INTO :ID, :PREF, :NUMERO
DO
  BEGIN
  idref = null;
  SELECT ENCO_IDREF FROM COMPROBANTE_ENCABEZADO WHERE ENCO_TIPOREF = 33 AND ENCO_FECHA >= :FECICNT AND ENCO_FECHA <= :FECFCNT and ENCO_IDREF = :id into :idref;
  if (idref IS NULL) then
  begin
   ESTADO = 'PROCESANDO';
   SUSPEND;
   SELECT MAX(INVE_ID) FROM INTERFAZ_VENTAS WHERE PREF_PRE = :PREF AND TIDO_COD = 33 INTO :IDI;
   EXECUTE PROCEDURE contabil_devolcli (:ID, :IDI) RETURNING_VALUES (:ERROR, :VER, :IDC);
   if (ERROR = 0) then
    BEGIN
    EXECUTE PROCEDURE CONTABILIZA_PENDIENTE (:IDC);
    ESTADO = 'OK';
    END
   ELSE
    ESTADO = 'ERROR';
   suspend;
  End
  END
END

^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure CONTABIL_FACTURA (
    IDDOC integer,
    IDINTER integer)
returns (
    ERROR integer,
    VER char(1),
    IDC integer)
AS
declare variable pref varchar(4);
declare variable num varchar(6);
declare variable numero varchar(10);
declare variable fecaux date;
declare variable fecha char(8);
declare variable conc varchar(60);
declare variable venceaux date;
declare variable vence char(8);
declare variable vrdto numeric(18,2);
declare variable vradic numeric(18,2);
declare variable vrsubt numeric(18,2);
declare variable vriva numeric(18,2);
declare variable prtfte numeric(9,2);
declare variable vrrtfte numeric(18,2);
declare variable vrrtiva numeric(18,2);
declare variable prtica numeric(9,2);
declare variable vrrtica numeric(18,2);
declare variable vrtotal numeric(18,2);
declare variable vrextra numeric(18,2);
declare variable tipocomp varchar(3);
declare variable prefcont varchar(4);
declare variable ventas char(1);
declare variable ctaventas varchar(20);
declare variable iva char(1);
declare variable ctaiva varchar(20);
declare variable ctadtoiva varchar(20);
declare variable consumo char(1);
declare variable ctaconsumo varchar(20);
declare variable cartera char(1);
declare variable ctacartera varchar(20);
declare variable rtfte char(1);
declare variable ctartfte varchar(20);
declare variable rtiva char(1);
declare variable ctartiva varchar(20);
declare variable rtica char(1);
declare variable ctartica varchar(20);
declare variable inven char(1);
declare variable ctainven varchar(20);
declare variable costos char(1);
declare variable ctacostos varchar(20);
declare variable ctadto varchar(20);
declare variable ctaadic varchar(20);
declare variable ctaextra varchar(20);
declare variable existe char(1);
declare variable cuenta varchar(20);
declare variable monto numeric(18,2);
declare variable tipocuen char(1);
declare variable nit varchar(20);
declare variable nombre varchar(60);
declare variable proy varchar(4);
declare variable centro varchar(4);
declare variable proyi varchar(4);
declare variable centi varchar(4);
declare variable porc numeric(5,2);
declare variable debito numeric(18,2);
declare variable credito numeric(18,2);
declare variable nroi integer;
declare variable imptos numeric(18,2);
declare variable suma numeric(18,2);
declare variable tctaclien varchar(20);
declare variable tctaventa varchar(20);
declare variable tctartfte varchar(20);
declare variable tctartiva varchar(20);
declare variable tctartica varchar(20);
declare variable ctadic varchar(20);
declare variable baseadic varchar(20);
declare variable porcadic numeric(5,2);
declare variable valoradic numeric(18,2);
declare variable dbadic char(1);
declare variable ptovta integer;
declare variable anulado char(1);
declare variable dig integer;
declare variable mercancia numeric(18,2);
declare variable fomento varchar(2);
declare variable DTOXIT varchar(2);
declare variable vrconsumo numeric(18,2);
declare variable factor double precision;
declare variable cent char(1);
declare variable AUTORET VARCHAR(10);
declare variable FAUTORET DATE;
declare variable ERRORC INTEGER;
declare variable ICOING CHAR(2);
declare variable DEC2799 char(2);
BEGIN
EXECUTE PROCEDURE lee_configuracion ('FACTURACION', 'FACTURAS', 'DESCONTAR IVA DE PRODUCTOS DECRETO 2799') returning_values (:DEC2799);
EXECUTE PROCEDURE LEE_CONFIGURACION('COMPRAS', 'FACTURAS', 'USAR IMPOCONSUMO COMO PORCENTAJE DE FOMENTO') returning_values (FOMENTO);
EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION', 'ARTICULOS', 'IMPOCONSUMO COMO MAYOR VALOR DEL COSTO Y DEL INGRESO') returning_values (ICOING);
EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'FECHA AUTORETENEDOR NO DESCONTAR RETENCIONES DEL SALDO PERO SI CONTABILIZARLAS') returning_values (AUTORET);
if (AUTORET <> '') then
    FAUTORET = CAST(AUTORET AS DATE);
else
    FAUTORET = '9999/12/31';
/* BUSQUE LA INTERFACE */
EXISTE = 'N';
SELECT 'S', TICO_COD, PRCO_PRE, INVE_VENTAS, INVE_IVA, INVE_CONSUMO, INVE_CARTERA, INVE_RTFTE, INVE_RTIVA, INVE_RTICA, INVE_COSTO, INVE_INVEN, INVE_CTAVENTAS, INVE_CTAIVA, INVE_CTACONSUMO, INVE_CTADTO, INVE_CTAADIC, INVE_CTAEXTRA, INVE_CTACARTERA, INVE_CTARTFTE, INVE_CTARTIVA, INVE_CTARTICA, INVE_CTAINVEN, INVE_CTACOSTOS, INVE_CONFIRMAR, INVE_CENTRO, inve_ctadtoiva
    FROM INTERFAZ_VENTAS
    WHERE INVE_ID = :IDINTER
    INTO :EXISTE, :TIPOCOMP, :PREFCONT, :VENTAS, :IVA, :CONSUMO, :CARTERA, :RTFTE, :RTIVA, :RTICA, :COSTOS, :INVEN, :CTAVENTAS, :CTAIVA, :CTACONSUMO, :CTADTO, :CTAADIC, :CTAEXTRA, :CTACARTERA, :CTARTFTE, :CTARTIVA, :CTARTICA, :CTAINVEN, :CTACOSTOS, :VER, :CENT, :ctadtoiva;
if (EXISTE = 'S') then
  BEGIN
    /* BORRE CUALQUEIR CONTABILIZACION PREVIA */
    DELETE FROM CONTABILIZACION WHERE CNTB_TIPOREF = 31 AND CNTB_IDREF = :IDDOC;

  /* TRAIGA EL ENCABEZADO DE LA FACTURA */
  SELECT PREF_PRE, FACT_NUMERO, FACT_FECHA, F.TERC_NIT, PTVT_ID, FACT_VENCE, FACT_DTOMONTO, FACT_ADICIONAL, FACT_IVAMONTO, FACT_EXTRA, FACT_TOTAL, FACT_RTFTEPOR, FACT_RTFTEMONTO, FACT_RTIVAPOR, FACT_RTIVAMONTO, FACT_RTICAPOR, FACT_RTICAMONTO, FACT_NOMCLIENTE, TERC_CTARTFTE, TERC_CTARTIVA, TERC_CTARTICA, TERC_CTAVENTA, TERC_CTACLIENTE, FACT_ANULADO
        FROM FACTURAS F, TERCEROS T
        WHERE FACT_ID = :IDDOC AND F.TERC_NIT = T.TERC_NIT
        INTO :PREF, :NUM, :FECAUX, :NIT, :PTOVTA, :VENCEAUX, :VRDTO, :VRADIC, :VRIVA, :VREXTRA, :VRTOTAL, :PRTFTE, :VRRTFTE, :PORC, :VRRTIVA, :PRTICA, :VRRTICA, :NOMBRE, TCTARTFTE, TCTARTIVA, TCTARTICA, TCTAVENTA, TCTACLIEN, ANULADO;
  if (ANULADO = 'N') then
    BEGIN
    /* BUSQUE EL CENTRO DEL PUNTO, LA BODEGA, O EL PREFIJO  */
    IF (CENT = 'B') THEN
        SELECT B.BODE_CENTRO, B.BODE_PROY FROM BODEGA B, FACTURAS F
            WHERE B.BODE_COD = F.BODE_COD AND F.FACT_ID = :IDDOC INTO :CENTRO, :PROY;
    IF (CENT = 'V') THEN
        SELECT V.CENT_COD, V.PROY_COD FROM VENDEDORES V, FACTURAS F
            WHERE V.VEND_COD = F.VEND_COD AND F.FACT_ID = :IDDOC INTO :CENTRO, :PROY;
    IF (CENT = 'P') THEN
        SELECT P.PREF_CENTRO,P.PREF_PROY  FROM PREFIJOS P, FACTURAS F
            WHERE P.PREF_PRE = F.PREF_PRE AND F.FACT_ID = :IDDOC AND P.TIDO_COD = 31 INTO :CENTRO, :PROY;
    NUMERO = PREF || NUM;
    SELECT SUM (FADE_CONSUMO) FROM FACTURAS_DETALLE WHERE FACT_ID = :IDDOC  AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
        INTO MERCANCIA;
    VRSUBT = VRTOTAL - VREXTRA - VRIVA - MERCANCIA; /* BASE DE RETEFTE Y RETEICA */

    EXECUTE PROCEDURE lee_configuracion ('FACTURACION', 'FACTURAS', 'DESCUENTO PIE FACTURA IGUAL A SUMA DE DESCUENTOS POR ITEM') returning_values (:DTOXIT);
    if (DTOXIT = 'SI') then
        VRDTO = 0;
    MERCANCIA = VRSUBT - VRADIC + VRDTO;
    EXECUTE PROCEDURE FECHA_A_CONTA(:FECAUX) returning_values (:FECHA);
    EXECUTE PROCEDURE FECHA_A_CONTA(:VENCEAUX) returning_values (:VENCE);
    /* REGISTRE EL ENCABEZADO CONTABLE */
    IDC = GEN_ID(ID_CONTABILIZA, 1);
    if (STRLEN(NOMBRE)> 43 ) then
      CONC = 'FV No.' || NUMERO || '-' || SUBSTR(NOMBRE,1,43);
    ELSE
      CONC = 'FV No.' || NUMERO || '-' || NOMBRE;
    INSERT INTO CONTABILIZACION (CNTB_ID, CNTB_TIPOCOMP, CNTB_PREFCNT, CNTB_NUMERO, CNTB_FECHA, CNTB_CONCEPTO, CNTB_REF, CNTB_TIPOREF, CNTB_IDREF, CNTB_PREFREF, CNTB_NUMREF, CNTB_PROCESADO)
        VALUES (:IDC, :TIPOCOMP, :PREFCONT, :NUM, :FECHA, :CONC, '', 31, :IDDOC, :PREF, :NUM, 'N');
    NROI = 0;
    SUMA = 0;
    ERROR = 0;
    /* SI NO HAY CUENTA DE DESCUENTO NI ADICIONAL CALCULE UN FACTOR PARA LAS VENTAS Y EL IVA */
    if (MERCANCIA <> 0) then
        FACTOR = CAST(VRSUBT AS DOUBLE PRECISION) / CAST(MERCANCIA AS DOUBLE PRECISION);
    ELSE
        FACTOR = 1;
    /* TRAIGA EL NUMERO DE DIGITOS PARA EL REDONDEO */
    SELECT CAST(CONF_VALOR AS INTEGER) FROM CONFIGURACION WHERE CONF_MODULO = 'FACTURACION' AND
        CONF_CATEGORIA = 'GENERAL' AND CONF_PROPIEDAD = 'REDONDEO AL MULTIPLO DE DIEZ EN TOTALES' INTO :DIG;
    /* CUENTAS DE VENTAS */
    if (VENTAS = 'A') then
        BEGIN
        FOR SELECT MAX(COAR_CTAVNT), SUM(FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), SUM(FADE_IVAMONTO), SUM(FADE_CONSUMO), MAX(B.bode_proy), MAX(B.bode_centro)
            FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_DETALLE F, bodega b
            WHERE F.FACT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL)) and
            f.bode_cod = b.bode_cod
            GROUP BY COAR_CTAVNT
            INTO :CTAVENTAS, :MONTO, :IMPTOS, :VRCONSUMO, :PROYI, :CENTI
            DO
            BEGIN
            if ((FOMENTO = 'SI') or (icoing = 'SI')) then
                MONTO = MONTO + VRCONSUMO;
            if ((CTADTO IS NULL) OR (CTADTO = '')) then
                MONTO = MONTO * FACTOR;
            execute procedure redondee(MONTO, DIG) returning_values (MONTO);
            if (MONTO <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTAVENTAS, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (31, :IDDOC, :CUENTA, 3);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    NROI = NROI + 1;
                    SUMA = SUMA - MONTO;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    IF (CENT = 'B') THEN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROYI, :CENTI, NULL, NULL, NULL, NULL, 0, 0);
                    ELSE
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA - MONTO;
                    END
                END /* MONTO <> 0 */
            END /* FOR */
        END /* VENTAS X ARTICULO */
     IF ((VENTAS = 'C') OR (VENTAS = 'K')) THEN
        BEGIN
        IF (VENTAS = 'C') THEN
            CTAVENTAS = TCTAVENTA;
        SELECT SUM(FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), SUM(FADE_IVAMONTO), SUM (FADE_CONSUMO)
            FROM FACTURAS_DETALLE F
            WHERE F.FACT_ID = :IDDOC AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
            INTO :MONTO, :IMPTOS, :VRCONSUMO;
        if ((FOMENTO = 'SI') or (ICOING = 'SI')) then
            MONTO = MONTO + VRCONSUMO;
        if ((CTADTO IS NULL) OR (CTADTO = '')) then
            MONTO = MONTO * FACTOR;
        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
        if (MONTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTAVENTAS, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERROR (31, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - MONTO;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - MONTO;
                END
            END /* MONTO <> 0 */
        END /* VENTAS DE CLIENTE O CONSTANTE */
    /* EL IVA EN VENTAS */
    if (IVA = 'A') then
        BEGIN
        FOR SELECT MAX(COAR_CTAIVAV), SUM(FADE_IVAMONTO), SUM(FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), sum(FADE_CONSUMO)
            FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_DETALLE F
            WHERE F.FACT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
            GROUP BY COAR_CTAIVAV
            INTO :CTAIVA, :IMPTOS, :MONTO, :VALORADIC
            DO
            BEGIN
            if (FOMENTO = 'SI') then
                MONTO = MONTO + VALORADIC;
            MONTO = MONTO * -1;
            MONTO = MONTO * FACTOR;
            IMPTOS = IMPTOS * FACTOR;
            execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
            execute procedure redondee(MONTO, DIG) returning_values (MONTO);
            if (IMPTOS <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTAIVA, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (31, :IDDOC, :CUENTA, 3);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, :MONTO, ABS(:IMPTOS*100/:MONTO), :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    NROI = NROI + 1;
                    SUMA = SUMA - IMPTOS;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, :MONTO, ABS(:IMPTOS*100/:MONTO), :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA - IMPTOS;
                    END
                END   /* IMPTOS <> 0 */
            END /* FOR */
        if (DEC2799 = 'SI') then
            BEGIN
            FOR SELECT MAX(COAR_CTAIVADEC), SUM(FADE_IVAMONTO), SUM(FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), sum(FADE_CONSUMO)
                FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_DETALLE F
                WHERE F.FACT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
                    AND A.arti_dec2799 = 'S'
                GROUP BY COAR_CTAIVADEC
                INTO :CTADTOIVA, :IMPTOS, :MONTO, :VALORADIC
                DO
                BEGIN
                if (FOMENTO = 'SI') then
                    MONTO = MONTO + VALORADIC;
                MONTO = MONTO * -1;
                MONTO = MONTO * FACTOR;
                IMPTOS = IMPTOS * FACTOR;
                execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                if (IMPTOS <> 0) then
                    BEGIN
                    EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTADTOIVA, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                    if (ERRORC <> 0) then
                        ERROR = ERROR + 1;
                    if (TIPOCUEN = 'N') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :IMPTOS, 0, :MONTO, ABS(:IMPTOS*100/:MONTO), :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NROI = NROI + 1;
                        SUMA = SUMA + IMPTOS;
                        END
                    END   /* IMPTOS <> 0 */
                END
            END
        END /* IVA X ARTICULO */
    if (IVA = 'K') then /* IVA EN CTA CONSTANTE */
        BEGIN
        SELECT SUM(FADE_IVAMONTO), SUM(FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), SUM(FADE_CONSUMO)
            FROM FACTURAS_DETALLE F
            WHERE F.FACT_ID = :IDDOC and FADE_IVAMONTO <> 0 AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
            INTO :IMPTOS, :MONTO, :valoradic;
        if (FOMENTO = 'SI') then
            MONTO = MONTO + VALORADIC;
        MONTO = MONTO * -1;
        MONTO = MONTO * FACTOR;
        IMPTOS = IMPTOS * FACTOR;
        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
        execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
        if (IMPTOS <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTAIVA, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERROR (31, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', 0, :IMPTOS, :MONTO, ABS(:IMPTOS*100/:MONTO), :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - IMPTOS;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', 0, :IMPTOS, :MONTO, ABS(:IMPTOS*100/:MONTO), :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - IMPTOS;
                END
            END /* IMPTOS <> 0 */
        if (DEC2799 = 'SI') then
            BEGIN
            SELECT SUM(FADE_IVAMONTO), SUM(FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), SUM(FADE_CONSUMO)
                FROM FACTURAS_DETALLE F, ARTICULO A
                WHERE F.FACT_ID = :IDDOC and FADE_IVAMONTO <> 0 AND F.arti_cod = A.arti_cod AND
                ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL)) AND A.arti_dec2799 = 'S'
                INTO :IMPTOS, :MONTO, :valoradic;
            if (FOMENTO = 'SI') then
                MONTO = MONTO + VALORADIC;
            MONTO = MONTO * -1;
            MONTO = MONTO * FACTOR;
            IMPTOS = IMPTOS * FACTOR;
            execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
            execute procedure redondee(MONTO, DIG) returning_values (MONTO);
            if (IMPTOS <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTADTOIVA, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :IMPTOS, 0, :MONTO, ABS(:IMPTOS*100/:MONTO), :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA + IMPTOS;
                    END
                END   /* IMPTOS <> 0 */
            END
        END /* IVA EN CTA CONSTANTE */
    /* EL IMPOCONSUMO */
    if ((CONSUMO = 'A') AND (FOMENTO <> 'SI')) then
        BEGIN
        FOR SELECT MAX(COAR_CTACONS), SUM(FADE_CONSUMO)
            FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_DETALLE F
            WHERE F.FACT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
            GROUP BY COAR_CTACONS
            INTO :CTACONSUMO, :IMPTOS
        DO
            BEGIN
            execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
            if (IMPTOS <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTACONSUMO, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (31, :IDDOC, :CUENTA, 3);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    NROI = NROI + 1;
                    SUMA = SUMA - IMPTOS;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA - IMPTOS;
                    END
                END /* IMPTOS <> 0 */
            END /* FOR */
        END /* CONSUMO X ARTICULO */
    if ((CONSUMO = 'K') AND (FOMENTO <> 'SI')) then /* CONSUMO EN CTA CONSTANTE */
        BEGIN
        SELECT SUM(FADE_CONSUMO)
            FROM FACTURAS_DETALLE F
            WHERE F.FACT_ID = :IDDOC AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
            INTO :IMPTOS;
        execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
        if (IMPTOS <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTACONSUMO, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERROR (31, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTACONSUMO, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - IMPTOS;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTACONSUMO, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - IMPTOS;
                END
            END /* IMPTOS <> 0 */
        END /* CONSUMO EN CTA CONSTANTE */
    /* DESCUENTO */
    if ((CTADTO IS NOT NULL) AND (CTADTO <> '')) then
        BEGIN
        execute procedure redondee(VRDTO, DIG) returning_values (VRDTO);
        if (VRDTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTADTO, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRDTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA + VRDTO;
                END
            if (TIPOCUEN = 'N') then
                    BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRDTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA + VRDTO;
                END
            END
        END /* DESCUENTO */
    /* VALOR ADIC */
    if ((CTAADIC IS NOT NULL) AND (CTAADIC <> '')) then
        BEGIN
        execute procedure redondee(VRADIC, DIG) returning_values (VRADIC);
        if (VRADIC <> 0) THEN
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTAADIC, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRADIC, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - VRADIC;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRADIC, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - VRADIC;
                END
            END
        END /* VR. ADIC */
    /* VALOR EXTRA */
    if ((CTAEXTRA IS NOT NULL) AND (CTAEXTRA <> '')) THEN
        BEGIN
        execute procedure redondee(VREXTRA, DIG) returning_values (VREXTRA);
        if (VREXTRA <> 0) THEN
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTAEXTRA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VREXTRA, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - VREXTRA;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VREXTRA, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - VREXTRA;
                END
            END
        END /* VR. EXTRA */

    /* RETENCION FUENTE */
    if ((RTFTE = 'C') or (RTFTE = 'K')) then
      BEGIN
      execute procedure redondee(VRRTFTE, DIG) returning_values (VRRTFTE);
      if (VRRTFTE <> 0) then
        BEGIN
        if (RTFTE = 'C') then
            CTARTFTE = TCTARTFTE;
        EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTARTFTE, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :VRSUBT, :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTFTE;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :VRSUBT, :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTFTE;
            END
        /* AUTORETENCION */
        if (FAUTORET <= fecaux) then
            BEGIN
            EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'CUENTA DE AUTORETENCION EN LA FUENTE') returning_values (CTARTFTE);
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTARTFTE INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERROR (31, :IDDOC, :CTARTFTE, 2);
                CUENTA = CTARTFTE;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                begin
                EXECUTE PROCEDURE ERROR (31, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, (:VRSUBT*-1), :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - VRRTFTE;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, (:VRSUBT*-1), :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - VRRTFTE;
                END
            END
        END /* RTFTE */
      END
    if (RTFTE = 'A') then
      BEGIN
      FOR SELECT MAX(COAR_CTARTFTEV), MAX(COAR_RTFTE), MIN(COAR_RTBASE), SUM(FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), SUM((FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO)*COAR_RTFTE)
        FROM CONTABIL_ARTICULO C, FACTURAS_DETALLE F
        WHERE F.FACT_ID = :IDDOC AND F.ARTI_COD = C.ARTI_COD AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
        GROUP BY COAR_CTARTFTEV
        INTO :CTARTFTE, :PRTFTE, :baseadic, :MONTO, :VRRTFTE
        DO
        BEGIN
        MONTO = MONTO * FACTOR;
        if (MONTO >= BASEADIC) then
            BEGIN
            VRRTFTE = VRRTFTE * FACTOR / 100;
            execute procedure redondee(VRRTFTE, DIG) returning_values (VRRTFTE);
            execute procedure redondee(MONTO, DIG) returning_values (MONTO);
            if (VRRTFTE <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTARTFTE, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :MONTO, :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    NROI = NROI + 1;
                    SUMA = SUMA + VRRTFTE;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :MONTO, :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA + VRRTFTE;
                    END
                /* AUTORETENCION */
                if (FAUTORET <= fecaux) then
                    BEGIN
                    EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'CUENTA DE AUTORETENCION EN LA FUENTE') returning_values (CTARTFTE);
                    EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTARTFTE, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
                    if (ERRORC <> 0) then
                        ERROR = ERROR + 1;
                    if (TIPOCUEN = 'C') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, (:MONTO*-1), :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                        NROI = NROI + 1;
                        SUMA = SUMA - VRRTFTE;
                        END
                    if (TIPOCUEN = 'N') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, (:MONTO*-1), :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NROI = NROI + 1;
                        SUMA = SUMA - VRRTFTE;
                        END
                    END
                END
            END
        END /* RTFTE */
      END
    /* RETENCION IVA */
    if ((RTIVA = 'C') or (RTIVA = 'K')) then
      BEGIN
      execute procedure redondee(VRRTIVA, DIG) returning_values (VRRTIVA);
      if (VRRTIVA <> 0) then
        BEGIN
        if (RTIVA = 'C') then
            CTARTIVA = TCTARTIVA;
        EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTARTIVA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTIVA, 0, :VRIVA, :PORC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTIVA;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTIVA, 0, :VRIVA, :PORC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTIVA;
            END
        END /* RTIVA */
      END
    /* RETENCION DE ICA */
    if ((RTICA = 'C') or (RTICA = 'K')) then
      BEGIN
      execute procedure redondee(VRRTICA, DIG) returning_values (VRRTICA);
      if (VRRTICA <> 0) then
        BEGIN
        if (RTICA = 'C') then
            CTARTICA = TCTARTICA;
        EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTARTICA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTICA, 0, :VRSUBT, :PRTICA, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTICA;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTICA, 0, :VRSUBT, :PRTICA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTICA;
            END
        END /* RTICA */
      END
    /* CIERRE EL COMPROBANTE CONTRA LA CUENTA DEL TERCERO O LA CONSTANTE */
    if ((SUMA <> 0) and ((CARTERA = 'C') or (CARTERA = 'K') or (CARTERA = 'J'))) then
        BEGIN
        if (icoing = 'SI') then
            BEGIN
            /* DESCUENTE EL IMPOCONSUMO QUE HACE PARTE DEL COSTO */
            SELECT SUM(FADE_CONSUMO) FROM FACTURAS_DETALLE F WHERE F.FACT_ID = :IDDOC AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
                INTO :IMPTOS;
            SUMA = SUMA + IMPTOS;
            END
        if (SUMA < 0) then
            BEGIN
            DEBITO = SUMA * -1;
            CREDITO = 0;
            END
        ELSE
            BEGIN
            DEBITO = 0;
            CREDITO = SUMA;
            END
        if (CARTERA = 'C') then
            CTACARTERA = TCTACLIEN;
        if (CARTERA = 'J') then
            BEGIN
            /* BUSQUE LA CUENTA DE LA CAJA */
            SELECT CAJA_CUENTA FROM CAJAS C, PUNTO_VENTA P
                WHERE P.CAJA_ID = C.CAJA_ID AND PTVT_ID = :PTOVTA
                INTO :CTACARTERA;
            END
        EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTACARTERA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :DEBITO, :CREDITO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
        if (TIPOCUEN = 'N') then
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :DEBITO, :CREDITO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
        NROI = NROI + 1;
        END /* SUMA EN CARTERA */
    /* CALCULE COSTOS EN VENTAS */
    EXECUTE PROCEDURE COSTO_EN_VENTAS(31, :IDDOC);
    if (COSTOS = 'A') then
        BEGIN
        FOR SELECT MAX(CTACOS), SUM(CAST(CANT AS DOUBLE PRECISION) * COSTO), SUM(FADE_CONSUMO)
            FROM COSTO_VENTAS CV, FACTURAS_DETALLE D WHERE CV.cove_item = D.fade_item AND D.fact_id = :iddoc AND
            TIDO_COD = 31 AND COVE_ID = :iddoc
            GROUP BY CTACOS
            INTO :CTACOSTOS, :MONTO, :vrconsumo
            DO
            BEGIN
            if (icoing = 'SI') then
                MONTO = MONTO + VRCONSUMO;
            if (MONTO <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTACOSTOS, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (31, :IDDOC, :CUENTA, 3);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    NROI = NROI + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    END
                END /* MONTO <> 0 */
            END /* FOR */
        END /* COSTOS */
    if (COSTOS = 'K') then
        BEGIN
        SELECT SUM(CAST(CANT AS DOUBLE PRECISION) * COSTO)
            FROM COSTO_VENTAS WHERE TIDO_COD = 31 AND COVE_ID = :iddoc
            INTO :MONTO;
        if (icoing = 'SI') then
            MONTO = MONTO + imptos;
        if (MONTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTACOSTOS, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERROR (31, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTACOSTOS, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTACOSTOS, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                END
            END /* MONTO <> 0 */
        END /* COSTOS = K */
    if (INVEN = 'A') then
        BEGIN
        FOR SELECT MAX(CTAINV), SUM(CAST(CANT AS DOUBLE PRECISION) * COSTO)
            FROM COSTO_VENTAS WHERE TIDO_COD = 31 AND COVE_ID = :iddoc
            GROUP BY CTAINV
            INTO :CTAINVEN, :MONTO
        DO
            BEGIN
            if (MONTO <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTAINVEN, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (31, :IDDOC, :CUENTA, 3);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    NROI = NROI + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    END
                END /* MONTO <> 0 */
            END /* FOR */
        END /* INVEN = A */
    if (INVEN = 'K') then
        BEGIN
        SELECT SUM(CAST(CANT AS DOUBLE PRECISION) * COSTO)
            FROM COSTO_VENTAS WHERE TIDO_COD = 31 AND COVE_ID = :iddoc
            INTO :MONTO;
        if (MONTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTAINVEN, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERROR (31, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAINVEN, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAINVEN, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                END
            END /* MONTO <> 0 */
        END /* INVEN = K */
    /* recorra las cuentas adicionales */
    FOR SELECT INVC_CUENTA, INVC_BASE, INVC_PORC, INVC_VALOR, INVC_DB
        FROM INTERFAZ_VENTAS_CTAS
        WHERE INVE_ID = :IDINTER
        INTO :CTADIC, :BASEADIC, :PORCADIC, :VALORADIC, :DBADIC
        DO
        BEGIN
        if (VALORADIC <> 0) then
            MONTO = VALORADIC;
        ELSE
            BEGIN
            if (:BASEADIC = 'SUBTOTAL') then
                VALORADIC = vrsubt;
            if (:BASEADIC = 'DESCUENTO') then
                VALORADIC = VRDTO;
            if (:BASEADIC = 'IVA') then
                VALORADIC = VRIVA;
            if (:BASEADIC = 'ADICIONAL') then
                VALORADIC = VRADIC;
            if (:BASEADIC = 'EXTRA') then
                VALORADIC = VREXTRA;
            if (:BASEADIC = 'TOTAL') then
                VALORADIC = VRTOTAL;
            MONTO = VALORADIC * PORCADIC / 100;
            END
        if (MONTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTADIC, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                if (DBADIC = 'S') then
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                ELSE
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                if (DBADIC = 'S') then
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                ELSE
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                END
            NROI = NROI + 1;
            END
        END
    if (ERROR > 0) then
        VER = 'S';
    SUSPEND;
    END /* NO ANULADO */
  END /* EXISTE LA INTERFAZ */
ELSE
    BEGIN
    EXECUTE PROCEDURE ERROR (31, :IDDOC, :PREF, 1);
    ERROR = ERROR + 1;
    VER = 'S';
    SUSPEND;
    END
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE CONTADO_MVERDE(
    FECINI DATE,
    FECFIN DATE,
    PREF VARCHAR(4))
RETURNS (
    FECHA DATE,
    PUNTO INTEGER,
    IDC INTEGER,
    ERROR INTEGER,
    VER CHAR(1))
AS
declare variable IDIN INTEGER;
declare variable IDF INTEGER;
declare variable NIT VARCHAR(20);
begin
FECHA = FECINI;
SELECT MAX(INVE_ID) FROM INTERFAZ_VENTAS WHERE TIDO_COD = 31 AND PREF_PRE = :PREF INTO :IDIN;
WHILE (FECHA <= fecfin) DO
    BEGIN
    /* LAS DE CONTADO */
    FOR SELECT PTVT_ID, TERC_NIT FROM punto_venta ORDER BY PTVT_ID INTO :PUNTO, :NIT
        do
        BEGIN
        EXECUTE PROCEDURE contabil_facturas_contado (FECHA, NIT, PREF, PUNTO, IDIN) returning_values (ERROR,  VER, IDC);
        EXECUTE PROCEDURE contabiliza_pendiente (IDC);
        suspend;
        END
    /* LAS DE CREDITO */
    FOR SELECT FACT_ID, PTVT_ID FROM facturas F WHERE fact_fecha = :fecha and pref_pre = :pref and
        NOT exists (select terc_nit from punto_venta p where terc_nit = f.terc_nit) into : IDF, :PUNTO
        DO
        BEGIN
        if (NOT EXISTS (SELECT ENCO_CONSEC FROM comprobante_encabezado WHERE ENCO_TIPOREF = 31 AND ENCO_IDREF = :IDF)) then
            BEGIN
            EXECUTE PROCEDURE contabil_factura(idf,  IDIN) returning_values (ERROR, VER, IDC);
            EXECUTE PROCEDURE contabiliza_pendiente (IDC);
            suspend;
            END
        END
    FECHA = FECHA + 1;
    END
end

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE FACTURAR_CONCEPTOS(
    ID INTEGER,
    NITINI VARCHAR(20),
    NITFIN VARCHAR(20),
    AGRINI VARCHAR(20),
    AGRFIN VARCHAR(20),
    AGRUPA INTEGER,
    FECHA DATE)
RETURNS (
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(6),
    NIT VARCHAR(20),
    NOMBRE VARCHAR(60),
    TOTAL NUMERIC(18,2))
AS
declare variable IDF INTEGER;
declare variable IDC INTEGER;
declare variable VEND INTEGER;
declare variable PTVT INTEGER;
declare variable VENDINI INTEGER;
declare variable VENDFIN INTEGER;
declare variable ZONINI CHAR(2);
declare variable ZONFIN CHAR(2);
declare variable grpini INTEGER;
declare variable grpfin INTEGER;
declare variable DIAS INTEGER;
declare variable OBS VARCHAR(255);
declare variable IVAINC CHAR(1);
declare variable ITEM INTEGER;
declare variable ARTICULO VARCHAR(20);
declare variable DESCR VARCHAR(60);
declare variable CANT NUMERIC(18,2);
declare variable PRUNIT NUMERIC(18,2);
declare variable IVAP NUMERIC(18,2);
declare variable IVAM NUMERIC(18,2);
declare variable BASE NUMERIC(18,2);
declare variable RTFTE NUMERIC(9,2);
declare variable RTIVA NUMERIC(9,2);
declare variable RTICA NUMERIC(9,2);
declare variable RTFTEM NUMERIC(18,2);
declare variable RTIVAM NUMERIC(18,2);
declare variable RTICAM NUMERIC(18,2);
declare variable UNIDAD VARCHAR(8);
declare variable BOD VARCHAR(2);
declare variable ERROR INTEGER;
declare variable VER CHAR(1);
declare variable factmes varchar(2);
declare variable GRPFM VARCHAR(3);
declare variable OK CHAR(1);
begin
if (agrupa = 0) then
    BEGIN
    VENDINI = 0;
    VENDFIN = 999999;
    GRPINI = 0;
    GRPFIN = 999999;
    ZONINI = '';
    ZONFIN = 'zz';
    END
if (agrupa = 1) then
    BEGIN
    VENDINI = 0;
    VENDFIN = 999999;
    ZONINI = '';
    ZONFIN = 'zz';
    GRPINI = AGRINI;
    GRPFIN = AGRFIN;
    END
if (agrupa = 2) then
    BEGIN
    GRPINI = 0;
    GRPFIN = 999999;
    ZONINI = '';
    ZONFIN = 'zz';
    VENDINI = AGRINI;
    VENDFIN = AGRFIN;
    END
if (agrupa = 3) then
    BEGIN
    VENDINI = 0;
    VENDFIN = 999999;
    GRPINI = 0;
    GRPFIN = 999999;
    ZONINI = AGRINI;
    ZONFIN = AGRFIN;
    END
EXECUTE procedure lee_configuracion ('FACTURACION', 'FACTURAS', 'GRUPO DE MERCANCIA PARA CONTROL MENSUAL DE FACTURACION') returning_values (:GRPFM);
EXECUTE procedure lee_configuracion ('FACTURACION', 'FACTURAS', 'CONTROLAR FACTURACION MENSUAL POR CADA CLIENTE') returning_values (:factmes);
SELECT FACC_PREF, FACC_VEND, FACC_DIAS, FACC_PTVT, FACC_OBS FROM factura_concepto WHERE FACC_ID = :ID
    INTO :prefijo, :vend, :dias, :ptvt, :obs;
SELECT BODE_COD FROM punto_venta WHERE PTVT_ID = :PTVT INTO :BOD;
FOR SELECT T.TERC_NIT, TERC_NOM, C.vend_cod, C.clie_rtefte, C.clie_rteiva, C.clie_rteica, C.clie_rtftebase
    FROM TERCEROS T, CLIENTES C
    WHERE T.terc_nit = C.terc_nit AND T.TERC_NIT >= :NITINI AND T.TERC_NIT <= :NITFIN AND
        C.vend_cod >= :vendini AND C.vend_cod <= :vendfin AND ((c.grca_cod is null and :grpini = 0 ) or (C.grca_cod >= :grpini AND C.grca_cod <= :grpfin)) AND
        ((c.zona_cod is null and :zonini = '') or (C.zona_cod >= :zonini AND C.zona_cod <= :zonfin))
    INTO :NIT, :NOMBRE, :VEND, :RTFTE, :RTIVA, :RTICA, :RTFTEM
    DO
    BEGIN
    SELECT PREF_ACTUAL, PREF_IVAINC FROM PREFIJOS WHERE TIDO_COD = 31 AND PREF_PRE = :prefijo
        INTO :NUMERO, :IVAINC;
    select max(INVE_ID) FROM interfaz_ventas WHERE PREF_PRE = :prefijo AND TIDO_COD = 31 INTO :IDC;

    OK = 'S';
    if (FACTMES = 'SI') then
        begin
        if (EXISTS(SELECT FAME_IDFACT FROM FACTURAS_MES WHERE FAME_NIT = :nit AND FAME_ANO = EXTRACT(YEAR FROM :FECHA) AND FAME_MES = EXTRACT(MONTH FROM :FECHA))) then
            OK = 'N';
        end
    if (OK = 'S') then
        BEGIN
        IDF = GEN_ID(id_factura, 1);
        INSERT INTO FACTURAS (FACT_ID, PTVT_ID, VEND_COD, TERC_NIT, AUTO_NUMERO, FACT_NUMERO, FACT_FECHA, FACT_DESPACHO,
            FACT_VENCE, FACT_IVAINC, FACT_COMIPORC, FACT_COMIMONTO, FACT_DTOPOR, FACT_DTOMONTO, FACT_ADICIONAL,
            FACT_IVAMONTO, FACT_RTFTEPOR, FACT_RTFTEMONTO, FACT_RTIVAPOR, FACT_RTIVAMONTO, FACT_RTICAPOR, FACT_RTICAMONTO,
            FACT_EXTRA, FACT_DTOFPOR, FACT_DTOFMONTO, FACT_DTOFFECHA, PREF_PRE, FACT_TRANSP, FACT_NOMCLIENTE, FACT_COTIZACI,
            FACT_PEDIDO, FACT_REMISION, FACT_ANULADO, FACT_TRANSMIT, FACT_TOTAL, BODE_COD, FACT_OBS, VEHI_COD, FACT_CONSOLIDA,
            FACT_RECIBIDO, FACT_USUARIO, FACT_SUCURSAL, NUMOK, COBR_COD, FACT_FACTOR, FACT_DETCLI, FACT_DETCLINOM,
            FACT_DTOIT1, FACT_DTOIT2, FACT_DTOIT3, FACT_TRM)
            VALUES (:IDF, :PTVT, :VEND, :NIT, NULL, :NUMERO, :FECHA, NULL, (:FECHA + :DIAS), :IVAINC,
            0, 0, 0, 0, 0, :IVAM, :RTFTE, :RTFTEM, :RTIVA, :RTIVAM, :RTICA, :RTICAM, 0, 0, 0, :FECHA, :PREFIJO, NULL,
            :NOMBRE, NULL, NULL, NULL, 'N', 'N', :TOTAL, :BOD, :OBS, NULL, NULL, 0, USER, '01', 'N', :VEND, 1, NULL,
            NULL, NULL, NULL, NULL, 1);

        FOR SELECT FACI_ITEM, FC.ARTI_COD, FACI_CANT, FACI_PRUNIT, ARTI_UNIDAD, TAIV_PORC, FACI_DESC
            FROM factura_concepto_items FC, ARTICULO A, TARIFA_IVA I
            WHERE FC.arti_cod = A.arti_cod AND A.taiv_cod = I.taiv_cod AND FC.facc_id = :ID
            INTO :item, :articulo, :CANT, :prunit, :unidad, :ivap, :descr
            DO
            BEGIN
            /* busque el precio por cliente */
            if (EXISTS(SELECT ARTI_COD FROM ARTICULO WHERE ARTI_COD = :articulo AND GRUP_COD = :GRPFM)) then
                SELECT CLIE_VALORMES FROM CLIENTES WHERE TERC_NIT = :NIT INTO :PRUNIT;

            if (IVAINC = 'S') then
                BEGIN
                IVAM = :CANT * :PRUNIT / (100 + :IVAP) * :IVAP;
                BASE = :CANT * :PRUNIT;
                END
            ELSE
                BEGIN
                IVAM = :CANT * :PRUNIT * IVAP / 100;
                BASE = :CANT * :PRUNIT + IVAM;
                END
            INSERT INTO FACTURAS_DETALLE (FACT_ID, FADE_ITEM, BODE_COD, ARTI_COD, FADE_CANT, FADE_UNIDAD, FADE_LOTE,
                FADE_PRUNIT, FADE_DTOPORC, FADE_DTOMONTO, FADE_IVAPORC, FADE_IVAMONTO, FADE_CONSUMO, FADE_FACTOR,
                FADE_DESC, FADE_OBS, FADE_CODBAR, FADE_REMISIONADO, FADE_DEVUELTO, FADE_TOTAL, LIPR_COD, FADE_REFERENCIA,
                FADE_ANULADO, FADE_TRANSMIT, FADE_FACTORLISTA, FADE_DTO1, FADE_DTO2, FADE_DTO3, FADE_DTOM1, FADE_DTOM2,
                FADE_DTOM3, FADE_CAJAS)
                VALUES (:IDF, :ITEM, :BOD, :articulo, :CANT, :UNIDAD, NULL, :prunit, 0, 0, :IVAP, :ivam, 0, 1,
                :descr, NULL, :articulo, 0, 0, :BASE, 1, NULL, 'N', 'N', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
            END

        /* CALCULE EL TOTAL DE LA FACTURA XA EFECTOS DE IMPUESTOS */
        SELECT SUM(FADE_TOTAL), SUM(FADE_IVAMONTO) FROM facturas_detalle WHERE FACT_ID = :idf
            INTO :TOTAL, :IVAM;
        if (IVAINC = 'S') then
            BASE = TOTAL - IVAM;
        ELSE
            BASE = TOTAL;
        if (BASE >= RTFTEM) then
            BEGIN
            RTFTEM = BASE * RTFTE / 100;
            RTICAM = BASE * RTICA / 1000;
            RTIVAM = IVAM * RTIVA / 100;
            END
        ELSE
            BEGIN
            RTFTEM = 0;
            RTICAM = 0;
            RTIVAM = 0;
            END
        UPDATE FACTURAS SET FACT_TOTAL = :total,  FACT_IVAMONTO = :IVAM, FACT_RTFTEMONTO = :rtftem, 
            FACT_RTIVAMONTO = :rtivam, FACT_RTICAMONTO = :rticam WHERE FACT_ID = :IDF;

        /* contabilice */
        execute procedure CONTABIL_FACTURA(:idf,  :IDC) returning_values (:ERROR, :VER, :IDC);
        EXECUTE procedure contabiliza_pendiente (:IDC);
        suspend;
        END
    END
end

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE FACTURAS_SIN_CONTABILIDAD(
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    ID INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    ESTADO VARCHAR(20),
    IDI INTEGER,
    IDC INTEGER)
AS
DECLARE VARIABLE VER CHAR(2);
declare variable FECICNT VARCHAR(10);
declare variable FECFCNT VARCHAR(10);
declare variable ERROR INTEGER;
declare variable idref INTEGER;
BEGIN
EXECUTE PROCEDURE fecha_a_conta(FECINI) returning_values (FECICNT);
EXECUTE PROCEDURE fecha_a_conta(FECFIN) returning_values (FECFCNT);
FOR SELECT FACT_ID, PREF_PRE, FACT_NUMERO FROM FACTURAS WHERE FACT_ANULADO = 'N' AND
    FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN INTO :ID, :PREF, :NUMERO
DO
  BEGIN
  idref = null;
  SELECT ENCO_IDREF FROM COMPROBANTE_ENCABEZADO WHERE ENCO_TIPOREF = 31 AND ENCO_FECHA >= :FECICNT AND ENCO_FECHA <= :FECFCNT and ENCO_IDREF = :ID into :idref;
  if (idref IS NULL) then
  begin
   ESTADO = 'PROCESANDO';
   ERROR = NULL;
   SUSPEND;
   SELECT MAX(INVE_ID) FROM INTERFAZ_VENTAS WHERE PREF_PRE = :PREF AND TIDO_COD = 31 INTO :IDI;
   EXECUTE PROCEDURE CONTABIL_FACTURA (:ID, :IDI) RETURNING_VALUES (:ERROR, VER, :IDC);
   if ((ERROR = 0) or (error IS NULL)) then
    BEGIN
    EXECUTE PROCEDURE CONTABILIZA_PENDIENTE (:IDC);
    ESTADO = 'OK';
    END
   ELSE
    ESTADO = 'ERROR';
   suspend;
  end
  END
END

^

SET TERM ; ^

/* 20100819 */
/* si costo es nulo dejelo en cero para no dañar totales */
SET TERM ^ ;

CREATE OR ALTER procedure REP_UTILIDAD_VENTAS (
    TIPO integer,
    DETALLE char(1),
    FECINI date,
    FECFIN date,
    ARTINI varchar(15),
    ARTFIN varchar(15),
    GRPINI varchar(3),
    GRPFIN varchar(3),
    ORDEN char(1),
    AGRUPA char(1),
    ULTIMO char(1),
    CEROS char(1),
    SUBEMPRESA integer)
returns (
    ARTICULO varchar(15),
    DESCRIPCION varchar(60),
    CODGRUPO varchar(2),
    NOMGRUPO varchar(30),
    CODSUBG varchar(3),
    NOMSUBG varchar(30),
    CODMARC varchar(3),
    NOMMARC varchar(30),
    UNIDAD varchar(8),
    CANTIDAD numeric(18,4),
    BASE numeric(18,4),
    COSTO numeric(18,4),
    UTILIDAD numeric(18,4),
    PORC numeric(9,2),
    IVA numeric(18,4),
    IVAPOR numeric(9,2),
    CONSUMO numeric(18,4),
    PREFIJO varchar(4),
    NUMERO varchar(6),
    FECHA date,
    TIPODOC integer,
    PART float)
AS
DECLARE VARIABLE COSTOUNIT NUMERIC(18,4);
DECLARE VARIABLE CANTDET NUMERIC(18,4);
DECLARE VARIABLE TOTAL NUMERIC(18,2);
declare variable CODINI VARCHAR(15);
declare variable CODFIN VARCHAR(15);
declare variable DESINI VARCHAR(15);
declare variable DESFIN VARCHAR(15);
declare variable MARINI VARCHAR(3);
declare variable MARFIN VARCHAR(3);
declare variable UOM VARCHAR(20);
declare variable ULTCOS NUMERIC(18,2);
declare variable FACCOST NUMERIC(18,4);
declare variable IDREP INTEGER;
declare variable ID integer;
declare variable ITEM integer;
BEGIN
if (ORDEN = 'C') then
    BEGIN
    CODINI = ARTINI;
    CODFIN = ARTFIN;
    DESINI = '';
    DESFIN = 'zz';
    END
ELSE
    BEGIN
    DESINI = ARTINI;
    DESFIN = ARTFIN;
    CODINI = '';
    CODFIN = 'zz';
    END
if (AGRUPA = 'G') then
    BEGIN
    MARINI = '';
    MARFIN = 'zz';
    END
ELSE
    if (AGRUPA = 'M') then
        BEGIN
        MARINI = GRPINI;
        MARFIN = GRPFIN;
        GRPINI = '';
        GRPFIN = 'zz';
        END
    ELSE
        BEGIN
        MARINI = '';
        MARFIN = 'zz';
        GRPINI = '';
        GRPFIN = 'zz';
        END
EXECUTE PROCEDURE lee_configuracion ('FACTURACION', 'ARTICULOS', 'SUGERIR PRECIOS CON PORCENTAJE DE MARGEN O UTILIDAD') returning_values (:UOM);
IDREP = GEN_ID(id_reputilidad, 1);
if (DETALLE = 'N') then
    BEGIN
    if (BIN_AND(TIPO, 1) <> 0) then
        BEGIN
        TIPODOC = 31;
        FOR SELECT MAX(D.ARTI_COD), SUM(FADE_CANT * FADE_FACTOR), SUM((FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO)*FACT_FACTOR), SUM(FADE_IVAMONTO*FACT_FACTOR), SUM(FADE_CONSUMO)
            FROM FACTURAS_DETALLE D, FACTURAS F, PREFIJOS P, ARTICULO A
            WHERE F.FACT_ID = D.FACT_ID AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND D.ARTI_COD = A.arti_cod AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            FACT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) and substring(a.arti_cod from 1 FOR 2) <> '.t'
            GROUP BY D.ARTI_COD
            INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO
            DO
            BEGIN
            COSTO = 0;
            FOR SELECT FADE_CANT * FADE_FACTOR, FACT_FECHA, F.FACT_ID, FADE_ITEM FROM FACTURAS_DETALLE D, FACTURAS F, PREFIJOS P
                WHERE F.FACT_ID = D.FACT_ID AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND
                FACT_ANULADO = 'N' AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                and D.ARTI_COD = :articulo  INTO :cantdet, :fecha, :id, :item
                DO
                BEGIN
                if (EXISTS (SELECT COST_SALP / COST_SALC FROM COSTOS C, MOVIMIENTO_ARTICULO M
                    WHERE C.arti_cod = M.arti_cod AND COST_IDMOV = MVAR_CONS AND MVAR_TIPODOC = 31 AND MVAR_IDREF = :ID AND COST_SALC <> 0 AND MVAR_ITEM = :ITEM)) then
                    SELECT COST_SALP / COST_SALC, COST_ULTIMO FROM COSTOS C, MOVIMIENTO_ARTICULO M
                    WHERE C.arti_cod = M.arti_cod AND COST_IDMOV = MVAR_CONS AND MVAR_TIPODOC = 31 AND MVAR_IDREF = :ID AND COST_SALC <> 0 AND MVAR_ITEM = :ITEM INTO :costounit, :ultcos;
                else
                    EXECUTE PROCEDURE costo_promedio_y_ultimo(:ARTICULO, :FECHA) returning_values (:costounit, :ultcos);
                if (costounit IS NULL) then
                    costounit = 0;
                if (ultcos IS NULL) then
                    ultcos = 0;

                /* EL FACTOR */
                FACCOST = 1;
                SELECT FIRST 1 FACO_FACTOR FROM factor_costo WHERE FACO_FECINI <= :FECHA AND FACO_FECFIN >= :FECHA INTO :FACCOST;
                ULTCOS = ULTCOS * FACCOST;
                COSTOUNIT = COSTOUNIT * FACCOST;

                if (ULTIMO = 'S') then
                    COSTO = COSTO + ultcos * cantdet;
                else
                    COSTO = COSTO + costounit * cantdet;
                END
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            INSERT INTO REP_UTILIDAD(ID, TIPO, CODIGO, BASE, IVA, CONSUMO, COSTO) VALUES (:IDREP, 31, :articulo, :base, :iva, :consumo, :costo);
            if (CEROS = 'S') then
                INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (2, USER, :ARTICULO);
            END /* FOR */
        SELECT SUM(BASE-COSTO) FROM REP_UTILIDAD WHERE id = :IDREP AND TIPO = 31 INTO :TOTAL;
        FOR SELECT ARTI_COD, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD, TAIV_PORC FROM ARTICULO A, TARIFA_IVA T
            WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND
            (A.MARC_COD <= :MARFIN))) AND substring(a.arti_cod from 1 FOR 2) <> '.t' AND A.taiv_cod = T.taiv_cod
            INTO :ARTICULO, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :ivapor
            DO
            BEGIN
            EXECUTE procedure nombres_grupos_inventario (CODGRUPO, CODSUBG, CODMARC)
                returning_values (NOMGRUPO, NOMSUBG, NOMMARC);
            BASE = 0;
            IVA = 0;
            CONSUMO = 0;
            COSTO = 0;
            UTILIDAD = 0;
            PORC = 0;
            PART = 0;
            SELECT BASE, IVA, CONSUMO, COSTO FROM rep_utilidad WHERE ID = :IDREP AND TIPO = 31 AND CODIGO = :articulo INTO :BASE, :IVA, :consumo,  :costo;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            EXECUTE PROCEDURE PORCENTAJE (utilidad,  TOTAL, 'S') returning_values (part);
            if ((CEROS = 'S') or (BASE <> 0) or (COSTO <> 0)) then
                SUSPEND;
            END /* FOR */
            BEGIN
            COSTO = 0;
            END
        END
    if (BIN_AND(TIPO, 2) <> 0) then
        BEGIN
        TIPODOC = 32;
        FOR SELECT MAX(D.ARTI_COD), SUM(RVDE_CANT * RVDE_FACTOR), SUM(RVDE_TOTAL-RVDE_IVAMONTO-RVDE_CONSUMO), SUM(RVDE_IVAMONTO), SUM(RVDE_CONSUMO)
            FROM REMISIONES_VENTA_DETALLE D, REMISIONES_VENTA R, PREFIJOS P, ARTICULO A
            WHERE R.REVT_ID = D.REVT_ID AND P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = 32 AND D.ARTI_COD = A.arti_cod AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            REVT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY D.ARTI_COD
            INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO
            DO
            BEGIN
            COSTO = 0;
            FOR SELECT RVDE_CANT * RVDE_FACTOR, REVT_FECHA, F.REVT_ID, RVDE_ITEM FROM remisiones_venta_detalle D, remisiones_venta F, PREFIJOS P
                WHERE F.revt_id = D.revt_id AND REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN AND
                REVT_ANULADO = 'N' AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 32 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                and D.ARTI_COD = :articulo  INTO :cantdet, :fecha, :id, :item
                DO
                BEGIN
                if (EXISTS (SELECT COST_SALP / COST_SALC FROM COSTOS C, MOVIMIENTO_ARTICULO M
                    WHERE C.arti_cod = M.arti_cod AND COST_IDMOV = MVAR_CONS AND MVAR_TIPODOC = 32 AND MVAR_IDREF = :ID AND COST_SALC <> 0 AND MVAR_ITEM = :ITEM)) then
                    SELECT COST_SALP / COST_SALC, cost_ultimo FROM COSTOS C, MOVIMIENTO_ARTICULO M
                    WHERE C.arti_cod = M.arti_cod AND COST_IDMOV = MVAR_CONS AND MVAR_TIPODOC = 32 AND MVAR_IDREF = :ID AND COST_SALC <> 0 AND MVAR_ITEM = :ITEM INTO :costounit, :ultcos;
                else
                    EXECUTE PROCEDURE costo_promedio_y_ultimo(:ARTICULO, :FECHA) returning_values (:costounit, :ultcos);
                if (costounit IS NULL) then
                    costounit = 0;
                if (ultcos IS NULL) then
                    ultcos = 0;
                /* EL FACTOR */
                FACCOST = 1;
                SELECT FIRST 1 FACO_FACTOR FROM factor_costo WHERE FACO_FECINI <= :FECHA AND FACO_FECFIN >= :FECHA INTO :FACCOST;
                ULTCOS = ULTCOS * FACCOST;
                COSTOUNIT = COSTOUNIT * FACCOST;

                if (ULTIMO = 'S') then
                    COSTO = COSTO + ultcos * cantdet;
                else
                    COSTO = COSTO + costounit * cantdet;
                END
            EXECUTE procedure nombres_grupos_inventario (CODGRUPO, CODSUBG, CODMARC)
                returning_values (NOMGRUPO, NOMSUBG, NOMMARC);
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            if (CEROS = 'S') then
                INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (2, USER, :ARTICULO);
            INSERT INTO REP_UTILIDAD(ID, TIPO, CODIGO, BASE, IVA, CONSUMO, COSTO) VALUES (:IDREP, 32, :articulo, :base, :iva, :consumo, :costo);
            END /* FOR */
        SELECT SUM(BASE-COSTO) FROM REP_UTILIDAD WHERE id = :IDREP AND TIPO = 32 INTO :TOTAL;
        FOR SELECT ARTI_COD, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD, TAIV_PORC FROM ARTICULO A, TARIFA_IVA T
            WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND
            (A.MARC_COD <= :MARFIN))) AND substring(a.arti_cod from 1 FOR 2) <> '.t' AND A.taiv_cod = T.taiv_cod
            INTO :ARTICULO, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :ivapor
            DO
            BEGIN
            EXECUTE procedure nombres_grupos_inventario (CODGRUPO, CODSUBG, CODMARC)
                returning_values (NOMGRUPO, NOMSUBG, NOMMARC);
            BASE = 0;
            IVA = 0;
            CONSUMO = 0;
            COSTO = 0;
            UTILIDAD = 0;
            PORC = 0;
            SELECT BASE, IVA, CONSUMO, COSTO FROM rep_utilidad WHERE ID = :IDREP AND TIPO = 32 AND CODIGO = :articulo INTO :BASE, :IVA, :consumo,  :costo;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            EXECUTE PROCEDURE PORCENTAJE (utilidad,  TOTAL, 'S') returning_values (part);
            if ((CEROS = 'S') or (BASE <> 0) or (COSTO <> 0)) then
                SUSPEND;
            END /* FOR */
        END
    if (BIN_AND(TIPO, 4) <> 0) then
        BEGIN
        TIPODOC = 33;
        FOR SELECT MAX(D.ARTI_COD), SUM(DVDE_CANT * DVDE_FACTOR), SUM((DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO)*DEVT_FACTOR), SUM(DVDE_IVAMONTO*DEVT_FACTOR), SUM(DVDE_CONSUMO)
            FROM devoluciones_ventas_detalle D, DEVOLUCIONES_VENTAS V, PREFIJOS P, ARTICULO A
            WHERE V.DEVT_ID = D.DEVT_ID AND P.PREF_PRE = V.PREF_PRE AND P.TIDO_COD = 33 AND D.ARTI_COD = A.arti_cod AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            DEVT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY D.ARTI_COD
            INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO
            DO
            BEGIN
            COSTO = 0;
            FOR SELECT DVDE_CANT * DVDE_FACTOR, DEVT_FECHA, F.DEVT_ID, DVDE_ITEM FROM devoluciones_ventas_detalle D, devoluciones_ventas F, PREFIJOS P
                WHERE F.devt_id = D.devt_id AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND
                DEVT_ANULADO = 'N' AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 33 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                and D.ARTI_COD = :articulo  INTO :cantdet, :fecha, :id, :item
                DO
                BEGIN
                if (EXISTS (SELECT COST_ENTP / COST_ENTC FROM COSTOS C, MOVIMIENTO_ARTICULO M
                    WHERE C.arti_cod = M.arti_cod AND COST_IDMOV = MVAR_CONS AND MVAR_TIPODOC = 33 AND MVAR_IDREF = :ID AND COST_ENTC <> 0 AND MVAR_ITEM = :ITEM)) then
                    SELECT COST_ENTP / COST_ENTC, COST_ULTIMO FROM COSTOS C, MOVIMIENTO_ARTICULO M
                        WHERE C.arti_cod = M.arti_cod AND COST_IDMOV = MVAR_CONS AND MVAR_TIPODOC = 33 AND MVAR_IDREF = :ID AND COST_ENTC <> 0 AND MVAR_ITEM = :ITEM INTO :costounit, :ultcos;
                else
                    EXECUTE PROCEDURE costo_promedio_y_ultimo(:ARTICULO, :FECHA) returning_values (:costounit, :ultcos);
                if (costounit IS NULL) then
                    costounit = 0;
                if (ultcos IS NULL) then
                    ultcos = 0;
                /* EL FACTOR */
                FACCOST = 1;
                SELECT FIRST 1 FACO_FACTOR FROM factor_costo WHERE FACO_FECINI <= :FECHA AND FACO_FECFIN >= :FECHA INTO :FACCOST;
                ULTCOS = ULTCOS * FACCOST;
                COSTOUNIT = COSTOUNIT * FACCOST;

                if (ULTIMO = 'S') then
                    COSTO = COSTO + ultcos * cantdet;
                else
                    COSTO = COSTO + costounit * cantdet;
                END
            EXECUTE procedure nombres_grupos_inventario (CODGRUPO, CODSUBG, CODMARC)
                returning_values (NOMGRUPO, NOMSUBG, NOMMARC);
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            else
                CANTIDAD = CANTIDAD * -1;
            if (BASE IS NULL) then
                BASE = 0;
            else
                BASE = BASE * -1;
            if (IVA IS NULL) then
                IVA = 0;
            else
                IVA = IVA * -1;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            else
                CONSUMO = CONSUMO * -1;
            COSTO = costo * -1;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            if (CEROS = 'S') then
                INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (2, USER, :ARTICULO);
            INSERT INTO REP_UTILIDAD(ID, TIPO, CODIGO, BASE, IVA, CONSUMO, COSTO) VALUES (:IDREP, 33, :articulo, :base, :iva, :consumo, :costo);
            END /* FOR */
        SELECT SUM(BASE-COSTO) FROM REP_UTILIDAD WHERE id = :IDREP AND TIPO = 33 INTO :TOTAL;
        FOR SELECT ARTI_COD, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD, TAIV_PORC FROM ARTICULO A, TARIFA_IVA T
            WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND
            (A.MARC_COD <= :MARFIN))) AND substring(a.arti_cod from 1 FOR 2) <> '.t' AND A.taiv_cod = T.taiv_cod
            INTO :ARTICULO, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :ivapor
            DO
            BEGIN
            EXECUTE procedure nombres_grupos_inventario (CODGRUPO, CODSUBG, CODMARC)
                returning_values (NOMGRUPO, NOMSUBG, NOMMARC);
            BASE = 0;
            IVA = 0;
            CONSUMO = 0;
            COSTO = 0;
            UTILIDAD = 0;
            PORC = 0;
            SELECT BASE, IVA, CONSUMO, COSTO FROM rep_utilidad WHERE ID = :IDREP AND TIPO = 33 AND CODIGO = :articulo INTO :BASE, :IVA, :consumo,  :costo;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            EXECUTE PROCEDURE PORCENTAJE (utilidad,  TOTAL, 'S') returning_values (part);
            if ((CEROS = 'S') or (BASE <> 0) or (COSTO <> 0)) then
                SUSPEND;
            END /* FOR */
        END
    if (BIN_AND(TIPO, 8) <> 0) then
        BEGIN
        TIPODOC = 34;
        /* BORRA LA TABLA AUXILIAR */
        DELETE FROM reportes_aux WHERE REPA_ID = 2 AND REPA_USER = USER;

        FOR SELECT MAX(D.ARTI_COD), SUM(PEDE_CANT * PEDE_FACTOR), SUM((PEDE_TOTAL-PEDE_IVAMONTO-PEDE_CONSUMO)*PEDI_FACTOR), SUM(PEDE_IVAMONTO*PEDI_FACTOR), SUM(PEDE_CONSUMO)
            FROM PEDIDOS_DETALLE D, PEDIDOS P, PREFIJOS R, ARTICULO A
            WHERE P.PEDI_ID = D.PEDI_ID AND P.PREF_PRE = R.PREF_PRE AND R.TIDO_COD = 34 AND D.ARTI_COD = A.arti_cod AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            PEDI_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY D.ARTI_COD
            INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO
            DO
            BEGIN
            COSTO = 0;
            FOR SELECT PEDE_CANT * PEDE_FACTOR, PEDI_FECHA FROM pedidos_detalle D, pedidos F, PREFIJOS P
                WHERE F.pedi_id = D.pedi_id AND PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND
                PEDI_ANULADO = 'N' AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                and D.ARTI_COD = :articulo  INTO :cantdet, :fecha
                DO
                BEGIN
                EXECUTE PROCEDURE costo_promedio_y_ultimo(:ARTICULO, :FECHA) returning_values (:costounit, :ultcos);
                /* EL FACTOR */
                FACCOST = 1;
                SELECT FIRST 1 FACO_FACTOR FROM factor_costo WHERE FACO_FECINI <= :FECHA AND FACO_FECFIN >= :FECHA INTO :FACCOST;
                ULTCOS = ULTCOS * FACCOST;
                COSTOUNIT = COSTOUNIT * FACCOST;

                if (ULTIMO = 'S') then
                    COSTO = COSTO + ultcos * cantdet;
                else
                    COSTO = COSTO + costounit * cantdet;
                END
            EXECUTE procedure nombres_grupos_inventario (CODGRUPO, CODSUBG, CODMARC)
                returning_values (NOMGRUPO, NOMSUBG, NOMMARC);
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            if (CEROS = 'S') then
                INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (2, USER, :ARTICULO);
            INSERT INTO REP_UTILIDAD(ID, TIPO, CODIGO, BASE, IVA, CONSUMO, COSTO) VALUES (:IDREP, 34, :articulo, :base, :iva, :consumo, :costo);
            END /* FOR */
        SELECT SUM(BASE-COSTO) FROM REP_UTILIDAD WHERE id = :IDREP AND TIPO = 34 INTO :TOTAL;
        FOR SELECT ARTI_COD, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD, TAIV_PORC FROM ARTICULO A, TARIFA_IVA T
            WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND
            (A.MARC_COD <= :MARFIN))) AND substring(a.arti_cod from 1 FOR 2) <> '.t' AND A.taiv_cod = T.taiv_cod
            INTO :ARTICULO, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :ivapor
            DO
            BEGIN
            EXECUTE procedure nombres_grupos_inventario (CODGRUPO, CODSUBG, CODMARC)
                returning_values (NOMGRUPO, NOMSUBG, NOMMARC);
            BASE = 0;
            IVA = 0;
            CONSUMO = 0;
            COSTO = 0;
            UTILIDAD = 0;
            PORC = 0;
            SELECT BASE, IVA, CONSUMO, COSTO FROM rep_utilidad WHERE ID = :IDREP AND TIPO = 34 AND CODIGO = :articulo INTO :BASE, :IVA, :consumo,  :costo;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            EXECUTE PROCEDURE PORCENTAJE (utilidad,  TOTAL, 'S') returning_values (part);
            if ((CEROS = 'S') or (BASE <> 0) or (COSTO <> 0)) then
                SUSPEND;
            END /* FOR */
        END
    if (BIN_AND(TIPO, 16) <> 0) then
        BEGIN
        TIPODOC = 35;
        FOR SELECT MAX(D.ARTI_COD), SUM(CTDE_CANT * CTDE_FACTOR), SUM((CTDE_TOTAL-CTDE_IVAMONTO-CTDE_CONSUMO)*COTI_FACTOR), SUM(CTDE_IVAMONTO), SUM(CTDE_CONSUMO)
            FROM COTIZACIONES_DETALLE D, COTIZACIONES C, PREFIJOS P, ARTICULO A
            WHERE C.COTI_ID = D.COTI_ID AND P.PREF_PRE = C.PREF_PRE AND P.TIDO_COD = 35 AND D.ARTI_COD = A.arti_cod AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND COTI_FECHA >= :FECINI AND COTI_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            COTI_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY D.ARTI_COD
            INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO
            DO
            BEGIN
            COSTO = 0;
            FOR SELECT CTDE_CANT * CTDE_FACTOR, COTI_FECHA FROM cotizaciones_detalle D, cotizaciones F, PREFIJOS P
                WHERE F.coti_id = D.coti_id AND COTI_FECHA >= :FECINI AND COTI_FECHA <= :FECFIN AND
                COTI_ANULADO = 'N' AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 35 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                and D.ARTI_COD = :articulo  INTO :cantdet, :fecha
                DO
                BEGIN
                EXECUTE PROCEDURE costo_promedio_y_ultimo(:ARTICULO, :FECHA) returning_values (:costounit, :ultcos);
                /* EL FACTOR */
                FACCOST = 1;
                SELECT FIRST 1 FACO_FACTOR FROM factor_costo WHERE FACO_FECINI <= :FECHA AND FACO_FECFIN >= :FECHA INTO :FACCOST;
                ULTCOS = ULTCOS * FACCOST;
                COSTOUNIT = COSTOUNIT * FACCOST;

                if (ULTIMO = 'S') then
                    COSTO = COSTO + ultcos * cantdet;
                else
                    COSTO = COSTO + costounit * cantdet;
                END
            EXECUTE procedure nombres_grupos_inventario (CODGRUPO, CODSUBG, CODMARC)
                returning_values (NOMGRUPO, NOMSUBG, NOMMARC);
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            if (CEROS = 'S') then
                INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (2, USER, :ARTICULO);
            INSERT INTO REP_UTILIDAD(ID, TIPO, CODIGO, BASE, IVA, CONSUMO, COSTO) VALUES (:IDREP, 35, :articulo, :base, :iva, :consumo, :costo);
            END /* FOR */
        SELECT SUM(BASE-COSTO) FROM REP_UTILIDAD WHERE id = :IDREP AND TIPO = 35 INTO :TOTAL;
        FOR SELECT ARTI_COD, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD, TAIV_PORC FROM ARTICULO A, TARIFA_IVA T
            WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND
            (A.MARC_COD <= :MARFIN))) AND substring(a.arti_cod from 1 FOR 2) <> '.t' AND A.taiv_cod = T.taiv_cod
            INTO :ARTICULO, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :ivapor
            DO
            BEGIN
            EXECUTE procedure nombres_grupos_inventario (CODGRUPO, CODSUBG, CODMARC)
                returning_values (NOMGRUPO, NOMSUBG, NOMMARC);
            BASE = 0;
            IVA = 0;
            CONSUMO = 0;
            COSTO = 0;
            UTILIDAD = 0;
            PORC = 0;
            SELECT BASE, IVA, CONSUMO, COSTO FROM rep_utilidad WHERE ID = :IDREP AND TIPO = 35 AND CODIGO = :articulo INTO :BASE, :IVA, :consumo,  :costo;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            EXECUTE PROCEDURE PORCENTAJE (utilidad,  TOTAL, 'S') returning_values (part);
            if ((CEROS = 'S') or (BASE <> 0) or (COSTO <> 0)) then
                SUSPEND;
            END /* FOR */
        END
    END
ELSE
  if (DETALLE = 'G') then
    BEGIN
    if (BIN_AND(TIPO, 1) <> 0) then
        BEGIN
        TIPODOC = 31;
        FOR SELECT MAX(a.grup_cod), SUM((FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO)*FACT_FACTOR), SUM(FADE_IVAMONTO*FACT_FACTOR), SUM(FADE_CONSUMO)
            FROM FACTURAS_DETALLE D, FACTURAS F, PREFIJOS P, ARTICULO A
            WHERE F.FACT_ID = D.FACT_ID AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND D.ARTI_COD = A.arti_cod AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            FACT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) and substring(a.arti_cod from 1 FOR 2) <> '.t'
            GROUP BY a.grup_cod
            INTO :codgrupo, :BASE, :IVA, :CONSUMO
            DO
            BEGIN
            COSTO = 0;
            FOR SELECT D.arti_cod, FADE_CANT * FADE_FACTOR, FACT_FECHA, F.fact_id, D.fade_item FROM FACTURAS_DETALLE D, FACTURAS F, PREFIJOS P, ARTICULO A
                WHERE A.arti_cod = D.arti_cod AND F.FACT_ID = D.FACT_ID AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND
                FACT_ANULADO = 'N' AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                and a.grup_cod = :codgrupo INTO :ARTICULO, cantdet, :fecha, :id, :item
                DO
                BEGIN
                if (EXISTS (SELECT COST_SALP / COST_SALC FROM COSTOS C, MOVIMIENTO_ARTICULO M
                    WHERE C.arti_cod = M.arti_cod AND COST_IDMOV = MVAR_CONS AND MVAR_TIPODOC = 31 AND MVAR_IDREF = :ID AND COST_SALC <> 0 AND MVAR_ITEM = :ITEM)) then
                    SELECT COST_SALP / COST_SALC, COST_ULTIMO FROM COSTOS C, MOVIMIENTO_ARTICULO M
                        WHERE C.arti_cod = M.arti_cod AND COST_IDMOV = MVAR_CONS AND MVAR_TIPODOC = 31 AND MVAR_IDREF = :ID AND COST_SALC <> 0 AND MVAR_ITEM = :ITEM INTO :costounit, :ultcos;
                else
                    EXECUTE PROCEDURE costo_promedio_y_ultimo(:ARTICULO, :FECHA) returning_values (:costounit, :ultcos);
                if (costounit IS NULL) then
                    costounit = 0;
                if (ultcos IS NULL) then
                    ultcos = 0;
                /* EL FACTOR */
                FACCOST = 1;
                SELECT FIRST 1 FACO_FACTOR FROM factor_costo WHERE FACO_FECINI <= :FECHA AND FACO_FECFIN >= :FECHA INTO :FACCOST;
                ULTCOS = ULTCOS * FACCOST;
                COSTOUNIT = COSTOUNIT * FACCOST;

                if (ULTIMO = 'S') then
                    COSTO = COSTO + ultcos * cantdet;
                else
                    COSTO = COSTO + costounit * cantdet;
                END
            CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            INSERT INTO REP_UTILIDAD(ID, TIPO, CODIGO, BASE, IVA, CONSUMO, COSTO) VALUES (:IDREP, 31, :codgrupo, :base, :iva, :consumo, :costo);
            if (CEROS = 'S') then
                INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (2, USER, :codgrupo);
            END /* FOR */
        SELECT SUM(BASE-COSTO) FROM REP_UTILIDAD WHERE id = :IDREP AND TIPO = 31 INTO :TOTAL;
        FOR SELECT GRUP_COD, GRUP_NOM FROM GRUPO
            WHERE GRUP_COD >= :GRPINI AND GRUP_COD <= :grpfin
            INTO :ARTICULO, :DESCRIPCION
            DO
            BEGIN
            BASE = 0;
            IVA = 0;
            CONSUMO = 0;
            COSTO = 0;
            UTILIDAD = 0;
            PORC = 0;
            PART = 0;
            SELECT BASE, IVA, CONSUMO, COSTO FROM rep_utilidad WHERE ID = :IDREP AND TIPO = 31 AND CODIGO = :articulo INTO :BASE, :IVA, :consumo,  :costo;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            EXECUTE PROCEDURE PORCENTAJE (utilidad,  TOTAL, 'S') returning_values (part);
            if ((CEROS = 'S') or (BASE <> 0) or (COSTO <> 0)) then
                SUSPEND;
            END /* FOR */
            BEGIN
            COSTO = 0;
            END
        END
    if (BIN_AND(TIPO, 2) <> 0) then
        BEGIN
        TIPODOC = 32;
        FOR SELECT MAX(a.grup_cod), SUM(RVDE_TOTAL-RVDE_IVAMONTO-RVDE_CONSUMO), SUM(RVDE_IVAMONTO), SUM(RVDE_CONSUMO)
            FROM REMISIONES_VENTA_DETALLE D, REMISIONES_VENTA R, PREFIJOS P, ARTICULO A
            WHERE R.REVT_ID = D.REVT_ID AND P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = 32 AND D.ARTI_COD = A.arti_cod AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            REVT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY a.grup_cod
            INTO :codgrupo, :BASE, :IVA, :CONSUMO
            DO
            BEGIN
            COSTO = 0;
            FOR SELECT D.arti_cod, RVDE_CANT * RVDE_FACTOR, REVT_FECHA, F.REVT_ID, RVDE_ITEM FROM remisiones_venta_detalle D, remisiones_venta F, PREFIJOS P, ARTICULO A
                WHERE A.arti_cod = D.arti_cod AND F.revt_id = D.revt_id AND REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN AND
                REVT_ANULADO = 'N' AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 32 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                and a.grup_cod = :codgrupo INTO :ARTICULO, cantdet, :fecha, :ID, :ITEM
                DO
                BEGIN
                if (EXISTS (SELECT COST_SALP / COST_SALC FROM COSTOS C, MOVIMIENTO_ARTICULO M
                    WHERE C.arti_cod = M.arti_cod AND COST_IDMOV = MVAR_CONS AND MVAR_TIPODOC = 32 AND MVAR_IDREF = :ID AND COST_SALC <> 0 AND MVAR_ITEM = :ITEM)) then
                    SELECT COST_SALP / COST_SALC, COST_ULTIMO FROM COSTOS C, MOVIMIENTO_ARTICULO M
                        WHERE C.arti_cod = M.arti_cod AND COST_IDMOV = MVAR_CONS AND MVAR_TIPODOC = 32 AND MVAR_IDREF = :ID AND COST_SALC <> 0 AND MVAR_ITEM = :ITEM INTO :costounit, :ultcos;
                else
                    EXECUTE PROCEDURE costo_promedio_y_ultimo(:ARTICULO, :FECHA) returning_values (:costounit, :ultcos);
                if (costounit IS NULL) then
                    costounit = 0;
                if (ultcos IS NULL) then
                    ultcos = 0;
                /* EL FACTOR */
                FACCOST = 1;
                SELECT FIRST 1 FACO_FACTOR FROM factor_costo WHERE FACO_FECINI <= :FECHA AND FACO_FECFIN >= :FECHA INTO :FACCOST;
                ULTCOS = ULTCOS * FACCOST;
                COSTOUNIT = COSTOUNIT * FACCOST;

                if (ULTIMO = 'S') then
                    COSTO = COSTO + ultcos * cantdet;
                else
                    COSTO = COSTO + costounit * cantdet;
                END
            CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            if (CEROS = 'S') then
                INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (2, USER, :codgrupo);
            INSERT INTO REP_UTILIDAD(ID, TIPO, CODIGO, BASE, IVA, CONSUMO, COSTO) VALUES (:IDREP, 32, :codgrupo, :base, :iva, :consumo, :costo);
            END /* FOR */
        SELECT SUM(BASE-COSTO) FROM REP_UTILIDAD WHERE id = :IDREP AND TIPO = 32 INTO :TOTAL;
        FOR SELECT GRUP_COD, GRUP_NOM FROM GRUPO
            WHERE GRUP_COD >= :GRPINI AND GRUP_COD <= :grpfin
            INTO :ARTICULO, :DESCRIPCION
            DO
            BEGIN
            BASE = 0;
            IVA = 0;
            CONSUMO = 0;
            COSTO = 0;
            UTILIDAD = 0;
            PORC = 0;
            SELECT BASE, IVA, CONSUMO, COSTO FROM rep_utilidad WHERE ID = :IDREP AND TIPO = 32 AND CODIGO = :articulo INTO :BASE, :IVA, :consumo,  :costo;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            EXECUTE PROCEDURE PORCENTAJE (utilidad,  TOTAL, 'S') returning_values (part);
            if ((CEROS = 'S') or (BASE <> 0) or (COSTO <> 0)) then
                SUSPEND;
            END /* FOR */
        END
    if (BIN_AND(TIPO, 4) <> 0) then
        BEGIN
        TIPODOC = 33;
        FOR SELECT MAX(a.grup_cod), SUM((DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO)*DEVT_FACTOR), SUM(DVDE_IVAMONTO*DEVT_FACTOR), SUM(DVDE_CONSUMO)
            FROM devoluciones_ventas_detalle D, DEVOLUCIONES_VENTAS V, PREFIJOS P, ARTICULO A
            WHERE V.DEVT_ID = D.DEVT_ID AND P.PREF_PRE = V.PREF_PRE AND P.TIDO_COD = 33 AND D.ARTI_COD = A.arti_cod AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            DEVT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY a.grup_cod
            INTO :codgrupo, :BASE, :IVA, :CONSUMO
            DO
            BEGIN
            COSTO = 0;
            FOR SELECT D.arti_cod, DVDE_CANT * DVDE_FACTOR, DEVT_FECHA, F.devt_id, D.dvde_item FROM devoluciones_ventas_detalle D, devoluciones_ventas F, PREFIJOS P, ARTICULO A
                WHERE A.arti_cod = D.arti_cod AND F.devt_id = D.devt_id AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND
                DEVT_ANULADO = 'N' AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 33 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                and a.grup_cod = :codgrupo INTO :ARTICULO, cantdet, :fecha, :ID, :ITEM
                DO
                BEGIN
                if (EXISTS (SELECT COST_ENTP / COST_ENTC FROM COSTOS C, MOVIMIENTO_ARTICULO M
                    WHERE C.arti_cod = M.arti_cod AND COST_IDMOV = MVAR_CONS AND MVAR_TIPODOC = 33 AND MVAR_IDREF = :ID AND COST_ENTC <> 0 AND MVAR_ITEM = :ITEM)) then
                    SELECT COST_ENTP / COST_ENTC, COST_ULTIMO FROM COSTOS C, MOVIMIENTO_ARTICULO M
                        WHERE C.arti_cod = M.arti_cod AND COST_IDMOV = MVAR_CONS AND MVAR_TIPODOC = 33 AND MVAR_IDREF = :ID AND COST_ENTC <> 0 AND MVAR_ITEM = :ITEM INTO :costounit, :ultcos;
                else
                    EXECUTE PROCEDURE costo_promedio_y_ultimo(:ARTICULO, :FECHA) returning_values (:costounit, :ultcos);
                if (costounit IS NULL) then
                    costounit = 0;
                if (ultcos IS NULL) then
                    ultcos = 0;
                /* EL FACTOR */
                FACCOST = 1;
                SELECT FIRST 1 FACO_FACTOR FROM factor_costo WHERE FACO_FECINI <= :FECHA AND FACO_FECFIN >= :FECHA INTO :FACCOST;
                ULTCOS = ULTCOS * FACCOST;
                COSTOUNIT = COSTOUNIT * FACCOST;

                if (ULTIMO = 'S') then
                    COSTO = COSTO + ultcos * cantdet;
                else
                    COSTO = COSTO + costounit * cantdet;
                END
            CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            else
                BASE = BASE * -1;
            if (IVA IS NULL) then
                IVA = 0;
            else
                IVA = IVA * -1;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            else
                CONSUMO = CONSUMO * -1;
            COSTO = costo * -1;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            if (CEROS = 'S') then
                INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (2, USER, :codgrupo);
            INSERT INTO REP_UTILIDAD(ID, TIPO, CODIGO, BASE, IVA, CONSUMO, COSTO) VALUES (:IDREP, 33, :codgrupo, :base, :iva, :consumo, :costo);
            END /* FOR */
        SELECT SUM(BASE-COSTO) FROM REP_UTILIDAD WHERE id = :IDREP AND TIPO = 33 INTO :TOTAL;
        FOR SELECT GRUP_COD, GRUP_NOM FROM GRUPO
            WHERE GRUP_COD >= :GRPINI AND GRUP_COD <= :grpfin
            INTO :ARTICULO, :DESCRIPCION
            DO
            BEGIN
            BASE = 0;
            IVA = 0;
            CONSUMO = 0;
            COSTO = 0;
            UTILIDAD = 0;
            PORC = 0;
            SELECT BASE, IVA, CONSUMO, COSTO FROM rep_utilidad WHERE ID = :IDREP AND TIPO = 33 AND CODIGO = :articulo INTO :BASE, :IVA, :consumo,  :costo;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            EXECUTE PROCEDURE PORCENTAJE (utilidad,  TOTAL, 'S') returning_values (part);
            if ((CEROS = 'S') or (BASE <> 0) or (COSTO <> 0)) then
                SUSPEND;
            END /* FOR */
        END
    if (BIN_AND(TIPO, 8) <> 0) then
        BEGIN
        TIPODOC = 34;
        /* BORRA LA TABLA AUXILIAR */
        DELETE FROM reportes_aux WHERE REPA_ID = 2 AND REPA_USER = USER;

        FOR SELECT MAX(a.grup_cod), SUM((PEDE_TOTAL-PEDE_IVAMONTO-PEDE_CONSUMO)*PEDI_FACTOR), SUM(PEDE_IVAMONTO*PEDI_FACTOR), SUM(PEDE_CONSUMO)
            FROM PEDIDOS_DETALLE D, PEDIDOS P, PREFIJOS R, ARTICULO A
            WHERE P.PEDI_ID = D.PEDI_ID AND P.PREF_PRE = R.PREF_PRE AND R.TIDO_COD = 34 AND D.ARTI_COD = A.arti_cod AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            PEDI_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY a.grup_cod
            INTO :codgrupo, :BASE, :IVA, :CONSUMO
            DO
            BEGIN
            COSTO = 0;
            FOR SELECT MAX(D.arti_cod), SUM(PEDE_CANT * PEDE_FACTOR), MAX(pedi_FECHA) FROM pedidos_detalle D, pedidos F, PREFIJOS P, ARTICULO A
                WHERE A.arti_cod = D.arti_cod AND F.pedi_id = D.pedi_id AND PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND
                PEDI_ANULADO = 'N' AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 34 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                and a.grup_cod = :codgrupo GROUP BY D.ARTI_COD, PEDI_FECHA INTO :ARTICULO, cantdet, :fecha
                DO
                BEGIN
                EXECUTE PROCEDURE costo_promedio_y_ultimo(:ARTICULO, :FECHA) returning_values (:costounit, :ultcos);
                /* EL FACTOR */
                FACCOST = 1;
                SELECT FIRST 1 FACO_FACTOR FROM factor_costo WHERE FACO_FECINI <= :FECHA AND FACO_FECFIN >= :FECHA INTO :FACCOST;
                ULTCOS = ULTCOS * FACCOST;
                COSTOUNIT = COSTOUNIT * FACCOST;

                if (ULTIMO = 'S') then
                    COSTO = COSTO + ultcos * cantdet;
                else
                    COSTO = COSTO + costounit * cantdet;
                END
            CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            if (CEROS = 'S') then
                INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (2, USER, :codgrupo);
            INSERT INTO REP_UTILIDAD(ID, TIPO, CODIGO, BASE, IVA, CONSUMO, COSTO) VALUES (:IDREP, 34, :codgrupo, :base, :iva, :consumo, :costo);
            END /* FOR */
        SELECT SUM(BASE-COSTO) FROM REP_UTILIDAD WHERE id = :IDREP AND TIPO = 34 INTO :TOTAL;
        FOR SELECT GRUP_COD, GRUP_NOM FROM GRUPO
            WHERE GRUP_COD >= :GRPINI AND GRUP_COD <= :grpfin
            INTO :ARTICULO, :DESCRIPCION
            DO
            BEGIN
            BASE = 0;
            IVA = 0;
            CONSUMO = 0;
            COSTO = 0;
            UTILIDAD = 0;
            PORC = 0;
            SELECT BASE, IVA, CONSUMO, COSTO FROM rep_utilidad WHERE ID = :IDREP AND TIPO = 34 AND CODIGO = :articulo INTO :BASE, :IVA, :consumo,  :costo;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            EXECUTE PROCEDURE PORCENTAJE (utilidad,  TOTAL, 'S') returning_values (part);
            if ((CEROS = 'S') or (BASE <> 0) or (COSTO <> 0)) then
                SUSPEND;
            END /* FOR */
        END
    if (BIN_AND(TIPO, 16) <> 0) then
        BEGIN
        TIPODOC = 35;
        FOR SELECT MAX(a.grup_cod), SUM((CTDE_TOTAL-CTDE_IVAMONTO-CTDE_CONSUMO)*COTI_FACTOR), SUM(CTDE_IVAMONTO), SUM(CTDE_CONSUMO)
            FROM COTIZACIONES_DETALLE D, COTIZACIONES C, PREFIJOS P, ARTICULO A
            WHERE C.COTI_ID = D.COTI_ID AND P.PREF_PRE = C.PREF_PRE AND P.TIDO_COD = 35 AND D.ARTI_COD = A.arti_cod AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND COTI_FECHA >= :FECINI AND COTI_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            COTI_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY A.grup_cod
            INTO :codgrupo, :BASE, :IVA, :CONSUMO
            DO
            BEGIN
            COSTO = 0;
            FOR SELECT MAX(D.arti_cod), SUM(CTDE_CANT * CTDE_FACTOR), MAX(COTI_FECHA) FROM cotizaciones_detalle D, cotizaciones F, PREFIJOS P, ARTICULO A
                WHERE A.arti_cod = D.arti_cod AND F.coti_id = D.coti_id AND COTI_FECHA >= :FECINI AND COTI_FECHA <= :FECFIN AND
                COTI_ANULADO = 'N' AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 35 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                and a.grup_cod = :codgrupo GROUP BY D.ARTI_COD, COTI_FECHA INTO :ARTICULO, cantdet, :fecha
                DO
                BEGIN
                EXECUTE PROCEDURE costo_promedio_y_ultimo(:ARTICULO, :FECHA) returning_values (:costounit, :ultcos);
                /* EL FACTOR */
                FACCOST = 1;
                SELECT FIRST 1 FACO_FACTOR FROM factor_costo WHERE FACO_FECINI <= :FECHA AND FACO_FECFIN >= :FECHA INTO :FACCOST;
                ULTCOS = ULTCOS * FACCOST;
                COSTOUNIT = COSTOUNIT * FACCOST;

                if (ULTIMO = 'S') then
                    COSTO = COSTO + ultcos * cantdet;
                else
                    COSTO = COSTO + costounit * cantdet;
                END
            CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            if (CEROS = 'S') then
                INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (2, USER, :codgrupo);
            INSERT INTO REP_UTILIDAD(ID, TIPO, CODIGO, BASE, IVA, CONSUMO, COSTO) VALUES (:IDREP, 35, :codgrupo, :base, :iva, :consumo, :costo);
            END /* FOR */
        SELECT SUM(BASE-COSTO) FROM REP_UTILIDAD WHERE id = :IDREP AND TIPO = 35 INTO :TOTAL;
        FOR SELECT GRUP_COD, GRUP_NOM FROM GRUPO
            WHERE GRUP_COD >= :GRPINI AND GRUP_COD <= :grpfin
            INTO :ARTICULO, :DESCRIPCION
            DO
            BEGIN
            BASE = 0;
            IVA = 0;
            CONSUMO = 0;
            COSTO = 0;
            UTILIDAD = 0;
            PORC = 0;
            SELECT BASE, IVA, CONSUMO, COSTO FROM rep_utilidad WHERE ID = :IDREP AND TIPO = 35 AND CODIGO = :articulo INTO :BASE, :IVA, :consumo,  :costo;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            EXECUTE PROCEDURE PORCENTAJE (utilidad,  TOTAL, 'S') returning_values (part);
            if ((CEROS = 'S') or (BASE <> 0) or (COSTO <> 0)) then
                SUSPEND;
            END /* FOR */
        END
    END
  ELSE
    BEGIN
    if (BIN_AND(TIPO, 1) <> 0) then
        BEGIN
        TIPODOC = 31;
        FOR SELECT F.PREF_PRE, FACT_NUMERO, FACT_FECHA, D.ARTI_COD, FADE_CANT * FADE_FACTOR, (FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO)*FACT_FACTOR, FADE_IVAMONTO*FACT_FACTOR, FADE_CONSUMO,
            ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD, F.FACT_ID, FADE_ITEM, TAIV_PORC
            FROM FACTURAS F, FACTURAS_DETALLE D, PREFIJOS P, ARTICULO A, TARIFA_IVA T
            WHERE F.FACT_ID = D.FACT_ID AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND D.ARTI_COD = A.arti_cod AND
                A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
                A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND FACT_FECHA >= :FECINI AND A.taiv_cod = T.taiv_cod AND
                (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
                FACT_FECHA <= :FECFIN AND FACT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) and substring(a.arti_cod from 1 FOR 2) <> '.t'
            ORDER BY D.ARTI_COD, FACT_FECHA, F.FACT_ID, FADE_ITEM
            INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,
                :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :ID, :ITEM, :ivapor
            DO
            BEGIN
            EXECUTE procedure nombres_grupos_inventario (CODGRUPO, CODSUBG, CODMARC)
                returning_values (NOMGRUPO, NOMSUBG, NOMMARC);
            if (EXISTS (SELECT COST_SALP / COST_SALC FROM COSTOS C, MOVIMIENTO_ARTICULO M
                WHERE C.arti_cod = M.arti_cod AND COST_IDMOV = MVAR_CONS AND MVAR_TIPODOC = 31 AND MVAR_IDREF = :ID AND COST_SALC <> 0 AND MVAR_ITEM = :ITEM)) then
                SELECT COST_SALP / COST_SALC, COST_ULTIMO FROM COSTOS C, MOVIMIENTO_ARTICULO M
                    WHERE C.arti_cod = M.arti_cod AND COST_IDMOV = MVAR_CONS AND MVAR_TIPODOC = 31 AND MVAR_IDREF = :ID AND COST_SALC <> 0 AND MVAR_ITEM = :ITEM INTO :costounit, :ultcos;
            else
                EXECUTE PROCEDURE costo_promedio_y_ultimo(:ARTICULO, :FECHA) returning_values (:costounit, :ultcos);
            /* EL FACTOR */
            FACCOST = 1;
            SELECT FIRST 1 FACO_FACTOR FROM factor_costo WHERE FACO_FECINI <= :FECHA AND FACO_FECFIN >= :FECHA INTO :FACCOST;
            ULTCOS = ULTCOS * FACCOST;
            COSTOUNIT = COSTOUNIT * FACCOST;

            if (ULTIMO = 'S') then
                COSTO = ultcos * cantidad;
            else
                COSTO = costounit * cantidad;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            SUSPEND;
            END
        END
    if (BIN_AND(TIPO, 2) <> 0) then
        BEGIN
        TIPODOC = 32;
        FOR SELECT R.PREF_PRE, REVT_NUMERO, REVT_FECHA, D.ARTI_COD, RVDE_CANT * RVDE_FACTOR, RVDE_TOTAL-RVDE_IVAMONTO-RVDE_CONSUMO, RVDE_IVAMONTO, RVDE_CONSUMO,
            ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD, R.REVT_ID, RVDE_ITEM, TAIV_PORC
            FROM REMISIONES_VENTA R, REMISIONES_VENTA_DETALLE D, PREFIJOS P, ARTICULO A, TARIFA_IVA T
            WHERE R.REVT_ID = D.REVT_ID AND P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = 32 AND D.ARTI_COD = A.arti_cod AND
                A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
                A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN AND
                (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
                REVT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) AND A.taiv_cod = T.taiv_cod
            ORDER BY D.ARTI_COD, REVT_FECHA, R.REVT_ID, RVDE_ITEM
            INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,
                :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :ID, :ITEM, :ivapor
            DO
            BEGIN
            EXECUTE procedure nombres_grupos_inventario (CODGRUPO, CODSUBG, CODMARC)
                returning_values (NOMGRUPO, NOMSUBG, NOMMARC);
            if (EXISTS (SELECT COST_SALP / COST_SALC FROM COSTOS C, MOVIMIENTO_ARTICULO M
                WHERE C.arti_cod = M.arti_cod AND COST_IDMOV = MVAR_CONS AND MVAR_TIPODOC = 32 AND MVAR_IDREF = :ID AND COST_SALC <> 0 AND MVAR_ITEM = :ITEM)) then
                SELECT COST_SALP / COST_SALC, COST_ULTIMO FROM COSTOS C, MOVIMIENTO_ARTICULO M
                    WHERE C.arti_cod = M.arti_cod AND COST_IDMOV = MVAR_CONS AND MVAR_TIPODOC = 32 AND MVAR_IDREF = :ID AND COST_SALC <> 0 AND MVAR_ITEM = :ITEM INTO :costounit, :ultcos;
            else
                EXECUTE PROCEDURE costo_promedio_y_ultimo(:ARTICULO, :FECHA) returning_values (:costounit, :ultcos);
            /* EL FACTOR */
            FACCOST = 1;
            SELECT FIRST 1 FACO_FACTOR FROM factor_costo WHERE FACO_FECINI <= :FECHA AND FACO_FECFIN >= :FECHA INTO :FACCOST;
            ULTCOS = ULTCOS * FACCOST;
            COSTOUNIT = COSTOUNIT * FACCOST;

            if (ULTIMO = 'S') then
                COSTO = ultcos * cantidad;
            else
                COSTO = costounit * cantidad;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            SUSPEND;
            END
        END
    if (BIN_AND(TIPO, 4) <> 0) then
        BEGIN
        TIPODOC = 33;
        FOR SELECT V.PREF_PRE, DEVT_NUMERO, DEVT_FECHA, D.ARTI_COD, DVDE_CANT * DVDE_FACTOR, (DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO)*DEVT_FACTOR, DVDE_IVAMONTO*DEVT_FACTOR, DVDE_CONSUMO,
            ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD, V.DEVT_ID, DVDE_ITEM, TAIV_PORC
            FROM DEVOLUCIONES_VENTAS V, DEVOLUCIONES_VENTAS_DETALLE D, PREFIJOS P, ARTICULO A, TARIFA_IVA T
            WHERE V.DEVT_ID = D.DEVT_ID AND P.PREF_PRE = V.PREF_PRE AND P.TIDO_COD = 33 AND D.ARTI_COD = A.arti_cod AND
                A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
                A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND
                (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
                DEVT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) AND A.taiv_cod = T.taiv_cod
            ORDER BY D.ARTI_COD, DEVT_FECHA, V.DEVT_ID, DVDE_ITEM
            INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,
                :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :ID, :ITEM, :ivapor
            DO
            BEGIN
            EXECUTE procedure nombres_grupos_inventario (CODGRUPO, CODSUBG, CODMARC)
                returning_values (NOMGRUPO, NOMSUBG, NOMMARC);
            CANTIDAD = CANTIDAD * -1;
            if (EXISTS (SELECT COST_ENTP / COST_ENTC FROM COSTOS C, MOVIMIENTO_ARTICULO M
                WHERE C.arti_cod = M.arti_cod AND COST_IDMOV = MVAR_CONS AND MVAR_TIPODOC = 33 AND MVAR_IDREF = :ID AND COST_ENTC <> 0 AND MVAR_ITEM = :ITEM)) then
                SELECT COST_ENTP / COST_ENTC, COST_ULTIMO FROM COSTOS C, MOVIMIENTO_ARTICULO M
                    WHERE C.arti_cod = M.arti_cod AND COST_IDMOV = MVAR_CONS AND MVAR_TIPODOC = 33 AND MVAR_IDREF = :ID AND COST_ENTC <> 0 AND MVAR_ITEM = :ITEM INTO :costounit, :ultcos;
            else
                EXECUTE PROCEDURE costo_promedio_y_ultimo(:ARTICULO, :FECHA) returning_values (:costounit, :ultcos);
            /* EL FACTOR */
            FACCOST = 1;
            SELECT FIRST 1 FACO_FACTOR FROM factor_costo WHERE FACO_FECINI <= :FECHA AND FACO_FECFIN >= :FECHA INTO :FACCOST;
            ULTCOS = ULTCOS * FACCOST;
            COSTOUNIT = COSTOUNIT * FACCOST;

            if (ULTIMO = 'S') then
                COSTO = ultcos * cantidad;
            else
                COSTO = costounit * cantidad;
            BASE = BASE * -1;
            IVA = IVA * -1;
            CONSUMO = CONSUMO * -1;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            SUSPEND;
            END
        END
    if (BIN_AND(TIPO, 8) <> 0) then
        BEGIN
        TIPODOC = 34;
        FOR SELECT P.PREF_PRE, PEDI_NUMERO, PEDI_FECHA, D.ARTI_COD, PEDE_CANT * PEDE_FACTOR, (PEDE_TOTAL-PEDE_IVAMONTO-PEDE_CONSUMO)*PEDI_FACTOR, PEDE_IVAMONTO*PEDI_FACTOR, PEDE_CONSUMO,
            ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD, TAIV_PORC 
            FROM PEDIDOS P, PEDIDOS_DETALLE D, PREFIJOS R, ARTICULO A, TARIFA_IVA T
            WHERE P.PEDI_ID = D.PEDI_ID AND P.PREF_PRE = R.PREF_PRE AND R.TIDO_COD = 34 AND D.ARTI_COD = A.arti_cod AND
                A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
                A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND
                (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
                PEDI_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) AND A.taiv_cod = T.taiv_cod
            ORDER BY D.ARTI_COD, PEDI_FECHA, P.PEDI_ID, PEDE_ITEM
            INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,
                :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :ivapor
            DO
            BEGIN
            EXECUTE procedure nombres_grupos_inventario (CODGRUPO, CODSUBG, CODMARC)
                returning_values (NOMGRUPO, NOMSUBG, NOMMARC);
            EXECUTE PROCEDURE costo_promedio_y_ultimo(:ARTICULO, :FECHA) returning_values (:costounit, :ultcos);
            /* EL FACTOR */
            FACCOST = 1;
            SELECT FIRST 1 FACO_FACTOR FROM factor_costo WHERE FACO_FECINI <= :FECHA AND FACO_FECFIN >= :FECHA INTO :FACCOST;
            ULTCOS = ULTCOS * FACCOST;
            COSTOUNIT = COSTOUNIT * FACCOST;

            if (ULTIMO = 'S') then
                COSTO = ultcos * cantidad;
            else
                COSTO = costounit * cantidad;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            SUSPEND;
            END
        END
    if (BIN_AND(TIPO, 16) <> 0) then
        BEGIN
        TIPODOC = 35;
        FOR SELECT C.PREF_PRE, COTI_NUMERO, COTI_FECHA, D.ARTI_COD, CTDE_CANT * CTDE_FACTOR, (CTDE_TOTAL-CTDE_IVAMONTO-CTDE_CONSUMO)*COTI_FACTOR, CTDE_IVAMONTO*COTI_FACTOR, CTDE_CONSUMO,
            ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD, TAIV_PORC
            FROM COTIZACIONES C, COTIZACIONES_DETALLE D, PREFIJOS P, ARTICULO A, TARIFA_IVA T
            WHERE C.COTI_ID = D.COTI_ID AND P.PREF_PRE = C.PREF_PRE AND P.TIDO_COD = 35 AND D.ARTI_COD = A.arti_cod AND
                A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
                A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND COTI_FECHA >= :FECINI AND COTI_FECHA <= :FECFIN AND
                (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
                COTI_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) AND A.taiv_cod = T.taiv_cod
            ORDER BY D.ARTI_COD, COTI_FECHA, C.COTI_ID, CTDE_ITEM
            INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,
                :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :ivapor
            DO
            BEGIN
            EXECUTE procedure nombres_grupos_inventario (CODGRUPO, CODSUBG, CODMARC)
                returning_values (NOMGRUPO, NOMSUBG, NOMMARC);
            EXECUTE PROCEDURE costo_promedio_y_ultimo(:ARTICULO, :FECHA) returning_values (:costounit, :ultcos);
            /* EL FACTOR */
            FACCOST = 1;
            SELECT FIRST 1 FACO_FACTOR FROM factor_costo WHERE FACO_FECINI <= :FECHA AND FACO_FECFIN >= :FECHA INTO :FACCOST;
            ULTCOS = ULTCOS * FACCOST;
            COSTOUNIT = COSTOUNIT * FACCOST;

            if (ULTIMO = 'S') then
                COSTO = ultcos * cantidad;
            else
                COSTO = costounit * cantidad;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            SUSPEND;
            END
        END
    END
END
^

SET TERM ; ^


/* 20100824 */
SET TERM ^ ;

CREATE OR ALTER procedure AUXILIAR_TERCERO_DESDE_HASTA (
    CUENTAINI varchar(20),
    CUENTAFIN varchar(20),
    TERCINI varchar(20),
    TERCFIN varchar(20),
    DESDE char(8),
    HASTA char(8),
    PROYINI varchar(4),
    PROYFIN varchar(4),
    CENTINI varchar(4),
    CENTFIN varchar(4),
    CEROS char(1))
returns (
    ID integer,
    CUENTA varchar(20),
    TIPOCOMP varchar(3),
    PREFIJO varchar(4),
    NUMERO varchar(6),
    FECHA char(8),
    CONCEPTO varchar(60),
    NIT varchar(15),
    DV char(1),
    REF varchar(20),
    BASE numeric(18,2),
    PORC numeric(9,4),
    DEBITO numeric(18,2),
    CREDITO numeric(18,2),
    PROYECTO varchar(4),
    CENTRO varchar(4),
    TIPOREF integer,
    IDREF integer,
    SALDO numeric(18,2),
    NOMCUENTA varchar(60),
    NOMTERCERO varchar(60),
    CUENTANIT varchar(40),
    SALDOFIN numeric(18,2),
    SALDOCTA numeric(18,2),
    SALDOCTAF numeric(18,2))
AS
declare variable NUMROWS INTEGER;
BEGIN
EXECUTE PROCEDURE fecha_desde_conta (:DESDE) returning_values (:DESDE);
for SELECT CUEN_COD, CUEN_NOM
    FROM CUENTAS
    WHERE CUEN_COD >= :CUENTAINI AND CUEN_COD <= :CUENTAFIN
     ORDER BY CUEN_COD
    INTO :CUENTA, :NOMCUENTA
    DO
    BEGIN
    EXECUTE PROCEDURE saldo_cuenta(:CUENTA, :DESDE) RETURNING_VALUES (:SALDOCTA);
    SALDOCTAF = SALDOCTA;
    FOR SELECT distinct TERC_NIT FROM saldos_terceros WHERE CUEN_COD = :CUENTA AND
        TERC_NIT >= :TERCINI AND TERC_NIT <= :TERCFIN ORDER BY TERC_NIT INTO :NIT
        DO
        BEGIN
        FOR SELECT distinct PROY_COD, CENT_COD FROM saldos_centros WHERE CUEN_COD = :CUENTA AND
            PROY_COD >= :proyini AND PROY_COD <= :proyfin AND CENT_COD >= :centini AND CENT_COD <= :centfin ORDER BY PROY_COD, CENT_COD
            INTO :proyecto, :centro
            DO
            BEGIN
            EXECUTE PROCEDURE saldo_centro_tercero(:CUENTA, :proyecto, :centro, :nit, :desde) returning_values (:SALDO);
            SALDOFIN = SALDO;
            CUENTANIT = CUENTA || NIT;
            SELECT TERC_NOM, TERC_DV FROM TERCEROS WHERE TERC_NIT = :nit INTO :NOMTERCERO, :DV;
            NUMROWS = 0;
            /* TRAE LOS MOV. DE LA CUENTA Y TERCERO DADOS */
            FOR SELECT E.ENCO_CONSEC, TICO_COD, PRCO_PREF, ENCO_NUMERO, ENCO_FECHA, D.CUEN_COD, CODE_CONCEPTO, D.TERC_NIT, CODE_REFER, CODE_BASE, CODE_PORC, CODE_DEBITO, CODE_CREDITO, D.PROY_COD, D.CENT_COD, ENCO_TIPOREF, ENCO_IDREF
                FROM COMPROBANTE_ENCABEZADO E, COMPROBANTE_DETALLE D
                WHERE E.ENCO_CONSEC = D.ENCO_CONSEC AND D.CUEN_COD = :CUENTA AND ENCO_FECHA >= :DESDE AND ENCO_FECHA <= :HASTA
                AND D.TERC_NIT = :NIT AND D.PROY_COD = :proyecto AND D.CENT_COD = :centro
                ORDER BY D.CUEN_COD, D.TERC_NIT, ENCO_FECHA, PRCO_PREF, ENCO_NUMERO
                INTO :ID, :TIPOCOMP, :PREFIJO, :NUMERO, :FECHA, :CUENTA, :CONCEPTO, :NIT, :REF, :BASE, :PORC, :DEBITO, :CREDITO, :PROYECTO, :centro, :TIPOREF, :IDREF
                DO
                BEGIN
                SALDOFIN = SALDOFIN + DEBITO - CREDITO;
                SALDOCTAF = SALDOCTAF + DEBITO - CREDITO;
                NUMROWS = NUMROWS + 1;
                SUSPEND;
                END
            if ((CEROS = 'S') AND (NUMROWS = 0)) then
                BEGIN
                SALDOFIN = SALDO;
                if (SALDO <> 0) then
                    BEGIN
                    ID = NULL;
                    TIPOCOMP = NULL;
                    PREFIJO = NULL;
                    NUMERO = NULL;
                    FECHA = NULL;
                    CONCEPTO = NULL;
                    REF = NULL;
                    BASE = 0;
                    PORC = 0;
                    DEBITO = 0;
                    CREDITO = 0;
                    PROYECTO = NULL;
                    CENTRO = NULL;
                    TIPOREF = 0;
                    IDREF = 0;
                    SUSPEND;
                    END
                END
            END
        END
    END
END
^

SET TERM ; ^

/* 20100825 */
/* CHEQUEO SACABA DOS VECES LAS FORMAS DE PAGO CUANDO HAY DEVOLUCIONES A CAJA */

CREATE INDEX DOCUMENTOS_PAGO_CAJA_IDX1
ON DOCUMENTOS_PAGO_CAJA (DPCA_TIPOENT,DPCA_IDENT);

SET TERM ^ ;

CREATE OR ALTER procedure CHEQUEO_SALDOS_CAJAS (
    CAJAINI integer,
    CAJAFIN integer)
AS
declare variable ID INTEGER;
declare variable Fec date;
declare variable Caja integer;
declare variable Conc VARCHAR(60);
declare variable Pref varchar(4);
declare variable Num varchar(6);
declare variable FORMA INTEGER;
declare variable BANCO VARCHAR(2);
declare variable CUENTA VARCHAR(20);
declare variable NUMERO VARCHAR(20);
declare variable FECHA DATE;
declare variable MONTO NUMERIC(18,2);
declare variable Existe INTEGER;
declare variable Dest INTEGER;
declare variable idref INTEGER;
declare variable item integer;
declare variable idd integer;
begin
/* BORRE LOS MOVIMIENTOS CAJA, LOS DOCUMENTOS PAGO CAJA Y SALDO EFECTIVO */
DELETE FROM ANTICIPOS_CLIENTE WHERE RECA_ID = 0;
DELETE FROM ANTICIPOS_PROVEEDOR WHERE EGRE_ID = 0;
UPDATE DOCUMENTOS_PAGO_CAJA SET dpca_idsal = 0 WHERE CAJA_ID >= :cajaini AND CAJA_ID <= :cajafin;
DELETE FROM MOVIMIENTO_CAJA WHERE CAJA_ID >= :cajaini AND CAJA_ID <= :cajafin;
DELETE FROM DOCUMENTOS_PAGO_CAJA WHERE CAJA_ID >= :cajaini AND CAJA_ID <= :cajafin;
DELETE FROM SALDO_EFECTIVO WHERE CAJA_ID >= :cajaini AND CAJA_ID <= :cajafin;
DELETE FROM saldo_caja WHERE CAJA_ID >= :cajaini AND CAJA_ID <= :cajafin;

/* INCORPORE LOS RECIBOS DE CAJA */
FOR SELECT R.RECA_ID, reca_fecha, caja_id, reca_conc, pref_pre, reca_numero, FOPA_ID, RCPA_BANCO, RCPA_CUENTA, RCPA_NUMERO, RCPA_FECHA, RCPA_MONTO
    FROM recibos_caja R, RECIBOS_CAJA_PAGO P where R.reca_id = P.reca_id and reca_anulado = 'N' AND CAJA_ID >= :cajaini AND CAJA_ID <= :cajafin
    ORDER BY CAJA_ID, R.RECA_FECHA, R.RECA_ID, RCPA_ITEM
    INTO :ID, :Fec, :Caja, :Conc, :Pref, :Num, :forma,  :banco, :cuenta, :numero, :fecha, :monto
    DO
    BEGIN
    select COUNT(*) from movimiento_caja where moca_tiporef = 61 and moca_idref = :id into :Existe;
    if (Existe > 0) then
        update movimiento_caja
        set moca_debitos = moca_debitos + :monto
        where moca_tiporef = 61 and moca_idref = :id;
    else
        INSERT INTO MOVIMIENTO_CAJA
            (MOCA_ID, CAJA_ID, MOCA_TIPOREF, MOCA_PREFREF, MOCA_NUMREF, MOCA_FECHA, MOCA_CONC, MOCA_DEBITOS, MOCA_CREDITOS, MOCA_DB, MOCA_IDREF)
            VALUES(GEN_ID(id_movcaja,1), :Caja, 61, :Pref, :Num, :Fec, :Conc, :monto, 0, 'S', :id);
        /* GRABE EL DOCUMENTO DE PAGO EN CAJA */
        if (FORMA <> 1) then
            INSERT INTO DOCUMENTOS_PAGO_CAJA (DPCA_ID, FOPA_ID, CAJA_ID, DPCA_BANCO, DPCA_CUENTA, DPCA_NUMERO, DPCA_FECHA, DPCA_MONTO, DPCA_TIPOENT, DPCA_IDENT, DPCA_TIPOSAL, DPCA_IDSAL)
                VALUES (GEN_ID(ID_DOCPAGOCAJA, 1), :FORMA, :CAJA, :BANCO, :CUENTA, :NUMERO, :FECHA, :MONTO, 61, :ID, 0, 0);
        ELSE
            EXECUTE PROCEDURE SUME_SALDO_EFECTIVO (:CAJA, :FEC, :MONTO, 'N');
    END

/* LOS EGRESOS POR TRASLADO A CAJA */
for SELECT EGRE_ID, CAJA_ID, PREF_PRE, EGRE_NUMERO, EGRE_FECHA, EGRE_CONC, EGRE_MONTO FROM EGRESOS
    WHERE EGRE_TIPO = '2' AND CAJA_ID <> 0 AND egre_id <> 0 AND egre_anulado = 'N' AND CAJA_ID >= :cajaini AND CAJA_ID <= :cajafin
    ORDER BY CAJA_ID, EGRE_FECHA
    INTO :ID, :CAJA, :PREF, :NUM, :FEC, :CONC, :MONTO
    DO
    BEGIN
    SELECT MOCA_IDREF FROM movimiento_caja WHERE MOCA_TIPOREF = 62 AND MOCA_IDREF = :ID INTO :idref;
    if (idref IS NULL) then
     BEGIN
     INSERT INTO MOVIMIENTO_CAJA
        (MOCA_ID, CAJA_ID, MOCA_TIPOREF, MOCA_PREFREF, MOCA_NUMREF, MOCA_FECHA, MOCA_CONC, MOCA_DEBITOS, MOCA_CREDITOS, MOCA_DB, MOCA_IDREF)
        VALUES(GEN_ID(id_movcaja,1), :CAJA, 62, :PREF, :NUM, :FEC, :CONC, :MONTO, 0, 'S', :ID);
      /* GRABE EL DOCUMENTO DE PAGO EN CAJA */
      EXECUTE PROCEDURE SUME_SALDO_EFECTIVO (:caja, :fec, :monto, 'N');
     END
    END
/* LOS CAMBIOS */
FOR SELECT C.CADO_ID, cado_fecha, cado_conc, pref_pre, cado_numero, caja_id, FOPA_ID, CDSA_BANCO, CDSA_CUENTA, CDSA_NUMERO, CDSA_FECHA, CDSA_MONTO
    FROM CAMBIO_DOCUMENTOS C, CAMBIODOC_SALIDAS D where C.CADO_ID = D.CADO_ID and cado_anulado = 'N' AND CAJA_ID >= :cajaini AND CAJA_ID <= :cajafin
    ORDER BY CAJA_ID, C.CADO_FECHA, C.CADO_ID, CDSA_ITEM
    INTO :ID, :Fec, :Conc, :Pref, :Num, :Caja, :forma, :banco, :cuenta, :numero, :fecha, :monto
    DO
    BEGIN
    select COUNT(*) from movimiento_caja where moca_tiporef = 63 and moca_idref = :id and caja_id = :CAJA into :Existe;
    if (Existe > 0) then
        begin
        update movimiento_caja
            set moca_debitos = moca_debitos + :monto
            where moca_tiporef = 63 and moca_idref = :id and caja_id = :CAJA;
        end
    else
        INSERT INTO MOVIMIENTO_CAJA
            (MOCA_ID, CAJA_ID, MOCA_TIPOREF, MOCA_PREFREF, MOCA_NUMREF, MOCA_FECHA, MOCA_CONC, MOCA_DEBITOS, MOCA_CREDITOS, MOCA_DB, MOCA_IDREF)
            VALUES(GEN_ID(ID_MOVCAJA,1), :CAJA, 63, :Pref, :Num, :Fec, :Conc, :monto, 0, 'S', :id);
        
    if (FORMA <> 1) then
        INSERT INTO DOCUMENTOS_PAGO_CAJA (DPCA_ID, FOPA_ID, CAJA_ID, DPCA_BANCO, DPCA_CUENTA, DPCA_NUMERO, DPCA_FECHA, DPCA_MONTO, DPCA_TIPOENT, DPCA_IDENT, DPCA_TIPOSAL, DPCA_IDSAL)
            VALUES (GEN_ID(ID_DOCPAGOCAJA, 1), :FORMA, :CAJA, :BANCO, :CUENTA, :NUMERO, :FECHA, :MONTO, 63, :ID, 0, 0);
    ELSE
        EXECUTE PROCEDURE SUME_SALDO_EFECTIVO(:CAJA, :FEC, :MONTO, 'N');
    END
/* DEVOLUCIONES DE CHEQUES ojo fopa_id = 2 */
FOR SELECT DVCH_ID, dvch_fecha, caja_id, dvch_conc, prba_pref, dvch_numdoc, 2, DVCH_BANCO, DVCH_CUENTA, DVCH_NROCH, DVCH_FECCH, DVCH_MONTO
    FROM DEVOLUCION_CHEQUES where dvch_anulado = 'N' AND dvch_cartera <> 'S' AND CAJA_ID >= :cajaini AND CAJA_ID <= :cajafin
    ORDER BY CAJA_ID, DVCH_FECHA, DVCH_ID
    INTO :ID, :Fec, :Caja, :Conc, :Pref, :Num, :forma,  :banco, :cuenta, :numero, :fecha, :monto
    DO
    BEGIN
    select COUNT(*) from movimiento_caja where moca_tiporef = 77 and moca_idref = :id into :Existe;
    if (Existe > 0) then
        update movimiento_caja
        set moca_debitos = moca_debitos + :monto
        where moca_tiporef = 77 and moca_idref = :id;
    else
        INSERT INTO MOVIMIENTO_CAJA
            (MOCA_ID, CAJA_ID, MOCA_TIPOREF, MOCA_PREFREF, MOCA_NUMREF, MOCA_FECHA, MOCA_CONC, MOCA_DEBITOS, MOCA_CREDITOS, MOCA_DB, MOCA_IDREF)
            VALUES(GEN_ID(id_movcaja,1), :Caja, 77, :Pref, :Num, :Fec, :Conc, :monto, 0, 'S', :id);
        /* GRABE EL DOCUMENTO DE PAGO EN CAJA */
        INSERT INTO DOCUMENTOS_PAGO_CAJA (DPCA_ID, FOPA_ID, CAJA_ID, DPCA_BANCO, DPCA_CUENTA, DPCA_NUMERO, DPCA_FECHA, DPCA_MONTO, DPCA_TIPOENT, DPCA_IDENT, DPCA_TIPOSAL, DPCA_IDSAL)
            VALUES (GEN_ID(ID_DOCPAGOCAJA, 1), 2, :CAJA, :BANCO, :CUENTA, :NUMERO, :FECHA, :MONTO, 77, :ID, 0, 0);
    END

/* TRASLADOS ENTRE CAJAS INGRESOS */
FOR SELECT T.TRCJ_ID, trcj_fecha, caja_id, trcj_destino, trcj_conc, pref_pre, trcj_numero, fopa_id, TRCD_BANCO, TRCD_CUENTA, TRCD_NUMERO, TRCD_FECHA, TRCD_MONTO
    FROM TRASLADOS_CAJA T, TRASLADOS_CAJA_DET D where T.TRCJ_ID = D.TRCJ_ID AND trcj_anulado = 'N' AND TRCJ_DESTINO >= :cajaini AND TRCJ_DESTINO <= :cajafin
    ORDER BY CAJA_ID, TRCJ_FECHA, T.TRCJ_ID, TRCD_ITEM
    INTO :ID, :Fec, :Caja, :Dest, :Conc, :Pref, :Num, :forma,  :banco, :cuenta, :numero, :fecha, :monto
    DO
    BEGIN
    /* INGRESO A LA CAJA DESTINO */
    select COUNT(*) from movimiento_caja where moca_tiporef = 66 and moca_idref = :id and caja_id = :Dest into :Existe;
    if (Existe > 0) then
        begin
        update movimiento_caja
            set moca_debitos = moca_debitos + :monto
            where moca_tiporef = 66 and moca_idref = :id and caja_id = :Dest;
        end
    else
        INSERT INTO MOVIMIENTO_CAJA
            (MOCA_ID, CAJA_ID, MOCA_TIPOREF, MOCA_PREFREF, MOCA_NUMREF, MOCA_FECHA, MOCA_CONC, MOCA_DEBITOS, MOCA_CREDITOS, MOCA_DB, MOCA_IDREF)
            VALUES(GEN_ID(ID_MOVCAJA,1), :Dest, 66, :Pref, :Num, :Fec, :Conc, :monto, 0, 'S', :id);
    /* Ingrese el doc. de pago */
    if (FORMA <> 1) then
        INSERT INTO DOCUMENTOS_PAGO_CAJA (DPCA_ID, FOPA_ID, CAJA_ID, DPCA_BANCO, DPCA_CUENTA, DPCA_NUMERO, DPCA_FECHA, DPCA_MONTO, DPCA_TIPOENT, DPCA_IDENT, DPCA_TIPOSAL, DPCA_IDSAL)
            VALUES (GEN_ID(ID_DOCPAGOCAJA, 1), :FORMA, :Dest, :BANCO, :CUENTA, :NUMERO, :FECHA, :MONTO, 66, :ID, 0, 0);
    else
        EXECUTE PROCEDURE SUME_SALDO_EFECTIVO (:Dest, :Fec, :MONTO, 'N');
    END

/* TRASLADOS ENTRE CAJAS EGRESOS */
FOR SELECT T.TRCJ_ID, trcj_fecha, caja_id, trcj_destino, trcj_conc, pref_pre, trcj_numero, fopa_id, TRCD_BANCO, TRCD_CUENTA, TRCD_NUMERO, TRCD_FECHA, TRCD_MONTO, TRCD_ITEM
    FROM TRASLADOS_CAJA T, TRASLADOS_CAJA_DET D where T.TRCJ_ID = D.TRCJ_ID AND trcj_anulado = 'N' AND CAJA_ID >= :cajaini AND CAJA_ID <= :cajafin
    ORDER BY CAJA_ID, TRCJ_FECHA, T.TRCJ_ID, TRCD_ITEM
    INTO :ID, :Fec, :Caja, :Dest, :Conc, :Pref, :Num, :forma,  :banco, :cuenta, :numero, :fecha, :monto, :item
    DO
    BEGIN
    select COUNT(*) from movimiento_caja where moca_tiporef = 66 and moca_idref = :id and caja_id = :caja into :Existe;
    if (Existe > 0) then
        begin
        update movimiento_caja
            set moca_creditos = moca_creditos + :monto
            where moca_tiporef = 66 and moca_idref = :id and caja_id = :caja;
        end
    else
        INSERT INTO MOVIMIENTO_CAJA
            (MOCA_ID, CAJA_ID, MOCA_TIPOREF, MOCA_PREFREF, MOCA_NUMREF, MOCA_FECHA, MOCA_CONC, MOCA_DEBITOS, MOCA_CREDITOS, MOCA_DB, MOCA_IDREF)
            VALUES(GEN_ID(ID_MOVCAJA,1), :CAJA, 66, :Pref, :Num, :Fec, :Conc, 0, :monto, 'N', :id);
    /* Actualice la salida del documento en la caja origen */
    if (FORMA <> 1) then
        BEGIN
        IDD = 0;
        SELECT FIRST 1 DPCA_ID FROM DOCUMENTOS_PAGO_CAJA WHERE FOPA_ID = :FORMA AND DPCA_BANCO = :BANCO AND DPCA_CUENTA = :CUENTA AND
            DPCA_NUMERO = :NUMERO AND CAJA_ID = :CAJA AND DPCA_TIPOSAL = 0 AND DPCA_IDSAL = 0 AND DPCA_MONTO = :MONTO
            ORDER BY DPCA_TIPOENT, DPCA_IDENT INTO :IDD;
        if (IDD <> 0) then
            UPDATE DOCUMENTOS_PAGO_CAJA
                SET DPCA_TIPOSAL = 66, DPCA_IDSAL = :ID
                WHERE DPCA_ID = :IDD;
        else
            BEGIN
/*            update traslados_caja_det set fopa_id = 1 where TRCJ_ID = :id and TRCD_ITEM = :item;*/
            EXECUTE PROCEDURE RESTE_SALDO_EFECTIVO(:CAJA, :FEC, :MONTO, 'N');
            END
        END
    else
        EXECUTE PROCEDURE RESTE_SALDO_EFECTIVO (:CAJA, :Fec, :MONTO, 'N');
    END

/* INCORPORE LOS EGRESOS DE CAJA */
FOR SELECT E.EGRE_ID, egre_fecha, egre_conc, pref_pre, egre_numero, C.caja_id, FOPA_ID, EGCA_BANCO, EGCA_CUENTA, EGCA_NUMERO, EGCA_FECHA, EGCA_MONTO, EGCA_ITEM
    FROM EGRESOS E, EGRESOS_CAJA C where E.egre_id = C.egre_id and egre_anulado = 'N' AND C.CAJA_ID >= :cajaini AND C.CAJA_ID <= :cajafin
    ORDER BY CAJA_ID, E.EGRE_FECHA, E.EGRE_ID, EGCA_ITEM
    INTO :ID, :Fec, :Conc, :Pref, :Num, :Caja, :forma, :banco, :cuenta, :numero, :fecha, :monto, :item
    DO
    BEGIN
    select COUNT(*) from movimiento_caja where moca_tiporef = 62 and moca_idref = :id and caja_id = :caja into :Existe;
    if (Existe > 0) then
        update movimiento_caja
        set moca_creditos = moca_creditos + :monto
        where moca_tiporef = 62 and moca_idref = :id and caja_id = :caja;
    else
        INSERT INTO MOVIMIENTO_CAJA
            (MOCA_ID, CAJA_ID, MOCA_TIPOREF, MOCA_PREFREF, MOCA_NUMREF, MOCA_FECHA, MOCA_CONC, MOCA_DEBITOS, MOCA_CREDITOS, MOCA_DB, MOCA_IDREF)
            VALUES(GEN_ID(ID_MOVCAJA,1), :caja, 62, :Pref, :Num, :Fec, :Conc, 0, :monto, 'N', :id);
    /* ACTUALICE LA SALIDA DEL DOCUMENTO */
    if (FORMA <> 1) then
        begin
        IDD = 0;
        SELECT FIRST 1 DPCA_ID FROM DOCUMENTOS_PAGO_CAJA WHERE FOPA_ID = :FORMA AND DPCA_BANCO = :BANCO AND DPCA_CUENTA = :CUENTA AND
            DPCA_NUMERO = :NUMERO AND CAJA_ID = :CAJA AND DPCA_TIPOSAL = 0 AND DPCA_IDSAL = 0 AND DPCA_MONTO = :MONTO
            ORDER BY DPCA_TIPOENT, DPCA_IDENT INTO :IDD;
        if (IDD <> 0) then
            UPDATE DOCUMENTOS_PAGO_CAJA
                SET DPCA_TIPOSAL = 62, DPCA_IDSAL = :ID
                WHERE DPCA_ID = :IDD;
        else
            begin
/*            update egresos_caja set fopa_id = 1 where egre_id = :id and EGCA_ITEM = :item;*/
            EXECUTE PROCEDURE RESTE_SALDO_EFECTIVO(:CAJA, :FEC, :MONTO, 'N');
            end
        end
    ELSE
        EXECUTE PROCEDURE RESTE_SALDO_EFECTIVO(:CAJA, :FEC, :MONTO, 'N');
    END

/* INCORPORE LAS CONSIGNACIONES */
FOR SELECT C.CONS_ID, cons_fecha, cons_concepto, prba_pref, cons_numero, caja_id, FOPA_ID, CODE_BANCO, CODE_CUENTA, CODE_NUMERO, CODE_FECHA, CODE_MONTO, CODE_ITEM2
    FROM CONSIGNA C, CONSIGNA_DETALLE D where C.CONS_ID = D.CONS_ID and cons_anulado = 'N' AND CAJA_ID >= :cajaini AND CAJA_ID <= :cajafin
    ORDER BY CAJA_ID, C.CONS_FECHA, C.CONS_ID, CODE_ITEM2
    INTO :ID, :Fec, :Conc, :Pref, :Num, :Caja, :forma, :banco, :cuenta, :numero, :fecha, :monto, :item
    DO
    BEGIN
    select COUNT(*) from movimiento_caja where moca_tiporef = 71 and moca_idref = :id and caja_id = :caja into :Existe;
    if (Existe > 0) then
        update movimiento_caja
            set moca_creditos = moca_creditos + :monto
            where moca_tiporef = 71 and moca_idref = :id and caja_id = :caja;
    else
        INSERT INTO MOVIMIENTO_CAJA
            (MOCA_ID, CAJA_ID, MOCA_TIPOREF, MOCA_PREFREF, MOCA_NUMREF, MOCA_FECHA, MOCA_CONC, MOCA_DEBITOS, MOCA_CREDITOS, MOCA_DB, MOCA_IDREF)
            VALUES(GEN_ID(ID_MOVCAJA,1), :CAJA, 71, :Pref, :Num, :Fec, :Conc, 0, :monto, 'N', :id);
    /* ACTUALICE LA SALIDA DEL DOCUMENTO DE PAGO */
    if (FORMA <> 1) then
        BEGIN
        IDD = 0;
        SELECT FIRST 1 DPCA_ID FROM DOCUMENTOS_PAGO_CAJA WHERE FOPA_ID = :FORMA AND DPCA_BANCO = :BANCO AND DPCA_CUENTA = :CUENTA AND
            DPCA_NUMERO = :NUMERO AND CAJA_ID = :CAJA AND DPCA_TIPOSAL = 0 AND DPCA_IDSAL = 0 AND DPCA_MONTO = :MONTO
            ORDER BY DPCA_TIPOENT, DPCA_IDENT INTO :IDD;
        if (IDD <> 0) then
            UPDATE DOCUMENTOS_PAGO_CAJA
                SET DPCA_TIPOSAL = 71, DPCA_IDSAL = :id
                WHERE DPCA_ID = :IDD;
        ELSE
            BEGIN
/*            update consigna_detalle set fopa_id = 1 where CONS_ID = :id and CODE_ITEM2 = :item;*/
            EXECUTE PROCEDURE RESTE_SALDO_EFECTIVO(:CAJA, :FEC, :MONTO, 'N');
            END
        END
    ELSE
        EXECUTE PROCEDURE RESTE_SALDO_EFECTIVO(:CAJA, :FEC, :MONTO, 'N');
    END

/* CONSIGNACIONES DE TARJETAS */
FOR SELECT C.COTJ_ID, cotj_fecha, cotj_concepto, pref_pre, cotj_numero, caja_id, FOPA_ID, TARJ_COD, CTJD_NROTJ, CTJD_COMPROB, COTJ_FECHA, CTJD_BASE
    FROM CONSIGNA_TARJETAS C, CONSIGNA_TARJETAS_DET D where C.cotj_id = D.cotj_id and cotj_anulado = 'N' AND CAJA_ID >= :cajaini AND CAJA_ID <= :cajafin
    ORDER BY CAJA_ID, C.COTJ_FECHA, C.cotj_id, CTJD_ITEM
    INTO :ID, :Fec, :Conc, :Pref, :Num, :Caja, :forma, :banco, :cuenta, :numero, :fecha, :monto
    DO
    BEGIN
    select COUNT(*) from movimiento_caja where moca_tiporef = 64 and moca_idref = :id into :Existe;
    if (Existe > 0) then
        update movimiento_caja
            set moca_creditos = moca_creditos + :monto
            where moca_tiporef = 64 and moca_idref = :id;
    else
        INSERT INTO MOVIMIENTO_CAJA
            (MOCA_ID, CAJA_ID, MOCA_TIPOREF, MOCA_PREFREF, MOCA_NUMREF, MOCA_FECHA, MOCA_CONC, MOCA_DEBITOS, MOCA_CREDITOS, MOCA_DB, MOCA_IDREF)
            VALUES(GEN_ID(ID_MOVCAJA,1), :Caja, 64, :Pref, :Num, :Fec, :Conc, 0, :monto, 'N', :id);

  /* ACTUALICE LA SALIDA DEL DOCUMENTO DE PAGO */
  IDD = 0;
  SELECT FIRST 1 DPCA_ID FROM DOCUMENTOS_PAGO_CAJA WHERE FOPA_ID = :FORMA AND DPCA_BANCO = :BANCO AND DPCA_CUENTA = :CUENTA AND
    DPCA_NUMERO = :NUMERO AND CAJA_ID = :CAJA AND DPCA_TIPOSAL = 0 AND DPCA_IDSAL = 0 AND DPCA_MONTO = :MONTO
    ORDER BY DPCA_TIPOENT, DPCA_IDENT INTO :IDD;
  if (IDD <> 0) then
      UPDATE DOCUMENTOS_PAGO_CAJA
        SET DPCA_TIPOSAL = 64, DPCA_IDSAL = :id
        WHERE DPCA_ID = :IDD;
  ELSE
    begin
    EXECUTE PROCEDURE RESTE_SALDO_EFECTIVO(:CAJA, :FEC, :MONTO, 'N');
    end
  end

/* INCORPORE LOS CAMBIOS DE DOCUMENTOS */
FOR SELECT C.CADO_ID, cado_fecha, cado_conc, pref_pre, cado_numero, caja_id, FOPA_ID, CDEN_BANCO, CDEN_CUENTA, CDEN_NUMERO, CDEN_FECHA, CDEN_MONTO, CDEN_ITEM
    FROM CAMBIO_DOCUMENTOS C, CAMBIODOC_ENTRADAS D where C.CADO_ID = D.CADO_ID and cado_anulado = 'N' AND CAJA_ID >= :cajaini AND CAJA_ID <= :cajafin
    ORDER BY CAJA_ID, C.CADO_FECHA, C.CADO_ID, CDEN_ITEM
    INTO :ID, :Fec, :Conc, :Pref, :Num, :Caja, :forma, :banco, :cuenta, :numero, :fecha, :monto, :item
    DO
    BEGIN
    select COUNT(*) from movimiento_caja where moca_tiporef = 63 and moca_idref = :id and caja_id = :CAJA into :Existe;
    if (Existe > 0) then
        begin
        update movimiento_caja
            set moca_creditos = moca_creditos + :monto
            where moca_tiporef = 63 and moca_idref = :id and caja_id = :CAJA;
        end
    else
        INSERT INTO MOVIMIENTO_CAJA
            (MOCA_ID, CAJA_ID, MOCA_TIPOREF, MOCA_PREFREF, MOCA_NUMREF, MOCA_FECHA, MOCA_CONC, MOCA_DEBITOS, MOCA_CREDITOS, MOCA_DB, MOCA_IDREF)
            VALUES(GEN_ID(ID_MOVCAJA,1), :CAJA, 63, :Pref, :Num, :Fec, :Conc, 0, :monto, 'N', :id);
        
    /* ACTUALICE LA SALIDA DEL DOCUMENTO */
    if (FORMA <> 1) then
        BEGIN
        IDD = 0;
        SELECT FIRST 1 DPCA_ID FROM DOCUMENTOS_PAGO_CAJA WHERE FOPA_ID = :FORMA AND DPCA_BANCO = :BANCO AND DPCA_CUENTA = :CUENTA AND
            DPCA_NUMERO = :NUMERO AND CAJA_ID = :CAJA AND DPCA_TIPOSAL = 0 AND DPCA_IDSAL = 0 AND DPCA_MONTO = :MONTO
            ORDER BY DPCA_TIPOENT, DPCA_IDENT INTO :IDD;
        if (IDD <> 0) then
            UPDATE DOCUMENTOS_PAGO_CAJA
                SET DPCA_TIPOSAL = 63, DPCA_IDSAL = :id
                WHERE DPCA_ID = :IDD;
        ELSE
            BEGIN
/*            update cambiodoc_entradas set fopa_id = 1 where CADO_ID = :id and CDEN_ITEM = :item;*/
            EXECUTE PROCEDURE RESTE_SALDO_EFECTIVO(:CAJA, :FEC, :MONTO, 'N');
            END
        END
    ELSE
        EXECUTE PROCEDURE RESTE_SALDO_EFECTIVO(:CAJA, :FEC, :MONTO, 'N');
    END
end
^

SET TERM ; ^

/* 20100827 */
/* EL COSTO DEBE SER EL FINAL DEL DIA QUE SE PIDE, ESTABA TRAYENDO EL FINAL DEL DIA SIGUIENTE */
SET TERM ^ ;

CREATE OR ALTER procedure EXISTENCIAS_DESDE_HASTA (
    FECHA date,
    ARTINI varchar(20),
    ARTFIN varchar(20),
    GRPINI varchar(3),
    GRPFIN varchar(3),
    BODINI varchar(2),
    BODFIN varchar(2),
    ORDEN char(1),
    AGRUPA char(1),
    DETALLE char(1),
    RESERVA char(1),
    ENPESO char(1),
    MASIVA char(1),
    SUCURSAL integer)
returns (
    CANT numeric(18,4),
    COSTO numeric(18,2),
    COSTO_LOTE numeric(18,2),
    CODIGO varchar(15),
    NOMBRE varchar(60),
    UNIDAD varchar(8),
    STAND varchar(20),
    CODGRUPO varchar(2),
    NOMGRUPO varchar(30),
    CODSUBG varchar(3),
    NOMSUBG varchar(30),
    CODMARC varchar(3),
    NOMMARC varchar(30),
    CODBOD varchar(2),
    LOTE varchar(15),
    NOMBOD varchar(30),
    COSTOTOT numeric(18,2),
    COSTOIVA numeric(18,2),
    ULTCOSTO numeric(18,2),
    FECHACOSTO date,
    CONSUMO numeric(18,2),
    RESERVADO numeric(18,4),
    ORDENADO numeric(18,4),
    IVA numeric(9,2),
    IVAMONTO numeric(18,2),
    PESOUNIT numeric(18,4),
    PESOTOTAL numeric(18,4),
    PRECIO numeric(18,2),
    CODBAR varchar(20))
AS
declare variable exist char(1);
declare variable codini varchar(20);
declare variable codfin varchar(20);
declare variable desini varchar(20);
declare variable desfin varchar(20);
declare variable ordenc numeric(18,4);
declare variable pedido numeric(18,4);
declare variable ok char(1);
declare variable id integer;
declare variable item integer;
declare variable und varchar(8);
declare variable factor numeric(18,4);
declare variable cant2 numeric(18,4);
declare variable PEDAUTO CHAR(2);
DECLARE VARIABLE LISTA INTEGER;
BEGIN
EXECUTE PROCEDURE lee_configuracion ('FACTURACION','FACTURAS', 'CODIGO DE LA LISTA DE PRECIOS A MOSTRAR EN ARTICULOS') returning_values (:LISTA);
if (ORDEN = 'C') then
    BEGIN
    CODINI = ARTINI;
    CODFIN = ARTFIN;
    DESINI = '';
    DESFIN = 'zz';
    END
ELSE
    BEGIN
    DESINI = ARTINI;
    DESFIN = ARTFIN;
    CODINI = '';
    CODFIN = 'zz';
    END
EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION', 'FACTURAS', 'GENERAR PEDIDO AUTOMATICAMENTE CON LA FACTURA') returning_values (pedauto);
if (DETALLE = 'B') then
  BEGIN
  FOR SELECT ARTI_COD, ARTI_DES, ARTI_UNIDAD, ARTI_EXIST, TAIV_PORC, A.GRUP_COD, A.SUBG_COD, A.MARC_COD, BODE_COD, BODE_NOM, ARTI_CONSUMO, ARTI_PESO/1000
      FROM ARTICULO A, BODEGA B, TARIFA_IVA T
      WHERE ARTI_COD >= :CODINI AND ARTI_COD <= :CODFIN AND ARTI_DES >= :DESINI AND ARTI_DES <= :DESFIN AND ESAR_COD <> 'I' AND BODE_COD >= :BODINI AND
      BODE_COD <= :BODFIN AND ((SUCU_ID = :SUCURSAL) or (:SUCURSAL = 0)) AND A.TAIV_COD = T.TAIV_COD
      INTO :CODIGO, :NOMBRE, :UNIDAD, :EXIST, :IVA, :CODGRUPO, :CODSUBG, :CODMARC, :CODBOD, :NOMBOD, :CONSUMO, :pesounit
      DO
        BEGIN
        STAND = '';
        OK = 'N';
        if (AGRUPA = 'G') then
            BEGIN
            if ((CODGRUPO >= GRPINI) AND (CODGRUPO <= GRPFIN)) then
                OK = 'S';
            end
        ELSE
            if (AGRUPA = 'M') then
                BEGIN
                if ((CODMARC >= GRPINI) AND (CODMARC <= GRPFIN)) then
                    OK = 'S';
                END
        if (OK = 'S') then
            BEGIN
            NOMGRUPO = '';
            NOMMARC = '';
            NOMSUBG = '';
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            CODBAR = NULL;
            SELECT FIRST 1 COBA_COD FROM BARRAS_ARTICULO
                WHERE ARTI_COD = :codigo AND COBA_UNIDAD = :unidad ORDER BY STRLEN(COBA_COD) INTO :codbar;
            if (CODBAR IS NULL) then
                CODBAR = CODIGO;
            if (EXIST <> 'N') then
                BEGIN
                SELECT STAND_COD FROM STANDS WHERE ARTI_COD = :CODIGO AND STAND_BODEGA = :CODBOD INTO :STAND;
                EXECUTE PROCEDURE SALDO_INICIAL_INVENTARIO(CODIGO, FECHA, :CODBOD) returning_values (CANT);
                EXECUTE PROCEDURE costo_promedio_y_ultimo_unidad(CODIGO, FECHA-1, UNIDAD) returning_values (COSTO, ULTCOSTO);
                SELECT FIRST 1 MVAR_FECHA FROM MOVIMIENTO_ARTICULO WHERE ARTI_COD = :CODIGO AND MVAR_ENTRADA = 'S' AND MVAR_FECHA <= :FECHA
                    ORDER BY ARTI_COD DESC, MVAR_FECHA DESC INTO :FECHACOSTO;
                COSTOTOT = :CANT * :COSTO;
                IVAMONTO = COSTOTOT /100 * IVA;
                COSTOIVA = COSTOTOT;
                if (CONSUMO <> 0) then
                    EXECUTE PROCEDURE CONSUMO_HISTORICO (:CODIGO, :fecha) returning_values (:CONSUMO);
                if (MASIVA = 'S') then
                    BEGIN
                    COSTOIVA = COSTOTOT + IVAMONTO;
                    COSTO = COSTO * (100 + :IVA) / 100 + :CONSUMO;
                    END
                CONSUMO = CONSUMO * CANT;
                COSTOIVA = COSTOIVA + CONSUMO;
                if (RESERVA = 'S') then
                    BEGIN
                    SELECT SUM(ORID_ENTREGAR)
                        FROM ORDENINVENTARIO_DETALLE OD, ordenes_inventario O
                        WHERE O.ORIN_ID = OD.ORIN_ID AND ARTI_COD = :CODIGO AND ORIN_FECHA <= :FECHA AND ORIN_FECLLEGA >= :FECHA AND ORID_ANULADO = 'N' AND OD.BODE_COD = :CODBOD
                        INTO :ORDENADO;
                    if (ORDENADO IS NULL) then
                        ORDENADO = 0;
                    ORDENC = 0;
                    FOR SELECT O.ORDC_ID, OCDE_ITEM, OCDE_CANT * OCDE_FACTOR
                        FROM ORDENES_COMPRA O, ORDENES_COMPRA_DETALLE OD
                        WHERE O.ORDC_ID = OD.ORDC_ID AND OD.ARTI_COD = :CODIGO AND ORDC_VENCE >= :FECHA AND ORDC_FECHA <= :FECHA AND OCDE_ANULADO = 'N' AND OD.BODE_COD = :CODBOD
                        INTO :ID, :ITEM, :CANT2
                        do
                        BEGIN
                        EXECUTE PROCEDURE FALTANTE(23, 21, ID, ITEM) returning_values (PEDIDO, UND, FACTOR);
                        if (PEDIDO * FACTOR = CANT2) then /* SI NO SE HA FACTURADO MIRE A VER SI SE REMISIONO */
                            EXECUTE PROCEDURE FALTANTE(23, 22, ID, ITEM) returning_values (PEDIDO, UND, FACTOR);
                        if (PEDIDO IS NULL) then
                            PEDIDO = 0;
                        ORDENC = ORDENC + PEDIDO * FACTOR;
                        END
                    ORDENADO = ORDENADO + ORDENC;
                    SELECT SUM(RSDE_LIBERAR)
                        FROM RESERVAS_DETALLE RD, RESERVAS R
                        WHERE R.RESE_ID = RD.RESE_ID AND ARTI_COD = :CODIGO AND RESE_FECHA <= :FECHA AND RESE_VENCE >= :FECHA AND RD.BODE_COD = :CODBOD AND RSDE_ANULADO = 'N'
                        INTO :RESERVADO;
                    if (RESERVADO IS NULL) then
                        RESERVADO = 0;
                    PEDIDO = 0;
                    FOR SELECT P.PEDI_ID, PEDE_ITEM, PEDE_CANT * PEDE_FACTOR
                        FROM PEDIDOS P, PEDIDOS_DETALLE PD
                        WHERE P.PEDI_ID = PD.PEDI_ID AND PD.ARTI_COD = :CODIGO AND PEDI_VENCE >= :FECHA AND PEDI_FECHA <= :FECHA AND PEDE_ANULADO = 'N' AND BODE_COD = :CODBOD
                        INTO :ID, :ITEM, :CANT2
                        do
                        BEGIN
                        EXECUTE PROCEDURE FALTANTE(34, 31, ID, ITEM) returning_values (ORDENC, UND, FACTOR);
                        if ((ORDENC * FACTOR = CANT2) or (PEDAUTO = 'SI')) then /* SI NO SE HA FACTURADO MIRE A VER SI SE REMISIONO */
                            EXECUTE PROCEDURE FALTANTE(34, 32, ID, ITEM) returning_values (ORDENC, UND, FACTOR);
                        if (ORDENC IS NULL) then
                            ORDENC = 0;
                        PEDIDO = PEDIDO + ORDENC * FACTOR;
                        END
                    RESERVADO = RESERVADO + PEDIDO;
                    END
                ELSE
                    BEGIN
                    RESERVADO = 0;
                    ORDENADO = 0;
                    END
                if (LISTA > 0) then
                    SELECT prar_fijo FROM precios_articulo WHERE arti_cod = :CODIGO and lipr_cod = :LISTA INTO :PRECIO;
                if (ENPESO = 'S') then
                    BEGIN
                    if (pesounit IS NULL) then
                        pesounit = 0;
                    if (PESOUNIT <> 0) then
                        BEGIN
                        pesototal = PESOUNIT * cant;
                        SUSPEND;
                        END
                    END
                ELSE
                    SUSPEND;
                END
            END
        END
  END

if (DETALLE = 'L') then
  BEGIN
  FOR SELECT A.ARTI_COD, ARTI_DES, ARTI_UNIDAD, ARTI_EXIST, TAIV_PORC, A.GRUP_COD, A.SUBG_COD, A.MARC_COD, L.lote_nro, L.lote_nro||' - '||L.lote_vence, ARTI_CONSUMO,l.bode_cod, L.lote_saldo,l.lote_costo, ARTI_PESO/1000
      FROM ARTICULO A, LOTES l, TARIFA_IVA T
      WHERE A.ARTI_COD >= '0' AND A.ARTI_COD <= 'zz' AND ARTI_DES >= '' AND ARTI_DES <= 'zz' AND ESAR_COD <> 'I' AND A.TAIV_COD = T.TAIV_COD and a.arti_cod = l.arti_cod
      AND L.BODE_COD >= :BODINI AND L.BODE_COD <= :BODFIN
      INTO :CODIGO, :NOMBRE, :UNIDAD, :EXIST, :IVA, :CODGRUPO, :CODSUBG, :CODMARC, :LOTE, :NOMBOD, :CONSUMO, :codbod, :cant, :costo_lote, :pesounit
      DO
        BEGIN
        OK = 'N';
        if (AGRUPA = 'G') then
            BEGIN
            if ((CODGRUPO >= GRPINI) AND (CODGRUPO <= GRPFIN)) then
                OK = 'S';
            end
        ELSE
            if (AGRUPA = 'M') then
                BEGIN
                if ((CODMARC >= GRPINI) AND (CODMARC <= GRPFIN)) then
                    OK = 'S';
                END
        if (OK = 'S') then
            BEGIN
            NOMGRUPO = '';
            NOMMARC = '';
            NOMSUBG = '';
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            CODBAR = NULL;
            SELECT MAX(COBA_COD) FROM BARRAS_ARTICULO WHERE ARTI_COD = :codigo AND COBA_UNIDAD = :unidad INTO :codbar;
            if (CODBAR IS NULL) then
                CODBAR = CODIGO;

            if (EXIST <> 'N') then
                BEGIN
                EXECUTE PROCEDURE costo_promedio_y_ultimo_unidad(CODIGO, FECHA-1, UNIDAD) returning_values (COSTO, ULTCOSTO);
                SELECT FIRST 1 MVAR_FECHA FROM MOVIMIENTO_ARTICULO WHERE ARTI_COD = :CODIGO AND MVAR_ENTRADA = 'S' AND MVAR_FECHA <= :FECHA
                    ORDER BY ARTI_COD DESC, MVAR_FECHA DESC INTO :FECHACOSTO;
                COSTOTOT = :CANT * :COSTO;
                IVAMONTO = COSTOTOT /100 * IVA;
                COSTOIVA = COSTOTOT;
                if (CONSUMO <> 0) then
                    EXECUTE PROCEDURE CONSUMO_HISTORICO (:CODIGO, :fecha) returning_values (:CONSUMO);
                if (MASIVA = 'S') then
                    BEGIN
                    COSTOIVA = COSTOTOT + IVAMONTO;
                    COSTO = COSTO * (100 + :IVA) / 100 + :CONSUMO;
                    END
                CONSUMO = CONSUMO * CANT;
                COSTOIVA = COSTOIVA + CONSUMO;
                if (RESERVA = 'S') then
                    BEGIN
                    SELECT SUM(ORID_ENTREGAR)
                        FROM ORDENINVENTARIO_DETALLE OD, ordenes_inventario O
                        WHERE O.ORIN_ID = OD.ORIN_ID AND ARTI_COD = :CODIGO AND ORIN_FECHA <= :FECHA AND ORIN_FECLLEGA >= :FECHA AND ORID_ANULADO = 'N'
                        INTO :ORDENADO;
                    if (ORDENADO IS NULL) then
                        ORDENADO = 0;
                    ORDENC = 0;
                    FOR SELECT O.ORDC_ID, OCDE_ITEM, OCDE_CANT * OCDE_FACTOR
                        FROM ORDENES_COMPRA O, ORDENES_COMPRA_DETALLE OD
                        WHERE O.ORDC_ID = OD.ORDC_ID AND OD.ARTI_COD = :CODIGO AND ORDC_VENCE >= :FECHA AND ORDC_FECHA <= :FECHA AND OCDE_ANULADO = 'N'
                        INTO :ID, :ITEM, :CANT2
                        do
                        BEGIN
                        EXECUTE PROCEDURE FALTANTE(23, 21, ID, ITEM) returning_values (PEDIDO, UND, FACTOR);
                        if (PEDIDO * FACTOR = CANT2) then /* SI NO SE HA FACTURADO MIRE A VER SI SE REMISIONO */
                            EXECUTE PROCEDURE FALTANTE(23, 22, ID, ITEM) returning_values (PEDIDO, UND, FACTOR);
                        if (PEDIDO IS NULL) then
                            PEDIDO = 0;
                        ORDENC = ORDENC + PEDIDO * FACTOR;
                        END
                    ORDENADO = ORDENADO + ORDENC;
                    SELECT SUM(RSDE_LIBERAR)
                        FROM RESERVAS_DETALLE RD, RESERVAS R
                        WHERE R.RESE_ID = RD.RESE_ID AND ARTI_COD = :CODIGO AND RESE_FECHA <= :FECHA AND RESE_VENCE >= :FECHA AND RSDE_ANULADO = 'N'
                        INTO :RESERVADO;
                    if (RESERVADO IS NULL) then
                        RESERVADO = 0;
                    PEDIDO = 0;
                    FOR SELECT P.PEDI_ID, PEDE_ITEM, PEDE_CANT * PEDE_FACTOR
                        FROM PEDIDOS P, PEDIDOS_DETALLE PD
                        WHERE P.PEDI_ID = PD.PEDI_ID AND PD.ARTI_COD = :CODIGO AND PEDI_VENCE >= :FECHA AND PEDI_FECHA <= :FECHA AND PEDE_ANULADO = 'N'
                        INTO :ID, :ITEM, :CANT2
                        do
                        BEGIN
                        EXECUTE PROCEDURE FALTANTE(34, 31, ID, ITEM) returning_values (ORDENC, UND, FACTOR);
                        if ((ORDENC * FACTOR = CANT2) or (PEDAUTO = 'SI')) then /* SI NO SE HA FACTURADO MIRE A VER SI SE REMISIONO */
                            EXECUTE PROCEDURE FALTANTE(34, 32, ID, ITEM) returning_values (ORDENC, UND, FACTOR);
                        if (ORDENC IS NULL) then
                            ORDENC = 0;
                        PEDIDO = PEDIDO + ORDENC * FACTOR;
                        END
                    RESERVADO = RESERVADO + PEDIDO;
                    END
                ELSE
                    BEGIN
                    RESERVADO = 0;
                    ORDENADO = 0;
                    END
                if (LISTA > 0) then
                    SELECT prar_fijo FROM precios_articulo WHERE arti_cod = :CODIGO and lipr_cod = :LISTA INTO :PRECIO;
                if (ENPESO = 'S') then
                    BEGIN
                    if (pesounit IS NULL) then
                        pesounit = 0;
                    if (PESOUNIT <> 0) then
                        BEGIN
                        pesototal = PESOUNIT * cant;
                        SUSPEND;
                        END
                    END
                ELSE
                    SUSPEND;
                END
            END
        END
  end
if (DETALLE = 'N') then
  BEGIN
  FOR SELECT ARTI_COD, ARTI_DES, ARTI_UNIDAD, ARTI_EXIST, TAIV_PORC, A.GRUP_COD, A.SUBG_COD, A.MARC_COD, ARTI_CONSUMO, ARTI_PESO/1000
      FROM ARTICULO A, TARIFA_IVA T
      WHERE ARTI_COD >= :CODINI AND ARTI_COD <= :CODFIN AND ARTI_DES >= :DESINI AND ARTI_DES <= :DESFIN AND ESAR_COD <> 'I' AND A.TAIV_COD = T.TAIV_COD
      INTO :CODIGO, :NOMBRE, :UNIDAD, :EXIST, :IVA, :CODGRUPO, :CODSUBG, :CODMARC, :CONSUMO, :pesounit
      DO
        BEGIN
        OK = 'N';
        if (AGRUPA = 'G') then
            BEGIN
            if ((GRPINI = '0') AND (GRPFIN = 'zz')) then
                OK = 'S';
            else
                if ((CODGRUPO >= GRPINI) AND (CODGRUPO <= GRPFIN)) then
                    OK = 'S';
            end
        ELSE
            if (AGRUPA = 'M') then
                BEGIN
                if ((GRPINI = '0') AND (GRPFIN = 'zzz')) then
                    OK = 'S';
                else
                    if ((CODMARC >= GRPINI) AND (CODMARC <= GRPFIN)) then
                        OK = 'S';
                END
        if (OK = 'S') then
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            CODBAR = NULL;
            SELECT MAX(COBA_COD) FROM BARRAS_ARTICULO WHERE ARTI_COD = :codigo AND COBA_UNIDAD = :unidad INTO :codbar;
            if (CODBAR IS NULL) then
                CODBAR = CODIGO;

            if (EXIST <> 'N') then
                BEGIN
                EXECUTE PROCEDURE SALDO_INICIAL_TOTAL_INV(CODIGO, FECHA) returning_values (CANT);
                EXECUTE PROCEDURE costo_promedio_y_ultimo_unidad(CODIGO, FECHA-1, UNIDAD) returning_values (COSTO, ULTCOSTO);
                SELECT FIRST 1 MVAR_FECHA FROM MOVIMIENTO_ARTICULO WHERE ARTI_COD = :CODIGO AND MVAR_ENTRADA = 'S' AND MVAR_FECHA <= :FECHA
                    ORDER BY ARTI_COD DESC, MVAR_FECHA DESC INTO :FECHACOSTO;
                COSTOTOT = :CANT * :COSTO;
                IVAMONTO = COSTOTOT /100 * IVA;
                COSTOIVA = COSTOTOT;
                if (CONSUMO <> 0) then
                    EXECUTE PROCEDURE CONSUMO_HISTORICO (:CODIGO, :fecha) returning_values (:CONSUMO);
                if (MASIVA = 'S') then
                    BEGIN
                    COSTOIVA = COSTOTOT + IVAMONTO;
                    COSTO = COSTO * (100 + :IVA) / 100 + :CONSUMO;
                    END
                CONSUMO = CONSUMO * CANT;
                COSTOIVA = COSTOIVA + CONSUMO;
                if (RESERVA = 'S') then
                    BEGIN
                    SELECT SUM(ORID_ENTREGAR)
                        FROM ORDENINVENTARIO_DETALLE OD, ordenes_inventario O
                        WHERE O.ORIN_ID = OD.ORIN_ID AND ARTI_COD = :CODIGO AND ORIN_FECHA <= :FECHA AND ORIN_FECLLEGA >= :FECHA AND ORID_ANULADO = 'N'
                        INTO :ORDENADO;
                        if (ORDENADO IS NULL) then
                            ORDENADO = 0;
                    ORDENC = 0;
                    FOR SELECT O.ORDC_ID, OCDE_ITEM, OCDE_CANT * OCDE_FACTOR
                        FROM ORDENES_COMPRA O, ORDENES_COMPRA_DETALLE OD
                        WHERE O.ORDC_ID = OD.ORDC_ID AND OD.ARTI_COD = :CODIGO AND ORDC_VENCE >= :FECHA AND ORDC_FECHA <= :FECHA AND OCDE_ANULADO = 'N'
                        INTO :ID, :ITEM, :CANT2
                        do
                        BEGIN
                        EXECUTE PROCEDURE FALTANTE(23, 21, ID, ITEM) returning_values (PEDIDO, UND, FACTOR);
                        if (PEDIDO * FACTOR = CANT2) then /* SI NO SE HA FACTURADO MIRE A VER SI SE REMISIONO */
                            EXECUTE PROCEDURE FALTANTE(23, 22, ID, ITEM) returning_values (PEDIDO, UND, FACTOR);
                        if (PEDIDO IS NULL) then
                            PEDIDO = 0;
                        ORDENC = ORDENC + PEDIDO * FACTOR;
                        END
                    ORDENADO = ORDENADO + ORDENC;
                    SELECT SUM(RSDE_LIBERAR)
                        FROM RESERVAS_DETALLE RD, RESERVAS R
                        WHERE R.RESE_ID = RD.RESE_ID AND ARTI_COD = :CODIGO AND RESE_FECHA <= :FECHA AND RESE_VENCE >= :FECHA AND RSDE_ANULADO = 'N'
                        INTO :RESERVADO;
                    if (RESERVADO IS NULL) then
                        RESERVADO = 0;
                    PEDIDO = 0;
                    FOR SELECT P.PEDI_ID, PEDE_ITEM, PEDE_CANT * PEDE_FACTOR
                        FROM PEDIDOS P, PEDIDOS_DETALLE PD, PUNTO_VENTA PT
                        WHERE P.PEDI_ID = PD.PEDI_ID AND PD.ARTI_COD = :CODIGO AND PT.ptvt_id = P.PTVT_ID AND PEDI_VENCE >= :FECHA AND PEDI_FECHA <= :FECHA AND PEDE_ANULADO = 'N'
                        INTO :ID, :ITEM, :CANT2
                        do
                        BEGIN
                        EXECUTE PROCEDURE FALTANTE(34, 31, ID, ITEM) returning_values (ORDENC, UND, FACTOR);
                        if ((ORDENC * FACTOR = CANT2) or (PEDAUTO = 'SI')) then /* SI NO SE HA FACTURADO MIRE A VER SI SE REMISIONO */
                            EXECUTE PROCEDURE FALTANTE(34, 32, ID, ITEM) returning_values (ORDENC, UND, FACTOR);
                        if (ORDENC IS NULL) then
                            ORDENC = 0;
                        PEDIDO = PEDIDO + ORDENC * FACTOR;
                        END
                    if (PEDIDO IS NULL) then
                        PEDIDO = 0;
                    RESERVADO = RESERVADO + PEDIDO;
                    END
                ELSE
                    BEGIN
                    RESERVADO = 0;
                    ORDENADO = 0;
                    END
                if (LISTA > 0) then
                    SELECT prar_fijo FROM precios_articulo WHERE arti_cod = :CODIGO and lipr_cod = :LISTA INTO :PRECIO;

                if (ENPESO = 'S') then
                    BEGIN
                    if (pesounit IS NULL) then
                        pesounit = 0;
                    if (PESOUNIT <> 0) then
                        BEGIN
                        pesototal = PESOUNIT * cant;
                        SUSPEND;
                        END
                    END
                ELSE
                    SUSPEND;
                END
            END
        END
  END
END
^

SET TERM ; ^


/* 20100827B */
/* demora por falta llave costos idmov sola */

CREATE INDEX COSTOS_IDX2 ON COSTOS (COST_IDMOV);

SET TERM ^ ;

CREATE OR ALTER procedure UTILIDAD_VENTAS (
    TIPO integer,
    DETALLE char(1),
    FECINI date,
    FECFIN date,
    PREFIJO varchar(4),
    ULTIMO char(1),
    SUBEMPRESA integer)
returns (
    PREF varchar(4),
    NUMERO varchar(6),
    FECHA date,
    PTVTID integer,
    VENDCOD integer,
    NIT varchar(20),
    NOMTERCERO varchar(60),
    ARTICULO varchar(15),
    ARTIDES varchar(60),
    CANT numeric(18,4),
    UNIDAD varchar(8),
    PRECIO numeric(18,2),
    IVAPOR numeric(9,2),
    COSTO numeric(18,2),
    UTILIDAD numeric(18,2),
    PORC numeric(9,2))
AS
declare variable IMPTOS CHAR(1);
declare variable ID INTEGER;
declare variable COSTOT NUMERIC(18,2);
declare variable ULTCOS NUMERIC(18,2);
declare variable PRECIOT NUMERIC(18,2);
declare variable UOM VARCHAR(20);
declare variable icoinc char(2);
declare variable consumo NUMERIC(18,2);
declare variable factor NUMERIC(18,4);
declare variable ITEM INTEGER;
declare variable FACCOST NUMERIC(18,4);
BEGIN
EXECUTE PROCEDURE lee_configuracion ('FACTURACION', 'ARTICULOS', 'SUGERIR PRECIOS CON PORCENTAJE DE MARGEN O UTILIDAD') returning_values (:UOM);
EXECUTE PROCEDURE lee_configuracion ('FACTURACION', 'ARTICULOS', 'IMPOCONSUMO INCLUIDO EN EL PRECIO BASE DE VENTA ANTES DE IVA') returning_values (:icoinc);
/* DETERMINE LA TABLA A EXAMINAR */
if (TIPO = 31) then
    BEGIN
    /* FACTURA */
    FOR SELECT FACT_ID, F.PREF_PRE, FACT_NUMERO, FACT_FECHA, PTVT_ID, VEND_COD, TERC_NIT, FACT_NOMCLIENTE, FACT_IVAINC, fact_factor
        FROM FACTURAS F, PREFIJOS P
        WHERE FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND FACT_ANULADO = 'N'
         AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = :TIPO AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
        ORDER BY FACT_FECHA, F.PREF_PRE, FACT_NUMERO
        INTO :ID, :PREF, :NUMERO, :FECHA, :PTVTID, :VENDCOD, :NIT, :NOMTERCERO, :IMPTOS, :factor
        DO
        if ((PREFIJO = '') or (PREFIJO = PREF)) then
          BEGIN
          COSTOT = 0;
          PRECIOT = 0;
          FOR SELECT FADE_ITEM, D.ARTI_COD, SUBSTR(FADE_DESC,1,60), FADE_CANT * FADE_FACTOR, FADE_UNIDAD, (FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO)*:FACTOR, FADE_IVAPORC, fade_consumo
            FROM FACTURAS_DETALLE D
            WHERE FACT_ID = :ID and substring(D.arti_cod from 1 FOR 2) <> '.t'
            INTO :ITEM, :ARTICULO, :ARTIDES, :CANT, :UNIDAD, :PRECIO, :ivapor, :consumo
            DO
                BEGIN
                if (EXISTS (SELECT COST_SALP / COST_SALC FROM COSTOS C, MOVIMIENTO_ARTICULO M
                    WHERE COST_IDMOV = MVAR_CONS AND MVAR_TIPODOC = 31 AND MVAR_IDREF = :ID AND COST_SALC <> 0 AND MVAR_ITEM = :ITEM)) then
                    SELECT COST_SALP / COST_SALC, COST_ULTIMO FROM COSTOS C, MOVIMIENTO_ARTICULO M
                        WHERE COST_IDMOV = MVAR_CONS AND MVAR_TIPODOC = 31 AND MVAR_IDREF = :ID AND COST_SALC <> 0 AND MVAR_ITEM = :ITEM INTO :costo, :ultcos;
                else
                    EXECUTE PROCEDURE costo_promedio_y_ultimo(:ARTICULO, :FECHA) returning_values (:COSTO, :ultcos);
                /* EL FACTOR */
                FACCOST = 1;
                SELECT FIRST 1 FACO_FACTOR FROM factor_costo WHERE FACO_FECINI <= :FECHA AND FACO_FECFIN >= :FECHA INTO :FACCOST;
                ULTCOS = ULTCOS * FACCOST;
                COSTO = COSTO * FACCOST;

                if (ULTIMO = 'S') then
                    COSTO = ultcos * CANT;
                else
                    COSTO = COSTO * CANT;
                if (DETALLE = 'S') then
                    BEGIN
                    UTILIDAD = PRECIO - COSTO;
                    if (UOM = 'UTILIDAD') then
                        EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                    else
                        EXECUTE PROCEDURE PORCENTAJE (utilidad,  PRECIO, 'S') returning_values (PORC);
                    SUSPEND;
                    END
                ELSE
                    BEGIN
                    COSTOT = COSTOT + COSTO;
                    PRECIOT = PRECIOT + PRECIO;
                    END
                END
          if (DETALLE <> 'S') then
            BEGIN
            COSTO = COSTOT;
            PRECIO = PRECIOT;
            UTILIDAD = PRECIO - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  PRECIO, 'S') returning_values (PORC);
            SUSPEND;
            END
          END
    END
  if (TIPO = 32) then
    BEGIN
    /* REMISION */
    FOR SELECT REVT_ID, R.PREF_PRE, REVT_NUMERO, REVT_FECHA, PTVT_ID, VEND_COD, TERC_NIT, REVT_NOMTERC, REVT_IVAINC
        FROM REMISIONES_VENTA R, PREFIJOS P
        WHERE REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN AND REVT_ANULADO = 'N'
         AND P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = :TIPO AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
        ORDER BY REVT_FECHA, R.PREF_PRE, REVT_NUMERO
        INTO :ID, :PREF, :NUMERO, :FECHA, :PTVTID, :VENDCOD, :NIT, :NOMTERCERO, :IMPTOS
        DO
        if ((PREFIJO = '') or (PREFIJO = PREF)) then
          BEGIN
          COSTOT = 0;
          PRECIOT = 0;
          FOR SELECT RVDE_ITEM, D.ARTI_COD, SUBSTR(RVDE_DESC,1,60), RVDE_CANT * RVDE_FACTOR, RVDE_UNIDAD, (RVDE_TOTAL-RVDE_IVAMONTO-RVDE_CONSUMO), RVDE_IVAPORC, rvde_consumo
            FROM REMISIONES_VENTA_DETALLE D
            WHERE REVT_ID = :ID and substring(D.arti_cod from 1 FOR 2) <> '.t'
            INTO :ITEM, :ARTICULO, :ARTIDES, :CANT, :UNIDAD, :PRECIO, :ivapor, :consumo
            DO
                BEGIN
                if (EXISTS (SELECT COST_SALP / COST_SALC FROM COSTOS C, MOVIMIENTO_ARTICULO M
                    WHERE COST_IDMOV = MVAR_CONS AND MVAR_TIPODOC = 32 AND MVAR_IDREF = :ID AND COST_SALC <> 0 AND MVAR_ITEM = :ITEM)) then
                    SELECT COST_SALP / COST_SALC, COST_ULTIMO FROM COSTOS C, MOVIMIENTO_ARTICULO M
                        WHERE COST_IDMOV = MVAR_CONS AND MVAR_TIPODOC = 32 AND MVAR_IDREF = :ID AND COST_SALC <> 0 AND MVAR_ITEM = :ITEM INTO :costo, :ultcos;
                else
                    EXECUTE PROCEDURE costo_promedio_y_ultimo(:ARTICULO, :FECHA) returning_values (:COSTO, :ultcos);
                /* EL FACTOR */
                FACCOST = 1;
                SELECT FIRST 1 FACO_FACTOR FROM factor_costo WHERE FACO_FECINI <= :FECHA AND FACO_FECFIN >= :FECHA INTO :FACCOST;
                ULTCOS = ULTCOS * FACCOST;
                COSTO = COSTO * FACCOST;

                if (ULTIMO = 'S') then
                    COSTO = ultcos * CANT;
                else
                    COSTO = COSTO * CANT;
                if (DETALLE = 'S') then
                    BEGIN
                    UTILIDAD = PRECIO - COSTO;
                    if (UOM = 'UTILIDAD') then
                        EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                    else
                        EXECUTE PROCEDURE PORCENTAJE (utilidad,  PRECIO, 'S') returning_values (PORC);
                    SUSPEND;
                    END
                ELSE
                    BEGIN
                    COSTOT = COSTOT + COSTO;
                    PRECIOT = PRECIOT + PRECIO;
                    END
                END
          if (DETALLE <> 'S') then
            BEGIN
            COSTO = COSTOT;
            PRECIO = PRECIOT;
            UTILIDAD = PRECIO - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  PRECIO, 'S') returning_values (PORC);
            SUSPEND;
            END
          END
    END
  if (TIPO = 33) then
    BEGIN
    /* DEVOLUCION */
    FOR SELECT DEVT_ID, D.PREF_PRE, DEVT_NUMERO, DEVT_FECHA, PTVT_ID, VEND_COD, TERC_NIT, DEVT_NOMTERC, DEVT_IVAINC, DEVT_FACTOR
        FROM DEVOLUCIONES_VENTAS D, PREFIJOS P
        WHERE DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND DEVT_ANULADO = 'N'
         AND P.PREF_PRE = D.PREF_PRE AND P.TIDO_COD = :TIPO AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
        ORDER BY DEVT_FECHA, D.PREF_PRE, DEVT_NUMERO
        INTO :ID, :PREF, :NUMERO, :FECHA, :PTVTID, :VENDCOD, :NIT, :NOMTERCERO, :IMPTOS, :FACTOR
        DO
        if ((PREFIJO = '') or (PREFIJO = PREF)) then
          BEGIN
          COSTOT = 0;
          PRECIOT = 0;
          FOR SELECT DVDE_ITEM, D.ARTI_COD, SUBSTR(DVDE_DESC,1,60), DVDE_CANT * DVDE_FACTOR, DVDE_UNIDAD, (DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO)*:FACTOR, DVDE_IVAPORC, dvde_consumo
            FROM DEVOLUCIONES_VENTAS_DETALLE D
            WHERE DEVT_ID = :ID and substring(D.arti_cod from 1 FOR 2) <> '.t'
            INTO :ITEM, :ARTICULO, :ARTIDES, :CANT, :UNIDAD, :PRECIO, :ivapor, :consumo
            DO
                BEGIN
                if (EXISTS (SELECT COST_ENTP / COST_ENTC FROM COSTOS C, MOVIMIENTO_ARTICULO M
                    WHERE COST_IDMOV = MVAR_CONS AND MVAR_TIPODOC = 33 AND MVAR_IDREF = :ID AND COST_ENTC <> 0 AND MVAR_ITEM = :ITEM)) then
                    SELECT COST_ENTP / COST_ENTC FROM COSTOS C, MOVIMIENTO_ARTICULO M
                        WHERE COST_IDMOV = MVAR_CONS AND MVAR_TIPODOC = 33 AND MVAR_IDREF = :ID AND COST_ENTC <> 0 AND MVAR_ITEM = :ITEM INTO :costo;
                else
                    EXECUTE PROCEDURE costo_promedio_y_ultimo(:ARTICULO, :FECHA) returning_values (:COSTO, :ultcos);
                /* EL FACTOR */
                FACCOST = 1;
                SELECT FIRST 1 FACO_FACTOR FROM factor_costo WHERE FACO_FECINI <= :FECHA AND FACO_FECFIN >= :FECHA INTO :FACCOST;
                ULTCOS = ULTCOS * FACCOST;
                COSTO = COSTO * FACCOST;

                if (ULTIMO = 'S') then
                    COSTO = ultcos * CANT;
                else
                    COSTO = COSTO * CANT;
                if (DETALLE = 'S') then
                    BEGIN
                    UTILIDAD = PRECIO - COSTO;
                    if (UOM = 'UTILIDAD') then
                        EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                    else
                        EXECUTE PROCEDURE PORCENTAJE (utilidad,  PRECIO, 'S') returning_values (PORC);
                    SUSPEND;
                    END
                ELSE
                    BEGIN
                    COSTOT = COSTOT + COSTO;
                    PRECIOT = PRECIOT + PRECIO;
                    END
                END
        if (DETALLE <> 'S') then
            BEGIN
            COSTO = COSTOT;
            PRECIO = PRECIOT;
            UTILIDAD = PRECIO - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  PRECIO, 'S') returning_values (PORC);
            SUSPEND;
            END
        END
    END
  if (TIPO = 34) then
    BEGIN
    /* PEDIDO */
    FOR SELECT PEDI_ID, P.PREF_PRE, PEDI_NUMERO, PEDI_FECHA, PTVT_ID, VEND_COD, TERC_NIT, PEDI_NOMTERC, PEDI_IVAINC, PEDI_FACTOR
        FROM PEDIDOS P, PREFIJOS R
        WHERE PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND PEDI_ANULADO = 'N'
         AND P.PREF_PRE = R.PREF_PRE AND R.TIDO_COD = :TIPO AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
        ORDER BY PEDI_FECHA, P.PREF_PRE, PEDI_NUMERO
        INTO :ID, :PREF, :NUMERO, :FECHA, :PTVTID, :VENDCOD, :NIT, :NOMTERCERO, :IMPTOS, :FACTOR
        DO
        if ((PREFIJO = '') or (PREFIJO = PREF)) then
          BEGIN
          COSTOT = 0;
          PRECIOT = 0;
          FOR SELECT ARTI_COD, SUBSTR(PEDE_DESC,1,60), PEDE_CANT * PEDE_FACTOR, PEDE_UNIDAD, (PEDE_TOTAL-PEDE_IVAMONTO-PEDE_CONSUMO)*:FACTOR, PEDE_IVAPORC, pede_consumo
            FROM PEDIDOS_DETALLE
            WHERE PEDI_ID = :ID
            INTO :ARTICULO, :ARTIDES, :CANT, :UNIDAD, :PRECIO, :ivapor, :consumo
            DO
                BEGIN
                EXECUTE PROCEDURE costo_promedio_y_ultimo(:ARTICULO, :FECHA) returning_values (:COSTO, :ultcos);
                /* EL FACTOR */
                FACCOST = 1;
                SELECT FIRST 1 FACO_FACTOR FROM factor_costo WHERE FACO_FECINI <= :FECHA AND FACO_FECFIN >= :FECHA INTO :FACCOST;
                ULTCOS = ULTCOS * FACCOST;
                COSTO = COSTO * FACCOST;

                if (ULTIMO = 'S') then
                    COSTO = ultcos * CANT;
                else
                    COSTO = COSTO * CANT;
                if (DETALLE = 'S') then
                    BEGIN
                    UTILIDAD = PRECIO - COSTO;
                    if (UOM = 'UTILIDAD') then
                        EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                    else
                        EXECUTE PROCEDURE PORCENTAJE (utilidad,  PRECIO, 'S') returning_values (PORC);
                    SUSPEND;
                    END
                ELSE
                    BEGIN
                    COSTOT = COSTOT + COSTO;
                    PRECIOT = PRECIOT + PRECIO;
                    END
                END
        if (DETALLE <> 'S') then
            BEGIN
            COSTO = COSTOT;
            PRECIO = PRECIOT;
            UTILIDAD = PRECIO - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  PRECIO, 'S') returning_values (PORC);
            SUSPEND;
            END
        END
    END
  if (TIPO = 35) then
    BEGIN
    /* COTIZACION */
    FOR SELECT COTI_ID, C.PREF_PRE, COTI_NUMERO, COTI_FECHA, PTVT_ID, VEND_COD, TERC_NIT, COTI_NOMTERC, COTI_IMPTOS, COTI_FACTOR
        FROM COTIZACIONES C, PREFIJOS P
        WHERE COTI_FECHA >= :FECINI AND COTI_FECHA <= :FECFIN AND COTI_ANULADO = 'N'
         AND P.PREF_PRE = C.PREF_PRE AND P.TIDO_COD = :TIPO AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
        ORDER BY COTI_FECHA, C.PREF_PRE, COTI_NUMERO
        INTO :ID, :PREF, :NUMERO, :FECHA, :PTVTID, :VENDCOD, :NIT, :NOMTERCERO, :IMPTOS, :FACTOR
        DO
        if ((PREFIJO = '') or (PREFIJO = PREF)) then
          BEGIN
          COSTOT = 0;
          PRECIOT = 0;
          FOR SELECT ARTI_COD, SUBSTR(CTDE_DESC,1,60), CTDE_CANT * CTDE_FACTOR, CTDE_UNIDAD, (CTDE_TOTAL-CTDE_IVAMONTO-CTDE_CONSUMO)*:FACTOR, CTDE_IVAPORC, ctde_consumo
            FROM COTIZACIONES_DETALLE
            WHERE COTI_ID = :ID
            INTO :ARTICULO, :ARTIDES, :CANT, :UNIDAD, :PRECIO, :ivapor, :consumo
            DO
                BEGIN
                EXECUTE PROCEDURE costo_promedio_y_ultimo(:ARTICULO, :FECHA) returning_values (:COSTO, :ultcos);
                /* EL FACTOR */
                FACCOST = 1;
                SELECT FIRST 1 FACO_FACTOR FROM factor_costo WHERE FACO_FECINI <= :FECHA AND FACO_FECFIN >= :FECHA INTO :FACCOST;
                ULTCOS = ULTCOS * FACCOST;
                COSTO = COSTO * FACCOST;

                if (ULTIMO = 'S') then
                    COSTO = ultcos * CANT;
                else
                    COSTO = COSTO * CANT;
                if (DETALLE = 'S') then
                    BEGIN
                    UTILIDAD = PRECIO - COSTO;
                    if (UOM = 'UTILIDAD') then
                        EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                    else
                        EXECUTE PROCEDURE PORCENTAJE (utilidad,  PRECIO, 'S') returning_values (PORC);
                    SUSPEND;
                    END
                ELSE
                    BEGIN
                    COSTOT = COSTOT + COSTO;
                    PRECIOT = PRECIOT + PRECIO;
                    END
                END
        if (DETALLE <> 'S') then
            BEGIN
            COSTO = COSTOT;
            PRECIO = PRECIOT;
            UTILIDAD = PRECIO - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  PRECIO, 'S') returning_values (PORC);
            SUSPEND;
            END
        END
    END
END
^

SET TERM ; ^


SET TERM ^ ;

CREATE OR ALTER procedure REP_UTILIDAD_VENTAS (
    TIPO integer,
    DETALLE char(1),
    FECINI date,
    FECFIN date,
    ARTINI varchar(15),
    ARTFIN varchar(15),
    GRPINI varchar(3),
    GRPFIN varchar(3),
    ORDEN char(1),
    AGRUPA char(1),
    ULTIMO char(1),
    CEROS char(1),
    SUBEMPRESA integer)
returns (
    ARTICULO varchar(15),
    DESCRIPCION varchar(60),
    CODGRUPO varchar(2),
    NOMGRUPO varchar(30),
    CODSUBG varchar(3),
    NOMSUBG varchar(30),
    CODMARC varchar(3),
    NOMMARC varchar(30),
    UNIDAD varchar(8),
    CANTIDAD numeric(18,4),
    BASE numeric(18,4),
    COSTO numeric(18,4),
    UTILIDAD numeric(18,4),
    PORC numeric(9,2),
    IVA numeric(18,4),
    IVAPOR numeric(9,2),
    CONSUMO numeric(18,4),
    PREFIJO varchar(4),
    NUMERO varchar(6),
    FECHA date,
    TIPODOC integer,
    PART float)
AS
DECLARE VARIABLE COSTOUNIT NUMERIC(18,4);
DECLARE VARIABLE CANTDET NUMERIC(18,4);
DECLARE VARIABLE TOTAL NUMERIC(18,2);
declare variable CODINI VARCHAR(15);
declare variable CODFIN VARCHAR(15);
declare variable DESINI VARCHAR(15);
declare variable DESFIN VARCHAR(15);
declare variable MARINI VARCHAR(3);
declare variable MARFIN VARCHAR(3);
declare variable UOM VARCHAR(20);
declare variable ULTCOS NUMERIC(18,2);
declare variable FACCOST NUMERIC(18,4);
declare variable IDREP INTEGER;
declare variable ID integer;
declare variable ITEM integer;
BEGIN
if (ORDEN = 'C') then
    BEGIN
    CODINI = ARTINI;
    CODFIN = ARTFIN;
    DESINI = '';
    DESFIN = 'zz';
    END
ELSE
    BEGIN
    DESINI = ARTINI;
    DESFIN = ARTFIN;
    CODINI = '';
    CODFIN = 'zz';
    END
if (AGRUPA = 'G') then
    BEGIN
    MARINI = '';
    MARFIN = 'zz';
    END
ELSE
    if (AGRUPA = 'M') then
        BEGIN
        MARINI = GRPINI;
        MARFIN = GRPFIN;
        GRPINI = '';
        GRPFIN = 'zz';
        END
    ELSE
        BEGIN
        MARINI = '';
        MARFIN = 'zz';
        GRPINI = '';
        GRPFIN = 'zz';
        END
EXECUTE PROCEDURE lee_configuracion ('FACTURACION', 'ARTICULOS', 'SUGERIR PRECIOS CON PORCENTAJE DE MARGEN O UTILIDAD') returning_values (:UOM);
IDREP = GEN_ID(id_reputilidad, 1);
if (DETALLE = 'N') then
    BEGIN
    if (BIN_AND(TIPO, 1) <> 0) then
        BEGIN
        TIPODOC = 31;
        FOR SELECT MAX(D.ARTI_COD), SUM(FADE_CANT * FADE_FACTOR), SUM((FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO)*FACT_FACTOR), SUM(FADE_IVAMONTO*FACT_FACTOR), SUM(FADE_CONSUMO)
            FROM FACTURAS_DETALLE D, FACTURAS F, PREFIJOS P, ARTICULO A
            WHERE F.FACT_ID = D.FACT_ID AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND D.ARTI_COD = A.arti_cod AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            FACT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) and substring(a.arti_cod from 1 FOR 2) <> '.t'
            GROUP BY D.ARTI_COD
            INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO
            DO
            BEGIN
            COSTO = 0;
            FOR SELECT FADE_CANT * FADE_FACTOR, FACT_FECHA, F.FACT_ID, FADE_ITEM FROM FACTURAS_DETALLE D, FACTURAS F, PREFIJOS P
                WHERE F.FACT_ID = D.FACT_ID AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND
                FACT_ANULADO = 'N' AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                and D.ARTI_COD = :articulo  INTO :cantdet, :fecha, :id, :item
                DO
                BEGIN
                if (EXISTS (SELECT COST_SALP / COST_SALC FROM COSTOS C, MOVIMIENTO_ARTICULO M
                    WHERE COST_IDMOV = MVAR_CONS AND MVAR_TIPODOC = 31 AND MVAR_IDREF = :ID AND COST_SALC <> 0 AND MVAR_ITEM = :ITEM)) then
                    SELECT COST_SALP / COST_SALC, COST_ULTIMO FROM COSTOS C, MOVIMIENTO_ARTICULO M
                    WHERE COST_IDMOV = MVAR_CONS AND MVAR_TIPODOC = 31 AND MVAR_IDREF = :ID AND COST_SALC <> 0 AND MVAR_ITEM = :ITEM INTO :costounit, :ultcos;
                else
                    EXECUTE PROCEDURE costo_promedio_y_ultimo(:ARTICULO, :FECHA) returning_values (:costounit, :ultcos);
                if (costounit IS NULL) then
                    costounit = 0;
                if (ultcos IS NULL) then
                    ultcos = 0;

                /* EL FACTOR */
                FACCOST = 1;
                SELECT FIRST 1 FACO_FACTOR FROM factor_costo WHERE FACO_FECINI <= :FECHA AND FACO_FECFIN >= :FECHA INTO :FACCOST;
                ULTCOS = ULTCOS * FACCOST;
                COSTOUNIT = COSTOUNIT * FACCOST;

                if (ULTIMO = 'S') then
                    COSTO = COSTO + ultcos * cantdet;
                else
                    COSTO = COSTO + costounit * cantdet;
                END
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            INSERT INTO REP_UTILIDAD(ID, TIPO, CODIGO, BASE, IVA, CONSUMO, COSTO) VALUES (:IDREP, 31, :articulo, :base, :iva, :consumo, :costo);
            if (CEROS = 'S') then
                INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (2, USER, :ARTICULO);
            END /* FOR */
        SELECT SUM(BASE-COSTO) FROM REP_UTILIDAD WHERE id = :IDREP AND TIPO = 31 INTO :TOTAL;
        FOR SELECT ARTI_COD, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD, TAIV_PORC FROM ARTICULO A, TARIFA_IVA T
            WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND
            (A.MARC_COD <= :MARFIN))) AND substring(a.arti_cod from 1 FOR 2) <> '.t' AND A.taiv_cod = T.taiv_cod
            INTO :ARTICULO, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :ivapor
            DO
            BEGIN
            EXECUTE procedure nombres_grupos_inventario (CODGRUPO, CODSUBG, CODMARC)
                returning_values (NOMGRUPO, NOMSUBG, NOMMARC);
            BASE = 0;
            IVA = 0;
            CONSUMO = 0;
            COSTO = 0;
            UTILIDAD = 0;
            PORC = 0;
            PART = 0;
            SELECT BASE, IVA, CONSUMO, COSTO FROM rep_utilidad WHERE ID = :IDREP AND TIPO = 31 AND CODIGO = :articulo INTO :BASE, :IVA, :consumo,  :costo;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            EXECUTE PROCEDURE PORCENTAJE (utilidad,  TOTAL, 'S') returning_values (part);
            if ((CEROS = 'S') or (BASE <> 0) or (COSTO <> 0)) then
                SUSPEND;
            END /* FOR */
            BEGIN
            COSTO = 0;
            END
        END
    if (BIN_AND(TIPO, 2) <> 0) then
        BEGIN
        TIPODOC = 32;
        FOR SELECT MAX(D.ARTI_COD), SUM(RVDE_CANT * RVDE_FACTOR), SUM(RVDE_TOTAL-RVDE_IVAMONTO-RVDE_CONSUMO), SUM(RVDE_IVAMONTO), SUM(RVDE_CONSUMO)
            FROM REMISIONES_VENTA_DETALLE D, REMISIONES_VENTA R, PREFIJOS P, ARTICULO A
            WHERE R.REVT_ID = D.REVT_ID AND P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = 32 AND D.ARTI_COD = A.arti_cod AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            REVT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY D.ARTI_COD
            INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO
            DO
            BEGIN
            COSTO = 0;
            FOR SELECT RVDE_CANT * RVDE_FACTOR, REVT_FECHA, F.REVT_ID, RVDE_ITEM FROM remisiones_venta_detalle D, remisiones_venta F, PREFIJOS P
                WHERE F.revt_id = D.revt_id AND REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN AND
                REVT_ANULADO = 'N' AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 32 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                and D.ARTI_COD = :articulo  INTO :cantdet, :fecha, :id, :item
                DO
                BEGIN
                if (EXISTS (SELECT COST_SALP / COST_SALC FROM COSTOS C, MOVIMIENTO_ARTICULO M
                    WHERE COST_IDMOV = MVAR_CONS AND MVAR_TIPODOC = 32 AND MVAR_IDREF = :ID AND COST_SALC <> 0 AND MVAR_ITEM = :ITEM)) then
                    SELECT COST_SALP / COST_SALC, cost_ultimo FROM COSTOS C, MOVIMIENTO_ARTICULO M
                    WHERE COST_IDMOV = MVAR_CONS AND MVAR_TIPODOC = 32 AND MVAR_IDREF = :ID AND COST_SALC <> 0 AND MVAR_ITEM = :ITEM INTO :costounit, :ultcos;
                else
                    EXECUTE PROCEDURE costo_promedio_y_ultimo(:ARTICULO, :FECHA) returning_values (:costounit, :ultcos);
                if (costounit IS NULL) then
                    costounit = 0;
                if (ultcos IS NULL) then
                    ultcos = 0;
                /* EL FACTOR */
                FACCOST = 1;
                SELECT FIRST 1 FACO_FACTOR FROM factor_costo WHERE FACO_FECINI <= :FECHA AND FACO_FECFIN >= :FECHA INTO :FACCOST;
                ULTCOS = ULTCOS * FACCOST;
                COSTOUNIT = COSTOUNIT * FACCOST;

                if (ULTIMO = 'S') then
                    COSTO = COSTO + ultcos * cantdet;
                else
                    COSTO = COSTO + costounit * cantdet;
                END
            EXECUTE procedure nombres_grupos_inventario (CODGRUPO, CODSUBG, CODMARC)
                returning_values (NOMGRUPO, NOMSUBG, NOMMARC);
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            if (CEROS = 'S') then
                INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (2, USER, :ARTICULO);
            INSERT INTO REP_UTILIDAD(ID, TIPO, CODIGO, BASE, IVA, CONSUMO, COSTO) VALUES (:IDREP, 32, :articulo, :base, :iva, :consumo, :costo);
            END /* FOR */
        SELECT SUM(BASE-COSTO) FROM REP_UTILIDAD WHERE id = :IDREP AND TIPO = 32 INTO :TOTAL;
        FOR SELECT ARTI_COD, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD, TAIV_PORC FROM ARTICULO A, TARIFA_IVA T
            WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND
            (A.MARC_COD <= :MARFIN))) AND substring(a.arti_cod from 1 FOR 2) <> '.t' AND A.taiv_cod = T.taiv_cod
            INTO :ARTICULO, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :ivapor
            DO
            BEGIN
            EXECUTE procedure nombres_grupos_inventario (CODGRUPO, CODSUBG, CODMARC)
                returning_values (NOMGRUPO, NOMSUBG, NOMMARC);
            BASE = 0;
            IVA = 0;
            CONSUMO = 0;
            COSTO = 0;
            UTILIDAD = 0;
            PORC = 0;
            SELECT BASE, IVA, CONSUMO, COSTO FROM rep_utilidad WHERE ID = :IDREP AND TIPO = 32 AND CODIGO = :articulo INTO :BASE, :IVA, :consumo,  :costo;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            EXECUTE PROCEDURE PORCENTAJE (utilidad,  TOTAL, 'S') returning_values (part);
            if ((CEROS = 'S') or (BASE <> 0) or (COSTO <> 0)) then
                SUSPEND;
            END /* FOR */
        END
    if (BIN_AND(TIPO, 4) <> 0) then
        BEGIN
        TIPODOC = 33;
        FOR SELECT MAX(D.ARTI_COD), SUM(DVDE_CANT * DVDE_FACTOR), SUM((DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO)*DEVT_FACTOR), SUM(DVDE_IVAMONTO*DEVT_FACTOR), SUM(DVDE_CONSUMO)
            FROM devoluciones_ventas_detalle D, DEVOLUCIONES_VENTAS V, PREFIJOS P, ARTICULO A
            WHERE V.DEVT_ID = D.DEVT_ID AND P.PREF_PRE = V.PREF_PRE AND P.TIDO_COD = 33 AND D.ARTI_COD = A.arti_cod AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            DEVT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY D.ARTI_COD
            INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO
            DO
            BEGIN
            COSTO = 0;
            FOR SELECT DVDE_CANT * DVDE_FACTOR, DEVT_FECHA, F.DEVT_ID, DVDE_ITEM FROM devoluciones_ventas_detalle D, devoluciones_ventas F, PREFIJOS P
                WHERE F.devt_id = D.devt_id AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND
                DEVT_ANULADO = 'N' AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 33 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                and D.ARTI_COD = :articulo  INTO :cantdet, :fecha, :id, :item
                DO
                BEGIN
                if (EXISTS (SELECT COST_ENTP / COST_ENTC FROM COSTOS C, MOVIMIENTO_ARTICULO M
                    WHERE COST_IDMOV = MVAR_CONS AND MVAR_TIPODOC = 33 AND MVAR_IDREF = :ID AND COST_ENTC <> 0 AND MVAR_ITEM = :ITEM)) then
                    SELECT COST_ENTP / COST_ENTC, COST_ULTIMO FROM COSTOS C, MOVIMIENTO_ARTICULO M
                        WHERE COST_IDMOV = MVAR_CONS AND MVAR_TIPODOC = 33 AND MVAR_IDREF = :ID AND COST_ENTC <> 0 AND MVAR_ITEM = :ITEM INTO :costounit, :ultcos;
                else
                    EXECUTE PROCEDURE costo_promedio_y_ultimo(:ARTICULO, :FECHA) returning_values (:costounit, :ultcos);
                if (costounit IS NULL) then
                    costounit = 0;
                if (ultcos IS NULL) then
                    ultcos = 0;
                /* EL FACTOR */
                FACCOST = 1;
                SELECT FIRST 1 FACO_FACTOR FROM factor_costo WHERE FACO_FECINI <= :FECHA AND FACO_FECFIN >= :FECHA INTO :FACCOST;
                ULTCOS = ULTCOS * FACCOST;
                COSTOUNIT = COSTOUNIT * FACCOST;

                if (ULTIMO = 'S') then
                    COSTO = COSTO + ultcos * cantdet;
                else
                    COSTO = COSTO + costounit * cantdet;
                END
            EXECUTE procedure nombres_grupos_inventario (CODGRUPO, CODSUBG, CODMARC)
                returning_values (NOMGRUPO, NOMSUBG, NOMMARC);
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            else
                CANTIDAD = CANTIDAD * -1;
            if (BASE IS NULL) then
                BASE = 0;
            else
                BASE = BASE * -1;
            if (IVA IS NULL) then
                IVA = 0;
            else
                IVA = IVA * -1;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            else
                CONSUMO = CONSUMO * -1;
            COSTO = costo * -1;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            if (CEROS = 'S') then
                INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (2, USER, :ARTICULO);
            INSERT INTO REP_UTILIDAD(ID, TIPO, CODIGO, BASE, IVA, CONSUMO, COSTO) VALUES (:IDREP, 33, :articulo, :base, :iva, :consumo, :costo);
            END /* FOR */
        SELECT SUM(BASE-COSTO) FROM REP_UTILIDAD WHERE id = :IDREP AND TIPO = 33 INTO :TOTAL;
        FOR SELECT ARTI_COD, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD, TAIV_PORC FROM ARTICULO A, TARIFA_IVA T
            WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND
            (A.MARC_COD <= :MARFIN))) AND substring(a.arti_cod from 1 FOR 2) <> '.t' AND A.taiv_cod = T.taiv_cod
            INTO :ARTICULO, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :ivapor
            DO
            BEGIN
            EXECUTE procedure nombres_grupos_inventario (CODGRUPO, CODSUBG, CODMARC)
                returning_values (NOMGRUPO, NOMSUBG, NOMMARC);
            BASE = 0;
            IVA = 0;
            CONSUMO = 0;
            COSTO = 0;
            UTILIDAD = 0;
            PORC = 0;
            SELECT BASE, IVA, CONSUMO, COSTO FROM rep_utilidad WHERE ID = :IDREP AND TIPO = 33 AND CODIGO = :articulo INTO :BASE, :IVA, :consumo,  :costo;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            EXECUTE PROCEDURE PORCENTAJE (utilidad,  TOTAL, 'S') returning_values (part);
            if ((CEROS = 'S') or (BASE <> 0) or (COSTO <> 0)) then
                SUSPEND;
            END /* FOR */
        END
    if (BIN_AND(TIPO, 8) <> 0) then
        BEGIN
        TIPODOC = 34;
        /* BORRA LA TABLA AUXILIAR */
        DELETE FROM reportes_aux WHERE REPA_ID = 2 AND REPA_USER = USER;

        FOR SELECT MAX(D.ARTI_COD), SUM(PEDE_CANT * PEDE_FACTOR), SUM((PEDE_TOTAL-PEDE_IVAMONTO-PEDE_CONSUMO)*PEDI_FACTOR), SUM(PEDE_IVAMONTO*PEDI_FACTOR), SUM(PEDE_CONSUMO)
            FROM PEDIDOS_DETALLE D, PEDIDOS P, PREFIJOS R, ARTICULO A
            WHERE P.PEDI_ID = D.PEDI_ID AND P.PREF_PRE = R.PREF_PRE AND R.TIDO_COD = 34 AND D.ARTI_COD = A.arti_cod AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            PEDI_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY D.ARTI_COD
            INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO
            DO
            BEGIN
            COSTO = 0;
            FOR SELECT PEDE_CANT * PEDE_FACTOR, PEDI_FECHA FROM pedidos_detalle D, pedidos F, PREFIJOS P
                WHERE F.pedi_id = D.pedi_id AND PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND
                PEDI_ANULADO = 'N' AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                and D.ARTI_COD = :articulo  INTO :cantdet, :fecha
                DO
                BEGIN
                EXECUTE PROCEDURE costo_promedio_y_ultimo(:ARTICULO, :FECHA) returning_values (:costounit, :ultcos);
                /* EL FACTOR */
                FACCOST = 1;
                SELECT FIRST 1 FACO_FACTOR FROM factor_costo WHERE FACO_FECINI <= :FECHA AND FACO_FECFIN >= :FECHA INTO :FACCOST;
                ULTCOS = ULTCOS * FACCOST;
                COSTOUNIT = COSTOUNIT * FACCOST;

                if (ULTIMO = 'S') then
                    COSTO = COSTO + ultcos * cantdet;
                else
                    COSTO = COSTO + costounit * cantdet;
                END
            EXECUTE procedure nombres_grupos_inventario (CODGRUPO, CODSUBG, CODMARC)
                returning_values (NOMGRUPO, NOMSUBG, NOMMARC);
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            if (CEROS = 'S') then
                INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (2, USER, :ARTICULO);
            INSERT INTO REP_UTILIDAD(ID, TIPO, CODIGO, BASE, IVA, CONSUMO, COSTO) VALUES (:IDREP, 34, :articulo, :base, :iva, :consumo, :costo);
            END /* FOR */
        SELECT SUM(BASE-COSTO) FROM REP_UTILIDAD WHERE id = :IDREP AND TIPO = 34 INTO :TOTAL;
        FOR SELECT ARTI_COD, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD, TAIV_PORC FROM ARTICULO A, TARIFA_IVA T
            WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND
            (A.MARC_COD <= :MARFIN))) AND substring(a.arti_cod from 1 FOR 2) <> '.t' AND A.taiv_cod = T.taiv_cod
            INTO :ARTICULO, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :ivapor
            DO
            BEGIN
            EXECUTE procedure nombres_grupos_inventario (CODGRUPO, CODSUBG, CODMARC)
                returning_values (NOMGRUPO, NOMSUBG, NOMMARC);
            BASE = 0;
            IVA = 0;
            CONSUMO = 0;
            COSTO = 0;
            UTILIDAD = 0;
            PORC = 0;
            SELECT BASE, IVA, CONSUMO, COSTO FROM rep_utilidad WHERE ID = :IDREP AND TIPO = 34 AND CODIGO = :articulo INTO :BASE, :IVA, :consumo,  :costo;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            EXECUTE PROCEDURE PORCENTAJE (utilidad,  TOTAL, 'S') returning_values (part);
            if ((CEROS = 'S') or (BASE <> 0) or (COSTO <> 0)) then
                SUSPEND;
            END /* FOR */
        END
    if (BIN_AND(TIPO, 16) <> 0) then
        BEGIN
        TIPODOC = 35;
        FOR SELECT MAX(D.ARTI_COD), SUM(CTDE_CANT * CTDE_FACTOR), SUM((CTDE_TOTAL-CTDE_IVAMONTO-CTDE_CONSUMO)*COTI_FACTOR), SUM(CTDE_IVAMONTO), SUM(CTDE_CONSUMO)
            FROM COTIZACIONES_DETALLE D, COTIZACIONES C, PREFIJOS P, ARTICULO A
            WHERE C.COTI_ID = D.COTI_ID AND P.PREF_PRE = C.PREF_PRE AND P.TIDO_COD = 35 AND D.ARTI_COD = A.arti_cod AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND COTI_FECHA >= :FECINI AND COTI_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            COTI_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY D.ARTI_COD
            INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO
            DO
            BEGIN
            COSTO = 0;
            FOR SELECT CTDE_CANT * CTDE_FACTOR, COTI_FECHA FROM cotizaciones_detalle D, cotizaciones F, PREFIJOS P
                WHERE F.coti_id = D.coti_id AND COTI_FECHA >= :FECINI AND COTI_FECHA <= :FECFIN AND
                COTI_ANULADO = 'N' AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 35 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                and D.ARTI_COD = :articulo  INTO :cantdet, :fecha
                DO
                BEGIN
                EXECUTE PROCEDURE costo_promedio_y_ultimo(:ARTICULO, :FECHA) returning_values (:costounit, :ultcos);
                /* EL FACTOR */
                FACCOST = 1;
                SELECT FIRST 1 FACO_FACTOR FROM factor_costo WHERE FACO_FECINI <= :FECHA AND FACO_FECFIN >= :FECHA INTO :FACCOST;
                ULTCOS = ULTCOS * FACCOST;
                COSTOUNIT = COSTOUNIT * FACCOST;

                if (ULTIMO = 'S') then
                    COSTO = COSTO + ultcos * cantdet;
                else
                    COSTO = COSTO + costounit * cantdet;
                END
            EXECUTE procedure nombres_grupos_inventario (CODGRUPO, CODSUBG, CODMARC)
                returning_values (NOMGRUPO, NOMSUBG, NOMMARC);
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            if (CEROS = 'S') then
                INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (2, USER, :ARTICULO);
            INSERT INTO REP_UTILIDAD(ID, TIPO, CODIGO, BASE, IVA, CONSUMO, COSTO) VALUES (:IDREP, 35, :articulo, :base, :iva, :consumo, :costo);
            END /* FOR */
        SELECT SUM(BASE-COSTO) FROM REP_UTILIDAD WHERE id = :IDREP AND TIPO = 35 INTO :TOTAL;
        FOR SELECT ARTI_COD, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD, TAIV_PORC FROM ARTICULO A, TARIFA_IVA T
            WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND
            (A.MARC_COD <= :MARFIN))) AND substring(a.arti_cod from 1 FOR 2) <> '.t' AND A.taiv_cod = T.taiv_cod
            INTO :ARTICULO, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :ivapor
            DO
            BEGIN
            EXECUTE procedure nombres_grupos_inventario (CODGRUPO, CODSUBG, CODMARC)
                returning_values (NOMGRUPO, NOMSUBG, NOMMARC);
            BASE = 0;
            IVA = 0;
            CONSUMO = 0;
            COSTO = 0;
            UTILIDAD = 0;
            PORC = 0;
            SELECT BASE, IVA, CONSUMO, COSTO FROM rep_utilidad WHERE ID = :IDREP AND TIPO = 35 AND CODIGO = :articulo INTO :BASE, :IVA, :consumo,  :costo;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            EXECUTE PROCEDURE PORCENTAJE (utilidad,  TOTAL, 'S') returning_values (part);
            if ((CEROS = 'S') or (BASE <> 0) or (COSTO <> 0)) then
                SUSPEND;
            END /* FOR */
        END
    END
ELSE
  if (DETALLE = 'G') then
    BEGIN
    if (BIN_AND(TIPO, 1) <> 0) then
        BEGIN
        TIPODOC = 31;
        FOR SELECT MAX(a.grup_cod), SUM((FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO)*FACT_FACTOR), SUM(FADE_IVAMONTO*FACT_FACTOR), SUM(FADE_CONSUMO)
            FROM FACTURAS_DETALLE D, FACTURAS F, PREFIJOS P, ARTICULO A
            WHERE F.FACT_ID = D.FACT_ID AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND D.ARTI_COD = A.arti_cod AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            FACT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) and substring(a.arti_cod from 1 FOR 2) <> '.t'
            GROUP BY a.grup_cod
            INTO :codgrupo, :BASE, :IVA, :CONSUMO
            DO
            BEGIN
            COSTO = 0;
            FOR SELECT D.fact_id, D.fade_item, D.arti_cod, FADE_CANT * FADE_FACTOR, FACT_FECHA
                FROM FACTURAS_DETALLE D, FACTURAS F, PREFIJOS P, ARTICULO A
                WHERE F.FACT_ID = D.FACT_ID AND D.arti_cod = A.arti_cod AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND
                FACT_ANULADO = 'N' AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                and a.grup_cod = :codgrupo INTO :id, :item, :ARTICULO, cantdet, :fecha
                DO
                BEGIN
                if (EXISTS (SELECT COST_SALP / COST_SALC FROM COSTOS C, MOVIMIENTO_ARTICULO M
                    WHERE COST_IDMOV = MVAR_CONS AND MVAR_TIPODOC = 31 AND MVAR_IDREF = :ID AND COST_SALC <> 0 AND MVAR_ITEM = :ITEM)) then
                    SELECT COST_SALP / COST_SALC, COST_ULTIMO FROM COSTOS C, MOVIMIENTO_ARTICULO M
                        WHERE COST_IDMOV = MVAR_CONS AND MVAR_TIPODOC = 31 AND MVAR_IDREF = :ID AND COST_SALC <> 0 AND MVAR_ITEM = :ITEM INTO :costounit, :ultcos;
                else
                    EXECUTE PROCEDURE costo_promedio_y_ultimo(:ARTICULO, :FECHA) returning_values (:costounit, :ultcos);
                if (costounit IS NULL) then
                    costounit = 0;
                if (ultcos IS NULL) then
                    ultcos = 0;
                /* EL FACTOR */
                FACCOST = 1;
                SELECT FIRST 1 FACO_FACTOR FROM factor_costo WHERE FACO_FECINI <= :FECHA AND FACO_FECFIN >= :FECHA INTO :FACCOST;
                ULTCOS = ULTCOS * FACCOST;
                COSTOUNIT = COSTOUNIT * FACCOST;

                if (ULTIMO = 'S') then
                    COSTO = COSTO + ultcos * cantdet;
                else
                    COSTO = COSTO + costounit * cantdet;
                END
            CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            INSERT INTO REP_UTILIDAD(ID, TIPO, CODIGO, BASE, IVA, CONSUMO, COSTO) VALUES (:IDREP, 31, :codgrupo, :base, :iva, :consumo, :costo);
            if (CEROS = 'S') then
                INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (2, USER, :codgrupo);
            END /* FOR */
        SELECT SUM(BASE-COSTO) FROM REP_UTILIDAD WHERE id = :IDREP AND TIPO = 31 INTO :TOTAL;
        FOR SELECT GRUP_COD, GRUP_NOM FROM GRUPO
            WHERE GRUP_COD >= :GRPINI AND GRUP_COD <= :grpfin
            INTO :ARTICULO, :DESCRIPCION
            DO
            BEGIN
            BASE = 0;
            IVA = 0;
            CONSUMO = 0;
            COSTO = 0;
            UTILIDAD = 0;
            PORC = 0;
            PART = 0;
            SELECT BASE, IVA, CONSUMO, COSTO FROM rep_utilidad WHERE ID = :IDREP AND TIPO = 31 AND CODIGO = :articulo INTO :BASE, :IVA, :consumo,  :costo;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            EXECUTE PROCEDURE PORCENTAJE (utilidad,  TOTAL, 'S') returning_values (part);
            if ((CEROS = 'S') or (BASE <> 0) or (COSTO <> 0)) then
                SUSPEND;
            END /* FOR */
            BEGIN
            COSTO = 0;
            END
        END
    if (BIN_AND(TIPO, 2) <> 0) then
        BEGIN
        TIPODOC = 32;
        FOR SELECT MAX(a.grup_cod), SUM(RVDE_TOTAL-RVDE_IVAMONTO-RVDE_CONSUMO), SUM(RVDE_IVAMONTO), SUM(RVDE_CONSUMO)
            FROM REMISIONES_VENTA_DETALLE D, REMISIONES_VENTA R, PREFIJOS P, ARTICULO A
            WHERE R.REVT_ID = D.REVT_ID AND P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = 32 AND D.ARTI_COD = A.arti_cod AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            REVT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY a.grup_cod
            INTO :codgrupo, :BASE, :IVA, :CONSUMO
            DO
            BEGIN
            COSTO = 0;
            FOR SELECT D.arti_cod, RVDE_CANT * RVDE_FACTOR, REVT_FECHA, F.REVT_ID, RVDE_ITEM
                FROM remisiones_venta_detalle D, remisiones_venta F, PREFIJOS P, ARTICULO A
                WHERE F.revt_id = D.revt_id AND A.arti_cod = D.arti_cod AND REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN AND
                REVT_ANULADO = 'N' AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 32 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                and a.grup_cod = :codgrupo INTO :ARTICULO, cantdet, :fecha, :ID, :ITEM
                DO
                BEGIN
                if (EXISTS (SELECT COST_SALP / COST_SALC FROM COSTOS C, MOVIMIENTO_ARTICULO M
                    WHERE COST_IDMOV = MVAR_CONS AND MVAR_TIPODOC = 32 AND MVAR_IDREF = :ID AND COST_SALC <> 0 AND MVAR_ITEM = :ITEM)) then
                    SELECT COST_SALP / COST_SALC, COST_ULTIMO FROM COSTOS C, MOVIMIENTO_ARTICULO M
                        WHERE COST_IDMOV = MVAR_CONS AND MVAR_TIPODOC = 32 AND MVAR_IDREF = :ID AND COST_SALC <> 0 AND MVAR_ITEM = :ITEM INTO :costounit, :ultcos;
                else
                    EXECUTE PROCEDURE costo_promedio_y_ultimo(:ARTICULO, :FECHA) returning_values (:costounit, :ultcos);
                if (costounit IS NULL) then
                    costounit = 0;
                if (ultcos IS NULL) then
                    ultcos = 0;
                /* EL FACTOR */
                FACCOST = 1;
                SELECT FIRST 1 FACO_FACTOR FROM factor_costo WHERE FACO_FECINI <= :FECHA AND FACO_FECFIN >= :FECHA INTO :FACCOST;
                ULTCOS = ULTCOS * FACCOST;
                COSTOUNIT = COSTOUNIT * FACCOST;

                if (ULTIMO = 'S') then
                    COSTO = COSTO + ultcos * cantdet;
                else
                    COSTO = COSTO + costounit * cantdet;
                END
            CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            if (CEROS = 'S') then
                INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (2, USER, :codgrupo);
            INSERT INTO REP_UTILIDAD(ID, TIPO, CODIGO, BASE, IVA, CONSUMO, COSTO) VALUES (:IDREP, 32, :codgrupo, :base, :iva, :consumo, :costo);
            END /* FOR */
        SELECT SUM(BASE-COSTO) FROM REP_UTILIDAD WHERE id = :IDREP AND TIPO = 32 INTO :TOTAL;
        FOR SELECT GRUP_COD, GRUP_NOM FROM GRUPO
            WHERE GRUP_COD >= :GRPINI AND GRUP_COD <= :grpfin
            INTO :ARTICULO, :DESCRIPCION
            DO
            BEGIN
            BASE = 0;
            IVA = 0;
            CONSUMO = 0;
            COSTO = 0;
            UTILIDAD = 0;
            PORC = 0;
            SELECT BASE, IVA, CONSUMO, COSTO FROM rep_utilidad WHERE ID = :IDREP AND TIPO = 32 AND CODIGO = :articulo INTO :BASE, :IVA, :consumo,  :costo;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            EXECUTE PROCEDURE PORCENTAJE (utilidad,  TOTAL, 'S') returning_values (part);
            if ((CEROS = 'S') or (BASE <> 0) or (COSTO <> 0)) then
                SUSPEND;
            END /* FOR */
        END
    if (BIN_AND(TIPO, 4) <> 0) then
        BEGIN
        TIPODOC = 33;
        FOR SELECT MAX(a.grup_cod), SUM((DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO)*DEVT_FACTOR), SUM(DVDE_IVAMONTO*DEVT_FACTOR), SUM(DVDE_CONSUMO)
            FROM devoluciones_ventas_detalle D, DEVOLUCIONES_VENTAS V, PREFIJOS P, ARTICULO A
            WHERE V.DEVT_ID = D.DEVT_ID AND P.PREF_PRE = V.PREF_PRE AND P.TIDO_COD = 33 AND D.ARTI_COD = A.arti_cod AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            DEVT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY a.grup_cod
            INTO :codgrupo, :BASE, :IVA, :CONSUMO
            DO
            BEGIN
            COSTO = 0;
            FOR SELECT D.arti_cod, DVDE_CANT * DVDE_FACTOR, DEVT_FECHA, F.devt_id, D.dvde_item FROM devoluciones_ventas_detalle D, devoluciones_ventas F, PREFIJOS P, ARTICULO A
                WHERE A.arti_cod = D.arti_cod AND F.devt_id = D.devt_id AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND
                DEVT_ANULADO = 'N' AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 33 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                and a.grup_cod = :codgrupo INTO :ARTICULO, cantdet, :fecha, :ID, :ITEM
                DO
                BEGIN
                if (EXISTS (SELECT COST_ENTP / COST_ENTC FROM COSTOS C, MOVIMIENTO_ARTICULO M
                    WHERE COST_IDMOV = MVAR_CONS AND MVAR_TIPODOC = 33 AND MVAR_IDREF = :ID AND COST_ENTC <> 0 AND MVAR_ITEM = :ITEM)) then
                    SELECT COST_ENTP / COST_ENTC, COST_ULTIMO FROM COSTOS C, MOVIMIENTO_ARTICULO M
                        WHERE COST_IDMOV = MVAR_CONS AND MVAR_TIPODOC = 33 AND MVAR_IDREF = :ID AND COST_ENTC <> 0 AND MVAR_ITEM = :ITEM INTO :costounit, :ultcos;
                else
                    EXECUTE PROCEDURE costo_promedio_y_ultimo(:ARTICULO, :FECHA) returning_values (:costounit, :ultcos);
                if (costounit IS NULL) then
                    costounit = 0;
                if (ultcos IS NULL) then
                    ultcos = 0;
                /* EL FACTOR */
                FACCOST = 1;
                SELECT FIRST 1 FACO_FACTOR FROM factor_costo WHERE FACO_FECINI <= :FECHA AND FACO_FECFIN >= :FECHA INTO :FACCOST;
                ULTCOS = ULTCOS * FACCOST;
                COSTOUNIT = COSTOUNIT * FACCOST;

                if (ULTIMO = 'S') then
                    COSTO = COSTO + ultcos * cantdet;
                else
                    COSTO = COSTO + costounit * cantdet;
                END
            CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            else
                BASE = BASE * -1;
            if (IVA IS NULL) then
                IVA = 0;
            else
                IVA = IVA * -1;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            else
                CONSUMO = CONSUMO * -1;
            COSTO = costo * -1;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            if (CEROS = 'S') then
                INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (2, USER, :codgrupo);
            INSERT INTO REP_UTILIDAD(ID, TIPO, CODIGO, BASE, IVA, CONSUMO, COSTO) VALUES (:IDREP, 33, :codgrupo, :base, :iva, :consumo, :costo);
            END /* FOR */
        SELECT SUM(BASE-COSTO) FROM REP_UTILIDAD WHERE id = :IDREP AND TIPO = 33 INTO :TOTAL;
        FOR SELECT GRUP_COD, GRUP_NOM FROM GRUPO
            WHERE GRUP_COD >= :GRPINI AND GRUP_COD <= :grpfin
            INTO :ARTICULO, :DESCRIPCION
            DO
            BEGIN
            BASE = 0;
            IVA = 0;
            CONSUMO = 0;
            COSTO = 0;
            UTILIDAD = 0;
            PORC = 0;
            SELECT BASE, IVA, CONSUMO, COSTO FROM rep_utilidad WHERE ID = :IDREP AND TIPO = 33 AND CODIGO = :articulo INTO :BASE, :IVA, :consumo,  :costo;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            EXECUTE PROCEDURE PORCENTAJE (utilidad,  TOTAL, 'S') returning_values (part);
            if ((CEROS = 'S') or (BASE <> 0) or (COSTO <> 0)) then
                SUSPEND;
            END /* FOR */
        END
    if (BIN_AND(TIPO, 8) <> 0) then
        BEGIN
        TIPODOC = 34;
        /* BORRA LA TABLA AUXILIAR */
        DELETE FROM reportes_aux WHERE REPA_ID = 2 AND REPA_USER = USER;

        FOR SELECT MAX(a.grup_cod), SUM((PEDE_TOTAL-PEDE_IVAMONTO-PEDE_CONSUMO)*PEDI_FACTOR), SUM(PEDE_IVAMONTO*PEDI_FACTOR), SUM(PEDE_CONSUMO)
            FROM PEDIDOS_DETALLE D, PEDIDOS P, PREFIJOS R, ARTICULO A
            WHERE P.PEDI_ID = D.PEDI_ID AND P.PREF_PRE = R.PREF_PRE AND R.TIDO_COD = 34 AND D.ARTI_COD = A.arti_cod AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            PEDI_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY a.grup_cod
            INTO :codgrupo, :BASE, :IVA, :CONSUMO
            DO
            BEGIN
            COSTO = 0;
            FOR SELECT MAX(D.arti_cod), SUM(PEDE_CANT * PEDE_FACTOR), MAX(pedi_FECHA) FROM pedidos_detalle D, pedidos F, PREFIJOS P, ARTICULO A
                WHERE A.arti_cod = D.arti_cod AND F.pedi_id = D.pedi_id AND PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND
                PEDI_ANULADO = 'N' AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 34 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                and a.grup_cod = :codgrupo GROUP BY D.ARTI_COD, PEDI_FECHA INTO :ARTICULO, cantdet, :fecha
                DO
                BEGIN
                EXECUTE PROCEDURE costo_promedio_y_ultimo(:ARTICULO, :FECHA) returning_values (:costounit, :ultcos);
                /* EL FACTOR */
                FACCOST = 1;
                SELECT FIRST 1 FACO_FACTOR FROM factor_costo WHERE FACO_FECINI <= :FECHA AND FACO_FECFIN >= :FECHA INTO :FACCOST;
                ULTCOS = ULTCOS * FACCOST;
                COSTOUNIT = COSTOUNIT * FACCOST;

                if (ULTIMO = 'S') then
                    COSTO = COSTO + ultcos * cantdet;
                else
                    COSTO = COSTO + costounit * cantdet;
                END
            CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            if (CEROS = 'S') then
                INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (2, USER, :codgrupo);
            INSERT INTO REP_UTILIDAD(ID, TIPO, CODIGO, BASE, IVA, CONSUMO, COSTO) VALUES (:IDREP, 34, :codgrupo, :base, :iva, :consumo, :costo);
            END /* FOR */
        SELECT SUM(BASE-COSTO) FROM REP_UTILIDAD WHERE id = :IDREP AND TIPO = 34 INTO :TOTAL;
        FOR SELECT GRUP_COD, GRUP_NOM FROM GRUPO
            WHERE GRUP_COD >= :GRPINI AND GRUP_COD <= :grpfin
            INTO :ARTICULO, :DESCRIPCION
            DO
            BEGIN
            BASE = 0;
            IVA = 0;
            CONSUMO = 0;
            COSTO = 0;
            UTILIDAD = 0;
            PORC = 0;
            SELECT BASE, IVA, CONSUMO, COSTO FROM rep_utilidad WHERE ID = :IDREP AND TIPO = 34 AND CODIGO = :articulo INTO :BASE, :IVA, :consumo,  :costo;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            EXECUTE PROCEDURE PORCENTAJE (utilidad,  TOTAL, 'S') returning_values (part);
            if ((CEROS = 'S') or (BASE <> 0) or (COSTO <> 0)) then
                SUSPEND;
            END /* FOR */
        END
    if (BIN_AND(TIPO, 16) <> 0) then
        BEGIN
        TIPODOC = 35;
        FOR SELECT MAX(a.grup_cod), SUM((CTDE_TOTAL-CTDE_IVAMONTO-CTDE_CONSUMO)*COTI_FACTOR), SUM(CTDE_IVAMONTO), SUM(CTDE_CONSUMO)
            FROM COTIZACIONES_DETALLE D, COTIZACIONES C, PREFIJOS P, ARTICULO A
            WHERE C.COTI_ID = D.COTI_ID AND P.PREF_PRE = C.PREF_PRE AND P.TIDO_COD = 35 AND D.ARTI_COD = A.arti_cod AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND COTI_FECHA >= :FECINI AND COTI_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            COTI_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY A.grup_cod
            INTO :codgrupo, :BASE, :IVA, :CONSUMO
            DO
            BEGIN
            COSTO = 0;
            FOR SELECT MAX(D.arti_cod), SUM(CTDE_CANT * CTDE_FACTOR), MAX(COTI_FECHA) FROM cotizaciones_detalle D, cotizaciones F, PREFIJOS P, ARTICULO A
                WHERE A.arti_cod = D.arti_cod AND F.coti_id = D.coti_id AND COTI_FECHA >= :FECINI AND COTI_FECHA <= :FECFIN AND
                COTI_ANULADO = 'N' AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 35 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                and a.grup_cod = :codgrupo GROUP BY D.ARTI_COD, COTI_FECHA INTO :ARTICULO, cantdet, :fecha
                DO
                BEGIN
                EXECUTE PROCEDURE costo_promedio_y_ultimo(:ARTICULO, :FECHA) returning_values (:costounit, :ultcos);
                /* EL FACTOR */
                FACCOST = 1;
                SELECT FIRST 1 FACO_FACTOR FROM factor_costo WHERE FACO_FECINI <= :FECHA AND FACO_FECFIN >= :FECHA INTO :FACCOST;
                ULTCOS = ULTCOS * FACCOST;
                COSTOUNIT = COSTOUNIT * FACCOST;

                if (ULTIMO = 'S') then
                    COSTO = COSTO + ultcos * cantdet;
                else
                    COSTO = COSTO + costounit * cantdet;
                END
            CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            if (CEROS = 'S') then
                INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (2, USER, :codgrupo);
            INSERT INTO REP_UTILIDAD(ID, TIPO, CODIGO, BASE, IVA, CONSUMO, COSTO) VALUES (:IDREP, 35, :codgrupo, :base, :iva, :consumo, :costo);
            END /* FOR */
        SELECT SUM(BASE-COSTO) FROM REP_UTILIDAD WHERE id = :IDREP AND TIPO = 35 INTO :TOTAL;
        FOR SELECT GRUP_COD, GRUP_NOM FROM GRUPO
            WHERE GRUP_COD >= :GRPINI AND GRUP_COD <= :grpfin
            INTO :ARTICULO, :DESCRIPCION
            DO
            BEGIN
            BASE = 0;
            IVA = 0;
            CONSUMO = 0;
            COSTO = 0;
            UTILIDAD = 0;
            PORC = 0;
            SELECT BASE, IVA, CONSUMO, COSTO FROM rep_utilidad WHERE ID = :IDREP AND TIPO = 35 AND CODIGO = :articulo INTO :BASE, :IVA, :consumo,  :costo;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            EXECUTE PROCEDURE PORCENTAJE (utilidad,  TOTAL, 'S') returning_values (part);
            if ((CEROS = 'S') or (BASE <> 0) or (COSTO <> 0)) then
                SUSPEND;
            END /* FOR */
        END
    END
  ELSE
    BEGIN
    if (BIN_AND(TIPO, 1) <> 0) then
        BEGIN
        TIPODOC = 31;
        FOR SELECT F.PREF_PRE, FACT_NUMERO, FACT_FECHA, D.ARTI_COD, FADE_CANT * FADE_FACTOR, (FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO)*FACT_FACTOR, FADE_IVAMONTO*FACT_FACTOR, FADE_CONSUMO,
            ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD, F.FACT_ID, FADE_ITEM, TAIV_PORC
            FROM FACTURAS F, FACTURAS_DETALLE D, PREFIJOS P, ARTICULO A, TARIFA_IVA T
            WHERE F.FACT_ID = D.FACT_ID AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND D.ARTI_COD = A.arti_cod AND
                A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
                A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND FACT_FECHA >= :FECINI AND A.taiv_cod = T.taiv_cod AND
                (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
                FACT_FECHA <= :FECFIN AND FACT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) and substring(a.arti_cod from 1 FOR 2) <> '.t'
            ORDER BY D.ARTI_COD, FACT_FECHA, F.FACT_ID, FADE_ITEM
            INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,
                :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :ID, :ITEM, :ivapor
            DO
            BEGIN
            EXECUTE procedure nombres_grupos_inventario (CODGRUPO, CODSUBG, CODMARC)
                returning_values (NOMGRUPO, NOMSUBG, NOMMARC);
            if (EXISTS (SELECT COST_SALP / COST_SALC FROM COSTOS C, MOVIMIENTO_ARTICULO M
                WHERE COST_IDMOV = MVAR_CONS AND MVAR_TIPODOC = 31 AND MVAR_IDREF = :ID AND COST_SALC <> 0 AND MVAR_ITEM = :ITEM)) then
                SELECT COST_SALP / COST_SALC, COST_ULTIMO FROM COSTOS C, MOVIMIENTO_ARTICULO M
                    WHERE COST_IDMOV = MVAR_CONS AND MVAR_TIPODOC = 31 AND MVAR_IDREF = :ID AND COST_SALC <> 0 AND MVAR_ITEM = :ITEM INTO :costounit, :ultcos;
            else
                EXECUTE PROCEDURE costo_promedio_y_ultimo(:ARTICULO, :FECHA) returning_values (:costounit, :ultcos);
            /* EL FACTOR */
            FACCOST = 1;
            SELECT FIRST 1 FACO_FACTOR FROM factor_costo WHERE FACO_FECINI <= :FECHA AND FACO_FECFIN >= :FECHA INTO :FACCOST;
            ULTCOS = ULTCOS * FACCOST;
            COSTOUNIT = COSTOUNIT * FACCOST;

            if (ULTIMO = 'S') then
                COSTO = ultcos * cantidad;
            else
                COSTO = costounit * cantidad;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            SUSPEND;
            END
        END
    if (BIN_AND(TIPO, 2) <> 0) then
        BEGIN
        TIPODOC = 32;
        FOR SELECT R.PREF_PRE, REVT_NUMERO, REVT_FECHA, D.ARTI_COD, RVDE_CANT * RVDE_FACTOR, RVDE_TOTAL-RVDE_IVAMONTO-RVDE_CONSUMO, RVDE_IVAMONTO, RVDE_CONSUMO,
            ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD, R.REVT_ID, RVDE_ITEM, TAIV_PORC
            FROM REMISIONES_VENTA R, REMISIONES_VENTA_DETALLE D, PREFIJOS P, ARTICULO A, TARIFA_IVA T
            WHERE R.REVT_ID = D.REVT_ID AND P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = 32 AND D.ARTI_COD = A.arti_cod AND
                A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
                A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN AND
                (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
                REVT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) AND A.taiv_cod = T.taiv_cod
            ORDER BY D.ARTI_COD, REVT_FECHA, R.REVT_ID, RVDE_ITEM
            INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,
                :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :ID, :ITEM, :ivapor
            DO
            BEGIN
            EXECUTE procedure nombres_grupos_inventario (CODGRUPO, CODSUBG, CODMARC)
                returning_values (NOMGRUPO, NOMSUBG, NOMMARC);
            if (EXISTS (SELECT COST_SALP / COST_SALC FROM COSTOS C, MOVIMIENTO_ARTICULO M
                WHERE COST_IDMOV = MVAR_CONS AND MVAR_TIPODOC = 32 AND MVAR_IDREF = :ID AND COST_SALC <> 0 AND MVAR_ITEM = :ITEM)) then
                SELECT COST_SALP / COST_SALC, COST_ULTIMO FROM COSTOS C, MOVIMIENTO_ARTICULO M
                    WHERE COST_IDMOV = MVAR_CONS AND MVAR_TIPODOC = 32 AND MVAR_IDREF = :ID AND COST_SALC <> 0 AND MVAR_ITEM = :ITEM INTO :costounit, :ultcos;
            else
                EXECUTE PROCEDURE costo_promedio_y_ultimo(:ARTICULO, :FECHA) returning_values (:costounit, :ultcos);
            /* EL FACTOR */
            FACCOST = 1;
            SELECT FIRST 1 FACO_FACTOR FROM factor_costo WHERE FACO_FECINI <= :FECHA AND FACO_FECFIN >= :FECHA INTO :FACCOST;
            ULTCOS = ULTCOS * FACCOST;
            COSTOUNIT = COSTOUNIT * FACCOST;

            if (ULTIMO = 'S') then
                COSTO = ultcos * cantidad;
            else
                COSTO = costounit * cantidad;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            SUSPEND;
            END
        END
    if (BIN_AND(TIPO, 4) <> 0) then
        BEGIN
        TIPODOC = 33;
        FOR SELECT V.PREF_PRE, DEVT_NUMERO, DEVT_FECHA, D.ARTI_COD, DVDE_CANT * DVDE_FACTOR, (DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO)*DEVT_FACTOR, DVDE_IVAMONTO*DEVT_FACTOR, DVDE_CONSUMO,
            ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD, V.DEVT_ID, DVDE_ITEM, TAIV_PORC
            FROM DEVOLUCIONES_VENTAS V, DEVOLUCIONES_VENTAS_DETALLE D, PREFIJOS P, ARTICULO A, TARIFA_IVA T
            WHERE V.DEVT_ID = D.DEVT_ID AND P.PREF_PRE = V.PREF_PRE AND P.TIDO_COD = 33 AND D.ARTI_COD = A.arti_cod AND
                A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
                A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND
                (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
                DEVT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) AND A.taiv_cod = T.taiv_cod
            ORDER BY D.ARTI_COD, DEVT_FECHA, V.DEVT_ID, DVDE_ITEM
            INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,
                :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :ID, :ITEM, :ivapor
            DO
            BEGIN
            EXECUTE procedure nombres_grupos_inventario (CODGRUPO, CODSUBG, CODMARC)
                returning_values (NOMGRUPO, NOMSUBG, NOMMARC);
            CANTIDAD = CANTIDAD * -1;
            if (EXISTS (SELECT COST_ENTP / COST_ENTC FROM COSTOS C, MOVIMIENTO_ARTICULO M
                WHERE COST_IDMOV = MVAR_CONS AND MVAR_TIPODOC = 33 AND MVAR_IDREF = :ID AND COST_ENTC <> 0 AND MVAR_ITEM = :ITEM)) then
                SELECT COST_ENTP / COST_ENTC, COST_ULTIMO FROM COSTOS C, MOVIMIENTO_ARTICULO M
                    WHERE COST_IDMOV = MVAR_CONS AND MVAR_TIPODOC = 33 AND MVAR_IDREF = :ID AND COST_ENTC <> 0 AND MVAR_ITEM = :ITEM INTO :costounit, :ultcos;
            else
                EXECUTE PROCEDURE costo_promedio_y_ultimo(:ARTICULO, :FECHA) returning_values (:costounit, :ultcos);
            /* EL FACTOR */
            FACCOST = 1;
            SELECT FIRST 1 FACO_FACTOR FROM factor_costo WHERE FACO_FECINI <= :FECHA AND FACO_FECFIN >= :FECHA INTO :FACCOST;
            ULTCOS = ULTCOS * FACCOST;
            COSTOUNIT = COSTOUNIT * FACCOST;

            if (ULTIMO = 'S') then
                COSTO = ultcos * cantidad;
            else
                COSTO = costounit * cantidad;
            BASE = BASE * -1;
            IVA = IVA * -1;
            CONSUMO = CONSUMO * -1;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            SUSPEND;
            END
        END
    if (BIN_AND(TIPO, 8) <> 0) then
        BEGIN
        TIPODOC = 34;
        FOR SELECT P.PREF_PRE, PEDI_NUMERO, PEDI_FECHA, D.ARTI_COD, PEDE_CANT * PEDE_FACTOR, (PEDE_TOTAL-PEDE_IVAMONTO-PEDE_CONSUMO)*PEDI_FACTOR, PEDE_IVAMONTO*PEDI_FACTOR, PEDE_CONSUMO,
            ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD, TAIV_PORC 
            FROM PEDIDOS P, PEDIDOS_DETALLE D, PREFIJOS R, ARTICULO A, TARIFA_IVA T
            WHERE P.PEDI_ID = D.PEDI_ID AND P.PREF_PRE = R.PREF_PRE AND R.TIDO_COD = 34 AND D.ARTI_COD = A.arti_cod AND
                A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
                A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND
                (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
                PEDI_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) AND A.taiv_cod = T.taiv_cod
            ORDER BY D.ARTI_COD, PEDI_FECHA, P.PEDI_ID, PEDE_ITEM
            INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,
                :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :ivapor
            DO
            BEGIN
            EXECUTE procedure nombres_grupos_inventario (CODGRUPO, CODSUBG, CODMARC)
                returning_values (NOMGRUPO, NOMSUBG, NOMMARC);
            EXECUTE PROCEDURE costo_promedio_y_ultimo(:ARTICULO, :FECHA) returning_values (:costounit, :ultcos);
            /* EL FACTOR */
            FACCOST = 1;
            SELECT FIRST 1 FACO_FACTOR FROM factor_costo WHERE FACO_FECINI <= :FECHA AND FACO_FECFIN >= :FECHA INTO :FACCOST;
            ULTCOS = ULTCOS * FACCOST;
            COSTOUNIT = COSTOUNIT * FACCOST;

            if (ULTIMO = 'S') then
                COSTO = ultcos * cantidad;
            else
                COSTO = costounit * cantidad;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            SUSPEND;
            END
        END
    if (BIN_AND(TIPO, 16) <> 0) then
        BEGIN
        TIPODOC = 35;
        FOR SELECT C.PREF_PRE, COTI_NUMERO, COTI_FECHA, D.ARTI_COD, CTDE_CANT * CTDE_FACTOR, (CTDE_TOTAL-CTDE_IVAMONTO-CTDE_CONSUMO)*COTI_FACTOR, CTDE_IVAMONTO*COTI_FACTOR, CTDE_CONSUMO,
            ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD, TAIV_PORC
            FROM COTIZACIONES C, COTIZACIONES_DETALLE D, PREFIJOS P, ARTICULO A, TARIFA_IVA T
            WHERE C.COTI_ID = D.COTI_ID AND P.PREF_PRE = C.PREF_PRE AND P.TIDO_COD = 35 AND D.ARTI_COD = A.arti_cod AND
                A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
                A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND COTI_FECHA >= :FECINI AND COTI_FECHA <= :FECFIN AND
                (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
                COTI_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) AND A.taiv_cod = T.taiv_cod
            ORDER BY D.ARTI_COD, COTI_FECHA, C.COTI_ID, CTDE_ITEM
            INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,
                :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :ivapor
            DO
            BEGIN
            EXECUTE procedure nombres_grupos_inventario (CODGRUPO, CODSUBG, CODMARC)
                returning_values (NOMGRUPO, NOMSUBG, NOMMARC);
            EXECUTE PROCEDURE costo_promedio_y_ultimo(:ARTICULO, :FECHA) returning_values (:costounit, :ultcos);
            /* EL FACTOR */
            FACCOST = 1;
            SELECT FIRST 1 FACO_FACTOR FROM factor_costo WHERE FACO_FECINI <= :FECHA AND FACO_FECFIN >= :FECHA INTO :FACCOST;
            ULTCOS = ULTCOS * FACCOST;
            COSTOUNIT = COSTOUNIT * FACCOST;

            if (ULTIMO = 'S') then
                COSTO = ultcos * cantidad;
            else
                COSTO = costounit * cantidad;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            SUSPEND;
            END
        END
    END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure REP_UTILIDAD_CLIENTE (
    TIPO integer,
    DETALLE char(1),
    TERINI varchar(20),
    TERFIN varchar(20),
    FECINI date,
    FECFIN date,
    ARTINI varchar(15),
    ARTFIN varchar(15),
    ORDEN char(1),
    CEROS char(1),
    SUBEMPRESA integer)
returns (
    NIT varchar(20),
    NOMBRE varchar(60),
    SUCURSAL varchar(10),
    TELEFONO varchar(40),
    CIUDAD varchar(40),
    CODZONA varchar(2),
    NOMZONA varchar(30),
    NOMTIPO varchar(50),
    ARTICULO varchar(15),
    DESCRIPCION varchar(60),
    CODGRUPO varchar(2),
    NOMGRUPO varchar(30),
    CODSUBG varchar(3),
    NOMSUBG varchar(30),
    CODMARC varchar(3),
    NOMMARC varchar(30),
    UNIDAD varchar(8),
    CANTIDAD numeric(18,4),
    BASE numeric(18,2),
    IVA numeric(18,2),
    COSTO numeric(18,2),
    UTILIDAD numeric(18,4),
    PORC numeric(9,2),
    TOTAL numeric(18,2),
    PREFIJO varchar(4),
    NUMERO varchar(6),
    FECHA date,
    DTO numeric(9,2))
AS
DECLARE VARIABLE COSTOUNIT NUMERIC(18,4);
DECLARE VARIABLE CANTDET NUMERIC(18,4);
DECLARE VARIABLE CODINI VARCHAR(15);
DECLARE VARIABLE CODFIN VARCHAR(15);
DECLARE VARIABLE DESINI VARCHAR(15);
DECLARE VARIABLE DESFIN VARCHAR(15);
declare variable UOM VARCHAR(20);
declare variable NUMROWS INTEGER;
declare variable ID INTEGER;
declare variable ITEM INTEGER;
declare variable FACCOST NUMERIC(18,4);
BEGIN
if (ORDEN = 'C') then
    BEGIN
    CODINI = ARTINI;
    CODFIN = ARTFIN;
    DESINI = '';
    DESFIN = 'zz';
    END
ELSE
    BEGIN
    DESINI = ARTINI;
    DESFIN = ARTFIN;
    CODINI = '';
    CODFIN = 'zz';
    END
EXECUTE PROCEDURE lee_configuracion ('FACTURACION', 'ARTICULOS', 'SUGERIR PRECIOS CON PORCENTAJE DE MARGEN O UTILIDAD') returning_values (:UOM);
SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = :TIPO INTO :NOMTIPO;
if (DETALLE = 'N') then
    BEGIN
    if (BIN_AND(TIPO, 1) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 31 INTO :NOMTIPO;
        /* BORRA LA TABLA AUXILIAR */
        DELETE FROM reportes_aux WHERE REPA_ID = 3 AND REPA_USER = USER;

        FOR SELECT MAX(T.TERC_NIT), MAX(TERC_NOM), MAX(TERC_TEL), MAX(TERC_CIU), MAX(ZONA_COD), MAX(D.ARTI_COD), SUM(FADE_CANT * FADE_FACTOR), SUM(FACT_FACTOR*(FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO)),
            SUM(FACT_FACTOR*FADE_IVAMONTO), SUM(FACT_FACTOR*FADE_TOTAL),
            MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD), max(f.fact_sucursal)
            FROM FACTURAS_DETALLE D, FACTURAS F, PREFIJOS P, terceros T, CLIENTES C, ARTICULO A
            WHERE C.TERC_NIT = T.TERC_NIT AND TERC_CLIE = 'S' AND F.terc_nit = T.terc_nit AND T.TERC_NIT >= :TERINI AND T.TERC_NIT <= :TERFIN AND
            F.FACT_ID = D.FACT_ID AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND FACT_ANULADO = 'N'
            AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) and substring(D.arti_cod from 1 FOR 2) <> '.t'
            AND D.ARTI_COD = A.arti_cod AND A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN
            GROUP BY T.TERC_NIT, f.fact_sucursal, D.ARTI_COD
            INTO :NIT, :NOMBRE, :TELEFONO, :CIUDAD, :CODZONA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :TOTAL,
            :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :sucursal
            DO
            BEGIN
            COSTO = 0;
            FOR SELECT F.FACT_ID, FADE_ITEM, FADE_CANT * FADE_FACTOR, FACT_FECHA FROM FACTURAS_DETALLE D, FACTURAS F, PREFIJOS P
                WHERE F.TERC_NIT = :NIT AND F.FACT_ID = D.FACT_ID AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND
                FACT_ANULADO = 'N' AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                and D.ARTI_COD = :articulo  INTO :ID, :ITEM, :cantdet, :fecha
                DO
                BEGIN
                if (EXISTS (SELECT COST_SALP / COST_SALC FROM COSTOS C, MOVIMIENTO_ARTICULO M
                    WHERE COST_IDMOV = MVAR_CONS AND MVAR_TIPODOC = 31 AND MVAR_IDREF = :ID AND COST_SALC <> 0 AND MVAR_ITEM = :ITEM)) then
                    SELECT COST_SALP / COST_SALC FROM COSTOS C, MOVIMIENTO_ARTICULO M
                        WHERE COST_IDMOV = MVAR_CONS AND MVAR_TIPODOC = 31 AND MVAR_IDREF = :ID AND COST_SALC <> 0 AND MVAR_ITEM = :ITEM INTO :costounit;
                else
                    EXECUTE PROCEDURE COSTO_PROMEDIO(:ARTICULO, :FECHA) returning_values (:costounit);
                /* EL FACTOR */
                FACCOST = 1;
                SELECT FIRST 1 FACO_FACTOR FROM factor_costo WHERE FACO_FECINI <= :FECHA AND FACO_FECFIN >= :FECHA INTO :FACCOST;
                COSTOUNIT = COSTOUNIT * FACCOST;

                COSTO = COSTO + costounit * cantdet;
                END
            SELECT ZONA_NOM FROM ZONAS WHERE ZONA_COD = :CODZONA INTO :NOMZONA;
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            if (CEROS = 'S') then
                INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (3, USER, :ARTICULO);
            SUSPEND;
            END /* FOR */
        if (CEROS = 'S') then
            BEGIN
            COSTO = 0;
            UTILIDAD = 0;
            PORC = 0;
            /* agregue los articulos sin factura */
            FOR SELECT ARTI_COD, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN
                INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                DO
                BEGIN
                SELECT COUNT(REPA_ARTICULO) FROM REPORTES_AUX WHERE REPA_ID = 3 AND REPA_USER = USER AND REPA_ARTICULO = :articulo INTO :numrows;
                if (numrows = 0) then
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        END
    if (BIN_AND(TIPO, 2) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 32 INTO :NOMTIPO;
        /* BORRA LA TABLA AUXILIAR */
        DELETE FROM reportes_aux WHERE REPA_ID = 3 AND REPA_USER = USER;

        FOR SELECT MAX(T.TERC_NIT), MAX(TERC_NOM), MAX(TERC_TEL), MAX(TERC_CIU), MAX(ZONA_COD), MAX(D.ARTI_COD), SUM(RVDE_CANT * RVDE_FACTOR), SUM(RVDE_TOTAL-RVDE_IVAMONTO-RVDE_CONSUMO), SUM(RVDE_IVAMONTO), SUM(RVDE_TOTAL),
            MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD), max(r.revt_sucursal)
            FROM REMISIONES_VENTA_DETALLE D, REMISIONES_VENTA R, PREFIJOS P, terceros T, CLIENTES C, ARTICULO A
            WHERE C.TERC_NIT = T.TERC_NIT AND TERC_CLIE = 'S' AND R.terc_nit = T.terc_nit AND T.TERC_NIT >= :TERINI AND T.TERC_NIT <= :TERFIN AND
            R.REVT_ID = D.REVT_ID AND REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN AND REVT_ANULADO = 'N'
            AND P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = 32 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            AND D.ARTI_COD = A.arti_cod AND A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN
            GROUP BY T.TERC_NIT, r.revt_sucursal, D.ARTI_COD
            INTO :NIT, :NOMBRE, :TELEFONO, :CIUDAD, :CODZONA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :TOTAL,
                :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :sucursal
            DO
                BEGIN
                COSTO = 0;
                FOR SELECT R.REVT_ID, RVDE_ITEM, RVDE_CANT * RVDE_FACTOR, REVT_FECHA
                    FROM REMISIONES_VENTA_DETALLE D, REMISIONES_VENTA R, PREFIJOS P
                    WHERE R.terc_nit = :nit AND R.REVT_ID = D.REVT_ID AND REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN AND REVT_ANULADO = 'N'
                    AND P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = 32 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                    AND D.ARTI_COD = :articulo INTO :ID, :ITEM, :cantdet, :fecha
                    DO
                    BEGIN
                    if (EXISTS (SELECT COST_SALP / COST_SALC FROM COSTOS C, MOVIMIENTO_ARTICULO M
                        WHERE COST_IDMOV = MVAR_CONS AND MVAR_TIPODOC = 32 AND MVAR_IDREF = :ID AND COST_SALC <> 0 AND MVAR_ITEM = :ITEM)) then
                        SELECT COST_SALP / COST_SALC FROM COSTOS C, MOVIMIENTO_ARTICULO M
                            WHERE COST_IDMOV = MVAR_CONS AND MVAR_TIPODOC = 32 AND MVAR_IDREF = :ID AND COST_SALC <> 0 AND MVAR_ITEM = :ITEM INTO :costounit;
                    else
                        EXECUTE PROCEDURE COSTO_PROMEDIO(:ARTICULO, :FECHA) returning_values (:costounit);
                    /* EL FACTOR */
                    FACCOST = 1;
                    SELECT FIRST 1 FACO_FACTOR FROM factor_costo WHERE FACO_FECINI <= :FECHA AND FACO_FECFIN >= :FECHA INTO :FACCOST;
                    COSTOUNIT = COSTOUNIT * FACCOST;

                    COSTO = COSTO + costounit * cantdet;
                    END
                SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                if (CANTIDAD IS NULL) then
                    CANTIDAD = 0;
                if (BASE IS NULL) then
                    BASE = 0;
                if (IVA IS NULL) then
                    IVA = 0;
                UTILIDAD = BASE - COSTO;
                if (UOM = 'UTILIDAD') then
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                else
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            if (CEROS = 'S') then
                INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (3, USER, :ARTICULO);
            SUSPEND;
            END /* FOR */
        if (CEROS = 'S') then
            BEGIN
            COSTO = 0;
            UTILIDAD = 0;
            PORC = 0;
            /* agregue los articulos sin factura */
            FOR SELECT ARTI_COD, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN
                INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                DO
                BEGIN
                SELECT COUNT(REPA_ARTICULO) FROM REPORTES_AUX WHERE REPA_ID = 3 AND REPA_USER = USER AND REPA_ARTICULO = :articulo INTO :numrows;
                if (numrows = 0) then
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        END
    if (BIN_AND(TIPO, 4) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 33 INTO :NOMTIPO;
        /* BORRA LA TABLA AUXILIAR */
        DELETE FROM reportes_aux WHERE REPA_ID = 3 AND REPA_USER = USER;

        FOR SELECT MAX(T.TERC_NIT), MAX(TERC_NOM), MAX(TERC_TEL), MAX(TERC_CIU), MAX(ZONA_COD), MAX(D.ARTI_COD), SUM(DVDE_CANT * DVDE_FACTOR), SUM(DEVT_FACTOR*(DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO)),
            SUM(DEVT_FACTOR*DVDE_IVAMONTO), SUM(DEVT_FACTOR*DVDE_TOTAL),
            MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD), max(v.devt_sucursal)
            FROM devoluciones_ventas_detalle D, DEVOLUCIONES_VENTAS V, PREFIJOS P, terceros T, CLIENTES C, ARTICULO A
            WHERE C.TERC_NIT = T.TERC_NIT AND TERC_CLIE = 'S' AND V.terc_nit = T.terc_nit AND T.TERC_NIT >= :TERINI AND T.TERC_NIT <= :TERFIN AND
            V.DEVT_ID = D.DEVT_ID AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND DEVT_ANULADO = 'N'
            AND P.PREF_PRE = V.PREF_PRE AND P.TIDO_COD = 33 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) and substring(D.arti_cod from 1 FOR 2) <> '.t'
            AND D.ARTI_COD = A.arti_cod AND A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN
            GROUP BY T.TERC_NIT, v.devt_sucursal, D.ARTI_COD
            INTO :NIT, :NOMBRE, :TELEFONO, :CIUDAD, :CODZONA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :TOTAL,
                :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :sucursal
            DO
            BEGIN
            COSTO = 0;
            FOR SELECT V.DEVT_ID, DVDE_ITEM, DVDE_CANT * DVDE_FACTOR, DEVT_FECHA
                FROM devoluciones_ventas_detalle D, DEVOLUCIONES_VENTAS V, PREFIJOS P
                WHERE V.terc_nit = :nit AND V.DEVT_ID = D.DEVT_ID AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND DEVT_ANULADO = 'N'
                AND P.PREF_PRE = V.PREF_PRE AND P.TIDO_COD = 33 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                AND D.ARTI_COD = :articulo INTO :ID, :ITEM, :cantdet, :fecha
                DO
                BEGIN
                if (EXISTS (SELECT COST_ENTP / COST_ENTC FROM COSTOS C, MOVIMIENTO_ARTICULO M
                    WHERE COST_IDMOV = MVAR_CONS AND MVAR_TIPODOC = 33 AND MVAR_IDREF = :ID AND COST_ENTC <> 0 AND MVAR_ITEM = :ITEM)) then
                    SELECT COST_ENTP / COST_ENTC FROM COSTOS C, MOVIMIENTO_ARTICULO M
                        WHERE COST_IDMOV = MVAR_CONS AND MVAR_TIPODOC = 33 AND MVAR_IDREF = :ID AND COST_ENTC <> 0 AND MVAR_ITEM = :ITEM INTO :costounit;
                else
                    EXECUTE PROCEDURE COSTO_PROMEDIO(:ARTICULO, :FECHA) returning_values (:costounit);
                /* EL FACTOR */
                FACCOST = 1;
                SELECT FIRST 1 FACO_FACTOR FROM factor_costo WHERE FACO_FECINI <= :FECHA AND FACO_FECFIN >= :FECHA INTO :FACCOST;
                COSTOUNIT = COSTOUNIT * FACCOST;

                COSTO = COSTO + costounit * cantdet;
                END
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            TOTAL = TOTAL * -1;
            IVA = IVA * -1;
            BASE = BASE * -1;
            CANTIDAD = CANTIDAD * -1;
            COSTO = COSTO * -1;
            UTILIDAD = UTILIDAD * -1;
            if (CEROS = 'S') then
                INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (3, USER, :ARTICULO);
            SUSPEND;
            END /* FOR */
        if (CEROS = 'S') then
            BEGIN
            COSTO = 0;
            UTILIDAD = 0;
            PORC = 0;
            /* agregue los articulos sin factura */
            FOR SELECT ARTI_COD, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN
                INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                DO
                BEGIN
                SELECT COUNT(REPA_ARTICULO) FROM REPORTES_AUX WHERE REPA_ID = 3 AND REPA_USER = USER AND REPA_ARTICULO = :articulo INTO :numrows;
                if (numrows = 0) then
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        END
    if (BIN_AND(TIPO, 8) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 34 INTO :NOMTIPO;
        /* BORRA LA TABLA AUXILIAR */
        DELETE FROM reportes_aux WHERE REPA_ID = 3 AND REPA_USER = USER;

        FOR SELECT MAX(T.TERC_NIT), MAX(TERC_NOM), MAX(TERC_TEL), MAX(TERC_CIU), MAX(ZONA_COD), MAX(D.ARTI_COD), SUM(PEDE_CANT * PEDE_FACTOR),
            SUM(PEDI_FACTOR*(PEDE_TOTAL-PEDE_IVAMONTO-PEDE_CONSUMO)), SUM(PEDI_FACTOR*PEDE_IVAMONTO), SUM(PEDI_FACTOR*PEDE_TOTAL),
            MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD), max(p.pedi_sucursal)
            FROM PEDIDOS_DETALLE D, PEDIDOS P, PREFIJOS PR, terceros T, CLIENTES C, ARTICULO A
            WHERE C.TERC_NIT = T.TERC_NIT AND TERC_CLIE = 'S' AND P.terc_nit = T.terc_nit AND T.TERC_NIT >= :TERINI AND T.TERC_NIT <= :TERFIN AND
            P.PEDI_ID = D.PEDI_ID AND PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND PEDI_ANULADO = 'N'
            AND PR.PREF_PRE = P.PREF_PRE AND P.TIDO_COD = 34 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY T.TERC_NIT, p.pedi_sucursal, D.ARTI_COD
            INTO :NIT, :NOMBRE, :TELEFONO, :CIUDAD, :CODZONA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :TOTAL,
                :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :sucursal
            DO
            BEGIN
            COSTO = 0;
            FOR SELECT PEDE_CANT * PEDE_FACTOR, PEDI_FECHA
                FROM PEDIDOS_DETALLE D, PEDIDOS PE, PREFIJOS P
                WHERE PE.terc_nit = :nit AND PE.PEDI_ID = D.PEDI_ID AND PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND PEDI_ANULADO = 'N'
                AND P.PREF_PRE = PE.PREF_PRE AND P.TIDO_COD = 34 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                AND D.ARTI_COD = :articulo INTO :cantdet, :fecha
                DO
                BEGIN
                EXECUTE PROCEDURE COSTO_PROMEDIO(:ARTICULO, :FECHA) returning_values (:costounit);
                /* EL FACTOR */
                FACCOST = 1;
                SELECT FIRST 1 FACO_FACTOR FROM factor_costo WHERE FACO_FECINI <= :FECHA AND FACO_FECFIN >= :FECHA INTO :FACCOST;
                COSTOUNIT = COSTOUNIT * FACCOST;

                COSTO = COSTO + costounit * cantdet;
                END
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            if (CEROS = 'S') then
                INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (3, USER, :ARTICULO);
            SUSPEND;
            END /* FOR */
        if (CEROS = 'S') then
            BEGIN
            COSTO = 0;
            UTILIDAD = 0;
            PORC = 0;
            /* agregue los articulos sin factura */
            FOR SELECT ARTI_COD, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN
                INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                DO
                BEGIN
                SELECT COUNT(REPA_ARTICULO) FROM REPORTES_AUX WHERE REPA_ID = 3 AND REPA_USER = USER AND REPA_ARTICULO = :articulo INTO :numrows;
                if (numrows = 0) then
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        END
    if (BIN_AND(TIPO, 16) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 35 INTO :NOMTIPO;
        /* BORRA LA TABLA AUXILIAR */
        DELETE FROM reportes_aux WHERE REPA_ID = 3 AND REPA_USER = USER;

        FOR SELECT MAX(T.TERC_NIT), MAX(TERC_NOM), MAX(TERC_TEL), MAX(TERC_CIU), MAX(ZONA_COD), MAX(D.ARTI_COD), SUM(CTDE_CANT * CTDE_FACTOR),
            SUM(COTI_FACTOR*(CTDE_TOTAL-CTDE_IVAMONTO-CTDE_CONSUMO)), SUM(COTI_FACTOR*CTDE_IVAMONTO), SUM(COTI_FACTOR*CTDE_TOTAL),
            MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD), max(ct.coti_sucursal)
            FROM COTIZACIONES_DETALLE D, COTIZACIONES CT, PREFIJOS P, terceros T, CLIENTES C, ARTICULO A
            WHERE C.TERC_NIT = T.TERC_NIT AND TERC_CLIE = 'S' AND C.terc_nit = T.terc_nit AND T.TERC_NIT >= :TERINI AND T.TERC_NIT <= :TERFIN AND
            CT.COTI_ID = D.COTI_ID AND COTI_FECHA >= :FECINI AND COTI_FECHA <= :FECFIN AND COTI_ANULADO = 'N'
            AND P.PREF_PRE = CT.PREF_PRE AND P.TIDO_COD = 35 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY T.TERC_NIT, ct.coti_sucursal, D.ARTI_COD
            INTO :NIT, :NOMBRE, :TELEFONO, :CIUDAD, :CODZONA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :TOTAL,
                :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :sucursal
            DO
            BEGIN
            COSTO = 0;
            FOR SELECT CTDE_CANT * CTDE_FACTOR, COTI_FECHA
                FROM COTIZACIONES_DETALLE D, COTIZACIONES C, PREFIJOS P
                WHERE C.terc_nit = :nit AND C.COTI_ID = D.coti_id AND COTI_FECHA >= :FECINI AND COTI_FECHA <= :FECFIN AND COTI_ANULADO = 'N'
                AND P.PREF_PRE = C.PREF_PRE AND P.TIDO_COD = 35 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                AND D.ARTI_COD = :articulo INTO :cantdet, :fecha
                DO
                BEGIN
                EXECUTE PROCEDURE COSTO_PROMEDIO(:ARTICULO, :FECHA) returning_values (:costounit);
                /* EL FACTOR */
                FACCOST = 1;
                SELECT FIRST 1 FACO_FACTOR FROM factor_costo WHERE FACO_FECINI <= :FECHA AND FACO_FECFIN >= :FECHA INTO :FACCOST;
                COSTOUNIT = COSTOUNIT * FACCOST;

                COSTO = COSTO + costounit * cantdet;
                END
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            EXECUTE PROCEDURE costo_promedio (:ARTICULO, :FECFIN) RETURNING_VALUES (:COSTOUNIT);
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            if (CEROS = 'S') then
                INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (3, USER, :ARTICULO);
            SUSPEND;
            END /* FOR */
        if (CEROS = 'S') then
            BEGIN
            COSTO = 0;
            UTILIDAD = 0;
            PORC = 0;
            /* agregue los articulos sin factura */
            FOR SELECT ARTI_COD, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN
                INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                DO
                BEGIN
                SELECT COUNT(REPA_ARTICULO) FROM REPORTES_AUX WHERE REPA_ID = 3 AND REPA_USER = USER AND REPA_ARTICULO = :articulo INTO :numrows;
                if (numrows = 0) then
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        END
    END
ELSE
    BEGIN
    if (BIN_AND(TIPO, 1) <> 0) then
            BEGIN
            SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 31 INTO :NOMTIPO;
            FOR SELECT F.PREF_PRE, FACT_NUMERO, FACT_FECHA, ARTI_COD, FADE_CANT * FADE_FACTOR, (FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO)*FACT_FACTOR,
                FADE_IVAMONTO*FACT_FACTOR, FADE_DTOPORC, FADE_TOTAL*FACT_FACTOR, F.terc_nit, F.fact_nomcliente, f.fact_sucursal
                FROM FACTURAS F, FACTURAS_DETALLE D, PREFIJOS P
                WHERE F.FACT_ID = D.FACT_ID AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND F.TERC_NIT >= :TERINI AND F.TERC_NIT <= :TERFIN AND FACT_ANULADO = 'N'
                 AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) and substring(D.arti_cod from 1 FOR 2) <> '.t'
                ORDER BY f.terc_nit, f.fact_sucursal, ARTI_COD, FACT_FECHA, F.FACT_ID, FADE_ITEM
                INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :DTO, :TOTAL, :NIT, :nombre, :sucursal
                DO
                BEGIN
                SELECT ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO WHERE ARTI_COD = :ARTICULO
                    INTO :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC;
                SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                EXECUTE PROCEDURE costo_promedio (:ARTICULO, :FECHA) RETURNING_VALUES (:COSTOUNIT);
                /* EL FACTOR */
                FACCOST = 1;
                SELECT FIRST 1 FACO_FACTOR FROM factor_costo WHERE FACO_FECINI <= :FECHA AND FACO_FECFIN >= :FECHA INTO :FACCOST;
                COSTOUNIT = COSTOUNIT * FACCOST;

                COSTO = COSTOUNIT * CANTIDAD;
                UTILIDAD = BASE - COSTO;
                if (UOM = 'UTILIDAD') then
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                else
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
                SUSPEND;
                END
            END
    if (BIN_AND(TIPO, 2) <> 0) then
            BEGIN
            SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 32 INTO :NOMTIPO;
            FOR SELECT R.PREF_PRE, REVT_NUMERO, REVT_FECHA, ARTI_COD, RVDE_CANT * RVDE_FACTOR,
                (RVDE_TOTAL - RVDE_IVAMONTO), RVDE_IVAMONTO, RVDE_DTOPORC, RVDE_TOTAL, R.terc_nit, R.revt_nomterc, r.revt_sucursal
                FROM REMISIONES_VENTA R, REMISIONES_VENTA_DETALLE D, PREFIJOS P
                WHERE R.REVT_ID = D.REVT_ID AND REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN AND R.TERC_NIT >= :TERINI AND R.TERC_NIT <= :TERFIN AND REVT_ANULADO = 'N'
                 AND P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = 32 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                ORDER BY r.terc_nit, r.revt_sucursal, ARTI_COD, REVT_FECHA, R.REVT_ID, RVDE_ITEM
                INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :DTO, :TOTAL, :NIT, :nombre, :sucursal
                DO
                BEGIN
                SELECT ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO WHERE ARTI_COD = :ARTICULO
                    INTO :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC;
                SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                EXECUTE PROCEDURE costo_promedio (:ARTICULO, :FECHA) RETURNING_VALUES (:COSTOUNIT);
                /* EL FACTOR */
                FACCOST = 1;
                SELECT FIRST 1 FACO_FACTOR FROM factor_costo WHERE FACO_FECINI <= :FECHA AND FACO_FECFIN >= :FECHA INTO :FACCOST;
                COSTOUNIT = COSTOUNIT * FACCOST;

                COSTO = COSTOUNIT * CANTIDAD;
                UTILIDAD = BASE - COSTO;
                if (UOM = 'UTILIDAD') then
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                else
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
                SUSPEND;
                END
            END
    if (BIN_AND(TIPO, 4) <> 0) then
            BEGIN
            SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 33 INTO :NOMTIPO;
            FOR SELECT V.PREF_PRE, DEVT_NUMERO, DEVT_FECHA, ARTI_COD, DVDE_CANT * DVDE_FACTOR, (DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO)*DEVT_FACTOR,
                DVDE_IVAMONTO*DEVT_FACTOR, DVDE_DTOPORC, DVDE_TOTAL*DEVT_FACTOR, V.terc_nit, V.devt_nomterc, v.devt_sucursal
                FROM DEVOLUCIONES_VENTAS V, DEVOLUCIONES_VENTAS_DETALLE D, PREFIJOS P
                WHERE V.DEVT_ID = D.DEVT_ID AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND V.TERC_NIT >= :TERINI AND V.TERC_NIT <= :TERFIN AND DEVT_ANULADO = 'N'
                 AND P.PREF_PRE = V.PREF_PRE AND P.TIDO_COD = 33 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))  and substring(D.arti_cod from 1 FOR 2) <> '.t'
                ORDER BY v.terc_nit, v.devt_sucursal, ARTI_COD, DEVT_FECHA, D.DEVT_ID, DVDE_ITEM
                INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :DTO, :TOTAL, :NIT, :nombre, :sucursal
                DO
                BEGIN
                SELECT ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO WHERE ARTI_COD = :ARTICULO
                    INTO :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC;
                SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                EXECUTE PROCEDURE costo_promedio (:ARTICULO, :FECHA) RETURNING_VALUES (:COSTOUNIT);
                /* EL FACTOR */
                FACCOST = 1;
                SELECT FIRST 1 FACO_FACTOR FROM factor_costo WHERE FACO_FECINI <= :FECHA AND FACO_FECFIN >= :FECHA INTO :FACCOST;
                COSTOUNIT = COSTOUNIT * FACCOST;

                COSTO = COSTOUNIT * CANTIDAD;
                UTILIDAD = BASE - COSTO;
                if (UOM = 'UTILIDAD') then
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                else
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
                TOTAL = TOTAL * -1;
                IVA = IVA * -1;
                BASE = BASE * -1;
                CANTIDAD = CANTIDAD * -1;
                COSTO = COSTO * -1;
                UTILIDAD = UTILIDAD * -1;
                SUSPEND;
                END
            END
    if (BIN_AND(TIPO, 8) <> 0) then
            BEGIN
            SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 34 INTO :NOMTIPO;
            FOR SELECT P.PREF_PRE, PEDI_NUMERO, PEDI_FECHA, ARTI_COD, PEDE_CANT * PEDE_FACTOR, (PEDE_TOTAL-PEDE_IVAMONTO-PEDE_CONSUMO)*PEDI_FACTOR,
                PEDE_IVAMONTO*PEDI_FACTOR, PEDE_DTOPORC, PEDE_TOTAL*PEDI_FACTOR, P.terc_nit, P.pedi_nomterc, p.pedi_sucursal
                FROM PEDIDOS P, PEDIDOS_DETALLE D, PREFIJOS PR
                WHERE P.PEDI_ID = D.PEDI_ID AND PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND P.TERC_NIT >= :TERINI AND P.TERC_NIT <= :TERFIN AND PEDI_ANULADO = 'N'
                 AND P.PREF_PRE = PR.PREF_PRE AND P.TIDO_COD = 34 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                ORDER BY p.terc_nit, p.pedi_sucursal, ARTI_COD, PEDI_FECHA, P.PEDI_ID, PEDE_ITEM
                INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :DTO, :TOTAL, :NIT, :nombre, :sucursal
                DO
                BEGIN
                SELECT ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO WHERE ARTI_COD = :ARTICULO
                    INTO :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC;
                SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                EXECUTE PROCEDURE costo_promedio (:ARTICULO, :FECHA) RETURNING_VALUES (:COSTOUNIT);
                /* EL FACTOR */
                FACCOST = 1;
                SELECT FIRST 1 FACO_FACTOR FROM factor_costo WHERE FACO_FECINI <= :FECHA AND FACO_FECFIN >= :FECHA INTO :FACCOST;
                COSTOUNIT = COSTOUNIT * FACCOST;

                COSTO = COSTOUNIT * CANTIDAD;
                UTILIDAD = BASE - COSTO;
                if (UOM = 'UTILIDAD') then
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                else
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
                SUSPEND;
                END
            END
    if (BIN_AND(TIPO, 16) <> 0) then
            BEGIN
            SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 35 INTO :NOMTIPO;
            FOR SELECT C.PREF_PRE, COTI_NUMERO, COTI_FECHA, ARTI_COD, CTDE_CANT * CTDE_FACTOR, (CTDE_TOTAL-CTDE_IVAMONTO-CTDE_CONSUMO)*COTI_FACTOR,
                CTDE_IVAMONTO*COTI_FACTOR, CTDE_DTOPORC, CTDE_TOTAL*COTI_FACTOR, C.terc_nit, C.coti_nomterc, c.coti_sucursal
                FROM COTIZACIONES C, COTIZACIONES_DETALLE D, PREFIJOS P
                WHERE C.COTI_ID = D.COTI_ID AND ARTI_COD = :ARTICULO AND COTI_FECHA >= :FECINI AND COTI_FECHA <= :FECFIN AND C.TERC_NIT >= :TERINI AND C.TERC_NIT <= :TERFIN AND COTI_ANULADO = 'N'
                 AND P.PREF_PRE = C.PREF_PRE AND P.TIDO_COD = 35 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                ORDER BY c.terc_nit, c.coti_sucursal, COTI_FECHA, C.COTI_ID, CTDE_ITEM
                INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :DTO, :TOTAL, :NIT, :nombre, :sucursal
                DO
                BEGIN
                SELECT ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO WHERE ARTI_COD = :ARTICULO
                    INTO :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC;
                SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                EXECUTE PROCEDURE costo_promedio (:ARTICULO, :FECHA) RETURNING_VALUES (:COSTOUNIT);
                /* EL FACTOR */
                FACCOST = 1;
                SELECT FIRST 1 FACO_FACTOR FROM factor_costo WHERE FACO_FECINI <= :FECHA AND FACO_FECFIN >= :FECHA INTO :FACCOST;
                COSTOUNIT = COSTOUNIT * FACCOST;

                COSTO = COSTOUNIT * CANTIDAD;
                UTILIDAD = BASE - COSTO;
                if (UOM = 'UTILIDAD') then
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                else
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
                SUSPEND;
                END
            END
    END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure REP_UTILIDAD_VENDEDOR (
    TIPO integer,
    DETALLE char(1),
    VENINI varchar(20),
    VENFIN varchar(20),
    FECINI date,
    FECFIN date,
    ARTINI varchar(15),
    ARTFIN varchar(15),
    ORDEN char(1),
    CEROS char(1),
    SUBEMPRESA integer)
returns (
    CODVEND varchar(20),
    NOMVEND varchar(60),
    NOMTIPO varchar(50),
    ARTICULO varchar(15),
    DESCRIPCION varchar(60),
    CODGRUPO varchar(2),
    NOMGRUPO varchar(30),
    CODSUBG varchar(3),
    NOMSUBG varchar(30),
    CODMARC varchar(3),
    NOMMARC varchar(30),
    UNIDAD varchar(8),
    CANTIDAD numeric(18,4),
    BASE numeric(18,2),
    IVA numeric(18,2),
    CONSUMO numeric(18,2),
    COSTO numeric(18,2),
    UTILIDAD numeric(18,4),
    PORC numeric(9,2),
    TOTAL numeric(18,2),
    LISTA numeric(18,2),
    PREFIJO varchar(4),
    NUMERO varchar(6),
    FECHA date,
    DTO numeric(9,2))
AS
DECLARE VARIABLE COSTOUNIT NUMERIC(18,4);
DECLARE VARIABLE CANTDET NUMERIC(18,4);
DECLARE VARIABLE CODINI VARCHAR(15);
DECLARE VARIABLE CODFIN VARCHAR(15);
DECLARE VARIABLE DESINI VARCHAR(15);
DECLARE VARIABLE DESFIN VARCHAR(15);
declare variable UOM VARCHAR(20);
declare variable CODLISTA INTEGER;
declare variable ID INTEGER;
declare variable ITEM INTEGER;
declare variable FACCOST NUMERIC(18,4);
BEGIN
if (ORDEN = 'C') then
    BEGIN
    CODINI = ARTINI;
    CODFIN = ARTFIN;
    DESINI = '';
    DESFIN = 'zz';
    END
ELSE
    BEGIN
    DESINI = ARTINI;
    DESFIN = ARTFIN;
    CODINI = '';
    CODFIN = 'zz';
    END
  EXECUTE PROCEDURE lee_configuracion ('FACTURACION', 'ARTICULOS', 'SUGERIR PRECIOS CON PORCENTAJE DE MARGEN O UTILIDAD') returning_values (:UOM);
  SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = :TIPO INTO :NOMTIPO;
  FOR select VEND_COD, VEND_NOMBRE
    from VENDEDORES
    where VEND_COD >= :VENINI AND VEND_COD <= :VENFIN
    INTO :CODVEND, :NOMVEND
    DO  
    BEGIN
    if (DETALLE = 'N') then
        BEGIN
        if (BIN_AND(TIPO, 1) <> 0) then
            BEGIN
            SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 31 INTO :NOMTIPO;
            /* BORRA LA TABLA AUXILIAR */
            DELETE FROM reportes_aux WHERE REPA_ID = 4 AND REPA_USER = USER;
            FOR SELECT MAX(D.ARTI_COD), SUM(FADE_CANT * FADE_FACTOR), SUM(FACT_FACTOR*(FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO)),
                SUM(FACT_FACTOR*FADE_IVAMONTO), SUM(FACT_FACTOR*FADE_TOTAL), SUM(FADE_CONSUMO),
                MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD)
                FROM FACTURAS_DETALLE D, FACTURAS F, PREFIJOS P, ARTICULO A
                WHERE F.FACT_ID = D.FACT_ID AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND VEND_COD = :CODVEND AND FACT_ANULADO = 'N'
                 AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) and substring(D.arti_cod from 1 FOR 2) <> '.t'
                 AND D.ARTI_COD = A.arti_cod AND A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN
                GROUP BY D.ARTI_COD
                INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :TOTAL, :CONSUMO,
                    :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                DO
                BEGIN
                COSTO = 0;
                FOR SELECT F.FACT_ID, FADE_ITEM, FADE_CANT * FADE_FACTOR, FACT_FECHA FROM FACTURAS_DETALLE D, FACTURAS F, PREFIJOS P
                    WHERE F.VEND_COD = :codvend AND F.FACT_ID = D.FACT_ID AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND
                    FACT_ANULADO = 'N' AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                    and D.ARTI_COD = :articulo  INTO :ID, :ITEM, :cantdet, :fecha
                    DO
                    BEGIN
                    if (EXISTS (SELECT COST_SALP / COST_SALC FROM COSTOS C, MOVIMIENTO_ARTICULO M
                        WHERE COST_IDMOV = MVAR_CONS AND MVAR_TIPODOC = 31 AND MVAR_IDREF = :ID AND COST_SALC <> 0 AND MVAR_ITEM = :ITEM)) then
                        SELECT COST_SALP / COST_SALC FROM COSTOS C, MOVIMIENTO_ARTICULO M
                            WHERE COST_IDMOV = MVAR_CONS AND MVAR_TIPODOC = 31 AND MVAR_IDREF = :ID AND COST_SALC <> 0 AND MVAR_ITEM = :ITEM INTO :costounit;
                    else
                        EXECUTE PROCEDURE COSTO_PROMEDIO(:ARTICULO, :FECHA) returning_values (:costounit);
                    /* EL FACTOR */
                    FACCOST = 1;
                    SELECT FIRST 1 FACO_FACTOR FROM factor_costo WHERE FACO_FECINI <= :FECHA AND FACO_FECFIN >= :FECHA INTO :FACCOST;
                    COSTOUNIT = COSTOUNIT * FACCOST;

                    COSTO = COSTO + costounit * cantdet;
                    END
                SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                if (CANTIDAD IS NULL) then
                    CANTIDAD = 0;
                if (BASE IS NULL) then
                    BASE = 0;
                if (IVA IS NULL) then
                    IVA = 0;
                UTILIDAD = BASE - COSTO;
                if (UOM = 'UTILIDAD') then
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                else
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
                if (CEROS = 'S') then
                    begin
                    INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (4, USER, :ARTICULO);
                    SUSPEND;
                    end
                ELSE
                    if ((BASE <> 0) AND (CANTIDAD <> 0)) then
                        SUSPEND;
                END
            if (CEROS = 'S') then
                BEGIN
                COSTO = 0;
                UTILIDAD = 0;
                PORC = 0;
                /* agregue los articulos sin factura */
                FOR SELECT ARTI_COD, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN and
                    not exists (select REPA_ARTICULO FROM REPORTES_AUX WHERE REPA_ID = 4 AND REPA_USER = USER AND REPA_ARTICULO = a.arti_cod)
                    INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                    DO
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        if (BIN_AND(TIPO, 2) <> 0) then
            BEGIN
            SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 32 INTO :NOMTIPO;
            FOR SELECT MAX(D.ARTI_COD), SUM(RVDE_CANT * RVDE_FACTOR), SUM(RVDE_TOTAL-RVDE_IVAMONTO-RVDE_CONSUMO), SUM(RVDE_IVAMONTO), SUM(RVDE_TOTAL), SUM(RVDE_CONSUMO),
                MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD)
                FROM REMISIONES_VENTA_DETALLE D, REMISIONES_VENTA R, PREFIJOS P, ARTICULO A
                WHERE R.REVT_ID = D.REVT_ID AND REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN AND VEND_COD = :CODVEND AND REVT_ANULADO = 'N'
                 AND P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = 32 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                 AND D.ARTI_COD = A.arti_cod AND A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN
                GROUP BY D.ARTI_COD
                INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :TOTAL, :CONSUMO,
                    :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                DO
                BEGIN
                COSTO = 0;
                FOR SELECT F.REVT_ID, RVDE_ITEM, RVDE_CANT * RVDE_FACTOR, REVT_FECHA FROM remisiones_venta_detalle D, remisiones_venta F, PREFIJOS P
                    WHERE F.VEND_COD = :codvend AND F.revt_id = D.revt_id AND REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN AND
                    REVT_ANULADO = 'N' AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 32 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                    and D.ARTI_COD = :articulo  INTO :ID, :ITEM, :cantdet, :fecha
                    DO
                    BEGIN
                    if (EXISTS (SELECT COST_SALP / COST_SALC FROM COSTOS C, MOVIMIENTO_ARTICULO M
                        WHERE COST_IDMOV = MVAR_CONS AND MVAR_TIPODOC = 32 AND MVAR_IDREF = :ID AND COST_SALC <> 0 AND MVAR_ITEM = :ITEM)) then
                        SELECT COST_SALP / COST_SALC FROM COSTOS C, MOVIMIENTO_ARTICULO M
                            WHERE COST_IDMOV = MVAR_CONS AND MVAR_TIPODOC = 32 AND MVAR_IDREF = :ID AND COST_SALC <> 0 AND MVAR_ITEM = :ITEM INTO :costounit;
                    else
                        EXECUTE PROCEDURE COSTO_PROMEDIO(:ARTICULO, :FECHA) returning_values (:costounit);
                    /* EL FACTOR */
                    FACCOST = 1;
                    SELECT FIRST 1 FACO_FACTOR FROM factor_costo WHERE FACO_FECINI <= :FECHA AND FACO_FECFIN >= :FECHA INTO :FACCOST;
                    COSTOUNIT = COSTOUNIT * FACCOST;

                    COSTO = COSTO + costounit * cantdet;
                    END
                SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                if (CANTIDAD IS NULL) then
                    CANTIDAD = 0;
                if (BASE IS NULL) then
                    BASE = 0;
                if (IVA IS NULL) then
                    IVA = 0;
                UTILIDAD = BASE - COSTO;
                if (UOM = 'UTILIDAD') then
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                else
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
                if (CEROS = 'S') then
                    begin
                    INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (4, USER, :ARTICULO);
                    SUSPEND;
                    end
                ELSE
                    if ((BASE <> 0) AND (CANTIDAD <> 0)) then
                        SUSPEND;
                END
            if (CEROS = 'S') then
                BEGIN
                COSTO = 0;
                UTILIDAD = 0;
                PORC = 0;
                /* agregue los articulos sin factura */
                FOR SELECT ARTI_COD, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN and
                    not exists (select REPA_ARTICULO FROM REPORTES_AUX WHERE REPA_ID = 4 AND REPA_USER = USER AND REPA_ARTICULO = a.arti_cod)
                    INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                    DO
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        if (BIN_AND(TIPO, 4) <> 0) then
            BEGIN
            SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 33 INTO :NOMTIPO;
            FOR SELECT MAX(D.ARTI_COD), SUM(DVDE_CANT * DVDE_FACTOR), SUM(DEVT_FACTOR*(DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO)),
                SUM(DEVT_FACTOR*DVDE_IVAMONTO), SUM(DEVT_FACTOR*DVDE_TOTAL), SUM(DVDE_CONSUMO),
                MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD)
                FROM devoluciones_ventas_detalle D, DEVOLUCIONES_VENTAS V, PREFIJOS P, ARTICULO A
                WHERE V.DEVT_ID = D.DEVT_ID AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND VEND_COD = :CODVEND AND DEVT_ANULADO = 'N'
                 AND P.PREF_PRE = V.PREF_PRE AND P.TIDO_COD = 33 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) and substring(D.arti_cod from 1 FOR 2) <> '.t'
                 AND D.ARTI_COD = A.arti_cod AND A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN
                GROUP BY D.ARTI_COD
                INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :TOTAL, :CONSUMO,
                    :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                DO
                BEGIN
                COSTO = 0;
                FOR SELECT F.DEVT_ID, DVDE_ITEM, DVDE_CANT * DVDE_FACTOR, DEVT_FECHA FROM devoluciones_ventas_detalle D, devoluciones_ventas F, PREFIJOS P
                    WHERE F.VEND_COD = :codvend AND F.devt_id = D.devt_id AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND
                    DEVT_ANULADO = 'N' AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 33 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                    and D.ARTI_COD = :articulo  INTO :ID, :ITEM, :cantdet, :fecha
                    DO
                    BEGIN
                    if (EXISTS (SELECT COST_ENTP / COST_ENTC FROM COSTOS C, MOVIMIENTO_ARTICULO M
                        WHERE COST_IDMOV = MVAR_CONS AND MVAR_TIPODOC = 33 AND MVAR_IDREF = :ID AND COST_ENTC <> 0 AND MVAR_ITEM = :ITEM)) then
                        SELECT COST_ENTP / COST_ENTC FROM COSTOS C, MOVIMIENTO_ARTICULO M
                            WHERE COST_IDMOV = MVAR_CONS AND MVAR_TIPODOC = 33 AND MVAR_IDREF = :ID AND COST_ENTC <> 0 AND MVAR_ITEM = :ITEM INTO :costounit;
                    else
                        EXECUTE PROCEDURE COSTO_PROMEDIO(:ARTICULO, :FECHA) returning_values (:costounit);
                    /* EL FACTOR */
                    FACCOST = 1;
                    SELECT FIRST 1 FACO_FACTOR FROM factor_costo WHERE FACO_FECINI <= :FECHA AND FACO_FECFIN >= :FECHA INTO :FACCOST;
                    COSTOUNIT = COSTOUNIT * FACCOST;

                    COSTO = COSTO + costounit * cantdet;
                    END
                SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                if (CANTIDAD IS NULL) then
                    CANTIDAD = 0;
                if (BASE IS NULL) then
                    BASE = 0;
                if (IVA IS NULL) then
                    IVA = 0;
                UTILIDAD = BASE - COSTO;
                if (UOM = 'UTILIDAD') then
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                else
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
                TOTAL = TOTAL * -1;
                IVA = IVA * -1;
                BASE = BASE * -1;
                CANTIDAD = CANTIDAD * -1;
                COSTO = COSTO * -1;
                UTILIDAD = UTILIDAD * -1;
                if (CEROS = 'S') then
                    begin
                    INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (4, USER, :ARTICULO);
                    SUSPEND;
                    end
                ELSE
                    if ((BASE <> 0) AND (CANTIDAD <> 0)) then
                        SUSPEND;
                END
            if (CEROS = 'S') then
                BEGIN
                COSTO = 0;
                UTILIDAD = 0;
                PORC = 0;
                /* agregue los articulos sin factura */
                FOR SELECT ARTI_COD, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN and
                    not exists (select REPA_ARTICULO FROM REPORTES_AUX WHERE REPA_ID = 4 AND REPA_USER = USER AND REPA_ARTICULO = a.arti_cod)
                    INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                    DO
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        if (BIN_AND(TIPO, 8) <> 0) then
            BEGIN
            SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 34 INTO :NOMTIPO;
            FOR SELECT MAX(D.ARTI_COD), SUM(PEDE_CANT * PEDE_FACTOR), SUM(PEDI_FACTOR*(PEDE_TOTAL-PEDE_IVAMONTO-PEDE_CONSUMO)),
                SUM(PEDI_FACTOR*PEDE_IVAMONTO), SUM(PEDI_FACTOR*PEDE_TOTAL), SUM(PEDE_CONSUMO),
                MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD)
                FROM PEDIDOS_DETALLE D, PEDIDOS P, PREFIJOS PR, articulo A
                WHERE P.PEDI_ID = D.PEDI_ID AND PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND VEND_COD = :CODVEND AND PEDI_ANULADO = 'N'
                 AND PR.PREF_PRE = P.PREF_PRE AND P.TIDO_COD = 34 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                 AND D.ARTI_COD = A.arti_cod AND A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN
                GROUP BY D.ARTI_COD
                INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :TOTAL, :CONSUMO,
                    :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                DO
                BEGIN
                COSTO = 0;
                FOR SELECT PEDE_CANT * PEDE_FACTOR, PEDI_FECHA FROM pedidos_detalle D, PEDIDOS F, PREFIJOS P
                    WHERE F.VEND_COD = :codvend AND F.pedi_id = D.pedi_id AND PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND
                    PEDI_ANULADO = 'N' AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 34 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                    and D.ARTI_COD = :articulo  INTO :cantdet, :fecha
                    DO
                    BEGIN
                    EXECUTE PROCEDURE COSTO_PROMEDIO(:ARTICULO, :FECHA) returning_values (:costounit);
                    /* EL FACTOR */
                    FACCOST = 1;
                    SELECT FIRST 1 FACO_FACTOR FROM factor_costo WHERE FACO_FECINI <= :FECHA AND FACO_FECFIN >= :FECHA INTO :FACCOST;
                    COSTOUNIT = COSTOUNIT * FACCOST;

                    COSTO = COSTO + costounit * cantdet;
                    END
                SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                if (CANTIDAD IS NULL) then
                    CANTIDAD = 0;
                if (BASE IS NULL) then
                    BASE = 0;
                if (IVA IS NULL) then
                    IVA = 0;
                UTILIDAD = BASE - COSTO;
                if (UOM = 'UTILIDAD') then
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                else
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
                if (CEROS = 'S') then
                    begin
                    INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (4, USER, :ARTICULO);
                    SUSPEND;
                    end
                ELSE
                    if ((BASE <> 0) AND (CANTIDAD <> 0)) then
                        SUSPEND;
                END
            if (CEROS = 'S') then
                BEGIN
                COSTO = 0;
                UTILIDAD = 0;
                PORC = 0;
                /* agregue los articulos sin factura */
                FOR SELECT ARTI_COD, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN and
                    not exists (select REPA_ARTICULO FROM REPORTES_AUX WHERE REPA_ID = 4 AND REPA_USER = USER AND REPA_ARTICULO = a.arti_cod)
                    INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                    DO
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        if (BIN_AND(TIPO, 16) <> 0) then
            BEGIN
            SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 35 INTO :NOMTIPO;
            FOR SELECT MAX(D.ARTI_COD), SUM(CTDE_CANT * CTDE_FACTOR), SUM(COTI_FACTOR*(CTDE_TOTAL-CTDE_IVAMONTO-CTDE_CONSUMO)),
                SUM(COTI_FACTOR*CTDE_IVAMONTO), SUM(COTI_FACTOR*CTDE_TOTAL), SUM(CTDE_CONSUMO),
                MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD)
                FROM COTIZACIONES_DETALLE D, COTIZACIONES C, PREFIJOS P, ARTICULO A
                WHERE C.COTI_ID = D.COTI_ID AND COTI_FECHA >= :FECINI AND COTI_FECHA <= :FECFIN AND VEND_COD = :CODVEND AND COTI_ANULADO = 'N'
                 AND P.PREF_PRE = C.PREF_PRE AND P.TIDO_COD = 35 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                 AND D.ARTI_COD = A.arti_cod AND A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN
                GROUP BY D.ARTI_COD
                INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :TOTAL, :CONSUMO,
                    :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                DO
                BEGIN
                COSTO = 0;
                FOR SELECT PEDE_CANT * PEDE_FACTOR, PEDI_FECHA FROM pedidos_detalle D, PEDIDOS F, PREFIJOS P
                    WHERE F.VEND_COD = :codvend AND F.pedi_id = D.pedi_id AND PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND
                    PEDI_ANULADO = 'N' AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 34 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                    and D.ARTI_COD = :articulo  INTO :cantdet, :fecha
                    DO
                    BEGIN
                    EXECUTE PROCEDURE COSTO_PROMEDIO(:ARTICULO, :FECHA) returning_values (:costounit);
                    /* EL FACTOR */
                    FACCOST = 1;
                    SELECT FIRST 1 FACO_FACTOR FROM factor_costo WHERE FACO_FECINI <= :FECHA AND FACO_FECFIN >= :FECHA INTO :FACCOST;
                    COSTOUNIT = COSTOUNIT * FACCOST;

                    COSTO = COSTO + costounit * cantdet;
                    END
                SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                if (CANTIDAD IS NULL) then
                    CANTIDAD = 0;
                if (BASE IS NULL) then
                    BASE = 0;
                if (IVA IS NULL) then
                    IVA = 0;
                COSTO = CANTIDAD * COSTOUNIT;
                UTILIDAD = BASE - COSTO;
                if (UOM = 'UTILIDAD') then
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                else
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
                if (CEROS = 'S') then
                    begin
                    INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (4, USER, :ARTICULO);
                    SUSPEND;
                    end
                ELSE
                    if ((BASE <> 0) AND (CANTIDAD <> 0)) then
                        SUSPEND;
                END
            if (CEROS = 'S') then
                BEGIN
                COSTO = 0;
                UTILIDAD = 0;
                PORC = 0;
                /* agregue los articulos sin factura */
                FOR SELECT ARTI_COD, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN and
                    not exists (select REPA_ARTICULO FROM REPORTES_AUX WHERE REPA_ID = 4 AND REPA_USER = USER AND REPA_ARTICULO = a.arti_cod)
                    INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                    DO
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        END
    ELSE
        BEGIN
        if (BIN_AND(TIPO, 1) <> 0) then
            BEGIN
            SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 31 INTO :NOMTIPO;
            FOR SELECT F.fact_id, D.fade_item, F.PREF_PRE, FACT_NUMERO, FACT_FECHA, ARTI_COD, FADE_CANT * FADE_FACTOR, (FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO)*FACT_FACTOR,
                FADE_IVAMONTO*FACT_FACTOR, FADE_DTOPORC, FADE_TOTAL*FACT_FACTOR, FADE_CONSUMO, D.lipr_cod
                FROM FACTURAS F, FACTURAS_DETALLE D, PREFIJOS P
                WHERE F.FACT_ID = D.FACT_ID AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND VEND_COD = :CODVEND AND FACT_ANULADO = 'N'
                 AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) and substring(D.arti_cod from 1 FOR 2) <> '.t'
                ORDER BY ARTI_COD, FACT_FECHA, F.FACT_ID, FADE_ITEM
                INTO :ID, :ITEM, :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :DTO, :TOTAL, :CONSUMO, :codlista
                DO
                BEGIN
                SELECT ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO WHERE ARTI_COD = :ARTICULO
                    INTO :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC;
                SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                if (EXISTS (SELECT COST_SALP / COST_SALC FROM COSTOS C, MOVIMIENTO_ARTICULO M
                    WHERE COST_IDMOV = MVAR_CONS AND MVAR_TIPODOC = 31 AND MVAR_IDREF = :ID AND COST_SALC <> 0 AND MVAR_ITEM = :ITEM)) then
                    SELECT COST_SALP / COST_SALC FROM COSTOS C, MOVIMIENTO_ARTICULO M
                        WHERE COST_IDMOV = MVAR_CONS AND MVAR_TIPODOC = 31 AND MVAR_IDREF = :ID AND COST_SALC <> 0 AND MVAR_ITEM = :ITEM INTO :costounit;
                else
                    EXECUTE PROCEDURE costo_promedio (:ARTICULO, :FECHA) RETURNING_VALUES (:COSTOUNIT);
                /* EL FACTOR */
                FACCOST = 1;
                SELECT FIRST 1 FACO_FACTOR FROM factor_costo WHERE FACO_FECINI <= :FECHA AND FACO_FECFIN >= :FECHA INTO :FACCOST;
                COSTOUNIT = COSTOUNIT * FACCOST;

                LISTA = 0;
                SELECT PRAR_FIJO FROM precios_articulo WHERE LIPR_COD = :CODLISTA AND ARTI_COD = :ARTICULO INTO :LISTA;
                COSTO = COSTOUNIT * CANTIDAD;
                UTILIDAD = BASE - COSTO;
                if (UOM = 'UTILIDAD') then
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                else
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
                if (CEROS = 'S') then
                    INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (4, USER, :ARTICULO);
                SUSPEND;
                END
            if (CEROS = 'S') then
                BEGIN
                COSTO = 0;
                UTILIDAD = 0;
                PORC = 0;
                /* agregue los articulos sin factura */
                FOR SELECT ARTI_COD, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN and
                    not exists (select REPA_ARTICULO FROM REPORTES_AUX WHERE REPA_ID = 4 AND REPA_USER = USER AND REPA_ARTICULO = a.arti_cod)
                    INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                    DO
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        if (BIN_AND(TIPO, 2) <> 0) then
            BEGIN
            SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 32 INTO :NOMTIPO;
            FOR SELECT R.REVT_ID, RVDE_ITEM, R.PREF_PRE, REVT_NUMERO, REVT_FECHA, ARTI_COD, RVDE_CANT * RVDE_FACTOR, (RVDE_TOTAL - RVDE_IVAMONTO), RVDE_IVAMONTO, RVDE_DTOPORC, RVDE_TOTAL, RVDE_CONSUMO, D.lipr_cod
                FROM REMISIONES_VENTA R, REMISIONES_VENTA_DETALLE D, PREFIJOS P
                WHERE R.REVT_ID = D.REVT_ID AND REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN AND VEND_COD = :CODVEND AND REVT_ANULADO = 'N'
                 AND P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = 32 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) and substring(D.arti_cod from 1 FOR 2) <> '.t'
                ORDER BY ARTI_COD, REVT_FECHA, R.REVT_ID, RVDE_ITEM
                INTO :ID, :ITEM, :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :DTO, :TOTAL, :CONSUMO, :codlista
                DO
                BEGIN
                SELECT ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO WHERE ARTI_COD = :ARTICULO
                    INTO :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC;
                SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                if (EXISTS (SELECT COST_SALP / COST_SALC FROM COSTOS C, MOVIMIENTO_ARTICULO M
                    WHERE COST_IDMOV = MVAR_CONS AND MVAR_TIPODOC = 32 AND MVAR_IDREF = :ID AND COST_SALC <> 0 AND MVAR_ITEM = :ITEM)) then
                    SELECT COST_SALP / COST_SALC FROM COSTOS C, MOVIMIENTO_ARTICULO M
                        WHERE COST_IDMOV = MVAR_CONS AND MVAR_TIPODOC = 32 AND MVAR_IDREF = :ID AND COST_SALC <> 0 AND MVAR_ITEM = :ITEM INTO :costounit;
                else
                    EXECUTE PROCEDURE costo_promedio (:ARTICULO, :FECHA) RETURNING_VALUES (:COSTOUNIT);
                /* EL FACTOR */
                FACCOST = 1;
                SELECT FIRST 1 FACO_FACTOR FROM factor_costo WHERE FACO_FECINI <= :FECHA AND FACO_FECFIN >= :FECHA INTO :FACCOST;
                COSTOUNIT = COSTOUNIT * FACCOST;

                LISTA = 0;
                SELECT PRAR_FIJO FROM precios_articulo WHERE LIPR_COD = :CODLISTA AND ARTI_COD = :ARTICULO INTO :LISTA;
                COSTO = COSTOUNIT * CANTIDAD;
                UTILIDAD = BASE - COSTO;
                if (UOM = 'UTILIDAD') then
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                else
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
                if (CEROS = 'S') then
                    INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (4, USER, :ARTICULO);
                SUSPEND;
                END
            if (CEROS = 'S') then
                BEGIN
                COSTO = 0;
                UTILIDAD = 0;
                PORC = 0;
                /* agregue los articulos sin factura */
                FOR SELECT ARTI_COD, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN and
                    not exists (select REPA_ARTICULO FROM REPORTES_AUX WHERE REPA_ID = 4 AND REPA_USER = USER AND REPA_ARTICULO = a.arti_cod)
                    INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                    DO
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        if (BIN_AND(TIPO, 4) <> 0) then
            BEGIN
            SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 33 INTO :NOMTIPO;
            FOR SELECT V.DEVT_ID, DVDE_ITEM, V.PREF_PRE, DEVT_NUMERO, DEVT_FECHA, ARTI_COD, DVDE_CANT * DVDE_FACTOR, (DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO)*DEVT_FACTOR,
                DVDE_IVAMONTO*DEVT_FACTOR, DVDE_DTOPORC, DVDE_TOTAL*DEVT_FACTOR, DVDE_CONSUMO
                FROM DEVOLUCIONES_VENTAS V, DEVOLUCIONES_VENTAS_DETALLE D, PREFIJOS P
                WHERE V.DEVT_ID = D.DEVT_ID AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND VEND_COD = :CODVEND AND DEVT_ANULADO = 'N'
                 AND P.PREF_PRE = V.PREF_PRE AND P.TIDO_COD = 33 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) and substring(D.arti_cod from 1 FOR 2) <> '.t'
                ORDER BY ARTI_COD, DEVT_FECHA, D.DEVT_ID, DVDE_ITEM
                INTO :ID, :ITEM, :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :DTO, :TOTAL, :CONSUMO
                DO
                BEGIN
                SELECT ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO WHERE ARTI_COD = :ARTICULO
                    INTO :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC;
                SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                if (EXISTS (SELECT COST_ENTP / COST_ENTC FROM COSTOS C, MOVIMIENTO_ARTICULO M
                    WHERE COST_IDMOV = MVAR_CONS AND MVAR_TIPODOC = 33 AND MVAR_IDREF = :ID AND COST_ENTC <> 0 AND MVAR_ITEM = :ITEM)) then
                    SELECT COST_ENTP / COST_ENTC FROM COSTOS C, MOVIMIENTO_ARTICULO M
                        WHERE COST_IDMOV = MVAR_CONS AND MVAR_TIPODOC = 33 AND MVAR_IDREF = :ID AND COST_ENTC <> 0 AND MVAR_ITEM = :ITEM INTO :costounit;
                else
                    EXECUTE PROCEDURE costo_promedio (:ARTICULO, :FECHA) RETURNING_VALUES (:COSTOUNIT);
                /* EL FACTOR */
                FACCOST = 1;
                SELECT FIRST 1 FACO_FACTOR FROM factor_costo WHERE FACO_FECINI <= :FECHA AND FACO_FECFIN >= :FECHA INTO :FACCOST;
                COSTOUNIT = COSTOUNIT * FACCOST;

                LISTA = 0;
                COSTO = COSTOUNIT * CANTIDAD;
                UTILIDAD = BASE - COSTO;
                if (UOM = 'UTILIDAD') then
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                else
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
                TOTAL = TOTAL * -1;
                IVA = IVA * -1;
                BASE = BASE * -1;
                CANTIDAD = CANTIDAD * -1;
                COSTO = COSTO * -1;
                UTILIDAD = UTILIDAD * -1;
                if (CEROS = 'S') then
                    INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (4, USER, :ARTICULO);
                SUSPEND;
                END
            if (CEROS = 'S') then
                BEGIN
                COSTO = 0;
                UTILIDAD = 0;
                PORC = 0;
                /* agregue los articulos sin factura */
                FOR SELECT ARTI_COD, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN and
                    not exists (select REPA_ARTICULO FROM REPORTES_AUX WHERE REPA_ID = 4 AND REPA_USER = USER AND REPA_ARTICULO = a.arti_cod)
                    INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                    DO
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        if (BIN_AND(TIPO, 8) <> 0) then
            BEGIN
            SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 34 INTO :NOMTIPO;
            FOR SELECT P.PREF_PRE, PEDI_NUMERO, PEDI_FECHA, ARTI_COD, PEDE_CANT * PEDE_FACTOR, (PEDE_TOTAL-PEDE_IVAMONTO-PEDE_CONSUMO)*PEDI_FACTOR,
                PEDE_IVAMONTO*PEDI_FACTOR, PEDE_DTOPORC, PEDE_TOTAL*PEDI_FACTOR, PEDE_CONSUMO, D.lipr_cod
                FROM PEDIDOS P, PEDIDOS_DETALLE D, PREFIJOS PR
                WHERE P.PEDI_ID = D.PEDI_ID AND PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND VEND_COD = :CODVEND AND PEDI_ANULADO = 'N'
                 AND P.PREF_PRE = PR.PREF_PRE AND P.TIDO_COD = 34 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                ORDER BY ARTI_COD, PEDI_FECHA, P.PEDI_ID, PEDE_ITEM
                INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :DTO, :TOTAL, :CONSUMO, :codlista
                DO
                BEGIN
                SELECT ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO WHERE ARTI_COD = :ARTICULO
                    INTO :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC;
                SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                EXECUTE PROCEDURE costo_promedio (:ARTICULO, :FECHA) RETURNING_VALUES (:COSTOUNIT);
                /* EL FACTOR */
                FACCOST = 1;
                SELECT FIRST 1 FACO_FACTOR FROM factor_costo WHERE FACO_FECINI <= :FECHA AND FACO_FECFIN >= :FECHA INTO :FACCOST;
                COSTOUNIT = COSTOUNIT * FACCOST;

                LISTA = 0;
                SELECT PRAR_FIJO FROM precios_articulo WHERE LIPR_COD = :CODLISTA AND ARTI_COD = :ARTICULO INTO :LISTA;
                COSTO = COSTOUNIT * CANTIDAD;
                UTILIDAD = BASE - COSTO;
                if (UOM = 'UTILIDAD') then
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                else
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
                if (CEROS = 'S') then
                    INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (4, USER, :ARTICULO);
                SUSPEND;
                END
            if (CEROS = 'S') then
                BEGIN
                COSTO = 0;
                UTILIDAD = 0;
                PORC = 0;
                /* agregue los articulos sin factura */
                FOR SELECT ARTI_COD, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN and
                    not exists (select REPA_ARTICULO FROM REPORTES_AUX WHERE REPA_ID = 4 AND REPA_USER = USER AND REPA_ARTICULO = a.arti_cod)
                    INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                    DO
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        if (BIN_AND(TIPO, 16) <> 0) then
            BEGIN
            SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 35 INTO :NOMTIPO;
            FOR SELECT C.PREF_PRE, COTI_NUMERO, COTI_FECHA, ARTI_COD, CTDE_CANT * CTDE_FACTOR, (CTDE_TOTAL-CTDE_IVAMONTO-CTDE_CONSUMO)*COTI_FACTOR,
                CTDE_IVAMONTO*COTI_FACTOR, CTDE_DTOPORC, CTDE_TOTAL*COTI_FACTOR, CTDE_CONSUMO, D.lipr_cod
                FROM COTIZACIONES C, COTIZACIONES_DETALLE D, PREFIJOS P
                WHERE C.COTI_ID = D.COTI_ID AND ARTI_COD = :ARTICULO AND COTI_FECHA >= :FECINI AND COTI_FECHA <= :FECFIN AND VEND_COD = :CODVEND AND COTI_ANULADO = 'N'
                 AND P.PREF_PRE = C.PREF_PRE AND P.TIDO_COD = 35 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                ORDER BY COTI_FECHA, C.COTI_ID, CTDE_ITEM
                INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :DTO, :TOTAL, :CONSUMO, :codlista
                DO
                BEGIN
                SELECT ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO WHERE ARTI_COD = :ARTICULO
                    INTO :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC;
                SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                LISTA = 0;
                SELECT PRAR_FIJO FROM precios_articulo WHERE LIPR_COD = :CODLISTA AND ARTI_COD = :ARTICULO INTO :LISTA;
                EXECUTE PROCEDURE costo_promedio (:ARTICULO, :FECHA) RETURNING_VALUES (:COSTOUNIT);
                /* EL FACTOR */
                FACCOST = 1;
                SELECT FIRST 1 FACO_FACTOR FROM factor_costo WHERE FACO_FECINI <= :FECHA AND FACO_FECFIN >= :FECHA INTO :FACCOST;
                COSTOUNIT = COSTOUNIT * FACCOST;

                COSTO = COSTOUNIT * CANTIDAD;
                UTILIDAD = BASE - COSTO;
                if (UOM = 'UTILIDAD') then
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                else
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
                if (CEROS = 'S') then
                    INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (4, USER, :ARTICULO);
                SUSPEND;
                END
            if (CEROS = 'S') then
                BEGIN
                COSTO = 0;
                UTILIDAD = 0;
                PORC = 0;
                /* agregue los articulos sin factura */
                FOR SELECT ARTI_COD, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN and
                    not exists (select REPA_ARTICULO FROM REPORTES_AUX WHERE REPA_ID = 4 AND REPA_USER = USER AND REPA_ARTICULO = a.arti_cod)
                    INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                    DO
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        END
    END
END
^

SET TERM ; ^


/* 20100901 */
/* SI NO TIENEN TERCERO TOME EL NIT DE LA EMPRESA */
SET TERM ^ ;

CREATE OR ALTER procedure CONTABIL_ENTRADA (
    IDDOC integer,
    IDINTER integer)
returns (
    ERROR integer,
    VER char(1),
    IDC integer)
AS
declare variable PREFIJO VARCHAR(4);
declare variable NUMERO VARCHAR(6);
declare variable FECAUX DATE;
declare variable FECHA CHAR(8);
declare variable CONCEPTO CHAR(60);
declare variable TIPOCOMP VARCHAR(3);
declare variable PREFCONT VARCHAR(4);
declare variable BASE CHAR(1);
declare variable IVAV CHAR(1);
declare variable CONSUMO CHAR(1);
declare variable TOTAL CHAR(1);
declare variable CTABASE VARCHAR(20);
declare variable CTAIVA VARCHAR(20);
declare variable CTACONSUMO VARCHAR(20);
declare variable CTACIERRE VARCHAR(20);
declare variable EXISTE CHAR(1);
declare variable CUENTA VARCHAR(20);
declare variable MONTO NUMERIC(18,2);
declare variable TIPOCUEN CHAR(1);
declare variable NIT VARCHAR(20);
declare variable PROY VARCHAR(4);
declare variable CENTRO VARCHAR(4);
declare variable DEBITO NUMERIC(18,2);
declare variable CREDITO NUMERIC(18,2);
declare variable NUMITEMS INTEGER;
declare variable ARTICULO VARCHAR(15);
declare variable IMPINC CHAR(1);
declare variable IMPTOS NUMERIC(18, 2);
declare variable SUMA NUMERIC(18,2);
declare variable VRBASE NUMERIC(18,2);
declare variable CUENTAADIC VARCHAR(20);
declare variable BASEADIC VARCHAR(20);
declare variable PORCADIC NUMERIC(5,2);
declare variable VALORADIC NUMERIC(18,2);
declare variable DBADIC CHAR(1);
declare variable PROV CHAR(1);
declare variable ANULADO CHAR(1);
declare variable CENT CHAR(1);
BEGIN
  /* BUSQUE LA INTERFACE */
  EXISTE = 'N';
  SELECT 'S', PREF_PRE, TICO_COD, PRCO_PREF, ININ_BASE, ININ_IVAV, ININ_CONSUMO, ININ_TOTAL, ININ_CTABASE, ININ_CTAIVA, ININ_CTACONSUMO, ININ_CTACIERRE, ININ_CONFIRMAR, ININ_CENTRO
    FROM INTERFAZ_INVENTARIO
    WHERE ININ_ID = :IDINTER
    INTO :EXISTE, :PREFIJO, :TIPOCOMP, :PREFCONT, :BASE, :IVAV, :CONSUMO, :TOTAL, :CTABASE, :CTAIVA, :CTACONSUMO, :CTACIERRE, :VER, :CENT;
  if (EXISTE = 'S') then
    BEGIN
    /* TRAIGA EL ENCABEZADO DE LA ENTRADA */
    SELECT PREF_PRE, ENTR_NUMERO, ENTR_FECHA, ENTR_CONC, TERC_NIT, ENTR_IMPTOS, ENTR_ANULADO
        FROM ENTRADAS
        WHERE ENTR_ID = :IDDOC
        INTO :PREFIJO, :NUMERO, :FECAUX, :CONCEPTO, :NIT, :IMPINC, :ANULADO;
    if ((NIT IS NULL) or (NIT = '')) then
        EXECUTE PROCEDURE LEE_CONFIGURACION('CONTABILIDAD', 'GENERAL', 'NIT COMPAÑIA') RETURNING_VALUES (:NIT);
        
    /* BORRE CUALQUEIR CONTABILIZACION PREVIA */
    DELETE FROM CONTABILIZACION WHERE CNTB_TIPOREF = 11 AND CNTB_IDREF = :IDDOC;

    if (ANULADO = 'N') then
        BEGIN
        if (CENT = 'B') then
            SELECT BODE_CENTRO, BODE_PROY FROM BODEGA B, ENTRADAS E
                WHERE B.BODE_COD = E.BODE_COD AND E.ENTR_ID = :IDDOC INTO :CENTRO, :PROY;
        ELSE
            SELECT PREF_CENTRO, PREF_PROY FROM PREFIJOS P, ENTRADAS E
                WHERE P.PREF_PRE = E.PREF_PRE AND P.TIDO_COD = 11 AND E.ENTR_ID = :IDDOC INTO :CENTRO, :PROY;
        /* CONVIERTA LA FECHA A CADENA */
        EXECUTE PROCEDURE FECHA_A_CONTA(:FECAUX) returning_values (:FECHA);
        IDC = GEN_ID(ID_CONTABILIZA, 1);
        /* REGISTRE EL ENCABEZADO CONTABLE */
        INSERT INTO CONTABILIZACION (CNTB_ID, CNTB_TIPOCOMP, CNTB_PREFCNT, CNTB_NUMERO, CNTB_FECHA, CNTB_CONCEPTO, CNTB_REF, CNTB_TIPOREF, CNTB_IDREF, CNTB_PREFREF, CNTB_NUMREF, CNTB_PROCESADO)
            VALUES (:IDC, :TIPOCOMP, :PREFCONT, :NUMERO, :FECHA, :CONCEPTO, '', 11, :IDDOC, :PREFIJO, :NUMERO, 'N');
        NUMITEMS = 0;
        SUMA = 0;
        ERROR = 0;
        /* PRIMERO LA BASE */
        if (BASE = 'A') then
            BEGIN
            /* SUME LAS BASES DE LOS ARTICULOS DEL DOCUMENTO */
            FOR SELECT MAX(COAR_CTAINV), SUM(CAST(ENDE_CANT AS DOUBLE PRECISION) * ENDE_COSTO), SUM(ENDE_IVAMONTO + (ENDE_CONSUMO * ENDE_CANT * ENDE_FACTOR))
                FROM ARTICULO A, CONTABIL_ARTICULO C, ENTRADAS_DETALLE E
                WHERE E.ENTR_ID = :IDDOC AND E.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD
                GROUP BY COAR_CTAINV
                INTO :CTABASE, :MONTO, :IMPTOS
            DO
            if (MONTO <> 0) then
                BEGIN
                if (IMPINC = 'S') then
                    MONTO = MONTO - IMPTOS;
                VRBASE = MONTO;
                /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :CTABASE INTO :CUENTA, :TIPOCUEN;
                if (CUENTA IS NULL) then
                    begin
                    EXECUTE PROCEDURE ERROR (11, :IDDOC, :CTABASE, 2);
                    CUENTA = CTABASE;
                    ERROR = ERROR + 1;
                    end
                /* DEPENDE DEL TIPO DE CUENTA */
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT E.ARTI_COD, (CAST(ENDE_CANT AS DOUBLE PRECISION) * ENDE_COSTO), (ENDE_IVAMONTO + (ENDE_CONSUMO * ENDE_CANT * ENDE_FACTOR))
                        FROM ARTICULO A, CONTABIL_ARTICULO C, ENTRADAS_DETALLE E
                        WHERE E.ENTR_ID = :IDDOC AND E.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTAINV = :CUENTA
                        INTO :ARTICULO, :MONTO, :IMPTOS
                    DO
                        BEGIN
                        if (IMPINC = 'S') then
                            MONTO = MONTO - IMPTOS;
                        IF (MONTO <> 0) THEN
                            BEGIN
                            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                            NUMITEMS = NUMITEMS + 1;
                            SUMA = SUMA + MONTO;
                            END
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (11, :IDDOC, :CUENTA, 4);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    /* INSERTE EL REGISTRO DE LA BASE */
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NUMITEMS = NUMITEMS + 1;
                    SUMA = SUMA + MONTO;
                    END
                END /* FOR */
            END /* BASE */
        if (BASE = 'I') then
            BEGIN
            /* SUME LAS BASES DE LOS ARTICULOS DEL DOCUMENTO */
            FOR SELECT MAX(TAIV_CTAINV), SUM(CAST(ENDE_CANT AS DOUBLE PRECISION) * ENDE_COSTO), SUM(ENDE_IVAMONTO + (ENDE_CONSUMO * ENDE_CANT * ENDE_FACTOR))
                FROM ARTICULO A, TARIFA_IVA I, ENTRADAS_DETALLE E
                WHERE E.ENTR_ID = :IDDOC AND E.ARTI_COD = A.ARTI_COD AND A.TAIV_COD = I.TAIV_COD
                GROUP BY TAIV_CTAINV
                INTO :CTABASE, :MONTO, :IMPTOS
            DO
            if (MONTO <> 0) then
                BEGIN
                if (IMPINC = 'S') then
                    MONTO = MONTO - IMPTOS;
                VRBASE = MONTO;
                /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :CTABASE INTO :CUENTA, :TIPOCUEN;
                if (CUENTA IS NULL) then
                    begin
                    EXECUTE PROCEDURE ERROR (11, :IDDOC, :CTABASE, 2);
                    CUENTA = CTABASE;
                    ERROR = ERROR + 1;
                    end
                /* DEPENDE DEL TIPO DE CUENTA */
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT E.ARTI_COD, (CAST(ENDE_CANT AS DOUBLE PRECISION) * ENDE_COSTO), (ENDE_IVAMONTO + (ENDE_CONSUMO * ENDE_CANT * ENDE_FACTOR))
                        FROM ARTICULO A, TARIFA_IVA I, ENTRADAS_DETALLE E
                        WHERE E.ENTR_ID = :IDDOC AND E.ARTI_COD = A.ARTI_COD AND A.TAIV_COD = I.TAIV_COD AND TAIV_CTAINV = :CUENTA
                        INTO :ARTICULO, :MONTO, :IMPTOS
                    DO
                        BEGIN
                        if (IMPINC = 'S') then
                            MONTO = MONTO - IMPTOS;
                        IF (MONTO <> 0) THEN
                            BEGIN
                            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                            NUMITEMS = NUMITEMS + 1;
                            SUMA = SUMA + MONTO;
                            END
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (11, :IDDOC, :CUENTA, 4);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    /* INSERTE EL REGISTRO DE LA BASE */
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NUMITEMS = NUMITEMS + 1;
                    SUMA = SUMA + MONTO;
                    END
                END /* FOR */
            END /* BASE */
        if ((BASE = 'K') or (BASE = 'T')) then
            BEGIN
            CUENTA = :ctabase;
            if (BASE = 'T') then
                BEGIN
                SELECT TERC_PROV, TERC_CTAVENTA FROM TERCEROS WHERE TERC_NIT = :NIT INTO :PROV, :CUENTA;
                if (:PROV = 'S') then
                    SELECT PROV_CTACAUSA FROM PROVEEDORES WHERE TERC_NIT = :NIT INTO :CUENTA;
                END
            /* SUME LAS BASES DE LOS ARTICULOS DEL DOCUMENTO */
            SELECT SUM(CAST(ENDE_CANT AS DOUBLE PRECISION) * ENDE_COSTO), SUM(ENDE_IVAMONTO + (ENDE_CONSUMO * ENDE_CANT * ENDE_FACTOR))
                FROM ENTRADAS_DETALLE E
                WHERE E.ENTR_ID = :IDDOC
                INTO :MONTO, :IMPTOS;
        
            if (MONTO <> 0) then
                BEGIN
                if (IMPINC = 'S') then
                    MONTO = MONTO - IMPTOS;
                /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :CTABASE INTO :CUENTA, :TIPOCUEN;
                if (CUENTA IS NULL) then
                    begin
                    EXECUTE PROCEDURE ERROR (11, :IDDOC, :CTABASE, 2);
                    CUENTA = CTABASE;
                    ERROR = ERROR + 1;
                    end
                /* DEPENDE DEL TIPO DE CUENTA */
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT E.ARTI_COD, (CAST(ENDE_CANT AS DOUBLE PRECISION) * ENDE_COSTO), (ENDE_IVAMONTO + (ENDE_CONSUMO * ENDE_CANT * ENDE_FACTOR))
                        FROM ARTICULO A, CONTABIL_ARTICULO C, ENTRADAS_DETALLE E
                        WHERE E.ENTR_ID = :IDDOC AND E.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTAINV = :CUENTA
                        INTO :ARTICULO, :MONTO, :IMPTOS
                        DO
                        BEGIN
                        if (IMPINC = 'S') then
                            MONTO = MONTO - IMPTOS;
                        IF (MONTO <> 0) Then
                            BEGIN
                            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                            NUMITEMS = NUMITEMS + 1;
                            SUMA = SUMA + MONTO;
                            END
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (11, :IDDOC, :CUENTA, 4);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    /* INSERTE EL REGISTRO DE LA BASE */
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NUMITEMS = NUMITEMS + 1;
                    SUMA = SUMA + MONTO;
                    END
                END
            END /* BASE K O T */
        /* EL IVA  */
        if (IVAV = 'A') then
            BEGIN
            /* SUME LAS BASES DE LOS ARTICULOS DEL DOCUMENTO */
            FOR SELECT MAX(COAR_CTAIVAV), SUM(ENDE_IVAMONTO), SUM(CAST(ENDE_CANT AS DOUBLE PRECISION) * ENDE_COSTO)
                FROM ARTICULO A, CONTABIL_ARTICULO C, ENTRADAS_DETALLE E
                WHERE E.ENTR_ID = :IDDOC AND E.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD
                GROUP BY COAR_CTAIVAV
                INTO :CTAIVA, :IMPTOS, :MONTO
            DO
                BEGIN
                if (IMPINC = 'S') then
                    MONTO = MONTO - IMPTOS;
                if (IMPTOS <> 0) then
                    BEGIN
                    /* TRAIGA LAS CARCATERISTICAS DE LA CUENTA */
                    SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                        WHERE CUEN_COD = :CTAIVA INTO :CUENTA, :TIPOCUEN;
                    if (CUENTA IS NULL) then
                        begin
                        EXECUTE PROCEDURE ERROR (11, :IDDOC, :CTAIVA, 2);
                        CUENTA = CTAIVA;
                        ERROR = ERROR + 1;
                        end
                    /* DEPENDE DEL TIPO DE CUENTA */
                    if (TIPOCUEN = 'I') then
                        BEGIN
                        /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                        FOR SELECT E.ARTI_COD, ENDE_IVAMONTO, (CAST(ENDE_CANT AS DOUBLE PRECISION) * ENDE_COSTO)
                            FROM ARTICULO A, CONTABIL_ARTICULO C, ENTRADAS_DETALLE E
                            WHERE E.ENTR_ID = :IDDOC AND E.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTAIVAV = :CUENTA
                            INTO :ARTICULO, :IMPTOS, :MONTO
                        DO
                            BEGIN
                            if (IMPINC = 'S') then
                                MONTO = MONTO - IMPTOS;
                            if (IMPTOS <> 0) then
                                BEGIN
                                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :IMPTOS, 0, :MONTO, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                                NUMITEMS = NUMITEMS + 1;
                                SUMA = SUMA + IMPTOS;
                                END
                            END
                        END
                    if (TIPOCUEN = 'C') then
                        BEGIN
                        EXECUTE PROCEDURE ERROR (11, :IDDOC, :CUENTA, 4);
                        TIPOCUEN = 'N';
                        ERROR = ERROR + 1;
                        END
                    if (TIPOCUEN = 'N') then
                        BEGIN
                        /* INSERTE EL REGISTRO DEL IVA EN VENTAS */
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :IMPTOS, 0, :MONTO, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NUMITEMS = NUMITEMS + 1;
                        SUMA = SUMA + IMPTOS;
                        END
                    END /* MONTO <> 0 */
                END /* FOR */
            END /* IVA */
        if (IVAV = 'I') then
            BEGIN
            /* SUME LAS BASES DE LOS ARTICULOS DEL DOCUMENTO */
            FOR SELECT MAX(TAIV_CTAIVACMP), SUM(ENDE_IVAMONTO), SUM(CAST(ENDE_CANT AS DOUBLE PRECISION) * ENDE_COSTO)
                FROM ARTICULO A, TARIFA_IVA I, ENTRADAS_DETALLE E
                WHERE E.ENTR_ID = :IDDOC AND E.ARTI_COD = A.ARTI_COD AND A.TAIV_COD = I.TAIV_COD
                GROUP BY TAIV_CTAIVACMP
                INTO :CTAIVA, :IMPTOS, :MONTO
            DO
                BEGIN
                if (IMPINC = 'S') then
                    MONTO = MONTO - IMPTOS;
                if (MONTO <> 0) then
                    BEGIN
                    /* TRAIGA LAS CARCATERISTICAS DE LA CUENTA */
                    SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                        WHERE CUEN_COD = :CTAIVA INTO :CUENTA, :TIPOCUEN;
                    if (CUENTA IS NULL) then
                        begin
                        EXECUTE PROCEDURE ERROR (11, :IDDOC, :CTAIVA, 2);
                        CUENTA = CTAIVA;
                        ERROR = ERROR + 1;
                        end
                    /* DEPENDE DEL TIPO DE CUENTA */
                    if (TIPOCUEN = 'I') then
                        BEGIN
                        /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                        FOR SELECT E.ARTI_COD, ENDE_IVAMONTO, (CAST(ENDE_CANT AS DOUBLE PRECISION) * ENDE_COSTO)
                            FROM ARTICULO A, TARIFA_IVA I, ENTRADAS_DETALLE E
                            WHERE E.ENTR_ID = :IDDOC AND E.ARTI_COD = A.ARTI_COD AND A.TAIV_COD = I.TAIV_COD AND TAIV_CTAIVACMP = :CUENTA
                            INTO :ARTICULO, :IMPTOS, :MONTO
                        DO
                            BEGIN
                            if (IMPINC = 'S') then
                                MONTO = MONTO - IMPTOS;
                            if (MONTO <> 0) then
                                BEGIN
                                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :IMPTOS, 0, :MONTO, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                                NUMITEMS = NUMITEMS + 1;
                                SUMA = SUMA + IMPTOS;
                                END
                            END
                        END
                    if (TIPOCUEN = 'C') then
                        BEGIN
                        EXECUTE PROCEDURE ERROR (11, :IDDOC, :CUENTA, 4);
                        TIPOCUEN = 'N';
                        ERROR = ERROR + 1;
                        END
                    if (TIPOCUEN = 'N') then
                        BEGIN
                        /* INSERTE EL REGISTRO DEL IVA EN VENTAS */
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :IMPTOS, 0, :MONTO, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NUMITEMS = NUMITEMS + 1;
                        SUMA = SUMA + IMPTOS;
                        END
                    END
                END /* FOR */
            END /* IVA */
        if (IVAV = 'K') then
            BEGIN
            /* SUME LAS BASES DE LOS ARTICULOS DEL DOCUMENTO */
            SELECT SUM(ENDE_IVAMONTO), SUM(CAST(ENDE_CANT AS DOUBLE PRECISION) * ENDE_COSTO)
                FROM ENTRADAS_DETALLE E
                WHERE E.ENTR_ID = :IDDOC
                INTO :IMPTOS, :MONTO;
            if (IMPINC = 'S') then
                MONTO = MONTO - IMPTOS;
            if (IMPTOS <> 0) then
                BEGIN
                /* TRAIGA LAS CARCATERISTICAS DE LA CUENTA */
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :CTAIVA INTO :CUENTA, :TIPOCUEN;
                if (CUENTA IS NULL) then
                    begin
                    EXECUTE PROCEDURE ERROR (11, :IDDOC, :CTAIVA, 2);
                    CUENTA = CTABASE;
                    ERROR = ERROR + 1;
                    end
                /* DEPENDE DEL TIPO DE CUENTA */
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT E.ARTI_COD, ENDE_IVAMONTO, (CAST(ENDE_CANT AS DOUBLE PRECISION) * ENDE_COSTO)
                        FROM ARTICULO A, CONTABIL_ARTICULO C, ENTRADAS_DETALLE E
                        WHERE E.ENTR_ID = :IDDOC AND E.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTAIVAV = :CUENTA
                        INTO :ARTICULO, :IMPTOS, :MONTO
                        DO
                        BEGIN
                        if (IMPINC = 'S') then
                            MONTO = MONTO - IMPTOS;
                        if (IMPTOS <> 0) then
                            BEGIN
                            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :IMPTOS, 0, :MONTO, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                            NUMITEMS = NUMITEMS + 1;
                            SUMA = SUMA + IMPTOS;
                            END
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (11, :IDDOC, :CUENTA, 4);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    /* INSERTE EL REGISTRO DEL IVA EN VENTAS */
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :IMPTOS, 0, :MONTO, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NUMITEMS = NUMITEMS + 1;
                    SUMA = SUMA + IMPTOS;
                    END
                END
            END /* IVA K */
        /* EL IMPOCONSUMO */
        if (CONSUMO = 'A') then
            BEGIN
            /* SUME LAS BASES DE LOS ARTICULOS DEL DOCUMENTO */
            FOR SELECT MAX(COAR_CTACONS), SUM(ENDE_CONSUMO * ENDE_CANT * ENDE_FACTOR)
                FROM ARTICULO A, CONTABIL_ARTICULO C, ENTRADAS_DETALLE E
                WHERE E.ENTR_ID = :IDDOC AND E.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD
                GROUP BY COAR_CTACONS
                INTO :CTACONSUMO, :IMPTOS
            DO
                BEGIN
                if (IMPTOS <> 0) then
                    BEGIN
                    /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
                    SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                        WHERE CUEN_COD = :CTACONSUMO INTO :CUENTA, :TIPOCUEN;
                    if (CUENTA IS NULL) then
                        begin
                        EXECUTE PROCEDURE ERROR (11, :IDDOC, :CTACONSUMO, 2);
                        CUENTA = CTABASE;
                        ERROR = ERROR + 1;
                        end
                    /* DEPENDE DEL TIPO DE CUENTA */
                    if (TIPOCUEN = 'I') then
                        BEGIN
                        /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                        FOR SELECT E.ARTI_COD, ENDE_CONSUMO * ENDE_CANT * ENDE_FACTOR
                            FROM ARTICULO A, CONTABIL_ARTICULO C, ENTRADAS_DETALLE E
                            WHERE E.ENTR_ID = :IDDOC AND E.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTACONS = :CUENTA
                            INTO :ARTICULO, :IMPTOS
                        DO
                            BEGIN
                            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                            NUMITEMS = NUMITEMS + 1;
                            SUMA = SUMA + IMPTOS;
                            END
                        END
                    if (TIPOCUEN = 'C') then
                        BEGIN
                        EXECUTE PROCEDURE ERROR (11, :IDDOC, :CUENTA, 4);
                        TIPOCUEN = 'N';
                        ERROR = ERROR + 1;
                        END
                    if (TIPOCUEN = 'N') then
                        BEGIN
                        /* INSERTE EL REGISTRO DE LA BASE */
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NUMITEMS = NUMITEMS + 1;
                        SUMA = SUMA + IMPTOS;
                        END
                    END
                END /* FOR */
            END /* CONSUMO */
        if (CONSUMO = 'K') then
            BEGIN
            /* SUME LAS BASES DE LOS ARTICULOS DEL DOCUMENTO */
            SELECT SUM(ENDE_CONSUMO * ENDE_CANT * ENDE_FACTOR) FROM ENTRADAS_DETALLE E
                WHERE E.ENTR_ID = :IDDOC INTO :IMPTOS;
            if (IMPTOS <> 0) then
                BEGIN
                /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :CTACONSUMO INTO :CUENTA, :TIPOCUEN;
                if (CUENTA IS NULL) then
                    begin
                    EXECUTE PROCEDURE ERROR (11, :IDDOC, :CTACONSUMO, 2);
                    CUENTA = CTACONSUMO;
                    ERROR = ERROR + 1;
                    end
                /* DEPENDE DEL TIPO DE CUENTA */
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT E.ARTI_COD, ENDE_CONSUMO * ENDE_CANT * ENDE_FACTOR
                        FROM ARTICULO A, CONTABIL_ARTICULO C, ENTRADAS_DETALLE E
                        WHERE E.ENTR_ID = :IDDOC AND E.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTACONS = :CUENTA
                        INTO :ARTICULO, :IMPTOS
                        DO
                        BEGIN
                        if (IMPTOS <> 0) then
                            BEGIN
                            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                            NUMITEMS = NUMITEMS + 1;
                            SUMA = SUMA + IMPTOS;
                            END
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (11, :IDDOC, :CUENTA, 4);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    /* INSERTE EL REGISTRO DE LA BASE */
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NUMITEMS = NUMITEMS + 1;
                    SUMA = SUMA + IMPTOS;
                    END
                END
            END /* CONSUMO K */
        /* recorra las cuentas adicionales */
        FOR SELECT INIC_CUENTA, INIC_BASE, INIC_PORC, INIC_VALOR, INIC_DB
            FROM INTERFAZ_INVENTARIO_CTAS
            WHERE ININ_ID = :IDINTER
            INTO :CUENTAADIC, :BASEADIC, :PORCADIC, :VALORADIC, :DBADIC
            DO
            BEGIN
            if (VALORADIC <> 0) then
                MONTO = VALORADIC;
            ELSE
                BEGIN
                if (:BASEADIC = 'SUBTOTAL') then
                    SELECT SUM(CAST(ENDE_CANT AS DOUBLE PRECISION) * (ENDE_COSTO-ENDE_DTOMONTO)) FROM
                        ENTRADAS_DETALLE WHERE ENTR_ID = :iddoc INTO :VALORADIC;
                if (:BASEADIC = 'IVA') then
                    SELECT SUM(ENDE_IVAMONTO) FROM
                        ENTRADAS_DETALLE WHERE ENTR_ID = :iddoc INTO :VALORADIC;
                if (:BASEADIC = 'CONSUMO') then
                    SELECT SUM(ENDE_CONSUMO * ENDE_CANT * ENDE_FACTOR) FROM
                        ENTRADAS_DETALLE WHERE ENTR_ID = :iddoc INTO :VALORADIC;
                if (:BASEADIC = 'TOTAL') then
                    SELECT SUM((CAST(ENDE_CANT AS DOUBLE PRECISION) * (ENDE_COSTO-ENDE_DTOMONTO)) + ENDE_IVAMONTO + (ENDE_CONSUMO * ENDE_CANT * ENDE_FACTOR)) FROM
                        ENTRADAS_DETALLE WHERE ENTR_ID = :iddoc INTO :VALORADIC;
                MONTO = VALORADIC * PORCADIC / 100;
                END
            if (MONTO <> 0) then
                BEGIN
                CUENTA = NULL;
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :CUENTAADIC INTO :CUENTA, :TIPOCUEN;
                if (CUENTA IS NULL) then
                    begin
                    EXECUTE PROCEDURE ERROR (11, :IDDOC, :CUENTAADIC, 2);
                    CUENTA = CUENTAADIC;
                    ERROR = ERROR + 1;
                    end
                /* DEPENDE DEL TIPO DE CUENTA */
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (11, :IDDOC, :CUENTA, 3);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (11, :IDDOC, :CUENTA, 4);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    if (DBADIC = 'S') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTAADIC, :CONCEPTO, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        SUMA = SUMA + MONTO;
                        END
                    ELSE
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTAADIC, :CONCEPTO, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        SUMA = SUMA - MONTO;
                        END
                    NUMITEMS = NUMITEMS + 1;
                    END
                END
            END
        /* CIERRE EL COMPROBANTE CONTRA LA CUENTA DEL TERCERO O LA CONSTANTE */
        if (SUMA <> 0) then
            BEGIN
            if (SUMA > 0) then
                BEGIN
                DEBITO = 0;
                CREDITO = SUMA;
                END
            ELSE
                BEGIN
                DEBITO = SUMA * -1;
                CREDITO = 0;
                END
            if (TOTAL <> 'K') then
                BEGIN
                SELECT TERC_CTAPROV, TERC_PROV
                    FROM TERCEROS WHERE TERC_NIT = :NIT
                    INTO :CTACIERRE, :PROV;
                if (PROV = 'S') then
                    SELECT PROV_CTAPAGAR FROM PROVEEDORES WHERE TERC_NIT = :nit INTO :CUENTA;
                END
            /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTACIERRE INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERROR (24, :IDDOC, :CTACIERRE, 2);
                CUENTA = CTACIERRE;
                ERROR = ERROR + 1;
                end
            /* DEPENDE DEL TIPO DE CUENTA */
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERROR (11, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                EXECUTE PROCEDURE ERROR (11, :IDDOC, :CUENTA, 4);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'N') then
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :DEBITO, :CREDITO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            END /* SUMA */
        if (ERROR > 0) then
            VER = 'S';
        END
      END /* EXISTE LA INTERFAZ */
  ELSE
    BEGIN
    EXECUTE PROCEDURE ERROR (11, :IDDOC, :PREFIJO, 1);
    ERROR = ERROR + 1;
    VER = 'S';
    END
SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE ENTRADAS_SIN_CONTABILIDAD(
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    ID INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    ESTADO VARCHAR(20),
    IDI INTEGER,
    IDC INTEGER)
AS
DECLARE VARIABLE VER CHAR(2);
declare variable FECICNT VARCHAR(10);
declare variable FECFCNT VARCHAR(10);
declare variable ERROR INTEGER;
declare variable idref INTEGER;
BEGIN
EXECUTE PROCEDURE fecha_a_conta(FECINI) returning_values (FECICNT);
EXECUTE PROCEDURE fecha_a_conta(FECFIN) returning_values (FECFCNT);
FOR SELECT ENTR_ID, PREF_PRE, ENTR_NUMERO FROM ENTRADAS WHERE ENTR_ANULADO = 'N' AND
    ENTR_FECHA >= :FECINI AND ENTR_FECHA <= :FECFIN
    INTO :ID, :PREF, :NUMERO
DO
  BEGIN
  idref = null;
  SELECT ENCO_IDREF FROM COMPROBANTE_ENCABEZADO WHERE ENCO_TIPOREF = 11 AND ENCO_FECHA >= :FECICNT AND ENCO_FECHA <= :FECFCNT AND ENCO_IDREF = :id INTO :idref;
  if (idref IS NULL) then
  BEGIN
   ESTADO = 'PROCESANDO';
   SUSPEND;
   SELECT MAX(ININ_ID) FROM INTERFAZ_INVENTARIO WHERE PREF_PRE = :PREF AND TIDO_COD = 11 INTO :IDI;
   EXECUTE PROCEDURE CONTABIL_ENTRADA (:ID, :IDI) RETURNING_VALUES (:ERROR, :VER, :IDC);
   if (ERROR = 0) then
    BEGIN
      EXECUTE PROCEDURE CONTABILIZA_PENDIENTE (:IDC);
      ESTADO = 'OK';
      END
   ELSE
    ESTADO = 'ERROR';
   suspend;
  end
  END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure CONTABIL_SALIDA (
    IDDOC integer,
    IDINTER integer)
returns (
    ERROR integer,
    VER char(1),
    IDC integer)
AS
declare variable PREFIJO VARCHAR(4);
declare variable NUMERO VARCHAR(6);
declare variable FECAUX DATE;
declare variable FECHA CHAR(8);
declare variable CONCEPTO CHAR(60);
declare variable TIPOCOMP VARCHAR(3);
declare variable PREFCONT VARCHAR(4);
declare variable CTACIERRE VARCHAR(20);
declare variable BASE CHAR(1);
declare variable IVAV CHAR(1);
declare variable CONSUMO CHAR(1);
declare variable TOTAL CHAR(1);
declare variable EXISTE CHAR(1);
declare variable CUENTA VARCHAR(20);
declare variable MONTO NUMERIC(18,2);
declare variable TIPOCUEN CHAR(1);
declare variable NIT VARCHAR(20);
declare variable PROY VARCHAR(4);
declare variable CENTRO VARCHAR(4);
declare variable DEBITO NUMERIC(18,2);
declare variable CREDITO NUMERIC(18,2);
declare variable NUMITEMS INTEGER;
declare variable ARTICULO VARCHAR(15);
declare variable IMPINC CHAR(1);
declare variable IMPTOS NUMERIC(18, 2);
declare variable SUMA NUMERIC(18,2);
declare variable CTABASE VARCHAR(20);
declare variable CTAIVA VARCHAR(20);
declare variable CTACONSUMO VARCHAR(20);
declare variable VRBASE NUMERIC(18,2);
declare variable CUENTAADIC VARCHAR(20);
declare variable BASEADIC VARCHAR(20);
declare variable PORCADIC NUMERIC(5,2);
declare variable VALORADIC NUMERIC(18,2);
declare variable DBADIC CHAR(1);
declare variable PROV CHAR(1);
declare variable ANULADO CHAR(1);
declare variable CENT CHAR(1);
BEGIN
ERROR = 0;
/* BUSQUE LA INTERFACE */
EXISTE = 'N';
SELECT 'S', PREF_PRE, TICO_COD, PRCO_PREF, ININ_BASE, ININ_IVAV, ININ_CONSUMO, ININ_TOTAL, ININ_CTABASE, ININ_CTAIVA, ININ_CTACONSUMO, ININ_CTACIERRE, ININ_CONFIRMAR, ININ_CENTRO
    FROM INTERFAZ_INVENTARIO
    WHERE ININ_ID = :IDINTER
    INTO :EXISTE, :PREFIJO, :TIPOCOMP, :PREFCONT, :BASE, :IVAV, :CONSUMO, :TOTAL, :CTABASE, :CTAIVA, :CTACONSUMO, :CTACIERRE, :VER, :CENT;
if (EXISTE = 'S') then
    BEGIN
    /* TRAIGA EL ENCABEZADO DE LA SALIDA */
    SELECT PREF_PRE, SALI_NUMERO, SALI_FECHA, SALI_CONC, TERC_NIT, SALI_IMPTOS, SALI_ANULADO
        FROM SALIDAS
        WHERE SALI_ID = :IDDOC
        INTO :PREFIJO, :NUMERO, :FECAUX, :CONCEPTO, :NIT, :IMPINC, :ANULADO;
    if ((NIT IS NULL) or (NIT = '')) then
        EXECUTE PROCEDURE LEE_CONFIGURACION('CONTABILIDAD', 'GENERAL', 'NIT COMPAÑIA') RETURNING_VALUES (:NIT);
    /* BORRE CUALQUEIR CONTABILIZACION PREVIA */
    DELETE FROM CONTABILIZACION WHERE CNTB_TIPOREF = 12 AND CNTB_IDREF = :IDDOC;

    if (ANULADO = 'N') then
        BEGIN
        if (CENT = 'B') then
            SELECT BODE_CENTRO, BODE_PROY FROM BODEGA B, SALIDAS E
                WHERE B.BODE_COD = E.BODE_COD AND E.SALI_ID = :IDDOC INTO :CENTRO, :PROY;
        ELSE
            SELECT PREF_CENTRO, PREF_PROY FROM PREFIJOS P, SALIDAS E
                WHERE P.PREF_PRE = E.PREF_PRE AND E.SALI_ID = :IDDOC AND P.TIDO_COD = 12 INTO :CENTRO, :PROY;
        /* CONVIERTA LA FECHA A CADENA */
        EXECUTE PROCEDURE FECHA_A_CONTA(:FECAUX) returning_values (:FECHA);
        IDC = GEN_ID(ID_CONTABILIZA, 1);
        /* REGISTRE EL ENCABEZADO CONTABLE */
        INSERT INTO CONTABILIZACION (CNTB_ID, CNTB_TIPOCOMP, CNTB_PREFCNT, CNTB_NUMERO, CNTB_FECHA, CNTB_CONCEPTO, CNTB_REF, CNTB_TIPOREF, CNTB_IDREF, CNTB_PREFREF, CNTB_NUMREF, CNTB_PROCESADO)
            VALUES (:IDC, :TIPOCOMP, :PREFCONT, :NUMERO, :FECHA, :CONCEPTO, '', 12, :IDDOC, :PREFIJO, :NUMERO, 'N');
        NUMITEMS = 0;
        SUMA = 0;
        /* PRIMERO LA BASE */
        if (BASE = 'A') then
            BEGIN
            /* SUME LAS BASES DE LOS ARTICULOS DEL DOCUMENTO */
            FOR SELECT MAX(COAR_CTAINV), SUM(SADE_CANT * SADE_COSTO), SUM(SADE_IVAMONTO + (SADE_CONSUMO*SADE_CANT*SADE_FACTOR))
                FROM ARTICULO A, CONTABIL_ARTICULO C, SALIDAS_DETALLE E
                WHERE E.SALI_ID = :IDDOC AND E.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD
                GROUP BY COAR_CTAINV
                INTO :CTABASE, :MONTO, :IMPTOS
            DO
                BEGIN
                if (IMPINC = 'S') then
                    MONTO = MONTO - IMPTOS;
                VRBASE = MONTO;
                if (MONTO <> 0) then
                    BEGIN
                    /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
                    SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                        WHERE CUEN_COD = :CTABASE INTO :CUENTA, :TIPOCUEN;
                    if (CUENTA IS NULL) then
                        begin
                        EXECUTE PROCEDURE ERROR (12, :IDDOC, :CTABASE, 2);
                        CUENTA = CTABASE;
                        TIPOCUEN = 'N';
                        ERROR = ERROR + 1;
                        end
                    /* DEPENDE DEL TIPO DE CUENTA */
                    if (TIPOCUEN = 'I') then
                        BEGIN
                        /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                        FOR SELECT E.ARTI_COD, (SADE_CANT * SADE_COSTO), (SADE_IVAMONTO + (SADE_CONSUMO*SADE_CANT*SADE_FACTOR))
                            FROM ARTICULO A, CONTABIL_ARTICULO C, SALIDAS_DETALLE E
                            WHERE E.SALI_ID = :IDDOC AND E.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTAINV = :CUENTA
                            INTO :ARTICULO, :MONTO, :IMPTOS
                        DO
                            BEGIN
                            if (IMPINC = 'S') then
                                MONTO = MONTO - IMPTOS;
                            if (MONTO <> 0) then
                                BEGIN
                                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                                NUMITEMS = NUMITEMS + 1;
                                SUMA = SUMA - MONTO;
                                END
                            END
                        END
                    if (TIPOCUEN = 'C') then
                        BEGIN
                        EXECUTE PROCEDURE ERROR (12, :IDDOC, :CUENTA, 4);
                        TIPOCUEN = 'N';
                        ERROR = ERROR + 1;
                        END
                    if (TIPOCUEN = 'N') then
                        BEGIN
                        /* INSERTE EL REGISTRO DE LA BASE */
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NUMITEMS = NUMITEMS + 1;
                        SUMA = SUMA - MONTO;
                        END
                    END
                END /* FOR */
            END /* BASE POR ARTICULO */
        if (BASE = 'I') then
            BEGIN
            /* SUME LAS BASES DE LOS ARTICULOS DEL DOCUMENTO */
            FOR SELECT MAX(TAIV_CTAINV), SUM(SADE_CANT * SADE_COSTO), SUM(SADE_IVAMONTO + (SADE_CONSUMO*SADE_CANT*SADE_FACTOR))
                FROM ARTICULO A, TARIFA_IVA I, SALIDAS_DETALLE E
                WHERE E.SALI_ID = :IDDOC AND E.ARTI_COD = A.ARTI_COD AND A.TAIV_COD = I.TAIV_COD
                GROUP BY TAIV_CTAINV
                INTO :CTABASE, :MONTO, :IMPTOS
            DO
                BEGIN
                if (IMPINC = 'S') then
                    MONTO = MONTO - IMPTOS;
                VRBASE = MONTO;
                if (MONTO <> 0) then
                    BEGIN
                    /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
                    SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                        WHERE CUEN_COD = :CTABASE INTO :CUENTA, :TIPOCUEN;
                    if (CUENTA IS NULL) then
                        begin
                        EXECUTE PROCEDURE ERROR (12, :IDDOC, :CTABASE, 2);
                        CUENTA = CTABASE;
                        TIPOCUEN = 'N';
                        ERROR = ERROR + 1;
                        end
                    /* DEPENDE DEL TIPO DE CUENTA */
                    if (TIPOCUEN = 'I') then
                        BEGIN
                        /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                        FOR SELECT E.ARTI_COD, (SADE_CANT * SADE_COSTO), (SADE_IVAMONTO + (SADE_CONSUMO*SADE_CANT*SADE_FACTOR))
                            FROM ARTICULO A, TARIFA_IVA I, SALIDAS_DETALLE E
                            WHERE E.SALI_ID = :IDDOC AND E.ARTI_COD = A.ARTI_COD AND A.TAIV_COD = I.TAIV_COD AND TAIV_CTAINV = :CUENTA
                            INTO :ARTICULO, :MONTO, :IMPTOS
                        DO
                            BEGIN
                            if (IMPINC = 'S') then
                                MONTO = MONTO - IMPTOS;
                            if (MONTO <> 0) then
                                BEGIN
                                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                                NUMITEMS = NUMITEMS + 1;
                                SUMA = SUMA - MONTO;
                                END
                            END
                        END
                    if (TIPOCUEN = 'C') then
                        BEGIN
                        EXECUTE PROCEDURE ERROR (12, :IDDOC, :CUENTA, 4);
                        TIPOCUEN = 'N';
                        ERROR = ERROR + 1;
                        END
                    if (TIPOCUEN = 'N') then
                        BEGIN
                        /* INSERTE EL REGISTRO DE LA BASE */
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NUMITEMS = NUMITEMS + 1;
                        SUMA = SUMA - MONTO;
                        END
                    END
                END /* FOR */
            END /* BASE POR IVA */
        if ((BASE = 'K') or (BASE = 'T')) then
            BEGIN
            if (BASE = 'T') then
                BEGIN
                SELECT TERC_PROV, TERC_CTAVENTA FROM TERCEROS WHERE TERC_NIT = :NIT INTO :PROV, :CTABASE;
                if (:PROV = 'S') then
                    SELECT PROV_CTACAUSA FROM PROVEEDORES WHERE TERC_NIT = :NIT INTO :CTABASE;
                END
            /* SUME LAS BASES DE LOS ARTICULOS DEL DOCUMENTO */
            FOR SELECT SUM(SADE_CANT * SADE_COSTO), SUM(SADE_IVAMONTO + (SADE_CONSUMO*SADE_CANT*SADE_FACTOR))
                FROM SALIDAS_DETALLE
                WHERE SALI_ID = :IDDOC
                INTO :MONTO, :IMPTOS
            DO
                BEGIN
                if (IMPINC = 'S') then
                    MONTO = MONTO - IMPTOS;
                VRBASE = MONTO;
                if (MONTO <> 0) then
                    BEGIN
                    /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
                    SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                        WHERE CUEN_COD = :CTABASE INTO :CUENTA, :TIPOCUEN;
                    if (CUENTA IS NULL) then
                        begin
                        EXECUTE PROCEDURE ERROR (12, :IDDOC, :CTABASE, 2);
                        CUENTA = CTABASE;
                        TIPOCUEN = 'N';
                        ERROR = ERROR + 1;
                        end
                    /* DEPENDE DEL TIPO DE CUENTA */
                    if (TIPOCUEN = 'I') then
                        BEGIN
                        /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                        FOR SELECT E.ARTI_COD, (SADE_CANT * SADE_COSTO), (SADE_IVAMONTO + (SADE_CONSUMO*SADE_CANT*SADE_FACTOR))
                            FROM ARTICULO A, CONTABIL_ARTICULO C, SALIDAS_DETALLE E
                            WHERE E.SALI_ID = :IDDOC AND E.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTAINV = :CUENTA
                            INTO :ARTICULO, :MONTO, :IMPTOS
                        DO
                            BEGIN
                            if (IMPINC = 'S') then
                                MONTO = MONTO - IMPTOS;
                            if (MONTO <> 0) then
                                BEGIN
                                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                                NUMITEMS = NUMITEMS + 1;
                                SUMA = SUMA - MONTO;
                                END
                            END
                        END
                    if (TIPOCUEN = 'C') then
                        BEGIN
                        EXECUTE PROCEDURE ERROR (12, :IDDOC, :CUENTA, 4);
                        TIPOCUEN = 'N';
                        ERROR = ERROR + 1;
                        END
                    if (TIPOCUEN = 'N') then
                        BEGIN
                        /* INSERTE EL REGISTRO DE LA BASE */
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NUMITEMS = NUMITEMS + 1;
                        SUMA = SUMA - MONTO;
                        END
                    END
                END /* FOR */
            END /* BASE K O POR TERCERO */
        /* EL IVA EN VENTAS */
        if (IVAV = 'A') then
            BEGIN
            /* SUME LAS BASES DE LOS ARTICULOS DEL DOCUMENTO */
            FOR SELECT MAX(COAR_CTAIVAV), SUM(SADE_IVAMONTO), SUM(SADE_CANT * SADE_COSTO)
                FROM ARTICULO A, CONTABIL_ARTICULO C, SALIDAS_DETALLE E
                WHERE E.SALI_ID = :IDDOC AND E.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD
                GROUP BY COAR_CTAIVAV
                INTO :CTAIVA, :IMPTOS, :MONTO
            DO
                BEGIN
                if (IMPTOS <> 0) then
                    BEGIN
                    /* TRAIGA LAS CARCATERISTICAS DE LA CUENTA */
                    SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                        WHERE CUEN_COD = :CTAIVA INTO :CUENTA, :TIPOCUEN;
                    if (CUENTA IS NULL) then
                        begin
                        EXECUTE PROCEDURE ERROR (12, :IDDOC, :CTAIVA, 2);
                        CUENTA = CTAIVA;
                        TIPOCUEN = 'N';
                        ERROR = ERROR + 1;
                        end
                    if (TIPOCUEN = 'I') then
                        BEGIN
                        /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                        FOR SELECT E.ARTI_COD, SADE_IVAMONTO, (SADE_CANT * SADE_COSTO)
                            FROM ARTICULO A, CONTABIL_ARTICULO C, SALIDAS_DETALLE E
                            WHERE E.SALI_ID = :IDDOC AND E.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTAIVAV = :CUENTA
                            INTO :ARTICULO, :IMPTOS, :MONTO
                        DO
                            BEGIN
                            if (IMPINC = 'S') then
                                MONTO = MONTO - IMPTOS;
                            MONTO = MONTO * -1;
                            if (IMPTOS <> 0) then
                                BEGIN
                                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :IMPTOS, :MONTO, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                                NUMITEMS = NUMITEMS + 1;
                                SUMA = SUMA - IMPTOS;
                                END
                            END
                        END
                    if (TIPOCUEN = 'C') then
                        BEGIN
                        EXECUTE PROCEDURE ERROR (12, :IDDOC, :CUENTA, 4);
                        TIPOCUEN = 'N';
                        ERROR = ERROR + 1;
                        END
                    if (TIPOCUEN = 'N') then
                        BEGIN
                        /* INSERTE EL REGISTRO DEL IVA EN VENTAS */
                        if (IMPINC = 'S') then
                            MONTO = MONTO - IMPTOS;
                        MONTO = MONTO * -1;
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :IMPTOS, :MONTO, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NUMITEMS = NUMITEMS + 1;
                        SUMA = SUMA - IMPTOS;
                        END
                    END
                END /* FOR */
            END /* IVA POR ARTICULO */
        if (IVAV = 'I') then
            BEGIN
            /* SUME LAS BASES DE LOS ARTICULOS DEL DOCUMENTO */
            FOR SELECT MAX(TAIV_CTAIVAVNT), SUM(SADE_IVAMONTO), SUM(SADE_CANT * SADE_COSTO)
                FROM ARTICULO A, TARIFA_IVA I, SALIDAS_DETALLE E
                WHERE E.SALI_ID = :IDDOC AND E.ARTI_COD = A.ARTI_COD AND A.TAIV_COD = I.TAIV_COD
                GROUP BY TAIV_CTAIVAVNT
                INTO :CTAIVA, :IMPTOS, :MONTO
            DO
                BEGIN
                if (IMPTOS <> 0) then
                    BEGIN
                    /* TRAIGA LAS CARCATERISTICAS DE LA CUENTA */
                    SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                        WHERE CUEN_COD = :CTAIVA INTO :CUENTA, :TIPOCUEN;
                    if (CUENTA IS NULL) then
                        begin
                        EXECUTE PROCEDURE ERROR (12, :IDDOC, :CTAIVA, 2);
                        CUENTA = CTAIVA;
                        TIPOCUEN = 'N';
                        ERROR = ERROR + 1;
                        end
                    if (TIPOCUEN = 'I') then
                        BEGIN
                        /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                        FOR SELECT E.ARTI_COD, SADE_IVAMONTO, (SADE_CANT * SADE_COSTO)
                            FROM ARTICULO A, TARIFA_IVA I, SALIDAS_DETALLE E
                            WHERE E.SALI_ID = :IDDOC AND E.ARTI_COD = A.ARTI_COD AND A.TAIV_COD = I.TAIV_COD AND TAIV_CTAIVAVNT = :CUENTA
                            INTO :ARTICULO, :IMPTOS, :MONTO
                        DO
                            BEGIN
                            if (IMPINC = 'S') then
                                MONTO = MONTO - IMPTOS;
                            MONTO = MONTO * -1;
                            if (IMPTOS <> 0) then
                                BEGIN
                                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :IMPTOS, :MONTO, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                                NUMITEMS = NUMITEMS + 1;
                                SUMA = SUMA - IMPTOS;
                                END
                            END
                        END
                    if (TIPOCUEN = 'C') then
                        BEGIN
                        EXECUTE PROCEDURE ERROR (12, :IDDOC, :CUENTA, 4);
                        TIPOCUEN = 'N';
                        ERROR = ERROR + 1;
                        END
                    if (TIPOCUEN = 'N') then
                        BEGIN
                        /* INSERTE EL REGISTRO DEL IVA EN VENTAS */
                        if (IMPINC = 'S') then
                            MONTO = MONTO - IMPTOS;
                        MONTO = MONTO * -1;
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :IMPTOS, :MONTO, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NUMITEMS = NUMITEMS + 1;
                        SUMA = SUMA - IMPTOS;
                        END
                    END
                END /* FOR */
            END /* IVA POR TARIFA */
        if (IVAV = 'K') then
            BEGIN
            /* SUME LAS BASES DE LOS ARTICULOS DEL DOCUMENTO */
            SELECT SUM(SADE_IVAMONTO), SUM(SADE_CANT * SADE_COSTO)
                FROM SALIDAS_DETALLE
                WHERE SALI_ID = :IDDOC
                INTO :IMPTOS, :MONTO;
            if (IMPTOS <> 0) then
                BEGIN
                /* TRAIGA LAS CARCATERISTICAS DE LA CUENTA */
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :CTAIVA INTO :CUENTA, :TIPOCUEN;
                if (CUENTA IS NULL) then
                    begin
                    EXECUTE PROCEDURE ERROR (12, :IDDOC, :CTAIVA, 2);
                    CUENTA = CTAIVA;
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT E.ARTI_COD, SADE_IVAMONTO, (SADE_CANT * SADE_COSTO)
                        FROM ARTICULO A, CONTABIL_ARTICULO C, SALIDAS_DETALLE E
                        WHERE E.SALI_ID = :IDDOC AND E.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTAIVAV = :CUENTA
                        INTO :ARTICULO, :IMPTOS, :MONTO
                        DO
                        BEGIN
                        if (IMPTOS <> 0) then
                            BEGIN
                            if (IMPINC = 'S') then
                                MONTO = MONTO - IMPTOS;
                            MONTO = MONTO * -1;
                            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :IMPTOS, :MONTO, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                            NUMITEMS = NUMITEMS + 1;
                            SUMA = SUMA - IMPTOS;
                            END
                        END
                    END
                if (TIPOCUEN = 'C') then
                        BEGIN
                        EXECUTE PROCEDURE ERROR (12, :IDDOC, :CUENTA, 4);
                        TIPOCUEN = 'N';
                        ERROR = ERROR + 1;
                        END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    /* INSERTE EL REGISTRO DEL IVA EN VENTAS */
                    if (IMPINC = 'S') then
                        MONTO = MONTO - IMPTOS;
                    MONTO = MONTO * -1;
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :IMPTOS, :MONTO, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NUMITEMS = NUMITEMS + 1;
                    SUMA = SUMA - IMPTOS;
                    END
                END
            END /* IVA CONSTANTE */
        /* EL IMPOCONSUMO */
        if (CONSUMO = 'A') then
            BEGIN
            /* SUME LAS BASES DE LOS ARTICULOS DEL DOCUMENTO */
            FOR SELECT MAX(COAR_CTACONS), SUM(SADE_CONSUMO*SADE_CANT*SADE_FACTOR)
                FROM ARTICULO A, CONTABIL_ARTICULO C, SALIDAS_DETALLE E
                WHERE E.SALI_ID = :IDDOC AND E.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD
                GROUP BY COAR_CTACONS
                INTO :CTACONSUMO, :IMPTOS
            DO
                BEGIN
                if (IMPTOS <> 0) then
                    BEGIN
                    /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
                    SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                        WHERE CUEN_COD = :CTACONSUMO INTO :CUENTA, :TIPOCUEN;
                    if (CUENTA IS NULL) then
                        begin
                        EXECUTE PROCEDURE ERROR (12, :IDDOC, :CTACONSUMO, 2);
                        CUENTA = CTACONSUMO;
                        TIPOCUEN = 'N';
                        ERROR = ERROR + 1;
                        end
                    if (TIPOCUEN = 'I') then
                        BEGIN
                        /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                        FOR SELECT E.ARTI_COD, SADE_CONSUMO*SADE_CANT*SADE_FACTOR
                            FROM ARTICULO A, CONTABIL_ARTICULO C, SALIDAS_DETALLE E
                            WHERE E.SALI_ID = :IDDOC AND E.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTACONS = :CUENTA
                            INTO :ARTICULO, :IMPTOS
                            DO
                            if (IMPTOS <> 0) then
                                BEGIN
                                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                                NUMITEMS = NUMITEMS + 1;
                                SUMA = SUMA - IMPTOS;
                                END
                        END
                    if (TIPOCUEN = 'C') then
                        BEGIN
                        EXECUTE PROCEDURE ERROR (12, :IDDOC, :CUENTA, 4);
                        TIPOCUEN = 'N';
                        ERROR = ERROR + 1;
                        END
                    if (TIPOCUEN = 'N') then
                        BEGIN
                        /* INSERTE EL REGISTRO DE LA BASE */
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NUMITEMS = NUMITEMS + 1;
                        SUMA = SUMA - IMPTOS;
                        END
                    END
                END /* FOR */
            END /* CONSUMO POR ARTICULO */
        if (CONSUMO = 'K') then
            BEGIN
            /* SUME LAS BASES DE LOS ARTICULOS DEL DOCUMENTO */
            SELECT SUM(SADE_CONSUMO*SADE_CANT*SADE_FACTOR)
                FROM SALIDAS_DETALLE
                WHERE SALI_ID = :IDDOC
                INTO :IMPTOS;
            if (IMPTOS <> 0) then
                BEGIN
                /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :ctaconsumo INTO :CUENTA, :TIPOCUEN;
                if (CUENTA IS NULL) then
                    begin
                    EXECUTE PROCEDURE ERROR (12, :IDDOC, :CTACONSUMO, 2);
                    CUENTA = CTACONSUMO;
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT E.ARTI_COD, SADE_CONSUMO*SADE_CANT*SADE_FACTOR
                    FROM ARTICULO A, CONTABIL_ARTICULO C, SALIDAS_DETALLE E
                        WHERE E.SALI_ID = :IDDOC AND E.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTACONS = :CUENTA
                        INTO :ARTICULO, :IMPTOS
                        DO
                        if (IMPTOS <> 0) then
                            BEGIN
                            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                            NUMITEMS = NUMITEMS + 1;
                            SUMA = SUMA - IMPTOS;
                            END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (12, :IDDOC, :CUENTA, 4);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    /* INSERTE EL REGISTRO DE LA BASE */
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NUMITEMS = NUMITEMS + 1;
                    SUMA = SUMA - IMPTOS;
                    END
                END
            END /* CONSUMO CONSTANTE */
        /* recorra las cuentas adicionales */
        FOR SELECT INIC_CUENTA, INIC_BASE, INIC_PORC, INIC_VALOR, INIC_DB
            FROM INTERFAZ_INVENTARIO_CTAS
            WHERE ININ_ID = :IDINTER
            INTO :CUENTAADIC, :BASEADIC, :PORCADIC, :VALORADIC, :DBADIC
            DO
            BEGIN
            if (VALORADIC <> 0) then
                MONTO = VALORADIC;
            ELSE
                BEGIN
                if (:BASEADIC = 'SUBTOTAL') then
                    SELECT SUM(SADE_CANT * SADE_COSTO)
                    FROM SALIDAS_DETALLE E
                    WHERE E.SALI_ID = :IDDOC 
                    INTO :VALORADIC;
                if (:BASEADIC = 'IVA') then
                    SELECT SUM(SADE_IVAMONTO)
                    FROM SALIDAS_DETALLE E
                    WHERE E.SALI_ID = :IDDOC 
                    INTO :VALORADIC;
                if (:BASEADIC = 'CONSUMO') then
                    SELECT SUM(SADE_CONSUMO*SADE_CANT*SADE_FACTOR)
                    FROM SALIDAS_DETALLE E
                    WHERE E.SALI_ID = :IDDOC 
                    INTO :VALORADIC;
                MONTO = VALORADIC * PORCADIC / 100;
                END
            if (MONTO <> 0) then
                BEGIN
                /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
                CUENTA = NULL;
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :CUENTAADIC INTO :CUENTA, :TIPOCUEN;
                if (CUENTA IS NULL) then
                    begin
                    EXECUTE PROCEDURE ERROR (12, :IDDOC, :CUENTAADIC, 2);
                    CUENTA = CUENTAADIC;
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (12, :IDDOC, :CUENTA, 3);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (12, :IDDOC, :CUENTA, 4);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    if (DBADIC = 'S') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTAADIC, :CONCEPTO, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        SUMA = SUMA + MONTO;
                        END
                    ELSE
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTAADIC, :CONCEPTO, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        SUMA = SUMA - MONTO;
                        END
                    NUMITEMS = NUMITEMS + 1;
                    END
                END
            END
        /* CIERRE EL COMPROBANTE  */
        if (SUMA <> 0) then
            BEGIN
            if (SUMA > 0) then
                BEGIN
                DEBITO = 0;
                CREDITO = SUMA;
                END
            ELSE    
                BEGIN
                DEBITO = SUMA * -1;
                CREDITO = 0;
                END
            if ((TOTAL = 'K') or (TOTAL = 'T')) then
                BEGIN
                if (TOTAL = 'T') then
                    BEGIN
                    SELECT TERC_CTAPROV, TERC_PROV
                        FROM TERCEROS WHERE TERC_NIT = :NIT
                        INTO :CTACIERRE, :PROV;
                    if (PROV = 'S') then
                        SELECT PROV_CTAPAGAR FROM PROVEEDORES WHERE TERC_NIT = :nit
                        INTO :CTACIERRE;
                    END
                /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :CTACIERRE INTO :CUENTA, :TIPOCUEN;
                if (CUENTA IS NULL) then
                    begin
                    EXECUTE PROCEDURE ERROR (12, :IDDOC, :CTACIERRE, 2);
                    CUENTA = CTACIERRE;
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (12, :IDDOC, :CUENTA, 3);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (12, :IDDOC, :CUENTA, 4);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'N') then
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :DEBITO, :CREDITO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                END
            END /* SUMA */
        if (ERROR > 0) then
            VER = 'S';
        SUSPEND;
        END /* NO ANULADO */
    END /* EXISTE LA INTERFAZ */
ELSE
    BEGIN
    EXECUTE PROCEDURE ERROR (12, :IDDOC, :PREFIJO, 1);
    ERROR = ERROR + 1;
    VER = 'S';
    SUSPEND;
    END
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE SALIDAS_SIN_CONTABILIDAD(
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    ID INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    ESTADO VARCHAR(20),
    IDI INTEGER,
    IDC INTEGER)
AS
DECLARE VARIABLE VER CHAR(2);
declare variable FECICNT VARCHAR(10);
declare variable FECFCNT VARCHAR(10);
declare variable ERROR INTEGER;
declare variable idref INTEGER;
BEGIN
EXECUTE PROCEDURE fecha_a_conta(FECINI) returning_values (FECICNT);
EXECUTE PROCEDURE fecha_a_conta(FECFIN) returning_values (FECFCNT);
FOR SELECT SALI_ID, PREF_PRE, SALI_NUMERO FROM SALIDAS WHERE SALI_ANULADO = 'N' AND
    SALI_FECHA >= :FECINI AND SALI_FECHA <= :FECFIN
    INTO :ID, :PREF, :NUMERO
DO
  BEGIN
  idref = null;
  SELECT ENCO_IDREF FROM COMPROBANTE_ENCABEZADO WHERE ENCO_TIPOREF = 12 AND ENCO_FECHA >= :FECICNT AND ENCO_FECHA <= :FECFCNT and ENCO_IDREF = :id into :idref;
  if (idref IS NULL) then
  begin
  ESTADO = 'PROCESANDO';
  SUSPEND;
  SELECT MAX(ININ_ID) FROM INTERFAZ_INVENTARIO WHERE PREF_PRE = :PREF AND TIDO_COD = 12 INTO :IDI;
  EXECUTE PROCEDURE CONTABIL_SALIDA (:ID, :IDI) RETURNING_VALUES (:ERROR, :VER, :IDC);
  if (ERROR = 0) then
    BEGIN
      EXECUTE PROCEDURE CONTABILIZA_PENDIENTE (:IDC);
      ESTADO = 'OK';
      END
  ELSE
    ESTADO = 'ERROR';
  suspend;
  end
  END
END

^

SET TERM ; ^


/* 20100901B */
/* SI EL COSTO ES CERO, TRAIGA EL ULTIMO, EL PROMEDIO O EL ULTIMO DIF DE CERO */
SET TERM ^ ;

CREATE OR ALTER procedure COSTO_PROVEEDOR (
    NIT varchar(20),
    ARTI varchar(15),
    FECHA date)
returns (
    COSTO numeric(18,2))
AS
declare variable UNIDAD VARCHAR(8);
declare variable porprov char(10);
BEGIN
execute procedure lee_configuracion('COMPRAS', 'DOCUMENTOS', 'SUGERIR ULTIMO COSTO POR PROVEEDOR O GENERAL PARA EL ARTICULO') returning_values (:porprov);
/* busque el costo del proveedor, cuendo no hay trae el ultimo */
SELECT PVAR_COSTO FROM PROVEEDOR_ARTICULO
    WHERE TERC_NIT = :Nit AND ARTI_COD = :ARTI
    INTO :COSTO;
if ((COSTO IS NULL) or (COSTO = 0) or (PORPROV = 'GENERAL')) then
    BEGIN
    SELECT ARTI_UNIDAD FROM ARTICULO WHERE ARTI_COD = :ARTI INTO :UNIDAD;
    EXECUTE PROCEDURE ultimo_costo(:ARTI, :FECHA, :UNIDAD) returning_values (:COSTO);
    if (COSTO = 0) then
        EXECUTE PROCEDURE costo_promedio(:ARTI, :FECHA) returning_values (:COSTO);
    if (COSTO = 0) then
        SELECT FIRST 1 MVAR_COSTO FROM MOVIMIENTO_ARTICULO WHERE ARTI_COD = :ARTI AND MVAR_ENTRADA = 'S' AND MVAR_COSTO <> 0 ORDER BY MVAR_FECHA DESC INTO :COSTO;
    END
if (COSTO IS NULL) then
    COSTO = 0;
SUSPEND;
END
^

SET TERM ; ^


/* 20100901C */
SET TERM ^ ;

create procedure REMISIONES_COSTO_CERO
returns (
    ID INTEGER,
    ITEM INTEGER,
    FECHA DATE,
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    ARTICULO VARCHAR(20),
    COSTO NUMERIC(18,2),
    UNIDAD VARCHAR(8))
as
begin
FOR SELECT D.repr_id, D.rpvd_item, REPR_FECHA, PREF_PRE, REPR_NUMERO, ARTI_COD, RPVD_PRUNIT, RPVD_UNIDAD
    FROM remision_proveedor R, remision_proveedor_det D
    WHERE R.repr_id = D.repr_id AND D.rpvd_prunit = 0
    INTO :ID, :ITEM, :FECHA, :PREF, :NUMERO, :articulo,  :COSTO, :UNIDAD
    DO
    BEGIN
    EXECUTE PROCEDURE ULTIMO_COSTO(:ARTICULO, :FECHA, :UNIDAD) returning_values (:COSTO);
    UPDATE REMISION_PROVEEDOR_DET SET RPVD_PRUNIT = :COSTO WHERE REPR_ID = :ID AND RPVD_ITEM = :ITEM;
    suspend;
    END
end
^

SET TERM ; ^



/* 20100901D */
/* VERSION CON DOCUMENTOS CRUZADOS */
SET TERM ^ ;

ALTER PROCEDURE IMPR_CONCILIACIONB(
    ID INTEGER,
    CRUZADOS CHAR(1))
RETURNS (
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    CONCEPTO VARCHAR(60),
    CODCTA VARCHAR(3),
    NROCUENTA VARCHAR(20),
    BANCO VARCHAR(60),
    TITULAR VARCHAR(60),
    FECINI DATE,
    FECFIN DATE,
    SALDOINIS NUMERIC(18,2),
    SALDOFINS NUMERIC(18,2),
    SALDOINIE NUMERIC(18,2),
    SALDOFINE NUMERIC(18,2),
    CLASE CHAR(1),
    NOMCLASE VARCHAR(60),
    FECDOC DATE,
    OPERACION VARCHAR(20),
    TIPODOC VARCHAR(8),
    NUMDOC VARCHAR(10),
    CONCDOC VARCHAR(60),
    MONTODOC NUMERIC(18,2),
    MONTOCRU NUMERIC(18,2),
    EXPLDOC VARCHAR(255),
    TOTAL1 NUMERIC(18,2),
    TOTAL2 NUMERIC(18,2),
    TOTAL3 NUMERIC(18,2),
    TOTAL4 NUMERIC(18,2),
    SALDOE NUMERIC(18,2),
    SALDOS NUMERIC(18,2))
AS
declare variable ITEM INTEGER;
declare variable CTA INTEGER;
begin
SELECT COBN_PREFIJO, COBN_NUMERO, COBN_FECHA, COBN_CONCEPTO, COBN_FECINI, COBN_FECFIN, COBN_EXTRACTOINI, COBN_EXTRACTOFIN,
    E.CUBA_COD, CUBA_CODCTA, CUBA_NUMERO, CUBA_TITULAR, BANC_NOMBRE
    FROM conciliacion_encabezado E, cuentas_banco C, bancos B
    WHERE E.cuba_cod = C.cuba_cod AND C.banc_cod = B.banc_cod AND E.cobn_id = :ID
    INTO :prefijo, :numero, :fecha, :concepto, :fecini, :fecfin, :saldoinie, :saldofine,
        :cta, :codcta, :nrocuenta, :titular, :banco;
EXECUTE PROCEDURE saldo_cuenta_banco(:CTA, :fecini) returning_values (:saldoinis);
EXECUTE PROCEDURE saldo_cuenta_banco(:CTA, :fecfin+1) returning_values (:saldofins);
SELECT SUM(COBN_MONTO) FROM conciliacion_bancaria WHERE COBN_ID = :ID AND COBN_CLASE = '1' INTO :total1;
SELECT SUM(COBN_MONTO) FROM conciliacion_bancaria WHERE COBN_ID = :ID AND COBN_CLASE = '2' INTO :total2;
SELECT SUM(COBN_MONTO) FROM conciliacion_bancaria WHERE COBN_ID = :ID AND COBN_CLASE = '3' INTO :total3;
SELECT SUM(COBN_MONTO) FROM conciliacion_bancaria WHERE COBN_ID = :ID AND COBN_CLASE = '4' INTO :total4;
if (TOTAL1 IS NULL) then
    TOTAL1 = 0;
if (TOTAL2 IS NULL) then
    TOTAL2 = 0;
if (TOTAL3 IS NULL) then
    TOTAL3 = 0;
if (TOTAL4 IS NULL) then
    TOTAL4 = 0;
SALDOE = saldofine + total3 - total4;
SALDOS = saldofins + total1 - total2;
if (CRUZADOS = 'N') then
    BEGIN
    FOR SELECT COBN_CLASE, COBN_FEC, COBN_OPER, COBN_CONC, COBN_MONTO, TIDO_NOMCORTO, COBN_EXPLICA, COBN_PREFIJO || COBN_NUMERO
        FROM conciliacion_bancaria C, tipo_documento T WHERE C.cobn_tipodoc = T.tido_cod AND
        COBN_ID = :id AND COBN_CLASE <> '0' ORDER BY COBN_CLASE, COBN_ITEM
        INTO :clase, :fecdoc, :operacion, :concdoc, :montodoc, :tipodoc, :expldoc, :numdoc
        DO
        BEGIN
        if (CLASE = 1) then
            nomclase = 'CONSIGNACIONES Y CREDITOS FALTANTES EN LIBROS';
        if (CLASE = 2) then
            nomclase = 'CHEQUES Y DEBITOS FALTANTES EN LIBROS';
        if (CLASE = 3) then
            nomclase = 'CONSIGNACIONES Y CREDITOS FALTANTES EN EL EXTRACTO';
        if (CLASE = 4) then
            nomclase = 'CHEQUES Y DEBITOS FALTANTES EN EL EXTRACTO';
        suspend;
        END
    END
ELSE
    BEGIN
    FOR SELECT COBN_ITEM, COBN_CLASE, COBN_FEC, COBN_OPER, COBN_CONC, COBN_MONTO, TIDO_NOMCORTO, COBN_EXPLICA, COBN_PREFIJO || COBN_NUMERO
        FROM conciliacion_bancaria C, tipo_documento T
        WHERE C.cobn_tipodoc = T.tido_cod AND COBN_ID = :id
        ORDER BY COBN_CLASE, COBN_ITEM
        INTO :ITEM, :clase, :fecdoc, :operacion, :concdoc, :montodoc, :tipodoc, :expldoc, :numdoc
        DO
        BEGIN
        tipodoc = '';
        numdoc = '';
        montocru = 0;
        if (CLASE = 0) then
            BEGIN
            nomclase = 'DOCUMENTOS CCRUZADOS';
            FOR SELECT TIDO_NOMCORTO, D.cobd_prefijo || D.cobd_numero, M.moba_total
                FROM conciliacion_detalle D, tipo_documento T, movimiento_banco M
                WHERE COBN_ID = :ID AND COBN_ITEM = :ITEM AND D.cobd_tipodoc = T.tido_cod AND D.cobd_iddoc = M.moba_idref AND D.cobd_tipodoc = M.moba_tipodoc
                INTO :tipodoc, :numdoc, :montocru
                DO
                SUSPEND;
            END
        ELSE
            BEGIN
            if (CLASE = 1) then
                nomclase = 'CONSIGNACIONES Y CREDITOS FALTANTES EN LIBROS';
            if (CLASE = 2) then
                nomclase = 'CHEQUES Y DEBITOS FALTANTES EN LIBROS';
            if (CLASE = 3) then
                nomclase = 'CONSIGNACIONES Y CREDITOS FALTANTES EN EL EXTRACTO';
            if (CLASE = 4) then
                nomclase = 'CHEQUES Y DEBITOS FALTANTES EN EL EXTRACTO';
            suspend;
            END
        END
    END
end
^

SET TERM ; ^


/* 20100901E */
/* STRING TRUNCATION POR CONCEPTO MUY PEQUEÑO */

SET TERM ^ ;

CREATE OR ALTER procedure AUXILIAR_ARTICULO_MES (
    CUENTA varchar(20),
    ARTICULO varchar(15),
    ANO char(4),
    PERIODO integer)
returns (
    ID integer,
    TIPOCOMP varchar(3),
    PREFIJO varchar(4),
    NUMERO varchar(6),
    FECHA char(8),
    CONCEPTO varchar(60),
    NIT varchar(20),
    REF varchar(20),
    BASE numeric(18,2),
    PORC numeric(9,4),
    DEBITO numeric(18,2),
    CREDITO numeric(18,2),
    PROYECTO varchar(4),
    CENTRO varchar(4),
    TIPOREF integer,
    IDREF integer)
AS
BEGIN
  /* TRAE LOS MOV. DEL MES DE LA CUENTA y articulo DADOS */
  FOR SELECT E.ENCO_CONSEC, TICO_COD, PRCO_PREF, ENCO_NUMERO, ENCO_FECHA, CODE_CONCEPTO, D.TERC_NIT, CODE_REFER, CODE_BASE, CODE_PORC, CODE_DEBITO, CODE_CREDITO, PROY_COD, CENT_COD, ENCO_TIPOREF, ENCO_IDREF
    FROM COMPROBANTE_ENCABEZADO E, COMPROBANTE_DETALLE D
    WHERE E.ENCO_CONSEC = D.ENCO_CONSEC AND CUEN_COD = :CUENTA AND ARTI_COD = :ARTICULO
    INTO :ID, :TIPOCOMP, :PREFIJO, :NUMERO, :FECHA, :CONCEPTO, :NIT, :REF, :BASE, :PORC, :DEBITO, :CREDITO, :PROYECTO, :centro, :TIPOREF, :IDREF
    DO
        BEGIN
        if ((SUBSTR(FECHA, 1, 4) = :ANO) AND (CAST(SUBSTR(FECHA, 5, 6) AS INTEGER) = :PERIODO)) then
            SUSPEND;
        END
END
^

SET TERM ; ^


/* 20100902 */
ALTER TABLE CLIENTES
ADD CLIE_INSTCARTERA VARCHAR(255);
ALTER TABLE CLIENTES
ADD CLIE_RESALTAR T_BOOLEANO;
ALTER TABLE CLIENTES
ADD CLIE_MAILCART VARCHAR(100);


/* 20100906 */
/* agregar mas formas de pago */
SET TERM ^ ;

CREATE OR ALTER procedure CIERRE_FACTURACION (
    FECHA date,
    PUNTO integer,
    PREFIJO varchar(4))
returns (
    PREF varchar(4),
    AUTORIZA varchar(20),
    PUNTOVTA varchar(60),
    NUMINI varchar(6),
    NUMFIN varchar(6),
    NROFAC integer,
    HORAINI time,
    HORAFIN time,
    BASEFAC numeric(18,2),
    IVAFAC numeric(18,2),
    TOTALFAC numeric(18,2),
    NROITE integer,
    NRODEV integer,
    BASEDEV numeric(18,2),
    IVADEV numeric(18,2),
    TOTALDEV numeric(18,2),
    BASENETO numeric(18,2),
    IVANETO numeric(18,2),
    TOTALNETO numeric(18,2),
    BASEF0 numeric(18,2),
    IVAF0 numeric(18,2),
    TOTALF0 numeric(18,2),
    BASED0 numeric(18,2),
    IVAD0 numeric(18,2),
    TOTALD0 numeric(18,2),
    BASEF1 numeric(18,2),
    IVAF1 numeric(18,2),
    TOTALF1 numeric(18,2),
    BASED1 numeric(18,2),
    IVAD1 numeric(18,2),
    TOTALD1 numeric(18,2),
    BASEF2 numeric(18,2),
    IVAF2 numeric(18,2),
    TOTALF2 numeric(18,2),
    BASED2 numeric(18,2),
    IVAD2 numeric(18,2),
    TOTALD2 numeric(18,2),
    BASEF3 numeric(18,2),
    IVAF3 numeric(18,2),
    TOTALF3 numeric(18,2),
    BASED3 numeric(18,2),
    IVAD3 numeric(18,2),
    TOTALD3 numeric(18,2),
    BASEF4 numeric(18,2),
    IVAF4 numeric(18,2),
    TOTALF4 numeric(18,2),
    BASED4 numeric(18,2),
    IVAD4 numeric(18,2),
    TOTALD4 numeric(18,2),
    FORMAP1 numeric(18,2),
    FORMAP2 numeric(18,2),
    FORMAP3 numeric(18,2),
    FORMAP4 numeric(18,2),
    FORMAP5 numeric(18,2),
    FORMAP6 numeric(18,2),
    FORMAP7 numeric(18,2),
    FORMAP8 numeric(18,2),
    FORMAP9 numeric(18,2),
    FORMAP10 numeric(18,2),
    FORMAP11 numeric(18,2),
    FORMAP12 numeric(18,2),
    CARTERA numeric(18,2),
    VENDEDOR1 varchar(60),
    VTAVEND1 numeric(18,2),
    VENDEDOR2 varchar(60),
    VTAVEND2 numeric(18,2),
    VENDEDOR3 varchar(60),
    VTAVEND3 numeric(18,2),
    VENDEDOR4 varchar(60),
    VTAVEND4 numeric(18,2),
    VENDEDOR5 varchar(60),
    VTAVEND5 numeric(18,2),
    NROFACTANUL integer,
    IVANUL numeric(18,2),
    TOTALFACANUL numeric(18,2))
AS
declare variable tarifa NUMERIC(9,2);
declare variable BASEF NUMERIC(18,2);
declare variable IVAF NUMERIC(18,2);
declare variable TOTALF NUMERIC(18,2);
declare variable BASEDv NUMERIC(18,2);
declare variable IVAD NUMERIC(18,2);
declare variable TOTALD NUMERIC(18,2);
declare variable I INTEGER;
declare variable CODVEN INTEGER;
declare variable VENDED VARCHAR(60);
declare variable R_IDDOC INTEGER;
declare variable F_ID INTEGER;
declare variable F_TOTAL NUMERIC(18,2);
declare variable FACTOR NUMERIC(18,4);
declare variable AJUSTE INTEGER;
begin
AJUSTE = 0;
if (PREFIJO <> '') then
  SELECT PREF_PRE, AUTO_NUMERO FROM AUTORIZACIONES WHERE PREF_PRE = :PREFIJO INTO :PREF, :autoriza;
SELECT PTVT_NOM FROM PUNTO_VENTA WHERE PTVT_ID = :punto INTO :puntovta;
SELECT MIN(AUDI_HORA) FROM AUDITORIA WHERE TIDO_COD = 131 AND AUDI_FECHA = :FECHA INTO :HORAINI;
HORAFIN = CAST('NOW' AS TIME);
  /* LAS VENTAS */
  SELECT MIN(FACT_NUMERO), MAX(FACT_NUMERO), COUNT(FACT_NUMERO), SUM(FACT_TOTAL - FACT_IVAMONTO), SUM(FACT_IVAMONTO), SUM(FACT_TOTAL)
    FROM FACTURAS WHERE FACT_FECHA = :FECHA AND PTVT_ID = :PUNTO AND ((PREF_PRE = :PREFIJO) or (:PREFIJO = '')) and FACT_ANULADO = 'N'
    INTO :NUMINI, :NUMFIN, :NROFAC, :BASENETO, :IVANETO, :TOTALNETO;
  SELECT COUNT(FADE_ITEM), SUM(FADE_TOTAL-FADE_IVAMONTO), SUM(FADE_IVAMONTO), SUM(FADE_TOTAL) FROM facturas_detalle D, FACTURAS F
    WHERE D.FACT_ID = F.FACT_ID AND FACT_FECHA = :FECHA AND PTVT_ID = :PUNTO AND ((PREF_PRE = :PREFIJO) or (:PREFIJO = '')) AND FADE_CANT > 0 and FACT_ANULADO = 'N' and substring(d.arti_cod from 1 FOR 2) <> '.t'
    INTO :nroite, :BASEFAC, :IVAFAC, :TOTALFAC;
  SELECT COUNT(FADE_ITEM), SUM(FADE_IVAMONTO-FADE_TOTAL), SUM(FADE_IVAMONTO*-1), SUM(FADE_TOTAL*-1) FROM facturas_detalle D, FACTURAS F
    WHERE D.FACT_ID = F.FACT_ID AND FACT_FECHA = :FECHA AND PTVT_ID = :PUNTO AND ((PREF_PRE = :PREFIJO) or (:PREFIJO = '')) AND FADE_CANT < 0 and FACT_ANULADO = 'N' and substring(d.arti_cod from 1 FOR 2) <> '.t'
    INTO :NRODEV, :BASEDEV, :IVADEV, :TOTALDEV;
  SELECT COUNT(DVDE_ITEM), SUM(DVDE_TOTAL-DVDE_IVAMONTO), SUM(DVDE_IVAMONTO), SUM(DVDE_TOTAL) FROM devoluciones_ventas_detalle D, devoluciones_ventas F
    WHERE D.DEVT_ID = F.DEVT_ID AND DEVT_FECHA = :FECHA AND PTVT_ID = :PUNTO AND ((PREF_PRE = :PREFIJO) or (:PREFIJO = '')) AND DEVT_ANULADO = 'N' and substring(d.arti_cod from 1 FOR 2) <> '.t'
    INTO :I, :BASEDV, :IVAD, :TOTALD;
  SELECT COUNT(FACT_NUMERO),SUM(FACT_TOTAL - FACT_IVAMONTO), SUM(FACT_IVAMONTO) FROM FACTURAS
    WHERE FACT_FECHA = :FECHA AND PTVT_ID = :PUNTO AND ((PREF_PRE = :PREFIJO) or (:PREFIJO = '')) and FACT_ANULADO = 'S'
    INTO :NROFACTANUL, :TOTALFACANUL, :IVANUL;
  if (nrofac is null) then
    nrofac = 0;
  if (NROFACTANUL is null) then
    NROFACTANUL = 0;
  if (TOTALFACANUL is null) then
    TOTALFACANUL = 0;
  if (IVANUL is null) then
    IVANUL = 0;
  if (baseneto is null) then
    baseneto = 0;
  if (ivaneto is null) then
    ivaneto = 0;
  if (totalneto is null) then
    totalneto = 0;
  if (nroite is null) then
    nroite = 0;
  if (basefac is null) then
    basefac = 0;
  if (ivafac is null) then
    ivafac = 0;
  if (totalfac is null) then
    totalfac = 0;
  if (nrodev is null) then
    nrodev = 0;
  if (basedev is null) then
    basedev = 0;
  if (ivadev is null) then
    ivadev = 0;
  if (totaldev is null) then
    totaldev = 0;
  if (I is null) then
    I = 0;
  if (basedv is null) then
    basedv = 0;
  if (ivad is null) then
    ivad = 0;
  if (totald is null) then
    totald = 0;
  NRODEV = NRODEV + I;
  BASEDEV = BASEDEV + BASEDV;
  IVADEV = IVADEV + IVAD;
  TOTALDEV = TOTALDEV + TOTALD;

  /* POR TARIFA DE IVA */
  I = 0;
  BASEF0 = 0;
  BASED0 = 0;
  IVAF0 = 0;
  IVAD0 = 0;
  TOTALF0 = 0;
  TOTALD0 = 0;
  BASEF1 = 0;
  BASED1 = 0;
  IVAF1 = 0;
  IVAD1 = 0;
  TOTALF1 = 0;
  TOTALD1 = 0;
  BASEF2 = 0;
  BASED2 = 0;
  IVAF2 = 0;
  IVAD2 = 0;
  TOTALF2 = 0;
  TOTALD2 = 0;
  BASEF3 = 0;
  BASED3 = 0;
  IVAF3 = 0;
  IVAD3 = 0;
  TOTALF3 = 0;
  TOTALD3 = 0;
  BASEF4 = 0;
  BASED4 = 0;
  IVAF4 = 0;
  IVAD4 = 0;
  TOTALF4 = 0;
  TOTALD4 = 0;
  vtavend1 = 0;
  vtavend2 = 0;
  vtavend3 = 0;
  vtavend4 = 0;
  vtavend5 = 0;
  FOR SELECT TAIV_PORC FROM TARIFA_IVA ORDER BY TAIV_PORC INTO :TARIFA DO
    BEGIN
    I = I + 1;
    SELECT SUM(FADE_TOTAL-FADE_IVAMONTO), SUM(FADE_IVAMONTO), SUM(FADE_TOTAL) FROM facturas_detalle D, FACTURAS F
        WHERE D.FACT_ID = F.FACT_ID AND FACT_FECHA = :FECHA AND PTVT_ID = :PUNTO AND ((PREF_PRE = :PREFIJO) or (:PREFIJO = '')) AND FADE_CANT > 0 AND FADE_IVAPORC = :TARIFA and FACT_ANULADO = 'N'
        INTO :BASEF, :IVAF, :TOTALF;
    SELECT SUM(FADE_TOTAL-FADE_IVAMONTO), SUM(FADE_IVAMONTO), SUM(FADE_TOTAL) FROM facturas_detalle D, FACTURAS F
        WHERE D.FACT_ID = F.FACT_ID AND FACT_FECHA = :FECHA AND PTVT_ID = :PUNTO AND ((PREF_PRE = :PREFIJO) or (:PREFIJO = '')) AND FADE_CANT < 0 AND FADE_IVAPORC = :TARIFA and FACT_ANULADO = 'N'
        INTO :BASEDV, :IVAD, :TOTALD;
    if (basef is null) then
        basef = 0;
    if (ivaf is null) then
        ivaf = 0;
    if (totalf is null) then
        totalf = 0;
    if (basedv is null) then
        basedv = 0;
    if (ivad is null) then
        ivad = 0;
    if (totald is null) then
        totald = 0;

    FACTOR = 1;
    SELECT AJCI_FACTOR FROM ajuste_cierre WHERE AJCI_PORC = :TARIFA AND AJCI_FECINI <= :FECHA AND AJCI_FECFIN >= :FECHA INTO :FACTOR;
    if (FACTOR IS null) then
        FACTOR = 1;
    if (FACTOR <> 1) then
        AJUSTE = 1;
    BASEF = BASEF * FACTOR;
    BASEDV = BASEDV * FACTOR;
    IVAF = IVAF * FACTOR;
    IVAD = IVAD * FACTOR;
    TOTALF = TOTALF * FACTOR;
    TOTALD = TOTALD * FACTOR;

    if (I = 1) then
        BEGIN
        BASEF0 = BASEF;
        BASED0 = :BASEDV;
        IVAF0 = IVAF;
        IVAD0 = IVAD;
        TOTALF0 = TOTALF;
        TOTALD0 = TOTALD;
        SELECT SUM(DVDE_TOTAL-DVDE_IVAMONTO), SUM(DVDE_IVAMONTO), SUM(DVDE_TOTAL) FROM devoluciones_ventas_detalle D, devoluciones_ventas F
            WHERE D.DEVT_ID = F.DEVT_ID AND DEVT_FECHA = :FECHA AND PTVT_ID = :PUNTO AND ((PREF_PRE = :PREFIJO) or (:PREFIJO = '')) AND DVDE_IVAPORC = :TARIFA and DEVT_ANULADO = 'N'
            INTO :BASEDV, :IVAD, :TOTALD;
        if (basedv is null) then
            basedv = 0;
        if (ivad is null) then
            ivad = 0;
        if (totald is null) then
            totald = 0;
        BASED0 = BASED0 + BASEDV;
        IVAD0 = IVAD0 + IVAD;
        TOTALD0 = TOTALD0 + TOTALD;
        END
    if (I = 2) then
        BEGIN
        BASEF1 = BASEF;
        BASED1 = :BASEDV;
        IVAF1 = IVAF;
        IVAD1 = IVAD;
        TOTALF1 = TOTALF;
        TOTALD1 = TOTALD;
        SELECT SUM(DVDE_TOTAL-DVDE_IVAMONTO), SUM(DVDE_IVAMONTO), SUM(DVDE_TOTAL) FROM devoluciones_ventas_detalle D, devoluciones_ventas F
            WHERE D.DEVT_ID = F.DEVT_ID AND DEVT_FECHA = :FECHA AND PTVT_ID = :PUNTO AND ((PREF_PRE = :PREFIJO) or (:PREFIJO = '')) AND DVDE_IVAPORC = :TARIFA and DEVT_ANULADO = 'N'
            INTO :BASEDV, :IVAD, :TOTALD;
        if (basedv is null) then
            basedv = 0;
        if (ivad is null) then
            ivad = 0;
        if (totald is null) then
            totald = 0;
        BASED1 = BASED1 + BASEDV;
        IVAD1 = IVAD1 + IVAD;
        TOTALD1 = TOTALD1 + TOTALD;
        END
    if (I = 3) then
        BEGIN
        BASEF2 = BASEF;
        BASED2 = :BASEDV;
        IVAF2 = IVAF;
        IVAD2 = IVAD;
        TOTALF2 = TOTALF;
        TOTALD2 = TOTALD;
        SELECT SUM(DVDE_TOTAL-DVDE_IVAMONTO), SUM(DVDE_IVAMONTO), SUM(DVDE_TOTAL) FROM devoluciones_ventas_detalle D, devoluciones_ventas F
            WHERE D.DEVT_ID = F.DEVT_ID AND DEVT_FECHA = :FECHA AND PTVT_ID = :PUNTO AND ((PREF_PRE = :PREFIJO) or (:PREFIJO = '')) AND DVDE_IVAPORC = :TARIFA and DEVT_ANULADO = 'N'
            INTO :BASEDV, :IVAD, :TOTALD;
        if (basedv is null) then
            basedv = 0;
        if (ivad is null) then
            ivad = 0;
        if (totald is null) then
            totald = 0;
        BASED2 = BASED2 + BASEDV;
        IVAD2 = IVAD2 + IVAD;
        TOTALD2 = TOTALD2 + TOTALD;
        END
    if (I = 4) then
        BEGIN
        BASEF3 = BASEF;
        BASED3 = :BASEDV;
        IVAF3 = IVAF;
        IVAD3 = IVAD;
        TOTALF3 = TOTALF;
        TOTALD3 = TOTALD;
        SELECT SUM(DVDE_TOTAL-DVDE_IVAMONTO), SUM(DVDE_IVAMONTO), SUM(DVDE_TOTAL) FROM devoluciones_ventas_detalle D, devoluciones_ventas F
            WHERE D.DEVT_ID = F.DEVT_ID AND DEVT_FECHA = :FECHA AND PTVT_ID = :PUNTO AND ((PREF_PRE = :PREFIJO) or (:PREFIJO = '')) AND DVDE_IVAPORC = :TARIFA and DEVT_ANULADO = 'N'
            INTO :BASEDV, :IVAD, :TOTALD;
        if (basedv is null) then
            basedv = 0;
        if (ivad is null) then
            ivad = 0;
        if (totald is null) then
            totald = 0;
        BASED3 = BASED3 + BASEDV;
        IVAD3 = IVAD3 + IVAD;
        TOTALD3 = TOTALD3 + TOTALD;
        END
    if (I = 5) then
        BEGIN
        BASEF4 = BASEF;
        BASED4 = :BASEDV;
        IVAF4 = IVAF;
        IVAD4 = IVAD;
        TOTALF4 = TOTALF;
        TOTALD4 = TOTALD;
        SELECT SUM(DVDE_TOTAL-DVDE_IVAMONTO), SUM(DVDE_IVAMONTO), SUM(DVDE_TOTAL) FROM devoluciones_ventas_detalle D, devoluciones_ventas F
            WHERE D.DEVT_ID = F.DEVT_ID AND DEVT_FECHA = :FECHA AND PTVT_ID = :PUNTO AND ((PREF_PRE = :PREFIJO) or (:PREFIJO = '')) AND DVDE_IVAPORC = :TARIFA and DEVT_ANULADO = 'N'
            INTO :BASEDV, :IVAD, :TOTALD;
        if (basedv is null) then
            basedv = 0;
        if (ivad is null) then
            ivad = 0;
        if (totald is null) then
            totald = 0;
        BASED4 = BASED4 + BASEDV;
        IVAD4 = IVAD4 + IVAD;
        TOTALD4 = TOTALD4 + TOTALD;
        END
    END
  /* POR FORMA DE PAGO */
  SELECT SUM(RCPA_MONTO) FROM RECIBOS_CAJA_PAGO P, RECIBOS_CAJA R, PUNTO_VENTA PT
    WHERE R.RECA_ID = P.RECA_ID AND PT.PTVT_ID = :punto AND RECA_FECHA = :FECHA AND PT.caja_id = R.caja_id AND ((PT.PREF_PRE = :PREFIJO) or (:PREFIJO = '')) AND FOPA_ID = 1 and RECA_ANULADO = 'N'
    INTO :FORMAP1;
  SELECT SUM(RCPA_MONTO) FROM RECIBOS_CAJA_PAGO P, RECIBOS_CAJA R, PUNTO_VENTA PT
    WHERE R.RECA_ID = P.RECA_ID AND PT.PTVT_ID = :punto AND RECA_FECHA = :FECHA AND PT.caja_id = R.caja_id AND ((PT.PREF_PRE = :PREFIJO) or (:PREFIJO = '')) AND FOPA_ID = 2 and RECA_ANULADO = 'N'
    INTO :FORMAP2;
  SELECT SUM(RCPA_MONTO) FROM RECIBOS_CAJA_PAGO P, RECIBOS_CAJA R, PUNTO_VENTA PT
    WHERE R.RECA_ID = P.RECA_ID AND PT.PTVT_ID = :punto AND RECA_FECHA = :FECHA AND PT.caja_id = R.caja_id AND ((PT.PREF_PRE = :PREFIJO) or (:PREFIJO = '')) AND FOPA_ID = 3 and RECA_ANULADO = 'N'
    INTO :FORMAP3;
  SELECT SUM(RCPA_MONTO) FROM RECIBOS_CAJA_PAGO P, RECIBOS_CAJA R, PUNTO_VENTA PT
    WHERE R.RECA_ID = P.RECA_ID AND PT.PTVT_ID = :punto AND RECA_FECHA = :FECHA AND PT.caja_id = R.caja_id AND ((PT.PREF_PRE = :PREFIJO) or (:PREFIJO = '')) AND FOPA_ID = 4 and RECA_ANULADO = 'N'
    INTO :FORMAP4;
  SELECT SUM(RCPA_MONTO) FROM RECIBOS_CAJA_PAGO P, RECIBOS_CAJA R, PUNTO_VENTA PT
    WHERE R.RECA_ID = P.RECA_ID AND PT.PTVT_ID = :punto AND RECA_FECHA = :FECHA AND PT.caja_id = R.caja_id AND ((PT.PREF_PRE = :PREFIJO) or (:PREFIJO = '')) AND FOPA_ID = 5 and RECA_ANULADO = 'N'
    INTO :FORMAP5;
  SELECT SUM(RCPA_MONTO) FROM RECIBOS_CAJA_PAGO P, RECIBOS_CAJA R, PUNTO_VENTA PT
    WHERE R.RECA_ID = P.RECA_ID AND PT.PTVT_ID = :punto AND RECA_FECHA = :FECHA AND PT.caja_id = R.caja_id AND ((PT.PREF_PRE = :PREFIJO) or (:PREFIJO = '')) AND FOPA_ID = 6 and RECA_ANULADO = 'N'
    INTO :FORMAP6;
  SELECT SUM(RCPA_MONTO) FROM RECIBOS_CAJA_PAGO P, RECIBOS_CAJA R, PUNTO_VENTA PT
    WHERE R.RECA_ID = P.RECA_ID AND PT.PTVT_ID = :punto AND RECA_FECHA = :FECHA AND PT.caja_id = R.caja_id AND ((PT.PREF_PRE = :PREFIJO) or (:PREFIJO = '')) AND FOPA_ID = 7 and RECA_ANULADO = 'N'
    INTO :FORMAP7;
  SELECT SUM(RCPA_MONTO) FROM RECIBOS_CAJA_PAGO P, RECIBOS_CAJA R, PUNTO_VENTA PT
    WHERE R.RECA_ID = P.RECA_ID AND PT.PTVT_ID = :punto AND RECA_FECHA = :FECHA AND PT.caja_id = R.caja_id AND ((PT.PREF_PRE = :PREFIJO) or (:PREFIJO = '')) AND FOPA_ID = 8 and RECA_ANULADO = 'N'
    INTO :FORMAP8;
  SELECT SUM(RCPA_MONTO) FROM RECIBOS_CAJA_PAGO P, RECIBOS_CAJA R, PUNTO_VENTA PT
    WHERE R.RECA_ID = P.RECA_ID AND PT.PTVT_ID = :punto AND RECA_FECHA = :FECHA AND PT.caja_id = R.caja_id AND ((PT.PREF_PRE = :PREFIJO) or (:PREFIJO = '')) AND FOPA_ID = 9 and RECA_ANULADO = 'N'
    INTO :FORMAP9;
  SELECT SUM(RCPA_MONTO) FROM RECIBOS_CAJA_PAGO P, RECIBOS_CAJA R, PUNTO_VENTA PT
    WHERE R.RECA_ID = P.RECA_ID AND PT.PTVT_ID = :punto AND RECA_FECHA = :FECHA AND PT.caja_id = R.caja_id AND ((PT.PREF_PRE = :PREFIJO) or (:PREFIJO = '')) AND FOPA_ID = 10 and RECA_ANULADO = 'N'
    INTO :FORMAP10;
  SELECT SUM(RCPA_MONTO) FROM RECIBOS_CAJA_PAGO P, RECIBOS_CAJA R, PUNTO_VENTA PT
    WHERE R.RECA_ID = P.RECA_ID AND PT.PTVT_ID = :punto AND RECA_FECHA = :FECHA AND PT.caja_id = R.caja_id AND ((PT.PREF_PRE = :PREFIJO) or (:PREFIJO = '')) AND FOPA_ID = 11 and RECA_ANULADO = 'N'
    INTO :FORMAP11;
  SELECT SUM(RCPA_MONTO) FROM RECIBOS_CAJA_PAGO P, RECIBOS_CAJA R, PUNTO_VENTA PT
    WHERE R.RECA_ID = P.RECA_ID AND PT.PTVT_ID = :punto AND RECA_FECHA = :FECHA AND PT.caja_id = R.caja_id AND ((PT.PREF_PRE = :PREFIJO) or (:PREFIJO = '')) AND FOPA_ID = 12 and RECA_ANULADO = 'N'
    INTO :FORMAP12;

  cartera = 0;
  for SELECT FACT_ID,FACT_TOTAL FROM FACTURAS WHERE FACT_FECHA = :FECHA AND PTVT_ID = :PUNTO AND ((PREF_PRE = :PREFIJO) or (:PREFIJO = '')) and FACT_ANULADO = 'N' into :f_id,:F_TOTAL
    do
    begin
     Select COUNT(D.RECA_ID) FROM recibos_caja_detalle D, RECIBOS_CAJA R where R.RECA_ID = D.RECA_ID AND R.RECA_FECHA = :FECHA AND RECA_ANULADO = 'N' and D.RCDE_tipodoc = 31 and D.RCDE_IDDOC = :f_id into :r_iddoc;
     if (r_iddoc = 0) then
       CARTERA = :cartera + :F_TOTAL;
    end
  if (formap1 is null) then
    formap1 = 0;
  if (formap2 is null) then
    formap2 = 0;
  if (formap3 is null) then
    formap3 = 0;
  if (formap4 is null) then
    formap4 = 0;
  if (formap5 is null) then
    formap5 = 0;
  if (formap6 is null) then
    formap6 = 0;
  if (formap7 is null) then
    formap7 = 0;
  if (formap8 is null) then
    formap8 = 0;
  if (formap9 is null) then
    formap9 = 0;
  if (formap10 is null) then
    formap10 = 0;
  if (formap11 is null) then
    formap11 = 0;
  if (formap12 is null) then
    formap12 = 0;
  if (cartera is null) then
    cartera = 0;
  I = 0;
  FOR SELECT MAX(F.VEND_COD), MAX(VEND_NOMBRE), SUM(FACT_TOTAL - FACT_IVAMONTO) FROM FACTURAS F, VENDEDORES V
    WHERE F.VEND_COD = V.VEND_COD AND FACT_FECHA = :FECHA AND F.PTVT_ID = :PUNTO AND ((PREF_PRE = :PREFIJO) or (:PREFIJO = '')) and FACT_ANULADO = 'N'
    GROUP BY F.VEND_COD ORDER BY F.VEND_COD
    INTO :CODVEN, :VENDED, :TOTALF
    DO
    BEGIN
    if (totalf IS NULL) then
        TOTALF = 0;
    SELECT SUM(DEVT_TOTAL - DEVT_IVAMONTO) FROM DEVOLUCIONES_VENTAS
        WHERE VEND_COD = :CODVEN AND DEVT_FECHA = :FECHA AND PTVT_ID = :PUNTO AND ((PREF_PRE = :PREFIJO) or (:PREFIJO = '')) and DEVT_ANULADO = 'N'
        INTO :totald;
    if (TOTALD IS NULL) then
        TOTALD = 0;
    if (I = 0) then
        BEGIN
        vendedor1 = VENDED;
        vtavend1 = TOTALF - TOTALD;
        END
    if (I = 1) then
        BEGIN
        vendedor2 = VENDED;
        vtavend2 = TOTALF - TOTALD;
        END
    if (I = 2) then
        BEGIN
        vendedor3 = VENDED;
        vtavend3 = TOTALF - TOTALD;
        END
    if (I = 3) then
        BEGIN
        vendedor4 = VENDED;
        vtavend4 = TOTALF - TOTALD;
        END
    if (I = 4) then
        BEGIN
        vendedor5 = VENDED;
        vtavend5 = TOTALF - TOTALD;
        END
    I = I + 1;
    END
  if (AJUSTE = 1) then
    BEGIN
    BASEFAC = BASEF0 + BASEF1 + BASEF2 + BASEF3 + BASEF4;
    IVAFAC = IVAF0 + IVAF1 + IVAF2 + IVAF3 + IVAF4;
    TOTALFAC = totalf0 + TOTALF1 + TOTALF2 + TOTALF3 + TOTALF4;
    BASEDEV = totald0 + TOTALD1 + TOTALD2 + TOTALD3 + TOTALD4;
    IVADEV = IVAD0 + IVAD1 + IVAD2 + IVAD3 + IVAD4;
    TOTALDEV = totald0 + TOTALD1 + totald2 + totald3 + totald4;
    BASENETO = basefac - basedev;
    IVANETO = ivafac - ivadev;
    formap1 = formap1 * (totalfac - totaldev) / totalneto;
    formap2 = formap2 * (totalfac - totaldev) / totalneto;
    formap3 = formap3 * (totalfac - totaldev) / totalneto;
    formap4 = formap4 * (totalfac - totaldev) / totalneto;
    formap5 = formap5 * (totalfac - totaldev) / totalneto;
    formap6 = formap6 * (totalfac - totaldev) / totalneto;
    formap7 = formap7 * (totalfac - totaldev) / totalneto;
    formap8 = formap8 * (totalfac - totaldev) / totalneto;
    formap9 = formap9 * (totalfac - totaldev) / totalneto;
    formap10 = formap10 * (totalfac - totaldev) / totalneto;
    formap11 = formap11 * (totalfac - totaldev) / totalneto;
    formap12 = formap12 * (totalfac - totaldev) / totalneto;
    vtavend1 = vtavend1 * (totalfac - totaldev) / totalneto;
    vtavend2 = vtavend2 * (totalfac - totaldev) / totalneto;
    vtavend3 = vtavend3 * (totalfac - totaldev) / totalneto;
    vtavend4 = vtavend4 * (totalfac - totaldev) / totalneto;
    vtavend5 = vtavend5 * (totalfac - totaldev) / totalneto;
    TOTALNETO = totalfac - totaldev;
    END
  INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
    VALUES (USER, 123, :punto, 'I', (:formap1+:formap2+:formap3+:formap4+:formap5+:CARTERA));
  suspend;
end
^

SET TERM ; ^

/* 20100908 */
/* no borraba contabilización al anular provisional */

SET TERM ^ ;

CREATE OR ALTER TRIGGER RECIBO_PROVISIONAL_AU FOR RECIBO_PROVISIONAL
ACTIVE AFTER UPDATE POSITION 0
as
declare variable consec integer;
begin
if (NEW.rcpr_anulado = 'S') then
  begin
  select enco_consec from comprobante_encabezado where enco_tiporef = 65 and enco_idref = old.rcpr_id into :consec;
  if (NOT consec is null) then
      delete from comprobante_detalle where enco_consec = :consec;
  delete from comprobante_encabezado where enco_tiporef = 65 and enco_idref = old.rcpr_id;
  INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
    VALUES (USER, 65, NEW.rcpr_id, 'A', NEW.pref_pre || NEW.rcpr_numero);
  end
ELSE
  INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
    VALUES (USER, 65, NEW.rcpr_id, 'U', NEW.pref_pre || NEW.rcpr_numero);
/* ACTUALICE EL ANULADO EN LOS DETALLES */
if (OLD.RCPR_anulado <> NEW.RCPR_anulado) then
    BEGIN
    UPDATE recibo_provisional_pago  SET RPPA_ANULADO = NEW.RCPR_anulado WHERE RCPR_ID = NEW.RCPR_ID;
    UPDATE recibo_provisional_detalle  SET RPDE_ANULADO = NEW.RCPR_anulado WHERE RCPR_ID = NEW.RCPR_ID;
    END
if (OLD.RCPR_transmit <> NEW.RCPR_transmit) then
    BEGIN
    UPDATE recibo_provisional_pago  SET RPPA_TRANSMIT = NEW.RCPR_transmit WHERE RCPR_ID = NEW.RCPR_ID;
    UPDATE recibo_provisional_detalle SET RPDE_TRANSMIT = NEW.RCPR_transmit WHERE RCPR_ID = NEW.RCPR_ID;
    END
end
^

SET TERM ; ^


SET TERM ^ ;

CREATE OR ALTER TRIGGER RECIBO_PROVISIONAL_AD FOR RECIBO_PROVISIONAL
ACTIVE AFTER DELETE POSITION 0
as
declare variable consec integer;
begin
select enco_consec from comprobante_encabezado where enco_tiporef = 65 and enco_idref = old.rcpr_id into :consec;
if (NOT consec is null) then
    delete from comprobante_detalle where enco_consec = :consec;
delete from comprobante_encabezado where enco_tiporef = 65 and enco_idref = old.rcpr_id;
INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
    VALUES (USER, 65, OLD.rcpr_id, 'D', OLD.pref_pre || OLD.rcpr_numero);
end
^

SET TERM ; ^

/* 20100909 */
/* neto y totales por tarifa no tomaban las dev. del modulo */
SET TERM ^ ;

CREATE OR ALTER PROCEDURE CIERRE_FACTURACION(
    FECHA DATE,
    PUNTO INTEGER,
    PREFIJO VARCHAR(4))
RETURNS (
    PREF VARCHAR(4),
    AUTORIZA VARCHAR(20),
    PUNTOVTA VARCHAR(60),
    NUMINI VARCHAR(6),
    NUMFIN VARCHAR(6),
    NROFAC INTEGER,
    HORAINI TIME,
    HORAFIN TIME,
    BASEFAC NUMERIC(18,2),
    IVAFAC NUMERIC(18,2),
    TOTALFAC NUMERIC(18,2),
    NROITE INTEGER,
    NRODEV INTEGER,
    BASEDEV NUMERIC(18,2),
    IVADEV NUMERIC(18,2),
    TOTALDEV NUMERIC(18,2),
    BASENETO NUMERIC(18,2),
    IVANETO NUMERIC(18,2),
    TOTALNETO NUMERIC(18,2),
    BASEF0 NUMERIC(18,2),
    IVAF0 NUMERIC(18,2),
    TOTALF0 NUMERIC(18,2),
    BASED0 NUMERIC(18,2),
    IVAD0 NUMERIC(18,2),
    TOTALD0 NUMERIC(18,2),
    BASEF1 NUMERIC(18,2),
    IVAF1 NUMERIC(18,2),
    TOTALF1 NUMERIC(18,2),
    BASED1 NUMERIC(18,2),
    IVAD1 NUMERIC(18,2),
    TOTALD1 NUMERIC(18,2),
    BASEF2 NUMERIC(18,2),
    IVAF2 NUMERIC(18,2),
    TOTALF2 NUMERIC(18,2),
    BASED2 NUMERIC(18,2),
    IVAD2 NUMERIC(18,2),
    TOTALD2 NUMERIC(18,2),
    BASEF3 NUMERIC(18,2),
    IVAF3 NUMERIC(18,2),
    TOTALF3 NUMERIC(18,2),
    BASED3 NUMERIC(18,2),
    IVAD3 NUMERIC(18,2),
    TOTALD3 NUMERIC(18,2),
    BASEF4 NUMERIC(18,2),
    IVAF4 NUMERIC(18,2),
    TOTALF4 NUMERIC(18,2),
    BASED4 NUMERIC(18,2),
    IVAD4 NUMERIC(18,2),
    TOTALD4 NUMERIC(18,2),
    FORMAP1 NUMERIC(18,2),
    FORMAP2 NUMERIC(18,2),
    FORMAP3 NUMERIC(18,2),
    FORMAP4 NUMERIC(18,2),
    FORMAP5 NUMERIC(18,2),
    CARTERA NUMERIC(18,2),
    VENDEDOR1 VARCHAR(60),
    VTAVEND1 NUMERIC(18,2),
    VENDEDOR2 VARCHAR(60),
    VTAVEND2 NUMERIC(18,2),
    VENDEDOR3 VARCHAR(60),
    VTAVEND3 NUMERIC(18,2),
    VENDEDOR4 VARCHAR(60),
    VTAVEND4 NUMERIC(18,2),
    VENDEDOR5 VARCHAR(60),
    VTAVEND5 NUMERIC(18,2),
    NROFACTANUL INTEGER,
    IVANUL NUMERIC(18,2),
    TOTALFACANUL NUMERIC(18,2))
AS
declare variable tarifa NUMERIC(9,2);
declare variable BASEF NUMERIC(18,2);
declare variable IVAF NUMERIC(18,2);
declare variable TOTALF NUMERIC(18,2);
declare variable BASEDv NUMERIC(18,2);
declare variable IVAD NUMERIC(18,2);
declare variable TOTALD NUMERIC(18,2);
declare variable I INTEGER;
declare variable CODVEN INTEGER;
declare variable VENDED VARCHAR(60);
declare variable R_IDDOC INTEGER;
declare variable F_ID INTEGER;
declare variable F_TOTAL NUMERIC(18,2);
declare variable FACTOR NUMERIC(18,4);
declare variable AJUSTE INTEGER;
begin
AJUSTE = 0;
if (PREFIJO <> '') then
  SELECT PREF_PRE, AUTO_NUMERO FROM AUTORIZACIONES WHERE PREF_PRE = :PREFIJO INTO :PREF, :autoriza;
SELECT PTVT_NOM FROM PUNTO_VENTA WHERE PTVT_ID = :punto INTO :puntovta;
SELECT MIN(AUDI_HORA) FROM AUDITORIA WHERE TIDO_COD = 131 AND AUDI_FECHA = :FECHA INTO :HORAINI;
HORAFIN = CAST('NOW' AS TIME);
  /* LAS VENTAS */
  SELECT MIN(FACT_NUMERO), MAX(FACT_NUMERO), COUNT(FACT_NUMERO), SUM(FACT_TOTAL - FACT_IVAMONTO), SUM(FACT_IVAMONTO), SUM(FACT_TOTAL)
    FROM FACTURAS WHERE FACT_FECHA = :FECHA AND PTVT_ID = :PUNTO AND ((PREF_PRE = :PREFIJO) or (:PREFIJO = '')) and FACT_ANULADO = 'N'
    INTO :NUMINI, :NUMFIN, :NROFAC, :BASENETO, :IVANETO, :TOTALNETO;
  SELECT COUNT(FADE_ITEM), SUM(FADE_TOTAL-FADE_IVAMONTO), SUM(FADE_IVAMONTO), SUM(FADE_TOTAL) FROM facturas_detalle D, FACTURAS F
    WHERE D.FACT_ID = F.FACT_ID AND FACT_FECHA = :FECHA AND PTVT_ID = :PUNTO AND ((PREF_PRE = :PREFIJO) or (:PREFIJO = '')) AND FADE_CANT > 0 and FACT_ANULADO = 'N' and substring(d.arti_cod from 1 FOR 2) <> '.t'
    INTO :nroite, :BASEFAC, :IVAFAC, :TOTALFAC;
  SELECT COUNT(FADE_ITEM), SUM(FADE_IVAMONTO-FADE_TOTAL), SUM(FADE_IVAMONTO*-1), SUM(FADE_TOTAL*-1) FROM facturas_detalle D, FACTURAS F
    WHERE D.FACT_ID = F.FACT_ID AND FACT_FECHA = :FECHA AND PTVT_ID = :PUNTO AND ((PREF_PRE = :PREFIJO) or (:PREFIJO = '')) AND FADE_CANT < 0 and FACT_ANULADO = 'N' and substring(d.arti_cod from 1 FOR 2) <> '.t'
    INTO :NRODEV, :BASEDEV, :IVADEV, :TOTALDEV;
  SELECT COUNT(DVDE_ITEM), SUM(DVDE_TOTAL-DVDE_IVAMONTO), SUM(DVDE_IVAMONTO), SUM(DVDE_TOTAL) FROM devoluciones_ventas_detalle D, devoluciones_ventas F
    WHERE D.DEVT_ID = F.DEVT_ID AND DEVT_FECHA = :FECHA AND PTVT_ID = :PUNTO AND ((PREF_PRE = :PREFIJO) or (:PREFIJO = '')) AND DEVT_ANULADO = 'N' and substring(d.arti_cod from 1 FOR 2) <> '.t'
    INTO :I, :BASEDV, :IVAD, :TOTALD;
  SELECT COUNT(FACT_NUMERO),SUM(FACT_TOTAL - FACT_IVAMONTO), SUM(FACT_IVAMONTO) FROM FACTURAS
    WHERE FACT_FECHA = :FECHA AND PTVT_ID = :PUNTO AND ((PREF_PRE = :PREFIJO) or (:PREFIJO = '')) and FACT_ANULADO = 'S'
    INTO :NROFACTANUL, :TOTALFACANUL, :IVANUL;
  if (nrofac is null) then
    nrofac = 0;
  if (NROFACTANUL is null) then
    NROFACTANUL = 0;
  if (TOTALFACANUL is null) then
    TOTALFACANUL = 0;
  if (IVANUL is null) then
    IVANUL = 0;
  if (baseneto is null) then
    baseneto = 0;
  if (ivaneto is null) then
    ivaneto = 0;
  if (totalneto is null) then
    totalneto = 0;
  if (nroite is null) then
    nroite = 0;
  if (basefac is null) then
    basefac = 0;
  if (ivafac is null) then
    ivafac = 0;
  if (totalfac is null) then
    totalfac = 0;
  if (nrodev is null) then
    nrodev = 0;
  if (basedev is null) then
    basedev = 0;
  if (ivadev is null) then
    ivadev = 0;
  if (totaldev is null) then
    totaldev = 0;
  if (I is null) then
    I = 0;
  if (basedv is null) then
    basedv = 0;
  if (ivad is null) then
    ivad = 0;
  if (totald is null) then
    totald = 0;
  NRODEV = NRODEV + I;
  BASENETO = BASENETO - BASEDV;
  IVANETO = IVANETO - IVAD;
  TOTALNETO = TOTALNETO - TOTALD;

  BASEDEV = BASEDEV + BASEDV;
  IVADEV = IVADEV + IVAD;
  TOTALDEV = TOTALDEV + TOTALD;

  /* POR TARIFA DE IVA */
  I = 0;
  BASEF0 = 0;
  BASED0 = 0;
  IVAF0 = 0;
  IVAD0 = 0;
  TOTALF0 = 0;
  TOTALD0 = 0;
  BASEF1 = 0;
  BASED1 = 0;
  IVAF1 = 0;
  IVAD1 = 0;
  TOTALF1 = 0;
  TOTALD1 = 0;
  BASEF2 = 0;
  BASED2 = 0;
  IVAF2 = 0;
  IVAD2 = 0;
  TOTALF2 = 0;
  TOTALD2 = 0;
  BASEF3 = 0;
  BASED3 = 0;
  IVAF3 = 0;
  IVAD3 = 0;
  TOTALF3 = 0;
  TOTALD3 = 0;
  BASEF4 = 0;
  BASED4 = 0;
  IVAF4 = 0;
  IVAD4 = 0;
  TOTALF4 = 0;
  TOTALD4 = 0;
  vtavend1 = 0;
  vtavend2 = 0;
  vtavend3 = 0;
  vtavend4 = 0;
  vtavend5 = 0;
  FOR SELECT TAIV_PORC FROM TARIFA_IVA ORDER BY TAIV_PORC INTO :TARIFA DO
    BEGIN
    I = I + 1;
    SELECT SUM(FADE_TOTAL-FADE_IVAMONTO), SUM(FADE_IVAMONTO), SUM(FADE_TOTAL) FROM facturas_detalle D, FACTURAS F
        WHERE D.FACT_ID = F.FACT_ID AND FACT_FECHA = :FECHA AND PTVT_ID = :PUNTO AND ((PREF_PRE = :PREFIJO) or (:PREFIJO = '')) AND FADE_CANT > 0 AND FADE_IVAPORC = :TARIFA and FACT_ANULADO = 'N'
        INTO :BASEF, :IVAF, :TOTALF;
    SELECT SUM(FADE_TOTAL-FADE_IVAMONTO), SUM(FADE_IVAMONTO), SUM(FADE_TOTAL) FROM facturas_detalle D, FACTURAS F
        WHERE D.FACT_ID = F.FACT_ID AND FACT_FECHA = :FECHA AND PTVT_ID = :PUNTO AND ((PREF_PRE = :PREFIJO) or (:PREFIJO = '')) AND FADE_CANT < 0 AND FADE_IVAPORC = :TARIFA and FACT_ANULADO = 'N'
        INTO :BASEDV, :IVAD, :TOTALD;
    if (basef is null) then
        basef = 0;
    if (ivaf is null) then
        ivaf = 0;
    if (totalf is null) then
        totalf = 0;
    if (basedv is null) then
        basedv = 0;
    if (ivad is null) then
        ivad = 0;
    if (totald is null) then
        totald = 0;

    FACTOR = 1;
    SELECT AJCI_FACTOR FROM ajuste_cierre WHERE AJCI_PORC = :TARIFA AND AJCI_FECINI <= :FECHA AND AJCI_FECFIN >= :FECHA INTO :FACTOR;
    if (FACTOR IS null) then
        FACTOR = 1;
    if (FACTOR <> 1) then
        AJUSTE = 1;
    BASEF = BASEF * FACTOR;
    BASEDV = BASEDV * FACTOR;
    IVAF = IVAF * FACTOR;
    IVAD = IVAD * FACTOR;
    TOTALF = TOTALF * FACTOR;
    TOTALD = TOTALD * FACTOR;

    if (I = 1) then
        BEGIN
        BASEF0 = BASEF;
        BASED0 = :BASEDV;
        IVAF0 = IVAF;
        IVAD0 = IVAD;
        TOTALF0 = TOTALF;
        TOTALD0 = TOTALD;
        SELECT SUM(DVDE_TOTAL-DVDE_IVAMONTO), SUM(DVDE_IVAMONTO), SUM(DVDE_TOTAL) FROM devoluciones_ventas_detalle D, devoluciones_ventas F
            WHERE D.DEVT_ID = F.DEVT_ID AND DEVT_FECHA = :FECHA AND PTVT_ID = :PUNTO AND ((PREF_PRE = :PREFIJO) or (:PREFIJO = '')) AND DVDE_IVAPORC = :TARIFA and DEVT_ANULADO = 'N'
            INTO :BASEDV, :IVAD, :TOTALD;
        if (basedv is null) then
            basedv = 0;
        if (ivad is null) then
            ivad = 0;
        if (totald is null) then
            totald = 0;
        BASED0 = BASED0 - BASEDV;
        IVAD0 = IVAD0 - IVAD;
        TOTALD0 = TOTALD0 - TOTALD;
        END
    if (I = 2) then
        BEGIN
        BASEF1 = BASEF;
        BASED1 = :BASEDV;
        IVAF1 = IVAF;
        IVAD1 = IVAD;
        TOTALF1 = TOTALF;
        TOTALD1 = TOTALD;
        SELECT SUM(DVDE_TOTAL-DVDE_IVAMONTO), SUM(DVDE_IVAMONTO), SUM(DVDE_TOTAL) FROM devoluciones_ventas_detalle D, devoluciones_ventas F
            WHERE D.DEVT_ID = F.DEVT_ID AND DEVT_FECHA = :FECHA AND PTVT_ID = :PUNTO AND ((PREF_PRE = :PREFIJO) or (:PREFIJO = '')) AND DVDE_IVAPORC = :TARIFA and DEVT_ANULADO = 'N'
            INTO :BASEDV, :IVAD, :TOTALD;
        if (basedv is null) then
            basedv = 0;
        if (ivad is null) then
            ivad = 0;
        if (totald is null) then
            totald = 0;
        BASED1 = BASED1 - BASEDV;
        IVAD1 = IVAD1 - IVAD;
        TOTALD1 = TOTALD1 - TOTALD;
        END
    if (I = 3) then
        BEGIN
        BASEF2 = BASEF;
        BASED2 = :BASEDV;
        IVAF2 = IVAF;
        IVAD2 = IVAD;
        TOTALF2 = TOTALF;
        TOTALD2 = TOTALD;
        SELECT SUM(DVDE_TOTAL-DVDE_IVAMONTO), SUM(DVDE_IVAMONTO), SUM(DVDE_TOTAL) FROM devoluciones_ventas_detalle D, devoluciones_ventas F
            WHERE D.DEVT_ID = F.DEVT_ID AND DEVT_FECHA = :FECHA AND PTVT_ID = :PUNTO AND ((PREF_PRE = :PREFIJO) or (:PREFIJO = '')) AND DVDE_IVAPORC = :TARIFA and DEVT_ANULADO = 'N'
            INTO :BASEDV, :IVAD, :TOTALD;
        if (basedv is null) then
            basedv = 0;
        if (ivad is null) then
            ivad = 0;
        if (totald is null) then
            totald = 0;
        BASED2 = BASED2 - BASEDV;
        IVAD2 = IVAD2 - IVAD;
        TOTALD2 = TOTALD2 - TOTALD;
        END
    if (I = 4) then
        BEGIN
        BASEF3 = BASEF;
        BASED3 = :BASEDV;
        IVAF3 = IVAF;
        IVAD3 = IVAD;
        TOTALF3 = TOTALF;
        TOTALD3 = TOTALD;
        SELECT SUM(DVDE_TOTAL-DVDE_IVAMONTO), SUM(DVDE_IVAMONTO), SUM(DVDE_TOTAL) FROM devoluciones_ventas_detalle D, devoluciones_ventas F
            WHERE D.DEVT_ID = F.DEVT_ID AND DEVT_FECHA = :FECHA AND PTVT_ID = :PUNTO AND ((PREF_PRE = :PREFIJO) or (:PREFIJO = '')) AND DVDE_IVAPORC = :TARIFA and DEVT_ANULADO = 'N'
            INTO :BASEDV, :IVAD, :TOTALD;
        if (basedv is null) then
            basedv = 0;
        if (ivad is null) then
            ivad = 0;
        if (totald is null) then
            totald = 0;
        BASED3 = BASED3 - BASEDV;
        IVAD3 = IVAD3 - IVAD;
        TOTALD3 = TOTALD3 - TOTALD;
        END
    if (I = 5) then
        BEGIN
        BASEF4 = BASEF;
        BASED4 = :BASEDV;
        IVAF4 = IVAF;
        IVAD4 = IVAD;
        TOTALF4 = TOTALF;
        TOTALD4 = TOTALD;
        SELECT SUM(DVDE_TOTAL-DVDE_IVAMONTO), SUM(DVDE_IVAMONTO), SUM(DVDE_TOTAL) FROM devoluciones_ventas_detalle D, devoluciones_ventas F
            WHERE D.DEVT_ID = F.DEVT_ID AND DEVT_FECHA = :FECHA AND PTVT_ID = :PUNTO AND ((PREF_PRE = :PREFIJO) or (:PREFIJO = '')) AND DVDE_IVAPORC = :TARIFA and DEVT_ANULADO = 'N'
            INTO :BASEDV, :IVAD, :TOTALD;
        if (basedv is null) then
            basedv = 0;
        if (ivad is null) then
            ivad = 0;
        if (totald is null) then
            totald = 0;
        BASED4 = BASED4 - BASEDV;
        IVAD4 = IVAD4 - IVAD;
        TOTALD4 = TOTALD4 - TOTALD;
        END
    END
  /* POR FORMA DE PAGO */
  SELECT SUM(RCPA_MONTO) FROM RECIBOS_CAJA_PAGO P, RECIBOS_CAJA R, PUNTO_VENTA PT
    WHERE R.RECA_ID = P.RECA_ID AND PT.PTVT_ID = :punto AND RECA_FECHA = :FECHA AND PT.caja_id = R.caja_id AND ((PT.PREF_PRE = :PREFIJO) or (:PREFIJO = '')) AND FOPA_ID = 1 and RECA_ANULADO = 'N'
    INTO :FORMAP1;
  SELECT SUM(RCPA_MONTO) FROM RECIBOS_CAJA_PAGO P, RECIBOS_CAJA R, PUNTO_VENTA PT
    WHERE R.RECA_ID = P.RECA_ID AND PT.PTVT_ID = :punto AND RECA_FECHA = :FECHA AND PT.caja_id = R.caja_id AND ((PT.PREF_PRE = :PREFIJO) or (:PREFIJO = '')) AND FOPA_ID = 2 and RECA_ANULADO = 'N'
    INTO :FORMAP2;
  SELECT SUM(RCPA_MONTO) FROM RECIBOS_CAJA_PAGO P, RECIBOS_CAJA R, PUNTO_VENTA PT
    WHERE R.RECA_ID = P.RECA_ID AND PT.PTVT_ID = :punto AND RECA_FECHA = :FECHA AND PT.caja_id = R.caja_id AND ((PT.PREF_PRE = :PREFIJO) or (:PREFIJO = '')) AND FOPA_ID = 3 and RECA_ANULADO = 'N'
    INTO :FORMAP3;
  SELECT SUM(RCPA_MONTO) FROM RECIBOS_CAJA_PAGO P, RECIBOS_CAJA R, PUNTO_VENTA PT
    WHERE R.RECA_ID = P.RECA_ID AND PT.PTVT_ID = :punto AND RECA_FECHA = :FECHA AND PT.caja_id = R.caja_id AND ((PT.PREF_PRE = :PREFIJO) or (:PREFIJO = '')) AND FOPA_ID = 4 and RECA_ANULADO = 'N'
    INTO :FORMAP4;
  SELECT SUM(RCPA_MONTO) FROM RECIBOS_CAJA_PAGO P, RECIBOS_CAJA R, PUNTO_VENTA PT
    WHERE R.RECA_ID = P.RECA_ID AND PT.PTVT_ID = :punto AND RECA_FECHA = :FECHA AND PT.caja_id = R.caja_id AND ((PT.PREF_PRE = :PREFIJO) or (:PREFIJO = '')) AND FOPA_ID = 5 and RECA_ANULADO = 'N'
    INTO :FORMAP5;

  cartera = 0;
  for SELECT FACT_ID,FACT_TOTAL FROM FACTURAS WHERE FACT_FECHA = :FECHA AND PTVT_ID = :PUNTO AND ((PREF_PRE = :PREFIJO) or (:PREFIJO = '')) and FACT_ANULADO = 'N' into :f_id,:F_TOTAL
    do
    begin
     Select COUNT(D.RECA_ID) FROM recibos_caja_detalle D, RECIBOS_CAJA R where R.RECA_ID = D.RECA_ID AND R.RECA_FECHA = :FECHA AND RECA_ANULADO = 'N' and D.RCDE_tipodoc = 31 and D.RCDE_IDDOC = :f_id into :r_iddoc;
     if (r_iddoc = 0) then
       CARTERA = :cartera + :F_TOTAL;
    end
  if (formap1 is null) then
    formap1 = 0;
  if (formap2 is null) then
    formap2 = 0;
  if (formap3 is null) then
    formap3 = 0;
  if (formap4 is null) then
    formap4 = 0;
  if (formap5 is null) then
    formap5 = 0;
  if (cartera is null) then
    cartera = 0;
  I = 0;
  FOR SELECT MAX(F.VEND_COD), MAX(VEND_NOMBRE), SUM(FACT_TOTAL - FACT_IVAMONTO) FROM FACTURAS F, VENDEDORES V
    WHERE F.VEND_COD = V.VEND_COD AND FACT_FECHA = :FECHA AND F.PTVT_ID = :PUNTO AND ((PREF_PRE = :PREFIJO) or (:PREFIJO = '')) and FACT_ANULADO = 'N'
    GROUP BY F.VEND_COD ORDER BY F.VEND_COD
    INTO :CODVEN, :VENDED, :TOTALF
    DO
    BEGIN
    if (totalf IS NULL) then
        TOTALF = 0;
    SELECT SUM(DEVT_TOTAL - DEVT_IVAMONTO) FROM DEVOLUCIONES_VENTAS
        WHERE VEND_COD = :CODVEN AND DEVT_FECHA = :FECHA AND PTVT_ID = :PUNTO AND ((PREF_PRE = :PREFIJO) or (:PREFIJO = '')) and DEVT_ANULADO = 'N'
        INTO :totald;
    if (TOTALD IS NULL) then
        TOTALD = 0;
    if (I = 0) then
        BEGIN
        vendedor1 = VENDED;
        vtavend1 = TOTALF - TOTALD;
        END
    if (I = 1) then
        BEGIN
        vendedor2 = VENDED;
        vtavend2 = TOTALF - TOTALD;
        END
    if (I = 2) then
        BEGIN
        vendedor3 = VENDED;
        vtavend3 = TOTALF - TOTALD;
        END
    if (I = 3) then
        BEGIN
        vendedor4 = VENDED;
        vtavend4 = TOTALF - TOTALD;
        END
    if (I = 4) then
        BEGIN
        vendedor5 = VENDED;
        vtavend5 = TOTALF - TOTALD;
        END
    I = I + 1;
    END
  if (AJUSTE = 1) then
    BEGIN
    BASEFAC = BASEF0 + BASEF1 + BASEF2 + BASEF3 + BASEF4;
    IVAFAC = IVAF0 + IVAF1 + IVAF2 + IVAF3 + IVAF4;
    TOTALFAC = totalf0 + TOTALF1 + TOTALF2 + TOTALF3 + TOTALF4;
    BASEDEV = totald0 + TOTALD1 + TOTALD2 + TOTALD3 + TOTALD4;
    IVADEV = IVAD0 + IVAD1 + IVAD2 + IVAD3 + IVAD4;
    TOTALDEV = totald0 + TOTALD1 + totald2 + totald3 + totald4;
    BASENETO = basefac - basedev;
    IVANETO = ivafac - ivadev;
    formap1 = formap1 * (totalfac - totaldev) / totalneto;
    formap2 = formap2 * (totalfac - totaldev) / totalneto;
    formap3 = formap3 * (totalfac - totaldev) / totalneto;
    formap4 = formap4 * (totalfac - totaldev) / totalneto;
    formap5 = formap5 * (totalfac - totaldev) / totalneto;
    vtavend1 = vtavend1 * (totalfac - totaldev) / totalneto;
    vtavend2 = vtavend2 * (totalfac - totaldev) / totalneto;
    vtavend3 = vtavend3 * (totalfac - totaldev) / totalneto;
    vtavend4 = vtavend4 * (totalfac - totaldev) / totalneto;
    vtavend5 = vtavend5 * (totalfac - totaldev) / totalneto;
    TOTALNETO = totalfac - totaldev;
    END
  INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
    VALUES (USER, 123, :punto, 'I', (:formap1+:formap2+:formap3+:formap4+:formap5+:CARTERA));
  suspend;
end
^

SET TERM ; ^


/* 20100914 */
/* reuso se usaba para incrementar la cant de componentes y para entrar al inv. el sobrante
   ahora solo se usa para el ingreso ya que siempre se deben incrementar las cantidades */
SET TERM ^ ;

CREATE OR ALTER TRIGGER PLAN_PRODUCCION_DET_AU FOR PLAN_PRODUCCION_DET
ACTIVE AFTER UPDATE POSITION 0
as
declare variable descr VARCHAR(60);
declare variable MERMA NUMERIC(18,4);
declare variable PESOCMP NUMERIC(18,4);
declare variable TOTAL FLOAT;
declare variable FACTOR FLOAT;
declare variable CODCMP VARCHAR(20);
declare variable CANTPRO NUMERIC(18,4);
declare variable CANTCMP NUMERIC(18,4);
declare variable CANTSOB NUMERIC(18,4);
declare variable UNDCMP VARCHAR(8);
declare variable PORCMP FLOAT;
declare variable entrada CHAR(1);
declare variable i integer;
declare variable sobrante varchar(15);
declare variable porsob numeric(9,4);
declare variable REUSO CHAR(1);
declare variable ITEM INTEGER;
declare variable NUMROWS INTEGER;
declare variable TIPOORD INTEGER;
declare variable totcant numeric(18,4);
declare variable Pref varchar(4);
declare variable Num varchar(6);
declare variable BodDes varchar(2);
declare variable Fec Date;
declare variable SOBTOT CHAR(1);
BEGIN
if ((OLD.plpd_transmit <> NEW.plpd_transmit) AND (NEW.plpd_transmit = 'N')) then
    BEGIN
    totcant = 0;
    CANTPRO = NEW.plpd_cant * NEW.plpd_factor;
    select plpr_fecfin, plpr_pref, plpr_numero, plpr_entrada, plpr_boddes from plan_produccion
        where plpr_id = new.plpr_id into :fec, :Pref, :Num, :entrada, :boddes;
    if (entrada = 'S') then
        begin
        i = 0;
        select arti_sobrante, arti_porcsobr, ARTI_REUSOB, ARTI_SOBTOT from articulo
            where arti_cod = new.arti_cod into :sobrante, :porsob, :reuso, :sobtot;

        select sum(arpr_porc) from articulos_producto where arti_cod = new.arti_cod into :total;
        FOR SELECT arpr_comp, ARPR_CANT, ARPR_UNIDAD, ARPR_PORC, ARTI_DES, arti_peso, arpr_merma
            from articulos_producto AP, ARTICULO A2
            WHERE AP.arpr_comp = A2.arti_cod AND AP.arti_cod = new.arti_cod ORDER by ARPR_ITEM
            INTO :codcmp, :cantcmp, :undcmp, :porcmp, :descr, :pesocmp, :MERMA
            DO
            BEGIN
            EXECUTE PROCEDURE factor_unidad_cant(:codcmp, :undcmp) returning_values (:FACTOR);
            if (((cantcmp is null) or (cantcmp = 0)) AND (PORCMP IS NOT NULL) AND (porcmp <> 0)) then
                BEGIN
                cantcmp = NEW.plpd_cant * NEW.plpd_factor * NEW.plpd_peso / TOTAL * PORCMP; /* APLICA LA PROPORCION */
                if ((MERMA IS NOT NULL) AND (MERMA <> 0)) then
                    cantcmp = cantcmp * (100 + MERMA) / 100;
                if ((sobrante <> '') and (porsob <> 0) and (sobrante = codcmp)) then
                    begin
                    cantsob = cantpro * new.plpd_peso;
                    cantsob = cantsob / TOTAL * porsob; /* APLICA LA PROPORCION */
                    cantcmp = cantcmp + cantsob;
                    end
                totcant = totcant + cantcmp;
                END
            ELSE
                BEGIN
                cantcmp = cantcmp * FACTOR * pesocmp * NEW.plpd_cant * NEW.plpd_factor;
                if (SOBTOT = 'S') then
                    totcant = totcant + cantcmp;
                END
            END

        /* ingrese el sobrante */
        if (NEW.plpd_transmit = 'N') then
          if ((sobrante <> '') and (porsob <> 0) AND (REUSO = 'N')) then
              begin
              select arti_peso from articulo where arti_cod = :sobrante into :pesocmp;
              INSERT INTO MOVIMIENTO_ARTICULO
                (ARTI_COD, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM, TERC_NIT)
                VALUES(:sobrante, :boddes, :FEC, 27, new.plpr_id, 'SOBRANTE PLAN PRODUCCION ' || :PREF || :num || ' ARTICULO:' || new.arti_cod,
                (:porsob * :totcant /100)/:pesocmp, 0, 'S', null, :Pref, :Num, 0, null);
              end
        end
    END
ELSE
  BEGIN
  if ((OLD.plpr_id <> 0) and (OLD.plpd_anulado = 'N')) then
    BEGIN
    FOR SELECT arpr_comp, ARPR_CANT
        from plan_produccion_productos where plpr_id = old.plpr_id and plpd_item = old.plpd_item
        INTO :codcmp, :cantcmp
        DO
        BEGIN
        /* INSERTE O ACTUALICE EL COMPONENTE */
        UPDATE plan_produccion_cons SET PLPC_CANT = PLPC_CANT - :cantcmp
            WHERE PLPD_ID = OLD.plpr_id AND ARTI_COD = :codcmp;
        END
    DELETE FROM plan_produccion_productos where plpr_id = old.plpr_id and plpd_item = old.plpd_item;
    select arti_sobrante from articulo where arti_cod = OLD.arti_cod into :sobrante;
    DELETE FROM movimiento_articulo M WHERE M.mvar_tipodoc = 27 AND M.mvar_idref = OLD.plpr_id AND MVAR_ITEM = 0 AND ARTI_COD = :sobrante;
    END

  if ((NEW.plpr_id <> 0) and (new.plpd_anulado = 'N')) then
    BEGIN
    totcant = 0;
    CANTPRO = NEW.plpd_cant * NEW.plpd_factor;
    select plpr_fecfin, plpr_pref, plpr_numero, plpr_entrada, plpr_boddes from plan_produccion
        where plpr_id = new.plpr_id into :fec, :Pref, :Num, :entrada, :boddes;
    if (entrada = 'S') then
        begin
        i = 0;
        select arti_sobrante, arti_porcsobr, ARTI_REUSOB, ARTI_SOBTOT from articulo
            where arti_cod = new.arti_cod into :sobrante, :porsob, :reuso, :sobtot;

        select sum(arpr_porc) from articulos_producto where arti_cod = new.arti_cod into :total;
        FOR SELECT arpr_comp, ARPR_CANT, ARPR_UNIDAD, ARPR_PORC, ARTI_DES, arti_peso, arpr_merma
            from articulos_producto AP, ARTICULO A2
            WHERE AP.arpr_comp = A2.arti_cod AND AP.arti_cod = new.arti_cod ORDER by ARPR_ITEM
            INTO :codcmp, :cantcmp, :undcmp, :porcmp, :descr, :pesocmp, :MERMA
            DO
            BEGIN
            EXECUTE PROCEDURE factor_unidad_cant(:codcmp, :undcmp) returning_values (:FACTOR);
            if (((cantcmp is null) or (cantcmp = 0)) AND (PORCMP IS NOT NULL) AND (porcmp <> 0)) then
                BEGIN
                cantcmp = NEW.plpd_cant * NEW.plpd_factor * NEW.plpd_peso / TOTAL * PORCMP; /* APLICA LA PROPORCION */
                if ((MERMA IS NOT NULL) AND (MERMA <> 0)) then
                    cantcmp = cantcmp * (100 + MERMA) / 100;
                if ((sobrante <> '') and (porsob <> 0) and (sobrante = codcmp) and (reuso = 'N')) then
                    begin
                    cantsob = cantpro * new.plpd_peso;
                    cantsob = cantsob / TOTAL * porsob; /* APLICA LA PROPORCION */
                    cantcmp = cantcmp + cantsob;
                    end
                totcant = totcant + cantcmp;
                END
            ELSE
                BEGIN
                cantcmp = cantcmp * FACTOR * pesocmp * NEW.plpd_cant * NEW.plpd_factor;
                if (SOBTOT = 'S') then
                    totcant = totcant + cantcmp;
                END

            i = i + 1;
            insert into plan_produccion_productos (plpr_id, plpd_item, plpp_nrocmop, arpr_comp, arpr_cant, arpr_porc, arpr_unidad, arpr_merma, arti_peso)
                values(new.plpr_id, new.plpd_item, :i, :codcmp,  :cantcmp, :porcmp, :undcmp, :merma, :pesocmp);

            SELECT COUNT(ARTI_COD) FROM articulos_producto WHERE ARTI_COD = :codcmp INTO :NUMROWS;
            if (NUMROWS <> 0) then
               TIPOORD = 19;
            else
                TIPOORD = 24;

            /* INSERTE O ACTUALICE EL COMPONENTE */
            if (NOT EXISTS (SELECT PLPC_ITEM FROM plan_produccion_cons WHERE PLPD_ID = new.plpr_id AND ARTI_COD = :codcmp)) then
                BEGIN
                select max(plpc_item) from plan_produccion_cons where PLPD_ID = new.plpr_id into :item;
                item = item + 1;
                INSERT INTO plan_produccion_cons (PLPD_ID, PLPC_ITEM, PLPC_CODBAR, ARTI_COD, PLPC_CANT, PLPC_UNIDAD, PLPC_EXIST, PLPC_ORDENAR, PLPC_ORDENTIPO, PLPC_ORDENID, PLPC_ANULADO, PLPC_TRANSMIT, PLPC_DESC)
                    VALUES (new.plpr_id, :item, :codcmp, :codcmp, :cantcmp, :undcmp, 0, 0, :tipoord, 0, 'N', 'N', :descr);
                END
            ELSE
                UPDATE plan_produccion_cons SET PLPC_CANT = PLPC_CANT + :cantcmp
                    WHERE PLPD_ID = NEW.plpr_id AND ARTI_COD = :codcmp;
            END
        end
    end
  END
end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER PLAN_PRODUCCION_DET_AI FOR PLAN_PRODUCCION_DET
ACTIVE AFTER INSERT POSITION 0
as
declare variable descr VARCHAR(60);
declare variable MERMA NUMERIC(18,4);
declare variable PESOCMP NUMERIC(18,4);
declare variable TOTAL FLOAT;
declare variable FACTOR FLOAT;
declare variable CODCMP VARCHAR(20);
declare variable CANTPRO NUMERIC(18,4);
declare variable CANTCMP NUMERIC(18,4);
declare variable CANTSOB NUMERIC(18,4);
declare variable UNDCMP VARCHAR(8);
declare variable PORCMP FLOAT;
declare variable entrada CHAR(1);
declare variable i integer;
declare variable sobrante varchar(15);
declare variable porsob numeric(9,4);
declare variable REUSO CHAR(1);
declare variable ITEM INTEGER;
declare variable NUMROWS INTEGER;
declare variable TIPOORD INTEGER;
BEGIN
if ((NEW.plpr_id <> 0) and (new.plpd_anulado = 'N')) then
    BEGIN
    CANTPRO = NEW.plpd_cant * NEW.plpd_factor;
    select plpr_entrada from plan_produccion where plpr_id = new.plpr_id into :entrada;
    if (entrada = 'S') then
        begin
        i = 0;
        select arti_sobrante, arti_porcsobr, ARTI_REUSOB from articulo
            where arti_cod = new.arti_cod into :sobrante, :porsob, :reuso;

        select sum(arpr_porc) from articulos_producto where arti_cod = new.arti_cod into :total;
        FOR SELECT arpr_comp, ARPR_CANT, ARPR_UNIDAD, ARPR_PORC, ARTI_DES, arti_peso, arpr_merma
            from articulos_producto AP, ARTICULO A2
            WHERE AP.arpr_comp = A2.arti_cod AND AP.arti_cod = new.arti_cod ORDER by ARPR_ITEM
            INTO :codcmp, :cantcmp, :undcmp, :porcmp, :descr, :pesocmp, :MERMA
            DO
            BEGIN
            EXECUTE PROCEDURE factor_unidad_cant(:codcmp, :undcmp) returning_values (:FACTOR);
            if (((cantcmp is null) or (cantcmp = 0)) AND (PORCMP IS NOT NULL) AND (porcmp <> 0)) then
                BEGIN
                cantcmp = NEW.plpd_cant * NEW.plpd_factor * NEW.plpd_peso / TOTAL * PORCMP; /* APLICA LA PROPORCION */
                if ((MERMA IS NOT NULL) AND (MERMA <> 0)) then
                    cantcmp = cantcmp * (100 + MERMA) / 100;
                if ((sobrante <> '') and (porsob <> 0) and (sobrante = codcmp)) then
                    begin
                    cantsob = cantpro * new.plpd_peso;
                    cantsob = cantsob / TOTAL * porsob; /* APLICA LA PROPORCION */
                    cantcmp = cantcmp + cantsob;
                    end
                END
            ELSE
                BEGIN
                cantcmp = cantcmp * FACTOR * pesocmp * NEW.plpd_cant * NEW.plpd_factor;
                END

            i = i + 1;
            insert into plan_produccion_productos (plpr_id, plpd_item, plpp_nrocmop, arpr_comp, arpr_cant, arpr_porc, arpr_unidad, arpr_merma, arti_peso)
                values(new.plpr_id, new.plpd_item, :i, :codcmp,  :cantcmp, :porcmp, :undcmp, :merma, :pesocmp);

            SELECT COUNT(ARTI_COD) FROM articulos_producto WHERE ARTI_COD = :codcmp INTO :NUMROWS;
            if (NUMROWS <> 0) then
               TIPOORD = 19;
            else
                TIPOORD = 24;

            /* INSERTE O ACTUALICE EL COMPONENTE */
            if (NOT EXISTS (SELECT PLPC_ITEM FROM plan_produccion_cons WHERE PLPD_ID = new.plpr_id AND ARTI_COD = :codcmp)) then
                BEGIN
                select max(plpc_item) from plan_produccion_cons where PLPD_ID = new.plpr_id into :item;
                if (item is null) then
                    item = 0;
                item = item + 1;
                INSERT INTO plan_produccion_cons (PLPD_ID, PLPC_ITEM, PLPC_CODBAR, ARTI_COD, PLPC_CANT, PLPC_UNIDAD, PLPC_EXIST, PLPC_ORDENAR, PLPC_ORDENTIPO, PLPC_ORDENID, PLPC_ANULADO, PLPC_TRANSMIT, PLPC_DESC)
                    VALUES (new.plpr_id, :item, :codcmp, :codcmp, :cantcmp, :undcmp, 0, 0, :tipoord, 0, 'N', 'N', :descr);
                END
            ELSE
                UPDATE plan_produccion_cons SET PLPC_CANT = PLPC_CANT + :cantcmp
                    WHERE PLPD_ID = NEW.plpr_id AND ARTI_COD = :codcmp;
            END
        end
    end
end
^

SET TERM ; ^


SET TERM ^ ;

CREATE OR ALTER PROCEDURE IMPR_PLANPROD(
    ID INTEGER)
RETURNS (
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    FECFIN DATE,
    CONCEPTO VARCHAR(60),
    RESPONSABLE VARCHAR(60),
    OBS BLOB SUB_TYPE 0 SEGMENT SIZE 80,
    ITEM INTEGER,
    ARTICULO VARCHAR(15),
    CODBAR VARCHAR(15),
    ARTIDES VARCHAR(60),
    CANT NUMERIC(18,4),
    UNIDAD VARCHAR(8),
    MERMA NUMERIC(18,4),
    PESO NUMERIC(18,4),
    OBSITEM BLOB SUB_TYPE 0 SEGMENT SIZE 80,
    CODCOMP VARCHAR(20),
    DESCOMP VARCHAR(60),
    CANTCOMP NUMERIC(18,4),
    UNICOMP VARCHAR(8))
AS
declare variable sobrante varchar(15);
declare variable porsob numeric(9,4);
BEGIN
SELECT PLPR_PREF, PLPR_NUMERO, PLPR_FECINI, PLPR_FECFIN, PLPR_CONC, PLPR_RESPONSABLE, PLPR_OBS
    FROM plan_produccion O WHERE PLPR_ID = :ID into
    :PREF, :NUMERO, :FECHA,
    :FECFIN, :CONCEPTO, :RESPONSABLE, :OBS;
FOR SELECT PLPD_ITEM, p.ARTI_COD, PLPD_CODBAR, PLPD_DESC, PLPD_CANT, PLPD_UNIDAD, PLPD_PESO, PLPD_OBS, arti_sobrante, arti_porcsobr
    FROM plan_produccion_det p, articulo a WHERE a.arti_cod = p.arti_cod and PLPR_ID = :ID
    ORDER BY PLPD_ITEM
    INTO :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :PESO, :OBSITEM, :sobrante, :porsob
    DO
      BEGIN
      codcomp = '';
      descomp = '';
      cantcomp = 0;
      unicomp = '';
      SUSPEND;
      for select arpr_comp, arti_des, arpr_cant, arpr_unidad
        from plan_produccion_productos P, ARTICULO A
        where p.plpr_id = :id and p.plpd_item = :item and P.arpr_comp = A.arti_cod
        into :codcomp, :descomp, :cantcomp, :unicomp
        DO
        BEGIN
        ARTICULO = '';
        CODBAR = '';
        ARTIDES = '';
        CANT = 0;
        UNIDAD = '';
        MERMA = 0;
        PESO = 0;
        OBSITEM = '';
        if ((sobrante <> '') and (porsob <> 0) and (sobrante = codcomp)) then
            begin
            merma = CANTCOMP / (100 + PORSOB) * PORSOB;
            end
        SUSPEND;
        END
      END
END
^

SET TERM ; ^


/* 20100916 */
/* NO VERIFICABA EL OK EN S AL VALIDAR SI ESTABA USADO EL DOCUMENTO Y POR ESO NO TRAIA TODOS */
SET TERM ^ ;

CREATE OR ALTER procedure DOCCOMPRA_X_PROVEEDOR (
    NIT varchar(20),
    TIPODOC integer,
    TIPODES integer,
    FECHA date)
returns (
    PREFIJO varchar(4),
    NUMERO varchar(6),
    NROPROV varchar(10),
    VALIDEZ integer,
    ID integer,
    FECDOC date,
    SUBTOTAL numeric(18,2),
    IVA numeric(18,2),
    CONSUMO numeric(18,2),
    TOTAL numeric(18,2))
AS
declare variable VENCE DATE;
declare variable ITEM INTEGER;
declare variable FALTA NUMERIC(18,4);
declare variable FALTAT NUMERIC(18,4);
declare variable UNIDAD VARCHAR(8);
declare variable FACTOR NUMERIC(18,4);
declare variable DIAS INTEGER;
declare variable usado CHAR(2);
declare variable NUMROWS INTEGER;
declare variable IDF INTEGER;
declare variable UNAVEZ CHAR(2);
BEGIN
EXECUTE PROCEDURE lee_configuracion('COMPRAS','DOCUMENTOS','NUMERO DE DIAS MAXIMO PARA CRUZAR DOCUMENTO') returning_values (DIAS);
EXECUTE PROCEDURE lee_configuracion('COMPRAS','DOCUMENTOS','PERMITIR LLAMAR DOCUMENTOS PREVIAMENTE USADOS EN OTRO TIPO DE DOCUMENTO') returning_values (UNAVEZ);
if (TIPODOC = 21) then /* FACTURA */
    BEGIN
    FOR SELECT FACO_ID, PREF_PRE, FACO_NUMERO, FACO_FECHA, FACO_VENCE, FACO_NUMPROV
        FROM FACTURAS_COMPRA WHERE TERC_NIT = :NIT AND FACO_FECHA <= :FECHA AND (FACO_FECHA >= (:FECHA-:DIAS)) AND FACO_ANULADO = 'N'
        INTO :ID, :PREFIJO, :NUMERO, :FECDOC, :VENCE, :nroprov DO
        BEGIN
        if ((UNAVEZ <> 'NO') or NOT EXISTS(SELECT COFA_ID FROM CONSOLIDADO_FALTANTES WHERE COFA_TIPOORI = 21 AND COFA_IDORI = :id AND COFA_OK = 'S')) then
            BEGIN
            EXECUTE PROCEDURE TOTAL_DOC_COMPRA(TIPODOC, ID) returning_values (SUBTOTAL, IVA, CONSUMO);
            TOTAL = SUBTOTAL + IVA + CONSUMO;
            VALIDEZ = VENCE - FECDOC;
            if (TIPODES <> 0) then
                BEGIN
                /* RECORRA LOS ITEMS PARA VER SI TODO ESTA DEVUELTO */
                FALTAT = 0;
                FOR SELECT FCDE_ITEM, (FCDE_CANT*FCDE_FACTOR-FCDE_DEVUELTO) FROM FACTURAS_COMPRAS_DETALLE
                    WHERE FACO_ID = :ID ORDER BY FCDE_ITEM INTO :ITEM, :FALTA DO
                    BEGIN
                    if (tipodes <> 24) then
                        EXECUTE procedure FALTANTE(TIPODOC, TIPODES, :ID, :ITEM) returning_values (:FALTA, :unidad,  :FACTOR);
                    FALTAT = FALTAT + FALTA;
                    END
                if (FALTAT <> 0) then
                    SUSPEND;
                END
            ELSE
                SUSPEND;
            END
        END
    END
if (TIPODOC = 22) then /* REMISION */
    BEGIN
    FOR SELECT REPR_ID, PREF_PRE, REPR_NUMERO, REPR_FECHA, 0, REPR_NUMPROV
        FROM remision_proveedor WHERE TERC_NIT = :NIT AND REPR_FECHA <= :FECHA AND (REPR_FECHA >= (:FECHA-:DIAS)) AND REPR_ANULADO = 'N'
        INTO :ID, :PREFIJO, :NUMERO, :FECDOC, :VALIDEZ, :nroprov DO
        BEGIN
        if ((UNAVEZ <> 'NO') or NOT EXISTS(SELECT COFA_ID FROM CONSOLIDADO_FALTANTES WHERE COFA_TIPOORI = 22 AND COFA_IDORI = :id AND COFA_OK = 'S')) then
            BEGIN
            EXECUTE PROCEDURE TOTAL_DOC_COMPRA(TIPODOC, ID) returning_values (SUBTOTAL, IVA, CONSUMO);
            TOTAL = SUBTOTAL + IVA + CONSUMO;
            if (TIPODES <> 0) then
                BEGIN
                /* RECORRA LOS ITEMS PARA VER SI TODO ESTA DEVUELTO */
                FALTAT = 0;
                FOR SELECT RPVD_ITEM FROM remision_proveedor_det WHERE REPR_ID = :ID ORDER BY RPVD_ITEM INTO :ITEM DO
                    BEGIN
                    EXECUTE procedure FALTANTE(TIPODOC, TIPODES, :ID, :ITEM) returning_values (:FALTA, :unidad,  :FACTOR);
                    FALTAT = FALTAT + FALTA;
                    END
                if (FALTAT <> 0) then
                    SUSPEND;
                END
            ELSE
                SUSPEND;
            END
        END
    END
if (TIPODOC = 24) then /* DEVOLUCION */
    BEGIN
    FOR SELECT DVCO_ID, PREF_PRE, DVCO_NUMERO, DVCO_FECHA, 0, DVCO_FACTID
        FROM DEVOLUCIONES_COMPRAS WHERE TERC_NIT = :NIT AND DVCO_FECHA <= :FECHA AND DVCO_ANULADO = 'N'
        INTO :ID, :PREFIJO, :NUMERO, :FECDOC, :VALIDEZ, :idf DO
        BEGIN
        nroprov = '';
        SELECT FACO_NUMPROV FROM facturas_compra WHERE FACO_ID = :idF INTO :nroprov;
        EXECUTE PROCEDURE TOTAL_DOC_COMPRA(TIPODOC, ID) returning_values (SUBTOTAL, IVA, CONSUMO);
        TOTAL = SUBTOTAL + IVA + CONSUMO;
        SUSPEND;
        END
    END
if (TIPODOC = 23) then /* ORDEN */
    BEGIN
    FOR SELECT ORDC_ID, PREF_PRE, ORDC_NUMERO, ORDC_FECHA, ORDC_VALIDEZ, ''
        FROM ORDENES_COMPRA WHERE TERC_NIT = :NIT AND ORDC_FECHA <= :FECHA AND ((ORDC_FECHA+ORDC_VALIDEZ) >= :FECHA) AND ORDC_ANULADO = 'N'
        INTO :ID, :PREFIJO, :NUMERO, :FECDOC, :VALIDEZ, :nroprov DO
        BEGIN
        if ((UNAVEZ <> 'NO') or NOT EXISTS(SELECT COFA_ID FROM CONSOLIDADO_FALTANTES WHERE COFA_TIPOORI = 23 AND COFA_IDORI = :id AND COFA_OK = 'S')) then
            BEGIN
            EXECUTE PROCEDURE TOTAL_DOC_COMPRA(TIPODOC, ID) returning_values (SUBTOTAL, IVA, CONSUMO);
            TOTAL = SUBTOTAL + IVA + CONSUMO;
            if (TIPODES <> 0) then
                BEGIN
                /* RECORRA LOS ITEMS PARA VER SI TODO ESTA USADO */
                FALTAT = 0;
                EXECUTE PROCEDURE lee_configuracion('COMPRAS','DOCUMENTOS','PERMITIR LLAMAR DOCUMENTOS PREVIAMENTE USADOS EN OTRO TIPO DE DOCUMENTO') returning_values (:USADO);
                if (USADO = 'NO') then
                    SELECT COUNT(*) FROM consolidado_faltantes WHERE COFA_TIPOORI = 23 AND COFA_IDORI = :ID AND COFA_TIPODES <> :tipodes AND COFA_OK = 'S' INTO :NUMROWS;
                ELSE
                    NUMROWS = 0;
                if (NUMROWS = 0) then
                    FOR SELECT OCDE_ITEM FROM ordenes_compra_detalle WHERE ORDC_ID = :ID ORDER BY OCDE_ITEM INTO :ITEM DO
                        BEGIN
                        EXECUTE procedure FALTANTE(TIPODOC, TIPODES, :ID, :ITEM) returning_values (:FALTA, :unidad,  :FACTOR);
                        FALTAT = FALTAT + FALTA;
                        END
                if (FALTAT <> 0) then
                    SUSPEND;
                END
            ELSE
                SUSPEND;
            END
        END
    END
if (TIPODOC = 25) then /* COTIZACION */
    BEGIN
    FOR SELECT COPR_ID, PREF_PRE, COPR_NUMERO, COPR_FECHA, COPR_VALIDEZ, ''
        FROM cotizacion_PROVEEDOR WHERE TERC_NIT = :NIT AND COPR_FECHA <= :FECHA AND ((COPR_FECHA+COPR_VALIDEZ) >= :FECHA) AND COPR_ANULADO = 'N'
        INTO :ID, :PREFIJO, :NUMERO, :FECDOC, :VALIDEZ, :nroprov DO
        BEGIN
        if ((UNAVEZ <> 'NO') or NOT EXISTS(SELECT COFA_ID FROM CONSOLIDADO_FALTANTES WHERE COFA_TIPOORI = 25 AND COFA_IDORI = :id AND COFA_OK = 'S')) then
            BEGIN
            EXECUTE PROCEDURE TOTAL_DOC_COMPRA(TIPODOC, ID) returning_values (SUBTOTAL, IVA, CONSUMO);
            TOTAL = SUBTOTAL + IVA + CONSUMO;
            if (TIPODES <> 0) then
                BEGIN
                /* RECORRA LOS ITEMS PARA VER SI TODO ESTA DEVUELTO */
                FALTAT = 0;
                EXECUTE PROCEDURE lee_configuracion('COMPRAS','DOCUMENTOS','PERMITIR LLAMAR DOCUMENTOS PREVIAMENTE USADOS EN OTRO TIPO DE DOCUMENTO') returning_values (:USADO);
                if (USADO = 'NO') then
                    SELECT COUNT(*) FROM consolide_faltantes WHERE CEFA_TIPOORI = 25 AND CEFA_IDORI = :ID AND CEFA_TIPODES <> :tipodes INTO :NUMROWS;
                ELSE
                    NUMROWS = 0;
                if (NUMROWS = 0) then
                    FOR SELECT CPRD_ITEM FROM cotizaciones_proveedor_det WHERE COPR_ID = :ID ORDER BY CPRD_ITEM INTO :ITEM DO
                        BEGIN
                        EXECUTE procedure FALTANTE(TIPODOC, TIPODES, :ID, :ITEM) returning_values (:FALTA, :unidad,  :FACTOR);
                        FALTAT = FALTAT + FALTA;
                        END
                if (FALTAT <> 0) then
                    SUSPEND;
                END
            ELSE
                SUSPEND;
            END
        END
    END
END
^

SET TERM ; ^


/* 20100916B */
/* EN VENTAS DEL MISMO DIA FALLABA LA IMPRESION DE LOS PUNTOS ACUMULADOS, TOMABA EL INICIAL MAS LA ULTIMA FACTURA DEL DIA IGNORANDO LAS OTRAS
   EN EL ACUMULADO DEL SIGUIENTE DIA SI LA INCLUIA NO SE LE PERDIAN LOS PUNTOS AL CLIENTE */
SET TERM ^ ;

CREATE OR ALTER PROCEDURE CONSULTA_PUNTOS_CLIENTE(
    IDDOC INTEGER,
    CLIENTE VARCHAR(20),
    FECHA DATE)
RETURNS (
    PTDOC INTEGER,
    PTACUM INTEGER,
    PTVENCER INTEGER,
    FECPTOS DATE)
AS
declare variable numrows integer;
declare variable anos integer;
declare variable fecaux date;
declare variable fecaux2 date;
declare variable nitcontado varchar(20);
declare variable ok integer;
declare variable ptaux integer;
declare variable PTAGENCIA CHAR(2);
begin
ptdoc = 0;
ptacum = 0;
ptvencer = 0;
FECPTOS = :FECHA;
ok = 1;
if (IDDOC <> 0) then
    begin
    /* verifique que no sea cliente de contado de la autorización */
    select max(auto_nitcontado) from facturas f, autorizaciones a
        where f.pref_pre = a.pref_pre and fact_id = :iddoc into :nitcontado;
    if (cliente = nitcontado) then
        ok = 0;

    if (ok <> 0) then
        begin
        select count(ptcl_id) from puntos_cliente where ptcl_nit = :cliente and ptcl_tipodoc = 31 and ptcl_iddoc = :iddoc into :numrows;
        if (numrows <> 0) then
            begin
            select SUM(ptcl_db-ptcl_cr) from puntos_cliente where ptcl_nit = :cliente and ptcl_tipodoc = 31 and ptcl_iddoc = :iddoc into :ptdoc;
            end
        end
    end
/* los puntos totales */
if (ok <> 0) then
  BEGIN
  EXECUTE PROCEDURE lee_configuracion ('FACTURACION', 'POS', 'MANEJAR TABLA DE PUNTOS DE CLIENTE ACUMULADOS PARA VARIAS AGENCIAS') returning_values (ptagencia);
  if (PTAGENCIA = 'SI') then
    BEGIN
    SELECT PTCA_ACUMULADO, PTCA_PORVENCER, PTCA_FECHA FROM puntos_cliente_acumulado WHERE TERC_NIT = :cliente
        INTO :ptacum, :ptvencer, :fecptos;
    SUSPEND;
    END
  ELSE
    BEGIN
    select first 1 ptcl_fecha, ptcl_saldo from puntos_cliente
        where ptcl_nit = :cliente and ptcl_fecha <= :fecha order by ptcl_fecha desc, PTCL_ID desc
        into :fecaux, :ptacum;
    select sum(ptcl_db - ptcl_cr) from puntos_cliente
        where ptcl_nit = :cliente and ptcl_fecha = :fecaux into :ptaux;
    ptacum = ptacum + ptaux;
    /* los vencidos */
    execute procedure lee_configuracion('FACTURACION', 'FACTURAS', 'VENCIMIENTO DE PUNTOS POR CLIENTE EN AÑOS') returning_values (:anos);
    fecaux = fecha - (anos * 365);
    select first 1 ptcl_saldo + ptcl_db - ptcl_cr from puntos_cliente
        where ptcl_nit = :cliente and ptcl_fecha <= :fecaux order by ptcl_fecha desc, ptcl_id desc into :ptvencer;
    /* al saldo de hace n años restele las redenciones entre esa fecha y hoy */
    ptaux = 0;
    select sum(ptcl_cr) from puntos_cliente where ptcl_nit = :cliente and ptcl_fecha >= :fecaux and
        ptcl_fecha <= :fecha and ptcl_tipodoc = 81 into :ptaux;
    if (ptaux is null) then
        ptaux = 0;
    else
        if (ptaux > ptvencer) then
            begin
            PTAUX = PTAUX - ptvencer;
            ptvencer = 0;
            end
        else
            begin
            ptvencer = ptvencer - ptaux;
            ptaux = 0;
            end
    ptacum = ptacum - ptvencer;

    /* los por vencer */
    execute procedure lee_configuracion('FACTURACION', 'FACTURAS', 'VENCIMIENTO DE PUNTOS POR CLIENTE EN AÑOS') returning_values (:anos);
    fecaux = fecha - (anos * 365);
    fecaux2 = fecha - (anos * 365) + 30;
    select sum(ptcl_db - ptcl_cr) from puntos_cliente where ptcl_nit = :cliente and ptcl_fecha >= :fecaux and ptcl_fecha <= :fecaux2 into :ptvencer;
    if (ptvencer is null) then
        ptvencer = 0;
    ptvencer = ptvencer - ptaux;
    fecptos = :fecha;
    suspend;
    END
  END
ELSE
    SUSPEND;
end

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE IMPR_FACTURA(
    ID INTEGER)
RETURNS (
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    VENCE DATE,
    DIASVENCE INTEGER,
    CONTCRED CHAR(17),
    NIT VARCHAR(20),
    NOMTERCERO VARCHAR(60),
    NOMCLIENTE VARCHAR(60),
    VENDEDOR INTEGER,
    NOMVENDEDOR VARCHAR(60),
    PUNTOVTA INTEGER,
    NOMPUNTOVTA VARCHAR(60),
    CODBODEGA VARCHAR(2),
    NOMBODEGA VARCHAR(30),
    AUTORIZACION VARCHAR(20),
    DESPACHO VARCHAR(255),
    TRANSPORTADOR VARCHAR(60),
    COTIZACION VARCHAR(30),
    PEDIDO VARCHAR(30),
    REMISION VARCHAR(30),
    PACIENTE VARCHAR(20),
    NOMPACIENTE VARCHAR(60),
    COMIPORC NUMERIC(9,2),
    COMIMONTO NUMERIC(18,2),
    SUBTOTAL NUMERIC(18,2),
    INGTERCEROS NUMERIC(18,2),
    INGPROPIOS NUMERIC(18,2),
    DTOPORC NUMERIC(9,2),
    DTOMONTO NUMERIC(18,2),
    ADICIONAL NUMERIC(18,2),
    IVAMONTO NUMERIC(18,2),
    DEC2799 NUMERIC(18,2),
    RTEFTEPORC NUMERIC(9,2),
    RTEFTEMONTO NUMERIC(18,2),
    RTEIVAPORC NUMERIC(9,2),
    RTEIVAMONTO NUMERIC(18,2),
    RTEICAPORC NUMERIC(9,2),
    RTEICAMONTO NUMERIC(18,2),
    EXTRA NUMERIC(18,2),
    DTOFPORC NUMERIC(9,2),
    DTOFMONTO NUMERIC(18,2),
    FECHADTO DATE,
    ANTICIPO NUMERIC(18,2),
    RETGARANTIA NUMERIC(18,2),
    TOTALFAC NUMERIC(18,2),
    TOTALPAGAR NUMERIC(18,2),
    TOTALNETO NUMERIC(18,2),
    OBS BLOB SUB_TYPE 1 SEGMENT SIZE 80,
    ITEM INTEGER,
    ARTICULO VARCHAR(15),
    CODBAR VARCHAR(15),
    ARTIDES VARCHAR(60),
    DESCORTA VARCHAR(30),
    CANT NUMERIC(18,4),
    LOTE VARCHAR(15),
    VLOTE DATE,
    UNIDAD VARCHAR(8),
    CAJAS NUMERIC(18,4),
    FACTOR NUMERIC(18,4),
    LISTAPR INTEGER,
    REFITEM VARCHAR(60),
    BODITEM VARCHAR(2),
    STAND VARCHAR(20),
    PRUNIT NUMERIC(18,2),
    DTOITPORC NUMERIC(9,2),
    DTOITMONTO NUMERIC(18,2),
    PRNETO NUMERIC(18,2),
    PRNETOSINIVA NUMERIC(18,2),
    BASE NUMERIC(18,2),
    PORCBASE NUMERIC(9,2),
    DTOIT1 NUMERIC(9,2),
    DTOIT2 NUMERIC(9,2),
    DTOIT3 NUMERIC(9,2),
    IVAPORC NUMERIC(9,2),
    IVAITMONTO NUMERIC(18,2),
    CONSUMO NUMERIC(18,2),
    SUBTOTIT NUMERIC(18,2),
    TOTAL NUMERIC(18,2),
    PESOTOT NUMERIC(18,2),
    CODIGOCL VARCHAR(20),
    ZONACOD VARCHAR(2),
    ZONANOM VARCHAR(60),
    DV CHAR(1),
    DIRECCION VARCHAR(60),
    CIUDAD VARCHAR(40),
    TELEFONO VARCHAR(40),
    CONTACTO VARCHAR(60),
    FAX VARCHAR(25),
    CEL VARCHAR(25),
    GRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    SUBGRUPO VARCHAR(3),
    NOMSUBG VARCHAR(30),
    MARCA VARCHAR(3),
    NOMMARCA VARCHAR(30),
    PESO NUMERIC(18,4),
    ANCHO NUMERIC(18,4),
    ALTO NUMERIC(18,4),
    LARGO NUMERIC(18,4),
    SUMA1 NUMERIC(18,2),
    SUMA2 NUMERIC(18,2),
    SUMA3 NUMERIC(18,2),
    IVA1 NUMERIC(18,2),
    IVA2 NUMERIC(18,2),
    IVA3 NUMERIC(18,2),
    SUMAEX NUMERIC(18,2),
    SUMAGR NUMERIC(18,2),
    TOTCONSUMO NUMERIC(18,2),
    DTOIT1M NUMERIC(18,2),
    DTOIT2M NUMERIC(18,2),
    DTOIT3M NUMERIC(18,2),
    TOTCAJAS NUMERIC(18,2),
    TOTBASE NUMERIC(18,2),
    VEHICULO VARCHAR(8),
    RECIBIDO NUMERIC(18,2),
    CAMBIO NUMERIC(18,2),
    HORA TIME,
    FORMAPAGO1 VARCHAR(30),
    MONTOPAGO1 NUMERIC(18,2),
    FORMAPAGO2 VARCHAR(30),
    MONTOPAGO2 NUMERIC(18,2),
    FORMAPAGO3 VARCHAR(30),
    MONTOPAGO3 NUMERIC(18,2),
    PUNTOS INTEGER,
    PUNTOSACUM INTEGER,
    PUNTOSVENC INTEGER,
    FECPTOS DATE,
    OBSITEM BLOB SUB_TYPE 1 SEGMENT SIZE 80,
    SUCUR VARCHAR(10),
    ALTERNATIVAS NUMERIC(18,4),
    PRINCIPALES NUMERIC(18,4))
AS
DECLARE VARIABLE IMPTOS CHAR(1);
DECLARE VARIABLE TARIFA INTEGER;
declare variable DEVUELTO NUMERIC(18,2);
declare variable ORDENCOD CHAR(8);
declare variable IMPRDEV CHAR(2);
declare variable IMPR CHAR(1);
declare variable ITEMFP INTEGER;
declare variable FORMAP VARCHAR(30);
declare variable MONTOP NUMERIC(18,2);
declare variable ICOINC CHAR(2);
declare variable DTOITM1 NUMERIC(18,2);
declare variable DTOITM2 NUMERIC(18,2);
declare variable DTOITM3 NUMERIC(18,2);
declare variable DTOITE3 CHAR(2);
declare variable SUMDTOIT NUMERIC(18,2);
declare variable AUTORET VARCHAR(10);
declare variable FAUTORET DATE;
declare variable FACTCANT NUMERIC(18,4);
declare variable ANULADO CHAR(1);
declare variable INGTER CHAR(2);
BEGIN
execute procedure lee_configuracion('FACTURACION', 'ARTICULOS', 'IMPOCONSUMO INCLUIDO EN EL PRECIO BASE DE VENTA ANTES DE IVA') returning_values (icoinc);
execute procedure lee_configuracion('FACTURACION', 'FACTURAS', 'COLUMNAS DE DESCUENTO POR ITEM ADICIONALES') returning_values (DTOITE3);
execute procedure lee_configuracion('FACTURACION', 'FACTURAS', 'GRUPO DE MERCANCIA PARA INGRESOS DE TERCEROS') returning_values (INGTER);
SELECT F.PREF_PRE, FACT_NUMERO, FACT_FECHA, FACT_VENCE, F.BODE_COD, BODE_NOM, F.TERC_NIT, FACT_NOMCLIENTE, F.VEND_COD, VEND_NOMBRE, F.PTVT_ID, PTVT_NOM,
    AUTO_NUMERO, FACT_DESPACHO, FACT_TRANSP, FACT_COTIZACI, FACT_PEDIDO, FACT_REMISION, FACT_COMIPORC, FACT_COMIMONTO, FACT_IVAINC, 
    FACT_DTOPOR, FACT_DTOMONTO, FACT_ADICIONAL, FACT_IVAMONTO, FACT_RTFTEPOR, FACT_RTFTEMONTO, FACT_RTIVAPOR, FACT_RTIVAMONTO, FACT_RTICAPOR, FACT_RTICAMONTO, FACT_EXTRA, FACT_DTOFPOR, FACT_DTOFMONTO, FACT_DTOFFECHA, FACT_TOTAL,
    TERC_DIR, TERC_CIU, TERC_TEL, TERC_CONTACTO, TERC_FAX, TERC_DV, TERC_CEL, FACT_DTOIT1, FACT_DTOIT2, FACT_DTOIT3, FACT_DEC2799,
    FACT_OBS, VEHI_COD, /*FACT_NROCOPIA,*/ FACT_RECIBIDO, FACT_SUCURSAL, FACT_DETCLI, FACT_DETCLINOM, TERC_NOM, FACT_ANULADO, FACT_ANTICIPO, FACT_GARANTIA
    FROM FACTURAS F, BODEGA B, VENDEDORES V, PUNTO_VENTA P, TERCEROS T
    WHERE F.BODE_COD = B.BODE_COD AND F.VEND_COD = V.VEND_COD AND F.PTVT_ID = P.PTVT_ID AND F.TERC_NIT = T.TERC_NIT AND F.FACT_ID = :ID
    into :PREF, :NUMERO, :FECHA, :VENCE, :CODBODEGA, :NOMBODEGA, :NIT, :NOMTERCERO, :VENDEDOR, :NOMVENDEDOR, :PUNTOVTA, :NOMPUNTOVTA,
    :AUTORIZACION, :DESPACHO, :TRANSPORTADOR, :COTIZACION, :PEDIDO, :REMISION, :COMIPORC, :COMIMONTO, :IMPTOS,
    :DTOPORC, :DTOMONTO, :ADICIONAL, :IVAMONTO, :RTEFTEPORC, :RTEFTEMONTO, :RTEIVAPORC, :RTEIVAMONTO, :RTEICAPORC, :RTEICAMONTO, :EXTRA, :DTOFPORC, :DTOFMONTO, :FECHADTO, :TOTALFAC,
    :DIRECCION, :CIUDAD, :TELEFONO, :CONTACTO, :FAX, :DV, :CEL, :dtoit1m, :dtoit2m, :dtoit3m, :dec2799,
    :OBS, :VEHICULO,/* :NROCOPIA,*/ :RECIBIDO, :SUCUR, :paciente, :nompaciente, :nomcliente, :ANULADO, :anticipo, :retgarantia;

/* ACUMULE LOS PUNTOS, SE HACE ACA POR SER POSTERIOR AL DETALLE */
if (ANULADO = 'N') then
    EXECUTE PROCEDURE acumula_puntos_cliente (31, :id, :nit, :fecha) returning_values (:PUNTOS);
EXECUTE PROCEDURE consulta_puntos_cliente (:id, :nit, :fecha) returning_values (:puntos, :puntosacum, :puntosvenc, :fecptos);
if (DTOIT1M IS NULL) then
    DTOIT1M = 0;
if (DTOIT2M IS NULL) then
    DTOIT2M = 0;
if (DTOIT3M IS NULL) then
    DTOIT3M = 0;
SELECT CLIE_COD, C.ZONA_COD, ZONA_NOM
    FROM CLIENTES C, ZONAS Z
    WHERE TERC_NIT = :NIT AND C.ZONA_COD = Z.ZONA_COD
    INTO :CODIGOCL, :ZONACOD, :ZONANOM;
SELECT CLSU_DIR, CLSU_CIUDAD, CLSU_TEL FROM CLIENTE_SUCURSALES WHERE TERC_NIT = :NIT AND CLCU_COD = :SUCUR
    INTO :DIRECCION, :CIUDAD, :TELEFONO;
DIASVENCE = VENCE - FECHA;
if (DIASVENCE > 0) then
    CONTCRED = 'CREDITO ' || CAST(DIASVENCE AS VARCHAR(3)) || ' DIAS';
ELSE
    CONTCRED = 'CONTADO';
SUBTOTAL = TOTALFAC - EXTRA - IVAMONTO - ADICIONAL + DTOMONTO + dec2799;
SELECT SUM(FADE_DTOMONTO*FADE_CANT) FROM FACTURAS_DETALLE WHERE FACT_ID = :id INTO :sumdtoit;
if (DTOITE3 = 'SI') then
    BEGIN
    SUBTOTAL = SUBTOTAL + sumdtoit + dtoit1m + dtoit2m + dtoit3m;
    END
if (INGTER <> '') then
    BEGIN
    SELECT SUM(FADE_TOTAL) FROM FACTURAS_DETALLE D, ARTICULO A WHERE A.arti_cod = D.arti_cod AND FACT_ID = :id AND GRUP_COD = :ingter
        INTO :ingterceros;
    INGPROPIOS = SUBTOTAL - INGTERCEROS;
    END
EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'FECHA AUTORETENEDOR NO DESCONTAR RETENCIONES DEL SALDO PERO SI CONTABILIZARLAS') returning_values (AUTORET);
if (AUTORET <> '') then
    FAUTORET = CAST(AUTORET AS DATE);
else
    FAUTORET = '9999/12/31';
if (FECHA > fautoret) then
    TOTALPAGAR = TOTALFAC - RTEIVAMONTO - RTEICAMONTO - ANTICIPO - RETGARANTIA;
ELSE
    TOTALPAGAR = TOTALFAC - RTEFTEMONTO - RTEIVAMONTO - RTEICAMONTO - ANTICIPO - RETGARANTIA;
TOTALNETO = TOTALFAC - ANTICIPO - RETGARANTIA;
if (RECIBIDO <> 0) then
    CAMBIO = RECIBIDO - totalpagar;
ELSE
    CAMBIO = 0;
SUMAEX = 0;
SUMA1 = 0;
SUMA2 = 0;
SUMA3 = 0;
IVA1 = 0;
IVA2 = 0;
IVA3 = 0;
TOTCONSUMO = 0;
MONTOPAGO1 = 0;
PESOTOT = 0;
SELECT MAX(AUDI_HORA) FROM AUDITORIA WHERE TIDO_COD = 31 AND AUDI_IDDOC = :ID AND AUDI_OPER = 'I' INTO :HORA;
/* AHORA LAS FORMAS DE PAGO, BUSQUE EL ABONO DE HOY A LA FACTURA */
ITEMFP = 1;
MONTOPAGO1 = 0;
MONTOPAGO2 = 0;
MONTOPAGO3 = 0;
FOR SELECT FOPA_NOM, RCPA_MONTO FROM RECIBOS_CAJA_PAGO P, FORMAS_PAGO F, RECIBOS_CAJA R, RECIBOS_CAJA_DETALLE D
    WHERE R.RECA_ID = P.RECA_ID AND R.RECA_ID = D.RECA_ID AND P.FOPA_ID = F.FOPA_ID AND RECA_FECHA = :FECHA AND RCDE_TIPODOC = 31 AND RCDE_IDDOC = :ID
    INTO :formap, :MONTOP
    DO
    BEGIN
    if (ITEMFP = 1) then
        BEGIN
        FORMAPAGO1 = FORMAP;
        MONTOPAGO1 = MONTOP;
        END
    if (ITEMFP = 2) then
        BEGIN
        FORMAPAGO2 = FORMAP;
        MONTOPAGO2 = MONTOP;
        END
    if (ITEMFP = 3) then
        BEGIN
        FORMAPAGO3 = FORMAP;
        MONTOPAGO3 = MONTOP;
        END
    ITEMFP = ITEMFP + 1;
    END
EXECUTE PROCEDURE lee_configuracion ('FACTURACION','DOCUMENTOS','ORDENAR ITEMS POR CODIGO DE ARTICULO') returning_values (:ORDENCOD);
EXECUTE PROCEDURE lee_configuracion ('FACTURACION','POS', 'IMPRIMIR DEVOLUCIONES DE ARTICULOS NEGATIVOS') returning_values (:imprdev);
totcajas = 0;
totbase = 0;
if (ORDENCOD = 'SI') then
    BEGIN
    FOR SELECT FADE_ITEM, D.ARTI_COD, FADE_CODBAR, SUBSTR(FADE_DESC,1,60), ARTI_DESCORTA, FADE_CANT, FADE_UNIDAD, FADE_FACTOR, BODE_COD, FADE_LOTE, LIPR_COD, FADE_PRUNIT, FADE_DTOPORC, FADE_DTOMONTO, FADE_IVAPORC, FADE_IVAMONTO, FADE_CONSUMO, FADE_TOTAL, FADE_REFERENCIA,
        GRUP_COD, SUBG_COD, MARC_COD, ARTI_PESO, ARTI_ANCHO, ARTI_ALTO, ARTI_LARGO, TAIV_COD, FADE_DEVUELTO, FADE_OBS, FADE_DTO1, FADE_DTO2, FADE_DTO3, FADE_DTOM1, FADE_DTOM2, FADE_DTOM3, FADE_CAJAS, FADE_BASE, FADE_PORCBASE
        FROM FACTURAS_DETALLE D, ARTICULO A
        WHERE D.ARTI_COD = A.ARTI_COD AND D.FACT_ID = :ID
        ORDER BY D.ARTI_COD
        INTO :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :DESCORTA, :CANT, :UNIDAD, :FACTOR, :BODITEM, :LOTE, :LISTAPR, :PRUNIT, :DTOITPORC, :DTOITMONTO, :IVAPORC, :IVAITMONTO, :CONSUMO, :TOTAL, :refitem,
        :GRUPO, :SUBGRUPO, :MARCA, :PESO, :ANCHO, :ALTO, :LARGO, :TARIFA, :devuelto, :obsitem, :dtoit1, :dtoit2, :dtoit3, :dtoitm1, :dtoitm2, :dtoitm3, :cajas, :base, :porcbase
        DO
          BEGIN
          if (ARTICULO = CODBAR) then
            SELECT FIRST 1 COBA_COD FROM barras_articulo WHERE ARTI_COD = :articulo INTO :CODBAR;
          if (IMPRDEV <> 'SI') then
            BEGIN
            if ((CANT >= 0) AND (DEVUELTO = 0)) then
                IMPR = 'S';
            ELSE
                IMPR = 'N'; /* ES DEVOLUCION */
            END
          ELSE
            IMPR = 'S';
          if (IMPR = 'S') then
            BEGIN
            prneto = PRUNIT - DTOITMONTO - dtoitm1 - dtoitm2 - dtoitm3;
            if (IMPTOS = 'S') then
                if (cant <> 0) then
                    prnetosiniva = PRUNIT - DTOITMONTO - ((IVAITMONTO+CONSUMO) / CANT) - dtoitm1 - dtoitm2 - dtoitm3;
                else
                    prnetosiniva = PRUNIT - DTOITMONTO - dtoitm1 - dtoitm2 - dtoitm3;
            ELSE
                prnetosiniva = PRUNIT - DTOITMONTO - dtoit1m - dtoit2m - dtoit3m;
            if (ICOINC = 'SI') then
                SUBTOTIT = TOTAL - IVAITMONTO;
            else
                SUBTOTIT = TOTAL - IVAITMONTO - CONSUMO;
            TOTCONSUMO = TOTCONSUMO + CONSUMO;
            TOTBASE = TOTBASE + BASE;
            SELECT LOTE_VENCE FROM LOTES WHERE LOTE_NRO = :lote AND ARTI_COD = :ARTICULO AND BODE_COD = :boditem INTO :vlote;
            if ((REFITEM <> '.t') or (REFITEM IS NULL)) then
                BEGIN
                /* NO SUME LOS ENSAMBLES */
                if (IVAPORC = 0) then
                    SUMAEX = SUMAEX + TOTAL;
                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;
                END
            if (ANCHO IS NULL) then
                ANCHO = 0;
            if (ALTO IS NULL) then
                ALTO = 0;
            if (LARGO IS NULL) then
                LARGO = 0;
            if (PESO IS NULL) then
                PESO = 0;
            PESO = (PESO / 1000) * CANT * FACTOR;
            PESOTOT = PESOTOT + PESO;
            totcajas = totcajas + cajas;
            if (substr(ARTICULO,1,2) = '.t') then
                BEGIN
                REFITEM = '';
                TOTAL = 0;
                SUBTOTIT = 0;
                END
            SELECT STAND_COD FROM STANDS WHERE ARTI_COD = :ARTICULO AND STAND_BODEGA = :boditem INTO :stand;
            factcant = NULL;
            SELECT FIRST 1 UNAR_FACCAN FROM unidad_articulo WHERE ARTI_COD = :articulo INTO :factcant;
            if (factcant IS NULL) then
                BEGIN
                ALTERNATIVAS = 0;
                PRINCIPALES = (CANT * FACTOR);
                END
            ELSE
                BEGIN
                ALTERNATIVAS = FLOOR(CANT * factor / factcant);
                PRINCIPALES = (CANT * FACTOR) - (alternativas * factcant);
                END
            SUSPEND;
            END
          END
    END
ELSE
  if (ORDENCOD = 'UNIDAD') then
    BEGIN
    FOR SELECT FADE_ITEM, D.ARTI_COD, FADE_CODBAR, SUBSTR(FADE_DESC,1,60), ARTI_DESCORTA, FADE_CANT, FADE_UNIDAD, FADE_FACTOR, BODE_COD, FADE_LOTE, LIPR_COD, FADE_PRUNIT, FADE_DTOPORC, FADE_DTOMONTO, FADE_IVAPORC, FADE_IVAMONTO, FADE_CONSUMO, FADE_TOTAL, FADE_REFERENCIA,
        GRUP_COD, SUBG_COD, MARC_COD, ARTI_PESO, ARTI_ANCHO, ARTI_ALTO, ARTI_LARGO, TAIV_COD, FADE_DEVUELTO, FADE_OBS, FADE_DTO1, FADE_DTO2, FADE_DTO3, FADE_DTOM1, FADE_DTOM2, FADE_DTOM3, FADE_CAJAS, FADE_BASE, FADE_PORCBASE
        FROM FACTURAS_DETALLE D, ARTICULO A
        WHERE D.ARTI_COD = A.ARTI_COD AND D.FACT_ID = :ID
        ORDER BY D.fade_unidad, D.fade_desc
        INTO :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :DESCORTA, :CANT, :UNIDAD, :FACTOR, :BODITEM, :LOTE, :LISTAPR, :PRUNIT, :DTOITPORC, :DTOITMONTO, :IVAPORC, :IVAITMONTO, :CONSUMO, :TOTAL, :refitem,
        :GRUPO, :SUBGRUPO, :MARCA, :PESO, :ANCHO, :ALTO, :LARGO, :TARIFA, :devuelto, :obsitem, :dtoit1, :dtoit2, :dtoit3, :dtoitm1, :dtoitm2, :dtoitm3, :cajas, :base, :porcbase
        DO
          BEGIN
          if (ARTICULO = CODBAR) then
            SELECT FIRST 1 COBA_COD FROM barras_articulo WHERE ARTI_COD = :articulo INTO :CODBAR;
          if (IMPRDEV <> 'SI') then
            BEGIN
            if ((CANT >= 0) AND (DEVUELTO = 0)) then
                IMPR = 'S';
            ELSE
                IMPR = 'N'; /* ES DEVOLUCION */
            END
          ELSE
            IMPR = 'S';
          if (IMPR = 'S') then
            BEGIN
            prneto = PRUNIT - DTOITMONTO - dtoitm1 - dtoitm2 - dtoitm3;
            if (IMPTOS = 'S') then
                if (cant <> 0) then
                    prnetosiniva = PRUNIT - DTOITMONTO - ((IVAITMONTO+CONSUMO) / CANT) - dtoitm1 - dtoitm2 - dtoitm3;
                else
                    prnetosiniva = PRUNIT - DTOITMONTO - dtoitm1 - dtoitm2 - dtoitm3;
            ELSE
                prnetosiniva = PRUNIT - DTOITMONTO - dtoit1m - dtoit2m - dtoit3m;
            if (ICOINC = 'SI') then
                SUBTOTIT = TOTAL - IVAITMONTO;
            else
                SUBTOTIT = TOTAL - IVAITMONTO - CONSUMO;
            TOTCONSUMO = TOTCONSUMO + CONSUMO;
            TOTBASE = TOTBASE + BASE;
            SELECT LOTE_VENCE FROM LOTES WHERE LOTE_NRO = :lote AND ARTI_COD = :ARTICULO AND BODE_COD = :boditem INTO :vlote;
            if ((REFITEM <> '.t') or (REFITEM IS NULL)) then
                BEGIN
                /* NO SUME LOS ENSAMBLES */
                if (IVAPORC = 0) then
                    SUMAEX = SUMAEX + TOTAL;
                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;
                END
            if (ANCHO IS NULL) then
                ANCHO = 0;
            if (ALTO IS NULL) then
                ALTO = 0;
            if (LARGO IS NULL) then
                LARGO = 0;
            if (PESO IS NULL) then
                PESO = 0;
            PESO = (PESO / 1000) * CANT * FACTOR;
            PESOTOT = PESOTOT + PESO;
            totcajas = totcajas + cajas;
            if (substr(ARTICULO,1,2) = '.t') then
                BEGIN
                REFITEM = '';
                TOTAL = 0;
                SUBTOTIT = 0;
                END
            SELECT STAND_COD FROM STANDS WHERE ARTI_COD = :ARTICULO AND STAND_BODEGA = :boditem INTO :stand;
            factcant = NULL;
            SELECT FIRST 1 UNAR_FACCAN FROM unidad_articulo WHERE ARTI_COD = :articulo INTO :factcant;
            if ((factcant IS NULL) or (factcant = 0)) then
                BEGIN
                ALTERNATIVAS = 0;
                PRINCIPALES = (CANT * FACTOR);
                END
            ELSE
                BEGIN
                ALTERNATIVAS = FLOOR(CANT * factor / factcant);
                PRINCIPALES = (CANT * FACTOR) - (alternativas * factcant);
                END
            SUSPEND;
            END
          END
    END
  ELSE
    BEGIN
    FOR SELECT FADE_ITEM, D.ARTI_COD, FADE_CODBAR, SUBSTR(FADE_DESC,1,60), ARTI_DESCORTA, FADE_CANT, FADE_UNIDAD, FADE_FACTOR, BODE_COD, FADE_LOTE, LIPR_COD, FADE_PRUNIT, FADE_DTOPORC, FADE_DTOMONTO, FADE_IVAPORC, FADE_IVAMONTO, FADE_CONSUMO, FADE_TOTAL, FADE_REFERENCIA,
        GRUP_COD, SUBG_COD, MARC_COD, ARTI_PESO, ARTI_ANCHO, ARTI_ALTO, ARTI_LARGO, TAIV_COD, FADE_DEVUELTO, FADE_OBS, FADE_DTO1, FADE_DTO2, FADE_DTO3, FADE_DTOM1, FADE_DTOM2, FADE_DTOM3, FADE_CAJAS, FADE_BASE, FADE_PORCBASE
        FROM FACTURAS_DETALLE D, ARTICULO A
        WHERE D.ARTI_COD = A.ARTI_COD AND D.FACT_ID = :ID
        ORDER BY FADE_ITEM
        INTO :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :DESCORTA, :CANT, :UNIDAD, :FACTOR, :BODITEM, :LOTE, :LISTAPR, :PRUNIT, :DTOITPORC, :DTOITMONTO, :IVAPORC, :IVAITMONTO, :CONSUMO, :TOTAL, :refitem,
        :GRUPO, :SUBGRUPO, :MARCA, :PESO, :ANCHO, :ALTO, :LARGO, :TARIFA, :devuelto, :obsitem, :dtoit1, :dtoit2, :dtoit3, :dtoitm1, :dtoitm2, :dtoitm3, :cajas, :base, :porcbase
        DO
          BEGIN
          if (IMPRDEV <> 'SI') then
            BEGIN
            if ((CANT >= 0) AND (DEVUELTO = 0)) then
                IMPR = 'S';
            ELSE
                IMPR = 'N'; /* ES DEVOLUCION */
            END
          ELSE
            IMPR = 'S';
          if (IMPR = 'S') then
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :GRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :MARCA INTO NOMMARCA;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :SUBGRUPO AND GRUP_COD = :GRUPO INTO :NOMSUBG;
            prneto = PRUNIT - DTOITMONTO - dtoitm1 - dtoitm2 - dtoitm3;
            if (IMPTOS = 'S') then
                if (cant <> 0) then
                    prnetosiniva = PRUNIT - DTOITMONTO - ((IVAITMONTO+CONSUMO) / CANT) - dtoit1m - dtoit2m - dtoit3m;
                else
                    prnetosiniva = PRUNIT - DTOITMONTO - dtoitm1 - dtoitm2 - dtoitm3;
            ELSE
                prnetosiniva = PRUNIT - DTOITMONTO - dtoitm1 - dtoitm2 - dtoitm3;
            if (ICOINC = 'SI') then
                SUBTOTIT = TOTAL - IVAITMONTO;
            else
                SUBTOTIT = TOTAL - IVAITMONTO - CONSUMO;
            TOTCONSUMO = TOTCONSUMO + CONSUMO;
            TOTBASE = TOTBASE + BASE;
            SELECT LOTE_VENCE FROM LOTES WHERE LOTE_NRO = :lote AND ARTI_COD = :ARTICULO AND BODE_COD = :boditem INTO :vlote;
            if ((REFITEM <> '.t') or (REFITEM IS NULL)) then
                BEGIN
                /* NO SUME LOS ENSAMBLES */
                if (IVAPORC = 0) then
                    SUMAEX = SUMAEX + TOTAL;
                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;
                END
            if (ANCHO IS NULL) then
                ANCHO = 0;
            if (ALTO IS NULL) then
                ALTO = 0;
            if (LARGO IS NULL) then
                LARGO = 0;
            if (PESO IS NULL) then
                PESO = 0;
            PESO = (PESO / 1000)* CANT * FACTOR;
            PESOTOT = PESOTOT + PESO;
            totcajas = totcajas + cajas;
            if (substr(ARTICULO,1,2) = '.t') then
                BEGIN
                REFITEM = '';
                TOTAL = 0;
                SUBTOTIT = 0;
                END
            SELECT STAND_COD FROM STANDS WHERE ARTI_COD = :ARTICULO AND STAND_BODEGA = :boditem INTO :stand;
            factcant = NULL;
            SELECT FIRST 1 UNAR_FACCAN FROM unidad_articulo WHERE ARTI_COD = :articulo INTO :factcant;
            if ((factcant IS NULL) or (factcant = 0)) then
                BEGIN
                ALTERNATIVAS = 0;
                PRINCIPALES = (CANT * FACTOR);
                END
            ELSE
                BEGIN
                ALTERNATIVAS = FLOOR(CANT * factor / factcant);
                PRINCIPALES = (CANT * FACTOR) - (alternativas * factcant);
                END
            SUSPEND;
            END
          END
    END
END

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE IMPR_REDENCION(
    ID INTEGER)
RETURNS (
    NUMERO VARCHAR(6),
    FECHA DATE,
    NIT VARCHAR(20),
    NOMCLIENTE VARCHAR(60),
    DIR VARCHAR(60),
    TEL VARCHAR(60),
    PREMIO VARCHAR(15),
    NOMPREMIO VARCHAR(60),
    PUNTOS INTEGER,
    PUNTOSACUM INTEGER,
    PUNTOSVENC INTEGER,
    FECPTOS DATE)
AS
declare variable puntosaux INTEGER;
begin
SELECT PTRE_NUMERO, PTRE_FECHA, PTRE_NIT, TERC_NOM, TERC_DIR, TERC_TEL, R.PTPR_COD, PTPR_NOMBRE, PTRE_PUNTOS
    FROM PUNTOS_REDENCION R, puntos_premios P, TERCEROS T
    WHERE R.ptre_nit = T.terc_nit AND R.ptpr_cod = P.ptpr_cod AND R.ptre_id = :ID
    INTO :NUMERO, :FECHA, :NIT, :NOMCLIENTE, :DIR, :TEL, :PREMIO, :NOMPREMIO, :PUNTOS;
EXECUTE PROCEDURE consulta_puntos_cliente (0, :nit, :fecha) returning_values (:puntosaux, :puntosacum, :puntosvenc, :fecptos);
suspend;
end

^

SET TERM ; ^

/* 20100918 */
/* CIERRE CON DEVOLUCIONES DEL PUNTO SIN IMPORTAR EL PREFIJO */
SET TERM ^ ;

CREATE OR ALTER procedure CIERRE_FACTURACION (
    FECHA date,
    PUNTO integer,
    PREFIJO varchar(4))
returns (
    PREF varchar(4),
    AUTORIZA varchar(20),
    PUNTOVTA varchar(60),
    NUMINI varchar(6),
    NUMFIN varchar(6),
    NROFAC integer,
    HORAINI time,
    HORAFIN time,
    BASEFAC numeric(18,2),
    IVAFAC numeric(18,2),
    TOTALFAC numeric(18,2),
    NROITE integer,
    NRODEV integer,
    BASEDEV numeric(18,2),
    IVADEV numeric(18,2),
    TOTALDEV numeric(18,2),
    BASENETO numeric(18,2),
    IVANETO numeric(18,2),
    TOTALNETO numeric(18,2),
    BASEF0 numeric(18,2),
    IVAF0 numeric(18,2),
    TOTALF0 numeric(18,2),
    BASED0 numeric(18,2),
    IVAD0 numeric(18,2),
    TOTALD0 numeric(18,2),
    BASEF1 numeric(18,2),
    IVAF1 numeric(18,2),
    TOTALF1 numeric(18,2),
    BASED1 numeric(18,2),
    IVAD1 numeric(18,2),
    TOTALD1 numeric(18,2),
    BASEF2 numeric(18,2),
    IVAF2 numeric(18,2),
    TOTALF2 numeric(18,2),
    BASED2 numeric(18,2),
    IVAD2 numeric(18,2),
    TOTALD2 numeric(18,2),
    BASEF3 numeric(18,2),
    IVAF3 numeric(18,2),
    TOTALF3 numeric(18,2),
    BASED3 numeric(18,2),
    IVAD3 numeric(18,2),
    TOTALD3 numeric(18,2),
    BASEF4 numeric(18,2),
    IVAF4 numeric(18,2),
    TOTALF4 numeric(18,2),
    BASED4 numeric(18,2),
    IVAD4 numeric(18,2),
    TOTALD4 numeric(18,2),
    FORMAP1 numeric(18,2),
    FORMAP2 numeric(18,2),
    FORMAP3 numeric(18,2),
    FORMAP4 numeric(18,2),
    FORMAP5 numeric(18,2),
    CARTERA numeric(18,2),
    VENDEDOR1 varchar(60),
    VTAVEND1 numeric(18,2),
    VENDEDOR2 varchar(60),
    VTAVEND2 numeric(18,2),
    VENDEDOR3 varchar(60),
    VTAVEND3 numeric(18,2),
    VENDEDOR4 varchar(60),
    VTAVEND4 numeric(18,2),
    VENDEDOR5 varchar(60),
    VTAVEND5 numeric(18,2),
    NROFACTANUL integer,
    IVANUL numeric(18,2),
    TOTALFACANUL numeric(18,2))
AS
declare variable tarifa NUMERIC(9,2);
declare variable BASEF NUMERIC(18,2);
declare variable IVAF NUMERIC(18,2);
declare variable TOTALF NUMERIC(18,2);
declare variable BASEDv NUMERIC(18,2);
declare variable IVAD NUMERIC(18,2);
declare variable TOTALD NUMERIC(18,2);
declare variable I INTEGER;
declare variable CODVEN INTEGER;
declare variable VENDED VARCHAR(60);
declare variable R_IDDOC INTEGER;
declare variable F_ID INTEGER;
declare variable F_TOTAL NUMERIC(18,2);
declare variable FACTOR NUMERIC(18,4);
declare variable AJUSTE INTEGER;
begin
AJUSTE = 0;
if (PREFIJO <> '') then
  SELECT PREF_PRE, AUTO_NUMERO FROM AUTORIZACIONES WHERE PREF_PRE = :PREFIJO INTO :PREF, :autoriza;
SELECT PTVT_NOM FROM PUNTO_VENTA WHERE PTVT_ID = :punto INTO :puntovta;
SELECT MIN(AUDI_HORA) FROM AUDITORIA WHERE TIDO_COD = 131 AND AUDI_FECHA = :FECHA INTO :HORAINI;
HORAFIN = CAST('NOW' AS TIME);
  /* LAS VENTAS */
  SELECT MIN(FACT_NUMERO), MAX(FACT_NUMERO), COUNT(FACT_NUMERO), SUM(FACT_TOTAL - FACT_IVAMONTO), SUM(FACT_IVAMONTO), SUM(FACT_TOTAL)
    FROM FACTURAS WHERE FACT_FECHA = :FECHA AND PTVT_ID = :PUNTO AND ((PREF_PRE = :PREFIJO) or (:PREFIJO = '')) and FACT_ANULADO = 'N'
    INTO :NUMINI, :NUMFIN, :NROFAC, :BASENETO, :IVANETO, :TOTALNETO;
  SELECT COUNT(FADE_ITEM), SUM(FADE_TOTAL-FADE_IVAMONTO), SUM(FADE_IVAMONTO), SUM(FADE_TOTAL) FROM facturas_detalle D, FACTURAS F
    WHERE D.FACT_ID = F.FACT_ID AND FACT_FECHA = :FECHA AND PTVT_ID = :PUNTO AND ((PREF_PRE = :PREFIJO) or (:PREFIJO = '')) AND FADE_CANT > 0 and FACT_ANULADO = 'N' and substring(d.arti_cod from 1 FOR 2) <> '.t'
    INTO :nroite, :BASEFAC, :IVAFAC, :TOTALFAC;
  SELECT COUNT(FADE_ITEM), SUM(FADE_IVAMONTO-FADE_TOTAL), SUM(FADE_IVAMONTO*-1), SUM(FADE_TOTAL*-1) FROM facturas_detalle D, FACTURAS F
    WHERE D.FACT_ID = F.FACT_ID AND FACT_FECHA = :FECHA AND PTVT_ID = :PUNTO AND ((PREF_PRE = :PREFIJO) or (:PREFIJO = '')) AND FADE_CANT < 0 and FACT_ANULADO = 'N' and substring(d.arti_cod from 1 FOR 2) <> '.t'
    INTO :NRODEV, :BASEDEV, :IVADEV, :TOTALDEV;
  SELECT COUNT(DVDE_ITEM), SUM(DVDE_TOTAL-DVDE_IVAMONTO), SUM(DVDE_IVAMONTO), SUM(DVDE_TOTAL) FROM devoluciones_ventas_detalle D, devoluciones_ventas F
    WHERE D.DEVT_ID = F.DEVT_ID AND DEVT_FECHA = :FECHA AND PTVT_ID = :PUNTO AND DEVT_ANULADO = 'N' and substring(d.arti_cod from 1 FOR 2) <> '.t'
    INTO :I, :BASEDV, :IVAD, :TOTALD;
  SELECT COUNT(FACT_NUMERO),SUM(FACT_TOTAL - FACT_IVAMONTO), SUM(FACT_IVAMONTO) FROM FACTURAS
    WHERE FACT_FECHA = :FECHA AND PTVT_ID = :PUNTO AND ((PREF_PRE = :PREFIJO) or (:PREFIJO = '')) and FACT_ANULADO = 'S'
    INTO :NROFACTANUL, :TOTALFACANUL, :IVANUL;
  if (nrofac is null) then
    nrofac = 0;
  if (NROFACTANUL is null) then
    NROFACTANUL = 0;
  if (TOTALFACANUL is null) then
    TOTALFACANUL = 0;
  if (IVANUL is null) then
    IVANUL = 0;
  if (baseneto is null) then
    baseneto = 0;
  if (ivaneto is null) then
    ivaneto = 0;
  if (totalneto is null) then
    totalneto = 0;
  if (nroite is null) then
    nroite = 0;
  if (basefac is null) then
    basefac = 0;
  if (ivafac is null) then
    ivafac = 0;
  if (totalfac is null) then
    totalfac = 0;
  if (nrodev is null) then
    nrodev = 0;
  if (basedev is null) then
    basedev = 0;
  if (ivadev is null) then
    ivadev = 0;
  if (totaldev is null) then
    totaldev = 0;
  if (I is null) then
    I = 0;
  if (basedv is null) then
    basedv = 0;
  if (ivad is null) then
    ivad = 0;
  if (totald is null) then
    totald = 0;
  NRODEV = NRODEV + I;
  BASENETO = BASENETO - BASEDV;
  IVANETO = IVANETO - IVAD;
  TOTALNETO = TOTALNETO - TOTALD;

  BASEDEV = BASEDEV + BASEDV;
  IVADEV = IVADEV + IVAD;
  TOTALDEV = TOTALDEV + TOTALD;

  /* POR TARIFA DE IVA */
  I = 0;
  BASEF0 = 0;
  BASED0 = 0;
  IVAF0 = 0;
  IVAD0 = 0;
  TOTALF0 = 0;
  TOTALD0 = 0;
  BASEF1 = 0;
  BASED1 = 0;
  IVAF1 = 0;
  IVAD1 = 0;
  TOTALF1 = 0;
  TOTALD1 = 0;
  BASEF2 = 0;
  BASED2 = 0;
  IVAF2 = 0;
  IVAD2 = 0;
  TOTALF2 = 0;
  TOTALD2 = 0;
  BASEF3 = 0;
  BASED3 = 0;
  IVAF3 = 0;
  IVAD3 = 0;
  TOTALF3 = 0;
  TOTALD3 = 0;
  BASEF4 = 0;
  BASED4 = 0;
  IVAF4 = 0;
  IVAD4 = 0;
  TOTALF4 = 0;
  TOTALD4 = 0;
  vtavend1 = 0;
  vtavend2 = 0;
  vtavend3 = 0;
  vtavend4 = 0;
  vtavend5 = 0;
  FOR SELECT TAIV_PORC FROM TARIFA_IVA ORDER BY TAIV_PORC INTO :TARIFA DO
    BEGIN
    I = I + 1;
    SELECT SUM(FADE_TOTAL-FADE_IVAMONTO), SUM(FADE_IVAMONTO), SUM(FADE_TOTAL) FROM facturas_detalle D, FACTURAS F
        WHERE D.FACT_ID = F.FACT_ID AND FACT_FECHA = :FECHA AND PTVT_ID = :PUNTO AND ((PREF_PRE = :PREFIJO) or (:PREFIJO = '')) AND FADE_CANT > 0 AND FADE_IVAPORC = :TARIFA and FACT_ANULADO = 'N'
        INTO :BASEF, :IVAF, :TOTALF;
    SELECT SUM(FADE_TOTAL-FADE_IVAMONTO), SUM(FADE_IVAMONTO), SUM(FADE_TOTAL) FROM facturas_detalle D, FACTURAS F
        WHERE D.FACT_ID = F.FACT_ID AND FACT_FECHA = :FECHA AND PTVT_ID = :PUNTO AND ((PREF_PRE = :PREFIJO) or (:PREFIJO = '')) AND FADE_CANT < 0 AND FADE_IVAPORC = :TARIFA and FACT_ANULADO = 'N'
        INTO :BASEDV, :IVAD, :TOTALD;
    if (basef is null) then
        basef = 0;
    if (ivaf is null) then
        ivaf = 0;
    if (totalf is null) then
        totalf = 0;
    if (basedv is null) then
        basedv = 0;
    if (ivad is null) then
        ivad = 0;
    if (totald is null) then
        totald = 0;

    FACTOR = 1;
    SELECT AJCI_FACTOR FROM ajuste_cierre WHERE AJCI_PORC = :TARIFA AND AJCI_FECINI <= :FECHA AND AJCI_FECFIN >= :FECHA INTO :FACTOR;
    if (FACTOR IS null) then
        FACTOR = 1;
    if (FACTOR <> 1) then
        AJUSTE = 1;
    BASEF = BASEF * FACTOR;
    BASEDV = BASEDV * FACTOR;
    IVAF = IVAF * FACTOR;
    IVAD = IVAD * FACTOR;
    TOTALF = TOTALF * FACTOR;
    TOTALD = TOTALD * FACTOR;

    if (I = 1) then
        BEGIN
        BASEF0 = BASEF;
        BASED0 = :BASEDV;
        IVAF0 = IVAF;
        IVAD0 = IVAD;
        TOTALF0 = TOTALF;
        TOTALD0 = TOTALD;
        SELECT SUM(DVDE_TOTAL-DVDE_IVAMONTO), SUM(DVDE_IVAMONTO), SUM(DVDE_TOTAL) FROM devoluciones_ventas_detalle D, devoluciones_ventas F
            WHERE D.DEVT_ID = F.DEVT_ID AND DEVT_FECHA = :FECHA AND PTVT_ID = :PUNTO AND DVDE_IVAPORC = :TARIFA and DEVT_ANULADO = 'N'
            INTO :BASEDV, :IVAD, :TOTALD;
        if (basedv is null) then
            basedv = 0;
        if (ivad is null) then
            ivad = 0;
        if (totald is null) then
            totald = 0;
        BASED0 = BASED0 - BASEDV;
        IVAD0 = IVAD0 - IVAD;
        TOTALD0 = TOTALD0 - TOTALD;
        END
    if (I = 2) then
        BEGIN
        BASEF1 = BASEF;
        BASED1 = :BASEDV;
        IVAF1 = IVAF;
        IVAD1 = IVAD;
        TOTALF1 = TOTALF;
        TOTALD1 = TOTALD;
        SELECT SUM(DVDE_TOTAL-DVDE_IVAMONTO), SUM(DVDE_IVAMONTO), SUM(DVDE_TOTAL) FROM devoluciones_ventas_detalle D, devoluciones_ventas F
            WHERE D.DEVT_ID = F.DEVT_ID AND DEVT_FECHA = :FECHA AND PTVT_ID = :PUNTO AND DVDE_IVAPORC = :TARIFA and DEVT_ANULADO = 'N'
            INTO :BASEDV, :IVAD, :TOTALD;
        if (basedv is null) then
            basedv = 0;
        if (ivad is null) then
            ivad = 0;
        if (totald is null) then
            totald = 0;
        BASED1 = BASED1 - BASEDV;
        IVAD1 = IVAD1 - IVAD;
        TOTALD1 = TOTALD1 - TOTALD;
        END
    if (I = 3) then
        BEGIN
        BASEF2 = BASEF;
        BASED2 = :BASEDV;
        IVAF2 = IVAF;
        IVAD2 = IVAD;
        TOTALF2 = TOTALF;
        TOTALD2 = TOTALD;
        SELECT SUM(DVDE_TOTAL-DVDE_IVAMONTO), SUM(DVDE_IVAMONTO), SUM(DVDE_TOTAL) FROM devoluciones_ventas_detalle D, devoluciones_ventas F
            WHERE D.DEVT_ID = F.DEVT_ID AND DEVT_FECHA = :FECHA AND PTVT_ID = :PUNTO AND DVDE_IVAPORC = :TARIFA and DEVT_ANULADO = 'N'
            INTO :BASEDV, :IVAD, :TOTALD;
        if (basedv is null) then
            basedv = 0;
        if (ivad is null) then
            ivad = 0;
        if (totald is null) then
            totald = 0;
        BASED2 = BASED2 - BASEDV;
        IVAD2 = IVAD2 - IVAD;
        TOTALD2 = TOTALD2 - TOTALD;
        END
    if (I = 4) then
        BEGIN
        BASEF3 = BASEF;
        BASED3 = :BASEDV;
        IVAF3 = IVAF;
        IVAD3 = IVAD;
        TOTALF3 = TOTALF;
        TOTALD3 = TOTALD;
        SELECT SUM(DVDE_TOTAL-DVDE_IVAMONTO), SUM(DVDE_IVAMONTO), SUM(DVDE_TOTAL) FROM devoluciones_ventas_detalle D, devoluciones_ventas F
            WHERE D.DEVT_ID = F.DEVT_ID AND DEVT_FECHA = :FECHA AND PTVT_ID = :PUNTO AND DVDE_IVAPORC = :TARIFA and DEVT_ANULADO = 'N'
            INTO :BASEDV, :IVAD, :TOTALD;
        if (basedv is null) then
            basedv = 0;
        if (ivad is null) then
            ivad = 0;
        if (totald is null) then
            totald = 0;
        BASED3 = BASED3 - BASEDV;
        IVAD3 = IVAD3 - IVAD;
        TOTALD3 = TOTALD3 - TOTALD;
        END
    if (I = 5) then
        BEGIN
        BASEF4 = BASEF;
        BASED4 = :BASEDV;
        IVAF4 = IVAF;
        IVAD4 = IVAD;
        TOTALF4 = TOTALF;
        TOTALD4 = TOTALD;
        SELECT SUM(DVDE_TOTAL-DVDE_IVAMONTO), SUM(DVDE_IVAMONTO), SUM(DVDE_TOTAL) FROM devoluciones_ventas_detalle D, devoluciones_ventas F
            WHERE D.DEVT_ID = F.DEVT_ID AND DEVT_FECHA = :FECHA AND PTVT_ID = :PUNTO AND DVDE_IVAPORC = :TARIFA and DEVT_ANULADO = 'N'
            INTO :BASEDV, :IVAD, :TOTALD;
        if (basedv is null) then
            basedv = 0;
        if (ivad is null) then
            ivad = 0;
        if (totald is null) then
            totald = 0;
        BASED4 = BASED4 - BASEDV;
        IVAD4 = IVAD4 - IVAD;
        TOTALD4 = TOTALD4 - TOTALD;
        END
    END
  /* POR FORMA DE PAGO */
  SELECT SUM(RCPA_MONTO) FROM RECIBOS_CAJA_PAGO P, RECIBOS_CAJA R, PUNTO_VENTA PT
    WHERE R.RECA_ID = P.RECA_ID AND PT.PTVT_ID = :punto AND RECA_FECHA = :FECHA AND PT.caja_id = R.caja_id AND ((PT.PREF_PRE = :PREFIJO) or (:PREFIJO = '')) AND FOPA_ID = 1 and RECA_ANULADO = 'N'
    INTO :FORMAP1;
  SELECT SUM(RCPA_MONTO) FROM RECIBOS_CAJA_PAGO P, RECIBOS_CAJA R, PUNTO_VENTA PT
    WHERE R.RECA_ID = P.RECA_ID AND PT.PTVT_ID = :punto AND RECA_FECHA = :FECHA AND PT.caja_id = R.caja_id AND ((PT.PREF_PRE = :PREFIJO) or (:PREFIJO = '')) AND FOPA_ID = 2 and RECA_ANULADO = 'N'
    INTO :FORMAP2;
  SELECT SUM(RCPA_MONTO) FROM RECIBOS_CAJA_PAGO P, RECIBOS_CAJA R, PUNTO_VENTA PT
    WHERE R.RECA_ID = P.RECA_ID AND PT.PTVT_ID = :punto AND RECA_FECHA = :FECHA AND PT.caja_id = R.caja_id AND ((PT.PREF_PRE = :PREFIJO) or (:PREFIJO = '')) AND FOPA_ID = 3 and RECA_ANULADO = 'N'
    INTO :FORMAP3;
  SELECT SUM(RCPA_MONTO) FROM RECIBOS_CAJA_PAGO P, RECIBOS_CAJA R, PUNTO_VENTA PT
    WHERE R.RECA_ID = P.RECA_ID AND PT.PTVT_ID = :punto AND RECA_FECHA = :FECHA AND PT.caja_id = R.caja_id AND ((PT.PREF_PRE = :PREFIJO) or (:PREFIJO = '')) AND FOPA_ID = 4 and RECA_ANULADO = 'N'
    INTO :FORMAP4;
  SELECT SUM(RCPA_MONTO) FROM RECIBOS_CAJA_PAGO P, RECIBOS_CAJA R, PUNTO_VENTA PT
    WHERE R.RECA_ID = P.RECA_ID AND PT.PTVT_ID = :punto AND RECA_FECHA = :FECHA AND PT.caja_id = R.caja_id AND ((PT.PREF_PRE = :PREFIJO) or (:PREFIJO = '')) AND FOPA_ID = 5 and RECA_ANULADO = 'N'
    INTO :FORMAP5;

  cartera = 0;
  for SELECT FACT_ID,FACT_TOTAL FROM FACTURAS WHERE FACT_FECHA = :FECHA AND PTVT_ID = :PUNTO AND ((PREF_PRE = :PREFIJO) or (:PREFIJO = '')) and FACT_ANULADO = 'N' into :f_id,:F_TOTAL
    do
    begin
     Select COUNT(D.RECA_ID) FROM recibos_caja_detalle D, RECIBOS_CAJA R where R.RECA_ID = D.RECA_ID AND R.RECA_FECHA = :FECHA AND RECA_ANULADO = 'N' and D.RCDE_tipodoc = 31 and D.RCDE_IDDOC = :f_id into :r_iddoc;
     if (r_iddoc = 0) then
       CARTERA = :cartera + :F_TOTAL;
    end
  if (formap1 is null) then
    formap1 = 0;
  if (formap2 is null) then
    formap2 = 0;
  if (formap3 is null) then
    formap3 = 0;
  if (formap4 is null) then
    formap4 = 0;
  if (formap5 is null) then
    formap5 = 0;
  if (cartera is null) then
    cartera = 0;
  I = 0;
  FOR SELECT MAX(F.VEND_COD), MAX(VEND_NOMBRE), SUM(FACT_TOTAL - FACT_IVAMONTO) FROM FACTURAS F, VENDEDORES V
    WHERE F.VEND_COD = V.VEND_COD AND FACT_FECHA = :FECHA AND F.PTVT_ID = :PUNTO AND ((PREF_PRE = :PREFIJO) or (:PREFIJO = '')) and FACT_ANULADO = 'N'
    GROUP BY F.VEND_COD ORDER BY F.VEND_COD
    INTO :CODVEN, :VENDED, :TOTALF
    DO
    BEGIN
    if (totalf IS NULL) then
        TOTALF = 0;
    SELECT SUM(DEVT_TOTAL - DEVT_IVAMONTO) FROM DEVOLUCIONES_VENTAS
        WHERE VEND_COD = :CODVEN AND DEVT_FECHA = :FECHA AND PTVT_ID = :PUNTO and DEVT_ANULADO = 'N'
        INTO :totald;
    if (TOTALD IS NULL) then
        TOTALD = 0;
    if (I = 0) then
        BEGIN
        vendedor1 = VENDED;
        vtavend1 = TOTALF - TOTALD;
        END
    if (I = 1) then
        BEGIN
        vendedor2 = VENDED;
        vtavend2 = TOTALF - TOTALD;
        END
    if (I = 2) then
        BEGIN
        vendedor3 = VENDED;
        vtavend3 = TOTALF - TOTALD;
        END
    if (I = 3) then
        BEGIN
        vendedor4 = VENDED;
        vtavend4 = TOTALF - TOTALD;
        END
    if (I = 4) then
        BEGIN
        vendedor5 = VENDED;
        vtavend5 = TOTALF - TOTALD;
        END
    I = I + 1;
    END
  if (AJUSTE = 1) then
    BEGIN
    BASEFAC = BASEF0 + BASEF1 + BASEF2 + BASEF3 + BASEF4;
    IVAFAC = IVAF0 + IVAF1 + IVAF2 + IVAF3 + IVAF4;
    TOTALFAC = totalf0 + TOTALF1 + TOTALF2 + TOTALF3 + TOTALF4;
    BASEDEV = totald0 + TOTALD1 + TOTALD2 + TOTALD3 + TOTALD4;
    IVADEV = IVAD0 + IVAD1 + IVAD2 + IVAD3 + IVAD4;
    TOTALDEV = totald0 + TOTALD1 + totald2 + totald3 + totald4;
    BASENETO = basefac - basedev;
    IVANETO = ivafac - ivadev;
    formap1 = formap1 * (totalfac - totaldev) / totalneto;
    formap2 = formap2 * (totalfac - totaldev) / totalneto;
    formap3 = formap3 * (totalfac - totaldev) / totalneto;
    formap4 = formap4 * (totalfac - totaldev) / totalneto;
    formap5 = formap5 * (totalfac - totaldev) / totalneto;
    vtavend1 = vtavend1 * (totalfac - totaldev) / totalneto;
    vtavend2 = vtavend2 * (totalfac - totaldev) / totalneto;
    vtavend3 = vtavend3 * (totalfac - totaldev) / totalneto;
    vtavend4 = vtavend4 * (totalfac - totaldev) / totalneto;
    vtavend5 = vtavend5 * (totalfac - totaldev) / totalneto;
    TOTALNETO = totalfac - totaldev;
    END
  INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
    VALUES (USER, 123, :punto, 'I', (:formap1+:formap2+:formap3+:formap4+:formap5+:CARTERA));
  suspend;
end
^

SET TERM ; ^


/* 20100922 */
/* MULTIPLE ROWS POR EL VENCIMIENTO LOTE SIN BODEGA */
SET TERM ^ ;

CREATE OR ALTER procedure IMPR_SALIDA (
    ID integer)
returns (
    PREF varchar(4),
    NUMERO varchar(6),
    FECHA date,
    CONCEPTO varchar(60),
    REFER varchar(60),
    CODBODEGA varchar(2),
    NOMBODEGA varchar(30),
    NOMTERCERO varchar(60),
    OBS blob sub_type 0 segment size 80,
    ITEM integer,
    ARTICULO varchar(15),
    CODBAR varchar(15),
    ARTIDES varchar(60),
    CANT numeric(18,4),
    UNIDAD varchar(8),
    BODITEM varchar(2),
    STAND varchar(20),
    COSTO numeric(18,2),
    IVAPORC numeric(9,2),
    IVAMONTO numeric(18,2),
    CONSUMO numeric(18,2),
    TOTAL numeric(18,2),
    TOTALITEM numeric(18,2),
    PRECIO numeric(18,2),
    LOTE varchar(15),
    LOTEVENCE date,
    PESOUNIT numeric(18,4),
    PESOTOT numeric(18,4),
    VOLUMUNIT numeric(18,4),
    VOLUMTOT numeric(18,4),
    TOTALDOC numeric(18,2),
    ULTIMO numeric(18,2),
    TOTALULT numeric(18,2),
    CONSUMODOC numeric(18,2),
    TOTALMASIMP numeric(18,2))
AS
declare variable IMPTOS CHAR(1);
declare variable LARGO NUMERIC(18,4);
declare variable ANCHO NUMERIC(18,4);
declare variable ALTO NUMERIC(18,4);
declare variable LISTA CHAR(3);
declare variable ICOINC CHAR(2);
BEGIN
  PESOTOT = 0;
  VOLUMTOT = 0;
  SELECT PREF_PRE, SALI_NUMERO, SALI_FECHA, SALI_CONC, SALI_REFER, S.BODE_COD, BODE_NOM, SALI_NOMTERC, SALI_IMPTOS, SALI_OBS
    FROM SALIDAS S, BODEGA B WHERE S.BODE_COD = B.BODE_COD AND S.SALI_ID = :ID into
    :PREF, :NUMERO, :FECHA, :CONCEPTO, :REFER, :CODBODEGA, :NOMBODEGA, :NOMTERCERO, :IMPTOS, :OBS;
  SELECT SUM(SADE_TOTAL), SUM(SADE_IVAMONTO), SUM(SADE_CONSUMO*SADE_CANT*SADE_FACTOR) FROM SALIDAS_DETALLE
    WHERE SALI_ID = :ID INTO :TOTALDOC, :IVAMONTO, :CONSUMODOC;
  TOTALDOC = TOTALDOC - IVAMONTO;
  EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION','ARTICULOS','IMPOCONSUMO INCLUIDO EN EL PRECIO BASE DE VENTA ANTES DE IVA') returning_values (:ICOINC);
  if (ICOINC <> 'SI') then
      TOTALMASIMP = TOTALDOC + CONSUMODOC;
  FOR SELECT SADE_ITEM, A.ARTI_COD, SADE_CODBAR, SADE_DESC, SADE_CANT, SADE_UNIDAD, BODE_COD, SADE_COSTO, SADE_IVAPORC, SADE_IVAMONTO, SADE_CONSUMO, SADE_TOTAL, SADE_LOTE,
    (ARTI_PESO / 1000 * SADE_CANT * SADE_FACTOR), (ARTI_LARGO / 100 * SADE_FACTOR), (ARTI_ANCHO / 100 * SADE_FACTOR), (ARTI_ALTO / 100 * SADE_FACTOR)
    FROM SALIDAS_DETALLE D, ARTICULO A
    WHERE D.ARTI_COD = A.ARTI_COD AND D.SALI_ID = :ID
    ORDER BY SADE_ITEM
    INTO :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :BODITEM, :COSTO, :IVAPORC, :IVAMONTO, :CONSUMO, :TOTAL, :LOTE,
    :PESOUNIT, :LARGO, :ANCHO, :ALTO
    DO
      BEGIN
      EXECUTE PROCEDURE LEE_CONFIGURACION('INVENTARIO','DOCUMENTOS','CODIGO DE LISTA DE PRECIOS A IMPRIMIR EN DOCUMENTOS') returning_values (:LISTA);
      if (NOT lista IS NULL) then
          SELECT PRAR_FIJO FROM PRECIOS_ARTICULO WHERE ARTI_COD = :articulo AND LIPR_COD = :LISTA INTO :PRECIO;
      EXECUTE PROCEDURE ultimo_costo(:articulo, :fecha,  :unidad) returning_values (:ultimo);
      TOTALULT = CANT * ULTIMO;
      TOTALITEM = COSTO + IVAMONTO + CONSUMO;
      TOTAL = TOTAL - IVAMONTO;
      if (PESOUNIT IS NULL) then
        PESOUNIT = 0;
      PESOTOT = PESOTOT + PESOUNIT;
      VOLUMUNIT = ANCHO * ALTO * LARGO;
      volumunit = VOLUMUNIT * CANT;
      if (VOLUMUNIT IS NULL) then
        VOLUMUNIT = 0;
      VOLUMTOT = VOLUMTOT + VOLUMUNIT;
      SELECT STAND_COD FROM STANDS WHERE ARTI_COD = :ARTICULO AND STAND_BODEGA = :boditem INTO :stand;
      LOTEVENCE = NULL;
      SELECT LOTE_VENCE FROM LOTES WHERE ARTI_COD = :ARTICULO AND LOTE_NRO = :LOTE AND BODE_COD = :boditem INTO :lotevence;
      SUSPEND;
      END
END
^

SET TERM ; ^


/* 20100925 */
SET TERM ^ ;

CREATE OR ALTER PROCEDURE EXISTENCIAS_SIN_AJUSTAR(
    FECHA DATE)
RETURNS (
    CODIGO VARCHAR(15),
    NOMBRE VARCHAR(60),
    UNIDAD VARCHAR(8),
    CANT NUMERIC(18,4),
    COSTO NUMERIC(18,2),
    CODBOD VARCHAR(2),
    NOMBOD VARCHAR(30),
    COSTOTOT NUMERIC(18,2),
    ULTCOSTO NUMERIC(18,2),
    FECHACOSTO DATE,
    IVA NUMERIC(9,2),
    CODBAR VARCHAR(20))
AS
BEGIN
FOR SELECT ARTI_COD, ARTI_DES, ARTI_UNIDAD, TAIV_PORC, BODE_COD, BODE_NOM
    FROM ARTICULO A, BODEGA B, TARIFA_IVA T
    WHERE ESAR_COD <> 'I' AND A.TAIV_COD = T.TAIV_COD AND ARTI_EXIST <> 'N'
    INTO :CODIGO, :NOMBRE, :UNIDAD, :IVA, :CODBOD, :NOMBOD
    DO
    BEGIN
    if (NOT EXISTS (SELECT A.AJUS_ID FROM AJUSTES_DETALLE D, AJUSTES A
        WHERE A.ajus_fecha = :FECHA AND A.ajus_id = D.ajus_id AND D.arti_cod = :codigo)) then
        BEGIN
        CODBAR = NULL;
        SELECT FIRST 1 COBA_COD FROM BARRAS_ARTICULO
            WHERE ARTI_COD = :codigo AND COBA_UNIDAD = :unidad ORDER BY STRLEN(COBA_COD) INTO :codbar;
        if (CODBAR IS NULL) then
            CODBAR = CODIGO;
        EXECUTE PROCEDURE SALDO_INICIAL_INVENTARIO(CODIGO, FECHA, :CODBOD) returning_values (CANT);
        EXECUTE PROCEDURE costo_promedio_y_ultimo_unidad(CODIGO, FECHA-1, UNIDAD) returning_values (COSTO, ULTCOSTO);
        SELECT FIRST 1 MVAR_FECHA FROM MOVIMIENTO_ARTICULO WHERE ARTI_COD = :CODIGO AND MVAR_ENTRADA = 'S' AND MVAR_FECHA <= :FECHA
            ORDER BY ARTI_COD DESC, MVAR_FECHA DESC INTO :FECHACOSTO;
        COSTOTOT = :CANT * :COSTO;
        if (CANT <> 0) then
            SUSPEND;
        END
    END
END
^

SET TERM ; ^


/* 20100925 */
/* SI LA UNIDAD PRINCIPAL NO ES EL GRAMO HAY QUE MULTIPLICAR POR EL FACTOR DE LA FORMULA */
SET TERM ^ ;

CREATE OR ALTER TRIGGER MOVIMIENTO_ARTICULO_BI FOR MOVIMIENTO_ARTICULO
ACTIVE BEFORE INSERT POSITION 0
AS
declare variable LOTE CHAR(1);
declare variable ENSAMBLE CHAR(1);
declare variable IDENS INTEGER;
declare variable PREFENS VARCHAR(4);
declare variable unidad varchar(8);
declare variable DESCR varchar(60);
declare variable CODPR varchar(15);
declare variable DESPR varchar(60);
declare variable UNIPR varchar(8);
declare variable CANTPR numeric(18,4);
declare variable FACTOR numeric(18,4);
declare variable COSTO numeric(18,2);
declare variable COSTOTOT numeric(18,2);
declare variable PORCPR numeric(9,4);
declare variable MERMAPR numeric(9,4);
declare variable PESO numeric(18,4);
declare variable PESOPR numeric(18,4);
declare variable ITEM INTEGER;
declare variable IVA NUMERIC(9,4);
declare variable IVAM NUMERIC(18,2);
declare variable CONSUMO NUMERIC(18,2);
declare variable TOTAL float;
declare variable SALDO NUMERIC(18,4);
BEGIN
/* INSERTE EL NUEVO LOTE */
if (NEW.mvar_cant IS NULL) then
    NEW.mvar_cant = 0;
SELECT ARTI_EXIST
    FROM   ARTICULO
    WHERE  ARTICULO.ARTI_COD = NEW.ARTI_COD
    INTO :LOTE;
if (LOTE = 'L') then
    BEGIN
      if ((NEW.mvar_lote IS NULL) or (NEW.mvar_lote = '')) then
        if (new.mvar_entrada = 'S') then
            new.mvar_lote = cast(new.mvar_cons as varchar(15));
        else
            begin
            /* NO HAY LOTE, ENTONCES CALCULELO SEGUN CONFIGURACION */
            EXCEPTION LOTE_NEGATIVO 'No se indicó un lote para el artículo ' || new.arti_cod;
            end
    END
/* ENSAMBLE EL PRODUCTO */
SELECT ARTI_ENSAMBLE, ARTI_UNIDAD, ARTI_DES, ARTI_PESO
    FROM ARTICULO WHERE ARTI_COD = NEW.arti_cod INTO :ensamble, :unidad, :descr, :peso;
if ((NEW.mvar_entrada = 'N') AND (ENSAMBLE = 'S')) then
    BEGIN
    /* verifique si la existecia es insufieciente */
/*    INSERT INTO audi_trig (EVENTO) VALUES ('movarti_bi ensamble' || NEW.arti_cod);*/
    execute procedure saldo_inventario(new.arti_cod, new.bode_cod, new.mvar_fecha) returning_values (:saldo);
/*    INSERT INTO audi_trig (EVENTO) VALUES ('movarti_bi ensamble ' || NEW.arti_cod || ' cant:' || new.mvar_cant || ' saldo:' || :saldo);*/
    if (NEW.mvar_cant > :SALDO) then
        BEGIN
        if (SALDO > 0) then
            SALDO = NEW.mvar_cant - :SALDO;
        else
            SALDO = NEW.mvar_cant;
        IDENS = gen_id(id_ensamble, 1);
        EXECUTE PROCEDURE lee_configuracion('INVENTARIO', 'ENSAMBLES', 'PREFIJO PARA ENSAMBLES AUTOMATICOS AL SACAR PRODUCTOS') returning_values (:prefens);
        /* CALCULE EL COSTO TOTAL DEL ENSAMBLE */
        select sum(arpr_porc) from articulos_producto where arti_cod = NEW.arti_cod into :total;
        COSTOTOT = 0;
        FOR SELECT ARPR_CANT, ARPR_UNIDAD, ARPR_COMP, ARPR_PORC, ARPR_MERMA, ARTI_PESO
            FROM articulos_producto P, ARTICULO A
            WHERE P.ARTI_COD = NEW.arti_cod AND A.arti_cod = P.arpr_comp
            INTO :CANTPR, :UNIPR, :CODPR, :PORCPR, :MERMAPR, :PESOPR
            DO
            BEGIN
            EXECUTE PROCEDURE factor_unidad_cant(:codpr, :unipr) returning_values (:factor);
            EXECUTE PROCEDURE costo_promedio_unidad (:codpr, NEW.mvar_fecha, :UNIPR) returning_values (:COSTO);
            IVAM = costo * cantpr * iva / 100;
            if (((cantpr is null) or (cantpr = 0)) AND (porcpr IS NOT NULL) AND (porcpr <> 0)) then
                BEGIN
                /* ES PORCENTUAL AL PESO LA MEZCLA SOBRE EL 1ER ARTICULO */
                CANTPR = :SALDO * PESO;
                CANTPR = CANTPR / TOTAL * porcpr; /* APLICA LA PROPORCION */
                if ((mermapr IS NOT NULL) AND (mermapr <> 0)) then
                    CANTPR = CANTPR * (100 + mermapr) / 100;
                END
            ELSE
                BEGIN
                CANTPR = CANTPR * :SALDO * pesopr * :FACTOR;
                END
            COSTOTOT = COSTOTOT + COSTO * CANTPR;
            END
        if (NEW.mvar_cant <> 0) then
            COSTO = costotot / NEW.mvar_cant;
        else
            COSTO = 0;
        INSERT INTO ENSAMBLES(ENSA_ID, TIDO_COD, PREF_PRE, BODE_COD, ENSA_NUMERO, ENSA_FECHA, ENSA_CONC, ENSA_REFER, ENSA_CANT, ENSA_UNIDAD, ENSA_FACTOR, ENSA_ANULADO, ENSA_TRANSMIT,
            ARTI_COD, ENSA_DESC, ENSA_CODBAR, ENSA_LOTE, ENSA_OBS, TERC_NIT, ENSA_USUARIO, NUMOK, ENSA_COSTO, LOTE_VENCE, ENSA_CODRETAL, ENSA_CANTRETAL, ENSA_OPER, ENSA_MAQUINA, ENSA_PESO, ENSA_BODRETAL, ENSA_TIPOREF, ENSA_IDREF)
            VALUES (:IDENS, 15, :prefens, NEW.bode_cod, '000001', new.mvar_fecha, new.mvar_conc, '', :SALDO, :unidad, 1, 'N', 'N',
            NEW.arti_cod, :descr, NEW.arti_cod, NEW.mvar_lote, NULL, NULL, USER, 'N', :costo, NULL, NULL, 0, null,  NULL, 0, NEW.bode_cod, NEW.mvar_tipodoc, NEW.mvar_idref);
        /* LOS DETALLES DEL ENSAMBLE */
        ITEM = 0;
        FOR SELECT ARPR_CANT, ARPR_UNIDAD, ARPR_COMP, ARTI_DES, TAIV_PORC, ARTI_CONSUMO, ARPR_PORC, ARPR_MERMA, ARTI_PESO
            FROM articulos_producto P, ARTICULO A, TARIFA_IVA T
            WHERE P.ARTI_COD = NEW.arti_cod AND A.arti_cod = P.arpr_comp AND A.taiv_cod = T.taiv_cod
            INTO :CANTPR, :UNIPR, :CODPR, :DESPR, :IVA, :CONSUMO, :PORCPR, :MERMAPR, :PESOPR
            DO
            BEGIN
            ITEM = ITEM + 1;
            EXECUTE PROCEDURE factor_unidad_cant(:codpr, :unipr) returning_values (:factor);
            EXECUTE PROCEDURE costo_promedio_unidad (:codpr, NEW.mvar_fecha, :UNIPR) returning_values (:COSTO);
            IVAM = costo * cantpr * iva / 100;
            if (((cantpr is null) or (cantpr = 0)) AND (porcpr IS NOT NULL) AND (porcpr <> 0)) then
                BEGIN
                /* ES PORCENTUAL AL PESO LA MEZCLA SOBRE EL 1ER ARTICULO */
                CANTPR = :SALDO * PESO;
                CANTPR = CANTPR / TOTAL * porcpr; /* APLICA LA PROPORCION */
                if ((mermapr IS NOT NULL) AND (mermapr <> 0)) then
                    CANTPR = CANTPR * (100 + mermapr) / 100;
/*                CANTPR = CANTPR / pesopr; /* LO LLEVA A LA UNIDAD PRINCIPAL */
                UNIPR = 'GRAMO';
                END
            ELSE
                BEGIN
                CANTPR = CANTPR * :SALDO * pesopr * FACTOR;
                END
            INSERT INTO ENSAMBLES_DETALLE(ENSA_ID, ESDE_ITEM, ARTI_COD, BODE_COD, ESDE_CANT, ESDE_UNIDAD, ESDE_COSTO, ESDE_LOTE, ESDE_FACTOR, ESDE_IVAPORC, ESDE_IVAMONTO, ESDE_CONSUMO, ESDE_CODBAR, ESDE_ANULADO, ESDE_TRANSMIT, ESDE_DESC, ESDE_TOTAL, ESDE_PESO)
                VALUES (:idens, :ITEM, :codpr,  NEW.bode_cod, :cantpr, :unipr, :costo, NULL, :FACTOR, :IVA, :ivam, :consumo, :codpr, 'N', 'N', :despr, :COSTO * :cantpr, 0);
            END
        END
    END
if (new.mvar_cons is null) then
    NEW.mvar_cons = GEN_ID(ID_MOVARTI,1);
END
^

SET TERM ; ^


/* 20100924 */
ALTER TABLE ARTICULOS_PRODUCTO
ADD ARPR_BASE T_BOOLEANO;

update articulos_producto set arpr_base = 'N' where arpr_base is null;
commit work;

ALTER TABLE PLAN_PRODUCCION_PRODUCTOS
ADD ARPR_BASE T_BOOLEANO;

update PLAN_PRODUCCION_PRODUCTOS set arpr_base = 'N' where arpr_base is null;
commit work;


SET TERM ^ ;

CREATE OR ALTER TRIGGER PLAN_PRODUCCION_DET_AI FOR PLAN_PRODUCCION_DET
ACTIVE AFTER INSERT POSITION 0
as
declare variable descr VARCHAR(60);
declare variable MERMA NUMERIC(18,4);
declare variable PESOCMP NUMERIC(18,4);
declare variable TOTAL FLOAT;
declare variable FACTOR FLOAT;
declare variable CODCMP VARCHAR(20);
declare variable CANTPRO NUMERIC(18,4);
declare variable CANTCMP NUMERIC(18,4);
declare variable CANTSOB NUMERIC(18,4);
declare variable UNDCMP VARCHAR(8);
declare variable PORCMP FLOAT;
declare variable entrada CHAR(1);
declare variable i integer;
declare variable sobrante varchar(15);
declare variable porsob numeric(9,4);
declare variable REUSO CHAR(1);
declare variable ITEM INTEGER;
declare variable NUMROWS INTEGER;
declare variable TIPOORD INTEGER;
declare variable BASE char(1);
BEGIN
if ((NEW.plpr_id <> 0) and (new.plpd_anulado = 'N')) then
    BEGIN
    CANTPRO = NEW.plpd_cant * NEW.plpd_factor;
    select plpr_entrada from plan_produccion where plpr_id = new.plpr_id into :entrada;
    if (entrada = 'S') then
        begin
        i = 0;
        select arti_sobrante, arti_porcsobr, ARTI_REUSOB from articulo
            where arti_cod = new.arti_cod into :sobrante, :porsob, :reuso;

        select sum(arpr_porc) from articulos_producto where arti_cod = new.arti_cod into :total;
        FOR SELECT arpr_comp, ARPR_CANT, ARPR_UNIDAD, ARPR_PORC, ARTI_DES, arti_peso, arpr_merma, arpr_base
            from articulos_producto AP, ARTICULO A2
            WHERE AP.arpr_comp = A2.arti_cod AND AP.arti_cod = new.arti_cod ORDER by ARPR_ITEM
            INTO :codcmp, :cantcmp, :undcmp, :porcmp, :descr, :pesocmp, :MERMA, :BASE
            DO
            BEGIN
            EXECUTE PROCEDURE factor_unidad_cant(:codcmp, :undcmp) returning_values (:FACTOR);
            if (((cantcmp is null) or (cantcmp = 0)) AND (PORCMP IS NOT NULL) AND (porcmp <> 0)) then
                BEGIN
                cantcmp = NEW.plpd_cant * NEW.plpd_factor * NEW.plpd_peso / TOTAL * PORCMP; /* APLICA LA PROPORCION */
                if ((MERMA IS NOT NULL) AND (MERMA <> 0)) then
                    cantcmp = cantcmp * (100 + MERMA) / 100;
                if ((sobrante <> '') and (porsob <> 0) and (sobrante = codcmp)) then
                    begin
                    cantsob = cantpro * new.plpd_peso;
                    cantsob = cantsob / TOTAL * porsob; /* APLICA LA PROPORCION */
                    cantcmp = cantcmp + cantsob;
                    end
                END
            ELSE
                BEGIN
                cantcmp = cantcmp * FACTOR * pesocmp * NEW.plpd_cant * NEW.plpd_factor;
                END

            i = i + 1;
            insert into plan_produccion_productos (plpr_id, plpd_item, plpp_nrocmop, arpr_comp, arpr_cant, arpr_porc, arpr_unidad, arpr_merma, arti_peso, arpr_base)
                values(new.plpr_id, new.plpd_item, :i, :codcmp,  :cantcmp, :porcmp, :undcmp, :merma, :pesocmp, :base);

            SELECT COUNT(ARTI_COD) FROM articulos_producto WHERE ARTI_COD = :codcmp INTO :NUMROWS;
            if (NUMROWS <> 0) then
               TIPOORD = 19;
            else
                TIPOORD = 24;

            /* INSERTE O ACTUALICE EL COMPONENTE */
            if (NOT EXISTS (SELECT PLPC_ITEM FROM plan_produccion_cons WHERE PLPD_ID = new.plpr_id AND ARTI_COD = :codcmp)) then
                BEGIN
                select max(plpc_item) from plan_produccion_cons where PLPD_ID = new.plpr_id into :item;
                if (item is null) then
                    item = 0;
                item = item + 1;
                INSERT INTO plan_produccion_cons (PLPD_ID, PLPC_ITEM, PLPC_CODBAR, ARTI_COD, PLPC_CANT, PLPC_UNIDAD, PLPC_EXIST, PLPC_ORDENAR, PLPC_ORDENTIPO, PLPC_ORDENID, PLPC_ANULADO, PLPC_TRANSMIT, PLPC_DESC)
                    VALUES (new.plpr_id, :item, :codcmp, :codcmp, :cantcmp, :undcmp, 0, 0, :tipoord, 0, 'N', 'N', :descr);
                END
            ELSE
                UPDATE plan_produccion_cons SET PLPC_CANT = PLPC_CANT + :cantcmp
                    WHERE PLPD_ID = NEW.plpr_id AND ARTI_COD = :codcmp;
            END
        end
    end
end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER PLAN_PRODUCCION_DET_AU FOR PLAN_PRODUCCION_DET
ACTIVE AFTER UPDATE POSITION 0
as
declare variable descr VARCHAR(60);
declare variable MERMA NUMERIC(18,4);
declare variable PESOCMP NUMERIC(18,4);
declare variable TOTAL FLOAT;
declare variable FACTOR FLOAT;
declare variable CODCMP VARCHAR(20);
declare variable CANTPRO NUMERIC(18,4);
declare variable CANTCMP NUMERIC(18,4);
declare variable CANTSOB NUMERIC(18,4);
declare variable UNDCMP VARCHAR(8);
declare variable PORCMP FLOAT;
declare variable entrada CHAR(1);
declare variable i integer;
declare variable sobrante varchar(15);
declare variable porsob numeric(9,4);
declare variable REUSO CHAR(1);
declare variable ITEM INTEGER;
declare variable NUMROWS INTEGER;
declare variable TIPOORD INTEGER;
declare variable totcant numeric(18,4);
declare variable Pref varchar(4);
declare variable Num varchar(6);
declare variable BodDes varchar(2);
declare variable Fec Date;
declare variable SOBTOT CHAR(1);
declare variable base char(1);
BEGIN
if ((OLD.plpd_transmit <> NEW.plpd_transmit) AND (NEW.plpd_transmit = 'N')) then
    BEGIN
    totcant = 0;
    CANTPRO = NEW.plpd_cant * NEW.plpd_factor;
    select plpr_fecfin, plpr_pref, plpr_numero, plpr_entrada, plpr_boddes from plan_produccion
        where plpr_id = new.plpr_id into :fec, :Pref, :Num, :entrada, :boddes;
    if (entrada = 'S') then
        begin
        i = 0;
        select arti_sobrante, arti_porcsobr, ARTI_REUSOB, ARTI_SOBTOT from articulo
            where arti_cod = new.arti_cod into :sobrante, :porsob, :reuso, :sobtot;

        select sum(arpr_porc) from articulos_producto where arti_cod = new.arti_cod into :total;
        FOR SELECT arpr_comp, ARPR_CANT, ARPR_UNIDAD, ARPR_PORC, ARTI_DES, arti_peso, arpr_merma
            from articulos_producto AP, ARTICULO A2
            WHERE AP.arpr_comp = A2.arti_cod AND AP.arti_cod = new.arti_cod ORDER by ARPR_ITEM
            INTO :codcmp, :cantcmp, :undcmp, :porcmp, :descr, :pesocmp, :MERMA
            DO
            BEGIN
            EXECUTE PROCEDURE factor_unidad_cant(:codcmp, :undcmp) returning_values (:FACTOR);
            if (((cantcmp is null) or (cantcmp = 0)) AND (PORCMP IS NOT NULL) AND (porcmp <> 0)) then
                BEGIN
                cantcmp = NEW.plpd_cant * NEW.plpd_factor * NEW.plpd_peso / TOTAL * PORCMP; /* APLICA LA PROPORCION */
                if ((MERMA IS NOT NULL) AND (MERMA <> 0)) then
                    cantcmp = cantcmp * (100 + MERMA) / 100;
                if ((sobrante <> '') and (porsob <> 0) and (sobrante = codcmp)) then
                    begin
                    cantsob = cantpro * new.plpd_peso;
                    cantsob = cantsob / TOTAL * porsob; /* APLICA LA PROPORCION */
                    cantcmp = cantcmp + cantsob;
                    end
                totcant = totcant + cantcmp;
                END
            ELSE
                BEGIN
                cantcmp = cantcmp * FACTOR * pesocmp * NEW.plpd_cant * NEW.plpd_factor;
                if (SOBTOT = 'S') then
                    totcant = totcant + cantcmp;
                END
            END

        /* ingrese el sobrante */
        if (NEW.plpd_transmit = 'N') then
          if ((sobrante <> '') and (porsob <> 0) AND (REUSO = 'N')) then
              begin
              select arti_peso from articulo where arti_cod = :sobrante into :pesocmp;
              INSERT INTO MOVIMIENTO_ARTICULO
                (ARTI_COD, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM, TERC_NIT)
                VALUES(:sobrante, :boddes, :FEC, 27, new.plpr_id, 'SOBRANTE PLAN PRODUCCION ' || :PREF || :num || ' ARTICULO:' || new.arti_cod,
                (:porsob * :totcant /100)/:pesocmp, 0, 'S', null, :Pref, :Num, 0, null);
              end
        end
    END
ELSE
  BEGIN
  if ((OLD.plpr_id <> 0) and (OLD.plpd_anulado = 'N')) then
    BEGIN
    FOR SELECT arpr_comp, ARPR_CANT
        from plan_produccion_productos where plpr_id = old.plpr_id and plpd_item = old.plpd_item
        INTO :codcmp, :cantcmp
        DO
        BEGIN
        /* INSERTE O ACTUALICE EL COMPONENTE */
        UPDATE plan_produccion_cons SET PLPC_CANT = PLPC_CANT - :cantcmp
            WHERE PLPD_ID = OLD.plpr_id AND ARTI_COD = :codcmp;
        END
    DELETE FROM plan_produccion_productos where plpr_id = old.plpr_id and plpd_item = old.plpd_item;
    select arti_sobrante from articulo where arti_cod = OLD.arti_cod into :sobrante;
    DELETE FROM movimiento_articulo M WHERE M.mvar_tipodoc = 27 AND M.mvar_idref = OLD.plpr_id AND MVAR_ITEM = 0 AND ARTI_COD = :sobrante;
    END

  if ((NEW.plpr_id <> 0) and (new.plpd_anulado = 'N')) then
    BEGIN
    totcant = 0;
    CANTPRO = NEW.plpd_cant * NEW.plpd_factor;
    select plpr_fecfin, plpr_pref, plpr_numero, plpr_entrada, plpr_boddes from plan_produccion
        where plpr_id = new.plpr_id into :fec, :Pref, :Num, :entrada, :boddes;
    if (entrada = 'S') then
        begin
        i = 0;
        select arti_sobrante, arti_porcsobr, ARTI_REUSOB, ARTI_SOBTOT from articulo
            where arti_cod = new.arti_cod into :sobrante, :porsob, :reuso, :sobtot;

        select sum(arpr_porc) from articulos_producto where arti_cod = new.arti_cod into :total;
        FOR SELECT arpr_comp, ARPR_CANT, ARPR_UNIDAD, ARPR_PORC, ARTI_DES, arti_peso, arpr_merma, arpr_base
            from articulos_producto AP, ARTICULO A2
            WHERE AP.arpr_comp = A2.arti_cod AND AP.arti_cod = new.arti_cod ORDER by ARPR_ITEM
            INTO :codcmp, :cantcmp, :undcmp, :porcmp, :descr, :pesocmp, :MERMA, :BASE
            DO
            BEGIN
            EXECUTE PROCEDURE factor_unidad_cant(:codcmp, :undcmp) returning_values (:FACTOR);
            if (((cantcmp is null) or (cantcmp = 0)) AND (PORCMP IS NOT NULL) AND (porcmp <> 0)) then
                BEGIN
                cantcmp = NEW.plpd_cant * NEW.plpd_factor * NEW.plpd_peso / TOTAL * PORCMP; /* APLICA LA PROPORCION */
                if ((MERMA IS NOT NULL) AND (MERMA <> 0)) then
                    cantcmp = cantcmp * (100 + MERMA) / 100;
                if ((sobrante <> '') and (porsob <> 0) and (sobrante = codcmp) and (reuso = 'N')) then
                    begin
                    cantsob = cantpro * new.plpd_peso;
                    cantsob = cantsob / TOTAL * porsob; /* APLICA LA PROPORCION */
                    cantcmp = cantcmp + cantsob;
                    end
                totcant = totcant + cantcmp;
                END
            ELSE
                BEGIN
                cantcmp = cantcmp * FACTOR * pesocmp * NEW.plpd_cant * NEW.plpd_factor;
                if (SOBTOT = 'S') then
                    totcant = totcant + cantcmp;
                END

            i = i + 1;
            insert into plan_produccion_productos (plpr_id, plpd_item, plpp_nrocmop, arpr_comp, arpr_cant, arpr_porc, arpr_unidad, arpr_merma, arti_peso, arpr_base)
                values(new.plpr_id, new.plpd_item, :i, :codcmp,  :cantcmp, :porcmp, :undcmp, :merma, :pesocmp, :base);

            SELECT COUNT(ARTI_COD) FROM articulos_producto WHERE ARTI_COD = :codcmp INTO :NUMROWS;
            if (NUMROWS <> 0) then
               TIPOORD = 19;
            else
                TIPOORD = 24;

            /* INSERTE O ACTUALICE EL COMPONENTE */
            if (NOT EXISTS (SELECT PLPC_ITEM FROM plan_produccion_cons WHERE PLPD_ID = new.plpr_id AND ARTI_COD = :codcmp)) then
                BEGIN
                select max(plpc_item) from plan_produccion_cons where PLPD_ID = new.plpr_id into :item;
                item = item + 1;
                INSERT INTO plan_produccion_cons (PLPD_ID, PLPC_ITEM, PLPC_CODBAR, ARTI_COD, PLPC_CANT, PLPC_UNIDAD, PLPC_EXIST, PLPC_ORDENAR, PLPC_ORDENTIPO, PLPC_ORDENID, PLPC_ANULADO, PLPC_TRANSMIT, PLPC_DESC)
                    VALUES (new.plpr_id, :item, :codcmp, :codcmp, :cantcmp, :undcmp, 0, 0, :tipoord, 0, 'N', 'N', :descr);
                END
            ELSE
                UPDATE plan_produccion_cons SET PLPC_CANT = PLPC_CANT + :cantcmp
                    WHERE PLPD_ID = NEW.plpr_id AND ARTI_COD = :codcmp;
            END
        end
    end
  END
end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure IMPR_PLANPROD (
    ID integer)
returns (
    PREF varchar(4),
    NUMERO varchar(6),
    FECHA date,
    FECFIN date,
    CONCEPTO varchar(60),
    RESPONSABLE varchar(60),
    OBS blob sub_type 0 segment size 80,
    ITEM integer,
    ARTICULO varchar(15),
    CODBAR varchar(15),
    ARTIDES varchar(60),
    CANT numeric(18,4),
    UNIDAD varchar(8),
    MERMA numeric(18,4),
    PESO numeric(18,4),
    OBSITEM blob sub_type 0 segment size 80,
    CODCOMP varchar(20),
    DESCOMP varchar(60),
    CANTCOMP numeric(18,4),
    UNICOMP varchar(8))
AS
declare variable CODPROD varchar(20);
declare variable PORC float;
declare variable MERMAC numeric(18,4);
declare variable PESOPRO numeric(18,4);
declare variable PESOCMP numeric(18,4);
declare variable TOTAL float;
declare variable CANTPRO numeric(18,4);
declare variable CANTSOB numeric(18,4);
declare variable FACTOR float;
declare variable sobrante varchar(15);
declare variable porsob numeric(9,4);
declare variable BASE varchar(20);
declare variable BASEANT varchar(20);
declare variable ITEMAUX integer;
declare variable ARTICULOAUX varchar(20);
declare variable CODBARAUX varchar(20);
declare variable ARTIDESAUX varchar(60);
declare variable CANTAUX numeric(18,4);
declare variable UNIDADAUX varchar(8);
declare variable PESOAUX numeric(18,4);
declare variable OBSITEAUX varchar(1024);
begin
BASEANT = '';
select PLPR_PREF, PLPR_NUMERO, PLPR_FECINI, PLPR_FECFIN, PLPR_CONC, PLPR_RESPONSABLE, PLPR_OBS
    from plan_produccion O where PLPR_ID = :ID into
    :PREF, :NUMERO, :FECHA,
    :FECFIN, :CONCEPTO, :RESPONSABLE, :OBS;
for select PLPD_ITEM, p.ARTI_COD, PLPD_CODBAR, PLPD_DESC, PLPD_CANT, PLPD_UNIDAD, PLPD_PESO, PLPD_OBS, arti_sobrante, arti_porcsobr
    from plan_produccion_det p, articulo a where a.arti_cod = p.arti_cod and PLPR_ID = :ID
    order by PLPD_ITEM
    into :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :PESO, :OBSITEM, :sobrante, :porsob
    do
    begin
    /* DETECTE SI HAY UNA BASE EN LA FORMULA */
    BASE = NULL;
    select first 1 arpr_comp from plan_produccion_productos
        where plpr_id = :id and plpd_item = :item and arpr_base = 'S' into :BASE;
    if (BASE IS NOT NULL) then
        begin
        if (BASE <> BASEANT) then
            begin
            BASEANT = BASE;
            /* GUARDE LOS VALORES */
            ITEMAUX = ITEM;
            ARTICULOAUX = ARTICULO;
            CODBARAUX = CODBAR;
            ARTIDESAUX = ARTIDES;
            CANTAUX = CANT;
            UNIDADAUX = UNIDAD;
            PESOAUX = PESO;
            OBSITEAUX = OBSITEM;

            /* ES UNA NUEVA BASE, HAGA LA IMPRESION DE LA BASE */
            for select PLPC_ITEM, ARTI_COD, PLPC_CODBAR, PLPC_DESC, PLPC_CANT, PLPC_UNIDAD, 0, ''
                from plan_produccion_cons where PLPD_ID = :ID and ARTI_COD = :BASE
                order by PLPC_ITEM
                into :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :peso, :obsitem
                do
                begin
                codcomp = '';
                descomp = '';
                cantcomp = 0;
                unicomp = '';
                suspend;
                CODPROD = ARTICULO;
                for select arpr_comp, arti_des, arpr_cant, arpr_unidad, 0, 0, 0
                    from plan_produccion_cons_prod P, ARTICULO A
                    where P.arpr_comp = A.arti_cod and p.plpd_id = :id and P.plpc_item = :item order by P.plcp_nrocomp
                    into :codcomp, :descomp, :cantcomp, :unicomp, :porc, :mermac, :pesocmp
                    do
                    begin
                    ARTICULO = '';
                    CODBAR = '';
                    ARTIDES = '';
                    CANT = 0;
                    UNIDAD = '';
                    OBSITEM = '';
                    suspend;
                    end
                end
            /* RESTAURE LOS VALORES */
            ITEM = ITEMAUX;
            ARTICULO = ARTICULOAUX;
            CODBAR = CODBARAUX;
            ARTIDES = ARTIDESAUX;
            CANT = CANTAUX;
            UNIDAD = UNIDADAUX;
            PESO = PESOAUX;
            OBSITEM = OBSITEAUX;
            end
        end
    /* ENSAMBLE DIRECTO O BASE YA IMPRESA */
    codcomp = '';
    descomp = '';
    cantcomp = 0;
    unicomp = '';
    suspend;
    CODPROD = ARTICULO;
    pesopro = peso;
    execute procedure factor_unidad_cant(:codprod, :unidad) returning_values (:factor);
    CANTPRO = CANT * FACTOR;
    select sum(arpr_porc) from plan_produccion_productos where plpr_id = :id and plpd_item = :item into :total;
    for select arpr_comp, arti_des, arpr_cant, arpr_unidad, ARPR_PORC, ARPR_MERMA, p.arti_peso
        from plan_produccion_productos P, ARTICULO A
        where p.plpr_id = :id and p.plpd_item = :item and P.arpr_comp = A.arti_cod
        into :codcomp, :descomp, :cantcomp, :unicomp, :porc, :mermac, :pesocmp
        do
        begin
        ARTICULO = '';
        CODBAR = '';
        ARTIDES = '';
        CANT = 0;
        UNIDAD = '';
        MERMA = 0;
        PESO = 0;
        OBSITEM = '';
        execute procedure factor_unidad_cant(:codcomp, :unicomp) returning_values (:factor);
        if (((cantcomp is null) or (cantcomp = 0)) and (PORC is not null) and (porc <> 0)) then
            begin
            /* ES PORCENTUAL AL PESO LA MEZCLA SOBRE EL 1ER ARTICULO */
            cantcomp = cantpro * pesopro / TOTAL * PORC; /* APLICA LA PROPORCION */
            if ((MERMAC is not null) and (MERMAC <> 0)) then
                cantcomp = cantcomp * (100 + MERMAC) / 100;
            if ((sobrante <> '') and (porsob <> 0) and (sobrante = codcomp)) then
                begin
                cantsob = cantpro * pesopro;
                cantsob = cantsob / TOTAL * porsob; /* APLICA LA PROPORCION */
                cantcomp = cantcomp + cantsob;
                merma = cantsob;
                end
            end
        else
            begin
            cantcomp = cantcomp * FACTOR * pesocmp * cantpro;
            end
        suspend;
        end
   end
end
^

SET TERM ; ^

ALTER TABLE PLAN_PRODUCCION_CONS
ADD PLPC_BASE T_BOOLEANO;

UPDATE PLAN_PRODUCCION_CONS SET PLPC_BASE = 'N' WHERE PLPC_BASE IS NULL;
COMMIT WORK;

SET TERM ^ ;

CREATE OR ALTER TRIGGER PLAN_PRODUCCION_DET_AI FOR PLAN_PRODUCCION_DET
ACTIVE AFTER INSERT POSITION 0
as
declare variable descr VARCHAR(60);
declare variable MERMA NUMERIC(18,4);
declare variable PESOCMP NUMERIC(18,4);
declare variable TOTAL FLOAT;
declare variable FACTOR FLOAT;
declare variable CODCMP VARCHAR(20);
declare variable CANTPRO NUMERIC(18,4);
declare variable CANTCMP NUMERIC(18,4);
declare variable CANTSOB NUMERIC(18,4);
declare variable UNDCMP VARCHAR(8);
declare variable PORCMP FLOAT;
declare variable entrada CHAR(1);
declare variable i integer;
declare variable sobrante varchar(15);
declare variable porsob numeric(9,4);
declare variable REUSO CHAR(1);
declare variable ITEM INTEGER;
declare variable NUMROWS INTEGER;
declare variable TIPOORD INTEGER;
declare variable BASE char(1);
BEGIN
if ((NEW.plpr_id <> 0) and (new.plpd_anulado = 'N')) then
    BEGIN
    CANTPRO = NEW.plpd_cant * NEW.plpd_factor;
    select plpr_entrada from plan_produccion where plpr_id = new.plpr_id into :entrada;
    if (entrada = 'S') then
        begin
        i = 0;
        select arti_sobrante, arti_porcsobr, ARTI_REUSOB from articulo
            where arti_cod = new.arti_cod into :sobrante, :porsob, :reuso;

        select sum(arpr_porc) from articulos_producto where arti_cod = new.arti_cod into :total;
        FOR SELECT arpr_comp, ARPR_CANT, ARPR_UNIDAD, ARPR_PORC, ARTI_DES, arti_peso, arpr_merma, arpr_base
            from articulos_producto AP, ARTICULO A2
            WHERE AP.arpr_comp = A2.arti_cod AND AP.arti_cod = new.arti_cod ORDER by ARPR_ITEM
            INTO :codcmp, :cantcmp, :undcmp, :porcmp, :descr, :pesocmp, :MERMA, :BASE
            DO
            BEGIN
            EXECUTE PROCEDURE factor_unidad_cant(:codcmp, :undcmp) returning_values (:FACTOR);
            if (((cantcmp is null) or (cantcmp = 0)) AND (PORCMP IS NOT NULL) AND (porcmp <> 0)) then
                BEGIN
                cantcmp = NEW.plpd_cant * NEW.plpd_factor * NEW.plpd_peso / TOTAL * PORCMP; /* APLICA LA PROPORCION */
                if ((MERMA IS NOT NULL) AND (MERMA <> 0)) then
                    cantcmp = cantcmp * (100 + MERMA) / 100;
                if ((sobrante <> '') and (porsob <> 0) and (sobrante = codcmp)) then
                    begin
                    cantsob = cantpro * new.plpd_peso;
                    cantsob = cantsob / TOTAL * porsob; /* APLICA LA PROPORCION */
                    cantcmp = cantcmp + cantsob;
                    end
                END
            ELSE
                BEGIN
                cantcmp = cantcmp * FACTOR * pesocmp * NEW.plpd_cant * NEW.plpd_factor;
                END

            i = i + 1;
            insert into plan_produccion_productos (plpr_id, plpd_item, plpp_nrocmop, arpr_comp, arpr_cant, arpr_porc, arpr_unidad, arpr_merma, arti_peso, arpr_base)
                values(new.plpr_id, new.plpd_item, :i, :codcmp,  :cantcmp, :porcmp, :undcmp, :merma, :pesocmp, :base);

            SELECT COUNT(ARTI_COD) FROM articulos_producto WHERE ARTI_COD = :codcmp INTO :NUMROWS;
            if (NUMROWS <> 0) then
               TIPOORD = 19;
            else
                TIPOORD = 24;

            /* INSERTE O ACTUALICE EL COMPONENTE */
            if (NOT EXISTS (SELECT PLPC_ITEM FROM plan_produccion_cons WHERE PLPD_ID = new.plpr_id AND ARTI_COD = :codcmp)) then
                BEGIN
                select max(plpc_item) from plan_produccion_cons where PLPD_ID = new.plpr_id into :item;
                if (item is null) then
                    item = 0;
                item = item + 1;
                INSERT INTO plan_produccion_cons (PLPD_ID, PLPC_ITEM, PLPC_CODBAR, ARTI_COD, PLPC_CANT, PLPC_UNIDAD, PLPC_EXIST, PLPC_ORDENAR, PLPC_ORDENTIPO, PLPC_ORDENID, PLPC_ANULADO, PLPC_TRANSMIT, PLPC_DESC, PLPC_BASE)
                    VALUES (new.plpr_id, :item, :codcmp, :codcmp, :cantcmp, :undcmp, 0, 0, :tipoord, 0, 'N', 'N', :descr, :BASE);
                END
            ELSE
                UPDATE plan_produccion_cons SET PLPC_CANT = PLPC_CANT + :cantcmp
                    WHERE PLPD_ID = NEW.plpr_id AND ARTI_COD = :codcmp;
            END
        end
    end
end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER PLAN_PRODUCCION_DET_AU FOR PLAN_PRODUCCION_DET
ACTIVE AFTER UPDATE POSITION 0
as
declare variable descr VARCHAR(60);
declare variable MERMA NUMERIC(18,4);
declare variable PESOCMP NUMERIC(18,4);
declare variable TOTAL FLOAT;
declare variable FACTOR FLOAT;
declare variable CODCMP VARCHAR(20);
declare variable CANTPRO NUMERIC(18,4);
declare variable CANTCMP NUMERIC(18,4);
declare variable CANTSOB NUMERIC(18,4);
declare variable UNDCMP VARCHAR(8);
declare variable PORCMP FLOAT;
declare variable entrada CHAR(1);
declare variable i integer;
declare variable sobrante varchar(15);
declare variable porsob numeric(9,4);
declare variable REUSO CHAR(1);
declare variable ITEM INTEGER;
declare variable NUMROWS INTEGER;
declare variable TIPOORD INTEGER;
declare variable totcant numeric(18,4);
declare variable Pref varchar(4);
declare variable Num varchar(6);
declare variable BodDes varchar(2);
declare variable Fec Date;
declare variable SOBTOT CHAR(1);
declare variable base char(1);
BEGIN
if ((OLD.plpd_transmit <> NEW.plpd_transmit) AND (NEW.plpd_transmit = 'N')) then
    BEGIN
    totcant = 0;
    CANTPRO = NEW.plpd_cant * NEW.plpd_factor;
    select plpr_fecfin, plpr_pref, plpr_numero, plpr_entrada, plpr_boddes from plan_produccion
        where plpr_id = new.plpr_id into :fec, :Pref, :Num, :entrada, :boddes;
    if (entrada = 'S') then
        begin
        i = 0;
        select arti_sobrante, arti_porcsobr, ARTI_REUSOB, ARTI_SOBTOT from articulo
            where arti_cod = new.arti_cod into :sobrante, :porsob, :reuso, :sobtot;

        select sum(arpr_porc) from articulos_producto where arti_cod = new.arti_cod into :total;
        FOR SELECT arpr_comp, ARPR_CANT, ARPR_UNIDAD, ARPR_PORC, ARTI_DES, arti_peso, arpr_merma
            from articulos_producto AP, ARTICULO A2
            WHERE AP.arpr_comp = A2.arti_cod AND AP.arti_cod = new.arti_cod ORDER by ARPR_ITEM
            INTO :codcmp, :cantcmp, :undcmp, :porcmp, :descr, :pesocmp, :MERMA
            DO
            BEGIN
            EXECUTE PROCEDURE factor_unidad_cant(:codcmp, :undcmp) returning_values (:FACTOR);
            if (((cantcmp is null) or (cantcmp = 0)) AND (PORCMP IS NOT NULL) AND (porcmp <> 0)) then
                BEGIN
                cantcmp = NEW.plpd_cant * NEW.plpd_factor * NEW.plpd_peso / TOTAL * PORCMP; /* APLICA LA PROPORCION */
                if ((MERMA IS NOT NULL) AND (MERMA <> 0)) then
                    cantcmp = cantcmp * (100 + MERMA) / 100;
                if ((sobrante <> '') and (porsob <> 0) and (sobrante = codcmp)) then
                    begin
                    cantsob = cantpro * new.plpd_peso;
                    cantsob = cantsob / TOTAL * porsob; /* APLICA LA PROPORCION */
                    cantcmp = cantcmp + cantsob;
                    end
                totcant = totcant + cantcmp;
                END
            ELSE
                BEGIN
                cantcmp = cantcmp * FACTOR * pesocmp * NEW.plpd_cant * NEW.plpd_factor;
                if (SOBTOT = 'S') then
                    totcant = totcant + cantcmp;
                END
            END

        /* ingrese el sobrante */
        if (NEW.plpd_transmit = 'N') then
          if ((sobrante <> '') and (porsob <> 0) AND (REUSO = 'N')) then
              begin
              select arti_peso from articulo where arti_cod = :sobrante into :pesocmp;
              INSERT INTO MOVIMIENTO_ARTICULO
                (ARTI_COD, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM, TERC_NIT)
                VALUES(:sobrante, :boddes, :FEC, 27, new.plpr_id, 'SOBRANTE PLAN PRODUCCION ' || :PREF || :num || ' ARTICULO:' || new.arti_cod,
                (:porsob * :totcant /100)/:pesocmp, 0, 'S', null, :Pref, :Num, 0, null);
              end
        end
    END
ELSE
  BEGIN
  if ((OLD.plpr_id <> 0) and (OLD.plpd_anulado = 'N')) then
    BEGIN
    FOR SELECT arpr_comp, ARPR_CANT
        from plan_produccion_productos where plpr_id = old.plpr_id and plpd_item = old.plpd_item
        INTO :codcmp, :cantcmp
        DO
        BEGIN
        /* INSERTE O ACTUALICE EL COMPONENTE */
        UPDATE plan_produccion_cons SET PLPC_CANT = PLPC_CANT - :cantcmp
            WHERE PLPD_ID = OLD.plpr_id AND ARTI_COD = :codcmp;
        END
    DELETE FROM plan_produccion_productos where plpr_id = old.plpr_id and plpd_item = old.plpd_item;
    select arti_sobrante from articulo where arti_cod = OLD.arti_cod into :sobrante;
    DELETE FROM movimiento_articulo M WHERE M.mvar_tipodoc = 27 AND M.mvar_idref = OLD.plpr_id AND MVAR_ITEM = 0 AND ARTI_COD = :sobrante;
    END

  if ((NEW.plpr_id <> 0) and (new.plpd_anulado = 'N')) then
    BEGIN
    totcant = 0;
    CANTPRO = NEW.plpd_cant * NEW.plpd_factor;
    select plpr_fecfin, plpr_pref, plpr_numero, plpr_entrada, plpr_boddes from plan_produccion
        where plpr_id = new.plpr_id into :fec, :Pref, :Num, :entrada, :boddes;
    if (entrada = 'S') then
        begin
        i = 0;
        select arti_sobrante, arti_porcsobr, ARTI_REUSOB, ARTI_SOBTOT from articulo
            where arti_cod = new.arti_cod into :sobrante, :porsob, :reuso, :sobtot;

        select sum(arpr_porc) from articulos_producto where arti_cod = new.arti_cod into :total;
        FOR SELECT arpr_comp, ARPR_CANT, ARPR_UNIDAD, ARPR_PORC, ARTI_DES, arti_peso, arpr_merma, arpr_base
            from articulos_producto AP, ARTICULO A2
            WHERE AP.arpr_comp = A2.arti_cod AND AP.arti_cod = new.arti_cod ORDER by ARPR_ITEM
            INTO :codcmp, :cantcmp, :undcmp, :porcmp, :descr, :pesocmp, :MERMA, :BASE
            DO
            BEGIN
            EXECUTE PROCEDURE factor_unidad_cant(:codcmp, :undcmp) returning_values (:FACTOR);
            if (((cantcmp is null) or (cantcmp = 0)) AND (PORCMP IS NOT NULL) AND (porcmp <> 0)) then
                BEGIN
                cantcmp = NEW.plpd_cant * NEW.plpd_factor * NEW.plpd_peso / TOTAL * PORCMP; /* APLICA LA PROPORCION */
                if ((MERMA IS NOT NULL) AND (MERMA <> 0)) then
                    cantcmp = cantcmp * (100 + MERMA) / 100;
                if ((sobrante <> '') and (porsob <> 0) and (sobrante = codcmp) and (reuso = 'N')) then
                    begin
                    cantsob = cantpro * new.plpd_peso;
                    cantsob = cantsob / TOTAL * porsob; /* APLICA LA PROPORCION */
                    cantcmp = cantcmp + cantsob;
                    end
                totcant = totcant + cantcmp;
                END
            ELSE
                BEGIN
                cantcmp = cantcmp * FACTOR * pesocmp * NEW.plpd_cant * NEW.plpd_factor;
                if (SOBTOT = 'S') then
                    totcant = totcant + cantcmp;
                END

            i = i + 1;
            insert into plan_produccion_productos (plpr_id, plpd_item, plpp_nrocmop, arpr_comp, arpr_cant, arpr_porc, arpr_unidad, arpr_merma, arti_peso, arpr_base)
                values(new.plpr_id, new.plpd_item, :i, :codcmp,  :cantcmp, :porcmp, :undcmp, :merma, :pesocmp, :base);

            SELECT COUNT(ARTI_COD) FROM articulos_producto WHERE ARTI_COD = :codcmp INTO :NUMROWS;
            if (NUMROWS <> 0) then
               TIPOORD = 19;
            else
                TIPOORD = 24;

            /* INSERTE O ACTUALICE EL COMPONENTE */
            if (NOT EXISTS (SELECT PLPC_ITEM FROM plan_produccion_cons WHERE PLPD_ID = new.plpr_id AND ARTI_COD = :codcmp)) then
                BEGIN
                select max(plpc_item) from plan_produccion_cons where PLPD_ID = new.plpr_id into :item;
                item = item + 1;
                INSERT INTO plan_produccion_cons (PLPD_ID, PLPC_ITEM, PLPC_CODBAR, ARTI_COD, PLPC_CANT, PLPC_UNIDAD, PLPC_EXIST, PLPC_ORDENAR, PLPC_ORDENTIPO, PLPC_ORDENID, PLPC_ANULADO, PLPC_TRANSMIT, PLPC_DESC, PLPC_BASE)
                    VALUES (new.plpr_id, :item, :codcmp, :codcmp, :cantcmp, :undcmp, 0, 0, :tipoord, 0, 'N', 'N', :descr, :BASE);
                END
            ELSE
                UPDATE plan_produccion_cons SET PLPC_CANT = PLPC_CANT + :cantcmp
                    WHERE PLPD_ID = NEW.plpr_id AND ARTI_COD = :codcmp;
            END
        end
    end
  END
end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure IMPR_PLANPROD_CONS (
    ID integer)
returns (
    ITEM integer,
    ARTICULO varchar(15),
    CODBAR varchar(15),
    ARTIDES varchar(60),
    CANT numeric(18,4),
    UNIDAD varchar(8),
    EXISTEN numeric(18,4),
    ORDENADO numeric(18,4),
    OBSITEM blob sub_type 0 segment size 80,
    CODCOMP varchar(20),
    DESCOMP varchar(60),
    CANTCOMP numeric(18,4),
    UNICOMP varchar(8))
AS
declare variable CODPROD VARCHAR(20);
declare variable IDENSA INTEGER;
BEGIN
FOR SELECT PLPC_ITEM, ARTI_COD, PLPC_CODBAR, PLPC_DESC, PLPC_CANT, PLPC_UNIDAD, PLPC_EXIST, PLPC_ORDENAR, PLPC_OBS
    FROM plan_produccion_cons WHERE PLPD_ID = :ID AND PLPC_BASE = 'N'
    ORDER BY PLPC_ITEM
    INTO :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :existen, :ordenado, :OBSITEM
    DO
      BEGIN
      codcomp = '';
      descomp = '';
      cantcomp = 0;
      unicomp = '';
      SUSPEND;
      CODPROD = ARTICULO;
      for select arpr_comp, arti_des, arpr_cant, arpr_unidad
        from plan_produccion_cons_prod P, ARTICULO A
        where P.arpr_comp = A.arti_cod AND p.plpd_id = :id AND P.plpc_item = :item ORDER BY P.plcp_nrocomp
        into :codcomp, :descomp, :cantcomp, :unicomp
        DO
        BEGIN
        ARTICULO = '';
        CODBAR = '';
        ARTIDES = '';
        CANT = 0;
        UNIDAD = '';
        EXISTEN = 0;
        ORDENADO = 0;
        OBSITEM = '';
        SUSPEND;
        END
      /* TRAIGA LOS SUBENSAMBLES ASOCIADOS AL PLAN */
      FOR SELECT ENSA_ID FROM ENSAMBLES
        WHERE ARTI_COD = :CODPROD AND ENSA_TIPOREF = 27 AND ENSA_IDREF = :ID
        INTO :IDENSA
        DO
        BEGIN
        FOR SELECT E.ARTI_COD, ENSA_DESC, D.ARTI_COD, ESDE_DESC, ESDE_CANT, ESDE_UNIDAD
            FROM ENSAMBLES E, ENSAMBLES_DETALLE D
            WHERE E.ensa_id = D.ensa_id AND E.ENSA_TIPOREF = 15 AND E.ENSA_IDREF = :IDENSA
                INTO :ARTICULO, :ARTIDES, :CODCOMP, descomp, :cantcomp, :unicomp
                DO
                SUSPEND;
        END
      END
END
^

SET TERM ; ^
SET TERM ^ ;

CREATE OR ALTER procedure IMPR_PLANPROD (
    ID integer)
returns (
    PREF varchar(4),
    NUMERO varchar(6),
    FECHA date,
    FECFIN date,
    CONCEPTO varchar(60),
    RESPONSABLE varchar(60),
    OBS blob sub_type 0 segment size 80,
    ITEM integer,
    ARTICULO varchar(15),
    CODBAR varchar(15),
    ARTIDES varchar(60),
    CANT numeric(18,4),
    UNIDAD varchar(8),
    MERMA numeric(18,4),
    PESO numeric(18,4),
    OBSITEM blob sub_type 0 segment size 80,
    CODCOMP varchar(20),
    DESCOMP varchar(60),
    CANTCOMP numeric(18,4),
    UNICOMP varchar(8))
AS
declare variable CODPROD varchar(20);
declare variable PORC float;
declare variable MERMAC numeric(18,4);
declare variable PESOPRO numeric(18,4);
declare variable PESOCMP numeric(18,4);
declare variable TOTAL float;
declare variable CANTPRO numeric(18,4);
declare variable CANTSOB numeric(18,4);
declare variable FACTOR float;
declare variable sobrante varchar(15);
declare variable porsob numeric(9,4);
declare variable BASE varchar(20);
declare variable BASEANT varchar(20);
declare variable ITEMAUX integer;
declare variable ARTICULOAUX varchar(20);
declare variable CODBARAUX varchar(20);
declare variable ARTIDESAUX varchar(60);
declare variable CANTAUX numeric(18,4);
declare variable UNIDADAUX varchar(8);
declare variable PESOAUX numeric(18,4);
declare variable OBSITEAUX varchar(1024);
begin
BASEANT = '';
select PLPR_PREF, PLPR_NUMERO, PLPR_FECINI, PLPR_FECFIN, PLPR_CONC, PLPR_RESPONSABLE, PLPR_OBS
    from plan_produccion O where PLPR_ID = :ID into
    :PREF, :NUMERO, :FECHA,
    :FECFIN, :CONCEPTO, :RESPONSABLE, :OBS;
for select PLPD_ITEM, p.ARTI_COD, PLPD_CODBAR, PLPD_DESC, PLPD_CANT, PLPD_UNIDAD, PLPD_PESO, PLPD_OBS, arti_sobrante, arti_porcsobr
    from plan_produccion_det p, articulo a where a.arti_cod = p.arti_cod and PLPR_ID = :ID
    order by PLPD_ITEM
    into :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :PESO, :OBSITEM, :sobrante, :porsob
    do
    begin
    /* DETECTE SI HAY UNA BASE EN LA FORMULA */
    BASE = NULL;
    select first 1 arpr_comp from plan_produccion_productos
        where plpr_id = :id and plpd_item = :item and arpr_base = 'S' into :BASE;
    if (BASE IS NOT NULL) then
        begin
        if (BASE <> BASEANT) then
            begin
            BASEANT = BASE;
            /* GUARDE LOS VALORES */
            ITEMAUX = ITEM;
            ARTICULOAUX = ARTICULO;
            CODBARAUX = CODBAR;
            ARTIDESAUX = ARTIDES;
            CANTAUX = CANT;
            UNIDADAUX = UNIDAD;
            PESOAUX = PESO;
            OBSITEAUX = OBSITEM;

            /* ES UNA NUEVA BASE, HAGA LA IMPRESION DE LA BASE */
            for select PLPC_ITEM, ARTI_COD, PLPC_CODBAR, PLPC_DESC, PLPC_CANT, PLPC_UNIDAD, 0, ''
                from plan_produccion_cons where PLPD_ID = :ID and ARTI_COD = :BASE
                order by PLPC_ITEM
                into :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :peso, :obsitem
                do
                begin
                codcomp = '';
                descomp = '';
                cantcomp = 0;
                unicomp = '';
                suspend;
                CODPROD = ARTICULO;
                for select arpr_comp, arti_des, arpr_cant, arpr_unidad, 0, 0, 0
                    from plan_produccion_cons_prod P, ARTICULO A
                    where P.arpr_comp = A.arti_cod and p.plpd_id = :id and P.plpc_item = :item order by P.plcp_nrocomp
                    into :codcomp, :descomp, :cantcomp, :unicomp, :porc, :mermac, :pesocmp
                    do
                    begin
                    ARTICULO = '';
                    CODBAR = '';
                    ARTIDES = '';
                    CANT = 0;
                    UNIDAD = '';
                    OBSITEM = '';
                    suspend;
                    end
                end
            /* RESTAURE LOS VALORES */
            ITEM = ITEMAUX;
            ARTICULO = ARTICULOAUX;
            CODBAR = CODBARAUX;
            ARTIDES = ARTIDESAUX;
            CANT = CANTAUX;
            UNIDAD = UNIDADAUX;
            PESO = PESOAUX;
            OBSITEM = OBSITEAUX;
            end
        end
    /* ENSAMBLE DIRECTO O BASE YA IMPRESA */
    codcomp = '';
    descomp = '';
    cantcomp = 0;
    unicomp = '';
    suspend;
    for select arpr_comp, arti_des, arpr_cant, arpr_unidad
        from plan_produccion_productos P, ARTICULO A
        where p.plpr_id = :id and p.plpd_item = :item and P.arpr_comp = A.arti_cod
        into :codcomp, :descomp, :cantcomp, :unicomp
        DO
        BEGIN
        ARTICULO = '';
        CODBAR = '';
        ARTIDES = '';
        CANT = 0;
        UNIDAD = '';
        MERMA = 0;
        PESO = 0;
        OBSITEM = '';
        if ((sobrante <> '') and (porsob <> 0) and (sobrante = codcomp)) then
            begin
            merma = CANTCOMP / (100 + PORSOB) * PORSOB;
            end
        suspend;
        end
   end
/* ahora los ensambles que no son base */
ARTICULO = '** RELLENOS **';
CODBAR = '';
ARTIDES = '** RELLENOS **';
CANT = 0;
UNIDAD = '';
MERMA = 0;
PESO = 0;
OBSITEM = '';
codcomp = '';
descomp = '';
cantcomp = 0;
unicomp = '';
SUSPEND;
FOR SELECT PLPC_ITEM, ARTI_COD, PLPC_CODBAR, PLPC_DESC, PLPC_CANT, PLPC_UNIDAD, PLPC_OBS
    FROM plan_produccion_cons WHERE PLPD_ID = :ID AND PLPC_BASE = 'N'
    ORDER BY PLPC_ITEM
    INTO :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :OBSITEM
    DO
      BEGIN
      codcomp = '';
      descomp = '';
      cantcomp = 0;
      unicomp = '';
      SUSPEND;
      CODPROD = ARTICULO;
      for select arpr_comp, arti_des, arpr_cant, arpr_unidad
        from plan_produccion_cons_prod P, ARTICULO A
        where P.arpr_comp = A.arti_cod AND p.plpd_id = :id AND P.plpc_item = :item ORDER BY P.plcp_nrocomp
        into :codcomp, :descomp, :cantcomp, :unicomp
        DO
        BEGIN
        ARTICULO = '';
        CODBAR = '';
        ARTIDES = '';
        CANT = 0;
        UNIDAD = '';
        OBSITEM = '';
        SUSPEND;
        END
      /* TRAIGA LOS SUBENSAMBLES ASOCIADOS AL PLAN
      FOR SELECT ENSA_ID FROM ENSAMBLES
        WHERE ARTI_COD = :CODPROD AND ENSA_TIPOREF = 27 AND ENSA_IDREF = :ID
        INTO :IDENSA
        DO
        BEGIN
        FOR SELECT E.ARTI_COD, ENSA_DESC, D.ARTI_COD, ESDE_DESC, ESDE_CANT, ESDE_UNIDAD
            FROM ENSAMBLES E, ENSAMBLES_DETALLE D
            WHERE E.ensa_id = D.ensa_id AND E.ENSA_TIPOREF = 15 AND E.ENSA_IDREF = :IDENSA
                INTO :ARTICULO, :ARTIDES, :CODCOMP, descomp, :cantcomp, :unicomp
                DO
                SUSPEND;
        END */
      END
end
^

SET TERM ; ^


/* 20100927 */
/* cotizacion con precios minimos como el ultimo costo mas un porcentaje configurable */
INSERT INTO CONFIGURACION (CONF_MODULO, CONF_CATEGORIA, CONF_PROPIEDAD, CONF_VALOR, CONF_POSIBLES, CONF_AYUDA) VALUES ('FACTURACION', 'COTIZACIONES', 'PORCENTAJE MINIMO DE UTILIDAD EN COTIZACION AUTOMATICA', '0', '', 'Si se indica un porcentaje diferente de cero se traerán los precios de venta como el costo más el porcentaje de utilidad indicado en la cotización con precios mínimos');
commit work;

/* 20101001 */
/* cuenta por cobrar por prestamos de nómina */
INSERT INTO CONFIGURACION (CONF_MODULO, CONF_CATEGORIA, CONF_PROPIEDAD, CONF_VALOR, CONF_POSIBLES, CONF_AYUDA) VALUES ('NOMINA', 'PAGOS', 'CUENTA POR COBRAR POR PRESTAMOS A EMPLEADOS', '', '', 'Indique el código de la cuenta contable donde se llevarán los prestamos a empleados');
commit work;

SET TERM ^ ;

CREATE OR ALTER procedure CONTABIL_EGRESO (
    IDDOC integer,
    IDINTER integer)
returns (
    ERROR integer,
    VER char(1),
    IDC integer)
AS
declare variable PREF VARCHAR(4);
declare variable NUM VARCHAR(6);
declare variable FECAUX DATE;
declare variable FECHA CHAR(8);
declare variable CONC CHAR(120);
declare variable VRDTO NUMERIC(18, 2);
declare variable VRRTFTE NUMERIC(18, 2);
declare variable VRRTIVA NUMERIC(18, 2);
declare variable VRRTICA NUMERIC(18, 2);
declare variable VRTOTAL NUMERIC(18, 2);
declare variable TIPOCOMP VARCHAR(3);
declare variable PREFCONT VARCHAR(4);
declare variable BASE CHAR(1);
declare variable CTABASE VARCHAR(20);
declare variable CAJA CHAR(1);
declare variable CTACAJA VARCHAR(20);
declare variable RTFTE CHAR(1);
declare variable CTARTFTE VARCHAR(20);
declare variable RTIVA CHAR(1);
declare variable CTARTIVA VARCHAR(20);
declare variable RTICA CHAR(1);
declare variable CTARTICA VARCHAR(20);
declare variable DTO CHAR(1);
declare variable CTADTO VARCHAR(20);
declare variable EXISTE CHAR(1);
declare variable CUENTA VARCHAR(20);
declare variable MONTO NUMERIC(18,2);
declare variable ES_RETENCION CHAR(1);
declare variable TIPOCUEN CHAR(1);
declare variable NIT VARCHAR(20);
declare variable PROY VARCHAR(4);
declare variable CENTRO VARCHAR(4);
declare variable MONTOBASE NUMERIC(18,2);
declare variable PORC NUMERIC(9,2);
declare variable DEBITO NUMERIC(18,2);
declare variable CREDITO NUMERIC(18,2);
declare variable NROI INTEGER;
declare variable SUMA NUMERIC(18,2);
declare variable TCTACLIEN VARCHAR(20);
declare variable TCTARTFTE VARCHAR(20);
declare variable TCTARTIVA VARCHAR(20);
declare variable TCTARTICA VARCHAR(20);
declare variable TCTACART VARCHAR(20);
declare variable TIPOIT INTEGER;
declare variable IDIT INTEGER;
declare variable PREFIT VARCHAR(4);
declare variable NUMIT VARCHAR(6);
declare variable NUMEROIT VARCHAR(10);
declare variable ABONOIT NUMERIC(18,2);
declare variable CTADIC VARCHAR(20);
declare variable BASEADIC VARCHAR(20);
declare variable PORCADIC NUMERIC(5,2);
declare variable VALORADIC NUMERIC(18,2);
declare variable DBADIC CHAR(1);
declare variable VRBASE NUMERIC(18,2);
declare variable GMF CHAR(1);
declare variable CODBCO INTEGER;
declare variable NUMCHEQ VARCHAR(20);
declare variable CRUCES NUMERIC(18,2);
declare variable VRCAJA NUMERIC(18,2);
declare variable OK INTEGER;
declare variable DIFCAMBIO NUMERIC(18,2);
declare variable CTADIF VARCHAR(20);
declare variable RTFTEC NUMERIC(18,2);
declare variable RTIVAC NUMERIC(18,2);
declare variable RTICAC NUMERIC(18,2);
declare variable RTFTER CHAR(1);
declare variable CTARTFTER VARCHAR(20);
declare variable RTIVAR CHAR(1);
declare variable CTARTIVAR VARCHAR(20);
declare variable RTICAR CHAR(1);
declare variable CTARTICAR VARCHAR(20);
declare variable RET CHAR(2);
declare variable RTIT NUMERIC(18,2);
declare variable NITBCO VARCHAR(20);
declare variable NUMPROV CHAR(8);
declare variable TIPO INTEGER;
BEGIN
/* BUSQUE LA INTERFACE */
EXISTE = 'N';
SELECT 'S', TICO_COD, PRCO_PRE, INCJ_BASE, INCJ_DTOPP, INCJ_RTFTE, INCJ_RTIVA, INCJ_RTICA, INCJ_CAJA, INCJ_CTABASE, INCJ_CTADTO, INCJ_CTARTFTE, INCJ_CTARTIVA, INCJ_CTARTICA, INCJ_CTACAJA, INCJ_CONFIRMAR
    FROM INTERFAZ_CAJA
    WHERE INCJ_ID = :IDINTER
    INTO :EXISTE, :TIPOCOMP, :PREFCONT, :BASE, :DTO, :RTFTE, :RTIVA, :RTICA, :CAJA, :CTABASE, :CTADTO, :CTARTFTE, :CTARTIVA, :CTARTICA, :CTACAJA, :VER;
if (EXISTE = 'S') then
    BEGIN
    OK = 0;
    FOR SELECT CNTB_ID FROM CONTABILIZACION WHERE CNTB_TIPOREF = 62 AND CNTB_IDREF = :IDDOC INTO :OK DO
        BEGIN
        DELETE FROM CONTABILIZACION_DET WHERE CNTB_ID = :OK;
        DELETE FROM CONTABILIZACION WHERE CNTB_ID = :OK;
        END

    /* TRAIGA EL ENCABEZADO DEL EGRESO */
    SELECT PREF_PRE, EGRE_NUMERO, EGRE_FECHA, E.TERC_NIT, EGRE_CONC, EGRE_DTOF, EGRE_MONTO, EGRE_RTFTEMONTO, EGRE_RTIVAMONTO, EGRE_RTICAMONTO,
        TERC_CTARTFTE, TERC_CTARTIVA, TERC_CTARTICA, TERC_CTACLIENTE, EGRE_TIPO
        FROM EGRESOS E, TERCEROS T
        WHERE EGRE_ID = :IDDOC AND E.TERC_NIT = T.TERC_NIT
        INTO :PREF, :NUM, :FECAUX, :NIT, :CONC, :VRDTO, :VRTOTAL, :VRRTFTE, :VRRTIVA, :VRRTICA,
        :TCTARTFTE, TCTARTIVA, TCTARTICA, TCTACLIEN, :TIPO;
    /* SI ES PROVEEDOR, SOBREESCIBE LAS CUENTAS  */
    SELECT PROV_CTAPAGAR, PROV_CTARTFTE, PROV_CTARTIVA, PROV_CTARTICA
        FROM PROVEEDORES WHERE TERC_NIT = :NIT
        INTO TCTACLIEN, TCTARTFTE, TCTARTIVA, TCTARTICA;
    SELECT PREF_CENTRO, PREF_PROY FROM PREFIJOS
        WHERE PREF_PRE = :PREF AND TIDO_COD = 62 INTO :CENTRO, :PROY;
    EXECUTE PROCEDURE FECHA_A_CONTA(:FECAUX) returning_values (:FECHA);
    /* REGISTRE EL ENCABEZADO CONTABLE */
    IDC = GEN_ID(ID_CONTABILIZA, 1);
    INSERT INTO CONTABILIZACION (CNTB_ID, CNTB_TIPOCOMP, CNTB_PREFCNT, CNTB_NUMERO, CNTB_FECHA, CNTB_CONCEPTO, CNTB_REF, CNTB_TIPOREF, CNTB_IDREF, CNTB_PREFREF, CNTB_NUMREF, CNTB_PROCESADO)
        VALUES (:IDC, :TIPOCOMP, :PREFCONT, :NUM, :FECHA, :CONC, '', 62, :IDDOC, :PREF, :NUM, 'N');
    /* SUME LOS CRUCES PARA LLEVARLOS A LA CUENTA X PAGAR Y RESTAR DE LA CAJA */
    SELECT SUM(EGCC_ABONO) FROM EGRESOS_CRUCEC WHERE EGRE_ID = :iddoc INTO :CRUCES;
    if (CRUCES IS NULL) then
        CRUCES = 0;
    VRCAJA = VRTOTAL;
    NROI = 0;
    SUMA = 0;
    ERROR = 0;
    /* EL CREDITO EN LA CAJA O EL BANCO */
    IF ((CAJA = 'K')) THEN
        BEGIN
        if (VRCAJA <> 0) then
            BEGIN
            CUENTA = NULL;
            EXECUTE PROCEDURE VALIDE_CUENTA_C (CTACAJA) RETURNING_VALUES (:OK);
            IF (OK = 0) THEN
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :CTACAJA INTO :CUENTA, :TIPOCUEN;
            ELSE
                begin
                EXECUTE PROCEDURE ERROR (62, :IDDOC, :CTACAJA, 2);
                CUENTA = CTACAJA;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 4);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRCAJA, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - VRCAJA;
                END
            END /* VRCAJA <> 0 */
        END /* CAJA CONSTANTE */
    IF ((CAJA = 'F')) THEN
        BEGIN
        /* mueva la cuenta de la caja o el banco o ambas */
        /* PRIMERO LA CAJA */
        FOR SELECT CAJA_CUENTA, EGCA_MONTO FROM EGRESOS_CAJA E, CAJAS C
            WHERE C.CAJA_ID = E.CAJA_ID AND EGRE_ID = :IDDOC
            INTO :CTACAJA, :MONTO
            DO
            BEGIN
            if (MONTO <> 0) then
                BEGIN
                CUENTA = NULL;
                EXECUTE PROCEDURE VALIDE_CUENTA_C (CTACAJA) RETURNING_VALUES (:OK);
                IF (OK = 0) THEN
                    SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                        WHERE CUEN_COD = :CTACAJA INTO :CUENTA, :TIPOCUEN;
                ELSE
                    begin
                    EXECUTE PROCEDURE ERROR (62, :IDDOC, :CTACAJA, 2);
                    CUENTA = CTACAJA;
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 4);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA - MONTO;
                    END
                END /* MONTO <> 0 */
            END /* DO CAJA */
        /* AHORA EL BANCO */
        MONTO = 0;
        SELECT CUBA_CTACONTA, EGBC_MONTO, EGBC_GMF, E.CUBA_COD, CUBA_GMFPOR, EGBC_NUMERO, BANC_NIT
            FROM EGRESOS_BANCO E, CUENTAS_BANCO C, BANCOS B
            WHERE E.CUBA_COD = C.CUBA_COD AND EGRE_ID = :IDDOC AND B.banc_cod = C.banc_cod
            INTO :CTACAJA, :MONTO, :GMF, :CODBCO, :PORC, :NUMCHEQ, :nitbco;
        if (MONTO <> 0) then
            BEGIN
            if (MONTO <> 0) then
                BEGIN
                CUENTA = NULL;
                EXECUTE PROCEDURE VALIDE_CUENTA_C (CTACAJA) RETURNING_VALUES (:OK);
                IF (OK = 0) THEN
                    SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                        WHERE CUEN_COD = :CTACAJA INTO :CUENTA, :TIPOCUEN;
                ELSE
                    begin
                    EXECUTE PROCEDURE ERROR (62, :IDDOC, :CTACAJA, 2);
                    CUENTA = CTACAJA;
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 4);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, :NUMCHEQ, 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA - MONTO;
                    END
                /* EL GMF */
                if ((GMF = 'S') AND (PORC <> 0)) then
                    BEGIN
                    if (NITBCO IS NULL) then
                        NITBCO = NIT;
                    EXECUTE procedure REDONDEE(:MONTO * :PORC / 1000, 0) returning_values (MONTO);
                    /* REGISTRE EL GMF EN LA MISMA CUENTA DEL BANCO COMO CREDITO */
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, :NUMCHEQ, 0, :MONTO, 0, 0, :NITBCO, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA - MONTO;

                    /* AHORA LA CUENTA DEL GASTO */
                    SELECT CUBA_CTAGMF FROM CUENTAS_BANCO
                        where CUBA_COD = :CODBCO INTO :CTACAJA;
                    EXECUTE PROCEDURE VALIDE_CUENTA_C (CTACAJA) RETURNING_VALUES (:OK);
                    IF (OK = 0) THEN
                        SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                            WHERE CUEN_COD = :CTACAJA INTO :CUENTA, :TIPOCUEN;
                    ELSE
                        begin
                        EXECUTE PROCEDURE ERROR (62, :IDDOC, :CTACAJA, 2);
                        CUENTA = CTACAJA;
                        TIPOCUEN = 'N';
                        ERROR = ERROR + 1;
                        end
                    if (TIPOCUEN = 'I') then
                        BEGIN
                        EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
                        TIPOCUEN = 'N';
                        ERROR = ERROR + 1;
                        END
                    if (TIPOCUEN = 'C') then
                        BEGIN
                        EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 4);
                        TIPOCUEN = 'N';
                        ERROR = ERROR + 1;
                        END
                    if (TIPOCUEN = 'N') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, :NUMCHEQ, :MONTO, 0, 0, 0, :NITBCO, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NROI = NROI + 1;
                        SUMA = SUMA + MONTO;
                        END
                    END /* GMF */
                END /* MONTO <> 0 */
            END /* EGRESO_BANCO */
        END /* CAJA = F */

    /* SI ES PRESTAMO DE NOMINA CONTABILICE LA CONTRAPARTIDA */
    if (TIPO = 4) then
        BEGIN
        EXECUTE PROCEDURE lee_configuracion('NOMINA', 'PAGOS', 'CUENTA POR COBRAR POR PRESTAMOS A EMPLEADOS') returning_values (:tctacart);
        CUENTA = NULL;
        EXECUTE PROCEDURE VALIDE_CUENTA_C (tctacart) RETURNING_VALUES (:OK);
        IF (OK = 0) THEN
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :tctacart INTO :CUENTA, :TIPOCUEN;
        ELSE
            begin
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :tctacart, 2);
            CUENTA = tctacart;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRTOTAL, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            SUMA = SUMA + VRTOTAL;
            NROI = NROI + 1;
            END
        END
    /* LOS CRUCES CON CUENTAS X COBRAR */
    if (CRUCES <> 0) then
        BEGIN
        SELECT TERC_CTACLIENTE FROM TERCEROS WHERE TERC_NIT = :nit INTO :tctacart;
        if (tctacart IS NULL) then
            tctacart = tctaclien;
        CUENTA = NULL;
        EXECUTE PROCEDURE VALIDE_CUENTA_C (tctacart) RETURNING_VALUES (:OK);
        IF (OK = 0) THEN
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :tctacart INTO :CUENTA, :TIPOCUEN;
        ELSE
            begin
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :tctacart, 2);
            CUENTA = tctacart;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            /* DEBERIA RECORRER DOCUMENTO POR DOCUMENTO */
            FOR SELECT EGCC_TIPODOC, EGCC_PREFIJO, EGCC_NUMERO, EGCC_ABONO+EGCC_RTFTE+EGCC_RTIVA+EGCC_RTICA+EGCC_DTOF
                FROM egresos_crucec WHERE EGRE_ID = :IDDOC
                INTO :TIPOIT, PREFIT, NUMIT, ABONOIT
                DO
                BEGIN
                NUMEROIT = PREFIT || NUMIT;
                if (ABONOIT > 0) then
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :ABONOIT, 0, 0, :NIT, :PROY, :CENTRO, NULL, :NUMEROIT, NULL, NULL, :TIPOIT, 0);
                else
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', abs(:ABONOIT), 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, :NUMEROIT, NULL, NULL, :TIPOIT, 0);
                SUMA = SUMA - ABONOIT;
                NROI = NROI + 1;
                END
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            if (CRUCES > 0) then
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :CRUCES, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            else
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', abs(:CRUCES), 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            SUMA = SUMA - CRUCES;
            NROI = NROI + 1;
            END
        /* LA DIFERENCIA EN CAMBIO */
        SELECT SUM(EGCC_DIFCAMBIO) FROM egresos_crucec WHERE EGRE_ID = :iddoc INTO :DIFCAMBIO;
        IF ((DIFCAMBIO IS NOT NULL) AND (DIFCAMBIO <> 0)) THEN
            BEGIN
            if (DIFCAMBIO > 0) then
                execute procedure lee_configuracion('GENERAL','GENERAL','CUENTA DE INGRESO POR DIFERENCIA EN CAMBIO PARA OPERACIONES EN OTRA MONEDA') returning_values (:ctadif);
            else
                execute procedure lee_configuracion('GENERAL','GENERAL','CUENTA DE GASTO POR DIFERENCIA EN CAMBIO PARA OPERACIONES EN OTRA MONEDA') returning_values (:ctadif);
            CUENTA = NULL;
            EXECUTE PROCEDURE VALIDE_CUENTA_C (ctadif) RETURNING_VALUES (:OK);
            IF (OK = 0) THEN
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :ctadif INTO :CUENTA, :TIPOCUEN;
            ELSE
                begin
                EXECUTE PROCEDURE ERROR (62, :IDDOC, :ctadif, 2);
                CUENTA = ctadif;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 4);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                if (DIFCAMBIO > 0) then
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :difcambio, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                else
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', ABS(:difcambio), 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - difcambio;
                END
            END
        /* RETEFUENTE DEL CRUCE */
        SELECT first 1 INCJ_RTFTE, INCJ_RTIVA, INCJ_RTICA, INCJ_CTARTFTE, INCJ_CTARTIVA, INCJ_CTARTICA
            FROM INTERFAZ_CAJA WHERE tido_cod = 61 into :RTFTER, :RTIVAR, :RTICAR, :CTARTFTER, :CTARTIVAR, :CTARTICAR;
        SELECT SUM(EGCC_RTFTE) FROM egresos_crucec WHERE EGRE_ID = :iddoc INTO :rtftec;
        IF ((rtftec IS NOT NULL) AND (rtftec <> 0)) THEN
            BEGIN
            if ((RTFTER = 'T') or (RTFTER = 'K')) then
                BEGIN
                if (RTFTER = 'T') then
                    SELECT TERC_CTARTFTE FROM TERCEROS WHERE TERC_NIT = :NIT INTO CTARTFTER;
                CUENTA = NULL;
                EXECUTE PROCEDURE VALIDE_CUENTA_C (ctartfter) RETURNING_VALUES (:OK);
                IF (OK = 0) THEN
                    SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                        WHERE CUEN_COD = :ctartfter INTO :CUENTA, :TIPOCUEN;
                ELSE
                    begin
                    EXECUTE PROCEDURE ERROR (62, :IDDOC, :ctartfter, 2);
                    CUENTA = ctartfter;
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 4);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    if (rtftec > 0) then
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :rtftec, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    else
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, abs(:rtftec), 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA + rtftec;
                    END
                END
            END
        /* RETEIVA DEL CRUCE */
        SELECT SUM(EGCC_RTIVA) FROM egresos_crucec WHERE EGRE_ID = :iddoc INTO :rtivac;
        IF ((rtivac IS NOT NULL) AND (rtivac <> 0)) THEN
            BEGIN
            if ((RTIVAR = 'T') or (RTIVAR = 'K')) then
                BEGIN
                if (RTIVAR = 'T') then
                    SELECT TERC_CTARTIVA FROM TERCEROS WHERE TERC_NIT = :NIT INTO CTARTIVAR;
                CUENTA = NULL;
                EXECUTE PROCEDURE VALIDE_CUENTA_C (ctartivar) RETURNING_VALUES (:OK);
                IF (OK = 0) THEN
                    SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                        WHERE CUEN_COD = :ctartivar INTO :CUENTA, :TIPOCUEN;
                ELSE
                    begin
                    EXECUTE PROCEDURE ERROR (62, :IDDOC, :ctartivar, 2);
                    CUENTA = ctartivar;
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 4);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    if (rtivac > 0) then
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :rtivac, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    else
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, abs(:rtivac), 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA + rtivac;
                    END
                END
            END
        /* RETEICA DEL CRUCE */
        SELECT SUM(EGCC_RTICA) FROM egresos_crucec WHERE EGRE_ID = :iddoc INTO :rticac;
        IF ((rticac IS NOT NULL) AND (rtivac <> 0)) THEN
            BEGIN
            if ((RTICAR = 'T') or (RTICAR = 'K')) then
                BEGIN
                if (RTICAR = 'T') then
                    SELECT TERC_CTARTICA FROM TERCEROS WHERE TERC_NIT = :NIT INTO CTARTICAR;
                CUENTA = NULL;
                EXECUTE PROCEDURE VALIDE_CUENTA_C (ctarticar) RETURNING_VALUES (:OK);
                IF (OK = 0) THEN
                    SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                        WHERE CUEN_COD = :ctarticar INTO :CUENTA, :TIPOCUEN;
                ELSE
                    begin
                    EXECUTE PROCEDURE ERROR (62, :IDDOC, :ctarticar, 2);
                    CUENTA = ctarticar;
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 4);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    if (rticac > 0) then
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :rticac, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    else
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, abs(:rticac), 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA + rticac;
                    END
                END
            END
        END /* cruces */

    if (DTO = 'K') then /* DTO EN CTA CONSTANTE */
        BEGIN
        if (VRDTO <> 0) then
            BEGIN
            CUENTA = NULL;
            EXECUTE PROCEDURE VALIDE_CUENTA_C (CTADTO) RETURNING_VALUES (:OK);
            IF (OK = 0) THEN
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :CTADTO INTO :CUENTA, :TIPOCUEN;
            ELSE
                begin
                EXECUTE PROCEDURE ERROR (62, :IDDOC, :CTADTO, 2);
                CUENTA = CTADTO;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 4);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRDTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - VRDTO;
                END
            END /* VRDTO <> 0 */
        END /* DTO EN CTA CONSTANTE */

    /* LA DIFERENCIA EN CAMBIO */
    SELECT SUM(EGDE_DIFCAMBIO) FROM egresos_detalle WHERE EGRE_ID = :iddoc INTO :DIFCAMBIO;
    IF ((DIFCAMBIO IS NOT NULL) AND (DIFCAMBIO <> 0)) THEN
        BEGIN
        if (DIFCAMBIO > 0) then
            execute procedure lee_configuracion('GENERAL','GENERAL','CUENTA DE GASTO POR DIFERENCIA EN CAMBIO PARA OPERACIONES EN OTRA MONEDA') returning_values (:ctadif);
        else
            execute procedure lee_configuracion('GENERAL','GENERAL','CUENTA DE INGRESO POR DIFERENCIA EN CAMBIO PARA OPERACIONES EN OTRA MONEDA') returning_values (:ctadif);
        CUENTA = NULL;
        EXECUTE PROCEDURE VALIDE_CUENTA_C (ctadif) RETURNING_VALUES (:OK);
        IF (OK = 0) THEN
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :ctadif INTO :CUENTA, :TIPOCUEN;
        ELSE
            begin
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :ctadif, 2);
            CUENTA = ctadif;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 4);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            if (DIFCAMBIO > 0) then
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :difcambio, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            else
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, ABS(:difcambio), 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA + difcambio;
            END
        END
    /* RETENCION FUENTE */
    if ((RTFTE = 'T') or (RTFTE = 'K')) then
      if (VRRTFTE <> 0) then
        BEGIN
        if (RTFTE = 'T') then
            CTARTFTE = TCTARTFTE;
        CUENTA = NULL;
        EXECUTE PROCEDURE VALIDE_CUENTA_C (CTARTFTE) RETURNING_VALUES (:OK);
        IF (OK = 0) THEN
            SELECT CUEN_COD, CUEN_RETENCION, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTARTFTE INTO :CUENTA, :ES_RETENCION, :TIPOCUEN;
        ELSE
            begin
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :CTARTFTE, 2);
            CUENTA = CTARTFTE;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 4);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            if (ES_RETENCION = 'S') then
                BEGIN
                VRBASE = (VRTOTAL+VRRTFTE)*-1;
                SELECT PROV_RETEFTE from proveedores where terc_nit = :NIT INTO :PORC;
                END
            ELSE
                BEGIN
                VRBASE = 0;
                PORC = 0;
                END
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, :VRBASE, :PORC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA - VRRTFTE;
            END
        END /* RTFTE */
    /* RETENCION IVA */
    if ((RTIVA = 'T') or (RTIVA = 'K')) then
      if (VRRTIVA <> 0) then
        BEGIN
        if (RTIVA = 'T') then
            CTARTIVA = TCTARTIVA;
        CUENTA = NULL;
        EXECUTE PROCEDURE VALIDE_CUENTA_C (CTARTIVA) RETURNING_VALUES (:OK);
        IF (OK = 0) THEN
            SELECT CUEN_COD, CUEN_RETENCION, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTARTIVA INTO :CUENTA, :ES_RETENCION, :TIPOCUEN;
        ELSE
            begin
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :CTARTIVA, 2);
            CUENTA = CTARTIVA;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 4);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            if (ES_RETENCION = 'S') then
                BEGIN
                VRBASE = VRTOTAL;
                SELECT PROV_RTEIVA from proveedores where terc_nit = :NIT INTO :PORC;
                END
            ELSE
                BEGIN
                VRBASE = 0;
                PORC = 0;
                END
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTIVA, :VRBASE, :PORC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA - VRRTIVA;
            END
        END /* RTIVA */
    /* RETENCION DE ICA */
    if ((RTICA = 'T') or (RTICA = 'K')) then
      if (VRRTICA <> 0) then
        BEGIN
        if (RTICA = 'T') then
            CTARTICA = TCTARTICA;
        CUENTA = NULL;
        EXECUTE PROCEDURE VALIDE_CUENTA_C (CTARTICA) RETURNING_VALUES (:OK);
        IF (OK = 0) THEN
            SELECT CUEN_COD, CUEN_RETENCION, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTARTICA INTO :CUENTA, :ES_RETENCION, :TIPOCUEN;
        ELSE
            begin
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :CTARTICA, 2);
            CUENTA = CTARTICA;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 4);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            if (ES_RETENCION = 'S') then
                BEGIN
                VRBASE = VRTOTAL;
                SELECT PROV_RTEICA from proveedores where terc_nit = :NIT INTO :PORC;
                END
            ELSE
                BEGIN
                VRBASE = 0;
                PORC = 0;
                END
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTICA, :VRBASE, :PORC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA - VRRTICA;
            END
        END /* RTICA */
    /* RECORRA LAS CUENTAS DE EGRESOS_CONTABILIDAD */
    FOR SELECT CUEN_COD, EGCO_NIT, EGCO_PROY, EGCO_CENTRO, EGCO_CONC, EGCO_DEBITOS, EGCO_CREDITOS, EGCO_BASEM, EGCO_PORC
        FROM EGRESOS_CONTABILIDAD WHERE EGRE_ID = :IDDOC ORDER BY EGCO_ITEM
        INTO :CTABASE, :NIT, :PROY, :CENTRO, :CONC, :DEBITO, :CREDITO, :MONTOBASE, :PORC
        DO
        BEGIN
        CUENTA = NULL;
        EXECUTE PROCEDURE VALIDE_CUENTA_C (CTABASE) RETURNING_VALUES (:OK);
        IF (OK = 0) THEN
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTABASE INTO :CUENTA, :TIPOCUEN;
        ELSE
            begin
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :CTABASE, 2);
            CUENTA = CTABASE;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 4);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'N') then
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :DEBITO, :CREDITO, :MONTOBASE, :PORC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
        SUMA = SUMA + DEBITO - CREDITO;
        NROI = NROI + 1;
        END
    /* CIERRE EL COMPROBANTE CONTRA LA CUENTA DEL TERCERO O LA BASE CONSTANTE */
    if (SUMA <> 0) THEN
        BEGIN
        if (SUMA < 0) then
            BEGIN
            DEBITO = SUMA * -1;
            CREDITO = 0;
            END
        ELSE
            BEGIN
            DEBITO = 0;
            CREDITO = SUMA;
            END
        if ((BASE = 'F') or (BASE = 'T') or (BASE = 'K')) then
            BEGIN
            if (BASE = 'T') then
                CTABASE = TCTACLIEN;
            if (BASE = 'F') then
                BEGIN
                SELECT CAJA_CUENTA FROM EGRESOS E, CAJAS C
                    WHERE C.CAJA_ID = E.CAJA_ID AND EGRE_ID = :IDDOC INTO :CTABASE;
                END
            CUENTA = NULL;
            EXECUTE PROCEDURE VALIDE_CUENTA_C (CTABASE) RETURNING_VALUES (:OK);
            IF (OK = 0) THEN
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :CTABASE INTO :CUENTA, :TIPOCUEN;
            ELSE
                begin
                EXECUTE PROCEDURE ERROR (62, :IDDOC, :CTABASE, 2);
                CUENTA = CTABASE;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                /* DEBERIA RECORRER DOCUMENTO POR DOCUMENTO */
                FOR SELECT RCDE_TIPODOC, RCDE_PREFIJO, RCDE_NUMERO, RCDE_ABONO+RCDE_RTFTE+RCDE_RTIVA+RCDE_RTICA+RCDE_DTOF
                    FROM RECIBOS_CAJA_DETALLE WHERE RECA_ID = :IDDOC
                    INTO :TIPOIT, PREFIT, NUMIT, ABONOIT
                    DO
                    BEGIN
                    NUMEROIT = PREFIT || NUMIT;
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :ABONOIT, 0, 0, :NIT, :PROY, :CENTRO, NULL, :NUMEROIT, NULL, NULL, :TIPOIT, 0);
                    NROI = NROI + 1;
                    END
                END
            if (TIPOCUEN = 'N') then
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :DEBITO, :CREDITO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            END /* SUMA EN CARTERA */
        if (BASE = 'D') then
            BEGIN
            execute procedure lee_configuracion('CXPAGAR','SALDOS','DESCONTAR RETENCIONES POR CAUSACION') returning_values (RET);
            CTABASE = NULL;
            NITBCO = NIT; /* LOS DOCUMENTOS PUEDEN ESTAR CAUSADOS A OTRO NIT, GUARDE EL NIT DEL ENCABEZADO */
            FOR SELECT EGDE_TIPODOC, EGDE_IDDOC, EGDE_PREFIJO, EGDE_NUMERO, EGDE_ABONO+EGDE_DTOF, EGDE_RTFTE+EGDE_RTIVA+EGDE_RTICA, EGDE_NUMPROV
                FROM EGRESOS_DETALLE WHERE EGRE_ID = :IDDOC INTO :tipoit, :IDIT, :PREFIT, :NUMIT, :suma, :RTIT, :NUMPROV
                DO
                BEGIN
                if (TIPOIT <> 55) then
                    SELECT FIRST 1 CUEN_COD, D.TERC_NIT, PROY_COD, CENT_COD FROM COMPROBANTE_ENCABEZADO E, COMPROBANTE_DETALLE D
                        WHERE E.enco_consec = D.enco_consec AND E.enco_tiporef = :TIPOIT AND E.enco_idref = :IDIT AND
                        ((SUBSTR(CUEN_COD,1,1) = '2') or (SUBSTR(CUEN_COD,1,2) = '13'))  AND SUBSTR(CUEN_COD,1,3) <> '236' AND SUBSTR(CUEN_COD,1,4) <> '2408'
                        AND ((((:TIPOIT = 21) OR (:TIPOIT = 51)) AND (CODE_CREDITO <> 0)) or (((:TIPOIT = 24) OR (:TIPOIT = 52)) AND (CODE_DEBITO <> 0)))
                        INTO :ctabase, :nit, :proy, :centro;
                else
                    BEGIN
                    execute procedure lee_configuracion('CAJA', 'EGRESOS', 'CUENTA CONTABLE PARA LOS ANTICIPOS A ACREEDORES SI LA INTERFAZ ES POR DOCUMENTO') returning_values (ctabase);
                    if ((ctabase is null) or (ctabase = '')) then
                        BEGIN
                        SELECT GRPR_CTAANTI FROM grupos_proveedores G, proveedores C
                            WHERE C.TERC_NIT = :nit AND C.grpr_cod = G.grpr_cod INTO :ctabase;
                        if ((ctabase is null) or (ctabase = '')) then
                            CTABASE = TCTACLIEN;
                        END
                    END
                if ((ctabase is null) or (ctabase = '')) then
                    CTABASE = TCTACLIEN;
                CUENTA = NULL;
                EXECUTE PROCEDURE VALIDE_CUENTA_C (ctabase) RETURNING_VALUES (:OK);
                IF (OK = 0) THEN
                    SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                        WHERE CUEN_COD = :CTABASE INTO :CUENTA, :TIPOCUEN;
                ELSE
                    begin
                    EXECUTE PROCEDURE ERROR (62, :IDDOC, :CTABASE, 2);
                    CUENTA = CTABASE;
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    end
                if (RET = 'NO') then
                    SUMA = SUMA + RTIT;
                if (SUMA < 0) then
                    BEGIN
                    CREDITO = SUMA * -1;
                    DEBITO = 0;
                    END
                ELSE
                    BEGIN
                    CREDITO = 0;
                    DEBITO = SUMA;
                    END
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    /* DEBERIA RECORRER DOCUMENTO POR DOCUMENTO */
                    NUMEROIT = PREFIT || NUMIT;
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, :NUMPROV, :debito, :credito, 0, 0, :NIT, :PROY, :CENTRO, NULL, :NUMEROIT, NULL, NULL, :TIPOIT, 0);
                    END
                if (TIPOCUEN = 'N') then
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, :NUMPROV, :DEBITO, :CREDITO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                END /* SUMA EN CARTERA */
            NIT = NITBCO; /* RESTAURE EL NIT DEL ENCABEZADO */
            END
        END
    /* recorra las cuentas adicionales */
    FOR SELECT INJC_CUENTA, INJC_BASE, INJC_PORC, INJC_VALOR, INJC_DB
        FROM INTERFAZ_CAJA_CTAS
        WHERE INCJ_ID = :IDINTER
        INTO :CTADIC, :BASEADIC, :PORCADIC, :VALORADIC, :DBADIC
        DO
        BEGIN
        if (:BASEADIC = 'TOTAL') then
            VALORADIC = VRTOTAL;
        if (:BASEADIC = 'DESCUENTO') then
            VALORADIC = VRDTO;
        if (:BASEADIC = 'RTFTE') then
            VALORADIC = VRRTFTE;
        if (:BASEADIC = 'RTIVA') then
            VALORADIC = VRRTIVA;
        if (:BASEADIC = 'RTICA') then
            VALORADIC = VRRTICA;
        MONTO = VALORADIC * PORCADIC;
        CUENTA = NULL;
        EXECUTE PROCEDURE VALIDE_CUENTA_C (CTADIC) RETURNING_VALUES (:OK);
        IF (OK = 0) THEN
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTADIC INTO :CUENTA, :TIPOCUEN;
        ELSE
            begin
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :CTADIC, 2);
            CUENTA = CTADIC;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 4);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            if (DBADIC = 'S') then
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTADIC, :CONC, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            ELSE
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTADIC, :CONC, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            END
        NROI = NROI + 1;
        END
    if (ERROR > 0) then
        VER = 'S';
    SUSPEND;
    END /* EXISTE LA INTERFAZ */
  ELSE
    BEGIN
    EXECUTE PROCEDURE ERROR (62, :IDDOC, :PREF, 1);
    ERROR = ERROR + 1;
    VER = 'S';
    SUSPEND;
    END
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE EGRESOS_SIN_CONTABILIDAD(
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    ID INTEGER,
    IDI INTEGER,
    IDC INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    ESTADO VARCHAR(20),
    ERROR INTEGER)
AS
DECLARE VARIABLE VER CHAR(2);
declare variable FECICNT VARCHAR(10);
declare variable FECFCNT VARCHAR(10);
declare variable idref INTEGER;
BEGIN
EXECUTE PROCEDURE fecha_a_conta(FECINI) returning_values (FECICNT);
EXECUTE PROCEDURE fecha_a_conta(FECFIN) returning_values (FECFCNT);
FOR SELECT EGRE_ID, PREF_PRE, egre_numero FROM EGRESOS WHERE EGRE_ANULADO = 'N' AND PREF_PRE <> 'R004' AND
    EGRE_FECHA >= :FECINI AND EGRE_FECHA <= :FECFIN ORDER BY EGRE_ID INTO :ID, :PREF, :NUMERO
DO
  BEGIN
  idref = null;
  SELECT ENCO_IDREF FROM COMPROBANTE_ENCABEZADO WHERE ENCO_TIPOREF = 62 AND ENCO_FECHA >= :FECICNT AND ENCO_FECHA <= :FECFCNT and ENCO_IDREF = :ID into :idref;
  if (idref IS NULL) then
  begin
   ESTADO = 'PROCESANDO';
   SUSPEND;
   SELECT MAX(INCJ_ID) FROM INTERFAZ_CAJA WHERE PREF_PRE = :PREF AND TIDO_COD = 62 INTO :IDI;
   EXECUTE PROCEDURE CONTABIL_EGRESO (:ID, :IDI) RETURNING_VALUES (:ERROR, :VER, :IDC);
   IF (ERROR = 0) THEN
      BEGIN
      EXECUTE PROCEDURE CONTABILIZA_PENDIENTE (:IDC);
      ESTADO = 'OK';
      END
   ELSE
    ESTADO = 'ERROR';
   suspend;
  end
  END
END

^

SET TERM ; ^


/* 20101003 */
SET TERM ^ ;

CREATE OR ALTER procedure CONCILIA_INVENTARIO (
    FECINI date,
    FECFIN date,
    SOLODIF char(1),
    NULO1 char(1),
    NULO2 char(2))
returns (
    IDF integer,
    TICO VARCHAR(3),
    TIPODOC varchar(20),
    ENTRADAS numeric(18,2),
    SALIDAS numeric(18,2),
    ENTRADASC numeric(18,2),
    SALIDASC numeric(18,2))
AS
declare variable FECINIC char(10);
declare variable FECFINC char(10);
begin
EXECUTE PROCEDURE fecha_a_conta (:FECINI) returning_values (:FECINIC);
EXECUTE PROCEDURE fecha_a_conta (:FECFIN) returning_values (:FECFINC);
FOR SELECT MAX(TIDO_COD), MAX(TIDO_NOMCORTO), SUM(COST_ENTP), SUM(COST_SALP)
    FROM COSTOS C, TIPO_DOCUMENTO T
    WHERE (COST_FECHA >= :FECINI) AND (COST_FECHA <= :FECFIN) AND C.cost_tipo = T.tido_cod GROUP BY COST_TIPO
    INTO :IDF, :TIPODOC, :ENTRADAS, :SALIDAS
    DO
    BEGIN
    if ((IDF >= 11) AND (IDF <= 18)) then
        SELECT MAX(I.tico_cod) FROM interfaz_inventario I WHERE TIDO_COD = :IDF INTO :TICO;
    if ((IDF >= 21) AND (IDF <= 24)) then
        SELECT MAX(I.tico_cod) FROM interfaz_compras I WHERE TIDO_COD = :IDF INTO :TICO;
    if ((IDF >= 31) AND (IDF <= 34)) then
        SELECT MAX(I.tico_cod) FROM interfaz_ventas I WHERE TIDO_COD = :IDF INTO :TICO;
    SELECT SUM(CODE_DEBITO), SUM(CODE_CREDITO)
        FROM COMPROBANTE_ENCABEZADO E, COMPROBANTE_DETALLE D
        WHERE E.ENCO_CONSEC = D.ENCO_CONSEC AND ENCO_FECHA >= :FECINIC AND ENCO_FECHA <= :FECFINC AND
        SUBSTRING(CUEN_COD FROM 1 FOR 2) = '14' AND E.TICO_COD = :TICO
        INTO :ENTRADASC, :SALIDASC;
    if (ENTRADASC IS NULL) then
        ENTRADASC = 0;
    if (SALIDASC IS NULL) then
        SALIDASC = 0;
    if ((SOLODIF <> 'S') or (ENTRADASC <> ENTRADAS) or (SALIDASC <> SALIDAS)) then
        SUSPEND;
    END
end
^

SET TERM ; ^

grant execute on procedure concilia_inventario to public;

INSERT INTO PROCEDIMIENTOS_USUARIO (PRUS_COD, PRUS_NOMBRE, PRUS_SP, PRUS_PARAM1, PRUS_PARAM2, PRUS_PARAM3) VALUES (12, 'Conciliaci{on inventario por tipo de documento', 'CONCILIA_INVENTARIO', 'Sólo diferencias (S/N)', '', '');
commit work;

SET TERM ^ ;

CREATE OR ALTER procedure CONCILIA_INVENTARIO_DET (
    FECINI date,
    FECFIN date,
    TIP INTEGER,
    SOLODIF char(1))
returns (
    FECHA date,
    TIPODOC varchar(10),
    TIPO integer,
    ID integer,
    PREF varchar(4),
    NUMERO varchar(6),
    MONTO numeric(18,2),
    FECCONTA char(10),
    MONTOC numeric(18,2),
    DIFERENCIA numeric(18,2))
AS
begin
TIPO = TIP;
SELECT TIDO_NOMCORTO FROM tipo_documento WHERE TIDO_COD = :TIP INTO :TIPODOC;
FOR SELECT MAX(M.mvar_idref), MAX(M.mvar_pref), MAX(M.mvar_numero), MAX(M.mvar_fecha), SUM(COST_ENTP-COST_SALP)
    FROM COSTOS C, movimiento_articulo m
    WHERE m.mvar_cons = c.cost_idmov and (COST_FECHA >= :FECINI) AND (COST_FECHA <= :FECFIN) AND C.cost_tipo = :tip
    GROUP BY M.mvar_idref INTO :ID, :PREF, :NUMERO, :FECHA, :MONTO
    DO
    BEGIN
    SELECT SUM(CODE_DEBITO-CODE_CREDITO), MAX(ENCO_FECHA)
        FROM COMPROBANTE_ENCABEZADO E, COMPROBANTE_DETALLE D
        WHERE E.ENCO_CONSEC = D.ENCO_CONSEC AND E.enco_tiporef = :TIP AND E.enco_idref = :ID AND SUBSTRING(CUEN_COD FROM 1 FOR 2) = '14'
        INTO :MONTOC, :FECCONTA;
    if (MONTOC IS NULL) then
        MONTOC = 0;
    DIFERENCIA = MONTO - MONTOC;
    if ((SOLODIF <> 'S') or (MONTOC <> MONTO)) then
        SUSPEND;
    END
end
^

SET TERM ; ^

grant execute on procedure concilia_inventario_det to public;


/* 20101003A NO SE HABIA INCLUIDO POR ERROR */

ALTER TABLE CLIENTES
ADD CLIE_INSTCARTERA VARCHAR(255);
ALTER TABLE CLIENTES
ADD CLIE_RESALTAR T_BOOLEANO;
ALTER TABLE CLIENTES
ADD CLIE_MAILCART VARCHAR(100);

UPDATE CLIENTES SET CLIE_RESALTAR = 'N';
COMMIT WORK;

SET TERM ^ ;

CREATE OR ALTER procedure CORREOS_TERCERO (
    NIT varchar(20),
    CARTERA char(1))
returns (
    EMAIL varchar(100))
AS
begin
if (CARTERA = 'S') then
    BEGIN
    SELECT CLIE_MAILCART FROM CLIENTES WHERE TERC_NIT = :NIT INTO :EMAIL;
    if ((EMAIL IS NOT NULL) AND (EMAIL <> '')) then
        suspend;
    END
SELECT TERC_EMAIL FROM TERCEROS WHERE TERC_NIT = :NIT INTO :EMAIL;
if ((EMAIL IS NOT NULL) AND (EMAIL <> '')) then
    suspend;
FOR SELECT TECC_EMAIL FROM terceros_contactos WHERE TERC_NIT = :NIT INTO :email
    DO
    if ((EMAIL IS NOT NULL) AND (EMAIL <> '')) then
        SUSPEND;
end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure REP_CARTERA_CLIENTES (
    DESDE varchar(20),
    HASTA varchar(20),
    GRPINI varchar(5),
    GRPFIN varchar(5),
    FECHA date,
    ORDEN char(1),
    AGRUPA char(1),
    SUBEMPRESA integer,
    GRUPCART integer,
    MONEDA integer)
returns (
    NIT varchar(20),
    NOMBRE varchar(60),
    DIR varchar(60),
    TELEFONO varchar(40),
    CIUDAD varchar(40),
    CONTACTO varchar(60),
    EMAIL varchar(100),
    FAX varchar(25),
    CEL varchar(25),
    CODCLI varchar(20),
    CODZONA varchar(2),
    NOMZONA varchar(60),
    CODCOBR integer,
    NOMCOBR varchar(60),
    SUCURSAL varchar(10),
    NOMSUC varchar(60),
    DV char(1),
    CODCIUD char(5),
    NOMCIUD varchar(60),
    RESALTAR char(1),
    INSTCART varchar(255),
    TIPO integer,
    ID integer,
    PREFIJO varchar(4),
    NUMERO varchar(6),
    CONCEPTO varchar(60),
    MONTO numeric(18,2),
    SALDO numeric(18,2),
    PROVISIONAL numeric(18,2),
    RTFTE numeric(18,2),
    RTIVA numeric(18,2),
    RTICA numeric(18,2),
    DTOF numeric(18,2),
    TIPONOM varchar(8),
    FECDOC date,
    VENCE date,
    DIAS integer,
    CUPO numeric(18,2),
    DISPONIBLE numeric(18,2),
    NOTA varchar(256),
    OBS blob sub_type 0 segment size 80,
    GRUPCOD integer,
    GRUPNOM varchar(30))
AS
DECLARE VARIABLE NITINI VARCHAR(20);
DECLARE VARIABLE NITFIN VARCHAR(20);
DECLARE VARIABLE NOMINI VARCHAR(20);
DECLARE VARIABLE NOMFIN VARCHAR(20);
DECLARE VARIABLE OK CHAR(1);
DECLARE VARIABLE FOV CHAR(11);
DECLARE VARIABLE DTOAPL NUMERIC(18,2);
DECLARE VARIABLE FECDTO DATE;
DECLARE VARIABLE FECNOTA VARCHAR(10);
DECLARE VARIABLE AUXNOTA VARCHAR(256);
DECLARE VARIABLE IDNOTA INTEGER;
declare variable descnt_prov char(2);
declare variable AUTORET VARCHAR(10);
declare variable FAUTORET DATE;
declare variable INCLANTI CHAR(2);
DECLARE VARIABLE TRM NUMERIC(18,2);
declare variable DB CHAR(1);
BEGIN
if (ORDEN = 'C') then
    BEGIN
    NITINI = DESDE;
    NITFIN = HASTA;
    NOMINI = '';
    NOMFIN = 'zz';
    END
ELSE
    BEGIN
    NOMINI = DESDE;
    NOMFIN = HASTA;
    NITINI = '';
    NITFIN = 'zz';
    END
  EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'DESCONTAR RECIBOS PROVISIONALES EN INFORMES DE CARTERA') RETURNING_VALUES (:descnt_prov);
  EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'INCLUIR ANTICIPOS DE CLIENTES EN REPORTES Y CONSULTAS DE CARTERA') returning_values (INCLANTI);
  EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'FECHA AUTORETENEDOR NO DESCONTAR RETENCIONES DEL SALDO PERO SI CONTABILIZARLAS') returning_values (AUTORET);
  EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'ANALISIS DE CARTERA CON FECHA FACTURA O VENCIMIENTO') RETURNING_VALUES (FOV);
  if (AUTORET <> '') then
    FAUTORET = CAST(AUTORET AS DATE);
  else
    FAUTORET = '9999/12/31';
  /* Ubique el NIT */
  FOR select C.TERC_NIT, TERC_NOM, TERC_DV, CLSU_DIR, CLSU_TEL, CLSU_CIUDAD, S.COBR_COD, S.ZONA_COD, T.CIUD_COD, CLIE_CUPO, CLCU_COD, CLSU_NOMBRE, t.terc_obs, C.GRCA_COD, TERC_CONTACTO, TERC_EMAIL, TERC_FAX, TERC_CEL, CLIE_COD, CLIE_RESALTAR, CLIE_INSTCARTERA
    from terceros T, CLIENTES C, CLIENTE_SUCURSALES S
    where C.TERC_NIT = T.TERC_NIT AND TERC_CLIE = 'S' AND S.TERC_NIT = C.TERC_NIT AND C.TERC_NIT >= :NITINI AND C.TERC_NIT <= :NITFIN AND
        TERC_NOM >= :NOMINI AND TERC_NOM <= :NOMFIN AND ((:GRUPCART = 0) or (C.GRCA_COD = :GRUPCART))
    INTO :NIT, :NOMBRE, :DV, :DIR, :TELEFONO, :CIUDAD, :CODCOBR, :CODZONA, :CODCIUD, :CUPO, :SUCURSAL, :NOMSUC, :obs, :GRUPCOD, :CONTACTO, :EMAIL, :FAX, :CEL, :CODCLI, :resaltar, INSTCART
    DO  
    BEGIN
    if (CODCOBR IS NOT NULL) then
        SELECT COBR_NOM FROM COBRADORES  WHERE COBR_COD = :CODCOBR INTO :NOMCOBR;
    if (CODZONA IS NOT NULL) then
        SELECT ZONA_NOM FROM ZONAS WHERE ZONA_COD = :CODZONA INTO :NOMZONA;
    if (CODCIUD IS NOT NULL) then
        SELECT CIUD_NOM FROM CIUDADES  WHERE CIUD_COD = :CODCIUD INTO :NOMCIUD;
    SELECT GRCA_NOMBRE FROM GRUPO_CARTERA WHERE GRCA_COD = :GRUPCOD INTO :GRUPNOM;
    DISPONIBLE = CUPO;
    OK = 'N';
    if (AGRUPA = 'Z') then
        BEGIN
        if (GRPINI = '') then
            BEGIN
            if ((CODZONA IS NULL) or (CODZONA >= :GRPINI AND CODZONA <= :GRPFIN)) then
                OK = 'S';
            END
        ELSE
            if (CODZONA >= :GRPINI AND CODZONA <= :GRPFIN) then
                OK = 'S';
        END
    if (AGRUPA = 'I') then
        BEGIN
        if (GRPINI = '') then
            BEGIN
            if ((CODCIUD IS NULL) or (CODCIUD >= :GRPINI AND CODCIUD <= :GRPFIN)) then
                OK = 'S';
            END
        ELSE
            if (CODCIUD >= :GRPINI AND CODCIUD <= :GRPFIN) then
                OK = 'S';
        END
    if (AGRUPA = 'N') then
        OK = 'S';
        
    if (OK = 'S') then
        BEGIN
        /* BUSQUE EN SALDOS_DOC_CARTERA LOS QUE TENGAN SALDO > 0 */
        FOR SELECT MVCL_TIPOREF, MVCL_IDREF, MVCL_PREFREF, MVCL_NUMREF, MVCL_FECHA, MVCL_VENCE, MVCL_CONC, MVCL_MONTO, MVCL_DEBITO
            FROM MOVIMIENTO_CLIENTES WHERE TERC_NIT = :NIT AND MVCL_SUCURSAL = :SUCURSAL AND MVCL_FECHA <= :FECHA AND
            MVCL_ABONO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) AND ((:MONEDA = 0) or (MVCL_TRM <> 1))
            INTO :TIPO, :ID, :PREFIJO, :NUMERO, :FECDOC, :VENCE, :CONCEPTO, :MONTO, :DB
            DO
            BEGIN
            if (DB = 'N') then
                MONTO = MONTO * -1;
            if ((inclanti = 'SI') or (TIPO <> 45)) then
                BEGIN
                EXECUTE PROCEDURE saldo_doc_cartera(TIPO, ID, FECHA, MONEDA) returning_values (SALDO);
                if (SALDO <> 0) then
                    BEGIN
                    PROVISIONAL = 0;
                    if (FOV = 'FECHA') then
                       DIAS = FECHA - FECDOC;
                    ELSE
                      DIAS = FECHA - VENCE;
                    DISPONIBLE = DISPONIBLE - SALDO;
                    SELECT TIDO_NOMCORTO FROM TIPO_DOCUMENTO WHERE TIDO_COD = :TIPO INTO :TIPONOM;
                    if (TIPO = 41) then
                        SELECT NDCL_DTOFMONTO, NDCL_FECHADTO, NDCL_TRM FROM NOTAS_DEBITO_CLIENTES
                            WHERE NDCL_ID = :ID INTO :DTOF, :FECDTO, :TRM;
                    if (TIPO = 42) then
                        SELECT 0, :FECDOC, 1 FROM NOTAS_CREDITO_CLIENTES
                            WHERE NCCL_ID = :ID INTO :DTOF, :FECDTO, :TRM;
                    if (TIPO = 45) then
                        SELECT ANCL_DTOFMONTO, ANCL_DTOFECHA, ANCL_TRM FROM ANTICIPOS_CLIENTE
                            WHERE ANCL_ID = :ID INTO :DTOF, :FECDTO, :TRM;
                    if (TIPO = 31) then
                        SELECT FACT_DTOFMONTO, FACT_DTOFFECHA, FACT_TRM FROM FACTURAS
                            WHERE FACT_ID = :ID INTO :DTOF, :FECDTO, :TRM;
                    if (TIPO = 33) then
                        SELECT 0, :FECDOC, 1 FROM devoluciones_ventas
                            WHERE DEVT_ID = :ID INTO :DTOF, :FECDTO, :TRM;
                    if ((MONEDA <> 0) AND (TRM <> 0)) then
                        DTOF = DTOF / TRM;
                    if (DTOF IS NULL) then
                        DTOF = 0;
                    if (DTOF <> 0) then
                        BEGIN
                        SELECT SUM(RCDE_DTOF), MAX(RECA_TRM) FROM RECIBOS_CAJA_DETALLE D, RECIBOS_CAJA R
                            WHERE R.reca_id = D.reca_id AND RCDE_IDDOC = :ID AND RCDE_TIPODOC = :TIPO
                            INTO :DTOAPL, :TRM;
                        if (DTOAPL IS NULL) then
                            DTOAPL = 0;
                        if ((MONEDA <> 0) AND (TRM <> 1)) then
                            DTOAPL = DTOAPL / TRM;
                        DTOF = DTOF - DTOAPL;
                        /* SI YA SE VENCIO DEJELO EN CERO */
                        if (FECDTO < FECHA) then
                            DTOF = 0;
                        END
                    if (MONEDA = 0) then
                        SELECT SUM(SDCA_RTFTE - SDCA_ABRTFTE), SUM(SDCA_RTIVA - SDCA_ABRTIVA), SUM(SDCA_RTICA - SDCA_ABRTICA)
                            FROM SALDOS_DOC_CARTERA WHERE SDCA_TIPOREF = :TIPO AND SDCA_IDREF = :ID
                            INTO :RTFTE, :RTIVA, :RTICA;
                    ELSE
                        SELECT SUM((SDCA_RTFTE - SDCA_ABRTFTE)/SDCA_TRM), SUM((SDCA_RTIVA - SDCA_ABRTIVA)/SDCA_TRM), SUM((SDCA_RTICA - SDCA_ABRTICA)/SDCA_TRM)
                            FROM SALDOS_DOC_CARTERA WHERE SDCA_TIPOREF = :TIPO AND SDCA_IDREF = :ID
                            INTO :RTFTE, :RTIVA, :RTICA;
                    if (RTFTE IS NULL) then
                        RTFTE = 0;
                    if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) THEN
                        BEGIN
                        if (RTFTE > 0) then
                            RTFTE = 0;
                        END
                    ELSE
                        BEGIN
                        if (RTFTE < 0) then
                            RTFTE = 0;
                        END
                    if (RTIVA IS NULL) then
                        RTIVA = 0;
                    if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) THEN
                        BEGIN
                        if (RTIVA > 0) then
                            RTIVA = 0;
                        END
                    ELSE
                        BEGIN
                        if (RTIVA < 0) then
                            RTIVA = 0;
                        END
                    if (RTICA IS NULL) then
                        RTICA = 0;
                    if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) THEN
                        BEGIN
                        if (RTICA > 0) then
                            RTICA = 0;
                        END
                    ELSE
                        BEGIN
                        if (RTICA < 0) then
                            RTICA = 0;
                        END
                    if (FAUTORET <= FECDOC) then
                        RTFTE = 0;
                    /* SI TIENE NOTA AGREGUELA */
                    SELECT MAX(NOCL_ID) FROM NOTAS_CLIENTES WHERE TERC_NIT = :NIT AND CLSU_COD = :SUCURSAL AND NOCL_TIPODOC = :TIPO AND NOCL_IDDOC = :ID INTO :IDNOTA;
                    if (IDNOTA IS NOT NULL) then
                        BEGIN
                        SELECT cast(NOCL_FECHA as char(10)), NOCL_TEXTO FROM NOTAS_CLIENTES
                            WHERE NOCL_ID = :IDNOTA INTO :FECNOTA, :AUXNOTA;
                        if (STRLEN(AUXNOTA) < 244) then
                            NOTA = FECNOTA || ':' || AUXNOTA;
                        ELSE
                            NOTA = AUXNOTA;
                        END
                    else
                        NOTA = '';
                    SUSPEND;
                    END  /* SALDO <> 0 */
                END  /* NO ANTICIPO */
            END  /* FOR */
        /* AGREGUE LOS RECIBOS PROVISIONALES CON SIGNO NEGATIVO */
        FOR SELECT 65, MAX(P.RCPR_ID), MAX(PREF_PRE), MAX(RCPR_NUMERO), MAX(RCPR_FECHA), MAX(RCPR_CONC), SUM(RPDE_ABONO * -1), SUM(RPDE_RTFTE*-1), SUM(RPDE_RTIVA*-1), SUM(RPDE_RTICA*-1), MAX(RCPR_TRM)
            FROM RECIBO_PROVISIONAL P, recibo_provisional_detalle D
            WHERE P.rcpr_id = D.rcpr_id AND P.TERC_NIT = :NIT AND RCPR_FECHA <= :FECHA AND RCPR_ANULADO = 'N' AND
            ((RCPR_FECCRUCE IS NULL) or (RCPR_FECCRUCE > :FECHA)) AND RPDE_SUCURSAL = :SUCURSAL AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY P.rcpr_id
            INTO :TIPO, :ID, :PREFIJO, :NUMERO, :FECDOC, :CONCEPTO, :PROVISIONAL, :rtfte,  :RTIVA, :RTICA, :TRM
            DO
            BEGIN
            if ((MONEDA <> 0) AND (TRM <> 0)) then
                PROVISIONAL = PROVISIONAL / TRM;
            if (:descnt_prov = 'NO') then
              SALDO = 0;
            else
              SALDO = :PROVISIONAL;
            SELECT TIDO_NOMCORTO FROM TIPO_DOCUMENTO WHERE TIDO_COD = :TIPO INTO :TIPONOM;
            /* CALCULE EL VENCIMIENTO DEL ULTIMO DOCUMENTO POSFECHADO */
            SELECT MAX(RPPA_FECHA) FROM recibo_provisional_pago WHERE RCPR_ID = :ID INTO :VENCE;
            DIAS = VENCE - FECHA;
            SUSPEND;
            END
        END
    if (AGRUPA = 'C') then
        BEGIN
        FOR SELECT DISTINCT COBR_COD FROM MOVIMIENTO_CLIENTES
            WHERE TERC_NIT = :NIT AND MVCL_SUCURSAL = :SUCURSAL AND MVCL_FECHA <= :FECHA AND
            MVCL_ABONO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            INTO :codcobr
            DO
            BEGIN
            OK = 'N';
            if (GRPINI = '') then
                BEGIN
                if ((CODCOBR IS NULL) or (CODCOBR >= :GRPINI AND CODCOBR <= :GRPFIN)) then
                    OK = 'S';
                END
            ELSE
                if (CODCOBR >= :GRPINI AND CODCOBR <= :GRPFIN) then
                    OK = 'S';
            if (OK = 'S') then
                BEGIN
                SELECT COBR_NOM FROM COBRADORES  WHERE COBR_COD = :CODCOBR INTO :NOMCOBR;
                /* BUSQUE EN SALDOS_DOC_CARTERA LOS QUE TENGAN SALDO > 0 */
                FOR SELECT MVCL_TIPOREF, MVCL_IDREF, MVCL_PREFREF, MVCL_NUMREF, MVCL_FECHA, MVCL_VENCE, MVCL_CONC, MVCL_MONTO, MVCL_DEBITO
                    FROM MOVIMIENTO_CLIENTES WHERE TERC_NIT = :NIT AND MVCL_SUCURSAL = :SUCURSAL AND MVCL_FECHA <= :FECHA AND
                    MVCL_ABONO = 'N' AND COBR_COD = :codcobr AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) AND
                    ((:MONEDA = 0) or (MVCL_TRM <> 1))
                    INTO :TIPO, :ID, :PREFIJO, :NUMERO, :FECDOC, :VENCE, :CONCEPTO, :MONTO, :DB
                    DO
                    BEGIN
                    if (DB = 'N') then
                        MONTO = MONTO * -1;
                    if ((inclanti = 'SI') or (TIPO <> 45)) then
                        BEGIN
                        EXECUTE PROCEDURE saldo_doc_cartera(TIPO, ID, FECHA, MONEDA) returning_values (SALDO);
                        if (SALDO <> 0) then
                            BEGIN
                            PROVISIONAL = 0;
                            if (FOV = 'FECHA') then
                               DIAS = FECHA - FECDOC;
                            ELSE
                              DIAS = FECHA - VENCE;
                            DISPONIBLE = DISPONIBLE - SALDO;
                            SELECT TIDO_NOMCORTO FROM TIPO_DOCUMENTO WHERE TIDO_COD = :TIPO INTO :TIPONOM;
                            if (TIPO = 41) then
                                SELECT NDCL_DTOFMONTO, NDCL_FECHADTO, NDCL_TRM FROM NOTAS_DEBITO_CLIENTES
                                    WHERE NDCL_ID = :ID INTO :DTOF, :FECDTO, :TRM;
                            if (TIPO = 42) then
                                SELECT 0, :FECDOC, 1 FROM NOTAS_CREDITO_CLIENTES
                                    WHERE NCCL_ID = :ID INTO :DTOF, :FECDTO, :TRM;
                            if (TIPO = 45) then
                                SELECT ANCL_DTOFMONTO, ANCL_DTOFECHA, ANCL_TRM FROM ANTICIPOS_CLIENTE
                                    WHERE ANCL_ID = :ID INTO :DTOF, :FECDTO, :TRM;
                            if (TIPO = 31) then
                                SELECT FACT_DTOFMONTO, FACT_DTOFFECHA, FACT_TRM FROM FACTURAS
                                    WHERE FACT_ID = :ID INTO :DTOF, :FECDTO, :TRM;
                            if (TIPO = 33) then
                                SELECT 0, :FECDOC, 1 FROM devoluciones_ventas
                                    WHERE DEVT_ID = :ID INTO :DTOF, :FECDTO, :TRM;
                            if (DTOF IS NULL) then
                                DTOF = 0;
                            if ((MONEDA <> 0) AND (TRM <> 0)) then
                                DTOF = DTOF / TRM;
                            if (DTOF <> 0) then
                                BEGIN
                                SELECT SUM(RCDE_DTOF) FROM RECIBOS_CAJA_DETALLE WHERE RCDE_IDDOC = :ID AND RCDE_TIPODOC = :TIPO INTO :DTOAPL;
                                if (DTOAPL IS NULL) then
                                    DTOAPL = 0;
                                DTOF = DTOF - DTOAPL;
                                /* SI YA SE VENCIO DEJELO EN CERO */
                                if (FECDTO < FECHA) then
                                    DTOF = 0;
                                END
                            SELECT SUM(SDCA_RTFTE - SDCA_ABRTFTE), SUM(SDCA_RTIVA - SDCA_ABRTIVA), SUM(SDCA_RTICA - SDCA_ABRTICA)
                                FROM SALDOS_DOC_CARTERA WHERE SDCA_TIPOREF = :TIPO AND SDCA_IDREF = :ID INTO :RTFTE, :RTIVA, :RTICA;
                            if (RTFTE IS NULL) then
                                RTFTE = 0;
                            if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) THEN
                                BEGIN
                                if (RTFTE > 0) then
                                    RTFTE = 0;
                                END
                            ELSE
                                BEGIN
                                if (RTFTE < 0) then
                                    RTFTE = 0;
                                END
                            if (FAUTORET <= FECDOC) then
                                RTFTE = 0;
                            if (RTIVA IS NULL) then
                                RTIVA = 0;
                            if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) THEN
                                BEGIN
                                if (RTIVA > 0) then
                                    RTIVA = 0;
                                END
                            ELSE
                                BEGIN
                                if (RTIVA < 0) then
                                    RTIVA = 0;
                                END
                            if (RTICA IS NULL) then
                                RTICA = 0;
                            if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) THEN
                                BEGIN
                                if (RTICA > 0) then
                                    RTICA = 0;
                                END
                            ELSE
                                BEGIN
                                if (RTICA < 0) then
                                    RTICA = 0;
                                END
                            /* SI TIENE NOTA AGREGUELA */
                            SELECT MAX(NOCL_ID) FROM NOTAS_CLIENTES WHERE TERC_NIT = :NIT AND CLSU_COD = :SUCURSAL AND NOCL_TIPODOC = :TIPO AND NOCL_IDDOC = :ID INTO :IDNOTA;
                            if (IDNOTA IS NOT NULL) then
                                BEGIN
                                SELECT cast(NOCL_FECHA as char(10)), NOCL_TEXTO FROM NOTAS_CLIENTES
                                    WHERE NOCL_ID = :IDNOTA INTO :FECNOTA, :AUXNOTA;
                                if (STRLEN(AUXNOTA) < 244) then
                                    NOTA = FECNOTA || ':' || AUXNOTA;
                                ELSE
                                    NOTA = AUXNOTA;
                                END
                            else
                                NOTA = '';
                            SUSPEND;
                            END  /* SALDO <> 0 */
                        END  /* NO ANTICIPO */
                    END  /* FOR */
                /* AGREGUE LOS RECIBOS PROVISIONALES CON SIGNO NEGATIVO */
                FOR SELECT 65, MAX(P.RCPR_ID), MAX(PREF_PRE), MAX(RCPR_NUMERO), MAX(RCPR_FECHA), MAX(RCPR_CONC), SUM(RPDE_ABONO * -1), SUM(RPDE_RTFTE*-1), SUM(RPDE_RTIVA*-1), SUM(RPDE_RTICA*-1), MAX(RCPR_TRM)
                    FROM RECIBO_PROVISIONAL P, recibo_provisional_detalle D
                    WHERE P.rcpr_id = D.rcpr_id AND P.TERC_NIT = :NIT AND P.VEND_COD = :codcobr AND RCPR_FECHA <= :FECHA AND RCPR_ANULADO = 'N' AND
                    ((RCPR_FECCRUCE IS NULL) or (RCPR_FECCRUCE > :FECHA)) AND RPDE_SUCURSAL = :SUCURSAL AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                    GROUP BY P.rcpr_id
                    INTO :TIPO, :ID, :PREFIJO, :NUMERO, :FECDOC, :CONCEPTO, :PROVISIONAL, :rtfte,  :RTIVA, :RTICA, :TRM
                    DO
                    BEGIN
                    if ((MONEDA <> 0) AND (TRM <> 0)) then
                        PROVISIONAL = PROVISIONAL / TRM;
                    MONTO = PROVISIONAL;
                    if (:descnt_prov = 'NO') then
                      SALDO = 0;
                    else
                      SALDO = :PROVISIONAL;
                    SELECT TIDO_NOMCORTO FROM TIPO_DOCUMENTO WHERE TIDO_COD = :TIPO INTO :TIPONOM;
                    /* CALCULE EL VENCIMIENTO DEL ULTIMO DOCUMENTO POSFECHADO */
                    SELECT MAX(RPPA_FECHA) FROM recibo_provisional_pago WHERE RCPR_ID = :ID INTO :VENCE;
                    DIAS = VENCE - FECHA;
                    SUSPEND;
                    END
                END /* ok */
            END  /* FOR COBR */
        END  /* AGRUPA = C */
    END  /* FOR NIT */
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure REP_CARTERA_CONSOLIDADA (
    DESDE varchar(20),
    HASTA varchar(20),
    GRPINI varchar(5),
    GRPFIN varchar(5),
    FECHA date,
    ORDEN char(1),
    AGRUPA char(1),
    SUBEMPRESA integer,
    GRUPCART integer,
    MONEDA integer)
returns (
    NIT varchar(20),
    NOMBRE varchar(60),
    TELEFONO varchar(40),
    CIUDAD varchar(40),
    EMAIL varchar(100),
    FAX varchar(25),
    CEL varchar(25),
    CODCLI varchar(20),
    CODZONA varchar(2),
    NOMZONA varchar(60),
    CODCOBR integer,
    NOMCOBR varchar(60),
    SUCURSAL varchar(10),
    DV char(1),
    CODCIUD char(5),
    NOMCIUD varchar(60),
    SALDO numeric(18,2),
    RTFTE numeric(18,2),
    RTIVA numeric(18,2),
    RTICA numeric(18,2),
    DTOF numeric(18,2),
    CUPO numeric(18,2),
    DISPONIBLE numeric(18,2),
    PROVISIONAL numeric(18,2),
    CONTACTO varchar(60),
    ESTADO char(1),
    RESALTAR char(1),
    INSTCART varchar(255),
    GRUPCOD integer,
    GRUPNOM varchar(30))
AS
declare variable NITINI VARCHAR(20);
declare variable NITFIN VARCHAR(20);
declare variable NOMINI VARCHAR(20);
declare variable NOMFIN VARCHAR(20);
declare variable OK CHAR(1);
declare variable PSALDO NUMERIC(18,2);
declare variable PRTFTE NUMERIC(18,2);
declare variable PRTIVA NUMERIC(18,2);
declare variable PRTICA NUMERIC(18,2);
declare variable PDTOF NUMERIC(18,2);
declare variable TIPO INTEGER;
declare variable ID INTEGER;
declare variable DTOAPL NUMERIC(18,2);
declare variable FECDTO DATE;
declare variable descnt_prov char(2);
declare variable AUTORET VARCHAR(10);
declare variable FAUTORET DATE;
declare variable FECDOC DATE;
declare variable INCLANTI CHAR(2);
declare variable TRM NUMERIC(18,2);
BEGIN
if (ORDEN = 'C') then
    BEGIN
    NITINI = DESDE;
    NITFIN = HASTA;
    NOMINI = '';
    NOMFIN = 'zz';
    END
ELSE
    BEGIN
    NOMINI = DESDE;
    NOMFIN = HASTA;
    NITINI = '';
    NITFIN = 'zz';
    END
  EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'DESCONTAR RECIBOS PROVISIONALES EN INFORMES DE CARTERA') RETURNING_VALUES (:descnt_prov);
  EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'INCLUIR ANTICIPOS DE CLIENTES EN REPORTES Y CONSULTAS DE CARTERA') returning_values (INCLANTI);
  EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'FECHA AUTORETENEDOR NO DESCONTAR RETENCIONES DEL SALDO PERO SI CONTABILIZARLAS') returning_values (AUTORET);
  if (AUTORET <> '') then
    FAUTORET = CAST(AUTORET AS DATE);
  else
    FAUTORET = '9999/12/31';
  /* Ubique el NIT */
  FOR select C.TERC_NIT, CLSU_NOMBRE, TERC_DV, CLSU_TEL, CLSU_CIUDAD, TERC_CONTACTO, S.COBR_COD, S.ZONA_COD, T.CIUD_COD, CLIE_CUPO, CLIE_ESTADO, CLCU_COD, C.GRCA_COD, TERC_EMAIL, TERC_FAX, TERC_CEL, CLIE_COD, CLIE_RESALTAR, CLIE_INSTCARTERA
    from terceros T, CLIENTES C, CLIENTE_SUCURSALES S
    where C.TERC_NIT = T.TERC_NIT AND TERC_CLIE = 'S' AND S.TERC_NIT = C.TERC_NIT AND C.TERC_NIT >= :NITINI AND C.TERC_NIT <= :NITFIN AND
        TERC_NOM >= :NOMINI AND TERC_NOM <= :NOMFIN AND ((:GRUPCART = 0) or (C.GRCA_COD = :GRUPCART))
    INTO :NIT, :NOMBRE, :DV, :TELEFONO, :CIUDAD, :CONTACTO, :CODCOBR, :CODZONA, :CODCIUD, :CUPO, :ESTADO, :SUCURSAL, :GRUPCOD, :EMAIL, :FAX, :CEL, :CODCLI, :RESALTAR, INSTCART
    DO  
    BEGIN
    SELECT GRCA_NOMBRE FROM GRUPO_CARTERA WHERE GRCA_COD = :GRUPCOD INTO :GRUPNOM;
    OK = 'N';
    if (AGRUPA = 'Z') then
        BEGIN
        if (GRPINI = '') then
            BEGIN
            if ((CODZONA IS NULL) or (CODZONA >= :GRPINI AND CODZONA <= :GRPFIN)) then
                OK = 'S';
            END
        ELSE
            if (CODZONA >= :GRPINI AND CODZONA <= :GRPFIN) then
                OK = 'S';
        END
    if (AGRUPA = 'I') then
        BEGIN
        if (GRPINI = '') then
            BEGIN
            if ((CODCIUD IS NULL) or (CODCIUD >= :GRPINI AND CODCIUD <= :GRPFIN)) then
                OK = 'S';
            END
        ELSE
            if (CODCIUD >= :GRPINI AND CODCIUD <= :GRPFIN) then
                OK = 'S';
        END
    if (AGRUPA = 'N') then
        OK = 'S';
        
    if (OK = 'S') then
        BEGIN
        if (CODCOBR IS NOT NULL) then
            SELECT COBR_NOM FROM COBRADORES  WHERE COBR_COD = :CODCOBR INTO :NOMCOBR;
        if (CODZONA IS NOT NULL) then
            SELECT ZONA_NOM FROM ZONAS WHERE ZONA_COD = :CODZONA INTO :NOMZONA;
        if (CODCIUD IS NOT NULL) then
            SELECT CIUD_NOM FROM CIUDADES  WHERE CIUD_COD = :CODCIUD INTO :NOMCIUD;
    
        SALDO = 0;
        RTFTE = 0;
        RTIVA = 0;
        RTICA = 0;
        DTOF = 0;
        /* BUSQUE EN SALDOS_DOC_CARTERA LOS QUE TENGAN SALDO > 0 */
        FOR SELECT MVCL_TIPOREF, MVCL_IDREF, MVCL_FECHA
          FROM MOVIMIENTO_CLIENTES WHERE TERC_NIT = :NIT AND MVCL_SUCURSAL = :SUCURSAL AND MVCL_FECHA <= :FECHA AND
          MVCL_ABONO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) AND ((:MONEDA = 0) or (MVCL_TRM <> 1))
          INTO :TIPO, :ID, :FECDOC
          DO
            BEGIN
            if ((inclanti = 'SI') or (TIPO <> 45)) then
                BEGIN
                EXECUTE PROCEDURE saldo_doc_cartera(TIPO, ID, FECHA, MONEDA) returning_values (PSALDO);
                if (PSALDO <> 0) then
                    BEGIN
                    if (TIPO = 41) then
                        SELECT NDCL_DTOFMONTO, NDCL_FECHADTO, NDCL_TRM FROM NOTAS_DEBITO_CLIENTES
                            WHERE NDCL_ID = :ID INTO :PDTOF, :FECDTO, :TRM;
                    if (TIPO = 42) then
                        SELECT 0, NCCL_FECHA, 1 FROM NOTAS_CREDITO_CLIENTES
                            WHERE NCCL_ID = :ID INTO :PDTOF, :FECDTO, :TRM;
                    if (TIPO = 45) then
                        SELECT ANCL_DTOFMONTO, ANCL_DTOFECHA, ANCL_TRM FROM ANTICIPOS_CLIENTE
                            WHERE ANCL_ID = :ID INTO :PDTOF, :FECDTO, :TRM;
                    if (TIPO = 31) then
                        SELECT FACT_DTOFMONTO, FACT_DTOFFECHA, FACT_TRM FROM FACTURAS
                            WHERE FACT_ID = :ID INTO :PDTOF, :FECDTO, :TRM;
                    if (TIPO = 33) then
                        SELECT 0, DEVT_FECHA, 1 FROM devoluciones_ventas
                            WHERE DEVT_ID = :ID INTO :PDTOF, :FECDTO, :TRM;
                    if (PDTOF IS NULL) then
                        PDTOF = 0;
                    if ((MONEDA <> 0) AND (TRM <> 0)) then
                        PDTOF = PDTOF / TRM;
                    if (PDTOF <> 0) then
                        BEGIN
                        SELECT SUM(RCDE_DTOF), MAX(RECA_TRM) FROM RECIBOS_CAJA_DETALLE D, recibos_caja R
                            WHERE R.reca_id = D.reca_id AND RCDE_IDDOC = :ID AND RCDE_TIPODOC = :TIPO INTO :DTOAPL, :TRM;
                        if (DTOAPL IS NULL) then
                            DTOAPL = 0;
                        if ((MONEDA <> 0) AND (TRM <> 0)) then
                           DTOAPL = DTOAPL / TRM;
                        PDTOF = PDTOF - DTOAPL;
                        /* SI YA SE VENCIO DEJELO EN CERO */
                        if (FECDTO < FECHA) then
                            PDTOF = 0;
                        END
                    if (MONEDA = 0) then
                        SELECT SUM(SDCA_RTFTE - SDCA_ABRTFTE), SUM(SDCA_RTIVA - SDCA_ABRTIVA), SUM(SDCA_RTICA - SDCA_ABRTICA)
                            FROM SALDOS_DOC_CARTERA WHERE SDCA_TIPOREF = :TIPO AND SDCA_IDREF = :ID
                            INTO :PRTFTE, :PRTIVA, :PRTICA;
                    ELSE
                        SELECT SUM((SDCA_RTFTE - SDCA_ABRTFTE)/SDCA_TRM), SUM((SDCA_RTIVA - SDCA_ABRTIVA)/SDCA_TRM), SUM((SDCA_RTICA - SDCA_ABRTICA)/SDCA_TRM)
                            FROM SALDOS_DOC_CARTERA WHERE SDCA_TIPOREF = :TIPO AND SDCA_IDREF = :ID
                            INTO :PRTFTE, :PRTIVA, :PRTICA;
                    if (PRTFTE IS NULL) then
                        PRTFTE = 0;
                    if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) THEN
                        BEGIN
                        if (PRTFTE > 0) then
                            PRTFTE = 0;
                        END
                    ELSE    
                        BEGIN
                        if (PRTFTE < 0) then
                            PRTFTE = 0;
                        END
                    if (PRTIVA IS NULL) then
                        PRTIVA = 0;
                    if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) THEN
                        BEGIN
                        if (PRTIVA > 0) then
                            PRTIVA = 0;
                        END
                    ELSE
                        BEGIN
                        if (PRTIVA < 0) then
                            PRTIVA = 0;
                        END
                    if (PRTICA IS NULL) then
                        PRTICA = 0;
                    if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) THEN
                        BEGIN
                        if (PRTICA > 0) then
                            PRTICA = 0;
                        END
                    ELSE
                        BEGIN
                        if (PRTICA < 0) then
                            PRTICA = 0;
                        END

                    if (FAUTORET <= FECDOC) then
                        PRTFTE = 0;

                    SALDO = SALDO + PSALDO;
                    RTFTE = RTFTE + PRTFTE;
                    RTIVA = RTIVA + PRTIVA;
                    RTICA = RTICA + PRTICA;
                    DTOF = DTOF + PDTOF;
                    END /* SALDO <> 0 */
                END  /* NO ANTICIPO */
            END
        DISPONIBLE = CUPO - SALDO;
        /* LOS RECIBOS PROVISIONALES */
        SELECT SUM(RPDE_ABONO), MAX(RCPR_TRM) FROM recibo_provisional P, recibo_provisional_detalle D
            WHERE P.rcpr_id = D.rcpr_id AND TERC_NIT = :NIT AND RPDE_SUCURSAL = :SUCURSAL AND ((:MONEDA = 0) or (RCPR_TRM <> 1)) AND
            RCPR_FECHA <= :FECHA AND RCPR_ANULADO = 'N' AND ((RCPR_FECCRUCE IS NULL) or (RCPR_FECCRUCE > :FECHA)) AND
            ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            INTO :provisional, :TRM;
        if ((MONEDA <> 0) AND (TRM <> 0)) then
            PROVISIONAL = PROVISIONAL / TRM;
           if (:descnt_prov = 'SI') then
             if (NOT :provisional is NULL) then
              SALDO = :saldo - :PROVISIONAL;
        SUSPEND;
        END
    if (AGRUPA = 'C') then
        BEGIN
        if (CODZONA IS NOT NULL) then
            SELECT ZONA_NOM FROM ZONAS WHERE ZONA_COD = :CODZONA INTO :NOMZONA;
        if (CODCIUD IS NOT NULL) then
            SELECT CIUD_NOM FROM CIUDADES  WHERE CIUD_COD = :CODCIUD INTO :NOMCIUD;
        FOR SELECT DISTINCT COBR_COD FROM MOVIMIENTO_CLIENTES WHERE TERC_NIT = :NIT AND
            MVCL_SUCURSAL = :SUCURSAL AND MVCL_FECHA <= :FECHA AND
            MVCL_ABONO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            INTO :codcobr
            DO
            begin
            OK = 'N';
            if (GRPINI = '') then
                BEGIN
                if ((CODCOBR IS NULL) or (CODCOBR >= :GRPINI AND CODCOBR <= :GRPFIN)) then
                    OK = 'S';
                END
            ELSE
                if (CODCOBR >= :GRPINI AND CODCOBR <= :GRPFIN) then
                    OK = 'S';
            if (OK = 'S') then
                BEGIN
                SELECT COBR_NOM FROM COBRADORES  WHERE COBR_COD = :CODCOBR INTO :NOMCOBR;

                SALDO = 0;
                RTFTE = 0;
                RTIVA = 0;
                RTICA = 0;
                DTOF = 0;
                /* BUSQUE EN SALDOS_DOC_CARTERA LOS QUE TENGAN SALDO > 0 */
                FOR SELECT MVCL_TIPOREF, MVCL_IDREF, MVCL_FECHA
                  FROM MOVIMIENTO_CLIENTES WHERE TERC_NIT = :NIT AND MVCL_SUCURSAL = :SUCURSAL AND ((:moneda = 0) or (mvcl_trm <> 1)) AND
                  MVCL_FECHA <= :FECHA AND COBR_COD = :codcobr AND MVCL_ABONO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                  INTO :TIPO, :ID, :FECDOC
                  DO
                    BEGIN
                    if ((inclanti = 'SI') or (TIPO <> 45)) then
                        BEGIN
                        EXECUTE PROCEDURE saldo_doc_cartera(TIPO, ID, FECHA, MONEDA) returning_values (PSALDO);
                        if (PSALDO <> 0) then
                            BEGIN
                            if (TIPO = 41) then
                                SELECT NDCL_DTOFMONTO, NDCL_FECHADTO, NDCL_TRM FROM NOTAS_DEBITO_CLIENTES
                                    WHERE NDCL_ID = :ID INTO :PDTOF, :FECDTO, :TRM;
                            if (TIPO = 42) then
                                SELECT 0, NCCL_FECHA, 1 FROM NOTAS_CREDITO_CLIENTES
                                    WHERE NCCL_ID = :ID INTO :PDTOF, :FECDTO, :TRM;
                            if (TIPO = 45) then
                                SELECT ANCL_DTOFMONTO, ANCL_DTOFECHA, ANCL_TRM FROM ANTICIPOS_CLIENTE
                                    WHERE ANCL_ID = :ID INTO :PDTOF, :FECDTO, :TRM;
                            if (TIPO = 31) then
                                SELECT FACT_DTOFMONTO, FACT_DTOFFECHA, FACT_TRM FROM FACTURAS
                                    WHERE FACT_ID = :ID INTO :PDTOF, :FECDTO, :TRM;
                            if (TIPO = 33) then
                                SELECT 0, DEVT_FECHA, 1 FROM devoluciones_ventas
                                    WHERE DEVT_ID = :ID INTO :PDTOF, :FECDTO, :TRM;
                            if (PDTOF IS NULL) then
                                PDTOF = 0;
                            if ((MONEDA <> 0) AND (TRM <> 0)) then
                                PDTOF = PDTOF / TRM;
                            if (PDTOF <> 0) then
                                BEGIN
                                SELECT SUM(RCDE_DTOF), MAX(RECA_TRM) FROM RECIBOS_CAJA_DETALLE D, RECIBOS_CAJA R
                                    WHERE R.reca_id = D.reca_id AND RCDE_IDDOC = :ID AND RCDE_TIPODOC = :TIPO INTO :DTOAPL, :TRM;
                                if (DTOAPL IS NULL) then
                                    DTOAPL = 0;
                                if ((MONEDA <> 0) AND (TRM <> 0)) then
                                   DTOAPL = DTOAPL / TRM;
                                PDTOF = PDTOF - DTOAPL;
                                /* SI YA SE VENCIO DEJELO EN CERO */
                                if (FECDTO < FECHA) then
                                    PDTOF = 0;
                                END
                            if (MONEDA = 0) then
                                SELECT SUM(SDCA_RTFTE - SDCA_ABRTFTE), SUM(SDCA_RTIVA - SDCA_ABRTIVA), SUM(SDCA_RTICA - SDCA_ABRTICA)
                                    FROM SALDOS_DOC_CARTERA WHERE SDCA_TIPOREF = :TIPO AND SDCA_IDREF = :ID
                                    INTO :PRTFTE, :PRTIVA, :PRTICA;
                            ELSE
                                SELECT SUM((SDCA_RTFTE - SDCA_ABRTFTE)/SDCA_TRM), SUM((SDCA_RTIVA - SDCA_ABRTIVA)/SDCA_TRM), SUM((SDCA_RTICA - SDCA_ABRTICA)/SDCA_TRM)
                                    FROM SALDOS_DOC_CARTERA WHERE SDCA_TIPOREF = :TIPO AND SDCA_IDREF = :ID
                                    INTO :PRTFTE, :PRTIVA, :PRTICA;
                            if (PRTFTE IS NULL) then
                                PRTFTE = 0;
                            if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) THEN
                                BEGIN
                                if (PRTFTE > 0) then
                                    PRTFTE = 0;
                                END
                            ELSE
                                BEGIN
                                if (PRTFTE < 0) then
                                    PRTFTE = 0;
                                END
                            if (PRTIVA IS NULL) then
                                PRTIVA = 0;
                            if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) THEN
                                BEGIN
                                if (PRTIVA > 0) then
                                    PRTIVA = 0;
                                END
                            ELSE
                                BEGIN
                                if (PRTIVA < 0) then
                                    PRTIVA = 0;
                                END
                            if (PRTICA IS NULL) then
                                PRTICA = 0;
                            if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) THEN
                                BEGIN
                                if (PRTICA > 0) then
                                    PRTICA = 0;
                                END
                            ELSE
                                BEGIN
                                if (PRTICA < 0) then
                                    PRTICA = 0;
                                END
                            if (FAUTORET <= FECDOC) then
                                PRTFTE = 0;
                            SALDO = SALDO + PSALDO;
                            RTFTE = RTFTE + PRTFTE;
                            RTIVA = RTIVA + PRTIVA;
                            RTICA = RTICA + PRTICA;
                            DTOF = DTOF + PDTOF;
                            END /* SALDO <> 0 */
                        END  /* NO ANTICIPO */
                    END
                DISPONIBLE = CUPO - SALDO;
                /* LOS RECIBOS PROVISIONALES */
                SELECT SUM(RPDE_ABONO), MAX(RCPR_TRM) FROM RECIBO_PROVISIONAL P, recibo_provisional_detalle D
                    WHERE P.rcpr_id = D.rcpr_id AND TERC_NIT = :NIT AND RPDE_SUCURSAL = :SUCURSAL AND ((:MONEDA = 0) or (RCPR_TRM <> 1)) AND
                    VEND_COD = :CODCOBR AND RCPR_FECHA <= :FECHA AND RCPR_ANULADO = 'N' AND ((RCPR_FECCRUCE IS NULL) or (RCPR_FECCRUCE > :FECHA)) AND 
                    ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                    INTO :provisional, :TRM;
                if ((MONEDA <> 0) AND (TRM <> 0)) then
                    PROVISIONAL = PROVISIONAL / TRM;
                if (:descnt_prov = 'SI') then
                   if (NOT :provisional IS NULL) then
                    SALDO = :saldo - :PROVISIONAL;
                if (AUTORET = 'SI') then
                    BEGIN
                    RTFTE = 0;
                    RTIVA = 0;
                    RTICA = 0;
                    END
                SUSPEND;
                END  /* OK = S */
            END  /* FOR COBRADOR */
        END  /* AGRUPA = C */
    END  /* FOR NIT */
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure REP_CARTERA_NOTAS (
    DESDE varchar(20),
    HASTA varchar(20),
    GRPINI varchar(5),
    GRPFIN varchar(5),
    FECHA date,
    ORDEN char(1),
    AGRUPA char(1),
    SUBEMPRESA integer,
    VENCEINI date,
    VENCEFIN date,
    GRUPCART integer,
    MONEDA integer)
returns (
    NIT varchar(20),
    NOMBRE varchar(60),
    TELEFONO varchar(40),
    CIUDAD varchar(40),
    CODZONA varchar(2),
    NOMZONA varchar(60),
    CODCOBR integer,
    NOMCOBR varchar(60),
    SUCURSAL varchar(10),
    DV char(1),
    CODCIUD char(5),
    NOMCIUD varchar(60),
    SALDO numeric(18,2),
    NOTA1 varchar(256),
    NOTA2 varchar(256),
    CUPO numeric(18,2),
    DISPONIBLE numeric(18,2),
    PROVISIONAL numeric(18,2),
    CONTACTO varchar(60),
    ESTADO char(1),
    RESALTAR char(1),
    INSTCART varchar(255),
    GRUPCOD integer,
    GRUPNOM varchar(30))
AS
declare variable NITINI VARCHAR(20);
declare variable NITFIN VARCHAR(20);
declare variable NOMINI VARCHAR(20);
declare variable NOMFIN VARCHAR(20);
declare variable OK CHAR(1);
declare variable PSALDO NUMERIC(18,2);
declare variable TIPO INTEGER;
declare variable ID INTEGER;
declare variable NOTA VARCHAR(277);
declare variable TIPODOC VARCHAR(8);
declare variable NUMDOC VARCHAR(10);
declare variable FECNOTA VARCHAR(10);
declare variable I INTEGER;
declare variable INCLANTI CHAR(2);
declare variable TRM NUMERIC(18,2);
BEGIN
if (ORDEN = 'C') then
    BEGIN
    NITINI = DESDE;
    NITFIN = HASTA;
    NOMINI = '';
    NOMFIN = 'zz';
    END
ELSE
    BEGIN
    NOMINI = DESDE;
    NOMFIN = HASTA;
    NITINI = '';
    NITFIN = 'zz';
    END
  EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'INCLUIR ANTICIPOS DE CLIENTES EN REPORTES Y CONSULTAS DE CARTERA') returning_values (INCLANTI);
  /* Ubique el NIT */
  FOR select T.TERC_NIT, CLSU_NOMBRE, TERC_DV, CLSU_TEL, CLSU_CIUDAD, TERC_CONTACTO, S.COBR_COD, S.ZONA_COD, CIUD_COD, CLIE_CUPO, CLIE_ESTADO, CLCU_COD, C.GRCA_COD, CLIE_RESALTAR, CLIE_INSTCARTERA
    from terceros T, CLIENTES C, CLIENTE_SUCURSALES S
    where C.TERC_NIT = T.TERC_NIT AND TERC_CLIE = 'S' AND S.TERC_NIT = C.TERC_NIT AND T.TERC_NIT >= :NITINI AND T.TERC_NIT <= :NITFIN AND
        TERC_NOM >= :NOMINI AND TERC_NOM <= :NOMFIN AND ((:GRUPCART = 0) or (C.GRCA_COD = :GRUPCART))
    INTO :NIT, :NOMBRE, :DV, :TELEFONO, :CIUDAD, :CONTACTO, :CODCOBR, :CODZONA, :CODCIUD, :CUPO, :ESTADO, :SUCURSAL, :GRUPCOD, :RESALTAR, INSTCART
    DO  
    BEGIN
    GRUPNOM = '';
    SELECT GRCA_NOMBRE FROM GRUPO_CARTERA WHERE GRCA_COD = :GRUPCOD INTO :GRUPNOM;
    OK = 'N';
    if (AGRUPA = 'Z') then
        BEGIN
        if (GRPINI = '') then
            BEGIN
            if ((CODZONA IS NULL) or (CODZONA >= :GRPINI AND CODZONA <= :GRPFIN)) then
                OK = 'S';
            END
        ELSE
            if (CODZONA >= :GRPINI AND CODZONA <= :GRPFIN) then
                OK = 'S';
        END
    if (AGRUPA = 'I') then
        BEGIN
        if (GRPINI = '') then
            BEGIN
            if ((CODCIUD IS NULL) or (CODCIUD >= :GRPINI AND CODCIUD <= :GRPFIN)) then
                OK = 'S';
            END
        ELSE
            if (CODCIUD >= :GRPINI AND CODCIUD <= :GRPFIN) then
                OK = 'S';
        END
    if (AGRUPA = 'N') then
        OK = 'S';
        
    if (OK = 'S') then
        BEGIN
        if (CODCOBR IS NOT NULL) then
            SELECT COBR_NOM FROM COBRADORES  WHERE COBR_COD = :CODCOBR INTO :NOMCOBR;
        if (CODZONA IS NOT NULL) then
            SELECT ZONA_NOM FROM ZONAS WHERE ZONA_COD = :CODZONA INTO :NOMZONA;
        if (CODCIUD IS NOT NULL) then
            SELECT CIUD_NOM FROM CIUDADES  WHERE CIUD_COD = :CODCIUD INTO :NOMCIUD;
    
        SALDO = 0;
        /* BUSQUE EN SALDOS_DOC_CARTERA LOS QUE TENGAN SALDO > 0 */
        FOR SELECT MVCL_TIPOREF, MVCL_IDREF
          FROM MOVIMIENTO_CLIENTES WHERE TERC_NIT = :NIT AND MVCL_SUCURSAL = :SUCURSAL AND MVCL_FECHA <= :FECHA AND
          MVCL_ABONO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) AND MVCL_VENCE >= :VENCEINI AND
          MVCL_VENCE <= :VENCEFIN AND ((:MONEDA = 0) or (MVCL_TRM <> 1))
          INTO :TIPO, :ID
          DO
            if ((inclanti = 'SI') or (TIPO <> 45)) then
                BEGIN
                EXECUTE PROCEDURE saldo_doc_cartera(TIPO, ID, FECHA, MONEDA) returning_values (PSALDO);
                if (PSALDO <> 0) then
                    SALDO = SALDO + PSALDO;
                END
        DISPONIBLE = CUPO - SALDO;
        /* LOS RECIBOS PROVISIONALES */
        SELECT SUM(RPDE_ABONO), MAX(RCPR_TRM) FROM RECIBO_PROVISIONAL P, recibo_provisional_detalle D
            WHERE P.rcpr_id = D.rcpr_id AND TERC_NIT = :NIT AND RPDE_SUCURSAL = :SUCURSAL AND ((:MONEDA = 0) or (RCPR_TRM <> 1)) AND
            RCPR_FECHA <= :FECHA AND RCPR_ANULADO = 'N' AND ((RCPR_FECCRUCE IS NULL) or (RCPR_FECCRUCE > :FECHA)) AND
            ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            INTO :provisional, :TRM;
        if ((MONEDA <> 0) AND (TRM <> 0)) then
            PROVISIONAL = PROVISIONAL / TRM;
        /* LAS NOTAS DE CLIENTES */
        I = 0;
        NOTA1 = '';
        NOTA2 = '';
        FOR SELECT CAST(NOCL_FECHA AS VARCHAR(10)), tido_nomcorto, NOCL_NUMDOC, NOCL_TEXTO
            FROM NOTAS_CLIENTES N, TIPO_DOCUMENTO T WHERE N.NOCL_TIPODOC = T.TIDO_COD AND TERC_NIT = :NIT
            AND N.TINO_COD = 3 AND N.CLSU_COD = :SUCURSAL
            ORDER BY NOCL_ID DESC INTO :FECNOTA, :TIPODOC, :NUMDOC, :NOTA
            DO
            BEGIN
            if (I = 0) then
                NOTA1 = NOTA;
            if (I = 1) then
                NOTA2 = NOTA;
            I = I + 1;
            END
        SUSPEND;
        END
    if (AGRUPA = 'C') then
        BEGIN
        if (CODZONA IS NOT NULL) then
            SELECT ZONA_NOM FROM ZONAS WHERE ZONA_COD = :CODZONA INTO :NOMZONA;
        if (CODCIUD IS NOT NULL) then
            SELECT CIUD_NOM FROM CIUDADES  WHERE CIUD_COD = :CODCIUD INTO :NOMCIUD;
        FOR SELECT DISTINCT COBR_COD FROM MOVIMIENTO_CLIENTES WHERE TERC_NIT = :NIT AND
            MVCL_SUCURSAL = :SUCURSAL AND MVCL_FECHA <= :FECHA AND
            MVCL_ABONO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) AND MVCL_VENCE >= :VENCEINI AND MVCL_VENCE <= :VENCEFIN
            INTO :codcobr
            DO
            begin
            OK = 'N';
            if (GRPINI = '') then
                BEGIN
                if ((CODCOBR IS NULL) or (CODCOBR >= :GRPINI AND CODCOBR <= :GRPFIN)) then
                    OK = 'S';
                END
            ELSE
                if (CODCOBR >= :GRPINI AND CODCOBR <= :GRPFIN) then
                    OK = 'S';
            if (OK = 'S') then
                BEGIN
                SELECT COBR_NOM FROM COBRADORES  WHERE COBR_COD = :CODCOBR INTO :NOMCOBR;

                SALDO = 0;
                /* BUSQUE EN SALDOS_DOC_CARTERA LOS QUE TENGAN SALDO > 0 */
                FOR SELECT MVCL_TIPOREF, MVCL_IDREF
                  FROM MOVIMIENTO_CLIENTES WHERE TERC_NIT = :NIT AND MVCL_SUCURSAL = :SUCURSAL AND
                  MVCL_FECHA <= :FECHA AND COBR_COD = :codcobr AND MVCL_ABONO = 'N' AND
                  ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) AND MVCL_VENCE >= :VENCEINI AND
                  MVCL_VENCE <= :VENCEFIN AND ((:MONEDA = 0) or (MVCL_TRM <> 1))
                  INTO :TIPO, :ID
                  DO
                    if ((inclanti = 'SI') or (TIPO <> 45)) then
                        BEGIN
                        EXECUTE PROCEDURE saldo_doc_cartera(TIPO, ID, FECHA, MONEDA) returning_values (PSALDO);
                        if (PSALDO <> 0) then
                            BEGIN
                            SALDO = SALDO + PSALDO;
                            END
                        END
                DISPONIBLE = CUPO - SALDO;
                /* LOS RECIBOS PROVISIONALES */
                SELECT SUM(RPDE_ABONO), MAX(RCPR_TRM) FROM RECIBO_PROVISIONAL P, recibo_provisional_detalle D
                    WHERE P.rcpr_id = D.rcpr_id AND TERC_NIT = :NIT AND RPDE_SUCURSAL = :SUCURSAL AND ((:MONEDA = 0) or (RCPR_TRM <> 1)) AND
                    VEND_COD = :CODCOBR AND RCPR_FECHA <= :FECHA AND RCPR_ANULADO = 'N' AND ((RCPR_FECCRUCE IS NULL) or (RCPR_FECCRUCE > :FECHA)) AND
                    ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                    INTO :provisional, :TRM;
                if ((MONEDA <> 0) AND (TRM <> 0)) then
                    PROVISIONAL = PROVISIONAL / TRM;
                /* LAS NOTAS DE CLIENTES */
                I = 0;
                NOTA1 = '';
                NOTA2 = '';
                FOR SELECT CAST(NOCL_FECHA AS VARCHAR(10)), tido_nomcorto, NOCL_NUMDOC, NOCL_TEXTO
                    FROM NOTAS_CLIENTES N, TIPO_DOCUMENTO T WHERE N.NOCL_TIPODOC = T.TIDO_COD AND TERC_NIT = :NIT
                    AND N.TINO_COD = 3 AND N.CLSU_COD = :SUCURSAL
                    ORDER BY NOCL_FECHA DESC INTO :FECNOTA, :TIPODOC, :NUMDOC, :NOTA
                    DO
                    BEGIN
                    if (I = 0) then
                        NOTA1 = NOTA;
                    if (I = 1) then
                        NOTA2 = NOTA;
                    I = I + 1;
                    END
                SUSPEND;
                END  /* OK = S */
            END  /* FOR COBRADOR */
        END  /* AGRUPA = C */
    END  /* FOR NIT */
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure REP_ANALISIS_CARTERA (
    DESDE varchar(20),
    HASTA varchar(20),
    GRPINI varchar(5),
    GRPFIN varchar(5),
    FECHA date,
    DETALLE char(1),
    ORDEN char(1),
    AGRUPA char(1),
    DIASR integer,
    SUBEMPRESA integer,
    GRUPCART integer,
    EXTENDIDA char(1),
    MONEDA integer)
returns (
    NIT varchar(20),
    NOMBRE varchar(60),
    TELEFONO varchar(40),
    CIUDAD varchar(40),
    CONTACTO varchar(60),
    EMAIL varchar(100),
    FAX varchar(25),
    CEL varchar(25),
    CODCLI varchar(20),
    CODZONA varchar(2),
    NOMZONA varchar(60),
    CODCOBR integer,
    NOMCOBR varchar(60),
    DV char(1),
    CODCIUD char(5),
    NOMCIUD varchar(60),
    SUCURSAL varchar(10),
    NOMSUC varchar(60),
    RESALTAR char(1),
    INSTCART varchar(255),
    TIPO integer,
    ID integer,
    PREFIJO varchar(4),
    NUMERO varchar(6),
    DIAS integer,
    SALDO numeric(18,2),
    CORRIENTE numeric(18,2),
    CERO numeric(18,2),
    TREINTA numeric(18,2),
    SESENTA numeric(18,2),
    NOVENTA numeric(18,2),
    CIENTOCHENTA numeric(18,2),
    DOSSETENTA numeric(18,2),
    TRESSESENTA numeric(18,2),
    PROVISIONAL numeric(18,2),
    TIPONOM varchar(8),
    FECDOC date,
    VENCE date,
    CUPO numeric(18,2),
    DISPONIBLE numeric(18,2),
    OBS blob sub_type 0 segment size 80,
    GRUPCOD integer,
    DIA_CAR integer,
    GRUPNOM varchar(30))
AS
DECLARE VARIABLE NITINI VARCHAR(20);
DECLARE VARIABLE NITFIN VARCHAR(20);
DECLARE VARIABLE NOMINI VARCHAR(20);
DECLARE VARIABLE NOMFIN VARCHAR(20);
DECLARE VARIABLE RTFTE NUMERIC(18,2);
DECLARE VARIABLE RTIVA NUMERIC(18,2);
DECLARE VARIABLE RTICA NUMERIC(18,2);
DECLARE VARIABLE VENCIMIENTO VARCHAR(12);
DECLARE VARIABLE OK CHAR(1);
declare variable AUTORET VARCHAR(10);
declare variable FAUTORET DATE;
declare variable INCLANTI CHAR(2);
declare variable descnt_prov char(2);
declare variable MAXDIAS INTEGER;
DECLARE VARIABLE TRM NUMERIC(18,2);
BEGIN
if (ORDEN = 'C') then
    BEGIN
    NITINI = DESDE;
    NITFIN = HASTA;
    NOMINI = '';
    NOMFIN = 'zz';
    END
ELSE
    BEGIN
    NOMINI = DESDE;
    NOMFIN = HASTA;
    NITINI = '';
    NITFIN = 'zz';
    END
/* Ubique el NIT */
EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'FECHA AUTORETENEDOR NO DESCONTAR RETENCIONES DEL SALDO PERO SI CONTABILIZARLAS') returning_values (AUTORET);
if (AUTORET <> '') then
    FAUTORET = CAST(AUTORET AS DATE);
else
    FAUTORET = '9999/12/31';
EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'ANALISIS DE CARTERA CON FECHA FACTURA O VENCIMIENTO') returning_values (VENCIMIENTO);
EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'INCLUIR ANTICIPOS DE CLIENTES EN REPORTES Y CONSULTAS DE CARTERA') returning_values (INCLANTI);
EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'DESCONTAR RECIBOS PROVISIONALES EN INFORMES DE CARTERA') RETURNING_VALUES (:descnt_prov);

FOR select T.TERC_NIT, TERC_NOM, TERC_DV, CLSU_TEL, CLSU_CIUDAD, S.COBR_COD, S.ZONA_COD, T.CIUD_COD, CLIE_CUPO, CLIE_DIAS, CLCU_COD, CLSU_NOMBRE, t.terc_obs, C.GRCA_COD, TERC_CONTACTO, TERC_EMAIL, TERC_FAX, TERC_CEL, CLIE_COD, CLIE_RESALTAR, CLIE_INSTCARTERA
    from terceros T, CLIENTES C, CLIENTE_SUCURSALES S
    where C.TERC_NIT = T.TERC_NIT AND TERC_CLIE = 'S' AND S.TERC_NIT = C.TERC_NIT and T.TERC_NIT >= :NITINI AND T.TERC_NIT <= :NITFIN AND
        T.TERC_NOM >= :NOMINI AND T.TERC_NOM <= :NOMFIN AND ((:GRUPCART = 0) or (C.GRCA_COD = :GRUPCART))
    INTO :NIT, :NOMBRE, :DV, :TELEFONO, :CIUDAD, :CODCOBR, :CODZONA, :CODCIUD, :CUPO, :DIA_CAR,  :SUCURSAL, :NOMSUC, :obs, :GRUPCOD, :CONTACTO, :EMAIL, :FAX, :CEL, :CODCLI, :RESALTAR, INSTCART
    DO  
    BEGIN
    SELECT COBR_NOM FROM COBRADORES CB WHERE COBR_COD = :CODCOBR INTO :NOMCOBR;
    SELECT ZONA_NOM FROM ZONAS Z WHERE ZONA_COD = :CODZONA INTO :NOMZONA;
    SELECT CIUD_NOM FROM CIUDADES WHERE CIUD_COD = :CODCIUD INTO :NOMCIUD;
    SELECT GRCA_NOMBRE FROM GRUPO_CARTERA WHERE GRCA_COD = :GRUPCOD INTO :GRUPNOM;
    provisional = 0;
    MAXDIAS = 0;
    OK = 'N';
    if (AGRUPA = 'Z') then
        BEGIN
        if (GRPINI = '') then
            BEGIN
            if ((CODZONA IS NULL) or (CODZONA >= :GRPINI AND CODZONA <= :GRPFIN)) then
                OK = 'S';
            END
        ELSE
            if (CODZONA >= :GRPINI AND CODZONA <= :GRPFIN) then
                OK = 'S';
        END
    if (AGRUPA = 'I') then
        BEGIN
        if (GRPINI = '') then
            BEGIN
            if ((CODCIUD IS NULL) or (CODCIUD >= :GRPINI AND CODCIUD <= :GRPFIN)) then
                OK = 'S';
            END
        ELSE
            if (CODCIUD >= :GRPINI AND CODCIUD <= :GRPFIN) then
                OK = 'S';
        END
    if (AGRUPA = 'N') then
        OK = 'S';
    if (OK = 'S') then
        BEGIN
        DISPONIBLE = CUPO;
        CORRIENTE = 0;
        CERO = 0;
        TREINTA = 0;
        SESENTA = 0;
        NOVENTA = 0;
        CIENTOCHENTA = 0;
        DOSSETENTA = 0;
        TRESSESENTA = 0;
        /* BUSQUE EN SALDOS_DOC_CARTERA LOS QUE TENGAN SALDO > 0 */
        FOR SELECT MVCL_TIPOREF, MVCL_IDREF, MVCL_PREFREF, MVCL_NUMREF, MVCL_FECHA, MVCL_VENCE
            FROM MOVIMIENTO_CLIENTES
            WHERE TERC_NIT = :NIT AND MVCL_SUCURSAL = :SUCURSAL AND MVCL_FECHA <= :FECHA
                AND MVCL_ABONO = 'N' AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA)) AND
                ((:MONEDA = 0) or (MVCL_TRM <> 1))
            INTO :TIPO, :ID, :PREFIJO, :NUMERO, :FECDOC, :VENCE
            DO
            BEGIN
            if ((inclanti = 'SI') or (TIPO <> 45)) then
                BEGIN
                EXECUTE PROCEDURE saldo_doc_cartera(TIPO, ID, FECHA, MONEDA) returning_values (SALDO);
                if (SALDO <> 0) then
                    BEGIN
                    DISPONIBLE = DISPONIBLE - SALDO;
                    SELECT TIDO_NOMCORTO FROM TIPO_DOCUMENTO WHERE TIDO_COD = :TIPO INTO :TIPONOM;

                    if (MONEDA = 0) then
                        SELECT SUM(SDCA_RTFTE - SDCA_ABRTFTE), SUM(SDCA_RTIVA - SDCA_ABRTIVA), SUM(SDCA_RTICA - SDCA_ABRTICA)
                            FROM SALDOS_DOC_CARTERA WHERE SDCA_TIPOREF = :TIPO AND SDCA_IDREF = :ID
                            INTO :RTFTE, :RTIVA, :RTICA;
                    ELSE
                        SELECT SUM((SDCA_RTFTE - SDCA_ABRTFTE)/SDCA_TRM), SUM((SDCA_RTIVA - SDCA_ABRTIVA)/SDCA_TRM), SUM((SDCA_RTICA - SDCA_ABRTICA)/SDCA_TRM)
                            FROM SALDOS_DOC_CARTERA WHERE SDCA_TIPOREF = :TIPO AND SDCA_IDREF = :ID
                            INTO :RTFTE, :RTIVA, :RTICA;
                    if (RTFTE IS NULL) then
                        RTFTE = 0;
                    if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) THEN
                        BEGIN
                        if (RTFTE > 0) then
                            RTFTE = 0;
                        END
                    ELSE
                        BEGIN
                        if (RTFTE < 0) then
                            RTFTE = 0;
                        END
                    if (FAUTORET <= FECDOC) then
                        RTFTE = 0;
                    if (RTIVA IS NULL) then
                        RTIVA = 0;
                    if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) THEN
                        BEGIN
                        if (RTIVA > 0) then
                            RTIVA = 0;
                        END
                    ELSE
                        BEGIN
                        if (RTIVA < 0) then
                            RTIVA = 0;
                        END
                    if (RTICA IS NULL) then
                        RTICA = 0;
                    if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) THEN
                        BEGIN
                        if (RTICA > 0) then
                            RTICA = 0;
                        END
                    ELSE
                        BEGIN
                        if (RTICA < 0) then
                            RTICA = 0;
                        END
                    /* AHORA CLASIFIQUE LOS DIAS */
                    if (VENCIMIENTO = 'FECHA') then
                        DIAS = FECHA - FECDOC;
                    ELSE
                        DIAS = FECHA - VENCE;
                    if (MAXDIAS < DIAS) then
                        MAXDIAS = DIAS;
                    if (DETALLE = 'S') then
                        BEGIN
                        CORRIENTE = 0;
                        CERO = 0;
                        TREINTA = 0;
                        SESENTA = 0;
                        NOVENTA = 0;
                        CIENTOCHENTA = 0;
                        DOSSETENTA = 0;
                        tressesenta = 0;
                        END
                    if (DIAS < 0) then
                        CORRIENTE = CORRIENTE + SALDO;
                    ELSE
                        if (DIAS < DIASR) then
                            CERO = CERO + SALDO;
                        ELSE
                            if (DIAS < (DIASR * 2)) then
                                TREINTA = TREINTA + SALDO;
                            ELSE
                                if (DIAS < (DIASR * 3)) then
                                    SESENTA = SESENTA + SALDO;
                                ELSE
                                    BEGIN
                                    if (EXTENDIDA = 'N') then
                                        NOVENTA = NOVENTA + SALDO;
                                    else    
                                        BEGIN
                                        if (DIAS < (DIASR * 3) * 2) then
                                            NOVENTA = NOVENTA + SALDO;
                                        ELSE
                                            if (DIAS < (DIASR * 3) * 3) then
                                                CIENTOCHENTA = CIENTOCHENTA + SALDO;
                                            ELSE
                                                if (DIAS < (DIASR * 3) * 4) then
                                                    dossetenta = dossetenta + SALDO;
                                                ELSE
                                                    tressesenta = tressesenta + SALDO;
                                        END
                                    END
                    if (DETALLE = 'S') then
                        SUSPEND;
                    END  /* SALDO */
                END  /* NO ANTICIPO */
            END  /* FOR MOV_CLI */
        /* AGREGUE LOS RECIBOS PROVISIONALES CON SIGNO NEGATIVO */
        FOR SELECT 65, MAX(P.RCPR_ID), MAX(PREF_PRE), MAX(RCPR_NUMERO), MAX(RCPR_FECHA), SUM(RPDE_ABONO* -1), SUM(RPDE_RTFTE*-1), SUM(RPDE_RTIVA*-1), SUM(RPDE_RTICA*-1), MAX(RCPR_TRM)
            FROM RECIBO_PROVISIONAL P, recibo_provisional_detalle D
            WHERE P.rcpr_id = D.rcpr_id AND P.TERC_NIT = :NIT AND D.RPDE_SUCURSAL = :SUCURSAL AND P.RCPR_FECHA <= :FECHA AND P.RCPR_ANULADO = 'N' AND
            ((RCPR_FECCRUCE IS NULL) or (RCPR_FECCRUCE > :FECHA)) AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA)) AND ((:MONEDA = 0) or (RCPR_TRM <> 1))
            GROUP BY P.rcpr_id
            INTO :TIPO, :ID, :PREFIJO, :NUMERO, :FECDOC, :PROVISIONAL, :rtfte,  :RTIVA, :RTICA, :TRM
            DO
            BEGIN
            if ((MONEDA <> 0) AND (TRM <> 0)) then
                BEGIN
                PROVISIONAL = PROVISIONAL / TRM;
                RTFTE = RTFTE / TRM;
                RTIVA = RTIVA / TRM;
                RTICA = RTICA / TRM;
                END
            if (:descnt_prov = 'NO') then
              SALDO = 0;
            else
              SALDO = :PROVISIONAL;
            SELECT TIDO_NOMCORTO FROM TIPO_DOCUMENTO WHERE TIDO_COD = :TIPO INTO :TIPONOM;
            /* CALCULE EL VENCIMIENTO DEL ULTIMO DOCUMENTO POSFECHADO */
            SELECT MAX(RPPA_FECHA) FROM recibo_provisional_pago WHERE RCPR_ID = :ID INTO :VENCE;
            DIAS = VENCE - FECHA;
            if (DETALLE = 'S') then
                BEGIN
                CORRIENTE = 0;
                CERO = 0;
                TREINTA = 0;
                SESENTA = 0;
                NOVENTA = 0;
                CIENTOCHENTA = 0;
                DOSSETENTA = 0;
                tressesenta = 0;
                END
            if (DIAS < 0) then
                CORRIENTE = CORRIENTE + SALDO;
            ELSE
                if (DIAS < DIASR) then
                    CERO = CERO + SALDO;
                ELSE
                    if (DIAS < (DIASR * 2)) then
                        TREINTA = TREINTA + SALDO;
                    ELSE
                        if (DIAS < (DIASR * 3)) then
                            SESENTA = SESENTA + SALDO;
                        ELSE
                            BEGIN
                            if (EXTENDIDA = 'N') then
                                NOVENTA = NOVENTA + SALDO;
                            else
                                BEGIN
                                if (DIAS < (DIASR * 3) * 2) then
                                    NOVENTA = NOVENTA + SALDO;
                                ELSE
                                    if (DIAS < (DIASR * 3) * 3) then
                                        CIENTOCHENTA = CIENTOCHENTA + SALDO;
                                    ELSE
                                        if (DIAS < (DIASR * 3) * 4) then
                                            dossetenta = dossetenta + SALDO;
                                        ELSE
                                            tressesenta = tressesenta + SALDO;
                                END
                            END
            if (DETALLE = 'S') then
                SUSPEND;
            END
        if (DETALLE = 'N') then
            begin
            SALDO = CORRIENTE + CERO + TREINTA + SESENTA + NOVENTA + cientochenta + dossetenta + tressesenta;
            DIAS = MAXDIAS;
            SUSPEND;
            end
        END
    if (AGRUPA = 'C') then
        BEGIN
        FOR SELECT DISTINCT COBR_COD FROM MOVIMIENTO_CLIENTES
            WHERE TERC_NIT = :NIT AND MVCL_SUCURSAL = :SUCURSAL AND MVCL_FECHA <= :FECHA
                AND MVCL_ABONO = 'N' AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA)) AND
                ((:MONEDA = 0) or (MVCL_TRM <> 1))
            INTO :codcobr
            DO
            BEGIN
            OK = 'N';
            if (GRPINI = '') then
                BEGIN
                if ((CODCOBR IS NULL) or (CODCOBR >= :GRPINI AND CODCOBR <= :GRPFIN)) then
                    OK = 'S';
                END
            ELSE
                if (CODCOBR >= :GRPINI AND CODCOBR <= :GRPFIN) then
                    OK = 'S';
            if (OK = 'S') then
                BEGIN
                DISPONIBLE = CUPO;
                CORRIENTE = 0;
                CERO = 0;
                TREINTA = 0;
                SESENTA = 0;
                NOVENTA = 0;
                CIENTOCHENTA = 0;
                DOSSETENTA = 0;
                tressesenta = 0;
                SELECT COBR_NOM FROM COBRADORES WHERE COBR_COD = :codcobr INTO :nomcobr;
                /* BUSQUE EN SALDOS_DOC_CARTERA LOS QUE TENGAN SALDO > 0 */
                FOR SELECT MVCL_TIPOREF, MVCL_IDREF, MVCL_PREFREF, MVCL_NUMREF, MVCL_FECHA, MVCL_VENCE
                    FROM MOVIMIENTO_CLIENTES
                    WHERE TERC_NIT = :NIT AND COBR_COD = :CODCOBR AND MVCL_SUCURSAL = :SUCURSAL AND MVCL_FECHA <= :FECHA
                        AND MVCL_ABONO = 'N' AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA))
                    INTO :TIPO, :ID, :PREFIJO, :NUMERO, :FECDOC, :VENCE
                    DO
                    BEGIN
                    if ((inclanti = 'SI') or (TIPO <> 45)) then
                        BEGIN
                        EXECUTE PROCEDURE saldo_doc_cartera(TIPO, ID, FECHA, MONEDA) returning_values (SALDO);
                        if (SALDO <> 0) then
                            BEGIN
                            DISPONIBLE = DISPONIBLE - SALDO;
                            SELECT TIDO_NOMCORTO FROM TIPO_DOCUMENTO WHERE TIDO_COD = :TIPO INTO :TIPONOM;
                            if (MONEDA = 0) then
                                SELECT SUM(SDCA_RTFTE - SDCA_ABRTFTE), SUM(SDCA_RTIVA - SDCA_ABRTIVA), SUM(SDCA_RTICA - SDCA_ABRTICA)
                                    FROM SALDOS_DOC_CARTERA WHERE SDCA_TIPOREF = :TIPO AND SDCA_IDREF = :ID
                                    INTO :RTFTE, :RTIVA, :RTICA;
                            ELSE
                                SELECT SUM((SDCA_RTFTE - SDCA_ABRTFTE)/SDCA_TRM), SUM((SDCA_RTIVA - SDCA_ABRTIVA)/SDCA_TRM), SUM((SDCA_RTICA - SDCA_ABRTICA)/SDCA_TRM)
                                    FROM SALDOS_DOC_CARTERA WHERE SDCA_TIPOREF = :TIPO AND SDCA_IDREF = :ID
                                    INTO :RTFTE, :RTIVA, :RTICA;
                            if (RTFTE IS NULL) then
                                RTFTE = 0;
                            if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) THEN
                                BEGIN
                                if (RTFTE > 0) then
                                    RTFTE = 0;
                                END
                            ELSE
                                BEGIN
                                if (RTFTE < 0) then
                                    RTFTE = 0;
                                END
                            if (FAUTORET <= FECDOC) then
                                RTFTE = 0;
                            if (RTIVA IS NULL) then
                                RTIVA = 0;
                            if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) THEN
                                BEGIN
                                if (RTIVA > 0) then
                                    RTIVA = 0;
                                END
                            ELSE
                                BEGIN
                                if (RTIVA < 0) then
                                    RTIVA = 0;
                                END
                            if (RTICA IS NULL) then
                                RTICA = 0;
                            if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) THEN
                                BEGIN
                                if (RTICA > 0) then
                                    RTICA = 0;
                                END
                            ELSE
                                BEGIN
                                if (RTICA < 0) then
                                    RTICA = 0;
                                END
                            /* AHORA CLASIFIQUE LOS DIAS */
                            if (VENCIMIENTO = 'FECHA') then
                                DIAS = FECHA - FECDOC;
                            ELSE
                                DIAS = FECHA - VENCE;
                            if (MAXDIAS < DIAS) then
                                MAXDIAS = DIAS;
                            if (DETALLE = 'S') then
                                BEGIN
                                CORRIENTE = 0;
                                CERO = 0;
                                TREINTA = 0;
                                SESENTA = 0;
                                NOVENTA = 0;
                                CIENTOCHENTA = 0;
                                DOSSETENTA = 0;
                                tressesenta = 0;
                                END
                            if (DIAS < 0) then
                                CORRIENTE = CORRIENTE + SALDO;
                            ELSE
                                if (DIAS < DIASR) then
                                    CERO = CERO + SALDO;
                                ELSE
                                    if (DIAS < (DIASR * 2)) then
                                        TREINTA = TREINTA + SALDO;
                                    ELSE
                                        if (DIAS < (DIASR * 3)) then
                                            SESENTA = SESENTA + SALDO;
                                        ELSE
                                            BEGIN
                                            if (EXTENDIDA = 'N') then
                                                NOVENTA = NOVENTA + SALDO;
                                            else    
                                                BEGIN
                                                if (DIAS < (DIASR * 3) * 2) then
                                                    NOVENTA = NOVENTA + SALDO;
                                                ELSE
                                                    if (DIAS < (DIASR * 3) * 3) then
                                                        CIENTOCHENTA = CIENTOCHENTA + SALDO;
                                                    ELSE
                                                        if (DIAS < (DIASR * 3) * 4) then
                                                            dossetenta = dossetenta + SALDO;
                                                        ELSE
                                                            tressesenta = tressesenta + SALDO;
                                                END
                                            END
                            if (DETALLE = 'S') then
                                SUSPEND;
                            END  /* SALDO <>  0 */
                        END  /* NO ANTICIPO */
                    END  /* FOR MOV_CLI */
                /* AGREGUE LOS RECIBOS PROVISIONALES CON SIGNO NEGATIVO */
                FOR SELECT 65, MAX(P.RCPR_ID), MAX(PREF_PRE), MAX(RCPR_NUMERO), MAX(RCPR_FECHA), SUM(RPDE_ABONO * -1), SUM(RPDE_RTFTE*-1), SUM(RPDE_RTIVA*-1), SUM(RPDE_RTICA*-1), MAX(RCPR_TRM)
                    FROM RECIBO_PROVISIONAL P, recibo_provisional_detalle D
                    WHERE P.rcpr_id = D.rcpr_id AND P.TERC_NIT = :NIT AND RPDE_SUCURSAL = :SUCURSAL AND P.VEND_COD = :CODCOBR AND P.RCPR_FECHA <= :FECHA AND P.RCPR_ANULADO = 'N' AND
                    ((RCPR_FECCRUCE IS NULL) or (RCPR_FECCRUCE > :FECHA)) AND ((SUCU_ID = :SUBEMPRESA) OR (:SUBEMPRESA = 0)) AND ((:MONEDA = 0) or (RCPR_TRM <> 1))
                    GROUP BY P.rcpr_id
                    INTO :TIPO, :ID, :PREFIJO, :NUMERO, :FECDOC, :PROVISIONAL, :rtfte,  :RTIVA, :RTICA, :TRM
                    DO
                    BEGIN
                    if ((MONEDA <> 0) AND (TRM <> 0)) then
                        BEGIN
                        PROVISIONAL = PROVISIONAL / TRM;
                        RTFTE = RTFTE / TRM;
                        RTIVA = RTIVA / TRM;
                        RTICA = RTICA / TRM;
                        END
                    if (:descnt_prov = 'NO') then
                      SALDO = 0;
                    else
                      SALDO = :PROVISIONAL;
                    SELECT TIDO_NOMCORTO FROM TIPO_DOCUMENTO WHERE TIDO_COD = :TIPO INTO :TIPONOM;
                    /* CALCULE EL VENCIMIENTO DEL ULTIMO DOCUMENTO POSFECHADO */
                    SELECT MAX(RPPA_FECHA) FROM recibo_provisional_pago WHERE RCPR_ID = :ID INTO :VENCE;
                    DIAS = VENCE - FECHA;
                    if (DETALLE = 'S') then
                        BEGIN
                        CORRIENTE = 0;
                        CERO = 0;
                        TREINTA = 0;
                        SESENTA = 0;
                        NOVENTA = 0;
                        CIENTOCHENTA = 0;
                        DOSSETENTA = 0;
                        tressesenta = 0;
                        END
                    if (DIAS < 0) then
                        CORRIENTE = CORRIENTE + SALDO;
                    ELSE
                        if (DIAS < DIASR) then
                            CERO = CERO + SALDO;
                        ELSE
                            if (DIAS < (DIASR * 2)) then
                                TREINTA = TREINTA + SALDO;
                            ELSE
                                if (DIAS < (DIASR * 3)) then
                                    SESENTA = SESENTA + SALDO;
                                ELSE
                                    BEGIN
                                    if (EXTENDIDA = 'N') then
                                        NOVENTA = NOVENTA + SALDO;
                                    else    
                                        BEGIN
                                        if (DIAS < (DIASR * 3) * 2) then
                                            NOVENTA = NOVENTA + SALDO;
                                        ELSE
                                            if (DIAS < (DIASR * 3) * 3) then
                                                CIENTOCHENTA = CIENTOCHENTA + SALDO;
                                            ELSE
                                                if (DIAS < (DIASR * 3) * 4) then
                                                    dossetenta = dossetenta + SALDO;
                                                ELSE
                                                    tressesenta = tressesenta + SALDO;
                                        END
                                    END
                    if (DETALLE = 'S') then
                        SUSPEND;
                    END
                if (DETALLE = 'N') then
                    begin
                    SALDO = CORRIENTE + CERO + TREINTA + SESENTA + NOVENTA + cientochenta + dossetenta + tressesenta;
                    DIAS = MAXDIAS;
                    SUSPEND;
                    end
                END
            END  /* FOR COBRADOR */
        END
    END  /* FOR NIT */
END
^

SET TERM ; ^

/* 20101004 */
/* POR SI NO TIENE EL CODIGO DEL VENDEDOR */
SET TERM ^ ;

CREATE OR ALTER procedure RUTERO_FACTURA (
    PREF varchar(4),
    NUMERO varchar(6))
returns (
    ID integer,
    CLIENTE varchar(20),
    SUCURSAL varchar(10),
    NOMBRE varchar(60),
    MONTO numeric(18,2),
    CAJAS numeric(18,4),
    VENDEDOR integer)
AS
begin
SELECT FACT_ID, TERC_NIT, FACT_SUCURSAL, FACT_NOMCLIENTE, FACT_TOTAL, VEND_COD
    FROM FACTURAS F WHERE PREF_PRE = :pref AND FACT_NUMERO = :numero AND FACT_ANULADO = 'N' AND
    NOT EXISTS (SELECT RUTE_ID FROM RUTERO_DETALLE WHERE RUTD_FACTID = F.fact_id and rutd_entregado = 'S')
    INTO :ID, :CLIENTE, :SUCURSAL, :NOMBRE, :MONTO, :VENDEDOR;
SELECT SUM(FADE_CAJAS) FROM FACTURAS_DETALLE WHERE FACT_ID = :ID INTO :CAJAS;
if (cajas is null) then
    cajas = 0;
suspend;
end
^

SET TERM ; ^


/* 20101005 */
/* ensambles directos multiplicaba por peso y factor eso solo servia si la unidad era gramo */
SET TERM ^ ;

CREATE OR ALTER TRIGGER MOVIMIENTO_ARTICULO_BI FOR MOVIMIENTO_ARTICULO
ACTIVE BEFORE INSERT POSITION 0
AS
declare variable LOTE CHAR(1);
declare variable ENSAMBLE CHAR(1);
declare variable IDENS INTEGER;
declare variable PREFENS VARCHAR(4);
declare variable unidad varchar(8);
declare variable DESCR varchar(60);
declare variable CODPR varchar(15);
declare variable DESPR varchar(60);
declare variable UNIPR varchar(8);
declare variable CANTPR numeric(18,4);
declare variable FACTOR numeric(18,4);
declare variable COSTO numeric(18,2);
declare variable COSTOTOT numeric(18,2);
declare variable PORCPR numeric(9,4);
declare variable MERMAPR numeric(9,4);
declare variable PESO numeric(18,4);
declare variable PESOPR numeric(18,4);
declare variable ITEM INTEGER;
declare variable IVA NUMERIC(9,4);
declare variable IVAM NUMERIC(18,2);
declare variable CONSUMO NUMERIC(18,2);
declare variable TOTAL float;
declare variable SALDO NUMERIC(18,4);
BEGIN
/* INSERTE EL NUEVO LOTE */
if (NEW.mvar_cant IS NULL) then
    NEW.mvar_cant = 0;
SELECT ARTI_EXIST
    FROM   ARTICULO
    WHERE  ARTICULO.ARTI_COD = NEW.ARTI_COD
    INTO :LOTE;
if (LOTE = 'L') then
    BEGIN
      if ((NEW.mvar_lote IS NULL) or (NEW.mvar_lote = '')) then
        if (new.mvar_entrada = 'S') then
            new.mvar_lote = cast(new.mvar_cons as varchar(15));
        else
            begin
            /* NO HAY LOTE, ENTONCES CALCULELO SEGUN CONFIGURACION */
            EXCEPTION LOTE_NEGATIVO 'No se indicó un lote para el artículo ' || new.arti_cod;
            end
    END
/* ENSAMBLE EL PRODUCTO */
SELECT ARTI_ENSAMBLE, ARTI_UNIDAD, ARTI_DES, ARTI_PESO
    FROM ARTICULO WHERE ARTI_COD = NEW.arti_cod INTO :ensamble, :unidad, :descr, :peso;
if ((NEW.mvar_entrada = 'N') AND (ENSAMBLE = 'S')) then
    BEGIN
    /* verifique si la existecia es insufieciente */
/*    INSERT INTO audi_trig (EVENTO) VALUES ('movarti_bi ensamble' || NEW.arti_cod);*/
    execute procedure saldo_inventario(new.arti_cod, new.bode_cod, new.mvar_fecha) returning_values (:saldo);
/*    INSERT INTO audi_trig (EVENTO) VALUES ('movarti_bi ensamble ' || NEW.arti_cod || ' cant:' || new.mvar_cant || ' saldo:' || :saldo);*/
    if (NEW.mvar_cant > :SALDO) then
        BEGIN
        if (SALDO > 0) then
            SALDO = NEW.mvar_cant - :SALDO;
        else
            SALDO = NEW.mvar_cant;
        IDENS = gen_id(id_ensamble, 1);
        EXECUTE PROCEDURE lee_configuracion('INVENTARIO', 'ENSAMBLES', 'PREFIJO PARA ENSAMBLES AUTOMATICOS AL SACAR PRODUCTOS') returning_values (:prefens);
        /* CALCULE EL COSTO TOTAL DEL ENSAMBLE */
        select sum(arpr_porc) from articulos_producto where arti_cod = NEW.arti_cod into :total;
        COSTOTOT = 0;
        FOR SELECT ARPR_CANT, ARPR_UNIDAD, ARPR_COMP, ARPR_PORC, ARPR_MERMA, ARTI_PESO
            FROM articulos_producto P, ARTICULO A
            WHERE P.ARTI_COD = NEW.arti_cod AND A.arti_cod = P.arpr_comp
            INTO :CANTPR, :UNIPR, :CODPR, :PORCPR, :MERMAPR, :PESOPR
            DO
            BEGIN
            EXECUTE PROCEDURE factor_unidad_cant(:codpr, :unipr) returning_values (:factor);
            EXECUTE PROCEDURE costo_promedio_unidad (:codpr, NEW.mvar_fecha, :UNIPR) returning_values (:COSTO);
            IVAM = costo * cantpr * iva / 100;
            if (((cantpr is null) or (cantpr = 0)) AND (porcpr IS NOT NULL) AND (porcpr <> 0)) then
                BEGIN
                /* ES PORCENTUAL AL PESO LA MEZCLA SOBRE EL 1ER ARTICULO */
                CANTPR = :SALDO * PESO;
                CANTPR = CANTPR / TOTAL * porcpr; /* APLICA LA PROPORCION */
                if ((mermapr IS NOT NULL) AND (mermapr <> 0)) then
                    CANTPR = CANTPR * (100 + mermapr) / 100;
                END
            ELSE
                BEGIN
                CANTPR = CANTPR * :SALDO * pesopr * :FACTOR;
                END
            COSTOTOT = COSTOTOT + COSTO * CANTPR;
            END
        if (NEW.mvar_cant <> 0) then
            COSTO = costotot / NEW.mvar_cant;
        else
            COSTO = 0;
        INSERT INTO ENSAMBLES(ENSA_ID, TIDO_COD, PREF_PRE, BODE_COD, ENSA_NUMERO, ENSA_FECHA, ENSA_CONC, ENSA_REFER, ENSA_CANT, ENSA_UNIDAD, ENSA_FACTOR, ENSA_ANULADO, ENSA_TRANSMIT,
            ARTI_COD, ENSA_DESC, ENSA_CODBAR, ENSA_LOTE, ENSA_OBS, TERC_NIT, ENSA_USUARIO, NUMOK, ENSA_COSTO, LOTE_VENCE, ENSA_CODRETAL, ENSA_CANTRETAL, ENSA_OPER, ENSA_MAQUINA, ENSA_PESO, ENSA_BODRETAL, ENSA_TIPOREF, ENSA_IDREF)
            VALUES (:IDENS, 15, :prefens, NEW.bode_cod, '000001', new.mvar_fecha, new.mvar_conc, '', :SALDO, :unidad, 1, 'N', 'N',
            NEW.arti_cod, :descr, NEW.arti_cod, NEW.mvar_lote, NULL, NULL, USER, 'N', :costo, NULL, NULL, 0, null,  NULL, 0, NEW.bode_cod, NEW.mvar_tipodoc, NEW.mvar_idref);
        /* LOS DETALLES DEL ENSAMBLE */
        ITEM = 0;
        FOR SELECT ARPR_CANT, ARPR_UNIDAD, ARPR_COMP, ARTI_DES, TAIV_PORC, ARTI_CONSUMO, ARPR_PORC, ARPR_MERMA, ARTI_PESO
            FROM articulos_producto P, ARTICULO A, TARIFA_IVA T
            WHERE P.ARTI_COD = NEW.arti_cod AND A.arti_cod = P.arpr_comp AND A.taiv_cod = T.taiv_cod
            INTO :CANTPR, :UNIPR, :CODPR, :DESPR, :IVA, :CONSUMO, :PORCPR, :MERMAPR, :PESOPR
            DO
            BEGIN
            ITEM = ITEM + 1;
            EXECUTE PROCEDURE factor_unidad_cant(:codpr, :unipr) returning_values (:factor);
            EXECUTE PROCEDURE costo_promedio_unidad (:codpr, NEW.mvar_fecha, :UNIPR) returning_values (:COSTO);
            IVAM = costo * cantpr * iva / 100;
            if (((cantpr is null) or (cantpr = 0)) AND (porcpr IS NOT NULL) AND (porcpr <> 0)) then
                BEGIN
                /* ES PORCENTUAL AL PESO LA MEZCLA SOBRE EL 1ER ARTICULO */
                CANTPR = :SALDO * PESO;
                CANTPR = CANTPR / TOTAL * porcpr; /* APLICA LA PROPORCION */
                if ((mermapr IS NOT NULL) AND (mermapr <> 0)) then
                    CANTPR = CANTPR * (100 + mermapr) / 100;
/*                CANTPR = CANTPR / pesopr; /* LO LLEVA A LA UNIDAD PRINCIPAL */
                UNIPR = 'GRAMO';
                END
            ELSE
                BEGIN
                CANTPR = CANTPR * :SALDO; /* * pesopr * FACTOR; */
                END
            INSERT INTO ENSAMBLES_DETALLE(ENSA_ID, ESDE_ITEM, ARTI_COD, BODE_COD, ESDE_CANT, ESDE_UNIDAD, ESDE_COSTO, ESDE_LOTE, ESDE_FACTOR, ESDE_IVAPORC, ESDE_IVAMONTO, ESDE_CONSUMO, ESDE_CODBAR, ESDE_ANULADO, ESDE_TRANSMIT, ESDE_DESC, ESDE_TOTAL, ESDE_PESO)
                VALUES (:idens, :ITEM, :codpr,  NEW.bode_cod, :cantpr, :unipr, :costo, NULL, :FACTOR, :IVA, :ivam, :consumo, :codpr, 'N', 'N', :despr, :COSTO * :cantpr, 0);
            END
        END
    END
if (new.mvar_cons is null) then
    NEW.mvar_cons = GEN_ID(ID_MOVARTI,1);
END
^

SET TERM ; ^


/* 20101006 */
/* CALCULO DE PRECIOS SE PIERDEN DECIMALES DEL PORCENTAJE POR PRECISION DE LA VARIABLE */
SET TERM ^ ;

CREATE OR ALTER procedure SUGIERE_PRECIO (
    ARTICULO varchar(20),
    CODLISTA integer,
    FECHA date,
    PORC numeric(9,4),
    UOM char(1))
returns (
    PRECIO numeric(18,2))
AS
declare variable LISTA INTEGER;
declare variable COSTOP NUMERIC(18, 2);
declare variable COSTOU NUMERIC(18, 2);
declare variable DIG INTEGER;
declare variable IVAINC CHAR(1);
declare variable TARIVA NUMERIC(9,2);
declare variable BASE varchar(10);
declare variable CAMBIO CHAR(7);
declare variable AUX FLOAT;
BEGIN
EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION','ARTICULOS','CAMBIO DE PRECIOS AUTOMATICO AL CAMBIAR COSTO O PRECIO') returning_values (CAMBIO);
EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION', 'ARTICULOS', 'REDONDEO AL MULTIPLO DE DIEZ EN PRECIOS') RETURNING_VALUES (:DIG);
SELECT LIPR_MODIF FROM lista_precios WHERE LIPR_COD = :codlista INTO :ivainc;
SELECT TAIV_PORC FROM ARTICULO A, TARIFA_IVA T
    WHERE A.TAIV_COD = T.TAIV_COD AND ARTI_COD = :ARTICULO INTO :TARIVA;
if (CAMBIO = 'COSTO') then
  BEGIN
  SELECT GRUP_BASEPRECIO FROM GRUPO G, ARTICULO A WHERE G.GRUP_COD = A.grup_cod AND A.ARTI_COD = :articulo INTO :BASE;
  if ((BASE IS NULL) or (BASE = '')) then
    EXECUTE PROCEDURE lee_configuracion('FACTURACION','ARTICULOS','COSTO BASE PARA CALCULO DE PRECIOS DE VENTA AUTOMATICOS') returning_values (:BASE);
  EXECUTE PROCEDURE costo_promedio_y_ultimo (:ARTICULO, :FECHA) RETURNING_VALUES(:COSTOP, :COSTOU);
  if (base = 'ULTIMO') then
    AUX = COSTOU;
  ELSE
    BEGIN
    AUX = COSTOP;
    if (base = 'MAYOR') then
        if (COSTOP < COSTOU) then
            AUX = COSTOU;
    END
  END
ELSE
  if (CAMBIO = 'PRECIO') then
    BEGIN
    EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION','ARTICULOS','CODIGO DE LA LISTA DE PRECIOS BASE PARA CAMBIO DE PRECIOS AUTOMATICO') returning_values (LISTA);
    SELECT PRAR_FIJO FROM PRECIOS_ARTICULO WHERE LIPR_COD = :LISTA AND ARTI_COD = :articulo INTO :AUX;
    END
if (IVAINC = 'S') then
    AUX = AUX * (1 + TARIVA/100);
if (UOM = 'U') then
    BEGIN
    AUX = AUX * (1 + :PORC/100);
    EXECUTE PROCEDURE REDONDEE (AUX, DIG) returning_values (PRECIO);
    END
ELSE
    BEGIN
    AUX = AUX / (1 - :PORC/100);
    EXECUTE PROCEDURE REDONDEE (PRECIO, DIG) returning_values (PRECIO);
    END
SUSPEND;
END
^

SET TERM ; ^


/* 20101006E */
/* NO INICIALIZABA LAS COLUMNAS DE COMISIONES PODIAN REPETIRSE DEVOLUCIONES */
SET TERM ^ ;

CREATE OR ALTER procedure COMISIONES_ARTICULO (
    DETALLE char(1),
    DESDE varchar(2),
    HASTA varchar(2),
    FECINI date,
    FECFIN date,
    ARTINI varchar(15),
    ARTFIN varchar(15),
    CEROS char(1),
    AGENCIA integer)
returns (
    CODVEND varchar(2),
    NOMVEND varchar(60),
    NOMTIPO varchar(10),
    ARTICULO varchar(15),
    DESCRIPCION varchar(60),
    CODGRUPO varchar(2),
    NOMGRUPO varchar(30),
    CODSUBG varchar(3),
    NOMSUBG varchar(30),
    CODMARC varchar(3),
    NOMMARC varchar(30),
    UNIDAD varchar(8),
    CANTVTAS numeric(18,4),
    CANTDEV numeric(18,4),
    BASEVTAS numeric(18,2),
    BASEDEV numeric(18,2),
    PORC numeric(18,2),
    COMISION numeric(18,2),
    PREFIJO varchar(4),
    NUMERO varchar(6),
    FECHA date)
AS
declare variable COMIPOR NUMERIC(9,2);
declare variable COMIMONTO NUMERIC(18,2);
declare variable LISTA VARCHAR(6);
declare variable COMIPPOR NUMERIC(9,2);
declare variable COMIPMONTO NUMERIC(18,2);
declare variable IDFAC INTEGER;
declare variable COMIXVND CHAR(2);
BEGIN
EXECUTE PROCEDURE lee_configuracion ('FACTURACION', 'ARTICULOS', 'COMISIONES POR ARTICULO POR GRUPO O POR LISTA DE PRECIOS') returning_values (LISTA);
EXECUTE PROCEDURE lee_configuracion ('FACTURACION', 'ARTICULOS', 'COMISION POR ARTICULO Y PROPORCION POR VENDEDOR') returning_values (comixvnd);
FOR select VEND_COD, VEND_NOMBRE
    from VENDEDORES
    where VEND_COD >= :DESDE AND VEND_COD <= :HASTA AND ((:AGENCIA = 0) or (SUCU_ID = :AGENCIA))
    INTO :CODVEND, :NOMVEND
    DO  
    BEGIN
    FOR SELECT ARTI_COD, ARTI_DES, ARTI_UNIDAD, A.GRUP_COD, GRUP_NOM, A.SUBG_COD, A.MARC_COD, GRUP_COMIPOR, GRUP_COMIMONTO
        FROM ARTICULO A, GRUPO G
        WHERE ARTI_COD >= :ARTINI AND ARTI_COD <= :ARTFIN AND A.GRUP_COD = G.GRUP_COD and substring(a.arti_cod from 1 FOR 2) <> '.t'
      INTO :ARTICULO, :DESCRIPCION, :UNIDAD, :CODGRUPO, :NOMGRUPO, :CODSUBG, :CODMARC, :COMIPOR, :COMIMONTO
      DO
        BEGIN
        SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
        SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
        if (COMIMONTO IS null) then
            COMIMONTO = 0;
        BASEDEV = 0;
        BASEVTAS = 0;
        CANTDEV = 0;
        CANTVTAS = 0;
        if (DETALLE = 'N') then
            BEGIN
            if (LISTA = 'GRUPO') then
                BEGIN
                SELECT SUM(FADE_CANT * FADE_FACTOR), SUM(FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO)
                    FROM FACTURAS_DETALLE D, FACTURAS F
                    WHERE F.FACT_ID = D.FACT_ID AND ARTI_COD = :ARTICULO AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND VEND_COD = :CODVEND AND FACT_ANULADO = 'N'
                    INTO :CANTVTAS, :BASEVTAS;
                SELECT SUM(DVDE_CANT * DVDE_FACTOR), SUM(DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO)
                    FROM devoluciones_ventas_detalle D, DEVOLUCIONES_VENTAS V
                    WHERE V.DEVT_ID = D.DEVT_ID AND ARTI_COD = :ARTICULO AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND VEND_COD = :CODVEND AND DEVT_ANULADO = 'N'
                    INTO :CANTDEV, :BASEDEV;
                if (CANTVTAS IS NULL) then
                    CANTVTAS = 0;
                if (CANTDEV IS NULL) then
                    CANTDEV = 0;
                if (BASEVTAS IS NULL) then
                    BASEVTAS = 0;
                if (BASEDEV IS NULL) then
                    BASEDEV = 0;
                if (COMIMONTO > 0) then
                    BEGIN
                    COMISION = (CANTVTAS - CANTDEV) * COMIMONTO;
                    PORC = COMISION * 100 / (BASEVTAS - BASEDEV);
                    END
                ELSE
                    BEGIN
                    COMISION = (BASEVTAS - BASEDEV) * COMIPOR / 100;
                    PORC = COMIPOR;
                    END
                if (comixvnd = 'SI') then
                    begin
                    COMIPOR = 100;
                    SELECT MAX(COMI_PORC) FROM comisiones WHERE VEND_COD = :codvend AND
                        COMI_INICIAL <= (:BASEVTAS - :BASEDEV) AND COMI_FINAL >= (:BASEVTAS - :BASEDEV) INTO :comipor;
                    porc = PORC * COMIPOR;
                    end
                if (CEROS = 'S') then
                    SUSPEND;
                ELSE
                    if ((CANTVTAS <> 0) OR (CANTDEV <> 0)) then
                        SUSPEND;
                END
            ELSE
                BEGIN
                SELECT SUM(FADE_CANT * FADE_FACTOR), SUM(FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), SUM((FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO)*P.prar_comi/100)
                    FROM FACTURAS_DETALLE D, FACTURAS F, PRECIOS_ARTICULO P
                    WHERE F.FACT_ID = D.FACT_ID AND D.arti_cod = P.arti_cod AND D.lipr_cod = P.lipr_cod AND D.ARTI_COD = :ARTICULO AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND VEND_COD = :CODVEND AND FACT_ANULADO = 'N'
                    INTO :CANTVTAS, :BASEVTAS, :COMISION;
                SELECT SUM(DVDE_CANT * DVDE_FACTOR), SUM(DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO)
                    FROM devoluciones_ventas_detalle D, DEVOLUCIONES_VENTAS V
                    WHERE V.DEVT_ID = D.DEVT_ID AND D.ARTI_COD = :ARTICULO AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND VEND_COD = :CODVEND AND DEVT_ANULADO = 'N'
                    INTO :CANTDEV, :BASEDEV;
                if (CANTVTAS IS NULL) then
                    CANTVTAS = 0;
                if (CANTDEV IS NULL) then
                    CANTDEV = 0;
                if (BASEVTAS IS NULL) then
                    BASEVTAS = 0;
                if (BASEDEV IS NULL) then
                    BASEDEV = 0;
                if (COMISION IS NULL) then
                    COMISION = 0;
                if (COMIMONTO IS NULL) then
                    COMIMONTO = 0;
                if (BASEVTAS <> 0) then
                    PORC = COMISION / BASEVTAS;
                else
                    PORC = 0;
                if (basedev <> 0) then
                    COMISION = (BASEVTAS - BASEDEV) * PORC;
                PORC = PORC * 100;
                if (CEROS = 'S') then
                    SUSPEND;
                ELSE
                    if ((CANTVTAS <> 0) OR (CANTDEV <> 0)) then
                        SUSPEND;
                END
            END
        ELSE
            BEGIN
            SELECT TIDO_NOMCORTO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 31 INTO :NOMTIPO;
            FOR SELECT PREF_PRE, FACT_NUMERO, FACT_FECHA, FADE_CANT * FADE_FACTOR, FADE_TOTAL - FADE_IVAMONTO - FADE_CONSUMO, P.prar_comi, P.prar_comimonto
                FROM FACTURAS F, FACTURAS_DETALLE D, precios_articulo P
                WHERE F.FACT_ID = D.FACT_ID AND D.arti_cod = P.arti_cod AND D.lipr_cod = P.lipr_cod AND D.ARTI_COD = :ARTICULO AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND VEND_COD = :CODVEND AND FACT_ANULADO = 'N'
                INTO :PREFIJO, :NUMERO, :FECHA, :CANTVTAS, :BASEVTAS, :comippor, :comipmonto
                DO
                BEGIN
                if (CANTVTAS IS NULL) then
                    CANTVTAS = 0;
                if (BASEVTAS IS NULL) then
                    BASEVTAS = 0;
                if (LISTA = 'GRUPO') then
                    BEGIN
                    if (COMIMONTO > 0) then
                        BEGIN
                        COMISION = CANTVTAS * COMIMONTO;
                        PORC = COMISION * 100 / BASEVTAS;
                        END
                    ELSE
                        BEGIN
                        COMISION = BASEVTAS * COMIPOR / 100;
                        PORC = COMIPOR;
                        END
                    END
                ELSE
                    BEGIN
                    if (COMIPMONTO > 0) then
                        BEGIN
                        COMISION = CANTVTAS * COMIPMONTO;
                        PORC = COMISION * 100 / BASEVTAS;
                        END
                    ELSE
                        BEGIN
                        COMISION = BASEVTAS * COMIPPOR / 100;
                        PORC = COMIPPOR;
                        END
                    END
                SUSPEND;
                END
            SELECT TIDO_NOMCORTO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 33 INTO :NOMTIPO;
            FOR SELECT PREF_PRE, DEVT_NUMERO, DEVT_FECHA, DVDE_CANT * DVDE_FACTOR, DVDE_TOTAL - DVDE_IVAMONTO - DVDE_CONSUMO, V.devt_factid
                FROM DEVOLUCIONES_VENTAS V, DEVOLUCIONES_VENTAS_DETALLE D
                WHERE V.DEVT_ID = D.DEVT_ID AND D.ARTI_COD = :ARTICULO AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND VEND_COD = :CODVEND AND DEVT_ANULADO = 'N'
                INTO :PREFIJO, :NUMERO, :FECHA, :CANTDEV, :BASEDEV, :idfac
                DO
                BEGIN
                if (CANTDEV IS NULL) then
                    CANTDEV = 0;
                if (BASEDEV IS NULL) then
                    BASEDEV = 0;
                if (LISTA = 'GRUPO') then
                    BEGIN
                    if (COMIMONTO > 0) then
                        BEGIN
                        COMISION = CANTDEV * COMIMONTO * -1;
                        PORC = COMISION * 100 / BASEDEV;
                        END
                    ELSE
                        BEGIN
                        COMISION = BASEDEV * COMIPOR / 100 * -1;
                        PORC = COMIPOR;
                        END
                    END
                ELSE
                    BEGIN
                    /*  BUSQUE EL PRECIO DE LA FACTURA */
                    COMIPMONTO = 0;
                    COMIPPOR = 0;
                    SELECT P.prar_comi, P.prar_comimonto FROM FACTURAS_DETALLE D, PRECIOS_ARTICULO P
                        WHERE D.arti_cod = P.arti_cod AND D.lipr_cod = P.lipr_cod AND D.ARTI_COD = :articulo AND FACT_ID = :idfac INTO :comippor, :comipmonto;
                    if (COMIPMONTO > 0) then
                        BEGIN
                        COMISION = CANTDEV * COMIPMONTO * -1;
                        PORC = COMISION * 100 / BASEDEV;
                        END
                    ELSE
                        BEGIN
                        COMISION = BASEDEV * COMIPPOR / 100 * -1;
                        PORC = COMIPPOR;
                        END
                    END
                SUSPEND;
                END
            END
        END
    END
END
^

SET TERM ; ^

/* 20101007 */
CREATE EXCEPTION CANTIDAD_CRUCE_MAYOR 'La cantidad del artículo usada es mayor a la original';

SET TERM ^ ;

create or alter trigger CONSOLIDADO_FALTANTES_BI for CONSOLIDADO_FALTANTES
active BEFORE INSERT position 0
as
declare variable cant numeric(18,2);
declare variable cantori numeric(18,2);
begin
if (new.cofa_ok = 'S') then
    begin
    cantori = 0;
    select sum(cofa_cant*cofa_factor) from consolidado_faltantes
        where cofa_tipoori = new.cofa_tipoori and cofa_idori = new.cofa_idori and cofa_ok = 'S' and cofa_itemori = new.cofa_itemori
        into :cant;
    if (new.cofa_tipoori = 31) then
        select fade_cant * fade_factor from facturas_detalle where fact_id = new.cofa_idori and fade_item = new.cofa_itemori
        into :cantori;
    if (new.cofa_tipoori = 32) then
        select rvde_cant * rvde_factor from remisiones_venta_detalle where revt_id = new.cofa_idori and rvde_item = new.cofa_itemori
        into :cantori;
    if (new.cofa_tipoori = 21) then
        select fcde_cant * fcde_factor from facturas_compras_detalle where faco_id = new.cofa_idori and fcde_item = new.cofa_itemori
        into :cantori;
    if (new.cofa_tipoori = 22) then
        select rpvd_cant * rpvd_factor from remision_proveedor_det where repr_id = new.cofa_idori and rpvd_item = new.cofa_itemori
        into :cantori;
    if ((cant + (new.cofa_cant * new.cofa_factor)) > cantori) then
        exception cantidad_cruce_mayor 'La cantidad a cruzar (' || new.cofa_cant || ') del artículo ' || new.arti_cod || ' es mayor a la cantidad original (' || :cantori || ') menos lo previamente cruzado (' || :cant || ')';
    end
end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER CONSOLIDADO_FALTANTES_BU FOR CONSOLIDADO_FALTANTES
ACTIVE BEFORE UPDATE POSITION 0
as
declare variable cant numeric(18,2);
declare variable cantori numeric(18,2);
begin
if (new.cofa_ok = 'S') then
    begin
    cantori = 0;
    select sum(cofa_cant*cofa_factor) from consolidado_faltantes
        where cofa_tipoori = new.cofa_tipoori and cofa_idori = new.cofa_idori and cofa_ok = 'S' and cofa_itemori = new.cofa_itemori
        into :cant;
    if (new.cofa_tipoori = 31) then
        select fade_cant * fade_factor from facturas_detalle where fact_id = new.cofa_idori and fade_item = new.cofa_itemori
        into :cantori;
    if (new.cofa_tipoori = 32) then
        select rvde_cant * rvde_factor from remisiones_venta_detalle where revt_id = new.cofa_idori and rvde_item = new.cofa_itemori
        into :cantori;
    if (new.cofa_tipoori = 21) then
        select fcde_cant * fcde_factor from facturas_compras_detalle where faco_id = new.cofa_idori and fcde_item = new.cofa_itemori
        into :cantori;
    if (new.cofa_tipoori = 22) then
        select rpvd_cant * rpvd_factor from remision_proveedor_det where repr_id = new.cofa_idori and rpvd_item = new.cofa_itemori
        into :cantori;
    if ((cant + (new.cofa_cant * new.cofa_factor)) > cantori) then
        exception cantidad_cruce_mayor 'La cantidad a cruzar (' || new.cofa_cant || ') del artículo ' || new.arti_cod || ' es mayor a la cantidad original (' || :cantori || ') menos lo previamente cruzado (' || :cant || ')';
    end
end
^

SET TERM ; ^


/* 20101007B */
/* RESTABA LA ULTIMA TARIFA DEL TOTAL DEJANDO EL COMPROBANTE CONTABLE DESCUADRADO */
SET TERM ^ ;

CREATE OR ALTER procedure CONTABIL_DEVOLCLI (
    IDDOC integer,
    IDINTER integer)
returns (
    ERROR integer,
    VER char(1),
    IDC integer)
AS
declare variable PREF VARCHAR(4);
declare variable NUM VARCHAR(6);
declare variable NUMERO VARCHAR(10);
declare variable FECAUX DATE;
declare variable FECHA CHAR(8);
declare variable CONC CHAR(120);
declare variable NUMFAC VARCHAR(10);
declare variable VRDTO NUMERIC(18, 2);
declare variable VRADIC NUMERIC(18, 2);
declare variable VRSUBT NUMERIC(18, 2);
declare variable VRIVA NUMERIC(18, 2);
declare variable PRTFTE NUMERIC(9, 2);
declare variable VRRTFTE NUMERIC(18, 2);
declare variable VRRTIVA NUMERIC(18, 2);
declare variable PRTICA NUMERIC(9, 2);
declare variable VRRTICA NUMERIC(18, 2);
declare variable VRTOTAL NUMERIC(18, 2);
declare variable VREXTRA NUMERIC(18, 2);
declare variable TIPOCOMP VARCHAR(3);
declare variable PREFCONT VARCHAR(4);
declare variable VENTAS CHAR(1);
declare variable CTAVENTAS VARCHAR(20);
declare variable IVA CHAR(1);
declare variable CTAIVA VARCHAR(20);
declare variable CONSUMO CHAR(1);
declare variable CTACONSUMO VARCHAR(20);
declare variable CARTERA CHAR(1);
declare variable CTACARTERA VARCHAR(20);
declare variable RTFTE CHAR(1);
declare variable CTARTFTE VARCHAR(20);
declare variable RTIVA CHAR(1);
declare variable CTARTIVA VARCHAR(20);
declare variable RTICA CHAR(1);
declare variable CTARTICA VARCHAR(20);
declare variable INVEN CHAR(1);
declare variable CTAINVEN VARCHAR(20);
declare variable COSTOS CHAR(1);
declare variable CTACOSTOS VARCHAR(20);
declare variable CTADTO VARCHAR(20);
declare variable CTAADIC VARCHAR(20);
declare variable CTAEXTRA VARCHAR(20);
declare variable EXISTE CHAR(1);
declare variable CUENTA VARCHAR(20);
declare variable MONTO NUMERIC(18,2);
declare variable TIPOCUEN CHAR(1);
declare variable NIT VARCHAR(20);
declare variable PROY VARCHAR(4);
declare variable CENTRO VARCHAR(4);
declare variable PROYI VARCHAR(4);
declare variable CENTI VARCHAR(4);
declare variable PORC NUMERIC(5,2);
declare variable DEBITO NUMERIC(18,2);
declare variable CREDITO NUMERIC(18,2);
declare variable NROI INTEGER;
declare variable ART VARCHAR(15);
declare variable IMPINC CHAR(1);
declare variable IMPTOS NUMERIC(18, 2);
declare variable SUMA NUMERIC(18,2);
declare variable PORCIVA NUMERIC(9,2);
declare variable TCTACLIEN VARCHAR(20);
declare variable TCTAVENTA VARCHAR(20);
declare variable TCTARTFTE VARCHAR(20);
declare variable TCTARTIVA VARCHAR(20);
declare variable TCTARTICA VARCHAR(20);
declare variable CTADIC VARCHAR(20);
declare variable BASEADIC VARCHAR(20);
declare variable PORCADIC NUMERIC(5,2);
declare variable VALORADIC NUMERIC(18,2);
declare variable DBADIC CHAR(1);
declare variable PTOVTA INTEGER;
declare variable ANULADO CHAR(1);
declare variable CENT CHAR(1);
DECLARE VARIABLE MERCANCIA NUMERIC(18,2);
declare variable FACTOR DOUBLE PRECISION;
declare variable DIG INTEGER;
DECLARE VARIABLE FOMENTO VARCHAR(2);
DECLARE VARIABLE VRCONSUMO NUMERIC(18,2);
declare variable AUTORET VARCHAR(10);
declare variable FAUTORET DATE;
declare variable IDREM INTEGER;
declare variable IDPED INTEGER;
declare variable DTOXIT CHAR(2);
declare variable ERRORC INTEGER;
declare variable DEC2799 char(2);
declare variable ctadtoiva varchar(20);
declare variable ICOING CHAR(2);
BEGIN
EXECUTE PROCEDURE lee_configuracion ('FACTURACION', 'FACTURAS', 'DESCONTAR IVA DE PRODUCTOS DECRETO 2799') returning_values (:DEC2799);
EXECUTE PROCEDURE LEE_CONFIGURACION('COMPRAS', 'FACTURAS', 'USAR IMPOCONSUMO COMO PORCENTAJE DE FOMENTO') returning_values (FOMENTO);
EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'FECHA AUTORETENEDOR NO DESCONTAR RETENCIONES DEL SALDO PERO SI CONTABILIZARLAS') returning_values (AUTORET);
EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION', 'ARTICULOS', 'IMPOCONSUMO COMO MAYOR VALOR DEL COSTO Y DEL INGRESO') returning_values (ICOING);
if (AUTORET <> '') then
    FAUTORET = CAST(AUTORET AS DATE);
else
    FAUTORET = '9999/12/31';
  /* BUSQUE LA INTERFACE */
  EXISTE = 'N';
  SELECT 'S', TICO_COD, PRCO_PRE, INVE_VENTAS, INVE_IVA, INVE_CONSUMO, INVE_CARTERA, INVE_RTFTE, INVE_RTIVA, INVE_RTICA, INVE_COSTO, INVE_INVEN, INVE_CTAVENTAS, INVE_CTAIVA, INVE_CTACONSUMO, INVE_CTADTO, INVE_CTAADIC, INVE_CTAEXTRA, INVE_CTACARTERA, INVE_CTARTFTE, INVE_CTARTIVA, INVE_CTARTICA, INVE_CTAINVEN, INVE_CTACOSTOS, INVE_CONFIRMAR, INVE_CENTRO
    FROM INTERFAZ_VENTAS
    WHERE INVE_ID = :IDINTER
    INTO :EXISTE, :TIPOCOMP, :PREFCONT, :VENTAS, :IVA, :CONSUMO, :CARTERA, :RTFTE, :RTIVA, :RTICA, :COSTOS, :INVEN, :CTAVENTAS, :CTAIVA, :CTACONSUMO, :CTADTO, :CTAADIC, :CTAEXTRA, :CTACARTERA, :CTARTFTE, :CTARTIVA, :CTARTICA, :CTAINVEN, :CTACOSTOS, :VER, :CENT;
  if (EXISTE = 'S') then
   BEGIN
    /* BORRE CUALQUEIR CONTABILIZACION PREVIA */
    DELETE FROM CONTABILIZACION WHERE CNTB_TIPOREF = 33 AND CNTB_IDREF = :IDDOC;
    /* TRAIGA EL ENCABEZADO DE LA DEVOLUCION */
   SELECT PREF_PRE, DEVT_NUMERO, DEVT_FECHA, F.TERC_NIT, DEVT_IVAINC, PTVT_ID, DEVT_FACTURA, DEVT_DTOMONTO, DEVT_ADICIONAL, DEVT_IVAMONTO, DEVT_EXTRA, DEVT_TOTAL, DEVT_RTFTEPORC, DEVT_RTFTEMONTO, DEVT_RTIVAPORC, DEVT_RTIVAMONTO, DEVT_RTICAPORC, DEVT_RTICAMONTO, TERC_CTARTFTE, TERC_CTARTIVA, TERC_CTARTICA, TERC_CTAVENTA, TERC_CTACLIENTE, DEVT_ANULADO, DEVT_REMID, DEVT_PEDID
        FROM DEVOLUCIONES_VENTAS F, TERCEROS T
        WHERE DEVT_ID = :IDDOC AND F.TERC_NIT = T.TERC_NIT
        INTO :PREF, :NUM, :FECAUX, :NIT, :IMPINC, :PTOVTA, :NUMFAC, :VRDTO, :VRADIC, :VRIVA, :VREXTRA, :VRTOTAL, :PRTFTE, :VRRTFTE, :PORC, :VRRTIVA, :PRTICA, :VRRTICA, :TCTARTFTE, TCTARTIVA, TCTARTICA, TCTAVENTA, TCTACLIEN, ANULADO, :IDREM, :IDPED;
   if (idrem is null) Then
    IDREM = 0;
   if (idped is null) Then
    IDPED = 0;
   if ((ANULADO = 'N') AND (IDREM = 0) AND (IDPED = 0)) then
    BEGIN
    NUMERO = PREF || NUM;
    SELECT SUM(DVDE_CONSUMO) FROM devoluciones_ventas_detalle WHERE DEVT_ID = :iddoc AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
        INTO :MERCANCIA;
    VRSUBT = VRTOTAL - VREXTRA - VRIVA - MERCANCIA; /* BASE DE RETEFTE Y RETEICA */
    EXECUTE PROCEDURE lee_configuracion ('FACTURACION', 'DEVOLUCIONES', 'DESCUENTO PIE DEVOLUCION IGUAL A SUMA DE DESCUENTOS POR ITEM') returning_values (:DTOXIT);
    if (DTOXIT = 'SI') then
        VRDTO = 0;
    MERCANCIA = VRSUBT - VRADIC + VRDTO;
    IF (CENT = 'B') THEN
        SELECT B.BODE_CENTRO, B.BODE_PROY FROM BODEGA B, DEVOLUCIONES_VENTAS F
            WHERE B.BODE_COD = F.BODE_COD AND F.DEVT_ID = :IDDOC INTO :CENTRO, :PROY;
    IF (CENT = 'V') THEN
        SELECT V.CENT_COD, V.PROY_COD FROM VENDEDORES V, DEVOLUCIONES_VENTAS F
            WHERE V.VEND_COD = F.VEND_COD AND F.DEVT_ID = :IDDOC INTO :CENTRO, :PROY;
    IF (CENT = 'P') THEN
        SELECT P.PREF_CENTRO,P.PREF_PROY  FROM PREFIJOS P, DEVOLUCIONES_VENTAS F
            WHERE P.PREF_PRE = F.PREF_PRE AND F.DEVT_ID = :IDDOC AND P.TIDO_COD = 33 INTO :CENTRO, :PROY;
    EXECUTE PROCEDURE FECHA_A_CONTA(:FECAUX) returning_values (:FECHA);
    /* REGISTRE EL ENCABEZADO CONTABLE */
    IDC = GEN_ID(ID_CONTABILIZA, 1);
    CONC = 'DEVOLUCION VENTAS No. ' || NUMERO || ' EN FACTURA ' || NUMFAC;
    CONC = SUBSTR(CONC, 1, 60);
    INSERT INTO CONTABILIZACION (CNTB_ID, CNTB_TIPOCOMP, CNTB_PREFCNT, CNTB_NUMERO, CNTB_FECHA, CNTB_CONCEPTO, CNTB_REF, CNTB_TIPOREF, CNTB_IDREF, CNTB_PREFREF, CNTB_NUMREF, CNTB_PROCESADO)
        VALUES (:IDC, :TIPOCOMP, :PREFCONT, :NUM, :FECHA, :CONC, '', 33, :IDDOC, :PREF, :NUM, 'N');
    NROI = 0;
    SUMA = 0;
    ERROR = 0;
    /* SI NO HAY CUENTA DE DESCUENTO NI ADICIONAL CALCULE UN FACTOR PARA LAS VENTAS Y EL IVA */
    if (MERCANCIA <> 0) then
        FACTOR = CAST(VRSUBT AS DOUBLE PRECISION) / CAST(MERCANCIA AS DOUBLE PRECISION);
    ELSE
        FACTOR = 1;
    /* TRAIGA EL NUMERO DE DIGITOS PARA EL REDONDEO */
    SELECT CAST(CONF_VALOR AS INTEGER) FROM CONFIGURACION WHERE CONF_MODULO = 'FACTURACION' AND
        CONF_CATEGORIA = 'GENERAL' AND CONF_PROPIEDAD = 'REDONDEO AL MULTIPLO DE DIEZ EN TOTALES' INTO :DIG;
    /* CUENTAS DE VENTAS */
    if (VENTAS = 'A') then
        BEGIN
        FOR SELECT MAX(COAR_CTADEV), SUM(DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO), SUM(DVDE_IVAMONTO), SUM(DVDE_CONSUMO), MAX(B.bode_proy), MAX(B.bode_centro)
            FROM ARTICULO A, CONTABIL_ARTICULO C, DEVOLUCIONES_VENTAS_DETALLE F, BODEGA B
            WHERE F.DEVT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND B.bode_cod = F.bode_cod AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
            GROUP BY COAR_CTADEV
            INTO :CTAVENTAS, :MONTO, :IMPTOS, :VRCONSUMO, :proyi, :centi
            DO
            BEGIN
            if ((FOMENTO = 'SI') or (icoing = 'SI')) then
                MONTO = MONTO + VRCONSUMO;
            if ((CTADTO IS NULL) OR (CTADTO = '')) then
                MONTO = MONTO * FACTOR;
            execute procedure redondee(MONTO, DIG) returning_values (MONTO);
            if (MONTO <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTAVENTAS, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT F.ARTI_COD, (DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO), (DVDE_IVAMONTO+DVDE_CONSUMO)
                        FROM ARTICULO A, CONTABIL_ARTICULO C, DEVOLUCIONES_VENTAS_DETALLE F
                        WHERE F.DEVT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTAINV = :CUENTA AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
                        INTO :ART, :MONTO, :IMPTOS
                    DO
                        BEGIN
                        if (IMPINC = 'S') then
                            MONTO = MONTO - IMPTOS;
                        if ((CTADTO IS NULL) OR (CTADTO = '')) then
                            MONTO = MONTO * FACTOR;
                        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        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, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                    NROI = NROI + 1;
                    SUMA = SUMA + MONTO;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    IF (CENT = 'B') THEN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROYI, :CENTI, NULL, NULL, NULL, NULL, 0, 0);
                    ELSE
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA + MONTO;
                    END
                END /* MONTO <> 0 */
            END /* FOR */
        END /* VENTAS X ARTICULO */
     IF ((VENTAS = 'C') OR (VENTAS = 'K')) THEN
        BEGIN
        IF (VENTAS = 'C') THEN
            CTAVENTAS = TCTAVENTA;
        SELECT SUM(DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO), SUM(DVDE_IVAMONTO), SUM(DVDE_CONSUMO)
            FROM DEVOLUCIONES_VENTAS_DETALLE F
            WHERE F.DEVT_ID = :IDDOC  AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
            INTO :MONTO, :IMPTOS, :VRCONSUMO;
        if ((FOMENTO = 'SI') or (icoing = 'SI')) then
            MONTO = MONTO + VRCONSUMO;
        if ((CTADTO IS NULL) OR (CTADTO = '')) then
            MONTO = MONTO * FACTOR;
        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
        if (MONTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTAVENTAS, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT F.ARTI_COD, (DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO), (DVDE_IVAMONTO+DVDE_CONSUMO)
                    FROM ARTICULO A, DEVOLUCIONES_VENTAS_DETALLE F
                    WHERE F.DEVT_ID = :IDDOC AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
                    INTO :ART, :MONTO, :IMPTOS
                    DO
                    BEGIN
                    if (IMPINC = 'S') then
                        MONTO = MONTO - IMPTOS;
                    if ((CTADTO IS NULL) OR (CTADTO = '')) then
                        MONTO = MONTO * FACTOR;
                    execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                    NROI = NROI + 1;
                    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, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                NROI = NROI + 1;
                SUMA = SUMA + MONTO;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA + MONTO;
                END
            END /* MONTO <> 0 */
        END /* VENTAS DE CLIENTE O CONSTANTE */
    /* EL IVA EN VENTAS */
    if (IVA = 'A') then
        BEGIN
        FOR SELECT MAX(COAR_CTAIVAV), SUM(DVDE_IVAMONTO), SUM(DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO), SUM(DVDE_CONSUMO)
            FROM ARTICULO A, CONTABIL_ARTICULO C, DEVOLUCIONES_VENTAS_DETALLE F
            WHERE F.DEVT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
            GROUP BY COAR_CTAIVAV
            INTO :CTAIVA, :IMPTOS, :MONTO, :VALORADIC
        DO
            BEGIN
            if (FOMENTO = 'SI') then
                MONTO = MONTO + VALORADIC;
            MONTO = MONTO * -1;
            MONTO = MONTO * FACTOR;
            IMPTOS = IMPTOS * FACTOR;
            execute procedure redondee(MONTO, DIG) returning_values (MONTO);
            execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
            if (IMPTOS <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTAIVA, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT F.ARTI_COD, DVDE_IVAMONTO, (DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO), TAIV_PORC, DVDE_CONSUMO
                        FROM ARTICULO A, CONTABIL_ARTICULO C, DEVOLUCIONES_VENTAS_DETALLE F, TARIFA_IVA T
                        WHERE F.DEVT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND A.TAIV_COD = T.TAIV_COD AND COAR_CTAIVAV = :CUENTA AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
                        INTO :ART, :IMPTOS, :MONTO, :PORCIVA, :VALORADIC
                    DO
                        BEGIN
                        if (IMPINC = 'S') then
                            MONTO = MONTO - IMPTOS - VALORADIC;
                        MONTO = MONTO * -1;
                        MONTO = MONTO * FACTOR;
                        IMPTOS = IMPTOS * FACTOR;
                        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                        execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                        if (IMPTOS <> 0) then
                            BEGIN
                            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :IMPTOS, 0, :MONTO, :PORCIVA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                            NROI = NROI + 1;
                            SUMA = SUMA + IMPTOS;
                            END
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                    NROI = NROI + 1;
                    SUMA = SUMA + IMPTOS;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA + IMPTOS;
                    END
                END   /* IMPTOS <> 0 */
            END /* FOR */
        if (DEC2799 = 'SI') then
            BEGIN
            FOR SELECT MAX(COAR_CTAIVADEC), SUM(FADE_IVAMONTO), SUM(FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), sum(FADE_CONSUMO)
                FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_DETALLE F
                WHERE F.FACT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
                    AND A.arti_dec2799 = 'S'
                GROUP BY COAR_CTAIVADEC
                INTO :CTADTOIVA, :IMPTOS, :MONTO, :VALORADIC
                DO
                BEGIN
                if (FOMENTO = 'SI') then
                    MONTO = MONTO + VALORADIC;
                MONTO = MONTO * -1;
                MONTO = MONTO * FACTOR;
                IMPTOS = IMPTOS * FACTOR;
                execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                if (IMPTOS <> 0) then
                    BEGIN
                    EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTADTOIVA, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                    if (ERRORC <> 0) then
                        ERROR = ERROR + 1;
                    if (TIPOCUEN = 'N') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :IMPTOS, 0, :MONTO, ABS(:IMPTOS*100/:MONTO), :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NROI = NROI + 1;
                        SUMA = SUMA + IMPTOS;
                        END
                    END   /* IMPTOS <> 0 */
                END
            END
        END /* IVA X ARTICULO */
    if (IVA = 'K') then /* IVA EN CTA CONSTANTE */
        BEGIN
        SELECT SUM(DVDE_IVAMONTO), SUM(DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO), SUM(DVDE_CONSUMO)
            FROM DEVOLUCIONES_VENTAS_DETALLE F
            WHERE F.DEVT_ID = :IDDOC  AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
            INTO :IMPTOS, :MONTO, :VALORADIC;
        if (FOMENTO = 'SI') then
            MONTO = MONTO + VALORADIC;
        MONTO = MONTO * -1;
        MONTO = MONTO * FACTOR;
        IMPTOS = IMPTOS * FACTOR;
        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
        execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
        if (IMPTOS <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTAIVA, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT F.ARTI_COD, (DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO), DVDE_IVAMONTO, TAIV_PORC, DVDE_CONSUMO
                    FROM ARTICULO A, DEVOLUCIONES_VENTAS_DETALLE F, TARIFA_IVA T
                    WHERE F.DEVT_ID = :IDDOC AND A.TAIV_COD = T.TAIV_COD AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
                    INTO :ART, :MONTO, :IMPTOS, :PORCIVA, :VALORADIC
                    DO
                    BEGIN
                    if (IMPINC = 'S') then
                        MONTO = MONTO - IMPTOS - VALORADIC;
                    MONTO = MONTO * -1;
                    MONTO = MONTO * FACTOR;
                    IMPTOS = IMPTOS * FACTOR;
                    execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                    execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                    if (IMPTOS <> 0) then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', :IMPTOS, 0, :MONTO, :PORCIVA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        SUMA = SUMA + IMPTOS;
                        END
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                NROI = NROI + 1;
                SUMA = SUMA + IMPTOS;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA + IMPTOS;
                END
            END /* IMPTOS <> 0 */
        if (DEC2799 = 'SI') then
            BEGIN
            SELECT SUM(FADE_IVAMONTO), SUM(FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), SUM(FADE_CONSUMO)
                FROM FACTURAS_DETALLE F, ARTICULO A
                WHERE F.FACT_ID = :IDDOC and FADE_IVAMONTO <> 0 AND F.arti_cod = A.arti_cod AND
                ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL)) AND A.arti_dec2799 = 'S'
                INTO :IMPTOS, :MONTO, :valoradic;
            if (FOMENTO = 'SI') then
                MONTO = MONTO + VALORADIC;
            MONTO = MONTO * -1;
            MONTO = MONTO * FACTOR;
            IMPTOS = IMPTOS * FACTOR;
            execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
            execute procedure redondee(MONTO, DIG) returning_values (MONTO);
            if (IMPTOS <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTADTOIVA, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :IMPTOS, 0, :MONTO, ABS(:IMPTOS*100/:MONTO), :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA + IMPTOS;
                    END
                END   /* IMPTOS <> 0 */
            END
        END /* IVA EN CTA CONSTANTE */
    /* EL IMPOCONSUMO */
    if ((CONSUMO = 'A') AND (FOMENTO <> 'SI')) then
        BEGIN
        FOR SELECT MAX(COAR_CTACONS), SUM(DVDE_CONSUMO)
            FROM ARTICULO A, CONTABIL_ARTICULO C, DEVOLUCIONES_VENTAS_DETALLE F
            WHERE F.DEVT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
            GROUP BY COAR_CTACONS
            INTO :CTACONSUMO, :IMPTOS
        DO
            BEGIN
            if (IMPTOS <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTACONSUMO, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, REGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT F.ARTI_COD, DVDE_CONSUMO
                        FROM ARTICULO A, CONTABIL_ARTICULO C, DEVOLUCIONES_VENTAS_DETALLE F
                        WHERE F.DEVT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTACONS = :CUENTA AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
                        INTO :ART, :IMPTOS
                    DO
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 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, :NROI, :CUENTA, :CONC, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                    NROI = NROI + 1;
                    SUMA = SUMA + IMPTOS;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA + IMPTOS;
                    END
                END /* IMPTOS <> 0 */
            END /* FOR */
        END /* CONSUMO X ARTICULO */
    if ((CONSUMO = 'K') AND (FOMENTO <> 'SI')) then
        BEGIN
        SELECT SUM(DVDE_CONSUMO)
            FROM DEVOLUCIONES_VENTAS_DETALLE F
            WHERE F.DEVT_ID = :IDDOC AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
            INTO :IMPTOS;
        if (IMPTOS <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTACONSUMO, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT F.ARTI_COD, DVDE_CONSUMO
                    FROM ARTICULO A, DEVOLUCIONES_VENTAS_DETALLE F
                    WHERE F.DEVT_ID = :IDDOC  AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
                    INTO :ART, :IMPTOS
                    DO
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTACONSUMO, :CONC, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                    NROI = NROI + 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, :NROI, :CTACONSUMO, :CONC, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA + IMPTOS;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTACONSUMO, :CONC, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA + IMPTOS;
                END
            END /* IMPTOS <> 0 */
        END /* CONSUMO EN CTA CONSTANTE */
    /* DESCUENTO */
    if ((CTADTO IS NOT NULL) AND
        (CTADTO <> '') AND
        (VRDTO <> 0)) THEN
        BEGIN
        EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTADTO, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRDTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
            NROI = NROI + 1;
            SUMA = SUMA - VRDTO;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRDTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 33);
            NROI = NROI + 1;
            SUMA = SUMA - VRDTO;
            END
        END /* DESCUENTO */
    /* VALOR ADIC */
    if ((CTAADIC IS NOT NULL) AND
        (CTAADIC <> '') AND
        (VRADIC <> 0)) THEN
        BEGIN
        EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTAADIC, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRADIC, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
            NROI = NROI + 1;
            SUMA = SUMA + VRADIC;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRADIC, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 33);
            NROI = NROI + 1;
            SUMA = SUMA + VRADIC;
            END
        END /* VR. ADIC */
    /* VALOR EXTRA */
    if ((CTAEXTRA IS NOT NULL) AND
        (CTAEXTRA <> '') AND
        (VREXTRA <> 0)) THEN
        BEGIN
        EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTAEXTRA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VREXTRA, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
            NROI = NROI + 1;
            SUMA = SUMA + VREXTRA;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VREXTRA, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 33);
            NROI = NROI + 1;
            SUMA = SUMA + VREXTRA;
            END
        END /* VR. EXTRA */
    /* RETENCION FUENTE */
    if ((RTFTE = 'C') or (RTFTE = 'K')) then
      if (VRRTFTE <> 0) then
        BEGIN
        if (RTFTE = 'C') then
            CTARTFTE = TCTARTFTE;
        EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTARTFTE, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, (:VRSUBT*-1), :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
            NROI = NROI + 1;
            SUMA = SUMA - VRRTFTE;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, (:VRSUBT*-1), :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA - VRRTFTE;
            END
        /* AUTORETENCION */
        if (FAUTORET <= fecaux) then
            BEGIN
            EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'CUENTA DE AUTORETENCION EN LA FUENTE') returning_values (CTARTFTE);
            EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTARTFTE, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :VRSUBT, :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                NROI = NROI + 1;
                SUMA = SUMA + VRRTFTE;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :VRSUBT, :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA + VRRTFTE;
                END
            END
        END /* RTFTE */
    if (RTFTE = 'A') then
      BEGIN
      FOR SELECT MAX(COAR_CTARTFTEV), MAX(COAR_RTFTE), MIN(COAR_RTBASE), SUM(DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO), SUM((DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO)*COAR_RTFTE)
        FROM CONTABIL_ARTICULO C, devoluciones_ventas_detalle F
        WHERE F.devt_id = :IDDOC AND F.ARTI_COD = C.ARTI_COD AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
        GROUP BY COAR_CTARTFTEV
        INTO :CTARTFTE, :PRTFTE, :baseadic, :MONTO, :VRRTFTE
        DO
        BEGIN
        MONTO = MONTO * FACTOR;
        if (MONTO >= BASEADIC) then
            BEGIN
            VRRTFTE = VRRTFTE * FACTOR / 100;
            execute procedure redondee(VRRTFTE, DIG) returning_values (VRRTFTE);
            execute procedure redondee(MONTO, DIG) returning_values (MONTO);
            if (VRRTFTE <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTARTFTE, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, (:MONTO*-1), :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                    NROI = NROI + 1;
                    SUMA = SUMA - VRRTFTE;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, (:MONTO*-1), :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA - VRRTFTE;
                    END
                /* AUTORETENCION */
                if (FAUTORET <= fecaux) then
                    BEGIN
                    EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'CUENTA DE AUTORETENCION EN LA FUENTE') returning_values (CTARTFTE);
                    EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTARTFTE, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
                    if (ERRORC <> 0) then
                        ERROR = ERROR + 1;
                    if (TIPOCUEN = 'C') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :MONTO, :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                        NROI = NROI + 1;
                        SUMA = SUMA + VRRTFTE;
                        END
                    if (TIPOCUEN = 'N') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :MONTO, :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NROI = NROI + 1;
                        SUMA = SUMA + VRRTFTE;
                        END
                    END
                END
            END
        END /* RTFTE */
      END
    /* RETENCION IVA */
    if ((RTIVA = 'C') or (RTIVA = 'K')) then
      if (VRRTIVA <> 0) then
        BEGIN
        if (RTIVA = 'C') then
            CTARTIVA = TCTARTIVA;
        EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTARTIVA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTIVA, (:VRIVA*-1), :PORC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
            NROI = NROI + 1;
            SUMA = SUMA - VRRTIVA;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTIVA, (:VRIVA*-1), :PORC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA - VRRTIVA;
            END
        END /* RTIVA */
    /* RETENCION DE ICA */
    if ((RTICA = 'C') or (RTICA = 'K')) then
      if (VRRTICA <> 0) then
        BEGIN
        if (RTICA = 'C') then
            CTARTICA = TCTARTICA;
        EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTARTICA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTICA, (:VRSUBT*-1), :PRTICA, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
            NROI = NROI + 1;
            SUMA = SUMA - VRRTICA;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTICA, (:VRSUBT*-1), :PRTICA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA - VRRTICA;
            END
        END /* RTICA */
    /* CIERRE EL COMPROBANTE CONTRA LA CUENTA DEL TERCERO O LA CONSTANTE */
    if ((SUMA <> 0) and ((CARTERA = 'C') or (CARTERA = 'K') or (CARTERA = 'J'))) then
        BEGIN
        if (icoing = 'SI') then
            BEGIN
            /* DESCUENTE EL IMPOCONSUMO QUE HACE PARTE DEL COSTO */
            SELECT SUM(FADE_CONSUMO)
                FROM FACTURAS_DETALLE F WHERE F.FACT_ID = :IDDOC AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL)) INTO :IMPTOS;
            SUMA = SUMA - IMPTOS;
            END
        if (SUMA < 0) then
            BEGIN
            DEBITO = SUMA * -1;
            CREDITO = 0;
            END
        ELSE
            BEGIN
            DEBITO = 0;
            CREDITO = SUMA;
            END
        if (CARTERA = 'C') then
            CTACARTERA = TCTACLIEN;
        if (CARTERA = 'J') then
            BEGIN
            /* BUSQUE LA CUENTA DE LA CAJA */
            SELECT CAJA_CUENTA FROM CAJAS C, PUNTO_VENTA P
                WHERE P.CAJA_ID = C.CAJA_ID AND PTVT_ID = :PTOVTA
                INTO :CTACARTERA;
            END
        EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTACARTERA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :DEBITO, :CREDITO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
        if (TIPOCUEN = 'N') then
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :DEBITO, :CREDITO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
        NROI = NROI + 1;
        END /* SUMA EN CARTERA */
    /* CALCULE COSTOS EN VENTAS */
    EXECUTE PROCEDURE COSTO_EN_VENTAS(33, :IDDOC);
    if (COSTOS = 'A') then
        BEGIN
        FOR SELECT MAX(CTACOS), SUM(CAST(CANT AS DOUBLE PRECISION) * COSTO), SUM(DVDE_CONSUMO)
            FROM COSTO_VENTAS CV, devoluciones_ventas_detalle D WHERE CV.cove_item = D.dvde_item AND D.devt_id = :iddoc AND
            TIDO_COD = 33 AND COVE_ID = :iddoc
            GROUP BY CTACOS
            INTO :CTACOSTOS, :MONTO, :vrconsumo
        DO
            BEGIN
            if (icoing = 'SI') then
                MONTO = MONTO + VRCONSUMO;
            if (MONTO <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTACOSTOS, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT ARTI_COD, cast(CANT as double precision) * COSTO
                        FROM COSTO_VENTAS WHERE TIDO_COD = 33 AND COVE_ID = :IDDOC AND CTACOS = :CUENTA
                        INTO :ART, :MONTO
                    DO
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                    NROI = NROI + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    END
                END /* MONTO <> 0 */
            END /* FOR */
        END /* COSTOS */
    if (COSTOS = 'K') then
        BEGIN
        SELECT SUM(cast(CANT as double precision) * COSTO)
            FROM COSTO_VENTAS WHERE TIDO_COD = 33 AND COVE_ID = :IDDOC
            INTO :MONTO;
        if (icoing = 'SI') then
            MONTO = MONTO + imptos;
        if (MONTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTACOSTOS, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, REGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT ARTI_COD, cast(CANT as double precision) * COSTO
                    FROM COSTO_VENTAS WHERE TIDO_COD = 33 AND COVE_ID = :IDDOC
                    INTO :ART, :MONTO
                DO
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTACOSTOS, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                    NROI = NROI + 1;
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTACOSTOS, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                NROI = NROI + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTACOSTOS, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                END
            END /* MONTO <> 0 */
        END /* COSTOS = K */
    if (INVEN = 'A') then
        BEGIN
        FOR SELECT MAX(CTAINV), SUM(cast(CANT as double precision) * COSTO)
            FROM COSTO_VENTAS WHERE TIDO_COD = 33 AND COVE_ID = :IDDOC
            GROUP BY CTAINV
            INTO :CTAINVEN, :MONTO
        DO
            BEGIN
            if (MONTO <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTAINVEN, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, REGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT ARTI_COD, cast(CANT as double precision) * COSTO
                        FROM COSTO_VENTAS WHERE TIDO_COD = 33 AND COVE_ID = :IDDOC AND CTAINV = :CUENTA
                        INTO :ART, :MONTO
                    DO
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                    NROI = NROI + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    END
                END /* MONTO <> 0 */
            END /* FOR */
        END /* INVEN = A */
    if (INVEN = 'K') then
        BEGIN
        SELECT SUM(cast(CANT as double precision) * COSTO)
            FROM COSTO_VENTAS WHERE TIDO_COD = 33 AND COVE_ID = :IDDOC
            INTO :MONTO;
        if (MONTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTAINVEN, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT ARTI_COD, cast(CANT as double precision) * COSTO
                    FROM COSTO_VENTAS WHERE TIDO_COD = 33 AND COVE_ID = :IDDOC
                    INTO :ART, :MONTO
                DO
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTAINVEN, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                    NROI = NROI + 1;
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAINVEN, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                NROI = NROI + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAINVEN, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                END
            END /* MONTO <> 0 */
        END /* INVEN = K */
    /* recorra las cuentas adicionales */
    FOR SELECT INVC_CUENTA, INVC_BASE, INVC_PORC, INVC_VALOR, INVC_DB
        FROM INTERFAZ_VENTAS_CTAS WHERE INVE_ID = :IDINTER
        INTO :CTADIC, :BASEADIC, :PORCADIC, :VALORADIC, :DBADIC
        DO
        BEGIN
        if (valoradic <> 0) then
            monto = valoradic;
        else
            BEGIN
            if (:BASEADIC = 'SUBTOTAL') then
                VALORADIC = vrsubt;
            if (:BASEADIC = 'DESCUENTO') then
                VALORADIC = VRDTO;
            if (:BASEADIC = 'IVA') then
                VALORADIC = VRIVA;
            if (:BASEADIC = 'ADICIONAL') then
                VALORADIC = VRADIC;
            if (:BASEADIC = 'EXTRA') then
                VALORADIC = VREXTRA;
            if (:BASEADIC = 'TOTAL') then
                VALORADIC = VRTOTAL;
            MONTO = VALORADIC * PORCADIC;
            END
        if (MONTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTADIC, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                if (DBADIC = 'S') then
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                ELSE
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                NROI = NROI + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                if (DBADIC = 'S') then
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                ELSE
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                END
            NROI = NROI + 1;
            END
        END
    if (error > 0) then
        ver = 'S';
    SUSPEND;
    END
   END /* EXISTE LA INTERFAZ */
  ELSE
    BEGIN
    EXECUTE PROCEDURE ERROR (33, :IDDOC, :PREF, 1);
    ERROR = ERROR + 1;
    VER = 'S';
    SUSPEND;
    END
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE DEVOLUCIONES_SIN_CONTABILIDAD(
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    ID INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    ESTADO VARCHAR(20),
    IDI INTEGER,
    IDC INTEGER)
AS
DECLARE VARIABLE VER CHAR(2);
declare variable FECICNT VARCHAR(10);
declare variable FECFCNT VARCHAR(10);
declare variable ERROR INTEGER;
declare variable idref INTEGER;
BEGIN
EXECUTE PROCEDURE fecha_a_conta(FECINI) returning_values (FECICNT);
EXECUTE PROCEDURE fecha_a_conta(FECFIN) returning_values (FECFCNT);
FOR SELECT DEVT_ID, PREF_PRE, DEVT_NUMERO FROM devoluciones_ventas WHERE DEVT_ANULADO = 'N' AND
    DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN
    INTO :ID, :PREF, :NUMERO
DO
  BEGIN
  idref = null;
  SELECT ENCO_IDREF FROM COMPROBANTE_ENCABEZADO WHERE ENCO_TIPOREF = 33 AND ENCO_FECHA >= :FECICNT AND ENCO_FECHA <= :FECFCNT and ENCO_IDREF = :id into :idref;
  if (idref IS NULL) then
  begin
   ESTADO = 'PROCESANDO';
   SUSPEND;
   SELECT MAX(INVE_ID) FROM INTERFAZ_VENTAS WHERE PREF_PRE = :PREF AND TIDO_COD = 33 INTO :IDI;
   EXECUTE PROCEDURE contabil_devolcli (:ID, :IDI) RETURNING_VALUES (:ERROR, :VER, :IDC);
   if (ERROR = 0) then
    BEGIN
    EXECUTE PROCEDURE CONTABILIZA_PENDIENTE (:IDC);
    ESTADO = 'OK';
    END
   ELSE
    ESTADO = 'ERROR';
   suspend;
  End
  END
END


^

SET TERM ; ^


/* 20101007D */
/* SALDO ACUMULADO POR CLIENTE PARA EXPORTAR */
SET TERM ^ ;

CREATE OR ALTER procedure REP_CARTERA_NOTAS (
    DESDE varchar(20),
    HASTA varchar(20),
    GRPINI varchar(5),
    GRPFIN varchar(5),
    FECHA date,
    ORDEN char(1),
    AGRUPA char(1),
    SUBEMPRESA integer,
    VENCEINI date,
    VENCEFIN date,
    GRUPCART integer,
    MONEDA integer)
returns (
    NIT varchar(20),
    NOMBRE varchar(60),
    TELEFONO varchar(40),
    CIUDAD varchar(40),
    CODZONA varchar(2),
    NOMZONA varchar(60),
    CODCOBR integer,
    NOMCOBR varchar(60),
    SUCURSAL varchar(10),
    DV char(1),
    CODCIUD char(5),
    NOMCIUD varchar(60),
    SALDO numeric(18,2),
    NOTA1 varchar(256),
    NOTA2 varchar(256),
    CUPO numeric(18,2),
    DISPONIBLE numeric(18,2),
    PROVISIONAL numeric(18,2),
    CONTACTO varchar(60),
    ESTADO char(1),
    RESALTAR char(1),
    INSTCART varchar(255),
    GRUPCOD integer,
    GRUPNOM varchar(30),
    TOTCLI numeric(18,2))
AS
declare variable NITINI VARCHAR(20);
declare variable NITFIN VARCHAR(20);
declare variable NOMINI VARCHAR(20);
declare variable NOMFIN VARCHAR(20);
declare variable OK CHAR(1);
declare variable PSALDO NUMERIC(18,2);
declare variable TIPO INTEGER;
declare variable ID INTEGER;
declare variable NOTA VARCHAR(277);
declare variable TIPODOC VARCHAR(8);
declare variable NUMDOC VARCHAR(10);
declare variable FECNOTA VARCHAR(10);
declare variable I INTEGER;
declare variable INCLANTI CHAR(2);
declare variable TRM NUMERIC(18,2);
BEGIN
if (ORDEN = 'C') then
    BEGIN
    NITINI = DESDE;
    NITFIN = HASTA;
    NOMINI = '';
    NOMFIN = 'zz';
    END
ELSE
    BEGIN
    NOMINI = DESDE;
    NOMFIN = HASTA;
    NITINI = '';
    NITFIN = 'zz';
    END
  EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'INCLUIR ANTICIPOS DE CLIENTES EN REPORTES Y CONSULTAS DE CARTERA') returning_values (INCLANTI);
  /* Ubique el NIT */
  FOR select T.TERC_NIT, CLSU_NOMBRE, TERC_DV, CLSU_TEL, CLSU_CIUDAD, TERC_CONTACTO, S.COBR_COD, S.ZONA_COD, CIUD_COD, CLIE_CUPO, CLIE_ESTADO, CLCU_COD, C.GRCA_COD, CLIE_RESALTAR, CLIE_INSTCARTERA
    from terceros T, CLIENTES C, CLIENTE_SUCURSALES S
    where C.TERC_NIT = T.TERC_NIT AND TERC_CLIE = 'S' AND S.TERC_NIT = C.TERC_NIT AND T.TERC_NIT >= :NITINI AND T.TERC_NIT <= :NITFIN AND
        TERC_NOM >= :NOMINI AND TERC_NOM <= :NOMFIN AND ((:GRUPCART = 0) or (C.GRCA_COD = :GRUPCART))
    INTO :NIT, :NOMBRE, :DV, :TELEFONO, :CIUDAD, :CONTACTO, :CODCOBR, :CODZONA, :CODCIUD, :CUPO, :ESTADO, :SUCURSAL, :GRUPCOD, :RESALTAR, INSTCART
    DO  
    BEGIN
    TOTCLI = 0;
    GRUPNOM = '';
    SELECT GRCA_NOMBRE FROM GRUPO_CARTERA WHERE GRCA_COD = :GRUPCOD INTO :GRUPNOM;
    OK = 'N';
    if (AGRUPA = 'Z') then
        BEGIN
        if (GRPINI = '') then
            BEGIN
            if ((CODZONA IS NULL) or (CODZONA >= :GRPINI AND CODZONA <= :GRPFIN)) then
                OK = 'S';
            END
        ELSE
            if (CODZONA >= :GRPINI AND CODZONA <= :GRPFIN) then
                OK = 'S';
        END
    if (AGRUPA = 'I') then
        BEGIN
        if (GRPINI = '') then
            BEGIN
            if ((CODCIUD IS NULL) or (CODCIUD >= :GRPINI AND CODCIUD <= :GRPFIN)) then
                OK = 'S';
            END
        ELSE
            if (CODCIUD >= :GRPINI AND CODCIUD <= :GRPFIN) then
                OK = 'S';
        END
    if (AGRUPA = 'N') then
        OK = 'S';
        
    if (OK = 'S') then
        BEGIN
        if (CODCOBR IS NOT NULL) then
            SELECT COBR_NOM FROM COBRADORES  WHERE COBR_COD = :CODCOBR INTO :NOMCOBR;
        if (CODZONA IS NOT NULL) then
            SELECT ZONA_NOM FROM ZONAS WHERE ZONA_COD = :CODZONA INTO :NOMZONA;
        if (CODCIUD IS NOT NULL) then
            SELECT CIUD_NOM FROM CIUDADES  WHERE CIUD_COD = :CODCIUD INTO :NOMCIUD;
    
        SALDO = 0;
        /* BUSQUE EN SALDOS_DOC_CARTERA LOS QUE TENGAN SALDO > 0 */
        FOR SELECT MVCL_TIPOREF, MVCL_IDREF
          FROM MOVIMIENTO_CLIENTES WHERE TERC_NIT = :NIT AND MVCL_SUCURSAL = :SUCURSAL AND MVCL_FECHA <= :FECHA AND
          MVCL_ABONO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) AND MVCL_VENCE >= :VENCEINI AND
          MVCL_VENCE <= :VENCEFIN AND ((:MONEDA = 0) or (MVCL_TRM <> 1))
          INTO :TIPO, :ID
          DO
            if ((inclanti = 'SI') or (TIPO <> 45)) then
                BEGIN
                EXECUTE PROCEDURE saldo_doc_cartera(TIPO, ID, FECHA, MONEDA) returning_values (PSALDO);
                if (PSALDO <> 0) then
                    SALDO = SALDO + PSALDO;
                END
        DISPONIBLE = CUPO - SALDO;
        /* LOS RECIBOS PROVISIONALES */
        SELECT SUM(RPDE_ABONO), MAX(RCPR_TRM) FROM RECIBO_PROVISIONAL P, recibo_provisional_detalle D
            WHERE P.rcpr_id = D.rcpr_id AND TERC_NIT = :NIT AND RPDE_SUCURSAL = :SUCURSAL AND ((:MONEDA = 0) or (RCPR_TRM <> 1)) AND
            RCPR_FECHA <= :FECHA AND RCPR_ANULADO = 'N' AND ((RCPR_FECCRUCE IS NULL) or (RCPR_FECCRUCE > :FECHA)) AND
            ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            INTO :provisional, :TRM;
        if ((MONEDA <> 0) AND (TRM <> 0)) then
            PROVISIONAL = PROVISIONAL / TRM;
        /* LAS NOTAS DE CLIENTES */
        I = 0;
        NOTA1 = '';
        NOTA2 = '';
        FOR SELECT CAST(NOCL_FECHA AS VARCHAR(10)), tido_nomcorto, NOCL_NUMDOC, NOCL_TEXTO
            FROM NOTAS_CLIENTES N, TIPO_DOCUMENTO T WHERE N.NOCL_TIPODOC = T.TIDO_COD AND TERC_NIT = :NIT
            AND N.TINO_COD = 3 AND N.CLSU_COD = :SUCURSAL
            ORDER BY NOCL_ID DESC INTO :FECNOTA, :TIPODOC, :NUMDOC, :NOTA
            DO
            BEGIN
            if (I = 0) then
                NOTA1 = NOTA;
            if (I = 1) then
                NOTA2 = NOTA;
            I = I + 1;
            END
        TOTCLI = TOTCLI + SALDO;
        SUSPEND;
        END
    if (AGRUPA = 'C') then
        BEGIN
        if (CODZONA IS NOT NULL) then
            SELECT ZONA_NOM FROM ZONAS WHERE ZONA_COD = :CODZONA INTO :NOMZONA;
        if (CODCIUD IS NOT NULL) then
            SELECT CIUD_NOM FROM CIUDADES  WHERE CIUD_COD = :CODCIUD INTO :NOMCIUD;
        FOR SELECT DISTINCT COBR_COD FROM MOVIMIENTO_CLIENTES WHERE TERC_NIT = :NIT AND
            MVCL_SUCURSAL = :SUCURSAL AND MVCL_FECHA <= :FECHA AND
            MVCL_ABONO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) AND MVCL_VENCE >= :VENCEINI AND MVCL_VENCE <= :VENCEFIN
            INTO :codcobr
            DO
            begin
            OK = 'N';
            if (GRPINI = '') then
                BEGIN
                if ((CODCOBR IS NULL) or (CODCOBR >= :GRPINI AND CODCOBR <= :GRPFIN)) then
                    OK = 'S';
                END
            ELSE
                if (CODCOBR >= :GRPINI AND CODCOBR <= :GRPFIN) then
                    OK = 'S';
            if (OK = 'S') then
                BEGIN
                SELECT COBR_NOM FROM COBRADORES  WHERE COBR_COD = :CODCOBR INTO :NOMCOBR;

                SALDO = 0;
                /* BUSQUE EN SALDOS_DOC_CARTERA LOS QUE TENGAN SALDO > 0 */
                FOR SELECT MVCL_TIPOREF, MVCL_IDREF
                  FROM MOVIMIENTO_CLIENTES WHERE TERC_NIT = :NIT AND MVCL_SUCURSAL = :SUCURSAL AND
                  MVCL_FECHA <= :FECHA AND COBR_COD = :codcobr AND MVCL_ABONO = 'N' AND
                  ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) AND MVCL_VENCE >= :VENCEINI AND
                  MVCL_VENCE <= :VENCEFIN AND ((:MONEDA = 0) or (MVCL_TRM <> 1))
                  INTO :TIPO, :ID
                  DO
                    if ((inclanti = 'SI') or (TIPO <> 45)) then
                        BEGIN
                        EXECUTE PROCEDURE saldo_doc_cartera(TIPO, ID, FECHA, MONEDA) returning_values (PSALDO);
                        if (PSALDO <> 0) then
                            BEGIN
                            SALDO = SALDO + PSALDO;
                            END
                        END
                DISPONIBLE = CUPO - SALDO;
                /* LOS RECIBOS PROVISIONALES */
                SELECT SUM(RPDE_ABONO), MAX(RCPR_TRM) FROM RECIBO_PROVISIONAL P, recibo_provisional_detalle D
                    WHERE P.rcpr_id = D.rcpr_id AND TERC_NIT = :NIT AND RPDE_SUCURSAL = :SUCURSAL AND ((:MONEDA = 0) or (RCPR_TRM <> 1)) AND
                    VEND_COD = :CODCOBR AND RCPR_FECHA <= :FECHA AND RCPR_ANULADO = 'N' AND ((RCPR_FECCRUCE IS NULL) or (RCPR_FECCRUCE > :FECHA)) AND
                    ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                    INTO :provisional, :TRM;
                if ((MONEDA <> 0) AND (TRM <> 0)) then
                    PROVISIONAL = PROVISIONAL / TRM;
                /* LAS NOTAS DE CLIENTES */
                I = 0;
                NOTA1 = '';
                NOTA2 = '';
                FOR SELECT CAST(NOCL_FECHA AS VARCHAR(10)), tido_nomcorto, NOCL_NUMDOC, NOCL_TEXTO
                    FROM NOTAS_CLIENTES N, TIPO_DOCUMENTO T WHERE N.NOCL_TIPODOC = T.TIDO_COD AND TERC_NIT = :NIT
                    AND N.TINO_COD = 3 AND N.CLSU_COD = :SUCURSAL
                    ORDER BY NOCL_FECHA DESC INTO :FECNOTA, :TIPODOC, :NUMDOC, :NOTA
                    DO
                    BEGIN
                    if (I = 0) then
                        NOTA1 = NOTA;
                    if (I = 1) then
                        NOTA2 = NOTA;
                    I = I + 1;
                    END
                TOTCLI = TOTCLI + SALDO;
                SUSPEND;
                END  /* OK = S */
            END  /* FOR COBRADOR */
        END  /* AGRUPA = C */
    END  /* FOR NIT */
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure REP_CARTERA_CLIENTES (
    DESDE varchar(20),
    HASTA varchar(20),
    GRPINI varchar(5),
    GRPFIN varchar(5),
    FECHA date,
    ORDEN char(1),
    AGRUPA char(1),
    SUBEMPRESA integer,
    GRUPCART integer,
    MONEDA integer)
returns (
    NIT varchar(20),
    NOMBRE varchar(60),
    DIR varchar(60),
    TELEFONO varchar(40),
    CIUDAD varchar(40),
    CONTACTO varchar(60),
    EMAIL varchar(100),
    FAX varchar(25),
    CEL varchar(25),
    CODCLI varchar(20),
    CODZONA varchar(2),
    NOMZONA varchar(60),
    CODCOBR integer,
    NOMCOBR varchar(60),
    SUCURSAL varchar(10),
    NOMSUC varchar(60),
    DV char(1),
    CODCIUD char(5),
    NOMCIUD varchar(60),
    RESALTAR char(1),
    INSTCART varchar(255),
    TIPO integer,
    ID integer,
    PREFIJO varchar(4),
    NUMERO varchar(6),
    CONCEPTO varchar(60),
    MONTO numeric(18,2),
    SALDO numeric(18,2),
    PROVISIONAL numeric(18,2),
    RTFTE numeric(18,2),
    RTIVA numeric(18,2),
    RTICA numeric(18,2),
    DTOF numeric(18,2),
    TIPONOM varchar(8),
    FECDOC date,
    VENCE date,
    DIAS integer,
    CUPO numeric(18,2),
    DISPONIBLE numeric(18,2),
    TOTCLI numeric(18,2),
    NOTA varchar(256),
    OBS blob sub_type 0 segment size 80,
    GRUPCOD integer,
    GRUPNOM varchar(30))
AS
DECLARE VARIABLE NITINI VARCHAR(20);
DECLARE VARIABLE NITFIN VARCHAR(20);
DECLARE VARIABLE NOMINI VARCHAR(20);
DECLARE VARIABLE NOMFIN VARCHAR(20);
DECLARE VARIABLE OK CHAR(1);
DECLARE VARIABLE FOV CHAR(11);
DECLARE VARIABLE DTOAPL NUMERIC(18,2);
DECLARE VARIABLE FECDTO DATE;
DECLARE VARIABLE FECNOTA VARCHAR(10);
DECLARE VARIABLE AUXNOTA VARCHAR(256);
DECLARE VARIABLE IDNOTA INTEGER;
declare variable descnt_prov char(2);
declare variable AUTORET VARCHAR(10);
declare variable FAUTORET DATE;
declare variable INCLANTI CHAR(2);
DECLARE VARIABLE TRM NUMERIC(18,2);
declare variable DB CHAR(1);
BEGIN
if (ORDEN = 'C') then
    BEGIN
    NITINI = DESDE;
    NITFIN = HASTA;
    NOMINI = '';
    NOMFIN = 'zz';
    END
ELSE
    BEGIN
    NOMINI = DESDE;
    NOMFIN = HASTA;
    NITINI = '';
    NITFIN = 'zz';
    END
  EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'DESCONTAR RECIBOS PROVISIONALES EN INFORMES DE CARTERA') RETURNING_VALUES (:descnt_prov);
  EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'INCLUIR ANTICIPOS DE CLIENTES EN REPORTES Y CONSULTAS DE CARTERA') returning_values (INCLANTI);
  EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'FECHA AUTORETENEDOR NO DESCONTAR RETENCIONES DEL SALDO PERO SI CONTABILIZARLAS') returning_values (AUTORET);
  EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'ANALISIS DE CARTERA CON FECHA FACTURA O VENCIMIENTO') RETURNING_VALUES (FOV);
  if (AUTORET <> '') then
    FAUTORET = CAST(AUTORET AS DATE);
  else
    FAUTORET = '9999/12/31';
  /* Ubique el NIT */
  FOR select C.TERC_NIT, TERC_NOM, TERC_DV, CLSU_DIR, CLSU_TEL, CLSU_CIUDAD, S.COBR_COD, S.ZONA_COD, T.CIUD_COD, CLIE_CUPO, CLCU_COD, CLSU_NOMBRE, t.terc_obs, C.GRCA_COD, TERC_CONTACTO, TERC_EMAIL, TERC_FAX, TERC_CEL, CLIE_COD, CLIE_RESALTAR, CLIE_INSTCARTERA
    from terceros T, CLIENTES C, CLIENTE_SUCURSALES S
    where C.TERC_NIT = T.TERC_NIT AND TERC_CLIE = 'S' AND S.TERC_NIT = C.TERC_NIT AND C.TERC_NIT >= :NITINI AND C.TERC_NIT <= :NITFIN AND
        TERC_NOM >= :NOMINI AND TERC_NOM <= :NOMFIN AND ((:GRUPCART = 0) or (C.GRCA_COD = :GRUPCART))
    INTO :NIT, :NOMBRE, :DV, :DIR, :TELEFONO, :CIUDAD, :CODCOBR, :CODZONA, :CODCIUD, :CUPO, :SUCURSAL, :NOMSUC, :obs, :GRUPCOD, :CONTACTO, :EMAIL, :FAX, :CEL, :CODCLI, :resaltar, INSTCART
    DO  
    BEGIN
    TOTCLI = 0;
    if (CODCOBR IS NOT NULL) then
        SELECT COBR_NOM FROM COBRADORES  WHERE COBR_COD = :CODCOBR INTO :NOMCOBR;
    if (CODZONA IS NOT NULL) then
        SELECT ZONA_NOM FROM ZONAS WHERE ZONA_COD = :CODZONA INTO :NOMZONA;
    if (CODCIUD IS NOT NULL) then
        SELECT CIUD_NOM FROM CIUDADES  WHERE CIUD_COD = :CODCIUD INTO :NOMCIUD;
    SELECT GRCA_NOMBRE FROM GRUPO_CARTERA WHERE GRCA_COD = :GRUPCOD INTO :GRUPNOM;
    DISPONIBLE = CUPO;
    OK = 'N';
    if (AGRUPA = 'Z') then
        BEGIN
        if (GRPINI = '') then
            BEGIN
            if ((CODZONA IS NULL) or (CODZONA >= :GRPINI AND CODZONA <= :GRPFIN)) then
                OK = 'S';
            END
        ELSE
            if (CODZONA >= :GRPINI AND CODZONA <= :GRPFIN) then
                OK = 'S';
        END
    if (AGRUPA = 'I') then
        BEGIN
        if (GRPINI = '') then
            BEGIN
            if ((CODCIUD IS NULL) or (CODCIUD >= :GRPINI AND CODCIUD <= :GRPFIN)) then
                OK = 'S';
            END
        ELSE
            if (CODCIUD >= :GRPINI AND CODCIUD <= :GRPFIN) then
                OK = 'S';
        END
    if (AGRUPA = 'N') then
        OK = 'S';
        
    if (OK = 'S') then
        BEGIN
        /* BUSQUE EN SALDOS_DOC_CARTERA LOS QUE TENGAN SALDO > 0 */
        FOR SELECT MVCL_TIPOREF, MVCL_IDREF, MVCL_PREFREF, MVCL_NUMREF, MVCL_FECHA, MVCL_VENCE, MVCL_CONC, MVCL_MONTO, MVCL_DEBITO
            FROM MOVIMIENTO_CLIENTES WHERE TERC_NIT = :NIT AND MVCL_SUCURSAL = :SUCURSAL AND MVCL_FECHA <= :FECHA AND
            MVCL_ABONO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) AND ((:MONEDA = 0) or (MVCL_TRM <> 1))
            INTO :TIPO, :ID, :PREFIJO, :NUMERO, :FECDOC, :VENCE, :CONCEPTO, :MONTO, :DB
            DO
            BEGIN
            if (DB = 'N') then
                MONTO = MONTO * -1;
            if ((inclanti = 'SI') or (TIPO <> 45)) then
                BEGIN
                EXECUTE PROCEDURE saldo_doc_cartera(TIPO, ID, FECHA, MONEDA) returning_values (SALDO);
                if (SALDO <> 0) then
                    BEGIN
                    PROVISIONAL = 0;
                    if (FOV = 'FECHA') then
                       DIAS = FECHA - FECDOC;
                    ELSE
                      DIAS = FECHA - VENCE;
                    DISPONIBLE = DISPONIBLE - SALDO;
                    SELECT TIDO_NOMCORTO FROM TIPO_DOCUMENTO WHERE TIDO_COD = :TIPO INTO :TIPONOM;
                    if (TIPO = 41) then
                        SELECT NDCL_DTOFMONTO, NDCL_FECHADTO, NDCL_TRM FROM NOTAS_DEBITO_CLIENTES
                            WHERE NDCL_ID = :ID INTO :DTOF, :FECDTO, :TRM;
                    if (TIPO = 42) then
                        SELECT 0, :FECDOC, 1 FROM NOTAS_CREDITO_CLIENTES
                            WHERE NCCL_ID = :ID INTO :DTOF, :FECDTO, :TRM;
                    if (TIPO = 45) then
                        SELECT ANCL_DTOFMONTO, ANCL_DTOFECHA, ANCL_TRM FROM ANTICIPOS_CLIENTE
                            WHERE ANCL_ID = :ID INTO :DTOF, :FECDTO, :TRM;
                    if (TIPO = 31) then
                        SELECT FACT_DTOFMONTO, FACT_DTOFFECHA, FACT_TRM FROM FACTURAS
                            WHERE FACT_ID = :ID INTO :DTOF, :FECDTO, :TRM;
                    if (TIPO = 33) then
                        SELECT 0, :FECDOC, 1 FROM devoluciones_ventas
                            WHERE DEVT_ID = :ID INTO :DTOF, :FECDTO, :TRM;
                    if ((MONEDA <> 0) AND (TRM <> 0)) then
                        DTOF = DTOF / TRM;
                    if (DTOF IS NULL) then
                        DTOF = 0;
                    if (DTOF <> 0) then
                        BEGIN
                        SELECT SUM(RCDE_DTOF), MAX(RECA_TRM) FROM RECIBOS_CAJA_DETALLE D, RECIBOS_CAJA R
                            WHERE R.reca_id = D.reca_id AND RCDE_IDDOC = :ID AND RCDE_TIPODOC = :TIPO
                            INTO :DTOAPL, :TRM;
                        if (DTOAPL IS NULL) then
                            DTOAPL = 0;
                        if ((MONEDA <> 0) AND (TRM <> 1)) then
                            DTOAPL = DTOAPL / TRM;
                        DTOF = DTOF - DTOAPL;
                        /* SI YA SE VENCIO DEJELO EN CERO */
                        if (FECDTO < FECHA) then
                            DTOF = 0;
                        END
                    if (MONEDA = 0) then
                        SELECT SUM(SDCA_RTFTE - SDCA_ABRTFTE), SUM(SDCA_RTIVA - SDCA_ABRTIVA), SUM(SDCA_RTICA - SDCA_ABRTICA)
                            FROM SALDOS_DOC_CARTERA WHERE SDCA_TIPOREF = :TIPO AND SDCA_IDREF = :ID
                            INTO :RTFTE, :RTIVA, :RTICA;
                    ELSE
                        SELECT SUM((SDCA_RTFTE - SDCA_ABRTFTE)/SDCA_TRM), SUM((SDCA_RTIVA - SDCA_ABRTIVA)/SDCA_TRM), SUM((SDCA_RTICA - SDCA_ABRTICA)/SDCA_TRM)
                            FROM SALDOS_DOC_CARTERA WHERE SDCA_TIPOREF = :TIPO AND SDCA_IDREF = :ID
                            INTO :RTFTE, :RTIVA, :RTICA;
                    if (RTFTE IS NULL) then
                        RTFTE = 0;
                    if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) THEN
                        BEGIN
                        if (RTFTE > 0) then
                            RTFTE = 0;
                        END
                    ELSE
                        BEGIN
                        if (RTFTE < 0) then
                            RTFTE = 0;
                        END
                    if (RTIVA IS NULL) then
                        RTIVA = 0;
                    if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) THEN
                        BEGIN
                        if (RTIVA > 0) then
                            RTIVA = 0;
                        END
                    ELSE
                        BEGIN
                        if (RTIVA < 0) then
                            RTIVA = 0;
                        END
                    if (RTICA IS NULL) then
                        RTICA = 0;
                    if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) THEN
                        BEGIN
                        if (RTICA > 0) then
                            RTICA = 0;
                        END
                    ELSE
                        BEGIN
                        if (RTICA < 0) then
                            RTICA = 0;
                        END
                    if (FAUTORET <= FECDOC) then
                        RTFTE = 0;
                    /* SI TIENE NOTA AGREGUELA */
                    SELECT MAX(NOCL_ID) FROM NOTAS_CLIENTES WHERE TERC_NIT = :NIT AND CLSU_COD = :SUCURSAL AND NOCL_TIPODOC = :TIPO AND NOCL_IDDOC = :ID INTO :IDNOTA;
                    if (IDNOTA IS NOT NULL) then
                        BEGIN
                        SELECT cast(NOCL_FECHA as char(10)), NOCL_TEXTO FROM NOTAS_CLIENTES
                            WHERE NOCL_ID = :IDNOTA INTO :FECNOTA, :AUXNOTA;
                        if (STRLEN(AUXNOTA) < 244) then
                            NOTA = FECNOTA || ':' || AUXNOTA;
                        ELSE
                            NOTA = AUXNOTA;
                        END
                    else
                        NOTA = '';
                    TOTCLI = TOTCLI + SALDO;
                    SUSPEND;
                    END  /* SALDO <> 0 */
                END  /* NO ANTICIPO */
            END  /* FOR */
        /* AGREGUE LOS RECIBOS PROVISIONALES CON SIGNO NEGATIVO */
        FOR SELECT 65, MAX(P.RCPR_ID), MAX(PREF_PRE), MAX(RCPR_NUMERO), MAX(RCPR_FECHA), MAX(RCPR_CONC), SUM(RPDE_ABONO * -1), SUM(RPDE_RTFTE*-1), SUM(RPDE_RTIVA*-1), SUM(RPDE_RTICA*-1), MAX(RCPR_TRM)
            FROM RECIBO_PROVISIONAL P, recibo_provisional_detalle D
            WHERE P.rcpr_id = D.rcpr_id AND P.TERC_NIT = :NIT AND RCPR_FECHA <= :FECHA AND RCPR_ANULADO = 'N' AND
            ((RCPR_FECCRUCE IS NULL) or (RCPR_FECCRUCE > :FECHA)) AND RPDE_SUCURSAL = :SUCURSAL AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY P.rcpr_id
            INTO :TIPO, :ID, :PREFIJO, :NUMERO, :FECDOC, :CONCEPTO, :PROVISIONAL, :rtfte,  :RTIVA, :RTICA, :TRM
            DO
            BEGIN
            if ((MONEDA <> 0) AND (TRM <> 0)) then
                PROVISIONAL = PROVISIONAL / TRM;
            if (:descnt_prov = 'NO') then
              SALDO = 0;
            else
              SALDO = :PROVISIONAL;
            SELECT TIDO_NOMCORTO FROM TIPO_DOCUMENTO WHERE TIDO_COD = :TIPO INTO :TIPONOM;
            /* CALCULE EL VENCIMIENTO DEL ULTIMO DOCUMENTO POSFECHADO */
            SELECT MAX(RPPA_FECHA) FROM recibo_provisional_pago WHERE RCPR_ID = :ID INTO :VENCE;
            DIAS = VENCE - FECHA;
            SUSPEND;
            END
        END
    if (AGRUPA = 'C') then
        BEGIN
        FOR SELECT DISTINCT COBR_COD FROM MOVIMIENTO_CLIENTES
            WHERE TERC_NIT = :NIT AND MVCL_SUCURSAL = :SUCURSAL AND MVCL_FECHA <= :FECHA AND
            MVCL_ABONO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            INTO :codcobr
            DO
            BEGIN
            OK = 'N';
            if (GRPINI = '') then
                BEGIN
                if ((CODCOBR IS NULL) or (CODCOBR >= :GRPINI AND CODCOBR <= :GRPFIN)) then
                    OK = 'S';
                END
            ELSE
                if (CODCOBR >= :GRPINI AND CODCOBR <= :GRPFIN) then
                    OK = 'S';
            if (OK = 'S') then
                BEGIN
                SELECT COBR_NOM FROM COBRADORES  WHERE COBR_COD = :CODCOBR INTO :NOMCOBR;
                /* BUSQUE EN SALDOS_DOC_CARTERA LOS QUE TENGAN SALDO > 0 */
                FOR SELECT MVCL_TIPOREF, MVCL_IDREF, MVCL_PREFREF, MVCL_NUMREF, MVCL_FECHA, MVCL_VENCE, MVCL_CONC, MVCL_MONTO, MVCL_DEBITO
                    FROM MOVIMIENTO_CLIENTES WHERE TERC_NIT = :NIT AND MVCL_SUCURSAL = :SUCURSAL AND MVCL_FECHA <= :FECHA AND
                    MVCL_ABONO = 'N' AND COBR_COD = :codcobr AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) AND
                    ((:MONEDA = 0) or (MVCL_TRM <> 1))
                    INTO :TIPO, :ID, :PREFIJO, :NUMERO, :FECDOC, :VENCE, :CONCEPTO, :MONTO, :DB
                    DO
                    BEGIN
                    if (DB = 'N') then
                        MONTO = MONTO * -1;
                    if ((inclanti = 'SI') or (TIPO <> 45)) then
                        BEGIN
                        EXECUTE PROCEDURE saldo_doc_cartera(TIPO, ID, FECHA, MONEDA) returning_values (SALDO);
                        if (SALDO <> 0) then
                            BEGIN
                            PROVISIONAL = 0;
                            if (FOV = 'FECHA') then
                               DIAS = FECHA - FECDOC;
                            ELSE
                              DIAS = FECHA - VENCE;
                            DISPONIBLE = DISPONIBLE - SALDO;
                            SELECT TIDO_NOMCORTO FROM TIPO_DOCUMENTO WHERE TIDO_COD = :TIPO INTO :TIPONOM;
                            if (TIPO = 41) then
                                SELECT NDCL_DTOFMONTO, NDCL_FECHADTO, NDCL_TRM FROM NOTAS_DEBITO_CLIENTES
                                    WHERE NDCL_ID = :ID INTO :DTOF, :FECDTO, :TRM;
                            if (TIPO = 42) then
                                SELECT 0, :FECDOC, 1 FROM NOTAS_CREDITO_CLIENTES
                                    WHERE NCCL_ID = :ID INTO :DTOF, :FECDTO, :TRM;
                            if (TIPO = 45) then
                                SELECT ANCL_DTOFMONTO, ANCL_DTOFECHA, ANCL_TRM FROM ANTICIPOS_CLIENTE
                                    WHERE ANCL_ID = :ID INTO :DTOF, :FECDTO, :TRM;
                            if (TIPO = 31) then
                                SELECT FACT_DTOFMONTO, FACT_DTOFFECHA, FACT_TRM FROM FACTURAS
                                    WHERE FACT_ID = :ID INTO :DTOF, :FECDTO, :TRM;
                            if (TIPO = 33) then
                                SELECT 0, :FECDOC, 1 FROM devoluciones_ventas
                                    WHERE DEVT_ID = :ID INTO :DTOF, :FECDTO, :TRM;
                            if (DTOF IS NULL) then
                                DTOF = 0;
                            if ((MONEDA <> 0) AND (TRM <> 0)) then
                                DTOF = DTOF / TRM;
                            if (DTOF <> 0) then
                                BEGIN
                                SELECT SUM(RCDE_DTOF) FROM RECIBOS_CAJA_DETALLE WHERE RCDE_IDDOC = :ID AND RCDE_TIPODOC = :TIPO INTO :DTOAPL;
                                if (DTOAPL IS NULL) then
                                    DTOAPL = 0;
                                DTOF = DTOF - DTOAPL;
                                /* SI YA SE VENCIO DEJELO EN CERO */
                                if (FECDTO < FECHA) then
                                    DTOF = 0;
                                END
                            SELECT SUM(SDCA_RTFTE - SDCA_ABRTFTE), SUM(SDCA_RTIVA - SDCA_ABRTIVA), SUM(SDCA_RTICA - SDCA_ABRTICA)
                                FROM SALDOS_DOC_CARTERA WHERE SDCA_TIPOREF = :TIPO AND SDCA_IDREF = :ID INTO :RTFTE, :RTIVA, :RTICA;
                            if (RTFTE IS NULL) then
                                RTFTE = 0;
                            if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) THEN
                                BEGIN
                                if (RTFTE > 0) then
                                    RTFTE = 0;
                                END
                            ELSE
                                BEGIN
                                if (RTFTE < 0) then
                                    RTFTE = 0;
                                END
                            if (FAUTORET <= FECDOC) then
                                RTFTE = 0;
                            if (RTIVA IS NULL) then
                                RTIVA = 0;
                            if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) THEN
                                BEGIN
                                if (RTIVA > 0) then
                                    RTIVA = 0;
                                END
                            ELSE
                                BEGIN
                                if (RTIVA < 0) then
                                    RTIVA = 0;
                                END
                            if (RTICA IS NULL) then
                                RTICA = 0;
                            if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) THEN
                                BEGIN
                                if (RTICA > 0) then
                                    RTICA = 0;
                                END
                            ELSE
                                BEGIN
                                if (RTICA < 0) then
                                    RTICA = 0;
                                END
                            /* SI TIENE NOTA AGREGUELA */
                            SELECT MAX(NOCL_ID) FROM NOTAS_CLIENTES WHERE TERC_NIT = :NIT AND CLSU_COD = :SUCURSAL AND NOCL_TIPODOC = :TIPO AND NOCL_IDDOC = :ID INTO :IDNOTA;
                            if (IDNOTA IS NOT NULL) then
                                BEGIN
                                SELECT cast(NOCL_FECHA as char(10)), NOCL_TEXTO FROM NOTAS_CLIENTES
                                    WHERE NOCL_ID = :IDNOTA INTO :FECNOTA, :AUXNOTA;
                                if (STRLEN(AUXNOTA) < 244) then
                                    NOTA = FECNOTA || ':' || AUXNOTA;
                                ELSE
                                    NOTA = AUXNOTA;
                                END
                            else
                                NOTA = '';
                            TOTCLI = TOTCLI + SALDO;
                            SUSPEND;
                            END  /* SALDO <> 0 */
                        END  /* NO ANTICIPO */
                    END  /* FOR */
                /* AGREGUE LOS RECIBOS PROVISIONALES CON SIGNO NEGATIVO */
                FOR SELECT 65, MAX(P.RCPR_ID), MAX(PREF_PRE), MAX(RCPR_NUMERO), MAX(RCPR_FECHA), MAX(RCPR_CONC), SUM(RPDE_ABONO * -1), SUM(RPDE_RTFTE*-1), SUM(RPDE_RTIVA*-1), SUM(RPDE_RTICA*-1), MAX(RCPR_TRM)
                    FROM RECIBO_PROVISIONAL P, recibo_provisional_detalle D
                    WHERE P.rcpr_id = D.rcpr_id AND P.TERC_NIT = :NIT AND P.VEND_COD = :codcobr AND RCPR_FECHA <= :FECHA AND RCPR_ANULADO = 'N' AND
                    ((RCPR_FECCRUCE IS NULL) or (RCPR_FECCRUCE > :FECHA)) AND RPDE_SUCURSAL = :SUCURSAL AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                    GROUP BY P.rcpr_id
                    INTO :TIPO, :ID, :PREFIJO, :NUMERO, :FECDOC, :CONCEPTO, :PROVISIONAL, :rtfte,  :RTIVA, :RTICA, :TRM
                    DO
                    BEGIN
                    if ((MONEDA <> 0) AND (TRM <> 0)) then
                        PROVISIONAL = PROVISIONAL / TRM;
                    MONTO = PROVISIONAL;
                    if (:descnt_prov = 'NO') then
                      SALDO = 0;
                    else
                      SALDO = :PROVISIONAL;
                    SELECT TIDO_NOMCORTO FROM TIPO_DOCUMENTO WHERE TIDO_COD = :TIPO INTO :TIPONOM;
                    /* CALCULE EL VENCIMIENTO DEL ULTIMO DOCUMENTO POSFECHADO */
                    SELECT MAX(RPPA_FECHA) FROM recibo_provisional_pago WHERE RCPR_ID = :ID INTO :VENCE;
                    DIAS = VENCE - FECHA;
                    SUSPEND;
                    END
                END /* ok */
            END  /* FOR COBR */
        END  /* AGRUPA = C */
    END  /* FOR NIT */
END
^

SET TERM ; ^


/* 20101008 */
/* EVITA EL MULTIPLE ROWS CUADO HAY DOS CONTABILIZACIONES */
SET TERM ^ ;

ALTER PROCEDURE DOCUMENTOS_SIN_CONTABILIZAR(
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    TIPO VARCHAR(10),
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    ID INTEGER,
    TIDO INTEGER,
    CTABCO INTEGER)
AS
declare variable FECICNT VARCHAR(10);
declare variable FECFCNT VARCHAR(10);
declare variable IDREF INTEGER;
begin
EXECUTE PROCEDURE fecha_a_conta(FECINI) returning_values (FECICNT);
EXECUTE PROCEDURE fecha_a_conta(FECFIN) returning_values (FECFCNT);
CTABCO = 0;
TIPO = 'ENTRADA';
TIDO = 11;
FOR SELECT ENTR_ID FROM ENTRADAS
    WHERE ENTR_ANULADO = 'N' AND ENTR_FECHA >= :FECINI AND ENTR_FECHA <= :FECFIN
    INTO :ID
DO
begin
  IDREF = null;
  SELECT FIRST 1 ENCO_IDREF FROM COMPROBANTE_ENCABEZADO WHERE ENCO_TIPOREF = 11 AND ENCO_FECHA >= :FECICNT AND ENCO_FECHA <= :FECFCNT AND ENCO_IDREF = :ID INTO :IDREF;
  if (IDREF IS NULL) then
   begin
    SELECT PREF_PRE, ENTR_NUMERO, ENTR_FECHA FROM ENTRADAS WHERE ENTR_ID = :ID INTO :PREFIJO, :NUMERO, :FECHA;
    suspend;
   end
end
TIPO = 'SALIDA';
TIDO = 12;
FOR SELECT SALI_ID FROM SALIDAS
    WHERE SALI_ANULADO = 'N' AND SALI_FECHA >= :FECINI AND SALI_FECHA <= :FECFIN
    INTO :ID
DO
begin
  IDREF = null;
  SELECT FIRST 1 ENCO_IDREF FROM COMPROBANTE_ENCABEZADO WHERE ENCO_TIPOREF = 12 AND ENCO_FECHA >= :FECICNT AND ENCO_FECHA <= :FECFCNT AND ENCO_IDREF = :ID INTO :IDREF;
  if (IDREF IS NULL) then
   begin
    SELECT PREF_PRE, SALI_NUMERO, SALI_FECHA FROM SALIDAS WHERE SALI_ID = :ID INTO :PREFIJO, :NUMERO, :FECHA;
    suspend;
   end
end
TIPO = 'TRASLADO';
TIDO = 13;
FOR SELECT TRAN_ID FROM TRASFERENCIAS
    WHERE TRAN_ANULADO = 'N' AND TRAN_FECHA >= :FECINI AND TRAN_FECHA <= :FECFIN
    INTO :ID
DO
begin
  IDREF = null;
  SELECT FIRST 1 ENCO_IDREF FROM COMPROBANTE_ENCABEZADO WHERE ENCO_TIPOREF = 13 AND ENCO_FECHA >= :FECICNT AND ENCO_FECHA <= :FECFCNT AND ENCO_IDREF = :ID INTO :IDREF;
  if (IDREF IS NULL) then
   begin
    SELECT PREF_PRE, TRAN_NUMERO, TRAN_FECHA FROM TRASFERENCIAS WHERE TRAN_ID = :ID INTO :PREFIJO, :NUMERO, :FECHA;
    suspend;
   end
end
TIPO = 'AJUS INV.';
TIDO = 14;
FOR SELECT AJUS_ID FROM AJUSTES
    WHERE AJUS_ANULADO = 'N' AND AJUS_FECHA >= :FECINI AND AJUS_FECHA <= :FECFIN
    INTO :ID
DO
begin
  IDREF = null;
  SELECT FIRST 1 ENCO_IDREF FROM COMPROBANTE_ENCABEZADO WHERE ENCO_TIPOREF = 14 AND ENCO_FECHA >= :FECICNT AND ENCO_FECHA <= :FECFCNT AND ENCO_IDREF = :ID INTO :IDREF;
  if (IDREF IS NULL) then
   begin
    SELECT PREF_PRE, AJUS_NUMERO, AJUS_FECHA FROM AJUSTES WHERE AJUS_ID = :ID INTO :PREFIJO, :NUMERO, :FECHA;
    suspend;
   end
end
TIPO = 'ENSAMBLE';
TIDO = 15;
FOR SELECT ENSA_ID FROM ENSAMBLES
    WHERE ENSA_ANULADO = 'N' AND ENSA_FECHA >= :FECINI AND ENSA_FECHA <= :FECFIN
    INTO :ID
DO
begin
  IDREF = null;
  SELECT FIRST 1 ENCO_IDREF FROM COMPROBANTE_ENCABEZADO WHERE ENCO_TIPOREF = 15 AND ENCO_FECHA >= :FECICNT AND ENCO_FECHA <= :FECFCNT AND ENCO_IDREF = :ID INTO :IDREF;
  if (IDREF IS NULL) then
   begin
    SELECT PREF_PRE, ENSA_NUMERO, ENSA_FECHA FROM ENSAMBLES WHERE ENSA_ID = :ID INTO :PREFIJO, :NUMERO, :FECHA;
    suspend;
   end
end
TIPO = 'DESENSAMB.';
TIDO = 16;
FOR SELECT DESE_ID FROM DESENSAMBLES
    WHERE DESE_ANULADO = 'N' AND DESE_FECHA >= :FECINI AND DESE_FECHA <= :FECFIN
    INTO :ID
DO
begin
  IDREF = null;
  SELECT FIRST 1 ENCO_IDREF FROM COMPROBANTE_ENCABEZADO WHERE ENCO_TIPOREF = 16 AND ENCO_FECHA >= :FECICNT AND ENCO_FECHA <= :FECFCNT AND ENCO_IDREF = :ID INTO :IDREF;
  if (IDREF IS NULL) then
   begin
    SELECT PREF_PRE, DESE_NUMERO, DESE_FECHA FROM DESENSAMBLES WHERE DESE_ID = :ID INTO :PREFIJO, :NUMERO, :FECHA;
    suspend;
   end
end
TIPO = 'FAC.COMPRA';
TIDO = 21;
FOR SELECT FACO_ID FROM FACTURAS_COMPRA
    WHERE FACO_ANULADO = 'N' AND FACO_FECHA >= :FECINI AND FACO_FECHA <= :FECFIN
    INTO :ID
DO
begin
  IDREF = null;
  SELECT FIRST 1 ENCO_IDREF FROM COMPROBANTE_ENCABEZADO WHERE ENCO_TIPOREF = 21 AND ENCO_FECHA >= :FECICNT AND ENCO_FECHA <= :FECFCNT AND ENCO_IDREF = :ID INTO :IDREF;
  if (IDREF IS NULL) then
   begin
    SELECT PREF_PRE, FACO_NUMERO, FACO_FECHA FROM FACTURAS_COMPRA WHERE FACO_ID = :ID INTO :PREFIJO, :NUMERO, :FECHA;
    suspend;
   end
end
TIPO = 'DEV.COMPRA';
TIDO = 24;
FOR SELECT DVCO_ID FROM DEVOLUCIONES_COMPRAS
    WHERE DVCO_ANULADO = 'N' AND DVCO_FECHA >= :FECINI AND DVCO_FECHA <= :FECFIN
    INTO :ID
DO
begin
  IDREF = null;
  SELECT FIRST 1 ENCO_IDREF FROM COMPROBANTE_ENCABEZADO WHERE ENCO_TIPOREF = 24 AND ENCO_FECHA >= :FECICNT AND ENCO_FECHA <= :FECFCNT AND ENCO_IDREF = :ID INTO :IDREF;
  if (IDREF IS NULL) then
   begin
    SELECT PREF_PRE, DVCO_NUMERO, DVCO_FECHA FROM DEVOLUCIONES_COMPRAS WHERE DVCO_ID = :ID INTO :PREFIJO, :NUMERO, :FECHA;
    suspend;
   end
end
TIPO = 'FACT.VENTA';
TIDO = 31;
FOR SELECT FACT_ID FROM FACTURAS
    WHERE FACT_ANULADO = 'N' AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND PREF_PRE NOT IN (SELECT PREF_PRE FROM AUTORIZACIONES WHERE AUTO_CONTADO = 'S')
    INTO :ID
DO
begin
  IDREF = null;
  SELECT FIRST 1 ENCO_IDREF FROM COMPROBANTE_ENCABEZADO WHERE ENCO_TIPOREF = 31 AND ENCO_FECHA >= :FECICNT AND ENCO_FECHA <= :FECFCNT AND ENCO_IDREF = :ID INTO :IDREF;
  if (IDREF IS NULL) then
   begin
    SELECT PREF_PRE, FACT_NUMERO, FACT_FECHA FROM FACTURAS WHERE FACT_ID = :ID INTO :PREFIJO, :NUMERO, :FECHA;
    suspend;
   end
end
TIPO = 'DEV.VENTA';
TIDO = 33;
FOR SELECT DEVT_ID FROM DEVOLUCIONES_VENTAS
    WHERE DEVT_ANULADO = 'N' AND ((DEVT_REMID = 0) or (DEVT_REMID IS NULL)) AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN
    INTO :ID
DO
begin
  IDREF = null;
  SELECT FIRST 1 ENCO_IDREF FROM COMPROBANTE_ENCABEZADO WHERE ENCO_TIPOREF = 33 AND ENCO_FECHA >= :FECICNT AND ENCO_FECHA <= :FECFCNT AND ENCO_IDREF = :ID INTO :IDREF;
  if (IDREF IS NULL) then
   begin
    SELECT PREF_PRE, DEVT_NUMERO, DEVT_FECHA FROM DEVOLUCIONES_VENTAS WHERE DEVT_ID = :ID INTO :PREFIJO, :NUMERO, :FECHA;
    suspend;
   end
end
TIPO = 'NOTADB.CLI';
TIDO = 41;
FOR SELECT NDCL_ID FROM NOTAS_DEBITO_CLIENTES
    WHERE NDCL_ANULADO = 'N' AND NDCL_FECHA >= :FECINI AND NDCL_FECHA <= :FECFIN
    INTO :ID
DO
begin
  IDREF = null;
  SELECT FIRST 1 ENCO_IDREF FROM COMPROBANTE_ENCABEZADO WHERE ENCO_TIPOREF = 41 AND ENCO_FECHA >= :FECICNT AND ENCO_FECHA <= :FECFCNT AND ENCO_IDREF = :ID INTO :IDREF;
  if (IDREF IS NULL) then
   begin
    SELECT PREF_PRE, NDCL_NUMERO, NDCL_FECHA FROM NOTAS_DEBITO_CLIENTES WHERE NDCL_ID = :ID INTO :PREFIJO, :NUMERO, :FECHA;
    suspend;
   end
end
TIPO = 'NOTACR.CLI';
TIDO = 42;
FOR SELECT NCCL_ID FROM NOTAS_CREDITO_CLIENTES
    WHERE NCCL_ANULADO = 'N' AND NCCL_FECHA >= :FECINI AND NCCL_FECHA <= :FECFIN
    INTO :ID
DO
begin
  IDREF = null;
  SELECT FIRST 1 ENCO_IDREF FROM COMPROBANTE_ENCABEZADO WHERE ENCO_TIPOREF = 42 AND ENCO_FECHA >= :FECICNT AND ENCO_FECHA <= :FECFCNT AND ENCO_IDREF = :ID INTO :IDREF;
  if (IDREF IS NULL) then
   begin
    SELECT PREF_PRE, NCCL_NUMERO, NCCL_FECHA FROM NOTAS_CREDITO_CLIENTES WHERE NCCL_ID = :ID INTO :PREFIJO, :NUMERO, :FECHA;
    suspend;
   end
end
TIPO = 'APLICA CLI';
TIDO = 43;
FOR SELECT APCL_ID FROM aplicacion_cliente
    WHERE APCL_ANULADO = 'N' AND APCL_FECHA >= :FECINI AND APCL_FECHA <= :FECFIN
    INTO :ID
DO
begin
  IDREF = null;
  SELECT FIRST 1 ENCO_IDREF FROM COMPROBANTE_ENCABEZADO WHERE ENCO_TIPOREF = 43 AND ENCO_FECHA >= :FECICNT AND ENCO_FECHA <= :FECFCNT AND ENCO_IDREF = :ID INTO :IDREF;
  if (IDREF IS NULL) then
   begin
    SELECT PREF_PRE, APCL_NUMERO, APCL_FECHA FROM aplicacion_cliente WHERE APCL_ID = :ID INTO :PREFIJO, :NUMERO, :FECHA;
    suspend;
   end
end
TIPO = 'CAUSA.CXP';
TIDO = 51;
FOR SELECT NDPR_ID FROM NOTAS_DEBITO_PROVEEDOR
    WHERE NDPR_ANULADO = 'N' AND NDPR_FECHA >= :FECINI AND NDPR_FECHA <= :FECFIN
    INTO :ID
DO
begin
  IDREF = null;
  SELECT FIRST 1 ENCO_IDREF FROM COMPROBANTE_ENCABEZADO WHERE ENCO_TIPOREF = 51 AND ENCO_FECHA >= :FECICNT AND ENCO_FECHA <= :FECFCNT AND ENCO_IDREF = :ID INTO :IDREF;
  if (IDREF IS NULL) then
   begin
    SELECT PREF_PRE, NDPR_NUMERO, NDPR_FECHA FROM NOTAS_DEBITO_PROVEEDOR WHERE NDPR_ID = :ID INTO :PREFIJO, :NUMERO, :FECHA;
    suspend;
   end
end
TIPO = 'DESCTO.CXP';
TIDO = 52;
FOR SELECT NCPR_ID FROM NOTAS_CREDITO_PROVEEDOR
    WHERE NCPR_ANULADO = 'N' AND NCPR_FECHA >= :FECINI AND NCPR_FECHA <= :FECFIN
    INTO :ID
DO
begin
  IDREF = null;
  SELECT FIRST 1 ENCO_IDREF FROM COMPROBANTE_ENCABEZADO WHERE ENCO_TIPOREF = 52 AND ENCO_FECHA >= :FECICNT AND ENCO_FECHA <= :FECFCNT AND ENCO_IDREF = :ID INTO :IDREF;
  if (IDREF IS NULL) then
   begin
    SELECT PREF_PRE, NCPR_NUMERO, NCPR_FECHA FROM NOTAS_CREDITO_PROVEEDOR WHERE NCPR_ID = :ID INTO :PREFIJO, :NUMERO, :FECHA;
    suspend;
   end
end
TIPO = 'APLICA PRV';
TIDO = 53;
FOR SELECT APPR_ID FROM aplicacion_provedor
    WHERE APPR_ANULADO = 'N' AND APPR_FECHA >= :FECINI AND APPR_FECHA <= :FECFIN
    INTO :ID
DO
begin
  IDREF = null;
  SELECT FIRST 1 ENCO_IDREF FROM COMPROBANTE_ENCABEZADO WHERE ENCO_TIPOREF = 53 AND ENCO_FECHA >= :FECICNT AND ENCO_FECHA <= :FECFCNT AND ENCO_IDREF = :ID INTO :IDREF;
  if (IDREF IS NULL) then
   begin
    SELECT PREF_PRE, APPR_NUMERO, APPR_FECHA FROM aplicacion_provedor WHERE APPR_ID = :ID INTO :PREFIJO, :NUMERO, :FECHA;
    suspend;
   end
end
/* EXCLUYA LOS DE PREFIJO PARA IGUAL VENTAS DE CONTADO */
TIPO = 'RECI.CAJA';
TIDO = 61;
FOR SELECT RECA_ID FROM RECIBOS_CAJA
    WHERE RECA_ANULADO = 'N' AND RECA_FECHA >= :FECINI AND RECA_FECHA <= :FECFIN AND PREF_PRE NOT IN (SELECT AUTO_PREFRDC FROM AUTORIZACIONES)
    INTO :ID
DO
begin
  IDREF = null;
  SELECT FIRST 1 ENCO_IDREF FROM COMPROBANTE_ENCABEZADO WHERE ENCO_TIPOREF = 61 AND ENCO_FECHA >= :FECICNT AND ENCO_FECHA <= :FECFCNT AND ENCO_IDREF = :ID INTO :IDREF;
  if (IDREF IS NULL) then
   begin
    SELECT PREF_PRE, RECA_NUMERO, RECA_FECHA FROM RECIBOS_CAJA WHERE RECA_ID = :ID INTO :PREFIJO, :NUMERO, :FECHA;
    suspend;
   end
end
TIPO = 'EGRESOS';
TIDO = 62;
FOR SELECT EGRE_ID FROM EGRESOS
    WHERE EGRE_ANULADO = 'N' AND EGRE_FECHA >= :FECINI AND EGRE_FECHA <= :FECFIN
    INTO :ID
DO
begin
  IDREF = null;
  SELECT FIRST 1 ENCO_IDREF FROM COMPROBANTE_ENCABEZADO WHERE ENCO_TIPOREF = 62 AND ENCO_FECHA >= :FECICNT AND ENCO_FECHA <= :FECFCNT AND ENCO_IDREF = :ID INTO :IDREF;
  if (IDREF IS NULL) then
   begin
    SELECT PREF_PRE, EGRE_NUMERO, EGRE_FECHA FROM EGRESOS WHERE EGRE_ID = :ID INTO :PREFIJO, :NUMERO, :FECHA;
    suspend;
   end
end
TIPO = 'CONS.TARJ.';
TIDO = 64;
FOR SELECT COTJ_ID FROM CONSIGNA_TARJETAS
    WHERE COTJ_ANULADO = 'N' AND COTJ_FECHA >= :FECINI AND COTJ_FECHA <= :FECFIN
    INTO :ID
DO
begin
  IDREF = null;
  SELECT FIRST 1 ENCO_IDREF FROM COMPROBANTE_ENCABEZADO WHERE ENCO_TIPOREF = 64 AND ENCO_FECHA >= :FECICNT AND ENCO_FECHA <= :FECFCNT AND ENCO_IDREF = :ID INTO :IDREF;
  if (IDREF IS NULL) then
   begin
    SELECT PREF_PRE,COTJ_NUMERO, COTJ_FECHA FROM CONSIGNA_TARJETAS WHERE COTJ_ID = :ID INTO :PREFIJO, :NUMERO, :FECHA;
    suspend;
   end
end
TIPO = 'TR. CAJA';
TIDO = 66;
FOR SELECT TRCJ_ID FROM TRASLADOS_CAJA
    WHERE TRCJ_ANULADO = 'N' AND TRCJ_FECHA >= :FECINI AND TRCJ_FECHA <= :FECFIN
    INTO :ID
DO
begin
  IDREF = null;
  SELECT FIRST 1 ENCO_IDREF FROM COMPROBANTE_ENCABEZADO WHERE ENCO_TIPOREF = 66 AND ENCO_FECHA >= :FECICNT AND ENCO_FECHA <= :FECFCNT AND ENCO_IDREF = :ID INTO :IDREF;
  if (IDREF IS NULL) then
   begin
    SELECT PREF_PRE, TRCJ_NUMERO, TRCJ_FECHA FROM TRASLADOS_CAJA WHERE TRCJ_ID = :ID INTO :PREFIJO, :NUMERO, :FECHA;
    suspend;
   end
end
TIPO = 'CONSIGNA';
TIDO = 71;
FOR SELECT CONS_ID FROM CONSIGNA
    WHERE CONS_ANULADO = 'N' AND CONS_FECHA >= :FECINI AND CONS_FECHA <= :FECFIN
    INTO :ID
DO
begin
  IDREF = null;
  SELECT FIRST 1 ENCO_IDREF FROM COMPROBANTE_ENCABEZADO WHERE ENCO_TIPOREF = 71 AND ENCO_FECHA >= :FECICNT AND ENCO_FECHA <= :FECFCNT AND ENCO_IDREF = :ID INTO :IDREF;
  if (IDREF IS NULL) then
   begin
    SELECT PRBA_PREF, CONS_NUMERO, CONS_FECHA, CUBA_COD FROM CONSIGNA WHERE CONS_ID = :ID INTO :PREFIJO, :NUMERO, :FECHA, :CTABCO;
    suspend;
   end
end
TIPO = 'CARGO BCO';
TIDO = 74;
FOR SELECT NDBC_ID FROM NOTAS_DEBITO
    WHERE NDBC_ANULADO = 'N' AND NDBC_FECHA >= :FECINI AND NDBC_FECHA <= :FECFIN
    INTO :ID
DO
begin
  IDREF = null;
  SELECT FIRST 1 ENCO_IDREF FROM COMPROBANTE_ENCABEZADO WHERE ENCO_TIPOREF = 74 AND ENCO_FECHA >= :FECICNT AND ENCO_FECHA <= :FECFCNT AND ENCO_IDREF = :ID INTO :IDREF;
  if (IDREF IS NULL) then
   begin
    SELECT PRBA_PREF, NDBC_NUMERO, NDBC_FECHA, CUBA_COD FROM NOTAS_DEBITO WHERE NDBC_ID = :ID INTO :PREFIJO, :NUMERO, :FECHA, :CTABCO;
    suspend;
   end
end
TIPO = 'ABONO BCO';
TIDO = 75;
FOR SELECT NCBC_ID FROM NOTAS_CREDITO
    WHERE NCBC_ANULADO = 'N' AND NCBC_FECHA >= :FECINI AND NCBC_FECHA <= :FECFIN
    INTO :ID
DO
begin
  IDREF = null;
  SELECT FIRST 1 ENCO_IDREF FROM COMPROBANTE_ENCABEZADO WHERE ENCO_TIPOREF = 75 AND ENCO_FECHA >= :FECICNT AND ENCO_FECHA <= :FECFCNT AND ENCO_IDREF = :ID INTO :IDREF;
  if (IDREF IS NULL) then
   begin
    SELECT PRBA_PREF, NCBC_NUMERO, NCBC_FECHA, CUBA_COD FROM NOTAS_CREDITO WHERE NCBC_ID = :ID INTO :PREFIJO, :NUMERO, :FECHA, :CTABCO;
    suspend;
   end
end
TIPO = 'TRAS.BANCO';
TIDO = 76;
FOR SELECT TRAS_ID FROM TRASLADOS
    WHERE TRAS_ANULADO = 'N' AND TRAS_FECHA >= :FECINI AND TRAS_FECHA <= :FECFIN
    INTO :ID
DO
begin
  IDREF = null;
  SELECT FIRST 1 ENCO_IDREF FROM COMPROBANTE_ENCABEZADO WHERE ENCO_TIPOREF = 76 AND ENCO_FECHA >= :FECICNT AND ENCO_FECHA <= :FECFCNT AND ENCO_IDREF = :ID INTO :IDREF;
  if (IDREF IS NULL) then
   begin
    SELECT PRBA_PREF, TRAS_NUMERO, TRAS_FECHA, CUBA_COD FROM TRASLADOS WHERE TRAS_ID = :ID INTO :PREFIJO, :NUMERO, :FECHA, :CTABCO;
    suspend;
   end
end
TIPO = 'DEVOL.CHQ.';
TIDO = 77;
FOR SELECT DVCH_ID FROM DEVOLUCION_CHEQUES
    WHERE DVCH_ANULADO = 'N' AND DVCH_FECHA >= :FECINI AND DVCH_FECHA <= :FECFIN
    INTO :ID
DO
begin
  IDREF = null;
  SELECT FIRST 1 ENCO_IDREF FROM COMPROBANTE_ENCABEZADO WHERE ENCO_TIPOREF = 77 AND ENCO_FECHA >= :FECICNT AND ENCO_FECHA <= :FECFCNT AND ENCO_IDREF = :ID INTO :IDREF;
  if (IDREF IS NULL) then
   begin
    SELECT PRBA_PREF, DVCH_NUMDOC, DVCH_FECHA, CUBA_COD FROM DEVOLUCION_CHEQUES WHERE DVCH_ID = :ID INTO :PREFIJO, :NUMERO, :FECHA, :CTABCO;
    suspend;
   end
end
end
^

SET TERM ; ^

/* 20101015 */
/* CHEQUEO CON MODULO DE TRANSPORTES */

SET TERM ^ ;

CREATE OR ALTER procedure CHEQUEO_SALDOS_CAJAS (
    CAJAINI integer,
    CAJAFIN integer)
AS
declare variable ID INTEGER;
declare variable Fec date;
declare variable Caja integer;
declare variable Conc VARCHAR(60);
declare variable Pref varchar(4);
declare variable Num varchar(6);
declare variable FORMA INTEGER;
declare variable BANCO VARCHAR(2);
declare variable CUENTA VARCHAR(20);
declare variable NUMERO VARCHAR(20);
declare variable FECHA DATE;
declare variable MONTO NUMERIC(18,2);
declare variable Existe INTEGER;
declare variable Dest INTEGER;
declare variable idref INTEGER;
declare variable item integer;
declare variable idd integer;
declare variable TIPO INTEGER;
begin
/* BORRE LOS MOVIMIENTOS CAJA, LOS DOCUMENTOS PAGO CAJA Y SALDO EFECTIVO */
DELETE FROM ANTICIPOS_CLIENTE WHERE RECA_ID = 0;
DELETE FROM ANTICIPOS_PROVEEDOR WHERE EGRE_ID = 0;
UPDATE DOCUMENTOS_PAGO_CAJA SET dpca_idsal = 0 WHERE CAJA_ID >= :cajaini AND CAJA_ID <= :cajafin;
DELETE FROM MOVIMIENTO_CAJA WHERE CAJA_ID >= :cajaini AND CAJA_ID <= :cajafin;
DELETE FROM DOCUMENTOS_PAGO_CAJA WHERE CAJA_ID >= :cajaini AND CAJA_ID <= :cajafin;
DELETE FROM SALDO_EFECTIVO WHERE CAJA_ID >= :cajaini AND CAJA_ID <= :cajafin;
DELETE FROM saldo_caja WHERE CAJA_ID >= :cajaini AND CAJA_ID <= :cajafin;

/* INCORPORE LOS RECIBOS DE CAJA */
FOR SELECT R.RECA_ID, reca_fecha, caja_id, reca_conc, pref_pre, reca_numero, FOPA_ID, RCPA_BANCO, RCPA_CUENTA, RCPA_NUMERO, RCPA_FECHA, RCPA_MONTO
    FROM recibos_caja R, RECIBOS_CAJA_PAGO P where R.reca_id = P.reca_id and reca_anulado = 'N' AND CAJA_ID >= :cajaini AND CAJA_ID <= :cajafin
    ORDER BY CAJA_ID, R.RECA_FECHA, R.RECA_ID, RCPA_ITEM
    INTO :ID, :Fec, :Caja, :Conc, :Pref, :Num, :forma,  :banco, :cuenta, :numero, :fecha, :monto
    DO
    BEGIN
    select COUNT(*) from movimiento_caja where moca_tiporef = 61 and moca_idref = :id into :Existe;
    if (Existe > 0) then
        update movimiento_caja
        set moca_debitos = moca_debitos + :monto
        where moca_tiporef = 61 and moca_idref = :id;
    else
        INSERT INTO MOVIMIENTO_CAJA
            (MOCA_ID, CAJA_ID, MOCA_TIPOREF, MOCA_PREFREF, MOCA_NUMREF, MOCA_FECHA, MOCA_CONC, MOCA_DEBITOS, MOCA_CREDITOS, MOCA_DB, MOCA_IDREF)
            VALUES(GEN_ID(id_movcaja,1), :Caja, 61, :Pref, :Num, :Fec, :Conc, :monto, 0, 'S', :id);
        /* GRABE EL DOCUMENTO DE PAGO EN CAJA */
        if (FORMA <> 1) then
            INSERT INTO DOCUMENTOS_PAGO_CAJA (DPCA_ID, FOPA_ID, CAJA_ID, DPCA_BANCO, DPCA_CUENTA, DPCA_NUMERO, DPCA_FECHA, DPCA_MONTO, DPCA_TIPOENT, DPCA_IDENT, DPCA_TIPOSAL, DPCA_IDSAL)
                VALUES (GEN_ID(ID_DOCPAGOCAJA, 1), :FORMA, :CAJA, :BANCO, :CUENTA, :NUMERO, :FECHA, :MONTO, 61, :ID, 0, 0);
        ELSE
            EXECUTE PROCEDURE SUME_SALDO_EFECTIVO (:CAJA, :FEC, :MONTO, 'N');
    END

/* LOS EGRESOS POR TRASLADO A CAJA */
for SELECT EGRE_ID, CAJA_ID, PREF_PRE, EGRE_NUMERO, EGRE_FECHA, EGRE_CONC, EGRE_MONTO FROM EGRESOS
    WHERE EGRE_TIPO = '2' AND CAJA_ID <> 0 AND egre_id <> 0 AND egre_anulado = 'N' AND CAJA_ID >= :cajaini AND CAJA_ID <= :cajafin
    ORDER BY CAJA_ID, EGRE_FECHA
    INTO :ID, :CAJA, :PREF, :NUM, :FEC, :CONC, :MONTO
    DO
    BEGIN
    SELECT MOCA_IDREF FROM movimiento_caja WHERE MOCA_TIPOREF = 62 AND MOCA_IDREF = :ID INTO :idref;
    if (idref IS NULL) then
     BEGIN
     INSERT INTO MOVIMIENTO_CAJA
        (MOCA_ID, CAJA_ID, MOCA_TIPOREF, MOCA_PREFREF, MOCA_NUMREF, MOCA_FECHA, MOCA_CONC, MOCA_DEBITOS, MOCA_CREDITOS, MOCA_DB, MOCA_IDREF)
        VALUES(GEN_ID(id_movcaja,1), :CAJA, 62, :PREF, :NUM, :FEC, :CONC, :MONTO, 0, 'S', :ID);
      /* GRABE EL DOCUMENTO DE PAGO EN CAJA */
      EXECUTE PROCEDURE SUME_SALDO_EFECTIVO (:caja, :fec, :monto, 'N');
     END
    END
/* las planillas de pasajeros */
FOR SELECT PLPA_ID, PLPA_fecha, PLPA_pref, PLPA_numero, PLPA_caja, PLPA_NETO
    from planilla_pasajeros where plpa_anulado = 'N' and plpa_neto < 0
    order by PLPA_FECHA, PLPA_ID
    INTO :ID, :Fec, :Pref, :Num, :Caja, :monto
    DO
    BEGIN
    CONC = 'PLANILLA DE PASAJEROS No. ' || :pref || :num;
    INSERT INTO MOVIMIENTO_CAJA
        (MOCA_ID, CAJA_ID, MOCA_TIPOREF, MOCA_PREFREF, MOCA_NUMREF, MOCA_FECHA, MOCA_CONC, MOCA_DEBITOS, MOCA_CREDITOS, MOCA_DB, MOCA_IDREF)
        VALUES(GEN_ID(id_movcaja,1), :caja, 88, :pref, :num, :fec, :Conc, ABS(:monto), 0, 'S', :id);
    EXECUTE PROCEDURE SUME_SALDO_EFECTIVO (:caja, :fec, ABS(:monto), 'N');
    END

/* REMESAS CARGA   */
FOR SELECT CGRM_ID, CGRM_fecha, CGRM_pref, CGRM_numero, CGRM_caja, CGRM_TOTAL, TIDO_COD
    from carga_remesa where (CGRM_anulado = 'N') AND (cgrm_fpago = 'C') AND (cgrm_caja <> 0) AND (cgrm_caja IS NOT NULL)
    order by CGRM_FECHA, CGRM_ID
    INTO :ID, :Fec, :Pref, :Num, :Caja, :monto, :tipo
    DO
    BEGIN
    CONC = 'REMESA No. ' || :pref || :num;
    INSERT INTO MOVIMIENTO_CAJA
        (MOCA_ID, CAJA_ID, MOCA_TIPOREF, MOCA_PREFREF, MOCA_NUMREF, MOCA_FECHA, MOCA_CONC, MOCA_DEBITOS, MOCA_CREDITOS, MOCA_DB, MOCA_IDREF)
        VALUES(GEN_ID(id_movcaja,1), :caja, :tipo, :pref, :num, :fec, :Conc, :monto, 0, 'S', :id);
    EXECUTE PROCEDURE SUME_SALDO_EFECTIVO (:caja, :fec, :monto, 'N');
    END

/* TIQUETES PASAJEROS */
FOR SELECT TIQP_ID, TIQP_fecha, TIQP_pref, TIQP_numero, TIQP_caja, TIQP_TOTAL
    from tiquete_pasajero where (TIQP_anulado = 'N') AND (TIQP_formap = 'C') AND (TIQP_caja <> 0) AND (TIQP_caja IS NOT NULL)
    order by TIQP_FECHA, TIQP_ID
    INTO :ID, :Fec, :Pref, :Num, :Caja, :monto
    DO
    BEGIN
    CONC = 'TIQUETE DE PASAJEROS No. ' || :pref || :num;
    INSERT INTO MOVIMIENTO_CAJA
        (MOCA_ID, CAJA_ID, MOCA_TIPOREF, MOCA_PREFREF, MOCA_NUMREF, MOCA_FECHA, MOCA_CONC, MOCA_DEBITOS, MOCA_CREDITOS, MOCA_DB, MOCA_IDREF)
        VALUES(GEN_ID(id_movcaja,1), :caja, 86, :pref, :num, :fec, :Conc, :monto, 0, 'S', :id);
    EXECUTE PROCEDURE SUME_SALDO_EFECTIVO (:caja, :fec, :monto, 'N');
    END

/* LOS CAMBIOS */
FOR SELECT C.CADO_ID, cado_fecha, cado_conc, pref_pre, cado_numero, caja_id, FOPA_ID, CDSA_BANCO, CDSA_CUENTA, CDSA_NUMERO, CDSA_FECHA, CDSA_MONTO
    FROM CAMBIO_DOCUMENTOS C, CAMBIODOC_SALIDAS D where C.CADO_ID = D.CADO_ID and cado_anulado = 'N' AND CAJA_ID >= :cajaini AND CAJA_ID <= :cajafin
    ORDER BY CAJA_ID, C.CADO_FECHA, C.CADO_ID, CDSA_ITEM
    INTO :ID, :Fec, :Conc, :Pref, :Num, :Caja, :forma, :banco, :cuenta, :numero, :fecha, :monto
    DO
    BEGIN
    select COUNT(*) from movimiento_caja where moca_tiporef = 63 and moca_idref = :id and caja_id = :CAJA into :Existe;
    if (Existe > 0) then
        begin
        update movimiento_caja
            set moca_debitos = moca_debitos + :monto
            where moca_tiporef = 63 and moca_idref = :id and caja_id = :CAJA;
        end
    else
        INSERT INTO MOVIMIENTO_CAJA
            (MOCA_ID, CAJA_ID, MOCA_TIPOREF, MOCA_PREFREF, MOCA_NUMREF, MOCA_FECHA, MOCA_CONC, MOCA_DEBITOS, MOCA_CREDITOS, MOCA_DB, MOCA_IDREF)
            VALUES(GEN_ID(ID_MOVCAJA,1), :CAJA, 63, :Pref, :Num, :Fec, :Conc, :monto, 0, 'S', :id);
        
    if (FORMA <> 1) then
        INSERT INTO DOCUMENTOS_PAGO_CAJA (DPCA_ID, FOPA_ID, CAJA_ID, DPCA_BANCO, DPCA_CUENTA, DPCA_NUMERO, DPCA_FECHA, DPCA_MONTO, DPCA_TIPOENT, DPCA_IDENT, DPCA_TIPOSAL, DPCA_IDSAL)
            VALUES (GEN_ID(ID_DOCPAGOCAJA, 1), :FORMA, :CAJA, :BANCO, :CUENTA, :NUMERO, :FECHA, :MONTO, 63, :ID, 0, 0);
    ELSE
        EXECUTE PROCEDURE SUME_SALDO_EFECTIVO(:CAJA, :FEC, :MONTO, 'N');
    END
/* DEVOLUCIONES DE CHEQUES ojo fopa_id = 2 */
FOR SELECT DVCH_ID, dvch_fecha, caja_id, dvch_conc, prba_pref, dvch_numdoc, 2, DVCH_BANCO, DVCH_CUENTA, DVCH_NROCH, DVCH_FECCH, DVCH_MONTO
    FROM DEVOLUCION_CHEQUES where dvch_anulado = 'N' AND dvch_cartera <> 'S' AND CAJA_ID >= :cajaini AND CAJA_ID <= :cajafin
    ORDER BY CAJA_ID, DVCH_FECHA, DVCH_ID
    INTO :ID, :Fec, :Caja, :Conc, :Pref, :Num, :forma,  :banco, :cuenta, :numero, :fecha, :monto
    DO
    BEGIN
    select COUNT(*) from movimiento_caja where moca_tiporef = 77 and moca_idref = :id into :Existe;
    if (Existe > 0) then
        update movimiento_caja
        set moca_debitos = moca_debitos + :monto
        where moca_tiporef = 77 and moca_idref = :id;
    else
        INSERT INTO MOVIMIENTO_CAJA
            (MOCA_ID, CAJA_ID, MOCA_TIPOREF, MOCA_PREFREF, MOCA_NUMREF, MOCA_FECHA, MOCA_CONC, MOCA_DEBITOS, MOCA_CREDITOS, MOCA_DB, MOCA_IDREF)
            VALUES(GEN_ID(id_movcaja,1), :Caja, 77, :Pref, :Num, :Fec, :Conc, :monto, 0, 'S', :id);
        /* GRABE EL DOCUMENTO DE PAGO EN CAJA */
        INSERT INTO DOCUMENTOS_PAGO_CAJA (DPCA_ID, FOPA_ID, CAJA_ID, DPCA_BANCO, DPCA_CUENTA, DPCA_NUMERO, DPCA_FECHA, DPCA_MONTO, DPCA_TIPOENT, DPCA_IDENT, DPCA_TIPOSAL, DPCA_IDSAL)
            VALUES (GEN_ID(ID_DOCPAGOCAJA, 1), 2, :CAJA, :BANCO, :CUENTA, :NUMERO, :FECHA, :MONTO, 77, :ID, 0, 0);
    END

/* TRASLADOS ENTRE CAJAS INGRESOS */
FOR SELECT T.TRCJ_ID, trcj_fecha, caja_id, trcj_destino, trcj_conc, pref_pre, trcj_numero, fopa_id, TRCD_BANCO, TRCD_CUENTA, TRCD_NUMERO, TRCD_FECHA, TRCD_MONTO
    FROM TRASLADOS_CAJA T, TRASLADOS_CAJA_DET D where T.TRCJ_ID = D.TRCJ_ID AND trcj_anulado = 'N' AND TRCJ_DESTINO >= :cajaini AND TRCJ_DESTINO <= :cajafin
    ORDER BY CAJA_ID, TRCJ_FECHA, T.TRCJ_ID, TRCD_ITEM
    INTO :ID, :Fec, :Caja, :Dest, :Conc, :Pref, :Num, :forma,  :banco, :cuenta, :numero, :fecha, :monto
    DO
    BEGIN
    /* INGRESO A LA CAJA DESTINO */
    select COUNT(*) from movimiento_caja where moca_tiporef = 66 and moca_idref = :id and caja_id = :Dest into :Existe;
    if (Existe > 0) then
        begin
        update movimiento_caja
            set moca_debitos = moca_debitos + :monto
            where moca_tiporef = 66 and moca_idref = :id and caja_id = :Dest;
        end
    else
        INSERT INTO MOVIMIENTO_CAJA
            (MOCA_ID, CAJA_ID, MOCA_TIPOREF, MOCA_PREFREF, MOCA_NUMREF, MOCA_FECHA, MOCA_CONC, MOCA_DEBITOS, MOCA_CREDITOS, MOCA_DB, MOCA_IDREF)
            VALUES(GEN_ID(ID_MOVCAJA,1), :Dest, 66, :Pref, :Num, :Fec, :Conc, :monto, 0, 'S', :id);
    /* Ingrese el doc. de pago */
    if (FORMA <> 1) then
        INSERT INTO DOCUMENTOS_PAGO_CAJA (DPCA_ID, FOPA_ID, CAJA_ID, DPCA_BANCO, DPCA_CUENTA, DPCA_NUMERO, DPCA_FECHA, DPCA_MONTO, DPCA_TIPOENT, DPCA_IDENT, DPCA_TIPOSAL, DPCA_IDSAL)
            VALUES (GEN_ID(ID_DOCPAGOCAJA, 1), :FORMA, :Dest, :BANCO, :CUENTA, :NUMERO, :FECHA, :MONTO, 66, :ID, 0, 0);
    else
        EXECUTE PROCEDURE SUME_SALDO_EFECTIVO (:Dest, :Fec, :MONTO, 'N');
    END

/* TRASLADOS ENTRE CAJAS EGRESOS */
FOR SELECT T.TRCJ_ID, trcj_fecha, caja_id, trcj_destino, trcj_conc, pref_pre, trcj_numero, fopa_id, TRCD_BANCO, TRCD_CUENTA, TRCD_NUMERO, TRCD_FECHA, TRCD_MONTO, TRCD_ITEM
    FROM TRASLADOS_CAJA T, TRASLADOS_CAJA_DET D where T.TRCJ_ID = D.TRCJ_ID AND trcj_anulado = 'N' AND CAJA_ID >= :cajaini AND CAJA_ID <= :cajafin
    ORDER BY CAJA_ID, TRCJ_FECHA, T.TRCJ_ID, TRCD_ITEM
    INTO :ID, :Fec, :Caja, :Dest, :Conc, :Pref, :Num, :forma,  :banco, :cuenta, :numero, :fecha, :monto, :item
    DO
    BEGIN
    select COUNT(*) from movimiento_caja where moca_tiporef = 66 and moca_idref = :id and caja_id = :caja into :Existe;
    if (Existe > 0) then
        begin
        update movimiento_caja
            set moca_creditos = moca_creditos + :monto
            where moca_tiporef = 66 and moca_idref = :id and caja_id = :caja;
        end
    else
        INSERT INTO MOVIMIENTO_CAJA
            (MOCA_ID, CAJA_ID, MOCA_TIPOREF, MOCA_PREFREF, MOCA_NUMREF, MOCA_FECHA, MOCA_CONC, MOCA_DEBITOS, MOCA_CREDITOS, MOCA_DB, MOCA_IDREF)
            VALUES(GEN_ID(ID_MOVCAJA,1), :CAJA, 66, :Pref, :Num, :Fec, :Conc, 0, :monto, 'N', :id);
    /* Actualice la salida del documento en la caja origen */
    if (FORMA <> 1) then
        BEGIN
        IDD = 0;
        SELECT FIRST 1 DPCA_ID FROM DOCUMENTOS_PAGO_CAJA WHERE FOPA_ID = :FORMA AND DPCA_BANCO = :BANCO AND DPCA_CUENTA = :CUENTA AND
            DPCA_NUMERO = :NUMERO AND CAJA_ID = :CAJA AND DPCA_TIPOSAL = 0 AND DPCA_IDSAL = 0 AND DPCA_MONTO = :MONTO
            ORDER BY DPCA_TIPOENT, DPCA_IDENT INTO :IDD;
        if (IDD <> 0) then
            UPDATE DOCUMENTOS_PAGO_CAJA
                SET DPCA_TIPOSAL = 66, DPCA_IDSAL = :ID
                WHERE DPCA_ID = :IDD;
        else
            BEGIN
/*            update traslados_caja_det set fopa_id = 1 where TRCJ_ID = :id and TRCD_ITEM = :item;*/
            EXECUTE PROCEDURE RESTE_SALDO_EFECTIVO(:CAJA, :FEC, :MONTO, 'N');
            END
        END
    else
        EXECUTE PROCEDURE RESTE_SALDO_EFECTIVO (:CAJA, :Fec, :MONTO, 'N');
    END

/* las planillas de pasajeros   */
FOR SELECT PLPA_ID, PLPA_fecha, PLPA_pref, PLPA_numero, PLPA_caja, PLPA_NETO
    from planilla_pasajeros where plpa_anulado = 'N' and plpa_neto > 0
    order by PLPA_FECHA, PLPA_ID
    INTO :ID, :Fec, :Pref, :Num, :Caja, :monto
    DO
    BEGIN
    CONC = 'PLANILLA DE PASAJEROS No. ' || :pref || :num;
    INSERT INTO MOVIMIENTO_CAJA
        (MOCA_ID, CAJA_ID, MOCA_TIPOREF, MOCA_PREFREF, MOCA_NUMREF, MOCA_FECHA, MOCA_CONC, MOCA_DEBITOS, MOCA_CREDITOS, MOCA_DB, MOCA_IDREF)
        VALUES(GEN_ID(ID_MOVCAJA,1), :caja, 88, :pref, :numero, :fec, :Conc, 0, :monto, 'N', :id);
    EXECUTE PROCEDURE RESTE_SALDO_EFECTIVO(:caja, :fec, :monto, 'N');
    END

/* INCORPORE LOS EGRESOS DE CAJA */
FOR SELECT E.EGRE_ID, egre_fecha, egre_conc, pref_pre, egre_numero, C.caja_id, FOPA_ID, EGCA_BANCO, EGCA_CUENTA, EGCA_NUMERO, EGCA_FECHA, EGCA_MONTO, EGCA_ITEM
    FROM EGRESOS E, EGRESOS_CAJA C where E.egre_id = C.egre_id and egre_anulado = 'N' AND C.CAJA_ID >= :cajaini AND C.CAJA_ID <= :cajafin
    ORDER BY CAJA_ID, E.EGRE_FECHA, E.EGRE_ID, EGCA_ITEM
    INTO :ID, :Fec, :Conc, :Pref, :Num, :Caja, :forma, :banco, :cuenta, :numero, :fecha, :monto, :item
    DO
    BEGIN
    select COUNT(*) from movimiento_caja where moca_tiporef = 62 and moca_idref = :id and caja_id = :caja into :Existe;
    if (Existe > 0) then
        update movimiento_caja
        set moca_creditos = moca_creditos + :monto
        where moca_tiporef = 62 and moca_idref = :id and caja_id = :caja;
    else
        INSERT INTO MOVIMIENTO_CAJA
            (MOCA_ID, CAJA_ID, MOCA_TIPOREF, MOCA_PREFREF, MOCA_NUMREF, MOCA_FECHA, MOCA_CONC, MOCA_DEBITOS, MOCA_CREDITOS, MOCA_DB, MOCA_IDREF)
            VALUES(GEN_ID(ID_MOVCAJA,1), :caja, 62, :Pref, :Num, :Fec, :Conc, 0, :monto, 'N', :id);
    /* ACTUALICE LA SALIDA DEL DOCUMENTO */
    if (FORMA <> 1) then
        begin
        IDD = 0;
        SELECT FIRST 1 DPCA_ID FROM DOCUMENTOS_PAGO_CAJA WHERE FOPA_ID = :FORMA AND DPCA_BANCO = :BANCO AND DPCA_CUENTA = :CUENTA AND
            DPCA_NUMERO = :NUMERO AND CAJA_ID = :CAJA AND DPCA_TIPOSAL = 0 AND DPCA_IDSAL = 0 AND DPCA_MONTO = :MONTO
            ORDER BY DPCA_TIPOENT, DPCA_IDENT INTO :IDD;
        if (IDD <> 0) then
            UPDATE DOCUMENTOS_PAGO_CAJA
                SET DPCA_TIPOSAL = 62, DPCA_IDSAL = :ID
                WHERE DPCA_ID = :IDD;
        else
            begin
/*            update egresos_caja set fopa_id = 1 where egre_id = :id and EGCA_ITEM = :item;*/
            EXECUTE PROCEDURE RESTE_SALDO_EFECTIVO(:CAJA, :FEC, :MONTO, 'N');
            end
        end
    ELSE
        EXECUTE PROCEDURE RESTE_SALDO_EFECTIVO(:CAJA, :FEC, :MONTO, 'N');
    END

/* INCORPORE LAS CONSIGNACIONES */
FOR SELECT C.CONS_ID, cons_fecha, cons_concepto, prba_pref, cons_numero, caja_id, FOPA_ID, CODE_BANCO, CODE_CUENTA, CODE_NUMERO, CODE_FECHA, CODE_MONTO, CODE_ITEM2
    FROM CONSIGNA C, CONSIGNA_DETALLE D where C.CONS_ID = D.CONS_ID and cons_anulado = 'N' AND CAJA_ID >= :cajaini AND CAJA_ID <= :cajafin
    ORDER BY CAJA_ID, C.CONS_FECHA, C.CONS_ID, CODE_ITEM2
    INTO :ID, :Fec, :Conc, :Pref, :Num, :Caja, :forma, :banco, :cuenta, :numero, :fecha, :monto, :item
    DO
    BEGIN
    select COUNT(*) from movimiento_caja where moca_tiporef = 71 and moca_idref = :id and caja_id = :caja into :Existe;
    if (Existe > 0) then
        update movimiento_caja
            set moca_creditos = moca_creditos + :monto
            where moca_tiporef = 71 and moca_idref = :id and caja_id = :caja;
    else
        INSERT INTO MOVIMIENTO_CAJA
            (MOCA_ID, CAJA_ID, MOCA_TIPOREF, MOCA_PREFREF, MOCA_NUMREF, MOCA_FECHA, MOCA_CONC, MOCA_DEBITOS, MOCA_CREDITOS, MOCA_DB, MOCA_IDREF)
            VALUES(GEN_ID(ID_MOVCAJA,1), :CAJA, 71, :Pref, :Num, :Fec, :Conc, 0, :monto, 'N', :id);
    /* ACTUALICE LA SALIDA DEL DOCUMENTO DE PAGO */
    if (FORMA <> 1) then
        BEGIN
        IDD = 0;
        SELECT FIRST 1 DPCA_ID FROM DOCUMENTOS_PAGO_CAJA WHERE FOPA_ID = :FORMA AND DPCA_BANCO = :BANCO AND DPCA_CUENTA = :CUENTA AND
            DPCA_NUMERO = :NUMERO AND CAJA_ID = :CAJA AND DPCA_TIPOSAL = 0 AND DPCA_IDSAL = 0 AND DPCA_MONTO = :MONTO
            ORDER BY DPCA_TIPOENT, DPCA_IDENT INTO :IDD;
        if (IDD <> 0) then
            UPDATE DOCUMENTOS_PAGO_CAJA
                SET DPCA_TIPOSAL = 71, DPCA_IDSAL = :id
                WHERE DPCA_ID = :IDD;
        ELSE
            BEGIN
/*            update consigna_detalle set fopa_id = 1 where CONS_ID = :id and CODE_ITEM2 = :item;*/
            EXECUTE PROCEDURE RESTE_SALDO_EFECTIVO(:CAJA, :FEC, :MONTO, 'N');
            END
        END
    ELSE
        EXECUTE PROCEDURE RESTE_SALDO_EFECTIVO(:CAJA, :FEC, :MONTO, 'N');
    END

/* CONSIGNACIONES DE TARJETAS */
FOR SELECT C.COTJ_ID, cotj_fecha, cotj_concepto, pref_pre, cotj_numero, caja_id, FOPA_ID, TARJ_COD, CTJD_NROTJ, CTJD_COMPROB, COTJ_FECHA, CTJD_BASE
    FROM CONSIGNA_TARJETAS C, CONSIGNA_TARJETAS_DET D where C.cotj_id = D.cotj_id and cotj_anulado = 'N' AND CAJA_ID >= :cajaini AND CAJA_ID <= :cajafin
    ORDER BY CAJA_ID, C.COTJ_FECHA, C.cotj_id, CTJD_ITEM
    INTO :ID, :Fec, :Conc, :Pref, :Num, :Caja, :forma, :banco, :cuenta, :numero, :fecha, :monto
    DO
    BEGIN
    select COUNT(*) from movimiento_caja where moca_tiporef = 64 and moca_idref = :id into :Existe;
    if (Existe > 0) then
        update movimiento_caja
            set moca_creditos = moca_creditos + :monto
            where moca_tiporef = 64 and moca_idref = :id;
    else
        INSERT INTO MOVIMIENTO_CAJA
            (MOCA_ID, CAJA_ID, MOCA_TIPOREF, MOCA_PREFREF, MOCA_NUMREF, MOCA_FECHA, MOCA_CONC, MOCA_DEBITOS, MOCA_CREDITOS, MOCA_DB, MOCA_IDREF)
            VALUES(GEN_ID(ID_MOVCAJA,1), :Caja, 64, :Pref, :Num, :Fec, :Conc, 0, :monto, 'N', :id);

  /* ACTUALICE LA SALIDA DEL DOCUMENTO DE PAGO */
  IDD = 0;
  SELECT FIRST 1 DPCA_ID FROM DOCUMENTOS_PAGO_CAJA WHERE FOPA_ID = :FORMA AND DPCA_BANCO = :BANCO AND DPCA_CUENTA = :CUENTA AND
    DPCA_NUMERO = :NUMERO AND CAJA_ID = :CAJA AND DPCA_TIPOSAL = 0 AND DPCA_IDSAL = 0 AND DPCA_MONTO = :MONTO
    ORDER BY DPCA_TIPOENT, DPCA_IDENT INTO :IDD;
  if (IDD <> 0) then
      UPDATE DOCUMENTOS_PAGO_CAJA
        SET DPCA_TIPOSAL = 64, DPCA_IDSAL = :id
        WHERE DPCA_ID = :IDD;
  ELSE
    begin
    EXECUTE PROCEDURE RESTE_SALDO_EFECTIVO(:CAJA, :FEC, :MONTO, 'N');
    end
  end

/* INCORPORE LOS CAMBIOS DE DOCUMENTOS */
FOR SELECT C.CADO_ID, cado_fecha, cado_conc, pref_pre, cado_numero, caja_id, FOPA_ID, CDEN_BANCO, CDEN_CUENTA, CDEN_NUMERO, CDEN_FECHA, CDEN_MONTO, CDEN_ITEM
    FROM CAMBIO_DOCUMENTOS C, CAMBIODOC_ENTRADAS D where C.CADO_ID = D.CADO_ID and cado_anulado = 'N' AND CAJA_ID >= :cajaini AND CAJA_ID <= :cajafin
    ORDER BY CAJA_ID, C.CADO_FECHA, C.CADO_ID, CDEN_ITEM
    INTO :ID, :Fec, :Conc, :Pref, :Num, :Caja, :forma, :banco, :cuenta, :numero, :fecha, :monto, :item
    DO
    BEGIN
    select COUNT(*) from movimiento_caja where moca_tiporef = 63 and moca_idref = :id and caja_id = :CAJA into :Existe;
    if (Existe > 0) then
        begin
        update movimiento_caja
            set moca_creditos = moca_creditos + :monto
            where moca_tiporef = 63 and moca_idref = :id and caja_id = :CAJA;
        end
    else
        INSERT INTO MOVIMIENTO_CAJA
            (MOCA_ID, CAJA_ID, MOCA_TIPOREF, MOCA_PREFREF, MOCA_NUMREF, MOCA_FECHA, MOCA_CONC, MOCA_DEBITOS, MOCA_CREDITOS, MOCA_DB, MOCA_IDREF)
            VALUES(GEN_ID(ID_MOVCAJA,1), :CAJA, 63, :Pref, :Num, :Fec, :Conc, 0, :monto, 'N', :id);
        
    /* ACTUALICE LA SALIDA DEL DOCUMENTO */
    if (FORMA <> 1) then
        BEGIN
        IDD = 0;
        SELECT FIRST 1 DPCA_ID FROM DOCUMENTOS_PAGO_CAJA WHERE FOPA_ID = :FORMA AND DPCA_BANCO = :BANCO AND DPCA_CUENTA = :CUENTA AND
            DPCA_NUMERO = :NUMERO AND CAJA_ID = :CAJA AND DPCA_TIPOSAL = 0 AND DPCA_IDSAL = 0 AND DPCA_MONTO = :MONTO
            ORDER BY DPCA_TIPOENT, DPCA_IDENT INTO :IDD;
        if (IDD <> 0) then
            UPDATE DOCUMENTOS_PAGO_CAJA
                SET DPCA_TIPOSAL = 63, DPCA_IDSAL = :id
                WHERE DPCA_ID = :IDD;
        ELSE
            BEGIN
/*            update cambiodoc_entradas set fopa_id = 1 where CADO_ID = :id and CDEN_ITEM = :item;*/
            EXECUTE PROCEDURE RESTE_SALDO_EFECTIVO(:CAJA, :FEC, :MONTO, 'N');
            END
        END
    ELSE
        EXECUTE PROCEDURE RESTE_SALDO_EFECTIVO(:CAJA, :FEC, :MONTO, 'N');
    END
end
^

SET TERM ; ^

/* 20101020 */
/* agregar mas formas de pago y devoluciones sin importar prefijo */
SET TERM ^ ;

CREATE OR ALTER procedure CIERRE_FACTURACION (
    FECHA date,
    PUNTO integer,
    PREFIJO varchar(4))
returns (
    PREF varchar(4),
    AUTORIZA varchar(20),
    PUNTOVTA varchar(60),
    NUMINI varchar(6),
    NUMFIN varchar(6),
    NROFAC integer,
    HORAINI time,
    HORAFIN time,
    BASEFAC numeric(18,2),
    IVAFAC numeric(18,2),
    TOTALFAC numeric(18,2),
    NROITE integer,
    NRODEV integer,
    BASEDEV numeric(18,2),
    IVADEV numeric(18,2),
    TOTALDEV numeric(18,2),
    BASENETO numeric(18,2),
    IVANETO numeric(18,2),
    TOTALNETO numeric(18,2),
    BASEF0 numeric(18,2),
    IVAF0 numeric(18,2),
    TOTALF0 numeric(18,2),
    BASED0 numeric(18,2),
    IVAD0 numeric(18,2),
    TOTALD0 numeric(18,2),
    BASEF1 numeric(18,2),
    IVAF1 numeric(18,2),
    TOTALF1 numeric(18,2),
    BASED1 numeric(18,2),
    IVAD1 numeric(18,2),
    TOTALD1 numeric(18,2),
    BASEF2 numeric(18,2),
    IVAF2 numeric(18,2),
    TOTALF2 numeric(18,2),
    BASED2 numeric(18,2),
    IVAD2 numeric(18,2),
    TOTALD2 numeric(18,2),
    BASEF3 numeric(18,2),
    IVAF3 numeric(18,2),
    TOTALF3 numeric(18,2),
    BASED3 numeric(18,2),
    IVAD3 numeric(18,2),
    TOTALD3 numeric(18,2),
    BASEF4 numeric(18,2),
    IVAF4 numeric(18,2),
    TOTALF4 numeric(18,2),
    BASED4 numeric(18,2),
    IVAD4 numeric(18,2),
    TOTALD4 numeric(18,2),
    FORMAP1 numeric(18,2),
    FORMAP2 numeric(18,2),
    FORMAP3 numeric(18,2),
    FORMAP4 numeric(18,2),
    FORMAP5 numeric(18,2),
    FORMAP6 numeric(18,2),
    FORMAP7 numeric(18,2),
    FORMAP8 numeric(18,2),
    FORMAP9 numeric(18,2),
    FORMAP10 numeric(18,2),
    FORMAP11 numeric(18,2),
    FORMAP12 numeric(18,2),
    CARTERA numeric(18,2),
    VENDEDOR1 varchar(60),
    VTAVEND1 numeric(18,2),
    VENDEDOR2 varchar(60),
    VTAVEND2 numeric(18,2),
    VENDEDOR3 varchar(60),
    VTAVEND3 numeric(18,2),
    VENDEDOR4 varchar(60),
    VTAVEND4 numeric(18,2),
    VENDEDOR5 varchar(60),
    VTAVEND5 numeric(18,2),
    NROFACTANUL integer,
    IVANUL numeric(18,2),
    TOTALFACANUL numeric(18,2))
AS
declare variable tarifa NUMERIC(9,2);
declare variable BASEF NUMERIC(18,2);
declare variable IVAF NUMERIC(18,2);
declare variable TOTALF NUMERIC(18,2);
declare variable BASEDv NUMERIC(18,2);
declare variable IVAD NUMERIC(18,2);
declare variable TOTALD NUMERIC(18,2);
declare variable I INTEGER;
declare variable CODVEN INTEGER;
declare variable VENDED VARCHAR(60);
declare variable R_IDDOC INTEGER;
declare variable F_ID INTEGER;
declare variable F_TOTAL NUMERIC(18,2);
declare variable FACTOR NUMERIC(18,4);
declare variable AJUSTE INTEGER;
begin
AJUSTE = 0;
if (PREFIJO <> '') then
  SELECT PREF_PRE, AUTO_NUMERO FROM AUTORIZACIONES WHERE PREF_PRE = :PREFIJO INTO :PREF, :autoriza;
SELECT PTVT_NOM FROM PUNTO_VENTA WHERE PTVT_ID = :punto INTO :puntovta;
SELECT MIN(AUDI_HORA) FROM AUDITORIA WHERE TIDO_COD = 131 AND AUDI_FECHA = :FECHA INTO :HORAINI;
HORAFIN = CAST('NOW' AS TIME);
  /* LAS VENTAS */
  SELECT MIN(FACT_NUMERO), MAX(FACT_NUMERO), COUNT(FACT_NUMERO), SUM(FACT_TOTAL - FACT_IVAMONTO), SUM(FACT_IVAMONTO), SUM(FACT_TOTAL)
    FROM FACTURAS WHERE FACT_FECHA = :FECHA AND PTVT_ID = :PUNTO AND ((PREF_PRE = :PREFIJO) or (:PREFIJO = '')) and FACT_ANULADO = 'N'
    INTO :NUMINI, :NUMFIN, :NROFAC, :BASENETO, :IVANETO, :TOTALNETO;
  SELECT COUNT(FADE_ITEM), SUM(FADE_TOTAL-FADE_IVAMONTO), SUM(FADE_IVAMONTO), SUM(FADE_TOTAL) FROM facturas_detalle D, FACTURAS F
    WHERE D.FACT_ID = F.FACT_ID AND FACT_FECHA = :FECHA AND PTVT_ID = :PUNTO AND ((PREF_PRE = :PREFIJO) or (:PREFIJO = '')) AND FADE_CANT > 0 and FACT_ANULADO = 'N' and substring(d.arti_cod from 1 FOR 2) <> '.t'
    INTO :nroite, :BASEFAC, :IVAFAC, :TOTALFAC;
  SELECT COUNT(FADE_ITEM), SUM(FADE_IVAMONTO-FADE_TOTAL), SUM(FADE_IVAMONTO*-1), SUM(FADE_TOTAL*-1) FROM facturas_detalle D, FACTURAS F
    WHERE D.FACT_ID = F.FACT_ID AND FACT_FECHA = :FECHA AND PTVT_ID = :PUNTO AND ((PREF_PRE = :PREFIJO) or (:PREFIJO = '')) AND FADE_CANT < 0 and FACT_ANULADO = 'N' and substring(d.arti_cod from 1 FOR 2) <> '.t'
    INTO :NRODEV, :BASEDEV, :IVADEV, :TOTALDEV;
  SELECT COUNT(DVDE_ITEM), SUM(DVDE_TOTAL-DVDE_IVAMONTO), SUM(DVDE_IVAMONTO), SUM(DVDE_TOTAL) FROM devoluciones_ventas_detalle D, devoluciones_ventas F
    WHERE D.DEVT_ID = F.DEVT_ID AND DEVT_FECHA = :FECHA AND PTVT_ID = :PUNTO AND DEVT_ANULADO = 'N' and substring(d.arti_cod from 1 FOR 2) <> '.t'
    INTO :I, :BASEDV, :IVAD, :TOTALD;
  SELECT COUNT(FACT_NUMERO),SUM(FACT_TOTAL - FACT_IVAMONTO), SUM(FACT_IVAMONTO) FROM FACTURAS
    WHERE FACT_FECHA = :FECHA AND PTVT_ID = :PUNTO AND ((PREF_PRE = :PREFIJO) or (:PREFIJO = '')) and FACT_ANULADO = 'S'
    INTO :NROFACTANUL, :TOTALFACANUL, :IVANUL;
  if (nrofac is null) then
    nrofac = 0;
  if (NROFACTANUL is null) then
    NROFACTANUL = 0;
  if (TOTALFACANUL is null) then
    TOTALFACANUL = 0;
  if (IVANUL is null) then
    IVANUL = 0;
  if (baseneto is null) then
    baseneto = 0;
  if (ivaneto is null) then
    ivaneto = 0;
  if (totalneto is null) then
    totalneto = 0;
  if (nroite is null) then
    nroite = 0;
  if (basefac is null) then
    basefac = 0;
  if (ivafac is null) then
    ivafac = 0;
  if (totalfac is null) then
    totalfac = 0;
  if (nrodev is null) then
    nrodev = 0;
  if (basedev is null) then
    basedev = 0;
  if (ivadev is null) then
    ivadev = 0;
  if (totaldev is null) then
    totaldev = 0;
  if (I is null) then
    I = 0;
  if (basedv is null) then
    basedv = 0;
  if (ivad is null) then
    ivad = 0;
  if (totald is null) then
    totald = 0;
  NRODEV = NRODEV + I;
  BASENETO = BASENETO - BASEDV;
  IVANETO = IVANETO - IVAD;
  TOTALNETO = TOTALNETO - TOTALD;

  BASEDEV = BASEDEV + BASEDV;
  IVADEV = IVADEV + IVAD;
  TOTALDEV = TOTALDEV + TOTALD;

  /* POR TARIFA DE IVA */
  I = 0;
  BASEF0 = 0;
  BASED0 = 0;
  IVAF0 = 0;
  IVAD0 = 0;
  TOTALF0 = 0;
  TOTALD0 = 0;
  BASEF1 = 0;
  BASED1 = 0;
  IVAF1 = 0;
  IVAD1 = 0;
  TOTALF1 = 0;
  TOTALD1 = 0;
  BASEF2 = 0;
  BASED2 = 0;
  IVAF2 = 0;
  IVAD2 = 0;
  TOTALF2 = 0;
  TOTALD2 = 0;
  BASEF3 = 0;
  BASED3 = 0;
  IVAF3 = 0;
  IVAD3 = 0;
  TOTALF3 = 0;
  TOTALD3 = 0;
  BASEF4 = 0;
  BASED4 = 0;
  IVAF4 = 0;
  IVAD4 = 0;
  TOTALF4 = 0;
  TOTALD4 = 0;
  vtavend1 = 0;
  vtavend2 = 0;
  vtavend3 = 0;
  vtavend4 = 0;
  vtavend5 = 0;
  FOR SELECT TAIV_PORC FROM TARIFA_IVA ORDER BY TAIV_PORC INTO :TARIFA DO
    BEGIN
    I = I + 1;
    SELECT SUM(FADE_TOTAL-FADE_IVAMONTO), SUM(FADE_IVAMONTO), SUM(FADE_TOTAL) FROM facturas_detalle D, FACTURAS F
        WHERE D.FACT_ID = F.FACT_ID AND FACT_FECHA = :FECHA AND PTVT_ID = :PUNTO AND ((PREF_PRE = :PREFIJO) or (:PREFIJO = '')) AND FADE_CANT > 0 AND FADE_IVAPORC = :TARIFA and FACT_ANULADO = 'N'
        INTO :BASEF, :IVAF, :TOTALF;
    SELECT SUM(FADE_TOTAL-FADE_IVAMONTO), SUM(FADE_IVAMONTO), SUM(FADE_TOTAL) FROM facturas_detalle D, FACTURAS F
        WHERE D.FACT_ID = F.FACT_ID AND FACT_FECHA = :FECHA AND PTVT_ID = :PUNTO AND ((PREF_PRE = :PREFIJO) or (:PREFIJO = '')) AND FADE_CANT < 0 AND FADE_IVAPORC = :TARIFA and FACT_ANULADO = 'N'
        INTO :BASEDV, :IVAD, :TOTALD;
    if (basef is null) then
        basef = 0;
    if (ivaf is null) then
        ivaf = 0;
    if (totalf is null) then
        totalf = 0;
    if (basedv is null) then
        basedv = 0;
    if (ivad is null) then
        ivad = 0;
    if (totald is null) then
        totald = 0;

    FACTOR = 1;
    SELECT AJCI_FACTOR FROM ajuste_cierre WHERE AJCI_PORC = :TARIFA AND AJCI_FECINI <= :FECHA AND AJCI_FECFIN >= :FECHA INTO :FACTOR;
    if (FACTOR IS null) then
        FACTOR = 1;
    if (FACTOR <> 1) then
        AJUSTE = 1;
    BASEF = BASEF * FACTOR;
    BASEDV = BASEDV * FACTOR;
    IVAF = IVAF * FACTOR;
    IVAD = IVAD * FACTOR;
    TOTALF = TOTALF * FACTOR;
    TOTALD = TOTALD * FACTOR;

    if (I = 1) then
        BEGIN
        BASEF0 = BASEF;
        BASED0 = :BASEDV;
        IVAF0 = IVAF;
        IVAD0 = IVAD;
        TOTALF0 = TOTALF;
        TOTALD0 = TOTALD;
        SELECT SUM(DVDE_TOTAL-DVDE_IVAMONTO), SUM(DVDE_IVAMONTO), SUM(DVDE_TOTAL) FROM devoluciones_ventas_detalle D, devoluciones_ventas F
            WHERE D.DEVT_ID = F.DEVT_ID AND DEVT_FECHA = :FECHA AND PTVT_ID = :PUNTO AND DVDE_IVAPORC = :TARIFA and DEVT_ANULADO = 'N'
            INTO :BASEDV, :IVAD, :TOTALD;
        if (basedv is null) then
            basedv = 0;
        if (ivad is null) then
            ivad = 0;
        if (totald is null) then
            totald = 0;
        BASED0 = BASED0 - BASEDV;
        IVAD0 = IVAD0 - IVAD;
        TOTALD0 = TOTALD0 - TOTALD;
        END
    if (I = 2) then
        BEGIN
        BASEF1 = BASEF;
        BASED1 = :BASEDV;
        IVAF1 = IVAF;
        IVAD1 = IVAD;
        TOTALF1 = TOTALF;
        TOTALD1 = TOTALD;
        SELECT SUM(DVDE_TOTAL-DVDE_IVAMONTO), SUM(DVDE_IVAMONTO), SUM(DVDE_TOTAL) FROM devoluciones_ventas_detalle D, devoluciones_ventas F
            WHERE D.DEVT_ID = F.DEVT_ID AND DEVT_FECHA = :FECHA AND PTVT_ID = :PUNTO AND DVDE_IVAPORC = :TARIFA and DEVT_ANULADO = 'N'
            INTO :BASEDV, :IVAD, :TOTALD;
        if (basedv is null) then
            basedv = 0;
        if (ivad is null) then
            ivad = 0;
        if (totald is null) then
            totald = 0;
        BASED1 = BASED1 - BASEDV;
        IVAD1 = IVAD1 - IVAD;
        TOTALD1 = TOTALD1 - TOTALD;
        END
    if (I = 3) then
        BEGIN
        BASEF2 = BASEF;
        BASED2 = :BASEDV;
        IVAF2 = IVAF;
        IVAD2 = IVAD;
        TOTALF2 = TOTALF;
        TOTALD2 = TOTALD;
        SELECT SUM(DVDE_TOTAL-DVDE_IVAMONTO), SUM(DVDE_IVAMONTO), SUM(DVDE_TOTAL) FROM devoluciones_ventas_detalle D, devoluciones_ventas F
            WHERE D.DEVT_ID = F.DEVT_ID AND DEVT_FECHA = :FECHA AND PTVT_ID = :PUNTO AND DVDE_IVAPORC = :TARIFA and DEVT_ANULADO = 'N'
            INTO :BASEDV, :IVAD, :TOTALD;
        if (basedv is null) then
            basedv = 0;
        if (ivad is null) then
            ivad = 0;
        if (totald is null) then
            totald = 0;
        BASED2 = BASED2 - BASEDV;
        IVAD2 = IVAD2 - IVAD;
        TOTALD2 = TOTALD2 - TOTALD;
        END
    if (I = 4) then
        BEGIN
        BASEF3 = BASEF;
        BASED3 = :BASEDV;
        IVAF3 = IVAF;
        IVAD3 = IVAD;
        TOTALF3 = TOTALF;
        TOTALD3 = TOTALD;
        SELECT SUM(DVDE_TOTAL-DVDE_IVAMONTO), SUM(DVDE_IVAMONTO), SUM(DVDE_TOTAL) FROM devoluciones_ventas_detalle D, devoluciones_ventas F
            WHERE D.DEVT_ID = F.DEVT_ID AND DEVT_FECHA = :FECHA AND PTVT_ID = :PUNTO AND DVDE_IVAPORC = :TARIFA and DEVT_ANULADO = 'N'
            INTO :BASEDV, :IVAD, :TOTALD;
        if (basedv is null) then
            basedv = 0;
        if (ivad is null) then
            ivad = 0;
        if (totald is null) then
            totald = 0;
        BASED3 = BASED3 - BASEDV;
        IVAD3 = IVAD3 - IVAD;
        TOTALD3 = TOTALD3 - TOTALD;
        END
    if (I = 5) then
        BEGIN
        BASEF4 = BASEF;
        BASED4 = :BASEDV;
        IVAF4 = IVAF;
        IVAD4 = IVAD;
        TOTALF4 = TOTALF;
        TOTALD4 = TOTALD;
        SELECT SUM(DVDE_TOTAL-DVDE_IVAMONTO), SUM(DVDE_IVAMONTO), SUM(DVDE_TOTAL) FROM devoluciones_ventas_detalle D, devoluciones_ventas F
            WHERE D.DEVT_ID = F.DEVT_ID AND DEVT_FECHA = :FECHA AND PTVT_ID = :PUNTO AND DVDE_IVAPORC = :TARIFA and DEVT_ANULADO = 'N'
            INTO :BASEDV, :IVAD, :TOTALD;
        if (basedv is null) then
            basedv = 0;
        if (ivad is null) then
            ivad = 0;
        if (totald is null) then
            totald = 0;
        BASED4 = BASED4 - BASEDV;
        IVAD4 = IVAD4 - IVAD;
        TOTALD4 = TOTALD4 - TOTALD;
        END
    END
  /* POR FORMA DE PAGO */
  SELECT SUM(RCPA_MONTO) FROM RECIBOS_CAJA_PAGO P, RECIBOS_CAJA R, PUNTO_VENTA PT
    WHERE R.RECA_ID = P.RECA_ID AND PT.PTVT_ID = :punto AND RECA_FECHA = :FECHA AND PT.caja_id = R.caja_id AND ((PT.PREF_PRE = :PREFIJO) or (:PREFIJO = '')) AND FOPA_ID = 1 and RECA_ANULADO = 'N'
    INTO :FORMAP1;
  SELECT SUM(RCPA_MONTO) FROM RECIBOS_CAJA_PAGO P, RECIBOS_CAJA R, PUNTO_VENTA PT
    WHERE R.RECA_ID = P.RECA_ID AND PT.PTVT_ID = :punto AND RECA_FECHA = :FECHA AND PT.caja_id = R.caja_id AND ((PT.PREF_PRE = :PREFIJO) or (:PREFIJO = '')) AND FOPA_ID = 2 and RECA_ANULADO = 'N'
    INTO :FORMAP2;
  SELECT SUM(RCPA_MONTO) FROM RECIBOS_CAJA_PAGO P, RECIBOS_CAJA R, PUNTO_VENTA PT
    WHERE R.RECA_ID = P.RECA_ID AND PT.PTVT_ID = :punto AND RECA_FECHA = :FECHA AND PT.caja_id = R.caja_id AND ((PT.PREF_PRE = :PREFIJO) or (:PREFIJO = '')) AND FOPA_ID = 3 and RECA_ANULADO = 'N'
    INTO :FORMAP3;
  SELECT SUM(RCPA_MONTO) FROM RECIBOS_CAJA_PAGO P, RECIBOS_CAJA R, PUNTO_VENTA PT
    WHERE R.RECA_ID = P.RECA_ID AND PT.PTVT_ID = :punto AND RECA_FECHA = :FECHA AND PT.caja_id = R.caja_id AND ((PT.PREF_PRE = :PREFIJO) or (:PREFIJO = '')) AND FOPA_ID = 4 and RECA_ANULADO = 'N'
    INTO :FORMAP4;
  SELECT SUM(RCPA_MONTO) FROM RECIBOS_CAJA_PAGO P, RECIBOS_CAJA R, PUNTO_VENTA PT
    WHERE R.RECA_ID = P.RECA_ID AND PT.PTVT_ID = :punto AND RECA_FECHA = :FECHA AND PT.caja_id = R.caja_id AND ((PT.PREF_PRE = :PREFIJO) or (:PREFIJO = '')) AND FOPA_ID = 5 and RECA_ANULADO = 'N'
    INTO :FORMAP5;
  SELECT SUM(RCPA_MONTO) FROM RECIBOS_CAJA_PAGO P, RECIBOS_CAJA R, PUNTO_VENTA PT
    WHERE R.RECA_ID = P.RECA_ID AND PT.PTVT_ID = :punto AND RECA_FECHA = :FECHA AND PT.caja_id = R.caja_id AND ((PT.PREF_PRE = :PREFIJO) or (:PREFIJO = '')) AND FOPA_ID = 6 and RECA_ANULADO = 'N'
    INTO :FORMAP6;
  SELECT SUM(RCPA_MONTO) FROM RECIBOS_CAJA_PAGO P, RECIBOS_CAJA R, PUNTO_VENTA PT
    WHERE R.RECA_ID = P.RECA_ID AND PT.PTVT_ID = :punto AND RECA_FECHA = :FECHA AND PT.caja_id = R.caja_id AND ((PT.PREF_PRE = :PREFIJO) or (:PREFIJO = '')) AND FOPA_ID = 7 and RECA_ANULADO = 'N'
    INTO :FORMAP7;
  SELECT SUM(RCPA_MONTO) FROM RECIBOS_CAJA_PAGO P, RECIBOS_CAJA R, PUNTO_VENTA PT
    WHERE R.RECA_ID = P.RECA_ID AND PT.PTVT_ID = :punto AND RECA_FECHA = :FECHA AND PT.caja_id = R.caja_id AND ((PT.PREF_PRE = :PREFIJO) or (:PREFIJO = '')) AND FOPA_ID = 8 and RECA_ANULADO = 'N'
    INTO :FORMAP8;
  SELECT SUM(RCPA_MONTO) FROM RECIBOS_CAJA_PAGO P, RECIBOS_CAJA R, PUNTO_VENTA PT
    WHERE R.RECA_ID = P.RECA_ID AND PT.PTVT_ID = :punto AND RECA_FECHA = :FECHA AND PT.caja_id = R.caja_id AND ((PT.PREF_PRE = :PREFIJO) or (:PREFIJO = '')) AND FOPA_ID = 9 and RECA_ANULADO = 'N'
    INTO :FORMAP9;
  SELECT SUM(RCPA_MONTO) FROM RECIBOS_CAJA_PAGO P, RECIBOS_CAJA R, PUNTO_VENTA PT
    WHERE R.RECA_ID = P.RECA_ID AND PT.PTVT_ID = :punto AND RECA_FECHA = :FECHA AND PT.caja_id = R.caja_id AND ((PT.PREF_PRE = :PREFIJO) or (:PREFIJO = '')) AND FOPA_ID = 10 and RECA_ANULADO = 'N'
    INTO :FORMAP10;
  SELECT SUM(RCPA_MONTO) FROM RECIBOS_CAJA_PAGO P, RECIBOS_CAJA R, PUNTO_VENTA PT
    WHERE R.RECA_ID = P.RECA_ID AND PT.PTVT_ID = :punto AND RECA_FECHA = :FECHA AND PT.caja_id = R.caja_id AND ((PT.PREF_PRE = :PREFIJO) or (:PREFIJO = '')) AND FOPA_ID = 11 and RECA_ANULADO = 'N'
    INTO :FORMAP11;
  SELECT SUM(RCPA_MONTO) FROM RECIBOS_CAJA_PAGO P, RECIBOS_CAJA R, PUNTO_VENTA PT
    WHERE R.RECA_ID = P.RECA_ID AND PT.PTVT_ID = :punto AND RECA_FECHA = :FECHA AND PT.caja_id = R.caja_id AND ((PT.PREF_PRE = :PREFIJO) or (:PREFIJO = '')) AND FOPA_ID = 12 and RECA_ANULADO = 'N'
    INTO :FORMAP12;

  cartera = 0;
  for SELECT FACT_ID,FACT_TOTAL FROM FACTURAS WHERE FACT_FECHA = :FECHA AND PTVT_ID = :PUNTO AND ((PREF_PRE = :PREFIJO) or (:PREFIJO = '')) and FACT_ANULADO = 'N' into :f_id,:F_TOTAL
    do
    begin
     Select COUNT(D.RECA_ID) FROM recibos_caja_detalle D, RECIBOS_CAJA R where R.RECA_ID = D.RECA_ID AND R.RECA_FECHA = :FECHA AND RECA_ANULADO = 'N' and D.RCDE_tipodoc = 31 and D.RCDE_IDDOC = :f_id into :r_iddoc;
     if (r_iddoc = 0) then
       CARTERA = :cartera + :F_TOTAL;
    end
  if (formap1 is null) then
    formap1 = 0;
  if (formap2 is null) then
    formap2 = 0;
  if (formap3 is null) then
    formap3 = 0;
  if (formap4 is null) then
    formap4 = 0;
  if (formap5 is null) then
    formap5 = 0;
  if (formap6 is null) then
    formap6 = 0;
  if (formap7 is null) then
    formap7 = 0;
  if (formap8 is null) then
    formap8 = 0;
  if (formap9 is null) then
    formap9 = 0;
  if (formap10 is null) then
    formap10 = 0;
  if (formap11 is null) then
    formap11 = 0;
  if (formap12 is null) then
    formap12 = 0;
  if (cartera is null) then
    cartera = 0;
  I = 0;
  FOR SELECT MAX(F.VEND_COD), MAX(VEND_NOMBRE), SUM(FACT_TOTAL - FACT_IVAMONTO) FROM FACTURAS F, VENDEDORES V
    WHERE F.VEND_COD = V.VEND_COD AND FACT_FECHA = :FECHA AND F.PTVT_ID = :PUNTO AND ((PREF_PRE = :PREFIJO) or (:PREFIJO = '')) and FACT_ANULADO = 'N'
    GROUP BY F.VEND_COD ORDER BY F.VEND_COD
    INTO :CODVEN, :VENDED, :TOTALF
    DO
    BEGIN
    if (totalf IS NULL) then
        TOTALF = 0;
    SELECT SUM(DEVT_TOTAL - DEVT_IVAMONTO) FROM DEVOLUCIONES_VENTAS
        WHERE VEND_COD = :CODVEN AND DEVT_FECHA = :FECHA AND PTVT_ID = :PUNTO AND ((PREF_PRE = :PREFIJO) or (:PREFIJO = '')) and DEVT_ANULADO = 'N'
        INTO :totald;
    if (TOTALD IS NULL) then
        TOTALD = 0;
    if (I = 0) then
        BEGIN
        vendedor1 = VENDED;
        vtavend1 = TOTALF - TOTALD;
        END
    if (I = 1) then
        BEGIN
        vendedor2 = VENDED;
        vtavend2 = TOTALF - TOTALD;
        END
    if (I = 2) then
        BEGIN
        vendedor3 = VENDED;
        vtavend3 = TOTALF - TOTALD;
        END
    if (I = 3) then
        BEGIN
        vendedor4 = VENDED;
        vtavend4 = TOTALF - TOTALD;
        END
    if (I = 4) then
        BEGIN
        vendedor5 = VENDED;
        vtavend5 = TOTALF - TOTALD;
        END
    I = I + 1;
    END
  if (AJUSTE = 1) then
    BEGIN
    BASEFAC = BASEF0 + BASEF1 + BASEF2 + BASEF3 + BASEF4;
    IVAFAC = IVAF0 + IVAF1 + IVAF2 + IVAF3 + IVAF4;
    TOTALFAC = totalf0 + TOTALF1 + TOTALF2 + TOTALF3 + TOTALF4;
    BASEDEV = totald0 + TOTALD1 + TOTALD2 + TOTALD3 + TOTALD4;
    IVADEV = IVAD0 + IVAD1 + IVAD2 + IVAD3 + IVAD4;
    TOTALDEV = totald0 + TOTALD1 + totald2 + totald3 + totald4;
    BASENETO = basefac - basedev;
    IVANETO = ivafac - ivadev;
    if (totalneto <> 0) Then
        begin
        formap1 = formap1 * (totalfac - totaldev) / totalneto;
        formap2 = formap2 * (totalfac - totaldev) / totalneto;
        formap3 = formap3 * (totalfac - totaldev) / totalneto;
        formap4 = formap4 * (totalfac - totaldev) / totalneto;
        formap5 = formap5 * (totalfac - totaldev) / totalneto;
        formap6 = formap6 * (totalfac - totaldev) / totalneto;
        formap7 = formap7 * (totalfac - totaldev) / totalneto;
        formap8 = formap8 * (totalfac - totaldev) / totalneto;
        formap9 = formap9 * (totalfac - totaldev) / totalneto;
        formap10 = formap10 * (totalfac - totaldev) / totalneto;
        formap11 = formap11 * (totalfac - totaldev) / totalneto;
        formap12 = formap12 * (totalfac - totaldev) / totalneto;
        vtavend1 = vtavend1 * (totalfac - totaldev) / totalneto;
        vtavend2 = vtavend2 * (totalfac - totaldev) / totalneto;
        vtavend3 = vtavend3 * (totalfac - totaldev) / totalneto;
        vtavend4 = vtavend4 * (totalfac - totaldev) / totalneto;
        vtavend5 = vtavend5 * (totalfac - totaldev) / totalneto;
        end
    TOTALNETO = totalfac - totaldev;
    END
  INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
    VALUES (USER, 123, :punto, 'I', (:formap1+:formap2+:formap3+:formap4+:formap5+:CARTERA));
  suspend;
end
^

SET TERM ; ^


/* 20101020B */
/* mal tipo de egreso para pagos de nomina */

SET TERM ^ ;

CREATE OR ALTER procedure CONTABIL_EGRESO (
    IDDOC integer,
    IDINTER integer)
returns (
    ERROR integer,
    VER char(1),
    IDC integer)
AS
declare variable PREF VARCHAR(4);
declare variable NUM VARCHAR(6);
declare variable FECAUX DATE;
declare variable FECHA CHAR(8);
declare variable CONC CHAR(120);
declare variable VRDTO NUMERIC(18, 2);
declare variable VRRTFTE NUMERIC(18, 2);
declare variable VRRTIVA NUMERIC(18, 2);
declare variable VRRTICA NUMERIC(18, 2);
declare variable VRTOTAL NUMERIC(18, 2);
declare variable TIPOCOMP VARCHAR(3);
declare variable PREFCONT VARCHAR(4);
declare variable BASE CHAR(1);
declare variable CTABASE VARCHAR(20);
declare variable CAJA CHAR(1);
declare variable CTACAJA VARCHAR(20);
declare variable RTFTE CHAR(1);
declare variable CTARTFTE VARCHAR(20);
declare variable RTIVA CHAR(1);
declare variable CTARTIVA VARCHAR(20);
declare variable RTICA CHAR(1);
declare variable CTARTICA VARCHAR(20);
declare variable DTO CHAR(1);
declare variable CTADTO VARCHAR(20);
declare variable EXISTE CHAR(1);
declare variable CUENTA VARCHAR(20);
declare variable MONTO NUMERIC(18,2);
declare variable ES_RETENCION CHAR(1);
declare variable TIPOCUEN CHAR(1);
declare variable NIT VARCHAR(20);
declare variable PROY VARCHAR(4);
declare variable CENTRO VARCHAR(4);
declare variable MONTOBASE NUMERIC(18,2);
declare variable PORC NUMERIC(9,2);
declare variable DEBITO NUMERIC(18,2);
declare variable CREDITO NUMERIC(18,2);
declare variable NROI INTEGER;
declare variable SUMA NUMERIC(18,2);
declare variable TCTACLIEN VARCHAR(20);
declare variable TCTARTFTE VARCHAR(20);
declare variable TCTARTIVA VARCHAR(20);
declare variable TCTARTICA VARCHAR(20);
declare variable TCTACART VARCHAR(20);
declare variable TIPOIT INTEGER;
declare variable IDIT INTEGER;
declare variable PREFIT VARCHAR(4);
declare variable NUMIT VARCHAR(6);
declare variable NUMEROIT VARCHAR(10);
declare variable ABONOIT NUMERIC(18,2);
declare variable CTADIC VARCHAR(20);
declare variable BASEADIC VARCHAR(20);
declare variable PORCADIC NUMERIC(5,2);
declare variable VALORADIC NUMERIC(18,2);
declare variable DBADIC CHAR(1);
declare variable VRBASE NUMERIC(18,2);
declare variable GMF CHAR(1);
declare variable CODBCO INTEGER;
declare variable NUMCHEQ VARCHAR(20);
declare variable CRUCES NUMERIC(18,2);
declare variable VRCAJA NUMERIC(18,2);
declare variable OK INTEGER;
declare variable DIFCAMBIO NUMERIC(18,2);
declare variable CTADIF VARCHAR(20);
declare variable RTFTEC NUMERIC(18,2);
declare variable RTIVAC NUMERIC(18,2);
declare variable RTICAC NUMERIC(18,2);
declare variable RTFTER CHAR(1);
declare variable CTARTFTER VARCHAR(20);
declare variable RTIVAR CHAR(1);
declare variable CTARTIVAR VARCHAR(20);
declare variable RTICAR CHAR(1);
declare variable CTARTICAR VARCHAR(20);
declare variable RET CHAR(2);
declare variable RTIT NUMERIC(18,2);
declare variable NITBCO VARCHAR(20);
declare variable NUMPROV CHAR(8);
declare variable TIPO INTEGER;
BEGIN
/* BUSQUE LA INTERFACE */
EXISTE = 'N';
SELECT 'S', TICO_COD, PRCO_PRE, INCJ_BASE, INCJ_DTOPP, INCJ_RTFTE, INCJ_RTIVA, INCJ_RTICA, INCJ_CAJA, INCJ_CTABASE, INCJ_CTADTO, INCJ_CTARTFTE, INCJ_CTARTIVA, INCJ_CTARTICA, INCJ_CTACAJA, INCJ_CONFIRMAR
    FROM INTERFAZ_CAJA
    WHERE INCJ_ID = :IDINTER
    INTO :EXISTE, :TIPOCOMP, :PREFCONT, :BASE, :DTO, :RTFTE, :RTIVA, :RTICA, :CAJA, :CTABASE, :CTADTO, :CTARTFTE, :CTARTIVA, :CTARTICA, :CTACAJA, :VER;
if (EXISTE = 'S') then
    BEGIN
    OK = 0;
    FOR SELECT CNTB_ID FROM CONTABILIZACION WHERE CNTB_TIPOREF = 62 AND CNTB_IDREF = :IDDOC INTO :OK DO
        BEGIN
        DELETE FROM CONTABILIZACION_DET WHERE CNTB_ID = :OK;
        DELETE FROM CONTABILIZACION WHERE CNTB_ID = :OK;
        END

    /* TRAIGA EL ENCABEZADO DEL EGRESO */
    SELECT PREF_PRE, EGRE_NUMERO, EGRE_FECHA, E.TERC_NIT, EGRE_CONC, EGRE_DTOF, EGRE_MONTO, EGRE_RTFTEMONTO, EGRE_RTIVAMONTO, EGRE_RTICAMONTO,
        TERC_CTARTFTE, TERC_CTARTIVA, TERC_CTARTICA, TERC_CTACLIENTE, EGRE_TIPO
        FROM EGRESOS E, TERCEROS T
        WHERE EGRE_ID = :IDDOC AND E.TERC_NIT = T.TERC_NIT
        INTO :PREF, :NUM, :FECAUX, :NIT, :CONC, :VRDTO, :VRTOTAL, :VRRTFTE, :VRRTIVA, :VRRTICA,
        :TCTARTFTE, TCTARTIVA, TCTARTICA, TCTACLIEN, :TIPO;
    /* SI ES PROVEEDOR, SOBREESCIBE LAS CUENTAS  */
    SELECT PROV_CTAPAGAR, PROV_CTARTFTE, PROV_CTARTIVA, PROV_CTARTICA
        FROM PROVEEDORES WHERE TERC_NIT = :NIT
        INTO TCTACLIEN, TCTARTFTE, TCTARTIVA, TCTARTICA;
    SELECT PREF_CENTRO, PREF_PROY FROM PREFIJOS
        WHERE PREF_PRE = :PREF AND TIDO_COD = 62 INTO :CENTRO, :PROY;
    EXECUTE PROCEDURE FECHA_A_CONTA(:FECAUX) returning_values (:FECHA);
    /* REGISTRE EL ENCABEZADO CONTABLE */
    IDC = GEN_ID(ID_CONTABILIZA, 1);
    INSERT INTO CONTABILIZACION (CNTB_ID, CNTB_TIPOCOMP, CNTB_PREFCNT, CNTB_NUMERO, CNTB_FECHA, CNTB_CONCEPTO, CNTB_REF, CNTB_TIPOREF, CNTB_IDREF, CNTB_PREFREF, CNTB_NUMREF, CNTB_PROCESADO)
        VALUES (:IDC, :TIPOCOMP, :PREFCONT, :NUM, :FECHA, :CONC, '', 62, :IDDOC, :PREF, :NUM, 'N');
    /* SUME LOS CRUCES PARA LLEVARLOS A LA CUENTA X PAGAR Y RESTAR DE LA CAJA */
    SELECT SUM(EGCC_ABONO) FROM EGRESOS_CRUCEC WHERE EGRE_ID = :iddoc INTO :CRUCES;
    if (CRUCES IS NULL) then
        CRUCES = 0;
    VRCAJA = VRTOTAL;
    NROI = 0;
    SUMA = 0;
    ERROR = 0;
    /* EL CREDITO EN LA CAJA O EL BANCO */
    IF ((CAJA = 'K')) THEN
        BEGIN
        if (VRCAJA <> 0) then
            BEGIN
            CUENTA = NULL;
            EXECUTE PROCEDURE VALIDE_CUENTA_C (CTACAJA) RETURNING_VALUES (:OK);
            IF (OK = 0) THEN
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :CTACAJA INTO :CUENTA, :TIPOCUEN;
            ELSE
                begin
                EXECUTE PROCEDURE ERROR (62, :IDDOC, :CTACAJA, 2);
                CUENTA = CTACAJA;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 4);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRCAJA, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - VRCAJA;
                END
            END /* VRCAJA <> 0 */
        END /* CAJA CONSTANTE */
    IF ((CAJA = 'F')) THEN
        BEGIN
        /* mueva la cuenta de la caja o el banco o ambas */
        /* PRIMERO LA CAJA */
        FOR SELECT CAJA_CUENTA, EGCA_MONTO FROM EGRESOS_CAJA E, CAJAS C
            WHERE C.CAJA_ID = E.CAJA_ID AND EGRE_ID = :IDDOC
            INTO :CTACAJA, :MONTO
            DO
            BEGIN
            if (MONTO <> 0) then
                BEGIN
                CUENTA = NULL;
                EXECUTE PROCEDURE VALIDE_CUENTA_C (CTACAJA) RETURNING_VALUES (:OK);
                IF (OK = 0) THEN
                    SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                        WHERE CUEN_COD = :CTACAJA INTO :CUENTA, :TIPOCUEN;
                ELSE
                    begin
                    EXECUTE PROCEDURE ERROR (62, :IDDOC, :CTACAJA, 2);
                    CUENTA = CTACAJA;
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 4);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA - MONTO;
                    END
                END /* MONTO <> 0 */
            END /* DO CAJA */
        /* AHORA EL BANCO */
        MONTO = 0;
        SELECT CUBA_CTACONTA, EGBC_MONTO, EGBC_GMF, E.CUBA_COD, CUBA_GMFPOR, EGBC_NUMERO, BANC_NIT
            FROM EGRESOS_BANCO E, CUENTAS_BANCO C, BANCOS B
            WHERE E.CUBA_COD = C.CUBA_COD AND EGRE_ID = :IDDOC AND B.banc_cod = C.banc_cod
            INTO :CTACAJA, :MONTO, :GMF, :CODBCO, :PORC, :NUMCHEQ, :nitbco;
        if (MONTO <> 0) then
            BEGIN
            if (MONTO <> 0) then
                BEGIN
                CUENTA = NULL;
                EXECUTE PROCEDURE VALIDE_CUENTA_C (CTACAJA) RETURNING_VALUES (:OK);
                IF (OK = 0) THEN
                    SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                        WHERE CUEN_COD = :CTACAJA INTO :CUENTA, :TIPOCUEN;
                ELSE
                    begin
                    EXECUTE PROCEDURE ERROR (62, :IDDOC, :CTACAJA, 2);
                    CUENTA = CTACAJA;
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 4);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, :NUMCHEQ, 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA - MONTO;
                    END
                /* EL GMF */
                if ((GMF = 'S') AND (PORC <> 0)) then
                    BEGIN
                    if (NITBCO IS NULL) then
                        NITBCO = NIT;
                    EXECUTE procedure REDONDEE(:MONTO * :PORC / 1000, 0) returning_values (MONTO);
                    /* REGISTRE EL GMF EN LA MISMA CUENTA DEL BANCO COMO CREDITO */
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, :NUMCHEQ, 0, :MONTO, 0, 0, :NITBCO, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA - MONTO;

                    /* AHORA LA CUENTA DEL GASTO */
                    SELECT CUBA_CTAGMF FROM CUENTAS_BANCO
                        where CUBA_COD = :CODBCO INTO :CTACAJA;
                    EXECUTE PROCEDURE VALIDE_CUENTA_C (CTACAJA) RETURNING_VALUES (:OK);
                    IF (OK = 0) THEN
                        SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                            WHERE CUEN_COD = :CTACAJA INTO :CUENTA, :TIPOCUEN;
                    ELSE
                        begin
                        EXECUTE PROCEDURE ERROR (62, :IDDOC, :CTACAJA, 2);
                        CUENTA = CTACAJA;
                        TIPOCUEN = 'N';
                        ERROR = ERROR + 1;
                        end
                    if (TIPOCUEN = 'I') then
                        BEGIN
                        EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
                        TIPOCUEN = 'N';
                        ERROR = ERROR + 1;
                        END
                    if (TIPOCUEN = 'C') then
                        BEGIN
                        EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 4);
                        TIPOCUEN = 'N';
                        ERROR = ERROR + 1;
                        END
                    if (TIPOCUEN = 'N') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, :NUMCHEQ, :MONTO, 0, 0, 0, :NITBCO, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NROI = NROI + 1;
                        SUMA = SUMA + MONTO;
                        END
                    END /* GMF */
                END /* MONTO <> 0 */
            END /* EGRESO_BANCO */
        END /* CAJA = F */

    /* SI ES PRESTAMO DE NOMINA CONTABILICE LA CONTRAPARTIDA */
    if (TIPO = 5) then
        BEGIN
        EXECUTE PROCEDURE lee_configuracion('NOMINA', 'PAGOS', 'CUENTA POR COBRAR POR PRESTAMOS A EMPLEADOS') returning_values (:tctacart);
        CUENTA = NULL;
        EXECUTE PROCEDURE VALIDE_CUENTA_C (tctacart) RETURNING_VALUES (:OK);
        IF (OK = 0) THEN
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :tctacart INTO :CUENTA, :TIPOCUEN;
        ELSE
            begin
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :tctacart, 2);
            CUENTA = tctacart;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRTOTAL, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            SUMA = SUMA + VRTOTAL;
            NROI = NROI + 1;
            END
        END
    /* LOS CRUCES CON CUENTAS X COBRAR */
    if (CRUCES <> 0) then
        BEGIN
        SELECT TERC_CTACLIENTE FROM TERCEROS WHERE TERC_NIT = :nit INTO :tctacart;
        if (tctacart IS NULL) then
            tctacart = tctaclien;
        CUENTA = NULL;
        EXECUTE PROCEDURE VALIDE_CUENTA_C (tctacart) RETURNING_VALUES (:OK);
        IF (OK = 0) THEN
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :tctacart INTO :CUENTA, :TIPOCUEN;
        ELSE
            begin
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :tctacart, 2);
            CUENTA = tctacart;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            /* DEBERIA RECORRER DOCUMENTO POR DOCUMENTO */
            FOR SELECT EGCC_TIPODOC, EGCC_PREFIJO, EGCC_NUMERO, EGCC_ABONO+EGCC_RTFTE+EGCC_RTIVA+EGCC_RTICA+EGCC_DTOF
                FROM egresos_crucec WHERE EGRE_ID = :IDDOC
                INTO :TIPOIT, PREFIT, NUMIT, ABONOIT
                DO
                BEGIN
                NUMEROIT = PREFIT || NUMIT;
                if (ABONOIT > 0) then
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :ABONOIT, 0, 0, :NIT, :PROY, :CENTRO, NULL, :NUMEROIT, NULL, NULL, :TIPOIT, 0);
                else
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', abs(:ABONOIT), 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, :NUMEROIT, NULL, NULL, :TIPOIT, 0);
                SUMA = SUMA - ABONOIT;
                NROI = NROI + 1;
                END
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            if (CRUCES > 0) then
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :CRUCES, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            else
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', abs(:CRUCES), 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            SUMA = SUMA - CRUCES;
            NROI = NROI + 1;
            END
        /* LA DIFERENCIA EN CAMBIO */
        SELECT SUM(EGCC_DIFCAMBIO) FROM egresos_crucec WHERE EGRE_ID = :iddoc INTO :DIFCAMBIO;
        IF ((DIFCAMBIO IS NOT NULL) AND (DIFCAMBIO <> 0)) THEN
            BEGIN
            if (DIFCAMBIO > 0) then
                execute procedure lee_configuracion('GENERAL','GENERAL','CUENTA DE INGRESO POR DIFERENCIA EN CAMBIO PARA OPERACIONES EN OTRA MONEDA') returning_values (:ctadif);
            else
                execute procedure lee_configuracion('GENERAL','GENERAL','CUENTA DE GASTO POR DIFERENCIA EN CAMBIO PARA OPERACIONES EN OTRA MONEDA') returning_values (:ctadif);
            CUENTA = NULL;
            EXECUTE PROCEDURE VALIDE_CUENTA_C (ctadif) RETURNING_VALUES (:OK);
            IF (OK = 0) THEN
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :ctadif INTO :CUENTA, :TIPOCUEN;
            ELSE
                begin
                EXECUTE PROCEDURE ERROR (62, :IDDOC, :ctadif, 2);
                CUENTA = ctadif;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 4);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                if (DIFCAMBIO > 0) then
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :difcambio, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                else
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', ABS(:difcambio), 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - difcambio;
                END
            END
        /* RETEFUENTE DEL CRUCE */
        SELECT first 1 INCJ_RTFTE, INCJ_RTIVA, INCJ_RTICA, INCJ_CTARTFTE, INCJ_CTARTIVA, INCJ_CTARTICA
            FROM INTERFAZ_CAJA WHERE tido_cod = 61 into :RTFTER, :RTIVAR, :RTICAR, :CTARTFTER, :CTARTIVAR, :CTARTICAR;
        SELECT SUM(EGCC_RTFTE) FROM egresos_crucec WHERE EGRE_ID = :iddoc INTO :rtftec;
        IF ((rtftec IS NOT NULL) AND (rtftec <> 0)) THEN
            BEGIN
            if ((RTFTER = 'T') or (RTFTER = 'K')) then
                BEGIN
                if (RTFTER = 'T') then
                    SELECT TERC_CTARTFTE FROM TERCEROS WHERE TERC_NIT = :NIT INTO CTARTFTER;
                CUENTA = NULL;
                EXECUTE PROCEDURE VALIDE_CUENTA_C (ctartfter) RETURNING_VALUES (:OK);
                IF (OK = 0) THEN
                    SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                        WHERE CUEN_COD = :ctartfter INTO :CUENTA, :TIPOCUEN;
                ELSE
                    begin
                    EXECUTE PROCEDURE ERROR (62, :IDDOC, :ctartfter, 2);
                    CUENTA = ctartfter;
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 4);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    if (rtftec > 0) then
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :rtftec, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    else
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, abs(:rtftec), 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA + rtftec;
                    END
                END
            END
        /* RETEIVA DEL CRUCE */
        SELECT SUM(EGCC_RTIVA) FROM egresos_crucec WHERE EGRE_ID = :iddoc INTO :rtivac;
        IF ((rtivac IS NOT NULL) AND (rtivac <> 0)) THEN
            BEGIN
            if ((RTIVAR = 'T') or (RTIVAR = 'K')) then
                BEGIN
                if (RTIVAR = 'T') then
                    SELECT TERC_CTARTIVA FROM TERCEROS WHERE TERC_NIT = :NIT INTO CTARTIVAR;
                CUENTA = NULL;
                EXECUTE PROCEDURE VALIDE_CUENTA_C (ctartivar) RETURNING_VALUES (:OK);
                IF (OK = 0) THEN
                    SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                        WHERE CUEN_COD = :ctartivar INTO :CUENTA, :TIPOCUEN;
                ELSE
                    begin
                    EXECUTE PROCEDURE ERROR (62, :IDDOC, :ctartivar, 2);
                    CUENTA = ctartivar;
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 4);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    if (rtivac > 0) then
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :rtivac, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    else
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, abs(:rtivac), 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA + rtivac;
                    END
                END
            END
        /* RETEICA DEL CRUCE */
        SELECT SUM(EGCC_RTICA) FROM egresos_crucec WHERE EGRE_ID = :iddoc INTO :rticac;
        IF ((rticac IS NOT NULL) AND (rtivac <> 0)) THEN
            BEGIN
            if ((RTICAR = 'T') or (RTICAR = 'K')) then
                BEGIN
                if (RTICAR = 'T') then
                    SELECT TERC_CTARTICA FROM TERCEROS WHERE TERC_NIT = :NIT INTO CTARTICAR;
                CUENTA = NULL;
                EXECUTE PROCEDURE VALIDE_CUENTA_C (ctarticar) RETURNING_VALUES (:OK);
                IF (OK = 0) THEN
                    SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                        WHERE CUEN_COD = :ctarticar INTO :CUENTA, :TIPOCUEN;
                ELSE
                    begin
                    EXECUTE PROCEDURE ERROR (62, :IDDOC, :ctarticar, 2);
                    CUENTA = ctarticar;
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 4);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    if (rticac > 0) then
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :rticac, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    else
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, abs(:rticac), 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA + rticac;
                    END
                END
            END
        END /* cruces */

    if (DTO = 'K') then /* DTO EN CTA CONSTANTE */
        BEGIN
        if (VRDTO <> 0) then
            BEGIN
            CUENTA = NULL;
            EXECUTE PROCEDURE VALIDE_CUENTA_C (CTADTO) RETURNING_VALUES (:OK);
            IF (OK = 0) THEN
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :CTADTO INTO :CUENTA, :TIPOCUEN;
            ELSE
                begin
                EXECUTE PROCEDURE ERROR (62, :IDDOC, :CTADTO, 2);
                CUENTA = CTADTO;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 4);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRDTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - VRDTO;
                END
            END /* VRDTO <> 0 */
        END /* DTO EN CTA CONSTANTE */

    /* LA DIFERENCIA EN CAMBIO */
    SELECT SUM(EGDE_DIFCAMBIO) FROM egresos_detalle WHERE EGRE_ID = :iddoc INTO :DIFCAMBIO;
    IF ((DIFCAMBIO IS NOT NULL) AND (DIFCAMBIO <> 0)) THEN
        BEGIN
        if (DIFCAMBIO > 0) then
            execute procedure lee_configuracion('GENERAL','GENERAL','CUENTA DE GASTO POR DIFERENCIA EN CAMBIO PARA OPERACIONES EN OTRA MONEDA') returning_values (:ctadif);
        else
            execute procedure lee_configuracion('GENERAL','GENERAL','CUENTA DE INGRESO POR DIFERENCIA EN CAMBIO PARA OPERACIONES EN OTRA MONEDA') returning_values (:ctadif);
        CUENTA = NULL;
        EXECUTE PROCEDURE VALIDE_CUENTA_C (ctadif) RETURNING_VALUES (:OK);
        IF (OK = 0) THEN
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :ctadif INTO :CUENTA, :TIPOCUEN;
        ELSE
            begin
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :ctadif, 2);
            CUENTA = ctadif;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 4);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            if (DIFCAMBIO > 0) then
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :difcambio, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            else
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, ABS(:difcambio), 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA + difcambio;
            END
        END
    /* RETENCION FUENTE */
    if ((RTFTE = 'T') or (RTFTE = 'K')) then
      if (VRRTFTE <> 0) then
        BEGIN
        if (RTFTE = 'T') then
            CTARTFTE = TCTARTFTE;
        CUENTA = NULL;
        EXECUTE PROCEDURE VALIDE_CUENTA_C (CTARTFTE) RETURNING_VALUES (:OK);
        IF (OK = 0) THEN
            SELECT CUEN_COD, CUEN_RETENCION, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTARTFTE INTO :CUENTA, :ES_RETENCION, :TIPOCUEN;
        ELSE
            begin
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :CTARTFTE, 2);
            CUENTA = CTARTFTE;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 4);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            if (ES_RETENCION = 'S') then
                BEGIN
                VRBASE = (VRTOTAL+VRRTFTE)*-1;
                SELECT PROV_RETEFTE from proveedores where terc_nit = :NIT INTO :PORC;
                END
            ELSE
                BEGIN
                VRBASE = 0;
                PORC = 0;
                END
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, :VRBASE, :PORC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA - VRRTFTE;
            END
        END /* RTFTE */
    /* RETENCION IVA */
    if ((RTIVA = 'T') or (RTIVA = 'K')) then
      if (VRRTIVA <> 0) then
        BEGIN
        if (RTIVA = 'T') then
            CTARTIVA = TCTARTIVA;
        CUENTA = NULL;
        EXECUTE PROCEDURE VALIDE_CUENTA_C (CTARTIVA) RETURNING_VALUES (:OK);
        IF (OK = 0) THEN
            SELECT CUEN_COD, CUEN_RETENCION, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTARTIVA INTO :CUENTA, :ES_RETENCION, :TIPOCUEN;
        ELSE
            begin
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :CTARTIVA, 2);
            CUENTA = CTARTIVA;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 4);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            if (ES_RETENCION = 'S') then
                BEGIN
                VRBASE = VRTOTAL;
                SELECT PROV_RTEIVA from proveedores where terc_nit = :NIT INTO :PORC;
                END
            ELSE
                BEGIN
                VRBASE = 0;
                PORC = 0;
                END
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTIVA, :VRBASE, :PORC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA - VRRTIVA;
            END
        END /* RTIVA */
    /* RETENCION DE ICA */
    if ((RTICA = 'T') or (RTICA = 'K')) then
      if (VRRTICA <> 0) then
        BEGIN
        if (RTICA = 'T') then
            CTARTICA = TCTARTICA;
        CUENTA = NULL;
        EXECUTE PROCEDURE VALIDE_CUENTA_C (CTARTICA) RETURNING_VALUES (:OK);
        IF (OK = 0) THEN
            SELECT CUEN_COD, CUEN_RETENCION, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTARTICA INTO :CUENTA, :ES_RETENCION, :TIPOCUEN;
        ELSE
            begin
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :CTARTICA, 2);
            CUENTA = CTARTICA;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 4);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            if (ES_RETENCION = 'S') then
                BEGIN
                VRBASE = VRTOTAL;
                SELECT PROV_RTEICA from proveedores where terc_nit = :NIT INTO :PORC;
                END
            ELSE
                BEGIN
                VRBASE = 0;
                PORC = 0;
                END
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTICA, :VRBASE, :PORC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA - VRRTICA;
            END
        END /* RTICA */
    /* RECORRA LAS CUENTAS DE EGRESOS_CONTABILIDAD */
    FOR SELECT CUEN_COD, EGCO_NIT, EGCO_PROY, EGCO_CENTRO, EGCO_CONC, EGCO_DEBITOS, EGCO_CREDITOS, EGCO_BASEM, EGCO_PORC
        FROM EGRESOS_CONTABILIDAD WHERE EGRE_ID = :IDDOC ORDER BY EGCO_ITEM
        INTO :CTABASE, :NIT, :PROY, :CENTRO, :CONC, :DEBITO, :CREDITO, :MONTOBASE, :PORC
        DO
        BEGIN
        CUENTA = NULL;
        EXECUTE PROCEDURE VALIDE_CUENTA_C (CTABASE) RETURNING_VALUES (:OK);
        IF (OK = 0) THEN
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTABASE INTO :CUENTA, :TIPOCUEN;
        ELSE
            begin
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :CTABASE, 2);
            CUENTA = CTABASE;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 4);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'N') then
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :DEBITO, :CREDITO, :MONTOBASE, :PORC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
        SUMA = SUMA + DEBITO - CREDITO;
        NROI = NROI + 1;
        END
    /* CIERRE EL COMPROBANTE CONTRA LA CUENTA DEL TERCERO O LA BASE CONSTANTE */
    if (SUMA <> 0) THEN
        BEGIN
        if (SUMA < 0) then
            BEGIN
            DEBITO = SUMA * -1;
            CREDITO = 0;
            END
        ELSE
            BEGIN
            DEBITO = 0;
            CREDITO = SUMA;
            END
        if ((BASE = 'F') or (BASE = 'T') or (BASE = 'K')) then
            BEGIN
            if (BASE = 'T') then
                CTABASE = TCTACLIEN;
            if (BASE = 'F') then
                BEGIN
                SELECT CAJA_CUENTA FROM EGRESOS E, CAJAS C
                    WHERE C.CAJA_ID = E.CAJA_ID AND EGRE_ID = :IDDOC INTO :CTABASE;
                END
            CUENTA = NULL;
            EXECUTE PROCEDURE VALIDE_CUENTA_C (CTABASE) RETURNING_VALUES (:OK);
            IF (OK = 0) THEN
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :CTABASE INTO :CUENTA, :TIPOCUEN;
            ELSE
                begin
                EXECUTE PROCEDURE ERROR (62, :IDDOC, :CTABASE, 2);
                CUENTA = CTABASE;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                /* DEBERIA RECORRER DOCUMENTO POR DOCUMENTO */
                FOR SELECT RCDE_TIPODOC, RCDE_PREFIJO, RCDE_NUMERO, RCDE_ABONO+RCDE_RTFTE+RCDE_RTIVA+RCDE_RTICA+RCDE_DTOF
                    FROM RECIBOS_CAJA_DETALLE WHERE RECA_ID = :IDDOC
                    INTO :TIPOIT, PREFIT, NUMIT, ABONOIT
                    DO
                    BEGIN
                    NUMEROIT = PREFIT || NUMIT;
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :ABONOIT, 0, 0, :NIT, :PROY, :CENTRO, NULL, :NUMEROIT, NULL, NULL, :TIPOIT, 0);
                    NROI = NROI + 1;
                    END
                END
            if (TIPOCUEN = 'N') then
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :DEBITO, :CREDITO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            END /* SUMA EN CARTERA */
        if (BASE = 'D') then
            BEGIN
            execute procedure lee_configuracion('CXPAGAR','SALDOS','DESCONTAR RETENCIONES POR CAUSACION') returning_values (RET);
            CTABASE = NULL;
            NITBCO = NIT; /* LOS DOCUMENTOS PUEDEN ESTAR CAUSADOS A OTRO NIT, GUARDE EL NIT DEL ENCABEZADO */
            FOR SELECT EGDE_TIPODOC, EGDE_IDDOC, EGDE_PREFIJO, EGDE_NUMERO, EGDE_ABONO+EGDE_DTOF, EGDE_RTFTE+EGDE_RTIVA+EGDE_RTICA, EGDE_NUMPROV
                FROM EGRESOS_DETALLE WHERE EGRE_ID = :IDDOC INTO :tipoit, :IDIT, :PREFIT, :NUMIT, :suma, :RTIT, :NUMPROV
                DO
                BEGIN
                if (TIPOIT <> 55) then
                    SELECT FIRST 1 CUEN_COD, D.TERC_NIT, PROY_COD, CENT_COD FROM COMPROBANTE_ENCABEZADO E, COMPROBANTE_DETALLE D
                        WHERE E.enco_consec = D.enco_consec AND E.enco_tiporef = :TIPOIT AND E.enco_idref = :IDIT AND
                        ((SUBSTR(CUEN_COD,1,1) = '2') or (SUBSTR(CUEN_COD,1,2) = '13'))  AND SUBSTR(CUEN_COD,1,3) <> '236' AND SUBSTR(CUEN_COD,1,4) <> '2408'
                        AND ((((:TIPOIT = 21) OR (:TIPOIT = 51)) AND (CODE_CREDITO <> 0)) or (((:TIPOIT = 24) OR (:TIPOIT = 52)) AND (CODE_DEBITO <> 0)))
                        INTO :ctabase, :nit, :proy, :centro;
                else
                    BEGIN
                    execute procedure lee_configuracion('CAJA', 'EGRESOS', 'CUENTA CONTABLE PARA LOS ANTICIPOS A ACREEDORES SI LA INTERFAZ ES POR DOCUMENTO') returning_values (ctabase);
                    if ((ctabase is null) or (ctabase = '')) then
                        BEGIN
                        SELECT GRPR_CTAANTI FROM grupos_proveedores G, proveedores C
                            WHERE C.TERC_NIT = :nit AND C.grpr_cod = G.grpr_cod INTO :ctabase;
                        if ((ctabase is null) or (ctabase = '')) then
                            CTABASE = TCTACLIEN;
                        END
                    END
                if ((ctabase is null) or (ctabase = '')) then
                    CTABASE = TCTACLIEN;
                CUENTA = NULL;
                EXECUTE PROCEDURE VALIDE_CUENTA_C (ctabase) RETURNING_VALUES (:OK);
                IF (OK = 0) THEN
                    SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                        WHERE CUEN_COD = :CTABASE INTO :CUENTA, :TIPOCUEN;
                ELSE
                    begin
                    EXECUTE PROCEDURE ERROR (62, :IDDOC, :CTABASE, 2);
                    CUENTA = CTABASE;
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    end
                if (RET = 'NO') then
                    SUMA = SUMA + RTIT;
                if (SUMA < 0) then
                    BEGIN
                    CREDITO = SUMA * -1;
                    DEBITO = 0;
                    END
                ELSE
                    BEGIN
                    CREDITO = 0;
                    DEBITO = SUMA;
                    END
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    /* DEBERIA RECORRER DOCUMENTO POR DOCUMENTO */
                    NUMEROIT = PREFIT || NUMIT;
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, :NUMPROV, :debito, :credito, 0, 0, :NIT, :PROY, :CENTRO, NULL, :NUMEROIT, NULL, NULL, :TIPOIT, 0);
                    END
                if (TIPOCUEN = 'N') then
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, :NUMPROV, :DEBITO, :CREDITO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                END /* SUMA EN CARTERA */
            NIT = NITBCO; /* RESTAURE EL NIT DEL ENCABEZADO */
            END
        END
    /* recorra las cuentas adicionales */
    FOR SELECT INJC_CUENTA, INJC_BASE, INJC_PORC, INJC_VALOR, INJC_DB
        FROM INTERFAZ_CAJA_CTAS
        WHERE INCJ_ID = :IDINTER
        INTO :CTADIC, :BASEADIC, :PORCADIC, :VALORADIC, :DBADIC
        DO
        BEGIN
        if (:BASEADIC = 'TOTAL') then
            VALORADIC = VRTOTAL;
        if (:BASEADIC = 'DESCUENTO') then
            VALORADIC = VRDTO;
        if (:BASEADIC = 'RTFTE') then
            VALORADIC = VRRTFTE;
        if (:BASEADIC = 'RTIVA') then
            VALORADIC = VRRTIVA;
        if (:BASEADIC = 'RTICA') then
            VALORADIC = VRRTICA;
        MONTO = VALORADIC * PORCADIC;
        CUENTA = NULL;
        EXECUTE PROCEDURE VALIDE_CUENTA_C (CTADIC) RETURNING_VALUES (:OK);
        IF (OK = 0) THEN
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTADIC INTO :CUENTA, :TIPOCUEN;
        ELSE
            begin
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :CTADIC, 2);
            CUENTA = CTADIC;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 4);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            if (DBADIC = 'S') then
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTADIC, :CONC, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            ELSE
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTADIC, :CONC, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            END
        NROI = NROI + 1;
        END
    if (ERROR > 0) then
        VER = 'S';
    SUSPEND;
    END /* EXISTE LA INTERFAZ */
  ELSE
    BEGIN
    EXECUTE PROCEDURE ERROR (62, :IDDOC, :PREF, 1);
    ERROR = ERROR + 1;
    VER = 'S';
    SUSPEND;
    END
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE EGRESOS_SIN_CONTABILIDAD(
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    ID INTEGER,
    IDI INTEGER,
    IDC INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    ESTADO VARCHAR(20),
    ERROR INTEGER)
AS
DECLARE VARIABLE VER CHAR(2);
declare variable FECICNT VARCHAR(10);
declare variable FECFCNT VARCHAR(10);
declare variable idref INTEGER;
BEGIN
EXECUTE PROCEDURE fecha_a_conta(FECINI) returning_values (FECICNT);
EXECUTE PROCEDURE fecha_a_conta(FECFIN) returning_values (FECFCNT);
FOR SELECT EGRE_ID, PREF_PRE, egre_numero FROM EGRESOS WHERE EGRE_ANULADO = 'N' AND PREF_PRE <> 'R004' AND
    EGRE_FECHA >= :FECINI AND EGRE_FECHA <= :FECFIN ORDER BY EGRE_ID INTO :ID, :PREF, :NUMERO
DO
  BEGIN
  idref = null;
  SELECT ENCO_IDREF FROM COMPROBANTE_ENCABEZADO WHERE ENCO_TIPOREF = 62 AND ENCO_FECHA >= :FECICNT AND ENCO_FECHA <= :FECFCNT and ENCO_IDREF = :ID into :idref;
  if (idref IS NULL) then
  begin
   ESTADO = 'PROCESANDO';
   SUSPEND;
   SELECT MAX(INCJ_ID) FROM INTERFAZ_CAJA WHERE PREF_PRE = :PREF AND TIDO_COD = 62 INTO :IDI;
   EXECUTE PROCEDURE CONTABIL_EGRESO (:ID, :IDI) RETURNING_VALUES (:ERROR, :VER, :IDC);
   IF (ERROR = 0) THEN
      BEGIN
      EXECUTE PROCEDURE CONTABILIZA_PENDIENTE (:IDC);
      ESTADO = 'OK';
      END
   ELSE
    ESTADO = 'ERROR';
   suspend;
  end
  END
END

^

SET TERM ; ^


/* 20101020C */
/* NO DESCUENTE LAS APLICACIONES DE DEVOLUCIONES DE OTROS DIAS DEL TOTAL DE DEVOLUCIONES */
SET TERM ^ ;

CREATE OR ALTER procedure CUADRE_CAJA (
    FECHA date,
    AGENCIA integer)
returns (
    VTACONTADO numeric(18,2),
    VTACREDITO numeric(18,2),
    VTATOTAL numeric(18,2),
    VTARETS numeric(18,2),
    DEVCONTADO numeric(18,2),
    DEVCREDITO numeric(18,2),
    DEVTOTAL numeric(18,2),
    DEVOTRODIA numeric(18,2),
    DEVRETS numeric(18,2),
    NETOCONTADO numeric(18,2),
    NETOCREDITO numeric(18,2),
    NETOTOTAL numeric(18,2),
    NETORETS numeric(18,2),
    INGCONTADO numeric(18,2),
    INGDESCTO numeric(18,2),
    INGCXC numeric(18,2),
    INGOTROS numeric(18,2),
    INGTOTAL numeric(18,2),
    EGRCXP numeric(18,2),
    EGROTROS numeric(18,2),
    EGRTOTAL numeric(18,2),
    CONSIGNA numeric(18,2),
    FORMAP1 numeric(18,2),
    FORMAP2 numeric(18,2),
    FORMAP3 numeric(18,2),
    FORMAP4 numeric(18,2),
    FORMAP5 numeric(18,2),
    FORMAP6 numeric(18,2),
    FORMAP7 numeric(18,2),
    FORMAP8 numeric(18,2),
    FORMAP9 numeric(18,2),
    FORMAP0 numeric(18,2))
AS
declare variable DEVDSCTOS NUMERIC(18,2);
declare variable APLIDEV NUMERIC(18,2);
declare variable APLIFAC NUMERIC(18,2);
declare variable IDDOC INTEGER;
declare variable FECDOC DATE;
declare variable APLICA NUMERIC(18,2);
begin
/* ventas totales */
SELECT SUM(FACT_TOTAL), SUM(FACT_RTFTEMONTO+FACT_RTIVAMONTO+FACT_RTICAMONTO) FROM FACTURAS F, PREFIJOS P
    WHERE FACT_FECHA = :FECHA AND FACT_ANULADO = 'N' AND P.tido_cod = 31 AND P.pref_pre = F.pref_pre AND ((:AGENCIA = 0) or (P.sucu_id = :AGENCIA))
    INTO :VTATOTAL, :vtarets;
if (vtatotal IS NULL) then
    vtatotal = 0;
if (vtarets IS NULL) then
    vtarets = 0;
vtatotal = VTATOTAL - vtarets;
SELECT SUM(DEVT_TOTAL), SUM(DEVT_RTFTEMONTO+DEVT_RTIVAMONTO+DEVT_RTICAMONTO) FROM DEVOLUCIONES_VENTAS V, PREFIJOS P
    WHERE DEVT_FECHA = :FECHA AND DEVT_ANULADO = 'N' AND P.tido_cod = 33 AND P.pref_pre = V.pref_pre AND ((:AGENCIA = 0) or (P.sucu_id = :AGENCIA))
    INTO :DEVTOTAL, :devrets;
if (devtotal IS NULL) then
    devtotal = 0;
if (devrets IS NULL) then
    devrets = 0;
devtotal = DEVTOTAL - DEVRETS;
/* ventas contado */
SELECT SUM(RCDE_ABONO), SUM(RCDE_DTOF) FROM RECIBOS_CAJA_DETALLE D, RECIBOS_CAJA R,  FACTURAS F, PREFIJOS P
    WHERE FACT_FECHA = :FECHA AND D.rcde_tipodoc = 31 AND D.rcde_iddoc = F.fact_id AND R.reca_id = D.reca_id AND
        RECA_FECHA = :FECHA AND RCDE_ANULADO = 'N' AND P.tido_cod = 61 AND P.pref_pre = R.pref_pre AND ((:AGENCIA = 0) or (P.sucu_id = :AGENCIA))
    INTO :vtacontado, :ingdescto;
SELECT SUM(RCDE_ABONO), SUM(RCDE_DTOF) FROM RECIBOS_CAJA_DETALLE D, RECIBOS_CAJA R,  DEVOLUCIONES_VENTAS V, PREFIJOS P
    WHERE DEVT_FECHA = :FECHA AND D.rcde_tipodoc = 33 AND D.rcde_iddoc = V.devt_id AND R.reca_id = D.reca_id AND
    RECA_FECHA = :FECHA AND RCDE_ANULADO = 'N' AND P.tido_cod = 61 AND P.pref_pre = R.pref_pre AND ((:AGENCIA = 0) or (P.sucu_id = :AGENCIA))
    INTO :devcontado, :devdsctos;
if (vtacontado IS NULL) then
    vtacontado = 0;
if (ingdescto IS NULL) then
    ingdescto = 0;
if (devcontado IS NULL) then
    devcontado = 0;
else
    devcontado = devcontado * -1;
if (devdsctos IS NULL) then
    devdsctos = 0;
SELECT SUM(ACDE_APLICADO) FROM APLICACION_CLIENTE_DETALLE D, APLICACION_CLIENTE R,  FACTURAS F, PREFIJOS P
    WHERE FACT_FECHA = :FECHA AND D.acde_tipodoc = 31 AND D.acde_iddoc = F.fact_id AND R.apcl_id = D.apcl_id AND
    APCL_FECHA = :FECHA AND ACDE_ANULADO = 'N' AND P.tido_cod = 43 AND P.pref_pre = R.pref_pre AND ((:AGENCIA = 0) or (P.sucu_id = :AGENCIA))
    INTO :aplifac;
if (APLIFAC IS NULL) then
    APLIFAC = 0;
vtacontado = vtacontado + aplifac;
/* DESGLOCE LAS DEV DE HOY DE LAS DE AYER */
APLIDEV = 0;
devotrodia = 0;
FOR SELECT D.acde_iddoc, ACDE_APLICADO FROM APLICACION_CLIENTE_DETALLE D, APLICACION_CLIENTE R, PREFIJOS P
    WHERE R.apcl_id = D.apcl_id AND APCL_FECHA = :FECHA AND ACDE_ANULADO = 'N' AND D.acde_tipodoc = 33 AND P.tido_cod = 43 AND P.pref_pre = R.pref_pre AND ((:AGENCIA = 0) or (P.sucu_id = :AGENCIA))
    INTO :IDDOC, :aplica
    DO
    BEGIN
    SELECT DEVT_FECHA, DEVT_FACTID FROM DEVOLUCIONES_VENTAS WHERE DEVT_ID = :IDDOC INTO :FECDOC, :IDDOC;
    SELECT FACT_FECHA FROM FACTURAS WHERE FACT_ID = :IDDOC INTO :FECDOC;
    if (FECDOC = FECHA) then
        APLIDEV = APLIDEV + aplica;
    ELSE
        devotrodia = devotrodia + APLICA;
    END
aplidev = aplidev * -1;
devotrodia = devotrodia * -1;
/* devtotal = devtotal - devotrodia CREO QUE ESTO DESFIGURA EL VALOR DE LAS DEVOLUCIONES DEL DIA */
devcontado = devcontado + aplidev;
/* Ventas credito */
vtacredito = vtatotal - vtacontado;
devcredito = devtotal - devcontado;
netocontado = vtacontado - devcontado;
netocredito = vtacredito - devcredito;
netototal = vtatotal - devtotal;
netorets = vtarets - devrets;
/* recibos contado */
ingcontado = vtacontado - devcontado;
ingdescto = ingdescto - devdsctos;

/* recibos totales */
select sum(reca_monto) from recibos_caja r, prefijos p
    where reca_fecha = :fecha AND RECA_ANULADO = 'N' AND P.tido_cod = 61 AND P.pref_pre = r.pref_pre AND ((:AGENCIA = 0) or (P.sucu_id = :AGENCIA))
    into :ingtotal;
if (ingtotal IS NULL) then
    ingtotal = 0;
/* recibos otros */
select sum(reca_monto) from recibos_caja r, prefijos p
    where reca_fecha = :fecha AND RECA_ANULADO = 'N' AND P.tido_cod = 61 AND P.pref_pre = r.pref_pre AND ((:AGENCIA = 0) or (P.sucu_id = :AGENCIA))
    and NOT EXISTS (select reca_id from recibos_caja_detalle WHERE RECA_ID = R.reca_id) into :ingotros;
if (ingotros IS NULL) then
    ingotros = 0;
/* recibos cxc */
select sum(rcde_abono) from recibos_caja_detalle d, recibos_caja r,  movimiento_clientes m, prefijos p
    where r.reca_id = d.reca_id and r.reca_fecha = :fecha and d.rcde_tipodoc = m.mvcl_tiporef and d.rcde_iddoc = m.mvcl_idref
    AND RCDE_ANULADO = 'N' AND ((MVCL_TIPOREF <> 31 AND MVCL_TIPOREF <> 33) OR mvcl_fecha <> :fecha)
    AND P.tido_cod = 61 AND P.pref_pre = r.pref_pre AND ((:AGENCIA = 0) or (P.sucu_id = :AGENCIA))
    into :ingcxc;
if (ingcxc IS NULL) then
    ingcxc = 0;

/* EGRESOS totales */
select sum(egca_monto) from egresos e, egresos_caja c, prefijos p
    where e.egre_id = c.egre_id and C.egca_fecha = :fecha AND E.egre_anulado = 'N'
    AND P.tido_cod = 62 AND P.pref_pre = e.pref_pre AND ((:AGENCIA = 0) or (P.sucu_id = :AGENCIA))
    into :egrtotal;
if (egrtotal IS NULL) then
    egrtotal = 0;
/* EGRESOS otros */
select sum(egca_monto) from egresos e, egresos_caja c, prefijos p
    where e.egre_id = c.egre_id and C.egca_fecha = :fecha AND E.egre_anulado = 'N' and
    not exists (select egre_id from egresos_detalle WHERE EGRE_ID = E.egre_id)
    AND P.tido_cod = 62 AND P.pref_pre = e.pref_pre AND ((:AGENCIA = 0) or (P.sucu_id = :AGENCIA))
    into :egrotros;
if (egrotros IS NULL) then
    egrotros = 0;
/* EGRESOS cxp */
egrcxp = egrtotal - egrotros;

/* CONSIGNACIONES */
select sum(code_monto) from consigna c, consigna_detalle d, cajas j
    where c.cons_id = d.cons_id and cons_fecha = :fecha AND CONS_ANULADO = 'N' and
    d.caja_id = j.caja_id AND ((:AGENCIA = 0) or (j.sucu_id = :AGENCIA))
    into :consigna;
if (consigna IS NULL) then
    consigna = 0;

/* POR FORMA DE PAGO */
SELECT SUM(RCPA_MONTO) FROM RECIBOS_CAJA_PAGO G, RECIBOS_CAJA R, prefijos p
    WHERE R.RECA_ID = G.RECA_ID AND RECA_FECHA = :FECHA AND FOPA_ID = 1 and RECA_ANULADO = 'N'
    AND P.tido_cod = 61 AND P.pref_pre = r.pref_pre AND ((:AGENCIA = 0) or (P.sucu_id = :AGENCIA))
    INTO :FORMAP1;
SELECT SUM(RCPA_MONTO) FROM RECIBOS_CAJA_PAGO G, RECIBOS_CAJA R, prefijos p
    WHERE R.RECA_ID = G.RECA_ID AND RECA_FECHA = :FECHA AND FOPA_ID = 2 and RECA_ANULADO = 'N'
    AND P.tido_cod = 61 AND P.pref_pre = r.pref_pre AND ((:AGENCIA = 0) or (P.sucu_id = :AGENCIA))
    INTO :FORMAP2;
SELECT SUM(RCPA_MONTO) FROM RECIBOS_CAJA_PAGO G, RECIBOS_CAJA R, prefijos p
    WHERE R.RECA_ID = G.RECA_ID AND RECA_FECHA = :FECHA AND FOPA_ID = 3 and RECA_ANULADO = 'N'
    AND P.tido_cod = 61 AND P.pref_pre = r.pref_pre AND ((:AGENCIA = 0) or (P.sucu_id = :AGENCIA))
    INTO :FORMAP3;
SELECT SUM(RCPA_MONTO) FROM RECIBOS_CAJA_PAGO G, RECIBOS_CAJA R, prefijos p
    WHERE R.RECA_ID = G.RECA_ID AND RECA_FECHA = :FECHA AND FOPA_ID = 4 and RECA_ANULADO = 'N'
    AND P.tido_cod = 61 AND P.pref_pre = r.pref_pre AND ((:AGENCIA = 0) or (P.sucu_id = :AGENCIA))
    INTO :FORMAP4;
SELECT SUM(RCPA_MONTO) FROM RECIBOS_CAJA_PAGO G, RECIBOS_CAJA R, prefijos p
    WHERE R.RECA_ID = G.RECA_ID AND RECA_FECHA = :FECHA AND FOPA_ID = 5 and RECA_ANULADO = 'N'
    AND P.tido_cod = 61 AND P.pref_pre = r.pref_pre AND ((:AGENCIA = 0) or (P.sucu_id = :AGENCIA))
    INTO :FORMAP5;
SELECT SUM(RCPA_MONTO) FROM RECIBOS_CAJA_PAGO G, RECIBOS_CAJA R, prefijos p
    WHERE R.RECA_ID = G.RECA_ID AND RECA_FECHA = :FECHA AND FOPA_ID = 6 and RECA_ANULADO = 'N'
    AND P.tido_cod = 61 AND P.pref_pre = r.pref_pre AND ((:AGENCIA = 0) or (P.sucu_id = :AGENCIA))
    INTO :FORMAP6;
SELECT SUM(RCPA_MONTO) FROM RECIBOS_CAJA_PAGO G, RECIBOS_CAJA R, prefijos p
    WHERE R.RECA_ID = G.RECA_ID AND RECA_FECHA = :FECHA AND FOPA_ID = 7 and RECA_ANULADO = 'N'
    AND P.tido_cod = 61 AND P.pref_pre = r.pref_pre AND ((:AGENCIA = 0) or (P.sucu_id = :AGENCIA))
    INTO :FORMAP7;
SELECT SUM(RCPA_MONTO) FROM RECIBOS_CAJA_PAGO G, RECIBOS_CAJA R, prefijos p
    WHERE R.RECA_ID = G.RECA_ID AND RECA_FECHA = :FECHA AND FOPA_ID = 8 and RECA_ANULADO = 'N'
    AND P.tido_cod = 61 AND P.pref_pre = r.pref_pre AND ((:AGENCIA = 0) or (P.sucu_id = :AGENCIA))
    INTO :FORMAP8;
SELECT SUM(RCPA_MONTO) FROM RECIBOS_CAJA_PAGO G, RECIBOS_CAJA R, prefijos p
    WHERE R.RECA_ID = G.RECA_ID AND RECA_FECHA = :FECHA AND FOPA_ID = 9 and RECA_ANULADO = 'N'
    AND P.tido_cod = 61 AND P.pref_pre = r.pref_pre AND ((:AGENCIA = 0) or (P.sucu_id = :AGENCIA))
    INTO :FORMAP9;
SELECT SUM(RCPA_MONTO) FROM RECIBOS_CAJA_PAGO G, RECIBOS_CAJA R, prefijos p
    WHERE R.RECA_ID = G.RECA_ID AND RECA_FECHA = :FECHA AND FOPA_ID = 10 and RECA_ANULADO = 'N'
    AND P.tido_cod = 61 AND P.pref_pre = r.pref_pre AND ((:AGENCIA = 0) or (P.sucu_id = :AGENCIA))
    INTO :FORMAP0;
if (formap1 is null) then
    formap1 = 0;
if (formap2 is null) then
    formap2 = 0;
if (formap3 is null) then
    formap3 = 0;
if (formap4 is null) then
    formap4 = 0;
if (formap5 is null) then
    formap5 = 0;
if (formap6 is null) then
    formap6 = 0;
if (formap7 is null) then
    formap7 = 0;
if (formap8 is null) then
    formap8 = 0;
if (formap9 is null) then
    formap9 = 0;
if (formap0 is null) then
    formap0 = 0;
SUSPEND;
end
^

SET TERM ; ^


/* 20101021 */
/* DESCONTAR CONSUMO DE LAS VENTAS POR VENDEDOR */
SET TERM ^ ;

CREATE OR ALTER procedure ANALISIS_VENTAS_VENDEDOR (
    AGENCIA integer,
    VENDINI integer,
    VENDFIN integer,
    FECHA date)
returns (
    CODVEND integer,
    NOMVEND varchar(60),
    CODAGENCIA integer,
    NOMAGENCIA varchar(60),
    PRESUPUESTO numeric(18,2),
    VENTAS numeric(18,2),
    VENTADIA numeric(18,2),
    PENDIENTE numeric(18,2),
    FALTANTE numeric(18,2),
    FALTANTEDIA numeric(18,2),
    PORCENTAJE numeric(9,2),
    PROMEDIO numeric(18,2),
    ESPERADO numeric(18,2),
    RECAUDO numeric(18,2),
    RECAUDODIA numeric(18,2),
    PENDIENTER numeric(18,2),
    MOSTRADORV numeric(18,2),
    MOSTRADORR numeric(18,2),
    MAXIMAVTA numeric(18,2),
    MESMAXIMO varchar(8),
    VENTAANOP numeric(18,2),
    DEBERIAIR numeric(9,2))
AS
DECLARE VARIABLE FECAUX VARCHAR(10);
DECLARE VARIABLE FECINI VARCHAR(10);
DECLARE VARIABLE FEC DATE;
DECLARE VARIABLE ANO INTEGER;
DECLARE VARIABLE MES INTEGER;
DECLARE VARIABLE TIPODOC INTEGER;
DECLARE VARIABLE ID INTEGER;
DECLARE VARIABLE ABONO NUMERIC(18,2);
DECLARE VARIABLE SUBTOTAL NUMERIC(18,2);
DECLARE VARIABLE IVAMONTO NUMERIC(18,2);
DECLARE VARIABLE TOTAL NUMERIC(18,2);
DECLARE VARIABLE ESCONTADO CHAR(1);
DECLARE VARIABLE DIAS INTEGER;
DECLARE VARIABLE AGEN_ANT INTEGER;
DECLARE VARIABLE TOTAL_SUC NUMERIC(18,2);
declare variable DIA INTEGER;
begin
MOSTRADORV = 0;
MOSTRADORR = 0;
AGEN_ANT = 0;
total_suc = 0;
FECAUX = CAST (FECHA AS VARCHAR(10));
ANO = CAST(SUBSTR(FECAUX, 1, 4) AS INTEGER);
MES = CAST(SUBSTR(FECAUX, 6, 7) AS INTEGER);
FECINI = SUBSTR(FECAUX, 1, 8) || '01';
DIA = extract (DAY FROM FECHA);
/*SELECT PRVM_DIAS FROM PRESUPUESTO_VENTAS_MESES WHERE PRVM_ANO = :ANO AND PRVM_MES = :MES INTO :DIAS; */
DIAS = EXTRACT(DAY FROM (FECHA - EXTRACT(DAY FROM FECHA) + 32 - EXTRACT(DAY FROM FECHA - EXTRACT(DAY FROM FECHA) + 32)));
FOR SELECT VEND_COD, VEND_NOMBRE, SUCU_ID, VEND_CONTADO FROM VENDEDORES WHERE VEND_COD >= :VENDINI AND VEND_COD <= :VENDFIN  AND
    ((SUCU_ID = :AGENCIA) or (:AGENCIA = 0)) ORDER BY SUCU_ID, VEND_COD
    INTO :CODVEND, :NOMVEND, :CODAGENCIA, :ESCONTADO
    DO
    BEGIN
    if (CODAGENCIA <> 0) then
        BEGIN
        SELECT SUCU_NOMBRE FROM SUCURSALES WHERE SUCU_ID = :CODAGENCIA INTO :NOMAGENCIA;
        MAXIMAVTA = 0;
        MESMAXIMO = '';
        VENTAANOP = 0;
        /* LA MAXIMA VENTA Y EL MES EN QUE OCURRIO */
        SELECT MAX(HIVE_VENTA) FROM historico_ventas WHERE SUCU_ID = :codagencia INTO maximavta;
        SELECT MAX(CAST(HIVE_MES AS CHAR(2)) || '/' || CAST(HIVE_ANO AS CHAR(4))) FROM
            historico_ventas WHERE HIVE_VENTA = :maximavta AND SUCU_ID = :codagencia INTO :mesmaximo;
        /* LA VENTA DEL MISMO MES EL ANO ANTERIOR */
        SELECT HIVE_VENTA FROM historico_ventas WHERE HIVE_ANO = :ANO-1 AND HIVE_MES = :MES AND SUCU_ID = :codagencia INTO :ventaanop;
        END
    /* TRAIGA EL PRESUPUESTO DEL MES */
    PRESUPUESTO = 0;
    PENDIENTE = 0;
    PENDIENTER = 0;
    SELECT PRVE_VENTA, PRVE_PENDIENTE, PRVE_PENDRECA FROM PRESUPUESTO_VENTAS
        WHERE VEND_COD = :CODVEND AND PRVE_ANO = :ANO AND PRVE_MES = :MES
        INTO :PRESUPUESTO, :PENDIENTE, :PENDIENTER;

    /* CALCULE LAS VENTAS */
    SELECT SUM((FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO)*FACT_FACTOR) FROM FACTURAS F, PREFIJOS P, FACTURAS_DETALLE D
        WHERE VEND_COD = :CODVEND AND FACT_FECHA = :FECHA AND FACT_ANULADO = 'N' AND F.fact_id = D.fact_id
        AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND ((SUCU_ID = :AGENCIA) or (:AGENCIA = 0))
        INTO :VENTADIA;
    if (VENTADIA is null) then
        VENTADIA = 0;
    SELECT SUM((FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO)*FACT_FACTOR) FROM FACTURAS F, PREFIJOS P, FACTURAS_DETALLE D
        WHERE VEND_COD = :CODVEND AND FACT_FECHA >= :FECINI AND FACT_FECHA < :FECHA AND FACT_ANULADO = 'N' AND F.fact_id = D.fact_id
        AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND ((SUCU_ID = :AGENCIA) or (:AGENCIA = 0))
        INTO :SUBTOTAL;
    if (subtotal is null) then
        ventas = VENTADIA;
    else
        VENTAS = SUBTOTAL + VENTADIA;
    /* CALCULE LAS DEVOLUCIONES */
    SELECT SUM((DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO)*DEVT_FACTOR) FROM devoluciones_ventas F, PREFIJOS P, devoluciones_ventas_detalle D
        WHERE VEND_COD = :CODVEND AND DEVT_FECHA = :FECHA AND DEVT_ANULADO = 'N' AND F.devt_id = D.devt_id
        AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 33 AND ((SUCU_ID = :AGENCIA) or (:AGENCIA = 0))
        INTO :SUBTOTAL;
    if (subtotal is not null) then
        BEGIN
        VENTADIA = VENTADIA - SUBTOTAL;
        VENTAS = VENTAS - SUBTOTAL;
        END
    SELECT SUM((DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO)*DEVT_FACTOR) FROM devoluciones_ventas F, PREFIJOS P, devoluciones_ventas_detalle D
        WHERE VEND_COD = :CODVEND AND DEVT_FECHA >= :FECINI AND DEVT_FECHA < :FECHA AND DEVT_ANULADO = 'N' AND F.devt_id = D.devt_id
        AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 33 AND ((SUCU_ID = :AGENCIA) or (:AGENCIA = 0))
        INTO :SUBTOTAL;
    if (subtotal is not null) then
        BEGIN
        VENTAS = VENTAS - SUBTOTAL;
        END
    /* CALCULE LAS NOTAS CREDITO */
    SELECT SUM(NCCL_MONTO) FROM NOTAS_CREDITO_CLIENTES F, PREFIJOS P
        WHERE VEND_COD = :CODVEND AND NCCL_FECHA = :FECHA AND NCCL_ANULADO = 'N'
        AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 42 AND ((SUCU_ID = :AGENCIA) or (:AGENCIA = 0))
        INTO :SUBTOTAL;
    if (subtotal is not null) then
        BEGIN
        VENTADIA = VENTADIA - SUBTOTAL;
        VENTAS = VENTAS - SUBTOTAL;
        END
    SELECT SUM(NCCL_MONTO) FROM NOTAS_CREDITO_CLIENTES F, PREFIJOS P
        WHERE VEND_COD = :CODVEND AND NCCL_FECHA >= :FECINI AND NCCL_FECHA < :FECHA AND NCCL_ANULADO = 'N'
        AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 42 AND ((SUCU_ID = :AGENCIA) or (:AGENCIA = 0))
        INTO :SUBTOTAL;
    if (subtotal is not null) then
        VENTAS = VENTAS - SUBTOTAL;
    FALTANTE = PRESUPUESTO - VENTAS;
    if (DIAS - DIA > 0) then
        FALTANTEDIA = FALTANTE / (DIAS - DIA);
    ELSE
        FALTANTEDIA = FALTANTE;
    if (PRESUPUESTO <> 0) then
        PORCENTAJE = VENTAS / PRESUPUESTO * 100;
    ELSE
        PORCENTAJE = 0;
    PROMEDIO = (VENTAS + PENDIENTE) / DIA;
    ESPERADO = PROMEDIO * DIAS;
    DEBERIAIR = DIA * 100/ dias;
    RECAUDO = 0;
    RECAUDODIA = 0;
    /* CALCULE EL RECAUDO DEL MES EXCLUYENDO EL IVA */
    FOR SELECT RECA_FECHA, RCDE_TIPODOC, RCDE_IDDOC, (RCDE_ABONO+RCDE_RTFTE+RCDE_RTIVA+RCDE_RTICA)
        FROM RECIBOS_CAJA R, RECIBOS_CAJA_DETALLE RD
        WHERE R.RECA_ID = RD.RECA_ID AND
        RECA_FECHA >= :FECINI AND RECA_FECHA <= :FECHA AND RECA_ANULADO = 'N' AND COBR_COD = :CODVEND
        ORDER BY RECA_FECHA
        INTO :FEC, :TIPODOC, :ID, :ABONO
        DO
        BEGIN
        /* TRAIGA EL DOCUMENTO Y CALCULE LA BASE */
        if (TIPODOC = 31) then
                SELECT FACT_TOTAL,FACT_IVAMONTO FROM FACTURAS WHERE FACT_ID = :ID INTO :TOTAL, :IVAMONTO;
        if (TIPODOC = 33) then
                SELECT DEVT_TOTAL*-1,DEVT_IVAMONTO*-1 FROM DEVOLUCIONES_VENTAS WHERE DEVT_ID = :ID INTO :TOTAL, :IVAMONTO;
        if (TIPODOC = 41) then
                SELECT NDCL_MONTO,NDCL_IVAMONTO FROM NOTAS_DEBITO_CLIENTES WHERE NDCL_ID = :ID INTO :TOTAL, :IVAMONTO;
        if (TIPODOC = 42) then
                SELECT NCCL_MONTO*-1,NCCL_IVAMONTO*-1 FROM NOTAS_CREDITO_CLIENTES WHERE NCCL_ID = :ID INTO :TOTAL, :IVAMONTO;
        if (TIPODOC = 45) then
                SELECT ANCL_BASE*-1,0 FROM ANTICIPOS_CLIENTE WHERE ANCL_ID = :ID INTO :TOTAL, :IVAMONTO;
        if (TIPODOC = 77) then
                SELECT DVCH_MONTO,0 FROM DEVOLUCION_CHEQUES WHERE DVCH_ID = :ID INTO :TOTAL, :IVAMONTO;
        if (TOTAL <> 0) then
            SUBTOTAL = (ABONO / TOTAL) * (TOTAL - IVAMONTO);
        RECAUDO = RECAUDO + SUBTOTAL;
        if (FEC = FECHA) then
            RECAUDODIA = RECAUDODIA + SUBTOTAL;
        END
    if (ESCONTADO = 'S') then
        BEGIN
        MOSTRADORV = MOSTRADORV + VENTAS;
        MOSTRADORR = MOSTRADORR + RECAUDO;
        END
    /* actualice el historico */
    if (AGEN_ANT <> codagencia)  then
        BEGIN
        if (AGEN_ANT <> 0) THEN
            BEGIN
            TOTAL = null;
            SELECT HIVE_VENTA FROM historico_ventas WHERE HIVE_ANO = :ANO AND HIVE_MES = :MES AND SUCU_ID = :AGEN_ANT INTO :TOTAL;
            if (TOTAL is not null) then
                BEGIN
                if (TOTAL_SUC <> 0) then
                    UPDATE historico_ventas SET HIVE_VENTA = (:total_suc)  WHERE HIVE_ANO = :ANO AND HIVE_MES = :MES AND SUCU_ID = :AGEN_ANT;
                END
            ELSE
                INSERT INTO historico_ventas (HIVE_ANO, HIVE_MES, SUCU_ID, HIVE_VENTA) VALUES (:ANO, :MES, :AGEN_ANT, :TOTAL_SUC);
            END
        total_suc = VENTAS;
        END
    ELSE
        BEGIN
        total_suc = :total_suc + :VENTAS;
        END
    AGEN_ANT = :codagencia;
    if ((VENTAS <> 0) or (RECAUDO <> 0) or (:presupuesto <> 0)) then
        suspend;
    END
end
^

SET TERM ; ^


SET TERM ^ ;

CREATE OR ALTER procedure REP_VENTAS_VENDEDOR (
    TIPO integer,
    DESDE varchar(20),
    HASTA varchar(20),
    FECINI date,
    FECFIN date,
    DETALLE char(1),
    CEROS char(1),
    SUBEMPRESA integer)
returns (
    CODVEND integer,
    NOMVEND varchar(60),
    NOMTIPO varchar(50),
    PREFIJO varchar(4),
    NUMERO varchar(6),
    NIT varchar(20),
    NOMBRE varchar(60),
    ID integer,
    FECDOC date,
    CANTIDAD integer,
    SUBTOTAL numeric(18,2),
    DTO numeric(18,2),
    ADICIONAL numeric(18,2),
    CONSUMO numeric(18,2),
    IVA numeric(18,2),
    EXTRA numeric(18,2),
    TOTAL numeric(18,2),
    RTFTE numeric(18,2),
    RTIVA numeric(18,2),
    RTICA numeric(18,2),
    NETO numeric(18,2))
AS
BEGIN
if (DETALLE = 'N') then
    BEGIN
    NIT = '';
    NOMBRE = '';
    if (BIN_AND(TIPO, 1) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 31 INTO :NOMTIPO;
        FOR SELECT MAX(F.VEND_COD), MAX(VEND_NOMBRE), COUNT(*), SUM(FACT_DTOMONTO), SUM(FACT_ADICIONAL), SUM(FACT_IVAMONTO-fact_dec2799), SUM(FACT_EXTRA), SUM(FACT_RTFTEMONTO), SUM(FACT_RTIVAMONTO), SUM(FACT_RTICAMONTO), SUM(FACT_TOTAL)
            FROM FACTURAS F, PREFIJOS P, VENDEDORES V
            WHERE F.VEND_COD >= :DESDE AND F.VEND_COD <= :HASTA AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND FACT_ANULADO = 'N'
             AND F.vend_cod = V.vend_cod AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND ((P.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY F.VEND_COD
            INTO :CODVEND, :NOMVEND, :CANTIDAD, :DTO, :ADICIONAL, :IVA, :EXTRA, :RTFTE, :RTIVA, :RTICA, :TOTAL
            DO
            BEGIN
            SELECT SUM(FADE_CONSUMO) FROM FACTURAS_DETALLE D, FACTURAS F WHERE F.FACT_ID = D.FACT_ID AND
                VEND_COD = :CODVEND AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND FACT_ANULADO = 'N' and substring(D.arti_cod from 1 FOR 2) <> '.t'
                INTO :CONSUMO;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (DTO IS NULL) then
                DTO = 0;
            if (ADICIONAL IS NULL) then
                ADICIONAL = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (EXTRA IS NULL) then
                EXTRA = 0;
            if (RTFTE IS NULL) then
                RTFTE = 0;
            if (RTIVA IS NULL) then
                RTIVA = 0;
            if (RTICA IS NULL) then
                RTICA = 0;
            SUBTOTAL = TOTAL - EXTRA - IVA - ADICIONAL + DTO - CONSUMO;
            NETO = TOTAL - RTFTE - RTIVA - RTICA;
            if (CEROS = 'S') then
              SUSPEND;
            ELSE
              if (CANTIDAD > 0) then
                SUSPEND;
            END
        END
    if (BIN_AND(TIPO, 2) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 32 INTO :NOMTIPO;
        FOR SELECT MAX(R.VEND_COD), MAX(VEND_NOMBRE), COUNT(*), 0, 0, SUM(REVT_IVAMONTO), 0, 0, 0, 0, SUM(REVT_TOTAL)
            FROM REMISIONES_VENTA R, PREFIJOS P, VENDEDORES V
            WHERE R.VEND_COD >= :DESDE AND R.VEND_COD <= :HASTA
             AND R.vend_cod = V.vend_cod AND REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN AND REVT_ANULADO = 'N'
             AND P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = 32 AND ((P.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY R.VEND_COD
            INTO :CODVEND, :NOMVEND, :CANTIDAD, :DTO, :ADICIONAL, :IVA, :EXTRA, :RTFTE, :RTIVA, :RTICA, :TOTAL
            DO
            BEGIN
            SELECT SUM(RVDE_CONSUMO) FROM REMISIONES_VENTA R, REMISIONES_VENTA_DETALLE D WHERE R.REVT_ID = D.REVT_ID AND
                VEND_COD = :CODVEND AND REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN AND REVT_ANULADO = 'N'
                INTO :CONSUMO;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (DTO IS NULL) then
                DTO = 0;
            if (ADICIONAL IS NULL) then
                ADICIONAL = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (EXTRA IS NULL) then
                EXTRA = 0;
            if (RTFTE IS NULL) then
                RTFTE = 0;
            if (RTIVA IS NULL) then
                RTIVA = 0;
            if (RTICA IS NULL) then
                RTICA = 0;
            SUBTOTAL = TOTAL - EXTRA - IVA - ADICIONAL + DTO - CONSUMO;
            NETO = TOTAL - RTFTE - RTIVA - RTICA;
            if (CEROS = 'S') then
              SUSPEND;
            ELSE
              if (CANTIDAD > 0) then
                SUSPEND;
            END
        END
    if (BIN_AND(TIPO, 4) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 33 INTO :NOMTIPO;
        FOR SELECT MAX(D.VEND_COD), MAX(VEND_NOMBRE), COUNT(*), SUM(DEVT_DTOMONTO), SUM(DEVT_ADICIONAL), SUM(DEVT_IVAMONTO-DEVT_DEC2799), SUM(DEVT_EXTRA), SUM(DEVT_RTFTEMONTO), SUM(DEVT_RTIVAMONTO), SUM(DEVT_RTICAMONTO), SUM(DEVT_TOTAL)
            FROM DEVOLUCIONES_VENTAS D, PREFIJOS P, VENDEDORES V
            WHERE D.VEND_COD >= :DESDE AND D.VEND_COD <= :HASTA
             AND D.vend_cod = V.vend_cod AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND DEVT_ANULADO = 'N'
             AND P.PREF_PRE = D.PREF_PRE AND P.TIDO_COD = 33 AND ((P.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) AND ((DEVT_REMID = 0) or (DEVT_REMID IS NULL))
            GROUP BY D.VEND_COD
            INTO :CODVEND, :NOMVEND, :CANTIDAD, :DTO, :ADICIONAL, :IVA, :EXTRA, :RTFTE, :RTIVA, :RTICA, :TOTAL
            DO
            BEGIN
            SELECT SUM(DVDE_CONSUMO) FROM DEVOLUCIONES_VENTAS V, DEVOLUCIONES_VENTAS_DETALLE D WHERE V.DEVT_ID = D.DEVT_ID AND
                VEND_COD = :CODVEND AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND DEVT_ANULADO = 'N' and substring(D.arti_cod from 1 FOR 2) <> '.t'
                INTO :CONSUMO;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (DTO IS NULL) then
                DTO = 0;
            if (ADICIONAL IS NULL) then
                ADICIONAL = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (EXTRA IS NULL) then
                EXTRA = 0;
            if (RTFTE IS NULL) then
                RTFTE = 0;
            if (RTIVA IS NULL) then
                RTIVA = 0;
            if (RTICA IS NULL) then
                RTICA = 0;
            SUBTOTAL = TOTAL - EXTRA - IVA - ADICIONAL + DTO - CONSUMO;
            NETO = TOTAL - RTFTE - RTIVA - RTICA;
            CANTIDAD = CANTIDAD * -1;
            SUBTOTAL = SUBTOTAL * -1;
            TOTAL = TOTAL * -1;
            IVA = IVA * -1;
            EXTRA = EXTRA * -1;
            DTO = DTO * -1;
            ADICIONAL = ADICIONAL * -1;
            RTFTE = RTFTE * -1;
            RTIVA = RTIVA * -1;
            RTICA = RTICA * -1;
            if (CEROS = 'S') then
              SUSPEND;
            ELSE
              if (CANTIDAD <> 0) then
                SUSPEND;
            END
        END
    if (BIN_AND(TIPO, 8) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 34 INTO :NOMTIPO;
        FOR SELECT MAX(P.VEND_COD), MAX(VEND_NOMBRE), COUNT(*), SUM(PEDI_DTOMONTO), SUM(PEDI_ADICIONAL), SUM(PEDI_IVAMONTO), SUM(PEDI_EXTRA), 0, 0, 0, SUM(PEDI_TOTAL)
            FROM PEDIDOS P, PREFIJOS PR, VENDEDORES V
            WHERE V.VEND_COD >= :DESDE AND V.VEND_COD <= :HASTA
             AND P.vend_cod = V.vend_cod AND PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND PEDI_ANULADO = 'N'
             AND P.PREF_PRE = PR.PREF_PRE AND PR.TIDO_COD = 34 AND ((PR.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY P.VEND_COD
            INTO :CODVEND, :NOMVEND, :CANTIDAD, :DTO, :ADICIONAL, :IVA, :EXTRA, :RTFTE, :RTIVA, :RTICA, :TOTAL
            DO
            BEGIN
            SELECT SUM(PEDE_CONSUMO) FROM PEDIDOS P, PEDIDOS_DETALLE D WHERE P.PEDI_ID = D.PEDI_ID AND
                VEND_COD = :CODVEND AND PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND PEDI_ANULADO = 'N'
                INTO :CONSUMO;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (DTO IS NULL) then
                DTO = 0;
            if (ADICIONAL IS NULL) then
                ADICIONAL = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (EXTRA IS NULL) then
                EXTRA = 0;
            if (RTFTE IS NULL) then
                RTFTE = 0;
            if (RTIVA IS NULL) then
                RTIVA = 0;
            if (RTICA IS NULL) then
                RTICA = 0;
            SUBTOTAL = TOTAL - EXTRA - IVA - ADICIONAL + DTO - CONSUMO;
            NETO = TOTAL - RTFTE - RTIVA - RTICA;
            if (CEROS = 'S') then
              SUSPEND;
            ELSE
              if (CANTIDAD > 0) then
                SUSPEND;
            END
        END
    if (BIN_AND(TIPO, 16) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 35 INTO :NOMTIPO;
        FOR SELECT MAX(C.VEND_COD), MAX(VEND_NOMBRE), COUNT(*), SUM(COTI_DTOMONTO), SUM(COTI_ADICIONAL), SUM(COTI_IVAMONTO), SUM(COTI_EXTRA), 0, 0, 0, SUM(COTI_TOTAL)
            FROM COTIZACIONES C, PREFIJOS P, VENDEDORES V
            WHERE V.VEND_COD >= :DESDE AND V.VEND_COD <= :HASTA
             AND C.vend_cod = V.vend_cod AND COTI_FECHA >= :FECINI AND COTI_FECHA <= :FECFIN AND COTI_ANULADO = 'N'
             AND P.PREF_PRE = C.PREF_PRE AND P.TIDO_COD = 35 AND ((P.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY C.VEND_COD
            INTO :CODVEND, :NOMVEND, :CANTIDAD, :DTO, :ADICIONAL, :IVA, :EXTRA, :RTFTE, :RTIVA, :RTICA, :TOTAL
            DO
            BEGIN
            SELECT SUM(CTDE_CONSUMO) FROM COTIZACIONES C, COTIZACIONES_DETALLE D WHERE C.COTI_ID = D.COTI_ID AND
                VEND_COD = :CODVEND AND COTI_FECHA >= :FECINI AND COTI_FECHA <= :FECFIN AND COTI_ANULADO = 'N'
                INTO :CONSUMO;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (DTO IS NULL) then
                DTO = 0;
            if (ADICIONAL IS NULL) then
                ADICIONAL = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (EXTRA IS NULL) then
                EXTRA = 0;
            if (RTFTE IS NULL) then
                RTFTE = 0;
            if (RTIVA IS NULL) then
                RTIVA = 0;
            if (RTICA IS NULL) then
                RTICA = 0;
            SUBTOTAL = TOTAL - EXTRA - IVA - ADICIONAL + DTO - CONSUMO;
            NETO = TOTAL - RTFTE - RTIVA - RTICA;
            if (CEROS = 'S') then
              SUSPEND;
            ELSE
              if (CANTIDAD > 0) then
                SUSPEND;
            END
        END
    END
ELSE
    BEGIN
    if (BIN_AND(TIPO, 1) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 31 INTO :NOMTIPO;
        FOR SELECT F.VEND_COD, VEND_NOMBRE, F.FACT_ID, F.PREF_PRE, FACT_NUMERO, FACT_FECHA, FACT_DTOMONTO, FACT_ADICIONAL, FACT_IVAMONTO-FACT_DEC2799, FACT_EXTRA, FACT_TOTAL, FACT_RTFTEMONTO, FACT_RTIVAMONTO, FACT_RTICAMONTO, TERC_NIT, FACT_NOMCLIENTE
            FROM FACTURAS F, PREFIJOS P, VENDEDORES V WHERE F.vend_cod = V.vend_cod AND F.VEND_COD >= :DESDE AND F.VEND_COD <= :HASTA AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND FACT_ANULADO = 'N'
             AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND ((P.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            ORDER BY V.VEND_COD, FACT_FECHA, FACT_ID
            INTO :CODVEND, :NOMVEND, :ID, :PREFIJO, :NUMERO, :FECDOC, :DTO, :ADICIONAL, :IVA, :EXTRA, :TOTAL, :RTFTE, :RTIVA, :RTICA, :NIT, :NOMBRE
            DO
            BEGIN
            SELECT SUM(FADE_CONSUMO) FROM FACTURAS_DETALLE WHERE FACT_ID = :ID and substring(arti_cod from 1 FOR 2) <> '.t'
                INTO :CONSUMO;
            SUBTOTAL = TOTAL - EXTRA - IVA - ADICIONAL + DTO - CONSUMO;
            NETO = TOTAL - RTFTE - RTIVA - RTICA;
            SUSPEND;
            END
         END
    if (BIN_AND(TIPO, 2) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 32 INTO :NOMTIPO;
        FOR SELECT R.VEND_COD, VEND_NOMBRE, REVT_ID, R.PREF_PRE, REVT_NUMERO, REVT_FECHA, 0, 0, REVT_IVAMONTO, 0, REVT_TOTAL, 0, 0, 0, TERC_NIT, REVT_NOMTERC
            FROM REMISIONES_VENTA R, PREFIJOS P, VENDEDORES V WHERE R.vend_cod = V.vend_cod AND R.VEND_COD >= :DESDE AND R.VEND_COD <= :HASTA AND REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN AND REVT_ANULADO = 'N'
             AND P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = 32 AND ((P.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            ORDER BY V.VEND_COD, REVT_FECHA, REVT_ID
            INTO :CODVEND, :NOMVEND, :ID, :PREFIJO, :NUMERO, :FECDOC, :DTO, :ADICIONAL, :IVA, :EXTRA, :TOTAL, :RTFTE, :RTIVA, :RTICA, :NIT, :NOMBRE
            DO
            BEGIN
            SELECT SUM(RVDE_CONSUMO) FROM REMISIONES_VENTA_DETALLE WHERE REVT_ID = :ID
                INTO :CONSUMO;
            SUBTOTAL = TOTAL - EXTRA - IVA - ADICIONAL + DTO - CONSUMO;
            NETO = TOTAL - RTFTE - RTIVA - RTICA;
            SUSPEND;
            END
         END
    if (BIN_AND(TIPO, 4) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 33 INTO :NOMTIPO;
        FOR SELECT V.VEND_COD, VEND_NOMBRE, DEVT_ID, D.PREF_PRE, DEVT_NUMERO, DEVT_FECHA, DEVT_DTOMONTO, DEVT_ADICIONAL, DEVT_IVAMONTO-DEVT_DEC2799, DEVT_EXTRA, DEVT_TOTAL, DEVT_RTFTEMONTO, DEVT_RTIVAMONTO, DEVT_RTICAMONTO, TERC_NIT, DEVT_NOMTERC
            FROM DEVOLUCIONES_VENTAS D, PREFIJOS P, VENDEDORES V WHERE D.vend_cod = V.vend_cod AND V.VEND_COD >= :DESDE AND V.VEND_COD <= :HASTA AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND DEVT_ANULADO = 'N'
             AND P.PREF_PRE = D.PREF_PRE AND P.TIDO_COD = 33 AND ((P.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) AND ((DEVT_REMID = 0) or (DEVT_REMID IS NULL))
            ORDER BY V.VEND_COD, DEVT_FECHA, DEVT_ID
            INTO :CODVEND, :NOMVEND, :ID, :PREFIJO, :NUMERO, :FECDOC, :DTO, :ADICIONAL, :IVA, :EXTRA, :TOTAL, :RTFTE, :RTIVA, :RTICA, :NIT, :NOMBRE
            DO
            BEGIN
            SELECT SUM(DVDE_CONSUMO) FROM DEVOLUCIONES_VENTAS_DETALLE WHERE DEVT_ID = :ID and substring(arti_cod from 1 FOR 2) <> '.t'
                INTO :CONSUMO;
            SUBTOTAL = TOTAL - EXTRA - IVA - ADICIONAL + DTO - CONSUMO;
            NETO = TOTAL - RTFTE - RTIVA - RTICA;
            SUBTOTAL = SUBTOTAL * -1;
            TOTAL = TOTAL * -1;
            IVA = IVA * -1;
            EXTRA = EXTRA * -1;
            DTO = DTO * -1;
            ADICIONAL = ADICIONAL * -1;
            RTFTE = RTFTE * -1;
            RTIVA = RTIVA * -1;
            RTICA = RTICA * -1;
            SUSPEND;
            END
         END
    if (BIN_AND(TIPO, 8) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 34 INTO :NOMTIPO;
        FOR SELECT P.VEND_COD, VEND_NOMBRE, PEDI_ID, P.PREF_PRE, PEDI_NUMERO, PEDI_FECHA, PEDI_DTOMONTO, PEDI_ADICIONAL, PEDI_IVAMONTO, PEDI_EXTRA, PEDI_TOTAL, 0, 0, 0, TERC_NIT, PEDI_NOMTERC
            FROM PEDIDOS P, PREFIJOS PR, VENDEDORES V WHERE P.vend_cod = V.vend_cod AND P.VEND_COD >= :DESDE AND P.VEND_COD <= :HASTA AND PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND PEDI_ANULADO = 'N'
             AND P.PREF_PRE = PR.PREF_PRE AND PR.TIDO_COD = 34 AND ((PR.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            ORDER BY V.VEND_COD, PEDI_FECHA, PEDI_ID
            INTO :CODVEND, :NOMVEND, :ID, :PREFIJO, :NUMERO, :FECDOC, :DTO, :ADICIONAL, :IVA, :EXTRA, :TOTAL, :RTFTE, :RTIVA, :RTICA, :NIT, :NOMBRE
            DO
            BEGIN
            SELECT SUM(PEDE_CONSUMO) FROM PEDIDOS_DETALLE WHERE PEDI_ID = :ID
                INTO :CONSUMO;
            SUBTOTAL = TOTAL - EXTRA - IVA - ADICIONAL + DTO - CONSUMO;
            NETO = TOTAL - RTFTE - RTIVA - RTICA;
            SUSPEND;
            END
         END
    if (BIN_AND(TIPO, 16) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 35 INTO :NOMTIPO;
        FOR SELECT C.VEND_COD, VEND_NOMBRE, COTI_ID, C.PREF_PRE, COTI_NUMERO, COTI_FECHA, COTI_DTOMONTO, COTI_ADICIONAL, COTI_IVAMONTO, COTI_EXTRA, COTI_TOTAL, 0, 0, 0, TERC_NIT, COTI_NOMTERC
            FROM COTIZACIONES C, PREFIJOS P, VENDEDORES V WHERE C.vend_cod = V.vend_cod AND C.VEND_COD >= :DESDE AND C.VEND_COD <= :HASTA AND COTI_FECHA >= :FECINI AND COTI_FECHA <= :FECFIN AND COTI_ANULADO = 'N'
             AND P.PREF_PRE = C.PREF_PRE AND P.TIDO_COD = 35 AND ((P.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            ORDER BY V.VEND_COD, COTI_FECHA, COTI_ID
            INTO :CODVEND, :NOMVEND, :ID, :PREFIJO, :NUMERO, :FECDOC, :DTO, :ADICIONAL, :IVA, :EXTRA, :TOTAL, :RTFTE, :RTIVA, :RTICA, :NIT, :NOMBRE
            DO
            BEGIN
            SELECT SUM(CTDE_CONSUMO) FROM COTIZACIONES_DETALLE WHERE COTI_ID = :ID
                INTO :CONSUMO;
            SUBTOTAL = TOTAL - EXTRA - IVA - ADICIONAL + DTO - CONSUMO;
            NETO = TOTAL - RTFTE - RTIVA - RTICA;
            SUSPEND;
            END
        END
    END
END
^

SET TERM ; ^


/* 20101021C */
/* TRAER ARTICULOS COMPRADOS SIN IMPORTAR SI LA CANTIDAD SUGERIDA ES CERO */

INSERT INTO CONFIGURACION (CONF_MODULO, CONF_CATEGORIA, CONF_PROPIEDAD, CONF_VALOR, CONF_POSIBLES, CONF_AYUDA) VALUES ('COMPRAS', 'ORDENES', 'TRAER A LAS ORDENES ARTICULOS CON CANTIDAD EN CERO', 'NO', 'SI,NO', 'NO: Sólo si el promedio de ventas y la existencia ameritan la compra se trae el artículo. SI: Se traen todos los artículos que se le han comprado al proveedor sin importar si la cantidad sugerida es cero');
COMMIT WORK;

SET TERM ^ ;

CREATE OR ALTER procedure ORDEN_SUGERIDA (
    PROVEEDOR varchar(20),
    FECHA date)
returns (
    ARTICULO varchar(15),
    BODEGA varchar(2),
    CANT numeric(18,4),
    UNIDAD varchar(8),
    COSTO numeric(18,2))
AS
declare variable FACTOR NUMERIC(15,4);
declare variable DIAS INTEGER;
declare variable EXISTENCIA NUMERIC(18,4);
declare variable PROMEDIO NUMERIC(18,4);
declare variable AGENCIA INTEGER;
declare variable DIA_ART VARCHAR(2) CHARACTER SET NONE;
declare variable DIASC VARCHAR(255);
declare variable SALIDAS NUMERIC(18,4);
declare variable CEROS CHAR(2);
BEGIN
EXECUTE PROCEDURE lee_configuracion ('INVENTARIO', 'EXISTENCIAS', 'PROMEDIAR LAS SALIDAS DEL INVENTARIO CON EL NUMERO DE DIAS ASIGNADO A CADA ARTICULO') returning_values (:DIA_ART);
EXECUTE PROCEDURE lee_configuracion ('INVENTARIO', 'EXISTENCIAS', 'NUMERO DE DIAS PARA PROMEDIO DE SALIDAS POR ARTICULO') returning_values (DIASC);
EXECUTE PROCEDURE lee_configuracion ('COMPRAS', 'ORDENES', 'TRAER A LAS ORDENES ARTICULOS CON CANTIDAD EN CERO') returning_values (CEROS);
FOR SELECT a.ARTI_COD, PVAR_COSTO, ARTI_UNIDAD, ARTI_DIAS FROM proveedor_articulo p, articulo a
    WHERE p.arti_cod = a.arti_cod and TERC_NIT = :proveedor and esar_cod <> 'I' order by a.arti_des
    INTO :articulo, :costo, :unidad, :DIAS
  DO BEGIN
  for select bode_cod, SUCU_ID from bodega into :bodega, :agencia
    do
    begin
    execute procedure saldo_inventario (:articulo, :bodega, :fecha) returning_values (:Existencia);
    EXECUTE PROCEDURE FACTOR_UNIDAD_CANT(:ARTICULO, :UNIDAD) returning_values (:FACTOR);
    if (FACTOR <> 0) then
        EXISTENCIA = EXISTENCIA / FACTOR;
    else
        EXISTENCIA = 0;
    EXECUTE PROCEDURE promedio_salidas_articulo (:ARTICULO, :FECHA, :BODEGA) returning_values (:PROMEDIO, :SALIDAS);
    if (DIA_ART = 'NO') then
        BEGIN
        DIAS = CAST(DIASC AS INTEGER);
        END
    if (DIAS is null) then
        DIAS = 0;
    PROMEDIO = DIAS * PROMEDIO;
    if (FACTOR <> 0) then
        PROMEDIO = PROMEDIO / FACTOR;
    CANT = PROMEDIO - EXISTENCIA;
    if ((CANT > 0) or (CEROS = 'SI')) then
        SUSPEND;
    end
  END
END
^

SET TERM ; ^


/* 20101021D */
/* ELIMINE EL RETORNO DE VARIBALES POR SI ACASO FALLA EN RANGOS GRANDES */

SET TERM ^ ;

CREATE OR ALTER procedure CHEQUEO_MOVIMIENTO_CXPAGAR (
    PRVINI varchar(20),
    PRVFIN varchar(20))
AS
declare variable FECHA DATE;
declare variable VENCE DATE;
declare variable NIT VARCHAR(20);
declare variable RTFTE NUMERIC(18, 2);
declare variable RTIVA NUMERIC(18, 2);
declare variable RTICA NUMERIC(18, 2);
declare variable MONTO NUMERIC(18, 2);
declare variable EXISTE CHAR(1);
declare variable IDR INTEGER;
declare variable NUMPROV VARCHAR(10);
declare variable CONC VARCHAR(60);
declare variable ID integer;
declare variable PREF varchar(4);
declare variable NUMERO varchar(6);
BEGIN
DELETE FROM anticipos_proveedor WHERE EGRE_ID = 0;
DELETE FROM MOVIMIENTO_PROVEEDOR WHERE TERC_NIT >= :PRVINI AND TERC_NIT <= :PRVFIN;

FOR SELECT FACO_ID, PREF_PRE, FACO_NUMERO, FACO_FECHA, FACO_VENCE, TERC_NIT, FACO_RTFTEMONTO, FACO_rtivamonto, FACO_rticamonto, FACO_TOTAL, FACO_NUMPROV
    FROM FACTURAS_COMPRA WHERE FACO_ID <> 0 and faco_anulado = 'N' AND TERC_NIT >= :PRVINI AND TERC_NIT <= :PRVFIN
    ORDER BY FACO_FECHA
    INTO :ID, :PREF, :NUMERO, :FECHA, :VENCE, :nit,  :RTFTE, :RTIVA, :RTICA, :MONTO, :NUMPROV
    DO
    BEGIN
    CONC = 'FACTURA DE COMPRA No.' || :PREF || :NUMERO || ' - ' || :NUMPROV;
    INSERT INTO movimiento_proveedor(MVPR_ID, TERC_NIT, MVPR_TIPOREF, MVPR_IDREF, MVPR_FECHA, MVPR_VENCE, MVPR_CONC, MVPR_MONTO, MVPR_RTFTE, MVPR_RTIVA, MVPR_RTICA, MVPR_DEBITO, MVPR_ABONO, MVPR_PREFIJO, MVPR_NUMERO)
      VALUES (GEN_ID(ID_MOVPROV, 1), :NIT, 21, :ID, :FECHA, :VENCE, :CONC, :MONTO, :RTFTE, :RTIVA, :RTICA, 'S', 'N', :pref, :numero);
    END

FOR SELECT NDPR_ID, PREF_PRE, NDPR_NUMERO, NDPR_FECHA, NDPR_VENCE, NDPR_CONC, TERC_NIT, NDPR_RTFTEMONTO, NDPR_rtivamonto, NDPR_rticamonto, ndpr_monto+ndpr_ivamonto
    FROM notas_debito_proveedor WHERE NDPR_ID <> 0 and NDPR_anulado = 'N' AND TERC_NIT >= :PRVINI AND TERC_NIT <= :PRVFIN
    ORDER BY NDPR_FECHA
    INTO :ID, :PREF, :NUMERO, :FECHA, :VENCE, :CONC, :nit,  :RTFTE, :RTIVA, :RTICA, :MONTO
    DO
    INSERT INTO MOVIMIENTO_PROVEEDOR (MVPR_ID, TERC_NIT, MVPR_TIPOREF, MVPR_IDREF, MVPR_FECHA, MVPR_VENCE, MVPR_CONC, MVPR_MONTO, MVPR_RTFTE, MVPR_RTIVA, MVPR_RTICA, MVPR_DEBITO, MVPR_ABONO, MVPR_PREFIJO, MVPR_NUMERO)
      VALUES (GEN_ID(ID_MOVPROV, 1), :NIT, 51, :ID, :FECHA, :VENCE, :CONC, :monto, :RTFTE, :RTIVA, :RTICA, 'S', 'N', :pref, :numero);

FOR SELECT DVCO_ID, PREF_PRE, DVCO_NUMERO, DVCO_FECHA, TERC_NIT, DVCO_RTFTEMONTO, DVCO_rtivamonto, DVCO_rticamonto, dvco_total
    FROM devoluciones_compras WHERE DVCO_ID <> 0 and DVCO_anulado = 'N' AND TERC_NIT >= :PRVINI AND TERC_NIT <= :PRVFIN
    ORDER BY DVCO_FECHA
    INTO :ID, :PREF, :NUMERO, :FECHA, :nit,  :RTFTE, :RTIVA, :RTICA, :MONTO
    DO
    BEGIN
    CONC = 'DEVOLUCION COMPRA No.' || PREF || NUMERO;
    INSERT INTO movimiento_proveedor (MVPR_ID, TERC_NIT, MVPR_TIPOREF, MVPR_IDREF, MVPR_FECHA, MVPR_VENCE, MVPR_CONC, MVPR_MONTO, MVPR_RTFTE, MVPR_RTIVA, MVPR_RTICA, MVPR_DEBITO, MVPR_ABONO, MVPR_PREFIJO, MVPR_NUMERO)
      VALUES (GEN_ID(ID_MOVPROV, 1), :NIT, 24, :ID, :FECHA, :FECHA, :CONC, :monto, :RTFTE, :RTIVA, :RTICA, 'N', 'N', :pref, :numero);
    END

FOR SELECT NCPR_ID, PREF_PRE, NCPR_NUMERO, NCPR_FECHA, NCPR_CONC, TERC_NIT, NCPR_RTFTEMONTO, NCPR_rtivamonto, NCPR_rticamonto, ncpr_monto+ncpr_ivamonto
    FROM notas_credito_proveedor WHERE NCPR_ID <> 0 and NCPR_anulado = 'N' AND TERC_NIT >= :PRVINI AND TERC_NIT <= :PRVFIN
    ORDER BY NCPR_FECHA
    INTO :ID, :PREF, :NUMERO, :FECHA, :CONC, :nit,  :RTFTE, :RTIVA, :RTICA, :MONTO
    DO
    INSERT INTO MOVIMIENTO_PROVEEDOR (MVPR_ID, TERC_NIT, MVPR_TIPOREF, MVPR_IDREF, MVPR_FECHA, MVPR_VENCE, MVPR_CONC, MVPR_MONTO, MVPR_RTFTE, MVPR_RTIVA, MVPR_RTICA, MVPR_DEBITO, MVPR_ABONO, MVPR_PREFIJO, MVPR_NUMERO)
      VALUES (GEN_ID(ID_MOVPROV, 1), :NIT, 52, :ID, :FECHA, :FECHA, :CONC, :MONTO, :RTFTE, :RTIVA, :RTICA, 'N', 'N', :pref, :numero);

FOR SELECT ANPR_ID, PREF_PRE, ANPR_NUMERO, ANPR_FECHA, ANPR_CONC, TERC_NIT, ANPR_RTFTEMONTO, ANPR_rtivamonto, ANPR_rticamonto, anpr_base+anpr_ivamonto
    FROM anticipos_proveedor WHERE ANPR_ID <> 0 and ANPR_anulado = 'N' AND TERC_NIT >= :PRVINI AND TERC_NIT <= :PRVFIN
    ORDER BY ANPR_FECHA
    INTO :ID, :PREF, :NUMERO, :FECHA, :CONC, :nit,  :RTFTE, :RTIVA, :RTICA, :MONTO
    DO
    INSERT INTO MOVIMIENTO_PROVEEDOR (MVPR_ID, TERC_NIT, MVPR_TIPOREF, MVPR_IDREF, MVPR_FECHA, MVPR_VENCE, MVPR_CONC, MVPR_MONTO, MVPR_RTFTE, MVPR_RTIVA, MVPR_RTICA, MVPR_DEBITO, MVPR_ABONO, MVPR_PREFIJO, MVPR_NUMERO)
      VALUES (GEN_ID(ID_MOVPROV, 1), :NIT, 55, :ID, :FECHA, :FECHA, :CONC, :monto, :RTFTE, :RTIVA, :RTICA, 'N', 'N', :pref, :numero);

FOR SELECT A.APPR_ID, PREF_PRE, APPR_NUMERO, APPR_FECHA, APPR_CONC, TERC_NIT, APPD_APLICADO, APPD_RTFTE, APPD_RTIVA, APPD_RTICA
    FROM APLICACION_PROVEEDOR_DETALLE D, aplicacion_provedor A
    WHERE A.APPR_ID = D.appr_id AND A.APPR_ID <> 0 AND APPR_ANULADO = 'N' AND TERC_NIT >= :PRVINI AND TERC_NIT <= :PRVFIN
    ORDER BY APPR_FECHA
    INTO :ID, :PREF, :NUMERO, :FECHA, :CONC, :NIT, :MONTO, :RTFTE, :RTIVA, :RTICA
    DO
    BEGIN
    EXISTE = 'N';
    SELECT 'S' FROM MOVIMIENTO_PROVEEDOR WHERE MVPR_TIPOREF = 53 AND MVPR_IDREF = :ID INTO :EXISTE;
    if (EXISTE = 'S') then
        begin
        UPDATE movimiento_proveedor
            SET MVPR_MONTO = MVPR_MONTO + :MONTO,
                MVPR_RTFTE = MVPR_RTFTE + :rtfte,
                MVPR_RTIVA = MVPR_RTIVA + :rtiva,
                MVPR_RTICA = MVPR_RTICA + :rtica
            WHERE MVPR_TIPOREF = 53 AND MVPR_IDREF = :ID;
        end
    ELSE
        INSERT INTO MOVIMIENTO_PROVEEDOR (MVPR_ID, TERC_NIT, MVPR_TIPOREF, MVPR_IDREF, MVPR_FECHA, MVPR_VENCE, MVPR_CONC, MVPR_MONTO, MVPR_RTFTE, MVPR_RTIVA, MVPR_RTICA, MVPR_DEBITO, MVPR_ABONO, MVPR_PREFIJO, MVPR_NUMERO)
            VALUES (GEN_ID(ID_MOVPROV, 1), :NIT, 53, :ID, :FECHA, :FECHA, :CONC, :MONTO, :RTFTE, :RTIVA, :RTICA, 'N', 'S', :PREF, :NUMERO);
    END

FOR SELECT E.EGRE_ID, PREF_PRE, EGRE_NUMERO, EGRE_FECHA, EGRE_CONC, TERC_NIT, EGDE_ABONO+EGDE_DTOF, EGDE_RTFTE, EGDE_RTIVA, EGDE_RTICA
    FROM EGRESOS_DETALLE D, EGRESOS E
    WHERE E.EGRE_ID = D.EGRE_ID AND E.EGRE_ID <> 0 AND EGRE_ANULADO = 'N' AND TERC_NIT >= :PRVINI AND TERC_NIT <= :PRVFIN
    ORDER BY EGRE_FECHA
    INTO :IDR, :PREF, :NUMERO, :FECHA, :CONC, :NIT, :MONTO, :RTFTE, :RTIVA, :RTICA
    DO
    BEGIN
    EXISTE = 'N';
    SELECT 'S' FROM MOVIMIENTO_PROVEEDOR WHERE MVPR_TIPOREF = 62 AND MVPR_IDREF = :ID INTO :EXISTE;
    if (EXISTE = 'S') then
        begin
        UPDATE movimiento_proveedor
            SET MVPR_MONTO = MVPR_MONTO + :MONTO,
                MVPR_RTFTE = MVPR_RTFTE + :rtfte,
                MVPR_RTIVA = MVPR_RTIVA + :rtiva,
                MVPR_RTICA = MVPR_RTICA + :rtica
            WHERE MVPR_TIPOREF = 62 AND MVPR_IDREF = :IDR;
        end
    ELSE
        INSERT INTO MOVIMIENTO_PROVEEDOR (MVPR_ID, TERC_NIT, MVPR_TIPOREF, MVPR_IDREF, MVPR_FECHA, MVPR_VENCE, MVPR_CONC, MVPR_MONTO, MVPR_RTFTE, MVPR_RTIVA, MVPR_RTICA, MVPR_DEBITO, MVPR_ABONO, MVPR_PREFIJO, MVPR_NUMERO)
            VALUES (GEN_ID(ID_MOVPROV, 1), :NIT, 62, :IDR, :FECHA, :FECHA, :CONC, :MONTO, :RTFTE, :RTIVA, :RTICA, 'N', 'S', :PREF, :NUMERO);
    END

FOR SELECT R.reca_id, PREF_PRE, RECA_NUMERO, RECA_FECHA, RECA_CONC, TERC_NIT, D.rccr_abono+D.rccr_dtof, D.rccr_rtfte, D.rccr_rtiva, D.rccr_rtica
    FROM recibos_caja_crucec D, recibos_caja R
    WHERE R.reca_id = D.reca_id AND R.reca_id <> 0 AND RECA_ANULADO = 'N' AND TERC_NIT >= :PRVINI AND TERC_NIT <= :PRVFIN
    ORDER BY RECA_FECHA
    INTO :IDR, :PREF, :NUMERO, :FECHA, :CONC, :NIT, :MONTO, :RTFTE, :RTIVA, :RTICA
    DO
    BEGIN
    EXISTE = 'N';
    SELECT 'S' FROM MOVIMIENTO_PROVEEDOR WHERE MVPR_TIPOREF = 61 AND MVPR_IDREF = :ID INTO :EXISTE;
    if (EXISTE = 'S') then
        begin
        UPDATE movimiento_proveedor
            SET MVPR_MONTO = MVPR_MONTO + :MONTO,
                MVPR_RTFTE = MVPR_RTFTE + :rtfte,
                MVPR_RTIVA = MVPR_RTIVA + :rtiva,
                MVPR_RTICA = MVPR_RTICA + :rtica
            WHERE MVPR_TIPOREF = 61 AND MVPR_IDREF = :IDR;
        end
    ELSE
        INSERT INTO MOVIMIENTO_PROVEEDOR (MVPR_ID, TERC_NIT, MVPR_TIPOREF, MVPR_IDREF, MVPR_FECHA, MVPR_VENCE, MVPR_CONC, MVPR_MONTO, MVPR_RTFTE, MVPR_RTIVA, MVPR_RTICA, MVPR_DEBITO, MVPR_ABONO, MVPR_PREFIJO, MVPR_NUMERO)
            VALUES (GEN_ID(ID_MOVPROV, 1), :NIT, 61, :IDR, :FECHA, :FECHA, :CONC, :MONTO, :RTFTE, :RTIVA, :RTICA, 'N', 'S', :PREF, :NUMERO);
    END
END
^

SET TERM ; ^


SET TERM ^ ;

CREATE OR ALTER procedure CHEQUEO_MOVIMIENTO_CLIENTES (
    CLIINI varchar(20),
    CLIFIN varchar(20))
AS
declare variable FECHA DATE;
declare variable VENCE DATE;
declare variable NIT VARCHAR(20);
declare variable RTFTE NUMERIC(18, 2);
declare variable RTIVA NUMERIC(18, 2);
declare variable RTICA NUMERIC(18, 2);
declare variable MONTO NUMERIC(18, 2);
declare variable TRM NUMERIC(18, 2);
declare variable EXISTE CHAR(1);
declare variable IDR INTEGER;
declare variable NOMCLIENTE VARCHAR(60);
declare variable CONC VARCHAR(60);
declare variable SUCURSAL VARCHAR(10);
declare variable COBR INTEGER;
declare variable FACTURA VARCHAR(10);
declare variable ID integer;
declare variable PREF varchar(4);
declare variable NUMERO varchar(6);
BEGIN
DELETE FROM anticipos_cliente WHERE RECA_ID = 0;
DELETE FROM saldos_doc_cartera WHERE TERC_NIT >= :cliini AND TERC_NIT <= :clifin;
DELETE FROM movimiento_clientes WHERE TERC_NIT >= :cliini AND TERC_NIT <= :clifin;

FOR SELECT FACT_ID, PREF_PRE, FACT_NUMERO, FACT_FECHA, FACT_VENCE, TERC_NIT, FACT_RTFTEMONTO, FACT_rtivamonto, FACT_rticamonto, FACT_TOTAL, FACT_NOMCLIENTE, FACT_SUCURSAL, COBR_COD, FACT_TRM
    FROM FACTURAS WHERE FACT_ID <> 0 and fact_anulado = 'N' AND TERC_NIT >= :cliini AND TERC_NIT <= :clifin
    ORDER BY FACT_FECHA
    INTO :ID, :PREF, :NUMERO, :FECHA, :VENCE, :nit,  :RTFTE, :RTIVA, :RTICA, :MONTO, :nomcliente, :sucursal, :cobr, :TRM
    DO
    BEGIN
    if (STRLEN(:NOMCLIENTE) > 42) then
        CONC = 'FV No.' || :pref || :numero || '-' || SUBSTR(:NOMCLIENTE, 1, 42);
    ELSE
        CONC = 'FV No.' || :pref || :NUMERO || '-' || :NOMCLIENTE;
    INSERT INTO MOVIMIENTO_CLIENTES (MVCL_ID, TERC_NIT, MVCL_TIPOREF, MVCL_IDREF, MVCL_FECHA, MVCL_VENCE, MVCL_CONC, MVCL_MONTO, MVCL_RTEFTE, MVCL_RTEIVA, MVCL_RTEICA, MVCL_DEBITO, MVCL_ABONO, MVCL_PREFREF, MVCL_NUMREF, mvcl_sucursal, COBR_COD, MVCL_TRM)
      VALUES (GEN_ID(ID_MOVCLI, 1), :NIT, 31, :ID, :FECHA, :VENCE, :CONC, :MONTO, :rtfte, :rtiva, :rtica, 'S', 'N', :pref, :numero, :sucursal, :cobr, :trm);
    END

FOR SELECT NDCL_ID, PREF_PRE, NDCL_NUMERO, NDCL_FECHA, NDCL_VENCE, NDCL_CONC, TERC_NIT, NDCL_RTFTEMONTO, NDCL_rtivamonto, NDCL_rticamonto, ndcl_monto+ndcl_ivamonto, NDCL_SUCURSAL, COBR_COD, NDCL_TRM
    FROM notas_debito_clientes WHERE NDCL_ID <> 0 and NDCL_anulado = 'N' AND TERC_NIT >= :cliini AND TERC_NIT <= :clifin
    ORDER BY NDCL_FECHA
    INTO :ID, :PREF, :NUMERO, :FECHA, :VENCE, :CONC, :nit,  :RTFTE, :RTIVA, :RTICA, :MONTO, :sucursal, :cobr, :TRM
    DO
    INSERT INTO MOVIMIENTO_CLIENTES (MVCL_ID, TERC_NIT, MVCL_TIPOREF, MVCL_IDREF, MVCL_FECHA, MVCL_VENCE, MVCL_CONC, MVCL_MONTO, MVCL_RTEFTE, MVCL_RTEIVA, MVCL_RTEICA, MVCL_DEBITO, MVCL_ABONO, MVCL_PREFREF, MVCL_NUMREF, MVCL_SUCURSAL, COBR_COD, MVCL_TRM)
      VALUES (GEN_ID(ID_MOVCLI, 1), :NIT, 41, :ID, :FECHA, :VENCE, :CONC, :MONTO, :rtfte, :rtiva, :rtica, 'S', 'N', :pref, :numero, :sucursal, :cobr, :TRM);

for select DVCH_ID, PRBA_PREF, DVCH_NUMDOC, DVCH_FECHA, DVCH_FECHA, DVCH_CONC, TERC_NIT, 0, 0, 0, DVCH_MONTO, DVCH_SUCURSAL, COBR_COD, DVCH_TRM
    FROM devolucion_cheques WHERE DVCH_ID <> 0 AND DVCH_ANULADO = 'N' AND TERC_NIT >= :cliini AND TERC_NIT <= :clifin AND DVCH_CARTERA = 'S'
    INTO :ID, :PREF, :NUMERO, :FECHA, :VENCE, :CONC, :nit,  :RTFTE, :RTIVA, :RTICA, :MONTO, :sucursal, :cobr, :TRM
    DO
    INSERT INTO  MOVIMIENTO_CLIENTES
        (MVCL_ID, TERC_NIT, MVCL_TIPOREF, MVCL_IDREF, MVCL_PREFREF, MVCL_NUMREF, MVCL_FECHA, MVCL_VENCE, MVCL_CONC, MVCL_MONTO, MVCL_RTEFTE, MVCL_RTEIVA, MVCL_RTEICA, MVCL_ABONO, MVCL_DEBITO, MVCL_SUCURSAL, COBR_COD, MVCL_TRM)
        VALUES (GEN_ID(ID_MOVCLI, 1), :NIT, 77, :ID, :PREF, :NUMERO, :FECHA, :FECHA, :CONC, :MONTO, 0, 0, 0, 'N', 'S', :sucursal, :cobr, :TRM);
    
FOR SELECT DEVT_ID, PREF_PRE, DEVT_NUMERO, DEVT_FECHA, TERC_NIT, DEVT_RTFTEMONTO, DEVT_rtivamonto, DEVT_rticamonto, devt_total, devt_sucursal, COBR_COD, DEVT_FACTURA, DEVT_TRM
    FROM devoluciones_ventas WHERE DEVT_ID <> 0 and DEVT_anulado = 'N' AND TERC_NIT >= :cliini AND TERC_NIT <= :clifin
    ORDER BY DEVT_FECHA
    INTO :ID, :PREF, :NUMERO, :FECHA, :nit,  :RTFTE, :RTIVA, :RTICA, :MONTO, :sucursal, :cobr, :FACTURA, :TRM
    DO
    BEGIN
    CONC = 'DEVOLUCION VENTA No.' || :pref || :NUMERO || ' EN FACTURA ' || :factura;
    INSERT INTO MOVIMIENTO_CLIENTES (MVCL_ID, TERC_NIT, MVCL_TIPOREF, MVCL_IDREF, MVCL_FECHA, MVCL_VENCE, MVCL_CONC, MVCL_MONTO, MVCL_RTEFTE, MVCL_RTEIVA, MVCL_RTEICA, MVCL_DEBITO, MVCL_ABONO, MVCL_PREFREF, MVCL_NUMREF, MVCL_SUCURSAL, COBR_COD, MVCL_TRM)
      VALUES (GEN_ID(ID_MOVCLI, 1), :NIT, 33, :ID, :FECHA, :FECHA, :CONC, :MONTO, :rtfte, :rtiva, :rtica, 'N', 'N', :pref, :numero, :sucursal, :cobr, :TRM);
    END

FOR SELECT NCCL_ID, PREF_PRE, NCCL_NUMERO, NCCL_FECHA, NCCL_CONC, TERC_NIT, NCCL_RTFTEMONTO, NCCL_rtivamonto, NCCL_rticamonto, nccl_monto+nccl_ivamonto, NCCL_SUCURSAL, COBR_COD, NCCL_TRM
    FROM notas_credito_clientes WHERE NCCL_ID <> 0 and NCCL_anulado = 'N' AND TERC_NIT >= :cliini AND TERC_NIT <= :clifin
    ORDER BY NCCL_FECHA
    INTO :ID, :PREF, :NUMERO, :FECHA, :CONC, :nit,  :RTFTE, :RTIVA, :RTICA, :MONTO, :sucursal, :cobr, :TRM
    DO
    INSERT INTO MOVIMIENTO_CLIENTES (MVCL_ID, TERC_NIT, MVCL_TIPOREF, MVCL_IDREF, MVCL_FECHA, MVCL_VENCE, MVCL_CONC, MVCL_MONTO, MVCL_RTEFTE, MVCL_RTEIVA, MVCL_RTEICA, MVCL_DEBITO, MVCL_ABONO, MVCL_PREFREF, MVCL_NUMREF, MVCL_SUCURSAL, COBR_COD, MVCL_TRM)
      VALUES (GEN_ID(ID_MOVCLI, 1), :NIT, 42, :ID, :FECHA, :FECHA, :CONC, :monto, :rtfte, :rtiva, :rtica, 'N', 'N', :pref, :numero, :sucursal, :cobr, :TRM);

FOR SELECT ANCL_ID, PREF_PRE, ANCL_NUMERO, ANCL_FECHA, ANCL_CONC, TERC_NIT, ANCL_RTFTEMONTO, ANCL_rtivamonto, ANCL_rticamonto, ancl_base+ancl_ivamonto, ancl_sucursal, COBR_COD, ANCL_TRM
    FROM anticipos_cliente WHERE ANCL_ID <> 0 and ANCL_anulado = 'N' AND TERC_NIT >= :cliini AND TERC_NIT <= :clifin
    ORDER BY ANCL_FECHA
    INTO :ID, :PREF, :NUMERO, :FECHA, :CONC, :nit,  :RTFTE, :RTIVA, :RTICA, :MONTO, :sucursal, :cobr, :TRM
    DO
    INSERT INTO MOVIMIENTO_CLIENTES (MVCL_ID, TERC_NIT, MVCL_TIPOREF, MVCL_IDREF, MVCL_FECHA, MVCL_VENCE, MVCL_CONC, MVCL_MONTO, MVCL_RTEFTE, MVCL_RTEIVA, MVCL_RTEICA, MVCL_DEBITO, MVCL_ABONO, MVCL_PREFREF, MVCL_NUMREF, MVCL_SUCURSAL, COBR_COD, MVCL_TRM)
      VALUES (GEN_ID(ID_MOVCLI, 1), :NIT, 45, :ID, :FECHA, :FECHA, :CONC, :monto, :rtfte, :rtiva, :rtica, 'N', 'N', :pref, :numero, :sucursal, :cobr, :TRM);

FOR SELECT A.apcl_id, PREF_PRE, APCL_NUMERO, APCL_FECHA, A.apcl_concepto, TERC_NIT, D.acde_aplicado, D.acde_rtfte, D.acde_rtiva, D.acde_rtica, APCL_SUCURSAL, COBR_COD, APCL_TRM
    FROM aplicacion_cliente_detalle D, aplicacion_cliente A
    WHERE A.apcl_id = D.apcl_id AND A.apcl_id <> 0 AND APCL_ANULADO = 'N' AND TERC_NIT >= :cliini AND TERC_NIT <= :clifin
    ORDER BY APCL_FECHA
    INTO :ID, :PREF, :NUMERO, :FECHA, :CONC, :NIT, :MONTO, :RTFTE, :RTIVA, :RTICA, :sucursal, :cobr, :TRM
    DO
    BEGIN
    EXISTE = 'N';
    SELECT 'S' FROM MOVIMIENTO_CLIENTES WHERE MVCL_TIPOREF = 43 AND MVCL_IDREF = :ID AND MVCL_SUCURSAL = :sucursal INTO :EXISTE;
    if (EXISTE = 'S') then
        begin
        UPDATE movimiento_clientes
            SET MVCL_MONTO = MVCL_MONTO + :monto,
                MVCL_RTEFTE = MVCL_RTEFTE + :rtfte,
                MVCL_RTEIVA = MVCL_RTEIVA + :rtiva,
                MVCL_RTEICA = MVCL_RTEICA + :rtica
            WHERE MVCL_TIPOREF = 43 AND MVCL_IDREF = :ID AND MVCL_SUCURSAL = :sucursal;
        end
    ELSE
        INSERT INTO MOVIMIENTO_CLIENTES (MVCL_ID, TERC_NIT, MVCL_TIPOREF, MVCL_IDREF, MVCL_FECHA, MVCL_VENCE, MVCL_CONC, MVCL_MONTO, MVCL_RTEFTE, MVCL_RTEIVA, MVCL_RTEICA, MVCL_DEBITO, MVCL_ABONO, MVCL_PREFREF, MVCL_NUMREF, MVCL_SUCURSAL, COBR_COD, MVCL_TRM)
            VALUES (GEN_ID(ID_MOVCLI, 1), :NIT, 43, :ID, :FECHA, :FECHA, :CONC, :MONTO, :RTFTE, :RTIVA, :RTICA, 'N', 'S', :pref, :numero, :SUCURSAL, :COBR, :TRM);
    END

FOR SELECT R.reca_id, PREF_PRE, RECA_NUMERO, RECA_FECHA, RECA_CONC, TERC_NIT, RCDE_ABONO+RCDE_DTOF, RCDE_RTFTE, RCDE_RTIVA, RCDE_RTICA, D.rcde_sucursal, R.cobr_cod, RECA_TRM
    FROM recibos_caja_detalle D, recibos_caja R
    WHERE R.reca_id = D.reca_id AND R.reca_id <> 0 AND RECA_ANULADO = 'N' AND TERC_NIT >= :cliini AND TERC_NIT <= :clifin
    ORDER BY RECA_FECHA
    INTO :IDR, :PREF, :NUMERO, :FECHA, :CONC, :NIT, :MONTO, :RTFTE, :RTIVA, :RTICA, :sucursal, :cobr, :TRM
    DO
    BEGIN
    EXISTE = 'N';
    SELECT 'S' FROM MOVIMIENTO_CLIENTES WHERE MVCL_TIPOREF = 61 AND MVCL_IDREF = :IDR AND MVCL_SUCURSAL = :sucursal INTO :EXISTE;
    if (EXISTE = 'S') then
        begin
        UPDATE movimiento_clientes
            SET MVCL_MONTO = MVCL_MONTO + :MONTO,
                MVCL_RTEFTE = MVCL_RTEFTE + :rtfte,
                MVCL_RTEIVA = MVCL_RTEIVA + :rtiva,
                MVCL_RTEICA = MVCL_RTEICA + :rtica
            WHERE MVCL_TIPOREF = 61 AND MVCL_IDREF = :IDR AND MVCL_SUCURSAL = :sucursal;
        end
    ELSE
        INSERT INTO MOVIMIENTO_CLIENTES (MVCL_ID, TERC_NIT, MVCL_TIPOREF, MVCL_IDREF, MVCL_FECHA, MVCL_VENCE, MVCL_CONC, MVCL_MONTO, MVCL_RTEFTE, MVCL_RTEIVA, MVCL_RTEICA, MVCL_DEBITO, MVCL_ABONO, MVCL_PREFREF, MVCL_NUMREF, MVCL_SUCURSAL, COBR_COD, MVCL_TRM)
            VALUES (GEN_ID(ID_MOVCLI, 1), :NIT, 61, :IDR, :FECHA, :FECHA, :CONC, :MONTO, :RTFTE, :RTIVA, :RTICA, 'N', 'S', :pref, :numero, :sucursal, :cobr, :TRM);
    END
FOR SELECT R.egre_id, PREF_PRE, EGRE_NUMERO, EGRE_FECHA, EGRE_CONC, TERC_NIT, EGCC_ABONO+EGCC_DTOF, EGCC_RTFTE, EGCC_RTIVA, EGCC_RTICA, D.egcc_sucursal, EGRE_TRM
    FROM egresos_crucec D, egresos R
    WHERE R.egre_id = D.egre_id AND R.egre_id <> 0 AND EGRE_ANULADO = 'N' AND TERC_NIT >= :cliini AND TERC_NIT <= :clifin
    ORDER BY EGRE_FECHA
    INTO :IDR, :PREF, :NUMERO, :FECHA, :CONC, :NIT, :MONTO, :RTFTE, :RTIVA, :RTICA, :sucursal, :TRM
    DO
    BEGIN
    SELECT COBR_COD FROM cliente_sucursales WHERE TERC_NIT = :NIT AND CLCU_COD = :sucursal INTO :COBR;
    EXISTE = 'N';
    SELECT 'S' FROM MOVIMIENTO_CLIENTES WHERE MVCL_TIPOREF = 62 AND MVCL_IDREF = :IDR AND MVCL_SUCURSAL = :sucursal INTO :EXISTE;
    if (EXISTE = 'S') then
        begin
        UPDATE movimiento_clientes
            SET MVCL_MONTO = MVCL_MONTO + :MONTO,
                MVCL_RTEFTE = MVCL_RTEFTE + :rtfte,
                MVCL_RTEIVA = MVCL_RTEIVA + :rtiva,
                MVCL_RTEICA = MVCL_RTEICA + :rtica
            WHERE MVCL_TIPOREF = 62 AND MVCL_IDREF = :IDR AND MVCL_SUCURSAL = :sucursal;
        end
    ELSE
        INSERT INTO MOVIMIENTO_CLIENTES (MVCL_ID, TERC_NIT, MVCL_TIPOREF, MVCL_IDREF, MVCL_FECHA, MVCL_VENCE, MVCL_CONC, MVCL_MONTO, MVCL_RTEFTE, MVCL_RTEIVA, MVCL_RTEICA, MVCL_DEBITO, MVCL_ABONO, MVCL_PREFREF, MVCL_NUMREF, MVCL_SUCURSAL, COBR_COD, MVCL_TRM)
            VALUES (GEN_ID(ID_MOVCLI, 1), :NIT, 62, :IDR, :FECHA, :FECHA, :CONC, :MONTO, :RTFTE, :RTIVA, :RTICA, 'N', 'S', :pref, :numero, :sucursal, :cobr, :TRM);
    END
END
^

SET TERM ; ^


/* 20101021E */
/* MAIL CARTERA EN REPORTES DE CARTERA */
SET TERM ^ ;

CREATE OR ALTER procedure REP_CARTERA_CLIENTES (
    DESDE varchar(20),
    HASTA varchar(20),
    GRPINI varchar(5),
    GRPFIN varchar(5),
    FECHA date,
    ORDEN char(1),
    AGRUPA char(1),
    SUBEMPRESA integer,
    GRUPCART integer,
    MONEDA integer)
returns (
    NIT varchar(20),
    NOMBRE varchar(60),
    DIR varchar(60),
    TELEFONO varchar(40),
    CIUDAD varchar(40),
    CONTACTO varchar(60),
    EMAIL varchar(100),
    MAILCART varchar(100),
    FAX varchar(25),
    CEL varchar(25),
    CODCLI varchar(20),
    CODZONA varchar(2),
    NOMZONA varchar(60),
    CODCOBR integer,
    NOMCOBR varchar(60),
    SUCURSAL varchar(10),
    NOMSUC varchar(60),
    DV char(1),
    CODCIUD char(5),
    NOMCIUD varchar(60),
    RESALTAR char(1),
    INSTCART varchar(255),
    TIPO integer,
    ID integer,
    PREFIJO varchar(4),
    NUMERO varchar(6),
    CONCEPTO varchar(60),
    MONTO numeric(18,2),
    SALDO numeric(18,2),
    PROVISIONAL numeric(18,2),
    RTFTE numeric(18,2),
    RTIVA numeric(18,2),
    RTICA numeric(18,2),
    DTOF numeric(18,2),
    TIPONOM varchar(8),
    FECDOC date,
    VENCE date,
    DIAS integer,
    CUPO numeric(18,2),
    DISPONIBLE numeric(18,2),
    TOTCLI numeric(18,2),
    NOTA varchar(256),
    OBS blob sub_type 0 segment size 80,
    GRUPCOD integer,
    GRUPNOM varchar(30))
AS
DECLARE VARIABLE NITINI VARCHAR(20);
DECLARE VARIABLE NITFIN VARCHAR(20);
DECLARE VARIABLE NOMINI VARCHAR(20);
DECLARE VARIABLE NOMFIN VARCHAR(20);
DECLARE VARIABLE OK CHAR(1);
DECLARE VARIABLE FOV CHAR(11);
DECLARE VARIABLE DTOAPL NUMERIC(18,2);
DECLARE VARIABLE FECDTO DATE;
DECLARE VARIABLE FECNOTA VARCHAR(10);
DECLARE VARIABLE AUXNOTA VARCHAR(256);
DECLARE VARIABLE IDNOTA INTEGER;
declare variable descnt_prov char(2);
declare variable AUTORET VARCHAR(10);
declare variable FAUTORET DATE;
declare variable INCLANTI CHAR(2);
DECLARE VARIABLE TRM NUMERIC(18,2);
declare variable DB CHAR(1);
BEGIN
if (ORDEN = 'C') then
    BEGIN
    NITINI = DESDE;
    NITFIN = HASTA;
    NOMINI = '';
    NOMFIN = 'zz';
    END
ELSE
    BEGIN
    NOMINI = DESDE;
    NOMFIN = HASTA;
    NITINI = '';
    NITFIN = 'zz';
    END
  EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'DESCONTAR RECIBOS PROVISIONALES EN INFORMES DE CARTERA') RETURNING_VALUES (:descnt_prov);
  EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'INCLUIR ANTICIPOS DE CLIENTES EN REPORTES Y CONSULTAS DE CARTERA') returning_values (INCLANTI);
  EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'FECHA AUTORETENEDOR NO DESCONTAR RETENCIONES DEL SALDO PERO SI CONTABILIZARLAS') returning_values (AUTORET);
  EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'ANALISIS DE CARTERA CON FECHA FACTURA O VENCIMIENTO') RETURNING_VALUES (FOV);
  if (AUTORET <> '') then
    FAUTORET = CAST(AUTORET AS DATE);
  else
    FAUTORET = '9999/12/31';
  /* Ubique el NIT */
  FOR select C.TERC_NIT, TERC_NOM, TERC_DV, CLSU_DIR, CLSU_TEL, CLSU_CIUDAD, S.COBR_COD, S.ZONA_COD, T.CIUD_COD, CLIE_CUPO, CLCU_COD, CLSU_NOMBRE, t.terc_obs, C.GRCA_COD, TERC_CONTACTO, TERC_EMAIL, TERC_FAX, TERC_CEL, CLIE_COD, CLIE_RESALTAR, CLIE_INSTCARTERA, CLIE_MAILCART
    from terceros T, CLIENTES C, CLIENTE_SUCURSALES S
    where C.TERC_NIT = T.TERC_NIT AND TERC_CLIE = 'S' AND S.TERC_NIT = C.TERC_NIT AND C.TERC_NIT >= :NITINI AND C.TERC_NIT <= :NITFIN AND
        TERC_NOM >= :NOMINI AND TERC_NOM <= :NOMFIN AND ((:GRUPCART = 0) or (C.GRCA_COD = :GRUPCART))
    INTO :NIT, :NOMBRE, :DV, :DIR, :TELEFONO, :CIUDAD, :CODCOBR, :CODZONA, :CODCIUD, :CUPO, :SUCURSAL, :NOMSUC, :obs, :GRUPCOD, :CONTACTO, :EMAIL, :FAX, :CEL, :CODCLI, :resaltar, INSTCART, :mailcart
    DO  
    BEGIN
    TOTCLI = 0;
    if (CODCOBR IS NOT NULL) then
        SELECT COBR_NOM FROM COBRADORES  WHERE COBR_COD = :CODCOBR INTO :NOMCOBR;
    if (CODZONA IS NOT NULL) then
        SELECT ZONA_NOM FROM ZONAS WHERE ZONA_COD = :CODZONA INTO :NOMZONA;
    if (CODCIUD IS NOT NULL) then
        SELECT CIUD_NOM FROM CIUDADES  WHERE CIUD_COD = :CODCIUD INTO :NOMCIUD;
    SELECT GRCA_NOMBRE FROM GRUPO_CARTERA WHERE GRCA_COD = :GRUPCOD INTO :GRUPNOM;
    DISPONIBLE = CUPO;
    OK = 'N';
    if (AGRUPA = 'Z') then
        BEGIN
        if (GRPINI = '') then
            BEGIN
            if ((CODZONA IS NULL) or (CODZONA >= :GRPINI AND CODZONA <= :GRPFIN)) then
                OK = 'S';
            END
        ELSE
            if (CODZONA >= :GRPINI AND CODZONA <= :GRPFIN) then
                OK = 'S';
        END
    if (AGRUPA = 'I') then
        BEGIN
        if (GRPINI = '') then
            BEGIN
            if ((CODCIUD IS NULL) or (CODCIUD >= :GRPINI AND CODCIUD <= :GRPFIN)) then
                OK = 'S';
            END
        ELSE
            if (CODCIUD >= :GRPINI AND CODCIUD <= :GRPFIN) then
                OK = 'S';
        END
    if (AGRUPA = 'N') then
        OK = 'S';
        
    if (OK = 'S') then
        BEGIN
        /* BUSQUE EN SALDOS_DOC_CARTERA LOS QUE TENGAN SALDO > 0 */
        FOR SELECT MVCL_TIPOREF, MVCL_IDREF, MVCL_PREFREF, MVCL_NUMREF, MVCL_FECHA, MVCL_VENCE, MVCL_CONC, MVCL_MONTO, MVCL_DEBITO
            FROM MOVIMIENTO_CLIENTES WHERE TERC_NIT = :NIT AND MVCL_SUCURSAL = :SUCURSAL AND MVCL_FECHA <= :FECHA AND
            MVCL_ABONO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) AND ((:MONEDA = 0) or (MVCL_TRM <> 1))
            INTO :TIPO, :ID, :PREFIJO, :NUMERO, :FECDOC, :VENCE, :CONCEPTO, :MONTO, :DB
            DO
            BEGIN
            if (DB = 'N') then
                MONTO = MONTO * -1;
            if ((inclanti = 'SI') or (TIPO <> 45)) then
                BEGIN
                EXECUTE PROCEDURE saldo_doc_cartera(TIPO, ID, FECHA, MONEDA) returning_values (SALDO);
                if (SALDO <> 0) then
                    BEGIN
                    PROVISIONAL = 0;
                    if (FOV = 'FECHA') then
                       DIAS = FECHA - FECDOC;
                    ELSE
                      DIAS = FECHA - VENCE;
                    DISPONIBLE = DISPONIBLE - SALDO;
                    SELECT TIDO_NOMCORTO FROM TIPO_DOCUMENTO WHERE TIDO_COD = :TIPO INTO :TIPONOM;
                    if (TIPO = 41) then
                        SELECT NDCL_DTOFMONTO, NDCL_FECHADTO, NDCL_TRM FROM NOTAS_DEBITO_CLIENTES
                            WHERE NDCL_ID = :ID INTO :DTOF, :FECDTO, :TRM;
                    if (TIPO = 42) then
                        SELECT 0, :FECDOC, 1 FROM NOTAS_CREDITO_CLIENTES
                            WHERE NCCL_ID = :ID INTO :DTOF, :FECDTO, :TRM;
                    if (TIPO = 45) then
                        SELECT ANCL_DTOFMONTO, ANCL_DTOFECHA, ANCL_TRM FROM ANTICIPOS_CLIENTE
                            WHERE ANCL_ID = :ID INTO :DTOF, :FECDTO, :TRM;
                    if (TIPO = 31) then
                        SELECT FACT_DTOFMONTO, FACT_DTOFFECHA, FACT_TRM FROM FACTURAS
                            WHERE FACT_ID = :ID INTO :DTOF, :FECDTO, :TRM;
                    if (TIPO = 33) then
                        SELECT 0, :FECDOC, 1 FROM devoluciones_ventas
                            WHERE DEVT_ID = :ID INTO :DTOF, :FECDTO, :TRM;
                    if ((MONEDA <> 0) AND (TRM <> 0)) then
                        DTOF = DTOF / TRM;
                    if (DTOF IS NULL) then
                        DTOF = 0;
                    if (DTOF <> 0) then
                        BEGIN
                        SELECT SUM(RCDE_DTOF), MAX(RECA_TRM) FROM RECIBOS_CAJA_DETALLE D, RECIBOS_CAJA R
                            WHERE R.reca_id = D.reca_id AND RCDE_IDDOC = :ID AND RCDE_TIPODOC = :TIPO
                            INTO :DTOAPL, :TRM;
                        if (DTOAPL IS NULL) then
                            DTOAPL = 0;
                        if ((MONEDA <> 0) AND (TRM <> 1)) then
                            DTOAPL = DTOAPL / TRM;
                        DTOF = DTOF - DTOAPL;
                        /* SI YA SE VENCIO DEJELO EN CERO */
                        if (FECDTO < FECHA) then
                            DTOF = 0;
                        END
                    if (MONEDA = 0) then
                        SELECT SUM(SDCA_RTFTE - SDCA_ABRTFTE), SUM(SDCA_RTIVA - SDCA_ABRTIVA), SUM(SDCA_RTICA - SDCA_ABRTICA)
                            FROM SALDOS_DOC_CARTERA WHERE SDCA_TIPOREF = :TIPO AND SDCA_IDREF = :ID
                            INTO :RTFTE, :RTIVA, :RTICA;
                    ELSE
                        SELECT SUM((SDCA_RTFTE - SDCA_ABRTFTE)/SDCA_TRM), SUM((SDCA_RTIVA - SDCA_ABRTIVA)/SDCA_TRM), SUM((SDCA_RTICA - SDCA_ABRTICA)/SDCA_TRM)
                            FROM SALDOS_DOC_CARTERA WHERE SDCA_TIPOREF = :TIPO AND SDCA_IDREF = :ID
                            INTO :RTFTE, :RTIVA, :RTICA;
                    if (RTFTE IS NULL) then
                        RTFTE = 0;
                    if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) THEN
                        BEGIN
                        if (RTFTE > 0) then
                            RTFTE = 0;
                        END
                    ELSE
                        BEGIN
                        if (RTFTE < 0) then
                            RTFTE = 0;
                        END
                    if (RTIVA IS NULL) then
                        RTIVA = 0;
                    if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) THEN
                        BEGIN
                        if (RTIVA > 0) then
                            RTIVA = 0;
                        END
                    ELSE
                        BEGIN
                        if (RTIVA < 0) then
                            RTIVA = 0;
                        END
                    if (RTICA IS NULL) then
                        RTICA = 0;
                    if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) THEN
                        BEGIN
                        if (RTICA > 0) then
                            RTICA = 0;
                        END
                    ELSE
                        BEGIN
                        if (RTICA < 0) then
                            RTICA = 0;
                        END
                    if (FAUTORET <= FECDOC) then
                        RTFTE = 0;
                    /* SI TIENE NOTA AGREGUELA */
                    SELECT MAX(NOCL_ID) FROM NOTAS_CLIENTES WHERE TERC_NIT = :NIT AND CLSU_COD = :SUCURSAL AND NOCL_TIPODOC = :TIPO AND NOCL_IDDOC = :ID INTO :IDNOTA;
                    if (IDNOTA IS NOT NULL) then
                        BEGIN
                        SELECT cast(NOCL_FECHA as char(10)), NOCL_TEXTO FROM NOTAS_CLIENTES
                            WHERE NOCL_ID = :IDNOTA INTO :FECNOTA, :AUXNOTA;
                        if (STRLEN(AUXNOTA) < 244) then
                            NOTA = FECNOTA || ':' || AUXNOTA;
                        ELSE
                            NOTA = AUXNOTA;
                        END
                    else
                        NOTA = '';
                    TOTCLI = TOTCLI + SALDO;
                    SUSPEND;
                    END  /* SALDO <> 0 */
                END  /* NO ANTICIPO */
            END  /* FOR */
        /* AGREGUE LOS RECIBOS PROVISIONALES CON SIGNO NEGATIVO */
        FOR SELECT 65, MAX(P.RCPR_ID), MAX(PREF_PRE), MAX(RCPR_NUMERO), MAX(RCPR_FECHA), MAX(RCPR_CONC), SUM(RPDE_ABONO * -1), SUM(RPDE_RTFTE*-1), SUM(RPDE_RTIVA*-1), SUM(RPDE_RTICA*-1), MAX(RCPR_TRM)
            FROM RECIBO_PROVISIONAL P, recibo_provisional_detalle D
            WHERE P.rcpr_id = D.rcpr_id AND P.TERC_NIT = :NIT AND RCPR_FECHA <= :FECHA AND RCPR_ANULADO = 'N' AND
            ((RCPR_FECCRUCE IS NULL) or (RCPR_FECCRUCE > :FECHA)) AND RPDE_SUCURSAL = :SUCURSAL AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY P.rcpr_id
            INTO :TIPO, :ID, :PREFIJO, :NUMERO, :FECDOC, :CONCEPTO, :PROVISIONAL, :rtfte,  :RTIVA, :RTICA, :TRM
            DO
            BEGIN
            if ((MONEDA <> 0) AND (TRM <> 0)) then
                PROVISIONAL = PROVISIONAL / TRM;
            if (:descnt_prov = 'NO') then
              SALDO = 0;
            else
              SALDO = :PROVISIONAL;
            SELECT TIDO_NOMCORTO FROM TIPO_DOCUMENTO WHERE TIDO_COD = :TIPO INTO :TIPONOM;
            /* CALCULE EL VENCIMIENTO DEL ULTIMO DOCUMENTO POSFECHADO */
            SELECT MAX(RPPA_FECHA) FROM recibo_provisional_pago WHERE RCPR_ID = :ID INTO :VENCE;
            DIAS = VENCE - FECHA;
            SUSPEND;
            END
        END
    if (AGRUPA = 'C') then
        BEGIN
        FOR SELECT DISTINCT COBR_COD FROM MOVIMIENTO_CLIENTES
            WHERE TERC_NIT = :NIT AND MVCL_SUCURSAL = :SUCURSAL AND MVCL_FECHA <= :FECHA AND
            MVCL_ABONO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            INTO :codcobr
            DO
            BEGIN
            OK = 'N';
            if (GRPINI = '') then
                BEGIN
                if ((CODCOBR IS NULL) or (CODCOBR >= :GRPINI AND CODCOBR <= :GRPFIN)) then
                    OK = 'S';
                END
            ELSE
                if (CODCOBR >= :GRPINI AND CODCOBR <= :GRPFIN) then
                    OK = 'S';
            if (OK = 'S') then
                BEGIN
                SELECT COBR_NOM FROM COBRADORES  WHERE COBR_COD = :CODCOBR INTO :NOMCOBR;
                /* BUSQUE EN SALDOS_DOC_CARTERA LOS QUE TENGAN SALDO > 0 */
                FOR SELECT MVCL_TIPOREF, MVCL_IDREF, MVCL_PREFREF, MVCL_NUMREF, MVCL_FECHA, MVCL_VENCE, MVCL_CONC, MVCL_MONTO, MVCL_DEBITO
                    FROM MOVIMIENTO_CLIENTES WHERE TERC_NIT = :NIT AND MVCL_SUCURSAL = :SUCURSAL AND MVCL_FECHA <= :FECHA AND
                    MVCL_ABONO = 'N' AND COBR_COD = :codcobr AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) AND
                    ((:MONEDA = 0) or (MVCL_TRM <> 1))
                    INTO :TIPO, :ID, :PREFIJO, :NUMERO, :FECDOC, :VENCE, :CONCEPTO, :MONTO, :DB
                    DO
                    BEGIN
                    if (DB = 'N') then
                        MONTO = MONTO * -1;
                    if ((inclanti = 'SI') or (TIPO <> 45)) then
                        BEGIN
                        EXECUTE PROCEDURE saldo_doc_cartera(TIPO, ID, FECHA, MONEDA) returning_values (SALDO);
                        if (SALDO <> 0) then
                            BEGIN
                            PROVISIONAL = 0;
                            if (FOV = 'FECHA') then
                               DIAS = FECHA - FECDOC;
                            ELSE
                              DIAS = FECHA - VENCE;
                            DISPONIBLE = DISPONIBLE - SALDO;
                            SELECT TIDO_NOMCORTO FROM TIPO_DOCUMENTO WHERE TIDO_COD = :TIPO INTO :TIPONOM;
                            if (TIPO = 41) then
                                SELECT NDCL_DTOFMONTO, NDCL_FECHADTO, NDCL_TRM FROM NOTAS_DEBITO_CLIENTES
                                    WHERE NDCL_ID = :ID INTO :DTOF, :FECDTO, :TRM;
                            if (TIPO = 42) then
                                SELECT 0, :FECDOC, 1 FROM NOTAS_CREDITO_CLIENTES
                                    WHERE NCCL_ID = :ID INTO :DTOF, :FECDTO, :TRM;
                            if (TIPO = 45) then
                                SELECT ANCL_DTOFMONTO, ANCL_DTOFECHA, ANCL_TRM FROM ANTICIPOS_CLIENTE
                                    WHERE ANCL_ID = :ID INTO :DTOF, :FECDTO, :TRM;
                            if (TIPO = 31) then
                                SELECT FACT_DTOFMONTO, FACT_DTOFFECHA, FACT_TRM FROM FACTURAS
                                    WHERE FACT_ID = :ID INTO :DTOF, :FECDTO, :TRM;
                            if (TIPO = 33) then
                                SELECT 0, :FECDOC, 1 FROM devoluciones_ventas
                                    WHERE DEVT_ID = :ID INTO :DTOF, :FECDTO, :TRM;
                            if (DTOF IS NULL) then
                                DTOF = 0;
                            if ((MONEDA <> 0) AND (TRM <> 0)) then
                                DTOF = DTOF / TRM;
                            if (DTOF <> 0) then
                                BEGIN
                                SELECT SUM(RCDE_DTOF) FROM RECIBOS_CAJA_DETALLE WHERE RCDE_IDDOC = :ID AND RCDE_TIPODOC = :TIPO INTO :DTOAPL;
                                if (DTOAPL IS NULL) then
                                    DTOAPL = 0;
                                DTOF = DTOF - DTOAPL;
                                /* SI YA SE VENCIO DEJELO EN CERO */
                                if (FECDTO < FECHA) then
                                    DTOF = 0;
                                END
                            SELECT SUM(SDCA_RTFTE - SDCA_ABRTFTE), SUM(SDCA_RTIVA - SDCA_ABRTIVA), SUM(SDCA_RTICA - SDCA_ABRTICA)
                                FROM SALDOS_DOC_CARTERA WHERE SDCA_TIPOREF = :TIPO AND SDCA_IDREF = :ID INTO :RTFTE, :RTIVA, :RTICA;
                            if (RTFTE IS NULL) then
                                RTFTE = 0;
                            if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) THEN
                                BEGIN
                                if (RTFTE > 0) then
                                    RTFTE = 0;
                                END
                            ELSE
                                BEGIN
                                if (RTFTE < 0) then
                                    RTFTE = 0;
                                END
                            if (FAUTORET <= FECDOC) then
                                RTFTE = 0;
                            if (RTIVA IS NULL) then
                                RTIVA = 0;
                            if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) THEN
                                BEGIN
                                if (RTIVA > 0) then
                                    RTIVA = 0;
                                END
                            ELSE
                                BEGIN
                                if (RTIVA < 0) then
                                    RTIVA = 0;
                                END
                            if (RTICA IS NULL) then
                                RTICA = 0;
                            if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) THEN
                                BEGIN
                                if (RTICA > 0) then
                                    RTICA = 0;
                                END
                            ELSE
                                BEGIN
                                if (RTICA < 0) then
                                    RTICA = 0;
                                END
                            /* SI TIENE NOTA AGREGUELA */
                            SELECT MAX(NOCL_ID) FROM NOTAS_CLIENTES WHERE TERC_NIT = :NIT AND CLSU_COD = :SUCURSAL AND NOCL_TIPODOC = :TIPO AND NOCL_IDDOC = :ID INTO :IDNOTA;
                            if (IDNOTA IS NOT NULL) then
                                BEGIN
                                SELECT cast(NOCL_FECHA as char(10)), NOCL_TEXTO FROM NOTAS_CLIENTES
                                    WHERE NOCL_ID = :IDNOTA INTO :FECNOTA, :AUXNOTA;
                                if (STRLEN(AUXNOTA) < 244) then
                                    NOTA = FECNOTA || ':' || AUXNOTA;
                                ELSE
                                    NOTA = AUXNOTA;
                                END
                            else
                                NOTA = '';
                            TOTCLI = TOTCLI + SALDO;
                            SUSPEND;
                            END  /* SALDO <> 0 */
                        END  /* NO ANTICIPO */
                    END  /* FOR */
                /* AGREGUE LOS RECIBOS PROVISIONALES CON SIGNO NEGATIVO */
                FOR SELECT 65, MAX(P.RCPR_ID), MAX(PREF_PRE), MAX(RCPR_NUMERO), MAX(RCPR_FECHA), MAX(RCPR_CONC), SUM(RPDE_ABONO * -1), SUM(RPDE_RTFTE*-1), SUM(RPDE_RTIVA*-1), SUM(RPDE_RTICA*-1), MAX(RCPR_TRM)
                    FROM RECIBO_PROVISIONAL P, recibo_provisional_detalle D
                    WHERE P.rcpr_id = D.rcpr_id AND P.TERC_NIT = :NIT AND P.VEND_COD = :codcobr AND RCPR_FECHA <= :FECHA AND RCPR_ANULADO = 'N' AND
                    ((RCPR_FECCRUCE IS NULL) or (RCPR_FECCRUCE > :FECHA)) AND RPDE_SUCURSAL = :SUCURSAL AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                    GROUP BY P.rcpr_id
                    INTO :TIPO, :ID, :PREFIJO, :NUMERO, :FECDOC, :CONCEPTO, :PROVISIONAL, :rtfte,  :RTIVA, :RTICA, :TRM
                    DO
                    BEGIN
                    if ((MONEDA <> 0) AND (TRM <> 0)) then
                        PROVISIONAL = PROVISIONAL / TRM;
                    MONTO = PROVISIONAL;
                    if (:descnt_prov = 'NO') then
                      SALDO = 0;
                    else
                      SALDO = :PROVISIONAL;
                    SELECT TIDO_NOMCORTO FROM TIPO_DOCUMENTO WHERE TIDO_COD = :TIPO INTO :TIPONOM;
                    /* CALCULE EL VENCIMIENTO DEL ULTIMO DOCUMENTO POSFECHADO */
                    SELECT MAX(RPPA_FECHA) FROM recibo_provisional_pago WHERE RCPR_ID = :ID INTO :VENCE;
                    DIAS = VENCE - FECHA;
                    SUSPEND;
                    END
                END /* ok */
            END  /* FOR COBR */
        END  /* AGRUPA = C */
    END  /* FOR NIT */
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure REP_CARTERA_CONSOLIDADA (
    DESDE varchar(20),
    HASTA varchar(20),
    GRPINI varchar(5),
    GRPFIN varchar(5),
    FECHA date,
    ORDEN char(1),
    AGRUPA char(1),
    SUBEMPRESA integer,
    GRUPCART integer,
    MONEDA integer)
returns (
    NIT varchar(20),
    NOMBRE varchar(60),
    TELEFONO varchar(40),
    CIUDAD varchar(40),
    EMAIL varchar(100),
    MAILCART VARCHAR(100),
    FAX varchar(25),
    CEL varchar(25),
    CODCLI varchar(20),
    CODZONA varchar(2),
    NOMZONA varchar(60),
    CODCOBR integer,
    NOMCOBR varchar(60),
    SUCURSAL varchar(10),
    DV char(1),
    CODCIUD char(5),
    NOMCIUD varchar(60),
    SALDO numeric(18,2),
    RTFTE numeric(18,2),
    RTIVA numeric(18,2),
    RTICA numeric(18,2),
    DTOF numeric(18,2),
    CUPO numeric(18,2),
    DISPONIBLE numeric(18,2),
    PROVISIONAL numeric(18,2),
    CONTACTO varchar(60),
    ESTADO char(1),
    RESALTAR char(1),
    INSTCART varchar(255),
    GRUPCOD integer,
    GRUPNOM varchar(30))
AS
declare variable NITINI VARCHAR(20);
declare variable NITFIN VARCHAR(20);
declare variable NOMINI VARCHAR(20);
declare variable NOMFIN VARCHAR(20);
declare variable OK CHAR(1);
declare variable PSALDO NUMERIC(18,2);
declare variable PRTFTE NUMERIC(18,2);
declare variable PRTIVA NUMERIC(18,2);
declare variable PRTICA NUMERIC(18,2);
declare variable PDTOF NUMERIC(18,2);
declare variable TIPO INTEGER;
declare variable ID INTEGER;
declare variable DTOAPL NUMERIC(18,2);
declare variable FECDTO DATE;
declare variable descnt_prov char(2);
declare variable AUTORET VARCHAR(10);
declare variable FAUTORET DATE;
declare variable FECDOC DATE;
declare variable INCLANTI CHAR(2);
declare variable TRM NUMERIC(18,2);
BEGIN
if (ORDEN = 'C') then
    BEGIN
    NITINI = DESDE;
    NITFIN = HASTA;
    NOMINI = '';
    NOMFIN = 'zz';
    END
ELSE
    BEGIN
    NOMINI = DESDE;
    NOMFIN = HASTA;
    NITINI = '';
    NITFIN = 'zz';
    END
  EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'DESCONTAR RECIBOS PROVISIONALES EN INFORMES DE CARTERA') RETURNING_VALUES (:descnt_prov);
  EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'INCLUIR ANTICIPOS DE CLIENTES EN REPORTES Y CONSULTAS DE CARTERA') returning_values (INCLANTI);
  EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'FECHA AUTORETENEDOR NO DESCONTAR RETENCIONES DEL SALDO PERO SI CONTABILIZARLAS') returning_values (AUTORET);
  if (AUTORET <> '') then
    FAUTORET = CAST(AUTORET AS DATE);
  else
    FAUTORET = '9999/12/31';
  /* Ubique el NIT */
  FOR select C.TERC_NIT, CLSU_NOMBRE, TERC_DV, CLSU_TEL, CLSU_CIUDAD, TERC_CONTACTO, S.COBR_COD, S.ZONA_COD, T.CIUD_COD, CLIE_CUPO, CLIE_ESTADO, CLCU_COD, C.GRCA_COD, TERC_EMAIL, TERC_FAX, TERC_CEL, CLIE_COD, CLIE_RESALTAR, CLIE_INSTCARTERA, CLIE_MAILCART
    from terceros T, CLIENTES C, CLIENTE_SUCURSALES S
    where C.TERC_NIT = T.TERC_NIT AND TERC_CLIE = 'S' AND S.TERC_NIT = C.TERC_NIT AND C.TERC_NIT >= :NITINI AND C.TERC_NIT <= :NITFIN AND
        TERC_NOM >= :NOMINI AND TERC_NOM <= :NOMFIN AND ((:GRUPCART = 0) or (C.GRCA_COD = :GRUPCART))
    INTO :NIT, :NOMBRE, :DV, :TELEFONO, :CIUDAD, :CONTACTO, :CODCOBR, :CODZONA, :CODCIUD, :CUPO, :ESTADO, :SUCURSAL, :GRUPCOD, :EMAIL, :FAX, :CEL, :CODCLI, :RESALTAR, INSTCART, :MAILCART
    DO  
    BEGIN
    SELECT GRCA_NOMBRE FROM GRUPO_CARTERA WHERE GRCA_COD = :GRUPCOD INTO :GRUPNOM;
    OK = 'N';
    if (AGRUPA = 'Z') then
        BEGIN
        if (GRPINI = '') then
            BEGIN
            if ((CODZONA IS NULL) or (CODZONA >= :GRPINI AND CODZONA <= :GRPFIN)) then
                OK = 'S';
            END
        ELSE
            if (CODZONA >= :GRPINI AND CODZONA <= :GRPFIN) then
                OK = 'S';
        END
    if (AGRUPA = 'I') then
        BEGIN
        if (GRPINI = '') then
            BEGIN
            if ((CODCIUD IS NULL) or (CODCIUD >= :GRPINI AND CODCIUD <= :GRPFIN)) then
                OK = 'S';
            END
        ELSE
            if (CODCIUD >= :GRPINI AND CODCIUD <= :GRPFIN) then
                OK = 'S';
        END
    if (AGRUPA = 'N') then
        OK = 'S';
        
    if (OK = 'S') then
        BEGIN
        if (CODCOBR IS NOT NULL) then
            SELECT COBR_NOM FROM COBRADORES  WHERE COBR_COD = :CODCOBR INTO :NOMCOBR;
        if (CODZONA IS NOT NULL) then
            SELECT ZONA_NOM FROM ZONAS WHERE ZONA_COD = :CODZONA INTO :NOMZONA;
        if (CODCIUD IS NOT NULL) then
            SELECT CIUD_NOM FROM CIUDADES  WHERE CIUD_COD = :CODCIUD INTO :NOMCIUD;
    
        SALDO = 0;
        RTFTE = 0;
        RTIVA = 0;
        RTICA = 0;
        DTOF = 0;
        /* BUSQUE EN SALDOS_DOC_CARTERA LOS QUE TENGAN SALDO > 0 */
        FOR SELECT MVCL_TIPOREF, MVCL_IDREF, MVCL_FECHA
          FROM MOVIMIENTO_CLIENTES WHERE TERC_NIT = :NIT AND MVCL_SUCURSAL = :SUCURSAL AND MVCL_FECHA <= :FECHA AND
          MVCL_ABONO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) AND ((:MONEDA = 0) or (MVCL_TRM <> 1))
          INTO :TIPO, :ID, :FECDOC
          DO
            BEGIN
            if ((inclanti = 'SI') or (TIPO <> 45)) then
                BEGIN
                EXECUTE PROCEDURE saldo_doc_cartera(TIPO, ID, FECHA, MONEDA) returning_values (PSALDO);
                if (PSALDO <> 0) then
                    BEGIN
                    if (TIPO = 41) then
                        SELECT NDCL_DTOFMONTO, NDCL_FECHADTO, NDCL_TRM FROM NOTAS_DEBITO_CLIENTES
                            WHERE NDCL_ID = :ID INTO :PDTOF, :FECDTO, :TRM;
                    if (TIPO = 42) then
                        SELECT 0, NCCL_FECHA, 1 FROM NOTAS_CREDITO_CLIENTES
                            WHERE NCCL_ID = :ID INTO :PDTOF, :FECDTO, :TRM;
                    if (TIPO = 45) then
                        SELECT ANCL_DTOFMONTO, ANCL_DTOFECHA, ANCL_TRM FROM ANTICIPOS_CLIENTE
                            WHERE ANCL_ID = :ID INTO :PDTOF, :FECDTO, :TRM;
                    if (TIPO = 31) then
                        SELECT FACT_DTOFMONTO, FACT_DTOFFECHA, FACT_TRM FROM FACTURAS
                            WHERE FACT_ID = :ID INTO :PDTOF, :FECDTO, :TRM;
                    if (TIPO = 33) then
                        SELECT 0, DEVT_FECHA, 1 FROM devoluciones_ventas
                            WHERE DEVT_ID = :ID INTO :PDTOF, :FECDTO, :TRM;
                    if (PDTOF IS NULL) then
                        PDTOF = 0;
                    if ((MONEDA <> 0) AND (TRM <> 0)) then
                        PDTOF = PDTOF / TRM;
                    if (PDTOF <> 0) then
                        BEGIN
                        SELECT SUM(RCDE_DTOF), MAX(RECA_TRM) FROM RECIBOS_CAJA_DETALLE D, recibos_caja R
                            WHERE R.reca_id = D.reca_id AND RCDE_IDDOC = :ID AND RCDE_TIPODOC = :TIPO INTO :DTOAPL, :TRM;
                        if (DTOAPL IS NULL) then
                            DTOAPL = 0;
                        if ((MONEDA <> 0) AND (TRM <> 0)) then
                           DTOAPL = DTOAPL / TRM;
                        PDTOF = PDTOF - DTOAPL;
                        /* SI YA SE VENCIO DEJELO EN CERO */
                        if (FECDTO < FECHA) then
                            PDTOF = 0;
                        END
                    if (MONEDA = 0) then
                        SELECT SUM(SDCA_RTFTE - SDCA_ABRTFTE), SUM(SDCA_RTIVA - SDCA_ABRTIVA), SUM(SDCA_RTICA - SDCA_ABRTICA)
                            FROM SALDOS_DOC_CARTERA WHERE SDCA_TIPOREF = :TIPO AND SDCA_IDREF = :ID
                            INTO :PRTFTE, :PRTIVA, :PRTICA;
                    ELSE
                        SELECT SUM((SDCA_RTFTE - SDCA_ABRTFTE)/SDCA_TRM), SUM((SDCA_RTIVA - SDCA_ABRTIVA)/SDCA_TRM), SUM((SDCA_RTICA - SDCA_ABRTICA)/SDCA_TRM)
                            FROM SALDOS_DOC_CARTERA WHERE SDCA_TIPOREF = :TIPO AND SDCA_IDREF = :ID
                            INTO :PRTFTE, :PRTIVA, :PRTICA;
                    if (PRTFTE IS NULL) then
                        PRTFTE = 0;
                    if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) THEN
                        BEGIN
                        if (PRTFTE > 0) then
                            PRTFTE = 0;
                        END
                    ELSE    
                        BEGIN
                        if (PRTFTE < 0) then
                            PRTFTE = 0;
                        END
                    if (PRTIVA IS NULL) then
                        PRTIVA = 0;
                    if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) THEN
                        BEGIN
                        if (PRTIVA > 0) then
                            PRTIVA = 0;
                        END
                    ELSE
                        BEGIN
                        if (PRTIVA < 0) then
                            PRTIVA = 0;
                        END
                    if (PRTICA IS NULL) then
                        PRTICA = 0;
                    if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) THEN
                        BEGIN
                        if (PRTICA > 0) then
                            PRTICA = 0;
                        END
                    ELSE
                        BEGIN
                        if (PRTICA < 0) then
                            PRTICA = 0;
                        END

                    if (FAUTORET <= FECDOC) then
                        PRTFTE = 0;

                    SALDO = SALDO + PSALDO;
                    RTFTE = RTFTE + PRTFTE;
                    RTIVA = RTIVA + PRTIVA;
                    RTICA = RTICA + PRTICA;
                    DTOF = DTOF + PDTOF;
                    END /* SALDO <> 0 */
                END  /* NO ANTICIPO */
            END
        DISPONIBLE = CUPO - SALDO;
        /* LOS RECIBOS PROVISIONALES */
        SELECT SUM(RPDE_ABONO), MAX(RCPR_TRM) FROM recibo_provisional P, recibo_provisional_detalle D
            WHERE P.rcpr_id = D.rcpr_id AND TERC_NIT = :NIT AND RPDE_SUCURSAL = :SUCURSAL AND ((:MONEDA = 0) or (RCPR_TRM <> 1)) AND
            RCPR_FECHA <= :FECHA AND RCPR_ANULADO = 'N' AND ((RCPR_FECCRUCE IS NULL) or (RCPR_FECCRUCE > :FECHA)) AND
            ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            INTO :provisional, :TRM;
        if ((MONEDA <> 0) AND (TRM <> 0)) then
            PROVISIONAL = PROVISIONAL / TRM;
           if (:descnt_prov = 'SI') then
             if (NOT :provisional is NULL) then
              SALDO = :saldo - :PROVISIONAL;
        SUSPEND;
        END
    if (AGRUPA = 'C') then
        BEGIN
        if (CODZONA IS NOT NULL) then
            SELECT ZONA_NOM FROM ZONAS WHERE ZONA_COD = :CODZONA INTO :NOMZONA;
        if (CODCIUD IS NOT NULL) then
            SELECT CIUD_NOM FROM CIUDADES  WHERE CIUD_COD = :CODCIUD INTO :NOMCIUD;
        FOR SELECT DISTINCT COBR_COD FROM MOVIMIENTO_CLIENTES WHERE TERC_NIT = :NIT AND
            MVCL_SUCURSAL = :SUCURSAL AND MVCL_FECHA <= :FECHA AND
            MVCL_ABONO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            INTO :codcobr
            DO
            begin
            OK = 'N';
            if (GRPINI = '') then
                BEGIN
                if ((CODCOBR IS NULL) or (CODCOBR >= :GRPINI AND CODCOBR <= :GRPFIN)) then
                    OK = 'S';
                END
            ELSE
                if (CODCOBR >= :GRPINI AND CODCOBR <= :GRPFIN) then
                    OK = 'S';
            if (OK = 'S') then
                BEGIN
                SELECT COBR_NOM FROM COBRADORES  WHERE COBR_COD = :CODCOBR INTO :NOMCOBR;

                SALDO = 0;
                RTFTE = 0;
                RTIVA = 0;
                RTICA = 0;
                DTOF = 0;
                /* BUSQUE EN SALDOS_DOC_CARTERA LOS QUE TENGAN SALDO > 0 */
                FOR SELECT MVCL_TIPOREF, MVCL_IDREF, MVCL_FECHA
                  FROM MOVIMIENTO_CLIENTES WHERE TERC_NIT = :NIT AND MVCL_SUCURSAL = :SUCURSAL AND ((:moneda = 0) or (mvcl_trm <> 1)) AND
                  MVCL_FECHA <= :FECHA AND COBR_COD = :codcobr AND MVCL_ABONO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                  INTO :TIPO, :ID, :FECDOC
                  DO
                    BEGIN
                    if ((inclanti = 'SI') or (TIPO <> 45)) then
                        BEGIN
                        EXECUTE PROCEDURE saldo_doc_cartera(TIPO, ID, FECHA, MONEDA) returning_values (PSALDO);
                        if (PSALDO <> 0) then
                            BEGIN
                            if (TIPO = 41) then
                                SELECT NDCL_DTOFMONTO, NDCL_FECHADTO, NDCL_TRM FROM NOTAS_DEBITO_CLIENTES
                                    WHERE NDCL_ID = :ID INTO :PDTOF, :FECDTO, :TRM;
                            if (TIPO = 42) then
                                SELECT 0, NCCL_FECHA, 1 FROM NOTAS_CREDITO_CLIENTES
                                    WHERE NCCL_ID = :ID INTO :PDTOF, :FECDTO, :TRM;
                            if (TIPO = 45) then
                                SELECT ANCL_DTOFMONTO, ANCL_DTOFECHA, ANCL_TRM FROM ANTICIPOS_CLIENTE
                                    WHERE ANCL_ID = :ID INTO :PDTOF, :FECDTO, :TRM;
                            if (TIPO = 31) then
                                SELECT FACT_DTOFMONTO, FACT_DTOFFECHA, FACT_TRM FROM FACTURAS
                                    WHERE FACT_ID = :ID INTO :PDTOF, :FECDTO, :TRM;
                            if (TIPO = 33) then
                                SELECT 0, DEVT_FECHA, 1 FROM devoluciones_ventas
                                    WHERE DEVT_ID = :ID INTO :PDTOF, :FECDTO, :TRM;
                            if (PDTOF IS NULL) then
                                PDTOF = 0;
                            if ((MONEDA <> 0) AND (TRM <> 0)) then
                                PDTOF = PDTOF / TRM;
                            if (PDTOF <> 0) then
                                BEGIN
                                SELECT SUM(RCDE_DTOF), MAX(RECA_TRM) FROM RECIBOS_CAJA_DETALLE D, RECIBOS_CAJA R
                                    WHERE R.reca_id = D.reca_id AND RCDE_IDDOC = :ID AND RCDE_TIPODOC = :TIPO INTO :DTOAPL, :TRM;
                                if (DTOAPL IS NULL) then
                                    DTOAPL = 0;
                                if ((MONEDA <> 0) AND (TRM <> 0)) then
                                   DTOAPL = DTOAPL / TRM;
                                PDTOF = PDTOF - DTOAPL;
                                /* SI YA SE VENCIO DEJELO EN CERO */
                                if (FECDTO < FECHA) then
                                    PDTOF = 0;
                                END
                            if (MONEDA = 0) then
                                SELECT SUM(SDCA_RTFTE - SDCA_ABRTFTE), SUM(SDCA_RTIVA - SDCA_ABRTIVA), SUM(SDCA_RTICA - SDCA_ABRTICA)
                                    FROM SALDOS_DOC_CARTERA WHERE SDCA_TIPOREF = :TIPO AND SDCA_IDREF = :ID
                                    INTO :PRTFTE, :PRTIVA, :PRTICA;
                            ELSE
                                SELECT SUM((SDCA_RTFTE - SDCA_ABRTFTE)/SDCA_TRM), SUM((SDCA_RTIVA - SDCA_ABRTIVA)/SDCA_TRM), SUM((SDCA_RTICA - SDCA_ABRTICA)/SDCA_TRM)
                                    FROM SALDOS_DOC_CARTERA WHERE SDCA_TIPOREF = :TIPO AND SDCA_IDREF = :ID
                                    INTO :PRTFTE, :PRTIVA, :PRTICA;
                            if (PRTFTE IS NULL) then
                                PRTFTE = 0;
                            if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) THEN
                                BEGIN
                                if (PRTFTE > 0) then
                                    PRTFTE = 0;
                                END
                            ELSE
                                BEGIN
                                if (PRTFTE < 0) then
                                    PRTFTE = 0;
                                END
                            if (PRTIVA IS NULL) then
                                PRTIVA = 0;
                            if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) THEN
                                BEGIN
                                if (PRTIVA > 0) then
                                    PRTIVA = 0;
                                END
                            ELSE
                                BEGIN
                                if (PRTIVA < 0) then
                                    PRTIVA = 0;
                                END
                            if (PRTICA IS NULL) then
                                PRTICA = 0;
                            if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) THEN
                                BEGIN
                                if (PRTICA > 0) then
                                    PRTICA = 0;
                                END
                            ELSE
                                BEGIN
                                if (PRTICA < 0) then
                                    PRTICA = 0;
                                END
                            if (FAUTORET <= FECDOC) then
                                PRTFTE = 0;
                            SALDO = SALDO + PSALDO;
                            RTFTE = RTFTE + PRTFTE;
                            RTIVA = RTIVA + PRTIVA;
                            RTICA = RTICA + PRTICA;
                            DTOF = DTOF + PDTOF;
                            END /* SALDO <> 0 */
                        END  /* NO ANTICIPO */
                    END
                DISPONIBLE = CUPO - SALDO;
                /* LOS RECIBOS PROVISIONALES */
                SELECT SUM(RPDE_ABONO), MAX(RCPR_TRM) FROM RECIBO_PROVISIONAL P, recibo_provisional_detalle D
                    WHERE P.rcpr_id = D.rcpr_id AND TERC_NIT = :NIT AND RPDE_SUCURSAL = :SUCURSAL AND ((:MONEDA = 0) or (RCPR_TRM <> 1)) AND
                    VEND_COD = :CODCOBR AND RCPR_FECHA <= :FECHA AND RCPR_ANULADO = 'N' AND ((RCPR_FECCRUCE IS NULL) or (RCPR_FECCRUCE > :FECHA)) AND 
                    ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                    INTO :provisional, :TRM;
                if ((MONEDA <> 0) AND (TRM <> 0)) then
                    PROVISIONAL = PROVISIONAL / TRM;
                if (:descnt_prov = 'SI') then
                   if (NOT :provisional IS NULL) then
                    SALDO = :saldo - :PROVISIONAL;
                if (AUTORET = 'SI') then
                    BEGIN
                    RTFTE = 0;
                    RTIVA = 0;
                    RTICA = 0;
                    END
                SUSPEND;
                END  /* OK = S */
            END  /* FOR COBRADOR */
        END  /* AGRUPA = C */
    END  /* FOR NIT */
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure REP_CARTERA_NOTAS (
    DESDE varchar(20),
    HASTA varchar(20),
    GRPINI varchar(5),
    GRPFIN varchar(5),
    FECHA date,
    ORDEN char(1),
    AGRUPA char(1),
    SUBEMPRESA integer,
    VENCEINI date,
    VENCEFIN date,
    GRUPCART integer,
    MONEDA integer)
returns (
    NIT varchar(20),
    NOMBRE varchar(60),
    TELEFONO varchar(40),
    CIUDAD varchar(40),
    CODZONA varchar(2),
    NOMZONA varchar(60),
    CODCOBR integer,
    NOMCOBR varchar(60),
    SUCURSAL varchar(10),
    DV char(1),
    DIR varchar(60),
    CONTACTO varchar(60),
    EMAIL varchar(100),
    MAILCART varchar(100),
    FAX varchar(25),
    CEL varchar(25),
    CODCLI varchar(20),
    CODCIUD char(5),
    NOMCIUD varchar(60),
    SALDO numeric(18,2),
    NOTA1 varchar(256),
    NOTA2 varchar(256),
    CUPO numeric(18,2),
    DISPONIBLE numeric(18,2),
    PROVISIONAL numeric(18,2),
    ESTADO char(1),
    RESALTAR char(1),
    INSTCART varchar(255),
    GRUPCOD integer,
    GRUPNOM varchar(30),
    TOTCLI numeric(18,2))
AS
declare variable NITINI VARCHAR(20);
declare variable NITFIN VARCHAR(20);
declare variable NOMINI VARCHAR(20);
declare variable NOMFIN VARCHAR(20);
declare variable OK CHAR(1);
declare variable PSALDO NUMERIC(18,2);
declare variable TIPO INTEGER;
declare variable ID INTEGER;
declare variable NOTA VARCHAR(277);
declare variable TIPODOC VARCHAR(8);
declare variable NUMDOC VARCHAR(10);
declare variable FECNOTA VARCHAR(10);
declare variable I INTEGER;
declare variable INCLANTI CHAR(2);
declare variable TRM NUMERIC(18,2);
BEGIN
if (ORDEN = 'C') then
    BEGIN
    NITINI = DESDE;
    NITFIN = HASTA;
    NOMINI = '';
    NOMFIN = 'zz';
    END
ELSE
    BEGIN
    NOMINI = DESDE;
    NOMFIN = HASTA;
    NITINI = '';
    NITFIN = 'zz';
    END
  EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'INCLUIR ANTICIPOS DE CLIENTES EN REPORTES Y CONSULTAS DE CARTERA') returning_values (INCLANTI);
  /* Ubique el NIT */
  FOR select T.TERC_NIT, CLSU_NOMBRE, TERC_DV, CLSU_TEL, CLSU_CIUDAD, TERC_CONTACTO, S.COBR_COD, S.ZONA_COD, CIUD_COD, CLIE_CUPO, CLIE_ESTADO, CLCU_COD, C.GRCA_COD, CLIE_RESALTAR, CLIE_INSTCARTERA, TERC_DIR, TERC_EMAIL, TERC_FAX, TERC_CEL, CLIE_MAILCART, CLIE_COD
    from terceros T, CLIENTES C, CLIENTE_SUCURSALES S
    where C.TERC_NIT = T.TERC_NIT AND TERC_CLIE = 'S' AND S.TERC_NIT = C.TERC_NIT AND T.TERC_NIT >= :NITINI AND T.TERC_NIT <= :NITFIN AND
        TERC_NOM >= :NOMINI AND TERC_NOM <= :NOMFIN AND ((:GRUPCART = 0) or (C.GRCA_COD = :GRUPCART))
    INTO :NIT, :NOMBRE, :DV, :TELEFONO, :CIUDAD, :CONTACTO, :CODCOBR, :CODZONA, :CODCIUD, :CUPO, :ESTADO, :SUCURSAL, :GRUPCOD, :RESALTAR, INSTCART, :DIR, :EMAIL, :FAX, :CEL, :MAILCART, :CODCLI
    DO  
    BEGIN
    TOTCLI = 0;
    GRUPNOM = '';
    SELECT GRCA_NOMBRE FROM GRUPO_CARTERA WHERE GRCA_COD = :GRUPCOD INTO :GRUPNOM;
    OK = 'N';
    if (AGRUPA = 'Z') then
        BEGIN
        if (GRPINI = '') then
            BEGIN
            if ((CODZONA IS NULL) or (CODZONA >= :GRPINI AND CODZONA <= :GRPFIN)) then
                OK = 'S';
            END
        ELSE
            if (CODZONA >= :GRPINI AND CODZONA <= :GRPFIN) then
                OK = 'S';
        END
    if (AGRUPA = 'I') then
        BEGIN
        if (GRPINI = '') then
            BEGIN
            if ((CODCIUD IS NULL) or (CODCIUD >= :GRPINI AND CODCIUD <= :GRPFIN)) then
                OK = 'S';
            END
        ELSE
            if (CODCIUD >= :GRPINI AND CODCIUD <= :GRPFIN) then
                OK = 'S';
        END
    if (AGRUPA = 'N') then
        OK = 'S';
        
    if (OK = 'S') then
        BEGIN
        if (CODCOBR IS NOT NULL) then
            SELECT COBR_NOM FROM COBRADORES  WHERE COBR_COD = :CODCOBR INTO :NOMCOBR;
        if (CODZONA IS NOT NULL) then
            SELECT ZONA_NOM FROM ZONAS WHERE ZONA_COD = :CODZONA INTO :NOMZONA;
        if (CODCIUD IS NOT NULL) then
            SELECT CIUD_NOM FROM CIUDADES  WHERE CIUD_COD = :CODCIUD INTO :NOMCIUD;
    
        SALDO = 0;
        /* BUSQUE EN SALDOS_DOC_CARTERA LOS QUE TENGAN SALDO > 0 */
        FOR SELECT MVCL_TIPOREF, MVCL_IDREF
          FROM MOVIMIENTO_CLIENTES WHERE TERC_NIT = :NIT AND MVCL_SUCURSAL = :SUCURSAL AND MVCL_FECHA <= :FECHA AND
          MVCL_ABONO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) AND MVCL_VENCE >= :VENCEINI AND
          MVCL_VENCE <= :VENCEFIN AND ((:MONEDA = 0) or (MVCL_TRM <> 1))
          INTO :TIPO, :ID
          DO
            if ((inclanti = 'SI') or (TIPO <> 45)) then
                BEGIN
                EXECUTE PROCEDURE saldo_doc_cartera(TIPO, ID, FECHA, MONEDA) returning_values (PSALDO);
                if (PSALDO <> 0) then
                    SALDO = SALDO + PSALDO;
                END
        DISPONIBLE = CUPO - SALDO;
        /* LOS RECIBOS PROVISIONALES */
        SELECT SUM(RPDE_ABONO), MAX(RCPR_TRM) FROM RECIBO_PROVISIONAL P, recibo_provisional_detalle D
            WHERE P.rcpr_id = D.rcpr_id AND TERC_NIT = :NIT AND RPDE_SUCURSAL = :SUCURSAL AND ((:MONEDA = 0) or (RCPR_TRM <> 1)) AND
            RCPR_FECHA <= :FECHA AND RCPR_ANULADO = 'N' AND ((RCPR_FECCRUCE IS NULL) or (RCPR_FECCRUCE > :FECHA)) AND
            ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            INTO :provisional, :TRM;
        if ((MONEDA <> 0) AND (TRM <> 0)) then
            PROVISIONAL = PROVISIONAL / TRM;
        /* LAS NOTAS DE CLIENTES */
        I = 0;
        NOTA1 = '';
        NOTA2 = '';
        FOR SELECT CAST(NOCL_FECHA AS VARCHAR(10)), tido_nomcorto, NOCL_NUMDOC, NOCL_TEXTO
            FROM NOTAS_CLIENTES N, TIPO_DOCUMENTO T WHERE N.NOCL_TIPODOC = T.TIDO_COD AND TERC_NIT = :NIT
            AND N.TINO_COD = 3 AND N.CLSU_COD = :SUCURSAL
            ORDER BY NOCL_ID DESC INTO :FECNOTA, :TIPODOC, :NUMDOC, :NOTA
            DO
            BEGIN
            if (I = 0) then
                NOTA1 = NOTA;
            if (I = 1) then
                NOTA2 = NOTA;
            I = I + 1;
            END
        TOTCLI = TOTCLI + SALDO;
        SUSPEND;
        END
    if (AGRUPA = 'C') then
        BEGIN
        if (CODZONA IS NOT NULL) then
            SELECT ZONA_NOM FROM ZONAS WHERE ZONA_COD = :CODZONA INTO :NOMZONA;
        if (CODCIUD IS NOT NULL) then
            SELECT CIUD_NOM FROM CIUDADES  WHERE CIUD_COD = :CODCIUD INTO :NOMCIUD;
        FOR SELECT DISTINCT COBR_COD FROM MOVIMIENTO_CLIENTES WHERE TERC_NIT = :NIT AND
            MVCL_SUCURSAL = :SUCURSAL AND MVCL_FECHA <= :FECHA AND
            MVCL_ABONO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) AND MVCL_VENCE >= :VENCEINI AND MVCL_VENCE <= :VENCEFIN
            INTO :codcobr
            DO
            begin
            OK = 'N';
            if (GRPINI = '') then
                BEGIN
                if ((CODCOBR IS NULL) or (CODCOBR >= :GRPINI AND CODCOBR <= :GRPFIN)) then
                    OK = 'S';
                END
            ELSE
                if (CODCOBR >= :GRPINI AND CODCOBR <= :GRPFIN) then
                    OK = 'S';
            if (OK = 'S') then
                BEGIN
                SELECT COBR_NOM FROM COBRADORES  WHERE COBR_COD = :CODCOBR INTO :NOMCOBR;

                SALDO = 0;
                /* BUSQUE EN SALDOS_DOC_CARTERA LOS QUE TENGAN SALDO > 0 */
                FOR SELECT MVCL_TIPOREF, MVCL_IDREF
                  FROM MOVIMIENTO_CLIENTES WHERE TERC_NIT = :NIT AND MVCL_SUCURSAL = :SUCURSAL AND
                  MVCL_FECHA <= :FECHA AND COBR_COD = :codcobr AND MVCL_ABONO = 'N' AND
                  ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) AND MVCL_VENCE >= :VENCEINI AND
                  MVCL_VENCE <= :VENCEFIN AND ((:MONEDA = 0) or (MVCL_TRM <> 1))
                  INTO :TIPO, :ID
                  DO
                    if ((inclanti = 'SI') or (TIPO <> 45)) then
                        BEGIN
                        EXECUTE PROCEDURE saldo_doc_cartera(TIPO, ID, FECHA, MONEDA) returning_values (PSALDO);
                        if (PSALDO <> 0) then
                            BEGIN
                            SALDO = SALDO + PSALDO;
                            END
                        END
                DISPONIBLE = CUPO - SALDO;
                /* LOS RECIBOS PROVISIONALES */
                SELECT SUM(RPDE_ABONO), MAX(RCPR_TRM) FROM RECIBO_PROVISIONAL P, recibo_provisional_detalle D
                    WHERE P.rcpr_id = D.rcpr_id AND TERC_NIT = :NIT AND RPDE_SUCURSAL = :SUCURSAL AND ((:MONEDA = 0) or (RCPR_TRM <> 1)) AND
                    VEND_COD = :CODCOBR AND RCPR_FECHA <= :FECHA AND RCPR_ANULADO = 'N' AND ((RCPR_FECCRUCE IS NULL) or (RCPR_FECCRUCE > :FECHA)) AND
                    ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                    INTO :provisional, :TRM;
                if ((MONEDA <> 0) AND (TRM <> 0)) then
                    PROVISIONAL = PROVISIONAL / TRM;
                /* LAS NOTAS DE CLIENTES */
                I = 0;
                NOTA1 = '';
                NOTA2 = '';
                FOR SELECT CAST(NOCL_FECHA AS VARCHAR(10)), tido_nomcorto, NOCL_NUMDOC, NOCL_TEXTO
                    FROM NOTAS_CLIENTES N, TIPO_DOCUMENTO T WHERE N.NOCL_TIPODOC = T.TIDO_COD AND TERC_NIT = :NIT
                    AND N.TINO_COD = 3 AND N.CLSU_COD = :SUCURSAL
                    ORDER BY NOCL_FECHA DESC INTO :FECNOTA, :TIPODOC, :NUMDOC, :NOTA
                    DO
                    BEGIN
                    if (I = 0) then
                        NOTA1 = NOTA;
                    if (I = 1) then
                        NOTA2 = NOTA;
                    I = I + 1;
                    END
                TOTCLI = TOTCLI + SALDO;
                SUSPEND;
                END  /* OK = S */
            END  /* FOR COBRADOR */
        END  /* AGRUPA = C */
    END  /* FOR NIT */
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure REP_ANALISIS_CARTERA (
    DESDE varchar(20),
    HASTA varchar(20),
    GRPINI varchar(5),
    GRPFIN varchar(5),
    FECHA date,
    DETALLE char(1),
    ORDEN char(1),
    AGRUPA char(1),
    DIASR integer,
    SUBEMPRESA integer,
    GRUPCART integer,
    EXTENDIDA char(1),
    MONEDA integer)
returns (
    NIT varchar(20),
    NOMBRE varchar(60),
    TELEFONO varchar(40),
    CIUDAD varchar(40),
    CONTACTO varchar(60),
    EMAIL varchar(100),
    MAILCART varchar(100),
    FAX varchar(25),
    CEL varchar(25),
    CODCLI varchar(20),
    CODZONA varchar(2),
    NOMZONA varchar(60),
    CODCOBR integer,
    NOMCOBR varchar(60),
    DV char(1),
    CODCIUD char(5),
    NOMCIUD varchar(60),
    SUCURSAL varchar(10),
    NOMSUC varchar(60),
    RESALTAR char(1),
    INSTCART varchar(255),
    TIPO integer,
    ID integer,
    PREFIJO varchar(4),
    NUMERO varchar(6),
    DIAS integer,
    SALDO numeric(18,2),
    CORRIENTE numeric(18,2),
    CERO numeric(18,2),
    TREINTA numeric(18,2),
    SESENTA numeric(18,2),
    NOVENTA numeric(18,2),
    CIENTOCHENTA numeric(18,2),
    DOSSETENTA numeric(18,2),
    TRESSESENTA numeric(18,2),
    PROVISIONAL numeric(18,2),
    TIPONOM varchar(8),
    FECDOC date,
    VENCE date,
    CUPO numeric(18,2),
    DISPONIBLE numeric(18,2),
    OBS blob sub_type 0 segment size 80,
    GRUPCOD integer,
    DIA_CAR integer,
    GRUPNOM varchar(30))
AS
DECLARE VARIABLE NITINI VARCHAR(20);
DECLARE VARIABLE NITFIN VARCHAR(20);
DECLARE VARIABLE NOMINI VARCHAR(20);
DECLARE VARIABLE NOMFIN VARCHAR(20);
DECLARE VARIABLE RTFTE NUMERIC(18,2);
DECLARE VARIABLE RTIVA NUMERIC(18,2);
DECLARE VARIABLE RTICA NUMERIC(18,2);
DECLARE VARIABLE VENCIMIENTO VARCHAR(12);
DECLARE VARIABLE OK CHAR(1);
declare variable AUTORET VARCHAR(10);
declare variable FAUTORET DATE;
declare variable INCLANTI CHAR(2);
declare variable descnt_prov char(2);
declare variable MAXDIAS INTEGER;
DECLARE VARIABLE TRM NUMERIC(18,2);
BEGIN
if (ORDEN = 'C') then
    BEGIN
    NITINI = DESDE;
    NITFIN = HASTA;
    NOMINI = '';
    NOMFIN = 'zz';
    END
ELSE
    BEGIN
    NOMINI = DESDE;
    NOMFIN = HASTA;
    NITINI = '';
    NITFIN = 'zz';
    END
/* Ubique el NIT */
EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'FECHA AUTORETENEDOR NO DESCONTAR RETENCIONES DEL SALDO PERO SI CONTABILIZARLAS') returning_values (AUTORET);
if (AUTORET <> '') then
    FAUTORET = CAST(AUTORET AS DATE);
else
    FAUTORET = '9999/12/31';
EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'ANALISIS DE CARTERA CON FECHA FACTURA O VENCIMIENTO') returning_values (VENCIMIENTO);
EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'INCLUIR ANTICIPOS DE CLIENTES EN REPORTES Y CONSULTAS DE CARTERA') returning_values (INCLANTI);
EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'DESCONTAR RECIBOS PROVISIONALES EN INFORMES DE CARTERA') RETURNING_VALUES (:descnt_prov);

FOR select T.TERC_NIT, TERC_NOM, TERC_DV, CLSU_TEL, CLSU_CIUDAD, S.COBR_COD, S.ZONA_COD, T.CIUD_COD, CLIE_CUPO, CLIE_DIAS, CLCU_COD, CLSU_NOMBRE, t.terc_obs, C.GRCA_COD, TERC_CONTACTO, TERC_EMAIL, TERC_FAX, TERC_CEL, CLIE_COD, CLIE_RESALTAR, CLIE_INSTCARTERA, CLIE_MAILCART
    from terceros T, CLIENTES C, CLIENTE_SUCURSALES S
    where C.TERC_NIT = T.TERC_NIT AND TERC_CLIE = 'S' AND S.TERC_NIT = C.TERC_NIT and T.TERC_NIT >= :NITINI AND T.TERC_NIT <= :NITFIN AND
        T.TERC_NOM >= :NOMINI AND T.TERC_NOM <= :NOMFIN AND ((:GRUPCART = 0) or (C.GRCA_COD = :GRUPCART))
    INTO :NIT, :NOMBRE, :DV, :TELEFONO, :CIUDAD, :CODCOBR, :CODZONA, :CODCIUD, :CUPO, :DIA_CAR,  :SUCURSAL, :NOMSUC, :obs, :GRUPCOD, :CONTACTO, :EMAIL, :FAX, :CEL, :CODCLI, :RESALTAR, INSTCART, :MAILCART
    DO  
    BEGIN
    SELECT COBR_NOM FROM COBRADORES CB WHERE COBR_COD = :CODCOBR INTO :NOMCOBR;
    SELECT ZONA_NOM FROM ZONAS Z WHERE ZONA_COD = :CODZONA INTO :NOMZONA;
    SELECT CIUD_NOM FROM CIUDADES WHERE CIUD_COD = :CODCIUD INTO :NOMCIUD;
    SELECT GRCA_NOMBRE FROM GRUPO_CARTERA WHERE GRCA_COD = :GRUPCOD INTO :GRUPNOM;
    provisional = 0;
    MAXDIAS = 0;
    OK = 'N';
    if (AGRUPA = 'Z') then
        BEGIN
        if (GRPINI = '') then
            BEGIN
            if ((CODZONA IS NULL) or (CODZONA >= :GRPINI AND CODZONA <= :GRPFIN)) then
                OK = 'S';
            END
        ELSE
            if (CODZONA >= :GRPINI AND CODZONA <= :GRPFIN) then
                OK = 'S';
        END
    if (AGRUPA = 'I') then
        BEGIN
        if (GRPINI = '') then
            BEGIN
            if ((CODCIUD IS NULL) or (CODCIUD >= :GRPINI AND CODCIUD <= :GRPFIN)) then
                OK = 'S';
            END
        ELSE
            if (CODCIUD >= :GRPINI AND CODCIUD <= :GRPFIN) then
                OK = 'S';
        END
    if (AGRUPA = 'N') then
        OK = 'S';
    if (OK = 'S') then
        BEGIN
        DISPONIBLE = CUPO;
        CORRIENTE = 0;
        CERO = 0;
        TREINTA = 0;
        SESENTA = 0;
        NOVENTA = 0;
        CIENTOCHENTA = 0;
        DOSSETENTA = 0;
        TRESSESENTA = 0;
        /* BUSQUE EN SALDOS_DOC_CARTERA LOS QUE TENGAN SALDO > 0 */
        FOR SELECT MVCL_TIPOREF, MVCL_IDREF, MVCL_PREFREF, MVCL_NUMREF, MVCL_FECHA, MVCL_VENCE
            FROM MOVIMIENTO_CLIENTES
            WHERE TERC_NIT = :NIT AND MVCL_SUCURSAL = :SUCURSAL AND MVCL_FECHA <= :FECHA
                AND MVCL_ABONO = 'N' AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA)) AND
                ((:MONEDA = 0) or (MVCL_TRM <> 1))
            INTO :TIPO, :ID, :PREFIJO, :NUMERO, :FECDOC, :VENCE
            DO
            BEGIN
            if ((inclanti = 'SI') or (TIPO <> 45)) then
                BEGIN
                EXECUTE PROCEDURE saldo_doc_cartera(TIPO, ID, FECHA, MONEDA) returning_values (SALDO);
                if (SALDO <> 0) then
                    BEGIN
                    DISPONIBLE = DISPONIBLE - SALDO;
                    SELECT TIDO_NOMCORTO FROM TIPO_DOCUMENTO WHERE TIDO_COD = :TIPO INTO :TIPONOM;

                    if (MONEDA = 0) then
                        SELECT SUM(SDCA_RTFTE - SDCA_ABRTFTE), SUM(SDCA_RTIVA - SDCA_ABRTIVA), SUM(SDCA_RTICA - SDCA_ABRTICA)
                            FROM SALDOS_DOC_CARTERA WHERE SDCA_TIPOREF = :TIPO AND SDCA_IDREF = :ID
                            INTO :RTFTE, :RTIVA, :RTICA;
                    ELSE
                        SELECT SUM((SDCA_RTFTE - SDCA_ABRTFTE)/SDCA_TRM), SUM((SDCA_RTIVA - SDCA_ABRTIVA)/SDCA_TRM), SUM((SDCA_RTICA - SDCA_ABRTICA)/SDCA_TRM)
                            FROM SALDOS_DOC_CARTERA WHERE SDCA_TIPOREF = :TIPO AND SDCA_IDREF = :ID
                            INTO :RTFTE, :RTIVA, :RTICA;
                    if (RTFTE IS NULL) then
                        RTFTE = 0;
                    if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) THEN
                        BEGIN
                        if (RTFTE > 0) then
                            RTFTE = 0;
                        END
                    ELSE
                        BEGIN
                        if (RTFTE < 0) then
                            RTFTE = 0;
                        END
                    if (FAUTORET <= FECDOC) then
                        RTFTE = 0;
                    if (RTIVA IS NULL) then
                        RTIVA = 0;
                    if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) THEN
                        BEGIN
                        if (RTIVA > 0) then
                            RTIVA = 0;
                        END
                    ELSE
                        BEGIN
                        if (RTIVA < 0) then
                            RTIVA = 0;
                        END
                    if (RTICA IS NULL) then
                        RTICA = 0;
                    if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) THEN
                        BEGIN
                        if (RTICA > 0) then
                            RTICA = 0;
                        END
                    ELSE
                        BEGIN
                        if (RTICA < 0) then
                            RTICA = 0;
                        END
                    /* AHORA CLASIFIQUE LOS DIAS */
                    if (VENCIMIENTO = 'FECHA') then
                        DIAS = FECHA - FECDOC;
                    ELSE
                        DIAS = FECHA - VENCE;
                    if (MAXDIAS < DIAS) then
                        MAXDIAS = DIAS;
                    if (DETALLE = 'S') then
                        BEGIN
                        CORRIENTE = 0;
                        CERO = 0;
                        TREINTA = 0;
                        SESENTA = 0;
                        NOVENTA = 0;
                        CIENTOCHENTA = 0;
                        DOSSETENTA = 0;
                        tressesenta = 0;
                        END
                    if (DIAS < 0) then
                        CORRIENTE = CORRIENTE + SALDO;
                    ELSE
                        if (DIAS < DIASR) then
                            CERO = CERO + SALDO;
                        ELSE
                            if (DIAS < (DIASR * 2)) then
                                TREINTA = TREINTA + SALDO;
                            ELSE
                                if (DIAS < (DIASR * 3)) then
                                    SESENTA = SESENTA + SALDO;
                                ELSE
                                    BEGIN
                                    if (EXTENDIDA = 'N') then
                                        NOVENTA = NOVENTA + SALDO;
                                    else    
                                        BEGIN
                                        if (DIAS < (DIASR * 3) * 2) then
                                            NOVENTA = NOVENTA + SALDO;
                                        ELSE
                                            if (DIAS < (DIASR * 3) * 3) then
                                                CIENTOCHENTA = CIENTOCHENTA + SALDO;
                                            ELSE
                                                if (DIAS < (DIASR * 3) * 4) then
                                                    dossetenta = dossetenta + SALDO;
                                                ELSE
                                                    tressesenta = tressesenta + SALDO;
                                        END
                                    END
                    if (DETALLE = 'S') then
                        SUSPEND;
                    END  /* SALDO */
                END  /* NO ANTICIPO */
            END  /* FOR MOV_CLI */
        /* AGREGUE LOS RECIBOS PROVISIONALES CON SIGNO NEGATIVO */
        FOR SELECT 65, MAX(P.RCPR_ID), MAX(PREF_PRE), MAX(RCPR_NUMERO), MAX(RCPR_FECHA), SUM(RPDE_ABONO* -1), SUM(RPDE_RTFTE*-1), SUM(RPDE_RTIVA*-1), SUM(RPDE_RTICA*-1), MAX(RCPR_TRM)
            FROM RECIBO_PROVISIONAL P, recibo_provisional_detalle D
            WHERE P.rcpr_id = D.rcpr_id AND P.TERC_NIT = :NIT AND D.RPDE_SUCURSAL = :SUCURSAL AND P.RCPR_FECHA <= :FECHA AND P.RCPR_ANULADO = 'N' AND
            ((RCPR_FECCRUCE IS NULL) or (RCPR_FECCRUCE > :FECHA)) AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA)) AND ((:MONEDA = 0) or (RCPR_TRM <> 1))
            GROUP BY P.rcpr_id
            INTO :TIPO, :ID, :PREFIJO, :NUMERO, :FECDOC, :PROVISIONAL, :rtfte,  :RTIVA, :RTICA, :TRM
            DO
            BEGIN
            if ((MONEDA <> 0) AND (TRM <> 0)) then
                BEGIN
                PROVISIONAL = PROVISIONAL / TRM;
                RTFTE = RTFTE / TRM;
                RTIVA = RTIVA / TRM;
                RTICA = RTICA / TRM;
                END
            if (:descnt_prov = 'NO') then
              SALDO = 0;
            else
              SALDO = :PROVISIONAL;
            SELECT TIDO_NOMCORTO FROM TIPO_DOCUMENTO WHERE TIDO_COD = :TIPO INTO :TIPONOM;
            /* CALCULE EL VENCIMIENTO DEL ULTIMO DOCUMENTO POSFECHADO */
            SELECT MAX(RPPA_FECHA) FROM recibo_provisional_pago WHERE RCPR_ID = :ID INTO :VENCE;
            DIAS = VENCE - FECHA;
            if (DETALLE = 'S') then
                BEGIN
                CORRIENTE = 0;
                CERO = 0;
                TREINTA = 0;
                SESENTA = 0;
                NOVENTA = 0;
                CIENTOCHENTA = 0;
                DOSSETENTA = 0;
                tressesenta = 0;
                END
            if (DIAS < 0) then
                CORRIENTE = CORRIENTE + SALDO;
            ELSE
                if (DIAS < DIASR) then
                    CERO = CERO + SALDO;
                ELSE
                    if (DIAS < (DIASR * 2)) then
                        TREINTA = TREINTA + SALDO;
                    ELSE
                        if (DIAS < (DIASR * 3)) then
                            SESENTA = SESENTA + SALDO;
                        ELSE
                            BEGIN
                            if (EXTENDIDA = 'N') then
                                NOVENTA = NOVENTA + SALDO;
                            else
                                BEGIN
                                if (DIAS < (DIASR * 3) * 2) then
                                    NOVENTA = NOVENTA + SALDO;
                                ELSE
                                    if (DIAS < (DIASR * 3) * 3) then
                                        CIENTOCHENTA = CIENTOCHENTA + SALDO;
                                    ELSE
                                        if (DIAS < (DIASR * 3) * 4) then
                                            dossetenta = dossetenta + SALDO;
                                        ELSE
                                            tressesenta = tressesenta + SALDO;
                                END
                            END
            if (DETALLE = 'S') then
                SUSPEND;
            END
        if (DETALLE = 'N') then
            begin
            SALDO = CORRIENTE + CERO + TREINTA + SESENTA + NOVENTA + cientochenta + dossetenta + tressesenta;
            DIAS = MAXDIAS;
            SUSPEND;
            end
        END
    if (AGRUPA = 'C') then
        BEGIN
        FOR SELECT DISTINCT COBR_COD FROM MOVIMIENTO_CLIENTES
            WHERE TERC_NIT = :NIT AND MVCL_SUCURSAL = :SUCURSAL AND MVCL_FECHA <= :FECHA
                AND MVCL_ABONO = 'N' AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA)) AND
                ((:MONEDA = 0) or (MVCL_TRM <> 1))
            INTO :codcobr
            DO
            BEGIN
            OK = 'N';
            if (GRPINI = '') then
                BEGIN
                if ((CODCOBR IS NULL) or (CODCOBR >= :GRPINI AND CODCOBR <= :GRPFIN)) then
                    OK = 'S';
                END
            ELSE
                if (CODCOBR >= :GRPINI AND CODCOBR <= :GRPFIN) then
                    OK = 'S';
            if (OK = 'S') then
                BEGIN
                DISPONIBLE = CUPO;
                CORRIENTE = 0;
                CERO = 0;
                TREINTA = 0;
                SESENTA = 0;
                NOVENTA = 0;
                CIENTOCHENTA = 0;
                DOSSETENTA = 0;
                tressesenta = 0;
                SELECT COBR_NOM FROM COBRADORES WHERE COBR_COD = :codcobr INTO :nomcobr;
                /* BUSQUE EN SALDOS_DOC_CARTERA LOS QUE TENGAN SALDO > 0 */
                FOR SELECT MVCL_TIPOREF, MVCL_IDREF, MVCL_PREFREF, MVCL_NUMREF, MVCL_FECHA, MVCL_VENCE
                    FROM MOVIMIENTO_CLIENTES
                    WHERE TERC_NIT = :NIT AND COBR_COD = :CODCOBR AND MVCL_SUCURSAL = :SUCURSAL AND MVCL_FECHA <= :FECHA
                        AND MVCL_ABONO = 'N' AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA))
                    INTO :TIPO, :ID, :PREFIJO, :NUMERO, :FECDOC, :VENCE
                    DO
                    BEGIN
                    if ((inclanti = 'SI') or (TIPO <> 45)) then
                        BEGIN
                        EXECUTE PROCEDURE saldo_doc_cartera(TIPO, ID, FECHA, MONEDA) returning_values (SALDO);
                        if (SALDO <> 0) then
                            BEGIN
                            DISPONIBLE = DISPONIBLE - SALDO;
                            SELECT TIDO_NOMCORTO FROM TIPO_DOCUMENTO WHERE TIDO_COD = :TIPO INTO :TIPONOM;
                            if (MONEDA = 0) then
                                SELECT SUM(SDCA_RTFTE - SDCA_ABRTFTE), SUM(SDCA_RTIVA - SDCA_ABRTIVA), SUM(SDCA_RTICA - SDCA_ABRTICA)
                                    FROM SALDOS_DOC_CARTERA WHERE SDCA_TIPOREF = :TIPO AND SDCA_IDREF = :ID
                                    INTO :RTFTE, :RTIVA, :RTICA;
                            ELSE
                                SELECT SUM((SDCA_RTFTE - SDCA_ABRTFTE)/SDCA_TRM), SUM((SDCA_RTIVA - SDCA_ABRTIVA)/SDCA_TRM), SUM((SDCA_RTICA - SDCA_ABRTICA)/SDCA_TRM)
                                    FROM SALDOS_DOC_CARTERA WHERE SDCA_TIPOREF = :TIPO AND SDCA_IDREF = :ID
                                    INTO :RTFTE, :RTIVA, :RTICA;
                            if (RTFTE IS NULL) then
                                RTFTE = 0;
                            if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) THEN
                                BEGIN
                                if (RTFTE > 0) then
                                    RTFTE = 0;
                                END
                            ELSE
                                BEGIN
                                if (RTFTE < 0) then
                                    RTFTE = 0;
                                END
                            if (FAUTORET <= FECDOC) then
                                RTFTE = 0;
                            if (RTIVA IS NULL) then
                                RTIVA = 0;
                            if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) THEN
                                BEGIN
                                if (RTIVA > 0) then
                                    RTIVA = 0;
                                END
                            ELSE
                                BEGIN
                                if (RTIVA < 0) then
                                    RTIVA = 0;
                                END
                            if (RTICA IS NULL) then
                                RTICA = 0;
                            if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) THEN
                                BEGIN
                                if (RTICA > 0) then
                                    RTICA = 0;
                                END
                            ELSE
                                BEGIN
                                if (RTICA < 0) then
                                    RTICA = 0;
                                END
                            /* AHORA CLASIFIQUE LOS DIAS */
                            if (VENCIMIENTO = 'FECHA') then
                                DIAS = FECHA - FECDOC;
                            ELSE
                                DIAS = FECHA - VENCE;
                            if (MAXDIAS < DIAS) then
                                MAXDIAS = DIAS;
                            if (DETALLE = 'S') then
                                BEGIN
                                CORRIENTE = 0;
                                CERO = 0;
                                TREINTA = 0;
                                SESENTA = 0;
                                NOVENTA = 0;
                                CIENTOCHENTA = 0;
                                DOSSETENTA = 0;
                                tressesenta = 0;
                                END
                            if (DIAS < 0) then
                                CORRIENTE = CORRIENTE + SALDO;
                            ELSE
                                if (DIAS < DIASR) then
                                    CERO = CERO + SALDO;
                                ELSE
                                    if (DIAS < (DIASR * 2)) then
                                        TREINTA = TREINTA + SALDO;
                                    ELSE
                                        if (DIAS < (DIASR * 3)) then
                                            SESENTA = SESENTA + SALDO;
                                        ELSE
                                            BEGIN
                                            if (EXTENDIDA = 'N') then
                                                NOVENTA = NOVENTA + SALDO;
                                            else    
                                                BEGIN
                                                if (DIAS < (DIASR * 3) * 2) then
                                                    NOVENTA = NOVENTA + SALDO;
                                                ELSE
                                                    if (DIAS < (DIASR * 3) * 3) then
                                                        CIENTOCHENTA = CIENTOCHENTA + SALDO;
                                                    ELSE
                                                        if (DIAS < (DIASR * 3) * 4) then
                                                            dossetenta = dossetenta + SALDO;
                                                        ELSE
                                                            tressesenta = tressesenta + SALDO;
                                                END
                                            END
                            if (DETALLE = 'S') then
                                SUSPEND;
                            END  /* SALDO <>  0 */
                        END  /* NO ANTICIPO */
                    END  /* FOR MOV_CLI */
                /* AGREGUE LOS RECIBOS PROVISIONALES CON SIGNO NEGATIVO */
                FOR SELECT 65, MAX(P.RCPR_ID), MAX(PREF_PRE), MAX(RCPR_NUMERO), MAX(RCPR_FECHA), SUM(RPDE_ABONO * -1), SUM(RPDE_RTFTE*-1), SUM(RPDE_RTIVA*-1), SUM(RPDE_RTICA*-1), MAX(RCPR_TRM)
                    FROM RECIBO_PROVISIONAL P, recibo_provisional_detalle D
                    WHERE P.rcpr_id = D.rcpr_id AND P.TERC_NIT = :NIT AND RPDE_SUCURSAL = :SUCURSAL AND P.VEND_COD = :CODCOBR AND P.RCPR_FECHA <= :FECHA AND P.RCPR_ANULADO = 'N' AND
                    ((RCPR_FECCRUCE IS NULL) or (RCPR_FECCRUCE > :FECHA)) AND ((SUCU_ID = :SUBEMPRESA) OR (:SUBEMPRESA = 0)) AND ((:MONEDA = 0) or (RCPR_TRM <> 1))
                    GROUP BY P.rcpr_id
                    INTO :TIPO, :ID, :PREFIJO, :NUMERO, :FECDOC, :PROVISIONAL, :rtfte,  :RTIVA, :RTICA, :TRM
                    DO
                    BEGIN
                    if ((MONEDA <> 0) AND (TRM <> 0)) then
                        BEGIN
                        PROVISIONAL = PROVISIONAL / TRM;
                        RTFTE = RTFTE / TRM;
                        RTIVA = RTIVA / TRM;
                        RTICA = RTICA / TRM;
                        END
                    if (:descnt_prov = 'NO') then
                      SALDO = 0;
                    else
                      SALDO = :PROVISIONAL;
                    SELECT TIDO_NOMCORTO FROM TIPO_DOCUMENTO WHERE TIDO_COD = :TIPO INTO :TIPONOM;
                    /* CALCULE EL VENCIMIENTO DEL ULTIMO DOCUMENTO POSFECHADO */
                    SELECT MAX(RPPA_FECHA) FROM recibo_provisional_pago WHERE RCPR_ID = :ID INTO :VENCE;
                    DIAS = VENCE - FECHA;
                    if (DETALLE = 'S') then
                        BEGIN
                        CORRIENTE = 0;
                        CERO = 0;
                        TREINTA = 0;
                        SESENTA = 0;
                        NOVENTA = 0;
                        CIENTOCHENTA = 0;
                        DOSSETENTA = 0;
                        tressesenta = 0;
                        END
                    if (DIAS < 0) then
                        CORRIENTE = CORRIENTE + SALDO;
                    ELSE
                        if (DIAS < DIASR) then
                            CERO = CERO + SALDO;
                        ELSE
                            if (DIAS < (DIASR * 2)) then
                                TREINTA = TREINTA + SALDO;
                            ELSE
                                if (DIAS < (DIASR * 3)) then
                                    SESENTA = SESENTA + SALDO;
                                ELSE
                                    BEGIN
                                    if (EXTENDIDA = 'N') then
                                        NOVENTA = NOVENTA + SALDO;
                                    else    
                                        BEGIN
                                        if (DIAS < (DIASR * 3) * 2) then
                                            NOVENTA = NOVENTA + SALDO;
                                        ELSE
                                            if (DIAS < (DIASR * 3) * 3) then
                                                CIENTOCHENTA = CIENTOCHENTA + SALDO;
                                            ELSE
                                                if (DIAS < (DIASR * 3) * 4) then
                                                    dossetenta = dossetenta + SALDO;
                                                ELSE
                                                    tressesenta = tressesenta + SALDO;
                                        END
                                    END
                    if (DETALLE = 'S') then
                        SUSPEND;
                    END
                if (DETALLE = 'N') then
                    begin
                    SALDO = CORRIENTE + CERO + TREINTA + SESENTA + NOVENTA + cientochenta + dossetenta + tressesenta;
                    DIAS = MAXDIAS;
                    SUSPEND;
                    end
                END
            END  /* FOR COBRADOR */
        END
    END  /* FOR NIT */
END
^

SET TERM ; ^

/* 20101025 */
/* FACTOR INVENTARIO */

CREATE TABLE FACTOR_INVENTARIO (
    FAIN_FECINI  DATE NOT NULL,
    FAIN_FECFIN  DATE NOT NULL,
    FAIN_FACTOR  NUMERIC(9,4));

ALTER TABLE FACTOR_INVENTARIO ADD CONSTRAINT PK_FACTOR_INV PRIMARY KEY (FAIN_FECINI);

GRANT SELECT, INSERT, UPDATE, DELETE ON FACTOR_INVENTARIO TO PUBLIC;

SET TERM ^ ;

CREATE OR ALTER procedure EXISTENCIAS_DESDE_HASTA (
    FECHA date,
    ARTINI varchar(20),
    ARTFIN varchar(20),
    GRPINI varchar(3),
    GRPFIN varchar(3),
    BODINI varchar(2),
    BODFIN varchar(2),
    ORDEN char(1),
    AGRUPA char(1),
    DETALLE char(1),
    RESERVA char(1),
    ENPESO char(1),
    MASIVA char(1),
    SUCURSAL integer)
returns (
    CANT numeric(18,4),
    COSTO numeric(18,2),
    COSTO_LOTE numeric(18,2),
    CODIGO varchar(15),
    NOMBRE varchar(60),
    UNIDAD varchar(8),
    STAND varchar(20),
    CODGRUPO varchar(2),
    NOMGRUPO varchar(30),
    CODSUBG varchar(3),
    NOMSUBG varchar(30),
    CODMARC varchar(3),
    NOMMARC varchar(30),
    CODBOD varchar(2),
    LOTE varchar(15),
    NOMBOD varchar(30),
    COSTOTOT numeric(18,2),
    COSTOIVA numeric(18,2),
    ULTCOSTO numeric(18,2),
    FECHACOSTO date,
    CONSUMO numeric(18,2),
    RESERVADO numeric(18,4),
    ORDENADO numeric(18,4),
    IVA numeric(9,2),
    IVAMONTO numeric(18,2),
    PESOUNIT numeric(18,4),
    PESOTOTAL numeric(18,4),
    PRECIO numeric(18,2),
    CODBAR varchar(20))
AS
declare variable exist char(1);
declare variable codini varchar(20);
declare variable codfin varchar(20);
declare variable desini varchar(20);
declare variable desfin varchar(20);
declare variable ordenc numeric(18,4);
declare variable pedido numeric(18,4);
declare variable ok char(1);
declare variable id integer;
declare variable item integer;
declare variable und varchar(8);
declare variable factor numeric(18,4);
declare variable cant2 numeric(18,4);
declare variable PEDAUTO CHAR(2);
DECLARE VARIABLE LISTA INTEGER;
declare variable FACCOST NUMERIC(18,4);
BEGIN
EXECUTE PROCEDURE lee_configuracion ('FACTURACION','FACTURAS', 'CODIGO DE LA LISTA DE PRECIOS A MOSTRAR EN ARTICULOS') returning_values (:LISTA);
if (ORDEN = 'C') then
    BEGIN
    CODINI = ARTINI;
    CODFIN = ARTFIN;
    DESINI = '';
    DESFIN = 'zz';
    END
ELSE
    BEGIN
    DESINI = ARTINI;
    DESFIN = ARTFIN;
    CODINI = '';
    CODFIN = 'zz';
    END
EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION', 'FACTURAS', 'GENERAR PEDIDO AUTOMATICAMENTE CON LA FACTURA') returning_values (pedauto);
if (DETALLE = 'B') then
  BEGIN
  FOR SELECT ARTI_COD, ARTI_DES, ARTI_UNIDAD, ARTI_EXIST, TAIV_PORC, A.GRUP_COD, A.SUBG_COD, A.MARC_COD, BODE_COD, BODE_NOM, ARTI_CONSUMO, ARTI_PESO/1000
      FROM ARTICULO A, BODEGA B, TARIFA_IVA T
      WHERE ARTI_COD >= :CODINI AND ARTI_COD <= :CODFIN AND ARTI_DES >= :DESINI AND ARTI_DES <= :DESFIN AND ESAR_COD <> 'I' AND BODE_COD >= :BODINI AND
      BODE_COD <= :BODFIN AND ((SUCU_ID = :SUCURSAL) or (:SUCURSAL = 0)) AND A.TAIV_COD = T.TAIV_COD
      INTO :CODIGO, :NOMBRE, :UNIDAD, :EXIST, :IVA, :CODGRUPO, :CODSUBG, :CODMARC, :CODBOD, :NOMBOD, :CONSUMO, :pesounit
      DO
        BEGIN
        STAND = '';
        OK = 'N';
        if (AGRUPA = 'G') then
            BEGIN
            if ((CODGRUPO >= GRPINI) AND (CODGRUPO <= GRPFIN)) then
                OK = 'S';
            end
        ELSE
            if (AGRUPA = 'M') then
                BEGIN
                if ((CODMARC >= GRPINI) AND (CODMARC <= GRPFIN)) then
                    OK = 'S';
                END
        if (OK = 'S') then
            BEGIN
            NOMGRUPO = '';
            NOMMARC = '';
            NOMSUBG = '';
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            CODBAR = NULL;
            SELECT FIRST 1 COBA_COD FROM BARRAS_ARTICULO
                WHERE ARTI_COD = :codigo AND COBA_UNIDAD = :unidad ORDER BY STRLEN(COBA_COD) INTO :codbar;
            if (CODBAR IS NULL) then
                CODBAR = CODIGO;
            if (EXIST <> 'N') then
                BEGIN
                SELECT STAND_COD FROM STANDS WHERE ARTI_COD = :CODIGO AND STAND_BODEGA = :CODBOD INTO :STAND;
                EXECUTE PROCEDURE SALDO_INICIAL_INVENTARIO(CODIGO, FECHA, :CODBOD) returning_values (CANT);
                EXECUTE PROCEDURE costo_promedio_y_ultimo_unidad(CODIGO, FECHA-1, UNIDAD) returning_values (COSTO, ULTCOSTO);
                /* EL FACTOR */
                FACCOST = 1;
                SELECT FIRST 1 FAIN_FACTOR FROM factor_inventario WHERE FAIN_FECINI <= :FECHA AND FAIN_FECFIN >= :FECHA INTO :FACCOST;
                ULTCOSTO = ULTCOSTO * FACCOST;
                COSTO = COSTO * FACCOST;

                SELECT FIRST 1 MVAR_FECHA FROM MOVIMIENTO_ARTICULO WHERE ARTI_COD = :CODIGO AND MVAR_ENTRADA = 'S' AND MVAR_FECHA <= :FECHA
                    ORDER BY ARTI_COD DESC, MVAR_FECHA DESC INTO :FECHACOSTO;
                
                COSTOTOT = :CANT * :COSTO;
                IVAMONTO = COSTOTOT /100 * IVA;
                COSTOIVA = COSTOTOT;
                if (CONSUMO <> 0) then
                    EXECUTE PROCEDURE CONSUMO_HISTORICO (:CODIGO, :fecha) returning_values (:CONSUMO);
                if (MASIVA = 'S') then
                    BEGIN
                    COSTOIVA = COSTOTOT + IVAMONTO;
                    COSTO = COSTO * (100 + :IVA) / 100 + :CONSUMO;
                    END
                CONSUMO = CONSUMO * CANT;
                COSTOIVA = COSTOIVA + CONSUMO;
                if (RESERVA = 'S') then
                    BEGIN
                    SELECT SUM(ORID_ENTREGAR)
                        FROM ORDENINVENTARIO_DETALLE OD, ordenes_inventario O
                        WHERE O.ORIN_ID = OD.ORIN_ID AND ARTI_COD = :CODIGO AND ORIN_FECHA <= :FECHA AND ORIN_FECLLEGA >= :FECHA AND ORID_ANULADO = 'N' AND OD.BODE_COD = :CODBOD
                        INTO :ORDENADO;
                    if (ORDENADO IS NULL) then
                        ORDENADO = 0;
                    ORDENC = 0;
                    FOR SELECT O.ORDC_ID, OCDE_ITEM, OCDE_CANT * OCDE_FACTOR
                        FROM ORDENES_COMPRA O, ORDENES_COMPRA_DETALLE OD
                        WHERE O.ORDC_ID = OD.ORDC_ID AND OD.ARTI_COD = :CODIGO AND ORDC_VENCE >= :FECHA AND ORDC_FECHA <= :FECHA AND OCDE_ANULADO = 'N' AND OD.BODE_COD = :CODBOD
                        INTO :ID, :ITEM, :CANT2
                        do
                        BEGIN
                        EXECUTE PROCEDURE FALTANTE(23, 21, ID, ITEM) returning_values (PEDIDO, UND, FACTOR);
                        if (PEDIDO * FACTOR = CANT2) then /* SI NO SE HA FACTURADO MIRE A VER SI SE REMISIONO */
                            EXECUTE PROCEDURE FALTANTE(23, 22, ID, ITEM) returning_values (PEDIDO, UND, FACTOR);
                        if (PEDIDO IS NULL) then
                            PEDIDO = 0;
                        ORDENC = ORDENC + PEDIDO * FACTOR;
                        END
                    ORDENADO = ORDENADO + ORDENC;
                    SELECT SUM(RSDE_LIBERAR)
                        FROM RESERVAS_DETALLE RD, RESERVAS R
                        WHERE R.RESE_ID = RD.RESE_ID AND ARTI_COD = :CODIGO AND RESE_FECHA <= :FECHA AND RESE_VENCE >= :FECHA AND RD.BODE_COD = :CODBOD AND RSDE_ANULADO = 'N'
                        INTO :RESERVADO;
                    if (RESERVADO IS NULL) then
                        RESERVADO = 0;
                    PEDIDO = 0;
                    FOR SELECT P.PEDI_ID, PEDE_ITEM, PEDE_CANT * PEDE_FACTOR
                        FROM PEDIDOS P, PEDIDOS_DETALLE PD
                        WHERE P.PEDI_ID = PD.PEDI_ID AND PD.ARTI_COD = :CODIGO AND PEDI_VENCE >= :FECHA AND PEDI_FECHA <= :FECHA AND PEDE_ANULADO = 'N' AND BODE_COD = :CODBOD
                        INTO :ID, :ITEM, :CANT2
                        do
                        BEGIN
                        EXECUTE PROCEDURE FALTANTE(34, 31, ID, ITEM) returning_values (ORDENC, UND, FACTOR);
                        if ((ORDENC * FACTOR = CANT2) or (PEDAUTO = 'SI')) then /* SI NO SE HA FACTURADO MIRE A VER SI SE REMISIONO */
                            EXECUTE PROCEDURE FALTANTE(34, 32, ID, ITEM) returning_values (ORDENC, UND, FACTOR);
                        if (ORDENC IS NULL) then
                            ORDENC = 0;
                        PEDIDO = PEDIDO + ORDENC * FACTOR;
                        END
                    RESERVADO = RESERVADO + PEDIDO;
                    END
                ELSE
                    BEGIN
                    RESERVADO = 0;
                    ORDENADO = 0;
                    END
                if (LISTA > 0) then
                    SELECT prar_fijo FROM precios_articulo WHERE arti_cod = :CODIGO and lipr_cod = :LISTA INTO :PRECIO;
                if (ENPESO = 'S') then
                    BEGIN
                    if (pesounit IS NULL) then
                        pesounit = 0;
                    if (PESOUNIT <> 0) then
                        BEGIN
                        pesototal = PESOUNIT * cant;
                        SUSPEND;
                        END
                    END
                ELSE
                    SUSPEND;
                END
            END
        END
  END

if (DETALLE = 'L') then
  BEGIN
  FOR SELECT A.ARTI_COD, ARTI_DES, ARTI_UNIDAD, ARTI_EXIST, TAIV_PORC, A.GRUP_COD, A.SUBG_COD, A.MARC_COD, L.lote_nro, L.lote_nro||' - '||L.lote_vence, ARTI_CONSUMO,l.bode_cod, L.lote_saldo,l.lote_costo, ARTI_PESO/1000
      FROM ARTICULO A, LOTES l, TARIFA_IVA T
      WHERE A.ARTI_COD >= '0' AND A.ARTI_COD <= 'zz' AND ARTI_DES >= '' AND ARTI_DES <= 'zz' AND ESAR_COD <> 'I' AND A.TAIV_COD = T.TAIV_COD and a.arti_cod = l.arti_cod
      AND L.BODE_COD >= :BODINI AND L.BODE_COD <= :BODFIN
      INTO :CODIGO, :NOMBRE, :UNIDAD, :EXIST, :IVA, :CODGRUPO, :CODSUBG, :CODMARC, :LOTE, :NOMBOD, :CONSUMO, :codbod, :cant, :costo_lote, :pesounit
      DO
        BEGIN
        OK = 'N';
        if (AGRUPA = 'G') then
            BEGIN
            if ((CODGRUPO >= GRPINI) AND (CODGRUPO <= GRPFIN)) then
                OK = 'S';
            end
        ELSE
            if (AGRUPA = 'M') then
                BEGIN
                if ((CODMARC >= GRPINI) AND (CODMARC <= GRPFIN)) then
                    OK = 'S';
                END
        if (OK = 'S') then
            BEGIN
            NOMGRUPO = '';
            NOMMARC = '';
            NOMSUBG = '';
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            CODBAR = NULL;
            SELECT MAX(COBA_COD) FROM BARRAS_ARTICULO WHERE ARTI_COD = :codigo AND COBA_UNIDAD = :unidad INTO :codbar;
            if (CODBAR IS NULL) then
                CODBAR = CODIGO;

            if (EXIST <> 'N') then
                BEGIN
                EXECUTE PROCEDURE costo_promedio_y_ultimo_unidad(CODIGO, FECHA-1, UNIDAD) returning_values (COSTO, ULTCOSTO);
                /* EL FACTOR */
                FACCOST = 1;
                SELECT FIRST 1 FAIN_FACTOR FROM factor_inventario WHERE FAIN_FECINI <= :FECHA AND FAIN_FECFIN >= :FECHA INTO :FACCOST;
                ULTCOSTO = ULTCOSTO * FACCOST;
                COSTO = COSTO * FACCOST;

                SELECT FIRST 1 MVAR_FECHA FROM MOVIMIENTO_ARTICULO WHERE ARTI_COD = :CODIGO AND MVAR_ENTRADA = 'S' AND MVAR_FECHA <= :FECHA
                    ORDER BY ARTI_COD DESC, MVAR_FECHA DESC INTO :FECHACOSTO;
                COSTOTOT = :CANT * :COSTO;
                IVAMONTO = COSTOTOT /100 * IVA;
                COSTOIVA = COSTOTOT;
                if (CONSUMO <> 0) then
                    EXECUTE PROCEDURE CONSUMO_HISTORICO (:CODIGO, :fecha) returning_values (:CONSUMO);
                if (MASIVA = 'S') then
                    BEGIN
                    COSTOIVA = COSTOTOT + IVAMONTO;
                    COSTO = COSTO * (100 + :IVA) / 100 + :CONSUMO;
                    END
                CONSUMO = CONSUMO * CANT;
                COSTOIVA = COSTOIVA + CONSUMO;
                if (RESERVA = 'S') then
                    BEGIN
                    SELECT SUM(ORID_ENTREGAR)
                        FROM ORDENINVENTARIO_DETALLE OD, ordenes_inventario O
                        WHERE O.ORIN_ID = OD.ORIN_ID AND ARTI_COD = :CODIGO AND ORIN_FECHA <= :FECHA AND ORIN_FECLLEGA >= :FECHA AND ORID_ANULADO = 'N'
                        INTO :ORDENADO;
                    if (ORDENADO IS NULL) then
                        ORDENADO = 0;
                    ORDENC = 0;
                    FOR SELECT O.ORDC_ID, OCDE_ITEM, OCDE_CANT * OCDE_FACTOR
                        FROM ORDENES_COMPRA O, ORDENES_COMPRA_DETALLE OD
                        WHERE O.ORDC_ID = OD.ORDC_ID AND OD.ARTI_COD = :CODIGO AND ORDC_VENCE >= :FECHA AND ORDC_FECHA <= :FECHA AND OCDE_ANULADO = 'N'
                        INTO :ID, :ITEM, :CANT2
                        do
                        BEGIN
                        EXECUTE PROCEDURE FALTANTE(23, 21, ID, ITEM) returning_values (PEDIDO, UND, FACTOR);
                        if (PEDIDO * FACTOR = CANT2) then /* SI NO SE HA FACTURADO MIRE A VER SI SE REMISIONO */
                            EXECUTE PROCEDURE FALTANTE(23, 22, ID, ITEM) returning_values (PEDIDO, UND, FACTOR);
                        if (PEDIDO IS NULL) then
                            PEDIDO = 0;
                        ORDENC = ORDENC + PEDIDO * FACTOR;
                        END
                    ORDENADO = ORDENADO + ORDENC;
                    SELECT SUM(RSDE_LIBERAR)
                        FROM RESERVAS_DETALLE RD, RESERVAS R
                        WHERE R.RESE_ID = RD.RESE_ID AND ARTI_COD = :CODIGO AND RESE_FECHA <= :FECHA AND RESE_VENCE >= :FECHA AND RSDE_ANULADO = 'N'
                        INTO :RESERVADO;
                    if (RESERVADO IS NULL) then
                        RESERVADO = 0;
                    PEDIDO = 0;
                    FOR SELECT P.PEDI_ID, PEDE_ITEM, PEDE_CANT * PEDE_FACTOR
                        FROM PEDIDOS P, PEDIDOS_DETALLE PD
                        WHERE P.PEDI_ID = PD.PEDI_ID AND PD.ARTI_COD = :CODIGO AND PEDI_VENCE >= :FECHA AND PEDI_FECHA <= :FECHA AND PEDE_ANULADO = 'N'
                        INTO :ID, :ITEM, :CANT2
                        do
                        BEGIN
                        EXECUTE PROCEDURE FALTANTE(34, 31, ID, ITEM) returning_values (ORDENC, UND, FACTOR);
                        if ((ORDENC * FACTOR = CANT2) or (PEDAUTO = 'SI')) then /* SI NO SE HA FACTURADO MIRE A VER SI SE REMISIONO */
                            EXECUTE PROCEDURE FALTANTE(34, 32, ID, ITEM) returning_values (ORDENC, UND, FACTOR);
                        if (ORDENC IS NULL) then
                            ORDENC = 0;
                        PEDIDO = PEDIDO + ORDENC * FACTOR;
                        END
                    RESERVADO = RESERVADO + PEDIDO;
                    END
                ELSE
                    BEGIN
                    RESERVADO = 0;
                    ORDENADO = 0;
                    END
                if (LISTA > 0) then
                    SELECT prar_fijo FROM precios_articulo WHERE arti_cod = :CODIGO and lipr_cod = :LISTA INTO :PRECIO;
                if (ENPESO = 'S') then
                    BEGIN
                    if (pesounit IS NULL) then
                        pesounit = 0;
                    if (PESOUNIT <> 0) then
                        BEGIN
                        pesototal = PESOUNIT * cant;
                        SUSPEND;
                        END
                    END
                ELSE
                    SUSPEND;
                END
            END
        END
  end
if (DETALLE = 'N') then
  BEGIN
  FOR SELECT ARTI_COD, ARTI_DES, ARTI_UNIDAD, ARTI_EXIST, TAIV_PORC, A.GRUP_COD, A.SUBG_COD, A.MARC_COD, ARTI_CONSUMO, ARTI_PESO/1000
      FROM ARTICULO A, TARIFA_IVA T
      WHERE ARTI_COD >= :CODINI AND ARTI_COD <= :CODFIN AND ARTI_DES >= :DESINI AND ARTI_DES <= :DESFIN AND ESAR_COD <> 'I' AND A.TAIV_COD = T.TAIV_COD
      INTO :CODIGO, :NOMBRE, :UNIDAD, :EXIST, :IVA, :CODGRUPO, :CODSUBG, :CODMARC, :CONSUMO, :pesounit
      DO
        BEGIN
        OK = 'N';
        if (AGRUPA = 'G') then
            BEGIN
            if ((GRPINI = '0') AND (GRPFIN = 'zz')) then
                OK = 'S';
            else
                if ((CODGRUPO >= GRPINI) AND (CODGRUPO <= GRPFIN)) then
                    OK = 'S';
            end
        ELSE
            if (AGRUPA = 'M') then
                BEGIN
                if ((GRPINI = '0') AND (GRPFIN = 'zzz')) then
                    OK = 'S';
                else
                    if ((CODMARC >= GRPINI) AND (CODMARC <= GRPFIN)) then
                        OK = 'S';
                END
        if (OK = 'S') then
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            CODBAR = NULL;
            SELECT MAX(COBA_COD) FROM BARRAS_ARTICULO WHERE ARTI_COD = :codigo AND COBA_UNIDAD = :unidad INTO :codbar;
            if (CODBAR IS NULL) then
                CODBAR = CODIGO;

            if (EXIST <> 'N') then
                BEGIN
                EXECUTE PROCEDURE SALDO_INICIAL_TOTAL_INV(CODIGO, FECHA) returning_values (CANT);
                EXECUTE PROCEDURE costo_promedio_y_ultimo_unidad(CODIGO, FECHA-1, UNIDAD) returning_values (COSTO, ULTCOSTO);
                /* EL FACTOR */
                FACCOST = 1;
                SELECT FIRST 1 FAIN_FACTOR FROM factor_inventario WHERE FAIN_FECINI <= :FECHA AND FAIN_FECFIN >= :FECHA INTO :FACCOST;
                ULTCOSTO = ULTCOSTO * FACCOST;
                COSTO = COSTO * FACCOST;

                SELECT FIRST 1 MVAR_FECHA FROM MOVIMIENTO_ARTICULO WHERE ARTI_COD = :CODIGO AND MVAR_ENTRADA = 'S' AND MVAR_FECHA <= :FECHA
                    ORDER BY ARTI_COD DESC, MVAR_FECHA DESC INTO :FECHACOSTO;
                COSTOTOT = :CANT * :COSTO;
                IVAMONTO = COSTOTOT /100 * IVA;
                COSTOIVA = COSTOTOT;
                if (CONSUMO <> 0) then
                    EXECUTE PROCEDURE CONSUMO_HISTORICO (:CODIGO, :fecha) returning_values (:CONSUMO);
                if (MASIVA = 'S') then
                    BEGIN
                    COSTOIVA = COSTOTOT + IVAMONTO;
                    COSTO = COSTO * (100 + :IVA) / 100 + :CONSUMO;
                    END
                CONSUMO = CONSUMO * CANT;
                COSTOIVA = COSTOIVA + CONSUMO;
                if (RESERVA = 'S') then
                    BEGIN
                    SELECT SUM(ORID_ENTREGAR)
                        FROM ORDENINVENTARIO_DETALLE OD, ordenes_inventario O
                        WHERE O.ORIN_ID = OD.ORIN_ID AND ARTI_COD = :CODIGO AND ORIN_FECHA <= :FECHA AND ORIN_FECLLEGA >= :FECHA AND ORID_ANULADO = 'N'
                        INTO :ORDENADO;
                        if (ORDENADO IS NULL) then
                            ORDENADO = 0;
                    ORDENC = 0;
                    FOR SELECT O.ORDC_ID, OCDE_ITEM, OCDE_CANT * OCDE_FACTOR
                        FROM ORDENES_COMPRA O, ORDENES_COMPRA_DETALLE OD
                        WHERE O.ORDC_ID = OD.ORDC_ID AND OD.ARTI_COD = :CODIGO AND ORDC_VENCE >= :FECHA AND ORDC_FECHA <= :FECHA AND OCDE_ANULADO = 'N'
                        INTO :ID, :ITEM, :CANT2
                        do
                        BEGIN
                        EXECUTE PROCEDURE FALTANTE(23, 21, ID, ITEM) returning_values (PEDIDO, UND, FACTOR);
                        if (PEDIDO * FACTOR = CANT2) then /* SI NO SE HA FACTURADO MIRE A VER SI SE REMISIONO */
                            EXECUTE PROCEDURE FALTANTE(23, 22, ID, ITEM) returning_values (PEDIDO, UND, FACTOR);
                        if (PEDIDO IS NULL) then
                            PEDIDO = 0;
                        ORDENC = ORDENC + PEDIDO * FACTOR;
                        END
                    ORDENADO = ORDENADO + ORDENC;
                    SELECT SUM(RSDE_LIBERAR)
                        FROM RESERVAS_DETALLE RD, RESERVAS R
                        WHERE R.RESE_ID = RD.RESE_ID AND ARTI_COD = :CODIGO AND RESE_FECHA <= :FECHA AND RESE_VENCE >= :FECHA AND RSDE_ANULADO = 'N'
                        INTO :RESERVADO;
                    if (RESERVADO IS NULL) then
                        RESERVADO = 0;
                    PEDIDO = 0;
                    FOR SELECT P.PEDI_ID, PEDE_ITEM, PEDE_CANT * PEDE_FACTOR
                        FROM PEDIDOS P, PEDIDOS_DETALLE PD, PUNTO_VENTA PT
                        WHERE P.PEDI_ID = PD.PEDI_ID AND PD.ARTI_COD = :CODIGO AND PT.ptvt_id = P.PTVT_ID AND PEDI_VENCE >= :FECHA AND PEDI_FECHA <= :FECHA AND PEDE_ANULADO = 'N'
                        INTO :ID, :ITEM, :CANT2
                        do
                        BEGIN
                        EXECUTE PROCEDURE FALTANTE(34, 31, ID, ITEM) returning_values (ORDENC, UND, FACTOR);
                        if ((ORDENC * FACTOR = CANT2) or (PEDAUTO = 'SI')) then /* SI NO SE HA FACTURADO MIRE A VER SI SE REMISIONO */
                            EXECUTE PROCEDURE FALTANTE(34, 32, ID, ITEM) returning_values (ORDENC, UND, FACTOR);
                        if (ORDENC IS NULL) then
                            ORDENC = 0;
                        PEDIDO = PEDIDO + ORDENC * FACTOR;
                        END
                    if (PEDIDO IS NULL) then
                        PEDIDO = 0;
                    RESERVADO = RESERVADO + PEDIDO;
                    END
                ELSE
                    BEGIN
                    RESERVADO = 0;
                    ORDENADO = 0;
                    END
                if (LISTA > 0) then
                    SELECT prar_fijo FROM precios_articulo WHERE arti_cod = :CODIGO and lipr_cod = :LISTA INTO :PRECIO;

                if (ENPESO = 'S') then
                    BEGIN
                    if (pesounit IS NULL) then
                        pesounit = 0;
                    if (PESOUNIT <> 0) then
                        BEGIN
                        pesototal = PESOUNIT * cant;
                        SUSPEND;
                        END
                    END
                ELSE
                    SUSPEND;
                END
            END
        END
  END
END
^

SET TERM ; ^



/* 20101026 */
/* SE PERDIO LA CANTIDAD AL AGREGAR LA PARTICIPACION */

ALTER TABLE REP_UTILIDAD
ADD CANT T_CANTIDAD;

SET TERM ^ ;

CREATE OR ALTER procedure REP_UTILIDAD_VENTAS (
    TIPO integer,
    DETALLE char(1),
    FECINI date,
    FECFIN date,
    ARTINI varchar(15),
    ARTFIN varchar(15),
    GRPINI varchar(3),
    GRPFIN varchar(3),
    ORDEN char(1),
    AGRUPA char(1),
    ULTIMO char(1),
    CEROS char(1),
    SUBEMPRESA integer)
returns (
    ARTICULO varchar(15),
    DESCRIPCION varchar(60),
    CODGRUPO varchar(2),
    NOMGRUPO varchar(30),
    CODSUBG varchar(3),
    NOMSUBG varchar(30),
    CODMARC varchar(3),
    NOMMARC varchar(30),
    UNIDAD varchar(8),
    CANTIDAD numeric(18,4),
    BASE numeric(18,4),
    COSTO numeric(18,4),
    UTILIDAD numeric(18,4),
    PORC numeric(9,2),
    IVA numeric(18,4),
    IVAPOR numeric(9,2),
    CONSUMO numeric(18,4),
    PREFIJO varchar(4),
    NUMERO varchar(6),
    FECHA date,
    TIPODOC integer,
    PART float)
AS
DECLARE VARIABLE COSTOUNIT NUMERIC(18,4);
DECLARE VARIABLE CANTDET NUMERIC(18,4);
DECLARE VARIABLE TOTAL NUMERIC(18,2);
declare variable CODINI VARCHAR(15);
declare variable CODFIN VARCHAR(15);
declare variable DESINI VARCHAR(15);
declare variable DESFIN VARCHAR(15);
declare variable MARINI VARCHAR(3);
declare variable MARFIN VARCHAR(3);
declare variable UOM VARCHAR(20);
declare variable ULTCOS NUMERIC(18,2);
declare variable FACCOST NUMERIC(18,4);
declare variable IDREP INTEGER;
declare variable ID integer;
declare variable ITEM integer;
BEGIN
if (ORDEN = 'C') then
    BEGIN
    CODINI = ARTINI;
    CODFIN = ARTFIN;
    DESINI = '';
    DESFIN = 'zz';
    END
ELSE
    BEGIN
    DESINI = ARTINI;
    DESFIN = ARTFIN;
    CODINI = '';
    CODFIN = 'zz';
    END
if (AGRUPA = 'G') then
    BEGIN
    MARINI = '';
    MARFIN = 'zz';
    END
ELSE
    if (AGRUPA = 'M') then
        BEGIN
        MARINI = GRPINI;
        MARFIN = GRPFIN;
        GRPINI = '';
        GRPFIN = 'zz';
        END
    ELSE
        BEGIN
        MARINI = '';
        MARFIN = 'zz';
        GRPINI = '';
        GRPFIN = 'zz';
        END
EXECUTE PROCEDURE lee_configuracion ('FACTURACION', 'ARTICULOS', 'SUGERIR PRECIOS CON PORCENTAJE DE MARGEN O UTILIDAD') returning_values (:UOM);
IDREP = GEN_ID(id_reputilidad, 1);
if (DETALLE = 'N') then
    BEGIN
    if (BIN_AND(TIPO, 1) <> 0) then
        BEGIN
        TIPODOC = 31;
        FOR SELECT MAX(D.ARTI_COD), SUM(FADE_CANT * FADE_FACTOR), SUM((FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO)*FACT_FACTOR), SUM(FADE_IVAMONTO*FACT_FACTOR), SUM(FADE_CONSUMO)
            FROM FACTURAS_DETALLE D, FACTURAS F, PREFIJOS P, ARTICULO A
            WHERE F.FACT_ID = D.FACT_ID AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND D.ARTI_COD = A.arti_cod AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            FACT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) and substring(a.arti_cod from 1 FOR 2) <> '.t'
            GROUP BY D.ARTI_COD
            INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO
            DO
            BEGIN
            COSTO = 0;
            FOR SELECT FADE_CANT * FADE_FACTOR, FACT_FECHA, F.FACT_ID, FADE_ITEM FROM FACTURAS_DETALLE D, FACTURAS F, PREFIJOS P
                WHERE F.FACT_ID = D.FACT_ID AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND
                FACT_ANULADO = 'N' AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                and D.ARTI_COD = :articulo  INTO :cantdet, :fecha, :id, :item
                DO
                BEGIN
                if (EXISTS (SELECT COST_SALP / COST_SALC FROM COSTOS C, MOVIMIENTO_ARTICULO M
                    WHERE COST_IDMOV = MVAR_CONS AND MVAR_TIPODOC = 31 AND MVAR_IDREF = :ID AND COST_SALC <> 0 AND MVAR_ITEM = :ITEM)) then
                    SELECT COST_SALP / COST_SALC, COST_ULTIMO FROM COSTOS C, MOVIMIENTO_ARTICULO M
                    WHERE COST_IDMOV = MVAR_CONS AND MVAR_TIPODOC = 31 AND MVAR_IDREF = :ID AND COST_SALC <> 0 AND MVAR_ITEM = :ITEM INTO :costounit, :ultcos;
                else
                    EXECUTE PROCEDURE costo_promedio_y_ultimo(:ARTICULO, :FECHA) returning_values (:costounit, :ultcos);
                if (costounit IS NULL) then
                    costounit = 0;
                if (ultcos IS NULL) then
                    ultcos = 0;

                /* EL FACTOR */
                FACCOST = 1;
                SELECT FIRST 1 FACO_FACTOR FROM factor_costo WHERE FACO_FECINI <= :FECHA AND FACO_FECFIN >= :FECHA INTO :FACCOST;
                ULTCOS = ULTCOS * FACCOST;
                COSTOUNIT = COSTOUNIT * FACCOST;

                if (ULTIMO = 'S') then
                    COSTO = COSTO + ultcos * cantdet;
                else
                    COSTO = COSTO + costounit * cantdet;
                END
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            INSERT INTO REP_UTILIDAD(ID, TIPO, CODIGO, BASE, IVA, CONSUMO, COSTO, CANT) VALUES (:IDREP, 31, :articulo, :base, :iva, :consumo, :costo, :cantidad);
            if (CEROS = 'S') then
                INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (2, USER, :ARTICULO);
            END /* FOR */
        SELECT SUM(BASE-COSTO) FROM REP_UTILIDAD WHERE id = :IDREP AND TIPO = 31 INTO :TOTAL;
        FOR SELECT ARTI_COD, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD, TAIV_PORC FROM ARTICULO A, TARIFA_IVA T
            WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND
            (A.MARC_COD <= :MARFIN))) AND substring(a.arti_cod from 1 FOR 2) <> '.t' AND A.taiv_cod = T.taiv_cod
            INTO :ARTICULO, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :ivapor
            DO
            BEGIN
            EXECUTE procedure nombres_grupos_inventario (CODGRUPO, CODSUBG, CODMARC)
                returning_values (NOMGRUPO, NOMSUBG, NOMMARC);
            BASE = 0;
            IVA = 0;
            CONSUMO = 0;
            COSTO = 0;
            UTILIDAD = 0;
            PORC = 0;
            PART = 0;
            SELECT BASE, IVA, CONSUMO, COSTO, CANT FROM rep_utilidad WHERE ID = :IDREP AND TIPO = 31 AND CODIGO = :articulo
                INTO :BASE, :IVA, :consumo,  :costo, :cantidad;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            EXECUTE PROCEDURE PORCENTAJE (utilidad,  TOTAL, 'S') returning_values (part);
            if ((CEROS = 'S') or (BASE <> 0) or (COSTO <> 0)) then
                SUSPEND;
            END /* FOR */
            BEGIN
            COSTO = 0;
            END
        END
    if (BIN_AND(TIPO, 2) <> 0) then
        BEGIN
        TIPODOC = 32;
        FOR SELECT MAX(D.ARTI_COD), SUM(RVDE_CANT * RVDE_FACTOR), SUM(RVDE_TOTAL-RVDE_IVAMONTO-RVDE_CONSUMO), SUM(RVDE_IVAMONTO), SUM(RVDE_CONSUMO)
            FROM REMISIONES_VENTA_DETALLE D, REMISIONES_VENTA R, PREFIJOS P, ARTICULO A
            WHERE R.REVT_ID = D.REVT_ID AND P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = 32 AND D.ARTI_COD = A.arti_cod AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            REVT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY D.ARTI_COD
            INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO
            DO
            BEGIN
            COSTO = 0;
            FOR SELECT RVDE_CANT * RVDE_FACTOR, REVT_FECHA, F.REVT_ID, RVDE_ITEM FROM remisiones_venta_detalle D, remisiones_venta F, PREFIJOS P
                WHERE F.revt_id = D.revt_id AND REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN AND
                REVT_ANULADO = 'N' AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 32 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                and D.ARTI_COD = :articulo  INTO :cantdet, :fecha, :id, :item
                DO
                BEGIN
                if (EXISTS (SELECT COST_SALP / COST_SALC FROM COSTOS C, MOVIMIENTO_ARTICULO M
                    WHERE COST_IDMOV = MVAR_CONS AND MVAR_TIPODOC = 32 AND MVAR_IDREF = :ID AND COST_SALC <> 0 AND MVAR_ITEM = :ITEM)) then
                    SELECT COST_SALP / COST_SALC, cost_ultimo FROM COSTOS C, MOVIMIENTO_ARTICULO M
                    WHERE COST_IDMOV = MVAR_CONS AND MVAR_TIPODOC = 32 AND MVAR_IDREF = :ID AND COST_SALC <> 0 AND MVAR_ITEM = :ITEM INTO :costounit, :ultcos;
                else
                    EXECUTE PROCEDURE costo_promedio_y_ultimo(:ARTICULO, :FECHA) returning_values (:costounit, :ultcos);
                if (costounit IS NULL) then
                    costounit = 0;
                if (ultcos IS NULL) then
                    ultcos = 0;
                /* EL FACTOR */
                FACCOST = 1;
                SELECT FIRST 1 FACO_FACTOR FROM factor_costo WHERE FACO_FECINI <= :FECHA AND FACO_FECFIN >= :FECHA INTO :FACCOST;
                ULTCOS = ULTCOS * FACCOST;
                COSTOUNIT = COSTOUNIT * FACCOST;

                if (ULTIMO = 'S') then
                    COSTO = COSTO + ultcos * cantdet;
                else
                    COSTO = COSTO + costounit * cantdet;
                END
            EXECUTE procedure nombres_grupos_inventario (CODGRUPO, CODSUBG, CODMARC)
                returning_values (NOMGRUPO, NOMSUBG, NOMMARC);
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            if (CEROS = 'S') then
                INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (2, USER, :ARTICULO);
            INSERT INTO REP_UTILIDAD(ID, TIPO, CODIGO, BASE, IVA, CONSUMO, COSTO, CANT)
                VALUES (:IDREP, 32, :articulo, :base, :iva, :consumo, :costo, :cantidad);
            END /* FOR */
        SELECT SUM(BASE-COSTO) FROM REP_UTILIDAD WHERE id = :IDREP AND TIPO = 32 INTO :TOTAL;
        FOR SELECT ARTI_COD, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD, TAIV_PORC FROM ARTICULO A, TARIFA_IVA T
            WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND
            (A.MARC_COD <= :MARFIN))) AND substring(a.arti_cod from 1 FOR 2) <> '.t' AND A.taiv_cod = T.taiv_cod
            INTO :ARTICULO, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :ivapor
            DO
            BEGIN
            EXECUTE procedure nombres_grupos_inventario (CODGRUPO, CODSUBG, CODMARC)
                returning_values (NOMGRUPO, NOMSUBG, NOMMARC);
            BASE = 0;
            IVA = 0;
            CONSUMO = 0;
            COSTO = 0;
            UTILIDAD = 0;
            PORC = 0;
            SELECT BASE, IVA, CONSUMO, COSTO, CANT FROM rep_utilidad WHERE ID = :IDREP AND TIPO = 32 AND CODIGO = :articulo
                INTO :BASE, :IVA, :consumo,  :costo, :cantidad;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            EXECUTE PROCEDURE PORCENTAJE (utilidad,  TOTAL, 'S') returning_values (part);
            if ((CEROS = 'S') or (BASE <> 0) or (COSTO <> 0)) then
                SUSPEND;
            END /* FOR */
        END
    if (BIN_AND(TIPO, 4) <> 0) then
        BEGIN
        TIPODOC = 33;
        FOR SELECT MAX(D.ARTI_COD), SUM(DVDE_CANT * DVDE_FACTOR), SUM((DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO)*DEVT_FACTOR), SUM(DVDE_IVAMONTO*DEVT_FACTOR), SUM(DVDE_CONSUMO)
            FROM devoluciones_ventas_detalle D, DEVOLUCIONES_VENTAS V, PREFIJOS P, ARTICULO A
            WHERE V.DEVT_ID = D.DEVT_ID AND P.PREF_PRE = V.PREF_PRE AND P.TIDO_COD = 33 AND D.ARTI_COD = A.arti_cod AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            DEVT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY D.ARTI_COD
            INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO
            DO
            BEGIN
            COSTO = 0;
            FOR SELECT DVDE_CANT * DVDE_FACTOR, DEVT_FECHA, F.DEVT_ID, DVDE_ITEM FROM devoluciones_ventas_detalle D, devoluciones_ventas F, PREFIJOS P
                WHERE F.devt_id = D.devt_id AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND
                DEVT_ANULADO = 'N' AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 33 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                and D.ARTI_COD = :articulo  INTO :cantdet, :fecha, :id, :item
                DO
                BEGIN
                if (EXISTS (SELECT COST_ENTP / COST_ENTC FROM COSTOS C, MOVIMIENTO_ARTICULO M
                    WHERE COST_IDMOV = MVAR_CONS AND MVAR_TIPODOC = 33 AND MVAR_IDREF = :ID AND COST_ENTC <> 0 AND MVAR_ITEM = :ITEM)) then
                    SELECT COST_ENTP / COST_ENTC, COST_ULTIMO FROM COSTOS C, MOVIMIENTO_ARTICULO M
                        WHERE COST_IDMOV = MVAR_CONS AND MVAR_TIPODOC = 33 AND MVAR_IDREF = :ID AND COST_ENTC <> 0 AND MVAR_ITEM = :ITEM INTO :costounit, :ultcos;
                else
                    EXECUTE PROCEDURE costo_promedio_y_ultimo(:ARTICULO, :FECHA) returning_values (:costounit, :ultcos);
                if (costounit IS NULL) then
                    costounit = 0;
                if (ultcos IS NULL) then
                    ultcos = 0;
                /* EL FACTOR */
                FACCOST = 1;
                SELECT FIRST 1 FACO_FACTOR FROM factor_costo WHERE FACO_FECINI <= :FECHA AND FACO_FECFIN >= :FECHA INTO :FACCOST;
                ULTCOS = ULTCOS * FACCOST;
                COSTOUNIT = COSTOUNIT * FACCOST;

                if (ULTIMO = 'S') then
                    COSTO = COSTO + ultcos * cantdet;
                else
                    COSTO = COSTO + costounit * cantdet;
                END
            EXECUTE procedure nombres_grupos_inventario (CODGRUPO, CODSUBG, CODMARC)
                returning_values (NOMGRUPO, NOMSUBG, NOMMARC);
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            else
                CANTIDAD = CANTIDAD * -1;
            if (BASE IS NULL) then
                BASE = 0;
            else
                BASE = BASE * -1;
            if (IVA IS NULL) then
                IVA = 0;
            else
                IVA = IVA * -1;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            else
                CONSUMO = CONSUMO * -1;
            COSTO = costo * -1;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            if (CEROS = 'S') then
                INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (2, USER, :ARTICULO);
            INSERT INTO REP_UTILIDAD(ID, TIPO, CODIGO, BASE, IVA, CONSUMO, COSTO, CANT)
                VALUES (:IDREP, 33, :articulo, :base, :iva, :consumo, :costo, :cantidad);
            END /* FOR */
        SELECT SUM(BASE-COSTO) FROM REP_UTILIDAD WHERE id = :IDREP AND TIPO = 33 INTO :TOTAL;
        FOR SELECT ARTI_COD, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD, TAIV_PORC FROM ARTICULO A, TARIFA_IVA T
            WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND
            (A.MARC_COD <= :MARFIN))) AND substring(a.arti_cod from 1 FOR 2) <> '.t' AND A.taiv_cod = T.taiv_cod
            INTO :ARTICULO, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :ivapor
            DO
            BEGIN
            EXECUTE procedure nombres_grupos_inventario (CODGRUPO, CODSUBG, CODMARC)
                returning_values (NOMGRUPO, NOMSUBG, NOMMARC);
            BASE = 0;
            IVA = 0;
            CONSUMO = 0;
            COSTO = 0;
            UTILIDAD = 0;
            PORC = 0;
            SELECT BASE, IVA, CONSUMO, COSTO, CANT FROM rep_utilidad WHERE ID = :IDREP AND TIPO = 33 AND CODIGO = :articulo
                INTO :BASE, :IVA, :consumo,  :costo, :cantidad;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            EXECUTE PROCEDURE PORCENTAJE (utilidad,  TOTAL, 'S') returning_values (part);
            if ((CEROS = 'S') or (BASE <> 0) or (COSTO <> 0)) then
                SUSPEND;
            END /* FOR */
        END
    if (BIN_AND(TIPO, 8) <> 0) then
        BEGIN
        TIPODOC = 34;
        /* BORRA LA TABLA AUXILIAR */
        DELETE FROM reportes_aux WHERE REPA_ID = 2 AND REPA_USER = USER;

        FOR SELECT MAX(D.ARTI_COD), SUM(PEDE_CANT * PEDE_FACTOR), SUM((PEDE_TOTAL-PEDE_IVAMONTO-PEDE_CONSUMO)*PEDI_FACTOR), SUM(PEDE_IVAMONTO*PEDI_FACTOR), SUM(PEDE_CONSUMO)
            FROM PEDIDOS_DETALLE D, PEDIDOS P, PREFIJOS R, ARTICULO A
            WHERE P.PEDI_ID = D.PEDI_ID AND P.PREF_PRE = R.PREF_PRE AND R.TIDO_COD = 34 AND D.ARTI_COD = A.arti_cod AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            PEDI_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY D.ARTI_COD
            INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO
            DO
            BEGIN
            COSTO = 0;
            FOR SELECT PEDE_CANT * PEDE_FACTOR, PEDI_FECHA FROM pedidos_detalle D, pedidos F, PREFIJOS P
                WHERE F.pedi_id = D.pedi_id AND PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND
                PEDI_ANULADO = 'N' AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                and D.ARTI_COD = :articulo  INTO :cantdet, :fecha
                DO
                BEGIN
                EXECUTE PROCEDURE costo_promedio_y_ultimo(:ARTICULO, :FECHA) returning_values (:costounit, :ultcos);
                /* EL FACTOR */
                FACCOST = 1;
                SELECT FIRST 1 FACO_FACTOR FROM factor_costo WHERE FACO_FECINI <= :FECHA AND FACO_FECFIN >= :FECHA INTO :FACCOST;
                ULTCOS = ULTCOS * FACCOST;
                COSTOUNIT = COSTOUNIT * FACCOST;

                if (ULTIMO = 'S') then
                    COSTO = COSTO + ultcos * cantdet;
                else
                    COSTO = COSTO + costounit * cantdet;
                END
            EXECUTE procedure nombres_grupos_inventario (CODGRUPO, CODSUBG, CODMARC)
                returning_values (NOMGRUPO, NOMSUBG, NOMMARC);
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            if (CEROS = 'S') then
                INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (2, USER, :ARTICULO);
            INSERT INTO REP_UTILIDAD(ID, TIPO, CODIGO, BASE, IVA, CONSUMO, COSTO, CANT)
                VALUES (:IDREP, 34, :articulo, :base, :iva, :consumo, :costo, :cantidad);
            END /* FOR */
        SELECT SUM(BASE-COSTO) FROM REP_UTILIDAD WHERE id = :IDREP AND TIPO = 34 INTO :TOTAL;
        FOR SELECT ARTI_COD, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD, TAIV_PORC FROM ARTICULO A, TARIFA_IVA T
            WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND
            (A.MARC_COD <= :MARFIN))) AND substring(a.arti_cod from 1 FOR 2) <> '.t' AND A.taiv_cod = T.taiv_cod
            INTO :ARTICULO, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :ivapor
            DO
            BEGIN
            EXECUTE procedure nombres_grupos_inventario (CODGRUPO, CODSUBG, CODMARC)
                returning_values (NOMGRUPO, NOMSUBG, NOMMARC);
            BASE = 0;
            IVA = 0;
            CONSUMO = 0;
            COSTO = 0;
            UTILIDAD = 0;
            PORC = 0;
            SELECT BASE, IVA, CONSUMO, COSTO, CANT FROM rep_utilidad WHERE ID = :IDREP AND TIPO = 34 AND CODIGO = :articulo
                INTO :BASE, :IVA, :consumo,  :costo, :cantidad;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            EXECUTE PROCEDURE PORCENTAJE (utilidad,  TOTAL, 'S') returning_values (part);
            if ((CEROS = 'S') or (BASE <> 0) or (COSTO <> 0)) then
                SUSPEND;
            END /* FOR */
        END
    if (BIN_AND(TIPO, 16) <> 0) then
        BEGIN
        TIPODOC = 35;
        FOR SELECT MAX(D.ARTI_COD), SUM(CTDE_CANT * CTDE_FACTOR), SUM((CTDE_TOTAL-CTDE_IVAMONTO-CTDE_CONSUMO)*COTI_FACTOR), SUM(CTDE_IVAMONTO), SUM(CTDE_CONSUMO)
            FROM COTIZACIONES_DETALLE D, COTIZACIONES C, PREFIJOS P, ARTICULO A
            WHERE C.COTI_ID = D.COTI_ID AND P.PREF_PRE = C.PREF_PRE AND P.TIDO_COD = 35 AND D.ARTI_COD = A.arti_cod AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND COTI_FECHA >= :FECINI AND COTI_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            COTI_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY D.ARTI_COD
            INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO
            DO
            BEGIN
            COSTO = 0;
            FOR SELECT CTDE_CANT * CTDE_FACTOR, COTI_FECHA FROM cotizaciones_detalle D, cotizaciones F, PREFIJOS P
                WHERE F.coti_id = D.coti_id AND COTI_FECHA >= :FECINI AND COTI_FECHA <= :FECFIN AND
                COTI_ANULADO = 'N' AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 35 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                and D.ARTI_COD = :articulo  INTO :cantdet, :fecha
                DO
                BEGIN
                EXECUTE PROCEDURE costo_promedio_y_ultimo(:ARTICULO, :FECHA) returning_values (:costounit, :ultcos);
                /* EL FACTOR */
                FACCOST = 1;
                SELECT FIRST 1 FACO_FACTOR FROM factor_costo WHERE FACO_FECINI <= :FECHA AND FACO_FECFIN >= :FECHA INTO :FACCOST;
                ULTCOS = ULTCOS * FACCOST;
                COSTOUNIT = COSTOUNIT * FACCOST;

                if (ULTIMO = 'S') then
                    COSTO = COSTO + ultcos * cantdet;
                else
                    COSTO = COSTO + costounit * cantdet;
                END
            EXECUTE procedure nombres_grupos_inventario (CODGRUPO, CODSUBG, CODMARC)
                returning_values (NOMGRUPO, NOMSUBG, NOMMARC);
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            if (CEROS = 'S') then
                INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (2, USER, :ARTICULO);
            INSERT INTO REP_UTILIDAD(ID, TIPO, CODIGO, BASE, IVA, CONSUMO, COSTO, CANT)
                VALUES (:IDREP, 35, :articulo, :base, :iva, :consumo, :costo, :cantidad);
            END /* FOR */
        SELECT SUM(BASE-COSTO) FROM REP_UTILIDAD WHERE id = :IDREP AND TIPO = 35 INTO :TOTAL;
        FOR SELECT ARTI_COD, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD, TAIV_PORC FROM ARTICULO A, TARIFA_IVA T
            WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND
            (A.MARC_COD <= :MARFIN))) AND substring(a.arti_cod from 1 FOR 2) <> '.t' AND A.taiv_cod = T.taiv_cod
            INTO :ARTICULO, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :ivapor
            DO
            BEGIN
            EXECUTE procedure nombres_grupos_inventario (CODGRUPO, CODSUBG, CODMARC)
                returning_values (NOMGRUPO, NOMSUBG, NOMMARC);
            BASE = 0;
            IVA = 0;
            CONSUMO = 0;
            COSTO = 0;
            UTILIDAD = 0;
            PORC = 0;
            SELECT BASE, IVA, CONSUMO, COSTO, CANT FROM rep_utilidad WHERE ID = :IDREP AND TIPO = 35 AND CODIGO = :articulo
                INTO :BASE, :IVA, :consumo,  :costo, :cantidad;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            EXECUTE PROCEDURE PORCENTAJE (utilidad,  TOTAL, 'S') returning_values (part);
            if ((CEROS = 'S') or (BASE <> 0) or (COSTO <> 0)) then
                SUSPEND;
            END /* FOR */
        END
    END
ELSE
  if (DETALLE = 'G') then
    BEGIN
    if (BIN_AND(TIPO, 1) <> 0) then
        BEGIN
        TIPODOC = 31;
        FOR SELECT MAX(a.grup_cod), SUM((FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO)*FACT_FACTOR), SUM(FADE_IVAMONTO*FACT_FACTOR), SUM(FADE_CONSUMO)
            FROM FACTURAS_DETALLE D, FACTURAS F, PREFIJOS P, ARTICULO A
            WHERE F.FACT_ID = D.FACT_ID AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND D.ARTI_COD = A.arti_cod AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            FACT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) and substring(a.arti_cod from 1 FOR 2) <> '.t'
            GROUP BY a.grup_cod
            INTO :codgrupo, :BASE, :IVA, :CONSUMO
            DO
            BEGIN
            COSTO = 0;
            FOR SELECT D.fact_id, D.fade_item, D.arti_cod, FADE_CANT * FADE_FACTOR, FACT_FECHA
                FROM FACTURAS_DETALLE D, FACTURAS F, PREFIJOS P, ARTICULO A
                WHERE F.FACT_ID = D.FACT_ID AND D.arti_cod = A.arti_cod AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND
                FACT_ANULADO = 'N' AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                and a.grup_cod = :codgrupo INTO :id, :item, :ARTICULO, cantdet, :fecha
                DO
                BEGIN
                if (EXISTS (SELECT COST_SALP / COST_SALC FROM COSTOS C, MOVIMIENTO_ARTICULO M
                    WHERE COST_IDMOV = MVAR_CONS AND MVAR_TIPODOC = 31 AND MVAR_IDREF = :ID AND COST_SALC <> 0 AND MVAR_ITEM = :ITEM)) then
                    SELECT COST_SALP / COST_SALC, COST_ULTIMO FROM COSTOS C, MOVIMIENTO_ARTICULO M
                        WHERE COST_IDMOV = MVAR_CONS AND MVAR_TIPODOC = 31 AND MVAR_IDREF = :ID AND COST_SALC <> 0 AND MVAR_ITEM = :ITEM INTO :costounit, :ultcos;
                else
                    EXECUTE PROCEDURE costo_promedio_y_ultimo(:ARTICULO, :FECHA) returning_values (:costounit, :ultcos);
                if (costounit IS NULL) then
                    costounit = 0;
                if (ultcos IS NULL) then
                    ultcos = 0;
                /* EL FACTOR */
                FACCOST = 1;
                SELECT FIRST 1 FACO_FACTOR FROM factor_costo WHERE FACO_FECINI <= :FECHA AND FACO_FECFIN >= :FECHA INTO :FACCOST;
                ULTCOS = ULTCOS * FACCOST;
                COSTOUNIT = COSTOUNIT * FACCOST;

                if (ULTIMO = 'S') then
                    COSTO = COSTO + ultcos * cantdet;
                else
                    COSTO = COSTO + costounit * cantdet;
                END
            CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            INSERT INTO REP_UTILIDAD(ID, TIPO, CODIGO, BASE, IVA, CONSUMO, COSTO, CANT)
                VALUES (:IDREP, 31, :codgrupo, :base, :iva, :consumo, :costo, :cantidad);
            if (CEROS = 'S') then
                INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (2, USER, :codgrupo);
            END /* FOR */
        SELECT SUM(BASE-COSTO) FROM REP_UTILIDAD WHERE id = :IDREP AND TIPO = 31 INTO :TOTAL;
        FOR SELECT GRUP_COD, GRUP_NOM FROM GRUPO
            WHERE GRUP_COD >= :GRPINI AND GRUP_COD <= :grpfin
            INTO :ARTICULO, :DESCRIPCION
            DO
            BEGIN
            BASE = 0;
            IVA = 0;
            CONSUMO = 0;
            COSTO = 0;
            UTILIDAD = 0;
            PORC = 0;
            PART = 0;
            SELECT BASE, IVA, CONSUMO, COSTO, CANT FROM rep_utilidad WHERE ID = :IDREP AND TIPO = 31 AND CODIGO = :articulo
                INTO :BASE, :IVA, :consumo,  :costo, :cantidad;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            EXECUTE PROCEDURE PORCENTAJE (utilidad,  TOTAL, 'S') returning_values (part);
            if ((CEROS = 'S') or (BASE <> 0) or (COSTO <> 0)) then
                SUSPEND;
            END /* FOR */
            BEGIN
            COSTO = 0;
            END
        END
    if (BIN_AND(TIPO, 2) <> 0) then
        BEGIN
        TIPODOC = 32;
        FOR SELECT MAX(a.grup_cod), SUM(RVDE_TOTAL-RVDE_IVAMONTO-RVDE_CONSUMO), SUM(RVDE_IVAMONTO), SUM(RVDE_CONSUMO)
            FROM REMISIONES_VENTA_DETALLE D, REMISIONES_VENTA R, PREFIJOS P, ARTICULO A
            WHERE R.REVT_ID = D.REVT_ID AND P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = 32 AND D.ARTI_COD = A.arti_cod AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            REVT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY a.grup_cod
            INTO :codgrupo, :BASE, :IVA, :CONSUMO
            DO
            BEGIN
            COSTO = 0;
            FOR SELECT D.arti_cod, RVDE_CANT * RVDE_FACTOR, REVT_FECHA, F.REVT_ID, RVDE_ITEM
                FROM remisiones_venta_detalle D, remisiones_venta F, PREFIJOS P, ARTICULO A
                WHERE F.revt_id = D.revt_id AND A.arti_cod = D.arti_cod AND REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN AND
                REVT_ANULADO = 'N' AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 32 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                and a.grup_cod = :codgrupo INTO :ARTICULO, cantdet, :fecha, :ID, :ITEM
                DO
                BEGIN
                if (EXISTS (SELECT COST_SALP / COST_SALC FROM COSTOS C, MOVIMIENTO_ARTICULO M
                    WHERE COST_IDMOV = MVAR_CONS AND MVAR_TIPODOC = 32 AND MVAR_IDREF = :ID AND COST_SALC <> 0 AND MVAR_ITEM = :ITEM)) then
                    SELECT COST_SALP / COST_SALC, COST_ULTIMO FROM COSTOS C, MOVIMIENTO_ARTICULO M
                        WHERE COST_IDMOV = MVAR_CONS AND MVAR_TIPODOC = 32 AND MVAR_IDREF = :ID AND COST_SALC <> 0 AND MVAR_ITEM = :ITEM INTO :costounit, :ultcos;
                else
                    EXECUTE PROCEDURE costo_promedio_y_ultimo(:ARTICULO, :FECHA) returning_values (:costounit, :ultcos);
                if (costounit IS NULL) then
                    costounit = 0;
                if (ultcos IS NULL) then
                    ultcos = 0;
                /* EL FACTOR */
                FACCOST = 1;
                SELECT FIRST 1 FACO_FACTOR FROM factor_costo WHERE FACO_FECINI <= :FECHA AND FACO_FECFIN >= :FECHA INTO :FACCOST;
                ULTCOS = ULTCOS * FACCOST;
                COSTOUNIT = COSTOUNIT * FACCOST;

                if (ULTIMO = 'S') then
                    COSTO = COSTO + ultcos * cantdet;
                else
                    COSTO = COSTO + costounit * cantdet;
                END
            CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            if (CEROS = 'S') then
                INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (2, USER, :codgrupo);
            INSERT INTO REP_UTILIDAD(ID, TIPO, CODIGO, BASE, IVA, CONSUMO, COSTO, CANT)
                VALUES (:IDREP, 32, :codgrupo, :base, :iva, :consumo, :costo, :cantidad);
            END /* FOR */
        SELECT SUM(BASE-COSTO) FROM REP_UTILIDAD WHERE id = :IDREP AND TIPO = 32 INTO :TOTAL;
        FOR SELECT GRUP_COD, GRUP_NOM FROM GRUPO
            WHERE GRUP_COD >= :GRPINI AND GRUP_COD <= :grpfin
            INTO :ARTICULO, :DESCRIPCION
            DO
            BEGIN
            BASE = 0;
            IVA = 0;
            CONSUMO = 0;
            COSTO = 0;
            UTILIDAD = 0;
            PORC = 0;
            SELECT BASE, IVA, CONSUMO, COSTO, CANT FROM rep_utilidad WHERE ID = :IDREP AND TIPO = 32 AND CODIGO = :articulo
                INTO :BASE, :IVA, :consumo,  :costo, :cantidad;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            EXECUTE PROCEDURE PORCENTAJE (utilidad,  TOTAL, 'S') returning_values (part);
            if ((CEROS = 'S') or (BASE <> 0) or (COSTO <> 0)) then
                SUSPEND;
            END /* FOR */
        END
    if (BIN_AND(TIPO, 4) <> 0) then
        BEGIN
        TIPODOC = 33;
        FOR SELECT MAX(a.grup_cod), SUM((DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO)*DEVT_FACTOR), SUM(DVDE_IVAMONTO*DEVT_FACTOR), SUM(DVDE_CONSUMO)
            FROM devoluciones_ventas_detalle D, DEVOLUCIONES_VENTAS V, PREFIJOS P, ARTICULO A
            WHERE V.DEVT_ID = D.DEVT_ID AND P.PREF_PRE = V.PREF_PRE AND P.TIDO_COD = 33 AND D.ARTI_COD = A.arti_cod AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            DEVT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY a.grup_cod
            INTO :codgrupo, :BASE, :IVA, :CONSUMO
            DO
            BEGIN
            COSTO = 0;
            FOR SELECT D.arti_cod, DVDE_CANT * DVDE_FACTOR, DEVT_FECHA, F.devt_id, D.dvde_item FROM devoluciones_ventas_detalle D, devoluciones_ventas F, PREFIJOS P, ARTICULO A
                WHERE A.arti_cod = D.arti_cod AND F.devt_id = D.devt_id AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND
                DEVT_ANULADO = 'N' AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 33 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                and a.grup_cod = :codgrupo INTO :ARTICULO, cantdet, :fecha, :ID, :ITEM
                DO
                BEGIN
                if (EXISTS (SELECT COST_ENTP / COST_ENTC FROM COSTOS C, MOVIMIENTO_ARTICULO M
                    WHERE COST_IDMOV = MVAR_CONS AND MVAR_TIPODOC = 33 AND MVAR_IDREF = :ID AND COST_ENTC <> 0 AND MVAR_ITEM = :ITEM)) then
                    SELECT COST_ENTP / COST_ENTC, COST_ULTIMO FROM COSTOS C, MOVIMIENTO_ARTICULO M
                        WHERE COST_IDMOV = MVAR_CONS AND MVAR_TIPODOC = 33 AND MVAR_IDREF = :ID AND COST_ENTC <> 0 AND MVAR_ITEM = :ITEM INTO :costounit, :ultcos;
                else
                    EXECUTE PROCEDURE costo_promedio_y_ultimo(:ARTICULO, :FECHA) returning_values (:costounit, :ultcos);
                if (costounit IS NULL) then
                    costounit = 0;
                if (ultcos IS NULL) then
                    ultcos = 0;
                /* EL FACTOR */
                FACCOST = 1;
                SELECT FIRST 1 FACO_FACTOR FROM factor_costo WHERE FACO_FECINI <= :FECHA AND FACO_FECFIN >= :FECHA INTO :FACCOST;
                ULTCOS = ULTCOS * FACCOST;
                COSTOUNIT = COSTOUNIT * FACCOST;

                if (ULTIMO = 'S') then
                    COSTO = COSTO + ultcos * cantdet;
                else
                    COSTO = COSTO + costounit * cantdet;
                END
            CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            else
                BASE = BASE * -1;
            if (IVA IS NULL) then
                IVA = 0;
            else
                IVA = IVA * -1;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            else
                CONSUMO = CONSUMO * -1;
            COSTO = costo * -1;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            if (CEROS = 'S') then
                INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (2, USER, :codgrupo);
            INSERT INTO REP_UTILIDAD(ID, TIPO, CODIGO, BASE, IVA, CONSUMO, COSTO, CANT)
                VALUES (:IDREP, 33, :codgrupo, :base, :iva, :consumo, :costo, :cantidad);
            END /* FOR */
        SELECT SUM(BASE-COSTO) FROM REP_UTILIDAD WHERE id = :IDREP AND TIPO = 33 INTO :TOTAL;
        FOR SELECT GRUP_COD, GRUP_NOM FROM GRUPO
            WHERE GRUP_COD >= :GRPINI AND GRUP_COD <= :grpfin
            INTO :ARTICULO, :DESCRIPCION
            DO
            BEGIN
            BASE = 0;
            IVA = 0;
            CONSUMO = 0;
            COSTO = 0;
            UTILIDAD = 0;
            PORC = 0;
            SELECT BASE, IVA, CONSUMO, COSTO, CANT FROM rep_utilidad WHERE ID = :IDREP AND TIPO = 33 AND CODIGO = :articulo
                INTO :BASE, :IVA, :consumo,  :costo, :cantidad;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            EXECUTE PROCEDURE PORCENTAJE (utilidad,  TOTAL, 'S') returning_values (part);
            if ((CEROS = 'S') or (BASE <> 0) or (COSTO <> 0)) then
                SUSPEND;
            END /* FOR */
        END
    if (BIN_AND(TIPO, 8) <> 0) then
        BEGIN
        TIPODOC = 34;
        /* BORRA LA TABLA AUXILIAR */
        DELETE FROM reportes_aux WHERE REPA_ID = 2 AND REPA_USER = USER;

        FOR SELECT MAX(a.grup_cod), SUM((PEDE_TOTAL-PEDE_IVAMONTO-PEDE_CONSUMO)*PEDI_FACTOR), SUM(PEDE_IVAMONTO*PEDI_FACTOR), SUM(PEDE_CONSUMO)
            FROM PEDIDOS_DETALLE D, PEDIDOS P, PREFIJOS R, ARTICULO A
            WHERE P.PEDI_ID = D.PEDI_ID AND P.PREF_PRE = R.PREF_PRE AND R.TIDO_COD = 34 AND D.ARTI_COD = A.arti_cod AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            PEDI_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY a.grup_cod
            INTO :codgrupo, :BASE, :IVA, :CONSUMO
            DO
            BEGIN
            COSTO = 0;
            FOR SELECT MAX(D.arti_cod), SUM(PEDE_CANT * PEDE_FACTOR), MAX(pedi_FECHA) FROM pedidos_detalle D, pedidos F, PREFIJOS P, ARTICULO A
                WHERE A.arti_cod = D.arti_cod AND F.pedi_id = D.pedi_id AND PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND
                PEDI_ANULADO = 'N' AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 34 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                and a.grup_cod = :codgrupo GROUP BY D.ARTI_COD, PEDI_FECHA INTO :ARTICULO, cantdet, :fecha
                DO
                BEGIN
                EXECUTE PROCEDURE costo_promedio_y_ultimo(:ARTICULO, :FECHA) returning_values (:costounit, :ultcos);
                /* EL FACTOR */
                FACCOST = 1;
                SELECT FIRST 1 FACO_FACTOR FROM factor_costo WHERE FACO_FECINI <= :FECHA AND FACO_FECFIN >= :FECHA INTO :FACCOST;
                ULTCOS = ULTCOS * FACCOST;
                COSTOUNIT = COSTOUNIT * FACCOST;

                if (ULTIMO = 'S') then
                    COSTO = COSTO + ultcos * cantdet;
                else
                    COSTO = COSTO + costounit * cantdet;
                END
            CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            if (CEROS = 'S') then
                INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (2, USER, :codgrupo);
            INSERT INTO REP_UTILIDAD(ID, TIPO, CODIGO, BASE, IVA, CONSUMO, COSTO, CANT)
                VALUES (:IDREP, 34, :codgrupo, :base, :iva, :consumo, :costo, :cantidad);
            END /* FOR */
        SELECT SUM(BASE-COSTO) FROM REP_UTILIDAD WHERE id = :IDREP AND TIPO = 34 INTO :TOTAL;
        FOR SELECT GRUP_COD, GRUP_NOM FROM GRUPO
            WHERE GRUP_COD >= :GRPINI AND GRUP_COD <= :grpfin
            INTO :ARTICULO, :DESCRIPCION
            DO
            BEGIN
            BASE = 0;
            IVA = 0;
            CONSUMO = 0;
            COSTO = 0;
            UTILIDAD = 0;
            PORC = 0;
            SELECT BASE, IVA, CONSUMO, COSTO, CANT FROM rep_utilidad WHERE ID = :IDREP AND TIPO = 34 AND CODIGO = :articulo
                INTO :BASE, :IVA, :consumo,  :costo, :cantidad;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            EXECUTE PROCEDURE PORCENTAJE (utilidad,  TOTAL, 'S') returning_values (part);
            if ((CEROS = 'S') or (BASE <> 0) or (COSTO <> 0)) then
                SUSPEND;
            END /* FOR */
        END
    if (BIN_AND(TIPO, 16) <> 0) then
        BEGIN
        TIPODOC = 35;
        FOR SELECT MAX(a.grup_cod), SUM((CTDE_TOTAL-CTDE_IVAMONTO-CTDE_CONSUMO)*COTI_FACTOR), SUM(CTDE_IVAMONTO), SUM(CTDE_CONSUMO)
            FROM COTIZACIONES_DETALLE D, COTIZACIONES C, PREFIJOS P, ARTICULO A
            WHERE C.COTI_ID = D.COTI_ID AND P.PREF_PRE = C.PREF_PRE AND P.TIDO_COD = 35 AND D.ARTI_COD = A.arti_cod AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND COTI_FECHA >= :FECINI AND COTI_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            COTI_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY A.grup_cod
            INTO :codgrupo, :BASE, :IVA, :CONSUMO
            DO
            BEGIN
            COSTO = 0;
            FOR SELECT MAX(D.arti_cod), SUM(CTDE_CANT * CTDE_FACTOR), MAX(COTI_FECHA) FROM cotizaciones_detalle D, cotizaciones F, PREFIJOS P, ARTICULO A
                WHERE A.arti_cod = D.arti_cod AND F.coti_id = D.coti_id AND COTI_FECHA >= :FECINI AND COTI_FECHA <= :FECFIN AND
                COTI_ANULADO = 'N' AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 35 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                and a.grup_cod = :codgrupo GROUP BY D.ARTI_COD, COTI_FECHA INTO :ARTICULO, cantdet, :fecha
                DO
                BEGIN
                EXECUTE PROCEDURE costo_promedio_y_ultimo(:ARTICULO, :FECHA) returning_values (:costounit, :ultcos);
                /* EL FACTOR */
                FACCOST = 1;
                SELECT FIRST 1 FACO_FACTOR FROM factor_costo WHERE FACO_FECINI <= :FECHA AND FACO_FECFIN >= :FECHA INTO :FACCOST;
                ULTCOS = ULTCOS * FACCOST;
                COSTOUNIT = COSTOUNIT * FACCOST;

                if (ULTIMO = 'S') then
                    COSTO = COSTO + ultcos * cantdet;
                else
                    COSTO = COSTO + costounit * cantdet;
                END
            CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            if (CEROS = 'S') then
                INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (2, USER, :codgrupo);
            INSERT INTO REP_UTILIDAD(ID, TIPO, CODIGO, BASE, IVA, CONSUMO, COSTO, CANT)
                VALUES (:IDREP, 35, :codgrupo, :base, :iva, :consumo, :costo, :cantidad);
            END /* FOR */
        SELECT SUM(BASE-COSTO) FROM REP_UTILIDAD WHERE id = :IDREP AND TIPO = 35 INTO :TOTAL;
        FOR SELECT GRUP_COD, GRUP_NOM FROM GRUPO
            WHERE GRUP_COD >= :GRPINI AND GRUP_COD <= :grpfin
            INTO :ARTICULO, :DESCRIPCION
            DO
            BEGIN
            BASE = 0;
            IVA = 0;
            CONSUMO = 0;
            COSTO = 0;
            UTILIDAD = 0;
            PORC = 0;
            SELECT BASE, IVA, CONSUMO, COSTO, CANT FROM rep_utilidad WHERE ID = :IDREP AND TIPO = 35 AND CODIGO = :articulo
                INTO :BASE, :IVA, :consumo,  :costo, :cantidad;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            EXECUTE PROCEDURE PORCENTAJE (utilidad,  TOTAL, 'S') returning_values (part);
            if ((CEROS = 'S') or (BASE <> 0) or (COSTO <> 0)) then
                SUSPEND;
            END /* FOR */
        END
    END
  ELSE
    BEGIN
    if (BIN_AND(TIPO, 1) <> 0) then
        BEGIN
        TIPODOC = 31;
        FOR SELECT F.PREF_PRE, FACT_NUMERO, FACT_FECHA, D.ARTI_COD, FADE_CANT * FADE_FACTOR, (FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO)*FACT_FACTOR, FADE_IVAMONTO*FACT_FACTOR, FADE_CONSUMO,
            ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD, F.FACT_ID, FADE_ITEM, TAIV_PORC
            FROM FACTURAS F, FACTURAS_DETALLE D, PREFIJOS P, ARTICULO A, TARIFA_IVA T
            WHERE F.FACT_ID = D.FACT_ID AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND D.ARTI_COD = A.arti_cod AND
                A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
                A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND FACT_FECHA >= :FECINI AND A.taiv_cod = T.taiv_cod AND
                (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
                FACT_FECHA <= :FECFIN AND FACT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) and substring(a.arti_cod from 1 FOR 2) <> '.t'
            ORDER BY D.ARTI_COD, FACT_FECHA, F.FACT_ID, FADE_ITEM
            INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,
                :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :ID, :ITEM, :ivapor
            DO
            BEGIN
            EXECUTE procedure nombres_grupos_inventario (CODGRUPO, CODSUBG, CODMARC)
                returning_values (NOMGRUPO, NOMSUBG, NOMMARC);
            if (EXISTS (SELECT COST_SALP / COST_SALC FROM COSTOS C, MOVIMIENTO_ARTICULO M
                WHERE COST_IDMOV = MVAR_CONS AND MVAR_TIPODOC = 31 AND MVAR_IDREF = :ID AND COST_SALC <> 0 AND MVAR_ITEM = :ITEM)) then
                SELECT COST_SALP / COST_SALC, COST_ULTIMO FROM COSTOS C, MOVIMIENTO_ARTICULO M
                    WHERE COST_IDMOV = MVAR_CONS AND MVAR_TIPODOC = 31 AND MVAR_IDREF = :ID AND COST_SALC <> 0 AND MVAR_ITEM = :ITEM INTO :costounit, :ultcos;
            else
                EXECUTE PROCEDURE costo_promedio_y_ultimo(:ARTICULO, :FECHA) returning_values (:costounit, :ultcos);
            /* EL FACTOR */
            FACCOST = 1;
            SELECT FIRST 1 FACO_FACTOR FROM factor_costo WHERE FACO_FECINI <= :FECHA AND FACO_FECFIN >= :FECHA INTO :FACCOST;
            ULTCOS = ULTCOS * FACCOST;
            COSTOUNIT = COSTOUNIT * FACCOST;

            if (ULTIMO = 'S') then
                COSTO = ultcos * cantidad;
            else
                COSTO = costounit * cantidad;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            SUSPEND;
            END
        END
    if (BIN_AND(TIPO, 2) <> 0) then
        BEGIN
        TIPODOC = 32;
        FOR SELECT R.PREF_PRE, REVT_NUMERO, REVT_FECHA, D.ARTI_COD, RVDE_CANT * RVDE_FACTOR, RVDE_TOTAL-RVDE_IVAMONTO-RVDE_CONSUMO, RVDE_IVAMONTO, RVDE_CONSUMO,
            ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD, R.REVT_ID, RVDE_ITEM, TAIV_PORC
            FROM REMISIONES_VENTA R, REMISIONES_VENTA_DETALLE D, PREFIJOS P, ARTICULO A, TARIFA_IVA T
            WHERE R.REVT_ID = D.REVT_ID AND P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = 32 AND D.ARTI_COD = A.arti_cod AND
                A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
                A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN AND
                (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
                REVT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) AND A.taiv_cod = T.taiv_cod
            ORDER BY D.ARTI_COD, REVT_FECHA, R.REVT_ID, RVDE_ITEM
            INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,
                :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :ID, :ITEM, :ivapor
            DO
            BEGIN
            EXECUTE procedure nombres_grupos_inventario (CODGRUPO, CODSUBG, CODMARC)
                returning_values (NOMGRUPO, NOMSUBG, NOMMARC);
            if (EXISTS (SELECT COST_SALP / COST_SALC FROM COSTOS C, MOVIMIENTO_ARTICULO M
                WHERE COST_IDMOV = MVAR_CONS AND MVAR_TIPODOC = 32 AND MVAR_IDREF = :ID AND COST_SALC <> 0 AND MVAR_ITEM = :ITEM)) then
                SELECT COST_SALP / COST_SALC, COST_ULTIMO FROM COSTOS C, MOVIMIENTO_ARTICULO M
                    WHERE COST_IDMOV = MVAR_CONS AND MVAR_TIPODOC = 32 AND MVAR_IDREF = :ID AND COST_SALC <> 0 AND MVAR_ITEM = :ITEM INTO :costounit, :ultcos;
            else
                EXECUTE PROCEDURE costo_promedio_y_ultimo(:ARTICULO, :FECHA) returning_values (:costounit, :ultcos);
            /* EL FACTOR */
            FACCOST = 1;
            SELECT FIRST 1 FACO_FACTOR FROM factor_costo WHERE FACO_FECINI <= :FECHA AND FACO_FECFIN >= :FECHA INTO :FACCOST;
            ULTCOS = ULTCOS * FACCOST;
            COSTOUNIT = COSTOUNIT * FACCOST;

            if (ULTIMO = 'S') then
                COSTO = ultcos * cantidad;
            else
                COSTO = costounit * cantidad;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            SUSPEND;
            END
        END
    if (BIN_AND(TIPO, 4) <> 0) then
        BEGIN
        TIPODOC = 33;
        FOR SELECT V.PREF_PRE, DEVT_NUMERO, DEVT_FECHA, D.ARTI_COD, DVDE_CANT * DVDE_FACTOR, (DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO)*DEVT_FACTOR, DVDE_IVAMONTO*DEVT_FACTOR, DVDE_CONSUMO,
            ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD, V.DEVT_ID, DVDE_ITEM, TAIV_PORC
            FROM DEVOLUCIONES_VENTAS V, DEVOLUCIONES_VENTAS_DETALLE D, PREFIJOS P, ARTICULO A, TARIFA_IVA T
            WHERE V.DEVT_ID = D.DEVT_ID AND P.PREF_PRE = V.PREF_PRE AND P.TIDO_COD = 33 AND D.ARTI_COD = A.arti_cod AND
                A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
                A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND
                (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
                DEVT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) AND A.taiv_cod = T.taiv_cod
            ORDER BY D.ARTI_COD, DEVT_FECHA, V.DEVT_ID, DVDE_ITEM
            INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,
                :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :ID, :ITEM, :ivapor
            DO
            BEGIN
            EXECUTE procedure nombres_grupos_inventario (CODGRUPO, CODSUBG, CODMARC)
                returning_values (NOMGRUPO, NOMSUBG, NOMMARC);
            CANTIDAD = CANTIDAD * -1;
            if (EXISTS (SELECT COST_ENTP / COST_ENTC FROM COSTOS C, MOVIMIENTO_ARTICULO M
                WHERE COST_IDMOV = MVAR_CONS AND MVAR_TIPODOC = 33 AND MVAR_IDREF = :ID AND COST_ENTC <> 0 AND MVAR_ITEM = :ITEM)) then
                SELECT COST_ENTP / COST_ENTC, COST_ULTIMO FROM COSTOS C, MOVIMIENTO_ARTICULO M
                    WHERE COST_IDMOV = MVAR_CONS AND MVAR_TIPODOC = 33 AND MVAR_IDREF = :ID AND COST_ENTC <> 0 AND MVAR_ITEM = :ITEM INTO :costounit, :ultcos;
            else
                EXECUTE PROCEDURE costo_promedio_y_ultimo(:ARTICULO, :FECHA) returning_values (:costounit, :ultcos);
            /* EL FACTOR */
            FACCOST = 1;
            SELECT FIRST 1 FACO_FACTOR FROM factor_costo WHERE FACO_FECINI <= :FECHA AND FACO_FECFIN >= :FECHA INTO :FACCOST;
            ULTCOS = ULTCOS * FACCOST;
            COSTOUNIT = COSTOUNIT * FACCOST;

            if (ULTIMO = 'S') then
                COSTO = ultcos * cantidad;
            else
                COSTO = costounit * cantidad;
            BASE = BASE * -1;
            IVA = IVA * -1;
            CONSUMO = CONSUMO * -1;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            SUSPEND;
            END
        END
    if (BIN_AND(TIPO, 8) <> 0) then
        BEGIN
        TIPODOC = 34;
        FOR SELECT P.PREF_PRE, PEDI_NUMERO, PEDI_FECHA, D.ARTI_COD, PEDE_CANT * PEDE_FACTOR, (PEDE_TOTAL-PEDE_IVAMONTO-PEDE_CONSUMO)*PEDI_FACTOR, PEDE_IVAMONTO*PEDI_FACTOR, PEDE_CONSUMO,
            ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD, TAIV_PORC 
            FROM PEDIDOS P, PEDIDOS_DETALLE D, PREFIJOS R, ARTICULO A, TARIFA_IVA T
            WHERE P.PEDI_ID = D.PEDI_ID AND P.PREF_PRE = R.PREF_PRE AND R.TIDO_COD = 34 AND D.ARTI_COD = A.arti_cod AND
                A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
                A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND
                (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
                PEDI_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) AND A.taiv_cod = T.taiv_cod
            ORDER BY D.ARTI_COD, PEDI_FECHA, P.PEDI_ID, PEDE_ITEM
            INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,
                :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :ivapor
            DO
            BEGIN
            EXECUTE procedure nombres_grupos_inventario (CODGRUPO, CODSUBG, CODMARC)
                returning_values (NOMGRUPO, NOMSUBG, NOMMARC);
            EXECUTE PROCEDURE costo_promedio_y_ultimo(:ARTICULO, :FECHA) returning_values (:costounit, :ultcos);
            /* EL FACTOR */
            FACCOST = 1;
            SELECT FIRST 1 FACO_FACTOR FROM factor_costo WHERE FACO_FECINI <= :FECHA AND FACO_FECFIN >= :FECHA INTO :FACCOST;
            ULTCOS = ULTCOS * FACCOST;
            COSTOUNIT = COSTOUNIT * FACCOST;

            if (ULTIMO = 'S') then
                COSTO = ultcos * cantidad;
            else
                COSTO = costounit * cantidad;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            SUSPEND;
            END
        END
    if (BIN_AND(TIPO, 16) <> 0) then
        BEGIN
        TIPODOC = 35;
        FOR SELECT C.PREF_PRE, COTI_NUMERO, COTI_FECHA, D.ARTI_COD, CTDE_CANT * CTDE_FACTOR, (CTDE_TOTAL-CTDE_IVAMONTO-CTDE_CONSUMO)*COTI_FACTOR, CTDE_IVAMONTO*COTI_FACTOR, CTDE_CONSUMO,
            ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD, TAIV_PORC
            FROM COTIZACIONES C, COTIZACIONES_DETALLE D, PREFIJOS P, ARTICULO A, TARIFA_IVA T
            WHERE C.COTI_ID = D.COTI_ID AND P.PREF_PRE = C.PREF_PRE AND P.TIDO_COD = 35 AND D.ARTI_COD = A.arti_cod AND
                A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
                A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND COTI_FECHA >= :FECINI AND COTI_FECHA <= :FECFIN AND
                (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
                COTI_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) AND A.taiv_cod = T.taiv_cod
            ORDER BY D.ARTI_COD, COTI_FECHA, C.COTI_ID, CTDE_ITEM
            INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,
                :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :ivapor
            DO
            BEGIN
            EXECUTE procedure nombres_grupos_inventario (CODGRUPO, CODSUBG, CODMARC)
                returning_values (NOMGRUPO, NOMSUBG, NOMMARC);
            EXECUTE PROCEDURE costo_promedio_y_ultimo(:ARTICULO, :FECHA) returning_values (:costounit, :ultcos);
            /* EL FACTOR */
            FACCOST = 1;
            SELECT FIRST 1 FACO_FACTOR FROM factor_costo WHERE FACO_FECINI <= :FECHA AND FACO_FECFIN >= :FECHA INTO :FACCOST;
            ULTCOS = ULTCOS * FACCOST;
            COSTOUNIT = COSTOUNIT * FACCOST;

            if (ULTIMO = 'S') then
                COSTO = ultcos * cantidad;
            else
                COSTO = costounit * cantidad;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            SUSPEND;
            END
        END
    END
END
^

SET TERM ; ^


/* 20101028 */
/* SALDO INICIAL ERA EL FINAL DEL DIA Y NO EL INICIAL */

SET TERM ^ ;

CREATE OR ALTER procedure AUXILIAR_TERCERO_DESDE_HASTA (
    CUENTAINI varchar(20),
    CUENTAFIN varchar(20),
    TERCINI varchar(20),
    TERCFIN varchar(20),
    DESDE char(8),
    HASTA char(8),
    PROYINI varchar(4),
    PROYFIN varchar(4),
    CENTINI varchar(4),
    CENTFIN varchar(4),
    CEROS char(1))
returns (
    ID integer,
    CUENTA varchar(20),
    TIPOCOMP varchar(3),
    PREFIJO varchar(4),
    NUMERO varchar(6),
    FECHA char(8),
    CONCEPTO varchar(60),
    NIT varchar(15),
    DV char(1),
    REF varchar(20),
    BASE numeric(18,2),
    PORC numeric(9,4),
    DEBITO numeric(18,2),
    CREDITO numeric(18,2),
    PROYECTO varchar(4),
    CENTRO varchar(4),
    TIPOREF integer,
    IDREF integer,
    SALDO numeric(18,2),
    NOMCUENTA varchar(60),
    NOMTERCERO varchar(60),
    CUENTANIT varchar(40),
    SALDOFIN numeric(18,2),
    SALDOCTA numeric(18,2),
    SALDOCTAF numeric(18,2))
AS
declare variable NUMROWS INTEGER;
declare variable FECAUX CHAR(8);
BEGIN
EXECUTE PROCEDURE fecha_desde_conta (:DESDE) returning_values (:DESDE);
EXECUTE PROCEDURE fecha_y_numero_conta (:DESDE, -1) returning_values (:FECAUX);
for SELECT CUEN_COD, CUEN_NOM
    FROM CUENTAS
    WHERE CUEN_COD >= :CUENTAINI AND CUEN_COD <= :CUENTAFIN
     ORDER BY CUEN_COD
    INTO :CUENTA, :NOMCUENTA
    DO
    BEGIN
    EXECUTE PROCEDURE saldo_cuenta(:CUENTA, :DESDE) RETURNING_VALUES (:SALDOCTA);
    SALDOCTAF = SALDOCTA;
    FOR SELECT distinct TERC_NIT FROM saldos_terceros WHERE CUEN_COD = :CUENTA AND
        TERC_NIT >= :TERCINI AND TERC_NIT <= :TERCFIN ORDER BY TERC_NIT INTO :NIT
        DO
        BEGIN
        FOR SELECT distinct PROY_COD, CENT_COD FROM saldos_centros WHERE CUEN_COD = :CUENTA AND
            PROY_COD >= :proyini AND PROY_COD <= :proyfin AND CENT_COD >= :centini AND CENT_COD <= :centfin ORDER BY PROY_COD, CENT_COD
            INTO :proyecto, :centro
            DO
            BEGIN
            EXECUTE PROCEDURE saldo_centro_tercero(:CUENTA, :proyecto, :centro, :nit, :fecaux) returning_values (:SALDO);
            SALDOFIN = SALDO;
            CUENTANIT = CUENTA || NIT;
            SELECT TERC_NOM, TERC_DV FROM TERCEROS WHERE TERC_NIT = :nit INTO :NOMTERCERO, :DV;
            NUMROWS = 0;
            /* TRAE LOS MOV. DE LA CUENTA Y TERCERO DADOS */
            FOR SELECT E.ENCO_CONSEC, TICO_COD, PRCO_PREF, ENCO_NUMERO, ENCO_FECHA, D.CUEN_COD, CODE_CONCEPTO, D.TERC_NIT, CODE_REFER, CODE_BASE, CODE_PORC, CODE_DEBITO, CODE_CREDITO, D.PROY_COD, D.CENT_COD, ENCO_TIPOREF, ENCO_IDREF
                FROM COMPROBANTE_ENCABEZADO E, COMPROBANTE_DETALLE D
                WHERE E.ENCO_CONSEC = D.ENCO_CONSEC AND D.CUEN_COD = :CUENTA AND ENCO_FECHA >= :DESDE AND ENCO_FECHA <= :HASTA
                AND D.TERC_NIT = :NIT AND D.PROY_COD = :proyecto AND D.CENT_COD = :centro
                ORDER BY D.CUEN_COD, D.TERC_NIT, ENCO_FECHA, PRCO_PREF, ENCO_NUMERO
                INTO :ID, :TIPOCOMP, :PREFIJO, :NUMERO, :FECHA, :CUENTA, :CONCEPTO, :NIT, :REF, :BASE, :PORC, :DEBITO, :CREDITO, :PROYECTO, :centro, :TIPOREF, :IDREF
                DO
                BEGIN
                SALDOFIN = SALDOFIN + DEBITO - CREDITO;
                SALDOCTAF = SALDOCTAF + DEBITO - CREDITO;
                NUMROWS = NUMROWS + 1;
                SUSPEND;
                END
            if ((CEROS = 'S') AND (NUMROWS = 0)) then
                BEGIN
                SALDOFIN = SALDO;
                if (SALDO <> 0) then
                    BEGIN
                    ID = NULL;
                    TIPOCOMP = NULL;
                    PREFIJO = NULL;
                    NUMERO = NULL;
                    FECHA = NULL;
                    CONCEPTO = NULL;
                    REF = NULL;
                    BASE = 0;
                    PORC = 0;
                    DEBITO = 0;
                    CREDITO = 0;
                    PROYECTO = NULL;
                    CENTRO = NULL;
                    TIPOREF = 0;
                    IDREF = 0;
                    SUSPEND;
                    END
                END
            END
        END
    END
END
^

SET TERM ; ^



/* 20101028B */
/* descontaba mal los vencidos al tomar el año desde la fecha actual y no desde la ultima compra antes de año */
SET TERM ^ ;

CREATE OR ALTER procedure CONSULTA_PUNTOS_CLIENTE (
    IDDOC integer,
    CLIENTE varchar(20),
    FECHA date)
returns (
    PTDOC integer,
    PTACUM integer,
    PTVENCER integer,
    FECPTOS date)
AS
declare variable numrows integer;
declare variable anos integer;
declare variable fecaux date;
declare variable fecaux2 date;
declare variable nitcontado varchar(20);
declare variable ok integer;
declare variable ptaux integer;
declare variable ptagencia char(2);
begin
ptdoc = 0;
ptacum = 0;
ptvencer = 0;
FECPTOS = :FECHA;
ok = 1;
if (IDDOC <> 0) then
    begin
    /* verifique que no sea cliente de contado de la autorización */
    select max(auto_nitcontado) from facturas f, autorizaciones a
        where f.pref_pre = a.pref_pre and fact_id = :iddoc into :nitcontado;
    if (cliente = nitcontado) then
        ok = 0;

    if (ok <> 0) then
        begin
        select count(ptcl_id) from puntos_cliente where ptcl_nit = :cliente and ptcl_tipodoc = 31 and ptcl_iddoc = :iddoc into :numrows;
        if (numrows <> 0) then
            begin
            select SUM(ptcl_db-ptcl_cr) from puntos_cliente where ptcl_nit = :cliente and ptcl_tipodoc = 31 and ptcl_iddoc = :iddoc into :ptdoc;
            end
        end
    end
/* los puntos totales */
if (ok <> 0) then
  BEGIN
  EXECUTE PROCEDURE lee_configuracion ('FACTURACION', 'POS', 'MANEJAR TABLA DE PUNTOS DE CLIENTE ACUMULADOS PARA VARIAS AGENCIAS') returning_values (ptagencia);
  if (PTAGENCIA = 'SI') then
    BEGIN
    SELECT PTCA_ACUMULADO, PTCA_PORVENCER, PTCA_FECHA FROM puntos_cliente_acumulado WHERE TERC_NIT = :cliente
        INTO :ptacum, :ptvencer, :fecptos;
    SUSPEND;
    END
  ELSE
    BEGIN
    select first 1 ptcl_fecha, ptcl_saldo from puntos_cliente
        where ptcl_nit = :cliente and ptcl_fecha <= :fecha order by ptcl_fecha desc, PTCL_ID desc
        into :fecaux, :ptacum;
    select sum(ptcl_db - ptcl_cr) from puntos_cliente
        where ptcl_nit = :cliente and ptcl_fecha = :fecaux into :ptaux;
    ptacum = ptacum + ptaux;
    /* los vencidos */
    execute procedure lee_configuracion('FACTURACION', 'FACTURAS', 'VENCIMIENTO DE PUNTOS POR CLIENTE EN AÑOS') returning_values (:anos);
    fecaux = fecha - (anos * 365);
    select first 1 ptcl_fecha, ptcl_saldo from puntos_cliente
        where ptcl_nit = :cliente and ptcl_fecha <= :fecaux order by ptcl_fecha desc, ptcl_id desc
        into :fecaux2, :ptvencer;
    select sum(ptcl_db-ptcl_cr) from puntos_cliente
        where ptcl_nit = :cliente and ptcl_fecha = :fecaux2 into :ptaux;
    if (ptaux is null) then
        ptaux = 0;
    ptvencer = ptvencer + ptaux;

    /* al saldo de hace n años restele las redenciones entre esa fecha y hoy */
    ptaux = 0;
    select sum(ptcl_cr) from puntos_cliente where ptcl_nit = :cliente and ptcl_fecha >= :fecaux2 and
        ptcl_fecha <= (:fecaux2+(:anos * 365)) and ptcl_tipodoc = 81 into :ptaux;
    if (ptaux is null) then
        ptaux = 0;
    else
        if (ptaux > ptvencer) then
            begin
            PTAUX = PTAUX - ptvencer;
            ptvencer = 0;
            end
        else
            begin
            ptvencer = ptvencer - ptaux;
            ptaux = 0;
            end
    ptacum = ptacum - ptvencer;

    /* los por vencer */
    execute procedure lee_configuracion('FACTURACION', 'FACTURAS', 'VENCIMIENTO DE PUNTOS POR CLIENTE EN AÑOS') returning_values (:anos);
    fecaux = fecha - (anos * 365);
    fecaux2 = fecha - (anos * 365) + 30;
    select sum(ptcl_db - ptcl_cr) from puntos_cliente where ptcl_nit = :cliente and ptcl_fecha >= :fecaux and ptcl_fecha <= :fecaux2 into :ptvencer;
    if (ptvencer is null) then
        ptvencer = 0;
    ptvencer = ptvencer - ptaux;
    fecptos = :fecha;
    suspend;
    END
  END
ELSE
    SUSPEND;
end
^

SET TERM ; ^



/* 20101028C */
/* DESCONTAR DECRETO DEL CUADRE DIARIO, FALTA POR TARIFA */
SET TERM ^ ;

CREATE OR ALTER PROCEDURE CIERRE_FACTURACION (
    fecha date,
    punto integer,
    prefijo varchar(4))
returns (
    pref varchar(4),
    autoriza varchar(20),
    puntovta varchar(60),
    numini varchar(6),
    numfin varchar(6),
    nrofac integer,
    horaini time,
    horafin time,
    basefac numeric(18,2),
    ivafac numeric(18,2),
    totalfac numeric(18,2),
    nroite integer,
    nrodev integer,
    basedev numeric(18,2),
    ivadev numeric(18,2),
    totaldev numeric(18,2),
    baseneto numeric(18,2),
    ivaneto numeric(18,2),
    totalneto numeric(18,2),
    basef0 numeric(18,2),
    ivaf0 numeric(18,2),
    totalf0 numeric(18,2),
    based0 numeric(18,2),
    ivad0 numeric(18,2),
    totald0 numeric(18,2),
    basef1 numeric(18,2),
    ivaf1 numeric(18,2),
    totalf1 numeric(18,2),
    based1 numeric(18,2),
    ivad1 numeric(18,2),
    totald1 numeric(18,2),
    basef2 numeric(18,2),
    ivaf2 numeric(18,2),
    totalf2 numeric(18,2),
    based2 numeric(18,2),
    ivad2 numeric(18,2),
    totald2 numeric(18,2),
    basef3 numeric(18,2),
    ivaf3 numeric(18,2),
    totalf3 numeric(18,2),
    based3 numeric(18,2),
    ivad3 numeric(18,2),
    totald3 numeric(18,2),
    basef4 numeric(18,2),
    ivaf4 numeric(18,2),
    totalf4 numeric(18,2),
    based4 numeric(18,2),
    ivad4 numeric(18,2),
    totald4 numeric(18,2),
    formap1 numeric(18,2),
    formap2 numeric(18,2),
    formap3 numeric(18,2),
    formap4 numeric(18,2),
    formap5 numeric(18,2),
    formap6 numeric(18,2),
    formap7 numeric(18,2),
    formap8 numeric(18,2),
    formap9 numeric(18,2),
    formap10 numeric(18,2),
    formap11 numeric(18,2),
    formap12 numeric(18,2),
    cartera numeric(18,2),
    vendedor1 varchar(60),
    vtavend1 numeric(18,2),
    vendedor2 varchar(60),
    vtavend2 numeric(18,2),
    vendedor3 varchar(60),
    vtavend3 numeric(18,2),
    vendedor4 varchar(60),
    vtavend4 numeric(18,2),
    vendedor5 varchar(60),
    vtavend5 numeric(18,2),
    nrofactanul integer,
    ivanul numeric(18,2),
    totalfacanul numeric(18,2))
as
declare variable tarifa numeric(9,2);
declare variable basef numeric(18,2);
declare variable ivaf numeric(18,2);
declare variable totalf numeric(18,2);
declare variable basedv numeric(18,2);
declare variable ivad numeric(18,2);
declare variable totald numeric(18,2);
declare variable i integer;
declare variable codven integer;
declare variable vended varchar(60);
declare variable r_iddoc integer;
declare variable f_id integer;
declare variable f_total numeric(18,2);
declare variable factor numeric(18,4);
declare variable ajuste integer;
declare variable dec2799 numeric(18,2);
begin
AJUSTE = 0;
if (PREFIJO <> '') then
  SELECT PREF_PRE, AUTO_NUMERO FROM AUTORIZACIONES WHERE PREF_PRE = :PREFIJO INTO :PREF, :autoriza;
SELECT PTVT_NOM FROM PUNTO_VENTA WHERE PTVT_ID = :punto INTO :puntovta;
SELECT MIN(AUDI_HORA) FROM AUDITORIA WHERE TIDO_COD = 131 AND AUDI_FECHA = :FECHA INTO :HORAINI;
HORAFIN = CAST('NOW' AS TIME);
  /* LAS VENTAS */
  SELECT MIN(FACT_NUMERO), MAX(FACT_NUMERO), COUNT(FACT_NUMERO), SUM(FACT_TOTAL - FACT_IVAMONTO), SUM(FACT_IVAMONTO), SUM(FACT_TOTAL), sum(fact_dec2799)
    FROM FACTURAS WHERE FACT_FECHA = :FECHA AND PTVT_ID = :PUNTO AND ((PREF_PRE = :PREFIJO) or (:PREFIJO = '')) and FACT_ANULADO = 'N'
    INTO :NUMINI, :NUMFIN, :NROFAC, :BASENETO, :IVANETO, :TOTALNETO, :dec2799;
  SELECT COUNT(FADE_ITEM), SUM(FADE_TOTAL-FADE_IVAMONTO), SUM(FADE_IVAMONTO), SUM(FADE_TOTAL)
    FROM facturas_detalle D, FACTURAS F
    WHERE D.FACT_ID = F.FACT_ID AND FACT_FECHA = :FECHA AND PTVT_ID = :PUNTO AND ((PREF_PRE = :PREFIJO) or (:PREFIJO = '')) AND FADE_CANT > 0 and FACT_ANULADO = 'N' and substring(d.arti_cod from 1 FOR 2) <> '.t'
    INTO :nroite, :BASEFAC, :IVAFAC, :TOTALFAC;
  totalfac = totalfac - dec2799;
  ivafac = ivafac - dec2799;
  SELECT COUNT(FADE_ITEM), SUM(FADE_IVAMONTO-FADE_TOTAL), SUM(FADE_IVAMONTO*-1), SUM(FADE_TOTAL*-1)
    FROM facturas_detalle D, FACTURAS F
    WHERE D.FACT_ID = F.FACT_ID AND FACT_FECHA = :FECHA AND PTVT_ID = :PUNTO AND ((PREF_PRE = :PREFIJO) or (:PREFIJO = '')) AND FADE_CANT < 0 and FACT_ANULADO = 'N' and substring(d.arti_cod from 1 FOR 2) <> '.t'
    INTO :NRODEV, :BASEDEV, :IVADEV, :TOTALDEV;
  SELECT COUNT(DVDE_ITEM), SUM(DVDE_TOTAL-DVDE_IVAMONTO), SUM(DVDE_IVAMONTO), SUM(DVDE_TOTAL)
    FROM devoluciones_ventas_detalle D, devoluciones_ventas F
    WHERE D.DEVT_ID = F.DEVT_ID AND DEVT_FECHA = :FECHA AND PTVT_ID = :PUNTO AND DEVT_ANULADO = 'N' and substring(d.arti_cod from 1 FOR 2) <> '.t'
    INTO :I, :BASEDV, :IVAD, :TOTALD;
  select sum(devt_dec2799) FROM devoluciones_ventas WHERE DEVT_FECHA = :FECHA AND PTVT_ID = :PUNTO AND DEVT_ANULADO = 'N' into :dec2799;
  if (dec2799 is null) then
    dec2799 = 0;
  totald = totald - dec2799;
  ivad = ivad - dec2799;

  SELECT COUNT(FACT_NUMERO),SUM(FACT_TOTAL - FACT_IVAMONTO), SUM(FACT_IVAMONTO) FROM FACTURAS
    WHERE FACT_FECHA = :FECHA AND PTVT_ID = :PUNTO AND ((PREF_PRE = :PREFIJO) or (:PREFIJO = '')) and FACT_ANULADO = 'S'
    INTO :NROFACTANUL, :TOTALFACANUL, :IVANUL;
  if (nrofac is null) then
    nrofac = 0;
  if (NROFACTANUL is null) then
    NROFACTANUL = 0;
  if (TOTALFACANUL is null) then
    TOTALFACANUL = 0;
  if (IVANUL is null) then
    IVANUL = 0;
  if (baseneto is null) then
    baseneto = 0;
  if (ivaneto is null) then
    ivaneto = 0;
  if (totalneto is null) then
    totalneto = 0;
  if (nroite is null) then
    nroite = 0;
  if (basefac is null) then
    basefac = 0;
  if (ivafac is null) then
    ivafac = 0;
  if (totalfac is null) then
    totalfac = 0;
  if (nrodev is null) then
    nrodev = 0;
  if (basedev is null) then
    basedev = 0;
  if (ivadev is null) then
    ivadev = 0;
  if (totaldev is null) then
    totaldev = 0;
  if (I is null) then
    I = 0;
  if (basedv is null) then
    basedv = 0;
  if (ivad is null) then
    ivad = 0;
  if (totald is null) then
    totald = 0;
  NRODEV = NRODEV + I;
  BASENETO = BASENETO - BASEDV;
  IVANETO = IVANETO - IVAD;
  TOTALNETO = TOTALNETO - TOTALD;

  BASEDEV = BASEDEV + BASEDV;
  IVADEV = IVADEV + IVAD;
  TOTALDEV = TOTALDEV + TOTALD;

  /* POR TARIFA DE IVA */
  I = 0;
  BASEF0 = 0;
  BASED0 = 0;
  IVAF0 = 0;
  IVAD0 = 0;
  TOTALF0 = 0;
  TOTALD0 = 0;
  BASEF1 = 0;
  BASED1 = 0;
  IVAF1 = 0;
  IVAD1 = 0;
  TOTALF1 = 0;
  TOTALD1 = 0;
  BASEF2 = 0;
  BASED2 = 0;
  IVAF2 = 0;
  IVAD2 = 0;
  TOTALF2 = 0;
  TOTALD2 = 0;
  BASEF3 = 0;
  BASED3 = 0;
  IVAF3 = 0;
  IVAD3 = 0;
  TOTALF3 = 0;
  TOTALD3 = 0;
  BASEF4 = 0;
  BASED4 = 0;
  IVAF4 = 0;
  IVAD4 = 0;
  TOTALF4 = 0;
  TOTALD4 = 0;
  vtavend1 = 0;
  vtavend2 = 0;
  vtavend3 = 0;
  vtavend4 = 0;
  vtavend5 = 0;
  FOR SELECT TAIV_PORC FROM TARIFA_IVA ORDER BY TAIV_PORC INTO :TARIFA DO
    BEGIN
    I = I + 1;
    SELECT SUM(FADE_TOTAL-FADE_IVAMONTO), SUM(FADE_IVAMONTO), SUM(FADE_TOTAL) FROM facturas_detalle D, FACTURAS F
        WHERE D.FACT_ID = F.FACT_ID AND FACT_FECHA = :FECHA AND PTVT_ID = :PUNTO AND ((PREF_PRE = :PREFIJO) or (:PREFIJO = '')) AND FADE_CANT > 0 AND FADE_IVAPORC = :TARIFA and FACT_ANULADO = 'N'
        INTO :BASEF, :IVAF, :TOTALF;
    SELECT SUM(FADE_TOTAL-FADE_IVAMONTO), SUM(FADE_IVAMONTO), SUM(FADE_TOTAL) FROM facturas_detalle D, FACTURAS F
        WHERE D.FACT_ID = F.FACT_ID AND FACT_FECHA = :FECHA AND PTVT_ID = :PUNTO AND ((PREF_PRE = :PREFIJO) or (:PREFIJO = '')) AND FADE_CANT < 0 AND FADE_IVAPORC = :TARIFA and FACT_ANULADO = 'N'
        INTO :BASEDV, :IVAD, :TOTALD;
    if (basef is null) then
        basef = 0;
    if (ivaf is null) then
        ivaf = 0;
    if (totalf is null) then
        totalf = 0;
    if (basedv is null) then
        basedv = 0;
    if (ivad is null) then
        ivad = 0;
    if (totald is null) then
        totald = 0;

    FACTOR = 1;
    SELECT AJCI_FACTOR FROM ajuste_cierre WHERE AJCI_PORC = :TARIFA AND AJCI_FECINI <= :FECHA AND AJCI_FECFIN >= :FECHA INTO :FACTOR;
    if (FACTOR IS null) then
        FACTOR = 1;
    if (FACTOR <> 1) then
        AJUSTE = 1;
    BASEF = BASEF * FACTOR;
    BASEDV = BASEDV * FACTOR;
    IVAF = IVAF * FACTOR;
    IVAD = IVAD * FACTOR;
    TOTALF = TOTALF * FACTOR;
    TOTALD = TOTALD * FACTOR;

    if (I = 1) then
        BEGIN
        BASEF0 = BASEF;
        BASED0 = :BASEDV;
        IVAF0 = IVAF;
        IVAD0 = IVAD;
        TOTALF0 = TOTALF;
        TOTALD0 = TOTALD;
        SELECT SUM(DVDE_TOTAL-DVDE_IVAMONTO), SUM(DVDE_IVAMONTO), SUM(DVDE_TOTAL) FROM devoluciones_ventas_detalle D, devoluciones_ventas F
            WHERE D.DEVT_ID = F.DEVT_ID AND DEVT_FECHA = :FECHA AND PTVT_ID = :PUNTO AND DVDE_IVAPORC = :TARIFA and DEVT_ANULADO = 'N'
            INTO :BASEDV, :IVAD, :TOTALD;
        if (basedv is null) then
            basedv = 0;
        if (ivad is null) then
            ivad = 0;
        if (totald is null) then
            totald = 0;
        BASED0 = BASED0 - BASEDV;
        IVAD0 = IVAD0 - IVAD;
        TOTALD0 = TOTALD0 - TOTALD;
        END
    if (I = 2) then
        BEGIN
        BASEF1 = BASEF;
        BASED1 = :BASEDV;
        IVAF1 = IVAF;
        IVAD1 = IVAD;
        TOTALF1 = TOTALF;
        TOTALD1 = TOTALD;
        SELECT SUM(DVDE_TOTAL-DVDE_IVAMONTO), SUM(DVDE_IVAMONTO), SUM(DVDE_TOTAL) FROM devoluciones_ventas_detalle D, devoluciones_ventas F
            WHERE D.DEVT_ID = F.DEVT_ID AND DEVT_FECHA = :FECHA AND PTVT_ID = :PUNTO AND DVDE_IVAPORC = :TARIFA and DEVT_ANULADO = 'N'
            INTO :BASEDV, :IVAD, :TOTALD;
        if (basedv is null) then
            basedv = 0;
        if (ivad is null) then
            ivad = 0;
        if (totald is null) then
            totald = 0;
        BASED1 = BASED1 - BASEDV;
        IVAD1 = IVAD1 - IVAD;
        TOTALD1 = TOTALD1 - TOTALD;
        END
    if (I = 3) then
        BEGIN
        BASEF2 = BASEF;
        BASED2 = :BASEDV;
        IVAF2 = IVAF;
        IVAD2 = IVAD;
        TOTALF2 = TOTALF;
        TOTALD2 = TOTALD;
        SELECT SUM(DVDE_TOTAL-DVDE_IVAMONTO), SUM(DVDE_IVAMONTO), SUM(DVDE_TOTAL) FROM devoluciones_ventas_detalle D, devoluciones_ventas F
            WHERE D.DEVT_ID = F.DEVT_ID AND DEVT_FECHA = :FECHA AND PTVT_ID = :PUNTO AND DVDE_IVAPORC = :TARIFA and DEVT_ANULADO = 'N'
            INTO :BASEDV, :IVAD, :TOTALD;
        if (basedv is null) then
            basedv = 0;
        if (ivad is null) then
            ivad = 0;
        if (totald is null) then
            totald = 0;
        BASED2 = BASED2 - BASEDV;
        IVAD2 = IVAD2 - IVAD;
        TOTALD2 = TOTALD2 - TOTALD;
        END
    if (I = 4) then
        BEGIN
        BASEF3 = BASEF;
        BASED3 = :BASEDV;
        IVAF3 = IVAF;
        IVAD3 = IVAD;
        TOTALF3 = TOTALF;
        TOTALD3 = TOTALD;
        SELECT SUM(DVDE_TOTAL-DVDE_IVAMONTO), SUM(DVDE_IVAMONTO), SUM(DVDE_TOTAL) FROM devoluciones_ventas_detalle D, devoluciones_ventas F
            WHERE D.DEVT_ID = F.DEVT_ID AND DEVT_FECHA = :FECHA AND PTVT_ID = :PUNTO AND DVDE_IVAPORC = :TARIFA and DEVT_ANULADO = 'N'
            INTO :BASEDV, :IVAD, :TOTALD;
        if (basedv is null) then
            basedv = 0;
        if (ivad is null) then
            ivad = 0;
        if (totald is null) then
            totald = 0;
        BASED3 = BASED3 - BASEDV;
        IVAD3 = IVAD3 - IVAD;
        TOTALD3 = TOTALD3 - TOTALD;
        END
    if (I = 5) then
        BEGIN
        BASEF4 = BASEF;
        BASED4 = :BASEDV;
        IVAF4 = IVAF;
        IVAD4 = IVAD;
        TOTALF4 = TOTALF;
        TOTALD4 = TOTALD;
        SELECT SUM(DVDE_TOTAL-DVDE_IVAMONTO), SUM(DVDE_IVAMONTO), SUM(DVDE_TOTAL) FROM devoluciones_ventas_detalle D, devoluciones_ventas F
            WHERE D.DEVT_ID = F.DEVT_ID AND DEVT_FECHA = :FECHA AND PTVT_ID = :PUNTO AND DVDE_IVAPORC = :TARIFA and DEVT_ANULADO = 'N'
            INTO :BASEDV, :IVAD, :TOTALD;
        if (basedv is null) then
            basedv = 0;
        if (ivad is null) then
            ivad = 0;
        if (totald is null) then
            totald = 0;
        BASED4 = BASED4 - BASEDV;
        IVAD4 = IVAD4 - IVAD;
        TOTALD4 = TOTALD4 - TOTALD;
        END
    END
  /* POR FORMA DE PAGO */
  SELECT SUM(RCPA_MONTO) FROM RECIBOS_CAJA_PAGO P, RECIBOS_CAJA R, PUNTO_VENTA PT
    WHERE R.RECA_ID = P.RECA_ID AND PT.PTVT_ID = :punto AND RECA_FECHA = :FECHA AND PT.caja_id = R.caja_id AND ((PT.PREF_PRE = R.PREF_PRE) or (:PREFIJO = '')) AND FOPA_ID = 1 and RECA_ANULADO = 'N'
    INTO :FORMAP1;
  SELECT SUM(RCPA_MONTO) FROM RECIBOS_CAJA_PAGO P, RECIBOS_CAJA R, PUNTO_VENTA PT
    WHERE R.RECA_ID = P.RECA_ID AND PT.PTVT_ID = :punto AND RECA_FECHA = :FECHA AND PT.caja_id = R.caja_id AND ((PT.PREF_PRE = R.PREF_PRE) or (:PREFIJO = '')) AND FOPA_ID = 2 and RECA_ANULADO = 'N'
    INTO :FORMAP2;
  SELECT SUM(RCPA_MONTO) FROM RECIBOS_CAJA_PAGO P, RECIBOS_CAJA R, PUNTO_VENTA PT
    WHERE R.RECA_ID = P.RECA_ID AND PT.PTVT_ID = :punto AND RECA_FECHA = :FECHA AND PT.caja_id = R.caja_id AND ((PT.PREF_PRE = R.PREF_PRE) or (:PREFIJO = '')) AND FOPA_ID = 3 and RECA_ANULADO = 'N'
    INTO :FORMAP3;
  SELECT SUM(RCPA_MONTO) FROM RECIBOS_CAJA_PAGO P, RECIBOS_CAJA R, PUNTO_VENTA PT
    WHERE R.RECA_ID = P.RECA_ID AND PT.PTVT_ID = :punto AND RECA_FECHA = :FECHA AND PT.caja_id = R.caja_id AND ((PT.PREF_PRE = R.PREF_PRE) or (:PREFIJO = '')) AND FOPA_ID = 4 and RECA_ANULADO = 'N'
    INTO :FORMAP4;
  SELECT SUM(RCPA_MONTO) FROM RECIBOS_CAJA_PAGO P, RECIBOS_CAJA R, PUNTO_VENTA PT
    WHERE R.RECA_ID = P.RECA_ID AND PT.PTVT_ID = :punto AND RECA_FECHA = :FECHA AND PT.caja_id = R.caja_id AND ((PT.PREF_PRE = R.PREF_PRE) or (:PREFIJO = '')) AND FOPA_ID = 5 and RECA_ANULADO = 'N'
    INTO :FORMAP5;
  SELECT SUM(RCPA_MONTO) FROM RECIBOS_CAJA_PAGO P, RECIBOS_CAJA R, PUNTO_VENTA PT
    WHERE R.RECA_ID = P.RECA_ID AND PT.PTVT_ID = :punto AND RECA_FECHA = :FECHA AND PT.caja_id = R.caja_id AND ((PT.PREF_PRE = R.PREF_PRE) or (:PREFIJO = '')) AND FOPA_ID = 6 and RECA_ANULADO = 'N'
    INTO :FORMAP6;
  SELECT SUM(RCPA_MONTO) FROM RECIBOS_CAJA_PAGO P, RECIBOS_CAJA R, PUNTO_VENTA PT
    WHERE R.RECA_ID = P.RECA_ID AND PT.PTVT_ID = :punto AND RECA_FECHA = :FECHA AND PT.caja_id = R.caja_id AND ((PT.PREF_PRE = R.PREF_PRE) or (:PREFIJO = '')) AND FOPA_ID = 7 and RECA_ANULADO = 'N'
    INTO :FORMAP7;
  SELECT SUM(RCPA_MONTO) FROM RECIBOS_CAJA_PAGO P, RECIBOS_CAJA R, PUNTO_VENTA PT
    WHERE R.RECA_ID = P.RECA_ID AND PT.PTVT_ID = :punto AND RECA_FECHA = :FECHA AND PT.caja_id = R.caja_id AND ((PT.PREF_PRE = R.PREF_PRE) or (:PREFIJO = '')) AND FOPA_ID = 8 and RECA_ANULADO = 'N'
    INTO :FORMAP8;
  SELECT SUM(RCPA_MONTO) FROM RECIBOS_CAJA_PAGO P, RECIBOS_CAJA R, PUNTO_VENTA PT
    WHERE R.RECA_ID = P.RECA_ID AND PT.PTVT_ID = :punto AND RECA_FECHA = :FECHA AND PT.caja_id = R.caja_id AND ((PT.PREF_PRE = R.PREF_PRE) or (:PREFIJO = '')) AND FOPA_ID = 9 and RECA_ANULADO = 'N'
    INTO :FORMAP9;
  SELECT SUM(RCPA_MONTO) FROM RECIBOS_CAJA_PAGO P, RECIBOS_CAJA R, PUNTO_VENTA PT
    WHERE R.RECA_ID = P.RECA_ID AND PT.PTVT_ID = :punto AND RECA_FECHA = :FECHA AND PT.caja_id = R.caja_id AND ((PT.PREF_PRE = R.PREF_PRE) or (:PREFIJO = '')) AND FOPA_ID = 10 and RECA_ANULADO = 'N'
    INTO :FORMAP10;
  SELECT SUM(RCPA_MONTO) FROM RECIBOS_CAJA_PAGO P, RECIBOS_CAJA R, PUNTO_VENTA PT
    WHERE R.RECA_ID = P.RECA_ID AND PT.PTVT_ID = :punto AND RECA_FECHA = :FECHA AND PT.caja_id = R.caja_id AND ((PT.PREF_PRE = R.PREF_PRE) or (:PREFIJO = '')) AND FOPA_ID = 11 and RECA_ANULADO = 'N'
    INTO :FORMAP11;
  SELECT SUM(RCPA_MONTO) FROM RECIBOS_CAJA_PAGO P, RECIBOS_CAJA R, PUNTO_VENTA PT
    WHERE R.RECA_ID = P.RECA_ID AND PT.PTVT_ID = :punto AND RECA_FECHA = :FECHA AND PT.caja_id = R.caja_id AND ((PT.PREF_PRE = R.PREF_PRE) or (:PREFIJO = '')) AND FOPA_ID = 12 and RECA_ANULADO = 'N'
    INTO :FORMAP12;

  cartera = 0;
  for SELECT FACT_ID,FACT_TOTAL FROM FACTURAS WHERE FACT_FECHA = :FECHA AND PTVT_ID = :PUNTO AND ((PREF_PRE = :PREFIJO) or (:PREFIJO = '')) and FACT_ANULADO = 'N' into :f_id,:F_TOTAL
    do
    begin
     Select COUNT(D.RECA_ID) FROM recibos_caja_detalle D, RECIBOS_CAJA R where R.RECA_ID = D.RECA_ID AND R.RECA_FECHA = :FECHA AND RECA_ANULADO = 'N' and D.RCDE_tipodoc = 31 and D.RCDE_IDDOC = :f_id into :r_iddoc;
     if (r_iddoc = 0) then
       CARTERA = :cartera + :F_TOTAL;
    end
  if (formap1 is null) then
    formap1 = 0;
  if (formap2 is null) then
    formap2 = 0;
  if (formap3 is null) then
    formap3 = 0;
  if (formap4 is null) then
    formap4 = 0;
  if (formap5 is null) then
    formap5 = 0;
  if (formap6 is null) then
    formap6 = 0;
  if (formap7 is null) then
    formap7 = 0;
  if (formap8 is null) then
    formap8 = 0;
  if (formap9 is null) then
    formap9 = 0;
  if (formap10 is null) then
    formap10 = 0;
  if (formap11 is null) then
    formap11 = 0;
  if (formap12 is null) then
    formap12 = 0;
  if (cartera is null) then
    cartera = 0;
  I = 0;
  FOR SELECT MAX(F.VEND_COD), MAX(VEND_NOMBRE), SUM(FACT_TOTAL - FACT_IVAMONTO) FROM FACTURAS F, VENDEDORES V
    WHERE F.VEND_COD = V.VEND_COD AND FACT_FECHA = :FECHA AND F.PTVT_ID = :PUNTO AND ((PREF_PRE = :PREFIJO) or (:PREFIJO = '')) and FACT_ANULADO = 'N'
    GROUP BY F.VEND_COD ORDER BY F.VEND_COD
    INTO :CODVEN, :VENDED, :TOTALF
    DO
    BEGIN
    if (totalf IS NULL) then
        TOTALF = 0;
    SELECT SUM(DEVT_TOTAL - DEVT_IVAMONTO) FROM DEVOLUCIONES_VENTAS
        WHERE VEND_COD = :CODVEN AND DEVT_FECHA = :FECHA AND PTVT_ID = :PUNTO AND ((PREF_PRE = :PREFIJO) or (:PREFIJO = '')) and DEVT_ANULADO = 'N'
        INTO :totald;
    if (TOTALD IS NULL) then
        TOTALD = 0;
    if (I = 0) then
        BEGIN
        vendedor1 = VENDED;
        vtavend1 = TOTALF - TOTALD;
        END
    if (I = 1) then
        BEGIN
        vendedor2 = VENDED;
        vtavend2 = TOTALF - TOTALD;
        END
    if (I = 2) then
        BEGIN
        vendedor3 = VENDED;
        vtavend3 = TOTALF - TOTALD;
        END
    if (I = 3) then
        BEGIN
        vendedor4 = VENDED;
        vtavend4 = TOTALF - TOTALD;
        END
    if (I = 4) then
        BEGIN
        vendedor5 = VENDED;
        vtavend5 = TOTALF - TOTALD;
        END
    I = I + 1;
    END
  if (AJUSTE = 1) then
    BEGIN
    BASEFAC = BASEF0 + BASEF1 + BASEF2 + BASEF3 + BASEF4;
    IVAFAC = IVAF0 + IVAF1 + IVAF2 + IVAF3 + IVAF4;
    TOTALFAC = totalf0 + TOTALF1 + TOTALF2 + TOTALF3 + TOTALF4;
    BASEDEV = totald0 + TOTALD1 + TOTALD2 + TOTALD3 + TOTALD4;
    IVADEV = IVAD0 + IVAD1 + IVAD2 + IVAD3 + IVAD4;
    TOTALDEV = totald0 + TOTALD1 + totald2 + totald3 + totald4;
    BASENETO = basefac - basedev;
    IVANETO = ivafac - ivadev;
    if (totalneto <> 0) Then
        begin
        formap1 = formap1 * (totalfac - totaldev) / totalneto;
        formap2 = formap2 * (totalfac - totaldev) / totalneto;
        formap3 = formap3 * (totalfac - totaldev) / totalneto;
        formap4 = formap4 * (totalfac - totaldev) / totalneto;
        formap5 = formap5 * (totalfac - totaldev) / totalneto;
        formap6 = formap6 * (totalfac - totaldev) / totalneto;
        formap7 = formap7 * (totalfac - totaldev) / totalneto;
        formap8 = formap8 * (totalfac - totaldev) / totalneto;
        formap9 = formap9 * (totalfac - totaldev) / totalneto;
        formap10 = formap10 * (totalfac - totaldev) / totalneto;
        formap11 = formap11 * (totalfac - totaldev) / totalneto;
        formap12 = formap12 * (totalfac - totaldev) / totalneto;
        vtavend1 = vtavend1 * (totalfac - totaldev) / totalneto;
        vtavend2 = vtavend2 * (totalfac - totaldev) / totalneto;
        vtavend3 = vtavend3 * (totalfac - totaldev) / totalneto;
        vtavend4 = vtavend4 * (totalfac - totaldev) / totalneto;
        vtavend5 = vtavend5 * (totalfac - totaldev) / totalneto;
        end
    TOTALNETO = totalfac - totaldev;
    END
  INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
    VALUES (USER, 123, :punto, 'I', (:formap1+:formap2+:formap3+:formap4+:formap5+:CARTERA));
  suspend;
end
^

SET TERM ; ^



/* 20101029 */
/* FILTRE SOLAMENTE LOS TRASLADOS O COMPRAS DE LOS ULTIMOS DIAS SEGUN CONFIGURACION */

INSERT INTO CONFIGURACION (CONF_MODULO, CONF_CATEGORIA, CONF_PROPIEDAD, CONF_VALOR, CONF_POSIBLES, CONF_AYUDA) VALUES ('INVENTARIO', 'TRASLADOS', 'NUMERO DE DIAS PARA SUGERIR ORDEN DE INVENTARIO POR TRASLADOS', '30', '30,60,90,180,365', 'Indique el número de días que se tomaran en cuenta para seleccionar los artículos a sugerir en ordenes de inventario');
commit work;

SET TERM ^ ;

CREATE OR ALTER procedure ORDEN_SUGERIDA_BOD (
    PROVEEDOR varchar(20),
    BODEGA varchar(2),
    FECHA date)
returns (
    ARTICULO varchar(15),
    CANT numeric(18,4),
    UNIDAD varchar(8),
    COSTO numeric(18,2))
AS
declare variable FACTOR NUMERIC(15,4);
declare variable DIAS INTEGER;
declare variable EXISTENCIA NUMERIC(18,4);
declare variable PROMEDIO NUMERIC(18,4);
declare variable DIA_ART VARCHAR(2) CHARACTER SET NONE;
declare variable DIASC VARCHAR(255);
declare variable DIAST INTEGER;
declare variable SALIDAS NUMERIC(18,4);
declare variable FECDESDE DATE;
BEGIN
EXECUTE PROCEDURE lee_configuracion ('INVENTARIO', 'EXISTENCIAS', 'PROMEDIAR LAS SALIDAS DEL INVENTARIO CON EL NUMERO DE DIAS ASIGNADO A CADA ARTICULO') returning_values (:DIA_ART);
EXECUTE PROCEDURE lee_configuracion ('INVENTARIO', 'EXISTENCIAS', 'NUMERO DE DIAS PARA PROMEDIO DE SALIDAS POR ARTICULO') returning_values (DIASC);
EXECUTE PROCEDURE lee_configuracion ('INVENTARIO', 'TRASLADOS', 'NUMERO DE DIAS PARA SUGERIR ORDEN DE INVENTARIO POR TRASLADOS') returning_values (DIAST);
FECDESDE = FECHA - DIAST;
FOR SELECT a.ARTI_COD, PVAR_COSTO, ARTI_UNIDAD, ARTI_DIAS
    FROM proveedor_articulo p, articulo a
    WHERE TERC_NIT = :proveedor and p.arti_cod = a.arti_cod and esar_cod <> 'I' AND PVAR_FECHA >= :FECDESDE
    INTO :articulo, :costo, :unidad, :DIAS
    DO
    begin
    execute procedure saldo_inventario (:articulo, :bodega, :fecha) returning_values (:Existencia);
    EXECUTE PROCEDURE FACTOR_UNIDAD_CANT(:ARTICULO, :UNIDAD) returning_values (:FACTOR);
    if (FACTOR <> 0) then
        EXISTENCIA = EXISTENCIA / FACTOR;
    else
        EXISTENCIA = 0;
    EXECUTE PROCEDURE promedio_salidas_articulo (:ARTICULO, :FECHA, :BODEGA) returning_values (:PROMEDIO, :SALIDAS);
    if (DIA_ART = 'NO') then
        BEGIN
        DIAS = CAST(DIASC AS INTEGER);
        END
    if (DIAS is null) then
        DIAS = 0;
    PROMEDIO = DIAS * PROMEDIO;
    if (FACTOR <> 0) then
        PROMEDIO = PROMEDIO / FACTOR;
    CANT = PROMEDIO - EXISTENCIA;
    if (CANT > 0) then
        SUSPEND;
    end
END
^

SET TERM ; ^


/* 20101030 */
/* INCLUIR DEVOLUCIONES EN TOTAL CARTERA */
SET TERM ^ ;

CREATE OR ALTER procedure CIERRE_FACTURACION (
    FECHA date,
    PUNTO integer,
    PREFIJO varchar(4))
returns (
    PREF varchar(4),
    AUTORIZA varchar(20),
    PUNTOVTA varchar(60),
    NUMINI varchar(6),
    NUMFIN varchar(6),
    NROFAC integer,
    HORAINI time,
    HORAFIN time,
    BASEFAC numeric(18,2),
    IVAFAC numeric(18,2),
    TOTALFAC numeric(18,2),
    NROITE integer,
    NRODEV integer,
    BASEDEV numeric(18,2),
    IVADEV numeric(18,2),
    TOTALDEV numeric(18,2),
    BASENETO numeric(18,2),
    IVANETO numeric(18,2),
    TOTALNETO numeric(18,2),
    BASEF0 numeric(18,2),
    IVAF0 numeric(18,2),
    TOTALF0 numeric(18,2),
    BASED0 numeric(18,2),
    IVAD0 numeric(18,2),
    TOTALD0 numeric(18,2),
    BASEF1 numeric(18,2),
    IVAF1 numeric(18,2),
    TOTALF1 numeric(18,2),
    BASED1 numeric(18,2),
    IVAD1 numeric(18,2),
    TOTALD1 numeric(18,2),
    BASEF2 numeric(18,2),
    IVAF2 numeric(18,2),
    TOTALF2 numeric(18,2),
    BASED2 numeric(18,2),
    IVAD2 numeric(18,2),
    TOTALD2 numeric(18,2),
    BASEF3 numeric(18,2),
    IVAF3 numeric(18,2),
    TOTALF3 numeric(18,2),
    BASED3 numeric(18,2),
    IVAD3 numeric(18,2),
    TOTALD3 numeric(18,2),
    BASEF4 numeric(18,2),
    IVAF4 numeric(18,2),
    TOTALF4 numeric(18,2),
    BASED4 numeric(18,2),
    IVAD4 numeric(18,2),
    TOTALD4 numeric(18,2),
    FORMAP1 numeric(18,2),
    FORMAP2 numeric(18,2),
    FORMAP3 numeric(18,2),
    FORMAP4 numeric(18,2),
    FORMAP5 numeric(18,2),
    FORMAP6 numeric(18,2),
    FORMAP7 numeric(18,2),
    FORMAP8 numeric(18,2),
    FORMAP9 numeric(18,2),
    FORMAP10 numeric(18,2),
    FORMAP11 numeric(18,2),
    FORMAP12 numeric(18,2),
    CARTERA numeric(18,2),
    VENDEDOR1 varchar(60),
    VTAVEND1 numeric(18,2),
    VENDEDOR2 varchar(60),
    VTAVEND2 numeric(18,2),
    VENDEDOR3 varchar(60),
    VTAVEND3 numeric(18,2),
    VENDEDOR4 varchar(60),
    VTAVEND4 numeric(18,2),
    VENDEDOR5 varchar(60),
    VTAVEND5 numeric(18,2),
    NROFACTANUL integer,
    IVANUL numeric(18,2),
    TOTALFACANUL numeric(18,2))
AS
declare variable tarifa numeric(9,2);
declare variable basef numeric(18,2);
declare variable ivaf numeric(18,2);
declare variable totalf numeric(18,2);
declare variable basedv numeric(18,2);
declare variable ivad numeric(18,2);
declare variable totald numeric(18,2);
declare variable i integer;
declare variable codven integer;
declare variable vended varchar(60);
declare variable r_iddoc integer;
declare variable f_id integer;
declare variable f_total numeric(18,2);
declare variable factor numeric(18,4);
declare variable ajuste integer;
declare variable dec2799 numeric(18,2);
declare variable RETES NUMERIC(18,2);
begin
AJUSTE = 0;
if (PREFIJO <> '') then
  SELECT PREF_PRE, AUTO_NUMERO FROM AUTORIZACIONES WHERE PREF_PRE = :PREFIJO INTO :PREF, :autoriza;
SELECT PTVT_NOM FROM PUNTO_VENTA WHERE PTVT_ID = :punto INTO :puntovta;
SELECT MIN(AUDI_HORA) FROM AUDITORIA WHERE TIDO_COD = 131 AND AUDI_FECHA = :FECHA INTO :HORAINI;
HORAFIN = CAST('NOW' AS TIME);
  /* LAS VENTAS */
  SELECT MIN(FACT_NUMERO), MAX(FACT_NUMERO), COUNT(FACT_NUMERO), SUM(FACT_TOTAL - FACT_IVAMONTO), SUM(FACT_IVAMONTO), SUM(FACT_TOTAL), sum(fact_dec2799)
    FROM FACTURAS WHERE FACT_FECHA = :FECHA AND PTVT_ID = :PUNTO AND ((PREF_PRE = :PREFIJO) or (:PREFIJO = '')) and FACT_ANULADO = 'N'
    INTO :NUMINI, :NUMFIN, :NROFAC, :BASENETO, :IVANETO, :TOTALNETO, :dec2799;
  SELECT COUNT(FADE_ITEM), SUM(FADE_TOTAL-FADE_IVAMONTO), SUM(FADE_IVAMONTO), SUM(FADE_TOTAL)
    FROM facturas_detalle D, FACTURAS F
    WHERE D.FACT_ID = F.FACT_ID AND FACT_FECHA = :FECHA AND PTVT_ID = :PUNTO AND ((PREF_PRE = :PREFIJO) or (:PREFIJO = '')) AND FADE_CANT > 0 and FACT_ANULADO = 'N' and substring(d.arti_cod from 1 FOR 2) <> '.t'
    INTO :nroite, :BASEFAC, :IVAFAC, :TOTALFAC;
  totalfac = totalfac - dec2799;
  ivafac = ivafac - dec2799;
  SELECT COUNT(FADE_ITEM), SUM(FADE_IVAMONTO-FADE_TOTAL), SUM(FADE_IVAMONTO*-1), SUM(FADE_TOTAL*-1)
    FROM facturas_detalle D, FACTURAS F
    WHERE D.FACT_ID = F.FACT_ID AND FACT_FECHA = :FECHA AND PTVT_ID = :PUNTO AND ((PREF_PRE = :PREFIJO) or (:PREFIJO = '')) AND FADE_CANT < 0 and FACT_ANULADO = 'N' and substring(d.arti_cod from 1 FOR 2) <> '.t'
    INTO :NRODEV, :BASEDEV, :IVADEV, :TOTALDEV;
  SELECT COUNT(DVDE_ITEM), SUM(DVDE_TOTAL-DVDE_IVAMONTO), SUM(DVDE_IVAMONTO), SUM(DVDE_TOTAL)
    FROM devoluciones_ventas_detalle D, devoluciones_ventas F
    WHERE D.DEVT_ID = F.DEVT_ID AND DEVT_FECHA = :FECHA AND PTVT_ID = :PUNTO AND DEVT_ANULADO = 'N' and substring(d.arti_cod from 1 FOR 2) <> '.t'
    INTO :I, :BASEDV, :IVAD, :TOTALD;
  select sum(devt_dec2799) FROM devoluciones_ventas WHERE DEVT_FECHA = :FECHA AND PTVT_ID = :PUNTO AND DEVT_ANULADO = 'N' into :dec2799;
  if (dec2799 is null) then
    dec2799 = 0;
  totald = totald - dec2799;
  ivad = ivad - dec2799;

  SELECT COUNT(FACT_NUMERO),SUM(FACT_TOTAL - FACT_IVAMONTO), SUM(FACT_IVAMONTO) FROM FACTURAS
    WHERE FACT_FECHA = :FECHA AND PTVT_ID = :PUNTO AND ((PREF_PRE = :PREFIJO) or (:PREFIJO = '')) and FACT_ANULADO = 'S'
    INTO :NROFACTANUL, :TOTALFACANUL, :IVANUL;
  if (nrofac is null) then
    nrofac = 0;
  if (NROFACTANUL is null) then
    NROFACTANUL = 0;
  if (TOTALFACANUL is null) then
    TOTALFACANUL = 0;
  if (IVANUL is null) then
    IVANUL = 0;
  if (baseneto is null) then
    baseneto = 0;
  if (ivaneto is null) then
    ivaneto = 0;
  if (totalneto is null) then
    totalneto = 0;
  if (nroite is null) then
    nroite = 0;
  if (basefac is null) then
    basefac = 0;
  if (ivafac is null) then
    ivafac = 0;
  if (totalfac is null) then
    totalfac = 0;
  if (nrodev is null) then
    nrodev = 0;
  if (basedev is null) then
    basedev = 0;
  if (ivadev is null) then
    ivadev = 0;
  if (totaldev is null) then
    totaldev = 0;
  if (I is null) then
    I = 0;
  if (basedv is null) then
    basedv = 0;
  if (ivad is null) then
    ivad = 0;
  if (totald is null) then
    totald = 0;
  NRODEV = NRODEV + I;
  BASENETO = BASENETO - BASEDV;
  IVANETO = IVANETO - IVAD;
  TOTALNETO = TOTALNETO - TOTALD;

  BASEDEV = BASEDEV + BASEDV;
  IVADEV = IVADEV + IVAD;
  TOTALDEV = TOTALDEV + TOTALD;

  /* POR TARIFA DE IVA */
  I = 0;
  BASEF0 = 0;
  BASED0 = 0;
  IVAF0 = 0;
  IVAD0 = 0;
  TOTALF0 = 0;
  TOTALD0 = 0;
  BASEF1 = 0;
  BASED1 = 0;
  IVAF1 = 0;
  IVAD1 = 0;
  TOTALF1 = 0;
  TOTALD1 = 0;
  BASEF2 = 0;
  BASED2 = 0;
  IVAF2 = 0;
  IVAD2 = 0;
  TOTALF2 = 0;
  TOTALD2 = 0;
  BASEF3 = 0;
  BASED3 = 0;
  IVAF3 = 0;
  IVAD3 = 0;
  TOTALF3 = 0;
  TOTALD3 = 0;
  BASEF4 = 0;
  BASED4 = 0;
  IVAF4 = 0;
  IVAD4 = 0;
  TOTALF4 = 0;
  TOTALD4 = 0;
  vtavend1 = 0;
  vtavend2 = 0;
  vtavend3 = 0;
  vtavend4 = 0;
  vtavend5 = 0;
  FOR SELECT TAIV_PORC FROM TARIFA_IVA ORDER BY TAIV_PORC INTO :TARIFA DO
    BEGIN
    I = I + 1;
    SELECT SUM(FADE_TOTAL-FADE_IVAMONTO), SUM(FADE_IVAMONTO), SUM(FADE_TOTAL) FROM facturas_detalle D, FACTURAS F
        WHERE D.FACT_ID = F.FACT_ID AND FACT_FECHA = :FECHA AND PTVT_ID = :PUNTO AND ((PREF_PRE = :PREFIJO) or (:PREFIJO = '')) AND FADE_CANT > 0 AND FADE_IVAPORC = :TARIFA and FACT_ANULADO = 'N'
        INTO :BASEF, :IVAF, :TOTALF;
    SELECT SUM(FADE_TOTAL-FADE_IVAMONTO), SUM(FADE_IVAMONTO), SUM(FADE_TOTAL) FROM facturas_detalle D, FACTURAS F
        WHERE D.FACT_ID = F.FACT_ID AND FACT_FECHA = :FECHA AND PTVT_ID = :PUNTO AND ((PREF_PRE = :PREFIJO) or (:PREFIJO = '')) AND FADE_CANT < 0 AND FADE_IVAPORC = :TARIFA and FACT_ANULADO = 'N'
        INTO :BASEDV, :IVAD, :TOTALD;
    if (basef is null) then
        basef = 0;
    if (ivaf is null) then
        ivaf = 0;
    if (totalf is null) then
        totalf = 0;
    if (basedv is null) then
        basedv = 0;
    if (ivad is null) then
        ivad = 0;
    if (totald is null) then
        totald = 0;

    FACTOR = 1;
    SELECT AJCI_FACTOR FROM ajuste_cierre WHERE AJCI_PORC = :TARIFA AND AJCI_FECINI <= :FECHA AND AJCI_FECFIN >= :FECHA INTO :FACTOR;
    if (FACTOR IS null) then
        FACTOR = 1;
    if (FACTOR <> 1) then
        AJUSTE = 1;
    BASEF = BASEF * FACTOR;
    BASEDV = BASEDV * FACTOR;
    IVAF = IVAF * FACTOR;
    IVAD = IVAD * FACTOR;
    TOTALF = TOTALF * FACTOR;
    TOTALD = TOTALD * FACTOR;

    if (I = 1) then
        BEGIN
        BASEF0 = BASEF;
        BASED0 = :BASEDV;
        IVAF0 = IVAF;
        IVAD0 = IVAD;
        TOTALF0 = TOTALF;
        TOTALD0 = TOTALD;
        SELECT SUM(DVDE_TOTAL-DVDE_IVAMONTO), SUM(DVDE_IVAMONTO), SUM(DVDE_TOTAL) FROM devoluciones_ventas_detalle D, devoluciones_ventas F
            WHERE D.DEVT_ID = F.DEVT_ID AND DEVT_FECHA = :FECHA AND PTVT_ID = :PUNTO AND DVDE_IVAPORC = :TARIFA and DEVT_ANULADO = 'N'
            INTO :BASEDV, :IVAD, :TOTALD;
        if (basedv is null) then
            basedv = 0;
        if (ivad is null) then
            ivad = 0;
        if (totald is null) then
            totald = 0;
        BASED0 = BASED0 - BASEDV;
        IVAD0 = IVAD0 - IVAD;
        TOTALD0 = TOTALD0 - TOTALD;
        END
    if (I = 2) then
        BEGIN
        BASEF1 = BASEF;
        BASED1 = :BASEDV;
        IVAF1 = IVAF;
        IVAD1 = IVAD;
        TOTALF1 = TOTALF;
        TOTALD1 = TOTALD;
        SELECT SUM(DVDE_TOTAL-DVDE_IVAMONTO), SUM(DVDE_IVAMONTO), SUM(DVDE_TOTAL) FROM devoluciones_ventas_detalle D, devoluciones_ventas F
            WHERE D.DEVT_ID = F.DEVT_ID AND DEVT_FECHA = :FECHA AND PTVT_ID = :PUNTO AND DVDE_IVAPORC = :TARIFA and DEVT_ANULADO = 'N'
            INTO :BASEDV, :IVAD, :TOTALD;
        if (basedv is null) then
            basedv = 0;
        if (ivad is null) then
            ivad = 0;
        if (totald is null) then
            totald = 0;
        BASED1 = BASED1 - BASEDV;
        IVAD1 = IVAD1 - IVAD;
        TOTALD1 = TOTALD1 - TOTALD;
        END
    if (I = 3) then
        BEGIN
        BASEF2 = BASEF;
        BASED2 = :BASEDV;
        IVAF2 = IVAF;
        IVAD2 = IVAD;
        TOTALF2 = TOTALF;
        TOTALD2 = TOTALD;
        SELECT SUM(DVDE_TOTAL-DVDE_IVAMONTO), SUM(DVDE_IVAMONTO), SUM(DVDE_TOTAL) FROM devoluciones_ventas_detalle D, devoluciones_ventas F
            WHERE D.DEVT_ID = F.DEVT_ID AND DEVT_FECHA = :FECHA AND PTVT_ID = :PUNTO AND DVDE_IVAPORC = :TARIFA and DEVT_ANULADO = 'N'
            INTO :BASEDV, :IVAD, :TOTALD;
        if (basedv is null) then
            basedv = 0;
        if (ivad is null) then
            ivad = 0;
        if (totald is null) then
            totald = 0;
        BASED2 = BASED2 - BASEDV;
        IVAD2 = IVAD2 - IVAD;
        TOTALD2 = TOTALD2 - TOTALD;
        END
    if (I = 4) then
        BEGIN
        BASEF3 = BASEF;
        BASED3 = :BASEDV;
        IVAF3 = IVAF;
        IVAD3 = IVAD;
        TOTALF3 = TOTALF;
        TOTALD3 = TOTALD;
        SELECT SUM(DVDE_TOTAL-DVDE_IVAMONTO), SUM(DVDE_IVAMONTO), SUM(DVDE_TOTAL) FROM devoluciones_ventas_detalle D, devoluciones_ventas F
            WHERE D.DEVT_ID = F.DEVT_ID AND DEVT_FECHA = :FECHA AND PTVT_ID = :PUNTO AND DVDE_IVAPORC = :TARIFA and DEVT_ANULADO = 'N'
            INTO :BASEDV, :IVAD, :TOTALD;
        if (basedv is null) then
            basedv = 0;
        if (ivad is null) then
            ivad = 0;
        if (totald is null) then
            totald = 0;
        BASED3 = BASED3 - BASEDV;
        IVAD3 = IVAD3 - IVAD;
        TOTALD3 = TOTALD3 - TOTALD;
        END
    if (I = 5) then
        BEGIN
        BASEF4 = BASEF;
        BASED4 = :BASEDV;
        IVAF4 = IVAF;
        IVAD4 = IVAD;
        TOTALF4 = TOTALF;
        TOTALD4 = TOTALD;
        SELECT SUM(DVDE_TOTAL-DVDE_IVAMONTO), SUM(DVDE_IVAMONTO), SUM(DVDE_TOTAL) FROM devoluciones_ventas_detalle D, devoluciones_ventas F
            WHERE D.DEVT_ID = F.DEVT_ID AND DEVT_FECHA = :FECHA AND PTVT_ID = :PUNTO AND DVDE_IVAPORC = :TARIFA and DEVT_ANULADO = 'N'
            INTO :BASEDV, :IVAD, :TOTALD;
        if (basedv is null) then
            basedv = 0;
        if (ivad is null) then
            ivad = 0;
        if (totald is null) then
            totald = 0;
        BASED4 = BASED4 - BASEDV;
        IVAD4 = IVAD4 - IVAD;
        TOTALD4 = TOTALD4 - TOTALD;
        END
    END
  /* POR FORMA DE PAGO */
  SELECT SUM(RCPA_MONTO) FROM RECIBOS_CAJA_PAGO P, RECIBOS_CAJA R, PUNTO_VENTA PT
    WHERE R.RECA_ID = P.RECA_ID AND PT.PTVT_ID = :punto AND RECA_FECHA = :FECHA AND PT.caja_id = R.caja_id AND ((PT.PREF_PRE = R.PREF_PRE) or (:PREFIJO = '')) AND FOPA_ID = 1 and RECA_ANULADO = 'N'
    INTO :FORMAP1;
  SELECT SUM(RCPA_MONTO) FROM RECIBOS_CAJA_PAGO P, RECIBOS_CAJA R, PUNTO_VENTA PT
    WHERE R.RECA_ID = P.RECA_ID AND PT.PTVT_ID = :punto AND RECA_FECHA = :FECHA AND PT.caja_id = R.caja_id AND ((PT.PREF_PRE = R.PREF_PRE) or (:PREFIJO = '')) AND FOPA_ID = 2 and RECA_ANULADO = 'N'
    INTO :FORMAP2;
  SELECT SUM(RCPA_MONTO) FROM RECIBOS_CAJA_PAGO P, RECIBOS_CAJA R, PUNTO_VENTA PT
    WHERE R.RECA_ID = P.RECA_ID AND PT.PTVT_ID = :punto AND RECA_FECHA = :FECHA AND PT.caja_id = R.caja_id AND ((PT.PREF_PRE = R.PREF_PRE) or (:PREFIJO = '')) AND FOPA_ID = 3 and RECA_ANULADO = 'N'
    INTO :FORMAP3;
  SELECT SUM(RCPA_MONTO) FROM RECIBOS_CAJA_PAGO P, RECIBOS_CAJA R, PUNTO_VENTA PT
    WHERE R.RECA_ID = P.RECA_ID AND PT.PTVT_ID = :punto AND RECA_FECHA = :FECHA AND PT.caja_id = R.caja_id AND ((PT.PREF_PRE = R.PREF_PRE) or (:PREFIJO = '')) AND FOPA_ID = 4 and RECA_ANULADO = 'N'
    INTO :FORMAP4;
  SELECT SUM(RCPA_MONTO) FROM RECIBOS_CAJA_PAGO P, RECIBOS_CAJA R, PUNTO_VENTA PT
    WHERE R.RECA_ID = P.RECA_ID AND PT.PTVT_ID = :punto AND RECA_FECHA = :FECHA AND PT.caja_id = R.caja_id AND ((PT.PREF_PRE = R.PREF_PRE) or (:PREFIJO = '')) AND FOPA_ID = 5 and RECA_ANULADO = 'N'
    INTO :FORMAP5;
  SELECT SUM(RCPA_MONTO) FROM RECIBOS_CAJA_PAGO P, RECIBOS_CAJA R, PUNTO_VENTA PT
    WHERE R.RECA_ID = P.RECA_ID AND PT.PTVT_ID = :punto AND RECA_FECHA = :FECHA AND PT.caja_id = R.caja_id AND ((PT.PREF_PRE = R.PREF_PRE) or (:PREFIJO = '')) AND FOPA_ID = 6 and RECA_ANULADO = 'N'
    INTO :FORMAP6;
  SELECT SUM(RCPA_MONTO) FROM RECIBOS_CAJA_PAGO P, RECIBOS_CAJA R, PUNTO_VENTA PT
    WHERE R.RECA_ID = P.RECA_ID AND PT.PTVT_ID = :punto AND RECA_FECHA = :FECHA AND PT.caja_id = R.caja_id AND ((PT.PREF_PRE = R.PREF_PRE) or (:PREFIJO = '')) AND FOPA_ID = 7 and RECA_ANULADO = 'N'
    INTO :FORMAP7;
  SELECT SUM(RCPA_MONTO) FROM RECIBOS_CAJA_PAGO P, RECIBOS_CAJA R, PUNTO_VENTA PT
    WHERE R.RECA_ID = P.RECA_ID AND PT.PTVT_ID = :punto AND RECA_FECHA = :FECHA AND PT.caja_id = R.caja_id AND ((PT.PREF_PRE = R.PREF_PRE) or (:PREFIJO = '')) AND FOPA_ID = 8 and RECA_ANULADO = 'N'
    INTO :FORMAP8;
  SELECT SUM(RCPA_MONTO) FROM RECIBOS_CAJA_PAGO P, RECIBOS_CAJA R, PUNTO_VENTA PT
    WHERE R.RECA_ID = P.RECA_ID AND PT.PTVT_ID = :punto AND RECA_FECHA = :FECHA AND PT.caja_id = R.caja_id AND ((PT.PREF_PRE = R.PREF_PRE) or (:PREFIJO = '')) AND FOPA_ID = 9 and RECA_ANULADO = 'N'
    INTO :FORMAP9;
  SELECT SUM(RCPA_MONTO) FROM RECIBOS_CAJA_PAGO P, RECIBOS_CAJA R, PUNTO_VENTA PT
    WHERE R.RECA_ID = P.RECA_ID AND PT.PTVT_ID = :punto AND RECA_FECHA = :FECHA AND PT.caja_id = R.caja_id AND ((PT.PREF_PRE = R.PREF_PRE) or (:PREFIJO = '')) AND FOPA_ID = 10 and RECA_ANULADO = 'N'
    INTO :FORMAP10;
  SELECT SUM(RCPA_MONTO) FROM RECIBOS_CAJA_PAGO P, RECIBOS_CAJA R, PUNTO_VENTA PT
    WHERE R.RECA_ID = P.RECA_ID AND PT.PTVT_ID = :punto AND RECA_FECHA = :FECHA AND PT.caja_id = R.caja_id AND ((PT.PREF_PRE = R.PREF_PRE) or (:PREFIJO = '')) AND FOPA_ID = 11 and RECA_ANULADO = 'N'
    INTO :FORMAP11;
  SELECT SUM(RCPA_MONTO) FROM RECIBOS_CAJA_PAGO P, RECIBOS_CAJA R, PUNTO_VENTA PT
    WHERE R.RECA_ID = P.RECA_ID AND PT.PTVT_ID = :punto AND RECA_FECHA = :FECHA AND PT.caja_id = R.caja_id AND ((PT.PREF_PRE = R.PREF_PRE) or (:PREFIJO = '')) AND FOPA_ID = 12 and RECA_ANULADO = 'N'
    INTO :FORMAP12;

  cartera = 0;
  for SELECT FACT_ID,FACT_TOTAL FROM FACTURAS WHERE FACT_FECHA = :FECHA AND PTVT_ID = :PUNTO AND ((PREF_PRE = :PREFIJO) or (:PREFIJO = '')) and FACT_ANULADO = 'N' into :f_id,:F_TOTAL
    do
    begin
     Select COUNT(D.RECA_ID) FROM recibos_caja_detalle D, RECIBOS_CAJA R where R.RECA_ID = D.RECA_ID AND R.RECA_FECHA = :FECHA AND RECA_ANULADO = 'N' and D.RCDE_tipodoc = 31 and D.RCDE_IDDOC = :f_id into :r_iddoc;
     if (r_iddoc = 0) then
       CARTERA = :cartera + :F_TOTAL;
    end
  for SELECT DEVT_ID,DEVT_TOTAL FROM devoluciones_ventas WHERE DEVT_FECHA = :FECHA AND PTVT_ID = :PUNTO and DEVT_ANULADO = 'N' into :f_id,:F_TOTAL
    do
    begin
     Select COUNT(D.RECA_ID) FROM recibos_caja_detalle D, RECIBOS_CAJA R where R.RECA_ID = D.RECA_ID AND R.RECA_FECHA = :FECHA AND RECA_ANULADO = 'N' and D.RCDE_tipodoc = 33 and D.RCDE_IDDOC = :f_id into :r_iddoc;
     if (r_iddoc = 0) then
       CARTERA = :cartera - :F_TOTAL;
    end
  /* SUME LAS RETENCIONES COMO CARTERA */
  SELECT SUM(RCDE_RTFTE+RCDE_RTIVA+RCDE_RTICA) FROM recibos_caja_detalle D, RECIBOS_CAJA R, PUNTO_VENTA PT
    WHERE R.RECA_ID = D.RECA_ID AND PT.PTVT_ID = :punto AND RECA_FECHA = :FECHA AND PT.caja_id = R.caja_id AND ((PT.PREF_PRE = R.PREF_PRE) or (:PREFIJO = '')) AND RECA_ANULADO = 'N'
    INTO :RETES;
  if (RETES IS NULL) then
    RETES = 0;
  CARTERA = :cartera + :retes;

  if (formap1 is null) then
    formap1 = 0;
  if (formap2 is null) then
    formap2 = 0;
  if (formap3 is null) then
    formap3 = 0;
  if (formap4 is null) then
    formap4 = 0;
  if (formap5 is null) then
    formap5 = 0;
  if (formap6 is null) then
    formap6 = 0;
  if (formap7 is null) then
    formap7 = 0;
  if (formap8 is null) then
    formap8 = 0;
  if (formap9 is null) then
    formap9 = 0;
  if (formap10 is null) then
    formap10 = 0;
  if (formap11 is null) then
    formap11 = 0;
  if (formap12 is null) then
    formap12 = 0;
  if (cartera is null) then
    cartera = 0;
  I = 0;
  FOR SELECT MAX(F.VEND_COD), MAX(VEND_NOMBRE), SUM(FACT_TOTAL - FACT_IVAMONTO) FROM FACTURAS F, VENDEDORES V
    WHERE F.VEND_COD = V.VEND_COD AND FACT_FECHA = :FECHA AND F.PTVT_ID = :PUNTO AND ((PREF_PRE = :PREFIJO) or (:PREFIJO = '')) and FACT_ANULADO = 'N'
    GROUP BY F.VEND_COD ORDER BY F.VEND_COD
    INTO :CODVEN, :VENDED, :TOTALF
    DO
    BEGIN
    if (totalf IS NULL) then
        TOTALF = 0;
    SELECT SUM(DEVT_TOTAL - DEVT_IVAMONTO) FROM DEVOLUCIONES_VENTAS
        WHERE VEND_COD = :CODVEN AND DEVT_FECHA = :FECHA AND PTVT_ID = :PUNTO AND ((PREF_PRE = :PREFIJO) or (:PREFIJO = '')) and DEVT_ANULADO = 'N'
        INTO :totald;
    if (TOTALD IS NULL) then
        TOTALD = 0;
    if (I = 0) then
        BEGIN
        vendedor1 = VENDED;
        vtavend1 = TOTALF - TOTALD;
        END
    if (I = 1) then
        BEGIN
        vendedor2 = VENDED;
        vtavend2 = TOTALF - TOTALD;
        END
    if (I = 2) then
        BEGIN
        vendedor3 = VENDED;
        vtavend3 = TOTALF - TOTALD;
        END
    if (I = 3) then
        BEGIN
        vendedor4 = VENDED;
        vtavend4 = TOTALF - TOTALD;
        END
    if (I = 4) then
        BEGIN
        vendedor5 = VENDED;
        vtavend5 = TOTALF - TOTALD;
        END
    I = I + 1;
    END
  if (AJUSTE = 1) then
    BEGIN
    BASEFAC = BASEF0 + BASEF1 + BASEF2 + BASEF3 + BASEF4;
    IVAFAC = IVAF0 + IVAF1 + IVAF2 + IVAF3 + IVAF4;
    TOTALFAC = totalf0 + TOTALF1 + TOTALF2 + TOTALF3 + TOTALF4;
    BASEDEV = totald0 + TOTALD1 + TOTALD2 + TOTALD3 + TOTALD4;
    IVADEV = IVAD0 + IVAD1 + IVAD2 + IVAD3 + IVAD4;
    TOTALDEV = totald0 + TOTALD1 + totald2 + totald3 + totald4;
    BASENETO = basefac - basedev;
    IVANETO = ivafac - ivadev;
    if (totalneto <> 0) Then
        begin
        formap1 = formap1 * (totalfac - totaldev) / totalneto;
        formap2 = formap2 * (totalfac - totaldev) / totalneto;
        formap3 = formap3 * (totalfac - totaldev) / totalneto;
        formap4 = formap4 * (totalfac - totaldev) / totalneto;
        formap5 = formap5 * (totalfac - totaldev) / totalneto;
        formap6 = formap6 * (totalfac - totaldev) / totalneto;
        formap7 = formap7 * (totalfac - totaldev) / totalneto;
        formap8 = formap8 * (totalfac - totaldev) / totalneto;
        formap9 = formap9 * (totalfac - totaldev) / totalneto;
        formap10 = formap10 * (totalfac - totaldev) / totalneto;
        formap11 = formap11 * (totalfac - totaldev) / totalneto;
        formap12 = formap12 * (totalfac - totaldev) / totalneto;
        vtavend1 = vtavend1 * (totalfac - totaldev) / totalneto;
        vtavend2 = vtavend2 * (totalfac - totaldev) / totalneto;
        vtavend3 = vtavend3 * (totalfac - totaldev) / totalneto;
        vtavend4 = vtavend4 * (totalfac - totaldev) / totalneto;
        vtavend5 = vtavend5 * (totalfac - totaldev) / totalneto;
        end
    TOTALNETO = totalfac - totaldev;
    END
  INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
    VALUES (USER, 123, :punto, 'I', (:formap1+:formap2+:formap3+:formap4+:formap5+:CARTERA));
  suspend;
end
^

SET TERM ; ^


/* 20101102 */
/* SUBTOTAL DEBE SUMAR EL IVADEC2799, ADEMAN EN DEVOLUCIONES IVADEC DEBE SER NEGATIVO */
SET TERM ^ ;

CREATE OR ALTER procedure IMPUESTOS_VENTAS (
    FECINI date,
    FECFIN date,
    PREFIJO varchar(4),
    PTOINI integer,
    PTOFIN integer,
    ANULADOS char(1),
    SUBEMPRESA integer)
returns (
    TIPO integer,
    NOMTIPO varchar(30),
    PREF varchar(4),
    NUMERO varchar(6),
    FECHA date,
    NIT varchar(20),
    NOMTERCERO varchar(60),
    SUBTOTAL numeric(18,2),
    DTOMONTO numeric(18,2),
    ADICIONAL numeric(18,2),
    IVAMONTO numeric(18,2),
    CONSUMO numeric(18,2),
    EXENTOS numeric(18,2),
    GRAVADOS1 numeric(18,2),
    GRAVADOS2 numeric(18,2),
    GRAVADOS3 numeric(18,2),
    BASEDEC2799 numeric(18,2),
    IVA1 numeric(18,2),
    IVA2 numeric(18,2),
    IVA3 numeric(18,2),
    IVADEC2799 numeric(18,2),
    EXTRA numeric(18,2),
    TOTAL numeric(18,2),
    RTFTEMONTO numeric(18,2),
    RTIVAMONTO numeric(18,2),
    RTICAMONTO numeric(18,2),
    NETO numeric(18,2),
    ANULADO char(1))
AS
declare variable ID INTEGER;
declare variable TER_exento CHAR(1);
declare variable NOTAS CHAR(2);
declare variable ajustar CHAR(1);
declare variable FACTOR NUMERIC(18,4);
declare variable NUEVO NUMERIC(18,2);
declare variable FACTENC NUMERIC(18,2);
BEGIN
/* FACTURA */
TIPO = 31;
SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 31 INTO :NOMTIPO;
ajustar = 'N';
FOR SELECT FACT_ID, F.PREF_PRE, FACT_NUMERO, FACT_FECHA, TERC_NIT, FACT_NOMCLIENTE, FACT_ADICIONAL-FACT_DTOMONTO, FACT_IVAMONTO, FACT_RTFTEMONTO, FACT_RTIVAMONTO, FACT_RTICAMONTO, FACT_EXTRA, FACT_TOTAL, FACT_ANULADO, fact_factor
    FROM FACTURAS F, PREFIJOS PR WHERE PTVT_ID >= :PTOINI AND PTVT_ID <= :PTOFIN AND
    FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND ((:PREFIJO = '') or (:PREFIJO IS NULL) or (F.PREF_PRE = :PREFIJO))
    AND PR.PREF_PRE = F.PREF_PRE AND PR.TIDO_COD = 31 AND ((PR.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
    ORDER BY FACT_FECHA, F.PREF_PRE, FACT_NUMERO
    INTO :ID, :PREF, :NUMERO, :FECHA, :NIT, :NOMTERCERO, :DTOMONTO, :IVAMONTO, :RTFTEMONTO, :RTIVAMONTO, :RTICAMONTO, :EXTRA, :TOTAL, :ANULADO, :FACTENC
    DO
    BEGIN
    SELECT TERC_EXENTO FROM TERCEROS WHERE TERC_NIT = :NIT INTO :TER_EXENTO;
    if ((ANULADOS = 'S') or (ANULADO = 'N')) then
        BEGIN
        if (ANULADO = 'S') then
            BEGIN
            EXENTOS = 0;
            GRAVADOS1 = 0;
            GRAVADOS2 = 0;
            GRAVADOS3 = 0;
            CONSUMO = 0;
            SUBTOTAL = 0;
            TOTAL = 0;
            EXTRA = 0;
            IVAMONTO = 0;
            IVA1 = 0;
            IVA2 = 0;
            IVA3 = 0;
            DTOMONTO = 0;
            NETO = 0;
            RTFTEMONTO = 0;
            RTIVAMONTO = 0;
            RTICAMONTO = 0;
            basedec2799 = 0;
            ivadec2799 = 0;
            END
        else
            BEGIN
            /* CALCULE LAS DIFERENTES TARIFAS */
            if (TER_EXENTO = 'S') then
                BEGIN
                SELECT SUM(FADE_TOTAL - FADE_IVAMONTO - FADE_CONSUMO)*:FACTENC FROM FACTURAS_DETALLE D WHERE FACT_ID = :ID AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL)) AND FADE_IVAMONTO = 0 INTO :EXENTOS;
                SELECT SUM((FADE_TOTAL - FADE_IVAMONTO - FADE_CONSUMO)*:FACTENC), SUM(FADE_IVAMONTO*:FACTENC) FROM FACTURAS_DETALLE D, TARIFA_IVA T WHERE FACT_ID = :ID AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL)) AND FADE_IVAPORC = TAIV_PORC AND FADE_IVAPORC = 16 AND FADE_IVAMONTO <> 0 INTO :GRAVADOS1, :IVA1;
                SELECT SUM((FADE_TOTAL - FADE_IVAMONTO - FADE_CONSUMO)*:FACTENC), SUM(FADE_IVAMONTO*:FACTENC) FROM FACTURAS_DETALLE D, TARIFA_IVA T WHERE FACT_ID = :ID AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL)) AND FADE_IVAPORC = TAIV_PORC AND FADE_IVAPORC = 10 AND FADE_IVAMONTO <> 0 INTO :GRAVADOS2, :IVA2;
                GRAVADOS3 = 0;
                IVA3 = 0;
                basedec2799 = 0;
                ivadec2799 = 0;
                end
            else
                begin
                SELECT SUM((FADE_TOTAL - FADE_IVAMONTO - FADE_CONSUMO)*:FACTENC) FROM FACTURAS_DETALLE D WHERE FACT_ID = :ID AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL)) AND FADE_IVAPORC = 0 INTO :EXENTOS;
                SELECT SUM((FADE_TOTAL - FADE_IVAMONTO - FADE_CONSUMO)*:FACTENC), SUM(FADE_IVAMONTO*:FACTENC) FROM FACTURAS_DETALLE D, TARIFA_IVA T WHERE FACT_ID = :ID AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL)) AND FADE_IVAPORC = TAIV_PORC AND TAIV_COD = 1 INTO :GRAVADOS1, :IVA1;
                SELECT SUM((FADE_TOTAL - FADE_IVAMONTO - FADE_CONSUMO)*:FACTENC), SUM(FADE_IVAMONTO*:FACTENC) FROM FACTURAS_DETALLE D, TARIFA_IVA T WHERE FACT_ID = :ID AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL)) AND FADE_IVAPORC = TAIV_PORC AND TAIV_COD = 2 INTO :GRAVADOS2, :IVA2;
                SELECT SUM((FADE_TOTAL - FADE_IVAMONTO - FADE_CONSUMO)*:FACTENC), SUM(FADE_IVAMONTO*:FACTENC) FROM FACTURAS_DETALLE D, TARIFA_IVA T WHERE FACT_ID = :ID AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL)) AND FADE_IVAPORC = TAIV_PORC AND TAIV_COD = 3 INTO :GRAVADOS3, :IVA3;
                SELECT SUM((FADE_TOTAL - FADE_IVAMONTO - FADE_CONSUMO)*:FACTENC), SUM(FADE_IVAMONTO*:FACTENC) FROM FACTURAS_DETALLE D, ARTICULO A WHERE FACT_ID = :ID AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL)) AND D.arti_cod = A.arti_cod AND A.arti_dec2799 = 'S' INTO :basedec2799, :ivadec2799;
                end
            if (iva1 is null) then
                iva1 = 0;
            if (iva2 is null) then
                iva2 = 0;
            if (iva3 is null) then
                iva3 = 0;
            if (ivadec2799 is null) then
                ivadec2799 = 0;
            SELECT SUM(FADE_CONSUMO) FROM FACTURAS_DETALLE WHERE FACT_ID = :ID AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL)) INTO :CONSUMO;
            SUBTOTAL = TOTAL - EXTRA - IVAMONTO + IVADEC2799;
            NETO = TOTAL - RTFTEMONTO - RTIVAMONTO - RTICAMONTO;
            END
        if (exentos is null) then
            exentos = 0;
        if (gravados1 is null) then
            gravados1 = 0;
        if (gravados2 is null) then
            gravados2 = 0;
        if (gravados3 is null) then
            gravados3 = 0;
        if (basedec2799 is null) then
            basedec2799 = 0;
        if (consumo is null) then
            consumo = 0;
        FACTOR = 1;
        SELECT AJCI_FACTOR FROM ajuste_cierre WHERE AJCI_PORC = 0 AND AJCI_FECINI <= :FECHA AND AJCI_FECFIN >= :FECHA INTO :FACTOR;
        if (FACTOR IS null) then
            FACTOR = 1;
        if (factor <> 1) then
            ajustar = 'S';
        EXENTOS = EXENTOS * FACTOR;
        FACTOR = 1;
        SELECT AJCI_FACTOR FROM ajuste_cierre WHERE AJCI_PORC = 16 AND AJCI_FECINI <= :FECHA AND AJCI_FECFIN >= :FECHA INTO :FACTOR;
        if (FACTOR IS null) then
            FACTOR = 1;
        if (factor <> 1) then
            ajustar = 'S';
        gravados1 = GRAVADOS1 * FACTOR;
        IVA1 = IVA1 * FACTOR;
        FACTOR = 1;
        SELECT AJCI_FACTOR FROM ajuste_cierre WHERE AJCI_PORC = 10 AND AJCI_FECINI <= :FECHA AND AJCI_FECFIN >= :FECHA INTO :FACTOR;
        if (FACTOR IS null) then
            FACTOR = 1;
        if (factor <> 1) then
            ajustar = 'S';
        gravados2 = GRAVADOS2 * FACTOR;
        IVA2 = IVA2 * FACTOR;
        FACTOR = 1;
        SELECT AJCI_FACTOR FROM ajuste_cierre WHERE AJCI_PORC = 7 AND AJCI_FECINI <= :FECHA AND AJCI_FECFIN >= :FECHA INTO :FACTOR;
        if (FACTOR IS null) then
            FACTOR = 1;
        if (factor <> 1) then
            ajustar = 'S';
        gravados3 = GRAVADOS3 * FACTOR;
        IVA3 = IVA3 * FACTOR;
        NUEVO = exentos + gravados1 + gravados2 + gravados3;
        if ((TOTAL <> 0) and (ajustar = 'S')) then
            BEGIN
            IVAMONTO = IVA1 + IVA2 + IVA3;
            CONSUMO = CONSUMO * (NUEVO+ivamonto+consumo) / TOTAL;
            SUBTOTAL = SUBTOTAL * (NUEVO+ivamonto+consumo) / TOTAL;
            NETO = NETO * (NUEVO+ivamonto+consumo) / TOTAL;
            rtftemonto = rtftemonto * (NUEVO+ivamonto+consumo) / TOTAL;
            rticamonto = rticamonto * (NUEVO+ivamonto+consumo) / TOTAL;
            rtivamonto = rtivamonto * (NUEVO+ivamonto+consumo) / TOTAL;
            dtomonto = dtomonto * (NUEVO+ivamonto+consumo) / TOTAL;
            adicional = adicional * (NUEVO+ivamonto+consumo) / TOTAL;
            total = total * (NUEVO+ivamonto+consumo) / TOTAL;
            END
        SUSPEND;
        END
    END
    
TIPO = 33;
ajustar = 'N';
SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 33 INTO :NOMTIPO;
/* DEVOLUCIONES */
FOR SELECT DEVT_ID, D.PREF_PRE, DEVT_NUMERO, DEVT_FECHA, TERC_NIT, DEVT_NOMTERC, DEVT_ADICIONAL-DEVT_DTOMONTO, DEVT_IVAMONTO, DEVT_RTFTEMONTO, DEVT_RTIVAMONTO, DEVT_RTICAMONTO, DEVT_EXTRA, DEVT_TOTAL, DEVT_ANULADO, DEVT_FACTOR
    FROM DEVOLUCIONES_VENTAS D, PREFIJOS PR WHERE PTVT_ID >= :PTOINI AND PTVT_ID <= :PTOFIN AND
    DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND ((:PREFIJO = '') or (:PREFIJO IS NULL) or (D.PREF_PRE = :PREFIJO))
    AND PR.PREF_PRE = D.PREF_PRE AND PR.TIDO_COD = 33 AND ((PR.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) AND ((DEVT_REMID = 0) or (DEVT_REMID IS NULL)) AND ((DEVT_PEDID = 0) or (DEVT_PEDID IS NULL))
    ORDER BY DEVT_FECHA, D.PREF_PRE, DEVT_NUMERO
    INTO :ID, :PREF, :NUMERO, :FECHA, :NIT, :NOMTERCERO, :DTOMONTO, :IVAMONTO, :RTFTEMONTO, :RTIVAMONTO, :RTICAMONTO, :EXTRA, :TOTAL, :ANULADO, :FACTENC
    DO
    BEGIN
    SELECT TERC_EXENTO FROM TERCEROS WHERE TERC_NIT = :NIT INTO :TER_EXENTO;
    if ((ANULADOS = 'S') or (ANULADO = 'N')) then
        BEGIN
        if (ANULADO = 'S') then
            BEGIN
            EXENTOS = 0;
            GRAVADOS1 = 0;
            GRAVADOS2 = 0;
            GRAVADOS3 = 0;
            CONSUMO = 0;
            SUBTOTAL = 0;
            TOTAL = 0;
            EXTRA = 0;
            IVAMONTO = 0;
            IVA1 = 0;
            IVA2 = 0;
            IVA3 = 0;
            DTOMONTO = 0;
            NETO = 0;
            RTFTEMONTO = 0;
            RTIVAMONTO = 0;
            RTICAMONTO = 0;
            basedec2799 = 0;
            ivadec2799 = 0;
            END
        else
            BEGIN
            DTOMONTO = DTOMONTO * -1;
            ADICIONAL = ADICIONAL * -1;
            IVAMONTO = IVAMONTO * -1;
            IVADEC2799 = IVADEC2799 * -1;
            EXTRA = EXTRA * -1;
            TOTAL = TOTAL * -1;
            RTFTEMONTO = RTFTEMONTO * -1;
            RTIVAMONTO = RTIVAMONTO * -1;
            RTICAMONTO = RTICAMONTO * -1;
            /* CALCULE LAS DIFERENTES TARIFAS */
            if (TER_EXENTO = 'S') then
              BEGIN
              SELECT SUM((DVDE_TOTAL - DVDE_IVAMONTO - DVDE_CONSUMO)*:FACTENC) FROM DEVOLUCIONES_VENTAS_DETALLE D WHERE DEVT_ID = :ID AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL)) AND DVDE_IVAMONTO = 0 INTO :EXENTOS;
              SELECT SUM((DVDE_TOTAL - DVDE_IVAMONTO - DVDE_CONSUMO)*:FACTENC), SUM(DVDE_IVAMONTO*:FACTENC) FROM DEVOLUCIONES_VENTAS_DETALLE D WHERE DEVT_ID = :ID AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL)) AND DVDE_IVAPORC = 16 AND DVDE_IVAMONTO <> 0 INTO :GRAVADOS1, :IVA1;
              SELECT SUM((DVDE_TOTAL - DVDE_IVAMONTO - DVDE_CONSUMO)*:FACTENC), SUM(DVDE_IVAMONTO*:FACTENC) FROM DEVOLUCIONES_VENTAS_DETALLE D WHERE DEVT_ID = :ID AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL)) AND DVDE_IVAPORC = 10 AND DVDE_IVAMONTO <> 0 INTO :GRAVADOS2, :IVA2;
              GRAVADOS3 = 0;
              iVA3 = 0;
              basedec2799 = 0;
              ivadec2799 = 0;
              end
            else
              begin
              SELECT SUM((DVDE_TOTAL - DVDE_IVAMONTO - DVDE_CONSUMO)*:FACTENC) FROM DEVOLUCIONES_VENTAS_DETALLE D WHERE DEVT_ID = :ID AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL)) AND DVDE_IVAPORC = 0 INTO :EXENTOS;
              SELECT SUM((DVDE_TOTAL - DVDE_IVAMONTO - DVDE_CONSUMO)*:FACTENC), SUM(DVDE_IVAMONTO*:FACTENC) FROM DEVOLUCIONES_VENTAS_DETALLE D, TARIFA_IVA T WHERE DEVT_ID = :ID AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL)) AND DVDE_IVAPORC = TAIV_PORC AND TAIV_COD = 1 INTO :GRAVADOS1, :IVA1;
              SELECT SUM((DVDE_TOTAL - DVDE_IVAMONTO - DVDE_CONSUMO)*:FACTENC), SUM(DVDE_IVAMONTO*:FACTENC) FROM DEVOLUCIONES_VENTAS_DETALLE D, TARIFA_IVA T WHERE DEVT_ID = :ID AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL)) AND DVDE_IVAPORC = TAIV_PORC AND TAIV_COD = 2 INTO :GRAVADOS2, :IVA2;
              SELECT SUM((DVDE_TOTAL - DVDE_IVAMONTO - DVDE_CONSUMO)*:FACTENC), SUM(DVDE_IVAMONTO*:FACTENC) FROM DEVOLUCIONES_VENTAS_DETALLE D, TARIFA_IVA T WHERE DEVT_ID = :ID AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL)) AND DVDE_IVAPORC = TAIV_PORC AND TAIV_COD = 3 INTO :GRAVADOS3, :IVA3;
              SELECT SUM((DVDE_TOTAL - DVDE_IVAMONTO - DVDE_CONSUMO)*:FACTENC), SUM(DVDE_IVAMONTO*:FACTENC) FROM DEVOLUCIONES_VENTAS_DETALLE D, ARTICULO A WHERE DEVT_ID = :ID AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL)) AND D.arti_cod = A.arti_cod AND A.arti_dec2799 = 'S' INTO :basedec2799, :ivadec2799;
              end
            if (iva1 is null) then
                iva1 = 0;
            if (iva2 is null) then
                iva2 = 0;
            if (iva3 is null) then
                iva3 = 0;
            if (ivadec2799 is null) then
                ivadec2799 = 0;
            SELECT SUM(DVDE_CONSUMO) FROM DEVOLUCIONES_VENTAS_DETALLE WHERE DEVT_ID = :ID AND DVDE_REFERENCIA <> '.t' INTO :CONSUMO;
            EXENTOS = EXENTOS * -1;
            GRAVADOS1 = GRAVADOS1 * -1;
            GRAVADOS2 = GRAVADOS2 * -1;
            GRAVADOS3 = GRAVADOS3 * -1;
            CONSUMO = CONSUMO * -1;
            IVA1 = IVA1 * -1;
            IVA2 = IVA2 * -1;
            IVA3 = IVA3 * -1;
            SUBTOTAL = TOTAL - EXTRA - IVAMONTO + IVADEC2799;
            NETO = TOTAL - RTFTEMONTO - RTIVAMONTO - RTICAMONTO;
            END
        if (exentos is null) then
            exentos = 0;
        if (gravados1 is null) then
            gravados1 = 0;
        if (gravados2 is null) then
            gravados2 = 0;
        if (gravados3 is null) then
            gravados3 = 0;
        if (consumo is null) then
            consumo = 0;
        if (basedec2799 is null) then
            basedec2799 = 0;
        FACTOR = 1;
        SELECT AJCI_FACTOR FROM ajuste_cierre WHERE AJCI_PORC = 0 AND AJCI_FECINI <= :FECHA AND AJCI_FECFIN >= :FECHA INTO :FACTOR;
        if (FACTOR IS null) then
            FACTOR = 1;
        if (factor <> 1) then
            ajustar = 'S';
        EXENTOS = EXENTOS * FACTOR;
        FACTOR = 1;
        SELECT AJCI_FACTOR FROM ajuste_cierre WHERE AJCI_PORC = 16 AND AJCI_FECINI <= :FECHA AND AJCI_FECFIN >= :FECHA INTO :FACTOR;
        if (FACTOR IS null) then
            FACTOR = 1;
        if (factor <> 1) then
            ajustar = 'S';
        gravados1 = GRAVADOS1 * FACTOR;
        IVA1 = IVA1 * FACTOR;
        FACTOR = 1;
        SELECT AJCI_FACTOR FROM ajuste_cierre WHERE AJCI_PORC = 10 AND AJCI_FECINI <= :FECHA AND AJCI_FECFIN >= :FECHA INTO :FACTOR;
        if (FACTOR IS null) then
            FACTOR = 1;
        if (factor <> 1) then
            ajustar = 'S';
        gravados2 = GRAVADOS2 * FACTOR;
        IVA2 = IVA2 * FACTOR;
        FACTOR = 1;
        SELECT AJCI_FACTOR FROM ajuste_cierre WHERE AJCI_PORC = 7 AND AJCI_FECINI <= :FECHA AND AJCI_FECFIN >= :FECHA INTO :FACTOR;
        if (FACTOR IS null) then
            FACTOR = 1;
        if (factor <> 1) then
            ajustar = 'S';
        gravados3 = GRAVADOS3 * FACTOR;
        IVA3 = IVA3 * FACTOR;
        NUEVO = exentos + gravados1 + gravados2 + gravados3;
        if ((TOTAL <> 0) and (ajustar = 'S')) then
            BEGIN
            IVAMONTO = IVA1 + IVA2 + IVA3;
            CONSUMO = CONSUMO * (NUEVO+ivamonto+consumo) / TOTAL;
            SUBTOTAL = SUBTOTAL * (NUEVO+ivamonto+consumo) / TOTAL;
            NETO = NETO * (NUEVO+ivamonto+consumo) / TOTAL;
            rtftemonto = rtftemonto * (NUEVO+ivamonto+consumo) / TOTAL;
            rticamonto = rticamonto * (NUEVO+ivamonto+consumo) / TOTAL;
            rtivamonto = rtivamonto * (NUEVO+ivamonto+consumo) / TOTAL;
            dtomonto = dtomonto * (NUEVO+ivamonto+consumo) / TOTAL;
            adicional = adicional * (NUEVO+ivamonto+consumo) / TOTAL;
            total = total * (NUEVO+ivamonto+consumo) / TOTAL;
            END
        SUSPEND;
        END
    END
execute procedure lee_configuracion ('FACTURACION', 'DOCUMENTOS', 'INCLUIR NOTAS DE CARTERA EN REPORTE DE IMPUESTOS EN VENTAS') returning_values (:NOTAS);
if (NOTAS = 'SI') then
    BEGIN
    TIPO = 41;
    SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 41 INTO :NOMTIPO;
    FOR SELECT NDCL_ID, N.PREF_PRE, NDCL_NUMERO, NDCL_FECHA, N.TERC_NIT, TERC_NOM, 0, NDCL_IVAMONTO, NDCL_RTFTEMONTO, NDCL_RTIVAMONTO, NDCL_RTICAMONTO, 0, NDCL_MONTO+NDCL_IVAMONTO, NDCL_ANULADO
        FROM NOTAS_DEBITO_CLIENTES N, TERCEROS T, PREFIJOS PR WHERE N.TERC_NIT = T.TERC_NIT AND
        NDCL_FECHA >= :FECINI AND NDCL_FECHA <= :FECFIN AND ((:PREFIJO = '') or (:PREFIJO IS NULL) or (N.PREF_PRE = :PREFIJO))
        AND PR.PREF_PRE = N.PREF_PRE AND PR.TIDO_COD = 41 AND ((PR.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
        ORDER BY NDCL_FECHA, N.PREF_PRE, NDCL_NUMERO
        INTO :ID, :PREF, :NUMERO, :FECHA, :NIT, :NOMTERCERO, :DTOMONTO, :IVAMONTO, :RTFTEMONTO, :RTIVAMONTO, :RTICAMONTO, :EXTRA, :TOTAL, :ANULADO
        DO
        BEGIN
        GRAVADOS2 = 0;
        GRAVADOS3 = 0;
        IVA2 = 0;
        IVA3 = 0;
        CONSUMO = 0;
        if (ANULADO = 'S') then
            BEGIN
            EXENTOS = 0;
            GRAVADOS1 = 0;
            SUBTOTAL = 0;
            TOTAL = 0;
            EXTRA = 0;
            IVAMONTO = 0;
            IVA1 = 0;
            DTOMONTO = 0;
            NETO = 0;
            RTFTEMONTO = 0;
            RTIVAMONTO = 0;
            RTICAMONTO = 0;
            END
        ELSE
            BEGIN
            if (IVAMONTO <> 0) then
                BEGIN
                GRAVADOS1 = TOTAL-IVAMONTO;
                IVA1 = IVAMONTO;
                exentos = 0;
                END
            ELSE
                BEGIN
                GRAVADOS1 = 0;
                IVA1 = 0;
                exentos = TOTAL;
                END
            SUBTOTAL = TOTAL - EXTRA - IVAMONTO;
            NETO = TOTAL - RTFTEMONTO - RTIVAMONTO - RTICAMONTO;
            END
        SUSPEND;
        END

    TIPO = 42;
    SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 42 INTO :NOMTIPO;
    FOR SELECT NCCL_ID, N.PREF_PRE, NCCL_NUMERO, NCCL_FECHA, N.TERC_NIT, TERC_NOM, 0, NCCL_IVAMONTO, NCCL_RTFTEMONTO, NCCL_RTIVAMONTO, NCCL_RTICAMONTO, 0, NCCL_MONTO+NCCL_IVAMONTO, NCCL_ANULADO
        FROM NOTAS_CREDITO_CLIENTES N, TERCEROS T, PREFIJOS PR WHERE N.TERC_NIT = T.TERC_NIT AND
        NCCL_FECHA >= :FECINI AND NCCL_FECHA <= :FECFIN AND ((:PREFIJO = '') or (:PREFIJO IS NULL) or (N.PREF_PRE = :PREFIJO))
        AND PR.PREF_PRE = N.PREF_PRE AND PR.TIDO_COD = 42 AND ((PR.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
        ORDER BY NCCL_FECHA, N.PREF_PRE, NCCL_NUMERO
        INTO :ID, :PREF, :NUMERO, :FECHA, :NIT, :NOMTERCERO, :DTOMONTO, :IVAMONTO, :RTFTEMONTO, :RTIVAMONTO, :RTICAMONTO, :EXTRA, :TOTAL, :ANULADO
        DO
        BEGIN
        GRAVADOS2 = 0;
        GRAVADOS3 = 0;
        IVA2 = 0;
        IVA3 = 0;
        CONSUMO = 0;
        if (ANULADO = 'S') then
            BEGIN
            EXENTOS = 0;
            GRAVADOS1 = 0;
            SUBTOTAL = 0;
            TOTAL = 0;
            EXTRA = 0;
            IVAMONTO = 0;
            IVA1 = 0;
            DTOMONTO = 0;
            NETO = 0;
            RTFTEMONTO = 0;
            RTIVAMONTO = 0;
            RTICAMONTO = 0;
            END
        ELSE
            BEGIN
            DTOMONTO = DTOMONTO * -1;
            ADICIONAL = ADICIONAL * -1;
            IVAMONTO = IVAMONTO * -1;
            EXTRA = EXTRA * -1;
            TOTAL = TOTAL * -1;
            RTFTEMONTO = RTFTEMONTO * -1;
            RTIVAMONTO = RTIVAMONTO * -1;
            RTICAMONTO = RTICAMONTO * -1;
            if (IVAMONTO <> 0) then
                BEGIN
                GRAVADOS1 = TOTAL-IVAMONTO;
                IVA1 = IVAMONTO;
                exentos = 0;
                END
            ELSE
                BEGIN
                GRAVADOS1 = 0;
                IVA1 = 0;
                exentos = TOTAL;
                END
            SUBTOTAL = TOTAL - EXTRA - IVAMONTO;
            NETO = TOTAL - RTFTEMONTO - RTIVAMONTO - RTICAMONTO;
            END
        SUSPEND;
        END
    END
END
^

SET TERM ; ^



/* 20101104 */
/* ERROR AL CALCULAR IMPOCONSUMO EN CARTERA, TOMABA LA TABLA FACTURAS_DETALLE */

SET TERM ^ ;

CREATE OR ALTER procedure CONTABIL_DEVOLCLI (
    IDDOC integer,
    IDINTER integer)
returns (
    ERROR integer,
    VER char(1),
    IDC integer)
AS
declare variable PREF VARCHAR(4);
declare variable NUM VARCHAR(6);
declare variable NUMERO VARCHAR(10);
declare variable FECAUX DATE;
declare variable FECHA CHAR(8);
declare variable CONC CHAR(120);
declare variable NUMFAC VARCHAR(10);
declare variable VRDTO NUMERIC(18, 2);
declare variable VRADIC NUMERIC(18, 2);
declare variable VRSUBT NUMERIC(18, 2);
declare variable VRIVA NUMERIC(18, 2);
declare variable PRTFTE NUMERIC(9, 2);
declare variable VRRTFTE NUMERIC(18, 2);
declare variable VRRTIVA NUMERIC(18, 2);
declare variable PRTICA NUMERIC(9, 2);
declare variable VRRTICA NUMERIC(18, 2);
declare variable VRTOTAL NUMERIC(18, 2);
declare variable VREXTRA NUMERIC(18, 2);
declare variable TIPOCOMP VARCHAR(3);
declare variable PREFCONT VARCHAR(4);
declare variable VENTAS CHAR(1);
declare variable CTAVENTAS VARCHAR(20);
declare variable IVA CHAR(1);
declare variable CTAIVA VARCHAR(20);
declare variable CONSUMO CHAR(1);
declare variable CTACONSUMO VARCHAR(20);
declare variable CARTERA CHAR(1);
declare variable CTACARTERA VARCHAR(20);
declare variable RTFTE CHAR(1);
declare variable CTARTFTE VARCHAR(20);
declare variable RTIVA CHAR(1);
declare variable CTARTIVA VARCHAR(20);
declare variable RTICA CHAR(1);
declare variable CTARTICA VARCHAR(20);
declare variable INVEN CHAR(1);
declare variable CTAINVEN VARCHAR(20);
declare variable COSTOS CHAR(1);
declare variable CTACOSTOS VARCHAR(20);
declare variable CTADTO VARCHAR(20);
declare variable CTAADIC VARCHAR(20);
declare variable CTAEXTRA VARCHAR(20);
declare variable EXISTE CHAR(1);
declare variable CUENTA VARCHAR(20);
declare variable MONTO NUMERIC(18,2);
declare variable TIPOCUEN CHAR(1);
declare variable NIT VARCHAR(20);
declare variable PROY VARCHAR(4);
declare variable CENTRO VARCHAR(4);
declare variable PROYI VARCHAR(4);
declare variable CENTI VARCHAR(4);
declare variable PORC NUMERIC(5,2);
declare variable DEBITO NUMERIC(18,2);
declare variable CREDITO NUMERIC(18,2);
declare variable NROI INTEGER;
declare variable ART VARCHAR(15);
declare variable IMPINC CHAR(1);
declare variable IMPTOS NUMERIC(18, 2);
declare variable SUMA NUMERIC(18,2);
declare variable PORCIVA NUMERIC(9,2);
declare variable TCTACLIEN VARCHAR(20);
declare variable TCTAVENTA VARCHAR(20);
declare variable TCTARTFTE VARCHAR(20);
declare variable TCTARTIVA VARCHAR(20);
declare variable TCTARTICA VARCHAR(20);
declare variable CTADIC VARCHAR(20);
declare variable BASEADIC VARCHAR(20);
declare variable PORCADIC NUMERIC(5,2);
declare variable VALORADIC NUMERIC(18,2);
declare variable DBADIC CHAR(1);
declare variable PTOVTA INTEGER;
declare variable ANULADO CHAR(1);
declare variable CENT CHAR(1);
DECLARE VARIABLE MERCANCIA NUMERIC(18,2);
declare variable FACTOR DOUBLE PRECISION;
declare variable DIG INTEGER;
DECLARE VARIABLE FOMENTO VARCHAR(2);
DECLARE VARIABLE VRCONSUMO NUMERIC(18,2);
declare variable AUTORET VARCHAR(10);
declare variable FAUTORET DATE;
declare variable IDREM INTEGER;
declare variable IDPED INTEGER;
declare variable DTOXIT CHAR(2);
declare variable ERRORC INTEGER;
declare variable DEC2799 char(2);
declare variable ctadtoiva varchar(20);
declare variable ICOING CHAR(2);
BEGIN
EXECUTE PROCEDURE lee_configuracion ('FACTURACION', 'FACTURAS', 'DESCONTAR IVA DE PRODUCTOS DECRETO 2799') returning_values (:DEC2799);
EXECUTE PROCEDURE LEE_CONFIGURACION('COMPRAS', 'FACTURAS', 'USAR IMPOCONSUMO COMO PORCENTAJE DE FOMENTO') returning_values (FOMENTO);
EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'FECHA AUTORETENEDOR NO DESCONTAR RETENCIONES DEL SALDO PERO SI CONTABILIZARLAS') returning_values (AUTORET);
EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION', 'ARTICULOS', 'IMPOCONSUMO COMO MAYOR VALOR DEL COSTO Y DEL INGRESO') returning_values (ICOING);
if (AUTORET <> '') then
    FAUTORET = CAST(AUTORET AS DATE);
else
    FAUTORET = '9999/12/31';
  /* BUSQUE LA INTERFACE */
  EXISTE = 'N';
  SELECT 'S', TICO_COD, PRCO_PRE, INVE_VENTAS, INVE_IVA, INVE_CONSUMO, INVE_CARTERA, INVE_RTFTE, INVE_RTIVA, INVE_RTICA, INVE_COSTO, INVE_INVEN, INVE_CTAVENTAS, INVE_CTAIVA, INVE_CTACONSUMO, INVE_CTADTO, INVE_CTAADIC, INVE_CTAEXTRA, INVE_CTACARTERA, INVE_CTARTFTE, INVE_CTARTIVA, INVE_CTARTICA, INVE_CTAINVEN, INVE_CTACOSTOS, INVE_CONFIRMAR, INVE_CENTRO
    FROM INTERFAZ_VENTAS
    WHERE INVE_ID = :IDINTER
    INTO :EXISTE, :TIPOCOMP, :PREFCONT, :VENTAS, :IVA, :CONSUMO, :CARTERA, :RTFTE, :RTIVA, :RTICA, :COSTOS, :INVEN, :CTAVENTAS, :CTAIVA, :CTACONSUMO, :CTADTO, :CTAADIC, :CTAEXTRA, :CTACARTERA, :CTARTFTE, :CTARTIVA, :CTARTICA, :CTAINVEN, :CTACOSTOS, :VER, :CENT;
  if (EXISTE = 'S') then
   BEGIN
    /* BORRE CUALQUEIR CONTABILIZACION PREVIA */
    DELETE FROM CONTABILIZACION WHERE CNTB_TIPOREF = 33 AND CNTB_IDREF = :IDDOC;
    /* TRAIGA EL ENCABEZADO DE LA DEVOLUCION */
   SELECT PREF_PRE, DEVT_NUMERO, DEVT_FECHA, F.TERC_NIT, DEVT_IVAINC, PTVT_ID, DEVT_FACTURA, DEVT_DTOMONTO, DEVT_ADICIONAL, DEVT_IVAMONTO, DEVT_EXTRA, DEVT_TOTAL, DEVT_RTFTEPORC, DEVT_RTFTEMONTO, DEVT_RTIVAPORC, DEVT_RTIVAMONTO, DEVT_RTICAPORC, DEVT_RTICAMONTO, TERC_CTARTFTE, TERC_CTARTIVA, TERC_CTARTICA, TERC_CTAVENTA, TERC_CTACLIENTE, DEVT_ANULADO, DEVT_REMID, DEVT_PEDID
        FROM DEVOLUCIONES_VENTAS F, TERCEROS T
        WHERE DEVT_ID = :IDDOC AND F.TERC_NIT = T.TERC_NIT
        INTO :PREF, :NUM, :FECAUX, :NIT, :IMPINC, :PTOVTA, :NUMFAC, :VRDTO, :VRADIC, :VRIVA, :VREXTRA, :VRTOTAL, :PRTFTE, :VRRTFTE, :PORC, :VRRTIVA, :PRTICA, :VRRTICA, :TCTARTFTE, TCTARTIVA, TCTARTICA, TCTAVENTA, TCTACLIEN, ANULADO, :IDREM, :IDPED;
   if (idrem is null) Then
    IDREM = 0;
   if (idped is null) Then
    IDPED = 0;
   if ((ANULADO = 'N') AND (IDREM = 0) AND (IDPED = 0)) then
    BEGIN
    NUMERO = PREF || NUM;
    SELECT SUM(DVDE_CONSUMO) FROM devoluciones_ventas_detalle WHERE DEVT_ID = :iddoc AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
        INTO :MERCANCIA;
    VRSUBT = VRTOTAL - VREXTRA - VRIVA - MERCANCIA; /* BASE DE RETEFTE Y RETEICA */
    EXECUTE PROCEDURE lee_configuracion ('FACTURACION', 'DEVOLUCIONES', 'DESCUENTO PIE DEVOLUCION IGUAL A SUMA DE DESCUENTOS POR ITEM') returning_values (:DTOXIT);
    if (DTOXIT = 'SI') then
        VRDTO = 0;
    MERCANCIA = VRSUBT - VRADIC + VRDTO;
    IF (CENT = 'B') THEN
        SELECT B.BODE_CENTRO, B.BODE_PROY FROM BODEGA B, DEVOLUCIONES_VENTAS F
            WHERE B.BODE_COD = F.BODE_COD AND F.DEVT_ID = :IDDOC INTO :CENTRO, :PROY;
    IF (CENT = 'V') THEN
        SELECT V.CENT_COD, V.PROY_COD FROM VENDEDORES V, DEVOLUCIONES_VENTAS F
            WHERE V.VEND_COD = F.VEND_COD AND F.DEVT_ID = :IDDOC INTO :CENTRO, :PROY;
    IF (CENT = 'P') THEN
        SELECT P.PREF_CENTRO,P.PREF_PROY  FROM PREFIJOS P, DEVOLUCIONES_VENTAS F
            WHERE P.PREF_PRE = F.PREF_PRE AND F.DEVT_ID = :IDDOC AND P.TIDO_COD = 33 INTO :CENTRO, :PROY;
    EXECUTE PROCEDURE FECHA_A_CONTA(:FECAUX) returning_values (:FECHA);
    /* REGISTRE EL ENCABEZADO CONTABLE */
    IDC = GEN_ID(ID_CONTABILIZA, 1);
    CONC = 'DEVOLUCION VENTAS No. ' || NUMERO || ' EN FACTURA ' || NUMFAC;
    CONC = SUBSTR(CONC, 1, 60);
    INSERT INTO CONTABILIZACION (CNTB_ID, CNTB_TIPOCOMP, CNTB_PREFCNT, CNTB_NUMERO, CNTB_FECHA, CNTB_CONCEPTO, CNTB_REF, CNTB_TIPOREF, CNTB_IDREF, CNTB_PREFREF, CNTB_NUMREF, CNTB_PROCESADO)
        VALUES (:IDC, :TIPOCOMP, :PREFCONT, :NUM, :FECHA, :CONC, '', 33, :IDDOC, :PREF, :NUM, 'N');
    NROI = 0;
    SUMA = 0;
    ERROR = 0;
    /* SI NO HAY CUENTA DE DESCUENTO NI ADICIONAL CALCULE UN FACTOR PARA LAS VENTAS Y EL IVA */
    if (MERCANCIA <> 0) then
        FACTOR = CAST(VRSUBT AS DOUBLE PRECISION) / CAST(MERCANCIA AS DOUBLE PRECISION);
    ELSE
        FACTOR = 1;
    /* TRAIGA EL NUMERO DE DIGITOS PARA EL REDONDEO */
    SELECT CAST(CONF_VALOR AS INTEGER) FROM CONFIGURACION WHERE CONF_MODULO = 'FACTURACION' AND
        CONF_CATEGORIA = 'GENERAL' AND CONF_PROPIEDAD = 'REDONDEO AL MULTIPLO DE DIEZ EN TOTALES' INTO :DIG;
    /* CUENTAS DE VENTAS */
    if (VENTAS = 'A') then
        BEGIN
        FOR SELECT MAX(COAR_CTADEV), SUM(DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO), SUM(DVDE_IVAMONTO), SUM(DVDE_CONSUMO), MAX(B.bode_proy), MAX(B.bode_centro)
            FROM ARTICULO A, CONTABIL_ARTICULO C, DEVOLUCIONES_VENTAS_DETALLE F, BODEGA B
            WHERE F.DEVT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND B.bode_cod = F.bode_cod AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
            GROUP BY COAR_CTADEV
            INTO :CTAVENTAS, :MONTO, :IMPTOS, :VRCONSUMO, :proyi, :centi
            DO
            BEGIN
            if ((FOMENTO = 'SI') or (icoing = 'SI')) then
                MONTO = MONTO + VRCONSUMO;
            if ((CTADTO IS NULL) OR (CTADTO = '')) then
                MONTO = MONTO * FACTOR;
            execute procedure redondee(MONTO, DIG) returning_values (MONTO);
            if (MONTO <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTAVENTAS, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT F.ARTI_COD, (DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO), (DVDE_IVAMONTO+DVDE_CONSUMO)
                        FROM ARTICULO A, CONTABIL_ARTICULO C, DEVOLUCIONES_VENTAS_DETALLE F
                        WHERE F.DEVT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTAINV = :CUENTA AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
                        INTO :ART, :MONTO, :IMPTOS
                    DO
                        BEGIN
                        if (IMPINC = 'S') then
                            MONTO = MONTO - IMPTOS;
                        if ((CTADTO IS NULL) OR (CTADTO = '')) then
                            MONTO = MONTO * FACTOR;
                        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        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, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                    NROI = NROI + 1;
                    SUMA = SUMA + MONTO;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    IF (CENT = 'B') THEN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROYI, :CENTI, NULL, NULL, NULL, NULL, 0, 0);
                    ELSE
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA + MONTO;
                    END
                END /* MONTO <> 0 */
            END /* FOR */
        END /* VENTAS X ARTICULO */
     IF ((VENTAS = 'C') OR (VENTAS = 'K')) THEN
        BEGIN
        IF (VENTAS = 'C') THEN
            CTAVENTAS = TCTAVENTA;
        SELECT SUM(DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO), SUM(DVDE_IVAMONTO), SUM(DVDE_CONSUMO)
            FROM DEVOLUCIONES_VENTAS_DETALLE F
            WHERE F.DEVT_ID = :IDDOC  AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
            INTO :MONTO, :IMPTOS, :VRCONSUMO;
        if ((FOMENTO = 'SI') or (icoing = 'SI')) then
            MONTO = MONTO + VRCONSUMO;
        if ((CTADTO IS NULL) OR (CTADTO = '')) then
            MONTO = MONTO * FACTOR;
        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
        if (MONTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTAVENTAS, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT F.ARTI_COD, (DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO), (DVDE_IVAMONTO+DVDE_CONSUMO)
                    FROM ARTICULO A, DEVOLUCIONES_VENTAS_DETALLE F
                    WHERE F.DEVT_ID = :IDDOC AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
                    INTO :ART, :MONTO, :IMPTOS
                    DO
                    BEGIN
                    if (IMPINC = 'S') then
                        MONTO = MONTO - IMPTOS;
                    if ((CTADTO IS NULL) OR (CTADTO = '')) then
                        MONTO = MONTO * FACTOR;
                    execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                    NROI = NROI + 1;
                    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, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                NROI = NROI + 1;
                SUMA = SUMA + MONTO;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA + MONTO;
                END
            END /* MONTO <> 0 */
        END /* VENTAS DE CLIENTE O CONSTANTE */
    /* EL IVA EN VENTAS */
    if (IVA = 'A') then
        BEGIN
        FOR SELECT MAX(COAR_CTAIVAV), SUM(DVDE_IVAMONTO), SUM(DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO), SUM(DVDE_CONSUMO)
            FROM ARTICULO A, CONTABIL_ARTICULO C, DEVOLUCIONES_VENTAS_DETALLE F
            WHERE F.DEVT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
            GROUP BY COAR_CTAIVAV
            INTO :CTAIVA, :IMPTOS, :MONTO, :VALORADIC
        DO
            BEGIN
            if (FOMENTO = 'SI') then
                MONTO = MONTO + VALORADIC;
            MONTO = MONTO * -1;
            MONTO = MONTO * FACTOR;
            IMPTOS = IMPTOS * FACTOR;
            execute procedure redondee(MONTO, DIG) returning_values (MONTO);
            execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
            if (IMPTOS <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTAIVA, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT F.ARTI_COD, DVDE_IVAMONTO, (DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO), TAIV_PORC, DVDE_CONSUMO
                        FROM ARTICULO A, CONTABIL_ARTICULO C, DEVOLUCIONES_VENTAS_DETALLE F, TARIFA_IVA T
                        WHERE F.DEVT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND A.TAIV_COD = T.TAIV_COD AND COAR_CTAIVAV = :CUENTA AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
                        INTO :ART, :IMPTOS, :MONTO, :PORCIVA, :VALORADIC
                    DO
                        BEGIN
                        if (IMPINC = 'S') then
                            MONTO = MONTO - IMPTOS - VALORADIC;
                        MONTO = MONTO * -1;
                        MONTO = MONTO * FACTOR;
                        IMPTOS = IMPTOS * FACTOR;
                        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                        execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                        if (IMPTOS <> 0) then
                            BEGIN
                            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :IMPTOS, 0, :MONTO, :PORCIVA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                            NROI = NROI + 1;
                            SUMA = SUMA + IMPTOS;
                            END
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                    NROI = NROI + 1;
                    SUMA = SUMA + IMPTOS;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA + IMPTOS;
                    END
                END   /* IMPTOS <> 0 */
            END /* FOR */
        if (DEC2799 = 'SI') then
            BEGIN
            FOR SELECT MAX(COAR_CTAIVADEC), SUM(FADE_IVAMONTO), SUM(FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), sum(FADE_CONSUMO)
                FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_DETALLE F
                WHERE F.FACT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
                    AND A.arti_dec2799 = 'S'
                GROUP BY COAR_CTAIVADEC
                INTO :CTADTOIVA, :IMPTOS, :MONTO, :VALORADIC
                DO
                BEGIN
                if (FOMENTO = 'SI') then
                    MONTO = MONTO + VALORADIC;
                MONTO = MONTO * -1;
                MONTO = MONTO * FACTOR;
                IMPTOS = IMPTOS * FACTOR;
                execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                if (IMPTOS <> 0) then
                    BEGIN
                    EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTADTOIVA, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                    if (ERRORC <> 0) then
                        ERROR = ERROR + 1;
                    if (TIPOCUEN = 'N') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :IMPTOS, 0, :MONTO, ABS(:IMPTOS*100/:MONTO), :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NROI = NROI + 1;
                        SUMA = SUMA + IMPTOS;
                        END
                    END   /* IMPTOS <> 0 */
                END
            END
        END /* IVA X ARTICULO */
    if (IVA = 'K') then /* IVA EN CTA CONSTANTE */
        BEGIN
        SELECT SUM(DVDE_IVAMONTO), SUM(DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO), SUM(DVDE_CONSUMO)
            FROM DEVOLUCIONES_VENTAS_DETALLE F
            WHERE F.DEVT_ID = :IDDOC  AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
            INTO :IMPTOS, :MONTO, :VALORADIC;
        if (FOMENTO = 'SI') then
            MONTO = MONTO + VALORADIC;
        MONTO = MONTO * -1;
        MONTO = MONTO * FACTOR;
        IMPTOS = IMPTOS * FACTOR;
        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
        execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
        if (IMPTOS <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTAIVA, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT F.ARTI_COD, (DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO), DVDE_IVAMONTO, TAIV_PORC, DVDE_CONSUMO
                    FROM ARTICULO A, DEVOLUCIONES_VENTAS_DETALLE F, TARIFA_IVA T
                    WHERE F.DEVT_ID = :IDDOC AND A.TAIV_COD = T.TAIV_COD AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
                    INTO :ART, :MONTO, :IMPTOS, :PORCIVA, :VALORADIC
                    DO
                    BEGIN
                    if (IMPINC = 'S') then
                        MONTO = MONTO - IMPTOS - VALORADIC;
                    MONTO = MONTO * -1;
                    MONTO = MONTO * FACTOR;
                    IMPTOS = IMPTOS * FACTOR;
                    execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                    execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                    if (IMPTOS <> 0) then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', :IMPTOS, 0, :MONTO, :PORCIVA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        SUMA = SUMA + IMPTOS;
                        END
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                NROI = NROI + 1;
                SUMA = SUMA + IMPTOS;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA + IMPTOS;
                END
            END /* IMPTOS <> 0 */
        if (DEC2799 = 'SI') then
            BEGIN
            SELECT SUM(FADE_IVAMONTO), SUM(FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), SUM(FADE_CONSUMO)
                FROM FACTURAS_DETALLE F, ARTICULO A
                WHERE F.FACT_ID = :IDDOC and FADE_IVAMONTO <> 0 AND F.arti_cod = A.arti_cod AND
                ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL)) AND A.arti_dec2799 = 'S'
                INTO :IMPTOS, :MONTO, :valoradic;
            if (FOMENTO = 'SI') then
                MONTO = MONTO + VALORADIC;
            MONTO = MONTO * -1;
            MONTO = MONTO * FACTOR;
            IMPTOS = IMPTOS * FACTOR;
            execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
            execute procedure redondee(MONTO, DIG) returning_values (MONTO);
            if (IMPTOS <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTADTOIVA, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :IMPTOS, 0, :MONTO, ABS(:IMPTOS*100/:MONTO), :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA + IMPTOS;
                    END
                END   /* IMPTOS <> 0 */
            END
        END /* IVA EN CTA CONSTANTE */
    /* EL IMPOCONSUMO */
    if ((CONSUMO = 'A') AND (FOMENTO <> 'SI')) then
        BEGIN
        FOR SELECT MAX(COAR_CTACONS), SUM(DVDE_CONSUMO)
            FROM ARTICULO A, CONTABIL_ARTICULO C, DEVOLUCIONES_VENTAS_DETALLE F
            WHERE F.DEVT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
            GROUP BY COAR_CTACONS
            INTO :CTACONSUMO, :IMPTOS
        DO
            BEGIN
            if (IMPTOS <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTACONSUMO, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, REGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT F.ARTI_COD, DVDE_CONSUMO
                        FROM ARTICULO A, CONTABIL_ARTICULO C, DEVOLUCIONES_VENTAS_DETALLE F
                        WHERE F.DEVT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTACONS = :CUENTA AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
                        INTO :ART, :IMPTOS
                    DO
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 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, :NROI, :CUENTA, :CONC, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                    NROI = NROI + 1;
                    SUMA = SUMA + IMPTOS;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA + IMPTOS;
                    END
                END /* IMPTOS <> 0 */
            END /* FOR */
        END /* CONSUMO X ARTICULO */
    if ((CONSUMO = 'K') AND (FOMENTO <> 'SI')) then
        BEGIN
        SELECT SUM(DVDE_CONSUMO)
            FROM DEVOLUCIONES_VENTAS_DETALLE F
            WHERE F.DEVT_ID = :IDDOC AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
            INTO :IMPTOS;
        if (IMPTOS <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTACONSUMO, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT F.ARTI_COD, DVDE_CONSUMO
                    FROM ARTICULO A, DEVOLUCIONES_VENTAS_DETALLE F
                    WHERE F.DEVT_ID = :IDDOC  AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
                    INTO :ART, :IMPTOS
                    DO
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTACONSUMO, :CONC, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                    NROI = NROI + 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, :NROI, :CTACONSUMO, :CONC, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA + IMPTOS;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTACONSUMO, :CONC, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA + IMPTOS;
                END
            END /* IMPTOS <> 0 */
        END /* CONSUMO EN CTA CONSTANTE */
    /* DESCUENTO */
    if ((CTADTO IS NOT NULL) AND
        (CTADTO <> '') AND
        (VRDTO <> 0)) THEN
        BEGIN
        EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTADTO, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRDTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
            NROI = NROI + 1;
            SUMA = SUMA - VRDTO;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRDTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 33);
            NROI = NROI + 1;
            SUMA = SUMA - VRDTO;
            END
        END /* DESCUENTO */
    /* VALOR ADIC */
    if ((CTAADIC IS NOT NULL) AND
        (CTAADIC <> '') AND
        (VRADIC <> 0)) THEN
        BEGIN
        EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTAADIC, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRADIC, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
            NROI = NROI + 1;
            SUMA = SUMA + VRADIC;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRADIC, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 33);
            NROI = NROI + 1;
            SUMA = SUMA + VRADIC;
            END
        END /* VR. ADIC */
    /* VALOR EXTRA */
    if ((CTAEXTRA IS NOT NULL) AND
        (CTAEXTRA <> '') AND
        (VREXTRA <> 0)) THEN
        BEGIN
        EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTAEXTRA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VREXTRA, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
            NROI = NROI + 1;
            SUMA = SUMA + VREXTRA;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VREXTRA, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 33);
            NROI = NROI + 1;
            SUMA = SUMA + VREXTRA;
            END
        END /* VR. EXTRA */
    /* RETENCION FUENTE */
    if ((RTFTE = 'C') or (RTFTE = 'K')) then
      if (VRRTFTE <> 0) then
        BEGIN
        if (RTFTE = 'C') then
            CTARTFTE = TCTARTFTE;
        EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTARTFTE, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, (:VRSUBT*-1), :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
            NROI = NROI + 1;
            SUMA = SUMA - VRRTFTE;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, (:VRSUBT*-1), :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA - VRRTFTE;
            END
        /* AUTORETENCION */
        if (FAUTORET <= fecaux) then
            BEGIN
            EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'CUENTA DE AUTORETENCION EN LA FUENTE') returning_values (CTARTFTE);
            EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTARTFTE, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :VRSUBT, :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                NROI = NROI + 1;
                SUMA = SUMA + VRRTFTE;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :VRSUBT, :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA + VRRTFTE;
                END
            END
        END /* RTFTE */
    if (RTFTE = 'A') then
      BEGIN
      FOR SELECT MAX(COAR_CTARTFTEV), MAX(COAR_RTFTE), MIN(COAR_RTBASE), SUM(DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO), SUM((DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO)*COAR_RTFTE)
        FROM CONTABIL_ARTICULO C, devoluciones_ventas_detalle F
        WHERE F.devt_id = :IDDOC AND F.ARTI_COD = C.ARTI_COD AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
        GROUP BY COAR_CTARTFTEV
        INTO :CTARTFTE, :PRTFTE, :baseadic, :MONTO, :VRRTFTE
        DO
        BEGIN
        MONTO = MONTO * FACTOR;
        if (MONTO >= BASEADIC) then
            BEGIN
            VRRTFTE = VRRTFTE * FACTOR / 100;
            execute procedure redondee(VRRTFTE, DIG) returning_values (VRRTFTE);
            execute procedure redondee(MONTO, DIG) returning_values (MONTO);
            if (VRRTFTE <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTARTFTE, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, (:MONTO*-1), :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                    NROI = NROI + 1;
                    SUMA = SUMA - VRRTFTE;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, (:MONTO*-1), :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA - VRRTFTE;
                    END
                /* AUTORETENCION */
                if (FAUTORET <= fecaux) then
                    BEGIN
                    EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'CUENTA DE AUTORETENCION EN LA FUENTE') returning_values (CTARTFTE);
                    EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTARTFTE, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
                    if (ERRORC <> 0) then
                        ERROR = ERROR + 1;
                    if (TIPOCUEN = 'C') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :MONTO, :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                        NROI = NROI + 1;
                        SUMA = SUMA + VRRTFTE;
                        END
                    if (TIPOCUEN = 'N') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :MONTO, :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NROI = NROI + 1;
                        SUMA = SUMA + VRRTFTE;
                        END
                    END
                END
            END
        END /* RTFTE */
      END
    /* RETENCION IVA */
    if ((RTIVA = 'C') or (RTIVA = 'K')) then
      if (VRRTIVA <> 0) then
        BEGIN
        if (RTIVA = 'C') then
            CTARTIVA = TCTARTIVA;
        EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTARTIVA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTIVA, (:VRIVA*-1), :PORC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
            NROI = NROI + 1;
            SUMA = SUMA - VRRTIVA;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTIVA, (:VRIVA*-1), :PORC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA - VRRTIVA;
            END
        END /* RTIVA */
    /* RETENCION DE ICA */
    if ((RTICA = 'C') or (RTICA = 'K')) then
      if (VRRTICA <> 0) then
        BEGIN
        if (RTICA = 'C') then
            CTARTICA = TCTARTICA;
        EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTARTICA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTICA, (:VRSUBT*-1), :PRTICA, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
            NROI = NROI + 1;
            SUMA = SUMA - VRRTICA;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTICA, (:VRSUBT*-1), :PRTICA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA - VRRTICA;
            END
        END /* RTICA */
    /* CIERRE EL COMPROBANTE CONTRA LA CUENTA DEL TERCERO O LA CONSTANTE */
    if ((SUMA <> 0) and ((CARTERA = 'C') or (CARTERA = 'K') or (CARTERA = 'J'))) then
        BEGIN
        if (icoing = 'SI') then
            BEGIN
            /* DESCUENTE EL IMPOCONSUMO QUE HACE PARTE DEL COSTO */
            SELECT SUM(DVDE_CONSUMO)
                FROM devoluciones_ventas_detalle F WHERE F.DEVT_ID = :IDDOC AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL)) INTO :IMPTOS;
            SUMA = SUMA - IMPTOS;
            END
        if (SUMA < 0) then
            BEGIN
            DEBITO = SUMA * -1;
            CREDITO = 0;
            END
        ELSE
            BEGIN
            DEBITO = 0;
            CREDITO = SUMA;
            END
        if (CARTERA = 'C') then
            CTACARTERA = TCTACLIEN;
        if (CARTERA = 'J') then
            BEGIN
            /* BUSQUE LA CUENTA DE LA CAJA */
            SELECT CAJA_CUENTA FROM CAJAS C, PUNTO_VENTA P
                WHERE P.CAJA_ID = C.CAJA_ID AND PTVT_ID = :PTOVTA
                INTO :CTACARTERA;
            END
        EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTACARTERA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :DEBITO, :CREDITO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
        if (TIPOCUEN = 'N') then
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :DEBITO, :CREDITO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
        NROI = NROI + 1;
        END /* SUMA EN CARTERA */
    /* CALCULE COSTOS EN VENTAS */
    EXECUTE PROCEDURE COSTO_EN_VENTAS(33, :IDDOC);
    if (COSTOS = 'A') then
        BEGIN
        FOR SELECT MAX(CTACOS), SUM(CAST(CANT AS DOUBLE PRECISION) * COSTO), SUM(DVDE_CONSUMO)
            FROM COSTO_VENTAS CV, devoluciones_ventas_detalle D WHERE CV.cove_item = D.dvde_item AND D.devt_id = :iddoc AND
            TIDO_COD = 33 AND COVE_ID = :iddoc
            GROUP BY CTACOS
            INTO :CTACOSTOS, :MONTO, :vrconsumo
        DO
            BEGIN
            if (icoing = 'SI') then
                MONTO = MONTO + VRCONSUMO;
            if (MONTO <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTACOSTOS, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT ARTI_COD, cast(CANT as double precision) * COSTO
                        FROM COSTO_VENTAS WHERE TIDO_COD = 33 AND COVE_ID = :IDDOC AND CTACOS = :CUENTA
                        INTO :ART, :MONTO
                    DO
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                    NROI = NROI + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    END
                END /* MONTO <> 0 */
            END /* FOR */
        END /* COSTOS */
    if (COSTOS = 'K') then
        BEGIN
        SELECT SUM(cast(CANT as double precision) * COSTO)
            FROM COSTO_VENTAS WHERE TIDO_COD = 33 AND COVE_ID = :IDDOC
            INTO :MONTO;
        if (icoing = 'SI') then
            MONTO = MONTO + imptos;
        if (MONTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTACOSTOS, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, REGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT ARTI_COD, cast(CANT as double precision) * COSTO
                    FROM COSTO_VENTAS WHERE TIDO_COD = 33 AND COVE_ID = :IDDOC
                    INTO :ART, :MONTO
                DO
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTACOSTOS, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                    NROI = NROI + 1;
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTACOSTOS, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                NROI = NROI + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTACOSTOS, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                END
            END /* MONTO <> 0 */
        END /* COSTOS = K */
    if (INVEN = 'A') then
        BEGIN
        FOR SELECT MAX(CTAINV), SUM(cast(CANT as double precision) * COSTO)
            FROM COSTO_VENTAS WHERE TIDO_COD = 33 AND COVE_ID = :IDDOC
            GROUP BY CTAINV
            INTO :CTAINVEN, :MONTO
        DO
            BEGIN
            if (MONTO <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTAINVEN, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, REGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT ARTI_COD, cast(CANT as double precision) * COSTO
                        FROM COSTO_VENTAS WHERE TIDO_COD = 33 AND COVE_ID = :IDDOC AND CTAINV = :CUENTA
                        INTO :ART, :MONTO
                    DO
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                    NROI = NROI + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    END
                END /* MONTO <> 0 */
            END /* FOR */
        END /* INVEN = A */
    if (INVEN = 'K') then
        BEGIN
        SELECT SUM(cast(CANT as double precision) * COSTO)
            FROM COSTO_VENTAS WHERE TIDO_COD = 33 AND COVE_ID = :IDDOC
            INTO :MONTO;
        if (MONTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTAINVEN, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT ARTI_COD, cast(CANT as double precision) * COSTO
                    FROM COSTO_VENTAS WHERE TIDO_COD = 33 AND COVE_ID = :IDDOC
                    INTO :ART, :MONTO
                DO
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTAINVEN, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                    NROI = NROI + 1;
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAINVEN, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                NROI = NROI + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAINVEN, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                END
            END /* MONTO <> 0 */
        END /* INVEN = K */
    /* recorra las cuentas adicionales */
    FOR SELECT INVC_CUENTA, INVC_BASE, INVC_PORC, INVC_VALOR, INVC_DB
        FROM INTERFAZ_VENTAS_CTAS WHERE INVE_ID = :IDINTER
        INTO :CTADIC, :BASEADIC, :PORCADIC, :VALORADIC, :DBADIC
        DO
        BEGIN
        if (valoradic <> 0) then
            monto = valoradic;
        else
            BEGIN
            if (:BASEADIC = 'SUBTOTAL') then
                VALORADIC = vrsubt;
            if (:BASEADIC = 'DESCUENTO') then
                VALORADIC = VRDTO;
            if (:BASEADIC = 'IVA') then
                VALORADIC = VRIVA;
            if (:BASEADIC = 'ADICIONAL') then
                VALORADIC = VRADIC;
            if (:BASEADIC = 'EXTRA') then
                VALORADIC = VREXTRA;
            if (:BASEADIC = 'TOTAL') then
                VALORADIC = VRTOTAL;
            MONTO = VALORADIC * PORCADIC;
            END
        if (MONTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTADIC, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                if (DBADIC = 'S') then
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                ELSE
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                NROI = NROI + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                if (DBADIC = 'S') then
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                ELSE
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                END
            NROI = NROI + 1;
            END
        END
    if (error > 0) then
        ver = 'S';
    SUSPEND;
    END
   END /* EXISTE LA INTERFAZ */
  ELSE
    BEGIN
    EXECUTE PROCEDURE ERROR (33, :IDDOC, :PREF, 1);
    ERROR = ERROR + 1;
    VER = 'S';
    SUSPEND;
    END
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE DEVOLUCIONES_SIN_CONTABILIDAD(
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    ID INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    ESTADO VARCHAR(20),
    IDI INTEGER,
    IDC INTEGER)
AS
DECLARE VARIABLE VER CHAR(2);
declare variable FECICNT VARCHAR(10);
declare variable FECFCNT VARCHAR(10);
declare variable ERROR INTEGER;
declare variable idref INTEGER;
BEGIN
EXECUTE PROCEDURE fecha_a_conta(FECINI) returning_values (FECICNT);
EXECUTE PROCEDURE fecha_a_conta(FECFIN) returning_values (FECFCNT);
FOR SELECT DEVT_ID, PREF_PRE, DEVT_NUMERO FROM devoluciones_ventas WHERE DEVT_ANULADO = 'N' AND
    DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN
    INTO :ID, :PREF, :NUMERO
DO
  BEGIN
  idref = null;
  SELECT ENCO_IDREF FROM COMPROBANTE_ENCABEZADO WHERE ENCO_TIPOREF = 33 AND ENCO_FECHA >= :FECICNT AND ENCO_FECHA <= :FECFCNT and ENCO_IDREF = :id into :idref;
  if (idref IS NULL) then
  begin
   ESTADO = 'PROCESANDO';
   SUSPEND;
   SELECT MAX(INVE_ID) FROM INTERFAZ_VENTAS WHERE PREF_PRE = :PREF AND TIDO_COD = 33 INTO :IDI;
   EXECUTE PROCEDURE contabil_devolcli (:ID, :IDI) RETURNING_VALUES (:ERROR, :VER, :IDC);
   if (ERROR = 0) then
    BEGIN
    EXECUTE PROCEDURE CONTABILIZA_PENDIENTE (:IDC);
    ESTADO = 'OK';
    END
   ELSE
    ESTADO = 'ERROR';
   suspend;
  End
  END
END


^

SET TERM ; ^


/* 20101108B */
/* previsualizacion en contabildad */

INSERT INTO CONFIGURACION (CONF_MODULO, CONF_CATEGORIA, CONF_PROPIEDAD, CONF_VALOR, CONF_POSIBLES, CONF_AYUDA) VALUES ('CONTABILIDAD', 'GENERAL', 'PREVISUALIZAR IMPRESION DE DOCUMENTOS', 'SI', 'SI,NO', 'SI:Al imprimir cualquier reporte la opción preguntando el destino. NO:Imprime directamente a la impresora predeterminada.');
commit work;

/* 20101108C */
/* si se usa cuenta de utilidad simule el cierre y traiga el resultado */
SET TERM ^ ;

CREATE OR ALTER procedure ESTADO_FLUJO_EFECTIVO (
    ANO char(4))
returns (
    SECCION integer,
    CUENTA varchar(60),
    FINAL numeric(18,2),
    SUMA numeric(18,2),
    TOTAL2 numeric(18,2),
    TOTAL3 numeric(18,2),
    TOTAL4 numeric(18,2),
    NOMSECCION varchar(120))
AS
declare variable CODCUEN VARCHAR(20);
declare variable DB CHAR(1);
declare variable LON INTEGER;
declare variable CTACIERREU VARCHAR(20);
declare variable CIERRE NUMERIC(18,2);
declare variable AUX NUMERIC(18,2);
BEGIN
/* CALCULE LA UTILIDAD DEL EJERCICIO */
EXECUTE PROCEDURE SALDO_CUENTA_MES('4', ANO, 13, 'N') RETURNING_VALUES (AUX);
CIERRE = AUX;
EXECUTE PROCEDURE SALDO_CUENTA_MES('5', ANO, 13, 'N') RETURNING_VALUES (AUX);
CIERRE = CIERRE + AUX;
EXECUTE PROCEDURE SALDO_CUENTA_MES('6', ANO, 13, 'N') RETURNING_VALUES (AUX);
CIERRE = CIERRE + AUX;
EXECUTE PROCEDURE SALDO_CUENTA_MES('7', ANO, 13, 'N') RETURNING_VALUES (AUX);
CIERRE = CIERRE + AUX;
EXECUTE PROCEDURE LEE_CONFIGURACION ('CONTABILIDAD', 'GENERAL', 'CUENTA DE UTILIDAD DEL EJERCICIO') returning_values (:CTACIERREU);

  /* SECCION 1: UTILIDAD */
  SUMA = 0;
  NOMSECCION = 'Flujo de efectivo de las actividades de operación';
  SECCION = 1;
  FOR SELECT FLEF_CUENTA, FLEF_DB, CUEN_NOM
    FROM FLUJO_EFECTIVO F, CUENTAS C
    WHERE F.FLEF_CUENTA = C.CUEN_COD AND FLEF_SECCION = 1
    ORDER BY FLEF_ID
    INTO :CODCUEN, :DB, :CUENTA
    DO
      BEGIN
      LON = STRLEN(CODCUEN);
      IF (CODCUEN = SUBSTR(CTACIERREU, 1, :LON)) then
        FINAL = CIERRE * -1;
      ELSE
        /* CALCULE EL MOV. NETO DEL AÑO */
        select SUM(code_debito-code_credito) from comprobante_detalle
          where substr(CUEN_COD, 1, :LON) = :CODCUEN into :FINAL;

      if (final is null) then
        final = 0;
      if (DB = 'S') then
          SUMA = SUMA + FINAL;
      else
          SUMA = SUMA - FINAL;
      SUSPEND;
      END
  /* SECCION 2: PARTIDAS NO MONETARIAS */
  NOMSECCION = 'Conciliación con el efectivo provisto por actividades de operación';
  SECCION = 2;
  FOR SELECT FLEF_CUENTA, FLEF_DB, CUEN_NOM
    FROM FLUJO_EFECTIVO F, CUENTAS C
    WHERE F.FLEF_CUENTA = C.CUEN_COD AND FLEF_SECCION = 2
    ORDER BY FLEF_ID
    INTO :CODCUEN, :DB, :CUENTA
    DO
      BEGIN
      LON = STRLEN(CODCUEN);
      /* CALCULE EL MOV. NETO DEL AÑO */
      select SUM(code_debito-code_credito)
        from comprobante_detalle 
        where substr(CUEN_COD, 1, :LON) = :CODCUEN
        into :FINAL;
      if (final is null) then
        final = 0;
      if (DB = 'S') then
          SUMA = SUMA + FINAL;
      else
          SUMA = SUMA - FINAL;
      SUSPEND;
      END
  /* SECCION 3: CAMBIOS EN ACTIVOS Y PASIVOS */
  NOMSECCION = 'Cambios en activos y pasivos';
  SECCION = 3;
  FOR SELECT FLEF_CUENTA, FLEF_DB, CUEN_NOM
    FROM flujo_efectivo f, CUENTAS C
    WHERE f.FLEF_CUENTA = C.CUEN_COD AND FLEF_SECCION = 3
    ORDER BY FLEF_ID
    INTO :CODCUEN, :DB, :CUENTA
    DO
      BEGIN
      LON = STRLEN(CODCUEN);
      /* CALCULE EL MOV. NETO DEL AÑO */
      select SUM(code_debito-code_credito)
        from comprobante_detalle 
        where substr(CUEN_COD, 1, :LON) = :CODCUEN
        into :FINAL;
      if (final is null) then
        final = 0;
      if (DB = 'S') then
          SUMA = SUMA + FINAL;
      else
          SUMA = SUMA - FINAL;
      SUSPEND;
      END
  TOTAL2 = SUMA;
  SUMA = 0;
  /* SECCION 4: CAPITAL UTILIZADO */
  NOMSECCION = 'Flujo de efectivo de las actividades de inversión';
  SECCION = 4;
  FOR SELECT FLEF_CUENTA, FLEF_DB, CUEN_NOM
    FROM FLUJO_EFECTIVO F, CUENTAS C
    WHERE F.FLEF_CUENTA = C.CUEN_COD AND FLEF_SECCION = 4
    ORDER BY FLEF_ID
    INTO :CODCUEN, :DB, :CUENTA
    DO
      BEGIN
      LON = STRLEN(CODCUEN);
      /* CALCULE EL MOV. NETO DEL AÑO */
      select SUM(code_debito-code_credito)
        from comprobante_detalle 
        where substr(CUEN_COD, 1, :LON) = :CODCUEN
        into :FINAL;
      if (final is null) then
        final = 0;
      if (DB = 'S') then
          SUMA = SUMA + FINAL;
      else
          SUMA = SUMA - FINAL;
      TOTAL3 = SUMA;
      SUSPEND;
      END
  SUMA = 0;
  
  /* SECCION 5: CAMBIOS EN LOS COMPONENTES */
  NOMSECCION = 'Flujo de efectivo de las actividades de financiación';
  SECCION = 5;
  FOR SELECT FLEF_CUENTA, FLEF_DB, CUEN_NOM
    FROM FLUJO_EFECTIVO F, CUENTAS C
    WHERE F.FLEF_CUENTA = C.CUEN_COD AND FLEF_SECCION = 5
    ORDER BY FLEF_ID
    INTO :CODCUEN, :DB, :CUENTA
    DO
      BEGIN
      LON = STRLEN(CODCUEN);
      /* CALCULE EL MOV. NETO DEL AÑO */
      select SUM(code_debito-code_credito)
        from comprobante_detalle 
        where substr(CUEN_COD, 1, :LON) = :CODCUEN
        into :FINAL;
      if (final is null) then
        final = 0;
      if (DB = 'S') then
          SUMA = SUMA + FINAL;
      else
          SUMA = SUMA - FINAL;
      TOTAL4 = SUMA;
      SUSPEND;
      END
END
^

SET TERM ; ^


/* 20101108D */
/* PRESUPUESTO, NO INICIALIZABA EN CERO LO PRESUPUESTADO DE CUENTAS SIN REGISTRO, ADEMAS PORCENTAJE DE SOLO LA PARTE PRESUPUESTADA SI HAY DB Y CR */
SET TERM ^ ;

CREATE OR ALTER procedure PRESUPUESTO_MES (
    PERIODO integer,
    ANO char(4),
    CUENINI varchar(20),
    CUENFIN varchar(20))
returns (
    CUENTA varchar(20),
    NOMCUENTA varchar(60),
    PRDEBITO numeric(18,2),
    PRCREDITO numeric(18,2),
    MVDEBITO numeric(18,2),
    MVCREDITO numeric(18,2),
    DIFERENCIA numeric(18,2),
    PORCENTAJE numeric(9,2))
AS
BEGIN
  /* POR CADA CUENTA AFECTABLE CALCULE PRESUP Y MOV. */
  FOR SELECT CUEN_COD, CUEN_NOM FROM CUENTAS WHERE CUEN_COD >= :CUENINI AND CUEN_COD <= :CUENFIN
      order by cuen_cod INTO :CUENTA, :NOMCUENTA
  DO
    BEGIN
    /* CALCULE EL PRESUPUESTO */
    PRDEBITO = 0;
    PRCREDITO = 0;
    SELECT PRES_DEBITO, PRES_CREDITO FROM PRESUPUESTO
        WHERE CUEN_COD = :CUENTA AND PRES_PERIODO = :PERIODO
        INTO :PRDEBITO, :PRCREDITO;
    if (PRDEBITO IS NULL) then
        PRDEBITO = 0;
    if (PRCREDITO IS NULL) then
        PRCREDITO = 0;
    /* CALCULE EL MOVIMIENTO */
    EXECUTE PROCEDURE MOVIMIENTO_CUENTA_MES(:CUENTA, :ANO, :PERIODO, 'S') returning_values (:MVDEBITO);
    
    EXECUTE PROCEDURE MOVIMIENTO_CUENTA_MES(:CUENTA, :ANO, :PERIODO, 'N') returning_values (:MVCREDITO);
    
    DIFERENCIA = 0;
    if (PRDEBITO <> 0) then
        DIFERENCIA = (PRDEBITO - MVDEBITO);
    if (PRCREDITO <> 0) then
        DIFERENCIA = DIFERENCIA - (PRCREDITO - MVCREDITO);

    if ((PRDEBITO - PRCREDITO) <> 0) then
        PORCENTAJE = 100 - (DIFERENCIA * 100 / (PRDEBITO - PRCREDITO));
    ELSE
        PORCENTAJE = 0;
    if ((PRDEBITO <> 0) or (PRCREDITO <> 0) or (MVDEBITO <> 0) or (MVCREDITO <> 0))  then
        SUSPEND;
    END
END
^

SET TERM ; ^

/* 20101110 */
/* NO TENIA EN CUENTA EL VALOR DEL DECRERTO 2799 */
SET TERM ^ ;

CREATE OR ALTER procedure ANALISIS_VENTAS_VENDEDOR (
    AGENCIA integer,
    VENDINI integer,
    VENDFIN integer,
    FECHA date)
returns (
    CODVEND integer,
    NOMVEND varchar(60),
    CODAGENCIA integer,
    NOMAGENCIA varchar(60),
    PRESUPUESTO numeric(18,2),
    VENTAS numeric(18,2),
    VENTADIA numeric(18,2),
    PENDIENTE numeric(18,2),
    FALTANTE numeric(18,2),
    FALTANTEDIA numeric(18,2),
    PORCENTAJE numeric(9,2),
    PROMEDIO numeric(18,2),
    ESPERADO numeric(18,2),
    RECAUDO numeric(18,2),
    RECAUDODIA numeric(18,2),
    PENDIENTER numeric(18,2),
    MOSTRADORV numeric(18,2),
    MOSTRADORR numeric(18,2),
    MAXIMAVTA numeric(18,2),
    MESMAXIMO varchar(8),
    VENTAANOP numeric(18,2),
    DEBERIAIR numeric(9,2))
AS
DECLARE VARIABLE FECAUX VARCHAR(10);
DECLARE VARIABLE FECINI VARCHAR(10);
DECLARE VARIABLE FEC DATE;
DECLARE VARIABLE ANO INTEGER;
DECLARE VARIABLE MES INTEGER;
DECLARE VARIABLE TIPODOC INTEGER;
DECLARE VARIABLE ID INTEGER;
DECLARE VARIABLE ABONO NUMERIC(18,2);
DECLARE VARIABLE SUBTOTAL NUMERIC(18,2);
DECLARE VARIABLE IVAMONTO NUMERIC(18,2);
DECLARE VARIABLE TOTAL NUMERIC(18,2);
DECLARE VARIABLE ESCONTADO CHAR(1);
DECLARE VARIABLE DIAS INTEGER;
DECLARE VARIABLE AGEN_ANT INTEGER;
DECLARE VARIABLE TOTAL_SUC NUMERIC(18,2);
declare variable DIA INTEGER;
begin
MOSTRADORV = 0;
MOSTRADORR = 0;
AGEN_ANT = 0;
total_suc = 0;
FECAUX = CAST (FECHA AS VARCHAR(10));
ANO = CAST(SUBSTR(FECAUX, 1, 4) AS INTEGER);
MES = CAST(SUBSTR(FECAUX, 6, 7) AS INTEGER);
FECINI = SUBSTR(FECAUX, 1, 8) || '01';
DIA = extract (DAY FROM FECHA);
/*SELECT PRVM_DIAS FROM PRESUPUESTO_VENTAS_MESES WHERE PRVM_ANO = :ANO AND PRVM_MES = :MES INTO :DIAS; */
DIAS = EXTRACT(DAY FROM (FECHA - EXTRACT(DAY FROM FECHA) + 32 - EXTRACT(DAY FROM FECHA - EXTRACT(DAY FROM FECHA) + 32)));
FOR SELECT VEND_COD, VEND_NOMBRE, SUCU_ID, VEND_CONTADO FROM VENDEDORES WHERE VEND_COD >= :VENDINI AND VEND_COD <= :VENDFIN  AND
    ((SUCU_ID = :AGENCIA) or (:AGENCIA = 0)) ORDER BY SUCU_ID, VEND_COD
    INTO :CODVEND, :NOMVEND, :CODAGENCIA, :ESCONTADO
    DO
    BEGIN
    if (CODAGENCIA <> 0) then
        BEGIN
        SELECT SUCU_NOMBRE FROM SUCURSALES WHERE SUCU_ID = :CODAGENCIA INTO :NOMAGENCIA;
        MAXIMAVTA = 0;
        MESMAXIMO = '';
        VENTAANOP = 0;
        /* LA MAXIMA VENTA Y EL MES EN QUE OCURRIO */
        SELECT MAX(HIVE_VENTA) FROM historico_ventas WHERE SUCU_ID = :codagencia INTO maximavta;
        SELECT MAX(CAST(HIVE_MES AS CHAR(2)) || '/' || CAST(HIVE_ANO AS CHAR(4))) FROM
            historico_ventas WHERE HIVE_VENTA = :maximavta AND SUCU_ID = :codagencia INTO :mesmaximo;
        /* LA VENTA DEL MISMO MES EL ANO ANTERIOR */
        SELECT HIVE_VENTA FROM historico_ventas WHERE HIVE_ANO = :ANO-1 AND HIVE_MES = :MES AND SUCU_ID = :codagencia INTO :ventaanop;
        END
    /* TRAIGA EL PRESUPUESTO DEL MES */
    PRESUPUESTO = 0;
    PENDIENTE = 0;
    PENDIENTER = 0;
    SELECT PRVE_VENTA, PRVE_PENDIENTE, PRVE_PENDRECA FROM PRESUPUESTO_VENTAS
        WHERE VEND_COD = :CODVEND AND PRVE_ANO = :ANO AND PRVE_MES = :MES
        INTO :PRESUPUESTO, :PENDIENTE, :PENDIENTER;

    /* CALCULE LAS VENTAS */
    SELECT SUM((FADE_TOTAL-FADE_IVAMONTO+FACT_DEC2799-FADE_CONSUMO)*FACT_FACTOR) FROM FACTURAS F, PREFIJOS P, FACTURAS_DETALLE D
        WHERE VEND_COD = :CODVEND AND FACT_FECHA = :FECHA AND FACT_ANULADO = 'N' AND F.fact_id = D.fact_id
        AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND ((SUCU_ID = :AGENCIA) or (:AGENCIA = 0))
        INTO :VENTADIA;
    if (VENTADIA is null) then
        VENTADIA = 0;
    SELECT SUM((FADE_TOTAL-FADE_IVAMONTO+FACT_DEC2799-FADE_CONSUMO)*FACT_FACTOR) FROM FACTURAS F, PREFIJOS P, FACTURAS_DETALLE D
        WHERE VEND_COD = :CODVEND AND FACT_FECHA >= :FECINI AND FACT_FECHA < :FECHA AND FACT_ANULADO = 'N' AND F.fact_id = D.fact_id
        AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND ((SUCU_ID = :AGENCIA) or (:AGENCIA = 0))
        INTO :SUBTOTAL;
    if (subtotal is null) then
        ventas = VENTADIA;
    else
        VENTAS = SUBTOTAL + VENTADIA;
    /* CALCULE LAS DEVOLUCIONES */
    SELECT SUM((DVDE_TOTAL-DVDE_IVAMONTO+DEVT_DEC2799-DVDE_CONSUMO)*DEVT_FACTOR) FROM devoluciones_ventas F, PREFIJOS P, devoluciones_ventas_detalle D
        WHERE VEND_COD = :CODVEND AND DEVT_FECHA = :FECHA AND DEVT_ANULADO = 'N' AND F.devt_id = D.devt_id
        AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 33 AND ((SUCU_ID = :AGENCIA) or (:AGENCIA = 0))
        INTO :SUBTOTAL;
    if (subtotal is not null) then
        BEGIN
        VENTADIA = VENTADIA - SUBTOTAL;
        VENTAS = VENTAS - SUBTOTAL;
        END
    SELECT SUM((DVDE_TOTAL-DVDE_IVAMONTO+DEVT_DEC2799-DVDE_CONSUMO)*DEVT_FACTOR) FROM devoluciones_ventas F, PREFIJOS P, devoluciones_ventas_detalle D
        WHERE VEND_COD = :CODVEND AND DEVT_FECHA >= :FECINI AND DEVT_FECHA < :FECHA AND DEVT_ANULADO = 'N' AND F.devt_id = D.devt_id
        AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 33 AND ((SUCU_ID = :AGENCIA) or (:AGENCIA = 0))
        INTO :SUBTOTAL;
    if (subtotal is not null) then
        BEGIN
        VENTAS = VENTAS - SUBTOTAL;
        END
    /* CALCULE LAS NOTAS CREDITO */
    SELECT SUM(NCCL_MONTO) FROM NOTAS_CREDITO_CLIENTES F, PREFIJOS P
        WHERE VEND_COD = :CODVEND AND NCCL_FECHA = :FECHA AND NCCL_ANULADO = 'N'
        AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 42 AND ((SUCU_ID = :AGENCIA) or (:AGENCIA = 0))
        INTO :SUBTOTAL;
    if (subtotal is not null) then
        BEGIN
        VENTADIA = VENTADIA - SUBTOTAL;
        VENTAS = VENTAS - SUBTOTAL;
        END
    SELECT SUM(NCCL_MONTO) FROM NOTAS_CREDITO_CLIENTES F, PREFIJOS P
        WHERE VEND_COD = :CODVEND AND NCCL_FECHA >= :FECINI AND NCCL_FECHA < :FECHA AND NCCL_ANULADO = 'N'
        AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 42 AND ((SUCU_ID = :AGENCIA) or (:AGENCIA = 0))
        INTO :SUBTOTAL;
    if (subtotal is not null) then
        VENTAS = VENTAS - SUBTOTAL;
    FALTANTE = PRESUPUESTO - VENTAS;
    if (DIAS - DIA > 0) then
        FALTANTEDIA = FALTANTE / (DIAS - DIA);
    ELSE
        FALTANTEDIA = FALTANTE;
    if (PRESUPUESTO <> 0) then
        PORCENTAJE = VENTAS / PRESUPUESTO * 100;
    ELSE
        PORCENTAJE = 0;
    PROMEDIO = (VENTAS + PENDIENTE) / DIA;
    ESPERADO = PROMEDIO * DIAS;
    DEBERIAIR = DIA * 100/ dias;
    RECAUDO = 0;
    RECAUDODIA = 0;
    /* CALCULE EL RECAUDO DEL MES EXCLUYENDO EL IVA */
    FOR SELECT RECA_FECHA, RCDE_TIPODOC, RCDE_IDDOC, (RCDE_ABONO+RCDE_RTFTE+RCDE_RTIVA+RCDE_RTICA)
        FROM RECIBOS_CAJA R, RECIBOS_CAJA_DETALLE RD
        WHERE R.RECA_ID = RD.RECA_ID AND
        RECA_FECHA >= :FECINI AND RECA_FECHA <= :FECHA AND RECA_ANULADO = 'N' AND COBR_COD = :CODVEND
        ORDER BY RECA_FECHA
        INTO :FEC, :TIPODOC, :ID, :ABONO
        DO
        BEGIN
        /* TRAIGA EL DOCUMENTO Y CALCULE LA BASE */
        if (TIPODOC = 31) then
                SELECT FACT_TOTAL,FACT_IVAMONTO-FACT_DEC2799 FROM FACTURAS WHERE FACT_ID = :ID INTO :TOTAL, :IVAMONTO;
        if (TIPODOC = 33) then
                SELECT DEVT_TOTAL*-1,(DEVT_IVAMONTO-DEVT_DEC2799)*-1 FROM DEVOLUCIONES_VENTAS WHERE DEVT_ID = :ID INTO :TOTAL, :IVAMONTO;
        if (TIPODOC = 41) then
                SELECT NDCL_MONTO,NDCL_IVAMONTO FROM NOTAS_DEBITO_CLIENTES WHERE NDCL_ID = :ID INTO :TOTAL, :IVAMONTO;
        if (TIPODOC = 42) then
                SELECT NCCL_MONTO*-1,NCCL_IVAMONTO*-1 FROM NOTAS_CREDITO_CLIENTES WHERE NCCL_ID = :ID INTO :TOTAL, :IVAMONTO;
        if (TIPODOC = 45) then
                SELECT ANCL_BASE*-1,0 FROM ANTICIPOS_CLIENTE WHERE ANCL_ID = :ID INTO :TOTAL, :IVAMONTO;
        if (TIPODOC = 77) then
                SELECT DVCH_MONTO,0 FROM DEVOLUCION_CHEQUES WHERE DVCH_ID = :ID INTO :TOTAL, :IVAMONTO;
        if (TOTAL <> 0) then
            SUBTOTAL = (ABONO / TOTAL) * (TOTAL - IVAMONTO);
        RECAUDO = RECAUDO + SUBTOTAL;
        if (FEC = FECHA) then
            RECAUDODIA = RECAUDODIA + SUBTOTAL;
        END
    if (ESCONTADO = 'S') then
        BEGIN
        MOSTRADORV = MOSTRADORV + VENTAS;
        MOSTRADORR = MOSTRADORR + RECAUDO;
        END
    /* actualice el historico */
    if (AGEN_ANT <> codagencia)  then
        BEGIN
        if (AGEN_ANT <> 0) THEN
            BEGIN
            TOTAL = null;
            SELECT HIVE_VENTA FROM historico_ventas WHERE HIVE_ANO = :ANO AND HIVE_MES = :MES AND SUCU_ID = :AGEN_ANT INTO :TOTAL;
            if (TOTAL is not null) then
                BEGIN
                if (TOTAL_SUC <> 0) then
                    UPDATE historico_ventas SET HIVE_VENTA = (:total_suc)  WHERE HIVE_ANO = :ANO AND HIVE_MES = :MES AND SUCU_ID = :AGEN_ANT;
                END
            ELSE
                INSERT INTO historico_ventas (HIVE_ANO, HIVE_MES, SUCU_ID, HIVE_VENTA) VALUES (:ANO, :MES, :AGEN_ANT, :TOTAL_SUC);
            END
        total_suc = VENTAS;
        END
    ELSE
        BEGIN
        total_suc = :total_suc + :VENTAS;
        END
    AGEN_ANT = :codagencia;
    if ((VENTAS <> 0) or (RECAUDO <> 0) or (:presupuesto <> 0)) then
        suspend;
    END
end
^

SET TERM ; ^


SET TERM ^ ;

CREATE OR ALTER procedure COMISIONES_COBRO (
    DESDE integer,
    HASTA integer,
    FECINI date,
    FECFIN date,
    DETALLE char(1))
returns (
    CODVEND integer,
    NOMVEND varchar(60),
    NIT varchar(20),
    CLIENTE varchar(60),
    NOMTIPO varchar(8),
    PREFIJO varchar(4),
    NUMERO varchar(6),
    FECDOC date,
    PREFREC varchar(4),
    NUMREC varchar(6),
    FECREC date,
    DIAS integer,
    ABONO numeric(18,2),
    BASE numeric(18,2),
    COMIMONTO numeric(18,2),
    COMIPORC numeric(9,2),
    ARTICULO varchar(20),
    CODGRP varchar(2),
    CANT numeric(18,4),
    DTOFIN numeric(18,2),
    VENCE date,
    RTFTE numeric(18,2),
    RTIVA numeric(18,2),
    RTICA numeric(18,2))
AS
DECLARE VARIABLE TIPO INTEGER;
DECLARE VARIABLE ID INTEGER;
DECLARE VARIABLE IVAMONTO NUMERIC(18,2);
DECLARE VARIABLE TOTAL NUMERIC(18,2);
DECLARE VARIABLE SITOT CHAR(2);
DECLARE VARIABLE VENTA CHAR(2);
DECLARE VARIABLE COMIV NUMERIC(18,2);
DECLARE VARIABLE PORCV double precision;
DECLARE VARIABLE CONSUMO NUMERIC(18,2);
declare variable ALFINAL CHAR(2);
declare variable SALDO NUMERIC(18,2);
declare variable COMISION VARCHAR(10);
declare variable porcaux NUMERIC(9,2);
declare variable BASEAUX DOUBLE PRECISION;
declare variable SUCURSAL VARCHAR(20);
declare variable COMIART VARCHAR(6);
declare variable LISTA INTEGER;
declare variable LISTAP INTEGER;
declare variable INCDTO CHAR(2);
declare variable INCCHE CHAR(2);
declare variable OK CHAR(1);
declare variable IDF INTEGER;
declare variable COMIXVND CHAR(2);
declare variable COMIDIAS NUMERIC(9,2);
declare variable ICOINC CHAR(2);
BEGIN
EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA','COMISIONES','COMISION POR COBRO PAGADERA SOLO EN EL COBRO TOTAL') returning_values (:ALFINAL);
execute procedure lee_configuracion('CARTERA','COMISIONES','COMISION POR COBRO COMO PORCENTAJE DE LA COMISION VENTA') returning_values (:venta);
EXECUTE PROCEDURE lee_configuracion('CARTERA', 'COMISIONES', 'LIQUIDAR COMISION COBRO CON COBRADOR DEL DOCUMENTO O DEL RECIBO') returning_values (:COMISION);
EXECUTE PROCEDURE lee_configuracion ('FACTURACION','FACTURAS', 'CODIGO DE LA LISTA DE PRECIOS A MOSTRAR EN ARTICULOS') returning_values (:LISTAP);
EXECUTE PROCEDURE lee_configuracion('CARTERA', 'COMISIONES', 'COMISION POR COBRO POR ARTICULO') returning_values (:comiart);
EXECUTE PROCEDURE lee_configuracion('CARTERA', 'COMISIONES', 'INCLUIR DESCUENTO FINANCIERO EN BASE DE COMISIONES POR COBRO') returning_values (:incdto);
EXECUTE PROCEDURE lee_configuracion('CARTERA', 'COMISIONES', 'INCLUIR RECAUDO DE CHEQUES DEVUELTOS EN COMISIONES') returning_values (:incche);
EXECUTE PROCEDURE lee_configuracion('CARTERA', 'COMISIONES', 'COMISION POR ARTICULO Y PROPORCION POR DIAS DE RECAUDO') returning_values (:comixvnd);
EXECUTE PROCEDURE lee_configuracion('CARTERA', 'COMISIONES', 'COMISION POR COBRO INCLUYENDO EL IMPOCONSUMO') returning_values (:icoinc);
EXECUTE PROCEDURE lee_configuracion('CARTERA', 'COMISIONES', 'COMISION POR COBRO SOBRE EL TOTAL') returning_values (:SITOT);
FOR SELECT RCDE_TIPODOC, RCDE_IDDOC, RCDE_PREFIJO, RCDE_NUMERO, R.TERC_NIT, TERC_NOM, RECA_FECHA, (RCDE_ABONO+RCDE_RTFTE+RCDE_RTIVA+RCDE_RTICA), PREF_PRE, RECA_NUMERO, COBR_COD, RCDE_DTOF, RCDE_RTFTE, RCDE_RTIVA, RCDE_RTICA
    FROM RECIBOS_CAJA R, RECIBOS_CAJA_DETALLE RD, TERCEROS T
    WHERE R.RECA_ID = RD.RECA_ID AND RECA_FECHA >= :FECINI AND RECA_FECHA <= :FECFIN AND R.TERC_NIT = T.TERC_NIT AND RECA_ANULADO = 'N'
    ORDER BY TERC_NIT, RECA_FECHA
    INTO :TIPO, :ID, :PREFIJO, :NUMERO, :NIT, :CLIENTE, :FECREC, :ABONO, :PREFREC, :NUMREC, :codvend, :DTOFIN, :rtfte, :RTIVA, :RTICA
    DO
    BEGIN
    SELECT TIDO_NOMCORTO FROM TIPO_DOCUMENTO WHERE TIDO_COD = :TIPO INTO :NOMTIPO;
    if (incdto = 'SI') then
        ABONO = ABONO + DTOFIN;
    if (COMISION = 'DOCUMENTO') then
        SELECT MVCL_FECHA, COBR_COD, MVCL_VENCE FROM MOVIMIENTO_CLIENTES WHERE MVCL_TIPOREF = :TIPO AND MVCL_IDREF = :ID
            INTO :FECDOC, :codvend, :VENCE;
    else
        SELECT MVCL_FECHA, MVCL_VENCE FROM MOVIMIENTO_CLIENTES WHERE MVCL_TIPOREF = :TIPO AND MVCL_IDREF = :ID
            INTO :FECDOC, :VENCE;
    if (FECDOC IS NOT NULL) then
        DIAS = FECREC - FECDOC;
    ELSE
        DIAS = 999;
    if ((codvend >= :DESDE) AND (codvend <= :hasta)) then
        BEGIN
        select COBR_NOM from COBRADORES where COBR_COD = :codvend INTO :nomvend;
        /* TRAIGA EL PORCENTAJE DE ACUERDO A LOS DIAS */
        COMIPORC = 0;
        SELECT CMCB_PORC FROM COMISION_COBRO WHERE CMCB_DIASINI <= :dias AND CMCB_DIASFIN >= :DIAS AND COBR_COD = :CODVEND
            INTO :COMIPORC;
        if (COMIPORC IS NULL) THEN
            COMIPORC = 0;
        COMIDIAS = COMIPORC;
        if (VENTA = 'NO') then
            BEGIN
            if (ALFINAL = 'SI') then
                BEGIN
                EXECUTE PROCEDURE saldo_doc_cartera(:tipo, :ID, :FECREC, 0) returning_values (:SALDO);
                if (SALDO = 0) then
                    OK = 'S';
                else
                    OK = 'N';
                end
            else
                OK = 'S';
            if (TIPO = 31) then
                BEGIN
                if (DETALLE = 'N') then
                    SELECT MAX(FACT_TOTAL), MAX(FACT_IVAMONTO-FACT_DEC2799), SUM(FADE_CONSUMO) FROM FACTURAS F, FACTURAS_DETALLE D
                        WHERE F.FACT_ID = D.FACT_ID AND F.FACT_ID = :ID INTO :TOTAL, :IVAMONTO, :CONSUMO;
                ELSE
                    FOR SELECT D.ARTI_COD, FADE_CANT, FADE_TOTAL, FADE_IVAMONTO, FADE_CONSUMO, GRUP_COD, LIPR_COD
                        FROM FACTURAS F, FACTURAS_DETALLE D, ARTICULO A
                        WHERE F.FACT_ID = D.FACT_ID AND D.arti_cod = A.arti_cod AND F.FACT_ID = :ID and substring(a.arti_cod from 1 FOR 2) <> '.t'
                        INTO :ARTICULO, :CANT, :TOTAL, :IVAMONTO, :CONSUMO, :CODGRP, :lista
                        DO
                        BEGIN
                        if (comiart = 'GRUPO') then
                            SELECT GRUP_COMIPOR FROM GRUPO WHERE GRUP_COD = :codgrp INTO :comiporc;
                        if (comiart = 'PRECIO') then
                            SELECT PRAR_COMIC FROM precios_articulo WHERE ARTI_COD = :articulo AND LIPR_COD = :LISTA INTO :comiporc;

                        if (SITOT = 'SI') then
                            BASEAUX = TOTAL;
                        ELSE
                            begin
                            BASEAUX = TOTAL - IVAMONTO;
                            if (ICOINC <> 'SI') then
                                BASEAUX = BASEAUX - CONSUMO;
                            end
                        if (OK = 'S') then
                            begin
                            if (alfinal = 'SI') then
                                BASE = BASEAUX;
                            else
                                begin
                                /* calcula la proporcion del abono */
                                SELECT FACT_TOTAL FROM FACTURAS WHERE FACT_ID = :ID INTO :TOTAL;
                                if (TOTAL <> 0) then
                                    BASE = BASEAUX * (ABONO / TOTAL);
                                else
                                    BASE = 0;
                                end
                            end
                        else
                            BASE = 0;
                        if (comixvnd = 'SI') then
                            BEGIN                          
                            comiporc = comiporc * comidias / 100;
                            END
                        COMIMONTO = BASE / 100 * COMIPORC;
                        SUSPEND;
                        END
                END
            if (TIPO = 33) then
                if (DETALLE = 'N') then
                    SELECT MAX(DEVT_TOTAL*-1), MAX((DEVT_IVAMONTO-DEVT_DEC2799)*-1), SUM(DVDE_CONSUMO) FROM DEVOLUCIONES_VENTAS V, DEVOLUCIONES_VENTAS_DETALLE D
                        WHERE V.DEVT_ID = D.DEVT_ID AND V.DEVT_ID = :ID INTO :TOTAL, :IVAMONTO, :CONSUMO;
                ELSE
                    FOR SELECT D.ARTI_COD, DVDE_CANT, DVDE_TOTAL*-1, DVDE_IVAMONTO*-1, DVDE_CONSUMO*-1, GRUP_COD, DEVT_FACTID
                        FROM DEVOLUCIONES_VENTAS V, DEVOLUCIONES_VENTAS_DETALLE D, ARTICULO A
                        WHERE V.DEVT_ID = D.DEVT_ID AND D.arti_cod = A.arti_cod AND V.DEVT_ID = :ID and substring(a.arti_cod from 1 FOR 2) <> '.t'
                        INTO :ARTICULO, :CANT, :TOTAL, :IVAMONTO, :CONSUMO, :codgrp, :IDF
                        DO
                        BEGIN
                        if (comiart = 'GRUPO') then
                            SELECT GRUP_COMIPOR FROM GRUPO WHERE GRUP_COD = :codgrp INTO :comiporc;
                        if (comiart = 'PRECIO') then
                            BEGIN
                            LISTA = 0;
                            SELECT MAX(LIPR_COD) FROM facturas_detalle d WHERE ARTI_COD = :ARTICULO AND FACT_ID = :IDF INTO :LISTA;
                            if (LISTA = 0) then
                                LISTA = LISTAP;
                            SELECT PRAR_COMIC FROM precios_articulo WHERE ARTI_COD = :articulo AND LIPR_COD = :LISTA INTO :comiporc;
                            END
                        if (SITOT = 'SI') then
                            BASEAUX = TOTAL;
                        ELSE
                            begin
                            BASEAUX = TOTAL - IVAMONTO;
                            if (ICOINC <> 'SI') then
                                BASEAUX = BASEAUX - CONSUMO;
                            end
                        if (OK = 'S') then
                            begin
                            if (alfinal = 'SI') then
                                BASE = BASEAUX;
                            else
                                begin
                                /* calcula la proporcion del abono */
                                SELECT DEVT_TOTAL FROM DEVOLUCIONES_VENTAS WHERE DEVT_ID = :ID INTO :TOTAL;
                                if (TOTAL <> 0) then
                                    BASE = BASEAUX * (ABONO / TOTAL);
                                else
                                    BASE = 0;
                                end
                            end
                        else
                            BASE = 0;
                        if (comixvnd = 'SI') then
                            BEGIN                          
                            comiporc = comiporc * comidias / 100;
                            END
                        COMIMONTO = BASE / 100 * COMIPORC;
                        SUSPEND;
                        END
            if (TIPO = 41) then
                SELECT NDCL_MONTO, NDCL_IVAMONTO, 0 FROM NOTAS_DEBITO_CLIENTES WHERE NDCL_ID = :ID INTO :TOTAL, :IVAMONTO, :CONSUMO;
            if (TIPO = 42) then
                SELECT NCCL_MONTO*-1, NCCL_IVAMONTO*-1, 0 FROM NOTAS_CREDITO_CLIENTES WHERE NCCL_ID = :ID INTO :TOTAL, :IVAMONTO, :CONSUMO;
            if (TIPO = 77) then
                if (INCCHE = 'SI') then
                    SELECT DVCH_MONTO, 0, 0 FROM DEVOLUCION_CHEQUES WHERE DVCH_ID = :ID INTO :TOTAL, :IVAMONTO, :CONSUMO;
                ELSE
                    BEGIN
                    TOTAL = 0;
                    IVAMONTO = 0;
                    CONSUMO = 0;
                    END
            if (SITOT = 'SI') then
                BASEAUX = ABONO;
            ELSE
                if (TOTAL <> 0) then
                    if (ICOINC <> 'SI') then
                        BASEAUX = (ABONO / TOTAL) * (TOTAL - IVAMONTO - CONSUMO);
                    else
                        BASEAUX = (ABONO / TOTAL) * (TOTAL - IVAMONTO);
                ELSE
                    BASEAUX = 0;
            BASE = BASEAUX;
            if (comixvnd = 'SI') then
                BEGIN
                comiporc = comiporc * comidias / 100;
                END
            COMIMONTO = BASE / 100 * COMIPORC;
            END
        ELSE
            BEGIN
            if (TIPO = 31) then
                if (DETALLE = 'N') then
                    SELECT MAX(FACT_TOTAL), MAX(FACT_IVAMONTO-FACT_DEC2799), MAX(FACT_COMIPORC), SUM(FADE_CONSUMO)
                        FROM FACTURAS F, FACTURAS_DETALLE D WHERE F.FACT_ID = D.FACT_ID AND F.FACT_ID = :ID
                        INTO :TOTAL, :IVAMONTO, :PORCV, :CONSUMO;
                ELSE
                    FOR SELECT D.ARTI_COD, FADE_CANT, FADE_TOTAL, FADE_IVAMONTO, FADE_CONSUMO, FACT_COMIPORC, GRUP_COD
                        FROM FACTURAS F, FACTURAS_DETALLE D, ARTICULO A
                        WHERE F.FACT_ID = D.FACT_ID AND D.arti_cod = A.arti_cod AND F.FACT_ID = :ID and substring(a.arti_cod from 1 FOR 2) <> '.t'
                        INTO :ARTICULO, :CANT, :TOTAL, :IVAMONTO, :CONSUMO, :porcv, :codgrp
                        DO
                        BEGIN
                        if (SITOT = 'SI') then
                            BASEAUX = TOTAL;
                        ELSE
                            begin
                            BASEAUX = TOTAL - IVAMONTO;
                            if (ICOINC <> 'SI') then
                                BASEAUX = BASEAUX - CONSUMO;
                            end
                        /* calcula la proporcion del abono */
                        SELECT FACT_TOTAL FROM FACTURAS WHERE FACT_ID = :ID INTO :TOTAL;
                        if (TOTAL <> 0) then
                            BASE = BASEAUX * (ABONO / TOTAL);
                        else
                            BASE = 0;
                        COMIV = BASE / 100 * PORCV;
                        COMIMONTO = COMIV / 100 * COMIPORC;
                        porcaux = comiporc;
                        comiporc = PORCV * COMIPORC / 100;
                        SUSPEND;
                        END
            if (TIPO = 33) then
                if (DETALLE = 'N') then
                    SELECT MAX(DEVT_TOTAL*-1), MAX((DEVT_IVAMONTO-DEVT_DEC2799)*-1), MAX(DEVT_COMIPORC*-1), SUM(DVDE_CONSUMO*-1)
                        FROM DEVOLUCIONES_VENTAS V, DEVOLUCIONES_VENTAS_DETALLE D WHERE V.DEVT_ID = D.DEVT_ID AND D.DEVT_ID = :ID
                        INTO :TOTAL, :IVAMONTO, :PORCV, :CONSUMO;
                ELSE
                    FOR SELECT D.ARTI_COD, DVDE_CANT, DVDE_TOTAL*-1, DVDE_IVAMONTO*-1, DVDE_CONSUMO*-1, DEVT_COMIPORC, GRUP_COD
                        FROM DEVOLUCIONES_VENTAS V, DEVOLUCIONES_VENTAS_DETALLE D, ARTICULO A
                        WHERE V.DEVT_ID = D.DEVT_ID AND D.arti_cod = A.arti_cod AND V.DEVT_ID = :ID and substring(a.arti_cod from 1 FOR 2) <> '.t'
                        INTO :ARTICULO, :CANT, :TOTAL, :IVAMONTO, :CONSUMO, :porcv, :codgrp
                        DO
                        BEGIN
                        if (SITOT = 'SI') then
                            BASEAUX = TOTAL;
                        ELSE
                            begin
                            BASEAUX = TOTAL - IVAMONTO;
                            if (ICOINC <> 'SI') then
                                BASEAUX = BASEAUX - CONSUMO;
                            end
                        /* calcula la proporcion del abono */
                        SELECT DEVT_TOTAL FROM DEVOLUCIONES_VENTAS WHERE DEVT_ID = :ID INTO :TOTAL;
                        if (TOTAL <> 0) then
                            BASE = BASEAUX * (ABONO / TOTAL);
                        else
                            BASE = 0;
                        COMIV = BASE / 100 * PORCV;
                        COMIMONTO = COMIV / 100 * COMIPORC;
                        porcaux = comiporc;
                        comiporc = PORCV * COMIPORC / 100;
                        SUSPEND;
                        END
            if (TIPO = 41) then
                SELECT NDCL_MONTO, NDCL_IVAMONTO, NDCL_COMIPORC, 0 FROM NOTAS_DEBITO_CLIENTES
                    WHERE NDCL_ID = :ID INTO :TOTAL, :IVAMONTO, :PORCV, :CONSUMO;
            if (TIPO = 42) then
                SELECT NCCL_MONTO, NCCL_IVAMONTO, NCCL_COMIPORC, 0  FROM NOTAS_CREDITO_CLIENTES
                    WHERE NCCL_ID = :ID INTO :TOTAL, :IVAMONTO, :PORCV, :CONSUMO;
            if (TIPO = 77) then
                if (INCCHE = 'SI') then
                    SELECT DVCH_MONTO, 0, 0, 0 FROM DEVOLUCION_CHEQUES WHERE DVCH_ID = :ID INTO :TOTAL, :IVAMONTO, :PORCV, :CONSUMO;
                ELSE
                    BEGIN
                    TOTAL = 0;
                    IVAMONTO = 0;
                    CONSUMO = 0;
                    PORCV = 0;
                    END
            if (SITOT = 'SI') then
                BASEAUX = ABONO;
            ELSE
                if ((total <> 0) AND (ABONO <> 0)) then
                    if (ICOINC <> 'SI') then
                        BASEAUX = (TOTAL - IVAMONTO - CONSUMO) / TOTAL * ABONO;
                    else
                        BASEAUX = (TOTAL - IVAMONTO) / TOTAL * ABONO;
                ELSE
                    BASEAUX = 0;
            COMIV = BASEAUX / 100 * PORCV;
            COMIMONTO = COMIV / 100 * COMIPORC;
            porcaux = comiporc;
            comiporc = PORCV * COMIPORC / 100;
            BASE = BASEAUX;
            END
        if (DETALLE = 'N') then
            if (ALFINAL = 'SI') then
                BEGIN
                /* VERIFIQUE EL SALDO DEL DOCUMENTO, SI ES CERO LIQUIDE COMISION SOBRE EL TOTAL */
                EXECUTE PROCEDURE saldo_doc_cartera(:tipo, :ID, :FECREC, 0) returning_values (:SALDO);
                if (SALDO = 0) then
                    BEGIN
                    if (VENTA = 'NO') then
                        begin
                        if (SITOT = 'SI') then
                            BASEAUX = TOTAL;
                        ELSE
                            if (ICOINC <> 'SI') then
                                BASEAUX = TOTAL - IVAMONTO - CONSUMO;
                            else
                                BASEAUX = TOTAL - IVAMONTO;
                        COMIMONTO = BASEAUX * COMIPORC / 100;
                        end
                    ELSE
                        BEGIN
                        if (SITOT = 'SI') then
                            BASEAUX = TOTAL;
                        ELSE
                            begin
                            BASEAUX = TOTAL - IVAMONTO;
                            if (ICOINC <> 'SI') then
                                BASEAUX = BASEAUX - CONSUMO;
                            end
                        COMIV = PORCV * BASEAUX / 100;
                        COMIMONTO = COMIV / 100 * porcaux;
                        comiporc = PORCV * porcaux / 100;
                        END
                    BASE = BASEAUX;
                    SUSPEND;
                    END
                END
            ELSE
                SUSPEND;
        ELSE
            if ((TIPO <> 31) AND (TIPO <> 33)) then
                SUSPEND;
        END
    END
FOR SELECT EGCC_TIPODOC, EGCC_IDDOC, EGCC_PREFIJO, EGCC_NUMERO, E.TERC_NIT, TERC_NOM, EGRE_FECHA, (EGCC_ABONO+EGCC_RTFTE+EGCC_RTIVA+EGCC_RTICA), PREF_PRE, EGRE_NUMERO, EGCC_SUCURSAL, EGCC_DTOF
    FROM EGRESOS E, EGRESOS_CRUCEC C, TERCEROS T
    WHERE E.EGRE_ID = C.EGRE_ID AND EGRE_FECHA >= :FECINI AND EGRE_FECHA <= :FECFIN AND E.TERC_NIT = T.TERC_NIT AND EGRE_ANULADO = 'N'
    ORDER BY TERC_NIT, EGRE_FECHA
    INTO :TIPO, :ID, :PREFIJO, :NUMERO, :NIT, :CLIENTE, :FECREC, :ABONO, :PREFREC, :NUMREC, :SUCURSAL, :dtofin
    DO
    BEGIN
    SELECT COBR_COD FROM cliente_sucursales WHERE TERC_NIT = :NIT AND CLCU_COD = :sucursal INTO :codvend;
    SELECT TIDO_NOMCORTO FROM TIPO_DOCUMENTO WHERE TIDO_COD = :TIPO INTO :NOMTIPO;
    if (incdto = 'SI') then
        ABONO = ABONO + DTOFIN;
    if (COMISION = 'DOCUMENTO') then
        SELECT MVCL_FECHA, COBR_COD FROM MOVIMIENTO_CLIENTES WHERE MVCL_TIPOREF = :TIPO AND MVCL_IDREF = :ID
            INTO :FECDOC, :codvend;
    else
        SELECT MVCL_FECHA FROM MOVIMIENTO_CLIENTES WHERE MVCL_TIPOREF = :TIPO AND MVCL_IDREF = :ID
            INTO :FECDOC;
    if (FECDOC IS NOT NULL) then
        DIAS = FECREC - FECDOC;
    ELSE
        DIAS = 999;
    if ((codvend >= :DESDE) AND (codvend <= :hasta)) then
        BEGIN
        select COBR_NOM from COBRADORES where COBR_COD = :codvend INTO :nomvend;
        /* TRAIGA EL PORCENTAJE DE ACUERDO A LOS DIAS */
        COMIPORC = 0;
        SELECT CMCB_PORC FROM COMISION_COBRO WHERE CMCB_DIASINI <= :dias AND CMCB_DIASFIN >= :DIAS AND COBR_COD = :CODVEND INTO :COMIPORC;
        if (COMIPORC IS NULL) THEN
            COMIPORC = 0;
        COMIDIAS = COMIPORC;
        if (VENTA = 'NO') then
            BEGIN
            if (ALFINAL = 'SI') then
                BEGIN
                EXECUTE PROCEDURE saldo_doc_cartera(:tipo, :ID, :FECREC, 0) returning_values (:SALDO);
                if (SALDO = 0) then
                    OK = 'S';
                else
                    OK = 'N';
                end
            else
                OK = 'S';
            if (TIPO = 31) then
                BEGIN
                if (DETALLE = 'N') then
                    SELECT MAX(FACT_TOTAL), MAX(FACT_IVAMONTO-FACT_DEC2799), SUM(FADE_CONSUMO) FROM FACTURAS F, FACTURAS_DETALLE D
                        WHERE F.FACT_ID = D.FACT_ID AND F.FACT_ID = :ID INTO :TOTAL, :IVAMONTO, :CONSUMO;
                ELSE
                    FOR SELECT D.ARTI_COD, FADE_CANT, FADE_TOTAL, FADE_IVAMONTO, FADE_CONSUMO, GRUP_COD, LIPR_COD
                        FROM FACTURAS F, FACTURAS_DETALLE D, ARTICULO A
                        WHERE F.FACT_ID = D.FACT_ID AND D.arti_cod = A.arti_cod AND F.FACT_ID = :ID and substring(a.arti_cod from 1 FOR 2) <> '.t'
                        INTO :ARTICULO, :CANT, :TOTAL, :IVAMONTO, :CONSUMO, :CODGRP, :LISTA
                        DO
                        BEGIN
                        if (comiart = 'GRUPO') then
                            SELECT GRUP_COMIPOR FROM GRUPO WHERE GRUP_COD = :codgrp INTO :comiporc;
                        if (comiart = 'PRECIO') then
                            SELECT PRAR_COMIC FROM precios_articulo WHERE ARTI_COD = :articulo AND LIPR_COD = :LISTA INTO :comiporc;

                        if (SITOT = 'SI') then
                            BASEAUX = TOTAL;
                        ELSE
                            begin
                            BASEAUX = TOTAL - IVAMONTO;
                            if (ICOINC <> 'SI') then
                                BASEAUX = BASEAUX - CONSUMO;
                            end
                        if (OK = 'S') then
                            begin
                            if (alfinal = 'SI') then
                                BASE = BASEAUX;
                            else
                                begin
                                /* calcula la proporcion del abono */
                                SELECT FACT_TOTAL FROM FACTURAS WHERE FACT_ID = :ID INTO :TOTAL;
                                if (TOTAL <> 0) then
                                    BASE = BASEAUX * (ABONO / TOTAL);
                                else
                                    BASE = 0;
                                end
                            end
                        else
                            BASE = 0;
                        if (comixvnd = 'SI') then
                            BEGIN                          
                            comiporc = comiporc * comidias / 100;
                            END
                        COMIMONTO = BASE / 100 * COMIPORC;
                        SUSPEND;
                        END
                END
            if (TIPO = 33) then
                if (DETALLE = 'N') then
                    SELECT MAX(DEVT_TOTAL*-1), MAX((DEVT_IVAMONTO-DEVT_DEC2799)*-1), SUM(DVDE_CONSUMO) FROM DEVOLUCIONES_VENTAS V, DEVOLUCIONES_VENTAS_DETALLE D
                        WHERE V.DEVT_ID = D.DEVT_ID AND V.DEVT_ID = :ID INTO :TOTAL, :IVAMONTO, :CONSUMO;
                ELSE
                    FOR SELECT D.ARTI_COD, DVDE_CANT, DVDE_TOTAL*-1, DVDE_IVAMONTO*-1, DVDE_CONSUMO*-1, GRUP_COD, DEVT_FACTID
                        FROM DEVOLUCIONES_VENTAS V, DEVOLUCIONES_VENTAS_DETALLE D, ARTICULO A
                        WHERE V.DEVT_ID = D.DEVT_ID AND D.arti_cod = A.arti_cod AND V.DEVT_ID = :ID and substring(a.arti_cod from 1 FOR 2) <> '.t'
                        INTO :ARTICULO, :CANT, :TOTAL, :IVAMONTO, :CONSUMO, :codgrp, :IDF
                        DO
                        BEGIN
                        if (comiart = 'GRUPO') then
                            SELECT GRUP_COMIPOR FROM GRUPO WHERE GRUP_COD = :codgrp INTO :comiporc;
                        if (comiart = 'PRECIO') then
                            BEGIN
                            LISTA = 0;
                            SELECT MAX(LIPR_COD) FROM facturas_detalle d WHERE ARTI_COD = :ARTICULO AND FACT_ID = :IDF INTO :LISTA;
                            if (LISTA = 0) then
                                LISTA = LISTAP;
                            SELECT PRAR_COMIC FROM precios_articulo WHERE ARTI_COD = :articulo AND LIPR_COD = :LISTA INTO :comiporc;
                            END
                        if (SITOT = 'SI') then
                            BASEAUX = TOTAL;
                        ELSE
                            begin
                            BASEAUX = TOTAL - IVAMONTO;
                            if (ICOINC <> 'SI') then
                                BASEAUX = BASEAUX - CONSUMO;
                            end
                        if (OK = 'S') then
                            begin
                            if (alfinal = 'SI') then
                                BASE = BASEAUX;
                            else
                                begin
                                /* calcula la proporcion del abono */
                                SELECT DEVT_TOTAL FROM DEVOLUCIONES_VENTAS WHERE DEVT_ID = :ID INTO :TOTAL;
                                if (TOTAL <> 0) then
                                    BASE = BASEAUX * (ABONO / TOTAL);
                                else
                                    BASE = 0;
                                end
                            end
                        else
                            BASE = 0;
                        if (comixvnd = 'SI') then
                            BEGIN                          
                            comiporc = comiporc * comidias / 100;
                            END
                        COMIMONTO = BASE / 100 * COMIPORC;
                        SUSPEND;
                        END
            if (TIPO = 41) then
                SELECT NDCL_MONTO, NDCL_IVAMONTO, 0 FROM NOTAS_DEBITO_CLIENTES WHERE NDCL_ID = :ID INTO :TOTAL, :IVAMONTO, :CONSUMO;
            if (TIPO = 42) then
                SELECT NCCL_MONTO*-1, NCCL_IVAMONTO*-1, 0 FROM NOTAS_CREDITO_CLIENTES WHERE NCCL_ID = :ID INTO :TOTAL, :IVAMONTO, :CONSUMO;
            if (TIPO = 77) then
                if (INCCHE = 'SI') then
                    SELECT DVCH_MONTO, 0, 0 FROM DEVOLUCION_CHEQUES WHERE DVCH_ID = :ID INTO :TOTAL, :IVAMONTO, :CONSUMO;
                ELSE
                    BEGIN
                    TOTAL = 0;
                    IVAMONTO = 0;
                    CONSUMO = 0;
                    END
            if (SITOT = 'SI') then
                BASEAUX = ABONO;
            ELSE
                if (TOTAL <> 0) then
                    if (ICOINC <> 'SI') then
                        BASEAUX = (ABONO / TOTAL) * (TOTAL - IVAMONTO - CONSUMO);
                    else
                        BASEAUX = (ABONO / TOTAL) * (TOTAL - IVAMONTO);
                ELSE
                    BASEAUX = 0;
            BASE = BASEAUX;
            if (comixvnd = 'SI') then
                BEGIN
                comiporc = comiporc * comidias / 100;
                END
            COMIMONTO = BASE / 100 * COMIPORC;
            END
        ELSE
            BEGIN
            if (TIPO = 31) then
                if (DETALLE = 'N') then
                    SELECT MAX(FACT_TOTAL), MAX(FACT_IVAMONTO-FACT_DEC2799), MAX(FACT_COMIPORC), SUM(FADE_CONSUMO)
                        FROM FACTURAS F, FACTURAS_DETALLE D WHERE F.FACT_ID = D.FACT_ID AND F.FACT_ID = :ID
                        INTO :TOTAL, :IVAMONTO, :PORCV, :CONSUMO;
                ELSE
                    FOR SELECT D.ARTI_COD, FADE_CANT, FADE_TOTAL, FADE_IVAMONTO, FADE_CONSUMO, FACT_COMIPORC, GRUP_COD
                        FROM FACTURAS F, FACTURAS_DETALLE D, ARTICULO A
                        WHERE F.FACT_ID = D.FACT_ID AND D.arti_cod = A.arti_cod AND F.FACT_ID = :ID and substring(a.arti_cod from 1 FOR 2) <> '.t'
                        INTO :ARTICULO, :CANT, :TOTAL, :IVAMONTO, :CONSUMO, :porcv, :codgrp
                        DO
                        BEGIN
                        if (SITOT = 'SI') then
                            BASEAUX = TOTAL;
                        ELSE
                            begin
                            BASEAUX = TOTAL - IVAMONTO;
                            if (ICOINC <> 'SI') then
                                BASEAUX = BASEAUX - CONSUMO;
                            end
                        /* calcula la proporcion del abono */
                        SELECT FACT_TOTAL FROM FACTURAS WHERE FACT_ID = :ID INTO :TOTAL;
                        if (TOTAL <> 0) then
                            BASE = BASEAUX * (ABONO / TOTAL);
                        else
                            BASE = 0;
                        COMIV = BASE / 100 * PORCV;
                        COMIMONTO = COMIV / 100 * COMIPORC;
                        porcaux = comiporc;
                        comiporc = PORCV * COMIPORC / 100;
                        SUSPEND;
                        END
            if (TIPO = 33) then
                if (DETALLE = 'N') then
                    SELECT MAX(DEVT_TOTAL*-1), MAX((DEVT_IVAMONTO-DEVT_DEC2799)*-1), MAX(DEVT_COMIPORC*-1), SUM(DVDE_CONSUMO*-1)
                        FROM DEVOLUCIONES_VENTAS V, DEVOLUCIONES_VENTAS_DETALLE D WHERE V.DEVT_ID = D.DEVT_ID AND D.DEVT_ID = :ID
                        INTO :TOTAL, :IVAMONTO, :PORCV, :CONSUMO;
                ELSE
                    FOR SELECT D.ARTI_COD, DVDE_CANT, DVDE_TOTAL*-1, DVDE_IVAMONTO*-1, DVDE_CONSUMO*-1, DEVT_COMIPORC, GRUP_COD
                        FROM DEVOLUCIONES_VENTAS V, DEVOLUCIONES_VENTAS_DETALLE D, ARTICULO A
                        WHERE V.DEVT_ID = D.DEVT_ID AND D.arti_cod = A.arti_cod AND V.DEVT_ID = :ID and substring(a.arti_cod from 1 FOR 2) <> '.t'
                        INTO :ARTICULO, :CANT, :TOTAL, :IVAMONTO, :CONSUMO, :porcv, :codgrp
                        DO
                        BEGIN
                        if (SITOT = 'SI') then
                            BASEAUX = TOTAL;
                        ELSE
                            begin
                            BASEAUX = TOTAL - IVAMONTO;
                            if (ICOINC <> 'SI') then
                                BASEAUX = BASEAUX - CONSUMO;
                            end
                        /* calcula la proporcion del abono */
                        SELECT DEVT_TOTAL FROM DEVOLUCIONES_VENTAS WHERE DEVT_ID = :ID INTO :TOTAL;
                        if (TOTAL <> 0) then
                            BASE = BASEAUX * (ABONO / TOTAL);
                        else
                            BASE = 0;
                        COMIV = BASE / 100 * PORCV;
                        COMIMONTO = COMIV / 100 * COMIPORC;
                        porcaux = comiporc;
                        comiporc = PORCV * COMIPORC / 100;
                        SUSPEND;
                        END
            if (TIPO = 41) then
                SELECT NDCL_MONTO, NDCL_IVAMONTO, NDCL_COMIPORC, 0 FROM NOTAS_DEBITO_CLIENTES
                    WHERE NDCL_ID = :ID INTO :TOTAL, :IVAMONTO, :PORCV, :CONSUMO;
            if (TIPO = 42) then
                SELECT NCCL_MONTO, NCCL_IVAMONTO, NCCL_COMIPORC, 0  FROM NOTAS_CREDITO_CLIENTES
                    WHERE NCCL_ID = :ID INTO :TOTAL, :IVAMONTO, :PORCV, :CONSUMO;
            if (TIPO = 77) then
                if (incche = 'SI') then
                    SELECT DVCH_MONTO, 0, 0, 0 FROM DEVOLUCION_CHEQUES WHERE DVCH_ID = :ID INTO :TOTAL, :IVAMONTO, :PORCV, :CONSUMO;
                ELSE
                    BEGIN
                    TOTAL = 0;
                    IVAMONTO = 0;
                    CONSUMO = 0;
                    PORCV = 0;
                    END
            if (SITOT = 'SI') then
                BASEAUX = ABONO;
            ELSE
                if ((total <> 0) AND (ABONO <> 0)) then
                    if (ICOINC <> 'SI') then
                        BASEAUX = (TOTAL - IVAMONTO - CONSUMO) / TOTAL * ABONO;
                    else
                        BASEAUX = (TOTAL - IVAMONTO) / TOTAL * ABONO;
                ELSE
                    BASEAUX = 0;
            COMIV = BASEAUX / 100 * PORCV;
            COMIMONTO = COMIV / 100 * COMIPORC;
            porcaux = comiporc;
            comiporc = PORCV * COMIPORC / 100;
            BASE = BASEAUX;
            END
        if (DETALLE = 'N') then
            if (ALFINAL = 'SI') then
                BEGIN
                /* VERIFIQUE EL SALDO DEL DOCUMENTO, SI ES CERO LIQUIDE COMISION SOBRE EL TOTAL */
                EXECUTE PROCEDURE saldo_doc_cartera(:tipo, :ID, :FECREC, 0) returning_values (:SALDO);
                if (SALDO = 0) then
                    BEGIN
                    if (VENTA = 'NO') then
                        begin
                        if (SITOT = 'SI') then
                            BASEAUX = TOTAL;
                        ELSE
                            begin
                            BASEAUX = TOTAL - IVAMONTO;
                            if (ICOINC <> 'SI') then
                                BASEAUX = BASEAUX - CONSUMO;
                            end
                        COMIMONTO = BASEAUX * COMIPORC / 100;
                        end
                    ELSE
                        BEGIN
                        if (SITOT = 'SI') then
                            BASEAUX = TOTAL;
                        ELSE
                            begin
                            BASEAUX = TOTAL - IVAMONTO;
                            if (ICOINC <> 'SI') then
                                BASEAUX = BASEAUX - CONSUMO;
                            end
                        COMIV = PORCV * BASEAUX / 100;
                        COMIMONTO = COMIV / 100 * porcaux;
                        comiporc = PORCV * porcaux / 100;
                        END
                    BASE = BASEAUX;
                    SUSPEND;
                    END
                END
            ELSE
                SUSPEND;
        ELSE
            if ((TIPO <> 31) AND (TIPO <> 33)) then
                SUSPEND;
        END
    END
FOR SELECT 'DEVOCHEQ', DVCH_MONTO*-1, DVCH_FECHA, PRBA_PREF, DVCH_NUMDOC, DVCH_FECHA, D.TERC_NIT, DVCH_NOMTERC, '', '', D.COBR_COD
    FROM DEVOLUCION_CHEQUES D, CLIENTES C
    WHERE DVCH_FECHA >= :FECINI AND DVCH_FECHA <= :FECFIN AND D.TERC_NIT = C.TERC_NIT AND D.COBR_COD = :CODVEND
    INTO :NOMTIPO, :BASE, :FECDOC, :PREFIJO, :NUMERO, :FECREC, :NIT, :CLIENTE, :PREFREC, :NUMREC, :codvend
    DO
    BEGIN
    COMIPORC = 0;
    COMIMONTO = 0;
    VENCE = fecdoc;
    RTFTE = 0;
    RTIVA = 0;
    RTICA = 0;
    DTOFIN = 0;
    if ((codvend >= :DESDE) AND (codvend <= :hasta)) then
        BEGIN
        select COBR_NOM from COBRADORES where COBR_COD = :codvend INTO :nomvend;
        /* SELECT CMCB_PORC FROM COMISION_COBRO WHERE CMCB_DIASINI <= 1 AND CMCB_DIASFIN >= 1 AND COBR_COD = :CODVEND INTO :COMIPORC;
        if (COMIPORC IS NULL) THEN
            COMIPORC = 0;
        COMIMONTO = BASE * COMIPORC / 100; */
        SUSPEND;
        END
    END
END
^

SET TERM ; ^


/* 20101112 */
/* SE REPETIA EL EXCEDENTE Y FALTANTE DEL REGISTRO ANTERIOR */

SET TERM ^ ;

CREATE OR ALTER procedure EXISTENCIAS_MINYMAX (
    FECHA date,
    ARTINI varchar(20),
    ARTFIN varchar(20),
    GRPINI varchar(2),
    GRPFIN varchar(2),
    ORDEN char(1),
    CEROS char(1))
returns (
    CODIGO varchar(15),
    NOMBRE varchar(60),
    UNIDAD varchar(8),
    CODGRUPO varchar(2),
    NOMGRUPO varchar(30),
    CODSUBG varchar(3),
    NOMSUBG varchar(30),
    CODMARC varchar(3),
    NOMMARC varchar(30),
    CODBOD varchar(2),
    NOMBOD varchar(30),
    CANT numeric(18,4),
    MINIMO numeric(18,4),
    MAXIMO numeric(18,4),
    FALTANTE numeric(18,4),
    EXCEDENTE numeric(18,4))
AS
declare variable CODINI VARCHAR(20);
declare variable CODFIN VARCHAR(20);
declare variable DESINI VARCHAR(20);
declare variable DESFIN VARCHAR(20);
declare variable MAXDIA VARCHAR(2);
declare variable DISPONIBILIDAD integer;
declare variable PROMEDIO numeric(18,4);
declare variable SALIDAS numeric(18,4);
BEGIN
if (ORDEN = 'C') then
    BEGIN
    CODINI = ARTINI;
    CODFIN = ARTFIN;
    DESINI = '';
    DESFIN = 'zz';
    END
ELSE
    BEGIN
    DESINI = ARTINI;
    DESFIN = ARTFIN;
    CODINI = '';
    CODFIN = 'zz';
    END
execute procedure lee_configuracion ('INVENTARIO', 'EXISTENCIAS', 'MAXIMO INVENTARIO EN DIAS') returning_values (:maxdia);

FOR SELECT ARTI_COD, ARTI_DES, ARTI_UNIDAD, A.GRUP_COD, A.SUBG_COD, A.MARC_COD, BODE_COD, BODE_NOM, ARTI_MIN, ARTI_MAX
      FROM ARTICULO A, BODEGA B
      WHERE ARTI_COD >= :CODINI AND ARTI_COD <= :CODFIN AND A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :GRPFIN AND
        ARTI_DES >= :DESINI AND ARTI_DES <= :DESFIN AND BODE_ACTIVA = 'S'
      ORDER BY ARTI_COD, BODE_COD
      INTO :CODIGO, :NOMBRE, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :CODBOD, :NOMBOD, :MINIMO, :MAXIMO
      DO
        BEGIN
        SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
        SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
        SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;

        if (maxdia = 'SI') then
            begin
            EXECUTE PROCEDURE DISPONIBILIDAD_ARTICULO(CODIGO, FECHA, :CODBOD) returning_values (:DISPONIBILIDAD, :CANT, :PROMEDIO, :SALIDAS);
            if ((DISPONIBILIDAD < minimo) and (PROMEDIO > 0)) then
                FALTANTE = (minimo * PROMEDIO) - cant;
            ELSE
                FALTANTE = 0;
            if ((DISPONIBILIDAD > maximo) and (PROMEDIO > 0)) then
                excedente = cant - (MAXIMO * PROMEDIO);
            ELSE
                EXCEDENTE = 0;
            if ((CEROS = 'S') or (FALTANTE <> 0) or (excedente <> 0))  then
                SUSPEND;
            end
        else
            begin
            EXECUTE PROCEDURE SALDO_INVENTARIO(CODIGO, :CODBOD, FECHA) returning_values (CANT);
            if (CANT < MINIMO) then
                FALTANTE = MINIMO - CANT;
            ELSE
                FALTANTE = 0;
            if (CANT > maximo) then
                excedente =  CANT - maximo;
            ELSE
                excedente = 0;
            if ((CEROS = 'S') or (FALTANTE <> 0) or (excedente <> 0))  then
                SUSPEND;
            end
        END
END
^

SET TERM ; ^

/* 20101112B */
/* marque las bases y los ensambles en el plan de produccion */

INSERT INTO CONFIGURACION (CONF_MODULO, CONF_CATEGORIA, CONF_PROPIEDAD, CONF_VALOR, CONF_POSIBLES, CONF_AYUDA) VALUES ('INVENTARIO', 'ENSAMBLES', 'NOMBRE A IMPRIMIR COMO TITULO EN PLAN PARA ENSAMBLES QUE NO SON BASE', '** RELLENOS **', NULL, NULL);
COMMIT WORK;

SET TERM ^ ;

CREATE OR ALTER PROCEDURE IMPR_PLANPROD(
    ID INTEGER)
RETURNS (
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    FECFIN DATE,
    CONCEPTO VARCHAR(60),
    RESPONSABLE VARCHAR(60),
    OBS BLOB SUB_TYPE 0 SEGMENT SIZE 80,
    ITEM INTEGER,
    ARTICULO VARCHAR(15),
    CODBAR VARCHAR(15),
    ARTIDES VARCHAR(60),
    CANT NUMERIC(18,4),
    UNIDAD VARCHAR(8),
    MERMA NUMERIC(18,4),
    PESO NUMERIC(18,4),
    OBSITEM BLOB SUB_TYPE 0 SEGMENT SIZE 80,
    CODCOMP VARCHAR(20),
    DESCOMP VARCHAR(60),
    CANTCOMP NUMERIC(18,4),
    UNICOMP VARCHAR(8),
    ESBASE CHAR(1),
    ESENSAMBLE CHAR(1))
AS
declare variable CODPROD varchar(20);
declare variable PORC float;
declare variable MERMAC numeric(18,4);
declare variable PESOPRO numeric(18,4);
declare variable PESOCMP numeric(18,4);
declare variable TOTAL float;
declare variable CANTPRO numeric(18,4);
declare variable CANTSOB numeric(18,4);
declare variable FACTOR float;
declare variable sobrante varchar(15);
declare variable porsob numeric(9,4);
declare variable BASE varchar(20);
declare variable BASEANT varchar(20);
declare variable ITEMAUX integer;
declare variable ARTICULOAUX varchar(20);
declare variable CODBARAUX varchar(20);
declare variable ARTIDESAUX varchar(60);
declare variable CANTAUX numeric(18,4);
declare variable UNIDADAUX varchar(8);
declare variable PESOAUX numeric(18,4);
declare variable OBSITEAUX varchar(1024);
begin
BASEANT = '';
select PLPR_PREF, PLPR_NUMERO, PLPR_FECINI, PLPR_FECFIN, PLPR_CONC, PLPR_RESPONSABLE, PLPR_OBS
    from plan_produccion O where PLPR_ID = :ID into
    :PREF, :NUMERO, :FECHA,
    :FECFIN, :CONCEPTO, :RESPONSABLE, :OBS;
for select PLPD_ITEM, p.ARTI_COD, PLPD_CODBAR, PLPD_DESC, PLPD_CANT, PLPD_UNIDAD, PLPD_PESO, PLPD_OBS, arti_sobrante, arti_porcsobr
    from plan_produccion_det p, articulo a where a.arti_cod = p.arti_cod and PLPR_ID = :ID
    order by PLPD_ITEM
    into :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :PESO, :OBSITEM, :sobrante, :porsob
    do
    begin
    ESBASE = 'N';
    ESENSAMBLE = 'N';
    /* DETECTE SI HAY UNA BASE EN LA FORMULA */
    BASE = NULL;
    select first 1 arpr_comp from plan_produccion_productos
        where plpr_id = :id and plpd_item = :item and arpr_base = 'S' into :BASE;
    if (BASE IS NOT NULL) then
        begin
        if (BASE <> BASEANT) then
            begin
            ESBASE = 'S';
            BASEANT = BASE;
            /* GUARDE LOS VALORES */
            ITEMAUX = ITEM;
            ARTICULOAUX = ARTICULO;
            CODBARAUX = CODBAR;
            ARTIDESAUX = ARTIDES;
            CANTAUX = CANT;
            UNIDADAUX = UNIDAD;
            PESOAUX = PESO;
            OBSITEAUX = OBSITEM;

            /* ES UNA NUEVA BASE, HAGA LA IMPRESION DE LA BASE */
            for select PLPC_ITEM, ARTI_COD, PLPC_CODBAR, PLPC_DESC, PLPC_CANT, PLPC_UNIDAD, 0, ''
                from plan_produccion_cons where PLPD_ID = :ID and ARTI_COD = :BASE
                order by PLPC_ITEM
                into :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :peso, :obsitem
                do
                begin
                codcomp = '';
                descomp = '';
                cantcomp = 0;
                unicomp = '';
                suspend;
                ESBASE = 'N';
                CODPROD = ARTICULO;
                for select arpr_comp, arti_des, arpr_cant, arpr_unidad, 0, 0, 0
                    from plan_produccion_cons_prod P, ARTICULO A
                    where P.arpr_comp = A.arti_cod and p.plpd_id = :id and P.plpc_item = :item order by P.plcp_nrocomp
                    into :codcomp, :descomp, :cantcomp, :unicomp, :porc, :mermac, :pesocmp
                    do
                    begin
                    ARTICULO = '';
                    CODBAR = '';
                    ARTIDES = '';
                    CANT = 0;
                    UNIDAD = '';
                    OBSITEM = '';
                    suspend;
                    end
                end
            /* RESTAURE LOS VALORES */
            ITEM = ITEMAUX;
            ARTICULO = ARTICULOAUX;
            CODBAR = CODBARAUX;
            ARTIDES = ARTIDESAUX;
            CANT = CANTAUX;
            UNIDAD = UNIDADAUX;
            PESO = PESOAUX;
            OBSITEM = OBSITEAUX;
            end
        end
    /* ENSAMBLE DIRECTO O BASE YA IMPRESA */
    codcomp = '';
    descomp = '';
    cantcomp = 0;
    unicomp = '';
    suspend;
    for select arpr_comp, arti_des, arpr_cant, arpr_unidad
        from plan_produccion_productos P, ARTICULO A
        where p.plpr_id = :id and p.plpd_item = :item and P.arpr_comp = A.arti_cod
        into :codcomp, :descomp, :cantcomp, :unicomp
        DO
        BEGIN
        ARTICULO = '';
        CODBAR = '';
        ARTIDES = '';
        CANT = 0;
        UNIDAD = '';
        MERMA = 0;
        PESO = 0;
        OBSITEM = '';
        if ((sobrante <> '') and (porsob <> 0) and (sobrante = codcomp)) then
            begin
            merma = CANTCOMP / (100 + PORSOB) * PORSOB;
            end
        ESENSAMBLE = 'N';
        if (EXISTS (select arpr_item from articulos_producto where arti_cod = :codcomp)) then
            ESENSAMBLE = 'S';
        suspend;
        end
   end
/* ahora los ensambles que no son base */
EXECUTE PROCEDURE lee_configuracion ('INVENTARIO', 'ENSAMBLES', 'NOMBRE A IMPRIMIR COMO TITULO EN PLAN PARA ENSAMBLES QUE NO SON BASE') returning_values (ARTICULO);
CODBAR = '';
ARTIDES = ARTICULO;
CANT = 0;
UNIDAD = '';
MERMA = 0;
PESO = 0;
OBSITEM = '';
codcomp = '';
descomp = '';
cantcomp = 0;
unicomp = '';
SUSPEND;
FOR SELECT PLPC_ITEM, ARTI_COD, PLPC_CODBAR, PLPC_DESC, PLPC_CANT, PLPC_UNIDAD, PLPC_OBS
    FROM plan_produccion_cons WHERE PLPD_ID = :ID AND PLPC_BASE = 'N'
    ORDER BY PLPC_ITEM
    INTO :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :OBSITEM
    DO
      BEGIN
      codcomp = '';
      descomp = '';
      cantcomp = 0;
      unicomp = '';
      esensamble = 'N';
       if (EXISTS (select arpr_item from articulos_producto where arti_cod = :articulo)) then
            ESENSAMBLE = 'S';
      SUSPEND;
      CODPROD = ARTICULO;
      for select arpr_comp, arti_des, arpr_cant, arpr_unidad
        from plan_produccion_cons_prod P, ARTICULO A
        where P.arpr_comp = A.arti_cod AND p.plpd_id = :id AND P.plpc_item = :item ORDER BY P.plcp_nrocomp
        into :codcomp, :descomp, :cantcomp, :unicomp
        DO
        BEGIN
        ARTICULO = '';
        CODBAR = '';
        ARTIDES = '';
        CANT = 0;
        UNIDAD = '';
        OBSITEM = '';
        esensamble = 'N';
        SUSPEND;
        END
      END
/* TRAIGA LOS SUBENSAMBLES ASOCIADOS AL PLAN */
if (EXISTS (select P.arpr_comp from plan_produccion_cons_prod P, ARTICULO A, ensambles E1, ENSAMBLES E2
    where P.arpr_comp = A.arti_cod AND p.plpd_id = :id
    and P.arpr_comp = e2.arti_cod AND E2.ensa_tiporef = 15 AND E2.ensa_idref = E1.ensa_id
    AND E1.ENSA_TIPOREF = 27 AND E1.ENSA_IDREF = :ID)) then
    BEGIN
    ARTICULO = 'ENS. ADIC.';
    CODBAR = '';
    ARTIDES = '** ENSAMBLES PREVIOS ADICIONALES **';
    CANT = 0;
    UNIDAD = '';
    MERMA = 0;
    PESO = 0;
    OBSITEM = '';
    codcomp = '';
    descomp = '';
    cantcomp = 0;
    unicomp = '';
    ESBASE = 'S';
    ESENSAMBLE = 'N';
    SUSPEND;
    for select P.arpr_comp, P.arpr_comp, A.arti_des, P.arpr_cant, P.arpr_unidad, '', e2.ensa_id
        from plan_produccion_cons_prod P, ARTICULO A, ensambles E1, ENSAMBLES E2
        where P.arpr_comp = A.arti_cod AND p.plpd_id = :id
        and P.arpr_comp = e2.arti_cod AND E2.ensa_tiporef = 15 AND E2.ensa_idref = E1.ensa_id
        AND E1.ENSA_TIPOREF = 27 AND E1.ENSA_IDREF = :ID
        ORDER BY P.plpc_item, P.plcp_nrocomp
        INTO :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :OBSITEM, :itemaux
        DO
        begin
        FOR SELECT ARTI_COD, ESDE_DESC, ESDE_CANT, ESDE_UNIDAD
            FROM ENSAMBLES_DETALLE
            WHERE ENSA_ID = :itemaux
            into :codcomp, :descomp, :cantcomp, :unicomp
            DO
            BEGIN
            SUSPEND;
            ARTICULO = '';
            CODBAR = '';
            ARTIDES = '';
            CANT = 0;
            UNIDAD = '';
            OBSITEM = '';
            esensamble = 'N';
            END
        END
    END
end
^

SET TERM ; ^


/* 20101112C */
/* INCLUYA PLAN DE PRODUCCION EN REPORTE DE CRONOLOGICO */
SET TERM ^ ;

CREATE OR ALTER procedure REP_COMPROBANTES_INV (
    TIPO integer,
    DETALLE char(1),
    FECINI date,
    FECFIN date,
    PREFIJO varchar(4),
    ANULADOS char(1),
    SUBEMPRESA integer)
returns (
    NOMTIPO varchar(30),
    ID integer,
    PREF varchar(4),
    NUMERO varchar(6),
    FECHA date,
    VENCE date,
    CONCEPTO varchar(60),
    REFER varchar(60),
    CODBODORI varchar(2),
    NOMBODORI varchar(30),
    CODBODDES varchar(2),
    NOMBODDES varchar(30),
    NOMTERCERO varchar(60),
    PRODCODBAR varchar(15),
    PRODDES varchar(60),
    PRODCANT numeric(18,4),
    PRODUNIDAD varchar(8),
    PRODLOTE varchar(15),
    OBS blob sub_type 0 segment size 80,
    ITEM integer,
    ARTICULO varchar(15),
    CODBAR varchar(15),
    ARTIDES varchar(60),
    CANT numeric(18,4),
    EXANT numeric(18,4),
    UNIDAD varchar(8),
    BODITEM varchar(2),
    COSTO numeric(18,2),
    DTOPORC numeric(9,2),
    DTOMONTO numeric(18,2),
    IVAPORC numeric(9,2),
    IVAMONTO numeric(18,2),
    CONSUMO numeric(18,2),
    SUBTOTAL numeric(18,2),
    TOTAL numeric(18,2),
    LOTE varchar(15),
    ANULADO char(1),
    OBSITEM blob sub_type 0 segment size 80)
as
declare variable ST NUMERIC(18,2);
declare variable IVA NUMERIC(18,2);
declare variable TOT NUMERIC(18,2);
begin
  /* DETERMINE LA TABLA A EXAMINAR */
  if (bin_and(TIPO, 1) <> 0) then
    begin
    select TIDO_NOMLARGO from TIPO_DOCUMENTO where TIDO_COD = 11 into :NOMTIPO;
    for select ENTR_ID, E.PREF_PRE, ENTR_NUMERO, ENTR_FECHA, ENTR_CONC, ENTR_REFER, E.BODE_COD, BODE_NOM, ENTR_NOMTERC, ENTR_OBS, ENTR_ANULADO
    from ENTRADAS E, BODEGA B, PREFIJOS P
    where E.BODE_COD = B.BODE_COD and ENTR_FECHA >= :FECINI and ENTR_FECHA <= :FECFIN
     and P.PREF_PRE = E.PREF_PRE and P.TIDO_COD = 11 and ((P.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
    order by ENTR_FECHA, ENTR_ID
    into :ID, :PREF, :NUMERO, :FECHA, :CONCEPTO, :REFER, :CODBODORI, :NOMBODORI, :NOMTERCERO, :OBS, :ANULADO
    do
        begin
        if (((:PREFIJO = '') or (:PREF = :PREFIJO)) and ((:ANULADOS = 'S') or (:ANULADO = 'N'))) then
            begin
            if (anulado = 'S') then
             begin
              ITEM = 0;
              ARTICULO = '';
              CODBAR = '';
              ARTIDES = '';
              CANT = 0;
              UNIDAD = '';
              BODITEM = '';
              lote = '';
              costo = 0;
              DTOPORC = 0;
              DTOMONTO = 0;
              IVAPORC = 0;
              IVAMONTO = 0;
              CONSUMO = 0;
              TOTAL = 0;
              OBSITEM = null;
              SUBTOTAL = 0;
              suspend;
             end
            else
             begin
              if (DETALLE = 'S') then
                for select ENDE_ITEM, A.ARTI_COD, ENDE_CODBAR, ENDE_DESC, ENDE_CANT, ENDE_UNIDAD, BODE_COD, ENDE_COSTO, ENDE_DTOPORC, ENDE_DTOMONTO, ENDE_IVAPORC, ENDE_IVAMONTO, ENDE_CONSUMO, ENDE_TOTAL, ENDE_LOTE, ENDE_OBS
                    from ENTRADAS_DETALLE D, ARTICULO A where D.ARTI_COD = A.ARTI_COD and D.ENTR_ID = :ID into
                    :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :BODITEM, :COSTO, :DTOPORC, :DTOMONTO, :IVAPORC, :IVAMONTO, :CONSUMO, :TOTAL, :LOTE, :OBSITEM
                    do
                    begin
                    SUBTOTAL = TOTAL - IVAMONTO - CONSUMO;
                    suspend;
                    end
              else
                begin
                select sum(ENDE_IVAMONTO), sum(ENDE_CONSUMO), sum(ENDE_TOTAL)
                    from ENTRADAS_DETALLE D where D.ENTR_ID = :ID into
                    :IVAMONTO, :CONSUMO, :TOTAL;
                SUBTOTAL = TOTAL - IVAMONTO - CONSUMO;
                suspend;
                end
             end
            end
        end
    end
  if (bin_and(TIPO, 2) <> 0) then
    begin
    select TIDO_NOMLARGO from TIPO_DOCUMENTO where TIDO_COD = 12 into :NOMTIPO;
    for select SALI_ID, S.PREF_PRE, SALI_NUMERO, SALI_FECHA, SALI_CONC, SALI_REFER, S.BODE_COD, BODE_NOM, SALI_NOMTERC, SALI_OBS, SALI_ANULADO
    from SALIDAS S, BODEGA B, PREFIJOS P
    where S.BODE_COD = B.BODE_COD and SALI_FECHA >= :FECINI and SALI_FECHA <= :FECFIN 
     and P.PREF_PRE = S.PREF_PRE and P.TIDO_COD = 12 and ((P.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
    order by SALI_FECHA, SALI_ID
    into :ID, :PREF, :NUMERO, :FECHA, :CONCEPTO, :REFER, :CODBODORI, :NOMBODORI, :NOMTERCERO, :OBS, :ANULADO
    do
        begin
        if (((:PREFIJO = '') or (:PREF = :PREFIJO)) and ((:ANULADOS = 'S') or (:ANULADO = 'N'))) then
            begin
            if (anulado = 'S') then
             begin
              ITEM = 0;
              ARTICULO = '';
              CODBAR = '';
              ARTIDES = '';
              CANT = 0;
              UNIDAD = '';
              BODITEM = '';
              lote = '';
              costo = 0;
              DTOPORC = 0;
              DTOMONTO = 0;
              IVAPORC = 0;
              IVAMONTO = 0;
              CONSUMO = 0;
              EXANT = 0;
              TOTAL = 0;
              OBSITEM = null;
              SUBTOTAL = 0;
              suspend;
             end
            else
             begin
              if (DETALLE = 'S') then
                for select SADE_ITEM, A.ARTI_COD, SADE_CODBAR, SADE_DESC, SADE_CANT, SADE_UNIDAD, BODE_COD, SADE_COSTO, SADE_IVAPORC, SADE_IVAMONTO, SADE_CONSUMO, SADE_TOTAL, SADE_LOTE, SADE_OBS
                    from SALIDAS_DETALLE D, ARTICULO A where D.ARTI_COD = A.ARTI_COD and D.SALI_ID = :ID into
                    :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :BODITEM, :COSTO, :IVAPORC, :IVAMONTO, :CONSUMO, :TOTAL, :LOTE, :OBSITEM
                    do
                begin
                SUBTOTAL = TOTAL - IVAMONTO - CONSUMO;
                suspend;
                end
              else
                begin
                select sum(SADE_IVAMONTO), sum(SADE_CONSUMO), sum(SADE_TOTAL)
                    from SALIDAS_DETALLE D where D.SALI_ID = :ID into
                    :IVAMONTO, :CONSUMO, :TOTAL;
                SUBTOTAL = TOTAL - IVAMONTO - CONSUMO;
                suspend;
                end
             end
            end
        end
    end
  if (bin_and(TIPO, 4) <> 0) then
    begin
    select TIDO_NOMLARGO from TIPO_DOCUMENTO where TIDO_COD = 13 into :NOMTIPO;
    for select TRAN_ID, T.PREF_PRE, TRAN_NUMERO, TRAN_FECHA, TRAN_CONC, TRAN_REFER, T.BODE_COD, BO.BODE_NOM, TRAN_BODDES, BD.BODE_NOM, TRAN_OBS, TRAN_ANULADO
    from TRASFERENCIAS T, BODEGA BO, BODEGA BD, PREFIJOS P
    where T.BODE_COD = BO.BODE_COD and T.TRAN_BODDES = BD.BODE_COD and TRAN_FECHA >= :FECINI and TRAN_FECHA <= :FECFIN 
     and P.PREF_PRE = T.PREF_PRE and P.TIDO_COD = 13 and ((P.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
    order by TRAN_FECHA, TRAN_ID
    into :ID, :PREF, :NUMERO, :FECHA, :CONCEPTO, :REFER, :CODBODORI, :NOMBODORI, :CODBODDES, :NOMBODDES, :OBS, :ANULADO
    do
        begin
        if (((:PREFIJO = '') or (:PREF = :PREFIJO)) and ((:ANULADOS = 'S') or (:ANULADO = 'N'))) then
            begin
            if (anulado = 'S') then
             begin
              ITEM = 0;
              ARTICULO = '';
              CODBAR = '';
              ARTIDES = '';
              CANT = 0;
              UNIDAD = '';
              BODITEM = '';
              lote = '';
              costo = 0;
              DTOPORC = 0;
              DTOMONTO = 0;
              IVAPORC = 0;
              IVAMONTO = 0;
              CONSUMO = 0;
              EXANT = 0;
              TOTAL = 0;
              OBSITEM = null;
              SUBTOTAL = 0;
              suspend;
             end
            else
             begin
              if (DETALLE = 'S') then
                for select TRAS_ITEM, A.ARTI_COD, TRAS_CODBAR, TRAS_DESC, TRAS_CANT, TRAS_UNIDAD, TRAS_COSTO, TRAS_IVAPORC, TRAS_IVAMONTO, TRAS_CONSUMO, TRAS_TOTAL, TRAS_LOTE, TRAS_OBS
                    from TRASFERENCIAS_DETALLE D, ARTICULO A where D.ARTI_COD = A.ARTI_COD and D.TRAN_ID = :ID into
                    :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :COSTO, :IVAPORC, :IVAMONTO, :CONSUMO, :TOTAL, :LOTE, :OBSITEM
                    do
                    begin
                    SUBTOTAL = TOTAL - IVAMONTO - CONSUMO;
                    suspend;
                    end
              else
                begin
                select sum(TRAS_IVAMONTO), sum(TRAS_CONSUMO), sum(TRAS_TOTAL) from trasferencias_detalle D
                    where D.TRAN_ID = :ID into :IVAMONTO, :CONSUMO, :TOTAL;
                SUBTOTAL = TOTAL - IVAMONTO - CONSUMO;
                suspend;
                end
             end
            end
        end
    end
  if (bin_and(TIPO, 8) <> 0) then
    begin
    select TIDO_NOMLARGO from TIPO_DOCUMENTO where TIDO_COD = 14 into :NOMTIPO;
    for select AJUS_ID, A.PREF_PRE, AJUS_NUMERO, AJUS_FECHA, AJUS_CONC, A.BODE_COD, BODE_NOM, AJUS_OBS, AJUS_ANULADO
    from AJUSTES A, BODEGA B, PREFIJOS P
    where A.BODE_COD = B.BODE_COD and AJUS_FECHA >= :FECINI and AJUS_FECHA <= :FECFIN 
     and P.PREF_PRE = A.PREF_PRE and P.TIDO_COD = 14 and ((P.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
    order by AJUS_FECHA, AJUS_ID
    into :ID, :PREF, :NUMERO, :FECHA, :CONCEPTO, :CODBODORI, :NOMBODORI, :OBS, :ANULADO
    do
        begin
        if (((:PREFIJO = '') or (:PREF = :PREFIJO)) and ((:ANULADOS = 'S') or (:ANULADO = 'N'))) then
            begin
            if (anulado = 'S') then
             begin
              ITEM = 0;
              ARTICULO = '';
              CODBAR = '';
              ARTIDES = '';
              CANT = 0;
              UNIDAD = '';
              BODITEM = '';
              lote = '';
              costo = 0;
              DTOPORC = 0;
              DTOMONTO = 0;
              IVAPORC = 0;
              IVAMONTO = 0;
              CONSUMO = 0;
              EXANT = 0;
              TOTAL = 0;
              OBSITEM = null;
              SUBTOTAL = 0;
              suspend;
             end
            else
             begin
              if (DETALLE = 'S') then
                for select AJUS_ITEM, A.ARTI_COD, AJUS_CODBAR, AJDE_DESC, AJUS_EXANT, AJUS_UNIDAD, BODE_COD, AJUS_EXNUE, AJUS_LOTE, AJDE_OBS
                    from AJUSTES_DETALLE D, ARTICULO A where D.ARTI_COD = A.ARTI_COD and D.AJUS_ID = :ID into
                    :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :EXANT, :UNIDAD, :BODITEM, :CANT, :LOTE, :OBSITEM
                    do
                      begin
                      execute procedure COSTO_PROMEDIO(:ARTICULO, :FECHA) returning_values (:COSTO);
                      TOTAL = (CANT - EXANT) * COSTO;
                      SUBTOTAL = TOTAL;
                      suspend;
                      end
              else
                begin
                TOTAL = 0;
                for select ARTI_COD, AJUS_EXNUE, AJUS_EXANT from AJUSTES_DETALLE D where D.AJUS_ID = :ID into
                    :ARTICULO, :CANT, :EXANT
                    do
                      begin
                      execute procedure COSTO_PROMEDIO(:ARTICULO, :FECHA) returning_values (:COSTO);
                      TOTAL = TOTAL + ((CANT - EXANT) * COSTO);
                      SUBTOTAL = TOTAL;
                      end
                suspend;
                end
             end
            end
        end
    end
  if (bin_and(TIPO, 16) <> 0) then
    begin
    select TIDO_NOMLARGO from TIPO_DOCUMENTO where TIDO_COD = 15 into :NOMTIPO;
    for select ENSA_ID, E.PREF_PRE, ENSA_NUMERO, ENSA_FECHA, ENSA_CONC, ENSA_REFER, E.BODE_COD, BODE_NOM, ENSA_CODBAR, ENSA_DESC, ENSA_CANT, ENSA_UNIDAD, ENSA_LOTE, ENSA_OBS, ENSA_ANULADO
    from ENSAMBLES E, BODEGA B, PREFIJOS P
    where E.BODE_COD = B.BODE_COD and E.ENSA_FECHA >= :FECINI and E.ENSA_FECHA <= :FECFIN
     and P.PREF_PRE = E.PREF_PRE and P.TIDO_COD = 15 and ((P.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
    order by ENSA_FECHA, ENSA_ID
    into :ID, :PREF, :NUMERO, :FECHA, :CONCEPTO, :REFER, :CODBODORI, :NOMBODORI, :PRODCODBAR, :PRODDES, :PRODCANT, :PRODUNIDAD, :PRODLOTE, :OBS, :ANULADO
    do
        begin
        if (((:PREFIJO = '') or (:PREF = :PREFIJO)) and ((:ANULADOS = 'S') or (:ANULADO = 'N'))) then
            begin
            if (anulado = 'S') then
             begin
              ITEM = 0;
              ARTICULO = '';
              CODBAR = '';
              ARTIDES = '';
              CANT = 0;
              UNIDAD = '';
              BODITEM = '';
              lote = '';
              costo = 0;
              DTOPORC = 0;
              DTOMONTO = 0;
              IVAPORC = 0;
              IVAMONTO = 0;
              CONSUMO = 0;
              EXANT = 0;
              TOTAL = 0;
              OBSITEM = null;
              SUBTOTAL = 0;
              suspend;
             end
            else
             begin
              if (DETALLE = 'S') then
                for select ESDE_ITEM, A.ARTI_COD, ESDE_CODBAR, ESDE_DESC, ESDE_CANT, ESDE_UNIDAD, BODE_COD, ESDE_COSTO, ESDE_IVAPORC, ESDE_IVAMONTO, ESDE_CONSUMO, ESDE_TOTAL, ESDE_LOTE, ESDE_OBS
                    from ensambles_detalle D, ARTICULO A where D.ARTI_COD = A.ARTI_COD and D.ENSA_ID = :ID into
                    :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :BODITEM, :COSTO, :IVAPORC, :IVAMONTO, :CONSUMO, :TOTAL, :LOTE, :OBSITEM
                    do
                    begin
                    SUBTOTAL = TOTAL - IVAMONTO - CONSUMO;
                    suspend;
                    end
              else
                begin
                select sum(ESDE_IVAMONTO), sum(ESDE_CONSUMO), sum(ESDE_TOTAL) from ENSAMBLES_detalle D where D.ENSA_ID = :ID into
                    :IVAMONTO, :CONSUMO, :TOTAL;
                SUBTOTAL = TOTAL - IVAMONTO - CONSUMO;
                suspend;
                end
             end
            end
        end
    end
  if (bin_and(TIPO, 32) <> 0) then
    begin
    select TIDO_NOMLARGO from TIPO_DOCUMENTO where TIDO_COD = 16 into :NOMTIPO;
    for select DESE_ID, E.PREF_PRE, DESE_NUMERO, DESE_FECHA, DESE_CONC, DESE_REFER, E.BODE_COD, BODE_NOM, DESE_CODBAR, DESE_DESC, DESE_CANT, DESE_UNIDAD, DESE_LOTE, DESE_OBS, DESE_ANULADO
    from DESENSAMBLES E, BODEGA B, PREFIJOS P
    where E.BODE_COD = B.BODE_COD and DESE_FECHA >= :FECINI and DESE_FECHA <= :FECFIN 
     and P.PREF_PRE = E.PREF_PRE and P.TIDO_COD = 16 and ((P.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
    order by DESE_FECHA, DESE_ID
    into :ID, PREF, :NUMERO, :FECHA, :CONCEPTO, :REFER, :CODBODORI, :NOMBODORI, :PRODCODBAR, :PRODDES, :PRODCANT, :PRODUNIDAD, :PRODLOTE, :OBS, :ANULADO
    do
        begin
        if (((:PREFIJO = '') or (:PREF = :PREFIJO)) and ((:ANULADOS = 'S') or (:ANULADO = 'N'))) then
            begin
            if (anulado = 'S') then
             begin
              ITEM = 0;
              ARTICULO = '';
              CODBAR = '';
              ARTIDES = '';
              CANT = 0;
              UNIDAD = '';
              BODITEM = '';
              lote = '';
              costo = 0;
              DTOPORC = 0;
              DTOMONTO = 0;
              IVAPORC = 0;
              IVAMONTO = 0;
              CONSUMO = 0;
              EXANT = 0;
              TOTAL = 0;
              OBSITEM = null;
              SUBTOTAL = 0;
              suspend;
             end
            else
             begin
              if (DETALLE = 'S') then
                for select DESE_ITEM, A.ARTI_COD, DEDE_CODBAR, DEDE_DESC, DEDE_CANT, DEDE_UNIDAD, BODE_COD, DEDE_COSTO, DEDE_IVAPORC, DEDE_IVAMONTO, DEDE_CONSUMO, DEDE_TOTAL, DEDE_LOTE, DEDE_OBS
                    from desensambles_detalle D, ARTICULO A where D.ARTI_COD = A.ARTI_COD and D.DESE_ID = :ID into
                    :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :BODITEM, :COSTO, :IVAPORC, :IVAMONTO, :CONSUMO, :TOTAL, :LOTE, :OBSITEM
                    do
                    begin
                    SUBTOTAL = TOTAL - IVAMONTO - CONSUMO;
                    suspend;
                    end
              else
                begin
                select sum(DEDE_IVAMONTO), sum(DEDE_CONSUMO), sum(DEDE_TOTAL) from DESENSAMBLES_detalle D where D.DESE_ID = :ID into
                    :IVAMONTO, :CONSUMO, :TOTAL;
                SUBTOTAL = TOTAL - IVAMONTO - CONSUMO;
                suspend;
                end
             end
            end
        end
    end
  if (bin_and(TIPO, 64) <> 0) then
    begin
    select TIDO_NOMLARGO from TIPO_DOCUMENTO where TIDO_COD = 17 into :NOMTIPO;
    for select RESE_ID, R.PREF_PRE, RESE_NUMERO, RESE_FECHA, RESE_CONC, RESE_REFER, R.BODE_COD, BODE_NOM, RESE_NOMTERC, RESE_OBS, RESE_ANULADO
    from RESERVAS R, BODEGA B, PREFIJOS P
    where R.BODE_COD = B.BODE_COD and R.RESE_FECHA >= :FECINI and R.RESE_FECHA <= :FECFIN 
     and P.PREF_PRE = R.PREF_PRE and P.TIDO_COD = 17 and ((P.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
    order by RESE_FECHA, RESE_ID
    into :ID, :PREF, :NUMERO, :FECHA, :CONCEPTO, :REFER, :CODBODORI, :NOMBODORI, :NOMTERCERO, :OBS, :ANULADO
    do
        begin
        if (((:PREFIJO = '') or (:PREF = :PREFIJO)) and ((:ANULADOS = 'S') or (:ANULADO = 'N'))) then
            begin
            if (anulado = 'S') then
             begin
              ITEM = 0;
              ARTICULO = '';
              CODBAR = '';
              ARTIDES = '';
              CANT = 0;
              UNIDAD = '';
              BODITEM = '';
              lote = '';
              costo = 0;
              DTOPORC = 0;
              DTOMONTO = 0;
              IVAPORC = 0;
              IVAMONTO = 0;
              CONSUMO = 0;
              EXANT = 0;
              TOTAL = 0;
              OBSITEM = null;
              SUBTOTAL = 0;
              suspend;
             end
            else
             begin
              if (DETALLE = 'S') then
                for select RSDE_ITEM, A.ARTI_COD, RSDE_CODBAR, RSDE_DESC, RDSE_CANT, RSDE_UNIDAD, BODE_COD, RSDE_OBS
                    from RESERVAS_DETALLE D, ARTICULO A where D.ARTI_COD = A.ARTI_COD and D.RESE_ID = :ID into
                    :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :BODITEM, :OBSITEM
                    do
                    suspend;
              else
                begin
                select sum(RDSE_CANT) from RESERVAS_detalle D where D.RESE_ID = :ID into
                    :CANT;
                suspend;
                end
             end
            end
        end
    end
  if (bin_and(TIPO, 128) <> 0) then
    begin
    select TIDO_NOMLARGO from TIPO_DOCUMENTO where TIDO_COD = 18 into :NOMTIPO;
    for select ORIN_ID, O.PREF_PRE, ORIN_NUMERO, ORIN_FECHA, ORIN_FECLLEGA, ORIN_CONC, ORIN_REFER, ORIN_NOMTERC, ORIN_OBS, ORIN_ANULADO
        from ORDENES_INVENTARIO O, PREFIJOS P
        where ORIN_FECHA >= :FECINI and ORIN_FECHA <= :FECFIN 
        and P.PREF_PRE = O.PREF_PRE and P.TIDO_COD = 18 and ((P.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
        order by ORIN_FECHA, ORIN_ID
        into :ID, PREF, :NUMERO, :FECHA, :VENCE, :CONCEPTO, :REFER, :NOMTERCERO, :OBS, :ANULADO
        do
        begin
        if (((:PREFIJO = '') or (:PREF = :PREFIJO)) and ((:ANULADOS = 'S') or (:ANULADO = 'N'))) then
            begin
            if (anulado = 'S') then
             begin
              ITEM = 0;
              ARTICULO = '';
              CODBAR = '';
              ARTIDES = '';
              CANT = 0;
              UNIDAD = '';
              BODITEM = '';
              lote = '';
              costo = 0;
              DTOPORC = 0;
              DTOMONTO = 0;
              IVAPORC = 0;
              IVAMONTO = 0;
              CONSUMO = 0;
              EXANT = 0;
              TOTAL = 0;
              OBSITEM = null;
              SUBTOTAL = 0;
              suspend;
             end
            else
             begin
              if (DETALLE = 'S') then
                for select ORID_ITEM, A.ARTI_COD, ORID_CODBAR, ORID_DESC, ORID_CANT, ORID_UNIDAD, ORIN_COSTO, ORID_DTOPORC, ORID_DTOMONTO, ORID_IVAPORC, ORID_IVAMONTO, ORID_CONSUMO, ORID_TOTAL, ORID_OBS, ORID_LOTE
                    from ORDENINVENTARIO_DETALLE D, ARTICULO A where D.ARTI_COD = A.ARTI_COD and D.ORIN_ID = :ID into
                    :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :COSTO, :DTOPORC, :DTOMONTO, :IVAPORC, :IVAMONTO, :CONSUMO, :TOTAL, :OBSITEM, :LOTE
                    do
                    begin
                    SUBTOTAL = TOTAL - IVAMONTO - CONSUMO;
                    suspend;
                    end
              else
                begin
                select sum(ORID_IVAMONTO), sum(ORID_CONSUMO), sum(ORID_TOTAL) from ordeninventario_detalle D where D.ORIN_ID = :ID into
                    :IVAMONTO, :CONSUMO, :TOTAL;
                SUBTOTAL = TOTAL - IVAMONTO - CONSUMO;
                suspend;
                end
             end
            end
        end
    end
  if (bin_and(TIPO, 256) <> 0) then
    begin
    select TIDO_NOMLARGO from TIPO_DOCUMENTO where TIDO_COD = 27 into :NOMTIPO;
    for select P.plpr_id, P.plpr_pref, P.plpr_numero, P.plpr_fecfin, P.plpr_conc, '', P.plpr_bodori, BODE_NOM, P.plpr_responsable, P.plpr_obs, P.plpr_anulado
    from plan_produccion P, BODEGA B, PREFIJOS PR
    where P.plpr_bodori = B.BODE_COD and P.plpr_fecfin >= :FECINI and P.plpr_fecfin <= :FECFIN
     and PR.PREF_PRE = P.plpr_pref and PR.TIDO_COD = 27 and ((PR.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
    order by P.plpr_fecfin, P.plpr_id
    into :ID, :PREF, :NUMERO, :FECHA, :CONCEPTO, :REFER, :CODBODORI, :NOMBODORI, :NOMTERCERO, :OBS, :ANULADO
    do
        begin
        if (((:PREFIJO = '') or (:PREF = :PREFIJO)) and ((:ANULADOS = 'S') or (:ANULADO = 'N'))) then
            begin
            if (anulado = 'S') then
              begin
              ITEM = 0;
              ARTICULO = '';
              CODBAR = '';
              ARTIDES = '';
              CANT = 0;
              UNIDAD = '';
              BODITEM = '';
              lote = '';
              costo = 0;
              DTOPORC = 0;
              DTOMONTO = 0;
              IVAPORC = 0;
              IVAMONTO = 0;
              CONSUMO = 0;
              EXANT = 0;
              TOTAL = 0;
              OBSITEM = null;
              SUBTOTAL = 0;
              suspend;
              end
            else
              begin
              IVAMONTO = 0;
              TOTAL = 0;
              SUBTOTAL = 0;
              for select D.plpd_item, A.ARTI_COD, D.plpd_codbar, D.plpd_desc, D.plpd_cant, D.plpd_unidad, D.plpd_obs, T.taiv_porc
                    from plan_produccion_det D, ARTICULO A, TARIFA_IVA T
                    where D.ARTI_COD = A.ARTI_COD and D.plpr_id = :ID AND A.taiv_cod = T.taiv_cod
                    into :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :OBSITEM, :ivaporc
                    do
                    begin
                    execute procedure ultimo_costo(:ARTICULO, :fecha,  :UNIDAD) returning_values (:costo);
                    ST = COSTO * CANT;
                    IVA = ST * ivaporc;
                    TOT = ST + IVA;
                    if (DETALLE = 'S') then
                        begin
                        SUBTOTAL = ST;
                        IVAMONTO = IVA;
                        TOTAL = TOT;
                        suspend;
                        end
                    else
                        begin
                        SUBTOTAL = SUBTOTAL + ST;
                        IVAMONTO = IVAMONTO + IVA;
                        TOTAL = TOTAL + TOT;
                        end
                    end
              if (DETALLE = 'N') then
                suspend;
              end
            end
        end
    end
end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure REP_CONSECUTIVOS_INV (
    TIPO integer,
    DETALLE char(1),
    PREINI varchar(4),
    PREFIN varchar(4),
    NUMINI varchar(6),
    NUMFIN varchar(6),
    ANULADOS char(1),
    SUBEMPRESA integer)
returns (
    NOMTIPO varchar(30),
    ID integer,
    PREF varchar(4),
    NUMERO varchar(6),
    FECHA date,
    VENCE date,
    CONCEPTO varchar(60),
    REFER varchar(60),
    CODBODORI varchar(2),
    NOMBODORI varchar(30),
    CODBODDES varchar(2),
    NOMBODDES varchar(30),
    NOMTERCERO varchar(60),
    PRODCODBAR varchar(15),
    PRODDES varchar(60),
    PRODCANT numeric(18,4),
    PRODUNIDAD varchar(8),
    PRODLOTE varchar(15),
    OBS blob sub_type 0 segment size 80,
    ITEM integer,
    ARTICULO varchar(15),
    CODBAR varchar(15),
    ARTIDES varchar(60),
    CANT numeric(18,4),
    EXANT numeric(18,4),
    UNIDAD varchar(8),
    BODITEM varchar(2),
    COSTO numeric(18,2),
    DTOPORC numeric(9,2),
    DTOMONTO numeric(18,2),
    IVAPORC numeric(9,2),
    IVAMONTO numeric(18,2),
    CONSUMO numeric(18,2),
    SUBTOTAL numeric(18,2),
    TOTAL numeric(18,2),
    LOTE varchar(15),
    ANULADO char(1),
    OBSITEM blob sub_type 0 segment size 80)
AS
declare variable ST NUMERIC(18,2);
declare variable IVA NUMERIC(18,2);
declare variable TOT NUMERIC(18,2);
BEGIN
  /* DETERMINE LA TABLA A EXAMINAR */
  if (BIN_AND(TIPO, 1) <> 0) then
    BEGIN
    SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 11 INTO :NOMTIPO;
    FOR SELECT ENTR_ID, E.PREF_PRE, ENTR_NUMERO, ENTR_FECHA, ENTR_CONC, ENTR_REFER, E.BODE_COD, BODE_NOM, ENTR_NOMTERC, ENTR_OBS, ENTR_ANULADO
    FROM ENTRADAS E, BODEGA B, PREFIJOS PR
    WHERE E.BODE_COD = B.BODE_COD AND E.PREF_PRE >= :PREINI AND E.PREF_PRE <= :PREFIN AND ENTR_NUMERO >= :NUMINI AND ENTR_NUMERO <= :NUMFIN
     AND PR.PREF_PRE = E.PREF_PRE AND PR.TIDO_COD = 11 AND ((PR.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
    ORDER BY E.PREF_PRE, ENTR_NUMERO
    INTO :ID, :PREF, :NUMERO, :FECHA, :CONCEPTO, :REFER, :CODBODORI, :NOMBODORI, :NOMTERCERO, :OBS, :ANULADO
    DO
        BEGIN
        if ((:ANULADOS = 'S') or (:ANULADO = 'N')) then
            BEGIN
            if (anulado = 'S') then
             BEGIN
              ITEM = 0;
              ARTICULO = '';
              CODBAR = '';
              ARTIDES = '';
              CANT = 0;
              UNIDAD = '';
              BODITEM = '';
              lote = '';
              costo = 0;
              DTOPORC = 0;
              DTOMONTO = 0;
              IVAPORC = 0;
              IVAMONTO = 0;
              CONSUMO = 0;
              TOTAL = 0;
              OBSITEM = null;
              SUBTOTAL = 0;
              SUSPEND;
             END
            ELSE
             BEGIN
              if (DETALLE = 'S') then
                FOR SELECT ENDE_ITEM, A.ARTI_COD, ENDE_CODBAR, ENDE_DESC, ENDE_CANT, ENDE_UNIDAD, BODE_COD, ENDE_COSTO, ENDE_DTOPORC, ENDE_DTOMONTO, ENDE_IVAPORC, ENDE_IVAMONTO, ENDE_CONSUMO, ENDE_TOTAL, ENDE_LOTE, ENDE_OBS
                    FROM ENTRADAS_DETALLE D, ARTICULO A
                    WHERE D.ARTI_COD = A.ARTI_COD AND D.ENTR_ID = :ID
                    ORDER BY ENDE_ITEM
                    INTO :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :BODITEM, :COSTO, :DTOPORC, :DTOMONTO, :IVAPORC, :IVAMONTO, :CONSUMO, :TOTAL, :LOTE, :OBSITEM
                    DO
                    BEGIN
                    SUBTOTAL = TOTAL - IVAMONTO - CONSUMO;
                    SUSPEND;
                    END
              ELSE
                BEGIN
                SELECT SUM(ENDE_IVAMONTO), SUM(ENDE_CONSUMO), SUM(ENDE_TOTAL) FROM ENTRADAS_DETALLE D WHERE D.ENTR_ID = :ID INTO
                    :IVAMONTO, :CONSUMO, :TOTAL;
                SUBTOTAL = TOTAL - IVAMONTO - CONSUMO;
                SUSPEND;
                END
             END
            END
        END
    END
  if (BIN_AND(TIPO, 2) <> 0) then
    BEGIN
    SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 12 INTO :NOMTIPO;
    FOR SELECT SALI_ID, S.PREF_PRE, SALI_NUMERO, SALI_FECHA, SALI_CONC, SALI_REFER, S.BODE_COD, BODE_NOM, SALI_NOMTERC, SALI_OBS, SALI_ANULADO
    FROM SALIDAS S, BODEGA B, PREFIJOS PR
    WHERE S.BODE_COD = B.BODE_COD AND S.PREF_PRE >= :PREINI AND S.PREF_PRE <= :PREFIN AND SALI_NUMERO >= :NUMINI AND SALI_NUMERO <= :NUMFIN
     AND PR.PREF_PRE = S.PREF_PRE AND PR.TIDO_COD = 12 AND ((PR.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
    ORDER BY S.PREF_PRE, SALI_NUMERO
    into :ID, :PREF, :NUMERO, :FECHA, :CONCEPTO, :REFER, :CODBODORI, :NOMBODORI, :NOMTERCERO, :OBS, :ANULADO
    DO
        BEGIN
        if ((:ANULADOS = 'S') or (:ANULADO = 'N')) then
            BEGIN
            if (anulado = 'S') then
             BEGIN
              ITEM = 0;
              ARTICULO = '';
              CODBAR = '';
              ARTIDES = '';
              CANT = 0;
              UNIDAD = '';
              BODITEM = '';
              lote = '';
              costo = 0;
              DTOPORC = 0;
              DTOMONTO = 0;
              IVAPORC = 0;
              IVAMONTO = 0;
              CONSUMO = 0;
              TOTAL = 0;
              OBSITEM = null;
              SUBTOTAL = 0;
              SUSPEND;
             END
            ELSE
             BEGIN
              if (DETALLE = 'S') then
                FOR SELECT SADE_ITEM, A.ARTI_COD, SADE_CODBAR, SADE_DESC, SADE_CANT, SADE_UNIDAD, BODE_COD, SADE_COSTO, SADE_IVAPORC, SADE_IVAMONTO, SADE_CONSUMO, SADE_TOTAL, SADE_LOTE, SADE_OBS
                FROM SALIDAS_DETALLE D, ARTICULO A
                WHERE D.ARTI_COD = A.ARTI_COD AND D.SALI_ID = :ID
                ORDER BY SADE_ITEM
                INTO :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :BODITEM, :COSTO, :IVAPORC, :IVAMONTO, :CONSUMO, :TOTAL, :LOTE, :OBSITEM
                    DO
                BEGIN
                SUBTOTAL = TOTAL - IVAMONTO - CONSUMO;
                SUSPEND;
                END
              ELSE
                BEGIN
                SELECT SUM(SADE_IVAMONTO), SUM(SADE_CONSUMO), SUM(SADE_TOTAL) FROM SALIDAS_DETALLE D WHERE D.SALI_ID = :ID INTO
                    :IVAMONTO, :CONSUMO, :TOTAL;
                SUBTOTAL = TOTAL - IVAMONTO - CONSUMO;
                SUSPEND;
                END
             END
            END
        END
    END
  if (BIN_AND(TIPO, 4) <> 0) then
    BEGIN
    SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 13 INTO :NOMTIPO;
    FOR SELECT TRAN_ID, T.PREF_PRE, TRAN_NUMERO, TRAN_FECHA, TRAN_CONC, TRAN_REFER, T.BODE_COD, BO.BODE_NOM, TRAN_BODDES, BD.BODE_NOM, TRAN_OBS, TRAN_ANULADO
    FROM TRASFERENCIAS T, BODEGA BO, BODEGA BD, PREFIJOS PR
    WHERE T.BODE_COD = BO.BODE_COD AND T.TRAN_BODDES = BD.BODE_COD AND T.PREF_PRE >= :PREINI AND T.PREF_PRE <= :PREFIN AND TRAN_NUMERO >= :NUMINI AND TRAN_NUMERO <= :NUMFIN
     AND PR.PREF_PRE = T.PREF_PRE AND PR.TIDO_COD = 13 AND ((PR.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
    ORDER BY T.PREF_PRE, TRAN_NUMERO
    into :ID, :PREF, :NUMERO, :FECHA, :CONCEPTO, :REFER, :CODBODORI, :NOMBODORI, :CODBODDES, :NOMBODDES, :OBS, :ANULADO
    DO
        BEGIN
        if ((:ANULADOS = 'S') or (:ANULADO = 'N')) then
            BEGIN
            if (anulado = 'S') then
             BEGIN
              ITEM = 0;
              ARTICULO = '';
              CODBAR = '';
              ARTIDES = '';
              CANT = 0;
              UNIDAD = '';
              BODITEM = '';
              lote = '';
              costo = 0;
              DTOPORC = 0;
              DTOMONTO = 0;
              IVAPORC = 0;
              IVAMONTO = 0;
              CONSUMO = 0;
              TOTAL = 0;
              OBSITEM = null;
              SUBTOTAL = 0;
              SUSPEND;
             END
            ELSE
             BEGIN
              if (DETALLE = 'S') then
                FOR SELECT TRAS_ITEM, A.ARTI_COD, TRAS_CODBAR, TRAS_DESC, TRAS_CANT, TRAS_UNIDAD, TRAS_COSTO, TRAS_IVAPORC, TRAS_IVAMONTO, TRAS_CONSUMO, TRAS_TOTAL, TRAS_LOTE, TRAS_OBS
                FROM TRASFERENCIAS_DETALLE D, ARTICULO A
                WHERE D.ARTI_COD = A.ARTI_COD AND D.TRAN_ID = :ID
                ORDER BY TRAS_ITEM
                INTO :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :COSTO, :IVAPORC, :IVAMONTO, :CONSUMO, :TOTAL, :LOTE, :OBSITEM
                    DO
                    BEGIN
                    SUBTOTAL = TOTAL - IVAMONTO - CONSUMO;
                    SUSPEND;
                    END
              ELSE
                BEGIN
                SELECT SUM(TRAS_IVAMONTO), SUM(TRAS_CONSUMO), SUM(TRAS_TOTAL) FROM trasferencias_detalle D WHERE D.TRAN_ID = :ID INTO
                    :IVAMONTO, :CONSUMO, :TOTAL;
                SUBTOTAL = TOTAL - IVAMONTO - CONSUMO;
                SUSPEND;
                END
             END
            END
        END
    END
  if (BIN_AND(TIPO, 8) <> 0) then
    BEGIN
    SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 14 INTO :NOMTIPO;
    FOR SELECT AJUS_ID, A.PREF_PRE, AJUS_NUMERO, AJUS_FECHA, AJUS_CONC, A.BODE_COD, BODE_NOM, AJUS_OBS, AJUS_ANULADO
    FROM AJUSTES A, BODEGA B, PREFIJOS PR
    WHERE A.BODE_COD = B.BODE_COD AND A.PREF_PRE >= :PREINI AND A.PREF_PRE <= :PREFIN AND AJUS_NUMERO >= :NUMINI AND AJUS_NUMERO <= :NUMFIN
     AND PR.PREF_PRE = A.PREF_PRE AND PR.TIDO_COD = 14 AND ((PR.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
    ORDER BY A.PREF_PRE, AJUS_NUMERO
    into :ID, :PREF, :NUMERO, :FECHA, :CONCEPTO, :CODBODORI, :NOMBODORI, :OBS, :ANULADO
    DO
        BEGIN
        if ((:ANULADOS = 'S') or (:ANULADO = 'N')) then
            BEGIN
            if (anulado = 'S') then
             BEGIN
              ITEM = 0;
              ARTICULO = '';
              CODBAR = '';
              ARTIDES = '';
              CANT = 0;
              UNIDAD = '';
              BODITEM = '';
              lote = '';
              costo = 0;
              DTOPORC = 0;
              DTOMONTO = 0;
              IVAPORC = 0;
              IVAMONTO = 0;
              CONSUMO = 0;
              EXANT = 0;
              TOTAL = 0;
              OBSITEM = null;
              SUBTOTAL = 0;
              SUSPEND;
             END
            ELSE
             BEGIN
              if (DETALLE = 'S') then
                FOR SELECT AJUS_ITEM, A.ARTI_COD, AJUS_CODBAR, AJDE_DESC, AJUS_EXANT, AJUS_UNIDAD, BODE_COD, AJUS_EXNUE, AJUS_LOTE, AJDE_OBS
                FROM AJUSTES_DETALLE D, ARTICULO A
                WHERE D.ARTI_COD = A.ARTI_COD AND D.AJUS_ID = :ID
                ORDER BY AJUS_ITEM
                INTO :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :EXANT, :UNIDAD, :BODITEM, :CANT, :LOTE, :OBSITEM
                    DO
                      BEGIN
                      TOTAL = (CANT - EXANT) * COSTO;
                      SUBTOTAL = TOTAL;
                      SUSPEND;
                      END
              ELSE
                BEGIN
                TOTAL = 0;
                FOR SELECT ARTI_COD, AJUS_EXNUE, AJUS_EXANT FROM AJUSTES_DETALLE D WHERE D.AJUS_ID = :ID INTO
                    :ARTICULO, :CANT, :EXANT
                    DO
                      BEGIN
                      EXECUTE PROCEDURE COSTO_PROMEDIO(:ARTICULO, :FECHA) returning_values (:COSTO);
                      TOTAL = TOTAL + ((CANT - EXANT) * COSTO);
                      SUBTOTAL = TOTAL;
                      END
                SUSPEND;
                END
             END
            END
        END
    END
  if (BIN_AND(TIPO, 16) <> 0) then
    BEGIN
    SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 15 INTO :NOMTIPO;
    FOR SELECT ENSA_ID, E.PREF_PRE, ENSA_NUMERO, ENSA_FECHA, ENSA_CONC, ENSA_REFER, E.BODE_COD, BODE_NOM, ENSA_CODBAR, ENSA_DESC, ENSA_CANT, ENSA_UNIDAD, ENSA_LOTE, ENSA_OBS, ENSA_ANULADO
    FROM ENSAMBLES E, BODEGA B, PREFIJOS PR
    WHERE E.BODE_COD = B.BODE_COD AND E.PREF_PRE >= :PREINI AND E.PREF_PRE <= :PREFIN AND ENSA_NUMERO >= :NUMINI AND ENSA_NUMERO <= :NUMFIN
     AND PR.PREF_PRE = E.PREF_PRE AND PR.TIDO_COD = 15 AND ((PR.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
    ORDER BY E.PREF_PRE, ENSA_NUMERO
    into :ID, :PREF, :NUMERO, :FECHA, :CONCEPTO, :REFER, :CODBODORI, :NOMBODORI, :PRODCODBAR, :PRODDES, :PRODCANT, :PRODUNIDAD, :PRODLOTE, :OBS, :ANULADO
    DO
        BEGIN
        if ((:ANULADOS = 'S') or (:ANULADO = 'N')) then
            BEGIN
            if (anulado = 'S') then
             BEGIN
              ITEM = 0;
              ARTICULO = '';
              CODBAR = '';
              ARTIDES = '';
              CANT = 0;
              UNIDAD = '';
              BODITEM = '';
              lote = '';
              costo = 0;
              DTOPORC = 0;
              DTOMONTO = 0;
              IVAPORC = 0;
              IVAMONTO = 0;
              CONSUMO = 0;
              TOTAL = 0;
              OBSITEM = null;
              SUBTOTAL = 0;
              SUSPEND;
             END
            ELSE
             BEGIN
              if (DETALLE = 'S') then
                FOR SELECT ESDE_ITEM, A.ARTI_COD, ESDE_CODBAR, ESDE_DESC, ESDE_CANT, ESDE_UNIDAD, BODE_COD, ESDE_COSTO, ESDE_IVAPORC, ESDE_IVAMONTO, ESDE_CONSUMO, ESDE_TOTAL, ESDE_LOTE, ESDE_OBS
                FROM ensambles_detalle D, ARTICULO A
                WHERE D.ARTI_COD = A.ARTI_COD AND D.ENSA_ID = :ID
                ORDER BY ESDE_ITEM
                INTO :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :BODITEM, :COSTO, :IVAPORC, :IVAMONTO, :CONSUMO, :TOTAL, :LOTE, :OBSITEM
                    DO
                    BEGIN
                    SUBTOTAL = TOTAL - IVAMONTO - CONSUMO;
                    SUSPEND;
                    END
              ELSE
                BEGIN
                SELECT SUM(ESDE_IVAMONTO), SUM(ESDE_CONSUMO), SUM(ESDE_TOTAL) FROM ENSAMBLES_detalle D WHERE D.ENSA_ID = :ID INTO
                    :IVAMONTO, :CONSUMO, :TOTAL;
                SUBTOTAL = TOTAL - IVAMONTO - CONSUMO;
                SUSPEND;
                END
             END
            END
        END
    END
  if (BIN_AND(TIPO, 32) <> 0) then
    BEGIN
    SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 16 INTO :NOMTIPO;
    FOR SELECT DESE_ID, E.PREF_PRE, DESE_NUMERO, DESE_FECHA, DESE_CONC, DESE_REFER, E.BODE_COD, BODE_NOM, DESE_CODBAR, DESE_DESC, DESE_CANT, DESE_UNIDAD, DESE_LOTE, DESE_OBS, DESE_ANULADO
    FROM DESENSAMBLES E, BODEGA B, PREFIJOS PR
    WHERE E.BODE_COD = B.BODE_COD AND E.PREF_PRE >= :PREINI AND E.PREF_PRE <= :PREFIN AND DESE_NUMERO >= :NUMINI AND DESE_NUMERO <= :NUMFIN
     AND PR.PREF_PRE = E.PREF_PRE AND PR.TIDO_COD = 16 AND ((PR.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
    ORDER BY E.PREF_PRE, DESE_NUMERO
    into :ID, :PREF, :NUMERO, :FECHA, :CONCEPTO, :REFER, :CODBODORI, :NOMBODORI, :PRODCODBAR, :PRODDES, :PRODCANT, :PRODUNIDAD, :PRODLOTE, :OBS, :ANULADO
    DO
        BEGIN
        if ((:ANULADOS = 'S') or (:ANULADO = 'N')) then
            BEGIN
            if (anulado = 'S') then
             BEGIN
              ITEM = 0;
              ARTICULO = '';
              CODBAR = '';
              ARTIDES = '';
              CANT = 0;
              UNIDAD = '';
              BODITEM = '';
              lote = '';
              costo = 0;
              DTOPORC = 0;
              DTOMONTO = 0;
              IVAPORC = 0;
              IVAMONTO = 0;
              CONSUMO = 0;
              TOTAL = 0;
              OBSITEM = null;
              SUBTOTAL = 0;
              SUSPEND;
             END
            ELSE
             BEGIN
              if (DETALLE = 'S') then
                FOR SELECT DESE_ITEM, A.ARTI_COD, DEDE_CODBAR, DEDE_DESC, DEDE_CANT, DEDE_UNIDAD, BODE_COD, DEDE_COSTO, DEDE_IVAPORC, DEDE_IVAMONTO, DEDE_CONSUMO, DEDE_TOTAL, DEDE_LOTE, DEDE_OBS
                FROM DESensambles_detalle D, ARTICULO A
                WHERE D.ARTI_COD = A.ARTI_COD AND D.DESE_ID = :ID
                ORDER BY DESE_ITEM
                INTO
                    :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :BODITEM, :COSTO, :IVAPORC, :IVAMONTO, :CONSUMO, :TOTAL, :LOTE, :OBSITEM
                    DO
                    BEGIN
                    SUBTOTAL = TOTAL - IVAMONTO - CONSUMO;
                    SUSPEND;
                    END
              ELSE
                BEGIN
                SELECT SUM(DEDE_IVAMONTO), SUM(DEDE_CONSUMO), SUM(DEDE_TOTAL) FROM DESENSAMBLES_detalle D WHERE D.DESE_ID = :ID INTO
                    :IVAMONTO, :CONSUMO, :TOTAL;
                SUBTOTAL = TOTAL - IVAMONTO - CONSUMO;
                SUSPEND;
                END
             END
            END
        END
    END
  if (BIN_AND(TIPO, 64) <> 0) then
    BEGIN
    SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 17 INTO :NOMTIPO;
    FOR SELECT RESE_ID, R.PREF_PRE, RESE_NUMERO, RESE_FECHA, RESE_CONC, RESE_REFER, R.BODE_COD, BODE_NOM, RESE_NOMTERC, RESE_OBS, RESE_ANULADO
    FROM RESERVAS R, BODEGA B, PREFIJOS PR
    WHERE R.BODE_COD = B.BODE_COD AND R.PREF_PRE >= :PREINI AND R.PREF_PRE <= :PREFIN AND RESE_NUMERO >= :NUMINI AND RESE_NUMERO <= :NUMFIN
     AND PR.PREF_PRE = R.PREF_PRE AND PR.TIDO_COD = 17 AND ((PR.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
    ORDER BY R.PREF_PRE, RESE_NUMERO
    into :ID, :PREF, :NUMERO, :FECHA, :CONCEPTO, :REFER, :CODBODORI, :NOMBODORI, :NOMTERCERO, :OBS, :ANULADO
    DO
        BEGIN
        if ((:ANULADOS = 'S') or (:ANULADO = 'N')) then
            BEGIN
            if (anulado = 'S') then
             BEGIN
              ITEM = 0;
              ARTICULO = '';
              CODBAR = '';
              ARTIDES = '';
              CANT = 0;
              UNIDAD = '';
              BODITEM = '';
              lote = '';
              costo = 0;
              DTOPORC = 0;
              DTOMONTO = 0;
              IVAPORC = 0;
              IVAMONTO = 0;
              CONSUMO = 0;
              EXANT = 0;
              TOTAL = 0;
              OBSITEM = null;
              SUBTOTAL = 0;
              SUSPEND;
             END
            ELSE
             BEGIN
              if (DETALLE = 'S') then
                FOR SELECT RSDE_ITEM, A.ARTI_COD, RSDE_CODBAR, RSDE_DESC, RDSE_CANT, RSDE_UNIDAD, BODE_COD, RSDE_OBS
                FROM RESERVAS_DETALLE D, ARTICULO A
                WHERE D.ARTI_COD = A.ARTI_COD AND D.RESE_ID = :ID
                ORDER BY RSDE_ITEM
                INTO :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :BODITEM, :OBSITEM
                    DO
                    SUSPEND;
              ELSE
                BEGIN
                SELECT SUM(RDSE_CANT) FROM RESERVAS_detalle D WHERE D.RESE_ID = :ID INTO
                    :CANT;
                SUSPEND;
                END
             END
            END
        END
    END
  if (BIN_AND(TIPO, 128) <> 0) then
    BEGIN
    SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 18 INTO :NOMTIPO;
    FOR SELECT ORIN_ID, O.PREF_PRE, ORIN_NUMERO, ORIN_FECHA, ORIN_FECLLEGA, ORIN_CONC, ORIN_REFER, ORIN_NOMTERC, ORIN_OBS, ORIN_ANULADO
    FROM ORDENES_INVENTARIO O, PREFIJOS PR
    WHERE O.PREF_PRE >= :PREINI AND O.PREF_PRE <= :PREFIN AND ORIN_NUMERO >= :NUMINI AND ORIN_NUMERO <= :NUMFIN
     AND PR.PREF_PRE = O.PREF_PRE AND PR.TIDO_COD = 18 AND ((PR.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
    ORDER BY O.PREF_PRE, ORIN_NUMERO
    into :ID, :PREF, :NUMERO, :FECHA, :VENCE, :CONCEPTO, :REFER, :NOMTERCERO, :OBS, :ANULADO
    DO
        BEGIN
        if ((:ANULADOS = 'S') or (:ANULADO = 'N')) then
            BEGIN
            if (anulado = 'S') then
             BEGIN
              ITEM = 0;
              ARTICULO = '';
              CODBAR = '';
              ARTIDES = '';
              CANT = 0;
              UNIDAD = '';
              BODITEM = '';
              lote = '';
              costo = 0;
              DTOPORC = 0;
              DTOMONTO = 0;
              IVAPORC = 0;
              IVAMONTO = 0;
              CONSUMO = 0;
              EXANT = 0;
              TOTAL = 0;
              OBSITEM = null;
              SUBTOTAL = 0;
              SUSPEND;
             END
            ELSE
             BEGIN
              if (DETALLE = 'S') then
                FOR SELECT ORID_ITEM, A.ARTI_COD, ORID_CODBAR, ORID_DESC, ORID_CANT, ORID_UNIDAD, ORIN_COSTO, ORID_DTOPORC, ORID_DTOMONTO, ORID_IVAPORC, ORID_IVAMONTO, ORID_CONSUMO, ORID_TOTAL, ORID_OBS, ORID_LOTE
                FROM ORDENINVENTARIO_DETALLE D, ARTICULO A
                WHERE D.ARTI_COD = A.ARTI_COD AND D.ORIN_ID = :ID
                ORDER BY ORID_ITEM
                INTO :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :COSTO, :DTOPORC, :DTOMONTO, :IVAPORC, :IVAMONTO, :CONSUMO, :TOTAL, :OBSITEM, :LOTE
                    DO
                    BEGIN
                    SUBTOTAL = TOTAL - IVAMONTO - CONSUMO;
                    SUSPEND;
                    END
              ELSE
                BEGIN
                SELECT SUM(ORID_IVAMONTO), SUM(ORID_CONSUMO), SUM(ORID_TOTAL) FROM ordeninventario_detalle D WHERE D.ORIN_ID = :ID INTO
                    :IVAMONTO, :CONSUMO, :TOTAL;
                SUBTOTAL = TOTAL - IVAMONTO - CONSUMO;
                SUSPEND;
                END
             END
            END
        END
    END
  if (BIN_AND(TIPO, 256) <> 0) then
    BEGIN
    SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 27 INTO :NOMTIPO;
    FOR SELECT P.plpr_id, P.plpr_pref, P.plpr_numero, P.plpr_fecfin, P.plpr_conc, '', P.plpr_bodori, BODE_NOM, P.plpr_responsable, P.plpr_obs, P.plpr_anulado
    FROM plan_produccion P, BODEGA B, PREFIJOS PR
    WHERE P.plpr_pref >= :PREINI AND P.plpr_pref <= :PREFIN AND P.plpr_numero >= :NUMINI AND P.plpr_numero <= :NUMFIN AND
      P.plpr_bodori = B.BODE_COD AND PR.PREF_PRE = P.plpr_pref AND PR.TIDO_COD = 27 AND ((PR.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
    ORDER BY P.plpr_pref, P.plpr_numero
    into :ID, :PREF, :NUMERO, :FECHA, :CONCEPTO, :REFER, :CODBODORI, :NOMBODORI, :NOMTERCERO, :OBS, :ANULADO
    DO
        BEGIN
        SUBTOTAL = 0;
        IVAMONTO = 0;
        TOTAL = 0;
        if ((:ANULADOS = 'S') or (:ANULADO = 'N')) then
            BEGIN
            if (anulado = 'S') then
              BEGIN
              ITEM = 0;
              ARTICULO = '';
              CODBAR = '';
              ARTIDES = '';
              CANT = 0;
              UNIDAD = '';
              BODITEM = '';
              lote = '';
              costo = 0;
              DTOPORC = 0;
              DTOMONTO = 0;
              IVAPORC = 0;
              IVAMONTO = 0;
              CONSUMO = 0;
              EXANT = 0;
              TOTAL = 0;
              OBSITEM = null;
              SUBTOTAL = 0;
              SUSPEND;
              END
            ELSE
              BEGIN
              FOR SELECT D.plpd_item, A.ARTI_COD, D.plpd_codbar, D.plpd_desc, D.plpd_cant, D.plpd_unidad, D.plpd_obs, T.taiv_porc
                    FROM plan_produccion_det D, ARTICULO A, TARIFA_IVA T
                    WHERE D.ARTI_COD = A.ARTI_COD AND D.plpr_id = :ID AND A.taiv_cod = T.taiv_cod
                    INTO :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :OBSITEM, :ivaporc
                    DO
                    BEGIN
                    execute procedure ultimo_costo(:ARTICULO, :fecha,  :UNIDAD) returning_values (:costo);
                    ST = COSTO * CANT;
                    IVA = ST * ivaporc;
                    TOT = ST + IVA;
                    if (DETALLE = 'S') then
                        BEGIN
                        SUBTOTAL = ST;
                        IVAMONTO = IVA;
                        TOTAL = TOT;
                        SUSPEND;
                        END
                    ELSE
                        BEGIN
                        SUBTOTAL = SUBTOTAL + ST;
                        IVAMONTO = IVAMONTO + IVA;
                        TOTAL = TOTAL + TOT;
                        END
                    END
              if (DETALLE = 'N') then
                SUSPEND;
              END
            END
        END
    END
END
^

SET TERM ; ^

/* 20101112D */

/* EL COSTO DE TODOS LOS PRODUCTOS QUEDABA IGUAL */

SET TERM ^ ;

CREATE OR ALTER PROCEDURE CONSOLIDE_PRODUCCION(
    PLANID INTEGER)
AS
declare variable item integer;
declare variable item2 integer;
declare variable artic varchar(20);
declare variable cant numeric(18,4);
declare variable cantpro numeric(18,4);
declare variable codcmp varchar(20);
declare variable cantcmp numeric(18,4);
declare variable undcmp varchar(8);
declare variable factor float;
declare variable total float;
declare variable unidad varchar(8);
declare variable costou numeric(18,4);
declare variable porc numeric(18,4);
declare variable merma numeric(18,4);
declare variable costot numeric(18,4);
declare variable pesocmp numeric(18,4);
declare variable pesopro numeric(18,4);
declare variable fec date;
declare variable CONC VARCHAR(60);
declare variable Pref varchar(4);
declare variable Num varchar(6);
declare variable BodOri varchar(2);
declare variable BodDes varchar(2);
declare variable entrada CHAR(1);
declare variable LOTE VARCHAR(20);
BEGIN
select plpr_fecfin, plpr_conc, plpr_pref, plpr_numero, plpr_bodori, plpr_boddes, plpr_entrada
    from plan_produccion where plpr_id = :planid
    into :fec, :conc, :Pref, :Num, :BodOri, :BodDes, :entrada;
/* RECORRA LOS COMPONENTES HACIENDO EL MOVIMIENTO QUE GENRA ENSAMBLES SI ES NECESARIO */
FOR SELECT plpc_item, arti_cod, plpc_cant, plpc_unidad
    from plan_produccion_cons WHERE plpd_id = :PLANID
    into :item, :artic, :cant, :unidad
    do
    BEGIN
    execute procedure factor_unidad_cant(:artic, :unidad) returning_values(factor);
    SELECT ARTI_PESO FROM ARTICULO WHERE ARTI_COD = :artic INTO :pesopro;
    CANTPRO = CANT * FACTOR;
    if (exists (select arpr_item from articulos_producto where arti_cod = :artic)) then
        begin
        select sum(arpr_porc) from articulos_producto where arti_cod = :artic into :total;
        for select arpr_item, arpr_comp, arpr_cant, arpr_unidad, ARPR_PORC, ARPR_MERMA, arti_peso
            from articulos_producto P, ARTICULO A
            where P.arpr_comp = A.arti_cod AND p.arti_cod = :artic ORDER BY P.arpr_item
            into :item2, :codcmp, :cantcmp, :undcmp, :porc, :merma, :pesocmp
            DO
            BEGIN
            execute procedure factor_unidad_cant(:codcmp, :undcmp) returning_values (:factor);
            if (((cantcmp is null) or (cantcmp = 0)) AND (PORC IS NOT NULL) AND (porc <> 0)) then
                BEGIN
                /* ES PORCENTUAL AL PESO LA MEZCLA SOBRE EL 1ER ARTICULO */
                cantcmp = cantpro * pesopro * porc / TOTAL; /* APLICA LA PROPORCION */
                if ((MERMA IS NOT NULL) AND (MERMA <> 0)) then
                    cantcmp = cantcmp / ((100 - MERMA) / 100);
                END
            else
                BEGIN
                cantcmp = cantcmp * FACTOR * pesocmp * cantpro;
                END
            insert into plan_produccion_cons_prod (plpd_id, plpc_item, plcp_nrocomp, arpr_comp, arpr_cant, arpr_porc, arpr_unidad, arpr_merma, arti_peso)
                values (:planid, :item, :item2, :codcmp, :cantcmp, :porc, :undcmp, :merma, :pesocmp);
            END
        END
/*    ELSE
        insert into plan_produccion_cons_prod (plpd_id, plpc_item, plcp_nrocomp, arpr_comp, arpr_cant, arpr_porc, arpr_unidad, arpr_merma, arti_peso)
            values (:planid, :item, 1, :artic, :cantpro, 0, :unidad, 0, :pesopro);*/

    INSERT INTO MOVIMIENTO_ARTICULO
      (ARTI_COD, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM, TERC_NIT)
      VALUES(:artic, :bodori, :FEC, 27, :planid, :CONC, :cantpro, 0, 'N', null, :Pref, :Num, :item+1000, null);
    end
/* recorra el detalle calculando costos y haciendo la entrada */
if (entrada = 'S') then
    begin
    for select plpd_item, arti_cod, plpd_cant, plpd_unidad, plpd_lote
        from plan_produccion_det where plpr_id = :planid
        into :item, :artic, :cant, :unidad, :lote
        do
        begin
        COSTOT = 0;
        execute procedure factor_unidad_cant(:artic, :unidad) returning_values (:factor);
        CANTPRO = :cant * :FACTOR;
        FOR SELECT ARPR_COMP, ARPR_CANT, ARPR_unidad
            FROM plan_produccion_productos WHERE PLPR_ID = :planid AND PLPD_ITEM = :ITEM
            INTO :codcmp, :cantcmp, :undcmp
            DO
            BEGIN
            EXECUTE PROCEDURE costo_promedio_unidad(:codcmp, :fec, :undcmp) returning_values (:COSTOU);
            COSTOT = COSTOT + (COSTOU * cantcmp);
            END
        if ((CANTPRO) <> 0) then
            costou = costot / cantpro;
        else
            costou = 0;
        INSERT INTO MOVIMIENTO_ARTICULO
          (ARTI_COD, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM, TERC_NIT)
          VALUES(:artic, :boddes, :fec, 27, :planid, :conc, :cant, :costou, 'S', :lote, :Pref, :Num, :item, '');
        end
    end
end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER PROCEDURE ARREGLA_COSTO_PLANPROD(
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    FEC DATE,
    PLANID INTEGER,
    CONC VARCHAR(60),
    PREF VARCHAR(4),
    NUM VARCHAR(6),
    BODDES VARCHAR(2),
    ITEM INTEGER,
    ARTIC VARCHAR(20),
    CANT NUMERIC(18,4),
    UNIDAD VARCHAR(8),
    LOTE VARCHAR(20),
    COSTOU NUMERIC(18,2))
AS
declare variable CODCMP VARCHAR(20);
declare variable CANTPRO NUMERIC(18,4);
declare variable CANTCMP NUMERIC(18,4);
declare variable FACTOR NUMERIC(18,4);
declare variable UNDCMP VARCHAR(8);
declare variable COSTOT NUMERIC(18,2);
begin
FOR select P.plpr_id, plpr_fecfin, plpr_conc, plpr_pref, plpr_numero, plpr_boddes,
    plpd_item, arti_cod, plpd_cant, plpd_unidad, plpd_lote
    from plan_produccion P, plan_produccion_det D
    where P.plpr_id = D.plpr_id AND P.plpr_fecfin >= :fecini AND P.plpr_fecfin <= :fecfin
    into :planid, :fec, :conc, :Pref, :Num, :BodDes,
    :item, :artic, :cant, :unidad, :lote
    do
    begin
    COSTOT = 0;
    execute procedure factor_unidad_cant(:artic, :unidad) returning_values (:factor);
    CANTPRO = :cant * :FACTOR;
    FOR SELECT ARPR_COMP, ARPR_CANT, ARPR_unidad
        FROM plan_produccion_productos WHERE PLPR_ID = :planid AND PLPD_ITEM = :ITEM
        INTO :codcmp, :cantcmp, :undcmp
        DO
        BEGIN
        EXECUTE PROCEDURE costo_promedio_unidad(:codcmp, :fec, :undcmp) returning_values (:COSTOU);
        COSTOT = COSTOT + (COSTOU * cantcmp);
        END
    if ((CANTPRO) <> 0) then
        costou = costot / cantpro;
    else
        costou = 0;
    UPDATE MOVIMIENTO_ARTICULO
        SET MVAR_COSTO = :costou
        WHERE ARTI_COD = :artic AND MVAR_TIPODOC = 27 AND MVAR_IDREF = :planid AND MVAR_ENTRADA = 'S' AND MVAR_ITEM = :item;
    suspend;
    END
end
^

SET TERM ; ^


/* 20101112E */
SET TERM ^ ;

create procedure BUSQUEDA_ANTICIPOS_PRV (SUBEMPRESA INTEGER)
returns (
    anpr_id INTEGER,
    terc_nit VARCHAR(20),
    pref_pre VARCHAR(4),
    anpr_numero VARCHAR(6),
    anpr_fecha DATE,
    anpr_conc VARCHAR(60),
    anpr_base NUMERIC(18,2),
    anpr_anulado CHAR(1),
    terc_nom VARCHAR(60),
    prefegre VARCHAR(4),
    egre_numero VARCHAR(6))
as
declare variable egre_id integer;
begin
FOR select a.anpr_id,a.terc_nit,a.pref_pre,a.anpr_numero,a.anpr_fecha,a.anpr_conc,a.anpr_base,a.anpr_anulado,t.terc_nom, a.egre_id
    from anticipos_proveedor a, terceros t, prefijos p
    where t.terc_nit = a.terc_nit and a.pref_pre= p.pref_pre and p.tido_cod = 55 and ((p.sucu_id = :subempresa) or (:subempresa = 0))
    INTO :anpr_id, :terc_nit, :pref_pre, :anpr_numero, :anpr_fecha, :anpr_conc, :anpr_base, :anpr_anulado, :terc_nom, :egre_id
    DO
    BEGIN
    prefegre = '';
    egre_numero = '';
    SELECT e.pref_pre, egre_numero FROM egresos e WHERE egre_id = :egre_id INTO :prefegre, :egre_numero;
    suspend;
    END
end
^

SET TERM ; ^

grant execute on procedure busqueda_anticipos_prv to PUBLIC;

/* 20101115 */
/* BORRE SOLAMENTE ANTICIPOS SIN EGRESO DEL TERCERO A CORRER */

SET TERM ^ ;

CREATE OR ALTER procedure CHEQUEO_SALDOS_DOC_CXPAGAR (
    PRVINI varchar(20),
    PRVFIN varchar(20))
returns (
    ERROR varchar(60),
    TIPO integer,
    ID integer,
    PREF varchar(4),
    NUMERO varchar(6))
AS
declare variable FECHA DATE;
declare variable NIT VARCHAR(20);
declare variable RTFTE NUMERIC(18, 2);
declare variable RTIVA NUMERIC(18, 2);
declare variable RTICA NUMERIC(18, 2);
declare variable MONTO NUMERIC(18, 2);
declare variable EXISTE CHAR(1);
declare variable IDR INTEGER;
declare variable EGREID INTEGER;
declare variable TRM NUMERIC(18, 2);
declare variable INGPAS INTEGER;
declare variable CANT INTEGER;
declare variable IDT INTEGER;
BEGIN
DELETE FROM anticipos_proveedor WHERE EGRE_ID = 0 AND TERC_NIT >= :PRVINI AND TERC_NIT <= :PRVFIN;
DELETE FROM saldos_doc_cxpagar WHERE TERC_NIT >= :PRVINI AND TERC_NIT <= :PRVFIN;

FOR SELECT FACO_ID, FACO_FECHA, TERC_NIT, FACO_RTFTEMONTO, FACO_rtivamonto, FACO_rticamonto, FACO_TOTAL, FACO_TRM
    FROM FACTURAS_COMPRA WHERE FACO_ID <> 0 and faco_anulado = 'N' AND TERC_NIT >= :PRVINI AND TERC_NIT <= :PRVFIN
    ORDER BY FACO_FECHA
    INTO :ID, :FECHA, :nit,  :RTFTE, :RTIVA, :RTICA, :MONTO, :TRM
    DO
    INSERT INTO saldos_doc_cxpagar (SDCP_TIPOREF, SDCP_IDREF, SDCP_FECHA, TERC_NIT, SDCP_RTEFTE, SDCP_RTIVA, SDCP_RTICA, SDCP_ABONO, SDCP_ABRTFTE, SDCP_ABRTIVA, SDCP_ABRTICA, SDCP_DEBITO, SDCP_MONTO, SDCP_TRM)
        VALUES (21, :ID, :fecha, :nit, :rtfte, :rtiva, :rtica, 0, 0, 0, 0, 'S', :MONTO, :TRM);

FOR SELECT NDPR_ID, NDPR_FECHA, TERC_NIT, NDPR_RTFTEMONTO, NDPR_rtivamonto, NDPR_rticamonto, ndpr_monto+ndpr_ivamonto, NDPR_TRM
    FROM notas_debito_proveedor WHERE NDPR_ID <> 0 and NDPR_anulado = 'N' AND TERC_NIT >= :PRVINI AND TERC_NIT <= :PRVFIN
    ORDER BY NDPR_FECHA
    INTO :ID, :FECHA, :nit,  :RTFTE, :RTIVA, :RTICA, :MONTO, :TRM
    DO
    INSERT INTO saldos_doc_cxpagar (SDCP_TIPOREF, SDCP_IDREF, SDCP_FECHA, TERC_NIT, SDCP_RTEFTE, SDCP_RTIVA, SDCP_RTICA, SDCP_ABONO, SDCP_ABRTFTE, SDCP_ABRTIVA, SDCP_ABRTICA, SDCP_DEBITO, SDCP_MONTO, SDCP_TRM)
        VALUES (51, :ID, :fecha, :nit, :rtfte, :rtiva, :rtica, 0, 0, 0, 0, 'S', :MONTO, :TRM);

/*FOR SELECT MANC_ID, MANC_FECHA, TERC_NIT, 0, 0, 0, MANC_APAGAR
    FROM manifiesto_carga M, vehiculos V WHERE V.vehi_cod = manc_vehiculo AND MANC_ID <> 0 and MANC_anulado = 'N' AND TERC_NIT >= :PRVINI AND TERC_NIT <= :PRVFIN and manc_apagar > 0
    ORDER BY MANC_FECHA
    INTO :ID, :FECHA, :nit,  :RTFTE, :RTIVA, :RTICA, :MONTO
    DO
    INSERT INTO saldos_doc_cxpagar (SDCP_TIPOREF, SDCP_IDREF, SDCP_FECHA, TERC_NIT, SDCP_RTEFTE, SDCP_RTIVA, SDCP_RTICA, SDCP_ABONO, SDCP_ABRTFTE, SDCP_ABRTIVA, SDCP_ABRTICA, SDCP_DEBITO, SDCP_MONTO)
        VALUES (89, :ID, :fecha, :nit, :rtfte, :rtiva, :rtica, 0, 0, 0, 0, 'S', :MONTO);
*/
FOR SELECT DVCO_ID, DVCO_FECHA, TERC_NIT, DVCO_RTFTEMONTO, DVCO_rtivamonto, DVCO_rticamonto, dvco_total, DVCO_TRM
    FROM devoluciones_compras WHERE DVCO_ID <> 0 and DVCO_anulado = 'N' AND TERC_NIT >= :PRVINI AND TERC_NIT <= :PRVFIN
    ORDER BY DVCO_FECHA
    INTO :ID, :FECHA, :nit,  :RTFTE, :RTIVA, :RTICA, :MONTO, :TRM
    DO
    INSERT INTO saldos_doc_cxpagar (SDCP_TIPOREF, SDCP_IDREF, SDCP_FECHA, TERC_NIT, SDCP_RTEFTE, SDCP_RTIVA, SDCP_RTICA, SDCP_ABONO, SDCP_ABRTFTE, SDCP_ABRTIVA, SDCP_ABRTICA, SDCP_DEBITO, SDCP_MONTO, SDCP_TRM)
        VALUES (24, :ID, :fecha, :nit, :rtfte*-1, :rtiva*-1, :rtica*-1, 0, 0, 0, 0, 'N', :MONTO * -1, :TRM);

FOR SELECT NCPR_ID, NCPR_FECHA, TERC_NIT, NCPR_RTFTEMONTO, NCPR_rtivamonto, NCPR_rticamonto, ncpr_monto+ncpr_ivamonto, NCPR_TRM
    FROM notas_credito_proveedor WHERE NCPR_ID <> 0 and NCPR_anulado = 'N' AND TERC_NIT >= :PRVINI AND TERC_NIT <= :PRVFIN
    ORDER BY NCPR_FECHA
    INTO :ID, :FECHA, :nit,  :RTFTE, :RTIVA, :RTICA, :MONTO, :TRM
    DO
    INSERT INTO saldos_doc_cxpagar (SDCP_TIPOREF, SDCP_IDREF, SDCP_FECHA, TERC_NIT, SDCP_RTEFTE, SDCP_RTIVA, SDCP_RTICA, SDCP_ABONO, SDCP_ABRTFTE, SDCP_ABRTIVA, SDCP_ABRTICA, SDCP_DEBITO, SDCP_MONTO, SDCP_TRM)
        VALUES (52, :ID, :fecha, :nit, :rtfte*-1, :rtiva*-1, :rtica*-1, 0, 0, 0, 0, 'N', :MONTO * -1, :TRM);

FOR SELECT ANPR_ID, ANPR_FECHA, TERC_NIT, ANPR_RTFTEMONTO, ANPR_rtivamonto, ANPR_rticamonto, anpr_base+anpr_ivamonto, ANPR_TRM
    FROM anticipos_proveedor WHERE ANPR_ID <> 0 and ANPR_anulado = 'N' AND TERC_NIT >= :PRVINI AND TERC_NIT <= :PRVFIN
    ORDER BY ANPR_FECHA
    INTO :ID, :FECHA, :nit,  :RTFTE, :RTIVA, :RTICA, :MONTO, :TRM
    DO
    INSERT INTO saldos_doc_cxpagar (SDCP_TIPOREF, SDCP_IDREF, SDCP_FECHA, TERC_NIT, SDCP_RTEFTE, SDCP_RTIVA, SDCP_RTICA, SDCP_ABONO, SDCP_ABRTFTE, SDCP_ABRTIVA, SDCP_ABRTICA, SDCP_DEBITO, SDCP_MONTO, SDCP_TRM)
        VALUES (55, :ID, :fecha, :nit, :rtfte*-1, :rtiva*-1, :rtica*-1, 0, 0, 0, 0, 'N', :MONTO * -1, :TRM);
/*
execute procedure LEE_configuracion('TRANSPORTE', 'GENERAL', 'TARIFA DE INGRESO POR PASAJES A CREDITO') returning_values (:ingpas);
FOR SELECT P.plpa_id, P.plpa_fecha, V.terc_nit, 0, 0, 0, D.plpa_valor, D.plpa_tiquete
    FROM planilla_pasajeros_det D, planilla_pasajeros P, VEHICULOS V
    WHERE P.plpa_id = D.plpa_id AND P.plpa_vehiculo = V.vehi_cod AND P.plpa_id <> 0 and p.PLPA_anulado = 'N' AND
    V.TERC_NIT >= :PRVINI AND V.TERC_NIT <= :PRVFIN
    ORDER BY P.plpa_fecha, P.plpa_id
    INTO :ID, :FECHA, :nit,  :RTFTE, :RTIVA, :RTICA, :MONTO, :idt
    DO
    BEGIN
    CANT = 0;
    SELECT TIQP_CANT FROM tiquete_pasajero WHERE TIQP_ID = :IDT and TIQP_FORMAP = 'R' INTO :CANT;
    if (CANT IS NULL) then
        CANT = 0;
    EXISTE = 'N';
    select 'S' from saldos_doc_cxpagar where sdcp_tiporef = 88 and
        sdcp_idref = :id and sdcp_fecha = :fecha into :EXISTE;
    if (Existe = 'S') then
        UPDATE saldos_doc_cxpagar
            SET SDCP_MONTO = SDCP_MONTO + (:monto-(:INGPAS*:cant))
            WHERE SDCP_TIPOREF = 88 AND SDCP_IDREF = :id AND SDCP_FECHA = :fecha;
    ELSE
        INSERT INTO SALDOS_DOC_CXPAGAR (SDCP_TIPOREF, SDCP_IDREF, SDCP_FECHA, TERC_NIT, SDCP_RTEFTE, SDCP_RTIVA, SDCP_RTICA, SDCP_ABONO, SDCP_ABRTFTE, SDCP_ABRTIVA, SDCP_ABRTICA, SDCP_DEBITO, SDCP_MONTO)
            VALUES (88, :id, :fecha, :nit, 0, 0, 0, 0, 0, 0, 0, 'S', (:monto-(:INGPAS*:CANT)));
    end

execute procedure LEE_configuracion('TRANSPORTE', 'GENERAL', 'TARIFA DE INGRESO POR REMESAS DE PASAJEROS') returning_values (:ingpas);
FOR SELECT P.plpa_id, P.plpa_fecha, V.terc_nit, 0, 0, 0, D.plpr_remesa
    FROM planilla_pasajeros_rem D, planilla_pasajeros P, VEHICULOS V WHERE P.plpa_id = D.plpa_id AND P.plpa_vehiculo = V.vehi_cod AND P.plpa_id <> 0 and P.PLPA_anulado = 'N' AND V.TERC_NIT >= :PRVINI AND V.TERC_NIT <= :PRVFIN
    ORDER BY P.plpa_fecha, P.plpa_id
    INTO :ID, :FECHA, :nit,  :RTFTE, :RTIVA, :RTICA, :idr
    DO
    BEGIN
    SELECT CGRM_TOTAL-CGRM_DOMICILIO-CGRM_SEGURO FROM carga_remesa WHERE CGRM_ID = :IDR INTO :MONTO;
    execute procedure redondee(MONTO * (100-ingpas) / 100, 0) returning_values (MONTO);
    if (MONTO <> 0) then
        BEGIN
        EXISTE = 'N';
        select 'S' from saldos_doc_cxpagar where sdcp_tiporef = 88 and
            sdcp_idref = :id and sdcp_fecha = :fecha into :EXISTE;
        if (Existe = 'S') then
            UPDATE saldos_doc_cxpagar
                SET SDCP_MONTO = SDCP_MONTO + :monto
                WHERE SDCP_TIPOREF = 88 AND SDCP_IDREF = :id AND SDCP_FECHA = :fecha;
        ELSE
            INSERT INTO SALDOS_DOC_CXPAGAR (SDCP_TIPOREF, SDCP_IDREF, SDCP_FECHA, TERC_NIT, SDCP_RTEFTE, SDCP_RTIVA, SDCP_RTICA, SDCP_ABONO, SDCP_ABRTFTE, SDCP_ABRTIVA, SDCP_ABRTICA, SDCP_DEBITO, SDCP_MONTO)
                VALUES (88, :id, :fecha, :nit, 0, 0, 0, 0, 0, 0, 0, 'S', :monto);
        end
    end
*/
FOR SELECT APPD_TIPODOC, APPD_IDDOC, APPR_FECHA, TERC_NIT, APPD_APLICADO, APPD_RTFTE, APPD_RTIVA, APPD_RTICA, APPR_TRM
    FROM APLICACION_PROVEEDOR_DETALLE D, aplicacion_provedor A
    WHERE A.APPR_ID = D.appr_id AND A.APPR_ID <> 0 AND APPR_ANULADO = 'N' AND TERC_NIT >= :PRVINI AND TERC_NIT <= :PRVFIN
    ORDER BY APPR_FECHA
    INTO :TIPO, :ID, :FECHA, :NIT, :MONTO, :RTFTE, :RTIVA, :RTICA, :TRM
    DO
    BEGIN
    EXISTE = 'N';
    select 'S' from saldos_doc_cxpagar where sdcp_tiporef = :TIPO and sdcp_idref = :ID and sdcp_fecha = :fecha into :EXISTE;
    if (Existe = 'S') then
        begin
        /* actualice el saldo del dia */
        UPDATE saldos_doc_cxpagar
            SET SDCP_ABONO = SDCP_ABONO + :MONTO,
                SDCP_ABRTFTE = SDCP_ABRTFTE + :RTFTE,
                SDCP_ABRTIVA = SDCP_ABRTIVA + :RTIVA,
                SDCP_ABRTICA = SDCP_ABRTICA + :RTICA,
                SDCP_TRM = :TRM
            WHERE SDCP_TIPOREF = :TIPO AND SDCP_IDREF = :ID AND SDCP_FECHA = :fecha;
        END
    ELSE
        BEGIN
        /* Inserte un nuevo saldo diario */
        INSERT INTO saldos_doc_cxpagar (SDCP_TIPOREF, SDCP_IDREF, SDCP_FECHA, TERC_NIT, SDCP_RTEFTE, SDCP_RTIVA, SDCP_RTICA, SDCP_ABONO, SDCP_ABRTFTE, SDCP_ABRTIVA, SDCP_ABRTICA, SDCP_DEBITO, SDCP_MONTO, SDCP_TRM)
            VALUES (:TIPO, :ID, :fecha, :NIT, 0, 0, 0, :MONTO, :rtfte, :rtiva, :rtica, 'N', 0, :TRM);
        END
    END

FOR SELECT E.EGRE_ID, EGDE_TIPODOC, EGDE_IDDOC, EGRE_FECHA, TERC_NIT, EGDE_ABONO+EGDE_DTOF, EGDE_RTFTE, EGDE_RTIVA, EGDE_RTICA, EGRE_TRM
    FROM EGRESOS_DETALLE D, EGRESOS E
    WHERE E.EGRE_ID = D.EGRE_ID AND E.EGRE_ID <> 0 AND EGRE_ANULADO = 'N' AND TERC_NIT >= :PRVINI AND TERC_NIT <= :PRVFIN
    ORDER BY EGRE_FECHA
    INTO :IDR, :TIPO, :ID, :FECHA, :NIT, :MONTO, :RTFTE, :RTIVA, :RTICA, :TRM
    DO
    BEGIN
    EXISTE = 'N';
    if (TIPO = 55) then
        BEGIN
        SELECT EGRE_ID FROM anticipos_proveedor WHERE ANPR_ID = :ID INTO :EGREID;
        if (EGREID = IDR) then
            EXISTE = 'S';
        END
    if (EXISTE = 'N') then
        BEGIN
        select 'S' from saldos_doc_cxpagar where sdcp_tiporef = :TIPO and sdcp_idref = :ID and sdcp_fecha = :fecha into :EXISTE;
        if (Existe = 'S') then
            begin
            /* actualice el saldo del dia */
            UPDATE saldos_doc_cxpagar
                SET SDCP_ABONO = SDCP_ABONO + :MONTO,
                    SDCP_ABRTFTE = SDCP_ABRTFTE + :RTFTE,
                    SDCP_ABRTIVA = SDCP_ABRTIVA + :RTIVA,
                    SDCP_ABRTICA = SDCP_ABRTICA + :RTICA,
                    SDCP_TRM = :TRM
                WHERE SDCP_TIPOREF = :TIPO AND SDCP_IDREF = :ID AND SDCP_FECHA = :fecha;
            END
        ELSE
            BEGIN
            /* Inserte un nuevo saldo diario */
            INSERT INTO saldos_doc_cxpagar (SDCP_TIPOREF, SDCP_IDREF, SDCP_FECHA, TERC_NIT, SDCP_RTEFTE, SDCP_RTIVA, SDCP_RTICA, SDCP_ABONO, SDCP_ABRTFTE, SDCP_ABRTIVA, SDCP_ABRTICA, SDCP_DEBITO, SDCP_MONTO, SDCP_TRM)
                VALUES (:TIPO, :ID, :fecha, :NIT, 0, 0, 0, :MONTO, :rtfte, :rtiva, :rtica, 'N', 0, :TRM);
            END
        END
    END

FOR SELECT R.reca_id, D.rccr_tipodoc, D.rccr_iddoc, RECA_FECHA, TERC_NIT, D.rccr_abono+D.rccr_dtof, D.rccr_rtfte, D.rccr_rtiva, D.rccr_rtica, RECA_TRM
    FROM recibos_caja_crucec D, recibos_caja R
    WHERE R.reca_id = D.reca_id AND R.reca_id <> 0 AND RECA_ANULADO = 'N' AND TERC_NIT >= :PRVINI AND TERC_NIT <= :PRVFIN
    ORDER BY RECA_FECHA
    INTO :IDR, :TIPO, :ID, :FECHA, :NIT, :MONTO, :RTFTE, :RTIVA, :RTICA, :TRM
    DO
    BEGIN
    EXISTE = 'N';
    select 'S' from saldos_doc_cxpagar where sdcp_tiporef = :TIPO and sdcp_idref = :ID and sdcp_fecha = :fecha into :EXISTE;
    if (Existe = 'S') then
        begin
        /* actualice el saldo del dia */
        UPDATE saldos_doc_cxpagar
            SET SDCP_ABONO = SDCP_ABONO + :MONTO,
            SDCP_ABRTFTE = SDCP_ABRTFTE + :RTFTE,
            SDCP_ABRTIVA = SDCP_ABRTIVA + :RTIVA,
            SDCP_ABRTICA = SDCP_ABRTICA + :RTICA,
            SDCP_TRM = :TRM
            WHERE SDCP_TIPOREF = :TIPO AND SDCP_IDREF = :ID AND SDCP_FECHA = :fecha;
        END
    ELSE
        BEGIN
        /* Inserte un nuevo saldo diario */
        INSERT INTO saldos_doc_cxpagar (SDCP_TIPOREF, SDCP_IDREF, SDCP_FECHA, TERC_NIT, SDCP_RTEFTE, SDCP_RTIVA, SDCP_RTICA, SDCP_ABONO, SDCP_ABRTFTE, SDCP_ABRTIVA, SDCP_ABRTICA, SDCP_DEBITO, SDCP_MONTO, SDCP_TRM)
            VALUES (:TIPO, :ID, :fecha, :NIT, 0, 0, 0, :MONTO, :rtfte, :rtiva, :rtica, 'N', 0, :TRM);
        END
    END

for select anpr_id, anpr_base+anpr_ivamonto, PREF_PRE, ANPR_NUMERO, ANPR_TRM from anticipos_proveedor
    where anpr_anulado = 'N' and egre_id not in (select egre_id from egresos where egre_anulado = 'N')
    into :ID, :MONTO, :PREF, :NUMERO, :TRM
    do
    begin
    FECHA = cast('now' as date);
/*    execute procedure saldo_doc_cxpagar(55, :id, :FECHA) returning_values (:RTFTE);*/
    if ((MONTO = RTFTE) or (RTFTE IS NULL)) then
        DELETE FROM anticipos_proveedor WHERE ANPR_ID = :ID;
    ELSE
        BEGIN
        TIPO = 55;
        ERROR = 'DOCUMENTO ANULADO CON ABONOS';
        SUSPEND;
        END
    end
END
^

SET TERM ; ^


/* 20101116 */
/* quedo mal la ultima modificación ya que el saldo_cuenta es inicial y el por tercero es final */
SET TERM ^ ;

CREATE OR ALTER procedure AUXILIAR_TERCERO_DESDE_HASTA (
    CUENTAINI varchar(20),
    CUENTAFIN varchar(20),
    TERCINI varchar(20),
    TERCFIN varchar(20),
    DESDE char(8),
    HASTA char(8),
    PROYINI varchar(4),
    PROYFIN varchar(4),
    CENTINI varchar(4),
    CENTFIN varchar(4),
    CEROS char(1))
returns (
    ID integer,
    CUENTA varchar(20),
    TIPOCOMP varchar(3),
    PREFIJO varchar(4),
    NUMERO varchar(6),
    FECHA char(8),
    CONCEPTO varchar(60),
    NIT varchar(15),
    DV char(1),
    REF varchar(20),
    BASE numeric(18,2),
    PORC numeric(9,4),
    DEBITO numeric(18,2),
    CREDITO numeric(18,2),
    PROYECTO varchar(4),
    CENTRO varchar(4),
    TIPOREF integer,
    IDREF integer,
    SALDO numeric(18,2),
    NOMCUENTA varchar(60),
    NOMTERCERO varchar(60),
    CUENTANIT varchar(40),
    SALDOFIN numeric(18,2),
    SALDOCTA numeric(18,2),
    SALDOCTAF numeric(18,2))
AS
declare variable NUMROWS INTEGER;
declare variable FECAUX CHAR(8);
BEGIN
EXECUTE PROCEDURE fecha_desde_conta (:DESDE) returning_values (:DESDE);
EXECUTE PROCEDURE fecha_y_numero_conta (:DESDE, -1) returning_values (:FECAUX);
for SELECT CUEN_COD, CUEN_NOM
    FROM CUENTAS
    WHERE CUEN_COD >= :CUENTAINI AND CUEN_COD <= :CUENTAFIN
     ORDER BY CUEN_COD
    INTO :CUENTA, :NOMCUENTA
    DO
    BEGIN
    EXECUTE PROCEDURE saldo_cuenta(:CUENTA, :desde) RETURNING_VALUES (:SALDOCTA);
    SALDOCTAF = SALDOCTA;
    FOR SELECT distinct TERC_NIT FROM saldos_terceros WHERE CUEN_COD = :CUENTA AND
        TERC_NIT >= :TERCINI AND TERC_NIT <= :TERCFIN ORDER BY TERC_NIT INTO :NIT
        DO
        BEGIN
        FOR SELECT distinct PROY_COD, CENT_COD FROM saldos_centros WHERE CUEN_COD = :CUENTA AND
            PROY_COD >= :proyini AND PROY_COD <= :proyfin AND CENT_COD >= :centini AND CENT_COD <= :centfin ORDER BY PROY_COD, CENT_COD
            INTO :proyecto, :centro
            DO
            BEGIN
            EXECUTE PROCEDURE saldo_centro_tercero(:CUENTA, :proyecto, :centro, :nit, :fecaux) returning_values (:SALDO);
            SALDOFIN = SALDO;
            CUENTANIT = CUENTA || NIT;
            SELECT TERC_NOM, TERC_DV FROM TERCEROS WHERE TERC_NIT = :nit INTO :NOMTERCERO, :DV;
            NUMROWS = 0;
            /* TRAE LOS MOV. DE LA CUENTA Y TERCERO DADOS */
            FOR SELECT E.ENCO_CONSEC, TICO_COD, PRCO_PREF, ENCO_NUMERO, ENCO_FECHA, D.CUEN_COD, CODE_CONCEPTO, D.TERC_NIT, CODE_REFER, CODE_BASE, CODE_PORC, CODE_DEBITO, CODE_CREDITO, D.PROY_COD, D.CENT_COD, ENCO_TIPOREF, ENCO_IDREF
                FROM COMPROBANTE_ENCABEZADO E, COMPROBANTE_DETALLE D
                WHERE E.ENCO_CONSEC = D.ENCO_CONSEC AND D.CUEN_COD = :CUENTA AND ENCO_FECHA >= :DESDE AND ENCO_FECHA <= :HASTA
                AND D.TERC_NIT = :NIT AND D.PROY_COD = :proyecto AND D.CENT_COD = :centro
                ORDER BY D.CUEN_COD, D.TERC_NIT, ENCO_FECHA, PRCO_PREF, ENCO_NUMERO
                INTO :ID, :TIPOCOMP, :PREFIJO, :NUMERO, :FECHA, :CUENTA, :CONCEPTO, :NIT, :REF, :BASE, :PORC, :DEBITO, :CREDITO, :PROYECTO, :centro, :TIPOREF, :IDREF
                DO
                BEGIN
                SALDOFIN = SALDOFIN + DEBITO - CREDITO;
                SALDOCTAF = SALDOCTAF + DEBITO - CREDITO;
                NUMROWS = NUMROWS + 1;
                SUSPEND;
                END
            if ((CEROS = 'S') AND (NUMROWS = 0)) then
                BEGIN
                SALDOFIN = SALDO;
                if (SALDO <> 0) then
                    BEGIN
                    ID = NULL;
                    TIPOCOMP = NULL;
                    PREFIJO = NULL;
                    NUMERO = NULL;
                    FECHA = NULL;
                    CONCEPTO = NULL;
                    REF = NULL;
                    BASE = 0;
                    PORC = 0;
                    DEBITO = 0;
                    CREDITO = 0;
                    PROYECTO = NULL;
                    CENTRO = NULL;
                    TIPOREF = 0;
                    IDREF = 0;
                    SUSPEND;
                    END
                END
            END
        END
    END
END
^

SET TERM ; ^


/* 20101117 */
CREATE TABLE ERRORES_ENVIO_CORREO (
    TERC_NIT T_NIT NOT NULL,
    FECHA DATE NOT NULL,
    EMAIL VARCHAR(100),
    STATUS VARCHAR(255));
alter table ERRORES_ENVIO_CORREO
add constraint PK_ERRORES_ENVIO_CORREO
primary key (TERC_NIT,FECHA);

grant select, delete, insert, update on errores_envio_correo to PUBLIC;


/* 20101117B */
/* PERMITIR MODIFICAR PRECIOS EN LOS DOCUMENTOS DE VENTA Y PRECIOS MENORES QUE EL COSTO POR USUARIO */

INSERT INTO ACCESO_USUARIO (USER_COD, ACUS_MODULO, ACUS_OPCION, ACUS_SI) VALUES ('USUARIO', 'FACTURACION', 24, 'N');
INSERT INTO ACCESO_USUARIO (USER_COD, ACUS_MODULO, ACUS_OPCION, ACUS_SI) VALUES ('USUARIO', 'FACTURACION', 34, 'N');
INSERT INTO ACCESO_USUARIO (USER_COD, ACUS_MODULO, ACUS_OPCION, ACUS_SI) VALUES ('USUARIO', 'FACTURACION', 54, 'N');
INSERT INTO ACCESO_USUARIO (USER_COD, ACUS_MODULO, ACUS_OPCION, ACUS_SI) VALUES ('USUARIO', 'FACTURACION', 64, 'N');

UPDATE CONFIGURACION
SET CONF_POSIBLES = 'SI,NO,PUNTO,USUARIO',
    CONF_AYUDA = 'SI: Permite al usuario cambiar el precio de venta sugerido al facturar, NO: Trae el precio de lista y el usuario no puede modificarlo,PUNTO: Depende de la tabla de puntos de venta,USUARIO:verifica el acceso del usuario definido por mantenimiento'
WHERE (CONF_MODULO = 'FACTURACION') AND (CONF_CATEGORIA = 'FACTURAS') AND (CONF_PROPIEDAD = 'PERMITIR MODIFICAR PRECIOS EN LA FACTURA');

UPDATE CONFIGURACION
SET CONF_POSIBLES = 'SI,NO,PUNTO,USUARIO',
    CONF_AYUDA = 'SI: Permite al usuario cambiar el precio de venta sugerido al facturar, NO: Trae el precio de lista y el usuario no puede modificarlo, PUNTO: Depende de la tabla de puntos de venta,USUARIO:verifica el acceso del usuario definido por mantenimiento'
WHERE (CONF_MODULO = 'FACTURACION') AND (CONF_CATEGORIA = 'REMISIONES') AND (CONF_PROPIEDAD = 'PERMITIR MODIFICAR PRECIOS EN LA REMISION');

UPDATE CONFIGURACION
SET CONF_POSIBLES = 'SI,NO,PUNTO,USUARIO',
    CONF_AYUDA = 'SI: Permite al usuario cambiar el precio de venta sugerido al facturar, NO: Trae el precio de lista y el usuario no puede modificarlo, PUNTO: Depende de la tabla de puntos de venta,USUARIO:verifica el acceso del usuario definido por mantenimiento'
WHERE (CONF_MODULO = 'FACTURACION') AND (CONF_CATEGORIA = 'PEDIDOS') AND (CONF_PROPIEDAD = 'PERMITIR MODIFICAR PRECIOS EN EL PEDIDO');

UPDATE CONFIGURACION
SET CONF_POSIBLES = 'SI,NO,PUNTO,USUARIO',
    CONF_AYUDA = 'SI: Permite al usuario cambiar el precio de venta sugerido al facturar, NO: Trae el precio de lista y el usuario no puede modificarlo, PUNTO: Depende de la tabla de puntos de venta,USUARIO:verifica el acceso del usuario definido por mantenimiento'
WHERE (CONF_MODULO = 'FACTURACION') AND (CONF_CATEGORIA = 'COTIZACIONES') AND (CONF_PROPIEDAD = 'PERMITIR MODIFICAR PRECIOS EN LA COTIZACION');

INSERT INTO ACCESO_USUARIO (USER_COD, ACUS_MODULO, ACUS_OPCION, ACUS_SI) VALUES ('USUARIO', 'FACTURACION', 25, 'N');

UPDATE CONFIGURACION
SET CONF_POSIBLES = 'SI,NO,USUARIO',
    CONF_AYUDA = 'NO: Impide que se registre un precio de venta menor que el costo (más impuestos si aplican),USUARIO:verifica el acceso del usuario definido por mantenimiento'
WHERE (CONF_MODULO = 'FACTURACION') AND (CONF_CATEGORIA = 'ARTICULOS') AND (CONF_PROPIEDAD = 'PERMITIR PRECIOS DE VENTA MENORES QUE EL COSTO');
COMMIT WORK;


/* 20101118 */
/* DESDE EL DETALLE POR TERCERO SE DAÑO EL NORMAL SOLO DEJABA LOS DEL ULTIMO MES CON MOVIMIENTO */
SET TERM ^ ;

CREATE OR ALTER procedure BALANCE_ANUAL (
    ANO char(4),
    CTAINI varchar(20),
    CTAFIN varchar(20),
    TERC char(1))
returns (
    CODIGO varchar(20),
    NOMBRE varchar(60),
    NIT varchar(20),
    NOMTERC varchar(60),
    INICIAL numeric(18,2),
    MVENE numeric(18,2),
    MVFEB numeric(18,2),
    MVMAR numeric(18,2),
    MVABR numeric(18,2),
    MVMAY numeric(18,2),
    MVJUN numeric(18,2),
    MVJUL numeric(18,2),
    MVAGO numeric(18,2),
    MVSEP numeric(18,2),
    MVOCT numeric(18,2),
    MVNOV numeric(18,2),
    MVDIC numeric(18,2),
    MVCIE numeric(18,2),
    FINAL numeric(18,2),
    NIVEL integer)
AS
declare variable DEBITOS NUMERIC(18,2);
declare variable CREDITOS NUMERIC(18,2);
declare variable MESAUX CHAR(2);
declare variable AFECTA CHAR(1);
BEGIN
FOR SELECT CUEN_COD, CUEN_NOM FROM CUENTAS WHERE CUEN_COD >= :CTAINI AND CUEN_COD <= :CTAFIN order by CUEN_COD INTO CODIGO, NOMBRE
  DO
  BEGIN
  execute procedure es_afectable(:CODIGO) returning_values (:AFECTA);
  if ((TERC = 'N') OR (AFECTA = 'N')) then
    BEGIN
    MVENE = 0;
    MVFEB = 0;
    MVMAR = 0;
    MVABR = 0;
    MVMAY = 0;
    MVJUN = 0;
    MVJUL = 0;
    MVAGO = 0;
    MVSEP = 0;
    MVOCT = 0;
    MVNOV = 0;
    MVDIC = 0;
    MVCIE = 0;
    EXECUTE PROCEDURE SALDO_CUENTA_MES(CODIGO, ANO, 1, 'S') RETURNING_VALUES (INICIAL);
    FOR SELECT MAX(substr(SACU_FECHA, 5, 6)), SUM(SACU_DEBITO), SUM(SACU_CREDITO) FROM SALDOS_CUENTAS
      WHERE CUEN_COD = :CODIGO AND :ANO = SUBSTR(SACU_FECHA, 1, 4)
      GROUP by substr(SACU_FECHA, 5, 6)
      INTO :MESAUX, :DEBITOS, :CREDITOS
      DO
      BEGIN
      if (MESAUX = '01') then
        MVENE = DEBITOS - CREDITOS;
      if (MESAUX = '02') then
        MVFEB = DEBITOS - CREDITOS;
      if (MESAUX = '03') then
        MVMAR = DEBITOS - CREDITOS;
      if (MESAUX = '04') then
        MVABR = DEBITOS - CREDITOS;
      if (MESAUX = '05') then
        MVMAY = DEBITOS - CREDITOS;
      if (MESAUX = '06') then
        MVJUN = DEBITOS - CREDITOS;
      if (MESAUX = '07') then
        MVJUL = DEBITOS - CREDITOS;
      if (MESAUX = '08') then
        MVAGO = DEBITOS - CREDITOS;
      if (MESAUX = '09') then
        MVSEP = DEBITOS - CREDITOS;
      if (MESAUX = '10') then
        MVOCT = DEBITOS - CREDITOS;
      if (MESAUX = '11') then
        MVNOV = DEBITOS - CREDITOS;
      if (MESAUX = '12') then
        MVDIC = DEBITOS - CREDITOS;
      if (MESAUX = '13') then
        MVCIE = DEBITOS - CREDITOS;
      END
    FINAL = INICIAL + MVENE + MVFEB + MVMAR + MVABR + MVMAY + MVJUN + MVJUL + MVAGO + MVSEP + MVOCT + MVNOV + MVDIC + MVCIE;
    EXECUTE PROCEDURE VALIDE_ESTRUCTURA (CODIGO) RETURNING_VALUES (:NIVEL);
    SUSPEND;
    END
   ELSE
    BEGIN
    EXECUTE PROCEDURE VALIDE_ESTRUCTURA (CODIGO) RETURNING_VALUES (:NIVEL);
    FOR SELECT TERC_NIT, TERC_NOM FROM TERCEROS T
        WHERE EXISTS (SELECT E.ENCO_CONSEC FROM comprobante_encabezado E, COMPROBANTE_DETALLE D
        WHERE E.enco_consec = D.enco_consec AND D.TERC_NIT = T.terc_nit and substring(e.enco_fecha from 1 for 4) = :ano
        and d.cuen_cod >= :ctaini and d.cuen_cod <= :ctafin)
        ORDER BY TERC_NIT
        INTO :nit, :nomterc
        DO
        BEGIN
        EXECUTE PROCEDURE saldo_tercero_mes(CODIGO, NIT, ANO, 1, 'S') RETURNING_VALUES (INICIAL);
        MVENE = 0;
        MVFEB = 0;
        MVMAR = 0;
        MVABR = 0;
        MVMAY = 0;
        MVJUN = 0;
        MVJUL = 0;
        MVAGO = 0;
        MVSEP = 0;
        MVOCT = 0;
        MVNOV = 0;
        MVDIC = 0;
        MVCIE = 0;
        FOR SELECT MAX(substr(SACU_FECHA, 5, 6)), SUM(SATE_DEBITO), SUM(SATE_CREDITO) FROM saldos_terceros
          WHERE CUEN_COD = :CODIGO AND TERC_NIT = :nit AND :ANO = SUBSTR(SACU_FECHA, 1, 4)
          GROUP by substr(SACU_FECHA, 5, 6)
          INTO :MESAUX, :DEBITOS, :CREDITOS
          DO
          BEGIN
          if (MESAUX = '01') then
            MVENE = DEBITOS - CREDITOS;
          if (MESAUX = '02') then
            MVFEB = DEBITOS - CREDITOS;
          if (MESAUX = '03') then
            MVMAR = DEBITOS - CREDITOS;
          if (MESAUX = '04') then
            MVABR = DEBITOS - CREDITOS;
          if (MESAUX = '05') then
            MVMAY = DEBITOS - CREDITOS;
          if (MESAUX = '06') then
            MVJUN = DEBITOS - CREDITOS;
          if (MESAUX = '07') then
            MVJUL = DEBITOS - CREDITOS;
          if (MESAUX = '08') then
            MVAGO = DEBITOS - CREDITOS;
          if (MESAUX = '09') then
            MVSEP = DEBITOS - CREDITOS;
          if (MESAUX = '10') then
            MVOCT = DEBITOS - CREDITOS;
          if (MESAUX = '11') then
            MVNOV = DEBITOS - CREDITOS;
          if (MESAUX = '12') then
            MVDIC = DEBITOS - CREDITOS;
          if (MESAUX = '13') then
            MVCIE = DEBITOS - CREDITOS;
          END
        FINAL = INICIAL + MVENE + MVFEB + MVMAR + MVABR + MVMAY + MVJUN + MVJUL + MVAGO + MVSEP + MVOCT + MVNOV + MVDIC + MVCIE;
        SUSPEND;
        END
    END
   END
END
^

SET TERM ; ^


/* 20101119 */
/* CONTABILICE LA COMPRA DE ACTIVOS */
SET TERM ^ ;

CREATE OR ALTER procedure CONTABIL_FACTCOMP (
    IDDOC integer,
    IDINTER integer)
returns (
    ERROR integer,
    VER char(1),
    IDC integer)
AS
DECLARE VARIABLE PREFIJO VARCHAR(4);
DECLARE VARIABLE NUM VARCHAR(6);
DECLARE VARIABLE NUMERO VARCHAR(10);
DECLARE VARIABLE FECAUX DATE;
DECLARE VARIABLE FECHA CHAR(8);
DECLARE VARIABLE CONCEPTO CHAR(60);
DECLARE VARIABLE VENCEAUX DATE;
DECLARE VARIABLE VENCE CHAR(8);
DECLARE VARIABLE VRDTO NUMERIC(18,2);
DECLARE VARIABLE VRADIC NUMERIC(18,2);
DECLARE VARIABLE VRSUBT NUMERIC(18,2);
DECLARE VARIABLE VRIVA NUMERIC(18,2);
DECLARE VARIABLE PRTFTE NUMERIC(9,2);
DECLARE VARIABLE VRRTFTE NUMERIC(18,2);
DECLARE VARIABLE VRRTIVA NUMERIC(18,2);
DECLARE VARIABLE PRTICA NUMERIC(9,2);
DECLARE VARIABLE VRRTICA NUMERIC(18,2);
DECLARE VARIABLE VRTOTAL NUMERIC(18,2);
DECLARE VARIABLE VREXTRA NUMERIC(18,2);
DECLARE VARIABLE TIPOCOMP VARCHAR(3);
DECLARE VARIABLE PREFCONT VARCHAR(4);
DECLARE VARIABLE INVEN CHAR(1);
DECLARE VARIABLE CTAINVEN VARCHAR(20);
DECLARE VARIABLE IVA CHAR(1);
DECLARE VARIABLE CTAIVA VARCHAR(20);
DECLARE VARIABLE CONSUMO CHAR(1);
DECLARE VARIABLE CTACONSUMO VARCHAR(20);
DECLARE VARIABLE CXP CHAR(1);
DECLARE VARIABLE CTACXP VARCHAR(20);
DECLARE VARIABLE RTFTE CHAR(1);
DECLARE VARIABLE CTARTFTE VARCHAR(20);
DECLARE VARIABLE RTIVA CHAR(1);
DECLARE VARIABLE CTARTIVA VARCHAR(20);
DECLARE VARIABLE RTICA CHAR(1);
DECLARE VARIABLE CTARTICA VARCHAR(20);
DECLARE VARIABLE CTADTO VARCHAR(20);
DECLARE VARIABLE CTAADIC VARCHAR(20);
DECLARE VARIABLE CTAEXTRA VARCHAR(20);
DECLARE VARIABLE EXISTE CHAR(1);
DECLARE VARIABLE CUENTA VARCHAR(20);
DECLARE VARIABLE MONTO NUMERIC(18,2);
DECLARE VARIABLE TIPOCUEN CHAR(1);
DECLARE VARIABLE NIT VARCHAR(20);
DECLARE VARIABLE NOMBRE VARCHAR(60);
DECLARE VARIABLE PROY VARCHAR(4);
DECLARE VARIABLE CENTRO VARCHAR(4);
DECLARE VARIABLE PROYDET VARCHAR(4);
DECLARE VARIABLE CENTRODET VARCHAR(4);
DECLARE VARIABLE PORC NUMERIC(5,2);
DECLARE VARIABLE NUMITEMS INTEGER;
DECLARE VARIABLE ARTICULO VARCHAR(15);
DECLARE VARIABLE IMPINC CHAR(1);
DECLARE VARIABLE IMPTOS NUMERIC(18,2);
DECLARE VARIABLE SUMA NUMERIC(18,2);
DECLARE VARIABLE PORCIVA NUMERIC(9,2);
DECLARE VARIABLE TCTAPROV VARCHAR(20);
DECLARE VARIABLE TCTARTFTE VARCHAR(20);
DECLARE VARIABLE TCTARTIVA VARCHAR(20);
DECLARE VARIABLE TCTARTICA VARCHAR(20);
DECLARE VARIABLE CUENTAADIC VARCHAR(20);
DECLARE VARIABLE BASEADIC VARCHAR(20);
DECLARE VARIABLE PORCADIC NUMERIC(5,2);
DECLARE VARIABLE VALORADIC NUMERIC(18,2);
DECLARE VARIABLE DBADIC CHAR(1);
DECLARE VARIABLE FOMENTO CHAR(2);
DECLARE VARIABLE BODE_DET CHAR(2);
DECLARE VARIABLE NUMPROV VARCHAR(10);
DECLARE VARIABLE MERCANCIA NUMERIC(18,2);
declare variable FACTOR DOUBLE PRECISION;
DECLARE VARIABLE MENORV CHAR(2);
declare variable DIG INTEGER;
declare variable NETO NUMERIC(18,2);
declare variable CENT CHAR(1);
declare variable ANULADO CHAR(1);
declare variable ERRORC INTEGER;
BEGIN
  /* INTERFACE */
  EXISTE = 'N';
  SELECT 'S', TICO_COD, PRCO_PRE, INCO_INVEN, INCO_IVA, INCO_CONSUMO, INCO_CXP, INCO_RTFTE, INCO_RTIVA, INCO_RTICA, INCO_CTAINVEN, INCO_CTAIVA, INCO_CTACONSUMO, INCO_CTADTO, INCO_CTAADIC, INCO_CTAEXTRA, INCO_CTACXP, INCO_CTARTFTE, INCO_CTARTIVA, INCO_CTARTICA, INCO_CONFIRMAR, INCO_CENTRO
    FROM INTERFAZ_COMPRAS WHERE INCO_ID = :IDINTER INTO :EXISTE, :TIPOCOMP, :PREFCONT, :INVEN, :IVA, :CONSUMO, :CXP, :RTFTE, :RTIVA, :RTICA, :CTAINVEN, :CTAIVA, :CTACONSUMO, :CTADTO, :CTAADIC, :CTAEXTRA, :CTACXP, :CTARTFTE, :CTARTIVA, :CTARTICA, :VER, :CENT;
  if (EXISTE = 'S') then
    BEGIN
    /* BORRE CONTABILIZACION PREVIA */
    DELETE FROM CONTABILIZACION WHERE CNTB_TIPOREF = 21 AND CNTB_IDREF = :IDDOC;
    /* ENCABEZADO DE LA FACTURA */
    SELECT PREF_PRE, FACO_NUMERO, FACO_FECHA, F.TERC_NIT, FACO_IMPTOS, FACO_VENCE, FACO_DTOMONTO, FACO_ADICIONAL, FACO_IVAMONTO, FACO_EXTRA, FACO_TOTAL, FACO_RTFTEPORC, FACO_RTFTEMONTO, FACO_RTIVAPOR, FACO_RTIVAMONTO, FACO_RTICAPOR, FACO_RTICAMONTO, TERC_NOM, PROV_CTARTFTE, PROV_CTARTIVA, PROV_CTARTICA, PROV_CTAPAGAR, FACO_NUMPROV, FACO_ANULADO
        FROM FACTURAS_COMPRA F, TERCEROS T, PROVEEDORES P WHERE FACO_ID = :IDDOC AND F.TERC_NIT = T.TERC_NIT AND T.TERC_NIT = P.TERC_NIT
        INTO :PREFIJO, :NUM, :FECAUX, :NIT, :IMPINC, :VENCEAUX, :VRDTO, :VRADIC, :VRIVA, :VREXTRA, :VRTOTAL, :PRTFTE, :VRRTFTE, :PORC, :VRRTIVA, :PRTICA, :VRRTICA, :NOMBRE, TCTARTFTE, TCTARTIVA, TCTARTICA, TCTAPROV, :NUMPROV, :ANULADO;
    /* CENTRO DE LA BODEGA */
    IF (CENT = 'B') THEN
        SELECT BODE_CENTRO, BODE_PROY FROM BODEGA B, FACTURAS_COMPRA F WHERE B.BODE_COD = F.BODE_COD AND F.FACO_ID = :IDDOC INTO :CENTRO, :PROY;
    ELSE
        SELECT PREF_CENTRO,PREF_PROY  FROM PREFIJOS P, FACTURAS_COMPRA F WHERE P.PREF_PRE = F.PREF_PRE AND F.FACO_ID = :IDDOC AND P.TIDO_COD = 21 INTO :CENTRO, :PROY;
    if (ANULADO = 'N') then
        BEGIN
        NUMERO = PREFIJO || NUM;
        VRSUBT = VRTOTAL - VREXTRA - VRIVA;
        MERCANCIA = VRSUBT - VRADIC + VRDTO;
        EXECUTE PROCEDURE FECHA_A_CONTA(:FECAUX) returning_values (:FECHA);
        EXECUTE PROCEDURE FECHA_A_CONTA(:VENCEAUX) returning_values (:VENCE);
        if (NUMPROV IS NULL) then
            NUMPROV = NUMERO;
        CONCEPTO = 'FC No.' || NUMERO || '-' || SUBSTR(NOMBRE,1,26) || '-NPROV.' || NUMPROV;
        IDC = GEN_ID(ID_CONTABILIZA, 1);
        INSERT INTO CONTABILIZACION (CNTB_ID, CNTB_TIPOCOMP, CNTB_PREFCNT, CNTB_NUMERO, CNTB_FECHA, CNTB_CONCEPTO, CNTB_REF, CNTB_TIPOREF, CNTB_IDREF, CNTB_PREFREF, CNTB_NUMREF, CNTB_PROCESADO)
            VALUES (:IDC, :TIPOCOMP, :PREFCONT, :NUM, :FECHA, :CONCEPTO, '', 21, :IDDOC, :PREFIJO, :NUM, 'N');
        NUMITEMS = 0;
        SUMA = 0;
        NETO = 0;
        ERROR = 0;
        EXECUTE PROCEDURE LEE_CONFIGURACION('COMPRAS', 'FACTURAS', 'USAR IMPOCONSUMO COMO PORCENTAJE DE FOMENTO') RETURNING_VALUES (FOMENTO);
        EXECUTE PROCEDURE lee_configuracion('COMPRAS','FACTURAS','DESCUENTO Y VALOR ADICIONAL DEL DOCUMENTO COMO MENOR VALOR DEL COSTO') returning_values (:MENORV);
        SELECT SUM(FCDE_consumo) from facturas_compras_detalle where faco_id = :IDDOC into :valoradic;
        if (MENORV = 'SI') then
            if (MERCANCIA <> 0) then
                FACTOR = (CAST(VRSUBT AS DOUBLE PRECISION) - VALORADIC) / (CAST(MERCANCIA AS DOUBLE PRECISION) - VALORADIC);
            ELSE
                FACTOR = 1;
        ELSE
           FACTOR = 1;
        SELECT CAST(CONF_VALOR AS INTEGER) FROM CONFIGURACION WHERE CONF_MODULO = 'COMPRAS' AND CONF_CATEGORIA = 'DOCUMENTOS' AND CONF_PROPIEDAD = 'REDONDEO AL MULTIPLO DE DIEZ EN TOTALES' INTO :DIG;
        if (INVEN = 'A') then
            BEGIN
            FOR SELECT MAX(COAR_CTACOMP), SUM(CAST(FCDE_CANT AS DOUBLE PRECISION) * (FCDE_PRUNIT-FCDE_DTOMONTO)), SUM(FCDE_IVAMONTO), SUM(FCDE_CONSUMO), MAX(F.BODE_COD)
                FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_COMPRAS_DETALLE F WHERE F.FACO_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD
                GROUP BY COAR_CTACOMP, F.BODE_COD INTO :CTAINVEN, :MONTO, :IMPTOS, :VALORADIC, :BODE_DET DO
                BEGIN
                IF (CENT = 'B') THEN
                  SELECT BODE_CENTRO, BODE_PROY FROM BODEGA WHERE BODE_COD = :BODE_DET INTO :CENTRODET, :PROYDET;
                if (IMPINC = 'S') then
                    BEGIN
                    MONTO = MONTO - IMPTOS;
                    if (FOMENTO <> 'SI' ) then
                        MONTO = MONTO - VALORADIC;
                    END
                MONTO = MONTO * FACTOR;
                execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                EXECUTE PROCEDURE CUENTA_INTERFAZ(21, :IDDOC, :CTAINVEN, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if ((TIPOCUEN = 'I') or (TIPOCUEN = 'A'))  then
                    BEGIN
                    FOR SELECT F.ARTI_COD, (FCDE_CANT * (FCDE_PRUNIT-FCDE_DTOMONTO)), FCDE_IVAMONTO, FCDE_CONSUMO
                        FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_COMPRAS_DETALLE F WHERE F.FACO_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTACOMP = :CUENTA
                        INTO :ARTICULO, :MONTO, :IMPTOS, :VALORADIC DO
                        BEGIN
                        if (IMPINC = 'S') then
                            BEGIN
                            MONTO = MONTO - IMPTOS;
                            if (FOMENTO <> 'SI' ) then
                                MONTO = MONTO - VALORADIC;
                            END
                        MONTO = MONTO * FACTOR;
                        execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                        IF (CENT = 'B') THEN
                           INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                               VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROYDET, :CENTRODET, NULL, NULL, NULL, :ARTICULO, 0, 0);
                        ELSE
                           INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                               VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                        NUMITEMS = NUMITEMS + 1;
                        NETO = NETO + MONTO;
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    IF (CENT = 'B') THEN
                       INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                           VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROYDET, :CENTRODET, :NUMERO, NULL, :VENCE, NULL, 0, 21);
                    ELSE
                       INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                           VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 21);
                    NUMITEMS = NUMITEMS + 1;
                    NETO = NETO + MONTO;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    IF (CENT = 'B') THEN
                       INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                           VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROYDET, :CENTRODET, NULL, NULL, NULL, NULL, 0, 0);
                    ELSE
                       INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                           VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NUMITEMS = NUMITEMS + 1;
                    NETO = NETO + MONTO;
                    END
                END
            END
        if (INVEN = 'K') then
            BEGIN
            FOR SELECT SUM(CAST(FCDE_CANT AS DOUBLE PRECISION) * (FCDE_PRUNIT-FCDE_DTOMONTO)), SUM(FCDE_IVAMONTO), SUM(FCDE_CONSUMO), MAX(BODE_COD)
                FROM FACTURAS_COMPRAS_DETALLE WHERE FACO_ID = :IDDOC GROUP BY BODE_COD INTO :MONTO, :IMPTOS, :VALORADIC, :BODE_DET Do
                BEGIN
                  IF (CENT = 'B') THEN
                    SELECT BODE_CENTRO, BODE_PROY FROM BODEGA WHERE BODE_COD = :BODE_DET INTO :CENTRODET, :PROYDET;
                  if (IMPINC = 'S') then
                   BEGIN
                    MONTO = MONTO - IMPTOS;
                    if (FOMENTO <> 'SI' ) then
                      MONTO = MONTO - VALORADIC;
                   END
                  MONTO = MONTO * FACTOR;
                  execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                  execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                  EXECUTE PROCEDURE CUENTA_INTERFAZ(21, :IDDOC, :CTAINVEN, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                  if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if ((TIPOCUEN = 'I') or (TIPOCUEN = 'A'))  then
                   BEGIN
                    FOR SELECT ARTI_COD, (FCDE_CANT * (FCDE_PRUNIT-FCDE_DTOMONTO)), FCDE_IVAMONTO, FCDE_CONSUMO
                      FROM FACTURAS_COMPRAS_DETALLE WHERE FACO_ID = :IDDOC INTO :ARTICULO, :MONTO, :IMPTOS, :VALORADIC DO
                       BEGIN
                       if (IMPINC = 'S') then
                        BEGIN
                         MONTO = MONTO - IMPTOS;
                         if (FOMENTO <> 'SI' ) then
                            MONTO = MONTO - VALORADIC;
                        END
                       MONTO = MONTO * FACTOR;
                       execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                       execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                       IF (CENT = 'B') THEN
                          INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                             VALUES (:IDC, :NUMITEMS, :CTAINVEN, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROYDET, :CENTRODET, NULL, NULL, NULL, :ARTICULO, 0, 0);
                       ELSE
                          INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                             VALUES (:IDC, :NUMITEMS, :CTAINVEN, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                       NUMITEMS = NUMITEMS + 1;
                       NETO = NETO + MONTO;
                       END
                   END
                  if (TIPOCUEN = 'C') then
                   BEGIN
                    IF (CENT = 'B') THEN
                       INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                         VALUES (:IDC, :NUMITEMS, :CTAINVEN, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROYDET, :CENTRODET, :NUMERO, NULL, :VENCE, NULL, 0, 21);
                    ELSE
                       INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                         VALUES (:IDC, :NUMITEMS, :CTAINVEN, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 21);
                    NUMITEMS = NUMITEMS + 1;
                    NETO = NETO + MONTO;
                   END
                  if (TIPOCUEN = 'N') then
                   BEGIN
                    IF (CENT = 'B') THEN
                       INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                          VALUES (:IDC, :NUMITEMS, :CTAINVEN, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROYDET, :CENTRODET, NULL, NULL, NULL, NULL, 0, 0);
                    ELSE
                       INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                          VALUES (:IDC, :NUMITEMS, :CTAINVEN, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NUMITEMS = NUMITEMS + 1;
                    NETO = NETO + MONTO;
                   END
                END
            END
        /* EL IVA */
        if (IVA = 'A') then
            BEGIN
            FOR SELECT MAX(COAR_CTAIVAC), SUM(FCDE_IVAMONTO), SUM(CAST(FCDE_CANT AS DOUBLE PRECISION) * (FCDE_PRUNIT-FCDE_DTOMONTO)), SUM(FCDE_CONSUMO)
                FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_COMPRAS_DETALLE F
                WHERE F.FACO_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND FCDE_IVAMONTO <> 0
                GROUP BY COAR_CTAIVAC
                INTO :CTAIVA, :IMPTOS, :MONTO, :VALORADIC DO
              if (IMPTOS <> 0) then
                BEGIN
                IMPTOS = CAST(IMPTOS AS DOUBLE PRECISION) * VRSUBT / MERCANCIA;
                if (IMPINC = 'S') then
                    BEGIN
                    MONTO = MONTO - IMPTOS;
                    if (FOMENTO <> 'SI' ) then
                        MONTO = MONTO - VALORADIC;
                    END
                MONTO = CAST(MONTO AS DOUBLE PRECISION) * VRSUBT / MERCANCIA;
                execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                EXECUTE PROCEDURE CUENTA_INTERFAZ(21, :IDDOC, :CTAIVA, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    FOR SELECT F.ARTI_COD, FCDE_IVAMONTO, (FCDE_CANT * (FCDE_PRUNIT-FCDE_DTOMONTO)), TAIV_PORC, FCDE_CONSUMO
                        FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_COMPRAS_DETALLE F, TARIFA_IVA T WHERE F.FACO_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTAIVAV = :CUENTA AND A.TAIV_COD = T.TAIV_COD
                        INTO :ARTICULO, :IMPTOS, :MONTO, :PORCIVA, :VALORADIC
                    DO
                        BEGIN
                        IMPTOS = CAST(IMPTOS AS DOUBLE PRECISION) * VRSUBT / MERCANCIA;
                        if (IMPINC = 'S') then
                            BEGIN
                            MONTO = MONTO - IMPTOS;
                            if (FOMENTO <> 'SI' ) then
                                MONTO = MONTO - VALORADIC;
                            END
                        MONTO = CAST(MONTO AS DOUBLE PRECISION) * VRSUBT / MERCANCIA;
                        execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :IMPTOS, 0, :MONTO, :PORCIVA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                        NUMITEMS = NUMITEMS + 1;
                        NETO = NETO + IMPTOS;
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :IMPTOS, 0, :MONTO, :IMPTOS*100/:MONTO, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 21);
                    NUMITEMS = NUMITEMS + 1;
                    NETO = NETO + IMPTOS;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :IMPTOS, 0, :MONTO, CAST(:IMPTOS AS DOUBLE PRECISION)*100/CAST(:MONTO AS DOUBLE PRECISION), :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NUMITEMS = NUMITEMS + 1;
                    NETO = NETO + IMPTOS;
                    END
                END
            END
        if (IVA = 'K') then /* IVA EN CTA CONSTANTE */
            BEGIN
            SELECT SUM(FCDE_IVAMONTO), SUM(CAST(FCDE_CANT AS DOUBLE PRECISION) * (FCDE_PRUNIT-FCDE_DTOMONTO)), SUM(FCDE_CONSUMO)
                FROM FACTURAS_COMPRAS_DETALLE F
                WHERE F.FACO_ID = :IDDOC  AND FCDE_IVAMONTO <> 0
                INTO :IMPTOS, :MONTO, :VALORADIC;
            if (IMPTOS <> 0) then
                BEGIN
                IMPTOS = CAST(IMPTOS AS DOUBLE PRECISION) * VRSUBT / MERCANCIA;
                if (IMPINC = 'S') then
                    BEGIN
                    MONTO = MONTO - IMPTOS;
                    if (FOMENTO <> 'SI' ) then
                        MONTO = MONTO - VALORADIC;
                    END
                MONTO = CAST(MONTO AS DOUBLE PRECISION) * VRSUBT / MERCANCIA;
                execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                EXECUTE PROCEDURE CUENTA_INTERFAZ(21, :IDDOC, :CTAIVA, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    FOR SELECT F.ARTI_COD, (FCDE_CANT * (FCDE_PRUNIT-FCDE_DTOMONTO)), FCDE_IVAMONTO, TAIV_PORC, FCDE_CONSUMO
                        FROM ARTICULO A, FACTURAS_COMPRAS_DETALLE F, TARIFA_IVA T WHERE F.FACO_ID = :IDDOC AND A.TAIV_COD = T.TAIV_COD
                        INTO :ARTICULO, :MONTO, :IMPTOS, :PORCIVA, :VALORADIC DO
                        BEGIN
                        IMPTOS = CAST(IMPTOS AS DOUBLE PRECISION) * VRSUBT / MERCANCIA;
                        if (IMPINC = 'S') then
                            BEGIN
                            MONTO = MONTO - IMPTOS;
                            if (FOMENTO <> 'SI' ) then
                                MONTO = MONTO - VALORADIC;
                            END
                        MONTO = CAST(MONTO AS DOUBLE PRECISION) * VRSUBT / MERCANCIA;
                        execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                        if (IMPTOS <> 0) then
                            BEGIN
                            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                VALUES (:IDC, :NUMITEMS, :CTAIVA, :CONCEPTO, '', :IMPTOS, 0, :MONTO, :PORCIVA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                            NUMITEMS = NUMITEMS + 1;
                            NETO = NETO + IMPTOS;
                            END
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NUMITEMS, :CTAIVA, :CONCEPTO, '', :IMPTOS, 0, :MONTO, :IMPTOS*100/:MONTO, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 21);
                    NUMITEMS = NUMITEMS + 1;
                    NETO = NETO + IMPTOS;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NUMITEMS, :CTAIVA, :CONCEPTO, '', :IMPTOS, 0, :MONTO, :IMPTOS*100/:MONTO, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NUMITEMS = NUMITEMS + 1;
                    NETO = NETO + IMPTOS;
                    END
                END
            END
        /* EL IMPOCONSUMO */
        if (CONSUMO = 'A') then
            BEGIN
            FOR SELECT MAX(COAR_CTACONS), SUM(FCDE_CONSUMO) FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_COMPRAS_DETALLE F
                WHERE F.FACO_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD GROUP BY COAR_CTACONS INTO :CTACONSUMO, :IMPTOS
            DO
              if (IMPTOS <> 0) then
                BEGIN
                execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                EXECUTE PROCEDURE CUENTA_INTERFAZ(21, :IDDOC, :CTACONSUMO, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (FOMENTO <> 'SI') then
                    BEGIN
                    if (TIPOCUEN = 'I') then
                        BEGIN
                        FOR SELECT F.ARTI_COD, FCDE_CONSUMO FROM ARTICULO A, FACTURAS_COMPRAS_DETALLE F WHERE F.FACO_ID = :IDDOC INTO :ARTICULO, :IMPTOS
                            DO
                            BEGIN
                            if (IMPTOS <> 0) then
                                BEGIN
                                execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                    VALUES (:IDC, :NUMITEMS, :CTACONSUMO, :CONCEPTO, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                                NUMITEMS = NUMITEMS + 1;
                                NETO = NETO + IMPTOS;
                                END
                            END
                        END
                    if (TIPOCUEN = 'C') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CTACONSUMO, :CONCEPTO, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                        NUMITEMS = NUMITEMS + 1;
                        NETO = NETO + IMPTOS;
                        END
                    if (TIPOCUEN = 'N') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CTACONSUMO, :CONCEPTO, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NUMITEMS = NUMITEMS + 1;
                        NETO = NETO + IMPTOS;
                        END
                    END
                ELSE
                    BEGIN
                    if (TIPOCUEN = 'I') then
                        BEGIN
                        FOR SELECT F.ARTI_COD, FCDE_CONSUMO FROM ARTICULO A, FACTURAS_COMPRAS_DETALLE F WHERE F.FACO_ID = :IDDOC INTO :ARTICULO, :IMPTOS
                            DO
                            BEGIN
                            if (IMPTOS <> 0) then
                                BEGIN
                                execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                    VALUES (:IDC, :NUMITEMS, :CTACONSUMO, :CONCEPTO, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                                NUMITEMS = NUMITEMS + 1;
                                NETO = NETO - IMPTOS;
                                END
                            END
                        END
                    if (TIPOCUEN = 'C') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CTACONSUMO, :CONCEPTO, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                        NUMITEMS = NUMITEMS + 1;
                        NETO = NETO - IMPTOS;
                        END
                    if (TIPOCUEN = 'N') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CTACONSUMO, :CONCEPTO, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NUMITEMS = NUMITEMS + 1;
                        NETO = NETO - IMPTOS;
                        END
                    END
                END
            END
        if (CONSUMO = 'K') then /* CONSUMO EN CTA CONSTANTE */
            BEGIN
            SELECT SUM(FCDE_CONSUMO) FROM FACTURAS_COMPRAS_DETALLE F WHERE F.FACO_ID = :IDDOC INTO :IMPTOS;
            if (IMPTOS <> 0) then
              BEGIN
              execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
              /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
              EXECUTE PROCEDURE CUENTA_INTERFAZ(21, :IDDOC, :CTACONSUMO, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
              if (ERRORC <> 0) then
                ERROR = ERROR + 1;
              if (FOMENTO <> 'SI') then
                BEGIN
                /* DEPENDE DEL TIPO DE CUENTA */
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT F.ARTI_COD, FCDE_CONSUMO FROM ARTICULO A, FACTURAS_COMPRAS_DETALLE F WHERE F.FACO_ID = :IDDOC INTO :ARTICULO, :IMPTOS
                        DO
                        BEGIN
                        if (IMPTOS <> 0) then
                            BEGIN
                            execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                VALUES (:IDC, :NUMITEMS, :CTACONSUMO, :CONCEPTO, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                            NUMITEMS = NUMITEMS + 1;
                            NETO = NETO + IMPTOS;
                            END
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    /* INSERTE EL REGISTRO DE LA BASE */
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NUMITEMS, :CTACONSUMO, :CONCEPTO, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    NUMITEMS = NUMITEMS + 1;
                    NETO = NETO + IMPTOS;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NUMITEMS, :CTACONSUMO, :CONCEPTO, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NUMITEMS = NUMITEMS + 1;
                    NETO = NETO + IMPTOS;
                    END
                END
              ELSE
                BEGIN
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT F.ARTI_COD, FCDE_CONSUMO FROM ARTICULO A, FACTURAS_COMPRAS_DETALLE F WHERE F.FACO_ID = :IDDOC INTO :ARTICULO, :IMPTOS
                        DO
                        BEGIN
                        if (IMPTOS <> 0) then
                            BEGIN
                           execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                           INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                VALUES (:IDC, :NUMITEMS, :CTACONSUMO, :CONCEPTO, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                            NUMITEMS = NUMITEMS + 1;
                            NETO = NETO - IMPTOS;
                            END
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    /* INSERTE EL REGISTRO DE LA BASE */
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NUMITEMS, :CTACONSUMO, :CONCEPTO, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    NUMITEMS = NUMITEMS + 1;
                    NETO = NETO - IMPTOS;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NUMITEMS, :CTACONSUMO, :CONCEPTO, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NUMITEMS = NUMITEMS + 1;
                    NETO = NETO - IMPTOS;
                    END
                END
              end
            END
        /* DESCUENTO */
        if ((CTADTO IS NOT NULL) AND
            (CTADTO <> '')) THEN
          BEGIN
          execute procedure redondee(VRDTO, DIG) returning_values (VRDTO);
          if (VRDTO <> 0) then
            begin
            /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
            EXECUTE PROCEDURE CUENTA_INTERFAZ(21, :IDDOC, :CTADTO, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :VRDTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 21);
                NUMITEMS = NUMITEMS + 1;
                NETO = NETO - VRDTO;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                /* INSERTE EL REGISTRO DE LA BASE */
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :VRDTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NUMITEMS = NUMITEMS + 1;
                NETO = NETO - VRDTO;
                END
            end
          END
        /* VALOR ADIC */
        if ((CTAADIC IS NOT NULL) AND
            (CTAADIC <> '')) THEN
          BEGIN
          execute procedure redondee(VRADIC, DIG) returning_values (VRADIC);
          if (VRADIC <> 0) then
            begin
            /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
            EXECUTE PROCEDURE CUENTA_INTERFAZ(21, :IDDOC, :CTAADIC, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :VRADIC, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 21);
                NUMITEMS = NUMITEMS + 1;
                NETO = NETO + VRADIC;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :VRADIC, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NUMITEMS = NUMITEMS + 1;
                NETO = NETO + VRADIC;
                END
            end
          END
        /* VALOR EXTRA */
        if ((CTAEXTRA IS NOT NULL) AND
            (CTAEXTRA <> '')) THEN
          BEGIN
          execute procedure redondee(VREXTRA, DIG) returning_values (VREXTRA);
          if (VREXTRA <> 0) then
            begin
            /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
            EXECUTE PROCEDURE CUENTA_INTERFAZ(21, :IDDOC, :CTAEXTRA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :VREXTRA, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 21);
                NUMITEMS = NUMITEMS + 1;
                NETO = NETO + VREXTRA;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :VREXTRA, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NUMITEMS = NUMITEMS + 1;
                NETO = NETO + VREXTRA;
                END
            end
          END

        /* DESCUENTE EL IMPOCONSUMO */
        SELECT SUM(FCDE_CONSUMO) FROM FACTURAS_COMPRAS_DETALLE F WHERE F.FACO_ID = :IDDOC INTO :IMPTOS;
        if (IMPTOS IS NULL) then
            IMPTOS = 0;
        vrsubt = vrsubt - IMPTOS;
        /* RETENCION FUENTE */
        if ((RTFTE = 'P') or (RTFTE = 'K')) then
          BEGIN
          execute procedure redondee(VRRTFTE, DIG) returning_values (VRRTFTE);
          if (VRRTFTE <> 0) then
            begin
            if (RTFTE = 'P') then
                CTARTFTE = TCTARTFTE;
            EXECUTE PROCEDURE CUENTA_INTERFAZ(21, :IDDOC, :CTARTFTE, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :VRRTFTE, (:VRSUBT*-1), :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NUMITEMS = NUMITEMS + 1;
                NETO = NETO - VRRTFTE;
                SUMA = VRRTFTE;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :VRRTFTE, (:VRSUBT*-1), :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NUMITEMS = NUMITEMS + 1;
                NETO = NETO - VRRTFTE;
                SUMA = VRRTFTE;
                END
            end
          END
        if (RTFTE = 'A') then
          BEGIN
          FOR SELECT MAX(COAR_CTARTFTE), MAX(COAR_RTFTE), MIN(COAR_RTBASE), SUM(FCDE_TOTAL-FCDE_IVAMONTO-FCDE_CONSUMO), SUM((FCDE_TOTAL-FCDE_IVAMONTO-FCDE_CONSUMO)*COAR_RTFTE)
            FROM CONTABIL_ARTICULO C, FACTURAS_COMPRAS_DETALLE F
            WHERE F.faco_id = :IDDOC AND F.ARTI_COD = C.ARTI_COD
            GROUP BY COAR_CTARTFTE
            INTO :CTARTFTE, :PRTFTE, :baseadic,  :MONTO, :VRRTFTE
            DO
            BEGIN
            MONTO = MONTO * FACTOR * -1;
            if (ABS(MONTO) >= :baseadic) then
                BEGIN
                VRRTFTE = VRRTFTE * FACTOR / 100;
                execute procedure redondee(VRRTFTE, DIG) returning_values (VRRTFTE);
                execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                if (VRRTFTE <> 0) then
                    BEGIN
                    EXECUTE PROCEDURE CUENTA_INTERFAZ(21, :IDDOC, :CTARTFTE, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
                    if (ERRORC <> 0) then
                        ERROR = ERROR + 1;
                    if (TIPOCUEN = 'C') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :VRRTFTE, :MONTO, :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                        NUMITEMS = NUMITEMS + 1;
                        NETO = NETO - VRRTFTE;
                        SUMA = VRRTFTE;
                        END
                    if (TIPOCUEN = 'N') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :VRRTFTE, :MONTO, :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NUMITEMS = NUMITEMS + 1;
                        NETO = NETO - VRRTFTE;
                        SUMA = VRRTFTE;
                        END
                    end
                end
              END
          END
        /* RETENCION IVA */
        if ((RTIVA = 'P') or (RTIVA = 'K')) then
          BEGIN
          execute procedure redondee(VRRTIVA, DIG) returning_values (VRRTIVA);
          if (VRRTIVA <> 0) then
            begin
            if (RTIVA = 'P') then
                CTARTIVA = TCTARTIVA;
            EXECUTE PROCEDURE CUENTA_INTERFAZ(21, :IDDOC, :CTARTIVA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :VRRTIVA, (:VRIVA*-1), :PORC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 21);
                NUMITEMS = NUMITEMS + 1;
                NETO = NETO - VRRTIVA;
                SUMA = SUMA + VRRTIVA;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :VRRTIVA, (:VRIVA*-1), :PORC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NUMITEMS = NUMITEMS + 1;
                NETO = NETO - VRRTIVA;
                SUMA = SUMA + VRRTIVA;
                END
            end
          END
        /* RETENCION DE ICA */
        if ((RTICA = 'P') or (RTICA = 'K')) then
          BEGIN
          execute procedure redondee(VRRTICA, DIG) returning_values (VRRTICA);
          if (VRRTICA <> 0) then
            begin
            if (RTICA = 'P') then
                CTARTICA = TCTARTICA;
            EXECUTE PROCEDURE CUENTA_INTERFAZ(21, :IDDOC, :CTARTICA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :VRRTICA, (:VRSUBT*-1), :PRTICA, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 21);
                NUMITEMS = NUMITEMS + 1;
                NETO = NETO - VRRTICA;
                SUMA = SUMA + VRRTICA;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :VRRTICA, (:VRSUBT*-1), :PRTICA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NUMITEMS = NUMITEMS + 1;
                NETO = NETO - VRRTICA;
                SUMA = SUMA + VRRTICA;
                END
            end
          END
        /* CIERRE EL COMPROBANTE CONTRA LA CUENTA DEL TERCERO O LA CONSTANTE */
        if ((CXP = 'P') or (CXP = 'K')) then
            BEGIN
            SUMA = VRTOTAL - SUMA;
            execute procedure redondee(SUMA, DIG) returning_values (SUMA);
            if (CXP = 'P') then
                CTACXP = TCTAPROV;
            EXECUTE PROCEDURE CUENTA_INTERFAZ(21, :IDDOC, :CTACXP, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :SUMA, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 21);
            if (TIPOCUEN = 'N') then
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :SUMA, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NETO = NETO - SUMA;
            NUMITEMS = NUMITEMS + 1;
            END
        /* recorra las cuentas adicionales */
        FOR SELECT INCC_CUENTA, INCC_BASE, INCC_PORC, INCC_VALOR, INCC_DB FROM INTERFAZ_COMPRAS_CTAS
            WHERE INCO_ID = :IDINTER INTO :CUENTAADIC, :BASEADIC, :PORCADIC, :VALORADIC, :DBADIC
            DO
            BEGIN
            if (VALORADIC <> 0) then
                MONTO = VALORADIC;
            ELSE
                BEGIN
                if (:BASEADIC = 'SUBTOTAL') then
                    VALORADIC = VRTOTAL - VREXTRA - VRIVA - VRADIC + VRDTO;
                if (:BASEADIC = 'DESCUENTO') then
                    VALORADIC = VRDTO;
                if (:BASEADIC = 'IVA') then
                    VALORADIC = VRIVA;
                if (:BASEADIC = 'CONSUMO') then
                    SELECT SUM(FCDE_CONSUMO) FROM FACTURAS_COMPRAS_DETALLE F WHERE F.FACO_ID = :IDDOC INTO :VALORADIC;
                if (:BASEADIC = 'ADICIONAL') then
                    VALORADIC = VRADIC;
                if (:BASEADIC = 'EXTRA') then
                    VALORADIC = VREXTRA;
                if (:BASEADIC = 'TOTAL') then
                    VALORADIC = VRTOTAL;
                MONTO = CAST(VALORADIC AS DOUBLE PRECISION) * PORCADIC / 100;
                END
            if (MONTO <> 0) then
                BEGIN
                execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                EXECUTE PROCEDURE CUENTA_INTERFAZ(21, :IDDOC, :CUENTAADIC, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'C') then
                    BEGIN
                    if (DBADIC = 'S') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTAADIC, :CONCEPTO, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                        SUMA = SUMA + MONTO;
                        NETO = NETO + MONTO;
                        END
                    ELSE
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTAADIC, :CONCEPTO, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                        SUMA = SUMA - MONTO;
                        NETO = NETO - MONTO;
                        END
                    NUMITEMS = NUMITEMS + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    if (DBADIC = 'S') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTAADIC, :CONCEPTO, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        SUMA = SUMA + MONTO;
                        NETO = NETO + MONTO;
                        END
                    ELSE
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTAADIC, :CONCEPTO, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        SUMA = SUMA - MONTO;
                        NETO = NETO - MONTO;
                        END
                    NUMITEMS = NUMITEMS + 1;
                    END
                END
            END
        if (NETO <> 0) then
            BEGIN
            EXECUTE PROCEDURE lee_configuracion ('CONTABILIDAD','GENERAL','CUENTA PARA CUADRAR COMPROBANTES DESCUADRADOS DE INTERFAZ') returning_values (:ctaadic);
            if (ctaadic <> '') then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(21, :IDDOC, :CTAADIC, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'C') then
                    BEGIN
                    if (NETO < 0) then
                        BEGIN
                        NETO = NETO * -1;
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :NETO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                        END
                    ELSE
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :NETO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                        END
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    if (NETO < 0) then
                        BEGIN
                        NETO = NETO * -1;
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :NETO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        END
                    ELSE
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :NETO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        END
                    END
                END
            END
        END
    if (ERROR > 0) then
        VER = 'S';
    SUSPEND;
    END
ELSE
    BEGIN
    EXECUTE PROCEDURE ERROR (21, :IDDOC, :PREFIJO, 1);
    ERROR = ERROR + 1;
    VER = 'S';
    SUSPEND;
    END
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE CONTABILICE_COMP_SIMPLIFICADO(
    IDI INTEGER)
RETURNS (
    ID INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    ESTADO VARCHAR(20),
    IDC INTEGER)
AS
DECLARE VARIABLE VER CHAR(2);
declare variable ERROR INTEGER;
BEGIN
FOR SELECT FACO_ID, PREF_PRE, FACO_NUMERO FROM FACTURAS_COMPRA C, PROVEEDORES P WHERE
    C.TERC_NIT = P.TERC_NIT AND PROV_SIMPLIFICADO = 'S' AND FACO_ANULADO = 'N'
    ORDER BY FACO_ID INTO :ID, :PREF, :NUMERO
DO
  BEGIN
  ESTADO = 'PROCESANDO';
  SUSPEND;
  /* BORRE LA CONTABILIZACION */
/*  delete FROM comprobante_detalle WHERE ENCO_CONSEC IN (SELECT ENCO_CONSEC FROM COMPROBANTE_ENCABEZADO WHERE ENCO_TIPOREF = 21 AND ENCO_IDREF = :ID);
  DELETE FROM comprobante_encabezado  WHERE ENCO_TIPOREF = 21 AND ENCO_IDREF = :ID; */
  EXECUTE PROCEDURE CONTABIL_FACTCOMP (:ID, :IDI) RETURNING_VALUES (:ERROR, VER, :IDC);
  if (ERROR = 0) then
    BEGIN
/*    EXECUTE PROCEDURE CONTABILIZA_PENDIENTE (:IDC); */
    ESTADO = 'OK';
    END
  ELSE
    ESTADO = 'ERROR';
  suspend;
  END
END

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE FACTCOMP_SIN_CONTABILIDAD(
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    ID INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    ESTADO VARCHAR(20),
    IDI INTEGER,
    IDC INTEGER)
AS
DECLARE VARIABLE VER CHAR(2);
declare variable FECICNT VARCHAR(10);
declare variable FECFCNT VARCHAR(10);
declare variable ERROR INTEGER;
declare variable idref INTEGER;
BEGIN
EXECUTE PROCEDURE fecha_a_conta(FECINI) returning_values (FECICNT);
EXECUTE PROCEDURE fecha_a_conta(FECFIN) returning_values (FECFCNT);
FOR SELECT FACO_ID, PREF_PRE, FACO_NUMERO FROM FACTURAS_COMPRA WHERE FACO_ANULADO = 'N' AND
    FACO_FECHA >= :FECINI AND FACO_FECHA <= :FECFIN ORDER BY FACO_ID
    INTO :ID, :PREF, :NUMERO
DO
  BEGIN
  idref = null;
  SELECT ENCO_IDREF FROM COMPROBANTE_ENCABEZADO WHERE ENCO_TIPOREF = 21 AND ENCO_FECHA >= :FECICNT AND ENCO_FECHA <= :FECFCNT and ENCO_IDREF = :id into :idref;
  if (idref IS NULL) then
  begin
   ESTADO = 'PROCESANDO';
   SUSPEND;
   SELECT MAX(INCO_ID) FROM INTERFAZ_COMPRAS WHERE PREF_PRE = :PREF AND TIDO_COD = 21 INTO :IDI;
   EXECUTE PROCEDURE CONTABIL_FACTCOMP (:ID, :IDI) RETURNING_VALUES (:ERROR, VER, :IDC);
   if (ERROR = 0) then
    BEGIN
    EXECUTE PROCEDURE CONTABILIZA_PENDIENTE (:IDC);
    ESTADO = 'OK';
    END
   ELSE
    ESTADO = 'ERROR';
   suspend;
  End
  END
END

^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure CONTABIL_DEVOLCOMP (
    IDDOC integer,
    IDINTER integer)
returns (
    ERROR integer,
    VER char(1),
    IDC integer)
AS
declare variable PREFIJO VARCHAR(4);
declare variable NUM VARCHAR(6);
declare variable NUMERO VARCHAR(10);
declare variable FECAUX DATE;
declare variable FECHA CHAR(8);
declare variable CONCEPTO CHAR(100);
declare variable NUMFAC VARCHAR(10);
declare variable VRDTO NUMERIC(18, 2);
declare variable VRADIC NUMERIC(18, 2);
declare variable VRSUBT NUMERIC(18, 2);
declare variable VRIVA NUMERIC(18, 2);
declare variable PRTFTE NUMERIC(9, 2);
declare variable VRRTFTE NUMERIC(18, 2);
declare variable VRRTIVA NUMERIC(18, 2);
declare variable PRTICA NUMERIC(9, 2);
declare variable VRRTICA NUMERIC(18, 2);
declare variable VRTOTAL NUMERIC(18, 2);
declare variable VREXTRA NUMERIC(18, 2);
declare variable TIPOCOMP VARCHAR(3);
declare variable PREFCONT VARCHAR(4);
declare variable INVEN CHAR(1);
declare variable CTAINVEN VARCHAR(20);
declare variable IVA CHAR(1);
declare variable CTAIVA VARCHAR(20);
declare variable CONSUMO CHAR(1);
declare variable CTACONSUMO VARCHAR(20);
declare variable CXP CHAR(1);
declare variable CTACXP VARCHAR(20);
declare variable RTFTE CHAR(1);
declare variable CTARTFTE VARCHAR(20);
declare variable RTIVA CHAR(1);
declare variable CTARTIVA VARCHAR(20);
declare variable RTICA CHAR(1);
declare variable CTARTICA VARCHAR(20);
declare variable CTADTO VARCHAR(20);
declare variable CTAADIC VARCHAR(20);
declare variable CTAEXTRA VARCHAR(20);
declare variable EXISTE CHAR(1);
declare variable CUENTA VARCHAR(20);
declare variable MONTO NUMERIC(18,2);
declare variable TIPOCUEN CHAR(1);
declare variable NIT VARCHAR(20);
declare variable PROY VARCHAR(4);
declare variable CENTRO VARCHAR(4);
declare variable PORC NUMERIC(5,2);
declare variable DEBITO NUMERIC(18,2);
declare variable CREDITO NUMERIC(18,2);
declare variable NUMITEMS INTEGER;
declare variable ARTICULO VARCHAR(15);
declare variable IMPINC CHAR(1);
declare variable IMPTOS NUMERIC(18, 2);
declare variable SUMA NUMERIC(18,2);
declare variable PORCIVA NUMERIC(9,2);
declare variable TCTAPROV VARCHAR(20);
declare variable TCTARTFTE VARCHAR(20);
declare variable TCTARTIVA VARCHAR(20);
declare variable TCTARTICA VARCHAR(20);
declare variable CUENTAADIC VARCHAR(20);
declare variable BASEADIC VARCHAR(20);
declare variable PORCADIC NUMERIC(5,2);
declare variable VALORADIC NUMERIC(18,2);
declare variable DBADIC CHAR(1);
declare variable FOMENTO CHAR(2);
declare variable ANULADO CHAR(1);
declare variable CENT CHAR(1);
declare variable ERRORC INTEGER;
DECLARE VARIABLE MENORV CHAR(2);
DECLARE VARIABLE MERCANCIA NUMERIC(18,2);
declare variable FACTOR DOUBLE PRECISION;
declare variable DIG INTEGER;
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_CTAINVEN, INCO_CTAIVA, INCO_CTACONSUMO, INCO_CTADTO, INCO_CTAADIC, INCO_CTAEXTRA, INCO_CTACXP, INCO_CTARTFTE, INCO_CTARTIVA, INCO_CTARTICA, INCO_CONFIRMAR, INCO_CENTRO
    FROM INTERFAZ_COMPRAS
    WHERE INCO_ID = :IDINTER
    INTO :EXISTE, :TIPOCOMP, :PREFCONT, :INVEN, :IVA, :CONSUMO, :CXP, :RTFTE, :RTIVA, :RTICA, :CTAINVEN, :CTAIVA, :CTACONSUMO, :CTADTO, :CTAADIC, :CTAEXTRA, :CTACXP, :CTARTFTE, :CTARTIVA, :CTARTICA, :VER, :CENT;
if (EXISTE = 'S') then
   BEGIN
    /* BORRE 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, PROV_CTARTFTE, PROV_CTARTIVA, PROV_CTARTICA, PROV_CTAPAGAR, DVCO_ANULADO
        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, :TCTARTFTE, TCTARTIVA, TCTARTICA, TCTAPROV, ANULADO;
   if (ANULADO = 'N') then
    BEGIN
    NUMERO = PREFIJO || NUM;
    VRSUBT = VRTOTAL - VREXTRA - VRIVA; /* BASE DE RETEFTE Y RETEICA */
    IF (CENT = 'B') THEN
        SELECT BODE_CENTRO, BODE_PROY FROM BODEGA B, DEVOLUCIONES_COMPRAS F
            WHERE B.BODE_COD = F.BODE_COD AND F.DVCO_ID = :IDDOC INTO :CENTRO, :PROY;
    ELSE
        SELECT PREF_CENTRO,PREF_PROY FROM PREFIJOS P, DEVOLUCIONES_COMPRAS F
            WHERE P.PREF_PRE = F.PREF_PRE AND F.DVCO_ID = :IDDOC AND P.TIDO_COD = 24 INTO :CENTRO, :PROY;
    /* CONVIERTA LA FECHA A CADENA */
    EXECUTE PROCEDURE FECHA_A_CONTA(:FECAUX) returning_values (:FECHA);
    EXECUTE PROCEDURE LEE_CONFIGURACION('COMPRAS', 'FACTURAS', 'USAR IMPOCONSUMO COMO PORCENTAJE DE FOMENTO') RETURNING_VALUES (FOMENTO);
    EXECUTE PROCEDURE lee_configuracion('COMPRAS','FACTURAS','DESCUENTO Y VALOR ADICIONAL DEL DOCUMENTO COMO MENOR VALOR DEL COSTO') returning_values (:MENORV);
    SELECT CAST(CONF_VALOR AS INTEGER) FROM CONFIGURACION WHERE CONF_MODULO = 'COMPRAS' AND CONF_CATEGORIA = 'GENERAL' AND CONF_PROPIEDAD = 'REDONDEO AL MULTIPLO DE DIEZ EN TOTALES' INTO :DIG;
    VRSUBT = VRTOTAL - VREXTRA - VRIVA;
    MERCANCIA = VRSUBT - VRADIC + VRDTO;
    SELECT SUM(DVCD_consumo) from devoluciones_compras_det where dvco_id = :IDDOC into :valoradic;
    if (MENORV = 'SI') then
        if (MERCANCIA <> 0) then
            FACTOR = (CAST(VRSUBT AS DOUBLE PRECISION) - VALORADIC) / (CAST(MERCANCIA AS DOUBLE PRECISION) - VALORADIC);
        ELSE
            FACTOR = 1;
    ELSE
        FACTOR = 1;

    /* REGISTRE EL ENCABEZADO CONTABLE */
    CONCEPTO = 'DEVOLUCION COMPRA No. ' || NUMERO || ' EN FACTURA ' || NUMFAC;
    IDC = GEN_ID(ID_CONTABILIZA, 1);
    INSERT INTO CONTABILIZACION (CNTB_ID, CNTB_TIPOCOMP, CNTB_PREFCNT, CNTB_NUMERO, CNTB_FECHA, CNTB_CONCEPTO, CNTB_REF, CNTB_TIPOREF, CNTB_IDREF, CNTB_PREFREF, CNTB_NUMREF, CNTB_PROCESADO)
        VALUES (:IDC, :TIPOCOMP, :PREFCONT, :NUM, :FECHA, :CONCEPTO, '', 24, :IDDOC, :PREFIJO, :NUM, 'N');

    NUMITEMS = 0;
    SUMA = 0;
    ERROR = 0;
    /* CUENTAS DE INVENTARIO */
    if (INVEN = 'A') then
        BEGIN
        /* SUME LAS BASES DE LOS ARTICULOS DEL DOCUMENTO */
        FOR SELECT MAX(COAR_CTACOMP), SUM(cast(DVCD_CANT as double precision) * (DVCD_PRUNIT-DVCD_DTOMONTO)), SUM(DVCD_IVAMONTO), SUM(DVCD_CONSUMO)
            FROM ARTICULO A, CONTABIL_ARTICULO C, DEVOLUCIONES_COMPRAS_DET F
            WHERE F.DVCO_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD
            GROUP BY COAR_CTAINV
            INTO :CTAINVEN, :MONTO, :IMPTOS, :VALORADIC
            DO
            BEGIN
            if (IMPINC = 'S') then
                BEGIN
                MONTO = MONTO - IMPTOS;
                if (FOMENTO <> 'SI') then
                    MONTO = MONTO - VALORADIC;
                END
            /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
            EXECUTE PROCEDURE CUENTA_INTERFAZ(24, :IDDOC, :CTAINVEN, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            /* DEPENDE DEL TIPO DE CUENTA */
            if ((TIPOCUEN = 'I') or (TIPOCUEN = 'A')) then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, REGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT F.ARTI_COD, (cast(DVCD_CANT as double precision) * (DVCD_PRUNIT-DVCD_DTOMONTO)), DVCD_IVAMONTO, DVCD_CONSUMO
                    FROM ARTICULO A, CONTABIL_ARTICULO C, DEVOLUCIONES_COMPRAS_DET F
                    WHERE F.DVCO_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTAINV = :CUENTA
                    INTO :ARTICULO, :MONTO, :IMPTOS, :VALORADIC
                DO
                    BEGIN
                    if (IMPINC = 'S') then
                        BEGIN
                        MONTO = MONTO - IMPTOS;
                        if (FOMENTO <> 'SI') then
                            MONTO = MONTO - VALORADIC;
                        END
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                    NUMITEMS = NUMITEMS + 1;
                    SUMA = SUMA - MONTO;
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                /* INSERTE EL REGISTRO DE LA BASE */
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 24);
                NUMITEMS = NUMITEMS + 1;
                SUMA = SUMA - MONTO;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                /* INSERTE EL REGISTRO DE LA BASE */
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NUMITEMS = NUMITEMS + 1;
                SUMA = SUMA - MONTO;
                END
            END /* FOR */
        END /* INVENTARIO X ARTICULO */

    if (INVEN = 'K') then
        BEGIN
        /* SUME LAS BASES DE LOS ARTICULOS DEL DOCUMENTO */
        SELECT SUM(cast(DVCD_CANT as double precision) * (DVCD_PRUNIT-DVCD_DTOMONTO)), SUM(DVCD_IVAMONTO), SUM(DVCD_CONSUMO)
            FROM DEVOLUCIONES_COMPRAS_DET WHERE DVCO_ID = :IDDOC
            INTO :MONTO, :IMPTOS, :VALORADIC;
        if (IMPINC = 'S') then
            BEGIN
            MONTO = MONTO - IMPTOS;
            if (FOMENTO <> 'SI') then
                MONTO = MONTO - VALORADIC;
            END
        /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
        EXECUTE PROCEDURE CUENTA_INTERFAZ(24, :IDDOC, :CTAINVEN, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        /* DEPENDE DEL TIPO DE CUENTA */
        if ((TIPOCUEN = 'I') or (TIPOCUEN = 'A'))  then
            BEGIN
            /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
            FOR SELECT ARTI_COD, (cast(DVCD_CANT as double precision) * (DVCD_PRUNIT-DVCD_DTOMONTO)), DVCD_IVAMONTO, DVCD_CONSUMO
                FROM DEVOLUCIONES_COMPRAS_DET
                WHERE DVCO_ID = :IDDOC
                INTO :ARTICULO, :MONTO, :IMPTOS, :VALORADIC
                DO
                BEGIN
                if (IMPINC = 'S') then
                    BEGIN
                    MONTO = MONTO - IMPTOS;
                    if (FOMENTO <> 'SI') then
                        MONTO = MONTO - VALORADIC;
                    END
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NUMITEMS, :CTAINVEN, :CONCEPTO, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                NUMITEMS = NUMITEMS + 1;
                SUMA = SUMA - MONTO;
                END
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NUMITEMS, :CTAINVEN, :CONCEPTO, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 24);
            NUMITEMS = NUMITEMS + 1;
            SUMA = SUMA - MONTO;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NUMITEMS, :CTAINVEN, :CONCEPTO, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NUMITEMS = NUMITEMS + 1;
            SUMA = SUMA - MONTO;
            END
        END /* INVEN = K */
        
    /* EL IVA */
    if (IVA = 'A') then
        BEGIN
        /* SUME LAS BASES DE LOS ARTICULOS DEL DOCUMENTO */
        FOR SELECT MAX(COAR_CTAIVAC), SUM(DVCD_IVAMONTO), SUM(cast(DVCD_CANT as double precision) * (DVCD_PRUNIT-DVCD_DTOMONTO)), SUM(DVCD_CONSUMO)
            FROM ARTICULO A, CONTABIL_ARTICULO C, DEVOLUCIONES_COMPRAS_DET F
            WHERE F.DVCO_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND DVCD_IVAMONTO <> 0
            GROUP BY COAR_CTAIVAC
            INTO :CTAIVA, :IMPTOS, :MONTO, :VALORADIC
        DO
          if (IMPTOS <> 0) then
            BEGIN
            IMPTOS = CAST(IMPTOS AS DOUBLE PRECISION) * VRSUBT / MERCANCIA;
            if (IMPINC = 'S') then
                BEGIN
                MONTO = MONTO - IMPTOS;
                if (FOMENTO <> 'SI') then
                    MONTO = MONTO - VALORADIC;
                END

            /* TRAIGA LAS CARCATERISTICAS DE LA CUENTA */
            EXECUTE PROCEDURE CUENTA_INTERFAZ(24, :IDDOC, :CTAIVA, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            /* DEPENDE DEL TIPO DE CUENTA */
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT F.ARTI_COD, DVCD_IVAMONTO, (cast(DVCD_CANT as double precision) * (DVCD_PRUNIT-DVCD_DTOMONTO)), TAIV_PORC, DVCD_CONSUMO
                    FROM ARTICULO A, CONTABIL_ARTICULO C, DEVOLUCIONES_COMPRAS_DET F, TARIFA_IVA T
                    WHERE F.DVCO_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTAIVAV = :CUENTA AND A.TAIV_COD = T.TAIV_COD
                    INTO :ARTICULO, :IMPTOS, :MONTO, :PORCIVA, :VALORADIC
                DO
                    BEGIN
                    if (IMPINC = 'S') then
                        BEGIN
                        MONTO = MONTO - IMPTOS;
                        if (FOMENTO <> 'SI') then
                            MONTO = MONTO - VALORADIC;
                        END
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :IMPTOS, :MONTO, :PORCIVA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                    NUMITEMS = NUMITEMS + 1;
                    SUMA = SUMA - IMPTOS;
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :IMPTOS, :MONTO, :PORCIVA, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 24);
                NUMITEMS = NUMITEMS + 1;
                SUMA = SUMA - IMPTOS;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :IMPTOS, :MONTO, :PORCIVA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NUMITEMS = NUMITEMS + 1;
                SUMA = SUMA - IMPTOS;
                END
            END /* FOR */
        END /* IVA X ARTICULO */
        
    if (IVA = 'K') then /* IVA EN CTA CONSTANTE */
        BEGIN
        SELECT SUM(DVCD_IVAMONTO), SUM(cast(DVCD_CANT as double precision) * (DVCD_PRUNIT-DVCD_DTOMONTO)), SUM(DVCD_CONSUMO)
            FROM DEVOLUCIONES_COMPRAS_DET F
            WHERE F.DVCO_ID = :IDDOC  AND DVCD_IVAMONTO <> 0
            INTO :IMPTOS, :MONTO, :VALORADIC;
            
        if (IMPTOS <> 0) then
            BEGIN
            IMPTOS = CAST(IMPTOS AS DOUBLE PRECISION) * VRSUBT / MERCANCIA;
            if (IMPINC = 'S') then
                BEGIN
                MONTO = MONTO - IMPTOS;
                if (FOMENTO <> 'SI') then
                    MONTO = MONTO - VALORADIC;
                END
            /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
            EXECUTE PROCEDURE CUENTA_INTERFAZ(24, :IDDOC, :CTAIVA, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            /* DEPENDE DEL TIPO DE CUENTA */
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT F.ARTI_COD, (cast(DVCD_CANT as double precision) * (DVCD_PRUNIT-DVCD_DTOMONTO)), DVCD_IVAMONTO, TAIV_PORC, DVCD_CONSUMO
                    FROM ARTICULO A, DEVOLUCIONES_COMPRAS_DET F, TARIFA_IVA T
                    WHERE F.DVCO_ID = :IDDOC AND A.TAIV_COD = T.TAIV_COD
                    INTO :ARTICULO, :MONTO, :IMPTOS, :PORCIVA, :VALORADIC
                    DO
                    BEGIN
                    if (IMPTOS <> 0) then
                        BEGIN
                        if (IMPINC = 'S') then
                            BEGIN
                            MONTO = MONTO - IMPTOS;
                            if (FOMENTO <> 'SI') then
                                MONTO = MONTO - VALORADIC;
                            END
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CTAIVA, :CONCEPTO, '', 0, :IMPTOS, :MONTO, :PORCIVA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                        NUMITEMS = NUMITEMS + 1;
                        SUMA = SUMA - IMPTOS;
                        END
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                /* INSERTE EL REGISTRO DE LA BASE */
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NUMITEMS, :CTAIVA, :CONCEPTO, '', 0, :IMPTOS, :MONTO, :PORCIVA, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 24);
                NUMITEMS = NUMITEMS + 1;
                SUMA = SUMA - IMPTOS;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                /* INSERTE EL REGISTRO DE LA BASE */
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NUMITEMS, :CTAIVA, :CONCEPTO, '', 0, :IMPTOS, :MONTO, :PORCIVA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NUMITEMS = NUMITEMS + 1;
                SUMA = SUMA - IMPTOS;
                END
            END /* <> 0 */
        END /* IVA EN CTA CONSTANTE */
        
    /* EL IMPOCONSUMO */
    if (CONSUMO = 'A') then
        BEGIN
        /* SUME LAS BASES DE LOS ARTICULOS DEL DOCUMENTO */
        FOR SELECT MAX(COAR_CTACONS), SUM(DVCD_CONSUMO)
            FROM ARTICULO A, CONTABIL_ARTICULO C, DEVOLUCIONES_COMPRAS_DET F
            WHERE F.DVCO_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD
            GROUP BY COAR_CTACONS
            INTO :CTACONSUMO, :IMPTOS
        DO
            BEGIN
            if (IMPTOS <> 0) then
                BEGIN
                /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
                EXECUTE PROCEDURE CUENTA_INTERFAZ(24, :IDDOC, :CTACONSUMO, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (FOMENTO <> 'SI') then
                    BEGIN
                    /* DEPENDE DEL TIPO DE CUENTA */
                    if (TIPOCUEN = 'I') then
                        BEGIN
                        /* ES UNA CUENTA DE INVENTARIO, REGISTRE UNO A UNO LOS ARTICULOS */
                        FOR SELECT F.ARTI_COD, DVCD_CONSUMO
                            FROM ARTICULO A, CONTABIL_ARTICULO C, DEVOLUCIONES_COMPRAS_DET F
                            WHERE F.DVCO_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTACONS = :CUENTA
                            INTO :ARTICULO, :IMPTOS
                            DO
                            BEGIN
                            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                            NUMITEMS = NUMITEMS + 1;
                            SUMA = SUMA - IMPTOS;
                            END
                        END
                    if (TIPOCUEN = 'C') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 24);
                        NUMITEMS = NUMITEMS + 1;
                        SUMA = SUMA - IMPTOS;
                        END
                    if (TIPOCUEN = 'N') then
                        BEGIN
                        /* INSERTE EL REGISTRO DE LA BASE */
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NUMITEMS = NUMITEMS + 1;
                        SUMA = SUMA - IMPTOS;
                        END
                    END
                ELSE
                    BEGIN
                    if (TIPOCUEN = 'I') then
                        BEGIN
                        /* ES UNA CUENTA DE INVENTARIO, REGISTRE UNO A UNO LOS ARTICULOS */
                        FOR SELECT F.ARTI_COD, DVCD_CONSUMO
                            FROM ARTICULO A, CONTABIL_ARTICULO C, DEVOLUCIONES_COMPRAS_DET F
                            WHERE F.DVCO_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTACONS = :CUENTA
                            INTO :ARTICULO, :IMPTOS
                            DO
                            BEGIN
                            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                VALUES (:IDC, :NUMITEMS, :CTACONSUMO, :CONCEPTO, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                            NUMITEMS = NUMITEMS + 1;
                            SUMA = SUMA + IMPTOS;
                            END
                        END
                    if (TIPOCUEN = 'C') then
                        BEGIN
                        /* INSERTE EL REGISTRO DE LA BASE */
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CTACONSUMO, :CONCEPTO, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 24);
                        NUMITEMS = NUMITEMS + 1;
                        SUMA = SUMA + IMPTOS;
                        END
                    if (TIPOCUEN = 'N') then
                        BEGIN
                        /* INSERTE EL REGISTRO DE LA BASE */
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CTACONSUMO, :CONCEPTO, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NUMITEMS = NUMITEMS + 1;
                        SUMA = SUMA + IMPTOS;
                        END
                    END
                END
            END /* FOR */
        END /* CONSUMO X ARTICULO */
        
    if (CONSUMO = 'K') then /* CONSUMO EN CTA CONSTANTE */
        BEGIN
        SELECT SUM(DVCD_CONSUMO)
            FROM DEVOLUCIONES_COMPRAS_DET F
            WHERE F.DVCO_ID = :IDDOC 
            INTO :IMPTOS;
            
        if (IMPTOS <> 0) then
            BEGIN
            /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
            EXECUTE PROCEDURE CUENTA_INTERFAZ(24, :IDDOC, :CTACONSUMO, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (FOMENTO <> 'SI') then
                BEGIN
                /* DEPENDE DEL TIPO DE CUENTA */
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT F.ARTI_COD, DVCD_CONSUMO
                        FROM ARTICULO A, DEVOLUCIONES_COMPRAS_DET F
                        WHERE F.DVCO_ID = :IDDOC
                        INTO :ARTICULO, :IMPTOS
                        DO
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CTACONSUMO, :CONCEPTO, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                        NUMITEMS = NUMITEMS + 1;
                        SUMA = SUMA - IMPTOS;
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    /* INSERTE EL REGISTRO DE LA BASE */
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NUMITEMS, :CTACONSUMO, :CONCEPTO, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 24);
                    NUMITEMS = NUMITEMS + 1;
                    SUMA = SUMA - IMPTOS;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    /* INSERTE EL REGISTRO DE LA BASE */
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NUMITEMS, :CTACONSUMO, :CONCEPTO, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NUMITEMS = NUMITEMS + 1;
                    SUMA = SUMA - IMPTOS;
                    END
                END
            ELSE
                BEGIN
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT F.ARTI_COD, DVCD_CONSUMO
                        FROM ARTICULO A, DEVOLUCIONES_COMPRAS_DET F
                        WHERE F.DVCO_ID = :IDDOC
                        INTO :ARTICULO, :IMPTOS
                        DO
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CTACONSUMO, :CONCEPTO, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                        NUMITEMS = NUMITEMS + 1;
                        SUMA = SUMA + IMPTOS;
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    /* INSERTE EL REGISTRO DE LA BASE */
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NUMITEMS, :CTACONSUMO, :CONCEPTO, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 24);
                    NUMITEMS = NUMITEMS + 1;
                    SUMA = SUMA + IMPTOS;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    /* INSERTE EL REGISTRO DE LA BASE */
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NUMITEMS, :CTACONSUMO, :CONCEPTO, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NUMITEMS = NUMITEMS + 1;
                    SUMA = SUMA + IMPTOS;
                    END
                END
            END
        END /* CONSUMO EN CTA CONSTANTE */
        
    /* DESCUENTO */
    if ((CTADTO IS NOT NULL) AND
        (CTADTO <> '') AND
        (VRDTO <> 0)) THEN
        BEGIN
        /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
        EXECUTE PROCEDURE CUENTA_INTERFAZ(24, :IDDOC, :CTADTO, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :VRDTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 24);
            NUMITEMS = NUMITEMS + 1;
            SUMA = SUMA + VRDTO;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            /* INSERTE EL REGISTRO DE LA BASE */
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :VRDTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NUMITEMS = NUMITEMS + 1;
            SUMA = SUMA + VRDTO;
            END
        END /* DESCUENTO */
        
    /* VALOR ADIC */
    if ((CTAADIC IS NOT NULL) AND
        (CTAADIC <> '') AND
        (VRADIC <> 0)) THEN
        BEGIN
        /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
        EXECUTE PROCEDURE CUENTA_INTERFAZ(24, :IDDOC, :CTAADIC, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :VRADIC, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 24);
            NUMITEMS = NUMITEMS + 1;
            SUMA = SUMA - VRADIC;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            /* INSERTE EL REGISTRO DE LA BASE */
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :VRADIC, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NUMITEMS = NUMITEMS + 1;
            SUMA = SUMA - VRADIC;
            END
        END /* VR. ADIC */
        
    /* VALOR EXTRA */
    if ((CTAEXTRA IS NOT NULL) AND
        (CTAEXTRA <> '') AND
        (VREXTRA <> 0)) THEN
        BEGIN
        /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
        EXECUTE PROCEDURE CUENTA_INTERFAZ(24, :IDDOC, :CTAEXTRA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :VREXTRA, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 24);
            NUMITEMS = NUMITEMS + 1;
            SUMA = SUMA + VREXTRA;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            /* INSERTE EL REGISTRO DE LA BASE */
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :VREXTRA, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NUMITEMS = NUMITEMS + 1;
            SUMA = SUMA + VREXTRA;
            END
        END /* VR. EXTRA */
        
    if (fomento <> 'SI') then
        BEGIN
        /* DESCUENTE EL IMPOCONSUMO */
        SELECT SUM(DVCD_CONSUMO)
            FROM devoluciones_compras_det WHERE DVCO_ID = :IDDOC INTO :IMPTOS;
        if (IMPTOS IS NULL) then
            IMPTOS = 0;
        vrsubt = vrsubt - IMPTOS;
        END
    /* RETENCION FUENTE */
    if ((RTFTE = 'P') or (RTFTE = 'K')) then
      if (VRRTFTE <> 0) then
        BEGIN
        if (RTFTE = 'P') then
            CTARTFTE = TCTARTFTE;
            
        /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
        EXECUTE PROCEDURE CUENTA_INTERFAZ(24, :IDDOC, :CTARTFTE, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :VRRTFTE, 0, :VRSUBT, :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 24);
            NUMITEMS = NUMITEMS + 1;
            SUMA = SUMA + VRRTFTE;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            /* INSERTE EL REGISTRO DE LA BASE */
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :VRRTFTE, 0, :VRSUBT, :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NUMITEMS = NUMITEMS + 1;
            SUMA = SUMA + VRRTFTE;
            END
        END /* RTFTE */
    if (RTFTE = 'A') then
        BEGIN
        FOR SELECT MAX(COAR_CTARTFTE), MAX(COAR_RTFTE), MIN(COAR_RTBASE), SUM(DVCD_TOTAL-DVCD_IVAMONTO-DVCD_CONSUMO), SUM((DVCD_TOTAL-DVCD_IVAMONTO-DVCD_CONSUMO)*COAR_RTFTE)
            FROM CONTABIL_ARTICULO C, DEVOLUCIONES_COMPRAS_DET F
            WHERE F.dvco_id = :IDDOC AND F.ARTI_COD = C.ARTI_COD
            GROUP BY COAR_CTARTFTE
            INTO :CTARTFTE, :PRTFTE, :baseadic, :MONTO, :VRRTFTE
            DO
            BEGIN
            MONTO = MONTO * FACTOR;
            if (MONTO >= BASEADIC) then
                BEGIN
                VRRTFTE = VRRTFTE * FACTOR / 100;
                execute procedure redondee(VRRTFTE, DIG) returning_values (VRRTFTE);
                execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                if (VRRTFTE <> 0) then
                    BEGIN
                    /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
                    EXECUTE PROCEDURE CUENTA_INTERFAZ(24, :IDDOC, :CTARTFTE, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
                    if (ERRORC <> 0) then
                        ERROR = ERROR + 1;
                    if (TIPOCUEN = 'C') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :VRRTFTE, 0, :VRSUBT, :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 24);
                        NUMITEMS = NUMITEMS + 1;
                        SUMA = SUMA + VRRTFTE;
                        END
                    if (TIPOCUEN = 'N') then
                        BEGIN
                        /* INSERTE EL REGISTRO DE LA BASE */
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :VRRTFTE, 0, :VRSUBT, :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NUMITEMS = NUMITEMS + 1;
                        SUMA = SUMA + VRRTFTE;
                        END
                    END
                END
            END
        END /* RTFTE */
    /* RETENCION IVA */
    if ((RTIVA = 'P') or (RTIVA = 'K')) then
      if (VRRTIVA <> 0) then
        BEGIN
        if (RTIVA = 'P') then
            CTARTIVA = TCTARTIVA;
            
        /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
        EXECUTE PROCEDURE CUENTA_INTERFAZ(24, :IDDOC, :CTARTIVA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :VRRTIVA, 0, :VRIVA, :PORC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 24);
            NUMITEMS = NUMITEMS + 1;
            SUMA = SUMA + VRRTIVA;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            /* INSERTE EL REGISTRO DE LA BASE */
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :VRRTIVA, 0, :VRIVA, :PORC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NUMITEMS = NUMITEMS + 1;
            SUMA = SUMA + VRRTIVA;
            END
        END /* RTIVA */
        
    /* RETENCION DE ICA */
    if ((RTICA = 'P') or (RTICA = 'K')) then
      if (VRRTICA <> 0) then
        BEGIN
        if (RTICA = 'P') then
            CTARTICA = TCTARTICA;
            
        /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
        EXECUTE PROCEDURE CUENTA_INTERFAZ(24, :IDDOC, :CTARTICA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :VRRTICA, 0, :VRSUBT, :PRTICA, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 24);
            NUMITEMS = NUMITEMS + 1;
            SUMA = SUMA + VRRTICA;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            /* INSERTE EL REGISTRO DE LA BASE */
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :VRRTICA, 0, :VRSUBT, :PRTICA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NUMITEMS = NUMITEMS + 1;
            SUMA = SUMA + VRRTICA;
            END
        END /* RTICA */
    /* recorra las cuentas adicionales */
    FOR SELECT INCC_CUENTA, INCC_BASE, INCC_PORC, INCC_VALOR, INCC_DB
        FROM INTERFAZ_COMPRAS_CTAS
        WHERE INCO_ID = :IDINTER
        INTO :CUENTAADIC, :BASEADIC, :PORCADIC, :VALORADIC, :DBADIC
        DO
        BEGIN
        if (VALORADIC <> 0) then
            MONTO = VALORADIC;
        ELSE
            BEGIN
            if (:BASEADIC = 'SUBTOTAL') then
                VALORADIC = VRTOTAL - VREXTRA - VRIVA - VRADIC + VRDTO;
            if (:BASEADIC = 'DESCUENTO') then
                VALORADIC = VRDTO;
            if (:BASEADIC = 'IVA') then
                VALORADIC = VRIVA;
            if (:BASEADIC = 'CONSUMO') then
                SELECT SUM(DVCD_CONSUMO)
                    FROM DEVOLUCIONES_COMPRAS_DET F
                    WHERE F.DVCO_ID = :IDDOC 
                    INTO :VALORADIC;
            if (:BASEADIC = 'ADICIONAL') then
                VALORADIC = VRADIC;
            if (:BASEADIC = 'EXTRA') then
                VALORADIC = VREXTRA;
            if (:BASEADIC = 'TOTAL') then
                VALORADIC = VRTOTAL;
            MONTO = VALORADIC * PORCADIC;
            END
        if (MONTO <> 0) then
            BEGIN
            /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
            EXECUTE PROCEDURE CUENTA_INTERFAZ(24, :IDDOC, :CUENTAADIC, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                if (DBADIC = 'S') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NUMITEMS, :CUENTAADIC, :CONCEPTO, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 24);
                    SUMA = SUMA + MONTO;
                    END
                ELSE
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NUMITEMS, :CUENTAADIC, :CONCEPTO, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 24);
                    SUMA = SUMA - MONTO;
                    END
                NUMITEMS = NUMITEMS + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                if (DBADIC = 'S') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NUMITEMS, :CUENTAADIC, :CONCEPTO, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    SUMA = SUMA + MONTO;
                    END
                ELSE
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NUMITEMS, :CUENTAADIC, :CONCEPTO, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    SUMA = SUMA - MONTO;
                    END
                NUMITEMS = NUMITEMS + 1;
                END
            NUMITEMS = NUMITEMS + 1;
            END
        END
    /* CIERRE EL COMPROBANTE CONTRA LA CUENTA DEL TERCERO O LA CONSTANTE */
    if ((SUMA <> 0) and ((CXP = 'P') or (CXP = 'K'))) then
        BEGIN
        if (SUMA < 0) then
            BEGIN
            DEBITO = SUMA * -1;
            CREDITO = 0;
            END
        ELSE
            BEGIN
            DEBITO = 0;
            CREDITO = SUMA;
            END
        if (CXP = 'P') then
            CTACXP = TCTAPROV;

        /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
        EXECUTE PROCEDURE CUENTA_INTERFAZ(24, :IDDOC, :CTACXP, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :DEBITO, :CREDITO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 24);
        if (TIPOCUEN = 'N') then
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :DEBITO, :CREDITO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
        END /* SUMA EN CXP */
     end
    if (ERROR > 0) then
        VER = 'S';
    SUSPEND;
    END /* EXISTE */
ELSE
    BEGIN
    EXECUTE PROCEDURE ERROR (24, :IDDOC, :PREFIJO, 1);
    ERROR = ERROR + 1;
    VER = 'S';
    SUSPEND;
    END
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE DEVCOMPRA_SIN_CONTABILIDAD(
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    ID INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    ESTADO VARCHAR(20),
    IDI INTEGER,
    IDC INTEGER)
AS
DECLARE VARIABLE VER CHAR(2);
declare variable FECICNT VARCHAR(10);
declare variable FECFCNT VARCHAR(10);
declare variable ERROR INTEGER;
declare variable idref INTEGER;
BEGIN
EXECUTE PROCEDURE fecha_a_conta(FECINI) returning_values (FECICNT);
EXECUTE PROCEDURE fecha_a_conta(FECFIN) returning_values (FECFCNT);
FOR SELECT DVCO_ID, PREF_PRE, DVCO_NUMERO FROM DEVOLUCIONES_COMPRAS WHERE DVCO_ANULADO = 'N' AND
    DVCO_FECHA >= :FECINI AND DVCO_FECHA <= :FECFIN
    INTO :ID, :PREF, :NUMERO
DO
  BEGIN
  idref = null;
  SELECT ENCO_IDREF FROM COMPROBANTE_ENCABEZADO WHERE ENCO_TIPOREF = 24 AND ENCO_FECHA >= :FECICNT AND ENCO_FECHA <= :FECFCNT and ENCO_IDREF = :id into :idref;
  if (idref IS NULL) then
  begin
   ESTADO = 'PROCESANDO';
   SUSPEND;
   SELECT MAX(INCO_ID) FROM INTERFAZ_COMPRAS WHERE PREF_PRE = :PREF AND TIDO_COD = 24 INTO :IDI;
   EXECUTE PROCEDURE CONTABIL_DEVOLCOMP (:ID, :IDI) RETURNING_VALUES (:ERROR, :VER, :IDC);
   if (ERROR = 0) then
    BEGIN
      EXECUTE PROCEDURE CONTABILIZA_PENDIENTE (:IDC);
      ESTADO = 'OK';
    end
   ELSE
    ESTADO = 'ERROR';
   suspend;
  End
  END
END

^

SET TERM ; ^


SET TERM ^ ;

CREATE OR ALTER PROCEDURE CONTABILIZA_PENDIENTE (
    idcnt integer)
as
declare variable idc integer;
BEGIN
  /* PASA DE CONTABILIZACION A COMPROBANTES */
  /* EL ENCABEZADO */
  EXECUTE PROCEDURE CAMBIE_ID_COMPROBA returning_values (:IDC);
  INSERT INTO COMPROBANTE_ENCABEZADO (ENCO_CONSEC, TICO_COD, PRCO_PREF, ENCO_NUMERO, ENCO_FECHA, ENCO_CONCEPTO, ENCO_REFER, ENCO_TIPOREF, ENCO_IDREF)
      SELECT :IDC, CNTB_TIPOCOMP, CNTB_PREFCNT, CNTB_NUMERO, CNTB_FECHA, CNTB_CONCEPTO, CNTB_REF, CNTB_TIPOREF, CNTB_IDREF
        FROM CONTABILIZACION WHERE CNTB_ID = :IDCNT;
  /* LOS DETALLES */
  INSERT INTO COMPROBANTE_DETALLE (ENCO_CONSEC, CODE_ITEM, CUEN_COD, TERC_NIT, PROY_COD, CENT_COD, CODE_CONCEPTO, CODE_REFER, CONC_COD, CODE_BASE, CODE_PORC, CODE_DEBITO, CODE_CREDITO, CODE_TIPONUE, CNDE_DOCNUMERO, CODE_TIPOAPL, CNDE_DOCAPLICA, DOCO_VENCE, ARTI_COD)
    SELECT :IDC, CNDE_ITEM, CNDE_CUENTA, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_CONC, CNDE_REF, CNDE_CONCOD, CNDE_BASE, CNDE_PORC, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_DOCTIPON, CNDE_DOCNUMERO, CNDE_DOCTIPOA, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO
        FROM CONTABILIZACION_DET WHERE CNTB_ID = :IDCNT;
  UPDATE CONTABILIZACION SET CNTB_PROCESADO = 'S'
    WHERE CNTB_ID = :IDCNT;
END
^

SET TERM ; ^


/* 20101119B */
/* ERROR EN PEDIDOS DETALLADO NO INCLUIA SI NO UN ITEM */
SET TERM ^ ;

CREATE OR ALTER procedure REP_COMPROBANTES_FAC (
    TIPO integer,
    DETALLE char(1),
    FECINI date,
    FECFIN date,
    PREFINI varchar(4),
    PREFFIN varchar(4),
    PTOINI integer,
    PTOFIN integer,
    ANULADOS char(1),
    SUBEMPRESA integer)
returns (
    NOMTIPO varchar(30),
    ID integer,
    PREF varchar(4),
    NUMERO varchar(6),
    FECHA date,
    VENCE date,
    CODBOD varchar(2),
    NOMBOD varchar(30),
    AUTORIZA varchar(20),
    PTVTID integer,
    PTVTNOM varchar(60),
    VENDCOD integer,
    VENDNOM varchar(60),
    COMIPORC numeric(9,2),
    COMIMONTO numeric(18,2),
    NIT varchar(20),
    NOMTERCERO varchar(60),
    SUCURSAL varchar(10),
    PEDIDO varchar(30),
    COTIZACI varchar(30),
    REMISION varchar(30),
    OBS varchar(255),
    ITEM integer,
    ARTICULO varchar(15),
    CODBAR varchar(15),
    ARTIDES varchar(60),
    CANT numeric(18,4),
    UNIDAD varchar(8),
    BODITEM varchar(2),
    LOTE varchar(15),
    REFERENCIA varchar(60),
    PRECIO numeric(18,2),
    DTOPORCIT numeric(9,2),
    DTOMONTOIT numeric(18,2),
    IVAPORCIT numeric(9,2),
    IVAMONTOIT numeric(18,2),
    CONSUMOIT numeric(18,2),
    SUBTOTALIT numeric(18,2),
    DTOPOR numeric(9,2),
    DTOMONTO numeric(18,2),
    ADICIONAL numeric(18,2),
    IVAMONTO numeric(18,2),
    RTFTEPOR numeric(9,2),
    RTFTEMONTO numeric(18,2),
    RTIVAPOR numeric(9,2),
    RTIVAMONTO numeric(18,2),
    RTICAPOR numeric(9,2),
    RTICAMONTO numeric(18,2),
    EXTRA numeric(18,2),
    DTOFPOR numeric(9,2),
    DTOFMONTO numeric(18,2),
    DTOFFECHA date,
    TOTAL numeric(18,2),
    ANULADO char(1),
    VEHICULO varchar(8),
    FECREG date,
    HORAREG time,
    CONTADO numeric(18,2),
    CREDITO numeric(18,2))
AS
declare variable APLICA NUMERIC(18,2);
BEGIN
VEHICULO = '';
  /* DETERMINE LA TABLA A EXAMINAR */
  if (BIN_AND(TIPO, 1) <> 0) then
    BEGIN
    SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 31 INTO :NOMTIPO;
    FOR SELECT FACT_ID, F.PREF_PRE, FACT_NUMERO, FACT_FECHA, FACT_VENCE, F.BODE_COD, B.BODE_NOM, F.AUTO_NUMERO, F.PTVT_ID, PTVT_NOM, F.VEND_COD, VEND_NOMBRE, F.FACT_COMIPORC, F.FACT_COMIMONTO, F.TERC_NIT, FACT_NOMCLIENTE, FACT_PEDIDO, FACT_COTIZACI, FACT_REMISION, FACT_DTOPOR, FACT_DTOMONTO, FACT_ADICIONAL, FACT_IVAMONTO, FACT_RTFTEPOR, FACT_RTFTEMONTO, FACT_RTIVAPOR, FACT_RTIVAMONTO, FACT_RTICAPOR, FACT_RTICAMONTO, FACT_EXTRA, FACT_DTOFPOR, FACT_DTOFMONTO, FACT_DTOFFECHA, FACT_TOTAL, FACT_ANULADO, VEHI_COD, SUBSTRING(FACT_OBS FROM 1 FOR 255), FACT_SUCURSAL
        FROM FACTURAS F, BODEGA B, PUNTO_VENTA P, VENDEDORES V, PREFIJOS PR WHERE F.PTVT_ID >= :PTOINI AND F.PTVT_ID <= :PTOFIN AND
         F.BODE_COD = B.BODE_COD AND F.PTVT_ID = P.PTVT_ID AND F.VEND_COD = V.VEND_COD AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN
         AND PR.PREF_PRE = F.PREF_PRE AND PR.TIDO_COD = 31 AND ((PR.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) AND
         F.PREF_PRE >= :prefini AND F.PREF_PRE <= :preffin
        ORDER BY FACT_FECHA, FACT_ID
        INTO :ID, :PREF, :NUMERO, :FECHA, :VENCE, :CODBOD, :NOMBOD, :AUTORIZA, :PTVTID, :PTVTNOM, :VENDCOD, :VENDNOM, :COMIPORC, :COMIMONTO, :NIT, :NOMTERCERO, :PEDIDO, :COTIZACI, :REMISION, :DTOPOR, :DTOMONTO, :ADICIONAL, :IVAMONTO, :RTFTEPOR, :RTFTEMONTO, :RTIVAPOR, :RTIVAMONTO, :RTICAPOR, :RTICAMONTO, :EXTRA, :DTOFPOR, :DTOFMONTO, :DTOFFECHA, :TOTAL, :ANULADO, :VEHICULO, :OBS, :sucursal
        DO
        BEGIN
        if ((ANULADOS = 'S') or (ANULADO = 'N')) then
            BEGIN
            SELECT SUM(RCDE_ABONO+RCDE_DTOF) FROM RECIBOS_CAJA_DETALLE D, RECIBOS_CAJA R
                WHERE D.rcde_tipodoc = 31 AND D.rcde_iddoc = :id AND R.reca_id = D.reca_id AND RECA_FECHA = :FECHA AND RCDE_ANULADO = 'N'
                INTO :CONTADO;
            if (CONTADO IS NULL) then
                CONTADO = 0;
            SELECT SUM(D.acde_aplicado) FROM aplicacion_cliente_detalle D, aplicacion_cliente P
                WHERE D.acde_tipodoc = 31 AND D.acde_iddoc = :id AND P.apcl_id = D.apcl_id AND APCL_FECHA = :FECHA AND ACDE_ANULADO = 'N'
                INTO :aplica;
            if (APLICA IS NULL) then
                APLICA = 0;
            CONTADO = CONTADO + APLICA;
            CREDITO = TOTAL - CONTADO;
            SELECT AUDI_FECHA, AUDI_HORA FROM AUDITORIA
                WHERE AUDI_IDDOC = :ID AND TIDO_COD = 31 AND AUDI_OPER = 'I' INTO :FECREG, :HORAREG;
            if (anulado = 'S') then
                BEGIN
                COMIPORC = 0;
                COMIMONTO = 0;
                DTOPOR = 0;
                DTOMONTO = 0;
                ADICIONAL = 0;
                IVAMONTO = 0;
                RTFTEPOR = 0;
                RTFTEMONTO = 0;
                RTIVAPOR = 0;
                RTIVAMONTO = 0;
                RTICAPOR = 0;
                RTICAMONTO = 0;
                EXTRA = 0;
                DTOFPOR = 0;
                DTOFMONTO = 0;
                TOTAL = 0;
                END
            if (DETALLE = 'S') then
                BEGIN
                if (anulado = 'S') then
                    BEGIN
                    ITEM = 0;
                    ARTICULO = '';
                    CODBAR = '';
                    ARTIDES = '';
                    CANT = 0;
                    UNIDAD = '';
                    BODITEM = '';
                    LOTE = '';
                    REFERENCIA = '';
                    PRECIO = 0;
                    DTOPORCIT = 0;
                    DTOMONTOIT = 0;
                    IVAPORCIT = 0;
                    IVAMONTOIT = 0;
                    CONSUMOIT = 0;
                    SUBTOTALIT = 0;
                    SUSPEND;
                    END
                ELSE
                    BEGIN
                    FOR SELECT FADE_ITEM, ARTI_COD, FADE_CODBAR, SUBSTRING(FADE_DESC FROM 1 FOR 60), FADE_CANT, FADE_UNIDAD, BODE_COD, FADE_LOTE, FADE_REFERENCIA, FADE_PRUNIT, FADE_DTOPORC, FADE_DTOMONTO, FADE_IVAPORC, FADE_IVAMONTO, FADE_CONSUMO, FADE_TOTAL
                        FROM FACTURAS_DETALLE
                        WHERE FACT_ID = :ID and substring(arti_cod from 1 FOR 2) <> '.t'
                        ORDER BY FADE_ITEM
                        INTO :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :BODITEM, :LOTE, :REFERENCIA, :PRECIO, :DTOPORCIT, :DTOMONTOIT, :IVAPORCIT, :IVAMONTOIT, :CONSUMOIT, :SUBTOTALIT
                        DO
                        SUSPEND;
                    END
                END
            ELSE
                SUSPEND;
            END
        END
    END
  if (BIN_AND(TIPO, 2) <> 0) then
    BEGIN
    SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 32 INTO :NOMTIPO;
    FOR SELECT REVT_ID, R.PREF_PRE, REVT_NUMERO, REVT_FECHA, REVT_FECHA VENCE, R.BODE_COD, B.BODE_NOM, '', R.PTVT_ID, PTVT_NOM, R.VEND_COD, VEND_NOMBRE, 0, 0, R.TERC_NIT, REVT_NOMTERC, '', '', '', 0, 0, 0, REVT_IVAMONTO, 0, 0, 0, 0, 0, 0, 0, 0, 0, REVT_FECHA DTOF, REVT_TOTAL, REVT_ANULADO, SUBSTRING(REVT_OBS FROM 1 FOR 255), REVT_SUCURSAL
        FROM REMISIONES_VENTA R, BODEGA B, PUNTO_VENTA P, VENDEDORES V, PREFIJOS PR WHERE R.PTVT_ID >= :PTOINI AND R.PTVT_ID <= :PTOFIN AND
         R.BODE_COD = B.BODE_COD AND R.PTVT_ID = P.PTVT_ID AND R.VEND_COD = V.VEND_COD AND REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN
         AND PR.PREF_PRE = R.PREF_PRE AND PR.TIDO_COD = 32 AND ((PR.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) AND
         R.PREF_PRE >= :prefini AND R.PREF_PRE <= :preffin
        ORDER BY REVT_FECHA, REVT_ID
        INTO :ID, :PREF, :NUMERO, :FECHA, :VENCE, :CODBOD, :NOMBOD, :AUTORIZA, :PTVTID, :PTVTNOM, :VENDCOD, :VENDNOM, :COMIPORC, :COMIMONTO, :NIT, :NOMTERCERO, :PEDIDO, :COTIZACI, :REMISION, :DTOPOR, :DTOMONTO, :ADICIONAL, :IVAMONTO, :RTFTEPOR, :RTFTEMONTO, :RTIVAPOR, :RTIVAMONTO, :RTICAPOR, :RTICAMONTO, :EXTRA, :DTOFPOR, :DTOFMONTO, :DTOFFECHA, :TOTAL, :ANULADO, :OBS, :sucursal
        DO
        BEGIN
        if ((ANULADOS = 'S') or (ANULADO = 'N')) then
            BEGIN
            SELECT AUDI_FECHA, AUDI_HORA FROM AUDITORIA
                WHERE AUDI_IDDOC = :ID AND TIDO_COD = 32 AND AUDI_OPER = 'I' INTO :FECREG, :HORAREG;
            CONTADO = 0;
            CREDITO = TOTAL;
            if (anulado = 'S') then
                BEGIN
                COMIPORC = 0;
                COMIMONTO = 0;
                DTOPOR = 0;
                DTOMONTO = 0;
                ADICIONAL = 0;
                IVAMONTO = 0;
                RTFTEPOR = 0;
                RTFTEMONTO = 0;
                RTIVAPOR = 0;
                RTIVAMONTO = 0;
                RTICAPOR = 0;
                RTICAMONTO = 0;
                EXTRA = 0;
                DTOFPOR = 0;
                DTOFMONTO = 0;
                TOTAL = 0;
                END
            if (DETALLE = 'S') then
                BEGIN
                if (anulado = 'S') then
                    BEGIN
                    ITEM = 0;
                    ARTICULO = '';
                    CODBAR = '';
                    ARTIDES = '';
                    CANT = 0;
                    UNIDAD = '';
                    BODITEM = '';
                    LOTE = '';
                    REFERENCIA = '';
                    PRECIO = 0;
                    DTOPORCIT = 0;
                    DTOMONTOIT = 0;
                    IVAPORCIT = 0;
                    IVAMONTOIT = 0;
                    CONSUMOIT = 0;
                    SUBTOTALIT = 0;
                    SUSPEND;
                    END
                ELSE
                    BEGIN
                    FOR SELECT RVDE_ITEM, ARTI_COD, RVDE_CODBAR, SUBSTRING(RVDE_DESC FROM 1 FOR 60), RVDE_CANT, RVDE_UNIDAD, BODE_COD, RVDE_LOTE, RVDE_REFERENCIA, RVDE_PRUNIT, RVDE_DTOPORC, RVDE_DTOMONTO, RVDE_IVAPORC, RVDE_IVAMONTO, RVDE_CONSUMO, RVDE_TOTAL
                        FROM REMISIONES_VENTA_DETALLE
                        WHERE REVT_ID = :ID
                        ORDER BY RVDE_ITEM
                        INTO :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :BODITEM, :LOTE, :REFERENCIA, :PRECIO, :DTOPORCIT, :DTOMONTOIT, :IVAPORCIT, :IVAMONTOIT, :CONSUMOIT, :SUBTOTALIT
                        DO
                        SUSPEND;
                    END
                END
            ELSE
                SUSPEND;
            END
        END
    END
  if (BIN_AND(TIPO, 4) <> 0) then
    BEGIN
    SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 33 INTO :NOMTIPO;
    FOR SELECT DEVT_ID, D.PREF_PRE, DEVT_NUMERO, DEVT_FECHA, DEVT_FECHA VENCE, D.BODE_COD, B.BODE_NOM, '', D.PTVT_ID, PTVT_NOM, D.VEND_COD, VEND_NOMBRE, DEVT_COMIPORC, DEVT_COMIMONTO, D.TERC_NIT, DEVT_NOMTERC, '', '', '', DEVT_DTOPOR, DEVT_DTOMONTO, DEVT_ADICIONAL, DEVT_IVAMONTO, DEVT_RTFTEPORC, DEVT_RTFTEMONTO, DEVT_RTIVAPORC, DEVT_RTIVAMONTO, DEVT_RTICAPORC, DEVT_RTICAMONTO, DEVT_EXTRA, 0, 0, DEVT_FECHA DTOF, DEVT_TOTAL, DEVT_ANULADO, SUBSTRING(DEVT_OBS FROM 1 FOR 255), DEVT_SUCURSAL
        FROM DEVOLUCIONES_VENTAS D, BODEGA B, PUNTO_VENTA P, VENDEDORES V, PREFIJOS PR WHERE D.PTVT_ID >= :PTOINI AND D.PTVT_ID <= :PTOFIN AND
         D.BODE_COD = B.BODE_COD AND D.PTVT_ID = P.PTVT_ID AND D.VEND_COD = V.VEND_COD AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN
         AND PR.PREF_PRE = D.PREF_PRE AND PR.TIDO_COD = 33 AND ((PR.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) AND
         D.PREF_PRE >= :prefini AND D.PREF_PRE <= :preffin
        ORDER BY DEVT_FECHA, DEVT_ID
        INTO :ID, :PREF, :NUMERO, :FECHA, :VENCE, :CODBOD, :NOMBOD, :AUTORIZA, :PTVTID, :PTVTNOM, :VENDCOD, :VENDNOM, :COMIPORC, :COMIMONTO, :NIT, :NOMTERCERO, :PEDIDO, :COTIZACI, :REMISION, :DTOPOR, :DTOMONTO, :ADICIONAL, :IVAMONTO, :RTFTEPOR, :RTFTEMONTO, :RTIVAPOR, :RTIVAMONTO, :RTICAPOR, :RTICAMONTO, :EXTRA, :DTOFPOR, :DTOFMONTO, :DTOFFECHA, :TOTAL, :ANULADO, :OBS, :sucursal
        DO
        BEGIN
        if ((ANULADOS = 'S') or (ANULADO = 'N')) then
            BEGIN
            SELECT AUDI_FECHA, AUDI_HORA FROM AUDITORIA
                WHERE AUDI_IDDOC = :ID AND TIDO_COD = 33 AND AUDI_OPER = 'I' INTO :FECREG, :HORAREG;
            SELECT SUM(RCDE_ABONO+RCDE_DTOF) FROM RECIBOS_CAJA_DETALLE D, RECIBOS_CAJA R
                WHERE D.rcde_tipodoc = 33 AND D.rcde_iddoc = :id AND R.reca_id = D.reca_id AND RECA_FECHA = :FECHA AND RCDE_ANULADO = 'N'
                INTO :CONTADO;
            if (CONTADO IS NULL) then
                CONTADO = 0;
            ELSE
                CONTADO = CONTADO * -1;
            SELECT SUM(D.acde_aplicado) FROM aplicacion_cliente_detalle D, aplicacion_cliente P
                WHERE D.acde_tipodoc = 33 AND D.acde_iddoc = :id AND P.apcl_id = D.apcl_id AND APCL_FECHA = :FECHA AND ACDE_ANULADO = 'N'
                INTO :aplica;
            if (APLICA IS NULL) then
                APLICA = 0;
            ELSE
                APLICA = APLICA * -1;
            CONTADO = CONTADO + APLICA;
            CREDITO = TOTAL - CONTADO;
            if (anulado = 'S') then
                BEGIN
                COMIPORC = 0;
                COMIMONTO = 0;
                DTOPOR = 0;
                DTOMONTO = 0;
                ADICIONAL = 0;
                IVAMONTO = 0;
                RTFTEPOR = 0;
                RTFTEMONTO = 0;
                RTIVAPOR = 0;
                RTIVAMONTO = 0;
                RTICAPOR = 0;
                RTICAMONTO = 0;
                EXTRA = 0;
                DTOFPOR = 0;
                DTOFMONTO = 0;
                TOTAL = 0;
                END
            if (DETALLE = 'S') then
                BEGIN
                if (anulado = 'S') then
                    BEGIN
                    ITEM = 0;
                    ARTICULO = '';
                    CODBAR = '';
                    ARTIDES = '';
                    CANT = 0;
                    UNIDAD = '';
                    BODITEM = '';
                    LOTE = '';
                    REFERENCIA = '';
                    PRECIO = 0;
                    DTOPORCIT = 0;
                    DTOMONTOIT = 0;
                    IVAPORCIT = 0;
                    IVAMONTOIT = 0;
                    CONSUMOIT = 0;
                    SUBTOTALIT = 0;
                    SUSPEND;
                    END
                ELSE
                    BEGIN
                    FOR SELECT DVDE_ITEM, ARTI_COD, DVDE_CODBAR, SUBSTRING(DVDE_DESC FROM 1 FOR 60), DVDE_CANT, DVDE_UNIDAD, BODE_COD, DVDE_LOTE, DVDE_REFERENCIA, DVDE_PRUNIT, DVDE_DTOPORC, DVDE_DTOMONTO, DVDE_IVAPORC, DVDE_IVAMONTO, DVDE_CONSUMO, DVDE_TOTAL
                        FROM DEVOLUCIONES_VENTAS_DETALLE
                        WHERE DEVT_ID = :ID and substring(arti_cod from 1 FOR 2) <> '.t'
                        ORDER BY DVDE_ITEM
                        INTO :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :BODITEM, :LOTE, :REFERENCIA, :PRECIO, :DTOPORCIT, :DTOMONTOIT, :IVAPORCIT, :IVAMONTOIT, :CONSUMOIT, :SUBTOTALIT
                        DO
                        SUSPEND;
                    END
                END
            ELSE
                SUSPEND;
            END
        END
    END
  if (BIN_AND(TIPO, 8) <> 0) then
    BEGIN
    SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 34 INTO :NOMTIPO;
    FOR SELECT PEDI_ID, P.PREF_PRE, PEDI_NUMERO, PEDI_FECHA, PEDI_FECHA VENCE, '', '', '', P.PTVT_ID, PTVT_NOM, P.VEND_COD, VEND_NOMBRE, 0, 0, P.TERC_NIT, PEDI_NOMTERC, '', '', '', PEDI_DTOPOR, PEDI_DTOMONTO, PEDI_ADICIONAL, PEDI_IVAMONTO, 0, 0, 0, 0, 0, 0, PEDI_EXTRA, 0, 0, PEDI_FECHA DTOF, PEDI_TOTAL, PEDI_ANULADO, SUBSTRING(PEDI_OBS FROM 1 FOR 255), PEDI_SUCURSAL
        FROM PEDIDOS P, PUNTO_VENTA PT, VENDEDORES V, PREFIJOS PR WHERE P.PTVT_ID >= :PTOINI AND P.PTVT_ID <= :PTOFIN AND
         P.PTVT_ID = PT.PTVT_ID AND P.VEND_COD = V.VEND_COD AND PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN
         AND PR.PREF_PRE = P.PREF_PRE AND PR.TIDO_COD = 34 AND ((PR.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) AND
         P.PREF_PRE >= :prefini AND P.PREF_PRE <= :preffin
        ORDER BY PEDI_FECHA, PEDI_ID
        INTO :ID, :PREF, :NUMERO, :FECHA, :VENCE, :CODBOD, :NOMBOD, :AUTORIZA, :PTVTID, :PTVTNOM, :VENDCOD, :VENDNOM, :COMIPORC, :COMIMONTO, :NIT, :NOMTERCERO, :PEDIDO, :COTIZACI, :REMISION, :DTOPOR, :DTOMONTO, :ADICIONAL, :IVAMONTO, :RTFTEPOR, :RTFTEMONTO, :RTIVAPOR, :RTIVAMONTO, :RTICAPOR, :RTICAMONTO, :EXTRA, :DTOFPOR, :DTOFMONTO, :DTOFFECHA, :TOTAL, :ANULADO, :OBS, :sucursal
        DO
        BEGIN
        if ((ANULADOS = 'S') or (ANULADO = 'N')) then
            BEGIN
            SELECT AUDI_FECHA, AUDI_HORA FROM AUDITORIA
                WHERE AUDI_IDDOC = :ID AND TIDO_COD = 34 AND AUDI_OPER = 'I' INTO :FECREG, :HORAREG;
            CONTADO = 0;
            CREDITO = TOTAL;
            if (anulado = 'S') then
                BEGIN
                COMIPORC = 0;
                COMIMONTO = 0;
                DTOPOR = 0;
                DTOMONTO = 0;
                ADICIONAL = 0;
                IVAMONTO = 0;
                RTFTEPOR = 0;
                RTFTEMONTO = 0;
                RTIVAPOR = 0;
                RTIVAMONTO = 0;
                RTICAPOR = 0;
                RTICAMONTO = 0;
                EXTRA = 0;
                DTOFPOR = 0;
                DTOFMONTO = 0;
                TOTAL = 0;
                END
            if (DETALLE = 'S') then
                BEGIN
                if (anulado = 'S') then
                    BEGIN
                    ITEM = 0;
                    ARTICULO = '';
                    CODBAR = '';
                    ARTIDES = '';
                    CANT = 0;
                    UNIDAD = '';
                    BODITEM = '';
                    LOTE = '';
                    REFERENCIA = '';
                    PRECIO = 0;
                    DTOPORCIT = 0;
                    DTOMONTOIT = 0;
                    IVAPORCIT = 0;
                    IVAMONTOIT = 0;
                    CONSUMOIT = 0;
                    SUBTOTALIT = 0;
                    SUSPEND;
                    END
                ELSE
                    BEGIN
                    FOR SELECT PEDE_ITEM, ARTI_COD, PEDE_CODBAR, SUBSTRING(PEDE_DESC FROM 1 FOR 60), PEDE_CANT, PEDE_UNIDAD, '', '', PEDE_REFERENCIA, PEDE_PRUNIT, PEDE_DTOPORC, PEDE_DTOMONTO, PEDE_IVAPORC, PEDE_IVAMONTO, PEDE_CONSUMO, PEDE_TOTAL
                        FROM PEDIDOS_DETALLE
                        WHERE PEDI_ID = :ID
                        ORDER BY PEDE_ITEM
                        INTO :ITEM, :ARTICULO, :CODBAR, :artides, :CANT, :UNIDAD, :BODITEM, :LOTE, :REFERENCIA, :PRECIO, :DTOPORCIT, :DTOMONTOIT, :IVAPORCIT, :IVAMONTOIT, :CONSUMOIT, :SUBTOTALIT
                        DO
                         SUSPEND;
                    END
                END
            ELSE
                SUSPEND;
            END
        END
    END
  if (BIN_AND(TIPO, 16) <> 0) then
    BEGIN
    SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 35 INTO :NOMTIPO;
    FOR SELECT COTI_ID, C.PREF_PRE, COTI_NUMERO, COTI_FECHA, COTI_FECHA VENCE, '', '', '', C.PTVT_ID, PTVT_NOM, C.VEND_COD, VEND_NOMBRE, 0, 0, C.TERC_NIT, COTI_NOMTERC, '', '', '', COTI_DTOPORC, COTI_DTOMONTO, COTI_ADICIONAL, COTI_IVAMONTO, 0, 0, 0, 0, 0, 0, COTI_EXTRA, 0, 0, COTI_FECHA DTOF, COTI_TOTAL, COTI_ANULADO, SUBSTRING(COTI_OBS FROM 1 FOR 255), COTI_SUCURSAL
        FROM COTIZACIONES C, PUNTO_VENTA P, VENDEDORES V, PREFIJOS PR WHERE C.PTVT_ID >= :PTOINI AND C.PTVT_ID <= :PTOFIN AND
         C.PTVT_ID = P.PTVT_ID AND C.VEND_COD = V.VEND_COD AND COTI_FECHA >= :FECINI AND COTI_FECHA <= :FECFIN
         AND PR.PREF_PRE = C.PREF_PRE AND PR.TIDO_COD = 35 AND ((PR.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) AND
         C.PREF_PRE >= :prefini AND C.PREF_PRE <= :preffin
        ORDER BY COTI_FECHA, COTI_ID
        INTO :ID, :PREF, :NUMERO, :FECHA, :VENCE, :CODBOD, :NOMBOD, :AUTORIZA, :PTVTID, :PTVTNOM, :VENDCOD, :VENDNOM, :COMIPORC, :COMIMONTO, :NIT, :NOMTERCERO, :PEDIDO, :COTIZACI, :REMISION, :DTOPOR, :DTOMONTO, :ADICIONAL, :IVAMONTO, :RTFTEPOR, :RTFTEMONTO, :RTIVAPOR, :RTIVAMONTO, :RTICAPOR, :RTICAMONTO, :EXTRA, :DTOFPOR, :DTOFMONTO, :DTOFFECHA, :TOTAL, :ANULADO, :OBS, :sucursal
        DO
        BEGIN
        if ((ANULADOS = 'S') or (ANULADO = 'N')) then
            BEGIN
            SELECT AUDI_FECHA, AUDI_HORA FROM AUDITORIA
                WHERE AUDI_IDDOC = :ID AND TIDO_COD = 35 AND AUDI_OPER = 'I' INTO :FECREG, :HORAREG;
            CONTADO = 0;
            CREDITO = TOTAL;
            if (anulado = 'S') then
                BEGIN
                COMIPORC = 0;
                COMIMONTO = 0;
                DTOPOR = 0;
                DTOMONTO = 0;
                ADICIONAL = 0;
                IVAMONTO = 0;
                RTFTEPOR = 0;
                RTFTEMONTO = 0;
                RTIVAPOR = 0;
                RTIVAMONTO = 0;
                RTICAPOR = 0;
                RTICAMONTO = 0;
                EXTRA = 0;
                DTOFPOR = 0;
                DTOFMONTO = 0;
                TOTAL = 0;
                END
            if (DETALLE = 'S') then
                BEGIN
                if (anulado = 'S') then
                    BEGIN
                    ITEM = 0;
                    ARTICULO = '';
                    CODBAR = '';
                    ARTIDES = '';
                    CANT = 0;
                    UNIDAD = '';
                    BODITEM = '';
                    LOTE = '';
                    REFERENCIA = '';
                    PRECIO = 0;
                    DTOPORCIT = 0;
                    DTOMONTOIT = 0;
                    IVAPORCIT = 0;
                    IVAMONTOIT = 0;
                    CONSUMOIT = 0;
                    SUBTOTALIT = 0;
                    SUSPEND;
                    END
                ELSE
                    BEGIN
                    FOR SELECT CTDE_ITEM, ARTI_COD, CTDE_CODBAR, SUBSTRING(CTDE_DESC FROM 1 FOR 60), CTDE_CANT, CTDE_UNIDAD, '', '', CTDE_REFERENCIA, CTDE_PRUNIT, CTDE_DTOPORC, CTDE_DTOMONTO, CTDE_IVAPORC, CTDE_IVAMONTO, CTDE_CONSUMO, CTDE_TOTAL
                        FROM COTIZACIONES_DETALLE
                        WHERE COTI_ID = :ID
                        ORDER BY CTDE_ITEM
                        INTO :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :BODITEM, :LOTE, :REFERENCIA, :PRECIO, :DTOPORCIT, :DTOMONTOIT, :IVAPORCIT, :IVAMONTOIT, :CONSUMOIT, :SUBTOTALIT
                        DO
                        SUSPEND;
                    END
                END
            ELSE
                SUSPEND;
            END
        END
    END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure REP_CONSECUTIVOS_FAC (
    TIPO integer,
    DETALLE char(1),
    PREINI varchar(4),
    PREFIN varchar(4),
    NUMINI varchar(6),
    NUMFIN varchar(6),
    PTOINI integer,
    PTOFIN integer,
    ANULADOS char(1),
    SUBEMPRESA integer)
returns (
    NOMTIPO varchar(30),
    ID integer,
    PREF varchar(4),
    NUMERO varchar(6),
    FECHA date,
    VENCE date,
    CODBOD varchar(2),
    NOMBOD varchar(30),
    AUTORIZA varchar(20),
    PTVTID integer,
    PTVTNOM varchar(60),
    VENDCOD integer,
    VENDNOM varchar(60),
    COMIPORC numeric(9,2),
    COMIMONTO numeric(18,2),
    NIT varchar(20),
    NOMTERCERO varchar(60),
    SUCURSAL varchar(10),
    PEDIDO varchar(30),
    COTIZACI varchar(30),
    REMISION varchar(30),
    OBS varchar(255),
    ITEM integer,
    ARTICULO varchar(15),
    CODBAR varchar(15),
    ARTIDES varchar(60),
    CANT numeric(18,4),
    UNIDAD varchar(8),
    BODITEM varchar(2),
    LOTE varchar(15),
    REFERENCIA varchar(60),
    PRECIO numeric(18,2),
    DTOPORCIT numeric(9,2),
    DTOMONTOIT numeric(18,2),
    IVAPORCIT numeric(9,2),
    IVAMONTOIT numeric(18,2),
    CONSUMOIT numeric(18,2),
    SUBTOTALIT numeric(18,2),
    DTOPOR numeric(9,2),
    DTOMONTO numeric(18,2),
    ADICIONAL numeric(18,2),
    IVAMONTO numeric(18,2),
    RTFTEPOR numeric(9,2),
    RTFTEMONTO numeric(18,2),
    RTIVAPOR numeric(9,2),
    RTIVAMONTO numeric(18,2),
    RTICAPOR numeric(9,2),
    RTICAMONTO numeric(18,2),
    EXTRA numeric(18,2),
    DTOFPOR numeric(9,2),
    DTOFMONTO numeric(18,2),
    DTOFFECHA date,
    TOTAL numeric(18,2),
    ANULADO char(1),
    VEHICULO varchar(8))
AS
BEGIN
VEHICULO = '';
  /* DETERMINE LA TABLA A EXAMINAR */
  if (BIN_AND(TIPO, 1) <> 0) then
    BEGIN
    SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 31 INTO :NOMTIPO;
    /* FACTURA */
    FOR SELECT FACT_ID, F.PREF_PRE, FACT_NUMERO, FACT_FECHA, FACT_VENCE, F.BODE_COD, B.BODE_NOM, F.AUTO_NUMERO, F.PTVT_ID, PTVT_NOM, F.VEND_COD, VEND_NOMBRE, F.FACT_COMIPORC, F.FACT_COMIMONTO, F.TERC_NIT, FACT_NOMCLIENTE, FACT_PEDIDO, FACT_COTIZACI, FACT_REMISION, FACT_DTOPOR, FACT_DTOMONTO, FACT_ADICIONAL, FACT_IVAMONTO, FACT_RTFTEPOR, FACT_RTFTEMONTO, FACT_RTIVAPOR, FACT_RTIVAMONTO, FACT_RTICAPOR, FACT_RTICAMONTO, FACT_EXTRA, FACT_DTOFPOR, FACT_DTOFMONTO, FACT_DTOFFECHA, FACT_TOTAL, FACT_ANULADO, VEHI_COD, SUBSTRING(FACT_OBS FROM 1 FOR 255), FACT_SUCURSAL
        FROM FACTURAS F, BODEGA B, PUNTO_VENTA P, VENDEDORES V, PREFIJOS PR WHERE F.PTVT_ID >= :PTOINI AND F.PTVT_ID <= :PTOFIN AND
         F.BODE_COD = B.BODE_COD AND F.PTVT_ID = P.PTVT_ID AND F.VEND_COD = V.VEND_COD AND F.PREF_PRE >= :PREINI AND F.PREF_PRE <= :PREFIN AND FACT_NUMERO >= :NUMINI AND FACT_NUMERO <= :NUMFIN
         AND PR.PREF_PRE = F.PREF_PRE AND PR.TIDO_COD = 31 AND ((PR.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
        ORDER BY F.PREF_PRE, FACT_NUMERO
        INTO :ID, :PREF, :NUMERO, :FECHA, :VENCE, :CODBOD, :NOMBOD, :AUTORIZA, :PTVTID, :PTVTNOM, :VENDCOD, :VENDNOM, :COMIPORC, :COMIMONTO, :NIT, :NOMTERCERO, :PEDIDO, :COTIZACI, :REMISION, :DTOPOR, :DTOMONTO, :ADICIONAL, :IVAMONTO, :RTFTEPOR, :RTFTEMONTO, :RTIVAPOR, :RTIVAMONTO, :RTICAPOR, :RTICAMONTO, :EXTRA, :DTOFPOR, :DTOFMONTO, :DTOFFECHA, :TOTAL, :ANULADO, :VEHICULO, :OBS, :sucursal
        DO
        BEGIN
        if ((ANULADOS = 'S') or (ANULADO = 'N')) then
            BEGIN
            if (anulado = 'S') then
                BEGIN
                COMIPORC = 0;
                COMIMONTO = 0;
                DTOPOR = 0;
                DTOMONTO = 0;
                ADICIONAL = 0;
                IVAMONTO = 0;
                RTFTEPOR = 0;
                RTFTEMONTO = 0;
                RTIVAPOR = 0;
                RTIVAMONTO = 0;
                RTICAPOR = 0;
                RTICAMONTO = 0;
                EXTRA = 0;
                DTOFPOR = 0;
                DTOFMONTO = 0;
                TOTAL = 0;
                END
            if (DETALLE = 'S') then
                BEGIN
                if (anulado = 'S') then
                    BEGIN
                    ITEM = 0;
                    ARTICULO = '';
                    CODBAR = '';
                    ARTIDES = '';
                    CANT = 0;
                    UNIDAD = '';
                    BODITEM = '';
                    LOTE = '';
                    REFERENCIA = '';
                    PRECIO = 0;
                    DTOPORCIT = 0;
                    DTOMONTOIT = 0;
                    IVAPORCIT = 0;
                    IVAMONTOIT = 0;
                    CONSUMOIT = 0;
                    SUBTOTALIT = 0;
                    SUSPEND;
                    END
                ELSE
                    BEGIN
                    FOR SELECT FADE_ITEM, ARTI_COD, FADE_CODBAR, SUBSTRING(FADE_DESC FROM 1 FOR 60), FADE_CANT, FADE_UNIDAD, BODE_COD, FADE_LOTE, FADE_REFERENCIA, FADE_PRUNIT, FADE_DTOPORC, FADE_DTOMONTO, FADE_IVAPORC, FADE_IVAMONTO, FADE_CONSUMO, FADE_TOTAL
                        FROM FACTURAS_DETALLE
                        WHERE FACT_ID = :ID and substring(arti_cod from 1 FOR 2) <> '.t'
                        ORDER BY FADE_ITEM
                        INTO :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :BODITEM, :LOTE, :REFERENCIA, :PRECIO, :DTOPORCIT, :DTOMONTOIT, :IVAPORCIT, :IVAMONTOIT, :CONSUMOIT, :SUBTOTALIT
                        DO
                        SUSPEND;
                    END
                END
            ELSE
                SUSPEND;
            END
        END
    END
  if (BIN_AND(TIPO, 2) <> 0) then
    BEGIN
    SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 32 INTO :NOMTIPO;
    /* REMISION */
    FOR SELECT REVT_ID, R.PREF_PRE, REVT_NUMERO, REVT_FECHA, REVT_FECHA, R.BODE_COD, B.BODE_NOM, '', R.PTVT_ID, PTVT_NOM, R.VEND_COD, VEND_NOMBRE, 0, 0, R.TERC_NIT, REVT_NOMTERC, '', '', '', 0, 0, 0, REVT_IVAMONTO, 0, 0, 0, 0, 0, 0, 0, 0, 0, REVT_FECHA, REVT_TOTAL, REVT_ANULADO, SUBSTRING(REVT_OBS FROM 1 FOR 255), REVT_SUCURSAL
        FROM REMISIONES_VENTA R, BODEGA B, PUNTO_VENTA P, VENDEDORES V, PREFIJOS PR WHERE R.PTVT_ID >= :PTOINI AND R.PTVT_ID <= :PTOFIN AND
         R.BODE_COD = B.BODE_COD AND R.PTVT_ID = P.PTVT_ID AND R.VEND_COD = V.VEND_COD AND R.PREF_PRE >= :PREINI AND R.PREF_PRE <= :PREFIN AND REVT_NUMERO >= :NUMINI AND REVT_NUMERO <= :NUMFIN
         AND PR.PREF_PRE = R.PREF_PRE AND PR.TIDO_COD = 32 AND ((PR.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
        ORDER BY R.PREF_PRE, REVT_NUMERO
        INTO :ID, :PREF, :NUMERO, :FECHA, :VENCE, :CODBOD, :NOMBOD, :AUTORIZA, :PTVTID, :PTVTNOM, :VENDCOD, :VENDNOM, :COMIPORC, :COMIMONTO, :NIT, :NOMTERCERO, :PEDIDO, :COTIZACI, :REMISION, :DTOPOR, :DTOMONTO, :ADICIONAL, :IVAMONTO, :RTFTEPOR, :RTFTEMONTO, :RTIVAPOR, :RTIVAMONTO, :RTICAPOR, :RTICAMONTO, :EXTRA, :DTOFPOR, :DTOFMONTO, :DTOFFECHA, :TOTAL, :ANULADO, :OBS, :sucursal
        DO
        BEGIN
        if ((ANULADOS = 'S') or (ANULADO = 'N')) then
            BEGIN
            if (anulado = 'S') then
                BEGIN
                COMIPORC = 0;
                COMIMONTO = 0;
                DTOPOR = 0;
                DTOMONTO = 0;
                ADICIONAL = 0;
                IVAMONTO = 0;
                RTFTEPOR = 0;
                RTFTEMONTO = 0;
                RTIVAPOR = 0;
                RTIVAMONTO = 0;
                RTICAPOR = 0;
                RTICAMONTO = 0;
                EXTRA = 0;
                DTOFPOR = 0;
                DTOFMONTO = 0;
                TOTAL = 0;
                END
            if (DETALLE = 'S') then
                BEGIN
                if (anulado = 'S') then
                    BEGIN
                    ITEM = 0;
                    ARTICULO = '';
                    CODBAR = '';
                    ARTIDES = '';
                    CANT = 0;
                    UNIDAD = '';
                    BODITEM = '';
                    LOTE = '';
                    REFERENCIA = '';
                    PRECIO = 0;
                    DTOPORCIT = 0;
                    DTOMONTOIT = 0;
                    IVAPORCIT = 0;
                    IVAMONTOIT = 0;
                    CONSUMOIT = 0;
                    SUBTOTALIT = 0;
                    SUSPEND;
                    END
                ELSE
                    BEGIN
                    FOR SELECT RVDE_ITEM, ARTI_COD, RVDE_CODBAR, SUBSTRING(RVDE_DESC FROM 1 FOR 60), RVDE_CANT, RVDE_UNIDAD, BODE_COD, RVDE_LOTE, RVDE_REFERENCIA, RVDE_PRUNIT, RVDE_DTOPORC, RVDE_DTOMONTO, RVDE_IVAPORC, RVDE_IVAMONTO, RVDE_CONSUMO, RVDE_TOTAL
                        FROM REMISIONES_VENTA_DETALLE
                        WHERE REVT_ID = :ID
                        ORDER BY RVDE_ITEM
                        INTO :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :BODITEM, :LOTE, :REFERENCIA, :PRECIO, :DTOPORCIT, :DTOMONTOIT, :IVAPORCIT, :IVAMONTOIT, :CONSUMOIT, :SUBTOTALIT
                        DO
                        SUSPEND;
                    END
                END
            ELSE
                SUSPEND;
            END
        END
    END
  if (BIN_AND(TIPO, 4) <> 0) then
    BEGIN
    SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 33 INTO :NOMTIPO;
    /* DEVOLUCIONES */
    FOR SELECT DEVT_ID, D.PREF_PRE, DEVT_NUMERO, DEVT_FECHA, DEVT_FECHA, D.BODE_COD, B.BODE_NOM, '', D.PTVT_ID, PTVT_NOM, D.VEND_COD, VEND_NOMBRE, DEVT_COMIPORC, DEVT_COMIMONTO, D.TERC_NIT, DEVT_NOMTERC, '', '', '', DEVT_DTOPOR, DEVT_DTOMONTO, DEVT_ADICIONAL, DEVT_IVAMONTO, DEVT_RTFTEPORC, DEVT_RTFTEMONTO, DEVT_RTIVAPORC, DEVT_RTIVAMONTO, DEVT_RTICAPORC, DEVT_RTICAMONTO, DEVT_EXTRA, 0, 0, DEVT_FECHA, DEVT_TOTAL, DEVT_ANULADO, SUBSTRING(DEVT_OBS FROM 1 FOR 255), DEVT_SUCURSAL
        FROM DEVOLUCIONES_VENTAS D, BODEGA B, PUNTO_VENTA P, VENDEDORES V, PREFIJOS PR WHERE D.PTVT_ID >= :PTOINI AND D.PTVT_ID <= :PTOFIN AND
         D.BODE_COD = B.BODE_COD AND D.PTVT_ID = P.PTVT_ID AND D.VEND_COD = V.VEND_COD AND D.PREF_PRE >= :PREINI AND D.PREF_PRE <= :PREFIN AND DEVT_NUMERO >= :NUMINI AND DEVT_NUMERO <= :NUMFIN
         AND PR.PREF_PRE = D.PREF_PRE AND PR.TIDO_COD = 33 AND ((PR.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
        ORDER BY D.PREF_PRE, DEVT_NUMERO
        INTO :ID, :PREF, :NUMERO, :FECHA, :VENCE, :CODBOD, :NOMBOD, :AUTORIZA, :PTVTID, :PTVTNOM, :VENDCOD, :VENDNOM, :COMIPORC, :COMIMONTO, :NIT, :NOMTERCERO, :PEDIDO, :COTIZACI, :REMISION, :DTOPOR, :DTOMONTO, :ADICIONAL, :IVAMONTO, :RTFTEPOR, :RTFTEMONTO, :RTIVAPOR, :RTIVAMONTO, :RTICAPOR, :RTICAMONTO, :EXTRA, :DTOFPOR, :DTOFMONTO, :DTOFFECHA, :TOTAL, :ANULADO, :OBS, :sucursal
        DO
        BEGIN
        if ((ANULADOS = 'S') or (ANULADO = 'N')) then
            BEGIN
            if (anulado = 'S') then
                BEGIN
                COMIPORC = 0;
                COMIMONTO = 0;
                DTOPOR = 0;
                DTOMONTO = 0;
                ADICIONAL = 0;
                IVAMONTO = 0;
                RTFTEPOR = 0;
                RTFTEMONTO = 0;
                RTIVAPOR = 0;
                RTIVAMONTO = 0;
                RTICAPOR = 0;
                RTICAMONTO = 0;
                EXTRA = 0;
                DTOFPOR = 0;
                DTOFMONTO = 0;
                TOTAL = 0;
                END
            if (DETALLE = 'S') then
                BEGIN
                if (anulado = 'S') then
                    BEGIN
                    ITEM = 0;
                    ARTICULO = '';
                    CODBAR = '';
                    ARTIDES = '';
                    CANT = 0;
                    UNIDAD = '';
                    BODITEM = '';
                    LOTE = '';
                    REFERENCIA = '';
                    PRECIO = 0;
                    DTOPORCIT = 0;
                    DTOMONTOIT = 0;
                    IVAPORCIT = 0;
                    IVAMONTOIT = 0;
                    CONSUMOIT = 0;
                    SUBTOTALIT = 0;
                    SUSPEND;
                    END
                ELSE
                    BEGIN
                    FOR SELECT DVDE_ITEM, ARTI_COD, DVDE_CODBAR, SUBSTRING(DVDE_DESC FROM 1 FOR 60), DVDE_CANT, DVDE_UNIDAD, BODE_COD, DVDE_LOTE, DVDE_REFERENCIA, DVDE_PRUNIT, DVDE_DTOPORC, DVDE_DTOMONTO, DVDE_IVAPORC, DVDE_IVAMONTO, DVDE_CONSUMO, DVDE_TOTAL
                        FROM DEVOLUCIONES_VENTAS_DETALLE
                        WHERE DEVT_ID = :ID and substring(arti_cod from 1 FOR 2) <> '.t'
                        ORDER BY DVDE_ITEM
                        INTO :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :BODITEM, :LOTE, :REFERENCIA, :PRECIO, :DTOPORCIT, :DTOMONTOIT, :IVAPORCIT, :IVAMONTOIT, :CONSUMOIT, :SUBTOTALIT
                        DO
                        SUSPEND;
                    END
                END
            ELSE
                SUSPEND;
            END
        END
    END
  if (BIN_AND(TIPO, 8) <> 0) then
    BEGIN
    SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 34 INTO :NOMTIPO;
    /* PEDIDO */
    FOR SELECT PEDI_ID, P.PREF_PRE, PEDI_NUMERO, PEDI_FECHA, PEDI_FECHA, '', '', '', P.PTVT_ID, PTVT_NOM, P.VEND_COD, VEND_NOMBRE, 0, 0, P.TERC_NIT, PEDI_NOMTERC, '', '', '', PEDI_DTOPOR, PEDI_DTOMONTO, PEDI_ADICIONAL, PEDI_IVAMONTO, 0, 0, 0, 0, 0, 0, PEDI_EXTRA, 0, 0, PEDI_FECHA, PEDI_TOTAL, PEDI_ANULADO, SUBSTRING(PEDI_OBS FROM 1 FOR 255), PEDI_SUCURSAL
        FROM PEDIDOS P, PUNTO_VENTA PT, VENDEDORES V, PREFIJOS PR WHERE P.PTVT_ID >= :PTOINI AND P.PTVT_ID <= :PTOFIN AND
         P.PTVT_ID = PT.PTVT_ID AND P.VEND_COD = V.VEND_COD AND P.PREF_PRE >= :PREINI AND P.PREF_PRE <= :PREFIN AND PEDI_NUMERO >= :NUMINI AND PEDI_NUMERO <= :NUMFIN
         AND PR.PREF_PRE = P.PREF_PRE AND PR.TIDO_COD = 34 AND ((PR.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
        ORDER BY P.PREF_PRE, PEDI_NUMERO
        INTO :ID, :PREF, :NUMERO, :FECHA, :VENCE, :CODBOD, :NOMBOD, :AUTORIZA, :PTVTID, :PTVTNOM, :VENDCOD, :VENDNOM, :COMIPORC, :COMIMONTO, :NIT, :NOMTERCERO, :PEDIDO, :COTIZACI, :REMISION, :DTOPOR, :DTOMONTO, :ADICIONAL, :IVAMONTO, :RTFTEPOR, :RTFTEMONTO, :RTIVAPOR, :RTIVAMONTO, :RTICAPOR, :RTICAMONTO, :EXTRA, :DTOFPOR, :DTOFMONTO, :DTOFFECHA, :TOTAL, :ANULADO, :OBS, :sucursal
        DO
        BEGIN
        if ((ANULADOS = 'S') or (ANULADO = 'N')) then
            BEGIN
            if (anulado = 'S') then
                BEGIN
                COMIPORC = 0;
                COMIMONTO = 0;
                DTOPOR = 0;
                DTOMONTO = 0;
                ADICIONAL = 0;
                IVAMONTO = 0;
                RTFTEPOR = 0;
                RTFTEMONTO = 0;
                RTIVAPOR = 0;
                RTIVAMONTO = 0;
                RTICAPOR = 0;
                RTICAMONTO = 0;
                EXTRA = 0;
                DTOFPOR = 0;
                DTOFMONTO = 0;
                TOTAL = 0;
                END
            if (DETALLE = 'S') then
                BEGIN
                if (anulado = 'S') then
                    BEGIN
                    ITEM = 0;
                    ARTICULO = '';
                    CODBAR = '';
                    ARTIDES = '';
                    CANT = 0;
                    UNIDAD = '';
                    BODITEM = '';
                    LOTE = '';
                    REFERENCIA = '';
                    PRECIO = 0;
                    DTOPORCIT = 0;
                    DTOMONTOIT = 0;
                    IVAPORCIT = 0;
                    IVAMONTOIT = 0;
                    CONSUMOIT = 0;
                    SUBTOTALIT = 0;
                    SUSPEND;
                    END
                ELSE
                    BEGIN
                    FOR SELECT PEDE_ITEM, ARTI_COD, PEDE_CODBAR, SUBSTRING(PEDE_DESC FROM 1 FOR 60), PEDE_CANT, PEDE_UNIDAD, '', '', PEDE_REFERENCIA, PEDE_PRUNIT, PEDE_DTOPORC, PEDE_DTOMONTO, PEDE_IVAPORC, PEDE_IVAMONTO, PEDE_CONSUMO, PEDE_TOTAL
                        FROM PEDIDOS_DETALLE
                        WHERE PEDI_ID = :ID
                        ORDER BY PEDE_ITEM
                        INTO :ITEM, :ARTICULO, :CODBAR, :artides, :CANT, :UNIDAD, :BODITEM, :LOTE, :REFERENCIA, :PRECIO, :DTOPORCIT, :DTOMONTOIT, :IVAPORCIT, :IVAMONTOIT, :CONSUMOIT, :SUBTOTALIT
                        DO
                        SUSPEND;
                    END
                END
            ELSE
                SUSPEND;
            END
        END
    END
  if (BIN_AND(TIPO, 16) <> 0) then
    BEGIN
    SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 35 INTO :NOMTIPO;
    FOR SELECT COTI_ID, C.PREF_PRE, COTI_NUMERO, COTI_FECHA, COTI_FECHA, '', '', '', C.PTVT_ID, PTVT_NOM, C.VEND_COD, VEND_NOMBRE, 0, 0, C.TERC_NIT, COTI_NOMTERC, '', '', '', COTI_DTOPORC, COTI_DTOMONTO, COTI_ADICIONAL, COTI_IVAMONTO, 0, 0, 0, 0, 0, 0, COTI_EXTRA, 0, 0, COTI_FECHA, COTI_TOTAL, COTI_ANULADO, SUBSTRING(COTI_OBS FROM 1 FOR 255), COTI_SUCURSAL
        FROM COTIZACIONES C, PUNTO_VENTA P, VENDEDORES V, PREFIJOS PR WHERE C.PTVT_ID >= :PTOINI AND C.PTVT_ID <= :PTOFIN AND
         C.PTVT_ID = P.PTVT_ID AND C.VEND_COD = V.VEND_COD AND C.PREF_PRE >= :PREINI AND C.PREF_PRE <= :PREFIN AND COTI_NUMERO >= :NUMINI AND COTI_NUMERO <= :NUMFIN
         AND PR.PREF_PRE = C.PREF_PRE AND PR.TIDO_COD = 35 AND ((PR.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
        ORDER BY C.PREF_PRE, COTI_NUMERO
        INTO :ID, :PREF, :NUMERO, :FECHA, :VENCE, :CODBOD, :NOMBOD, :AUTORIZA, :PTVTID, :PTVTNOM, :VENDCOD, :VENDNOM, :COMIPORC, :COMIMONTO, :NIT, :NOMTERCERO, :PEDIDO, :COTIZACI, :REMISION, :DTOPOR, :DTOMONTO, :ADICIONAL, :IVAMONTO, :RTFTEPOR, :RTFTEMONTO, :RTIVAPOR, :RTIVAMONTO, :RTICAPOR, :RTICAMONTO, :EXTRA, :DTOFPOR, :DTOFMONTO, :DTOFFECHA, :TOTAL, :ANULADO, :OBS, :sucursal
        DO
        BEGIN
        if ((ANULADOS = 'S') or (ANULADO = 'N')) then
            BEGIN
            if (anulado = 'S') then
                BEGIN
                COMIPORC = 0;
                COMIMONTO = 0;
                DTOPOR = 0;
                DTOMONTO = 0;
                ADICIONAL = 0;
                IVAMONTO = 0;
                RTFTEPOR = 0;
                RTFTEMONTO = 0;
                RTIVAPOR = 0;
                RTIVAMONTO = 0;
                RTICAPOR = 0;
                RTICAMONTO = 0;
                EXTRA = 0;
                DTOFPOR = 0;
                DTOFMONTO = 0;
                TOTAL = 0;
                END
            if (DETALLE = 'S') then
                BEGIN
                if (anulado = 'S') then
                    BEGIN
                    ITEM = 0;
                    ARTICULO = '';
                    CODBAR = '';
                    ARTIDES = '';
                    CANT = 0;
                    UNIDAD = '';
                    BODITEM = '';
                    LOTE = '';
                    REFERENCIA = '';
                    PRECIO = 0;
                    DTOPORCIT = 0;
                    DTOMONTOIT = 0;
                    IVAPORCIT = 0;
                    IVAMONTOIT = 0;
                    CONSUMOIT = 0;
                    SUBTOTALIT = 0;
                    SUSPEND;
                    END
                ELSE
                    BEGIN
                    FOR SELECT CTDE_ITEM, ARTI_COD, CTDE_CODBAR, SUBSTRING(CTDE_DESC FROM 1 FOR 60), CTDE_CANT, CTDE_UNIDAD, '', '', CTDE_REFERENCIA, CTDE_PRUNIT, CTDE_DTOPORC, CTDE_DTOMONTO, CTDE_IVAPORC, CTDE_IVAMONTO, CTDE_CONSUMO, CTDE_TOTAL
                        FROM COTIZACIONES_DETALLE
                        WHERE COTI_ID = :ID
                        ORDER BY CTDE_ITEM
                        INTO :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :BODITEM, :LOTE, :REFERENCIA, :PRECIO, :DTOPORCIT, :DTOMONTOIT, :IVAPORCIT, :IVAMONTOIT, :CONSUMOIT, :SUBTOTALIT
                        DO
                        SUSPEND;
                    END
                END
            ELSE
                SUSPEND;
            END
        END
    END
END
^

SET TERM ; ^


/* 20101119C */
/* PERMITA ARREGLAR UN COSTO EN UNA ENTRADA SIN DESHACER TODO EL MOVIMIENTO PARA EVITAR VALIDACIONES DE EXISTENCIAS Y LOTES */
SET TERM ^ ;

CREATE OR ALTER TRIGGER ENTRADAS_DETALLE_AU FOR ENTRADAS_DETALLE
ACTIVE AFTER UPDATE POSITION 0
as
declare variable fec date;
declare variable CONC VARCHAR(60);
declare variable Pref varchar(4);
declare variable Num varchar(6);
declare variable Nit varchar(20);
declare variable factor numeric(18,4);
declare variable IVAINC CHAR(2);
declare variable ICOINC CHAR(2);
declare variable COSTO NUMERIC(18,2);
declare variable IDMOV integer;
BEGIN
if ((old.ende_anulado = new.ende_anulado) and (old.arti_cod = new.arti_cod) and (old.bode_cod = new.bode_cod) and
    (old.ende_cant = new.ende_cant) and (old.ende_unidad = new.ende_unidad) and (old.ende_lote = new.ende_lote) and
    (old.entr_id = new.entr_id) and (old.ende_item = new.ende_item) and (old.ende_costo <> new.ende_costo)) then
    begin
    /* si solo cambio el costo */
    select mvar_cons, mvar_fecha from MOVIMIENTO_ARTICULO WHERE MVAR_TIPODOC = 11 AND MVAR_IDREF = NEW.entr_id
        AND MVAR_ITEM = NEW.ende_item into :idmov, :fec;
    execute procedure factor_unidad_cant(new.arti_cod, new.ende_unidad) returning_values(factor);
    COSTO = ((new.ende_costo - NEW.ende_dtomonto) / :factor);
    if (IVAINC = 'S') then
        BEGIN
        EXECUTE PROCEDURE lee_configuracion ('FACTURACION', 'ARTICULOS', 'IMPOCONSUMO INCLUIDO EN EL PRECIO BASE DE VENTA ANTES DE IVA') returning_values(:icoinc);
        if (icoinc = 'SI') then
            COSTO = COSTO - NEW.ende_consumo;
        COSTO = COSTO / (1 + NEW.ende_ivaporc/100);
        END
    UPDATE MOVIMIENTO_ARTICULO SET MVAR_COSTO = :costo WHERE MVAR_CONS = :IDMOV;
    EXECUTE PROCEDURE actualice_costo(old.arti_cod, :fec, :costo, old.ende_cant*:factor, 'S', 'S', :IDMOV, 11);

    EXECUTE PROCEDURE actualice_costo(new.arti_cod, :fec, :costo, new.ende_cant*:factor, 'S', 'N', :IDMOV, 11);
    if (exists (SELECT cost_fecha from costos WHERE (arti_cod = new.arti_cod) AND (cost_fecha > :fec))) then
        EXECUTE PROCEDURE chequeo_costos(NEW.arti_cod, :fec + 1);
    end

if ((OLD.entr_id <> 0) AND (OLD.ende_anulado = 'N')) then
    DELETE FROM MOVIMIENTO_ARTICULO WHERE (mvar_tipodoc = 11) and (mvar_idref = new.entr_id) and (mvar_item = old.ende_item);
if ((NEW.entr_id <> 0) AND (NEW.ende_anulado = 'N')) then
    begin
    select entr_fecha, entr_conc, pref_pre, entr_numero, terc_nit, entr_imptos
        from entradas where entr_id = new.entr_id
        into :fec, :conc, :Pref, :Num, :Nit, :ivainc;
    execute procedure factor_unidad_cant(new.arti_cod, new.ende_unidad) returning_values(factor);
    COSTO = ((new.ende_costo - NEW.ende_dtomonto) / :factor);
    if (IVAINC = 'S') then
        BEGIN
        EXECUTE PROCEDURE lee_configuracion ('FACTURACION', 'ARTICULOS', 'IMPOCONSUMO INCLUIDO EN EL PRECIO BASE DE VENTA ANTES DE IVA') returning_values(:icoinc);
        if (icoinc = 'SI') then
            COSTO = COSTO - NEW.ende_consumo;
        COSTO = COSTO / (1 + NEW.ende_ivaporc/100);
        END
    INSERT INTO MOVIMIENTO_ARTICULO
        (ARTI_COD, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM, TERC_NIT)
        VALUES(NEW.ARTI_COD, NEW.BODE_COD, :FEC, 11, NEW.entr_id,
        :CONC, :factor * new.ende_cant, :COSTO, 'S', new.ende_lote, :Pref, :Num, new.ende_item, :Nit);
    /* RECORRA LAS LISTAS DE PRECIOS Y CAMBIE EL PRECIO */
    EXECUTE PROCEDURE CALCULA_PRECIOS(NEW.ARTI_COD, :FEC);
    /* ACTUALICE EL STAND */
    if (new.ende_stand is not null) then
      if (exists(select stand_cod from stands where arti_cod = new.arti_cod and stand_bodega = new.bode_cod)) then
        UPDATE stands set stand_cod = new.ende_stand where arti_cod = new.arti_cod and stand_bodega = new.bode_cod;
      else
        INSERT INTO stands (ARTI_COD, STAND_BODEGA, STAND_COD) VALUES (NEW.arti_cod, NEW.bode_cod, NEW.ende_stand);
    END
END
^

SET TERM ; ^


CREATE TABLE CAMBIA_COSTOS (
    CAMC_ID T_ID NOT NULL,
    CAMC_ITEM T_ID NOT NULL,
    ARTI_COD T_COD_ARTICULO,
    CAMC_COSTOV T_MONTO,
    CAMC_COSTON T_MONTO,
    CAMC_FECHA DATE,
    CAMC_IDENT T_ID,
    CAMC_ITEMENT T_ID,
    CAMC_NUMEROENT T_NUMDOC,
    CAMC_PREFENT VARCHAR(4));
alter table CAMBIA_COSTOS
add constraint PK_CAMBIA_COSTOS
primary key (CAMC_ID,CAMC_ITEM);

grant select, delete, insert, update on cambia_costos to PUBLIC;

SET TERM ^ ;

create trigger CAMBIA_COSTOS_AI for CAMBIA_COSTOS
active AFTER INSERT position 0
as
begin
UPDATE ENTRADAS_DETALLE SET ENDE_COSTO = NEW.camc_coston
    WHERE ENTR_ID = NEW.camc_ident AND ENDE_ITEM = NEW.camc_itement;
end
^

SET TERM ; ^

SET TERM ^ ;

create trigger CAMBIA_COSTOS_AU for CAMBIA_COSTOS
active AFTER UPDATE position 0
as
begin
UPDATE ENTRADAS_DETALLE SET ENDE_COSTO = NEW.camc_coston
    WHERE ENTR_ID = NEW.camc_ident AND ENDE_ITEM = NEW.camc_itement;
end
^

SET TERM ; ^

SET TERM ^ ;

create trigger CAMBIA_COSTOS_AD for CAMBIA_COSTOS
active AFTER DELETE position 0
as
begin
UPDATE ENTRADAS_DETALLE SET ENDE_COSTO = OLD.camc_costov
    WHERE ENTR_ID = OLD.camc_ident AND ENDE_ITEM = OLD.camc_itement;
end
^

SET TERM ; ^

/* 20101120 */
/* DETALLAR DEC2799 Y RETENCIONES COMO DATOS NUEVOS IMPRIMIBLES */
SET TERM ^ ;

CREATE OR ALTER PROCEDURE CIERRE_FACTURACION (
    fecha date,
    punto integer,
    prefijo varchar(4))
returns (
    pref varchar(4),
    autoriza varchar(20),
    puntovta varchar(60),
    numini varchar(6),
    numfin varchar(6),
    nrofac integer,
    horaini time,
    horafin time,
    basefac numeric(18,2),
    ivafac numeric(18,2),
    dec2799f numeric(18,2),
    totalfac numeric(18,2),
    nroite integer,
    nrodev integer,
    basedev numeric(18,2),
    ivadev numeric(18,2),
    dec2799d numeric(18,2),
    totaldev numeric(18,2),
    baseneto numeric(18,2),
    ivaneto numeric(18,2),
    dec2799n numeric(18,2),
    totalneto numeric(18,2),
    basef0 numeric(18,2),
    ivaf0 numeric(18,2),
    dec2799f0 numeric(18,2),
    totalf0 numeric(18,2),
    based0 numeric(18,2),
    ivad0 numeric(18,2),
    dec2799d0 numeric(18,2),
    totald0 numeric(18,2),
    basef1 numeric(18,2),
    ivaf1 numeric(18,2),
    dec2799f1 numeric(18,2),
    totalf1 numeric(18,2),
    based1 numeric(18,2),
    ivad1 numeric(18,2),
    dec2799d1 numeric(18,2),
    totald1 numeric(18,2),
    basef2 numeric(18,2),
    ivaf2 numeric(18,2),
    dec2799f2 numeric(18,2),
    totalf2 numeric(18,2),
    based2 numeric(18,2),
    ivad2 numeric(18,2),
    dec2799d2 numeric(18,2),
    totald2 numeric(18,2),
    basef3 numeric(18,2),
    ivaf3 numeric(18,2),
    dec2799f3 numeric(18,2),
    totalf3 numeric(18,2),
    based3 numeric(18,2),
    ivad3 numeric(18,2),
    dec2799d3 numeric(18,2),
    totald3 numeric(18,2),
    basef4 numeric(18,2),
    ivaf4 numeric(18,2),
    dec2799f4 numeric(18,2),
    totalf4 numeric(18,2),
    based4 numeric(18,2),
    ivad4 numeric(18,2),
    dec2799d4 numeric(18,2),
    totald4 numeric(18,2),
    formap1 numeric(18,2),
    formap2 numeric(18,2),
    formap3 numeric(18,2),
    formap4 numeric(18,2),
    formap5 numeric(18,2),
    formap6 numeric(18,2),
    formap7 numeric(18,2),
    formap8 numeric(18,2),
    formap9 numeric(18,2),
    formap10 numeric(18,2),
    formap11 numeric(18,2),
    formap12 numeric(18,2),
    cartera numeric(18,2),
    retes numeric(18,2),
    vendedor1 varchar(60),
    vtavend1 numeric(18,2),
    vendedor2 varchar(60),
    vtavend2 numeric(18,2),
    vendedor3 varchar(60),
    vtavend3 numeric(18,2),
    vendedor4 varchar(60),
    vtavend4 numeric(18,2),
    vendedor5 varchar(60),
    vtavend5 numeric(18,2),
    nrofactanul integer,
    ivanul numeric(18,2),
    totalfacanul numeric(18,2))
as
declare variable tarifa numeric(9,2);
declare variable basef numeric(18,2);
declare variable ivaf numeric(18,2);
declare variable dec2799af numeric(18,2);
declare variable totalf numeric(18,2);
declare variable basedv numeric(18,2);
declare variable ivad numeric(18,2);
declare variable dec2799ad numeric(18,2);
declare variable totald numeric(18,2);
declare variable i integer;
declare variable codven integer;
declare variable vended varchar(60);
declare variable r_iddoc integer;
declare variable f_id integer;
declare variable f_total numeric(18,2);
declare variable factor numeric(18,4);
declare variable ajuste integer;
begin
AJUSTE = 0;
if (PREFIJO <> '') then
  SELECT PREF_PRE, AUTO_NUMERO FROM AUTORIZACIONES WHERE PREF_PRE = :PREFIJO INTO :PREF, :autoriza;
SELECT PTVT_NOM FROM PUNTO_VENTA WHERE PTVT_ID = :punto INTO :puntovta;
SELECT MIN(AUDI_HORA) FROM AUDITORIA WHERE TIDO_COD = 131 AND AUDI_FECHA = :FECHA INTO :HORAINI;
HORAFIN = CAST('NOW' AS TIME);
  /* LAS VENTAS */
  SELECT MIN(FACT_NUMERO), MAX(FACT_NUMERO), COUNT(FACT_NUMERO), SUM(FACT_TOTAL - FACT_IVAMONTO + FACT_DEC2799), SUM(FACT_IVAMONTO), SUM(FACT_TOTAL), sum(fact_dec2799)
    FROM FACTURAS WHERE FACT_FECHA = :FECHA AND PTVT_ID = :PUNTO AND ((PREF_PRE = :PREFIJO) or (:PREFIJO = '')) and FACT_ANULADO = 'N'
    INTO :NUMINI, :NUMFIN, :NROFAC, :BASENETO, :IVANETO, :TOTALNETO, :dec2799f;
  if (dec2799f is null) then
    dec2799f = 0;
  SELECT COUNT(FADE_ITEM), SUM(FADE_TOTAL-FADE_IVAMONTO), SUM(FADE_IVAMONTO), SUM(FADE_TOTAL)
    FROM facturas_detalle D, FACTURAS F
    WHERE D.FACT_ID = F.FACT_ID AND FACT_FECHA = :FECHA AND PTVT_ID = :PUNTO AND ((PREF_PRE = :PREFIJO) or (:PREFIJO = '')) AND FADE_CANT > 0 and FACT_ANULADO = 'N' and substring(d.arti_cod from 1 FOR 2) <> '.t'
    INTO :nroite, :BASEFAC, :IVAFAC, :TOTALFAC;
  totalfac = totalfac - dec2799f;
/*  ivafac = ivafac - dec2799f; */
  SELECT COUNT(FADE_ITEM), SUM(FADE_IVAMONTO-FADE_TOTAL), SUM(FADE_IVAMONTO*-1), SUM(FADE_TOTAL*-1)
    FROM facturas_detalle D, FACTURAS F
    WHERE D.FACT_ID = F.FACT_ID AND FACT_FECHA = :FECHA AND PTVT_ID = :PUNTO AND ((PREF_PRE = :PREFIJO) or (:PREFIJO = '')) AND FADE_CANT < 0 and FACT_ANULADO = 'N' and substring(d.arti_cod from 1 FOR 2) <> '.t'
    INTO :NRODEV, :BASEDEV, :IVADEV, :TOTALDEV;
  SELECT COUNT(DVDE_ITEM), SUM(DVDE_TOTAL-DVDE_IVAMONTO), SUM(DVDE_IVAMONTO), SUM(DVDE_TOTAL)
    FROM devoluciones_ventas_detalle D, devoluciones_ventas F
    WHERE D.DEVT_ID = F.DEVT_ID AND DEVT_FECHA = :FECHA AND PTVT_ID = :PUNTO AND DEVT_ANULADO = 'N' and substring(d.arti_cod from 1 FOR 2) <> '.t'
    INTO :I, :BASEDV, :IVAD, :TOTALD;
  select sum(devt_dec2799) FROM devoluciones_ventas WHERE DEVT_FECHA = :FECHA AND PTVT_ID = :PUNTO AND DEVT_ANULADO = 'N' into :dec2799d;
  if (dec2799d is null) then
    dec2799d = 0;
  totald = totald - dec2799d;
/*  ivad = ivad - dec2799; */
  DEC2799N = DEC2799F - DEC2799D;
  SELECT COUNT(FACT_NUMERO),SUM(FACT_TOTAL - FACT_IVAMONTO), SUM(FACT_IVAMONTO) FROM FACTURAS
    WHERE FACT_FECHA = :FECHA AND PTVT_ID = :PUNTO AND ((PREF_PRE = :PREFIJO) or (:PREFIJO = '')) and FACT_ANULADO = 'S'
    INTO :NROFACTANUL, :TOTALFACANUL, :IVANUL;
  if (nrofac is null) then
    nrofac = 0;
  if (NROFACTANUL is null) then
    NROFACTANUL = 0;
  if (TOTALFACANUL is null) then
    TOTALFACANUL = 0;
  if (IVANUL is null) then
    IVANUL = 0;
  if (baseneto is null) then
    baseneto = 0;
  if (ivaneto is null) then
    ivaneto = 0;
  if (totalneto is null) then
    totalneto = 0;
  if (nroite is null) then
    nroite = 0;
  if (basefac is null) then
    basefac = 0;
  if (ivafac is null) then
    ivafac = 0;
  if (totalfac is null) then
    totalfac = 0;
  if (nrodev is null) then
    nrodev = 0;
  if (basedev is null) then
    basedev = 0;
  if (ivadev is null) then
    ivadev = 0;
  if (totaldev is null) then
    totaldev = 0;
  if (I is null) then
    I = 0;
  if (basedv is null) then
    basedv = 0;
  if (ivad is null) then
    ivad = 0;
  if (totald is null) then
    totald = 0;
  NRODEV = NRODEV + I;
  BASENETO = BASENETO - BASEDV;
  IVANETO = IVANETO - IVAD;
  TOTALNETO = TOTALNETO - TOTALD;

  BASEDEV = BASEDEV + BASEDV;
  IVADEV = IVADEV + IVAD;
  TOTALDEV = TOTALDEV + TOTALD;

  /* POR TARIFA DE IVA */
  I = 0;
  BASEF0 = 0;
  BASED0 = 0;
  IVAF0 = 0;
  IVAD0 = 0;
  DEC2799F0 = 0;
  DEC2799D0 = 0;
  TOTALF0 = 0;
  TOTALD0 = 0;
  BASEF1 = 0;
  BASED1 = 0;
  IVAF1 = 0;
  IVAD1 = 0;
  DEC2799F1 = 0;
  DEC2799D1 = 0;
  TOTALF1 = 0;
  TOTALD1 = 0;
  BASEF2 = 0;
  BASED2 = 0;
  IVAF2 = 0;
  IVAD2 = 0;
  DEC2799F2 = 0;
  DEC2799D2 = 0;
  TOTALF2 = 0;
  TOTALD2 = 0;
  BASEF3 = 0;
  BASED3 = 0;
  IVAF3 = 0;
  IVAD3 = 0;
  DEC2799F3 = 0;
  DEC2799D3 = 0;
  TOTALF3 = 0;
  TOTALD3 = 0;
  BASEF4 = 0;
  BASED4 = 0;
  IVAF4 = 0;
  IVAD4 = 0;
  DEC2799F4 = 0;
  DEC2799D4 = 0;
  TOTALF4 = 0;
  TOTALD4 = 0;
  vtavend1 = 0;
  vtavend2 = 0;
  vtavend3 = 0;
  vtavend4 = 0;
  vtavend5 = 0;
  FOR SELECT TAIV_PORC FROM TARIFA_IVA ORDER BY TAIV_PORC INTO :TARIFA DO
    BEGIN
    I = I + 1;
    SELECT SUM(FADE_TOTAL-FADE_IVAMONTO), SUM(FADE_IVAMONTO), SUM(FADE_TOTAL) FROM facturas_detalle D, FACTURAS F
        WHERE D.FACT_ID = F.FACT_ID AND FACT_FECHA = :FECHA AND PTVT_ID = :PUNTO AND ((PREF_PRE = :PREFIJO) or (:PREFIJO = '')) AND FADE_CANT > 0 AND FADE_IVAPORC = :TARIFA and FACT_ANULADO = 'N'
        INTO :BASEF, :IVAF, :TOTALF;
    SELECT SUM(FADE_TOTAL-FADE_IVAMONTO), SUM(FADE_IVAMONTO), SUM(FADE_TOTAL) FROM facturas_detalle D, FACTURAS F
        WHERE D.FACT_ID = F.FACT_ID AND FACT_FECHA = :FECHA AND PTVT_ID = :PUNTO AND ((PREF_PRE = :PREFIJO) or (:PREFIJO = '')) AND FADE_CANT < 0 AND FADE_IVAPORC = :TARIFA and FACT_ANULADO = 'N'
        INTO :BASEDV, :IVAD, :TOTALD;
    if (basef is null) then
        basef = 0;
    if (ivaf is null) then
        ivaf = 0;
    if (totalf is null) then
        totalf = 0;
    if (basedv is null) then
        basedv = 0;
    if (ivad is null) then
        ivad = 0;
    if (totald is null) then
        totald = 0;
    SELECT SUM(FADE_IVAMONTO) FROM ARTICULO A, facturas_detalle D, FACTURAS F
        WHERE D.FACT_ID = F.FACT_ID AND FACT_FECHA = :FECHA AND PTVT_ID = :PUNTO AND ((PREF_PRE = :PREFIJO) or (:PREFIJO = '')) AND FADE_CANT > 0 AND FADE_IVAPORC = :TARIFA and FACT_ANULADO = 'N'
        AND D.ARTI_COD = A.ARTI_COD AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL)) AND A.arti_dec2799 = 'S'
        INTO DEC2799af;
    if (dec2799af is null) then
        dec2799af = 0;
    SELECT SUM(FADE_IVAMONTO) FROM ARTICULO A, facturas_detalle D, FACTURAS F
        WHERE D.FACT_ID = F.FACT_ID AND FACT_FECHA = :FECHA AND PTVT_ID = :PUNTO AND ((PREF_PRE = :PREFIJO) or (:PREFIJO = '')) AND FADE_CANT < 0 AND FADE_IVAPORC = :TARIFA and FACT_ANULADO = 'N'
        AND D.ARTI_COD = A.ARTI_COD AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL)) AND A.arti_dec2799 = 'S'
        INTO DEC2799ad;
    if (dec2799ad is null) then
        dec2799ad = 0;
    FACTOR = 1;
    SELECT AJCI_FACTOR FROM ajuste_cierre WHERE AJCI_PORC = :TARIFA AND AJCI_FECINI <= :FECHA AND AJCI_FECFIN >= :FECHA INTO :FACTOR;
    if (FACTOR IS null) then
        FACTOR = 1;
    if (FACTOR <> 1) then
        AJUSTE = 1;
    BASEF = BASEF * FACTOR;
    BASEDV = BASEDV * FACTOR;
    IVAF = IVAF * FACTOR;
    IVAD = IVAD * FACTOR;
    TOTALF = TOTALF * FACTOR;
    TOTALD = TOTALD * FACTOR;
    DEC2799af = DEC2799af * FACTOR;
    DEC2799ad = DEC2799ad * FACTOR;

    if (I = 1) then
        BEGIN
        BASEF0 = BASEF;
        BASED0 = :BASEDV;
        IVAF0 = IVAF;
        IVAD0 = IVAD;
        DEC2799F0 = DEC2799AF;
        DEC2799D0 = DEC2799AD;
        TOTALF0 = TOTALF;
        TOTALD0 = TOTALD;
        SELECT SUM(DVDE_TOTAL-DVDE_IVAMONTO), SUM(DVDE_IVAMONTO), SUM(DVDE_TOTAL) FROM devoluciones_ventas_detalle D, devoluciones_ventas F
            WHERE D.DEVT_ID = F.DEVT_ID AND DEVT_FECHA = :FECHA AND PTVT_ID = :PUNTO AND DVDE_IVAPORC = :TARIFA and DEVT_ANULADO = 'N'
            INTO :BASEDV, :IVAD, :TOTALD;
        SELECT SUM(DVDE_IVAMONTO) FROM devoluciones_ventas_detalle D, devoluciones_ventas F, ARTICULO A
            WHERE D.DEVT_ID = F.DEVT_ID AND DEVT_FECHA = :FECHA AND PTVT_ID = :PUNTO AND DVDE_IVAPORC = :TARIFA and DEVT_ANULADO = 'N'
            AND D.ARTI_COD = A.ARTI_COD AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL)) AND A.arti_dec2799 = 'S'
            INTO :DEC2799AD;
        if (dec2799ad is null) then
            dec2799ad = 0;
        DEC2799D0 = DEC2799D0 + DEC2799AD;
        if (basedv is null) then
            basedv = 0;
        if (ivad is null) then
            ivad = 0;
        if (totald is null) then
            totald = 0;
        BASED0 = BASED0 - BASEDV;
        IVAD0 = IVAD0 - IVAD;
        TOTALD0 = TOTALD0 - TOTALD;
        END
    if (I = 2) then
        BEGIN
        BASEF1 = BASEF;
        BASED1 = :BASEDV;
        IVAF1 = IVAF;
        IVAD1 = IVAD;
        DEC2799F1 = DEC2799AF;
        DEC2799D1 = DEC2799AD;
        TOTALF1 = TOTALF;
        TOTALD1 = TOTALD;
        SELECT SUM(DVDE_TOTAL-DVDE_IVAMONTO), SUM(DVDE_IVAMONTO), SUM(DVDE_TOTAL) FROM devoluciones_ventas_detalle D, devoluciones_ventas F
            WHERE D.DEVT_ID = F.DEVT_ID AND DEVT_FECHA = :FECHA AND PTVT_ID = :PUNTO AND DVDE_IVAPORC = :TARIFA and DEVT_ANULADO = 'N'
            INTO :BASEDV, :IVAD, :TOTALD;
        SELECT SUM(DVDE_IVAMONTO) FROM devoluciones_ventas_detalle D, devoluciones_ventas F, ARTICULO A
            WHERE D.DEVT_ID = F.DEVT_ID AND DEVT_FECHA = :FECHA AND PTVT_ID = :PUNTO AND DVDE_IVAPORC = :TARIFA and DEVT_ANULADO = 'N'
            AND D.ARTI_COD = A.ARTI_COD AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL)) AND A.arti_dec2799 = 'S'
            INTO :DEC2799AD;
        if (dec2799ad is null) then
            dec2799ad = 0;
        DEC2799D1 = DEC2799D1 + DEC2799AD;
        if (basedv is null) then
            basedv = 0;
        if (ivad is null) then
            ivad = 0;
        if (totald is null) then
            totald = 0;
        BASED1 = BASED1 - BASEDV;
        IVAD1 = IVAD1 - IVAD;
        TOTALD1 = TOTALD1 - TOTALD;
        END
    if (I = 3) then
        BEGIN
        BASEF2 = BASEF;
        BASED2 = :BASEDV;
        IVAF2 = IVAF;
        IVAD2 = IVAD;
        DEC2799F2 = DEC2799AF;
        DEC2799D2 = DEC2799AD;
        TOTALF2 = TOTALF;
        TOTALD2 = TOTALD;
        SELECT SUM(DVDE_TOTAL-DVDE_IVAMONTO), SUM(DVDE_IVAMONTO), SUM(DVDE_TOTAL) FROM devoluciones_ventas_detalle D, devoluciones_ventas F
            WHERE D.DEVT_ID = F.DEVT_ID AND DEVT_FECHA = :FECHA AND PTVT_ID = :PUNTO AND DVDE_IVAPORC = :TARIFA and DEVT_ANULADO = 'N'
            INTO :BASEDV, :IVAD, :TOTALD;
        SELECT SUM(DVDE_IVAMONTO) FROM devoluciones_ventas_detalle D, devoluciones_ventas F, ARTICULO A
            WHERE D.DEVT_ID = F.DEVT_ID AND DEVT_FECHA = :FECHA AND PTVT_ID = :PUNTO AND DVDE_IVAPORC = :TARIFA and DEVT_ANULADO = 'N'
            AND D.ARTI_COD = A.ARTI_COD AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL)) AND A.arti_dec2799 = 'S'
            INTO :DEC2799AD;
        if (dec2799ad is null) then
            dec2799ad = 0;
        DEC2799D2 = DEC2799D2 + DEC2799AD;
        if (basedv is null) then
            basedv = 0;
        if (ivad is null) then
            ivad = 0;
        if (totald is null) then
            totald = 0;
        BASED2 = BASED2 - BASEDV;
        IVAD2 = IVAD2 - IVAD;
        TOTALD2 = TOTALD2 - TOTALD;
        END
    if (I = 4) then
        BEGIN
        BASEF3 = BASEF;
        BASED3 = :BASEDV;
        IVAF3 = IVAF;
        IVAD3 = IVAD;
        DEC2799F3 = DEC2799AF;
        DEC2799D3 = DEC2799AD;
        TOTALF3 = TOTALF;
        TOTALD3 = TOTALD;
        SELECT SUM(DVDE_TOTAL-DVDE_IVAMONTO), SUM(DVDE_IVAMONTO), SUM(DVDE_TOTAL) FROM devoluciones_ventas_detalle D, devoluciones_ventas F
            WHERE D.DEVT_ID = F.DEVT_ID AND DEVT_FECHA = :FECHA AND PTVT_ID = :PUNTO AND DVDE_IVAPORC = :TARIFA and DEVT_ANULADO = 'N'
            INTO :BASEDV, :IVAD, :TOTALD;
        SELECT SUM(DVDE_IVAMONTO) FROM devoluciones_ventas_detalle D, devoluciones_ventas F, ARTICULO A
            WHERE D.DEVT_ID = F.DEVT_ID AND DEVT_FECHA = :FECHA AND PTVT_ID = :PUNTO AND DVDE_IVAPORC = :TARIFA and DEVT_ANULADO = 'N'
            AND D.ARTI_COD = A.ARTI_COD AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL)) AND A.arti_dec2799 = 'S'
            INTO :DEC2799AD;
        if (dec2799ad is null) then
            dec2799ad = 0;
        DEC2799D3 = DEC2799D3 + DEC2799AD;
        if (basedv is null) then
            basedv = 0;
        if (ivad is null) then
            ivad = 0;
        if (totald is null) then
            totald = 0;
        BASED3 = BASED3 - BASEDV;
        IVAD3 = IVAD3 - IVAD;
        TOTALD3 = TOTALD3 - TOTALD;
        END
    if (I = 5) then
        BEGIN
        BASEF4 = BASEF;
        BASED4 = :BASEDV;
        IVAF4 = IVAF;
        IVAD4 = IVAD;
        DEC2799F4 = DEC2799AF;
        DEC2799D4 = DEC2799AD;
        TOTALF4 = TOTALF;
        TOTALD4 = TOTALD;
        SELECT SUM(DVDE_TOTAL-DVDE_IVAMONTO), SUM(DVDE_IVAMONTO), SUM(DVDE_TOTAL) FROM devoluciones_ventas_detalle D, devoluciones_ventas F
            WHERE D.DEVT_ID = F.DEVT_ID AND DEVT_FECHA = :FECHA AND PTVT_ID = :PUNTO AND DVDE_IVAPORC = :TARIFA and DEVT_ANULADO = 'N'
            INTO :BASEDV, :IVAD, :TOTALD;
        SELECT SUM(DVDE_IVAMONTO) FROM devoluciones_ventas_detalle D, devoluciones_ventas F, ARTICULO A
            WHERE D.DEVT_ID = F.DEVT_ID AND DEVT_FECHA = :FECHA AND PTVT_ID = :PUNTO AND DVDE_IVAPORC = :TARIFA and DEVT_ANULADO = 'N'
            AND D.ARTI_COD = A.ARTI_COD AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL)) AND A.arti_dec2799 = 'S'
            INTO :DEC2799AD;
        if (dec2799ad is null) then
            dec2799ad = 0;
        DEC2799D4 = DEC2799D4 + DEC2799AD;
        if (basedv is null) then
            basedv = 0;
        if (ivad is null) then
            ivad = 0;
        if (totald is null) then
            totald = 0;
        BASED4 = BASED4 - BASEDV;
        IVAD4 = IVAD4 - IVAD;
        TOTALD4 = TOTALD4 - TOTALD;
        END
    END
  /* POR FORMA DE PAGO */
  SELECT SUM(RCPA_MONTO) FROM RECIBOS_CAJA_PAGO P, RECIBOS_CAJA R, PUNTO_VENTA PT
    WHERE R.RECA_ID = P.RECA_ID AND PT.PTVT_ID = :punto AND RECA_FECHA = :FECHA AND PT.caja_id = R.caja_id AND ((PT.PREF_PRE = R.PREF_PRE) or (:PREFIJO = '')) AND FOPA_ID = 1 and RECA_ANULADO = 'N'
    INTO :FORMAP1;
  SELECT SUM(RCPA_MONTO) FROM RECIBOS_CAJA_PAGO P, RECIBOS_CAJA R, PUNTO_VENTA PT
    WHERE R.RECA_ID = P.RECA_ID AND PT.PTVT_ID = :punto AND RECA_FECHA = :FECHA AND PT.caja_id = R.caja_id AND ((PT.PREF_PRE = R.PREF_PRE) or (:PREFIJO = '')) AND FOPA_ID = 2 and RECA_ANULADO = 'N'
    INTO :FORMAP2;
  SELECT SUM(RCPA_MONTO) FROM RECIBOS_CAJA_PAGO P, RECIBOS_CAJA R, PUNTO_VENTA PT
    WHERE R.RECA_ID = P.RECA_ID AND PT.PTVT_ID = :punto AND RECA_FECHA = :FECHA AND PT.caja_id = R.caja_id AND ((PT.PREF_PRE = R.PREF_PRE) or (:PREFIJO = '')) AND FOPA_ID = 3 and RECA_ANULADO = 'N'
    INTO :FORMAP3;
  SELECT SUM(RCPA_MONTO) FROM RECIBOS_CAJA_PAGO P, RECIBOS_CAJA R, PUNTO_VENTA PT
    WHERE R.RECA_ID = P.RECA_ID AND PT.PTVT_ID = :punto AND RECA_FECHA = :FECHA AND PT.caja_id = R.caja_id AND ((PT.PREF_PRE = R.PREF_PRE) or (:PREFIJO = '')) AND FOPA_ID = 4 and RECA_ANULADO = 'N'
    INTO :FORMAP4;
  SELECT SUM(RCPA_MONTO) FROM RECIBOS_CAJA_PAGO P, RECIBOS_CAJA R, PUNTO_VENTA PT
    WHERE R.RECA_ID = P.RECA_ID AND PT.PTVT_ID = :punto AND RECA_FECHA = :FECHA AND PT.caja_id = R.caja_id AND ((PT.PREF_PRE = R.PREF_PRE) or (:PREFIJO = '')) AND FOPA_ID = 5 and RECA_ANULADO = 'N'
    INTO :FORMAP5;
  SELECT SUM(RCPA_MONTO) FROM RECIBOS_CAJA_PAGO P, RECIBOS_CAJA R, PUNTO_VENTA PT
    WHERE R.RECA_ID = P.RECA_ID AND PT.PTVT_ID = :punto AND RECA_FECHA = :FECHA AND PT.caja_id = R.caja_id AND ((PT.PREF_PRE = R.PREF_PRE) or (:PREFIJO = '')) AND FOPA_ID = 6 and RECA_ANULADO = 'N'
    INTO :FORMAP6;
  SELECT SUM(RCPA_MONTO) FROM RECIBOS_CAJA_PAGO P, RECIBOS_CAJA R, PUNTO_VENTA PT
    WHERE R.RECA_ID = P.RECA_ID AND PT.PTVT_ID = :punto AND RECA_FECHA = :FECHA AND PT.caja_id = R.caja_id AND ((PT.PREF_PRE = R.PREF_PRE) or (:PREFIJO = '')) AND FOPA_ID = 7 and RECA_ANULADO = 'N'
    INTO :FORMAP7;
  SELECT SUM(RCPA_MONTO) FROM RECIBOS_CAJA_PAGO P, RECIBOS_CAJA R, PUNTO_VENTA PT
    WHERE R.RECA_ID = P.RECA_ID AND PT.PTVT_ID = :punto AND RECA_FECHA = :FECHA AND PT.caja_id = R.caja_id AND ((PT.PREF_PRE = R.PREF_PRE) or (:PREFIJO = '')) AND FOPA_ID = 8 and RECA_ANULADO = 'N'
    INTO :FORMAP8;
  SELECT SUM(RCPA_MONTO) FROM RECIBOS_CAJA_PAGO P, RECIBOS_CAJA R, PUNTO_VENTA PT
    WHERE R.RECA_ID = P.RECA_ID AND PT.PTVT_ID = :punto AND RECA_FECHA = :FECHA AND PT.caja_id = R.caja_id AND ((PT.PREF_PRE = R.PREF_PRE) or (:PREFIJO = '')) AND FOPA_ID = 9 and RECA_ANULADO = 'N'
    INTO :FORMAP9;
  SELECT SUM(RCPA_MONTO) FROM RECIBOS_CAJA_PAGO P, RECIBOS_CAJA R, PUNTO_VENTA PT
    WHERE R.RECA_ID = P.RECA_ID AND PT.PTVT_ID = :punto AND RECA_FECHA = :FECHA AND PT.caja_id = R.caja_id AND ((PT.PREF_PRE = R.PREF_PRE) or (:PREFIJO = '')) AND FOPA_ID = 10 and RECA_ANULADO = 'N'
    INTO :FORMAP10;
  SELECT SUM(RCPA_MONTO) FROM RECIBOS_CAJA_PAGO P, RECIBOS_CAJA R, PUNTO_VENTA PT
    WHERE R.RECA_ID = P.RECA_ID AND PT.PTVT_ID = :punto AND RECA_FECHA = :FECHA AND PT.caja_id = R.caja_id AND ((PT.PREF_PRE = R.PREF_PRE) or (:PREFIJO = '')) AND FOPA_ID = 11 and RECA_ANULADO = 'N'
    INTO :FORMAP11;
  SELECT SUM(RCPA_MONTO) FROM RECIBOS_CAJA_PAGO P, RECIBOS_CAJA R, PUNTO_VENTA PT
    WHERE R.RECA_ID = P.RECA_ID AND PT.PTVT_ID = :punto AND RECA_FECHA = :FECHA AND PT.caja_id = R.caja_id AND ((PT.PREF_PRE = R.PREF_PRE) or (:PREFIJO = '')) AND FOPA_ID = 12 and RECA_ANULADO = 'N'
    INTO :FORMAP12;

  cartera = 0;
  for SELECT FACT_ID,FACT_TOTAL FROM FACTURAS WHERE FACT_FECHA = :FECHA AND PTVT_ID = :PUNTO AND ((PREF_PRE = :PREFIJO) or (:PREFIJO = '')) and FACT_ANULADO = 'N' into :f_id,:F_TOTAL
    do
    begin
     Select COUNT(D.RECA_ID) FROM recibos_caja_detalle D, RECIBOS_CAJA R where R.RECA_ID = D.RECA_ID AND R.RECA_FECHA = :FECHA AND RECA_ANULADO = 'N' and D.RCDE_tipodoc = 31 and D.RCDE_IDDOC = :f_id into :r_iddoc;
     if (r_iddoc = 0) then
       CARTERA = :cartera + :F_TOTAL;
    end
  for SELECT DEVT_ID,DEVT_TOTAL FROM devoluciones_ventas WHERE DEVT_FECHA = :FECHA AND PTVT_ID = :PUNTO and DEVT_ANULADO = 'N' into :f_id,:F_TOTAL
    do
    begin
     Select COUNT(D.RECA_ID) FROM recibos_caja_detalle D, RECIBOS_CAJA R where R.RECA_ID = D.RECA_ID AND R.RECA_FECHA = :FECHA AND RECA_ANULADO = 'N' and D.RCDE_tipodoc = 33 and D.RCDE_IDDOC = :f_id into :r_iddoc;
     if (r_iddoc = 0) then
       CARTERA = :cartera - :F_TOTAL;
    end
  /* SUME LAS RETENCIONES COMO CARTERA */
  SELECT SUM(RCDE_RTFTE+RCDE_RTIVA+RCDE_RTICA) FROM recibos_caja_detalle D, RECIBOS_CAJA R, PUNTO_VENTA PT
    WHERE R.RECA_ID = D.RECA_ID AND PT.PTVT_ID = :punto AND RECA_FECHA = :FECHA AND PT.caja_id = R.caja_id AND ((PT.PREF_PRE = R.PREF_PRE) or (:PREFIJO = '')) AND RECA_ANULADO = 'N'
    INTO :RETES;
  if (RETES IS NULL) then
    RETES = 0;

  if (formap1 is null) then
    formap1 = 0;
  if (formap2 is null) then
    formap2 = 0;
  if (formap3 is null) then
    formap3 = 0;
  if (formap4 is null) then
    formap4 = 0;
  if (formap5 is null) then
    formap5 = 0;
  if (formap6 is null) then
    formap6 = 0;
  if (formap7 is null) then
    formap7 = 0;
  if (formap8 is null) then
    formap8 = 0;
  if (formap9 is null) then
    formap9 = 0;
  if (formap10 is null) then
    formap10 = 0;
  if (formap11 is null) then
    formap11 = 0;
  if (formap12 is null) then
    formap12 = 0;
  if (cartera is null) then
    cartera = 0;
  I = 0;
  FOR SELECT MAX(F.VEND_COD), MAX(VEND_NOMBRE), SUM(FACT_TOTAL - FACT_IVAMONTO) FROM FACTURAS F, VENDEDORES V
    WHERE F.VEND_COD = V.VEND_COD AND FACT_FECHA = :FECHA AND F.PTVT_ID = :PUNTO AND ((PREF_PRE = :PREFIJO) or (:PREFIJO = '')) and FACT_ANULADO = 'N'
    GROUP BY F.VEND_COD ORDER BY F.VEND_COD
    INTO :CODVEN, :VENDED, :TOTALF
    DO
    BEGIN
    if (totalf IS NULL) then
        TOTALF = 0;
    SELECT SUM(DEVT_TOTAL - DEVT_IVAMONTO) FROM DEVOLUCIONES_VENTAS
        WHERE VEND_COD = :CODVEN AND DEVT_FECHA = :FECHA AND PTVT_ID = :PUNTO AND ((PREF_PRE = :PREFIJO) or (:PREFIJO = '')) and DEVT_ANULADO = 'N'
        INTO :totald;
    if (TOTALD IS NULL) then
        TOTALD = 0;
    if (I = 0) then
        BEGIN
        vendedor1 = VENDED;
        vtavend1 = TOTALF - TOTALD;
        END
    if (I = 1) then
        BEGIN
        vendedor2 = VENDED;
        vtavend2 = TOTALF - TOTALD;
        END
    if (I = 2) then
        BEGIN
        vendedor3 = VENDED;
        vtavend3 = TOTALF - TOTALD;
        END
    if (I = 3) then
        BEGIN
        vendedor4 = VENDED;
        vtavend4 = TOTALF - TOTALD;
        END
    if (I = 4) then
        BEGIN
        vendedor5 = VENDED;
        vtavend5 = TOTALF - TOTALD;
        END
    I = I + 1;
    END
  if (AJUSTE = 1) then
    BEGIN
    BASEFAC = BASEF0 + BASEF1 + BASEF2 + BASEF3 + BASEF4;
    IVAFAC = IVAF0 + IVAF1 + IVAF2 + IVAF3 + IVAF4;
    TOTALFAC = totalf0 + TOTALF1 + TOTALF2 + TOTALF3 + TOTALF4;
    BASEDEV = totald0 + TOTALD1 + TOTALD2 + TOTALD3 + TOTALD4;
    IVADEV = IVAD0 + IVAD1 + IVAD2 + IVAD3 + IVAD4;
    TOTALDEV = totald0 + TOTALD1 + totald2 + totald3 + totald4;
    BASENETO = basefac - basedev;
    IVANETO = ivafac - ivadev;
    if (totalneto <> 0) Then
        begin
        formap1 = formap1 * (totalfac - totaldev) / totalneto;
        formap2 = formap2 * (totalfac - totaldev) / totalneto;
        formap3 = formap3 * (totalfac - totaldev) / totalneto;
        formap4 = formap4 * (totalfac - totaldev) / totalneto;
        formap5 = formap5 * (totalfac - totaldev) / totalneto;
        formap6 = formap6 * (totalfac - totaldev) / totalneto;
        formap7 = formap7 * (totalfac - totaldev) / totalneto;
        formap8 = formap8 * (totalfac - totaldev) / totalneto;
        formap9 = formap9 * (totalfac - totaldev) / totalneto;
        formap10 = formap10 * (totalfac - totaldev) / totalneto;
        formap11 = formap11 * (totalfac - totaldev) / totalneto;
        formap12 = formap12 * (totalfac - totaldev) / totalneto;
        vtavend1 = vtavend1 * (totalfac - totaldev) / totalneto;
        vtavend2 = vtavend2 * (totalfac - totaldev) / totalneto;
        vtavend3 = vtavend3 * (totalfac - totaldev) / totalneto;
        vtavend4 = vtavend4 * (totalfac - totaldev) / totalneto;
        vtavend5 = vtavend5 * (totalfac - totaldev) / totalneto;
        end
    TOTALNETO = totalfac - totaldev;
    END
  INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
    VALUES (USER, 123, :punto, 'I', (:formap1+:formap2+:formap3+:formap4+:formap5+:CARTERA));
  suspend;
end
^

SET TERM ; ^

/* 20101120B */
/* no genere excepcion con cotizaciones y pedidos */
SET TERM ^ ;

CREATE OR ALTER TRIGGER CONSOLIDADO_FALTANTES_BI FOR CONSOLIDADO_FALTANTES
ACTIVE BEFORE INSERT POSITION 0
as
declare variable cant numeric(18,2);
declare variable cantori numeric(18,2);
begin
if (new.cofa_ok = 'S') then
    begin
    cantori = 0;
    select sum(cofa_cant*cofa_factor) from consolidado_faltantes
        where cofa_tipoori = new.cofa_tipoori and cofa_idori = new.cofa_idori and cofa_ok = 'S' and cofa_itemori = new.cofa_itemori
        into :cant;
    if (new.cofa_tipoori = 31) then
        select fade_cant * fade_factor from facturas_detalle where fact_id = new.cofa_idori and fade_item = new.cofa_itemori
        into :cantori;
    if (new.cofa_tipoori = 32) then
        select rvde_cant * rvde_factor from remisiones_venta_detalle where revt_id = new.cofa_idori and rvde_item = new.cofa_itemori
        into :cantori;
    if (new.cofa_tipoori = 21) then
        select fcde_cant * fcde_factor from facturas_compras_detalle where faco_id = new.cofa_idori and fcde_item = new.cofa_itemori
        into :cantori;
    if (new.cofa_tipoori = 22) then
        select rpvd_cant * rpvd_factor from remision_proveedor_det where repr_id = new.cofa_idori and rpvd_item = new.cofa_itemori
        into :cantori;
    if ((cantori > 0) and (cant + (new.cofa_cant * new.cofa_factor)) > cantori) then
        exception cantidad_cruce_mayor 'La cantidad a cruzar (' || new.cofa_cant || ') del artículo ' || new.arti_cod || ' es mayor a la cantidad original (' || :cantori || ') menos lo previamente cruzado (' || :cant || ')';
    end
end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER CONSOLIDADO_FALTANTES_BU FOR CONSOLIDADO_FALTANTES
ACTIVE BEFORE UPDATE POSITION 0
as
declare variable cant numeric(18,2);
declare variable cantori numeric(18,2);
begin
if (new.cofa_ok = 'S') then
    begin
    cantori = 0;
    select sum(cofa_cant*cofa_factor) from consolidado_faltantes
        where cofa_tipoori = new.cofa_tipoori and cofa_idori = new.cofa_idori and cofa_ok = 'S' and cofa_itemori = new.cofa_itemori
        into :cant;
    if (new.cofa_tipoori = 31) then
        select fade_cant * fade_factor from facturas_detalle where fact_id = new.cofa_idori and fade_item = new.cofa_itemori
        into :cantori;
    if (new.cofa_tipoori = 32) then
        select rvde_cant * rvde_factor from remisiones_venta_detalle where revt_id = new.cofa_idori and rvde_item = new.cofa_itemori
        into :cantori;
    if (new.cofa_tipoori = 21) then
        select fcde_cant * fcde_factor from facturas_compras_detalle where faco_id = new.cofa_idori and fcde_item = new.cofa_itemori
        into :cantori;
    if (new.cofa_tipoori = 22) then
        select rpvd_cant * rpvd_factor from remision_proveedor_det where repr_id = new.cofa_idori and rpvd_item = new.cofa_itemori
        into :cantori;
    if ((cantori > 0) and (cant + (new.cofa_cant * new.cofa_factor)) > cantori) then
        exception cantidad_cruce_mayor 'La cantidad a cruzar (' || new.cofa_cant || ') del artículo ' || new.arti_cod || ' es mayor a la cantidad original (' || :cantori || ') menos lo previamente cruzado (' || :cant || ')';
    end
end
^

SET TERM ; ^

/* 20101122 */
/* NO PODER MODIFICAR LA LISTA DE PRECIOS EN DOCS DE VENTA */

INSERT INTO CONFIGURACION (CONF_MODULO, CONF_CATEGORIA, CONF_PROPIEDAD, CONF_VALOR, CONF_POSIBLES, CONF_AYUDA) VALUES ('FACTURACION', 'PEDIDOS', 'PERMITIR MODIFICAR LA LISTA DE PRECIOS', 'SI', 'SI,NO', 'SI: Permite escoger una lista de precios al facturar, NO: Trae la lista del cliente o la predeterminada para facturar y no permite que el vendedor la modifique.');
INSERT INTO CONFIGURACION (CONF_MODULO, CONF_CATEGORIA, CONF_PROPIEDAD, CONF_VALOR, CONF_POSIBLES, CONF_AYUDA) VALUES ('FACTURACION', 'COTIZACIONES', 'PERMITIR MODIFICAR LA LISTA DE PRECIOS', 'SI', 'SI,NO', 'SI: Permite escoger una lista de precios al facturar, NO: Trae la lista del cliente o la predeterminada para facturar y no permite que el vendedor la modifique.');
INSERT INTO CONFIGURACION (CONF_MODULO, CONF_CATEGORIA, CONF_PROPIEDAD, CONF_VALOR, CONF_POSIBLES, CONF_AYUDA) VALUES ('FACTURACION', 'REMISIONES', 'PERMITIR MODIFICAR LA LISTA DE PRECIOS', 'SI', 'SI,NO', 'SI: Permite escoger una lista de precios al facturar, NO: Trae la lista del cliente o la predeterminada para facturar y no permite que el vendedor la modifique.');
COMMIT WORK;

/* 20101122B */
/* FECHA DEL DOCUMENTO A CANCELAR EN LA IMPRESION DEL EGRESO */
SET TERM ^ ;

CREATE OR ALTER procedure IMPR_EGRESO (
    ID integer)
returns (
    PREFIJO varchar(4),
    NUMERO varchar(6),
    FECHA date,
    NIT varchar(20),
    NOMBRE varchar(60),
    DIR varchar(60),
    CIU varchar(40),
    TEL varchar(40),
    CONCEPTO varchar(60),
    MONTO numeric(18,2),
    RTFTE numeric(18,2),
    RTIVA numeric(18,2),
    RTICA numeric(18,2),
    DSCTO numeric(18,2),
    OBS blob sub_type 1 segment size 80,
    ITEMDOC integer,
    TIPODOC varchar(8),
    PREFDOC varchar(4),
    FECDOC DATE,
    NUMDOC varchar(6),
    NUMPRV varchar(10),
    ABONODOC numeric(18,2),
    RTFTEDOC numeric(18,2),
    RTIVADOC numeric(18,2),
    RTICADOC numeric(18,2),
    DSCTODOC numeric(18,2),
    SALDODOC numeric(18,2),
    SALDOPROV numeric(18,2),
    ANTERDOC numeric(18,2))
AS
declare variable NUMROWS INTEGER;
declare variable TIPO integer;
declare variable IDDOC INTEGER;
BEGIN
  SELECT PREF_PRE, EGRE_NUMERO, EGRE_FECHA, EGRE_CONC,
        E.TERC_NIT, EGRE_NOMTERC, TERC_DIR, TERC_CIU, TERC_TEL,
        EGRE_MONTO, EGRE_RTFTEMONTO, EGRE_RTIVAMONTO, EGRE_RTICAMONTO, EGRE_DTOF,
        EGRE_OBS
    FROM EGRESOS E, TERCEROS T
    WHERE E.TERC_NIT = T.TERC_NIT AND E.EGRE_ID = :ID
    INTO :PREFIJO, :NUMERO, :FECHA, :CONCEPTO, 
        :NIT, :NOMBRE, :DIR, :CIU, :TEL,
        :MONTO, :RTFTE, :RTIVA, :RTICA, :DSCTO,
        :OBS;
  select SALDO from saldo_proveedor(:NIT, :FECHA, 0) into :SALDOPROV;
  SELECT COUNT(EGDE_ITEM) FROM EGRESOS_DETALLE
    WHERE EGRE_ID = :ID INTO :NUMROWS;
  if (NUMROWS > 0) then
    FOR SELECT EGDE_ITEM, EGDE_TIPODOC, TIDO_NOMCORTO, EGDE_IDDOC, EGDE_PREFIJO, EGDE_NUMERO, EGDE_ABONO, EGDE_RTFTE, EGDE_RTIVA, EGDE_RTICA, EGDE_DTOF
        FROM EGRESOS_DETALLE ED, TIPO_DOCUMENTO TD
        WHERE TD.TIDO_COD = ED.EGDE_TIPODOC AND ED.EGRE_ID = :ID
        order by egde_item
        INTO :ITEMDOC, :TIPO, :TIPODOC, :IDDOC, :PREFDOC, :NUMDOC, :ABONODOC, :RTFTEDOC, :RTIVADOC, :RTICADOC, :DSCTODOC
        DO
            BEGIN
            SELECT M.mvpr_fecha FROM movimiento_proveedor M WHERE M.mvpr_tiporef = :TIPO AND M.mvpr_idref = :iddoc INTO :fecdoc;
            if (TIPO = 21) then
                SELECT FACO_NUMPROV FROM FACTURAS_COMPRA WHERE FACO_ID = :iddoc INTO :numprv;
            ELSE
                if (TIPO = 51) then
                    SELECT NDPR_NUMPROV FROM NOTAS_DEBITO_PROVEEDOR WHERE NDPR_ID = :iddoc INTO :numprv;
                ELSE
                    numprv = numdoc;
            EXECUTE PROCEDURE saldo_doc_cxpagar(:TIPO, :IDDOC, :FECHA, 0) returning_values (:SALDODOC);
            ANTERDOC = SALDODOC + RTFTEDOC + RTIVADOC + RTICADOC + ABONODOC + DSCTODOC;
            SUSPEND;
            END
  else
    BEGIN
    SALDOPROV = 0;
    ANTERDOC = 0;
    SALDODOC = 0;
    RTFTEDOC = 0;
    RTIVADOC = 0;
    RTICADOC = 0;
    ABONODOC = 0;
    DSCTODOC = 0;
    numprv = '';
    SUSPEND;
    END
END
^

SET TERM ; ^

/* 20101122D */
CREATE SEQUENCE ID_CAMBCOSTO;

SET TERM ^ ;

create or alter procedure CAMBIE_ID_CAMBCOSTO
returns (
    ID integer)
AS
declare variable NUMROWS INTEGER;
BEGIN
/* TRAE EL ID NUEVO Y LO ACTUALIZA */
NUMROWS = 1;
while (NUMROWS > 0) DO
    BEGIN
    ID = GEN_ID(id_cambcosto, 1);
    /* VERIFIQUE SI YA EXISTE */
    SELECT COUNT(*) FROM cambia_costos WHERE CAMC_ID = :ID INTO :NUMROWS;
    END
SUSPEND;
END
^

SET TERM ; ^

GRANT EXECUTE ON PROCEDURE cambie_id_cambcosto TO PUBLIC;


ALTER TABLE CAMBIA_COSTOS
ADD CAMC_STAND T_COD_ARTICULO;

SET TERM ^ ;

CREATE OR ALTER TRIGGER CAMBIA_COSTOS_AI FOR CAMBIA_COSTOS
ACTIVE AFTER INSERT POSITION 0
as
begin
UPDATE ENTRADAS_DETALLE SET ENDE_COSTO = NEW.camc_coston, ENDE_STAND = NEW.camc_stand
    WHERE ENTR_ID = NEW.camc_ident AND ENDE_ITEM = NEW.camc_itement;
INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD, AUDI_RAZON)
    VALUES (USER, 99, NEW.camc_id, 'I', NEW.arti_cod, 'ENTRADA ' || NEW.camc_prefent || NEW.camc_numeroent || ' ITEM:' || NEW.camc_itement || ' COST0 ANTERIOR:' || NEW.camc_costov || ' NUEVO COSTO:' || NEW.camc_coston);
end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER CAMBIA_COSTOS_AU FOR CAMBIA_COSTOS
ACTIVE AFTER UPDATE POSITION 0
as
begin
UPDATE ENTRADAS_DETALLE SET ENDE_COSTO = NEW.camc_coston, ENDE_STAND = NEW.camc_stand
    WHERE ENTR_ID = NEW.camc_ident AND ENDE_ITEM = NEW.camc_itement;
INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD, AUDI_RAZON)
    VALUES (USER, 99, NEW.camc_id, 'U', NEW.arti_cod, 'ENTRADA ' || NEW.camc_prefent || NEW.camc_numeroent || ' ITEM:' || NEW.camc_itement || ' COST0 ANTERIOR:' || NEW.camc_costov || ' NUEVO COSTO:' || NEW.camc_coston);
end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER CAMBIA_COSTOS_AD FOR CAMBIA_COSTOS
ACTIVE AFTER DELETE POSITION 0
as
begin
UPDATE ENTRADAS_DETALLE SET ENDE_COSTO = OLD.camc_costov
    WHERE ENTR_ID = OLD.camc_ident AND ENDE_ITEM = OLD.camc_itement;
INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD, AUDI_RAZON)
    VALUES (USER, 99, OLD.camc_id, 'D', OLD.arti_cod, 'ENTRADA ' || OLD.camc_prefent || OLD.camc_numeroent || ' ITEM:' || OLD.camc_itement || ' COST0 ANTERIOR:' || OLD.camc_costov || ' NUEVO COSTO:' || OLD.camc_coston);
end
^

SET TERM ; ^


/* 20101123 */
/* COPIAR LA DESCRIPCION A BARRAS_ARTICULO */
SET TERM ^ ;

CREATE OR ALTER TRIGGER ARTICULO_AU FOR ARTICULO
ACTIVE AFTER UPDATE POSITION 0
as
declare variable GRUP_TIVA CHAR(10);
declare variable VTA CHAR(20);
declare variable IVAC CHAR(20);
declare variable IVAV CHAR(20);
declare variable INV CHAR(20);
declare variable COSTO CHAR(20);
declare variable DEV CHAR(20);
declare variable COMP CHAR(20);
declare variable RETC CHAR(20);
declare variable RETV CHAR(20);
declare variable RETB NUMERIC(18,2);
declare variable RETP NUMERIC(9,4);
declare variable NUMROWS INTEGER;
begin
INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
    VALUES (USER, 101, 1, 'U', NEW.arti_cod);
EXECUTE PROCEDURE LEE_CONFIGURACION('INVENTARIO', 'ARTICULOS', 'OPCION PARA CAMBIAR AUTOMATICAMENTE LAS CTAS CONTABLES DEL ARTICULO') RETURNING_VALUES (:GRUP_TIVA);
if (new.arti_des <> old.arti_des) then
  begin
  select count(*) from barras_articulo where arti_cod = new.arti_cod into :numrows;
  if (numrows = 1) then
    update barras_articulo set coba_des = new.arti_des where arti_cod = new.arti_cod;
  end
if (new.grup_cod <> old.grup_cod) then
 begin
  if (GRUP_TIVA = 'GRUPOS') then
   BEGIN
    SELECT GRUP_CTAINVENT, GRUP_CTAIVACMP, GRUP_CTAIVAVNT, GRUP_CTAVENTAS, GRUP_CTACOSTOS, GRUP_CTADEV, GRUP_CTACOMP, GRUP_CTARTFTEC, GRUP_CTARTFTEV, GRUP_RTFTEB, GRUP_RTFTEP
      FROM GRUPO G
      WHERE GRUP_COD = NEW.GRUP_COD
      into :INV, :IVAC, :IVAV, :VTA, :COSTO, :DEV, :COMP, :retc, :retv, :retb, :retp;
      update CONTABIL_ARTICULO
       SET COAR_CTAINV = :INV,
           COAR_CTAIVAC = :IVAC,
           COAR_CTAIVAV = :IVAV,
           COAR_CTAVNT = :VTA,
           COAR_CTACOS = :COSTO,
           COAR_CTADEV = :DEV,
           COAR_CTACOMP = :COMP,
           COAR_CTARTFTE = :retc,
           COAR_CTARTFTEV = :retv,
           COAR_RTFTE = :retp,
           COAR_RTBASE = :retb
        WHERE ARTI_COD = NEW.ARTI_COD;
   END
 end
if (new.taiv_cod <> old.taiv_cod) then
 begin
  if (GRUP_TIVA = 'TARIFA IVA') then
   BEGIN
    SELECT TAIV_CTAINV, TAIV_CTAIVACMP, TAIV_CTAIVAVNT, TAIV_CTAVTA, TAIV_CTACOSTO, TAIV_CTACOMP, TAIV_CTADEV
      FROM TARIFA_IVA T
      WHERE TAIV_COD = NEW.taiv_cod
      into :INV, :IVAC, :IVAV, :VTA, :COSTO, :COMP, :DEV;
      update CONTABIL_ARTICULO
       SET COAR_CTAINV = :INV,
           COAR_CTAIVAC = :IVAC,
           COAR_CTAIVAV = :IVAV,
           COAR_CTAVNT = :VTA,
           COAR_CTACOS = :COSTO,
           COAR_CTADEV = :DEV,
           COAR_CTACOMP = :COMP
        WHERE ARTI_COD = NEW.ARTI_COD;
   END
 end
end
^

SET TERM ; ^

/* 20101123b */
/* doble precision en cantpr para resolver overflow */
SET TERM ^ ;

CREATE OR ALTER TRIGGER MOVIMIENTO_ARTICULO_BI FOR MOVIMIENTO_ARTICULO
ACTIVE BEFORE INSERT POSITION 0
AS
declare variable LOTE CHAR(1);
declare variable ENSAMBLE CHAR(1);
declare variable IDENS INTEGER;
declare variable PREFENS VARCHAR(4);
declare variable unidad varchar(8);
declare variable DESCR varchar(60);
declare variable CODPR varchar(15);
declare variable DESPR varchar(60);
declare variable UNIPR varchar(8);
declare variable CANTPR double precision;
declare variable FACTOR numeric(18,4);
declare variable COSTO numeric(18,2);
declare variable COSTOTOT numeric(18,2);
declare variable PORCPR numeric(9,4);
declare variable MERMAPR numeric(9,4);
declare variable PESO numeric(18,4);
declare variable PESOPR numeric(18,4);
declare variable ITEM INTEGER;
declare variable IVA NUMERIC(9,4);
declare variable IVAM NUMERIC(18,2);
declare variable CONSUMO NUMERIC(18,2);
declare variable TOTAL float;
declare variable SALDO NUMERIC(18,4);
BEGIN
/* INSERTE EL NUEVO LOTE */
if (NEW.mvar_cant IS NULL) then
    NEW.mvar_cant = 0;
SELECT ARTI_EXIST
    FROM   ARTICULO
    WHERE  ARTICULO.ARTI_COD = NEW.ARTI_COD
    INTO :LOTE;
if (LOTE = 'L') then
    BEGIN
      if ((NEW.mvar_lote IS NULL) or (NEW.mvar_lote = '')) then
        if (new.mvar_entrada = 'S') then
            new.mvar_lote = cast(new.mvar_cons as varchar(15));
        else
            begin
            /* NO HAY LOTE, ENTONCES CALCULELO SEGUN CONFIGURACION */
            EXCEPTION LOTE_NEGATIVO 'No se indicó un lote para el artículo ' || new.arti_cod;
            end
    END
/* ENSAMBLE EL PRODUCTO */
SELECT ARTI_ENSAMBLE, ARTI_UNIDAD, ARTI_DES, ARTI_PESO
    FROM ARTICULO WHERE ARTI_COD = NEW.arti_cod INTO :ensamble, :unidad, :descr, :peso;
if ((NEW.mvar_entrada = 'N') AND (ENSAMBLE = 'S')) then
    BEGIN
    /* verifique si la existecia es insufieciente */
    execute procedure saldo_inventario(new.arti_cod, new.bode_cod, new.mvar_fecha) returning_values (:saldo);
    if (NEW.mvar_cant > :SALDO) then
        BEGIN
        if (SALDO > 0) then
            SALDO = NEW.mvar_cant - :SALDO;
        else
            SALDO = NEW.mvar_cant;
        IDENS = gen_id(id_ensamble, 1);
        EXECUTE PROCEDURE lee_configuracion('INVENTARIO', 'ENSAMBLES', 'PREFIJO PARA ENSAMBLES AUTOMATICOS AL SACAR PRODUCTOS') returning_values (:prefens);
        /* CALCULE EL COSTO TOTAL DEL ENSAMBLE */
        select sum(arpr_porc) from articulos_producto where arti_cod = NEW.arti_cod into :total;
        COSTOTOT = 0;
        FOR SELECT ARPR_CANT, ARPR_UNIDAD, ARPR_COMP, ARPR_PORC, ARPR_MERMA, ARTI_PESO
            FROM articulos_producto P, ARTICULO A
            WHERE P.ARTI_COD = NEW.arti_cod AND A.arti_cod = P.arpr_comp
            INTO :CANTPR, :UNIPR, :CODPR, :PORCPR, :MERMAPR, :PESOPR
            DO
            BEGIN
            EXECUTE PROCEDURE factor_unidad_cant(:codpr, :unipr) returning_values (:factor);
            EXECUTE PROCEDURE costo_promedio_unidad (:codpr, NEW.mvar_fecha, :UNIPR) returning_values (:COSTO);
            IVAM = costo * cantpr * iva / 100;
            if (((cantpr is null) or (cantpr = 0)) AND (porcpr IS NOT NULL) AND (porcpr <> 0)) then
                BEGIN
                /* ES PORCENTUAL AL PESO LA MEZCLA SOBRE EL 1ER ARTICULO */
                CANTPR = :SALDO * PESO;
                CANTPR = CANTPR / TOTAL * porcpr; /* APLICA LA PROPORCION */
                if ((mermapr IS NOT NULL) AND (mermapr <> 0)) then
                    CANTPR = CANTPR * (100 + mermapr) / 100;
                END
            ELSE
                BEGIN
                CANTPR = CANTPR * :SALDO * pesopr * :FACTOR;
                END
            COSTOTOT = COSTOTOT + COSTO * CANTPR;
            END
        if (NEW.mvar_cant <> 0) then
            COSTO = costotot / NEW.mvar_cant;
        else
            COSTO = 0;
        INSERT INTO ENSAMBLES(ENSA_ID, TIDO_COD, PREF_PRE, BODE_COD, ENSA_NUMERO, ENSA_FECHA, ENSA_CONC, ENSA_REFER, ENSA_CANT, ENSA_UNIDAD, ENSA_FACTOR, ENSA_ANULADO, ENSA_TRANSMIT,
            ARTI_COD, ENSA_DESC, ENSA_CODBAR, ENSA_LOTE, ENSA_OBS, TERC_NIT, ENSA_USUARIO, NUMOK, ENSA_COSTO, LOTE_VENCE, ENSA_CODRETAL, ENSA_CANTRETAL, ENSA_OPER, ENSA_MAQUINA, ENSA_PESO, ENSA_BODRETAL, ENSA_TIPOREF, ENSA_IDREF)
            VALUES (:IDENS, 15, :prefens, NEW.bode_cod, '000001', new.mvar_fecha, new.mvar_conc, '', :SALDO, :unidad, 1, 'N', 'N',
            NEW.arti_cod, :descr, NEW.arti_cod, NEW.mvar_lote, NULL, NULL, USER, 'N', :costo, NULL, NULL, 0, null,  NULL, 0, NEW.bode_cod, NEW.mvar_tipodoc, NEW.mvar_idref);
        /* LOS DETALLES DEL ENSAMBLE */
        ITEM = 0;
        FOR SELECT ARPR_CANT, ARPR_UNIDAD, ARPR_COMP, ARTI_DES, TAIV_PORC, ARTI_CONSUMO, ARPR_PORC, ARPR_MERMA, ARTI_PESO
            FROM articulos_producto P, ARTICULO A, TARIFA_IVA T
            WHERE P.ARTI_COD = NEW.arti_cod AND A.arti_cod = P.arpr_comp AND A.taiv_cod = T.taiv_cod
            INTO :CANTPR, :UNIPR, :CODPR, :DESPR, :IVA, :CONSUMO, :PORCPR, :MERMAPR, :PESOPR
            DO
            BEGIN
            ITEM = ITEM + 1;
            EXECUTE PROCEDURE factor_unidad_cant(:codpr, :unipr) returning_values (:factor);
            EXECUTE PROCEDURE costo_promedio_unidad (:codpr, NEW.mvar_fecha, :UNIPR) returning_values (:COSTO);
            IVAM = costo * cantpr * iva / 100;
            if (((cantpr is null) or (cantpr = 0)) AND (porcpr IS NOT NULL) AND (porcpr <> 0)) then
                BEGIN
                /* ES PORCENTUAL AL PESO LA MEZCLA SOBRE EL 1ER ARTICULO */
                CANTPR = :SALDO * PESO;
                CANTPR = CANTPR / TOTAL * porcpr; /* APLICA LA PROPORCION */
                if ((mermapr IS NOT NULL) AND (mermapr <> 0)) then
                    CANTPR = CANTPR * (100 + mermapr) / 100;
/*                CANTPR = CANTPR / pesopr; /* LO LLEVA A LA UNIDAD PRINCIPAL */
                UNIPR = 'GRAMO';
                END
            ELSE
                BEGIN
                CANTPR = CANTPR * :SALDO; /* * pesopr * FACTOR; */
                END
            INSERT INTO ENSAMBLES_DETALLE(ENSA_ID, ESDE_ITEM, ARTI_COD, BODE_COD, ESDE_CANT, ESDE_UNIDAD, ESDE_COSTO, ESDE_LOTE, ESDE_FACTOR, ESDE_IVAPORC, ESDE_IVAMONTO, ESDE_CONSUMO, ESDE_CODBAR, ESDE_ANULADO, ESDE_TRANSMIT, ESDE_DESC, ESDE_TOTAL, ESDE_PESO)
                VALUES (:idens, :ITEM, :codpr,  NEW.bode_cod, :cantpr, :unipr, :costo, NULL, :FACTOR, :IVA, :ivam, :consumo, :codpr, 'N', 'N', :despr, :COSTO * :cantpr, 0);
            END
        END
    END
if (new.mvar_cons is null) then
    NEW.mvar_cons = GEN_ID(ID_MOVARTI,1);
END
^

SET TERM ; ^


/* 20101123c */
/* IMPRESION OPCIONAL DE ENSAMBLES PREVIOS AL PLAN */
SET TERM ^ ;

CREATE OR ALTER procedure IMPR_PLANPROD (
    ID integer,
    ENSPREV CHAR(1))
returns (
    PREF varchar(4),
    NUMERO varchar(6),
    FECHA date,
    FECFIN date,
    CONCEPTO varchar(60),
    RESPONSABLE varchar(60),
    OBS blob sub_type 0 segment size 80,
    ITEM integer,
    ARTICULO varchar(15),
    CODBAR varchar(15),
    ARTIDES varchar(60),
    CANT numeric(18,4),
    UNIDAD varchar(8),
    MERMA numeric(18,4),
    PESO numeric(18,4),
    OBSITEM blob sub_type 0 segment size 80,
    CODCOMP varchar(20),
    DESCOMP varchar(60),
    CANTCOMP numeric(18,4),
    UNICOMP varchar(8),
    ESBASE char(1),
    ESENSAMBLE char(1))
AS
declare variable CODPROD varchar(20);
declare variable PORC float;
declare variable MERMAC numeric(18,4);
declare variable PESOPRO numeric(18,4);
declare variable PESOCMP numeric(18,4);
declare variable TOTAL float;
declare variable CANTPRO numeric(18,4);
declare variable CANTSOB numeric(18,4);
declare variable FACTOR float;
declare variable sobrante varchar(15);
declare variable porsob numeric(9,4);
declare variable BASE varchar(20);
declare variable BASEANT varchar(20);
declare variable ITEMAUX integer;
declare variable ARTICULOAUX varchar(20);
declare variable CODBARAUX varchar(20);
declare variable ARTIDESAUX varchar(60);
declare variable CANTAUX numeric(18,4);
declare variable UNIDADAUX varchar(8);
declare variable PESOAUX numeric(18,4);
declare variable OBSITEAUX varchar(1024);
begin
BASEANT = '';
select PLPR_PREF, PLPR_NUMERO, PLPR_FECINI, PLPR_FECFIN, PLPR_CONC, PLPR_RESPONSABLE, PLPR_OBS
    from plan_produccion O where PLPR_ID = :ID into
    :PREF, :NUMERO, :FECHA,
    :FECFIN, :CONCEPTO, :RESPONSABLE, :OBS;
for select PLPD_ITEM, p.ARTI_COD, PLPD_CODBAR, PLPD_DESC, PLPD_CANT, PLPD_UNIDAD, PLPD_PESO, PLPD_OBS, arti_sobrante, arti_porcsobr
    from plan_produccion_det p, articulo a where a.arti_cod = p.arti_cod and PLPR_ID = :ID
    order by PLPD_ITEM
    into :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :PESO, :OBSITEM, :sobrante, :porsob
    do
    begin
    ESBASE = 'N';
    ESENSAMBLE = 'N';
    /* DETECTE SI HAY UNA BASE EN LA FORMULA */
    BASE = NULL;
    select first 1 arpr_comp from plan_produccion_productos
        where plpr_id = :id and plpd_item = :item and arpr_base = 'S' into :BASE;
    if (BASE IS NOT NULL) then
        begin
        if (BASE <> BASEANT) then
            begin
            ESBASE = 'S';
            BASEANT = BASE;
            /* GUARDE LOS VALORES */
            ITEMAUX = ITEM;
            ARTICULOAUX = ARTICULO;
            CODBARAUX = CODBAR;
            ARTIDESAUX = ARTIDES;
            CANTAUX = CANT;
            UNIDADAUX = UNIDAD;
            PESOAUX = PESO;
            OBSITEAUX = OBSITEM;

            /* ES UNA NUEVA BASE, HAGA LA IMPRESION DE LA BASE */
            for select PLPC_ITEM, ARTI_COD, PLPC_CODBAR, PLPC_DESC, PLPC_CANT, PLPC_UNIDAD, 0, ''
                from plan_produccion_cons where PLPD_ID = :ID and ARTI_COD = :BASE
                order by PLPC_ITEM
                into :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :peso, :obsitem
                do
                begin
                codcomp = '';
                descomp = '';
                cantcomp = 0;
                unicomp = '';
                suspend;
                ESBASE = 'N';
                CODPROD = ARTICULO;
                for select arpr_comp, arti_des, arpr_cant, arpr_unidad, 0, 0, 0
                    from plan_produccion_cons_prod P, ARTICULO A
                    where P.arpr_comp = A.arti_cod and p.plpd_id = :id and P.plpc_item = :item order by P.plcp_nrocomp
                    into :codcomp, :descomp, :cantcomp, :unicomp, :porc, :mermac, :pesocmp
                    do
                    begin
                    ARTICULO = '';
                    CODBAR = '';
                    ARTIDES = '';
                    CANT = 0;
                    UNIDAD = '';
                    OBSITEM = '';
                    suspend;
                    end
                end
            /* RESTAURE LOS VALORES */
            ITEM = ITEMAUX;
            ARTICULO = ARTICULOAUX;
            CODBAR = CODBARAUX;
            ARTIDES = ARTIDESAUX;
            CANT = CANTAUX;
            UNIDAD = UNIDADAUX;
            PESO = PESOAUX;
            OBSITEM = OBSITEAUX;
            end
        end
    /* ENSAMBLE DIRECTO O BASE YA IMPRESA */
    codcomp = '';
    descomp = '';
    cantcomp = 0;
    unicomp = '';
    suspend;
    for select arpr_comp, arti_des, arpr_cant, arpr_unidad
        from plan_produccion_productos P, ARTICULO A
        where p.plpr_id = :id and p.plpd_item = :item and P.arpr_comp = A.arti_cod
        into :codcomp, :descomp, :cantcomp, :unicomp
        DO
        BEGIN
        ARTICULO = '';
        CODBAR = '';
        ARTIDES = '';
        CANT = 0;
        UNIDAD = '';
        MERMA = 0;
        PESO = 0;
        OBSITEM = '';
        if ((sobrante <> '') and (porsob <> 0) and (sobrante = codcomp)) then
            begin
            merma = CANTCOMP / (100 + PORSOB) * PORSOB;
            end
        ESENSAMBLE = 'N';
        if (EXISTS (select arpr_item from articulos_producto where arti_cod = :codcomp)) then
            ESENSAMBLE = 'S';
        suspend;
        end
   end
/* ahora los ensambles que no son base */
EXECUTE PROCEDURE lee_configuracion ('INVENTARIO', 'ENSAMBLES', 'NOMBRE A IMPRIMIR COMO TITULO EN PLAN PARA ENSAMBLES QUE NO SON BASE') returning_values (ARTICULO);
CODBAR = '';
ARTIDES = ARTICULO;
CANT = 0;
UNIDAD = '';
MERMA = 0;
PESO = 0;
OBSITEM = '';
codcomp = '';
descomp = '';
cantcomp = 0;
unicomp = '';
SUSPEND;
FOR SELECT PLPC_ITEM, ARTI_COD, PLPC_CODBAR, PLPC_DESC, PLPC_CANT, PLPC_UNIDAD, PLPC_OBS
    FROM plan_produccion_cons WHERE PLPD_ID = :ID AND PLPC_BASE = 'N'
    ORDER BY PLPC_ITEM
    INTO :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :OBSITEM
    DO
      BEGIN
      codcomp = '';
      descomp = '';
      cantcomp = 0;
      unicomp = '';
      esensamble = 'N';
       if (EXISTS (select arpr_item from articulos_producto where arti_cod = :articulo)) then
            ESENSAMBLE = 'S';
      SUSPEND;
      CODPROD = ARTICULO;
      for select arpr_comp, arti_des, arpr_cant, arpr_unidad
        from plan_produccion_cons_prod P, ARTICULO A
        where P.arpr_comp = A.arti_cod AND p.plpd_id = :id AND P.plpc_item = :item ORDER BY P.plcp_nrocomp
        into :codcomp, :descomp, :cantcomp, :unicomp
        DO
        BEGIN
        ARTICULO = '';
        CODBAR = '';
        ARTIDES = '';
        CANT = 0;
        UNIDAD = '';
        OBSITEM = '';
        esensamble = 'N';
        SUSPEND;
        END
      END
/* TRAIGA LOS SUBENSAMBLES ASOCIADOS AL PLAN */
if (ENSPREV = 'S') then
  BEGIN
  if (EXISTS (select P.arpr_comp from plan_produccion_cons_prod P, ARTICULO A, ensambles E1, ENSAMBLES E2
    where P.arpr_comp = A.arti_cod AND p.plpd_id = :id
    and P.arpr_comp = e2.arti_cod AND E2.ensa_tiporef = 15 AND E2.ensa_idref = E1.ensa_id
    AND E1.ENSA_TIPOREF = 27 AND E1.ENSA_IDREF = :ID)) then
    BEGIN
    ARTICULO = 'ENS. ADIC.';
    CODBAR = '';
    ARTIDES = '** ENSAMBLES PREVIOS ADICIONALES **';
    CANT = 0;
    UNIDAD = '';
    MERMA = 0;
    PESO = 0;
    OBSITEM = '';
    codcomp = '';
    descomp = '';
    cantcomp = 0;
    unicomp = '';
    ESBASE = 'S';
    ESENSAMBLE = 'N';
    SUSPEND;
    for select P.arpr_comp, P.arpr_comp, A.arti_des, P.arpr_cant, P.arpr_unidad, '', e2.ensa_id
        from plan_produccion_cons_prod P, ARTICULO A, ensambles E1, ENSAMBLES E2
        where P.arpr_comp = A.arti_cod AND p.plpd_id = :id
        and P.arpr_comp = e2.arti_cod AND E2.ensa_tiporef = 15 AND E2.ensa_idref = E1.ensa_id
        AND E1.ENSA_TIPOREF = 27 AND E1.ENSA_IDREF = :ID
        ORDER BY P.plpc_item, P.plcp_nrocomp
        INTO :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :OBSITEM, :itemaux
        DO
        begin
        FOR SELECT ARTI_COD, ESDE_DESC, ESDE_CANT, ESDE_UNIDAD
            FROM ENSAMBLES_DETALLE
            WHERE ENSA_ID = :itemaux
            into :codcomp, :descomp, :cantcomp, :unicomp
            DO
            BEGIN
            SUSPEND;
            ARTICULO = '';
            CODBAR = '';
            ARTIDES = '';
            CANT = 0;
            UNIDAD = '';
            OBSITEM = '';
            esensamble = 'N';
            END
        END
    END
  END
end
^

SET TERM ; ^


/* 20101123d */
SET TERM ^ ;

CREATE OR ALTER PROCEDURE DOCUMENTOS_SIN_CONTABILIZAR(
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    TIPO VARCHAR(10),
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    ID INTEGER,
    TIDO INTEGER,
    CTABCO INTEGER)
AS
declare variable FECICNT VARCHAR(10);
declare variable FECFCNT VARCHAR(10);
declare variable IDREF INTEGER;
begin
EXECUTE PROCEDURE fecha_a_conta(FECINI) returning_values (FECICNT);
EXECUTE PROCEDURE fecha_a_conta(FECFIN) returning_values (FECFCNT);
CTABCO = 0;
TIPO = 'ENTRADA';
TIDO = 11;
FOR SELECT ENTR_ID FROM ENTRADAS
    WHERE ENTR_ANULADO = 'N' AND ENTR_FECHA >= :FECINI AND ENTR_FECHA <= :FECFIN
    INTO :ID
DO
begin
  IDREF = null;
  SELECT first 1 ENCO_IDREF FROM COMPROBANTE_ENCABEZADO WHERE ENCO_TIPOREF = 11 AND ENCO_FECHA >= :FECICNT AND ENCO_FECHA <= :FECFCNT AND ENCO_IDREF = :ID INTO :IDREF;
  if (IDREF IS NULL) then
   begin
    SELECT PREF_PRE, ENTR_NUMERO, ENTR_FECHA FROM ENTRADAS WHERE ENTR_ID = :ID INTO :PREFIJO, :NUMERO, :FECHA;
    suspend;
   end
end
TIPO = 'SALIDA';
TIDO = 12;
FOR SELECT SALI_ID FROM SALIDAS
    WHERE SALI_ANULADO = 'N' AND SALI_FECHA >= :FECINI AND SALI_FECHA <= :FECFIN
    INTO :ID
DO
begin
  IDREF = null;
  SELECT first 1 ENCO_IDREF FROM COMPROBANTE_ENCABEZADO WHERE ENCO_TIPOREF = 12 AND ENCO_FECHA >= :FECICNT AND ENCO_FECHA <= :FECFCNT AND ENCO_IDREF = :ID INTO :IDREF;
  if (IDREF IS NULL) then
   begin
    SELECT PREF_PRE, SALI_NUMERO, SALI_FECHA FROM SALIDAS WHERE SALI_ID = :ID INTO :PREFIJO, :NUMERO, :FECHA;
    suspend;
   end
end
TIPO = 'TRASLADO';
TIDO = 13;
FOR SELECT TRAN_ID FROM TRASFERENCIAS
    WHERE TRAN_ANULADO = 'N' AND TRAN_FECHA >= :FECINI AND TRAN_FECHA <= :FECFIN
    INTO :ID
DO
begin
  IDREF = null;
  SELECT first 1 ENCO_IDREF FROM COMPROBANTE_ENCABEZADO WHERE ENCO_TIPOREF = 13 AND ENCO_FECHA >= :FECICNT AND ENCO_FECHA <= :FECFCNT AND ENCO_IDREF = :ID INTO :IDREF;
  if (IDREF IS NULL) then
   begin
    SELECT PREF_PRE, TRAN_NUMERO, TRAN_FECHA FROM TRASFERENCIAS WHERE TRAN_ID = :ID INTO :PREFIJO, :NUMERO, :FECHA;
    suspend;
   end
end
TIPO = 'AJUS INV.';
TIDO = 14;
FOR SELECT AJUS_ID FROM AJUSTES
    WHERE AJUS_ANULADO = 'N' AND AJUS_FECHA >= :FECINI AND AJUS_FECHA <= :FECFIN
    INTO :ID
DO
begin
  IDREF = null;
  SELECT first 1 ENCO_IDREF FROM COMPROBANTE_ENCABEZADO WHERE ENCO_TIPOREF = 14 AND ENCO_FECHA >= :FECICNT AND ENCO_FECHA <= :FECFCNT AND ENCO_IDREF = :ID INTO :IDREF;
  if (IDREF IS NULL) then
   begin
    SELECT PREF_PRE, AJUS_NUMERO, AJUS_FECHA FROM AJUSTES WHERE AJUS_ID = :ID INTO :PREFIJO, :NUMERO, :FECHA;
    suspend;
   end
end
TIPO = 'ENSAMBLE';
TIDO = 15;
FOR SELECT ENSA_ID FROM ENSAMBLES
    WHERE ENSA_ANULADO = 'N' AND ENSA_FECHA >= :FECINI AND ENSA_FECHA <= :FECFIN
    INTO :ID
DO
begin
  IDREF = null;
  SELECT first 1 ENCO_IDREF FROM COMPROBANTE_ENCABEZADO WHERE ENCO_TIPOREF = 15 AND ENCO_FECHA >= :FECICNT AND ENCO_FECHA <= :FECFCNT AND ENCO_IDREF = :ID INTO :IDREF;
  if (IDREF IS NULL) then
   begin
    SELECT PREF_PRE, ENSA_NUMERO, ENSA_FECHA FROM ENSAMBLES WHERE ENSA_ID = :ID INTO :PREFIJO, :NUMERO, :FECHA;
    suspend;
   end
end
TIPO = 'DESENSAMB.';
TIDO = 16;
FOR SELECT DESE_ID FROM DESENSAMBLES
    WHERE DESE_ANULADO = 'N' AND DESE_FECHA >= :FECINI AND DESE_FECHA <= :FECFIN
    INTO :ID
DO
begin
  IDREF = null;
  SELECT first 1 ENCO_IDREF FROM COMPROBANTE_ENCABEZADO WHERE ENCO_TIPOREF = 16 AND ENCO_FECHA >= :FECICNT AND ENCO_FECHA <= :FECFCNT AND ENCO_IDREF = :ID INTO :IDREF;
  if (IDREF IS NULL) then
   begin
    SELECT PREF_PRE, DESE_NUMERO, DESE_FECHA FROM DESENSAMBLES WHERE DESE_ID = :ID INTO :PREFIJO, :NUMERO, :FECHA;
    suspend;
   end
end
TIPO = 'FAC.COMPRA';
TIDO = 21;
FOR SELECT FACO_ID FROM FACTURAS_COMPRA
    WHERE FACO_ANULADO = 'N' AND FACO_FECHA >= :FECINI AND FACO_FECHA <= :FECFIN
    INTO :ID
DO
begin
  IDREF = null;
  SELECT first 1 ENCO_IDREF FROM COMPROBANTE_ENCABEZADO WHERE ENCO_TIPOREF = 21 AND ENCO_FECHA >= :FECICNT AND ENCO_FECHA <= :FECFCNT AND ENCO_IDREF = :ID INTO :IDREF;
  if (IDREF IS NULL) then
   begin
    SELECT PREF_PRE, FACO_NUMERO, FACO_FECHA FROM FACTURAS_COMPRA WHERE FACO_ID = :ID INTO :PREFIJO, :NUMERO, :FECHA;
    suspend;
   end
end
TIPO = 'DEV.COMPRA';
TIDO = 24;
FOR SELECT DVCO_ID FROM DEVOLUCIONES_COMPRAS
    WHERE DVCO_ANULADO = 'N' AND DVCO_FECHA >= :FECINI AND DVCO_FECHA <= :FECFIN
    INTO :ID
DO
begin
  IDREF = null;
  SELECT first 1 ENCO_IDREF FROM COMPROBANTE_ENCABEZADO WHERE ENCO_TIPOREF = 24 AND ENCO_FECHA >= :FECICNT AND ENCO_FECHA <= :FECFCNT AND ENCO_IDREF = :ID INTO :IDREF;
  if (IDREF IS NULL) then
   begin
    SELECT PREF_PRE, DVCO_NUMERO, DVCO_FECHA FROM DEVOLUCIONES_COMPRAS WHERE DVCO_ID = :ID INTO :PREFIJO, :NUMERO, :FECHA;
    suspend;
   end
end
TIPO = 'FACT.VENTA';
TIDO = 31;
FOR SELECT FACT_ID FROM FACTURAS
    WHERE FACT_ANULADO = 'N' AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND PREF_PRE NOT IN (SELECT PREF_PRE FROM AUTORIZACIONES WHERE AUTO_CONTADO = 'S')
    INTO :ID
DO
begin
  IDREF = null;
  SELECT first 1 ENCO_IDREF FROM COMPROBANTE_ENCABEZADO WHERE ENCO_TIPOREF = 31 AND ENCO_FECHA >= :FECICNT AND ENCO_FECHA <= :FECFCNT AND ENCO_IDREF = :ID INTO :IDREF;
  if (IDREF IS NULL) then
   begin
    SELECT PREF_PRE, FACT_NUMERO, FACT_FECHA FROM FACTURAS WHERE FACT_ID = :ID INTO :PREFIJO, :NUMERO, :FECHA;
    suspend;
   end
end
TIPO = 'DEV.VENTA';
TIDO = 33;
FOR SELECT DEVT_ID FROM DEVOLUCIONES_VENTAS
    WHERE DEVT_ANULADO = 'N' AND ((DEVT_REMID = 0) or (DEVT_REMID IS NULL)) AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN
    INTO :ID
DO
begin
  IDREF = null;
  SELECT first 1 ENCO_IDREF FROM COMPROBANTE_ENCABEZADO WHERE ENCO_TIPOREF = 33 AND ENCO_FECHA >= :FECICNT AND ENCO_FECHA <= :FECFCNT AND ENCO_IDREF = :ID INTO :IDREF;
  if (IDREF IS NULL) then
   begin
    SELECT PREF_PRE, DEVT_NUMERO, DEVT_FECHA FROM DEVOLUCIONES_VENTAS WHERE DEVT_ID = :ID INTO :PREFIJO, :NUMERO, :FECHA;
    suspend;
   end
end
TIPO = 'NOTADB.CLI';
TIDO = 41;
FOR SELECT NDCL_ID FROM NOTAS_DEBITO_CLIENTES
    WHERE NDCL_ANULADO = 'N' AND NDCL_FECHA >= :FECINI AND NDCL_FECHA <= :FECFIN
    INTO :ID
DO
begin
  IDREF = null;
  SELECT first 1 ENCO_IDREF FROM COMPROBANTE_ENCABEZADO WHERE ENCO_TIPOREF = 41 AND ENCO_FECHA >= :FECICNT AND ENCO_FECHA <= :FECFCNT AND ENCO_IDREF = :ID INTO :IDREF;
  if (IDREF IS NULL) then
   begin
    SELECT PREF_PRE, NDCL_NUMERO, NDCL_FECHA FROM NOTAS_DEBITO_CLIENTES WHERE NDCL_ID = :ID INTO :PREFIJO, :NUMERO, :FECHA;
    suspend;
   end
end
TIPO = 'NOTACR.CLI';
TIDO = 42;
FOR SELECT NCCL_ID FROM NOTAS_CREDITO_CLIENTES
    WHERE NCCL_ANULADO = 'N' AND NCCL_FECHA >= :FECINI AND NCCL_FECHA <= :FECFIN
    INTO :ID
DO
begin
  IDREF = null;
  SELECT first 1 ENCO_IDREF FROM COMPROBANTE_ENCABEZADO WHERE ENCO_TIPOREF = 42 AND ENCO_FECHA >= :FECICNT AND ENCO_FECHA <= :FECFCNT AND ENCO_IDREF = :ID INTO :IDREF;
  if (IDREF IS NULL) then
   begin
    SELECT PREF_PRE, NCCL_NUMERO, NCCL_FECHA FROM NOTAS_CREDITO_CLIENTES WHERE NCCL_ID = :ID INTO :PREFIJO, :NUMERO, :FECHA;
    suspend;
   end
end
TIPO = 'APLICA CLI';
TIDO = 43;
FOR SELECT APCL_ID FROM aplicacion_cliente
    WHERE APCL_ANULADO = 'N' AND APCL_FECHA >= :FECINI AND APCL_FECHA <= :FECFIN
    INTO :ID
DO
begin
  IDREF = null;
  SELECT first 1 ENCO_IDREF FROM COMPROBANTE_ENCABEZADO WHERE ENCO_TIPOREF = 43 AND ENCO_FECHA >= :FECICNT AND ENCO_FECHA <= :FECFCNT AND ENCO_IDREF = :ID INTO :IDREF;
  if (IDREF IS NULL) then
   begin
    SELECT PREF_PRE, APCL_NUMERO, APCL_FECHA FROM aplicacion_cliente WHERE APCL_ID = :ID INTO :PREFIJO, :NUMERO, :FECHA;
    suspend;
   end
end
TIPO = 'CAUSA.CXP';
TIDO = 51;
FOR SELECT NDPR_ID FROM NOTAS_DEBITO_PROVEEDOR
    WHERE NDPR_ANULADO = 'N' AND NDPR_FECHA >= :FECINI AND NDPR_FECHA <= :FECFIN
    INTO :ID
DO
begin
  IDREF = null;
  SELECT first 1 ENCO_IDREF FROM COMPROBANTE_ENCABEZADO WHERE ENCO_TIPOREF = 51 AND ENCO_FECHA >= :FECICNT AND ENCO_FECHA <= :FECFCNT AND ENCO_IDREF = :ID INTO :IDREF;
  if (IDREF IS NULL) then
   begin
    SELECT PREF_PRE, NDPR_NUMERO, NDPR_FECHA FROM NOTAS_DEBITO_PROVEEDOR WHERE NDPR_ID = :ID INTO :PREFIJO, :NUMERO, :FECHA;
    suspend;
   end
end
TIPO = 'DESCTO.CXP';
TIDO = 52;
FOR SELECT NCPR_ID FROM NOTAS_CREDITO_PROVEEDOR
    WHERE NCPR_ANULADO = 'N' AND NCPR_FECHA >= :FECINI AND NCPR_FECHA <= :FECFIN
    INTO :ID
DO
begin
  IDREF = null;
  SELECT first 1 ENCO_IDREF FROM COMPROBANTE_ENCABEZADO WHERE ENCO_TIPOREF = 52 AND ENCO_FECHA >= :FECICNT AND ENCO_FECHA <= :FECFCNT AND ENCO_IDREF = :ID INTO :IDREF;
  if (IDREF IS NULL) then
   begin
    SELECT PREF_PRE, NCPR_NUMERO, NCPR_FECHA FROM NOTAS_CREDITO_PROVEEDOR WHERE NCPR_ID = :ID INTO :PREFIJO, :NUMERO, :FECHA;
    suspend;
   end
end
TIPO = 'APLICA PRV';
TIDO = 53;
FOR SELECT APPR_ID FROM aplicacion_provedor
    WHERE APPR_ANULADO = 'N' AND APPR_FECHA >= :FECINI AND APPR_FECHA <= :FECFIN
    INTO :ID
DO
begin
  IDREF = null;
  SELECT first 1 ENCO_IDREF FROM COMPROBANTE_ENCABEZADO WHERE ENCO_TIPOREF = 53 AND ENCO_FECHA >= :FECICNT AND ENCO_FECHA <= :FECFCNT AND ENCO_IDREF = :ID INTO :IDREF;
  if (IDREF IS NULL) then
   begin
    SELECT PREF_PRE, APPR_NUMERO, APPR_FECHA FROM aplicacion_provedor WHERE APPR_ID = :ID INTO :PREFIJO, :NUMERO, :FECHA;
    suspend;
   end
end
/* EXCLUYA LOS DE PREFIJO PARA IGUAL VENTAS DE CONTADO */
TIPO = 'RECI.CAJA';
TIDO = 61;
FOR SELECT RECA_ID FROM RECIBOS_CAJA
    WHERE RECA_ANULADO = 'N' AND RECA_FECHA >= :FECINI AND RECA_FECHA <= :FECFIN AND PREF_PRE NOT IN (SELECT AUTO_PREFRDC FROM AUTORIZACIONES WHERE AUTO_CONTADO = 'S')
    INTO :ID
DO
begin
  IDREF = null;
  SELECT first 1 ENCO_IDREF FROM COMPROBANTE_ENCABEZADO WHERE ENCO_TIPOREF = 61 AND ENCO_FECHA >= :FECICNT AND ENCO_FECHA <= :FECFCNT AND ENCO_IDREF = :ID INTO :IDREF;
  if (IDREF IS NULL) then
   begin
    SELECT PREF_PRE, RECA_NUMERO, RECA_FECHA FROM RECIBOS_CAJA WHERE RECA_ID = :ID INTO :PREFIJO, :NUMERO, :FECHA;
    suspend;
   end
end
TIPO = 'EGRESOS';
TIDO = 62;
FOR SELECT EGRE_ID FROM EGRESOS
    WHERE EGRE_ANULADO = 'N' AND EGRE_FECHA >= :FECINI AND EGRE_FECHA <= :FECFIN
    INTO :ID
DO
begin
  IDREF = null;
  SELECT first 1 ENCO_IDREF FROM COMPROBANTE_ENCABEZADO WHERE ENCO_TIPOREF = 62 AND ENCO_FECHA >= :FECICNT AND ENCO_FECHA <= :FECFCNT AND ENCO_IDREF = :ID INTO :IDREF;
  if (IDREF IS NULL) then
   begin
    SELECT PREF_PRE, EGRE_NUMERO, EGRE_FECHA FROM EGRESOS WHERE EGRE_ID = :ID INTO :PREFIJO, :NUMERO, :FECHA;
    suspend;
   end
end
TIPO = 'CONS.TARJ.';
TIDO = 64;
FOR SELECT COTJ_ID FROM CONSIGNA_TARJETAS
    WHERE COTJ_ANULADO = 'N' AND COTJ_FECHA >= :FECINI AND COTJ_FECHA <= :FECFIN
    INTO :ID
DO
begin
  IDREF = null;
  SELECT first 1 ENCO_IDREF FROM COMPROBANTE_ENCABEZADO WHERE ENCO_TIPOREF = 64 AND ENCO_FECHA >= :FECICNT AND ENCO_FECHA <= :FECFCNT AND ENCO_IDREF = :ID INTO :IDREF;
  if (IDREF IS NULL) then
   begin
    SELECT PREF_PRE,COTJ_NUMERO, COTJ_FECHA FROM CONSIGNA_TARJETAS WHERE COTJ_ID = :ID INTO :PREFIJO, :NUMERO, :FECHA;
    suspend;
   end
end
TIPO = 'TR. CAJA';
TIDO = 66;
FOR SELECT TRCJ_ID FROM TRASLADOS_CAJA
    WHERE TRCJ_ANULADO = 'N' AND TRCJ_FECHA >= :FECINI AND TRCJ_FECHA <= :FECFIN
    INTO :ID
DO
begin
  IDREF = null;
  SELECT first 1 ENCO_IDREF FROM COMPROBANTE_ENCABEZADO WHERE ENCO_TIPOREF = 66 AND ENCO_FECHA >= :FECICNT AND ENCO_FECHA <= :FECFCNT AND ENCO_IDREF = :ID INTO :IDREF;
  if (IDREF IS NULL) then
   begin
    SELECT PREF_PRE, TRCJ_NUMERO, TRCJ_FECHA FROM TRASLADOS_CAJA WHERE TRCJ_ID = :ID INTO :PREFIJO, :NUMERO, :FECHA;
    suspend;
   end
end
TIPO = 'CONSIGNA';
TIDO = 71;
FOR SELECT CONS_ID FROM CONSIGNA
    WHERE CONS_ANULADO = 'N' AND CONS_FECHA >= :FECINI AND CONS_FECHA <= :FECFIN
    INTO :ID
DO
begin
  IDREF = null;
  SELECT first 1 ENCO_IDREF FROM COMPROBANTE_ENCABEZADO WHERE ENCO_TIPOREF = 71 AND ENCO_FECHA >= :FECICNT AND ENCO_FECHA <= :FECFCNT AND ENCO_IDREF = :ID INTO :IDREF;
  if (IDREF IS NULL) then
   begin
    SELECT PRBA_PREF, CONS_NUMERO, CONS_FECHA, CUBA_COD FROM CONSIGNA WHERE CONS_ID = :ID INTO :PREFIJO, :NUMERO, :FECHA, :CTABCO;
    suspend;
   end
end
TIPO = 'CARGO BCO';
TIDO = 74;
FOR SELECT NDBC_ID FROM NOTAS_DEBITO
    WHERE NDBC_ANULADO = 'N' AND NDBC_FECHA >= :FECINI AND NDBC_FECHA <= :FECFIN
    INTO :ID
DO
begin
  IDREF = null;
  SELECT first 1 ENCO_IDREF FROM COMPROBANTE_ENCABEZADO WHERE ENCO_TIPOREF = 74 AND ENCO_FECHA >= :FECICNT AND ENCO_FECHA <= :FECFCNT AND ENCO_IDREF = :ID INTO :IDREF;
  if (IDREF IS NULL) then
   begin
    SELECT PRBA_PREF, NDBC_NUMERO, NDBC_FECHA, CUBA_COD FROM NOTAS_DEBITO WHERE NDBC_ID = :ID INTO :PREFIJO, :NUMERO, :FECHA, :CTABCO;
    suspend;
   end
end
TIPO = 'ABONO BCO';
TIDO = 75;
FOR SELECT NCBC_ID FROM NOTAS_CREDITO
    WHERE NCBC_ANULADO = 'N' AND NCBC_FECHA >= :FECINI AND NCBC_FECHA <= :FECFIN
    INTO :ID
DO
begin
  IDREF = null;
  SELECT first 1 ENCO_IDREF FROM COMPROBANTE_ENCABEZADO WHERE ENCO_TIPOREF = 75 AND ENCO_FECHA >= :FECICNT AND ENCO_FECHA <= :FECFCNT AND ENCO_IDREF = :ID INTO :IDREF;
  if (IDREF IS NULL) then
   begin
    SELECT PRBA_PREF, NCBC_NUMERO, NCBC_FECHA, CUBA_COD FROM NOTAS_CREDITO WHERE NCBC_ID = :ID INTO :PREFIJO, :NUMERO, :FECHA, :CTABCO;
    suspend;
   end
end
TIPO = 'TRAS.BANCO';
TIDO = 76;
FOR SELECT TRAS_ID FROM TRASLADOS
    WHERE TRAS_ANULADO = 'N' AND TRAS_FECHA >= :FECINI AND TRAS_FECHA <= :FECFIN
    INTO :ID
DO
begin
  IDREF = null;
  SELECT first 1 ENCO_IDREF FROM COMPROBANTE_ENCABEZADO WHERE ENCO_TIPOREF = 76 AND ENCO_FECHA >= :FECICNT AND ENCO_FECHA <= :FECFCNT AND ENCO_IDREF = :ID INTO :IDREF;
  if (IDREF IS NULL) then
   begin
    SELECT PRBA_PREF, TRAS_NUMERO, TRAS_FECHA, CUBA_COD FROM TRASLADOS WHERE TRAS_ID = :ID INTO :PREFIJO, :NUMERO, :FECHA, :CTABCO;
    suspend;
   end
end
TIPO = 'DEVOL.CHQ.';
TIDO = 77;
FOR SELECT DVCH_ID FROM DEVOLUCION_CHEQUES
    WHERE DVCH_ANULADO = 'N' AND DVCH_FECHA >= :FECINI AND DVCH_FECHA <= :FECFIN
    INTO :ID
DO
begin
  IDREF = null;
  SELECT first 1 ENCO_IDREF FROM COMPROBANTE_ENCABEZADO WHERE ENCO_TIPOREF = 77 AND ENCO_FECHA >= :FECICNT AND ENCO_FECHA <= :FECFCNT AND ENCO_IDREF = :ID INTO :IDREF;
  if (IDREF IS NULL) then
   begin
    SELECT PRBA_PREF, DVCH_NUMDOC, DVCH_FECHA, CUBA_COD FROM DEVOLUCION_CHEQUES WHERE DVCH_ID = :ID INTO :PREFIJO, :NUMERO, :FECHA, :CTABCO;
    suspend;
   end
end
end
^

SET TERM ; ^

/* 20101124 */
/* valor aplicado menos retenciones */
SET TERM ^ ;

CREATE OR ALTER TRIGGER DEVOLUCIONES_VENTAS_AI FOR DEVOLUCIONES_VENTAS
ACTIVE AFTER INSERT POSITION 0
AS
declare variable CONC VARCHAR(60);
declare variable crmeven char(2);
declare variable ID INTEGER;
declare variable nomtipod VARCHAR(8);
declare variable nomtipoF VARCHAR(8);
declare variable PREF VARCHAR(4);
declare variable numero varchar(6);
declare variable SALDO NUMERIC(18,2);
declare variable RTFTE NUMERIC(18,2);
declare variable RTIVA NUMERIC(18,2);
declare variable RTICA NUMERIC(18,2);
declare variable AGENCIA INTEGER;
declare variable IDC INTEGER;
BEGIN
if ((NEW.DEVT_ID <> 0) and (new.devt_anulado = 'N')) then
    BEGIN
    if (((new.devt_remid IS NULL) or (new.devt_remid = 0)) and ((new.devt_pedid IS NULL) or (new.devt_pedid = 0))) then
      if (new.devt_confirmacxc = 'S') then
        begin
        /* Registre el nuevo saldo del documento */
        INSERT INTO SALDOS_DOC_CARTERA (SDCA_TIPOREF, SDCA_IDREF, SDCA_FECHA, TERC_NIT, SDCA_RTFTE, SDCA_RTIVA, SDCA_RTICA, SDCA_ABONO, SDCA_ABRTFTE, SDCA_ABRTIVA, SDCA_ABRTICA, SDCA_DEBITO, SDCA_MONTO, SDCA_TRM)
            VALUES (33, NEW.DEVT_ID, NEW.DEVT_fecha, NEW.terc_nit, (NEW.DEVT_rtftemonto*-1), (NEW.DEVT_rtivamonto*-1), (NEW.DEVT_rticamonto*-1), 0, 0, 0, 0, 'N', (NEW.DEVT_TOTAL*-1), new.devt_trm);
        /* Registre el movimiento del cliente */
        CONC = 'DEVOLUCION VENTA No.' || NEW.PREF_PRE || NEW.DEVT_NUMERO || ' EN FACTURA ' || NEW.devt_factura;
        INSERT INTO MOVIMIENTO_CLIENTES (MVCL_ID, TERC_NIT, MVCL_TIPOREF, MVCL_IDREF, MVCL_FECHA, MVCL_VENCE, MVCL_CONC, MVCL_MONTO, MVCL_RTEFTE, MVCL_RTEIVA, MVCL_RTEICA, MVCL_DEBITO, MVCL_ABONO, MVCL_PREFREF, MVCL_NUMREF, MVCL_SUCURSAL, COBR_COD, MVCL_TRM)
          VALUES (GEN_ID(ID_MOVCLI, 1), NEW.TERC_NIT, 33, NEW.DEVT_ID, NEW.DEVT_FECHA, NEW.DEVT_FECHA, :CONC, NEW.DEVT_TOTAL, NEW.DEVT_RTFTEMONTO, NEW.DEVT_RTIVAMONTO, NEW.DEVT_RTICAMONTO, 'N', 'N', NEW.pref_pre, NEW.DEVT_numero, NEW.devt_sucursal, NEW.cobr_cod, new.devt_trm);
        end
    /* ACTUALICE LA CONSOLIDACION */
    if (NEW.DEVT_CONSOLIDA <> 0) then
        UPDATE consolidado_faltantes SET COFA_IDDES = NEW.devt_id, COFA_OK = 'S' WHERE COFA_ID = NEW.devt_consolida;
    execute procedure lee_configuracion ('CRM', 'EVENTOS', 'GRABAR EVENTOS AUTOMATICAMENTE DESDE DOCUMENTOS DE VENTAS') returning_values (:crmeven);
    if (crmeven = 'SI') then
        begin
        if (new.devt_confirmacxc = 'S') then
            insert into crm_eventos (CREV_TIPO, CREV_ORIGEN, CREV_FECHA, CREV_HORA, CREV_MOTIVO, CREV_ASESOR, CREV_VALOR, CREV_EXPLICA, CREV_OBS, CREV_ACTIVIDAD, CRCL_NIT, CREV_ANULADO)
                VALUES (905, new.devt_id, new.devt_fecha, cast('now' as time), 6, new.vend_cod, new.devt_total, 'Devolución No. ' || new.pref_pre || new.devt_numero, new.devt_obs, 0, new.terc_nit, new.devt_anulado);
        else
            insert into crm_eventos (CREV_TIPO, CREV_ORIGEN, CREV_FECHA, CREV_HORA, CREV_MOTIVO, CREV_ASESOR, CREV_VALOR, CREV_EXPLICA, CREV_OBS, CREV_ACTIVIDAD, CRCL_NIT, CREV_ANULADO)
                VALUES (905, new.devt_id, new.devt_fecha, cast('now' as time), 6, new.vend_cod, new.devt_total, 'Devolución No. ' || new.pref_pre || new.devt_numero || ' sin confirmar cartera.', new.devt_obs, 0, new.terc_nit, new.devt_anulado);
        end
    if (new.devt_factid <> 0) then
        begin
        if (new.devt_confirmacxc = 'S') then
            BEGIN
            INSERT INTO notas_documento (NODO_ID, TIDO_COD, NODO_IDDOC, NODO_FECHA, NODO_USER, NODO_RESUMEN, NODO_TIPO)
                VALUES (GEN_ID(id_notadoc, 1), 31, new.devt_factid, NEW.devt_fecha, user, 'Devolución No. ' || new.pref_pre || new.devt_numero, 7);
        
            EXECUTE PROCEDURE SALDOS_FACTURA(NEW.devt_factid, '9999/12/31') returning_values (:SALDO, :rtfte, :rtiva, :rtica);
            if ((new.devt_aplica = 'S') AND (SALDO >= (NEW.devt_total-NEW.devt_RTFTEMONTO-NEW.devt_rtivamonto-NEW.devt_rticamonto)) AND (RTFTE >= NEW.devt_RTFTEMONTO) AND (RTIVA >= NEW.devt_rtivamonto) AND (RTICA >= NEW.devt_rticamonto)) then
                begin
                ID = gen_id(id_aplicaclie, 1);
                SELECT SUCU_ID FROM PREFIJOS WHERE PREF_PRE = NEW.pref_pre AND TIDO_COD = 33 INTO :AGENCIA;
                if (agencia is null) then
                    agencia = 0;
                SELECT FIRST 1 PREF_PRE, PREF_ACTUAL FROM PREFIJOS WHERE ((SUCU_ID = :AGENCIA) or (:AGENCIA = 0)) AND TIDO_COD = 43 and pref_activo = 'S' INTO :PREF, :numero;
                SELECT TIDO_NOMCORTO FROM tipo_documento WHERE TIDO_COD = 33 INTO :nomtipod;
                SELECT TIDO_NOMCORTO FROM tipo_documento WHERE TIDO_COD = 31 INTO :nomtipof;
                INSERT INTO APLICACION_CLIENTE (APCL_ID, TERC_NIT, TIDO_COD, PREF_PRE, APCL_NUMERO,
                    APCL_FECHA, APCL_CONCEPTO, APCL_OBS, APCL_ANULADO, APCL_TRANSMIT, COBR_COD,
                    APCL_USUARIO, APCL_SUCURSAL, NUMOK, APCL_TRM)
                    VALUES (:ID, NEW.terc_nit, 43, :PREF, :NUMERO, NEW.devt_fecha,
                    'APLICACION ' || :nomtipod || ' ' || NEW.pref_pre || NEW.devt_numero || ' A ' || :nomtipof || ' ' || NEW.devt_factura, NULL, 'N', 'N', NEW.cobr_cod,
                    NULL, NEW.devt_sucursal, 'N', 1);
                INSERT INTO APLICACION_CLIENTE_DETALLE (APCL_ID, ACDE_ITEM, ACDE_TIPODOC, ACDE_IDDOC,
                    ACDE_PREFIJO, ACDE_NUMERO, ACDE_APLICADO, ACDE_RTFTE, ACDE_RTIVA, ACDE_RTICA,
                    ACDE_ANULADO, ACDE_TRANSMIT, ACDE_DIFCAMBIO)
                    VALUES (:ID, 1, 33, NEW.devt_id, NEW.pref_pre, NEW.devt_numero, (NEW.devt_total-new.devt_rtftemonto-new.devt_rtivamonto-new.devt_rticamonto)*-1, new.devt_rtftemonto*-1, new.devt_rtivamonto*-1, new.devt_rticamonto*-1, 'N', 'N', 0);
                SELECT PREF_PRE, FACT_NUMERO FROM FACTURAS WHERE FACT_ID = NEW.devt_factid INTO :pref, :numero;
                INSERT INTO APLICACION_CLIENTE_DETALLE (APCL_ID, ACDE_ITEM, ACDE_TIPODOC, ACDE_IDDOC,
                    ACDE_PREFIJO, ACDE_NUMERO, ACDE_APLICADO, ACDE_RTFTE, ACDE_RTIVA, ACDE_RTICA,
                    ACDE_ANULADO, ACDE_TRANSMIT, ACDE_DIFCAMBIO)
                    VALUES (:ID, 2, 31, NEW.devt_factid, :pref, :numero, (NEW.devt_total-new.devt_rtftemonto-new.devt_rtivamonto-new.devt_rticamonto), new.devt_rtftemonto, new.devt_rtivamonto, new.devt_rticamonto, 'N', 'N', 0);
                IDC = gen_id(id_cons, 1);
                INSERT INTO CONSOLIDE_FALTANTES (CEFA_ID, CEFA_ITEM, CEFA_TIPODES, CEFA_TIPOORI, CEFA_IDORI)
                    VALUES (:IDC, 0, 43, 33, NEW.devt_id);
                INSERT INTO CONSOLIDADO_FALTANTES (COFA_ITEM, COFA_ID, COFA_TIPODES, COFA_TIPOORI, COFA_IDORI, COFA_IDDES, COFA_OK)
                    VALUES (1, :IDC, 43, 33, NEW.devt_id, :ID, 'S');
                end
            END
        else
            INSERT INTO notas_documento (NODO_ID, TIDO_COD, NODO_IDDOC, NODO_FECHA, NODO_USER, NODO_RESUMEN, NODO_TIPO)
                VALUES (GEN_ID(id_notadoc, 1), 31, new.devt_factid, NEW.devt_fecha, user, 'Devolución No. ' || new.pref_pre || new.devt_numero || ' sin confirmar cartera', 7);
        end

    INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
        VALUES (USER, 33, NEW.devt_id, 'I', NEW.pref_pre || NEW.devt_numero);
    END
END
^

SET TERM ; ^


SET TERM ^ ;

CREATE OR ALTER TRIGGER DEVOLUCIONES_VENTAS_AU FOR DEVOLUCIONES_VENTAS
ACTIVE AFTER UPDATE POSITION 0
AS
declare variable ABONOS integer;
declare variable CONC VARCHAR(60);
declare variable consec INTEGER;
declare variable ID INTEGER;
declare variable nomtipod VARCHAR(8);
declare variable nomtipoF VARCHAR(8);
declare variable PREF VARCHAR(4);
declare variable numero varchar(6);
declare variable SALDO NUMERIC(18,2);
declare variable RTFTE NUMERIC(18,2);
declare variable RTIVA NUMERIC(18,2);
declare variable RTICA NUMERIC(18,2);
declare variable AGENCIA INTEGER;
declare variable IDC INTEGER;
BEGIN
if (new.devt_anulado = 'S') then
    begin
    select enco_consec from comprobante_encabezado where enco_tiporef = 33 and enco_idref = old.devt_id into :consec;
    if (NOT consec is null) then
      delete from comprobante_detalle where enco_consec = :consec;
    delete from comprobante_encabezado where enco_tiporef = 33 and enco_idref = old.devt_id;
    delete from crm_eventos where crev_tipo = 905 and crev_origen = old.devt_id;

    DELETE FROM puntos_cliente WHERE PTCL_TIPODOC = 33 AND PTCL_IDDOC = OLD.devt_id;

    /* SI SE HIZO APLICACION ANULELA */
    ID = 0;
    SELECT COFA_IDDES FROM consolidado_faltantes WHERE COFA_TIPODES = 43 AND COFA_TIPOORI = 33 AND COFA_IDORI = OLD.devt_id INTO :ID;
    if (ID <> 0) then
        UPDATE aplicacion_cliente SET APCL_ANULADO = 'S' WHERE APCL_ID = :ID;

    INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
        VALUES (USER, 33, NEW.devt_id, 'A', NEW.pref_pre || NEW.devt_numero);
    end
ELSE
    BEGIN
    /* SI SE HIZO APLICACION ANULELA */
    ID = 0;
    SELECT COFA_IDDES FROM consolidado_faltantes WHERE COFA_TIPODES = 43 AND COFA_TIPOORI = 33 AND COFA_IDORI = OLD.devt_id INTO :ID;
    if (ID <> 0) then
        BEGIN
        DELETE FROM aplicacion_cliente_detalle WHERE APCL_ID = :ID;
        DELETE FROM aplicacion_cliente WHERE APCL_ID = :ID;
        delete from consolidado_faltantes WHERE COFA_TIPODES = 43 AND COFA_TIPOORI = 33 AND COFA_IDORI = OLD.devt_id;
        END
    END
if ((old.DEVT_id <> 0) and (old.devt_anulado = 'N')) then
    begin
    if (((old.devt_remid = 0) or (old.devt_remid is null)) and ((old.devt_pedid = 0) or (old.devt_pedid is null))) then
        begin
        ABONOS = 0;
        select COUNT(*) FROM SALDOS_DOC_CARTERA WHERE SDCA_TIPOREF = 33 AND SDCA_IDREF = OLD.DEVT_ID AND SDCA_ABONO <> 0 INTO :ABONOS;
        if (ABONOS = 0) then
            BEGIN
            /* BORRE EL REGISTRO PREVIO */
            delete from saldos_doc_cartera where sdca_tiporef = 33 and sdca_idref = old.devt_id;
            delete from movimiento_clientes where (mvcl_tiporef = 33) and (mvcl_idref = old.devt_id);

            /* ACTUALICE LA CONSOLIDACION */
            if (OLD.DEVT_CONSOLIDA <> 0) then
                UPDATE consolidado_faltantes SET COFA_OK = 'N' WHERE COFA_ID = old.devt_consolida;
            END
        else
            exception DOCUMENTO_CON_ABONOS 'La devolución ' || old.pref_pre || old.devt_numero || ' tiene abonos registrados.';
        end
    else
        if (OLD.DEVT_CONSOLIDA <> 0) then
            UPDATE consolidado_faltantes SET COFA_OK = 'N' WHERE COFA_ID = old.devt_consolida;
    END
if ((new.DEVT_id <> 0) and (new.devt_anulado = 'N')) then
    BEGIN
    if (((new.devt_remid IS NULL) or (new.devt_remid = 0)) and ((new.devt_pedid IS NULL) or (new.devt_pedid = 0))) then
        begin
        if (new.devt_confirmacxc = 'S') then
            begin
            /* Registre el nuevo saldo del documento */
            INSERT INTO SALDOS_DOC_CARTERA (SDCA_TIPOREF, SDCA_IDREF, SDCA_FECHA, TERC_NIT, SDCA_RTFTE, SDCA_RTIVA, SDCA_RTICA, SDCA_ABONO, SDCA_ABRTFTE, SDCA_ABRTIVA, SDCA_ABRTICA, SDCA_DEBITO, SDCA_MONTO, SDCA_TRM)
                VALUES (33, NEW.DEVT_ID, NEW.DEVT_fecha, NEW.terc_nit, (NEW.DEVT_rtftemonto*-1), (NEW.DEVT_rtivamonto*-1), (NEW.DEVT_rticamonto*-1), 0, 0, 0, 0, 'N', (NEW.DEVT_TOTAL*-1), NEW.devt_trm);
            /* Registre el movimiento del cliente */
            CONC = 'DEVOLUCION VENTA No.' || NEW.PREF_PRE || NEW.DEVT_NUMERO || ' EN FACTURA ' || NEW.devt_factura;
            INSERT INTO MOVIMIENTO_CLIENTES (MVCL_ID, TERC_NIT, MVCL_TIPOREF, MVCL_IDREF, MVCL_FECHA, MVCL_VENCE, MVCL_CONC, MVCL_MONTO, MVCL_RTEFTE, MVCL_RTEIVA, MVCL_RTEICA, MVCL_DEBITO, MVCL_ABONO, MVCL_PREFREF, MVCL_NUMREF, MVCL_SUCURSAL, COBR_COD, MVCL_TRM)
                VALUES (GEN_ID(ID_MOVCLI, 1), NEW.TERC_NIT, 33, NEW.DEVT_ID, NEW.DEVT_FECHA, NEW.DEVT_FECHA, :CONC, NEW.DEVT_TOTAL, NEW.DEVT_RTFTEMONTO, NEW.DEVT_RTIVAMONTO, NEW.DEVT_RTICAMONTO, 'N', 'N', NEW.pref_pre, NEW.DEVT_numero, NEW.devt_sucursal, NEW.cobr_cod, NEW.devt_trm);

            if (new.devt_factid <> 0) then
                begin
                EXECUTE PROCEDURE SALDOS_FACTURA(NEW.devt_factid, '9999/12/31') returning_values (:SALDO, :rtfte, :rtiva, :rtica);
                if ((new.devt_aplica = 'S') AND (SALDO >= (NEW.devt_total-NEW.devt_RTFTEMONTO-NEW.devt_rtivamonto-NEW.devt_rticamonto)) AND (RTFTE >= NEW.devt_RTFTEMONTO) AND (RTIVA >= NEW.devt_rtivamonto) AND (RTICA >= NEW.devt_rticamonto)) then
                    begin
                    ID = gen_id(id_aplicaclie, 1);
                    SELECT SUCU_ID FROM PREFIJOS WHERE PREF_PRE = NEW.pref_pre AND TIDO_COD = 33 INTO :AGENCIA;
                    if (agencia is null) then
                        agencia = 0;
                    SELECT FIRST 1 PREF_PRE, PREF_ACTUAL FROM PREFIJOS WHERE ((SUCU_ID = :AGENCIA) or (:AGENCIA = 0)) AND TIDO_COD = 43 and pref_activo = 'S' INTO :PREF, :numero;
                    SELECT TIDO_NOMCORTO FROM tipo_documento WHERE TIDO_COD = 33 INTO :nomtipod;
                    SELECT TIDO_NOMCORTO FROM tipo_documento WHERE TIDO_COD = 31 INTO :nomtipof;
                    INSERT INTO APLICACION_CLIENTE (APCL_ID, TERC_NIT, TIDO_COD, PREF_PRE, APCL_NUMERO,
                        APCL_FECHA, APCL_CONCEPTO, APCL_OBS, APCL_ANULADO, APCL_TRANSMIT, COBR_COD,
                        APCL_USUARIO, APCL_SUCURSAL, NUMOK, APCL_TRM)
                        VALUES (:ID, NEW.terc_nit, 43, :PREF, :NUMERO, NEW.devt_fecha,
                        'APLICACION ' || :nomtipod || ' ' || NEW.pref_pre || NEW.devt_numero || ' A ' || :nomtipof || ' ' || NEW.devt_factura, NULL, 'N', 'N', NEW.cobr_cod,
                        NULL, NEW.devt_sucursal, 'N', 1);
                    INSERT INTO APLICACION_CLIENTE_DETALLE (APCL_ID, ACDE_ITEM, ACDE_TIPODOC, ACDE_IDDOC,
                        ACDE_PREFIJO, ACDE_NUMERO, ACDE_APLICADO, ACDE_RTFTE, ACDE_RTIVA, ACDE_RTICA,
                        ACDE_ANULADO, ACDE_TRANSMIT, ACDE_DIFCAMBIO)
                        VALUES (:ID, 1, 33, NEW.devt_id, NEW.pref_pre, NEW.devt_numero, (NEW.devt_total-new.devt_rtftemonto-new.devt_rtivamonto-new.devt_rticamonto)*-1, new.devt_rtftemonto*-1, new.devt_rtivamonto*-1, new.devt_rticamonto*-1, 'N', 'N', 0);
                    SELECT PREF_PRE, FACT_NUMERO FROM FACTURAS WHERE FACT_ID = NEW.devt_factid INTO :pref, :numero;
                    INSERT INTO APLICACION_CLIENTE_DETALLE (APCL_ID, ACDE_ITEM, ACDE_TIPODOC, ACDE_IDDOC,
                        ACDE_PREFIJO, ACDE_NUMERO, ACDE_APLICADO, ACDE_RTFTE, ACDE_RTIVA, ACDE_RTICA,
                        ACDE_ANULADO, ACDE_TRANSMIT, ACDE_DIFCAMBIO)
                        VALUES (:ID, 2, 31, NEW.devt_factid, :pref, :numero, (NEW.devt_total-new.devt_rtftemonto-new.devt_rtivamonto-new.devt_rticamonto), new.devt_rtftemonto, new.devt_rtivamonto, new.devt_rticamonto, 'N', 'N', 0);
                    IDC = gen_id(id_cons, 1);
                    INSERT INTO CONSOLIDE_FALTANTES (CEFA_ID, CEFA_ITEM, CEFA_TIPODES, CEFA_TIPOORI, CEFA_IDORI)
                        VALUES (:IDC, 0, 43, 33, NEW.devt_id);
                    INSERT INTO CONSOLIDADO_FALTANTES (COFA_ITEM, COFA_ID, COFA_TIPODES, COFA_TIPOORI, COFA_IDORI, COFA_IDDES, COFA_OK)
                        VALUES (1, :IDC, 43, 33, NEW.devt_id, :ID, 'S');
                    end
                end
            end
        /* ACTUALICE LA CONSOLIDACION */
        if (NEW.DEVT_CONSOLIDA <> 0) then
            UPDATE consolidado_faltantes SET COFA_IDDES = NEW.devt_id, COFA_OK = 'S' WHERE COFA_ID = NEW.devt_consolida;
        end
    INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
        VALUES (USER, 33, NEW.devt_id, 'U', NEW.pref_pre || NEW.devt_numero);
    END
/* si cambio un dato critico actualice el detalle */
if ((OLD.devt_fecha <> NEW.devt_fecha) or
    (OLD.devt_numero <> NEW.devt_numero) or
    (OLD.pref_pre <> NEW.pref_pre) or
    (OLD.devt_factid <> NEW.devt_factid)) then
    UPDATE DEVOLUCIONES_VENTAS_DETALLE
        SET DVDE_TRANSMIT = 'N'
        WHERE DEVT_ID = NEW.DEVT_ID;
/* ACTUALICE EL ANULADO EN LOS DETALLES */
if (OLD.DEVT_anulado <> NEW.DEVT_anulado) then
    UPDATE DEVOLUCIONES_VENTAS_DETALLE
        SET DVDE_ANULADO = NEW.DEVT_anulado
        WHERE DEVT_ID = NEW.DEVT_ID;
if (OLD.devt_transmit <> NEW.devt_transmit) then
    UPDATE DEVOLUCIONES_VENTAS_DETALLE
        SET DVDE_TRANSMIT = NEW.devt_transmit
        WHERE DEVT_ID = NEW.DEVT_ID;
END
^

SET TERM ; ^

/* 20101125 */
/* INTERFAZ CON CENTROS DE COSTO CONSTANTES PARA MOVIMIENTOS DE INVENTARIO */
ALTER TABLE INTERFAZ_INVENTARIO
ADD ININ_CODPROY T_PROYECTO;
ALTER TABLE INTERFAZ_INVENTARIO
ADD ININ_CODCENT T_CENTRO;

SET TERM ^ ;

CREATE OR ALTER procedure CONTABIL_SALIDA (
    IDDOC integer,
    IDINTER integer)
returns (
    ERROR integer,
    VER char(1),
    IDC integer)
AS
declare variable PREFIJO VARCHAR(4);
declare variable NUMERO VARCHAR(6);
declare variable FECAUX DATE;
declare variable FECHA CHAR(8);
declare variable CONCEPTO CHAR(60);
declare variable TIPOCOMP VARCHAR(3);
declare variable PREFCONT VARCHAR(4);
declare variable CTACIERRE VARCHAR(20);
declare variable BASE CHAR(1);
declare variable IVAV CHAR(1);
declare variable CONSUMO CHAR(1);
declare variable TOTAL CHAR(1);
declare variable EXISTE CHAR(1);
declare variable CUENTA VARCHAR(20);
declare variable MONTO NUMERIC(18,2);
declare variable TIPOCUEN CHAR(1);
declare variable NIT VARCHAR(20);
declare variable PROY VARCHAR(4);
declare variable CENTRO VARCHAR(4);
declare variable DEBITO NUMERIC(18,2);
declare variable CREDITO NUMERIC(18,2);
declare variable NUMITEMS INTEGER;
declare variable ARTICULO VARCHAR(15);
declare variable IMPINC CHAR(1);
declare variable IMPTOS NUMERIC(18, 2);
declare variable SUMA NUMERIC(18,2);
declare variable CTABASE VARCHAR(20);
declare variable CTAIVA VARCHAR(20);
declare variable CTACONSUMO VARCHAR(20);
declare variable VRBASE NUMERIC(18,2);
declare variable CUENTAADIC VARCHAR(20);
declare variable BASEADIC VARCHAR(20);
declare variable PORCADIC NUMERIC(5,2);
declare variable VALORADIC NUMERIC(18,2);
declare variable DBADIC CHAR(1);
declare variable PROV CHAR(1);
declare variable ANULADO CHAR(1);
declare variable CENT CHAR(1);
BEGIN
ERROR = 0;
/* BUSQUE LA INTERFACE */
EXISTE = 'N';
SELECT 'S', PREF_PRE, TICO_COD, PRCO_PREF, ININ_BASE, ININ_IVAV, ININ_CONSUMO, ININ_TOTAL, ININ_CTABASE, ININ_CTAIVA, ININ_CTACONSUMO, ININ_CTACIERRE, ININ_CONFIRMAR, ININ_CENTRO, ININ_CODPROY, ININ_CODCENT
    FROM INTERFAZ_INVENTARIO
    WHERE ININ_ID = :IDINTER
    INTO :EXISTE, :PREFIJO, :TIPOCOMP, :PREFCONT, :BASE, :IVAV, :CONSUMO, :TOTAL, :CTABASE, :CTAIVA, :CTACONSUMO, :CTACIERRE, :VER, :CENT, :proy, :centro;
if (EXISTE = 'S') then
    BEGIN
    /* TRAIGA EL ENCABEZADO DE LA SALIDA */
    SELECT PREF_PRE, SALI_NUMERO, SALI_FECHA, SALI_CONC, TERC_NIT, SALI_IMPTOS, SALI_ANULADO
        FROM SALIDAS
        WHERE SALI_ID = :IDDOC
        INTO :PREFIJO, :NUMERO, :FECAUX, :CONCEPTO, :NIT, :IMPINC, :ANULADO;
    if ((NIT IS NULL) or (NIT = '')) then
        EXECUTE PROCEDURE LEE_CONFIGURACION('CONTABILIDAD', 'GENERAL', 'NIT COMPAÑIA') RETURNING_VALUES (:NIT);
    /* BORRE CUALQUEIR CONTABILIZACION PREVIA */
    DELETE FROM CONTABILIZACION WHERE CNTB_TIPOREF = 12 AND CNTB_IDREF = :IDDOC;

    if (ANULADO = 'N') then
        BEGIN
        if (CENT = 'B') then
            SELECT BODE_CENTRO, BODE_PROY FROM BODEGA B, SALIDAS E
                WHERE B.BODE_COD = E.BODE_COD AND E.SALI_ID = :IDDOC INTO :CENTRO, :PROY;
        ELSE
          if (CENT = 'P') then
            SELECT PREF_CENTRO, PREF_PROY FROM PREFIJOS P, SALIDAS E
                WHERE P.PREF_PRE = E.PREF_PRE AND E.SALI_ID = :IDDOC AND P.TIDO_COD = 12 INTO :CENTRO, :PROY;
        /* CONVIERTA LA FECHA A CADENA */
        EXECUTE PROCEDURE FECHA_A_CONTA(:FECAUX) returning_values (:FECHA);
        IDC = GEN_ID(ID_CONTABILIZA, 1);
        /* REGISTRE EL ENCABEZADO CONTABLE */
        INSERT INTO CONTABILIZACION (CNTB_ID, CNTB_TIPOCOMP, CNTB_PREFCNT, CNTB_NUMERO, CNTB_FECHA, CNTB_CONCEPTO, CNTB_REF, CNTB_TIPOREF, CNTB_IDREF, CNTB_PREFREF, CNTB_NUMREF, CNTB_PROCESADO)
            VALUES (:IDC, :TIPOCOMP, :PREFCONT, :NUMERO, :FECHA, :CONCEPTO, '', 12, :IDDOC, :PREFIJO, :NUMERO, 'N');
        NUMITEMS = 0;
        SUMA = 0;
        /* PRIMERO LA BASE */
        if (BASE = 'A') then
            BEGIN
            /* SUME LAS BASES DE LOS ARTICULOS DEL DOCUMENTO */
            FOR SELECT MAX(COAR_CTAINV), SUM(SADE_CANT * SADE_COSTO), SUM(SADE_IVAMONTO + (SADE_CONSUMO*SADE_CANT*SADE_FACTOR))
                FROM ARTICULO A, CONTABIL_ARTICULO C, SALIDAS_DETALLE E
                WHERE E.SALI_ID = :IDDOC AND E.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD
                GROUP BY COAR_CTAINV
                INTO :CTABASE, :MONTO, :IMPTOS
            DO
                BEGIN
                if (IMPINC = 'S') then
                    MONTO = MONTO - IMPTOS;
                VRBASE = MONTO;
                if (MONTO <> 0) then
                    BEGIN
                    /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
                    SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                        WHERE CUEN_COD = :CTABASE INTO :CUENTA, :TIPOCUEN;
                    if (CUENTA IS NULL) then
                        begin
                        EXECUTE PROCEDURE ERROR (12, :IDDOC, :CTABASE, 2);
                        CUENTA = CTABASE;
                        TIPOCUEN = 'N';
                        ERROR = ERROR + 1;
                        end
                    /* DEPENDE DEL TIPO DE CUENTA */
                    if (TIPOCUEN = 'I') then
                        BEGIN
                        /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                        FOR SELECT E.ARTI_COD, (SADE_CANT * SADE_COSTO), (SADE_IVAMONTO + (SADE_CONSUMO*SADE_CANT*SADE_FACTOR))
                            FROM ARTICULO A, CONTABIL_ARTICULO C, SALIDAS_DETALLE E
                            WHERE E.SALI_ID = :IDDOC AND E.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTAINV = :CUENTA
                            INTO :ARTICULO, :MONTO, :IMPTOS
                        DO
                            BEGIN
                            if (IMPINC = 'S') then
                                MONTO = MONTO - IMPTOS;
                            if (MONTO <> 0) then
                                BEGIN
                                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                                NUMITEMS = NUMITEMS + 1;
                                SUMA = SUMA - MONTO;
                                END
                            END
                        END
                    if (TIPOCUEN = 'C') then
                        BEGIN
                        EXECUTE PROCEDURE ERROR (12, :IDDOC, :CUENTA, 4);
                        TIPOCUEN = 'N';
                        ERROR = ERROR + 1;
                        END
                    if (TIPOCUEN = 'N') then
                        BEGIN
                        /* INSERTE EL REGISTRO DE LA BASE */
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NUMITEMS = NUMITEMS + 1;
                        SUMA = SUMA - MONTO;
                        END
                    END
                END /* FOR */
            END /* BASE POR ARTICULO */
        if (BASE = 'I') then
            BEGIN
            /* SUME LAS BASES DE LOS ARTICULOS DEL DOCUMENTO */
            FOR SELECT MAX(TAIV_CTAINV), SUM(SADE_CANT * SADE_COSTO), SUM(SADE_IVAMONTO + (SADE_CONSUMO*SADE_CANT*SADE_FACTOR))
                FROM ARTICULO A, TARIFA_IVA I, SALIDAS_DETALLE E
                WHERE E.SALI_ID = :IDDOC AND E.ARTI_COD = A.ARTI_COD AND A.TAIV_COD = I.TAIV_COD
                GROUP BY TAIV_CTAINV
                INTO :CTABASE, :MONTO, :IMPTOS
            DO
                BEGIN
                if (IMPINC = 'S') then
                    MONTO = MONTO - IMPTOS;
                VRBASE = MONTO;
                if (MONTO <> 0) then
                    BEGIN
                    /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
                    SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                        WHERE CUEN_COD = :CTABASE INTO :CUENTA, :TIPOCUEN;
                    if (CUENTA IS NULL) then
                        begin
                        EXECUTE PROCEDURE ERROR (12, :IDDOC, :CTABASE, 2);
                        CUENTA = CTABASE;
                        TIPOCUEN = 'N';
                        ERROR = ERROR + 1;
                        end
                    /* DEPENDE DEL TIPO DE CUENTA */
                    if (TIPOCUEN = 'I') then
                        BEGIN
                        /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                        FOR SELECT E.ARTI_COD, (SADE_CANT * SADE_COSTO), (SADE_IVAMONTO + (SADE_CONSUMO*SADE_CANT*SADE_FACTOR))
                            FROM ARTICULO A, TARIFA_IVA I, SALIDAS_DETALLE E
                            WHERE E.SALI_ID = :IDDOC AND E.ARTI_COD = A.ARTI_COD AND A.TAIV_COD = I.TAIV_COD AND TAIV_CTAINV = :CUENTA
                            INTO :ARTICULO, :MONTO, :IMPTOS
                        DO
                            BEGIN
                            if (IMPINC = 'S') then
                                MONTO = MONTO - IMPTOS;
                            if (MONTO <> 0) then
                                BEGIN
                                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                                NUMITEMS = NUMITEMS + 1;
                                SUMA = SUMA - MONTO;
                                END
                            END
                        END
                    if (TIPOCUEN = 'C') then
                        BEGIN
                        EXECUTE PROCEDURE ERROR (12, :IDDOC, :CUENTA, 4);
                        TIPOCUEN = 'N';
                        ERROR = ERROR + 1;
                        END
                    if (TIPOCUEN = 'N') then
                        BEGIN
                        /* INSERTE EL REGISTRO DE LA BASE */
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NUMITEMS = NUMITEMS + 1;
                        SUMA = SUMA - MONTO;
                        END
                    END
                END /* FOR */
            END /* BASE POR IVA */
        if ((BASE = 'K') or (BASE = 'T')) then
            BEGIN
            if (BASE = 'T') then
                BEGIN
                SELECT TERC_PROV, TERC_CTAVENTA FROM TERCEROS WHERE TERC_NIT = :NIT INTO :PROV, :CTABASE;
                if (:PROV = 'S') then
                    SELECT PROV_CTACAUSA FROM PROVEEDORES WHERE TERC_NIT = :NIT INTO :CTABASE;
                END
            /* SUME LAS BASES DE LOS ARTICULOS DEL DOCUMENTO */
            FOR SELECT SUM(SADE_CANT * SADE_COSTO), SUM(SADE_IVAMONTO + (SADE_CONSUMO*SADE_CANT*SADE_FACTOR))
                FROM SALIDAS_DETALLE
                WHERE SALI_ID = :IDDOC
                INTO :MONTO, :IMPTOS
            DO
                BEGIN
                if (IMPINC = 'S') then
                    MONTO = MONTO - IMPTOS;
                VRBASE = MONTO;
                if (MONTO <> 0) then
                    BEGIN
                    /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
                    SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                        WHERE CUEN_COD = :CTABASE INTO :CUENTA, :TIPOCUEN;
                    if (CUENTA IS NULL) then
                        begin
                        EXECUTE PROCEDURE ERROR (12, :IDDOC, :CTABASE, 2);
                        CUENTA = CTABASE;
                        TIPOCUEN = 'N';
                        ERROR = ERROR + 1;
                        end
                    /* DEPENDE DEL TIPO DE CUENTA */
                    if (TIPOCUEN = 'I') then
                        BEGIN
                        /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                        FOR SELECT E.ARTI_COD, (SADE_CANT * SADE_COSTO), (SADE_IVAMONTO + (SADE_CONSUMO*SADE_CANT*SADE_FACTOR))
                            FROM ARTICULO A, CONTABIL_ARTICULO C, SALIDAS_DETALLE E
                            WHERE E.SALI_ID = :IDDOC AND E.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTAINV = :CUENTA
                            INTO :ARTICULO, :MONTO, :IMPTOS
                        DO
                            BEGIN
                            if (IMPINC = 'S') then
                                MONTO = MONTO - IMPTOS;
                            if (MONTO <> 0) then
                                BEGIN
                                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                                NUMITEMS = NUMITEMS + 1;
                                SUMA = SUMA - MONTO;
                                END
                            END
                        END
                    if (TIPOCUEN = 'C') then
                        BEGIN
                        EXECUTE PROCEDURE ERROR (12, :IDDOC, :CUENTA, 4);
                        TIPOCUEN = 'N';
                        ERROR = ERROR + 1;
                        END
                    if (TIPOCUEN = 'N') then
                        BEGIN
                        /* INSERTE EL REGISTRO DE LA BASE */
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NUMITEMS = NUMITEMS + 1;
                        SUMA = SUMA - MONTO;
                        END
                    END
                END /* FOR */
            END /* BASE K O POR TERCERO */
        /* EL IVA EN VENTAS */
        if (IVAV = 'A') then
            BEGIN
            /* SUME LAS BASES DE LOS ARTICULOS DEL DOCUMENTO */
            FOR SELECT MAX(COAR_CTAIVAV), SUM(SADE_IVAMONTO), SUM(SADE_CANT * SADE_COSTO)
                FROM ARTICULO A, CONTABIL_ARTICULO C, SALIDAS_DETALLE E
                WHERE E.SALI_ID = :IDDOC AND E.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD
                GROUP BY COAR_CTAIVAV
                INTO :CTAIVA, :IMPTOS, :MONTO
            DO
                BEGIN
                if (IMPTOS <> 0) then
                    BEGIN
                    /* TRAIGA LAS CARCATERISTICAS DE LA CUENTA */
                    SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                        WHERE CUEN_COD = :CTAIVA INTO :CUENTA, :TIPOCUEN;
                    if (CUENTA IS NULL) then
                        begin
                        EXECUTE PROCEDURE ERROR (12, :IDDOC, :CTAIVA, 2);
                        CUENTA = CTAIVA;
                        TIPOCUEN = 'N';
                        ERROR = ERROR + 1;
                        end
                    if (TIPOCUEN = 'I') then
                        BEGIN
                        /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                        FOR SELECT E.ARTI_COD, SADE_IVAMONTO, (SADE_CANT * SADE_COSTO)
                            FROM ARTICULO A, CONTABIL_ARTICULO C, SALIDAS_DETALLE E
                            WHERE E.SALI_ID = :IDDOC AND E.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTAIVAV = :CUENTA
                            INTO :ARTICULO, :IMPTOS, :MONTO
                        DO
                            BEGIN
                            if (IMPINC = 'S') then
                                MONTO = MONTO - IMPTOS;
                            MONTO = MONTO * -1;
                            if (IMPTOS <> 0) then
                                BEGIN
                                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :IMPTOS, :MONTO, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                                NUMITEMS = NUMITEMS + 1;
                                SUMA = SUMA - IMPTOS;
                                END
                            END
                        END
                    if (TIPOCUEN = 'C') then
                        BEGIN
                        EXECUTE PROCEDURE ERROR (12, :IDDOC, :CUENTA, 4);
                        TIPOCUEN = 'N';
                        ERROR = ERROR + 1;
                        END
                    if (TIPOCUEN = 'N') then
                        BEGIN
                        /* INSERTE EL REGISTRO DEL IVA EN VENTAS */
                        if (IMPINC = 'S') then
                            MONTO = MONTO - IMPTOS;
                        MONTO = MONTO * -1;
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :IMPTOS, :MONTO, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NUMITEMS = NUMITEMS + 1;
                        SUMA = SUMA - IMPTOS;
                        END
                    END
                END /* FOR */
            END /* IVA POR ARTICULO */
        if (IVAV = 'I') then
            BEGIN
            /* SUME LAS BASES DE LOS ARTICULOS DEL DOCUMENTO */
            FOR SELECT MAX(TAIV_CTAIVAVNT), SUM(SADE_IVAMONTO), SUM(SADE_CANT * SADE_COSTO)
                FROM ARTICULO A, TARIFA_IVA I, SALIDAS_DETALLE E
                WHERE E.SALI_ID = :IDDOC AND E.ARTI_COD = A.ARTI_COD AND A.TAIV_COD = I.TAIV_COD
                GROUP BY TAIV_CTAIVAVNT
                INTO :CTAIVA, :IMPTOS, :MONTO
            DO
                BEGIN
                if (IMPTOS <> 0) then
                    BEGIN
                    /* TRAIGA LAS CARCATERISTICAS DE LA CUENTA */
                    SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                        WHERE CUEN_COD = :CTAIVA INTO :CUENTA, :TIPOCUEN;
                    if (CUENTA IS NULL) then
                        begin
                        EXECUTE PROCEDURE ERROR (12, :IDDOC, :CTAIVA, 2);
                        CUENTA = CTAIVA;
                        TIPOCUEN = 'N';
                        ERROR = ERROR + 1;
                        end
                    if (TIPOCUEN = 'I') then
                        BEGIN
                        /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                        FOR SELECT E.ARTI_COD, SADE_IVAMONTO, (SADE_CANT * SADE_COSTO)
                            FROM ARTICULO A, TARIFA_IVA I, SALIDAS_DETALLE E
                            WHERE E.SALI_ID = :IDDOC AND E.ARTI_COD = A.ARTI_COD AND A.TAIV_COD = I.TAIV_COD AND TAIV_CTAIVAVNT = :CUENTA
                            INTO :ARTICULO, :IMPTOS, :MONTO
                        DO
                            BEGIN
                            if (IMPINC = 'S') then
                                MONTO = MONTO - IMPTOS;
                            MONTO = MONTO * -1;
                            if (IMPTOS <> 0) then
                                BEGIN
                                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :IMPTOS, :MONTO, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                                NUMITEMS = NUMITEMS + 1;
                                SUMA = SUMA - IMPTOS;
                                END
                            END
                        END
                    if (TIPOCUEN = 'C') then
                        BEGIN
                        EXECUTE PROCEDURE ERROR (12, :IDDOC, :CUENTA, 4);
                        TIPOCUEN = 'N';
                        ERROR = ERROR + 1;
                        END
                    if (TIPOCUEN = 'N') then
                        BEGIN
                        /* INSERTE EL REGISTRO DEL IVA EN VENTAS */
                        if (IMPINC = 'S') then
                            MONTO = MONTO - IMPTOS;
                        MONTO = MONTO * -1;
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :IMPTOS, :MONTO, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NUMITEMS = NUMITEMS + 1;
                        SUMA = SUMA - IMPTOS;
                        END
                    END
                END /* FOR */
            END /* IVA POR TARIFA */
        if (IVAV = 'K') then
            BEGIN
            /* SUME LAS BASES DE LOS ARTICULOS DEL DOCUMENTO */
            SELECT SUM(SADE_IVAMONTO), SUM(SADE_CANT * SADE_COSTO)
                FROM SALIDAS_DETALLE
                WHERE SALI_ID = :IDDOC
                INTO :IMPTOS, :MONTO;
            if (IMPTOS <> 0) then
                BEGIN
                /* TRAIGA LAS CARCATERISTICAS DE LA CUENTA */
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :CTAIVA INTO :CUENTA, :TIPOCUEN;
                if (CUENTA IS NULL) then
                    begin
                    EXECUTE PROCEDURE ERROR (12, :IDDOC, :CTAIVA, 2);
                    CUENTA = CTAIVA;
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT E.ARTI_COD, SADE_IVAMONTO, (SADE_CANT * SADE_COSTO)
                        FROM ARTICULO A, CONTABIL_ARTICULO C, SALIDAS_DETALLE E
                        WHERE E.SALI_ID = :IDDOC AND E.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTAIVAV = :CUENTA
                        INTO :ARTICULO, :IMPTOS, :MONTO
                        DO
                        BEGIN
                        if (IMPTOS <> 0) then
                            BEGIN
                            if (IMPINC = 'S') then
                                MONTO = MONTO - IMPTOS;
                            MONTO = MONTO * -1;
                            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :IMPTOS, :MONTO, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                            NUMITEMS = NUMITEMS + 1;
                            SUMA = SUMA - IMPTOS;
                            END
                        END
                    END
                if (TIPOCUEN = 'C') then
                        BEGIN
                        EXECUTE PROCEDURE ERROR (12, :IDDOC, :CUENTA, 4);
                        TIPOCUEN = 'N';
                        ERROR = ERROR + 1;
                        END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    /* INSERTE EL REGISTRO DEL IVA EN VENTAS */
                    if (IMPINC = 'S') then
                        MONTO = MONTO - IMPTOS;
                    MONTO = MONTO * -1;
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :IMPTOS, :MONTO, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NUMITEMS = NUMITEMS + 1;
                    SUMA = SUMA - IMPTOS;
                    END
                END
            END /* IVA CONSTANTE */
        /* EL IMPOCONSUMO */
        if (CONSUMO = 'A') then
            BEGIN
            /* SUME LAS BASES DE LOS ARTICULOS DEL DOCUMENTO */
            FOR SELECT MAX(COAR_CTACONS), SUM(SADE_CONSUMO*SADE_CANT*SADE_FACTOR)
                FROM ARTICULO A, CONTABIL_ARTICULO C, SALIDAS_DETALLE E
                WHERE E.SALI_ID = :IDDOC AND E.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD
                GROUP BY COAR_CTACONS
                INTO :CTACONSUMO, :IMPTOS
            DO
                BEGIN
                if (IMPTOS <> 0) then
                    BEGIN
                    /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
                    SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                        WHERE CUEN_COD = :CTACONSUMO INTO :CUENTA, :TIPOCUEN;
                    if (CUENTA IS NULL) then
                        begin
                        EXECUTE PROCEDURE ERROR (12, :IDDOC, :CTACONSUMO, 2);
                        CUENTA = CTACONSUMO;
                        TIPOCUEN = 'N';
                        ERROR = ERROR + 1;
                        end
                    if (TIPOCUEN = 'I') then
                        BEGIN
                        /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                        FOR SELECT E.ARTI_COD, SADE_CONSUMO*SADE_CANT*SADE_FACTOR
                            FROM ARTICULO A, CONTABIL_ARTICULO C, SALIDAS_DETALLE E
                            WHERE E.SALI_ID = :IDDOC AND E.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTACONS = :CUENTA
                            INTO :ARTICULO, :IMPTOS
                            DO
                            if (IMPTOS <> 0) then
                                BEGIN
                                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                                NUMITEMS = NUMITEMS + 1;
                                SUMA = SUMA - IMPTOS;
                                END
                        END
                    if (TIPOCUEN = 'C') then
                        BEGIN
                        EXECUTE PROCEDURE ERROR (12, :IDDOC, :CUENTA, 4);
                        TIPOCUEN = 'N';
                        ERROR = ERROR + 1;
                        END
                    if (TIPOCUEN = 'N') then
                        BEGIN
                        /* INSERTE EL REGISTRO DE LA BASE */
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NUMITEMS = NUMITEMS + 1;
                        SUMA = SUMA - IMPTOS;
                        END
                    END
                END /* FOR */
            END /* CONSUMO POR ARTICULO */
        if (CONSUMO = 'K') then
            BEGIN
            /* SUME LAS BASES DE LOS ARTICULOS DEL DOCUMENTO */
            SELECT SUM(SADE_CONSUMO*SADE_CANT*SADE_FACTOR)
                FROM SALIDAS_DETALLE
                WHERE SALI_ID = :IDDOC
                INTO :IMPTOS;
            if (IMPTOS <> 0) then
                BEGIN
                /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :ctaconsumo INTO :CUENTA, :TIPOCUEN;
                if (CUENTA IS NULL) then
                    begin
                    EXECUTE PROCEDURE ERROR (12, :IDDOC, :CTACONSUMO, 2);
                    CUENTA = CTACONSUMO;
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT E.ARTI_COD, SADE_CONSUMO*SADE_CANT*SADE_FACTOR
                    FROM ARTICULO A, CONTABIL_ARTICULO C, SALIDAS_DETALLE E
                        WHERE E.SALI_ID = :IDDOC AND E.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTACONS = :CUENTA
                        INTO :ARTICULO, :IMPTOS
                        DO
                        if (IMPTOS <> 0) then
                            BEGIN
                            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                            NUMITEMS = NUMITEMS + 1;
                            SUMA = SUMA - IMPTOS;
                            END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (12, :IDDOC, :CUENTA, 4);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    /* INSERTE EL REGISTRO DE LA BASE */
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NUMITEMS = NUMITEMS + 1;
                    SUMA = SUMA - IMPTOS;
                    END
                END
            END /* CONSUMO CONSTANTE */
        /* recorra las cuentas adicionales */
        FOR SELECT INIC_CUENTA, INIC_BASE, INIC_PORC, INIC_VALOR, INIC_DB
            FROM INTERFAZ_INVENTARIO_CTAS
            WHERE ININ_ID = :IDINTER
            INTO :CUENTAADIC, :BASEADIC, :PORCADIC, :VALORADIC, :DBADIC
            DO
            BEGIN
            if (VALORADIC <> 0) then
                MONTO = VALORADIC;
            ELSE
                BEGIN
                if (:BASEADIC = 'SUBTOTAL') then
                    SELECT SUM(SADE_CANT * SADE_COSTO)
                    FROM SALIDAS_DETALLE E
                    WHERE E.SALI_ID = :IDDOC 
                    INTO :VALORADIC;
                if (:BASEADIC = 'IVA') then
                    SELECT SUM(SADE_IVAMONTO)
                    FROM SALIDAS_DETALLE E
                    WHERE E.SALI_ID = :IDDOC 
                    INTO :VALORADIC;
                if (:BASEADIC = 'CONSUMO') then
                    SELECT SUM(SADE_CONSUMO*SADE_CANT*SADE_FACTOR)
                    FROM SALIDAS_DETALLE E
                    WHERE E.SALI_ID = :IDDOC 
                    INTO :VALORADIC;
                MONTO = VALORADIC * PORCADIC / 100;
                END
            if (MONTO <> 0) then
                BEGIN
                /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
                CUENTA = NULL;
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :CUENTAADIC INTO :CUENTA, :TIPOCUEN;
                if (CUENTA IS NULL) then
                    begin
                    EXECUTE PROCEDURE ERROR (12, :IDDOC, :CUENTAADIC, 2);
                    CUENTA = CUENTAADIC;
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (12, :IDDOC, :CUENTA, 3);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (12, :IDDOC, :CUENTA, 4);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    if (DBADIC = 'S') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTAADIC, :CONCEPTO, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        SUMA = SUMA + MONTO;
                        END
                    ELSE
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTAADIC, :CONCEPTO, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        SUMA = SUMA - MONTO;
                        END
                    NUMITEMS = NUMITEMS + 1;
                    END
                END
            END
        /* CIERRE EL COMPROBANTE  */
        if (SUMA <> 0) then
            BEGIN
            if (SUMA > 0) then
                BEGIN
                DEBITO = 0;
                CREDITO = SUMA;
                END
            ELSE    
                BEGIN
                DEBITO = SUMA * -1;
                CREDITO = 0;
                END
            if ((TOTAL = 'K') or (TOTAL = 'T')) then
                BEGIN
                if (TOTAL = 'T') then
                    BEGIN
                    SELECT TERC_CTAPROV, TERC_PROV
                        FROM TERCEROS WHERE TERC_NIT = :NIT
                        INTO :CTACIERRE, :PROV;
                    if (PROV = 'S') then
                        SELECT PROV_CTAPAGAR FROM PROVEEDORES WHERE TERC_NIT = :nit
                        INTO :CTACIERRE;
                    END
                /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :CTACIERRE INTO :CUENTA, :TIPOCUEN;
                if (CUENTA IS NULL) then
                    begin
                    EXECUTE PROCEDURE ERROR (12, :IDDOC, :CTACIERRE, 2);
                    CUENTA = CTACIERRE;
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (12, :IDDOC, :CUENTA, 3);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (12, :IDDOC, :CUENTA, 4);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'N') then
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :DEBITO, :CREDITO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                END
            END /* SUMA */
        if (ERROR > 0) then
            VER = 'S';
        SUSPEND;
        END /* NO ANULADO */
    END /* EXISTE LA INTERFAZ */
ELSE
    BEGIN
    EXECUTE PROCEDURE ERROR (12, :IDDOC, :PREFIJO, 1);
    ERROR = ERROR + 1;
    VER = 'S';
    SUSPEND;
    END
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE SALIDAS_SIN_CONTABILIDAD(
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    ID INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    ESTADO VARCHAR(20),
    IDI INTEGER,
    IDC INTEGER)
AS
DECLARE VARIABLE VER CHAR(2);
declare variable FECICNT VARCHAR(10);
declare variable FECFCNT VARCHAR(10);
declare variable ERROR INTEGER;
declare variable idref INTEGER;
BEGIN
EXECUTE PROCEDURE fecha_a_conta(FECINI) returning_values (FECICNT);
EXECUTE PROCEDURE fecha_a_conta(FECFIN) returning_values (FECFCNT);
FOR SELECT SALI_ID, PREF_PRE, SALI_NUMERO FROM SALIDAS WHERE SALI_ANULADO = 'N' AND
    SALI_FECHA >= :FECINI AND SALI_FECHA <= :FECFIN
    INTO :ID, :PREF, :NUMERO
DO
  BEGIN
  idref = null;
  SELECT ENCO_IDREF FROM COMPROBANTE_ENCABEZADO WHERE ENCO_TIPOREF = 12 AND ENCO_FECHA >= :FECICNT AND ENCO_FECHA <= :FECFCNT and ENCO_IDREF = :id into :idref;
  if (idref IS NULL) then
  begin
  ESTADO = 'PROCESANDO';
  SUSPEND;
  SELECT MAX(ININ_ID) FROM INTERFAZ_INVENTARIO WHERE PREF_PRE = :PREF AND TIDO_COD = 12 INTO :IDI;
  EXECUTE PROCEDURE CONTABIL_SALIDA (:ID, :IDI) RETURNING_VALUES (:ERROR, :VER, :IDC);
  if (ERROR = 0) then
    BEGIN
      EXECUTE PROCEDURE CONTABILIZA_PENDIENTE (:IDC);
      ESTADO = 'OK';
      END
  ELSE
    ESTADO = 'ERROR';
  suspend;
  end
  END
END

^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure CONTABIL_TRASLAMERCANCIA (
    IDDOC integer,
    IDINTER integer)
returns (
    ERROR integer,
    VER char(1),
    IDC integer)
AS
declare variable PREFIJO VARCHAR(4);
declare variable NUMERO VARCHAR(6);
declare variable FECAUX DATE;
declare variable FECHA CHAR(8);
declare variable CONCEPTO CHAR(60);
declare variable TIPOCOMP VARCHAR(3);
declare variable PREFCONT VARCHAR(4);
declare variable CTACIERRE VARCHAR(20);
declare variable BASE CHAR(1);
declare variable IVAV CHAR(1);
declare variable CONSUMO CHAR(1);
declare variable TOTAL CHAR(1);
declare variable EXISTE CHAR(1);
declare variable CUENTA VARCHAR(20);
declare variable MONTO NUMERIC(18,2);
declare variable TIPOCUEN CHAR(1);
declare variable NIT VARCHAR(20);
declare variable PROY VARCHAR(4);
declare variable CENTRO VARCHAR(4);
declare variable PROYDES VARCHAR(4);
declare variable CENTRODES VARCHAR(4);
declare variable DEBITO NUMERIC(18,2);
declare variable CREDITO NUMERIC(18,2);
declare variable DEBITODES NUMERIC(18,2);
declare variable CREDITODES NUMERIC(18,2);
declare variable NUMITEMS INTEGER;
declare variable ARTICULO VARCHAR(15);
declare variable IMPINC CHAR(1);
declare variable IMPTOS NUMERIC(18, 2);
declare variable SUMA NUMERIC(18,2);
declare variable SUMADES NUMERIC(18,2);
declare variable CTABASE VARCHAR(20);
declare variable CTAIVA VARCHAR(20);
declare variable CTACONSUMO VARCHAR(20);
declare variable VRBASE NUMERIC(18,2);
declare variable CUENTAADIC VARCHAR(20);
declare variable BASEADIC VARCHAR(20);
declare variable PORCADIC NUMERIC(5,2);
declare variable VALORADIC NUMERIC(18,2);
declare variable DBADIC CHAR(1);
declare variable PROV CHAR(1);
declare variable ANULADO CHAR(1);
declare variable CENT CHAR(1);
BEGIN
ERROR = 0;
/* BUSQUE LA INTERFACE */
EXISTE = 'N';
SELECT 'S', PREF_PRE, TICO_COD, PRCO_PREF, ININ_BASE, ININ_IVAV, ININ_CONSUMO, ININ_TOTAL, ININ_CTABASE, ININ_CTAIVA, ININ_CTACONSUMO, ININ_CTACIERRE, ININ_CONFIRMAR, ININ_CENTRO, ININ_CODPROY, ININ_CODCENT
    FROM INTERFAZ_INVENTARIO
    WHERE ININ_ID = :IDINTER
    INTO :EXISTE, :PREFIJO, :TIPOCOMP, :PREFCONT, :BASE, :IVAV, :CONSUMO, :TOTAL, :CTABASE, :CTAIVA, :CTACONSUMO, :CTACIERRE, :VER, :CENT, :PROYDES, :CENTRODES;
if (EXISTE = 'S') then
    BEGIN
    /* TRAIGA EL ENCABEZADO DE LA SALIDA */
    SELECT PREF_PRE, TRAN_NUMERO, TRAN_FECHA, TRAN_CONC, TERC_NIT, TRAN_IMPTOS, TRAN_ANULADO
        FROM TRASFERENCIAS
        WHERE TRAN_ID = :IDDOC
        INTO :PREFIJO, :NUMERO, :FECAUX, :CONCEPTO, :NIT, :IMPINC, :ANULADO;
    /* BORRE CUALQUEIR CONTABILIZACION PREVIA */
    DELETE FROM CONTABILIZACION WHERE CNTB_TIPOREF = 13 AND CNTB_IDREF = :IDDOC;

    if (ANULADO = 'N') then
        BEGIN
        if (CENT = 'B') then
          BEGIN
            SELECT BODE_CENTRO, BODE_PROY FROM BODEGA B, TRASFERENCIAS E
                WHERE B.BODE_COD = E.BODE_COD AND E.tran_id = :IDDOC INTO :CENTRO, :PROY;
            SELECT BODE_CENTRO, BODE_PROY FROM BODEGA B, TRASFERENCIAS E
                WHERE B.BODE_COD = E.TRAN_BODDES AND E.tran_id = :IDDOC INTO :CENTRODES, :PROYDES;
          END
        ELSE
          if (CENT = 'P') then
            BEGIN
            SELECT PREF_CENTRO, PREF_PROY FROM PREFIJOS P, TRASFERENCIAS E
                WHERE P.PREF_PRE = E.PREF_PRE AND E.TRAN_ID = :IDDOC AND P.TIDO_COD = 13 INTO :CENTRO, :PROY;
            SELECT PREF_CENTRO, PREF_PROY FROM PREFIJOS P, TRASFERENCIAS E
                WHERE P.PREF_PRE = E.PREF_PRE AND E.TRAN_ID = :IDDOC AND P.TIDO_COD = 13 INTO :CENTRODES, :PROYDES;
            END
          ELSE
            BEGIN
            SELECT BODE_CENTRO, BODE_PROY FROM BODEGA B, TRASFERENCIAS E
                WHERE B.BODE_COD = E.BODE_COD AND E.tran_id = :IDDOC INTO :CENTRO, :PROY;
            END
        /* CONVIERTA LA FECHA A CADENA */
        EXECUTE PROCEDURE FECHA_A_CONTA(:FECAUX) returning_values (:FECHA);
        IDC = GEN_ID(ID_CONTABILIZA, 1);
        /* REGISTRE EL ENCABEZADO CONTABLE */
        INSERT INTO CONTABILIZACION (CNTB_ID, CNTB_TIPOCOMP, CNTB_PREFCNT, CNTB_NUMERO, CNTB_FECHA, CNTB_CONCEPTO, CNTB_REF, CNTB_TIPOREF, CNTB_IDREF, CNTB_PREFREF, CNTB_NUMREF, CNTB_PROCESADO)
            VALUES (:IDC, :TIPOCOMP, :PREFCONT, :NUMERO, :FECHA, :CONCEPTO, '', 13, :IDDOC, :PREFIJO, :NUMERO, 'N');
        NUMITEMS = 0;
        SUMA = 0;
        SUMADES = 0;
        ERROR = 0;
        /* PRIMERO LA BASE */
        if (BASE = 'A') then
            BEGIN
            /* SUME LAS BASES DE LOS ARTICULOS DEL DOCUMENTO */
            FOR SELECT MAX(COAR_CTAINV), SUM(TRAS_CANT * TRAS_COSTO), SUM(TRAS_IVAMONTO + (TRAS_CONSUMO*TRAS_CANT*TRAS_FACTOR))
                FROM ARTICULO A, CONTABIL_ARTICULO C, TRASFERENCIAS_DETALLE E
                WHERE E.TRAN_ID = :IDDOC AND E.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD
                GROUP BY COAR_CTAINV
                INTO :CTABASE, :MONTO, :IMPTOS
            DO
                BEGIN
                if (IMPINC = 'S') then
                    MONTO = MONTO - IMPTOS;
                VRBASE = MONTO;
                if (MONTO <> 0) then
                    BEGIN
                    /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
                    SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                        WHERE CUEN_COD = :CTABASE INTO :CUENTA, :TIPOCUEN;
                    if (CUENTA IS NULL) then
                        begin
                        EXECUTE PROCEDURE ERROR (13, :IDDOC, :CTABASE, 2);
                        CUENTA = CTABASE;
                        TIPOCUEN = 'N';
                        ERROR = ERROR + 1;
                        end
                    /* DEPENDE DEL TIPO DE CUENTA */
                    if (TIPOCUEN = 'I') then
                        BEGIN
                        /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                        FOR SELECT E.ARTI_COD, (TRAS_CANT * TRAS_COSTO), (TRAS_IVAMONTO + (TRAS_CONSUMO*TRAS_CANT*TRAS_FACTOR))
                            FROM ARTICULO A, CONTABIL_ARTICULO C, TRASFERENCIAS_DETALLE E
                            WHERE E.TRAN_ID = :IDDOC AND E.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTAINV = :CUENTA
                            INTO :ARTICULO, :MONTO, :IMPTOS
                        DO
                            BEGIN
                            if (IMPINC = 'S') then
                                MONTO = MONTO - IMPTOS;
                            if (MONTO <> 0) then
                                BEGIN
                                /*PRIMERO LA SALIDA*/
                                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                                NUMITEMS = NUMITEMS + 1;
                                SUMA = SUMA - MONTO;
                                /*AHORA LA ENTRADA*/
                                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROYDES, :CENTRODES, NULL, NULL, NULL, :ARTICULO, 0, 0);
                                SUMADES = SUMADES + MONTO;
                                NUMITEMS = NUMITEMS + 1;
                                END
                            END
                        END
                    if (TIPOCUEN = 'C') then
                        BEGIN
                        EXECUTE PROCEDURE ERROR (13, :IDDOC, :CUENTA, 4);
                        TIPOCUEN = 'N';
                        ERROR = ERROR + 1;
                        END
                    if (TIPOCUEN = 'N') then
                        BEGIN
                        /* INSERTE EL REGISTRO DE LA BASE */
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NUMITEMS = NUMITEMS + 1;
                        SUMA = SUMA - MONTO;
                                /*AHORA LA ENTRADA*/
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                          VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROYDES, :CENTRODES, NULL, NULL, NULL, :ARTICULO, 0, 0);
                        SUMADES = SUMADES + MONTO;
                        NUMITEMS = NUMITEMS + 1;
                        END
                    END
                END /* FOR */
            END /* BASE POR ARTICULO */
        if (BASE = 'I') then
            BEGIN
            /* SUME LAS BASES DE LOS ARTICULOS DEL DOCUMENTO */
            FOR SELECT MAX(TAIV_CTAINV), SUM(TRAS_CANT * TRAS_COSTO), SUM(TRAS_IVAMONTO + (TRAS_CONSUMO*TRAS_CANT*TRAS_FACTOR))
                FROM ARTICULO A, TARIFA_IVA I, TRASFERENCIAS_DETALLE E
                WHERE E.TRAN_ID = :IDDOC AND E.ARTI_COD = A.ARTI_COD AND A.TAIV_COD = I.TAIV_COD
                GROUP BY TAIV_CTAINV
                INTO :CTABASE, :MONTO, :IMPTOS
            DO
                BEGIN
                if (IMPINC = 'S') then
                    MONTO = MONTO - IMPTOS;
                VRBASE = MONTO;
                if (MONTO <> 0) then
                    BEGIN
                    /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
                    SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                        WHERE CUEN_COD = :CTABASE INTO :CUENTA, :TIPOCUEN;
                    if (CUENTA IS NULL) then
                        begin
                        EXECUTE PROCEDURE ERROR (13, :IDDOC, :CTABASE, 2);
                        CUENTA = CTABASE;
                        TIPOCUEN = 'N';
                        ERROR = ERROR + 1;
                        end
                    /* DEPENDE DEL TIPO DE CUENTA */
                    if (TIPOCUEN = 'I') then
                        BEGIN
                        /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                        FOR SELECT E.ARTI_COD, (TRAS_CANT * TRAS_COSTO), (TRAS_IVAMONTO + (TRAS_CONSUMO*TRAS_CANT*TRAS_FACTOR))
                            FROM ARTICULO A, TARIFA_IVA I, TRASFERENCIAS_DETALLE E
                            WHERE E.TRAN_ID = :IDDOC AND E.ARTI_COD = A.ARTI_COD AND A.TAIV_COD = I.TAIV_COD AND TAIV_CTAINV = :CUENTA
                            INTO :ARTICULO, :MONTO, :IMPTOS
                        DO
                            BEGIN
                            if (IMPINC = 'S') then
                                MONTO = MONTO - IMPTOS;
                            if (MONTO <> 0) then
                                BEGIN
                                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                                NUMITEMS = NUMITEMS + 1;
                                SUMA = SUMA - MONTO;
                                /*AHORA LA ENTRADA*/
                                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                  VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROYDES, :CENTRODES, NULL, NULL, NULL, :ARTICULO, 0, 0);
                                SUMADES = SUMADES + MONTO;
                                NUMITEMS = NUMITEMS + 1;
                                END
                            END
                        END
                    if (TIPOCUEN = 'C') then
                        BEGIN
                        EXECUTE PROCEDURE ERROR (13, :IDDOC, :CUENTA, 4);
                        TIPOCUEN = 'N';
                        ERROR = ERROR + 1;
                        END
                    if (TIPOCUEN = 'N') then
                        BEGIN
                        /* INSERTE EL REGISTRO DE LA BASE */
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NUMITEMS = NUMITEMS + 1;
                        SUMA = SUMA - MONTO;
                        /*AHORA LA ENTRADA*/
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROYDES, :CENTRODES, NULL, NULL, NULL, :ARTICULO, 0, 0);
                        SUMADES = SUMADES + MONTO;
                        NUMITEMS = NUMITEMS + 1;
                        END
                    END
                END /* FOR */
            END /* BASE POR IVA */
        if ((BASE = 'K') or (BASE = 'T')) then
            BEGIN
            if (BASE = 'T') then
                BEGIN
                SELECT TERC_PROV, TERC_CTAVENTA FROM TERCEROS WHERE TERC_NIT = :NIT INTO :PROV, :CTABASE;
                if (:PROV = 'S') then
                    SELECT PROV_CTACAUSA FROM PROVEEDORES WHERE TERC_NIT = :NIT INTO :CTABASE;
                END
            /* SUME LAS BASES DE LOS ARTICULOS DEL DOCUMENTO */
            FOR SELECT SUM(TRAS_CANT * TRAS_COSTO), SUM(TRAS_IVAMONTO + (TRAS_CONSUMO*TRAS_CANT*TRAS_FACTOR))
                FROM TRASFERENCIAS_DETALLE
                WHERE TRAN_ID = :IDDOC
                INTO :MONTO, :IMPTOS
            DO
                BEGIN
                if (IMPINC = 'S') then
                    MONTO = MONTO - IMPTOS;
                VRBASE = MONTO;
                if (MONTO <> 0) then
                    BEGIN
                    /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
                    SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                        WHERE CUEN_COD = :CTABASE INTO :CUENTA, :TIPOCUEN;
                    if (CUENTA IS NULL) then
                        begin
                        EXECUTE PROCEDURE ERROR (13, :IDDOC, :CTABASE, 2);
                        CUENTA = CTABASE;
                        TIPOCUEN = 'N';
                        ERROR = ERROR + 1;
                        end
                    /* DEPENDE DEL TIPO DE CUENTA */
                    if (TIPOCUEN = 'I') then
                        BEGIN
                        /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                        FOR SELECT E.ARTI_COD, (TRAS_CANT * TRAS_COSTO), (TRAS_IVAMONTO + (TRAS_CONSUMO*TRAS_CANT*TRAS_FACTOR))
                            FROM ARTICULO A, CONTABIL_ARTICULO C, TRASFERENCIAS_DETALLE E
                            WHERE E.TRAN_ID = :IDDOC AND E.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTAINV = :CUENTA
                            INTO :ARTICULO, :MONTO, :IMPTOS
                        DO
                            BEGIN
                            if (IMPINC = 'S') then
                                MONTO = MONTO - IMPTOS;
                            if (MONTO <> 0) then
                                BEGIN
                                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                                NUMITEMS = NUMITEMS + 1;
                                SUMA = SUMA - MONTO;
                                /*AHORA LA ENTRADA*/
                                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                  VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROYDES, :CENTRODES, NULL, NULL, NULL, :ARTICULO, 0, 0);
                                SUMADES = SUMADES + MONTO;
                                NUMITEMS = NUMITEMS + 1;
                                END
                            END
                        END
                    if (TIPOCUEN = 'C') then
                        BEGIN
                        EXECUTE PROCEDURE ERROR (13, :IDDOC, :CUENTA, 4);
                        TIPOCUEN = 'N';
                        ERROR = ERROR + 1;
                        END
                    if (TIPOCUEN = 'N') then
                        BEGIN
                        /* INSERTE EL REGISTRO DE LA BASE */
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NUMITEMS = NUMITEMS + 1;
                        SUMA = SUMA - MONTO;
                        /*AHORA LA ENTRADA*/
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROYDES, :CENTRODES, NULL, NULL, NULL, :ARTICULO, 0, 0);
                        SUMADES = SUMADES + MONTO;
                        NUMITEMS = NUMITEMS + 1;
                        END
                    END
                END /* FOR */
            END /* BASE K O POR TERCERO */
        /* EL IVA EN VENTAS */
        if (IVAV = 'A') then
            BEGIN
            /* SUME LAS BASES DE LOS ARTICULOS DEL DOCUMENTO */
            FOR SELECT MAX(COAR_CTAIVAV), SUM(TRAS_IVAMONTO), SUM(TRAS_CANT * TRAS_COSTO)
                FROM ARTICULO A, CONTABIL_ARTICULO C, TRASFERENCIAS_DETALLE E
                WHERE E.TRAN_ID = :IDDOC AND E.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD
                GROUP BY COAR_CTAIVAV
                INTO :CTAIVA, :IMPTOS, :MONTO
            DO
                BEGIN
                if (IMPTOS <> 0) then
                    BEGIN
                    /* TRAIGA LAS CARCATERISTICAS DE LA CUENTA */
                    SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                        WHERE CUEN_COD = :CTAIVA INTO :CUENTA, :TIPOCUEN;
                    if (CUENTA IS NULL) then
                        begin
                        EXECUTE PROCEDURE ERROR (13, :IDDOC, :CTAIVA, 2);
                        CUENTA = CTAIVA;
                        TIPOCUEN = 'N';
                        ERROR = ERROR + 1;
                        end
                    if (TIPOCUEN = 'I') then
                        BEGIN
                        /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                        FOR SELECT E.ARTI_COD, TRAS_IVAMONTO, (TRAS_CANT * TRAS_COSTO)
                            FROM ARTICULO A, CONTABIL_ARTICULO C, TRASFERENCIAS_DETALLE E
                            WHERE E.TRAN_ID = :IDDOC AND E.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTAIVAV = :CUENTA
                            INTO :ARTICULO, :IMPTOS, :MONTO
                        DO
                            BEGIN
                            if (IMPINC = 'S') then
                                MONTO = MONTO - IMPTOS;
                            /*MONTO = MONTO * -1; */
                            if (IMPTOS <> 0) then
                                BEGIN
                                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :IMPTOS, (:MONTO * -1), 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                                NUMITEMS = NUMITEMS + 1;
                                SUMA = SUMA - IMPTOS;
                                /*AHORA LA ENTRADA*/
                                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                  VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :IMPTOS, 0,:MONTO, 0, :NIT, :PROYDES, :CENTRODES, NULL, NULL, NULL, :ARTICULO, 0, 0);
                                SUMADES = SUMADES + MONTO;
                                NUMITEMS = NUMITEMS + 1;
                                END
                            END
                        END
                    if (TIPOCUEN = 'C') then
                        BEGIN
                        EXECUTE PROCEDURE ERROR (13, :IDDOC, :CUENTA, 4);
                        TIPOCUEN = 'N';
                        ERROR = ERROR + 1;
                        END
                    if (TIPOCUEN = 'N') then
                        BEGIN
                        /* INSERTE EL REGISTRO DEL IVA EN VENTAS */
                        if (IMPINC = 'S') then
                            MONTO = MONTO - IMPTOS;
                        /*MONTO = MONTO * -1;*/
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :IMPTOS, (:MONTO *-1), 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NUMITEMS = NUMITEMS + 1;
                        SUMA = SUMA - IMPTOS;
                        /*AHORA LA ENTRADA*/
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :IMPTOS, 0,:MONTO, 0, :NIT, :PROYDES, :CENTRODES, NULL, NULL, NULL, :ARTICULO, 0, 0);
                        SUMADES = SUMADES + MONTO;
                        NUMITEMS = NUMITEMS + 1;
                        END
                    END
                END /* FOR */
            END /* IVA POR ARTICULO */
        if (IVAV = 'I') then
            BEGIN
            /* SUME LAS BASES DE LOS ARTICULOS DEL DOCUMENTO */
            FOR SELECT MAX(TAIV_CTAIVAVNT), SUM(TRAS_IVAMONTO), SUM(TRAS_CANT * TRAS_COSTO)
                FROM ARTICULO A, TARIFA_IVA I, TRASFERENCIAS_DETALLE E
                WHERE E.TRAN_ID = :IDDOC AND E.ARTI_COD = A.ARTI_COD AND A.TAIV_COD = I.TAIV_COD
                GROUP BY TAIV_CTAIVAVNT
                INTO :CTAIVA, :IMPTOS, :MONTO
            DO
                BEGIN
                if (IMPTOS <> 0) then
                    BEGIN
                    /* TRAIGA LAS CARCATERISTICAS DE LA CUENTA */
                    SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                        WHERE CUEN_COD = :CTAIVA INTO :CUENTA, :TIPOCUEN;
                    if (CUENTA IS NULL) then
                        begin
                        EXECUTE PROCEDURE ERROR (13, :IDDOC, :CTAIVA, 2);
                        CUENTA = CTAIVA;
                        TIPOCUEN = 'N';
                        ERROR = ERROR + 1;
                        end
                    if (TIPOCUEN = 'I') then
                        BEGIN
                        /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                        FOR SELECT E.ARTI_COD, TRAS_IVAMONTO, (TRAS_CANT * TRAS_COSTO)
                            FROM ARTICULO A, TARIFA_IVA I, TRASFERENCIAS_DETALLE E
                            WHERE E.TRAN_ID = :IDDOC AND E.ARTI_COD = A.ARTI_COD AND A.TAIV_COD = I.TAIV_COD AND TAIV_CTAIVAVNT = :CUENTA
                            INTO :ARTICULO, :IMPTOS, :MONTO
                        DO
                            BEGIN
                            if (IMPINC = 'S') then
                                MONTO = MONTO - IMPTOS;
                            /*MONTO = MONTO * -1; */
                            if (IMPTOS <> 0) then
                                BEGIN
                                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :IMPTOS, (:MONTO * -1), 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                                NUMITEMS = NUMITEMS + 1;
                                SUMA = SUMA - IMPTOS;
                                /*AHORA LA ENTRADA*/
                                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                  VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :IMPTOS, 0,:MONTO, 0, :NIT, :PROYDES, :CENTRODES, NULL, NULL, NULL, :ARTICULO, 0, 0);
                                SUMADES = SUMADES + MONTO;
                                NUMITEMS = NUMITEMS + 1;
                                END
                            END
                        END
                    if (TIPOCUEN = 'C') then
                        BEGIN
                        EXECUTE PROCEDURE ERROR (13, :IDDOC, :CUENTA, 4);
                        TIPOCUEN = 'N';
                        ERROR = ERROR + 1;
                        END
                    if (TIPOCUEN = 'N') then
                        BEGIN
                        /* INSERTE EL REGISTRO DEL IVA EN VENTAS */
                        if (IMPINC = 'S') then
                            MONTO = MONTO - IMPTOS;
                        /*MONTO = MONTO * -1;*/
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :IMPTOS, (:MONTO * -1), 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NUMITEMS = NUMITEMS + 1;
                        SUMA = SUMA - IMPTOS;
                        /*AHORA LA ENTRADA*/
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :IMPTOS, 0,:MONTO, 0, :NIT, :PROYDES, :CENTRODES, NULL, NULL, NULL, :ARTICULO, 0, 0);
                        SUMADES = SUMADES + MONTO;
                        NUMITEMS = NUMITEMS + 1;
                        END
                    END
                END /* FOR */
            END /* IVA POR TARIFA */
        if (IVAV = 'K') then
            BEGIN
            /* SUME LAS BASES DE LOS ARTICULOS DEL DOCUMENTO */
            SELECT SUM(TRAS_IVAMONTO), SUM(TRAS_CANT * TRAS_COSTO)
                FROM TRASFERENCIAS_DETALLE
                WHERE TRAN_ID = :IDDOC
                INTO :IMPTOS, :MONTO;
            if (IMPTOS <> 0) then
                BEGIN
                /* TRAIGA LAS CARCATERISTICAS DE LA CUENTA */
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :CTAIVA INTO :CUENTA, :TIPOCUEN;
                if (CUENTA IS NULL) then
                    begin
                    EXECUTE PROCEDURE ERROR (13, :IDDOC, :CTAIVA, 2);
                    CUENTA = CTAIVA;
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT E.ARTI_COD, TRAS_IVAMONTO, (TRAS_CANT * TRAS_COSTO)
                        FROM ARTICULO A, CONTABIL_ARTICULO C, TRASFERENCIAS_DETALLE E
                        WHERE E.TRAN_ID = :IDDOC AND E.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTAIVAV = :CUENTA
                        INTO :ARTICULO, :IMPTOS, :MONTO
                        DO
                        BEGIN
                        if (IMPTOS <> 0) then
                            BEGIN
                            if (IMPINC = 'S') then
                                MONTO = MONTO - IMPTOS;
                            /*MONTO = MONTO * -1;*/
                            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :IMPTOS, (:MONTO * -1), 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                            NUMITEMS = NUMITEMS + 1;
                            SUMA = SUMA - IMPTOS;
                            /*AHORA LA ENTRADA*/
                            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                              VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :IMPTOS, 0,:MONTO, 0, :NIT, :PROYDES, :CENTRODES, NULL, NULL, NULL, :ARTICULO, 0, 0);
                            SUMADES = SUMADES + MONTO;
                            NUMITEMS = NUMITEMS + 1;
                            END
                        END
                    END
                if (TIPOCUEN = 'C') then
                        BEGIN
                        EXECUTE PROCEDURE ERROR (13, :IDDOC, :CUENTA, 4);
                        TIPOCUEN = 'N';
                        ERROR = ERROR + 1;
                        END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    /* INSERTE EL REGISTRO DEL IVA EN VENTAS */
                    if (IMPINC = 'S') then
                        MONTO = MONTO - IMPTOS;
                    /*MONTO = MONTO * -1;*/
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :IMPTOS, (:MONTO * -1), 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NUMITEMS = NUMITEMS + 1;
                    SUMA = SUMA - IMPTOS;
                    /*AHORA LA ENTRADA*/
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :IMPTOS, 0,:MONTO, 0, :NIT, :PROYDES, :CENTRODES, NULL, NULL, NULL, :ARTICULO, 0, 0);
                    SUMADES = SUMADES + MONTO;
                    NUMITEMS = NUMITEMS + 1;
                    END
                END
            END /* IVA CONSTANTE */
        /* EL IMPOCONSUMO */
        if (CONSUMO = 'A') then
            BEGIN
            /* SUME LAS BASES DE LOS ARTICULOS DEL DOCUMENTO */
            FOR SELECT MAX(COAR_CTACONS), SUM(TRAS_CONSUMO*TRAS_CANT*TRAS_FACTOR)
                FROM ARTICULO A, CONTABIL_ARTICULO C, TRASFERENCIAS_DETALLE E
                WHERE E.TRAN_ID = :IDDOC AND E.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD
                GROUP BY COAR_CTACONS
                INTO :CTACONSUMO, :IMPTOS
            DO
                BEGIN
                if (IMPTOS <> 0) then
                    BEGIN
                    /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
                    SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                        WHERE CUEN_COD = :CTACONSUMO INTO :CUENTA, :TIPOCUEN;
                    if (CUENTA IS NULL) then
                        begin
                        EXECUTE PROCEDURE ERROR (13, :IDDOC, :CTACONSUMO, 2);
                        CUENTA = CTACONSUMO;
                        TIPOCUEN = 'N';
                        ERROR = ERROR + 1;
                        end
                    if (TIPOCUEN = 'I') then
                        BEGIN
                        /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                        FOR SELECT E.ARTI_COD, (TRAS_CONSUMO*TRAS_CANT*TRAS_FACTOR)
                            FROM ARTICULO A, CONTABIL_ARTICULO C, TRASFERENCIAS_DETALLE E
                            WHERE E.TRAN_ID = :IDDOC AND E.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTACONS = :CUENTA
                            INTO :ARTICULO, :IMPTOS
                            DO
                            if (IMPTOS <> 0) then
                                BEGIN
                                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                                NUMITEMS = NUMITEMS + 1;
                                SUMA = SUMA - IMPTOS;
                                /*AHORA LA ENTRADA*/
                                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :IMPTOS, 0, 0, 0, :NIT, :PROYDES, :CENTRODES, NULL, NULL, NULL, :ARTICULO, 0, 0);
                                SUMADES = SUMADES + MONTO;
                                NUMITEMS = NUMITEMS + 1;
                                END
                        END
                    if (TIPOCUEN = 'C') then
                        BEGIN
                        EXECUTE PROCEDURE ERROR (13, :IDDOC, :CUENTA, 4);
                        TIPOCUEN = 'N';
                        ERROR = ERROR + 1;
                        END
                    if (TIPOCUEN = 'N') then
                        BEGIN
                        /* INSERTE EL REGISTRO DE LA BASE */
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NUMITEMS = NUMITEMS + 1;
                        SUMA = SUMA - IMPTOS;
                        /*AHORA LA ENTRADA*/
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :IMPTOS, 0, 0, 0, :NIT, :PROYDES, :CENTRODES, NULL, NULL, NULL, :ARTICULO, 0, 0);
                        SUMADES = SUMADES + MONTO;
                        NUMITEMS = NUMITEMS + 1;
                        END
                    END
                END /* FOR */
            END /* CONSUMO POR ARTICULO */
        if (CONSUMO = 'K') then
            BEGIN
            /* SUME LAS BASES DE LOS ARTICULOS DEL DOCUMENTO */
            SELECT SUM(TRAS_CONSUMO*TRAS_CANT*TRAS_FACTOR)
                FROM TRASFERENCIAS_DETALLE
                WHERE TRAN_ID = :IDDOC
                INTO :IMPTOS;
            if (IMPTOS <> 0) then
                BEGIN
                /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :CUENTA INTO :CUENTA, :TIPOCUEN;
                if (CUENTA IS NULL) then
                    begin
                    EXECUTE PROCEDURE ERROR (13, :IDDOC, :CTACONSUMO, 2);
                    CUENTA = CTACONSUMO;
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT E.ARTI_COD, (TRAS_CONSUMO*TRAS_CANT*TRAS_FACTOR)
                    FROM ARTICULO A, CONTABIL_ARTICULO C, TRASFERENCIAS_DETALLE E
                        WHERE E.TRAN_ID = :IDDOC AND E.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTACONS = :CUENTA
                        INTO :ARTICULO, :IMPTOS
                        DO
                        if (IMPTOS <> 0) then
                            BEGIN
                            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                            NUMITEMS = NUMITEMS + 1;
                            SUMA = SUMA - IMPTOS;
                            /*AHORA LA ENTRADA*/
                            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :IMPTOS, 0, 0, 0, :NIT, :PROYDES, :CENTRODES, NULL, NULL, NULL, :ARTICULO, 0, 0);
                            SUMADES = SUMADES + MONTO;
                            NUMITEMS = NUMITEMS + 1;
                            END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (13, :IDDOC, :CUENTA, 4);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    /* INSERTE EL REGISTRO DE LA BASE */
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NUMITEMS = NUMITEMS + 1;
                    SUMA = SUMA - IMPTOS;
                    /*AHORA LA ENTRADA*/
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                       VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :IMPTOS, 0, 0, 0, :NIT, :PROYDES, :CENTRODES, NULL, NULL, NULL, :ARTICULO, 0, 0);
                    SUMADES = SUMADES + MONTO;
                    NUMITEMS = NUMITEMS + 1;
                    END
                END
            END /* CONSUMO CONSTANTE */
        /* recorra las cuentas adicionales */
        FOR SELECT INIC_CUENTA, INIC_BASE, INIC_PORC, INIC_VALOR, INIC_DB
            FROM INTERFAZ_INVENTARIO_CTAS
            WHERE ININ_ID = :IDINTER
            INTO :CUENTAADIC, :BASEADIC, :PORCADIC, :VALORADIC, :DBADIC
            DO
            BEGIN
            if (VALORADIC <> 0) then
                MONTO = VALORADIC;
            ELSE
                BEGIN
                if (:BASEADIC = 'SUBTOTAL') then
                    SELECT SUM(TRAS_CANT * TRAS_COSTO)
                    FROM TRASFERENCIAS_DETALLE E
                    WHERE E.TRAN_ID = :IDDOC
                    INTO :VALORADIC;
                if (:BASEADIC = 'IVA') then
                    SELECT SUM(TRAS_IVAMONTO)
                    FROM TRASFERENCIAS_DETALLE E
                    WHERE E.TRAN_ID = :IDDOC
                    INTO :VALORADIC;
                if (:BASEADIC = 'CONSUMO') then
                    SELECT SUM(TRAS_CONSUMO*TRAS_CANT*TRAS_FACTOR)
                    FROM TRASFERENCIAS_DETALLE E
                    WHERE E.TRAN_ID = :IDDOC
                    INTO :VALORADIC;
                MONTO = VALORADIC * PORCADIC / 100;
                END
            if (MONTO <> 0) then
                BEGIN
                /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
                CUENTA = NULL;
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :CUENTAADIC INTO :CUENTA, :TIPOCUEN;
                if (CUENTA IS NULL) then
                    begin
                    EXECUTE PROCEDURE ERROR (13, :IDDOC, :CUENTAADIC, 2);
                    CUENTA = CUENTAADIC;
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (13, :IDDOC, :CUENTA, 3);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (13, :IDDOC, :CUENTA, 4);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    if (DBADIC = 'S') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTAADIC, :CONCEPTO, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        SUMA = SUMA + MONTO;
                        END
                    ELSE
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTAADIC, :CONCEPTO, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        SUMA = SUMA - MONTO;
                        END
                    NUMITEMS = NUMITEMS + 1;
                    END
                END
            END
        /* CIERRE EL COMPROBANTE  */
        if ((SUMA <> 0) AND (SUMADES <> 0)) then
            BEGIN
            if (SUMA > 0) then
                BEGIN
                DEBITO = 0;
                CREDITO = SUMA;
                END
            ELSE    
                BEGIN
                DEBITO = SUMA * -1;
                CREDITO = 0;
                END
            if (SUMADES > 0) then
                BEGIN
                DEBITODES = 0;
                CREDITODES = SUMADES;
                END
            ELSE    
                BEGIN
                DEBITODES = SUMADES * -1;
                CREDITODES = 0;
                END
            if ((TOTAL = 'K') or (TOTAL = 'T')) then
                BEGIN
                if (TOTAL = 'T') then
                    BEGIN
                    SELECT TERC_CTAPROV, TERC_PROV
                        FROM TERCEROS WHERE TERC_NIT = :NIT
                        INTO :CTACIERRE, :PROV;
                    if (PROV = 'S') then
                        SELECT PROV_CTAPAGAR FROM PROVEEDORES WHERE TERC_NIT = :nit
                        INTO :CTACIERRE;
                    END
                /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :CTACIERRE INTO :CUENTA, :TIPOCUEN;
                if (CUENTA IS NULL) then
                    begin
                    EXECUTE PROCEDURE ERROR (13, :IDDOC, :CTACIERRE, 2);
                    CUENTA = CTACIERRE;
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (13, :IDDOC, :CUENTA, 3);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (13, :IDDOC, :CUENTA, 4);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'N') then
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :DEBITO, :CREDITO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NUMITEMS = NUMITEMS + 1;
                /*AHORA LA ENTRADA*/
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :DEBITODES, :CREDITODES, 0, 0, :NIT, :PROYDES, :CENTRODES, NULL, NULL, NULL, NULL, 0, 0);
                END
            END /* SUMA */
        if (ERROR > 0) then
            VER = 'S';
        SUSPEND;
        END /* NO ANULADO */
    END /* EXISTE LA INTERFAZ */
ELSE
    BEGIN
    EXECUTE PROCEDURE ERROR (13, :IDDOC, :PREFIJO, 1);
    ERROR = ERROR + 1;
    VER = 'S';
    SUSPEND;
    END
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE TRASFERENCIAS_SIN_CONTABILIDAD(
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    ID INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    ESTADO VARCHAR(20),
    IDI INTEGER,
    IDC INTEGER)
AS
DECLARE VARIABLE VER CHAR(2);
declare variable FECICNT VARCHAR(10);
declare variable FECFCNT VARCHAR(10);
declare variable ERROR INTEGER;
declare variable idref INTEGER;
BEGIN
EXECUTE PROCEDURE fecha_a_conta(FECINI) returning_values (FECICNT);
EXECUTE PROCEDURE fecha_a_conta(FECFIN) returning_values (FECFCNT);
FOR SELECT TRAN_ID, PREF_PRE, TRAN_NUMERO FROM trasferencias WHERE TRAN_ANULADO = 'N' AND
    TRAN_FECHA >= :FECINI AND TRAN_FECHA <= :FECFIN
    INTO :ID, :PREF, :NUMERO
DO
  BEGIN
  idref = null;
  SELECT ENCO_IDREF FROM COMPROBANTE_ENCABEZADO WHERE ENCO_TIPOREF = 13 AND ENCO_FECHA >= :FECICNT AND ENCO_FECHA <= :FECFCNT and ENCO_IDREF = :id into :idref;
  if (idref IS NULL) then
  begin
  ESTADO = 'PROCESANDO';
  SUSPEND;
  SELECT MAX(ININ_ID) FROM INTERFAZ_INVENTARIO WHERE PREF_PRE = :PREF AND TIDO_COD = 13 INTO :IDI;
  EXECUTE PROCEDURE contabil_traslamercancia (:ID, :IDI) RETURNING_VALUES (:ERROR, :VER, :IDC);
  if (ERROR = 0) then
    BEGIN
      EXECUTE PROCEDURE CONTABILIZA_PENDIENTE (:IDC);
      ESTADO = 'OK';
      END
  ELSE
    ESTADO = 'ERROR';
  suspend;
  end
  END
END

^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure CONTABIL_ENTRADA (
    IDDOC integer,
    IDINTER integer)
returns (
    ERROR integer,
    VER char(1),
    IDC integer)
AS
declare variable PREFIJO VARCHAR(4);
declare variable NUMERO VARCHAR(6);
declare variable FECAUX DATE;
declare variable FECHA CHAR(8);
declare variable CONCEPTO CHAR(60);
declare variable TIPOCOMP VARCHAR(3);
declare variable PREFCONT VARCHAR(4);
declare variable BASE CHAR(1);
declare variable IVAV CHAR(1);
declare variable CONSUMO CHAR(1);
declare variable TOTAL CHAR(1);
declare variable CTABASE VARCHAR(20);
declare variable CTAIVA VARCHAR(20);
declare variable CTACONSUMO VARCHAR(20);
declare variable CTACIERRE VARCHAR(20);
declare variable EXISTE CHAR(1);
declare variable CUENTA VARCHAR(20);
declare variable MONTO NUMERIC(18,2);
declare variable TIPOCUEN CHAR(1);
declare variable NIT VARCHAR(20);
declare variable PROY VARCHAR(4);
declare variable CENTRO VARCHAR(4);
declare variable DEBITO NUMERIC(18,2);
declare variable CREDITO NUMERIC(18,2);
declare variable NUMITEMS INTEGER;
declare variable ARTICULO VARCHAR(15);
declare variable IMPINC CHAR(1);
declare variable IMPTOS NUMERIC(18, 2);
declare variable SUMA NUMERIC(18,2);
declare variable VRBASE NUMERIC(18,2);
declare variable CUENTAADIC VARCHAR(20);
declare variable BASEADIC VARCHAR(20);
declare variable PORCADIC NUMERIC(5,2);
declare variable VALORADIC NUMERIC(18,2);
declare variable DBADIC CHAR(1);
declare variable PROV CHAR(1);
declare variable ANULADO CHAR(1);
declare variable CENT CHAR(1);
BEGIN
  /* BUSQUE LA INTERFACE */
  EXISTE = 'N';
  SELECT 'S', PREF_PRE, TICO_COD, PRCO_PREF, ININ_BASE, ININ_IVAV, ININ_CONSUMO, ININ_TOTAL, ININ_CTABASE, ININ_CTAIVA, ININ_CTACONSUMO, ININ_CTACIERRE, ININ_CONFIRMAR, ININ_CENTRO, ININ_CODPROY, ININ_CODCENT
    FROM INTERFAZ_INVENTARIO
    WHERE ININ_ID = :IDINTER
    INTO :EXISTE, :PREFIJO, :TIPOCOMP, :PREFCONT, :BASE, :IVAV, :CONSUMO, :TOTAL, :CTABASE, :CTAIVA, :CTACONSUMO, :CTACIERRE, :VER, :CENT, :PROY, :centro;
  if (EXISTE = 'S') then
    BEGIN
    /* TRAIGA EL ENCABEZADO DE LA ENTRADA */
    SELECT PREF_PRE, ENTR_NUMERO, ENTR_FECHA, ENTR_CONC, TERC_NIT, ENTR_IMPTOS, ENTR_ANULADO
        FROM ENTRADAS
        WHERE ENTR_ID = :IDDOC
        INTO :PREFIJO, :NUMERO, :FECAUX, :CONCEPTO, :NIT, :IMPINC, :ANULADO;
    if ((NIT IS NULL) or (NIT = '')) then
        EXECUTE PROCEDURE LEE_CONFIGURACION('CONTABILIDAD', 'GENERAL', 'NIT COMPAÑIA') RETURNING_VALUES (:NIT);
        
    /* BORRE CUALQUEIR CONTABILIZACION PREVIA */
    DELETE FROM CONTABILIZACION WHERE CNTB_TIPOREF = 11 AND CNTB_IDREF = :IDDOC;

    if (ANULADO = 'N') then
        BEGIN
        if (CENT = 'B') then
            SELECT BODE_CENTRO, BODE_PROY FROM BODEGA B, ENTRADAS E
                WHERE B.BODE_COD = E.BODE_COD AND E.ENTR_ID = :IDDOC INTO :CENTRO, :PROY;
        ELSE
          if (CENT = 'P') then
            SELECT PREF_CENTRO, PREF_PROY FROM PREFIJOS P, ENTRADAS E
                WHERE P.PREF_PRE = E.PREF_PRE AND P.TIDO_COD = 11 AND E.ENTR_ID = :IDDOC INTO :CENTRO, :PROY;
        /* CONVIERTA LA FECHA A CADENA */
        EXECUTE PROCEDURE FECHA_A_CONTA(:FECAUX) returning_values (:FECHA);
        IDC = GEN_ID(ID_CONTABILIZA, 1);
        /* REGISTRE EL ENCABEZADO CONTABLE */
        INSERT INTO CONTABILIZACION (CNTB_ID, CNTB_TIPOCOMP, CNTB_PREFCNT, CNTB_NUMERO, CNTB_FECHA, CNTB_CONCEPTO, CNTB_REF, CNTB_TIPOREF, CNTB_IDREF, CNTB_PREFREF, CNTB_NUMREF, CNTB_PROCESADO)
            VALUES (:IDC, :TIPOCOMP, :PREFCONT, :NUMERO, :FECHA, :CONCEPTO, '', 11, :IDDOC, :PREFIJO, :NUMERO, 'N');
        NUMITEMS = 0;
        SUMA = 0;
        ERROR = 0;
        /* PRIMERO LA BASE */
        if (BASE = 'A') then
            BEGIN
            /* SUME LAS BASES DE LOS ARTICULOS DEL DOCUMENTO */
            FOR SELECT MAX(COAR_CTAINV), SUM(CAST(ENDE_CANT AS DOUBLE PRECISION) * ENDE_COSTO), SUM(ENDE_IVAMONTO + (ENDE_CONSUMO * ENDE_CANT * ENDE_FACTOR))
                FROM ARTICULO A, CONTABIL_ARTICULO C, ENTRADAS_DETALLE E
                WHERE E.ENTR_ID = :IDDOC AND E.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD
                GROUP BY COAR_CTAINV
                INTO :CTABASE, :MONTO, :IMPTOS
            DO
            if (MONTO <> 0) then
                BEGIN
                if (IMPINC = 'S') then
                    MONTO = MONTO - IMPTOS;
                VRBASE = MONTO;
                /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :CTABASE INTO :CUENTA, :TIPOCUEN;
                if (CUENTA IS NULL) then
                    begin
                    EXECUTE PROCEDURE ERROR (11, :IDDOC, :CTABASE, 2);
                    CUENTA = CTABASE;
                    ERROR = ERROR + 1;
                    end
                /* DEPENDE DEL TIPO DE CUENTA */
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT E.ARTI_COD, (CAST(ENDE_CANT AS DOUBLE PRECISION) * ENDE_COSTO), (ENDE_IVAMONTO + (ENDE_CONSUMO * ENDE_CANT * ENDE_FACTOR))
                        FROM ARTICULO A, CONTABIL_ARTICULO C, ENTRADAS_DETALLE E
                        WHERE E.ENTR_ID = :IDDOC AND E.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTAINV = :CUENTA
                        INTO :ARTICULO, :MONTO, :IMPTOS
                    DO
                        BEGIN
                        if (IMPINC = 'S') then
                            MONTO = MONTO - IMPTOS;
                        IF (MONTO <> 0) THEN
                            BEGIN
                            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                            NUMITEMS = NUMITEMS + 1;
                            SUMA = SUMA + MONTO;
                            END
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (11, :IDDOC, :CUENTA, 4);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    /* INSERTE EL REGISTRO DE LA BASE */
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NUMITEMS = NUMITEMS + 1;
                    SUMA = SUMA + MONTO;
                    END
                END /* FOR */
            END /* BASE */
        if (BASE = 'I') then
            BEGIN
            /* SUME LAS BASES DE LOS ARTICULOS DEL DOCUMENTO */
            FOR SELECT MAX(TAIV_CTAINV), SUM(CAST(ENDE_CANT AS DOUBLE PRECISION) * ENDE_COSTO), SUM(ENDE_IVAMONTO + (ENDE_CONSUMO * ENDE_CANT * ENDE_FACTOR))
                FROM ARTICULO A, TARIFA_IVA I, ENTRADAS_DETALLE E
                WHERE E.ENTR_ID = :IDDOC AND E.ARTI_COD = A.ARTI_COD AND A.TAIV_COD = I.TAIV_COD
                GROUP BY TAIV_CTAINV
                INTO :CTABASE, :MONTO, :IMPTOS
            DO
            if (MONTO <> 0) then
                BEGIN
                if (IMPINC = 'S') then
                    MONTO = MONTO - IMPTOS;
                VRBASE = MONTO;
                /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :CTABASE INTO :CUENTA, :TIPOCUEN;
                if (CUENTA IS NULL) then
                    begin
                    EXECUTE PROCEDURE ERROR (11, :IDDOC, :CTABASE, 2);
                    CUENTA = CTABASE;
                    ERROR = ERROR + 1;
                    end
                /* DEPENDE DEL TIPO DE CUENTA */
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT E.ARTI_COD, (CAST(ENDE_CANT AS DOUBLE PRECISION) * ENDE_COSTO), (ENDE_IVAMONTO + (ENDE_CONSUMO * ENDE_CANT * ENDE_FACTOR))
                        FROM ARTICULO A, TARIFA_IVA I, ENTRADAS_DETALLE E
                        WHERE E.ENTR_ID = :IDDOC AND E.ARTI_COD = A.ARTI_COD AND A.TAIV_COD = I.TAIV_COD AND TAIV_CTAINV = :CUENTA
                        INTO :ARTICULO, :MONTO, :IMPTOS
                    DO
                        BEGIN
                        if (IMPINC = 'S') then
                            MONTO = MONTO - IMPTOS;
                        IF (MONTO <> 0) THEN
                            BEGIN
                            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                            NUMITEMS = NUMITEMS + 1;
                            SUMA = SUMA + MONTO;
                            END
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (11, :IDDOC, :CUENTA, 4);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    /* INSERTE EL REGISTRO DE LA BASE */
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NUMITEMS = NUMITEMS + 1;
                    SUMA = SUMA + MONTO;
                    END
                END /* FOR */
            END /* BASE */
        if ((BASE = 'K') or (BASE = 'T')) then
            BEGIN
            CUENTA = :ctabase;
            if (BASE = 'T') then
                BEGIN
                SELECT TERC_PROV, TERC_CTAVENTA FROM TERCEROS WHERE TERC_NIT = :NIT INTO :PROV, :CUENTA;
                if (:PROV = 'S') then
                    SELECT PROV_CTACAUSA FROM PROVEEDORES WHERE TERC_NIT = :NIT INTO :CUENTA;
                END
            /* SUME LAS BASES DE LOS ARTICULOS DEL DOCUMENTO */
            SELECT SUM(CAST(ENDE_CANT AS DOUBLE PRECISION) * ENDE_COSTO), SUM(ENDE_IVAMONTO + (ENDE_CONSUMO * ENDE_CANT * ENDE_FACTOR))
                FROM ENTRADAS_DETALLE E
                WHERE E.ENTR_ID = :IDDOC
                INTO :MONTO, :IMPTOS;
        
            if (MONTO <> 0) then
                BEGIN
                if (IMPINC = 'S') then
                    MONTO = MONTO - IMPTOS;
                /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :CTABASE INTO :CUENTA, :TIPOCUEN;
                if (CUENTA IS NULL) then
                    begin
                    EXECUTE PROCEDURE ERROR (11, :IDDOC, :CTABASE, 2);
                    CUENTA = CTABASE;
                    ERROR = ERROR + 1;
                    end
                /* DEPENDE DEL TIPO DE CUENTA */
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT E.ARTI_COD, (CAST(ENDE_CANT AS DOUBLE PRECISION) * ENDE_COSTO), (ENDE_IVAMONTO + (ENDE_CONSUMO * ENDE_CANT * ENDE_FACTOR))
                        FROM ARTICULO A, CONTABIL_ARTICULO C, ENTRADAS_DETALLE E
                        WHERE E.ENTR_ID = :IDDOC AND E.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTAINV = :CUENTA
                        INTO :ARTICULO, :MONTO, :IMPTOS
                        DO
                        BEGIN
                        if (IMPINC = 'S') then
                            MONTO = MONTO - IMPTOS;
                        IF (MONTO <> 0) Then
                            BEGIN
                            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                            NUMITEMS = NUMITEMS + 1;
                            SUMA = SUMA + MONTO;
                            END
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (11, :IDDOC, :CUENTA, 4);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    /* INSERTE EL REGISTRO DE LA BASE */
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NUMITEMS = NUMITEMS + 1;
                    SUMA = SUMA + MONTO;
                    END
                END
            END /* BASE K O T */
        /* EL IVA  */
        if (IVAV = 'A') then
            BEGIN
            /* SUME LAS BASES DE LOS ARTICULOS DEL DOCUMENTO */
            FOR SELECT MAX(COAR_CTAIVAV), SUM(ENDE_IVAMONTO), SUM(CAST(ENDE_CANT AS DOUBLE PRECISION) * ENDE_COSTO)
                FROM ARTICULO A, CONTABIL_ARTICULO C, ENTRADAS_DETALLE E
                WHERE E.ENTR_ID = :IDDOC AND E.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD
                GROUP BY COAR_CTAIVAV
                INTO :CTAIVA, :IMPTOS, :MONTO
            DO
                BEGIN
                if (IMPINC = 'S') then
                    MONTO = MONTO - IMPTOS;
                if (IMPTOS <> 0) then
                    BEGIN
                    /* TRAIGA LAS CARCATERISTICAS DE LA CUENTA */
                    SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                        WHERE CUEN_COD = :CTAIVA INTO :CUENTA, :TIPOCUEN;
                    if (CUENTA IS NULL) then
                        begin
                        EXECUTE PROCEDURE ERROR (11, :IDDOC, :CTAIVA, 2);
                        CUENTA = CTAIVA;
                        ERROR = ERROR + 1;
                        end
                    /* DEPENDE DEL TIPO DE CUENTA */
                    if (TIPOCUEN = 'I') then
                        BEGIN
                        /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                        FOR SELECT E.ARTI_COD, ENDE_IVAMONTO, (CAST(ENDE_CANT AS DOUBLE PRECISION) * ENDE_COSTO)
                            FROM ARTICULO A, CONTABIL_ARTICULO C, ENTRADAS_DETALLE E
                            WHERE E.ENTR_ID = :IDDOC AND E.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTAIVAV = :CUENTA
                            INTO :ARTICULO, :IMPTOS, :MONTO
                        DO
                            BEGIN
                            if (IMPINC = 'S') then
                                MONTO = MONTO - IMPTOS;
                            if (IMPTOS <> 0) then
                                BEGIN
                                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :IMPTOS, 0, :MONTO, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                                NUMITEMS = NUMITEMS + 1;
                                SUMA = SUMA + IMPTOS;
                                END
                            END
                        END
                    if (TIPOCUEN = 'C') then
                        BEGIN
                        EXECUTE PROCEDURE ERROR (11, :IDDOC, :CUENTA, 4);
                        TIPOCUEN = 'N';
                        ERROR = ERROR + 1;
                        END
                    if (TIPOCUEN = 'N') then
                        BEGIN
                        /* INSERTE EL REGISTRO DEL IVA EN VENTAS */
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :IMPTOS, 0, :MONTO, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NUMITEMS = NUMITEMS + 1;
                        SUMA = SUMA + IMPTOS;
                        END
                    END /* MONTO <> 0 */
                END /* FOR */
            END /* IVA */
        if (IVAV = 'I') then
            BEGIN
            /* SUME LAS BASES DE LOS ARTICULOS DEL DOCUMENTO */
            FOR SELECT MAX(TAIV_CTAIVACMP), SUM(ENDE_IVAMONTO), SUM(CAST(ENDE_CANT AS DOUBLE PRECISION) * ENDE_COSTO)
                FROM ARTICULO A, TARIFA_IVA I, ENTRADAS_DETALLE E
                WHERE E.ENTR_ID = :IDDOC AND E.ARTI_COD = A.ARTI_COD AND A.TAIV_COD = I.TAIV_COD
                GROUP BY TAIV_CTAIVACMP
                INTO :CTAIVA, :IMPTOS, :MONTO
            DO
                BEGIN
                if (IMPINC = 'S') then
                    MONTO = MONTO - IMPTOS;
                if (MONTO <> 0) then
                    BEGIN
                    /* TRAIGA LAS CARCATERISTICAS DE LA CUENTA */
                    SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                        WHERE CUEN_COD = :CTAIVA INTO :CUENTA, :TIPOCUEN;
                    if (CUENTA IS NULL) then
                        begin
                        EXECUTE PROCEDURE ERROR (11, :IDDOC, :CTAIVA, 2);
                        CUENTA = CTAIVA;
                        ERROR = ERROR + 1;
                        end
                    /* DEPENDE DEL TIPO DE CUENTA */
                    if (TIPOCUEN = 'I') then
                        BEGIN
                        /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                        FOR SELECT E.ARTI_COD, ENDE_IVAMONTO, (CAST(ENDE_CANT AS DOUBLE PRECISION) * ENDE_COSTO)
                            FROM ARTICULO A, TARIFA_IVA I, ENTRADAS_DETALLE E
                            WHERE E.ENTR_ID = :IDDOC AND E.ARTI_COD = A.ARTI_COD AND A.TAIV_COD = I.TAIV_COD AND TAIV_CTAIVACMP = :CUENTA
                            INTO :ARTICULO, :IMPTOS, :MONTO
                        DO
                            BEGIN
                            if (IMPINC = 'S') then
                                MONTO = MONTO - IMPTOS;
                            if (MONTO <> 0) then
                                BEGIN
                                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :IMPTOS, 0, :MONTO, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                                NUMITEMS = NUMITEMS + 1;
                                SUMA = SUMA + IMPTOS;
                                END
                            END
                        END
                    if (TIPOCUEN = 'C') then
                        BEGIN
                        EXECUTE PROCEDURE ERROR (11, :IDDOC, :CUENTA, 4);
                        TIPOCUEN = 'N';
                        ERROR = ERROR + 1;
                        END
                    if (TIPOCUEN = 'N') then
                        BEGIN
                        /* INSERTE EL REGISTRO DEL IVA EN VENTAS */
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :IMPTOS, 0, :MONTO, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NUMITEMS = NUMITEMS + 1;
                        SUMA = SUMA + IMPTOS;
                        END
                    END
                END /* FOR */
            END /* IVA */
        if (IVAV = 'K') then
            BEGIN
            /* SUME LAS BASES DE LOS ARTICULOS DEL DOCUMENTO */
            SELECT SUM(ENDE_IVAMONTO), SUM(CAST(ENDE_CANT AS DOUBLE PRECISION) * ENDE_COSTO)
                FROM ENTRADAS_DETALLE E
                WHERE E.ENTR_ID = :IDDOC
                INTO :IMPTOS, :MONTO;
            if (IMPINC = 'S') then
                MONTO = MONTO - IMPTOS;
            if (IMPTOS <> 0) then
                BEGIN
                /* TRAIGA LAS CARCATERISTICAS DE LA CUENTA */
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :CTAIVA INTO :CUENTA, :TIPOCUEN;
                if (CUENTA IS NULL) then
                    begin
                    EXECUTE PROCEDURE ERROR (11, :IDDOC, :CTAIVA, 2);
                    CUENTA = CTABASE;
                    ERROR = ERROR + 1;
                    end
                /* DEPENDE DEL TIPO DE CUENTA */
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT E.ARTI_COD, ENDE_IVAMONTO, (CAST(ENDE_CANT AS DOUBLE PRECISION) * ENDE_COSTO)
                        FROM ARTICULO A, CONTABIL_ARTICULO C, ENTRADAS_DETALLE E
                        WHERE E.ENTR_ID = :IDDOC AND E.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTAIVAV = :CUENTA
                        INTO :ARTICULO, :IMPTOS, :MONTO
                        DO
                        BEGIN
                        if (IMPINC = 'S') then
                            MONTO = MONTO - IMPTOS;
                        if (IMPTOS <> 0) then
                            BEGIN
                            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :IMPTOS, 0, :MONTO, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                            NUMITEMS = NUMITEMS + 1;
                            SUMA = SUMA + IMPTOS;
                            END
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (11, :IDDOC, :CUENTA, 4);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    /* INSERTE EL REGISTRO DEL IVA EN VENTAS */
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :IMPTOS, 0, :MONTO, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NUMITEMS = NUMITEMS + 1;
                    SUMA = SUMA + IMPTOS;
                    END
                END
            END /* IVA K */
        /* EL IMPOCONSUMO */
        if (CONSUMO = 'A') then
            BEGIN
            /* SUME LAS BASES DE LOS ARTICULOS DEL DOCUMENTO */
            FOR SELECT MAX(COAR_CTACONS), SUM(ENDE_CONSUMO * ENDE_CANT * ENDE_FACTOR)
                FROM ARTICULO A, CONTABIL_ARTICULO C, ENTRADAS_DETALLE E
                WHERE E.ENTR_ID = :IDDOC AND E.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD
                GROUP BY COAR_CTACONS
                INTO :CTACONSUMO, :IMPTOS
            DO
                BEGIN
                if (IMPTOS <> 0) then
                    BEGIN
                    /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
                    SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                        WHERE CUEN_COD = :CTACONSUMO INTO :CUENTA, :TIPOCUEN;
                    if (CUENTA IS NULL) then
                        begin
                        EXECUTE PROCEDURE ERROR (11, :IDDOC, :CTACONSUMO, 2);
                        CUENTA = CTABASE;
                        ERROR = ERROR + 1;
                        end
                    /* DEPENDE DEL TIPO DE CUENTA */
                    if (TIPOCUEN = 'I') then
                        BEGIN
                        /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                        FOR SELECT E.ARTI_COD, ENDE_CONSUMO * ENDE_CANT * ENDE_FACTOR
                            FROM ARTICULO A, CONTABIL_ARTICULO C, ENTRADAS_DETALLE E
                            WHERE E.ENTR_ID = :IDDOC AND E.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTACONS = :CUENTA
                            INTO :ARTICULO, :IMPTOS
                        DO
                            BEGIN
                            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                            NUMITEMS = NUMITEMS + 1;
                            SUMA = SUMA + IMPTOS;
                            END
                        END
                    if (TIPOCUEN = 'C') then
                        BEGIN
                        EXECUTE PROCEDURE ERROR (11, :IDDOC, :CUENTA, 4);
                        TIPOCUEN = 'N';
                        ERROR = ERROR + 1;
                        END
                    if (TIPOCUEN = 'N') then
                        BEGIN
                        /* INSERTE EL REGISTRO DE LA BASE */
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NUMITEMS = NUMITEMS + 1;
                        SUMA = SUMA + IMPTOS;
                        END
                    END
                END /* FOR */
            END /* CONSUMO */
        if (CONSUMO = 'K') then
            BEGIN
            /* SUME LAS BASES DE LOS ARTICULOS DEL DOCUMENTO */
            SELECT SUM(ENDE_CONSUMO * ENDE_CANT * ENDE_FACTOR) FROM ENTRADAS_DETALLE E
                WHERE E.ENTR_ID = :IDDOC INTO :IMPTOS;
            if (IMPTOS <> 0) then
                BEGIN
                /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :CTACONSUMO INTO :CUENTA, :TIPOCUEN;
                if (CUENTA IS NULL) then
                    begin
                    EXECUTE PROCEDURE ERROR (11, :IDDOC, :CTACONSUMO, 2);
                    CUENTA = CTACONSUMO;
                    ERROR = ERROR + 1;
                    end
                /* DEPENDE DEL TIPO DE CUENTA */
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT E.ARTI_COD, ENDE_CONSUMO * ENDE_CANT * ENDE_FACTOR
                        FROM ARTICULO A, CONTABIL_ARTICULO C, ENTRADAS_DETALLE E
                        WHERE E.ENTR_ID = :IDDOC AND E.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTACONS = :CUENTA
                        INTO :ARTICULO, :IMPTOS
                        DO
                        BEGIN
                        if (IMPTOS <> 0) then
                            BEGIN
                            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                            NUMITEMS = NUMITEMS + 1;
                            SUMA = SUMA + IMPTOS;
                            END
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (11, :IDDOC, :CUENTA, 4);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    /* INSERTE EL REGISTRO DE LA BASE */
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NUMITEMS = NUMITEMS + 1;
                    SUMA = SUMA + IMPTOS;
                    END
                END
            END /* CONSUMO K */
        /* recorra las cuentas adicionales */
        FOR SELECT INIC_CUENTA, INIC_BASE, INIC_PORC, INIC_VALOR, INIC_DB
            FROM INTERFAZ_INVENTARIO_CTAS
            WHERE ININ_ID = :IDINTER
            INTO :CUENTAADIC, :BASEADIC, :PORCADIC, :VALORADIC, :DBADIC
            DO
            BEGIN
            if (VALORADIC <> 0) then
                MONTO = VALORADIC;
            ELSE
                BEGIN
                if (:BASEADIC = 'SUBTOTAL') then
                    SELECT SUM(CAST(ENDE_CANT AS DOUBLE PRECISION) * (ENDE_COSTO-ENDE_DTOMONTO)) FROM
                        ENTRADAS_DETALLE WHERE ENTR_ID = :iddoc INTO :VALORADIC;
                if (:BASEADIC = 'IVA') then
                    SELECT SUM(ENDE_IVAMONTO) FROM
                        ENTRADAS_DETALLE WHERE ENTR_ID = :iddoc INTO :VALORADIC;
                if (:BASEADIC = 'CONSUMO') then
                    SELECT SUM(ENDE_CONSUMO * ENDE_CANT * ENDE_FACTOR) FROM
                        ENTRADAS_DETALLE WHERE ENTR_ID = :iddoc INTO :VALORADIC;
                if (:BASEADIC = 'TOTAL') then
                    SELECT SUM((CAST(ENDE_CANT AS DOUBLE PRECISION) * (ENDE_COSTO-ENDE_DTOMONTO)) + ENDE_IVAMONTO + (ENDE_CONSUMO * ENDE_CANT * ENDE_FACTOR)) FROM
                        ENTRADAS_DETALLE WHERE ENTR_ID = :iddoc INTO :VALORADIC;
                MONTO = VALORADIC * PORCADIC / 100;
                END
            if (MONTO <> 0) then
                BEGIN
                CUENTA = NULL;
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :CUENTAADIC INTO :CUENTA, :TIPOCUEN;
                if (CUENTA IS NULL) then
                    begin
                    EXECUTE PROCEDURE ERROR (11, :IDDOC, :CUENTAADIC, 2);
                    CUENTA = CUENTAADIC;
                    ERROR = ERROR + 1;
                    end
                /* DEPENDE DEL TIPO DE CUENTA */
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (11, :IDDOC, :CUENTA, 3);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (11, :IDDOC, :CUENTA, 4);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    if (DBADIC = 'S') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTAADIC, :CONCEPTO, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        SUMA = SUMA + MONTO;
                        END
                    ELSE
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTAADIC, :CONCEPTO, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        SUMA = SUMA - MONTO;
                        END
                    NUMITEMS = NUMITEMS + 1;
                    END
                END
            END
        /* CIERRE EL COMPROBANTE CONTRA LA CUENTA DEL TERCERO O LA CONSTANTE */
        if (SUMA <> 0) then
            BEGIN
            if (SUMA > 0) then
                BEGIN
                DEBITO = 0;
                CREDITO = SUMA;
                END
            ELSE
                BEGIN
                DEBITO = SUMA * -1;
                CREDITO = 0;
                END
            if (TOTAL <> 'K') then
                BEGIN
                SELECT TERC_CTAPROV, TERC_PROV
                    FROM TERCEROS WHERE TERC_NIT = :NIT
                    INTO :CTACIERRE, :PROV;
                if (PROV = 'S') then
                    SELECT PROV_CTAPAGAR FROM PROVEEDORES WHERE TERC_NIT = :nit INTO :CUENTA;
                END
            /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTACIERRE INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERROR (24, :IDDOC, :CTACIERRE, 2);
                CUENTA = CTACIERRE;
                ERROR = ERROR + 1;
                end
            /* DEPENDE DEL TIPO DE CUENTA */
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERROR (11, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                EXECUTE PROCEDURE ERROR (11, :IDDOC, :CUENTA, 4);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'N') then
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :DEBITO, :CREDITO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            END /* SUMA */
        if (ERROR > 0) then
            VER = 'S';
        END
      END /* EXISTE LA INTERFAZ */
  ELSE
    BEGIN
    EXECUTE PROCEDURE ERROR (11, :IDDOC, :PREFIJO, 1);
    ERROR = ERROR + 1;
    VER = 'S';
    END
SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE ENTRADAS_SIN_CONTABILIDAD(
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    ID INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    ESTADO VARCHAR(20),
    IDI INTEGER,
    IDC INTEGER)
AS
DECLARE VARIABLE VER CHAR(2);
declare variable FECICNT VARCHAR(10);
declare variable FECFCNT VARCHAR(10);
declare variable ERROR INTEGER;
declare variable idref INTEGER;
BEGIN
EXECUTE PROCEDURE fecha_a_conta(FECINI) returning_values (FECICNT);
EXECUTE PROCEDURE fecha_a_conta(FECFIN) returning_values (FECFCNT);
FOR SELECT ENTR_ID, PREF_PRE, ENTR_NUMERO FROM ENTRADAS WHERE ENTR_ANULADO = 'N' AND
    ENTR_FECHA >= :FECINI AND ENTR_FECHA <= :FECFIN
    INTO :ID, :PREF, :NUMERO
DO
  BEGIN
  idref = null;
  SELECT ENCO_IDREF FROM COMPROBANTE_ENCABEZADO WHERE ENCO_TIPOREF = 11 AND ENCO_FECHA >= :FECICNT AND ENCO_FECHA <= :FECFCNT AND ENCO_IDREF = :id INTO :idref;
  if (idref IS NULL) then
  BEGIN
   ESTADO = 'PROCESANDO';
   SUSPEND;
   SELECT MAX(ININ_ID) FROM INTERFAZ_INVENTARIO WHERE PREF_PRE = :PREF AND TIDO_COD = 11 INTO :IDI;
   EXECUTE PROCEDURE CONTABIL_ENTRADA (:ID, :IDI) RETURNING_VALUES (:ERROR, :VER, :IDC);
   if (ERROR = 0) then
    BEGIN
      EXECUTE PROCEDURE CONTABILIZA_PENDIENTE (:IDC);
      ESTADO = 'OK';
      END
   ELSE
    ESTADO = 'ERROR';
   suspend;
  end
  END
END

^

SET TERM ; ^

/* 20101125b */
/* NO INCLUYA LAS FORMAS DE PAGO EN CERO */
SET TERM ^ ;

CREATE OR ALTER procedure REP_DOCUMENTOS_ENCAJA (
    CAJAINI integer,
    CAJAFIN integer,
    FECHA DATE)
returns (
    CAJAID integer,
    CAJANOM varchar(60),
    RESPONSABLE varchar(60),
    TIPODOC varchar(8),
    NUMDOC varchar(10),
    BANCO varchar(2),
    CUENTA varchar(20),
    NUMERO varchar(20),
    FECDOC date,
    MONTO numeric(18,2),
    FORPAGO varchar(30),
    NOMTERC varchar(60))
AS
declare variable TIPOENT INTEGER;
declare variable IDDOC INTEGER;
declare variable TIPOSAL INTEGER;
declare variable IDSAL INTEGER;
declare variable OK CHAR(1);
declare variable FECREC DATE;
BEGIN
FOR SELECT CAJA_ID, CAJA_NOMBRE, CAJA_RESP FROM CAJAS
    WHERE CAJA_ID >= :CAJAINI AND CAJA_ID <= :CAJAFIN AND CAJA_ACTIVA = 'S'
    ORDER BY CAJA_ID
    INTO :CAJAID, :CAJANOM, :RESPONSABLE
    DO
    BEGIN
    /* PRIMERO EL SALDO DE EFECTIVO */
    FORPAGO = 'EFECTIVO';
    TIPODOC = '';
    NUMDOC = '';
    BANCO = '';
    CUENTA = '';
    NUMERO = '';
    execute procedure SALDO_EN_EFECTIVO(:CAJAID, :fecha) RETURNING_VALUES (:MONTO);
    SUSPEND;
    
    FOR SELECT DPCA_BANCO, DPCA_CUENTA, DPCA_NUMERO, DPCA_FECHA, DPCA_MONTO, FOPA_NOM, TIDO_NOMCORTO, DPCA_TIPOENT, DPCA_IDENT, DPCA_TIPOSAL, DPCA_IDSAL
        FROM DOCUMENTOS_PAGO_CAJA D, TIPO_DOCUMENTO T, FORMAS_PAGO F
        WHERE D.DPCA_TIPOENT = T.TIDO_COD AND D.FOPA_ID = F.FOPA_ID AND D.CAJA_ID = :CAJAID AND D.FOPA_ID <> 1 AND DPCA_MONTO <> 0
        ORDER BY FOPA_NOM, DPCA_FECHA
        INTO :BANCO, :CUENTA, :NUMERO, :FECDOC, :MONTO, :FORPAGO, :TIPODOC, :tipoent, :IDDOC, :tiposal, :idsal
        DO
        BEGIN
        OK = 'N';
        SELECT MOCA_FECHA FROM movimiento_caja WHERE MOCA_TIPOREF = :tipoent AND MOCA_IDREF = :IDDOC INTO :FECREC;
        if (FECREC <= FECHA) then
            BEGIN
            /* VERIFIQUE QUE NO ESTE SALIDO */
            if ((:IDSAL = 0) AND (:TIPOSAL = 0)) THEN
                OK = 'S';   
            ELSE
                BEGIN
                SELECT MOCA_FECHA FROM movimiento_caja WHERE MOCA_TIPOREF = :tiposal AND MOCA_IDREF = :idsal INTO :FECREC;
                    if (FECREC > FECHA) then
                        OK = 'S';
                END
            END
        if (OK = 'S') then
            BEGIN
            if (TIPODOC = 'RECICAJA') then
                SELECT PREF_PRE || RECA_NUMERO, TERC_NOM FROM RECIBOS_CAJA R, TERCEROS T
                    WHERE RECA_ID = :IDDOC AND R.TERC_NIT = T.TERC_NIT INTO :NUMDOC, :NOMTERC;
            if (TIPODOC = 'RECIPROV') then
                SELECT PREF_PRE || RCPR_NUMERO, TERC_NOM FROM RECIBO_PROVISIONAL R, TERCEROS T
                    WHERE RCPR_ID = :IDDOC AND R.TERC_NIT = T.TERC_NIT INTO :NUMDOC, :NOMTERC;
            if (TIPODOC = 'DEVOCHEQ') then
                SELECT PRBA_PREF || DVCH_NUMDOC, TERC_NOM FROM DEVOLUCION_CHEQUES D, TERCEROS T
                    WHERE DVCH_ID = :IDDOC AND D.TERC_NIT = T.TERC_NIT INTO :NUMDOC, :NOMTERC;
            if (TIPODOC = 'TRASLACJ') then
                SELECT PREF_PRE || TRCJ_NUMERO, '' FROM traslados_caja
                    WHERE TRCJ_ID = :IDDOC INTO :NUMDOC, :NOMTERC;
            SUSPEND;
            END
        END
    END
END
^

SET TERM ; ^

/* 20101125C */
/* multilpe rows al actualizr costo de remision con articulo repetido */
SET TERM ^ ;

CREATE OR ALTER TRIGGER FACTCOMP_DETALLE_AI FOR FACTURAS_COMPRAS_DETALLE
ACTIVE AFTER INSERT POSITION 0
AS
declare variable fec date;
declare variable fecaux date;
declare variable aux varchar(90);
declare variable CONC VARCHAR(60);
declare variable factor numeric(18,4);
declare variable Pref varchar(4);
declare variable Num varchar(6);
declare variable Nit varchar(20);
declare variable TIPO INTEGER;
declare variable INVFAC CHAR(2);
declare variable IVAINC CHAR(2);
declare variable ICOINC CHAR(2);
declare variable COSTO NUMERIC(18,2);
declare variable CANTREL NUMERIC(18,4);
declare variable NUMPROV VARCHAR(10);
declare variable NUMPED VARCHAR(30);
declare variable NUMREM VARCHAR(30);
declare variable CONSO VARCHAR(2);
declare variable CONSOLIDA INTEGER;
declare variable NUMROWS INTEGER;
declare variable DTOPIE NUMERIC(18,2);
declare variable ADICIONAL NUMERIC(18,2);
declare variable TOTAL NUMERIC(18,2);
declare variable IVAMONTO NUMERIC(18,2);
declare variable EXTRA NUMERIC(18,2);
declare variable FACT NUMERIC(18,4);
declare variable MENORV CHAR(2);
declare variable ACTREM CHAR(2);
declare variable ACTCAN CHAR(2);
declare variable FECREM date;
declare variable IDREM INTEGER;
declare variable ITEREM INTEGER;
declare variable CANTREM NUMERIC(18,4);
declare variable LOTEREM VARCHAR(15);
declare variable PREFREM CHAR(4);
declare variable IDMOV INTEGER;
declare variable DTOPOR NUMERIC(18,4);
BEGIN
if ((NEW.faco_id <> 0) and (new.fcde_anulado = 'N')) then
    BEGIN
    select faco_fecha, pref_pre, faco_numero, terc_nit, faco_imptos, faco_numprov, faco_remision, faco_orden, FACO_CONSOLIDA,
        FACO_TOTAL, FACO_EXTRA, FACO_IVAMONTO, FACO_ADICIONAL, FACO_DTOMONTO, FACO_DTOPORC
        from facturas_compra where faco_id = new.faco_id
        into :fec, :Pref, :Num, :Nit, :ivainc, :numprov, :numrem, :numped, :CONSOLIDA,
        :total, :extra, :ivamonto, :adicional, :dtopie, :dtopor;
    conc = 'FACTURA DE COMPRA No.' || PREF || NUM || '-' || NUMPROV;
    if (NUMREM <> '') then
        BEGIN
        AUX = SUBSTR(NUMREM, 1, 15);
        conc = conc || '-REM:' || AUX;
        END
    else
        if (NUMPED <> '') then
            BEGIN
            AUX = SUBSTR(NUMPED, 1, 15);
            conc = conc || '-ORDEN ' || AUX;
            END
    SELECT MAX(CEFA_TIPOORI) FROM consolide_faltantes WHERE CEFA_ID = :CONSOLIDA INTO :TIPO;
    if (Tipo is null) then
        Tipo = 0;
    execute procedure lee_configuracion('COMPRAS', 'FACTURAS', 'AFECTAR INVENTARIO CON LA FACTURA') returning_values (:INVFAC);
    execute procedure factor_unidad_cant(new.arti_cod, new.fcde_unidad) returning_values(factor);
    COSTO = ((new.fcde_prunit - NEW.fcde_dtomonto) / :factor);
    if (IVAINC = 'S') then
        BEGIN
        EXECUTE PROCEDURE lee_configuracion ('FACTURACION', 'ARTICULOS', 'IMPOCONSUMO INCLUIDO EN EL PRECIO BASE DE VENTA ANTES DE IVA') returning_values(:icoinc);
        if (icoinc = 'SI') then
            COSTO = COSTO - (NEW.fcde_consumo/(NEW.fcde_cant * new.fcde_factor));
        COSTO = COSTO / (1 + NEW.fcde_ivaporc/100);
        END
    EXECUTE PROCEDURE lee_configuracion('COMPRAS','FACTURAS','DESCUENTO Y VALOR ADICIONAL DEL DOCUMENTO COMO MENOR VALOR DEL COSTO') returning_values (:MENORV);
    if (MENORV = 'SI') then
        BEGIN
        if ((adicional = 0) and (dtopie <> 0)) then
            FACT = (100 - DTOPOR) / 100;
        ELSE
            BEGIN
            FACT = (TOTAL - EXTRA - IVAMONTO);
            if ((FACT - ADICIONAL + DTOPIE) <> 0) then
                FACT = FACT / (FACT - ADICIONAL + DTOPIE);
            ELSE
                FACT = 1;
            END
        COSTO = COSTO * FACT;
        END
    /* si se hizo con base en una remision no afecte inventario */
    if (INVFAC = 'SI') then
      if (Tipo <> 22) then
        begin
        INSERT INTO MOVIMIENTO_ARTICULO
          (ARTI_COD, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM, TERC_NIT)
          VALUES(NEW.ARTI_COD, NEW.BODE_COD, :FEC, 21, NEW.faco_id,
          :CONC, :factor * new.fcde_cant, :COSTO, 'S', new.fcde_lote, :Pref, :Num, NEW.fcde_item, :Nit);

        if (COSTO > 0 ) then
         BEGIN
          /* ACTUALICE EL COSTO POR PROVEEDOR */
          SELECT PVAR_FECHA FROM PROVEEDOR_ARTICULO
            WHERE TERC_NIT = :Nit AND ARTI_COD = NEW.ARTI_COD
            INTO :FECAUX;
          if (FECAUX IS NULL) then
            INSERT INTO PROVEEDOR_ARTICULO (TERC_NIT, ARTI_COD, PVAR_COSTO, PVAR_FECHA, PVAR_COD,PVAR_DES)
                VALUES (:Nit, NEW.ARTI_COD, :COSTO, :fec, NEW.fcde_codprov,NEW.fcde_desc);
          else
            UPDATE PROVEEDOR_ARTICULO
                SET PVAR_COSTO = :COSTO, PVAR_FECHA = :fec, PVAR_COD = NEW.fcde_codprov
                WHERE ARTI_COD = NEW.ARTI_COD AND TERC_NIT = :Nit;
         END
        /* RECORRA LAS LISTAS DE PRECIOS Y CAMBIE EL PRECIO */
        EXECUTE PROCEDURE CALCULA_PRECIOS(NEW.ARTI_COD, :FEC);
        END /* AFECTAR INV */
    EXECUTE PROCEDURE lee_configuracion('COMPRAS', 'FACTURAS', 'ACTUALIZAR COSTOS DE LA REMISION RELACIONADA AL GRABAR LA FACTURA') returning_values (:ACTREM);
    if ((ACTREM = 'SI') and (Tipo = 22)) then
        BEGIN
        numrows = 0;
        for select mvar_cons, MVAR_ITEM, MVAR_FECHA, MVAR_IDREF, MVAR_CANT, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO
            from movimiento_articulo M, consolidado_faltantes C
            where C.cofa_id = :CONSOLIDA AND mvar_tipodoc = 22 and mvar_idref = C.cofa_idori AND C.cofa_tipoori = 22 and m.arti_cod = new.arti_cod and m.mvar_item = c.cofa_itemori
            into :numrows, :iterem, :fecrem, :idrem, :cantrem, :loterem, :prefrem, :numrem
            do
            BEGIN
            /* inserte primero para evitar existencias negativas */
            IDMOV = GEN_ID(ID_MOVARTI,1);
            EXECUTE PROCEDURE lee_configuracion('COMPRAS', 'FACTURAS', 'ACTUALIZAR CANTIDADES DE LA REMISION RELACIONADA AL GRABAR LA FACTURA') returning_values (:ACTCAN);
            if (ACTCAN = 'SI') then
                CANTREM = NEW.fcde_cant * NEW.fcde_factor;
            INSERT INTO MOVIMIENTO_ARTICULO
                (ARTI_COD, MVAR_CONS, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM, TERC_NIT)
                VALUES(NEW.ARTI_COD, :IDMOV, NEW.BODE_COD, :fecrem, 22, :idrem,
                :CONC, :cantrem, :costo, 'S', :loterem, :prefrem, :numrem, :iterem, :Nit);
            DELETE FROM MOVIMIENTO_ARTICULO WHERE MVAR_CONS = :numrows;
            /* reponga el consecutivo para no afectar el orden del kardex */
            update MOVIMIENTO_ARTICULO set mvar_cons = :numrows WHERE MVAR_CONS = :idmov;
            update costos set cost_idmov = :numrows WHERE cost_idmov = :idmov AND arti_cod = new.arti_cod;

            if (COSTO > 0 ) then
                BEGIN
                /* ACTUALICE EL COSTO POR PROVEEDOR */
                SELECT PVAR_FECHA FROM PROVEEDOR_ARTICULO
                    WHERE TERC_NIT = :Nit AND ARTI_COD = NEW.ARTI_COD
                    INTO :FECAUX;
                if (FECAUX IS NULL) then
                    INSERT INTO PROVEEDOR_ARTICULO (TERC_NIT, ARTI_COD, PVAR_COSTO, PVAR_FECHA, PVAR_COD,PVAR_DES)
                        VALUES (:Nit, NEW.ARTI_COD, :COSTO, :fec, NEW.fcde_codprov,NEW.fcde_desc);
                else
                    UPDATE PROVEEDOR_ARTICULO
                        SET PVAR_COSTO = :COSTO, PVAR_FECHA = :fec, PVAR_COD = NEW.fcde_codprov
                        WHERE ARTI_COD = NEW.ARTI_COD AND TERC_NIT = :Nit;
                END
            /* RECORRA LAS LISTAS DE PRECIOS Y CAMBIE EL PRECIO */
            EXECUTE PROCEDURE CALCULA_PRECIOS(NEW.ARTI_COD, :FEC);
            END
        END

    /* ACTUALICE EL PENDIENTE  */
    if (CONSOLIDA <> 0) then
        BEGIN
        UPDATE consolidado_faltantes SET COFA_OK = 'S' WHERE COFA_ID = :consolida AND COFA_ITEM = NEW.FCDE_ITEM AND ARTI_COD = NEW.arti_cod;
        EXECUTE procedure LEE_CONFIGURACION ('COMPRAS','DOCUMENTOS','SUMAR CANTIDADES PENDIENTES AL CONSOLIDAR DOCUMENTOS') returning_values (CONSO);
        /* IGNORE LA CONSOLIDACION SI SE VALIDAN CODIGOS DE LA ORDEN */
        SELECT MIN(CEFA_TIPOORI) FROM consolide_faltantes WHERE CEFA_ID = :CONSOLIDA INTO :NUMROWS;
        if (NUMROWS = 23) then
            BEGIN
            EXECUTE PROCEDURE LEE_CONFIGURACION('COMPRAS', 'FACTURAS', 'VERIFICAR CODIGOS DE LA ORDEN') returning_values (MENORV);
            if (MENORV = 'SI') then
                CONSO = 'NO';
            END
        SELECT COUNT(CEFA_ITEM) FROM consolide_faltantes WHERE CEFA_ID = :CONSOLIDA INTO :NUMROWS;
        if ((CONSO = 'SI') AND (NUMROWS > 1)) then
            UPDATE consolidado_faltantes SET COFA_IDDES = NEW.faco_id, COFA_OK = 'S' WHERE COFA_ID = :consolida;
        else
            BEGIN
            /* BUSQUE EL CONSOLIDADO EN EL MISMO ITEM Y SI ES DIFERENTE ACTUALICELO */
            select COFA_CANT * COFA_FACTOR FROM consolidado_faltantes WHERE COFA_ID = :consolida AND COFA_ITEM = NEW.FCDE_ITEM AND ARTI_COD = NEW.arti_cod INTO :CANTREL;
            if (NEW.FCDE_CANT * NEW.FCDE_FACTOR < CANTREL) then
                UPDATE consolidado_faltantes SET COFA_IDDES = NEW.faco_id, COFA_CANT = NEW.FCDE_CANT, COFA_FACTOR = NEW.FCDE_FACTOR
                    WHERE COFA_ID = :consolida AND COFA_ITEM = NEW.FCDE_ITEM AND ARTI_COD = NEW.arti_cod;
            END
        END
    /* ACTUALICE EL STAND */
    if (new.fcde_stand is not null) then
      if (exists(select stand_cod from stands where arti_cod = new.arti_cod and stand_bodega = new.bode_cod)) then
        UPDATE stands set stand_cod = new.fcde_stand where arti_cod = new.arti_cod and stand_bodega = new.bode_cod;
      else
        INSERT INTO stands (ARTI_COD, STAND_BODEGA, STAND_COD) VALUES (NEW.arti_cod, NEW.bode_cod, NEW.fcde_stand);
    END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER FACTCOMP_DETALLE_AU FOR FACTURAS_COMPRAS_DETALLE
ACTIVE AFTER UPDATE POSITION 0
as
declare variable fec date;
declare variable fecaux date;
declare variable AUX varchar(90);
declare variable CONC VARCHAR(60);
declare variable Pref varchar(4);
declare variable Num varchar(6);
declare variable Nit varchar(20);
declare variable factor numeric(18,4);
declare variable TIPO INTEGER;
declare variable INVFAC CHAR(2);
declare variable IVAINC CHAR(2);
declare variable ICOINC CHAR(2);
declare variable COSTO NUMERIC(18,2);
declare variable CANTREL NUMERIC(18,4);
declare variable NUMPROV VARCHAR(10);
declare variable NUMPED VARCHAR(30);
declare variable NUMREM VARCHAR(30);
declare variable CONSO VARCHAR(2);
declare variable CONSOLIDA INTEGER;
declare variable NUMROWS INTEGER;
declare variable DTOPIE NUMERIC(18,2);
declare variable ADICIONAL NUMERIC(18,2);
declare variable TOTAL NUMERIC(18,2);
declare variable IVAMONTO NUMERIC(18,2);
declare variable EXTRA NUMERIC(18,2);
declare variable FACT NUMERIC(18,4);
declare variable MENORV CHAR(2);
declare variable ACTREM CHAR(2);
declare variable ACTCAN CHAR(2);
declare variable FECREM date;
declare variable IDREM INTEGER;
declare variable ITEREM INTEGER;
declare variable CANTREM NUMERIC(18,4);
declare variable LOTEREM VARCHAR(15);
declare variable PREFREM CHAR(4);
declare variable IDMOV INTEGER;
declare variable DTOPOR NUMERIC(18,4);
BEGIN
if (old.fcde_devuelto = new.fcde_devuelto) then
    begin
    /* deshaga lo viejo */
    if ((old.fcde_anulado = 'N') and (OLD.faco_id <> 0)) then
        begin
        select faco_fecha, faco_consolida from facturas_compra where faco_id = old.faco_id into :fec, :consolida;
        DELETE FROM MOVIMIENTO_ARTICULO WHERE (mvar_tipodoc = 21) and (mvar_idref = old.faco_id) and (mvar_item = old.fcde_item);
        /* RECORRA LAS LISTAS DE PRECIOS Y CAMBIE EL PRECIO */
        EXECUTE PROCEDURE CALCULA_PRECIOS(old.ARTI_COD, :FEC);
        /* LOS PENDIENTES */
        if (CONSOLIDA <> 0) then
            BEGIN
            UPDATE consolidado_faltantes SET COFA_OK = 'N' WHERE COFA_ID = :consolida AND COFA_ITEM = old.FCDE_ITEM AND ARTI_COD = old.arti_cod;
            SELECT COUNT(CEFA_ITEM) FROM consolide_faltantes WHERE CEFA_ID = :CONSOLIDA INTO :NUMROWS;
            EXECUTE procedure LEE_CONFIGURACION ('COMPRAS','DOCUMENTOS','SUMAR CANTIDADES PENDIENTES AL CONSOLIDAR DOCUMENTOS') returning_values (CONSO);
            /* IGNORE LA CONSOLIDACION SI SE VALIDAN CODIGOS DE LA ORDEN */
            SELECT MIN(CEFA_TIPOORI) FROM consolide_faltantes WHERE CEFA_ID = :CONSOLIDA INTO :NUMROWS;
            if (NUMROWS = 23) then
                BEGIN
                EXECUTE PROCEDURE LEE_CONFIGURACION('COMPRAS', 'FACTURAS', 'VERIFICAR CODIGOS DE LA ORDEN') returning_values (MENORV);
                if (MENORV = 'SI') then
                    CONSO = 'NO';
                END
            if (CONSO = 'SI') then
                UPDATE consolidado_faltantes SET COFA_OK = 'N' WHERE COFA_ID = :consolida;
            END
        end
    /* Registre el nuevo */
    if ((new.fcde_anulado = 'N') and (new.faco_id <> 0)) then
        BEGIN
        select faco_fecha, pref_pre, faco_numero, terc_nit, faco_imptos, faco_numprov, faco_remision, faco_orden,
            faco_consolida, faco_dtomonto, faco_adicional, faco_total, faco_ivamonto, faco_extra, FACO_DTOPORC
            from facturas_compra where faco_id = new.faco_id
            into :fec, :Pref, :Num, :Nit, :ivainc, :numprov, :numrem, :numped,
            :consolida, :dtopie, :adicional, :total, :ivamonto, :extra, :dtopor;
        conc = 'FACTURA DE COMPRA No.' || PREF || NUM || '-' || NUMPROV;
        if (NUMREM <> '') then
            BEGIN
            AUX = SUBSTR(NUMREM, 1, 15);
            conc = conc || '-REM:' || AUX;
            END
        else
            if (NUMPED <> '') then
                BEGIN
                AUX = SUBSTR(NUMPED, 1, 15);
                conc = conc || '-ORDEN ' || AUX;
                END
        SELECT MAX(CEFA_TIPOORI) FROM consolide_faltantes WHERE CEFA_ID = :CONSOLIDA INTO :TIPO;
        if (Tipo is null) then
            Tipo = 0;
        execute procedure lee_configuracion('COMPRAS', 'FACTURAS', 'AFECTAR INVENTARIO CON LA FACTURA') returning_values (:INVFAC);
        /* si se hizo con base en una remision no afecte inventario */
        if ((Tipo <> 22) and (INVFAC = 'SI')) then
            begin
            execute procedure factor_unidad_cant(new.arti_cod, new.fcde_unidad) returning_values(factor);
            COSTO = ((new.fcde_prunit - NEW.fcde_dtomonto) / :factor);
            if (IVAINC = 'S') then
                BEGIN
                EXECUTE PROCEDURE lee_configuracion ('FACTURACION', 'ARTICULOS', 'IMPOCONSUMO INCLUIDO EN EL PRECIO BASE DE VENTA ANTES DE IVA') returning_values(:icoinc);
                if (icoinc = 'SI') then
                    COSTO = COSTO - (NEW.fcde_consumo/(NEW.fcde_cant * new.fcde_factor));
                COSTO = COSTO / (1 + NEW.fcde_ivaporc/100);
                END
            EXECUTE PROCEDURE lee_configuracion('COMPRAS','FACTURAS','DESCUENTO Y VALOR ADICIONAL DEL DOCUMENTO COMO MENOR VALOR DEL COSTO') returning_values (:MENORV);
            if (MENORV = 'SI') then
                BEGIN
                if ((adicional = 0) and (dtopie <> 0)) then
                    FACT = (100 - DTOPOR) / 100;
                ELSE
                    BEGIN
                    FACT = (TOTAL - EXTRA - IVAMONTO);
                    if ((FACT - ADICIONAL + DTOPIE) <> 0) then
                        FACT = FACT / (FACT - ADICIONAL + DTOPIE);
                    ELSE
                        FACT = 1;
                    END
                COSTO = COSTO * FACT;
                END
            INSERT INTO MOVIMIENTO_ARTICULO
                (ARTI_COD, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM, TERC_NIT)
                VALUES(NEW.ARTI_COD, NEW.BODE_COD, :FEC, 21, NEW.faco_id,
                :CONC, :factor * new.fcde_cant, :COSTO, 'S', new.fcde_lote, :Pref, :Num, NEW.fcde_item, :Nit);
            if (COSTO > 0 ) then
             BEGIN
              /* ACTUALICE EL COSTO POR PROVEEDOR */
              SELECT PVAR_FECHA FROM PROVEEDOR_ARTICULO
                WHERE TERC_NIT = :Nit AND ARTI_COD = NEW.ARTI_COD INTO :FECAUX;
              if (FECAUX IS NULL) then
                INSERT INTO PROVEEDOR_ARTICULO (TERC_NIT, ARTI_COD, PVAR_COSTO, PVAR_FECHA, PVAR_COD,PVAR_DES)
                    VALUES (:Nit, NEW.ARTI_COD, :COSTO, :fec, NEW.fcde_codprov,NEW.fcde_desc);
              else
                UPDATE PROVEEDOR_ARTICULO
                    SET PVAR_COSTO = :COSTO, PVAR_FECHA = :fec, PVAR_COD = NEW.fcde_codprov
                    WHERE ARTI_COD = NEW.ARTI_COD AND TERC_NIT = :Nit;
             END
            /* RECORRA LAS LISTAS DE PRECIOS Y CAMBIE EL PRECIO */
            EXECUTE PROCEDURE CALCULA_PRECIOS(NEW.ARTI_COD, :FEC);
            end
        EXECUTE PROCEDURE lee_configuracion('COMPRAS', 'FACTURAS', 'ACTUALIZAR COSTOS DE LA REMISION RELACIONADA AL GRABAR LA FACTURA') returning_values (:ACTREM);
        if ((ACTREM = 'SI') and (Tipo = 22)) then
            BEGIN
            numrows = 0;
            for select mvar_cons, MVAR_ITEM, MVAR_FECHA, MVAR_IDREF, MVAR_CANT, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO
                from movimiento_articulo M, consolidado_faltantes C
                where C.cofa_id = :CONSOLIDA AND mvar_tipodoc = 22 and mvar_idref = C.cofa_idori AND C.cofa_tipoori = 22 and m.arti_cod = new.arti_cod
                into :numrows, :iterem, :fecrem, :idrem, :cantrem, :loterem, :prefrem, :numrem
                do
                BEGIN
                /* inserte primero para evitar existencias negativas */
                IDMOV = GEN_ID(ID_MOVARTI,1);
                EXECUTE PROCEDURE lee_configuracion('COMPRAS', 'FACTURAS', 'ACTUALIZAR CANTIDADES DE LA REMISION RELACIONADA AL GRABAR LA FACTURA') returning_values (:ACTCAN);
                if (ACTCAN = 'SI') then
                    CANTREM = NEW.fcde_cant * NEW.fcde_factor;
                INSERT INTO MOVIMIENTO_ARTICULO
                    (ARTI_COD, MVAR_CONS, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM, TERC_NIT)
                    VALUES(NEW.ARTI_COD, :IDMOV, NEW.BODE_COD, :fecrem, 22, :idrem,
                    :CONC, :cantrem, :costo, 'S', :loterem, :prefrem, :numrem, :iterem, :Nit);
                DELETE FROM MOVIMIENTO_ARTICULO WHERE MVAR_CONS = :numrows;
                /* reponga el consecutivo para no afectar el orden del kardex */
                update MOVIMIENTO_ARTICULO set mvar_cons = :numrows WHERE MVAR_CONS = :idmov;
                update costos set cost_idmov = :numrows WHERE cost_idmov = :idmov and arti_cod = new.arti_cod;

                if (COSTO > 0 ) then
                    BEGIN
                    /* ACTUALICE EL COSTO POR PROVEEDOR */
                    SELECT PVAR_FECHA FROM PROVEEDOR_ARTICULO
                        WHERE TERC_NIT = :Nit AND ARTI_COD = NEW.ARTI_COD
                        INTO :FECAUX;
                    if (FECAUX IS NULL) then
                        INSERT INTO PROVEEDOR_ARTICULO (TERC_NIT, ARTI_COD, PVAR_COSTO, PVAR_FECHA, PVAR_COD,PVAR_DES)
                            VALUES (:Nit, NEW.ARTI_COD, :COSTO, :fec, NEW.fcde_codprov,NEW.fcde_desc);
                    else
                        UPDATE PROVEEDOR_ARTICULO
                            SET PVAR_COSTO = :COSTO, PVAR_FECHA = :fec, PVAR_COD = NEW.fcde_codprov
                            WHERE ARTI_COD = NEW.ARTI_COD AND TERC_NIT = :Nit;
                    END
                /* RECORRA LAS LISTAS DE PRECIOS Y CAMBIE EL PRECIO */
                EXECUTE PROCEDURE CALCULA_PRECIOS(NEW.ARTI_COD, :FEC);
                END
            END

        if (CONSOLIDA <> 0) then
            begin
            UPDATE consolidado_faltantes SET COFA_OK = 'S' WHERE COFA_ID = :consolida AND COFA_ITEM = NEW.FCDE_ITEM AND ARTI_COD = NEW.arti_cod;
            EXECUTE procedure LEE_CONFIGURACION ('COMPRAS','DOCUMENTOS','SUMAR CANTIDADES PENDIENTES AL CONSOLIDAR DOCUMENTOS') returning_values (CONSO);
            /* IGNORE LA CONSOLIDACION SI SE VALIDAN CODIGOS DE LA ORDEN */
            SELECT MIN(CEFA_TIPOORI) FROM consolide_faltantes WHERE CEFA_ID = :CONSOLIDA INTO :NUMROWS;
            if (NUMROWS = 23) then
                BEGIN
                EXECUTE PROCEDURE LEE_CONFIGURACION('COMPRAS', 'FACTURAS', 'VERIFICAR CODIGOS DE LA ORDEN') returning_values (MENORV);
                if (MENORV = 'SI') then
                    CONSO = 'NO';
                END
            SELECT COUNT(CEFA_ITEM) FROM consolide_faltantes WHERE CEFA_ID = :CONSOLIDA INTO :NUMROWS;
            if ((CONSO = 'SI') AND (NUMROWS > 1)) then
                UPDATE consolidado_faltantes SET COFA_IDDES = NEW.faco_id, COFA_OK = 'S' WHERE COFA_ID = :consolida;
            else
                BEGIN
                /* BUSQUE EL CONSOLIDADO EN EL MISMO ITEM Y SI ES DIFERENTE ACTUALICELO */
                select COFA_CANT * COFA_FACTOR FROM consolidado_faltantes WHERE COFA_ID = :consolida AND COFA_ITEM = NEW.FCDE_ITEM AND ARTI_COD = NEW.arti_cod INTO :CANTREL;
                if (NEW.FCDE_CANT * NEW.FCDE_FACTOR < CANTREL) then
                    UPDATE consolidado_faltantes SET COFA_IDDES = NEW.faco_id, COFA_CANT = NEW.FCDE_CANT, COFA_FACTOR = NEW.FCDE_FACTOR
                        WHERE COFA_ID = :consolida AND COFA_ITEM = NEW.FCDE_ITEM AND ARTI_COD = NEW.arti_cod;
                END
            end
        /* ACTUALICE EL STAND */
        if (new.fcde_stand is not null) then
          if (exists(select stand_cod from stands where arti_cod = new.arti_cod and stand_bodega = new.bode_cod)) then
            UPDATE stands set stand_cod = new.fcde_stand where arti_cod = new.arti_cod and stand_bodega = new.bode_cod;
          else
            INSERT INTO stands (ARTI_COD, STAND_BODEGA, STAND_COD) VALUES (NEW.arti_cod, NEW.bode_cod, NEW.fcde_stand);
        END
    end
END
^

SET TERM ; ^


/* 20101125D */
SET TERM ^ ;

CREATE OR ALTER procedure PUNTOS_VENDEDOR_FECHAS (
    VENDI integer,
    VENDF integer,
    FECINI date,
    FECFIN date)
returns (
    CODVEN integer,
    NOMVEN varchar(60),
    GRUPO VARCHAR(60),
    FECDOC date,
    CLIENTE varchar(60),
    NUMDOC varchar(10),
    MONDOC numeric(18,2),
    FECREC date,
    NUMREC varchar(10),
    MONREC numeric(18,2),
    COMI char(2),
    DB numeric(18,2),
    CR numeric(18,2))
AS
declare variable TIPO INTEGER;
declare variable ID INTEGER;
begin
FOR SELECT VEND_COD, PTVT_FECHA, PTVT_TIPODOC, PTVT_IDDOC, PTVT_DB, PTVT_CR FROM puntos_vendedor
    WHERE PTVT_FECHA >= :FECINI AND PTVT_FECHA <= :FECFIN AND VEND_COD >= :VENDI AND VEND_COD <= :VENDF
    ORDER BY VEND_COD, PTVT_FECHA, PTVT_TIPODOC, PTVT_IDDOC
    INTO :CODVEN, :FECDOC, :tipo, :id, :db, :cr
    DO
    BEGIN
    SELECT VEND_NOMBRE, VEND_GRUPO FROM VENDEDORES WHERE VEND_COD = :codven INTO :nomven, :GRUPO;

    if (TIPO = 31) then
        SELECT PREF_PRE || FACT_NUMERO, FACT_TOTAL, fact_nomcliente FROM FACTURAS WHERE FACT_ID = :ID INTO :numdoc, :mondoc, :CLIENTE;
    if (TIPO = 33) then
        SELECT PREF_PRE || DEVT_NUMERO, DEVT_TOTAL, DEVT_NOMTERC FROM devoluciones_ventas WHERE DEVT_ID = :ID INTO :numdoc, :mondoc, :CLIENTE;
    if (TIPO = 41) then
        SELECT PREF_PRE || NDCL_NUMERO, NDCL_MONTO, NDCL_CONC FROM notas_debito_clientes WHERE NDCL_ID = :ID INTO :numdoc, :mondoc, :CLIENTE;
    if (TIPO = 42) then
        SELECT PREF_PRE || NCCL_NUMERO, NCCL_MONTO, NCCL_CONC FROM notas_credito_clientes WHERE NCCL_ID = :ID INTO :numdoc, :mondoc, :CLIENTE;

    SELECT MAX(PREF_PRE || RECA_NUMERO), MAX(RECA_FECHA), SUM(RCDE_ABONO), MAX(RCDE_COMIP) FROM RECIBOS_CAJA R, RECIBOS_CAJA_DETALLE D
        WHERE R.reca_id = D.reca_id AND RECA_FECHA = :FECDOC AND D.rcde_tipodoc = :TIPO AND D.rcde_iddoc = :id
        INTO :numrec, :fecrec, :monrec, :comi;
    suspend;
    END
end
^

SET TERM ; ^

/* 20101128 */
/* STRING TRUNCATION SI DEVREM = PEDIDO */
SET TERM ^ ;

CREATE OR ALTER TRIGGER DEVOLUCIONES_VENTAS_DETALLE_AI FOR DEVOLUCIONES_VENTAS_DETALLE
ACTIVE AFTER INSERT POSITION 0
AS
declare variable fec date;
declare variable fecfac date;
declare variable CONC VARCHAR(60);
declare variable factor numeric(18,4);
declare variable Pref varchar(4);
declare variable Num varchar(6);
declare variable Nit varchar(20);
declare variable ID INTEGER;
declare variable ITEM INTEGER;
declare variable DEVUELTO NUMERIC(18,4);
declare variable CANT NUMERIC(18, 4);
declare variable CANTAUX NUMERIC(18, 4);
declare variable CNTFAC NUMERIC(18, 4);
declare variable FACT VARCHAR(10);
declare variable COSTO NUMERIC(18,2);
declare variable ULTIMO NUMERIC(18,2);
declare variable devnof CHAR(2);
declare variable numrows INTEGER;
declare variable OK CHAR(1);
declare variable PEDAUTO CHAR(2);
declare variable IDPED INTEGER;
declare variable IDREM INTEGER;
declare variable devrem CHAR(6);
declare variable EXIST CHAR(1);
BEGIN
execute procedure lee_configuracion ('FACTURACION', 'DEVOLUCIONES', 'HACER DEVOLUCIONES SOBRE REMISIONES') returning_values (:devrem);
if ((NEW.devt_id <> 0) and (new.dvde_anulado = 'N')) then
    BEGIN
    ID = 0;
    select devt_fecha, pref_pre, devt_numero, terc_nit, devt_factura, devt_remid, DEVT_FACTID , devt_pedid
        from devoluciones_ventas where devt_id = new.devt_id into :fec, :Pref, :Num, :Nit, :Fact, :idrem, :ID, :idped;
    execute procedure factor_unidad_cant(new.arti_cod, new.dvde_unidad) returning_values(factor);
    CONC = 'DEVOLUCION VENTA No.' || PREF || NUM || ' - FACTURA ' || FACT;
    /* si la factura afecto el inventario, afectelo */
    execute procedure lee_configuracion ('FACTURACION', 'DEVOLUCIONES', 'PERMITIR DEVOLVER ITEMS NO FACTURADOS') returning_values (:devnof);
    if (devnof = 'SI') then
        OK = 'S';
    else
        BEGIN
        if (id <> 0) then
            begin
            SELECT SUM(FADE_CANT * FADE_FACTOR) FROM FACTURAS_DETALLE WHERE FACT_ID = :ID AND ARTI_COD = NEW.arti_cod INTO :cntfac;
            /* verifique si afecto el inventario */
            select count(mvar_cons) from movimiento_articulo where mvar_tipodoc = 31 and mvar_idref = :id and arti_cod = new.arti_cod into :numrows;
            if (numrows > 0) then
                OK = 'S';
            else
                BEGIN
                /* busque remisiones que pudieron afectarlo */
                /* primero posteriores a la factura */
                select sum(cofa_cant * cofa_factor) from consolidado_faltantes where cofa_tipoori = 31 and cofa_idori = :id and cofa_tipodes = 32 and arti_cod = new.arti_cod and cofa_ok = 'S' into :cantaux;
                if ((cantaux <> 0) and (cantaux is not null)) then
                    BEGIN
                    if ((CNTFAC - (NEW.dvde_cant * NEW.dvde_factor)) <> CANTAUX) then
                        OK = 'S';
                    ELSE
                        OK = 'N';
                    END
                else
                    begin
                    /* si no, anteriores a la factura */
                    select sum(cofa_cant * cofa_factor) from consolidado_faltantes C, FACTURAS f where f.fact_consolida = c.cofa_id and cofa_tipoori = 32 and f.fact_id = :id and cofa_tipodes = 31 and arti_cod = new.arti_cod and cofa_ok = 'S' into :cantaux;
                    if ((cantaux <> 0) and (cantaux is not null)) then
                        OK = 'S';
                    else
                        BEGIN
                        /* si hacen pedido automatico, puede que la remisión este hecha con el pedido */
                        EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION','FACTURAS','GENERAR PEDIDO AUTOMATICAMENTE CON LA FACTURA') RETURNING_VALUES (PEDAUTO);
                        if (PEDAUTO = 'SI') then
                            BEGIN
                            SELECT PEDI_ID FROM PEDIDOS P, FACTURAS F WHERE P.PREF_PRE = F.pref_pre AND P.pedi_numero = F.fact_numero AND F.fact_id = :id INTO :IDped;
                            select sum(cofa_cant * cofa_factor) from consolidado_faltantes where cofa_tipoori = 34 and cofa_idori = :idped and cofa_tipodes = 32 and arti_cod = new.arti_cod and cofa_ok = 'S' into :cantaux;
                            if ((cantaux <> 0) and (cantaux is not null)) then
                                if ((CNTFAC - (NEW.dvde_cant * NEW.dvde_factor)) <> CANTAUX) then
                                    OK = 'S';
                                else
                                    OK = 'N';
                            else
                                OK = 'N';
                            END
                        ELSE
                            OK = 'N';
                        END
                    end
                END
            end
        else
          if ((idrem <> 0) and (devrem = 'SI')) then
            begin
            /* verifique si afecto el inventario */
            select count(mvar_cons) from movimiento_articulo where mvar_tipodoc = 32 and mvar_idref = :idrem and arti_cod = new.arti_cod into :numrows;
            if (numrows > 0) then
                OK = 'S';
            else
                OK = 'N';
            end
        END
    if (OK = 'S') then
        begin
        /* calcule el costo al que salio o el promedio */
        execute procedure costo_promedio(new.arti_cod, :FEC) returning_values (:COSTO);
        if (COSTO = 0) then
            BEGIN
            if (id <> 0) then
                begin
                SELECT FACT_FECHA FROM FACTURAS WHERE FACT_ID = :ID INTO :fecfac;
                execute procedure costo_promedio_y_ultimo(new.arti_cod, :FECFAC) returning_values (:COSTO, :ULTIMO);
                if (COSTO = 0) then
                    COSTO = ULTIMO;
                end
            if (idrem <> 0) then
                begin
                SELECT REVT_FECHA FROM remisiones_venta WHERE REVT_ID = :ID INTO :fecfac;
                execute procedure costo_promedio_y_ultimo(new.arti_cod, :FECFAC) returning_values (:COSTO, :ULTIMO);
                if (COSTO = 0) then
                    COSTO = ULTIMO;
                end
            END

        INSERT INTO MOVIMIENTO_ARTICULO
            (ARTI_COD, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF,
            MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM, TERC_NIT)
            VALUES(NEW.ARTI_COD, NEW.BODE_COD, :FEC, 33, NEW.devt_id,
            :CONC, :factor * new.dvde_cant, :COSTO, 'S', new.dvde_lote, :Pref, :Num, new.dvde_item, :Nit);
        end
    /* ACTUALICE LO DEVUELTO EN LA FACTURA */
    select ARTI_EXIST from ARTICULO where ARTI_COD = new.ARTI_COD into :EXIST;
    if (ID <> 0) then
        BEGIN
        CANTAUX = NEW.dvde_cant * NEW.dvde_factor;
        if (EXIST <> 'L') then
            begin
            FOR SELECT FADE_ITEM, FADE_CANT, FADE_FACTOR, FADE_DEVUELTO
                FROM FACTURAS_DETALLE
                WHERE FACT_ID = :ID AND ARTI_COD = NEW.ARTI_COD
                INTO :ITEM, :CANT, :FACTOR, :DEVUELTO
                DO
                BEGIN
                if ((CANTAUX > 0) and ((CANT * FACTOR) > 0))then
                    if ((CANT * FACTOR - DEVUELTO) < CANTAUX) then
                      BEGIN
                      UPDATE FACTURAS_DETALLE
                        SET FADE_DEVUELTO = (:CANT * :FACTOR)
                        WHERE FACT_ID = :ID AND FADE_ITEM = :ITEM AND ARTI_COD = NEW.ARTI_COD;
                      CANTAUX = CANTAUX - (CANT * FACTOR - DEVUELTO);
                      END
                    ELSE
                      BEGIN
                      UPDATE FACTURAS_DETALLE
                        SET FADE_DEVUELTO = FADE_DEVUELTO + :CANTAUX
                        WHERE FACT_ID = :ID AND FADE_ITEM = :ITEM AND ARTI_COD = NEW.ARTI_COD;
                      CANTAUX = 0;
                      END
                END
            end
        else
            begin
            FOR SELECT FADE_ITEM, FADE_CANT, FADE_FACTOR, FADE_DEVUELTO
                FROM FACTURAS_DETALLE
                WHERE FACT_ID = :ID AND ARTI_COD = NEW.ARTI_COD AND BODE_COD = NEW.bode_cod AND FADE_LOTE = NEW.dvde_lote
                INTO :ITEM, :CANT, :FACTOR, :DEVUELTO
                DO
                BEGIN
                if ((CANTAUX > 0) and ((CANT * FACTOR) > 0))then
                    if ((CANT * FACTOR - DEVUELTO) < CANTAUX) then
                      BEGIN
                      UPDATE FACTURAS_DETALLE
                        SET FADE_DEVUELTO = (:CANT * :FACTOR)
                        WHERE FACT_ID = :ID AND FADE_ITEM = :ITEM AND ARTI_COD = NEW.ARTI_COD;
                      CANTAUX = CANTAUX - (CANT * FACTOR - DEVUELTO);
                      END
                    ELSE
                      BEGIN
                      UPDATE FACTURAS_DETALLE
                        SET FADE_DEVUELTO = FADE_DEVUELTO + :CANTAUX
                        WHERE FACT_ID = :ID AND FADE_ITEM = :ITEM AND ARTI_COD = NEW.ARTI_COD;
                      CANTAUX = 0;
                      END
                END
            end
        if (CANTAUX > 0) then
            EXCEPTION DEVOLUCION_MAYOR 'Esta devolviendo una cantidad mayor a la facturada del articulo ' || new.arti_cod;
        END
    if ((idrem <> 0) and (devrem = 'SI')) then
        BEGIN
        CANTAUX = NEW.dvde_cant * NEW.dvde_factor;
        if (EXIST <> 'L') then
            begin
            FOR SELECT RVDE_ITEM, RVDE_CANT, RVDE_FACTOR, RVDE_DEVUELTO
                FROM remisiones_venta_detalle
                WHERE REVT_ID = :idrem AND ARTI_COD = NEW.ARTI_COD
                INTO :ITEM, :CANT, :FACTOR, :DEVUELTO
                DO
                BEGIN
                if (CANTAUX > 0) then
                    if ((CANT * FACTOR - DEVUELTO) < CANTAUX) then
                      BEGIN
                      UPDATE remisiones_venta_detalle
                        SET RVDE_DEVUELTO = (:CANT * :FACTOR)
                        WHERE REVT_ID = :IDREM AND RVDE_ITEM = :ITEM AND ARTI_COD = NEW.ARTI_COD;
                      CANTAUX = CANTAUX - (CANT * FACTOR - DEVUELTO);
                      END
                    ELSE
                      BEGIN
                      UPDATE remisiones_venta_detalle
                        SET RVDE_DEVUELTO = RVDE_DEVUELTO + :CANTAUX
                        WHERE REVT_ID = :IDREM AND RVDE_ITEM = :ITEM AND ARTI_COD = NEW.ARTI_COD;
                      CANTAUX = 0;
                      END
                END
            end
        else
            begin
            FOR SELECT RVDE_ITEM, RVDE_CANT, RVDE_FACTOR, RVDE_DEVUELTO
                FROM remisiones_venta_detalle
                WHERE REVT_ID = :idrem AND ARTI_COD = NEW.ARTI_COD AND BODE_COD = NEW.bode_cod AND RVDE_LOTE = NEW.dvde_lote
                INTO :ITEM, :CANT, :FACTOR, :DEVUELTO
                DO
                BEGIN
                if (CANTAUX > 0) then
                    if ((CANT * FACTOR - DEVUELTO) < CANTAUX) then
                      BEGIN
                      UPDATE remisiones_venta_detalle
                        SET RVDE_DEVUELTO = (:CANT * :FACTOR)
                        WHERE REVT_ID = :IDREM AND RVDE_ITEM = :ITEM AND ARTI_COD = NEW.ARTI_COD;
                      CANTAUX = CANTAUX - (CANT * FACTOR - DEVUELTO);
                      END
                    ELSE
                      BEGIN
                      UPDATE remisiones_venta_detalle
                        SET RVDE_DEVUELTO = RVDE_DEVUELTO + :CANTAUX
                        WHERE REVT_ID = :IDREM AND RVDE_ITEM = :ITEM AND ARTI_COD = NEW.ARTI_COD;
                      CANTAUX = 0;
                      END
                END
            end
        if (CANTAUX > 0) then
            EXCEPTION DEVOLUCION_MAYOR 'Esta devolviendo una cantidad mayor a la remisionada del articulo ' || new.arti_cod;
        END
    if ((idped <> 0) and (devrem = 'PEDIDO')) then
        BEGIN
        CANTAUX = NEW.dvde_cant * NEW.dvde_factor;
        FOR SELECT PEDE_ITEM, PEDE_CANT, PEDE_FACTOR, PEDE_DEVUELTO
            FROM pedidos_detalle
            WHERE PEDI_ID = :idped AND ARTI_COD = NEW.ARTI_COD
            INTO :ITEM, :CANT, :FACTOR, :DEVUELTO
            DO
                BEGIN
                if (CANTAUX > 0) then
                    if ((CANT * FACTOR - DEVUELTO) < CANTAUX) then
                      BEGIN
                      UPDATE pedidos_detalle
                        SET PEDE_DEVUELTO = (:CANT * :FACTOR)
                        WHERE PEDI_ID = :IDPED AND PEDE_ITEM = :ITEM AND ARTI_COD = NEW.ARTI_COD;
                      CANTAUX = CANTAUX - (CANT * FACTOR - DEVUELTO);
                      END
                    ELSE
                      BEGIN
                      UPDATE pedidos_detalle
                        SET PEDE_DEVUELTO = PEDE_DEVUELTO + :CANTAUX
                        WHERE PEDI_ID = :IDPED AND PEDE_ITEM = :ITEM AND ARTI_COD = NEW.ARTI_COD;
                      CANTAUX = 0;
                      END
                END
        if (CANTAUX > 0) then
            EXCEPTION DEVOLUCION_MAYOR 'Esta devolviendo una cantidad mayor a la pedido del articulo ' || new.arti_cod;
        END
    END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER DEVOLUCIONES_VENTAS_DETALLE_AU FOR DEVOLUCIONES_VENTAS_DETALLE
ACTIVE AFTER UPDATE POSITION 0
AS
declare variable fec date;
declare variable fecfac date;
declare variable CONC VARCHAR(60);
declare variable Pref varchar(4);
declare variable Num varchar(6);
declare variable Nit varchar(20);
declare variable CANT NUMERIC(18, 4);
declare variable CANTAUX NUMERIC(18,4);
declare variable CNTFAC NUMERIC(18, 4);
declare variable COSTO NUMERIC(18,2);
declare variable ULTIMO NUMERIC(18,2);
declare variable factor numeric(18,4);
declare variable DEVUELTO NUMERIC(18,4);
declare variable ID integer;
declare variable ITEM INTEGER;
declare variable FACT varchar(10);
declare variable devnof CHAR(2);
declare variable numrows INTEGER;
declare variable OK CHAR(1);
declare variable PEDAUTO CHAR(2);
declare variable IDPED INTEGER;
declare variable IDREM INTEGER;
declare variable devrem CHAR(6);
declare variable EXIST CHAR(1);
BEGIN
execute procedure lee_configuracion ('FACTURACION', 'DEVOLUCIONES', 'HACER DEVOLUCIONES SOBRE REMISIONES') returning_values (:devrem);
/* Anule el anterior */
if ((OLD.DEVT_ID <> 0) AND (OLD.dvde_anulado = 'N')) then
    BEGIN
    select ARTI_EXIST from ARTICULO where ARTI_COD = old.ARTI_COD into :EXIST;
    DELETE FROM MOVIMIENTO_ARTICULO WHERE (mvar_tipodoc = 33) and (mvar_idref = new.devt_id) and (mvar_item = old.dvde_item);
    /* DESHAGA LO DEVUELTO EN LA FACTURA */
    ID = 0;
    SELECT DEVT_FACTID FROM DEVOLUCIONES_VENTAS
        WHERE DEVT_ID = OLD.DEVT_ID INTO :ID;
    if (ID <> 0) then
        BEGIN
        CANTAUX = OLD.dvde_cant * OLD.dvde_factor;
        if (EXIST <> 'L') then
            begin
            FOR SELECT FADE_CANT, FADE_FACTOR, FADE_DEVUELTO, FADE_ITEM
                FROM FACTURAS_DETALLE
                WHERE FACT_ID = :ID AND ARTI_COD = OLD.ARTI_COD AND FADE_CANT > 0
                INTO :CANT, :FACTOR, :DEVUELTO, :ITEM
                DO
                BEGIN
                if (cantaux > 0) then
                    if (CANTAUX > DEVUELTO) then
                        BEGIN
                        UPDATE FACTURAS_DETALLE
                            SET FADE_DEVUELTO = 0
                            WHERE FACT_ID = :ID AND ARTI_COD = OLD.ARTI_COD AND FADE_ITEM = :ITEM;
                        CANTAUX = CANTAUX - DEVUELTO;
                        END
                    ELSE
                        BEGIN
                        UPDATE FACTURAS_DETALLE
                            SET FADE_DEVUELTO = FADE_DEVUELTO - :CANTAUX
                            WHERE FACT_ID = :ID AND ARTI_COD = OLD.ARTI_COD AND FADE_ITEM = :ITEM;
                        CANTAUX = 0;
                        END
                END
            end
        else
            begin
            FOR SELECT FADE_CANT, FADE_FACTOR, FADE_DEVUELTO, FADE_ITEM
                FROM FACTURAS_DETALLE
                WHERE FACT_ID = :ID AND ARTI_COD = OLD.ARTI_COD AND FADE_CANT > 0 and BODE_COD = old.bode_cod AND FADE_LOTE = OLD.dvde_lote
                INTO :CANT, :FACTOR, :DEVUELTO, :ITEM
                DO
                BEGIN
                if (cantaux > 0) then
                    if (CANTAUX > DEVUELTO) then
                        BEGIN
                        UPDATE FACTURAS_DETALLE
                            SET FADE_DEVUELTO = 0
                            WHERE FACT_ID = :ID AND ARTI_COD = OLD.ARTI_COD AND FADE_ITEM = :ITEM;
                        CANTAUX = CANTAUX - DEVUELTO;
                        END
                    ELSE
                        BEGIN
                        UPDATE FACTURAS_DETALLE
                            SET FADE_DEVUELTO = FADE_DEVUELTO - :CANTAUX
                            WHERE FACT_ID = :ID AND ARTI_COD = OLD.ARTI_COD AND FADE_ITEM = :ITEM;
                        CANTAUX = 0;
                        END
                END
            end
        END
    if (devrem = 'SI') then
        begin
        idrem = 0;
        SELECT DEVT_REMID FROM DEVOLUCIONES_VENTAS
            WHERE DEVT_ID = OLD.DEVT_ID INTO :idrem;
        if (idrem <> 0) then
            BEGIN
            CANTAUX = OLD.dvde_cant * OLD.dvde_factor;
            if (EXIST <> 'L') then
                begin
                FOR SELECT RVDE_CANT, RVDE_FACTOR, RVDE_DEVUELTO, RVDE_ITEM
                    FROM remisiones_venta_detalle
                    WHERE REVT_ID = :idrem AND ARTI_COD = OLD.ARTI_COD
                    INTO :CANT, :FACTOR, :DEVUELTO, :ITEM
                    DO
                    BEGIN
                    if (cantaux > 0) then
                        if (CANTAUX > DEVUELTO) then
                            BEGIN
                            UPDATE remisiones_venta_detalle
                                SET RVDE_DEVUELTO = 0
                                WHERE REVT_ID = :idrem AND ARTI_COD = OLD.ARTI_COD AND RVDE_ITEM = :ITEM;
                            CANTAUX = CANTAUX - DEVUELTO;
                            END
                        ELSE
                            BEGIN
                            UPDATE remisiones_venta_detalle
                                SET RVDE_DEVUELTO = RVDE_DEVUELTO - :CANTAUX
                                WHERE REVT_ID = :idrem AND ARTI_COD = OLD.ARTI_COD AND RVDE_ITEM = :ITEM;
                            CANTAUX = 0;
                            END
                        END
                end
            else
                begin
                FOR SELECT RVDE_CANT, RVDE_FACTOR, RVDE_DEVUELTO, RVDE_ITEM
                    FROM remisiones_venta_detalle
                    WHERE REVT_ID = :idrem AND ARTI_COD = OLD.ARTI_COD and BODE_COD = OLD.bode_cod AND RVDE_LOTE = OLD.dvde_lote
                    INTO :CANT, :FACTOR, :DEVUELTO, :ITEM
                    DO
                    BEGIN
                    if (cantaux > 0) then
                        if (CANTAUX > DEVUELTO) then
                            BEGIN
                            UPDATE remisiones_venta_detalle
                                SET RVDE_DEVUELTO = 0
                                WHERE REVT_ID = :idrem AND ARTI_COD = OLD.ARTI_COD AND RVDE_ITEM = :ITEM;
                            CANTAUX = CANTAUX - DEVUELTO;
                            END
                        ELSE
                            BEGIN
                            UPDATE remisiones_venta_detalle
                                SET RVDE_DEVUELTO = RVDE_DEVUELTO - :CANTAUX
                                WHERE REVT_ID = :idrem AND ARTI_COD = OLD.ARTI_COD AND RVDE_ITEM = :ITEM;
                            CANTAUX = 0;
                            END
                        END
                end
            END
        end
    if (devrem = 'PEDIDO') then
        begin
        idped = 0;
        SELECT DEVT_PEDID FROM DEVOLUCIONES_VENTAS
            WHERE DEVT_ID = OLD.DEVT_ID INTO :idped;
        if (idped <> 0) then
            BEGIN
            CANTAUX = OLD.dvde_cant * OLD.dvde_factor;
            FOR SELECT PEDE_CANT, PEDE_FACTOR, PEDE_DEVUELTO, PEDE_ITEM
                FROM pedidos_detalle
                WHERE PEDI_ID = :idped AND ARTI_COD = OLD.ARTI_COD
                INTO :CANT, :FACTOR, :DEVUELTO, :ITEM
                DO
                BEGIN
                if (cantaux > 0) then
                    if (CANTAUX > DEVUELTO) then
                        BEGIN
                        UPDATE pedidos_detalle
                            SET PEDE_DEVUELTO = 0
                            WHERE PEDI_ID = :idped AND ARTI_COD = OLD.ARTI_COD AND PEDE_ITEM = :ITEM;
                        CANTAUX = CANTAUX - DEVUELTO;
                        END
                    ELSE
                        BEGIN
                        UPDATE pedidos_detalle
                            SET PEDE_DEVUELTO = PEDE_DEVUELTO - :CANTAUX
                            WHERE PEDI_ID = :idped AND ARTI_COD = OLD.ARTI_COD AND PEDE_ITEM = :ITEM;
                        CANTAUX = 0;
                        END
                    END
            END
        end
    END
/* Registre el nuevo */
if ((NEW.DEVT_ID <> 0) AND (NEW.dvde_anulado = 'N')) then
    begin
    ID = 0;
    select ARTI_EXIST from ARTICULO where ARTI_COD = NEW.ARTI_COD into :EXIST;
    select devt_fecha, pref_pre, devt_numero, terc_nit, devt_factura, devt_remid, DEVT_FACTID, DEVT_PEDID
        from devoluciones_ventas where devt_id = new.devt_id into :fec, :Pref, :Num, :Nit, :Fact, :idrem, :ID, :idped;
    execute procedure factor_unidad_cant(new.arti_cod, new.dvde_unidad) returning_values(factor);
    CONC = 'DEVOLUCION VENTA No.' || PREF || NUM || '- FACTURA ' || FACT;
    execute procedure lee_configuracion ('FACTURACION', 'DEVOLUCIONES', 'PERMITIR DEVOLVER ITEMS NO FACTURADOS') returning_values (:devnof);
    if (devnof = 'SI') then
        OK = 'S';
    else
        if (id <> 0) then
            begin
            SELECT SUM(FADE_CANT * FADE_FACTOR) FROM FACTURAS_DETALLE WHERE FACT_ID = :ID AND ARTI_COD = NEW.arti_cod INTO :cntfac;
            /* verifique si afecto el inventario */
            select count(mvar_cons) from movimiento_articulo where mvar_tipodoc = 31 and mvar_idref = :id and arti_cod = new.arti_cod into :numrows;
            if (numrows > 0) then
                OK = 'S';
            else
                BEGIN
                /* busque remisiones que pudieron afectarlo */
                /* primero posteriores a la factura */
                select sum(cofa_cant * cofa_factor) from consolidado_faltantes where cofa_tipoori = 31 and cofa_idori = :id and cofa_tipodes = 32 and arti_cod = new.arti_cod and cofa_ok = 'S' into :cantaux;
                if ((cantaux <> 0) and (cantaux is not null)) then
                    BEGIN
                    if ((CNTFAC - (NEW.dvde_cant * NEW.dvde_factor)) <> CANTAUX) then
                        OK = 'S';
                    ELSE
                        OK = 'N';
                    END
                else
                    begin
                    /* si no, anteriores a la factura */
                    select sum(cofa_cant * cofa_factor) from consolidado_faltantes C, FACTURAS f where f.fact_consolida = c.cofa_id and cofa_tipoori = 32 and f.fact_id = :id and cofa_tipodes = 31 and arti_cod = new.arti_cod and cofa_ok = 'S' into :cantaux;
                    if ((cantaux <> 0) and (cantaux is not null)) then
                        OK = 'S';
                    else
                        BEGIN
                        /* si hacen pedido automatico, puede que la remisión este hecha con el pedido */
                        EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION','FACTURAS','GENERAR PEDIDO AUTOMATICAMENTE CON LA FACTURA') RETURNING_VALUES (PEDAUTO);
                        if (PEDAUTO = 'SI') then
                            BEGIN
                            SELECT PEDI_ID FROM PEDIDOS P, FACTURAS F WHERE P.PREF_PRE = F.pref_pre AND P.pedi_numero = F.fact_numero AND F.fact_id = :id INTO :IDped;
                            select sum(cofa_cant * cofa_factor) from consolidado_faltantes where cofa_tipoori = 34 and cofa_idori = :idped and cofa_tipodes = 32 and arti_cod = new.arti_cod and cofa_ok = 'S' into :cantaux;
                            if ((cantaux <> 0) and (cantaux is not null)) then
                                if ((CNTFAC - (NEW.dvde_cant * NEW.dvde_factor)) <> CANTAUX) then
                                    OK = 'S';
                                else
                                    OK = 'N';
                            else
                                OK = 'N';
                            END
                        ELSE
                            OK = 'N';
                        END
                    end
                END
            end
        else
          if ((idrem <> 0) and (devrem = 'SI')) then
            begin
            /* verifique si afecto el inventario */
            select count(mvar_cons) from movimiento_articulo where mvar_tipodoc = 32 and mvar_idref = :idrem and arti_cod = new.arti_cod into :numrows;
            if (numrows > 0) then
                OK = 'S';
            else
                OK = 'N';
            end
    if (OK = 'S') then
        begin
        execute procedure costo_promedio(new.arti_cod, :FEC) returning_values (:COSTO);
        if (COSTO = 0) then
            BEGIN
            if (id <> 0) then
                begin
                SELECT FACT_FECHA FROM FACTURAS WHERE FACT_ID = :ID INTO :fecfac;
                execute procedure costo_promedio_y_ultimo(new.arti_cod, :FECFAC) returning_values (:COSTO, :ULTIMO);
                if (COSTO = 0) then
                    COSTO = ULTIMO;
                end
            if (idrem <> 0) then
                begin
                SELECT REVT_FECHA FROM remisiones_venta WHERE REVT_ID = :ID INTO :fecfac;
                execute procedure costo_promedio_y_ultimo(new.arti_cod, :FECFAC) returning_values (:COSTO, :ULTIMO);
                if (COSTO = 0) then
                    COSTO = ULTIMO;
                end
            END
        INSERT INTO MOVIMIENTO_ARTICULO
            (ARTI_COD, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF,
            MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM, TERC_NIT)
            VALUES(NEW.ARTI_COD, NEW.BODE_COD, :FEC, 33, NEW.devt_id,
            :CONC, :factor * new.dvde_cant, :COSTO, 'S', new.dvde_lote, :Pref, :Num, new.dvde_item, :Nit);
        end
    /* ACTUALICE LO DEVUELTO EN LA FACTURA */
    if (ID <> 0) then
        BEGIN
        CANTAUX = NEW.dvde_cant * NEW.dvde_factor;
        if (EXIST <> 'L') then
            begin
            FOR SELECT FADE_ITEM, FADE_CANT, FADE_FACTOR, FADE_DEVUELTO
                FROM FACTURAS_DETALLE
                WHERE FACT_ID = :ID AND ARTI_COD = NEW.ARTI_COD
                INTO :ITEM, :CANT, :FACTOR, :DEVUELTO
                DO
                BEGIN
                if ((CANTAUX > 0) and ((CANT * FACTOR) > 0))then
                    if ((CANT * FACTOR - DEVUELTO) < CANTAUX) then
                        BEGIN
                        UPDATE FACTURAS_DETALLE
                            SET FADE_DEVUELTO = (:CANT * :FACTOR - :DEVUELTO)
                            WHERE FACT_ID = :ID AND FADE_ITEM = :ITEM AND ARTI_COD = NEW.ARTI_COD;
                        CANTAUX = CANTAUX - (CANT * FACTOR - DEVUELTO);
                        END
                    ELSE
                        BEGIN
                        UPDATE FACTURAS_DETALLE
                            SET FADE_DEVUELTO = FADE_DEVUELTO + :CANTAUX
                            WHERE FACT_ID = :ID AND FADE_ITEM = :ITEM AND ARTI_COD = NEW.ARTI_COD;
                        CANTAUX = 0;
                        END
                END
            end
        else
            begin
            FOR SELECT FADE_ITEM, FADE_CANT, FADE_FACTOR, FADE_DEVUELTO
                FROM FACTURAS_DETALLE
                WHERE FACT_ID = :ID AND ARTI_COD = NEW.ARTI_COD AND BODE_COD = NEW.bode_cod AND FADE_LOTE = NEW.dvde_lote
                INTO :ITEM, :CANT, :FACTOR, :DEVUELTO
                DO
                BEGIN
                if ((CANTAUX > 0) and ((CANT * FACTOR) > 0))then
                    if ((CANT * FACTOR - DEVUELTO) < CANTAUX) then
                        BEGIN
                        UPDATE FACTURAS_DETALLE
                            SET FADE_DEVUELTO = (:CANT * :FACTOR - :DEVUELTO)
                            WHERE FACT_ID = :ID AND FADE_ITEM = :ITEM AND ARTI_COD = NEW.ARTI_COD;
                        CANTAUX = CANTAUX - (CANT * FACTOR - DEVUELTO);
                        END
                    ELSE
                        BEGIN
                        UPDATE FACTURAS_DETALLE
                            SET FADE_DEVUELTO = FADE_DEVUELTO + :CANTAUX
                            WHERE FACT_ID = :ID AND FADE_ITEM = :ITEM AND ARTI_COD = NEW.ARTI_COD;
                        CANTAUX = 0;
                        END
                END
            end
        if (CANTAUX > 0) then
            EXCEPTION DEVOLUCION_MAYOR 'Esta devolviendo una cantidad mayor a la facturada del articulo ' || new.arti_cod;
        END
    if ((idrem <> 0) and (devrem = 'SI')) then
        BEGIN
        CANTAUX = NEW.dvde_cant * NEW.dvde_factor;
        if (EXIST <> 'L') then
            begin
            FOR SELECT RVDE_ITEM, RVDE_CANT, RVDE_FACTOR, RVDE_DEVUELTO
                FROM remisiones_venta_detalle
                WHERE REVT_ID = :idrem AND ARTI_COD = NEW.ARTI_COD
                INTO :ITEM, :CANT, :FACTOR, :DEVUELTO
                DO
                BEGIN
                if (CANTAUX > 0) then
                    if ((CANT * FACTOR - DEVUELTO) < CANTAUX) then
                      BEGIN
                      UPDATE remisiones_venta_detalle
                        SET RVDE_DEVUELTO = (:CANT * :FACTOR - :DEVUELTO)
                        WHERE REVT_ID = :ID AND RVDE_ITEM = :ITEM AND ARTI_COD = NEW.ARTI_COD;
                      CANTAUX = CANTAUX - (CANT * FACTOR - DEVUELTO);
                      END
                    ELSE
                      BEGIN
                      UPDATE remisiones_venta_detalle
                        SET RVDE_DEVUELTO = RVDE_DEVUELTO + :CANTAUX
                        WHERE REVT_ID = :ID AND RVDE_ITEM = :ITEM AND ARTI_COD = NEW.ARTI_COD;
                      CANTAUX = 0;
                      END
                END
            end
        else
            begin
            FOR SELECT RVDE_ITEM, RVDE_CANT, RVDE_FACTOR, RVDE_DEVUELTO
                FROM remisiones_venta_detalle
                WHERE REVT_ID = :idrem AND ARTI_COD = NEW.ARTI_COD and BODE_COD = NEW.bode_cod AND RVDE_LOTE = NEW.dvde_lote
                INTO :ITEM, :CANT, :FACTOR, :DEVUELTO
                DO
                BEGIN
                if (CANTAUX > 0) then
                    if ((CANT * FACTOR - DEVUELTO) < CANTAUX) then
                      BEGIN
                      UPDATE remisiones_venta_detalle
                        SET RVDE_DEVUELTO = (:CANT * :FACTOR - :DEVUELTO)
                        WHERE REVT_ID = :ID AND RVDE_ITEM = :ITEM AND ARTI_COD = NEW.ARTI_COD;
                      CANTAUX = CANTAUX - (CANT * FACTOR - DEVUELTO);
                      END
                    ELSE
                      BEGIN
                      UPDATE remisiones_venta_detalle
                        SET RVDE_DEVUELTO = RVDE_DEVUELTO + :CANTAUX
                        WHERE REVT_ID = :ID AND RVDE_ITEM = :ITEM AND ARTI_COD = NEW.ARTI_COD;
                      CANTAUX = 0;
                      END
                END
            end
        if (CANTAUX > 0) then
            EXCEPTION DEVOLUCION_MAYOR 'Esta devolviendo una cantidad mayor a la remisionada del articulo ' || new.arti_cod;
        END
    if ((idped <> 0) and (devrem = 'PEDIDO')) then
        BEGIN
        CANTAUX = NEW.dvde_cant * NEW.dvde_factor;
        FOR SELECT PEDE_ITEM, PEDE_CANT, PEDE_FACTOR, PEDE_DEVUELTO
            FROM pedidos_detalle
            WHERE PEDI_ID = :idped AND ARTI_COD = NEW.ARTI_COD
            INTO :ITEM, :CANT, :FACTOR, :DEVUELTO
            DO
                BEGIN
                if (CANTAUX > 0) then
                    if ((CANT * FACTOR - DEVUELTO) < CANTAUX) then
                      BEGIN
                      UPDATE pedidos_detalle
                        SET PEDE_DEVUELTO = (:CANT * :FACTOR - :DEVUELTO)
                        WHERE PEDI_ID = :ID AND PEDE_ITEM = :ITEM AND ARTI_COD = NEW.ARTI_COD;
                      CANTAUX = CANTAUX - (CANT * FACTOR - DEVUELTO);
                      END
                    ELSE
                      BEGIN
                      UPDATE pedidos_detalle
                        SET PEDE_DEVUELTO = PEDE_DEVUELTO + :CANTAUX
                        WHERE PEDI_ID = :ID AND PEDE_ITEM = :ITEM AND ARTI_COD = NEW.ARTI_COD;
                      CANTAUX = 0;
                      END
                END
        if (CANTAUX > 0) then
            EXCEPTION DEVOLUCION_MAYOR 'Esta devolviendo una cantidad mayor a la pedida del articulo ' || new.arti_cod;
        END
    END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER DEVOLUCIONES_VENTAS_DETALLE_AD FOR DEVOLUCIONES_VENTAS_DETALLE
ACTIVE AFTER DELETE POSITION 0
AS
declare variable ID INTEGER;
declare variable ITEM INTEGER;
declare variable CANTAUX NUMERIC(18, 4);
declare variable CANT NUMERIC(18, 4);
declare variable FACTOR NUMERIC(18, 4);
declare variable DEVUELTO NUMERIC(18, 4);
declare variable IDREM INTEGER;
declare variable IDPED INTEGER;
declare variable devrem CHAR(6);
declare variable EXIST CHAR(1);
begin
execute procedure lee_configuracion ('FACTURACION', 'DEVOLUCIONES', 'HACER DEVOLUCIONES SOBRE REMISIONES') returning_values (:devrem);
if ((OLD.devt_id <> 0) AND (OLD.dvde_anulado = 'N')) then
    BEGIN
    select ARTI_EXIST from ARTICULO where ARTI_COD = old.ARTI_COD into :EXIST;
    delete from movimiento_articulo
      where (mvar_tipodoc = 33) and (mvar_idref = old.devt_id) and (mvar_item = old.dvde_item);
  
    /* DESHAGA LO DEVUELTO EN LA FACTURA */
    SELECT DEVT_FACTID FROM DEVOLUCIONES_VENTAS
        WHERE DEVT_ID = OLD.DEVT_ID INTO :ID;
    if (ID <> 0) then
        BEGIN
        CANTAUX = OLD.dvde_cant * OLD.dvde_factor;
        if (EXIST <> 'L') then
            begin
            FOR SELECT FADE_CANT, FADE_FACTOR, FADE_DEVUELTO, FADE_ITEM
                FROM FACTURAS_DETALLE
                WHERE FACT_ID = :ID AND ARTI_COD = OLD.ARTI_COD
                INTO :CANT, :FACTOR, :DEVUELTO, :ITEM
                DO
                BEGIN
                if (CANTAUX > 0) then
                  if (CANTAUX > DEVUELTO) then
                    BEGIN
                    UPDATE FACTURAS_DETALLE
                        SET FADE_DEVUELTO = 0
                        WHERE FACT_ID = :ID AND ARTI_COD = OLD.ARTI_COD AND FADE_ITEM = :ITEM;
                    CANTAUX = CANTAUX - DEVUELTO;
                    END
                  ELSE
                    BEGIN
                    UPDATE FACTURAS_DETALLE
                        SET FADE_DEVUELTO = FADE_DEVUELTO - :CANTAUX
                        WHERE FACT_ID = :ID AND ARTI_COD = OLD.ARTI_COD AND FADE_ITEM = :ITEM;
                    CANTAUX = 0;
                    END
                END
            end
        else
            begin
            FOR SELECT FADE_CANT, FADE_FACTOR, FADE_DEVUELTO, FADE_ITEM
                FROM FACTURAS_DETALLE
                WHERE FACT_ID = :ID AND ARTI_COD = OLD.ARTI_COD AND BODE_COD = OLD.bode_cod AND FADE_LOTE = OLD.dvde_lote
                INTO :CANT, :FACTOR, :DEVUELTO, :ITEM
                DO
                BEGIN
                if (CANTAUX > 0) then
                  if (CANTAUX > DEVUELTO) then
                    BEGIN
                    UPDATE FACTURAS_DETALLE
                        SET FADE_DEVUELTO = 0
                        WHERE FACT_ID = :ID AND ARTI_COD = OLD.ARTI_COD AND FADE_ITEM = :ITEM;
                    CANTAUX = CANTAUX - DEVUELTO;
                    END
                  ELSE
                    BEGIN
                    UPDATE FACTURAS_DETALLE
                        SET FADE_DEVUELTO = FADE_DEVUELTO - :CANTAUX
                        WHERE FACT_ID = :ID AND ARTI_COD = OLD.ARTI_COD AND FADE_ITEM = :ITEM;
                    CANTAUX = 0;
                    END
                END
            end
        END
    if (devrem = 'SI') then
        begin
        idrem = 0;
        SELECT DEVT_REMID FROM DEVOLUCIONES_VENTAS
            WHERE DEVT_ID = OLD.DEVT_ID INTO :idrem;
        if (idrem <> 0) then
            BEGIN
            CANTAUX = OLD.dvde_cant * OLD.dvde_factor;
            if (EXIST <> 'L') then
                begin
                FOR SELECT RVDE_CANT, RVDE_FACTOR, RVDE_DEVUELTO, RVDE_ITEM
                    FROM remisiones_venta_detalle
                    WHERE REVT_ID = :idrem AND ARTI_COD = OLD.ARTI_COD
                    INTO :CANT, :FACTOR, :DEVUELTO, :ITEM
                    DO
                    BEGIN
                    if (CANTAUX > 0) then
                        if (CANTAUX > DEVUELTO) then
                            BEGIN
                            UPDATE remisiones_venta_detalle
                                SET RVDE_DEVUELTO = 0
                                WHERE REVT_ID = :idrem AND ARTI_COD = OLD.ARTI_COD AND RVDE_ITEM = :ITEM;
                            CANTAUX = CANTAUX - DEVUELTO;
                            END
                        ELSE
                            BEGIN
                            UPDATE remisiones_venta_detalle
                                SET RVDE_DEVUELTO = RVDE_DEVUELTO - :CANTAUX
                                WHERE REVT_ID = :idrem AND ARTI_COD = OLD.ARTI_COD AND RVDE_ITEM = :ITEM;
                            CANTAUX = 0;
                            END
                    END
                end
            else
                begin
                FOR SELECT RVDE_CANT, RVDE_FACTOR, RVDE_DEVUELTO, RVDE_ITEM
                    FROM remisiones_venta_detalle
                    WHERE REVT_ID = :idrem AND ARTI_COD = OLD.ARTI_COD AND BODE_COD = OLD.bode_cod AND RVDE_LOTE = OLD.dvde_lote
                    INTO :CANT, :FACTOR, :DEVUELTO, :ITEM
                    DO
                    BEGIN
                    if (CANTAUX > 0) then
                        if (CANTAUX > DEVUELTO) then
                            BEGIN
                            UPDATE remisiones_venta_detalle
                                SET RVDE_DEVUELTO = 0
                                WHERE REVT_ID = :idrem AND ARTI_COD = OLD.ARTI_COD AND RVDE_ITEM = :ITEM;
                            CANTAUX = CANTAUX - DEVUELTO;
                            END
                        ELSE
                            BEGIN
                            UPDATE remisiones_venta_detalle
                                SET RVDE_DEVUELTO = RVDE_DEVUELTO - :CANTAUX
                                WHERE REVT_ID = :idrem AND ARTI_COD = OLD.ARTI_COD AND RVDE_ITEM = :ITEM;
                            CANTAUX = 0;
                            END
                    END
                end
            END
        end
    if (devrem = 'PEDIDO') then
        begin
        idrem = 0;
        SELECT DEVT_PEDID FROM DEVOLUCIONES_VENTAS
            WHERE DEVT_ID = OLD.DEVT_ID INTO :idped;
        if (idped <> 0) then
            BEGIN
            CANTAUX = OLD.dvde_cant * OLD.dvde_factor;
            FOR SELECT PEDE_CANT, PEDE_FACTOR, PEDE_DEVUELTO, PEDE_ITEM
                FROM pedidos_detalle
                WHERE PEDI_ID = :idped AND ARTI_COD = OLD.ARTI_COD
                INTO :CANT, :FACTOR, :DEVUELTO, :ITEM
                DO
                BEGIN
                if (CANTAUX > 0) then
                    if (CANTAUX > DEVUELTO) then
                        BEGIN
                        UPDATE pedidos_detalle
                            SET PEDE_DEVUELTO = 0
                            WHERE PEDI_ID = :idped AND ARTI_COD = OLD.ARTI_COD AND PEDE_ITEM = :ITEM;
                        CANTAUX = CANTAUX - DEVUELTO;
                        END
                    ELSE
                        BEGIN
                        UPDATE pedidos_detalle
                            SET PEDE_DEVUELTO = PEDE_DEVUELTO - :CANTAUX
                            WHERE PEDI_ID = :idped AND ARTI_COD = OLD.ARTI_COD AND PEDE_ITEM = :ITEM;
                        CANTAUX = 0;
                        END
                END
            END
        end
    END
END
^

SET TERM ; ^


/* 20101201 */
/* ULTIMA FECHA TRAIA LA PRIMERA Y NO LA ULTIMA FALTABA EL ORDER DESC */
SET TERM ^ ;

CREATE OR ALTER procedure EXISTENCIAS_BAJO_MINIMO (
    FECHA date,
    ARTINI varchar(20),
    ARTFIN varchar(20),
    GRPINI varchar(2),
    GRPFIN varchar(2),
    ORDEN char(1))
returns (
    CODIGO varchar(15),
    NOMBRE varchar(60),
    CANT numeric(18,4),
    UNIDAD varchar(8),
    CODGRUPO varchar(2),
    NOMGRUPO varchar(30),
    CODSUBG varchar(3),
    NOMSUBG varchar(30),
    CODMARC varchar(3),
    NOMMARC varchar(30),
    CODBOD varchar(2),
    NOMBOD varchar(30),
    STAND varchar(20),
    MINIMO numeric(18,4),
    FALTANTE numeric(18,4),
    ULTCOSTO numeric(18,2),
    FECHACOSTO date)
AS
declare variable CODINI VARCHAR(20);
declare variable CODFIN VARCHAR(20);
declare variable DESINI VARCHAR(20);
declare variable DESFIN VARCHAR(20);
declare variable PORART VARCHAR(8);
declare variable MAXDIA VARCHAR(2);
declare variable DISPONIBILIDAD integer;
declare variable PROMEDIO numeric(18,4);
declare variable SALIDAS numeric(18,4);
BEGIN
if (ORDEN = 'C') then
    BEGIN
    CODINI = ARTINI;
    CODFIN = ARTFIN;
    DESINI = '';
    DESFIN = 'zz';
    END
ELSE
    BEGIN
    DESINI = ARTINI;
    DESFIN = ARTFIN;
    CODINI = '';
    CODFIN = 'zz';
    END
execute procedure lee_configuracion ('INVENTARIO', 'EXISTENCIAS', 'MAXIMO Y MINIMO POR STAND O POR ARTICULO') returning_values (:porart);
execute procedure lee_configuracion ('INVENTARIO', 'EXISTENCIAS', 'MINIMO INVENTARIO EN DIAS') returning_values (:maxdia);

FOR SELECT ARTI_COD, ARTI_DES, ARTI_UNIDAD, A.GRUP_COD, A.SUBG_COD, A.MARC_COD, BODE_COD, BODE_NOM, ARTI_MIN
      FROM ARTICULO A, BODEGA B
      WHERE ARTI_COD >= :CODINI AND ARTI_COD <= :CODFIN AND A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :GRPFIN AND ARTI_DES >= :DESINI AND ARTI_DES <= :DESFIN
      INTO :CODIGO, :NOMBRE, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :CODBOD, :NOMBOD, :MINIMO
      DO
        BEGIN
        SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
        SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
        SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
        if (PORART = 'STAND') then
            BEGIN
            minimo = 0;
            SELECT STAND_MIN, :STAND FROM STANDS WHERE ARTI_COD = :CODIGO AND STAND_BODEGA = :codbod INTO :minimo, :STAND;
            END
        ELSE
            SELECT STAND_COD FROM STANDS WHERE ARTI_COD = :CODIGO AND STAND_BODEGA = :codbod INTO :STAND;

        if (maxdia = 'SI') then
            begin
            EXECUTE PROCEDURE DISPONIBILIDAD_ARTICULO(CODIGO, FECHA, :CODBOD) returning_values (:DISPONIBILIDAD, :CANT, :PROMEDIO, :SALIDAS);
            if ((DISPONIBILIDAD < minimo) and (PROMEDIO > 0))then
                begin
                FALTANTE = (minimo * PROMEDIO) - cant;
                SUSPEND;
                end
            end
        else
            begin
            EXECUTE PROCEDURE SALDO_INVENTARIO(CODIGO, :CODBOD, FECHA) returning_values (CANT);
            if (CANT < MINIMO) then
                BEGIN
                EXECUTE PROCEDURE ULTIMO_COSTO(CODIGO, FECHA, UNIDAD) returning_values (ULTCOSTO);
                SELECT FIRST 1 MVAR_FECHA FROM MOVIMIENTO_ARTICULO WHERE ARTI_COD = :CODIGO AND
                    MVAR_ENTRADA = 'S' AND MVAR_FECHA <= :FECHA ORDER BY MVAR_FECHA DESC INTO :FECHACOSTO;
                FALTANTE = MINIMO - CANT;
                SUSPEND;
                END
            end
        END
END
^

SET TERM ; ^


/* 20101202 */

INSERT INTO CONFIGURACION (CONF_MODULO, CONF_CATEGORIA, CONF_PROPIEDAD, CONF_VALOR, CONF_POSIBLES, CONF_AYUDA) VALUES ('CARTERA', 'GENERAL', 'SEPARAR CARTERA POR AGENCIA', 'SI', 'SI,NO', 'SI:Cada agencia muestra su cartera por separado. NO: Todas las agencias pueden ver la cartera completa');

SET TERM ^ ;

CREATE OR ALTER procedure CARTERA_CLIENTE (
    NIT varchar(20),
    FECHA date,
    SUCURSAL varchar(10),
    MONEDA integer,
    SOLOPESOS char(1),
    AGENCIA integer)
returns (
    TIPO integer,
    ID integer,
    PREFIJO varchar(4),
    NUMERO varchar(6),
    CONCEPTO varchar(60),
    SALDO numeric(18,2),
    RTFTE numeric(18,2),
    RTIVA numeric(18,2),
    RTICA numeric(18,2),
    DTOF numeric(18,2),
    TIPONOM varchar(8),
    VENCE date,
    FECDOC date,
    DIAS integer,
    RECPROV_ID integer,
    RECIPROV char(1),
    NOTA varchar(256),
    TRMDOC numeric(18,2))
AS
declare variable FEC DATE;
declare variable DESC_RTES CHAR(2);
declare variable DTOAPL NUMERIC(18,2);
declare variable TRMREC NUMERIC(18,2);
declare variable IDNOTA INTEGER;
declare variable AUTORET VARCHAR(10);
declare variable FAUTORET DATE;
declare variable DIASCONT INTEGER;
declare variable CARTXAGE CHAR(2);
BEGIN
EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'FECHA AUTORETENEDOR NO DESCONTAR RETENCIONES DEL SALDO PERO SI CONTABILIZARLAS') returning_values (AUTORET);
if (AUTORET <> '') then
    FAUTORET = CAST(AUTORET AS DATE);
else
    FAUTORET = '9999/12/31';
EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'NUMERO DE DIAS PARA CONSULTA DE CARTERA DE CLIENTES DE CONTADO') returning_values (:diascont);

EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'GENERAL', 'SEPARAR CARTERA POR AGENCIA') returning_values (:cartxage);
if (CARTXAGE = 'NO') then
    AGENCIA = 0;
if ((DIASCONT <> 0) AND (NOT EXISTS (select ptvt_id from punto_venta where terc_nit = :nit))) then
    DIASCONT = 0;
EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'DESCONTAR RETENCIONES POR CAUSACION') returning_values (DESC_RTES);
  /* BUSQUE EN SALDOS_DOC_CARTERA LOS QUE TENGAN SALDO > 0 */
  FOR SELECT MVCL_TIPOREF, MVCL_IDREF, MVCL_FECHA, MVCL_VENCE, MVCL_PREFREF, MVCL_NUMREF, MVCL_CONC, MVCL_TRM
  FROM MOVIMIENTO_CLIENTES
  WHERE TERC_NIT = :NIT AND mvcl_sucursal = :sucursal and MVCL_FECHA <= :FECHA AND MVCL_ABONO = 'N' AND
    ((:MONEDA = 0) or (MVCL_TRM <> 1)) AND ((MVCL_FECHA >= (:FECHA - :DIASCONT)) or (:DIASCONT = 0)) AND
    ((:AGENCIA = 0) or (SUCU_ID = :AGENCIA) or (SUCU_ID = 0))
  INTO :TIPO, :ID, :FECDOC, :VENCE, :PREFIJO, :NUMERO, :CONCEPTO, :TRMDOC
    DO
    BEGIN
    DIAS = (FECHA -VENCE );
    EXECUTE PROCEDURE saldo_doc_cartera(TIPO, ID, FECHA, MONEDA) returning_values (SALDO);
    if (SALDO <> 0) then
        BEGIN
        SELECT TIDO_NOMCORTO FROM TIPO_DOCUMENTO WHERE TIDO_COD = :TIPO INTO :TIPONOM;
        if (TIPO = 41) then
            SELECT NDCL_DTOFMONTO, NDCL_FECHADTO FROM NOTAS_DEBITO_CLIENTES WHERE NDCL_ID = :ID INTO :DTOF, :FEC;
        if (TIPO = 42) then
            SELECT 0, NCCL_FECHA FROM NOTAS_CREDITO_CLIENTES WHERE NCCL_ID = :ID INTO :DTOF, :FEC;
        if (TIPO = 45) then
            SELECT ANCL_DTOFMONTO, ANCL_DTOFECHA FROM ANTICIPOS_CLIENTE WHERE ANCL_ID = :ID INTO :DTOF, :FEC;
        if (TIPO = 31) then
            SELECT FACT_DTOFMONTO, FACT_DTOFFECHA FROM FACTURAS WHERE FACT_ID = :ID INTO :DTOF, :FEC;
        if (TIPO = 33) then
            SELECT 0, :FECHA FROM devoluciones_ventas WHERE DEVT_ID = :ID INTO :DTOF, :FEC;
        if ((MONEDA <> 0) AND (TRMDOC <> 0)) then
            DTOF = DTOF / TRMDOC;

        /* POR WILLIAM IDENTIFICAR SI EL DOCUMENTO TIENE RECIBO PROVISIONAL*/
        recprov_id = 0;
        SELECT max(RCPR_ID) FROM recibo_provisional_detalle WHERE RPDE_IDDOC = :ID AND RPDE_TIPODOC = :TIPO and RPDE_ANULADO = 'N' INTO :recprov_id;
        if /*(recprov_id = 0) or */(recprov_id is null) then
           BEGIN
           reciprov = 'N';
           end 
        ELSE
          begin 
           reciprov = 'S';
          END
        /*FIN WILLIAM*/
        if (FECHA > FEC) then
            DTOF = 0;
        if (DTOF IS NULL) then
            DTOF = 0;
        if (DTOF <> 0) then
            BEGIN
            SELECT SUM(RCDE_DTOF), MAX(RECA_TRM) FROM RECIBOS_CAJA_DETALLE D, RECIBOS_CAJA R
                WHERE R.reca_id = D.reca_id AND RCDE_IDDOC = :ID AND RCDE_TIPODOC = :TIPO
                INTO :DTOAPL, :TRMREC;
            if (DTOAPL IS NULL) then
                DTOAPL = 0;
            if ((MONEDA <> 0) AND (TRMREC <> 0)) then
                DTOAPL = DTOAPL / TRMREC;
            DTOF = DTOF - DTOAPL;
            END
        if (MONEDA = 0) then
            SELECT SUM(SDCA_RTFTE - SDCA_ABRTFTE), SUM(SDCA_RTIVA - SDCA_ABRTIVA), SUM(SDCA_RTICA - SDCA_ABRTICA)
                FROM SALDOS_DOC_CARTERA WHERE SDCA_TIPOREF = :TIPO AND SDCA_IDREF = :ID
                INTO :RTFTE, :RTIVA, :RTICA;
        ELSE
            SELECT SUM((SDCA_RTFTE - SDCA_ABRTFTE)/SDCA_TRM), SUM((SDCA_RTIVA - SDCA_ABRTIVA)/SDCA_TRM), SUM((SDCA_RTICA - SDCA_ABRTICA)/SDCA_TRM)
                FROM SALDOS_DOC_CARTERA WHERE SDCA_TIPOREF = :TIPO AND SDCA_IDREF = :ID
                INTO :RTFTE, :RTIVA, :RTICA;
        if (RTFTE IS NULL) then
            RTFTE = 0;
        if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) THEN
            BEGIN
            if (RTFTE > 0) then
                RTFTE = 0;
            END
        ELSE
            BEGIN
            if (RTFTE < 0) then
                RTFTE = 0;
            END

        if (RTIVA IS NULL) then
            RTIVA = 0;
        if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) THEN
            BEGIN
            if (RTIVA > 0) then
                RTIVA = 0;
            END
        ELSE
            BEGIN
            if (RTIVA < 0) then
                RTIVA = 0;
            END

        if (RTICA IS NULL) then
            RTICA = 0;
        if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) THEN
            BEGIN
            if (RTICA > 0) then
                RTICA = 0;
            END
        ELSE
            BEGIN
            if (RTICA < 0) then
                RTICA = 0;
            END

        if (FAUTORET <= FECDOC) then
            BEGIN
            RTFTE = 0;
            RTIVA = 0;
            RTICA = 0;
            END
        /* RESTE LAS RETENCIONES YA QUE SE SUGERIRAN */
        if (DESC_RTES = 'NO') then
            SALDO = SALDO - RTFTE - RTIVA - RTICA;
        /* SI TIENE NOTA AGREGUELA */
        SELECT MAX(NOCL_ID) FROM NOTAS_CLIENTES WHERE TERC_NIT = :NIT AND CLSU_COD = :SUCURSAL AND NOCL_TIPODOC = :TIPO AND NOCL_IDDOC = :ID INTO :IDNOTA;
        if (IDNOTA IS NOT NULL) then
            SELECT NOCL_TEXTO FROM NOTAS_CLIENTES WHERE NOCL_ID = :IDNOTA INTO :NOTA;
        else
            NOTA = '';
        if ((SOLOPESOS = 'N') or (TRMDOC = 1)) then
            SUSPEND;
        END
    END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure MOVIMIENTO_CARTERA_MES (
    FECINI date,
    FECFIN date,
    SUBEMPRESA integer,
    CONTADO char(1),
    MONEDA integer)
returns (
    NIT varchar(20),
    NOMBRE varchar(60),
    ZONA varchar(2),
    VENDEDOR integer,
    COBRADOR integer,
    CONTACTO varchar(60),
    DIASMAX integer,
    TELEFONO varchar(40),
    INICIAL numeric(18,2),
    DEBITOS numeric(18,2),
    CREDITOS numeric(18,2),
    ABONOS numeric(18,2),
    FINAL numeric(18,2))
AS
declare variable RETES CHAR(2);
declare variable TIPODOC INTEGER;
declare variable IDDOC INTEGER;
declare variable SALDO NUMERIC(18,2);
declare variable NUMROWS INTEGER;
declare variable DIASF INTEGER;
declare variable DIAS INTEGER;
DECLARE VARIABLE FOV CHAR(11);
declare variable AUTORET VARCHAR(10);
declare variable FAUTORET DATE;
declare variable CARTXAGE CHAR(2);
BEGIN
EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'FECHA AUTORETENEDOR NO DESCONTAR RETENCIONES DEL SALDO PERO SI CONTABILIZARLAS') returning_values (AUTORET);
EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'ANALISIS DE CARTERA CON FECHA FACTURA O VENCIMIENTO') RETURNING_VALUES (FOV);
if (AUTORET <> '') then
    FAUTORET = CAST(AUTORET AS DATE);
else
    FAUTORET = '9999/12/31';
EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'GENERAL', 'SEPARAR CARTERA POR AGENCIA') returning_values (:cartxage);
if (CARTXAGE = 'NO') then
    subempresa = 0;
for select T.TERC_NIT, TERC_NOM, TERC_CONTACTO, TERC_TEL, ZONA_COD, VEND_COD, COBR_COD
    from TERCEROS T, CLIENTES C WHERE T.terc_nit = C.terc_nit AND TERC_CLIE = 'S'
    into :NIT, :NOMBRE, :CONTACTO, :TELEFONO, :zona, :vendedor, :cobrador
  DO
    BEGIN
    diasmax = 0;
    SELECT COUNT(*) FROM AUTORIZACIONES WHERE AUTO_NITCONTADO = :NIT INTO :numrows;
    IF ((CONTADO = 'S') or (numrows = 0)) THEN
        BEGIN
        FECINI = FECINI - 1;
        INICIAL = 0;
        FOR SELECT MVCL_TIPOREF, MVCL_IDREF, (:FECFIN-MVCL_FECHA), (:FECFIN-MVCL_VENCE) FROM MOVIMIENTO_CLIENTES
            WHERE TERC_NIT = :NIT AND MVCL_FECHA <= :FECINI AND
            MVCL_ABONO = 'N' AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA)) AND
            ((:moneda = 0) or (MVCL_TRM <> 1))
            INTO :TIPODOC, :IDDOC, :DIASF, DIAS
            DO
            BEGIN
            EXECUTE PROCEDURE saldo_doc_cartera(TIPODOC, IDDOC, FECINI, MONEDA) returning_values (SALDO);
            if (SALDO <> 0) then
                BEGIN
                INICIAL = INICIAL + SALDO;
                if (FOV = 'FECHA') then
                    BEGIN
                    if ((SALDO > 0) AND (DIASMAX < DIASF)) then
                        DIASMAX = DIASF;
                    END
                ELSE
                    BEGIN
                    if ((SALDO > 0) AND (DIASMAX < DIAS)) then
                        DIASMAX = DIAS;
                    END
                END
            END
        EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'DESCONTAR RETENCIONES POR CAUSACION') returning_values(:RETES);
        FECINI = FECINI + 1;
        if (RETES = 'SI') then
            BEGIN
            if (MONEDA = 0) then
                BEGIN
                if (FAUTORET <= FECINI) then
                    begin
                    SELECT SUM(MVCL_MONTO-MVCL_RTEIVA-MVCL_RTEICA), MAX(:FECFIN-MVCL_FECHA), MAX(:FECFIN-MVCL_VENCE) FROM movimiento_clientes
                        WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND MVCL_FECHA <= :FECFIN
                        AND MVCL_DEBITO = 'S' AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA))
                        INTO :DEBITOS, :diasf, :dias;
                    SELECT SUM(MVCL_MONTO-MVCL_RTEIVA-MVCL_RTEICA) FROM movimiento_clientes
                        WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND MVCL_FECHA <= :FECFIN
                        AND MVCL_DEBITO = 'N' AND MVCL_ABONO = 'N' and MVCL_TIPOREF <> 45 AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA))
                        INTO :CREDITOS;
                    end
                else
                    begin
                    SELECT SUM(MVCL_MONTO-MVCL_RTEFTE-MVCL_RTEIVA-MVCL_RTEICA), MAX(:FECFIN-MVCL_FECHA), MAX(:FECFIN-MVCL_VENCE) FROM movimiento_clientes
                        WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND MVCL_FECHA <= :FECFIN
                        AND MVCL_DEBITO = 'S' AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA))
                        INTO :DEBITOS, :diasf, :dias;
                    SELECT SUM(MVCL_MONTO-MVCL_RTEFTE-MVCL_RTEIVA-MVCL_RTEICA) FROM movimiento_clientes
                        WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND MVCL_FECHA <= :FECFIN
                        AND MVCL_DEBITO = 'N' AND MVCL_ABONO = 'N' and MVCL_TIPOREF <> 45 AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA))
                        INTO :CREDITOS;
                    end
                SELECT SUM(MVCL_MONTO) FROM movimiento_clientes
                    WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND MVCL_FECHA <= :FECFIN
                    AND MVCL_ABONO = 'S' AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA))
                    INTO :ABONOS;
                END
            ELSE
                BEGIN
                if (FAUTORET <= FECINI) then
                    begin
                    SELECT SUM((MVCL_MONTO-MVCL_RTEIVA-MVCL_RTEICA)/MVCL_TRM), MAX(:FECFIN-MVCL_FECHA), MAX(:FECFIN-MVCL_VENCE) FROM movimiento_clientes
                        WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND MVCL_FECHA <= :FECFIN
                        AND MVCL_DEBITO = 'S' AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA))
                        INTO :DEBITOS, :diasf, :dias;
                    SELECT SUM((MVCL_MONTO-MVCL_RTEIVA-MVCL_RTEICA)/MVCL_TRM) FROM movimiento_clientes
                        WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND MVCL_FECHA <= :FECFIN
                        AND MVCL_DEBITO = 'N' AND MVCL_ABONO = 'N' and MVCL_TIPOREF <> 45 AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA))
                        INTO :CREDITOS;
                    end
                else
                    begin
                    SELECT SUM((MVCL_MONTO-MVCL_RTEFTE-MVCL_RTEIVA-MVCL_RTEICA)/MVCL_TRM), MAX(:FECFIN-MVCL_FECHA), MAX(:FECFIN-MVCL_VENCE) FROM movimiento_clientes
                        WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND MVCL_FECHA <= :FECFIN
                        AND MVCL_DEBITO = 'S' AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA))
                        INTO :DEBITOS, :diasf, :dias;
                    SELECT SUM((MVCL_MONTO-MVCL_RTEFTE-MVCL_RTEIVA-MVCL_RTEICA)/MVCL_TRM) FROM movimiento_clientes
                        WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND MVCL_FECHA <= :FECFIN
                        AND MVCL_DEBITO = 'N' AND MVCL_ABONO = 'N' and MVCL_TIPOREF <> 45 AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA))
                        INTO :CREDITOS;
                    end
                SELECT SUM(MVCL_MONTO/MVCL_TRM) FROM movimiento_clientes
                    WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND MVCL_FECHA <= :FECFIN
                    AND MVCL_ABONO = 'S' AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA))
                    INTO :ABONOS;
                END
            END
        ELSE
            BEGIN
            if (MONEDA = 0) then
                BEGIN
                SELECT SUM(MVCL_MONTO), MAX(:FECFIN-MVCL_FECHA), MAX(:FECFIN-MVCL_VENCE) FROM movimiento_clientes
                    WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND MVCL_FECHA <= :FECFIN
                    AND MVCL_DEBITO = 'S' AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA))
                    INTO :DEBITOS, :diasf, :dias;
                SELECT SUM(MVCL_MONTO) FROM movimiento_clientes
                    WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND MVCL_FECHA <= :FECFIN
                    AND MVCL_DEBITO = 'N' AND MVCL_ABONO = 'N' and MVCL_TIPOREF <> 45 AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA))
                    INTO :CREDITOS;
                SELECT SUM(MVCL_MONTO+MVCL_RTEFTE+MVCL_RTEIVA+MVCL_RTEICA) FROM movimiento_clientes
                    WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND MVCL_FECHA <= :FECFIN
                    AND MVCL_ABONO = 'S' AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA))
                    INTO :ABONOS;
                END
            ELSE
                BEGIN
                SELECT SUM(MVCL_MONTO/MVCL_TRM), MAX(:FECFIN-MVCL_FECHA), MAX(:FECFIN-MVCL_VENCE) FROM movimiento_clientes
                    WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND MVCL_FECHA <= :FECFIN
                    AND MVCL_DEBITO = 'S' AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA))
                    INTO :DEBITOS, :diasf, :dias;
                SELECT SUM(MVCL_MONTO/MVCL_TRM) FROM movimiento_clientes
                    WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND MVCL_FECHA <= :FECFIN
                    AND MVCL_DEBITO = 'N' AND MVCL_ABONO = 'N' and MVCL_TIPOREF <> 45 AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA))
                    INTO :CREDITOS;
                SELECT SUM((MVCL_MONTO+MVCL_RTEFTE+MVCL_RTEIVA+MVCL_RTEICA)/MVCL_TRM) FROM movimiento_clientes
                    WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND MVCL_FECHA <= :FECFIN
                    AND MVCL_ABONO = 'S' AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA))
                    INTO :ABONOS;
                END
            END
        if (FOV = 'FECHA') then
            BEGIN
            if ((DIASMAX < DIASF) AND (DIASF IS NOT NULL)) then
                DIASMAX = DIASF;
            END
        ELSE
            BEGIN
            if ((DIASMAX < DIAS) AND (DIAS IS NOT NULL)) then
                DIASMAX = DIAS;
            END
        if (DEBITOS IS NULL) then
            DEBITOS = 0;
        if (CREDITOS IS NULL) then
            CREDITOS = 0;
        if (ABONOS IS NULL) then
            ABONOS = 0;
        FINAL = INICIAL + DEBITOS - CREDITOS - ABONOS;
        SUSPEND;
        END
    END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure MOVIMIENTO_CARTERA_DESDE_HASTA (
    NIT varchar(20),
    DESDE date,
    HASTA date,
    EMPSUCURSAL integer,
    MONEDA integer)
returns (
    INICIAL numeric(18,2),
    TIPODOC varchar(8),
    IDDOC integer,
    PREFIJO varchar(4),
    NUMERO varchar(6),
    FECHA date,
    CONCEPTO varchar(60),
    DEBITO numeric(18,2),
    CREDITO numeric(18,2),
    SALDO numeric(18,2),
    NOMBRE varchar(60),
    RTFTE numeric(18,2),
    RTIVA numeric(18,2),
    RTICA numeric(18,2),
    SUCURSAL varchar(10),
    RECPROV_ID integer,
    RECIPROV char(1))
AS
declare variable DB CHAR(1);
declare variable AB CHAR(1);
declare variable RETES CHAR(2);
declare variable tipo integer;
declare variable TRM NUMERIC(18,2);
declare variable i integer;
declare variable AUTORET VARCHAR(10);
declare variable FAUTORET DATE;
declare variable CARTXAGE CHAR(2);
BEGIN
  /* Ubique el NIT */
  select terc_nom from terceros where terc_nit = :NIT INTO :NOMBRE;
  DESDE = DESDE - 1;
  INICIAL = 0;
  i = 0;
  EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'DESCONTAR RETENCIONES POR CAUSACION') returning_values(:RETES);
  EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'FECHA AUTORETENEDOR NO DESCONTAR RETENCIONES DEL SALDO PERO SI CONTABILIZARLAS') returning_values (AUTORET);
  EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'GENERAL', 'SEPARAR CARTERA POR AGENCIA') returning_values (:cartxage);
  if (CARTXAGE = 'NO') then
    empsucursal = 0;
  FOR SELECT MVCL_TIPOREF, MVCL_IDREF FROM MOVIMIENTO_CLIENTES
    WHERE TERC_NIT = :NIT AND MVCL_FECHA <= :DESDE AND MVCL_ABONO = 'N' AND
    ((:empsucursal = 0) or (SUCU_ID = :empsucursal)) AND ((:MONEDA = 0) or (MVCL_TRM <> 1))
    INTO :TIPODOC, :IDDOC
    DO
    BEGIN
    EXECUTE PROCEDURE saldo_doc_cartera(TIPODOC, IDDOC, DESDE, MONEDA) returning_values (SALDO);
    if (SALDO <> 0) then
        INICIAL = INICIAL + SALDO;
    END
  DESDE = DESDE + 1;
  SALDO = INICIAL;
  tipodoc = '';
  iddoc = 0;
  if (AUTORET <> '') then
    FAUTORET = CAST(AUTORET AS DATE);
  else
    FAUTORET = '9999/12/31';
  FOR select tido_nomcorto, MVCL_TIPOREF, mvcl_idref, mvcl_prefref, mvcl_numref, mvcl_fecha, mvcl_conc, mvcl_monto, mvcl_debito, mvcl_rtefte, mvcl_rteiva, mvcl_rteica, mvcl_abono, mvcl_sucursal, MVCL_TRM
    from movimiento_clientes m, tipo_documento t
    where m.mvcl_tiporef = t.tido_cod and terc_nit = :NIT and mvcl_fecha >= :DESDE and mvcl_fecha <= :HASTA and mvcl_tiporef <> 45 AND
    ((SUCU_ID = :EMPSUCURSAL) or (:EMPSUCURSAL = 0)) AND ((:MONEDA = 0) or (MVCL_TRM <> 1))
    order by mvcl_fecha, mvcl_tiporef
    into :TIPODOC,:tipo,  :IDDOC, :PREFIJO, :NUMERO, :FECHA, :CONCEPTO, :DEBITO, :DB, :RTFTE, :RTIVA, :RTICA, :AB, :SUCURSAL, :TRM
    DO
    BEGIN
    i = i + 1;
    if (FAUTORET <= FECHA) then
        RTFTE = 0;
    if (DB = 'N') then
        BEGIN
        if (AB = 'S') then
            if (RETES = 'SI') then
                CREDITO = DEBITO;
            ELSE
                CREDITO = DEBITO + RTFTE + RTIVA + RTICA;
        ELSE
            if (RETES = 'SI') then
                CREDITO = DEBITO - RTFTE - RTIVA - RTICA;
            ELSE
                CREDITO = DEBITO;
        DEBITO = 0;
        END
    ELSE
        BEGIN
        if (RETES = 'SI') then
            DEBITO = DEBITO - RTFTE - RTIVA - RTICA;
        CREDITO = 0;
        END
    if ((MONEDA <> 0) AND (TRM <> 0)) then
        BEGIN
        DEBITO = DEBITO / TRM;
        CREDITO = CREDITO / TRM;
        RTFTE = RTFTE / TRM;
        RTIVA = RTIVA / TRM;
        RTICA = RTICA / TRM;
        END
    SALDO = SALDO + DEBITO - CREDITO;
    /* IDENTIFICAR SI EL DOCUMENTO TIENE RECIBO PROVISIONAL*/
    recprov_id = 0;
    SELECT max(RCPR_ID) FROM recibo_provisional_detalle WHERE RPDE_IDDOC = :iddoc  AND RPDE_TIPODOC = :TIPO and RPDE_ANULADO = 'N' INTO :recprov_id;
    if (recprov_id is null) then
      BEGIN
       reciprov = 'N';
      end
    ELSE
      begin
       reciprov = 'S';
      END
    SUSPEND;
    END
if (i = 0) then
    SUSPEND;
END
^

SET TERM ; ^

/* 20101206 */
/* MULTIPLE ROWS AL DEVOLVER UN ARTICULO QUE ESTA REPETIDO EN LA FACTURA */

SET TERM ^ ;

CREATE OR ALTER procedure COMISIONES_ARTICULO (
    DETALLE char(1),
    DESDE varchar(2),
    HASTA varchar(2),
    FECINI date,
    FECFIN date,
    ARTINI varchar(15),
    ARTFIN varchar(15),
    CEROS char(1),
    AGENCIA integer)
returns (
    CODVEND varchar(2),
    NOMVEND varchar(60),
    NOMTIPO varchar(10),
    ARTICULO varchar(15),
    DESCRIPCION varchar(60),
    CODGRUPO varchar(2),
    NOMGRUPO varchar(30),
    CODSUBG varchar(3),
    NOMSUBG varchar(30),
    CODMARC varchar(3),
    NOMMARC varchar(30),
    UNIDAD varchar(8),
    CANTVTAS numeric(18,4),
    CANTDEV numeric(18,4),
    BASEVTAS numeric(18,2),
    BASEDEV numeric(18,2),
    PORC numeric(18,2),
    COMISION numeric(18,2),
    PREFIJO varchar(4),
    NUMERO varchar(6),
    FECHA date)
AS
declare variable COMIPOR NUMERIC(9,2);
declare variable COMIMONTO NUMERIC(18,2);
declare variable LISTA VARCHAR(6);
declare variable COMIPPOR NUMERIC(9,2);
declare variable COMIPMONTO NUMERIC(18,2);
declare variable IDFAC INTEGER;
declare variable COMIXVND CHAR(2);
BEGIN
EXECUTE PROCEDURE lee_configuracion ('FACTURACION', 'ARTICULOS', 'COMISIONES POR ARTICULO POR GRUPO O POR LISTA DE PRECIOS') returning_values (LISTA);
EXECUTE PROCEDURE lee_configuracion ('FACTURACION', 'ARTICULOS', 'COMISION POR ARTICULO Y PROPORCION POR VENDEDOR') returning_values (comixvnd);
FOR select VEND_COD, VEND_NOMBRE
    from VENDEDORES
    where VEND_COD >= :DESDE AND VEND_COD <= :HASTA AND ((:AGENCIA = 0) or (SUCU_ID = :AGENCIA))
    INTO :CODVEND, :NOMVEND
    DO  
    BEGIN
    FOR SELECT ARTI_COD, ARTI_DES, ARTI_UNIDAD, A.GRUP_COD, GRUP_NOM, A.SUBG_COD, A.MARC_COD, GRUP_COMIPOR, GRUP_COMIMONTO
        FROM ARTICULO A, GRUPO G
        WHERE ARTI_COD >= :ARTINI AND ARTI_COD <= :ARTFIN AND A.GRUP_COD = G.GRUP_COD and substring(a.arti_cod from 1 FOR 2) <> '.t'
      INTO :ARTICULO, :DESCRIPCION, :UNIDAD, :CODGRUPO, :NOMGRUPO, :CODSUBG, :CODMARC, :COMIPOR, :COMIMONTO
      DO
        BEGIN
        SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
        SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
        if (COMIMONTO IS null) then
            COMIMONTO = 0;
        BASEDEV = 0;
        BASEVTAS = 0;
        CANTDEV = 0;
        CANTVTAS = 0;
        if (DETALLE = 'N') then
            BEGIN
            if (LISTA = 'GRUPO') then
                BEGIN
                SELECT SUM(FADE_CANT * FADE_FACTOR), SUM(FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO)
                    FROM FACTURAS_DETALLE D, FACTURAS F
                    WHERE F.FACT_ID = D.FACT_ID AND ARTI_COD = :ARTICULO AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND VEND_COD = :CODVEND AND FACT_ANULADO = 'N'
                    INTO :CANTVTAS, :BASEVTAS;
                SELECT SUM(DVDE_CANT * DVDE_FACTOR), SUM(DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO)
                    FROM devoluciones_ventas_detalle D, DEVOLUCIONES_VENTAS V
                    WHERE V.DEVT_ID = D.DEVT_ID AND ARTI_COD = :ARTICULO AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND VEND_COD = :CODVEND AND DEVT_ANULADO = 'N'
                    INTO :CANTDEV, :BASEDEV;
                if (CANTVTAS IS NULL) then
                    CANTVTAS = 0;
                if (CANTDEV IS NULL) then
                    CANTDEV = 0;
                if (BASEVTAS IS NULL) then
                    BASEVTAS = 0;
                if (BASEDEV IS NULL) then
                    BASEDEV = 0;
                if (COMIMONTO > 0) then
                    BEGIN
                    COMISION = (CANTVTAS - CANTDEV) * COMIMONTO;
                    PORC = COMISION * 100 / (BASEVTAS - BASEDEV);
                    END
                ELSE
                    BEGIN
                    COMISION = (BASEVTAS - BASEDEV) * COMIPOR / 100;
                    PORC = COMIPOR;
                    END
                if (comixvnd = 'SI') then
                    begin
                    COMIPOR = 100;
                    SELECT MAX(COMI_PORC) FROM comisiones WHERE VEND_COD = :codvend AND
                        COMI_INICIAL <= (:BASEVTAS - :BASEDEV) AND COMI_FINAL >= (:BASEVTAS - :BASEDEV) INTO :comipor;
                    porc = PORC * COMIPOR;
                    end
                if (CEROS = 'S') then
                    SUSPEND;
                ELSE
                    if ((CANTVTAS <> 0) OR (CANTDEV <> 0)) then
                        SUSPEND;
                END
            ELSE
                BEGIN
                SELECT SUM(FADE_CANT * FADE_FACTOR), SUM(FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), SUM((FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO)*P.prar_comi/100)
                    FROM FACTURAS_DETALLE D, FACTURAS F, PRECIOS_ARTICULO P
                    WHERE F.FACT_ID = D.FACT_ID AND D.arti_cod = P.arti_cod AND D.lipr_cod = P.lipr_cod AND D.ARTI_COD = :ARTICULO AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND VEND_COD = :CODVEND AND FACT_ANULADO = 'N'
                    INTO :CANTVTAS, :BASEVTAS, :COMISION;
                SELECT SUM(DVDE_CANT * DVDE_FACTOR), SUM(DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO)
                    FROM devoluciones_ventas_detalle D, DEVOLUCIONES_VENTAS V
                    WHERE V.DEVT_ID = D.DEVT_ID AND D.ARTI_COD = :ARTICULO AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND VEND_COD = :CODVEND AND DEVT_ANULADO = 'N'
                    INTO :CANTDEV, :BASEDEV;
                if (CANTVTAS IS NULL) then
                    CANTVTAS = 0;
                if (CANTDEV IS NULL) then
                    CANTDEV = 0;
                if (BASEVTAS IS NULL) then
                    BASEVTAS = 0;
                if (BASEDEV IS NULL) then
                    BASEDEV = 0;
                if (COMISION IS NULL) then
                    COMISION = 0;
                if (COMIMONTO IS NULL) then
                    COMIMONTO = 0;
                if (BASEVTAS <> 0) then
                    PORC = COMISION / BASEVTAS;
                else
                    PORC = 0;
                if (basedev <> 0) then
                    COMISION = (BASEVTAS - BASEDEV) * PORC;
                PORC = PORC * 100;
                if (CEROS = 'S') then
                    SUSPEND;
                ELSE
                    if ((CANTVTAS <> 0) OR (CANTDEV <> 0)) then
                        SUSPEND;
                END
            END
        ELSE
            BEGIN
            SELECT TIDO_NOMCORTO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 31 INTO :NOMTIPO;
            FOR SELECT PREF_PRE, FACT_NUMERO, FACT_FECHA, FADE_CANT * FADE_FACTOR, FADE_TOTAL - FADE_IVAMONTO - FADE_CONSUMO, P.prar_comi, P.prar_comimonto
                FROM FACTURAS F, FACTURAS_DETALLE D, precios_articulo P
                WHERE F.FACT_ID = D.FACT_ID AND D.arti_cod = P.arti_cod AND D.lipr_cod = P.lipr_cod AND D.ARTI_COD = :ARTICULO AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND VEND_COD = :CODVEND AND FACT_ANULADO = 'N'
                INTO :PREFIJO, :NUMERO, :FECHA, :CANTVTAS, :BASEVTAS, :comippor, :comipmonto
                DO
                BEGIN
                if (CANTVTAS IS NULL) then
                    CANTVTAS = 0;
                if (BASEVTAS IS NULL) then
                    BASEVTAS = 0;
                if (LISTA = 'GRUPO') then
                    BEGIN
                    if (COMIMONTO > 0) then
                        BEGIN
                        COMISION = CANTVTAS * COMIMONTO;
                        PORC = COMISION * 100 / BASEVTAS;
                        END
                    ELSE
                        BEGIN
                        COMISION = BASEVTAS * COMIPOR / 100;
                        PORC = COMIPOR;
                        END
                    END
                ELSE
                    BEGIN
                    if (COMIPMONTO > 0) then
                        BEGIN
                        COMISION = CANTVTAS * COMIPMONTO;
                        PORC = COMISION * 100 / BASEVTAS;
                        END
                    ELSE
                        BEGIN
                        COMISION = BASEVTAS * COMIPPOR / 100;
                        PORC = COMIPPOR;
                        END
                    END
                SUSPEND;
                END
            SELECT TIDO_NOMCORTO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 33 INTO :NOMTIPO;
            FOR SELECT PREF_PRE, DEVT_NUMERO, DEVT_FECHA, DVDE_CANT * DVDE_FACTOR, DVDE_TOTAL - DVDE_IVAMONTO - DVDE_CONSUMO, V.devt_factid
                FROM DEVOLUCIONES_VENTAS V, DEVOLUCIONES_VENTAS_DETALLE D
                WHERE V.DEVT_ID = D.DEVT_ID AND D.ARTI_COD = :ARTICULO AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND VEND_COD = :CODVEND AND DEVT_ANULADO = 'N'
                INTO :PREFIJO, :NUMERO, :FECHA, :CANTDEV, :BASEDEV, :idfac
                DO
                BEGIN
                if (CANTDEV IS NULL) then
                    CANTDEV = 0;
                if (BASEDEV IS NULL) then
                    BASEDEV = 0;
                if (LISTA = 'GRUPO') then
                    BEGIN
                    if (COMIMONTO > 0) then
                        BEGIN
                        COMISION = CANTDEV * COMIMONTO * -1;
                        PORC = COMISION * 100 / BASEDEV;
                        END
                    ELSE
                        BEGIN
                        COMISION = BASEDEV * COMIPOR / 100 * -1;
                        PORC = COMIPOR;
                        END
                    END
                ELSE
                    BEGIN
                    /*  BUSQUE EL PRECIO DE LA FACTURA */
                    COMIPMONTO = 0;
                    COMIPPOR = 0;
                    SELECT FIRST 1 P.prar_comi, P.prar_comimonto FROM FACTURAS_DETALLE D, PRECIOS_ARTICULO P
                        WHERE D.arti_cod = P.arti_cod AND D.lipr_cod = P.lipr_cod AND D.ARTI_COD = :articulo AND FACT_ID = :idfac INTO :comippor, :comipmonto;
                    if (COMIPMONTO > 0) then
                        BEGIN
                        COMISION = CANTDEV * COMIPMONTO * -1;
                        PORC = COMISION * 100 / BASEDEV;
                        END
                    ELSE
                        BEGIN
                        COMISION = BASEDEV * COMIPPOR / 100 * -1;
                        PORC = COMIPPOR;
                        END
                    END
                SUSPEND;
                END
            END
        END
    END
END
^

SET TERM ; ^


/* 20101206b */
/* SALDOS POR ACTIVO EN INVENTARIO Y BALANCE */

SET TERM ^ ;

create or alter procedure SALDO_ACTIVO_MES (
    CUENTA varchar(20),
    ACTIVO varchar(15),
    ANO char(4),
    MES integer,
    INICIAL char(1))
returns (
    SALDO numeric(18,2))
AS
DECLARE VARIABLE FECAUX CHAR(8);
BEGIN
IF (INICIAL = 'N') THEN
  MES = MES + 1;
EXECUTE PROCEDURE COMPONE_FECHA_CONTA(ANO, MES, 1) returning_values(FECAUX);
EXECUTE PROCEDURE FECHA_Y_NUMERO_CONTA(FECAUX, -1) RETURNING_VALUES (FECAUX);

SELECT FIRST 1 (SAAC_SALDO+SAAC_DEBITOS-SAAC_CREDITOS) FROM SALDOS_ACTIVO
    WHERE CUEN_COD = :CUENTA AND ACFJ_COD = :ACTIVO AND SAAC_FECHA <= :FECAUX
    ORDER BY CUEN_COD DESC, ACFJ_COD DESC, SAAC_FECHA DESC
    INTO SALDO;
IF (SALDO IS NULL) THEN
    SALDO = 0;
SUSPEND;
END
^

SET TERM ; ^

GRANT EXECUTE ON PROCEDURE saldo_activo_mes TO PUBLIC;

SET TERM ^ ;

CREATE OR ALTER procedure INVENTARIO_Y_BALANCE (
    ANO char(4),
    MES integer)
returns (
    CODIGO varchar(20),
    NOMBRE varchar(60),
    ARTICULO varchar(15),
    NOMARTICULO varchar(60),
    NOMCTAART varchar(60),
    SALDO numeric(18,2),
    SCLASE numeric(18,2),
    SGRUPO numeric(18,2),
    SSUBGRUPO numeric(18,2),
    SCUENTA numeric(18,2),
    NIVEL integer)
AS
declare variable tipo char(1);
declare variable afectable char(1);
declare variable ctacierreu varchar(20); declare variable ctacierrep varchar(20); declare variable cierre numeric(18,2); declare variable aux numeric(18,2); declare variable simulacierre char(2); declare variable dig integer; BEGIN execute procedure lee_configuracion('CONTABILIDAD', 'GENERAL', 'INVENTARIO Y BALANCE SOLO CON CUENTAS DE BALANCE') returning_values (:simulacierre); if (simulacierre = 'SI') then
     BEGIN
     /* CALCULE LA UTILIDAD DEL EJERCICIO */
     EXECUTE PROCEDURE SALDO_CUENTA_MES('4', ANO, MES, 'N') RETURNING_VALUES (AUX);
     CIERRE = AUX;
     EXECUTE PROCEDURE SALDO_CUENTA_MES('5', ANO, MES, 'N') RETURNING_VALUES (AUX);
     CIERRE = CIERRE + AUX;
     EXECUTE PROCEDURE SALDO_CUENTA_MES('6', ANO, MES, 'N') RETURNING_VALUES (AUX);
     CIERRE = CIERRE + AUX;
     EXECUTE PROCEDURE SALDO_CUENTA_MES('7', ANO, MES, 'N') RETURNING_VALUES (AUX);
     CIERRE = CIERRE + AUX;
     EXECUTE PROCEDURE LEE_CONFIGURACION ('CONTABILIDAD', 'GENERAL', 'CUENTA DE UTILIDAD DEL EJERCICIO') returning_values (:CTACIERREU);
     EXECUTE PROCEDURE LEE_CONFIGURACION ('CONTABILIDAD', 'GENERAL', 'CUENTA DE PERDIDA DEL EJERCICIO') returning_values (:CTACIERREP);
     END
FOR SELECT CUEN_COD, CUEN_NOM, CUEN_TIPO FROM CUENTAS order by CUEN_COD INTO CODIGO, NOMBRE, TIPO
     DO
     BEGIN
     if ((simulacierre = 'NO') or (CODIGO < '4')) then
         BEGIN
         EXECUTE PROCEDURE SALDO_CUENTA_MES(CODIGO, ANO, MES, 'N') RETURNING_VALUES (SALDO);
         EXECUTE PROCEDURE VALIDE_ESTRUCTURA (CODIGO) RETURNING_VALUES (:NIVEL);
         EXECUTE PROCEDURE ES_AFECTABLE (CODIGO) RETURNING_VALUES (:AFECTABLE);
         EXECUTE PROCEDURE DIGITOS_NIVEL (:NIVEL) RETURNING_VALUES (:DIG);
         SCLASE = 0;
         SGRUPO = 0;
         SSUBGRUPO = 0;
         SCUENTA = 0;
         ARTICULO = '';
         NOMARTICULO = '';
         NOMCTAART = NOMBRE;

         IF (SIMULACIERRE = 'SI') THEN
             if (CIERRE > 0) then
               BEGIN
               IF (CODIGO = SUBSTR(CTACIERREP, 1, DIG)) then
                 saldo = saldo + CIERRE;
               END
             else
               BEGIN
               IF (CODIGO = SUBSTR(CTACIERREU, 1, DIG)) then
                 saldo = saldo + CIERRE;
               END

         if (NIVEL = 1) then
             SCLASE = SALDO;
         if (NIVEL = 2) then
             SGRUPO = SALDO;
         if (NIVEL = 3) then
             SSUBGRUPO = SALDO;
         if (NIVEL > 3) then
             SCUENTA = SALDO;
         SALDO = 0;
         if ((AFECTABLE = 'S') AND (TIPO = 'A')) then
             BEGIN
             FOR SELECT ACFJ_COD, ACFJ_DESC FROM activos_fijos INTO :ARTICULO, :NOMARTICULO
                 DO
                 BEGIN
                 EXECUTE PROCEDURE saldo_activo_mes(:CODIGO, :ARTICULO, :ANO, :MES, 'N') RETURNING_VALUES (:SALDO);
                 NOMCTAART = NOMARTICULO;
                 if (SALDO <> 0) then
                     SUSPEND;
                 END
             END
         ELSE
           if ((AFECTABLE = 'S') AND (TIPO = 'A')) then
             BEGIN
             FOR SELECT ARTI_COD, ARTI_DES FROM ARTICULO INTO :ARTICULO, :NOMARTICULO
                 DO
                 BEGIN
                 EXECUTE PROCEDURE SALDO_ARTICULO_MES(:CODIGO, :ARTICULO, :ANO, :MES, 'N') RETURNING_VALUES (:SALDO);
                 NOMCTAART = NOMARTICULO;
                 if (SALDO <> 0) then
                     SUSPEND;
                 END
             END
           ELSE
             SUSPEND;
         END
     END
END
^

SET TERM ; ^

/* 20101207 */
/* TOME FECHA DE LA REMISION SI ES MAS RECIENTE QUE LA COMPRA */

SET TERM ^ ;

CREATE OR ALTER procedure EXISTENCIAS_COMPRAS (
    ARTICULO varchar(15),
    FECHA date,
    UNIDAD varchar(8))
returns (
    BODEGA varchar(2),
    EXISTENCIA numeric(18,2),
    RESERVADO numeric(18,2),
    DISPONIBLE numeric(18,2),
    ORDENADO numeric(18,2),
    PROMEDIO numeric(18,2),
    VENTAMES numeric(18,2),
    FECHACMP date,
    CANTCMP numeric(18,2),
    DIAS integer,
    SUGERIDO numeric(18,2),
    STAND varchar(20))
AS
declare variable FACTOR NUMERIC(15,4);
declare variable ORDENC NUMERIC(18,4);
declare variable PEDIDO NUMERIC(18,4);
declare variable ITEM INTEGER;
declare variable ID INTEGER;
declare variable UND VARCHAR(8);
declare variable CANT NUMERIC(18,4);
declare variable FACTOR2 NUMERIC(18,4);
declare variable fecini DATE;
declare variable FECHAAUX VARCHAR(10);
declare variable AGENCIA INTEGER;
declare variable DEVMES NUMERIC(18,2);
declare variable MFAC INTEGER;
declare variable MDEV INTEGER;
declare variable IVAF NUMERIC(18,2);
declare variable IVAD NUMERIC(18,2);
declare variable DIA_ART VARCHAR(2) CHARACTER SET NONE;
declare variable DIASC VARCHAR(255);
declare variable PEDAUTO CHAR(2);
declare variable SALIDAS NUMERIC(18,4);
declare variable fecrem date;
declare variable cantrem numeric(18,4);
BEGIN
  for select bode_cod, SUCU_ID from bodega into :bodega, :agencia
    do
    begin
    execute procedure saldo_inventario (:articulo, :bodega, :fecha) returning_values (:Existencia);
    EXECUTE PROCEDURE FACTOR_UNIDAD_CANT(:ARTICULO, :UNIDAD) returning_values (:FACTOR);
    if (FACTOR <> 0) then
        EXISTENCIA = EXISTENCIA / FACTOR;
    else
        EXISTENCIA = 0;
    STAND = '';
    SELECT STAND_COD FROM STANDS WHERE ARTI_COD = :ARTICULO AND STAND_BODEGA = :BODEGA INTO :stand;
    EXECUTE PROCEDURE promedio_salidas_articulo (:ARTICULO, :FECHA, :BODEGA) returning_values (:PROMEDIO, :SALIDAS);
    EXECUTE PROCEDURE lee_configuracion ('INVENTARIO', 'EXISTENCIAS', 'PROMEDIAR LAS SALIDAS DEL INVENTARIO CON EL NUMERO DE DIAS ASIGNADO A CADA ARTICULO') returning_values (:DIA_ART);
    if (DIA_ART = 'NO') then
        BEGIN
        EXECUTE PROCEDURE lee_configuracion ('INVENTARIO', 'EXISTENCIAS', 'NUMERO DE DIAS PARA PROMEDIO DE SALIDAS POR ARTICULO') returning_values (DIASC);
        DIAS = CAST(DIASC AS INTEGER);
        END
    ELSE
        SELECT ARTI_DIAS FROM ARTICULO WHERE ARTI_COD = :ARTICULO INTO :DIAS;
    if (DIAS is null) then
        DIAS = 0;
    PROMEDIO = DIAS * PROMEDIO;
    if (FACTOR <> 0) then
        PROMEDIO = PROMEDIO / FACTOR;
    SUGERIDO = PROMEDIO - EXISTENCIA;
    SELECT SUM(ORID_ENTREGAR)
      FROM ORDENINVENTARIO_DETALLE OD, ordenes_inventario O
      WHERE O.ORIN_ID = OD.ORIN_ID AND ARTI_COD = :ARTICULO AND ORIN_FECHA <= :FECHA AND ORIN_FECLLEGA >= :FECHA AND ORID_ANULADO = 'N' AND OD.BODE_COD = :BODEGA
      INTO :ORDENADO;
    if (ORDENADO IS NULL) then
        ORDENADO = 0;
    ORDENC = 0;
    FOR SELECT O.ORDC_ID, OCDE_ITEM, OCDE_CANT * OCDE_FACTOR
        FROM ORDENES_COMPRA O, ORDENES_COMPRA_DETALLE OD
        WHERE O.ORDC_ID = OD.ORDC_ID AND OD.ARTI_COD = :ARTICULO AND (ORDC_FECHA+ORDC_VALIDEZ) >= :FECHA AND ORDC_FECHA <= :FECHA AND OCDE_ANULADO = 'N' AND OD.BODE_COD = :BODEGA
        INTO :ID, :ITEM, :CANT
        do
        BEGIN
        EXECUTE PROCEDURE FALTANTE(23, 21, ID, ITEM) returning_values (PEDIDO, UND, FACTOR2);
        if (PEDIDO * FACTOR2 = CANT) then /* SI NO SE HA FACTURADO MIRE A VER SI SE REMISIONO */
            EXECUTE PROCEDURE FALTANTE(23, 22, ID, ITEM) returning_values (PEDIDO, UND, FACTOR2);
        if (PEDIDO IS NULL) then
            PEDIDO = 0;
        ORDENC = ORDENC + PEDIDO * FACTOR2;
        END
    ORDENADO = ORDENADO + ORDENC;
    if (FACTOR <> 0) then
        ORDENADO = ORDENADO / FACTOR;
    SELECT SUM(RSDE_LIBERAR)
      FROM RESERVAS_DETALLE RD, RESERVAS R
      WHERE R.RESE_ID = RD.RESE_ID AND ARTI_COD = :ARTICULO AND RESE_FECHA <= :FECHA AND RESE_VENCE >= :FECHA AND RD.BODE_COD = :BODEGA AND RSDE_ANULADO = 'N'
      INTO :RESERVADO;
    if (RESERVADO IS NULL) then
        RESERVADO = 0;
    PEDIDO = 0;
    FOR SELECT P.PEDI_ID, PEDE_ITEM, PEDE_CANT * PEDE_FACTOR
        FROM PEDIDOS P, PEDIDOS_DETALLE PD
        WHERE P.PEDI_ID = PD.PEDI_ID AND PD.ARTI_COD = :ARTICULO AND (PEDI_FECHA+PEDI_VALIDEZ) >= :FECHA AND PEDI_FECHA <= :FECHA AND PEDE_ANULADO = 'N' AND BODE_COD = :BODEGA
        INTO :ID, :ITEM, :CANT
        do
        BEGIN
        EXECUTE PROCEDURE FALTANTE(34, 31, ID, ITEM) returning_values (ORDENC, UND, FACTOR2);
        EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION', 'FACTURAS', 'GENERAR PEDIDO AUTOMATICAMENTE CON LA FACTURA') returning_values (pedauto);
        if ((ORDENC * FACTOR2 = CANT) or (PEDAUTO = 'SI')) then /* SI NO SE HA FACTURADO MIRE A VER SI SE REMISIONO */
            EXECUTE PROCEDURE FALTANTE(34, 32, ID, ITEM) returning_values (ORDENC, UND, FACTOR2);
        if (ORDENC IS NULL) then
            ORDENC = 0;
        PEDIDO = PEDIDO + ORDENC * FACTOR2;
        END
    RESERVADO = RESERVADO + PEDIDO;
    if (FACTOR <> 0) then
        RESERVADO = RESERVADO / FACTOR;
    DISPONIBLE = EXISTENCIA - RESERVADO;
    /* VENTAS MES */
    FECHAAUX = CAST (FECHA AS VARCHAR(10));
    FECHAAUX = SUBSTR(FECHAAUX, 1, 7) || '/01';
    FECINI = CAST (FECHAAUX AS DATE);
    EXECUTE PROCEDURE ventas_articulo (:ARTICULO, :FECINI, :FECHA, :agencia) returning_values (:ventames, :mfac, :devmes, :mdev, :ivaf, :ivad);
    ventames = ventames - devmes;
    if (FACTOR <> 0) then
        ventames = ventames / FACTOR;
    /* FECHA COMPRA */
    fechacmp = null;
    cantcmp = 0;
    SELECT FIRST 1 FACO_FECHA, FCDE_CANT * FCDE_FACTOR FROM FACTURAS_COMPRA F, FACTURAS_COMPRAS_DETALLE D
        WHERE F.FACO_ID = D.faco_id AND D.ARTI_COD = :articulo AND FACO_FECHA <= :FECHA AND D.bode_cod = :BODEGA
        ORDER BY FACO_FECHA DESC, F.FACO_ID DESC
        INTO :fechacmp, :cantcmp;
    SELECT FIRST 1 REPR_FECHA, RPVD_CANT * RPVD_FACTOR FROM remision_proveedor F, remision_proveedor_det D
        WHERE F.repr_id = D.repr_id AND D.ARTI_COD = :articulo AND REPR_FECHA <= :FECHA AND D.bode_cod = :BODEGA
        ORDER BY REPR_FECHA DESC, F.repr_id DESC
        INTO :fecrem, :cantrem;
    if ((FECREM IS NOT NULL) AND (FECREM > fechacmp)) then
        BEGIN
        fechacmp = FECREM;
        cantcmp = cantrem;
        END
    SUSPEND;
    end
END
^

SET TERM ; ^

/* 20101207b */
/* MULTIPLE ROWS AL TRAER FECREC */

SET TERM ^ ;

CREATE OR ALTER procedure REP_DOCUMENTOS_ENCAJA (
    CAJAINI integer,
    CAJAFIN integer,
    FECHA date)
returns (
    CAJAID integer,
    CAJANOM varchar(60),
    RESPONSABLE varchar(60),
    TIPODOC varchar(8),
    NUMDOC varchar(10),
    BANCO varchar(2),
    CUENTA varchar(20),
    NUMERO varchar(20),
    FECDOC date,
    MONTO numeric(18,2),
    FORPAGO varchar(30),
    NOMTERC varchar(60))
AS
declare variable TIPOENT INTEGER;
declare variable IDDOC INTEGER;
declare variable TIPOSAL INTEGER;
declare variable IDSAL INTEGER;
declare variable OK CHAR(1);
declare variable FECREC DATE;
BEGIN
FOR SELECT CAJA_ID, CAJA_NOMBRE, CAJA_RESP FROM CAJAS
    WHERE CAJA_ID >= :CAJAINI AND CAJA_ID <= :CAJAFIN AND CAJA_ACTIVA = 'S'
    ORDER BY CAJA_ID
    INTO :CAJAID, :CAJANOM, :RESPONSABLE
    DO
    BEGIN
    /* PRIMERO EL SALDO DE EFECTIVO */
    FORPAGO = 'EFECTIVO';
    TIPODOC = '';
    NUMDOC = '';
    BANCO = '';
    CUENTA = '';
    NUMERO = '';
    execute procedure SALDO_EN_EFECTIVO(:CAJAID, :fecha) RETURNING_VALUES (:MONTO);
    SUSPEND;
    
    FOR SELECT DPCA_BANCO, DPCA_CUENTA, DPCA_NUMERO, DPCA_FECHA, DPCA_MONTO, FOPA_NOM, TIDO_NOMCORTO, DPCA_TIPOENT, DPCA_IDENT, DPCA_TIPOSAL, DPCA_IDSAL
        FROM DOCUMENTOS_PAGO_CAJA D, TIPO_DOCUMENTO T, FORMAS_PAGO F
        WHERE D.DPCA_TIPOENT = T.TIDO_COD AND D.FOPA_ID = F.FOPA_ID AND D.CAJA_ID = :CAJAID AND D.FOPA_ID <> 1 AND DPCA_MONTO <> 0
        ORDER BY FOPA_NOM, DPCA_FECHA
        INTO :BANCO, :CUENTA, :NUMERO, :FECDOC, :MONTO, :FORPAGO, :TIPODOC, :tipoent, :IDDOC, :tiposal, :idsal
        DO
        BEGIN
        OK = 'N';
        SELECT MOCA_FECHA FROM movimiento_caja WHERE MOCA_TIPOREF = :tipoent AND MOCA_IDREF = :IDDOC AND CAJA_ID = :cajaid
            INTO :FECREC;
        if (FECREC <= FECHA) then
            BEGIN
            /* VERIFIQUE QUE NO ESTE SALIDO */
            if ((:IDSAL = 0) AND (:TIPOSAL = 0)) THEN
                OK = 'S';   
            ELSE
                BEGIN
                SELECT MOCA_FECHA FROM movimiento_caja WHERE MOCA_TIPOREF = :tiposal AND MOCA_IDREF = :idsal AND CAJA_ID = :cajaid
                    INTO :FECREC;
                    if (FECREC > FECHA) then
                        OK = 'S';
                END
            END
        if (OK = 'S') then
            BEGIN
            if (TIPODOC = 'RECICAJA') then
                SELECT PREF_PRE || RECA_NUMERO, TERC_NOM FROM RECIBOS_CAJA R, TERCEROS T
                    WHERE RECA_ID = :IDDOC AND R.TERC_NIT = T.TERC_NIT INTO :NUMDOC, :NOMTERC;
            if (TIPODOC = 'RECIPROV') then
                SELECT PREF_PRE || RCPR_NUMERO, TERC_NOM FROM RECIBO_PROVISIONAL R, TERCEROS T
                    WHERE RCPR_ID = :IDDOC AND R.TERC_NIT = T.TERC_NIT INTO :NUMDOC, :NOMTERC;
            if (TIPODOC = 'DEVOCHEQ') then
                SELECT PRBA_PREF || DVCH_NUMDOC, TERC_NOM FROM DEVOLUCION_CHEQUES D, TERCEROS T
                    WHERE DVCH_ID = :IDDOC AND D.TERC_NIT = T.TERC_NIT INTO :NUMDOC, :NOMTERC;
            if (TIPODOC = 'TRASLACJ') then
                SELECT PREF_PRE || TRCJ_NUMERO, '' FROM traslados_caja
                    WHERE TRCJ_ID = :IDDOC INTO :NUMDOC, :NOMTERC;
            SUSPEND;
            END
        END
    END
END
^

SET TERM ; ^

/* 20101207c */
SET TERM ^ ;

CREATE OR ALTER TRIGGER PRODUCCION_ENTRADA_DET_BI FOR PRODUCCION_ENTRADA_DET
ACTIVE BEFORE INSERT POSITION 0
as
declare variable NUMROWS integer;
begin
/*  PARENT 'ARTICULO' MUST EXIST WHEN INSERTING A CHILD IN 'ENSAMBLES_DETALLE'  */
IF (NEW.ARTI_COD IS NOT NULL) THEN
    BEGIN
       SELECT COUNT(*)
       FROM   ARTICULO
       WHERE  ARTICULO.ARTI_COD = NEW.ARTI_COD
       INTO   :NUMROWS;
       IF (NUMROWS = 0) THEN
       BEGIN
          EXCEPTION ARTICULO_NO_EXISTE;
       END
    END
/*  PARENT 'BODEGA' MUST EXIST WHEN INSERTING A CHILD IN 'ENSAMBLES_DETALLE'  */
IF (NEW.bode_cod IS NOT NULL) THEN
    BEGIN
       SELECT COUNT(*)
       FROM   BODEGA
       WHERE  BODEGA.BODE_COD = NEW.bode_cod
       INTO   :NUMROWS;
       IF (NUMROWS = 0) THEN
       BEGIN
          EXCEPTION BODEGA_NO_EXISTE;
       END
    END
/*  PARENT 'ENSAMBLES' MUST EXIST WHEN INSERTING A CHILD IN 'ENSAMBLES_DETALLE'  */
IF (NEW.prde_id IS NOT NULL) THEN
    BEGIN
       SELECT COUNT(*)
       FROM   produccion_entrada_enc
       WHERE  produccion_entrada_enc.prde_id = NEW.prde_id
       INTO   :NUMROWS;
       IF (NUMROWS = 0) THEN
       BEGIN
          EXCEPTION entradaprod_no_existe;
       END
    END
if (NEW.pren_cantok IS NULL) then
    NEW.pren_cantok = 0;
if (NEW.pren_cantmal IS NULL) then
    NEW.pren_cantmal = 0;
if (new.pren_factor is null) then
    execute procedure factor_unidad_cant (new.arti_cod, new.pren_unidad) returning_values (new.pren_factor);
end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER PROCEDURE ARREGLA_COSTO_PRODENT
RETURNS (
    IDORD INTEGER,
    ID INTEGER,
    ARTIC VARCHAR(20),
    FEC DATE,
    TOTAL NUMERIC(18,2))
AS
declare variable COSTO NUMERIC(18,2);
declare variable COSTOS NUMERIC(18,2);
declare variable COSTOD NUMERIC(18,2);
declare variable CANTE NUMERIC(18,4);
begin
FOR SELECT ED.prde_id, ED.ARTI_COD, EE.prde_fecha, EE.pror_id FROM produccion_entrada_det ED, produccion_entrada_enc EE, produccion_orden O
    WHERE EE.prde_id = ED.prde_id AND O.pror_id = EE.pror_id AND O.pror_estado <> 'A'
    ORDER BY EE.pror_id, EE.prde_id
    INTO :ID, :artic, :fec, :idord
    DO
    BEGIN
    TOTAL = 0;
    /* busque el id de la orden */
    SELECT SUM(D.pode_cant * D.pode_costo) FROM produccion_orden_detalle D, produccion_orden E
        WHERE D.pror_id = E.pror_id AND E.pror_id = :idord AND D.pode_anulado = 'N' INTO :COSTO;
    if (COSTO IS NULL) then
        COSTO = 0;
    SELECT SUM(prsa_CANT * PRSA_COSTO) FROM produccion_salida_det D, produccion_salida_enc E
        WHERE D.prsa_id = E.prsa_id AND E.pror_id = :idord AND D.prsa_anulado = 'N' INTO :COSTOS;
    if (COSTOS IS NULL) then
        COSTOS = 0;
    SELECT SUM(D.prdd_cant * D.prdd_costo) FROM produccion_devolucion_det D, produccion_devolucion E
        WHERE D.prdd_id = E.prdd_id AND E.pror_id = :idord AND D.prdd_anulado = 'N' INTO :COSTOD;
    if (COSTOD IS NULL) then
        COSTOD = 0;
    COSTOS = COSTO + COSTOS - COSTOD;
    SELECT SUM(D.pren_cantok + D.pren_cantmal) FROM produccion_entrada_det D, produccion_entrada_enc E
        WHERE D.prde_id = E.prde_id AND E.pror_id = :idord AND D.pren_anulado = 'N' INTO :cante;
    if (cante IS NULL) then
        cante = 0;
    if (cante <> 0) then
        TOTAL = COSTOS / CANTE;
    ELSE
        TOTAL = 0;
    UPDATE MOVIMIENTO_ARTICULO SET MVAR_COSTO = :TOTAL WHERE MVAR_TIPODOC = 20 AND MVAR_IDREF = :ID AND MVAR_ENTRADA = 'S' AND ARTI_COD = :artic;
    suspend;
    END
end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER PRODUCCION_ORDEN_AU FOR PRODUCCION_ORDEN
ACTIVE AFTER UPDATE POSITION 0
as
declare variable CONSEC INTEGER;
declare variable ID INTEGER;
declare variable ARTIC VARCHAR(20);
declare variable TOTAL NUMERIC(18,2);
declare variable COSTO NUMERIC(18,2);
declare variable COSTOS NUMERIC(18,2);
declare variable COSTOD NUMERIC(18,2);
declare variable FEC DATE;
declare variable CANT NUMERIC(18,4);
declare variable CANTE NUMERIC(18,4);
declare variable IDMOV INTEGER;
begin
if (NEW.pror_anulado = 'S') then
    BEGIN
    select enco_consec from comprobante_encabezado where enco_tiporef = 19 and enco_idref = old.pror_id into :consec;
    if (NOT consec is null) then
     delete from comprobante_detalle where enco_consec = :consec;
    delete from comprobante_encabezado where enco_tiporef = 19 and enco_idref = old.pror_id;
    INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
        VALUES (USER, 19, NEW.pror_id, 'A', NEW.pref_pre || NEW.pror_numero);
    END
else
    begin
    if (NEW.pror_estado <> 'A' AND OLD.pror_estado = 'A') then
        BEGIN
        /* ESTAN CERRANDO LA ORDEN */
        FOR SELECT ED.prde_id, ED.ARTI_COD, EE.prde_fecha, ED.pren_cantok
            FROM produccion_entrada_det ED, produccion_entrada_enc EE
            WHERE EE.prde_id = ED.prde_id AND EE.pror_id = NEW.pror_id
            ORDER BY EE.prde_id
            INTO :ID, :artic, :fec, :CANT
            DO
            BEGIN
            TOTAL = 0;
            /* busque el id de la orden */
            SELECT SUM(D.pode_cant * D.pode_costo) FROM produccion_orden_detalle D, produccion_orden E
                WHERE D.pror_id = E.pror_id AND E.pror_id = NEW.pror_id AND D.pode_anulado = 'N' INTO :COSTO;
            if (COSTO IS NULL) then
                COSTO = 0;
            SELECT SUM(prsa_CANT * PRSA_COSTO) FROM produccion_salida_det D, produccion_salida_enc E
                WHERE D.prsa_id = E.prsa_id AND E.pror_id = NEW.pror_id AND D.prsa_anulado = 'N' INTO :COSTOS;
            if (COSTOS IS NULL) then
                COSTOS = 0;
            SELECT SUM(D.prdd_cant * D.prdd_costo) FROM produccion_devolucion_det D, produccion_devolucion E
                WHERE D.prdd_id = E.prdd_id AND E.pror_id = NEW.pror_id AND D.prdd_anulado = 'N' INTO :COSTOD;
            if (COSTOD IS NULL) then
                COSTOD = 0;
            COSTOS = COSTO + COSTOS - COSTOD;
            SELECT SUM(D.pren_cantok + D.pren_cantmal) FROM produccion_entrada_det D, produccion_entrada_enc E
                WHERE D.prde_id = E.prde_id AND E.pror_id = NEW.pror_id AND D.pren_anulado = 'N' INTO :cante;
            if (cante IS NULL) then
                cante = 0;
            if (cante <> 0) then
                TOTAL = COSTOS / CANTE;
            ELSE
                TOTAL = 0;
            FOR SELECT MVAR_CONS FROM MOVIMIENTO_ARTICULO WHERE MVAR_TIPODOC = 20 AND MVAR_IDREF = :ID AND MVAR_ENTRADA = 'S' AND ARTI_COD = :artic
                INTO :IDMOV
                DO
                BEGIN
                EXECUTE PROCEDURE actualice_costo(:artic, :fec, :total, :cant, 'S', 'S', :IDMOV, 20);
                UPDATE MOVIMIENTO_ARTICULO SET MVAR_COSTO = :TOTAL WHERE MVAR_CONS = :IDMOV;
                EXECUTE PROCEDURE actualice_costo(:artic, :fec, :total, :cant, 'S', 'N', :IDMOV, 20);
                EXECUTE PROCEDURE chequeo_costos(:artic, :fec);
                END
            END
        END
    INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
        VALUES (USER, 19, NEW.pror_id, 'U', NEW.pref_pre || NEW.pror_numero);
    end
if ((OLD.pref_pre <> NEW.pref_pre) or
    (OLD.pror_numero <> NEW.pror_numero) or
    (OLD.pror_fecha <> NEW.pror_fecha) ) then
    UPDATE produccion_orden_detalle SET PODE_TRANSMIT = 'N' WHERE PROR_ID = OLD.pror_id;

if (OLD.pror_anulado <> NEW.pror_anulado) then
    UPDATE produccion_orden_detalle SET PODE_ANULADO = NEW.pror_anulado WHERE PROR_ID = OLD.pror_id;

if (OLD.pror_transmit <> NEW.pror_transmit) then
    UPDATE produccion_orden_detalle SET PODE_TRANSMIT = NEW.pror_transmit WHERE PROR_ID = OLD.pror_id;
end
^

SET TERM ; ^



/* 20101207d */
/* MAL HORAS ESTABA EN MINUTOS */

SET TERM ^ ;

CREATE OR ALTER procedure IMPR_PRODUCCION (
    ID integer)
returns (
    PREF varchar(4),
    NUMERO varchar(6),
    FECHA date,
    CLIENTE varchar(20),
    NOMCLIENTE varchar(60),
    CODBODEGA varchar(2),
    NOMBODEGA varchar(30),
    PRODARTI varchar(15),
    PRODCODBAR varchar(15),
    PRODDES varchar(60),
    PRODCANT numeric(18,4),
    PRODUNIDAD varchar(8),
    PRODLOTE varchar(15),
    MAQUINA varchar(60),
    PRIORIDAD integer,
    FECHAENT date,
    FECMONTAJE date,
    ESTADO char(1),
    PESOTOTAL numeric(18,4),
    OBS blob sub_type 1 segment size 80,
    TOTENSAMBLE numeric(18,2),
    DIAS numeric(9,2),
    HORAS numeric(9,2),
    ITEM integer,
    ARTICULO varchar(15),
    CODBAR varchar(15),
    ARTIDES varchar(60),
    CICLO integer,
    CANT numeric(18,4),
    UNIDAD varchar(8),
    BODITEM varchar(2),
    COSTO numeric(18,2),
    IVAPORC numeric(9,2),
    IVAMONTO numeric(18,2),
    PESO numeric(18,4),
    TOTAL numeric(18,2),
    LOTE varchar(15))
AS
BEGIN
SELECT PREF_PRE, PROR_NUMERO, PROR_FECHA, PROR_NIT, PROR_NOMCLIENTE, PROR_BODEGA, BODE_NOM, PROR_PRODUCTO, ARTI_COD,
    PROR_DESC, PROR_CANT, PROR_UNIDAD, PROR_LOTE, PROR_OBS, PROR_PESO, PROR_MAQUINA, PROR_PRIORIDAD, PROR_FECHAENT, PROR_ESTADO, PROR_FECMONTAJE
    FROM produccion_orden P, BODEGA B WHERE P.PROR_BODEGA = B.BODE_COD AND P.PROR_ID = :ID into
    :PREF, :NUMERO, :FECHA, :CLIENTE, :NOMCLIENTE, :CODBODEGA, :NOMBODEGA, :PRODCODBAR, :PRODARTI,
    PRODDES, PRODCANT, PRODUNIDAD, PRODLOTE, :OBS, :PESOTOTAL, :MAQUINA, :PRIORIDAD, :FECHAENT, :ESTADO, :fecmontaje;
  SELECT SUM(PODE_TOTAL) FROM produccion_orden_detalle WHERE PROR_ID = :ID INTO :TOTENSAMBLE;
  SELECT ENMA_NOMBRE FROM ensamble_maquina WHERE ENMA_ID = :MAQUINA INTO :MAQUINA;
  SELECT ARTI_CICLO FROM ARTICULO WHERE ARTI_COD = :prodarti INTO :ciclo;
  HORAS = CICLO * prodcant / 3600;
  DIAS = HORAS / 24;
  FOR SELECT PODE_ITEM, A.ARTI_COD, PODE_CODBAR, PODE_DESC, PODE_CANT, PODE_UNIDAD, PODE_BODEGA, PODE_COSTO, PODE_IVAPORC, PODE_IVAMONTO, PODE_TOTAL, PODE_LOTE, PODE_PESO
    FROM produccion_orden_detalle D, ARTICULO A
    WHERE D.ARTI_COD = A.ARTI_COD AND D.PROR_ID = :ID
    ORDER BY PODE_ITEM
    INTO :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :BODITEM, :COSTO, :IVAPORC, :IVAMONTO, :TOTAL, :LOTE, :PESO
    DO
      BEGIN
      SUSPEND;
      END
  FOR SELECT PRSA_ITEM, A.ARTI_COD, PRSA_CODBAR, PRSA_DESC, PRSA_CANT, PRSA_UNIDAD, BODE_COD, PRSA_COSTO, 0, 0, PRSA_TOTAL, PRSA_LOTE, PRSA_PESO
    FROM produccion_salida_det D, produccion_salida_enc S,  ARTICULO A
    WHERE D.ARTI_COD = A.ARTI_COD AND S.PROR_ID = :ID AND S.prsa_id = D.prsa_id
    ORDER BY D.prsa_id, D.PRSA_ITEM
    INTO :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :BODITEM, :COSTO, :IVAPORC, :IVAMONTO, :TOTAL, :LOTE, :PESO
    DO
      BEGIN
      SUSPEND;
      END
  FOR SELECT PRDD_ITEM, A.ARTI_COD, PRDD_CODBAR, PRDD_DESC, PRDD_CANT*-1, PRDD_UNIDAD, BODE_COD, PRDD_COSTO, 0, 0, PRDD_TOTAL*-1, PRDD_LOTE, PRDD_PESO*-1
    FROM produccion_devolucion_det D, produccion_devolucion S,  ARTICULO A
    WHERE D.ARTI_COD = A.ARTI_COD AND S.PROR_ID = :ID AND S.pror_id = D.prdd_id
    ORDER BY D.prdd_id, D.prdd_item
    INTO :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :BODITEM, :COSTO, :IVAPORC, :IVAMONTO, :TOTAL, :LOTE, :PESO
    DO
      BEGIN
      SUSPEND;
      END
end
^

SET TERM ; ^


/* 20101209 */
/* NO IMPRIMIA CUENTAS PADRE EN CERO A PESAR QUE LAS HIJAS SI TENIAN MOVIMIENTO */
SET TERM ^ ;

CREATE OR ALTER procedure BALANCE_CON_TERCEROS_MES (
    ANO char(4),
    MES integer,
    CTAINI varchar(20),
    CTAFIN varchar(20),
    NITINI varchar(20),
    NITFIN varchar(20),
    CEROS char(1))
returns (
    CUENTA varchar(20),
    NOM_CUENTA varchar(60),
    NIT varchar(20),
    DV char(1),
    NOM_TERCERO varchar(60),
    DIR varchar(60),
    CIUDAD varchar(40),
    CODCIU varchar(5),
    TEL varchar(40),
    FAX varchar(40),
    CEL varchar(40),
    INICIAL numeric(18,2),
    DEBITOS numeric(18,2),
    CREDITOS numeric(18,2),
    FINAL numeric(18,2),
    SCLASE numeric(18,2),
    SGRUPO numeric(18,2),
    SSUBGRUPO numeric(18,2),
    SCUENTA numeric(18,2),
    STERCERO numeric(18,2),
    NOMCTATER varchar(120),
    NIVEL integer)
AS
DECLARE VARIABLE OK CHAR(1);
declare variable CUENAUX VARCHAR(20);
declare variable SALDOTER NUMERIC(18,2);
declare variable TOTALTER NUMERIC(18,2);
declare variable ES_TERC CHAR(1);
declare variable LARGO INTEGER;
BEGIN
FOR SELECT CUEN_COD, CUEN_NOM, CUEN_TERCERO FROM CUENTAS
    WHERE CUEN_COD >= :CTAINI AND CUEN_COD <= :CTAFIN
    order by CUEN_COD INTO CUENTA, NOM_CUENTA, ES_TERC
DO
  BEGIN
  SCLASE = 0;
  SGRUPO = 0;
  SSUBGRUPO = 0;
  SCUENTA = 0;
  STERCERO = 0;
  EXECUTE PROCEDURE SALDO_CUENTA_MES(CUENTA, ANO, MES, 'S') RETURNING_VALUES (INICIAL);
  EXECUTE PROCEDURE MOVIMIENTO_CUENTA_MES(CUENTA, ANO, MES, 'S') RETURNING_VALUES(DEBITOS);
  EXECUTE PROCEDURE MOVIMIENTO_CUENTA_MES(CUENTA, ANO, MES, 'N') RETURNING_VALUES(CREDITOS);
  FINAL = INICIAL + DEBITOS - CREDITOS;
  NIT = '';
  NOM_TERCERO = '';
  EXECUTE PROCEDURE VALIDE_ESTRUCTURA (CUENTA) RETURNING_VALUES (:NIVEL);
  if (NIVEL = 1) then
    SCLASE = FINAL;
  if (NIVEL = 2) then
    SGRUPO = FINAL;
  if (NIVEL = 3) then
    SSUBGRUPO = FINAL;
  if (NIVEL = 4) then
    SCUENTA = FINAL;
  NOMCTATER = NOM_CUENTA;
  if (CEROS = 'N') then
    BEGIN
    if ((final <> 0) or (inicial <> 0) or (debitos <> 0) or (creditos <> 0)) then
        SUSPEND;
    ELSE
        BEGIN
        /* SI HAY SALDOS DE CUENTAS AUXILIARES O TERCEROS IMPRIMA A PESAR DE SER CERO */
        LARGO = STRLEN(CUENTA);
        totalter = 0;
        FOR SELECT DISTINCT TERC_NIT, CUEN_COD FROM saldos_terceros
            WHERE SUBSTRING(CUEN_COD FROM 1 FOR :LARGO) = :CUENTA INTO :NIT, :CUENAUX
            DO
            BEGIN
            EXECUTE PROCEDURE SALDO_TERCERO_MES(CUENAUX, NIT, ANO, MES, 'S') RETURNING_VALUES (saldoter);
            if (SALDOTER <> 0) then
                TOTALTER = SALDOTER;
            END
        if (TOTALTER <> 0) then
            SUSPEND;
        END
    END
  ELSE
    SUSPEND;
    
  EXECUTE PROCEDURE ES_AFECTABLE(CUENTA) RETURNING_VALUES (OK);
  IF ((OK = 'S') AND (ES_TERC = 'S')) THEN
      BEGIN
      FOR SELECT distinct TERC_NIT FROM SALDOS_TERCEROS
        WHERE CUEN_COD = :CUENTA AND TERC_NIT >= :NITINI AND TERC_NIT <= :NITFIN
        ORDER BY TERC_NIT 
        INTO :NIT
        do
        BEGIN
        SELECT TERC_NOM, TERC_DV, TERC_DIR, TERC_CIU, TERC_TEL, TERC_CEL, TERC_FAX, CIUD_COD FROM TERCEROS
            WHERE TERC_NIT = :NIT INTO NOM_TERCERO, :DV, :DIR, :ciudad, :tel, :cel, :fax, :codciu;
        EXECUTE PROCEDURE SALDO_TERCERO_MES(CUENTA, NIT, ANO, MES, 'S') RETURNING_VALUES (INICIAL);
        EXECUTE PROCEDURE MOVIMIENTO_TERCERO_MES(CUENTA, NIT, ANO, MES, 'S') RETURNING_VALUES(DEBITOS);
        EXECUTE PROCEDURE MOVIMIENTO_TERCERO_MES(CUENTA, NIT, ANO, MES, 'N') RETURNING_VALUES(CREDITOS);
        FINAL = INICIAL + DEBITOS - CREDITOS;
        NOM_CUENTA = '';
        SCUENTA = 0;
        STERCERO = FINAL;
        NOMCTATER = NOM_TERCERO;
        if ((final <> 0) or (inicial <> 0) or (debitos <> 0) or (creditos <> 0)) then
          SUSPEND;
        END
      END
  END
END
^

SET TERM ; ^


/* 20101209b */
/* CONTABILICE LOS MOVIMIENTOS DE ACTIVOS COMO INVENTARIO */

SET TERM ^ ;

CREATE OR ALTER procedure CONTABIL_ENTRADA (
    IDDOC integer,
    IDINTER integer)
returns (
    ERROR integer,
    VER char(1),
    IDC integer)
AS
declare variable PREFIJO VARCHAR(4);
declare variable NUMERO VARCHAR(6);
declare variable FECAUX DATE;
declare variable FECHA CHAR(8);
declare variable CONCEPTO CHAR(60);
declare variable TIPOCOMP VARCHAR(3);
declare variable PREFCONT VARCHAR(4);
declare variable BASE CHAR(1);
declare variable IVAV CHAR(1);
declare variable CONSUMO CHAR(1);
declare variable TOTAL CHAR(1);
declare variable CTABASE VARCHAR(20);
declare variable CTAIVA VARCHAR(20);
declare variable CTACONSUMO VARCHAR(20);
declare variable CTACIERRE VARCHAR(20);
declare variable EXISTE CHAR(1);
declare variable CUENTA VARCHAR(20);
declare variable MONTO NUMERIC(18,2);
declare variable TIPOCUEN CHAR(1);
declare variable NIT VARCHAR(20);
declare variable PROY VARCHAR(4);
declare variable CENTRO VARCHAR(4);
declare variable DEBITO NUMERIC(18,2);
declare variable CREDITO NUMERIC(18,2);
declare variable NUMITEMS INTEGER;
declare variable ARTICULO VARCHAR(15);
declare variable IMPINC CHAR(1);
declare variable IMPTOS NUMERIC(18, 2);
declare variable SUMA NUMERIC(18,2);
declare variable VRBASE NUMERIC(18,2);
declare variable CUENTAADIC VARCHAR(20);
declare variable BASEADIC VARCHAR(20);
declare variable PORCADIC NUMERIC(5,2);
declare variable VALORADIC NUMERIC(18,2);
declare variable DBADIC CHAR(1);
declare variable PROV CHAR(1);
declare variable ANULADO CHAR(1);
declare variable CENT CHAR(1);
BEGIN
  /* BUSQUE LA INTERFACE */
  EXISTE = 'N';
  SELECT 'S', PREF_PRE, TICO_COD, PRCO_PREF, ININ_BASE, ININ_IVAV, ININ_CONSUMO, ININ_TOTAL, ININ_CTABASE, ININ_CTAIVA, ININ_CTACONSUMO, ININ_CTACIERRE, ININ_CONFIRMAR, ININ_CENTRO, ININ_CODPROY, ININ_CODCENT
    FROM INTERFAZ_INVENTARIO
    WHERE ININ_ID = :IDINTER
    INTO :EXISTE, :PREFIJO, :TIPOCOMP, :PREFCONT, :BASE, :IVAV, :CONSUMO, :TOTAL, :CTABASE, :CTAIVA, :CTACONSUMO, :CTACIERRE, :VER, :CENT, :PROY, :centro;
  if (EXISTE = 'S') then
    BEGIN
    /* TRAIGA EL ENCABEZADO DE LA ENTRADA */
    SELECT PREF_PRE, ENTR_NUMERO, ENTR_FECHA, ENTR_CONC, TERC_NIT, ENTR_IMPTOS, ENTR_ANULADO
        FROM ENTRADAS
        WHERE ENTR_ID = :IDDOC
        INTO :PREFIJO, :NUMERO, :FECAUX, :CONCEPTO, :NIT, :IMPINC, :ANULADO;
    if ((NIT IS NULL) or (NIT = '')) then
        EXECUTE PROCEDURE LEE_CONFIGURACION('CONTABILIDAD', 'GENERAL', 'NIT COMPAÑIA') RETURNING_VALUES (:NIT);
        
    /* BORRE CUALQUEIR CONTABILIZACION PREVIA */
    DELETE FROM CONTABILIZACION WHERE CNTB_TIPOREF = 11 AND CNTB_IDREF = :IDDOC;

    if (ANULADO = 'N') then
        BEGIN
        if (CENT = 'B') then
            SELECT BODE_CENTRO, BODE_PROY FROM BODEGA B, ENTRADAS E
                WHERE B.BODE_COD = E.BODE_COD AND E.ENTR_ID = :IDDOC INTO :CENTRO, :PROY;
        ELSE
          if (CENT = 'P') then
            SELECT PREF_CENTRO, PREF_PROY FROM PREFIJOS P, ENTRADAS E
                WHERE P.PREF_PRE = E.PREF_PRE AND P.TIDO_COD = 11 AND E.ENTR_ID = :IDDOC INTO :CENTRO, :PROY;
        /* CONVIERTA LA FECHA A CADENA */
        EXECUTE PROCEDURE FECHA_A_CONTA(:FECAUX) returning_values (:FECHA);
        IDC = GEN_ID(ID_CONTABILIZA, 1);
        /* REGISTRE EL ENCABEZADO CONTABLE */
        INSERT INTO CONTABILIZACION (CNTB_ID, CNTB_TIPOCOMP, CNTB_PREFCNT, CNTB_NUMERO, CNTB_FECHA, CNTB_CONCEPTO, CNTB_REF, CNTB_TIPOREF, CNTB_IDREF, CNTB_PREFREF, CNTB_NUMREF, CNTB_PROCESADO)
            VALUES (:IDC, :TIPOCOMP, :PREFCONT, :NUMERO, :FECHA, :CONCEPTO, '', 11, :IDDOC, :PREFIJO, :NUMERO, 'N');
        NUMITEMS = 0;
        SUMA = 0;
        ERROR = 0;
        /* PRIMERO LA BASE */
        if (BASE = 'A') then
            BEGIN
            /* SUME LAS BASES DE LOS ARTICULOS DEL DOCUMENTO */
            FOR SELECT MAX(COAR_CTAINV), SUM(CAST(ENDE_CANT AS DOUBLE PRECISION) * ENDE_COSTO), SUM(ENDE_IVAMONTO + (ENDE_CONSUMO * ENDE_CANT * ENDE_FACTOR))
                FROM ARTICULO A, CONTABIL_ARTICULO C, ENTRADAS_DETALLE E
                WHERE E.ENTR_ID = :IDDOC AND E.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD
                GROUP BY COAR_CTAINV
                INTO :CTABASE, :MONTO, :IMPTOS
            DO
            if (MONTO <> 0) then
                BEGIN
                if (IMPINC = 'S') then
                    MONTO = MONTO - IMPTOS;
                VRBASE = MONTO;
                /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :CTABASE INTO :CUENTA, :TIPOCUEN;
                if (CUENTA IS NULL) then
                    begin
                    EXECUTE PROCEDURE ERROR (11, :IDDOC, :CTABASE, 2);
                    CUENTA = CTABASE;
                    ERROR = ERROR + 1;
                    end
                /* DEPENDE DEL TIPO DE CUENTA */
                if ((TIPOCUEN = 'I') or (TIPOCUEN = 'A'))  then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT E.ARTI_COD, (CAST(ENDE_CANT AS DOUBLE PRECISION) * ENDE_COSTO), (ENDE_IVAMONTO + (ENDE_CONSUMO * ENDE_CANT * ENDE_FACTOR))
                        FROM ARTICULO A, CONTABIL_ARTICULO C, ENTRADAS_DETALLE E
                        WHERE E.ENTR_ID = :IDDOC AND E.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTAINV = :CUENTA
                        INTO :ARTICULO, :MONTO, :IMPTOS
                    DO
                        BEGIN
                        if (IMPINC = 'S') then
                            MONTO = MONTO - IMPTOS;
                        IF (MONTO <> 0) THEN
                            BEGIN
                            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                            NUMITEMS = NUMITEMS + 1;
                            SUMA = SUMA + MONTO;
                            END
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (11, :IDDOC, :CUENTA, 4);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    /* INSERTE EL REGISTRO DE LA BASE */
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NUMITEMS = NUMITEMS + 1;
                    SUMA = SUMA + MONTO;
                    END
                END /* FOR */
            END /* BASE */
        if (BASE = 'I') then
            BEGIN
            /* SUME LAS BASES DE LOS ARTICULOS DEL DOCUMENTO */
            FOR SELECT MAX(TAIV_CTAINV), SUM(CAST(ENDE_CANT AS DOUBLE PRECISION) * ENDE_COSTO), SUM(ENDE_IVAMONTO + (ENDE_CONSUMO * ENDE_CANT * ENDE_FACTOR))
                FROM ARTICULO A, TARIFA_IVA I, ENTRADAS_DETALLE E
                WHERE E.ENTR_ID = :IDDOC AND E.ARTI_COD = A.ARTI_COD AND A.TAIV_COD = I.TAIV_COD
                GROUP BY TAIV_CTAINV
                INTO :CTABASE, :MONTO, :IMPTOS
            DO
            if (MONTO <> 0) then
                BEGIN
                if (IMPINC = 'S') then
                    MONTO = MONTO - IMPTOS;
                VRBASE = MONTO;
                /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :CTABASE INTO :CUENTA, :TIPOCUEN;
                if (CUENTA IS NULL) then
                    begin
                    EXECUTE PROCEDURE ERROR (11, :IDDOC, :CTABASE, 2);
                    CUENTA = CTABASE;
                    ERROR = ERROR + 1;
                    end
                /* DEPENDE DEL TIPO DE CUENTA */
                if ((TIPOCUEN = 'I') or (TIPOCUEN = 'A'))  then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT E.ARTI_COD, (CAST(ENDE_CANT AS DOUBLE PRECISION) * ENDE_COSTO), (ENDE_IVAMONTO + (ENDE_CONSUMO * ENDE_CANT * ENDE_FACTOR))
                        FROM ARTICULO A, TARIFA_IVA I, ENTRADAS_DETALLE E
                        WHERE E.ENTR_ID = :IDDOC AND E.ARTI_COD = A.ARTI_COD AND A.TAIV_COD = I.TAIV_COD AND TAIV_CTAINV = :CUENTA
                        INTO :ARTICULO, :MONTO, :IMPTOS
                    DO
                        BEGIN
                        if (IMPINC = 'S') then
                            MONTO = MONTO - IMPTOS;
                        IF (MONTO <> 0) THEN
                            BEGIN
                            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                            NUMITEMS = NUMITEMS + 1;
                            SUMA = SUMA + MONTO;
                            END
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (11, :IDDOC, :CUENTA, 4);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    /* INSERTE EL REGISTRO DE LA BASE */
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NUMITEMS = NUMITEMS + 1;
                    SUMA = SUMA + MONTO;
                    END
                END /* FOR */
            END /* BASE */
        if ((BASE = 'K') or (BASE = 'T')) then
            BEGIN
            CUENTA = :ctabase;
            if (BASE = 'T') then
                BEGIN
                SELECT TERC_PROV, TERC_CTAVENTA FROM TERCEROS WHERE TERC_NIT = :NIT INTO :PROV, :CUENTA;
                if (:PROV = 'S') then
                    SELECT PROV_CTACAUSA FROM PROVEEDORES WHERE TERC_NIT = :NIT INTO :CUENTA;
                END
            /* SUME LAS BASES DE LOS ARTICULOS DEL DOCUMENTO */
            SELECT SUM(CAST(ENDE_CANT AS DOUBLE PRECISION) * ENDE_COSTO), SUM(ENDE_IVAMONTO + (ENDE_CONSUMO * ENDE_CANT * ENDE_FACTOR))
                FROM ENTRADAS_DETALLE E
                WHERE E.ENTR_ID = :IDDOC
                INTO :MONTO, :IMPTOS;
        
            if (MONTO <> 0) then
                BEGIN
                if (IMPINC = 'S') then
                    MONTO = MONTO - IMPTOS;
                /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :CTABASE INTO :CUENTA, :TIPOCUEN;
                if (CUENTA IS NULL) then
                    begin
                    EXECUTE PROCEDURE ERROR (11, :IDDOC, :CTABASE, 2);
                    CUENTA = CTABASE;
                    ERROR = ERROR + 1;
                    end
                /* DEPENDE DEL TIPO DE CUENTA */
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT E.ARTI_COD, (CAST(ENDE_CANT AS DOUBLE PRECISION) * ENDE_COSTO), (ENDE_IVAMONTO + (ENDE_CONSUMO * ENDE_CANT * ENDE_FACTOR))
                        FROM ARTICULO A, CONTABIL_ARTICULO C, ENTRADAS_DETALLE E
                        WHERE E.ENTR_ID = :IDDOC AND E.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTAINV = :CUENTA
                        INTO :ARTICULO, :MONTO, :IMPTOS
                        DO
                        BEGIN
                        if (IMPINC = 'S') then
                            MONTO = MONTO - IMPTOS;
                        IF (MONTO <> 0) Then
                            BEGIN
                            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                            NUMITEMS = NUMITEMS + 1;
                            SUMA = SUMA + MONTO;
                            END
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (11, :IDDOC, :CUENTA, 4);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    /* INSERTE EL REGISTRO DE LA BASE */
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NUMITEMS = NUMITEMS + 1;
                    SUMA = SUMA + MONTO;
                    END
                END
            END /* BASE K O T */
        /* EL IVA  */
        if (IVAV = 'A') then
            BEGIN
            /* SUME LAS BASES DE LOS ARTICULOS DEL DOCUMENTO */
            FOR SELECT MAX(COAR_CTAIVAV), SUM(ENDE_IVAMONTO), SUM(CAST(ENDE_CANT AS DOUBLE PRECISION) * ENDE_COSTO)
                FROM ARTICULO A, CONTABIL_ARTICULO C, ENTRADAS_DETALLE E
                WHERE E.ENTR_ID = :IDDOC AND E.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD
                GROUP BY COAR_CTAIVAV
                INTO :CTAIVA, :IMPTOS, :MONTO
            DO
                BEGIN
                if (IMPINC = 'S') then
                    MONTO = MONTO - IMPTOS;
                if (IMPTOS <> 0) then
                    BEGIN
                    /* TRAIGA LAS CARCATERISTICAS DE LA CUENTA */
                    SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                        WHERE CUEN_COD = :CTAIVA INTO :CUENTA, :TIPOCUEN;
                    if (CUENTA IS NULL) then
                        begin
                        EXECUTE PROCEDURE ERROR (11, :IDDOC, :CTAIVA, 2);
                        CUENTA = CTAIVA;
                        ERROR = ERROR + 1;
                        end
                    /* DEPENDE DEL TIPO DE CUENTA */
                    if (TIPOCUEN = 'I') then
                        BEGIN
                        /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                        FOR SELECT E.ARTI_COD, ENDE_IVAMONTO, (CAST(ENDE_CANT AS DOUBLE PRECISION) * ENDE_COSTO)
                            FROM ARTICULO A, CONTABIL_ARTICULO C, ENTRADAS_DETALLE E
                            WHERE E.ENTR_ID = :IDDOC AND E.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTAIVAV = :CUENTA
                            INTO :ARTICULO, :IMPTOS, :MONTO
                        DO
                            BEGIN
                            if (IMPINC = 'S') then
                                MONTO = MONTO - IMPTOS;
                            if (IMPTOS <> 0) then
                                BEGIN
                                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :IMPTOS, 0, :MONTO, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                                NUMITEMS = NUMITEMS + 1;
                                SUMA = SUMA + IMPTOS;
                                END
                            END
                        END
                    if (TIPOCUEN = 'C') then
                        BEGIN
                        EXECUTE PROCEDURE ERROR (11, :IDDOC, :CUENTA, 4);
                        TIPOCUEN = 'N';
                        ERROR = ERROR + 1;
                        END
                    if (TIPOCUEN = 'N') then
                        BEGIN
                        /* INSERTE EL REGISTRO DEL IVA EN VENTAS */
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :IMPTOS, 0, :MONTO, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NUMITEMS = NUMITEMS + 1;
                        SUMA = SUMA + IMPTOS;
                        END
                    END /* MONTO <> 0 */
                END /* FOR */
            END /* IVA */
        if (IVAV = 'I') then
            BEGIN
            /* SUME LAS BASES DE LOS ARTICULOS DEL DOCUMENTO */
            FOR SELECT MAX(TAIV_CTAIVACMP), SUM(ENDE_IVAMONTO), SUM(CAST(ENDE_CANT AS DOUBLE PRECISION) * ENDE_COSTO)
                FROM ARTICULO A, TARIFA_IVA I, ENTRADAS_DETALLE E
                WHERE E.ENTR_ID = :IDDOC AND E.ARTI_COD = A.ARTI_COD AND A.TAIV_COD = I.TAIV_COD
                GROUP BY TAIV_CTAIVACMP
                INTO :CTAIVA, :IMPTOS, :MONTO
            DO
                BEGIN
                if (IMPINC = 'S') then
                    MONTO = MONTO - IMPTOS;
                if (MONTO <> 0) then
                    BEGIN
                    /* TRAIGA LAS CARCATERISTICAS DE LA CUENTA */
                    SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                        WHERE CUEN_COD = :CTAIVA INTO :CUENTA, :TIPOCUEN;
                    if (CUENTA IS NULL) then
                        begin
                        EXECUTE PROCEDURE ERROR (11, :IDDOC, :CTAIVA, 2);
                        CUENTA = CTAIVA;
                        ERROR = ERROR + 1;
                        end
                    /* DEPENDE DEL TIPO DE CUENTA */
                    if (TIPOCUEN = 'I') then
                        BEGIN
                        /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                        FOR SELECT E.ARTI_COD, ENDE_IVAMONTO, (CAST(ENDE_CANT AS DOUBLE PRECISION) * ENDE_COSTO)
                            FROM ARTICULO A, TARIFA_IVA I, ENTRADAS_DETALLE E
                            WHERE E.ENTR_ID = :IDDOC AND E.ARTI_COD = A.ARTI_COD AND A.TAIV_COD = I.TAIV_COD AND TAIV_CTAIVACMP = :CUENTA
                            INTO :ARTICULO, :IMPTOS, :MONTO
                        DO
                            BEGIN
                            if (IMPINC = 'S') then
                                MONTO = MONTO - IMPTOS;
                            if (MONTO <> 0) then
                                BEGIN
                                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :IMPTOS, 0, :MONTO, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                                NUMITEMS = NUMITEMS + 1;
                                SUMA = SUMA + IMPTOS;
                                END
                            END
                        END
                    if (TIPOCUEN = 'C') then
                        BEGIN
                        EXECUTE PROCEDURE ERROR (11, :IDDOC, :CUENTA, 4);
                        TIPOCUEN = 'N';
                        ERROR = ERROR + 1;
                        END
                    if (TIPOCUEN = 'N') then
                        BEGIN
                        /* INSERTE EL REGISTRO DEL IVA EN VENTAS */
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :IMPTOS, 0, :MONTO, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NUMITEMS = NUMITEMS + 1;
                        SUMA = SUMA + IMPTOS;
                        END
                    END
                END /* FOR */
            END /* IVA */
        if (IVAV = 'K') then
            BEGIN
            /* SUME LAS BASES DE LOS ARTICULOS DEL DOCUMENTO */
            SELECT SUM(ENDE_IVAMONTO), SUM(CAST(ENDE_CANT AS DOUBLE PRECISION) * ENDE_COSTO)
                FROM ENTRADAS_DETALLE E
                WHERE E.ENTR_ID = :IDDOC
                INTO :IMPTOS, :MONTO;
            if (IMPINC = 'S') then
                MONTO = MONTO - IMPTOS;
            if (IMPTOS <> 0) then
                BEGIN
                /* TRAIGA LAS CARCATERISTICAS DE LA CUENTA */
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :CTAIVA INTO :CUENTA, :TIPOCUEN;
                if (CUENTA IS NULL) then
                    begin
                    EXECUTE PROCEDURE ERROR (11, :IDDOC, :CTAIVA, 2);
                    CUENTA = CTABASE;
                    ERROR = ERROR + 1;
                    end
                /* DEPENDE DEL TIPO DE CUENTA */
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT E.ARTI_COD, ENDE_IVAMONTO, (CAST(ENDE_CANT AS DOUBLE PRECISION) * ENDE_COSTO)
                        FROM ARTICULO A, CONTABIL_ARTICULO C, ENTRADAS_DETALLE E
                        WHERE E.ENTR_ID = :IDDOC AND E.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTAIVAV = :CUENTA
                        INTO :ARTICULO, :IMPTOS, :MONTO
                        DO
                        BEGIN
                        if (IMPINC = 'S') then
                            MONTO = MONTO - IMPTOS;
                        if (IMPTOS <> 0) then
                            BEGIN
                            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :IMPTOS, 0, :MONTO, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                            NUMITEMS = NUMITEMS + 1;
                            SUMA = SUMA + IMPTOS;
                            END
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (11, :IDDOC, :CUENTA, 4);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    /* INSERTE EL REGISTRO DEL IVA EN VENTAS */
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :IMPTOS, 0, :MONTO, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NUMITEMS = NUMITEMS + 1;
                    SUMA = SUMA + IMPTOS;
                    END
                END
            END /* IVA K */
        /* EL IMPOCONSUMO */
        if (CONSUMO = 'A') then
            BEGIN
            /* SUME LAS BASES DE LOS ARTICULOS DEL DOCUMENTO */
            FOR SELECT MAX(COAR_CTACONS), SUM(ENDE_CONSUMO * ENDE_CANT * ENDE_FACTOR)
                FROM ARTICULO A, CONTABIL_ARTICULO C, ENTRADAS_DETALLE E
                WHERE E.ENTR_ID = :IDDOC AND E.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD
                GROUP BY COAR_CTACONS
                INTO :CTACONSUMO, :IMPTOS
            DO
                BEGIN
                if (IMPTOS <> 0) then
                    BEGIN
                    /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
                    SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                        WHERE CUEN_COD = :CTACONSUMO INTO :CUENTA, :TIPOCUEN;
                    if (CUENTA IS NULL) then
                        begin
                        EXECUTE PROCEDURE ERROR (11, :IDDOC, :CTACONSUMO, 2);
                        CUENTA = CTABASE;
                        ERROR = ERROR + 1;
                        end
                    /* DEPENDE DEL TIPO DE CUENTA */
                    if (TIPOCUEN = 'I') then
                        BEGIN
                        /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                        FOR SELECT E.ARTI_COD, ENDE_CONSUMO * ENDE_CANT * ENDE_FACTOR
                            FROM ARTICULO A, CONTABIL_ARTICULO C, ENTRADAS_DETALLE E
                            WHERE E.ENTR_ID = :IDDOC AND E.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTACONS = :CUENTA
                            INTO :ARTICULO, :IMPTOS
                        DO
                            BEGIN
                            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                            NUMITEMS = NUMITEMS + 1;
                            SUMA = SUMA + IMPTOS;
                            END
                        END
                    if (TIPOCUEN = 'C') then
                        BEGIN
                        EXECUTE PROCEDURE ERROR (11, :IDDOC, :CUENTA, 4);
                        TIPOCUEN = 'N';
                        ERROR = ERROR + 1;
                        END
                    if (TIPOCUEN = 'N') then
                        BEGIN
                        /* INSERTE EL REGISTRO DE LA BASE */
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NUMITEMS = NUMITEMS + 1;
                        SUMA = SUMA + IMPTOS;
                        END
                    END
                END /* FOR */
            END /* CONSUMO */
        if (CONSUMO = 'K') then
            BEGIN
            /* SUME LAS BASES DE LOS ARTICULOS DEL DOCUMENTO */
            SELECT SUM(ENDE_CONSUMO * ENDE_CANT * ENDE_FACTOR) FROM ENTRADAS_DETALLE E
                WHERE E.ENTR_ID = :IDDOC INTO :IMPTOS;
            if (IMPTOS <> 0) then
                BEGIN
                /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :CTACONSUMO INTO :CUENTA, :TIPOCUEN;
                if (CUENTA IS NULL) then
                    begin
                    EXECUTE PROCEDURE ERROR (11, :IDDOC, :CTACONSUMO, 2);
                    CUENTA = CTACONSUMO;
                    ERROR = ERROR + 1;
                    end
                /* DEPENDE DEL TIPO DE CUENTA */
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT E.ARTI_COD, ENDE_CONSUMO * ENDE_CANT * ENDE_FACTOR
                        FROM ARTICULO A, CONTABIL_ARTICULO C, ENTRADAS_DETALLE E
                        WHERE E.ENTR_ID = :IDDOC AND E.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTACONS = :CUENTA
                        INTO :ARTICULO, :IMPTOS
                        DO
                        BEGIN
                        if (IMPTOS <> 0) then
                            BEGIN
                            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                            NUMITEMS = NUMITEMS + 1;
                            SUMA = SUMA + IMPTOS;
                            END
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (11, :IDDOC, :CUENTA, 4);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    /* INSERTE EL REGISTRO DE LA BASE */
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NUMITEMS = NUMITEMS + 1;
                    SUMA = SUMA + IMPTOS;
                    END
                END
            END /* CONSUMO K */
        /* recorra las cuentas adicionales */
        FOR SELECT INIC_CUENTA, INIC_BASE, INIC_PORC, INIC_VALOR, INIC_DB
            FROM INTERFAZ_INVENTARIO_CTAS
            WHERE ININ_ID = :IDINTER
            INTO :CUENTAADIC, :BASEADIC, :PORCADIC, :VALORADIC, :DBADIC
            DO
            BEGIN
            if (VALORADIC <> 0) then
                MONTO = VALORADIC;
            ELSE
                BEGIN
                if (:BASEADIC = 'SUBTOTAL') then
                    SELECT SUM(CAST(ENDE_CANT AS DOUBLE PRECISION) * (ENDE_COSTO-ENDE_DTOMONTO)) FROM
                        ENTRADAS_DETALLE WHERE ENTR_ID = :iddoc INTO :VALORADIC;
                if (:BASEADIC = 'IVA') then
                    SELECT SUM(ENDE_IVAMONTO) FROM
                        ENTRADAS_DETALLE WHERE ENTR_ID = :iddoc INTO :VALORADIC;
                if (:BASEADIC = 'CONSUMO') then
                    SELECT SUM(ENDE_CONSUMO * ENDE_CANT * ENDE_FACTOR) FROM
                        ENTRADAS_DETALLE WHERE ENTR_ID = :iddoc INTO :VALORADIC;
                if (:BASEADIC = 'TOTAL') then
                    SELECT SUM((CAST(ENDE_CANT AS DOUBLE PRECISION) * (ENDE_COSTO-ENDE_DTOMONTO)) + ENDE_IVAMONTO + (ENDE_CONSUMO * ENDE_CANT * ENDE_FACTOR)) FROM
                        ENTRADAS_DETALLE WHERE ENTR_ID = :iddoc INTO :VALORADIC;
                MONTO = VALORADIC * PORCADIC / 100;
                END
            if (MONTO <> 0) then
                BEGIN
                CUENTA = NULL;
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :CUENTAADIC INTO :CUENTA, :TIPOCUEN;
                if (CUENTA IS NULL) then
                    begin
                    EXECUTE PROCEDURE ERROR (11, :IDDOC, :CUENTAADIC, 2);
                    CUENTA = CUENTAADIC;
                    ERROR = ERROR + 1;
                    end
                /* DEPENDE DEL TIPO DE CUENTA */
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (11, :IDDOC, :CUENTA, 3);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (11, :IDDOC, :CUENTA, 4);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    if (DBADIC = 'S') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTAADIC, :CONCEPTO, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        SUMA = SUMA + MONTO;
                        END
                    ELSE
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTAADIC, :CONCEPTO, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        SUMA = SUMA - MONTO;
                        END
                    NUMITEMS = NUMITEMS + 1;
                    END
                END
            END
        /* CIERRE EL COMPROBANTE CONTRA LA CUENTA DEL TERCERO O LA CONSTANTE */
        if (SUMA <> 0) then
            BEGIN
            if (SUMA > 0) then
                BEGIN
                DEBITO = 0;
                CREDITO = SUMA;
                END
            ELSE
                BEGIN
                DEBITO = SUMA * -1;
                CREDITO = 0;
                END
            if (TOTAL <> 'K') then
                BEGIN
                SELECT TERC_CTAPROV, TERC_PROV
                    FROM TERCEROS WHERE TERC_NIT = :NIT
                    INTO :CTACIERRE, :PROV;
                if (PROV = 'S') then
                    SELECT PROV_CTAPAGAR FROM PROVEEDORES WHERE TERC_NIT = :nit INTO :CUENTA;
                END
            /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTACIERRE INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERROR (24, :IDDOC, :CTACIERRE, 2);
                CUENTA = CTACIERRE;
                ERROR = ERROR + 1;
                end
            /* DEPENDE DEL TIPO DE CUENTA */
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERROR (11, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                EXECUTE PROCEDURE ERROR (11, :IDDOC, :CUENTA, 4);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'N') then
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :DEBITO, :CREDITO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            END /* SUMA */
        if (ERROR > 0) then
            VER = 'S';
        END
      END /* EXISTE LA INTERFAZ */
  ELSE
    BEGIN
    EXECUTE PROCEDURE ERROR (11, :IDDOC, :PREFIJO, 1);
    ERROR = ERROR + 1;
    VER = 'S';
    END
SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE ENTRADAS_SIN_CONTABILIDAD(
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    ID INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    ESTADO VARCHAR(20),
    IDI INTEGER,
    IDC INTEGER)
AS
DECLARE VARIABLE VER CHAR(2);
declare variable FECICNT VARCHAR(10);
declare variable FECFCNT VARCHAR(10);
declare variable ERROR INTEGER;
declare variable idref INTEGER;
BEGIN
EXECUTE PROCEDURE fecha_a_conta(FECINI) returning_values (FECICNT);
EXECUTE PROCEDURE fecha_a_conta(FECFIN) returning_values (FECFCNT);
FOR SELECT ENTR_ID, PREF_PRE, ENTR_NUMERO FROM ENTRADAS WHERE ENTR_ANULADO = 'N' AND
    ENTR_FECHA >= :FECINI AND ENTR_FECHA <= :FECFIN
    INTO :ID, :PREF, :NUMERO
DO
  BEGIN
  idref = null;
  SELECT ENCO_IDREF FROM COMPROBANTE_ENCABEZADO WHERE ENCO_TIPOREF = 11 AND ENCO_FECHA >= :FECICNT AND ENCO_FECHA <= :FECFCNT AND ENCO_IDREF = :id INTO :idref;
  if (idref IS NULL) then
  BEGIN
   ESTADO = 'PROCESANDO';
   SUSPEND;
   SELECT MAX(ININ_ID) FROM INTERFAZ_INVENTARIO WHERE PREF_PRE = :PREF AND TIDO_COD = 11 INTO :IDI;
   EXECUTE PROCEDURE CONTABIL_ENTRADA (:ID, :IDI) RETURNING_VALUES (:ERROR, :VER, :IDC);
   if (ERROR = 0) then
    BEGIN
      EXECUTE PROCEDURE CONTABILIZA_PENDIENTE (:IDC);
      ESTADO = 'OK';
      END
   ELSE
    ESTADO = 'ERROR';
   suspend;
  end
  END
END

^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure CONTABIL_SALIDA (
    IDDOC integer,
    IDINTER integer)
returns (
    ERROR integer,
    VER char(1),
    IDC integer)
AS
declare variable PREFIJO VARCHAR(4);
declare variable NUMERO VARCHAR(6);
declare variable FECAUX DATE;
declare variable FECHA CHAR(8);
declare variable CONCEPTO CHAR(60);
declare variable TIPOCOMP VARCHAR(3);
declare variable PREFCONT VARCHAR(4);
declare variable CTACIERRE VARCHAR(20);
declare variable BASE CHAR(1);
declare variable IVAV CHAR(1);
declare variable CONSUMO CHAR(1);
declare variable TOTAL CHAR(1);
declare variable EXISTE CHAR(1);
declare variable CUENTA VARCHAR(20);
declare variable MONTO NUMERIC(18,2);
declare variable TIPOCUEN CHAR(1);
declare variable NIT VARCHAR(20);
declare variable PROY VARCHAR(4);
declare variable CENTRO VARCHAR(4);
declare variable DEBITO NUMERIC(18,2);
declare variable CREDITO NUMERIC(18,2);
declare variable NUMITEMS INTEGER;
declare variable ARTICULO VARCHAR(15);
declare variable IMPINC CHAR(1);
declare variable IMPTOS NUMERIC(18, 2);
declare variable SUMA NUMERIC(18,2);
declare variable CTABASE VARCHAR(20);
declare variable CTAIVA VARCHAR(20);
declare variable CTACONSUMO VARCHAR(20);
declare variable VRBASE NUMERIC(18,2);
declare variable CUENTAADIC VARCHAR(20);
declare variable BASEADIC VARCHAR(20);
declare variable PORCADIC NUMERIC(5,2);
declare variable VALORADIC NUMERIC(18,2);
declare variable DBADIC CHAR(1);
declare variable PROV CHAR(1);
declare variable ANULADO CHAR(1);
declare variable CENT CHAR(1);
BEGIN
ERROR = 0;
/* BUSQUE LA INTERFACE */
EXISTE = 'N';
SELECT 'S', PREF_PRE, TICO_COD, PRCO_PREF, ININ_BASE, ININ_IVAV, ININ_CONSUMO, ININ_TOTAL, ININ_CTABASE, ININ_CTAIVA, ININ_CTACONSUMO, ININ_CTACIERRE, ININ_CONFIRMAR, ININ_CENTRO, ININ_CODPROY, ININ_CODCENT
    FROM INTERFAZ_INVENTARIO
    WHERE ININ_ID = :IDINTER
    INTO :EXISTE, :PREFIJO, :TIPOCOMP, :PREFCONT, :BASE, :IVAV, :CONSUMO, :TOTAL, :CTABASE, :CTAIVA, :CTACONSUMO, :CTACIERRE, :VER, :CENT, :proy, :centro;
if (EXISTE = 'S') then
    BEGIN
    /* TRAIGA EL ENCABEZADO DE LA SALIDA */
    SELECT PREF_PRE, SALI_NUMERO, SALI_FECHA, SALI_CONC, TERC_NIT, SALI_IMPTOS, SALI_ANULADO
        FROM SALIDAS
        WHERE SALI_ID = :IDDOC
        INTO :PREFIJO, :NUMERO, :FECAUX, :CONCEPTO, :NIT, :IMPINC, :ANULADO;
    if ((NIT IS NULL) or (NIT = '')) then
        EXECUTE PROCEDURE LEE_CONFIGURACION('CONTABILIDAD', 'GENERAL', 'NIT COMPAÑIA') RETURNING_VALUES (:NIT);
    /* BORRE CUALQUEIR CONTABILIZACION PREVIA */
    DELETE FROM CONTABILIZACION WHERE CNTB_TIPOREF = 12 AND CNTB_IDREF = :IDDOC;

    if (ANULADO = 'N') then
        BEGIN
        if (CENT = 'B') then
            SELECT BODE_CENTRO, BODE_PROY FROM BODEGA B, SALIDAS E
                WHERE B.BODE_COD = E.BODE_COD AND E.SALI_ID = :IDDOC INTO :CENTRO, :PROY;
        ELSE
          if (CENT = 'P') then
            SELECT PREF_CENTRO, PREF_PROY FROM PREFIJOS P, SALIDAS E
                WHERE P.PREF_PRE = E.PREF_PRE AND E.SALI_ID = :IDDOC AND P.TIDO_COD = 12 INTO :CENTRO, :PROY;
        /* CONVIERTA LA FECHA A CADENA */
        EXECUTE PROCEDURE FECHA_A_CONTA(:FECAUX) returning_values (:FECHA);
        IDC = GEN_ID(ID_CONTABILIZA, 1);
        /* REGISTRE EL ENCABEZADO CONTABLE */
        INSERT INTO CONTABILIZACION (CNTB_ID, CNTB_TIPOCOMP, CNTB_PREFCNT, CNTB_NUMERO, CNTB_FECHA, CNTB_CONCEPTO, CNTB_REF, CNTB_TIPOREF, CNTB_IDREF, CNTB_PREFREF, CNTB_NUMREF, CNTB_PROCESADO)
            VALUES (:IDC, :TIPOCOMP, :PREFCONT, :NUMERO, :FECHA, :CONCEPTO, '', 12, :IDDOC, :PREFIJO, :NUMERO, 'N');
        NUMITEMS = 0;
        SUMA = 0;
        /* PRIMERO LA BASE */
        if (BASE = 'A') then
            BEGIN
            /* SUME LAS BASES DE LOS ARTICULOS DEL DOCUMENTO */
            FOR SELECT MAX(COAR_CTAINV), SUM(SADE_CANT * SADE_COSTO), SUM(SADE_IVAMONTO + (SADE_CONSUMO*SADE_CANT*SADE_FACTOR))
                FROM ARTICULO A, CONTABIL_ARTICULO C, SALIDAS_DETALLE E
                WHERE E.SALI_ID = :IDDOC AND E.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD
                GROUP BY COAR_CTAINV
                INTO :CTABASE, :MONTO, :IMPTOS
            DO
                BEGIN
                if (IMPINC = 'S') then
                    MONTO = MONTO - IMPTOS;
                VRBASE = MONTO;
                if (MONTO <> 0) then
                    BEGIN
                    /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
                    SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                        WHERE CUEN_COD = :CTABASE INTO :CUENTA, :TIPOCUEN;
                    if (CUENTA IS NULL) then
                        begin
                        EXECUTE PROCEDURE ERROR (12, :IDDOC, :CTABASE, 2);
                        CUENTA = CTABASE;
                        TIPOCUEN = 'N';
                        ERROR = ERROR + 1;
                        end
                    /* DEPENDE DEL TIPO DE CUENTA */
                    if ((TIPOCUEN = 'I') or (TIPOCUEN = 'A')) then
                        BEGIN
                        /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                        FOR SELECT E.ARTI_COD, (SADE_CANT * SADE_COSTO), (SADE_IVAMONTO + (SADE_CONSUMO*SADE_CANT*SADE_FACTOR))
                            FROM ARTICULO A, CONTABIL_ARTICULO C, SALIDAS_DETALLE E
                            WHERE E.SALI_ID = :IDDOC AND E.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTAINV = :CUENTA
                            INTO :ARTICULO, :MONTO, :IMPTOS
                        DO
                            BEGIN
                            if (IMPINC = 'S') then
                                MONTO = MONTO - IMPTOS;
                            if (MONTO <> 0) then
                                BEGIN
                                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                                NUMITEMS = NUMITEMS + 1;
                                SUMA = SUMA - MONTO;
                                END
                            END
                        END
                    if (TIPOCUEN = 'C') then
                        BEGIN
                        EXECUTE PROCEDURE ERROR (12, :IDDOC, :CUENTA, 4);
                        TIPOCUEN = 'N';
                        ERROR = ERROR + 1;
                        END
                    if (TIPOCUEN = 'N') then
                        BEGIN
                        /* INSERTE EL REGISTRO DE LA BASE */
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NUMITEMS = NUMITEMS + 1;
                        SUMA = SUMA - MONTO;
                        END
                    END
                END /* FOR */
            END /* BASE POR ARTICULO */
        if (BASE = 'I') then
            BEGIN
            /* SUME LAS BASES DE LOS ARTICULOS DEL DOCUMENTO */
            FOR SELECT MAX(TAIV_CTAINV), SUM(SADE_CANT * SADE_COSTO), SUM(SADE_IVAMONTO + (SADE_CONSUMO*SADE_CANT*SADE_FACTOR))
                FROM ARTICULO A, TARIFA_IVA I, SALIDAS_DETALLE E
                WHERE E.SALI_ID = :IDDOC AND E.ARTI_COD = A.ARTI_COD AND A.TAIV_COD = I.TAIV_COD
                GROUP BY TAIV_CTAINV
                INTO :CTABASE, :MONTO, :IMPTOS
            DO
                BEGIN
                if (IMPINC = 'S') then
                    MONTO = MONTO - IMPTOS;
                VRBASE = MONTO;
                if (MONTO <> 0) then
                    BEGIN
                    /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
                    SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                        WHERE CUEN_COD = :CTABASE INTO :CUENTA, :TIPOCUEN;
                    if (CUENTA IS NULL) then
                        begin
                        EXECUTE PROCEDURE ERROR (12, :IDDOC, :CTABASE, 2);
                        CUENTA = CTABASE;
                        TIPOCUEN = 'N';
                        ERROR = ERROR + 1;
                        end
                    /* DEPENDE DEL TIPO DE CUENTA */
                    if ((TIPOCUEN = 'I') or (TIPOCUEN = 'A')) then
                        BEGIN
                        /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                        FOR SELECT E.ARTI_COD, (SADE_CANT * SADE_COSTO), (SADE_IVAMONTO + (SADE_CONSUMO*SADE_CANT*SADE_FACTOR))
                            FROM ARTICULO A, TARIFA_IVA I, SALIDAS_DETALLE E
                            WHERE E.SALI_ID = :IDDOC AND E.ARTI_COD = A.ARTI_COD AND A.TAIV_COD = I.TAIV_COD AND TAIV_CTAINV = :CUENTA
                            INTO :ARTICULO, :MONTO, :IMPTOS
                        DO
                            BEGIN
                            if (IMPINC = 'S') then
                                MONTO = MONTO - IMPTOS;
                            if (MONTO <> 0) then
                                BEGIN
                                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                                NUMITEMS = NUMITEMS + 1;
                                SUMA = SUMA - MONTO;
                                END
                            END
                        END
                    if (TIPOCUEN = 'C') then
                        BEGIN
                        EXECUTE PROCEDURE ERROR (12, :IDDOC, :CUENTA, 4);
                        TIPOCUEN = 'N';
                        ERROR = ERROR + 1;
                        END
                    if (TIPOCUEN = 'N') then
                        BEGIN
                        /* INSERTE EL REGISTRO DE LA BASE */
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NUMITEMS = NUMITEMS + 1;
                        SUMA = SUMA - MONTO;
                        END
                    END
                END /* FOR */
            END /* BASE POR IVA */
        if ((BASE = 'K') or (BASE = 'T')) then
            BEGIN
            if (BASE = 'T') then
                BEGIN
                SELECT TERC_PROV, TERC_CTAVENTA FROM TERCEROS WHERE TERC_NIT = :NIT INTO :PROV, :CTABASE;
                if (:PROV = 'S') then
                    SELECT PROV_CTACAUSA FROM PROVEEDORES WHERE TERC_NIT = :NIT INTO :CTABASE;
                END
            /* SUME LAS BASES DE LOS ARTICULOS DEL DOCUMENTO */
            FOR SELECT SUM(SADE_CANT * SADE_COSTO), SUM(SADE_IVAMONTO + (SADE_CONSUMO*SADE_CANT*SADE_FACTOR))
                FROM SALIDAS_DETALLE
                WHERE SALI_ID = :IDDOC
                INTO :MONTO, :IMPTOS
            DO
                BEGIN
                if (IMPINC = 'S') then
                    MONTO = MONTO - IMPTOS;
                VRBASE = MONTO;
                if (MONTO <> 0) then
                    BEGIN
                    /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
                    SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                        WHERE CUEN_COD = :CTABASE INTO :CUENTA, :TIPOCUEN;
                    if (CUENTA IS NULL) then
                        begin
                        EXECUTE PROCEDURE ERROR (12, :IDDOC, :CTABASE, 2);
                        CUENTA = CTABASE;
                        TIPOCUEN = 'N';
                        ERROR = ERROR + 1;
                        end
                    /* DEPENDE DEL TIPO DE CUENTA */
                    if (TIPOCUEN = 'I') then
                        BEGIN
                        /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                        FOR SELECT E.ARTI_COD, (SADE_CANT * SADE_COSTO), (SADE_IVAMONTO + (SADE_CONSUMO*SADE_CANT*SADE_FACTOR))
                            FROM ARTICULO A, CONTABIL_ARTICULO C, SALIDAS_DETALLE E
                            WHERE E.SALI_ID = :IDDOC AND E.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTAINV = :CUENTA
                            INTO :ARTICULO, :MONTO, :IMPTOS
                        DO
                            BEGIN
                            if (IMPINC = 'S') then
                                MONTO = MONTO - IMPTOS;
                            if (MONTO <> 0) then
                                BEGIN
                                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                                NUMITEMS = NUMITEMS + 1;
                                SUMA = SUMA - MONTO;
                                END
                            END
                        END
                    if (TIPOCUEN = 'C') then
                        BEGIN
                        EXECUTE PROCEDURE ERROR (12, :IDDOC, :CUENTA, 4);
                        TIPOCUEN = 'N';
                        ERROR = ERROR + 1;
                        END
                    if (TIPOCUEN = 'N') then
                        BEGIN
                        /* INSERTE EL REGISTRO DE LA BASE */
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NUMITEMS = NUMITEMS + 1;
                        SUMA = SUMA - MONTO;
                        END
                    END
                END /* FOR */
            END /* BASE K O POR TERCERO */
        /* EL IVA EN VENTAS */
        if (IVAV = 'A') then
            BEGIN
            /* SUME LAS BASES DE LOS ARTICULOS DEL DOCUMENTO */
            FOR SELECT MAX(COAR_CTAIVAV), SUM(SADE_IVAMONTO), SUM(SADE_CANT * SADE_COSTO)
                FROM ARTICULO A, CONTABIL_ARTICULO C, SALIDAS_DETALLE E
                WHERE E.SALI_ID = :IDDOC AND E.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD
                GROUP BY COAR_CTAIVAV
                INTO :CTAIVA, :IMPTOS, :MONTO
            DO
                BEGIN
                if (IMPTOS <> 0) then
                    BEGIN
                    /* TRAIGA LAS CARCATERISTICAS DE LA CUENTA */
                    SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                        WHERE CUEN_COD = :CTAIVA INTO :CUENTA, :TIPOCUEN;
                    if (CUENTA IS NULL) then
                        begin
                        EXECUTE PROCEDURE ERROR (12, :IDDOC, :CTAIVA, 2);
                        CUENTA = CTAIVA;
                        TIPOCUEN = 'N';
                        ERROR = ERROR + 1;
                        end
                    if (TIPOCUEN = 'I') then
                        BEGIN
                        /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                        FOR SELECT E.ARTI_COD, SADE_IVAMONTO, (SADE_CANT * SADE_COSTO)
                            FROM ARTICULO A, CONTABIL_ARTICULO C, SALIDAS_DETALLE E
                            WHERE E.SALI_ID = :IDDOC AND E.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTAIVAV = :CUENTA
                            INTO :ARTICULO, :IMPTOS, :MONTO
                        DO
                            BEGIN
                            if (IMPINC = 'S') then
                                MONTO = MONTO - IMPTOS;
                            MONTO = MONTO * -1;
                            if (IMPTOS <> 0) then
                                BEGIN
                                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :IMPTOS, :MONTO, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                                NUMITEMS = NUMITEMS + 1;
                                SUMA = SUMA - IMPTOS;
                                END
                            END
                        END
                    if (TIPOCUEN = 'C') then
                        BEGIN
                        EXECUTE PROCEDURE ERROR (12, :IDDOC, :CUENTA, 4);
                        TIPOCUEN = 'N';
                        ERROR = ERROR + 1;
                        END
                    if (TIPOCUEN = 'N') then
                        BEGIN
                        /* INSERTE EL REGISTRO DEL IVA EN VENTAS */
                        if (IMPINC = 'S') then
                            MONTO = MONTO - IMPTOS;
                        MONTO = MONTO * -1;
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :IMPTOS, :MONTO, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NUMITEMS = NUMITEMS + 1;
                        SUMA = SUMA - IMPTOS;
                        END
                    END
                END /* FOR */
            END /* IVA POR ARTICULO */
        if (IVAV = 'I') then
            BEGIN
            /* SUME LAS BASES DE LOS ARTICULOS DEL DOCUMENTO */
            FOR SELECT MAX(TAIV_CTAIVAVNT), SUM(SADE_IVAMONTO), SUM(SADE_CANT * SADE_COSTO)
                FROM ARTICULO A, TARIFA_IVA I, SALIDAS_DETALLE E
                WHERE E.SALI_ID = :IDDOC AND E.ARTI_COD = A.ARTI_COD AND A.TAIV_COD = I.TAIV_COD
                GROUP BY TAIV_CTAIVAVNT
                INTO :CTAIVA, :IMPTOS, :MONTO
            DO
                BEGIN
                if (IMPTOS <> 0) then
                    BEGIN
                    /* TRAIGA LAS CARCATERISTICAS DE LA CUENTA */
                    SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                        WHERE CUEN_COD = :CTAIVA INTO :CUENTA, :TIPOCUEN;
                    if (CUENTA IS NULL) then
                        begin
                        EXECUTE PROCEDURE ERROR (12, :IDDOC, :CTAIVA, 2);
                        CUENTA = CTAIVA;
                        TIPOCUEN = 'N';
                        ERROR = ERROR + 1;
                        end
                    if (TIPOCUEN = 'I') then
                        BEGIN
                        /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                        FOR SELECT E.ARTI_COD, SADE_IVAMONTO, (SADE_CANT * SADE_COSTO)
                            FROM ARTICULO A, TARIFA_IVA I, SALIDAS_DETALLE E
                            WHERE E.SALI_ID = :IDDOC AND E.ARTI_COD = A.ARTI_COD AND A.TAIV_COD = I.TAIV_COD AND TAIV_CTAIVAVNT = :CUENTA
                            INTO :ARTICULO, :IMPTOS, :MONTO
                        DO
                            BEGIN
                            if (IMPINC = 'S') then
                                MONTO = MONTO - IMPTOS;
                            MONTO = MONTO * -1;
                            if (IMPTOS <> 0) then
                                BEGIN
                                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :IMPTOS, :MONTO, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                                NUMITEMS = NUMITEMS + 1;
                                SUMA = SUMA - IMPTOS;
                                END
                            END
                        END
                    if (TIPOCUEN = 'C') then
                        BEGIN
                        EXECUTE PROCEDURE ERROR (12, :IDDOC, :CUENTA, 4);
                        TIPOCUEN = 'N';
                        ERROR = ERROR + 1;
                        END
                    if (TIPOCUEN = 'N') then
                        BEGIN
                        /* INSERTE EL REGISTRO DEL IVA EN VENTAS */
                        if (IMPINC = 'S') then
                            MONTO = MONTO - IMPTOS;
                        MONTO = MONTO * -1;
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :IMPTOS, :MONTO, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NUMITEMS = NUMITEMS + 1;
                        SUMA = SUMA - IMPTOS;
                        END
                    END
                END /* FOR */
            END /* IVA POR TARIFA */
        if (IVAV = 'K') then
            BEGIN
            /* SUME LAS BASES DE LOS ARTICULOS DEL DOCUMENTO */
            SELECT SUM(SADE_IVAMONTO), SUM(SADE_CANT * SADE_COSTO)
                FROM SALIDAS_DETALLE
                WHERE SALI_ID = :IDDOC
                INTO :IMPTOS, :MONTO;
            if (IMPTOS <> 0) then
                BEGIN
                /* TRAIGA LAS CARCATERISTICAS DE LA CUENTA */
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :CTAIVA INTO :CUENTA, :TIPOCUEN;
                if (CUENTA IS NULL) then
                    begin
                    EXECUTE PROCEDURE ERROR (12, :IDDOC, :CTAIVA, 2);
                    CUENTA = CTAIVA;
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT E.ARTI_COD, SADE_IVAMONTO, (SADE_CANT * SADE_COSTO)
                        FROM ARTICULO A, CONTABIL_ARTICULO C, SALIDAS_DETALLE E
                        WHERE E.SALI_ID = :IDDOC AND E.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTAIVAV = :CUENTA
                        INTO :ARTICULO, :IMPTOS, :MONTO
                        DO
                        BEGIN
                        if (IMPTOS <> 0) then
                            BEGIN
                            if (IMPINC = 'S') then
                                MONTO = MONTO - IMPTOS;
                            MONTO = MONTO * -1;
                            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :IMPTOS, :MONTO, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                            NUMITEMS = NUMITEMS + 1;
                            SUMA = SUMA - IMPTOS;
                            END
                        END
                    END
                if (TIPOCUEN = 'C') then
                        BEGIN
                        EXECUTE PROCEDURE ERROR (12, :IDDOC, :CUENTA, 4);
                        TIPOCUEN = 'N';
                        ERROR = ERROR + 1;
                        END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    /* INSERTE EL REGISTRO DEL IVA EN VENTAS */
                    if (IMPINC = 'S') then
                        MONTO = MONTO - IMPTOS;
                    MONTO = MONTO * -1;
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :IMPTOS, :MONTO, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NUMITEMS = NUMITEMS + 1;
                    SUMA = SUMA - IMPTOS;
                    END
                END
            END /* IVA CONSTANTE */
        /* EL IMPOCONSUMO */
        if (CONSUMO = 'A') then
            BEGIN
            /* SUME LAS BASES DE LOS ARTICULOS DEL DOCUMENTO */
            FOR SELECT MAX(COAR_CTACONS), SUM(SADE_CONSUMO*SADE_CANT*SADE_FACTOR)
                FROM ARTICULO A, CONTABIL_ARTICULO C, SALIDAS_DETALLE E
                WHERE E.SALI_ID = :IDDOC AND E.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD
                GROUP BY COAR_CTACONS
                INTO :CTACONSUMO, :IMPTOS
            DO
                BEGIN
                if (IMPTOS <> 0) then
                    BEGIN
                    /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
                    SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                        WHERE CUEN_COD = :CTACONSUMO INTO :CUENTA, :TIPOCUEN;
                    if (CUENTA IS NULL) then
                        begin
                        EXECUTE PROCEDURE ERROR (12, :IDDOC, :CTACONSUMO, 2);
                        CUENTA = CTACONSUMO;
                        TIPOCUEN = 'N';
                        ERROR = ERROR + 1;
                        end
                    if (TIPOCUEN = 'I') then
                        BEGIN
                        /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                        FOR SELECT E.ARTI_COD, SADE_CONSUMO*SADE_CANT*SADE_FACTOR
                            FROM ARTICULO A, CONTABIL_ARTICULO C, SALIDAS_DETALLE E
                            WHERE E.SALI_ID = :IDDOC AND E.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTACONS = :CUENTA
                            INTO :ARTICULO, :IMPTOS
                            DO
                            if (IMPTOS <> 0) then
                                BEGIN
                                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                                NUMITEMS = NUMITEMS + 1;
                                SUMA = SUMA - IMPTOS;
                                END
                        END
                    if (TIPOCUEN = 'C') then
                        BEGIN
                        EXECUTE PROCEDURE ERROR (12, :IDDOC, :CUENTA, 4);
                        TIPOCUEN = 'N';
                        ERROR = ERROR + 1;
                        END
                    if (TIPOCUEN = 'N') then
                        BEGIN
                        /* INSERTE EL REGISTRO DE LA BASE */
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NUMITEMS = NUMITEMS + 1;
                        SUMA = SUMA - IMPTOS;
                        END
                    END
                END /* FOR */
            END /* CONSUMO POR ARTICULO */
        if (CONSUMO = 'K') then
            BEGIN
            /* SUME LAS BASES DE LOS ARTICULOS DEL DOCUMENTO */
            SELECT SUM(SADE_CONSUMO*SADE_CANT*SADE_FACTOR)
                FROM SALIDAS_DETALLE
                WHERE SALI_ID = :IDDOC
                INTO :IMPTOS;
            if (IMPTOS <> 0) then
                BEGIN
                /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :ctaconsumo INTO :CUENTA, :TIPOCUEN;
                if (CUENTA IS NULL) then
                    begin
                    EXECUTE PROCEDURE ERROR (12, :IDDOC, :CTACONSUMO, 2);
                    CUENTA = CTACONSUMO;
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT E.ARTI_COD, SADE_CONSUMO*SADE_CANT*SADE_FACTOR
                    FROM ARTICULO A, CONTABIL_ARTICULO C, SALIDAS_DETALLE E
                        WHERE E.SALI_ID = :IDDOC AND E.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTACONS = :CUENTA
                        INTO :ARTICULO, :IMPTOS
                        DO
                        if (IMPTOS <> 0) then
                            BEGIN
                            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                            NUMITEMS = NUMITEMS + 1;
                            SUMA = SUMA - IMPTOS;
                            END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (12, :IDDOC, :CUENTA, 4);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    /* INSERTE EL REGISTRO DE LA BASE */
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NUMITEMS = NUMITEMS + 1;
                    SUMA = SUMA - IMPTOS;
                    END
                END
            END /* CONSUMO CONSTANTE */
        /* recorra las cuentas adicionales */
        FOR SELECT INIC_CUENTA, INIC_BASE, INIC_PORC, INIC_VALOR, INIC_DB
            FROM INTERFAZ_INVENTARIO_CTAS
            WHERE ININ_ID = :IDINTER
            INTO :CUENTAADIC, :BASEADIC, :PORCADIC, :VALORADIC, :DBADIC
            DO
            BEGIN
            if (VALORADIC <> 0) then
                MONTO = VALORADIC;
            ELSE
                BEGIN
                if (:BASEADIC = 'SUBTOTAL') then
                    SELECT SUM(SADE_CANT * SADE_COSTO)
                    FROM SALIDAS_DETALLE E
                    WHERE E.SALI_ID = :IDDOC 
                    INTO :VALORADIC;
                if (:BASEADIC = 'IVA') then
                    SELECT SUM(SADE_IVAMONTO)
                    FROM SALIDAS_DETALLE E
                    WHERE E.SALI_ID = :IDDOC 
                    INTO :VALORADIC;
                if (:BASEADIC = 'CONSUMO') then
                    SELECT SUM(SADE_CONSUMO*SADE_CANT*SADE_FACTOR)
                    FROM SALIDAS_DETALLE E
                    WHERE E.SALI_ID = :IDDOC 
                    INTO :VALORADIC;
                MONTO = VALORADIC * PORCADIC / 100;
                END
            if (MONTO <> 0) then
                BEGIN
                /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
                CUENTA = NULL;
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :CUENTAADIC INTO :CUENTA, :TIPOCUEN;
                if (CUENTA IS NULL) then
                    begin
                    EXECUTE PROCEDURE ERROR (12, :IDDOC, :CUENTAADIC, 2);
                    CUENTA = CUENTAADIC;
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (12, :IDDOC, :CUENTA, 3);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (12, :IDDOC, :CUENTA, 4);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    if (DBADIC = 'S') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTAADIC, :CONCEPTO, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        SUMA = SUMA + MONTO;
                        END
                    ELSE
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTAADIC, :CONCEPTO, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        SUMA = SUMA - MONTO;
                        END
                    NUMITEMS = NUMITEMS + 1;
                    END
                END
            END
        /* CIERRE EL COMPROBANTE  */
        if (SUMA <> 0) then
            BEGIN
            if (SUMA > 0) then
                BEGIN
                DEBITO = 0;
                CREDITO = SUMA;
                END
            ELSE    
                BEGIN
                DEBITO = SUMA * -1;
                CREDITO = 0;
                END
            if ((TOTAL = 'K') or (TOTAL = 'T')) then
                BEGIN
                if (TOTAL = 'T') then
                    BEGIN
                    SELECT TERC_CTAPROV, TERC_PROV
                        FROM TERCEROS WHERE TERC_NIT = :NIT
                        INTO :CTACIERRE, :PROV;
                    if (PROV = 'S') then
                        SELECT PROV_CTAPAGAR FROM PROVEEDORES WHERE TERC_NIT = :nit
                        INTO :CTACIERRE;
                    END
                /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :CTACIERRE INTO :CUENTA, :TIPOCUEN;
                if (CUENTA IS NULL) then
                    begin
                    EXECUTE PROCEDURE ERROR (12, :IDDOC, :CTACIERRE, 2);
                    CUENTA = CTACIERRE;
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (12, :IDDOC, :CUENTA, 3);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (12, :IDDOC, :CUENTA, 4);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'N') then
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :DEBITO, :CREDITO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                END
            END /* SUMA */
        if (ERROR > 0) then
            VER = 'S';
        SUSPEND;
        END /* NO ANULADO */
    END /* EXISTE LA INTERFAZ */
ELSE
    BEGIN
    EXECUTE PROCEDURE ERROR (12, :IDDOC, :PREFIJO, 1);
    ERROR = ERROR + 1;
    VER = 'S';
    SUSPEND;
    END
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE SALIDAS_SIN_CONTABILIDAD(
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    ID INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    ESTADO VARCHAR(20),
    IDI INTEGER,
    IDC INTEGER)
AS
DECLARE VARIABLE VER CHAR(2);
declare variable FECICNT VARCHAR(10);
declare variable FECFCNT VARCHAR(10);
declare variable ERROR INTEGER;
declare variable idref INTEGER;
BEGIN
EXECUTE PROCEDURE fecha_a_conta(FECINI) returning_values (FECICNT);
EXECUTE PROCEDURE fecha_a_conta(FECFIN) returning_values (FECFCNT);
FOR SELECT SALI_ID, PREF_PRE, SALI_NUMERO FROM SALIDAS WHERE SALI_ANULADO = 'N' AND
    SALI_FECHA >= :FECINI AND SALI_FECHA <= :FECFIN
    INTO :ID, :PREF, :NUMERO
DO
  BEGIN
  idref = null;
  SELECT ENCO_IDREF FROM COMPROBANTE_ENCABEZADO WHERE ENCO_TIPOREF = 12 AND ENCO_FECHA >= :FECICNT AND ENCO_FECHA <= :FECFCNT and ENCO_IDREF = :id into :idref;
  if (idref IS NULL) then
  begin
  ESTADO = 'PROCESANDO';
  SUSPEND;
  SELECT MAX(ININ_ID) FROM INTERFAZ_INVENTARIO WHERE PREF_PRE = :PREF AND TIDO_COD = 12 INTO :IDI;
  EXECUTE PROCEDURE CONTABIL_SALIDA (:ID, :IDI) RETURNING_VALUES (:ERROR, :VER, :IDC);
  if (ERROR = 0) then
    BEGIN
      EXECUTE PROCEDURE CONTABILIZA_PENDIENTE (:IDC);
      ESTADO = 'OK';
      END
  ELSE
    ESTADO = 'ERROR';
  suspend;
  end
  END
END

^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure CONTABIL_TRASLAMERCANCIA (
    IDDOC integer,
    IDINTER integer)
returns (
    ERROR integer,
    VER char(1),
    IDC integer)
AS
declare variable PREFIJO VARCHAR(4);
declare variable NUMERO VARCHAR(6);
declare variable FECAUX DATE;
declare variable FECHA CHAR(8);
declare variable CONCEPTO CHAR(60);
declare variable TIPOCOMP VARCHAR(3);
declare variable PREFCONT VARCHAR(4);
declare variable CTACIERRE VARCHAR(20);
declare variable BASE CHAR(1);
declare variable IVAV CHAR(1);
declare variable CONSUMO CHAR(1);
declare variable TOTAL CHAR(1);
declare variable EXISTE CHAR(1);
declare variable CUENTA VARCHAR(20);
declare variable MONTO NUMERIC(18,2);
declare variable TIPOCUEN CHAR(1);
declare variable NIT VARCHAR(20);
declare variable PROY VARCHAR(4);
declare variable CENTRO VARCHAR(4);
declare variable PROYDES VARCHAR(4);
declare variable CENTRODES VARCHAR(4);
declare variable DEBITO NUMERIC(18,2);
declare variable CREDITO NUMERIC(18,2);
declare variable DEBITODES NUMERIC(18,2);
declare variable CREDITODES NUMERIC(18,2);
declare variable NUMITEMS INTEGER;
declare variable ARTICULO VARCHAR(15);
declare variable IMPINC CHAR(1);
declare variable IMPTOS NUMERIC(18, 2);
declare variable SUMA NUMERIC(18,2);
declare variable SUMADES NUMERIC(18,2);
declare variable CTABASE VARCHAR(20);
declare variable CTAIVA VARCHAR(20);
declare variable CTACONSUMO VARCHAR(20);
declare variable VRBASE NUMERIC(18,2);
declare variable CUENTAADIC VARCHAR(20);
declare variable BASEADIC VARCHAR(20);
declare variable PORCADIC NUMERIC(5,2);
declare variable VALORADIC NUMERIC(18,2);
declare variable DBADIC CHAR(1);
declare variable PROV CHAR(1);
declare variable ANULADO CHAR(1);
declare variable CENT CHAR(1);
BEGIN
ERROR = 0;
/* BUSQUE LA INTERFACE */
EXISTE = 'N';
SELECT 'S', PREF_PRE, TICO_COD, PRCO_PREF, ININ_BASE, ININ_IVAV, ININ_CONSUMO, ININ_TOTAL, ININ_CTABASE, ININ_CTAIVA, ININ_CTACONSUMO, ININ_CTACIERRE, ININ_CONFIRMAR, ININ_CENTRO, ININ_CODPROY, ININ_CODCENT
    FROM INTERFAZ_INVENTARIO
    WHERE ININ_ID = :IDINTER
    INTO :EXISTE, :PREFIJO, :TIPOCOMP, :PREFCONT, :BASE, :IVAV, :CONSUMO, :TOTAL, :CTABASE, :CTAIVA, :CTACONSUMO, :CTACIERRE, :VER, :CENT, :PROYDES, :CENTRODES;
if (EXISTE = 'S') then
    BEGIN
    /* TRAIGA EL ENCABEZADO DE LA SALIDA */
    SELECT PREF_PRE, TRAN_NUMERO, TRAN_FECHA, TRAN_CONC, TERC_NIT, TRAN_IMPTOS, TRAN_ANULADO
        FROM TRASFERENCIAS
        WHERE TRAN_ID = :IDDOC
        INTO :PREFIJO, :NUMERO, :FECAUX, :CONCEPTO, :NIT, :IMPINC, :ANULADO;
    /* BORRE CUALQUEIR CONTABILIZACION PREVIA */
    DELETE FROM CONTABILIZACION WHERE CNTB_TIPOREF = 13 AND CNTB_IDREF = :IDDOC;

    if (ANULADO = 'N') then
        BEGIN
        if (CENT = 'B') then
          BEGIN
            SELECT BODE_CENTRO, BODE_PROY FROM BODEGA B, TRASFERENCIAS E
                WHERE B.BODE_COD = E.BODE_COD AND E.tran_id = :IDDOC INTO :CENTRO, :PROY;
            SELECT BODE_CENTRO, BODE_PROY FROM BODEGA B, TRASFERENCIAS E
                WHERE B.BODE_COD = E.TRAN_BODDES AND E.tran_id = :IDDOC INTO :CENTRODES, :PROYDES;
          END
        ELSE
          if (CENT = 'P') then
            BEGIN
            SELECT PREF_CENTRO, PREF_PROY FROM PREFIJOS P, TRASFERENCIAS E
                WHERE P.PREF_PRE = E.PREF_PRE AND E.TRAN_ID = :IDDOC AND P.TIDO_COD = 13 INTO :CENTRO, :PROY;
            SELECT PREF_CENTRO, PREF_PROY FROM PREFIJOS P, TRASFERENCIAS E
                WHERE P.PREF_PRE = E.PREF_PRE AND E.TRAN_ID = :IDDOC AND P.TIDO_COD = 13 INTO :CENTRODES, :PROYDES;
            END
          ELSE
            BEGIN
            SELECT BODE_CENTRO, BODE_PROY FROM BODEGA B, TRASFERENCIAS E
                WHERE B.BODE_COD = E.BODE_COD AND E.tran_id = :IDDOC INTO :CENTRO, :PROY;
            END
        /* CONVIERTA LA FECHA A CADENA */
        EXECUTE PROCEDURE FECHA_A_CONTA(:FECAUX) returning_values (:FECHA);
        IDC = GEN_ID(ID_CONTABILIZA, 1);
        /* REGISTRE EL ENCABEZADO CONTABLE */
        INSERT INTO CONTABILIZACION (CNTB_ID, CNTB_TIPOCOMP, CNTB_PREFCNT, CNTB_NUMERO, CNTB_FECHA, CNTB_CONCEPTO, CNTB_REF, CNTB_TIPOREF, CNTB_IDREF, CNTB_PREFREF, CNTB_NUMREF, CNTB_PROCESADO)
            VALUES (:IDC, :TIPOCOMP, :PREFCONT, :NUMERO, :FECHA, :CONCEPTO, '', 13, :IDDOC, :PREFIJO, :NUMERO, 'N');
        NUMITEMS = 0;
        SUMA = 0;
        SUMADES = 0;
        ERROR = 0;
        /* PRIMERO LA BASE */
        if (BASE = 'A') then
            BEGIN
            /* SUME LAS BASES DE LOS ARTICULOS DEL DOCUMENTO */
            FOR SELECT MAX(COAR_CTAINV), SUM(TRAS_CANT * TRAS_COSTO), SUM(TRAS_IVAMONTO + (TRAS_CONSUMO*TRAS_CANT*TRAS_FACTOR))
                FROM ARTICULO A, CONTABIL_ARTICULO C, TRASFERENCIAS_DETALLE E
                WHERE E.TRAN_ID = :IDDOC AND E.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD
                GROUP BY COAR_CTAINV
                INTO :CTABASE, :MONTO, :IMPTOS
            DO
                BEGIN
                if (IMPINC = 'S') then
                    MONTO = MONTO - IMPTOS;
                VRBASE = MONTO;
                if (MONTO <> 0) then
                    BEGIN
                    /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
                    SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                        WHERE CUEN_COD = :CTABASE INTO :CUENTA, :TIPOCUEN;
                    if (CUENTA IS NULL) then
                        begin
                        EXECUTE PROCEDURE ERROR (13, :IDDOC, :CTABASE, 2);
                        CUENTA = CTABASE;
                        TIPOCUEN = 'N';
                        ERROR = ERROR + 1;
                        end
                    /* DEPENDE DEL TIPO DE CUENTA */
                    if ((TIPOCUEN = 'I') or (TIPOCUEN = 'A')) then
                        BEGIN
                        /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                        FOR SELECT E.ARTI_COD, (TRAS_CANT * TRAS_COSTO), (TRAS_IVAMONTO + (TRAS_CONSUMO*TRAS_CANT*TRAS_FACTOR))
                            FROM ARTICULO A, CONTABIL_ARTICULO C, TRASFERENCIAS_DETALLE E
                            WHERE E.TRAN_ID = :IDDOC AND E.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTAINV = :CUENTA
                            INTO :ARTICULO, :MONTO, :IMPTOS
                        DO
                            BEGIN
                            if (IMPINC = 'S') then
                                MONTO = MONTO - IMPTOS;
                            if (MONTO <> 0) then
                                BEGIN
                                /*PRIMERO LA SALIDA*/
                                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                                NUMITEMS = NUMITEMS + 1;
                                SUMA = SUMA - MONTO;
                                /*AHORA LA ENTRADA*/
                                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROYDES, :CENTRODES, NULL, NULL, NULL, :ARTICULO, 0, 0);
                                SUMADES = SUMADES + MONTO;
                                NUMITEMS = NUMITEMS + 1;
                                END
                            END
                        END
                    if (TIPOCUEN = 'C') then
                        BEGIN
                        EXECUTE PROCEDURE ERROR (13, :IDDOC, :CUENTA, 4);
                        TIPOCUEN = 'N';
                        ERROR = ERROR + 1;
                        END
                    if (TIPOCUEN = 'N') then
                        BEGIN
                        /* INSERTE EL REGISTRO DE LA BASE */
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NUMITEMS = NUMITEMS + 1;
                        SUMA = SUMA - MONTO;
                                /*AHORA LA ENTRADA*/
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                          VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROYDES, :CENTRODES, NULL, NULL, NULL, :ARTICULO, 0, 0);
                        SUMADES = SUMADES + MONTO;
                        NUMITEMS = NUMITEMS + 1;
                        END
                    END
                END /* FOR */
            END /* BASE POR ARTICULO */
        if (BASE = 'I') then
            BEGIN
            /* SUME LAS BASES DE LOS ARTICULOS DEL DOCUMENTO */
            FOR SELECT MAX(TAIV_CTAINV), SUM(TRAS_CANT * TRAS_COSTO), SUM(TRAS_IVAMONTO + (TRAS_CONSUMO*TRAS_CANT*TRAS_FACTOR))
                FROM ARTICULO A, TARIFA_IVA I, TRASFERENCIAS_DETALLE E
                WHERE E.TRAN_ID = :IDDOC AND E.ARTI_COD = A.ARTI_COD AND A.TAIV_COD = I.TAIV_COD
                GROUP BY TAIV_CTAINV
                INTO :CTABASE, :MONTO, :IMPTOS
            DO
                BEGIN
                if (IMPINC = 'S') then
                    MONTO = MONTO - IMPTOS;
                VRBASE = MONTO;
                if (MONTO <> 0) then
                    BEGIN
                    /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
                    SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                        WHERE CUEN_COD = :CTABASE INTO :CUENTA, :TIPOCUEN;
                    if (CUENTA IS NULL) then
                        begin
                        EXECUTE PROCEDURE ERROR (13, :IDDOC, :CTABASE, 2);
                        CUENTA = CTABASE;
                        TIPOCUEN = 'N';
                        ERROR = ERROR + 1;
                        end
                    /* DEPENDE DEL TIPO DE CUENTA */
                    if ((TIPOCUEN = 'I') or (TIPOCUEN = 'A')) then
                        BEGIN
                        /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                        FOR SELECT E.ARTI_COD, (TRAS_CANT * TRAS_COSTO), (TRAS_IVAMONTO + (TRAS_CONSUMO*TRAS_CANT*TRAS_FACTOR))
                            FROM ARTICULO A, TARIFA_IVA I, TRASFERENCIAS_DETALLE E
                            WHERE E.TRAN_ID = :IDDOC AND E.ARTI_COD = A.ARTI_COD AND A.TAIV_COD = I.TAIV_COD AND TAIV_CTAINV = :CUENTA
                            INTO :ARTICULO, :MONTO, :IMPTOS
                        DO
                            BEGIN
                            if (IMPINC = 'S') then
                                MONTO = MONTO - IMPTOS;
                            if (MONTO <> 0) then
                                BEGIN
                                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                                NUMITEMS = NUMITEMS + 1;
                                SUMA = SUMA - MONTO;
                                /*AHORA LA ENTRADA*/
                                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                  VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROYDES, :CENTRODES, NULL, NULL, NULL, :ARTICULO, 0, 0);
                                SUMADES = SUMADES + MONTO;
                                NUMITEMS = NUMITEMS + 1;
                                END
                            END
                        END
                    if (TIPOCUEN = 'C') then
                        BEGIN
                        EXECUTE PROCEDURE ERROR (13, :IDDOC, :CUENTA, 4);
                        TIPOCUEN = 'N';
                        ERROR = ERROR + 1;
                        END
                    if (TIPOCUEN = 'N') then
                        BEGIN
                        /* INSERTE EL REGISTRO DE LA BASE */
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NUMITEMS = NUMITEMS + 1;
                        SUMA = SUMA - MONTO;
                        /*AHORA LA ENTRADA*/
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROYDES, :CENTRODES, NULL, NULL, NULL, :ARTICULO, 0, 0);
                        SUMADES = SUMADES + MONTO;
                        NUMITEMS = NUMITEMS + 1;
                        END
                    END
                END /* FOR */
            END /* BASE POR IVA */
        if ((BASE = 'K') or (BASE = 'T')) then
            BEGIN
            if (BASE = 'T') then
                BEGIN
                SELECT TERC_PROV, TERC_CTAVENTA FROM TERCEROS WHERE TERC_NIT = :NIT INTO :PROV, :CTABASE;
                if (:PROV = 'S') then
                    SELECT PROV_CTACAUSA FROM PROVEEDORES WHERE TERC_NIT = :NIT INTO :CTABASE;
                END
            /* SUME LAS BASES DE LOS ARTICULOS DEL DOCUMENTO */
            FOR SELECT SUM(TRAS_CANT * TRAS_COSTO), SUM(TRAS_IVAMONTO + (TRAS_CONSUMO*TRAS_CANT*TRAS_FACTOR))
                FROM TRASFERENCIAS_DETALLE
                WHERE TRAN_ID = :IDDOC
                INTO :MONTO, :IMPTOS
            DO
                BEGIN
                if (IMPINC = 'S') then
                    MONTO = MONTO - IMPTOS;
                VRBASE = MONTO;
                if (MONTO <> 0) then
                    BEGIN
                    /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
                    SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                        WHERE CUEN_COD = :CTABASE INTO :CUENTA, :TIPOCUEN;
                    if (CUENTA IS NULL) then
                        begin
                        EXECUTE PROCEDURE ERROR (13, :IDDOC, :CTABASE, 2);
                        CUENTA = CTABASE;
                        TIPOCUEN = 'N';
                        ERROR = ERROR + 1;
                        end
                    /* DEPENDE DEL TIPO DE CUENTA */
                    if (TIPOCUEN = 'I') then
                        BEGIN
                        /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                        FOR SELECT E.ARTI_COD, (TRAS_CANT * TRAS_COSTO), (TRAS_IVAMONTO + (TRAS_CONSUMO*TRAS_CANT*TRAS_FACTOR))
                            FROM ARTICULO A, CONTABIL_ARTICULO C, TRASFERENCIAS_DETALLE E
                            WHERE E.TRAN_ID = :IDDOC AND E.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTAINV = :CUENTA
                            INTO :ARTICULO, :MONTO, :IMPTOS
                        DO
                            BEGIN
                            if (IMPINC = 'S') then
                                MONTO = MONTO - IMPTOS;
                            if (MONTO <> 0) then
                                BEGIN
                                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                                NUMITEMS = NUMITEMS + 1;
                                SUMA = SUMA - MONTO;
                                /*AHORA LA ENTRADA*/
                                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                  VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROYDES, :CENTRODES, NULL, NULL, NULL, :ARTICULO, 0, 0);
                                SUMADES = SUMADES + MONTO;
                                NUMITEMS = NUMITEMS + 1;
                                END
                            END
                        END
                    if (TIPOCUEN = 'C') then
                        BEGIN
                        EXECUTE PROCEDURE ERROR (13, :IDDOC, :CUENTA, 4);
                        TIPOCUEN = 'N';
                        ERROR = ERROR + 1;
                        END
                    if (TIPOCUEN = 'N') then
                        BEGIN
                        /* INSERTE EL REGISTRO DE LA BASE */
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NUMITEMS = NUMITEMS + 1;
                        SUMA = SUMA - MONTO;
                        /*AHORA LA ENTRADA*/
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROYDES, :CENTRODES, NULL, NULL, NULL, :ARTICULO, 0, 0);
                        SUMADES = SUMADES + MONTO;
                        NUMITEMS = NUMITEMS + 1;
                        END
                    END
                END /* FOR */
            END /* BASE K O POR TERCERO */
        /* EL IVA EN VENTAS */
        if (IVAV = 'A') then
            BEGIN
            /* SUME LAS BASES DE LOS ARTICULOS DEL DOCUMENTO */
            FOR SELECT MAX(COAR_CTAIVAV), SUM(TRAS_IVAMONTO), SUM(TRAS_CANT * TRAS_COSTO)
                FROM ARTICULO A, CONTABIL_ARTICULO C, TRASFERENCIAS_DETALLE E
                WHERE E.TRAN_ID = :IDDOC AND E.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD
                GROUP BY COAR_CTAIVAV
                INTO :CTAIVA, :IMPTOS, :MONTO
            DO
                BEGIN
                if (IMPTOS <> 0) then
                    BEGIN
                    /* TRAIGA LAS CARCATERISTICAS DE LA CUENTA */
                    SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                        WHERE CUEN_COD = :CTAIVA INTO :CUENTA, :TIPOCUEN;
                    if (CUENTA IS NULL) then
                        begin
                        EXECUTE PROCEDURE ERROR (13, :IDDOC, :CTAIVA, 2);
                        CUENTA = CTAIVA;
                        TIPOCUEN = 'N';
                        ERROR = ERROR + 1;
                        end
                    if (TIPOCUEN = 'I') then
                        BEGIN
                        /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                        FOR SELECT E.ARTI_COD, TRAS_IVAMONTO, (TRAS_CANT * TRAS_COSTO)
                            FROM ARTICULO A, CONTABIL_ARTICULO C, TRASFERENCIAS_DETALLE E
                            WHERE E.TRAN_ID = :IDDOC AND E.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTAIVAV = :CUENTA
                            INTO :ARTICULO, :IMPTOS, :MONTO
                        DO
                            BEGIN
                            if (IMPINC = 'S') then
                                MONTO = MONTO - IMPTOS;
                            /*MONTO = MONTO * -1; */
                            if (IMPTOS <> 0) then
                                BEGIN
                                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :IMPTOS, (:MONTO * -1), 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                                NUMITEMS = NUMITEMS + 1;
                                SUMA = SUMA - IMPTOS;
                                /*AHORA LA ENTRADA*/
                                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                  VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :IMPTOS, 0,:MONTO, 0, :NIT, :PROYDES, :CENTRODES, NULL, NULL, NULL, :ARTICULO, 0, 0);
                                SUMADES = SUMADES + MONTO;
                                NUMITEMS = NUMITEMS + 1;
                                END
                            END
                        END
                    if (TIPOCUEN = 'C') then
                        BEGIN
                        EXECUTE PROCEDURE ERROR (13, :IDDOC, :CUENTA, 4);
                        TIPOCUEN = 'N';
                        ERROR = ERROR + 1;
                        END
                    if (TIPOCUEN = 'N') then
                        BEGIN
                        /* INSERTE EL REGISTRO DEL IVA EN VENTAS */
                        if (IMPINC = 'S') then
                            MONTO = MONTO - IMPTOS;
                        /*MONTO = MONTO * -1;*/
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :IMPTOS, (:MONTO *-1), 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NUMITEMS = NUMITEMS + 1;
                        SUMA = SUMA - IMPTOS;
                        /*AHORA LA ENTRADA*/
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :IMPTOS, 0,:MONTO, 0, :NIT, :PROYDES, :CENTRODES, NULL, NULL, NULL, :ARTICULO, 0, 0);
                        SUMADES = SUMADES + MONTO;
                        NUMITEMS = NUMITEMS + 1;
                        END
                    END
                END /* FOR */
            END /* IVA POR ARTICULO */
        if (IVAV = 'I') then
            BEGIN
            /* SUME LAS BASES DE LOS ARTICULOS DEL DOCUMENTO */
            FOR SELECT MAX(TAIV_CTAIVAVNT), SUM(TRAS_IVAMONTO), SUM(TRAS_CANT * TRAS_COSTO)
                FROM ARTICULO A, TARIFA_IVA I, TRASFERENCIAS_DETALLE E
                WHERE E.TRAN_ID = :IDDOC AND E.ARTI_COD = A.ARTI_COD AND A.TAIV_COD = I.TAIV_COD
                GROUP BY TAIV_CTAIVAVNT
                INTO :CTAIVA, :IMPTOS, :MONTO
            DO
                BEGIN
                if (IMPTOS <> 0) then
                    BEGIN
                    /* TRAIGA LAS CARCATERISTICAS DE LA CUENTA */
                    SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                        WHERE CUEN_COD = :CTAIVA INTO :CUENTA, :TIPOCUEN;
                    if (CUENTA IS NULL) then
                        begin
                        EXECUTE PROCEDURE ERROR (13, :IDDOC, :CTAIVA, 2);
                        CUENTA = CTAIVA;
                        TIPOCUEN = 'N';
                        ERROR = ERROR + 1;
                        end
                    if (TIPOCUEN = 'I') then
                        BEGIN
                        /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                        FOR SELECT E.ARTI_COD, TRAS_IVAMONTO, (TRAS_CANT * TRAS_COSTO)
                            FROM ARTICULO A, TARIFA_IVA I, TRASFERENCIAS_DETALLE E
                            WHERE E.TRAN_ID = :IDDOC AND E.ARTI_COD = A.ARTI_COD AND A.TAIV_COD = I.TAIV_COD AND TAIV_CTAIVAVNT = :CUENTA
                            INTO :ARTICULO, :IMPTOS, :MONTO
                        DO
                            BEGIN
                            if (IMPINC = 'S') then
                                MONTO = MONTO - IMPTOS;
                            /*MONTO = MONTO * -1; */
                            if (IMPTOS <> 0) then
                                BEGIN
                                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :IMPTOS, (:MONTO * -1), 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                                NUMITEMS = NUMITEMS + 1;
                                SUMA = SUMA - IMPTOS;
                                /*AHORA LA ENTRADA*/
                                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                  VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :IMPTOS, 0,:MONTO, 0, :NIT, :PROYDES, :CENTRODES, NULL, NULL, NULL, :ARTICULO, 0, 0);
                                SUMADES = SUMADES + MONTO;
                                NUMITEMS = NUMITEMS + 1;
                                END
                            END
                        END
                    if (TIPOCUEN = 'C') then
                        BEGIN
                        EXECUTE PROCEDURE ERROR (13, :IDDOC, :CUENTA, 4);
                        TIPOCUEN = 'N';
                        ERROR = ERROR + 1;
                        END
                    if (TIPOCUEN = 'N') then
                        BEGIN
                        /* INSERTE EL REGISTRO DEL IVA EN VENTAS */
                        if (IMPINC = 'S') then
                            MONTO = MONTO - IMPTOS;
                        /*MONTO = MONTO * -1;*/
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :IMPTOS, (:MONTO * -1), 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NUMITEMS = NUMITEMS + 1;
                        SUMA = SUMA - IMPTOS;
                        /*AHORA LA ENTRADA*/
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :IMPTOS, 0,:MONTO, 0, :NIT, :PROYDES, :CENTRODES, NULL, NULL, NULL, :ARTICULO, 0, 0);
                        SUMADES = SUMADES + MONTO;
                        NUMITEMS = NUMITEMS + 1;
                        END
                    END
                END /* FOR */
            END /* IVA POR TARIFA */
        if (IVAV = 'K') then
            BEGIN
            /* SUME LAS BASES DE LOS ARTICULOS DEL DOCUMENTO */
            SELECT SUM(TRAS_IVAMONTO), SUM(TRAS_CANT * TRAS_COSTO)
                FROM TRASFERENCIAS_DETALLE
                WHERE TRAN_ID = :IDDOC
                INTO :IMPTOS, :MONTO;
            if (IMPTOS <> 0) then
                BEGIN
                /* TRAIGA LAS CARCATERISTICAS DE LA CUENTA */
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :CTAIVA INTO :CUENTA, :TIPOCUEN;
                if (CUENTA IS NULL) then
                    begin
                    EXECUTE PROCEDURE ERROR (13, :IDDOC, :CTAIVA, 2);
                    CUENTA = CTAIVA;
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT E.ARTI_COD, TRAS_IVAMONTO, (TRAS_CANT * TRAS_COSTO)
                        FROM ARTICULO A, CONTABIL_ARTICULO C, TRASFERENCIAS_DETALLE E
                        WHERE E.TRAN_ID = :IDDOC AND E.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTAIVAV = :CUENTA
                        INTO :ARTICULO, :IMPTOS, :MONTO
                        DO
                        BEGIN
                        if (IMPTOS <> 0) then
                            BEGIN
                            if (IMPINC = 'S') then
                                MONTO = MONTO - IMPTOS;
                            /*MONTO = MONTO * -1;*/
                            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :IMPTOS, (:MONTO * -1), 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                            NUMITEMS = NUMITEMS + 1;
                            SUMA = SUMA - IMPTOS;
                            /*AHORA LA ENTRADA*/
                            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                              VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :IMPTOS, 0,:MONTO, 0, :NIT, :PROYDES, :CENTRODES, NULL, NULL, NULL, :ARTICULO, 0, 0);
                            SUMADES = SUMADES + MONTO;
                            NUMITEMS = NUMITEMS + 1;
                            END
                        END
                    END
                if (TIPOCUEN = 'C') then
                        BEGIN
                        EXECUTE PROCEDURE ERROR (13, :IDDOC, :CUENTA, 4);
                        TIPOCUEN = 'N';
                        ERROR = ERROR + 1;
                        END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    /* INSERTE EL REGISTRO DEL IVA EN VENTAS */
                    if (IMPINC = 'S') then
                        MONTO = MONTO - IMPTOS;
                    /*MONTO = MONTO * -1;*/
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :IMPTOS, (:MONTO * -1), 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NUMITEMS = NUMITEMS + 1;
                    SUMA = SUMA - IMPTOS;
                    /*AHORA LA ENTRADA*/
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :IMPTOS, 0,:MONTO, 0, :NIT, :PROYDES, :CENTRODES, NULL, NULL, NULL, :ARTICULO, 0, 0);
                    SUMADES = SUMADES + MONTO;
                    NUMITEMS = NUMITEMS + 1;
                    END
                END
            END /* IVA CONSTANTE */
        /* EL IMPOCONSUMO */
        if (CONSUMO = 'A') then
            BEGIN
            /* SUME LAS BASES DE LOS ARTICULOS DEL DOCUMENTO */
            FOR SELECT MAX(COAR_CTACONS), SUM(TRAS_CONSUMO*TRAS_CANT*TRAS_FACTOR)
                FROM ARTICULO A, CONTABIL_ARTICULO C, TRASFERENCIAS_DETALLE E
                WHERE E.TRAN_ID = :IDDOC AND E.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD
                GROUP BY COAR_CTACONS
                INTO :CTACONSUMO, :IMPTOS
            DO
                BEGIN
                if (IMPTOS <> 0) then
                    BEGIN
                    /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
                    SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                        WHERE CUEN_COD = :CTACONSUMO INTO :CUENTA, :TIPOCUEN;
                    if (CUENTA IS NULL) then
                        begin
                        EXECUTE PROCEDURE ERROR (13, :IDDOC, :CTACONSUMO, 2);
                        CUENTA = CTACONSUMO;
                        TIPOCUEN = 'N';
                        ERROR = ERROR + 1;
                        end
                    if (TIPOCUEN = 'I') then
                        BEGIN
                        /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                        FOR SELECT E.ARTI_COD, (TRAS_CONSUMO*TRAS_CANT*TRAS_FACTOR)
                            FROM ARTICULO A, CONTABIL_ARTICULO C, TRASFERENCIAS_DETALLE E
                            WHERE E.TRAN_ID = :IDDOC AND E.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTACONS = :CUENTA
                            INTO :ARTICULO, :IMPTOS
                            DO
                            if (IMPTOS <> 0) then
                                BEGIN
                                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                                NUMITEMS = NUMITEMS + 1;
                                SUMA = SUMA - IMPTOS;
                                /*AHORA LA ENTRADA*/
                                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :IMPTOS, 0, 0, 0, :NIT, :PROYDES, :CENTRODES, NULL, NULL, NULL, :ARTICULO, 0, 0);
                                SUMADES = SUMADES + MONTO;
                                NUMITEMS = NUMITEMS + 1;
                                END
                        END
                    if (TIPOCUEN = 'C') then
                        BEGIN
                        EXECUTE PROCEDURE ERROR (13, :IDDOC, :CUENTA, 4);
                        TIPOCUEN = 'N';
                        ERROR = ERROR + 1;
                        END
                    if (TIPOCUEN = 'N') then
                        BEGIN
                        /* INSERTE EL REGISTRO DE LA BASE */
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NUMITEMS = NUMITEMS + 1;
                        SUMA = SUMA - IMPTOS;
                        /*AHORA LA ENTRADA*/
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :IMPTOS, 0, 0, 0, :NIT, :PROYDES, :CENTRODES, NULL, NULL, NULL, :ARTICULO, 0, 0);
                        SUMADES = SUMADES + MONTO;
                        NUMITEMS = NUMITEMS + 1;
                        END
                    END
                END /* FOR */
            END /* CONSUMO POR ARTICULO */
        if (CONSUMO = 'K') then
            BEGIN
            /* SUME LAS BASES DE LOS ARTICULOS DEL DOCUMENTO */
            SELECT SUM(TRAS_CONSUMO*TRAS_CANT*TRAS_FACTOR)
                FROM TRASFERENCIAS_DETALLE
                WHERE TRAN_ID = :IDDOC
                INTO :IMPTOS;
            if (IMPTOS <> 0) then
                BEGIN
                /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :CUENTA INTO :CUENTA, :TIPOCUEN;
                if (CUENTA IS NULL) then
                    begin
                    EXECUTE PROCEDURE ERROR (13, :IDDOC, :CTACONSUMO, 2);
                    CUENTA = CTACONSUMO;
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT E.ARTI_COD, (TRAS_CONSUMO*TRAS_CANT*TRAS_FACTOR)
                    FROM ARTICULO A, CONTABIL_ARTICULO C, TRASFERENCIAS_DETALLE E
                        WHERE E.TRAN_ID = :IDDOC AND E.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTACONS = :CUENTA
                        INTO :ARTICULO, :IMPTOS
                        DO
                        if (IMPTOS <> 0) then
                            BEGIN
                            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                            NUMITEMS = NUMITEMS + 1;
                            SUMA = SUMA - IMPTOS;
                            /*AHORA LA ENTRADA*/
                            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :IMPTOS, 0, 0, 0, :NIT, :PROYDES, :CENTRODES, NULL, NULL, NULL, :ARTICULO, 0, 0);
                            SUMADES = SUMADES + MONTO;
                            NUMITEMS = NUMITEMS + 1;
                            END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (13, :IDDOC, :CUENTA, 4);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    /* INSERTE EL REGISTRO DE LA BASE */
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NUMITEMS = NUMITEMS + 1;
                    SUMA = SUMA - IMPTOS;
                    /*AHORA LA ENTRADA*/
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                       VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :IMPTOS, 0, 0, 0, :NIT, :PROYDES, :CENTRODES, NULL, NULL, NULL, :ARTICULO, 0, 0);
                    SUMADES = SUMADES + MONTO;
                    NUMITEMS = NUMITEMS + 1;
                    END
                END
            END /* CONSUMO CONSTANTE */
        /* recorra las cuentas adicionales */
        FOR SELECT INIC_CUENTA, INIC_BASE, INIC_PORC, INIC_VALOR, INIC_DB
            FROM INTERFAZ_INVENTARIO_CTAS
            WHERE ININ_ID = :IDINTER
            INTO :CUENTAADIC, :BASEADIC, :PORCADIC, :VALORADIC, :DBADIC
            DO
            BEGIN
            if (VALORADIC <> 0) then
                MONTO = VALORADIC;
            ELSE
                BEGIN
                if (:BASEADIC = 'SUBTOTAL') then
                    SELECT SUM(TRAS_CANT * TRAS_COSTO)
                    FROM TRASFERENCIAS_DETALLE E
                    WHERE E.TRAN_ID = :IDDOC
                    INTO :VALORADIC;
                if (:BASEADIC = 'IVA') then
                    SELECT SUM(TRAS_IVAMONTO)
                    FROM TRASFERENCIAS_DETALLE E
                    WHERE E.TRAN_ID = :IDDOC
                    INTO :VALORADIC;
                if (:BASEADIC = 'CONSUMO') then
                    SELECT SUM(TRAS_CONSUMO*TRAS_CANT*TRAS_FACTOR)
                    FROM TRASFERENCIAS_DETALLE E
                    WHERE E.TRAN_ID = :IDDOC
                    INTO :VALORADIC;
                MONTO = VALORADIC * PORCADIC / 100;
                END
            if (MONTO <> 0) then
                BEGIN
                /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
                CUENTA = NULL;
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :CUENTAADIC INTO :CUENTA, :TIPOCUEN;
                if (CUENTA IS NULL) then
                    begin
                    EXECUTE PROCEDURE ERROR (13, :IDDOC, :CUENTAADIC, 2);
                    CUENTA = CUENTAADIC;
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (13, :IDDOC, :CUENTA, 3);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (13, :IDDOC, :CUENTA, 4);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    if (DBADIC = 'S') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTAADIC, :CONCEPTO, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        SUMA = SUMA + MONTO;
                        END
                    ELSE
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTAADIC, :CONCEPTO, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        SUMA = SUMA - MONTO;
                        END
                    NUMITEMS = NUMITEMS + 1;
                    END
                END
            END
        /* CIERRE EL COMPROBANTE  */
        if ((SUMA <> 0) AND (SUMADES <> 0)) then
            BEGIN
            if (SUMA > 0) then
                BEGIN
                DEBITO = 0;
                CREDITO = SUMA;
                END
            ELSE    
                BEGIN
                DEBITO = SUMA * -1;
                CREDITO = 0;
                END
            if (SUMADES > 0) then
                BEGIN
                DEBITODES = 0;
                CREDITODES = SUMADES;
                END
            ELSE    
                BEGIN
                DEBITODES = SUMADES * -1;
                CREDITODES = 0;
                END
            if ((TOTAL = 'K') or (TOTAL = 'T')) then
                BEGIN
                if (TOTAL = 'T') then
                    BEGIN
                    SELECT TERC_CTAPROV, TERC_PROV
                        FROM TERCEROS WHERE TERC_NIT = :NIT
                        INTO :CTACIERRE, :PROV;
                    if (PROV = 'S') then
                        SELECT PROV_CTAPAGAR FROM PROVEEDORES WHERE TERC_NIT = :nit
                        INTO :CTACIERRE;
                    END
                /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :CTACIERRE INTO :CUENTA, :TIPOCUEN;
                if (CUENTA IS NULL) then
                    begin
                    EXECUTE PROCEDURE ERROR (13, :IDDOC, :CTACIERRE, 2);
                    CUENTA = CTACIERRE;
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (13, :IDDOC, :CUENTA, 3);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (13, :IDDOC, :CUENTA, 4);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'N') then
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :DEBITO, :CREDITO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NUMITEMS = NUMITEMS + 1;
                /*AHORA LA ENTRADA*/
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :DEBITODES, :CREDITODES, 0, 0, :NIT, :PROYDES, :CENTRODES, NULL, NULL, NULL, NULL, 0, 0);
                END
            END /* SUMA */
        if (ERROR > 0) then
            VER = 'S';
        SUSPEND;
        END /* NO ANULADO */
    END /* EXISTE LA INTERFAZ */
ELSE
    BEGIN
    EXECUTE PROCEDURE ERROR (13, :IDDOC, :PREFIJO, 1);
    ERROR = ERROR + 1;
    VER = 'S';
    SUSPEND;
    END
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE TRASFERENCIAS_SIN_CONTABILIDAD(
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    ID INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    ESTADO VARCHAR(20),
    IDI INTEGER,
    IDC INTEGER)
AS
DECLARE VARIABLE VER CHAR(2);
declare variable FECICNT VARCHAR(10);
declare variable FECFCNT VARCHAR(10);
declare variable ERROR INTEGER;
declare variable idref INTEGER;
BEGIN
EXECUTE PROCEDURE fecha_a_conta(FECINI) returning_values (FECICNT);
EXECUTE PROCEDURE fecha_a_conta(FECFIN) returning_values (FECFCNT);
FOR SELECT TRAN_ID, PREF_PRE, TRAN_NUMERO FROM trasferencias WHERE TRAN_ANULADO = 'N' AND
    TRAN_FECHA >= :FECINI AND TRAN_FECHA <= :FECFIN
    INTO :ID, :PREF, :NUMERO
DO
  BEGIN
  idref = null;
  SELECT ENCO_IDREF FROM COMPROBANTE_ENCABEZADO WHERE ENCO_TIPOREF = 13 AND ENCO_FECHA >= :FECICNT AND ENCO_FECHA <= :FECFCNT and ENCO_IDREF = :id into :idref;
  if (idref IS NULL) then
  begin
  ESTADO = 'PROCESANDO';
  SUSPEND;
  SELECT MAX(ININ_ID) FROM INTERFAZ_INVENTARIO WHERE PREF_PRE = :PREF AND TIDO_COD = 13 INTO :IDI;
  EXECUTE PROCEDURE contabil_traslamercancia (:ID, :IDI) RETURNING_VALUES (:ERROR, :VER, :IDC);
  if (ERROR = 0) then
    BEGIN
      EXECUTE PROCEDURE CONTABILIZA_PENDIENTE (:IDC);
      ESTADO = 'OK';
      END
  ELSE
    ESTADO = 'ERROR';
  suspend;
  end
  END
END

^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure CONTABIL_AJUSTE (
    IDDOC integer,
    IDINTER integer)
returns (
    ERROR integer,
    VER char(1),
    IDC integer)
AS
declare variable PREFIJO VARCHAR(4);
declare variable NUMERO VARCHAR(6);
declare variable FECAUX DATE;
declare variable FECHA CHAR(8);
declare variable CONCEPTO CHAR(60);
declare variable TIPOCOMP VARCHAR(3);
declare variable PREFCONT VARCHAR(4);
declare variable BASE CHAR(1);
declare variable IVAV CHAR(1);
declare variable CONSUMO CHAR(1);
declare variable TOTAL CHAR(1);
declare variable CTABASE VARCHAR(20);
declare variable CTAIVA VARCHAR(20);
declare variable CTACONSUMO VARCHAR(20);
declare variable CTACIERRE VARCHAR(20);
declare variable EXISTE CHAR(1);
declare variable CUENTA VARCHAR(20);
declare variable MONTO NUMERIC(18,2);
declare variable ES_TERCERO CHAR(1);
declare variable ES_CENTRO CHAR(1);
declare variable TIPOCUEN CHAR(1);
declare variable NIT VARCHAR(20);
declare variable NITDET VARCHAR(20);
declare variable PROY VARCHAR(4);
declare variable CENTRO VARCHAR(4);
declare variable DEBITO NUMERIC(18,2);
declare variable CREDITO NUMERIC(18,2);
declare variable NUMITEMS INTEGER;
declare variable ARTICULO VARCHAR(15);
declare variable SUMA NUMERIC(18,2);
declare variable VRBASE NUMERIC(18,2);
declare variable CUENTAADIC VARCHAR(20);
declare variable BASEADIC VARCHAR(20);
declare variable PORCADIC NUMERIC(5,2);
declare variable VALORADIC NUMERIC(18,2);
declare variable DBADIC CHAR(1);
declare variable ANULADO CHAR(1);
declare variable CENT CHAR(1);
BEGIN
  /* BUSQUE LA INTERFACE */
  EXISTE = 'N';
  SELECT 'S', PREF_PRE, TICO_COD, PRCO_PREF, ININ_BASE, ININ_IVAV, ININ_CONSUMO, ININ_TOTAL, ININ_CTABASE, ININ_CTAIVA, ININ_CTACONSUMO, ININ_CTACIERRE, ININ_CONFIRMAR, ININ_CENTRO
    FROM INTERFAZ_INVENTARIO
    WHERE ININ_ID = :IDINTER
    INTO :EXISTE, :PREFIJO, :TIPOCOMP, :PREFCONT, :BASE, :IVAV, :CONSUMO, :TOTAL, :CTABASE, :CTAIVA, :CTACONSUMO, :CTACIERRE, :VER, :CENT;

  if (EXISTE = 'S') then
    BEGIN
    DELETE FROM contabilizacion WHERE CNTB_TIPOREF = 14 AND CNTB_IDREF = :IDDOC;

    /* TRAIGA EL ENCABEZADO DEL AJUSTE */
    SELECT PREF_PRE, AJUS_NUMERO, AJUS_FECHA, AJUS_CONC, AJUS_ANULADO
        FROM AJUSTES
        WHERE AJUS_ID = :IDDOC
        INTO :PREFIJO, :NUMERO, :FECAUX, :CONCEPTO, :ANULADO;
    if (ANULADO = 'N') then
        BEGIN
        if (CENT = 'B') then
           SELECT BODE_CENTRO, BODE_PROY FROM BODEGA B, AJUSTES A
              WHERE A.BODE_COD = B.BODE_COD AND A.AJUS_ID = :IDDOC INTO :CENTRO, :PROY;
        ELSE
            SELECT PREF_CENTRO, PREF_PROY FROM PREFIJOS P, AJUSTES A
                WHERE P.PREF_PRE = A.PREF_PRE AND P.TIDO_COD = 14 AND A.AJUS_ID = :IDDOC INTO :CENTRO, :PROY;
        /* CONVIERTA LA FECHA A CADENA */
        EXECUTE PROCEDURE FECHA_A_CONTA(:FECAUX) returning_values (:FECHA);
        IDC = GEN_ID(ID_CONTABILIZA, 1);
        /* REGISTRE EL ENCABEZADO CONTABLE */
        INSERT INTO CONTABILIZACION (CNTB_ID, CNTB_TIPOCOMP, CNTB_PREFCNT, CNTB_NUMERO, CNTB_FECHA, CNTB_CONCEPTO, CNTB_REF, CNTB_TIPOREF, CNTB_IDREF, CNTB_PREFREF, CNTB_NUMREF, CNTB_PROCESADO)
            VALUES (:IDC, :TIPOCOMP, :PREFCONT, :NUMERO, :FECHA, :CONCEPTO, '', 14, :IDDOC, :PREFIJO, :NUMERO, 'N');
        NUMITEMS = 0;
        SUMA = 0;
        /* PRIMERO LA BASE */
        if (BASE = 'A') then
            BEGIN
            /* SUME LOS AJUSTES POSITIVOS */
            FOR SELECT MAX(COAR_CTAINV), SUM((AJUS_EXNUE-AJUS_EXANT) * AJDE_COSTO)
                FROM ARTICULO A, CONTABIL_ARTICULO C, AJUSTES_DETALLE E
                WHERE E.AJUS_ID = :IDDOC AND E.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND AJUS_EXNUE > AJUS_EXANT
                GROUP BY COAR_CTAINV
                INTO :CTABASE, :MONTO
                DO
                BEGIN
                if (MONTO <> 0) then
                    BEGIN
                    VRBASE = MONTO;
                    /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
                    SELECT CUEN_COD, CUEN_TERCERO, CUEN_CENTRO, CUEN_TIPO
                        FROM CUENTAS
                        WHERE CUEN_COD = :CTABASE
                        INTO :CUENTA, :ES_TERCERO, :ES_CENTRO, :TIPOCUEN;
                    if (CUENTA IS NULL) then
                        begin
                        EXECUTE PROCEDURE ERROR (14, :IDDOC, :CTABASE, 2);
                        CUENTA = CTABASE;
                        ERROR = ERROR + 1;
                        end
                    /* DEFINA EL TERCERO */
                    NITDET = NIT;
                    /* DEPENDE DEL TIPO DE CUENTA */
                    if ((TIPOCUEN = 'I') or (TIPOCUEN = 'A')) then
                        BEGIN
                        /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                        FOR SELECT E.ARTI_COD, ((AJUS_EXNUE-AJUS_EXANT) * AJDE_COSTO)
                            FROM ARTICULO A, CONTABIL_ARTICULO C, AJUSTES_DETALLE E
                            WHERE E.AJUS_ID = :IDDOC AND E.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTAINV = :CUENTA AND AJUS_EXNUE > AJUS_EXANT
                            INTO :ARTICULO, :MONTO
                            DO
                            BEGIN
                            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :MONTO, 0, 0, 0, :NITDET, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                            NUMITEMS = NUMITEMS + 1;
                            SUMA = SUMA + MONTO;
                            END
                        END
                    if (TIPOCUEN = 'C') then
                        BEGIN
                        EXECUTE PROCEDURE ERROR (14, :IDDOC, :CUENTA, 4);
                        TIPOCUEN = 'N';
                        ERROR = ERROR + 1;
                        END
                    if (TIPOCUEN = 'N') then
                        BEGIN
                        /* INSERTE EL REGISTRO DE LA BASE */
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :MONTO, 0, 0, 0, :NITDET, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NUMITEMS = NUMITEMS + 1;
                        SUMA = SUMA + MONTO;
                        END
                    END
                END /* FOR */
            /* LOS AJUSTES NEGATIVOS */
            FOR SELECT MAX(COAR_CTAINV), SUM((AJUS_EXANT-AJUS_EXNUE) * AJDE_COSTO)
                FROM ARTICULO A, CONTABIL_ARTICULO C, AJUSTES_DETALLE E
                WHERE E.AJUS_ID = :IDDOC AND E.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND AJUS_EXNUE < AJUS_EXANT
                GROUP BY COAR_CTAINV
                INTO :CTABASE, :MONTO
                DO
                BEGIN
                if (MONTO <> 0) then
                    BEGIN
                    VRBASE = MONTO;
                    /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
                    SELECT CUEN_COD, CUEN_TERCERO, CUEN_CENTRO, CUEN_TIPO
                        FROM CUENTAS
                        WHERE CUEN_COD = :CTABASE
                        INTO :CUENTA, :ES_TERCERO, :ES_CENTRO, :TIPOCUEN;
                    if (CUENTA IS NULL) then
                        begin
                        EXECUTE PROCEDURE ERROR (14, :IDDOC, :CTABASE, 2);
                        CUENTA = CTABASE;
                        ERROR = ERROR + 1;
                        end
                    /* DEFINA EL TERCERO */
                    NITDET = NIT;
                    /* DEPENDE DEL TIPO DE CUENTA */
                    if ((TIPOCUEN = 'I') or (TIPOCUEN = 'A')) then
                        BEGIN
                        /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                        FOR SELECT E.ARTI_COD, ((AJUS_EXANT-AJUS_EXNUE) * AJDE_COSTO)
                            FROM ARTICULO A, CONTABIL_ARTICULO C, AJUSTES_DETALLE E
                            WHERE E.AJUS_ID = :IDDOC AND E.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTAINV = :CUENTA AND AJUS_EXNUE < AJUS_EXANT
                            INTO :ARTICULO, :MONTO
                            DO
                            BEGIN
                            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :MONTO, 0, 0, :NITDET, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                            NUMITEMS = NUMITEMS + 1;
                            SUMA = SUMA - MONTO;
                            END
                        END
                    if (TIPOCUEN = 'C') then
                        BEGIN
                        EXECUTE PROCEDURE ERROR (14, :IDDOC, :CUENTA, 4);
                        TIPOCUEN = 'N';
                        ERROR = ERROR + 1;
                        END
                    if (TIPOCUEN = 'N') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :MONTO, 0, 0, :NITDET, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NUMITEMS = NUMITEMS + 1;
                        SUMA = SUMA - MONTO;
                        END
                    END
                END /* FOR */
            END /* BASE */
        if (BASE = 'K') then
            BEGIN
            CUENTA = :ctabase;
            /* SUME LAS BASES DE LOS ARTICULOS DEL DOCUMENTO */
            SELECT SUM((AJUS_EXNUE-AJUS_EXANT) * AJDE_COSTO) FROM AJUSTES_DETALLE E
                WHERE E.AJUS_ID = :IDDOC AND AJUS_EXNUE > AJUS_EXANT INTO :MONTO;
        
            if (MONTO <> 0) then
                BEGIN
                /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
                SELECT CUEN_COD, CUEN_TERCERO, CUEN_CENTRO, CUEN_TIPO
                    FROM CUENTAS
                    WHERE CUEN_COD = :CTABASE
                    INTO :CUENTA, :ES_TERCERO, :ES_CENTRO, :TIPOCUEN;
                if (CUENTA IS NULL) then
                    begin
                    EXECUTE PROCEDURE ERROR (14, :IDDOC, :CTABASE, 2);
                    CUENTA = CTABASE;
                    ERROR = ERROR + 1;
                    end
                /* DEFINA EL TERCERO */
                NITDET = NIT;
                /* DEPENDE DEL TIPO DE CUENTA */
                if ((TIPOCUEN = 'I') or (TIPOCUEN = 'A')) then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT E.ARTI_COD, ((AJUS_EXNUE-AJUS_EXANT) * AJDE_COSTO)
                        FROM ARTICULO A, CONTABIL_ARTICULO C, AJUSTES_DETALLE E
                        WHERE E.AJUS_ID = :IDDOC AND E.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTAINV = :CUENTA AND AJUS_EXNUE > AJUS_EXANT 
                        INTO :ARTICULO, :MONTO
                        DO
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :MONTO, 0, 0, 0, :NITDET, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                        NUMITEMS = NUMITEMS + 1;
                        SUMA = SUMA + MONTO;
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (14, :IDDOC, :CUENTA, 4);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    /* INSERTE EL REGISTRO DE LA BASE */
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :MONTO, 0, 0, 0, :NITDET, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NUMITEMS = NUMITEMS + 1;
                    SUMA = SUMA + MONTO;
                    END
                END
            CUENTA = :ctabase;
            /* SUME LAS BASES DE LOS ARTICULOS DEL DOCUMENTO */
            SELECT SUM((AJUS_EXANT-AJUS_EXNUE) * AJDE_COSTO) FROM AJUSTES_DETALLE E
                WHERE E.AJUS_ID = :IDDOC AND AJUS_EXNUE < AJUS_EXANT INTO :MONTO;
        
            if (MONTO <> 0) then
                BEGIN
                /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
                SELECT CUEN_COD, CUEN_TERCERO, CUEN_CENTRO, CUEN_TIPO
                    FROM CUENTAS
                    WHERE CUEN_COD = :CTABASE
                    INTO :CUENTA, :ES_TERCERO, :ES_CENTRO, :TIPOCUEN;
                if (CUENTA IS NULL) then
                    begin
                    EXECUTE PROCEDURE ERROR (14, :IDDOC, :CTABASE, 2);
                    CUENTA = CTABASE;
                    ERROR = ERROR + 1;
                    end
                /* DEFINA EL TERCERO */
                NITDET = NIT;
                /* DEPENDE DEL TIPO DE CUENTA */
                if ((TIPOCUEN = 'I') or (TIPOCUEN = 'A')) then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT E.ARTI_COD, ((AJUS_EXANT-AJUS_EXNUE) * AJDE_COSTO)
                        FROM ARTICULO A, CONTABIL_ARTICULO C, AJUSTES_DETALLE E
                        WHERE E.AJUS_ID = :IDDOC AND E.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTAINV = :CUENTA AND AJUS_EXNUE < AJUS_EXANT
                        INTO :ARTICULO, :MONTO
                        DO
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :MONTO, 0, 0, :NITDET, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                        NUMITEMS = NUMITEMS + 1;
                        SUMA = SUMA - MONTO;
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (14, :IDDOC, :CUENTA, 4);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    /* INSERTE EL REGISTRO DE LA BASE */
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :MONTO, 0, 0, :NITDET, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NUMITEMS = NUMITEMS + 1;
                    SUMA = SUMA - MONTO;
                    END
                END
            END /* BASE K O T */
        /* recorra las cuentas adicionales */
        FOR SELECT INIC_CUENTA, INIC_BASE, INIC_PORC, INIC_VALOR, INIC_DB
            FROM INTERFAZ_INVENTARIO_CTAS
            WHERE ININ_ID = :IDINTER
            INTO :CUENTAADIC, :BASEADIC, :PORCADIC, :VALORADIC, :DBADIC
            DO
            BEGIN
            if (VALORADIC <> 0) then
                MONTO = VALORADIC;
            ELSE
                BEGIN
                if ((:BASEADIC = 'SUBTOTAL') or (:BASEADIC = 'TOTAL')) then
                    SELECT SUM((AJUS_EXNUE-AJUS_EXANT) * AJDE_COSTO) FROM
                        AJUSTES_DETALLE WHERE AJUS_ID = :iddoc INTO :VALORADIC;
                MONTO = ABS(VALORADIC * PORCADIC / 100);
                END
            if (monto <> 0) then
                begin
                /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
                CUENTA = NULL;
                SELECT CUEN_COD, CUEN_TERCERO, CUEN_CENTRO, CUEN_TIPO
                    FROM CUENTAS
                    WHERE CUEN_COD = :CUENTAADIC
                    INTO :CUENTA, :ES_TERCERO, :ES_CENTRO, :TIPOCUEN;
                if (CUENTA IS NULL) then
                    begin
                    EXECUTE PROCEDURE ERROR (14, :IDDOC, :CUENTAADIC, 2);
                    CUENTA = CUENTAADIC;
                    ERROR = ERROR + 1;
                    end
                /* DEFINA EL TERCERO */
                NITDET = NIT;
                /* DEPENDE DEL TIPO DE CUENTA */
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (14, :IDDOC, :CUENTA, 3);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (14, :IDDOC, :CUENTA, 4);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    if (DBADIC = 'S') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTAADIC, :CONCEPTO, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NITDET, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        SUMA = SUMA + MONTO;
                        END
                    ELSE
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTAADIC, :CONCEPTO, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NITDET, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        SUMA = SUMA - MONTO;
                        END
                    NUMITEMS = NUMITEMS + 1;
                    END
                end
            END
        /* CIERRE EL COMPROBANTE CONTRA LA CUENTA DEL TERCERO O LA CONSTANTE */
        if (SUMA <> 0) then
            BEGIN
            if (SUMA > 0) then
                BEGIN
                DEBITO = 0;
                CREDITO = SUMA;
                END
            ELSE
                BEGIN
                DEBITO = SUMA * -1;
                CREDITO = 0;
                END
            /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
            SELECT CUEN_COD, CUEN_TERCERO, CUEN_CENTRO, CUEN_TIPO
                FROM CUENTAS
                WHERE CUEN_COD = :CTACIERRE
                INTO :CUENTA, :ES_TERCERO, :ES_CENTRO, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERROR (14, :IDDOC, :CTACIERRE, 2);
                CUENTA = CTACIERRE;
                ERROR = ERROR + 1;
                end
            /* DEFINA EL TERCERO */
            NITDET = NIT;
            /* DEPENDE DEL TIPO DE CUENTA */
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERROR (14, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                EXECUTE PROCEDURE ERROR (14, :IDDOC, :CUENTA, 4);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'N') then
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :DEBITO, :CREDITO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            END /* SUMA */
        if (ERROR > 0) then
            VER = 'S';
        END /* EXISTE LA INTERFAZ */
      END
  ELSE
    BEGIN
    EXECUTE PROCEDURE ERROR (14, :IDDOC, :PREFIJO, 1);
    ERROR = ERROR + 1;
    VER = 'S';
    END
SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure CONTABIL_FACTCOMP (
    IDDOC integer,
    IDINTER integer)
returns (
    ERROR integer,
    VER char(1),
    IDC integer)
AS
DECLARE VARIABLE PREFIJO VARCHAR(4);
DECLARE VARIABLE NUM VARCHAR(6);
DECLARE VARIABLE NUMERO VARCHAR(10);
DECLARE VARIABLE FECAUX DATE;
DECLARE VARIABLE FECHA CHAR(8);
DECLARE VARIABLE CONCEPTO CHAR(60);
DECLARE VARIABLE VENCEAUX DATE;
DECLARE VARIABLE VENCE CHAR(8);
DECLARE VARIABLE VRDTO NUMERIC(18,2);
DECLARE VARIABLE VRADIC NUMERIC(18,2);
DECLARE VARIABLE VRSUBT NUMERIC(18,2);
DECLARE VARIABLE VRIVA NUMERIC(18,2);
DECLARE VARIABLE PRTFTE NUMERIC(9,2);
DECLARE VARIABLE VRRTFTE NUMERIC(18,2);
DECLARE VARIABLE VRRTIVA NUMERIC(18,2);
DECLARE VARIABLE PRTICA NUMERIC(9,2);
DECLARE VARIABLE VRRTICA NUMERIC(18,2);
DECLARE VARIABLE VRTOTAL NUMERIC(18,2);
DECLARE VARIABLE VREXTRA NUMERIC(18,2);
DECLARE VARIABLE TIPOCOMP VARCHAR(3);
DECLARE VARIABLE PREFCONT VARCHAR(4);
DECLARE VARIABLE INVEN CHAR(1);
DECLARE VARIABLE CTAINVEN VARCHAR(20);
DECLARE VARIABLE IVA CHAR(1);
DECLARE VARIABLE CTAIVA VARCHAR(20);
DECLARE VARIABLE CONSUMO CHAR(1);
DECLARE VARIABLE CTACONSUMO VARCHAR(20);
DECLARE VARIABLE CXP CHAR(1);
DECLARE VARIABLE CTACXP VARCHAR(20);
DECLARE VARIABLE RTFTE CHAR(1);
DECLARE VARIABLE CTARTFTE VARCHAR(20);
DECLARE VARIABLE RTIVA CHAR(1);
DECLARE VARIABLE CTARTIVA VARCHAR(20);
DECLARE VARIABLE RTICA CHAR(1);
DECLARE VARIABLE CTARTICA VARCHAR(20);
DECLARE VARIABLE CTADTO VARCHAR(20);
DECLARE VARIABLE CTAADIC VARCHAR(20);
DECLARE VARIABLE CTAEXTRA VARCHAR(20);
DECLARE VARIABLE EXISTE CHAR(1);
DECLARE VARIABLE CUENTA VARCHAR(20);
DECLARE VARIABLE MONTO NUMERIC(18,2);
DECLARE VARIABLE TIPOCUEN CHAR(1);
DECLARE VARIABLE NIT VARCHAR(20);
DECLARE VARIABLE NOMBRE VARCHAR(60);
DECLARE VARIABLE PROY VARCHAR(4);
DECLARE VARIABLE CENTRO VARCHAR(4);
DECLARE VARIABLE PROYDET VARCHAR(4);
DECLARE VARIABLE CENTRODET VARCHAR(4);
DECLARE VARIABLE PORC NUMERIC(5,2);
DECLARE VARIABLE NUMITEMS INTEGER;
DECLARE VARIABLE ARTICULO VARCHAR(15);
DECLARE VARIABLE IMPINC CHAR(1);
DECLARE VARIABLE IMPTOS NUMERIC(18,2);
DECLARE VARIABLE SUMA NUMERIC(18,2);
DECLARE VARIABLE PORCIVA NUMERIC(9,2);
DECLARE VARIABLE TCTAPROV VARCHAR(20);
DECLARE VARIABLE TCTARTFTE VARCHAR(20);
DECLARE VARIABLE TCTARTIVA VARCHAR(20);
DECLARE VARIABLE TCTARTICA VARCHAR(20);
DECLARE VARIABLE CUENTAADIC VARCHAR(20);
DECLARE VARIABLE BASEADIC VARCHAR(20);
DECLARE VARIABLE PORCADIC NUMERIC(5,2);
DECLARE VARIABLE VALORADIC NUMERIC(18,2);
DECLARE VARIABLE DBADIC CHAR(1);
DECLARE VARIABLE FOMENTO CHAR(2);
DECLARE VARIABLE BODE_DET CHAR(2);
DECLARE VARIABLE NUMPROV VARCHAR(10);
DECLARE VARIABLE MERCANCIA NUMERIC(18,2);
declare variable FACTOR DOUBLE PRECISION;
DECLARE VARIABLE MENORV CHAR(2);
declare variable DIG INTEGER;
declare variable NETO NUMERIC(18,2);
declare variable CENT CHAR(1);
declare variable ANULADO CHAR(1);
declare variable ERRORC INTEGER;
BEGIN
  /* INTERFACE */
  EXISTE = 'N';
  SELECT 'S', TICO_COD, PRCO_PRE, INCO_INVEN, INCO_IVA, INCO_CONSUMO, INCO_CXP, INCO_RTFTE, INCO_RTIVA, INCO_RTICA, INCO_CTAINVEN, INCO_CTAIVA, INCO_CTACONSUMO, INCO_CTADTO, INCO_CTAADIC, INCO_CTAEXTRA, INCO_CTACXP, INCO_CTARTFTE, INCO_CTARTIVA, INCO_CTARTICA, INCO_CONFIRMAR, INCO_CENTRO
    FROM INTERFAZ_COMPRAS WHERE INCO_ID = :IDINTER INTO :EXISTE, :TIPOCOMP, :PREFCONT, :INVEN, :IVA, :CONSUMO, :CXP, :RTFTE, :RTIVA, :RTICA, :CTAINVEN, :CTAIVA, :CTACONSUMO, :CTADTO, :CTAADIC, :CTAEXTRA, :CTACXP, :CTARTFTE, :CTARTIVA, :CTARTICA, :VER, :CENT;
  if (EXISTE = 'S') then
    BEGIN
    /* BORRE CONTABILIZACION PREVIA */
    DELETE FROM CONTABILIZACION WHERE CNTB_TIPOREF = 21 AND CNTB_IDREF = :IDDOC;
    /* ENCABEZADO DE LA FACTURA */
    SELECT PREF_PRE, FACO_NUMERO, FACO_FECHA, F.TERC_NIT, FACO_IMPTOS, FACO_VENCE, FACO_DTOMONTO, FACO_ADICIONAL, FACO_IVAMONTO, FACO_EXTRA, FACO_TOTAL, FACO_RTFTEPORC, FACO_RTFTEMONTO, FACO_RTIVAPOR, FACO_RTIVAMONTO, FACO_RTICAPOR, FACO_RTICAMONTO, TERC_NOM, PROV_CTARTFTE, PROV_CTARTIVA, PROV_CTARTICA, PROV_CTAPAGAR, FACO_NUMPROV, FACO_ANULADO
        FROM FACTURAS_COMPRA F, TERCEROS T, PROVEEDORES P WHERE FACO_ID = :IDDOC AND F.TERC_NIT = T.TERC_NIT AND T.TERC_NIT = P.TERC_NIT
        INTO :PREFIJO, :NUM, :FECAUX, :NIT, :IMPINC, :VENCEAUX, :VRDTO, :VRADIC, :VRIVA, :VREXTRA, :VRTOTAL, :PRTFTE, :VRRTFTE, :PORC, :VRRTIVA, :PRTICA, :VRRTICA, :NOMBRE, TCTARTFTE, TCTARTIVA, TCTARTICA, TCTAPROV, :NUMPROV, :ANULADO;
    /* CENTRO DE LA BODEGA */
    IF (CENT = 'B') THEN
        SELECT BODE_CENTRO, BODE_PROY FROM BODEGA B, FACTURAS_COMPRA F WHERE B.BODE_COD = F.BODE_COD AND F.FACO_ID = :IDDOC INTO :CENTRO, :PROY;
    ELSE
        SELECT PREF_CENTRO,PREF_PROY  FROM PREFIJOS P, FACTURAS_COMPRA F WHERE P.PREF_PRE = F.PREF_PRE AND F.FACO_ID = :IDDOC AND P.TIDO_COD = 21 INTO :CENTRO, :PROY;
    if (ANULADO = 'N') then
        BEGIN
        NUMERO = PREFIJO || NUM;
        VRSUBT = VRTOTAL - VREXTRA - VRIVA;
        MERCANCIA = VRSUBT - VRADIC + VRDTO;
        EXECUTE PROCEDURE FECHA_A_CONTA(:FECAUX) returning_values (:FECHA);
        EXECUTE PROCEDURE FECHA_A_CONTA(:VENCEAUX) returning_values (:VENCE);
        if (NUMPROV IS NULL) then
            NUMPROV = NUMERO;
        CONCEPTO = 'FC No.' || NUMERO || '-' || SUBSTR(NOMBRE,1,26) || '-NPROV.' || NUMPROV;
        IDC = GEN_ID(ID_CONTABILIZA, 1);
        INSERT INTO CONTABILIZACION (CNTB_ID, CNTB_TIPOCOMP, CNTB_PREFCNT, CNTB_NUMERO, CNTB_FECHA, CNTB_CONCEPTO, CNTB_REF, CNTB_TIPOREF, CNTB_IDREF, CNTB_PREFREF, CNTB_NUMREF, CNTB_PROCESADO)
            VALUES (:IDC, :TIPOCOMP, :PREFCONT, :NUM, :FECHA, :CONCEPTO, '', 21, :IDDOC, :PREFIJO, :NUM, 'N');
        NUMITEMS = 0;
        SUMA = 0;
        NETO = 0;
        ERROR = 0;
        EXECUTE PROCEDURE LEE_CONFIGURACION('COMPRAS', 'FACTURAS', 'USAR IMPOCONSUMO COMO PORCENTAJE DE FOMENTO') RETURNING_VALUES (FOMENTO);
        EXECUTE PROCEDURE lee_configuracion('COMPRAS','FACTURAS','DESCUENTO Y VALOR ADICIONAL DEL DOCUMENTO COMO MENOR VALOR DEL COSTO') returning_values (:MENORV);
        SELECT SUM(FCDE_consumo) from facturas_compras_detalle where faco_id = :IDDOC into :valoradic;
        if (MENORV = 'SI') then
            if (MERCANCIA <> 0) then
                FACTOR = (CAST(VRSUBT AS DOUBLE PRECISION) - VALORADIC) / (CAST(MERCANCIA AS DOUBLE PRECISION) - VALORADIC);
            ELSE
                FACTOR = 1;
        ELSE
           FACTOR = 1;
        SELECT CAST(CONF_VALOR AS INTEGER) FROM CONFIGURACION WHERE CONF_MODULO = 'COMPRAS' AND CONF_CATEGORIA = 'DOCUMENTOS' AND CONF_PROPIEDAD = 'REDONDEO AL MULTIPLO DE DIEZ EN TOTALES' INTO :DIG;
        if (INVEN = 'A') then
            BEGIN
            FOR SELECT MAX(COAR_CTACOMP), SUM(CAST(FCDE_CANT AS DOUBLE PRECISION) * (FCDE_PRUNIT-FCDE_DTOMONTO)), SUM(FCDE_IVAMONTO), SUM(FCDE_CONSUMO), MAX(F.BODE_COD)
                FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_COMPRAS_DETALLE F WHERE F.FACO_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD
                GROUP BY COAR_CTACOMP, F.BODE_COD INTO :CTAINVEN, :MONTO, :IMPTOS, :VALORADIC, :BODE_DET DO
                BEGIN
                IF (CENT = 'B') THEN
                  SELECT BODE_CENTRO, BODE_PROY FROM BODEGA WHERE BODE_COD = :BODE_DET INTO :CENTRODET, :PROYDET;
                if (IMPINC = 'S') then
                    BEGIN
                    MONTO = MONTO - IMPTOS;
                    if (FOMENTO <> 'SI' ) then
                        MONTO = MONTO - VALORADIC;
                    END
                MONTO = MONTO * FACTOR;
                execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                EXECUTE PROCEDURE CUENTA_INTERFAZ(21, :IDDOC, :CTAINVEN, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if ((TIPOCUEN = 'I') or (TIPOCUEN = 'A'))  then
                    BEGIN
                    FOR SELECT F.ARTI_COD, (FCDE_CANT * (FCDE_PRUNIT-FCDE_DTOMONTO)), FCDE_IVAMONTO, FCDE_CONSUMO
                        FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_COMPRAS_DETALLE F WHERE F.FACO_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTACOMP = :CUENTA
                        INTO :ARTICULO, :MONTO, :IMPTOS, :VALORADIC DO
                        BEGIN
                        if (IMPINC = 'S') then
                            BEGIN
                            MONTO = MONTO - IMPTOS;
                            if (FOMENTO <> 'SI' ) then
                                MONTO = MONTO - VALORADIC;
                            END
                        MONTO = MONTO * FACTOR;
                        execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                        IF (CENT = 'B') THEN
                           INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                               VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROYDET, :CENTRODET, NULL, NULL, NULL, :ARTICULO, 0, 0);
                        ELSE
                           INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                               VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                        NUMITEMS = NUMITEMS + 1;
                        NETO = NETO + MONTO;
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    IF (CENT = 'B') THEN
                       INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                           VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROYDET, :CENTRODET, :NUMERO, NULL, :VENCE, NULL, 0, 21);
                    ELSE
                       INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                           VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 21);
                    NUMITEMS = NUMITEMS + 1;
                    NETO = NETO + MONTO;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    IF (CENT = 'B') THEN
                       INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                           VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROYDET, :CENTRODET, NULL, NULL, NULL, NULL, 0, 0);
                    ELSE
                       INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                           VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NUMITEMS = NUMITEMS + 1;
                    NETO = NETO + MONTO;
                    END
                END
            END
        if (INVEN = 'K') then
            BEGIN
            FOR SELECT SUM(CAST(FCDE_CANT AS DOUBLE PRECISION) * (FCDE_PRUNIT-FCDE_DTOMONTO)), SUM(FCDE_IVAMONTO), SUM(FCDE_CONSUMO), MAX(BODE_COD)
                FROM FACTURAS_COMPRAS_DETALLE WHERE FACO_ID = :IDDOC GROUP BY BODE_COD INTO :MONTO, :IMPTOS, :VALORADIC, :BODE_DET Do
                BEGIN
                  IF (CENT = 'B') THEN
                    SELECT BODE_CENTRO, BODE_PROY FROM BODEGA WHERE BODE_COD = :BODE_DET INTO :CENTRODET, :PROYDET;
                  if (IMPINC = 'S') then
                   BEGIN
                    MONTO = MONTO - IMPTOS;
                    if (FOMENTO <> 'SI' ) then
                      MONTO = MONTO - VALORADIC;
                   END
                  MONTO = MONTO * FACTOR;
                  execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                  execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                  EXECUTE PROCEDURE CUENTA_INTERFAZ(21, :IDDOC, :CTAINVEN, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                  if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if ((TIPOCUEN = 'I') or (TIPOCUEN = 'A'))  then
                   BEGIN
                    FOR SELECT ARTI_COD, (FCDE_CANT * (FCDE_PRUNIT-FCDE_DTOMONTO)), FCDE_IVAMONTO, FCDE_CONSUMO
                      FROM FACTURAS_COMPRAS_DETALLE WHERE FACO_ID = :IDDOC INTO :ARTICULO, :MONTO, :IMPTOS, :VALORADIC DO
                       BEGIN
                       if (IMPINC = 'S') then
                        BEGIN
                         MONTO = MONTO - IMPTOS;
                         if (FOMENTO <> 'SI' ) then
                            MONTO = MONTO - VALORADIC;
                        END
                       MONTO = MONTO * FACTOR;
                       execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                       execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                       IF (CENT = 'B') THEN
                          INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                             VALUES (:IDC, :NUMITEMS, :CTAINVEN, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROYDET, :CENTRODET, NULL, NULL, NULL, :ARTICULO, 0, 0);
                       ELSE
                          INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                             VALUES (:IDC, :NUMITEMS, :CTAINVEN, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                       NUMITEMS = NUMITEMS + 1;
                       NETO = NETO + MONTO;
                       END
                   END
                  if (TIPOCUEN = 'C') then
                   BEGIN
                    IF (CENT = 'B') THEN
                       INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                         VALUES (:IDC, :NUMITEMS, :CTAINVEN, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROYDET, :CENTRODET, :NUMERO, NULL, :VENCE, NULL, 0, 21);
                    ELSE
                       INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                         VALUES (:IDC, :NUMITEMS, :CTAINVEN, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 21);
                    NUMITEMS = NUMITEMS + 1;
                    NETO = NETO + MONTO;
                   END
                  if (TIPOCUEN = 'N') then
                   BEGIN
                    IF (CENT = 'B') THEN
                       INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                          VALUES (:IDC, :NUMITEMS, :CTAINVEN, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROYDET, :CENTRODET, NULL, NULL, NULL, NULL, 0, 0);
                    ELSE
                       INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                          VALUES (:IDC, :NUMITEMS, :CTAINVEN, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NUMITEMS = NUMITEMS + 1;
                    NETO = NETO + MONTO;
                   END
                END
            END
        /* EL IVA */
        if (IVA = 'A') then
            BEGIN
            FOR SELECT MAX(COAR_CTAIVAC), SUM(FCDE_IVAMONTO), SUM(CAST(FCDE_CANT AS DOUBLE PRECISION) * (FCDE_PRUNIT-FCDE_DTOMONTO)), SUM(FCDE_CONSUMO)
                FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_COMPRAS_DETALLE F
                WHERE F.FACO_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND FCDE_IVAMONTO <> 0
                GROUP BY COAR_CTAIVAC
                INTO :CTAIVA, :IMPTOS, :MONTO, :VALORADIC DO
              if (IMPTOS <> 0) then
                BEGIN
                IMPTOS = CAST(IMPTOS AS DOUBLE PRECISION) * VRSUBT / MERCANCIA;
                if (IMPINC = 'S') then
                    BEGIN
                    MONTO = MONTO - IMPTOS;
                    if (FOMENTO <> 'SI' ) then
                        MONTO = MONTO - VALORADIC;
                    END
                MONTO = CAST(MONTO AS DOUBLE PRECISION) * VRSUBT / MERCANCIA;
                execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                EXECUTE PROCEDURE CUENTA_INTERFAZ(21, :IDDOC, :CTAIVA, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    FOR SELECT F.ARTI_COD, FCDE_IVAMONTO, (FCDE_CANT * (FCDE_PRUNIT-FCDE_DTOMONTO)), TAIV_PORC, FCDE_CONSUMO
                        FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_COMPRAS_DETALLE F, TARIFA_IVA T WHERE F.FACO_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTAIVAV = :CUENTA AND A.TAIV_COD = T.TAIV_COD
                        INTO :ARTICULO, :IMPTOS, :MONTO, :PORCIVA, :VALORADIC
                    DO
                        BEGIN
                        IMPTOS = CAST(IMPTOS AS DOUBLE PRECISION) * VRSUBT / MERCANCIA;
                        if (IMPINC = 'S') then
                            BEGIN
                            MONTO = MONTO - IMPTOS;
                            if (FOMENTO <> 'SI' ) then
                                MONTO = MONTO - VALORADIC;
                            END
                        MONTO = CAST(MONTO AS DOUBLE PRECISION) * VRSUBT / MERCANCIA;
                        execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :IMPTOS, 0, :MONTO, :PORCIVA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                        NUMITEMS = NUMITEMS + 1;
                        NETO = NETO + IMPTOS;
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :IMPTOS, 0, :MONTO, :IMPTOS*100/:MONTO, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 21);
                    NUMITEMS = NUMITEMS + 1;
                    NETO = NETO + IMPTOS;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :IMPTOS, 0, :MONTO, CAST(:IMPTOS AS DOUBLE PRECISION)*100/CAST(:MONTO AS DOUBLE PRECISION), :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NUMITEMS = NUMITEMS + 1;
                    NETO = NETO + IMPTOS;
                    END
                END
            END
        if (IVA = 'K') then /* IVA EN CTA CONSTANTE */
            BEGIN
            SELECT SUM(FCDE_IVAMONTO), SUM(CAST(FCDE_CANT AS DOUBLE PRECISION) * (FCDE_PRUNIT-FCDE_DTOMONTO)), SUM(FCDE_CONSUMO)
                FROM FACTURAS_COMPRAS_DETALLE F
                WHERE F.FACO_ID = :IDDOC  AND FCDE_IVAMONTO <> 0
                INTO :IMPTOS, :MONTO, :VALORADIC;
            if (IMPTOS <> 0) then
                BEGIN
                IMPTOS = CAST(IMPTOS AS DOUBLE PRECISION) * VRSUBT / MERCANCIA;
                if (IMPINC = 'S') then
                    BEGIN
                    MONTO = MONTO - IMPTOS;
                    if (FOMENTO <> 'SI' ) then
                        MONTO = MONTO - VALORADIC;
                    END
                MONTO = CAST(MONTO AS DOUBLE PRECISION) * VRSUBT / MERCANCIA;
                execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                EXECUTE PROCEDURE CUENTA_INTERFAZ(21, :IDDOC, :CTAIVA, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    FOR SELECT F.ARTI_COD, (FCDE_CANT * (FCDE_PRUNIT-FCDE_DTOMONTO)), FCDE_IVAMONTO, TAIV_PORC, FCDE_CONSUMO
                        FROM ARTICULO A, FACTURAS_COMPRAS_DETALLE F, TARIFA_IVA T WHERE F.FACO_ID = :IDDOC AND A.TAIV_COD = T.TAIV_COD
                        INTO :ARTICULO, :MONTO, :IMPTOS, :PORCIVA, :VALORADIC DO
                        BEGIN
                        IMPTOS = CAST(IMPTOS AS DOUBLE PRECISION) * VRSUBT / MERCANCIA;
                        if (IMPINC = 'S') then
                            BEGIN
                            MONTO = MONTO - IMPTOS;
                            if (FOMENTO <> 'SI' ) then
                                MONTO = MONTO - VALORADIC;
                            END
                        MONTO = CAST(MONTO AS DOUBLE PRECISION) * VRSUBT / MERCANCIA;
                        execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                        if (IMPTOS <> 0) then
                            BEGIN
                            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                VALUES (:IDC, :NUMITEMS, :CTAIVA, :CONCEPTO, '', :IMPTOS, 0, :MONTO, :PORCIVA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                            NUMITEMS = NUMITEMS + 1;
                            NETO = NETO + IMPTOS;
                            END
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NUMITEMS, :CTAIVA, :CONCEPTO, '', :IMPTOS, 0, :MONTO, :IMPTOS*100/:MONTO, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 21);
                    NUMITEMS = NUMITEMS + 1;
                    NETO = NETO + IMPTOS;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NUMITEMS, :CTAIVA, :CONCEPTO, '', :IMPTOS, 0, :MONTO, :IMPTOS*100/:MONTO, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NUMITEMS = NUMITEMS + 1;
                    NETO = NETO + IMPTOS;
                    END
                END
            END
        /* EL IMPOCONSUMO */
        if (CONSUMO = 'A') then
            BEGIN
            FOR SELECT MAX(COAR_CTACONS), SUM(FCDE_CONSUMO) FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_COMPRAS_DETALLE F
                WHERE F.FACO_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD GROUP BY COAR_CTACONS INTO :CTACONSUMO, :IMPTOS
            DO
              if (IMPTOS <> 0) then
                BEGIN
                execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                EXECUTE PROCEDURE CUENTA_INTERFAZ(21, :IDDOC, :CTACONSUMO, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (FOMENTO <> 'SI') then
                    BEGIN
                    if (TIPOCUEN = 'I') then
                        BEGIN
                        FOR SELECT F.ARTI_COD, FCDE_CONSUMO FROM ARTICULO A, FACTURAS_COMPRAS_DETALLE F WHERE F.FACO_ID = :IDDOC INTO :ARTICULO, :IMPTOS
                            DO
                            BEGIN
                            if (IMPTOS <> 0) then
                                BEGIN
                                execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                    VALUES (:IDC, :NUMITEMS, :CTACONSUMO, :CONCEPTO, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                                NUMITEMS = NUMITEMS + 1;
                                NETO = NETO + IMPTOS;
                                END
                            END
                        END
                    if (TIPOCUEN = 'C') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CTACONSUMO, :CONCEPTO, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                        NUMITEMS = NUMITEMS + 1;
                        NETO = NETO + IMPTOS;
                        END
                    if (TIPOCUEN = 'N') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CTACONSUMO, :CONCEPTO, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NUMITEMS = NUMITEMS + 1;
                        NETO = NETO + IMPTOS;
                        END
                    END
                ELSE
                    BEGIN
                    if (TIPOCUEN = 'I') then
                        BEGIN
                        FOR SELECT F.ARTI_COD, FCDE_CONSUMO FROM ARTICULO A, FACTURAS_COMPRAS_DETALLE F WHERE F.FACO_ID = :IDDOC INTO :ARTICULO, :IMPTOS
                            DO
                            BEGIN
                            if (IMPTOS <> 0) then
                                BEGIN
                                execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                    VALUES (:IDC, :NUMITEMS, :CTACONSUMO, :CONCEPTO, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                                NUMITEMS = NUMITEMS + 1;
                                NETO = NETO - IMPTOS;
                                END
                            END
                        END
                    if (TIPOCUEN = 'C') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CTACONSUMO, :CONCEPTO, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                        NUMITEMS = NUMITEMS + 1;
                        NETO = NETO - IMPTOS;
                        END
                    if (TIPOCUEN = 'N') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CTACONSUMO, :CONCEPTO, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NUMITEMS = NUMITEMS + 1;
                        NETO = NETO - IMPTOS;
                        END
                    END
                END
            END
        if (CONSUMO = 'K') then /* CONSUMO EN CTA CONSTANTE */
            BEGIN
            SELECT SUM(FCDE_CONSUMO) FROM FACTURAS_COMPRAS_DETALLE F WHERE F.FACO_ID = :IDDOC INTO :IMPTOS;
            if (IMPTOS <> 0) then
              BEGIN
              execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
              /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
              EXECUTE PROCEDURE CUENTA_INTERFAZ(21, :IDDOC, :CTACONSUMO, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
              if (ERRORC <> 0) then
                ERROR = ERROR + 1;
              if (FOMENTO <> 'SI') then
                BEGIN
                /* DEPENDE DEL TIPO DE CUENTA */
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT F.ARTI_COD, FCDE_CONSUMO FROM ARTICULO A, FACTURAS_COMPRAS_DETALLE F WHERE F.FACO_ID = :IDDOC INTO :ARTICULO, :IMPTOS
                        DO
                        BEGIN
                        if (IMPTOS <> 0) then
                            BEGIN
                            execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                VALUES (:IDC, :NUMITEMS, :CTACONSUMO, :CONCEPTO, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                            NUMITEMS = NUMITEMS + 1;
                            NETO = NETO + IMPTOS;
                            END
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    /* INSERTE EL REGISTRO DE LA BASE */
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NUMITEMS, :CTACONSUMO, :CONCEPTO, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    NUMITEMS = NUMITEMS + 1;
                    NETO = NETO + IMPTOS;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NUMITEMS, :CTACONSUMO, :CONCEPTO, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NUMITEMS = NUMITEMS + 1;
                    NETO = NETO + IMPTOS;
                    END
                END
              ELSE
                BEGIN
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT F.ARTI_COD, FCDE_CONSUMO FROM ARTICULO A, FACTURAS_COMPRAS_DETALLE F WHERE F.FACO_ID = :IDDOC INTO :ARTICULO, :IMPTOS
                        DO
                        BEGIN
                        if (IMPTOS <> 0) then
                            BEGIN
                           execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                           INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                VALUES (:IDC, :NUMITEMS, :CTACONSUMO, :CONCEPTO, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                            NUMITEMS = NUMITEMS + 1;
                            NETO = NETO - IMPTOS;
                            END
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    /* INSERTE EL REGISTRO DE LA BASE */
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NUMITEMS, :CTACONSUMO, :CONCEPTO, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    NUMITEMS = NUMITEMS + 1;
                    NETO = NETO - IMPTOS;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NUMITEMS, :CTACONSUMO, :CONCEPTO, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NUMITEMS = NUMITEMS + 1;
                    NETO = NETO - IMPTOS;
                    END
                END
              end
            END
        /* DESCUENTO */
        if ((CTADTO IS NOT NULL) AND
            (CTADTO <> '')) THEN
          BEGIN
          execute procedure redondee(VRDTO, DIG) returning_values (VRDTO);
          if (VRDTO <> 0) then
            begin
            /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
            EXECUTE PROCEDURE CUENTA_INTERFAZ(21, :IDDOC, :CTADTO, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :VRDTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 21);
                NUMITEMS = NUMITEMS + 1;
                NETO = NETO - VRDTO;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                /* INSERTE EL REGISTRO DE LA BASE */
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :VRDTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NUMITEMS = NUMITEMS + 1;
                NETO = NETO - VRDTO;
                END
            end
          END
        /* VALOR ADIC */
        if ((CTAADIC IS NOT NULL) AND
            (CTAADIC <> '')) THEN
          BEGIN
          execute procedure redondee(VRADIC, DIG) returning_values (VRADIC);
          if (VRADIC <> 0) then
            begin
            /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
            EXECUTE PROCEDURE CUENTA_INTERFAZ(21, :IDDOC, :CTAADIC, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :VRADIC, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 21);
                NUMITEMS = NUMITEMS + 1;
                NETO = NETO + VRADIC;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :VRADIC, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NUMITEMS = NUMITEMS + 1;
                NETO = NETO + VRADIC;
                END
            end
          END
        /* VALOR EXTRA */
        if ((CTAEXTRA IS NOT NULL) AND
            (CTAEXTRA <> '')) THEN
          BEGIN
          execute procedure redondee(VREXTRA, DIG) returning_values (VREXTRA);
          if (VREXTRA <> 0) then
            begin
            /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
            EXECUTE PROCEDURE CUENTA_INTERFAZ(21, :IDDOC, :CTAEXTRA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :VREXTRA, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 21);
                NUMITEMS = NUMITEMS + 1;
                NETO = NETO + VREXTRA;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :VREXTRA, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NUMITEMS = NUMITEMS + 1;
                NETO = NETO + VREXTRA;
                END
            end
          END

        /* DESCUENTE EL IMPOCONSUMO */
        SELECT SUM(FCDE_CONSUMO) FROM FACTURAS_COMPRAS_DETALLE F WHERE F.FACO_ID = :IDDOC INTO :IMPTOS;
        if (IMPTOS IS NULL) then
            IMPTOS = 0;
        vrsubt = vrsubt - IMPTOS;
        /* RETENCION FUENTE */
        if ((RTFTE = 'P') or (RTFTE = 'K')) then
          BEGIN
          execute procedure redondee(VRRTFTE, DIG) returning_values (VRRTFTE);
          if (VRRTFTE <> 0) then
            begin
            if (RTFTE = 'P') then
                CTARTFTE = TCTARTFTE;
            EXECUTE PROCEDURE CUENTA_INTERFAZ(21, :IDDOC, :CTARTFTE, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :VRRTFTE, (:VRSUBT*-1), :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NUMITEMS = NUMITEMS + 1;
                NETO = NETO - VRRTFTE;
                SUMA = VRRTFTE;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :VRRTFTE, (:VRSUBT*-1), :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NUMITEMS = NUMITEMS + 1;
                NETO = NETO - VRRTFTE;
                SUMA = VRRTFTE;
                END
            end
          END
        if (RTFTE = 'A') then
          BEGIN
          FOR SELECT MAX(COAR_CTARTFTE), MAX(COAR_RTFTE), MIN(COAR_RTBASE), SUM(FCDE_TOTAL-FCDE_IVAMONTO-FCDE_CONSUMO), SUM((FCDE_TOTAL-FCDE_IVAMONTO-FCDE_CONSUMO)*COAR_RTFTE)
            FROM CONTABIL_ARTICULO C, FACTURAS_COMPRAS_DETALLE F
            WHERE F.faco_id = :IDDOC AND F.ARTI_COD = C.ARTI_COD
            GROUP BY COAR_CTARTFTE
            INTO :CTARTFTE, :PRTFTE, :baseadic,  :MONTO, :VRRTFTE
            DO
            BEGIN
            MONTO = MONTO * FACTOR * -1;
            if (ABS(MONTO) >= :baseadic) then
                BEGIN
                VRRTFTE = VRRTFTE * FACTOR / 100;
                execute procedure redondee(VRRTFTE, DIG) returning_values (VRRTFTE);
                execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                if (VRRTFTE <> 0) then
                    BEGIN
                    EXECUTE PROCEDURE CUENTA_INTERFAZ(21, :IDDOC, :CTARTFTE, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
                    if (ERRORC <> 0) then
                        ERROR = ERROR + 1;
                    if (TIPOCUEN = 'C') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :VRRTFTE, :MONTO, :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                        NUMITEMS = NUMITEMS + 1;
                        NETO = NETO - VRRTFTE;
                        SUMA = VRRTFTE;
                        END
                    if (TIPOCUEN = 'N') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :VRRTFTE, :MONTO, :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NUMITEMS = NUMITEMS + 1;
                        NETO = NETO - VRRTFTE;
                        SUMA = VRRTFTE;
                        END
                    end
                end
              END
          END
        /* RETENCION IVA */
        if ((RTIVA = 'P') or (RTIVA = 'K')) then
          BEGIN
          execute procedure redondee(VRRTIVA, DIG) returning_values (VRRTIVA);
          if (VRRTIVA <> 0) then
            begin
            if (RTIVA = 'P') then
                CTARTIVA = TCTARTIVA;
            EXECUTE PROCEDURE CUENTA_INTERFAZ(21, :IDDOC, :CTARTIVA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :VRRTIVA, (:VRIVA*-1), :PORC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 21);
                NUMITEMS = NUMITEMS + 1;
                NETO = NETO - VRRTIVA;
                SUMA = SUMA + VRRTIVA;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :VRRTIVA, (:VRIVA*-1), :PORC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NUMITEMS = NUMITEMS + 1;
                NETO = NETO - VRRTIVA;
                SUMA = SUMA + VRRTIVA;
                END
            end
          END
        /* RETENCION DE ICA */
        if ((RTICA = 'P') or (RTICA = 'K')) then
          BEGIN
          execute procedure redondee(VRRTICA, DIG) returning_values (VRRTICA);
          if (VRRTICA <> 0) then
            begin
            if (RTICA = 'P') then
                CTARTICA = TCTARTICA;
            EXECUTE PROCEDURE CUENTA_INTERFAZ(21, :IDDOC, :CTARTICA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :VRRTICA, (:VRSUBT*-1), :PRTICA, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 21);
                NUMITEMS = NUMITEMS + 1;
                NETO = NETO - VRRTICA;
                SUMA = SUMA + VRRTICA;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :VRRTICA, (:VRSUBT*-1), :PRTICA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NUMITEMS = NUMITEMS + 1;
                NETO = NETO - VRRTICA;
                SUMA = SUMA + VRRTICA;
                END
            end
          END
        /* CIERRE EL COMPROBANTE CONTRA LA CUENTA DEL TERCERO O LA CONSTANTE */
        if ((CXP = 'P') or (CXP = 'K')) then
            BEGIN
            SUMA = VRTOTAL - SUMA;
            execute procedure redondee(SUMA, DIG) returning_values (SUMA);
            if (CXP = 'P') then
                CTACXP = TCTAPROV;
            EXECUTE PROCEDURE CUENTA_INTERFAZ(21, :IDDOC, :CTACXP, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :SUMA, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 21);
            if (TIPOCUEN = 'N') then
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :SUMA, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NETO = NETO - SUMA;
            NUMITEMS = NUMITEMS + 1;
            END
        /* recorra las cuentas adicionales */
        FOR SELECT INCC_CUENTA, INCC_BASE, INCC_PORC, INCC_VALOR, INCC_DB FROM INTERFAZ_COMPRAS_CTAS
            WHERE INCO_ID = :IDINTER INTO :CUENTAADIC, :BASEADIC, :PORCADIC, :VALORADIC, :DBADIC
            DO
            BEGIN
            if (VALORADIC <> 0) then
                MONTO = VALORADIC;
            ELSE
                BEGIN
                if (:BASEADIC = 'SUBTOTAL') then
                    VALORADIC = VRTOTAL - VREXTRA - VRIVA - VRADIC + VRDTO;
                if (:BASEADIC = 'DESCUENTO') then
                    VALORADIC = VRDTO;
                if (:BASEADIC = 'IVA') then
                    VALORADIC = VRIVA;
                if (:BASEADIC = 'CONSUMO') then
                    SELECT SUM(FCDE_CONSUMO) FROM FACTURAS_COMPRAS_DETALLE F WHERE F.FACO_ID = :IDDOC INTO :VALORADIC;
                if (:BASEADIC = 'ADICIONAL') then
                    VALORADIC = VRADIC;
                if (:BASEADIC = 'EXTRA') then
                    VALORADIC = VREXTRA;
                if (:BASEADIC = 'TOTAL') then
                    VALORADIC = VRTOTAL;
                MONTO = CAST(VALORADIC AS DOUBLE PRECISION) * PORCADIC / 100;
                END
            if (MONTO <> 0) then
                BEGIN
                execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                EXECUTE PROCEDURE CUENTA_INTERFAZ(21, :IDDOC, :CUENTAADIC, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'C') then
                    BEGIN
                    if (DBADIC = 'S') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTAADIC, :CONCEPTO, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                        SUMA = SUMA + MONTO;
                        NETO = NETO + MONTO;
                        END
                    ELSE
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTAADIC, :CONCEPTO, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                        SUMA = SUMA - MONTO;
                        NETO = NETO - MONTO;
                        END
                    NUMITEMS = NUMITEMS + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    if (DBADIC = 'S') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTAADIC, :CONCEPTO, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        SUMA = SUMA + MONTO;
                        NETO = NETO + MONTO;
                        END
                    ELSE
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTAADIC, :CONCEPTO, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        SUMA = SUMA - MONTO;
                        NETO = NETO - MONTO;
                        END
                    NUMITEMS = NUMITEMS + 1;
                    END
                END
            END
        if (NETO <> 0) then
            BEGIN
            EXECUTE PROCEDURE lee_configuracion ('CONTABILIDAD','GENERAL','CUENTA PARA CUADRAR COMPROBANTES DESCUADRADOS DE INTERFAZ') returning_values (:ctaadic);
            if (ctaadic <> '') then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(21, :IDDOC, :CTAADIC, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'C') then
                    BEGIN
                    if (NETO < 0) then
                        BEGIN
                        NETO = NETO * -1;
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :NETO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                        END
                    ELSE
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :NETO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                        END
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    if (NETO < 0) then
                        BEGIN
                        NETO = NETO * -1;
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :NETO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        END
                    ELSE
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :NETO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        END
                    END
                END
            END
        END
    if (ERROR > 0) then
        VER = 'S';
    SUSPEND;
    END
ELSE
    BEGIN
    EXECUTE PROCEDURE ERROR (21, :IDDOC, :PREFIJO, 1);
    ERROR = ERROR + 1;
    VER = 'S';
    SUSPEND;
    END
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE CONTABILICE_COMP_SIMPLIFICADO(
    IDI INTEGER)
RETURNS (
    ID INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    ESTADO VARCHAR(20),
    IDC INTEGER)
AS
DECLARE VARIABLE VER CHAR(2);
declare variable ERROR INTEGER;
BEGIN
FOR SELECT FACO_ID, PREF_PRE, FACO_NUMERO FROM FACTURAS_COMPRA C, PROVEEDORES P WHERE
    C.TERC_NIT = P.TERC_NIT AND PROV_SIMPLIFICADO = 'S' AND FACO_ANULADO = 'N'
    ORDER BY FACO_ID INTO :ID, :PREF, :NUMERO
DO
  BEGIN
  ESTADO = 'PROCESANDO';
  SUSPEND;
  /* BORRE LA CONTABILIZACION */
/*  delete FROM comprobante_detalle WHERE ENCO_CONSEC IN (SELECT ENCO_CONSEC FROM COMPROBANTE_ENCABEZADO WHERE ENCO_TIPOREF = 21 AND ENCO_IDREF = :ID);
  DELETE FROM comprobante_encabezado  WHERE ENCO_TIPOREF = 21 AND ENCO_IDREF = :ID; */
  EXECUTE PROCEDURE CONTABIL_FACTCOMP (:ID, :IDI) RETURNING_VALUES (:ERROR, VER, :IDC);
  if (ERROR = 0) then
    BEGIN
/*    EXECUTE PROCEDURE CONTABILIZA_PENDIENTE (:IDC); */
    ESTADO = 'OK';
    END
  ELSE
    ESTADO = 'ERROR';
  suspend;
  END
END

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE FACTCOMP_SIN_CONTABILIDAD(
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    ID INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    ESTADO VARCHAR(20),
    IDI INTEGER,
    IDC INTEGER)
AS
DECLARE VARIABLE VER CHAR(2);
declare variable FECICNT VARCHAR(10);
declare variable FECFCNT VARCHAR(10);
declare variable ERROR INTEGER;
declare variable idref INTEGER;
BEGIN
EXECUTE PROCEDURE fecha_a_conta(FECINI) returning_values (FECICNT);
EXECUTE PROCEDURE fecha_a_conta(FECFIN) returning_values (FECFCNT);
FOR SELECT FACO_ID, PREF_PRE, FACO_NUMERO FROM FACTURAS_COMPRA WHERE FACO_ANULADO = 'N' AND
    FACO_FECHA >= :FECINI AND FACO_FECHA <= :FECFIN ORDER BY FACO_ID
    INTO :ID, :PREF, :NUMERO
DO
  BEGIN
  idref = null;
  SELECT ENCO_IDREF FROM COMPROBANTE_ENCABEZADO WHERE ENCO_TIPOREF = 21 AND ENCO_FECHA >= :FECICNT AND ENCO_FECHA <= :FECFCNT and ENCO_IDREF = :id into :idref;
  if (idref IS NULL) then
  begin
   ESTADO = 'PROCESANDO';
   SUSPEND;
   SELECT MAX(INCO_ID) FROM INTERFAZ_COMPRAS WHERE PREF_PRE = :PREF AND TIDO_COD = 21 INTO :IDI;
   EXECUTE PROCEDURE CONTABIL_FACTCOMP (:ID, :IDI) RETURNING_VALUES (:ERROR, VER, :IDC);
   if (ERROR = 0) then
    BEGIN
    EXECUTE PROCEDURE CONTABILIZA_PENDIENTE (:IDC);
    ESTADO = 'OK';
    END
   ELSE
    ESTADO = 'ERROR';
   suspend;
  End
  END
END

^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure CONTABIL_DEVOLCOMP (
    IDDOC integer,
    IDINTER integer)
returns (
    ERROR integer,
    VER char(1),
    IDC integer)
AS
declare variable PREFIJO VARCHAR(4);
declare variable NUM VARCHAR(6);
declare variable NUMERO VARCHAR(10);
declare variable FECAUX DATE;
declare variable FECHA CHAR(8);
declare variable CONCEPTO CHAR(100);
declare variable NUMFAC VARCHAR(10);
declare variable VRDTO NUMERIC(18, 2);
declare variable VRADIC NUMERIC(18, 2);
declare variable VRSUBT NUMERIC(18, 2);
declare variable VRIVA NUMERIC(18, 2);
declare variable PRTFTE NUMERIC(9, 2);
declare variable VRRTFTE NUMERIC(18, 2);
declare variable VRRTIVA NUMERIC(18, 2);
declare variable PRTICA NUMERIC(9, 2);
declare variable VRRTICA NUMERIC(18, 2);
declare variable VRTOTAL NUMERIC(18, 2);
declare variable VREXTRA NUMERIC(18, 2);
declare variable TIPOCOMP VARCHAR(3);
declare variable PREFCONT VARCHAR(4);
declare variable INVEN CHAR(1);
declare variable CTAINVEN VARCHAR(20);
declare variable IVA CHAR(1);
declare variable CTAIVA VARCHAR(20);
declare variable CONSUMO CHAR(1);
declare variable CTACONSUMO VARCHAR(20);
declare variable CXP CHAR(1);
declare variable CTACXP VARCHAR(20);
declare variable RTFTE CHAR(1);
declare variable CTARTFTE VARCHAR(20);
declare variable RTIVA CHAR(1);
declare variable CTARTIVA VARCHAR(20);
declare variable RTICA CHAR(1);
declare variable CTARTICA VARCHAR(20);
declare variable CTADTO VARCHAR(20);
declare variable CTAADIC VARCHAR(20);
declare variable CTAEXTRA VARCHAR(20);
declare variable EXISTE CHAR(1);
declare variable CUENTA VARCHAR(20);
declare variable MONTO NUMERIC(18,2);
declare variable TIPOCUEN CHAR(1);
declare variable NIT VARCHAR(20);
declare variable PROY VARCHAR(4);
declare variable CENTRO VARCHAR(4);
declare variable PORC NUMERIC(5,2);
declare variable DEBITO NUMERIC(18,2);
declare variable CREDITO NUMERIC(18,2);
declare variable NUMITEMS INTEGER;
declare variable ARTICULO VARCHAR(15);
declare variable IMPINC CHAR(1);
declare variable IMPTOS NUMERIC(18, 2);
declare variable SUMA NUMERIC(18,2);
declare variable PORCIVA NUMERIC(9,2);
declare variable TCTAPROV VARCHAR(20);
declare variable TCTARTFTE VARCHAR(20);
declare variable TCTARTIVA VARCHAR(20);
declare variable TCTARTICA VARCHAR(20);
declare variable CUENTAADIC VARCHAR(20);
declare variable BASEADIC VARCHAR(20);
declare variable PORCADIC NUMERIC(5,2);
declare variable VALORADIC NUMERIC(18,2);
declare variable DBADIC CHAR(1);
declare variable FOMENTO CHAR(2);
declare variable ANULADO CHAR(1);
declare variable CENT CHAR(1);
declare variable ERRORC INTEGER;
DECLARE VARIABLE MENORV CHAR(2);
DECLARE VARIABLE MERCANCIA NUMERIC(18,2);
declare variable FACTOR DOUBLE PRECISION;
declare variable DIG INTEGER;
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_CTAINVEN, INCO_CTAIVA, INCO_CTACONSUMO, INCO_CTADTO, INCO_CTAADIC, INCO_CTAEXTRA, INCO_CTACXP, INCO_CTARTFTE, INCO_CTARTIVA, INCO_CTARTICA, INCO_CONFIRMAR, INCO_CENTRO
    FROM INTERFAZ_COMPRAS
    WHERE INCO_ID = :IDINTER
    INTO :EXISTE, :TIPOCOMP, :PREFCONT, :INVEN, :IVA, :CONSUMO, :CXP, :RTFTE, :RTIVA, :RTICA, :CTAINVEN, :CTAIVA, :CTACONSUMO, :CTADTO, :CTAADIC, :CTAEXTRA, :CTACXP, :CTARTFTE, :CTARTIVA, :CTARTICA, :VER, :CENT;
if (EXISTE = 'S') then
   BEGIN
    /* BORRE 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, PROV_CTARTFTE, PROV_CTARTIVA, PROV_CTARTICA, PROV_CTAPAGAR, DVCO_ANULADO
        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, :TCTARTFTE, TCTARTIVA, TCTARTICA, TCTAPROV, ANULADO;
   if (ANULADO = 'N') then
    BEGIN
    NUMERO = PREFIJO || NUM;
    VRSUBT = VRTOTAL - VREXTRA - VRIVA; /* BASE DE RETEFTE Y RETEICA */
    IF (CENT = 'B') THEN
        SELECT BODE_CENTRO, BODE_PROY FROM BODEGA B, DEVOLUCIONES_COMPRAS F
            WHERE B.BODE_COD = F.BODE_COD AND F.DVCO_ID = :IDDOC INTO :CENTRO, :PROY;
    ELSE
        SELECT PREF_CENTRO,PREF_PROY FROM PREFIJOS P, DEVOLUCIONES_COMPRAS F
            WHERE P.PREF_PRE = F.PREF_PRE AND F.DVCO_ID = :IDDOC AND P.TIDO_COD = 24 INTO :CENTRO, :PROY;
    /* CONVIERTA LA FECHA A CADENA */
    EXECUTE PROCEDURE FECHA_A_CONTA(:FECAUX) returning_values (:FECHA);
    EXECUTE PROCEDURE LEE_CONFIGURACION('COMPRAS', 'FACTURAS', 'USAR IMPOCONSUMO COMO PORCENTAJE DE FOMENTO') RETURNING_VALUES (FOMENTO);
    EXECUTE PROCEDURE lee_configuracion('COMPRAS','FACTURAS','DESCUENTO Y VALOR ADICIONAL DEL DOCUMENTO COMO MENOR VALOR DEL COSTO') returning_values (:MENORV);
    SELECT CAST(CONF_VALOR AS INTEGER) FROM CONFIGURACION WHERE CONF_MODULO = 'COMPRAS' AND CONF_CATEGORIA = 'GENERAL' AND CONF_PROPIEDAD = 'REDONDEO AL MULTIPLO DE DIEZ EN TOTALES' INTO :DIG;
    VRSUBT = VRTOTAL - VREXTRA - VRIVA;
    MERCANCIA = VRSUBT - VRADIC + VRDTO;
    SELECT SUM(DVCD_consumo) from devoluciones_compras_det where dvco_id = :IDDOC into :valoradic;
    if (MENORV = 'SI') then
        if (MERCANCIA <> 0) then
            FACTOR = (CAST(VRSUBT AS DOUBLE PRECISION) - VALORADIC) / (CAST(MERCANCIA AS DOUBLE PRECISION) - VALORADIC);
        ELSE
            FACTOR = 1;
    ELSE
        FACTOR = 1;

    /* REGISTRE EL ENCABEZADO CONTABLE */
    CONCEPTO = 'DEVOLUCION COMPRA No. ' || NUMERO || ' EN FACTURA ' || NUMFAC;
    IDC = GEN_ID(ID_CONTABILIZA, 1);
    INSERT INTO CONTABILIZACION (CNTB_ID, CNTB_TIPOCOMP, CNTB_PREFCNT, CNTB_NUMERO, CNTB_FECHA, CNTB_CONCEPTO, CNTB_REF, CNTB_TIPOREF, CNTB_IDREF, CNTB_PREFREF, CNTB_NUMREF, CNTB_PROCESADO)
        VALUES (:IDC, :TIPOCOMP, :PREFCONT, :NUM, :FECHA, :CONCEPTO, '', 24, :IDDOC, :PREFIJO, :NUM, 'N');

    NUMITEMS = 0;
    SUMA = 0;
    ERROR = 0;
    /* CUENTAS DE INVENTARIO */
    if (INVEN = 'A') then
        BEGIN
        /* SUME LAS BASES DE LOS ARTICULOS DEL DOCUMENTO */
        FOR SELECT MAX(COAR_CTACOMP), SUM(cast(DVCD_CANT as double precision) * (DVCD_PRUNIT-DVCD_DTOMONTO)), SUM(DVCD_IVAMONTO), SUM(DVCD_CONSUMO)
            FROM ARTICULO A, CONTABIL_ARTICULO C, DEVOLUCIONES_COMPRAS_DET F
            WHERE F.DVCO_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD
            GROUP BY COAR_CTAINV
            INTO :CTAINVEN, :MONTO, :IMPTOS, :VALORADIC
            DO
            BEGIN
            if (IMPINC = 'S') then
                BEGIN
                MONTO = MONTO - IMPTOS;
                if (FOMENTO <> 'SI') then
                    MONTO = MONTO - VALORADIC;
                END
            /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
            EXECUTE PROCEDURE CUENTA_INTERFAZ(24, :IDDOC, :CTAINVEN, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            /* DEPENDE DEL TIPO DE CUENTA */
            if ((TIPOCUEN = 'I') or (TIPOCUEN = 'A')) then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, REGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT F.ARTI_COD, (cast(DVCD_CANT as double precision) * (DVCD_PRUNIT-DVCD_DTOMONTO)), DVCD_IVAMONTO, DVCD_CONSUMO
                    FROM ARTICULO A, CONTABIL_ARTICULO C, DEVOLUCIONES_COMPRAS_DET F
                    WHERE F.DVCO_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTAINV = :CUENTA
                    INTO :ARTICULO, :MONTO, :IMPTOS, :VALORADIC
                DO
                    BEGIN
                    if (IMPINC = 'S') then
                        BEGIN
                        MONTO = MONTO - IMPTOS;
                        if (FOMENTO <> 'SI') then
                            MONTO = MONTO - VALORADIC;
                        END
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                    NUMITEMS = NUMITEMS + 1;
                    SUMA = SUMA - MONTO;
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                /* INSERTE EL REGISTRO DE LA BASE */
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 24);
                NUMITEMS = NUMITEMS + 1;
                SUMA = SUMA - MONTO;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                /* INSERTE EL REGISTRO DE LA BASE */
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NUMITEMS = NUMITEMS + 1;
                SUMA = SUMA - MONTO;
                END
            END /* FOR */
        END /* INVENTARIO X ARTICULO */

    if (INVEN = 'K') then
        BEGIN
        /* SUME LAS BASES DE LOS ARTICULOS DEL DOCUMENTO */
        SELECT SUM(cast(DVCD_CANT as double precision) * (DVCD_PRUNIT-DVCD_DTOMONTO)), SUM(DVCD_IVAMONTO), SUM(DVCD_CONSUMO)
            FROM DEVOLUCIONES_COMPRAS_DET WHERE DVCO_ID = :IDDOC
            INTO :MONTO, :IMPTOS, :VALORADIC;
        if (IMPINC = 'S') then
            BEGIN
            MONTO = MONTO - IMPTOS;
            if (FOMENTO <> 'SI') then
                MONTO = MONTO - VALORADIC;
            END
        /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
        EXECUTE PROCEDURE CUENTA_INTERFAZ(24, :IDDOC, :CTAINVEN, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        /* DEPENDE DEL TIPO DE CUENTA */
        if ((TIPOCUEN = 'I') or (TIPOCUEN = 'A'))  then
            BEGIN
            /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
            FOR SELECT ARTI_COD, (cast(DVCD_CANT as double precision) * (DVCD_PRUNIT-DVCD_DTOMONTO)), DVCD_IVAMONTO, DVCD_CONSUMO
                FROM DEVOLUCIONES_COMPRAS_DET
                WHERE DVCO_ID = :IDDOC
                INTO :ARTICULO, :MONTO, :IMPTOS, :VALORADIC
                DO
                BEGIN
                if (IMPINC = 'S') then
                    BEGIN
                    MONTO = MONTO - IMPTOS;
                    if (FOMENTO <> 'SI') then
                        MONTO = MONTO - VALORADIC;
                    END
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NUMITEMS, :CTAINVEN, :CONCEPTO, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                NUMITEMS = NUMITEMS + 1;
                SUMA = SUMA - MONTO;
                END
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NUMITEMS, :CTAINVEN, :CONCEPTO, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 24);
            NUMITEMS = NUMITEMS + 1;
            SUMA = SUMA - MONTO;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NUMITEMS, :CTAINVEN, :CONCEPTO, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NUMITEMS = NUMITEMS + 1;
            SUMA = SUMA - MONTO;
            END
        END /* INVEN = K */
        
    /* EL IVA */
    if (IVA = 'A') then
        BEGIN
        /* SUME LAS BASES DE LOS ARTICULOS DEL DOCUMENTO */
        FOR SELECT MAX(COAR_CTAIVAC), SUM(DVCD_IVAMONTO), SUM(cast(DVCD_CANT as double precision) * (DVCD_PRUNIT-DVCD_DTOMONTO)), SUM(DVCD_CONSUMO)
            FROM ARTICULO A, CONTABIL_ARTICULO C, DEVOLUCIONES_COMPRAS_DET F
            WHERE F.DVCO_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND DVCD_IVAMONTO <> 0
            GROUP BY COAR_CTAIVAC
            INTO :CTAIVA, :IMPTOS, :MONTO, :VALORADIC
        DO
          if (IMPTOS <> 0) then
            BEGIN
            IMPTOS = CAST(IMPTOS AS DOUBLE PRECISION) * VRSUBT / MERCANCIA;
            if (IMPINC = 'S') then
                BEGIN
                MONTO = MONTO - IMPTOS;
                if (FOMENTO <> 'SI') then
                    MONTO = MONTO - VALORADIC;
                END

            /* TRAIGA LAS CARCATERISTICAS DE LA CUENTA */
            EXECUTE PROCEDURE CUENTA_INTERFAZ(24, :IDDOC, :CTAIVA, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            /* DEPENDE DEL TIPO DE CUENTA */
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT F.ARTI_COD, DVCD_IVAMONTO, (cast(DVCD_CANT as double precision) * (DVCD_PRUNIT-DVCD_DTOMONTO)), TAIV_PORC, DVCD_CONSUMO
                    FROM ARTICULO A, CONTABIL_ARTICULO C, DEVOLUCIONES_COMPRAS_DET F, TARIFA_IVA T
                    WHERE F.DVCO_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTAIVAV = :CUENTA AND A.TAIV_COD = T.TAIV_COD
                    INTO :ARTICULO, :IMPTOS, :MONTO, :PORCIVA, :VALORADIC
                DO
                    BEGIN
                    if (IMPINC = 'S') then
                        BEGIN
                        MONTO = MONTO - IMPTOS;
                        if (FOMENTO <> 'SI') then
                            MONTO = MONTO - VALORADIC;
                        END
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :IMPTOS, :MONTO, :PORCIVA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                    NUMITEMS = NUMITEMS + 1;
                    SUMA = SUMA - IMPTOS;
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :IMPTOS, :MONTO, :PORCIVA, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 24);
                NUMITEMS = NUMITEMS + 1;
                SUMA = SUMA - IMPTOS;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :IMPTOS, :MONTO, :PORCIVA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NUMITEMS = NUMITEMS + 1;
                SUMA = SUMA - IMPTOS;
                END
            END /* FOR */
        END /* IVA X ARTICULO */
        
    if (IVA = 'K') then /* IVA EN CTA CONSTANTE */
        BEGIN
        SELECT SUM(DVCD_IVAMONTO), SUM(cast(DVCD_CANT as double precision) * (DVCD_PRUNIT-DVCD_DTOMONTO)), SUM(DVCD_CONSUMO)
            FROM DEVOLUCIONES_COMPRAS_DET F
            WHERE F.DVCO_ID = :IDDOC  AND DVCD_IVAMONTO <> 0
            INTO :IMPTOS, :MONTO, :VALORADIC;
            
        if (IMPTOS <> 0) then
            BEGIN
            IMPTOS = CAST(IMPTOS AS DOUBLE PRECISION) * VRSUBT / MERCANCIA;
            if (IMPINC = 'S') then
                BEGIN
                MONTO = MONTO - IMPTOS;
                if (FOMENTO <> 'SI') then
                    MONTO = MONTO - VALORADIC;
                END
            /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
            EXECUTE PROCEDURE CUENTA_INTERFAZ(24, :IDDOC, :CTAIVA, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            /* DEPENDE DEL TIPO DE CUENTA */
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT F.ARTI_COD, (cast(DVCD_CANT as double precision) * (DVCD_PRUNIT-DVCD_DTOMONTO)), DVCD_IVAMONTO, TAIV_PORC, DVCD_CONSUMO
                    FROM ARTICULO A, DEVOLUCIONES_COMPRAS_DET F, TARIFA_IVA T
                    WHERE F.DVCO_ID = :IDDOC AND A.TAIV_COD = T.TAIV_COD
                    INTO :ARTICULO, :MONTO, :IMPTOS, :PORCIVA, :VALORADIC
                    DO
                    BEGIN
                    if (IMPTOS <> 0) then
                        BEGIN
                        if (IMPINC = 'S') then
                            BEGIN
                            MONTO = MONTO - IMPTOS;
                            if (FOMENTO <> 'SI') then
                                MONTO = MONTO - VALORADIC;
                            END
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CTAIVA, :CONCEPTO, '', 0, :IMPTOS, :MONTO, :PORCIVA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                        NUMITEMS = NUMITEMS + 1;
                        SUMA = SUMA - IMPTOS;
                        END
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                /* INSERTE EL REGISTRO DE LA BASE */
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NUMITEMS, :CTAIVA, :CONCEPTO, '', 0, :IMPTOS, :MONTO, :PORCIVA, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 24);
                NUMITEMS = NUMITEMS + 1;
                SUMA = SUMA - IMPTOS;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                /* INSERTE EL REGISTRO DE LA BASE */
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NUMITEMS, :CTAIVA, :CONCEPTO, '', 0, :IMPTOS, :MONTO, :PORCIVA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NUMITEMS = NUMITEMS + 1;
                SUMA = SUMA - IMPTOS;
                END
            END /* <> 0 */
        END /* IVA EN CTA CONSTANTE */
        
    /* EL IMPOCONSUMO */
    if (CONSUMO = 'A') then
        BEGIN
        /* SUME LAS BASES DE LOS ARTICULOS DEL DOCUMENTO */
        FOR SELECT MAX(COAR_CTACONS), SUM(DVCD_CONSUMO)
            FROM ARTICULO A, CONTABIL_ARTICULO C, DEVOLUCIONES_COMPRAS_DET F
            WHERE F.DVCO_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD
            GROUP BY COAR_CTACONS
            INTO :CTACONSUMO, :IMPTOS
        DO
            BEGIN
            if (IMPTOS <> 0) then
                BEGIN
                /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
                EXECUTE PROCEDURE CUENTA_INTERFAZ(24, :IDDOC, :CTACONSUMO, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (FOMENTO <> 'SI') then
                    BEGIN
                    /* DEPENDE DEL TIPO DE CUENTA */
                    if (TIPOCUEN = 'I') then
                        BEGIN
                        /* ES UNA CUENTA DE INVENTARIO, REGISTRE UNO A UNO LOS ARTICULOS */
                        FOR SELECT F.ARTI_COD, DVCD_CONSUMO
                            FROM ARTICULO A, CONTABIL_ARTICULO C, DEVOLUCIONES_COMPRAS_DET F
                            WHERE F.DVCO_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTACONS = :CUENTA
                            INTO :ARTICULO, :IMPTOS
                            DO
                            BEGIN
                            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                            NUMITEMS = NUMITEMS + 1;
                            SUMA = SUMA - IMPTOS;
                            END
                        END
                    if (TIPOCUEN = 'C') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 24);
                        NUMITEMS = NUMITEMS + 1;
                        SUMA = SUMA - IMPTOS;
                        END
                    if (TIPOCUEN = 'N') then
                        BEGIN
                        /* INSERTE EL REGISTRO DE LA BASE */
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NUMITEMS = NUMITEMS + 1;
                        SUMA = SUMA - IMPTOS;
                        END
                    END
                ELSE
                    BEGIN
                    if (TIPOCUEN = 'I') then
                        BEGIN
                        /* ES UNA CUENTA DE INVENTARIO, REGISTRE UNO A UNO LOS ARTICULOS */
                        FOR SELECT F.ARTI_COD, DVCD_CONSUMO
                            FROM ARTICULO A, CONTABIL_ARTICULO C, DEVOLUCIONES_COMPRAS_DET F
                            WHERE F.DVCO_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTACONS = :CUENTA
                            INTO :ARTICULO, :IMPTOS
                            DO
                            BEGIN
                            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                VALUES (:IDC, :NUMITEMS, :CTACONSUMO, :CONCEPTO, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                            NUMITEMS = NUMITEMS + 1;
                            SUMA = SUMA + IMPTOS;
                            END
                        END
                    if (TIPOCUEN = 'C') then
                        BEGIN
                        /* INSERTE EL REGISTRO DE LA BASE */
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CTACONSUMO, :CONCEPTO, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 24);
                        NUMITEMS = NUMITEMS + 1;
                        SUMA = SUMA + IMPTOS;
                        END
                    if (TIPOCUEN = 'N') then
                        BEGIN
                        /* INSERTE EL REGISTRO DE LA BASE */
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CTACONSUMO, :CONCEPTO, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NUMITEMS = NUMITEMS + 1;
                        SUMA = SUMA + IMPTOS;
                        END
                    END
                END
            END /* FOR */
        END /* CONSUMO X ARTICULO */
        
    if (CONSUMO = 'K') then /* CONSUMO EN CTA CONSTANTE */
        BEGIN
        SELECT SUM(DVCD_CONSUMO)
            FROM DEVOLUCIONES_COMPRAS_DET F
            WHERE F.DVCO_ID = :IDDOC 
            INTO :IMPTOS;
            
        if (IMPTOS <> 0) then
            BEGIN
            /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
            EXECUTE PROCEDURE CUENTA_INTERFAZ(24, :IDDOC, :CTACONSUMO, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (FOMENTO <> 'SI') then
                BEGIN
                /* DEPENDE DEL TIPO DE CUENTA */
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT F.ARTI_COD, DVCD_CONSUMO
                        FROM ARTICULO A, DEVOLUCIONES_COMPRAS_DET F
                        WHERE F.DVCO_ID = :IDDOC
                        INTO :ARTICULO, :IMPTOS
                        DO
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CTACONSUMO, :CONCEPTO, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                        NUMITEMS = NUMITEMS + 1;
                        SUMA = SUMA - IMPTOS;
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    /* INSERTE EL REGISTRO DE LA BASE */
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NUMITEMS, :CTACONSUMO, :CONCEPTO, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 24);
                    NUMITEMS = NUMITEMS + 1;
                    SUMA = SUMA - IMPTOS;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    /* INSERTE EL REGISTRO DE LA BASE */
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NUMITEMS, :CTACONSUMO, :CONCEPTO, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NUMITEMS = NUMITEMS + 1;
                    SUMA = SUMA - IMPTOS;
                    END
                END
            ELSE
                BEGIN
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT F.ARTI_COD, DVCD_CONSUMO
                        FROM ARTICULO A, DEVOLUCIONES_COMPRAS_DET F
                        WHERE F.DVCO_ID = :IDDOC
                        INTO :ARTICULO, :IMPTOS
                        DO
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CTACONSUMO, :CONCEPTO, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                        NUMITEMS = NUMITEMS + 1;
                        SUMA = SUMA + IMPTOS;
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    /* INSERTE EL REGISTRO DE LA BASE */
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NUMITEMS, :CTACONSUMO, :CONCEPTO, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 24);
                    NUMITEMS = NUMITEMS + 1;
                    SUMA = SUMA + IMPTOS;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    /* INSERTE EL REGISTRO DE LA BASE */
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NUMITEMS, :CTACONSUMO, :CONCEPTO, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NUMITEMS = NUMITEMS + 1;
                    SUMA = SUMA + IMPTOS;
                    END
                END
            END
        END /* CONSUMO EN CTA CONSTANTE */
        
    /* DESCUENTO */
    if ((CTADTO IS NOT NULL) AND
        (CTADTO <> '') AND
        (VRDTO <> 0)) THEN
        BEGIN
        /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
        EXECUTE PROCEDURE CUENTA_INTERFAZ(24, :IDDOC, :CTADTO, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :VRDTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 24);
            NUMITEMS = NUMITEMS + 1;
            SUMA = SUMA + VRDTO;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            /* INSERTE EL REGISTRO DE LA BASE */
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :VRDTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NUMITEMS = NUMITEMS + 1;
            SUMA = SUMA + VRDTO;
            END
        END /* DESCUENTO */
        
    /* VALOR ADIC */
    if ((CTAADIC IS NOT NULL) AND
        (CTAADIC <> '') AND
        (VRADIC <> 0)) THEN
        BEGIN
        /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
        EXECUTE PROCEDURE CUENTA_INTERFAZ(24, :IDDOC, :CTAADIC, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :VRADIC, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 24);
            NUMITEMS = NUMITEMS + 1;
            SUMA = SUMA - VRADIC;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            /* INSERTE EL REGISTRO DE LA BASE */
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :VRADIC, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NUMITEMS = NUMITEMS + 1;
            SUMA = SUMA - VRADIC;
            END
        END /* VR. ADIC */
        
    /* VALOR EXTRA */
    if ((CTAEXTRA IS NOT NULL) AND
        (CTAEXTRA <> '') AND
        (VREXTRA <> 0)) THEN
        BEGIN
        /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
        EXECUTE PROCEDURE CUENTA_INTERFAZ(24, :IDDOC, :CTAEXTRA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :VREXTRA, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 24);
            NUMITEMS = NUMITEMS + 1;
            SUMA = SUMA + VREXTRA;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            /* INSERTE EL REGISTRO DE LA BASE */
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :VREXTRA, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NUMITEMS = NUMITEMS + 1;
            SUMA = SUMA + VREXTRA;
            END
        END /* VR. EXTRA */
        
    if (fomento <> 'SI') then
        BEGIN
        /* DESCUENTE EL IMPOCONSUMO */
        SELECT SUM(DVCD_CONSUMO)
            FROM devoluciones_compras_det WHERE DVCO_ID = :IDDOC INTO :IMPTOS;
        if (IMPTOS IS NULL) then
            IMPTOS = 0;
        vrsubt = vrsubt - IMPTOS;
        END
    /* RETENCION FUENTE */
    if ((RTFTE = 'P') or (RTFTE = 'K')) then
      if (VRRTFTE <> 0) then
        BEGIN
        if (RTFTE = 'P') then
            CTARTFTE = TCTARTFTE;
            
        /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
        EXECUTE PROCEDURE CUENTA_INTERFAZ(24, :IDDOC, :CTARTFTE, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :VRRTFTE, 0, :VRSUBT, :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 24);
            NUMITEMS = NUMITEMS + 1;
            SUMA = SUMA + VRRTFTE;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            /* INSERTE EL REGISTRO DE LA BASE */
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :VRRTFTE, 0, :VRSUBT, :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NUMITEMS = NUMITEMS + 1;
            SUMA = SUMA + VRRTFTE;
            END
        END /* RTFTE */
    if (RTFTE = 'A') then
        BEGIN
        FOR SELECT MAX(COAR_CTARTFTE), MAX(COAR_RTFTE), MIN(COAR_RTBASE), SUM(DVCD_TOTAL-DVCD_IVAMONTO-DVCD_CONSUMO), SUM((DVCD_TOTAL-DVCD_IVAMONTO-DVCD_CONSUMO)*COAR_RTFTE)
            FROM CONTABIL_ARTICULO C, DEVOLUCIONES_COMPRAS_DET F
            WHERE F.dvco_id = :IDDOC AND F.ARTI_COD = C.ARTI_COD
            GROUP BY COAR_CTARTFTE
            INTO :CTARTFTE, :PRTFTE, :baseadic, :MONTO, :VRRTFTE
            DO
            BEGIN
            MONTO = MONTO * FACTOR;
            if (MONTO >= BASEADIC) then
                BEGIN
                VRRTFTE = VRRTFTE * FACTOR / 100;
                execute procedure redondee(VRRTFTE, DIG) returning_values (VRRTFTE);
                execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                if (VRRTFTE <> 0) then
                    BEGIN
                    /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
                    EXECUTE PROCEDURE CUENTA_INTERFAZ(24, :IDDOC, :CTARTFTE, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
                    if (ERRORC <> 0) then
                        ERROR = ERROR + 1;
                    if (TIPOCUEN = 'C') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :VRRTFTE, 0, :VRSUBT, :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 24);
                        NUMITEMS = NUMITEMS + 1;
                        SUMA = SUMA + VRRTFTE;
                        END
                    if (TIPOCUEN = 'N') then
                        BEGIN
                        /* INSERTE EL REGISTRO DE LA BASE */
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :VRRTFTE, 0, :VRSUBT, :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NUMITEMS = NUMITEMS + 1;
                        SUMA = SUMA + VRRTFTE;
                        END
                    END
                END
            END
        END /* RTFTE */
    /* RETENCION IVA */
    if ((RTIVA = 'P') or (RTIVA = 'K')) then
      if (VRRTIVA <> 0) then
        BEGIN
        if (RTIVA = 'P') then
            CTARTIVA = TCTARTIVA;
            
        /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
        EXECUTE PROCEDURE CUENTA_INTERFAZ(24, :IDDOC, :CTARTIVA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :VRRTIVA, 0, :VRIVA, :PORC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 24);
            NUMITEMS = NUMITEMS + 1;
            SUMA = SUMA + VRRTIVA;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            /* INSERTE EL REGISTRO DE LA BASE */
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :VRRTIVA, 0, :VRIVA, :PORC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NUMITEMS = NUMITEMS + 1;
            SUMA = SUMA + VRRTIVA;
            END
        END /* RTIVA */
        
    /* RETENCION DE ICA */
    if ((RTICA = 'P') or (RTICA = 'K')) then
      if (VRRTICA <> 0) then
        BEGIN
        if (RTICA = 'P') then
            CTARTICA = TCTARTICA;
            
        /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
        EXECUTE PROCEDURE CUENTA_INTERFAZ(24, :IDDOC, :CTARTICA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :VRRTICA, 0, :VRSUBT, :PRTICA, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 24);
            NUMITEMS = NUMITEMS + 1;
            SUMA = SUMA + VRRTICA;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            /* INSERTE EL REGISTRO DE LA BASE */
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :VRRTICA, 0, :VRSUBT, :PRTICA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NUMITEMS = NUMITEMS + 1;
            SUMA = SUMA + VRRTICA;
            END
        END /* RTICA */
    /* recorra las cuentas adicionales */
    FOR SELECT INCC_CUENTA, INCC_BASE, INCC_PORC, INCC_VALOR, INCC_DB
        FROM INTERFAZ_COMPRAS_CTAS
        WHERE INCO_ID = :IDINTER
        INTO :CUENTAADIC, :BASEADIC, :PORCADIC, :VALORADIC, :DBADIC
        DO
        BEGIN
        if (VALORADIC <> 0) then
            MONTO = VALORADIC;
        ELSE
            BEGIN
            if (:BASEADIC = 'SUBTOTAL') then
                VALORADIC = VRTOTAL - VREXTRA - VRIVA - VRADIC + VRDTO;
            if (:BASEADIC = 'DESCUENTO') then
                VALORADIC = VRDTO;
            if (:BASEADIC = 'IVA') then
                VALORADIC = VRIVA;
            if (:BASEADIC = 'CONSUMO') then
                SELECT SUM(DVCD_CONSUMO)
                    FROM DEVOLUCIONES_COMPRAS_DET F
                    WHERE F.DVCO_ID = :IDDOC 
                    INTO :VALORADIC;
            if (:BASEADIC = 'ADICIONAL') then
                VALORADIC = VRADIC;
            if (:BASEADIC = 'EXTRA') then
                VALORADIC = VREXTRA;
            if (:BASEADIC = 'TOTAL') then
                VALORADIC = VRTOTAL;
            MONTO = VALORADIC * PORCADIC;
            END
        if (MONTO <> 0) then
            BEGIN
            /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
            EXECUTE PROCEDURE CUENTA_INTERFAZ(24, :IDDOC, :CUENTAADIC, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                if (DBADIC = 'S') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NUMITEMS, :CUENTAADIC, :CONCEPTO, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 24);
                    SUMA = SUMA + MONTO;
                    END
                ELSE
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NUMITEMS, :CUENTAADIC, :CONCEPTO, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 24);
                    SUMA = SUMA - MONTO;
                    END
                NUMITEMS = NUMITEMS + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                if (DBADIC = 'S') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NUMITEMS, :CUENTAADIC, :CONCEPTO, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    SUMA = SUMA + MONTO;
                    END
                ELSE
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NUMITEMS, :CUENTAADIC, :CONCEPTO, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    SUMA = SUMA - MONTO;
                    END
                NUMITEMS = NUMITEMS + 1;
                END
            NUMITEMS = NUMITEMS + 1;
            END
        END
    /* CIERRE EL COMPROBANTE CONTRA LA CUENTA DEL TERCERO O LA CONSTANTE */
    if ((SUMA <> 0) and ((CXP = 'P') or (CXP = 'K'))) then
        BEGIN
        if (SUMA < 0) then
            BEGIN
            DEBITO = SUMA * -1;
            CREDITO = 0;
            END
        ELSE
            BEGIN
            DEBITO = 0;
            CREDITO = SUMA;
            END
        if (CXP = 'P') then
            CTACXP = TCTAPROV;

        /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
        EXECUTE PROCEDURE CUENTA_INTERFAZ(24, :IDDOC, :CTACXP, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :DEBITO, :CREDITO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 24);
        if (TIPOCUEN = 'N') then
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :DEBITO, :CREDITO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
        END /* SUMA EN CXP */
     end
    if (ERROR > 0) then
        VER = 'S';
    SUSPEND;
    END /* EXISTE */
ELSE
    BEGIN
    EXECUTE PROCEDURE ERROR (24, :IDDOC, :PREFIJO, 1);
    ERROR = ERROR + 1;
    VER = 'S';
    SUSPEND;
    END
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE DEVCOMPRA_SIN_CONTABILIDAD(
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    ID INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    ESTADO VARCHAR(20),
    IDI INTEGER,
    IDC INTEGER)
AS
DECLARE VARIABLE VER CHAR(2);
declare variable FECICNT VARCHAR(10);
declare variable FECFCNT VARCHAR(10);
declare variable ERROR INTEGER;
declare variable idref INTEGER;
BEGIN
EXECUTE PROCEDURE fecha_a_conta(FECINI) returning_values (FECICNT);
EXECUTE PROCEDURE fecha_a_conta(FECFIN) returning_values (FECFCNT);
FOR SELECT DVCO_ID, PREF_PRE, DVCO_NUMERO FROM DEVOLUCIONES_COMPRAS WHERE DVCO_ANULADO = 'N' AND
    DVCO_FECHA >= :FECINI AND DVCO_FECHA <= :FECFIN
    INTO :ID, :PREF, :NUMERO
DO
  BEGIN
  idref = null;
  SELECT ENCO_IDREF FROM COMPROBANTE_ENCABEZADO WHERE ENCO_TIPOREF = 24 AND ENCO_FECHA >= :FECICNT AND ENCO_FECHA <= :FECFCNT and ENCO_IDREF = :id into :idref;
  if (idref IS NULL) then
  begin
   ESTADO = 'PROCESANDO';
   SUSPEND;
   SELECT MAX(INCO_ID) FROM INTERFAZ_COMPRAS WHERE PREF_PRE = :PREF AND TIDO_COD = 24 INTO :IDI;
   EXECUTE PROCEDURE CONTABIL_DEVOLCOMP (:ID, :IDI) RETURNING_VALUES (:ERROR, :VER, :IDC);
   if (ERROR = 0) then
    BEGIN
      EXECUTE PROCEDURE CONTABILIZA_PENDIENTE (:IDC);
      ESTADO = 'OK';
    end
   ELSE
    ESTADO = 'ERROR';
   suspend;
  End
  END
END

^

SET TERM ; ^


SET TERM ^ ;

CREATE OR ALTER PROCEDURE CONTABILIZA_PENDIENTE (
    idcnt integer)
as
declare variable idc integer;
BEGIN
  /* PASA DE CONTABILIZACION A COMPROBANTES */
  /* EL ENCABEZADO */
  EXECUTE PROCEDURE CAMBIE_ID_COMPROBA returning_values (:IDC);
  INSERT INTO COMPROBANTE_ENCABEZADO (ENCO_CONSEC, TICO_COD, PRCO_PREF, ENCO_NUMERO, ENCO_FECHA, ENCO_CONCEPTO, ENCO_REFER, ENCO_TIPOREF, ENCO_IDREF)
      SELECT :IDC, CNTB_TIPOCOMP, CNTB_PREFCNT, CNTB_NUMERO, CNTB_FECHA, CNTB_CONCEPTO, CNTB_REF, CNTB_TIPOREF, CNTB_IDREF
        FROM CONTABILIZACION WHERE CNTB_ID = :IDCNT;
  /* LOS DETALLES */
  INSERT INTO COMPROBANTE_DETALLE (ENCO_CONSEC, CODE_ITEM, CUEN_COD, TERC_NIT, PROY_COD, CENT_COD, CODE_CONCEPTO, CODE_REFER, CONC_COD, CODE_BASE, CODE_PORC, CODE_DEBITO, CODE_CREDITO, CODE_TIPONUE, CNDE_DOCNUMERO, CODE_TIPOAPL, CNDE_DOCAPLICA, DOCO_VENCE, ARTI_COD)
    SELECT :IDC, CNDE_ITEM, CNDE_CUENTA, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_CONC, CNDE_REF, CNDE_CONCOD, CNDE_BASE, CNDE_PORC, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_DOCTIPON, CNDE_DOCNUMERO, CNDE_DOCTIPOA, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO
        FROM CONTABILIZACION_DET WHERE CNTB_ID = :IDCNT;
  UPDATE CONTABILIZACION SET CNTB_PROCESADO = 'S'
    WHERE CNTB_ID = :IDCNT;
END
^

SET TERM ; ^



SET TERM ^ ;

CREATE OR ALTER procedure CONTABIL_FACTURA (
    IDDOC integer,
    IDINTER integer)
returns (
    ERROR integer,
    VER char(1),
    IDC integer)
AS
declare variable pref varchar(4);
declare variable num varchar(6);
declare variable numero varchar(10);
declare variable fecaux date;
declare variable fecha char(8);
declare variable conc varchar(60);
declare variable venceaux date;
declare variable vence char(8);
declare variable vrdto numeric(18,2);
declare variable vradic numeric(18,2);
declare variable vrsubt numeric(18,2);
declare variable vriva numeric(18,2);
declare variable prtfte numeric(9,2);
declare variable vrrtfte numeric(18,2);
declare variable vrrtiva numeric(18,2);
declare variable prtica numeric(9,2);
declare variable vrrtica numeric(18,2);
declare variable vrtotal numeric(18,2);
declare variable vrextra numeric(18,2);
declare variable tipocomp varchar(3);
declare variable prefcont varchar(4);
declare variable ventas char(1);
declare variable ctaventas varchar(20);
declare variable iva char(1);
declare variable ctaiva varchar(20);
declare variable ctadtoiva varchar(20);
declare variable consumo char(1);
declare variable ctaconsumo varchar(20);
declare variable cartera char(1);
declare variable ctacartera varchar(20);
declare variable rtfte char(1);
declare variable ctartfte varchar(20);
declare variable rtiva char(1);
declare variable ctartiva varchar(20);
declare variable rtica char(1);
declare variable ctartica varchar(20);
declare variable inven char(1);
declare variable ctainven varchar(20);
declare variable costos char(1);
declare variable ctacostos varchar(20);
declare variable ctadto varchar(20);
declare variable ctaadic varchar(20);
declare variable ctaextra varchar(20);
declare variable existe char(1);
declare variable cuenta varchar(20);
declare variable monto numeric(18,2);
declare variable tipocuen char(1);
declare variable nit varchar(20);
declare variable nombre varchar(60);
declare variable proy varchar(4);
declare variable centro varchar(4);
declare variable proyi varchar(4);
declare variable centi varchar(4);
declare variable porc numeric(5,2);
declare variable debito numeric(18,2);
declare variable credito numeric(18,2);
declare variable nroi integer;
declare variable imptos numeric(18,2);
declare variable suma numeric(18,2);
declare variable tctaclien varchar(20);
declare variable tctaventa varchar(20);
declare variable tctartfte varchar(20);
declare variable tctartiva varchar(20);
declare variable tctartica varchar(20);
declare variable ctadic varchar(20);
declare variable baseadic varchar(20);
declare variable porcadic numeric(5,2);
declare variable valoradic numeric(18,2);
declare variable dbadic char(1);
declare variable ptovta integer;
declare variable anulado char(1);
declare variable dig integer;
declare variable mercancia numeric(18,2);
declare variable fomento varchar(2);
declare variable DTOXIT varchar(2);
declare variable vrconsumo numeric(18,2);
declare variable factor double precision;
declare variable cent char(1);
declare variable AUTORET VARCHAR(10);
declare variable FAUTORET DATE;
declare variable ERRORC INTEGER;
declare variable ICOING CHAR(2);
declare variable DEC2799 char(2);
DECLARE VARIABLE ARTICULO VARCHAR(15);
BEGIN
EXECUTE PROCEDURE lee_configuracion ('FACTURACION', 'FACTURAS', 'DESCONTAR IVA DE PRODUCTOS DECRETO 2799') returning_values (:DEC2799);
EXECUTE PROCEDURE LEE_CONFIGURACION('COMPRAS', 'FACTURAS', 'USAR IMPOCONSUMO COMO PORCENTAJE DE FOMENTO') returning_values (FOMENTO);
EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION', 'ARTICULOS', 'IMPOCONSUMO COMO MAYOR VALOR DEL COSTO Y DEL INGRESO') returning_values (ICOING);
EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'FECHA AUTORETENEDOR NO DESCONTAR RETENCIONES DEL SALDO PERO SI CONTABILIZARLAS') returning_values (AUTORET);
if (AUTORET <> '') then
    FAUTORET = CAST(AUTORET AS DATE);
else
    FAUTORET = '9999/12/31';
/* BUSQUE LA INTERFACE */
EXISTE = 'N';
SELECT 'S', TICO_COD, PRCO_PRE, INVE_VENTAS, INVE_IVA, INVE_CONSUMO, INVE_CARTERA, INVE_RTFTE, INVE_RTIVA, INVE_RTICA, INVE_COSTO, INVE_INVEN, INVE_CTAVENTAS, INVE_CTAIVA, INVE_CTACONSUMO, INVE_CTADTO, INVE_CTAADIC, INVE_CTAEXTRA, INVE_CTACARTERA, INVE_CTARTFTE, INVE_CTARTIVA, INVE_CTARTICA, INVE_CTAINVEN, INVE_CTACOSTOS, INVE_CONFIRMAR, INVE_CENTRO, inve_ctadtoiva
    FROM INTERFAZ_VENTAS
    WHERE INVE_ID = :IDINTER
    INTO :EXISTE, :TIPOCOMP, :PREFCONT, :VENTAS, :IVA, :CONSUMO, :CARTERA, :RTFTE, :RTIVA, :RTICA, :COSTOS, :INVEN, :CTAVENTAS, :CTAIVA, :CTACONSUMO, :CTADTO, :CTAADIC, :CTAEXTRA, :CTACARTERA, :CTARTFTE, :CTARTIVA, :CTARTICA, :CTAINVEN, :CTACOSTOS, :VER, :CENT, :ctadtoiva;
if (EXISTE = 'S') then
  BEGIN
    /* BORRE CUALQUEIR CONTABILIZACION PREVIA */
    DELETE FROM CONTABILIZACION WHERE CNTB_TIPOREF = 31 AND CNTB_IDREF = :IDDOC;

  /* TRAIGA EL ENCABEZADO DE LA FACTURA */
  SELECT PREF_PRE, FACT_NUMERO, FACT_FECHA, F.TERC_NIT, PTVT_ID, FACT_VENCE, FACT_DTOMONTO, FACT_ADICIONAL, FACT_IVAMONTO, FACT_EXTRA, FACT_TOTAL, FACT_RTFTEPOR, FACT_RTFTEMONTO, FACT_RTIVAPOR, FACT_RTIVAMONTO, FACT_RTICAPOR, FACT_RTICAMONTO, FACT_NOMCLIENTE, TERC_CTARTFTE, TERC_CTARTIVA, TERC_CTARTICA, TERC_CTAVENTA, TERC_CTACLIENTE, FACT_ANULADO
        FROM FACTURAS F, TERCEROS T
        WHERE FACT_ID = :IDDOC AND F.TERC_NIT = T.TERC_NIT
        INTO :PREF, :NUM, :FECAUX, :NIT, :PTOVTA, :VENCEAUX, :VRDTO, :VRADIC, :VRIVA, :VREXTRA, :VRTOTAL, :PRTFTE, :VRRTFTE, :PORC, :VRRTIVA, :PRTICA, :VRRTICA, :NOMBRE, TCTARTFTE, TCTARTIVA, TCTARTICA, TCTAVENTA, TCTACLIEN, ANULADO;
  if (ANULADO = 'N') then
    BEGIN
    /* BUSQUE EL CENTRO DEL PUNTO, LA BODEGA, O EL PREFIJO  */
    IF (CENT = 'B') THEN
        SELECT B.BODE_CENTRO, B.BODE_PROY FROM BODEGA B, FACTURAS F
            WHERE B.BODE_COD = F.BODE_COD AND F.FACT_ID = :IDDOC INTO :CENTRO, :PROY;
    IF (CENT = 'V') THEN
        SELECT V.CENT_COD, V.PROY_COD FROM VENDEDORES V, FACTURAS F
            WHERE V.VEND_COD = F.VEND_COD AND F.FACT_ID = :IDDOC INTO :CENTRO, :PROY;
    IF (CENT = 'P') THEN
        SELECT P.PREF_CENTRO,P.PREF_PROY  FROM PREFIJOS P, FACTURAS F
            WHERE P.PREF_PRE = F.PREF_PRE AND F.FACT_ID = :IDDOC AND P.TIDO_COD = 31 INTO :CENTRO, :PROY;
    NUMERO = PREF || NUM;
    SELECT SUM (FADE_CONSUMO) FROM FACTURAS_DETALLE WHERE FACT_ID = :IDDOC  AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
        INTO MERCANCIA;
    VRSUBT = VRTOTAL - VREXTRA - VRIVA - MERCANCIA; /* BASE DE RETEFTE Y RETEICA */

    EXECUTE PROCEDURE lee_configuracion ('FACTURACION', 'FACTURAS', 'DESCUENTO PIE FACTURA IGUAL A SUMA DE DESCUENTOS POR ITEM') returning_values (:DTOXIT);
    if (DTOXIT = 'SI') then
        VRDTO = 0;
    MERCANCIA = VRSUBT - VRADIC + VRDTO;
    EXECUTE PROCEDURE FECHA_A_CONTA(:FECAUX) returning_values (:FECHA);
    EXECUTE PROCEDURE FECHA_A_CONTA(:VENCEAUX) returning_values (:VENCE);
    /* REGISTRE EL ENCABEZADO CONTABLE */
    IDC = GEN_ID(ID_CONTABILIZA, 1);
    if (STRLEN(NOMBRE)> 43 ) then
      CONC = 'FV No.' || NUMERO || '-' || SUBSTR(NOMBRE,1,43);
    ELSE
      CONC = 'FV No.' || NUMERO || '-' || NOMBRE;
    INSERT INTO CONTABILIZACION (CNTB_ID, CNTB_TIPOCOMP, CNTB_PREFCNT, CNTB_NUMERO, CNTB_FECHA, CNTB_CONCEPTO, CNTB_REF, CNTB_TIPOREF, CNTB_IDREF, CNTB_PREFREF, CNTB_NUMREF, CNTB_PROCESADO)
        VALUES (:IDC, :TIPOCOMP, :PREFCONT, :NUM, :FECHA, :CONC, '', 31, :IDDOC, :PREF, :NUM, 'N');
    NROI = 0;
    SUMA = 0;
    ERROR = 0;
    /* SI NO HAY CUENTA DE DESCUENTO NI ADICIONAL CALCULE UN FACTOR PARA LAS VENTAS Y EL IVA */
    if (MERCANCIA <> 0) then
        FACTOR = CAST(VRSUBT AS DOUBLE PRECISION) / CAST(MERCANCIA AS DOUBLE PRECISION);
    ELSE
        FACTOR = 1;
    /* TRAIGA EL NUMERO DE DIGITOS PARA EL REDONDEO */
    SELECT CAST(CONF_VALOR AS INTEGER) FROM CONFIGURACION WHERE CONF_MODULO = 'FACTURACION' AND
        CONF_CATEGORIA = 'GENERAL' AND CONF_PROPIEDAD = 'REDONDEO AL MULTIPLO DE DIEZ EN TOTALES' INTO :DIG;
    /* CUENTAS DE VENTAS */
    if (VENTAS = 'A') then
        BEGIN
        FOR SELECT MAX(COAR_CTAVNT), SUM(FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), SUM(FADE_IVAMONTO), SUM(FADE_CONSUMO), MAX(B.bode_proy), MAX(B.bode_centro)
            FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_DETALLE F, bodega b
            WHERE F.FACT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL)) and
            f.bode_cod = b.bode_cod
            GROUP BY COAR_CTAVNT
            INTO :CTAVENTAS, :MONTO, :IMPTOS, :VRCONSUMO, :PROYI, :CENTI
            DO
            BEGIN
            if ((FOMENTO = 'SI') or (icoing = 'SI')) then
                MONTO = MONTO + VRCONSUMO;
            if ((CTADTO IS NULL) OR (CTADTO = '')) then
                MONTO = MONTO * FACTOR;
            execute procedure redondee(MONTO, DIG) returning_values (MONTO);
            if (MONTO <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTAVENTAS, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if ((TIPOCUEN = 'I') or (TIPOCUEN = 'A')) then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (31, :IDDOC, :CUENTA, 3);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    NROI = NROI + 1;
                    SUMA = SUMA - MONTO;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    IF (CENT = 'B') THEN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROYI, :CENTI, NULL, NULL, NULL, NULL, 0, 0);
                    ELSE
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA - MONTO;
                    END
                END /* MONTO <> 0 */
            END /* FOR */
        END /* VENTAS X ARTICULO */
     IF ((VENTAS = 'C') OR (VENTAS = 'K')) THEN
        BEGIN
        IF (VENTAS = 'C') THEN
            CTAVENTAS = TCTAVENTA;
        SELECT SUM(FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), SUM(FADE_IVAMONTO), SUM (FADE_CONSUMO)
            FROM FACTURAS_DETALLE F
            WHERE F.FACT_ID = :IDDOC AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
            INTO :MONTO, :IMPTOS, :VRCONSUMO;
        if ((FOMENTO = 'SI') or (ICOING = 'SI')) then
            MONTO = MONTO + VRCONSUMO;
        if ((CTADTO IS NULL) OR (CTADTO = '')) then
            MONTO = MONTO * FACTOR;
        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
        if (MONTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTAVENTAS, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if ((TIPOCUEN = 'I') or (TIPOCUEN = 'A')) then
                BEGIN
                EXECUTE PROCEDURE ERROR (31, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - MONTO;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - MONTO;
                END
            END /* MONTO <> 0 */
        END /* VENTAS DE CLIENTE O CONSTANTE */
    /* EL IVA EN VENTAS */
    if (IVA = 'A') then
        BEGIN
        FOR SELECT MAX(COAR_CTAIVAV), SUM(FADE_IVAMONTO), SUM(FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), sum(FADE_CONSUMO)
            FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_DETALLE F
            WHERE F.FACT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
            GROUP BY COAR_CTAIVAV
            INTO :CTAIVA, :IMPTOS, :MONTO, :VALORADIC
            DO
            BEGIN
            if (FOMENTO = 'SI') then
                MONTO = MONTO + VALORADIC;
            MONTO = MONTO * -1;
            MONTO = MONTO * FACTOR;
            IMPTOS = IMPTOS * FACTOR;
            execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
            execute procedure redondee(MONTO, DIG) returning_values (MONTO);
            if (IMPTOS <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTAIVA, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if ((TIPOCUEN = 'I') or (TIPOCUEN = 'A')) then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (31, :IDDOC, :CUENTA, 3);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, :MONTO, ABS(:IMPTOS*100/:MONTO), :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    NROI = NROI + 1;
                    SUMA = SUMA - IMPTOS;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, :MONTO, ABS(:IMPTOS*100/:MONTO), :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA - IMPTOS;
                    END
                END   /* IMPTOS <> 0 */
            END /* FOR */
        if (DEC2799 = 'SI') then
            BEGIN
            FOR SELECT MAX(COAR_CTAIVADEC), SUM(FADE_IVAMONTO), SUM(FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), sum(FADE_CONSUMO)
                FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_DETALLE F
                WHERE F.FACT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
                    AND A.arti_dec2799 = 'S'
                GROUP BY COAR_CTAIVADEC
                INTO :CTADTOIVA, :IMPTOS, :MONTO, :VALORADIC
                DO
                BEGIN
                if (FOMENTO = 'SI') then
                    MONTO = MONTO + VALORADIC;
                MONTO = MONTO * -1;
                MONTO = MONTO * FACTOR;
                IMPTOS = IMPTOS * FACTOR;
                execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                if (IMPTOS <> 0) then
                    BEGIN
                    EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTADTOIVA, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                    if (ERRORC <> 0) then
                        ERROR = ERROR + 1;
                    if (TIPOCUEN = 'N') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :IMPTOS, 0, :MONTO, ABS(:IMPTOS*100/:MONTO), :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NROI = NROI + 1;
                        SUMA = SUMA + IMPTOS;
                        END
                    END   /* IMPTOS <> 0 */
                END
            END
        END /* IVA X ARTICULO */
    if (IVA = 'K') then /* IVA EN CTA CONSTANTE */
        BEGIN
        SELECT SUM(FADE_IVAMONTO), SUM(FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), SUM(FADE_CONSUMO)
            FROM FACTURAS_DETALLE F
            WHERE F.FACT_ID = :IDDOC and FADE_IVAMONTO <> 0 AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
            INTO :IMPTOS, :MONTO, :valoradic;
        if (FOMENTO = 'SI') then
            MONTO = MONTO + VALORADIC;
        MONTO = MONTO * -1;
        MONTO = MONTO * FACTOR;
        IMPTOS = IMPTOS * FACTOR;
        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
        execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
        if (IMPTOS <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTAIVA, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if ((TIPOCUEN = 'I') or (TIPOCUEN = 'A')) then
                BEGIN
                EXECUTE PROCEDURE ERROR (31, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', 0, :IMPTOS, :MONTO, ABS(:IMPTOS*100/:MONTO), :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - IMPTOS;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', 0, :IMPTOS, :MONTO, ABS(:IMPTOS*100/:MONTO), :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - IMPTOS;
                END
            END /* IMPTOS <> 0 */
        if (DEC2799 = 'SI') then
            BEGIN
            SELECT SUM(FADE_IVAMONTO), SUM(FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), SUM(FADE_CONSUMO)
                FROM FACTURAS_DETALLE F, ARTICULO A
                WHERE F.FACT_ID = :IDDOC and FADE_IVAMONTO <> 0 AND F.arti_cod = A.arti_cod AND
                ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL)) AND A.arti_dec2799 = 'S'
                INTO :IMPTOS, :MONTO, :valoradic;
            if (FOMENTO = 'SI') then
                MONTO = MONTO + VALORADIC;
            MONTO = MONTO * -1;
            MONTO = MONTO * FACTOR;
            IMPTOS = IMPTOS * FACTOR;
            execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
            execute procedure redondee(MONTO, DIG) returning_values (MONTO);
            if (IMPTOS <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTADTOIVA, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :IMPTOS, 0, :MONTO, ABS(:IMPTOS*100/:MONTO), :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA + IMPTOS;
                    END
                END   /* IMPTOS <> 0 */
            END
        END /* IVA EN CTA CONSTANTE */
    /* EL IMPOCONSUMO */
    if ((CONSUMO = 'A') AND (FOMENTO <> 'SI')) then
        BEGIN
        FOR SELECT MAX(COAR_CTACONS), SUM(FADE_CONSUMO)
            FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_DETALLE F
            WHERE F.FACT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
            GROUP BY COAR_CTACONS
            INTO :CTACONSUMO, :IMPTOS
        DO
            BEGIN
            execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
            if (IMPTOS <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTACONSUMO, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if ((TIPOCUEN = 'I') or (TIPOCUEN = 'A')) then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (31, :IDDOC, :CUENTA, 3);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    NROI = NROI + 1;
                    SUMA = SUMA - IMPTOS;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA - IMPTOS;
                    END
                END /* IMPTOS <> 0 */
            END /* FOR */
        END /* CONSUMO X ARTICULO */
    if ((CONSUMO = 'K') AND (FOMENTO <> 'SI')) then /* CONSUMO EN CTA CONSTANTE */
        BEGIN
        SELECT SUM(FADE_CONSUMO)
            FROM FACTURAS_DETALLE F
            WHERE F.FACT_ID = :IDDOC AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
            INTO :IMPTOS;
        execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
        if (IMPTOS <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTACONSUMO, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if ((TIPOCUEN = 'I') or (TIPOCUEN = 'A')) then
                BEGIN
                EXECUTE PROCEDURE ERROR (31, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTACONSUMO, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - IMPTOS;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTACONSUMO, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - IMPTOS;
                END
            END /* IMPTOS <> 0 */
        END /* CONSUMO EN CTA CONSTANTE */
    /* DESCUENTO */
    if ((CTADTO IS NOT NULL) AND (CTADTO <> '')) then
        BEGIN
        execute procedure redondee(VRDTO, DIG) returning_values (VRDTO);
        if (VRDTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTADTO, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRDTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA + VRDTO;
                END
            if (TIPOCUEN = 'N') then
                    BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRDTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA + VRDTO;
                END
            END
        END /* DESCUENTO */
    /* VALOR ADIC */
    if ((CTAADIC IS NOT NULL) AND (CTAADIC <> '')) then
        BEGIN
        execute procedure redondee(VRADIC, DIG) returning_values (VRADIC);
        if (VRADIC <> 0) THEN
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTAADIC, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRADIC, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - VRADIC;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRADIC, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - VRADIC;
                END
            END
        END /* VR. ADIC */
    /* VALOR EXTRA */
    if ((CTAEXTRA IS NOT NULL) AND (CTAEXTRA <> '')) THEN
        BEGIN
        execute procedure redondee(VREXTRA, DIG) returning_values (VREXTRA);
        if (VREXTRA <> 0) THEN
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTAEXTRA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VREXTRA, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - VREXTRA;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VREXTRA, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - VREXTRA;
                END
            END
        END /* VR. EXTRA */

    /* RETENCION FUENTE */
    if ((RTFTE = 'C') or (RTFTE = 'K')) then
      BEGIN
      execute procedure redondee(VRRTFTE, DIG) returning_values (VRRTFTE);
      if (VRRTFTE <> 0) then
        BEGIN
        if (RTFTE = 'C') then
            CTARTFTE = TCTARTFTE;
        EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTARTFTE, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :VRSUBT, :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTFTE;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :VRSUBT, :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTFTE;
            END
        /* AUTORETENCION */
        if (FAUTORET <= fecaux) then
            BEGIN
            EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'CUENTA DE AUTORETENCION EN LA FUENTE') returning_values (CTARTFTE);
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTARTFTE INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERROR (31, :IDDOC, :CTARTFTE, 2);
                CUENTA = CTARTFTE;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if ((TIPOCUEN = 'I') or (TIPOCUEN = 'A')) then
                begin
                EXECUTE PROCEDURE ERROR (31, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, (:VRSUBT*-1), :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - VRRTFTE;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, (:VRSUBT*-1), :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - VRRTFTE;
                END
            END
        END /* RTFTE */
      END
    if (RTFTE = 'A') then
      BEGIN
      FOR SELECT MAX(COAR_CTARTFTEV), MAX(COAR_RTFTE), MIN(COAR_RTBASE), SUM(FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), SUM((FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO)*COAR_RTFTE)
        FROM CONTABIL_ARTICULO C, FACTURAS_DETALLE F
        WHERE F.FACT_ID = :IDDOC AND F.ARTI_COD = C.ARTI_COD AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
        GROUP BY COAR_CTARTFTEV
        INTO :CTARTFTE, :PRTFTE, :baseadic, :MONTO, :VRRTFTE
        DO
        BEGIN
        MONTO = MONTO * FACTOR;
        if (MONTO >= BASEADIC) then
            BEGIN
            VRRTFTE = VRRTFTE * FACTOR / 100;
            execute procedure redondee(VRRTFTE, DIG) returning_values (VRRTFTE);
            execute procedure redondee(MONTO, DIG) returning_values (MONTO);
            if (VRRTFTE <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTARTFTE, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :MONTO, :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    NROI = NROI + 1;
                    SUMA = SUMA + VRRTFTE;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :MONTO, :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA + VRRTFTE;
                    END
                /* AUTORETENCION */
                if (FAUTORET <= fecaux) then
                    BEGIN
                    EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'CUENTA DE AUTORETENCION EN LA FUENTE') returning_values (CTARTFTE);
                    EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTARTFTE, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
                    if (ERRORC <> 0) then
                        ERROR = ERROR + 1;
                    if (TIPOCUEN = 'C') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, (:MONTO*-1), :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                        NROI = NROI + 1;
                        SUMA = SUMA - VRRTFTE;
                        END
                    if (TIPOCUEN = 'N') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, (:MONTO*-1), :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NROI = NROI + 1;
                        SUMA = SUMA - VRRTFTE;
                        END
                    END
                END
            END
        END /* RTFTE */
      END
    /* RETENCION IVA */
    if ((RTIVA = 'C') or (RTIVA = 'K')) then
      BEGIN
      execute procedure redondee(VRRTIVA, DIG) returning_values (VRRTIVA);
      if (VRRTIVA <> 0) then
        BEGIN
        if (RTIVA = 'C') then
            CTARTIVA = TCTARTIVA;
        EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTARTIVA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTIVA, 0, :VRIVA, :PORC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTIVA;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTIVA, 0, :VRIVA, :PORC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTIVA;
            END
        END /* RTIVA */
      END
    /* RETENCION DE ICA */
    if ((RTICA = 'C') or (RTICA = 'K')) then
      BEGIN
      execute procedure redondee(VRRTICA, DIG) returning_values (VRRTICA);
      if (VRRTICA <> 0) then
        BEGIN
        if (RTICA = 'C') then
            CTARTICA = TCTARTICA;
        EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTARTICA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTICA, 0, :VRSUBT, :PRTICA, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTICA;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTICA, 0, :VRSUBT, :PRTICA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTICA;
            END
        END /* RTICA */
      END
    /* CIERRE EL COMPROBANTE CONTRA LA CUENTA DEL TERCERO O LA CONSTANTE */
    if ((SUMA <> 0) and ((CARTERA = 'C') or (CARTERA = 'K') or (CARTERA = 'J'))) then
        BEGIN
        if (icoing = 'SI') then
            BEGIN
            /* DESCUENTE EL IMPOCONSUMO QUE HACE PARTE DEL COSTO */
            SELECT SUM(FADE_CONSUMO) FROM FACTURAS_DETALLE F WHERE F.FACT_ID = :IDDOC AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
                INTO :IMPTOS;
            SUMA = SUMA + IMPTOS;
            END
        if (SUMA < 0) then
            BEGIN
            DEBITO = SUMA * -1;
            CREDITO = 0;
            END
        ELSE
            BEGIN
            DEBITO = 0;
            CREDITO = SUMA;
            END
        if (CARTERA = 'C') then
            CTACARTERA = TCTACLIEN;
        if (CARTERA = 'J') then
            BEGIN
            /* BUSQUE LA CUENTA DE LA CAJA */
            SELECT CAJA_CUENTA FROM CAJAS C, PUNTO_VENTA P
                WHERE P.CAJA_ID = C.CAJA_ID AND PTVT_ID = :PTOVTA
                INTO :CTACARTERA;
            END
        EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTACARTERA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :DEBITO, :CREDITO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
        if (TIPOCUEN = 'N') then
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :DEBITO, :CREDITO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
        NROI = NROI + 1;
        END /* SUMA EN CARTERA */
    /* CALCULE COSTOS EN VENTAS */
    EXECUTE PROCEDURE COSTO_EN_VENTAS(31, :IDDOC);
    if (COSTOS = 'A') then
        BEGIN
        FOR SELECT MAX(CTACOS), SUM(CAST(CANT AS DOUBLE PRECISION) * COSTO), SUM(FADE_CONSUMO)
            FROM COSTO_VENTAS CV, FACTURAS_DETALLE D WHERE CV.cove_item = D.fade_item AND D.fact_id = :iddoc AND
            TIDO_COD = 31 AND COVE_ID = :iddoc
            GROUP BY CTACOS
            INTO :CTACOSTOS, :MONTO, :vrconsumo
            DO
            BEGIN
            if (icoing = 'SI') then
                MONTO = MONTO + VRCONSUMO;
            if (MONTO <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTACOSTOS, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if ((TIPOCUEN = 'I') or (TIPOCUEN = 'A')) then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (31, :IDDOC, :CUENTA, 3);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    NROI = NROI + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    END
                END /* MONTO <> 0 */
            END /* FOR */
        END /* COSTOS */
    if (COSTOS = 'K') then
        BEGIN
        SELECT SUM(CAST(CANT AS DOUBLE PRECISION) * COSTO)
            FROM COSTO_VENTAS WHERE TIDO_COD = 31 AND COVE_ID = :iddoc
            INTO :MONTO;
        if (icoing = 'SI') then
            MONTO = MONTO + imptos;
        if (MONTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTACOSTOS, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if ((TIPOCUEN = 'I') or (TIPOCUEN = 'A')) then
                BEGIN
                EXECUTE PROCEDURE ERROR (31, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTACOSTOS, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTACOSTOS, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                END
            END /* MONTO <> 0 */
        END /* COSTOS = K */
    if (INVEN = 'A') then
        BEGIN
        FOR SELECT MAX(CTAINV), SUM(CAST(CANT AS DOUBLE PRECISION) * COSTO)
            FROM COSTO_VENTAS WHERE TIDO_COD = 31 AND COVE_ID = :iddoc
            GROUP BY CTAINV
            INTO :CTAINVEN, :MONTO
            DO
            BEGIN
            if (MONTO <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTAINVEN, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if ((TIPOCUEN = 'I') or (TIPOCUEN = 'A')) then
                    BEGIN
                    FOR SELECT MAX(ARTI_COD), SUM(CAST(CANT AS DOUBLE PRECISION) * COSTO)
                        FROM COSTO_VENTAS WHERE TIDO_COD = 31 AND COVE_ID = :iddoc AND CTAINV = :CUENTA
                        GROUP BY ARTI_COD
                        INTO :ARTICULO, :MONTO
                        DO
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CTAINVEN, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                        NROI = NROI + 1;
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    NROI = NROI + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    END
                END /* MONTO <> 0 */
            END /* FOR */
        END /* INVEN = A */
    if (INVEN = 'K') then
        BEGIN
        SELECT SUM(CAST(CANT AS DOUBLE PRECISION) * COSTO)
            FROM COSTO_VENTAS WHERE TIDO_COD = 31 AND COVE_ID = :iddoc
            INTO :MONTO;
        if (MONTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTAINVEN, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if ((TIPOCUEN = 'I') or (TIPOCUEN = 'A')) then
                BEGIN
                FOR SELECT MAX(ARTI_COD), SUM(CAST(CANT AS DOUBLE PRECISION) * COSTO)
                    FROM COSTO_VENTAS WHERE TIDO_COD = 31 AND COVE_ID = :iddoc
                    GROUP BY ARTI_COD INTO :ARTICULO, :MONTO
                    DO
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTAINVEN, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                    NROI = NROI + 1;
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAINVEN, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAINVEN, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                END
            END /* MONTO <> 0 */
        END /* INVEN = K */
    /* recorra las cuentas adicionales */
    FOR SELECT INVC_CUENTA, INVC_BASE, INVC_PORC, INVC_VALOR, INVC_DB
        FROM INTERFAZ_VENTAS_CTAS
        WHERE INVE_ID = :IDINTER
        INTO :CTADIC, :BASEADIC, :PORCADIC, :VALORADIC, :DBADIC
        DO
        BEGIN
        if (VALORADIC <> 0) then
            MONTO = VALORADIC;
        ELSE
            BEGIN
            if (:BASEADIC = 'SUBTOTAL') then
                VALORADIC = vrsubt;
            if (:BASEADIC = 'DESCUENTO') then
                VALORADIC = VRDTO;
            if (:BASEADIC = 'IVA') then
                VALORADIC = VRIVA;
            if (:BASEADIC = 'ADICIONAL') then
                VALORADIC = VRADIC;
            if (:BASEADIC = 'EXTRA') then
                VALORADIC = VREXTRA;
            if (:BASEADIC = 'TOTAL') then
                VALORADIC = VRTOTAL;
            MONTO = VALORADIC * PORCADIC / 100;
            END
        if (MONTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTADIC, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                if (DBADIC = 'S') then
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                ELSE
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                if (DBADIC = 'S') then
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                ELSE
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                END
            NROI = NROI + 1;
            END
        END
    if (ERROR > 0) then
        VER = 'S';
    SUSPEND;
    END /* NO ANULADO */
  END /* EXISTE LA INTERFAZ */
ELSE
    BEGIN
    EXECUTE PROCEDURE ERROR (31, :IDDOC, :PREF, 1);
    ERROR = ERROR + 1;
    VER = 'S';
    SUSPEND;
    END
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE CONTADO_MVERDE(
    FECINI DATE,
    FECFIN DATE,
    PREF VARCHAR(4))
RETURNS (
    FECHA DATE,
    PUNTO INTEGER,
    IDC INTEGER,
    ERROR INTEGER,
    VER CHAR(1))
AS
declare variable IDIN INTEGER;
declare variable IDF INTEGER;
declare variable NIT VARCHAR(20);
begin
FECHA = FECINI;
SELECT MAX(INVE_ID) FROM INTERFAZ_VENTAS WHERE TIDO_COD = 31 AND PREF_PRE = :PREF INTO :IDIN;
WHILE (FECHA <= fecfin) DO
    BEGIN
    /* LAS DE CONTADO */
    FOR SELECT PTVT_ID, TERC_NIT FROM punto_venta ORDER BY PTVT_ID INTO :PUNTO, :NIT
        do
        BEGIN
        EXECUTE PROCEDURE contabil_facturas_contado (FECHA, NIT, PREF, PUNTO, IDIN) returning_values (ERROR,  VER, IDC);
        EXECUTE PROCEDURE contabiliza_pendiente (IDC);
        suspend;
        END
    /* LAS DE CREDITO */
    FOR SELECT FACT_ID, PTVT_ID FROM facturas F WHERE fact_fecha = :fecha and pref_pre = :pref and
        NOT exists (select terc_nit from punto_venta p where terc_nit = f.terc_nit) into : IDF, :PUNTO
        DO
        BEGIN
        if (NOT EXISTS (SELECT ENCO_CONSEC FROM comprobante_encabezado WHERE ENCO_TIPOREF = 31 AND ENCO_IDREF = :IDF)) then
            BEGIN
            EXECUTE PROCEDURE contabil_factura(idf,  IDIN) returning_values (ERROR, VER, IDC);
            EXECUTE PROCEDURE contabiliza_pendiente (IDC);
            suspend;
            END
        END
    FECHA = FECHA + 1;
    END
end


^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE FACTURAR_CONCEPTOS(
    ID INTEGER,
    NITINI VARCHAR(20),
    NITFIN VARCHAR(20),
    AGRINI VARCHAR(20),
    AGRFIN VARCHAR(20),
    AGRUPA INTEGER,
    FECHA DATE)
RETURNS (
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(6),
    NIT VARCHAR(20),
    NOMBRE VARCHAR(60),
    TOTAL NUMERIC(18,2))
AS
declare variable IDF INTEGER;
declare variable IDC INTEGER;
declare variable VEND INTEGER;
declare variable PTVT INTEGER;
declare variable VENDINI INTEGER;
declare variable VENDFIN INTEGER;
declare variable ZONINI CHAR(2);
declare variable ZONFIN CHAR(2);
declare variable grpini INTEGER;
declare variable grpfin INTEGER;
declare variable DIAS INTEGER;
declare variable OBS VARCHAR(255);
declare variable IVAINC CHAR(1);
declare variable ITEM INTEGER;
declare variable ARTICULO VARCHAR(20);
declare variable DESCR VARCHAR(60);
declare variable CANT NUMERIC(18,2);
declare variable PRUNIT NUMERIC(18,2);
declare variable IVAP NUMERIC(18,2);
declare variable IVAM NUMERIC(18,2);
declare variable BASE NUMERIC(18,2);
declare variable RTFTE NUMERIC(9,2);
declare variable RTIVA NUMERIC(9,2);
declare variable RTICA NUMERIC(9,2);
declare variable RTFTEM NUMERIC(18,2);
declare variable RTIVAM NUMERIC(18,2);
declare variable RTICAM NUMERIC(18,2);
declare variable UNIDAD VARCHAR(8);
declare variable BOD VARCHAR(2);
declare variable ERROR INTEGER;
declare variable VER CHAR(1);
declare variable factmes varchar(2);
declare variable GRPFM VARCHAR(3);
declare variable OK CHAR(1);
begin
if (agrupa = 0) then
    BEGIN
    VENDINI = 0;
    VENDFIN = 999999;
    GRPINI = 0;
    GRPFIN = 999999;
    ZONINI = '';
    ZONFIN = 'zz';
    END
if (agrupa = 1) then
    BEGIN
    VENDINI = 0;
    VENDFIN = 999999;
    ZONINI = '';
    ZONFIN = 'zz';
    GRPINI = AGRINI;
    GRPFIN = AGRFIN;
    END
if (agrupa = 2) then
    BEGIN
    GRPINI = 0;
    GRPFIN = 999999;
    ZONINI = '';
    ZONFIN = 'zz';
    VENDINI = AGRINI;
    VENDFIN = AGRFIN;
    END
if (agrupa = 3) then
    BEGIN
    VENDINI = 0;
    VENDFIN = 999999;
    GRPINI = 0;
    GRPFIN = 999999;
    ZONINI = AGRINI;
    ZONFIN = AGRFIN;
    END
EXECUTE procedure lee_configuracion ('FACTURACION', 'FACTURAS', 'GRUPO DE MERCANCIA PARA CONTROL MENSUAL DE FACTURACION') returning_values (:GRPFM);
EXECUTE procedure lee_configuracion ('FACTURACION', 'FACTURAS', 'CONTROLAR FACTURACION MENSUAL POR CADA CLIENTE') returning_values (:factmes);
SELECT FACC_PREF, FACC_VEND, FACC_DIAS, FACC_PTVT, FACC_OBS FROM factura_concepto WHERE FACC_ID = :ID
    INTO :prefijo, :vend, :dias, :ptvt, :obs;
SELECT BODE_COD FROM punto_venta WHERE PTVT_ID = :PTVT INTO :BOD;
FOR SELECT T.TERC_NIT, TERC_NOM, C.vend_cod, C.clie_rtefte, C.clie_rteiva, C.clie_rteica, C.clie_rtftebase
    FROM TERCEROS T, CLIENTES C
    WHERE T.terc_nit = C.terc_nit AND T.TERC_NIT >= :NITINI AND T.TERC_NIT <= :NITFIN AND
        C.vend_cod >= :vendini AND C.vend_cod <= :vendfin AND ((c.grca_cod is null and :grpini = 0 ) or (C.grca_cod >= :grpini AND C.grca_cod <= :grpfin)) AND
        ((c.zona_cod is null and :zonini = '') or (C.zona_cod >= :zonini AND C.zona_cod <= :zonfin))
    INTO :NIT, :NOMBRE, :VEND, :RTFTE, :RTIVA, :RTICA, :RTFTEM
    DO
    BEGIN
    SELECT PREF_ACTUAL, PREF_IVAINC FROM PREFIJOS WHERE TIDO_COD = 31 AND PREF_PRE = :prefijo
        INTO :NUMERO, :IVAINC;
    select max(INVE_ID) FROM interfaz_ventas WHERE PREF_PRE = :prefijo AND TIDO_COD = 31 INTO :IDC;

    OK = 'S';
    if (FACTMES = 'SI') then
        begin
        if (EXISTS(SELECT FAME_IDFACT FROM FACTURAS_MES WHERE FAME_NIT = :nit AND FAME_ANO = EXTRACT(YEAR FROM :FECHA) AND FAME_MES = EXTRACT(MONTH FROM :FECHA))) then
            OK = 'N';
        end
    if (OK = 'S') then
        BEGIN
        IDF = GEN_ID(id_factura, 1);
        INSERT INTO FACTURAS (FACT_ID, PTVT_ID, VEND_COD, TERC_NIT, AUTO_NUMERO, FACT_NUMERO, FACT_FECHA, FACT_DESPACHO,
            FACT_VENCE, FACT_IVAINC, FACT_COMIPORC, FACT_COMIMONTO, FACT_DTOPOR, FACT_DTOMONTO, FACT_ADICIONAL,
            FACT_IVAMONTO, FACT_RTFTEPOR, FACT_RTFTEMONTO, FACT_RTIVAPOR, FACT_RTIVAMONTO, FACT_RTICAPOR, FACT_RTICAMONTO,
            FACT_EXTRA, FACT_DTOFPOR, FACT_DTOFMONTO, FACT_DTOFFECHA, PREF_PRE, FACT_TRANSP, FACT_NOMCLIENTE, FACT_COTIZACI,
            FACT_PEDIDO, FACT_REMISION, FACT_ANULADO, FACT_TRANSMIT, FACT_TOTAL, BODE_COD, FACT_OBS, VEHI_COD, FACT_CONSOLIDA,
            FACT_RECIBIDO, FACT_USUARIO, FACT_SUCURSAL, NUMOK, COBR_COD, FACT_FACTOR, FACT_DETCLI, FACT_DETCLINOM,
            FACT_DTOIT1, FACT_DTOIT2, FACT_DTOIT3, FACT_TRM)
            VALUES (:IDF, :PTVT, :VEND, :NIT, NULL, :NUMERO, :FECHA, NULL, (:FECHA + :DIAS), :IVAINC,
            0, 0, 0, 0, 0, :IVAM, :RTFTE, :RTFTEM, :RTIVA, :RTIVAM, :RTICA, :RTICAM, 0, 0, 0, :FECHA, :PREFIJO, NULL,
            :NOMBRE, NULL, NULL, NULL, 'N', 'N', :TOTAL, :BOD, :OBS, NULL, NULL, 0, USER, '01', 'N', :VEND, 1, NULL,
            NULL, NULL, NULL, NULL, 1);

        FOR SELECT FACI_ITEM, FC.ARTI_COD, FACI_CANT, FACI_PRUNIT, ARTI_UNIDAD, TAIV_PORC, FACI_DESC
            FROM factura_concepto_items FC, ARTICULO A, TARIFA_IVA I
            WHERE FC.arti_cod = A.arti_cod AND A.taiv_cod = I.taiv_cod AND FC.facc_id = :ID
            INTO :item, :articulo, :CANT, :prunit, :unidad, :ivap, :descr
            DO
            BEGIN
            /* busque el precio por cliente */
            if (EXISTS(SELECT ARTI_COD FROM ARTICULO WHERE ARTI_COD = :articulo AND GRUP_COD = :GRPFM)) then
                SELECT CLIE_VALORMES FROM CLIENTES WHERE TERC_NIT = :NIT INTO :PRUNIT;

            if (IVAINC = 'S') then
                BEGIN
                IVAM = :CANT * :PRUNIT / (100 + :IVAP) * :IVAP;
                BASE = :CANT * :PRUNIT;
                END
            ELSE
                BEGIN
                IVAM = :CANT * :PRUNIT * IVAP / 100;
                BASE = :CANT * :PRUNIT + IVAM;
                END
            INSERT INTO FACTURAS_DETALLE (FACT_ID, FADE_ITEM, BODE_COD, ARTI_COD, FADE_CANT, FADE_UNIDAD, FADE_LOTE,
                FADE_PRUNIT, FADE_DTOPORC, FADE_DTOMONTO, FADE_IVAPORC, FADE_IVAMONTO, FADE_CONSUMO, FADE_FACTOR,
                FADE_DESC, FADE_OBS, FADE_CODBAR, FADE_REMISIONADO, FADE_DEVUELTO, FADE_TOTAL, LIPR_COD, FADE_REFERENCIA,
                FADE_ANULADO, FADE_TRANSMIT, FADE_FACTORLISTA, FADE_DTO1, FADE_DTO2, FADE_DTO3, FADE_DTOM1, FADE_DTOM2,
                FADE_DTOM3, FADE_CAJAS)
                VALUES (:IDF, :ITEM, :BOD, :articulo, :CANT, :UNIDAD, NULL, :prunit, 0, 0, :IVAP, :ivam, 0, 1,
                :descr, NULL, :articulo, 0, 0, :BASE, 1, NULL, 'N', 'N', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
            END

        /* CALCULE EL TOTAL DE LA FACTURA XA EFECTOS DE IMPUESTOS */
        SELECT SUM(FADE_TOTAL), SUM(FADE_IVAMONTO) FROM facturas_detalle WHERE FACT_ID = :idf
            INTO :TOTAL, :IVAM;
        if (IVAINC = 'S') then
            BASE = TOTAL - IVAM;
        ELSE
            BASE = TOTAL;
        if (BASE >= RTFTEM) then
            BEGIN
            RTFTEM = BASE * RTFTE / 100;
            RTICAM = BASE * RTICA / 1000;
            RTIVAM = IVAM * RTIVA / 100;
            END
        ELSE
            BEGIN
            RTFTEM = 0;
            RTICAM = 0;
            RTIVAM = 0;
            END
        UPDATE FACTURAS SET FACT_TOTAL = :total,  FACT_IVAMONTO = :IVAM, FACT_RTFTEMONTO = :rtftem, 
            FACT_RTIVAMONTO = :rtivam, FACT_RTICAMONTO = :rticam WHERE FACT_ID = :IDF;

        /* contabilice */
        execute procedure CONTABIL_FACTURA(:idf,  :IDC) returning_values (:ERROR, :VER, :IDC);
        EXECUTE procedure contabiliza_pendiente (:IDC);
        suspend;
        END
    END
end


^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE FACTURAS_SIN_CONTABILIDAD(
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    ID INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    ESTADO VARCHAR(20),
    IDI INTEGER,
    IDC INTEGER)
AS
DECLARE VARIABLE VER CHAR(2);
declare variable FECICNT VARCHAR(10);
declare variable FECFCNT VARCHAR(10);
declare variable ERROR INTEGER;
declare variable idref INTEGER;
BEGIN
EXECUTE PROCEDURE fecha_a_conta(FECINI) returning_values (FECICNT);
EXECUTE PROCEDURE fecha_a_conta(FECFIN) returning_values (FECFCNT);
FOR SELECT FACT_ID, PREF_PRE, FACT_NUMERO FROM FACTURAS WHERE FACT_ANULADO = 'N' AND
    FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN INTO :ID, :PREF, :NUMERO
DO
  BEGIN
  idref = null;
  SELECT ENCO_IDREF FROM COMPROBANTE_ENCABEZADO WHERE ENCO_TIPOREF = 31 AND ENCO_FECHA >= :FECICNT AND ENCO_FECHA <= :FECFCNT and ENCO_IDREF = :ID into :idref;
  if (idref IS NULL) then
  begin
   ESTADO = 'PROCESANDO';
   ERROR = NULL;
   SUSPEND;
   SELECT MAX(INVE_ID) FROM INTERFAZ_VENTAS WHERE PREF_PRE = :PREF AND TIDO_COD = 31 INTO :IDI;
   EXECUTE PROCEDURE CONTABIL_FACTURA (:ID, :IDI) RETURNING_VALUES (:ERROR, VER, :IDC);
   if ((ERROR = 0) or (error IS NULL)) then
    BEGIN
    EXECUTE PROCEDURE CONTABILIZA_PENDIENTE (:IDC);
    ESTADO = 'OK';
    END
   ELSE
    ESTADO = 'ERROR';
   suspend;
  end
  END
END


^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure CONTABIL_DEVOLCLI (
    IDDOC integer,
    IDINTER integer)
returns (
    ERROR integer,
    VER char(1),
    IDC integer)
AS
declare variable PREF VARCHAR(4);
declare variable NUM VARCHAR(6);
declare variable NUMERO VARCHAR(10);
declare variable FECAUX DATE;
declare variable FECHA CHAR(8);
declare variable CONC CHAR(120);
declare variable NUMFAC VARCHAR(10);
declare variable VRDTO NUMERIC(18, 2);
declare variable VRADIC NUMERIC(18, 2);
declare variable VRSUBT NUMERIC(18, 2);
declare variable VRIVA NUMERIC(18, 2);
declare variable PRTFTE NUMERIC(9, 2);
declare variable VRRTFTE NUMERIC(18, 2);
declare variable VRRTIVA NUMERIC(18, 2);
declare variable PRTICA NUMERIC(9, 2);
declare variable VRRTICA NUMERIC(18, 2);
declare variable VRTOTAL NUMERIC(18, 2);
declare variable VREXTRA NUMERIC(18, 2);
declare variable TIPOCOMP VARCHAR(3);
declare variable PREFCONT VARCHAR(4);
declare variable VENTAS CHAR(1);
declare variable CTAVENTAS VARCHAR(20);
declare variable IVA CHAR(1);
declare variable CTAIVA VARCHAR(20);
declare variable CONSUMO CHAR(1);
declare variable CTACONSUMO VARCHAR(20);
declare variable CARTERA CHAR(1);
declare variable CTACARTERA VARCHAR(20);
declare variable RTFTE CHAR(1);
declare variable CTARTFTE VARCHAR(20);
declare variable RTIVA CHAR(1);
declare variable CTARTIVA VARCHAR(20);
declare variable RTICA CHAR(1);
declare variable CTARTICA VARCHAR(20);
declare variable INVEN CHAR(1);
declare variable CTAINVEN VARCHAR(20);
declare variable COSTOS CHAR(1);
declare variable CTACOSTOS VARCHAR(20);
declare variable CTADTO VARCHAR(20);
declare variable CTAADIC VARCHAR(20);
declare variable CTAEXTRA VARCHAR(20);
declare variable EXISTE CHAR(1);
declare variable CUENTA VARCHAR(20);
declare variable MONTO NUMERIC(18,2);
declare variable TIPOCUEN CHAR(1);
declare variable NIT VARCHAR(20);
declare variable PROY VARCHAR(4);
declare variable CENTRO VARCHAR(4);
declare variable PROYI VARCHAR(4);
declare variable CENTI VARCHAR(4);
declare variable PORC NUMERIC(5,2);
declare variable DEBITO NUMERIC(18,2);
declare variable CREDITO NUMERIC(18,2);
declare variable NROI INTEGER;
declare variable ART VARCHAR(15);
declare variable IMPINC CHAR(1);
declare variable IMPTOS NUMERIC(18, 2);
declare variable SUMA NUMERIC(18,2);
declare variable PORCIVA NUMERIC(9,2);
declare variable TCTACLIEN VARCHAR(20);
declare variable TCTAVENTA VARCHAR(20);
declare variable TCTARTFTE VARCHAR(20);
declare variable TCTARTIVA VARCHAR(20);
declare variable TCTARTICA VARCHAR(20);
declare variable CTADIC VARCHAR(20);
declare variable BASEADIC VARCHAR(20);
declare variable PORCADIC NUMERIC(5,2);
declare variable VALORADIC NUMERIC(18,2);
declare variable DBADIC CHAR(1);
declare variable PTOVTA INTEGER;
declare variable ANULADO CHAR(1);
declare variable CENT CHAR(1);
DECLARE VARIABLE MERCANCIA NUMERIC(18,2);
declare variable FACTOR DOUBLE PRECISION;
declare variable DIG INTEGER;
DECLARE VARIABLE FOMENTO VARCHAR(2);
DECLARE VARIABLE VRCONSUMO NUMERIC(18,2);
declare variable AUTORET VARCHAR(10);
declare variable FAUTORET DATE;
declare variable IDREM INTEGER;
declare variable IDPED INTEGER;
declare variable DTOXIT CHAR(2);
declare variable ERRORC INTEGER;
declare variable DEC2799 char(2);
declare variable ctadtoiva varchar(20);
declare variable ICOING CHAR(2);
BEGIN
EXECUTE PROCEDURE lee_configuracion ('FACTURACION', 'FACTURAS', 'DESCONTAR IVA DE PRODUCTOS DECRETO 2799') returning_values (:DEC2799);
EXECUTE PROCEDURE LEE_CONFIGURACION('COMPRAS', 'FACTURAS', 'USAR IMPOCONSUMO COMO PORCENTAJE DE FOMENTO') returning_values (FOMENTO);
EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'FECHA AUTORETENEDOR NO DESCONTAR RETENCIONES DEL SALDO PERO SI CONTABILIZARLAS') returning_values (AUTORET);
EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION', 'ARTICULOS', 'IMPOCONSUMO COMO MAYOR VALOR DEL COSTO Y DEL INGRESO') returning_values (ICOING);
if (AUTORET <> '') then
    FAUTORET = CAST(AUTORET AS DATE);
else
    FAUTORET = '9999/12/31';
  /* BUSQUE LA INTERFACE */
  EXISTE = 'N';
  SELECT 'S', TICO_COD, PRCO_PRE, INVE_VENTAS, INVE_IVA, INVE_CONSUMO, INVE_CARTERA, INVE_RTFTE, INVE_RTIVA, INVE_RTICA, INVE_COSTO, INVE_INVEN, INVE_CTAVENTAS, INVE_CTAIVA, INVE_CTACONSUMO, INVE_CTADTO, INVE_CTAADIC, INVE_CTAEXTRA, INVE_CTACARTERA, INVE_CTARTFTE, INVE_CTARTIVA, INVE_CTARTICA, INVE_CTAINVEN, INVE_CTACOSTOS, INVE_CONFIRMAR, INVE_CENTRO
    FROM INTERFAZ_VENTAS
    WHERE INVE_ID = :IDINTER
    INTO :EXISTE, :TIPOCOMP, :PREFCONT, :VENTAS, :IVA, :CONSUMO, :CARTERA, :RTFTE, :RTIVA, :RTICA, :COSTOS, :INVEN, :CTAVENTAS, :CTAIVA, :CTACONSUMO, :CTADTO, :CTAADIC, :CTAEXTRA, :CTACARTERA, :CTARTFTE, :CTARTIVA, :CTARTICA, :CTAINVEN, :CTACOSTOS, :VER, :CENT;
  if (EXISTE = 'S') then
   BEGIN
    /* BORRE CUALQUEIR CONTABILIZACION PREVIA */
    DELETE FROM CONTABILIZACION WHERE CNTB_TIPOREF = 33 AND CNTB_IDREF = :IDDOC;
    /* TRAIGA EL ENCABEZADO DE LA DEVOLUCION */
   SELECT PREF_PRE, DEVT_NUMERO, DEVT_FECHA, F.TERC_NIT, DEVT_IVAINC, PTVT_ID, DEVT_FACTURA, DEVT_DTOMONTO, DEVT_ADICIONAL, DEVT_IVAMONTO, DEVT_EXTRA, DEVT_TOTAL, DEVT_RTFTEPORC, DEVT_RTFTEMONTO, DEVT_RTIVAPORC, DEVT_RTIVAMONTO, DEVT_RTICAPORC, DEVT_RTICAMONTO, TERC_CTARTFTE, TERC_CTARTIVA, TERC_CTARTICA, TERC_CTAVENTA, TERC_CTACLIENTE, DEVT_ANULADO, DEVT_REMID, DEVT_PEDID
        FROM DEVOLUCIONES_VENTAS F, TERCEROS T
        WHERE DEVT_ID = :IDDOC AND F.TERC_NIT = T.TERC_NIT
        INTO :PREF, :NUM, :FECAUX, :NIT, :IMPINC, :PTOVTA, :NUMFAC, :VRDTO, :VRADIC, :VRIVA, :VREXTRA, :VRTOTAL, :PRTFTE, :VRRTFTE, :PORC, :VRRTIVA, :PRTICA, :VRRTICA, :TCTARTFTE, TCTARTIVA, TCTARTICA, TCTAVENTA, TCTACLIEN, ANULADO, :IDREM, :IDPED;
   if (idrem is null) Then
    IDREM = 0;
   if (idped is null) Then
    IDPED = 0;
   if ((ANULADO = 'N') AND (IDREM = 0) AND (IDPED = 0)) then
    BEGIN
    NUMERO = PREF || NUM;
    SELECT SUM(DVDE_CONSUMO) FROM devoluciones_ventas_detalle WHERE DEVT_ID = :iddoc AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
        INTO :MERCANCIA;
    VRSUBT = VRTOTAL - VREXTRA - VRIVA - MERCANCIA; /* BASE DE RETEFTE Y RETEICA */
    EXECUTE PROCEDURE lee_configuracion ('FACTURACION', 'DEVOLUCIONES', 'DESCUENTO PIE DEVOLUCION IGUAL A SUMA DE DESCUENTOS POR ITEM') returning_values (:DTOXIT);
    if (DTOXIT = 'SI') then
        VRDTO = 0;
    MERCANCIA = VRSUBT - VRADIC + VRDTO;
    IF (CENT = 'B') THEN
        SELECT B.BODE_CENTRO, B.BODE_PROY FROM BODEGA B, DEVOLUCIONES_VENTAS F
            WHERE B.BODE_COD = F.BODE_COD AND F.DEVT_ID = :IDDOC INTO :CENTRO, :PROY;
    IF (CENT = 'V') THEN
        SELECT V.CENT_COD, V.PROY_COD FROM VENDEDORES V, DEVOLUCIONES_VENTAS F
            WHERE V.VEND_COD = F.VEND_COD AND F.DEVT_ID = :IDDOC INTO :CENTRO, :PROY;
    IF (CENT = 'P') THEN
        SELECT P.PREF_CENTRO,P.PREF_PROY  FROM PREFIJOS P, DEVOLUCIONES_VENTAS F
            WHERE P.PREF_PRE = F.PREF_PRE AND F.DEVT_ID = :IDDOC AND P.TIDO_COD = 33 INTO :CENTRO, :PROY;
    EXECUTE PROCEDURE FECHA_A_CONTA(:FECAUX) returning_values (:FECHA);
    /* REGISTRE EL ENCABEZADO CONTABLE */
    IDC = GEN_ID(ID_CONTABILIZA, 1);
    CONC = 'DEVOLUCION VENTAS No. ' || NUMERO || ' EN FACTURA ' || NUMFAC;
    CONC = SUBSTR(CONC, 1, 60);
    INSERT INTO CONTABILIZACION (CNTB_ID, CNTB_TIPOCOMP, CNTB_PREFCNT, CNTB_NUMERO, CNTB_FECHA, CNTB_CONCEPTO, CNTB_REF, CNTB_TIPOREF, CNTB_IDREF, CNTB_PREFREF, CNTB_NUMREF, CNTB_PROCESADO)
        VALUES (:IDC, :TIPOCOMP, :PREFCONT, :NUM, :FECHA, :CONC, '', 33, :IDDOC, :PREF, :NUM, 'N');
    NROI = 0;
    SUMA = 0;
    ERROR = 0;
    /* SI NO HAY CUENTA DE DESCUENTO NI ADICIONAL CALCULE UN FACTOR PARA LAS VENTAS Y EL IVA */
    if (MERCANCIA <> 0) then
        FACTOR = CAST(VRSUBT AS DOUBLE PRECISION) / CAST(MERCANCIA AS DOUBLE PRECISION);
    ELSE
        FACTOR = 1;
    /* TRAIGA EL NUMERO DE DIGITOS PARA EL REDONDEO */
    SELECT CAST(CONF_VALOR AS INTEGER) FROM CONFIGURACION WHERE CONF_MODULO = 'FACTURACION' AND
        CONF_CATEGORIA = 'GENERAL' AND CONF_PROPIEDAD = 'REDONDEO AL MULTIPLO DE DIEZ EN TOTALES' INTO :DIG;
    /* CUENTAS DE VENTAS */
    if (VENTAS = 'A') then
        BEGIN
        FOR SELECT MAX(COAR_CTADEV), SUM(DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO), SUM(DVDE_IVAMONTO), SUM(DVDE_CONSUMO), MAX(B.bode_proy), MAX(B.bode_centro)
            FROM ARTICULO A, CONTABIL_ARTICULO C, DEVOLUCIONES_VENTAS_DETALLE F, BODEGA B
            WHERE F.DEVT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND B.bode_cod = F.bode_cod AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
            GROUP BY COAR_CTADEV
            INTO :CTAVENTAS, :MONTO, :IMPTOS, :VRCONSUMO, :proyi, :centi
            DO
            BEGIN
            if ((FOMENTO = 'SI') or (icoing = 'SI')) then
                MONTO = MONTO + VRCONSUMO;
            if ((CTADTO IS NULL) OR (CTADTO = '')) then
                MONTO = MONTO * FACTOR;
            execute procedure redondee(MONTO, DIG) returning_values (MONTO);
            if (MONTO <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTAVENTAS, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if ((TIPOCUEN = 'I') or (TIPOCUEN = 'A')) then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (33, :IDDOC, :CUENTA, 3);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                    NROI = NROI + 1;
                    SUMA = SUMA + MONTO;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    IF (CENT = 'B') THEN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROYI, :CENTI, NULL, NULL, NULL, NULL, 0, 0);
                    ELSE
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA + MONTO;
                    END
                END /* MONTO <> 0 */
            END /* FOR */
        END /* VENTAS X ARTICULO */
     IF ((VENTAS = 'C') OR (VENTAS = 'K')) THEN
        BEGIN
        IF (VENTAS = 'C') THEN
            CTAVENTAS = TCTAVENTA;
        SELECT SUM(DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO), SUM(DVDE_IVAMONTO), SUM(DVDE_CONSUMO)
            FROM DEVOLUCIONES_VENTAS_DETALLE F
            WHERE F.DEVT_ID = :IDDOC  AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
            INTO :MONTO, :IMPTOS, :VRCONSUMO;
        if ((FOMENTO = 'SI') or (icoing = 'SI')) then
            MONTO = MONTO + VRCONSUMO;
        if ((CTADTO IS NULL) OR (CTADTO = '')) then
            MONTO = MONTO * FACTOR;
        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
        if (MONTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTAVENTAS, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if ((TIPOCUEN = 'I') or (TIPOCUEN = 'A')) then
                BEGIN
                EXECUTE PROCEDURE ERROR (33, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                NROI = NROI + 1;
                SUMA = SUMA + MONTO;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA + MONTO;
                END
            END /* MONTO <> 0 */
        END /* VENTAS DE CLIENTE O CONSTANTE */
    /* EL IVA EN VENTAS */
    if (IVA = 'A') then
        BEGIN
        FOR SELECT MAX(COAR_CTAIVAV), SUM(DVDE_IVAMONTO), SUM(DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO), SUM(DVDE_CONSUMO)
            FROM ARTICULO A, CONTABIL_ARTICULO C, DEVOLUCIONES_VENTAS_DETALLE F
            WHERE F.DEVT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
            GROUP BY COAR_CTAIVAV
            INTO :CTAIVA, :IMPTOS, :MONTO, :VALORADIC
        DO
            BEGIN
            if (FOMENTO = 'SI') then
                MONTO = MONTO + VALORADIC;
            MONTO = MONTO * -1;
            MONTO = MONTO * FACTOR;
            IMPTOS = IMPTOS * FACTOR;
            execute procedure redondee(MONTO, DIG) returning_values (MONTO);
            execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
            if (IMPTOS <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTAIVA, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if ((TIPOCUEN = 'I') or (TIPOCUEN = 'A')) then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (31, :IDDOC, :CUENTA, 3);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                    NROI = NROI + 1;
                    SUMA = SUMA + IMPTOS;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA + IMPTOS;
                    END
                END   /* IMPTOS <> 0 */
            END /* FOR */
        if (DEC2799 = 'SI') then
            BEGIN
            FOR SELECT MAX(COAR_CTAIVADEC), SUM(FADE_IVAMONTO), SUM(FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), sum(FADE_CONSUMO)
                FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_DETALLE F
                WHERE F.FACT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
                    AND A.arti_dec2799 = 'S'
                GROUP BY COAR_CTAIVADEC
                INTO :CTADTOIVA, :IMPTOS, :MONTO, :VALORADIC
                DO
                BEGIN
                if (FOMENTO = 'SI') then
                    MONTO = MONTO + VALORADIC;
                MONTO = MONTO * -1;
                MONTO = MONTO * FACTOR;
                IMPTOS = IMPTOS * FACTOR;
                execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                if (IMPTOS <> 0) then
                    BEGIN
                    EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTADTOIVA, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                    if (ERRORC <> 0) then
                        ERROR = ERROR + 1;
                    if (TIPOCUEN = 'N') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :IMPTOS, 0, :MONTO, ABS(:IMPTOS*100/:MONTO), :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NROI = NROI + 1;
                        SUMA = SUMA + IMPTOS;
                        END
                    END   /* IMPTOS <> 0 */
                END
            END
        END /* IVA X ARTICULO */
    if (IVA = 'K') then /* IVA EN CTA CONSTANTE */
        BEGIN
        SELECT SUM(DVDE_IVAMONTO), SUM(DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO), SUM(DVDE_CONSUMO)
            FROM DEVOLUCIONES_VENTAS_DETALLE F
            WHERE F.DEVT_ID = :IDDOC  AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
            INTO :IMPTOS, :MONTO, :VALORADIC;
        if (FOMENTO = 'SI') then
            MONTO = MONTO + VALORADIC;
        MONTO = MONTO * -1;
        MONTO = MONTO * FACTOR;
        IMPTOS = IMPTOS * FACTOR;
        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
        execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
        if (IMPTOS <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTAIVA, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if ((TIPOCUEN = 'I') or (TIPOCUEN = 'A')) then
                BEGIN
                EXECUTE PROCEDURE ERROR (33, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                NROI = NROI + 1;
                SUMA = SUMA + IMPTOS;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA + IMPTOS;
                END
            END /* IMPTOS <> 0 */
        if (DEC2799 = 'SI') then
            BEGIN
            SELECT SUM(FADE_IVAMONTO), SUM(FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), SUM(FADE_CONSUMO)
                FROM FACTURAS_DETALLE F, ARTICULO A
                WHERE F.FACT_ID = :IDDOC and FADE_IVAMONTO <> 0 AND F.arti_cod = A.arti_cod AND
                ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL)) AND A.arti_dec2799 = 'S'
                INTO :IMPTOS, :MONTO, :valoradic;
            if (FOMENTO = 'SI') then
                MONTO = MONTO + VALORADIC;
            MONTO = MONTO * -1;
            MONTO = MONTO * FACTOR;
            IMPTOS = IMPTOS * FACTOR;
            execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
            execute procedure redondee(MONTO, DIG) returning_values (MONTO);
            if (IMPTOS <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTADTOIVA, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :IMPTOS, 0, :MONTO, ABS(:IMPTOS*100/:MONTO), :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA + IMPTOS;
                    END
                END   /* IMPTOS <> 0 */
            END
        END /* IVA EN CTA CONSTANTE */
    /* EL IMPOCONSUMO */
    if ((CONSUMO = 'A') AND (FOMENTO <> 'SI')) then
        BEGIN
        FOR SELECT MAX(COAR_CTACONS), SUM(DVDE_CONSUMO)
            FROM ARTICULO A, CONTABIL_ARTICULO C, DEVOLUCIONES_VENTAS_DETALLE F
            WHERE F.DEVT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
            GROUP BY COAR_CTACONS
            INTO :CTACONSUMO, :IMPTOS
        DO
            BEGIN
            if (IMPTOS <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTACONSUMO, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if ((TIPOCUEN = 'I') or (TIPOCUEN = 'A')) then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (33, :IDDOC, :CUENTA, 3);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                    NROI = NROI + 1;
                    SUMA = SUMA + IMPTOS;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA + IMPTOS;
                    END
                END /* IMPTOS <> 0 */
            END /* FOR */
        END /* CONSUMO X ARTICULO */
    if ((CONSUMO = 'K') AND (FOMENTO <> 'SI')) then
        BEGIN
        SELECT SUM(DVDE_CONSUMO)
            FROM DEVOLUCIONES_VENTAS_DETALLE F
            WHERE F.DEVT_ID = :IDDOC AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
            INTO :IMPTOS;
        if (IMPTOS <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTACONSUMO, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if ((TIPOCUEN = 'I') or (TIPOCUEN = 'A')) then
                BEGIN
                EXECUTE PROCEDURE ERROR (33, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTACONSUMO, :CONC, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA + IMPTOS;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTACONSUMO, :CONC, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA + IMPTOS;
                END
            END /* IMPTOS <> 0 */
        END /* CONSUMO EN CTA CONSTANTE */
    /* DESCUENTO */
    if ((CTADTO IS NOT NULL) AND
        (CTADTO <> '') AND
        (VRDTO <> 0)) THEN
        BEGIN
        EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTADTO, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRDTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
            NROI = NROI + 1;
            SUMA = SUMA - VRDTO;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRDTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 33);
            NROI = NROI + 1;
            SUMA = SUMA - VRDTO;
            END
        END /* DESCUENTO */
    /* VALOR ADIC */
    if ((CTAADIC IS NOT NULL) AND
        (CTAADIC <> '') AND
        (VRADIC <> 0)) THEN
        BEGIN
        EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTAADIC, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRADIC, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
            NROI = NROI + 1;
            SUMA = SUMA + VRADIC;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRADIC, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 33);
            NROI = NROI + 1;
            SUMA = SUMA + VRADIC;
            END
        END /* VR. ADIC */
    /* VALOR EXTRA */
    if ((CTAEXTRA IS NOT NULL) AND
        (CTAEXTRA <> '') AND
        (VREXTRA <> 0)) THEN
        BEGIN
        EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTAEXTRA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VREXTRA, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
            NROI = NROI + 1;
            SUMA = SUMA + VREXTRA;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VREXTRA, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 33);
            NROI = NROI + 1;
            SUMA = SUMA + VREXTRA;
            END
        END /* VR. EXTRA */
    /* RETENCION FUENTE */
    if ((RTFTE = 'C') or (RTFTE = 'K')) then
      if (VRRTFTE <> 0) then
        BEGIN
        if (RTFTE = 'C') then
            CTARTFTE = TCTARTFTE;
        EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTARTFTE, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, (:VRSUBT*-1), :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
            NROI = NROI + 1;
            SUMA = SUMA - VRRTFTE;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, (:VRSUBT*-1), :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA - VRRTFTE;
            END
        /* AUTORETENCION */
        if (FAUTORET <= fecaux) then
            BEGIN
            EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'CUENTA DE AUTORETENCION EN LA FUENTE') returning_values (CTARTFTE);
            EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTARTFTE, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :VRSUBT, :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                NROI = NROI + 1;
                SUMA = SUMA + VRRTFTE;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :VRSUBT, :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA + VRRTFTE;
                END
            END
        END /* RTFTE */
    if (RTFTE = 'A') then
      BEGIN
      FOR SELECT MAX(COAR_CTARTFTEV), MAX(COAR_RTFTE), MIN(COAR_RTBASE), SUM(DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO), SUM((DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO)*COAR_RTFTE)
        FROM CONTABIL_ARTICULO C, devoluciones_ventas_detalle F
        WHERE F.devt_id = :IDDOC AND F.ARTI_COD = C.ARTI_COD AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
        GROUP BY COAR_CTARTFTEV
        INTO :CTARTFTE, :PRTFTE, :baseadic, :MONTO, :VRRTFTE
        DO
        BEGIN
        MONTO = MONTO * FACTOR;
        if (MONTO >= BASEADIC) then
            BEGIN
            VRRTFTE = VRRTFTE * FACTOR / 100;
            execute procedure redondee(VRRTFTE, DIG) returning_values (VRRTFTE);
            execute procedure redondee(MONTO, DIG) returning_values (MONTO);
            if (VRRTFTE <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTARTFTE, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, (:MONTO*-1), :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                    NROI = NROI + 1;
                    SUMA = SUMA - VRRTFTE;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, (:MONTO*-1), :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA - VRRTFTE;
                    END
                /* AUTORETENCION */
                if (FAUTORET <= fecaux) then
                    BEGIN
                    EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'CUENTA DE AUTORETENCION EN LA FUENTE') returning_values (CTARTFTE);
                    EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTARTFTE, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
                    if (ERRORC <> 0) then
                        ERROR = ERROR + 1;
                    if (TIPOCUEN = 'C') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :MONTO, :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                        NROI = NROI + 1;
                        SUMA = SUMA + VRRTFTE;
                        END
                    if (TIPOCUEN = 'N') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :MONTO, :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NROI = NROI + 1;
                        SUMA = SUMA + VRRTFTE;
                        END
                    END
                END
            END
        END /* RTFTE */
      END
    /* RETENCION IVA */
    if ((RTIVA = 'C') or (RTIVA = 'K')) then
      if (VRRTIVA <> 0) then
        BEGIN
        if (RTIVA = 'C') then
            CTARTIVA = TCTARTIVA;
        EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTARTIVA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTIVA, (:VRIVA*-1), :PORC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
            NROI = NROI + 1;
            SUMA = SUMA - VRRTIVA;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTIVA, (:VRIVA*-1), :PORC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA - VRRTIVA;
            END
        END /* RTIVA */
    /* RETENCION DE ICA */
    if ((RTICA = 'C') or (RTICA = 'K')) then
      if (VRRTICA <> 0) then
        BEGIN
        if (RTICA = 'C') then
            CTARTICA = TCTARTICA;
        EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTARTICA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTICA, (:VRSUBT*-1), :PRTICA, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
            NROI = NROI + 1;
            SUMA = SUMA - VRRTICA;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTICA, (:VRSUBT*-1), :PRTICA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA - VRRTICA;
            END
        END /* RTICA */
    /* CIERRE EL COMPROBANTE CONTRA LA CUENTA DEL TERCERO O LA CONSTANTE */
    if ((SUMA <> 0) and ((CARTERA = 'C') or (CARTERA = 'K') or (CARTERA = 'J'))) then
        BEGIN
        if (icoing = 'SI') then
            BEGIN
            /* DESCUENTE EL IMPOCONSUMO QUE HACE PARTE DEL COSTO */
            SELECT SUM(DVDE_CONSUMO)
                FROM devoluciones_ventas_detalle F WHERE F.DEVT_ID = :IDDOC AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL)) INTO :IMPTOS;
            SUMA = SUMA - IMPTOS;
            END
        if (SUMA < 0) then
            BEGIN
            DEBITO = SUMA * -1;
            CREDITO = 0;
            END
        ELSE
            BEGIN
            DEBITO = 0;
            CREDITO = SUMA;
            END
        if (CARTERA = 'C') then
            CTACARTERA = TCTACLIEN;
        if (CARTERA = 'J') then
            BEGIN
            /* BUSQUE LA CUENTA DE LA CAJA */
            SELECT CAJA_CUENTA FROM CAJAS C, PUNTO_VENTA P
                WHERE P.CAJA_ID = C.CAJA_ID AND PTVT_ID = :PTOVTA
                INTO :CTACARTERA;
            END
        EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTACARTERA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :DEBITO, :CREDITO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
        if (TIPOCUEN = 'N') then
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :DEBITO, :CREDITO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
        NROI = NROI + 1;
        END /* SUMA EN CARTERA */
    /* CALCULE COSTOS EN VENTAS */
    EXECUTE PROCEDURE COSTO_EN_VENTAS(33, :IDDOC);
    if (COSTOS = 'A') then
        BEGIN
        FOR SELECT MAX(CTACOS), SUM(CAST(CANT AS DOUBLE PRECISION) * COSTO), SUM(DVDE_CONSUMO)
            FROM COSTO_VENTAS CV, devoluciones_ventas_detalle D WHERE CV.cove_item = D.dvde_item AND D.devt_id = :iddoc AND
            TIDO_COD = 33 AND COVE_ID = :iddoc
            GROUP BY CTACOS
            INTO :CTACOSTOS, :MONTO, :vrconsumo
        DO
            BEGIN
            if (icoing = 'SI') then
                MONTO = MONTO + VRCONSUMO;
            if (MONTO <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTACOSTOS, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if ((TIPOCUEN = 'I') or (TIPOCUEN = 'A')) then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT ARTI_COD, cast(CANT as double precision) * COSTO
                        FROM COSTO_VENTAS WHERE TIDO_COD = 33 AND COVE_ID = :IDDOC AND CTACOS = :CUENTA
                        INTO :ART, :MONTO
                        DO
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                    NROI = NROI + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    END
                END /* MONTO <> 0 */
            END /* FOR */
        END /* COSTOS */
    if (COSTOS = 'K') then
        BEGIN
        SELECT SUM(cast(CANT as double precision) * COSTO)
            FROM COSTO_VENTAS WHERE TIDO_COD = 33 AND COVE_ID = :IDDOC
            INTO :MONTO;
        if (icoing = 'SI') then
            MONTO = MONTO + imptos;
        if (MONTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTACOSTOS, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if ((TIPOCUEN = 'I') or (TIPOCUEN = 'A')) then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, REGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT ARTI_COD, cast(CANT as double precision) * COSTO
                    FROM COSTO_VENTAS WHERE TIDO_COD = 33 AND COVE_ID = :IDDOC
                    INTO :ART, :MONTO
                DO
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTACOSTOS, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                    NROI = NROI + 1;
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTACOSTOS, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                NROI = NROI + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTACOSTOS, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                END
            END /* MONTO <> 0 */
        END /* COSTOS = K */
    if (INVEN = 'A') then
        BEGIN
        FOR SELECT MAX(CTAINV), SUM(cast(CANT as double precision) * COSTO)
            FROM COSTO_VENTAS WHERE TIDO_COD = 33 AND COVE_ID = :IDDOC
            GROUP BY CTAINV
            INTO :CTAINVEN, :MONTO
        DO
            BEGIN
            if (MONTO <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTAINVEN, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if ((TIPOCUEN = 'I') or (TIPOCUEN = 'A')) then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, REGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT ARTI_COD, cast(CANT as double precision) * COSTO
                        FROM COSTO_VENTAS WHERE TIDO_COD = 33 AND COVE_ID = :IDDOC AND CTAINV = :CUENTA
                        INTO :ART, :MONTO
                    DO
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                    NROI = NROI + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    END
                END /* MONTO <> 0 */
            END /* FOR */
        END /* INVEN = A */
    if (INVEN = 'K') then
        BEGIN
        SELECT SUM(cast(CANT as double precision) * COSTO)
            FROM COSTO_VENTAS WHERE TIDO_COD = 33 AND COVE_ID = :IDDOC
            INTO :MONTO;
        if (MONTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTAINVEN, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if ((TIPOCUEN = 'I') or (TIPOCUEN = 'A')) then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT ARTI_COD, cast(CANT as double precision) * COSTO
                    FROM COSTO_VENTAS WHERE TIDO_COD = 33 AND COVE_ID = :IDDOC
                    INTO :ART, :MONTO
                DO
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTAINVEN, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                    NROI = NROI + 1;
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAINVEN, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                NROI = NROI + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAINVEN, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                END
            END /* MONTO <> 0 */
        END /* INVEN = K */
    /* recorra las cuentas adicionales */
    FOR SELECT INVC_CUENTA, INVC_BASE, INVC_PORC, INVC_VALOR, INVC_DB
        FROM INTERFAZ_VENTAS_CTAS WHERE INVE_ID = :IDINTER
        INTO :CTADIC, :BASEADIC, :PORCADIC, :VALORADIC, :DBADIC
        DO
        BEGIN
        if (valoradic <> 0) then
            monto = valoradic;
        else
            BEGIN
            if (:BASEADIC = 'SUBTOTAL') then
                VALORADIC = vrsubt;
            if (:BASEADIC = 'DESCUENTO') then
                VALORADIC = VRDTO;
            if (:BASEADIC = 'IVA') then
                VALORADIC = VRIVA;
            if (:BASEADIC = 'ADICIONAL') then
                VALORADIC = VRADIC;
            if (:BASEADIC = 'EXTRA') then
                VALORADIC = VREXTRA;
            if (:BASEADIC = 'TOTAL') then
                VALORADIC = VRTOTAL;
            MONTO = VALORADIC * PORCADIC;
            END
        if (MONTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTADIC, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                if (DBADIC = 'S') then
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                ELSE
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                NROI = NROI + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                if (DBADIC = 'S') then
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                ELSE
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                END
            NROI = NROI + 1;
            END
        END
    if (error > 0) then
        ver = 'S';
    SUSPEND;
    END
   END /* EXISTE LA INTERFAZ */
  ELSE
    BEGIN
    EXECUTE PROCEDURE ERROR (33, :IDDOC, :PREF, 1);
    ERROR = ERROR + 1;
    VER = 'S';
    SUSPEND;
    END
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE DEVOLUCIONES_SIN_CONTABILIDAD(
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    ID INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    ESTADO VARCHAR(20),
    IDI INTEGER,
    IDC INTEGER)
AS
DECLARE VARIABLE VER CHAR(2);
declare variable FECICNT VARCHAR(10);
declare variable FECFCNT VARCHAR(10);
declare variable ERROR INTEGER;
declare variable idref INTEGER;
BEGIN
EXECUTE PROCEDURE fecha_a_conta(FECINI) returning_values (FECICNT);
EXECUTE PROCEDURE fecha_a_conta(FECFIN) returning_values (FECFCNT);
FOR SELECT DEVT_ID, PREF_PRE, DEVT_NUMERO FROM devoluciones_ventas WHERE DEVT_ANULADO = 'N' AND
    DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN
    INTO :ID, :PREF, :NUMERO
DO
  BEGIN
  idref = null;
  SELECT ENCO_IDREF FROM COMPROBANTE_ENCABEZADO WHERE ENCO_TIPOREF = 33 AND ENCO_FECHA >= :FECICNT AND ENCO_FECHA <= :FECFCNT and ENCO_IDREF = :id into :idref;
  if (idref IS NULL) then
  begin
   ESTADO = 'PROCESANDO';
   SUSPEND;
   SELECT MAX(INVE_ID) FROM INTERFAZ_VENTAS WHERE PREF_PRE = :PREF AND TIDO_COD = 33 INTO :IDI;
   EXECUTE PROCEDURE contabil_devolcli (:ID, :IDI) RETURNING_VALUES (:ERROR, :VER, :IDC);
   if (ERROR = 0) then
    BEGIN
    EXECUTE PROCEDURE CONTABILIZA_PENDIENTE (:IDC);
    ESTADO = 'OK';
    END
   ELSE
    ESTADO = 'ERROR';
   suspend;
  End
  END
END


^

SET TERM ; ^

/* 20101210 */
CREATE EXCEPTION ARTICULO_INACTIVO 'El artículo indicado esta inactivo.';

SET TERM ^ ;

CREATE OR ALTER TRIGGER MOVIMIENTO_ARTICULO_BI FOR MOVIMIENTO_ARTICULO
ACTIVE BEFORE INSERT POSITION 0
AS
declare variable LOTE CHAR(1);
declare variable ENSAMBLE CHAR(1);
declare variable IDENS INTEGER;
declare variable PREFENS VARCHAR(4);
declare variable unidad varchar(8);
declare variable DESCR varchar(60);
declare variable CODPR varchar(15);
declare variable DESPR varchar(60);
declare variable UNIPR varchar(8);
declare variable CANTPR double precision;
declare variable FACTOR numeric(18,4);
declare variable COSTO numeric(18,2);
declare variable COSTOTOT numeric(18,2);
declare variable PORCPR numeric(9,4);
declare variable MERMAPR numeric(9,4);
declare variable PESO numeric(18,4);
declare variable PESOPR numeric(18,4);
declare variable ITEM INTEGER;
declare variable IVA NUMERIC(9,4);
declare variable IVAM NUMERIC(18,2);
declare variable CONSUMO NUMERIC(18,2);
declare variable TOTAL float;
declare variable SALDO NUMERIC(18,4);
declare variable ESTADO CHAR(1);
BEGIN
/* INSERTE EL NUEVO LOTE */
if (NEW.mvar_cant IS NULL) then
    NEW.mvar_cant = 0;
SELECT ARTI_EXIST, ESAR_COD
    FROM   ARTICULO
    WHERE  ARTICULO.ARTI_COD = NEW.ARTI_COD
    INTO :LOTE, :ESTADO;
if (ESTADO = 'I') then
    exception ARTICULO_INACTIVO 'El artículo ' || new.arti_cod || ' esta inactivo.';

if (LOTE = 'L') then
    BEGIN
      if ((NEW.mvar_lote IS NULL) or (NEW.mvar_lote = '')) then
        if (new.mvar_entrada = 'S') then
            new.mvar_lote = cast(new.mvar_cons as varchar(15));
        else
            begin
            /* NO HAY LOTE, ENTONCES CALCULELO SEGUN CONFIGURACION */
            EXCEPTION LOTE_NEGATIVO 'No se indicó un lote para el artículo ' || new.arti_cod;
            end
    END
/* ENSAMBLE EL PRODUCTO */
SELECT ARTI_ENSAMBLE, ARTI_UNIDAD, ARTI_DES, ARTI_PESO
    FROM ARTICULO WHERE ARTI_COD = NEW.arti_cod INTO :ensamble, :unidad, :descr, :peso;
if ((NEW.mvar_entrada = 'N') AND (ENSAMBLE = 'S')) then
    BEGIN
    /* verifique si la existecia es insufieciente */
    execute procedure saldo_inventario(new.arti_cod, new.bode_cod, new.mvar_fecha) returning_values (:saldo);
    if (NEW.mvar_cant > :SALDO) then
        BEGIN
        if (SALDO > 0) then
            SALDO = NEW.mvar_cant - :SALDO;
        else
            SALDO = NEW.mvar_cant;
        IDENS = gen_id(id_ensamble, 1);
        EXECUTE PROCEDURE lee_configuracion('INVENTARIO', 'ENSAMBLES', 'PREFIJO PARA ENSAMBLES AUTOMATICOS AL SACAR PRODUCTOS') returning_values (:prefens);
        /* CALCULE EL COSTO TOTAL DEL ENSAMBLE */
        select sum(arpr_porc) from articulos_producto where arti_cod = NEW.arti_cod into :total;
        COSTOTOT = 0;
        FOR SELECT ARPR_CANT, ARPR_UNIDAD, ARPR_COMP, ARPR_PORC, ARPR_MERMA, ARTI_PESO
            FROM articulos_producto P, ARTICULO A
            WHERE P.ARTI_COD = NEW.arti_cod AND A.arti_cod = P.arpr_comp
            INTO :CANTPR, :UNIPR, :CODPR, :PORCPR, :MERMAPR, :PESOPR
            DO
            BEGIN
            EXECUTE PROCEDURE factor_unidad_cant(:codpr, :unipr) returning_values (:factor);
            EXECUTE PROCEDURE costo_promedio_unidad (:codpr, NEW.mvar_fecha, :UNIPR) returning_values (:COSTO);
            IVAM = costo * cantpr * iva / 100;
            if (((cantpr is null) or (cantpr = 0)) AND (porcpr IS NOT NULL) AND (porcpr <> 0)) then
                BEGIN
                /* ES PORCENTUAL AL PESO LA MEZCLA SOBRE EL 1ER ARTICULO */
                CANTPR = :SALDO * PESO;
                CANTPR = CANTPR / TOTAL * porcpr; /* APLICA LA PROPORCION */
                if ((mermapr IS NOT NULL) AND (mermapr <> 0)) then
                    CANTPR = CANTPR * (100 + mermapr) / 100;
                END
            ELSE
                BEGIN
                CANTPR = CANTPR * :SALDO * pesopr * :FACTOR;
                END
            COSTOTOT = COSTOTOT + COSTO * CANTPR;
            END
        if (NEW.mvar_cant <> 0) then
            COSTO = costotot / NEW.mvar_cant;
        else
            COSTO = 0;
        INSERT INTO ENSAMBLES(ENSA_ID, TIDO_COD, PREF_PRE, BODE_COD, ENSA_NUMERO, ENSA_FECHA, ENSA_CONC, ENSA_REFER, ENSA_CANT, ENSA_UNIDAD, ENSA_FACTOR, ENSA_ANULADO, ENSA_TRANSMIT,
            ARTI_COD, ENSA_DESC, ENSA_CODBAR, ENSA_LOTE, ENSA_OBS, TERC_NIT, ENSA_USUARIO, NUMOK, ENSA_COSTO, LOTE_VENCE, ENSA_CODRETAL, ENSA_CANTRETAL, ENSA_OPER, ENSA_MAQUINA, ENSA_PESO, ENSA_BODRETAL, ENSA_TIPOREF, ENSA_IDREF)
            VALUES (:IDENS, 15, :prefens, NEW.bode_cod, '000001', new.mvar_fecha, new.mvar_conc, '', :SALDO, :unidad, 1, 'N', 'N',
            NEW.arti_cod, :descr, NEW.arti_cod, NEW.mvar_lote, NULL, NULL, USER, 'N', :costo, NULL, NULL, 0, null,  NULL, 0, NEW.bode_cod, NEW.mvar_tipodoc, NEW.mvar_idref);
        /* LOS DETALLES DEL ENSAMBLE */
        ITEM = 0;
        FOR SELECT ARPR_CANT, ARPR_UNIDAD, ARPR_COMP, ARTI_DES, TAIV_PORC, ARTI_CONSUMO, ARPR_PORC, ARPR_MERMA, ARTI_PESO
            FROM articulos_producto P, ARTICULO A, TARIFA_IVA T
            WHERE P.ARTI_COD = NEW.arti_cod AND A.arti_cod = P.arpr_comp AND A.taiv_cod = T.taiv_cod
            INTO :CANTPR, :UNIPR, :CODPR, :DESPR, :IVA, :CONSUMO, :PORCPR, :MERMAPR, :PESOPR
            DO
            BEGIN
            ITEM = ITEM + 1;
            EXECUTE PROCEDURE factor_unidad_cant(:codpr, :unipr) returning_values (:factor);
            EXECUTE PROCEDURE costo_promedio_unidad (:codpr, NEW.mvar_fecha, :UNIPR) returning_values (:COSTO);
            IVAM = costo * cantpr * iva / 100;
            if (((cantpr is null) or (cantpr = 0)) AND (porcpr IS NOT NULL) AND (porcpr <> 0)) then
                BEGIN
                /* ES PORCENTUAL AL PESO LA MEZCLA SOBRE EL 1ER ARTICULO */
                CANTPR = :SALDO * PESO;
                CANTPR = CANTPR / TOTAL * porcpr; /* APLICA LA PROPORCION */
                if ((mermapr IS NOT NULL) AND (mermapr <> 0)) then
                    CANTPR = CANTPR * (100 + mermapr) / 100;
/*                CANTPR = CANTPR / pesopr; /* LO LLEVA A LA UNIDAD PRINCIPAL */
                UNIPR = 'GRAMO';
                END
            ELSE
                BEGIN
                CANTPR = CANTPR * :SALDO; /* * pesopr * FACTOR; */
                END
            INSERT INTO ENSAMBLES_DETALLE(ENSA_ID, ESDE_ITEM, ARTI_COD, BODE_COD, ESDE_CANT, ESDE_UNIDAD, ESDE_COSTO, ESDE_LOTE, ESDE_FACTOR, ESDE_IVAPORC, ESDE_IVAMONTO, ESDE_CONSUMO, ESDE_CODBAR, ESDE_ANULADO, ESDE_TRANSMIT, ESDE_DESC, ESDE_TOTAL, ESDE_PESO)
                VALUES (:idens, :ITEM, :codpr,  NEW.bode_cod, :cantpr, :unipr, :costo, NULL, :FACTOR, :IVA, :ivam, :consumo, :codpr, 'N', 'N', :despr, :COSTO * :cantpr, 0);
            END
        END
    END
if (new.mvar_cons is null) then
    NEW.mvar_cons = GEN_ID(ID_MOVARTI,1);
END
^

SET TERM ; ^




/* 20101213 */
/* opcional hacer recibos con f4 */

INSERT INTO CONFIGURACION (CONF_MODULO, CONF_CATEGORIA, CONF_PROPIEDAD, CONF_VALOR, CONF_POSIBLES, CONF_AYUDA) VALUES ('FACTURACION', 'FACTURAS', 'PERMITIR HACER RECIBO DE CAJA DESDE LA FACTURA PARA VENTAS DE CONTADO', 'SI', 'SI,NO', 'SI:Permite usar la tecla F4 para registrar el pago de la factura actual. NO: Se debe usar la opción de pagos de cliente o recibos de caja para cancelar la factura una vez grabada.');
commit work;


/* 20101214 */
/* AL ANULAR EGRESOS DE ANTICIPOS SE QUEDABA EL REGISTRO DEL EGRESO EN EL MOVIMIENTO POR CULPA DE BUSCAR EL NIT DEL DOCUMENTO ORIGEN QUE A ESAS ALTURAS YA NO EXISTE  */

SET TERM ^ ;

CREATE OR ALTER TRIGGER EGRESOS_DETALLE_AU FOR EGRESOS_DETALLE
ACTIVE AFTER UPDATE POSITION 0
AS
declare variable FEC DATE;
declare variable NIT VARCHAR(20);
declare variable CONCEPTO VARCHAR(60);
declare variable PREFIJO VARCHAR(4);
declare variable NUMERO VARCHAR(6);
declare variable OK CHAR(1);
declare variable EGANTI INTEGER;
declare variable RETES CHAR(2);
declare variable SALDO NUMERIC(18,2);
declare variable TRM NUMERIC(18,2);
declare variable NITDOC VARCHAR(20);
BEGIN
NITDOC = NULL;
select PREF_PRE, EGRE_NUMERO, EGRE_FECHA, EGRE_CONC, TERC_NIT, EGRE_TRM from EGRESOS
    where egre_id = new.egre_id into :PREFIJO, :NUMERO, :FEC, :CONCEPTO, :NIT, :TRM;
if ((OLD.EGRE_ID <> 0) and (old.egde_anulado = 'N')) then
    BEGIN
    /* BORRE EL ANTICIPO SI FUE EL QUIEN LO CREO */
    OK = 'N';
    if (OLD.EGDE_TIPODOC = 55) then
        BEGIN
        SELECT EGRE_ID FROM ANTICIPOS_PROVEEDOR WHERE ANPR_ID = OLD.EGDE_IDDOC INTO :EGANTI;
        if (EGANTI = old.egre_id) then
            begin
            OK = 'S';
            UPDATE anticipos_proveedor SET ANPR_ANULADO = 'S' where ANPR_ID = OLD.EGDE_IDDOC;
            end
        END
    if (OK = 'N') then
        BEGIN
        if (exists (select sdcp_idref from saldos_doc_cxpagar where sdcp_tiporef = old.egde_tipodoc and
            sdcp_idref = old.egde_iddoc and sdcp_fecha = :FEC)) then
            begin
            /* Borre el viejo */
            if (old.EGRE_ID <> 0) then
                UPDATE saldos_doc_cxpagar
                    SET SDCP_ABONO = SDCP_ABONO - (old.egde_abono + OLD.egde_dtof + OLD.egde_difcambio),
                    SDCP_ABRTFTE = SDCP_ABRTFTE - old.egde_RTFTE,
                    SDCP_ABRTIVA = SDCP_ABRTIVA - old.egde_RTIVA,
                    SDCP_ABRTICA = SDCP_ABRTICA - old.egde_RTICA
                    WHERE SDCP_TIPOREF = OLD.EGDE_TIPODOC AND SDCP_IDREF = OLD.egde_IDDOC AND SDCP_FECHA = :FEC;
            end
        END
    SELECT TERC_NIT FROM movimiento_proveedor M WHERE M.mvpr_tiporef = OLD.egde_tipodoc AND M.mvpr_idref = OLD.egde_iddoc INTO :NITDOC;
    if (NITDOC IS NULL) then
        NITDOC = NIT;
    if (EXISTS (SELECT MVPR_ID FROM MOVIMIENTO_PROVEEDOR WHERE MVPR_TIPOREF = 62 AND MVPR_IDREF = OLD.EGRE_ID AND TERC_NIT = :NITDOC)) then
        begin
        /* Deshaga el viejo */
        UPDATE movimiento_proveedor
            SET MVPR_MONTO = MVPR_MONTO - (OLD.egde_abono + OLD.egde_dtof + OLD.egde_difcambio),
            MVPR_RTFTE = MVPR_RTFTE - OLD.egde_rtfte,
            MVPR_RTIVA = MVPR_RTIVA - OLD.egde_rtiva,
            MVPR_RTICA = MVPR_RTICA - OLD.egde_rtica
            WHERE MVPR_TIPOREF = 62 AND MVPR_IDREF = OLD.EGRE_ID AND TERC_NIT = :nitdoc;
        end
    END /* OLD.EGRE_ID <> 0 */
if ((NEW.EGRE_ID <> 0) and (NEW.egde_anulado = 'N')) then
    BEGIN
    /* valide que no se pase del saldo */
    execute procedure saldo_doc_cxpagar(new.egde_tipodoc, new.egde_iddoc, '9999/12/31', 0) returning_values(saldo);
    execute procedure lee_configuracion('CXPAGAR', 'SALDOS', 'DESCONTAR RETENCIONES POR CAUSACION') returning_values (RETES);
    if (SALDO = 0) then
      EXCEPTION DOCUMENTO_ABONO_MAYOR 'EL SALDO DEL DOCUMENTO ' || NEW.egde_prefijo || NEW.egde_numero || ' ES INSUFICIENTE.';
    else
      if (SALDO < 0) then
        BEGIN
        if (RETES = 'SI') then
            begin
            if (saldo > (NEW.egde_abono + NEW.egde_dtof + NEW.egde_difcambio)) then
                EXCEPTION DOCUMENTO_ABONO_MAYOR 'EL SALDO DEL DOCUMENTO ' || NEW.egde_prefijo || NEW.egde_numero || ' ES INSUFICIENTE.';
            end
        ELSE
            begin
            if (saldo > (NEW.egde_abono + NEW.egde_rtfte + NEW.egde_rtiva + NEW.egde_rtica + new.egde_dtof + NEW.egde_difcambio)) then
                EXCEPTION DOCUMENTO_ABONO_MAYOR 'EL SALDO DEL DOCUMENTO ' || NEW.egde_prefijo || NEW.egde_numero || ' ES INSUFICIENTE.';
            end
        END
      else
        BEGIN
        if (RETES = 'SI') then
            begin
            if (saldo < (NEW.egde_abono + NEW.egde_dtof + NEW.egde_difcambio)) then
                EXCEPTION DOCUMENTO_ABONO_MAYOR 'EL SALDO DEL DOCUMENTO ' || NEW.egde_prefijo || NEW.egde_numero || ' ES INSUFICIENTE.';
            end
        ELSE
            begin
            if (saldo < (NEW.egde_abono + NEW.egde_rtfte + NEW.egde_rtiva + NEW.egde_rtica + NEW.egde_dtof + NEW.egde_difcambio)) then
                EXCEPTION DOCUMENTO_ABONO_MAYOR 'EL SALDO DEL DOCUMENTO ' || NEW.egde_prefijo || NEW.egde_numero || ' ES INSUFICIENTE.';
            end
        END
    /* AHORA REGISTRE LO NUEVO */
    OK = 'N';
    if (new.EGDE_TIPODOC = 55) then
        BEGIN
        /* BUSQUE SI TIENE EGRE_ID, SI NO LO ACTUALIZA */
        SELECT EGRE_ID FROM ANTICIPOS_PROVEEDOR WHERE ANPR_ID = NEW.EGDE_IDDOC INTO :EGANTI;
        if (EGANTI = 0) then
            BEGIN
            OK = 'S';
            UPDATE ANTICIPOS_PROVEEDOR SET EGRE_ID = NEW.EGRE_ID WHERE ANPR_ID = NEW.EGDE_IDDOC;
            END
        END
    if (OK = 'N') then
        BEGIN
        if (exists (select sdcp_idref from saldos_doc_cxpagar where sdcp_tiporef = new.egde_tipodoc and
            sdcp_idref = new.egde_iddoc and sdcp_fecha = :FEC)) then
            /* actualice el saldo del dia */
            UPDATE saldos_doc_cxpagar
                SET SDCP_ABONO = SDCP_ABONO + (NEW.egde_abono + NEW.egde_dtof + NEW.egde_difcambio),
                SDCP_ABRTFTE = SDCP_ABRTFTE + NEW.egde_RTFTE,
                SDCP_ABRTIVA = SDCP_ABRTIVA + NEW.egde_RTIVA,
                SDCP_ABRTICA = SDCP_ABRTICA + NEW.egde_RTICA,
                SDCP_TRM = :TRM
                WHERE SDCP_TIPOREF = NEW.EGDE_TIPODOC AND SDCP_IDREF = NEW.egde_IDDOC AND SDCP_FECHA = :FEC;
        else
            /* Inserte un nuevo saldo diario */
            INSERT INTO SALDOS_DOC_CXPAGAR (SDCP_TIPOREF, SDCP_IDREF, SDCP_FECHA, TERC_NIT, SDCP_RTEFTE, SDCP_RTIVA, SDCP_RTICA, SDCP_ABONO, SDCP_ABRTFTE, SDCP_ABRTIVA, SDCP_ABRTICA, SDCP_DEBITO, SDCP_MONTO, SDCP_TRM)
                VALUES (NEW.EGDE_TIPODOC, NEW.EGDE_IDDOC, :FEC, :NIT, 0, 0, 0, (NEW.egde_abono + NEW.egde_dtof + NEW.egde_difcambio), NEW.egde_rtfte, NEW.egde_rtiva, NEW.egde_rtica, 'N', 0, :TRM);
        END /* ok = n */
    /* Registre o actualice el registro en movimiento_proveedor */
    SELECT TERC_NIT FROM movimiento_proveedor M WHERE M.mvpr_tiporef = NEW.egde_tipodoc AND M.mvpr_idref = NEW.egde_iddoc INTO :NITDOC;
    if (EXISTS (SELECT MVPR_ID FROM MOVIMIENTO_PROVEEDOR WHERE MVPR_TIPOREF = 62 AND MVPR_IDREF = NEW.EGRE_ID AND TERC_NIT = :NITDOC)) then
        begin
        UPDATE movimiento_proveedor
            SET MVPR_MONTO = MVPR_MONTO + (NEW.egde_abono + NEW.egde_dtof + NEW.egde_difcambio),
                MVPR_RTFTE = MVPR_RTFTE + NEW.egde_rtfte,
                MVPR_RTIVA = MVPR_RTIVA + NEW.egde_rtiva,
                MVPR_RTICA = MVPR_RTICA + NEW.egde_rtica,
                MVPR_TRM = :TRM
            WHERE MVPR_TIPOREF = 62 AND MVPR_IDREF = NEW.EGRE_ID AND TERC_NIT = :NITDOC;
        end
    ELSE
        INSERT INTO MOVIMIENTO_PROVEEDOR (MVPR_ID, TERC_NIT, MVPR_TIPOREF, MVPR_IDREF, MVPR_FECHA, MVPR_VENCE, MVPR_CONC, MVPR_MONTO, MVPR_RTFTE, MVPR_RTIVA, MVPR_RTICA, MVPR_DEBITO, MVPR_ABONO, MVPR_PREFIJO, MVPR_NUMERO, MVPR_TRM)
            VALUES (GEN_ID(ID_MOVPROV, 1), :NITDOC, 62, NEW.EGRE_ID, :FEC, :FEC, :CONCEPTO, (NEW.EGDE_ABONO+NEW.egde_dtof+NEW.egde_difcambio), NEW.EGDE_RTFTE, NEW.EGDE_RTIVA, NEW.EGDE_RTICA, 'N', 'S', :PREFIJO, :NUMERO, :TRM);
    end
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER EGRESOS_DETALLE_AD FOR EGRESOS_DETALLE
ACTIVE AFTER DELETE POSITION 0
AS
declare variable FEC DATE;
declare variable OK CHAR(1);
declare variable EGANTI INTEGER;
declare variable NIT VARCHAR(20);
declare variable NITDOC VARCHAR(20);
BEGIN
if (OLD.EGRE_ID <> 0) then
    BEGIN
    SELECT EGRE_FECHA, TERC_NIT FROM EGRESOS WHERE EGRE_ID = OLD.egre_id INTO :FEC, :NIT;
    OK = 'N';
    if (OLD.EGDE_TIPODOC = 55) then
        BEGIN
        SELECT EGRE_ID FROM ANTICIPOS_PROVEEDOR WHERE ANPR_ID = OLD.EGDE_IDDOC INTO :EGANTI;
        if (EGANTI = old.egre_id) then
            begin
            OK = 'S';
            delete from anticipos_proveedor where egre_id = old.egre_id;
            end
        END
    if (old.egde_anulado = 'N') then
      begin
       if (OK = 'N') then
        UPDATE saldos_doc_cxpagar
            SET SDCP_ABONO = SDCP_ABONO - (old.egde_abono+old.egde_dtof-OLD.egde_difcambio),
            SDCP_ABRTFTE = SDCP_ABRTFTE - old.egde_RTFTE,
            SDCP_ABRTIVA = SDCP_ABRTIVA - old.egde_RTIVA,
            SDCP_ABRTICA = SDCP_ABRTICA - old.egde_RTICA
            WHERE SDCP_TIPOREF = OLD.EGDE_TIPODOC AND SDCP_IDREF = OLD.egde_IDDOC AND SDCP_FECHA = :FEC;
      /* Deshaga el viejo */
      SELECT TERC_NIT FROM movimiento_proveedor M WHERE M.mvpr_tiporef = OLD.egde_tipodoc AND M.mvpr_idref = OLD.egde_iddoc INTO :NITDOC;
      if (NITDOC IS NULL) then
        NITDOC = NIT;
      UPDATE movimiento_proveedor
        SET MVPR_MONTO = MVPR_MONTO - (OLD.egde_abono+old.egde_dtof-OLD.egde_difcambio),
        MVPR_RTFTE = MVPR_RTFTE - OLD.egde_rtfte,
        MVPR_RTIVA = MVPR_RTIVA - OLD.egde_rtiva,
        MVPR_RTICA = MVPR_RTICA - OLD.egde_rtica
        WHERE MVPR_TIPOREF = 62 AND MVPR_IDREF = OLD.EGRE_ID and terc_nit = :nitdoc;
      end
    END
END
^

SET TERM ; ^

UPDATE movimiento_proveedor M SET MVPR_MONTO = 0 WHERE M.mvpr_tiporef = 62 AND NOT EXISTS (SELECT EGRE_ID FROM EGRESOS WHERE EGRE_ID = M.mvpr_idref AND EGRE_ANULADO = 'N');
COMMIT WORK;


/* 20101216 */
SET TERM ^ ;

create or alter procedure REP_PROVEEDOR_X_ARTICULO (
    ARTINI VARCHAR(20),
    ARTFIN VARCHAR(20),
    GRUPINI VARCHAR(2),
    GRUPFIN VARCHAR(2),
    SUBGINI VARCHAR(3),
    SUBGFIN VARCHAR(3),
    MARINI VARCHAR(3),
    MARFIN VARCHAR(3),
    ORDEN CHAR(1),
    INACTIVOS CHAR(1))
returns (
    ARTI_COD VARCHAR(20),
    arti_des VARCHAR(60),
    grup_cod VARCHAR(2),
    grup_nom VARCHAR(60),
    subg_cod VARCHAR(3),
    subg_nom VARCHAR(60),
    marc_cod VARCHAR(3),
    marc_nom VARCHAR(60),
    arti_unidad VARCHAR(8),
    esar_nom VARCHAR(60),
    terc_nit VARCHAR(20),
    terc_nom VARCHAR(60),
    pvar_cod VARCHAR(20),
    pvar_costo NUMERIC(18,2),
    pvar_fecha DATE)
as
declare variable CODINI VARCHAR(15);
declare variable CODFIN VARCHAR(15);
declare variable DESINI VARCHAR(15);
declare variable DESFIN VARCHAR(15);
BEGIN
if (ORDEN = 'C') then
    BEGIN
    CODINI = ARTINI;
    CODFIN = ARTFIN;
    DESINI = '';
    DESFIN = 'zz';
    END
ELSE
    BEGIN
    DESINI = ARTINI;
    DESFIN = ARTFIN;
    CODINI = '';
    CODFIN = 'zz';
    END

FOR select a.arti_cod, arti_des, a.grup_cod, grup_nom, a.subg_cod, a.marc_cod, arti_unidad, esar_nom,
    t.terc_nit, terc_nom, pvar_cod, pvar_costo, pvar_fecha
    from articulo A, grupo g, estado_articulo e, proveedor_articulo p, terceros t
    where a.grup_cod = g.grup_cod and a.esar_cod = e.esar_cod and a.arti_cod = p.arti_cod and p.terc_nit = t.terc_nit and
    A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
    a.grup_cod >= :grupini and a.grup_cod <= :grupfin and ((:INACTIVOS = 'S') or (a.esar_cod <> 'I')) AND
    (((:MARINI = '') AND (:MARFIN = 'zzz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
    (((:SUBGINI = '') AND (:SUBGFIN = 'zzz')) or ((A.subg_cod >= :SUBGINI) AND (A.subg_cod <= :subgfin)))
    INTO :arti_cod, :arti_des, :grup_cod, :grup_nom, :subg_cod, :marc_cod, :arti_unidad, :esar_nom,
    :terc_nit, :terc_nom, :pvar_cod, :pvar_costo, :pvar_fecha
    DO
    BEGIN
    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :marc_cod INTO :marc_nom;
    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :subg_cod AND GRUP_COD = :grup_cod INTO :subg_nom;

    suspend;
    END
end
^

SET TERM ; ^

grant EXECUTE on procedure rep_proveedor_x_articulo  to PUBLIC;


/* 20101216b */
/* NIT Y NOMBRE DEL PROVEEDOR EN COMPRAS POR ARTICULO */

SET TERM ^ ;

CREATE OR ALTER procedure REP_COMPRAS_ARTICULO (
    TIPO integer,
    DETALLE char(1),
    ARTINI varchar(20),
    ARTFIN varchar(20),
    FECINI date,
    FECFIN date,
    ORDEN char(1),
    CEROS char(1))
returns (
    ARTICULO varchar(15),
    DESCRIPCION varchar(60),
    CODGRUPO varchar(2),
    NOMGRUPO varchar(30),
    CODSUBG varchar(3),
    NOMSUBG varchar(30),
    CODMARC varchar(3),
    NOMMARC varchar(30),
    UNIDAD varchar(8),
    CANTIDAD numeric(18,4),
    BASE numeric(18,2),
    IVA numeric(18,2),
    CONSUMO numeric(18,2),
    PREFIJO varchar(4),
    NUMERO varchar(6),
    FECHA date,
    NIT VARCHAR(20),
    NOMBRE VARCHAR(60),
    DTO numeric(9,2))
AS
declare variable CODINI VARCHAR(20);
declare variable CODFIN VARCHAR(20);
declare variable DESINI VARCHAR(20);
declare variable DESFIN VARCHAR(20);
BEGIN
if (ORDEN = 'C') then
    BEGIN
    CODINI = ARTINI;
    CODFIN = ARTFIN;
    DESINI = '';
    DESFIN = 'zz';
    END
ELSE
    BEGIN
    DESINI = ARTINI;
    DESFIN = ARTFIN;
    CODINI = '';
    CODFIN = 'zz';
    END
  FOR SELECT ARTI_COD, ARTI_DES, ARTI_UNIDAD, A.GRUP_COD, A.SUBG_COD, A.MARC_COD
      FROM ARTICULO A WHERE ARTI_COD >= :CODINI AND ARTI_COD <= :CODFIN AND ARTI_DES >= :DESINI AND ARTI_DES <= :DESFIN
      INTO :ARTICULO, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
  DO
    BEGIN
    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
    if (DETALLE = 'N') then
        BEGIN
        if (TIPO = 21) then
            SELECT SUM(FCDE_CANT * FCDE_FACTOR), SUM(FCDE_TOTAL-FCDE_IVAMONTO), SUM(FCDE_IVAMONTO), SUM(FCDE_CONSUMO)
                FROM facturas_compras_detalle D, facturas_compra
                F WHERE F.FACO_ID = D.FACO_ID AND ARTI_COD = :ARTICULO AND FACO_FECHA >= :FECINI AND FACO_FECHA <= :FECFIN AND FACO_ANULADO = 'N'
                INTO :CANTIDAD, :BASE, :IVA, :CONSUMO;
        if (TIPO = 22) then
            SELECT SUM(RPVD_CANT * RPVD_FACTOR), SUM(RPVD_TOTAL-RPVD_IVAMONTO), SUM(RPVD_IVAMONTO), SUM(RPVD_CONSUMO)
                FROM REMISION_PROVEEDOR_DET D, REMISION_PROVEEDOR R
                WHERE R.REPR_ID = D.REPR_ID AND ARTI_COD = :ARTICULO AND REPR_FECHA >= :FECINI AND REPR_FECHA <= :FECFIN AND REPR_ANULADO = 'N'
                INTO :CANTIDAD, :BASE, :IVA, :CONSUMO;
        if (TIPO = 23) then
            SELECT SUM(OCDE_CANT * OCDE_FACTOR), SUM(OCDE_TOTAL-OCDE_IVAMONTO), SUM(OCDE_IVAMONTO), SUM(OCDE_CONSUMO)
                FROM ORDENES_COMPRA_DETALLE D, ORDENES_COMPRA O
                WHERE O.ORDC_ID = D.ORDC_ID AND ARTI_COD = :ARTICULO AND ORDC_FECHA >= :FECINI AND ORDC_FECHA <= :FECFIN AND ORDC_ANULADO = 'N'
                INTO :CANTIDAD, :BASE, :IVA, :CONSUMO;
        if (TIPO = 24) then
            SELECT SUM(DVCD_CANT * DVCD_FACTOR), SUM(DVCD_TOTAL-DVCD_IVAMONTO), SUM(DVCD_IVAMONTO), SUM(DVCD_CONSUMO)
                FROM devoluciones_compras_det D, DEVOLUCIONES_COMPRAS V
                WHERE V.DVCO_ID = D.DVCO_ID AND ARTI_COD = :ARTICULO AND DVCO_FECHA >= :FECINI AND DVCO_FECHA <= :FECFIN AND DVCO_ANULADO = 'N'
                INTO :CANTIDAD, :BASE, :IVA, :CONSUMO;
        if (TIPO = 25) then
            SELECT SUM(CPRD_CANT * CPRD_FACTOR), SUM(CPRD_TOTAL-CPRD_IVAMONTO), SUM(CPRD_IVAMONTO), SUM(CPRD_CONSUMO)
                FROM COTIZACIONES_PROVEEDOR_DET D, COTIZACION_PROVEEDOR C
                WHERE C.COPR_ID = D.COPR_ID AND ARTI_COD = :ARTICULO AND COPR_FECHA >= :FECINI AND COPR_FECHA <= :FECFIN AND COPR_ANULADO = 'N'
                INTO :CANTIDAD, :BASE, :IVA, :CONSUMO;
        if (CANTIDAD IS NULL) then
            CANTIDAD = 0;
        if (BASE IS NULL) then
            BASE = 0;
        if (IVA IS NULL) then
            IVA = 0;
        if (CONSUMO IS NULL) then
            CONSUMO = 0;
        if (CEROS = 'S') then
            SUSPEND;
        ELSE
            if ((BASE <> 0) AND (CANTIDAD <> 0)) then
                SUSPEND;
        END
    ELSE
        BEGIN
        if (TIPO = 21) then
            FOR SELECT PREF_PRE, FACO_NUMERO, FACO_FECHA, TERC_NIT, FCDE_CANT * FCDE_FACTOR, FCDE_PRUNIT / FCDE_FACTOR, FCDE_IVAMONTO, FCDE_CONSUMO, FCDE_DTOPORC
                FROM FACTURAS_COMPRA F, FACTURAS_COMPRAS_DETALLE D
                WHERE F.FACO_ID = D.FACO_ID AND ARTI_COD = :ARTICULO AND FACO_FECHA >= :FECINI AND FACO_FECHA <= :FECFIN AND FACO_ANULADO = 'N' ORDER BY FACO_FECHA, F.FACO_ID, FCDE_ITEM
                INTO :PREFIJO, :NUMERO, :FECHA, :NIT, :CANTIDAD, :BASE, :IVA, :CONSUMO, :DTO
                DO
                BEGIN
                NOMBRE = '';
                SELECT TERC_NOM FROM TERCEROS WHERE TERC_NIT = :NIT INTO :nombre;
                SUSPEND;
                END
        if (TIPO = 22) then
            FOR SELECT PREF_PRE, REPR_NUMERO, REPR_FECHA, TERC_NIT, RPVD_CANT * RPVD_FACTOR, RPVD_PRUNIT / RPVD_FACTOR, RPVD_IVAMONTO, RPVD_CONSUMO, RPVD_DTOPORC
                FROM REMISION_PROVEEDOR R, REMISION_PROVEEDOR_DET D
                WHERE R.REPR_ID = D.REPR_ID AND ARTI_COD = :ARTICULO AND REPR_FECHA >= :FECINI AND REPR_FECHA <= :FECFIN AND REPR_ANULADO = 'N' ORDER BY REPR_FECHA, R.REPR_ID, RPVD_ITEM
                INTO :PREFIJO, :NUMERO, :FECHA, :NIT, :CANTIDAD, :BASE, :IVA, :CONSUMO, :DTO
                DO
                BEGIN
                NOMBRE = '';
                SELECT TERC_NOM FROM TERCEROS WHERE TERC_NIT = :NIT INTO :nombre;
                SUSPEND;
                END
        if (TIPO = 24) then
            FOR SELECT PREF_PRE, DVCO_NUMERO, DVCO_FECHA, TERC_NIT, DVCD_CANT * DVCD_FACTOR, DVCD_PRUNIT / DVCD_FACTOR, DVCD_IVAMONTO, DVCD_CONSUMO, DVCD_DTOPORC
                FROM DEVOLUCIONES_COMPRAS V, DEVOLUCIONES_COMPRAS_DET D
                WHERE V.DVCO_ID = D.DVCO_ID AND ARTI_COD = :ARTICULO AND DVCO_FECHA >= :FECINI AND DVCO_FECHA <= :FECFIN AND DVCO_ANULADO = 'N' ORDER BY DVCO_FECHA, D.DVCO_ID, DVCD_ITEM
                INTO :PREFIJO, :NUMERO, :FECHA, :NIT, :CANTIDAD, :BASE, :IVA, :CONSUMO, :DTO
                DO
                BEGIN
                NOMBRE = '';
                SELECT TERC_NOM FROM TERCEROS WHERE TERC_NIT = :NIT INTO :nombre;
                SUSPEND;
                END
        if (TIPO = 23) then
            FOR SELECT PREF_PRE, ORDC_NUMERO, ORDC_FECHA, TERC_NIT, OCDE_CANT * OCDE_FACTOR, OCDE_PRUNIT / OCDE_FACTOR, OCDE_IVAMONTO, OCDE_CONSUMO, OCDE_DTOPORC
                FROM ORDENES_COMPRA P, ORDENES_COMPRA_DETALLE D
                WHERE P.ORDC_ID = D.ORDC_ID AND ARTI_COD = :ARTICULO AND ORDC_FECHA >= :FECINI AND ORDC_FECHA <= :FECFIN AND ORDC_ANULADO = 'N' ORDER BY ORDC_FECHA, P.ORDC_ID, OCDE_ITEM
                INTO :PREFIJO, :NUMERO, :FECHA, :NIT, :CANTIDAD, :BASE, :IVA, :CONSUMO, :DTO
                DO
                BEGIN
                NOMBRE = '';
                SELECT TERC_NOM FROM TERCEROS WHERE TERC_NIT = :NIT INTO :nombre;
                SUSPEND;
                END
        if (TIPO = 25) then
            FOR SELECT PREF_PRE, C.COPR_NUMERO, COPR_FECHA, TERC_NIT, CPRD_CANT * CPRD_FACTOR, CPRD_PRUNIT / CPRD_FACTOR, CPRD_IVAMONTO, CPRD_CONSUMO, CPRD_DTOPORC
                FROM COTIZACION_PROVEEDOR C, COTIZACIONES_PROVEEDOR_DET D
                WHERE C.COPR_ID = D.COPR_ID AND ARTI_COD = :ARTICULO AND COPR_FECHA >= :FECINI AND COPR_FECHA <= :FECFIN AND COPR_ANULADO = 'N' ORDER BY COPR_FECHA, C.COPR_ID, CPRD_ITEM
                INTO :PREFIJO, :NUMERO, :FECHA, :NIT, :CANTIDAD, :BASE, :IVA, :CONSUMO, :DTO
                DO
                BEGIN
                NOMBRE = '';
                SELECT TERC_NOM FROM TERCEROS WHERE TERC_NIT = :NIT INTO :nombre;
                SUSPEND;
                END
        END
    END
END
^

SET TERM ; ^


/* 20101217 */
/* NO USABA EL PREFIJO DE LA NOTA SI NO EL DE LA TRASNSFERENCIA */
SET TERM ^ ;

CREATE OR ALTER TRIGGER TRASLADOS_AI FOR TRASLADOS
ACTIVE AFTER INSERT POSITION 0
as
declare variable conc varchar(60);
declare variable ID INTEGER;
begin
if ((NEW.tras_id <> 0) AND (NEW.TRAS_ANULADO = 'N')) then
  BEGIN
  /* Inserte el movimiento de la cuenta origen */
  INSERT INTO MOVIMIENTO_BANCO
    (MOBA_ID, CUBA_COD, MOBA_TIPODOC, MOBA_PREF, MOBA_NUMERO, MOBA_FECHA, MOBA_CONCEPTO, MOBA_TOTAL, MOBA_DB, MOBA_IDREF, MOBA_TIPOREF)
    VALUES(GEN_ID(ID_MOVBANCO,1), NEW.cuba_cod, 76, NEW.PRBA_PREF, NEW.tras_numero, NEW.tras_fecha, NEW.tras_concepto, NEW.tras_monto, 'N', new.tras_id, 76);
  /* Inserte el movimiento de la cuenta destino */
  INSERT INTO MOVIMIENTO_BANCO
    (MOBA_ID, CUBA_COD, MOBA_TIPODOC, MOBA_PREF, MOBA_NUMERO, MOBA_FECHA, MOBA_CONCEPTO, MOBA_TOTAL, MOBA_DB, MOBA_IDREF, MOBA_TIPOREF)
    VALUES(GEN_ID(ID_MOVBANCO,1), NEW.tras_ctadest, 76, NEW.PRBA_PREF, NEW.tras_numero, NEW.tras_fecha, NEW.tras_concepto, NEW.tras_monto, 'S', new.tras_id, 76);
  if (new.tras_gmfmonto <> 0) then
      begin
      conc = 'GMF EN TRASLADO No. ' || NEW.PRBA_PREF || NEW.TRAS_NUMERO;
      INSERT INTO MOVIMIENTO_BANCO
        (MOBA_ID, CUBA_COD, MOBA_TIPODOC, MOBA_PREF, MOBA_NUMERO, MOBA_FECHA, MOBA_CONCEPTO, MOBA_TOTAL, MOBA_DB, MOBA_IDREF, MOBA_TIPOREF)
        VALUES(GEN_ID(ID_MOVBANCO,1), NEW.cuba_cod, 79, NEW.PRBA_PREF, NEW.tras_numero, NEW.tras_fecha, :conc, NEW.tras_gmfmonto, 'N', new.tras_id, 76);
      end
  if (new.tras_notamonto <> 0) then
      begin
      conc = 'COMISION EN TRASLADO No. ' || NEW.PRBA_PREF || NEW.TRAS_NUMERO;
      EXECUTE PROCEDURE CAMBIE_ID_NOTA_DB_BANCO returning_values (ID);
      INSERT INTO NOTAS_DEBITO
        (NDBC_ID, CUBA_COD, PRBA_PREF, NDBC_NUMERO, NDBC_FECHA, NDBC_CONCEPTO, NDBC_MONTO, NDBC_IVAPORC, NDBC_IVAMONTO, NDBC_GMFPORC, NDBC_GMFMONTO, NDBC_ANULADO, NDBC_TRANSMIT)
        VALUES(:ID, NEW.cuba_cod, NEW.tras_notapref, NEW.tras_nota, NEW.tras_fecha, :conc, NEW.tras_notamonto, NEW.tras_ivaporc2, new.tras_ivamonto2, 0, 0, 'N', 'N');
      end
  INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD, AUDI_TICO)
    VALUES (USER, 76, NEW.tras_id, 'I', NEW.prba_pref || NEW.tras_numero, NEW.cuba_cod);
  END
end
^

SET TERM ; ^


/* 20101218 */
/* LAS DEVOLUCIONES NO MIRABAN LA HORA DE AUDITORIA */
SET TERM ^ ;

CREATE OR ALTER procedure RESUMEN_VENTAS_TX (
    FECHA date,
    PUNTO integer,
    HORA time)
returns (
    PREFIJO varchar(4),
    VENDEDOR integer,
    ARTICULO varchar(15),
    DESCRIPCION varchar(60),
    UNIDAD varchar(8),
    CANTIDAD numeric(18,4),
    PRECIO numeric(18,4),
    IVA numeric(18,4),
    CONSUMO numeric(18,4))
AS
BEGIN
FOR SELECT MAX(D.ARTI_COD), SUM(FADE_CANT * FADE_FACTOR), SUM((FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO)*FACT_FACTOR), SUM(FADE_IVAMONTO*FACT_FACTOR), SUM(FADE_CONSUMO),
    MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(F.PREF_PRE), max(f.vend_cod)
    FROM FACTURAS_DETALLE D, FACTURAS F, ARTICULO A, auditoria au
    WHERE F.FACT_ID = D.FACT_ID AND D.ARTI_COD = A.arti_cod AND FACT_FECHA = :FECHA AND FACT_ANULADO = 'N' AND F.ptvt_id = :PUNTO and substring(A.arti_cod from 1 FOR 2) <> '.t'
        AND AU.tido_cod = 31 AND AU.audi_oper = 'I' and au.audi_iddoc = f.fact_id AND AU.audi_hora > :HORA+1
    GROUP BY f.vend_cod, D.ARTI_COD
    INTO :ARTICULO, :CANTIDAD, :PRECIO, :IVA, :CONSUMO, :DESCRIPCION, :UNIDAD, :PREFIJO, :vendedor
    DO
    BEGIN
    if (CANTIDAD IS NULL) then
        CANTIDAD = 0;
    if (PRECIO IS NULL) then
        PRECIO = 0;
    if (IVA IS NULL) then
        IVA = 0;
    if (CONSUMO IS NULL) then
        CONSUMO = 0;
    if (cantidad <> 0) then
        begin
        PRECIO = PRECIO / CANTIDAD;
        SUSPEND;
        end
    END /* FOR */
FOR SELECT MAX(D.ARTI_COD), SUM(DVDE_CANT * DVDE_FACTOR), SUM((DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO)*DEVT_FACTOR), SUM(DVDE_IVAMONTO*DEVT_FACTOR), SUM(DVDE_CONSUMO),
    MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(F.PREF_PRE), max(f.vend_cod)
    FROM DEVOLUCIONES_VENTAS_DETALLE D, DEVOLUCIONES_VENTAS F, ARTICULO A, auditoria au
    WHERE F.DEVT_ID = D.DEVT_ID AND D.ARTI_COD = A.arti_cod AND DEVT_FECHA = :FECHA AND DEVT_ANULADO = 'N' AND F.ptvt_id = :PUNTO and substring(a.arti_cod from 1 FOR 2) <> '.t'
        AND AU.tido_cod = 33 AND AU.audi_oper = 'I' and au.audi_iddoc = f.devt_id AND AU.audi_hora > :HORA+1
    GROUP BY f.vend_cod, D.ARTI_COD
    INTO :ARTICULO, :CANTIDAD, :PRECIO, :IVA, :CONSUMO, :DESCRIPCION, :UNIDAD, :PREFIJO, :vendedor
    DO
    BEGIN
    if (CANTIDAD IS NULL) then
        CANTIDAD = 0;
    if (PRECIO IS NULL) then
        PRECIO = 0;
    if (IVA IS NULL) then
        IVA = 0;
    if (CONSUMO IS NULL) then
        CONSUMO = 0;
    if (cantidad <> 0) then
        begin
        PRECIO = PRECIO / CANTIDAD;
        CANTIDAD = CANTIDAD * -1;
        IVA = IVA * -1;
        CONSUMO = CONSUMO * -1;
        SUSPEND;
        end
    END
END
^

SET TERM ; ^


/* 20101220 */
SET TERM ^ ;

create procedure REVERSA_TRASLADO (
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE)
returns (
    CODIGO VARCHAR(20),
    CANT NUMERIC(18, 2),
    UNIDAD VARCHAR(8),
    LOTE VARCHAR(15))
as
declare variable BOD VARCHAR(2);
declare variable SALDO NUMERIC(18, 2);
begin
FOR select arti_cod, tras_cant, tras_unidad, tras_lote, T.tran_boddes from trasferencias_detalle d, trasferencias t
    where t.tran_id = d.tran_id and t.pref_pre = :pref and t.tran_numero = :numero
    INTO :codigo, :cant, :unidad, :lote, :bod
    DO
    BEGIN
    EXECUTE PROCEDURE saldo_inventario(:CODIGO, :bod,  :fecha) returning_values (:SALDO);
    if (CANT > SALDO) then
        CANT = SALDO;
    suspend;
    END
end
^

SET TERM ; ^

grant EXECUTE on PROCEDURE reversa_traslado to PUBLIC;

/* 20101220b */
/* DETALLE POR LOTE SOLO SACABA LOS QUE TENIAN LOTE E IGNORABA LOS ARTICULOS SIN LOTES */
SET TERM ^ ;

CREATE OR ALTER procedure EXISTENCIAS_DESDE_HASTA (
    FECHA date,
    ARTINI varchar(20),
    ARTFIN varchar(20),
    GRPINI varchar(3),
    GRPFIN varchar(3),
    BODINI varchar(2),
    BODFIN varchar(2),
    ORDEN char(1),
    AGRUPA char(1),
    DETALLE char(1),
    RESERVA char(1),
    ENPESO char(1),
    MASIVA char(1),
    SUCURSAL integer)
returns (
    CANT numeric(18,4),
    COSTO numeric(18,2),
    COSTO_LOTE numeric(18,2),
    CODIGO varchar(15),
    NOMBRE varchar(60),
    UNIDAD varchar(8),
    STAND varchar(20),
    CODGRUPO varchar(2),
    NOMGRUPO varchar(30),
    CODSUBG varchar(3),
    NOMSUBG varchar(30),
    CODMARC varchar(3),
    NOMMARC varchar(30),
    CODBOD varchar(2),
    LOTE varchar(15),
    NOMBOD varchar(30),
    COSTOTOT numeric(18,2),
    COSTOIVA numeric(18,2),
    ULTCOSTO numeric(18,2),
    FECHACOSTO date,
    CONSUMO numeric(18,2),
    RESERVADO numeric(18,4),
    ORDENADO numeric(18,4),
    IVA numeric(9,2),
    IVAMONTO numeric(18,2),
    PESOUNIT numeric(18,4),
    PESOTOTAL numeric(18,4),
    PRECIO numeric(18,2),
    CODBAR varchar(20))
AS
declare variable exist char(1);
declare variable codini varchar(20);
declare variable codfin varchar(20);
declare variable desini varchar(20);
declare variable desfin varchar(20);
declare variable ordenc numeric(18,4);
declare variable pedido numeric(18,4);
declare variable ok char(1);
declare variable id integer;
declare variable item integer;
declare variable und varchar(8);
declare variable factor numeric(18,4);
declare variable cant2 numeric(18,4);
declare variable PEDAUTO CHAR(2);
DECLARE VARIABLE LISTA INTEGER;
declare variable FACCOST NUMERIC(18,4);
BEGIN
EXECUTE PROCEDURE lee_configuracion ('FACTURACION','FACTURAS', 'CODIGO DE LA LISTA DE PRECIOS A MOSTRAR EN ARTICULOS') returning_values (:LISTA);
if (ORDEN = 'C') then
    BEGIN
    CODINI = ARTINI;
    CODFIN = ARTFIN;
    DESINI = '';
    DESFIN = 'zz';
    END
ELSE
    BEGIN
    DESINI = ARTINI;
    DESFIN = ARTFIN;
    CODINI = '';
    CODFIN = 'zz';
    END
EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION', 'FACTURAS', 'GENERAR PEDIDO AUTOMATICAMENTE CON LA FACTURA') returning_values (pedauto);
if ((DETALLE = 'B') or (DETALLE = 'L')) then
  BEGIN
  FOR SELECT ARTI_COD, ARTI_DES, ARTI_UNIDAD, ARTI_EXIST, TAIV_PORC, A.GRUP_COD, A.SUBG_COD, A.MARC_COD, BODE_COD, BODE_NOM, ARTI_CONSUMO, ARTI_PESO/1000
      FROM ARTICULO A, BODEGA B, TARIFA_IVA T
      WHERE ARTI_COD >= :CODINI AND ARTI_COD <= :CODFIN AND ARTI_DES >= :DESINI AND ARTI_DES <= :DESFIN AND ESAR_COD <> 'I' AND BODE_COD >= :BODINI AND
      BODE_COD <= :BODFIN AND ((SUCU_ID = :SUCURSAL) or (:SUCURSAL = 0)) AND A.TAIV_COD = T.TAIV_COD
      INTO :CODIGO, :NOMBRE, :UNIDAD, :EXIST, :IVA, :CODGRUPO, :CODSUBG, :CODMARC, :CODBOD, :NOMBOD, :CONSUMO, :pesounit
      DO
        BEGIN
        STAND = '';
        OK = 'N';
        if (AGRUPA = 'G') then
            BEGIN
            if ((CODGRUPO >= GRPINI) AND (CODGRUPO <= GRPFIN)) then
                OK = 'S';
            end
        ELSE
            if (AGRUPA = 'M') then
                BEGIN
                if ((CODMARC >= GRPINI) AND (CODMARC <= GRPFIN)) then
                    OK = 'S';
                END
        if (OK = 'S') then
            BEGIN
            NOMGRUPO = '';
            NOMMARC = '';
            NOMSUBG = '';
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            CODBAR = NULL;
            SELECT FIRST 1 COBA_COD FROM BARRAS_ARTICULO
                WHERE ARTI_COD = :codigo AND COBA_UNIDAD = :unidad ORDER BY STRLEN(COBA_COD) INTO :codbar;
            if (CODBAR IS NULL) then
                CODBAR = CODIGO;
            if (EXIST <> 'N') then
                BEGIN
                SELECT STAND_COD FROM STANDS WHERE ARTI_COD = :CODIGO AND STAND_BODEGA = :CODBOD INTO :STAND;
                EXECUTE PROCEDURE costo_promedio_y_ultimo_unidad(CODIGO, FECHA-1, UNIDAD) returning_values (COSTO, ULTCOSTO);
                /* EL FACTOR */
                FACCOST = 1;
                SELECT FIRST 1 FAIN_FACTOR FROM factor_inventario WHERE FAIN_FECINI <= :FECHA AND FAIN_FECFIN >= :FECHA INTO :FACCOST;
                ULTCOSTO = ULTCOSTO * FACCOST;
                COSTO = COSTO * FACCOST;

                SELECT FIRST 1 MVAR_FECHA FROM MOVIMIENTO_ARTICULO WHERE ARTI_COD = :CODIGO AND MVAR_ENTRADA = 'S' AND MVAR_FECHA <= :FECHA
                    ORDER BY ARTI_COD DESC, MVAR_FECHA DESC INTO :FECHACOSTO;
                
                if (CONSUMO <> 0) then
                    EXECUTE PROCEDURE CONSUMO_HISTORICO (:CODIGO, :fecha) returning_values (:CONSUMO);
                if (RESERVA = 'S') then
                    BEGIN
                    SELECT SUM(ORID_ENTREGAR)
                        FROM ORDENINVENTARIO_DETALLE OD, ordenes_inventario O
                        WHERE O.ORIN_ID = OD.ORIN_ID AND ARTI_COD = :CODIGO AND ORIN_FECHA <= :FECHA AND ORIN_FECLLEGA >= :FECHA AND ORID_ANULADO = 'N' AND OD.BODE_COD = :CODBOD
                        INTO :ORDENADO;
                    if (ORDENADO IS NULL) then
                        ORDENADO = 0;
                    ORDENC = 0;
                    FOR SELECT O.ORDC_ID, OCDE_ITEM, OCDE_CANT * OCDE_FACTOR
                        FROM ORDENES_COMPRA O, ORDENES_COMPRA_DETALLE OD
                        WHERE O.ORDC_ID = OD.ORDC_ID AND OD.ARTI_COD = :CODIGO AND ORDC_VENCE >= :FECHA AND ORDC_FECHA <= :FECHA AND OCDE_ANULADO = 'N' AND OD.BODE_COD = :CODBOD
                        INTO :ID, :ITEM, :CANT2
                        do
                        BEGIN
                        EXECUTE PROCEDURE FALTANTE(23, 21, ID, ITEM) returning_values (PEDIDO, UND, FACTOR);
                        if (PEDIDO * FACTOR = CANT2) then /* SI NO SE HA FACTURADO MIRE A VER SI SE REMISIONO */
                            EXECUTE PROCEDURE FALTANTE(23, 22, ID, ITEM) returning_values (PEDIDO, UND, FACTOR);
                        if (PEDIDO IS NULL) then
                            PEDIDO = 0;
                        ORDENC = ORDENC + PEDIDO * FACTOR;
                        END
                    ORDENADO = ORDENADO + ORDENC;
                    SELECT SUM(RSDE_LIBERAR)
                        FROM RESERVAS_DETALLE RD, RESERVAS R
                        WHERE R.RESE_ID = RD.RESE_ID AND ARTI_COD = :CODIGO AND RESE_FECHA <= :FECHA AND RESE_VENCE >= :FECHA AND RD.BODE_COD = :CODBOD AND RSDE_ANULADO = 'N'
                        INTO :RESERVADO;
                    if (RESERVADO IS NULL) then
                        RESERVADO = 0;
                    PEDIDO = 0;
                    FOR SELECT P.PEDI_ID, PEDE_ITEM, PEDE_CANT * PEDE_FACTOR
                        FROM PEDIDOS P, PEDIDOS_DETALLE PD
                        WHERE P.PEDI_ID = PD.PEDI_ID AND PD.ARTI_COD = :CODIGO AND PEDI_VENCE >= :FECHA AND PEDI_FECHA <= :FECHA AND PEDE_ANULADO = 'N' AND BODE_COD = :CODBOD
                        INTO :ID, :ITEM, :CANT2
                        do
                        BEGIN
                        EXECUTE PROCEDURE FALTANTE(34, 31, ID, ITEM) returning_values (ORDENC, UND, FACTOR);
                        if ((ORDENC * FACTOR = CANT2) or (PEDAUTO = 'SI')) then /* SI NO SE HA FACTURADO MIRE A VER SI SE REMISIONO */
                            EXECUTE PROCEDURE FALTANTE(34, 32, ID, ITEM) returning_values (ORDENC, UND, FACTOR);
                        if (ORDENC IS NULL) then
                            ORDENC = 0;
                        PEDIDO = PEDIDO + ORDENC * FACTOR;
                        END
                    RESERVADO = RESERVADO + PEDIDO;
                    END
                ELSE
                    BEGIN
                    RESERVADO = 0;
                    ORDENADO = 0;
                    END
                if (LISTA > 0) then
                    SELECT prar_fijo FROM precios_articulo WHERE arti_cod = :CODIGO and lipr_cod = :LISTA INTO :PRECIO;
                if ((DETALLE = 'L') AND (EXIST = 'L')) then
                    BEGIN
                    FOR SELECT L.lote_nro, L.lote_nro||' - '||L.lote_vence, L.lote_saldo, l.lote_costo
                        FROM LOTES L WHERE ARTI_COD = :codigo AND BODE_COD = :codbod
                        INTO :LOTE, :NOMBOD, :cant, :costo_lote
                        DO
                        BEGIN
                        COSTOTOT = :CANT * :COSTO;
                        IVAMONTO = COSTOTOT /100 * IVA;
                        COSTOIVA = COSTOTOT;
                        if (MASIVA = 'S') then
                            BEGIN
                            COSTOIVA = COSTOTOT + IVAMONTO;
                            COSTO = COSTO * (100 + :IVA) / 100 + :CONSUMO;
                            END
                        CONSUMO = CONSUMO * CANT;
                        COSTOIVA = COSTOIVA + CONSUMO;
                        if (ENPESO = 'S') then
                            BEGIN
                            if (pesounit IS NULL) then
                                pesounit = 0;
                            if (PESOUNIT <> 0) then
                                BEGIN
                                pesototal = PESOUNIT * cant;
                                SUSPEND;
                                END
                            END
                        ELSE
                            SUSPEND;
                        END
                    END
                else
                    BEGIN
                    EXECUTE PROCEDURE SALDO_INICIAL_INVENTARIO(CODIGO, FECHA, :CODBOD) returning_values (CANT);
                    COSTOTOT = :CANT * :COSTO;
                    IVAMONTO = COSTOTOT /100 * IVA;
                    COSTOIVA = COSTOTOT;
                    if (MASIVA = 'S') then
                        BEGIN
                        COSTOIVA = COSTOTOT + IVAMONTO;
                        COSTO = COSTO * (100 + :IVA) / 100 + :CONSUMO;
                        END
                    CONSUMO = CONSUMO * CANT;
                    COSTOIVA = COSTOIVA + CONSUMO;
                    if (ENPESO = 'S') then
                        BEGIN
                        if (pesounit IS NULL) then
                            pesounit = 0;
                        if (PESOUNIT <> 0) then
                            BEGIN
                            pesototal = PESOUNIT * cant;
                            SUSPEND;
                            END
                        END
                    ELSE
                        SUSPEND;
                    END
                END
            END
        END
  END

if (DETALLE = 'N') then
  BEGIN
  FOR SELECT ARTI_COD, ARTI_DES, ARTI_UNIDAD, ARTI_EXIST, TAIV_PORC, A.GRUP_COD, A.SUBG_COD, A.MARC_COD, ARTI_CONSUMO, ARTI_PESO/1000
      FROM ARTICULO A, TARIFA_IVA T
      WHERE ARTI_COD >= :CODINI AND ARTI_COD <= :CODFIN AND ARTI_DES >= :DESINI AND ARTI_DES <= :DESFIN AND ESAR_COD <> 'I' AND A.TAIV_COD = T.TAIV_COD
      INTO :CODIGO, :NOMBRE, :UNIDAD, :EXIST, :IVA, :CODGRUPO, :CODSUBG, :CODMARC, :CONSUMO, :pesounit
      DO
        BEGIN
        OK = 'N';
        if (AGRUPA = 'G') then
            BEGIN
            if ((GRPINI = '0') AND (GRPFIN = 'zz')) then
                OK = 'S';
            else
                if ((CODGRUPO >= GRPINI) AND (CODGRUPO <= GRPFIN)) then
                    OK = 'S';
            end
        ELSE
            if (AGRUPA = 'M') then
                BEGIN
                if ((GRPINI = '0') AND (GRPFIN = 'zzz')) then
                    OK = 'S';
                else
                    if ((CODMARC >= GRPINI) AND (CODMARC <= GRPFIN)) then
                        OK = 'S';
                END
        if (OK = 'S') then
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            CODBAR = NULL;
            SELECT MAX(COBA_COD) FROM BARRAS_ARTICULO WHERE ARTI_COD = :codigo AND COBA_UNIDAD = :unidad INTO :codbar;
            if (CODBAR IS NULL) then
                CODBAR = CODIGO;

            if (EXIST <> 'N') then
                BEGIN
                EXECUTE PROCEDURE SALDO_INICIAL_TOTAL_INV(CODIGO, FECHA) returning_values (CANT);
                EXECUTE PROCEDURE costo_promedio_y_ultimo_unidad(CODIGO, FECHA-1, UNIDAD) returning_values (COSTO, ULTCOSTO);
                /* EL FACTOR */
                FACCOST = 1;
                SELECT FIRST 1 FAIN_FACTOR FROM factor_inventario WHERE FAIN_FECINI <= :FECHA AND FAIN_FECFIN >= :FECHA INTO :FACCOST;
                ULTCOSTO = ULTCOSTO * FACCOST;
                COSTO = COSTO * FACCOST;

                SELECT FIRST 1 MVAR_FECHA FROM MOVIMIENTO_ARTICULO WHERE ARTI_COD = :CODIGO AND MVAR_ENTRADA = 'S' AND MVAR_FECHA <= :FECHA
                    ORDER BY ARTI_COD DESC, MVAR_FECHA DESC INTO :FECHACOSTO;
                COSTOTOT = :CANT * :COSTO;
                IVAMONTO = COSTOTOT /100 * IVA;
                COSTOIVA = COSTOTOT;
                if (CONSUMO <> 0) then
                    EXECUTE PROCEDURE CONSUMO_HISTORICO (:CODIGO, :fecha) returning_values (:CONSUMO);
                if (MASIVA = 'S') then
                    BEGIN
                    COSTOIVA = COSTOTOT + IVAMONTO;
                    COSTO = COSTO * (100 + :IVA) / 100 + :CONSUMO;
                    END
                CONSUMO = CONSUMO * CANT;
                COSTOIVA = COSTOIVA + CONSUMO;
                if (RESERVA = 'S') then
                    BEGIN
                    SELECT SUM(ORID_ENTREGAR)
                        FROM ORDENINVENTARIO_DETALLE OD, ordenes_inventario O
                        WHERE O.ORIN_ID = OD.ORIN_ID AND ARTI_COD = :CODIGO AND ORIN_FECHA <= :FECHA AND ORIN_FECLLEGA >= :FECHA AND ORID_ANULADO = 'N'
                        INTO :ORDENADO;
                        if (ORDENADO IS NULL) then
                            ORDENADO = 0;
                    ORDENC = 0;
                    FOR SELECT O.ORDC_ID, OCDE_ITEM, OCDE_CANT * OCDE_FACTOR
                        FROM ORDENES_COMPRA O, ORDENES_COMPRA_DETALLE OD
                        WHERE O.ORDC_ID = OD.ORDC_ID AND OD.ARTI_COD = :CODIGO AND ORDC_VENCE >= :FECHA AND ORDC_FECHA <= :FECHA AND OCDE_ANULADO = 'N'
                        INTO :ID, :ITEM, :CANT2
                        do
                        BEGIN
                        EXECUTE PROCEDURE FALTANTE(23, 21, ID, ITEM) returning_values (PEDIDO, UND, FACTOR);
                        if (PEDIDO * FACTOR = CANT2) then /* SI NO SE HA FACTURADO MIRE A VER SI SE REMISIONO */
                            EXECUTE PROCEDURE FALTANTE(23, 22, ID, ITEM) returning_values (PEDIDO, UND, FACTOR);
                        if (PEDIDO IS NULL) then
                            PEDIDO = 0;
                        ORDENC = ORDENC + PEDIDO * FACTOR;
                        END
                    ORDENADO = ORDENADO + ORDENC;
                    SELECT SUM(RSDE_LIBERAR)
                        FROM RESERVAS_DETALLE RD, RESERVAS R
                        WHERE R.RESE_ID = RD.RESE_ID AND ARTI_COD = :CODIGO AND RESE_FECHA <= :FECHA AND RESE_VENCE >= :FECHA AND RSDE_ANULADO = 'N'
                        INTO :RESERVADO;
                    if (RESERVADO IS NULL) then
                        RESERVADO = 0;
                    PEDIDO = 0;
                    FOR SELECT P.PEDI_ID, PEDE_ITEM, PEDE_CANT * PEDE_FACTOR
                        FROM PEDIDOS P, PEDIDOS_DETALLE PD, PUNTO_VENTA PT
                        WHERE P.PEDI_ID = PD.PEDI_ID AND PD.ARTI_COD = :CODIGO AND PT.ptvt_id = P.PTVT_ID AND PEDI_VENCE >= :FECHA AND PEDI_FECHA <= :FECHA AND PEDE_ANULADO = 'N'
                        INTO :ID, :ITEM, :CANT2
                        do
                        BEGIN
                        EXECUTE PROCEDURE FALTANTE(34, 31, ID, ITEM) returning_values (ORDENC, UND, FACTOR);
                        if ((ORDENC * FACTOR = CANT2) or (PEDAUTO = 'SI')) then /* SI NO SE HA FACTURADO MIRE A VER SI SE REMISIONO */
                            EXECUTE PROCEDURE FALTANTE(34, 32, ID, ITEM) returning_values (ORDENC, UND, FACTOR);
                        if (ORDENC IS NULL) then
                            ORDENC = 0;
                        PEDIDO = PEDIDO + ORDENC * FACTOR;
                        END
                    if (PEDIDO IS NULL) then
                        PEDIDO = 0;
                    RESERVADO = RESERVADO + PEDIDO;
                    END
                ELSE
                    BEGIN
                    RESERVADO = 0;
                    ORDENADO = 0;
                    END
                if (LISTA > 0) then
                    SELECT prar_fijo FROM precios_articulo WHERE arti_cod = :CODIGO and lipr_cod = :LISTA INTO :PRECIO;

                if (ENPESO = 'S') then
                    BEGIN
                    if (pesounit IS NULL) then
                        pesounit = 0;
                    if (PESOUNIT <> 0) then
                        BEGIN
                        pesototal = PESOUNIT * cant;
                        SUSPEND;
                        END
                    END
                ELSE
                    SUSPEND;
                END
            END
        END
  END
END
^

SET TERM ; ^


/* 20101220c */
SET TERM ^ ;

CREATE OR ALTER procedure CONSOLIDE_AJUSTES (
    FECHA date,
    PREF varchar(4),
    BOD varchar(2))
returns (
    ID integer)
AS
declare variable ITEM INTEGER;
declare variable CODIGO VARCHAR(20);
declare variable CANT NUMERIC(18,4);
declare variable LOTE VARCHAR(15);
declare variable UNIDAD VARCHAR(8);
declare variable CANTANT NUMERIC(18,4);
declare variable DES VARCHAR(60);
declare variable COSTO NUMERIC(18,2);
begin
ID = 0;
if (exists (SELECT AJUS_ID FROM AJUSTES WHERE AJUS_FECHA = :FECHA AND AJUS_NOAJUSTAR = 'S' AND PREF_PRE = :PREF AND BODE_COD = :BOD)) then
    BEGIN
    id = gen_id(id_ajusteinv, 1);
    INSERT INTO AJUSTES (AJUS_ID, TIDO_COD, PREF_PRE, BODE_COD, AJUS_NUMERO, AJUS_FECHA, AJUS_CONC,
        AJUS_ANULADO, AJUS_TRANSMIT, AJUS_OBS, AJUS_USUARIO, NUMOK, AJUS_NOAJUSTAR, AJUS_STAND)
        VALUES (:id, 14, :PREF, :BOD, '000001', :FECHA, 'AJUSTE CONSOLIDADO ' || :FECHA, 'N', 'N', NULL, USER, 'N', 'S', NULL);
    ITEM = 0;
    FOR SELECT MAX(ARTI_COD), MAX(AJUS_LOTE), MAX(AJUS_EXANT * AJUS_FACTOR), SUM(AJUS_EXNUE * AJUS_FACTOR)
        FROM AJUSTES A, ajustes_detalle D WHERE A.ajus_id = D.ajus_id AND A.ajus_fecha = :FECHA AND A.ajus_noajustar = 'S'
        AND D.BODE_COD = :BOD GROUP BY ARTI_COD, AJUS_LOTE
        INTO :CODIGO, :LOTE, :CANTANT, :CANT
        DO
        BEGIN
        /* INSERTE EL CONSOLIDADO */
        ITEM = ITEM + 1;
        SELECT ARTI_DES, ARTI_UNIDAD FROM ARTICULO WHERE ARTI_COD = :CODIGO INTO :DES, :UNIDAD;
        EXECUTE PROCEDURE costo_promedio(:CODIGO, :FECHA) returning_values (:COSTO);
        INSERT INTO AJUSTES_DETALLE (AJUS_ID, AJUS_ITEM, ARTI_COD, BODE_COD, AJUS_EXANT, AJUS_EXNUE, AJUS_UNIDAD,
            AJUS_LOTE, AJUS_FACTOR, AJUS_CODBAR, AJDE_ANULADO, AJDE_DESC, AJDE_OBS, AJDE_TRANSMIT, AJDE_COSTO)
            VALUES (:ID, :ITEM, :CODIGO, :BOD, :CANTANT, :CANT, :UNIDAD, :LOTE, 1, :CODIGO, 'N', :DES, NULL, 'N', :COSTO);
        END
    /* ANULE LOS AJUSTES ANTERIORES */
    update AJUSTES set ajus_anulado = 'S' WHERE AJUS_FECHA = :FECHA AND AJUS_NOAJUSTAR = 'S' AND PREF_PRE = :PREF AND BODE_COD = :BOD AND AJUS_ID <> :ID;
    END
suspend;
end
^

SET TERM ; ^

GRANT EXECUTE ON PROCEDURE consolide_ajustes TO PUBLIC;


/* 20101220D */
/* TARIFA DE IVA AL EXPORTAR KARDEX */
SET TERM ^ ;

CREATE OR ALTER procedure REP_KARDEX_ARTICULO (
    DETALLE char(1),
    FECINI date,
    FECFIN date,
    ARTINI varchar(20),
    ARTFIN varchar(20),
    GRPINI varchar(2),
    GRPFIN varchar(2),
    ORDEN char(1),
    BODEGA varchar(2))
returns (
    CODIGO varchar(15),
    NOMBRE varchar(60),
    UNIDAD varchar(8),
    CODGRUPO varchar(2),
    NOMGRUPO varchar(30),
    CODSUBG varchar(3),
    NOMSUBG varchar(30),
    CODMARC varchar(3),
    NOMMARC varchar(30),
    CODBOD varchar(2),
    SALDOINI numeric(18,4),
    COSTOINI numeric(18,2),
    ENTRADAS numeric(18,4),
    COSTOENT numeric(18,2),
    SALIDAS numeric(18,4),
    COSTOSAL numeric(18,2),
    SALDOFIN numeric(18,4),
    COSTOFIN numeric(18,2),
    TIPODOC varchar(8),
    PREFIJO varchar(4),
    NUMERO varchar(6),
    FECHA date,
    CONCEPTO varchar(60),
    NIT varchar(20),
    CONS integer,
    CANFINAL numeric(18,4),
    COSFINAL numeric(18,2),
    IVAPORC NUMERIC(9,2))
AS
DECLARE VARIABLE ENTRADA CHAR(1);
DECLARE VARIABLE CANT NUMERIC(18,4);
DECLARE VARIABLE COSTO NUMERIC(18,2);
DECLARE VARIABLE CODINI VARCHAR(20);
DECLARE VARIABLE CODFIN VARCHAR(20);
DECLARE VARIABLE DESINI VARCHAR(20);
DECLARE VARIABLE DESFIN VARCHAR(20);
BEGIN
if (ORDEN = 'C') then
    BEGIN
    CODINI = ARTINI;
    CODFIN = ARTFIN;
    DESINI = '';
    DESFIN = 'zz';
    END
ELSE
    BEGIN
    DESINI = ARTINI;
    DESFIN = ARTFIN;
    CODINI = '';
    CODFIN = 'zz';
    END
  FOR
    SELECT ARTI_COD, ARTI_DES, ARTI_UNIDAD, A.GRUP_COD, A.SUBG_COD, A.MARC_COD, t.taiv_porc
      FROM ARTICULO A, tarifa_iva t
      WHERE ARTI_COD >= :CODINI AND ARTI_COD <= :CODFIN AND A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :GRPFIN AND ARTI_DES >= :DESINI AND ARTI_DES <= :DESFIN AND A.ESAR_COD <> 'I'
      INTO :CODIGO, :NOMBRE, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :ivaporc
      DO
        BEGIN
        NOMMARC = '';
        NOMSUBG = '';
        SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
        SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
        SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
        if (BODEGA = '') then
            BEGIN
            EXECUTE PROCEDURE SALDO_INICIAL_TOTAL_INV(CODIGO, FECINI) returning_values (:SALDOINI);
            EXECUTE PROCEDURE VALOR_INICIAL_INVENTARIO(CODIGO, FECINI) returning_values (COSTOINI);
            END
        ELSE
            BEGIN
            EXECUTE PROCEDURE SALDO_INICIAL_INVENTARIO(CODIGO, FECINI, :BODEGA) returning_values (SALDOINI);
            EXECUTE PROCEDURE COSTO_PROMEDIO(CODIGO, FECINI-1) returning_values (COSTOINI);
            COSTOINI = COSTOINI * saldoini;
            END
        if (DETALLE = 'N') then
            BEGIN
            /* SUME LAS ENTRADAS */
            if (BODEGA = '') then
              SELECT SUM(COST_ENTC), SUM(COST_ENTP), SUM(COST_SALC), SUM(COST_SALP) FROM COSTOS
                WHERE (COST_FECHA >= :FECINI) AND (COST_FECHA <= :FECFIN) AND (ARTI_COD = :codigo)
                INTO :ENTRADAS, :COSTOENT, :SALIDAS, :COSTOSAL;
            ELSE
              SELECT SUM(COST_ENTC), SUM(COST_ENTP), SUM(COST_SALC), SUM(COST_SALP)
                FROM COSTOS C, MOVIMIENTO_ARTICULO M
                WHERE (COST_FECHA >= :FECINI) AND (COST_FECHA <= :FECFIN) AND (C.ARTI_COD = :codigo) AND C.cost_idmov = M.mvar_cons AND BODE_COD = :BODEGA
                INTO :ENTRADAS, :COSTOENT, :SALIDAS, :COSTOSAL;

            if (ENTRADAS IS NULL) then
              ENTRADAS = 0;
            if (COSTOENT IS NULL) then
              COSTOENT = 0;
            if (SALIDAS IS NULL) then
              SALIDAS = 0;
            if (COSTOSAL IS NULL) then
              COSTOSAL = 0;
            SALDOFIN = SALDOINI + ENTRADAS - SALIDAS;
            COSTOFIN = COSTOINI + COSTOENT - COSTOSAL;
            if (BODEGA = '') then
                BEGIN
                EXECUTE PROCEDURE SALDO_INICIAL_TOTAL_INV(CODIGO, fecfin+1) returning_values (canfinal);
                EXECUTE PROCEDURE VALOR_INICIAL_INVENTARIO(CODIGO, FECFIN+1) returning_values (cosfinal);
                END
            ELSE
                BEGIN
                EXECUTE PROCEDURE SALDO_INICIAL_INVENTARIO(CODIGO, FECFIN+1, :BODEGA) returning_values (CANFINAL);
                EXECUTE PROCEDURE COSTO_PROMEDIO(CODIGO, FECFIN+1) returning_values (COSFINAL);
                COSFINAL = COSFINAL * CANFINAL;
                END
            SUSPEND;
            END
        ELSE
            BEGIN
            SALDOFIN = SALDOINI;
            COSTOFIN = COSTOINI;
            COSTOENT = 0;
            COSTOSAL = 0;
            FOR SELECT MVAR_TIPODOC, MVAR_ENTRADA, MVAR_PREF, MVAR_NUMERO, MVAR_CANT, MVAR_COSTO, MVAR_CONC, MVAR_FECHA, M.TERC_NIT, MVAR_CONS, BODE_COD, COST_SALDOP, COST_SALDOC
                FROM MOVIMIENTO_ARTICULO M, COSTOS C
                WHERE M.arti_cod = C.arti_cod AND M.mvar_cons = C.cost_idmov AND (m.ARTI_COD = :CODIGO) AND (MVAR_FECHA >= :FECINI) AND (MVAR_FECHA <= :FECFIN) AND (MVAR_TIPODOC <> 13)
                ORDER BY M.ARTI_COD, MVAR_FECHA, MVAR_CONS
                INTO :TIPODOC, :ENTRADA, :PREFIJO, :NUMERO, :ENTRADAS, :COSTOENT, :CONCEPTO, :FECHA, :NIT, :CONS, :CODBOD, :costo, :cant
                DO
                    BEGIN
                    SELECT TIDO_NOMCORTO FROM TIPO_DOCUMENTO WHERE TIDO_COD = :TIPODOC INTO :TIPODOC;
                    if (ENTRADA = 'S') then
                        BEGIN
                        SALIDAS = 0;
                        SALDOFIN = SALDOFIN + ENTRADAS;
                        COSTOFIN = COSTOFIN + (ENTRADAS * COSTOENT);
                        if (CANT > 0) then
                            COSTOSAL = COSTO / CANT;
                        else
                            COSTOSAL = 0;
                        end
                    ELSE
                        BEGIN
                        SALIDAS = ENTRADAS;
                        ENTRADAS = 0;
                        if (CANT > 0) then
                            COSTOSAL = COSTO / CANT;
                        else
                            COSTOSAL = 0;
                        SALDOFIN = SALDOFIN - SALIDAS;
                        COSTOFIN = COSTOFIN - (SALIDAS * costosal);
                        END
                    SUSPEND;
                    END
            END
        END
END
^

SET TERM ; ^


/* 20101220E */
/* SALDO POR LOTE A LA FECHA Y NO TOTAL */
SET TERM ^ ;

create procedure SALDO_LOTE_FECHA (
    ARTICULO varchar(15),
    BODEGA varchar(2),
    LOTE varchar(15),
    FECHA DATE)
returns (
    SALDO numeric(18,4))
as
declare variable SALIDAS numeric(18,4);
begin
SELECT LOTE_CANT FROM LOTES WHERE (ARTI_COD = :ARTICULO) AND (BODE_COD = :BODEGA) AND (LOTE_NRO = :LOTE) INTO :SALDO;
if (saldo is null) then
    saldo = 0;
/* RESTE LOS MOVIMIENTOS DE FECHA ANTERIOR O IGUAL A LA DE HOY */
SELECT SUM(EXLO_SAL) FROM EXISTENCIA_LOTE WHERE (ARTI_COD = :ARTICULO) AND (BODE_COD = :BODEGA) AND (LOTE_NRO = :LOTE)
    AND EXLO_FECHA <= :FECHA INTO :SALIDAS;
if (salidas is null) then
    salidas = 0;
SALDO = SALDO - SALIDAS;
SUSPEND;
end
^

SET TERM ; ^

GRANT EXECUTE ON PROCEDURE SALDO_LOTE_FECHA TO PUBLIC;


/* 20101221 */
/* EL SALDO DEL EFECTIVO ERA AL INICIO DEL DIA, TOME EL DIA SIGUIENTE */
SET TERM ^ ;

CREATE OR ALTER procedure REP_DOCUMENTOS_ENCAJA (
    CAJAINI integer,
    CAJAFIN integer,
    FECHA date)
returns (
    CAJAID integer,
    CAJANOM varchar(60),
    RESPONSABLE varchar(60),
    TIPODOC varchar(8),
    NUMDOC varchar(10),
    BANCO varchar(2),
    CUENTA varchar(20),
    NUMERO varchar(20),
    FECDOC date,
    MONTO numeric(18,2),
    FORPAGO varchar(30),
    NOMTERC varchar(60))
AS
declare variable TIPOENT INTEGER;
declare variable IDDOC INTEGER;
declare variable TIPOSAL INTEGER;
declare variable IDSAL INTEGER;
declare variable OK CHAR(1);
declare variable FECREC DATE;
BEGIN
FOR SELECT CAJA_ID, CAJA_NOMBRE, CAJA_RESP FROM CAJAS
    WHERE CAJA_ID >= :CAJAINI AND CAJA_ID <= :CAJAFIN AND CAJA_ACTIVA = 'S'
    ORDER BY CAJA_ID
    INTO :CAJAID, :CAJANOM, :RESPONSABLE
    DO
    BEGIN
    /* PRIMERO EL SALDO DE EFECTIVO */
    FORPAGO = 'EFECTIVO';
    TIPODOC = '';
    NUMDOC = '';
    BANCO = '';
    CUENTA = '';
    NUMERO = '';
    execute procedure SALDO_EN_EFECTIVO(:CAJAID, :fecha+1) RETURNING_VALUES (:MONTO);
    SUSPEND;
    
    FOR SELECT DPCA_BANCO, DPCA_CUENTA, DPCA_NUMERO, DPCA_FECHA, DPCA_MONTO, FOPA_NOM, TIDO_NOMCORTO, DPCA_TIPOENT, DPCA_IDENT, DPCA_TIPOSAL, DPCA_IDSAL
        FROM DOCUMENTOS_PAGO_CAJA D, TIPO_DOCUMENTO T, FORMAS_PAGO F
        WHERE D.DPCA_TIPOENT = T.TIDO_COD AND D.FOPA_ID = F.FOPA_ID AND D.CAJA_ID = :CAJAID AND D.FOPA_ID <> 1 AND DPCA_MONTO <> 0
        ORDER BY FOPA_NOM, DPCA_FECHA
        INTO :BANCO, :CUENTA, :NUMERO, :FECDOC, :MONTO, :FORPAGO, :TIPODOC, :tipoent, :IDDOC, :tiposal, :idsal
        DO
        BEGIN
        OK = 'N';
        SELECT MOCA_FECHA FROM movimiento_caja WHERE MOCA_TIPOREF = :tipoent AND MOCA_IDREF = :IDDOC AND CAJA_ID = :cajaid
            INTO :FECREC;
        if (FECREC <= FECHA) then
            BEGIN
            /* VERIFIQUE QUE NO ESTE SALIDO */
            if ((:IDSAL = 0) AND (:TIPOSAL = 0)) THEN
                OK = 'S';   
            ELSE
                BEGIN
                SELECT MOCA_FECHA FROM movimiento_caja WHERE MOCA_TIPOREF = :tiposal AND MOCA_IDREF = :idsal AND CAJA_ID = :cajaid
                    INTO :FECREC;
                    if (FECREC > FECHA) then
                        OK = 'S';
                END
            END
        if (OK = 'S') then
            BEGIN
            if (TIPODOC = 'RECICAJA') then
                SELECT PREF_PRE || RECA_NUMERO, TERC_NOM FROM RECIBOS_CAJA R, TERCEROS T
                    WHERE RECA_ID = :IDDOC AND R.TERC_NIT = T.TERC_NIT INTO :NUMDOC, :NOMTERC;
            if (TIPODOC = 'RECIPROV') then
                SELECT PREF_PRE || RCPR_NUMERO, TERC_NOM FROM RECIBO_PROVISIONAL R, TERCEROS T
                    WHERE RCPR_ID = :IDDOC AND R.TERC_NIT = T.TERC_NIT INTO :NUMDOC, :NOMTERC;
            if (TIPODOC = 'DEVOCHEQ') then
                SELECT PRBA_PREF || DVCH_NUMDOC, TERC_NOM FROM DEVOLUCION_CHEQUES D, TERCEROS T
                    WHERE DVCH_ID = :IDDOC AND D.TERC_NIT = T.TERC_NIT INTO :NUMDOC, :NOMTERC;
            if (TIPODOC = 'TRASLACJ') then
                SELECT PREF_PRE || TRCJ_NUMERO, '' FROM traslados_caja
                    WHERE TRCJ_ID = :IDDOC INTO :NUMDOC, :NOMTERC;
            SUSPEND;
            END
        END
    END
END
^

SET TERM ; ^

/* 20101221B */
/* actualizaba el OK del consolidado dos veces al consolidar cantidades, el trigger de consolidación disparaba la excepcion */
SET TERM ^ ;

CREATE OR ALTER TRIGGER FACTCOMP_DETALLE_AI FOR FACTURAS_COMPRAS_DETALLE
ACTIVE AFTER INSERT POSITION 0
AS
declare variable fec date;
declare variable fecaux date;
declare variable aux varchar(90);
declare variable CONC VARCHAR(60);
declare variable factor numeric(18,4);
declare variable Pref varchar(4);
declare variable Num varchar(6);
declare variable Nit varchar(20);
declare variable TIPO INTEGER;
declare variable INVFAC CHAR(2);
declare variable IVAINC CHAR(2);
declare variable ICOINC CHAR(2);
declare variable COSTO NUMERIC(18,2);
declare variable CANTREL NUMERIC(18,4);
declare variable NUMPROV VARCHAR(10);
declare variable NUMPED VARCHAR(30);
declare variable NUMREM VARCHAR(30);
declare variable CONSO VARCHAR(2);
declare variable CONSOLIDA INTEGER;
declare variable NUMROWS INTEGER;
declare variable DTOPIE NUMERIC(18,2);
declare variable ADICIONAL NUMERIC(18,2);
declare variable TOTAL NUMERIC(18,2);
declare variable IVAMONTO NUMERIC(18,2);
declare variable EXTRA NUMERIC(18,2);
declare variable FACT NUMERIC(18,4);
declare variable MENORV CHAR(2);
declare variable ACTREM CHAR(2);
declare variable ACTCAN CHAR(2);
declare variable FECREM date;
declare variable IDREM INTEGER;
declare variable ITEREM INTEGER;
declare variable CANTREM NUMERIC(18,4);
declare variable LOTEREM VARCHAR(15);
declare variable PREFREM CHAR(4);
declare variable IDMOV INTEGER;
declare variable DTOPOR NUMERIC(18,4);
BEGIN
if ((NEW.faco_id <> 0) and (new.fcde_anulado = 'N')) then
    BEGIN
    select faco_fecha, pref_pre, faco_numero, terc_nit, faco_imptos, faco_numprov, faco_remision, faco_orden, FACO_CONSOLIDA,
        FACO_TOTAL, FACO_EXTRA, FACO_IVAMONTO, FACO_ADICIONAL, FACO_DTOMONTO, FACO_DTOPORC
        from facturas_compra where faco_id = new.faco_id
        into :fec, :Pref, :Num, :Nit, :ivainc, :numprov, :numrem, :numped, :CONSOLIDA,
        :total, :extra, :ivamonto, :adicional, :dtopie, :dtopor;
    conc = 'FACTURA DE COMPRA No.' || PREF || NUM || '-' || NUMPROV;
    if (NUMREM <> '') then
        BEGIN
        AUX = SUBSTR(NUMREM, 1, 15);
        conc = conc || '-REM:' || AUX;
        END
    else
        if (NUMPED <> '') then
            BEGIN
            AUX = SUBSTR(NUMPED, 1, 15);
            conc = conc || '-ORDEN ' || AUX;
            END
    SELECT MAX(CEFA_TIPOORI) FROM consolide_faltantes WHERE CEFA_ID = :CONSOLIDA INTO :TIPO;
    if (Tipo is null) then
        Tipo = 0;
    execute procedure lee_configuracion('COMPRAS', 'FACTURAS', 'AFECTAR INVENTARIO CON LA FACTURA') returning_values (:INVFAC);
    execute procedure factor_unidad_cant(new.arti_cod, new.fcde_unidad) returning_values(factor);
    COSTO = ((new.fcde_prunit - NEW.fcde_dtomonto) / :factor);
    if (IVAINC = 'S') then
        BEGIN
        EXECUTE PROCEDURE lee_configuracion ('FACTURACION', 'ARTICULOS', 'IMPOCONSUMO INCLUIDO EN EL PRECIO BASE DE VENTA ANTES DE IVA') returning_values(:icoinc);
        if (icoinc = 'SI') then
            COSTO = COSTO - (NEW.fcde_consumo/(NEW.fcde_cant * new.fcde_factor));
        COSTO = COSTO / (1 + NEW.fcde_ivaporc/100);
        END
    EXECUTE PROCEDURE lee_configuracion('COMPRAS','FACTURAS','DESCUENTO Y VALOR ADICIONAL DEL DOCUMENTO COMO MENOR VALOR DEL COSTO') returning_values (:MENORV);
    if (MENORV = 'SI') then
        BEGIN
        if ((adicional = 0) and (dtopie <> 0)) then
            FACT = (100 - DTOPOR) / 100;
        ELSE
            BEGIN
            FACT = (TOTAL - EXTRA - IVAMONTO);
            if ((FACT - ADICIONAL + DTOPIE) <> 0) then
                FACT = FACT / (FACT - ADICIONAL + DTOPIE);
            ELSE
                FACT = 1;
            END
        COSTO = COSTO * FACT;
        END
    /* si se hizo con base en una remision no afecte inventario */
    if (INVFAC = 'SI') then
      if (Tipo <> 22) then
        begin
        INSERT INTO MOVIMIENTO_ARTICULO
          (ARTI_COD, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM, TERC_NIT)
          VALUES(NEW.ARTI_COD, NEW.BODE_COD, :FEC, 21, NEW.faco_id,
          :CONC, :factor * new.fcde_cant, :COSTO, 'S', new.fcde_lote, :Pref, :Num, NEW.fcde_item, :Nit);

        if (COSTO > 0 ) then
         BEGIN
          /* ACTUALICE EL COSTO POR PROVEEDOR */
          SELECT PVAR_FECHA FROM PROVEEDOR_ARTICULO
            WHERE TERC_NIT = :Nit AND ARTI_COD = NEW.ARTI_COD
            INTO :FECAUX;
          if (FECAUX IS NULL) then
            INSERT INTO PROVEEDOR_ARTICULO (TERC_NIT, ARTI_COD, PVAR_COSTO, PVAR_FECHA, PVAR_COD,PVAR_DES)
                VALUES (:Nit, NEW.ARTI_COD, :COSTO, :fec, NEW.fcde_codprov,NEW.fcde_desc);
          else
            UPDATE PROVEEDOR_ARTICULO
                SET PVAR_COSTO = :COSTO, PVAR_FECHA = :fec, PVAR_COD = NEW.fcde_codprov
                WHERE ARTI_COD = NEW.ARTI_COD AND TERC_NIT = :Nit;
         END
        /* RECORRA LAS LISTAS DE PRECIOS Y CAMBIE EL PRECIO */
        EXECUTE PROCEDURE CALCULA_PRECIOS(NEW.ARTI_COD, :FEC);
        END /* AFECTAR INV */
    EXECUTE PROCEDURE lee_configuracion('COMPRAS', 'FACTURAS', 'ACTUALIZAR COSTOS DE LA REMISION RELACIONADA AL GRABAR LA FACTURA') returning_values (:ACTREM);
    if ((ACTREM = 'SI') and (Tipo = 22)) then
        BEGIN
        numrows = 0;
        select mvar_cons, MVAR_ITEM, MVAR_FECHA, MVAR_IDREF, MVAR_CANT, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO
            from movimiento_articulo M, consolidado_faltantes C
            where C.cofa_id = :CONSOLIDA AND mvar_tipodoc = 22 and mvar_idref = C.cofa_idori AND C.cofa_tipoori = 22 and m.arti_cod = new.arti_cod and m.mvar_item = c.cofa_itemori
            into :numrows, :iterem, :fecrem, :idrem, :cantrem, :loterem, :prefrem, :numrem;
        
        if (numrows <> 0) then
            BEGIN
            /* inserte primero para evitar existencias negativas */
            IDMOV = GEN_ID(ID_MOVARTI,1);
            EXECUTE PROCEDURE lee_configuracion('COMPRAS', 'FACTURAS', 'ACTUALIZAR CANTIDADES DE LA REMISION RELACIONADA AL GRABAR LA FACTURA') returning_values (:ACTCAN);
            if (ACTCAN = 'SI') then
                CANTREM = NEW.fcde_cant * NEW.fcde_factor;
            INSERT INTO MOVIMIENTO_ARTICULO
                (ARTI_COD, MVAR_CONS, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM, TERC_NIT)
                VALUES(NEW.ARTI_COD, :IDMOV, NEW.BODE_COD, :fecrem, 22, :idrem,
                :CONC, :cantrem, :costo, 'S', :loterem, :prefrem, :numrem, :iterem, :Nit);
            DELETE FROM MOVIMIENTO_ARTICULO WHERE MVAR_CONS = :numrows;
            /* reponga el consecutivo para no afectar el orden del kardex */
            update MOVIMIENTO_ARTICULO set mvar_cons = :numrows WHERE MVAR_CONS = :idmov;
            update costos set cost_idmov = :numrows WHERE cost_idmov = :idmov AND arti_cod = new.arti_cod;

            if (COSTO > 0 ) then
                BEGIN
                /* ACTUALICE EL COSTO POR PROVEEDOR */
                SELECT PVAR_FECHA FROM PROVEEDOR_ARTICULO
                    WHERE TERC_NIT = :Nit AND ARTI_COD = NEW.ARTI_COD
                    INTO :FECAUX;
                if (FECAUX IS NULL) then
                    INSERT INTO PROVEEDOR_ARTICULO (TERC_NIT, ARTI_COD, PVAR_COSTO, PVAR_FECHA, PVAR_COD,PVAR_DES)
                        VALUES (:Nit, NEW.ARTI_COD, :COSTO, :fec, NEW.fcde_codprov,NEW.fcde_desc);
                else
                    UPDATE PROVEEDOR_ARTICULO
                        SET PVAR_COSTO = :COSTO, PVAR_FECHA = :fec, PVAR_COD = NEW.fcde_codprov
                        WHERE ARTI_COD = NEW.ARTI_COD AND TERC_NIT = :Nit;
                END
            /* RECORRA LAS LISTAS DE PRECIOS Y CAMBIE EL PRECIO */
            EXECUTE PROCEDURE CALCULA_PRECIOS(NEW.ARTI_COD, :FEC);
            END
        END

    /* ACTUALICE EL PENDIENTE  */
    if (CONSOLIDA <> 0) then
        BEGIN
/*        UPDATE consolidado_faltantes SET COFA_OK = 'S'
            WHERE COFA_ID = :consolida AND COFA_ITEM = NEW.FCDE_ITEM AND ARTI_COD = NEW.arti_cod; */
        EXECUTE procedure LEE_CONFIGURACION ('COMPRAS','DOCUMENTOS','SUMAR CANTIDADES PENDIENTES AL CONSOLIDAR DOCUMENTOS') returning_values (CONSO);
        /* IGNORE LA CONSOLIDACION SI SE VALIDAN CODIGOS DE LA ORDEN */
        SELECT MIN(CEFA_TIPOORI) FROM consolide_faltantes WHERE CEFA_ID = :CONSOLIDA INTO :NUMROWS;
        if (NUMROWS = 23) then
            BEGIN
            EXECUTE PROCEDURE LEE_CONFIGURACION('COMPRAS', 'FACTURAS', 'VERIFICAR CODIGOS DE LA ORDEN') returning_values (MENORV);
            if (MENORV = 'SI') then
                CONSO = 'NO';
            END
        SELECT COUNT(CEFA_ITEM) FROM consolide_faltantes WHERE CEFA_ID = :CONSOLIDA INTO :NUMROWS;
        if ((CONSO = 'SI') AND (NUMROWS > 1)) then
            UPDATE consolidado_faltantes SET COFA_IDDES = NEW.faco_id, COFA_OK = 'S' WHERE COFA_ID = :consolida;
        else
            BEGIN
            /* BUSQUE EL CONSOLIDADO EN EL MISMO ITEM Y SI ES DIFERENTE ACTUALICELO */
            select COFA_CANT * COFA_FACTOR FROM consolidado_faltantes
                WHERE COFA_ID = :consolida AND COFA_ITEM = NEW.FCDE_ITEM AND ARTI_COD = NEW.arti_cod INTO :CANTREL;
            if (NEW.FCDE_CANT * NEW.FCDE_FACTOR < CANTREL) then
                UPDATE consolidado_faltantes SET COFA_IDDES = NEW.faco_id, COFA_CANT = NEW.FCDE_CANT, COFA_FACTOR = NEW.FCDE_FACTOR, cofa_ok = 'S'
                    WHERE COFA_ID = :consolida AND COFA_ITEM = NEW.FCDE_ITEM AND ARTI_COD = NEW.arti_cod;
            END
        END
    /* ACTUALICE EL STAND */
    if (new.fcde_stand is not null) then
      if (exists(select stand_cod from stands where arti_cod = new.arti_cod and stand_bodega = new.bode_cod)) then
        UPDATE stands set stand_cod = new.fcde_stand where arti_cod = new.arti_cod and stand_bodega = new.bode_cod;
      else
        INSERT INTO stands (ARTI_COD, STAND_BODEGA, STAND_COD) VALUES (NEW.arti_cod, NEW.bode_cod, NEW.fcde_stand);
    END
END
^

SET TERM ; ^


/* 20101222 */
/* NO SUME LA RETENCION PARA CALCULAR EL SALDO ANTERIOR SI ES AUTORETENEDOR  */
SET TERM ^ ;

CREATE OR ALTER procedure IMPR_RECICAJA (
    ID integer)
returns (
    PREFIJO varchar(4),
    NUMERO varchar(6),
    FECHA date,
    NOMCAJA varchar(60),
    CODCOBR integer,
    NOMCOBR varchar(60),
    NIT varchar(20),
    NOMBRE varchar(60),
    DIR varchar(60),
    CIU varchar(40),
    TEL varchar(40),
    CONCEPTO varchar(60),
    MONTO numeric(18,2),
    RTFTE numeric(18,2),
    RTIVA numeric(18,2),
    RTICA numeric(18,2),
    DSCTO numeric(18,2),
    EXCEDE numeric(18,2),
    OBS blob sub_type 1 segment size 80,
    ITEMDOC integer,
    TIPODOC varchar(8),
    PREFDOC varchar(4),
    NUMDOC varchar(6),
    SUCURSAL varchar(10),
    ABONODOC numeric(18,2),
    RTFTEDOC numeric(18,2),
    RTIVADOC numeric(18,2),
    RTICADOC numeric(18,2),
    DSCTODOC numeric(18,2),
    SALDODOC numeric(18,2),
    ANTERDOC numeric(18,2))
AS
declare variable NUMROWS INTEGER;
declare variable TIPO integer;
declare variable IDDOC INTEGER;
declare variable AUTORET VARCHAR(10);
declare variable FAUTORET DATE;
BEGIN
  EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'FECHA AUTORETENEDOR NO DESCONTAR RETENCIONES DEL SALDO PERO SI CONTABILIZARLAS') returning_values (AUTORET);
  if (AUTORET <> '') then
    FAUTORET = CAST(AUTORET AS DATE);
  else
    FAUTORET = '9999/12/31';
  SELECT PREF_PRE, RECA_NUMERO, RECA_FECHA, CAJA_NOMBRE, RECA_CONC, R.COBR_COD,
        R.TERC_NIT, RECA_NOMTERC, TERC_DIR, TERC_CIU, TERC_TEL,
        RECA_MONTO, RECA_RTFTEMONTO, RECA_RTIVAMONTO, RECA_RTICAMONTO, RECA_DTOF, RECA_EXEDENTE, RECA_OBS
  FROM RECIBOS_CAJA R, TERCEROS T, CAJAS C
  WHERE R.TERC_NIT = T.TERC_NIT AND R.CAJA_ID = C.CAJA_ID AND
        R.RECA_ID = :ID
  INTO :PREFIJO, :NUMERO, :FECHA, :NOMCAJA, :CONCEPTO, :CODCOBR,
        :NIT, :NOMBRE, :DIR, :CIU, :TEL,
        :MONTO, :RTFTE, :RTIVA, :RTICA, :DSCTO, :excede, :OBS;
  SELECT COBR_NOM FROM COBRADORES WHERE COBR_COD = :CODCOBR INTO :NOMCOBR;
  SELECT COUNT(RCDE_ITEM) FROM RECIBOS_CAJA_DETALLE
    WHERE RECA_ID = :ID INTO :NUMROWS;
  if (NUMROWS > 0) then
    FOR SELECT RCDE_ITEM, RCDE_TIPODOC, RCDE_IDDOC, TIDO_NOMCORTO, RCDE_PREFIJO, RCDE_NUMERO,
        RCDE_ABONO, RCDE_RTFTE, RCDE_RTIVA, RCDE_RTICA, RCDE_DTOF, RCDE_SUCURSAL
        FROM RECIBOS_CAJA_DETALLE D, TIPO_DOCUMENTO TD
        WHERE D.RECA_ID = :ID AND TD.TIDO_COD = D.RCDE_TIPODOC
        ORDER BY RCDE_ITEM
        INTO :ITEMDOC, :TIPO, :IDDOC, :TIPODOC, :PREFDOC, :NUMDOC, :ABONODOC, :RTFTEDOC, :RTIVADOC, :RTICADOC, :DSCTODOC, :sucursal
        DO
            BEGIN
            EXECUTE PROCEDURE SALDO_DOC_CARTERA(:TIPO, :IDDOC, :FECHA, 0) returning_values (:SALDODOC);
            ANTERDOC = SALDODOC + ABONODOC + DSCTODOC + RTIVADOC + RTICADOC;
            if (fautoret > fecha) then
                ANTERDOC = ANTERDOC + RTFTEDOC;
            SUSPEND;
            END
  ELSE
    SUSPEND;
END
^

SET TERM ; ^

/* 20101229 */
SET TERM ^ ;

CREATE OR ALTER procedure CAMBIA_CTAS_CLIENTES (
    CLI_INI varchar(15),
    CLI_FIN varchar(15))
AS
declare variable cliente varchar(20);
declare variable zona varchar(2);
declare variable cta1 varchar(20);
declare variable cta2 varchar(20);
declare variable cta3 varchar(20);
declare variable cta4 varchar(20);
declare variable cta5 varchar(20);
begin
FOR SELECT T.terc_nit, C.zona_cod  FROM TERCEROS T, CLIENTES C WHERE T.terc_nit >= :CLI_INI AND T.terc_nit <= :CLI_fin
    AND T.terc_nit = C.terc_nit
    INTO :CLIENTE, :ZONA
    DO
    BEGIN
    SELECT GP.zona_ctaventas, GP.zona_ctacliente, GP.zona_ctartfte, GP.zona_ctariva, GP.zona_ctarica
        FROM ZONAS GP
        WHERE GP.zona_cod = :ZONA
        into :CTA1,:CTA2,:CTA3,:CTA4,:CTA5;
    update TERCEROS TER
        SET TER.terc_ctaventa = :CTA1,
            TER.terc_ctacliente = :CTA2,
            TER.terc_ctartfte = :CTA3,
            TER.terc_ctartiva = :CTA4,
            TER.terc_ctartica = :CTA5
        where TER.TERC_NIT = :CLIENTE;
    END
end
^

SET TERM ; ^



/* 20110105 */
/* NO IMPRIMIA LOS ITEMS CON DEVOLUCIONES HECHAS POR FUERA DE LA FACTURA */
SET TERM ^ ;

CREATE OR ALTER procedure IMPR_FACTURA (
    ID integer)
returns (
    PREF varchar(4),
    NUMERO varchar(6),
    FECHA date,
    VENCE date,
    DIASVENCE integer,
    CONTCRED char(17),
    NIT varchar(20),
    NOMTERCERO varchar(60),
    NOMCLIENTE varchar(60),
    VENDEDOR integer,
    NOMVENDEDOR varchar(60),
    PUNTOVTA integer,
    NOMPUNTOVTA varchar(60),
    CODBODEGA varchar(2),
    NOMBODEGA varchar(30),
    AUTORIZACION varchar(20),
    DESPACHO varchar(255),
    TRANSPORTADOR varchar(60),
    COTIZACION varchar(30),
    PEDIDO varchar(30),
    REMISION varchar(30),
    PACIENTE varchar(20),
    NOMPACIENTE varchar(60),
    COMIPORC numeric(9,2),
    COMIMONTO numeric(18,2),
    SUBTOTAL numeric(18,2),
    INGTERCEROS numeric(18,2),
    INGPROPIOS numeric(18,2),
    DTOPORC numeric(9,2),
    DTOMONTO numeric(18,2),
    ADICIONAL numeric(18,2),
    IVAMONTO numeric(18,2),
    DEC2799 numeric(18,2),
    RTEFTEPORC numeric(9,2),
    RTEFTEMONTO numeric(18,2),
    RTEIVAPORC numeric(9,2),
    RTEIVAMONTO numeric(18,2),
    RTEICAPORC numeric(9,2),
    RTEICAMONTO numeric(18,2),
    EXTRA numeric(18,2),
    DTOFPORC numeric(9,2),
    DTOFMONTO numeric(18,2),
    FECHADTO date,
    ANTICIPO numeric(18,2),
    RETGARANTIA numeric(18,2),
    TOTALFAC numeric(18,2),
    TOTALPAGAR numeric(18,2),
    TOTALNETO numeric(18,2),
    OBS blob sub_type 1 segment size 80,
    ITEM integer,
    ARTICULO varchar(15),
    CODBAR varchar(15),
    ARTIDES varchar(60),
    DESCORTA varchar(30),
    CANT numeric(18,4),
    LOTE varchar(15),
    VLOTE date,
    UNIDAD varchar(8),
    CAJAS numeric(18,4),
    FACTOR numeric(18,4),
    LISTAPR integer,
    REFITEM varchar(60),
    BODITEM varchar(2),
    STAND varchar(20),
    PRUNIT numeric(18,2),
    DTOITPORC numeric(9,2),
    DTOITMONTO numeric(18,2),
    PRNETO numeric(18,2),
    PRNETOSINIVA numeric(18,2),
    BASE numeric(18,2),
    PORCBASE numeric(9,2),
    DTOIT1 numeric(9,2),
    DTOIT2 numeric(9,2),
    DTOIT3 numeric(9,2),
    IVAPORC numeric(9,2),
    IVAITMONTO numeric(18,2),
    CONSUMO numeric(18,2),
    SUBTOTIT numeric(18,2),
    TOTAL numeric(18,2),
    PESOTOT numeric(18,2),
    CODIGOCL varchar(20),
    ZONACOD varchar(2),
    ZONANOM varchar(60),
    DV char(1),
    DIRECCION varchar(60),
    CIUDAD varchar(40),
    TELEFONO varchar(40),
    CONTACTO varchar(60),
    FAX varchar(25),
    CEL varchar(25),
    GRUPO varchar(2),
    NOMGRUPO varchar(30),
    SUBGRUPO varchar(3),
    NOMSUBG varchar(30),
    MARCA varchar(3),
    NOMMARCA varchar(30),
    PESO numeric(18,4),
    ANCHO numeric(18,4),
    ALTO numeric(18,4),
    LARGO numeric(18,4),
    SUMA1 numeric(18,2),
    SUMA2 numeric(18,2),
    SUMA3 numeric(18,2),
    IVA1 numeric(18,2),
    IVA2 numeric(18,2),
    IVA3 numeric(18,2),
    SUMAEX numeric(18,2),
    SUMAGR numeric(18,2),
    TOTCONSUMO numeric(18,2),
    DTOIT1M numeric(18,2),
    DTOIT2M numeric(18,2),
    DTOIT3M numeric(18,2),
    TOTCAJAS numeric(18,2),
    TOTBASE numeric(18,2),
    VEHICULO varchar(8),
    RECIBIDO numeric(18,2),
    CAMBIO numeric(18,2),
    HORA time,
    FORMAPAGO1 varchar(30),
    MONTOPAGO1 numeric(18,2),
    FORMAPAGO2 varchar(30),
    MONTOPAGO2 numeric(18,2),
    FORMAPAGO3 varchar(30),
    MONTOPAGO3 numeric(18,2),
    PUNTOS integer,
    PUNTOSACUM integer,
    PUNTOSVENC integer,
    FECPTOS date,
    OBSITEM blob sub_type 1 segment size 80,
    SUCUR varchar(10),
    ALTERNATIVAS numeric(18,4),
    PRINCIPALES numeric(18,4))
AS
DECLARE VARIABLE IMPTOS CHAR(1);
DECLARE VARIABLE TARIFA INTEGER;
declare variable DEVUELTO NUMERIC(18,2);
declare variable ORDENCOD CHAR(8);
declare variable IMPRDEV CHAR(2);
declare variable IMPR CHAR(1);
declare variable ITEMFP INTEGER;
declare variable FORMAP VARCHAR(30);
declare variable MONTOP NUMERIC(18,2);
declare variable ICOINC CHAR(2);
declare variable DTOITM1 NUMERIC(18,2);
declare variable DTOITM2 NUMERIC(18,2);
declare variable DTOITM3 NUMERIC(18,2);
declare variable DTOITE3 CHAR(2);
declare variable SUMDTOIT NUMERIC(18,2);
declare variable AUTORET VARCHAR(10);
declare variable FAUTORET DATE;
declare variable FACTCANT NUMERIC(18,4);
declare variable ANULADO CHAR(1);
declare variable INGTER CHAR(2);
BEGIN
execute procedure lee_configuracion('FACTURACION', 'ARTICULOS', 'IMPOCONSUMO INCLUIDO EN EL PRECIO BASE DE VENTA ANTES DE IVA') returning_values (icoinc);
execute procedure lee_configuracion('FACTURACION', 'FACTURAS', 'COLUMNAS DE DESCUENTO POR ITEM ADICIONALES') returning_values (DTOITE3);
execute procedure lee_configuracion('FACTURACION', 'FACTURAS', 'GRUPO DE MERCANCIA PARA INGRESOS DE TERCEROS') returning_values (INGTER);
SELECT F.PREF_PRE, FACT_NUMERO, FACT_FECHA, FACT_VENCE, F.BODE_COD, BODE_NOM, F.TERC_NIT, FACT_NOMCLIENTE, F.VEND_COD, VEND_NOMBRE, F.PTVT_ID, PTVT_NOM,
    AUTO_NUMERO, FACT_DESPACHO, FACT_TRANSP, FACT_COTIZACI, FACT_PEDIDO, FACT_REMISION, FACT_COMIPORC, FACT_COMIMONTO, FACT_IVAINC, 
    FACT_DTOPOR, FACT_DTOMONTO, FACT_ADICIONAL, FACT_IVAMONTO, FACT_RTFTEPOR, FACT_RTFTEMONTO, FACT_RTIVAPOR, FACT_RTIVAMONTO, FACT_RTICAPOR, FACT_RTICAMONTO, FACT_EXTRA, FACT_DTOFPOR, FACT_DTOFMONTO, FACT_DTOFFECHA, FACT_TOTAL,
    TERC_DIR, TERC_CIU, TERC_TEL, TERC_CONTACTO, TERC_FAX, TERC_DV, TERC_CEL, FACT_DTOIT1, FACT_DTOIT2, FACT_DTOIT3, FACT_DEC2799,
    FACT_OBS, VEHI_COD, /*FACT_NROCOPIA,*/ FACT_RECIBIDO, FACT_SUCURSAL, FACT_DETCLI, FACT_DETCLINOM, TERC_NOM, FACT_ANULADO, FACT_ANTICIPO, FACT_GARANTIA
    FROM FACTURAS F, BODEGA B, VENDEDORES V, PUNTO_VENTA P, TERCEROS T
    WHERE F.BODE_COD = B.BODE_COD AND F.VEND_COD = V.VEND_COD AND F.PTVT_ID = P.PTVT_ID AND F.TERC_NIT = T.TERC_NIT AND F.FACT_ID = :ID
    into :PREF, :NUMERO, :FECHA, :VENCE, :CODBODEGA, :NOMBODEGA, :NIT, :NOMTERCERO, :VENDEDOR, :NOMVENDEDOR, :PUNTOVTA, :NOMPUNTOVTA,
    :AUTORIZACION, :DESPACHO, :TRANSPORTADOR, :COTIZACION, :PEDIDO, :REMISION, :COMIPORC, :COMIMONTO, :IMPTOS,
    :DTOPORC, :DTOMONTO, :ADICIONAL, :IVAMONTO, :RTEFTEPORC, :RTEFTEMONTO, :RTEIVAPORC, :RTEIVAMONTO, :RTEICAPORC, :RTEICAMONTO, :EXTRA, :DTOFPORC, :DTOFMONTO, :FECHADTO, :TOTALFAC,
    :DIRECCION, :CIUDAD, :TELEFONO, :CONTACTO, :FAX, :DV, :CEL, :dtoit1m, :dtoit2m, :dtoit3m, :dec2799,
    :OBS, :VEHICULO,/* :NROCOPIA,*/ :RECIBIDO, :SUCUR, :paciente, :nompaciente, :nomcliente, :ANULADO, :anticipo, :retgarantia;

/* ACUMULE LOS PUNTOS, SE HACE ACA POR SER POSTERIOR AL DETALLE */
if (ANULADO = 'N') then
    EXECUTE PROCEDURE acumula_puntos_cliente (31, :id, :nit, :fecha) returning_values (:PUNTOS);
EXECUTE PROCEDURE consulta_puntos_cliente (:id, :nit, :fecha) returning_values (:puntos, :puntosacum, :puntosvenc, :fecptos);
if (DTOIT1M IS NULL) then
    DTOIT1M = 0;
if (DTOIT2M IS NULL) then
    DTOIT2M = 0;
if (DTOIT3M IS NULL) then
    DTOIT3M = 0;
SELECT CLIE_COD, C.ZONA_COD, ZONA_NOM
    FROM CLIENTES C, ZONAS Z
    WHERE TERC_NIT = :NIT AND C.ZONA_COD = Z.ZONA_COD
    INTO :CODIGOCL, :ZONACOD, :ZONANOM;
SELECT CLSU_DIR, CLSU_CIUDAD, CLSU_TEL FROM CLIENTE_SUCURSALES WHERE TERC_NIT = :NIT AND CLCU_COD = :SUCUR
    INTO :DIRECCION, :CIUDAD, :TELEFONO;
DIASVENCE = VENCE - FECHA;
if (DIASVENCE > 0) then
    CONTCRED = 'CREDITO ' || CAST(DIASVENCE AS VARCHAR(3)) || ' DIAS';
ELSE
    CONTCRED = 'CONTADO';
SUBTOTAL = TOTALFAC - EXTRA - IVAMONTO - ADICIONAL + DTOMONTO + dec2799;
SELECT SUM(FADE_DTOMONTO*FADE_CANT) FROM FACTURAS_DETALLE WHERE FACT_ID = :id INTO :sumdtoit;
if (DTOITE3 = 'SI') then
    BEGIN
    SUBTOTAL = SUBTOTAL + sumdtoit + dtoit1m + dtoit2m + dtoit3m;
    END
if (INGTER <> '') then
    BEGIN
    SELECT SUM(FADE_TOTAL) FROM FACTURAS_DETALLE D, ARTICULO A WHERE A.arti_cod = D.arti_cod AND FACT_ID = :id AND GRUP_COD = :ingter
        INTO :ingterceros;
    INGPROPIOS = SUBTOTAL - INGTERCEROS;
    END
EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'FECHA AUTORETENEDOR NO DESCONTAR RETENCIONES DEL SALDO PERO SI CONTABILIZARLAS') returning_values (AUTORET);
if (AUTORET <> '') then
    FAUTORET = CAST(AUTORET AS DATE);
else
    FAUTORET = '9999/12/31';
if (FECHA > fautoret) then
    TOTALPAGAR = TOTALFAC - RTEIVAMONTO - RTEICAMONTO - ANTICIPO - RETGARANTIA;
ELSE
    TOTALPAGAR = TOTALFAC - RTEFTEMONTO - RTEIVAMONTO - RTEICAMONTO - ANTICIPO - RETGARANTIA;
TOTALNETO = TOTALFAC - ANTICIPO - RETGARANTIA;
if (RECIBIDO <> 0) then
    CAMBIO = RECIBIDO - totalpagar;
ELSE
    CAMBIO = 0;
SUMAEX = 0;
SUMA1 = 0;
SUMA2 = 0;
SUMA3 = 0;
IVA1 = 0;
IVA2 = 0;
IVA3 = 0;
TOTCONSUMO = 0;
MONTOPAGO1 = 0;
PESOTOT = 0;
SELECT MAX(AUDI_HORA) FROM AUDITORIA WHERE TIDO_COD = 31 AND AUDI_IDDOC = :ID AND AUDI_OPER = 'I' INTO :HORA;
/* AHORA LAS FORMAS DE PAGO, BUSQUE EL ABONO DE HOY A LA FACTURA */
ITEMFP = 1;
MONTOPAGO1 = 0;
MONTOPAGO2 = 0;
MONTOPAGO3 = 0;
FOR SELECT FOPA_NOM, RCPA_MONTO FROM RECIBOS_CAJA_PAGO P, FORMAS_PAGO F, RECIBOS_CAJA R, RECIBOS_CAJA_DETALLE D
    WHERE R.RECA_ID = P.RECA_ID AND R.RECA_ID = D.RECA_ID AND P.FOPA_ID = F.FOPA_ID AND RECA_FECHA = :FECHA AND RCDE_TIPODOC = 31 AND RCDE_IDDOC = :ID
    INTO :formap, :MONTOP
    DO
    BEGIN
    if (ITEMFP = 1) then
        BEGIN
        FORMAPAGO1 = FORMAP;
        MONTOPAGO1 = MONTOP;
        END
    if (ITEMFP = 2) then
        BEGIN
        FORMAPAGO2 = FORMAP;
        MONTOPAGO2 = MONTOP;
        END
    if (ITEMFP = 3) then
        BEGIN
        FORMAPAGO3 = FORMAP;
        MONTOPAGO3 = MONTOP;
        END
    ITEMFP = ITEMFP + 1;
    END
EXECUTE PROCEDURE lee_configuracion ('FACTURACION','DOCUMENTOS','ORDENAR ITEMS POR CODIGO DE ARTICULO') returning_values (:ORDENCOD);
EXECUTE PROCEDURE lee_configuracion ('FACTURACION','POS', 'IMPRIMIR DEVOLUCIONES DE ARTICULOS NEGATIVOS') returning_values (:imprdev);
totcajas = 0;
totbase = 0;
if (ORDENCOD = 'SI') then
    BEGIN
    FOR SELECT FADE_ITEM, D.ARTI_COD, FADE_CODBAR, SUBSTR(FADE_DESC,1,60), ARTI_DESCORTA, FADE_CANT, FADE_UNIDAD, FADE_FACTOR, BODE_COD, FADE_LOTE, LIPR_COD, FADE_PRUNIT, FADE_DTOPORC, FADE_DTOMONTO, FADE_IVAPORC, FADE_IVAMONTO, FADE_CONSUMO, FADE_TOTAL, FADE_REFERENCIA,
        GRUP_COD, SUBG_COD, MARC_COD, ARTI_PESO, ARTI_ANCHO, ARTI_ALTO, ARTI_LARGO, TAIV_COD, FADE_DEVUELTO, FADE_OBS, FADE_DTO1, FADE_DTO2, FADE_DTO3, FADE_DTOM1, FADE_DTOM2, FADE_DTOM3, FADE_CAJAS, FADE_BASE, FADE_PORCBASE
        FROM FACTURAS_DETALLE D, ARTICULO A
        WHERE D.ARTI_COD = A.ARTI_COD AND D.FACT_ID = :ID
        ORDER BY D.ARTI_COD
        INTO :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :DESCORTA, :CANT, :UNIDAD, :FACTOR, :BODITEM, :LOTE, :LISTAPR, :PRUNIT, :DTOITPORC, :DTOITMONTO, :IVAPORC, :IVAITMONTO, :CONSUMO, :TOTAL, :refitem,
        :GRUPO, :SUBGRUPO, :MARCA, :PESO, :ANCHO, :ALTO, :LARGO, :TARIFA, :devuelto, :obsitem, :dtoit1, :dtoit2, :dtoit3, :dtoitm1, :dtoitm2, :dtoitm3, :cajas, :base, :porcbase
        DO
          BEGIN
          if (ARTICULO = CODBAR) then
            SELECT FIRST 1 COBA_COD FROM barras_articulo WHERE ARTI_COD = :articulo INTO :CODBAR;
          if (IMPRDEV <> 'SI') then
            BEGIN
            if ((CANT >= 0) AND (DEVUELTO = 0)) then
                IMPR = 'S';
            ELSE
                begin
                if (EXISTS (SELECT FADE_ITEM FROM FACTURAS_DETALLE WHERE FADE_CANT < 0 AND FACT_ID = :ID AND ARTI_COD = :ARTICULO)) then
                    IMPR = 'N'; /* ES DEVOLUCION HECHA EN LA FACTURA */
                ELSE
                    IMPR = 'S'; /* ES DEVOLUCION HECHA FUERA DE LA FACTURA */
                end
            END
          ELSE
            IMPR = 'S';
          if (IMPR = 'S') then
            BEGIN
            prneto = PRUNIT - DTOITMONTO - dtoitm1 - dtoitm2 - dtoitm3;
            if (IMPTOS = 'S') then
                if (cant <> 0) then
                    prnetosiniva = PRUNIT - DTOITMONTO - ((IVAITMONTO+CONSUMO) / CANT) - dtoitm1 - dtoitm2 - dtoitm3;
                else
                    prnetosiniva = PRUNIT - DTOITMONTO - dtoitm1 - dtoitm2 - dtoitm3;
            ELSE
                prnetosiniva = PRUNIT - DTOITMONTO - dtoit1m - dtoit2m - dtoit3m;
            if (ICOINC = 'SI') then
                SUBTOTIT = TOTAL - IVAITMONTO;
            else
                SUBTOTIT = TOTAL - IVAITMONTO - CONSUMO;
            TOTCONSUMO = TOTCONSUMO + CONSUMO;
            TOTBASE = TOTBASE + BASE;
            SELECT LOTE_VENCE FROM LOTES WHERE LOTE_NRO = :lote AND ARTI_COD = :ARTICULO AND BODE_COD = :boditem INTO :vlote;
            if ((REFITEM <> '.t') or (REFITEM IS NULL)) then
                BEGIN
                /* NO SUME LOS ENSAMBLES */
                if (IVAPORC = 0) then
                    SUMAEX = SUMAEX + TOTAL;
                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;
                END
            if (ANCHO IS NULL) then
                ANCHO = 0;
            if (ALTO IS NULL) then
                ALTO = 0;
            if (LARGO IS NULL) then
                LARGO = 0;
            if (PESO IS NULL) then
                PESO = 0;
            PESO = (PESO / 1000) * CANT * FACTOR;
            PESOTOT = PESOTOT + PESO;
            totcajas = totcajas + cajas;
            if (substr(ARTICULO,1,2) = '.t') then
                BEGIN
                REFITEM = '';
                TOTAL = 0;
                SUBTOTIT = 0;
                END
            SELECT STAND_COD FROM STANDS WHERE ARTI_COD = :ARTICULO AND STAND_BODEGA = :boditem INTO :stand;
            factcant = NULL;
            SELECT FIRST 1 UNAR_FACCAN FROM unidad_articulo WHERE ARTI_COD = :articulo INTO :factcant;
            if (factcant IS NULL) then
                BEGIN
                ALTERNATIVAS = 0;
                PRINCIPALES = (CANT * FACTOR);
                END
            ELSE
                BEGIN
                ALTERNATIVAS = FLOOR(CANT * factor / factcant);
                PRINCIPALES = (CANT * FACTOR) - (alternativas * factcant);
                END
            SUSPEND;
            END
          END
    END
ELSE
  if (ORDENCOD = 'UNIDAD') then
    BEGIN
    FOR SELECT FADE_ITEM, D.ARTI_COD, FADE_CODBAR, SUBSTR(FADE_DESC,1,60), ARTI_DESCORTA, FADE_CANT, FADE_UNIDAD, FADE_FACTOR, BODE_COD, FADE_LOTE, LIPR_COD, FADE_PRUNIT, FADE_DTOPORC, FADE_DTOMONTO, FADE_IVAPORC, FADE_IVAMONTO, FADE_CONSUMO, FADE_TOTAL, FADE_REFERENCIA,
        GRUP_COD, SUBG_COD, MARC_COD, ARTI_PESO, ARTI_ANCHO, ARTI_ALTO, ARTI_LARGO, TAIV_COD, FADE_DEVUELTO, FADE_OBS, FADE_DTO1, FADE_DTO2, FADE_DTO3, FADE_DTOM1, FADE_DTOM2, FADE_DTOM3, FADE_CAJAS, FADE_BASE, FADE_PORCBASE
        FROM FACTURAS_DETALLE D, ARTICULO A
        WHERE D.ARTI_COD = A.ARTI_COD AND D.FACT_ID = :ID
        ORDER BY D.fade_unidad, D.fade_desc
        INTO :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :DESCORTA, :CANT, :UNIDAD, :FACTOR, :BODITEM, :LOTE, :LISTAPR, :PRUNIT, :DTOITPORC, :DTOITMONTO, :IVAPORC, :IVAITMONTO, :CONSUMO, :TOTAL, :refitem,
        :GRUPO, :SUBGRUPO, :MARCA, :PESO, :ANCHO, :ALTO, :LARGO, :TARIFA, :devuelto, :obsitem, :dtoit1, :dtoit2, :dtoit3, :dtoitm1, :dtoitm2, :dtoitm3, :cajas, :base, :porcbase
        DO
          BEGIN
          if (ARTICULO = CODBAR) then
            SELECT FIRST 1 COBA_COD FROM barras_articulo WHERE ARTI_COD = :articulo INTO :CODBAR;
          if (IMPRDEV <> 'SI') then
            BEGIN
            if ((CANT >= 0) AND (DEVUELTO = 0)) then
                IMPR = 'S';
            ELSE
                begin
                if (EXISTS (SELECT FADE_ITEM FROM FACTURAS_DETALLE WHERE FADE_CANT < 0 AND FACT_ID = :ID AND ARTI_COD = :ARTICULO)) then
                    IMPR = 'N'; /* ES DEVOLUCION HECHA EN LA FACTURA */
                ELSE
                    IMPR = 'S'; /* ES DEVOLUCION HECHA FUERA DE LA FACTURA */
                end
            END
          ELSE
            IMPR = 'S';
          if (IMPR = 'S') then
            BEGIN
            prneto = PRUNIT - DTOITMONTO - dtoitm1 - dtoitm2 - dtoitm3;
            if (IMPTOS = 'S') then
                if (cant <> 0) then
                    prnetosiniva = PRUNIT - DTOITMONTO - ((IVAITMONTO+CONSUMO) / CANT) - dtoitm1 - dtoitm2 - dtoitm3;
                else
                    prnetosiniva = PRUNIT - DTOITMONTO - dtoitm1 - dtoitm2 - dtoitm3;
            ELSE
                prnetosiniva = PRUNIT - DTOITMONTO - dtoit1m - dtoit2m - dtoit3m;
            if (ICOINC = 'SI') then
                SUBTOTIT = TOTAL - IVAITMONTO;
            else
                SUBTOTIT = TOTAL - IVAITMONTO - CONSUMO;
            TOTCONSUMO = TOTCONSUMO + CONSUMO;
            TOTBASE = TOTBASE + BASE;
            SELECT LOTE_VENCE FROM LOTES WHERE LOTE_NRO = :lote AND ARTI_COD = :ARTICULO AND BODE_COD = :boditem INTO :vlote;
            if ((REFITEM <> '.t') or (REFITEM IS NULL)) then
                BEGIN
                /* NO SUME LOS ENSAMBLES */
                if (IVAPORC = 0) then
                    SUMAEX = SUMAEX + TOTAL;
                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;
                END
            if (ANCHO IS NULL) then
                ANCHO = 0;
            if (ALTO IS NULL) then
                ALTO = 0;
            if (LARGO IS NULL) then
                LARGO = 0;
            if (PESO IS NULL) then
                PESO = 0;
            PESO = (PESO / 1000) * CANT * FACTOR;
            PESOTOT = PESOTOT + PESO;
            totcajas = totcajas + cajas;
            if (substr(ARTICULO,1,2) = '.t') then
                BEGIN
                REFITEM = '';
                TOTAL = 0;
                SUBTOTIT = 0;
                END
            SELECT STAND_COD FROM STANDS WHERE ARTI_COD = :ARTICULO AND STAND_BODEGA = :boditem INTO :stand;
            factcant = NULL;
            SELECT FIRST 1 UNAR_FACCAN FROM unidad_articulo WHERE ARTI_COD = :articulo INTO :factcant;
            if ((factcant IS NULL) or (factcant = 0)) then
                BEGIN
                ALTERNATIVAS = 0;
                PRINCIPALES = (CANT * FACTOR);
                END
            ELSE
                BEGIN
                ALTERNATIVAS = FLOOR(CANT * factor / factcant);
                PRINCIPALES = (CANT * FACTOR) - (alternativas * factcant);
                END
            SUSPEND;
            END
          END
    END
  ELSE
    BEGIN
    FOR SELECT FADE_ITEM, D.ARTI_COD, FADE_CODBAR, SUBSTR(FADE_DESC,1,60), ARTI_DESCORTA, FADE_CANT, FADE_UNIDAD, FADE_FACTOR, BODE_COD, FADE_LOTE, LIPR_COD, FADE_PRUNIT, FADE_DTOPORC, FADE_DTOMONTO, FADE_IVAPORC, FADE_IVAMONTO, FADE_CONSUMO, FADE_TOTAL, FADE_REFERENCIA,
        GRUP_COD, SUBG_COD, MARC_COD, ARTI_PESO, ARTI_ANCHO, ARTI_ALTO, ARTI_LARGO, TAIV_COD, FADE_DEVUELTO, FADE_OBS, FADE_DTO1, FADE_DTO2, FADE_DTO3, FADE_DTOM1, FADE_DTOM2, FADE_DTOM3, FADE_CAJAS, FADE_BASE, FADE_PORCBASE
        FROM FACTURAS_DETALLE D, ARTICULO A
        WHERE D.ARTI_COD = A.ARTI_COD AND D.FACT_ID = :ID
        ORDER BY FADE_ITEM
        INTO :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :DESCORTA, :CANT, :UNIDAD, :FACTOR, :BODITEM, :LOTE, :LISTAPR, :PRUNIT, :DTOITPORC, :DTOITMONTO, :IVAPORC, :IVAITMONTO, :CONSUMO, :TOTAL, :refitem,
        :GRUPO, :SUBGRUPO, :MARCA, :PESO, :ANCHO, :ALTO, :LARGO, :TARIFA, :devuelto, :obsitem, :dtoit1, :dtoit2, :dtoit3, :dtoitm1, :dtoitm2, :dtoitm3, :cajas, :base, :porcbase
        DO
          BEGIN
          if (IMPRDEV <> 'SI') then
            BEGIN
            if ((CANT >= 0) AND (DEVUELTO = 0)) then
                IMPR = 'S';
            ELSE
                begin
                if (EXISTS (SELECT FADE_ITEM FROM FACTURAS_DETALLE WHERE FADE_CANT < 0 AND FACT_ID = :ID AND ARTI_COD = :ARTICULO)) then
                    IMPR = 'N'; /* ES DEVOLUCION HECHA EN LA FACTURA */
                ELSE
                    IMPR = 'S'; /* ES DEVOLUCION HECHA FUERA DE LA FACTURA */
                end
            END
          ELSE
            IMPR = 'S';
          if (IMPR = 'S') then
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :GRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :MARCA INTO NOMMARCA;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :SUBGRUPO AND GRUP_COD = :GRUPO INTO :NOMSUBG;
            prneto = PRUNIT - DTOITMONTO - dtoitm1 - dtoitm2 - dtoitm3;
            if (IMPTOS = 'S') then
                if (cant <> 0) then
                    prnetosiniva = PRUNIT - DTOITMONTO - ((IVAITMONTO+CONSUMO) / CANT) - dtoit1m - dtoit2m - dtoit3m;
                else
                    prnetosiniva = PRUNIT - DTOITMONTO - dtoitm1 - dtoitm2 - dtoitm3;
            ELSE
                prnetosiniva = PRUNIT - DTOITMONTO - dtoitm1 - dtoitm2 - dtoitm3;
            if (ICOINC = 'SI') then
                SUBTOTIT = TOTAL - IVAITMONTO;
            else
                SUBTOTIT = TOTAL - IVAITMONTO - CONSUMO;
            TOTCONSUMO = TOTCONSUMO + CONSUMO;
            TOTBASE = TOTBASE + BASE;
            SELECT LOTE_VENCE FROM LOTES WHERE LOTE_NRO = :lote AND ARTI_COD = :ARTICULO AND BODE_COD = :boditem INTO :vlote;
            if ((REFITEM <> '.t') or (REFITEM IS NULL)) then
                BEGIN
                /* NO SUME LOS ENSAMBLES */
                if (IVAPORC = 0) then
                    SUMAEX = SUMAEX + TOTAL;
                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;
                END
            if (ANCHO IS NULL) then
                ANCHO = 0;
            if (ALTO IS NULL) then
                ALTO = 0;
            if (LARGO IS NULL) then
                LARGO = 0;
            if (PESO IS NULL) then
                PESO = 0;
            PESO = (PESO / 1000)* CANT * FACTOR;
            PESOTOT = PESOTOT + PESO;
            totcajas = totcajas + cajas;
            if (substr(ARTICULO,1,2) = '.t') then
                BEGIN
                REFITEM = '';
                TOTAL = 0;
                SUBTOTIT = 0;
                END
            SELECT STAND_COD FROM STANDS WHERE ARTI_COD = :ARTICULO AND STAND_BODEGA = :boditem INTO :stand;
            factcant = NULL;
            SELECT FIRST 1 UNAR_FACCAN FROM unidad_articulo WHERE ARTI_COD = :articulo INTO :factcant;
            if ((factcant IS NULL) or (factcant = 0)) then
                BEGIN
                ALTERNATIVAS = 0;
                PRINCIPALES = (CANT * FACTOR);
                END
            ELSE
                BEGIN
                ALTERNATIVAS = FLOOR(CANT * factor / factcant);
                PRINCIPALES = (CANT * FACTOR) - (alternativas * factcant);
                END
            SUSPEND;
            END
          END
    END
END
^

SET TERM ; ^


/* 20110106 */
/* no avisar de existencias insuficentes al digitar, solo al grabar */
INSERT INTO CONFIGURACION (CONF_MODULO, CONF_CATEGORIA, CONF_PROPIEDAD, CONF_VALOR, CONF_POSIBLES, CONF_AYUDA) VALUES ('INVENTARIO', 'ENSAMBLES', 'VERIFICAR EXISTENCIAS AL DIGITAR CANTIDADES Y UNIDADES', 'NO', 'SI,NO', 'SI:Se avisa de existencias insuficientes al momento de cambiar una cantidad o unidad del producto o componentes. NO:Sólo se validan existencias al intentar grabar el documento para minimizar las alertas');
commit work;


update revision set revi_FECHA = '2011/01/06';
COMMIT WORK;


/* CAMPOS DE NOMINA */
/******************************************************************************/
/****                               Domains                                ****/
/******************************************************************************/

CREATE DOMAIN ANO AS
CHAR(4) CHARACTER SET NONE;

CREATE DOMAIN BOOLEANO AS
CHAR(1) CHARACTER SET NONE;

CREATE DOMAIN CENTRO AS
VARCHAR(4) CHARACTER SET NONE;

CREATE DOMAIN CTACONTA AS
VARCHAR(20) CHARACTER SET NONE;

CREATE DOMAIN ENTERO AS
SMALLINT;

CREATE DOMAIN EXPLICA AS
VARCHAR(255) CHARACTER SET NONE;

CREATE DOMAIN FECHA AS
DATE;

CREATE DOMAIN ID AS
INTEGER;

CREATE DOMAIN MES AS
SMALLINT;

CREATE DOMAIN MONTO AS
NUMERIC(18,2);

CREATE DOMAIN NIT AS
VARCHAR(20) CHARACTER SET NONE;

CREATE DOMAIN NOMBRE AS
VARCHAR(60) CHARACTER SET NONE;

CREATE DOMAIN NUMERO AS
VARCHAR(6) CHARACTER SET NONE;

CREATE DOMAIN PORCENTAJE AS
NUMERIC(9,4);

CREATE DOMAIN PREFIJO AS
VARCHAR(4) CHARACTER SET NONE;

CREATE DOMAIN SEXO AS
CHAR(1) CHARACTER SET NONE;



/******************************************************************************/
/****                              Generators                              ****/
/******************************************************************************/

CREATE GENERATOR ID_CONSNO;
SET GENERATOR ID_CONSNO TO 0;

CREATE GENERATOR ID_CONSNOPROV;
SET GENERATOR ID_CONSNOPROV TO 50;

CREATE GENERATOR ID_NOMINA;
SET GENERATOR ID_NOMINA TO 0;

CREATE GENERATOR ID_NOMI_NOVEDADES;
SET GENERATOR ID_NOMI_NOVEDADES TO 0;

CREATE GENERATOR ID_PAGONOMI;
SET GENERATOR ID_PAGONOMI TO 0;

CREATE GENERATOR ID_PGAPORT;
SET GENERATOR ID_PGAPORT TO 0;

CREATE GENERATOR ID_RETENCIONES;
SET GENERATOR ID_RETENCIONES TO 0;

CREATE GENERATOR ID_PRESTAMOS;
SET GENERATOR ID_PRESTAMOS TO 0;

/******************************************************************************/
/****                              Exceptions                              ****/
/******************************************************************************/

CREATE EXCEPTION NOMINA_CON_PAGO 'La nómina ya registra un pago';

CREATE EXCEPTION NOMINA_REGISTRADA 'Ya existe una liquidación para este periodo y año';



SET TERM ^ ; 



/******************************************************************************/
/****                          Stored Procedures                           ****/
/******************************************************************************/

CREATE PROCEDURE CAMBIE_ID_NOMINA
RETURNS (
    ID INTEGER)
AS
BEGIN
  EXIT;
END^


CREATE PROCEDURE CAMBIE_ID_PAGO_NOMINA
RETURNS (
    ID INTEGER)
AS
BEGIN
  EXIT;
END^


CREATE PROCEDURE CAMBIE_ID_PRESTAMOS
RETURNS (
    ID INTEGER)
AS
BEGIN
  EXIT;
END^


CREATE PROCEDURE CAUSA_NOMINA (
    FEC DATE,
    PERIODO INTEGER,
    PERIODICIDAD INTEGER,
    PAGOGLOBAL CHAR(1) CHARACTER SET NONE,
    ANO CHAR(4) CHARACTER SET NONE)
RETURNS (
    IDNOMINA INTEGER)
AS
BEGIN
  EXIT;
END^


CREATE PROCEDURE CONSOLIDA_CONC_NOMINA (
    ID_NOMINA INTEGER,
    TIPPAGO INTEGER)
AS
BEGIN
  EXIT;
END^


CREATE PROCEDURE CONSOLIDA_CONC_NOMINA_PROV (
    ID_NOMINA INTEGER,
    TIPPAGO INTEGER)
AS
BEGIN
  EXIT;
END^


CREATE PROCEDURE CONTABIL_NOMINA (
    IDDOC INTEGER)
RETURNS (
    ERROR INTEGER,
    IDC INTEGER)
AS
BEGIN
  EXIT;
END^


CREATE PROCEDURE CONTABIL_PAGONOMI (
    IDDOC INTEGER)
AS
BEGIN
  EXIT;
END^


CREATE PROCEDURE DIAS_LABORADOS (
    NITEMPL VARCHAR(20) CHARACTER SET NONE,
    PERIODO INTEGER)
RETURNS (
    TOTALDIASLAB INTEGER)
AS
BEGIN
  EXIT;
END^


CREATE PROCEDURE EGRESO_NOMINA (
    IDNOMINA INTEGER,
    PGLOBAL CHAR(1) CHARACTER SET NONE,
    NITBENE VARCHAR(20) CHARACTER SET NONE,
    FECHAEGR DATE,
    PREF VARCHAR(4) CHARACTER SET NONE,
    NUMEROEGR VARCHAR(6) CHARACTER SET NONE,
    CONCEPTO VARCHAR(60) CHARACTER SET NONE,
    OBSERVACIONES BLOB SUB_TYPE 0 SEGMENT SIZE 80,
    NOMBREBENE VARCHAR(60) CHARACTER SET NONE,
    CAJA INTEGER,
    USUARIOEGR VARCHAR(10) CHARACTER SET NONE,
    PAGO CHAR(1) CHARACTER SET NONE,
    CUENTAID INTEGER,
    FECHAEGRBNCO DATE,
    PREFEGREBNCO VARCHAR(4) CHARACTER SET NONE,
    NUMEROEGREBNCO VARCHAR(6) CHARACTER SET NONE,
    BENEBNCO VARCHAR(60) CHARACTER SET NONE,
    CONCEPTOBNCO VARCHAR(60) CHARACTER SET NONE,
    GMF CHAR(1) CHARACTER SET NONE,
    FORMAPAGOID INTEGER,
    CAJABNCO VARCHAR(2) CHARACTER SET NONE,
    CAJABNCOCUENTA VARCHAR(20) CHARACTER SET NONE,
    CAJABNCONUMEROEGR VARCHAR(20) CHARACTER SET NONE,
    FORMULARIO VARCHAR(10) CHARACTER SET NONE)
AS
BEGIN
  EXIT;
END^


CREATE PROCEDURE IMPR_PLANILLA_NOMINA (
    ID INTEGER)
RETURNS (
    FECHA DATE,
    OBSERVACIONES BLOB SUB_TYPE 0 SEGMENT SIZE 80,
    PAGOGLOBAL CHAR(1) CHARACTER SET NONE,
    PERIODO INTEGER,
    ANO CHAR(4) CHARACTER SET NONE,
    PERIODICIDAD VARCHAR(60) CHARACTER SET NONE,
    NITEMPL VARCHAR(20) CHARACTER SET NONE,
    VALOR NUMERIC(18,2),
    DEDUC CHAR(1) CHARACTER SET NONE,
    NOMBREEMPL VARCHAR(60) CHARACTER SET NONE,
    NOMCORTCONC VARCHAR(60) CHARACTER SET NONE,
    NOMBRECONC VARCHAR(60) CHARACTER SET NONE,
    CODCONC INTEGER,
    PROV CHAR(1) CHARACTER SET NONE)
AS
BEGIN
  EXIT;
END^


CREATE PROCEDURE LIQUIDA_HORAS_EXTRA (
    NIT VARCHAR(20) CHARACTER SET NONE,
    ID INTEGER,
    HD SMALLINT,
    HN SMALLINT,
    HFD SMALLINT,
    HFN SMALLINT,
    ANO CHAR(4) CHARACTER SET NONE)
AS
BEGIN
  EXIT;
END^


CREATE PROCEDURE LIQUIDACION_APORTES (
    ID_NOMINA_1 INTEGER,
    ID_NOMINA_2 INTEGER,
    ID_NOMINA_3 INTEGER,
    ID_NOMINA_4 INTEGER,
    ID_NOMINA_5 INTEGER,
    ID_NOMINA_6 INTEGER,
    ID_NOMINA_7 INTEGER,
    INTMORA NUMERIC(18,2),
    FECHA DATE,
    PAGO CHAR(1) CHARACTER SET NONE,
    NITBENE VARCHAR(20) CHARACTER SET NONE,
    FECHAEGR DATE,
    PREF VARCHAR(4) CHARACTER SET NONE,
    NUMEROEGR VARCHAR(6) CHARACTER SET NONE,
    CONCEPTO VARCHAR(60) CHARACTER SET NONE,
    OBSERVACIONES BLOB SUB_TYPE 0 SEGMENT SIZE 80,
    NOMBREBENE VARCHAR(60) CHARACTER SET NONE,
    CAJA INTEGER,
    USUARIOEGR VARCHAR(10) CHARACTER SET NONE,
    CUENTAID INTEGER,
    FECHAEGRBNCO DATE,
    PREFEGREBNCO VARCHAR(4) CHARACTER SET NONE,
    NUMEROEGREBNCO VARCHAR(6) CHARACTER SET NONE,
    BENEBNCO VARCHAR(60) CHARACTER SET NONE,
    CONCEPTOBNCO VARCHAR(60) CHARACTER SET NONE,
    GMF CHAR(1) CHARACTER SET NONE,
    FORMAPAGOID INTEGER,
    CAJABNCO VARCHAR(2) CHARACTER SET NONE,
    CAJABNCOCUENTA VARCHAR(20) CHARACTER SET NONE,
    CAJABNCONUMEROEGR VARCHAR(20) CHARACTER SET NONE,
    FORMULARIO VARCHAR(10) CHARACTER SET NONE)
AS
BEGIN
  EXIT;
END^


CREATE PROCEDURE NOVEDADESXPERIODO (
    ANO CHAR(4) CHARACTER SET NONE,
    MES INTEGER,
    VERPERI CHAR(1) CHARACTER SET NONE)
RETURNS (
    IDNONO INTEGER,
    NIT VARCHAR(20) CHARACTER SET NONE,
    NOMBRE VARCHAR(60) CHARACTER SET NONE,
    TIPONOVE VARCHAR(60) CHARACTER SET NONE,
    NUMPER INTEGER,
    DIA INTEGER,
    DURACION INTEGER,
    FECHANO DATE)
AS
BEGIN
  EXIT;
END^


CREATE PROCEDURE PAGO_NOMINA_XEMPL (
    IDDOC INTEGER)
RETURNS (
    NITEMPL VARCHAR(20) CHARACTER SET NONE,
    NOMBREEMPL VARCHAR(60) CHARACTER SET NONE,
    DEVENGOS NUMERIC(18,2),
    DEDUCIBLES NUMERIC(18,2),
    TOTAL NUMERIC(18,2),
    PAGAR CHAR(1) CHARACTER SET NONE)
AS
BEGIN
  EXIT;
END^


CREATE PROCEDURE PLANILLA_NOMINA_NOVEDADES (
    ID INTEGER)
RETURNS (
    NOVDIAINI INTEGER,
    NOVDURACION INTEGER,
    NOVVALOR NUMERIC(18,2),
    NOVTIPOADMINISTRADORA CHAR(3) CHARACTER SET NONE,
    NOVNVAADMIN VARCHAR(20) CHARACTER SET NONE,
    NOMNOVEDAD VARCHAR(60) CHARACTER SET NONE,
    NITDETALLE VARCHAR(20) CHARACTER SET NONE,
    NOMEMPL VARCHAR(60) CHARACTER SET NONE)
AS
BEGIN
  EXIT;
END^


CREATE PROCEDURE REP_EMPLEADOS (
    DESDE VARCHAR(20) CHARACTER SET NONE,
    HASTA VARCHAR(20) CHARACTER SET NONE,
    AGRUPA CHAR(1) CHARACTER SET NONE,
    AGRDESDE VARCHAR(20) CHARACTER SET NONE,
    AGRHASTA VARCHAR(20) CHARACTER SET NONE,
    CUMPLEANOS CHAR(1) CHARACTER SET NONE,
    FECHA DATE)
RETURNS (
    TERC_NIT VARCHAR(20) CHARACTER SET NONE,
    NOMBREEMPL VARCHAR(60) CHARACTER SET NONE,
    EMPL_FECNAC DATE,
    EMPL_FECING DATE,
    EMPL_SALARIO NUMERIC(18,2),
    EMPL_SALINTEG CHAR(1) CHARACTER SET NONE,
    EMPL_SALVAR CHAR(1) CHARACTER SET NONE,
    EMPL_CARGO VARCHAR(60) CHARACTER SET NONE,
    EMPL_SUCUR INTEGER,
    NOMEPS VARCHAR(60) CHARACTER SET NONE,
    NOMARP VARCHAR(60) CHARACTER SET NONE,
    EMPL_EXTRANJ CHAR(1) CHARACTER SET NONE,
    EMPL_AFPESP INTEGER,
    EMPL_AFPVOLTR CHAR(1) CHARACTER SET NONE,
    EMPL_AFPVOLTRAPOR NUMERIC(18,2),
    EMPL_AFPVOLEM CHAR(1) CHARACTER SET NONE,
    EMPL_AFPVOLEMAPOR NUMERIC(18,2),
    NOMAFC VARCHAR(60) CHARACTER SET NONE,
    EMPL_AUXTR CHAR(1) CHARACTER SET NONE,
    EMPL_CUENTA VARCHAR(25) CHARACTER SET NONE,
    EMPL_FOTO BLOB SUB_TYPE 0 SEGMENT SIZE 80,
    NOMCCF VARCHAR(60) CHARACTER SET NONE,
    NOMAFP VARCHAR(60) CHARACTER SET NONE,
    NOMBRETICO VARCHAR(60) CHARACTER SET NONE,
    NOMBRESUBTI VARCHAR(60) CHARACTER SET NONE,
    NOMDEPTO VARCHAR(60) CHARACTER SET NONE,
    NOMSECCION VARCHAR(60) CHARACTER SET NONE,
    NOMAREA VARCHAR(60) CHARACTER SET NONE,
    SEXO CHAR(20) CHARACTER SET NONE,
    ESTADOCIVIL VARCHAR(20) CHARACTER SET NONE,
    NOMBREPER VARCHAR(20) CHARACTER SET NONE,
    NOMBREBNCO VARCHAR(60) CHARACTER SET NONE,
    NOMFORMPAGO VARCHAR(20) CHARACTER SET NONE,
    NOMTIPOCTA VARCHAR(20) CHARACTER SET NONE,
    DIRECCION VARCHAR(60) CHARACTER SET NONE,
    TELEFONO VARCHAR(40) CHARACTER SET NONE,
    EMPL_DPTO INTEGER,
    NOMSUCUR VARCHAR(60) CHARACTER SET NONE,
    MAIL VARCHAR(100) CHARACTER SET NONE,
    CEL VARCHAR(25) CHARACTER SET NONE,
    OBSERVACIONES BLOB SUB_TYPE 0 SEGMENT SIZE 80,
    FOTO BLOB SUB_TYPE 0 SEGMENT SIZE 80,
    FECCUMPLE VARCHAR(10) CHARACTER SET NONE)
AS
BEGIN
  EXIT;
END^

SET TERM ; ^


/******************************************************************************/
/****                                Tables                                ****/
/******************************************************************************/



CREATE TABLE ADMINISTRADORA (
    ADMI_EPS     BOOLEANO,
    ADMI_ARP     BOOLEANO,
    ADMI_AFP     BOOLEANO,
    ADMI_CCF     BOOLEANO,
    ADMI_INTDIA  BOOLEANO,
    ADMI_COD     VARCHAR(20) CHARACTER SET NONE,
    ADMI_CTACXP  CTACONTA,
    TERC_NIT     T_NIT NOT NULL,
    ADMI_AFC     BOOLEANO
);


CREATE TABLE AFP_ESPECIAL (
    AFPE_ID      ID NOT NULL,
    AFPE_NOMBRE  NOMBRE,
    AFPE_TARIFA  PORCENTAJE
);


CREATE TABLE ANTICIPOS_NOMINA (
    ANNO_ID       ID NOT NULL,
    TERC_NIT      NIT NOT NULL,
    ANNO_FECHA    FECHA NOT NULL,
    ANNO_PAGOID   ID NOT NULL,
    ANNO_VALOR    MONTO,
    ANNO_PAGADO   BOOLEANO,
    ANNO_PERIODO  INTEGER NOT NULL
);


CREATE TABLE AREA (
    DPTO_COD     ID NOT NULL,
    SECC_COD     ID NOT NULL,
    AREA_COD     ID NOT NULL,
    AREA_NOMBRE  NOMBRE NOT NULL
);


CREATE TABLE CESANTIA_DETALLE (
    CESA_ID     ID NOT NULL,
    TERC_NIT    NIT,
    CSDE_DIAS   SMALLINT,
    CSDE_VALOR  MONTO,
    CDSE_AFC    ID NOT NULL
);


CREATE TABLE CESANTIAS (
    CESA_ID     ID NOT NULL,
    CESA_ANO    ANO NOT NULL,
    CESA_FECHA  FECHA
);


CREATE TABLE CESANTIAS_RETIROS (
    TERC_NIT      NIT NOT NULL,
    CESR_FECHA    FECHA NOT NULL,
    CESR_MONTO    MONTO,
    CESR_MOTIVO   ID,
    CESR_EXPLICA  EXPLICA,
    CESR_AFC      ID
);


CREATE TABLE CONCEPTOS_NOMINA (
    CONC_COD          ID NOT NULL,
    CONC_NOMBRE       NOMBRE,
    CONC_DEDUC        BOOLEANO,
    CONC_FECINI       FECHA,
    CONC_FECFIN       FECHA,
    CONC_PORC         PORCENTAJE,
    CONC_BASE         ID,
    CONC_ENTIDAD      ID,
    CONC_MONTO        MONTO,
    CONC_CTAGAST      CTACONTA,
    CONC_DIAS         BOOLEANO,
    CONC_MODIFI       BOOLEANO,
    CONC_DIAPAGO      INTEGER,
    CONC_PROMEDIO     BOOLEANO,
    CONC_TODOSPER     BOOLEANO,
    CONC_PROV         BOOLEANO,
    CONC_PERACTUAL    BOOLEANO,
    CONC_APORTE       CHAR(1) CHARACTER SET NONE,
    CONC_APLICAPROM   BOOLEANO,
    CONC_PERPROMEDIO  INTEGER,
    CONC_OTROCONC     BOOLEANO,
    CONC_CODOTROCONC  ID,
    CONC_SALARIO      BOOLEANO,
    CONC_CTACXP       CTACONTA,
    CONC_NOMCORTO     NOMBRE,
    CONC_PERIODOS     CHAR(1) CHARACTER SET NONE
);


CREATE TABLE CONSOLIDADO_NOMINA (
    CONO_ID            INTEGER NOT NULL,
    CONO_ITEM          ID NOT NULL,
    CONO_TIPODES       INTEGER,
    CONO_TIPOORI       INTEGER,
    CONO_IDDES         INTEGER,
    CONO_IDORI         INTEGER,
    CONO_PERIODO       INTEGER,
    CONO_ANO           ANO,
    CONO_VALOR         MONTO,
    CONO_ABONO         MONTO,
    CONO_PAGOOK        BOOLEANO,
    TERC_NIT           NIT,
    CONC_COD           VARCHAR(5) CHARACTER SET NONE,
    CONO_PERIODICIDAD  INTEGER,
    CONO_DEDUC         BOOLEANO,
    CONO_PROV          BOOLEANO,
    CONO_APORTE        BOOLEANO
);


CREATE TABLE CONSOLIDADO_NOMINA_PROV (
    COPO_ID            INTEGER NOT NULL,
    COPO_ITEM          ID NOT NULL,
    COPO_TIPODES       INTEGER,
    COPO_TIPOORI       INTEGER,
    COPO_IDDES         INTEGER,
    COPO_IDORI         INTEGER,
    COPO_PERIODO       INTEGER,
    COPO_ANO           ANO,
    COPO_VALOR         MONTO,
    COPO_ABONO         MONTO,
    COPO_PAGOOK        BOOLEANO,
    TERC_NIT           NIT,
    CONC_COD           VARCHAR(5) CHARACTER SET NONE,
    COPO_PERIODICIDAD  INTEGER,
    COPO_DEDUC         BOOLEANO,
    COPO_PROV          BOOLEANO,
    COPO_APORTE        BOOLEANO
);


CREATE TABLE DEPARTAMENTO (
    DPTO_COD     ID NOT NULL,
    DPTO_NOMBRE  NOMBRE NOT NULL,
    DPTO_PROY    CENTRO,
    DPTO_CENTRO  CENTRO,
    DPTO_TARARP  PORCENTAJE
);


CREATE TABLE EMPLEADO_BENEFICIARIOS (
    TERC_NIT        NIT NOT NULL,
    EMBE_ITEM       ID NOT NULL,
    EMBE_TIPOID     ID,
    EMBE_DOCID      NIT,
    EMBE_APELLIDO1  NOMBRE,
    EMBE_APELLIDO2  NOMBRE,
    EMBE_NOMBRE1    NOMBRE,
    EMBE_NOMBRE2    NOMBRE,
    EMBE_SEXO       SEXO,
    EMBE_PARENT     CHAR(1) CHARACTER SET NONE,
    EMBE_FECNAC     FECHA,
    EMBE_DIR        NOMBRE,
    EMBE_TEL        NOMBRE
);


CREATE TABLE EMPLEADO_CONCEPTOS (
    TERC_NIT         NIT NOT NULL,
    CONC_COD         ID NOT NULL,
    EMCO_FECINI      FECHA,
    EMCO_FECFIN      FECHA,
    EMCO_MONTO       MONTO,
    EMCO_PORC        PORCENTAJE,
    EMPL_ENTIDAD     NIT,
    EMCO_PPAGO       INTEGER,
    EMCO_PERPROM     INTEGER,
    EMCO_APLICPROM   BOOLEANO,
    EMCO_LUQUIDAPER  INTEGER,
    EMCO_MENSUAL     BOOLEANO
);


CREATE TABLE EMPLEADO_FORMACION (
    TERC_NIT        NIT NOT NULL,
    EMFO_ITEM       ID NOT NULL,
    NIVI_COD        ID NOT NULL,
    EMFO_TITULO     NOMBRE,
    EMFO_INSTITUTO  NOMBRE,
    EMFO_ANO        ANO
);


CREATE TABLE EMPLEADO_LLAMADOS (
    TERC_NIT       NIT NOT NULL,
    EMLL_ITEM      ID NOT NULL,
    LLAT_COD       ID NOT NULL,
    EMLL_FECHA     FECHA,
    EMLL_EXPLICA   VARCHAR(255) CHARACTER SET NONE,
    EMLL_DESCARGO  VARCHAR(255) CHARACTER SET NONE
);


CREATE TABLE EMPLEADOS (
    TERC_NIT           NIT NOT NULL,
    TCOT_COD           ID,
    STCO_COD           ID,
    EMPL_FECING        FECHA,
    EMPL_FECNAC        FECHA,
    EMPL_FECRET        FECHA,
    EMPL_SALARIO       MONTO,
    EMPL_SALINTEG      BOOLEANO,
    EMPL_SALVAR        BOOLEANO,
    EMPL_SEXO          SEXO,
    EMPL_ESTCIVIL      CHAR(1) CHARACTER SET NONE,
    EMPL_CARGO         NOMBRE,
    EMPL_PPAGO         ID,
    EMPL_SUCUR         ID,
    EMPL_DPTO          ID,
    EMPL_SECC          ID,
    EMPL_AREA          ID,
    EMPL_EPS           NIT,
    EMPL_UPCADIC       MONTO,
    EMPL_ARP           NIT,
    EMPL_AFP           NIT,
    EMPL_EXTRANJ       BOOLEANO,
    EMPL_AFPESP        ID,
    EMPL_AFPVOLTR      BOOLEANO,
    EMPL_AFPVOLTRAPOR  MONTO,
    EMPL_AFPVOLNORET   MONTO,
    EMPL_AFPVOLEM      BOOLEANO,
    EMPL_AFPVOLEMAPOR  MONTO,
    EMPL_AFC           ID,
    EMPL_AUXTR         BOOLEANO,
    EMPL_BANCO         ID,
    EMPL_CUENTA        VARCHAR(25) CHARACTER SET NONE,
    EMPL_TIPOCTA       CHAR(1) CHARACTER SET NONE,
    EMPL_OBS           BLOB SUB_TYPE 0 SEGMENT SIZE 80,
    EMPL_FOTO          BLOB SUB_TYPE 0 SEGMENT SIZE 80,
    EMPL_FORMPAGO      CHAR(1) CHARACTER SET NONE,
    EMPL_CCF           NIT
);


CREATE TABLE INCAPACIDADES (
    TERC_NIT      NIT NOT NULL,
    INCA_ID       ID NOT NULL,
    INCA_ADMIN    ID NOT NULL,
    INCA_TIPOADM  CHAR(1) CHARACTER SET NONE,
    INCA_NUMERO   NUMERO NOT NULL,
    INCA_ANO      ANO,
    INCA_MES      MES,
    INCA_TIPO     CHAR(1) CHARACTER SET NONE,
    INCA_VALOR    MONTO,
    INCA_VROTROS  MONTO
);


CREATE TABLE INTERFAZ_NOMINA (
    INNO_ID         T_ID NOT NULL,
    TIDO_COD        INTEGER,
    INNO_NOMBRE     T_CONCEPTO,
    TICO_COD        T_TIPO_COMP,
    PRCO_PRE        VARCHAR(4) CHARACTER SET NONE,
    INNO_CONFIRMAR  T_BOOLEANO,
    INNO_USUARIO    T_USUARIO,
    INNO_DET        BOOLEANO
);


CREATE TABLE LIQUIDACION (
    TERC_NIT         NIT NOT NULL,
    LIQD_ID          ID NOT NULL,
    LIQD_FECHA       FECHA NOT NULL,
    LIQD_TRABAJADOR  BOOLEANO,
    LIQD_MOTIVO      NOMBRE,
    LIQD_SALARIO     MONTO,
    LIQD_PRIMA       MONTO,
    LIQD_CESANTIA    MONTO,
    LIQD_INTCES      MONTO,
    LIQD_VACACION    MONTO,
    LIQD_AUXTR       MONTO,
    LIQD_COMIS       MONTO,
    LIQD_INDEM       MONTO,
    LIQD_DVOTROS     MONTO,
    LIQD_APEPS       MONTO,
    LIQD_APAFP       MONTO,
    LIQD_APFSP       MONTO,
    LIQD_DSAPORTE    MONTO,
    LIQD_DSPRESTAMO  MONTO,
    LIQD_DSANTICIPO  MONTO,
    LIQD_DSOTROS     MONTO,
    LIQD_PAGO        BOOLEANO
);


CREATE TABLE LLAMADOS_ATENCION (
    LLAT_COD     ID NOT NULL,
    LLAT_NOMBRE  NOMBRE
);


CREATE TABLE NIVEL_FORMACION (
    NIVI_COD     ID NOT NULL,
    NIVI_NOMBRE  NOMBRE NOT NULL
);


CREATE TABLE NOMINA (
    NOMI_ID            ID NOT NULL,
    NOMI_FECCAUSA      FECHA,
    NOMI_OBS           BLOB SUB_TYPE 0 SEGMENT SIZE 80,
    NOMI_PAGOGLOBAL    BOOLEANO,
    NOMI_PERIODOCIDAD  ID,
    NOMI_PERIODO       ID,
    NOMI_ANO           ANO,
    NOMI_LIQOK         BOOLEANO,
    NOMI_APOROK        CHAR(1) CHARACTER SET NONE,
    NOMI_PAGOOK        BOOLEANO
);


CREATE TABLE NOMINA_CONCEPTOS (
    NOMI_ID          ID NOT NULL,
    NOCO_ITEM        ID NOT NULL,
    CONC_COD         ID,
    TERC_NIT         NIT,
    NOCO_VALOR       MONTO,
    NOCO_ENTIDAD     NIT,
    NOCO_DEDUC       CHAR(1) CHARACTER SET NONE,
    NOCO_PROV        CHAR(1) CHARACTER SET NONE,
    NOCO_APORTE      BOOLEANO,
    NOCO_PAGOOK      BOOLEANO,
    NOCO_PERIODO     INTEGER,
    NOCO_ANO         ANO NOT NULL,
    NOCO_MOD         BOOLEANO,
    NOCO_APLICAPROM  BOOLEANO,
    NOCO_SALARIO     BOOLEANO
);


CREATE TABLE NOMINA_DETALLE (
    NOMI_ID        ID NOT NULL,
    TERC_NIT       NIT NOT NULL,
    NODE_HORASDI   ENTERO,
    NODE_HORASNO   ENTERO,
    NODE_HORASFD   ENTERO,
    NODE_HORASFN   ENTERO,
    NODE_EXTRAS    MONTO,
    NODE_OTROSDEV  MONTO,
    NODE_PRESTA    MONTO,
    NODE_OTROSDES  MONTO,
    NODE_RETEN     MONTO,
    NODE_ANO       ANO
);


CREATE TABLE NOMINA_NOVEDADES (
    NONO_ID          ID NOT NULL,
    TERC_NIT         NIT NOT NULL,
    TNOV_COD         CHAR(3) CHARACTER SET NONE NOT NULL,
    NONO_DIAINI      SMALLINT,
    NONO_DURA        SMALLINT,
    NONO_VALOR       MONTO,
    NONO_TIPOADM     CHAR(3) CHARACTER SET NONE,
    NONO_NVAADM      NIT,
    NONO_TIPOINCAP   BOOLEANO,
    NONO_VRAPORTEEM  MONTO,
    NONO_VRAPORTETR  MONTO,
    NONO_VRNORET     MONTO,
    NONO_PERIODO     ID,
    NONO_ANO         ANO,
    NONO_PPAGO       BOOLEANO NOT NULL,
    NONO_FECHA       FECHA,
    NONO_PRORROGA    BOOLEANO,
    NONO_OK          BOOLEANO
);


CREATE TABLE PAGO_APORTES (
    PGAP_ID       ID NOT NULL,
    PGAP_ITEM     ID NOT NULL,
    PGAP_TIPOAP   CHAR(1) CHARACTER SET NONE,
    PGAP_CONPAGO  CHAR(2) CHARACTER SET NONE,
    PGAP_ADMIN    ID NOT NULL,
    PGAP_MONTO    MONTO,
    PGAP_INTMORA  MONTO
);


CREATE TABLE PAGO_APORTES_DETALLE (
    PGAP_ID          ID NOT NULL,
    PGAP_ITEM        INTEGER NOT NULL,
    PADE_ITEMDET     INTEGER NOT NULL,
    TERC_NIT         NIT,
    PADE_IBC         MONTO,
    PADE_COTOBL      MONTO,
    PADE_UPC         INTEGER,
    PADE_VALORNORET  MONTO
);


CREATE TABLE PAGO_NOMINA (
    PGNO_ID          ID NOT NULL,
    PGNO_FECHA       FECHA NOT NULL,
    PGNO_TIPOPAGO    CHAR(1) CHARACTER SET NONE,
    PGNO_EGREID      ID,
    PGNO_EGREPRE     PREFIJO,
    PGNO_EGRENUM     NUMERO,
    PGNO_MONTO       MONTO,
    PGNO_NOMINA      ID,
    PGNO_NIT         NIT,
    PGNO_FORMULARIO  VARCHAR(10) CHARACTER SET NONE,
    PGNO_ANT         BOOLEANO
);


CREATE TABLE PAGO_NOMINA_DET (
    PGNO_ID       ID NOT NULL,
    TERC_NIT      NIT,
    PGND_MONTO    MONTO,
    PGNO_ITEM     INTEGER NOT NULL,
    PGNO_TIPPAGO  CHAR(1) CHARACTER SET NONE
);


CREATE TABLE PARAMETROS_ANO (
    PAAN_ANO        ANO NOT NULL,
    PAAN_SALMINIMO  MONTO,
    PAAN_AUXTR      MONTO,
    PAAN_SENA       PORCENTAJE,
    PAAN_ICBF       PORCENTAJE,
    PAAN_CCF        PORCENTAJE,
    PAAN_EPSTR      PORCENTAJE,
    PAAN_EPSEM      PORCENTAJE,
    PAAN_EPSFON     PORCENTAJE,
    PAAN_AFPTR      PORCENTAJE,
    PAAN_AFPEM      PORCENTAJE,
    PAAN_AFPFON     PORCENTAJE,
    PAAN_AFPSMF     SMALLINT,
    PAAN_INTMORA    PORCENTAJE,
    PAAN_ARP        ID,
    PAAN_PEQAPOR    BOOLEANO,
    PAAN_HORASDI    PORCENTAJE,
    PAAN_HORASNO    PORCENTAJE,
    PAAN_HORASFD    PORCENTAJE,
    PAAN_HORASFN    PORCENTAJE,
    PAAN_TIPOAPORT  CHAR(1) CHARACTER SET NONE
);


CREATE TABLE PARENTESCO (
    PARE_COD     CHAR(1) CHARACTER SET NONE,
    PARE_NOM     VARCHAR(60) CHARACTER SET NONE,
    PARE_CODIGO  T_ID
);


CREATE TABLE PERIODO_PAGO (
    PPAG_COD      ID NOT NULL,
    PPAG_NOMBRE   NOMBRE NOT NULL,
    PPAG_PERIODO  ID,
    PPAG_DIAS     ID
);

ALTER TABLE PARAMETROS_ANO DROP PAAN_CESEMP;

ALTER TABLE PARAMETROS_ANO ADD PAAN_CESEMP NUMERIC(18,2);

CREATE TABLE PRESTAMO_CUOTAS (
    PRNO_ID       ID NOT NULL,
    PRCU_ITEM     ID NOT NULL,
    PRCU_MONTO    MONTO,
    PRCU_PERIODO  INTEGER,
    PRCU_ANO      ANO
);


CREATE TABLE PRESTAMO_NOMINA (
    PRNO_ID      ID NOT NULL,
    TERC_NIT     NIT NOT NULL,
    PRNO_FECHA   FECHA NOT NULL,
    PRNO_PAGOID  ID,
    PRNO_MONTO   MONTO,
    PRNO_CUOTAS  SMALLINT,
    PRNO_INTCES  T_PORCENTAJE
);


CREATE TABLE RETENCIONES (
    RETE_ITEM   ID NOT NULL,
    RETE_HASTA  MONTO,
    RETE_PORC   PORCENTAJE,
    RETE_MONTO  PORCENTAJE,
    RETE_DESDE  MONTO
);


CREATE TABLE SECCION (
    DPTO_COD     ID NOT NULL,
    SECC_COD     ID NOT NULL,
    SECC_NOM     NOMBRE,
    SECC_CTASAL  CTACONTA,
    SECC_CTAEXT  CTACONTA,
    SECC_CTAATR  CTACONTA,
    SECC_CTACOM  CTACONTA,
    SECC_CTAPRI  CTACONTA,
    SECC_CTACES  CTACONTA,
    SECC_CTAINT  CTACONTA
);


CREATE TABLE SUBTIPO_COTIZANTE (
    TCOT_COD     ID NOT NULL,
    STCO_COD     ID NOT NULL,
    STCO_NOMBRE  NOMBRE NOT NULL
);


CREATE TABLE TIPO_COTIZANTE (
    TCOT_COD     ID NOT NULL,
    TCOT_NOMBRE  NOMBRE NOT NULL
);


CREATE TABLE TIPOS_NOVEDAD (
    TNOV_COD       CHAR(3) CHARACTER SET NONE NOT NULL,
    TNOV_NOMBRE    NOMBRE,
    TNOV_CTACONTA  CTACONTA
);

/*CAMPO ADMINISTRADORA EN TABLA TERCEROS*/
ALTER TABLE TERCEROS ADD TERC_ADMINI CHAR(1);

CREATE TABLE VACACIONES (
    VACA_ID       ID NOT NULL,
    TERC_NIT      NIT NOT NULL,
    VACA_FECHA    FECHA NOT NULL,
    VACA_DIAS     SMALLINT,
    VACA_SALARIO  MONTO,
    VACA_PAGO     BOOLEANO,
    VACA_MONTO    MONTO
);

set term ^ ;

CREATE PROCEDURE CAMBIE_ID_NOVEDAD
RETURNS (
    IDN INTEGER)
AS
begin

end
^

ALTER PROCEDURE CAMBIE_ID_NOMINA
RETURNS (
    ID INTEGER)
AS
declare variable numrows integer;
BEGIN
NUMROWS = 1;
while (NUMROWS > 0) DO
    BEGIN
    ID = GEN_ID(id_nomina, 1);
    /* VERIFIQUE SI YA EXISTE */
    SELECT COUNT(*) FROM NOMINA WHERE NOMI_ID = :ID INTO :NUMROWS;
    END
SUSPEND;
END^

set term ; ^

INSERT INTO CONCEPTOS_NOMINA (CONC_COD, CONC_NOMBRE, CONC_DEDUC, CONC_FECINI, CONC_FECFIN, CONC_PORC, CONC_BASE, CONC_ENTIDAD, CONC_MONTO, CONC_CTAGAST, CONC_DIAS, CONC_MODIFI, CONC_DIAPAGO, CONC_PROMEDIO, CONC_TODOSPER, CONC_PROV, CONC_PERACTUAL, CONC_APORTE, CONC_APLICAPROM, CONC_PERPROMEDIO, CONC_OTROCONC, CONC_CODOTROCONC, CONC_SALARIO, CONC_CTACXP, CONC_NOMCORTO, CONC_PERIODOS) VALUES (7, 'PAGO INTERESES DE CESANTIAS', 'N', '2008-01-01', '2008-01-31', 8.3333, NULL, NULL, NULL, '520506', 'N', 'S', NULL, 'N', 'N', 'N', 'N', 'N', 'N', NULL, 'S', 6, 'N', '2515', 'PAGO INT.', NULL);
INSERT INTO CONCEPTOS_NOMINA (CONC_COD, CONC_NOMBRE, CONC_DEDUC, CONC_FECINI, CONC_FECFIN, CONC_PORC, CONC_BASE, CONC_ENTIDAD, CONC_MONTO, CONC_CTAGAST, CONC_DIAS, CONC_MODIFI, CONC_DIAPAGO, CONC_PROMEDIO, CONC_TODOSPER, CONC_PROV, CONC_PERACTUAL, CONC_APORTE, CONC_APLICAPROM, CONC_PERPROMEDIO, CONC_OTROCONC, CONC_CODOTROCONC, CONC_SALARIO, CONC_CTACXP, CONC_NOMCORTO, CONC_PERIODOS) VALUES (1, 'SUELDO', 'N', '2008-01-01', '2008-12-31', 0, NULL, NULL, NULL, '520506', 'S', 'S', NULL, 'N', 'S', 'N', 'N', 'N', 'S', NULL, 'N', 0, 'S', '2505', 'SUELDO', NULL);
INSERT INTO CONCEPTOS_NOMINA (CONC_COD, CONC_NOMBRE, CONC_DEDUC, CONC_FECINI, CONC_FECFIN, CONC_PORC, CONC_BASE, CONC_ENTIDAD, CONC_MONTO, CONC_CTAGAST, CONC_DIAS, CONC_MODIFI, CONC_DIAPAGO, CONC_PROMEDIO, CONC_TODOSPER, CONC_PROV, CONC_PERACTUAL, CONC_APORTE, CONC_APLICAPROM, CONC_PERPROMEDIO, CONC_OTROCONC, CONC_CODOTROCONC, CONC_SALARIO, CONC_CTACXP, CONC_NOMCORTO, CONC_PERIODOS) VALUES (2, 'AUXILIO DE TRANSPORTE', 'N', '2008-01-01', '2008-12-31', 0, NULL, NULL, 55000, '520527', 'S', 'S', NULL, 'N', 'S', 'N', 'N', 'N', 'N', NULL, 'N', 0, 'N', '2505', 'AUX TRANS.', NULL);
INSERT INTO CONCEPTOS_NOMINA (CONC_COD, CONC_NOMBRE, CONC_DEDUC, CONC_FECINI, CONC_FECFIN, CONC_PORC, CONC_BASE, CONC_ENTIDAD, CONC_MONTO, CONC_CTAGAST, CONC_DIAS, CONC_MODIFI, CONC_DIAPAGO, CONC_PROMEDIO, CONC_TODOSPER, CONC_PROV, CONC_PERACTUAL, CONC_APORTE, CONC_APLICAPROM, CONC_PERPROMEDIO, CONC_OTROCONC, CONC_CODOTROCONC, CONC_SALARIO, CONC_CTACXP, CONC_NOMCORTO, CONC_PERIODOS) VALUES (3, 'APORTE SALUD EMPLEADO', 'S', '2008-01-01', '2008-12-31', 4, NULL, NULL, NULL, '2505', 'N', 'S', 1, 'N', 'S', 'N', 'N', 'N', 'N', NULL, 'N', 0, 'N', '510569', 'EPS TRAB.', NULL);
INSERT INTO CONCEPTOS_NOMINA (CONC_COD, CONC_NOMBRE, CONC_DEDUC, CONC_FECINI, CONC_FECFIN, CONC_PORC, CONC_BASE, CONC_ENTIDAD, CONC_MONTO, CONC_CTAGAST, CONC_DIAS, CONC_MODIFI, CONC_DIAPAGO, CONC_PROMEDIO, CONC_TODOSPER, CONC_PROV, CONC_PERACTUAL, CONC_APORTE, CONC_APLICAPROM, CONC_PERPROMEDIO, CONC_OTROCONC, CONC_CODOTROCONC, CONC_SALARIO, CONC_CTACXP, CONC_NOMCORTO, CONC_PERIODOS) VALUES (4, 'AFP EMPLEADO', 'S', '2008-01-01', '2008-12-31', 3.875, NULL, NULL, NULL, '2505', 'N', 'S', 1, 'N', 'S', 'N', 'N', 'N', 'N', NULL, 'N', 0, 'N', '510570', 'AFP TRAB.', NULL);
INSERT INTO CONCEPTOS_NOMINA (CONC_COD, CONC_NOMBRE, CONC_DEDUC, CONC_FECINI, CONC_FECFIN, CONC_PORC, CONC_BASE, CONC_ENTIDAD, CONC_MONTO, CONC_CTAGAST, CONC_DIAS, CONC_MODIFI, CONC_DIAPAGO, CONC_PROMEDIO, CONC_TODOSPER, CONC_PROV, CONC_PERACTUAL, CONC_APORTE, CONC_APLICAPROM, CONC_PERPROMEDIO, CONC_OTROCONC, CONC_CODOTROCONC, CONC_SALARIO, CONC_CTACXP, CONC_NOMCORTO, CONC_PERIODOS) VALUES (912, 'CESANTIAS ADMIN', 'N', '2008-01-01', '2008-12-31', 8.3333, NULL, NULL, NULL, '510530', 'N', 'S', NULL, 'N', 'S', 'S', 'N', 'S', 'N', NULL, 'N', 0, 'N', '261005', 'CESANTIAS', NULL);
INSERT INTO CONCEPTOS_NOMINA (CONC_COD, CONC_NOMBRE, CONC_DEDUC, CONC_FECINI, CONC_FECFIN, CONC_PORC, CONC_BASE, CONC_ENTIDAD, CONC_MONTO, CONC_CTAGAST, CONC_DIAS, CONC_MODIFI, CONC_DIAPAGO, CONC_PROMEDIO, CONC_TODOSPER, CONC_PROV, CONC_PERACTUAL, CONC_APORTE, CONC_APLICAPROM, CONC_PERPROMEDIO, CONC_OTROCONC, CONC_CODOTROCONC, CONC_SALARIO, CONC_CTACXP, CONC_NOMCORTO, CONC_PERIODOS) VALUES (5, 'INT. DE CESANTIAS ADMIN', 'N', '2008-01-01', '2008-01-31', 8.3333, NULL, NULL, NULL, '510533', 'N', 'S', NULL, 'N', 'S', 'S', 'N', 'N', 'N', NULL, 'N', 0, 'N', '261005', 'INT. CESAN.', NULL);
INSERT INTO CONCEPTOS_NOMINA (CONC_COD, CONC_NOMBRE, CONC_DEDUC, CONC_FECINI, CONC_FECFIN, CONC_PORC, CONC_BASE, CONC_ENTIDAD, CONC_MONTO, CONC_CTAGAST, CONC_DIAS, CONC_MODIFI, CONC_DIAPAGO, CONC_PROMEDIO, CONC_TODOSPER, CONC_PROV, CONC_PERACTUAL, CONC_APORTE, CONC_APLICAPROM, CONC_PERPROMEDIO, CONC_OTROCONC, CONC_CODOTROCONC, CONC_SALARIO, CONC_CTACXP, CONC_NOMCORTO, CONC_PERIODOS) VALUES (6, 'SALARIO INTEGRAL 70%', 'N', '2008-01-01', '2008-12-31', 0, NULL, NULL, NULL, '510503', 'S', 'S', NULL, 'N', 'S', 'N', 'N', 'N', 'N', NULL, 'N', 0, 'N', '2505', 'INTEGRAL', NULL);
INSERT INTO CONCEPTOS_NOMINA (CONC_COD, CONC_NOMBRE, CONC_DEDUC, CONC_FECINI, CONC_FECFIN, CONC_PORC, CONC_BASE, CONC_ENTIDAD, CONC_MONTO, CONC_CTAGAST, CONC_DIAS, CONC_MODIFI, CONC_DIAPAGO, CONC_PROMEDIO, CONC_TODOSPER, CONC_PROV, CONC_PERACTUAL, CONC_APORTE, CONC_APLICAPROM, CONC_PERPROMEDIO, CONC_OTROCONC, CONC_CODOTROCONC, CONC_SALARIO, CONC_CTACXP, CONC_NOMCORTO, CONC_PERIODOS) VALUES (8, 'RETENCION EN LA FUENTE', 'S', '2008-01-01', '2008-12-31', 0, NULL, NULL, NULL, NULL, 'N', 'S', NULL, 'N', 'S', 'N', 'N', 'N', 'N', NULL, 'N', 0, 'N', NULL, 'RETENCIÓN', NULL);
INSERT INTO CONCEPTOS_NOMINA (CONC_COD, CONC_NOMBRE, CONC_DEDUC, CONC_FECINI, CONC_FECFIN, CONC_PORC, CONC_BASE, CONC_ENTIDAD, CONC_MONTO, CONC_CTAGAST, CONC_DIAS, CONC_MODIFI, CONC_DIAPAGO, CONC_PROMEDIO, CONC_TODOSPER, CONC_PROV, CONC_PERACTUAL, CONC_APORTE, CONC_APLICAPROM, CONC_PERPROMEDIO, CONC_OTROCONC, CONC_CODOTROCONC, CONC_SALARIO, CONC_CTACXP, CONC_NOMCORTO, CONC_PERIODOS) VALUES (9, 'COMISIONES', 'N', '2008-01-01', '2008-12-31', 0, NULL, NULL, NULL, '520518', 'N', 'S', NULL, 'N', 'N', 'N', 'N', 'N', 'S', NULL, 'N', 0, 'S', '250505', 'COMISION', NULL);
INSERT INTO CONCEPTOS_NOMINA (CONC_COD, CONC_NOMBRE, CONC_DEDUC, CONC_FECINI, CONC_FECFIN, CONC_PORC, CONC_BASE, CONC_ENTIDAD, CONC_MONTO, CONC_CTAGAST, CONC_DIAS, CONC_MODIFI, CONC_DIAPAGO, CONC_PROMEDIO, CONC_TODOSPER, CONC_PROV, CONC_PERACTUAL, CONC_APORTE, CONC_APLICAPROM, CONC_PERPROMEDIO, CONC_OTROCONC, CONC_CODOTROCONC, CONC_SALARIO, CONC_CTACXP, CONC_NOMCORTO, CONC_PERIODOS) VALUES (10, 'INDEMNIZACION', 'N', '2008-01-01', '2008-12-31', 0, NULL, NULL, NULL, '510560', 'N', 'S', NULL, 'N', 'N', 'N', 'N', 'N', 'N', NULL, 'N', 0, 'N', '2540', 'INDEMNIZA', NULL);
INSERT INTO CONCEPTOS_NOMINA (CONC_COD, CONC_NOMBRE, CONC_DEDUC, CONC_FECINI, CONC_FECFIN, CONC_PORC, CONC_BASE, CONC_ENTIDAD, CONC_MONTO, CONC_CTAGAST, CONC_DIAS, CONC_MODIFI, CONC_DIAPAGO, CONC_PROMEDIO, CONC_TODOSPER, CONC_PROV, CONC_PERACTUAL, CONC_APORTE, CONC_APLICAPROM, CONC_PERPROMEDIO, CONC_OTROCONC, CONC_CODOTROCONC, CONC_SALARIO, CONC_CTACXP, CONC_NOMCORTO, CONC_PERIODOS) VALUES (11, 'APORTE PENSIÓN VOLUNTARIA EMPLEADOR', 'N', '2008-01-01', '2008-12-31', 0, NULL, NULL, NULL, NULL, 'N', 'S', NULL, 'N', 'S', 'N', 'N', 'S', 'N', NULL, 'N', 0, 'N', NULL, 'AFP VOL EMPR.', NULL);
INSERT INTO CONCEPTOS_NOMINA (CONC_COD, CONC_NOMBRE, CONC_DEDUC, CONC_FECINI, CONC_FECFIN, CONC_PORC, CONC_BASE, CONC_ENTIDAD, CONC_MONTO, CONC_CTAGAST, CONC_DIAS, CONC_MODIFI, CONC_DIAPAGO, CONC_PROMEDIO, CONC_TODOSPER, CONC_PROV, CONC_PERACTUAL, CONC_APORTE, CONC_APLICAPROM, CONC_PERPROMEDIO, CONC_OTROCONC, CONC_CODOTROCONC, CONC_SALARIO, CONC_CTACXP, CONC_NOMCORTO, CONC_PERIODOS) VALUES (12, 'CUOTA MEDICINA PREPAGADA', 'S', '2008-01-01', '2008-12-31', 0, NULL, NULL, NULL, '2505', 'N', 'S', NULL, 'N', 'N', 'N', 'N', 'N', 'N', NULL, 'N', 0, 'N', '510569', 'MED. PREP', NULL);
INSERT INTO CONCEPTOS_NOMINA (CONC_COD, CONC_NOMBRE, CONC_DEDUC, CONC_FECINI, CONC_FECFIN, CONC_PORC, CONC_BASE, CONC_ENTIDAD, CONC_MONTO, CONC_CTAGAST, CONC_DIAS, CONC_MODIFI, CONC_DIAPAGO, CONC_PROMEDIO, CONC_TODOSPER, CONC_PROV, CONC_PERACTUAL, CONC_APORTE, CONC_APLICAPROM, CONC_PERPROMEDIO, CONC_OTROCONC, CONC_CODOTROCONC, CONC_SALARIO, CONC_CTACXP, CONC_NOMCORTO, CONC_PERIODOS) VALUES (13, 'BONIFICACIÓN', 'N', '2008-01-01', '2008-12-31', 0, NULL, NULL, NULL, NULL, 'N', 'S', NULL, 'N', 'N', 'N', 'N', 'N', 'N', NULL, 'N', 0, 'N', NULL, 'BONIFI.', NULL);
INSERT INTO CONCEPTOS_NOMINA (CONC_COD, CONC_NOMBRE, CONC_DEDUC, CONC_FECINI, CONC_FECFIN, CONC_PORC, CONC_BASE, CONC_ENTIDAD, CONC_MONTO, CONC_CTAGAST, CONC_DIAS, CONC_MODIFI, CONC_DIAPAGO, CONC_PROMEDIO, CONC_TODOSPER, CONC_PROV, CONC_PERACTUAL, CONC_APORTE, CONC_APLICAPROM, CONC_PERPROMEDIO, CONC_OTROCONC, CONC_CODOTROCONC, CONC_SALARIO, CONC_CTACXP, CONC_NOMCORTO, CONC_PERIODOS) VALUES (14, 'RETROACTIVO', 'N', '2008-01-01', '2008-12-31', 0, NULL, NULL, NULL, NULL, 'N', 'S', NULL, 'N', 'N', 'N', 'N', 'N', 'N', NULL, 'N', 0, 'N', NULL, 'RETROAC.', NULL);
INSERT INTO CONCEPTOS_NOMINA (CONC_COD, CONC_NOMBRE, CONC_DEDUC, CONC_FECINI, CONC_FECFIN, CONC_PORC, CONC_BASE, CONC_ENTIDAD, CONC_MONTO, CONC_CTAGAST, CONC_DIAS, CONC_MODIFI, CONC_DIAPAGO, CONC_PROMEDIO, CONC_TODOSPER, CONC_PROV, CONC_PERACTUAL, CONC_APORTE, CONC_APLICAPROM, CONC_PERPROMEDIO, CONC_OTROCONC, CONC_CODOTROCONC, CONC_SALARIO, CONC_CTACXP, CONC_NOMCORTO, CONC_PERIODOS) VALUES (15, 'APORTE PENSIÓN VOLUNTARIA EMPLEADO', 'S', '2008-01-01', '2008-12-31', 0, NULL, NULL, NULL, '2505', 'N', 'S', NULL, 'N', 'S', 'N', 'N', 'N', 'N', NULL, 'N', 0, 'N', '510570', 'AFP VOL TRAB.', NULL);
INSERT INTO CONCEPTOS_NOMINA (CONC_COD, CONC_NOMBRE, CONC_DEDUC, CONC_FECINI, CONC_FECFIN, CONC_PORC, CONC_BASE, CONC_ENTIDAD, CONC_MONTO, CONC_CTAGAST, CONC_DIAS, CONC_MODIFI, CONC_DIAPAGO, CONC_PROMEDIO, CONC_TODOSPER, CONC_PROV, CONC_PERACTUAL, CONC_APORTE, CONC_APLICAPROM, CONC_PERPROMEDIO, CONC_OTROCONC, CONC_CODOTROCONC, CONC_SALARIO, CONC_CTACXP, CONC_NOMCORTO, CONC_PERIODOS) VALUES (16, 'AJUSTE PRIMA', 'N', '2008-01-01', '2008-12-31', 0, NULL, NULL, NULL, '261020', 'N', 'S', NULL, 'S', 'N', 'N', 'N', 'N', 'N', NULL, 'N', 0, 'N', '261020', 'AJUS. PRIMA', NULL);
INSERT INTO CONCEPTOS_NOMINA (CONC_COD, CONC_NOMBRE, CONC_DEDUC, CONC_FECINI, CONC_FECFIN, CONC_PORC, CONC_BASE, CONC_ENTIDAD, CONC_MONTO, CONC_CTAGAST, CONC_DIAS, CONC_MODIFI, CONC_DIAPAGO, CONC_PROMEDIO, CONC_TODOSPER, CONC_PROV, CONC_PERACTUAL, CONC_APORTE, CONC_APLICAPROM, CONC_PERPROMEDIO, CONC_OTROCONC, CONC_CODOTROCONC, CONC_SALARIO, CONC_CTACXP, CONC_NOMCORTO, CONC_PERIODOS) VALUES (908, 'ARP ADMINISTRATIVO', 'N', '2008-01-01', '2008-12-31', 0, NULL, NULL, NULL, '510568', 'S', 'S', NULL, 'N', 'S', 'S', 'N', 'S', 'N', NULL, 'N', 0, 'N', '237006', 'ARP', NULL);
INSERT INTO CONCEPTOS_NOMINA (CONC_COD, CONC_NOMBRE, CONC_DEDUC, CONC_FECINI, CONC_FECFIN, CONC_PORC, CONC_BASE, CONC_ENTIDAD, CONC_MONTO, CONC_CTAGAST, CONC_DIAS, CONC_MODIFI, CONC_DIAPAGO, CONC_PROMEDIO, CONC_TODOSPER, CONC_PROV, CONC_PERACTUAL, CONC_APORTE, CONC_APLICAPROM, CONC_PERPROMEDIO, CONC_OTROCONC, CONC_CODOTROCONC, CONC_SALARIO, CONC_CTACXP, CONC_NOMCORTO, CONC_PERIODOS) VALUES (916, 'ICBF ADMINISTRATIVO', 'N', '2008-01-01', '2008-12-31', 3, NULL, NULL, NULL, '510575', 'N', 'S', NULL, 'N', 'S', 'S', 'N', 'S', 'N', NULL, 'N', 0, 'N', '237010', 'ICBF', NULL);
INSERT INTO CONCEPTOS_NOMINA (CONC_COD, CONC_NOMBRE, CONC_DEDUC, CONC_FECINI, CONC_FECFIN, CONC_PORC, CONC_BASE, CONC_ENTIDAD, CONC_MONTO, CONC_CTAGAST, CONC_DIAS, CONC_MODIFI, CONC_DIAPAGO, CONC_PROMEDIO, CONC_TODOSPER, CONC_PROV, CONC_PERACTUAL, CONC_APORTE, CONC_APLICAPROM, CONC_PERPROMEDIO, CONC_OTROCONC, CONC_CODOTROCONC, CONC_SALARIO, CONC_CTACXP, CONC_NOMCORTO, CONC_PERIODOS) VALUES (918, 'SENA ADMINISTRATIVO', 'N', '2008-01-01', '2008-12-31', 2, NULL, NULL, NULL, '510578', 'N', 'S', NULL, 'N', 'S', 'S', 'N', 'S', 'N', NULL, 'N', 0, 'N', '237010', 'SENA', NULL);
INSERT INTO CONCEPTOS_NOMINA (CONC_COD, CONC_NOMBRE, CONC_DEDUC, CONC_FECINI, CONC_FECFIN, CONC_PORC, CONC_BASE, CONC_ENTIDAD, CONC_MONTO, CONC_CTAGAST, CONC_DIAS, CONC_MODIFI, CONC_DIAPAGO, CONC_PROMEDIO, CONC_TODOSPER, CONC_PROV, CONC_PERACTUAL, CONC_APORTE, CONC_APLICAPROM, CONC_PERPROMEDIO, CONC_OTROCONC, CONC_CODOTROCONC, CONC_SALARIO, CONC_CTACXP, CONC_NOMCORTO, CONC_PERIODOS) VALUES (910, 'CCF ADMINISTRATIVO', 'N', '2008-01-01', '2008-12-31', 4, NULL, NULL, NULL, '510572', 'N', 'S', NULL, 'N', 'S', 'S', 'N', 'S', 'N', NULL, 'N', 0, 'N', '237010', 'CCF', NULL);
INSERT INTO CONCEPTOS_NOMINA (CONC_COD, CONC_NOMBRE, CONC_DEDUC, CONC_FECINI, CONC_FECFIN, CONC_PORC, CONC_BASE, CONC_ENTIDAD, CONC_MONTO, CONC_CTAGAST, CONC_DIAS, CONC_MODIFI, CONC_DIAPAGO, CONC_PROMEDIO, CONC_TODOSPER, CONC_PROV, CONC_PERACTUAL, CONC_APORTE, CONC_APLICAPROM, CONC_PERPROMEDIO, CONC_OTROCONC, CONC_CODOTROCONC, CONC_SALARIO, CONC_CTACXP, CONC_NOMCORTO, CONC_PERIODOS) VALUES (914, 'EPS EMPLEADOR ADMIN', 'N', '2008-01-01', '2008-12-31', 8.5, NULL, NULL, NULL, '510569', 'N', 'S', NULL, 'N', 'S', 'S', 'N', 'S', 'N', NULL, 'N', 0, 'N', '238030', 'EPS EMPRESA', NULL);
INSERT INTO CONCEPTOS_NOMINA (CONC_COD, CONC_NOMBRE, CONC_DEDUC, CONC_FECINI, CONC_FECFIN, CONC_PORC, CONC_BASE, CONC_ENTIDAD, CONC_MONTO, CONC_CTAGAST, CONC_DIAS, CONC_MODIFI, CONC_DIAPAGO, CONC_PROMEDIO, CONC_TODOSPER, CONC_PROV, CONC_PERACTUAL, CONC_APORTE, CONC_APLICAPROM, CONC_PERPROMEDIO, CONC_OTROCONC, CONC_CODOTROCONC, CONC_SALARIO, CONC_CTACXP, CONC_NOMCORTO, CONC_PERIODOS) VALUES (905, 'AFP EMPLEADOR ADMIN', 'N', '2008-01-01', '2008-12-31', 11.625, NULL, NULL, NULL, '510570', 'N', 'S', NULL, 'N', 'S', 'S', 'N', 'S', 'N', NULL, 'N', 0, 'N', '238030', 'AFP EMPRESA', NULL);
INSERT INTO CONCEPTOS_NOMINA (CONC_COD, CONC_NOMBRE, CONC_DEDUC, CONC_FECINI, CONC_FECFIN, CONC_PORC, CONC_BASE, CONC_ENTIDAD, CONC_MONTO, CONC_CTAGAST, CONC_DIAS, CONC_MODIFI, CONC_DIAPAGO, CONC_PROMEDIO, CONC_TODOSPER, CONC_PROV, CONC_PERACTUAL, CONC_APORTE, CONC_APLICAPROM, CONC_PERPROMEDIO, CONC_OTROCONC, CONC_CODOTROCONC, CONC_SALARIO, CONC_CTACXP, CONC_NOMCORTO, CONC_PERIODOS) VALUES (17, 'VACACIONES ADMIN', 'N', '2008-01-01', '2008-12-31', 8.3333, NULL, NULL, NULL, '510539', 'N', 'S', NULL, 'N', 'S', 'S', 'N', 'N', 'N', NULL, 'N', 0, 'N', '261015', 'VACACIONES', NULL);
INSERT INTO CONCEPTOS_NOMINA (CONC_COD, CONC_NOMBRE, CONC_DEDUC, CONC_FECINI, CONC_FECFIN, CONC_PORC, CONC_BASE, CONC_ENTIDAD, CONC_MONTO, CONC_CTAGAST, CONC_DIAS, CONC_MODIFI, CONC_DIAPAGO, CONC_PROMEDIO, CONC_TODOSPER, CONC_PROV, CONC_PERACTUAL, CONC_APORTE, CONC_APLICAPROM, CONC_PERPROMEDIO, CONC_OTROCONC, CONC_CODOTROCONC, CONC_SALARIO, CONC_CTACXP, CONC_NOMCORTO, CONC_PERIODOS) VALUES (18, 'PROV. PRIMA JUNIO ADMIN', 'N', '2008-01-01', '2008-06-30', 8.3333, NULL, NULL, NULL, '510536', 'N', 'S', 30, 'N', 'N', 'S', 'S', 'N', 'N', NULL, 'N', 0, 'N', '261020', 'PRIMA JUN', NULL);
INSERT INTO CONCEPTOS_NOMINA (CONC_COD, CONC_NOMBRE, CONC_DEDUC, CONC_FECINI, CONC_FECFIN, CONC_PORC, CONC_BASE, CONC_ENTIDAD, CONC_MONTO, CONC_CTAGAST, CONC_DIAS, CONC_MODIFI, CONC_DIAPAGO, CONC_PROMEDIO, CONC_TODOSPER, CONC_PROV, CONC_PERACTUAL, CONC_APORTE, CONC_APLICAPROM, CONC_PERPROMEDIO, CONC_OTROCONC, CONC_CODOTROCONC, CONC_SALARIO, CONC_CTACXP, CONC_NOMCORTO, CONC_PERIODOS) VALUES (19, 'PROV. PRIMA  DICIEMBRE ADMIN', 'N', '2008-07-01', '2008-12-31', 8.3333, NULL, NULL, NULL, '510536', 'N', 'S', 20, 'N', 'N', 'S', 'S', 'N', 'N', NULL, 'N', 0, 'N', '261020', 'PRIMA DIC', NULL);
INSERT INTO CONCEPTOS_NOMINA (CONC_COD, CONC_NOMBRE, CONC_DEDUC, CONC_FECINI, CONC_FECFIN, CONC_PORC, CONC_BASE, CONC_ENTIDAD, CONC_MONTO, CONC_CTAGAST, CONC_DIAS, CONC_MODIFI, CONC_DIAPAGO, CONC_PROMEDIO, CONC_TODOSPER, CONC_PROV, CONC_PERACTUAL, CONC_APORTE, CONC_APLICAPROM, CONC_PERPROMEDIO, CONC_OTROCONC, CONC_CODOTROCONC, CONC_SALARIO, CONC_CTACXP, CONC_NOMCORTO, CONC_PERIODOS) VALUES (20, 'PAGO PRIMA JUNIO', 'N', '2008-01-01', '2008-01-01', NULL, NULL, NULL, NULL, '261020', 'N', 'S', 30, 'S', 'N', 'N', 'S', 'N', 'N', NULL, 'N', 0, 'N', '261020', 'PRIMA JUN', NULL);
INSERT INTO CONCEPTOS_NOMINA (CONC_COD, CONC_NOMBRE, CONC_DEDUC, CONC_FECINI, CONC_FECFIN, CONC_PORC, CONC_BASE, CONC_ENTIDAD, CONC_MONTO, CONC_CTAGAST, CONC_DIAS, CONC_MODIFI, CONC_DIAPAGO, CONC_PROMEDIO, CONC_TODOSPER, CONC_PROV, CONC_PERACTUAL, CONC_APORTE, CONC_APLICAPROM, CONC_PERPROMEDIO, CONC_OTROCONC, CONC_CODOTROCONC, CONC_SALARIO, CONC_CTACXP, CONC_NOMCORTO, CONC_PERIODOS) VALUES (21, 'PAGO PRIMA DICIEMBRE', 'N', '2008-01-01', '2008-01-01', NULL, NULL, NULL, NULL, '261020', 'N', 'S', 20, 'S', 'N', 'N', 'S', 'N', 'N', NULL, 'N', 0, 'N', '261020', 'PRIMA DIC', NULL);
INSERT INTO CONCEPTOS_NOMINA (CONC_COD, CONC_NOMBRE, CONC_DEDUC, CONC_FECINI, CONC_FECFIN, CONC_PORC, CONC_BASE, CONC_ENTIDAD, CONC_MONTO, CONC_CTAGAST, CONC_DIAS, CONC_MODIFI, CONC_DIAPAGO, CONC_PROMEDIO, CONC_TODOSPER, CONC_PROV, CONC_PERACTUAL, CONC_APORTE, CONC_APLICAPROM, CONC_PERPROMEDIO, CONC_OTROCONC, CONC_CODOTROCONC, CONC_SALARIO, CONC_CTACXP, CONC_NOMCORTO, CONC_PERIODOS) VALUES (900, 'HORAS EXTRA', 'N', '2008-01-01', '2007-12-31', NULL, NULL, NULL, NULL, '520515', 'N', 'N', NULL, 'N', 'S', 'N', 'S', 'N', 'S', NULL, 'N', 0, 'S', '250505', 'HORAS EXT.', NULL);
INSERT INTO CONCEPTOS_NOMINA (CONC_COD, CONC_NOMBRE, CONC_DEDUC, CONC_FECINI, CONC_FECFIN, CONC_PORC, CONC_BASE, CONC_ENTIDAD, CONC_MONTO, CONC_CTAGAST, CONC_DIAS, CONC_MODIFI, CONC_DIAPAGO, CONC_PROMEDIO, CONC_TODOSPER, CONC_PROV, CONC_PERACTUAL, CONC_APORTE, CONC_APLICAPROM, CONC_PERPROMEDIO, CONC_OTROCONC, CONC_CODOTROCONC, CONC_SALARIO, CONC_CTACXP, CONC_NOMCORTO, CONC_PERIODOS) VALUES (907, 'APORTE SALUD EMPLEADO', 'N', '2008-01-01', '2008-12-31', 4, NULL, NULL, NULL, '2505', 'N', 'S', 1, 'N', 'S', 'N', 'N', 'S', 'N', NULL, 'N', 0, 'N', '510569', 'EPS TRAB.', NULL);
INSERT INTO CONCEPTOS_NOMINA (CONC_COD, CONC_NOMBRE, CONC_DEDUC, CONC_FECINI, CONC_FECFIN, CONC_PORC, CONC_BASE, CONC_ENTIDAD, CONC_MONTO, CONC_CTAGAST, CONC_DIAS, CONC_MODIFI, CONC_DIAPAGO, CONC_PROMEDIO, CONC_TODOSPER, CONC_PROV, CONC_PERACTUAL, CONC_APORTE, CONC_APLICAPROM, CONC_PERPROMEDIO, CONC_OTROCONC, CONC_CODOTROCONC, CONC_SALARIO, CONC_CTACXP, CONC_NOMCORTO, CONC_PERIODOS) VALUES (904, 'AFP EMPLEADO', 'N', '2008-01-01', '2008-12-31', 3.875, NULL, NULL, NULL, '2505', 'N', 'S', 1, 'N', 'S', 'N', 'N', 'S', 'N', NULL, 'N', 0, 'N', '510570', 'AFP TRAB.', NULL);
INSERT INTO CONCEPTOS_NOMINA (CONC_COD, CONC_NOMBRE, CONC_DEDUC, CONC_FECINI, CONC_FECFIN, CONC_PORC, CONC_BASE, CONC_ENTIDAD, CONC_MONTO, CONC_CTAGAST, CONC_DIAS, CONC_MODIFI, CONC_DIAPAGO, CONC_PROMEDIO, CONC_TODOSPER, CONC_PROV, CONC_PERACTUAL, CONC_APORTE, CONC_APLICAPROM, CONC_PERPROMEDIO, CONC_OTROCONC, CONC_CODOTROCONC, CONC_SALARIO, CONC_CTACXP, CONC_NOMCORTO, CONC_PERIODOS) VALUES (913, 'CESANTIAS VENTAS', 'N', '2008-01-01', '2008-12-31', 8.3333, NULL, NULL, NULL, '520530', 'N', 'S', NULL, 'N', 'S', 'S', 'N', 'S', 'N', NULL, 'N', 0, 'N', '261005', 'CESANTIAS', NULL);
INSERT INTO CONCEPTOS_NOMINA (CONC_COD, CONC_NOMBRE, CONC_DEDUC, CONC_FECINI, CONC_FECFIN, CONC_PORC, CONC_BASE, CONC_ENTIDAD, CONC_MONTO, CONC_CTAGAST, CONC_DIAS, CONC_MODIFI, CONC_DIAPAGO, CONC_PROMEDIO, CONC_TODOSPER, CONC_PROV, CONC_PERACTUAL, CONC_APORTE, CONC_APLICAPROM, CONC_PERPROMEDIO, CONC_OTROCONC, CONC_CODOTROCONC, CONC_SALARIO, CONC_CTACXP, CONC_NOMCORTO, CONC_PERIODOS) VALUES (22, 'INT. DE CESANTIAS VENTAS', 'N', '2008-01-01', '2008-01-31', 8.3333, NULL, NULL, NULL, '520533', 'N', 'S', NULL, 'N', 'S', 'S', 'N', 'N', 'N', NULL, 'N', 0, 'N', '261005', 'INT. CESAN.', NULL);
INSERT INTO CONCEPTOS_NOMINA (CONC_COD, CONC_NOMBRE, CONC_DEDUC, CONC_FECINI, CONC_FECFIN, CONC_PORC, CONC_BASE, CONC_ENTIDAD, CONC_MONTO, CONC_CTAGAST, CONC_DIAS, CONC_MODIFI, CONC_DIAPAGO, CONC_PROMEDIO, CONC_TODOSPER, CONC_PROV, CONC_PERACTUAL, CONC_APORTE, CONC_APLICAPROM, CONC_PERPROMEDIO, CONC_OTROCONC, CONC_CODOTROCONC, CONC_SALARIO, CONC_CTACXP, CONC_NOMCORTO, CONC_PERIODOS) VALUES (909, 'ARP VENTAS', 'N', '2008-01-01', '2008-12-31', 0, NULL, NULL, NULL, '520568', 'S', 'S', NULL, 'N', 'S', 'S', 'N', 'S', 'N', NULL, 'N', 0, 'N', '237006', 'ARP', NULL);
INSERT INTO CONCEPTOS_NOMINA (CONC_COD, CONC_NOMBRE, CONC_DEDUC, CONC_FECINI, CONC_FECFIN, CONC_PORC, CONC_BASE, CONC_ENTIDAD, CONC_MONTO, CONC_CTAGAST, CONC_DIAS, CONC_MODIFI, CONC_DIAPAGO, CONC_PROMEDIO, CONC_TODOSPER, CONC_PROV, CONC_PERACTUAL, CONC_APORTE, CONC_APLICAPROM, CONC_PERPROMEDIO, CONC_OTROCONC, CONC_CODOTROCONC, CONC_SALARIO, CONC_CTACXP, CONC_NOMCORTO, CONC_PERIODOS) VALUES (917, 'ICBF VENTAS', 'N', '2008-01-01', '2008-12-31', 3, NULL, NULL, NULL, '520575', 'N', 'S', NULL, 'N', 'S', 'S', 'N', 'S', 'N', NULL, 'N', 0, 'N', '237010', 'ICBF', NULL);
INSERT INTO CONCEPTOS_NOMINA (CONC_COD, CONC_NOMBRE, CONC_DEDUC, CONC_FECINI, CONC_FECFIN, CONC_PORC, CONC_BASE, CONC_ENTIDAD, CONC_MONTO, CONC_CTAGAST, CONC_DIAS, CONC_MODIFI, CONC_DIAPAGO, CONC_PROMEDIO, CONC_TODOSPER, CONC_PROV, CONC_PERACTUAL, CONC_APORTE, CONC_APLICAPROM, CONC_PERPROMEDIO, CONC_OTROCONC, CONC_CODOTROCONC, CONC_SALARIO, CONC_CTACXP, CONC_NOMCORTO, CONC_PERIODOS) VALUES (919, 'SENA VENTAS', 'N', '2008-01-01', '2008-12-31', 2, NULL, NULL, NULL, '520578', 'N', 'S', NULL, 'N', 'S', 'S', 'N', 'S', 'N', NULL, 'N', 0, 'N', '237010', 'SENA', NULL);
INSERT INTO CONCEPTOS_NOMINA (CONC_COD, CONC_NOMBRE, CONC_DEDUC, CONC_FECINI, CONC_FECFIN, CONC_PORC, CONC_BASE, CONC_ENTIDAD, CONC_MONTO, CONC_CTAGAST, CONC_DIAS, CONC_MODIFI, CONC_DIAPAGO, CONC_PROMEDIO, CONC_TODOSPER, CONC_PROV, CONC_PERACTUAL, CONC_APORTE, CONC_APLICAPROM, CONC_PERPROMEDIO, CONC_OTROCONC, CONC_CODOTROCONC, CONC_SALARIO, CONC_CTACXP, CONC_NOMCORTO, CONC_PERIODOS) VALUES (911, 'CCF VENTAS', 'N', '2008-01-01', '2008-12-31', 4, NULL, NULL, NULL, '520572', 'N', 'S', NULL, 'N', 'S', 'S', 'N', 'S', 'N', NULL, 'N', 0, 'N', '237010', 'CCF', NULL);
INSERT INTO CONCEPTOS_NOMINA (CONC_COD, CONC_NOMBRE, CONC_DEDUC, CONC_FECINI, CONC_FECFIN, CONC_PORC, CONC_BASE, CONC_ENTIDAD, CONC_MONTO, CONC_CTAGAST, CONC_DIAS, CONC_MODIFI, CONC_DIAPAGO, CONC_PROMEDIO, CONC_TODOSPER, CONC_PROV, CONC_PERACTUAL, CONC_APORTE, CONC_APLICAPROM, CONC_PERPROMEDIO, CONC_OTROCONC, CONC_CODOTROCONC, CONC_SALARIO, CONC_CTACXP, CONC_NOMCORTO, CONC_PERIODOS) VALUES (915, 'EPS EMPLEADOR VENTAS', 'N', '2008-01-01', '2008-12-31', 8.5, NULL, NULL, NULL, '520569', 'N', 'S', NULL, 'N', 'S', 'S', 'N', 'S', 'N', NULL, 'N', 0, 'N', '238030', 'EPS EMPRESA', NULL);
INSERT INTO CONCEPTOS_NOMINA (CONC_COD, CONC_NOMBRE, CONC_DEDUC, CONC_FECINI, CONC_FECFIN, CONC_PORC, CONC_BASE, CONC_ENTIDAD, CONC_MONTO, CONC_CTAGAST, CONC_DIAS, CONC_MODIFI, CONC_DIAPAGO, CONC_PROMEDIO, CONC_TODOSPER, CONC_PROV, CONC_PERACTUAL, CONC_APORTE, CONC_APLICAPROM, CONC_PERPROMEDIO, CONC_OTROCONC, CONC_CODOTROCONC, CONC_SALARIO, CONC_CTACXP, CONC_NOMCORTO, CONC_PERIODOS) VALUES (906, 'AFP EMPLEADOR VENTAS', 'N', '2008-01-01', '2008-12-31', 11.625, NULL, NULL, NULL, '520570', 'N', 'S', NULL, 'N', 'S', 'S', 'N', 'S', 'N', NULL, 'N', 0, 'N', '238030', 'AFP EMPRESA', NULL);
INSERT INTO CONCEPTOS_NOMINA (CONC_COD, CONC_NOMBRE, CONC_DEDUC, CONC_FECINI, CONC_FECFIN, CONC_PORC, CONC_BASE, CONC_ENTIDAD, CONC_MONTO, CONC_CTAGAST, CONC_DIAS, CONC_MODIFI, CONC_DIAPAGO, CONC_PROMEDIO, CONC_TODOSPER, CONC_PROV, CONC_PERACTUAL, CONC_APORTE, CONC_APLICAPROM, CONC_PERPROMEDIO, CONC_OTROCONC, CONC_CODOTROCONC, CONC_SALARIO, CONC_CTACXP, CONC_NOMCORTO, CONC_PERIODOS) VALUES (23, 'VACACIONES VENTAS', 'N', '2008-01-01', '2008-12-31', 8.3333, NULL, NULL, NULL, '520539', 'N', 'S', NULL, 'N', 'S', 'S', 'N', 'N', 'N', NULL, 'N', 0, 'N', '261015', 'VACACIONES', NULL);
INSERT INTO CONCEPTOS_NOMINA (CONC_COD, CONC_NOMBRE, CONC_DEDUC, CONC_FECINI, CONC_FECFIN, CONC_PORC, CONC_BASE, CONC_ENTIDAD, CONC_MONTO, CONC_CTAGAST, CONC_DIAS, CONC_MODIFI, CONC_DIAPAGO, CONC_PROMEDIO, CONC_TODOSPER, CONC_PROV, CONC_PERACTUAL, CONC_APORTE, CONC_APLICAPROM, CONC_PERPROMEDIO, CONC_OTROCONC, CONC_CODOTROCONC, CONC_SALARIO, CONC_CTACXP, CONC_NOMCORTO, CONC_PERIODOS) VALUES (24, 'PROV. PRIMA JUNIO VENTAS', 'N', '2008-01-01', '2008-06-30', 8.3333, NULL, NULL, NULL, '520536', 'N', 'S', 30, 'N', 'N', 'S', 'S', 'N', 'N', NULL, 'N', 0, 'N', '261020', 'PRIMA JUN', NULL);
INSERT INTO CONCEPTOS_NOMINA (CONC_COD, CONC_NOMBRE, CONC_DEDUC, CONC_FECINI, CONC_FECFIN, CONC_PORC, CONC_BASE, CONC_ENTIDAD, CONC_MONTO, CONC_CTAGAST, CONC_DIAS, CONC_MODIFI, CONC_DIAPAGO, CONC_PROMEDIO, CONC_TODOSPER, CONC_PROV, CONC_PERACTUAL, CONC_APORTE, CONC_APLICAPROM, CONC_PERPROMEDIO, CONC_OTROCONC, CONC_CODOTROCONC, CONC_SALARIO, CONC_CTACXP, CONC_NOMCORTO, CONC_PERIODOS) VALUES (25, 'PROV. PRIMA  DICIEMBRE VENTAS', 'N', '2008-07-01', '2008-12-31', 8.3333, NULL, NULL, NULL, '520536', 'N', 'S', 20, 'N', 'N', 'S', 'S', 'N', 'N', NULL, 'N', 0, 'N', '261020', 'PRIM DIC', NULL);
INSERT INTO CONCEPTOS_NOMINA (CONC_COD, CONC_NOMBRE, CONC_DEDUC, CONC_FECINI, CONC_FECFIN, CONC_PORC, CONC_BASE, CONC_ENTIDAD, CONC_MONTO, CONC_CTAGAST, CONC_DIAS, CONC_MODIFI, CONC_DIAPAGO, CONC_PROMEDIO, CONC_TODOSPER, CONC_PROV, CONC_PERACTUAL, CONC_APORTE, CONC_APLICAPROM, CONC_PERPROMEDIO, CONC_OTROCONC, CONC_CODOTROCONC, CONC_SALARIO, CONC_CTACXP, CONC_NOMCORTO, CONC_PERIODOS) VALUES (28, 'CUOTA MEDICINA PREPAGADA', 'N', '2008-01-01', '2008-12-31', 0, NULL, NULL, NULL, '2505', 'N', 'S', NULL, 'N', 'N', 'N', 'N', 'S', 'N', NULL, 'N', 0, 'N', '510569', 'MED PREP.', NULL);
INSERT INTO CONCEPTOS_NOMINA (CONC_COD, CONC_NOMBRE, CONC_DEDUC, CONC_FECINI, CONC_FECFIN, CONC_PORC, CONC_BASE, CONC_ENTIDAD, CONC_MONTO, CONC_CTAGAST, CONC_DIAS, CONC_MODIFI, CONC_DIAPAGO, CONC_PROMEDIO, CONC_TODOSPER, CONC_PROV, CONC_PERACTUAL, CONC_APORTE, CONC_APLICAPROM, CONC_PERPROMEDIO, CONC_OTROCONC, CONC_CODOTROCONC, CONC_SALARIO, CONC_CTACXP, CONC_NOMCORTO, CONC_PERIODOS) VALUES (26, 'EPS EMPLEADO VENTAS', 'S', '2008-01-01', '2008-12-31', 4, NULL, NULL, NULL, '520569', 'N', 'S', 1, 'N', 'S', 'N', 'N', 'N', 'N', NULL, 'N', 0, 'N', '250505', 'EPS TRAB', NULL);
INSERT INTO CONCEPTOS_NOMINA (CONC_COD, CONC_NOMBRE, CONC_DEDUC, CONC_FECINI, CONC_FECFIN, CONC_PORC, CONC_BASE, CONC_ENTIDAD, CONC_MONTO, CONC_CTAGAST, CONC_DIAS, CONC_MODIFI, CONC_DIAPAGO, CONC_PROMEDIO, CONC_TODOSPER, CONC_PROV, CONC_PERACTUAL, CONC_APORTE, CONC_APLICAPROM, CONC_PERPROMEDIO, CONC_OTROCONC, CONC_CODOTROCONC, CONC_SALARIO, CONC_CTACXP, CONC_NOMCORTO, CONC_PERIODOS) VALUES (27, 'AFP EMPLEADO VENTAS', 'S', '2008-01-01', '2008-12-31', 3.875, NULL, NULL, NULL, '520570', 'N', 'S', 1, 'N', 'S', 'N', 'N', 'N', 'N', NULL, 'N', 0, 'N', '250505', 'AFP TRAB', NULL);

COMMIT WORK;

INSERT INTO PARAMETROS_ANO (PAAN_ANO, PAAN_SALMINIMO, PAAN_AUXTR, PAAN_SENA, PAAN_ICBF, PAAN_CCF, PAAN_EPSTR, PAAN_EPSEM, PAAN_EPSFON, PAAN_AFPTR, PAAN_AFPEM, PAAN_AFPFON, PAAN_AFPSMF, PAAN_INTMORA, PAAN_ARP, PAAN_PEQAPOR, PAAN_HORASDI, PAAN_HORASNO, PAAN_HORASFD, PAAN_HORASFN, PAAN_TIPOAPORT) VALUES ('2008', 461500, 55000, NULL, NULL, NULL, 4, 8.5, 12.5, 3.875, 11.625, 15.5, NULL, NULL, NULL, NULL, 1.25, 1.75, 2.25, 2.75, 'B');

COMMIT WORK;

INSERT INTO PERIODO_PAGO (PPAG_COD, PPAG_NOMBRE, PPAG_PERIODO, PPAG_DIAS) VALUES (1, 'MENSUAL', 12, 6);
INSERT INTO PERIODO_PAGO (PPAG_COD, PPAG_NOMBRE, PPAG_PERIODO, PPAG_DIAS) VALUES (2, 'QUINCENAL', 24, 15);
INSERT INTO PERIODO_PAGO (PPAG_COD, PPAG_NOMBRE, PPAG_PERIODO, PPAG_DIAS) VALUES (3, 'SEMANAL', 52, 6);

COMMIT WORK;

INSERT INTO RETENCIONES (RETE_ITEM, RETE_HASTA, RETE_PORC, RETE_MONTO, RETE_DESDE) VALUES (1, 2095000, 0, NULL, 0);
INSERT INTO RETENCIONES (RETE_ITEM, RETE_HASTA, RETE_PORC, RETE_MONTO, RETE_DESDE) VALUES (2, 3308000, 19, NULL, 2095001);
INSERT INTO RETENCIONES (RETE_ITEM, RETE_HASTA, RETE_PORC, RETE_MONTO, RETE_DESDE) VALUES (3, 7939000, 28, NULL, 3308001);
INSERT INTO RETENCIONES (RETE_ITEM, RETE_HASTA, RETE_PORC, RETE_MONTO, RETE_DESDE) VALUES (6, 99999999, 33, NULL, 7939001);
INSERT INTO RETENCIONES (RETE_ITEM, RETE_HASTA, RETE_PORC, RETE_MONTO, RETE_DESDE) VALUES (4, 99999999, 33, NULL, 7939001);

COMMIT WORK;

INSERT INTO TIPO_COTIZANTE (TCOT_COD, TCOT_NOMBRE) VALUES (17, 'AFILIADO CON REQUISITOS CUMPLIDOS PARA PENSION');
INSERT INTO TIPO_COTIZANTE (TCOT_COD, TCOT_NOMBRE) VALUES (19, 'APRENDICES DEL SENA EN ETAPA PRODUCTIVA');
INSERT INTO TIPO_COTIZANTE (TCOT_COD, TCOT_NOMBRE) VALUES (21, 'ESTUDIANTES DE POSTGRADO EN SALUD(DECRETO 190/1996)');
INSERT INTO TIPO_COTIZANTE (TCOT_COD, TCOT_NOMBRE) VALUES (15, 'DESEMPLEADO CON SUBSIDIO DE CAJA DE COMPENSACION FLIAR');
INSERT INTO TIPO_COTIZANTE (TCOT_COD, TCOT_NOMBRE) VALUES (22, 'PROFESOR');
INSERT INTO TIPO_COTIZANTE (TCOT_COD, TCOT_NOMBRE) VALUES (2, 'EMPLEADA DOMESTICA');
INSERT INTO TIPO_COTIZANTE (TCOT_COD, TCOT_NOMBRE) VALUES (3, 'INDEPENDIENTE');
INSERT INTO TIPO_COTIZANTE (TCOT_COD, TCOT_NOMBRE) VALUES (16, 'INDEPENDIENTE AGREMIADO O ASOCIADO');
INSERT INTO TIPO_COTIZANTE (TCOT_COD, TCOT_NOMBRE) VALUES (1, 'DEPENDIENTE');
INSERT INTO TIPO_COTIZANTE (TCOT_COD, TCOT_NOMBRE) VALUES (18, 'FUNCIONARIOS PUBLICOS SIN TOPE MAXIMO EN EL IBC');
INSERT INTO TIPO_COTIZANTE (TCOT_COD, TCOT_NOMBRE) VALUES (20, 'ESTUDIANTES (REGIMEN ESPECIAL- LEY 789/2002)');
INSERT INTO TIPO_COTIZANTE (TCOT_COD, TCOT_NOMBRE) VALUES (12, 'APRENDICES DEL SENA EN ETAPA LECTIVA');

COMMIT WORK;

INSERT INTO SUBTIPO_COTIZANTE (TCOT_COD, STCO_COD, STCO_NOMBRE) VALUES (3, 1, 'INDEPENDIENTE PENSIONADO POR VEJEZ ACTIVO');
INSERT INTO SUBTIPO_COTIZANTE (TCOT_COD, STCO_COD, STCO_NOMBRE) VALUES (1, 1, 'DEPENDIENTE PENSIONADO POR VEJEZ ACTIVO');

COMMIT WORK;

INSERT INTO TIPOS_NOVEDAD (TNOV_COD, TNOV_NOMBRE, TNOV_CTACONTA) VALUES ('8  ', 'VARIACION SALARIO PERMANENTE', NULL);
INSERT INTO TIPOS_NOVEDAD (TNOV_COD, TNOV_NOMBRE, TNOV_CTACONTA) VALUES ('5  ', 'TRASLADO DE OTRA ENTIDAD', NULL);
INSERT INTO TIPOS_NOVEDAD (TNOV_COD, TNOV_NOMBRE, TNOV_CTACONTA) VALUES ('2  ', 'INCAPACIDAD ENFERMEDAD GENERAL', '');
INSERT INTO TIPOS_NOVEDAD (TNOV_COD, TNOV_NOMBRE, TNOV_CTACONTA) VALUES ('4  ', 'LICENCIA DE MATERNIDAD', '');
INSERT INTO TIPOS_NOVEDAD (TNOV_COD, TNOV_NOMBRE, TNOV_CTACONTA) VALUES ('6  ', 'VACACIONES', NULL);
INSERT INTO TIPOS_NOVEDAD (TNOV_COD, TNOV_NOMBRE, TNOV_CTACONTA) VALUES ('1  ', 'APORTES VOLUNTARIOS A PENSIONES', '');
INSERT INTO TIPOS_NOVEDAD (TNOV_COD, TNOV_NOMBRE, TNOV_CTACONTA) VALUES ('7  ', 'VARIOS CENTROS DE TRABAJO', NULL);
INSERT INTO TIPOS_NOVEDAD (TNOV_COD, TNOV_NOMBRE, TNOV_CTACONTA) VALUES ('3  ', 'INCAPACIDAD PROFESIONAL', '');
INSERT INTO TIPOS_NOVEDAD (TNOV_COD, TNOV_NOMBRE, TNOV_CTACONTA) VALUES ('9  ', 'SUSPENSION O LICENCIA NO REMUNERADA', NULL);
INSERT INTO TIPOS_NOVEDAD (TNOV_COD, TNOV_NOMBRE, TNOV_CTACONTA) VALUES ('10 ', 'VARIACION TARIFA ESPECIAL', NULL);
INSERT INTO TIPOS_NOVEDAD (TNOV_COD, TNOV_NOMBRE, TNOV_CTACONTA) VALUES ('11 ', 'VARIACION TRANSITORIA DEL SALARIO', NULL);

COMMIT WORK;

INSERT INTO INTERFAZ_NOMINA (INNO_ID, TIDO_COD, INNO_NOMBRE, TICO_COD, PRCO_PRE, INNO_CONFIRMAR, INNO_USUARIO, INNO_DET) VALUES (1, 92, 'CAUSACION DE NOMINA', 'NOM', '0000', 'S', 'SYSDBA', 'N');

COMMIT WORK;

INSERT INTO IMPORTACION_INVENTARIO (IMIN_TIPO, IMIN_DATO, IMIN_COLUMNA, IMIN_ANCHO) VALUES (20, 'EMPL_AFP', 19, 20);
INSERT INTO IMPORTACION_INVENTARIO (IMIN_TIPO, IMIN_DATO, IMIN_COLUMNA, IMIN_ANCHO) VALUES (20, 'EMPL_AREA', 24, 1);
INSERT INTO IMPORTACION_INVENTARIO (IMIN_TIPO, IMIN_DATO, IMIN_COLUMNA, IMIN_ANCHO) VALUES (20, 'EMPL_ARP', 18, 20);
INSERT INTO IMPORTACION_INVENTARIO (IMIN_TIPO, IMIN_DATO, IMIN_COLUMNA, IMIN_ANCHO) VALUES (20, 'EMPL_AUXTR', 20, 1);
INSERT INTO IMPORTACION_INVENTARIO (IMIN_TIPO, IMIN_DATO, IMIN_COLUMNA, IMIN_ANCHO) VALUES (20, 'EMPL_BANCO', 26, 1);
INSERT INTO IMPORTACION_INVENTARIO (IMIN_TIPO, IMIN_DATO, IMIN_COLUMNA, IMIN_ANCHO) VALUES (20, 'EMPL_CARGO', 15, 60);
INSERT INTO IMPORTACION_INVENTARIO (IMIN_TIPO, IMIN_DATO, IMIN_COLUMNA, IMIN_ANCHO) VALUES (20, 'EMPL_CUENTA', 27, 20);
INSERT INTO IMPORTACION_INVENTARIO (IMIN_TIPO, IMIN_DATO, IMIN_COLUMNA, IMIN_ANCHO) VALUES (20, 'EMPL_DPTO', 22, 1);
INSERT INTO IMPORTACION_INVENTARIO (IMIN_TIPO, IMIN_DATO, IMIN_COLUMNA, IMIN_ANCHO) VALUES (20, 'EMPL_EPS', 17, 20);
INSERT INTO IMPORTACION_INVENTARIO (IMIN_TIPO, IMIN_DATO, IMIN_COLUMNA, IMIN_ANCHO) VALUES (20, 'EMPL_FORMPAGO', 21, 1);
INSERT INTO IMPORTACION_INVENTARIO (IMIN_TIPO, IMIN_DATO, IMIN_COLUMNA, IMIN_ANCHO) VALUES (20, 'EMPL_PPAGO', 16, 1);
INSERT INTO IMPORTACION_INVENTARIO (IMIN_TIPO, IMIN_DATO, IMIN_COLUMNA, IMIN_ANCHO) VALUES (20, 'EMPL_SALVAR', 13, 1);
INSERT INTO IMPORTACION_INVENTARIO (IMIN_TIPO, IMIN_DATO, IMIN_COLUMNA, IMIN_ANCHO) VALUES (20, 'EMPL_SECC', 23, 1);
INSERT INTO IMPORTACION_INVENTARIO (IMIN_TIPO, IMIN_DATO, IMIN_COLUMNA, IMIN_ANCHO) VALUES (20, 'EMPL_SEXO', 14, 1);
INSERT INTO IMPORTACION_INVENTARIO (IMIN_TIPO, IMIN_DATO, IMIN_COLUMNA, IMIN_ANCHO) VALUES (20, 'EMPL_TIPOCUENTA', 28, 1);
INSERT INTO IMPORTACION_INVENTARIO (IMIN_TIPO, IMIN_DATO, IMIN_COLUMNA, IMIN_ANCHO) VALUES (20, 'STCO_COD', 12, 2);
INSERT INTO IMPORTACION_INVENTARIO (IMIN_TIPO, IMIN_DATO, IMIN_COLUMNA, IMIN_ANCHO) VALUES (20, 'TCOT_COD', 11, 2);
INSERT INTO IMPORTACION_INVENTARIO (IMIN_TIPO, IMIN_DATO, IMIN_COLUMNA, IMIN_ANCHO) VALUES (20, 'TERC_APELLIDO1', 2, 60);
INSERT INTO IMPORTACION_INVENTARIO (IMIN_TIPO, IMIN_DATO, IMIN_COLUMNA, IMIN_ANCHO) VALUES (20, 'TERC_APELLIDO2', 3, 60);
INSERT INTO IMPORTACION_INVENTARIO (IMIN_TIPO, IMIN_DATO, IMIN_COLUMNA, IMIN_ANCHO) VALUES (20, 'TERC_CEL', 10, 25);
INSERT INTO IMPORTACION_INVENTARIO (IMIN_TIPO, IMIN_DATO, IMIN_COLUMNA, IMIN_ANCHO) VALUES (20, 'TERC_CIU', 8, 40);
INSERT INTO IMPORTACION_INVENTARIO (IMIN_TIPO, IMIN_DATO, IMIN_COLUMNA, IMIN_ANCHO) VALUES (20, 'TERC_DIR', 7, 60);
INSERT INTO IMPORTACION_INVENTARIO (IMIN_TIPO, IMIN_DATO, IMIN_COLUMNA, IMIN_ANCHO) VALUES (20, 'TERC_NIT', 1, 20);
INSERT INTO IMPORTACION_INVENTARIO (IMIN_TIPO, IMIN_DATO, IMIN_COLUMNA, IMIN_ANCHO) VALUES (20, 'TERC_NOM', 6, 60);
INSERT INTO IMPORTACION_INVENTARIO (IMIN_TIPO, IMIN_DATO, IMIN_COLUMNA, IMIN_ANCHO) VALUES (20, 'TERC_NOMBRE1', 4, 60);
INSERT INTO IMPORTACION_INVENTARIO (IMIN_TIPO, IMIN_DATO, IMIN_COLUMNA, IMIN_ANCHO) VALUES (20, 'TERC_NOMBRE2', 5, 60);
INSERT INTO IMPORTACION_INVENTARIO (IMIN_TIPO, IMIN_DATO, IMIN_COLUMNA, IMIN_ANCHO) VALUES (20, 'TERC_TEL', 9, 40);
INSERT INTO IMPORTACION_INVENTARIO (IMIN_TIPO, IMIN_DATO, IMIN_COLUMNA, IMIN_ANCHO) VALUES (20, 'TERC_TIPOID', 13, 1);
INSERT INTO IMPORTACION_INVENTARIO (IMIN_TIPO, IMIN_DATO, IMIN_COLUMNA, IMIN_ANCHO) VALUES (21, 'ADMI_AFC', 8, 1);
INSERT INTO IMPORTACION_INVENTARIO (IMIN_TIPO, IMIN_DATO, IMIN_COLUMNA, IMIN_ANCHO) VALUES (21, 'ADMI_AFP', 11, 1);
INSERT INTO IMPORTACION_INVENTARIO (IMIN_TIPO, IMIN_DATO, IMIN_COLUMNA, IMIN_ANCHO) VALUES (21, 'ADMI_ARP', 10, 1);
INSERT INTO IMPORTACION_INVENTARIO (IMIN_TIPO, IMIN_DATO, IMIN_COLUMNA, IMIN_ANCHO) VALUES (21, 'ADMI_CCF', 12, 1);
INSERT INTO IMPORTACION_INVENTARIO (IMIN_TIPO, IMIN_DATO, IMIN_COLUMNA, IMIN_ANCHO) VALUES (21, 'ADMI_COD', 7, 20);
INSERT INTO IMPORTACION_INVENTARIO (IMIN_TIPO, IMIN_DATO, IMIN_COLUMNA, IMIN_ANCHO) VALUES (21, 'ADMI_EPS', 9, 1);
INSERT INTO IMPORTACION_INVENTARIO (IMIN_TIPO, IMIN_DATO, IMIN_COLUMNA, IMIN_ANCHO) VALUES (21, 'ADMI_INTDIA', 13, 1);
INSERT INTO IMPORTACION_INVENTARIO (IMIN_TIPO, IMIN_DATO, IMIN_COLUMNA, IMIN_ANCHO) VALUES (21, 'TERC_CEL', 6, 25);
INSERT INTO IMPORTACION_INVENTARIO (IMIN_TIPO, IMIN_DATO, IMIN_COLUMNA, IMIN_ANCHO) VALUES (21, 'TERC_CIU', 4, 40);
INSERT INTO IMPORTACION_INVENTARIO (IMIN_TIPO, IMIN_DATO, IMIN_COLUMNA, IMIN_ANCHO) VALUES (21, 'TERC_DIR', 3, 60);
INSERT INTO IMPORTACION_INVENTARIO (IMIN_TIPO, IMIN_DATO, IMIN_COLUMNA, IMIN_ANCHO) VALUES (21, 'TERC_NIT', 1, 20);
INSERT INTO IMPORTACION_INVENTARIO (IMIN_TIPO, IMIN_DATO, IMIN_COLUMNA, IMIN_ANCHO) VALUES (21, 'TERC_NOM', 2, 60);
INSERT INTO IMPORTACION_INVENTARIO (IMIN_TIPO, IMIN_DATO, IMIN_COLUMNA, IMIN_ANCHO) VALUES (21, 'TERC_TEL', 5, 40);

COMMIT WORK;

INSERT INTO CONFIGURACION (CONF_MODULO, CONF_CATEGORIA, CONF_PROPIEDAD, CONF_VALOR, CONF_POSIBLES, CONF_AYUDA) VALUES ('NOMINA', 'GENERAL', 'PERIODICIDAD DE PAGO PARA VER NOVEDADES POR PERIODO', 'Q', 'M,Q,S', 'M:Mensual,Q:Quincenal,S:Semanal');

COMMIT WORK;

INSERT INTO NOMBRES_CAMPOS (NOMBRE, DESCRIPCION) VALUES ('TCOT_COD', 'Tipo cotizante');
INSERT INTO NOMBRES_CAMPOS (NOMBRE, DESCRIPCION) VALUES ('STCO_COD', 'Subtipo cotizante');
INSERT INTO NOMBRES_CAMPOS (NOMBRE, DESCRIPCION) VALUES ('EMPL_SALVAR', 'Salario variablo (S/N)');
INSERT INTO NOMBRES_CAMPOS (NOMBRE, DESCRIPCION) VALUES ('EMPL_SEXO', 'Sexo');
INSERT INTO NOMBRES_CAMPOS (NOMBRE, DESCRIPCION) VALUES ('EMPL_CARGO', 'Cargo');
INSERT INTO NOMBRES_CAMPOS (NOMBRE, DESCRIPCION) VALUES ('EMPL_PPAGO', 'Periodicidad');
INSERT INTO NOMBRES_CAMPOS (NOMBRE, DESCRIPCION) VALUES ('EMPL_EPS', 'Nit EPS');
INSERT INTO NOMBRES_CAMPOS (NOMBRE, DESCRIPCION) VALUES ('EMPL_ARP', 'Nit ARP');
INSERT INTO NOMBRES_CAMPOS (NOMBRE, DESCRIPCION) VALUES ('EMPL_AFP', 'Nit AFP');
INSERT INTO NOMBRES_CAMPOS (NOMBRE, DESCRIPCION) VALUES ('EMPL_AUXTR', 'Auxilio de transporte (S/N)');
INSERT INTO NOMBRES_CAMPOS (NOMBRE, DESCRIPCION) VALUES ('EMPL_FORMPAGO', 'Forma de pago (C:Caja/ B:Banco)');
INSERT INTO NOMBRES_CAMPOS (NOMBRE, DESCRIPCION) VALUES ('ADMI_COD', 'Codigo Administradora');
INSERT INTO NOMBRES_CAMPOS (NOMBRE, DESCRIPCION) VALUES ('ADMI_AFC', 'AFC(S/N)');
INSERT INTO NOMBRES_CAMPOS (NOMBRE, DESCRIPCION) VALUES ('ADMI_EPS', 'EPS(S/N)');
INSERT INTO NOMBRES_CAMPOS (NOMBRE, DESCRIPCION) VALUES ('ADMI_ARP', 'ARP(S/N)');
INSERT INTO NOMBRES_CAMPOS (NOMBRE, DESCRIPCION) VALUES ('ADMI_AFP', 'AFP(S/N)');
INSERT INTO NOMBRES_CAMPOS (NOMBRE, DESCRIPCION) VALUES ('ADMI_CCF', 'CCF(S/N)');
INSERT INTO NOMBRES_CAMPOS (NOMBRE, DESCRIPCION) VALUES ('ADMI_INTDIA', 'Tipo de intereses (M:Mensual/D:Diario)');
INSERT INTO NOMBRES_CAMPOS (NOMBRE, DESCRIPCION) VALUES ('EMPL_DPTO', 'Departamento');
INSERT INTO NOMBRES_CAMPOS (NOMBRE, DESCRIPCION) VALUES ('EMPL_SECC', 'Sección');
INSERT INTO NOMBRES_CAMPOS (NOMBRE, DESCRIPCION) VALUES ('EMPL_AREA', 'Area');
INSERT INTO NOMBRES_CAMPOS (NOMBRE, DESCRIPCION) VALUES ('EMPL_SALARIO', 'Salario');
INSERT INTO NOMBRES_CAMPOS (NOMBRE, DESCRIPCION) VALUES ('EMPL_BANCO', 'Banco');
INSERT INTO NOMBRES_CAMPOS (NOMBRE, DESCRIPCION) VALUES ('EMPL_CUENTA', 'Cuenta');
INSERT INTO NOMBRES_CAMPOS (NOMBRE, DESCRIPCION) VALUES ('EMPL_TIPOCUENTA', 'Tipo de cuenta (A: Ahorros / C: Corriente)');
INSERT INTO NOMBRES_CAMPOS (NOMBRE, DESCRIPCION) VALUES ('TCOT_COD', 'Tipo cotizante');
INSERT INTO NOMBRES_CAMPOS (NOMBRE, DESCRIPCION) VALUES ('STCO_COD', 'Subtipo cotizante');
INSERT INTO NOMBRES_CAMPOS (NOMBRE, DESCRIPCION) VALUES ('EMPL_SALVAR', 'Salario variablo (S/N)');
INSERT INTO NOMBRES_CAMPOS (NOMBRE, DESCRIPCION) VALUES ('EMPL_SEXO', 'Sexo');
INSERT INTO NOMBRES_CAMPOS (NOMBRE, DESCRIPCION) VALUES ('EMPL_CARGO', 'Cargo');
INSERT INTO NOMBRES_CAMPOS (NOMBRE, DESCRIPCION) VALUES ('EMPL_PPAGO', 'Periodicidad');
INSERT INTO NOMBRES_CAMPOS (NOMBRE, DESCRIPCION) VALUES ('EMPL_EPS', 'Nit EPS');
INSERT INTO NOMBRES_CAMPOS (NOMBRE, DESCRIPCION) VALUES ('EMPL_ARP', 'Nit ARP');
INSERT INTO NOMBRES_CAMPOS (NOMBRE, DESCRIPCION) VALUES ('EMPL_AFP', 'Nit AFP');
INSERT INTO NOMBRES_CAMPOS (NOMBRE, DESCRIPCION) VALUES ('EMPL_AUXTR', 'Auxilio de transporte (S/N)');
INSERT INTO NOMBRES_CAMPOS (NOMBRE, DESCRIPCION) VALUES ('EMPL_FORMPAGO', 'Forma de pago (C:Caja/ B:Banco)');
INSERT INTO NOMBRES_CAMPOS (NOMBRE, DESCRIPCION) VALUES ('ADMI_COD', 'Codigo Administradora');
INSERT INTO NOMBRES_CAMPOS (NOMBRE, DESCRIPCION) VALUES ('ADMI_AFC', 'AFC(S/N)');
INSERT INTO NOMBRES_CAMPOS (NOMBRE, DESCRIPCION) VALUES ('ADMI_EPS', 'EPS(S/N)');
INSERT INTO NOMBRES_CAMPOS (NOMBRE, DESCRIPCION) VALUES ('ADMI_ARP', 'ARP(S/N)');
INSERT INTO NOMBRES_CAMPOS (NOMBRE, DESCRIPCION) VALUES ('ADMI_AFP', 'AFP(S/N)');
INSERT INTO NOMBRES_CAMPOS (NOMBRE, DESCRIPCION) VALUES ('ADMI_CCF', 'CCF(S/N)');
INSERT INTO NOMBRES_CAMPOS (NOMBRE, DESCRIPCION) VALUES ('ADMI_INTDIA', 'Tipo de intereses (M:Mensual/D:Diario)');
INSERT INTO NOMBRES_CAMPOS (NOMBRE, DESCRIPCION) VALUES ('EMPL_DPTO', 'Departamento');
INSERT INTO NOMBRES_CAMPOS (NOMBRE, DESCRIPCION) VALUES ('EMPL_SECC', 'Sección');
INSERT INTO NOMBRES_CAMPOS (NOMBRE, DESCRIPCION) VALUES ('EMPL_AREA', 'Area');
INSERT INTO NOMBRES_CAMPOS (NOMBRE, DESCRIPCION) VALUES ('EMPL_SALARIO', 'Salario');
INSERT INTO NOMBRES_CAMPOS (NOMBRE, DESCRIPCION) VALUES ('EMPL_BANCO', 'Banco');
INSERT INTO NOMBRES_CAMPOS (NOMBRE, DESCRIPCION) VALUES ('EMPL_CUENTA', 'Cuenta');
INSERT INTO NOMBRES_CAMPOS (NOMBRE, DESCRIPCION) VALUES ('EMPL_TIPOCUENTA', 'Tipo de cuenta (A: Ahorros / C: Corriente)');

COMMIT WORK;

/******************************************************************************/
/****                             Primary Keys                             ****/
/******************************************************************************/

ALTER TABLE ADMINISTRADORA ADD CONSTRAINT PK_ADMINISTRADORA PRIMARY KEY (TERC_NIT);
ALTER TABLE AFP_ESPECIAL ADD CONSTRAINT PK_AFP_ESPECIAL PRIMARY KEY (AFPE_ID);
ALTER TABLE ANTICIPOS_NOMINA ADD CONSTRAINT PK_ANTICIPOS_NOMINA PRIMARY KEY (ANNO_ID);
ALTER TABLE AREA ADD CONSTRAINT PK_AREA PRIMARY KEY (DPTO_COD, SECC_COD, AREA_COD);
ALTER TABLE CESANTIAS ADD CONSTRAINT PK_CESANTIAS PRIMARY KEY (CESA_ID);
ALTER TABLE CESANTIAS_RETIROS ADD CONSTRAINT PK_CESANTIAS_RETIROS PRIMARY KEY (TERC_NIT, CESR_FECHA);
ALTER TABLE CESANTIA_DETALLE ADD CONSTRAINT PK_CESANTIA_DETALLE PRIMARY KEY (CESA_ID);
ALTER TABLE CONCEPTOS_NOMINA ADD CONSTRAINT PK_CONCEPTOS_NOMINA PRIMARY KEY (CONC_COD);
ALTER TABLE DEPARTAMENTO ADD CONSTRAINT PK_DEPARTAMENTO PRIMARY KEY (DPTO_COD);
ALTER TABLE EMPLEADOS ADD CONSTRAINT PK_EMPLEADOS PRIMARY KEY (TERC_NIT);
ALTER TABLE EMPLEADO_BENEFICIARIOS ADD CONSTRAINT PK_EMPLEADO_BENEFICIARIOS PRIMARY KEY (TERC_NIT, EMBE_ITEM);
ALTER TABLE EMPLEADO_CONCEPTOS ADD CONSTRAINT PK_EMPLEADO_CONCEPTOS PRIMARY KEY (TERC_NIT, CONC_COD);
ALTER TABLE EMPLEADO_FORMACION ADD CONSTRAINT PK_EMPLEADO_FORMACION PRIMARY KEY (TERC_NIT, EMFO_ITEM);
ALTER TABLE EMPLEADO_LLAMADOS ADD CONSTRAINT PK_EMPLEADO_LLAMADOS PRIMARY KEY (TERC_NIT, EMLL_ITEM);
ALTER TABLE INCAPACIDADES ADD CONSTRAINT PK_INCAPACIDADES PRIMARY KEY (TERC_NIT, INCA_ID);
ALTER TABLE INTERFAZ_NOMINA ADD CONSTRAINT PK_INTERFAZ_NOMINA PRIMARY KEY (INNO_ID);
ALTER TABLE LIQUIDACION ADD CONSTRAINT PK_LIQUIDACION PRIMARY KEY (TERC_NIT, LIQD_ID);
ALTER TABLE LLAMADOS_ATENCION ADD CONSTRAINT PK_LLAMADOS_ATENCION PRIMARY KEY (LLAT_COD);
ALTER TABLE NIVEL_FORMACION ADD CONSTRAINT PK_NIVEL_FORMACION PRIMARY KEY (NIVI_COD);
ALTER TABLE NOMINA ADD CONSTRAINT PK_NOMINA PRIMARY KEY (NOMI_ID);
ALTER TABLE NOMINA_CONCEPTOS ADD CONSTRAINT PK_NOMINA_CONCEPTOS_NOMI_ID PRIMARY KEY (NOCO_ITEM, NOMI_ID);
ALTER TABLE NOMINA_DETALLE ADD CONSTRAINT PK_NOMINA_DETALLE PRIMARY KEY (NOMI_ID, TERC_NIT);
ALTER TABLE NOMINA_NOVEDADES ADD CONSTRAINT PK_NOMINA_NOVEDADES PRIMARY KEY (NONO_ID);
ALTER TABLE PAGO_APORTES ADD CONSTRAINT PK_PAGO_APORTES PRIMARY KEY (PGAP_ID, PGAP_ITEM);
ALTER TABLE PAGO_APORTES_DETALLE ADD CONSTRAINT PK_PAGO_APORTES_DETALLE PRIMARY KEY (PGAP_ID, PGAP_ITEM, PADE_ITEMDET);
ALTER TABLE PAGO_NOMINA ADD CONSTRAINT PK_PAGO_NOMINA PRIMARY KEY (PGNO_ID);
ALTER TABLE PAGO_NOMINA_DET ADD CONSTRAINT PK_PAGO_NOMINA_DET PRIMARY KEY (PGNO_ID, PGNO_ITEM);
ALTER TABLE PARAMETROS_ANO ADD CONSTRAINT PK_PARAMETROS_ANO PRIMARY KEY (PAAN_ANO)
USING INDEX PK_ANO;
ALTER TABLE PERIODO_PAGO ADD CONSTRAINT PK_PERIODO_PAGO PRIMARY KEY (PPAG_COD);
ALTER TABLE PRESTAMO_CUOTAS ADD CONSTRAINT PK_PRESTAMO_CUOTAS PRIMARY KEY (PRNO_ID, PRCU_ITEM);
ALTER TABLE PRESTAMO_NOMINA ADD CONSTRAINT PK_PRESTAMO_NOMINA PRIMARY KEY (PRNO_ID);
ALTER TABLE RETENCIONES ADD CONSTRAINT PK_RETENCIONES PRIMARY KEY (RETE_ITEM);
ALTER TABLE SECCION ADD CONSTRAINT PK_SECCION PRIMARY KEY (DPTO_COD, SECC_COD);
ALTER TABLE SUBTIPO_COTIZANTE ADD CONSTRAINT PK_SUBTIPO_COTIZANTE PRIMARY KEY (TCOT_COD, STCO_COD);
ALTER TABLE TIPOS_NOVEDAD ADD CONSTRAINT PK_TIPOS_NOVEDAD PRIMARY KEY (TNOV_COD);
ALTER TABLE TIPO_COTIZANTE ADD CONSTRAINT PK_TIPO_COTIZANTE PRIMARY KEY (TCOT_COD);
ALTER TABLE VACACIONES ADD CONSTRAINT PK_VACACIONES PRIMARY KEY (VACA_ID);


/******************************************************************************/
/****                             Foreign Keys                             ****/
/******************************************************************************/

ALTER TABLE ADMINISTRADORA ADD CONSTRAINT FK_ADMINISTRADORA_TERCEROS FOREIGN KEY (TERC_NIT) REFERENCES TERCEROS (TERC_NIT) ON DELETE CASCADE ON UPDATE CASCADE;
ALTER TABLE ANTICIPOS_NOMINA ADD CONSTRAINT FK_ANTICIPO_FK_EMPLAD_EMPLEADO FOREIGN KEY (TERC_NIT) REFERENCES EMPLEADOS (TERC_NIT);
ALTER TABLE AREA ADD CONSTRAINT FK_AREA_FK_AREA_S_SECCION FOREIGN KEY (DPTO_COD, SECC_COD) REFERENCES SECCION (DPTO_COD, SECC_COD);
ALTER TABLE CESANTIAS_RETIROS ADD CONSTRAINT FK_CESANTIA_FK_RETCES_EMPLEADO FOREIGN KEY (TERC_NIT) REFERENCES EMPLEADOS (TERC_NIT);
ALTER TABLE CESANTIA_DETALLE ADD CONSTRAINT FK_CESANTIA_FK_CESANT_CESANTIA FOREIGN KEY (CESA_ID) REFERENCES CESANTIAS (CESA_ID);
ALTER TABLE CESANTIA_DETALLE ADD CONSTRAINT FK_CESANTIA_FK_EMPLEA_EMPLEADO FOREIGN KEY (TERC_NIT) REFERENCES EMPLEADOS (TERC_NIT);
ALTER TABLE EMPLEADO_BENEFICIARIOS ADD CONSTRAINT FK_EMPLEADO_FK_BENEFI_EMPLEADO FOREIGN KEY (TERC_NIT) REFERENCES EMPLEADOS (TERC_NIT);
ALTER TABLE EMPLEADO_CONCEPTOS ADD CONSTRAINT FK_EMPLEADO_FK_EMPLEC_EMPLEADO FOREIGN KEY (TERC_NIT) REFERENCES EMPLEADOS (TERC_NIT);
ALTER TABLE EMPLEADO_FORMACION ADD CONSTRAINT FK_EMPLEADO_FK_EMPLEA_NIVEL_FO FOREIGN KEY (NIVI_COD) REFERENCES NIVEL_FORMACION (NIVI_COD);
ALTER TABLE EMPLEADO_FORMACION ADD CONSTRAINT FK_EMPLEADO_FK_FORMAE_EMPLEADO FOREIGN KEY (TERC_NIT) REFERENCES EMPLEADOS (TERC_NIT);
ALTER TABLE EMPLEADO_LLAMADOS ADD CONSTRAINT FK_EMPLEADO_FK_EMPLEA_LLAMADOS FOREIGN KEY (LLAT_COD) REFERENCES LLAMADOS_ATENCION (LLAT_COD);
ALTER TABLE EMPLEADO_LLAMADOS ADD CONSTRAINT FK_EMPLEADO_FK_EMPLLL_EMPLEADO FOREIGN KEY (TERC_NIT) REFERENCES EMPLEADOS (TERC_NIT);
ALTER TABLE INCAPACIDADES ADD CONSTRAINT FK_INCAPACI_FK_EMPLEA_EMPLEADO FOREIGN KEY (TERC_NIT) REFERENCES EMPLEADOS (TERC_NIT);
ALTER TABLE LIQUIDACION ADD CONSTRAINT FK_LIQUIDAC_FK_EMPLEA_EMPLEADO FOREIGN KEY (TERC_NIT) REFERENCES EMPLEADOS (TERC_NIT);
ALTER TABLE NOMINA_CONCEPTOS ADD CONSTRAINT FK_NOMINA_CONCEPTOS_MONI_ID FOREIGN KEY (NOMI_ID) REFERENCES NOMINA (NOMI_ID) ON DELETE CASCADE ON UPDATE CASCADE;
ALTER TABLE NOMINA_DETALLE ADD CONSTRAINT FK_NOMINA_D_FK_NOMINA_NOMINA FOREIGN KEY (NOMI_ID) REFERENCES NOMINA (NOMI_ID) ON DELETE CASCADE ON UPDATE CASCADE;
ALTER TABLE NOMINA_NOVEDADES ADD CONSTRAINT FK_NOMINA_N_FK_NOMINA_EMPLEADO FOREIGN KEY (TERC_NIT) REFERENCES EMPLEADOS (TERC_NIT);
ALTER TABLE NOMINA_NOVEDADES ADD CONSTRAINT FK_NOMINA_N_FK_NOMINA_TIPOS_NO FOREIGN KEY (TNOV_COD) REFERENCES TIPOS_NOVEDAD (TNOV_COD);
ALTER TABLE PAGO_APORTES_DETALLE ADD CONSTRAINT FK_PAGO_APORTES_DETALLE_2 FOREIGN KEY (PGAP_ID, PGAP_ITEM) REFERENCES PAGO_APORTES (PGAP_ID, PGAP_ITEM);
ALTER TABLE PAGO_NOMINA_DET ADD CONSTRAINT FK_PAGO_NOM_FK_EMPLEA_EMPLEADO FOREIGN KEY (TERC_NIT) REFERENCES EMPLEADOS (TERC_NIT);
ALTER TABLE PAGO_NOMINA_DET ADD CONSTRAINT FK_PAGO_NOM_FK_PAGONO_PAGO_NOM FOREIGN KEY (PGNO_ID) REFERENCES PAGO_NOMINA (PGNO_ID);
ALTER TABLE PRESTAMO_CUOTAS ADD CONSTRAINT FK_PRESTAMO_FK_PRESTA_PRESTAMO FOREIGN KEY (PRNO_ID) REFERENCES PRESTAMO_NOMINA (PRNO_ID);
ALTER TABLE PRESTAMO_NOMINA ADD CONSTRAINT FK_PRESTAMO_FK_EMPLEA_EMPLEADO FOREIGN KEY (TERC_NIT) REFERENCES EMPLEADOS (TERC_NIT);
ALTER TABLE SECCION ADD CONSTRAINT FK_SECCION_FK_SECC_D_DEPARTAM FOREIGN KEY (DPTO_COD) REFERENCES DEPARTAMENTO (DPTO_COD);
ALTER TABLE SUBTIPO_COTIZANTE ADD CONSTRAINT FK_SUBTIPO__FK_SUBTIP_TIPO_COT FOREIGN KEY (TCOT_COD) REFERENCES TIPO_COTIZANTE (TCOT_COD);
ALTER TABLE VACACIONES ADD CONSTRAINT FK_VACACION_FK_EMPLEA_EMPLEADO FOREIGN KEY (TERC_NIT) REFERENCES EMPLEADOS (TERC_NIT);


/******************************************************************************/
/****                               Indices                                ****/
/******************************************************************************/

CREATE INDEX INTERFAZ_NOMINA_IDX2 ON INTERFAZ_NOMINA (TIDO_COD);


/******************************************************************************/
/****                               Triggers                               ****/
/******************************************************************************/


SET TERM ^ ;


/******************************************************************************/
/****                         Triggers for tables                          ****/
/******************************************************************************/



/* Trigger: EMPLEADOS_BI */
CREATE TRIGGER EMPLEADOS_BI FOR EMPLEADOS
ACTIVE BEFORE INSERT POSITION 0
as
begin
  if (NEW.stco_cod IS NULL) then
NEW.stco_cod = 0;
end
^


/* Trigger: EMPLEADO_CONCEPTOS_BI */
CREATE TRIGGER EMPLEADO_CONCEPTOS_BI FOR EMPLEADO_CONCEPTOS
ACTIVE BEFORE INSERT POSITION 0
as
begin
if (new.emco_monto is null) then
new.emco_monto = 0;
if (new.emco_porc is null) then
new.emco_porc = 0;
end
^


/* Trigger: EMPLEADO_LLAMADOS_BI */
CREATE TRIGGER EMPLEADO_LLAMADOS_BI FOR EMPLEADO_LLAMADOS
ACTIVE BEFORE INSERT POSITION 0
AS
declare VARIABLE IT integer;
begin
SELECT MAX (emll_item) FROM empleado_llamados into :IT;
new.emll_item = IT+1;
end
^


/* Trigger: NOMINA_AD */
CREATE TRIGGER NOMINA_AD FOR NOMINA
ACTIVE AFTER DELETE POSITION 0
as
begin
  delete from consolidado_nomina  where cono_tipoori = 92 and cono_idori = OLD.nomi_id;
end
^


/* Trigger: NOMINA_BI */
CREATE TRIGGER NOMINA_BI FOR NOMINA
ACTIVE BEFORE INSERT POSITION 0
as
declare variable existe integer;
begin
  existe = 0;
  select count(nomi_id) from nomina where NOMI_PERIODOCIDAD = new.NOMI_PERIODOCIDAD and nomi_ano = new.nomi_ano and nomi_periodo = new.nomi_periodo into :existe;
  if (existe > 0) then
    exception nomina_registrada;
end
^


/* Trigger: NOMINA_CONCEPTOS_BI0 */
CREATE TRIGGER NOMINA_CONCEPTOS_BI0 FOR NOMINA_CONCEPTOS
ACTIVE BEFORE INSERT POSITION 0
AS
declare variable ITEM INTEGER;
declare variable NOMIID INTEGER;
declare variable NOMIIDmaestro INTEGER;
begin
  /* Trigger text */
  select max (NOMI_ID) FROM nomina INTO :NOMIIDMAESTRO;
  SELECT MAX (NOCO_ITEM) FROM nomina_conceptos WHERE NOMI_ID = :NOMIIDMAESTRO
  into :item;
  if (item is null) then
  BEGIN
  item = 1;
  NEW.nomi_id = :NOMIIDMAESTRO;
  NEW.noco_item = :ITEM;
  END
  ELSE
  BEGIN
  ITEM = ITEM + 1;
  NEW.nomi_id = :NOMIIDMAESTRO;
  NEW.noco_item = :ITEM;
  END
  if (new.noco_deduc = 'S') then
  NEW.noco_valor = NEW.noco_valor * (-1);
end
^


/* Trigger: RETENCIONES_BI */
CREATE TRIGGER RETENCIONES_BI FOR RETENCIONES
ACTIVE BEFORE INSERT POSITION 0
AS
begin
  /* Trigger text */
   NEW.rete_item = gen_id(id_retenciones, 1);
end
^

/* Trigger: CONSOLIDADO_NOMINA_PROV_BI */
CREATE TRIGGER CONSOLIDADO_NOMINA_PROV_BI FOR CONSOLIDADO_NOMINA_PROV
ACTIVE BEFORE INSERT POSITION 0
as
begin
if (new.copo_abono is null) then
new.copo_abono = 0;
end
^


SET TERM ; ^



/******************************************************************************/
/****                          Stored Procedures                           ****/
/******************************************************************************/


SET TERM ^ ;

ALTER PROCEDURE CAMBIE_ID_NOMINA
RETURNS (
    ID INTEGER)
AS
declare variable numrows integer;
BEGIN
/* TRAE EL ID NUEVO Y LO ACTUALIZA */
NUMROWS = 1;
while (NUMROWS > 0) DO
    BEGIN
    ID = GEN_ID(id_nomina, 1);
    /* VERIFIQUE SI YA EXISTE */
    SELECT COUNT(*) FROM NOMINA WHERE NOMI_ID = :ID INTO :NUMROWS;
    END
SUSPEND;
END
^

ALTER PROCEDURE CAMBIE_ID_NOVEDAD
RETURNS (
    IDN INTEGER)
AS
begin
  IDN = GEN_ID(id_nomi_novedades, 1);
  suspend;
end
^

ALTER PROCEDURE CAMBIE_ID_PAGO_NOMINA
RETURNS (
    ID INTEGER)
AS
declare variable numrows integer;
BEGIN
/* TRAE EL ID NUEVO Y LO ACTUALIZA */
NUMROWS = 1;
while (NUMROWS > 0) DO
    BEGIN
    ID = GEN_ID(id_pagonomi, 1);
    /* VERIFIQUE SI YA EXISTE */
    SELECT COUNT(*) FROM PAGO_NOMINA WHERE PGNO_ID = :ID INTO :NUMROWS;
    END
SUSPEND;
END
^

ALTER PROCEDURE CAMBIE_ID_PRESTAMOS
RETURNS (
    ID INTEGER)
AS
declare variable numrows integer;
BEGIN
/* TRAE EL ID NUEVO Y LO ACTUALIZA */
NUMROWS = 1;
while (NUMROWS > 0) DO
    BEGIN
    ID = GEN_ID(id_prestamos, 1);
    SELECT COUNT(*) FROM prestamo_nomina WHERE PRNO_ID = :ID INTO :NUMROWS;
    END
SUSPEND;
END
^

ALTER PROCEDURE CAUSA_NOMINA (
    FEC DATE,
    PERIODO INTEGER,
    PERIODICIDAD INTEGER,
    PAGOGLOBAL CHAR(1) CHARACTER SET NONE,
    ANO CHAR(4) CHARACTER SET NONE)
RETURNS (
    IDNOMINA INTEGER)
AS
declare variable item integer;
declare variable nite varchar(20) character set none;
declare variable nit_tercero varchar(20);
declare variable concept integer;
declare variable montos numeric(18,2);
declare variable porcen numeric(9,4);
declare variable entidad varchar(20);
declare variable conc_cod integer;
declare variable conc_deduc char(1);
declare variable conc_porc numeric(9,4);
declare variable conc_entidad integer;
declare variable conc_monto numeric(18,2);
declare variable conc_modifi char(1);
declare variable conc_promedio char(1);
declare variable emco_perprom integer;
declare variable valor numeric(18,2);
declare variable diaslab integer;
declare variable conc_prov char(1);
declare variable conc_aporte char(1);
declare variable numeroprom integer;
declare variable conc_aplicaprom char(1);
declare variable perinicial integer;
declare variable anoprom integer;
declare variable conc_dias char(1);
declare variable conc_otroconc char(1);
declare variable conc_codotroconc integer;
declare variable anosum integer;
declare variable salario char(1) character set none;
declare variable liquidaper integer;
declare variable rmod numeric(2,2);
declare variable basico numeric(18,2);
begin
/*SI ES QUINCENAL*/
if (periodicidad = 2) then
BEGIN
execute procedure cambie_id_nomina returning_values(:idnomina);
insert into nomina (nomi_id, NOMI_FECCAUSA, NOMI_PAGOGLOBAL, NOMI_PERIODOCIDAD, NOMI_PERIODO, NOMI_ANO, NOMI_LIQOK)
values (:IDNOMINA, :fec,:pagoglobal, :periodicidad, :periodo, :ano, 'N');
 BEGIN
    item = 1;
    FOR SELECT E.TERC_NIT, E.empl_salario
    FROM EMPLEADOS E
    where E.empl_ppago = 2
    INTO :nite, :basico
    do
    begin
    FOR SELECT CE.TERC_NIT, CE.CONC_COD, CE.EMCO_MONTO, CE.EMCO_PORC, ce.empl_entidad, CE.emco_perprom, CE.emco_luquidaper,    CN.CONC_COD, CN.CONC_DEDUC,CN.CONC_PORC, CN.CONC_ENTIDAD, CN.CONC_MONTO,  CN.CONC_DIAS, CN.CONC_MODIFI,
    CN.CONC_PROMEDIO, CN.conc_salario, CE.emco_perprom, CN.conc_prov, CN.conc_aporte, CN.conc_aplicaprom, cn.conc_otroconc, cn.conc_codotroconc
    FROM empleado_conceptos CE, CONCEPTOS_NOMINA CN WHERE ((CE.terc_nit = :nite) AND (CE.CONC_COD = CN.CONC_COD) AND (CN.conc_fecini <= :fec AND CN.conc_fecfin >= :FEC) ) or ((CE.terc_nit = :nite)
    AND (CE.CONC_COD = CN.CONC_COD) AND (cn.conc_todosper = 'N') AND (CE.emco_ppago = :periodo)) or  ((CE.terc_nit = :nite) AND (CE.CONC_COD = CN.CONC_COD) AND cn.conc_todosper = 'S')  ORDER BY (TERC_NIT)
    INTO :nit_tercero, :concept,  :montos, :porcen, :entidad, :numeroprom, :liquidaper ,:CONC_COD, :CONC_DEDUC, :CONC_PORC,
    :CONC_ENTIDAD, :CONC_MONTO, :CONC_DIAS, :CONC_MODIFI,:CONC_PROMEDIO, :salario,:EMCO_PERPROM, :conc_prov, :conc_aporte , :CONC_APLICAPROM, :conc_otroconc, :conc_codotroconc
    DO
    BEGIN
    if (conc_dias = 'S') then
    execute procedure DIAS_LABORADOS (:nite, :periodo) returning_values (:diaslab);
    else
    BEGIN
    if (liquidaper = 0) then
    diaslab = 15;
    else
    if (liquidaper = 1) then
    diaslab = 30;
    else
    if (liquidaper = 2) then
    diaslab = 60;
    END
    if ((:montos = 0) or (:montos IS NULL)) then
      BEGIN
      if ((CONC_PORC = 0 AND :porcen = 0) or (CONC_PORC is null AND :porcen = 0) or (CONC_PORC = 0 AND :porcen is null) or (CONC_PORC is null AND :porcen is null) ) then
        BEGIN
        if ((conc_monto <> 0) AND (conc_monto IS NOT NULL) ) then
        BEGIN
        VALOR = :CONC_MONTO/30 * :diaslab;
        EXECUTE PROCEDURE REDONDEE(:valor, 0) returning_values (VALOR);
        END
        ELSE
        BEGIN
        conc_monto = :basico;
        VALOR = (:conc_monto/30 * :diaslab );
        EXECUTE PROCEDURE REDONDEE(:valor, 0) returning_values (VALOR);
        END
        END
       ELSE
       BEGIN
        if (:porcen <> 0) then
          BEGIN
            if ((conc_monto <> 0) AND (conc_monto IS NOT NULL) ) then
            BEGIN
              VALOR = ((:CONC_MONTO/30 * :diaslab ) * :PORCEN) /100;
              EXECUTE PROCEDURE REDONDEE(:valor, 0)returning_values (VALOR);
            end
            else
            begin
              conc_monto = :basico;
              VALOR = ((:CONC_MONTO/30 * :diaslab ) * :PORCEN) /100;
              EXECUTE PROCEDURE REDONDEE(:valor, 0)returning_values (VALOR);
            end
          END
          ELSE
          BEGIN
            if ((conc_monto <> 0) AND (conc_monto IS NOT NULL) ) then
            BEGIN
              VALOR = ((:CONC_MONTO/30 * :diaslab ) * :conc_porc) /100;
              EXECUTE PROCEDURE REDONDEE(:valor, 0)returning_values (VALOR);
            END
            else
            BEGIN
              conc_monto = :basico;
              VALOR = ((:CONC_MONTO/30 * :diaslab ) * :conc_porc) /100;
              EXECUTE PROCEDURE REDONDEE(:valor, 0)returning_values (VALOR);
            END
          end
       END
      END
    ELSE
    BEGIN
      if (CONC_PORC = 0 AND :porcen = 0) then
      BEGIN
      VALOR = (:montos/30 * :diaslab );
      EXECUTE PROCEDURE REDONDEE(:valor, 0)returning_values (VALOR);
      END
      ELSE
      BEGIN
        if (:porcen <> 0) then
          BEGIN
          VALOR = ((:MONTOS/30 * :diaslab ) * :PORCEN) /100;
          EXECUTE PROCEDURE REDONDEE(:valor, 0)returning_values (VALOR);
          END
          ELSE
          BEGIN
          VALOR = ((:montos/30 * :diaslab ) * :CONC_PORC) /100;
          END
          EXECUTE PROCEDURE REDONDEE(:valor, 0)returning_values (VALOR);
       END
   END
    if (conc_promedio = 'S') then
    BEGIN
    perinicial = :periodo - (:numeroprom) + 1;
    anoprom = cast (ano as integer);
    if (perinicial <= 0) then
    BEGIN
    perinicial = 24 + :PERINICIAL;
    anoprom = CAST(ANO AS INTEGER) - 1;
    END
    SELECT sum (noco_valor) FROM nomina_conceptos n where n.noco_aplicaprom = 'S' AND N.noco_periodo >= :perinicial - 1 AND N.noco_periodo < :periodo AND N.noco_ano >= :anoprom AND N.noco_ano <= :ano and terc_nit = :nite INTO :valor;
    valor = valor / numeroprom;
    EXECUTE PROCEDURE REDONDEE(:valor, 0)returning_values (VALOR);
    END
    if (conc_otroconc = 'S') then
    BEGIN
    anosum = cast(ano as integer);
    anosum = anosum - 1;
    select sum (noco_valor) from nomina_conceptos n where n.noco_ano = :anosum and n.conc_cod = :conc_codotroconc into :valor;
    END
    if (liquidaper = 0) then
        insert into nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO)
        values (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario);
    else
    if (liquidaper = 1) then
    begin
    rmod = mod(:periodo, 2);
    if (rmod = 0) then
        insert into nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO)
        values (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario);
    end
    else
    if (liquidaper = 2) then
    begin
    rmod = mod(:periodo, 4);
    if (rmod = 0) then
        insert into nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO)
        values (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario);
    end
item = :item + 1;
END
end
end
end
else
/*SI ES MENSUAL*/
if (periodicidad = 1) then
BEGIN
execute procedure cambie_id_nomina returning_values(:idnomina);
insert into nomina (nomi_id, NOMI_FECCAUSA, NOMI_PAGOGLOBAL, NOMI_PERIODOCIDAD, NOMI_PERIODO, NOMI_ANO, NOMI_LIQOK)
values (:IDNOMINA, :fec,:pagoglobal, :periodicidad, :periodo, :ano, 'N');
    BEGIN
    item = 1;
    FOR SELECT E.TERC_NIT
    FROM EMPLEADOS E
    where E.empl_ppago = 1
    INTO :nite
    do
    FOR SELECT CE.TERC_NIT, CE.CONC_COD, CE.EMCO_MONTO, CE.EMCO_PORC, ce.empl_entidad, CE.emco_perprom,
    CN.CONC_COD, CN.CONC_DEDUC,CN.CONC_PORC, CN.CONC_ENTIDAD, CN.CONC_MONTO,  CN.CONC_DIAS, CN.CONC_MODIFI,
    CN.CONC_PROMEDIO, CN.conc_salario, CE.emco_perprom, CN.conc_prov, CN.conc_aporte, CN.conc_aplicaprom, cn.conc_otroconc, cn.conc_codotroconc
    FROM empleado_conceptos CE, CONCEPTOS_NOMINA CN WHERE ((CE.terc_nit = :nite) AND (CE.CONC_COD = CN.CONC_COD) AND (CN.conc_fecini <= :fec AND CN.conc_fecfin >= :FEC) ) or ((CE.terc_nit = :nite)
    AND (CE.CONC_COD = CN.CONC_COD) AND (cn.conc_todosper = 'N') AND (CE.emco_ppago = :periodo)) or  ((CE.terc_nit = :nite) AND (CE.CONC_COD = CN.CONC_COD) AND cn.conc_todosper = 'S')  ORDER BY (TERC_NIT)
    INTO :nit_tercero, :concept,  :montos, :porcen, :entidad, :numeroprom ,:CONC_COD, :CONC_DEDUC, :CONC_PORC,
    :CONC_ENTIDAD, :CONC_MONTO, :CONC_DIAS, :CONC_MODIFI,:CONC_PROMEDIO, :salario,:EMCO_PERPROM, :conc_prov, :conc_aporte , :CONC_APLICAPROM, :conc_otroconc, :conc_codotroconc
    DO
    BEGIN
    if (conc_dias = 'S') then
    execute procedure DIAS_LABORADOS (:nite, :periodo) returning_values (:diaslab);
    else
    BEGIN
    if (liquidaper = 0) then
    diaslab = 30;
    else
    if (liquidaper = 1) then
    diaslab = 60;
    else
    if (liquidaper = 2) then
    diaslab = 120;
    END
    if ( :montos = 0 ) then
      BEGIN
      if ( CONC_PORC = 0 AND :porcen = 0) then
        BEGIN
        VALOR = :CONC_MONTO/30 * :diaslab;
        EXECUTE PROCEDURE REDONDEE(:valor, 0) returning_values (VALOR);
        END
       ELSE
       BEGIN
        if (:porcen <> 0) then
          BEGIN
          VALOR = ((:CONC_MONTO/30 * :diaslab ) * :PORCEN) /100;
          EXECUTE PROCEDURE REDONDEE(:valor, 0)returning_values (VALOR);
          END
          ELSE
          BEGIN
          VALOR = ((:CONC_MONTO/30 * :diaslab ) * :conc_porc) /100;
          EXECUTE PROCEDURE REDONDEE(:valor, 0)returning_values (VALOR);
          END
       END
      END
    ELSE
    BEGIN
      if (CONC_PORC = 0 AND :porcen = 0) then
      BEGIN
      VALOR = (:montos/30 * :diaslab );
      EXECUTE PROCEDURE REDONDEE(:valor, 0)returning_values (VALOR);
      END
      ELSE
      BEGIN
        if (:porcen <> 0) then
          BEGIN
          VALOR = ((:MONTOS/30 * :diaslab ) * :PORCEN) /100;
          EXECUTE PROCEDURE REDONDEE(:valor, 0)returning_values (VALOR);
          END
          ELSE
          BEGIN
          VALOR = ((:montos/30 * :diaslab ) * :CONC_PORC) /100;
          END
          EXECUTE PROCEDURE REDONDEE(:valor, 0)returning_values (VALOR);
       END
   END
    if (conc_promedio = 'S') then
    BEGIN
    perinicial = :periodo - (:numeroprom) + 1;
    anoprom = cast (ano as integer);
    if (perinicial <= 0) then
    BEGIN
    perinicial = 12 + :PERINICIAL;
    anoprom = CAST(ANO AS INTEGER) - 1;
    END
    SELECT sum (noco_valor) FROM nomina_conceptos n where n.noco_aplicaprom = 'S' AND N.noco_periodo >= :perinicial - 1 AND N.noco_periodo < :periodo AND N.noco_ano >= :anoprom AND N.noco_ano <= :ano and terc_nit = :nite INTO :valor;
    valor = valor / numeroprom;
    END
    if (conc_otroconc = 'S') then
    BEGIN
    anosum = cast(ano as integer);
    anosum = anosum - 1;
    select sum (noco_valor) from nomina_conceptos n where n.noco_ano = cast(:anosum as varchar(4)) and n.conc_cod = :conc_codotroconc into :valor;
    END
    if (liquidaper = 0) then
        insert into nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO)
        values (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario);
    else
    if (liquidaper = 1) then
    begin
    rmod = mod(:periodo, 2);
    if (rmod = 0) then
        insert into nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO)
        values (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario);
    end
    else
    if (liquidaper = 2) then
    begin
    rmod = mod(:periodo, 4);
    if (rmod = 0) then
        insert into nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO)
        values (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario);
    end
item = :item + 1;
END
end
END
ELSE
/*SI ES SEMANAL*/
if (periodicidad = 3) then
BEGIN
execute procedure cambie_id_nomina returning_values(:idnomina);
insert into nomina (nomi_id, NOMI_FECCAUSA, NOMI_PAGOGLOBAL, NOMI_PERIODOCIDAD, NOMI_PERIODO, NOMI_ANO, NOMI_LIQOK)
values (:IDNOMINA, :fec,:pagoglobal, :periodicidad, :periodo, :ano, 'N');
    BEGIN
    item = 1;
    FOR SELECT E.TERC_NIT
    FROM EMPLEADOS E
    where E.empl_ppago = 3
    INTO :nite
    do
    BEGIN
    FOR SELECT CE.TERC_NIT, CE.CONC_COD, CE.EMCO_MONTO, CE.EMCO_PORC, ce.empl_entidad, CE.emco_perprom,
    CN.CONC_COD, CN.CONC_DEDUC,CN.CONC_PORC, CN.CONC_ENTIDAD, CN.CONC_MONTO,  CN.CONC_DIAS, CN.CONC_MODIFI,
    CN.CONC_PROMEDIO, CN.conc_salario, CE.emco_perprom, CN.conc_prov, CN.conc_aporte, CN.conc_aplicaprom, cn.conc_otroconc, cn.conc_codotroconc
    FROM empleado_conceptos CE, CONCEPTOS_NOMINA CN WHERE ((CE.terc_nit = :nite) AND (CE.CONC_COD = CN.CONC_COD) AND (CN.conc_fecini <= :fec AND CN.conc_fecfin >= :FEC) ) or ((CE.terc_nit = :nite)
    AND (CE.CONC_COD = CN.CONC_COD) AND (cn.conc_todosper = 'N') AND (CE.emco_ppago = :periodo)) or  ((CE.terc_nit = :nite) AND (CE.CONC_COD = CN.CONC_COD) AND cn.conc_todosper = 'S')  ORDER BY (TERC_NIT)
    INTO :nit_tercero, :concept,  :montos, :porcen, :entidad, :numeroprom ,:CONC_COD, :CONC_DEDUC, :CONC_PORC,
    :CONC_ENTIDAD, :CONC_MONTO, :CONC_DIAS, :CONC_MODIFI,:CONC_PROMEDIO, :salario,:EMCO_PERPROM, :conc_prov, :conc_aporte , :CONC_APLICAPROM, :conc_otroconc, :conc_codotroconc
    DO
    BEGIN
    if (conc_dias = 'S') then
    execute procedure DIAS_LABORADOS (:nite, :periodo) returning_values (:diaslab);
    else
    BEGIN
    if (liquidaper = 0) then
    diaslab = 7;
    else
    if (liquidaper = 1) then
    diaslab = 15;
    else
    if (liquidaper = 2) then
    diaslab = 30;
    END
    if ( :montos = 0 ) then
      BEGIN
      if ( CONC_PORC = 0 AND :porcen = 0) then
        BEGIN
        VALOR = :CONC_MONTO/30 * :diaslab;
        EXECUTE PROCEDURE REDONDEE(:valor, 0) returning_values (VALOR);
        END
       ELSE
       BEGIN
        if (:porcen <> 0) then
          BEGIN
          VALOR = ((:CONC_MONTO/30 * :diaslab ) * :PORCEN) /100;
          EXECUTE PROCEDURE REDONDEE(:valor, 0)returning_values (VALOR);
          END
          ELSE
          BEGIN
          VALOR = ((:CONC_MONTO/30 * :diaslab ) * :conc_porc) /100;
          EXECUTE PROCEDURE REDONDEE(:valor, 0)returning_values (VALOR);
          END
       END
      END
    ELSE
    BEGIN
      if (CONC_PORC = 0 AND :porcen = 0) then
      BEGIN
      VALOR = (:montos/30 * :diaslab );
      EXECUTE PROCEDURE REDONDEE(:valor, 0)returning_values (VALOR);
      END
      ELSE
      BEGIN
        if (:porcen <> 0) then
          BEGIN
          VALOR = ((:MONTOS/30 * :diaslab ) * :PORCEN) /100;
          EXECUTE PROCEDURE REDONDEE(:valor, 0)returning_values (VALOR);
          END
          ELSE
          BEGIN
          VALOR = ((:montos/30 * :diaslab ) * :CONC_PORC) /100;
          END
          EXECUTE PROCEDURE REDONDEE(:valor, 0)returning_values (VALOR);
       END
   END
    if (conc_promedio = 'S') then
    BEGIN
    perinicial = :periodo - (:numeroprom) + 1;
    anoprom = cast (ano as integer);
    if (perinicial <= 0) then
    BEGIN
    perinicial = 54 + :PERINICIAL;
    anoprom = CAST(ANO AS INTEGER) - 1;
    END
    SELECT sum (noco_valor) FROM nomina_conceptos n where n.noco_aplicaprom = 'S' AND N.noco_periodo >= :perinicial - 1 AND N.noco_periodo < :periodo AND N.noco_ano >= :anoprom AND N.noco_ano <= :ano and terc_nit = :nite INTO :valor;
    valor = valor / numeroprom;
    END
    if (conc_otroconc = 'S') then
    BEGIN
    anosum = cast(ano as integer);
    anosum = anosum - 1;
    select sum (noco_valor) from nomina_conceptos n where n.noco_ano = :anosum and n.conc_cod = :conc_codotroconc into :valor;
    END
    if (liquidaper = 0) then
        insert into nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO)
        values (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario);
    else
    if (liquidaper = 1) then
    begin
    rmod = mod(:periodo, 2);
    if (rmod = 0) then
        insert into nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO)
        values (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario);
    end
    else
    if (liquidaper = 2) then
    begin
    rmod = mod(:periodo, 4);
    if (rmod = 0) then
        insert into nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO)
        values (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario);
    end
item = :item + 1;
END
END
END
END
suspend;
end
^

ALTER PROCEDURE CONSOLIDA_CONC_NOMINA (
    ID_NOMINA INTEGER,
    TIPPAGO INTEGER)
AS
declare variable id integer;
/*declare variable conc_cod varchar(5);*/
declare variable noco_item integer;
/*declare variable nit varchar(20) character set none;*/
/*declare variable valor numeric(18,2);*/
declare variable entidad varchar(20) character set none;
declare variable periodo integer;
declare variable ano char(4) character set none;
declare variable periodi integer;
/*declare variable deduc char(1) character set none;*/
declare variable prov char(1) character set none;
declare variable aporte char(1) character set none;
declare variable idexiste INTEGER;
declare variable item INTEGER;
declare variable idanterior INTEGER;
declare VARIABLE itemanterior integer;
declare variable SUMA numeric(18,2);
begin
if (tippago = 4) then
 begin
 insert into consolidado_nomina (cono_id, cono_item ,cono_tipodes, cono_tipoori,  cono_idori, cono_periodo, cono_ano,  cono_valor, cono_abono, conc_cod, terc_nit, cono_pagook, CONO_PERIODICIDAD, CONO_DEDUC, CONO_PROV, CONO_APORTE)
                  select COPO_id, COPO_item ,COPO_tipodes, COPO_tipoori,  COPO_idori, COPO_periodo, COPO_ano,  COPO_valor, copo_abono , conc_cod, terc_nit, COPO_pagook, COPO_PERIODICIDAD, COPO_DEDUC, COPO_PROV, COPO_APORTE
                  from consolidado_nomina_prov c
                  where c.copo_idori = :id_nomina and c.copo_tipoori = 92 and c.copo_pagook = 'N';
 UPDATE consolidado_nomina_prov c SET C.copo_pagook = 'S' where c.copo_idori = :id_nomina and c.copo_tipoori = 92 and c.copo_pagook = 'N';
 select sum(copo_valor - copo_abono) from consolidado_nomina_prov WHERE copo_idori = :id_nomina and copo_tipoori = 92 and copo_pagook = 'N' into :suma;
 if (suma = 0) then
 update nomina n set n.nomi_pagook = 'S' WHERE N.nomi_id = :id_nomina;
 END
END
^

ALTER PROCEDURE CONSOLIDA_CONC_NOMINA_PROV (
    ID_NOMINA INTEGER,
    TIPPAGO INTEGER)
AS
declare variable id integer;
declare variable noco_item integer;
declare variable nit varchar(20) character set none;
declare variable valor numeric(18,2);
declare variable entidad varchar(20) character set none;
declare variable periodo integer;
declare variable ano char(4) character set none;
declare variable periodi integer;
declare variable deduc char(1) character set none;
declare variable prov char(1) character set none;
declare variable aporte char(1) character set none;
declare variable idexiste INTEGER;
declare variable item INTEGER;
declare variable idanterior INTEGER;
declare VARIABLE itemanterior integer;
declare variable conc_cod VARCHAR(5);
begin
if (tippago = 4) then
 begin
    select MAX(c.COPO_id) from consolidado_nomina_prov c where c.COPO_tipoori = 92 AND C.COPO_idori = :id_nomina into :idexiste;
    if (idexiste IS NULL) then
    BEGIN
    id = GEN_ID(id_consnoprov, 1);
        select nomi_periodocidad FROM NOMINA WHERE NOMI_ID = :ID_NOMINA INTO :periodi;
        FOR SELECT NOCO_ITEM, CONC_COD, TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_PERIODO, NOCO_ANO, noco_deduc, noco_prov, noco_aporte  FROM NOMINA_CONCEPTOS where NOMI_ID = :id_nomina and NOCO_APORTE = 'N' AND NOCO_PROV = 'N'
        into :noco_item, :conc_cod, :nit, :valor, :entidad, :periodo, :ano, :deduc, :prov, :aporte
        DO
        BEGIN
        if (valor <> 0) then
            insert into consolidado_nomina_prov (COPO_id, COPO_item ,COPO_tipodes, COPO_tipoori,  COPO_idori, COPO_periodo, COPO_ano,  COPO_valor, conc_cod, terc_nit, COPO_pagook, COPO_PERIODICIDAD, COPO_DEDUC, COPO_PROV, COPO_APORTE)
                                    values (:id, :noco_item, 91, 92, :id_nomina, :periodo, :ano, :valor, :conc_cod, :nit, 'N', :periodi, :deduc, :prov, :aporte);
        END
    end
   ELSE
   BEGIN
   id = GEN_ID(id_consnoprov, 1);
       ITEM = 1;
       for select COPO_id, COPO_item , COPO_idori, COPO_periodo, COPO_ano, (COPO_valor - COPO_ABONO), conc_cod, terc_nit, COPO_PERIODICIDAD, COPO_DEDUC, COPO_PROV, COPO_APORTE
       from consolidado_nomina_prov c where c.COPO_id = :idexiste /*and c.COPO_pagook = 'N'*/
       INTO :idanterior, :itemanterior,:id_nomina, :periodo, :ano, :valor, :conc_cod, :nit, :periodi, :deduc, :prov, :aporte
       DO
       BEGIN
       if (valor <> 0) then
            insert into consolidado_nomina_prov (COPO_id, COPO_item ,COPO_tipodes, COPO_tipoori,  COPO_idori, COPO_periodo, COPO_ano,  COPO_valor, conc_cod, terc_nit, COPO_pagook, COPO_PERIODICIDAD, COPO_DEDUC, COPO_PROV, COPO_APORTE)
                                    values (:id, :item, 91, 92, :id_nomina, :periodo, :ano, :valor, :conc_cod, :nit, 'N', :periodi, :deduc, :prov, :aporte);
       item = :item + 1;
       UPDATE consolidado_nomina_prov C SET C.COPO_pagook = 'S' WHERE C.COPO_id = :idanterior and c.COPO_item = :itemanterior;
       END
   END
 END
END
^

ALTER PROCEDURE CONTABIL_NOMINA (
    IDDOC INTEGER)
RETURNS (
    ERROR INTEGER,
    IDC INTEGER)
AS
declare variable itemdet integer;
declare variable idcontabil integer;
declare variable aporte char(1);
declare variable entidad varchar(20);
declare variable valor numeric(18,2);
declare variable ctagast varchar(20);
declare variable ctaxp varchar(20);
declare variable tercnit varchar(20);
declare variable fecaux date;
declare variable fecha char(8);
declare variable ano char(4);
declare variable periodicidad integer;
declare variable periodo integer;
declare variable numero varchar(6);
declare variable tipocom char(3);
declare variable prefcom varchar(4);
declare variable concepto varchar(60);
declare variable numerocom varchar(6);
declare variable proyecto varchar(4) character set none;
declare variable centro varchar(4) character set none;
begin
SELECT N.nomi_feccausa, N.nomi_ano, N.nomi_periodocidad, N.nomi_periodo FROM NOMINA N WHERE N.nomi_id = :iddoc INTO :fecaux, :ano, :periodicidad, :periodo;
NUMERO = :periodicidad || :periodo;
SELECT I.tico_cod, I.prco_pre FROM INTERFAZ_NOMINA I WHERE I.tido_cod = 92 INTO :tipocom, :prefcom;
concepto = 'CAUSACION NOMINA AÑO ' || :ano || ' PERIODO ' || :periodo || ' PERIODICIDAD ' ||:periodicidad;
execute procedure completa_ceros(:numero)returning_values :numero;
SELECT P.pref_numero FROM PREFIJOS_CONTA P WHERE P.tico_cod = :tipocom AND P.prco_pref = :prefcom INTO :numerocom;
idcontabil = GEN_ID(ID_CONTABILIZA,1);
EXECUTE PROCEDURE FECHA_A_CONTA(:FECAUX) returning_values (:FECHA);
INSERT INTO CONTABILIZACION (CNTB_ID, CNTB_TIPOREF, CNTB_IDREF, CNTB_PREFREF, CNTB_NUMREF, CNTB_FECHA, CNTB_TIPOCOMP, CNTB_PREFCNT, CNTB_CONCEPTO, CNTB_NUMERO, CNTB_PROCESADO)
                     VALUES (:idcontabil, 92,:iddoc, :ano, :numero, :fecha, :tipocom, :prefcom, :concepto, :numerocom, 'N');
idc = :idcontabil;
itemdet = 0;
FOR SELECT NC.NOCO_VALOR, CN.conc_ctagast, CN.conc_ctacxp, NC.terc_nit, NC.noco_aporte, NC.noco_entidad
FROM NOMINA_CONCEPTOS NC, CONCEPTOS_NOMINA CN WHERE NC.conc_cod = CN.conc_cod AND NC.nomi_id = :iddoc
INTO :valor, :ctagast, :ctaxp, :tercnit, :aporte, :entidad
DO
BEGIN
if (ctagast IS NULL) then
 begin
 EXECUTE PROCEDURE ERROR (14, :IDDOC, :ctagast, 2);
 ERROR = ERROR + 1;
 end
if (ctaxp IS NULL) then
 begin
 EXECUTE PROCEDURE ERROR (14, :IDDOC, :ctaxp, 2);
 ERROR = ERROR + 1;
 end
if (VALOR IS NULL) then
VALOR = 0;
if (VALOR <> 0) then
BEGIN
if (valor < 0) then
valor = :valor * (-1);
if (aporte = 'N') then
BEGIN
SELECT D.dpto_proy, D.dpto_centro FROM EMPLEADOS E, departamento D WHERE E.terc_nit = :tercnit AND E.empl_dpto = D.dpto_cod INTO :proyecto, :centro;
INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_TERC, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_CONC, CNDE_PROY, cnde_centro)
                         VALUES (:idcontabil, :itemdet, :ctagast, :tercnit, :valor, 0, :concepto, :proyecto, :centro);
itemdet = itemdet + 1;
SELECT D.dpto_proy, D.dpto_centro FROM EMPLEADOS E, departamento D WHERE E.terc_nit = :tercnit AND E.empl_dpto = D.dpto_cod INTO :proyecto, :centro;
INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_TERC, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_CONC, CNDE_PROY, cnde_centro)
                         VALUES (:idcontabil, :itemdet, :ctaxp, :tercnit, 0,:valor, :concepto, :proyecto, :centro);
itemdet = itemdet + 1;
END
ELSE
if (aporte = 'S') then
BEGIN
SELECT D.dpto_proy, D.dpto_centro FROM EMPLEADOS E, departamento D WHERE E.terc_nit = :tercnit AND E.empl_dpto = D.dpto_cod INTO :proyecto, :centro;
INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_TERC, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_CONC, CNDE_PROY, cnde_centro)
                         VALUES (:idcontabil, :itemdet, :ctagast, :tercnit, :valor, 0, :concepto, :proyecto, :centro);
itemdet = itemdet + 1;
SELECT D.dpto_proy, D.dpto_centro FROM EMPLEADOS E, departamento D WHERE E.terc_nit = :tercnit AND E.empl_dpto = D.dpto_cod INTO :proyecto, :centro;
INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_TERC, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_CONC, CNDE_PROY, cnde_centro)
                         VALUES (:idcontabil, :itemdet, :ctaxp, :entidad, 0,:valor, :concepto, :proyecto, :centro);
itemdet = itemdet + 1;
END
END
END
SUSPEND;
end
^

ALTER PROCEDURE CONTABIL_PAGONOMI (
    IDDOC INTEGER)
AS
declare variable nitempl varchar(20) character set none;
declare variable tipopago char(1);
begin
for select nd.terc_nit from nomina_detalle nd where nd.nomi_id = :iddoc into :nitempl
do
begin
SELECT E.empl_formpago FROM EMPLEADOS E WHERE E.terc_nit = :nitempl INTO :tipopago;

end
end
^

ALTER PROCEDURE DIAS_LABORADOS (
    NITEMPL VARCHAR(20) CHARACTER SET NONE,
    PERIODO INTEGER)
RETURNS (
    TOTALDIASLAB INTEGER)
AS
declare variable diasnolab integer;
declare variable diaslabxper integer;
declare variable perpago integer;
begin
SELECT E.empl_ppago
FROM EMPLEADOS E WHERE TERC_NIT = :nitempl
INTO :perpago;
if (perpago = 1) then
diaslabxper = 30;
ELSE
if (perpago = 2) then
diaslabxper = 15;
else
if (perpago = 3) then
diaslabxper = 7;
SELECT SUM (NONO_DURA)
FROM nomina_novedades WHERE TERC_NIT = :nitempl AND TNOV_COD = 9 AND NONO_PERIODO = :periodo
INTO :diasnolab;
totaldiaslab =  :diaslabxper - :diasnolab;
SELECT SUM (NONO_DURA)
FROM nomina_novedades WHERE TERC_NIT = :nitempl AND TNOV_COD = 6 AND NONO_PERIODO = :periodo
INTO :diasnolab;
totaldiaslab =  :diaslabxper - :diasnolab;
IF (totaldiaslab IS null) THEN
totaldiaslab =  :diaslabxper;
suspend;
end
^

ALTER PROCEDURE EGRESO_NOMINA (
    IDNOMINA INTEGER,
    PGLOBAL CHAR(1) CHARACTER SET NONE,
    NITBENE VARCHAR(20) CHARACTER SET NONE,
    FECHAEGR DATE,
    PREF VARCHAR(4) CHARACTER SET NONE,
    NUMEROEGR VARCHAR(6) CHARACTER SET NONE,
    CONCEPTO VARCHAR(60) CHARACTER SET NONE,
    OBSERVACIONES BLOB SUB_TYPE 0 SEGMENT SIZE 80,
    NOMBREBENE VARCHAR(60) CHARACTER SET NONE,
    CAJA INTEGER,
    USUARIOEGR VARCHAR(10) CHARACTER SET NONE,
    PAGO CHAR(1) CHARACTER SET NONE,
    CUENTAID INTEGER,
    FECHAEGRBNCO DATE,
    PREFEGREBNCO VARCHAR(4) CHARACTER SET NONE,
    NUMEROEGREBNCO VARCHAR(6) CHARACTER SET NONE,
    BENEBNCO VARCHAR(60) CHARACTER SET NONE,
    CONCEPTOBNCO VARCHAR(60) CHARACTER SET NONE,
    GMF CHAR(1) CHARACTER SET NONE,
    FORMAPAGOID INTEGER,
    CAJABNCO VARCHAR(2) CHARACTER SET NONE,
    CAJABNCOCUENTA VARCHAR(20) CHARACTER SET NONE,
    CAJABNCONUMEROEGR VARCHAR(20) CHARACTER SET NONE,
    FORMULARIO VARCHAR(10) CHARACTER SET NONE)
AS
declare variable porcreten numeric(9,4);
declare variable nitempl varchar(60);
declare variable idpago integer;
declare variable totdevenempl numeric(18,2);
declare variable retencionempl numeric(18,2);
declare variable periodicidad integer;
declare variable idegreso integer;
declare variable nitemplnglo varchar(20) character set none;
declare variable numegresointeger integer;
declare variable ok char(1) character set none;
declare variable itempago integer;
declare variable he numeric(18,2);
declare variable hed numeric(18,2);
declare variable hen numeric(18,2);
declare variable hefd numeric(18,2);
declare variable hefn numeric(18,2);
declare variable otrosdev numeric(18,2);
declare variable otrosded integer;
declare variable pagoempl char(1);
declare variable periodo integer;
declare variable nomiano char(4);
declare variable emplnom varchar(60);
declare variable devengos numeric(18,2);
declare variable deducibles numeric(18,2);
declare variable total numeric(18,2);
declare variable reten numeric(18,2);
begin
select nomi_pagook, nomi_periodo, nomi_ano from nomina where nomi_id = :idnomina into :ok, :periodo, :nomiano;
if (ok = 'N') then
BEGIN
if (pglobal = 'S') then
BEGIN
/*    for select terc_nit from nomina_detalle WHERE NOMI_ID = :idnomina INTO :nitemplnglo
    do
    begin */
    SELECT SUM (NC.CONO_ABONO) FROM CONSOLIDADO_NOMINA NC WHERE NC.CONO_IDORI = :IDNOMINA AND CONO_TIPOORI = 92 and cono_pagook = 'N'
    AND CONO_prov = 'N' AND CONO_APORTE = 'N'
        INTO :total;
    if((:TOTAL IS NOT NULL) and (:total <> 0)) then
    BEGIN
    EXECUTE PROCEDURE cambie_id_egreso returning_values (:idegreso);
    INSERT INTO egresos (EGRE_ID, TIDO_COD, PREF_PRE, EGRE_numero, EGRE_fecha, EGRE_CONC, EGRE_MONTO, EGRE_RTFTEMONTO, EGRE_OBS, EGRE_NOMTERC, EGRE_ANULADO, EGRE_TRANSMIT, TERC_NIT, EGRE_TIPO, CAJA_ID, EGRE_usuario, NUMOK, CLEG_ID)
                 VALUES (:idegreso,62, :pref, :numeroegr, :fechaegr, :concepto, :total, 0, :observaciones, :nombrebene, 'N', 'N', :nitbene, '3', :caja, :usuarioegr, 'S', 0);
    if (pago = 'B') then
    INSERT INTO egresos_banco (EGRE_ID, EGBC_TIPOBCO, CUBA_COD, EGBC_numero, EGBC_fecha, PRBA_PREF, EGBC_BENEF, EGBC_MONTO, EGBC_CONCEPTO, EGBC_GMF, EGBC_ANULADO, EGBC_TRANSMIT) VALUES (:idegreso, 72, :cuentaid, :numeroegrebnco, :fechaegrbnco, :prefegrebnco, :benebnco, :total, :conceptobnco, :gmf, 'N', 'N');
    ELSE
    if (pago = 'C') then
    INSERT INTO egresos_caja (EGRE_ID, EGCA_ITEM, CAJA_ID, FOPA_ID, EGCA_BANCO, EGCA_CUENTA, EGCA_numero, EGCA_fecha, EGCA_MONTO, EGCA_ANULADO, EGCA_TRANSMIT) VALUES (:idegreso, 1, :caja, :formapagoid, :cajabnco, :cajabncocuenta, :cajabnconumeroegr, :fechaegr, :total, 'N', 'N');
    /*REGISTRE EL PAGO*/
    idpago = GEN_ID(id_pagonomi, 1);
    insert INTO pago_nomina (pgno_id, pgno_fecha, pgno_tipopago, pgno_egreid, pgno_egrepre, pgno_egrenum, pgno_monto, pgno_nomina, pgno_nit, pgno_formulario, PGNO_ANT)
                 VALUES (:idpago, :fechaegr, :pago , :idegreso, :pref, :numeroegr, :total, :idnomina, :nitbene, :formulario, 'N');
    update NOMINA SET NOMI_pagook = 'N' WHERE NOMI_ID = :IDNOMINA;
    END
    FOR SELECT TERC_NIT FROM nomina_detalle WHERE NOMI_ID = :idnomina into :nitemplnglo
    DO
    BEGIN
    SELECT SUM (NC.CONO_ABONO) FROM CONSOLIDADO_NOMINA NC WHERE NC.CONO_IDORI = :IDNOMINA AND CONO_TIPOORI = 92 and cono_pagook = 'N'
    AND CONO_prov = 'N' AND CONO_APORTE = 'N'
        INTO :total;
    select max (pgno_item), max (pgno_id) from pago_nomina_det WHERE PGNO_ID = :idpago INTO :itempago, :idpago;
    if (:itempago IS NULL) then
    itempago = 0;
    itempago = :itempago + 1;
    insert INTO pago_nomina_det  (pgno_id, terc_nit, pgnd_monto, pgno_item)
                 VALUES (:idpago, :nitemplnglo, :total, :itempago);
    END
/*    end*/
END
ELSE
if (pglobal = 'N') then
BEGIN
    EXECUTE PROCEDURE cambie_id_egreso returning_values (:idegreso);
    FOR SELECT TERC_NIT FROM nomina_detalle WHERE NOMI_ID = :idnomina into :nitemplnglo
    DO
    BEGIN
    SELECT SUM (cono_abono) FROM CONSOLIDADO_NOMINA WHERE CONO_IDORI = :IDNOMINA AND CONO_TIPOORI = 92 and cono_pagook = 'N'
    AND CONO_deduc = 'N' AND cono_prov = 'N' and TERC_NIT = :nitemplnglo
    INTO :totdevenempl;
    SELECT NOMI_PERIODOCIDAD FROM nomina WHERE NOMI_ID = :idnomina INTO :periodicidad;
    SELECT SUM (NC.CONO_ABONO) FROM CONSOLIDADO_NOMINA NC WHERE NC.CONO_IDORI = :IDNOMINA AND CONO_TIPOORI = 92 and cono_pagook = 'N'
    AND CONO_prov = 'N' AND CONO_APORTE = 'N' AND TERC_NIT = :nitemplnglo
        INTO :total;
    SELECT TERC_NOM FROM TERCEROS WHERE TERC_NIT = :nitemplnglo INTO :emplnom;
    concepto = 'PAGO NOMINA ' || 'DEL PERIODO ' || CAST (periodo AS CHAR(2)) || ' DEL ' || nomiano;
    if((:TOTAL IS NOT NULL) or (:total <> 0)) then
    BEGIN
    INSERT INTO egresos (EGRE_ID, TIDO_COD, PREF_PRE, EGRE_numero, EGRE_fecha, EGRE_CONC, EGRE_MONTO, EGRE_RTFTEMONTO, EGRE_OBS, EGRE_NOMTERC, EGRE_ANULADO, EGRE_TRANSMIT, TERC_NIT, EGRE_TIPO, CAJA_ID, EGRE_usuario, NUMOK, CLEG_ID)
                 VALUES (:idegreso,62, :pref, :numeroegr, :fechaegr, :concepto, :total, :reten, :observaciones, :emplnom, 'N', 'N', :nitemplnglo, '3', :caja, :usuarioegr, 'S', 0);
    SELECT empl_formpago FROM EMPLEADOS WHERE TERC_NIT = :nitemplnglo INTO :pagoempl;
    if (pagoempl = 'B') then
    begin
    conceptobnco = :concepto;
    INSERT INTO egresos_banco (EGRE_ID, EGBC_TIPOBCO, CUBA_COD, EGBC_numero, EGBC_fecha, PRBA_PREF, EGBC_BENEF, EGBC_MONTO, EGBC_CONCEPTO, EGBC_GMF, EGBC_ANULADO, EGBC_TRANSMIT)
                       VALUES (:idegreso, 72, :cuentaid, :numeroegrebnco, :fechaegrbnco, :prefegrebnco, :nitemplnglo, :total, :conceptobnco, :gmf, 'N', 'N');
    end
    ELSE
    if (pagoempl = 'C') then
    INSERT INTO egresos_caja (EGRE_ID, EGCA_ITEM, CAJA_ID, FOPA_ID, EGCA_BANCO, EGCA_CUENTA, EGCA_numero, EGCA_fecha, EGCA_MONTO, EGCA_ANULADO, EGCA_TRANSMIT)
                 VALUES (:idegreso, 1, :caja, :formapagoid, :cajabnco, :cajabncocuenta, :cajabnconumeroegr, :fechaegr, :total, 'N', 'N');
        EXECUTE PROCEDURE cambie_id_egreso returning_values (:idegreso);

EXECUTE PROCEDURE cambie_id_pago_nomina returning_values (:idpago);
numegresointeger = cast (numeroegr as integer);
numegresointeger = numegresointeger + 1;
execute procedure completa_ceros(numegresointeger)returning_values :numeroegr;
    END
    EXECUTE PROCEDURE cambie_id_pago_nomina returning_values (:idpago);
    INSERT INTO pago_nomina (pgno_id, pgno_fecha, pgno_tipopago, pgno_egreid, pgno_egrepre, pgno_egrenum, pgno_monto, pgno_nomina, pgno_nit, pgno_formulario, PGNO_ANT)
                 VALUES (:idpago, :fechaegr, :pago , :idegreso, :pref, :numeroegr, 0, :idnomina, '', :formulario, 'N');
    SELECT SUM (cono_abono) FROM CONSOLIDADO_NOMINA WHERE CONO_IDORI = :IDNOMINA AND CONO_TIPOORI = 92 and cono_pagook = 'N'
    AND CONO_deduc = 'N' AND cono_prov = 'N' and TERC_NIT = :nitemplnglo
    INTO :totdevenempl;
    SELECT NOMI_PERIODOCIDAD FROM nomina WHERE NOMI_ID = :idnomina INTO :periodicidad;
    select max (pgno_item) from pago_nomina_det WHERE PGNO_ID = :idpago INTO :itempago;
    if (:itempago IS NULL) then
    itempago = 0;
    itempago = :itempago + 1;
    insert INTO pago_nomina_det  (pgno_id, terc_nit, pgnd_monto, pgno_item)
                 VALUES (:idpago, :nitemplnglo, :total, :itempago);
update CONSOLIDADO_NOMINA NC set nc.cono_pagook = 'S' WHERE NC.CONO_IDORI = :IDNOMINA AND CONO_TIPOORI = 92 and cono_pagook = 'N'
    AND CONO_prov = 'N' AND CONO_APORTE = 'N' AND TERC_NIT = :nitemplnglo;
END
END
END
ELSE
exception nomina_con_pago;
END
^

ALTER PROCEDURE IMPR_PLANILLA_NOMINA (
    ID INTEGER)
RETURNS (
    FECHA DATE,
    OBSERVACIONES BLOB SUB_TYPE 0 SEGMENT SIZE 80,
    PAGOGLOBAL CHAR(1) CHARACTER SET NONE,
    PERIODO INTEGER,
    ANO CHAR(4) CHARACTER SET NONE,
    PERIODICIDAD VARCHAR(60) CHARACTER SET NONE,
    NITEMPL VARCHAR(20) CHARACTER SET NONE,
    VALOR NUMERIC(18,2),
    DEDUC CHAR(1) CHARACTER SET NONE,
    NOMBREEMPL VARCHAR(60) CHARACTER SET NONE,
    NOMCORTCONC VARCHAR(60) CHARACTER SET NONE,
    NOMBRECONC VARCHAR(60) CHARACTER SET NONE,
    CODCONC INTEGER,
    PROV CHAR(1) CHARACTER SET NONE)
AS
begin
FOR select N.nomi_feccausa, N.nomi_obs, N.nomi_pagoglobal, N.nomi_periodo, N.nomi_ano, P.ppag_nombre FROM NOMINA N, periodo_pago P
 WHERE P.ppag_cod = N.nomi_periodocidad AND N.nomi_id = :ID
 INTO :fecha, :observaciones, :pagoglobal, :periodo, :ano, :periodicidad
 DO
 BEGIN
 FOR SELECT NC.terc_nit, NC.noco_valor, NC.noco_deduc, T.terc_nom, C.conc_nomcorto, C.conc_nombre, NC.conc_cod, NC.noco_prov FROM NOMINA_CONCEPTOS NC, TERCEROS T, EMPLEADOS E, CONCEPTOS_NOMINA C
        WHERE NC.nomi_id = :ID AND T.terc_nit = E.terc_nit AND C.conc_cod = NC.conc_cod and t.terc_nit = nc.terc_nit
      INTO :nitempl, :valor, :deduc, :nombreempl, :nomcortconc, :nombreconc, :codconc, :prov
 DO
 begin
 if (valor is null) then
 valor = 0;
  SUSPEND;
 end
 END
end
^

ALTER PROCEDURE LIQUIDA_HORAS_EXTRA (
    NIT VARCHAR(20) CHARACTER SET NONE,
    ID INTEGER,
    HD SMALLINT,
    HN SMALLINT,
    HFD SMALLINT,
    HFN SMALLINT,
    ANO CHAR(4) CHARACTER SET NONE)
AS
declare variable tot_he numeric(18,2);
declare variable tot_fesd numeric(18,2);
declare variable tot_fesn numeric(18,2);
declare variable tot_diur numeric(18,2);
declare variable tot_noct numeric(18,2);
declare variable tar_fesd numeric(9,4);
declare variable tar_fesn numeric(9,4);
declare variable tar_diur numeric(9,4);
declare variable tar_noct numeric(9,4);
declare variable monto integer;
begin
SELECT EMCO_MONTO FROM empleado_conceptos WHERE TERC_NIT = :NIT AND CONC_COD = 900 into :monto;
  monto = :monto / 240;
  EXECUTE PROCEDURE REDONDEE(:monto, 0)returning_values (:monto);
select PAAN_HORASDI, PAAN_HORASNO, PAAN_HORASFN, PAAN_HORASFD FROM PARAMETROS_ANO WHERE paan_ano = :ano
  into :tar_diur, :tar_noct, :tar_fesn, :tar_fesd;
  tot_diur = :monto * tar_diur;
  tot_noct = :monto * tar_noct;
  tot_fesn = :monto * tar_fesn;
  tot_fesd = :monto * tar_fesd;
  tot_diur = :tot_diur * :hd;
  tot_noct = :tot_noct * :hn;
  tot_fesn = :tot_fesn * :hfn;
  tot_fesd = :tot_fesd * :hfd;
  tot_he =  tot_diur + tot_noct + tot_fesd + tot_fesn;
update nomina_detalle set node_extras = :tot_he where nomi_id = :id and terc_nit = :nit;
update nomina_conceptos set noco_valor = :tot_he where nomi_id = :id and terc_nit = :nit and conc_cod = 900;
  suspend;
end
^

ALTER PROCEDURE LIQUIDACION_APORTES (
    ID_NOMINA_1 INTEGER,
    ID_NOMINA_2 INTEGER,
    ID_NOMINA_3 INTEGER,
    ID_NOMINA_4 INTEGER,
    ID_NOMINA_5 INTEGER,
    ID_NOMINA_6 INTEGER,
    ID_NOMINA_7 INTEGER,
    INTMORA NUMERIC(18,2),
    FECHA DATE,
    PAGO CHAR(1) CHARACTER SET NONE,
    NITBENE VARCHAR(20) CHARACTER SET NONE,
    FECHAEGR DATE,
    PREF VARCHAR(4) CHARACTER SET NONE,
    NUMEROEGR VARCHAR(6) CHARACTER SET NONE,
    CONCEPTO VARCHAR(60) CHARACTER SET NONE,
    OBSERVACIONES BLOB SUB_TYPE 0 SEGMENT SIZE 80,
    NOMBREBENE VARCHAR(60) CHARACTER SET NONE,
    CAJA INTEGER,
    USUARIOEGR VARCHAR(10) CHARACTER SET NONE,
    CUENTAID INTEGER,
    FECHAEGRBNCO DATE,
    PREFEGREBNCO VARCHAR(4) CHARACTER SET NONE,
    NUMEROEGREBNCO VARCHAR(6) CHARACTER SET NONE,
    BENEBNCO VARCHAR(60) CHARACTER SET NONE,
    CONCEPTOBNCO VARCHAR(60) CHARACTER SET NONE,
    GMF CHAR(1) CHARACTER SET NONE,
    FORMAPAGOID INTEGER,
    CAJABNCO VARCHAR(2) CHARACTER SET NONE,
    CAJABNCOCUENTA VARCHAR(20) CHARACTER SET NONE,
    CAJABNCONUMEROEGR VARCHAR(20) CHARACTER SET NONE,
    FORMULARIO VARCHAR(10) CHARACTER SET NONE)
AS
declare variable itemaportadmi integer;
declare variable itemdetaport integer;
declare variable idaporte integer;
declare variable idegreso integer;
declare variable numegresointeger integer;
declare variable NIT varchar(20);
declare variable EPS char(1);
declare variable AFP char(1);
declare variable CCF char(1);
declare variable AFC char(1);
declare variable ARP char(1);
declare variable NOMBREADMIN varchar(60);
declare variable TOTADMIN numeric(18,2);
declare variable TIPOAPORT char(1);
declare variable ANO char(4);
declare variable NITEMPL varchar(20);
declare variable TOTDETVALOR numeric(18,2);
declare variable TOTIBC integer;
begin
itemaportadmi = 1;
itemdetaport = 1;
numegresointeger = cast (numeroegr as integer);
numegresointeger = numegresointeger - 1;
execute procedure completa_ceros(numegresointeger)returning_values :numeroegr;
ANO = SUBSTR(fecha, 1, 4);
idaporte = gen_id(id_pgaport,1);
select PAAN_TIPOAPORT from parametros_ano where PAAN_ANO = :ANO into :tipoaport;
for select A.TERC_NIT, A.ADMI_EPS, A.ADMI_AFP, A.ADMI_CCF, A.ADMI_AFC, A.ADMI_ARP, T.TERC_NOM from ADMINISTRADORA A, TERCEROS t
  where T.TERC_NIT = A.TERC_NIT and t.terc_admini = 'S' into :nit, :eps, :afp, :CCF, :afc, :arp, :nombreadmin
  do
  begin
  select sum (noco_valor) from nomina_conceptos N
  where (N.noco_aporte = 'S' and N.noco_entidad = :nit and N.nomi_id = :id_nomina_1) or
        (N.noco_aporte = 'S' and N.noco_entidad = :nit and N.nomi_id = :id_nomina_2)or
        (N.noco_aporte = 'S' and N.noco_entidad = :nit and N.nomi_id = :id_nomina_3) or
        (N.noco_aporte = 'S' and N.noco_entidad = :nit and N.nomi_id = :id_nomina_4) or
        (N.noco_aporte = 'S' and N.noco_entidad = :nit and N.nomi_id = :id_nomina_5) or
        (N.noco_aporte = 'S' and N.noco_entidad = :nit and N.nomi_id = :id_nomina_6) or
        (N.noco_aporte = 'S' and N.noco_entidad = :nit and N.nomi_id = :id_nomina_7)
  into :totadmin;
  if ((:totadmin is not null) and (:totadmin <> 0)) then
  begin
  insert into pago_aportes (pgap_id, pgap_item, pgap_tipoap, pgap_conpago, pgap_admin, pgap_monto, pgap_intmora) values
                           (:idaporte, :itemaportadmi, :tipoaport, '', :nit, :totadmin, :intmora);
  idegreso = gen_id(id_egresos,1);
    numegresointeger = cast (numeroegr as integer);
    numegresointeger = numegresointeger + 1;
    execute procedure completa_ceros(numegresointeger)returning_values :numeroegr;
  insert into egresos (EGRE_ID, TIDO_COD, PREF_PRE, EGRE_numero, EGRE_fecha, EGRE_CONC, EGRE_MONTO, EGRE_RTFTEMONTO, EGRE_OBS, EGRE_NOMTERC, EGRE_ANULADO, EGRE_TRANSMIT, TERC_NIT, EGRE_TIPO, CAJA_ID, EGRE_usuario, NUMOK, CLEG_ID)
                 values (:idegreso, 62, :pref, :numeroegr, :fechaegr, :concepto, :totadmin, 0, :observaciones, :nombrebene, 'N', 'N', :nit, '3', :caja, :usuarioegr, 'S', 0);
  if (pago = 'B') then
  insert into egresos_banco (EGRE_ID, EGBC_TIPOBCO, CUBA_COD, EGBC_numero, EGBC_fecha, PRBA_PREF, EGBC_BENEF, EGBC_MONTO, EGBC_CONCEPTO, EGBC_GMF, EGBC_ANULADO, EGBC_TRANSMIT)
                       values (:idegreso, 62, :cuentaid, :numeroegrebnco, :fechaegrbnco, :prefegrebnco, :nit, :totadmin, :conceptobnco, :gmf, 'N', 'N');
  else
  if (pago = 'C') then
    insert into egresos_caja (EGRE_ID, EGCA_ITEM, CAJA_ID, FOPA_ID, EGCA_BANCO, EGCA_CUENTA, EGCA_numero, EGCA_fecha, EGCA_MONTO, EGCA_ANULADO, EGCA_TRANSMIT)
                 values (:idegreso, 1, :caja, :formapagoid, :cajabnco, :cajabncocuenta, :cajabnconumeroegr, :fechaegr, :totadmin, 'N', 'N');
  if (eps = 'S') then
  for select TERC_NIT from EMPLEADOS where EMPL_EPS = :NIT into :nitempl
  do
  begin
  select sum (NOCO_VALOR) from NOMINA_CONCEPTOS
  where (TERC_NIT = :nitempl and NOCO_SALARIO = 'S' and nomi_id = :id_nomina_1) or
        (TERC_NIT = :nitempl and NOCO_SALARIO = 'S' and nomi_id = :id_nomina_2) or
        (TERC_NIT = :nitempl and NOCO_SALARIO = 'S' and nomi_id = :id_nomina_3) or
        (TERC_NIT = :nitempl and NOCO_SALARIO = 'S' and nomi_id = :id_nomina_4) or
        (TERC_NIT = :nitempl and NOCO_SALARIO = 'S' and nomi_id = :id_nomina_5) or
        (TERC_NIT = :nitempl and NOCO_SALARIO = 'S' and nomi_id = :id_nomina_6) or
        (TERC_NIT = :nitempl and NOCO_SALARIO = 'S' and nomi_id = :id_nomina_7)
        into :totibc;
    select sum (NOCO_VALOR) from NOMINA_CONCEPTOS
  where (TERC_NIT = :nitempl and NOCO_ENTIDAD = :nit and NOCO_APORTE = 'S' and nomi_id = :id_nomina_1) or
        (TERC_NIT = :nitempl and NOCO_ENTIDAD = :nit and NOCO_APORTE = 'S' and nomi_id = :id_nomina_2) or
        (TERC_NIT = :nitempl and NOCO_ENTIDAD = :nit and NOCO_APORTE = 'S' and nomi_id = :id_nomina_3) or
        (TERC_NIT = :nitempl and NOCO_ENTIDAD = :nit and NOCO_APORTE = 'S' and nomi_id = :id_nomina_4) or
        (TERC_NIT = :nitempl and NOCO_ENTIDAD = :nit and NOCO_APORTE = 'S' and nomi_id = :id_nomina_5) or
        (TERC_NIT = :nitempl and NOCO_ENTIDAD = :nit and NOCO_APORTE = 'S' and nomi_id = :id_nomina_6) or
        (TERC_NIT = :nitempl and NOCO_ENTIDAD = :nit and NOCO_APORTE = 'S' and nomi_id = :id_nomina_7)
         into :totdetvalor;
  if ((:totdetvalor is not null) and (:totibc is not null)) then
  begin
  insert into PAGO_APORTES_DETALLE (pgap_id, pgap_item, pade_itemdet, terc_nit, pade_ibc, pade_cotobl)
                             values(:idaporte, :itemaportadmi, :itemdetaport, :nitempl, :totibc, :totdetvalor);
    itemdetaport = :itemdetaport + 1;
  end
  end
  else
 if (afp = 'S') then
  for select TERC_NIT from EMPLEADOS where EMPL_AFP = :NIT into :nitempl
  do
  begin
  select sum (NOCO_VALOR) from NOMINA_CONCEPTOS
  where (TERC_NIT = :nitempl and NOCO_SALARIO = 'S' and nomi_id = :id_nomina_1) or
        (TERC_NIT = :nitempl and NOCO_SALARIO = 'S' and nomi_id = :id_nomina_2) or
        (TERC_NIT = :nitempl and NOCO_SALARIO = 'S' and nomi_id = :id_nomina_3) or
        (TERC_NIT = :nitempl and NOCO_SALARIO = 'S' and nomi_id = :id_nomina_4) or
        (TERC_NIT = :nitempl and NOCO_SALARIO = 'S' and nomi_id = :id_nomina_5) or
        (TERC_NIT = :nitempl and NOCO_SALARIO = 'S' and nomi_id = :id_nomina_6) or
        (TERC_NIT = :nitempl and NOCO_SALARIO = 'S' and nomi_id = :id_nomina_7)
        into :totibc;
    select sum (NOCO_VALOR) from NOMINA_CONCEPTOS
  where (TERC_NIT = :nitempl and NOCO_ENTIDAD = :nit and NOCO_APORTE = 'S' and nomi_id = :id_nomina_1) or
        (TERC_NIT = :nitempl and NOCO_ENTIDAD = :nit and NOCO_APORTE = 'S' and nomi_id = :id_nomina_2) or
        (TERC_NIT = :nitempl and NOCO_ENTIDAD = :nit and NOCO_APORTE = 'S' and nomi_id = :id_nomina_3) or
        (TERC_NIT = :nitempl and NOCO_ENTIDAD = :nit and NOCO_APORTE = 'S' and nomi_id = :id_nomina_4) or
        (TERC_NIT = :nitempl and NOCO_ENTIDAD = :nit and NOCO_APORTE = 'S' and nomi_id = :id_nomina_5) or
        (TERC_NIT = :nitempl and NOCO_ENTIDAD = :nit and NOCO_APORTE = 'S' and nomi_id = :id_nomina_6) or
        (TERC_NIT = :nitempl and NOCO_ENTIDAD = :nit and NOCO_APORTE = 'S' and nomi_id = :id_nomina_7)
        into :totdetvalor;
  if ((:totdetvalor is not null) and (:totibc is not null)) then
  begin
  insert into PAGO_APORTES_DETALLE (pgap_id, pgap_item, pade_itemdet, terc_nit, pade_ibc, pade_cotobl)
                             values(:idaporte, :itemaportadmi, :itemdetaport, :nitempl, :totibc, :totdetvalor);
    itemdetaport = :itemdetaport + 1;
  end
  end
  else
  if (CCF = 'S') then
  for select TERC_NIT from EMPLEADOS where EMPL_CCF = :NIT into :nitempl
  do
  begin
  select sum (NOCO_VALOR) from NOMINA_CONCEPTOS
  where (TERC_NIT = :nitempl and NOCO_SALARIO = 'S' and nomi_id = :id_nomina_1) or
        (TERC_NIT = :nitempl and NOCO_SALARIO = 'S' and nomi_id = :id_nomina_2) or
        (TERC_NIT = :nitempl and NOCO_SALARIO = 'S' and nomi_id = :id_nomina_3) or
        (TERC_NIT = :nitempl and NOCO_SALARIO = 'S' and nomi_id = :id_nomina_4) or
        (TERC_NIT = :nitempl and NOCO_SALARIO = 'S' and nomi_id = :id_nomina_5) or
        (TERC_NIT = :nitempl and NOCO_SALARIO = 'S' and nomi_id = :id_nomina_6) or
        (TERC_NIT = :nitempl and NOCO_SALARIO = 'S' and nomi_id = :id_nomina_7)
        into :totibc;
    select sum (NOCO_VALOR) from NOMINA_CONCEPTOS
  where (TERC_NIT = :nitempl and NOCO_ENTIDAD = :nit and NOCO_APORTE = 'S' and nomi_id = :id_nomina_1) or
        (TERC_NIT = :nitempl and NOCO_ENTIDAD = :nit and NOCO_APORTE = 'S' and nomi_id = :id_nomina_2) or
        (TERC_NIT = :nitempl and NOCO_ENTIDAD = :nit and NOCO_APORTE = 'S' and nomi_id = :id_nomina_3) or
        (TERC_NIT = :nitempl and NOCO_ENTIDAD = :nit and NOCO_APORTE = 'S' and nomi_id = :id_nomina_4) or
        (TERC_NIT = :nitempl and NOCO_ENTIDAD = :nit and NOCO_APORTE = 'S' and nomi_id = :id_nomina_5) or
        (TERC_NIT = :nitempl and NOCO_ENTIDAD = :nit and NOCO_APORTE = 'S' and nomi_id = :id_nomina_6) or
        (TERC_NIT = :nitempl and NOCO_ENTIDAD = :nit and NOCO_APORTE = 'S' and nomi_id = :id_nomina_7)
        into :totdetvalor;
  if ((:totdetvalor is not null) and (:totibc is not null)) then
  begin
  insert into PAGO_APORTES_DETALLE (pgap_id, pgap_item, pade_itemdet, terc_nit, pade_ibc, pade_cotobl)
                             values(:idaporte, :itemaportadmi, :itemdetaport, :nitempl, :totibc, :totdetvalor);
    itemdetaport = :itemdetaport + 1;
  end
  end
  else
  if (AFC = 'S') then
  for select TERC_NIT from EMPLEADOS where EMPL_AFC = :NIT into :nitempl
  do
  begin
  select sum (NOCO_VALOR) from NOMINA_CONCEPTOS
  where (TERC_NIT = :nitempl and NOCO_SALARIO = 'S' and nomi_id = :id_nomina_1) or
        (TERC_NIT = :nitempl and NOCO_SALARIO = 'S' and nomi_id = :id_nomina_2) or
        (TERC_NIT = :nitempl and NOCO_SALARIO = 'S' and nomi_id = :id_nomina_3) or
        (TERC_NIT = :nitempl and NOCO_SALARIO = 'S' and nomi_id = :id_nomina_4) or
        (TERC_NIT = :nitempl and NOCO_SALARIO = 'S' and nomi_id = :id_nomina_5) or
        (TERC_NIT = :nitempl and NOCO_SALARIO = 'S' and nomi_id = :id_nomina_6) or
        (TERC_NIT = :nitempl and NOCO_SALARIO = 'S' and nomi_id = :id_nomina_7)
        into :totibc;
    select sum (NOCO_VALOR) from NOMINA_CONCEPTOS
  where (TERC_NIT = :nitempl and NOCO_ENTIDAD = :nit and NOCO_APORTE = 'S' and nomi_id = :id_nomina_1) or
        (TERC_NIT = :nitempl and NOCO_ENTIDAD = :nit and NOCO_APORTE = 'S' and nomi_id = :id_nomina_2) or
        (TERC_NIT = :nitempl and NOCO_ENTIDAD = :nit and NOCO_APORTE = 'S' and nomi_id = :id_nomina_3) or
        (TERC_NIT = :nitempl and NOCO_ENTIDAD = :nit and NOCO_APORTE = 'S' and nomi_id = :id_nomina_4) or
        (TERC_NIT = :nitempl and NOCO_ENTIDAD = :nit and NOCO_APORTE = 'S' and nomi_id = :id_nomina_5) or
        (TERC_NIT = :nitempl and NOCO_ENTIDAD = :nit and NOCO_APORTE = 'S' and nomi_id = :id_nomina_6) or
        (TERC_NIT = :nitempl and NOCO_ENTIDAD = :nit and NOCO_APORTE = 'S' and nomi_id = :id_nomina_7)
        into :totdetvalor;
  if ((:totdetvalor is not null) and (:totibc is not null)) then
  begin
  insert into PAGO_APORTES_DETALLE (pgap_id, pgap_item, pade_itemdet, terc_nit, pade_ibc, pade_cotobl)
                             values(:idaporte, :itemaportadmi, :itemdetaport, :nitempl, :totibc, :totdetvalor);
    itemdetaport = :itemdetaport + 1;
  end
  end
  else
  if (ARP = 'S') then
  for select TERC_NIT from EMPLEADOS where EMPL_ARP = :NIT into :nitempl
  do
  begin
  select sum (NOCO_VALOR) from NOMINA_CONCEPTOS
  where (TERC_NIT = :nitempl and NOCO_SALARIO = 'S' and nomi_id = :id_nomina_1) or
        (TERC_NIT = :nitempl and NOCO_SALARIO = 'S' and nomi_id = :id_nomina_2) or
        (TERC_NIT = :nitempl and NOCO_SALARIO = 'S' and nomi_id = :id_nomina_3) or
        (TERC_NIT = :nitempl and NOCO_SALARIO = 'S' and nomi_id = :id_nomina_4) or
        (TERC_NIT = :nitempl and NOCO_SALARIO = 'S' and nomi_id = :id_nomina_5) or
        (TERC_NIT = :nitempl and NOCO_SALARIO = 'S' and nomi_id = :id_nomina_6) or
        (TERC_NIT = :nitempl and NOCO_SALARIO = 'S' and nomi_id = :id_nomina_7)
        into :totibc;
    select sum (NOCO_VALOR) from NOMINA_CONCEPTOS
  where (TERC_NIT = :nitempl and NOCO_ENTIDAD = :nit and NOCO_APORTE = 'S' and nomi_id = :id_nomina_1) or
        (TERC_NIT = :nitempl and NOCO_ENTIDAD = :nit and NOCO_APORTE = 'S' and nomi_id = :id_nomina_2) or
        (TERC_NIT = :nitempl and NOCO_ENTIDAD = :nit and NOCO_APORTE = 'S' and nomi_id = :id_nomina_3) or
        (TERC_NIT = :nitempl and NOCO_ENTIDAD = :nit and NOCO_APORTE = 'S' and nomi_id = :id_nomina_4) or
        (TERC_NIT = :nitempl and NOCO_ENTIDAD = :nit and NOCO_APORTE = 'S' and nomi_id = :id_nomina_5) or
        (TERC_NIT = :nitempl and NOCO_ENTIDAD = :nit and NOCO_APORTE = 'S' and nomi_id = :id_nomina_6) or
        (TERC_NIT = :nitempl and NOCO_ENTIDAD = :nit and NOCO_APORTE = 'S' and nomi_id = :id_nomina_7)
        into :totdetvalor;
  if ((:totdetvalor is not null) and (:totibc is not null)) then
  begin
  insert into PAGO_APORTES_DETALLE (pgap_id, pgap_item, pade_itemdet, terc_nit, pade_ibc, pade_cotobl)
                             values(:idaporte, :itemaportadmi, :itemdetaport, :nitempl, :totibc, :totdetvalor);
    itemdetaport = :itemdetaport + 1;
  end
  end
  itemaportadmi = :itemaportadmi + 1;
  end
  end
  update nomina n set n.nomi_aporok = 'S' where N.NOMI_ID = :id_nomina_1 or (N.NOMI_ID = :id_nomina_2) or (N.NOMI_ID = :id_nomina_3) or (N.NOMI_ID = :id_nomina_4)
  or (N.NOMI_ID = :id_nomina_5) or (N.NOMI_ID = :id_nomina_6) or (N.NOMI_ID = :id_nomina_7);
end
^

ALTER PROCEDURE NOVEDADESXPERIODO (
    ANO CHAR(4) CHARACTER SET NONE,
    MES INTEGER,
    VERPERI CHAR(1) CHARACTER SET NONE)
RETURNS (
    IDNONO INTEGER,
    NIT VARCHAR(20) CHARACTER SET NONE,
    NOMBRE VARCHAR(60) CHARACTER SET NONE,
    TIPONOVE VARCHAR(60) CHARACTER SET NONE,
    NUMPER INTEGER,
    DIA INTEGER,
    DURACION INTEGER,
    FECHANO DATE)
AS
declare variable codnove char(3);
declare variable numperi integer;
declare variable numperif integer;
declare variable numperiaux1 integer;
declare variable numperiaux2 integer;
declare variable numperiaux3 integer;
declare variable numperiaux4 integer;
declare variable numperiaux5 integer;
declare variable numperiaux6 integer;
declare variable numperiaux7 integer;
declare variable numperiaux8 integer;
declare variable numperiaux9 integer;
declare variable numperiaux10 integer;
declare variable numperiaux11 integer;
declare variable numperiaux12 integer;
BEGIN
if (mes = 1) then
begin
    if (verperi = 'S') then
        EXECUTE PROCEDURE LEE_CONFIGURACION('NOMINA', 'PERIODICIDAD', 'NUMERO DE SEMANAS DEL MES DE ENERO') returning_values(:numperi);
    if (verperi = 'Q') then
        numperi = 2;
    if (verperi = 'M') then
        numperi = 1;
    for select NONO_ID, terc_nit, tnov_cod, nono_periodo, nono_diaini, nono_dura, nono_fecha
    from  nomina_novedades where
    nono_ppago = :verperi and nono_periodo <=:numperi and nono_ano =: ano
    INTO :idnono, :nit, :codnove, :numper, :dia, :duracion, :fechano
    do
    begin
    SELECT terc_nom FROM terceros WHERE terc_nit = :nit INTO nombre;
    SELECT tnov_nombre FROM tipos_novedad WHERE tnov_cod = :codnove INTO tiponove;
    suspend;
    end
END

if (mes = 2) then
begin
    if (verperi = 'S') then
    begin
        EXECUTE PROCEDURE LEE_CONFIGURACION('NOMINA', 'PERIODICIDAD', 'NUMERO DE SEMANAS DEL MES DE ENERO') returning_values(:numperiaux1);
        numperi = numperiaux1 + 1;
        EXECUTE PROCEDURE LEE_CONFIGURACION('NOMINA', 'PERIODICIDAD', 'NUMERO DE SEMANAS DEL MES DE FEBRERO') returning_values(:numperiaux2);
        numperif = numperiaux1 + numperiaux2;
    end
    if (verperi = 'Q') then
    begin
        numperi = 3;
        numperif = 4;
    end
    if (verperi = 'M') then
    begin
        numperi = 2;
        numperif = 2;
    end
END

if (mes = 3) then
begin
    if (verperi = 'S') then
    begin
        EXECUTE PROCEDURE LEE_CONFIGURACION('NOMINA', 'PERIODICIDAD', 'NUMERO DE SEMANAS DEL MES DE ENERO') returning_values(:numperiaux1);
        EXECUTE PROCEDURE LEE_CONFIGURACION('NOMINA', 'PERIODICIDAD', 'NUMERO DE SEMANAS DEL MES DE FEBRERO') returning_values(:numperiaux2);
        numperi = numperiaux1 + numperiaux2 + 1;
        EXECUTE PROCEDURE LEE_CONFIGURACION('NOMINA', 'PERIODICIDAD', 'NUMERO DE SEMANAS DEL MES DE MARZO') returning_values(:numperiaux3);
        numperif = numperiaux1 + numperiaux2 + numperiaux3;
    end
    if (verperi = 'Q') then
    begin
        numperi = 5;
        numperif = 6;
    end
    if (verperi = 'M') then
    begin
        numperi = 3;
        numperif = 3;
    end
END

if (mes = 4) then
begin
    if (verperi = 'S') then
    begin
        EXECUTE PROCEDURE LEE_CONFIGURACION('NOMINA', 'PERIODICIDAD', 'NUMERO DE SEMANAS DEL MES DE ENERO') returning_values(:numperiaux1);
        EXECUTE PROCEDURE LEE_CONFIGURACION('NOMINA', 'PERIODICIDAD', 'NUMERO DE SEMANAS DEL MES DE FEBRERO') returning_values(:numperiaux2);
        EXECUTE PROCEDURE LEE_CONFIGURACION('NOMINA', 'PERIODICIDAD', 'NUMERO DE SEMANAS DEL MES DE MARZO') returning_values(:numperiaux3);
        numperi = numperiaux1 + numperiaux2 + numperiaux3 + 1;
        EXECUTE PROCEDURE LEE_CONFIGURACION('NOMINA', 'PERIODICIDAD', 'NUMERO DE SEMANAS DEL MES DE ABRIL') returning_values(:numperiaux4);
        numperif = numperiaux1 + numperiaux2 + numperiaux3 + numperiaux4;
    end
    if (verperi = 'Q') then
    begin
        numperi = 7;
        numperif = 8;
    end
    if (verperi = 'M') then
    begin
        numperi = 4;
        numperif = 4;
    end
END

if (mes = 5) then
begin
    if (verperi = 'S') then
    begin
        EXECUTE PROCEDURE LEE_CONFIGURACION('NOMINA', 'PERIODICIDAD', 'NUMERO DE SEMANAS DEL MES DE ENERO') returning_values(:numperiaux1);
        EXECUTE PROCEDURE LEE_CONFIGURACION('NOMINA', 'PERIODICIDAD', 'NUMERO DE SEMANAS DEL MES DE FEBRERO') returning_values(:numperiaux2);
        EXECUTE PROCEDURE LEE_CONFIGURACION('NOMINA', 'PERIODICIDAD', 'NUMERO DE SEMANAS DEL MES DE MARZO') returning_values(:numperiaux3);
        EXECUTE PROCEDURE LEE_CONFIGURACION('NOMINA', 'PERIODICIDAD', 'NUMERO DE SEMANAS DEL MES DE ABRIL') returning_values(:numperiaux4);
        numperi = numperiaux1 + numperiaux2 + numperiaux3 + numperiaux4 + 1;
        EXECUTE PROCEDURE LEE_CONFIGURACION('NOMINA', 'PERIODICIDAD', 'NUMERO DE SEMANAS DEL MES DE MAYO') returning_values(:numperiaux5);
        numperif = numperiaux1 + numperiaux2 + numperiaux3 + numperiaux4 + numperiaux5;
    end
    if (verperi = 'Q') then
    begin
        numperi = 9;
        numperif = 10;
    end
    if (verperi = 'M') then
    begin
        numperi = 5;
        numperif = 5;
    end
END

if (mes = 6) then
begin
    if (verperi = 'S') then
    begin
        EXECUTE PROCEDURE LEE_CONFIGURACION('NOMINA', 'PERIODICIDAD', 'NUMERO DE SEMANAS DEL MES DE ENERO') returning_values(:numperiaux1);
        EXECUTE PROCEDURE LEE_CONFIGURACION('NOMINA', 'PERIODICIDAD', 'NUMERO DE SEMANAS DEL MES DE FEBRERO') returning_values(:numperiaux2);
        EXECUTE PROCEDURE LEE_CONFIGURACION('NOMINA', 'PERIODICIDAD', 'NUMERO DE SEMANAS DEL MES DE MARZO') returning_values(:numperiaux3);
        EXECUTE PROCEDURE LEE_CONFIGURACION('NOMINA', 'PERIODICIDAD', 'NUMERO DE SEMANAS DEL MES DE ABRIL') returning_values(:numperiaux4);
        EXECUTE PROCEDURE LEE_CONFIGURACION('NOMINA', 'PERIODICIDAD', 'NUMERO DE SEMANAS DEL MES DE MAYO') returning_values(:numperiaux5);
        numperi = numperiaux1 + numperiaux2 + numperiaux3 + numperiaux4 + numperiaux5 + 1;
        EXECUTE PROCEDURE LEE_CONFIGURACION('NOMINA', 'PERIODICIDAD', 'NUMERO DE SEMANAS DEL MES DE JUNIO') returning_values(:numperiaux6);
        numperif = numperiaux1 + numperiaux2 + numperiaux3 + numperiaux4 + numperiaux5 + numperiaux6;
    end
    if (verperi = 'Q') then
    begin
        numperi = 11;
        numperif = 12;
    end
    if (verperi = 'M') then
    begin
        numperi = 6;
        numperif = 6;
    end
END

if (mes = 7) then
begin
    if (verperi = 'S') then
    begin
        EXECUTE PROCEDURE LEE_CONFIGURACION('NOMINA', 'PERIODICIDAD', 'NUMERO DE SEMANAS DEL MES DE ENERO') returning_values(:numperiaux1);
        EXECUTE PROCEDURE LEE_CONFIGURACION('NOMINA', 'PERIODICIDAD', 'NUMERO DE SEMANAS DEL MES DE FEBRERO') returning_values(:numperiaux2);
        EXECUTE PROCEDURE LEE_CONFIGURACION('NOMINA', 'PERIODICIDAD', 'NUMERO DE SEMANAS DEL MES DE MARZO') returning_values(:numperiaux3);
        EXECUTE PROCEDURE LEE_CONFIGURACION('NOMINA', 'PERIODICIDAD', 'NUMERO DE SEMANAS DEL MES DE ABRIL') returning_values(:numperiaux4);
        EXECUTE PROCEDURE LEE_CONFIGURACION('NOMINA', 'PERIODICIDAD', 'NUMERO DE SEMANAS DEL MES DE MAYO') returning_values(:numperiaux5);
        EXECUTE PROCEDURE LEE_CONFIGURACION('NOMINA', 'PERIODICIDAD', 'NUMERO DE SEMANAS DEL MES DE JUNIO') returning_values(:numperiaux6);
        numperi = numperiaux1 + numperiaux2 + numperiaux3 + numperiaux4 + numperiaux5 + numperiaux6  + 1;
        EXECUTE PROCEDURE LEE_CONFIGURACION('NOMINA', 'PERIODICIDAD', 'NUMERO DE SEMANAS DEL MES DE JULIO') returning_values(:numperiaux7);
        numperif = numperiaux1 + numperiaux2 + numperiaux3 + numperiaux4 + numperiaux5 + numperiaux6 + numperiaux7;
    end
    if (verperi = 'Q') then
    begin
        numperi = 13;
        numperif = 14;
    end
    if (verperi = 'M') then
    begin
        numperi = 7;
        numperif = 7;
    end
END

if (mes = 8) then
begin
    if (verperi = 'S') then
    begin
        EXECUTE PROCEDURE LEE_CONFIGURACION('NOMINA', 'PERIODICIDAD', 'NUMERO DE SEMANAS DEL MES DE ENERO') returning_values(:numperiaux1);
        EXECUTE PROCEDURE LEE_CONFIGURACION('NOMINA', 'PERIODICIDAD', 'NUMERO DE SEMANAS DEL MES DE FEBRERO') returning_values(:numperiaux2);
        EXECUTE PROCEDURE LEE_CONFIGURACION('NOMINA', 'PERIODICIDAD', 'NUMERO DE SEMANAS DEL MES DE MARZO') returning_values(:numperiaux3);
        EXECUTE PROCEDURE LEE_CONFIGURACION('NOMINA', 'PERIODICIDAD', 'NUMERO DE SEMANAS DEL MES DE ABRIL') returning_values(:numperiaux4);
        EXECUTE PROCEDURE LEE_CONFIGURACION('NOMINA', 'PERIODICIDAD', 'NUMERO DE SEMANAS DEL MES DE MAYO') returning_values(:numperiaux5);
        EXECUTE PROCEDURE LEE_CONFIGURACION('NOMINA', 'PERIODICIDAD', 'NUMERO DE SEMANAS DEL MES DE JUNIO') returning_values(:numperiaux6);
        EXECUTE PROCEDURE LEE_CONFIGURACION('NOMINA', 'PERIODICIDAD', 'NUMERO DE SEMANAS DEL MES DE JULIO') returning_values(:numperiaux7);
        numperi = numperiaux1 + numperiaux2 + numperiaux3 + numperiaux4 + numperiaux5 + numperiaux6 + numperiaux7 + 1;
        EXECUTE PROCEDURE LEE_CONFIGURACION('NOMINA', 'PERIODICIDAD', 'NUMERO DE SEMANAS DEL MES DE AGOSTO') returning_values(:numperiaux8);
        numperif = numperiaux1 + numperiaux2 + numperiaux3 + numperiaux4 + numperiaux5 + numperiaux6 + numperiaux7 + numperiaux8;
    end
    if (verperi = 'Q') then
    begin
        numperi = 15;
        numperif = 16;
    end
    if (verperi = 'M') then
    begin
        numperi = 8;
        numperif = 8;
    end
END

if (mes = 9) then
begin
    if (verperi = 'S') then
    begin
        EXECUTE PROCEDURE LEE_CONFIGURACION('NOMINA', 'PERIODICIDAD', 'NUMERO DE SEMANAS DEL MES DE ENERO') returning_values(:numperiaux1);
        EXECUTE PROCEDURE LEE_CONFIGURACION('NOMINA', 'PERIODICIDAD', 'NUMERO DE SEMANAS DEL MES DE FEBRERO') returning_values(:numperiaux2);
        EXECUTE PROCEDURE LEE_CONFIGURACION('NOMINA', 'PERIODICIDAD', 'NUMERO DE SEMANAS DEL MES DE MARZO') returning_values(:numperiaux3);
        EXECUTE PROCEDURE LEE_CONFIGURACION('NOMINA', 'PERIODICIDAD', 'NUMERO DE SEMANAS DEL MES DE ABRIL') returning_values(:numperiaux4);
        EXECUTE PROCEDURE LEE_CONFIGURACION('NOMINA', 'PERIODICIDAD', 'NUMERO DE SEMANAS DEL MES DE MAYO') returning_values(:numperiaux5);
        EXECUTE PROCEDURE LEE_CONFIGURACION('NOMINA', 'PERIODICIDAD', 'NUMERO DE SEMANAS DEL MES DE JUNIO') returning_values(:numperiaux6);
        EXECUTE PROCEDURE LEE_CONFIGURACION('NOMINA', 'PERIODICIDAD', 'NUMERO DE SEMANAS DEL MES DE JULIO') returning_values(:numperiaux7);
        EXECUTE PROCEDURE LEE_CONFIGURACION('NOMINA', 'PERIODICIDAD', 'NUMERO DE SEMANAS DEL MES DE AGOSTO') returning_values(:numperiaux8);
        numperi = numperiaux1 + numperiaux2 + numperiaux3 + numperiaux4 + numperiaux5 + numperiaux6 + numperiaux7 + numperiaux8 + 1;
        EXECUTE PROCEDURE LEE_CONFIGURACION('NOMINA', 'PERIODICIDAD', 'NUMERO DE SEMANAS DEL MES DE SEPTIEMBRE') returning_values(:numperiaux9);
        numperif = numperiaux1 + numperiaux2 + numperiaux3 + numperiaux4 + numperiaux5 + numperiaux6 + numperiaux7 + numperiaux8 + numperiaux9;
    end
    if (verperi = 'Q') then
    begin
        numperi = 17;
        numperif = 18;
    end
    if (verperi = 'M') then
    begin
        numperi = 9;
        numperif = 9;
    end
END

if (mes = 10) then
begin
    if (verperi = 'S') then
    begin
        EXECUTE PROCEDURE LEE_CONFIGURACION('NOMINA', 'PERIODICIDAD', 'NUMERO DE SEMANAS DEL MES DE ENERO') returning_values(:numperiaux1);
        EXECUTE PROCEDURE LEE_CONFIGURACION('NOMINA', 'PERIODICIDAD', 'NUMERO DE SEMANAS DEL MES DE FEBRERO') returning_values(:numperiaux2);
        EXECUTE PROCEDURE LEE_CONFIGURACION('NOMINA', 'PERIODICIDAD', 'NUMERO DE SEMANAS DEL MES DE MARZO') returning_values(:numperiaux3);
        EXECUTE PROCEDURE LEE_CONFIGURACION('NOMINA', 'PERIODICIDAD', 'NUMERO DE SEMANAS DEL MES DE ABRIL') returning_values(:numperiaux4);
        EXECUTE PROCEDURE LEE_CONFIGURACION('NOMINA', 'PERIODICIDAD', 'NUMERO DE SEMANAS DEL MES DE MAYO') returning_values(:numperiaux5);
        EXECUTE PROCEDURE LEE_CONFIGURACION('NOMINA', 'PERIODICIDAD', 'NUMERO DE SEMANAS DEL MES DE JUNIO') returning_values(:numperiaux6);
        EXECUTE PROCEDURE LEE_CONFIGURACION('NOMINA', 'PERIODICIDAD', 'NUMERO DE SEMANAS DEL MES DE JULIO') returning_values(:numperiaux7);
        EXECUTE PROCEDURE LEE_CONFIGURACION('NOMINA', 'PERIODICIDAD', 'NUMERO DE SEMANAS DEL MES DE AGOSTO') returning_values(:numperiaux8);
        EXECUTE PROCEDURE LEE_CONFIGURACION('NOMINA', 'PERIODICIDAD', 'NUMERO DE SEMANAS DEL MES DE SEPTIEMBRE') returning_values(:numperiaux9);
        numperi = numperiaux1 + numperiaux2 + numperiaux3 + numperiaux4 + numperiaux5 + numperiaux6 + numperiaux7 + numperiaux8 + numperiaux9 + 1;
        EXECUTE PROCEDURE LEE_CONFIGURACION('NOMINA', 'PERIODICIDAD', 'NUMERO DE SEMANAS DEL MES DE OCTUBRE') returning_values(:numperiaux10);
        numperif = numperiaux1 + numperiaux2 + numperiaux3 + numperiaux4 + numperiaux5 + numperiaux6 + numperiaux7 + numperiaux8 + numperiaux9 + numperiaux10;
    end
    if (verperi = 'Q') then
    begin
        numperi = 19;
        numperif = 20;
    end
    if (verperi = 'M') then
    begin
        numperi = 10;
        numperif = 10;
    end
END

if (mes = 11) then
begin
    if (verperi = 'S') then
    begin
        EXECUTE PROCEDURE LEE_CONFIGURACION('NOMINA', 'PERIODICIDAD', 'NUMERO DE SEMANAS DEL MES DE ENERO') returning_values(:numperiaux1);
        EXECUTE PROCEDURE LEE_CONFIGURACION('NOMINA', 'PERIODICIDAD', 'NUMERO DE SEMANAS DEL MES DE FEBRERO') returning_values(:numperiaux2);
        EXECUTE PROCEDURE LEE_CONFIGURACION('NOMINA', 'PERIODICIDAD', 'NUMERO DE SEMANAS DEL MES DE MARZO') returning_values(:numperiaux3);
        EXECUTE PROCEDURE LEE_CONFIGURACION('NOMINA', 'PERIODICIDAD', 'NUMERO DE SEMANAS DEL MES DE ABRIL') returning_values(:numperiaux4);
        EXECUTE PROCEDURE LEE_CONFIGURACION('NOMINA', 'PERIODICIDAD', 'NUMERO DE SEMANAS DEL MES DE MAYO') returning_values(:numperiaux5);
        EXECUTE PROCEDURE LEE_CONFIGURACION('NOMINA', 'PERIODICIDAD', 'NUMERO DE SEMANAS DEL MES DE JUNIO') returning_values(:numperiaux6);
        EXECUTE PROCEDURE LEE_CONFIGURACION('NOMINA', 'PERIODICIDAD', 'NUMERO DE SEMANAS DEL MES DE JULIO') returning_values(:numperiaux7);
        EXECUTE PROCEDURE LEE_CONFIGURACION('NOMINA', 'PERIODICIDAD', 'NUMERO DE SEMANAS DEL MES DE AGOSTO') returning_values(:numperiaux8);
        EXECUTE PROCEDURE LEE_CONFIGURACION('NOMINA', 'PERIODICIDAD', 'NUMERO DE SEMANAS DEL MES DE SEPTIEMBRE') returning_values(:numperiaux9);
        EXECUTE PROCEDURE LEE_CONFIGURACION('NOMINA', 'PERIODICIDAD', 'NUMERO DE SEMANAS DEL MES DE OCTUBRE') returning_values(:numperiaux10);
        numperi = numperiaux1 + numperiaux2 + numperiaux3 + numperiaux4 + numperiaux5 + numperiaux6 + numperiaux7 + numperiaux8 + numperiaux9 + numperiaux10 + 1;
        EXECUTE PROCEDURE LEE_CONFIGURACION('NOMINA', 'PERIODICIDAD', 'NUMERO DE SEMANAS DEL MES DE NOVIEMBRE') returning_values(:numperiaux11);
        numperif = numperiaux1 + numperiaux2 + numperiaux3 + numperiaux4 + numperiaux5 + numperiaux6 + numperiaux7 + numperiaux8 + numperiaux9 + numperiaux10 + numperiaux11;
    end
    if (verperi = 'Q') then
    begin
        numperi = 21;
        numperif = 22;
    end
    if (verperi = 'M') then
    begin
        numperi = 11;
        numperif = 11;
    end
END

if (mes = 12) then
begin
    if (verperi = 'S') then
    begin
        EXECUTE PROCEDURE LEE_CONFIGURACION('NOMINA', 'PERIODICIDAD', 'NUMERO DE SEMANAS DEL MES DE ENERO') returning_values(:numperiaux1);
        EXECUTE PROCEDURE LEE_CONFIGURACION('NOMINA', 'PERIODICIDAD', 'NUMERO DE SEMANAS DEL MES DE FEBRERO') returning_values(:numperiaux2);
        EXECUTE PROCEDURE LEE_CONFIGURACION('NOMINA', 'PERIODICIDAD', 'NUMERO DE SEMANAS DEL MES DE MARZO') returning_values(:numperiaux3);
        EXECUTE PROCEDURE LEE_CONFIGURACION('NOMINA', 'PERIODICIDAD', 'NUMERO DE SEMANAS DEL MES DE ABRIL') returning_values(:numperiaux4);
        EXECUTE PROCEDURE LEE_CONFIGURACION('NOMINA', 'PERIODICIDAD', 'NUMERO DE SEMANAS DEL MES DE MAYO') returning_values(:numperiaux5);
        EXECUTE PROCEDURE LEE_CONFIGURACION('NOMINA', 'PERIODICIDAD', 'NUMERO DE SEMANAS DEL MES DE JUNIO') returning_values(:numperiaux6);
        EXECUTE PROCEDURE LEE_CONFIGURACION('NOMINA', 'PERIODICIDAD', 'NUMERO DE SEMANAS DEL MES DE JULIO') returning_values(:numperiaux7);
        EXECUTE PROCEDURE LEE_CONFIGURACION('NOMINA', 'PERIODICIDAD', 'NUMERO DE SEMANAS DEL MES DE AGOSTO') returning_values(:numperiaux8);
        EXECUTE PROCEDURE LEE_CONFIGURACION('NOMINA', 'PERIODICIDAD', 'NUMERO DE SEMANAS DEL MES DE SEPTIEMBRE') returning_values(:numperiaux9);
        EXECUTE PROCEDURE LEE_CONFIGURACION('NOMINA', 'PERIODICIDAD', 'NUMERO DE SEMANAS DEL MES DE OCTUBRE') returning_values(:numperiaux10);
        EXECUTE PROCEDURE LEE_CONFIGURACION('NOMINA', 'PERIODICIDAD', 'NUMERO DE SEMANAS DEL MES DE NOVIEMBRE') returning_values(:numperiaux11);
        numperi = numperiaux1 + numperiaux2 + numperiaux3 + numperiaux4 + numperiaux5 + numperiaux6 + numperiaux7 + numperiaux8 + numperiaux9 + numperiaux10 + numperiaux11 + 1;
        EXECUTE PROCEDURE LEE_CONFIGURACION('NOMINA', 'PERIODICIDAD', 'NUMERO DE SEMANAS DEL MES DE DICIEMBRE') returning_values(:numperiaux12);
        numperif = numperiaux1 + numperiaux2 + numperiaux3 + numperiaux4 + numperiaux5 + numperiaux6 + numperiaux7 + numperiaux8 + numperiaux9 + numperiaux10 + numperiaux11 + numperiaux12;
    end
    if (verperi = 'Q') then
    begin
        numperi = 23;
        numperif = 24;
    end
    if (verperi = 'M') then
    begin
        numperi = 12;
        numperif = 12;
    end
END

    for select NONO_ID, terc_nit, tnov_cod, nono_periodo, nono_diaini, nono_dura, nono_fecha
    from  nomina_novedades where
    nono_ppago = :verperi and nono_periodo >=:numperi and nono_periodo <=:numperif and nono_ano =: ano
    INTO :idnono, :nit, :codnove, :numper, :dia, :duracion, :fechano
    do
    begin
    SELECT terc_nom FROM terceros WHERE terc_nit = :nit INTO nombre;
    SELECT tnov_nombre FROM tipos_novedad WHERE tnov_cod = :codnove INTO tiponove;
    suspend;
    end

/*  suspend; */
end
^

ALTER PROCEDURE PAGO_NOMINA_XEMPL (
    IDDOC INTEGER)
RETURNS (
    NITEMPL VARCHAR(20) CHARACTER SET NONE,
    NOMBREEMPL VARCHAR(60) CHARACTER SET NONE,
    DEVENGOS NUMERIC(18,2),
    DEDUCIBLES NUMERIC(18,2),
    TOTAL NUMERIC(18,2),
    PAGAR CHAR(1) CHARACTER SET NONE)
AS
begin
FOR SELECT E.TERC_NIT, T.TERC_NOM FROM EMPLEADOS E, TERCEROS T WHERE T.terc_nit =  E.terc_nit
    INTO :nitempl, :nombreempl
    DO
    BEGIN
    /*SUMA DEDUCIBLES*/
    SELECT SUM(c.copo_valor - C.COPO_abono) FROM consolidado_nomina_prov C
    WHERE C.COPO_idori = :iddoc AND C.COPO_deduc = 'S' AND C.COPO_aporte = 'N'
    AND C.COPO_prov = 'N' AND C.terc_nit = :nitempl  and c.COPO_pagook = 'N'
    AND C.COPO_tipoori = 92
    INTO :deducibles;
    if (deducibles is null) then
    deducibles = 0;
    /*SUMA DEVENGOS*/
    SELECT SUM(c.copo_valor - C.COPO_abono) FROM consolidado_nomina_prov C
    WHERE C.COPO_idori = :iddoc AND C.COPO_deduc = 'N' AND C.COPO_aporte = 'N'
    AND C.COPO_prov = 'N' AND C.terc_nit = :nitempl and c.COPO_pagook = 'N'
    AND C.COPO_tipoori = 92
    INTO :devengos;
    if (devengos is null) then
    devengos = 0;
    total = :devengos + :deducibles;
    pagar = 'S';
    if ((total <> 0) and (total is not null))  then
    suspend;
    END
end
^

ALTER PROCEDURE PLANILLA_NOMINA_NOVEDADES (
    ID INTEGER)
RETURNS (
    NOVDIAINI INTEGER,
    NOVDURACION INTEGER,
    NOVVALOR NUMERIC(18,2),
    NOVTIPOADMINISTRADORA CHAR(3) CHARACTER SET NONE,
    NOVNVAADMIN VARCHAR(20) CHARACTER SET NONE,
    NOMNOVEDAD VARCHAR(60) CHARACTER SET NONE,
    NITDETALLE VARCHAR(20) CHARACTER SET NONE,
    NOMEMPL VARCHAR(60) CHARACTER SET NONE)
AS
declare variable periodo integer;
declare variable ano char(4) character set none;
begin
FOR SELECT nd.TERC_NIT, n.nomi_periodo, n.nomi_ano, t.terc_nom FROM nomina_detalle nd, nomina n, terceros t WHERE nd.NOMI_ID = :id and n.nomi_id = nd.nomi_id and t.terc_nit = nd.terc_nit into :nitdetalle, :periodo, :ano, :nomempl
DO
BEGIN
 FOR select V.nono_diaini, V.nono_dura, V.nono_valor, V.nono_tipoadm, V.nono_nvaadm, TN.tnov_nombre from NOMINA_NOVEDADES V, tipos_novedad TN WHERE V.nono_periodo = :periodo AND V.nono_ano = :ano and V.terc_nit = :nitdetalle AND TN.tnov_cod = V.tnov_cod
 INTO :novdiaini, :novduracion, :novvalor, :novtipoadministradora, :novnvaadmin, :nomnovedad
 DO
 SUSPEND;
END
end
^

ALTER PROCEDURE REP_EMPLEADOS (
    DESDE VARCHAR(20) CHARACTER SET NONE,
    HASTA VARCHAR(20) CHARACTER SET NONE,
    AGRUPA CHAR(1) CHARACTER SET NONE,
    AGRDESDE VARCHAR(20) CHARACTER SET NONE,
    AGRHASTA VARCHAR(20) CHARACTER SET NONE,
    CUMPLEANOS CHAR(1) CHARACTER SET NONE,
    FECHA DATE)
RETURNS (
    TERC_NIT VARCHAR(20) CHARACTER SET NONE,
    NOMBREEMPL VARCHAR(60) CHARACTER SET NONE,
    EMPL_FECNAC DATE,
    EMPL_FECING DATE,
    EMPL_SALARIO NUMERIC(18,2),
    EMPL_SALINTEG CHAR(1) CHARACTER SET NONE,
    EMPL_SALVAR CHAR(1) CHARACTER SET NONE,
    EMPL_CARGO VARCHAR(60) CHARACTER SET NONE,
    EMPL_SUCUR INTEGER,
    NOMEPS VARCHAR(60) CHARACTER SET NONE,
    NOMARP VARCHAR(60) CHARACTER SET NONE,
    EMPL_EXTRANJ CHAR(1) CHARACTER SET NONE,
    EMPL_AFPESP INTEGER,
    EMPL_AFPVOLTR CHAR(1) CHARACTER SET NONE,
    EMPL_AFPVOLTRAPOR NUMERIC(18,2),
    EMPL_AFPVOLEM CHAR(1) CHARACTER SET NONE,
    EMPL_AFPVOLEMAPOR NUMERIC(18,2),
    NOMAFC VARCHAR(60) CHARACTER SET NONE,
    EMPL_AUXTR CHAR(1) CHARACTER SET NONE,
    EMPL_CUENTA VARCHAR(25) CHARACTER SET NONE,
    EMPL_FOTO BLOB SUB_TYPE 0 SEGMENT SIZE 80,
    NOMCCF VARCHAR(60) CHARACTER SET NONE,
    NOMAFP VARCHAR(60) CHARACTER SET NONE,
    NOMBRETICO VARCHAR(60) CHARACTER SET NONE,
    NOMBRESUBTI VARCHAR(60) CHARACTER SET NONE,
    NOMDEPTO VARCHAR(60) CHARACTER SET NONE,
    NOMSECCION VARCHAR(60) CHARACTER SET NONE,
    NOMAREA VARCHAR(60) CHARACTER SET NONE,
    SEXO CHAR(20) CHARACTER SET NONE,
    ESTADOCIVIL VARCHAR(20) CHARACTER SET NONE,
    NOMBREPER VARCHAR(20) CHARACTER SET NONE,
    NOMBREBNCO VARCHAR(60) CHARACTER SET NONE,
    NOMFORMPAGO VARCHAR(20) CHARACTER SET NONE,
    NOMTIPOCTA VARCHAR(20) CHARACTER SET NONE,
    DIRECCION VARCHAR(60) CHARACTER SET NONE,
    TELEFONO VARCHAR(40) CHARACTER SET NONE,
    EMPL_DPTO INTEGER,
    NOMSUCUR VARCHAR(60) CHARACTER SET NONE,
    MAIL VARCHAR(100) CHARACTER SET NONE,
    CEL VARCHAR(25) CHARACTER SET NONE,
    OBSERVACIONES BLOB SUB_TYPE 0 SEGMENT SIZE 80,
    FOTO BLOB SUB_TYPE 0 SEGMENT SIZE 80,
    FECCUMPLE VARCHAR(10) CHARACTER SET NONE)
AS
declare variable tcot_cod integer;
declare variable stco_cod integer;
declare variable empl_secc integer;
declare variable empl_area integer;
declare variable empl_sexo char(1);
declare variable empl_estcivil char(1);
declare variable empl_ppago integer;
declare variable empl_eps varchar(20);
declare variable empl_arp varchar(20);
declare variable empl_ccf varchar(20);
declare variable empl_afc varchar(20);
declare variable empl_afp varchar(20);
declare variable empl_banco integer;
declare variable empl_tipocta char(1);
declare variable empl_formpago char(1);
declare variable fecnaccumpl date;
declare variable mescumple varchar(2);
declare variable diacumple varchar(2);
declare variable ano varchar(5);
declare variable anoact integer;
BEGIN
if (:cumpleanos = 'N') then
BEGIN
if (agrupa = 'D') then
begin
 FOR SELECT E.terc_nit, empl_fecnac, empl_fecing, empl_salario, empl_salinteg, empl_salvar, empl_sexo, empl_estcivil, empl_cargo, empl_ppago, empl_sucur, empl_dpto, empl_secc, empl_area, empl_eps, empl_arp, empl_extranj, empl_afpesp, empl_afpvoltr, empl_afpvoltrapor, empl_afpvolem, empl_afpvolemapor, empl_afc, empl_auxtr, empl_banco, empl_cuenta, empl_tipocta, empl_foto, empl_formpago, empl_ccf, e.tcot_cod, e.stco_cod, E.empl_afp, T.terc_email, T.terc_cel, E.empl_obs, e.empl_foto
   FROM EMPLEADOS e, TERCEROS T
      WHERE T.TERC_NIT = E.TERC_NIT AND e.empl_fecret is null and E.terc_nit >= :desde and E.terc_nit <= :hasta and e.empl_dpto >= :agrdesde and e.empl_dpto <= :agrhasta
      order by TERC_NIT
       into :terc_nit, :empl_fecnac, :empl_fecing, :empl_salario, :empl_salinteg, :empl_salvar, :empl_sexo, :empl_estcivil, :empl_cargo, :empl_ppago, :empl_sucur, :empl_dpto, :empl_secc, :empl_area, :empl_eps, :empl_arp, :empl_extranj, :empl_afpesp, :empl_afpvoltr, :empl_afpvoltrapor, :empl_afpvolem, :empl_afpvolemapor, :empl_afc, :empl_auxtr, :empl_banco, :empl_cuenta, :empl_tipocta, :empl_foto, :empl_formpago, :empl_ccf, :tcot_cod, :stco_cod, :empl_afp, :mail, :cel, :observaciones, :foto
    do
  BEGIN
  select t.tcot_nombre from tipo_cotizante t where t.tcot_cod = :tcot_cod into :nombretico;
  select s.stco_nombre from subtipo_cotizante s where s.tcot_cod = :tcot_cod
  into :nombretico;
  SELECT TERC_NOM, TERC_DIR, TERC_TEL FROM TERCEROS WHERE  TERC_NIT = :terc_nit INTO :nombreempl, :direccion, :telefono;
  select dpto_nombre FROM DEPARTAMENTO WHERE dpto_cod = :empl_dpto INTO :nomdepto;
  SELECT S.secc_nom from SECCION S WHERE S.secc_cod = :empl_secc INTO :nomseccion;
  SELECT A.area_nombre FROM AREA A WHERE A.area_cod = :empl_area INTO :nomarea;
  SELECT P.ppag_nombre FROM periodo_pago p WHERE P.ppag_cod = :empl_ppago INTO :nombreper;
  select t.terc_nom  from terceros t, ADMINISTRADORA A where T.terc_nit = A.terc_nit AND t.terc_nit = :empl_eps and t.terc_admini = 'S' AND A.admi_eps = 'S' INTO :nomeps;
  select t.terc_nom  from terceros t, ADMINISTRADORA A where T.terc_nit = A.terc_nit AND t.terc_nit = :empl_arp and t.terc_admini = 'S' AND A.admi_arp = 'S' INTO :nomarp;
  select t.terc_nom  from terceros t, ADMINISTRADORA A where T.terc_nit = A.terc_nit AND t.terc_nit = :empl_ccf and t.terc_admini = 'S' AND A.admi_ccf = 'S' INTO :nomccf;
  select t.terc_nom  from terceros t, ADMINISTRADORA A where T.terc_nit = A.terc_nit AND t.terc_nit = :empl_afp and t.terc_admini = 'S' AND A.admi_afp = 'S' INTO :nomafp;
  select t.terc_nom  from terceros t, ADMINISTRADORA A where T.terc_nit = A.terc_nit AND t.terc_nit = :empl_afc and t.terc_admini = 'S' AND A.admi_afc = 'S' INTO :nomafc;
  SELECT B.banc_nombre FROM BANCOS B WHERE B.banc_cod = :empl_banco INTO :nombrebnco;
  select s.sucu_nombre from sucursales s where s.sucu_id = :empl_sucur into :nomsucur;
  if (empl_formpago = 'C') then
  nomformpago = 'CAJA';
  ELSE
  if (empl_formpago = 'B') then
  nomformpago = 'BANCO';
  if (empl_tipocta = 'A') then
  nomtipocta = 'AHORROS';
  ELSE
  if (empl_tipocta = 'C') then
  nomtipocta = 'CORRIENTE';
  if (empl_sexo = 'M') then
  sexo = 'MASCULINO';
  ELSE
  if (empl_sexo = 'F') then
  SEXO = 'FEMENINO';
  if (empl_estcivil = 'S') then
  estadocivil = 'SOLTERO(A)';
  ELSE
  if (empl_estcivil = 'C') then
  estadocivil = 'CASADO(A)';
  ELSE
  if (empl_estcivil = 'D') then
  estadocivil = 'DIVORCIADO(A)';
  ELSE
  if (empl_estcivil = 'V') then
  estadocivil = 'VIUDO(A)';
  ELSE
  if (empl_estcivil = 'U') then
  estadocivil = 'UNION LIBRE';
  suspend;
  END
end
else
if (agrupa = 'S') then
BEGIN
 FOR SELECT E.terc_nit, empl_fecnac, empl_fecing, empl_salario, empl_salinteg, empl_salvar, empl_sexo, empl_estcivil, empl_cargo, empl_ppago, empl_sucur, empl_dpto, empl_secc, empl_area, empl_eps, empl_arp, empl_extranj, empl_afpesp, empl_afpvoltr, empl_afpvoltrapor, empl_afpvolem, empl_afpvolemapor, empl_afc, empl_auxtr, empl_banco, empl_cuenta, empl_tipocta, empl_foto, empl_formpago, empl_ccf, e.tcot_cod, e.stco_cod, E.empl_afp, T.terc_email, T.terc_cel, E.empl_obs, e.empl_foto
   FROM EMPLEADOS e, TERCEROS T
      WHERE T.TERC_NIT = E.TERC_NIT AND e.empl_fecret is null and E.terc_nit >= :desde and E.terc_nit <= :hasta and e.empl_dpto >= :agrdesde and e.empl_dpto <= :agrhasta
      order by TERC_NIT
       into :terc_nit, :empl_fecnac, :empl_fecing, :empl_salario, :empl_salinteg, :empl_salvar, :empl_sexo, :empl_estcivil, :empl_cargo, :empl_ppago, :empl_sucur, :empl_dpto, :empl_secc, :empl_area, :empl_eps, :empl_arp, :empl_extranj, :empl_afpesp, :empl_afpvoltr, :empl_afpvoltrapor, :empl_afpvolem, :empl_afpvolemapor, :empl_afc, :empl_auxtr, :empl_banco, :empl_cuenta, :empl_tipocta, :empl_foto, :empl_formpago, :empl_ccf, :tcot_cod, :stco_cod, :empl_afp, :mail, :cel, :observaciones, :foto
    do
  BEGIN
  select t.tcot_nombre from tipo_cotizante t where t.tcot_cod = :tcot_cod into :nombretico;
  select s.stco_nombre from subtipo_cotizante s where s.tcot_cod = :tcot_cod
  into :nombretico;
  SELECT TERC_NOM, TERC_DIR, TERC_TEL FROM TERCEROS WHERE  TERC_NIT = :terc_nit INTO :nombreempl, :direccion, :telefono;
  select dpto_nombre FROM DEPARTAMENTO WHERE dpto_cod = :empl_dpto INTO :nomdepto;
  SELECT S.secc_nom from SECCION S WHERE S.secc_cod = :empl_secc INTO :nomseccion;
  SELECT A.area_nombre FROM AREA A WHERE A.area_cod = :empl_area INTO :nomarea;
  SELECT P.ppag_nombre FROM periodo_pago p WHERE P.ppag_cod = :empl_ppago INTO :nombreper;
  select t.terc_nom  from terceros t, ADMINISTRADORA A where T.terc_nit = A.terc_nit AND t.terc_nit = :empl_eps and t.terc_admini = 'S' AND A.admi_eps = 'S' INTO :nomeps;
  select t.terc_nom  from terceros t, ADMINISTRADORA A where T.terc_nit = A.terc_nit AND t.terc_nit = :empl_arp and t.terc_admini = 'S' AND A.admi_arp = 'S' INTO :nomarp;
  select t.terc_nom  from terceros t, ADMINISTRADORA A where T.terc_nit = A.terc_nit AND t.terc_nit = :empl_ccf and t.terc_admini = 'S' AND A.admi_ccf = 'S' INTO :nomccf;
  select t.terc_nom  from terceros t, ADMINISTRADORA A where T.terc_nit = A.terc_nit AND t.terc_nit = :empl_afp and t.terc_admini = 'S' AND A.admi_afp = 'S' INTO :nomafp;
  select t.terc_nom  from terceros t, ADMINISTRADORA A where T.terc_nit = A.terc_nit AND t.terc_nit = :empl_afc and t.terc_admini = 'S' AND A.admi_afc = 'S' INTO :nomafc;
  SELECT B.banc_nombre FROM BANCOS B WHERE B.banc_cod = :empl_banco INTO :nombrebnco;
  select s.sucu_nombre from sucursales s where s.sucu_id = :empl_sucur into :nomsucur;
  if (empl_formpago = 'C') then
  nomformpago = 'CAJA';
  ELSE
  if (empl_formpago = 'B') then
  nomformpago = 'BANCO';
  if (empl_tipocta = 'A') then
  nomtipocta = 'AHORROS';
  ELSE
  if (empl_tipocta = 'C') then
  nomtipocta = 'CORRIENTE';
  if (empl_sexo = 'M') then
  sexo = 'MASCULINO';
  ELSE
  if (empl_sexo = 'F') then
  SEXO = 'FEMENINO';
  if (empl_estcivil = 'S') then
  estadocivil = 'SOLTERO(A)';
  ELSE
  if (empl_estcivil = 'C') then
  estadocivil = 'CASADO(A)';
  ELSE
  if (empl_estcivil = 'D') then
  estadocivil = 'DIVORCIADO(A)';
  ELSE
  if (empl_estcivil = 'V') then
  estadocivil = 'VIUDO(A)';
  ELSE
  if (empl_estcivil = 'U') then
  estadocivil = 'UNION LIBRE';
  suspend;
  END
end
ELSE
begin
 FOR SELECT E.terc_nit, empl_fecnac, empl_fecing, empl_salario, empl_salinteg, empl_salvar, empl_sexo, empl_estcivil, empl_cargo, empl_ppago, empl_sucur, empl_dpto, empl_secc, empl_area, empl_eps, empl_arp, empl_extranj, empl_afpesp, empl_afpvoltr, empl_afpvoltrapor, empl_afpvolem, empl_afpvolemapor, empl_afc, empl_auxtr, empl_banco, empl_cuenta, empl_tipocta, empl_foto, empl_formpago, empl_ccf, e.tcot_cod, e.stco_cod, E.empl_afp, T.terc_email, T.terc_cel, E.empl_obs, e.empl_foto
   FROM EMPLEADOS e, TERCEROS T
      WHERE T.TERC_NIT = E.TERC_NIT AND e.empl_fecret is null and E.terc_nit >= :desde and E.terc_nit <= :hasta and e.empl_dpto >= :agrdesde and e.empl_dpto <= :agrhasta
      order by TERC_NIT
       into :terc_nit, :empl_fecnac, :empl_fecing, :empl_salario, :empl_salinteg, :empl_salvar, :empl_sexo, :empl_estcivil, :empl_cargo, :empl_ppago, :empl_sucur, :empl_dpto, :empl_secc, :empl_area, :empl_eps, :empl_arp, :empl_extranj, :empl_afpesp, :empl_afpvoltr, :empl_afpvoltrapor, :empl_afpvolem, :empl_afpvolemapor, :empl_afc, :empl_auxtr, :empl_banco, :empl_cuenta, :empl_tipocta, :empl_foto, :empl_formpago, :empl_ccf, :tcot_cod, :stco_cod, :empl_afp, :mail, :cel, :observaciones, :foto
    do
  BEGIN
  select t.tcot_nombre from tipo_cotizante t where t.tcot_cod = :tcot_cod into :nombretico;
  select s.stco_nombre from subtipo_cotizante s where s.tcot_cod = :tcot_cod
  into :nombretico;
  SELECT TERC_NOM, TERC_DIR, TERC_TEL FROM TERCEROS WHERE  TERC_NIT = :terc_nit INTO :nombreempl, :direccion, :telefono;
  select dpto_nombre FROM DEPARTAMENTO WHERE dpto_cod = :empl_dpto INTO :nomdepto;
  SELECT S.secc_nom from SECCION S WHERE S.secc_cod = :empl_secc INTO :nomseccion;
  SELECT A.area_nombre FROM AREA A WHERE A.area_cod = :empl_area INTO :nomarea;
  SELECT P.ppag_nombre FROM periodo_pago p WHERE P.ppag_cod = :empl_ppago INTO :nombreper;
  select t.terc_nom  from terceros t, ADMINISTRADORA A where T.terc_nit = A.terc_nit AND t.terc_nit = :empl_eps and t.terc_admini = 'S' AND A.admi_eps = 'S' INTO :nomeps;
  select t.terc_nom  from terceros t, ADMINISTRADORA A where T.terc_nit = A.terc_nit AND t.terc_nit = :empl_arp and t.terc_admini = 'S' AND A.admi_arp = 'S' INTO :nomarp;
  select t.terc_nom  from terceros t, ADMINISTRADORA A where T.terc_nit = A.terc_nit AND t.terc_nit = :empl_ccf and t.terc_admini = 'S' AND A.admi_ccf = 'S' INTO :nomccf;
  select t.terc_nom  from terceros t, ADMINISTRADORA A where T.terc_nit = A.terc_nit AND t.terc_nit = :empl_afp and t.terc_admini = 'S' AND A.admi_afp = 'S' INTO :nomafp;
  select t.terc_nom  from terceros t, ADMINISTRADORA A where T.terc_nit = A.terc_nit AND t.terc_nit = :empl_afc and t.terc_admini = 'S' AND A.admi_afc = 'S' INTO :nomafc;
  SELECT B.banc_nombre FROM BANCOS B WHERE B.banc_cod = :empl_banco INTO :nombrebnco;
  select s.sucu_nombre from sucursales s where s.sucu_id = :empl_sucur into :nomsucur;
  if (empl_formpago = 'C') then
  nomformpago = 'CAJA';
  ELSE
  if (empl_formpago = 'B') then
  nomformpago = 'BANCO';
  if (empl_tipocta = 'A') then
  nomtipocta = 'AHORROS';
  ELSE
  if (empl_tipocta = 'C') then
  nomtipocta = 'CORRIENTE';
  if (empl_sexo = 'M') then
  sexo = 'MASCULINO';
  ELSE
  if (empl_sexo = 'F') then
  SEXO = 'FEMENINO';
  if (empl_estcivil = 'S') then
  estadocivil = 'SOLTERO(A)';
  ELSE
  if (empl_estcivil = 'C') then
  estadocivil = 'CASADO(A)';
  ELSE
  if (empl_estcivil = 'D') then
  estadocivil = 'DIVORCIADO(A)';
  ELSE
  if (empl_estcivil = 'V') then
  estadocivil = 'VIUDO(A)';
  ELSE
  if (empl_estcivil = 'U') then
  estadocivil = 'UNION LIBRE';
  suspend;
  END
end
END
ELSE
if (cumpleanos = 'S') then
BEGIN
FOR SELECT E.EMPL_FECNAC, E.terc_nit,  T.terc_nom FROM EMPLEADOS E, TERCEROS T WHERE T.terc_nit = E.terc_nit
INTO :fecnaccumpl, :terc_nit, :nombreempl
DO
if (fecnaccumpl IS NOT NULL) then
BEGIN
anoact = SUBSTR(fecha, 1,4);
mescumple = SUBSTR(:fecnaccumpl, 6,7);
diacumple = SUBSTR(:fecnaccumpl, 9,10);
feccumple = :anoact || '/' || :mescumple || '/' || :diacumple;
SUSPEND;
END
END
END
^


SET TERM ; ^


/* Fields descriptions */

DESCRIBE FIELD ANNO_PERIODO TABLE ANTICIPOS_NOMINA
'PERIODO AL QUE AFECTA ESE ANTICIPO';



/******************************************************************************/
/****                              Privileges                              ****/
/******************************************************************************/


/* Privileges of users */
GRANT ALL ON ADMINISTRADORA TO PUBLIC;
GRANT ALL ON INTERFAZ_NOMINA TO PUBLIC;

/* Privileges of triggers */
GRANT UPDATE, REFERENCES ON EMPLEADOS TO TRIGGER EMPLEADOS_BI;

/* Privileges of procedures */
GRANT SELECT ON CONCEPTOS_NOMINA TO PROCEDURE CAUSA_NOMINA;
GRANT SELECT ON EMPLEADOS TO PROCEDURE CAUSA_NOMINA;
GRANT SELECT ON EMPLEADO_CONCEPTOS TO PROCEDURE CAUSA_NOMINA;
GRANT INSERT ON NOMINA TO PROCEDURE CAUSA_NOMINA;
GRANT INSERT ON NOMINA_CONCEPTOS TO PROCEDURE CAUSA_NOMINA;
GRANT EXECUTE ON PROCEDURE CAMBIE_ID_NOMINA TO PROCEDURE CAUSA_NOMINA;
GRANT EXECUTE ON PROCEDURE DIAS_LABORADOS TO PROCEDURE CAUSA_NOMINA;
GRANT EXECUTE ON PROCEDURE REDONDEE TO PROCEDURE CAUSA_NOMINA;

INSERT INTO NOMBRES_CAMPOS (NOMBRE, DESCRIPCION) VALUES ('EMPL_SALARIO', 'Salario');
INSERT INTO IMPORTACION_INVENTARIO (IMIN_TIPO, IMIN_DATO, IMIN_COLUMNA, IMIN_ANCHO) VALUES (20, 'EMPL_SALARIO', 29, 20);

CREATE GENERATOR ID_NOMICOMI;
SET GENERATOR ID_NOMICOMI TO 31;


/******************************************************************************/
/****                              Exceptions                              ****/
/******************************************************************************/

CREATE EXCEPTION COMISIONES_REGISTRADAS 'Ya existen comisiones registradas para el empleado';


/******************************************************************************/
/****                                Tables                                ****/
/******************************************************************************/


CREATE TABLE NOMINA_COMISIONES (
    NCOM_ID            INTEGER NOT NULL,
    NCOM_ITEM          INTEGER NOT NULL,
    NCOM_PERIODICIDAD  INTEGER,
    TERC_NIT           NIT,
    NCOM_ANO           ANO,
    NCOM_PERIODO       INTEGER,
    NCOM_MONTO         MONTO
);




/******************************************************************************/
/****                             Primary Keys                             ****/
/******************************************************************************/

ALTER TABLE NOMINA_COMISIONES ADD CONSTRAINT PK_NOMINA_COMISIONES PRIMARY KEY (NCOM_ID, NCOM_ITEM);


/******************************************************************************/
/****                             Foreign Keys                             ****/
/******************************************************************************/

ALTER TABLE NOMINA_COMISIONES ADD CONSTRAINT FK_NOMINA_COMISIONES_2 FOREIGN KEY (TERC_NIT) REFERENCES TERCEROS (TERC_NIT);


/******************************************************************************/
/****                          Stored Procedures                           ****/
/******************************************************************************/


SET TERM ^ ;

CREATE OR ALTER PROCEDURE CAMBIE_ID_NOMINACOMISIONES
RETURNS (
    ID INTEGER)
AS
DECLARE VARIABLE numrows INTEGER;
BEGIN
/* TRAE EL ID NUEVO Y LO ACTUALIZA */
NUMROWS = 1;
WHILE (NUMROWS > 0) DO
    BEGIN
    ID = GEN_ID(id_nomicomi, 1);
    /* VERIFIQUE SI YA EXISTE */
    SELECT COUNT(*) FROM nomina_comisiones WHERE NCOM_ID = :ID INTO :NUMROWS;
    END
SUSPEND;
END
^


ALTER TABLE CONCEPTOS_NOMINA
ADD CONC_GTOEMPR CHAR(1);
^

ALTER TABLE NOMINA_CONCEPTOS
ADD NOCO_GTOEMPR CHAR(1);
^
CREATE OR ALTER PROCEDURE CAUSA_NOMINA (
    FEC DATE,
    PERIODO INTEGER,
    PERIODICIDAD INTEGER,
    PAGOGLOBAL CHAR(1) CHARACTER SET NONE,
    ANO CHAR(4) CHARACTER SET NONE)
RETURNS (
    IDNOMINA INTEGER)
AS
DECLARE VARIABLE item INTEGER;
DECLARE VARIABLE nite VARCHAR(20) CHARACTER SET none;
DECLARE VARIABLE nit_tercero VARCHAR(20);
DECLARE VARIABLE concept INTEGER;
DECLARE VARIABLE montos NUMERIC(18,2);
DECLARE VARIABLE porcen NUMERIC(9,4);
DECLARE VARIABLE entidad VARCHAR(20);
DECLARE VARIABLE conc_cod INTEGER;
DECLARE VARIABLE conc_deduc CHAR(1);
DECLARE VARIABLE conc_porc NUMERIC(9,4);
DECLARE VARIABLE conc_entidad INTEGER;
DECLARE VARIABLE conc_monto NUMERIC(18,2);
DECLARE VARIABLE conc_modifi CHAR(1);
DECLARE VARIABLE conc_promedio CHAR(1);
DECLARE VARIABLE emco_perprom INTEGER;
DECLARE VARIABLE valor NUMERIC(18,2);
DECLARE VARIABLE diaslab INTEGER;
DECLARE VARIABLE conc_prov CHAR(1);
DECLARE VARIABLE conc_aporte CHAR(1);
DECLARE VARIABLE numeroprom INTEGER;
DECLARE VARIABLE conc_aplicaprom CHAR(1);
DECLARE VARIABLE perinicial INTEGER;
DECLARE VARIABLE anoprom INTEGER;
DECLARE VARIABLE conc_dias CHAR(1);
DECLARE VARIABLE conc_otroconc CHAR(1);
DECLARE VARIABLE conc_codotroconc INTEGER;
DECLARE VARIABLE anosum INTEGER;
DECLARE VARIABLE salario CHAR(1) CHARACTER SET none;
DECLARE VARIABLE liquidaper INTEGER;
DECLARE VARIABLE rmod NUMERIC(2,2);
DECLARE VARIABLE basico NUMERIC(18,2);
DECLARE VARIABLE niteps VARCHAR(20);
DECLARE VARIABLE nitafc VARCHAR(20);
DECLARE VARIABLE nitafp VARCHAR(20);
DECLARE VARIABLE nitccf VARCHAR(20);
DECLARE VARIABLE gtoempr CHAR(1);
DECLARE VARIABLE comision NUMERIC(18,2);
BEGIN
/*SI ES QUINCENAL*/
IF (periodicidad = 2) THEN
BEGIN
EXECUTE PROCEDURE cambie_id_nomina RETURNING_VALUES(:idnomina);
INSERT INTO nomina (nomi_id, NOMI_FECCAUSA, NOMI_PAGOGLOBAL, NOMI_PERIODOCIDAD, NOMI_PERIODO, NOMI_ANO, NOMI_LIQOK)
VALUES (:IDNOMINA, :fec,:pagoglobal, :periodicidad, :periodo, :ano, 'N');
 BEGIN
    item = 1;
    FOR SELECT E.TERC_NIT, E.empl_salario, e.empl_eps, e.empl_afc, e.empl_afp, e.empl_ccf
    FROM EMPLEADOS E
    WHERE E.empl_ppago = 2
    INTO :nite, :basico, :niteps, :nitafc, :nitafp, :nitccf
    DO
    BEGIN
    FOR SELECT CE.TERC_NIT, CE.CONC_COD, CE.EMCO_MONTO, CE.EMCO_PORC, ce.empl_entidad, CE.emco_perprom, CE.emco_luquidaper,    CN.CONC_COD, CN.CONC_DEDUC,CN.CONC_PORC, CN.CONC_ENTIDAD, CN.CONC_MONTO,  CN.CONC_DIAS, CN.CONC_MODIFI,
    CN.CONC_PROMEDIO, CN.conc_salario, CE.emco_perprom, CN.conc_prov, CN.conc_aporte, CN.conc_aplicaprom, cn.conc_otroconc, cn.conc_codotroconc, CN.conc_gtoempr
    FROM empleado_conceptos CE, CONCEPTOS_NOMINA CN WHERE ((CE.terc_nit = :nite) AND (CE.CONC_COD = CN.CONC_COD) AND (CN.conc_fecini <= :fec AND CN.conc_fecfin >= :FEC) ) OR ((CE.terc_nit = :nite)
    AND (CE.CONC_COD = CN.CONC_COD) AND (cn.conc_todosper = 'N') AND (CE.emco_ppago = :periodo)) OR  ((CE.terc_nit = :nite) AND (CE.CONC_COD = CN.CONC_COD) AND cn.conc_todosper = 'S')  ORDER BY (TERC_NIT)
    INTO :nit_tercero, :concept,  :montos, :porcen, :entidad, :numeroprom, :liquidaper ,:CONC_COD, :CONC_DEDUC, :CONC_PORC,
    :CONC_ENTIDAD, :CONC_MONTO, :CONC_DIAS, :CONC_MODIFI,:CONC_PROMEDIO, :salario,:EMCO_PERPROM, :conc_prov, :conc_aporte , :CONC_APLICAPROM, :conc_otroconc, :conc_codotroconc, :gtoempr
    DO
    BEGIN
    IF (conc_dias = 'S') THEN
    EXECUTE PROCEDURE DIAS_LABORADOS (:nite, :periodo) RETURNING_VALUES (:diaslab);
    ELSE
    BEGIN
    IF (liquidaper = 0) THEN
    diaslab = 15;
    ELSE
    IF (liquidaper = 1) THEN
    diaslab = 30;
    ELSE
    IF (liquidaper = 2) THEN
    diaslab = 60;
    END
IF (conc_cod <> 920) THEN
BEGIN
    IF ((:montos = 0) OR (:montos IS NULL)) THEN
      BEGIN
      IF ((CONC_PORC = 0 AND :porcen = 0) OR (CONC_PORC IS NULL AND :porcen = 0) OR (CONC_PORC = 0 AND :porcen IS NULL) OR (CONC_PORC IS NULL AND :porcen IS NULL) ) THEN
        BEGIN
        IF ((conc_monto <> 0) AND (conc_monto IS NOT NULL) ) THEN
        BEGIN
        VALOR = :CONC_MONTO/30 * :diaslab;
        EXECUTE PROCEDURE REDONDEE(:valor, 0) RETURNING_VALUES (VALOR);
        END
        ELSE
        BEGIN
        conc_monto = :basico;
        VALOR = (:conc_monto/30 * :diaslab );
        EXECUTE PROCEDURE REDONDEE(:valor, 0) RETURNING_VALUES (VALOR);
        END
        END
       ELSE
       BEGIN
        IF (:porcen <> 0) THEN
          BEGIN
            IF ((conc_monto <> 0) AND (conc_monto IS NOT NULL) ) THEN
            BEGIN
              VALOR = ((:CONC_MONTO/30 * :diaslab ) * :PORCEN) /100;
              EXECUTE PROCEDURE REDONDEE(:valor, 0)RETURNING_VALUES (VALOR);
            END
            ELSE
            BEGIN
              conc_monto = :basico;
              VALOR = ((:CONC_MONTO/30 * :diaslab ) * :PORCEN) /100;
              EXECUTE PROCEDURE REDONDEE(:valor, 0)RETURNING_VALUES (VALOR);
            END
          END
          ELSE
          BEGIN
            IF ((conc_monto <> 0) AND (conc_monto IS NOT NULL) ) THEN
            BEGIN
              VALOR = ((:CONC_MONTO/30 * :diaslab ) * :conc_porc) /100;
              EXECUTE PROCEDURE REDONDEE(:valor, 0)RETURNING_VALUES (VALOR);
            END
            ELSE
            BEGIN
              conc_monto = :basico;
              VALOR = ((:CONC_MONTO/30 * :diaslab ) * :conc_porc) /100;
              EXECUTE PROCEDURE REDONDEE(:valor, 0)RETURNING_VALUES (VALOR);
            END
          END
       END
      END
    ELSE
    BEGIN
      IF (CONC_PORC = 0 AND :porcen = 0) THEN
      BEGIN
      VALOR = (:montos/30 * :diaslab );
      EXECUTE PROCEDURE REDONDEE(:valor, 0)RETURNING_VALUES (VALOR);
      END
      ELSE
      BEGIN
        IF (:porcen <> 0) THEN
          BEGIN
          VALOR = ((:MONTOS/30 * :diaslab ) * :PORCEN) /100;
          EXECUTE PROCEDURE REDONDEE(:valor, 0)RETURNING_VALUES (VALOR);
          END
          ELSE
          BEGIN
          VALOR = ((:montos/30 * :diaslab ) * :CONC_PORC) /100;
          END
          EXECUTE PROCEDURE REDONDEE(:valor, 0)RETURNING_VALUES (VALOR);
       END
   END
    IF (conc_promedio = 'S') THEN
    BEGIN
    perinicial = :periodo - (:numeroprom) + 1;
    anoprom = CAST (ano AS INTEGER);
    IF (perinicial <= 0) THEN
    BEGIN
    perinicial = 24 + :PERINICIAL;
    anoprom = CAST(ANO AS INTEGER) - 1;
    END
    SELECT SUM (noco_valor) FROM nomina_conceptos n WHERE n.noco_aplicaprom = 'S' AND N.noco_periodo >= :perinicial - 1 AND N.noco_periodo < :periodo AND N.noco_ano >= :anoprom AND N.noco_ano <= :ano AND terc_nit = :nite INTO :valor;
    valor = valor / numeroprom;
    EXECUTE PROCEDURE REDONDEE(:valor, 0)RETURNING_VALUES (VALOR);
    END
    IF (conc_otroconc = 'S') THEN
    BEGIN
    anosum = CAST(ano AS INTEGER);
    anosum = anosum - 1;
    SELECT SUM (noco_valor) FROM nomina_conceptos n WHERE n.noco_ano = :anosum AND n.conc_cod = :conc_codotroconc INTO :valor;
    END
/*SI EL CONCEPTO ES UN APORTE*/
    IF (((:entidad = '' ) OR (entidad IS NULL)) AND (conc_aporte = 'S')) THEN
    BEGIN
    IF ((conc_cod = 904) OR (conc_cod = 905) OR (conc_cod = 906)) THEN
            BEGIN
            entidad = :nitafp;
            SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
            IF (comision IS NULL) THEN
            comision = 0;
                IF (conc_cod = 904) THEN
                BEGIN
                SELECT A.paan_afptr FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = (((:basico + :comision)/30 * :diaslab ) * :PORCEN) /100;
                EXECUTE PROCEDURE REDONDEE(:valor, 0)RETURNING_VALUES (VALOR);
                END
                ELSE
                IF ((conc_cod = 905) OR (conc_cod = 906)) THEN
                BEGIN
                SELECT A.paan_afpem FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = (((:basico + :comision)/30 * :diaslab ) * :PORCEN) /100;
                EXECUTE PROCEDURE REDONDEE(:valor, 0)RETURNING_VALUES (VALOR);
                END
            IF (liquidaper = 0) THEN
                INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
                VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
            ELSE
            IF (liquidaper = 1) THEN
            BEGIN
            rmod = mod(:periodo, 2);
            IF (rmod = 0) THEN
                INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
                VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
            END
            ELSE
            IF (liquidaper = 2) THEN
            BEGIN
            rmod = mod(:periodo, 4);
            IF (rmod = 0) THEN
                INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
                VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
            END
            END
       IF ((conc_cod = 907) OR (conc_cod = 914) OR (conc_cod = 915)) THEN
            BEGIN
            entidad = :niteps;
            SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
            IF (comision IS NULL) THEN
            comision = 0;
                IF (conc_cod = 907) THEN
                BEGIN
                SELECT A.paan_epstr FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = (((:basico + :comision)/30 * :diaslab ) * :PORCEN) /100;
                EXECUTE PROCEDURE REDONDEE(:valor, 0)RETURNING_VALUES (VALOR);
                END
                ELSE
                IF ((conc_cod = 914) OR (conc_cod = 915)) THEN
                BEGIN
                SELECT A.paan_epsem FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = (((:basico + :comision)/30 * :diaslab ) * :PORCEN) /100;
                EXECUTE PROCEDURE REDONDEE(:valor, 0)RETURNING_VALUES (VALOR);
                END
            IF (liquidaper = 0) THEN
                INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
                VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
            ELSE
            IF (liquidaper = 1) THEN
            BEGIN
            rmod = mod(:periodo, 2);
            IF (rmod = 0) THEN
                INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
                VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
            END
            ELSE
            IF (liquidaper = 2) THEN
            BEGIN
            rmod = mod(:periodo, 4);
            IF (rmod = 0) THEN
                INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
                VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
            END
            END
       IF ((conc_cod = 910) OR (conc_cod = 911) OR (conc_cod = 916) OR (conc_cod = 917) OR (conc_cod = 918) OR (conc_cod = 919)) THEN
            BEGIN
            entidad = :nitccf;
            SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
            IF (comision IS NULL) THEN
            comision = 0;
                IF ((conc_cod = 910) OR (conc_cod = 911) ) THEN
                BEGIN
                SELECT A.paan_ccf FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = (((:basico + :comision)/30 * :diaslab ) * :PORCEN) /100;
                EXECUTE PROCEDURE REDONDEE(:valor, 0)RETURNING_VALUES (VALOR);
                END
                ELSE
                IF ((conc_cod = 916) OR (conc_cod = 917)) THEN
                BEGIN
                SELECT A.paan_icbf FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = (((:basico + :comision)/30 * :diaslab ) * :PORCEN) /100;
                EXECUTE PROCEDURE REDONDEE(:valor, 0)RETURNING_VALUES (VALOR);
                END
                ELSE
                IF ((conc_cod = 918) OR (conc_cod = 919)) THEN
                BEGIN
                SELECT A.paan_sena FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = (((:basico + :comision)/30 * :diaslab ) * :PORCEN) /100;
                EXECUTE PROCEDURE REDONDEE(:valor, 0)RETURNING_VALUES (VALOR);
                END
            IF (liquidaper = 0) THEN
                INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
                VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
            ELSE
            IF (liquidaper = 1) THEN
            BEGIN
            rmod = mod(:periodo, 2);
            IF (rmod = 0) THEN
                INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
                VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
            END
            ELSE
            IF (liquidaper = 2) THEN
            BEGIN
            rmod = mod(:periodo, 4);
            IF (rmod = 0) THEN
                INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
                VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
            END
            END
        IF ((conc_cod = 912) OR (conc_cod = 913)) THEN
            BEGIN
            entidad = :nitafc;
            SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
            IF (comision IS NULL) THEN
            comision = 0;
                IF ((conc_cod = 912) OR (conc_cod = 913) ) THEN
                BEGIN
                SELECT A.paan_cesemp FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = (((:basico + :comision)/30 * :diaslab ) * :PORCEN) /100;
                EXECUTE PROCEDURE REDONDEE(:valor, 0)RETURNING_VALUES (VALOR);
                END
            IF (liquidaper = 0) THEN
                INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
                VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
            ELSE
            IF (liquidaper = 1) THEN
            BEGIN
            rmod = mod(:periodo, 2);
            IF (rmod = 0) THEN
                INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
                VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
            END
            ELSE
            IF (liquidaper = 2) THEN
            BEGIN
            rmod = mod(:periodo, 4);
            IF (rmod = 0) THEN
                INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
                VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
            END
            END
    END
    ELSE
    BEGIN
    IF (liquidaper = 0) THEN
    INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
    VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
    ELSE
    IF (liquidaper = 1) THEN
    BEGIN
    rmod = mod(:periodo, 2);
    IF (rmod = 0) THEN
        INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
        VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
    END
    ELSE
    IF (liquidaper = 2) THEN
    BEGIN
    rmod = mod(:periodo, 4);
    IF (rmod = 0) THEN
        INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
        VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
    END
    END
item = :item + 1;
END
ELSE
BEGIN
SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :valor;
        INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
        VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
item = :item + 1;
END
END
END
END
END
ELSE
/*SI ES MENSUAL*/
IF (periodicidad = 1) THEN
BEGIN
EXECUTE PROCEDURE cambie_id_nomina RETURNING_VALUES(:idnomina);
INSERT INTO nomina (nomi_id, NOMI_FECCAUSA, NOMI_PAGOGLOBAL, NOMI_PERIODOCIDAD, NOMI_PERIODO, NOMI_ANO, NOMI_LIQOK)
VALUES (:IDNOMINA, :fec,:pagoglobal, :periodicidad, :periodo, :ano, 'N');
    BEGIN
    item = 1;
    FOR SELECT E.TERC_NIT, E.empl_salario, e.empl_eps, e.empl_afc, e.empl_afp, e.empl_ccf
    FROM EMPLEADOS E
    WHERE E.empl_ppago = 1
    INTO :nite, :basico, :niteps, :nitafc, :nitafp, :nitccf
    DO
    FOR SELECT CE.TERC_NIT, CE.CONC_COD, CE.EMCO_MONTO, CE.EMCO_PORC, ce.empl_entidad, CE.emco_perprom, CE.emco_luquidaper,    CN.CONC_COD, CN.CONC_DEDUC,CN.CONC_PORC, CN.CONC_ENTIDAD, CN.CONC_MONTO,  CN.CONC_DIAS, CN.CONC_MODIFI,
    CN.CONC_PROMEDIO, CN.conc_salario, CE.emco_perprom, CN.conc_prov, CN.conc_aporte, CN.conc_aplicaprom, cn.conc_otroconc, cn.conc_codotroconc, CN.conc_gtoempr
    FROM empleado_conceptos CE, CONCEPTOS_NOMINA CN WHERE ((CE.terc_nit = :nite) AND (CE.CONC_COD = CN.CONC_COD) AND (CN.conc_fecini <= :fec AND CN.conc_fecfin >= :FEC) ) OR ((CE.terc_nit = :nite)
    AND (CE.CONC_COD = CN.CONC_COD) AND (cn.conc_todosper = 'N') AND (CE.emco_ppago = :periodo)) OR  ((CE.terc_nit = :nite) AND (CE.CONC_COD = CN.CONC_COD) AND cn.conc_todosper = 'S')  ORDER BY (TERC_NIT)
    INTO :nit_tercero, :concept,  :montos, :porcen, :entidad, :numeroprom, :liquidaper ,:CONC_COD, :CONC_DEDUC, :CONC_PORC,
    :CONC_ENTIDAD, :CONC_MONTO, :CONC_DIAS, :CONC_MODIFI,:CONC_PROMEDIO, :salario,:EMCO_PERPROM, :conc_prov, :conc_aporte , :CONC_APLICAPROM, :conc_otroconc, :conc_codotroconc, :gtoempr    DO
    BEGIN
    IF (conc_dias = 'S') THEN
    EXECUTE PROCEDURE DIAS_LABORADOS (:nite, :periodo) RETURNING_VALUES (:diaslab);
    ELSE
    BEGIN
    IF (liquidaper = 0) THEN
    diaslab = 30;
    ELSE
    IF (liquidaper = 1) THEN
    diaslab = 60;
    ELSE
    IF (liquidaper = 2) THEN
    diaslab = 120;
    END
IF (conc_cod <> 920) THEN
BEGIN
    IF ((:montos = 0) OR (:montos IS NULL)) THEN
      BEGIN
      IF ((CONC_PORC = 0 AND :porcen = 0) OR (CONC_PORC IS NULL AND :porcen = 0) OR (CONC_PORC = 0 AND :porcen IS NULL) OR (CONC_PORC IS NULL AND :porcen IS NULL) ) THEN
        BEGIN
        IF ((conc_monto <> 0) AND (conc_monto IS NOT NULL) ) THEN
        BEGIN
        VALOR = :CONC_MONTO/30 * :diaslab;
        EXECUTE PROCEDURE REDONDEE(:valor, 0) RETURNING_VALUES (VALOR);
        END
        ELSE
        BEGIN
        conc_monto = :basico;
        VALOR = (:conc_monto/30 * :diaslab );
        EXECUTE PROCEDURE REDONDEE(:valor, 0) RETURNING_VALUES (VALOR);
        END
        END
       ELSE
       BEGIN
        IF (:porcen <> 0) THEN
          BEGIN
            IF ((conc_monto <> 0) AND (conc_monto IS NOT NULL) ) THEN
            BEGIN
              VALOR = ((:CONC_MONTO/30 * :diaslab ) * :PORCEN) /100;
              EXECUTE PROCEDURE REDONDEE(:valor, 0)RETURNING_VALUES (VALOR);
            END
            ELSE
            BEGIN
              conc_monto = :basico;
              VALOR = ((:CONC_MONTO/30 * :diaslab ) * :PORCEN) /100;
              EXECUTE PROCEDURE REDONDEE(:valor, 0)RETURNING_VALUES (VALOR);
            END
          END
          ELSE
          BEGIN
            IF ((conc_monto <> 0) AND (conc_monto IS NOT NULL) ) THEN
            BEGIN
              VALOR = ((:CONC_MONTO/30 * :diaslab ) * :conc_porc) /100;
              EXECUTE PROCEDURE REDONDEE(:valor, 0)RETURNING_VALUES (VALOR);
            END
            ELSE
            BEGIN
              conc_monto = :basico;
              VALOR = ((:CONC_MONTO/30 * :diaslab ) * :conc_porc) /100;
              EXECUTE PROCEDURE REDONDEE(:valor, 0)RETURNING_VALUES (VALOR);
            END
          END
       END
      END
    ELSE
    BEGIN
      IF (CONC_PORC = 0 AND :porcen = 0) THEN
      BEGIN
      VALOR = (:montos/30 * :diaslab );
      EXECUTE PROCEDURE REDONDEE(:valor, 0)RETURNING_VALUES (VALOR);
      END
      ELSE
      BEGIN
        IF (:porcen <> 0) THEN
          BEGIN
          VALOR = ((:MONTOS/30 * :diaslab ) * :PORCEN) /100;
          EXECUTE PROCEDURE REDONDEE(:valor, 0)RETURNING_VALUES (VALOR);
          END
          ELSE
          BEGIN
          VALOR = ((:montos/30 * :diaslab ) * :CONC_PORC) /100;
          END
          EXECUTE PROCEDURE REDONDEE(:valor, 0)RETURNING_VALUES (VALOR);
       END
   END
    IF (conc_promedio = 'S') THEN
    BEGIN
    perinicial = :periodo - (:numeroprom) + 1;
    anoprom = CAST (ano AS INTEGER);
    IF (perinicial <= 0) THEN
    BEGIN
    perinicial = 12 + :PERINICIAL;
    anoprom = CAST(ANO AS INTEGER) - 1;
    END
    SELECT SUM (noco_valor) FROM nomina_conceptos n WHERE n.noco_aplicaprom = 'S' AND N.noco_periodo >= :perinicial - 1 AND N.noco_periodo < :periodo AND N.noco_ano >= :anoprom AND N.noco_ano <= :ano AND terc_nit = :nite INTO :valor;
    valor = valor / numeroprom;
    END
    IF (conc_otroconc = 'S') THEN
    BEGIN
    anosum = CAST(ano AS INTEGER);
    anosum = anosum - 1;
    SELECT SUM (noco_valor) FROM nomina_conceptos n WHERE n.noco_ano = CAST(:anosum AS VARCHAR(4)) AND n.conc_cod = :conc_codotroconc INTO :valor;
    END
    IF (((:entidad = '' ) OR (entidad IS NULL)) AND (conc_aporte = 'S')) THEN
    BEGIN
    IF ((conc_cod = 904) OR (conc_cod = 905) OR (conc_cod = 906)) THEN
    BEGIN
    entidad = :nitafp;
    SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
    valor = :basico + :comision;
        IF (conc_cod = 904) THEN
        BEGIN
        SELECT A.paan_afptr FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
        VALOR = ((:VALOR/30 * :diaslab ) * :PORCEN) /100;
        END
        ELSE
        IF ((conc_cod = 905) OR (conc_cod = 906)) THEN
        BEGIN
        SELECT A.paan_afpem FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
        VALOR = ((:VALOR/30 * :diaslab ) * :PORCEN) /100;
        END
    IF (liquidaper = 0) THEN
        INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
        VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
    ELSE
    IF (liquidaper = 1) THEN
    BEGIN
    rmod = mod(:periodo, 2);
    IF (rmod = 0) THEN
        INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
        VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
    END
    ELSE
    IF (liquidaper = 2) THEN
    BEGIN
    rmod = mod(:periodo, 4);
    IF (rmod = 0) THEN
        INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
        VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
    END
    END
    IF ((conc_cod = 907) OR (conc_cod = 914) OR (conc_cod = 915)) THEN
    BEGIN
    entidad = :niteps;
    SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
    valor = :basico + :comision;
        IF (conc_cod = 907) THEN
        BEGIN
        SELECT A.paan_epstr FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
        VALOR = ((:VALOR/30 * :diaslab ) * :PORCEN) /100;
        END
        ELSE
        IF ((conc_cod = 914) OR (conc_cod = 915)) THEN
        BEGIN
        SELECT A.paan_epsem FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
        VALOR = ((:VALOR/30 * :diaslab ) * :PORCEN) /100;
        END
    IF (liquidaper = 0) THEN
        INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
        VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
    ELSE
    IF (liquidaper = 1) THEN
    BEGIN
    rmod = mod(:periodo, 2);
    IF (rmod = 0) THEN
        INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
        VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
    END
    ELSE
    IF (liquidaper = 2) THEN
    BEGIN
    rmod = mod(:periodo, 4);
    IF (rmod = 0) THEN
        INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
        VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
    END
    END
    IF ((conc_cod = 910) OR (conc_cod = 911) OR (conc_cod = 916) OR (conc_cod = 917) OR (conc_cod = 918) OR (conc_cod = 919)) THEN
    BEGIN
    entidad = :nitccf;
    SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
    valor = :basico + :comision;
        IF ((conc_cod = 910) OR (conc_cod = 911) ) THEN
        BEGIN
        SELECT A.paan_ccf FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
        VALOR = ((:VALOR/30 * :diaslab ) * :PORCEN) /100;
        END
        ELSE
        IF ((conc_cod = 916) OR (conc_cod = 917)) THEN
        BEGIN
        SELECT A.paan_icbf FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
        VALOR = ((:VALOR/30 * :diaslab ) * :PORCEN) /100;
        END
        ELSE
        IF ((conc_cod = 918) OR (conc_cod = 919)) THEN
        BEGIN
        SELECT A.paan_sena FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
        VALOR = ((:VALOR/30 * :diaslab ) * :PORCEN) /100;
        END
    IF (liquidaper = 0) THEN
        INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
        VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
    ELSE
    IF (liquidaper = 1) THEN
    BEGIN
    rmod = mod(:periodo, 2);
    IF (rmod = 0) THEN
        INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
        VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
    END
    ELSE
    IF (liquidaper = 2) THEN
    BEGIN
    rmod = mod(:periodo, 4);
    IF (rmod = 0) THEN
        INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
        VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
    END
    END
    IF ((conc_cod = 912) OR (conc_cod = 913)) THEN
    BEGIN
    entidad = :nitafc;
    SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
    valor = :basico + :comision;
        IF ((conc_cod = 912) OR (conc_cod = 913) ) THEN
        BEGIN
        SELECT A.paan_cesemp FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
        VALOR = ((:VALOR/30 * :diaslab ) * :PORCEN) /100;
        END
    IF (liquidaper = 0) THEN
        INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
        VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
    ELSE
    IF (liquidaper = 1) THEN
    BEGIN
    rmod = mod(:periodo, 2);
    IF (rmod = 0) THEN
        INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
        VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
    END
    ELSE
    IF (liquidaper = 2) THEN
    BEGIN
    rmod = mod(:periodo, 4);
    IF (rmod = 0) THEN
        INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
        VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
    END
    END
    END
    ELSE
    BEGIN
    IF (liquidaper = 0) THEN
        INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
        VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);    ELSE
    IF (liquidaper = 1) THEN
    BEGIN
    rmod = mod(:periodo, 2);
    IF (rmod = 0) THEN
        INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
        VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);    END
    ELSE
    IF (liquidaper = 2) THEN
    BEGIN
    rmod = mod(:periodo, 4);
    IF (rmod = 0) THEN
        INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
        VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);    END
   END
item = :item + 1;
END
ELSE
BEGIN
SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :valor;
        INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
        VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
item = :item + 1;
END
END
END
END
ELSE
/*SI ES SEMANAL*/
IF (periodicidad = 3) THEN
BEGIN
EXECUTE PROCEDURE cambie_id_nomina RETURNING_VALUES(:idnomina);
INSERT INTO nomina (nomi_id, NOMI_FECCAUSA, NOMI_PAGOGLOBAL, NOMI_PERIODOCIDAD, NOMI_PERIODO, NOMI_ANO, NOMI_LIQOK)
VALUES (:IDNOMINA, :fec,:pagoglobal, :periodicidad, :periodo, :ano, 'N');
    BEGIN
    item = 1;
    FOR SELECT E.TERC_NIT, E.empl_salario, e.empl_eps, e.empl_afc, e.empl_afp, e.empl_ccf
    FROM EMPLEADOS E
    WHERE E.empl_ppago = 1
    INTO :nite, :basico, :niteps, :nitafc, :nitafp, :nitccf
    DO
    BEGIN
    FOR SELECT CE.TERC_NIT, CE.CONC_COD, CE.EMCO_MONTO, CE.EMCO_PORC, ce.empl_entidad, CE.emco_perprom, CE.emco_luquidaper,    CN.CONC_COD, CN.CONC_DEDUC,CN.CONC_PORC, CN.CONC_ENTIDAD, CN.CONC_MONTO,  CN.CONC_DIAS, CN.CONC_MODIFI,
    CN.CONC_PROMEDIO, CN.conc_salario, CE.emco_perprom, CN.conc_prov, CN.conc_aporte, CN.conc_aplicaprom, cn.conc_otroconc, cn.conc_codotroconc, CN.conc_gtoempr
    FROM empleado_conceptos CE, CONCEPTOS_NOMINA CN WHERE ((CE.terc_nit = :nite) AND (CE.CONC_COD = CN.CONC_COD) AND (CN.conc_fecini <= :fec AND CN.conc_fecfin >= :FEC) ) OR ((CE.terc_nit = :nite)
    AND (CE.CONC_COD = CN.CONC_COD) AND (cn.conc_todosper = 'N') AND (CE.emco_ppago = :periodo)) OR  ((CE.terc_nit = :nite) AND (CE.CONC_COD = CN.CONC_COD) AND cn.conc_todosper = 'S')  ORDER BY (TERC_NIT)
    INTO :nit_tercero, :concept,  :montos, :porcen, :entidad, :numeroprom, :liquidaper ,:CONC_COD, :CONC_DEDUC, :CONC_PORC,
    :CONC_ENTIDAD, :CONC_MONTO, :CONC_DIAS, :CONC_MODIFI,:CONC_PROMEDIO, :salario,:EMCO_PERPROM, :conc_prov, :conc_aporte , :CONC_APLICAPROM, :conc_otroconc, :conc_codotroconc, :gtoempr    DO
    BEGIN
    IF (conc_dias = 'S') THEN
    EXECUTE PROCEDURE DIAS_LABORADOS (:nite, :periodo) RETURNING_VALUES (:diaslab);
    ELSE
    BEGIN
    IF (liquidaper = 0) THEN
    diaslab = 7;
    ELSE
    IF (liquidaper = 1) THEN
    diaslab = 15;
    ELSE
    IF (liquidaper = 2) THEN
    diaslab = 30;
    END
IF (conc_cod <> 920) THEN
BEGIN
    IF ((:montos = 0) OR (:montos IS NULL)) THEN
      BEGIN
      IF ((CONC_PORC = 0 AND :porcen = 0) OR (CONC_PORC IS NULL AND :porcen = 0) OR (CONC_PORC = 0 AND :porcen IS NULL) OR (CONC_PORC IS NULL AND :porcen IS NULL) ) THEN
        BEGIN
        IF ((conc_monto <> 0) AND (conc_monto IS NOT NULL) ) THEN
        BEGIN
        VALOR = :CONC_MONTO/30 * :diaslab;
        EXECUTE PROCEDURE REDONDEE(:valor, 0) RETURNING_VALUES (VALOR);
        END
        ELSE
        BEGIN
        conc_monto = :basico;
        VALOR = (:conc_monto/30 * :diaslab );
        EXECUTE PROCEDURE REDONDEE(:valor, 0) RETURNING_VALUES (VALOR);
        END
        END
       ELSE
       BEGIN
        IF (:porcen <> 0) THEN
          BEGIN
            IF ((conc_monto <> 0) AND (conc_monto IS NOT NULL) ) THEN
            BEGIN
              VALOR = ((:CONC_MONTO/30 * :diaslab ) * :PORCEN) /100;
              EXECUTE PROCEDURE REDONDEE(:valor, 0)RETURNING_VALUES (VALOR);
            END
            ELSE
            BEGIN
              conc_monto = :basico;
              VALOR = ((:CONC_MONTO/30 * :diaslab ) * :PORCEN) /100;
              EXECUTE PROCEDURE REDONDEE(:valor, 0)RETURNING_VALUES (VALOR);
            END
          END
          ELSE
          BEGIN
            IF ((conc_monto <> 0) AND (conc_monto IS NOT NULL) ) THEN
            BEGIN
              VALOR = ((:CONC_MONTO/30 * :diaslab ) * :conc_porc) /100;
              EXECUTE PROCEDURE REDONDEE(:valor, 0)RETURNING_VALUES (VALOR);
            END
            ELSE
            BEGIN
              conc_monto = :basico;
              VALOR = ((:CONC_MONTO/30 * :diaslab ) * :conc_porc) /100;
              EXECUTE PROCEDURE REDONDEE(:valor, 0)RETURNING_VALUES (VALOR);
            END
          END
       END
      END
    ELSE
    BEGIN
      IF (CONC_PORC = 0 AND :porcen = 0) THEN
      BEGIN
      VALOR = (:montos/30 * :diaslab );
      EXECUTE PROCEDURE REDONDEE(:valor, 0)RETURNING_VALUES (VALOR);
      END
      ELSE
      BEGIN
        IF (:porcen <> 0) THEN
          BEGIN
          VALOR = ((:MONTOS/30 * :diaslab ) * :PORCEN) /100;
          EXECUTE PROCEDURE REDONDEE(:valor, 0)RETURNING_VALUES (VALOR);
          END
          ELSE
          BEGIN
          VALOR = ((:montos/30 * :diaslab ) * :CONC_PORC) /100;
          END
          EXECUTE PROCEDURE REDONDEE(:valor, 0)RETURNING_VALUES (VALOR);
       END
   END
    IF (conc_promedio = 'S') THEN
    BEGIN
    perinicial = :periodo - (:numeroprom) + 1;
    anoprom = CAST (ano AS INTEGER);
    IF (perinicial <= 0) THEN
    BEGIN
    perinicial = 54 + :PERINICIAL;
    anoprom = CAST(ANO AS INTEGER) - 1;
    END
    SELECT SUM (noco_valor) FROM nomina_conceptos n WHERE n.noco_aplicaprom = 'S' AND N.noco_periodo >= :perinicial - 1 AND N.noco_periodo < :periodo AND N.noco_ano >= :anoprom AND N.noco_ano <= :ano AND terc_nit = :nite INTO :valor;
    valor = valor / numeroprom;
    END
    IF (conc_otroconc = 'S') THEN
    BEGIN
    anosum = CAST(ano AS INTEGER);
    anosum = anosum - 1;
    SELECT SUM (noco_valor) FROM nomina_conceptos n WHERE n.noco_ano = :anosum AND n.conc_cod = :conc_codotroconc INTO :valor;
    END
    IF (((:entidad = '' ) OR (entidad IS NULL)) AND (conc_aporte = 'S')) THEN
    BEGIN
    IF ((conc_cod = 904) OR (conc_cod = 905) OR (conc_cod = 906)) THEN
    BEGIN
    entidad = :nitafp;
    SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
    valor = :basico + :comision;
        IF (conc_cod = 904) THEN
        BEGIN
        SELECT A.paan_afptr FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
        VALOR = ((:VALOR/30 * :diaslab ) * :PORCEN) /100;
        END
        ELSE
        IF ((conc_cod = 905) OR (conc_cod = 906)) THEN
        BEGIN
        SELECT A.paan_afpem FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
        VALOR = ((:VALOR/30 * :diaslab ) * :PORCEN) /100;
        END
    IF (liquidaper = 0) THEN
        INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
        VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
    ELSE
    IF (liquidaper = 1) THEN
    BEGIN
    rmod = mod(:periodo, 2);
    IF (rmod = 0) THEN
        INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
        VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
    END
    ELSE
    IF (liquidaper = 2) THEN
    BEGIN
    rmod = mod(:periodo, 4);
    IF (rmod = 0) THEN
        INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
        VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
    END
    END
    IF ((conc_cod = 907) OR (conc_cod = 914) OR (conc_cod = 915)) THEN
    BEGIN
    entidad = :niteps;
    SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
    valor = :basico + :comision;
        IF (conc_cod = 907) THEN
        BEGIN
        SELECT A.paan_epstr FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
        VALOR = ((:VALOR/30 * :diaslab ) * :PORCEN) /100;
        END
        ELSE
        IF ((conc_cod = 914) OR (conc_cod = 915)) THEN
        BEGIN
        SELECT A.paan_epsem FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
        VALOR = ((:VALOR/30 * :diaslab ) * :PORCEN) /100;
        END
    IF (liquidaper = 0) THEN
        INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
        VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
    ELSE
    IF (liquidaper = 1) THEN
    BEGIN
    rmod = mod(:periodo, 2);
    IF (rmod = 0) THEN
        INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
        VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
    END
    ELSE
    IF (liquidaper = 2) THEN
    BEGIN
    rmod = mod(:periodo, 4);
    IF (rmod = 0) THEN
        INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
        VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
    END
    END
    IF ((conc_cod = 910) OR (conc_cod = 911) OR (conc_cod = 916) OR (conc_cod = 917) OR (conc_cod = 918) OR (conc_cod = 919)) THEN
    BEGIN
    entidad = :nitccf;
    SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
    valor = :basico + :comision;
        IF ((conc_cod = 910) OR (conc_cod = 911) ) THEN
        BEGIN
        SELECT A.paan_ccf FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
        VALOR = ((:VALOR/30 * :diaslab ) * :PORCEN) /100;
        END
        ELSE
        IF ((conc_cod = 916) OR (conc_cod = 917)) THEN
        BEGIN
        SELECT A.paan_icbf FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
        VALOR = ((:VALOR/30 * :diaslab ) * :PORCEN) /100;
        END
        ELSE
        IF ((conc_cod = 918) OR (conc_cod = 919)) THEN
        BEGIN
        SELECT A.paan_sena FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
        VALOR = ((:VALOR/30 * :diaslab ) * :PORCEN) /100;
        END
    IF (liquidaper = 0) THEN
        INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
        VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
    ELSE
    IF (liquidaper = 1) THEN
    BEGIN
    rmod = mod(:periodo, 2);
    IF (rmod = 0) THEN
        INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
        VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
    END
    ELSE
    IF (liquidaper = 2) THEN
    BEGIN
    rmod = mod(:periodo, 4);
    IF (rmod = 0) THEN
        INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
        VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
    END
    END
    IF ((conc_cod = 912) OR (conc_cod = 913)) THEN
    BEGIN
    entidad = :nitafc;
    SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
    valor = :basico + :comision;
        IF ((conc_cod = 912) OR (conc_cod = 913) ) THEN
        BEGIN
        SELECT A.paan_cesemp FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
        VALOR = ((:VALOR/30 * :diaslab ) * :PORCEN) /100;
        END
    IF (liquidaper = 0) THEN
        INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
        VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
    ELSE
    IF (liquidaper = 1) THEN
    BEGIN
    rmod = mod(:periodo, 2);
    IF (rmod = 0) THEN
        INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
        VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
    END
    ELSE
    IF (liquidaper = 2) THEN
    BEGIN
    rmod = mod(:periodo, 4);
    IF (rmod = 0) THEN
        INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
        VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
    END
    END
    END
    ELSE
    BEGIN
    IF (liquidaper = 0) THEN
        INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
        VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);    ELSE
    IF (liquidaper = 1) THEN
    BEGIN
    rmod = mod(:periodo, 2);
    IF (rmod = 0) THEN
        INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
        VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);    END
    ELSE
    IF (liquidaper = 2) THEN
    BEGIN
    rmod = mod(:periodo, 4);
    IF (rmod = 0) THEN
        INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
        VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);    END
   END
item = :item + 1;
END
ELSE
BEGIN
SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :valor;
        INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
        VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
item = :item + 1;
END
END
END
END
END
SUSPEND;
END
^



INSERT INTO PARENTESCO (PARE_COD, PARE_NOM, PARE_CODIGO) VALUES ('H', 'HIJO', 1);
^
INSERT INTO PARENTESCO (PARE_COD, PARE_NOM, PARE_CODIGO) VALUES ('P', 'PADRE', 2);
^
INSERT INTO PARENTESCO (PARE_COD, PARE_NOM, PARE_CODIGO) VALUES ('M', 'MADRE', 3);
^
INSERT INTO PARENTESCO (PARE_COD, PARE_NOM, PARE_CODIGO) VALUES ('E', 'HERMANO', 4);
^
INSERT INTO PARENTESCO (PARE_COD, PARE_NOM, PARE_CODIGO) VALUES ('S', 'SOBRINO', 5);
^
INSERT INTO PARENTESCO (PARE_COD, PARE_NOM, PARE_CODIGO) VALUES ('T', 'TIO', 6);
^
INSERT INTO PARENTESCO (PARE_COD, PARE_NOM, PARE_CODIGO) VALUES ('A', 'ABUELA', 7);
^
INSERT INTO PARENTESCO (PARE_COD, PARE_NOM, PARE_CODIGO) VALUES ('O', 'ABUELO', 8);
^

SET TERM ; ^


/******************************************************************************/
/****                              Privileges                              ****/
/******************************************************************************/


/* Privileges of procedures */
GRANT SELECT ON CONCEPTOS_NOMINA TO PROCEDURE CAUSA_NOMINA;
GRANT SELECT ON EMPLEADOS TO PROCEDURE CAUSA_NOMINA;
GRANT SELECT ON EMPLEADO_CONCEPTOS TO PROCEDURE CAUSA_NOMINA;
GRANT INSERT ON NOMINA TO PROCEDURE CAUSA_NOMINA;
GRANT INSERT ON NOMINA_CONCEPTOS TO PROCEDURE CAUSA_NOMINA;
GRANT EXECUTE ON PROCEDURE CAMBIE_ID_NOMINA TO PROCEDURE CAUSA_NOMINA;
GRANT EXECUTE ON PROCEDURE DIAS_LABORADOS TO PROCEDURE CAUSA_NOMINA;
GRANT EXECUTE ON PROCEDURE REDONDEE TO PROCEDURE CAUSA_NOMINA;



UPDATE PARAMETROS_ANO
SET PAAN_SALMINIMO = 461500,
    PAAN_AUXTR = 55000,
    PAAN_SENA = NULL,
    PAAN_ICBF = NULL,
    PAAN_CCF = NULL,
    PAAN_EPSTR = 4,
    PAAN_EPSEM = 8.5,
    PAAN_EPSFON = 12.5,
    PAAN_AFPTR = 3.875,
    PAAN_AFPEM = 11.625,
    PAAN_AFPFON = 15.5,
    PAAN_AFPSMF = NULL,
    PAAN_INTMORA = NULL,
    PAAN_ARP = NULL,
    PAAN_PEQAPOR = NULL,
    PAAN_HORASDI = 1.25,
    PAAN_HORASNO = 1.75,
    PAAN_HORASFD = 2.25,
    PAAN_HORASFN = 2.75,
    PAAN_TIPOAPORT = 'B',
    PAAN_CESEMP = 8.3333
WHERE (PAAN_ANO = '2008');

DELETE FROM conceptos_nomina;

INSERT INTO CONCEPTOS_NOMINA (CONC_COD, CONC_NOMBRE, CONC_DEDUC, CONC_FECINI, CONC_FECFIN, CONC_PORC, CONC_BASE, CONC_ENTIDAD, CONC_MONTO, CONC_CTAGAST, CONC_DIAS, CONC_MODIFI, CONC_DIAPAGO, CONC_PROMEDIO, CONC_TODOSPER, CONC_PROV, CONC_PERACTUAL, CONC_APORTE, CONC_APLICAPROM, CONC_PERPROMEDIO, CONC_OTROCONC, CONC_CODOTROCONC, CONC_SALARIO, CONC_CTACXP, CONC_NOMCORTO, CONC_PERIODOS, CONC_GTOEMPR) VALUES (1, 'SUELDO', 'N', '1-JAN-2008', '31-DEC-2008', 0, NULL, NULL, NULL, '520506', 'S', 'S', NULL, 'N', 'S', 'N', 'N', 'N', 'S', NULL, 'N', 0, 'S', '2505', 'SUELDO', NULL, 'N');
INSERT INTO CONCEPTOS_NOMINA (CONC_COD, CONC_NOMBRE, CONC_DEDUC, CONC_FECINI, CONC_FECFIN, CONC_PORC, CONC_BASE, CONC_ENTIDAD, CONC_MONTO, CONC_CTAGAST, CONC_DIAS, CONC_MODIFI, CONC_DIAPAGO, CONC_PROMEDIO, CONC_TODOSPER, CONC_PROV, CONC_PERACTUAL, CONC_APORTE, CONC_APLICAPROM, CONC_PERPROMEDIO, CONC_OTROCONC, CONC_CODOTROCONC, CONC_SALARIO, CONC_CTACXP, CONC_NOMCORTO, CONC_PERIODOS, CONC_GTOEMPR) VALUES (2, 'AUXILIO DE TRANSPORTE', 'N', '1-JAN-2008', '31-DEC-2008', 0, NULL, NULL, 55000, '520527', 'S', 'S', NULL, 'N', 'S', 'N', 'N', 'N', 'N', NULL, 'N', 0, 'N', '2505', 'AUX TRANS.', NULL, 'N');
INSERT INTO CONCEPTOS_NOMINA (CONC_COD, CONC_NOMBRE, CONC_DEDUC, CONC_FECINI, CONC_FECFIN, CONC_PORC, CONC_BASE, CONC_ENTIDAD, CONC_MONTO, CONC_CTAGAST, CONC_DIAS, CONC_MODIFI, CONC_DIAPAGO, CONC_PROMEDIO, CONC_TODOSPER, CONC_PROV, CONC_PERACTUAL, CONC_APORTE, CONC_APLICAPROM, CONC_PERPROMEDIO, CONC_OTROCONC, CONC_CODOTROCONC, CONC_SALARIO, CONC_CTACXP, CONC_NOMCORTO, CONC_PERIODOS, CONC_GTOEMPR) VALUES (3, 'INT. DE CESANTIAS ADMIN', 'N', '1-JAN-2008', '31-JAN-2008', 8.3333, NULL, NULL, NULL, '510533', 'N', 'S', NULL, 'N', 'S', 'S', 'N', 'N', 'N', NULL, 'N', 0, 'N', '261005', 'INT. CESAN', NULL, 'N');
INSERT INTO CONCEPTOS_NOMINA (CONC_COD, CONC_NOMBRE, CONC_DEDUC, CONC_FECINI, CONC_FECFIN, CONC_PORC, CONC_BASE, CONC_ENTIDAD, CONC_MONTO, CONC_CTAGAST, CONC_DIAS, CONC_MODIFI, CONC_DIAPAGO, CONC_PROMEDIO, CONC_TODOSPER, CONC_PROV, CONC_PERACTUAL, CONC_APORTE, CONC_APLICAPROM, CONC_PERPROMEDIO, CONC_OTROCONC, CONC_CODOTROCONC, CONC_SALARIO, CONC_CTACXP, CONC_NOMCORTO, CONC_PERIODOS, CONC_GTOEMPR) VALUES (4, 'SALARIO INTEGRAL 70%', 'N', '1-JAN-2008', '31-DEC-2008', 0, NULL, NULL, NULL, '510503', 'S', 'S', NULL, 'N', 'S', 'N', 'N', 'N', 'N', NULL, 'N', 0, 'N', '2505', 'INTEGRAL', NULL, 'N');
INSERT INTO CONCEPTOS_NOMINA (CONC_COD, CONC_NOMBRE, CONC_DEDUC, CONC_FECINI, CONC_FECFIN, CONC_PORC, CONC_BASE, CONC_ENTIDAD, CONC_MONTO, CONC_CTAGAST, CONC_DIAS, CONC_MODIFI, CONC_DIAPAGO, CONC_PROMEDIO, CONC_TODOSPER, CONC_PROV, CONC_PERACTUAL, CONC_APORTE, CONC_APLICAPROM, CONC_PERPROMEDIO, CONC_OTROCONC, CONC_CODOTROCONC, CONC_SALARIO, CONC_CTACXP, CONC_NOMCORTO, CONC_PERIODOS, CONC_GTOEMPR) VALUES (5, 'PAGO INTERESES DE CESANTIAS', 'N', '1-JAN-2008', '31-JAN-2008', 8.3333, NULL, NULL, NULL, '520506', 'N', 'S', NULL, 'N', 'N', 'N', 'N', 'N', 'N', NULL, 'S', 6, 'N', '2515', 'PAGO INT.', NULL, 'N');
INSERT INTO CONCEPTOS_NOMINA (CONC_COD, CONC_NOMBRE, CONC_DEDUC, CONC_FECINI, CONC_FECFIN, CONC_PORC, CONC_BASE, CONC_ENTIDAD, CONC_MONTO, CONC_CTAGAST, CONC_DIAS, CONC_MODIFI, CONC_DIAPAGO, CONC_PROMEDIO, CONC_TODOSPER, CONC_PROV, CONC_PERACTUAL, CONC_APORTE, CONC_APLICAPROM, CONC_PERPROMEDIO, CONC_OTROCONC, CONC_CODOTROCONC, CONC_SALARIO, CONC_CTACXP, CONC_NOMCORTO, CONC_PERIODOS, CONC_GTOEMPR) VALUES (6, 'RETENCION EN LA FUENTE', 'S', '1-JAN-2008', '31-DEC-2008', 0, NULL, NULL, NULL, NULL, 'N', 'S', NULL, 'N', 'S', 'N', 'N', 'N', 'N', NULL, 'N', 0, 'N', NULL, 'RETENCIÓN', NULL, 'N');
INSERT INTO CONCEPTOS_NOMINA (CONC_COD, CONC_NOMBRE, CONC_DEDUC, CONC_FECINI, CONC_FECFIN, CONC_PORC, CONC_BASE, CONC_ENTIDAD, CONC_MONTO, CONC_CTAGAST, CONC_DIAS, CONC_MODIFI, CONC_DIAPAGO, CONC_PROMEDIO, CONC_TODOSPER, CONC_PROV, CONC_PERACTUAL, CONC_APORTE, CONC_APLICAPROM, CONC_PERPROMEDIO, CONC_OTROCONC, CONC_CODOTROCONC, CONC_SALARIO, CONC_CTACXP, CONC_NOMCORTO, CONC_PERIODOS, CONC_GTOEMPR) VALUES (7, 'INDEMNIZACION', 'N', '1-JAN-2008', '31-DEC-2008', 0, NULL, NULL, NULL, '510560', 'N', 'S', NULL, 'N', 'N', 'N', 'N', 'N', 'N', NULL, 'N', 0, 'N', '2540', 'INDEMNIZA', NULL, 'N');
INSERT INTO CONCEPTOS_NOMINA (CONC_COD, CONC_NOMBRE, CONC_DEDUC, CONC_FECINI, CONC_FECFIN, CONC_PORC, CONC_BASE, CONC_ENTIDAD, CONC_MONTO, CONC_CTAGAST, CONC_DIAS, CONC_MODIFI, CONC_DIAPAGO, CONC_PROMEDIO, CONC_TODOSPER, CONC_PROV, CONC_PERACTUAL, CONC_APORTE, CONC_APLICAPROM, CONC_PERPROMEDIO, CONC_OTROCONC, CONC_CODOTROCONC, CONC_SALARIO, CONC_CTACXP, CONC_NOMCORTO, CONC_PERIODOS, CONC_GTOEMPR) VALUES (8, 'APORTE PENSIÓN VOLUNTARIA EMPLEADOR', 'N', '1-JAN-2008', '31-DEC-2008', 0, NULL, NULL, NULL, NULL, 'N', 'S', NULL, 'N', 'S', 'N', 'N', 'S', 'N', NULL, 'N', 0, 'N', NULL, 'AFP VOL EMPR.', NULL, 'N');
INSERT INTO CONCEPTOS_NOMINA (CONC_COD, CONC_NOMBRE, CONC_DEDUC, CONC_FECINI, CONC_FECFIN, CONC_PORC, CONC_BASE, CONC_ENTIDAD, CONC_MONTO, CONC_CTAGAST, CONC_DIAS, CONC_MODIFI, CONC_DIAPAGO, CONC_PROMEDIO, CONC_TODOSPER, CONC_PROV, CONC_PERACTUAL, CONC_APORTE, CONC_APLICAPROM, CONC_PERPROMEDIO, CONC_OTROCONC, CONC_CODOTROCONC, CONC_SALARIO, CONC_CTACXP, CONC_NOMCORTO, CONC_PERIODOS, CONC_GTOEMPR) VALUES (9, 'CUOTA MEDICINA PREPAGADA', 'S', '1-JAN-2008', '31-DEC-2008', 0, NULL, NULL, NULL, '2505', 'N', 'S', NULL, 'N', 'N', 'N', 'N', 'N', 'N', NULL, 'N', 0, 'N', '510569', 'MED. PREP', NULL, 'N');
INSERT INTO CONCEPTOS_NOMINA (CONC_COD, CONC_NOMBRE, CONC_DEDUC, CONC_FECINI, CONC_FECFIN, CONC_PORC, CONC_BASE, CONC_ENTIDAD, CONC_MONTO, CONC_CTAGAST, CONC_DIAS, CONC_MODIFI, CONC_DIAPAGO, CONC_PROMEDIO, CONC_TODOSPER, CONC_PROV, CONC_PERACTUAL, CONC_APORTE, CONC_APLICAPROM, CONC_PERPROMEDIO, CONC_OTROCONC, CONC_CODOTROCONC, CONC_SALARIO, CONC_CTACXP, CONC_NOMCORTO, CONC_PERIODOS, CONC_GTOEMPR) VALUES (10, 'BONIFICACIÓN', 'N', '1-JAN-2008', '31-DEC-2008', 0, NULL, NULL, NULL, NULL, 'N', 'S', NULL, 'N', 'N', 'N', 'N', 'N', 'N', NULL, 'N', 0, 'N', NULL, 'BONIFI.', NULL, 'N');
INSERT INTO CONCEPTOS_NOMINA (CONC_COD, CONC_NOMBRE, CONC_DEDUC, CONC_FECINI, CONC_FECFIN, CONC_PORC, CONC_BASE, CONC_ENTIDAD, CONC_MONTO, CONC_CTAGAST, CONC_DIAS, CONC_MODIFI, CONC_DIAPAGO, CONC_PROMEDIO, CONC_TODOSPER, CONC_PROV, CONC_PERACTUAL, CONC_APORTE, CONC_APLICAPROM, CONC_PERPROMEDIO, CONC_OTROCONC, CONC_CODOTROCONC, CONC_SALARIO, CONC_CTACXP, CONC_NOMCORTO, CONC_PERIODOS, CONC_GTOEMPR) VALUES (11, 'RETROACTIVO', 'N', '1-JAN-2008', '31-DEC-2008', 0, NULL, NULL, NULL, NULL, 'N', 'S', NULL, 'N', 'N', 'N', 'N', 'N', 'N', NULL, 'N', 0, 'N', NULL, 'RETROAC.', NULL, 'N');
INSERT INTO CONCEPTOS_NOMINA (CONC_COD, CONC_NOMBRE, CONC_DEDUC, CONC_FECINI, CONC_FECFIN, CONC_PORC, CONC_BASE, CONC_ENTIDAD, CONC_MONTO, CONC_CTAGAST, CONC_DIAS, CONC_MODIFI, CONC_DIAPAGO, CONC_PROMEDIO, CONC_TODOSPER, CONC_PROV, CONC_PERACTUAL, CONC_APORTE, CONC_APLICAPROM, CONC_PERPROMEDIO, CONC_OTROCONC, CONC_CODOTROCONC, CONC_SALARIO, CONC_CTACXP, CONC_NOMCORTO, CONC_PERIODOS, CONC_GTOEMPR) VALUES (12, 'APORTE PENSIÓN VOLUNTARIA EMPLEADO', 'S', '1-JAN-2008', '31-DEC-2008', 0, NULL, NULL, NULL, '2505', 'N', 'S', NULL, 'N', 'S', 'N', 'N', 'N', 'N', NULL, 'N', 0, 'N', '510570', 'AFP VOL TRAB.', NULL, 'N');
INSERT INTO CONCEPTOS_NOMINA (CONC_COD, CONC_NOMBRE, CONC_DEDUC, CONC_FECINI, CONC_FECFIN, CONC_PORC, CONC_BASE, CONC_ENTIDAD, CONC_MONTO, CONC_CTAGAST, CONC_DIAS, CONC_MODIFI, CONC_DIAPAGO, CONC_PROMEDIO, CONC_TODOSPER, CONC_PROV, CONC_PERACTUAL, CONC_APORTE, CONC_APLICAPROM, CONC_PERPROMEDIO, CONC_OTROCONC, CONC_CODOTROCONC, CONC_SALARIO, CONC_CTACXP, CONC_NOMCORTO, CONC_PERIODOS, CONC_GTOEMPR) VALUES (13, 'AJUSTE PRIMA', 'N', '1-JAN-2008', '31-DEC-2008', 0, NULL, NULL, NULL, '261020', 'N', 'S', NULL, 'S', 'N', 'N', 'N', 'N', 'N', NULL, 'N', 0, 'N', '261020', 'AJUS. PRIMA', NULL, 'N');
INSERT INTO CONCEPTOS_NOMINA (CONC_COD, CONC_NOMBRE, CONC_DEDUC, CONC_FECINI, CONC_FECFIN, CONC_PORC, CONC_BASE, CONC_ENTIDAD, CONC_MONTO, CONC_CTAGAST, CONC_DIAS, CONC_MODIFI, CONC_DIAPAGO, CONC_PROMEDIO, CONC_TODOSPER, CONC_PROV, CONC_PERACTUAL, CONC_APORTE, CONC_APLICAPROM, CONC_PERPROMEDIO, CONC_OTROCONC, CONC_CODOTROCONC, CONC_SALARIO, CONC_CTACXP, CONC_NOMCORTO, CONC_PERIODOS, CONC_GTOEMPR) VALUES (14, 'VACACIONES ADMIN', 'N', '1-JAN-2008', '31-DEC-2008', 8.3333, NULL, NULL, NULL, '510539', 'N', 'S', NULL, 'N', 'S', 'S', 'N', 'N', 'N', NULL, 'N', 0, 'N', '261015', 'VACACIONES', NULL, 'N');
INSERT INTO CONCEPTOS_NOMINA (CONC_COD, CONC_NOMBRE, CONC_DEDUC, CONC_FECINI, CONC_FECFIN, CONC_PORC, CONC_BASE, CONC_ENTIDAD, CONC_MONTO, CONC_CTAGAST, CONC_DIAS, CONC_MODIFI, CONC_DIAPAGO, CONC_PROMEDIO, CONC_TODOSPER, CONC_PROV, CONC_PERACTUAL, CONC_APORTE, CONC_APLICAPROM, CONC_PERPROMEDIO, CONC_OTROCONC, CONC_CODOTROCONC, CONC_SALARIO, CONC_CTACXP, CONC_NOMCORTO, CONC_PERIODOS, CONC_GTOEMPR) VALUES (15, 'PROV. PRIMA JUNIO ADMIN', 'N', '1-JAN-2008', '30-JUN-2008', 8.3333, NULL, NULL, NULL, '510536', 'N', 'S', 30, 'N', 'N', 'S', 'S', 'N', 'N', NULL, 'N', 0, 'N', '261020', 'PRIMA JUN', NULL, 'N');
INSERT INTO CONCEPTOS_NOMINA (CONC_COD, CONC_NOMBRE, CONC_DEDUC, CONC_FECINI, CONC_FECFIN, CONC_PORC, CONC_BASE, CONC_ENTIDAD, CONC_MONTO, CONC_CTAGAST, CONC_DIAS, CONC_MODIFI, CONC_DIAPAGO, CONC_PROMEDIO, CONC_TODOSPER, CONC_PROV, CONC_PERACTUAL, CONC_APORTE, CONC_APLICAPROM, CONC_PERPROMEDIO, CONC_OTROCONC, CONC_CODOTROCONC, CONC_SALARIO, CONC_CTACXP, CONC_NOMCORTO, CONC_PERIODOS, CONC_GTOEMPR) VALUES (16, 'PROV. PRIMA  DICIEMBRE ADMIN', 'N', '1-JUL-2008', '31-DEC-2008', 8.3333, NULL, NULL, NULL, '510536', 'N', 'S', 20, 'N', 'N', 'S', 'S', 'N', 'N', NULL, 'N', 0, 'N', '261020', 'PRIMA DIC', NULL, 'N');
INSERT INTO CONCEPTOS_NOMINA (CONC_COD, CONC_NOMBRE, CONC_DEDUC, CONC_FECINI, CONC_FECFIN, CONC_PORC, CONC_BASE, CONC_ENTIDAD, CONC_MONTO, CONC_CTAGAST, CONC_DIAS, CONC_MODIFI, CONC_DIAPAGO, CONC_PROMEDIO, CONC_TODOSPER, CONC_PROV, CONC_PERACTUAL, CONC_APORTE, CONC_APLICAPROM, CONC_PERPROMEDIO, CONC_OTROCONC, CONC_CODOTROCONC, CONC_SALARIO, CONC_CTACXP, CONC_NOMCORTO, CONC_PERIODOS, CONC_GTOEMPR) VALUES (17, 'PAGO PRIMA JUNIO', 'N', '1-JAN-2008', '1-JAN-2008', NULL, NULL, NULL, NULL, '261020', 'N', 'S', 30, 'S', 'N', 'N', 'S', 'N', 'N', NULL, 'N', 0, 'N', '261020', 'PRIMA JUN', NULL, 'N');
INSERT INTO CONCEPTOS_NOMINA (CONC_COD, CONC_NOMBRE, CONC_DEDUC, CONC_FECINI, CONC_FECFIN, CONC_PORC, CONC_BASE, CONC_ENTIDAD, CONC_MONTO, CONC_CTAGAST, CONC_DIAS, CONC_MODIFI, CONC_DIAPAGO, CONC_PROMEDIO, CONC_TODOSPER, CONC_PROV, CONC_PERACTUAL, CONC_APORTE, CONC_APLICAPROM, CONC_PERPROMEDIO, CONC_OTROCONC, CONC_CODOTROCONC, CONC_SALARIO, CONC_CTACXP, CONC_NOMCORTO, CONC_PERIODOS, CONC_GTOEMPR) VALUES (18, 'PAGO PRIMA DICIEMBRE', 'N', '1-JAN-2008', '1-JAN-2008', NULL, NULL, NULL, NULL, '261020', 'N', 'S', 20, 'S', 'N', 'N', 'S', 'N', 'N', NULL, 'N', 0, 'N', '261020', 'PRIMA DIC', NULL, 'N');
INSERT INTO CONCEPTOS_NOMINA (CONC_COD, CONC_NOMBRE, CONC_DEDUC, CONC_FECINI, CONC_FECFIN, CONC_PORC, CONC_BASE, CONC_ENTIDAD, CONC_MONTO, CONC_CTAGAST, CONC_DIAS, CONC_MODIFI, CONC_DIAPAGO, CONC_PROMEDIO, CONC_TODOSPER, CONC_PROV, CONC_PERACTUAL, CONC_APORTE, CONC_APLICAPROM, CONC_PERPROMEDIO, CONC_OTROCONC, CONC_CODOTROCONC, CONC_SALARIO, CONC_CTACXP, CONC_NOMCORTO, CONC_PERIODOS, CONC_GTOEMPR) VALUES (19, 'INT. DE CESANTIAS VENTAS', 'N', '1-JAN-2008', '31-JAN-2008', 8.3333, NULL, NULL, NULL, '520533', 'N', 'S', NULL, 'N', 'S', 'S', 'N', 'N', 'N', NULL, 'N', 0, 'N', '261005', 'INT. CESAN.', NULL, 'N');
INSERT INTO CONCEPTOS_NOMINA (CONC_COD, CONC_NOMBRE, CONC_DEDUC, CONC_FECINI, CONC_FECFIN, CONC_PORC, CONC_BASE, CONC_ENTIDAD, CONC_MONTO, CONC_CTAGAST, CONC_DIAS, CONC_MODIFI, CONC_DIAPAGO, CONC_PROMEDIO, CONC_TODOSPER, CONC_PROV, CONC_PERACTUAL, CONC_APORTE, CONC_APLICAPROM, CONC_PERPROMEDIO, CONC_OTROCONC, CONC_CODOTROCONC, CONC_SALARIO, CONC_CTACXP, CONC_NOMCORTO, CONC_PERIODOS, CONC_GTOEMPR) VALUES (20, 'VACACIONES VENTAS', 'N', '1-JAN-2008', '31-DEC-2008', 8.3333, NULL, NULL, NULL, '520539', 'N', 'S', NULL, 'N', 'S', 'S', 'N', 'N', 'N', NULL, 'N', 0, 'N', '261015', 'VACACIONES', NULL, 'N');
INSERT INTO CONCEPTOS_NOMINA (CONC_COD, CONC_NOMBRE, CONC_DEDUC, CONC_FECINI, CONC_FECFIN, CONC_PORC, CONC_BASE, CONC_ENTIDAD, CONC_MONTO, CONC_CTAGAST, CONC_DIAS, CONC_MODIFI, CONC_DIAPAGO, CONC_PROMEDIO, CONC_TODOSPER, CONC_PROV, CONC_PERACTUAL, CONC_APORTE, CONC_APLICAPROM, CONC_PERPROMEDIO, CONC_OTROCONC, CONC_CODOTROCONC, CONC_SALARIO, CONC_CTACXP, CONC_NOMCORTO, CONC_PERIODOS, CONC_GTOEMPR) VALUES (21, 'PROV. PRIMA JUNIO VENTAS', 'N', '1-JAN-2008', '30-JUN-2008', 8.3333, NULL, NULL, NULL, '520536', 'N', 'S', 30, 'N', 'N', 'S', 'S', 'N', 'N', NULL, 'N', 0, 'N', '261020', 'PRIMA JUN', NULL, 'N');
INSERT INTO CONCEPTOS_NOMINA (CONC_COD, CONC_NOMBRE, CONC_DEDUC, CONC_FECINI, CONC_FECFIN, CONC_PORC, CONC_BASE, CONC_ENTIDAD, CONC_MONTO, CONC_CTAGAST, CONC_DIAS, CONC_MODIFI, CONC_DIAPAGO, CONC_PROMEDIO, CONC_TODOSPER, CONC_PROV, CONC_PERACTUAL, CONC_APORTE, CONC_APLICAPROM, CONC_PERPROMEDIO, CONC_OTROCONC, CONC_CODOTROCONC, CONC_SALARIO, CONC_CTACXP, CONC_NOMCORTO, CONC_PERIODOS, CONC_GTOEMPR) VALUES (22, 'PROV. PRIMA  DICIEMBRE VENTAS', 'N', '1-JUL-2008', '31-DEC-2008', 8.3333, NULL, NULL, NULL, '520536', 'N', 'S', 20, 'N', 'N', 'S', 'S', 'N', 'N', NULL, 'N', 0, 'N', '261020', 'PRIM DIC', NULL, 'N');
INSERT INTO CONCEPTOS_NOMINA (CONC_COD, CONC_NOMBRE, CONC_DEDUC, CONC_FECINI, CONC_FECFIN, CONC_PORC, CONC_BASE, CONC_ENTIDAD, CONC_MONTO, CONC_CTAGAST, CONC_DIAS, CONC_MODIFI, CONC_DIAPAGO, CONC_PROMEDIO, CONC_TODOSPER, CONC_PROV, CONC_PERACTUAL, CONC_APORTE, CONC_APLICAPROM, CONC_PERPROMEDIO, CONC_OTROCONC, CONC_CODOTROCONC, CONC_SALARIO, CONC_CTACXP, CONC_NOMCORTO, CONC_PERIODOS, CONC_GTOEMPR) VALUES (24, 'CUOTA MEDICINA PREPAGADA', 'N', '1-JAN-2008', '31-DEC-2008', 0, NULL, NULL, NULL, '2505', 'N', 'S', NULL, 'N', 'N', 'N', 'N', 'S', 'N', NULL, 'N', 0, 'N', '510569', 'MED PREP.', NULL, 'N');
INSERT INTO CONCEPTOS_NOMINA (CONC_COD, CONC_NOMBRE, CONC_DEDUC, CONC_FECINI, CONC_FECFIN, CONC_PORC, CONC_BASE, CONC_ENTIDAD, CONC_MONTO, CONC_CTAGAST, CONC_DIAS, CONC_MODIFI, CONC_DIAPAGO, CONC_PROMEDIO, CONC_TODOSPER, CONC_PROV, CONC_PERACTUAL, CONC_APORTE, CONC_APLICAPROM, CONC_PERPROMEDIO, CONC_OTROCONC, CONC_CODOTROCONC, CONC_SALARIO, CONC_CTACXP, CONC_NOMCORTO, CONC_PERIODOS, CONC_GTOEMPR) VALUES (900, 'HORAS EXTRA', 'N', '1-JAN-2008', '31-DEC-2007', NULL, NULL, NULL, NULL, '520515', 'N', 'N', NULL, 'N', 'S', 'N', 'S', 'N', 'S', NULL, 'N', 0, 'S', '2505', 'HORAS EXT.', NULL, 'N');
INSERT INTO CONCEPTOS_NOMINA (CONC_COD, CONC_NOMBRE, CONC_DEDUC, CONC_FECINI, CONC_FECFIN, CONC_PORC, CONC_BASE, CONC_ENTIDAD, CONC_MONTO, CONC_CTAGAST, CONC_DIAS, CONC_MODIFI, CONC_DIAPAGO, CONC_PROMEDIO, CONC_TODOSPER, CONC_PROV, CONC_PERACTUAL, CONC_APORTE, CONC_APLICAPROM, CONC_PERPROMEDIO, CONC_OTROCONC, CONC_CODOTROCONC, CONC_SALARIO, CONC_CTACXP, CONC_NOMCORTO, CONC_PERIODOS, CONC_GTOEMPR) VALUES (904, 'AFP EMPLEADO', 'S', '1-JAN-2008', '31-DEC-2008', NULL, NULL, NULL, NULL, '2505', 'N', 'S', 1, 'N', 'S', 'N', 'N', 'S', 'N', NULL, 'N', 0, 'N', '510570', 'AFP TRAB.', NULL, 'N');
INSERT INTO CONCEPTOS_NOMINA (CONC_COD, CONC_NOMBRE, CONC_DEDUC, CONC_FECINI, CONC_FECFIN, CONC_PORC, CONC_BASE, CONC_ENTIDAD, CONC_MONTO, CONC_CTAGAST, CONC_DIAS, CONC_MODIFI, CONC_DIAPAGO, CONC_PROMEDIO, CONC_TODOSPER, CONC_PROV, CONC_PERACTUAL, CONC_APORTE, CONC_APLICAPROM, CONC_PERPROMEDIO, CONC_OTROCONC, CONC_CODOTROCONC, CONC_SALARIO, CONC_CTACXP, CONC_NOMCORTO, CONC_PERIODOS, CONC_GTOEMPR) VALUES (905, 'AFP EMPLEADOR ADMIN', 'N', '1-JAN-2008', '31-DEC-2008', NULL, NULL, NULL, NULL, '510570', 'N', 'S', NULL, 'N', 'S', 'N', 'N', 'S', 'N', NULL, 'N', 0, 'N', '238030', 'AFP EMPRESA', NULL, 'S');
INSERT INTO CONCEPTOS_NOMINA (CONC_COD, CONC_NOMBRE, CONC_DEDUC, CONC_FECINI, CONC_FECFIN, CONC_PORC, CONC_BASE, CONC_ENTIDAD, CONC_MONTO, CONC_CTAGAST, CONC_DIAS, CONC_MODIFI, CONC_DIAPAGO, CONC_PROMEDIO, CONC_TODOSPER, CONC_PROV, CONC_PERACTUAL, CONC_APORTE, CONC_APLICAPROM, CONC_PERPROMEDIO, CONC_OTROCONC, CONC_CODOTROCONC, CONC_SALARIO, CONC_CTACXP, CONC_NOMCORTO, CONC_PERIODOS, CONC_GTOEMPR) VALUES (906, 'AFP EMPLEADOR VENTAS', 'N', '1-JAN-2008', '31-DEC-2008', NULL, NULL, NULL, NULL, '520570', 'N', 'S', NULL, 'N', 'S', 'N', 'N', 'S', 'N', NULL, 'N', 0, 'N', '238030', 'AFP EMPRESA', NULL, 'S');
INSERT INTO CONCEPTOS_NOMINA (CONC_COD, CONC_NOMBRE, CONC_DEDUC, CONC_FECINI, CONC_FECFIN, CONC_PORC, CONC_BASE, CONC_ENTIDAD, CONC_MONTO, CONC_CTAGAST, CONC_DIAS, CONC_MODIFI, CONC_DIAPAGO, CONC_PROMEDIO, CONC_TODOSPER, CONC_PROV, CONC_PERACTUAL, CONC_APORTE, CONC_APLICAPROM, CONC_PERPROMEDIO, CONC_OTROCONC, CONC_CODOTROCONC, CONC_SALARIO, CONC_CTACXP, CONC_NOMCORTO, CONC_PERIODOS, CONC_GTOEMPR) VALUES (907, 'EPS TRABAJADOR', 'S', '1-JAN-2008', '31-DEC-2008', NULL, NULL, NULL, NULL, '2505', 'N', 'S', 1, 'N', 'S', 'N', 'N', 'S', 'N', NULL, 'N', 0, 'N', '237005', 'EPS TRAB.', NULL, 'N');
INSERT INTO CONCEPTOS_NOMINA (CONC_COD, CONC_NOMBRE, CONC_DEDUC, CONC_FECINI, CONC_FECFIN, CONC_PORC, CONC_BASE, CONC_ENTIDAD, CONC_MONTO, CONC_CTAGAST, CONC_DIAS, CONC_MODIFI, CONC_DIAPAGO, CONC_PROMEDIO, CONC_TODOSPER, CONC_PROV, CONC_PERACTUAL, CONC_APORTE, CONC_APLICAPROM, CONC_PERPROMEDIO, CONC_OTROCONC, CONC_CODOTROCONC, CONC_SALARIO, CONC_CTACXP, CONC_NOMCORTO, CONC_PERIODOS, CONC_GTOEMPR) VALUES (908, 'ARP ADMINISTRATIVO', 'N', '1-JAN-2008', '31-DEC-2008', 0, NULL, NULL, NULL, '510568', 'S', 'S', NULL, 'N', 'S', 'N', 'N', 'S', 'N', NULL, 'N', 0, 'N', '237006', 'ARP', NULL, 'S');
INSERT INTO CONCEPTOS_NOMINA (CONC_COD, CONC_NOMBRE, CONC_DEDUC, CONC_FECINI, CONC_FECFIN, CONC_PORC, CONC_BASE, CONC_ENTIDAD, CONC_MONTO, CONC_CTAGAST, CONC_DIAS, CONC_MODIFI, CONC_DIAPAGO, CONC_PROMEDIO, CONC_TODOSPER, CONC_PROV, CONC_PERACTUAL, CONC_APORTE, CONC_APLICAPROM, CONC_PERPROMEDIO, CONC_OTROCONC, CONC_CODOTROCONC, CONC_SALARIO, CONC_CTACXP, CONC_NOMCORTO, CONC_PERIODOS, CONC_GTOEMPR) VALUES (909, 'ARP VENTAS', 'N', '1-JAN-2008', '31-DEC-2008', 0, NULL, NULL, NULL, '520568', 'S', 'S', NULL, 'N', 'S', 'N', 'N', 'S', 'N', NULL, 'N', 0, 'N', '237006', 'ARP', NULL, 'S');
INSERT INTO CONCEPTOS_NOMINA (CONC_COD, CONC_NOMBRE, CONC_DEDUC, CONC_FECINI, CONC_FECFIN, CONC_PORC, CONC_BASE, CONC_ENTIDAD, CONC_MONTO, CONC_CTAGAST, CONC_DIAS, CONC_MODIFI, CONC_DIAPAGO, CONC_PROMEDIO, CONC_TODOSPER, CONC_PROV, CONC_PERACTUAL, CONC_APORTE, CONC_APLICAPROM, CONC_PERPROMEDIO, CONC_OTROCONC, CONC_CODOTROCONC, CONC_SALARIO, CONC_CTACXP, CONC_NOMCORTO, CONC_PERIODOS, CONC_GTOEMPR) VALUES (910, 'CCF ADMINISTRATIVO', 'N', '1-JAN-2008', '31-DEC-2008', NULL, NULL, NULL, NULL, '510572', 'N', 'S', NULL, 'N', 'S', 'N', 'N', 'S', 'N', NULL, 'N', 0, 'N', '237010', 'CCF', NULL, 'S');
INSERT INTO CONCEPTOS_NOMINA (CONC_COD, CONC_NOMBRE, CONC_DEDUC, CONC_FECINI, CONC_FECFIN, CONC_PORC, CONC_BASE, CONC_ENTIDAD, CONC_MONTO, CONC_CTAGAST, CONC_DIAS, CONC_MODIFI, CONC_DIAPAGO, CONC_PROMEDIO, CONC_TODOSPER, CONC_PROV, CONC_PERACTUAL, CONC_APORTE, CONC_APLICAPROM, CONC_PERPROMEDIO, CONC_OTROCONC, CONC_CODOTROCONC, CONC_SALARIO, CONC_CTACXP, CONC_NOMCORTO, CONC_PERIODOS, CONC_GTOEMPR) VALUES (911, 'CCF VENTAS', 'N', '1-JAN-2008', '31-DEC-2008', NULL, NULL, NULL, NULL, '520572', 'N', 'S', NULL, 'N', 'S', 'N', 'N', 'S', 'N', NULL, 'N', 0, 'N', '237010', 'CCF', NULL, 'S');
INSERT INTO CONCEPTOS_NOMINA (CONC_COD, CONC_NOMBRE, CONC_DEDUC, CONC_FECINI, CONC_FECFIN, CONC_PORC, CONC_BASE, CONC_ENTIDAD, CONC_MONTO, CONC_CTAGAST, CONC_DIAS, CONC_MODIFI, CONC_DIAPAGO, CONC_PROMEDIO, CONC_TODOSPER, CONC_PROV, CONC_PERACTUAL, CONC_APORTE, CONC_APLICAPROM, CONC_PERPROMEDIO, CONC_OTROCONC, CONC_CODOTROCONC, CONC_SALARIO, CONC_CTACXP, CONC_NOMCORTO, CONC_PERIODOS, CONC_GTOEMPR) VALUES (912, 'CESANTIAS ADMIN', 'N', '1-JAN-2008', '31-DEC-2008', NULL, NULL, NULL, NULL, '510530', 'N', 'S', NULL, 'N', 'S', 'S', 'N', 'S', 'N', NULL, 'N', 0, 'N', '261005', 'CESANTIAS', NULL, 'S');
INSERT INTO CONCEPTOS_NOMINA (CONC_COD, CONC_NOMBRE, CONC_DEDUC, CONC_FECINI, CONC_FECFIN, CONC_PORC, CONC_BASE, CONC_ENTIDAD, CONC_MONTO, CONC_CTAGAST, CONC_DIAS, CONC_MODIFI, CONC_DIAPAGO, CONC_PROMEDIO, CONC_TODOSPER, CONC_PROV, CONC_PERACTUAL, CONC_APORTE, CONC_APLICAPROM, CONC_PERPROMEDIO, CONC_OTROCONC, CONC_CODOTROCONC, CONC_SALARIO, CONC_CTACXP, CONC_NOMCORTO, CONC_PERIODOS, CONC_GTOEMPR) VALUES (913, 'CESANTIAS VENTAS', 'N', '1-JAN-2008', '31-DEC-2008', NULL, NULL, NULL, NULL, '520530', 'N', 'S', NULL, 'N', 'S', 'S', 'N', 'S', 'N', NULL, 'N', 0, 'N', '261005', 'CESANTIAS', NULL, 'S');
INSERT INTO CONCEPTOS_NOMINA (CONC_COD, CONC_NOMBRE, CONC_DEDUC, CONC_FECINI, CONC_FECFIN, CONC_PORC, CONC_BASE, CONC_ENTIDAD, CONC_MONTO, CONC_CTAGAST, CONC_DIAS, CONC_MODIFI, CONC_DIAPAGO, CONC_PROMEDIO, CONC_TODOSPER, CONC_PROV, CONC_PERACTUAL, CONC_APORTE, CONC_APLICAPROM, CONC_PERPROMEDIO, CONC_OTROCONC, CONC_CODOTROCONC, CONC_SALARIO, CONC_CTACXP, CONC_NOMCORTO, CONC_PERIODOS, CONC_GTOEMPR) VALUES (914, 'EPS EMPLEADOR ADMIN', 'N', '1-JAN-2008', '31-DEC-2008', NULL, NULL, NULL, NULL, '510569', 'N', 'S', NULL, 'N', 'S', 'N', 'N', 'S', 'N', NULL, 'N', 0, 'N', '238030', 'EPS EMPRESA', NULL, 'S');
INSERT INTO CONCEPTOS_NOMINA (CONC_COD, CONC_NOMBRE, CONC_DEDUC, CONC_FECINI, CONC_FECFIN, CONC_PORC, CONC_BASE, CONC_ENTIDAD, CONC_MONTO, CONC_CTAGAST, CONC_DIAS, CONC_MODIFI, CONC_DIAPAGO, CONC_PROMEDIO, CONC_TODOSPER, CONC_PROV, CONC_PERACTUAL, CONC_APORTE, CONC_APLICAPROM, CONC_PERPROMEDIO, CONC_OTROCONC, CONC_CODOTROCONC, CONC_SALARIO, CONC_CTACXP, CONC_NOMCORTO, CONC_PERIODOS, CONC_GTOEMPR) VALUES (915, 'EPS EMPLEADOR VENTAS', 'N', '1-JAN-2008', '31-DEC-2008', NULL, NULL, NULL, NULL, '520569', 'N', 'S', NULL, 'N', 'S', 'N', 'N', 'S', 'N', NULL, 'N', 0, 'N', '238030', 'EPS EMPRESA', NULL, 'S');
INSERT INTO CONCEPTOS_NOMINA (CONC_COD, CONC_NOMBRE, CONC_DEDUC, CONC_FECINI, CONC_FECFIN, CONC_PORC, CONC_BASE, CONC_ENTIDAD, CONC_MONTO, CONC_CTAGAST, CONC_DIAS, CONC_MODIFI, CONC_DIAPAGO, CONC_PROMEDIO, CONC_TODOSPER, CONC_PROV, CONC_PERACTUAL, CONC_APORTE, CONC_APLICAPROM, CONC_PERPROMEDIO, CONC_OTROCONC, CONC_CODOTROCONC, CONC_SALARIO, CONC_CTACXP, CONC_NOMCORTO, CONC_PERIODOS, CONC_GTOEMPR) VALUES (916, 'ICBF ADMINISTRATIVO', 'N', '1-JAN-2008', '31-DEC-2008', NULL, NULL, NULL, NULL, '510575', 'N', 'S', NULL, 'N', 'S', 'N', 'N', 'S', 'N', NULL, 'N', 0, 'N', '237010', 'ICBF', NULL, 'S');
INSERT INTO CONCEPTOS_NOMINA (CONC_COD, CONC_NOMBRE, CONC_DEDUC, CONC_FECINI, CONC_FECFIN, CONC_PORC, CONC_BASE, CONC_ENTIDAD, CONC_MONTO, CONC_CTAGAST, CONC_DIAS, CONC_MODIFI, CONC_DIAPAGO, CONC_PROMEDIO, CONC_TODOSPER, CONC_PROV, CONC_PERACTUAL, CONC_APORTE, CONC_APLICAPROM, CONC_PERPROMEDIO, CONC_OTROCONC, CONC_CODOTROCONC, CONC_SALARIO, CONC_CTACXP, CONC_NOMCORTO, CONC_PERIODOS, CONC_GTOEMPR) VALUES (917, 'ICBF VENTAS', 'N', '1-JAN-2008', '31-DEC-2008', NULL, NULL, NULL, NULL, '520575', 'N', 'S', NULL, 'N', 'S', 'N', 'N', 'S', 'N', NULL, 'N', 0, 'N', '237010', 'ICBF', NULL, 'S');
INSERT INTO CONCEPTOS_NOMINA (CONC_COD, CONC_NOMBRE, CONC_DEDUC, CONC_FECINI, CONC_FECFIN, CONC_PORC, CONC_BASE, CONC_ENTIDAD, CONC_MONTO, CONC_CTAGAST, CONC_DIAS, CONC_MODIFI, CONC_DIAPAGO, CONC_PROMEDIO, CONC_TODOSPER, CONC_PROV, CONC_PERACTUAL, CONC_APORTE, CONC_APLICAPROM, CONC_PERPROMEDIO, CONC_OTROCONC, CONC_CODOTROCONC, CONC_SALARIO, CONC_CTACXP, CONC_NOMCORTO, CONC_PERIODOS, CONC_GTOEMPR) VALUES (918, 'SENA ADMINISTRATIVO', 'N', '1-JAN-2008', '31-DEC-2008', NULL, NULL, NULL, NULL, '510578', 'N', 'S', NULL, 'N', 'S', 'N', 'N', 'S', 'N', NULL, 'N', 0, 'N', '237010', 'SENA', NULL, 'S');
INSERT INTO CONCEPTOS_NOMINA (CONC_COD, CONC_NOMBRE, CONC_DEDUC, CONC_FECINI, CONC_FECFIN, CONC_PORC, CONC_BASE, CONC_ENTIDAD, CONC_MONTO, CONC_CTAGAST, CONC_DIAS, CONC_MODIFI, CONC_DIAPAGO, CONC_PROMEDIO, CONC_TODOSPER, CONC_PROV, CONC_PERACTUAL, CONC_APORTE, CONC_APLICAPROM, CONC_PERPROMEDIO, CONC_OTROCONC, CONC_CODOTROCONC, CONC_SALARIO, CONC_CTACXP, CONC_NOMCORTO, CONC_PERIODOS, CONC_GTOEMPR) VALUES (919, 'SENA VENTAS', 'N', '1-JAN-2008', '31-DEC-2008', NULL, NULL, NULL, NULL, '520578', 'N', 'S', NULL, 'N', 'S', 'N', 'N', 'S', 'N', NULL, 'N', 0, 'N', '237010', 'SENA', NULL, 'S');
INSERT INTO CONCEPTOS_NOMINA (CONC_COD, CONC_NOMBRE, CONC_DEDUC, CONC_FECINI, CONC_FECFIN, CONC_PORC, CONC_BASE, CONC_ENTIDAD, CONC_MONTO, CONC_CTAGAST, CONC_DIAS, CONC_MODIFI, CONC_DIAPAGO, CONC_PROMEDIO, CONC_TODOSPER, CONC_PROV, CONC_PERACTUAL, CONC_APORTE, CONC_APLICAPROM, CONC_PERPROMEDIO, CONC_OTROCONC, CONC_CODOTROCONC, CONC_SALARIO, CONC_CTACXP, CONC_NOMCORTO, CONC_PERIODOS, CONC_GTOEMPR) VALUES (920, 'COMISIONES', 'N', '1-JAN-2008', '31-DEC-2008', 0, NULL, NULL, NULL, '520518', 'N', 'S', NULL, 'N', 'N', 'N', 'N', 'N', 'S', NULL, 'N', 0, 'S', '2505', 'COMISION', NULL, 'N');

SET TERM ^ ;

ALTER PROCEDURE CAUSA_NOMINA(
    FEC DATE,
    PERIODO INTEGER,
    PERIODICIDAD INTEGER,
    PAGOGLOBAL CHAR(1),
    ANO CHAR(4))
RETURNS (
    IDNOMINA INTEGER)
AS
DECLARE VARIABLE item INTEGER;
DECLARE VARIABLE nite VARCHAR(20) CHARACTER SET none;
DECLARE VARIABLE nit_tercero VARCHAR(20);
DECLARE VARIABLE concept INTEGER;
DECLARE VARIABLE montos NUMERIC(18,2);
DECLARE VARIABLE porcen NUMERIC(9,4);
DECLARE VARIABLE entidad VARCHAR(20);
DECLARE VARIABLE conc_cod INTEGER;
DECLARE VARIABLE conc_deduc CHAR(1);
DECLARE VARIABLE conc_porc NUMERIC(9,4);
DECLARE VARIABLE conc_entidad INTEGER;
DECLARE VARIABLE conc_monto NUMERIC(18,2);
DECLARE VARIABLE conc_modifi CHAR(1);
DECLARE VARIABLE conc_promedio CHAR(1);
DECLARE VARIABLE emco_perprom INTEGER;
DECLARE VARIABLE valor NUMERIC(18,2);
DECLARE VARIABLE diaslab INTEGER;
DECLARE VARIABLE conc_prov CHAR(1);
DECLARE VARIABLE conc_aporte CHAR(1);
DECLARE VARIABLE numeroprom INTEGER;
DECLARE VARIABLE conc_aplicaprom CHAR(1);
DECLARE VARIABLE perinicial INTEGER;
DECLARE VARIABLE anoprom INTEGER;
DECLARE VARIABLE conc_dias CHAR(1);
DECLARE VARIABLE conc_otroconc CHAR(1);
DECLARE VARIABLE conc_codotroconc INTEGER;
DECLARE VARIABLE anosum INTEGER;
DECLARE VARIABLE salario CHAR(1) CHARACTER SET none;
DECLARE VARIABLE liquidaper INTEGER;
DECLARE VARIABLE rmod NUMERIC(2,2);
DECLARE VARIABLE basico NUMERIC(18,2);
DECLARE VARIABLE niteps VARCHAR(20);
DECLARE VARIABLE nitafc VARCHAR(20);
DECLARE VARIABLE nitafp VARCHAR(20);
DECLARE VARIABLE nitccf VARCHAR(20);
DECLARE VARIABLE gtoempr CHAR(1);
DECLARE VARIABLE comision NUMERIC(18,2);
BEGIN
/*SI ES QUINCENAL*/
IF (periodicidad = 2) THEN
BEGIN
EXECUTE PROCEDURE cambie_id_nomina RETURNING_VALUES(:idnomina);
INSERT INTO nomina (nomi_id, NOMI_FECCAUSA, NOMI_PAGOGLOBAL, NOMI_PERIODOCIDAD, NOMI_PERIODO, NOMI_ANO, NOMI_LIQOK)
VALUES (:IDNOMINA, :fec,:pagoglobal, :periodicidad, :periodo, :ano, 'N');
 BEGIN
    item = 1;
    FOR SELECT E.TERC_NIT, E.empl_salario, e.empl_eps, e.empl_afc, e.empl_afp, e.empl_ccf
    FROM EMPLEADOS E
    WHERE E.empl_ppago = 2
    INTO :nite, :basico, :niteps, :nitafc, :nitafp, :nitccf
    DO
    BEGIN
    FOR SELECT CE.TERC_NIT, CE.CONC_COD, CE.EMCO_MONTO, CE.EMCO_PORC, ce.empl_entidad, CE.emco_perprom, CE.emco_luquidaper,    CN.CONC_COD, CN.CONC_DEDUC,CN.CONC_PORC, CN.CONC_ENTIDAD, CN.CONC_MONTO,  CN.CONC_DIAS, CN.CONC_MODIFI,
    CN.CONC_PROMEDIO, CN.conc_salario, CE.emco_perprom, CN.conc_prov, CN.conc_aporte, CN.conc_aplicaprom, cn.conc_otroconc, cn.conc_codotroconc, CN.conc_gtoempr
    FROM empleado_conceptos CE, CONCEPTOS_NOMINA CN WHERE ((CE.terc_nit = :nite) AND (CE.CONC_COD = CN.CONC_COD) AND (CN.conc_fecini <= :fec AND CN.conc_fecfin >= :FEC) ) OR ((CE.terc_nit = :nite)
    AND (CE.CONC_COD = CN.CONC_COD) AND (cn.conc_todosper = 'N') AND (CE.emco_ppago = :periodo)) OR  ((CE.terc_nit = :nite) AND (CE.CONC_COD = CN.CONC_COD) AND cn.conc_todosper = 'S')  ORDER BY (TERC_NIT)
    INTO :nit_tercero, :concept,  :montos, :porcen, :entidad, :numeroprom, :liquidaper ,:CONC_COD, :CONC_DEDUC, :CONC_PORC,
    :CONC_ENTIDAD, :CONC_MONTO, :CONC_DIAS, :CONC_MODIFI,:CONC_PROMEDIO, :salario,:EMCO_PERPROM, :conc_prov, :conc_aporte , :CONC_APLICAPROM, :conc_otroconc, :conc_codotroconc, :gtoempr
    DO
    BEGIN
    IF (conc_dias = 'S') THEN
    EXECUTE PROCEDURE DIAS_LABORADOS (:nite, :periodo) RETURNING_VALUES (:diaslab);
    ELSE
    BEGIN
    IF (liquidaper = 0) THEN
    diaslab = 15;
    ELSE
    IF (liquidaper = 1) THEN
    diaslab = 30;
    ELSE
    IF (liquidaper = 2) THEN
    diaslab = 60;
    END
IF (conc_cod <> 920) THEN
BEGIN
    IF (conc_aporte = 'N') THEN
    BEGIN
    IF ((:montos = 0) OR (:montos IS NULL)) THEN
      BEGIN
      IF ((CONC_PORC = 0 AND :porcen = 0) OR (CONC_PORC IS NULL AND :porcen = 0) OR (CONC_PORC = 0 AND :porcen IS NULL) OR (CONC_PORC IS NULL AND :porcen IS NULL) ) THEN
        BEGIN
        IF ((conc_monto <> 0) AND (conc_monto IS NOT NULL) ) THEN
        BEGIN
        VALOR = :CONC_MONTO/30 * :diaslab;
        EXECUTE PROCEDURE REDONDEE(:valor, 0) RETURNING_VALUES (VALOR);
        END
        ELSE
        IF (:salario = 'S') THEN
        BEGIN
        conc_monto = :basico;
        VALOR = (:conc_monto/30 * :diaslab );
        EXECUTE PROCEDURE REDONDEE(:valor, 0) RETURNING_VALUES (VALOR);
        END
        ELSE
        valor = montos;
        END
       ELSE
       BEGIN
        IF (:porcen <> 0) THEN
          BEGIN
            IF ((conc_monto <> 0) AND (conc_monto IS NOT NULL) ) THEN
            BEGIN
              VALOR = ((:CONC_MONTO/30 * :diaslab ) * :PORCEN) /100;
              EXECUTE PROCEDURE REDONDEE(:valor, 0)RETURNING_VALUES (VALOR);
            END
            ELSE
            IF (:salario = 'S') THEN
            BEGIN
              conc_monto = :basico;
              VALOR = ((:CONC_MONTO/30 * :diaslab ) * :PORCEN) /100;
              EXECUTE PROCEDURE REDONDEE(:valor, 0)RETURNING_VALUES (VALOR);
            END
          END
          ELSE
          BEGIN
            IF ((conc_monto <> 0) AND (conc_monto IS NOT NULL) ) THEN
            BEGIN
              VALOR = ((:CONC_MONTO/30 * :diaslab ) * :conc_porc) /100;
              EXECUTE PROCEDURE REDONDEE(:valor, 0)RETURNING_VALUES (VALOR);
            END
            ELSE
            IF (:salario = 'S') THEN
            BEGIN
              conc_monto = :basico;
              VALOR = ((:CONC_MONTO/30 * :diaslab ) * :conc_porc) /100;
              EXECUTE PROCEDURE REDONDEE(:valor, 0)RETURNING_VALUES (VALOR);
            END
          END
       END
      END
    ELSE
    BEGIN
      IF (CONC_PORC = 0 AND :porcen = 0) THEN
      BEGIN
      VALOR = (:montos/30 * :diaslab );
      EXECUTE PROCEDURE REDONDEE(:valor, 0)RETURNING_VALUES (VALOR);
      END
      ELSE
      BEGIN
        IF (:porcen <> 0) THEN
          BEGIN
          VALOR = ((:MONTOS/30 * :diaslab ) * :PORCEN) /100;
          EXECUTE PROCEDURE REDONDEE(:valor, 0)RETURNING_VALUES (VALOR);
          END
          ELSE
          BEGIN
          VALOR = ((:montos/30 * :diaslab ) * :CONC_PORC) /100;
          END
          EXECUTE PROCEDURE REDONDEE(:valor, 0)RETURNING_VALUES (VALOR);
       END
   END
    IF (conc_promedio = 'S') THEN
    BEGIN
    perinicial = :periodo - (:numeroprom) + 1;
    anoprom = CAST (ano AS INTEGER);
    IF (perinicial <= 0) THEN
    BEGIN
    perinicial = 24 + :PERINICIAL;
    anoprom = CAST(ANO AS INTEGER) - 1;
    END
    SELECT SUM (noco_valor) FROM nomina_conceptos n WHERE n.noco_aplicaprom = 'S' AND N.noco_periodo >= :perinicial - 1 AND N.noco_periodo < :periodo AND N.noco_ano >= :anoprom AND N.noco_ano <= :ano AND terc_nit = :nite INTO :valor;
    valor = valor / numeroprom;
    EXECUTE PROCEDURE REDONDEE(:valor, 0)RETURNING_VALUES (VALOR);
    END
    IF (conc_otroconc = 'S') THEN
    BEGIN
    anosum = CAST(ano AS INTEGER);
    anosum = anosum - 1;
    SELECT SUM (noco_valor) FROM nomina_conceptos n WHERE n.noco_ano = :anosum AND n.conc_cod = :conc_codotroconc INTO :valor;
    END
    IF (liquidaper = 0) THEN
    INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
    VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
    ELSE
    IF (liquidaper = 1) THEN
    BEGIN
    rmod = mod(:periodo, 2);
    IF (rmod = 0) THEN
        INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
        VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
    END
    ELSE
    IF (liquidaper = 2) THEN
    BEGIN
    rmod = mod(:periodo, 4);
    IF (rmod = 0) THEN
        INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
        VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
    END
    END
    ELSE
/*SI EL CONCEPTO ES UN APORTE*/
    IF (conc_aporte = 'S') THEN
    BEGIN
    IF ((:entidad = '' ) OR (entidad IS NULL)) THEN
    BEGIN
    IF ((conc_cod = 904) OR (conc_cod = 905) OR (conc_cod = 906)) THEN
            BEGIN
            entidad = :nitafp;
            SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
            IF (comision IS NULL) THEN
            comision = 0;
                IF (conc_cod = 904) THEN
                BEGIN
                SELECT A.paan_afptr FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = (((:basico + :comision)/30 * :diaslab ) * :PORCEN) /100;
                EXECUTE PROCEDURE REDONDEE(:valor, 0)RETURNING_VALUES (VALOR);
                END
                ELSE
                IF ((conc_cod = 905) OR (conc_cod = 906)) THEN
                BEGIN
                SELECT A.paan_afpem FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = (((:basico + :comision)/30 * :diaslab ) * :PORCEN) /100;
                EXECUTE PROCEDURE REDONDEE(:valor, 0)RETURNING_VALUES (VALOR);
                END
            IF (liquidaper = 0) THEN
                INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
                VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
            ELSE
            IF (liquidaper = 1) THEN
            BEGIN
            rmod = mod(:periodo, 2);
            IF (rmod = 0) THEN
                INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
                VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
            END
            ELSE
            IF (liquidaper = 2) THEN
            BEGIN
            rmod = mod(:periodo, 4);
            IF (rmod = 0) THEN
                INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
                VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
            END
            END
       IF ((conc_cod = 907) OR (conc_cod = 914) OR (conc_cod = 915)) THEN
            BEGIN
            entidad = :niteps;
            SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
            IF (comision IS NULL) THEN
            comision = 0;
                IF (conc_cod = 907) THEN
                BEGIN
                SELECT A.paan_epstr FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = (((:basico + :comision)/30 * :diaslab) * :PORCEN) /100;
                EXECUTE PROCEDURE REDONDEE(:valor, 0)RETURNING_VALUES (VALOR);
                END
                ELSE
                IF ((conc_cod = 914) OR (conc_cod = 915)) THEN
                BEGIN
                SELECT A.paan_epsem FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = (((:basico + :comision)/30 * :diaslab ) * :PORCEN) /100;
                EXECUTE PROCEDURE REDONDEE(:valor, 0)RETURNING_VALUES (VALOR);
                END
            IF (liquidaper = 0) THEN
                INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
                VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
            ELSE
            IF (liquidaper = 1) THEN
            BEGIN
            rmod = mod(:periodo, 2);
            IF (rmod = 0) THEN
                INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
                VALUES (:IDNOMINA, :item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
            END
            ELSE
            IF (liquidaper = 2) THEN
            BEGIN
            rmod = mod(:periodo, 4);
            IF (rmod = 0) THEN
                INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
                VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
            END
            END
       IF ((conc_cod = 910) OR (conc_cod = 911) OR (conc_cod = 916) OR (conc_cod = 917) OR (conc_cod = 918) OR (conc_cod = 919)) THEN
            BEGIN
            entidad = :nitccf;
            SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
            IF (comision IS NULL) THEN
            comision = 0;
                IF ((conc_cod = 910) OR (conc_cod = 911) ) THEN
                BEGIN
                SELECT A.paan_ccf FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = (((:basico + :comision)/30 * :diaslab ) * :PORCEN) /100;
                EXECUTE PROCEDURE REDONDEE(:valor, 0)RETURNING_VALUES (VALOR);
                END
                ELSE
                IF ((conc_cod = 916) OR (conc_cod = 917)) THEN
                BEGIN
                SELECT A.paan_icbf FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = (((:basico + :comision)/30 * :diaslab ) * :PORCEN) /100;
                EXECUTE PROCEDURE REDONDEE(:valor, 0)RETURNING_VALUES (VALOR);
                END
                ELSE
                IF ((conc_cod = 918) OR (conc_cod = 919)) THEN
                BEGIN
                SELECT A.paan_sena FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = (((:basico + :comision)/30 * :diaslab ) * :PORCEN) /100;
                EXECUTE PROCEDURE REDONDEE(:valor, 0)RETURNING_VALUES (VALOR);
                END
            IF (liquidaper = 0) THEN
                INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
                VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
            ELSE
            IF (liquidaper = 1) THEN
            BEGIN
            rmod = mod(:periodo, 2);
            IF (rmod = 0) THEN
                INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
                VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
            END
            ELSE
            IF (liquidaper = 2) THEN
            BEGIN
            rmod = mod(:periodo, 4);
            IF (rmod = 0) THEN
                INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
                VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
            END
            END
        IF ((conc_cod = 912) OR (conc_cod = 913)) THEN
            BEGIN
            entidad = :nitafc;
            SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
            IF (comision IS NULL) THEN
            comision = 0;
                IF ((conc_cod = 912) OR (conc_cod = 913) ) THEN
                BEGIN
                SELECT A.paan_cesemp FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = (((:basico + :comision)/30 * :diaslab ) * :PORCEN) /100;
                EXECUTE PROCEDURE REDONDEE(:valor, 0)RETURNING_VALUES (VALOR);
                END
            IF (liquidaper = 0) THEN
                INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
                VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
            ELSE
            IF (liquidaper = 1) THEN
            BEGIN
            rmod = mod(:periodo, 2);
            IF (rmod = 0) THEN
                INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
                VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
            END
            ELSE
            IF (liquidaper = 2) THEN
            BEGIN
            rmod = mod(:periodo, 4);
            IF (rmod = 0) THEN
                INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
                VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
            END
            END
    END
    END
item = :item + 1;
END
ELSE
BEGIN
SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :valor;
        INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
        VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
item = :item + 1;
END
END
END
END
END
ELSE
/*SI ES MENSUAL*/
IF (periodicidad = 1) THEN
BEGIN
EXECUTE PROCEDURE cambie_id_nomina RETURNING_VALUES(:idnomina);
INSERT INTO nomina (nomi_id, NOMI_FECCAUSA, NOMI_PAGOGLOBAL, NOMI_PERIODOCIDAD, NOMI_PERIODO, NOMI_ANO, NOMI_LIQOK)
VALUES (:IDNOMINA, :fec,:pagoglobal, :periodicidad, :periodo, :ano, 'N');
    BEGIN
    item = 1;
    FOR SELECT E.TERC_NIT, E.empl_salario, e.empl_eps, e.empl_afc, e.empl_afp, e.empl_ccf
    FROM EMPLEADOS E
    WHERE E.empl_ppago = 1
    INTO :nite, :basico, :niteps, :nitafc, :nitafp, :nitccf
    DO
    FOR SELECT CE.TERC_NIT, CE.CONC_COD, CE.EMCO_MONTO, CE.EMCO_PORC, ce.empl_entidad, CE.emco_perprom, CE.emco_luquidaper,    CN.CONC_COD, CN.CONC_DEDUC,CN.CONC_PORC, CN.CONC_ENTIDAD, CN.CONC_MONTO,  CN.CONC_DIAS, CN.CONC_MODIFI,
    CN.CONC_PROMEDIO, CN.conc_salario, CE.emco_perprom, CN.conc_prov, CN.conc_aporte, CN.conc_aplicaprom, cn.conc_otroconc, cn.conc_codotroconc, CN.conc_gtoempr
    FROM empleado_conceptos CE, CONCEPTOS_NOMINA CN WHERE ((CE.terc_nit = :nite) AND (CE.CONC_COD = CN.CONC_COD) AND (CN.conc_fecini <= :fec AND CN.conc_fecfin >= :FEC) ) OR ((CE.terc_nit = :nite)
    AND (CE.CONC_COD = CN.CONC_COD) AND (cn.conc_todosper = 'N') AND (CE.emco_ppago = :periodo)) OR  ((CE.terc_nit = :nite) AND (CE.CONC_COD = CN.CONC_COD) AND cn.conc_todosper = 'S')  ORDER BY (TERC_NIT)
    INTO :nit_tercero, :concept,  :montos, :porcen, :entidad, :numeroprom, :liquidaper ,:CONC_COD, :CONC_DEDUC, :CONC_PORC,
    :CONC_ENTIDAD, :CONC_MONTO, :CONC_DIAS, :CONC_MODIFI,:CONC_PROMEDIO, :salario,:EMCO_PERPROM, :conc_prov, :conc_aporte , :CONC_APLICAPROM, :conc_otroconc, :conc_codotroconc, :gtoempr    DO
    BEGIN
    IF (conc_dias = 'S') THEN
    EXECUTE PROCEDURE DIAS_LABORADOS (:nite, :periodo) RETURNING_VALUES (:diaslab);
    ELSE
    BEGIN
    IF (liquidaper = 0) THEN
    diaslab = 30;
    ELSE
    IF (liquidaper = 1) THEN
    diaslab = 60;
    ELSE
    IF (liquidaper = 2) THEN
    diaslab = 120;
    END
IF (conc_cod <> 920) THEN
BEGIN
    IF ((:montos = 0) OR (:montos IS NULL)) THEN
      BEGIN
      IF ((CONC_PORC = 0 AND :porcen = 0) OR (CONC_PORC IS NULL AND :porcen = 0) OR (CONC_PORC = 0 AND :porcen IS NULL) OR (CONC_PORC IS NULL AND :porcen IS NULL) ) THEN
        BEGIN
        IF ((conc_monto <> 0) AND (conc_monto IS NOT NULL) ) THEN
        BEGIN
        VALOR = :CONC_MONTO/30 * :diaslab;
        EXECUTE PROCEDURE REDONDEE(:valor, 0) RETURNING_VALUES (VALOR);
        END
        ELSE
        IF (salario = 'S') THEN
        BEGIN
        conc_monto = :basico;
        VALOR = (:conc_monto/30 * :diaslab );
        EXECUTE PROCEDURE REDONDEE(:valor, 0) RETURNING_VALUES (VALOR);
        END
        ELSE
        valor = montos;
        END
       ELSE
       BEGIN
        IF (:porcen <> 0) THEN
          BEGIN
            IF ((conc_monto <> 0) AND (conc_monto IS NOT NULL) ) THEN
            BEGIN
              VALOR = ((:CONC_MONTO/30 * :diaslab ) * :PORCEN) /100;
              EXECUTE PROCEDURE REDONDEE(:valor, 0)RETURNING_VALUES (VALOR);
            END
            ELSE
            IF (salario = 'S') THEN
            BEGIN
              conc_monto = :basico;
              VALOR = ((:CONC_MONTO/30 * :diaslab ) * :PORCEN) /100;
              EXECUTE PROCEDURE REDONDEE(:valor, 0)RETURNING_VALUES (VALOR);
            END
          END
          ELSE
          BEGIN
            IF ((conc_monto <> 0) AND (conc_monto IS NOT NULL) ) THEN
            BEGIN
              VALOR = ((:CONC_MONTO/30 * :diaslab ) * :conc_porc) /100;
              EXECUTE PROCEDURE REDONDEE(:valor, 0)RETURNING_VALUES (VALOR);
            END
            ELSE
            IF (salario = 'S') THEN
            BEGIN
              conc_monto = :basico;
              VALOR = ((:CONC_MONTO/30 * :diaslab ) * :conc_porc) /100;
              EXECUTE PROCEDURE REDONDEE(:valor, 0)RETURNING_VALUES (VALOR);
            END
          END
       END
      END
    ELSE
    BEGIN
      IF (CONC_PORC = 0 AND :porcen = 0) THEN
      BEGIN
      VALOR = (:montos/30 * :diaslab );
      EXECUTE PROCEDURE REDONDEE(:valor, 0)RETURNING_VALUES (VALOR);
      END
      ELSE
      BEGIN
        IF (:porcen <> 0) THEN
          BEGIN
          VALOR = ((:MONTOS/30 * :diaslab ) * :PORCEN) /100;
          EXECUTE PROCEDURE REDONDEE(:valor, 0)RETURNING_VALUES (VALOR);
          END
          ELSE
          BEGIN
          VALOR = ((:montos/30 * :diaslab ) * :CONC_PORC) /100;
          END
          EXECUTE PROCEDURE REDONDEE(:valor, 0)RETURNING_VALUES (VALOR);
       END
   END
    IF (conc_promedio = 'S') THEN
    BEGIN
    perinicial = :periodo - (:numeroprom) + 1;
    anoprom = CAST (ano AS INTEGER);
    IF (perinicial <= 0) THEN
    BEGIN
    perinicial = 12 + :PERINICIAL;
    anoprom = CAST(ANO AS INTEGER) - 1;
    END
    SELECT SUM (noco_valor) FROM nomina_conceptos n WHERE n.noco_aplicaprom = 'S' AND N.noco_periodo >= :perinicial - 1 AND N.noco_periodo < :periodo AND N.noco_ano >= :anoprom AND N.noco_ano <= :ano AND terc_nit = :nite INTO :valor;
    valor = valor / numeroprom;
    END
    IF (conc_otroconc = 'S') THEN
    BEGIN
    anosum = CAST(ano AS INTEGER);
    anosum = anosum - 1;
    SELECT SUM (noco_valor) FROM nomina_conceptos n WHERE n.noco_ano = CAST(:anosum AS VARCHAR(4)) AND n.conc_cod = :conc_codotroconc INTO :valor;
    END
    IF (((:entidad = '' ) OR (entidad IS NULL)) AND (conc_aporte = 'S')) THEN
    BEGIN
    IF ((conc_cod = 904) OR (conc_cod = 905) OR (conc_cod = 906)) THEN
    BEGIN
    entidad = :nitafp;
    SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
    valor = :basico + :comision;
        IF (conc_cod = 904) THEN
        BEGIN
        SELECT A.paan_afptr FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
        VALOR = ((:VALOR/30 * :diaslab ) * :PORCEN) /100;
        END
        ELSE
        IF ((conc_cod = 905) OR (conc_cod = 906)) THEN
        BEGIN
        SELECT A.paan_afpem FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
        VALOR = ((:VALOR/30 * :diaslab ) * :PORCEN) /100;
        END
    IF (liquidaper = 0) THEN
        INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
        VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
    ELSE
    IF (liquidaper = 1) THEN
    BEGIN
    rmod = mod(:periodo, 2);
    IF (rmod = 0) THEN
        INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
        VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
    END
    ELSE
    IF (liquidaper = 2) THEN
    BEGIN
    rmod = mod(:periodo, 4);
    IF (rmod = 0) THEN
        INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
        VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
    END
    END
    IF ((conc_cod = 907) OR (conc_cod = 914) OR (conc_cod = 915)) THEN
    BEGIN
    entidad = :niteps;
    SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
    valor = :basico + :comision;
        IF (conc_cod = 907) THEN
        BEGIN
        SELECT A.paan_epstr FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
        VALOR = ((:VALOR/30 * :diaslab ) * :PORCEN) /100;
        END
        ELSE
        IF ((conc_cod = 914) OR (conc_cod = 915)) THEN
        BEGIN
        SELECT A.paan_epsem FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
        VALOR = ((:VALOR/30 * :diaslab ) * :PORCEN) /100;
        END
    IF (liquidaper = 0) THEN
        INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
        VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
    ELSE
    IF (liquidaper = 1) THEN
    BEGIN
    rmod = mod(:periodo, 2);
    IF (rmod = 0) THEN
        INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
        VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
    END
    ELSE
    IF (liquidaper = 2) THEN
    BEGIN
    rmod = mod(:periodo, 4);
    IF (rmod = 0) THEN
        INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
        VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
    END
    END
    IF ((conc_cod = 910) OR (conc_cod = 911) OR (conc_cod = 916) OR (conc_cod = 917) OR (conc_cod = 918) OR (conc_cod = 919)) THEN
    BEGIN
    entidad = :nitccf;
    SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
    valor = :basico + :comision;
        IF ((conc_cod = 910) OR (conc_cod = 911) ) THEN
        BEGIN
        SELECT A.paan_ccf FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
        VALOR = ((:VALOR/30 * :diaslab ) * :PORCEN) /100;
        END
        ELSE
        IF ((conc_cod = 916) OR (conc_cod = 917)) THEN
        BEGIN
        SELECT A.paan_icbf FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
        VALOR = ((:VALOR/30 * :diaslab ) * :PORCEN) /100;
        END
        ELSE
        IF ((conc_cod = 918) OR (conc_cod = 919)) THEN
        BEGIN
        SELECT A.paan_sena FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
        VALOR = ((:VALOR/30 * :diaslab ) * :PORCEN) /100;
        END
    IF (liquidaper = 0) THEN
        INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
        VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
    ELSE
    IF (liquidaper = 1) THEN
    BEGIN
    rmod = mod(:periodo, 2);
    IF (rmod = 0) THEN
        INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
        VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
    END
    ELSE
    IF (liquidaper = 2) THEN
    BEGIN
    rmod = mod(:periodo, 4);
    IF (rmod = 0) THEN
        INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
        VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
    END
    END
    IF ((conc_cod = 912) OR (conc_cod = 913)) THEN
    BEGIN
    entidad = :nitafc;
    SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
    valor = :basico + :comision;
        IF ((conc_cod = 912) OR (conc_cod = 913) ) THEN
        BEGIN
        SELECT A.paan_cesemp FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
        VALOR = ((:VALOR/30 * :diaslab ) * :PORCEN) /100;
        END
    IF (liquidaper = 0) THEN
        INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
        VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
    ELSE
    IF (liquidaper = 1) THEN
    BEGIN
    rmod = mod(:periodo, 2);
    IF (rmod = 0) THEN
        INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
        VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
    END
    ELSE
    IF (liquidaper = 2) THEN
    BEGIN
    rmod = mod(:periodo, 4);
    IF (rmod = 0) THEN
        INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
        VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
    END
    END
    END
    ELSE
    BEGIN
    IF (liquidaper = 0) THEN
        INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
        VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);    ELSE
    IF (liquidaper = 1) THEN
    BEGIN
    rmod = mod(:periodo, 2);
    IF (rmod = 0) THEN
        INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
        VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);    END
    ELSE
    IF (liquidaper = 2) THEN
    BEGIN
    rmod = mod(:periodo, 4);
    IF (rmod = 0) THEN
        INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
        VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);    END
   END
item = :item + 1;
END
ELSE
BEGIN
SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :valor;
        INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
        VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
item = :item + 1;
END
END
END
END
ELSE
/*SI ES SEMANAL*/
IF (periodicidad = 3) THEN
BEGIN
EXECUTE PROCEDURE cambie_id_nomina RETURNING_VALUES(:idnomina);
INSERT INTO nomina (nomi_id, NOMI_FECCAUSA, NOMI_PAGOGLOBAL, NOMI_PERIODOCIDAD, NOMI_PERIODO, NOMI_ANO, NOMI_LIQOK)
VALUES (:IDNOMINA, :fec,:pagoglobal, :periodicidad, :periodo, :ano, 'N');
    BEGIN
    item = 1;
    FOR SELECT E.TERC_NIT, E.empl_salario, e.empl_eps, e.empl_afc, e.empl_afp, e.empl_ccf
    FROM EMPLEADOS E
    WHERE E.empl_ppago = 1
    INTO :nite, :basico, :niteps, :nitafc, :nitafp, :nitccf
    DO
    BEGIN
    FOR SELECT CE.TERC_NIT, CE.CONC_COD, CE.EMCO_MONTO, CE.EMCO_PORC, ce.empl_entidad, CE.emco_perprom, CE.emco_luquidaper,    CN.CONC_COD, CN.CONC_DEDUC,CN.CONC_PORC, CN.CONC_ENTIDAD, CN.CONC_MONTO,  CN.CONC_DIAS, CN.CONC_MODIFI,
    CN.CONC_PROMEDIO, CN.conc_salario, CE.emco_perprom, CN.conc_prov, CN.conc_aporte, CN.conc_aplicaprom, cn.conc_otroconc, cn.conc_codotroconc, CN.conc_gtoempr
    FROM empleado_conceptos CE, CONCEPTOS_NOMINA CN WHERE ((CE.terc_nit = :nite) AND (CE.CONC_COD = CN.CONC_COD) AND (CN.conc_fecini <= :fec AND CN.conc_fecfin >= :FEC) ) OR ((CE.terc_nit = :nite)
    AND (CE.CONC_COD = CN.CONC_COD) AND (cn.conc_todosper = 'N') AND (CE.emco_ppago = :periodo)) OR  ((CE.terc_nit = :nite) AND (CE.CONC_COD = CN.CONC_COD) AND cn.conc_todosper = 'S')  ORDER BY (TERC_NIT)
    INTO :nit_tercero, :concept,  :montos, :porcen, :entidad, :numeroprom, :liquidaper ,:CONC_COD, :CONC_DEDUC, :CONC_PORC,
    :CONC_ENTIDAD, :CONC_MONTO, :CONC_DIAS, :CONC_MODIFI,:CONC_PROMEDIO, :salario,:EMCO_PERPROM, :conc_prov, :conc_aporte , :CONC_APLICAPROM, :conc_otroconc, :conc_codotroconc, :gtoempr    DO
    BEGIN
    IF (conc_dias = 'S') THEN
    EXECUTE PROCEDURE DIAS_LABORADOS (:nite, :periodo) RETURNING_VALUES (:diaslab);
    ELSE
    BEGIN
    IF (liquidaper = 0) THEN
    diaslab = 7;
    ELSE
    IF (liquidaper = 1) THEN
    diaslab = 15;
    ELSE
    IF (liquidaper = 2) THEN
    diaslab = 30;
    END
IF (conc_cod <> 920) THEN
BEGIN
    IF ((:montos = 0) OR (:montos IS NULL)) THEN
      BEGIN
      IF ((CONC_PORC = 0 AND :porcen = 0) OR (CONC_PORC IS NULL AND :porcen = 0) OR (CONC_PORC = 0 AND :porcen IS NULL) OR (CONC_PORC IS NULL AND :porcen IS NULL) ) THEN
        BEGIN
        IF ((conc_monto <> 0) AND (conc_monto IS NOT NULL) ) THEN
        BEGIN
        VALOR = :CONC_MONTO/30 * :diaslab;
        EXECUTE PROCEDURE REDONDEE(:valor, 0) RETURNING_VALUES (VALOR);
        END
        ELSE
        IF (salario = 'S') THEN
        BEGIN
        conc_monto = :basico;
        VALOR = (:conc_monto/30 * :diaslab );
        EXECUTE PROCEDURE REDONDEE(:valor, 0) RETURNING_VALUES (VALOR);
        END
        ELSE
        valor = montos;
        END
       ELSE
       BEGIN
        IF (:porcen <> 0) THEN
          BEGIN
            IF ((conc_monto <> 0) AND (conc_monto IS NOT NULL) ) THEN
            BEGIN
              VALOR = ((:CONC_MONTO/30 * :diaslab ) * :PORCEN) /100;
              EXECUTE PROCEDURE REDONDEE(:valor, 0)RETURNING_VALUES (VALOR);
            END
            ELSE
            IF (salario = 'S') THEN
            BEGIN
              conc_monto = :basico;
              VALOR = ((:CONC_MONTO/30 * :diaslab ) * :PORCEN) /100;
              EXECUTE PROCEDURE REDONDEE(:valor, 0)RETURNING_VALUES (VALOR);
            END
          END
          ELSE
          BEGIN
            IF ((conc_monto <> 0) AND (conc_monto IS NOT NULL) ) THEN
            BEGIN
              VALOR = ((:CONC_MONTO/30 * :diaslab ) * :conc_porc) /100;
              EXECUTE PROCEDURE REDONDEE(:valor, 0)RETURNING_VALUES (VALOR);
            END
            ELSE
            IF (salario = 'S') THEN
            BEGIN
              conc_monto = :basico;
              VALOR = ((:CONC_MONTO/30 * :diaslab ) * :conc_porc) /100;
              EXECUTE PROCEDURE REDONDEE(:valor, 0)RETURNING_VALUES (VALOR);
            END
          END
       END
      END
    ELSE
    BEGIN
      IF (CONC_PORC = 0 AND :porcen = 0) THEN
      BEGIN
      VALOR = (:montos/30 * :diaslab );
      EXECUTE PROCEDURE REDONDEE(:valor, 0)RETURNING_VALUES (VALOR);
      END
      ELSE
      BEGIN
        IF (:porcen <> 0) THEN
          BEGIN
          VALOR = ((:MONTOS/30 * :diaslab ) * :PORCEN) /100;
          EXECUTE PROCEDURE REDONDEE(:valor, 0)RETURNING_VALUES (VALOR);
          END
          ELSE
          BEGIN
          VALOR = ((:montos/30 * :diaslab ) * :CONC_PORC) /100;
          END
          EXECUTE PROCEDURE REDONDEE(:valor, 0)RETURNING_VALUES (VALOR);
       END
   END
    IF (conc_promedio = 'S') THEN
    BEGIN
    perinicial = :periodo - (:numeroprom) + 1;
    anoprom = CAST (ano AS INTEGER);
    IF (perinicial <= 0) THEN
    BEGIN
    perinicial = 54 + :PERINICIAL;
    anoprom = CAST(ANO AS INTEGER) - 1;
    END
    SELECT SUM (noco_valor) FROM nomina_conceptos n WHERE n.noco_aplicaprom = 'S' AND N.noco_periodo >= :perinicial - 1 AND N.noco_periodo < :periodo AND N.noco_ano >= :anoprom AND N.noco_ano <= :ano AND terc_nit = :nite INTO :valor;
    valor = valor / numeroprom;
    END
    IF (conc_otroconc = 'S') THEN
    BEGIN
    anosum = CAST(ano AS INTEGER);
    anosum = anosum - 1;
    SELECT SUM (noco_valor) FROM nomina_conceptos n WHERE n.noco_ano = :anosum AND n.conc_cod = :conc_codotroconc INTO :valor;
    END
    IF (((:entidad = '' ) OR (entidad IS NULL)) AND (conc_aporte = 'S')) THEN
    BEGIN
    IF ((conc_cod = 904) OR (conc_cod = 905) OR (conc_cod = 906)) THEN
    BEGIN
    entidad = :nitafp;
    SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
    valor = :basico + :comision;
        IF (conc_cod = 904) THEN
        BEGIN
        SELECT A.paan_afptr FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
        VALOR = ((:VALOR/30 * :diaslab ) * :PORCEN) /100;
        END
        ELSE
        IF ((conc_cod = 905) OR (conc_cod = 906)) THEN
        BEGIN
        SELECT A.paan_afpem FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
        VALOR = ((:VALOR/30 * :diaslab ) * :PORCEN) /100;
        END
    IF (liquidaper = 0) THEN
        INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
        VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
    ELSE
    IF (liquidaper = 1) THEN
    BEGIN
    rmod = mod(:periodo, 2);
    IF (rmod = 0) THEN
        INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
        VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
    END
    ELSE
    IF (liquidaper = 2) THEN
    BEGIN
    rmod = mod(:periodo, 4);
    IF (rmod = 0) THEN
        INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
        VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
    END
    END
    IF ((conc_cod = 907) OR (conc_cod = 914) OR (conc_cod = 915)) THEN
    BEGIN
    entidad = :niteps;
    SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
    valor = :basico + :comision;
        IF (conc_cod = 907) THEN
        BEGIN
        SELECT A.paan_epstr FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
        VALOR = ((:VALOR/30 * :diaslab ) * :PORCEN) /100;
        END
        ELSE
        IF ((conc_cod = 914) OR (conc_cod = 915)) THEN
        BEGIN
        SELECT A.paan_epsem FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
        VALOR = ((:VALOR/30 * :diaslab ) * :PORCEN) /100;
        END
    IF (liquidaper = 0) THEN
        INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
        VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
    ELSE
    IF (liquidaper = 1) THEN
    BEGIN
    rmod = mod(:periodo, 2);
    IF (rmod = 0) THEN
        INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
        VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
    END
    ELSE
    IF (liquidaper = 2) THEN
    BEGIN
    rmod = mod(:periodo, 4);
    IF (rmod = 0) THEN
        INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
        VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
    END
    END
    IF ((conc_cod = 910) OR (conc_cod = 911) OR (conc_cod = 916) OR (conc_cod = 917) OR (conc_cod = 918) OR (conc_cod = 919)) THEN
    BEGIN
    entidad = :nitccf;
    SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
    valor = :basico + :comision;
        IF ((conc_cod = 910) OR (conc_cod = 911) ) THEN
        BEGIN
        SELECT A.paan_ccf FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
        VALOR = ((:VALOR/30 * :diaslab ) * :PORCEN) /100;
        END
        ELSE
        IF ((conc_cod = 916) OR (conc_cod = 917)) THEN
        BEGIN
        SELECT A.paan_icbf FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
        VALOR = ((:VALOR/30 * :diaslab ) * :PORCEN) /100;
        END
        ELSE
        IF ((conc_cod = 918) OR (conc_cod = 919)) THEN
        BEGIN
        SELECT A.paan_sena FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
        VALOR = ((:VALOR/30 * :diaslab ) * :PORCEN) /100;
        END
    IF (liquidaper = 0) THEN
        INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
        VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
    ELSE
    IF (liquidaper = 1) THEN
    BEGIN
    rmod = mod(:periodo, 2);
    IF (rmod = 0) THEN
        INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
        VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
    END
    ELSE
    IF (liquidaper = 2) THEN
    BEGIN
    rmod = mod(:periodo, 4);
    IF (rmod = 0) THEN
        INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
        VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
    END
    END
    IF ((conc_cod = 912) OR (conc_cod = 913)) THEN
    BEGIN
    entidad = :nitafc;
    SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
    valor = :basico + :comision;
        IF ((conc_cod = 912) OR (conc_cod = 913) ) THEN
        BEGIN
        SELECT A.paan_cesemp FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
        VALOR = ((:VALOR/30 * :diaslab ) * :PORCEN) /100;
        END
    IF (liquidaper = 0) THEN
        INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
        VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
    ELSE
    IF (liquidaper = 1) THEN
    BEGIN
    rmod = mod(:periodo, 2);
    IF (rmod = 0) THEN
        INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
        VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
    END
    ELSE
    IF (liquidaper = 2) THEN
    BEGIN
    rmod = mod(:periodo, 4);
    IF (rmod = 0) THEN
        INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
        VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
    END
    END
    END
    ELSE
    BEGIN
    IF (liquidaper = 0) THEN
        INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
        VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);    ELSE
    IF (liquidaper = 1) THEN
    BEGIN
    rmod = mod(:periodo, 2);
    IF (rmod = 0) THEN
        INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
        VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);    END
    ELSE
    IF (liquidaper = 2) THEN
    BEGIN
    rmod = mod(:periodo, 4);
    IF (rmod = 0) THEN
        INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
        VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);    END
   END
item = :item + 1;
END
ELSE
BEGIN
SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :valor;
        INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
        VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
item = :item + 1;
END
END
END
END
END
SUSPEND;
END
^

SET TERM ; ^


SET TERM ^ ;

ALTER TRIGGER NOMINA_CONCEPTOS_BI0
ACTIVE BEFORE INSERT POSITION 0
AS
DECLARE VARIABLE ITEM INTEGER;
DECLARE VARIABLE NOMIID INTEGER;
DECLARE VARIABLE NOMIIDmaestro INTEGER;
BEGIN
  /* Trigger text */
  SELECT MAX (NOMI_ID) FROM nomina INTO :NOMIIDMAESTRO;
  SELECT MAX (NOCO_ITEM) FROM nomina_conceptos WHERE NOMI_ID = :NOMIIDMAESTRO
  INTO :item;
  IF (item IS NULL) THEN
  BEGIN
  item = 1;
  NEW.nomi_id = :NOMIIDMAESTRO;
  NEW.noco_item = :ITEM;
  END
  ELSE
  BEGIN
  ITEM = ITEM + 1;
  NEW.nomi_id = :NOMIIDMAESTRO;
  NEW.noco_item = :ITEM;
  END
  IF (NEW.noco_deduc = 'S') THEN
  NEW.noco_valor = NEW.noco_valor * (-1);
  IF (NEW.noco_pagook IS NULL) THEN
  NEW.noco_pagook = 'N';
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE TRIGGER NOMINA_CONCEPTOS_BI  FOR NOMINA_CONCEPTOS
ACTIVE BEFORE INSERT POSITION 0
AS
DECLARE VARIABLE ITEM INTEGER;
DECLARE VARIABLE NOMIID INTEGER;
DECLARE VARIABLE NOMIIDmaestro INTEGER;
BEGIN
  /* Trigger text */
IF (NEW.nomi_id <> 0) THEN
BEGIN
  SELECT MAX (NOMI_ID) FROM nomina INTO :NOMIIDMAESTRO;
  SELECT MAX (NOCO_ITEM) FROM nomina_conceptos WHERE NOMI_ID = :NOMIIDMAESTRO
  INTO :item;
  IF (item IS NULL) THEN
  BEGIN
  item = 1;
  NEW.nomi_id = :NOMIIDMAESTRO;
  NEW.noco_item = :ITEM;
  END
  ELSE
  BEGIN
  ITEM = ITEM + 1;
  NEW.nomi_id = :NOMIIDMAESTRO;
  NEW.noco_item = :ITEM;
  END
END
  IF (NEW.noco_deduc = 'S') THEN
  NEW.noco_valor = NEW.noco_valor * (-1);
  IF (NEW.noco_pagook IS NULL) THEN
  NEW.noco_pagook = 'N';
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER PROCEDURE CALC_SALDOSINI_NOMINA(
    FECHA DATE)
RETURNS (
    EMPLNIT VARCHAR(20),
    EMPLNOM VARCHAR(60),
    PRIMAJUNIO NUMERIC(18,2),
    CONC_CODPRIMAJUN INTEGER,
    PRIMADIC NUMERIC(18,2),
    CONC_CODPRIMADIC INTEGER,
    CESANTIA NUMERIC(18,2),
    CONC_CODCESAN INTEGER,
    VACAC NUMERIC(18,2),
    CONC_CODVACACI INTEGER,
    INTCES NUMERIC(18,2),
    CONC_CODINTCES INTEGER)
AS
DECLARE VARIABLE numeromeses INTEGER;
DECLARE VARIABLE fechaing DATE;
DECLARE VARIABLE ANOACT INTEGER;
DECLARE VARIABLE MESACT INTEGER;
DECLARE VARIABLE DIAACT INTEGER;
DECLARE VARIABLE ANOING INTEGER;
DECLARE VARIABLE DIAING INTEGER;
DECLARE VARIABLE MESING INTEGER;
DECLARE VARIABLE salario NUMERIC(18,2);
DECLARE VARIABLE item INTEGER;
DECLARE VARIABLE idsaldo INTEGER;
BEGIN
DELETE FROM nomina WHERE nomi_periodo = 0;
idsaldo = GEN_ID(id_nomina,1);
INSERT INTO nomina  (nomi_id, nomi_feccausa, nomi_liqok, nomi_periodo) VALUES (:idsaldo, :fecha, 'S', 0);
item = 1;
anoact = CAST(substr(:fecha,1,4)AS INTEGER);
mesact = CAST(substr(:fecha,6,7)AS INTEGER);
diaact = CAST(substr(:fecha,9,10)AS INTEGER);
FOR SELECT  E.TERC_NIT, T.TERC_NOM, E.EMPL_FECING, E.empl_salario FROM EMPLEADOS E, TERCEROS T WHERE T.terc_nit = E.terc_nit AND e.empl_fecing <= :fecha INTO :emplnit, :emplnom, :fechaing, :salario
DO
  BEGIN
    anoing = CAST(substr(:fechaing,1,4)AS INTEGER);
    mesing = CAST(substr(:fechaing,6,7)AS INTEGER);
    diaing = CAST(substr(:fechaing,9,10)AS INTEGER);
    numeromeses = mesact - 1;
    cesantia = (:salario / 12) * :numeromeses;
    intces = cesantia * 1 /100;
    numeromeses = ((:anoact-:anoing)*12)-((:mesact-:mesing)*(-1))-1;
    IF (numeromeses < 0) THEN
    numeromeses = 0;
    vacac = (:salario / 12) * :numeromeses;
    IF (anoact = anoing) THEN
    BEGIN
    IF (mesact > 1 AND mesact <= 6) THEN
    BEGIN
    numeromeses = :mesact - :mesing;
    primajunio = (:salario / 12) * :numeromeses;
    END
    ELSE
    primajunio = 0;
    IF (mesact > 7 AND mesact <= 12) THEN
    BEGIN
    numeromeses = :mesact - 6;
    primadic = (:salario / 12) * (:numeromeses);
    END
    END
    ELSE
    IF (mesact > 1 AND mesact <= 6) THEN
    BEGIN
    numeromeses = :mesact - 1;
    primajunio = (:salario / 12) * :numeromeses;
    END
    ELSE
    IF (mesact > 7 AND mesact <= 12) THEN
    BEGIN
    numeromeses = :mesact - 7;
    primadic = (:salario / 12) * (:numeromeses);
    END
EXECUTE PROCEDURE redondee(:primajunio, 5) RETURNING_VALUES :primajunio;
EXECUTE PROCEDURE redondee(:primadic, 5) RETURNING_VALUES :primadic;
EXECUTE PROCEDURE redondee(:cesantia, 5) RETURNING_VALUES :cesantia;
EXECUTE PROCEDURE redondee(:intces, 5) RETURNING_VALUES :intces;
EXECUTE PROCEDURE redondee(:vacac, 5) RETURNING_VALUES :vacac;
/*if ( cesantia <> 0 AND cesantia IS NOT NULL and  intces <> 0 AND intces IS NOT NULL and primajunio <> 0 AND primajunio IS NOT NULL and vacac <> 0 AND vacac IS NOT NULL and primadic <> 0 AND primadic IS NOT NULL) then*/
SELECT conc_cod FROM empleado_conceptos WHERE ((conc_cod = 912) OR (conc_cod = 913)) AND terc_nit = :emplnit INTO :conc_codcesan;
SELECT conc_cod FROM empleado_conceptos WHERE ((conc_cod = 921) OR (conc_cod = 925)) AND terc_nit = :emplnit INTO :conc_codintces;
SELECT conc_cod FROM empleado_conceptos WHERE ((conc_cod = 927) OR (conc_cod = 923)) AND terc_nit = :emplnit INTO :conc_codprimajun;
SELECT conc_cod FROM empleado_conceptos WHERE ((conc_cod = 924) OR (conc_cod = 928)) AND terc_nit = :emplnit INTO :conc_codprimadic;
SELECT conc_cod FROM empleado_conceptos WHERE ((conc_cod = 922) OR (conc_cod = 926)) AND terc_nit = :emplnit  INTO :conc_codvacaci;
IF (cesantia <> 0 AND cesantia IS NOT NULL) THEN
BEGIN
INSERT INTO NOMINA_CONCEPTOS (NOMI_ID, NOCO_ITEM, CONC_COD, TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC, NOCO_PROV, NOCO_APORTE, NOCO_PAGOOK, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, NOCO_GTOEMPR) VALUES (:idsaldo, :item, :conc_codcesan, :emplnit, :cesantia, '', 'N', 'S', 'N', 'N', 0, :anoact, 'N', 'N', 'N', 'S');
item = :item + 1;
END
IF (intces <> 0 AND intces IS NOT NULL) THEN
BEGIN
INSERT INTO NOMINA_CONCEPTOS (NOMI_ID, NOCO_ITEM, CONC_COD, TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC, NOCO_PROV, NOCO_APORTE, NOCO_PAGOOK, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, NOCO_GTOEMPR) VALUES (:idsaldo, :item, :conc_codintces, :emplnit, :intces, '', 'N', 'S', 'N', 'N', 0, :anoact, 'N', 'N', 'N', 'S');
item = :item + 1;
END
IF (primajunio <> 0 AND primajunio IS NOT NULL) THEN
BEGIN
INSERT INTO NOMINA_CONCEPTOS (NOMI_ID, NOCO_ITEM, CONC_COD, TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC, NOCO_PROV, NOCO_APORTE, NOCO_PAGOOK, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, NOCO_GTOEMPR) VALUES (:idsaldo, :item, :conc_codprimajun, :emplnit, :primajunio, '', 'N', 'S', 'N', 'N', 0, :anoact, 'N', 'N', 'N', 'S');
item = :item + 1;
END
IF (primadic <> 0 AND primadic IS NOT NULL) THEN
BEGIN
INSERT INTO NOMINA_CONCEPTOS (NOMI_ID, NOCO_ITEM, CONC_COD, TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC, NOCO_PROV, NOCO_APORTE, NOCO_PAGOOK, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, NOCO_GTOEMPR) VALUES (:idsaldo, :item, :conc_codprimadic, :emplnit, :primadic, '', 'N', 'S', 'N', 'N', 0, :anoact, 'N', 'N', 'N', 'S');
item = :item + 1;
END
IF (vacac <> 0 AND vacac IS NOT NULL) THEN
BEGIN
INSERT INTO NOMINA_CONCEPTOS (NOMI_ID, NOCO_ITEM, CONC_COD, TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC, NOCO_PROV, NOCO_APORTE, NOCO_PAGOOK, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, NOCO_GTOEMPR) VALUES (:idsaldo, :item, :conc_codvacaci, :emplnit, :vacac, '', 'N', 'S', 'N', 'N', 0, :anoact, 'N', 'N', 'N', 'S');
item = :item + 1;
END
    SUSPEND;
  END
END
^

SET TERM ; ^


SET TERM ^ ;

ALTER PROCEDURE CAUSA_NOMINA(
    FEC DATE,
    PERIODO INTEGER,
    PERIODICIDAD INTEGER,
    PAGOGLOBAL CHAR(1),
    ANO CHAR(4))
RETURNS (
    IDNOMINA INTEGER)
AS
DECLARE VARIABLE item INTEGER;
DECLARE VARIABLE nite VARCHAR(20) CHARACTER SET none;
DECLARE VARIABLE nit_tercero VARCHAR(20);
DECLARE VARIABLE concept INTEGER;
DECLARE VARIABLE montos NUMERIC(18,2);
DECLARE VARIABLE porcen NUMERIC(9,4);
DECLARE VARIABLE entidad VARCHAR(20);
DECLARE VARIABLE conc_cod INTEGER;
DECLARE VARIABLE conc_deduc CHAR(1);
DECLARE VARIABLE conc_porc NUMERIC(9,4);
DECLARE VARIABLE conc_entidad INTEGER;
DECLARE VARIABLE conc_monto NUMERIC(18,2);
DECLARE VARIABLE conc_modifi CHAR(1);
DECLARE VARIABLE conc_promedio CHAR(1);
DECLARE VARIABLE emco_perprom INTEGER;
DECLARE VARIABLE valor NUMERIC(18,2);
DECLARE VARIABLE diaslab INTEGER;
DECLARE VARIABLE conc_prov CHAR(1);
DECLARE VARIABLE conc_aporte CHAR(1);
DECLARE VARIABLE numeroprom INTEGER;
DECLARE VARIABLE conc_aplicaprom CHAR(1);
DECLARE VARIABLE perinicial INTEGER;
DECLARE VARIABLE anoprom INTEGER;
DECLARE VARIABLE conc_dias CHAR(1);
DECLARE VARIABLE conc_otroconc CHAR(1);
DECLARE VARIABLE conc_codotroconc INTEGER;
DECLARE VARIABLE anosum INTEGER;
DECLARE VARIABLE salario CHAR(1) CHARACTER SET none;
DECLARE VARIABLE liquidaper INTEGER;
DECLARE VARIABLE rmod NUMERIC(2,2);
DECLARE VARIABLE basico NUMERIC(18,2);
DECLARE VARIABLE niteps VARCHAR(20);
DECLARE VARIABLE nitafc VARCHAR(20);
DECLARE VARIABLE nitafp VARCHAR(20);
DECLARE VARIABLE nitccf VARCHAR(20);
DECLARE VARIABLE gtoempr CHAR(1);
DECLARE VARIABLE comision NUMERIC(18,2);
BEGIN
/*SI ES QUINCENAL*/
IF (periodicidad = 2) THEN
BEGIN
EXECUTE PROCEDURE cambie_id_nomina RETURNING_VALUES(:idnomina);
INSERT INTO nomina (nomi_id, NOMI_FECCAUSA, NOMI_PAGOGLOBAL, NOMI_PERIODOCIDAD, NOMI_PERIODO, NOMI_ANO, NOMI_LIQOK)
VALUES (:IDNOMINA, :fec,:pagoglobal, :periodicidad, :periodo, :ano, 'N');
 BEGIN
    item = 1;
    FOR SELECT E.TERC_NIT, E.empl_salario, e.empl_eps, e.empl_afc, e.empl_afp, e.empl_ccf
    FROM EMPLEADOS E
    WHERE E.empl_ppago = 2
    INTO :nite, :basico, :niteps, :nitafc, :nitafp, :nitccf
    DO
    BEGIN
    FOR SELECT CE.TERC_NIT, CE.CONC_COD, CE.EMCO_MONTO, CE.EMCO_PORC, ce.empl_entidad, CE.emco_perprom, CE.emco_luquidaper,    CN.CONC_COD, CN.CONC_DEDUC,CN.CONC_PORC, CN.CONC_ENTIDAD, CN.CONC_MONTO,  CN.CONC_DIAS, CN.CONC_MODIFI,
    CN.CONC_PROMEDIO, CN.conc_salario, CE.emco_perprom, CN.conc_prov, CN.conc_aporte, CN.conc_aplicaprom, cn.conc_otroconc, cn.conc_codotroconc, CN.conc_gtoempr
    FROM empleado_conceptos CE, CONCEPTOS_NOMINA CN WHERE ((CE.terc_nit = :nite) AND (CE.CONC_COD = CN.CONC_COD) AND (CN.conc_fecini <= :fec AND CN.conc_fecfin >= :FEC) ) OR ((CE.terc_nit = :nite)
    AND (CE.CONC_COD = CN.CONC_COD) AND (cn.conc_todosper = 'N') AND (CE.emco_ppago = :periodo)) OR  ((CE.terc_nit = :nite) AND (CE.CONC_COD = CN.CONC_COD) AND cn.conc_todosper = 'S')  ORDER BY (TERC_NIT )
    INTO :nit_tercero, :concept,  :montos, :porcen, :entidad, :numeroprom, :liquidaper ,:CONC_COD, :CONC_DEDUC, :CONC_PORC,
    :CONC_ENTIDAD, :CONC_MONTO, :CONC_DIAS, :CONC_MODIFI,:CONC_PROMEDIO, :salario,:EMCO_PERPROM, :conc_prov, :conc_aporte , :CONC_APLICAPROM, :conc_otroconc, :conc_codotroconc, :gtoempr
    DO
BEGIN
    IF (conc_dias = 'S') THEN
    EXECUTE PROCEDURE DIAS_LABORADOS (:nite, :periodo) RETURNING_VALUES (:diaslab);
    ELSE
    BEGIN
    IF (liquidaper = 0) THEN
    diaslab = 15;
    ELSE
    IF (liquidaper = 1) THEN
    diaslab = 30;
    ELSE
    IF (liquidaper = 2) THEN
    diaslab = 60;
    END
 IF (conc_cod = 920) THEN
 BEGIN
 SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :valor;
 IF (valor IS NULL) THEN
 valor = 0;
 item = :item + 1;
 END
 ELSE
 BEGIN
    IF ((:montos = 0) OR (:montos IS NULL)) THEN
      BEGIN
      IF ((CONC_PORC = 0 AND :porcen = 0) OR (CONC_PORC IS NULL AND :porcen = 0) OR (CONC_PORC = 0 AND :porcen IS NULL) OR (CONC_PORC IS NULL AND :porcen IS NULL) ) THEN
        BEGIN
        IF ((conc_monto <> 0) AND (conc_monto IS NOT NULL) ) THEN
        BEGIN
        VALOR = :CONC_MONTO/30 * :diaslab;
        EXECUTE PROCEDURE REDONDEE(:valor, 5) RETURNING_VALUES (VALOR);
        END
        ELSE
        IF (salario = 'S' AND CONC_COD <> 900) THEN
        BEGIN
        conc_monto = :basico;
        VALOR = (:conc_monto/30 * :diaslab );
        EXECUTE PROCEDURE REDONDEE(:valor, 5) RETURNING_VALUES (VALOR);
        END
        ELSE
        valor = montos;
        END
       ELSE
       BEGIN
        IF (:porcen <> 0) THEN
          BEGIN
            IF ((conc_monto <> 0) AND (conc_monto IS NOT NULL) ) THEN
            BEGIN
              VALOR = ((:CONC_MONTO/30 * :diaslab ) * :PORCEN) /100;
              EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
            END
            ELSE
        IF (salario = 'S' AND CONC_COD <> 900) THEN
            BEGIN
              conc_monto = :basico;
              VALOR = ((:CONC_MONTO/30 * :diaslab ) * :PORCEN) /100;
              EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
            END
          END
          ELSE
          BEGIN
            IF ((conc_monto <> 0) AND (conc_monto IS NOT NULL) ) THEN
            BEGIN
              VALOR = ((:CONC_MONTO/30 * :diaslab ) * :conc_porc) /100;
              EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
            END
            ELSE
        IF (salario = 'S' AND CONC_COD <> 900) THEN
            BEGIN
              conc_monto = :basico;
              VALOR = ((:CONC_MONTO/30 * :diaslab ) * :conc_porc) /100;
              EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
            END
          END
       END
      END
    ELSE
    BEGIN
      IF (CONC_PORC = 0 AND :porcen = 0) THEN
      BEGIN
      VALOR = (:montos/30 * :diaslab );
      EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
      END
      ELSE
      BEGIN
        IF (:porcen <> 0) THEN
          BEGIN
          VALOR = ((:MONTOS/30 * :diaslab ) * :PORCEN) /100;
          EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
          END
          ELSE
          BEGIN
          VALOR = ((:montos/30 * :diaslab ) * :CONC_PORC) /100;
          END
          EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
       END
   END
    IF (conc_promedio = 'S') THEN
    BEGIN
    perinicial = :periodo - (:numeroprom) + 1;
    anoprom = CAST (ano AS INTEGER);
    IF (perinicial <= 0) THEN
    BEGIN
    perinicial = 24 + :PERINICIAL;
    anoprom = CAST(ANO AS INTEGER) - 1;
    END
    SELECT SUM (noco_valor) FROM nomina_conceptos n WHERE n.noco_aplicaprom = 'S' AND N.noco_periodo >= :perinicial - 1 AND N.noco_periodo < :periodo AND N.noco_ano >= :anoprom AND N.noco_ano <= :ano AND terc_nit = :nite INTO :valor;
    valor = (valor / numeroprom)/*/ 30 * :diaslab*/;
    EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
    UPDATE nomina_conceptos N SET noco_pagook = 'S' WHERE n.noco_aplicaprom = 'S' AND N.noco_periodo >= :perinicial - 1 AND N.noco_periodo < :periodo AND N.noco_ano >= :anoprom AND N.noco_ano <= :ano AND terc_nit = :nite;
    END
    IF (conc_otroconc = 'S') THEN
    BEGIN
    anosum = CAST(ano AS INTEGER);
    anosum = anosum - 1;
    SELECT SUM (noco_valor) FROM nomina_conceptos n WHERE n.noco_ano = :anosum AND n.conc_cod = :conc_codotroconc AND N.terc_nit = :nite INTO :valor;
    UPDATE nomina_conceptos SET noco_pagook = 'S' WHERE noco_ano = :anosum AND conc_cod = :conc_codotroconc AND terc_nit = :nite;
    END
/*SI EL CONCEPTO ES UN APORTE*/
IF (conc_aporte = 'S') THEN
BEGIN
    IF ((:entidad = '' ) OR (entidad IS NULL)) THEN
    BEGIN
     SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
     IF (comision IS NULL) THEN
     comision = 0;
     valor = :basico + :comision;
    IF ((conc_cod = 904) OR (conc_cod = 905) OR (conc_cod = 906)) THEN
            BEGIN
            entidad = :nitafp;
                IF (conc_cod = 904) THEN
                BEGIN
                SELECT A.paan_afptr FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = ((((:basico )/30 * :diaslab ) + :comision) * :PORCEN) /100;
                END
                ELSE
                IF ((conc_cod = 905) OR (conc_cod = 906)) THEN
                BEGIN
                SELECT A.paan_afpem FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = ((((:basico )/30 * :diaslab ) + :comision) * :PORCEN) /100;
                END
                EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
            END
            ELSE
       IF ((conc_cod = 907) OR (conc_cod = 914) OR (conc_cod = 915)) THEN
            BEGIN
            entidad = :niteps;
                IF (conc_cod = 907) THEN
                BEGIN
                SELECT A.paan_epstr FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = ((((:basico )/30 * :diaslab ) + :comision) * :PORCEN) /100;
                END
                ELSE
                IF ((conc_cod = 914) OR (conc_cod = 915)) THEN
                BEGIN
                SELECT A.paan_epsem FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = ((((:basico )/30 * :diaslab ) + :comision) * :PORCEN) /100;
                END
                EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
            END
            ELSE
       IF ((conc_cod = 910) OR (conc_cod = 911) OR (conc_cod = 916) OR (conc_cod = 917) OR (conc_cod = 918) OR (conc_cod = 919)) THEN
            BEGIN
            entidad = :nitccf;
            SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
            IF (comision IS NULL) THEN
            comision = 0;
                IF ((conc_cod = 910) OR (conc_cod = 911) ) THEN
                BEGIN
                SELECT A.paan_ccf FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = ((((:basico )/30 * :diaslab ) + :comision) * :PORCEN) /100;
                EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
                END
                ELSE
                IF ((conc_cod = 916) OR (conc_cod = 917)) THEN
                BEGIN
                SELECT A.paan_icbf FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = ((((:basico )/30 * :diaslab ) + :comision) * :PORCEN) /100;
                EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
                END
                ELSE
                IF ((conc_cod = 918) OR (conc_cod = 919)) THEN
                BEGIN
                SELECT A.paan_sena FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = ((((:basico )/30 * :diaslab ) + :comision) * :PORCEN) /100;
                EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
                END
            END
            ELSE
        IF ((conc_cod = 912) OR (conc_cod = 913)) THEN
            BEGIN
            entidad = :nitafc;
            SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
            IF (comision IS NULL) THEN
            comision = 0;
                IF ((conc_cod = 912) OR (conc_cod = 913) ) THEN
                BEGIN
                SELECT A.paan_cesemp FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = (((:basico + :comision)/30 * :diaslab ) * :PORCEN) /100;
                EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
                END
            END
            ELSE
        BEGIN
        SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
        IF (comision IS NULL) THEN
        comision = 0;
        conc_monto = :basico + :comision;
        IF (conc_porc <> 0 AND conc_porc IS NOT NULL) THEN
        VALOR = ((:CONC_MONTO/30 * :diaslab ) * :conc_porc) /100;
        ELSE
        VALOR = ((:CONC_MONTO/30 * :diaslab ) * :porcen) /100;
        EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
        END
    END
    END
    ELSE
    BEGIN
    IF (conc_prov = 'S') THEN
    BEGIN
        conc_monto = :basico;
        IF (conc_porc <> 0 AND conc_porc IS NOT NULL) THEN
        VALOR = ((:CONC_MONTO/30 * :diaslab ) * :conc_porc) /100;
        ELSE
        VALOR = ((:CONC_MONTO/30 * :diaslab ) * :porcen) /100;
        EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
    END
    END
item = :item + 1;
END
    IF (liquidaper = 0) THEN
    INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
    VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
    ELSE
    IF (liquidaper = 1) THEN
    BEGIN
    rmod = mod(:periodo, 2);
    IF (rmod = 0) THEN
        INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
        VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
    END
    ELSE
    IF (liquidaper = 2) THEN
    BEGIN
    rmod = mod(:periodo, 4);
    IF (rmod = 0) THEN
        INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
        VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
    END
END
END
END
END
ELSE
/*SI ES MENSUAL*/
IF (periodicidad = 1) THEN
BEGIN
EXECUTE PROCEDURE cambie_id_nomina RETURNING_VALUES(:idnomina);
INSERT INTO nomina (nomi_id, NOMI_FECCAUSA, NOMI_PAGOGLOBAL, NOMI_PERIODOCIDAD, NOMI_PERIODO, NOMI_ANO, NOMI_LIQOK)
VALUES (:IDNOMINA, :fec,:pagoglobal, :periodicidad, :periodo, :ano, 'N');
    BEGIN
    item = 1;
    FOR SELECT E.TERC_NIT, E.empl_salario, e.empl_eps, e.empl_afc, e.empl_afp, e.empl_ccf
    FROM EMPLEADOS E
    WHERE E.empl_ppago = 1
    INTO :nite, :basico, :niteps, :nitafc, :nitafp, :nitccf
    DO
    FOR SELECT CE.TERC_NIT, CE.CONC_COD, CE.EMCO_MONTO, CE.EMCO_PORC, ce.empl_entidad, CE.emco_perprom, CE.emco_luquidaper,    CN.CONC_COD, CN.CONC_DEDUC,CN.CONC_PORC, CN.CONC_ENTIDAD, CN.CONC_MONTO,  CN.CONC_DIAS, CN.CONC_MODIFI,
    CN.CONC_PROMEDIO, CN.conc_salario, CE.emco_perprom, CN.conc_prov, CN.conc_aporte, CN.conc_aplicaprom, cn.conc_otroconc, cn.conc_codotroconc, CN.conc_gtoempr
    FROM empleado_conceptos CE, CONCEPTOS_NOMINA CN WHERE ((CE.terc_nit = :nite) AND (CE.CONC_COD = CN.CONC_COD) AND (CN.conc_fecini <= :fec AND CN.conc_fecfin >= :FEC) ) OR ((CE.terc_nit = :nite)
    AND (CE.CONC_COD = CN.CONC_COD) AND (cn.conc_todosper = 'N') AND (CE.emco_ppago = :periodo)) OR  ((CE.terc_nit = :nite) AND (CE.CONC_COD = CN.CONC_COD) AND cn.conc_todosper = 'S')  ORDER BY (TERC_NIT)
    INTO :nit_tercero, :concept,  :montos, :porcen, :entidad, :numeroprom, :liquidaper ,:CONC_COD, :CONC_DEDUC, :CONC_PORC,
    :CONC_ENTIDAD, :CONC_MONTO, :CONC_DIAS, :CONC_MODIFI,:CONC_PROMEDIO, :salario,:EMCO_PERPROM, :conc_prov, :conc_aporte , :CONC_APLICAPROM, :conc_otroconc, :conc_codotroconc, :gtoempr    DO
BEGIN
    IF (conc_dias = 'S') THEN
    EXECUTE PROCEDURE DIAS_LABORADOS (:nite, :periodo) RETURNING_VALUES (:diaslab);
    ELSE
    BEGIN
    IF (liquidaper = 0) THEN
    diaslab = 30;
    ELSE
    IF (liquidaper = 1) THEN
    diaslab = 60;
    ELSE
    IF (liquidaper = 2) THEN
    diaslab = 120;
    END
 IF (conc_cod = 920) THEN
 BEGIN
 SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :valor;
 IF (valor IS NULL) THEN
 valor = 0;
 item = :item + 1;
 END
 ELSE
 BEGIN
    IF ((:montos = 0) OR (:montos IS NULL)) THEN
      BEGIN
      IF ((CONC_PORC = 0 AND :porcen = 0) OR (CONC_PORC IS NULL AND :porcen = 0) OR (CONC_PORC = 0 AND :porcen IS NULL) OR (CONC_PORC IS NULL AND :porcen IS NULL) ) THEN
        BEGIN
        IF ((conc_monto <> 0) AND (conc_monto IS NOT NULL) ) THEN
        BEGIN
        VALOR = :CONC_MONTO/30 * :diaslab;
        EXECUTE PROCEDURE REDONDEE(:valor, 5) RETURNING_VALUES (VALOR);
        END
        ELSE
        IF (salario = 'S' AND CONC_COD <> 900) THEN
        BEGIN
        conc_monto = :basico;
        VALOR = (:conc_monto/30 * :diaslab );
        EXECUTE PROCEDURE REDONDEE(:valor, 5) RETURNING_VALUES (VALOR);
        END
        ELSE
        valor = montos;
        END
       ELSE
       BEGIN
        IF (:porcen <> 0) THEN
          BEGIN
            IF ((conc_monto <> 0) AND (conc_monto IS NOT NULL) ) THEN
            BEGIN
              VALOR = ((:CONC_MONTO/30 * :diaslab ) * :PORCEN) /100;
              EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
            END
            ELSE
        IF (salario = 'S' AND CONC_COD <> 900) THEN
            BEGIN
              conc_monto = :basico;
              VALOR = ((:CONC_MONTO/30 * :diaslab ) * :PORCEN) /100;
              EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
            END
          END
          ELSE
          BEGIN
            IF ((conc_monto <> 0) AND (conc_monto IS NOT NULL) ) THEN
            BEGIN
              VALOR = ((:CONC_MONTO/30 * :diaslab ) * :conc_porc) /100;
              EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
            END
            ELSE
        IF (salario = 'S' AND CONC_COD <> 900) THEN
            BEGIN
              conc_monto = :basico;
              VALOR = ((:CONC_MONTO/30 * :diaslab ) * :conc_porc) /100;
              EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
            END
          END
       END
      END
    ELSE
    BEGIN
      IF (CONC_PORC = 0 AND :porcen = 0) THEN
      BEGIN
      VALOR = (:montos/30 * :diaslab );
      EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
      END
      ELSE
      BEGIN
        IF (:porcen <> 0) THEN
          BEGIN
          VALOR = ((:MONTOS/30 * :diaslab ) * :PORCEN) /100;
          EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
          END
          ELSE
          BEGIN
          VALOR = ((:montos/30 * :diaslab ) * :CONC_PORC) /100;
          END
          EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
       END
   END
    IF (conc_promedio = 'S') THEN
    BEGIN
    perinicial = :periodo - (:numeroprom) + 1;
    anoprom = CAST (ano AS INTEGER);
    IF (perinicial <= 0) THEN
    BEGIN
    perinicial = 24 + :PERINICIAL;
    anoprom = CAST(ANO AS INTEGER) - 1;
    END
    SELECT SUM (noco_valor) FROM nomina_conceptos n WHERE n.noco_aplicaprom = 'S' AND N.noco_periodo >= :perinicial - 1 AND N.noco_periodo < :periodo AND N.noco_ano >= :anoprom AND N.noco_ano <= :ano AND terc_nit = :nite INTO :valor;
    valor = (valor / numeroprom)/*/ 30 * :diaslab*/;
    EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
    UPDATE nomina_conceptos N SET noco_pagook = 'S' WHERE n.noco_aplicaprom = 'S' AND N.noco_periodo >= :perinicial - 1 AND N.noco_periodo < :periodo AND N.noco_ano >= :anoprom AND N.noco_ano <= :ano AND terc_nit = :nite;
    END
    IF (conc_otroconc = 'S') THEN
    BEGIN
    anosum = CAST(ano AS INTEGER);
    anosum = anosum - 1;
    SELECT SUM (noco_valor) FROM nomina_conceptos n WHERE n.noco_ano = :anosum AND n.conc_cod = :conc_codotroconc AND N.terc_nit = :nite INTO :valor;
    UPDATE nomina_conceptos SET noco_pagook = 'S' WHERE noco_ano = :anosum AND conc_cod = :conc_codotroconc AND terc_nit = :nite;
    END
/*SI EL CONCEPTO ES UN APORTE*/
IF (conc_aporte = 'S') THEN
BEGIN
    IF ((:entidad = '' ) OR (entidad IS NULL)) THEN
    BEGIN
     SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
     IF (comision IS NULL) THEN
     comision = 0;
     valor = :basico + :comision;
    IF ((conc_cod = 904) OR (conc_cod = 905) OR (conc_cod = 906)) THEN
            BEGIN
            entidad = :nitafp;
                IF (conc_cod = 904) THEN
                BEGIN
                SELECT A.paan_afptr FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = ((((:basico )/30 * :diaslab ) + :comision) * :PORCEN) /100;
                END
                ELSE
                IF ((conc_cod = 905) OR (conc_cod = 906)) THEN
                BEGIN
                SELECT A.paan_afpem FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = ((((:basico )/30 * :diaslab ) + :comision) * :PORCEN) /100;
                END
                EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
            END
            ELSE
       IF ((conc_cod = 907) OR (conc_cod = 914) OR (conc_cod = 915)) THEN
            BEGIN
            entidad = :niteps;
                IF (conc_cod = 907) THEN
                BEGIN
                SELECT A.paan_epstr FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = ((((:basico )/30 * :diaslab ) + :comision) * :PORCEN) /100;
                END
                ELSE
                IF ((conc_cod = 914) OR (conc_cod = 915)) THEN
                BEGIN
                SELECT A.paan_epsem FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = ((((:basico )/30 * :diaslab ) + :comision) * :PORCEN) /100;
                END
                EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
            END
            ELSE
       IF ((conc_cod = 910) OR (conc_cod = 911) OR (conc_cod = 916) OR (conc_cod = 917) OR (conc_cod = 918) OR (conc_cod = 919)) THEN
            BEGIN
            entidad = :nitccf;
            SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
            IF (comision IS NULL) THEN
            comision = 0;
                IF ((conc_cod = 910) OR (conc_cod = 911) ) THEN
                BEGIN
                SELECT A.paan_ccf FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = ((((:basico )/30 * :diaslab ) + :comision) * :PORCEN) /100;
                EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
                END
                ELSE
                IF ((conc_cod = 916) OR (conc_cod = 917)) THEN
                BEGIN
                SELECT A.paan_icbf FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = ((((:basico )/30 * :diaslab ) + :comision) * :PORCEN) /100;
                EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
                END
                ELSE
                IF ((conc_cod = 918) OR (conc_cod = 919)) THEN
                BEGIN
                SELECT A.paan_sena FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = ((((:basico )/30 * :diaslab ) + :comision) * :PORCEN) /100;
                EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
                END
            END
            ELSE
        IF ((conc_cod = 912) OR (conc_cod = 913)) THEN
            BEGIN
            entidad = :nitafc;
            SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
            IF (comision IS NULL) THEN
            comision = 0;
                IF ((conc_cod = 912) OR (conc_cod = 913) ) THEN
                BEGIN
                SELECT A.paan_cesemp FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = (((:basico + :comision)/30 * :diaslab ) * :PORCEN) /100;
                EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
                END
            END
            ELSE
        BEGIN
        SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
        IF (comision IS NULL) THEN
        comision = 0;
        conc_monto = :basico + :comision;
        IF (conc_porc <> 0 AND conc_porc IS NOT NULL) THEN
        VALOR = ((:CONC_MONTO/30 * :diaslab ) * :conc_porc) /100;
        ELSE
        VALOR = ((:CONC_MONTO/30 * :diaslab ) * :porcen) /100;
        EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
        END
    END
    END
    ELSE
    BEGIN
    IF (conc_prov = 'S') THEN
    BEGIN
        conc_monto = :basico;
        IF (conc_porc <> 0 AND conc_porc IS NOT NULL) THEN
        VALOR = ((:CONC_MONTO/30 * :diaslab ) * :conc_porc) /100;
        ELSE
        VALOR = ((:CONC_MONTO/30 * :diaslab ) * :porcen) /100;
        EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
    END
    END
item = :item + 1;
END
    IF (liquidaper = 0) THEN
    INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
    VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
    ELSE
    IF (liquidaper = 1) THEN
    BEGIN
    rmod = mod(:periodo, 2);
    IF (rmod = 0) THEN
        INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
        VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
    END
    ELSE
    IF (liquidaper = 2) THEN
    BEGIN
    rmod = mod(:periodo, 4);
    IF (rmod = 0) THEN
        INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
        VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
    END
END
END
END
ELSE
/*SI ES SEMANAL*/
IF (periodicidad = 3) THEN
BEGIN
EXECUTE PROCEDURE cambie_id_nomina RETURNING_VALUES(:idnomina);
INSERT INTO nomina (nomi_id, NOMI_FECCAUSA, NOMI_PAGOGLOBAL, NOMI_PERIODOCIDAD, NOMI_PERIODO, NOMI_ANO, NOMI_LIQOK)
VALUES (:IDNOMINA, :fec,:pagoglobal, :periodicidad, :periodo, :ano, 'N');
    BEGIN
    item = 1;
    FOR SELECT E.TERC_NIT, E.empl_salario, e.empl_eps, e.empl_afc, e.empl_afp, e.empl_ccf
    FROM EMPLEADOS E
    WHERE E.empl_ppago = 3
    INTO :nite, :basico, :niteps, :nitafc, :nitafp, :nitccf
    DO
    BEGIN
    FOR SELECT CE.TERC_NIT, CE.CONC_COD, CE.EMCO_MONTO, CE.EMCO_PORC, ce.empl_entidad, CE.emco_perprom, CE.emco_luquidaper,    CN.CONC_COD, CN.CONC_DEDUC,CN.CONC_PORC, CN.CONC_ENTIDAD, CN.CONC_MONTO,  CN.CONC_DIAS, CN.CONC_MODIFI,
    CN.CONC_PROMEDIO, CN.conc_salario, CE.emco_perprom, CN.conc_prov, CN.conc_aporte, CN.conc_aplicaprom, cn.conc_otroconc, cn.conc_codotroconc, CN.conc_gtoempr
    FROM empleado_conceptos CE, CONCEPTOS_NOMINA CN WHERE ((CE.terc_nit = :nite) AND (CE.CONC_COD = CN.CONC_COD) AND (CN.conc_fecini <= :fec AND CN.conc_fecfin >= :FEC) ) OR ((CE.terc_nit = :nite)
    AND (CE.CONC_COD = CN.CONC_COD) AND (cn.conc_todosper = 'N') AND (CE.emco_ppago = :periodo)) OR  ((CE.terc_nit = :nite) AND (CE.CONC_COD = CN.CONC_COD) AND cn.conc_todosper = 'S')  ORDER BY (TERC_NIT)
    INTO :nit_tercero, :concept,  :montos, :porcen, :entidad, :numeroprom, :liquidaper ,:CONC_COD, :CONC_DEDUC, :CONC_PORC,
    :CONC_ENTIDAD, :CONC_MONTO, :CONC_DIAS, :CONC_MODIFI,:CONC_PROMEDIO, :salario,:EMCO_PERPROM, :conc_prov, :conc_aporte , :CONC_APLICAPROM, :conc_otroconc, :conc_codotroconc, :gtoempr
    DO
BEGIN
    IF (conc_dias = 'S') THEN
    EXECUTE PROCEDURE DIAS_LABORADOS (:nite, :periodo) RETURNING_VALUES (:diaslab);
    ELSE
    BEGIN
    IF (liquidaper = 0) THEN
    diaslab = 7;
    ELSE
    IF (liquidaper = 1) THEN
    diaslab = 15;
    ELSE
    IF (liquidaper = 2) THEN
    diaslab = 30;
    END
 IF (conc_cod = 920) THEN
 BEGIN
 SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :valor;
 IF (valor IS NULL) THEN
 valor = 0;
 item = :item + 1;
 END
 ELSE
 BEGIN
    IF ((:montos = 0) OR (:montos IS NULL)) THEN
      BEGIN
      IF ((CONC_PORC = 0 AND :porcen = 0) OR (CONC_PORC IS NULL AND :porcen = 0) OR (CONC_PORC = 0 AND :porcen IS NULL) OR (CONC_PORC IS NULL AND :porcen IS NULL) ) THEN
        BEGIN
        IF ((conc_monto <> 0) AND (conc_monto IS NOT NULL) ) THEN
        BEGIN
        VALOR = :CONC_MONTO/30 * :diaslab;
        EXECUTE PROCEDURE REDONDEE(:valor, 5) RETURNING_VALUES (VALOR);
        END
        ELSE
        IF (salario = 'S' AND CONC_COD <> 900) THEN
        BEGIN
        conc_monto = :basico;
        VALOR = (:conc_monto/30 * :diaslab );
        EXECUTE PROCEDURE REDONDEE(:valor, 5) RETURNING_VALUES (VALOR);
        END
        ELSE
        valor = montos;
        END
       ELSE
       BEGIN
        IF (:porcen <> 0) THEN
          BEGIN
            IF ((conc_monto <> 0) AND (conc_monto IS NOT NULL) ) THEN
            BEGIN
              VALOR = ((:CONC_MONTO/30 * :diaslab ) * :PORCEN) /100;
              EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
            END
            ELSE
        IF (salario = 'S' AND CONC_COD <> 900) THEN
            BEGIN
              conc_monto = :basico;
              VALOR = ((:CONC_MONTO/30 * :diaslab ) * :PORCEN) /100;
              EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
            END
          END
          ELSE
          BEGIN
            IF ((conc_monto <> 0) AND (conc_monto IS NOT NULL) ) THEN
            BEGIN
              VALOR = ((:CONC_MONTO/30 * :diaslab ) * :conc_porc) /100;
              EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
            END
            ELSE
        IF (salario = 'S' AND CONC_COD <> 900) THEN
            BEGIN
              conc_monto = :basico;
              VALOR = ((:CONC_MONTO/30 * :diaslab ) * :conc_porc) /100;
              EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
            END
          END
       END
      END
    ELSE
    BEGIN
      IF (CONC_PORC = 0 AND :porcen = 0) THEN
      BEGIN
      VALOR = (:montos/30 * :diaslab );
      EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
      END
      ELSE
      BEGIN
        IF (:porcen <> 0) THEN
          BEGIN
          VALOR = ((:MONTOS/30 * :diaslab ) * :PORCEN) /100;
          EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
          END
          ELSE
          BEGIN
          VALOR = ((:montos/30 * :diaslab ) * :CONC_PORC) /100;
          END
          EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
       END
   END
    IF (conc_promedio = 'S') THEN
    BEGIN
    perinicial = :periodo - (:numeroprom) + 1;
    anoprom = CAST (ano AS INTEGER);
    IF (perinicial <= 0) THEN
    BEGIN
    perinicial = 24 + :PERINICIAL;
    anoprom = CAST(ANO AS INTEGER) - 1;
    END
    SELECT SUM (noco_valor) FROM nomina_conceptos n WHERE n.noco_aplicaprom = 'S' AND N.noco_periodo >= :perinicial - 1 AND N.noco_periodo < :periodo AND N.noco_ano >= :anoprom AND N.noco_ano <= :ano AND terc_nit = :nite INTO :valor;
    valor = (valor / numeroprom)/*/ 30 * :diaslab*/;
    EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
    UPDATE nomina_conceptos N SET noco_pagook = 'S' WHERE n.noco_aplicaprom = 'S' AND N.noco_periodo >= :perinicial - 1 AND N.noco_periodo < :periodo AND N.noco_ano >= :anoprom AND N.noco_ano <= :ano AND terc_nit = :nite;
    END
    IF (conc_otroconc = 'S') THEN
    BEGIN
    anosum = CAST(ano AS INTEGER);
    anosum = anosum - 1;
    SELECT SUM (noco_valor) FROM nomina_conceptos n WHERE n.noco_ano = :anosum AND n.conc_cod = :conc_codotroconc AND N.terc_nit = :nite INTO :valor;
    UPDATE nomina_conceptos SET noco_pagook = 'S' WHERE noco_ano = :anosum AND conc_cod = :conc_codotroconc AND terc_nit = :nite;
    END
/*SI EL CONCEPTO ES UN APORTE*/
IF (conc_aporte = 'S') THEN
BEGIN
    IF ((:entidad = '' ) OR (entidad IS NULL)) THEN
    BEGIN
     SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
     IF (comision IS NULL) THEN
     comision = 0;
     valor = :basico + :comision;
    IF ((conc_cod = 904) OR (conc_cod = 905) OR (conc_cod = 906)) THEN
            BEGIN
            entidad = :nitafp;
                IF (conc_cod = 904) THEN
                BEGIN
                SELECT A.paan_afptr FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = ((((:basico )/30 * :diaslab ) + :comision) * :PORCEN) /100;
                END
                ELSE
                IF ((conc_cod = 905) OR (conc_cod = 906)) THEN
                BEGIN
                SELECT A.paan_afpem FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = ((((:basico )/30 * :diaslab ) + :comision) * :PORCEN) /100;
                END
                EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
            END
            ELSE
       IF ((conc_cod = 907) OR (conc_cod = 914) OR (conc_cod = 915)) THEN
            BEGIN
            entidad = :niteps;
                IF (conc_cod = 907) THEN
                BEGIN
                SELECT A.paan_epstr FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = ((((:basico )/30 * :diaslab ) + :comision) * :PORCEN) /100;
                END
                ELSE
                IF ((conc_cod = 914) OR (conc_cod = 915)) THEN
                BEGIN
                SELECT A.paan_epsem FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = ((((:basico )/30 * :diaslab ) + :comision) * :PORCEN) /100;
                END
                EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
            END
            ELSE
       IF ((conc_cod = 910) OR (conc_cod = 911) OR (conc_cod = 916) OR (conc_cod = 917) OR (conc_cod = 918) OR (conc_cod = 919)) THEN
            BEGIN
            entidad = :nitccf;
            SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
            IF (comision IS NULL) THEN
            comision = 0;
                IF ((conc_cod = 910) OR (conc_cod = 911) ) THEN
                BEGIN
                SELECT A.paan_ccf FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = ((((:basico )/30 * :diaslab ) + :comision) * :PORCEN) /100;
                EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
                END
                ELSE
                IF ((conc_cod = 916) OR (conc_cod = 917)) THEN
                BEGIN
                SELECT A.paan_icbf FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = ((((:basico )/30 * :diaslab ) + :comision) * :PORCEN) /100;
                EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
                END
                ELSE
                IF ((conc_cod = 918) OR (conc_cod = 919)) THEN
                BEGIN
                SELECT A.paan_sena FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = ((((:basico )/30 * :diaslab ) + :comision) * :PORCEN) /100;
                EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
                END
            END
            ELSE
        IF ((conc_cod = 912) OR (conc_cod = 913)) THEN
            BEGIN
            entidad = :nitafc;
            SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
            IF (comision IS NULL) THEN
            comision = 0;
                IF ((conc_cod = 912) OR (conc_cod = 913) ) THEN
                BEGIN
                SELECT A.paan_cesemp FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = (((:basico + :comision)/30 * :diaslab ) * :PORCEN) /100;
                EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
                END
            END
            ELSE
        BEGIN
        SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
        IF (comision IS NULL) THEN
        comision = 0;
        conc_monto = :basico + :comision;
        IF (conc_porc <> 0 AND conc_porc IS NOT NULL) THEN
        VALOR = ((:CONC_MONTO/30 * :diaslab ) * :conc_porc) /100;
        ELSE
        VALOR = ((:CONC_MONTO/30 * :diaslab ) * :porcen) /100;
        EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
        END
    END
    END
    ELSE
    BEGIN
    IF (conc_prov = 'S') THEN
    BEGIN
        conc_monto = :basico;
        IF (conc_porc <> 0 AND conc_porc IS NOT NULL) THEN
        VALOR = ((:CONC_MONTO/30 * :diaslab ) * :conc_porc) /100;
        ELSE
        VALOR = ((:CONC_MONTO/30 * :diaslab ) * :porcen) /100;
        EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
    END
    END
item = :item + 1;
END
    IF (liquidaper = 0) THEN
    INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
    VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
    ELSE
    IF (liquidaper = 1) THEN
    BEGIN
    rmod = mod(:periodo, 2);
    IF (rmod = 0) THEN
        INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
        VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
    END
    ELSE
    IF (liquidaper = 2) THEN
    BEGIN
    rmod = mod(:periodo, 4);
    IF (rmod = 0) THEN
        INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
        VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
    END
END
END
END
END
SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE CAUSA_NOMINA(
    FEC DATE,
    PERIODO INTEGER,
    PERIODICIDAD INTEGER,
    PAGOGLOBAL CHAR(1),
    ANO CHAR(4))
RETURNS (
    IDNOMINA INTEGER)
AS
DECLARE VARIABLE item INTEGER;
DECLARE VARIABLE nite VARCHAR(20) CHARACTER SET none;
DECLARE VARIABLE nit_tercero VARCHAR(20);
DECLARE VARIABLE concept INTEGER;
DECLARE VARIABLE montos NUMERIC(18,2);
DECLARE VARIABLE porcen NUMERIC(9,4);
DECLARE VARIABLE entidad VARCHAR(20);
DECLARE VARIABLE conc_cod INTEGER;
DECLARE VARIABLE conc_deduc CHAR(1);
DECLARE VARIABLE conc_porc NUMERIC(9,4);
DECLARE VARIABLE conc_entidad INTEGER;
DECLARE VARIABLE conc_monto NUMERIC(18,2);
DECLARE VARIABLE conc_modifi CHAR(1);
DECLARE VARIABLE conc_promedio CHAR(1);
DECLARE VARIABLE emco_perprom INTEGER;
DECLARE VARIABLE valor NUMERIC(18,2);
DECLARE VARIABLE diaslab INTEGER;
DECLARE VARIABLE conc_prov CHAR(1);
DECLARE VARIABLE conc_aporte CHAR(1);
DECLARE VARIABLE numeroprom INTEGER;
DECLARE VARIABLE conc_aplicaprom CHAR(1);
DECLARE VARIABLE perinicial INTEGER;
DECLARE VARIABLE anoprom INTEGER;
DECLARE VARIABLE conc_dias CHAR(1);
DECLARE VARIABLE conc_otroconc CHAR(1);
DECLARE VARIABLE conc_codotroconc INTEGER;
DECLARE VARIABLE anosum INTEGER;
DECLARE VARIABLE salario CHAR(1) CHARACTER SET none;
DECLARE VARIABLE liquidaper INTEGER;
DECLARE VARIABLE rmod NUMERIC(2,2);
DECLARE VARIABLE basico NUMERIC(18,2);
DECLARE VARIABLE niteps VARCHAR(20);
DECLARE VARIABLE nitafc VARCHAR(20);
DECLARE VARIABLE nitafp VARCHAR(20);
DECLARE VARIABLE nitccf VARCHAR(20);
DECLARE VARIABLE gtoempr CHAR(1);
DECLARE VARIABLE comision NUMERIC(18,2);
BEGIN
/*SI ES QUINCENAL*/
IF (periodicidad = 2) THEN
BEGIN
EXECUTE PROCEDURE cambie_id_nomina RETURNING_VALUES(:idnomina);
INSERT INTO nomina (nomi_id, NOMI_FECCAUSA, NOMI_PAGOGLOBAL, NOMI_PERIODOCIDAD, NOMI_PERIODO, NOMI_ANO, NOMI_LIQOK)
VALUES (:IDNOMINA, :fec,:pagoglobal, :periodicidad, :periodo, :ano, 'N');
 BEGIN
    item = 1;
    FOR SELECT E.TERC_NIT, E.empl_salario, e.empl_eps, e.empl_afc, e.empl_afp, e.empl_ccf
    FROM EMPLEADOS E
    WHERE E.empl_ppago = 2
    INTO :nite, :basico, :niteps, :nitafc, :nitafp, :nitccf
    DO
    BEGIN
    FOR SELECT CE.TERC_NIT, CE.CONC_COD, CE.EMCO_MONTO, CE.EMCO_PORC, ce.empl_entidad, CE.emco_perprom, CE.emco_luquidaper,    CN.CONC_COD, CN.CONC_DEDUC,CN.CONC_PORC, CN.CONC_ENTIDAD, CN.CONC_MONTO,  CN.CONC_DIAS, CN.CONC_MODIFI,
    CN.CONC_PROMEDIO, CN.conc_salario, CE.emco_perprom, CN.conc_prov, CN.conc_aporte, CN.conc_aplicaprom, cn.conc_otroconc, cn.conc_codotroconc, CN.conc_gtoempr
    FROM empleado_conceptos CE, CONCEPTOS_NOMINA CN WHERE ((CE.terc_nit = :nite) AND (CE.CONC_COD = CN.CONC_COD) AND (CN.conc_fecini <= :fec AND CN.conc_fecfin >= :FEC) ) OR ((CE.terc_nit = :nite)
    AND (CE.CONC_COD = CN.CONC_COD) AND (cn.conc_todosper = 'N') AND (CE.emco_ppago = :periodo)) OR  ((CE.terc_nit = :nite) AND (CE.CONC_COD = CN.CONC_COD) AND cn.conc_todosper = 'S')  ORDER BY (TERC_NIT )
    INTO :nit_tercero, :concept,  :montos, :porcen, :entidad, :numeroprom, :liquidaper ,:CONC_COD, :CONC_DEDUC, :CONC_PORC,
    :CONC_ENTIDAD, :CONC_MONTO, :CONC_DIAS, :CONC_MODIFI,:CONC_PROMEDIO, :salario,:EMCO_PERPROM, :conc_prov, :conc_aporte , :CONC_APLICAPROM, :conc_otroconc, :conc_codotroconc, :gtoempr
    DO
BEGIN
    IF (conc_dias = 'S') THEN
    EXECUTE PROCEDURE DIAS_LABORADOS (:nite, :periodo) RETURNING_VALUES (:diaslab);
    ELSE
    BEGIN
    IF (liquidaper = 0) THEN
    diaslab = 15;
    ELSE
    IF (liquidaper = 1) THEN
    diaslab = 30;
    ELSE
    IF (liquidaper = 2) THEN
    diaslab = 60;
    END
 IF (conc_cod = 920) THEN
 BEGIN
 SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :valor;
 IF (valor IS NULL) THEN
 valor = 0;
 item = :item + 1;
 END
 ELSE
 BEGIN
    IF ((:montos = 0) OR (:montos IS NULL)) THEN
      BEGIN
      IF ((CONC_PORC = 0 AND :porcen = 0) OR (CONC_PORC IS NULL AND :porcen = 0) OR (CONC_PORC = 0 AND :porcen IS NULL) OR (CONC_PORC IS NULL AND :porcen IS NULL) ) THEN
        BEGIN
        IF ((conc_monto <> 0) AND (conc_monto IS NOT NULL) ) THEN
        BEGIN
        VALOR = :CONC_MONTO/30 * :diaslab;
        EXECUTE PROCEDURE REDONDEE(:valor, 5) RETURNING_VALUES (VALOR);
        END
        ELSE
        IF (salario = 'S' AND CONC_COD <> 900) THEN
        BEGIN
        conc_monto = :basico;
        VALOR = (:conc_monto/30 * :diaslab );
        EXECUTE PROCEDURE REDONDEE(:valor, 5) RETURNING_VALUES (VALOR);
        END
        ELSE
        valor = montos;
        END
       ELSE
       BEGIN
        IF (:porcen <> 0) THEN
          BEGIN
            IF ((conc_monto <> 0) AND (conc_monto IS NOT NULL) ) THEN
            BEGIN
              VALOR = ((:CONC_MONTO/30 * :diaslab ) * :PORCEN) /100;
              EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
            END
            ELSE
        IF (salario = 'S' AND CONC_COD <> 900) THEN
            BEGIN
              conc_monto = :basico;
              VALOR = ((:CONC_MONTO/30 * :diaslab ) * :PORCEN) /100;
              EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
            END
          END
          ELSE
          BEGIN
            IF ((conc_monto <> 0) AND (conc_monto IS NOT NULL) ) THEN
            BEGIN
              VALOR = ((:CONC_MONTO/30 * :diaslab ) * :conc_porc) /100;
              EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
            END
            ELSE
        IF (salario = 'S' AND CONC_COD <> 900) THEN
            BEGIN
              conc_monto = :basico;
              VALOR = ((:CONC_MONTO/30 * :diaslab ) * :conc_porc) /100;
              EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
            END
          END
       END
      END
    ELSE
    BEGIN
      IF (CONC_PORC = 0 AND :porcen = 0) THEN
      BEGIN
      VALOR = (:montos/30 * :diaslab );
      EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
      END
      ELSE
      BEGIN
        IF (:porcen <> 0) THEN
          BEGIN
          VALOR = ((:MONTOS/30 * :diaslab ) * :PORCEN) /100;
          EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
          END
          ELSE
          BEGIN
          VALOR = ((:montos/30 * :diaslab ) * :CONC_PORC) /100;
          END
          EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
       END
   END
    IF (conc_promedio = 'S') THEN
    BEGIN
    perinicial = :periodo - (:numeroprom) + 1;
    anoprom = CAST (ano AS INTEGER);
    IF (perinicial <= 0) THEN
    BEGIN
    perinicial = 24 + :PERINICIAL;
    anoprom = CAST(ANO AS INTEGER) - 1;
    END
    SELECT SUM (noco_valor) FROM nomina_conceptos n WHERE n.noco_aplicaprom = 'S' AND N.noco_periodo >= :perinicial - 1 AND N.noco_periodo < :periodo AND N.noco_ano >= :anoprom AND N.noco_ano <= :ano AND terc_nit = :nite INTO :valor;
    valor = (valor / numeroprom)/*/ 30 * :diaslab*/;
    EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
    UPDATE nomina_conceptos N SET noco_pagook = 'S' WHERE n.noco_aplicaprom = 'S' AND N.noco_periodo >= :perinicial - 1 AND N.noco_periodo < :periodo AND N.noco_ano >= :anoprom AND N.noco_ano <= :ano AND terc_nit = :nite;
    END
    IF (conc_otroconc = 'S') THEN
    BEGIN
    anosum = CAST(ano AS INTEGER);
    anosum = anosum - 1;
    SELECT SUM (noco_valor) FROM nomina_conceptos n WHERE n.noco_ano = :anosum AND n.conc_cod = :conc_codotroconc AND N.terc_nit = :nite INTO :valor;
    UPDATE nomina_conceptos SET noco_pagook = 'S' WHERE noco_ano = :anosum AND conc_cod = :conc_codotroconc AND terc_nit = :nite;
    END
/*SI EL CONCEPTO ES UN APORTE*/
IF (conc_aporte = 'S') THEN
BEGIN
    IF ((:entidad = '' ) OR (entidad IS NULL)) THEN
    BEGIN
     SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
     IF (comision IS NULL) THEN
     comision = 0;
     valor = :basico + :comision;
    IF ((conc_cod = 904) OR (conc_cod = 905) OR (conc_cod = 906)) THEN
            BEGIN
            entidad = :nitafp;
                IF (conc_cod = 904) THEN
                BEGIN
                SELECT A.paan_afptr FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = ((((:basico )/30 * :diaslab ) + :comision) * :PORCEN) /100;
                END
                ELSE
                IF ((conc_cod = 905) OR (conc_cod = 906)) THEN
                BEGIN
                SELECT A.paan_afpem FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = ((((:basico )/30 * :diaslab ) + :comision) * :PORCEN) /100;
                END
                EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
            END
            ELSE
       IF ((conc_cod = 907) OR (conc_cod = 914) OR (conc_cod = 915)) THEN
            BEGIN
            entidad = :niteps;
                IF (conc_cod = 907) THEN
                BEGIN
                SELECT A.paan_epstr FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = ((((:basico )/30 * :diaslab ) + :comision) * :PORCEN) /100;
                END
                ELSE
                IF ((conc_cod = 914) OR (conc_cod = 915)) THEN
                BEGIN
                SELECT A.paan_epsem FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = ((((:basico )/30 * :diaslab ) + :comision) * :PORCEN) /100;
                END
                EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
            END
            ELSE
       IF ((conc_cod = 910) OR (conc_cod = 911) OR (conc_cod = 916) OR (conc_cod = 917) OR (conc_cod = 918) OR (conc_cod = 919)) THEN
            BEGIN
            entidad = :nitccf;
            SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
            IF (comision IS NULL) THEN
            comision = 0;
                IF ((conc_cod = 910) OR (conc_cod = 911) ) THEN
                BEGIN
                SELECT A.paan_ccf FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = ((((:basico )/30 * :diaslab ) + :comision) * :PORCEN) /100;
                EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
                END
                ELSE
                IF ((conc_cod = 916) OR (conc_cod = 917)) THEN
                BEGIN
                SELECT A.paan_icbf FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = ((((:basico )/30 * :diaslab ) + :comision) * :PORCEN) /100;
                EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
                END
                ELSE
                IF ((conc_cod = 918) OR (conc_cod = 919)) THEN
                BEGIN
                SELECT A.paan_sena FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = ((((:basico )/30 * :diaslab ) + :comision) * :PORCEN) /100;
                EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
                END
            END
            ELSE
        IF ((conc_cod = 912) OR (conc_cod = 913)) THEN
            BEGIN
            entidad = :nitafc;
            SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
            IF (comision IS NULL) THEN
            comision = 0;
                IF ((conc_cod = 912) OR (conc_cod = 913) ) THEN
                BEGIN
                SELECT A.paan_cesemp FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = (((:basico + :comision)/30 * :diaslab ) * :PORCEN) /100;
                EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
                END
            END
            ELSE
        BEGIN
        SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
        IF (comision IS NULL) THEN
        comision = 0;
        conc_monto = :basico + :comision;
        IF (conc_porc <> 0 AND conc_porc IS NOT NULL) THEN
        VALOR = ((:CONC_MONTO/30 * :diaslab ) * :conc_porc) /100;
        ELSE
        IF (:porcen <> 0 AND :porcen IS NOT NULL) THEN
        VALOR = ((:CONC_MONTO/30 * :diaslab ) * :porcen) /100;
        ELSE
        IF (:montos <> 0 AND :montos IS NOT NULL) THEN
        valor = :montos;
        ELSE
        IF (:conc_monto <> 0 AND :conc_monto IS NOT NULL) THEN
        valor = :conc_monto;
        EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
        END
    END
    END
    ELSE
    BEGIN
    IF (conc_prov = 'S') THEN
    BEGIN
        conc_monto = :basico;
        IF (conc_porc <> 0 AND conc_porc IS NOT NULL) THEN
        VALOR = ((:CONC_MONTO/30 * :diaslab ) * :conc_porc) /100;
        ELSE
        VALOR = ((:CONC_MONTO/30 * :diaslab ) * :porcen) /100;
        EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
    END
    END
item = :item + 1;
END
    IF (liquidaper = 0) THEN
    INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
    VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
    ELSE
    IF (liquidaper = 1) THEN
    BEGIN
    rmod = mod(:periodo, 2);
    IF (rmod = 0) THEN
        INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
        VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
    END
    ELSE
    IF (liquidaper = 2) THEN
    BEGIN
    rmod = mod(:periodo, 4);
    IF (rmod = 0) THEN
        INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
        VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
    END
END
END
END
END
ELSE
/*SI ES MENSUAL*/
IF (periodicidad = 1) THEN
BEGIN
EXECUTE PROCEDURE cambie_id_nomina RETURNING_VALUES(:idnomina);
INSERT INTO nomina (nomi_id, NOMI_FECCAUSA, NOMI_PAGOGLOBAL, NOMI_PERIODOCIDAD, NOMI_PERIODO, NOMI_ANO, NOMI_LIQOK)
VALUES (:IDNOMINA, :fec,:pagoglobal, :periodicidad, :periodo, :ano, 'N');
    BEGIN
    item = 1;
    FOR SELECT E.TERC_NIT, E.empl_salario, e.empl_eps, e.empl_afc, e.empl_afp, e.empl_ccf
    FROM EMPLEADOS E
    WHERE E.empl_ppago = 1
    INTO :nite, :basico, :niteps, :nitafc, :nitafp, :nitccf
    DO
    FOR SELECT CE.TERC_NIT, CE.CONC_COD, CE.EMCO_MONTO, CE.EMCO_PORC, ce.empl_entidad, CE.emco_perprom, CE.emco_luquidaper,    CN.CONC_COD, CN.CONC_DEDUC,CN.CONC_PORC, CN.CONC_ENTIDAD, CN.CONC_MONTO,  CN.CONC_DIAS, CN.CONC_MODIFI,
    CN.CONC_PROMEDIO, CN.conc_salario, CE.emco_perprom, CN.conc_prov, CN.conc_aporte, CN.conc_aplicaprom, cn.conc_otroconc, cn.conc_codotroconc, CN.conc_gtoempr
    FROM empleado_conceptos CE, CONCEPTOS_NOMINA CN WHERE ((CE.terc_nit = :nite) AND (CE.CONC_COD = CN.CONC_COD) AND (CN.conc_fecini <= :fec AND CN.conc_fecfin >= :FEC) ) OR ((CE.terc_nit = :nite)
    AND (CE.CONC_COD = CN.CONC_COD) AND (cn.conc_todosper = 'N') AND (CE.emco_ppago = :periodo)) OR  ((CE.terc_nit = :nite) AND (CE.CONC_COD = CN.CONC_COD) AND cn.conc_todosper = 'S')  ORDER BY (TERC_NIT)
    INTO :nit_tercero, :concept,  :montos, :porcen, :entidad, :numeroprom, :liquidaper ,:CONC_COD, :CONC_DEDUC, :CONC_PORC,
    :CONC_ENTIDAD, :CONC_MONTO, :CONC_DIAS, :CONC_MODIFI,:CONC_PROMEDIO, :salario,:EMCO_PERPROM, :conc_prov, :conc_aporte , :CONC_APLICAPROM, :conc_otroconc, :conc_codotroconc, :gtoempr    DO
BEGIN
    IF (conc_dias = 'S') THEN
    EXECUTE PROCEDURE DIAS_LABORADOS (:nite, :periodo) RETURNING_VALUES (:diaslab);
    ELSE
    BEGIN
    IF (liquidaper = 0) THEN
    diaslab = 30;
    ELSE
    IF (liquidaper = 1) THEN
    diaslab = 60;
    ELSE
    IF (liquidaper = 2) THEN
    diaslab = 120;
    END
 IF (conc_cod = 920) THEN
 BEGIN
 SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :valor;
 IF (valor IS NULL) THEN
 valor = 0;
 item = :item + 1;
 END
 ELSE
 BEGIN
    IF ((:montos = 0) OR (:montos IS NULL)) THEN
      BEGIN
      IF ((CONC_PORC = 0 AND :porcen = 0) OR (CONC_PORC IS NULL AND :porcen = 0) OR (CONC_PORC = 0 AND :porcen IS NULL) OR (CONC_PORC IS NULL AND :porcen IS NULL) ) THEN
        BEGIN
        IF ((conc_monto <> 0) AND (conc_monto IS NOT NULL) ) THEN
        BEGIN
        VALOR = :CONC_MONTO/30 * :diaslab;
        EXECUTE PROCEDURE REDONDEE(:valor, 5) RETURNING_VALUES (VALOR);
        END
        ELSE
        IF (salario = 'S' AND CONC_COD <> 900) THEN
        BEGIN
        conc_monto = :basico;
        VALOR = (:conc_monto/30 * :diaslab );
        EXECUTE PROCEDURE REDONDEE(:valor, 5) RETURNING_VALUES (VALOR);
        END
        ELSE
        valor = montos;
        END
       ELSE
       BEGIN
        IF (:porcen <> 0) THEN
          BEGIN
            IF ((conc_monto <> 0) AND (conc_monto IS NOT NULL) ) THEN
            BEGIN
              VALOR = ((:CONC_MONTO/30 * :diaslab ) * :PORCEN) /100;
              EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
            END
            ELSE
        IF (salario = 'S' AND CONC_COD <> 900) THEN
            BEGIN
              conc_monto = :basico;
              VALOR = ((:CONC_MONTO/30 * :diaslab ) * :PORCEN) /100;
              EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
            END
          END
          ELSE
          BEGIN
            IF ((conc_monto <> 0) AND (conc_monto IS NOT NULL) ) THEN
            BEGIN
              VALOR = ((:CONC_MONTO/30 * :diaslab ) * :conc_porc) /100;
              EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
            END
            ELSE
        IF (salario = 'S' AND CONC_COD <> 900) THEN
            BEGIN
              conc_monto = :basico;
              VALOR = ((:CONC_MONTO/30 * :diaslab ) * :conc_porc) /100;
              EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
            END
          END
       END
      END
    ELSE
    BEGIN
      IF (CONC_PORC = 0 AND :porcen = 0) THEN
      BEGIN
      VALOR = (:montos/30 * :diaslab );
      EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
      END
      ELSE
      BEGIN
        IF (:porcen <> 0) THEN
          BEGIN
          VALOR = ((:MONTOS/30 * :diaslab ) * :PORCEN) /100;
          EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
          END
          ELSE
          BEGIN
          VALOR = ((:montos/30 * :diaslab ) * :CONC_PORC) /100;
          END
          EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
       END
   END
    IF (conc_promedio = 'S') THEN
    BEGIN
    perinicial = :periodo - (:numeroprom) + 1;
    anoprom = CAST (ano AS INTEGER);
    IF (perinicial <= 0) THEN
    BEGIN
    perinicial = 24 + :PERINICIAL;
    anoprom = CAST(ANO AS INTEGER) - 1;
    END
    SELECT SUM (noco_valor) FROM nomina_conceptos n WHERE n.noco_aplicaprom = 'S' AND N.noco_periodo >= :perinicial - 1 AND N.noco_periodo < :periodo AND N.noco_ano >= :anoprom AND N.noco_ano <= :ano AND terc_nit = :nite INTO :valor;
    valor = (valor / numeroprom)/*/ 30 * :diaslab*/;
    EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
    UPDATE nomina_conceptos N SET noco_pagook = 'S' WHERE n.noco_aplicaprom = 'S' AND N.noco_periodo >= :perinicial - 1 AND N.noco_periodo < :periodo AND N.noco_ano >= :anoprom AND N.noco_ano <= :ano AND terc_nit = :nite;
    END
    IF (conc_otroconc = 'S') THEN
    BEGIN
    anosum = CAST(ano AS INTEGER);
    anosum = anosum - 1;
    SELECT SUM (noco_valor) FROM nomina_conceptos n WHERE n.noco_ano = :anosum AND n.conc_cod = :conc_codotroconc AND N.terc_nit = :nite INTO :valor;
    UPDATE nomina_conceptos SET noco_pagook = 'S' WHERE noco_ano = :anosum AND conc_cod = :conc_codotroconc AND terc_nit = :nite;
    END
/*SI EL CONCEPTO ES UN APORTE*/
IF (conc_aporte = 'S') THEN
BEGIN
    IF ((:entidad = '' ) OR (entidad IS NULL)) THEN
    BEGIN
     SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
     IF (comision IS NULL) THEN
     comision = 0;
     valor = :basico + :comision;
    IF ((conc_cod = 904) OR (conc_cod = 905) OR (conc_cod = 906)) THEN
            BEGIN
            entidad = :nitafp;
                IF (conc_cod = 904) THEN
                BEGIN
                SELECT A.paan_afptr FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = ((((:basico )/30 * :diaslab ) + :comision) * :PORCEN) /100;
                END
                ELSE
                IF ((conc_cod = 905) OR (conc_cod = 906)) THEN
                BEGIN
                SELECT A.paan_afpem FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = ((((:basico )/30 * :diaslab ) + :comision) * :PORCEN) /100;
                END
                EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
            END
            ELSE
       IF ((conc_cod = 907) OR (conc_cod = 914) OR (conc_cod = 915)) THEN
            BEGIN
            entidad = :niteps;
                IF (conc_cod = 907) THEN
                BEGIN
                SELECT A.paan_epstr FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = ((((:basico )/30 * :diaslab ) + :comision) * :PORCEN) /100;
                END
                ELSE
                IF ((conc_cod = 914) OR (conc_cod = 915)) THEN
                BEGIN
                SELECT A.paan_epsem FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = ((((:basico )/30 * :diaslab ) + :comision) * :PORCEN) /100;
                END
                EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
            END
            ELSE
       IF ((conc_cod = 910) OR (conc_cod = 911) OR (conc_cod = 916) OR (conc_cod = 917) OR (conc_cod = 918) OR (conc_cod = 919)) THEN
            BEGIN
            entidad = :nitccf;
            SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
            IF (comision IS NULL) THEN
            comision = 0;
                IF ((conc_cod = 910) OR (conc_cod = 911) ) THEN
                BEGIN
                SELECT A.paan_ccf FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = ((((:basico )/30 * :diaslab ) + :comision) * :PORCEN) /100;
                EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
                END
                ELSE
                IF ((conc_cod = 916) OR (conc_cod = 917)) THEN
                BEGIN
                SELECT A.paan_icbf FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = ((((:basico )/30 * :diaslab ) + :comision) * :PORCEN) /100;
                EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
                END
                ELSE
                IF ((conc_cod = 918) OR (conc_cod = 919)) THEN
                BEGIN
                SELECT A.paan_sena FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = ((((:basico )/30 * :diaslab ) + :comision) * :PORCEN) /100;
                EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
                END
            END
            ELSE
        IF ((conc_cod = 912) OR (conc_cod = 913)) THEN
            BEGIN
            entidad = :nitafc;
            SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
            IF (comision IS NULL) THEN
            comision = 0;
                IF ((conc_cod = 912) OR (conc_cod = 913) ) THEN
                BEGIN
                SELECT A.paan_cesemp FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = (((:basico + :comision)/30 * :diaslab ) * :PORCEN) /100;
                EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
                END
            END
            ELSE
        BEGIN
        SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
        IF (comision IS NULL) THEN
        comision = 0;
        conc_monto = :basico + :comision;
        IF (conc_porc <> 0 AND conc_porc IS NOT NULL) THEN
        VALOR = ((:CONC_MONTO/30 * :diaslab ) * :conc_porc) /100;
        ELSE
        VALOR = ((:CONC_MONTO/30 * :diaslab ) * :porcen) /100;
        EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
        END
    END
    END
    ELSE
    BEGIN
    IF (conc_prov = 'S') THEN
    BEGIN
        conc_monto = :basico;
        IF (conc_porc <> 0 AND conc_porc IS NOT NULL) THEN
        VALOR = ((:CONC_MONTO/30 * :diaslab ) * :conc_porc) /100;
        ELSE
        VALOR = ((:CONC_MONTO/30 * :diaslab ) * :porcen) /100;
        EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
    END
    END
item = :item + 1;
END
    IF (liquidaper = 0) THEN
    INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
    VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
    ELSE
    IF (liquidaper = 1) THEN
    BEGIN
    rmod = mod(:periodo, 2);
    IF (rmod = 0) THEN
        INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
        VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
    END
    ELSE
    IF (liquidaper = 2) THEN
    BEGIN
    rmod = mod(:periodo, 4);
    IF (rmod = 0) THEN
        INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
        VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
    END
END
END
END
ELSE
/*SI ES SEMANAL*/
IF (periodicidad = 3) THEN
BEGIN
EXECUTE PROCEDURE cambie_id_nomina RETURNING_VALUES(:idnomina);
INSERT INTO nomina (nomi_id, NOMI_FECCAUSA, NOMI_PAGOGLOBAL, NOMI_PERIODOCIDAD, NOMI_PERIODO, NOMI_ANO, NOMI_LIQOK)
VALUES (:IDNOMINA, :fec,:pagoglobal, :periodicidad, :periodo, :ano, 'N');
    BEGIN
    item = 1;
    FOR SELECT E.TERC_NIT, E.empl_salario, e.empl_eps, e.empl_afc, e.empl_afp, e.empl_ccf
    FROM EMPLEADOS E
    WHERE E.empl_ppago = 3
    INTO :nite, :basico, :niteps, :nitafc, :nitafp, :nitccf
    DO
    BEGIN
    FOR SELECT CE.TERC_NIT, CE.CONC_COD, CE.EMCO_MONTO, CE.EMCO_PORC, ce.empl_entidad, CE.emco_perprom, CE.emco_luquidaper,    CN.CONC_COD, CN.CONC_DEDUC,CN.CONC_PORC, CN.CONC_ENTIDAD, CN.CONC_MONTO,  CN.CONC_DIAS, CN.CONC_MODIFI,
    CN.CONC_PROMEDIO, CN.conc_salario, CE.emco_perprom, CN.conc_prov, CN.conc_aporte, CN.conc_aplicaprom, cn.conc_otroconc, cn.conc_codotroconc, CN.conc_gtoempr
    FROM empleado_conceptos CE, CONCEPTOS_NOMINA CN WHERE ((CE.terc_nit = :nite) AND (CE.CONC_COD = CN.CONC_COD) AND (CN.conc_fecini <= :fec AND CN.conc_fecfin >= :FEC) ) OR ((CE.terc_nit = :nite)
    AND (CE.CONC_COD = CN.CONC_COD) AND (cn.conc_todosper = 'N') AND (CE.emco_ppago = :periodo)) OR  ((CE.terc_nit = :nite) AND (CE.CONC_COD = CN.CONC_COD) AND cn.conc_todosper = 'S')  ORDER BY (TERC_NIT)
    INTO :nit_tercero, :concept,  :montos, :porcen, :entidad, :numeroprom, :liquidaper ,:CONC_COD, :CONC_DEDUC, :CONC_PORC,
    :CONC_ENTIDAD, :CONC_MONTO, :CONC_DIAS, :CONC_MODIFI,:CONC_PROMEDIO, :salario,:EMCO_PERPROM, :conc_prov, :conc_aporte , :CONC_APLICAPROM, :conc_otroconc, :conc_codotroconc, :gtoempr
    DO
BEGIN
    IF (conc_dias = 'S') THEN
    EXECUTE PROCEDURE DIAS_LABORADOS (:nite, :periodo) RETURNING_VALUES (:diaslab);
    ELSE
    BEGIN
    IF (liquidaper = 0) THEN
    diaslab = 7;
    ELSE
    IF (liquidaper = 1) THEN
    diaslab = 15;
    ELSE
    IF (liquidaper = 2) THEN
    diaslab = 30;
    END
 IF (conc_cod = 920) THEN
 BEGIN
 SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :valor;
 IF (valor IS NULL) THEN
 valor = 0;
 item = :item + 1;
 END
 ELSE
 BEGIN
    IF ((:montos = 0) OR (:montos IS NULL)) THEN
      BEGIN
      IF ((CONC_PORC = 0 AND :porcen = 0) OR (CONC_PORC IS NULL AND :porcen = 0) OR (CONC_PORC = 0 AND :porcen IS NULL) OR (CONC_PORC IS NULL AND :porcen IS NULL) ) THEN
        BEGIN
        IF ((conc_monto <> 0) AND (conc_monto IS NOT NULL) ) THEN
        BEGIN
        VALOR = :CONC_MONTO/30 * :diaslab;
        EXECUTE PROCEDURE REDONDEE(:valor, 5) RETURNING_VALUES (VALOR);
        END
        ELSE
        IF (salario = 'S' AND CONC_COD <> 900) THEN
        BEGIN
        conc_monto = :basico;
        VALOR = (:conc_monto/30 * :diaslab );
        EXECUTE PROCEDURE REDONDEE(:valor, 5) RETURNING_VALUES (VALOR);
        END
        ELSE
        valor = montos;
        END
       ELSE
       BEGIN
        IF (:porcen <> 0) THEN
          BEGIN
            IF ((conc_monto <> 0) AND (conc_monto IS NOT NULL) ) THEN
            BEGIN
              VALOR = ((:CONC_MONTO/30 * :diaslab ) * :PORCEN) /100;
              EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
            END
            ELSE
        IF (salario = 'S' AND CONC_COD <> 900) THEN
            BEGIN
              conc_monto = :basico;
              VALOR = ((:CONC_MONTO/30 * :diaslab ) * :PORCEN) /100;
              EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
            END
          END
          ELSE
          BEGIN
            IF ((conc_monto <> 0) AND (conc_monto IS NOT NULL) ) THEN
            BEGIN
              VALOR = ((:CONC_MONTO/30 * :diaslab ) * :conc_porc) /100;
              EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
            END
            ELSE
        IF (salario = 'S' AND CONC_COD <> 900) THEN
            BEGIN
              conc_monto = :basico;
              VALOR = ((:CONC_MONTO/30 * :diaslab ) * :conc_porc) /100;
              EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
            END
          END
       END
      END
    ELSE
    BEGIN
      IF (CONC_PORC = 0 AND :porcen = 0) THEN
      BEGIN
      VALOR = (:montos/30 * :diaslab );
      EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
      END
      ELSE
      BEGIN
        IF (:porcen <> 0) THEN
          BEGIN
          VALOR = ((:MONTOS/30 * :diaslab ) * :PORCEN) /100;
          EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
          END
          ELSE
          BEGIN
          VALOR = ((:montos/30 * :diaslab ) * :CONC_PORC) /100;
          END
          EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
       END
   END
    IF (conc_promedio = 'S') THEN
    BEGIN
    perinicial = :periodo - (:numeroprom) + 1;
    anoprom = CAST (ano AS INTEGER);
    IF (perinicial <= 0) THEN
    BEGIN
    perinicial = 24 + :PERINICIAL;
    anoprom = CAST(ANO AS INTEGER) - 1;
    END
    SELECT SUM (noco_valor) FROM nomina_conceptos n WHERE n.noco_aplicaprom = 'S' AND N.noco_periodo >= :perinicial - 1 AND N.noco_periodo < :periodo AND N.noco_ano >= :anoprom AND N.noco_ano <= :ano AND terc_nit = :nite INTO :valor;
    valor = (valor / numeroprom)/*/ 30 * :diaslab*/;
    EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
    UPDATE nomina_conceptos N SET noco_pagook = 'S' WHERE n.noco_aplicaprom = 'S' AND N.noco_periodo >= :perinicial - 1 AND N.noco_periodo < :periodo AND N.noco_ano >= :anoprom AND N.noco_ano <= :ano AND terc_nit = :nite;
    END
    IF (conc_otroconc = 'S') THEN
    BEGIN
    anosum = CAST(ano AS INTEGER);
    anosum = anosum - 1;
    SELECT SUM (noco_valor) FROM nomina_conceptos n WHERE n.noco_ano = :anosum AND n.conc_cod = :conc_codotroconc AND N.terc_nit = :nite INTO :valor;
    UPDATE nomina_conceptos SET noco_pagook = 'S' WHERE noco_ano = :anosum AND conc_cod = :conc_codotroconc AND terc_nit = :nite;
    END
/*SI EL CONCEPTO ES UN APORTE*/
IF (conc_aporte = 'S') THEN
BEGIN
    IF ((:entidad = '' ) OR (entidad IS NULL)) THEN
    BEGIN
     SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
     IF (comision IS NULL) THEN
     comision = 0;
     valor = :basico + :comision;
    IF ((conc_cod = 904) OR (conc_cod = 905) OR (conc_cod = 906)) THEN
            BEGIN
            entidad = :nitafp;
                IF (conc_cod = 904) THEN
                BEGIN
                SELECT A.paan_afptr FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = ((((:basico )/30 * :diaslab ) + :comision) * :PORCEN) /100;
                END
                ELSE
                IF ((conc_cod = 905) OR (conc_cod = 906)) THEN
                BEGIN
                SELECT A.paan_afpem FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = ((((:basico )/30 * :diaslab ) + :comision) * :PORCEN) /100;
                END
                EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
            END
            ELSE
       IF ((conc_cod = 907) OR (conc_cod = 914) OR (conc_cod = 915)) THEN
            BEGIN
            entidad = :niteps;
                IF (conc_cod = 907) THEN
                BEGIN
                SELECT A.paan_epstr FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = ((((:basico )/30 * :diaslab ) + :comision) * :PORCEN) /100;
                END
                ELSE
                IF ((conc_cod = 914) OR (conc_cod = 915)) THEN
                BEGIN
                SELECT A.paan_epsem FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = ((((:basico )/30 * :diaslab ) + :comision) * :PORCEN) /100;
                END
                EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
            END
            ELSE
       IF ((conc_cod = 910) OR (conc_cod = 911) OR (conc_cod = 916) OR (conc_cod = 917) OR (conc_cod = 918) OR (conc_cod = 919)) THEN
            BEGIN
            entidad = :nitccf;
            SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
            IF (comision IS NULL) THEN
            comision = 0;
                IF ((conc_cod = 910) OR (conc_cod = 911) ) THEN
                BEGIN
                SELECT A.paan_ccf FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = ((((:basico )/30 * :diaslab ) + :comision) * :PORCEN) /100;
                EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
                END
                ELSE
                IF ((conc_cod = 916) OR (conc_cod = 917)) THEN
                BEGIN
                SELECT A.paan_icbf FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = ((((:basico )/30 * :diaslab ) + :comision) * :PORCEN) /100;
                EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
                END
                ELSE
                IF ((conc_cod = 918) OR (conc_cod = 919)) THEN
                BEGIN
                SELECT A.paan_sena FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = ((((:basico )/30 * :diaslab ) + :comision) * :PORCEN) /100;
                EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
                END
            END
            ELSE
        IF ((conc_cod = 912) OR (conc_cod = 913)) THEN
            BEGIN
            entidad = :nitafc;
            SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
            IF (comision IS NULL) THEN
            comision = 0;
                IF ((conc_cod = 912) OR (conc_cod = 913) ) THEN
                BEGIN
                SELECT A.paan_cesemp FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = (((:basico + :comision)/30 * :diaslab ) * :PORCEN) /100;
                EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
                END
            END
            ELSE
        BEGIN
        SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
        IF (comision IS NULL) THEN
        comision = 0;
        conc_monto = :basico + :comision;
        IF (conc_porc <> 0 AND conc_porc IS NOT NULL) THEN
        VALOR = ((:CONC_MONTO/30 * :diaslab ) * :conc_porc) /100;
        ELSE
        IF (:porcen <> 0 AND :porcen IS NOT NULL) THEN
        VALOR = ((:CONC_MONTO/30 * :diaslab ) * :porcen) /100;
        ELSE
        IF (:montos <> 0 AND :montos IS NOT NULL) THEN
        valor = :montos;
        ELSE
        valor = :conc_monto;
        EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
        END
    END
    END
    ELSE
    BEGIN
    IF (conc_prov = 'S') THEN
    BEGIN
        conc_monto = :basico;
        IF (conc_porc <> 0 AND conc_porc IS NOT NULL) THEN
        VALOR = ((:CONC_MONTO/30 * :diaslab ) * :conc_porc) /100;
        ELSE
        VALOR = ((:CONC_MONTO/30 * :diaslab ) * :porcen) /100;
        EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
    END
    END
item = :item + 1;
END
    IF (liquidaper = 0) THEN
    INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
    VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
    ELSE
    IF (liquidaper = 1) THEN
    BEGIN
    rmod = mod(:periodo, 2);
    IF (rmod = 0) THEN
        INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
        VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
    END
    ELSE
    IF (liquidaper = 2) THEN
    BEGIN
    rmod = mod(:periodo, 4);
    IF (rmod = 0) THEN
        INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
        VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
    END
END
END
END
END
SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE CAUSA_NOMINA(
    FEC DATE,
    PERIODO INTEGER,
    PERIODICIDAD INTEGER,
    PAGOGLOBAL CHAR(1),
    ANO CHAR(4))
RETURNS (
    IDNOMINA INTEGER)
AS
DECLARE VARIABLE item INTEGER;
DECLARE VARIABLE nite VARCHAR(20) CHARACTER SET none;
DECLARE VARIABLE nit_tercero VARCHAR(20);
DECLARE VARIABLE concept INTEGER;
DECLARE VARIABLE montos NUMERIC(18,2);
DECLARE VARIABLE porcen NUMERIC(9,4);
DECLARE VARIABLE entidad VARCHAR(20);
DECLARE VARIABLE conc_cod INTEGER;
DECLARE VARIABLE conc_deduc CHAR(1);
DECLARE VARIABLE conc_porc NUMERIC(9,4);
DECLARE VARIABLE conc_entidad INTEGER;
DECLARE VARIABLE conc_monto NUMERIC(18,2);
DECLARE VARIABLE conc_modifi CHAR(1);
DECLARE VARIABLE conc_promedio CHAR(1);
DECLARE VARIABLE emco_perprom INTEGER;
DECLARE VARIABLE valor NUMERIC(18,2);
DECLARE VARIABLE diaslab INTEGER;
DECLARE VARIABLE conc_prov CHAR(1);
DECLARE VARIABLE conc_aporte CHAR(1);
DECLARE VARIABLE numeroprom INTEGER;
DECLARE VARIABLE conc_aplicaprom CHAR(1);
DECLARE VARIABLE perinicial INTEGER;
DECLARE VARIABLE anoprom INTEGER;
DECLARE VARIABLE conc_dias CHAR(1);
DECLARE VARIABLE conc_otroconc CHAR(1);
DECLARE VARIABLE conc_codotroconc INTEGER;
DECLARE VARIABLE anosum INTEGER;
DECLARE VARIABLE salario CHAR(1) CHARACTER SET none;
DECLARE VARIABLE liquidaper INTEGER;
DECLARE VARIABLE rmod NUMERIC(2,2);
DECLARE VARIABLE basico NUMERIC(18,2);
DECLARE VARIABLE niteps VARCHAR(20);
DECLARE VARIABLE nitafc VARCHAR(20);
DECLARE VARIABLE nitafp VARCHAR(20);
DECLARE VARIABLE nitccf VARCHAR(20);
DECLARE VARIABLE gtoempr CHAR(1);
DECLARE VARIABLE comision NUMERIC(18,2);
BEGIN
/*SI ES QUINCENAL*/
IF (periodicidad = 2) THEN
BEGIN
EXECUTE PROCEDURE cambie_id_nomina RETURNING_VALUES(:idnomina);
INSERT INTO nomina (nomi_id, NOMI_FECCAUSA, NOMI_PAGOGLOBAL, NOMI_PERIODOCIDAD, NOMI_PERIODO, NOMI_ANO, NOMI_LIQOK)
VALUES (:IDNOMINA, :fec,:pagoglobal, :periodicidad, :periodo, :ano, 'N');
 BEGIN
    item = 1;
    FOR SELECT E.TERC_NIT, E.empl_salario, e.empl_eps, e.empl_afc, e.empl_afp, e.empl_ccf
    FROM EMPLEADOS E
    WHERE E.empl_ppago = 2
    INTO :nite, :basico, :niteps, :nitafc, :nitafp, :nitccf
    DO
    BEGIN
    FOR SELECT CE.TERC_NIT, CE.CONC_COD, CE.EMCO_MONTO, CE.EMCO_PORC, ce.empl_entidad, CE.emco_perprom, CE.emco_luquidaper,    CN.CONC_COD, CN.CONC_DEDUC,CN.CONC_PORC, CN.CONC_ENTIDAD, CN.CONC_MONTO,  CN.CONC_DIAS, CN.CONC_MODIFI,
    CN.CONC_PROMEDIO, CN.conc_salario, CE.emco_perprom, CN.conc_prov, CN.conc_aporte, CN.conc_aplicaprom, cn.conc_otroconc, cn.conc_codotroconc, CN.conc_gtoempr
    FROM empleado_conceptos CE, CONCEPTOS_NOMINA CN WHERE ((CE.terc_nit = :nite) AND (CE.CONC_COD = CN.CONC_COD) AND (CN.conc_fecini <= :fec AND CN.conc_fecfin >= :FEC) ) OR ((CE.terc_nit = :nite)
    AND (CE.CONC_COD = CN.CONC_COD) AND (cn.conc_todosper = 'N') AND (CE.emco_ppago = :periodo)) OR  ((CE.terc_nit = :nite) AND (CE.CONC_COD = CN.CONC_COD) AND cn.conc_todosper = 'S')  ORDER BY (TERC_NIT )
    INTO :nit_tercero, :concept,  :montos, :porcen, :entidad, :numeroprom, :liquidaper ,:CONC_COD, :CONC_DEDUC, :CONC_PORC,
    :CONC_ENTIDAD, :CONC_MONTO, :CONC_DIAS, :CONC_MODIFI,:CONC_PROMEDIO, :salario,:EMCO_PERPROM, :conc_prov, :conc_aporte , :CONC_APLICAPROM, :conc_otroconc, :conc_codotroconc, :gtoempr
    DO
BEGIN
    IF (conc_dias = 'S') THEN
    EXECUTE PROCEDURE DIAS_LABORADOS (:nite, :periodo) RETURNING_VALUES (:diaslab);
    ELSE
    BEGIN
    IF (liquidaper = 0) THEN
    diaslab = 15;
    ELSE
    IF (liquidaper = 1) THEN
    diaslab = 30;
    ELSE
    IF (liquidaper = 2) THEN
    diaslab = 60;
    END
 IF (conc_cod = 920) THEN
 BEGIN
 SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :valor;
 IF (valor IS NULL) THEN
 valor = 0;
 item = :item + 1;
 END
 ELSE
 BEGIN
    IF ((:montos = 0) OR (:montos IS NULL)) THEN
      BEGIN
      IF ((CONC_PORC = 0 AND :porcen = 0) OR (CONC_PORC IS NULL AND :porcen = 0) OR (CONC_PORC = 0 AND :porcen IS NULL) OR (CONC_PORC IS NULL AND :porcen IS NULL) ) THEN
        BEGIN
        IF ((conc_monto <> 0) AND (conc_monto IS NOT NULL) ) THEN
        BEGIN
        VALOR = :CONC_MONTO/30 * :diaslab;
        EXECUTE PROCEDURE REDONDEE(:valor, 5) RETURNING_VALUES (VALOR);
        END
        ELSE
        IF (salario = 'S' AND CONC_COD <> 900) THEN
        BEGIN
        conc_monto = :basico;
        VALOR = (:conc_monto/30 * :diaslab );
        EXECUTE PROCEDURE REDONDEE(:valor, 5) RETURNING_VALUES (VALOR);
        END
        ELSE
        valor = montos;
        END
       ELSE
       BEGIN
        IF (:porcen <> 0) THEN
          BEGIN
            IF ((conc_monto <> 0) AND (conc_monto IS NOT NULL) ) THEN
            BEGIN
              VALOR = ((:CONC_MONTO/30 * :diaslab ) * :PORCEN) /100;
              EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
            END
            ELSE
        IF (salario = 'S' AND CONC_COD <> 900) THEN
            BEGIN
              conc_monto = :basico;
              VALOR = ((:CONC_MONTO/30 * :diaslab ) * :PORCEN) /100;
              EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
            END
          END
          ELSE
          BEGIN
            IF ((conc_monto <> 0) AND (conc_monto IS NOT NULL) ) THEN
            BEGIN
              VALOR = ((:CONC_MONTO/30 * :diaslab ) * :conc_porc) /100;
              EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
            END
            ELSE
        IF (salario = 'S' AND CONC_COD <> 900) THEN
            BEGIN
              conc_monto = :basico;
              VALOR = ((:CONC_MONTO/30 * :diaslab ) * :conc_porc) /100;
              EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
            END
          END
       END
      END
    ELSE
    BEGIN
      IF (CONC_PORC = 0 AND :porcen = 0) THEN
      BEGIN
      VALOR = (:montos/30 * :diaslab );
      EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
      END
      ELSE
      BEGIN
        IF (:porcen <> 0) THEN
          BEGIN
          VALOR = ((:MONTOS/30 * :diaslab ) * :PORCEN) /100;
          EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
          END
          ELSE
          BEGIN
          VALOR = ((:montos/30 * :diaslab ) * :CONC_PORC) /100;
          END
          EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
       END
   END
    IF (conc_promedio = 'S') THEN
    BEGIN
    perinicial = :periodo - (:numeroprom) + 1;
    anoprom = CAST (ano AS INTEGER);
    IF (perinicial <= 0) THEN
    BEGIN
    perinicial = 24 + :PERINICIAL;
    anoprom = CAST(ANO AS INTEGER) - 1;
    END
    SELECT SUM (noco_valor) FROM nomina_conceptos n WHERE n.noco_aplicaprom = 'S' AND N.noco_periodo >= :perinicial - 1 AND N.noco_periodo < :periodo AND N.noco_ano >= :anoprom AND N.noco_ano <= :ano AND terc_nit = :nite INTO :valor;
    valor = (valor / numeroprom)/*/ 30 * :diaslab*/;
    EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
    UPDATE nomina_conceptos N SET noco_pagook = 'S' WHERE n.noco_aplicaprom = 'S' AND N.noco_periodo >= :perinicial - 1 AND N.noco_periodo < :periodo AND N.noco_ano >= :anoprom AND N.noco_ano <= :ano AND terc_nit = :nite;
    END
    IF (conc_otroconc = 'S') THEN
    BEGIN
    anosum = CAST(ano AS INTEGER);
    anosum = anosum - 1;
    SELECT SUM (noco_valor) FROM nomina_conceptos n WHERE n.noco_ano = :anosum AND n.conc_cod = :conc_codotroconc AND N.terc_nit = :nite INTO :valor;
    UPDATE nomina_conceptos SET noco_pagook = 'S' WHERE noco_ano = :anosum AND conc_cod = :conc_codotroconc AND terc_nit = :nite;
    END
/*SI EL CONCEPTO ES UN APORTE*/
IF (conc_aporte = 'S') THEN
BEGIN
    IF ((:entidad = '' ) OR (entidad IS NULL)) THEN
    BEGIN
     SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
     IF (comision IS NULL) THEN
     comision = 0;
     valor = :basico + :comision;
    IF ((conc_cod = 904) OR (conc_cod = 905) OR (conc_cod = 906)) THEN
            BEGIN
            entidad = :nitafp;
                IF (conc_cod = 904) THEN
                BEGIN
                SELECT A.paan_afptr FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = ((((:basico )/30 * :diaslab ) + :comision) * :PORCEN) /100;
                END
                ELSE
                IF ((conc_cod = 905) OR (conc_cod = 906)) THEN
                BEGIN
                SELECT A.paan_afpem FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = ((((:basico )/30 * :diaslab ) + :comision) * :PORCEN) /100;
                END
                EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
            END
            ELSE
       IF ((conc_cod = 907) OR (conc_cod = 914) OR (conc_cod = 915)) THEN
            BEGIN
            entidad = :niteps;
                IF (conc_cod = 907) THEN
                BEGIN
                SELECT A.paan_epstr FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = ((((:basico )/30 * :diaslab ) + :comision) * :PORCEN) /100;
                END
                ELSE
                IF ((conc_cod = 914) OR (conc_cod = 915)) THEN
                BEGIN
                SELECT A.paan_epsem FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = ((((:basico )/30 * :diaslab ) + :comision) * :PORCEN) /100;
                END
                EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
            END
            ELSE
       IF ((conc_cod = 910) OR (conc_cod = 911) OR (conc_cod = 916) OR (conc_cod = 917) OR (conc_cod = 918) OR (conc_cod = 919)) THEN
            BEGIN
            entidad = :nitccf;
            SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
            IF (comision IS NULL) THEN
            comision = 0;
                IF ((conc_cod = 910) OR (conc_cod = 911) ) THEN
                BEGIN
                SELECT A.paan_ccf FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = ((((:basico )/30 * :diaslab ) + :comision) * :PORCEN) /100;
                EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
                END
                ELSE
                IF ((conc_cod = 916) OR (conc_cod = 917)) THEN
                BEGIN
                SELECT A.paan_icbf FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = ((((:basico )/30 * :diaslab ) + :comision) * :PORCEN) /100;
                EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
                END
                ELSE
                IF ((conc_cod = 918) OR (conc_cod = 919)) THEN
                BEGIN
                SELECT A.paan_sena FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = ((((:basico )/30 * :diaslab ) + :comision) * :PORCEN) /100;
                EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
                END
            END
            ELSE
        IF ((conc_cod = 912) OR (conc_cod = 913)) THEN
            BEGIN
            entidad = :nitafc;
            SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
            IF (comision IS NULL) THEN
            comision = 0;
                IF ((conc_cod = 912) OR (conc_cod = 913) ) THEN
                BEGIN
                SELECT A.paan_cesemp FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = (((:basico + :comision)/30 * :diaslab ) * :PORCEN) /100;
                EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
                END
            END
            ELSE
        BEGIN
        SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
        IF (comision IS NULL) THEN
        comision = 0;
        conc_monto = :basico + :comision;
        IF (conc_porc <> 0 AND conc_porc IS NOT NULL) THEN
        VALOR = ((:CONC_MONTO/30 * :diaslab ) * :conc_porc) /100;
        ELSE
        IF (:porcen <> 0 AND :porcen IS NOT NULL) THEN
        VALOR = ((:CONC_MONTO/30 * :diaslab ) * :porcen) /100;
        ELSE
        IF (:montos <> 0 AND :montos IS NOT NULL) THEN
        valor = :montos;
        ELSE
        IF (:conc_monto <> 0 AND :conc_monto IS NOT NULL) THEN
        valor = :conc_monto;
        EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
        END
    END
    END
    ELSE
    BEGIN
    IF (conc_prov = 'S') THEN
    BEGIN
        conc_monto = :basico;
        IF (conc_porc <> 0 AND conc_porc IS NOT NULL) THEN
        VALOR = ((:CONC_MONTO/30 * :diaslab ) * :conc_porc) /100;
        ELSE
        IF (porcen <> 0 AND porcen IS NOT NULL) THEN
        VALOR = ((:CONC_MONTO/30 * :diaslab ) * :porcen) /100;
    END
    END
item = :item + 1;
END
IF (CONC_COD = 929) THEN
 BEGIN
     SELECT P.prcu_monto FROM prestamo_cuotas P, prestamo_nomina PN WHERE P.prcu_periodo = :periodo AND P.prcu_ano = :ano AND P.prno_id = PN.prno_id AND PN.terc_nit = :nite INTO :valor;
     IF (valor IS NULL) THEN
     valor = 0;
     item = :item + 1;
 END
    IF (liquidaper = 0) THEN
    INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
    VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
    ELSE
    IF (liquidaper = 1) THEN
    BEGIN
    rmod = mod(:periodo, 2);
    IF (rmod = 0) THEN
        INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
        VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
    END
    ELSE
    IF (liquidaper = 2) THEN
    BEGIN
    rmod = mod(:periodo, 4);
    IF (rmod = 0) THEN
        INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
        VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
    END
END
END
END
END
ELSE
/*SI ES MENSUAL*/
IF (periodicidad = 1) THEN
BEGIN
EXECUTE PROCEDURE cambie_id_nomina RETURNING_VALUES(:idnomina);
INSERT INTO nomina (nomi_id, NOMI_FECCAUSA, NOMI_PAGOGLOBAL, NOMI_PERIODOCIDAD, NOMI_PERIODO, NOMI_ANO, NOMI_LIQOK)
VALUES (:IDNOMINA, :fec,:pagoglobal, :periodicidad, :periodo, :ano, 'N');
    BEGIN
    item = 1;
    FOR SELECT E.TERC_NIT, E.empl_salario, e.empl_eps, e.empl_afc, e.empl_afp, e.empl_ccf
    FROM EMPLEADOS E
    WHERE E.empl_ppago = 1
    INTO :nite, :basico, :niteps, :nitafc, :nitafp, :nitccf
    DO
    FOR SELECT CE.TERC_NIT, CE.CONC_COD, CE.EMCO_MONTO, CE.EMCO_PORC, ce.empl_entidad, CE.emco_perprom, CE.emco_luquidaper,    CN.CONC_COD, CN.CONC_DEDUC,CN.CONC_PORC, CN.CONC_ENTIDAD, CN.CONC_MONTO,  CN.CONC_DIAS, CN.CONC_MODIFI,
    CN.CONC_PROMEDIO, CN.conc_salario, CE.emco_perprom, CN.conc_prov, CN.conc_aporte, CN.conc_aplicaprom, cn.conc_otroconc, cn.conc_codotroconc, CN.conc_gtoempr
    FROM empleado_conceptos CE, CONCEPTOS_NOMINA CN WHERE ((CE.terc_nit = :nite) AND (CE.CONC_COD = CN.CONC_COD) AND (CN.conc_fecini <= :fec AND CN.conc_fecfin >= :FEC) ) OR ((CE.terc_nit = :nite)
    AND (CE.CONC_COD = CN.CONC_COD) AND (cn.conc_todosper = 'N') AND (CE.emco_ppago = :periodo)) OR  ((CE.terc_nit = :nite) AND (CE.CONC_COD = CN.CONC_COD) AND cn.conc_todosper = 'S')  ORDER BY (TERC_NIT)
    INTO :nit_tercero, :concept,  :montos, :porcen, :entidad, :numeroprom, :liquidaper ,:CONC_COD, :CONC_DEDUC, :CONC_PORC,
    :CONC_ENTIDAD, :CONC_MONTO, :CONC_DIAS, :CONC_MODIFI,:CONC_PROMEDIO, :salario,:EMCO_PERPROM, :conc_prov, :conc_aporte , :CONC_APLICAPROM, :conc_otroconc, :conc_codotroconc, :gtoempr    DO
BEGIN
    IF (conc_dias = 'S') THEN
    EXECUTE PROCEDURE DIAS_LABORADOS (:nite, :periodo) RETURNING_VALUES (:diaslab);
    ELSE
    BEGIN
    IF (liquidaper = 0) THEN
    diaslab = 30;
    ELSE
    IF (liquidaper = 1) THEN
    diaslab = 60;
    ELSE
    IF (liquidaper = 2) THEN
    diaslab = 120;
    END
 IF (conc_cod = 920) THEN
 BEGIN
 SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :valor;
 IF (valor IS NULL) THEN
 valor = 0;
 item = :item + 1;
 END
 ELSE
 BEGIN
    IF ((:montos = 0) OR (:montos IS NULL)) THEN
      BEGIN
      IF ((CONC_PORC = 0 AND :porcen = 0) OR (CONC_PORC IS NULL AND :porcen = 0) OR (CONC_PORC = 0 AND :porcen IS NULL) OR (CONC_PORC IS NULL AND :porcen IS NULL) ) THEN
        BEGIN
        IF ((conc_monto <> 0) AND (conc_monto IS NOT NULL) ) THEN
        BEGIN
        VALOR = :CONC_MONTO/30 * :diaslab;
        EXECUTE PROCEDURE REDONDEE(:valor, 5) RETURNING_VALUES (VALOR);
        END
        ELSE
        IF (salario = 'S' AND CONC_COD <> 900) THEN
        BEGIN
        conc_monto = :basico;
        VALOR = (:conc_monto/30 * :diaslab );
        EXECUTE PROCEDURE REDONDEE(:valor, 5) RETURNING_VALUES (VALOR);
        END
        ELSE
        valor = montos;
        END
       ELSE
       BEGIN
        IF (:porcen <> 0) THEN
          BEGIN
            IF ((conc_monto <> 0) AND (conc_monto IS NOT NULL) ) THEN
            BEGIN
              VALOR = ((:CONC_MONTO/30 * :diaslab ) * :PORCEN) /100;
              EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
            END
            ELSE
        IF (salario = 'S' AND CONC_COD <> 900) THEN
            BEGIN
              conc_monto = :basico;
              VALOR = ((:CONC_MONTO/30 * :diaslab ) * :PORCEN) /100;
              EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
            END
          END
          ELSE
          BEGIN
            IF ((conc_monto <> 0) AND (conc_monto IS NOT NULL) ) THEN
            BEGIN
              VALOR = ((:CONC_MONTO/30 * :diaslab ) * :conc_porc) /100;
              EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
            END
            ELSE
        IF (salario = 'S' AND CONC_COD <> 900) THEN
            BEGIN
              conc_monto = :basico;
              VALOR = ((:CONC_MONTO/30 * :diaslab ) * :conc_porc) /100;
              EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
            END
          END
       END
      END
    ELSE
    BEGIN
      IF (CONC_PORC = 0 AND :porcen = 0) THEN
      BEGIN
      VALOR = (:montos/30 * :diaslab );
      EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
      END
      ELSE
      BEGIN
        IF (:porcen <> 0) THEN
          BEGIN
          VALOR = ((:MONTOS/30 * :diaslab ) * :PORCEN) /100;
          EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
          END
          ELSE
          BEGIN
          VALOR = ((:montos/30 * :diaslab ) * :CONC_PORC) /100;
          END
          EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
       END
   END
    IF (conc_promedio = 'S') THEN
    BEGIN
    perinicial = :periodo - (:numeroprom) + 1;
    anoprom = CAST (ano AS INTEGER);
    IF (perinicial <= 0) THEN
    BEGIN
    perinicial = 24 + :PERINICIAL;
    anoprom = CAST(ANO AS INTEGER) - 1;
    END
    SELECT SUM (noco_valor) FROM nomina_conceptos n WHERE n.noco_aplicaprom = 'S' AND N.noco_periodo >= :perinicial - 1 AND N.noco_periodo < :periodo AND N.noco_ano >= :anoprom AND N.noco_ano <= :ano AND terc_nit = :nite INTO :valor;
    valor = (valor / numeroprom)/*/ 30 * :diaslab*/;
    EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
    UPDATE nomina_conceptos N SET noco_pagook = 'S' WHERE n.noco_aplicaprom = 'S' AND N.noco_periodo >= :perinicial - 1 AND N.noco_periodo < :periodo AND N.noco_ano >= :anoprom AND N.noco_ano <= :ano AND terc_nit = :nite;
    END
    IF (conc_otroconc = 'S') THEN
    BEGIN
    anosum = CAST(ano AS INTEGER);
    anosum = anosum - 1;
    SELECT SUM (noco_valor) FROM nomina_conceptos n WHERE n.noco_ano = :anosum AND n.conc_cod = :conc_codotroconc AND N.terc_nit = :nite INTO :valor;
    UPDATE nomina_conceptos SET noco_pagook = 'S' WHERE noco_ano = :anosum AND conc_cod = :conc_codotroconc AND terc_nit = :nite;
    END
/*SI EL CONCEPTO ES UN APORTE*/
IF (conc_aporte = 'S') THEN
BEGIN
    IF ((:entidad = '' ) OR (entidad IS NULL)) THEN
    BEGIN
     SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
     IF (comision IS NULL) THEN
     comision = 0;
     valor = :basico + :comision;
    IF ((conc_cod = 904) OR (conc_cod = 905) OR (conc_cod = 906)) THEN
            BEGIN
            entidad = :nitafp;
                IF (conc_cod = 904) THEN
                BEGIN
                SELECT A.paan_afptr FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = ((((:basico )/30 * :diaslab ) + :comision) * :PORCEN) /100;
                END
                ELSE
                IF ((conc_cod = 905) OR (conc_cod = 906)) THEN
                BEGIN
                SELECT A.paan_afpem FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = ((((:basico )/30 * :diaslab ) + :comision) * :PORCEN) /100;
                END
                EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
            END
            ELSE
       IF ((conc_cod = 907) OR (conc_cod = 914) OR (conc_cod = 915)) THEN
            BEGIN
            entidad = :niteps;
                IF (conc_cod = 907) THEN
                BEGIN
                SELECT A.paan_epstr FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = ((((:basico )/30 * :diaslab ) + :comision) * :PORCEN) /100;
                END
                ELSE
                IF ((conc_cod = 914) OR (conc_cod = 915)) THEN
                BEGIN
                SELECT A.paan_epsem FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = ((((:basico )/30 * :diaslab ) + :comision) * :PORCEN) /100;
                END
                EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
            END
            ELSE
       IF ((conc_cod = 910) OR (conc_cod = 911) OR (conc_cod = 916) OR (conc_cod = 917) OR (conc_cod = 918) OR (conc_cod = 919)) THEN
            BEGIN
            entidad = :nitccf;
            SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
            IF (comision IS NULL) THEN
            comision = 0;
                IF ((conc_cod = 910) OR (conc_cod = 911) ) THEN
                BEGIN
                SELECT A.paan_ccf FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = ((((:basico )/30 * :diaslab ) + :comision) * :PORCEN) /100;
                EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
                END
                ELSE
                IF ((conc_cod = 916) OR (conc_cod = 917)) THEN
                BEGIN
                SELECT A.paan_icbf FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = ((((:basico )/30 * :diaslab ) + :comision) * :PORCEN) /100;
                EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
                END
                ELSE
                IF ((conc_cod = 918) OR (conc_cod = 919)) THEN
                BEGIN
                SELECT A.paan_sena FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = ((((:basico )/30 * :diaslab ) + :comision) * :PORCEN) /100;
                EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
                END
            END
            ELSE
        IF ((conc_cod = 912) OR (conc_cod = 913)) THEN
            BEGIN
            entidad = :nitafc;
            SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
            IF (comision IS NULL) THEN
            comision = 0;
                IF ((conc_cod = 912) OR (conc_cod = 913) ) THEN
                BEGIN
                SELECT A.paan_cesemp FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = (((:basico + :comision)/30 * :diaslab ) * :PORCEN) /100;
                EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
                END
            END
            ELSE
        BEGIN
        SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
        IF (comision IS NULL) THEN
        comision = 0;
        conc_monto = :basico + :comision;
        IF (conc_porc <> 0 AND conc_porc IS NOT NULL) THEN
        VALOR = ((:CONC_MONTO/30 * :diaslab ) * :conc_porc) /100;
        ELSE
        VALOR = ((:CONC_MONTO/30 * :diaslab ) * :porcen) /100;
        EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
        END
    END
    END
    ELSE
    BEGIN
    IF (conc_prov = 'S') THEN
    BEGIN
        conc_monto = :basico;
        IF (conc_porc <> 0 AND conc_porc IS NOT NULL) THEN
        VALOR = ((:CONC_MONTO/30 * :diaslab ) * :conc_porc) /100;
        ELSE
        VALOR = ((:CONC_MONTO/30 * :diaslab ) * :porcen) /100;
        EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
    END
    END
item = :item + 1;
END
IF (CONC_COD = 929) THEN
 BEGIN
     SELECT P.prcu_monto FROM prestamo_cuotas P, prestamo_nomina PN WHERE P.prcu_periodo = :periodo AND P.prcu_ano = :ano AND P.prno_id = PN.prno_id AND PN.terc_nit = :nite INTO :valor;
     IF (valor IS NULL) THEN
     valor = 0;
     item = :item + 1;
 END
    IF (liquidaper = 0) THEN
    INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
    VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
    ELSE
    IF (liquidaper = 1) THEN
    BEGIN
    rmod = mod(:periodo, 2);
    IF (rmod = 0) THEN
        INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
        VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
    END
    ELSE
    IF (liquidaper = 2) THEN
    BEGIN
    rmod = mod(:periodo, 4);
    IF (rmod = 0) THEN
        INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
        VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
    END
END
END
END
ELSE
/*SI ES SEMANAL*/
IF (periodicidad = 3) THEN
BEGIN
EXECUTE PROCEDURE cambie_id_nomina RETURNING_VALUES(:idnomina);
INSERT INTO nomina (nomi_id, NOMI_FECCAUSA, NOMI_PAGOGLOBAL, NOMI_PERIODOCIDAD, NOMI_PERIODO, NOMI_ANO, NOMI_LIQOK)
VALUES (:IDNOMINA, :fec,:pagoglobal, :periodicidad, :periodo, :ano, 'N');
    BEGIN
    item = 1;
    FOR SELECT E.TERC_NIT, E.empl_salario, e.empl_eps, e.empl_afc, e.empl_afp, e.empl_ccf
    FROM EMPLEADOS E
    WHERE E.empl_ppago = 3
    INTO :nite, :basico, :niteps, :nitafc, :nitafp, :nitccf
    DO
    BEGIN
    FOR SELECT CE.TERC_NIT, CE.CONC_COD, CE.EMCO_MONTO, CE.EMCO_PORC, ce.empl_entidad, CE.emco_perprom, CE.emco_luquidaper,    CN.CONC_COD, CN.CONC_DEDUC,CN.CONC_PORC, CN.CONC_ENTIDAD, CN.CONC_MONTO,  CN.CONC_DIAS, CN.CONC_MODIFI,
    CN.CONC_PROMEDIO, CN.conc_salario, CE.emco_perprom, CN.conc_prov, CN.conc_aporte, CN.conc_aplicaprom, cn.conc_otroconc, cn.conc_codotroconc, CN.conc_gtoempr
    FROM empleado_conceptos CE, CONCEPTOS_NOMINA CN WHERE ((CE.terc_nit = :nite) AND (CE.CONC_COD = CN.CONC_COD) AND (CN.conc_fecini <= :fec AND CN.conc_fecfin >= :FEC) ) OR ((CE.terc_nit = :nite)
    AND (CE.CONC_COD = CN.CONC_COD) AND (cn.conc_todosper = 'N') AND (CE.emco_ppago = :periodo)) OR  ((CE.terc_nit = :nite) AND (CE.CONC_COD = CN.CONC_COD) AND cn.conc_todosper = 'S')  ORDER BY (TERC_NIT)
    INTO :nit_tercero, :concept,  :montos, :porcen, :entidad, :numeroprom, :liquidaper ,:CONC_COD, :CONC_DEDUC, :CONC_PORC,
    :CONC_ENTIDAD, :CONC_MONTO, :CONC_DIAS, :CONC_MODIFI,:CONC_PROMEDIO, :salario,:EMCO_PERPROM, :conc_prov, :conc_aporte , :CONC_APLICAPROM, :conc_otroconc, :conc_codotroconc, :gtoempr
    DO
BEGIN
    IF (conc_dias = 'S') THEN
    EXECUTE PROCEDURE DIAS_LABORADOS (:nite, :periodo) RETURNING_VALUES (:diaslab);
    ELSE
    BEGIN
    IF (liquidaper = 0) THEN
    diaslab = 7;
    ELSE
    IF (liquidaper = 1) THEN
    diaslab = 15;
    ELSE
    IF (liquidaper = 2) THEN
    diaslab = 30;
    END
 IF (conc_cod = 920) THEN
 BEGIN
 SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :valor;
 IF (valor IS NULL) THEN
 valor = 0;
 item = :item + 1;
 END
 ELSE
 BEGIN
    IF ((:montos = 0) OR (:montos IS NULL)) THEN
      BEGIN
      IF ((CONC_PORC = 0 AND :porcen = 0) OR (CONC_PORC IS NULL AND :porcen = 0) OR (CONC_PORC = 0 AND :porcen IS NULL) OR (CONC_PORC IS NULL AND :porcen IS NULL) ) THEN
        BEGIN
        IF ((conc_monto <> 0) AND (conc_monto IS NOT NULL) ) THEN
        BEGIN
        VALOR = :CONC_MONTO/30 * :diaslab;
        EXECUTE PROCEDURE REDONDEE(:valor, 5) RETURNING_VALUES (VALOR);
        END
        ELSE
        IF (salario = 'S' AND CONC_COD <> 900) THEN
        BEGIN
        conc_monto = :basico;
        VALOR = (:conc_monto/30 * :diaslab );
        EXECUTE PROCEDURE REDONDEE(:valor, 5) RETURNING_VALUES (VALOR);
        END
        ELSE
        valor = montos;
        END
       ELSE
       BEGIN
        IF (:porcen <> 0) THEN
          BEGIN
            IF ((conc_monto <> 0) AND (conc_monto IS NOT NULL) ) THEN
            BEGIN
              VALOR = ((:CONC_MONTO/30 * :diaslab ) * :PORCEN) /100;
              EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
            END
            ELSE
        IF (salario = 'S' AND CONC_COD <> 900) THEN
            BEGIN
              conc_monto = :basico;
              VALOR = ((:CONC_MONTO/30 * :diaslab ) * :PORCEN) /100;
              EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
            END
          END
          ELSE
          BEGIN
            IF ((conc_monto <> 0) AND (conc_monto IS NOT NULL) ) THEN
            BEGIN
              VALOR = ((:CONC_MONTO/30 * :diaslab ) * :conc_porc) /100;
              EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
            END
            ELSE
        IF (salario = 'S' AND CONC_COD <> 900) THEN
            BEGIN
              conc_monto = :basico;
              VALOR = ((:CONC_MONTO/30 * :diaslab ) * :conc_porc) /100;
              EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
            END
          END
       END
      END
    ELSE
    BEGIN
      IF (CONC_PORC = 0 AND :porcen = 0) THEN
      BEGIN
      VALOR = (:montos/30 * :diaslab );
      EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
      END
      ELSE
      BEGIN
        IF (:porcen <> 0) THEN
          BEGIN
          VALOR = ((:MONTOS/30 * :diaslab ) * :PORCEN) /100;
          EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
          END
          ELSE
          BEGIN
          VALOR = ((:montos/30 * :diaslab ) * :CONC_PORC) /100;
          END
          EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
       END
   END
    IF (conc_promedio = 'S') THEN
    BEGIN
    perinicial = :periodo - (:numeroprom) + 1;
    anoprom = CAST (ano AS INTEGER);
    IF (perinicial <= 0) THEN
    BEGIN
    perinicial = 24 + :PERINICIAL;
    anoprom = CAST(ANO AS INTEGER) - 1;
    END
    SELECT SUM (noco_valor) FROM nomina_conceptos n WHERE n.noco_aplicaprom = 'S' AND N.noco_periodo >= :perinicial - 1 AND N.noco_periodo < :periodo AND N.noco_ano >= :anoprom AND N.noco_ano <= :ano AND terc_nit = :nite INTO :valor;
    valor = (valor / numeroprom)/*/ 30 * :diaslab*/;
    EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
    UPDATE nomina_conceptos N SET noco_pagook = 'S' WHERE n.noco_aplicaprom = 'S' AND N.noco_periodo >= :perinicial - 1 AND N.noco_periodo < :periodo AND N.noco_ano >= :anoprom AND N.noco_ano <= :ano AND terc_nit = :nite;
    END
    IF (conc_otroconc = 'S') THEN
    BEGIN
    anosum = CAST(ano AS INTEGER);
    anosum = anosum - 1;
    SELECT SUM (noco_valor) FROM nomina_conceptos n WHERE n.noco_ano = :anosum AND n.conc_cod = :conc_codotroconc AND N.terc_nit = :nite INTO :valor;
    UPDATE nomina_conceptos SET noco_pagook = 'S' WHERE noco_ano = :anosum AND conc_cod = :conc_codotroconc AND terc_nit = :nite;
    END
/*SI EL CONCEPTO ES UN APORTE*/
IF (conc_aporte = 'S') THEN
BEGIN
    IF ((:entidad = '' ) OR (entidad IS NULL)) THEN
    BEGIN
     SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
     IF (comision IS NULL) THEN
     comision = 0;
     valor = :basico + :comision;
    IF ((conc_cod = 904) OR (conc_cod = 905) OR (conc_cod = 906)) THEN
            BEGIN
            entidad = :nitafp;
                IF (conc_cod = 904) THEN
                BEGIN
                SELECT A.paan_afptr FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = ((((:basico )/30 * :diaslab ) + :comision) * :PORCEN) /100;
                END
                ELSE
                IF ((conc_cod = 905) OR (conc_cod = 906)) THEN
                BEGIN
                SELECT A.paan_afpem FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = ((((:basico )/30 * :diaslab ) + :comision) * :PORCEN) /100;
                END
                EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
            END
            ELSE
       IF ((conc_cod = 907) OR (conc_cod = 914) OR (conc_cod = 915)) THEN
            BEGIN
            entidad = :niteps;
                IF (conc_cod = 907) THEN
                BEGIN
                SELECT A.paan_epstr FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = ((((:basico )/30 * :diaslab ) + :comision) * :PORCEN) /100;
                END
                ELSE
                IF ((conc_cod = 914) OR (conc_cod = 915)) THEN
                BEGIN
                SELECT A.paan_epsem FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = ((((:basico )/30 * :diaslab ) + :comision) * :PORCEN) /100;
                END
                EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
            END
            ELSE
       IF ((conc_cod = 910) OR (conc_cod = 911) OR (conc_cod = 916) OR (conc_cod = 917) OR (conc_cod = 918) OR (conc_cod = 919)) THEN
            BEGIN
            entidad = :nitccf;
            SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
            IF (comision IS NULL) THEN
            comision = 0;
                IF ((conc_cod = 910) OR (conc_cod = 911) ) THEN
                BEGIN
                SELECT A.paan_ccf FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = ((((:basico )/30 * :diaslab ) + :comision) * :PORCEN) /100;
                EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
                END
                ELSE
                IF ((conc_cod = 916) OR (conc_cod = 917)) THEN
                BEGIN
                SELECT A.paan_icbf FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = ((((:basico )/30 * :diaslab ) + :comision) * :PORCEN) /100;
                EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
                END
                ELSE
                IF ((conc_cod = 918) OR (conc_cod = 919)) THEN
                BEGIN
                SELECT A.paan_sena FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = ((((:basico )/30 * :diaslab ) + :comision) * :PORCEN) /100;
                EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
                END
            END
            ELSE
        IF ((conc_cod = 912) OR (conc_cod = 913)) THEN
            BEGIN
            entidad = :nitafc;
            SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
            IF (comision IS NULL) THEN
            comision = 0;
                IF ((conc_cod = 912) OR (conc_cod = 913) ) THEN
                BEGIN
                SELECT A.paan_cesemp FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = (((:basico + :comision)/30 * :diaslab ) * :PORCEN) /100;
                EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
                END
            END
            ELSE
        BEGIN
        SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
        IF (comision IS NULL) THEN
        comision = 0;
        conc_monto = :basico + :comision;
        IF (conc_porc <> 0 AND conc_porc IS NOT NULL) THEN
        VALOR = ((:CONC_MONTO/30 * :diaslab ) * :conc_porc) /100;
        ELSE
        IF (:porcen <> 0 AND :porcen IS NOT NULL) THEN
        VALOR = ((:CONC_MONTO/30 * :diaslab ) * :porcen) /100;
        ELSE
        IF (:montos <> 0 AND :montos IS NOT NULL) THEN
        valor = :montos;
        ELSE
        valor = :conc_monto;
        EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
        END
    END
    END
    ELSE
    BEGIN
    IF (conc_prov = 'S') THEN
    BEGIN
        conc_monto = :basico;
        IF (conc_porc <> 0 AND conc_porc IS NOT NULL) THEN
        VALOR = ((:CONC_MONTO/30 * :diaslab ) * :conc_porc) /100;
        ELSE
        VALOR = ((:CONC_MONTO/30 * :diaslab ) * :porcen) /100;
        EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
    END
    END
item = :item + 1;
END
IF (CONC_COD = 929) THEN
 BEGIN
     SELECT P.prcu_monto FROM prestamo_cuotas P, prestamo_nomina PN WHERE P.prcu_periodo = :periodo AND P.prcu_ano = :ano AND P.prno_id = PN.prno_id AND PN.terc_nit = :nite INTO :valor;
     IF (valor IS NULL) THEN
     valor = 0;
     item = :item + 1;
 END
    IF (liquidaper = 0) THEN
    INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
    VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
    ELSE
    IF (liquidaper = 1) THEN
    BEGIN
    rmod = mod(:periodo, 2);
    IF (rmod = 0) THEN
        INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
        VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
    END
    ELSE
    IF (liquidaper = 2) THEN
    BEGIN
    rmod = mod(:periodo, 4);
    IF (rmod = 0) THEN
        INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
        VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
    END
END
END
END
END
SUSPEND;
END
^

SET TERM ; ^

ALTER TABLE NOMINA_NOVEDADES
ADD NONO_NROAUTO INTEGER;

SET TERM ^ ;

CREATE OR ALTER TRIGGER NOMINA_NOVEDADES_AI FOR NOMINA_NOVEDADES
ACTIVE AFTER INSERT POSITION 0
AS
BEGIN
IF (NEW.tnov_cod = 11) THEN
BEGIN
UPDATE empleados SET EMPL_SALARIO = NEW.nono_valor WHERE TERC_NIT = NEW.terc_nit;
END
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER TRIGGER NOMINA_NOVEDADES_AI
ACTIVE AFTER INSERT POSITION 0
AS
BEGIN
IF (NEW.tnov_cod = 8) THEN
BEGIN
UPDATE empleados SET EMPL_SALARIO = NEW.nono_valor WHERE TERC_NIT = NEW.terc_nit;
END
IF (NEW.tnov_cod = 5) THEN
BEGIN
IF (NEW.nono_tipoadm = 'E') THEN
UPDATE empleados SET EMPL_EPS = NEW.nono_nvaadm WHERE TERC_NIT = NEW.terc_nit;
ELSE
IF (NEW.nono_tipoadm = 'A') THEN
UPDATE empleados SET EMPL_AFP = NEW.nono_nvaadm WHERE TERC_NIT = NEW.terc_nit;
END
END
^

SET TERM ; ^


SET TERM ^ ;

ALTER PROCEDURE DIAS_LABORADOS(
    NITEMPL VARCHAR(20),
    PERIODO INTEGER)
RETURNS (
    TOTALDIASLAB INTEGER)
AS
DECLARE VARIABLE diasnolab INTEGER;
DECLARE VARIABLE diaslabxper INTEGER;
DECLARE VARIABLE perpago INTEGER;
BEGIN
SELECT E.empl_ppago
FROM EMPLEADOS E WHERE TERC_NIT = :nitempl
INTO :perpago;
IF (perpago = 1) THEN
diaslabxper = 30;
ELSE
IF (perpago = 2) THEN
diaslabxper = 15;
ELSE
IF (perpago = 3) THEN
diaslabxper = 7;
SELECT SUM (NONO_DURA)
FROM nomina_novedades WHERE TERC_NIT = :nitempl AND TNOV_COD = 9 AND NONO_PERIODO = :periodo
INTO :diasnolab;
totaldiaslab =  :diaslabxper - :diasnolab;
IF (totaldiaslab IS NULL) THEN
totaldiaslab =  :diaslabxper;
SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE CAUSA_NOMINA(
    FEC DATE,
    PERIODO INTEGER,
    PERIODICIDAD INTEGER,
    PAGOGLOBAL CHAR(1),
    ANO CHAR(4))
RETURNS (
    IDNOMINA INTEGER)
AS
DECLARE VARIABLE item INTEGER;
DECLARE VARIABLE nite VARCHAR(20) CHARACTER SET none;
DECLARE VARIABLE nit_tercero VARCHAR(20);
DECLARE VARIABLE concept INTEGER;
DECLARE VARIABLE montos NUMERIC(18,2);
DECLARE VARIABLE porcen NUMERIC(9,4);
DECLARE VARIABLE entidad VARCHAR(20);
DECLARE VARIABLE conc_cod INTEGER;
DECLARE VARIABLE conc_deduc CHAR(1);
DECLARE VARIABLE conc_porc NUMERIC(9,4);
DECLARE VARIABLE conc_entidad INTEGER;
DECLARE VARIABLE conc_monto NUMERIC(18,2);
DECLARE VARIABLE conc_modifi CHAR(1);
DECLARE VARIABLE conc_promedio CHAR(1);
DECLARE VARIABLE emco_perprom INTEGER;
DECLARE VARIABLE valor NUMERIC(18,2);
DECLARE VARIABLE diaslab INTEGER;
DECLARE VARIABLE conc_prov CHAR(1);
DECLARE VARIABLE conc_aporte CHAR(1);
DECLARE VARIABLE numeroprom INTEGER;
DECLARE VARIABLE conc_aplicaprom CHAR(1);
DECLARE VARIABLE perinicial INTEGER;
DECLARE VARIABLE anoprom INTEGER;
DECLARE VARIABLE conc_dias CHAR(1);
DECLARE VARIABLE conc_otroconc CHAR(1);
DECLARE VARIABLE conc_codotroconc INTEGER;
DECLARE VARIABLE anosum INTEGER;
DECLARE VARIABLE salario CHAR(1) CHARACTER SET none;
DECLARE VARIABLE liquidaper INTEGER;
DECLARE VARIABLE rmod NUMERIC(2,2);
DECLARE VARIABLE basico NUMERIC(18,2);
DECLARE VARIABLE niteps VARCHAR(20);
DECLARE VARIABLE nitafc VARCHAR(20);
DECLARE VARIABLE nitafp VARCHAR(20);
DECLARE VARIABLE nitccf VARCHAR(20);
DECLARE VARIABLE gtoempr CHAR(1);
DECLARE VARIABLE comision NUMERIC(18,2);
DECLARE VARIABLE cambsaltrans NUMERIC(18,2);
BEGIN
/*SI ES QUINCENAL*/
IF (periodicidad = 2) THEN
BEGIN
EXECUTE PROCEDURE cambie_id_nomina RETURNING_VALUES(:idnomina);
INSERT INTO nomina (nomi_id, NOMI_FECCAUSA, NOMI_PAGOGLOBAL, NOMI_PERIODOCIDAD, NOMI_PERIODO, NOMI_ANO, NOMI_LIQOK)
VALUES (:IDNOMINA, :fec,:pagoglobal, :periodicidad, :periodo, :ano, 'N');
 BEGIN
    item = 1;
    FOR SELECT E.TERC_NIT, E.empl_salario, e.empl_eps, e.empl_afc, e.empl_afp, e.empl_ccf
    FROM EMPLEADOS E
    WHERE E.empl_ppago = 2
    INTO :nite, :basico, :niteps, :nitafc, :nitafp, :nitccf
    DO
    BEGIN
    FOR SELECT CE.TERC_NIT, CE.CONC_COD, CE.EMCO_MONTO, CE.EMCO_PORC, ce.empl_entidad, CE.emco_perprom, CE.emco_luquidaper,    CN.CONC_COD, CN.CONC_DEDUC,CN.CONC_PORC, CN.CONC_ENTIDAD, CN.CONC_MONTO,  CN.CONC_DIAS, CN.CONC_MODIFI,
    CN.CONC_PROMEDIO, CN.conc_salario, CE.emco_perprom, CN.conc_prov, CN.conc_aporte, CN.conc_aplicaprom, cn.conc_otroconc, cn.conc_codotroconc, CN.conc_gtoempr
    FROM empleado_conceptos CE, CONCEPTOS_NOMINA CN WHERE ((CE.terc_nit = :nite) AND (CE.CONC_COD = CN.CONC_COD) AND (CN.conc_fecini <= :fec AND CN.conc_fecfin >= :FEC) ) OR ((CE.terc_nit = :nite)
    AND (CE.CONC_COD = CN.CONC_COD) AND (cn.conc_todosper = 'N') AND (CE.emco_ppago = :periodo)) OR  ((CE.terc_nit = :nite) AND (CE.CONC_COD = CN.CONC_COD) AND cn.conc_todosper = 'S')  ORDER BY (TERC_NIT )
    INTO :nit_tercero, :concept,  :montos, :porcen, :entidad, :numeroprom, :liquidaper ,:CONC_COD, :CONC_DEDUC, :CONC_PORC,
    :CONC_ENTIDAD, :CONC_MONTO, :CONC_DIAS, :CONC_MODIFI,:CONC_PROMEDIO, :salario,:EMCO_PERPROM, :conc_prov, :conc_aporte , :CONC_APLICAPROM, :conc_otroconc, :conc_codotroconc, :gtoempr
    DO
BEGIN
    IF (conc_dias = 'S') THEN
    EXECUTE PROCEDURE DIAS_LABORADOS (:nite, :periodo) RETURNING_VALUES (:diaslab);
    ELSE
    BEGIN
    IF (liquidaper = 0) THEN
    diaslab = 15;
    ELSE
    IF (liquidaper = 1) THEN
    diaslab = 30;
    ELSE
    IF (liquidaper = 2) THEN
    diaslab = 60;
    END
 SELECT ((n.nono_valor /30) * n.nono_dura) FROM nomina_novedades n WHERE n.tnov_cod = 11 AND n.terc_nit = :nite AND n.nono_periodo = :periodo INTO :cambsaltrans;
 IF (cambsaltrans IS NULL) THEN
 cambsaltrans = 0;
/* basico = :basico + :cambsaltrans;*/
 IF (conc_cod = 920) THEN
 BEGIN
 SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :valor;
 IF (valor IS NULL) THEN
 valor = 0;
 item = :item + 1;
 END
 ELSE
 BEGIN
    IF ((:montos = 0) OR (:montos IS NULL)) THEN
      BEGIN
      IF ((CONC_PORC = 0 AND :porcen = 0) OR (CONC_PORC IS NULL AND :porcen = 0) OR (CONC_PORC = 0 AND :porcen IS NULL) OR (CONC_PORC IS NULL AND :porcen IS NULL) ) THEN
        BEGIN
        IF ((conc_monto <> 0) AND (conc_monto IS NOT NULL) ) THEN
        BEGIN
        VALOR = :CONC_MONTO/30 * :diaslab;
        EXECUTE PROCEDURE REDONDEE(:valor, 5) RETURNING_VALUES (VALOR);
        END
        ELSE
        IF (salario = 'S' AND CONC_COD <> 900) THEN
        BEGIN
        conc_monto = :basico;
        VALOR = (:conc_monto/30 * :diaslab ) + :cambsaltrans;
        EXECUTE PROCEDURE REDONDEE(:valor, 5) RETURNING_VALUES (VALOR);
        END
        ELSE
        valor = montos;
        END
       ELSE
       BEGIN
        IF (:porcen <> 0) THEN
          BEGIN
            IF ((conc_monto <> 0) AND (conc_monto IS NOT NULL) ) THEN
            BEGIN
              VALOR = ((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans * :PORCEN) /100;
              EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
            END
          END
          ELSE
          BEGIN
            IF ((conc_monto <> 0) AND (conc_monto IS NOT NULL) ) THEN
            BEGIN
              VALOR = ((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans * :conc_porc) /100;
              EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
            END
            ELSE
        IF (salario = 'S' AND CONC_COD <> 900 AND CONC_COD <> 920) THEN
            BEGIN
              conc_monto = :basico;
              VALOR = ((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans * :conc_porc) /100;
              EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
            END
          END
       END
      END
    ELSE
    BEGIN
      IF (CONC_PORC = 0 AND :porcen = 0) THEN
      BEGIN
      VALOR = (:montos/30 * :diaslab );
      EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
      END
      ELSE
      BEGIN
        IF (:porcen <> 0) THEN
          BEGIN
          VALOR = ((:MONTOS/30 * :diaslab )+ :cambsaltrans * :PORCEN) /100;
          EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
          END
          ELSE
          BEGIN
          VALOR = ((:montos/30 * :diaslab )+ :cambsaltrans * :CONC_PORC) /100;
          END
          EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
       END
   END
    IF (conc_promedio = 'S') THEN
    BEGIN
    perinicial = :periodo - (:numeroprom) + 1;
    anoprom = CAST (ano AS INTEGER);
    IF (perinicial <= 0) THEN
    BEGIN
    perinicial = 24 + :PERINICIAL;
    anoprom = CAST(ANO AS INTEGER) - 1;
    END
    SELECT SUM (noco_valor) FROM nomina_conceptos n WHERE n.noco_aplicaprom = 'S' AND N.noco_periodo >= :perinicial - 1 AND N.noco_periodo < :periodo AND N.noco_ano >= :anoprom AND N.noco_ano <= :ano AND terc_nit = :nite INTO :valor;
    valor = (valor / numeroprom)/*/ 30 * :diaslab*/;
    EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
    UPDATE nomina_conceptos N SET noco_pagook = 'S' WHERE n.noco_aplicaprom = 'S' AND N.noco_periodo >= :perinicial - 1 AND N.noco_periodo < :periodo AND N.noco_ano >= :anoprom AND N.noco_ano <= :ano AND terc_nit = :nite;
    END
    IF (conc_otroconc = 'S') THEN
    BEGIN
    anosum = CAST(ano AS INTEGER);
    anosum = anosum - 1;
    SELECT SUM (noco_valor) FROM nomina_conceptos n WHERE n.noco_ano = :anosum AND n.conc_cod = :conc_codotroconc AND N.terc_nit = :nite INTO :valor;
    UPDATE nomina_conceptos SET noco_pagook = 'S' WHERE noco_ano = :anosum AND conc_cod = :conc_codotroconc AND terc_nit = :nite;
    END
/*SI EL CONCEPTO ES UN APORTE*/
IF (conc_aporte = 'S') THEN
BEGIN
    IF ((:entidad = '' ) OR (entidad IS NULL)) THEN
    BEGIN
     SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
     IF (comision IS NULL) THEN
     comision = 0;
     valor = :basico + :comision;
    IF ((conc_cod = 904) OR (conc_cod = 905) OR (conc_cod = 906)) THEN
            BEGIN
            entidad = :nitafp;
                IF (conc_cod = 904) THEN
                BEGIN
                SELECT A.paan_afptr FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = (((((:basico /30) * :diaslab ) + :comision)+ :cambsaltrans) * :PORCEN) /100;
                END
                ELSE
                IF ((conc_cod = 905) OR (conc_cod = 906)) THEN
                BEGIN
                SELECT A.paan_afpem FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = (((((:basico /30) * :diaslab ) + :comision)+ :cambsaltrans) * :PORCEN) /100;
                END
                EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
            END
            ELSE
       IF ((conc_cod = 907) OR (conc_cod = 914) OR (conc_cod = 915)) THEN
            BEGIN
            entidad = :niteps;
                IF (conc_cod = 907) THEN
                BEGIN
                SELECT A.paan_epstr FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = (((((:basico )/30 * :diaslab ) + :comision)+ :cambsaltrans) * :PORCEN) /100;
                END
                ELSE
                IF ((conc_cod = 914) OR (conc_cod = 915)) THEN
                BEGIN
                SELECT A.paan_epsem FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = (((((:basico )/30 * :diaslab ) + :comision)+ :cambsaltrans) * :PORCEN) /100;
                END
                EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
            END
            ELSE
       IF ((conc_cod = 910) OR (conc_cod = 911) OR (conc_cod = 916) OR (conc_cod = 917) OR (conc_cod = 918) OR (conc_cod = 919)) THEN
            BEGIN
            entidad = :nitccf;
            SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
            IF (comision IS NULL) THEN
            comision = 0;
                IF ((conc_cod = 910) OR (conc_cod = 911) ) THEN
                BEGIN
                SELECT A.paan_ccf FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = (((((:basico )/30 * :diaslab ) + :comision)+ :cambsaltrans) * :PORCEN) /100;
                EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
                END
                ELSE
                IF ((conc_cod = 916) OR (conc_cod = 917)) THEN
                BEGIN
                SELECT A.paan_icbf FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = (((((:basico )/30 * :diaslab ) + :comision)+ :cambsaltrans) * :PORCEN) /100;
                EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
                END
                ELSE
                IF ((conc_cod = 918) OR (conc_cod = 919)) THEN
                BEGIN
                SELECT A.paan_sena FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = (((((:basico )/30 * :diaslab ) + :comision)+ :cambsaltrans) * :PORCEN) /100;
                EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
                END
            END
            ELSE
        IF ((conc_cod = 912) OR (conc_cod = 913)) THEN
            BEGIN
            entidad = :nitafc;
            SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
            IF (comision IS NULL) THEN
            comision = 0;
                IF ((conc_cod = 912) OR (conc_cod = 913) ) THEN
                BEGIN
                SELECT A.paan_cesemp FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = ((((:basico + :comision)/30 * :diaslab )+ :cambsaltrans) * :PORCEN) /100;
                EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
                END
            END
            ELSE
        BEGIN
        SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
        IF (comision IS NULL) THEN
        comision = 0;
        conc_monto = :basico + :comision;
        IF (conc_porc <> 0 AND conc_porc IS NOT NULL) THEN
        VALOR = (((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans) * :conc_porc) /100;
        ELSE
        IF (:porcen <> 0 AND :porcen IS NOT NULL) THEN
        VALOR = (((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans) * :porcen) /100;
        ELSE
        IF (:montos <> 0 AND :montos IS NOT NULL) THEN
        valor = :montos;
        ELSE
        IF (:conc_monto <> 0 AND :conc_monto IS NOT NULL) THEN
        valor = :conc_monto;
        EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
        END
    END
    END
    ELSE
    IF (conc_prov = 'S') THEN
    BEGIN
        conc_monto = :basico;
        IF (conc_porc <> 0 AND conc_porc IS NOT NULL) THEN
        VALOR = (((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans) * :conc_porc) /100;
        ELSE
        IF (porcen <> 0 AND porcen IS NOT NULL) THEN
        VALOR = (((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans) * :porcen) /100;
        ELSE
        IF (montos <> 0 AND montos IS NOT NULL) THEN
        VALOR = :montos;
        ELSE
        IF (conc_monto <> 0 AND conc_monto IS NOT NULL) THEN
        VALOR = :conc_monto;
        EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
    END
item = :item + 1;
END
    IF (liquidaper = 0) THEN
    INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
    VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
    ELSE
    IF (liquidaper = 1) THEN
    BEGIN
    rmod = mod(:periodo, 2);
    IF (rmod = 0) THEN
        INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
        VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
    END
    ELSE
    IF (liquidaper = 2) THEN
    BEGIN
    rmod = mod(:periodo, 4);
    IF (rmod = 0) THEN
        INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
        VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
    END
END
END
END
END
ELSE
/*SI ES MENSUAL*/
IF (periodicidad = 1) THEN
BEGIN
EXECUTE PROCEDURE cambie_id_nomina RETURNING_VALUES(:idnomina);
INSERT INTO nomina (nomi_id, NOMI_FECCAUSA, NOMI_PAGOGLOBAL, NOMI_PERIODOCIDAD, NOMI_PERIODO, NOMI_ANO, NOMI_LIQOK)
VALUES (:IDNOMINA, :fec,:pagoglobal, :periodicidad, :periodo, :ano, 'N');
    BEGIN
    item = 1;
    FOR SELECT E.TERC_NIT, E.empl_salario, e.empl_eps, e.empl_afc, e.empl_afp, e.empl_ccf
    FROM EMPLEADOS E
    WHERE E.empl_ppago = 1
    INTO :nite, :basico, :niteps, :nitafc, :nitafp, :nitccf
    DO
    FOR SELECT CE.TERC_NIT, CE.CONC_COD, CE.EMCO_MONTO, CE.EMCO_PORC, ce.empl_entidad, CE.emco_perprom, CE.emco_luquidaper,    CN.CONC_COD, CN.CONC_DEDUC,CN.CONC_PORC, CN.CONC_ENTIDAD, CN.CONC_MONTO,  CN.CONC_DIAS, CN.CONC_MODIFI,
    CN.CONC_PROMEDIO, CN.conc_salario, CE.emco_perprom, CN.conc_prov, CN.conc_aporte, CN.conc_aplicaprom, cn.conc_otroconc, cn.conc_codotroconc, CN.conc_gtoempr
    FROM empleado_conceptos CE, CONCEPTOS_NOMINA CN WHERE ((CE.terc_nit = :nite) AND (CE.CONC_COD = CN.CONC_COD) AND (CN.conc_fecini <= :fec AND CN.conc_fecfin >= :FEC) ) OR ((CE.terc_nit = :nite)
    AND (CE.CONC_COD = CN.CONC_COD) AND (cn.conc_todosper = 'N') AND (CE.emco_ppago = :periodo)) OR  ((CE.terc_nit = :nite) AND (CE.CONC_COD = CN.CONC_COD) AND cn.conc_todosper = 'S')  ORDER BY (TERC_NIT)
    INTO :nit_tercero, :concept,  :montos, :porcen, :entidad, :numeroprom, :liquidaper ,:CONC_COD, :CONC_DEDUC, :CONC_PORC,
    :CONC_ENTIDAD, :CONC_MONTO, :CONC_DIAS, :CONC_MODIFI,:CONC_PROMEDIO, :salario,:EMCO_PERPROM, :conc_prov, :conc_aporte , :CONC_APLICAPROM, :conc_otroconc, :conc_codotroconc, :gtoempr    DO
BEGIN
    IF (conc_dias = 'S') THEN
    EXECUTE PROCEDURE DIAS_LABORADOS (:nite, :periodo) RETURNING_VALUES (:diaslab);
    ELSE
    diaslab = 30;
 SELECT ((n.nono_valor /30) * n.nono_dura) FROM nomina_novedades n WHERE n.tnov_cod = 11 AND n.terc_nit = :nite AND n.nono_periodo = :periodo INTO :cambsaltrans;
 IF (cambsaltrans IS NULL) THEN
 cambsaltrans = 0;
/* basico = :basico + :cambsaltrans;*/
 IF (conc_cod = 920) THEN
 BEGIN
 SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :valor;
 IF (valor IS NULL) THEN
 valor = 0;
 item = :item + 1;
 END
 ELSE
 BEGIN
    IF ((:montos = 0) OR (:montos IS NULL)) THEN
      BEGIN
      IF ((CONC_PORC = 0 AND :porcen = 0) OR (CONC_PORC IS NULL AND :porcen = 0) OR (CONC_PORC = 0 AND :porcen IS NULL) OR (CONC_PORC IS NULL AND :porcen IS NULL) ) THEN
        BEGIN
        IF ((conc_monto <> 0) AND (conc_monto IS NOT NULL) ) THEN
        BEGIN
        VALOR = :CONC_MONTO/30 * :diaslab;
        EXECUTE PROCEDURE REDONDEE(:valor, 5) RETURNING_VALUES (VALOR);
        END
        ELSE
        IF (salario = 'S' AND CONC_COD <> 900) THEN
        BEGIN
        conc_monto = :basico;
        VALOR = (:conc_monto/30 * :diaslab ) + :cambsaltrans;
        EXECUTE PROCEDURE REDONDEE(:valor, 5) RETURNING_VALUES (VALOR);
        END
        ELSE
        valor = montos;
        END
       ELSE
       BEGIN
        IF (:porcen <> 0) THEN
          BEGIN
            IF ((conc_monto <> 0) AND (conc_monto IS NOT NULL) ) THEN
            BEGIN
              VALOR = ((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans * :PORCEN) /100;
              EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
            END
          END
          ELSE
          BEGIN
            IF ((conc_monto <> 0) AND (conc_monto IS NOT NULL) ) THEN
            BEGIN
              VALOR = ((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans * :conc_porc) /100;
              EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
            END
            ELSE
        IF (salario = 'S' AND CONC_COD <> 900 AND CONC_COD <> 920) THEN
            BEGIN
              conc_monto = :basico;
              VALOR = ((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans * :conc_porc) /100;
              EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
            END
          END
       END
      END
    ELSE
    BEGIN
      IF (CONC_PORC = 0 AND :porcen = 0) THEN
      BEGIN
      VALOR = (:montos/30 * :diaslab );
      EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
      END
      ELSE
      BEGIN
        IF (:porcen <> 0) THEN
          BEGIN
          VALOR = ((:MONTOS/30 * :diaslab )+ :cambsaltrans * :PORCEN) /100;
          EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
          END
          ELSE
          BEGIN
          VALOR = ((:montos/30 * :diaslab )+ :cambsaltrans * :CONC_PORC) /100;
          END
          EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
       END
   END
    IF (conc_promedio = 'S') THEN
    BEGIN
    perinicial = :periodo - (:numeroprom) + 1;
    anoprom = CAST (ano AS INTEGER);
    IF (perinicial <= 0) THEN
    BEGIN
    perinicial = 24 + :PERINICIAL;
    anoprom = CAST(ANO AS INTEGER) - 1;
    END
    SELECT SUM (noco_valor) FROM nomina_conceptos n WHERE n.noco_aplicaprom = 'S' AND N.noco_periodo >= :perinicial - 1 AND N.noco_periodo < :periodo AND N.noco_ano >= :anoprom AND N.noco_ano <= :ano AND terc_nit = :nite INTO :valor;
    valor = (valor / numeroprom)/*/ 30 * :diaslab*/;
    EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
    UPDATE nomina_conceptos N SET noco_pagook = 'S' WHERE n.noco_aplicaprom = 'S' AND N.noco_periodo >= :perinicial - 1 AND N.noco_periodo < :periodo AND N.noco_ano >= :anoprom AND N.noco_ano <= :ano AND terc_nit = :nite;
    END
    IF (conc_otroconc = 'S') THEN
    BEGIN
    anosum = CAST(ano AS INTEGER);
    anosum = anosum - 1;
    SELECT SUM (noco_valor) FROM nomina_conceptos n WHERE n.noco_ano = :anosum AND n.conc_cod = :conc_codotroconc AND N.terc_nit = :nite INTO :valor;
    UPDATE nomina_conceptos SET noco_pagook = 'S' WHERE noco_ano = :anosum AND conc_cod = :conc_codotroconc AND terc_nit = :nite;
    END
/*SI EL CONCEPTO ES UN APORTE*/
IF (conc_aporte = 'S') THEN
BEGIN
    IF ((:entidad = '' ) OR (entidad IS NULL)) THEN
    BEGIN
     SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
     IF (comision IS NULL) THEN
     comision = 0;
     valor = :basico + :comision;
    IF ((conc_cod = 904) OR (conc_cod = 905) OR (conc_cod = 906)) THEN
            BEGIN
            entidad = :nitafp;
                IF (conc_cod = 904) THEN
                BEGIN
                SELECT A.paan_afptr FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = (((((:basico /30) * :diaslab ) + :comision)+ :cambsaltrans) * :PORCEN) /100;
                END
                ELSE
                IF ((conc_cod = 905) OR (conc_cod = 906)) THEN
                BEGIN
                SELECT A.paan_afpem FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = (((((:basico /30) * :diaslab ) + :comision)+ :cambsaltrans) * :PORCEN) /100;
                END
                EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
            END
            ELSE
       IF ((conc_cod = 907) OR (conc_cod = 914) OR (conc_cod = 915)) THEN
            BEGIN
            entidad = :niteps;
                IF (conc_cod = 907) THEN
                BEGIN
                SELECT A.paan_epstr FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = (((((:basico )/30 * :diaslab ) + :comision)+ :cambsaltrans) * :PORCEN) /100;
                END
                ELSE
                IF ((conc_cod = 914) OR (conc_cod = 915)) THEN
                BEGIN
                SELECT A.paan_epsem FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = (((((:basico )/30 * :diaslab ) + :comision)+ :cambsaltrans) * :PORCEN) /100;
                END
                EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
            END
            ELSE
       IF ((conc_cod = 910) OR (conc_cod = 911) OR (conc_cod = 916) OR (conc_cod = 917) OR (conc_cod = 918) OR (conc_cod = 919)) THEN
            BEGIN
            entidad = :nitccf;
            SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
            IF (comision IS NULL) THEN
            comision = 0;
                IF ((conc_cod = 910) OR (conc_cod = 911) ) THEN
                BEGIN
                SELECT A.paan_ccf FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = (((((:basico )/30 * :diaslab ) + :comision)+ :cambsaltrans) * :PORCEN) /100;
                EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
                END
                ELSE
                IF ((conc_cod = 916) OR (conc_cod = 917)) THEN
                BEGIN
                SELECT A.paan_icbf FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = (((((:basico )/30 * :diaslab ) + :comision)+ :cambsaltrans) * :PORCEN) /100;
                EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
                END
                ELSE
                IF ((conc_cod = 918) OR (conc_cod = 919)) THEN
                BEGIN
                SELECT A.paan_sena FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = (((((:basico )/30 * :diaslab ) + :comision)+ :cambsaltrans) * :PORCEN) /100;
                EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
                END
            END
            ELSE
        IF ((conc_cod = 912) OR (conc_cod = 913)) THEN
            BEGIN
            entidad = :nitafc;
            SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
            IF (comision IS NULL) THEN
            comision = 0;
                IF ((conc_cod = 912) OR (conc_cod = 913) ) THEN
                BEGIN
                SELECT A.paan_cesemp FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = ((((:basico + :comision)/30 * :diaslab )+ :cambsaltrans) * :PORCEN) /100;
                EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
                END
            END
            ELSE
        BEGIN
        SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
        IF (comision IS NULL) THEN
        comision = 0;
        conc_monto = :basico + :comision;
        IF (conc_porc <> 0 AND conc_porc IS NOT NULL) THEN
        VALOR = (((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans) * :conc_porc) /100;
        ELSE
        IF (:porcen <> 0 AND :porcen IS NOT NULL) THEN
        VALOR = (((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans) * :porcen) /100;
        ELSE
        IF (:montos <> 0 AND :montos IS NOT NULL) THEN
        valor = :montos;
        ELSE
        IF (:conc_monto <> 0 AND :conc_monto IS NOT NULL) THEN
        valor = :conc_monto;
        EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
        END
    END
    END
    ELSE
    IF (conc_prov = 'S') THEN
    BEGIN
        conc_monto = :basico;
        IF (conc_porc <> 0 AND conc_porc IS NOT NULL) THEN
        VALOR = (((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans) * :conc_porc) /100;
        ELSE
        IF (porcen <> 0 AND porcen IS NOT NULL) THEN
        VALOR = (((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans) * :porcen) /100;
        ELSE
        IF (montos <> 0 AND montos IS NOT NULL) THEN
        VALOR = :montos;
        ELSE
        IF (conc_monto <> 0 AND conc_monto IS NOT NULL) THEN
        VALOR = :conc_monto;
        EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
    END
item = :item + 1;
END
    IF (liquidaper = 0) THEN
    INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
    VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
    ELSE
    IF (liquidaper = 1) THEN
    BEGIN
    rmod = mod(:periodo, 2);
    IF (rmod = 0) THEN
        INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
        VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
    END
    ELSE
    IF (liquidaper = 2) THEN
    BEGIN
    rmod = mod(:periodo, 4);
    IF (rmod = 0) THEN
        INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
        VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
    END
END
END
END
ELSE
/*SI ES SEMANAL*/
IF (periodicidad = 3) THEN
BEGIN
EXECUTE PROCEDURE cambie_id_nomina RETURNING_VALUES(:idnomina);
INSERT INTO nomina (nomi_id, NOMI_FECCAUSA, NOMI_PAGOGLOBAL, NOMI_PERIODOCIDAD, NOMI_PERIODO, NOMI_ANO, NOMI_LIQOK)
VALUES (:IDNOMINA, :fec,:pagoglobal, :periodicidad, :periodo, :ano, 'N');
    BEGIN
    item = 1;
    FOR SELECT E.TERC_NIT, E.empl_salario, e.empl_eps, e.empl_afc, e.empl_afp, e.empl_ccf
    FROM EMPLEADOS E
    WHERE E.empl_ppago = 3
    INTO :nite, :basico, :niteps, :nitafc, :nitafp, :nitccf
    DO
    BEGIN
    FOR SELECT CE.TERC_NIT, CE.CONC_COD, CE.EMCO_MONTO, CE.EMCO_PORC, ce.empl_entidad, CE.emco_perprom, CE.emco_luquidaper,    CN.CONC_COD, CN.CONC_DEDUC,CN.CONC_PORC, CN.CONC_ENTIDAD, CN.CONC_MONTO,  CN.CONC_DIAS, CN.CONC_MODIFI,
    CN.CONC_PROMEDIO, CN.conc_salario, CE.emco_perprom, CN.conc_prov, CN.conc_aporte, CN.conc_aplicaprom, cn.conc_otroconc, cn.conc_codotroconc, CN.conc_gtoempr
    FROM empleado_conceptos CE, CONCEPTOS_NOMINA CN WHERE ((CE.terc_nit = :nite) AND (CE.CONC_COD = CN.CONC_COD) AND (CN.conc_fecini <= :fec AND CN.conc_fecfin >= :FEC) ) OR ((CE.terc_nit = :nite)
    AND (CE.CONC_COD = CN.CONC_COD) AND (cn.conc_todosper = 'N') AND (CE.emco_ppago = :periodo)) OR  ((CE.terc_nit = :nite) AND (CE.CONC_COD = CN.CONC_COD) AND cn.conc_todosper = 'S')  ORDER BY (TERC_NIT)
    INTO :nit_tercero, :concept,  :montos, :porcen, :entidad, :numeroprom, :liquidaper ,:CONC_COD, :CONC_DEDUC, :CONC_PORC,
    :CONC_ENTIDAD, :CONC_MONTO, :CONC_DIAS, :CONC_MODIFI,:CONC_PROMEDIO, :salario,:EMCO_PERPROM, :conc_prov, :conc_aporte , :CONC_APLICAPROM, :conc_otroconc, :conc_codotroconc, :gtoempr
    DO
BEGIN
    IF (conc_dias = 'S') THEN
    EXECUTE PROCEDURE DIAS_LABORADOS (:nite, :periodo) RETURNING_VALUES (:diaslab);
    ELSE
    BEGIN
    IF (liquidaper = 0) THEN
    diaslab = 7;
    ELSE
    IF (liquidaper = 1) THEN
    diaslab = 15;
    ELSE
    IF (liquidaper = 2) THEN
    diaslab = 30;
    END
 SELECT ((n.nono_valor /30) * n.nono_dura) FROM nomina_novedades n WHERE n.tnov_cod = 11 AND n.terc_nit = :nite AND n.nono_periodo = :periodo INTO :cambsaltrans;
 IF (cambsaltrans IS NULL) THEN
 cambsaltrans = 0;
/* basico = :basico + :cambsaltrans;*/
 IF (conc_cod = 920) THEN
 BEGIN
 SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :valor;
 IF (valor IS NULL) THEN
 valor = 0;
 item = :item + 1;
 END
 ELSE
 BEGIN
    IF ((:montos = 0) OR (:montos IS NULL)) THEN
      BEGIN
      IF ((CONC_PORC = 0 AND :porcen = 0) OR (CONC_PORC IS NULL AND :porcen = 0) OR (CONC_PORC = 0 AND :porcen IS NULL) OR (CONC_PORC IS NULL AND :porcen IS NULL) ) THEN
        BEGIN
        IF ((conc_monto <> 0) AND (conc_monto IS NOT NULL) ) THEN
        BEGIN
        VALOR = :CONC_MONTO/30 * :diaslab;
        EXECUTE PROCEDURE REDONDEE(:valor, 5) RETURNING_VALUES (VALOR);
        END
        ELSE
        IF (salario = 'S' AND CONC_COD <> 900) THEN
        BEGIN
        conc_monto = :basico;
        VALOR = (:conc_monto/30 * :diaslab ) + :cambsaltrans;
        EXECUTE PROCEDURE REDONDEE(:valor, 5) RETURNING_VALUES (VALOR);
        END
        ELSE
        valor = montos;
        END
       ELSE
       BEGIN
        IF (:porcen <> 0) THEN
          BEGIN
            IF ((conc_monto <> 0) AND (conc_monto IS NOT NULL) ) THEN
            BEGIN
              VALOR = ((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans * :PORCEN) /100;
              EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
            END
          END
          ELSE
          BEGIN
            IF ((conc_monto <> 0) AND (conc_monto IS NOT NULL) ) THEN
            BEGIN
              VALOR = ((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans * :conc_porc) /100;
              EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
            END
            ELSE
        IF (salario = 'S' AND CONC_COD <> 900 AND CONC_COD <> 920) THEN
            BEGIN
              conc_monto = :basico;
              VALOR = ((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans * :conc_porc) /100;
              EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
            END
          END
       END
      END
    ELSE
    BEGIN
      IF (CONC_PORC = 0 AND :porcen = 0) THEN
      BEGIN
      VALOR = (:montos/30 * :diaslab );
      EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
      END
      ELSE
      BEGIN
        IF (:porcen <> 0) THEN
          BEGIN
          VALOR = ((:MONTOS/30 * :diaslab )+ :cambsaltrans * :PORCEN) /100;
          EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
          END
          ELSE
          BEGIN
          VALOR = ((:montos/30 * :diaslab )+ :cambsaltrans * :CONC_PORC) /100;
          END
          EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
       END
   END
    IF (conc_promedio = 'S') THEN
    BEGIN
    perinicial = :periodo - (:numeroprom) + 1;
    anoprom = CAST (ano AS INTEGER);
    IF (perinicial <= 0) THEN
    BEGIN
    perinicial = 24 + :PERINICIAL;
    anoprom = CAST(ANO AS INTEGER) - 1;
    END
    SELECT SUM (noco_valor) FROM nomina_conceptos n WHERE n.noco_aplicaprom = 'S' AND N.noco_periodo >= :perinicial - 1 AND N.noco_periodo < :periodo AND N.noco_ano >= :anoprom AND N.noco_ano <= :ano AND terc_nit = :nite INTO :valor;
    valor = (valor / numeroprom)/*/ 30 * :diaslab*/;
    EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
    UPDATE nomina_conceptos N SET noco_pagook = 'S' WHERE n.noco_aplicaprom = 'S' AND N.noco_periodo >= :perinicial - 1 AND N.noco_periodo < :periodo AND N.noco_ano >= :anoprom AND N.noco_ano <= :ano AND terc_nit = :nite;
    END
    IF (conc_otroconc = 'S') THEN
    BEGIN
    anosum = CAST(ano AS INTEGER);
    anosum = anosum - 1;
    SELECT SUM (noco_valor) FROM nomina_conceptos n WHERE n.noco_ano = :anosum AND n.conc_cod = :conc_codotroconc AND N.terc_nit = :nite INTO :valor;
    UPDATE nomina_conceptos SET noco_pagook = 'S' WHERE noco_ano = :anosum AND conc_cod = :conc_codotroconc AND terc_nit = :nite;
    END
/*SI EL CONCEPTO ES UN APORTE*/
IF (conc_aporte = 'S') THEN
BEGIN
    IF ((:entidad = '' ) OR (entidad IS NULL)) THEN
    BEGIN
     SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
     IF (comision IS NULL) THEN
     comision = 0;
     valor = :basico + :comision;
    IF ((conc_cod = 904) OR (conc_cod = 905) OR (conc_cod = 906)) THEN
            BEGIN
            entidad = :nitafp;
                IF (conc_cod = 904) THEN
                BEGIN
                SELECT A.paan_afptr FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = (((((:basico /30) * :diaslab ) + :comision)+ :cambsaltrans) * :PORCEN) /100;
                END
                ELSE
                IF ((conc_cod = 905) OR (conc_cod = 906)) THEN
                BEGIN
                SELECT A.paan_afpem FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = (((((:basico /30) * :diaslab ) + :comision)+ :cambsaltrans) * :PORCEN) /100;
                END
                EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
            END
            ELSE
       IF ((conc_cod = 907) OR (conc_cod = 914) OR (conc_cod = 915)) THEN
            BEGIN
            entidad = :niteps;
                IF (conc_cod = 907) THEN
                BEGIN
                SELECT A.paan_epstr FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = (((((:basico )/30 * :diaslab ) + :comision)+ :cambsaltrans) * :PORCEN) /100;
                END
                ELSE
                IF ((conc_cod = 914) OR (conc_cod = 915)) THEN
                BEGIN
                SELECT A.paan_epsem FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = (((((:basico )/30 * :diaslab ) + :comision)+ :cambsaltrans) * :PORCEN) /100;
                END
                EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
            END
            ELSE
       IF ((conc_cod = 910) OR (conc_cod = 911) OR (conc_cod = 916) OR (conc_cod = 917) OR (conc_cod = 918) OR (conc_cod = 919)) THEN
            BEGIN
            entidad = :nitccf;
            SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
            IF (comision IS NULL) THEN
            comision = 0;
                IF ((conc_cod = 910) OR (conc_cod = 911) ) THEN
                BEGIN
                SELECT A.paan_ccf FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = (((((:basico )/30 * :diaslab ) + :comision)+ :cambsaltrans) * :PORCEN) /100;
                EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
                END
                ELSE
                IF ((conc_cod = 916) OR (conc_cod = 917)) THEN
                BEGIN
                SELECT A.paan_icbf FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = (((((:basico )/30 * :diaslab ) + :comision)+ :cambsaltrans) * :PORCEN) /100;
                EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
                END
                ELSE
                IF ((conc_cod = 918) OR (conc_cod = 919)) THEN
                BEGIN
                SELECT A.paan_sena FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = (((((:basico )/30 * :diaslab ) + :comision)+ :cambsaltrans) * :PORCEN) /100;
                EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
                END
            END
            ELSE
        IF ((conc_cod = 912) OR (conc_cod = 913)) THEN
            BEGIN
            entidad = :nitafc;
            SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
            IF (comision IS NULL) THEN
            comision = 0;
                IF ((conc_cod = 912) OR (conc_cod = 913) ) THEN
                BEGIN
                SELECT A.paan_cesemp FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = ((((:basico + :comision)/30 * :diaslab )+ :cambsaltrans) * :PORCEN) /100;
                EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
                END
            END
            ELSE
        BEGIN
        SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
        IF (comision IS NULL) THEN
        comision = 0;
        conc_monto = :basico + :comision;
        IF (conc_porc <> 0 AND conc_porc IS NOT NULL) THEN
        VALOR = (((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans) * :conc_porc) /100;
        ELSE
        IF (:porcen <> 0 AND :porcen IS NOT NULL) THEN
        VALOR = (((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans) * :porcen) /100;
        ELSE
        IF (:montos <> 0 AND :montos IS NOT NULL) THEN
        valor = :montos;
        ELSE
        IF (:conc_monto <> 0 AND :conc_monto IS NOT NULL) THEN
        valor = :conc_monto;
        EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
        END
    END
    END
    ELSE
    IF (conc_prov = 'S') THEN
    BEGIN
        conc_monto = :basico;
        IF (conc_porc <> 0 AND conc_porc IS NOT NULL) THEN
        VALOR = (((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans) * :conc_porc) /100;
        ELSE
        IF (porcen <> 0 AND porcen IS NOT NULL) THEN
        VALOR = (((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans) * :porcen) /100;
        ELSE
        IF (montos <> 0 AND montos IS NOT NULL) THEN
        VALOR = :montos;
        ELSE
        IF (conc_monto <> 0 AND conc_monto IS NOT NULL) THEN
        VALOR = :conc_monto;
        EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
    END
item = :item + 1;
END
    IF (liquidaper = 0) THEN
    INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
    VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
    ELSE
    IF (liquidaper = 1) THEN
    BEGIN
    rmod = mod(:periodo, 2);
    IF (rmod = 0) THEN
        INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
        VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
    END
    ELSE
    IF (liquidaper = 2) THEN
    BEGIN
    rmod = mod(:periodo, 4);
    IF (rmod = 0) THEN
        INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
        VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
    END
END
END
END
END
SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE CALC_SALDOSINI_NOMINA(
    FECHA DATE)
RETURNS (
    EMPLNIT VARCHAR(20),
    EMPLNOM VARCHAR(60),
    PRIMAJUNIO NUMERIC(18,2),
    CONC_CODPRIMAJUN INTEGER,
    PRIMADIC NUMERIC(18,2),
    CONC_CODPRIMADIC INTEGER,
    CESANTIA NUMERIC(18,2),
    CONC_CODCESAN INTEGER,
    VACAC NUMERIC(18,2),
    CONC_CODVACACI INTEGER,
    INTCES NUMERIC(18,2),
    CONC_CODINTCES INTEGER)
AS
DECLARE VARIABLE numeromeses INTEGER;
DECLARE VARIABLE fechaing DATE;
DECLARE VARIABLE ANOACT INTEGER;
DECLARE VARIABLE MESACT INTEGER;
DECLARE VARIABLE DIAACT INTEGER;
DECLARE VARIABLE ANOING INTEGER;
DECLARE VARIABLE DIAING INTEGER;
DECLARE VARIABLE MESING INTEGER;
DECLARE VARIABLE salario NUMERIC(18,2);
DECLARE VARIABLE item INTEGER;
DECLARE VARIABLE idsaldo INTEGER;
BEGIN
DELETE FROM nomina WHERE nomi_periodo = 0;
idsaldo = GEN_ID(id_nomina,1);
INSERT INTO nomina  (nomi_id, nomi_feccausa, nomi_liqok, nomi_periodo) VALUES (:idsaldo, :fecha, 'S', 0);
item = 1;
anoact = CAST(substr(:fecha,1,4)AS INTEGER);
mesact = CAST(substr(:fecha,6,7)AS INTEGER);
diaact = CAST(substr(:fecha,9,10)AS INTEGER);
FOR SELECT  E.TERC_NIT, T.TERC_NOM, E.EMPL_FECING, E.empl_salario FROM EMPLEADOS E, TERCEROS T WHERE T.terc_nit = E.terc_nit AND e.empl_fecing <= :fecha INTO :emplnit, :emplnom, :fechaing, :salario
DO
  BEGIN
    anoing = CAST(substr(:fechaing,1,4)AS INTEGER);
    mesing = CAST(substr(:fechaing,6,7)AS INTEGER);
    diaing = CAST(substr(:fechaing,9,10)AS INTEGER);
    numeromeses = mesact - 1;
    cesantia = (:salario / 12) * :numeromeses;
    intces = cesantia * 1 /100;
    numeromeses = ((:anoact-:anoing)*12)-((:mesact-:mesing)*(-1))-1;
    IF (numeromeses > 12) THEN
    numeromeses = 12;
    IF (numeromeses < 0) THEN
    numeromeses = 0;
    vacac = (:salario / 12) * :numeromeses;
    IF (anoact = anoing) THEN
    BEGIN
    IF (mesact > 1 AND mesact <= 6) THEN
    BEGIN
    numeromeses = :mesact - :mesing;
    primajunio = (:salario / 12) * :numeromeses;
    END
    ELSE
    primajunio = 0;
    IF (mesact > 7 AND mesact <= 12) THEN
    BEGIN
    numeromeses = :mesact - 6;
    primadic = (:salario / 12) * (:numeromeses);
    END
    END
    ELSE
    IF (mesact > 1 AND mesact <= 6) THEN
    BEGIN
    numeromeses = :mesact - 1;
    primajunio = (:salario / 12) * :numeromeses;
    END
    ELSE
    IF (mesact > 7 AND mesact <= 12) THEN
    BEGIN
    numeromeses = :mesact - 7;
    primadic = (:salario / 12) * (:numeromeses);
    END
EXECUTE PROCEDURE redondee(:primajunio, 5) RETURNING_VALUES :primajunio;
EXECUTE PROCEDURE redondee(:primadic, 5) RETURNING_VALUES :primadic;
EXECUTE PROCEDURE redondee(:cesantia, 5) RETURNING_VALUES :cesantia;
EXECUTE PROCEDURE redondee(:intces, 5) RETURNING_VALUES :intces;
EXECUTE PROCEDURE redondee(:vacac, 5) RETURNING_VALUES :vacac;
/*if ( cesantia <> 0 AND cesantia IS NOT NULL and  intces <> 0 AND intces IS NOT NULL and primajunio <> 0 AND primajunio IS NOT NULL and vacac <> 0 AND vacac IS NOT NULL and primadic <> 0 AND primadic IS NOT NULL) then*/
SELECT conc_cod FROM empleado_conceptos WHERE ((conc_cod = 912) OR (conc_cod = 913)) AND terc_nit = :emplnit INTO :conc_codcesan;
SELECT conc_cod FROM empleado_conceptos WHERE ((conc_cod = 921) OR (conc_cod = 925)) AND terc_nit = :emplnit INTO :conc_codintces;
SELECT conc_cod FROM empleado_conceptos WHERE ((conc_cod = 927) OR (conc_cod = 923)) AND terc_nit = :emplnit INTO :conc_codprimajun;
SELECT conc_cod FROM empleado_conceptos WHERE ((conc_cod = 924) OR (conc_cod = 928)) AND terc_nit = :emplnit INTO :conc_codprimadic;
SELECT conc_cod FROM empleado_conceptos WHERE ((conc_cod = 922) OR (conc_cod = 926)) AND terc_nit = :emplnit  INTO :conc_codvacaci;
IF (cesantia <> 0 AND cesantia IS NOT NULL) THEN
BEGIN
INSERT INTO NOMINA_CONCEPTOS (NOMI_ID, NOCO_ITEM, CONC_COD, TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC, NOCO_PROV, NOCO_APORTE, NOCO_PAGOOK, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, NOCO_GTOEMPR) VALUES (:idsaldo, :item, :conc_codcesan, :emplnit, :cesantia, '', 'N', 'S', 'N', 'N', 0, :anoact, 'N', 'N', 'N', 'S');
item = :item + 1;
END
IF (intces <> 0 AND intces IS NOT NULL) THEN
BEGIN
INSERT INTO NOMINA_CONCEPTOS (NOMI_ID, NOCO_ITEM, CONC_COD, TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC, NOCO_PROV, NOCO_APORTE, NOCO_PAGOOK, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, NOCO_GTOEMPR) VALUES (:idsaldo, :item, :conc_codintces, :emplnit, :intces, '', 'N', 'S', 'N', 'N', 0, :anoact, 'N', 'N', 'N', 'S');
item = :item + 1;
END
IF (primajunio <> 0 AND primajunio IS NOT NULL) THEN
BEGIN
INSERT INTO NOMINA_CONCEPTOS (NOMI_ID, NOCO_ITEM, CONC_COD, TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC, NOCO_PROV, NOCO_APORTE, NOCO_PAGOOK, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, NOCO_GTOEMPR) VALUES (:idsaldo, :item, :conc_codprimajun, :emplnit, :primajunio, '', 'N', 'S', 'N', 'N', 0, :anoact, 'N', 'N', 'N', 'S');
item = :item + 1;
END
IF (primadic <> 0 AND primadic IS NOT NULL) THEN
BEGIN
INSERT INTO NOMINA_CONCEPTOS (NOMI_ID, NOCO_ITEM, CONC_COD, TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC, NOCO_PROV, NOCO_APORTE, NOCO_PAGOOK, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, NOCO_GTOEMPR) VALUES (:idsaldo, :item, :conc_codprimadic, :emplnit, :primadic, '', 'N', 'S', 'N', 'N', 0, :anoact, 'N', 'N', 'N', 'S');
item = :item + 1;
END
IF (vacac <> 0 AND vacac IS NOT NULL) THEN
BEGIN
INSERT INTO NOMINA_CONCEPTOS (NOMI_ID, NOCO_ITEM, CONC_COD, TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC, NOCO_PROV, NOCO_APORTE, NOCO_PAGOOK, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, NOCO_GTOEMPR) VALUES (:idsaldo, :item, :conc_codvacaci, :emplnit, :vacac, '', 'N', 'S', 'N', 'N', 0, :anoact, 'N', 'N', 'N', 'S');
item = :item + 1;
END
    SUSPEND;
  END
END
^

SET TERM ; ^

ALTER TABLE VACACIONES
ADD VACA_OK BOOLEANO;

SET TERM ^ ;

CREATE OR ALTER PROCEDURE LIQUIDA_VACACIONES(
    NITEMPL VARCHAR(20))
RETURNS(VACAC NUMERIC(18,2))
AS
DECLARE VARIABLE SALDOSINI NUMERIC(18,2);
BEGIN
SELECT SUM(NOCO_VALOR) FROM NOMINA_CONCEPTOS WHERE TERC_NIT = :NITEMPL AND ((CONC_COD = 922) OR (CONC_COD = 926)) AND NOCO_PAGOOK = 'N' INTO :vacac;
IF (vacac IS NULL) THEN
VACAC = 0;
SELECT SUM(NOCO_VALOR) FROM NOMINA_CONCEPTOS WHERE TERC_NIT = :NITEMPL AND ((CONC_COD = 922) OR (CONC_COD = 926)) AND NOCO_PAGOOK = 'N' INTO :saldosini;
IF (saldosini IS NULL) THEN
saldosini = 0;
vacac = :vacac + :saldosini;
  SUSPEND;
END
^

SET TERM ; ^


CREATE GENERATOR ID_VACACIONES;

ALTER TABLE VACACIONES
ADD VACA_PERIODO INTEGER;

SET TERM ^ ;

CREATE OR ALTER PROCEDURE LIQUIDA_VACACIONES(
    NITEMPL VARCHAR(20))
RETURNS (
    VACAC NUMERIC(18,2),
    idvacac INTEGER)
AS
DECLARE VARIABLE SALDOSINI NUMERIC(18,2);
BEGIN
idvacac = GEN_ID(ID_VACACIONES,1);
SELECT SUM(NOCO_VALOR) FROM NOMINA_CONCEPTOS WHERE TERC_NIT = :NITEMPL AND ((CONC_COD = 922) OR (CONC_COD = 926)) AND NOCO_PAGOOK = 'N' AND NOCO_PERIODO <> 0 INTO :vacac;
IF (vacac IS NULL) THEN
VACAC = 0;
SELECT SUM(NOCO_VALOR) FROM NOMINA_CONCEPTOS WHERE TERC_NIT = :NITEMPL AND ((CONC_COD = 922) OR (CONC_COD = 926)) AND NOCO_PAGOOK = 'N' AND NOCO_PERIODO = 0 INTO :saldosini;
IF (saldosini IS NULL) THEN
saldosini = 0;
vacac = :vacac + :saldosini;
  SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE TRIGGER VACACIONES_AI FOR VACACIONES
ACTIVE AFTER INSERT POSITION 0
AS
BEGIN
INSERT INTO NOMINA_NOVEDADES (nono_id, tnov_cod, nono_dura, nono_valor, nono_periodo, nono_fecha, nono_ok, nono_ano)
            VALUES (GEN_ID(id_nomi_novedades, 1), 6, NEW.vaca_dias, NEW.vaca_monto, NEW.vaca_periodo, NEW.vaca_fecha, 'S', substr(NEW.vaca_fecha,1,4));
END
^

SET TERM ; ^

GRANT UPDATE,REFERENCES ON VACACIONES TO TRIGGER VACACIONES_AI;
GRANT INSERT ON NOMINA_NOVEDADES TO TRIGGER VACACIONES_AI;

ALTER TABLE LIQUIDACION
ADD LIQD_PERIODO INTEGER;

ALTER TABLE NOMINA_NOVEDADES
ADD NONO_NVODEPTO INTEGER
NOT NULL ;

SET TERM ^ ;

ALTER PROCEDURE IMPR_PLANILLA_NOMINA(
    ID INTEGER,
    PAGO CHAR(1))
RETURNS (
    FECHA DATE,
    OBSERVACIONES BLOB SUB_TYPE 0 SEGMENT SIZE 80,
    PAGOGLOBAL CHAR(1),
    PERIODO INTEGER,
    ANO CHAR(4),
    PERIODICIDAD VARCHAR(60),
    NITEMPL VARCHAR(20),
    VALOR NUMERIC(18,2),
    DEDUC CHAR(1),
    NOMBREEMPL VARCHAR(60),
    NOMCORTCONC VARCHAR(60),
    NOMBRECONC VARCHAR(60),
    CODCONC INTEGER,
    PROV CHAR(1),
    TOTALEMPL NUMERIC(18,2),
    totaldeduc NUMERIC(18,2),
    totaldeveng NUMERIC(18,2))
AS
BEGIN
IF (PAGO = 'N') THEN
BEGIN
FOR SELECT N.nomi_feccausa, N.nomi_obs, N.nomi_pagoglobal, N.nomi_periodo, N.nomi_ano, P.ppag_nombre FROM NOMINA N, periodo_pago P
 WHERE P.ppag_cod = N.nomi_periodocidad AND N.nomi_id = :ID
 INTO :fecha, :observaciones, :pagoglobal, :periodo, :ano, :periodicidad
 DO
 BEGIN
 FOR SELECT NC.terc_nit, NC.noco_valor, NC.noco_deduc, T.terc_nom, C.conc_nomcorto, C.conc_nombre, NC.conc_cod, NC.noco_prov FROM NOMINA_CONCEPTOS NC, TERCEROS T, EMPLEADOS E, CONCEPTOS_NOMINA C
        WHERE NC.nomi_id = :ID AND T.terc_nit = E.terc_nit AND C.conc_cod = NC.conc_cod AND t.terc_nit = nc.terc_nit
      INTO :nitempl, :valor, :deduc, :nombreempl, :nomcortconc, :nombreconc, :codconc, :prov
 DO
 BEGIN
 IF (valor IS NULL) THEN
 valor = 0;
  SUSPEND;
 END
 END
END
ELSE
IF (PAGO = 'S') THEN
BEGIN
FOR SELECT N.nomi_feccausa, N.nomi_obs, N.nomi_pagoglobal, N.nomi_periodo, N.nomi_ano, P.ppag_nombre FROM NOMINA N, periodo_pago P
 WHERE P.ppag_cod = N.nomi_periodocidad AND N.nomi_id = :ID
 INTO :fecha, :observaciones, :pagoglobal, :periodo, :ano, :periodicidad
 DO
 BEGIN
 FOR SELECT NC.terc_nit, NC.noco_valor, NC.noco_deduc, T.terc_nom, C.conc_nomcorto, C.conc_nombre, NC.conc_cod, NC.noco_prov FROM NOMINA_CONCEPTOS NC, TERCEROS T, EMPLEADOS E, CONCEPTOS_NOMINA C
        WHERE NC.nomi_id = :ID AND T.terc_nit = E.terc_nit AND C.conc_cod = NC.conc_cod AND t.terc_nit = nc.terc_nit AND NC.noco_prov = 'N' AND NC.noco_gtoempr = 'N'
      INTO :nitempl, :valor, :deduc, :nombreempl, :nomcortconc, :nombreconc, :codconc, :prov
 DO
 BEGIN
 IF (valor IS NULL) THEN
 valor = 0;
 SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND TERC_NIT = :nitempl INTO :totalempl;
 SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND TERC_NIT = :nitempl AND NC.noco_deduc = 'S' INTO :totaldeduc;
 SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND TERC_NIT = :nitempl AND NC.noco_deduc = 'N' INTO :totaldeveng;
 SUSPEND;
 END
 END
END
END
^

SET TERM ; ^


SET TERM ^ ;

ALTER PROCEDURE CAUSA_NOMINA(
    FEC DATE,
    PERIODO INTEGER,
    PERIODICIDAD INTEGER,
    PAGOGLOBAL CHAR(1),
    ANO CHAR(4))
RETURNS (
    IDNOMINA INTEGER)
AS
DECLARE VARIABLE item INTEGER;
DECLARE VARIABLE nite VARCHAR(20) CHARACTER SET none;
DECLARE VARIABLE nit_tercero VARCHAR(20);
DECLARE VARIABLE concept INTEGER;
DECLARE VARIABLE montos NUMERIC(18,2);
DECLARE VARIABLE porcen NUMERIC(9,4);
DECLARE VARIABLE entidad VARCHAR(20);
DECLARE VARIABLE conc_cod INTEGER;
DECLARE VARIABLE conc_deduc CHAR(1);
DECLARE VARIABLE conc_porc NUMERIC(9,4);
DECLARE VARIABLE conc_entidad INTEGER;
DECLARE VARIABLE conc_monto NUMERIC(18,2);
DECLARE VARIABLE conc_modifi CHAR(1);
DECLARE VARIABLE conc_promedio CHAR(1);
DECLARE VARIABLE emco_perprom INTEGER;
DECLARE VARIABLE valor NUMERIC(18,2);
DECLARE VARIABLE diaslab INTEGER;
DECLARE VARIABLE conc_prov CHAR(1);
DECLARE VARIABLE conc_aporte CHAR(1);
DECLARE VARIABLE numeroprom INTEGER;
DECLARE VARIABLE conc_aplicaprom CHAR(1);
DECLARE VARIABLE perinicial INTEGER;
DECLARE VARIABLE anoprom INTEGER;
DECLARE VARIABLE conc_dias CHAR(1);
DECLARE VARIABLE conc_otroconc CHAR(1);
DECLARE VARIABLE conc_codotroconc INTEGER;
DECLARE VARIABLE anosum INTEGER;
DECLARE VARIABLE salario CHAR(1) CHARACTER SET none;
DECLARE VARIABLE liquidaper INTEGER;
DECLARE VARIABLE rmod NUMERIC(2,2);
DECLARE VARIABLE basico NUMERIC(18,2);
DECLARE VARIABLE niteps VARCHAR(20);
DECLARE VARIABLE nitafc VARCHAR(20);
DECLARE VARIABLE nitafp VARCHAR(20);
DECLARE VARIABLE nitccf VARCHAR(20);
DECLARE VARIABLE gtoempr CHAR(1);
DECLARE VARIABLE comision NUMERIC(18,2);
DECLARE VARIABLE cambsaltrans NUMERIC(18,2);
DECLARE VARIABLE SALDOSINI NUMERIC(18,2);
DECLARE VARIABLE duranov INTEGER;
DECLARE VARIABLE base NUMERIC(18,2);
BEGIN
/*SI ES QUINCENAL*/
IF (periodicidad = 2) THEN
BEGIN
EXECUTE PROCEDURE cambie_id_nomina RETURNING_VALUES(:idnomina);
INSERT INTO nomina (nomi_id, NOMI_FECCAUSA, NOMI_PAGOGLOBAL, NOMI_PERIODOCIDAD, NOMI_PERIODO, NOMI_ANO, NOMI_LIQOK)
VALUES (:IDNOMINA, :fec,:pagoglobal, :periodicidad, :periodo, :ano, 'N');
 BEGIN
    item = 1;
    FOR SELECT E.TERC_NIT, E.empl_salario, e.empl_eps, e.empl_afc, e.empl_afp, e.empl_ccf
    FROM EMPLEADOS E
    WHERE E.empl_ppago = 2
    INTO :nite, :basico, :niteps, :nitafc, :nitafp, :nitccf
    DO
    BEGIN
    FOR SELECT CE.TERC_NIT, CE.CONC_COD, CE.EMCO_MONTO, CE.EMCO_PORC, ce.empl_entidad, CE.emco_perprom, CE.emco_luquidaper, CN.CONC_COD, CN.CONC_DEDUC,CN.CONC_PORC, CN.CONC_ENTIDAD, CN.CONC_MONTO,  CN.CONC_DIAS, CN.CONC_MODIFI,
    CN.CONC_PROMEDIO, CN.conc_salario, CE.emco_perprom, CN.conc_prov, CN.conc_aporte, CN.conc_aplicaprom, cn.conc_otroconc, cn.conc_codotroconc, CN.conc_gtoempr, CN.conc_base
    FROM empleado_conceptos CE, CONCEPTOS_NOMINA CN WHERE ((CE.terc_nit = :nite) AND (CE.CONC_COD = CN.CONC_COD) AND (CN.conc_fecini <= :fec AND CN.conc_fecfin >= :FEC) ) OR ((CE.terc_nit = :nite)
    AND (CE.CONC_COD = CN.CONC_COD) AND (cn.conc_todosper = 'N') AND (CE.emco_ppago = :periodo)) OR  ((CE.terc_nit = :nite) AND (CE.CONC_COD = CN.CONC_COD) AND cn.conc_todosper = 'S')  ORDER BY (TERC_NIT )
    INTO :nit_tercero, :concept,  :montos, :porcen, :entidad, :numeroprom, :liquidaper ,:CONC_COD, :CONC_DEDUC, :CONC_PORC,
    :CONC_ENTIDAD, :CONC_MONTO, :CONC_DIAS, :CONC_MODIFI,:CONC_PROMEDIO, :salario,:EMCO_PERPROM, :conc_prov, :conc_aporte , :CONC_APLICAPROM, :conc_otroconc, :conc_codotroconc, :gtoempr, :base
    DO
BEGIN
    IF (conc_dias = 'S') THEN
    EXECUTE PROCEDURE DIAS_LABORADOS (:nite, :periodo) RETURNING_VALUES (:diaslab);
    ELSE
    BEGIN
    IF (liquidaper = 0) THEN
    diaslab = 15;
    ELSE
    IF (liquidaper = 1) THEN
    diaslab = 30;
    ELSE
    IF (liquidaper = 2) THEN
    diaslab = 60;
    END
 SELECT ((n.nono_valor /30) * n.nono_dura), (n.nono_dura) FROM nomina_novedades n WHERE n.tnov_cod = 11 AND n.terc_nit = :nite AND n.nono_periodo = :periodo INTO :cambsaltrans, :duranov;
 IF (cambsaltrans IS NULL) THEN
 cambsaltrans = 0;
 IF (duranov IS NULL) THEN
 duranov = 0;
 diaslab = :diaslab - :duranov;
 IF (conc_cod = 920) THEN
 BEGIN
 SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :valor;
 IF (valor IS NULL) THEN
 valor = 0;
 item = :item + 1;
 END
 ELSE
 IF (conc_cod = 921) THEN
 BEGIN
 IF (porcen IS NOT NULL AND porcen <> 0) THEN
 valor = ((basico / 30)* :diaslab ) * :PORCEN /100;
 ELSE
 IF (conc_porc IS NOT NULL AND conc_porc <> 0) THEN
 valor = ((:basico / 30)* :diaslab ) * :conc_porc /100;
 EXECUTE PROCEDURE REDONDEE(:valor, 5) RETURNING_VALUES (VALOR);
 END
 ELSE
 BEGIN
    IF ((:montos = 0) OR (:montos IS NULL)) THEN
      BEGIN
      IF ((CONC_PORC = 0 AND :porcen = 0) OR (CONC_PORC IS NULL AND :porcen = 0) OR (CONC_PORC = 0 AND :porcen IS NULL) OR (CONC_PORC IS NULL AND :porcen IS NULL) ) THEN
        BEGIN
        IF ((conc_monto <> 0) AND (conc_monto IS NOT NULL) ) THEN
        BEGIN
        VALOR = :CONC_MONTO/30 * :diaslab;
        EXECUTE PROCEDURE REDONDEE(:valor, 5) RETURNING_VALUES (VALOR);
        END
        ELSE
        IF (salario = 'S' AND CONC_COD <> 900) THEN
        BEGIN
        conc_monto = :basico;
        VALOR = (:conc_monto/30 * :diaslab ) + :cambsaltrans;
        EXECUTE PROCEDURE REDONDEE(:valor, 5) RETURNING_VALUES (VALOR);
        END
        ELSE
        valor = montos;
        END
       ELSE
       BEGIN
        IF (:porcen <> 0) THEN
          BEGIN
            IF ((conc_monto <> 0) AND (conc_monto IS NOT NULL) ) THEN
            BEGIN
              VALOR = ((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans * :PORCEN) /100;
              EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
            END
          END
          ELSE
          BEGIN
            IF ((conc_monto <> 0) AND (conc_monto IS NOT NULL) ) THEN
            BEGIN
              VALOR = ((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans * :conc_porc) /100;
              EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
            END
            ELSE
        IF (salario = 'S' AND CONC_COD <> 900 AND CONC_COD <> 920) THEN
            BEGIN
              conc_monto = :basico;
              VALOR = ((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans * :conc_porc) /100;
              EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
            END
          END
       END
      END
    ELSE
    BEGIN
      IF (CONC_PORC = 0 AND :porcen = 0) THEN
      BEGIN
      VALOR = (:montos/30 * :diaslab);
      EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
      END
      ELSE
      BEGIN
        IF (:porcen <> 0) THEN
          BEGIN
          VALOR = ((:MONTOS/30 * :diaslab )+ :cambsaltrans * :PORCEN) /100;
          EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
          END
          ELSE
          BEGIN
          VALOR = ((:montos/30 * :diaslab )+ :cambsaltrans * :CONC_PORC) /100;
          END
          EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
       END
   END
    IF (conc_promedio = 'S') THEN
    BEGIN
    perinicial = :periodo - (:numeroprom) + 1;
    anoprom = CAST (ano AS INTEGER);
    IF (perinicial <= 0) THEN
    BEGIN
    perinicial = 24 + :PERINICIAL;
    anoprom = CAST(ANO AS INTEGER) - 1;
    END
    SELECT SUM (noco_valor) FROM nomina_conceptos n WHERE n.noco_aplicaprom = 'S' AND N.noco_periodo >= :perinicial - 1 AND N.noco_periodo < :periodo AND N.noco_ano >= :anoprom AND N.noco_ano <= :ano AND terc_nit = :nite INTO :valor;
    valor = (valor / numeroprom)/*/ 30 * :diaslab*/;
    SELECT NOCO_VALOR FROM NOMINA_CONCEPTOS WHERE CONC_COD = :conc_cod AND TERC_NIT  = :nite AND NOCO_PAGOOK = 'N' AND NOCO_PERIODO = 0 INTO :saldosini;
    IF (saldosini IS NULL) THEN
    saldosini = 0;
    ELSE
    UPDATE nomina_conceptos N SET noco_pagook = 'S' WHERE n.noco_aplicaprom = 'S' AND N.noco_periodo >= :perinicial - 1 AND N.noco_periodo < :periodo AND N.noco_ano >= :anoprom AND N.noco_ano <= :ano  AND CONC_COD = :conc_cod AND terc_nit = :nite AND NOCO_PERIODO = 0;
    VALOR = :valor + :saldosini;
    EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
    UPDATE nomina_conceptos N SET noco_pagook = 'S' WHERE n.noco_aplicaprom = 'S' AND N.noco_periodo >= :perinicial - 1 AND N.noco_periodo < :periodo AND N.noco_ano >= :anoprom AND N.noco_ano <= :ano  AND CONC_COD = :conc_cod AND terc_nit = :nite;
    END
    IF (conc_otroconc = 'S') THEN
    BEGIN
    anosum = CAST(ano AS INTEGER);
    anosum = anosum - 1;
    SELECT SUM (noco_valor) FROM nomina_conceptos n WHERE n.noco_ano = :anosum AND n.conc_cod = :conc_codotroconc AND N.terc_nit = :nite INTO :valor;
    SELECT NOCO_VALOR FROM NOMINA_CONCEPTOS WHERE noco_ano = :anosum AND conc_cod = :conc_codotroconc AND terc_nit = :nite AND NOCO_PERIODO = 0 INTO :saldosini;
    IF (saldosini IS NULL) THEN
    saldosini = 0;
    ELSE
    UPDATE nomina_conceptos SET noco_pagook = 'S' WHERE noco_ano = :anosum AND conc_cod = :conc_codotroconc AND NOCO_PERIODO = 0 AND terc_nit = :nite;
    VALOR = :valor + :saldosini;
    UPDATE nomina_conceptos SET noco_pagook = 'S' WHERE noco_ano = :anosum AND conc_cod = :conc_codotroconc AND terc_nit = :nite;
    END
/*SI EL CONCEPTO ES UN APORTE*/
IF (conc_aporte = 'S') THEN
BEGIN
    IF ((:entidad = '' ) OR (entidad IS NULL)) THEN
    BEGIN
     SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
     IF (comision IS NULL) THEN
     comision = 0;
     valor = :basico + :comision;
    IF ((conc_cod = 904) OR (conc_cod = 905) OR (conc_cod = 906)) THEN
            BEGIN
            entidad = :nitafp;
                IF (conc_cod = 904) THEN
                BEGIN
                SELECT A.paan_afptr FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = (((((:basico /30) * :diaslab ) + :comision)+ :cambsaltrans) * :PORCEN) /100;
                END
                ELSE
                IF ((conc_cod = 905) OR (conc_cod = 906)) THEN
                BEGIN
                SELECT A.paan_afpem FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = (((((:basico /30) * :diaslab ) + :comision)+ :cambsaltrans) * :PORCEN) /100;
                END
                EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
            END
            ELSE
       IF ((conc_cod = 907) OR (conc_cod = 914) OR (conc_cod = 915)) THEN
            BEGIN
            entidad = :niteps;
                IF (conc_cod = 907) THEN
                BEGIN
                SELECT A.paan_epstr FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = (((((:basico )/30 * :diaslab ) + :comision)+ :cambsaltrans) * :PORCEN) /100;
                END
                ELSE
                IF ((conc_cod = 914) OR (conc_cod = 915)) THEN
                BEGIN
                SELECT A.paan_epsem FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = (((((:basico )/30 * :diaslab ) + :comision)+ :cambsaltrans) * :PORCEN) /100;
                END
                EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
            END
            ELSE
       IF ((conc_cod = 910) OR (conc_cod = 911) OR (conc_cod = 916) OR (conc_cod = 917) OR (conc_cod = 918) OR (conc_cod = 919)) THEN
            BEGIN
            entidad = :nitccf;
            SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
            IF (comision IS NULL) THEN
            comision = 0;
                IF ((conc_cod = 910) OR (conc_cod = 911) ) THEN
                BEGIN
                SELECT A.paan_ccf FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = (((((:basico )/30 * :diaslab ) + :comision)+ :cambsaltrans) * :PORCEN) /100;
                EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
                END
                ELSE
                IF ((conc_cod = 916) OR (conc_cod = 917)) THEN
                BEGIN
                SELECT A.paan_icbf FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = (((((:basico )/30 * :diaslab ) + :comision)+ :cambsaltrans) * :PORCEN) /100;
                EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
                END
                ELSE
                IF ((conc_cod = 918) OR (conc_cod = 919)) THEN
                BEGIN
                SELECT A.paan_sena FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = (((((:basico )/30 * :diaslab ) + :comision)+ :cambsaltrans) * :PORCEN) /100;
                EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
                END
            END
            ELSE
        IF ((conc_cod = 912) OR (conc_cod = 913)) THEN
            BEGIN
            entidad = :nitafc;
            SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
            IF (comision IS NULL) THEN
            comision = 0;
                IF ((conc_cod = 912) OR (conc_cod = 913) ) THEN
                BEGIN
                SELECT A.paan_cesemp FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = ((((:basico + :comision)/30 * :diaslab )+ :cambsaltrans) * :PORCEN) /100;
                EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
                END
            END
            ELSE
        BEGIN
        IF (comision IS NULL) THEN
        comision = 0;
        SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
        conc_monto = :basico + :comision;
        IF (conc_porc <> 0 AND conc_porc IS NOT NULL) THEN
        VALOR = (((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans) * :conc_porc) /100;
        ELSE
        IF (:porcen <> 0 AND :porcen IS NOT NULL) THEN
        VALOR = (((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans) * :porcen) /100;
        ELSE
        IF (:montos <> 0 AND :montos IS NOT NULL) THEN
        valor = :montos;
        ELSE
        IF (:conc_monto <> 0 AND :conc_monto IS NOT NULL) THEN
        valor = :conc_monto;
        EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
        END
    END
    END
    ELSE
    IF (conc_prov = 'S') THEN
    BEGIN
        conc_monto = :basico;
        IF (conc_porc <> 0 AND conc_porc IS NOT NULL) THEN
        VALOR = (((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans) * :conc_porc) /100;
        ELSE
        IF (porcen <> 0 AND porcen IS NOT NULL) THEN
        VALOR = (((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans) * :porcen) /100;
        ELSE
        IF (montos <> 0 AND montos IS NOT NULL) THEN
        VALOR = :montos;
        ELSE
        IF (conc_monto <> 0 AND conc_monto IS NOT NULL) THEN
        VALOR = :conc_monto;
        EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
    END
item = :item + 1;
END
    IF (liquidaper = 0) THEN
    INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
    VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
    ELSE
    IF (liquidaper = 1) THEN
    BEGIN
    rmod = mod(:periodo, 2);
    IF (rmod = 0) THEN
        INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
        VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
    END
    ELSE
    IF (liquidaper = 2) THEN
    BEGIN
    rmod = mod(:periodo, 4);
    IF (rmod = 0) THEN
        INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
        VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
    END
END
END
END
END
ELSE
/*SI ES MENSUAL*/
IF (periodicidad = 1) THEN
BEGIN
EXECUTE PROCEDURE cambie_id_nomina RETURNING_VALUES(:idnomina);
INSERT INTO nomina (nomi_id, NOMI_FECCAUSA, NOMI_PAGOGLOBAL, NOMI_PERIODOCIDAD, NOMI_PERIODO, NOMI_ANO, NOMI_LIQOK)
VALUES (:IDNOMINA, :fec,:pagoglobal, :periodicidad, :periodo, :ano, 'N');
    BEGIN
    item = 1;
    FOR SELECT E.TERC_NIT, E.empl_salario, e.empl_eps, e.empl_afc, e.empl_afp, e.empl_ccf
    FROM EMPLEADOS E
    WHERE E.empl_ppago = 1
    INTO :nite, :basico, :niteps, :nitafc, :nitafp, :nitccf
    DO
    FOR SELECT CE.TERC_NIT, CE.CONC_COD, CE.EMCO_MONTO, CE.EMCO_PORC, ce.empl_entidad, CE.emco_perprom, CE.emco_luquidaper,    CN.CONC_COD, CN.CONC_DEDUC,CN.CONC_PORC, CN.CONC_ENTIDAD, CN.CONC_MONTO,  CN.CONC_DIAS, CN.CONC_MODIFI,
    CN.CONC_PROMEDIO, CN.conc_salario, CE.emco_perprom, CN.conc_prov, CN.conc_aporte, CN.conc_aplicaprom, cn.conc_otroconc, cn.conc_codotroconc, CN.conc_gtoempr
    FROM empleado_conceptos CE, CONCEPTOS_NOMINA CN WHERE ((CE.terc_nit = :nite) AND (CE.CONC_COD = CN.CONC_COD) AND (CN.conc_fecini <= :fec AND CN.conc_fecfin >= :FEC) ) OR ((CE.terc_nit = :nite)
    AND (CE.CONC_COD = CN.CONC_COD) AND (cn.conc_todosper = 'N') AND (CE.emco_ppago = :periodo)) OR  ((CE.terc_nit = :nite) AND (CE.CONC_COD = CN.CONC_COD) AND cn.conc_todosper = 'S')  ORDER BY (TERC_NIT)
    INTO :nit_tercero, :concept,  :montos, :porcen, :entidad, :numeroprom, :liquidaper ,:CONC_COD, :CONC_DEDUC, :CONC_PORC,
    :CONC_ENTIDAD, :CONC_MONTO, :CONC_DIAS, :CONC_MODIFI,:CONC_PROMEDIO, :salario,:EMCO_PERPROM, :conc_prov, :conc_aporte , :CONC_APLICAPROM, :conc_otroconc, :conc_codotroconc, :gtoempr    DO
BEGIN
    IF (conc_dias = 'S') THEN
    EXECUTE PROCEDURE DIAS_LABORADOS (:nite, :periodo) RETURNING_VALUES (:diaslab);
    ELSE
    diaslab = 30;
 SELECT ((n.nono_valor /30) * n.nono_dura) FROM nomina_novedades n WHERE n.tnov_cod = 11 AND n.terc_nit = :nite AND n.nono_periodo = :periodo INTO :cambsaltrans;
 IF (cambsaltrans IS NULL) THEN
 cambsaltrans = 0;
/* basico = :basico + :cambsaltrans;*/
 IF (conc_cod = 920) THEN
 BEGIN
 SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :valor;
 IF (valor IS NULL) THEN
 valor = 0;
 item = :item + 1;
 END
 ELSE
 IF (conc_cod = 921) THEN
 BEGIN
 IF (porcen IS NOT NULL AND porcen <> 0) THEN
 valor = ((basico / 30)* :diaslab ) * :PORCEN /100;
 ELSE
 IF (conc_porc IS NOT NULL AND conc_porc <> 0) THEN
 valor = ((:basico / 30)* :diaslab ) * :conc_porc /100;
 EXECUTE PROCEDURE REDONDEE(:valor, 5) RETURNING_VALUES (VALOR);
 END
 ELSE
 BEGIN
    IF ((:montos = 0) OR (:montos IS NULL)) THEN
      BEGIN
      IF ((CONC_PORC = 0 AND :porcen = 0) OR (CONC_PORC IS NULL AND :porcen = 0) OR (CONC_PORC = 0 AND :porcen IS NULL) OR (CONC_PORC IS NULL AND :porcen IS NULL) ) THEN
        BEGIN
        IF ((conc_monto <> 0) AND (conc_monto IS NOT NULL) ) THEN
        BEGIN
        VALOR = :CONC_MONTO/30 * :diaslab;
        EXECUTE PROCEDURE REDONDEE(:valor, 5) RETURNING_VALUES (VALOR);
        END
        ELSE
        IF (salario = 'S' AND CONC_COD <> 900) THEN
        BEGIN
        conc_monto = :basico;
        VALOR = (:conc_monto/30 * :diaslab ) + :cambsaltrans;
        EXECUTE PROCEDURE REDONDEE(:valor, 5) RETURNING_VALUES (VALOR);
        END
        ELSE
        valor = montos;
        END
       ELSE
       BEGIN
        IF (:porcen <> 0) THEN
          BEGIN
            IF ((conc_monto <> 0) AND (conc_monto IS NOT NULL) ) THEN
            BEGIN
              VALOR = ((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans * :PORCEN) /100;
              EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
            END
          END
          ELSE
          BEGIN
            IF ((conc_monto <> 0) AND (conc_monto IS NOT NULL) ) THEN
            BEGIN
              VALOR = ((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans * :conc_porc) /100;
              EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
            END
            ELSE
        IF (salario = 'S' AND CONC_COD <> 900 AND CONC_COD <> 920) THEN
            BEGIN
              conc_monto = :basico;
              VALOR = ((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans * :conc_porc) /100;
              EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
            END
          END
       END
      END
    ELSE
    BEGIN
      IF (CONC_PORC = 0 AND :porcen = 0) THEN
      BEGIN
      VALOR = (:montos/30 * :diaslab);
      EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
      END
      ELSE
      BEGIN
        IF (:porcen <> 0) THEN
          BEGIN
          VALOR = ((:MONTOS/30 * :diaslab )+ :cambsaltrans * :PORCEN) /100;
          EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
          END
          ELSE
          BEGIN
          VALOR = ((:montos/30 * :diaslab )+ :cambsaltrans * :CONC_PORC) /100;
          END
          EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
       END
   END
    IF (conc_promedio = 'S') THEN
    BEGIN
    perinicial = :periodo - (:numeroprom) + 1;
    anoprom = CAST (ano AS INTEGER);
    IF (perinicial <= 0) THEN
    BEGIN
    perinicial = 24 + :PERINICIAL;
    anoprom = CAST(ANO AS INTEGER) - 1;
    END
    SELECT SUM (noco_valor) FROM nomina_conceptos n WHERE n.noco_aplicaprom = 'S' AND N.noco_periodo >= :perinicial - 1 AND N.noco_periodo < :periodo AND N.noco_ano >= :anoprom AND N.noco_ano <= :ano AND terc_nit = :nite INTO :valor;
    valor = (valor / numeroprom)/*/ 30 * :diaslab*/;
    SELECT NOCO_VALOR FROM NOMINA_CONCEPTOS WHERE CONC_COD = :conc_cod AND TERC_NIT  = :nite AND NOCO_PAGOOK = 'N' AND NOCO_PERIODO = 0 INTO :saldosini;
    IF (saldosini IS NULL) THEN
    saldosini = 0;
    ELSE
    UPDATE nomina_conceptos N SET noco_pagook = 'S' WHERE n.noco_aplicaprom = 'S' AND N.noco_periodo >= :perinicial - 1 AND N.noco_periodo < :periodo AND N.noco_ano >= :anoprom AND N.noco_ano <= :ano  AND CONC_COD = :conc_cod AND terc_nit = :nite AND NOCO_PERIODO = 0;
    VALOR = :valor + :saldosini;
    EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
    UPDATE nomina_conceptos N SET noco_pagook = 'S' WHERE n.noco_aplicaprom = 'S' AND N.noco_periodo >= :perinicial - 1 AND N.noco_periodo < :periodo AND N.noco_ano >= :anoprom AND N.noco_ano <= :ano  AND CONC_COD = :conc_cod AND terc_nit = :nite;
    END
    IF (conc_otroconc = 'S') THEN
    BEGIN
    anosum = CAST(ano AS INTEGER);
    anosum = anosum - 1;
    SELECT SUM (noco_valor) FROM nomina_conceptos n WHERE n.noco_ano = :anosum AND n.conc_cod = :conc_codotroconc AND N.terc_nit = :nite INTO :valor;
    SELECT NOCO_VALOR FROM NOMINA_CONCEPTOS WHERE noco_ano = :anosum AND conc_cod = :conc_codotroconc AND terc_nit = :nite AND NOCO_PERIODO = 0 INTO :saldosini;
    IF (saldosini IS NULL) THEN
    saldosini = 0;
    ELSE
    UPDATE nomina_conceptos SET noco_pagook = 'S' WHERE noco_ano = :anosum AND conc_cod = :conc_codotroconc AND NOCO_PERIODO = 0 AND terc_nit = :nite;
    VALOR = :valor + :saldosini;
    UPDATE nomina_conceptos SET noco_pagook = 'S' WHERE noco_ano = :anosum AND conc_cod = :conc_codotroconc AND terc_nit = :nite;
    END
/*SI EL CONCEPTO ES UN APORTE*/
IF (conc_aporte = 'S') THEN
BEGIN
    IF ((:entidad = '' ) OR (entidad IS NULL)) THEN
    BEGIN
     SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
     IF (comision IS NULL) THEN
     comision = 0;
     valor = :basico + :comision;
    IF ((conc_cod = 904) OR (conc_cod = 905) OR (conc_cod = 906)) THEN
            BEGIN
            entidad = :nitafp;
                IF (conc_cod = 904) THEN
                BEGIN
                SELECT A.paan_afptr FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = (((((:basico /30) * :diaslab ) + :comision)+ :cambsaltrans) * :PORCEN) /100;
                END
                ELSE
                IF ((conc_cod = 905) OR (conc_cod = 906)) THEN
                BEGIN
                SELECT A.paan_afpem FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = (((((:basico /30) * :diaslab ) + :comision)+ :cambsaltrans) * :PORCEN) /100;
                END
                EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
            END
            ELSE
       IF ((conc_cod = 907) OR (conc_cod = 914) OR (conc_cod = 915)) THEN
            BEGIN
            entidad = :niteps;
                IF (conc_cod = 907) THEN
                BEGIN
                SELECT A.paan_epstr FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = (((((:basico )/30 * :diaslab ) + :comision)+ :cambsaltrans) * :PORCEN) /100;
                END
                ELSE
                IF ((conc_cod = 914) OR (conc_cod = 915)) THEN
                BEGIN
                SELECT A.paan_epsem FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = (((((:basico )/30 * :diaslab ) + :comision)+ :cambsaltrans) * :PORCEN) /100;
                END
                EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
            END
            ELSE
       IF ((conc_cod = 910) OR (conc_cod = 911) OR (conc_cod = 916) OR (conc_cod = 917) OR (conc_cod = 918) OR (conc_cod = 919)) THEN
            BEGIN
            entidad = :nitccf;
            SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
            IF (comision IS NULL) THEN
            comision = 0;
                IF ((conc_cod = 910) OR (conc_cod = 911) ) THEN
                BEGIN
                SELECT A.paan_ccf FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = (((((:basico )/30 * :diaslab ) + :comision)+ :cambsaltrans) * :PORCEN) /100;
                EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
                END
                ELSE
                IF ((conc_cod = 916) OR (conc_cod = 917)) THEN
                BEGIN
                SELECT A.paan_icbf FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = (((((:basico )/30 * :diaslab ) + :comision)+ :cambsaltrans) * :PORCEN) /100;
                EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
                END
                ELSE
                IF ((conc_cod = 918) OR (conc_cod = 919)) THEN
                BEGIN
                SELECT A.paan_sena FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = (((((:basico )/30 * :diaslab ) + :comision)+ :cambsaltrans) * :PORCEN) /100;
                EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
                END
            END
            ELSE
        IF ((conc_cod = 912) OR (conc_cod = 913)) THEN
            BEGIN
            entidad = :nitafc;
            SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
            IF (comision IS NULL) THEN
            comision = 0;
                IF ((conc_cod = 912) OR (conc_cod = 913) ) THEN
                BEGIN
                SELECT A.paan_cesemp FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = ((((:basico + :comision)/30 * :diaslab )+ :cambsaltrans) * :PORCEN) /100;
                EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
                END
            END
            ELSE
        BEGIN
        IF (comision IS NULL) THEN
        comision = 0;
        SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
        conc_monto = :basico + :comision;
        IF (conc_porc <> 0 AND conc_porc IS NOT NULL) THEN
        VALOR = (((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans) * :conc_porc) /100;
        ELSE
        IF (:porcen <> 0 AND :porcen IS NOT NULL) THEN
        VALOR = (((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans) * :porcen) /100;
        ELSE
        IF (:montos <> 0 AND :montos IS NOT NULL) THEN
        valor = :montos;
        ELSE
        IF (:conc_monto <> 0 AND :conc_monto IS NOT NULL) THEN
        valor = :conc_monto;
        EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
        END
    END
    END
    ELSE
    IF (conc_prov = 'S') THEN
    BEGIN
        conc_monto = :basico;
        IF (conc_porc <> 0 AND conc_porc IS NOT NULL) THEN
        VALOR = (((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans) * :conc_porc) /100;
        ELSE
        IF (porcen <> 0 AND porcen IS NOT NULL) THEN
        VALOR = (((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans) * :porcen) /100;
        ELSE
        IF (montos <> 0 AND montos IS NOT NULL) THEN
        VALOR = :montos;
        ELSE
        IF (conc_monto <> 0 AND conc_monto IS NOT NULL) THEN
        VALOR = :conc_monto;
        EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
    END
item = :item + 1;
END
    IF (liquidaper = 0) THEN
    INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
    VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
    ELSE
    IF (liquidaper = 1) THEN
    BEGIN
    rmod = mod(:periodo, 2);
    IF (rmod = 0) THEN
        INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
        VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
    END
    ELSE
    IF (liquidaper = 2) THEN
    BEGIN
    rmod = mod(:periodo, 4);
    IF (rmod = 0) THEN
        INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
        VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
    END
END
END
END
ELSE
/*SI ES SEMANAL*/
IF (periodicidad = 3) THEN
BEGIN
EXECUTE PROCEDURE cambie_id_nomina RETURNING_VALUES(:idnomina);
INSERT INTO nomina (nomi_id, NOMI_FECCAUSA, NOMI_PAGOGLOBAL, NOMI_PERIODOCIDAD, NOMI_PERIODO, NOMI_ANO, NOMI_LIQOK)
VALUES (:IDNOMINA, :fec,:pagoglobal, :periodicidad, :periodo, :ano, 'N');
    BEGIN
    item = 1;
    FOR SELECT E.TERC_NIT, E.empl_salario, e.empl_eps, e.empl_afc, e.empl_afp, e.empl_ccf
    FROM EMPLEADOS E
    WHERE E.empl_ppago = 3
    INTO :nite, :basico, :niteps, :nitafc, :nitafp, :nitccf
    DO
    BEGIN
    FOR SELECT CE.TERC_NIT, CE.CONC_COD, CE.EMCO_MONTO, CE.EMCO_PORC, ce.empl_entidad, CE.emco_perprom, CE.emco_luquidaper,    CN.CONC_COD, CN.CONC_DEDUC,CN.CONC_PORC, CN.CONC_ENTIDAD, CN.CONC_MONTO,  CN.CONC_DIAS, CN.CONC_MODIFI,
    CN.CONC_PROMEDIO, CN.conc_salario, CE.emco_perprom, CN.conc_prov, CN.conc_aporte, CN.conc_aplicaprom, cn.conc_otroconc, cn.conc_codotroconc, CN.conc_gtoempr
    FROM empleado_conceptos CE, CONCEPTOS_NOMINA CN WHERE ((CE.terc_nit = :nite) AND (CE.CONC_COD = CN.CONC_COD) AND (CN.conc_fecini <= :fec AND CN.conc_fecfin >= :FEC) ) OR ((CE.terc_nit = :nite)
    AND (CE.CONC_COD = CN.CONC_COD) AND (cn.conc_todosper = 'N') AND (CE.emco_ppago = :periodo)) OR  ((CE.terc_nit = :nite) AND (CE.CONC_COD = CN.CONC_COD) AND cn.conc_todosper = 'S')  ORDER BY (TERC_NIT)
    INTO :nit_tercero, :concept,  :montos, :porcen, :entidad, :numeroprom, :liquidaper ,:CONC_COD, :CONC_DEDUC, :CONC_PORC,
    :CONC_ENTIDAD, :CONC_MONTO, :CONC_DIAS, :CONC_MODIFI,:CONC_PROMEDIO, :salario,:EMCO_PERPROM, :conc_prov, :conc_aporte , :CONC_APLICAPROM, :conc_otroconc, :conc_codotroconc, :gtoempr
    DO
BEGIN
    IF (conc_dias = 'S') THEN
    EXECUTE PROCEDURE DIAS_LABORADOS (:nite, :periodo) RETURNING_VALUES (:diaslab);
    ELSE
    BEGIN
    IF (liquidaper = 0) THEN
    diaslab = 7;
    ELSE
    IF (liquidaper = 1) THEN
    diaslab = 15;
    ELSE
    IF (liquidaper = 2) THEN
    diaslab = 30;
    END
 SELECT ((n.nono_valor /30) * n.nono_dura) FROM nomina_novedades n WHERE n.tnov_cod = 11 AND n.terc_nit = :nite AND n.nono_periodo = :periodo INTO :cambsaltrans;
 IF (cambsaltrans IS NULL) THEN
 cambsaltrans = 0;
/* basico = :basico + :cambsaltrans;*/
 IF (conc_cod = 920) THEN
 BEGIN
 SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :valor;
 IF (valor IS NULL) THEN
 valor = 0;
 item = :item + 1;
 END
 ELSE
 IF (conc_cod = 921) THEN
 BEGIN
 IF (porcen IS NOT NULL AND porcen <> 0) THEN
 valor = ((basico / 30)* :diaslab ) * :PORCEN /100;
 ELSE
 IF (conc_porc IS NOT NULL AND conc_porc <> 0) THEN
 valor = ((:basico / 30)* :diaslab ) * :conc_porc /100;
 EXECUTE PROCEDURE REDONDEE(:valor, 5) RETURNING_VALUES (VALOR);
 END
 ELSE
 BEGIN
    IF ((:montos = 0) OR (:montos IS NULL)) THEN
      BEGIN
      IF ((CONC_PORC = 0 AND :porcen = 0) OR (CONC_PORC IS NULL AND :porcen = 0) OR (CONC_PORC = 0 AND :porcen IS NULL) OR (CONC_PORC IS NULL AND :porcen IS NULL) ) THEN
        BEGIN
        IF ((conc_monto <> 0) AND (conc_monto IS NOT NULL) ) THEN
        BEGIN
        VALOR = :CONC_MONTO/30 * :diaslab;
        EXECUTE PROCEDURE REDONDEE(:valor, 5) RETURNING_VALUES (VALOR);
        END
        ELSE
        IF (salario = 'S' AND CONC_COD <> 900) THEN
        BEGIN
        conc_monto = :basico;
        VALOR = (:conc_monto/30 * :diaslab ) + :cambsaltrans;
        EXECUTE PROCEDURE REDONDEE(:valor, 5) RETURNING_VALUES (VALOR);
        END
        ELSE
        valor = montos;
        END
       ELSE
       BEGIN
        IF (:porcen <> 0) THEN
          BEGIN
            IF ((conc_monto <> 0) AND (conc_monto IS NOT NULL) ) THEN
            BEGIN
              VALOR = ((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans * :PORCEN) /100;
              EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
            END
          END
          ELSE
          BEGIN
            IF ((conc_monto <> 0) AND (conc_monto IS NOT NULL) ) THEN
            BEGIN
              VALOR = ((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans * :conc_porc) /100;
              EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
            END
            ELSE
        IF (salario = 'S' AND CONC_COD <> 900 AND CONC_COD <> 920) THEN
            BEGIN
              conc_monto = :basico;
              VALOR = ((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans * :conc_porc) /100;
              EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
            END
          END
       END
      END
    ELSE
    BEGIN
      IF (CONC_PORC = 0 AND :porcen = 0) THEN
      BEGIN
      VALOR = (:montos/30 * :diaslab);
      EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
      END
      ELSE
      BEGIN
        IF (:porcen <> 0) THEN
          BEGIN
          VALOR = ((:MONTOS/30 * :diaslab )+ :cambsaltrans * :PORCEN) /100;
          EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
          END
          ELSE
          BEGIN
          VALOR = ((:montos/30 * :diaslab )+ :cambsaltrans * :CONC_PORC) /100;
          END
          EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
       END
   END
    IF (conc_promedio = 'S') THEN
    BEGIN
    perinicial = :periodo - (:numeroprom) + 1;
    anoprom = CAST (ano AS INTEGER);
    IF (perinicial <= 0) THEN
    BEGIN
    perinicial = 24 + :PERINICIAL;
    anoprom = CAST(ANO AS INTEGER) - 1;
    END
    SELECT SUM (noco_valor) FROM nomina_conceptos n WHERE n.noco_aplicaprom = 'S' AND N.noco_periodo >= :perinicial - 1 AND N.noco_periodo < :periodo AND N.noco_ano >= :anoprom AND N.noco_ano <= :ano AND terc_nit = :nite INTO :valor;
    valor = (valor / numeroprom)/*/ 30 * :diaslab*/;
    SELECT NOCO_VALOR FROM NOMINA_CONCEPTOS WHERE CONC_COD = :conc_cod AND TERC_NIT  = :nite AND NOCO_PAGOOK = 'N' AND NOCO_PERIODO = 0 INTO :saldosini;
    IF (saldosini IS NULL) THEN
    saldosini = 0;
    ELSE
    UPDATE nomina_conceptos N SET noco_pagook = 'S' WHERE n.noco_aplicaprom = 'S' AND N.noco_periodo >= :perinicial - 1 AND N.noco_periodo < :periodo AND N.noco_ano >= :anoprom AND N.noco_ano <= :ano  AND CONC_COD = :conc_cod AND terc_nit = :nite AND NOCO_PERIODO = 0;
    VALOR = :valor + :saldosini;
    EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
    UPDATE nomina_conceptos N SET noco_pagook = 'S' WHERE n.noco_aplicaprom = 'S' AND N.noco_periodo >= :perinicial - 1 AND N.noco_periodo < :periodo AND N.noco_ano >= :anoprom AND N.noco_ano <= :ano  AND CONC_COD = :conc_cod AND terc_nit = :nite;
    END
    IF (conc_otroconc = 'S') THEN
    BEGIN
    anosum = CAST(ano AS INTEGER);
    anosum = anosum - 1;
    SELECT SUM (noco_valor) FROM nomina_conceptos n WHERE n.noco_ano = :anosum AND n.conc_cod = :conc_codotroconc AND N.terc_nit = :nite INTO :valor;
    SELECT NOCO_VALOR FROM NOMINA_CONCEPTOS WHERE noco_ano = :anosum AND conc_cod = :conc_codotroconc AND terc_nit = :nite AND NOCO_PERIODO = 0 INTO :saldosini;
    IF (saldosini IS NULL) THEN
    saldosini = 0;
    ELSE
    UPDATE nomina_conceptos SET noco_pagook = 'S' WHERE noco_ano = :anosum AND conc_cod = :conc_codotroconc AND NOCO_PERIODO = 0 AND terc_nit = :nite;
    VALOR = :valor + :saldosini;
    UPDATE nomina_conceptos SET noco_pagook = 'S' WHERE noco_ano = :anosum AND conc_cod = :conc_codotroconc AND terc_nit = :nite;
    END
/*SI EL CONCEPTO ES UN APORTE*/
IF (conc_aporte = 'S') THEN
BEGIN
    IF ((:entidad = '' ) OR (entidad IS NULL)) THEN
    BEGIN
     SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
     IF (comision IS NULL) THEN
     comision = 0;
     valor = :basico + :comision;
    IF ((conc_cod = 904) OR (conc_cod = 905) OR (conc_cod = 906)) THEN
            BEGIN
            entidad = :nitafp;
                IF (conc_cod = 904) THEN
                BEGIN
                SELECT A.paan_afptr FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = (((((:basico /30) * :diaslab ) + :comision)+ :cambsaltrans) * :PORCEN) /100;
                END
                ELSE
                IF ((conc_cod = 905) OR (conc_cod = 906)) THEN
                BEGIN
                SELECT A.paan_afpem FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = (((((:basico /30) * :diaslab ) + :comision)+ :cambsaltrans) * :PORCEN) /100;
                END
                EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
            END
            ELSE
       IF ((conc_cod = 907) OR (conc_cod = 914) OR (conc_cod = 915)) THEN
            BEGIN
            entidad = :niteps;
                IF (conc_cod = 907) THEN
                BEGIN
                SELECT A.paan_epstr FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = (((((:basico )/30 * :diaslab ) + :comision)+ :cambsaltrans) * :PORCEN) /100;
                END
                ELSE
                IF ((conc_cod = 914) OR (conc_cod = 915)) THEN
                BEGIN
                SELECT A.paan_epsem FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = (((((:basico )/30 * :diaslab ) + :comision)+ :cambsaltrans) * :PORCEN) /100;
                END
                EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
            END
            ELSE
       IF ((conc_cod = 910) OR (conc_cod = 911) OR (conc_cod = 916) OR (conc_cod = 917) OR (conc_cod = 918) OR (conc_cod = 919)) THEN
            BEGIN
            entidad = :nitccf;
            SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
            IF (comision IS NULL) THEN
            comision = 0;
                IF ((conc_cod = 910) OR (conc_cod = 911) ) THEN
                BEGIN
                SELECT A.paan_ccf FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = (((((:basico )/30 * :diaslab ) + :comision)+ :cambsaltrans) * :PORCEN) /100;
                EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
                END
                ELSE
                IF ((conc_cod = 916) OR (conc_cod = 917)) THEN
                BEGIN
                SELECT A.paan_icbf FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = (((((:basico )/30 * :diaslab ) + :comision)+ :cambsaltrans) * :PORCEN) /100;
                EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
                END
                ELSE
                IF ((conc_cod = 918) OR (conc_cod = 919)) THEN
                BEGIN
                SELECT A.paan_sena FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = (((((:basico )/30 * :diaslab ) + :comision)+ :cambsaltrans) * :PORCEN) /100;
                EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
                END
            END
            ELSE
        IF ((conc_cod = 912) OR (conc_cod = 913)) THEN
            BEGIN
            entidad = :nitafc;
            SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
            IF (comision IS NULL) THEN
            comision = 0;
                IF ((conc_cod = 912) OR (conc_cod = 913) ) THEN
                BEGIN
                SELECT A.paan_cesemp FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = ((((:basico + :comision)/30 * :diaslab )+ :cambsaltrans) * :PORCEN) /100;
                EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
                END
            END
            ELSE
        BEGIN
        IF (comision IS NULL) THEN
        comision = 0;
        SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
        conc_monto = :basico + :comision;
        IF (conc_porc <> 0 AND conc_porc IS NOT NULL) THEN
        VALOR = (((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans) * :conc_porc) /100;
        ELSE
        IF (:porcen <> 0 AND :porcen IS NOT NULL) THEN
        VALOR = (((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans) * :porcen) /100;
        ELSE
        IF (:montos <> 0 AND :montos IS NOT NULL) THEN
        valor = :montos;
        ELSE
        IF (:conc_monto <> 0 AND :conc_monto IS NOT NULL) THEN
        valor = :conc_monto;
        EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
        END
    END
    END
    ELSE
    IF (conc_prov = 'S') THEN
    BEGIN
        conc_monto = :basico;
        IF (conc_porc <> 0 AND conc_porc IS NOT NULL) THEN
        VALOR = (((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans) * :conc_porc) /100;
        ELSE
        IF (porcen <> 0 AND porcen IS NOT NULL) THEN
        VALOR = (((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans) * :porcen) /100;
        ELSE
        IF (montos <> 0 AND montos IS NOT NULL) THEN
        VALOR = :montos;
        ELSE
        IF (conc_monto <> 0 AND conc_monto IS NOT NULL) THEN
        VALOR = :conc_monto;
        EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
    END
item = :item + 1;
END
    IF (liquidaper = 0) THEN
    INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
    VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
    ELSE
    IF (liquidaper = 1) THEN
    BEGIN
    rmod = mod(:periodo, 2);
    IF (rmod = 0) THEN
        INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
        VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
    END
    ELSE
    IF (liquidaper = 2) THEN
    BEGIN
    rmod = mod(:periodo, 4);
    IF (rmod = 0) THEN
        INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
        VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
    END
END
END
END
END
SUSPEND;
END
^

SET TERM ; ^

ALTER TABLE CONSOLIDADO_NOMINA_PROV
ADD COPO_GTOEMPR BOOLEANO;

GRANT UPDATE,REFERENCES ON CONSOLIDADO_NOMINA_PROV TO TRIGGER CONSOLIDADO_NOMINA_PROV_BI;

SET TERM ^ ;

ALTER PROCEDURE CONSOLIDA_CONC_NOMINA_PROV(
    ID_NOMINA INTEGER,
    TIPPAGO INTEGER)
AS
DECLARE VARIABLE id INTEGER;
DECLARE VARIABLE noco_item INTEGER;
DECLARE VARIABLE nit VARCHAR(20) CHARACTER SET none;
DECLARE VARIABLE valor NUMERIC(18,2);
DECLARE VARIABLE entidad VARCHAR(20) CHARACTER SET none;
DECLARE VARIABLE periodo INTEGER;
DECLARE VARIABLE ano CHAR(4) CHARACTER SET none;
DECLARE VARIABLE periodi INTEGER;
DECLARE VARIABLE deduc CHAR(1) CHARACTER SET none;
DECLARE VARIABLE prov CHAR(1) CHARACTER SET none;
DECLARE VARIABLE aporte CHAR(1) CHARACTER SET none;
DECLARE VARIABLE idexiste INTEGER;
DECLARE VARIABLE item INTEGER;
DECLARE VARIABLE idanterior INTEGER;
DECLARE VARIABLE itemanterior INTEGER;
DECLARE VARIABLE conc_cod VARCHAR(5);
DECLARE VARIABLE gtoempr CHAR(1);
BEGIN
IF (tippago = 4) THEN
 BEGIN
    SELECT MAX(c.COPO_id) FROM consolidado_nomina_prov c WHERE c.COPO_tipoori = 92 AND C.COPO_idori = :id_nomina INTO :idexiste;
    IF (idexiste IS NULL) THEN
    BEGIN
    id = GEN_ID(id_consnoprov, 1);
        SELECT nomi_periodocidad FROM NOMINA WHERE NOMI_ID = :ID_NOMINA INTO :periodi;
        FOR SELECT NOCO_ITEM, CONC_COD, TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_PERIODO, NOCO_ANO, noco_deduc, noco_prov, noco_aporte, noco_gtoempr  FROM NOMINA_CONCEPTOS WHERE NOMI_ID = :id_nomina AND NOCO_gtoempr = 'N' AND NOCO_PROV = 'N'
        INTO :noco_item, :conc_cod, :nit, :valor, :entidad, :periodo, :ano, :deduc, :prov, :aporte, :gtoempr
        DO
        BEGIN
        IF (valor <> 0) THEN
            INSERT INTO consolidado_nomina_prov (COPO_id, COPO_item ,COPO_tipodes, COPO_tipoori,  COPO_idori, COPO_periodo, COPO_ano,  COPO_valor, conc_cod, terc_nit, COPO_pagook, COPO_PERIODICIDAD, COPO_DEDUC, COPO_PROV, COPO_APORTE, copo_gtoempr)
                                    VALUES (:id, :noco_item, 91, 92, :id_nomina, :periodo, :ano, :valor, :conc_cod, :nit, 'N', :periodi, :deduc, :prov, :aporte, :gtoempr);
        END
    END
   ELSE
   BEGIN
   id = GEN_ID(id_consnoprov, 1);
       ITEM = 1;
       FOR SELECT COPO_id, COPO_item , COPO_idori, COPO_periodo, COPO_ano, (COPO_valor - COPO_ABONO), conc_cod, terc_nit, COPO_PERIODICIDAD, COPO_DEDUC, COPO_PROV, COPO_APORTE, COPO_GTOEMPR
       FROM consolidado_nomina_prov c WHERE c.COPO_id = :idexiste /*and c.COPO_pagook = 'N'*/
       INTO :idanterior, :itemanterior,:id_nomina, :periodo, :ano, :valor, :conc_cod, :nit, :periodi, :deduc, :prov, :aporte, :gtoempr
       DO
       BEGIN
       IF (valor <> 0) THEN
            INSERT INTO consolidado_nomina_prov (COPO_id, COPO_item ,COPO_tipodes, COPO_tipoori,  COPO_idori, COPO_periodo, COPO_ano,  COPO_valor, conc_cod, terc_nit, COPO_pagook, COPO_PERIODICIDAD, COPO_DEDUC, COPO_PROV, COPO_APORTE, COPO_GTOEMPR)
                                    VALUES (:id, :item, 91, 92, :id_nomina, :periodo, :ano, :valor, :conc_cod, :nit, 'N', :periodi, :deduc, :prov, :aporte, :gtoempr);
       item = :item + 1;
       UPDATE consolidado_nomina_prov C SET C.COPO_pagook = 'S' WHERE C.COPO_id = :idanterior AND c.COPO_item = :itemanterior;
       END
   END
 END
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE CONSOLIDA_CONC_NOMINA_PROV(
    ID_NOMINA INTEGER,
    TIPPAGO INTEGER)
AS
DECLARE VARIABLE id INTEGER;
DECLARE VARIABLE noco_item INTEGER;
DECLARE VARIABLE nit VARCHAR(20) CHARACTER SET none;
DECLARE VARIABLE valor NUMERIC(18,2);
DECLARE VARIABLE entidad VARCHAR(20) CHARACTER SET none;
DECLARE VARIABLE periodo INTEGER;
DECLARE VARIABLE ano CHAR(4) CHARACTER SET none;
DECLARE VARIABLE periodi INTEGER;
DECLARE VARIABLE deduc CHAR(1) CHARACTER SET none;
DECLARE VARIABLE prov CHAR(1) CHARACTER SET none;
DECLARE VARIABLE aporte CHAR(1) CHARACTER SET none;
DECLARE VARIABLE idexiste INTEGER;
DECLARE VARIABLE item INTEGER;
DECLARE VARIABLE idanterior INTEGER;
DECLARE VARIABLE itemanterior INTEGER;
DECLARE VARIABLE conc_cod VARCHAR(5);
DECLARE VARIABLE gtoempr CHAR(1);
BEGIN
IF (tippago = 4) THEN
 BEGIN
    SELECT MAX(c.COPO_id) FROM consolidado_nomina_prov c WHERE c.COPO_tipoori = 92 AND C.COPO_idori = :id_nomina INTO :idexiste;
    IF (idexiste IS NULL) THEN
    BEGIN
    id = GEN_ID(id_consnoprov, 1);
        SELECT nomi_periodocidad FROM NOMINA WHERE NOMI_ID = :ID_NOMINA INTO :periodi;
        FOR SELECT NOCO_ITEM, CONC_COD, TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_PERIODO, NOCO_ANO, noco_deduc, noco_prov, noco_aporte, noco_gtoempr  FROM NOMINA_CONCEPTOS WHERE NOMI_ID = :id_nomina AND NOCO_gtoempr = 'N' AND NOCO_PROV = 'N'
        INTO :noco_item, :conc_cod, :nit, :valor, :entidad, :periodo, :ano, :deduc, :prov, :aporte, :gtoempr
        DO
        BEGIN
        IF (valor <> 0) THEN
            INSERT INTO consolidado_nomina_prov (COPO_id, COPO_item ,COPO_tipodes, COPO_tipoori,  COPO_idori, COPO_periodo, COPO_ano,  COPO_valor, conc_cod, terc_nit, COPO_pagook, COPO_PERIODICIDAD, COPO_DEDUC, COPO_PROV, COPO_APORTE, copo_gtoempr)
                                    VALUES (:id, :noco_item, 91, 92, :id_nomina, :periodo, :ano, :valor, :conc_cod, :nit, 'N', :periodi, :deduc, :prov, :aporte, :gtoempr);
        END
    END
   ELSE
   BEGIN
   id = GEN_ID(id_consnoprov, 1);
       ITEM = 1;
       FOR SELECT COPO_id, COPO_item , COPO_idori, COPO_periodo, COPO_ano, (COPO_valor - COPO_ABONO), conc_cod, terc_nit, COPO_PERIODICIDAD, COPO_DEDUC, COPO_PROV, COPO_APORTE, COPO_GTOEMPR
       FROM consolidado_nomina_prov c WHERE c.COPO_id = :idexiste /*and c.COPO_pagook = 'N'*/
       INTO :idanterior, :itemanterior,:id_nomina, :periodo, :ano, :valor, :conc_cod, :nit, :periodi, :deduc, :prov, :aporte, :gtoempr
       DO
       BEGIN
       IF (valor <> 0) THEN
            INSERT INTO consolidado_nomina_prov (COPO_id, COPO_item ,COPO_tipodes, COPO_tipoori,  COPO_idori, COPO_periodo, COPO_ano,  COPO_valor, conc_cod, terc_nit, COPO_pagook, COPO_PERIODICIDAD, COPO_DEDUC, COPO_PROV, COPO_APORTE, COPO_GTOEMPR)
                                    VALUES (:id, :item, 91, 92, :id_nomina, :periodo, :ano, :valor, :conc_cod, :nit, 'N', :periodi, :deduc, :prov, :aporte, :gtoempr);
       item = :item + 1;
       UPDATE consolidado_nomina_prov C SET C.COPO_pagook = 'S' WHERE C.COPO_id = :idanterior AND c.COPO_item = :itemanterior;
       END
   END
 END
END
^

SET TERM ; ^

ALTER TABLE CONSOLIDADO_NOMINA
ADD CONO_GTOEMPR BOOLEANO;

SET TERM ^ ;

ALTER PROCEDURE CONSOLIDA_CONC_NOMINA(
    ID_NOMINA INTEGER,
    TIPPAGO INTEGER)
AS
DECLARE VARIABLE id INTEGER;
/*declare variable conc_cod varchar(5);*/
DECLARE VARIABLE noco_item INTEGER;
/*declare variable nit varchar(20) character set none;*/
/*declare variable valor numeric(18,2);*/
DECLARE VARIABLE entidad VARCHAR(20) CHARACTER SET none;
DECLARE VARIABLE periodo INTEGER;
DECLARE VARIABLE ano CHAR(4) CHARACTER SET none;
DECLARE VARIABLE periodi INTEGER;
/*declare variable deduc char(1) character set none;*/
DECLARE VARIABLE prov CHAR(1) CHARACTER SET none;
DECLARE VARIABLE aporte CHAR(1) CHARACTER SET none;
DECLARE VARIABLE idexiste INTEGER;
DECLARE VARIABLE item INTEGER;
DECLARE VARIABLE idanterior INTEGER;
DECLARE VARIABLE itemanterior INTEGER;
DECLARE VARIABLE SUMA NUMERIC(18,2);
BEGIN
IF (tippago = 4) THEN
 BEGIN
 INSERT INTO consolidado_nomina (cono_id, cono_item ,cono_tipodes, cono_tipoori,  cono_idori, cono_periodo, cono_ano,  cono_valor, cono_abono, conc_cod, terc_nit, cono_pagook, CONO_PERIODICIDAD, CONO_DEDUC, CONO_PROV, CONO_APORTE, cono_gtoempr)
                  SELECT COPO_id, COPO_item ,COPO_tipodes, COPO_tipoori,  COPO_idori, COPO_periodo, COPO_ano,  COPO_valor, copo_abono , conc_cod, terc_nit, COPO_pagook, COPO_PERIODICIDAD, COPO_DEDUC, COPO_PROV, COPO_APORTE, COPO_GTOEMPR
                  FROM consolidado_nomina_prov c
                  WHERE c.copo_idori = :id_nomina AND c.copo_tipoori = 92 AND c.copo_pagook = 'N';
 UPDATE consolidado_nomina_prov c SET C.copo_pagook = 'S' WHERE c.copo_idori = :id_nomina AND c.copo_tipoori = 92 AND c.copo_pagook = 'N';
 SELECT SUM(copo_valor - copo_abono) FROM consolidado_nomina_prov WHERE copo_idori = :id_nomina AND copo_tipoori = 92 AND copo_pagook = 'N' INTO :suma;
 IF (suma = 0) THEN
 UPDATE nomina n SET n.nomi_pagook = 'S' WHERE N.nomi_id = :id_nomina;
 END
END
^

SET TERM ; ^

ALTER TABLE PARAMETROS_ANO
ADD PAAN_NITARP NIT;

SET TERM ^ ;

ALTER PROCEDURE COMPLETA_CEROS(
    NUMERO VARCHAR(6))
RETURNS (
    NUMCEROS VARCHAR(6))
AS
DECLARE VARIABLE AUX VARCHAR(12);
DECLARE VARIABLE NUMAUX VARCHAR(6);
DECLARE VARIABLE TAM INTEGER;
BEGIN
/* DEJE SOLO LOS NUMEROS */
NUMERO = ltrim(NUMERO);    
NUMERO = rtrim(NUMERO);
AUX = '000000' || NUMERO;
TAM = STRLEN(AUX);
NUMCEROS = SUBSTR(AUX, (TAM - 5), TAM);
SUSPEND;
END
^

SET TERM ; ^

ALTER TABLE ADMINISTRADORA
ADD ADMI_CODARP NIT;

ALTER TABLE ADMINISTRADORA
ADD ADMI_CODEPS NIT;

ALTER TABLE ADMINISTRADORA
ADD ADMI_CODAFP NIT;

ALTER TABLE ADMINISTRADORA
ADD ADMI_CODAFC NIT;

ALTER TABLE ADMINISTRADORA
ADD ADMI_CODCCF NIT;

ALTER TABLE PAGO_APORTES
ADD PGAP_FECHA FECHA;

SET TERM ^ ;

ALTER PROCEDURE LIQUIDACION_APORTES(
    ID_NOMINA_1 INTEGER,
    ID_NOMINA_2 INTEGER,
    ID_NOMINA_3 INTEGER,
    ID_NOMINA_4 INTEGER,
    ID_NOMINA_5 INTEGER,
    ID_NOMINA_6 INTEGER,
    ID_NOMINA_7 INTEGER,
    INTMORA NUMERIC(18,2),
    FECHA DATE,
    PAGO CHAR(1),
    NITBENE VARCHAR(20),
    FECHAEGR DATE,
    PREF VARCHAR(4),
    NUMEROEGR VARCHAR(6),
    CONCEPTO VARCHAR(60),
    OBSERVACIONES BLOB SUB_TYPE 0 SEGMENT SIZE 80,
    NOMBREBENE VARCHAR(60),
    CAJA INTEGER,
    USUARIOEGR VARCHAR(10),
    CUENTAID INTEGER,
    FECHAEGRBNCO DATE,
    PREFEGREBNCO VARCHAR(4),
    NUMEROEGREBNCO VARCHAR(6),
    BENEBNCO VARCHAR(60),
    CONCEPTOBNCO VARCHAR(60),
    GMF CHAR(1),
    FORMAPAGOID INTEGER,
    CAJABNCO VARCHAR(2),
    CAJABNCOCUENTA VARCHAR(20),
    CAJABNCONUMEROEGR VARCHAR(20),
    FORMULARIO VARCHAR(10))
AS
DECLARE VARIABLE itemaportadmi INTEGER;
DECLARE VARIABLE itemdetaport INTEGER;
DECLARE VARIABLE idaporte INTEGER;
DECLARE VARIABLE idegreso INTEGER;
DECLARE VARIABLE numegresointeger INTEGER;
DECLARE VARIABLE NIT VARCHAR(20);
DECLARE VARIABLE EPS CHAR(1);
DECLARE VARIABLE AFP CHAR(1);
DECLARE VARIABLE CCF CHAR(1);
DECLARE VARIABLE AFC CHAR(1);
DECLARE VARIABLE ARP CHAR(1);
DECLARE VARIABLE NOMBREADMIN VARCHAR(60);
DECLARE VARIABLE TOTADMIN NUMERIC(18,2);
DECLARE VARIABLE TIPOAPORT CHAR(1);
DECLARE VARIABLE ANO CHAR(4);
DECLARE VARIABLE NITEMPL VARCHAR(20);
DECLARE VARIABLE TOTDETVALOR NUMERIC(18,2);
DECLARE VARIABLE TOTIBC INTEGER;
BEGIN
itemaportadmi = 1;
itemdetaport = 1;
numegresointeger = CAST (numeroegr AS INTEGER);
numegresointeger = numegresointeger - 1;
EXECUTE PROCEDURE completa_ceros(numegresointeger)RETURNING_VALUES :numeroegr;
ANO = SUBSTR(fecha, 1, 4);
idaporte = GEN_ID(id_pgaport,1);
SELECT PAAN_TIPOAPORT FROM parametros_ano WHERE PAAN_ANO = :ANO INTO :tipoaport;
FOR SELECT A.TERC_NIT, A.ADMI_EPS, A.ADMI_AFP, A.ADMI_CCF, A.ADMI_AFC, A.ADMI_ARP, T.TERC_NOM FROM ADMINISTRADORA A, TERCEROS t
  WHERE T.TERC_NIT = A.TERC_NIT AND t.terc_admini = 'S' INTO :nit, :eps, :afp, :CCF, :afc, :arp, :nombreadmin
  DO
  BEGIN
  SELECT SUM (noco_valor) FROM nomina_conceptos N
  WHERE (N.noco_aporte = 'S' AND N.noco_entidad = :nit AND N.nomi_id = :id_nomina_1) OR
        (N.noco_aporte = 'S' AND N.noco_entidad = :nit AND N.nomi_id = :id_nomina_2)OR
        (N.noco_aporte = 'S' AND N.noco_entidad = :nit AND N.nomi_id = :id_nomina_3) OR
        (N.noco_aporte = 'S' AND N.noco_entidad = :nit AND N.nomi_id = :id_nomina_4) OR
        (N.noco_aporte = 'S' AND N.noco_entidad = :nit AND N.nomi_id = :id_nomina_5) OR
        (N.noco_aporte = 'S' AND N.noco_entidad = :nit AND N.nomi_id = :id_nomina_6) OR
        (N.noco_aporte = 'S' AND N.noco_entidad = :nit AND N.nomi_id = :id_nomina_7)
  INTO :totadmin;
  IF ((:totadmin IS NOT NULL) AND (:totadmin <> 0)) THEN
  BEGIN
  INSERT INTO pago_aportes (pgap_id, pgap_item, pgap_tipoap, pgap_conpago, pgap_admin, pgap_monto, pgap_intmora, pgap_fecha) VALUES
                           (:idaporte, :itemaportadmi, :tipoaport, '', :nit, :totadmin, :intmora, :fecha);
  idegreso = GEN_ID(id_egresos,1);
    numegresointeger = CAST (numeroegr AS INTEGER);
    numegresointeger = numegresointeger + 1;
    EXECUTE PROCEDURE completa_ceros(numegresointeger)RETURNING_VALUES :numeroegr;
  INSERT INTO egresos (EGRE_ID, TIDO_COD, PREF_PRE, EGRE_numero, EGRE_fecha, EGRE_CONC, EGRE_MONTO, EGRE_RTFTEMONTO, EGRE_OBS, EGRE_NOMTERC, EGRE_ANULADO, EGRE_TRANSMIT, TERC_NIT, EGRE_TIPO, CAJA_ID, EGRE_usuario, NUMOK, CLEG_ID)
                 VALUES (:idegreso, 62, :pref, :numeroegr, :fechaegr, :concepto, :totadmin, 0, :observaciones, :nombrebene, 'N', 'N', :nit, '3', :caja, :usuarioegr, 'S', 0);
  IF (pago = 'B') THEN
  INSERT INTO egresos_banco (EGRE_ID, EGBC_TIPOBCO, CUBA_COD, EGBC_numero, EGBC_fecha, PRBA_PREF, EGBC_BENEF, EGBC_MONTO, EGBC_CONCEPTO, EGBC_GMF, EGBC_ANULADO, EGBC_TRANSMIT)
                       VALUES (:idegreso, 62, :cuentaid, :numeroegrebnco, :fechaegrbnco, :prefegrebnco, :nit, :totadmin, :conceptobnco, :gmf, 'N', 'N');
  ELSE
  IF (pago = 'C') THEN
    INSERT INTO egresos_caja (EGRE_ID, EGCA_ITEM, CAJA_ID, FOPA_ID, EGCA_BANCO, EGCA_CUENTA, EGCA_numero, EGCA_fecha, EGCA_MONTO, EGCA_ANULADO, EGCA_TRANSMIT)
                 VALUES (:idegreso, 1, :caja, :formapagoid, :cajabnco, :cajabncocuenta, :cajabnconumeroegr, :fechaegr, :totadmin, 'N', 'N');
  IF (eps = 'S') THEN
  FOR SELECT TERC_NIT FROM EMPLEADOS WHERE EMPL_EPS = :NIT INTO :nitempl
  DO
  BEGIN
  SELECT SUM (NOCO_VALOR) FROM NOMINA_CONCEPTOS
  WHERE (TERC_NIT = :nitempl AND NOCO_SALARIO = 'S' AND nomi_id = :id_nomina_1) OR
        (TERC_NIT = :nitempl AND NOCO_SALARIO = 'S' AND nomi_id = :id_nomina_2) OR
        (TERC_NIT = :nitempl AND NOCO_SALARIO = 'S' AND nomi_id = :id_nomina_3) OR
        (TERC_NIT = :nitempl AND NOCO_SALARIO = 'S' AND nomi_id = :id_nomina_4) OR
        (TERC_NIT = :nitempl AND NOCO_SALARIO = 'S' AND nomi_id = :id_nomina_5) OR
        (TERC_NIT = :nitempl AND NOCO_SALARIO = 'S' AND nomi_id = :id_nomina_6) OR
        (TERC_NIT = :nitempl AND NOCO_SALARIO = 'S' AND nomi_id = :id_nomina_7)
        INTO :totibc;
    SELECT SUM (NOCO_VALOR) FROM NOMINA_CONCEPTOS
  WHERE (TERC_NIT = :nitempl AND NOCO_ENTIDAD = :nit AND NOCO_APORTE = 'S' AND nomi_id = :id_nomina_1) OR
        (TERC_NIT = :nitempl AND NOCO_ENTIDAD = :nit AND NOCO_APORTE = 'S' AND nomi_id = :id_nomina_2) OR
        (TERC_NIT = :nitempl AND NOCO_ENTIDAD = :nit AND NOCO_APORTE = 'S' AND nomi_id = :id_nomina_3) OR
        (TERC_NIT = :nitempl AND NOCO_ENTIDAD = :nit AND NOCO_APORTE = 'S' AND nomi_id = :id_nomina_4) OR
        (TERC_NIT = :nitempl AND NOCO_ENTIDAD = :nit AND NOCO_APORTE = 'S' AND nomi_id = :id_nomina_5) OR
        (TERC_NIT = :nitempl AND NOCO_ENTIDAD = :nit AND NOCO_APORTE = 'S' AND nomi_id = :id_nomina_6) OR
        (TERC_NIT = :nitempl AND NOCO_ENTIDAD = :nit AND NOCO_APORTE = 'S' AND nomi_id = :id_nomina_7)
         INTO :totdetvalor;
  IF ((:totdetvalor IS NOT NULL) AND (:totibc IS NOT NULL)) THEN
  BEGIN
  INSERT INTO PAGO_APORTES_DETALLE (pgap_id, pgap_item, pade_itemdet, terc_nit, pade_ibc, pade_cotobl)
                             VALUES(:idaporte, :itemaportadmi, :itemdetaport, :nitempl, :totibc, :totdetvalor);
    itemdetaport = :itemdetaport + 1;
  END
  END
  ELSE
 IF (afp = 'S') THEN
  FOR SELECT TERC_NIT FROM EMPLEADOS WHERE EMPL_AFP = :NIT INTO :nitempl
  DO
  BEGIN
  SELECT SUM (NOCO_VALOR) FROM NOMINA_CONCEPTOS
  WHERE (TERC_NIT = :nitempl AND NOCO_SALARIO = 'S' AND nomi_id = :id_nomina_1) OR
        (TERC_NIT = :nitempl AND NOCO_SALARIO = 'S' AND nomi_id = :id_nomina_2) OR
        (TERC_NIT = :nitempl AND NOCO_SALARIO = 'S' AND nomi_id = :id_nomina_3) OR
        (TERC_NIT = :nitempl AND NOCO_SALARIO = 'S' AND nomi_id = :id_nomina_4) OR
        (TERC_NIT = :nitempl AND NOCO_SALARIO = 'S' AND nomi_id = :id_nomina_5) OR
        (TERC_NIT = :nitempl AND NOCO_SALARIO = 'S' AND nomi_id = :id_nomina_6) OR
        (TERC_NIT = :nitempl AND NOCO_SALARIO = 'S' AND nomi_id = :id_nomina_7)
        INTO :totibc;
    SELECT SUM (NOCO_VALOR) FROM NOMINA_CONCEPTOS
  WHERE (TERC_NIT = :nitempl AND NOCO_ENTIDAD = :nit AND NOCO_APORTE = 'S' AND nomi_id = :id_nomina_1) OR
        (TERC_NIT = :nitempl AND NOCO_ENTIDAD = :nit AND NOCO_APORTE = 'S' AND nomi_id = :id_nomina_2) OR
        (TERC_NIT = :nitempl AND NOCO_ENTIDAD = :nit AND NOCO_APORTE = 'S' AND nomi_id = :id_nomina_3) OR
        (TERC_NIT = :nitempl AND NOCO_ENTIDAD = :nit AND NOCO_APORTE = 'S' AND nomi_id = :id_nomina_4) OR
        (TERC_NIT = :nitempl AND NOCO_ENTIDAD = :nit AND NOCO_APORTE = 'S' AND nomi_id = :id_nomina_5) OR
        (TERC_NIT = :nitempl AND NOCO_ENTIDAD = :nit AND NOCO_APORTE = 'S' AND nomi_id = :id_nomina_6) OR
        (TERC_NIT = :nitempl AND NOCO_ENTIDAD = :nit AND NOCO_APORTE = 'S' AND nomi_id = :id_nomina_7)
        INTO :totdetvalor;
  IF ((:totdetvalor IS NOT NULL) AND (:totibc IS NOT NULL)) THEN
  BEGIN
  INSERT INTO PAGO_APORTES_DETALLE (pgap_id, pgap_item, pade_itemdet, terc_nit, pade_ibc, pade_cotobl)
                             VALUES(:idaporte, :itemaportadmi, :itemdetaport, :nitempl, :totibc, :totdetvalor);
    itemdetaport = :itemdetaport + 1;
  END
  END
  ELSE
  IF (CCF = 'S') THEN
  FOR SELECT TERC_NIT FROM EMPLEADOS WHERE EMPL_CCF = :NIT INTO :nitempl
  DO
  BEGIN
  SELECT SUM (NOCO_VALOR) FROM NOMINA_CONCEPTOS
  WHERE (TERC_NIT = :nitempl AND NOCO_SALARIO = 'S' AND nomi_id = :id_nomina_1) OR
        (TERC_NIT = :nitempl AND NOCO_SALARIO = 'S' AND nomi_id = :id_nomina_2) OR
        (TERC_NIT = :nitempl AND NOCO_SALARIO = 'S' AND nomi_id = :id_nomina_3) OR
        (TERC_NIT = :nitempl AND NOCO_SALARIO = 'S' AND nomi_id = :id_nomina_4) OR
        (TERC_NIT = :nitempl AND NOCO_SALARIO = 'S' AND nomi_id = :id_nomina_5) OR
        (TERC_NIT = :nitempl AND NOCO_SALARIO = 'S' AND nomi_id = :id_nomina_6) OR
        (TERC_NIT = :nitempl AND NOCO_SALARIO = 'S' AND nomi_id = :id_nomina_7)
        INTO :totibc;
    SELECT SUM (NOCO_VALOR) FROM NOMINA_CONCEPTOS
  WHERE (TERC_NIT = :nitempl AND NOCO_ENTIDAD = :nit AND NOCO_APORTE = 'S' AND nomi_id = :id_nomina_1) OR
        (TERC_NIT = :nitempl AND NOCO_ENTIDAD = :nit AND NOCO_APORTE = 'S' AND nomi_id = :id_nomina_2) OR
        (TERC_NIT = :nitempl AND NOCO_ENTIDAD = :nit AND NOCO_APORTE = 'S' AND nomi_id = :id_nomina_3) OR
        (TERC_NIT = :nitempl AND NOCO_ENTIDAD = :nit AND NOCO_APORTE = 'S' AND nomi_id = :id_nomina_4) OR
        (TERC_NIT = :nitempl AND NOCO_ENTIDAD = :nit AND NOCO_APORTE = 'S' AND nomi_id = :id_nomina_5) OR
        (TERC_NIT = :nitempl AND NOCO_ENTIDAD = :nit AND NOCO_APORTE = 'S' AND nomi_id = :id_nomina_6) OR
        (TERC_NIT = :nitempl AND NOCO_ENTIDAD = :nit AND NOCO_APORTE = 'S' AND nomi_id = :id_nomina_7)
        INTO :totdetvalor;
  IF ((:totdetvalor IS NOT NULL) AND (:totibc IS NOT NULL)) THEN
  BEGIN
  INSERT INTO PAGO_APORTES_DETALLE (pgap_id, pgap_item, pade_itemdet, terc_nit, pade_ibc, pade_cotobl)
                             VALUES(:idaporte, :itemaportadmi, :itemdetaport, :nitempl, :totibc, :totdetvalor);
    itemdetaport = :itemdetaport + 1;
  END
  END
  ELSE
  IF (AFC = 'S') THEN
  FOR SELECT TERC_NIT FROM EMPLEADOS WHERE EMPL_AFC = :NIT INTO :nitempl
  DO
  BEGIN
  SELECT SUM (NOCO_VALOR) FROM NOMINA_CONCEPTOS
  WHERE (TERC_NIT = :nitempl AND NOCO_SALARIO = 'S' AND nomi_id = :id_nomina_1) OR
        (TERC_NIT = :nitempl AND NOCO_SALARIO = 'S' AND nomi_id = :id_nomina_2) OR
        (TERC_NIT = :nitempl AND NOCO_SALARIO = 'S' AND nomi_id = :id_nomina_3) OR
        (TERC_NIT = :nitempl AND NOCO_SALARIO = 'S' AND nomi_id = :id_nomina_4) OR
        (TERC_NIT = :nitempl AND NOCO_SALARIO = 'S' AND nomi_id = :id_nomina_5) OR
        (TERC_NIT = :nitempl AND NOCO_SALARIO = 'S' AND nomi_id = :id_nomina_6) OR
        (TERC_NIT = :nitempl AND NOCO_SALARIO = 'S' AND nomi_id = :id_nomina_7)
        INTO :totibc;
    SELECT SUM (NOCO_VALOR) FROM NOMINA_CONCEPTOS
  WHERE (TERC_NIT = :nitempl AND NOCO_ENTIDAD = :nit AND NOCO_APORTE = 'S' AND nomi_id = :id_nomina_1) OR
        (TERC_NIT = :nitempl AND NOCO_ENTIDAD = :nit AND NOCO_APORTE = 'S' AND nomi_id = :id_nomina_2) OR
        (TERC_NIT = :nitempl AND NOCO_ENTIDAD = :nit AND NOCO_APORTE = 'S' AND nomi_id = :id_nomina_3) OR
        (TERC_NIT = :nitempl AND NOCO_ENTIDAD = :nit AND NOCO_APORTE = 'S' AND nomi_id = :id_nomina_4) OR
        (TERC_NIT = :nitempl AND NOCO_ENTIDAD = :nit AND NOCO_APORTE = 'S' AND nomi_id = :id_nomina_5) OR
        (TERC_NIT = :nitempl AND NOCO_ENTIDAD = :nit AND NOCO_APORTE = 'S' AND nomi_id = :id_nomina_6) OR
        (TERC_NIT = :nitempl AND NOCO_ENTIDAD = :nit AND NOCO_APORTE = 'S' AND nomi_id = :id_nomina_7)
        INTO :totdetvalor;
  IF ((:totdetvalor IS NOT NULL) AND (:totibc IS NOT NULL)) THEN
  BEGIN
  INSERT INTO PAGO_APORTES_DETALLE (pgap_id, pgap_item, pade_itemdet, terc_nit, pade_ibc, pade_cotobl)
                             VALUES(:idaporte, :itemaportadmi, :itemdetaport, :nitempl, :totibc, :totdetvalor);
    itemdetaport = :itemdetaport + 1;
  END
  END
  ELSE
  IF (ARP = 'S') THEN
  FOR SELECT TERC_NIT FROM EMPLEADOS WHERE EMPL_ARP = :NIT INTO :nitempl
  DO
  BEGIN
  SELECT SUM (NOCO_VALOR) FROM NOMINA_CONCEPTOS
  WHERE (TERC_NIT = :nitempl AND NOCO_SALARIO = 'S' AND nomi_id = :id_nomina_1) OR
        (TERC_NIT = :nitempl AND NOCO_SALARIO = 'S' AND nomi_id = :id_nomina_2) OR
        (TERC_NIT = :nitempl AND NOCO_SALARIO = 'S' AND nomi_id = :id_nomina_3) OR
        (TERC_NIT = :nitempl AND NOCO_SALARIO = 'S' AND nomi_id = :id_nomina_4) OR
        (TERC_NIT = :nitempl AND NOCO_SALARIO = 'S' AND nomi_id = :id_nomina_5) OR
        (TERC_NIT = :nitempl AND NOCO_SALARIO = 'S' AND nomi_id = :id_nomina_6) OR
        (TERC_NIT = :nitempl AND NOCO_SALARIO = 'S' AND nomi_id = :id_nomina_7)
        INTO :totibc;
    SELECT SUM (NOCO_VALOR) FROM NOMINA_CONCEPTOS
  WHERE (TERC_NIT = :nitempl AND NOCO_ENTIDAD = :nit AND NOCO_APORTE = 'S' AND nomi_id = :id_nomina_1) OR
        (TERC_NIT = :nitempl AND NOCO_ENTIDAD = :nit AND NOCO_APORTE = 'S' AND nomi_id = :id_nomina_2) OR
        (TERC_NIT = :nitempl AND NOCO_ENTIDAD = :nit AND NOCO_APORTE = 'S' AND nomi_id = :id_nomina_3) OR
        (TERC_NIT = :nitempl AND NOCO_ENTIDAD = :nit AND NOCO_APORTE = 'S' AND nomi_id = :id_nomina_4) OR
        (TERC_NIT = :nitempl AND NOCO_ENTIDAD = :nit AND NOCO_APORTE = 'S' AND nomi_id = :id_nomina_5) OR
        (TERC_NIT = :nitempl AND NOCO_ENTIDAD = :nit AND NOCO_APORTE = 'S' AND nomi_id = :id_nomina_6) OR
        (TERC_NIT = :nitempl AND NOCO_ENTIDAD = :nit AND NOCO_APORTE = 'S' AND nomi_id = :id_nomina_7)
        INTO :totdetvalor;
  IF ((:totdetvalor IS NOT NULL) AND (:totibc IS NOT NULL)) THEN
  BEGIN
  INSERT INTO PAGO_APORTES_DETALLE (pgap_id, pgap_item, pade_itemdet, terc_nit, pade_ibc, pade_cotobl)
                             VALUES(:idaporte, :itemaportadmi, :itemdetaport, :nitempl, :totibc, :totdetvalor);
    itemdetaport = :itemdetaport + 1;
  END
  END
  itemaportadmi = :itemaportadmi + 1;
  END
  END
  UPDATE nomina n SET n.nomi_aporok = 'S' WHERE N.NOMI_ID = :id_nomina_1 OR (N.NOMI_ID = :id_nomina_2) OR (N.NOMI_ID = :id_nomina_3) OR (N.NOMI_ID = :id_nomina_4)
  OR (N.NOMI_ID = :id_nomina_5) OR (N.NOMI_ID = :id_nomina_6) OR (N.NOMI_ID = :id_nomina_7);
END
^

SET TERM ; ^

ALTER TABLE PAGO_APORTES
ADD PGAP_FORMULARIO VARCHAR(10);

SET TERM ^ ;

ALTER PROCEDURE LIQUIDACION_APORTES(
    ID_NOMINA_1 INTEGER,
    ID_NOMINA_2 INTEGER,
    ID_NOMINA_3 INTEGER,
    ID_NOMINA_4 INTEGER,
    ID_NOMINA_5 INTEGER,
    ID_NOMINA_6 INTEGER,
    ID_NOMINA_7 INTEGER,
    INTMORA NUMERIC(18,2),
    FECHA DATE,
    PAGO CHAR(1),
    NITBENE VARCHAR(20),
    FECHAEGR DATE,
    PREF VARCHAR(4),
    NUMEROEGR VARCHAR(6),
    CONCEPTO VARCHAR(60),
    OBSERVACIONES BLOB SUB_TYPE 0 SEGMENT SIZE 80,
    NOMBREBENE VARCHAR(60),
    CAJA INTEGER,
    USUARIOEGR VARCHAR(10),
    CUENTAID INTEGER,
    FECHAEGRBNCO DATE,
    PREFEGREBNCO VARCHAR(4),
    NUMEROEGREBNCO VARCHAR(6),
    BENEBNCO VARCHAR(60),
    CONCEPTOBNCO VARCHAR(60),
    GMF CHAR(1),
    FORMAPAGOID INTEGER,
    CAJABNCO VARCHAR(2),
    CAJABNCOCUENTA VARCHAR(20),
    CAJABNCONUMEROEGR VARCHAR(20),
    FORMULARIO VARCHAR(10))
AS
DECLARE VARIABLE itemaportadmi INTEGER;
DECLARE VARIABLE itemdetaport INTEGER;
DECLARE VARIABLE idaporte INTEGER;
DECLARE VARIABLE idegreso INTEGER;
DECLARE VARIABLE numegresointeger INTEGER;
DECLARE VARIABLE NIT VARCHAR(20);
DECLARE VARIABLE EPS CHAR(1);
DECLARE VARIABLE AFP CHAR(1);
DECLARE VARIABLE CCF CHAR(1);
DECLARE VARIABLE AFC CHAR(1);
DECLARE VARIABLE ARP CHAR(1);
DECLARE VARIABLE NOMBREADMIN VARCHAR(60);
DECLARE VARIABLE TOTADMIN NUMERIC(18,2);
DECLARE VARIABLE TIPOAPORT CHAR(1);
DECLARE VARIABLE ANO CHAR(4);
DECLARE VARIABLE NITEMPL VARCHAR(20);
DECLARE VARIABLE TOTDETVALOR NUMERIC(18,2);
DECLARE VARIABLE TOTIBC INTEGER;
BEGIN
itemaportadmi = 1;
itemdetaport = 1;
numegresointeger = CAST (numeroegr AS INTEGER);
numegresointeger = numegresointeger - 1;
EXECUTE PROCEDURE completa_ceros(numegresointeger)RETURNING_VALUES :numeroegr;
ANO = SUBSTR(fecha, 1, 4);
idaporte = GEN_ID(id_pgaport,1);
SELECT PAAN_TIPOAPORT FROM parametros_ano WHERE PAAN_ANO = :ANO INTO :tipoaport;
FOR SELECT A.TERC_NIT, A.ADMI_EPS, A.ADMI_AFP, A.ADMI_CCF, A.ADMI_AFC, A.ADMI_ARP, T.TERC_NOM FROM ADMINISTRADORA A, TERCEROS t
  WHERE T.TERC_NIT = A.TERC_NIT AND t.terc_admini = 'S' INTO :nit, :eps, :afp, :CCF, :afc, :arp, :nombreadmin
  DO
  BEGIN
  SELECT SUM (noco_valor) FROM nomina_conceptos N
  WHERE (N.noco_aporte = 'S' AND N.noco_entidad = :nit AND N.nomi_id = :id_nomina_1) OR
        (N.noco_aporte = 'S' AND N.noco_entidad = :nit AND N.nomi_id = :id_nomina_2)OR
        (N.noco_aporte = 'S' AND N.noco_entidad = :nit AND N.nomi_id = :id_nomina_3) OR
        (N.noco_aporte = 'S' AND N.noco_entidad = :nit AND N.nomi_id = :id_nomina_4) OR
        (N.noco_aporte = 'S' AND N.noco_entidad = :nit AND N.nomi_id = :id_nomina_5) OR
        (N.noco_aporte = 'S' AND N.noco_entidad = :nit AND N.nomi_id = :id_nomina_6) OR
        (N.noco_aporte = 'S' AND N.noco_entidad = :nit AND N.nomi_id = :id_nomina_7)
  INTO :totadmin;
  IF ((:totadmin IS NOT NULL) AND (:totadmin <> 0)) THEN
  BEGIN
  INSERT INTO pago_aportes (pgap_id, pgap_item, pgap_tipoap, pgap_conpago, pgap_admin, pgap_monto, pgap_intmora, pgap_fecha, pgap_formulario) VALUES
                           (:idaporte, :itemaportadmi, :tipoaport, '', :nit, :totadmin, :intmora, :fecha, :formulario);
  idegreso = GEN_ID(id_egresos,1);
    numegresointeger = CAST (numeroegr AS INTEGER);
    numegresointeger = numegresointeger + 1;
    EXECUTE PROCEDURE completa_ceros(numegresointeger)RETURNING_VALUES :numeroegr;
  INSERT INTO egresos (EGRE_ID, TIDO_COD, PREF_PRE, EGRE_numero, EGRE_fecha, EGRE_CONC, EGRE_MONTO, EGRE_RTFTEMONTO, EGRE_OBS, EGRE_NOMTERC, EGRE_ANULADO, EGRE_TRANSMIT, TERC_NIT, EGRE_TIPO, CAJA_ID, EGRE_usuario, NUMOK, CLEG_ID)
                 VALUES (:idegreso, 62, :pref, :numeroegr, :fechaegr, :concepto, :totadmin, 0, :observaciones, :nombrebene, 'N', 'N', :nit, '3', :caja, :usuarioegr, 'S', 0);
  IF (pago = 'B') THEN
  INSERT INTO egresos_banco (EGRE_ID, EGBC_TIPOBCO, CUBA_COD, EGBC_numero, EGBC_fecha, PRBA_PREF, EGBC_BENEF, EGBC_MONTO, EGBC_CONCEPTO, EGBC_GMF, EGBC_ANULADO, EGBC_TRANSMIT)
                       VALUES (:idegreso, 62, :cuentaid, :numeroegrebnco, :fechaegrbnco, :prefegrebnco, :nit, :totadmin, :conceptobnco, :gmf, 'N', 'N');
  ELSE
  IF (pago = 'C') THEN
    INSERT INTO egresos_caja (EGRE_ID, EGCA_ITEM, CAJA_ID, FOPA_ID, EGCA_BANCO, EGCA_CUENTA, EGCA_numero, EGCA_fecha, EGCA_MONTO, EGCA_ANULADO, EGCA_TRANSMIT)
                 VALUES (:idegreso, 1, :caja, :formapagoid, :cajabnco, :cajabncocuenta, :cajabnconumeroegr, :fechaegr, :totadmin, 'N', 'N');
  IF (eps = 'S') THEN
  FOR SELECT TERC_NIT FROM EMPLEADOS WHERE EMPL_EPS = :NIT INTO :nitempl
  DO
  BEGIN
  SELECT SUM (NOCO_VALOR) FROM NOMINA_CONCEPTOS
  WHERE (TERC_NIT = :nitempl AND NOCO_SALARIO = 'S' AND nomi_id = :id_nomina_1) OR
        (TERC_NIT = :nitempl AND NOCO_SALARIO = 'S' AND nomi_id = :id_nomina_2) OR
        (TERC_NIT = :nitempl AND NOCO_SALARIO = 'S' AND nomi_id = :id_nomina_3) OR
        (TERC_NIT = :nitempl AND NOCO_SALARIO = 'S' AND nomi_id = :id_nomina_4) OR
        (TERC_NIT = :nitempl AND NOCO_SALARIO = 'S' AND nomi_id = :id_nomina_5) OR
        (TERC_NIT = :nitempl AND NOCO_SALARIO = 'S' AND nomi_id = :id_nomina_6) OR
        (TERC_NIT = :nitempl AND NOCO_SALARIO = 'S' AND nomi_id = :id_nomina_7)
        INTO :totibc;
    SELECT SUM (NOCO_VALOR) FROM NOMINA_CONCEPTOS
  WHERE (TERC_NIT = :nitempl AND NOCO_ENTIDAD = :nit AND NOCO_APORTE = 'S' AND nomi_id = :id_nomina_1) OR
        (TERC_NIT = :nitempl AND NOCO_ENTIDAD = :nit AND NOCO_APORTE = 'S' AND nomi_id = :id_nomina_2) OR
        (TERC_NIT = :nitempl AND NOCO_ENTIDAD = :nit AND NOCO_APORTE = 'S' AND nomi_id = :id_nomina_3) OR
        (TERC_NIT = :nitempl AND NOCO_ENTIDAD = :nit AND NOCO_APORTE = 'S' AND nomi_id = :id_nomina_4) OR
        (TERC_NIT = :nitempl AND NOCO_ENTIDAD = :nit AND NOCO_APORTE = 'S' AND nomi_id = :id_nomina_5) OR
        (TERC_NIT = :nitempl AND NOCO_ENTIDAD = :nit AND NOCO_APORTE = 'S' AND nomi_id = :id_nomina_6) OR
        (TERC_NIT = :nitempl AND NOCO_ENTIDAD = :nit AND NOCO_APORTE = 'S' AND nomi_id = :id_nomina_7)
         INTO :totdetvalor;
  IF ((:totdetvalor IS NOT NULL) AND (:totibc IS NOT NULL)) THEN
  BEGIN
  INSERT INTO PAGO_APORTES_DETALLE (pgap_id, pgap_item, pade_itemdet, terc_nit, pade_ibc, pade_cotobl)
                             VALUES(:idaporte, :itemaportadmi, :itemdetaport, :nitempl, :totibc, :totdetvalor);
    itemdetaport = :itemdetaport + 1;
  END
  END
  ELSE
 IF (afp = 'S') THEN
  FOR SELECT TERC_NIT FROM EMPLEADOS WHERE EMPL_AFP = :NIT INTO :nitempl
  DO
  BEGIN
  SELECT SUM (NOCO_VALOR) FROM NOMINA_CONCEPTOS
  WHERE (TERC_NIT = :nitempl AND NOCO_SALARIO = 'S' AND nomi_id = :id_nomina_1) OR
        (TERC_NIT = :nitempl AND NOCO_SALARIO = 'S' AND nomi_id = :id_nomina_2) OR
        (TERC_NIT = :nitempl AND NOCO_SALARIO = 'S' AND nomi_id = :id_nomina_3) OR
        (TERC_NIT = :nitempl AND NOCO_SALARIO = 'S' AND nomi_id = :id_nomina_4) OR
        (TERC_NIT = :nitempl AND NOCO_SALARIO = 'S' AND nomi_id = :id_nomina_5) OR
        (TERC_NIT = :nitempl AND NOCO_SALARIO = 'S' AND nomi_id = :id_nomina_6) OR
        (TERC_NIT = :nitempl AND NOCO_SALARIO = 'S' AND nomi_id = :id_nomina_7)
        INTO :totibc;
    SELECT SUM (NOCO_VALOR) FROM NOMINA_CONCEPTOS
  WHERE (TERC_NIT = :nitempl AND NOCO_ENTIDAD = :nit AND NOCO_APORTE = 'S' AND nomi_id = :id_nomina_1) OR
        (TERC_NIT = :nitempl AND NOCO_ENTIDAD = :nit AND NOCO_APORTE = 'S' AND nomi_id = :id_nomina_2) OR
        (TERC_NIT = :nitempl AND NOCO_ENTIDAD = :nit AND NOCO_APORTE = 'S' AND nomi_id = :id_nomina_3) OR
        (TERC_NIT = :nitempl AND NOCO_ENTIDAD = :nit AND NOCO_APORTE = 'S' AND nomi_id = :id_nomina_4) OR
        (TERC_NIT = :nitempl AND NOCO_ENTIDAD = :nit AND NOCO_APORTE = 'S' AND nomi_id = :id_nomina_5) OR
        (TERC_NIT = :nitempl AND NOCO_ENTIDAD = :nit AND NOCO_APORTE = 'S' AND nomi_id = :id_nomina_6) OR
        (TERC_NIT = :nitempl AND NOCO_ENTIDAD = :nit AND NOCO_APORTE = 'S' AND nomi_id = :id_nomina_7)
        INTO :totdetvalor;
  IF ((:totdetvalor IS NOT NULL) AND (:totibc IS NOT NULL)) THEN
  BEGIN
  INSERT INTO PAGO_APORTES_DETALLE (pgap_id, pgap_item, pade_itemdet, terc_nit, pade_ibc, pade_cotobl)
                             VALUES(:idaporte, :itemaportadmi, :itemdetaport, :nitempl, :totibc, :totdetvalor);
    itemdetaport = :itemdetaport + 1;
  END
  END
  ELSE
  IF (CCF = 'S') THEN
  FOR SELECT TERC_NIT FROM EMPLEADOS WHERE EMPL_CCF = :NIT INTO :nitempl
  DO
  BEGIN
  SELECT SUM (NOCO_VALOR) FROM NOMINA_CONCEPTOS
  WHERE (TERC_NIT = :nitempl AND NOCO_SALARIO = 'S' AND nomi_id = :id_nomina_1) OR
        (TERC_NIT = :nitempl AND NOCO_SALARIO = 'S' AND nomi_id = :id_nomina_2) OR
        (TERC_NIT = :nitempl AND NOCO_SALARIO = 'S' AND nomi_id = :id_nomina_3) OR
        (TERC_NIT = :nitempl AND NOCO_SALARIO = 'S' AND nomi_id = :id_nomina_4) OR
        (TERC_NIT = :nitempl AND NOCO_SALARIO = 'S' AND nomi_id = :id_nomina_5) OR
        (TERC_NIT = :nitempl AND NOCO_SALARIO = 'S' AND nomi_id = :id_nomina_6) OR
        (TERC_NIT = :nitempl AND NOCO_SALARIO = 'S' AND nomi_id = :id_nomina_7)
        INTO :totibc;
    SELECT SUM (NOCO_VALOR) FROM NOMINA_CONCEPTOS
  WHERE (TERC_NIT = :nitempl AND NOCO_ENTIDAD = :nit AND NOCO_APORTE = 'S' AND nomi_id = :id_nomina_1) OR
        (TERC_NIT = :nitempl AND NOCO_ENTIDAD = :nit AND NOCO_APORTE = 'S' AND nomi_id = :id_nomina_2) OR
        (TERC_NIT = :nitempl AND NOCO_ENTIDAD = :nit AND NOCO_APORTE = 'S' AND nomi_id = :id_nomina_3) OR
        (TERC_NIT = :nitempl AND NOCO_ENTIDAD = :nit AND NOCO_APORTE = 'S' AND nomi_id = :id_nomina_4) OR
        (TERC_NIT = :nitempl AND NOCO_ENTIDAD = :nit AND NOCO_APORTE = 'S' AND nomi_id = :id_nomina_5) OR
        (TERC_NIT = :nitempl AND NOCO_ENTIDAD = :nit AND NOCO_APORTE = 'S' AND nomi_id = :id_nomina_6) OR
        (TERC_NIT = :nitempl AND NOCO_ENTIDAD = :nit AND NOCO_APORTE = 'S' AND nomi_id = :id_nomina_7)
        INTO :totdetvalor;
  IF ((:totdetvalor IS NOT NULL) AND (:totibc IS NOT NULL)) THEN
  BEGIN
  INSERT INTO PAGO_APORTES_DETALLE (pgap_id, pgap_item, pade_itemdet, terc_nit, pade_ibc, pade_cotobl)
                             VALUES(:idaporte, :itemaportadmi, :itemdetaport, :nitempl, :totibc, :totdetvalor);
    itemdetaport = :itemdetaport + 1;
  END
  END
  ELSE
  IF (AFC = 'S') THEN
  FOR SELECT TERC_NIT FROM EMPLEADOS WHERE EMPL_AFC = :NIT INTO :nitempl
  DO
  BEGIN
  SELECT SUM (NOCO_VALOR) FROM NOMINA_CONCEPTOS
  WHERE (TERC_NIT = :nitempl AND NOCO_SALARIO = 'S' AND nomi_id = :id_nomina_1) OR
        (TERC_NIT = :nitempl AND NOCO_SALARIO = 'S' AND nomi_id = :id_nomina_2) OR
        (TERC_NIT = :nitempl AND NOCO_SALARIO = 'S' AND nomi_id = :id_nomina_3) OR
        (TERC_NIT = :nitempl AND NOCO_SALARIO = 'S' AND nomi_id = :id_nomina_4) OR
        (TERC_NIT = :nitempl AND NOCO_SALARIO = 'S' AND nomi_id = :id_nomina_5) OR
        (TERC_NIT = :nitempl AND NOCO_SALARIO = 'S' AND nomi_id = :id_nomina_6) OR
        (TERC_NIT = :nitempl AND NOCO_SALARIO = 'S' AND nomi_id = :id_nomina_7)
        INTO :totibc;
    SELECT SUM (NOCO_VALOR) FROM NOMINA_CONCEPTOS
  WHERE (TERC_NIT = :nitempl AND NOCO_ENTIDAD = :nit AND NOCO_APORTE = 'S' AND nomi_id = :id_nomina_1) OR
        (TERC_NIT = :nitempl AND NOCO_ENTIDAD = :nit AND NOCO_APORTE = 'S' AND nomi_id = :id_nomina_2) OR
        (TERC_NIT = :nitempl AND NOCO_ENTIDAD = :nit AND NOCO_APORTE = 'S' AND nomi_id = :id_nomina_3) OR
        (TERC_NIT = :nitempl AND NOCO_ENTIDAD = :nit AND NOCO_APORTE = 'S' AND nomi_id = :id_nomina_4) OR
        (TERC_NIT = :nitempl AND NOCO_ENTIDAD = :nit AND NOCO_APORTE = 'S' AND nomi_id = :id_nomina_5) OR
        (TERC_NIT = :nitempl AND NOCO_ENTIDAD = :nit AND NOCO_APORTE = 'S' AND nomi_id = :id_nomina_6) OR
        (TERC_NIT = :nitempl AND NOCO_ENTIDAD = :nit AND NOCO_APORTE = 'S' AND nomi_id = :id_nomina_7)
        INTO :totdetvalor;
  IF ((:totdetvalor IS NOT NULL) AND (:totibc IS NOT NULL)) THEN
  BEGIN
  INSERT INTO PAGO_APORTES_DETALLE (pgap_id, pgap_item, pade_itemdet, terc_nit, pade_ibc, pade_cotobl)
                             VALUES(:idaporte, :itemaportadmi, :itemdetaport, :nitempl, :totibc, :totdetvalor);
    itemdetaport = :itemdetaport + 1;
  END
  END
  ELSE
  IF (ARP = 'S') THEN
  FOR SELECT TERC_NIT FROM EMPLEADOS WHERE EMPL_ARP = :NIT INTO :nitempl
  DO
  BEGIN
  SELECT SUM (NOCO_VALOR) FROM NOMINA_CONCEPTOS
  WHERE (TERC_NIT = :nitempl AND NOCO_SALARIO = 'S' AND nomi_id = :id_nomina_1) OR
        (TERC_NIT = :nitempl AND NOCO_SALARIO = 'S' AND nomi_id = :id_nomina_2) OR
        (TERC_NIT = :nitempl AND NOCO_SALARIO = 'S' AND nomi_id = :id_nomina_3) OR
        (TERC_NIT = :nitempl AND NOCO_SALARIO = 'S' AND nomi_id = :id_nomina_4) OR
        (TERC_NIT = :nitempl AND NOCO_SALARIO = 'S' AND nomi_id = :id_nomina_5) OR
        (TERC_NIT = :nitempl AND NOCO_SALARIO = 'S' AND nomi_id = :id_nomina_6) OR
        (TERC_NIT = :nitempl AND NOCO_SALARIO = 'S' AND nomi_id = :id_nomina_7)
        INTO :totibc;
    SELECT SUM (NOCO_VALOR) FROM NOMINA_CONCEPTOS
  WHERE (TERC_NIT = :nitempl AND NOCO_ENTIDAD = :nit AND NOCO_APORTE = 'S' AND nomi_id = :id_nomina_1) OR
        (TERC_NIT = :nitempl AND NOCO_ENTIDAD = :nit AND NOCO_APORTE = 'S' AND nomi_id = :id_nomina_2) OR
        (TERC_NIT = :nitempl AND NOCO_ENTIDAD = :nit AND NOCO_APORTE = 'S' AND nomi_id = :id_nomina_3) OR
        (TERC_NIT = :nitempl AND NOCO_ENTIDAD = :nit AND NOCO_APORTE = 'S' AND nomi_id = :id_nomina_4) OR
        (TERC_NIT = :nitempl AND NOCO_ENTIDAD = :nit AND NOCO_APORTE = 'S' AND nomi_id = :id_nomina_5) OR
        (TERC_NIT = :nitempl AND NOCO_ENTIDAD = :nit AND NOCO_APORTE = 'S' AND nomi_id = :id_nomina_6) OR
        (TERC_NIT = :nitempl AND NOCO_ENTIDAD = :nit AND NOCO_APORTE = 'S' AND nomi_id = :id_nomina_7)
        INTO :totdetvalor;
  IF ((:totdetvalor IS NOT NULL) AND (:totibc IS NOT NULL)) THEN
  BEGIN
  INSERT INTO PAGO_APORTES_DETALLE (pgap_id, pgap_item, pade_itemdet, terc_nit, pade_ibc, pade_cotobl)
                             VALUES(:idaporte, :itemaportadmi, :itemdetaport, :nitempl, :totibc, :totdetvalor);
    itemdetaport = :itemdetaport + 1;
  END
  END
  itemaportadmi = :itemaportadmi + 1;
  END
  END
  UPDATE nomina n SET n.nomi_aporok = 'S' WHERE N.NOMI_ID = :id_nomina_1 OR (N.NOMI_ID = :id_nomina_2) OR (N.NOMI_ID = :id_nomina_3) OR (N.NOMI_ID = :id_nomina_4)
  OR (N.NOMI_ID = :id_nomina_5) OR (N.NOMI_ID = :id_nomina_6) OR (N.NOMI_ID = :id_nomina_7);
END
^

CREATE TABLE EDUCACION_FORMAL_EMPLEADO (
    TERC_NIT       NIT NOT NULL,
    EDFO_ITEM      INTEGER NOT NULL,
    EDFO_INSTI     VARCHAR(60) CHARACTER SET NONE,
    EDFO_PROGRAMA  VARCHAR(60) CHARACTER SET NONE,
    EDFO_DESDE     VARCHAR(20) CHARACTER SET NONE,
    EDFO_HASTA     VARCHAR(20) CHARACTER SET NONE
);
^

CREATE TABLE EXPERIENCIA_LABORAL_EMPLEADO (
    TERC_NIT        NIT NOT NULL,
    EXLA_ITEM       INTEGER NOT NULL,
    EXLA_EMPRESA    NOMBRE,
    EXLA_DESDE      DATE,
    EXLA_HASTA      DATE,
    EXLA_CARGO      NOMBRE,
    EXLA_FUNCIONES  BLOB SUB_TYPE 1 SEGMENT SIZE 80 CHARACTER SET NONE
);
^


ALTER TABLE EDUCACION_FORMAL_EMPLEADO ADD CONSTRAINT PK_EDUCACION_FORMAL_EMPLEADO PRIMARY KEY (TERC_NIT, EDFO_ITEM);
^
ALTER TABLE EXPERIENCIA_LABORAL_EMPLEADO ADD CONSTRAINT PK_EXPERIENCIA_LABORAL_EMPLEADO PRIMARY KEY (TERC_NIT, EXLA_ITEM);
^
ALTER TABLE EDUCACION_FORMAL_EMPLEADO ADD CONSTRAINT FK_EDUCACION_FORMAL_EMPLEADO_2 FOREIGN KEY (TERC_NIT) REFERENCES EMPLEADOS (TERC_NIT);
^
ALTER TABLE EXPERIENCIA_LABORAL_EMPLEADO ADD CONSTRAINT FK_EXPERIENCIA_LABORAL_EMPLEADO FOREIGN KEY (TERC_NIT) REFERENCES EMPLEADOS (TERC_NIT);
^
ALTER TABLE PRESTAMO_CUOTAS
ADD PRCU_OK BOOLEANO;
^

INSERT INTO CONCEPTOS_NOMINA (CONC_COD, CONC_NOMBRE, CONC_DEDUC, CONC_FECINI, CONC_FECFIN, CONC_PORC, CONC_BASE, CONC_ENTIDAD, CONC_MONTO, CONC_CTAGAST, CONC_DIAS, CONC_MODIFI, CONC_DIAPAGO, CONC_PROMEDIO, CONC_TODOSPER, CONC_PROV, CONC_PERACTUAL, CONC_APORTE, CONC_APLICAPROM, CONC_PERPROMEDIO, CONC_OTROCONC, CONC_CODOTROCONC, CONC_SALARIO, CONC_CTACXP, CONC_NOMCORTO, CONC_PERIODOS, CONC_GTOEMPR) VALUES (922, 'PRESTAMOS', 'S', '1-JAN-2008', '1-JAN-2008', NULL, NULL, NULL, NULL, NULL, 'N', 'S', NULL, 'N', 'S', 'N', 'N', 'N', 'N', NULL, 'N', NULL, 'N', NULL, 'PRESTAMO', NULL, 'N');
^


ALTER PROCEDURE CAUSA_NOMINA(
    FEC DATE,
    PERIODO INTEGER,
    PERIODICIDAD INTEGER,
    PAGOGLOBAL CHAR(1),
    ANO CHAR(4))
RETURNS (
    IDNOMINA INTEGER)
AS
DECLARE VARIABLE item INTEGER;
DECLARE VARIABLE nite VARCHAR(20) CHARACTER SET none;
DECLARE VARIABLE nit_tercero VARCHAR(20);
DECLARE VARIABLE concept INTEGER;
DECLARE VARIABLE montos NUMERIC(18,2);
DECLARE VARIABLE porcen NUMERIC(9,4);
DECLARE VARIABLE entidad VARCHAR(20);
DECLARE VARIABLE conc_cod INTEGER;
DECLARE VARIABLE conc_deduc CHAR(1);
DECLARE VARIABLE conc_porc NUMERIC(9,4);
DECLARE VARIABLE conc_entidad INTEGER;
DECLARE VARIABLE conc_monto NUMERIC(18,2);
DECLARE VARIABLE conc_modifi CHAR(1);
DECLARE VARIABLE conc_promedio CHAR(1);
DECLARE VARIABLE emco_perprom INTEGER;
DECLARE VARIABLE valor NUMERIC(18,2);
DECLARE VARIABLE diaslab INTEGER;
DECLARE VARIABLE conc_prov CHAR(1);
DECLARE VARIABLE conc_aporte CHAR(1);
DECLARE VARIABLE numeroprom INTEGER;
DECLARE VARIABLE conc_aplicaprom CHAR(1);
DECLARE VARIABLE perinicial INTEGER;
DECLARE VARIABLE anoprom INTEGER;
DECLARE VARIABLE conc_dias CHAR(1);
DECLARE VARIABLE conc_otroconc CHAR(1);
DECLARE VARIABLE conc_codotroconc INTEGER;
DECLARE VARIABLE anosum INTEGER;
DECLARE VARIABLE salario CHAR(1) CHARACTER SET none;
DECLARE VARIABLE liquidaper INTEGER;
DECLARE VARIABLE rmod NUMERIC(2,2);
DECLARE VARIABLE basico NUMERIC(18,2);
DECLARE VARIABLE niteps VARCHAR(20);
DECLARE VARIABLE nitafc VARCHAR(20);
DECLARE VARIABLE nitafp VARCHAR(20);
DECLARE VARIABLE nitccf VARCHAR(20);
DECLARE VARIABLE gtoempr CHAR(1);
DECLARE VARIABLE comision NUMERIC(18,2);
DECLARE VARIABLE cambsaltrans NUMERIC(18,2);
DECLARE VARIABLE SALDOSINI NUMERIC(18,2);
DECLARE VARIABLE duranov INTEGER;
DECLARE VARIABLE base NUMERIC(18,2);
BEGIN
/*SI ES QUINCENAL*/
IF (periodicidad = 2) THEN
BEGIN
EXECUTE PROCEDURE cambie_id_nomina RETURNING_VALUES(:idnomina);
INSERT INTO nomina (nomi_id, NOMI_FECCAUSA, NOMI_PAGOGLOBAL, NOMI_PERIODOCIDAD, NOMI_PERIODO, NOMI_ANO, NOMI_LIQOK)
VALUES (:IDNOMINA, :fec,:pagoglobal, :periodicidad, :periodo, :ano, 'N');
 BEGIN
    item = 1;
    FOR SELECT E.TERC_NIT, E.empl_salario, e.empl_eps, e.empl_afc, e.empl_afp, e.empl_ccf
    FROM EMPLEADOS E
    WHERE E.empl_ppago = 2
    INTO :nite, :basico, :niteps, :nitafc, :nitafp, :nitccf
    DO
    BEGIN
    FOR SELECT CE.TERC_NIT, CE.CONC_COD, CE.EMCO_MONTO, CE.EMCO_PORC, ce.empl_entidad, CE.emco_perprom, CE.emco_luquidaper, CN.CONC_COD, CN.CONC_DEDUC,CN.CONC_PORC, CN.CONC_ENTIDAD, CN.CONC_MONTO,  CN.CONC_DIAS, CN.CONC_MODIFI,
    CN.CONC_PROMEDIO, CN.conc_salario, CE.emco_perprom, CN.conc_prov, CN.conc_aporte, CN.conc_aplicaprom, cn.conc_otroconc, cn.conc_codotroconc, CN.conc_gtoempr, CN.conc_base
    FROM empleado_conceptos CE, CONCEPTOS_NOMINA CN WHERE ((CE.terc_nit = :nite) AND (CE.CONC_COD = CN.CONC_COD) AND (CN.conc_fecini <= :fec AND CN.conc_fecfin >= :FEC) ) OR ((CE.terc_nit = :nite)
    AND (CE.CONC_COD = CN.CONC_COD) AND (cn.conc_todosper = 'N') AND (CE.emco_ppago = :periodo)) OR  ((CE.terc_nit = :nite) AND (CE.CONC_COD = CN.CONC_COD) AND cn.conc_todosper = 'S')  ORDER BY (TERC_NIT )
    INTO :nit_tercero, :concept,  :montos, :porcen, :entidad, :numeroprom, :liquidaper ,:CONC_COD, :CONC_DEDUC, :CONC_PORC,
    :CONC_ENTIDAD, :CONC_MONTO, :CONC_DIAS, :CONC_MODIFI,:CONC_PROMEDIO, :salario,:EMCO_PERPROM, :conc_prov, :conc_aporte , :CONC_APLICAPROM, :conc_otroconc, :conc_codotroconc, :gtoempr, :base
    DO
BEGIN
    IF (conc_dias = 'S') THEN
    EXECUTE PROCEDURE DIAS_LABORADOS (:nite, :periodo) RETURNING_VALUES (:diaslab);
    ELSE
    BEGIN
    IF (liquidaper = 0) THEN
    diaslab = 15;
    ELSE
    IF (liquidaper = 1) THEN
    diaslab = 30;
    ELSE
    IF (liquidaper = 2) THEN
    diaslab = 60;
    END
 SELECT ((n.nono_valor /30) * n.nono_dura), (n.nono_dura) FROM nomina_novedades n WHERE n.tnov_cod = 11 AND n.terc_nit = :nite AND n.nono_periodo = :periodo INTO :cambsaltrans, :duranov;
 IF (cambsaltrans IS NULL) THEN
 cambsaltrans = 0;
 IF (duranov IS NULL) THEN
 duranov = 0;
 diaslab = :diaslab - :duranov;
 IF (conc_cod = 920) THEN
 BEGIN
 SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :valor;
 IF (valor IS NULL) THEN
 valor = 0;
 item = :item + 1;
 END
 ELSE
 IF (conc_cod = 921) THEN
 BEGIN
 IF (porcen IS NOT NULL AND porcen <> 0) THEN
 valor = ((basico / 30)* :diaslab ) * :PORCEN /100;
 ELSE
 IF (conc_porc IS NOT NULL AND conc_porc <> 0) THEN
 valor = ((:basico / 30)* :diaslab ) * :conc_porc /100;
 EXECUTE PROCEDURE REDONDEE(:valor, 5) RETURNING_VALUES (VALOR);
 END
 ELSE
 IF (conc_cod = 922) THEN
 BEGIN
 SELECT P.prcu_monto FROM prestamo_cuotas P, prestamo_nomina PN WHERE P.prcu_ano = :ano AND P.prcu_periodo = :periodo AND PN.prno_id = P.prno_id AND PN.terc_nit = :nite INTO :valor;
 IF (valor IS NULL) THEN
 valor = 0;
 EXECUTE PROCEDURE REDONDEE(:valor, 5) RETURNING_VALUES (VALOR);
 item = :item + 1;
 UPDATE prestamo_cuotas  P SET prcu_ok = 'S' WHERE P.prcu_ano = :ano AND P.prcu_periodo = :periodo AND P.prno_id = (SELECT PN.prno_id FROM PRESTAMO_NOMINA PN WHERE PN.terc_nit = :nite);
 END
 ELSE
 BEGIN
    IF ((:montos = 0) OR (:montos IS NULL)) THEN
      BEGIN
      IF ((CONC_PORC = 0 AND :porcen = 0) OR (CONC_PORC IS NULL AND :porcen = 0) OR (CONC_PORC = 0 AND :porcen IS NULL) OR (CONC_PORC IS NULL AND :porcen IS NULL) ) THEN
        BEGIN
        IF ((conc_monto <> 0) AND (conc_monto IS NOT NULL) ) THEN
        BEGIN
        VALOR = :CONC_MONTO/30 * :diaslab;
        EXECUTE PROCEDURE REDONDEE(:valor, 5) RETURNING_VALUES (VALOR);
        END
        ELSE
        IF (salario = 'S' AND CONC_COD <> 900) THEN
        BEGIN
        conc_monto = :basico;
        VALOR = (:conc_monto/30 * :diaslab ) + :cambsaltrans;
        EXECUTE PROCEDURE REDONDEE(:valor, 5) RETURNING_VALUES (VALOR);
        END
        ELSE
        valor = montos;
        END
       ELSE
       BEGIN
        IF (:porcen <> 0) THEN
          BEGIN
            IF ((conc_monto <> 0) AND (conc_monto IS NOT NULL) ) THEN
            BEGIN
              VALOR = ((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans * :PORCEN) /100;
              EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
            END
          END
          ELSE
          BEGIN
            IF ((conc_monto <> 0) AND (conc_monto IS NOT NULL) ) THEN
            BEGIN
              VALOR = ((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans * :conc_porc) /100;
              EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
            END
            ELSE
        IF (salario = 'S' AND CONC_COD <> 900 AND CONC_COD <> 920) THEN
            BEGIN
              conc_monto = :basico;
              VALOR = ((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans * :conc_porc) /100;
              EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
            END
          END
       END
      END
    ELSE
    BEGIN
      IF (CONC_PORC = 0 AND :porcen = 0) THEN
      BEGIN
      VALOR = (:montos/30 * :diaslab);
      EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
      END
      ELSE
      BEGIN
        IF (:porcen <> 0) THEN
          BEGIN
          VALOR = ((:MONTOS/30 * :diaslab )+ :cambsaltrans * :PORCEN) /100;
          EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
          END
          ELSE
          BEGIN
          VALOR = ((:montos/30 * :diaslab )+ :cambsaltrans * :CONC_PORC) /100;
          END
          EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
       END
   END
    IF (conc_promedio = 'S') THEN
    BEGIN
    perinicial = :periodo - (:numeroprom) + 1;
    anoprom = CAST (ano AS INTEGER);
    IF (perinicial <= 0) THEN
    BEGIN
    perinicial = 24 + :PERINICIAL;
    anoprom = CAST(ANO AS INTEGER) - 1;
    END
    SELECT SUM (noco_valor) FROM nomina_conceptos n WHERE n.noco_aplicaprom = 'S' AND N.noco_periodo >= :perinicial - 1 AND N.noco_periodo < :periodo AND N.noco_ano >= :anoprom AND N.noco_ano <= :ano AND terc_nit = :nite INTO :valor;
    valor = (valor / numeroprom)/*/ 30 * :diaslab*/;
    SELECT NOCO_VALOR FROM NOMINA_CONCEPTOS WHERE CONC_COD = :conc_cod AND TERC_NIT  = :nite AND NOCO_PAGOOK = 'N' AND NOCO_PERIODO = 0 INTO :saldosini;
    IF (saldosini IS NULL) THEN
    saldosini = 0;
    ELSE
    UPDATE nomina_conceptos N SET noco_pagook = 'S' WHERE n.noco_aplicaprom = 'S' AND N.noco_periodo >= :perinicial - 1 AND N.noco_periodo < :periodo AND N.noco_ano >= :anoprom AND N.noco_ano <= :ano  AND CONC_COD = :conc_cod AND terc_nit = :nite AND NOCO_PERIODO = 0;
    VALOR = :valor + :saldosini;
    EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
    UPDATE nomina_conceptos N SET noco_pagook = 'S' WHERE n.noco_aplicaprom = 'S' AND N.noco_periodo >= :perinicial - 1 AND N.noco_periodo < :periodo AND N.noco_ano >= :anoprom AND N.noco_ano <= :ano  AND CONC_COD = :conc_cod AND terc_nit = :nite;
    END
    IF (conc_otroconc = 'S') THEN
    BEGIN
    anosum = CAST(ano AS INTEGER);
    anosum = anosum - 1;
    SELECT SUM (noco_valor) FROM nomina_conceptos n WHERE n.noco_ano = :anosum AND n.conc_cod = :conc_codotroconc AND N.terc_nit = :nite INTO :valor;
    SELECT NOCO_VALOR FROM NOMINA_CONCEPTOS WHERE noco_ano = :anosum AND conc_cod = :conc_codotroconc AND terc_nit = :nite AND NOCO_PERIODO = 0 INTO :saldosini;
    IF (saldosini IS NULL) THEN
    saldosini = 0;
    ELSE
    UPDATE nomina_conceptos SET noco_pagook = 'S' WHERE noco_ano = :anosum AND conc_cod = :conc_codotroconc AND NOCO_PERIODO = 0 AND terc_nit = :nite;
    VALOR = :valor + :saldosini;
    UPDATE nomina_conceptos SET noco_pagook = 'S' WHERE noco_ano = :anosum AND conc_cod = :conc_codotroconc AND terc_nit = :nite;
    END
/*SI EL CONCEPTO ES UN APORTE*/
IF (conc_aporte = 'S') THEN
BEGIN
    IF ((:entidad = '' ) OR (entidad IS NULL)) THEN
    BEGIN
     SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
     IF (comision IS NULL) THEN
     comision = 0;
     valor = :basico + :comision;
    IF ((conc_cod = 904) OR (conc_cod = 905) OR (conc_cod = 906)) THEN
            BEGIN
            entidad = :nitafp;
                IF (conc_cod = 904) THEN
                BEGIN
                SELECT A.paan_afptr FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = (((((:basico /30) * :diaslab ) + :comision)+ :cambsaltrans) * :PORCEN) /100;
                END
                ELSE
                IF ((conc_cod = 905) OR (conc_cod = 906)) THEN
                BEGIN
                SELECT A.paan_afpem FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = (((((:basico /30) * :diaslab ) + :comision)+ :cambsaltrans) * :PORCEN) /100;
                END
                EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
            END
            ELSE
       IF ((conc_cod = 907) OR (conc_cod = 914) OR (conc_cod = 915)) THEN
            BEGIN
            entidad = :niteps;
                IF (conc_cod = 907) THEN
                BEGIN
                SELECT A.paan_epstr FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = (((((:basico )/30 * :diaslab ) + :comision)+ :cambsaltrans) * :PORCEN) /100;
                END
                ELSE
                IF ((conc_cod = 914) OR (conc_cod = 915)) THEN
                BEGIN
                SELECT A.paan_epsem FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = (((((:basico )/30 * :diaslab ) + :comision)+ :cambsaltrans) * :PORCEN) /100;
                END
                EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
            END
            ELSE
       IF ((conc_cod = 910) OR (conc_cod = 911) OR (conc_cod = 916) OR (conc_cod = 917) OR (conc_cod = 918) OR (conc_cod = 919)) THEN
            BEGIN
            entidad = :nitccf;
            SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
            IF (comision IS NULL) THEN
            comision = 0;
                IF ((conc_cod = 910) OR (conc_cod = 911) ) THEN
                BEGIN
                SELECT A.paan_ccf FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = (((((:basico )/30 * :diaslab ) + :comision)+ :cambsaltrans) * :PORCEN) /100;
                EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
                END
                ELSE
                IF ((conc_cod = 916) OR (conc_cod = 917)) THEN
                BEGIN
                SELECT A.paan_icbf FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = (((((:basico )/30 * :diaslab ) + :comision)+ :cambsaltrans) * :PORCEN) /100;
                EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
                END
                ELSE
                IF ((conc_cod = 918) OR (conc_cod = 919)) THEN
                BEGIN
                SELECT A.paan_sena FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = (((((:basico )/30 * :diaslab ) + :comision)+ :cambsaltrans) * :PORCEN) /100;
                EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
                END
            END
            ELSE
        IF ((conc_cod = 912) OR (conc_cod = 913)) THEN
            BEGIN
            entidad = :nitafc;
            SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
            IF (comision IS NULL) THEN
            comision = 0;
                IF ((conc_cod = 912) OR (conc_cod = 913) ) THEN
                BEGIN
                SELECT A.paan_cesemp FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = ((((:basico + :comision)/30 * :diaslab )+ :cambsaltrans) * :PORCEN) /100;
                EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
                END
            END
            ELSE
        BEGIN
        IF (comision IS NULL) THEN
        comision = 0;
        SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
        conc_monto = :basico + :comision;
        IF (conc_porc <> 0 AND conc_porc IS NOT NULL) THEN
        VALOR = (((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans) * :conc_porc) /100;
        ELSE
        IF (:porcen <> 0 AND :porcen IS NOT NULL) THEN
        VALOR = (((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans) * :porcen) /100;
        ELSE
        IF (:montos <> 0 AND :montos IS NOT NULL) THEN
        valor = :montos;
        ELSE
        IF (:conc_monto <> 0 AND :conc_monto IS NOT NULL) THEN
        valor = :conc_monto;
        EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
        END
    END
    END
    ELSE
    IF (conc_prov = 'S') THEN
    BEGIN
        conc_monto = :basico;
        IF (conc_porc <> 0 AND conc_porc IS NOT NULL) THEN
        VALOR = (((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans) * :conc_porc) /100;
        ELSE
        IF (porcen <> 0 AND porcen IS NOT NULL) THEN
        VALOR = (((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans) * :porcen) /100;
        ELSE
        IF (montos <> 0 AND montos IS NOT NULL) THEN
        VALOR = :montos;
        ELSE
        IF (conc_monto <> 0 AND conc_monto IS NOT NULL) THEN
        VALOR = :conc_monto;
        EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
    END
item = :item + 1;
END
    IF (liquidaper = 0) THEN
    INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
    VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
    ELSE
    IF (liquidaper = 1) THEN
    BEGIN
    rmod = mod(:periodo, 2);
    IF (rmod = 0) THEN
        INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
        VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
    END
    ELSE
    IF (liquidaper = 2) THEN
    BEGIN
    rmod = mod(:periodo, 4);
    IF (rmod = 0) THEN
        INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
        VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
    END
END
END
END
END
ELSE
/*SI ES MENSUAL*/
IF (periodicidad = 1) THEN
BEGIN
EXECUTE PROCEDURE cambie_id_nomina RETURNING_VALUES(:idnomina);
INSERT INTO nomina (nomi_id, NOMI_FECCAUSA, NOMI_PAGOGLOBAL, NOMI_PERIODOCIDAD, NOMI_PERIODO, NOMI_ANO, NOMI_LIQOK)
VALUES (:IDNOMINA, :fec,:pagoglobal, :periodicidad, :periodo, :ano, 'N');
    BEGIN
    item = 1;
    FOR SELECT E.TERC_NIT, E.empl_salario, e.empl_eps, e.empl_afc, e.empl_afp, e.empl_ccf
    FROM EMPLEADOS E
    WHERE E.empl_ppago = 1
    INTO :nite, :basico, :niteps, :nitafc, :nitafp, :nitccf
    DO
    FOR SELECT CE.TERC_NIT, CE.CONC_COD, CE.EMCO_MONTO, CE.EMCO_PORC, ce.empl_entidad, CE.emco_perprom, CE.emco_luquidaper,    CN.CONC_COD, CN.CONC_DEDUC,CN.CONC_PORC, CN.CONC_ENTIDAD, CN.CONC_MONTO,  CN.CONC_DIAS, CN.CONC_MODIFI,
    CN.CONC_PROMEDIO, CN.conc_salario, CE.emco_perprom, CN.conc_prov, CN.conc_aporte, CN.conc_aplicaprom, cn.conc_otroconc, cn.conc_codotroconc, CN.conc_gtoempr
    FROM empleado_conceptos CE, CONCEPTOS_NOMINA CN WHERE ((CE.terc_nit = :nite) AND (CE.CONC_COD = CN.CONC_COD) AND (CN.conc_fecini <= :fec AND CN.conc_fecfin >= :FEC) ) OR ((CE.terc_nit = :nite)
    AND (CE.CONC_COD = CN.CONC_COD) AND (cn.conc_todosper = 'N') AND (CE.emco_ppago = :periodo)) OR  ((CE.terc_nit = :nite) AND (CE.CONC_COD = CN.CONC_COD) AND cn.conc_todosper = 'S')  ORDER BY (TERC_NIT)
    INTO :nit_tercero, :concept,  :montos, :porcen, :entidad, :numeroprom, :liquidaper ,:CONC_COD, :CONC_DEDUC, :CONC_PORC,
    :CONC_ENTIDAD, :CONC_MONTO, :CONC_DIAS, :CONC_MODIFI,:CONC_PROMEDIO, :salario,:EMCO_PERPROM, :conc_prov, :conc_aporte , :CONC_APLICAPROM, :conc_otroconc, :conc_codotroconc, :gtoempr    DO
BEGIN
    IF (conc_dias = 'S') THEN
    EXECUTE PROCEDURE DIAS_LABORADOS (:nite, :periodo) RETURNING_VALUES (:diaslab);
    ELSE
    diaslab = 30;
 SELECT ((n.nono_valor /30) * n.nono_dura) FROM nomina_novedades n WHERE n.tnov_cod = 11 AND n.terc_nit = :nite AND n.nono_periodo = :periodo INTO :cambsaltrans;
 IF (cambsaltrans IS NULL) THEN
 cambsaltrans = 0;
/* basico = :basico + :cambsaltrans;*/
 IF (conc_cod = 920) THEN
 BEGIN
 SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :valor;
 IF (valor IS NULL) THEN
 valor = 0;
 item = :item + 1;
 END
 ELSE
 IF (conc_cod = 921) THEN
 BEGIN
 IF (porcen IS NOT NULL AND porcen <> 0) THEN
 valor = ((basico / 30)* :diaslab ) * :PORCEN /100;
 ELSE
 IF (conc_porc IS NOT NULL AND conc_porc <> 0) THEN
 valor = ((:basico / 30)* :diaslab ) * :conc_porc /100;
 EXECUTE PROCEDURE REDONDEE(:valor, 5) RETURNING_VALUES (VALOR);
 END
 ELSE
 BEGIN
    IF ((:montos = 0) OR (:montos IS NULL)) THEN
      BEGIN
      IF ((CONC_PORC = 0 AND :porcen = 0) OR (CONC_PORC IS NULL AND :porcen = 0) OR (CONC_PORC = 0 AND :porcen IS NULL) OR (CONC_PORC IS NULL AND :porcen IS NULL) ) THEN
        BEGIN
        IF ((conc_monto <> 0) AND (conc_monto IS NOT NULL) ) THEN
        BEGIN
        VALOR = :CONC_MONTO/30 * :diaslab;
        EXECUTE PROCEDURE REDONDEE(:valor, 5) RETURNING_VALUES (VALOR);
        END
        ELSE
        IF (salario = 'S' AND CONC_COD <> 900) THEN
        BEGIN
        conc_monto = :basico;
        VALOR = (:conc_monto/30 * :diaslab ) + :cambsaltrans;
        EXECUTE PROCEDURE REDONDEE(:valor, 5) RETURNING_VALUES (VALOR);
        END
        ELSE
        valor = montos;
        END
       ELSE
       BEGIN
        IF (:porcen <> 0) THEN
          BEGIN
            IF ((conc_monto <> 0) AND (conc_monto IS NOT NULL) ) THEN
            BEGIN
              VALOR = ((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans * :PORCEN) /100;
              EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
            END
          END
          ELSE
          BEGIN
            IF ((conc_monto <> 0) AND (conc_monto IS NOT NULL) ) THEN
            BEGIN
              VALOR = ((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans * :conc_porc) /100;
              EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
            END
            ELSE
        IF (salario = 'S' AND CONC_COD <> 900 AND CONC_COD <> 920) THEN
            BEGIN
              conc_monto = :basico;
              VALOR = ((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans * :conc_porc) /100;
              EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
            END
          END
       END
      END
    ELSE
    BEGIN
      IF (CONC_PORC = 0 AND :porcen = 0) THEN
      BEGIN
      VALOR = (:montos/30 * :diaslab);
      EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
      END
      ELSE
      BEGIN
        IF (:porcen <> 0) THEN
          BEGIN
          VALOR = ((:MONTOS/30 * :diaslab )+ :cambsaltrans * :PORCEN) /100;
          EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
          END
          ELSE
          BEGIN
          VALOR = ((:montos/30 * :diaslab )+ :cambsaltrans * :CONC_PORC) /100;
          END
          EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
       END
   END
    IF (conc_promedio = 'S') THEN
    BEGIN
    perinicial = :periodo - (:numeroprom) + 1;
    anoprom = CAST (ano AS INTEGER);
    IF (perinicial <= 0) THEN
    BEGIN
    perinicial = 24 + :PERINICIAL;
    anoprom = CAST(ANO AS INTEGER) - 1;
    END
    SELECT SUM (noco_valor) FROM nomina_conceptos n WHERE n.noco_aplicaprom = 'S' AND N.noco_periodo >= :perinicial - 1 AND N.noco_periodo < :periodo AND N.noco_ano >= :anoprom AND N.noco_ano <= :ano AND terc_nit = :nite INTO :valor;
    valor = (valor / numeroprom)/*/ 30 * :diaslab*/;
    SELECT NOCO_VALOR FROM NOMINA_CONCEPTOS WHERE CONC_COD = :conc_cod AND TERC_NIT  = :nite AND NOCO_PAGOOK = 'N' AND NOCO_PERIODO = 0 INTO :saldosini;
    IF (saldosini IS NULL) THEN
    saldosini = 0;
    ELSE
    UPDATE nomina_conceptos N SET noco_pagook = 'S' WHERE n.noco_aplicaprom = 'S' AND N.noco_periodo >= :perinicial - 1 AND N.noco_periodo < :periodo AND N.noco_ano >= :anoprom AND N.noco_ano <= :ano  AND CONC_COD = :conc_cod AND terc_nit = :nite AND NOCO_PERIODO = 0;
    VALOR = :valor + :saldosini;
    EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
    UPDATE nomina_conceptos N SET noco_pagook = 'S' WHERE n.noco_aplicaprom = 'S' AND N.noco_periodo >= :perinicial - 1 AND N.noco_periodo < :periodo AND N.noco_ano >= :anoprom AND N.noco_ano <= :ano  AND CONC_COD = :conc_cod AND terc_nit = :nite;
    END
    IF (conc_otroconc = 'S') THEN
    BEGIN
    anosum = CAST(ano AS INTEGER);
    anosum = anosum - 1;
    SELECT SUM (noco_valor) FROM nomina_conceptos n WHERE n.noco_ano = :anosum AND n.conc_cod = :conc_codotroconc AND N.terc_nit = :nite INTO :valor;
    SELECT NOCO_VALOR FROM NOMINA_CONCEPTOS WHERE noco_ano = :anosum AND conc_cod = :conc_codotroconc AND terc_nit = :nite AND NOCO_PERIODO = 0 INTO :saldosini;
    IF (saldosini IS NULL) THEN
    saldosini = 0;
    ELSE
    UPDATE nomina_conceptos SET noco_pagook = 'S' WHERE noco_ano = :anosum AND conc_cod = :conc_codotroconc AND NOCO_PERIODO = 0 AND terc_nit = :nite;
    VALOR = :valor + :saldosini;
    UPDATE nomina_conceptos SET noco_pagook = 'S' WHERE noco_ano = :anosum AND conc_cod = :conc_codotroconc AND terc_nit = :nite;
    END
/*SI EL CONCEPTO ES UN APORTE*/
IF (conc_aporte = 'S') THEN
BEGIN
    IF ((:entidad = '' ) OR (entidad IS NULL)) THEN
    BEGIN
     SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
     IF (comision IS NULL) THEN
     comision = 0;
     valor = :basico + :comision;
    IF ((conc_cod = 904) OR (conc_cod = 905) OR (conc_cod = 906)) THEN
            BEGIN
            entidad = :nitafp;
                IF (conc_cod = 904) THEN
                BEGIN
                SELECT A.paan_afptr FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = (((((:basico /30) * :diaslab ) + :comision)+ :cambsaltrans) * :PORCEN) /100;
                END
                ELSE
                IF ((conc_cod = 905) OR (conc_cod = 906)) THEN
                BEGIN
                SELECT A.paan_afpem FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = (((((:basico /30) * :diaslab ) + :comision)+ :cambsaltrans) * :PORCEN) /100;
                END
                EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
            END
            ELSE
       IF ((conc_cod = 907) OR (conc_cod = 914) OR (conc_cod = 915)) THEN
            BEGIN
            entidad = :niteps;
                IF (conc_cod = 907) THEN
                BEGIN
                SELECT A.paan_epstr FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = (((((:basico )/30 * :diaslab ) + :comision)+ :cambsaltrans) * :PORCEN) /100;
                END
                ELSE
                IF ((conc_cod = 914) OR (conc_cod = 915)) THEN
                BEGIN
                SELECT A.paan_epsem FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = (((((:basico )/30 * :diaslab ) + :comision)+ :cambsaltrans) * :PORCEN) /100;
                END
                EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
            END
            ELSE
       IF ((conc_cod = 910) OR (conc_cod = 911) OR (conc_cod = 916) OR (conc_cod = 917) OR (conc_cod = 918) OR (conc_cod = 919)) THEN
            BEGIN
            entidad = :nitccf;
            SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
            IF (comision IS NULL) THEN
            comision = 0;
                IF ((conc_cod = 910) OR (conc_cod = 911) ) THEN
                BEGIN
                SELECT A.paan_ccf FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = (((((:basico )/30 * :diaslab ) + :comision)+ :cambsaltrans) * :PORCEN) /100;
                EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
                END
                ELSE
                IF ((conc_cod = 916) OR (conc_cod = 917)) THEN
                BEGIN
                SELECT A.paan_icbf FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = (((((:basico )/30 * :diaslab ) + :comision)+ :cambsaltrans) * :PORCEN) /100;
                EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
                END
                ELSE
                IF ((conc_cod = 918) OR (conc_cod = 919)) THEN
                BEGIN
                SELECT A.paan_sena FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = (((((:basico )/30 * :diaslab ) + :comision)+ :cambsaltrans) * :PORCEN) /100;
                EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
                END
            END
            ELSE
        IF ((conc_cod = 912) OR (conc_cod = 913)) THEN
            BEGIN
            entidad = :nitafc;
            SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
            IF (comision IS NULL) THEN
            comision = 0;
                IF ((conc_cod = 912) OR (conc_cod = 913) ) THEN
                BEGIN
                SELECT A.paan_cesemp FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = ((((:basico + :comision)/30 * :diaslab )+ :cambsaltrans) * :PORCEN) /100;
                EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
                END
            END
            ELSE
        BEGIN
        IF (comision IS NULL) THEN
        comision = 0;
        SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
        conc_monto = :basico + :comision;
        IF (conc_porc <> 0 AND conc_porc IS NOT NULL) THEN
        VALOR = (((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans) * :conc_porc) /100;
        ELSE
        IF (:porcen <> 0 AND :porcen IS NOT NULL) THEN
        VALOR = (((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans) * :porcen) /100;
        ELSE
        IF (:montos <> 0 AND :montos IS NOT NULL) THEN
        valor = :montos;
        ELSE
        IF (:conc_monto <> 0 AND :conc_monto IS NOT NULL) THEN
        valor = :conc_monto;
        EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
        END
    END
    END
    ELSE
    IF (conc_prov = 'S') THEN
    BEGIN
        conc_monto = :basico;
        IF (conc_porc <> 0 AND conc_porc IS NOT NULL) THEN
        VALOR = (((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans) * :conc_porc) /100;
        ELSE
        IF (porcen <> 0 AND porcen IS NOT NULL) THEN
        VALOR = (((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans) * :porcen) /100;
        ELSE
        IF (montos <> 0 AND montos IS NOT NULL) THEN
        VALOR = :montos;
        ELSE
        IF (conc_monto <> 0 AND conc_monto IS NOT NULL) THEN
        VALOR = :conc_monto;
        EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
    END
item = :item + 1;
END
    IF (liquidaper = 0) THEN
    INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
    VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
    ELSE
    IF (liquidaper = 1) THEN
    BEGIN
    rmod = mod(:periodo, 2);
    IF (rmod = 0) THEN
        INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
        VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
    END
    ELSE
    IF (liquidaper = 2) THEN
    BEGIN
    rmod = mod(:periodo, 4);
    IF (rmod = 0) THEN
        INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
        VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
    END
END
END
END
ELSE
/*SI ES SEMANAL*/
IF (periodicidad = 3) THEN
BEGIN
EXECUTE PROCEDURE cambie_id_nomina RETURNING_VALUES(:idnomina);
INSERT INTO nomina (nomi_id, NOMI_FECCAUSA, NOMI_PAGOGLOBAL, NOMI_PERIODOCIDAD, NOMI_PERIODO, NOMI_ANO, NOMI_LIQOK)
VALUES (:IDNOMINA, :fec,:pagoglobal, :periodicidad, :periodo, :ano, 'N');
    BEGIN
    item = 1;
    FOR SELECT E.TERC_NIT, E.empl_salario, e.empl_eps, e.empl_afc, e.empl_afp, e.empl_ccf
    FROM EMPLEADOS E
    WHERE E.empl_ppago = 3
    INTO :nite, :basico, :niteps, :nitafc, :nitafp, :nitccf
    DO
    BEGIN
    FOR SELECT CE.TERC_NIT, CE.CONC_COD, CE.EMCO_MONTO, CE.EMCO_PORC, ce.empl_entidad, CE.emco_perprom, CE.emco_luquidaper,    CN.CONC_COD, CN.CONC_DEDUC,CN.CONC_PORC, CN.CONC_ENTIDAD, CN.CONC_MONTO,  CN.CONC_DIAS, CN.CONC_MODIFI,
    CN.CONC_PROMEDIO, CN.conc_salario, CE.emco_perprom, CN.conc_prov, CN.conc_aporte, CN.conc_aplicaprom, cn.conc_otroconc, cn.conc_codotroconc, CN.conc_gtoempr
    FROM empleado_conceptos CE, CONCEPTOS_NOMINA CN WHERE ((CE.terc_nit = :nite) AND (CE.CONC_COD = CN.CONC_COD) AND (CN.conc_fecini <= :fec AND CN.conc_fecfin >= :FEC) ) OR ((CE.terc_nit = :nite)
    AND (CE.CONC_COD = CN.CONC_COD) AND (cn.conc_todosper = 'N') AND (CE.emco_ppago = :periodo)) OR  ((CE.terc_nit = :nite) AND (CE.CONC_COD = CN.CONC_COD) AND cn.conc_todosper = 'S')  ORDER BY (TERC_NIT)
    INTO :nit_tercero, :concept,  :montos, :porcen, :entidad, :numeroprom, :liquidaper ,:CONC_COD, :CONC_DEDUC, :CONC_PORC,
    :CONC_ENTIDAD, :CONC_MONTO, :CONC_DIAS, :CONC_MODIFI,:CONC_PROMEDIO, :salario,:EMCO_PERPROM, :conc_prov, :conc_aporte , :CONC_APLICAPROM, :conc_otroconc, :conc_codotroconc, :gtoempr
    DO
BEGIN
    IF (conc_dias = 'S') THEN
    EXECUTE PROCEDURE DIAS_LABORADOS (:nite, :periodo) RETURNING_VALUES (:diaslab);
    ELSE
    BEGIN
    IF (liquidaper = 0) THEN
    diaslab = 7;
    ELSE
    IF (liquidaper = 1) THEN
    diaslab = 15;
    ELSE
    IF (liquidaper = 2) THEN
    diaslab = 30;
    END
 SELECT ((n.nono_valor /30) * n.nono_dura) FROM nomina_novedades n WHERE n.tnov_cod = 11 AND n.terc_nit = :nite AND n.nono_periodo = :periodo INTO :cambsaltrans;
 IF (cambsaltrans IS NULL) THEN
 cambsaltrans = 0;
/* basico = :basico + :cambsaltrans;*/
 IF (conc_cod = 920) THEN
 BEGIN
 SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :valor;
 IF (valor IS NULL) THEN
 valor = 0;
 item = :item + 1;
 END
 ELSE
 IF (conc_cod = 921) THEN
 BEGIN
 IF (porcen IS NOT NULL AND porcen <> 0) THEN
 valor = ((basico / 30)* :diaslab ) * :PORCEN /100;
 ELSE
 IF (conc_porc IS NOT NULL AND conc_porc <> 0) THEN
 valor = ((:basico / 30)* :diaslab ) * :conc_porc /100;
 EXECUTE PROCEDURE REDONDEE(:valor, 5) RETURNING_VALUES (VALOR);
 END
 ELSE
 BEGIN
    IF ((:montos = 0) OR (:montos IS NULL)) THEN
      BEGIN
      IF ((CONC_PORC = 0 AND :porcen = 0) OR (CONC_PORC IS NULL AND :porcen = 0) OR (CONC_PORC = 0 AND :porcen IS NULL) OR (CONC_PORC IS NULL AND :porcen IS NULL) ) THEN
        BEGIN
        IF ((conc_monto <> 0) AND (conc_monto IS NOT NULL) ) THEN
        BEGIN
        VALOR = :CONC_MONTO/30 * :diaslab;
        EXECUTE PROCEDURE REDONDEE(:valor, 5) RETURNING_VALUES (VALOR);
        END
        ELSE
        IF (salario = 'S' AND CONC_COD <> 900) THEN
        BEGIN
        conc_monto = :basico;
        VALOR = (:conc_monto/30 * :diaslab ) + :cambsaltrans;
        EXECUTE PROCEDURE REDONDEE(:valor, 5) RETURNING_VALUES (VALOR);
        END
        ELSE
        valor = montos;
        END
       ELSE
       BEGIN
        IF (:porcen <> 0) THEN
          BEGIN
            IF ((conc_monto <> 0) AND (conc_monto IS NOT NULL) ) THEN
            BEGIN
              VALOR = ((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans * :PORCEN) /100;
              EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
            END
          END
          ELSE
          BEGIN
            IF ((conc_monto <> 0) AND (conc_monto IS NOT NULL) ) THEN
            BEGIN
              VALOR = ((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans * :conc_porc) /100;
              EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
            END
            ELSE
        IF (salario = 'S' AND CONC_COD <> 900 AND CONC_COD <> 920) THEN
            BEGIN
              conc_monto = :basico;
              VALOR = ((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans * :conc_porc) /100;
              EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
            END
          END
       END
      END
    ELSE
    BEGIN
      IF (CONC_PORC = 0 AND :porcen = 0) THEN
      BEGIN
      VALOR = (:montos/30 * :diaslab);
      EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
      END
      ELSE
      BEGIN
        IF (:porcen <> 0) THEN
          BEGIN
          VALOR = ((:MONTOS/30 * :diaslab )+ :cambsaltrans * :PORCEN) /100;
          EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
          END
          ELSE
          BEGIN
          VALOR = ((:montos/30 * :diaslab )+ :cambsaltrans * :CONC_PORC) /100;
          END
          EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
       END
   END
    IF (conc_promedio = 'S') THEN
    BEGIN
    perinicial = :periodo - (:numeroprom) + 1;
    anoprom = CAST (ano AS INTEGER);
    IF (perinicial <= 0) THEN
    BEGIN
    perinicial = 24 + :PERINICIAL;
    anoprom = CAST(ANO AS INTEGER) - 1;
    END
    SELECT SUM (noco_valor) FROM nomina_conceptos n WHERE n.noco_aplicaprom = 'S' AND N.noco_periodo >= :perinicial - 1 AND N.noco_periodo < :periodo AND N.noco_ano >= :anoprom AND N.noco_ano <= :ano AND terc_nit = :nite INTO :valor;
    valor = (valor / numeroprom)/*/ 30 * :diaslab*/;
    SELECT NOCO_VALOR FROM NOMINA_CONCEPTOS WHERE CONC_COD = :conc_cod AND TERC_NIT  = :nite AND NOCO_PAGOOK = 'N' AND NOCO_PERIODO = 0 INTO :saldosini;
    IF (saldosini IS NULL) THEN
    saldosini = 0;
    ELSE
    UPDATE nomina_conceptos N SET noco_pagook = 'S' WHERE n.noco_aplicaprom = 'S' AND N.noco_periodo >= :perinicial - 1 AND N.noco_periodo < :periodo AND N.noco_ano >= :anoprom AND N.noco_ano <= :ano  AND CONC_COD = :conc_cod AND terc_nit = :nite AND NOCO_PERIODO = 0;
    VALOR = :valor + :saldosini;
    EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
    UPDATE nomina_conceptos N SET noco_pagook = 'S' WHERE n.noco_aplicaprom = 'S' AND N.noco_periodo >= :perinicial - 1 AND N.noco_periodo < :periodo AND N.noco_ano >= :anoprom AND N.noco_ano <= :ano  AND CONC_COD = :conc_cod AND terc_nit = :nite;
    END
    IF (conc_otroconc = 'S') THEN
    BEGIN
    anosum = CAST(ano AS INTEGER);
    anosum = anosum - 1;
    SELECT SUM (noco_valor) FROM nomina_conceptos n WHERE n.noco_ano = :anosum AND n.conc_cod = :conc_codotroconc AND N.terc_nit = :nite INTO :valor;
    SELECT NOCO_VALOR FROM NOMINA_CONCEPTOS WHERE noco_ano = :anosum AND conc_cod = :conc_codotroconc AND terc_nit = :nite AND NOCO_PERIODO = 0 INTO :saldosini;
    IF (saldosini IS NULL) THEN
    saldosini = 0;
    ELSE
    UPDATE nomina_conceptos SET noco_pagook = 'S' WHERE noco_ano = :anosum AND conc_cod = :conc_codotroconc AND NOCO_PERIODO = 0 AND terc_nit = :nite;
    VALOR = :valor + :saldosini;
    UPDATE nomina_conceptos SET noco_pagook = 'S' WHERE noco_ano = :anosum AND conc_cod = :conc_codotroconc AND terc_nit = :nite;
    END
/*SI EL CONCEPTO ES UN APORTE*/
IF (conc_aporte = 'S') THEN
BEGIN
    IF ((:entidad = '' ) OR (entidad IS NULL)) THEN
    BEGIN
     SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
     IF (comision IS NULL) THEN
     comision = 0;
     valor = :basico + :comision;
    IF ((conc_cod = 904) OR (conc_cod = 905) OR (conc_cod = 906)) THEN
            BEGIN
            entidad = :nitafp;
                IF (conc_cod = 904) THEN
                BEGIN
                SELECT A.paan_afptr FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = (((((:basico /30) * :diaslab ) + :comision)+ :cambsaltrans) * :PORCEN) /100;
                END
                ELSE
                IF ((conc_cod = 905) OR (conc_cod = 906)) THEN
                BEGIN
                SELECT A.paan_afpem FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = (((((:basico /30) * :diaslab ) + :comision)+ :cambsaltrans) * :PORCEN) /100;
                END
                EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
            END
            ELSE
       IF ((conc_cod = 907) OR (conc_cod = 914) OR (conc_cod = 915)) THEN
            BEGIN
            entidad = :niteps;
                IF (conc_cod = 907) THEN
                BEGIN
                SELECT A.paan_epstr FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = (((((:basico )/30 * :diaslab ) + :comision)+ :cambsaltrans) * :PORCEN) /100;
                END
                ELSE
                IF ((conc_cod = 914) OR (conc_cod = 915)) THEN
                BEGIN
                SELECT A.paan_epsem FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = (((((:basico )/30 * :diaslab ) + :comision)+ :cambsaltrans) * :PORCEN) /100;
                END
                EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
            END
            ELSE
       IF ((conc_cod = 910) OR (conc_cod = 911) OR (conc_cod = 916) OR (conc_cod = 917) OR (conc_cod = 918) OR (conc_cod = 919)) THEN
            BEGIN
            entidad = :nitccf;
            SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
            IF (comision IS NULL) THEN
            comision = 0;
                IF ((conc_cod = 910) OR (conc_cod = 911) ) THEN
                BEGIN
                SELECT A.paan_ccf FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = (((((:basico )/30 * :diaslab ) + :comision)+ :cambsaltrans) * :PORCEN) /100;
                EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
                END
                ELSE
                IF ((conc_cod = 916) OR (conc_cod = 917)) THEN
                BEGIN
                SELECT A.paan_icbf FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = (((((:basico )/30 * :diaslab ) + :comision)+ :cambsaltrans) * :PORCEN) /100;
                EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
                END
                ELSE
                IF ((conc_cod = 918) OR (conc_cod = 919)) THEN
                BEGIN
                SELECT A.paan_sena FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = (((((:basico )/30 * :diaslab ) + :comision)+ :cambsaltrans) * :PORCEN) /100;
                EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
                END
            END
            ELSE
        IF ((conc_cod = 912) OR (conc_cod = 913)) THEN
            BEGIN
            entidad = :nitafc;
            SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
            IF (comision IS NULL) THEN
            comision = 0;
                IF ((conc_cod = 912) OR (conc_cod = 913) ) THEN
                BEGIN
                SELECT A.paan_cesemp FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = ((((:basico + :comision)/30 * :diaslab )+ :cambsaltrans) * :PORCEN) /100;
                EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
                END
            END
            ELSE
        BEGIN
        IF (comision IS NULL) THEN
        comision = 0;
        SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
        conc_monto = :basico + :comision;
        IF (conc_porc <> 0 AND conc_porc IS NOT NULL) THEN
        VALOR = (((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans) * :conc_porc) /100;
        ELSE
        IF (:porcen <> 0 AND :porcen IS NOT NULL) THEN
        VALOR = (((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans) * :porcen) /100;
        ELSE
        IF (:montos <> 0 AND :montos IS NOT NULL) THEN
        valor = :montos;
        ELSE
        IF (:conc_monto <> 0 AND :conc_monto IS NOT NULL) THEN
        valor = :conc_monto;
        EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
        END
    END
    END
    ELSE
    IF (conc_prov = 'S') THEN
    BEGIN
        conc_monto = :basico;
        IF (conc_porc <> 0 AND conc_porc IS NOT NULL) THEN
        VALOR = (((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans) * :conc_porc) /100;
        ELSE
        IF (porcen <> 0 AND porcen IS NOT NULL) THEN
        VALOR = (((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans) * :porcen) /100;
        ELSE
        IF (montos <> 0 AND montos IS NOT NULL) THEN
        VALOR = :montos;
        ELSE
        IF (conc_monto <> 0 AND conc_monto IS NOT NULL) THEN
        VALOR = :conc_monto;
        EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
    END
item = :item + 1;
END
    IF (liquidaper = 0) THEN
    INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
    VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
    ELSE
    IF (liquidaper = 1) THEN
    BEGIN
    rmod = mod(:periodo, 2);
    IF (rmod = 0) THEN
        INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
        VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
    END
    ELSE
    IF (liquidaper = 2) THEN
    BEGIN
    rmod = mod(:periodo, 4);
    IF (rmod = 0) THEN
        INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
        VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
    END
END
END
END
END
SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE TRIGGER PRESTAMO_CUOTAS_BI FOR PRESTAMO_CUOTAS
ACTIVE BEFORE INSERT POSITION 0
AS
BEGIN
IF (NEW.prcu_ok IS NULL) THEN
NEW.prcu_ok = 'N';
END
^

SET TERM ; ^

GRANT UPDATE,REFERENCES ON PRESTAMO_CUOTAS TO TRIGGER PRESTAMO_CUOTAS_BI;

SET TERM ^ ;

CREATE OR ALTER PROCEDURE LIQUIDACION_EMPLEADO(
    NITEMPL VARCHAR(20),
    FECLIQ DATE,
    DIASLABORADOS INTEGER)
RETURNS(
    PRIMA NUMERIC(18,2),
    CESANTIA NUMERIC(18,2),
    INTCESANT NUMERIC(18,2),
    VACACION NUMERIC(18,2),
    SUELDO NUMERIC(18,2),
    AUXTRANSP NUMERIC(18,2),
    EPSEMPL NUMERIC(18,2),
    AFPEMPL NUMERIC(18,2),
    DSPRESTAMO NUMERIC(18,2),
    EMPREPS NUMERIC(18,2),
    EMPRAFP NUMERIC(18,2),
    EMPRARP NUMERIC(18,2),
    EMPRCCF NUMERIC(18,2),
    EMPRSENA NUMERIC(18,2),
    EMPRICBF NUMERIC(18,2))
AS
DECLARE VARIABLE fecultnomi DATE;
DECLARE VARIABLE perultnomi INTEGER;
DECLARE VARIABLE anoultnomi CHAR(4);
DECLARE VARIABLE salario NUMERIC(18,2);
DECLARE VARIABLE porcepsempl NUMERIC(9,4);
DECLARE VARIABLE porcafpempl NUMERIC(9,4);
DECLARE VARIABLE AUXT NUMERIC(18,2);
DECLARE VARIABLE PEMPREPS NUMERIC(9,4);
DECLARE VARIABLE PEMPRAFP NUMERIC(9,4);
DECLARE VARIABLE PEMPRARP NUMERIC(9,4);
DECLARE VARIABLE PEMPRCCF NUMERIC(9,4);
DECLARE VARIABLE PEMPRSENA NUMERIC(9,4);
DECLARE VARIABLE PEMPRICBF NUMERIC(9,4);
BEGIN
SELECT E.empl_salario FROM EMPLEADOS E WHERE TERC_NIT = :nitempl INTO :salario;
sueldo = (:salario / 30) * :diaslaborados;
EXECUTE PROCEDURE REDONDEE(:SUELDO, 5) RETURNING_VALUES (:sueldo);

SELECT SUM (NOCO_VALOR) FROM NOMINA_CONCEPTOS WHERE TERC_NIT = :nitempl AND (CONC_COD = 923 OR CONC_COD = 924 OR CONC_COD = 927 OR CONC_COD = 928) AND NOCO_PAGOOK = 'N' INTO :prima;
IF (prima IS NULL) THEN
prima = 0;
prima = :prima + ((:salario / 12)/ 30) * :diaslaborados;
EXECUTE PROCEDURE REDONDEE(:prima, 5) RETURNING_VALUES (:prima);

SELECT SUM (NOCO_VALOR) FROM NOMINA_CONCEPTOS WHERE TERC_NIT = :nitempl AND (CONC_COD = 912 OR CONC_COD = 913) AND NOCO_PAGOOK = 'N' INTO :cesantia;
IF (cesantia IS NULL) THEN
cesantia = 0;
cesantia = :cesantia + ((:salario / 12)/ 30) * :diaslaborados;
EXECUTE PROCEDURE REDONDEE(:cesantia, 5) RETURNING_VALUES (:cesantia);

SELECT SUM (NOCO_VALOR) FROM NOMINA_CONCEPTOS WHERE TERC_NIT = :nitempl AND (CONC_COD = 925 OR CONC_COD = 921) AND NOCO_PAGOOK = 'N' INTO :intcesant;
IF (intcesant IS NULL) THEN
intcesant = 0;
intcesant = (:intcesant + (((:salario / 12)/ 30) * :diaslaborados)/ 100) ;
EXECUTE PROCEDURE REDONDEE(:intcesant, 5) RETURNING_VALUES (:intcesant);

SELECT SUM (NOCO_VALOR) FROM NOMINA_CONCEPTOS WHERE TERC_NIT = :nitempl AND (CONC_COD = 926 OR CONC_COD = 922) AND NOCO_PAGOOK = 'N' INTO :vacacion;
IF (vacacion IS NULL) THEN
vacacion = 0;
vacacion = :vacacion + ((:salario / 12)/ 30) * :diaslaborados;
EXECUTE PROCEDURE REDONDEE(:vacacion, 5) RETURNING_VALUES (:vacacion);

SELECT P.paan_epstr FROM PARAMETROS_ANO P WHERE P.paan_ano = SUBSTR(:fecliq, 1,4) INTO :porcepsempl;
epsempl = (sueldo * :porcepsempl) / 100;
EXECUTE PROCEDURE REDONDEE(:epsempl, 5) RETURNING_VALUES (:epsempl);

SELECT P.paan_afptr FROM PARAMETROS_ANO P WHERE P.paan_ano = SUBSTR(:fecliq, 1,4) INTO :porcafpempl;
afpempl = (sueldo * :porcafpempl) / 100;
EXECUTE PROCEDURE REDONDEE(:afpempl, 5) RETURNING_VALUES (:afpempl);

SELECT P.paan_auxtr FROM PARAMETROS_ANO P WHERE P.paan_ano = SUBSTR(:fecliq, 1,4) INTO :auxt;
auxtransp = (:auxt / 30) * diaslaborados;
EXECUTE PROCEDURE REDONDEE(:auxtransp, 5) RETURNING_VALUES (:auxtransp);

SELECT SUM (PRCU_MONTO) FROM PRESTAMO_CUOTAS P, PRESTAMO_NOMINA PN WHERE PN.prno_id = P.prno_id AND PN.terc_nit = :nitempl AND P.prcu_ok = 'N' INTO :dsprestamo;
IF (dsprestamo IS NULL) THEN
dsprestamo = 0;

SELECT P.paan_epsem FROM PARAMETROS_ANO P WHERE P.paan_ano = SUBSTR(:fecliq, 1,4) INTO :pempreps;
empreps = (sueldo * :pempreps) / 100;
EXECUTE PROCEDURE REDONDEE(:empreps, 5) RETURNING_VALUES (:empreps);

SELECT P.paan_afpem FROM PARAMETROS_ANO P WHERE P.paan_ano = SUBSTR(:fecliq, 1,4) INTO :pemprafp;
emprafp = (sueldo * :pemprafp) / 100;
EXECUTE PROCEDURE REDONDEE(:emprafp, 5) RETURNING_VALUES (:emprafp);

SELECT P.dpto_tararp FROM DEPARTAMENTO P, EMPLEADOS E WHERE P.dpto_cod = E.empl_dpto AND E.terc_nit = :nitempl INTO :pemprafp;
emprarp = (sueldo * :pemprarp) / 100;
EXECUTE PROCEDURE REDONDEE(:emprarp, 5) RETURNING_VALUES (:emprarp);

SELECT P.paan_ccf FROM PARAMETROS_ANO P WHERE P.paan_ano = SUBSTR(:fecliq, 1,4) INTO :pemprccf;
emprccf = (sueldo * :pemprccf) / 100;
EXECUTE PROCEDURE REDONDEE(:emprccf, 5) RETURNING_VALUES (:emprccf);

SELECT P.paan_sena FROM PARAMETROS_ANO P WHERE P.paan_ano = SUBSTR(:fecliq, 1,4) INTO :pemprsena;
emprsena = (sueldo * :pemprsena) / 100;
EXECUTE PROCEDURE REDONDEE(:emprsena, 5) RETURNING_VALUES (:emprsena);

SELECT P.paan_icbf FROM PARAMETROS_ANO P WHERE P.paan_ano = SUBSTR(:fecliq, 1,4) INTO :pempricbf;
empricbf = (sueldo * :pempricbf) / 100;
EXECUTE PROCEDURE REDONDEE(:empricbf, 5) RETURNING_VALUES (:empricbf);
SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE LIQUIDACION_APORTES (
    id_nomina_1 INTEGER,
    id_nomina_2 INTEGER,
    id_nomina_3 INTEGER,
    id_nomina_4 INTEGER,
    id_nomina_5 INTEGER,
    id_nomina_6 INTEGER,
    id_nomina_7 INTEGER,
    intmora NUMERIC(18,2),
    fecha DATE,
    pago CHAR(1),
    nitbene VARCHAR(20),
    fechaegr DATE,
    pref VARCHAR(4),
    numeroegr VARCHAR(6),
    concepto VARCHAR(60),
    observaciones BLOB SUB_TYPE 0 SEGMENT SIZE 80,
    nombrebene VARCHAR(60),
    caja INTEGER,
    usuarioegr VARCHAR(10),
    cuentaid INTEGER,
    fechaegrbnco DATE,
    prefegrebnco VARCHAR(4),
    numeroegrebnco VARCHAR(6),
    benebnco VARCHAR(60),
    conceptobnco VARCHAR(60),
    gmf CHAR(1),
    formapagoid INTEGER,
    cajabnco VARCHAR(2),
    cajabncocuenta VARCHAR(20),
    cajabnconumeroegr VARCHAR(20),
    formulario VARCHAR(10))
AS
DECLARE VARIABLE itemaportadmi INTEGER;
DECLARE VARIABLE itemdetaport INTEGER;
DECLARE VARIABLE idaporte INTEGER;
DECLARE VARIABLE idegreso INTEGER;
DECLARE VARIABLE numegresointeger INTEGER;
DECLARE VARIABLE nit VARCHAR(20);
DECLARE VARIABLE eps CHAR(1);
DECLARE VARIABLE afp CHAR(1);
DECLARE VARIABLE ccf CHAR(1);
DECLARE VARIABLE afc CHAR(1);
DECLARE VARIABLE arp CHAR(1);
DECLARE VARIABLE nombreadmin VARCHAR(60);
DECLARE VARIABLE totadmin NUMERIC(18,2);
DECLARE VARIABLE tipoaport CHAR(1);
DECLARE VARIABLE ano CHAR(4);
DECLARE VARIABLE nitempl VARCHAR(20);
DECLARE VARIABLE totdetvalor NUMERIC(18,2);
DECLARE VARIABLE totibc INTEGER;
BEGIN
itemaportadmi = 1;
itemdetaport = 1;
numegresointeger = CAST (numeroegr AS INTEGER);
numegresointeger = numegresointeger - 1;
EXECUTE PROCEDURE completa_ceros(numegresointeger)RETURNING_VALUES :numeroegr;
ANO = SUBSTR(fecha, 1, 4);
idaporte = GEN_ID(id_pgaport,1);
SELECT PAAN_TIPOAPORT FROM parametros_ano WHERE PAAN_ANO = :ANO INTO :tipoaport;
FOR SELECT A.TERC_NIT, A.ADMI_EPS, A.ADMI_AFP, A.ADMI_CCF, A.ADMI_AFC, A.ADMI_ARP, T.TERC_NOM FROM ADMINISTRADORA A, TERCEROS t
  WHERE T.TERC_NIT = A.TERC_NIT AND t.terc_admini = 'S' INTO :nit, :eps, :afp, :CCF, :afc, :arp, :nombreadmin
  DO
  BEGIN
  SELECT SUM (noco_valor) FROM nomina_conceptos N
  WHERE (N.noco_aporte = 'S' AND N.noco_entidad = :nit AND N.nomi_id = :id_nomina_1) OR
        (N.noco_aporte = 'S' AND N.noco_entidad = :nit AND N.nomi_id = :id_nomina_2)OR
        (N.noco_aporte = 'S' AND N.noco_entidad = :nit AND N.nomi_id = :id_nomina_3) OR
        (N.noco_aporte = 'S' AND N.noco_entidad = :nit AND N.nomi_id = :id_nomina_4) OR
        (N.noco_aporte = 'S' AND N.noco_entidad = :nit AND N.nomi_id = :id_nomina_5) OR
        (N.noco_aporte = 'S' AND N.noco_entidad = :nit AND N.nomi_id = :id_nomina_6) OR
        (N.noco_aporte = 'S' AND N.noco_entidad = :nit AND N.nomi_id = :id_nomina_7)
  INTO :totadmin;
  IF (totadmin IS NOT NULL) THEN
  BEGIN
  INSERT INTO pago_aportes (pgap_id, pgap_item, pgap_tipoap, pgap_conpago, pgap_admin, pgap_monto, pgap_intmora, pgap_fecha, pgap_formulario) VALUES
                           (:idaporte, :itemaportadmi, :tipoaport, '', :nit, :totadmin, :intmora, :fecha, :formulario);
  idegreso = GEN_ID(id_egresos,1);
    numegresointeger = CAST (numeroegr AS INTEGER);
    numegresointeger = numegresointeger + 1;
    EXECUTE PROCEDURE completa_ceros(numegresointeger)RETURNING_VALUES :numeroegr;
  INSERT INTO egresos (EGRE_ID, TIDO_COD, PREF_PRE, EGRE_numero, EGRE_fecha, EGRE_CONC, EGRE_MONTO, EGRE_RTFTEMONTO, EGRE_OBS, EGRE_NOMTERC, EGRE_ANULADO, EGRE_TRANSMIT, TERC_NIT, EGRE_TIPO, CAJA_ID, EGRE_usuario, NUMOK, CLEG_ID)
                 VALUES (:idegreso, 62, :pref, :numeroegr, :fechaegr, :concepto, :totadmin, 0, :observaciones, :nombrebene, 'N', 'N', :nit, '3', :caja, :usuarioegr, 'S', 0);
  IF (pago = 'B') THEN
  INSERT INTO egresos_banco (EGRE_ID, EGBC_TIPOBCO, CUBA_COD, EGBC_numero, EGBC_fecha, PRBA_PREF, EGBC_BENEF, EGBC_MONTO, EGBC_CONCEPTO, EGBC_GMF, EGBC_ANULADO, EGBC_TRANSMIT)
                       VALUES (:idegreso, 62, :cuentaid, :numeroegrebnco, :fechaegrbnco, :prefegrebnco, :nit, :totadmin, :conceptobnco, :gmf, 'N', 'N');
  ELSE
  IF (pago = 'C') THEN
    INSERT INTO egresos_caja (EGRE_ID, EGCA_ITEM, CAJA_ID, FOPA_ID, EGCA_BANCO, EGCA_CUENTA, EGCA_numero, EGCA_fecha, EGCA_MONTO, EGCA_ANULADO, EGCA_TRANSMIT)
                 VALUES (:idegreso, 1, :caja, :formapagoid, :cajabnco, :cajabncocuenta, :cajabnconumeroegr, :fechaegr, :totadmin, 'N', 'N');
  END
  IF (CCF = 'S') THEN
  FOR SELECT TERC_NIT FROM EMPLEADOS WHERE EMPL_CCF = :NIT INTO :nitempl
  DO
  BEGIN
  SELECT SUM (NOCO_VALOR) FROM NOMINA_CONCEPTOS
  WHERE (TERC_NIT = :nitempl AND NOCO_SALARIO = 'S' AND nomi_id = :id_nomina_1) OR
        (TERC_NIT = :nitempl AND NOCO_SALARIO = 'S' AND nomi_id = :id_nomina_2) OR
        (TERC_NIT = :nitempl AND NOCO_SALARIO = 'S' AND nomi_id = :id_nomina_3) OR
        (TERC_NIT = :nitempl AND NOCO_SALARIO = 'S' AND nomi_id = :id_nomina_4) OR
        (TERC_NIT = :nitempl AND NOCO_SALARIO = 'S' AND nomi_id = :id_nomina_5) OR
        (TERC_NIT = :nitempl AND NOCO_SALARIO = 'S' AND nomi_id = :id_nomina_6) OR
        (TERC_NIT = :nitempl AND NOCO_SALARIO = 'S' AND nomi_id = :id_nomina_7)
        INTO :totibc;
  SELECT SUM (NOCO_VALOR) FROM NOMINA_CONCEPTOS
  WHERE (TERC_NIT = :nitempl AND NOCO_ENTIDAD = :nit AND NOCO_APORTE = 'S' AND nomi_id = :id_nomina_1) OR
        (TERC_NIT = :nitempl AND NOCO_ENTIDAD = :nit AND NOCO_APORTE = 'S' AND nomi_id = :id_nomina_2) OR
        (TERC_NIT = :nitempl AND NOCO_ENTIDAD = :nit AND NOCO_APORTE = 'S' AND nomi_id = :id_nomina_3) OR
        (TERC_NIT = :nitempl AND NOCO_ENTIDAD = :nit AND NOCO_APORTE = 'S' AND nomi_id = :id_nomina_4) OR
        (TERC_NIT = :nitempl AND NOCO_ENTIDAD = :nit AND NOCO_APORTE = 'S' AND nomi_id = :id_nomina_5) OR
        (TERC_NIT = :nitempl AND NOCO_ENTIDAD = :nit AND NOCO_APORTE = 'S' AND nomi_id = :id_nomina_6) OR
        (TERC_NIT = :nitempl AND NOCO_ENTIDAD = :nit AND NOCO_APORTE = 'S' AND nomi_id = :id_nomina_7)
        INTO :totdetvalor;
  IF ((:totdetvalor IS NOT NULL) AND (:totibc IS NOT NULL)) THEN
  BEGIN
  INSERT INTO PAGO_APORTES_DETALLE (pgap_id, pgap_item, pade_itemdet, terc_nit, pade_ibc, pade_cotobl)
                             VALUES(:idaporte, :itemaportadmi, :itemdetaport, :nitempl, :totibc, :totdetvalor);
    itemdetaport = :itemdetaport + 1;
  END
  END
IF (EPS = 'S') THEN
  FOR SELECT TERC_NIT FROM EMPLEADOS WHERE EMPL_EPS = :NIT INTO :nitempl
  DO
  BEGIN
  SELECT SUM (NOCO_VALOR) FROM NOMINA_CONCEPTOS
  WHERE (TERC_NIT = :nitempl AND NOCO_SALARIO = 'S' AND nomi_id = :id_nomina_1) OR
        (TERC_NIT = :nitempl AND NOCO_SALARIO = 'S' AND nomi_id = :id_nomina_2) OR
        (TERC_NIT = :nitempl AND NOCO_SALARIO = 'S' AND nomi_id = :id_nomina_3) OR
        (TERC_NIT = :nitempl AND NOCO_SALARIO = 'S' AND nomi_id = :id_nomina_4) OR
        (TERC_NIT = :nitempl AND NOCO_SALARIO = 'S' AND nomi_id = :id_nomina_5) OR
        (TERC_NIT = :nitempl AND NOCO_SALARIO = 'S' AND nomi_id = :id_nomina_6) OR
        (TERC_NIT = :nitempl AND NOCO_SALARIO = 'S' AND nomi_id = :id_nomina_7)
        INTO :totibc;
  SELECT SUM (NOCO_VALOR) FROM NOMINA_CONCEPTOS
  WHERE (TERC_NIT = :nitempl AND NOCO_ENTIDAD = :nit AND NOCO_APORTE = 'S' AND nomi_id = :id_nomina_1) OR
        (TERC_NIT = :nitempl AND NOCO_ENTIDAD = :nit AND NOCO_APORTE = 'S' AND nomi_id = :id_nomina_2) OR
        (TERC_NIT = :nitempl AND NOCO_ENTIDAD = :nit AND NOCO_APORTE = 'S' AND nomi_id = :id_nomina_3) OR
        (TERC_NIT = :nitempl AND NOCO_ENTIDAD = :nit AND NOCO_APORTE = 'S' AND nomi_id = :id_nomina_4) OR
        (TERC_NIT = :nitempl AND NOCO_ENTIDAD = :nit AND NOCO_APORTE = 'S' AND nomi_id = :id_nomina_5) OR
        (TERC_NIT = :nitempl AND NOCO_ENTIDAD = :nit AND NOCO_APORTE = 'S' AND nomi_id = :id_nomina_6) OR
        (TERC_NIT = :nitempl AND NOCO_ENTIDAD = :nit AND NOCO_APORTE = 'S' AND nomi_id = :id_nomina_7)
        INTO :totdetvalor;
  IF ((:totdetvalor IS NOT NULL) AND (:totibc IS NOT NULL)) THEN
  BEGIN
  INSERT INTO PAGO_APORTES_DETALLE (pgap_id, pgap_item, pade_itemdet, terc_nit, pade_ibc, pade_cotobl)
                             VALUES(:idaporte, :itemaportadmi, :itemdetaport, :nitempl, :totibc, :totdetvalor);
    itemdetaport = :itemdetaport + 1;
  END
  END
IF (afp = 'S') THEN
  FOR SELECT TERC_NIT FROM EMPLEADOS WHERE EMPL_AFP = :NIT INTO :nitempl
  DO
  BEGIN
  SELECT SUM (NOCO_VALOR) FROM NOMINA_CONCEPTOS
  WHERE (TERC_NIT = :nitempl AND NOCO_SALARIO = 'S' AND nomi_id = :id_nomina_1) OR
        (TERC_NIT = :nitempl AND NOCO_SALARIO = 'S' AND nomi_id = :id_nomina_2) OR
        (TERC_NIT = :nitempl AND NOCO_SALARIO = 'S' AND nomi_id = :id_nomina_3) OR
        (TERC_NIT = :nitempl AND NOCO_SALARIO = 'S' AND nomi_id = :id_nomina_4) OR
        (TERC_NIT = :nitempl AND NOCO_SALARIO = 'S' AND nomi_id = :id_nomina_5) OR
        (TERC_NIT = :nitempl AND NOCO_SALARIO = 'S' AND nomi_id = :id_nomina_6) OR
        (TERC_NIT = :nitempl AND NOCO_SALARIO = 'S' AND nomi_id = :id_nomina_7)
        INTO :totibc;
  SELECT SUM (NOCO_VALOR) FROM NOMINA_CONCEPTOS
  WHERE (TERC_NIT = :nitempl AND NOCO_ENTIDAD = :nit AND NOCO_APORTE = 'S' AND nomi_id = :id_nomina_1) OR
        (TERC_NIT = :nitempl AND NOCO_ENTIDAD = :nit AND NOCO_APORTE = 'S' AND nomi_id = :id_nomina_2) OR
        (TERC_NIT = :nitempl AND NOCO_ENTIDAD = :nit AND NOCO_APORTE = 'S' AND nomi_id = :id_nomina_3) OR
        (TERC_NIT = :nitempl AND NOCO_ENTIDAD = :nit AND NOCO_APORTE = 'S' AND nomi_id = :id_nomina_4) OR
        (TERC_NIT = :nitempl AND NOCO_ENTIDAD = :nit AND NOCO_APORTE = 'S' AND nomi_id = :id_nomina_5) OR
        (TERC_NIT = :nitempl AND NOCO_ENTIDAD = :nit AND NOCO_APORTE = 'S' AND nomi_id = :id_nomina_6) OR
        (TERC_NIT = :nitempl AND NOCO_ENTIDAD = :nit AND NOCO_APORTE = 'S' AND nomi_id = :id_nomina_7)
        INTO :totdetvalor;
  IF ((:totdetvalor IS NOT NULL) AND (:totibc IS NOT NULL)) THEN
  BEGIN
  INSERT INTO PAGO_APORTES_DETALLE (pgap_id, pgap_item, pade_itemdet, terc_nit, pade_ibc, pade_cotobl)
                             VALUES(:idaporte, :itemaportadmi, :itemdetaport, :nitempl, :totibc, :totdetvalor);
    itemdetaport = :itemdetaport + 1;
  END
  END
IF (AFC = 'S') THEN
  FOR SELECT TERC_NIT FROM EMPLEADOS WHERE EMPL_AFC = :NIT INTO :nitempl
  DO
  BEGIN
  SELECT SUM (NOCO_VALOR) FROM NOMINA_CONCEPTOS
  WHERE (TERC_NIT = :nitempl AND NOCO_SALARIO = 'S' AND nomi_id = :id_nomina_1) OR
        (TERC_NIT = :nitempl AND NOCO_SALARIO = 'S' AND nomi_id = :id_nomina_2) OR
        (TERC_NIT = :nitempl AND NOCO_SALARIO = 'S' AND nomi_id = :id_nomina_3) OR
        (TERC_NIT = :nitempl AND NOCO_SALARIO = 'S' AND nomi_id = :id_nomina_4) OR
        (TERC_NIT = :nitempl AND NOCO_SALARIO = 'S' AND nomi_id = :id_nomina_5) OR
        (TERC_NIT = :nitempl AND NOCO_SALARIO = 'S' AND nomi_id = :id_nomina_6) OR
        (TERC_NIT = :nitempl AND NOCO_SALARIO = 'S' AND nomi_id = :id_nomina_7)
        INTO :totibc;
  SELECT SUM (NOCO_VALOR) FROM NOMINA_CONCEPTOS
  WHERE (TERC_NIT = :nitempl AND NOCO_ENTIDAD = :nit AND NOCO_APORTE = 'S' AND nomi_id = :id_nomina_1) OR
        (TERC_NIT = :nitempl AND NOCO_ENTIDAD = :nit AND NOCO_APORTE = 'S' AND nomi_id = :id_nomina_2) OR
        (TERC_NIT = :nitempl AND NOCO_ENTIDAD = :nit AND NOCO_APORTE = 'S' AND nomi_id = :id_nomina_3) OR
        (TERC_NIT = :nitempl AND NOCO_ENTIDAD = :nit AND NOCO_APORTE = 'S' AND nomi_id = :id_nomina_4) OR
        (TERC_NIT = :nitempl AND NOCO_ENTIDAD = :nit AND NOCO_APORTE = 'S' AND nomi_id = :id_nomina_5) OR
        (TERC_NIT = :nitempl AND NOCO_ENTIDAD = :nit AND NOCO_APORTE = 'S' AND nomi_id = :id_nomina_6) OR
        (TERC_NIT = :nitempl AND NOCO_ENTIDAD = :nit AND NOCO_APORTE = 'S' AND nomi_id = :id_nomina_7)
        INTO :totdetvalor;
  IF ((:totdetvalor IS NOT NULL) AND (:totibc IS NOT NULL)) THEN
  BEGIN
  INSERT INTO PAGO_APORTES_DETALLE (pgap_id, pgap_item, pade_itemdet, terc_nit, pade_ibc, pade_cotobl)
                             VALUES(:idaporte, :itemaportadmi, :itemdetaport, :nitempl, :totibc, :totdetvalor);
    itemdetaport = :itemdetaport + 1;
  END
  END
IF (ARP = 'S') THEN
  FOR SELECT TERC_NIT FROM EMPLEADOS WHERE EMPL_ARP = :NIT INTO :nitempl
  DO
  BEGIN
  SELECT SUM (NOCO_VALOR) FROM NOMINA_CONCEPTOS
  WHERE (TERC_NIT = :nitempl AND NOCO_SALARIO = 'S' AND nomi_id = :id_nomina_1) OR
        (TERC_NIT = :nitempl AND NOCO_SALARIO = 'S' AND nomi_id = :id_nomina_2) OR
        (TERC_NIT = :nitempl AND NOCO_SALARIO = 'S' AND nomi_id = :id_nomina_3) OR
        (TERC_NIT = :nitempl AND NOCO_SALARIO = 'S' AND nomi_id = :id_nomina_4) OR
        (TERC_NIT = :nitempl AND NOCO_SALARIO = 'S' AND nomi_id = :id_nomina_5) OR
        (TERC_NIT = :nitempl AND NOCO_SALARIO = 'S' AND nomi_id = :id_nomina_6) OR
        (TERC_NIT = :nitempl AND NOCO_SALARIO = 'S' AND nomi_id = :id_nomina_7)
        INTO :totibc;
  SELECT SUM (NOCO_VALOR) FROM NOMINA_CONCEPTOS
  WHERE (TERC_NIT = :nitempl AND NOCO_ENTIDAD = :nit AND NOCO_APORTE = 'S' AND nomi_id = :id_nomina_1) OR
        (TERC_NIT = :nitempl AND NOCO_ENTIDAD = :nit AND NOCO_APORTE = 'S' AND nomi_id = :id_nomina_2) OR
        (TERC_NIT = :nitempl AND NOCO_ENTIDAD = :nit AND NOCO_APORTE = 'S' AND nomi_id = :id_nomina_3) OR
        (TERC_NIT = :nitempl AND NOCO_ENTIDAD = :nit AND NOCO_APORTE = 'S' AND nomi_id = :id_nomina_4) OR
        (TERC_NIT = :nitempl AND NOCO_ENTIDAD = :nit AND NOCO_APORTE = 'S' AND nomi_id = :id_nomina_5) OR
        (TERC_NIT = :nitempl AND NOCO_ENTIDAD = :nit AND NOCO_APORTE = 'S' AND nomi_id = :id_nomina_6) OR
        (TERC_NIT = :nitempl AND NOCO_ENTIDAD = :nit AND NOCO_APORTE = 'S' AND nomi_id = :id_nomina_7)
        INTO :totdetvalor;
  IF ((:totdetvalor IS NOT NULL) AND (:totibc IS NOT NULL)) THEN
  BEGIN
  INSERT INTO PAGO_APORTES_DETALLE (pgap_id, pgap_item, pade_itemdet, terc_nit, pade_ibc, pade_cotobl)
                             VALUES(:idaporte, :itemaportadmi, :itemdetaport, :nitempl, :totibc, :totdetvalor);
    itemdetaport = :itemdetaport + 1;
  END
  END
  UPDATE nomina n SET n.nomi_aporok = 'S' WHERE N.NOMI_ID = :id_nomina_1 OR (N.NOMI_ID = :id_nomina_2) OR (N.NOMI_ID = :id_nomina_3) OR (N.NOMI_ID = :id_nomina_4)
  OR (N.NOMI_ID = :id_nomina_5) OR (N.NOMI_ID = :id_nomina_6) OR (N.NOMI_ID = :id_nomina_7);
  IF (totadmin IS NOT NULL) THEN
  itemaportadmi = :itemaportadmi + 1;
END
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE DIAS_LABORADOS(
    NITEMPL VARCHAR(20),
    PERIODO INTEGER,
    fec DATE)
RETURNS (
    TOTALDIASLAB INTEGER)
AS
DECLARE VARIABLE diasnolab INTEGER;
DECLARE VARIABLE diaslabxper INTEGER;
DECLARE VARIABLE perpago INTEGER;
DECLARE VARIABLE fecing DATE;
BEGIN
SELECT E.empl_ppago, E.empl_fecing
FROM EMPLEADOS E WHERE TERC_NIT = :nitempl
INTO :perpago, :fecing;
IF (perpago = 1) THEN
diaslabxper = 30;
ELSE
IF (perpago = 2) THEN
diaslabxper = 15;
ELSE
IF (perpago = 3) THEN
diaslabxper = 7;
if (SUBSTR(fecing,1,8) = SUBSTR(FEC,1,8)) then
BEGIN
diaslabxper = cast(substr(fec,7,8) as integer) - cast(substr(fecing,7,8) as integer);
END
SELECT SUM (NONO_DURA)
FROM nomina_novedades WHERE TERC_NIT = :nitempl AND TNOV_COD = 9 AND NONO_PERIODO = :periodo
INTO :diasnolab;
totaldiaslab =  :diaslabxper - :diasnolab;
IF (totaldiaslab IS NULL) THEN
totaldiaslab =  :diaslabxper;
SUSPEND;
END
^

SET TERM ; ^


SET TERM ^ ;

ALTER PROCEDURE CAUSA_NOMINA(
    FEC DATE,
    PERIODO INTEGER,
    PERIODICIDAD INTEGER,
    PAGOGLOBAL CHAR(1),
    ANO CHAR(4))
RETURNS (
    IDNOMINA INTEGER)
AS
DECLARE VARIABLE item INTEGER;
DECLARE VARIABLE nite VARCHAR(20) CHARACTER SET none;
DECLARE VARIABLE nit_tercero VARCHAR(20);
DECLARE VARIABLE concept INTEGER;
DECLARE VARIABLE montos NUMERIC(18,2);
DECLARE VARIABLE porcen NUMERIC(9,4);
DECLARE VARIABLE entidad VARCHAR(20);
DECLARE VARIABLE conc_cod INTEGER;
DECLARE VARIABLE conc_deduc CHAR(1);
DECLARE VARIABLE conc_porc NUMERIC(9,4);
DECLARE VARIABLE conc_entidad INTEGER;
DECLARE VARIABLE conc_monto NUMERIC(18,2);
DECLARE VARIABLE conc_modifi CHAR(1);
DECLARE VARIABLE conc_promedio CHAR(1);
DECLARE VARIABLE emco_perprom INTEGER;
DECLARE VARIABLE valor NUMERIC(18,2);
DECLARE VARIABLE diaslab INTEGER;
DECLARE VARIABLE conc_prov CHAR(1);
DECLARE VARIABLE conc_aporte CHAR(1);
DECLARE VARIABLE numeroprom INTEGER;
DECLARE VARIABLE conc_aplicaprom CHAR(1);
DECLARE VARIABLE perinicial INTEGER;
DECLARE VARIABLE anoprom INTEGER;
DECLARE VARIABLE conc_dias CHAR(1);
DECLARE VARIABLE conc_otroconc CHAR(1);
DECLARE VARIABLE conc_codotroconc INTEGER;
DECLARE VARIABLE anosum INTEGER;
DECLARE VARIABLE salario CHAR(1) CHARACTER SET none;
DECLARE VARIABLE liquidaper INTEGER;
DECLARE VARIABLE rmod NUMERIC(2,2);
DECLARE VARIABLE basico NUMERIC(18,2);
DECLARE VARIABLE niteps VARCHAR(20);
DECLARE VARIABLE nitafc VARCHAR(20);
DECLARE VARIABLE nitafp VARCHAR(20);
DECLARE VARIABLE nitccf VARCHAR(20);
DECLARE VARIABLE gtoempr CHAR(1);
DECLARE VARIABLE comision NUMERIC(18,2);
DECLARE VARIABLE cambsaltrans NUMERIC(18,2);
DECLARE VARIABLE SALDOSINI NUMERIC(18,2);
DECLARE VARIABLE duranov INTEGER;
DECLARE VARIABLE base NUMERIC(18,2);
BEGIN
/*SI ES QUINCENAL*/
IF (periodicidad = 2) THEN
BEGIN
EXECUTE PROCEDURE cambie_id_nomina RETURNING_VALUES(:idnomina);
INSERT INTO nomina (nomi_id, NOMI_FECCAUSA, NOMI_PAGOGLOBAL, NOMI_PERIODOCIDAD, NOMI_PERIODO, NOMI_ANO, NOMI_LIQOK)
VALUES (:IDNOMINA, :fec,:pagoglobal, :periodicidad, :periodo, :ano, 'N');
 BEGIN
    item = 1;
    FOR SELECT E.TERC_NIT, E.empl_salario, e.empl_eps, e.empl_afc, e.empl_afp, e.empl_ccf
    FROM EMPLEADOS E
    WHERE E.empl_ppago = 2
    INTO :nite, :basico, :niteps, :nitafc, :nitafp, :nitccf
    DO
    BEGIN
    FOR SELECT CE.TERC_NIT, CE.CONC_COD, CE.EMCO_MONTO, CE.EMCO_PORC, ce.empl_entidad, CE.emco_perprom, CE.emco_luquidaper, CN.CONC_COD, CN.CONC_DEDUC,CN.CONC_PORC, CN.CONC_ENTIDAD, CN.CONC_MONTO,  CN.CONC_DIAS, CN.CONC_MODIFI,
    CN.CONC_PROMEDIO, CN.conc_salario, CE.emco_perprom, CN.conc_prov, CN.conc_aporte, CN.conc_aplicaprom, cn.conc_otroconc, cn.conc_codotroconc, CN.conc_gtoempr, CN.conc_base
    FROM empleado_conceptos CE, CONCEPTOS_NOMINA CN WHERE ((CE.terc_nit = :nite) AND (CE.CONC_COD = CN.CONC_COD) AND (CN.conc_fecini <= :fec AND CN.conc_fecfin >= :FEC) ) OR ((CE.terc_nit = :nite)
    AND (CE.CONC_COD = CN.CONC_COD) AND (cn.conc_todosper = 'N') AND (CE.emco_ppago = :periodo)) OR  ((CE.terc_nit = :nite) AND (CE.CONC_COD = CN.CONC_COD) AND cn.conc_todosper = 'S')  ORDER BY (TERC_NIT )
    INTO :nit_tercero, :concept,  :montos, :porcen, :entidad, :numeroprom, :liquidaper ,:CONC_COD, :CONC_DEDUC, :CONC_PORC,
    :CONC_ENTIDAD, :CONC_MONTO, :CONC_DIAS, :CONC_MODIFI,:CONC_PROMEDIO, :salario,:EMCO_PERPROM, :conc_prov, :conc_aporte , :CONC_APLICAPROM, :conc_otroconc, :conc_codotroconc, :gtoempr, :base
    DO
BEGIN
    IF (conc_dias = 'S') THEN
    EXECUTE PROCEDURE DIAS_LABORADOS (:nite, :periodo, :fec) RETURNING_VALUES (:diaslab);
    ELSE
    BEGIN
    IF (liquidaper = 0) THEN
    diaslab = 15;
    ELSE
    IF (liquidaper = 1) THEN
    diaslab = 30;
    ELSE
    IF (liquidaper = 2) THEN
    diaslab = 60;
    END
 SELECT ((n.nono_valor /30) * n.nono_dura), (n.nono_dura) FROM nomina_novedades n WHERE n.tnov_cod = 11 AND n.terc_nit = :nite AND n.nono_periodo = :periodo INTO :cambsaltrans, :duranov;
 IF (cambsaltrans IS NULL) THEN
 cambsaltrans = 0;
 if (duranov is null) then
 duranov = 0;
 diaslab = :diaslab - :duranov;
 if (conc_cod = 921) then
 begin
 if (porcen IS NOT NULL AND porcen <> 0) then
 valor = ((basico / 30)* :diaslab ) * :PORCEN /100;
 ELSE
 if (conc_porc IS NOT null AND conc_porc <> 0) then
 valor = ((:basico / 30)* :diaslab ) * :conc_porc /100;
 EXECUTE PROCEDURE REDONDEE(:valor, 5) RETURNING_VALUES (VALOR);
 end
 ELSE
 if (conc_cod = 922) then
 BEGIN
 SELECT P.prcu_monto FROM prestamo_cuotas P, prestamo_nomina PN WHERE P.prcu_ano = :ano AND P.prcu_periodo = :periodo AND PN.prno_id = P.prno_id AND PN.terc_nit = :nite INTO :valor;
 IF (valor IS NULL) THEN
 valor = 0;
 EXECUTE PROCEDURE REDONDEE(:valor, 5) RETURNING_VALUES (VALOR);
 item = :item + 1;
 update prestamo_cuotas  P SET prcu_ok = 'S' WHERE P.prcu_ano = :ano AND P.prcu_periodo = :periodo AND P.prno_id = (SELECT PN.prno_id FROM PRESTAMO_NOMINA PN WHERE PN.terc_nit = :nite);
 END
 ELSE
 BEGIN
    IF ((:montos = 0) OR (:montos IS NULL)) THEN
      BEGIN
      IF ((CONC_PORC = 0 AND :porcen = 0) OR (CONC_PORC IS NULL AND :porcen = 0) OR (CONC_PORC = 0 AND :porcen IS NULL) OR (CONC_PORC IS NULL AND :porcen IS NULL) ) THEN
        BEGIN
        IF ((conc_monto <> 0) AND (conc_monto IS NOT NULL) ) THEN
        BEGIN
        VALOR = :CONC_MONTO/30 * :diaslab;
        EXECUTE PROCEDURE REDONDEE(:valor, 5) RETURNING_VALUES (VALOR);
        END
        ELSE
        IF (salario = 'S' AND CONC_COD <> 900 AND CONC_COD <> 920) THEN
        BEGIN
        conc_monto = :basico;
        VALOR = (:conc_monto/30 * :diaslab ) + :cambsaltrans;
        EXECUTE PROCEDURE REDONDEE(:valor, 5) RETURNING_VALUES (VALOR);
        END
        ELSE
        valor = montos;
        END
       ELSE
       BEGIN
        IF (:porcen <> 0) THEN
          BEGIN
            IF ((conc_monto <> 0) AND (conc_monto IS NOT NULL) ) THEN
            BEGIN
              VALOR = ((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans * :PORCEN) /100;
              EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
            END
          END
          ELSE
          BEGIN
            IF ((conc_monto <> 0) AND (conc_monto IS NOT NULL) ) THEN
            BEGIN
              VALOR = ((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans * :conc_porc) /100;
              EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
            END
            ELSE
        IF (salario = 'S' AND CONC_COD <> 900 AND CONC_COD <> 920) THEN
            BEGIN
              conc_monto = :basico;
              VALOR = ((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans * :conc_porc) /100;
              EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
            END
          END
       END
      END
    ELSE
    BEGIN
      IF (CONC_PORC = 0 AND :porcen = 0) THEN
      BEGIN
      VALOR = (:montos/30 * :diaslab);
      EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
      END
      ELSE
      BEGIN
        IF (:porcen <> 0) THEN
          BEGIN
          VALOR = ((:MONTOS/30 * :diaslab )+ :cambsaltrans * :PORCEN) /100;
          EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
          END
          ELSE
          BEGIN
          VALOR = ((:montos/30 * :diaslab )+ :cambsaltrans * :CONC_PORC) /100;
          END
          EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
       END
   END
    IF (conc_promedio = 'S') THEN
    BEGIN
    perinicial = :periodo - (:numeroprom) + 1;
    anoprom = CAST (ano AS INTEGER);
    IF (perinicial <= 0) THEN
    BEGIN
    perinicial = 24 + :PERINICIAL;
    anoprom = CAST(ANO AS INTEGER) - 1;
    END
    SELECT SUM (noco_valor) FROM nomina_conceptos n WHERE n.noco_aplicaprom = 'S' AND N.noco_periodo >= :perinicial - 1 AND N.noco_periodo < :periodo AND N.noco_ano >= :anoprom AND N.noco_ano <= :ano AND terc_nit = :nite INTO :valor;
    valor = (valor / numeroprom)/*/ 30 * :diaslab*/;
    SELECT NOCO_VALOR FROM NOMINA_CONCEPTOS WHERE CONC_COD = :conc_cod AND TERC_NIT  = :nite AND NOCO_PAGOOK = 'N' AND NOCO_PERIODO = 0 INTO :saldosini;
    IF (saldosini IS NULL) THEN
    saldosini = 0;
    ELSE
    UPDATE nomina_conceptos N SET noco_pagook = 'S' WHERE n.noco_aplicaprom = 'S' AND N.noco_periodo >= :perinicial - 1 AND N.noco_periodo < :periodo AND N.noco_ano >= :anoprom AND N.noco_ano <= :ano  AND CONC_COD = :conc_cod AND terc_nit = :nite AND NOCO_PERIODO = 0;
    VALOR = :valor + :saldosini;
    EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
    UPDATE nomina_conceptos N SET noco_pagook = 'S' WHERE n.noco_aplicaprom = 'S' AND N.noco_periodo >= :perinicial - 1 AND N.noco_periodo < :periodo AND N.noco_ano >= :anoprom AND N.noco_ano <= :ano  AND CONC_COD = :conc_cod AND terc_nit = :nite;
    END
    IF (conc_otroconc = 'S') THEN
    BEGIN
    anosum = CAST(ano AS INTEGER);
    anosum = anosum - 1;
    SELECT SUM (noco_valor) FROM nomina_conceptos n WHERE n.noco_ano = :anosum AND n.conc_cod = :conc_codotroconc AND N.terc_nit = :nite INTO :valor;
    SELECT NOCO_VALOR FROM NOMINA_CONCEPTOS WHERE noco_ano = :anosum AND conc_cod = :conc_codotroconc AND terc_nit = :nite AND NOCO_PERIODO = 0 INTO :saldosini;
    IF (saldosini IS NULL) THEN
    saldosini = 0;
    ELSE
    UPDATE nomina_conceptos SET noco_pagook = 'S' WHERE noco_ano = :anosum AND conc_cod = :conc_codotroconc AND NOCO_PERIODO = 0 AND terc_nit = :nite;
    VALOR = :valor + :saldosini;
    UPDATE nomina_conceptos SET noco_pagook = 'S' WHERE noco_ano = :anosum AND conc_cod = :conc_codotroconc AND terc_nit = :nite;
    END
/*SI EL CONCEPTO ES UN APORTE*/
IF (conc_aporte = 'S') THEN
BEGIN
    IF ((:entidad = '' ) OR (entidad IS NULL)) THEN
    BEGIN
     SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
     IF (comision IS NULL) THEN
     comision = 0;
     valor = :basico + :comision;
    IF ((conc_cod = 904) OR (conc_cod = 905) OR (conc_cod = 906)) THEN
            BEGIN
            entidad = :nitafp;
                IF (conc_cod = 904) THEN
                BEGIN
                SELECT A.paan_afptr FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = (((((:basico /30) * :diaslab ) + :comision)+ :cambsaltrans) * :PORCEN) /100;
                END
                ELSE
                IF ((conc_cod = 905) OR (conc_cod = 906)) THEN
                BEGIN
                SELECT A.paan_afpem FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = (((((:basico /30) * :diaslab ) + :comision)+ :cambsaltrans) * :PORCEN) /100;
                END
                EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
            END
            ELSE
       IF ((conc_cod = 907) OR (conc_cod = 914) OR (conc_cod = 915)) THEN
            BEGIN
            entidad = :niteps;
                IF (conc_cod = 907) THEN
                BEGIN
                SELECT A.paan_epstr FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = (((((:basico )/30 * :diaslab ) + :comision)+ :cambsaltrans) * :PORCEN) /100;
                END
                ELSE
                IF ((conc_cod = 914) OR (conc_cod = 915)) THEN
                BEGIN
                SELECT A.paan_epsem FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = (((((:basico )/30 * :diaslab ) + :comision)+ :cambsaltrans) * :PORCEN) /100;
                END
                EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
            END
            ELSE
       IF ((conc_cod = 910) OR (conc_cod = 911) OR (conc_cod = 916) OR (conc_cod = 917) OR (conc_cod = 918) OR (conc_cod = 919)) THEN
            BEGIN
            entidad = :nitccf;
            SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
            IF (comision IS NULL) THEN
            comision = 0;
                IF ((conc_cod = 910) OR (conc_cod = 911) ) THEN
                BEGIN
                SELECT A.paan_ccf FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = (((((:basico )/30 * :diaslab ) + :comision)+ :cambsaltrans) * :PORCEN) /100;
                EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
                END
                ELSE
                IF ((conc_cod = 916) OR (conc_cod = 917)) THEN
                BEGIN
                SELECT A.paan_icbf FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = (((((:basico )/30 * :diaslab ) + :comision)+ :cambsaltrans) * :PORCEN) /100;
                EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
                END
                ELSE
                IF ((conc_cod = 918) OR (conc_cod = 919)) THEN
                BEGIN
                SELECT A.paan_sena FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = (((((:basico )/30 * :diaslab ) + :comision)+ :cambsaltrans) * :PORCEN) /100;
                EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
                END
            END
            ELSE
        IF ((conc_cod = 912) OR (conc_cod = 913)) THEN
            BEGIN
            entidad = :nitafc;
            SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
            IF (comision IS NULL) THEN
            comision = 0;
                IF ((conc_cod = 912) OR (conc_cod = 913) ) THEN
                BEGIN
                SELECT A.paan_cesemp FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = ((((:basico + :comision)/30 * :diaslab )+ :cambsaltrans) * :PORCEN) /100;
                EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
                END
            END
            ELSE
        BEGIN
        IF (comision IS NULL) THEN
        comision = 0;
        SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
        conc_monto = :basico + :comision;
        IF (conc_porc <> 0 AND conc_porc IS NOT NULL) THEN
        VALOR = (((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans) * :conc_porc) /100;
        ELSE
        IF (:porcen <> 0 AND :porcen IS NOT NULL) THEN
        VALOR = (((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans) * :porcen) /100;
        ELSE
        IF (:montos <> 0 AND :montos IS NOT NULL) THEN
        valor = :montos;
        ELSE
        IF (:conc_monto <> 0 AND :conc_monto IS NOT NULL) THEN
        valor = :conc_monto;
        EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
        END
    END
    END
    ELSE
    IF (conc_prov = 'S') THEN
    BEGIN
        conc_monto = :basico;
        IF (conc_porc <> 0 AND conc_porc IS NOT NULL) THEN
        VALOR = (((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans) * :conc_porc) /100;
        ELSE
        IF (porcen <> 0 AND porcen IS NOT NULL) THEN
        VALOR = (((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans) * :porcen) /100;
        ELSE
        IF (montos <> 0 AND montos IS NOT NULL) THEN
        VALOR = :montos;
        ELSE
        IF (conc_monto <> 0 AND conc_monto IS NOT NULL) THEN
        VALOR = :conc_monto;
        EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
    END
item = :item + 1;
END
 IF (conc_cod = 920) THEN
 BEGIN
 SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :valor;
 IF (valor IS NULL) THEN
 valor = 0;
 item = :item + 1;
 END
    IF (liquidaper = 0) THEN
    INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
    VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
    ELSE
    IF (liquidaper = 1) THEN
    BEGIN
    rmod = mod(:periodo, 2);
    IF (rmod = 0) THEN
        INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
        VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
    END
    ELSE
    IF (liquidaper = 2) THEN
    BEGIN
    rmod = mod(:periodo, 4);
    IF (rmod = 0) THEN
        INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
        VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
    END
END
END
END
END
ELSE
/*SI ES MENSUAL*/
IF (periodicidad = 1) THEN
BEGIN
EXECUTE PROCEDURE cambie_id_nomina RETURNING_VALUES(:idnomina);
INSERT INTO nomina (nomi_id, NOMI_FECCAUSA, NOMI_PAGOGLOBAL, NOMI_PERIODOCIDAD, NOMI_PERIODO, NOMI_ANO, NOMI_LIQOK)
VALUES (:IDNOMINA, :fec,:pagoglobal, :periodicidad, :periodo, :ano, 'N');
    BEGIN
    item = 1;
    FOR SELECT E.TERC_NIT, E.empl_salario, e.empl_eps, e.empl_afc, e.empl_afp, e.empl_ccf
    FROM EMPLEADOS E
    WHERE E.empl_ppago = 1
    INTO :nite, :basico, :niteps, :nitafc, :nitafp, :nitccf
    DO
    FOR SELECT CE.TERC_NIT, CE.CONC_COD, CE.EMCO_MONTO, CE.EMCO_PORC, ce.empl_entidad, CE.emco_perprom, CE.emco_luquidaper,    CN.CONC_COD, CN.CONC_DEDUC,CN.CONC_PORC, CN.CONC_ENTIDAD, CN.CONC_MONTO,  CN.CONC_DIAS, CN.CONC_MODIFI,
    CN.CONC_PROMEDIO, CN.conc_salario, CE.emco_perprom, CN.conc_prov, CN.conc_aporte, CN.conc_aplicaprom, cn.conc_otroconc, cn.conc_codotroconc, CN.conc_gtoempr
    FROM empleado_conceptos CE, CONCEPTOS_NOMINA CN WHERE ((CE.terc_nit = :nite) AND (CE.CONC_COD = CN.CONC_COD) AND (CN.conc_fecini <= :fec AND CN.conc_fecfin >= :FEC) ) OR ((CE.terc_nit = :nite)
    AND (CE.CONC_COD = CN.CONC_COD) AND (cn.conc_todosper = 'N') AND (CE.emco_ppago = :periodo)) OR  ((CE.terc_nit = :nite) AND (CE.CONC_COD = CN.CONC_COD) AND cn.conc_todosper = 'S')  ORDER BY (TERC_NIT)
    INTO :nit_tercero, :concept,  :montos, :porcen, :entidad, :numeroprom, :liquidaper ,:CONC_COD, :CONC_DEDUC, :CONC_PORC,
    :CONC_ENTIDAD, :CONC_MONTO, :CONC_DIAS, :CONC_MODIFI,:CONC_PROMEDIO, :salario,:EMCO_PERPROM, :conc_prov, :conc_aporte , :CONC_APLICAPROM, :conc_otroconc, :conc_codotroconc, :gtoempr    DO
BEGIN
    IF (conc_dias = 'S') THEN
    EXECUTE PROCEDURE DIAS_LABORADOS (:nite, :periodo, :fec) RETURNING_VALUES (:diaslab);
    ELSE
    diaslab = 30;
 SELECT ((n.nono_valor /30) * n.nono_dura), (n.nono_dura) FROM nomina_novedades n WHERE n.tnov_cod = 11 AND n.terc_nit = :nite AND n.nono_periodo = :periodo INTO :cambsaltrans, :duranov;
 IF (cambsaltrans IS NULL) THEN
 cambsaltrans = 0;
 if (duranov is null) then
 duranov = 0;
 diaslab = :diaslab - :duranov;
 if (conc_cod = 921) then
 begin
 if (porcen IS NOT NULL AND porcen <> 0) then
 valor = ((basico / 30)* :diaslab ) * :PORCEN /100;
 ELSE
 if (conc_porc IS NOT null AND conc_porc <> 0) then
 valor = ((:basico / 30)* :diaslab ) * :conc_porc /100;
 EXECUTE PROCEDURE REDONDEE(:valor, 5) RETURNING_VALUES (VALOR);
 end
 ELSE
 if (conc_cod = 922) then
 BEGIN
 SELECT P.prcu_monto FROM prestamo_cuotas P, prestamo_nomina PN WHERE P.prcu_ano = :ano AND P.prcu_periodo = :periodo AND PN.prno_id = P.prno_id AND PN.terc_nit = :nite INTO :valor;
 IF (valor IS NULL) THEN
 valor = 0;
 EXECUTE PROCEDURE REDONDEE(:valor, 5) RETURNING_VALUES (VALOR);
 item = :item + 1;
 update prestamo_cuotas  P SET prcu_ok = 'S' WHERE P.prcu_ano = :ano AND P.prcu_periodo = :periodo AND P.prno_id = (SELECT PN.prno_id FROM PRESTAMO_NOMINA PN WHERE PN.terc_nit = :nite);
 END
 ELSE
 BEGIN
    IF ((:montos = 0) OR (:montos IS NULL)) THEN
      BEGIN
      IF ((CONC_PORC = 0 AND :porcen = 0) OR (CONC_PORC IS NULL AND :porcen = 0) OR (CONC_PORC = 0 AND :porcen IS NULL) OR (CONC_PORC IS NULL AND :porcen IS NULL) ) THEN
        BEGIN
        IF ((conc_monto <> 0) AND (conc_monto IS NOT NULL) ) THEN
        BEGIN
        VALOR = :CONC_MONTO/30 * :diaslab;
        EXECUTE PROCEDURE REDONDEE(:valor, 5) RETURNING_VALUES (VALOR);
        END
        ELSE
        IF (salario = 'S' AND CONC_COD <> 900 AND CONC_COD <> 920) THEN
        BEGIN
        conc_monto = :basico;
        VALOR = (:conc_monto/30 * :diaslab ) + :cambsaltrans;
        EXECUTE PROCEDURE REDONDEE(:valor, 5) RETURNING_VALUES (VALOR);
        END
        ELSE
        valor = montos;
        END
       ELSE
       BEGIN
        IF (:porcen <> 0) THEN
          BEGIN
            IF ((conc_monto <> 0) AND (conc_monto IS NOT NULL) ) THEN
            BEGIN
              VALOR = ((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans * :PORCEN) /100;
              EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
            END
          END
          ELSE
          BEGIN
            IF ((conc_monto <> 0) AND (conc_monto IS NOT NULL) ) THEN
            BEGIN
              VALOR = ((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans * :conc_porc) /100;
              EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
            END
            ELSE
        IF (salario = 'S' AND CONC_COD <> 900 AND CONC_COD <> 920) THEN
            BEGIN
              conc_monto = :basico;
              VALOR = ((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans * :conc_porc) /100;
              EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
            END
          END
       END
      END
    ELSE
    BEGIN
      IF (CONC_PORC = 0 AND :porcen = 0) THEN
      BEGIN
      VALOR = (:montos/30 * :diaslab);
      EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
      END
      ELSE
      BEGIN
        IF (:porcen <> 0) THEN
          BEGIN
          VALOR = ((:MONTOS/30 * :diaslab )+ :cambsaltrans * :PORCEN) /100;
          EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
          END
          ELSE
          BEGIN
          VALOR = ((:montos/30 * :diaslab )+ :cambsaltrans * :CONC_PORC) /100;
          END
          EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
       END
   END
    IF (conc_promedio = 'S') THEN
    BEGIN
    perinicial = :periodo - (:numeroprom) + 1;
    anoprom = CAST (ano AS INTEGER);
    IF (perinicial <= 0) THEN
    BEGIN
    perinicial = 24 + :PERINICIAL;
    anoprom = CAST(ANO AS INTEGER) - 1;
    END
    SELECT SUM (noco_valor) FROM nomina_conceptos n WHERE n.noco_aplicaprom = 'S' AND N.noco_periodo >= :perinicial - 1 AND N.noco_periodo < :periodo AND N.noco_ano >= :anoprom AND N.noco_ano <= :ano AND terc_nit = :nite INTO :valor;
    valor = (valor / numeroprom)/*/ 30 * :diaslab*/;
    SELECT NOCO_VALOR FROM NOMINA_CONCEPTOS WHERE CONC_COD = :conc_cod AND TERC_NIT  = :nite AND NOCO_PAGOOK = 'N' AND NOCO_PERIODO = 0 INTO :saldosini;
    IF (saldosini IS NULL) THEN
    saldosini = 0;
    ELSE
    UPDATE nomina_conceptos N SET noco_pagook = 'S' WHERE n.noco_aplicaprom = 'S' AND N.noco_periodo >= :perinicial - 1 AND N.noco_periodo < :periodo AND N.noco_ano >= :anoprom AND N.noco_ano <= :ano  AND CONC_COD = :conc_cod AND terc_nit = :nite AND NOCO_PERIODO = 0;
    VALOR = :valor + :saldosini;
    EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
    UPDATE nomina_conceptos N SET noco_pagook = 'S' WHERE n.noco_aplicaprom = 'S' AND N.noco_periodo >= :perinicial - 1 AND N.noco_periodo < :periodo AND N.noco_ano >= :anoprom AND N.noco_ano <= :ano  AND CONC_COD = :conc_cod AND terc_nit = :nite;
    END
    IF (conc_otroconc = 'S') THEN
    BEGIN
    anosum = CAST(ano AS INTEGER);
    anosum = anosum - 1;
    SELECT SUM (noco_valor) FROM nomina_conceptos n WHERE n.noco_ano = :anosum AND n.conc_cod = :conc_codotroconc AND N.terc_nit = :nite INTO :valor;
    SELECT NOCO_VALOR FROM NOMINA_CONCEPTOS WHERE noco_ano = :anosum AND conc_cod = :conc_codotroconc AND terc_nit = :nite AND NOCO_PERIODO = 0 INTO :saldosini;
    IF (saldosini IS NULL) THEN
    saldosini = 0;
    ELSE
    UPDATE nomina_conceptos SET noco_pagook = 'S' WHERE noco_ano = :anosum AND conc_cod = :conc_codotroconc AND NOCO_PERIODO = 0 AND terc_nit = :nite;
    VALOR = :valor + :saldosini;
    UPDATE nomina_conceptos SET noco_pagook = 'S' WHERE noco_ano = :anosum AND conc_cod = :conc_codotroconc AND terc_nit = :nite;
    END
/*SI EL CONCEPTO ES UN APORTE*/
IF (conc_aporte = 'S') THEN
BEGIN
    IF ((:entidad = '' ) OR (entidad IS NULL)) THEN
    BEGIN
     SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
     IF (comision IS NULL) THEN
     comision = 0;
     valor = :basico + :comision;
    IF ((conc_cod = 904) OR (conc_cod = 905) OR (conc_cod = 906)) THEN
            BEGIN
            entidad = :nitafp;
                IF (conc_cod = 904) THEN
                BEGIN
                SELECT A.paan_afptr FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = (((((:basico /30) * :diaslab ) + :comision)+ :cambsaltrans) * :PORCEN) /100;
                END
                ELSE
                IF ((conc_cod = 905) OR (conc_cod = 906)) THEN
                BEGIN
                SELECT A.paan_afpem FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = (((((:basico /30) * :diaslab ) + :comision)+ :cambsaltrans) * :PORCEN) /100;
                END
                EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
            END
            ELSE
       IF ((conc_cod = 907) OR (conc_cod = 914) OR (conc_cod = 915)) THEN
            BEGIN
            entidad = :niteps;
                IF (conc_cod = 907) THEN
                BEGIN
                SELECT A.paan_epstr FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = (((((:basico )/30 * :diaslab ) + :comision)+ :cambsaltrans) * :PORCEN) /100;
                END
                ELSE
                IF ((conc_cod = 914) OR (conc_cod = 915)) THEN
                BEGIN
                SELECT A.paan_epsem FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = (((((:basico )/30 * :diaslab ) + :comision)+ :cambsaltrans) * :PORCEN) /100;
                END
                EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
            END
            ELSE
       IF ((conc_cod = 910) OR (conc_cod = 911) OR (conc_cod = 916) OR (conc_cod = 917) OR (conc_cod = 918) OR (conc_cod = 919)) THEN
            BEGIN
            entidad = :nitccf;
            SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
            IF (comision IS NULL) THEN
            comision = 0;
                IF ((conc_cod = 910) OR (conc_cod = 911) ) THEN
                BEGIN
                SELECT A.paan_ccf FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = (((((:basico )/30 * :diaslab ) + :comision)+ :cambsaltrans) * :PORCEN) /100;
                EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
                END
                ELSE
                IF ((conc_cod = 916) OR (conc_cod = 917)) THEN
                BEGIN
                SELECT A.paan_icbf FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = (((((:basico )/30 * :diaslab ) + :comision)+ :cambsaltrans) * :PORCEN) /100;
                EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
                END
                ELSE
                IF ((conc_cod = 918) OR (conc_cod = 919)) THEN
                BEGIN
                SELECT A.paan_sena FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = (((((:basico )/30 * :diaslab ) + :comision)+ :cambsaltrans) * :PORCEN) /100;
                EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
                END
            END
            ELSE
        IF ((conc_cod = 912) OR (conc_cod = 913)) THEN
            BEGIN
            entidad = :nitafc;
            SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
            IF (comision IS NULL) THEN
            comision = 0;
                IF ((conc_cod = 912) OR (conc_cod = 913) ) THEN
                BEGIN
                SELECT A.paan_cesemp FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = ((((:basico + :comision)/30 * :diaslab )+ :cambsaltrans) * :PORCEN) /100;
                EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
                END
            END
            ELSE
        BEGIN
        IF (comision IS NULL) THEN
        comision = 0;
        SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
        conc_monto = :basico + :comision;
        IF (conc_porc <> 0 AND conc_porc IS NOT NULL) THEN
        VALOR = (((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans) * :conc_porc) /100;
        ELSE
        IF (:porcen <> 0 AND :porcen IS NOT NULL) THEN
        VALOR = (((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans) * :porcen) /100;
        ELSE
        IF (:montos <> 0 AND :montos IS NOT NULL) THEN
        valor = :montos;
        ELSE
        IF (:conc_monto <> 0 AND :conc_monto IS NOT NULL) THEN
        valor = :conc_monto;
        EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
        END
    END
    END
    ELSE
    IF (conc_prov = 'S') THEN
    BEGIN
        conc_monto = :basico;
        IF (conc_porc <> 0 AND conc_porc IS NOT NULL) THEN
        VALOR = (((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans) * :conc_porc) /100;
        ELSE
        IF (porcen <> 0 AND porcen IS NOT NULL) THEN
        VALOR = (((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans) * :porcen) /100;
        ELSE
        IF (montos <> 0 AND montos IS NOT NULL) THEN
        VALOR = :montos;
        ELSE
        IF (conc_monto <> 0 AND conc_monto IS NOT NULL) THEN
        VALOR = :conc_monto;
        EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
    END
item = :item + 1;
END
IF (conc_cod = 920) THEN
 BEGIN
 SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :valor;
 IF (valor IS NULL) THEN
 valor = 0;
 item = :item + 1;
 END
    IF (liquidaper = 0) THEN
    INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
    VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
    ELSE
    IF (liquidaper = 1) THEN
    BEGIN
    rmod = mod(:periodo, 2);
    IF (rmod = 0) THEN
        INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
        VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
    END
    ELSE
    IF (liquidaper = 2) THEN
    BEGIN
    rmod = mod(:periodo, 4);
    IF (rmod = 0) THEN
        INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
        VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
    END
END
END
END
ELSE
/*SI ES SEMANAL*/
IF (periodicidad = 3) THEN
BEGIN
EXECUTE PROCEDURE cambie_id_nomina RETURNING_VALUES(:idnomina);
INSERT INTO nomina (nomi_id, NOMI_FECCAUSA, NOMI_PAGOGLOBAL, NOMI_PERIODOCIDAD, NOMI_PERIODO, NOMI_ANO, NOMI_LIQOK)
VALUES (:IDNOMINA, :fec,:pagoglobal, :periodicidad, :periodo, :ano, 'N');
    BEGIN
    item = 1;
    FOR SELECT E.TERC_NIT, E.empl_salario, e.empl_eps, e.empl_afc, e.empl_afp, e.empl_ccf
    FROM EMPLEADOS E
    WHERE E.empl_ppago = 3
    INTO :nite, :basico, :niteps, :nitafc, :nitafp, :nitccf
    DO
    BEGIN
    FOR SELECT CE.TERC_NIT, CE.CONC_COD, CE.EMCO_MONTO, CE.EMCO_PORC, ce.empl_entidad, CE.emco_perprom, CE.emco_luquidaper,    CN.CONC_COD, CN.CONC_DEDUC,CN.CONC_PORC, CN.CONC_ENTIDAD, CN.CONC_MONTO,  CN.CONC_DIAS, CN.CONC_MODIFI,
    CN.CONC_PROMEDIO, CN.conc_salario, CE.emco_perprom, CN.conc_prov, CN.conc_aporte, CN.conc_aplicaprom, cn.conc_otroconc, cn.conc_codotroconc, CN.conc_gtoempr
    FROM empleado_conceptos CE, CONCEPTOS_NOMINA CN WHERE ((CE.terc_nit = :nite) AND (CE.CONC_COD = CN.CONC_COD) AND (CN.conc_fecini <= :fec AND CN.conc_fecfin >= :FEC) ) OR ((CE.terc_nit = :nite)
    AND (CE.CONC_COD = CN.CONC_COD) AND (cn.conc_todosper = 'N') AND (CE.emco_ppago = :periodo)) OR  ((CE.terc_nit = :nite) AND (CE.CONC_COD = CN.CONC_COD) AND cn.conc_todosper = 'S')  ORDER BY (TERC_NIT)
    INTO :nit_tercero, :concept,  :montos, :porcen, :entidad, :numeroprom, :liquidaper ,:CONC_COD, :CONC_DEDUC, :CONC_PORC,
    :CONC_ENTIDAD, :CONC_MONTO, :CONC_DIAS, :CONC_MODIFI,:CONC_PROMEDIO, :salario,:EMCO_PERPROM, :conc_prov, :conc_aporte , :CONC_APLICAPROM, :conc_otroconc, :conc_codotroconc, :gtoempr
    DO
BEGIN
    IF (conc_dias = 'S') THEN
    EXECUTE PROCEDURE DIAS_LABORADOS (:nite, :periodo, :fec) RETURNING_VALUES (:diaslab);
    ELSE
    BEGIN
    IF (liquidaper = 0) THEN
    diaslab = 7;
    ELSE
    IF (liquidaper = 1) THEN
    diaslab = 15;
    ELSE
    IF (liquidaper = 2) THEN
    diaslab = 30;
    END
 SELECT ((n.nono_valor /30) * n.nono_dura), (n.nono_dura) FROM nomina_novedades n WHERE n.tnov_cod = 11 AND n.terc_nit = :nite AND n.nono_periodo = :periodo INTO :cambsaltrans, :duranov;
 IF (cambsaltrans IS NULL) THEN
 cambsaltrans = 0;
 if (duranov is null) then
 duranov = 0;
 diaslab = :diaslab - :duranov;
 IF (conc_cod = 920) THEN
 BEGIN
 SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :valor;
 IF (valor IS NULL) THEN
 valor = 0;
 item = :item + 1;
 END
 ELSE
 if (conc_cod = 921) then
 begin
 if (porcen IS NOT NULL AND porcen <> 0) then
 valor = ((basico / 30)* :diaslab ) * :PORCEN /100;
 ELSE
 if (conc_porc IS NOT null AND conc_porc <> 0) then
 valor = ((:basico / 30)* :diaslab ) * :conc_porc /100;
 EXECUTE PROCEDURE REDONDEE(:valor, 5) RETURNING_VALUES (VALOR);
 end
 ELSE
 if (conc_cod = 922) then
 BEGIN
 SELECT P.prcu_monto FROM prestamo_cuotas P, prestamo_nomina PN WHERE P.prcu_ano = :ano AND P.prcu_periodo = :periodo AND PN.prno_id = P.prno_id AND PN.terc_nit = :nite INTO :valor;
 IF (valor IS NULL) THEN
 valor = 0;
 EXECUTE PROCEDURE REDONDEE(:valor, 5) RETURNING_VALUES (VALOR);
 item = :item + 1;
 update prestamo_cuotas  P SET prcu_ok = 'S' WHERE P.prcu_ano = :ano AND P.prcu_periodo = :periodo AND P.prno_id = (SELECT PN.prno_id FROM PRESTAMO_NOMINA PN WHERE PN.terc_nit = :nite);
 END
 ELSE
 BEGIN
    IF ((:montos = 0) OR (:montos IS NULL)) THEN
      BEGIN
      IF ((CONC_PORC = 0 AND :porcen = 0) OR (CONC_PORC IS NULL AND :porcen = 0) OR (CONC_PORC = 0 AND :porcen IS NULL) OR (CONC_PORC IS NULL AND :porcen IS NULL) ) THEN
        BEGIN
        IF ((conc_monto <> 0) AND (conc_monto IS NOT NULL) ) THEN
        BEGIN
        VALOR = :CONC_MONTO/30 * :diaslab;
        EXECUTE PROCEDURE REDONDEE(:valor, 5) RETURNING_VALUES (VALOR);
        END
        ELSE
        IF (salario = 'S' AND CONC_COD <> 900 AND CONC_COD <> 920) THEN
        BEGIN
        conc_monto = :basico;
        VALOR = (:conc_monto/30 * :diaslab ) + :cambsaltrans;
        EXECUTE PROCEDURE REDONDEE(:valor, 5) RETURNING_VALUES (VALOR);
        END
        ELSE
        valor = montos;
        END
       ELSE
       BEGIN
        IF (:porcen <> 0) THEN
          BEGIN
            IF ((conc_monto <> 0) AND (conc_monto IS NOT NULL) ) THEN
            BEGIN
              VALOR = ((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans * :PORCEN) /100;
              EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
            END
          END
          ELSE
          BEGIN
            IF ((conc_monto <> 0) AND (conc_monto IS NOT NULL) ) THEN
            BEGIN
              VALOR = ((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans * :conc_porc) /100;
              EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
            END
            ELSE
        IF (salario = 'S' AND CONC_COD <> 900 AND CONC_COD <> 920) THEN
            BEGIN
              conc_monto = :basico;
              VALOR = ((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans * :conc_porc) /100;
              EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
            END
          END
       END
      END
    ELSE
    BEGIN
      IF (CONC_PORC = 0 AND :porcen = 0) THEN
      BEGIN
      VALOR = (:montos/30 * :diaslab);
      EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
      END
      ELSE
      BEGIN
        IF (:porcen <> 0) THEN
          BEGIN
          VALOR = ((:MONTOS/30 * :diaslab )+ :cambsaltrans * :PORCEN) /100;
          EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
          END
          ELSE
          BEGIN
          VALOR = ((:montos/30 * :diaslab )+ :cambsaltrans * :CONC_PORC) /100;
          END
          EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
       END
   END
    IF (conc_promedio = 'S') THEN
    BEGIN
    perinicial = :periodo - (:numeroprom) + 1;
    anoprom = CAST (ano AS INTEGER);
    IF (perinicial <= 0) THEN
    BEGIN
    perinicial = 24 + :PERINICIAL;
    anoprom = CAST(ANO AS INTEGER) - 1;
    END
    SELECT SUM (noco_valor) FROM nomina_conceptos n WHERE n.noco_aplicaprom = 'S' AND N.noco_periodo >= :perinicial - 1 AND N.noco_periodo < :periodo AND N.noco_ano >= :anoprom AND N.noco_ano <= :ano AND terc_nit = :nite INTO :valor;
    valor = (valor / numeroprom)/*/ 30 * :diaslab*/;
    SELECT NOCO_VALOR FROM NOMINA_CONCEPTOS WHERE CONC_COD = :conc_cod AND TERC_NIT  = :nite AND NOCO_PAGOOK = 'N' AND NOCO_PERIODO = 0 INTO :saldosini;
    IF (saldosini IS NULL) THEN
    saldosini = 0;
    ELSE
    UPDATE nomina_conceptos N SET noco_pagook = 'S' WHERE n.noco_aplicaprom = 'S' AND N.noco_periodo >= :perinicial - 1 AND N.noco_periodo < :periodo AND N.noco_ano >= :anoprom AND N.noco_ano <= :ano  AND CONC_COD = :conc_cod AND terc_nit = :nite AND NOCO_PERIODO = 0;
    VALOR = :valor + :saldosini;
    EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
    UPDATE nomina_conceptos N SET noco_pagook = 'S' WHERE n.noco_aplicaprom = 'S' AND N.noco_periodo >= :perinicial - 1 AND N.noco_periodo < :periodo AND N.noco_ano >= :anoprom AND N.noco_ano <= :ano  AND CONC_COD = :conc_cod AND terc_nit = :nite;
    END
    IF (conc_otroconc = 'S') THEN
    BEGIN
    anosum = CAST(ano AS INTEGER);
    anosum = anosum - 1;
    SELECT SUM (noco_valor) FROM nomina_conceptos n WHERE n.noco_ano = :anosum AND n.conc_cod = :conc_codotroconc AND N.terc_nit = :nite INTO :valor;
    SELECT NOCO_VALOR FROM NOMINA_CONCEPTOS WHERE noco_ano = :anosum AND conc_cod = :conc_codotroconc AND terc_nit = :nite AND NOCO_PERIODO = 0 INTO :saldosini;
    IF (saldosini IS NULL) THEN
    saldosini = 0;
    ELSE
    UPDATE nomina_conceptos SET noco_pagook = 'S' WHERE noco_ano = :anosum AND conc_cod = :conc_codotroconc AND NOCO_PERIODO = 0 AND terc_nit = :nite;
    VALOR = :valor + :saldosini;
    UPDATE nomina_conceptos SET noco_pagook = 'S' WHERE noco_ano = :anosum AND conc_cod = :conc_codotroconc AND terc_nit = :nite;
    END
/*SI EL CONCEPTO ES UN APORTE*/
IF (conc_aporte = 'S') THEN
BEGIN
    IF ((:entidad = '' ) OR (entidad IS NULL)) THEN
    BEGIN
     SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
     IF (comision IS NULL) THEN
     comision = 0;
     valor = :basico + :comision;
    IF ((conc_cod = 904) OR (conc_cod = 905) OR (conc_cod = 906)) THEN
            BEGIN
            entidad = :nitafp;
                IF (conc_cod = 904) THEN
                BEGIN
                SELECT A.paan_afptr FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = (((((:basico /30) * :diaslab ) + :comision)+ :cambsaltrans) * :PORCEN) /100;
                END
                ELSE
                IF ((conc_cod = 905) OR (conc_cod = 906)) THEN
                BEGIN
                SELECT A.paan_afpem FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = (((((:basico /30) * :diaslab ) + :comision)+ :cambsaltrans) * :PORCEN) /100;
                END
                EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
            END
            ELSE
       IF ((conc_cod = 907) OR (conc_cod = 914) OR (conc_cod = 915)) THEN
            BEGIN
            entidad = :niteps;
                IF (conc_cod = 907) THEN
                BEGIN
                SELECT A.paan_epstr FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = (((((:basico )/30 * :diaslab ) + :comision)+ :cambsaltrans) * :PORCEN) /100;
                END
                ELSE
                IF ((conc_cod = 914) OR (conc_cod = 915)) THEN
                BEGIN
                SELECT A.paan_epsem FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = (((((:basico )/30 * :diaslab ) + :comision)+ :cambsaltrans) * :PORCEN) /100;
                END
                EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
            END
            ELSE
       IF ((conc_cod = 910) OR (conc_cod = 911) OR (conc_cod = 916) OR (conc_cod = 917) OR (conc_cod = 918) OR (conc_cod = 919)) THEN
            BEGIN
            entidad = :nitccf;
            SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
            IF (comision IS NULL) THEN
            comision = 0;
                IF ((conc_cod = 910) OR (conc_cod = 911) ) THEN
                BEGIN
                SELECT A.paan_ccf FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = (((((:basico )/30 * :diaslab ) + :comision)+ :cambsaltrans) * :PORCEN) /100;
                EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
                END
                ELSE
                IF ((conc_cod = 916) OR (conc_cod = 917)) THEN
                BEGIN
                SELECT A.paan_icbf FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = (((((:basico )/30 * :diaslab ) + :comision)+ :cambsaltrans) * :PORCEN) /100;
                EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
                END
                ELSE
                IF ((conc_cod = 918) OR (conc_cod = 919)) THEN
                BEGIN
                SELECT A.paan_sena FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = (((((:basico )/30 * :diaslab ) + :comision)+ :cambsaltrans) * :PORCEN) /100;
                EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
                END
            END
            ELSE
        IF ((conc_cod = 912) OR (conc_cod = 913)) THEN
            BEGIN
            entidad = :nitafc;
            SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
            IF (comision IS NULL) THEN
            comision = 0;
                IF ((conc_cod = 912) OR (conc_cod = 913) ) THEN
                BEGIN
                SELECT A.paan_cesemp FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = ((((:basico + :comision)/30 * :diaslab )+ :cambsaltrans) * :PORCEN) /100;
                EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
                END
            END
            ELSE
        BEGIN
        IF (comision IS NULL) THEN
        comision = 0;
        SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
        conc_monto = :basico + :comision;
        IF (conc_porc <> 0 AND conc_porc IS NOT NULL) THEN
        VALOR = (((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans) * :conc_porc) /100;
        ELSE
        IF (:porcen <> 0 AND :porcen IS NOT NULL) THEN
        VALOR = (((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans) * :porcen) /100;
        ELSE
        IF (:montos <> 0 AND :montos IS NOT NULL) THEN
        valor = :montos;
        ELSE
        IF (:conc_monto <> 0 AND :conc_monto IS NOT NULL) THEN
        valor = :conc_monto;
        EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
        END
    END
    END
    ELSE
    IF (conc_prov = 'S') THEN
    BEGIN
        conc_monto = :basico;
        IF (conc_porc <> 0 AND conc_porc IS NOT NULL) THEN
        VALOR = (((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans) * :conc_porc) /100;
        ELSE
        IF (porcen <> 0 AND porcen IS NOT NULL) THEN
        VALOR = (((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans) * :porcen) /100;
        ELSE
        IF (montos <> 0 AND montos IS NOT NULL) THEN
        VALOR = :montos;
        ELSE
        IF (conc_monto <> 0 AND conc_monto IS NOT NULL) THEN
        VALOR = :conc_monto;
        EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
    END
item = :item + 1;
END
    IF (liquidaper = 0) THEN
    INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
    VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
    ELSE
    IF (liquidaper = 1) THEN
    BEGIN
    rmod = mod(:periodo, 2);
    IF (rmod = 0) THEN
        INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
        VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
    END
    ELSE
    IF (liquidaper = 2) THEN
    BEGIN
    rmod = mod(:periodo, 4);
    IF (rmod = 0) THEN
        INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
        VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
    END
END
END
END
END
SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;


/******************************************************************************/
/****                         Triggers for tables                          ****/
/******************************************************************************/

ALTER TABLE NOMINA_DETALLE ADD NODE_DIASLAB INTEGER;
^

/* Trigger: NOMINA_DETALLE_BI */
CREATE TRIGGER NOMINA_DETALLE_BI FOR NOMINA_DETALLE
ACTIVE BEFORE INSERT POSITION 0
as
declare variable PERIODO INTEGER;
declare variable fec date;
begin
SELECT N.nomi_periodo, n.nomi_feccausa FROM NOMINA N WHERE N.nomi_id = NEW.nomi_id INTO :periodo, :fec;
EXECUTE PROCEDURE DIAS_LABORADOS (NEW.terc_nit, :periodo, :fec)returning_values(NEW.node_diaslab);
end
^


SET TERM ; ^



/******************************************************************************/
/****                              Privileges                              ****/
/******************************************************************************/


/* Privileges of triggers */
GRANT SELECT ON NOMINA TO TRIGGER NOMINA_DETALLE_BI;
GRANT UPDATE, REFERENCES ON NOMINA_DETALLE TO TRIGGER NOMINA_DETALLE_BI;
GRANT EXECUTE ON PROCEDURE DIAS_LABORADOS TO TRIGGER NOMINA_DETALLE_BI;

SET TERM ^ ;

ALTER TRIGGER NOMINA_DETALLE_BI
ACTIVE BEFORE INSERT POSITION 0
as
declare variable PERIODO INTEGER;
declare variable fec date;
begin
SELECT N.nomi_periodo, n.nomi_feccausa FROM NOMINA N WHERE N.nomi_id = NEW.nomi_id INTO :periodo, :fec;
EXECUTE PROCEDURE DIAS_LABORADOS (NEW.terc_nit, :periodo, :fec)returning_values(NEW.node_diaslab);
end
^



CREATE TRIGGER NOMINA_CONCEPTOS_BU FOR NOMINA_CONCEPTOS
ACTIVE BEFORE UPDATE POSITION 0
as
begin
  if ((new.noco_deduc = 'S') and (new.noco_valor > 0)) then
  NEW.noco_valor = NEW.noco_valor * (-1);
end
^
SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE CAUSA_NOMINA(
    FEC DATE,
    PERIODO INTEGER,
    PERIODICIDAD INTEGER,
    PAGOGLOBAL CHAR(1),
    ANO CHAR(4))
RETURNS (
    IDNOMINA INTEGER)
AS
DECLARE VARIABLE item INTEGER;
DECLARE VARIABLE nite VARCHAR(20) CHARACTER SET none;
DECLARE VARIABLE nit_tercero VARCHAR(20);
DECLARE VARIABLE concept INTEGER;
DECLARE VARIABLE montos NUMERIC(18,2);
DECLARE VARIABLE porcen NUMERIC(9,4);
DECLARE VARIABLE entidad VARCHAR(20);
DECLARE VARIABLE conc_cod INTEGER;
DECLARE VARIABLE conc_deduc CHAR(1);
DECLARE VARIABLE conc_porc NUMERIC(9,4);
DECLARE VARIABLE conc_entidad INTEGER;
DECLARE VARIABLE conc_monto NUMERIC(18,2);
DECLARE VARIABLE conc_modifi CHAR(1);
DECLARE VARIABLE conc_promedio CHAR(1);
DECLARE VARIABLE emco_perprom INTEGER;
DECLARE VARIABLE valor NUMERIC(18,2);
DECLARE VARIABLE diaslab INTEGER;
DECLARE VARIABLE conc_prov CHAR(1);
DECLARE VARIABLE conc_aporte CHAR(1);
DECLARE VARIABLE numeroprom INTEGER;
DECLARE VARIABLE conc_aplicaprom CHAR(1);
DECLARE VARIABLE perinicial INTEGER;
DECLARE VARIABLE anoprom INTEGER;
DECLARE VARIABLE conc_dias CHAR(1);
DECLARE VARIABLE conc_otroconc CHAR(1);
DECLARE VARIABLE conc_codotroconc INTEGER;
DECLARE VARIABLE anosum INTEGER;
DECLARE VARIABLE salario CHAR(1) CHARACTER SET none;
DECLARE VARIABLE liquidaper INTEGER;
DECLARE VARIABLE rmod NUMERIC(2,2);
DECLARE VARIABLE basico NUMERIC(18,2);
DECLARE VARIABLE niteps VARCHAR(20);
DECLARE VARIABLE nitafc VARCHAR(20);
DECLARE VARIABLE nitafp VARCHAR(20);
DECLARE VARIABLE nitccf VARCHAR(20);
DECLARE VARIABLE gtoempr CHAR(1);
DECLARE VARIABLE comision NUMERIC(18,2);
DECLARE VARIABLE cambsaltrans NUMERIC(18,2);
DECLARE VARIABLE SALDOSINI NUMERIC(18,2);
DECLARE VARIABLE duranov INTEGER;
DECLARE VARIABLE base NUMERIC(18,2);
BEGIN
/*SI ES QUINCENAL*/ /*$$IBE$$ 
IF (periodicidad = 2) THEN
BEGIN
EXECUTE PROCEDURE cambie_id_nomina RETURNING_VALUES(:idnomina);
INSERT INTO nomina (nomi_id, NOMI_FECCAUSA, NOMI_PAGOGLOBAL, NOMI_PERIODOCIDAD, NOMI_PERIODO, NOMI_ANO, NOMI_LIQOK)
VALUES (:IDNOMINA, :fec,:pagoglobal, :periodicidad, :periodo, :ano, 'N');
 BEGIN
    item = 1;
    FOR SELECT E.TERC_NIT, E.empl_salario, e.empl_eps, e.empl_afc, e.empl_afp, e.empl_ccf
    FROM EMPLEADOS E
    WHERE E.empl_ppago = 2
    INTO :nite, :basico, :niteps, :nitafc, :nitafp, :nitccf
    DO
    BEGIN
    FOR SELECT CE.TERC_NIT, CE.CONC_COD, CE.EMCO_MONTO, CE.EMCO_PORC, ce.empl_entidad, CE.emco_perprom, CE.emco_luquidaper, CN.CONC_COD, CN.CONC_DEDUC,CN.CONC_PORC, CN.CONC_ENTIDAD, CN.CONC_MONTO,  CN.CONC_DIAS, CN.CONC_MODIFI,
    CN.CONC_PROMEDIO, CN.conc_salario, CE.emco_perprom, CN.conc_prov, CN.conc_aporte, CN.conc_aplicaprom, cn.conc_otroconc, cn.conc_codotroconc, CN.conc_gtoempr, CN.conc_base
    FROM empleado_conceptos CE, CONCEPTOS_NOMINA CN WHERE ((CE.terc_nit = :nite) AND (CE.CONC_COD = CN.CONC_COD) AND (CN.conc_fecini <= :fec AND CN.conc_fecfin >= :FEC) ) OR ((CE.terc_nit = :nite)
    AND (CE.CONC_COD = CN.CONC_COD) AND (cn.conc_todosper = 'N') AND (CE.emco_ppago = :periodo)) OR  ((CE.terc_nit = :nite) AND (CE.CONC_COD = CN.CONC_COD) AND cn.conc_todosper = 'S')  ORDER BY (TERC_NIT )
    INTO :nit_tercero, :concept,  :montos, :porcen, :entidad, :numeroprom, :liquidaper ,:CONC_COD, :CONC_DEDUC, :CONC_PORC,
    :CONC_ENTIDAD, :CONC_MONTO, :CONC_DIAS, :CONC_MODIFI,:CONC_PROMEDIO, :salario,:EMCO_PERPROM, :conc_prov, :conc_aporte , :CONC_APLICAPROM, :conc_otroconc, :conc_codotroconc, :gtoempr, :base
    DO
BEGIN
    IF (conc_dias = 'S') THEN
    EXECUTE PROCEDURE DIAS_LABORADOS (:nite, :periodo, :fec) RETURNING_VALUES (:diaslab);
    ELSE
    BEGIN
    IF (liquidaper = 0) THEN
    diaslab = 15;
    ELSE
    IF (liquidaper = 1) THEN
    diaslab = 30;
    ELSE
    IF (liquidaper = 2) THEN
    diaslab = 60;
    END
 SELECT ((n.nono_valor /30) * n.nono_dura), (n.nono_dura) FROM nomina_novedades n WHERE n.tnov_cod = 11 AND n.terc_nit = :nite AND n.nono_periodo = :periodo INTO :cambsaltrans, :duranov;
 IF (cambsaltrans IS NULL) THEN
 cambsaltrans = 0;
 if (duranov is null) then
 duranov = 0;
 diaslab = :diaslab - :duranov;
 if (conc_cod = 921) then
 begin
 if (porcen IS NOT NULL AND porcen <> 0) then
 valor = ((basico / 30)* :diaslab ) * :PORCEN /100;
 ELSE
 if (conc_porc IS NOT null AND conc_porc <> 0) then
 valor = ((:basico / 30)* :diaslab ) * :conc_porc /100;
 EXECUTE PROCEDURE REDONDEE(:valor, 5) RETURNING_VALUES (VALOR);
 end
 ELSE
 if (conc_cod = 922) then
 BEGIN
 SELECT P.prcu_monto FROM prestamo_cuotas P, prestamo_nomina PN WHERE P.prcu_ano = :ano AND P.prcu_periodo = :periodo AND PN.prno_id = P.prno_id AND PN.terc_nit = :nite INTO :valor;
 IF (valor IS NULL) THEN
 valor = 0;
 EXECUTE PROCEDURE REDONDEE(:valor, 5) RETURNING_VALUES (VALOR);
 item = :item + 1;
 update prestamo_cuotas  P SET prcu_ok = 'S' WHERE P.prcu_ano = :ano AND P.prcu_periodo = :periodo AND P.prno_id = (SELECT PN.prno_id FROM PRESTAMO_NOMINA PN WHERE PN.terc_nit = :nite);
 END
 ELSE
 BEGIN
    IF ((:montos = 0) OR (:montos IS NULL)) THEN
      BEGIN
      IF ((CONC_PORC = 0 AND :porcen = 0) OR (CONC_PORC IS NULL AND :porcen = 0) OR (CONC_PORC = 0 AND :porcen IS NULL) OR (CONC_PORC IS NULL AND :porcen IS NULL) ) THEN
        BEGIN
        IF ((conc_monto <> 0) AND (conc_monto IS NOT NULL) ) THEN
        BEGIN
        VALOR = :CONC_MONTO/30 * :diaslab;
        EXECUTE PROCEDURE REDONDEE(:valor, 5) RETURNING_VALUES (VALOR);
        END
        ELSE
        IF (salario = 'S' AND CONC_COD <> 900 AND CONC_COD <> 920) THEN
        BEGIN
        conc_monto = :basico;
        VALOR = (:conc_monto/30 * :diaslab ) + :cambsaltrans;
        EXECUTE PROCEDURE REDONDEE(:valor, 5) RETURNING_VALUES (VALOR);
        END
        ELSE
        valor = montos;
        END
       ELSE
       BEGIN
        IF (:porcen <> 0) THEN
          BEGIN
            IF ((conc_monto <> 0) AND (conc_monto IS NOT NULL) ) THEN
            BEGIN
              VALOR = ((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans * :PORCEN) /100;
              EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
            END
          END
          ELSE
          BEGIN
            IF ((conc_monto <> 0) AND (conc_monto IS NOT NULL) ) THEN
            BEGIN
              VALOR = ((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans * :conc_porc) /100;
              EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
            END
            ELSE
        IF (salario = 'S' AND CONC_COD <> 900 AND CONC_COD <> 920) THEN
            BEGIN
              conc_monto = :basico;
              VALOR = ((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans * :conc_porc) /100;
              EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
            END
          END
       END
      END
    ELSE
    BEGIN
      IF (CONC_PORC = 0 AND :porcen = 0) THEN
      BEGIN
      VALOR = (:montos/30 * :diaslab);
      EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
      END
      ELSE
      BEGIN
        IF (:porcen <> 0) THEN
          BEGIN
          VALOR = ((:MONTOS/30 * :diaslab )+ :cambsaltrans * :PORCEN) /100;
          EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
          END
          ELSE
          BEGIN
          VALOR = ((:montos/30 * :diaslab )+ :cambsaltrans * :CONC_PORC) /100;
          END
          EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
       END
   END
    IF (conc_promedio = 'S') THEN
    BEGIN
    perinicial = :periodo - (:numeroprom) + 1;
    anoprom = CAST (ano AS INTEGER);
    IF (perinicial <= 0) THEN
    BEGIN
    perinicial = 24 + :PERINICIAL;
    anoprom = CAST(ANO AS INTEGER) - 1;
    END
    SELECT SUM (noco_valor) FROM nomina_conceptos n WHERE n.noco_aplicaprom = 'S' AND N.noco_periodo >= :perinicial - 1 AND N.noco_periodo < :periodo AND N.noco_ano >= :anoprom AND N.noco_ano <= :ano AND terc_nit = :nite INTO :valor;
    valor = (valor / numeroprom) $$IBE$$*/ /*/ 30 * :diaslab*/ /*$$IBE$$ ;
    SELECT NOCO_VALOR FROM NOMINA_CONCEPTOS WHERE CONC_COD = :conc_cod AND TERC_NIT  = :nite AND NOCO_PAGOOK = 'N' AND NOCO_PERIODO = 0 INTO :saldosini;
    IF (saldosini IS NULL) THEN
    saldosini = 0;
    ELSE
    UPDATE nomina_conceptos N SET noco_pagook = 'S' WHERE n.noco_aplicaprom = 'S' AND N.noco_periodo >= :perinicial - 1 AND N.noco_periodo < :periodo AND N.noco_ano >= :anoprom AND N.noco_ano <= :ano  AND CONC_COD = :conc_cod AND terc_nit = :nite AND NOCO_PERIODO = 0;
    VALOR = :valor + :saldosini;
    EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
    UPDATE nomina_conceptos N SET noco_pagook = 'S' WHERE n.noco_aplicaprom = 'S' AND N.noco_periodo >= :perinicial - 1 AND N.noco_periodo < :periodo AND N.noco_ano >= :anoprom AND N.noco_ano <= :ano  AND CONC_COD = :conc_cod AND terc_nit = :nite;
    END
    IF (conc_otroconc = 'S') THEN
    BEGIN
    anosum = CAST(ano AS INTEGER);
    anosum = anosum - 1;
    SELECT SUM (noco_valor) FROM nomina_conceptos n WHERE n.noco_ano = :anosum AND n.conc_cod = :conc_codotroconc AND N.terc_nit = :nite INTO :valor;
    SELECT NOCO_VALOR FROM NOMINA_CONCEPTOS WHERE noco_ano = :anosum AND conc_cod = :conc_codotroconc AND terc_nit = :nite AND NOCO_PERIODO = 0 INTO :saldosini;
    IF (saldosini IS NULL) THEN
    saldosini = 0;
    ELSE
    UPDATE nomina_conceptos SET noco_pagook = 'S' WHERE noco_ano = :anosum AND conc_cod = :conc_codotroconc AND NOCO_PERIODO = 0 AND terc_nit = :nite;
    VALOR = :valor + :saldosini;
    UPDATE nomina_conceptos SET noco_pagook = 'S' WHERE noco_ano = :anosum AND conc_cod = :conc_codotroconc AND terc_nit = :nite;
    END
 $$IBE$$*/ /*SI EL CONCEPTO ES UN APORTE*/ /*$$IBE$$ 
IF (conc_aporte = 'S') THEN
BEGIN
    IF ((:entidad = '' ) OR (entidad IS NULL)) THEN
    BEGIN
     SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
     IF (comision IS NULL) THEN
     comision = 0;
     valor = :basico + :comision;
    IF ((conc_cod = 904) OR (conc_cod = 905) OR (conc_cod = 906)) THEN
            BEGIN
            entidad = :nitafp;
                IF (conc_cod = 904) THEN
                BEGIN
                SELECT A.paan_afptr FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = (((((:basico /30) * :diaslab ) + :comision)+ :cambsaltrans) * :PORCEN) /100;
                END
                ELSE
                IF ((conc_cod = 905) OR (conc_cod = 906)) THEN
                BEGIN
                SELECT A.paan_afpem FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = (((((:basico /30) * :diaslab ) + :comision)+ :cambsaltrans) * :PORCEN) /100;
                END
                EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
            END
            ELSE
       IF ((conc_cod = 907) OR (conc_cod = 914) OR (conc_cod = 915)) THEN
            BEGIN
            entidad = :niteps;
                IF (conc_cod = 907) THEN
                BEGIN
                SELECT A.paan_epstr FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = (((((:basico )/30 * :diaslab ) + :comision)+ :cambsaltrans) * :PORCEN) /100;
                END
                ELSE
                IF ((conc_cod = 914) OR (conc_cod = 915)) THEN
                BEGIN
                SELECT A.paan_epsem FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = (((((:basico )/30 * :diaslab ) + :comision)+ :cambsaltrans) * :PORCEN) /100;
                END
                EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
            END
            ELSE
       IF ((conc_cod = 910) OR (conc_cod = 911) OR (conc_cod = 916) OR (conc_cod = 917) OR (conc_cod = 918) OR (conc_cod = 919)) THEN
            BEGIN
            entidad = :nitccf;
            SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
            IF (comision IS NULL) THEN
            comision = 0;
                IF ((conc_cod = 910) OR (conc_cod = 911) ) THEN
                BEGIN
                SELECT A.paan_ccf FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = (((((:basico )/30 * :diaslab ) + :comision)+ :cambsaltrans) * :PORCEN) /100;
                EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
                END
                ELSE
                IF ((conc_cod = 916) OR (conc_cod = 917)) THEN
                BEGIN
                SELECT A.paan_icbf FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = (((((:basico )/30 * :diaslab ) + :comision)+ :cambsaltrans) * :PORCEN) /100;
                EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
                END
                ELSE
                IF ((conc_cod = 918) OR (conc_cod = 919)) THEN
                BEGIN
                SELECT A.paan_sena FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = (((((:basico )/30 * :diaslab ) + :comision)+ :cambsaltrans) * :PORCEN) /100;
                EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
                END
            END
            ELSE
        IF ((conc_cod = 912) OR (conc_cod = 913)) THEN
            BEGIN
            entidad = :nitafc;
            SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
            IF (comision IS NULL) THEN
            comision = 0;
                IF ((conc_cod = 912) OR (conc_cod = 913) ) THEN
                BEGIN
                SELECT A.paan_cesemp FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = ((((:basico + :comision)/30 * :diaslab )+ :cambsaltrans) * :PORCEN) /100;
                EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
                END
            END
            ELSE
        BEGIN
        IF (comision IS NULL) THEN
        comision = 0;
        SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
        conc_monto = :basico + :comision;
        IF (conc_porc <> 0 AND conc_porc IS NOT NULL) THEN
        VALOR = (((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans) * :conc_porc) /100;
        ELSE
        IF (:porcen <> 0 AND :porcen IS NOT NULL) THEN
        VALOR = (((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans) * :porcen) /100;
        ELSE
        IF (:montos <> 0 AND :montos IS NOT NULL) THEN
        valor = :montos;
        ELSE
        IF (:conc_monto <> 0 AND :conc_monto IS NOT NULL) THEN
        valor = :conc_monto;
        EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
        END
    END
    END
    ELSE
    IF (conc_prov = 'S') THEN
    BEGIN
        conc_monto = :basico;
        IF (conc_porc <> 0 AND conc_porc IS NOT NULL) THEN
        VALOR = (((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans) * :conc_porc) /100;
        ELSE
        IF (porcen <> 0 AND porcen IS NOT NULL) THEN
        VALOR = (((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans) * :porcen) /100;
        ELSE
        IF (montos <> 0 AND montos IS NOT NULL) THEN
        VALOR = :montos;
        ELSE
        IF (conc_monto <> 0 AND conc_monto IS NOT NULL) THEN
        VALOR = :conc_monto;
        EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
    END
item = :item + 1;
END
 IF (conc_cod = 920) THEN
 BEGIN
 SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :valor;
 IF (valor IS NULL) THEN
 valor = 0;
 item = :item + 1;
 END
    IF (liquidaper = 0) THEN
    INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
    VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
    ELSE
    IF (liquidaper = 1) THEN
    BEGIN
    rmod = mod(:periodo, 2);
    IF (rmod = 0) THEN
        INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
        VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
    END
    ELSE
    IF (liquidaper = 2) THEN
    BEGIN
    rmod = mod(:periodo, 4);
    IF (rmod = 0) THEN
        INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
        VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
    END
END
END
END
END
ELSE
 $$IBE$$*/ /*SI ES MENSUAL*/ /*$$IBE$$ 
IF (periodicidad = 1) THEN
BEGIN
EXECUTE PROCEDURE cambie_id_nomina RETURNING_VALUES(:idnomina);
INSERT INTO nomina (nomi_id, NOMI_FECCAUSA, NOMI_PAGOGLOBAL, NOMI_PERIODOCIDAD, NOMI_PERIODO, NOMI_ANO, NOMI_LIQOK)
VALUES (:IDNOMINA, :fec,:pagoglobal, :periodicidad, :periodo, :ano, 'N');
    BEGIN
    item = 1;
    FOR SELECT E.TERC_NIT, E.empl_salario, e.empl_eps, e.empl_afc, e.empl_afp, e.empl_ccf
    FROM EMPLEADOS E
    WHERE E.empl_ppago = 1
    INTO :nite, :basico, :niteps, :nitafc, :nitafp, :nitccf
    DO
    FOR SELECT CE.TERC_NIT, CE.CONC_COD, CE.EMCO_MONTO, CE.EMCO_PORC, ce.empl_entidad, CE.emco_perprom, CE.emco_luquidaper,    CN.CONC_COD, CN.CONC_DEDUC,CN.CONC_PORC, CN.CONC_ENTIDAD, CN.CONC_MONTO,  CN.CONC_DIAS, CN.CONC_MODIFI,
    CN.CONC_PROMEDIO, CN.conc_salario, CE.emco_perprom, CN.conc_prov, CN.conc_aporte, CN.conc_aplicaprom, cn.conc_otroconc, cn.conc_codotroconc, CN.conc_gtoempr
    FROM empleado_conceptos CE, CONCEPTOS_NOMINA CN WHERE ((CE.terc_nit = :nite) AND (CE.CONC_COD = CN.CONC_COD) AND (CN.conc_fecini <= :fec AND CN.conc_fecfin >= :FEC) ) OR ((CE.terc_nit = :nite)
    AND (CE.CONC_COD = CN.CONC_COD) AND (cn.conc_todosper = 'N') AND (CE.emco_ppago = :periodo)) OR  ((CE.terc_nit = :nite) AND (CE.CONC_COD = CN.CONC_COD) AND cn.conc_todosper = 'S')  ORDER BY (TERC_NIT)
    INTO :nit_tercero, :concept,  :montos, :porcen, :entidad, :numeroprom, :liquidaper ,:CONC_COD, :CONC_DEDUC, :CONC_PORC,
    :CONC_ENTIDAD, :CONC_MONTO, :CONC_DIAS, :CONC_MODIFI,:CONC_PROMEDIO, :salario,:EMCO_PERPROM, :conc_prov, :conc_aporte , :CONC_APLICAPROM, :conc_otroconc, :conc_codotroconc, :gtoempr    DO
BEGIN
    IF (conc_dias = 'S') THEN
    EXECUTE PROCEDURE DIAS_LABORADOS (:nite, :periodo, :fec) RETURNING_VALUES (:diaslab);
    ELSE
    diaslab = 30;
 SELECT ((n.nono_valor /30) * n.nono_dura), (n.nono_dura) FROM nomina_novedades n WHERE n.tnov_cod = 11 AND n.terc_nit = :nite AND n.nono_periodo = :periodo INTO :cambsaltrans, :duranov;
 IF (cambsaltrans IS NULL) THEN
 cambsaltrans = 0;
 if (duranov is null) then
 duranov = 0;
 diaslab = :diaslab - :duranov;
 if (conc_cod = 921) then
 begin
 if (porcen IS NOT NULL AND porcen <> 0) then
 valor = ((basico / 30)* :diaslab ) * :PORCEN /100;
 ELSE
 if (conc_porc IS NOT null AND conc_porc <> 0) then
 valor = ((:basico / 30)* :diaslab ) * :conc_porc /100;
 EXECUTE PROCEDURE REDONDEE(:valor, 5) RETURNING_VALUES (VALOR);
 end
 ELSE
 if (conc_cod = 922) then
 BEGIN
 SELECT P.prcu_monto FROM prestamo_cuotas P, prestamo_nomina PN WHERE P.prcu_ano = :ano AND P.prcu_periodo = :periodo AND PN.prno_id = P.prno_id AND PN.terc_nit = :nite INTO :valor;
 IF (valor IS NULL) THEN
 valor = 0;
 EXECUTE PROCEDURE REDONDEE(:valor, 5) RETURNING_VALUES (VALOR);
 item = :item + 1;
 update prestamo_cuotas  P SET prcu_ok = 'S' WHERE P.prcu_ano = :ano AND P.prcu_periodo = :periodo AND P.prno_id = (SELECT PN.prno_id FROM PRESTAMO_NOMINA PN WHERE PN.terc_nit = :nite);
 END
 ELSE
 BEGIN
    IF ((:montos = 0) OR (:montos IS NULL)) THEN
      BEGIN
      IF ((CONC_PORC = 0 AND :porcen = 0) OR (CONC_PORC IS NULL AND :porcen = 0) OR (CONC_PORC = 0 AND :porcen IS NULL) OR (CONC_PORC IS NULL AND :porcen IS NULL) ) THEN
        BEGIN
        IF ((conc_monto <> 0) AND (conc_monto IS NOT NULL) ) THEN
        BEGIN
        VALOR = :CONC_MONTO/30 * :diaslab;
        EXECUTE PROCEDURE REDONDEE(:valor, 5) RETURNING_VALUES (VALOR);
        END
        ELSE
        IF (salario = 'S' AND CONC_COD <> 900 AND CONC_COD <> 920) THEN
        BEGIN
        conc_monto = :basico;
        VALOR = (:conc_monto/30 * :diaslab ) + :cambsaltrans;
        EXECUTE PROCEDURE REDONDEE(:valor, 5) RETURNING_VALUES (VALOR);
        END
        ELSE
        valor = montos;
        END
       ELSE
       BEGIN
        IF (:porcen <> 0) THEN
          BEGIN
            IF ((conc_monto <> 0) AND (conc_monto IS NOT NULL) ) THEN
            BEGIN
              VALOR = ((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans * :PORCEN) /100;
              EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
            END
          END
          ELSE
          BEGIN
            IF ((conc_monto <> 0) AND (conc_monto IS NOT NULL) ) THEN
            BEGIN
              VALOR = ((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans * :conc_porc) /100;
              EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
            END
            ELSE
        IF (salario = 'S' AND CONC_COD <> 900 AND CONC_COD <> 920) THEN
            BEGIN
              conc_monto = :basico;
              VALOR = ((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans * :conc_porc) /100;
              EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
            END
          END
       END
      END
    ELSE
    BEGIN
      IF (CONC_PORC = 0 AND :porcen = 0) THEN
      BEGIN
      VALOR = (:montos/30 * :diaslab);
      EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
      END
      ELSE
      BEGIN
        IF (:porcen <> 0) THEN
          BEGIN
          VALOR = ((:MONTOS/30 * :diaslab )+ :cambsaltrans * :PORCEN) /100;
          EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
          END
          ELSE
          BEGIN
          VALOR = ((:montos/30 * :diaslab )+ :cambsaltrans * :CONC_PORC) /100;
          END
          EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
       END
   END
    IF (conc_promedio = 'S') THEN
    BEGIN
    perinicial = :periodo - (:numeroprom) + 1;
    anoprom = CAST (ano AS INTEGER);
    IF (perinicial <= 0) THEN
    BEGIN
    perinicial = 24 + :PERINICIAL;
    anoprom = CAST(ANO AS INTEGER) - 1;
    END
    SELECT SUM (noco_valor) FROM nomina_conceptos n WHERE n.noco_aplicaprom = 'S' AND N.noco_periodo >= :perinicial - 1 AND N.noco_periodo < :periodo AND N.noco_ano >= :anoprom AND N.noco_ano <= :ano AND terc_nit = :nite INTO :valor;
    valor = (valor / numeroprom) $$IBE$$*/ /*/ 30 * :diaslab*/ /*$$IBE$$ ;
    SELECT NOCO_VALOR FROM NOMINA_CONCEPTOS WHERE CONC_COD = :conc_cod AND TERC_NIT  = :nite AND NOCO_PAGOOK = 'N' AND NOCO_PERIODO = 0 INTO :saldosini;
    IF (saldosini IS NULL) THEN
    saldosini = 0;
    ELSE
    UPDATE nomina_conceptos N SET noco_pagook = 'S' WHERE n.noco_aplicaprom = 'S' AND N.noco_periodo >= :perinicial - 1 AND N.noco_periodo < :periodo AND N.noco_ano >= :anoprom AND N.noco_ano <= :ano  AND CONC_COD = :conc_cod AND terc_nit = :nite AND NOCO_PERIODO = 0;
    VALOR = :valor + :saldosini;
    EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
    UPDATE nomina_conceptos N SET noco_pagook = 'S' WHERE n.noco_aplicaprom = 'S' AND N.noco_periodo >= :perinicial - 1 AND N.noco_periodo < :periodo AND N.noco_ano >= :anoprom AND N.noco_ano <= :ano  AND CONC_COD = :conc_cod AND terc_nit = :nite;
    END
    IF (conc_otroconc = 'S') THEN
    BEGIN
    anosum = CAST(ano AS INTEGER);
    anosum = anosum - 1;
    SELECT SUM (noco_valor) FROM nomina_conceptos n WHERE n.noco_ano = :anosum AND n.conc_cod = :conc_codotroconc AND N.terc_nit = :nite INTO :valor;
    SELECT NOCO_VALOR FROM NOMINA_CONCEPTOS WHERE noco_ano = :anosum AND conc_cod = :conc_codotroconc AND terc_nit = :nite AND NOCO_PERIODO = 0 INTO :saldosini;
    IF (saldosini IS NULL) THEN
    saldosini = 0;
    ELSE
    UPDATE nomina_conceptos SET noco_pagook = 'S' WHERE noco_ano = :anosum AND conc_cod = :conc_codotroconc AND NOCO_PERIODO = 0 AND terc_nit = :nite;
    VALOR = :valor + :saldosini;
    UPDATE nomina_conceptos SET noco_pagook = 'S' WHERE noco_ano = :anosum AND conc_cod = :conc_codotroconc AND terc_nit = :nite;
    END
 $$IBE$$*/ /*SI EL CONCEPTO ES UN APORTE*/ /*$$IBE$$ 
IF (conc_aporte = 'S') THEN
BEGIN
    IF ((:entidad = '' ) OR (entidad IS NULL)) THEN
    BEGIN
     SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
     IF (comision IS NULL) THEN
     comision = 0;
     valor = :basico + :comision;
    IF ((conc_cod = 904) OR (conc_cod = 905) OR (conc_cod = 906)) THEN
            BEGIN
            entidad = :nitafp;
                IF (conc_cod = 904) THEN
                BEGIN
                SELECT A.paan_afptr FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = (((((:basico /30) * :diaslab ) + :comision)+ :cambsaltrans) * :PORCEN) /100;
                END
                ELSE
                IF ((conc_cod = 905) OR (conc_cod = 906)) THEN
                BEGIN
                SELECT A.paan_afpem FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = (((((:basico /30) * :diaslab ) + :comision)+ :cambsaltrans) * :PORCEN) /100;
                END
                EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
            END
            ELSE
       IF ((conc_cod = 907) OR (conc_cod = 914) OR (conc_cod = 915)) THEN
            BEGIN
            entidad = :niteps;
                IF (conc_cod = 907) THEN
                BEGIN
                SELECT A.paan_epstr FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = (((((:basico )/30 * :diaslab ) + :comision)+ :cambsaltrans) * :PORCEN) /100;
                END
                ELSE
                IF ((conc_cod = 914) OR (conc_cod = 915)) THEN
                BEGIN
                SELECT A.paan_epsem FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = (((((:basico )/30 * :diaslab ) + :comision)+ :cambsaltrans) * :PORCEN) /100;
                END
                EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
            END
            ELSE
       IF ((conc_cod = 910) OR (conc_cod = 911) OR (conc_cod = 916) OR (conc_cod = 917) OR (conc_cod = 918) OR (conc_cod = 919)) THEN
            BEGIN
            entidad = :nitccf;
            SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
            IF (comision IS NULL) THEN
            comision = 0;
                IF ((conc_cod = 910) OR (conc_cod = 911) ) THEN
                BEGIN
                SELECT A.paan_ccf FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = (((((:basico )/30 * :diaslab ) + :comision)+ :cambsaltrans) * :PORCEN) /100;
                EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
                END
                ELSE
                IF ((conc_cod = 916) OR (conc_cod = 917)) THEN
                BEGIN
                SELECT A.paan_icbf FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = (((((:basico )/30 * :diaslab ) + :comision)+ :cambsaltrans) * :PORCEN) /100;
                EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
                END
                ELSE
                IF ((conc_cod = 918) OR (conc_cod = 919)) THEN
                BEGIN
                SELECT A.paan_sena FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = (((((:basico )/30 * :diaslab ) + :comision)+ :cambsaltrans) * :PORCEN) /100;
                EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
                END
            END
            ELSE
        IF ((conc_cod = 912) OR (conc_cod = 913)) THEN
            BEGIN
            entidad = :nitafc;
            SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
            IF (comision IS NULL) THEN
            comision = 0;
                IF ((conc_cod = 912) OR (conc_cod = 913) ) THEN
                BEGIN
                SELECT A.paan_cesemp FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = ((((:basico + :comision)/30 * :diaslab )+ :cambsaltrans) * :PORCEN) /100;
                EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
                END
            END
            ELSE
        BEGIN
        IF (comision IS NULL) THEN
        comision = 0;
        SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
        conc_monto = :basico + :comision;
        IF (conc_porc <> 0 AND conc_porc IS NOT NULL) THEN
        VALOR = (((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans) * :conc_porc) /100;
        ELSE
        IF (:porcen <> 0 AND :porcen IS NOT NULL) THEN
        VALOR = (((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans) * :porcen) /100;
        ELSE
        IF (:montos <> 0 AND :montos IS NOT NULL) THEN
        valor = :montos;
        ELSE
        IF (:conc_monto <> 0 AND :conc_monto IS NOT NULL) THEN
        valor = :conc_monto;
        EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
        END
    END
    END
    ELSE
    IF (conc_prov = 'S') THEN
    BEGIN
        conc_monto = :basico;
        IF (conc_porc <> 0 AND conc_porc IS NOT NULL) THEN
        VALOR = (((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans) * :conc_porc) /100;
        ELSE
        IF (porcen <> 0 AND porcen IS NOT NULL) THEN
        VALOR = (((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans) * :porcen) /100;
        ELSE
        IF (montos <> 0 AND montos IS NOT NULL) THEN
        VALOR = :montos;
        ELSE
        IF (conc_monto <> 0 AND conc_monto IS NOT NULL) THEN
        VALOR = :conc_monto;
        EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
    END
item = :item + 1;
END
IF (conc_cod = 920) THEN
 BEGIN
 SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :valor;
 IF (valor IS NULL) THEN
 valor = 0;
 item = :item + 1;
 END
    IF (liquidaper = 0) THEN
    INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
    VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
    ELSE
    IF (liquidaper = 1) THEN
    BEGIN
    rmod = mod(:periodo, 2);
    IF (rmod = 0) THEN
        INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
        VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
    END
    ELSE
    IF (liquidaper = 2) THEN
    BEGIN
    rmod = mod(:periodo, 4);
    IF (rmod = 0) THEN
        INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
        VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
    END
END
END
END
ELSE
 $$IBE$$*/ /*SI ES SEMANAL*/ /*$$IBE$$ 
IF (periodicidad = 3) THEN
BEGIN
EXECUTE PROCEDURE cambie_id_nomina RETURNING_VALUES(:idnomina);
INSERT INTO nomina (nomi_id, NOMI_FECCAUSA, NOMI_PAGOGLOBAL, NOMI_PERIODOCIDAD, NOMI_PERIODO, NOMI_ANO, NOMI_LIQOK)
VALUES (:IDNOMINA, :fec,:pagoglobal, :periodicidad, :periodo, :ano, 'N');
    BEGIN
    item = 1;
    FOR SELECT E.TERC_NIT, E.empl_salario, e.empl_eps, e.empl_afc, e.empl_afp, e.empl_ccf
    FROM EMPLEADOS E
    WHERE E.empl_ppago = 3
    INTO :nite, :basico, :niteps, :nitafc, :nitafp, :nitccf
    DO
    BEGIN
    FOR SELECT CE.TERC_NIT, CE.CONC_COD, CE.EMCO_MONTO, CE.EMCO_PORC, ce.empl_entidad, CE.emco_perprom, CE.emco_luquidaper,    CN.CONC_COD, CN.CONC_DEDUC,CN.CONC_PORC, CN.CONC_ENTIDAD, CN.CONC_MONTO,  CN.CONC_DIAS, CN.CONC_MODIFI,
    CN.CONC_PROMEDIO, CN.conc_salario, CE.emco_perprom, CN.conc_prov, CN.conc_aporte, CN.conc_aplicaprom, cn.conc_otroconc, cn.conc_codotroconc, CN.conc_gtoempr
    FROM empleado_conceptos CE, CONCEPTOS_NOMINA CN WHERE ((CE.terc_nit = :nite) AND (CE.CONC_COD = CN.CONC_COD) AND (CN.conc_fecini <= :fec AND CN.conc_fecfin >= :FEC) ) OR ((CE.terc_nit = :nite)
    AND (CE.CONC_COD = CN.CONC_COD) AND (cn.conc_todosper = 'N') AND (CE.emco_ppago = :periodo)) OR  ((CE.terc_nit = :nite) AND (CE.CONC_COD = CN.CONC_COD) AND cn.conc_todosper = 'S')  ORDER BY (TERC_NIT)
    INTO :nit_tercero, :concept,  :montos, :porcen, :entidad, :numeroprom, :liquidaper ,:CONC_COD, :CONC_DEDUC, :CONC_PORC,
    :CONC_ENTIDAD, :CONC_MONTO, :CONC_DIAS, :CONC_MODIFI,:CONC_PROMEDIO, :salario,:EMCO_PERPROM, :conc_prov, :conc_aporte , :CONC_APLICAPROM, :conc_otroconc, :conc_codotroconc, :gtoempr
    DO
BEGIN
    IF (conc_dias = 'S') THEN
    EXECUTE PROCEDURE DIAS_LABORADOS (:nite, :periodo, :fec) RETURNING_VALUES (:diaslab);
    ELSE
    BEGIN
    IF (liquidaper = 0) THEN
    diaslab = 7;
    ELSE
    IF (liquidaper = 1) THEN
    diaslab = 15;
    ELSE
    IF (liquidaper = 2) THEN
    diaslab = 30;
    END
 SELECT ((n.nono_valor /30) * n.nono_dura), (n.nono_dura) FROM nomina_novedades n WHERE n.tnov_cod = 11 AND n.terc_nit = :nite AND n.nono_periodo = :periodo INTO :cambsaltrans, :duranov;
 IF (cambsaltrans IS NULL) THEN
 cambsaltrans = 0;
 if (duranov is null) then
 duranov = 0;
 diaslab = :diaslab - :duranov;
 IF (conc_cod = 920) THEN
 BEGIN
 SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :valor;
 IF (valor IS NULL) THEN
 valor = 0;
 item = :item + 1;
 END
 ELSE
 if (conc_cod = 921) then
 begin
 if (porcen IS NOT NULL AND porcen <> 0) then
 valor = ((basico / 30)* :diaslab ) * :PORCEN /100;
 ELSE
 if (conc_porc IS NOT null AND conc_porc <> 0) then
 valor = ((:basico / 30)* :diaslab ) * :conc_porc /100;
 EXECUTE PROCEDURE REDONDEE(:valor, 5) RETURNING_VALUES (VALOR);
 end
 ELSE
 if (conc_cod = 922) then
 BEGIN
 SELECT P.prcu_monto FROM prestamo_cuotas P, prestamo_nomina PN WHERE P.prcu_ano = :ano AND P.prcu_periodo = :periodo AND PN.prno_id = P.prno_id AND PN.terc_nit = :nite INTO :valor;
 IF (valor IS NULL) THEN
 valor = 0;
 EXECUTE PROCEDURE REDONDEE(:valor, 5) RETURNING_VALUES (VALOR);
 item = :item + 1;
 update prestamo_cuotas  P SET prcu_ok = 'S' WHERE P.prcu_ano = :ano AND P.prcu_periodo = :periodo AND P.prno_id = (SELECT PN.prno_id FROM PRESTAMO_NOMINA PN WHERE PN.terc_nit = :nite);
 END
 ELSE
 BEGIN
    IF ((:montos = 0) OR (:montos IS NULL)) THEN
      BEGIN
      IF ((CONC_PORC = 0 AND :porcen = 0) OR (CONC_PORC IS NULL AND :porcen = 0) OR (CONC_PORC = 0 AND :porcen IS NULL) OR (CONC_PORC IS NULL AND :porcen IS NULL) ) THEN
        BEGIN
        IF ((conc_monto <> 0) AND (conc_monto IS NOT NULL) ) THEN
        BEGIN
        VALOR = :CONC_MONTO/30 * :diaslab;
        EXECUTE PROCEDURE REDONDEE(:valor, 5) RETURNING_VALUES (VALOR);
        END
        ELSE
        IF (salario = 'S' AND CONC_COD <> 900 AND CONC_COD <> 920) THEN
        BEGIN
        conc_monto = :basico;
        VALOR = (:conc_monto/30 * :diaslab ) + :cambsaltrans;
        EXECUTE PROCEDURE REDONDEE(:valor, 5) RETURNING_VALUES (VALOR);
        END
        ELSE
        valor = montos;
        END
       ELSE
       BEGIN
        IF (:porcen <> 0) THEN
          BEGIN
            IF ((conc_monto <> 0) AND (conc_monto IS NOT NULL) ) THEN
            BEGIN
              VALOR = ((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans * :PORCEN) /100;
              EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
            END
          END
          ELSE
          BEGIN
            IF ((conc_monto <> 0) AND (conc_monto IS NOT NULL) ) THEN
            BEGIN
              VALOR = ((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans * :conc_porc) /100;
              EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
            END
            ELSE
        IF (salario = 'S' AND CONC_COD <> 900 AND CONC_COD <> 920) THEN
            BEGIN
              conc_monto = :basico;
              VALOR = ((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans * :conc_porc) /100;
              EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
            END
          END
       END
      END
    ELSE
    BEGIN
      IF (CONC_PORC = 0 AND :porcen = 0) THEN
      BEGIN
      VALOR = (:montos/30 * :diaslab);
      EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
      END
      ELSE
      BEGIN
        IF (:porcen <> 0) THEN
          BEGIN
          VALOR = ((:MONTOS/30 * :diaslab )+ :cambsaltrans * :PORCEN) /100;
          EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
          END
          ELSE
          BEGIN
          VALOR = ((:montos/30 * :diaslab )+ :cambsaltrans * :CONC_PORC) /100;
          END
          EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
       END
   END
    IF (conc_promedio = 'S') THEN
    BEGIN
    perinicial = :periodo - (:numeroprom) + 1;
    anoprom = CAST (ano AS INTEGER);
    IF (perinicial <= 0) THEN
    BEGIN
    perinicial = 24 + :PERINICIAL;
    anoprom = CAST(ANO AS INTEGER) - 1;
    END
    SELECT SUM (noco_valor) FROM nomina_conceptos n WHERE n.noco_aplicaprom = 'S' AND N.noco_periodo >= :perinicial - 1 AND N.noco_periodo < :periodo AND N.noco_ano >= :anoprom AND N.noco_ano <= :ano AND terc_nit = :nite INTO :valor;
    valor = (valor / numeroprom) $$IBE$$*/ /*/ 30 * :diaslab*/ /*$$IBE$$ ;
    SELECT NOCO_VALOR FROM NOMINA_CONCEPTOS WHERE CONC_COD = :conc_cod AND TERC_NIT  = :nite AND NOCO_PAGOOK = 'N' AND NOCO_PERIODO = 0 INTO :saldosini;
    IF (saldosini IS NULL) THEN
    saldosini = 0;
    ELSE
    UPDATE nomina_conceptos N SET noco_pagook = 'S' WHERE n.noco_aplicaprom = 'S' AND N.noco_periodo >= :perinicial - 1 AND N.noco_periodo < :periodo AND N.noco_ano >= :anoprom AND N.noco_ano <= :ano  AND CONC_COD = :conc_cod AND terc_nit = :nite AND NOCO_PERIODO = 0;
    VALOR = :valor + :saldosini;
    EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
    UPDATE nomina_conceptos N SET noco_pagook = 'S' WHERE n.noco_aplicaprom = 'S' AND N.noco_periodo >= :perinicial - 1 AND N.noco_periodo < :periodo AND N.noco_ano >= :anoprom AND N.noco_ano <= :ano  AND CONC_COD = :conc_cod AND terc_nit = :nite;
    END
    IF (conc_otroconc = 'S') THEN
    BEGIN
    anosum = CAST(ano AS INTEGER);
    anosum = anosum - 1;
    SELECT SUM (noco_valor) FROM nomina_conceptos n WHERE n.noco_ano = :anosum AND n.conc_cod = :conc_codotroconc AND N.terc_nit = :nite INTO :valor;
    SELECT NOCO_VALOR FROM NOMINA_CONCEPTOS WHERE noco_ano = :anosum AND conc_cod = :conc_codotroconc AND terc_nit = :nite AND NOCO_PERIODO = 0 INTO :saldosini;
    IF (saldosini IS NULL) THEN
    saldosini = 0;
    ELSE
    UPDATE nomina_conceptos SET noco_pagook = 'S' WHERE noco_ano = :anosum AND conc_cod = :conc_codotroconc AND NOCO_PERIODO = 0 AND terc_nit = :nite;
    VALOR = :valor + :saldosini;
    UPDATE nomina_conceptos SET noco_pagook = 'S' WHERE noco_ano = :anosum AND conc_cod = :conc_codotroconc AND terc_nit = :nite;
    END
 $$IBE$$*/ /*SI EL CONCEPTO ES UN APORTE*/ /*$$IBE$$ 
IF (conc_aporte = 'S') THEN
BEGIN
    IF ((:entidad = '' ) OR (entidad IS NULL)) THEN
    BEGIN
     SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
     IF (comision IS NULL) THEN
     comision = 0;
     valor = :basico + :comision;
    IF ((conc_cod = 904) OR (conc_cod = 905) OR (conc_cod = 906)) THEN
            BEGIN
            entidad = :nitafp;
                IF (conc_cod = 904) THEN
                BEGIN
                SELECT A.paan_afptr FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = (((((:basico /30) * :diaslab ) + :comision)+ :cambsaltrans) * :PORCEN) /100;
                END
                ELSE
                IF ((conc_cod = 905) OR (conc_cod = 906)) THEN
                BEGIN
                SELECT A.paan_afpem FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = (((((:basico /30) * :diaslab ) + :comision)+ :cambsaltrans) * :PORCEN) /100;
                END
                EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
            END
            ELSE
       IF ((conc_cod = 907) OR (conc_cod = 914) OR (conc_cod = 915)) THEN
            BEGIN
            entidad = :niteps;
                IF (conc_cod = 907) THEN
                BEGIN
                SELECT A.paan_epstr FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = (((((:basico )/30 * :diaslab ) + :comision)+ :cambsaltrans) * :PORCEN) /100;
                END
                ELSE
                IF ((conc_cod = 914) OR (conc_cod = 915)) THEN
                BEGIN
                SELECT A.paan_epsem FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = (((((:basico )/30 * :diaslab ) + :comision)+ :cambsaltrans) * :PORCEN) /100;
                END
                EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
            END
            ELSE
       IF ((conc_cod = 910) OR (conc_cod = 911) OR (conc_cod = 916) OR (conc_cod = 917) OR (conc_cod = 918) OR (conc_cod = 919)) THEN
            BEGIN
            entidad = :nitccf;
            SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
            IF (comision IS NULL) THEN
            comision = 0;
                IF ((conc_cod = 910) OR (conc_cod = 911) ) THEN
                BEGIN
                SELECT A.paan_ccf FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = (((((:basico )/30 * :diaslab ) + :comision)+ :cambsaltrans) * :PORCEN) /100;
                EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
                END
                ELSE
                IF ((conc_cod = 916) OR (conc_cod = 917)) THEN
                BEGIN
                SELECT A.paan_icbf FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = (((((:basico )/30 * :diaslab ) + :comision)+ :cambsaltrans) * :PORCEN) /100;
                EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
                END
                ELSE
                IF ((conc_cod = 918) OR (conc_cod = 919)) THEN
                BEGIN
                SELECT A.paan_sena FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = (((((:basico )/30 * :diaslab ) + :comision)+ :cambsaltrans) * :PORCEN) /100;
                EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
                END
            END
            ELSE
        IF ((conc_cod = 912) OR (conc_cod = 913)) THEN
            BEGIN
            entidad = :nitafc;
            SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
            IF (comision IS NULL) THEN
            comision = 0;
                IF ((conc_cod = 912) OR (conc_cod = 913) ) THEN
                BEGIN
                SELECT A.paan_cesemp FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = ((((:basico + :comision)/30 * :diaslab )+ :cambsaltrans) * :PORCEN) /100;
                EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
                END
            END
            ELSE
        BEGIN
        IF (comision IS NULL) THEN
        comision = 0;
        SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
        conc_monto = :basico + :comision;
        IF (conc_porc <> 0 AND conc_porc IS NOT NULL) THEN
        VALOR = (((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans) * :conc_porc) /100;
        ELSE
        IF (:porcen <> 0 AND :porcen IS NOT NULL) THEN
        VALOR = (((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans) * :porcen) /100;
        ELSE
        IF (:montos <> 0 AND :montos IS NOT NULL) THEN
        valor = :montos;
        ELSE
        IF (:conc_monto <> 0 AND :conc_monto IS NOT NULL) THEN
        valor = :conc_monto;
        EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
        END
    END
    END
    ELSE
    IF (conc_prov = 'S') THEN
    BEGIN
        conc_monto = :basico;
        IF (conc_porc <> 0 AND conc_porc IS NOT NULL) THEN
        VALOR = (((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans) * :conc_porc) /100;
        ELSE
        IF (porcen <> 0 AND porcen IS NOT NULL) THEN
        VALOR = (((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans) * :porcen) /100;
        ELSE
        IF (montos <> 0 AND montos IS NOT NULL) THEN
        VALOR = :montos;
        ELSE
        IF (conc_monto <> 0 AND conc_monto IS NOT NULL) THEN
        VALOR = :conc_monto;
        EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
    END
item = :item + 1;
END
    IF (liquidaper = 0) THEN
    INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
    VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
    ELSE
    IF (liquidaper = 1) THEN
    BEGIN
    rmod = mod(:periodo, 2);
    IF (rmod = 0) THEN
        INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
        VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
    END
    ELSE
    IF (liquidaper = 2) THEN
    BEGIN
    rmod = mod(:periodo, 4);
    IF (rmod = 0) THEN
        INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
        VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
    END
END
END
END
END
SUSPEND;
 $$IBE$$*/ EXIT;
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE CAUSA_NOMINA(
    FEC DATE,
    PERIODO INTEGER,
    PERIODICIDAD INTEGER,
    PAGOGLOBAL CHAR(1),
    ANO CHAR(4))
RETURNS (
    IDNOMINA INTEGER)
AS
DECLARE VARIABLE item INTEGER;
DECLARE VARIABLE nite VARCHAR(20) CHARACTER SET none;
DECLARE VARIABLE nit_tercero VARCHAR(20);
DECLARE VARIABLE concept INTEGER;
DECLARE VARIABLE montos NUMERIC(18,2);
DECLARE VARIABLE porcen NUMERIC(9,4);
DECLARE VARIABLE entidad VARCHAR(20);
DECLARE VARIABLE conc_cod INTEGER;
DECLARE VARIABLE conc_deduc CHAR(1);
DECLARE VARIABLE conc_porc NUMERIC(9,4);
DECLARE VARIABLE conc_entidad INTEGER;
DECLARE VARIABLE conc_monto NUMERIC(18,2);
DECLARE VARIABLE conc_modifi CHAR(1);
DECLARE VARIABLE conc_promedio CHAR(1);
DECLARE VARIABLE emco_perprom INTEGER;
DECLARE VARIABLE valor NUMERIC(18,2);
DECLARE VARIABLE diaslab INTEGER;
DECLARE VARIABLE conc_prov CHAR(1);
DECLARE VARIABLE conc_aporte CHAR(1);
DECLARE VARIABLE numeroprom INTEGER;
DECLARE VARIABLE conc_aplicaprom CHAR(1);
DECLARE VARIABLE perinicial INTEGER;
DECLARE VARIABLE anoprom INTEGER;
DECLARE VARIABLE conc_dias CHAR(1);
DECLARE VARIABLE conc_otroconc CHAR(1);
DECLARE VARIABLE conc_codotroconc INTEGER;
DECLARE VARIABLE anosum INTEGER;
DECLARE VARIABLE salario CHAR(1) CHARACTER SET none;
DECLARE VARIABLE liquidaper INTEGER;
DECLARE VARIABLE rmod NUMERIC(2,2);
DECLARE VARIABLE basico NUMERIC(18,2);
DECLARE VARIABLE niteps VARCHAR(20);
DECLARE VARIABLE nitafc VARCHAR(20);
DECLARE VARIABLE nitafp VARCHAR(20);
DECLARE VARIABLE nitccf VARCHAR(20);
DECLARE VARIABLE gtoempr CHAR(1);
DECLARE VARIABLE comision NUMERIC(18,2);
DECLARE VARIABLE cambsaltrans NUMERIC(18,2);
DECLARE VARIABLE SALDOSINI NUMERIC(18,2);
DECLARE VARIABLE duranov INTEGER;
DECLARE VARIABLE base NUMERIC(18,2);
BEGIN
/*SI ES QUINCENAL*/
IF (periodicidad = 2) THEN
BEGIN
EXECUTE PROCEDURE cambie_id_nomina RETURNING_VALUES(:idnomina);
INSERT INTO nomina (nomi_id, NOMI_FECCAUSA, NOMI_PAGOGLOBAL, NOMI_PERIODOCIDAD, NOMI_PERIODO, NOMI_ANO, NOMI_LIQOK)
VALUES (:IDNOMINA, :fec,:pagoglobal, :periodicidad, :periodo, :ano, 'N');
 BEGIN
    item = 1;
    FOR SELECT E.TERC_NIT, E.empl_salario, e.empl_eps, e.empl_afc, e.empl_afp, e.empl_ccf
    FROM EMPLEADOS E
    WHERE E.empl_ppago = 2
    INTO :nite, :basico, :niteps, :nitafc, :nitafp, :nitccf
    DO
    BEGIN
    FOR SELECT CE.TERC_NIT, CE.CONC_COD, CE.EMCO_MONTO, CE.EMCO_PORC, ce.empl_entidad, CE.emco_perprom, CE.emco_luquidaper, CN.CONC_COD, CN.CONC_DEDUC,CN.CONC_PORC, CN.CONC_ENTIDAD, CN.CONC_MONTO,  CN.CONC_DIAS, CN.CONC_MODIFI,
    CN.CONC_PROMEDIO, CN.conc_salario, CE.emco_perprom, CN.conc_prov, CN.conc_aporte, CN.conc_aplicaprom, cn.conc_otroconc, cn.conc_codotroconc, CN.conc_gtoempr, CN.conc_base
    FROM empleado_conceptos CE, CONCEPTOS_NOMINA CN WHERE ((CE.terc_nit = :nite) AND (CE.CONC_COD = CN.CONC_COD) AND (CN.conc_fecini <= :fec AND CN.conc_fecfin >= :FEC) ) OR ((CE.terc_nit = :nite)
    AND (CE.CONC_COD = CN.CONC_COD) AND (cn.conc_todosper = 'N') AND (CE.emco_ppago = :periodo)) OR  ((CE.terc_nit = :nite) AND (CE.CONC_COD = CN.CONC_COD) AND cn.conc_todosper = 'S')  ORDER BY (TERC_NIT )
    INTO :nit_tercero, :concept,  :montos, :porcen, :entidad, :numeroprom, :liquidaper ,:CONC_COD, :CONC_DEDUC, :CONC_PORC,
    :CONC_ENTIDAD, :CONC_MONTO, :CONC_DIAS, :CONC_MODIFI,:CONC_PROMEDIO, :salario,:EMCO_PERPROM, :conc_prov, :conc_aporte , :CONC_APLICAPROM, :conc_otroconc, :conc_codotroconc, :gtoempr, :base
    DO
BEGIN
    IF (conc_dias = 'S') THEN
    EXECUTE PROCEDURE DIAS_LABORADOS (:nite, :periodo, :fec) RETURNING_VALUES (:diaslab);
    ELSE
    BEGIN
    IF (liquidaper = 0) THEN
    diaslab = 15;
    ELSE
    IF (liquidaper = 1) THEN
    diaslab = 30;
    ELSE
    IF (liquidaper = 2) THEN
    diaslab = 60;
    END
 SELECT ((n.nono_valor /30) * n.nono_dura), (n.nono_dura) FROM nomina_novedades n WHERE n.tnov_cod = 11 AND n.terc_nit = :nite AND n.nono_periodo = :periodo INTO :cambsaltrans, :duranov;
 IF (cambsaltrans IS NULL) THEN
 cambsaltrans = 0;
 IF (duranov IS NULL) THEN
 duranov = 0;
 diaslab = :diaslab - :duranov;
 IF (conc_cod = 921) THEN
 BEGIN
 IF (porcen IS NOT NULL AND porcen <> 0) THEN
 valor = ((basico / 30)* :diaslab ) * :PORCEN /100;
 ELSE
 IF (conc_porc IS NOT NULL AND conc_porc <> 0) THEN
 valor = ((:basico / 30)* :diaslab ) * :conc_porc /100;
 EXECUTE PROCEDURE REDONDEE(:valor, 5) RETURNING_VALUES (VALOR);
 END
 ELSE
 IF (conc_cod = 922) THEN
 BEGIN
 SELECT P.prcu_monto FROM prestamo_cuotas P, prestamo_nomina PN WHERE P.prcu_ano = :ano AND P.prcu_periodo = :periodo AND PN.prno_id = P.prno_id AND PN.terc_nit = :nite INTO :valor;
 IF (valor IS NULL) THEN
 valor = 0;
 EXECUTE PROCEDURE REDONDEE(:valor, 5) RETURNING_VALUES (VALOR);
 item = :item + 1;
 UPDATE prestamo_cuotas  P SET prcu_ok = 'S' WHERE P.prcu_ano = :ano AND P.prcu_periodo = :periodo AND P.prno_id = (SELECT PN.prno_id FROM PRESTAMO_NOMINA PN WHERE PN.terc_nit = :nite);
 END
 ELSE
 BEGIN
    IF ((:montos = 0) OR (:montos IS NULL)) THEN
      BEGIN
      IF ((CONC_PORC = 0 AND :porcen = 0) OR (CONC_PORC IS NULL AND :porcen = 0) OR (CONC_PORC = 0 AND :porcen IS NULL) OR (CONC_PORC IS NULL AND :porcen IS NULL) ) THEN
        BEGIN
        IF ((conc_monto <> 0) AND (conc_monto IS NOT NULL) ) THEN
        BEGIN
        VALOR = :CONC_MONTO/30 * :diaslab;
        EXECUTE PROCEDURE REDONDEE(:valor, 5) RETURNING_VALUES (VALOR);
        END
        ELSE
        IF (salario = 'S' AND CONC_COD <> 900 AND CONC_COD <> 920) THEN
        BEGIN
        conc_monto = :basico;
        VALOR = (:conc_monto/30 * :diaslab ) + :cambsaltrans;
        EXECUTE PROCEDURE REDONDEE(:valor, 5) RETURNING_VALUES (VALOR);
        END
        ELSE
        valor = montos;
        END
       ELSE
       BEGIN
        IF (:porcen <> 0) THEN
          BEGIN
            IF ((conc_monto <> 0) AND (conc_monto IS NOT NULL) ) THEN
            BEGIN
              VALOR = ((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans * :PORCEN) /100;
              EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
            END
          END
          ELSE
          BEGIN
            IF ((conc_monto <> 0) AND (conc_monto IS NOT NULL) ) THEN
            BEGIN
              VALOR = ((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans * :conc_porc) /100;
              EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
            END
            ELSE
        IF (salario = 'S' AND CONC_COD <> 900 AND CONC_COD <> 920) THEN
            BEGIN
              conc_monto = :basico;
              VALOR = ((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans * :conc_porc) /100;
              EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
            END
          END
       END
      END
    ELSE
    BEGIN
      IF (CONC_PORC = 0 AND :porcen = 0) THEN
      BEGIN
      VALOR = (:montos/30 * :diaslab);
      EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
      END
      ELSE
      BEGIN
        IF (:porcen <> 0) THEN
          BEGIN
          VALOR = ((:MONTOS/30 * :diaslab )+ :cambsaltrans * :PORCEN) /100;
          EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
          END
          ELSE
          BEGIN
          VALOR = ((:montos/30 * :diaslab )+ :cambsaltrans * :CONC_PORC) /100;
          END
          EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
       END
   END
    IF (conc_promedio = 'S') THEN
    BEGIN
    perinicial = :periodo - (:numeroprom) + 1;
    anoprom = CAST (ano AS INTEGER);
    IF (perinicial <= 0) THEN
    BEGIN
    perinicial = 24 + :PERINICIAL;
    anoprom = CAST(ANO AS INTEGER) - 1;
    END
    SELECT SUM (noco_valor) FROM nomina_conceptos n WHERE n.noco_aplicaprom = 'S' AND N.noco_periodo >= :perinicial - 1 AND N.noco_periodo < :periodo AND N.noco_ano >= :anoprom AND N.noco_ano <= :ano AND terc_nit = :nite INTO :valor;
    valor = (valor / numeroprom)/*/ 30 * :diaslab*/;
    SELECT NOCO_VALOR FROM NOMINA_CONCEPTOS WHERE CONC_COD = :conc_cod AND TERC_NIT  = :nite AND NOCO_PAGOOK = 'N' AND NOCO_PERIODO = 0 INTO :saldosini;
    IF (saldosini IS NULL) THEN
    saldosini = 0;
    ELSE
    UPDATE nomina_conceptos N SET noco_pagook = 'S' WHERE n.noco_aplicaprom = 'S' AND N.noco_periodo >= :perinicial - 1 AND N.noco_periodo < :periodo AND N.noco_ano >= :anoprom AND N.noco_ano <= :ano  AND CONC_COD = :conc_cod AND terc_nit = :nite AND NOCO_PERIODO = 0;
    VALOR = :valor + :saldosini;
    EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
    UPDATE nomina_conceptos N SET noco_pagook = 'S' WHERE n.noco_aplicaprom = 'S' AND N.noco_periodo >= :perinicial - 1 AND N.noco_periodo < :periodo AND N.noco_ano >= :anoprom AND N.noco_ano <= :ano  AND CONC_COD = :conc_cod AND terc_nit = :nite;
    END
    IF (conc_otroconc = 'S') THEN
    BEGIN
    anosum = CAST(ano AS INTEGER);
    anosum = anosum - 1;
    SELECT SUM (noco_valor) FROM nomina_conceptos n WHERE n.noco_ano = :anosum AND n.conc_cod = :conc_codotroconc AND N.terc_nit = :nite INTO :valor;
    SELECT NOCO_VALOR FROM NOMINA_CONCEPTOS WHERE noco_ano = :anosum AND conc_cod = :conc_codotroconc AND terc_nit = :nite AND NOCO_PERIODO = 0 INTO :saldosini;
    IF (saldosini IS NULL) THEN
    saldosini = 0;
    ELSE
    UPDATE nomina_conceptos SET noco_pagook = 'S' WHERE noco_ano = :anosum AND conc_cod = :conc_codotroconc AND NOCO_PERIODO = 0 AND terc_nit = :nite;
    VALOR = :valor + :saldosini;
    UPDATE nomina_conceptos SET noco_pagook = 'S' WHERE noco_ano = :anosum AND conc_cod = :conc_codotroconc AND terc_nit = :nite;
    END
/*SI EL CONCEPTO ES UN APORTE*/
IF (conc_aporte = 'S') THEN
BEGIN
    IF ((:entidad = '' ) OR (entidad IS NULL)) THEN
    BEGIN
     SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
     IF (comision IS NULL) THEN
     comision = 0;
     valor = :basico + :comision;
    IF ((conc_cod = 904) OR (conc_cod = 905) OR (conc_cod = 906)) THEN
            BEGIN
            entidad = :nitafp;
                IF (conc_cod = 904) THEN
                BEGIN
                SELECT A.paan_afptr FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = (((((:basico /30) * :diaslab ) + :comision)+ :cambsaltrans) * :PORCEN) /100;
                END
                ELSE
                IF ((conc_cod = 905) OR (conc_cod = 906)) THEN
                BEGIN
                SELECT A.paan_afpem FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = (((((:basico /30) * :diaslab ) + :comision)+ :cambsaltrans) * :PORCEN) /100;
                END
                EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
            END
            ELSE
       IF ((conc_cod = 907) OR (conc_cod = 914) OR (conc_cod = 915)) THEN
            BEGIN
            entidad = :niteps;
                IF (conc_cod = 907) THEN
                BEGIN
                SELECT A.paan_epstr FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = (((((:basico )/30 * :diaslab ) + :comision)+ :cambsaltrans) * :PORCEN) /100;
                END
                ELSE
                IF ((conc_cod = 914) OR (conc_cod = 915)) THEN
                BEGIN
                SELECT A.paan_epsem FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = (((((:basico )/30 * :diaslab ) + :comision)+ :cambsaltrans) * :PORCEN) /100;
                END
                EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
            END
            ELSE
       IF ((conc_cod = 910) OR (conc_cod = 911) OR (conc_cod = 916) OR (conc_cod = 917) OR (conc_cod = 918) OR (conc_cod = 919)) THEN
            BEGIN
            entidad = :nitccf;
            SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
            IF (comision IS NULL) THEN
            comision = 0;
                IF ((conc_cod = 910) OR (conc_cod = 911) ) THEN
                BEGIN
                SELECT A.paan_ccf FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = (((((:basico )/30 * :diaslab ) + :comision)+ :cambsaltrans) * :PORCEN) /100;
                EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
                END
                ELSE
                IF ((conc_cod = 916) OR (conc_cod = 917)) THEN
                BEGIN
                SELECT A.paan_icbf FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = (((((:basico )/30 * :diaslab ) + :comision)+ :cambsaltrans) * :PORCEN) /100;
                EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
                END
                ELSE
                IF ((conc_cod = 918) OR (conc_cod = 919)) THEN
                BEGIN
                SELECT A.paan_sena FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = (((((:basico )/30 * :diaslab ) + :comision)+ :cambsaltrans) * :PORCEN) /100;
                EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
                END
            END
            ELSE
        IF ((conc_cod = 912) OR (conc_cod = 913)) THEN
            BEGIN
            entidad = :nitafc;
            SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
            IF (comision IS NULL) THEN
            comision = 0;
                IF ((conc_cod = 912) OR (conc_cod = 913) ) THEN
                BEGIN
                SELECT A.paan_cesemp FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = ((((:basico + :comision)/30 * :diaslab )+ :cambsaltrans) * :PORCEN) /100;
                EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
                END
            END
            ELSE
        BEGIN
        IF (comision IS NULL) THEN
        comision = 0;
        SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
        conc_monto = :basico + :comision;
        IF (conc_porc <> 0 AND conc_porc IS NOT NULL) THEN
        VALOR = (((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans) * :conc_porc) /100;
        ELSE
        IF (:porcen <> 0 AND :porcen IS NOT NULL) THEN
        VALOR = (((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans) * :porcen) /100;
        ELSE
        IF (:montos <> 0 AND :montos IS NOT NULL) THEN
        valor = :montos;
        ELSE
        IF (:conc_monto <> 0 AND :conc_monto IS NOT NULL) THEN
        valor = :conc_monto;
        EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
        END
    END
    END
    ELSE
    IF (conc_prov = 'S') THEN
    BEGIN
        conc_monto = :basico;
        IF (conc_porc <> 0 AND conc_porc IS NOT NULL) THEN
        VALOR = (((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans) * :conc_porc) /100;
        ELSE
        IF (porcen <> 0 AND porcen IS NOT NULL) THEN
        VALOR = (((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans) * :porcen) /100;
        ELSE
        IF (montos <> 0 AND montos IS NOT NULL) THEN
        VALOR = :montos;
        ELSE
        IF (conc_monto <> 0 AND conc_monto IS NOT NULL) THEN
        VALOR = :conc_monto;
        EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
    END
item = :item + 1;
END
 IF (conc_cod = 920) THEN
 BEGIN
 SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :valor;
 IF (valor IS NULL) THEN
 valor = 0;
 item = :item + 1;
 END
    IF (liquidaper = 0) THEN
    INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
    VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
    ELSE
    IF (liquidaper = 1) THEN
    BEGIN
    rmod = mod(:periodo, 2);
    IF (rmod = 0) THEN
        INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
        VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
    END
    ELSE
    IF (liquidaper = 2) THEN
    BEGIN
    rmod = mod(:periodo, 4);
    IF (rmod = 0) THEN
        INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
        VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
    END
END
END
END
END
ELSE
/*SI ES MENSUAL*/
IF (periodicidad = 1) THEN
BEGIN
EXECUTE PROCEDURE cambie_id_nomina RETURNING_VALUES(:idnomina);
INSERT INTO nomina (nomi_id, NOMI_FECCAUSA, NOMI_PAGOGLOBAL, NOMI_PERIODOCIDAD, NOMI_PERIODO, NOMI_ANO, NOMI_LIQOK)
VALUES (:IDNOMINA, :fec,:pagoglobal, :periodicidad, :periodo, :ano, 'N');
    BEGIN
    item = 1;
    FOR SELECT E.TERC_NIT, E.empl_salario, e.empl_eps, e.empl_afc, e.empl_afp, e.empl_ccf
    FROM EMPLEADOS E
    WHERE E.empl_ppago = 1
    INTO :nite, :basico, :niteps, :nitafc, :nitafp, :nitccf
    DO
    FOR SELECT CE.TERC_NIT, CE.CONC_COD, CE.EMCO_MONTO, CE.EMCO_PORC, ce.empl_entidad, CE.emco_perprom, CE.emco_luquidaper,    CN.CONC_COD, CN.CONC_DEDUC,CN.CONC_PORC, CN.CONC_ENTIDAD, CN.CONC_MONTO,  CN.CONC_DIAS, CN.CONC_MODIFI,
    CN.CONC_PROMEDIO, CN.conc_salario, CE.emco_perprom, CN.conc_prov, CN.conc_aporte, CN.conc_aplicaprom, cn.conc_otroconc, cn.conc_codotroconc, CN.conc_gtoempr
    FROM empleado_conceptos CE, CONCEPTOS_NOMINA CN WHERE ((CE.terc_nit = :nite) AND (CE.CONC_COD = CN.CONC_COD) AND (CN.conc_fecini <= :fec AND CN.conc_fecfin >= :FEC) ) OR ((CE.terc_nit = :nite)
    AND (CE.CONC_COD = CN.CONC_COD) AND (cn.conc_todosper = 'N') AND (CE.emco_ppago = :periodo)) OR  ((CE.terc_nit = :nite) AND (CE.CONC_COD = CN.CONC_COD) AND cn.conc_todosper = 'S')  ORDER BY (TERC_NIT)
    INTO :nit_tercero, :concept,  :montos, :porcen, :entidad, :numeroprom, :liquidaper ,:CONC_COD, :CONC_DEDUC, :CONC_PORC,
    :CONC_ENTIDAD, :CONC_MONTO, :CONC_DIAS, :CONC_MODIFI,:CONC_PROMEDIO, :salario,:EMCO_PERPROM, :conc_prov, :conc_aporte , :CONC_APLICAPROM, :conc_otroconc, :conc_codotroconc, :gtoempr    DO
BEGIN
    IF (conc_dias = 'S') THEN
    EXECUTE PROCEDURE DIAS_LABORADOS (:nite, :periodo, :fec) RETURNING_VALUES (:diaslab);
    ELSE
    diaslab = 30;
 SELECT ((n.nono_valor /30) * n.nono_dura), (n.nono_dura) FROM nomina_novedades n WHERE n.tnov_cod = 11 AND n.terc_nit = :nite AND n.nono_periodo = :periodo INTO :cambsaltrans, :duranov;
 IF (cambsaltrans IS NULL) THEN
 cambsaltrans = 0;
 IF (duranov IS NULL) THEN
 duranov = 0;
 diaslab = :diaslab - :duranov;
 IF (conc_cod = 921) THEN
 BEGIN
 IF (porcen IS NOT NULL AND porcen <> 0) THEN
 valor = ((basico / 30)* :diaslab ) * :PORCEN /100;
 ELSE
 IF (conc_porc IS NOT NULL AND conc_porc <> 0) THEN
 valor = ((:basico / 30)* :diaslab ) * :conc_porc /100;
 EXECUTE PROCEDURE REDONDEE(:valor, 5) RETURNING_VALUES (VALOR);
 END
 ELSE
 IF (conc_cod = 922) THEN
 BEGIN
 SELECT P.prcu_monto FROM prestamo_cuotas P, prestamo_nomina PN WHERE P.prcu_ano = :ano AND P.prcu_periodo = :periodo AND PN.prno_id = P.prno_id AND PN.terc_nit = :nite INTO :valor;
 IF (valor IS NULL) THEN
 valor = 0;
 EXECUTE PROCEDURE REDONDEE(:valor, 5) RETURNING_VALUES (VALOR);
 item = :item + 1;
 UPDATE prestamo_cuotas  P SET prcu_ok = 'S' WHERE P.prcu_ano = :ano AND P.prcu_periodo = :periodo AND P.prno_id = (SELECT PN.prno_id FROM PRESTAMO_NOMINA PN WHERE PN.terc_nit = :nite);
 END
 ELSE
 BEGIN
    IF ((:montos = 0) OR (:montos IS NULL)) THEN
      BEGIN
      IF ((CONC_PORC = 0 AND :porcen = 0) OR (CONC_PORC IS NULL AND :porcen = 0) OR (CONC_PORC = 0 AND :porcen IS NULL) OR (CONC_PORC IS NULL AND :porcen IS NULL) ) THEN
        BEGIN
        IF ((conc_monto <> 0) AND (conc_monto IS NOT NULL) ) THEN
        BEGIN
        VALOR = :CONC_MONTO/30 * :diaslab;
        EXECUTE PROCEDURE REDONDEE(:valor, 5) RETURNING_VALUES (VALOR);
        END
        ELSE
        IF (salario = 'S' AND CONC_COD <> 900 AND CONC_COD <> 920) THEN
        BEGIN
        conc_monto = :basico;
        VALOR = (:conc_monto/30 * :diaslab ) + :cambsaltrans;
        EXECUTE PROCEDURE REDONDEE(:valor, 5) RETURNING_VALUES (VALOR);
        END
        ELSE
        valor = montos;
        END
       ELSE
       BEGIN
        IF (:porcen <> 0) THEN
          BEGIN
            IF ((conc_monto <> 0) AND (conc_monto IS NOT NULL) ) THEN
            BEGIN
              VALOR = ((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans * :PORCEN) /100;
              EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
            END
          END
          ELSE
          BEGIN
            IF ((conc_monto <> 0) AND (conc_monto IS NOT NULL) ) THEN
            BEGIN
              VALOR = ((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans * :conc_porc) /100;
              EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
            END
            ELSE
        IF (salario = 'S' AND CONC_COD <> 900 AND CONC_COD <> 920) THEN
            BEGIN
              conc_monto = :basico;
              VALOR = ((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans * :conc_porc) /100;
              EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
            END
          END
       END
      END
    ELSE
    BEGIN
      IF (CONC_PORC = 0 AND :porcen = 0) THEN
      BEGIN
      VALOR = (:montos/30 * :diaslab);
      EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
      END
      ELSE
      BEGIN
        IF (:porcen <> 0) THEN
          BEGIN
          VALOR = ((:MONTOS/30 * :diaslab )+ :cambsaltrans * :PORCEN) /100;
          EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
          END
          ELSE
          BEGIN
          VALOR = ((:montos/30 * :diaslab )+ :cambsaltrans * :CONC_PORC) /100;
          END
          EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
       END
   END
    IF (conc_promedio = 'S') THEN
    BEGIN
    perinicial = :periodo - (:numeroprom) + 1;
    anoprom = CAST (ano AS INTEGER);
    IF (perinicial <= 0) THEN
    BEGIN
    perinicial = 24 + :PERINICIAL;
    anoprom = CAST(ANO AS INTEGER) - 1;
    END
    SELECT SUM (noco_valor) FROM nomina_conceptos n WHERE n.noco_aplicaprom = 'S' AND N.noco_periodo >= :perinicial - 1 AND N.noco_periodo < :periodo AND N.noco_ano >= :anoprom AND N.noco_ano <= :ano AND terc_nit = :nite INTO :valor;
    valor = (valor / numeroprom)/*/ 30 * :diaslab*/;
    SELECT NOCO_VALOR FROM NOMINA_CONCEPTOS WHERE CONC_COD = :conc_cod AND TERC_NIT  = :nite AND NOCO_PAGOOK = 'N' AND NOCO_PERIODO = 0 INTO :saldosini;
    IF (saldosini IS NULL) THEN
    saldosini = 0;
    ELSE
    UPDATE nomina_conceptos N SET noco_pagook = 'S' WHERE n.noco_aplicaprom = 'S' AND N.noco_periodo >= :perinicial - 1 AND N.noco_periodo < :periodo AND N.noco_ano >= :anoprom AND N.noco_ano <= :ano  AND CONC_COD = :conc_cod AND terc_nit = :nite AND NOCO_PERIODO = 0;
    VALOR = :valor + :saldosini;
    EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
    UPDATE nomina_conceptos N SET noco_pagook = 'S' WHERE n.noco_aplicaprom = 'S' AND N.noco_periodo >= :perinicial - 1 AND N.noco_periodo < :periodo AND N.noco_ano >= :anoprom AND N.noco_ano <= :ano  AND CONC_COD = :conc_cod AND terc_nit = :nite;
    END
    IF (conc_otroconc = 'S') THEN
    BEGIN
    anosum = CAST(ano AS INTEGER);
    anosum = anosum - 1;
    SELECT SUM (noco_valor) FROM nomina_conceptos n WHERE n.noco_ano = :anosum AND n.conc_cod = :conc_codotroconc AND N.terc_nit = :nite INTO :valor;
    SELECT NOCO_VALOR FROM NOMINA_CONCEPTOS WHERE noco_ano = :anosum AND conc_cod = :conc_codotroconc AND terc_nit = :nite AND NOCO_PERIODO = 0 INTO :saldosini;
    IF (saldosini IS NULL) THEN
    saldosini = 0;
    ELSE
    UPDATE nomina_conceptos SET noco_pagook = 'S' WHERE noco_ano = :anosum AND conc_cod = :conc_codotroconc AND NOCO_PERIODO = 0 AND terc_nit = :nite;
    VALOR = :valor + :saldosini;
    UPDATE nomina_conceptos SET noco_pagook = 'S' WHERE noco_ano = :anosum AND conc_cod = :conc_codotroconc AND terc_nit = :nite;
    END
/*SI EL CONCEPTO ES UN APORTE*/
IF (conc_aporte = 'S') THEN
BEGIN
    IF ((:entidad = '' ) OR (entidad IS NULL)) THEN
    BEGIN
     SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
     IF (comision IS NULL) THEN
     comision = 0;
     valor = :basico + :comision;
    IF ((conc_cod = 904) OR (conc_cod = 905) OR (conc_cod = 906)) THEN
            BEGIN
            entidad = :nitafp;
                IF (conc_cod = 904) THEN
                BEGIN
                SELECT A.paan_afptr FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = (((((:basico /30) * :diaslab ) + :comision)+ :cambsaltrans) * :PORCEN) /100;
                END
                ELSE
                IF ((conc_cod = 905) OR (conc_cod = 906)) THEN
                BEGIN
                SELECT A.paan_afpem FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = (((((:basico /30) * :diaslab ) + :comision)+ :cambsaltrans) * :PORCEN) /100;
                END
                EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
            END
            ELSE
       IF ((conc_cod = 907) OR (conc_cod = 914) OR (conc_cod = 915)) THEN
            BEGIN
            entidad = :niteps;
                IF (conc_cod = 907) THEN
                BEGIN
                SELECT A.paan_epstr FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = (((((:basico )/30 * :diaslab ) + :comision)+ :cambsaltrans) * :PORCEN) /100;
                END
                ELSE
                IF ((conc_cod = 914) OR (conc_cod = 915)) THEN
                BEGIN
                SELECT A.paan_epsem FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = (((((:basico )/30 * :diaslab ) + :comision)+ :cambsaltrans) * :PORCEN) /100;
                END
                EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
            END
            ELSE
       IF ((conc_cod = 910) OR (conc_cod = 911) OR (conc_cod = 916) OR (conc_cod = 917) OR (conc_cod = 918) OR (conc_cod = 919)) THEN
            BEGIN
            entidad = :nitccf;
            SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
            IF (comision IS NULL) THEN
            comision = 0;
                IF ((conc_cod = 910) OR (conc_cod = 911) ) THEN
                BEGIN
                SELECT A.paan_ccf FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = (((((:basico )/30 * :diaslab ) + :comision)+ :cambsaltrans) * :PORCEN) /100;
                EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
                END
                ELSE
                IF ((conc_cod = 916) OR (conc_cod = 917)) THEN
                BEGIN
                SELECT A.paan_icbf FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = (((((:basico )/30 * :diaslab ) + :comision)+ :cambsaltrans) * :PORCEN) /100;
                EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
                END
                ELSE
                IF ((conc_cod = 918) OR (conc_cod = 919)) THEN
                BEGIN
                SELECT A.paan_sena FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = (((((:basico )/30 * :diaslab ) + :comision)+ :cambsaltrans) * :PORCEN) /100;
                EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
                END
            END
            ELSE
        IF ((conc_cod = 912) OR (conc_cod = 913)) THEN
            BEGIN
            entidad = :nitafc;
            SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
            IF (comision IS NULL) THEN
            comision = 0;
                IF ((conc_cod = 912) OR (conc_cod = 913) ) THEN
                BEGIN
                SELECT A.paan_cesemp FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = ((((:basico + :comision)/30 * :diaslab )+ :cambsaltrans) * :PORCEN) /100;
                EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
                END
            END
            ELSE
        BEGIN
        IF (comision IS NULL) THEN
        comision = 0;
        SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
        conc_monto = :basico + :comision;
        IF (conc_porc <> 0 AND conc_porc IS NOT NULL) THEN
        VALOR = (((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans) * :conc_porc) /100;
        ELSE
        IF (:porcen <> 0 AND :porcen IS NOT NULL) THEN
        VALOR = (((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans) * :porcen) /100;
        ELSE
        IF (:montos <> 0 AND :montos IS NOT NULL) THEN
        valor = :montos;
        ELSE
        IF (:conc_monto <> 0 AND :conc_monto IS NOT NULL) THEN
        valor = :conc_monto;
        EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
        END
    END
    END
    ELSE
    IF (conc_prov = 'S') THEN
    BEGIN
        conc_monto = :basico;
        IF (conc_porc <> 0 AND conc_porc IS NOT NULL) THEN
        VALOR = (((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans) * :conc_porc) /100;
        ELSE
        IF (porcen <> 0 AND porcen IS NOT NULL) THEN
        VALOR = (((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans) * :porcen) /100;
        ELSE
        IF (montos <> 0 AND montos IS NOT NULL) THEN
        VALOR = :montos;
        ELSE
        IF (conc_monto <> 0 AND conc_monto IS NOT NULL) THEN
        VALOR = :conc_monto;
        EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
    END
item = :item + 1;
END
IF (conc_cod = 920) THEN
 BEGIN
 SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :valor;
 IF (valor IS NULL) THEN
 valor = 0;
 item = :item + 1;
 END
    IF (liquidaper = 0) THEN
    INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
    VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
    ELSE
    IF (liquidaper = 1) THEN
    BEGIN
    rmod = mod(:periodo, 2);
    IF (rmod = 0) THEN
        INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
        VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
    END
    ELSE
    IF (liquidaper = 2) THEN
    BEGIN
    rmod = mod(:periodo, 4);
    IF (rmod = 0) THEN
        INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
        VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
    END
END
END
END
ELSE
/*SI ES SEMANAL*/
IF (periodicidad = 3) THEN
BEGIN
EXECUTE PROCEDURE cambie_id_nomina RETURNING_VALUES(:idnomina);
INSERT INTO nomina (nomi_id, NOMI_FECCAUSA, NOMI_PAGOGLOBAL, NOMI_PERIODOCIDAD, NOMI_PERIODO, NOMI_ANO, NOMI_LIQOK)
VALUES (:IDNOMINA, :fec,:pagoglobal, :periodicidad, :periodo, :ano, 'N');
    BEGIN
    item = 1;
    FOR SELECT E.TERC_NIT, E.empl_salario, e.empl_eps, e.empl_afc, e.empl_afp, e.empl_ccf
    FROM EMPLEADOS E
    WHERE E.empl_ppago = 3
    INTO :nite, :basico, :niteps, :nitafc, :nitafp, :nitccf
    DO
    BEGIN
    FOR SELECT CE.TERC_NIT, CE.CONC_COD, CE.EMCO_MONTO, CE.EMCO_PORC, ce.empl_entidad, CE.emco_perprom, CE.emco_luquidaper,    CN.CONC_COD, CN.CONC_DEDUC,CN.CONC_PORC, CN.CONC_ENTIDAD, CN.CONC_MONTO,  CN.CONC_DIAS, CN.CONC_MODIFI,
    CN.CONC_PROMEDIO, CN.conc_salario, CE.emco_perprom, CN.conc_prov, CN.conc_aporte, CN.conc_aplicaprom, cn.conc_otroconc, cn.conc_codotroconc, CN.conc_gtoempr
    FROM empleado_conceptos CE, CONCEPTOS_NOMINA CN WHERE ((CE.terc_nit = :nite) AND (CE.CONC_COD = CN.CONC_COD) AND (CN.conc_fecini <= :fec AND CN.conc_fecfin >= :FEC) ) OR ((CE.terc_nit = :nite)
    AND (CE.CONC_COD = CN.CONC_COD) AND (cn.conc_todosper = 'N') AND (CE.emco_ppago = :periodo)) OR  ((CE.terc_nit = :nite) AND (CE.CONC_COD = CN.CONC_COD) AND cn.conc_todosper = 'S')  ORDER BY (TERC_NIT)
    INTO :nit_tercero, :concept,  :montos, :porcen, :entidad, :numeroprom, :liquidaper ,:CONC_COD, :CONC_DEDUC, :CONC_PORC,
    :CONC_ENTIDAD, :CONC_MONTO, :CONC_DIAS, :CONC_MODIFI,:CONC_PROMEDIO, :salario,:EMCO_PERPROM, :conc_prov, :conc_aporte , :CONC_APLICAPROM, :conc_otroconc, :conc_codotroconc, :gtoempr
    DO
BEGIN
    IF (conc_dias = 'S') THEN
    EXECUTE PROCEDURE DIAS_LABORADOS (:nite, :periodo, :fec) RETURNING_VALUES (:diaslab);
    ELSE
    BEGIN
    IF (liquidaper = 0) THEN
    diaslab = 7;
    ELSE
    IF (liquidaper = 1) THEN
    diaslab = 15;
    ELSE
    IF (liquidaper = 2) THEN
    diaslab = 30;
    END
 SELECT ((n.nono_valor /30) * n.nono_dura), (n.nono_dura) FROM nomina_novedades n WHERE n.tnov_cod = 11 AND n.terc_nit = :nite AND n.nono_periodo = :periodo INTO :cambsaltrans, :duranov;
 IF (cambsaltrans IS NULL) THEN
 cambsaltrans = 0;
 IF (duranov IS NULL) THEN
 duranov = 0;
 diaslab = :diaslab - :duranov;
 IF (conc_cod = 920) THEN
 BEGIN
 SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :valor;
 IF (valor IS NULL) THEN
 valor = 0;
 item = :item + 1;
 END
 ELSE
 IF (conc_cod = 921) THEN
 BEGIN
 IF (porcen IS NOT NULL AND porcen <> 0) THEN
 valor = ((basico / 30)* :diaslab ) * :PORCEN /100;
 ELSE
 IF (conc_porc IS NOT NULL AND conc_porc <> 0) THEN
 valor = ((:basico / 30)* :diaslab ) * :conc_porc /100;
 EXECUTE PROCEDURE REDONDEE(:valor, 5) RETURNING_VALUES (VALOR);
 END
 ELSE
 IF (conc_cod = 922) THEN
 BEGIN
 SELECT P.prcu_monto FROM prestamo_cuotas P, prestamo_nomina PN WHERE P.prcu_ano = :ano AND P.prcu_periodo = :periodo AND PN.prno_id = P.prno_id AND PN.terc_nit = :nite INTO :valor;
 IF (valor IS NULL) THEN
 valor = 0;
 EXECUTE PROCEDURE REDONDEE(:valor, 5) RETURNING_VALUES (VALOR);
 item = :item + 1;
 UPDATE prestamo_cuotas  P SET prcu_ok = 'S' WHERE P.prcu_ano = :ano AND P.prcu_periodo = :periodo AND P.prno_id = (SELECT PN.prno_id FROM PRESTAMO_NOMINA PN WHERE PN.terc_nit = :nite);
 END
 ELSE
 BEGIN
    IF ((:montos = 0) OR (:montos IS NULL)) THEN
      BEGIN
      IF ((CONC_PORC = 0 AND :porcen = 0) OR (CONC_PORC IS NULL AND :porcen = 0) OR (CONC_PORC = 0 AND :porcen IS NULL) OR (CONC_PORC IS NULL AND :porcen IS NULL) ) THEN
        BEGIN
        IF ((conc_monto <> 0) AND (conc_monto IS NOT NULL) ) THEN
        BEGIN
        VALOR = :CONC_MONTO/30 * :diaslab;
        EXECUTE PROCEDURE REDONDEE(:valor, 5) RETURNING_VALUES (VALOR);
        END
        ELSE
        IF (salario = 'S' AND CONC_COD <> 900 AND CONC_COD <> 920) THEN
        BEGIN
        conc_monto = :basico;
        VALOR = (:conc_monto/30 * :diaslab ) + :cambsaltrans;
        EXECUTE PROCEDURE REDONDEE(:valor, 5) RETURNING_VALUES (VALOR);
        END
        ELSE
        valor = montos;
        END
       ELSE
       BEGIN
        IF (:porcen <> 0) THEN
          BEGIN
            IF ((conc_monto <> 0) AND (conc_monto IS NOT NULL) ) THEN
            BEGIN
              VALOR = ((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans * :PORCEN) /100;
              EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
            END
          END
          ELSE
          BEGIN
            IF ((conc_monto <> 0) AND (conc_monto IS NOT NULL) ) THEN
            BEGIN
              VALOR = ((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans * :conc_porc) /100;
              EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
            END
            ELSE
        IF (salario = 'S' AND CONC_COD <> 900 AND CONC_COD <> 920) THEN
            BEGIN
              conc_monto = :basico;
              VALOR = ((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans * :conc_porc) /100;
              EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
            END
          END
       END
      END
    ELSE
    BEGIN
      IF (CONC_PORC = 0 AND :porcen = 0) THEN
      BEGIN
      VALOR = (:montos/30 * :diaslab);
      EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
      END
      ELSE
      BEGIN
        IF (:porcen <> 0) THEN
          BEGIN
          VALOR = ((:MONTOS/30 * :diaslab )+ :cambsaltrans * :PORCEN) /100;
          EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
          END
          ELSE
          BEGIN
          VALOR = ((:montos/30 * :diaslab )+ :cambsaltrans * :CONC_PORC) /100;
          END
          EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
       END
   END
    IF (conc_promedio = 'S') THEN
    BEGIN
    perinicial = :periodo - (:numeroprom) + 1;
    anoprom = CAST (ano AS INTEGER);
    IF (perinicial <= 0) THEN
    BEGIN
    perinicial = 24 + :PERINICIAL;
    anoprom = CAST(ANO AS INTEGER) - 1;
    END
    SELECT SUM (noco_valor) FROM nomina_conceptos n WHERE n.noco_aplicaprom = 'S' AND N.noco_periodo >= :perinicial - 1 AND N.noco_periodo < :periodo AND N.noco_ano >= :anoprom AND N.noco_ano <= :ano AND terc_nit = :nite INTO :valor;
    valor = (valor / numeroprom)/*/ 30 * :diaslab*/;
    SELECT NOCO_VALOR FROM NOMINA_CONCEPTOS WHERE CONC_COD = :conc_cod AND TERC_NIT  = :nite AND NOCO_PAGOOK = 'N' AND NOCO_PERIODO = 0 INTO :saldosini;
    IF (saldosini IS NULL) THEN
    saldosini = 0;
    ELSE
    UPDATE nomina_conceptos N SET noco_pagook = 'S' WHERE n.noco_aplicaprom = 'S' AND N.noco_periodo >= :perinicial - 1 AND N.noco_periodo < :periodo AND N.noco_ano >= :anoprom AND N.noco_ano <= :ano  AND CONC_COD = :conc_cod AND terc_nit = :nite AND NOCO_PERIODO = 0;
    VALOR = :valor + :saldosini;
    EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
    UPDATE nomina_conceptos N SET noco_pagook = 'S' WHERE n.noco_aplicaprom = 'S' AND N.noco_periodo >= :perinicial - 1 AND N.noco_periodo < :periodo AND N.noco_ano >= :anoprom AND N.noco_ano <= :ano  AND CONC_COD = :conc_cod AND terc_nit = :nite;
    END
    IF (conc_otroconc = 'S') THEN
    BEGIN
    anosum = CAST(ano AS INTEGER);
    anosum = anosum - 1;
    SELECT SUM (noco_valor) FROM nomina_conceptos n WHERE n.noco_ano = :anosum AND n.conc_cod = :conc_codotroconc AND N.terc_nit = :nite INTO :valor;
    SELECT NOCO_VALOR FROM NOMINA_CONCEPTOS WHERE noco_ano = :anosum AND conc_cod = :conc_codotroconc AND terc_nit = :nite AND NOCO_PERIODO = 0 INTO :saldosini;
    IF (saldosini IS NULL) THEN
    saldosini = 0;
    ELSE
    UPDATE nomina_conceptos SET noco_pagook = 'S' WHERE noco_ano = :anosum AND conc_cod = :conc_codotroconc AND NOCO_PERIODO = 0 AND terc_nit = :nite;
    VALOR = :valor + :saldosini;
    UPDATE nomina_conceptos SET noco_pagook = 'S' WHERE noco_ano = :anosum AND conc_cod = :conc_codotroconc AND terc_nit = :nite;
    END
/*SI EL CONCEPTO ES UN APORTE*/
IF (conc_aporte = 'S') THEN
BEGIN
    IF ((:entidad = '' ) OR (entidad IS NULL)) THEN
    BEGIN
     SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
     IF (comision IS NULL) THEN
     comision = 0;
     valor = :basico + :comision;
    IF ((conc_cod = 904) OR (conc_cod = 905) OR (conc_cod = 906)) THEN
            BEGIN
            entidad = :nitafp;
                IF (conc_cod = 904) THEN
                BEGIN
                SELECT A.paan_afptr FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = (((((:basico /30) * :diaslab ) + :comision)+ :cambsaltrans) * :PORCEN) /100;
                END
                ELSE
                IF ((conc_cod = 905) OR (conc_cod = 906)) THEN
                BEGIN
                SELECT A.paan_afpem FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = (((((:basico /30) * :diaslab ) + :comision)+ :cambsaltrans) * :PORCEN) /100;
                END
                EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
            END
            ELSE
       IF ((conc_cod = 907) OR (conc_cod = 914) OR (conc_cod = 915)) THEN
            BEGIN
            entidad = :niteps;
                IF (conc_cod = 907) THEN
                BEGIN
                SELECT A.paan_epstr FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = (((((:basico )/30 * :diaslab ) + :comision)+ :cambsaltrans) * :PORCEN) /100;
                END
                ELSE
                IF ((conc_cod = 914) OR (conc_cod = 915)) THEN
                BEGIN
                SELECT A.paan_epsem FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = (((((:basico )/30 * :diaslab ) + :comision)+ :cambsaltrans) * :PORCEN) /100;
                END
                EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
            END
            ELSE
       IF ((conc_cod = 910) OR (conc_cod = 911) OR (conc_cod = 916) OR (conc_cod = 917) OR (conc_cod = 918) OR (conc_cod = 919)) THEN
            BEGIN
            entidad = :nitccf;
            SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
            IF (comision IS NULL) THEN
            comision = 0;
                IF ((conc_cod = 910) OR (conc_cod = 911) ) THEN
                BEGIN
                SELECT A.paan_ccf FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = (((((:basico )/30 * :diaslab ) + :comision)+ :cambsaltrans) * :PORCEN) /100;
                EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
                END
                ELSE
                IF ((conc_cod = 916) OR (conc_cod = 917)) THEN
                BEGIN
                SELECT A.paan_icbf FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = (((((:basico )/30 * :diaslab ) + :comision)+ :cambsaltrans) * :PORCEN) /100;
                EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
                END
                ELSE
                IF ((conc_cod = 918) OR (conc_cod = 919)) THEN
                BEGIN
                SELECT A.paan_sena FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = (((((:basico )/30 * :diaslab ) + :comision)+ :cambsaltrans) * :PORCEN) /100;
                EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
                END
            END
            ELSE
        IF ((conc_cod = 912) OR (conc_cod = 913)) THEN
            BEGIN
            entidad = :nitafc;
            SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
            IF (comision IS NULL) THEN
            comision = 0;
                IF ((conc_cod = 912) OR (conc_cod = 913) ) THEN
                BEGIN
                SELECT A.paan_cesemp FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = ((((:basico + :comision)/30 * :diaslab )+ :cambsaltrans) * :PORCEN) /100;
                EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
                END
            END
            ELSE
        BEGIN
        IF (comision IS NULL) THEN
        comision = 0;
        SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
        conc_monto = :basico + :comision;
        IF (conc_porc <> 0 AND conc_porc IS NOT NULL) THEN
        VALOR = (((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans) * :conc_porc) /100;
        ELSE
        IF (:porcen <> 0 AND :porcen IS NOT NULL) THEN
        VALOR = (((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans) * :porcen) /100;
        ELSE
        IF (:montos <> 0 AND :montos IS NOT NULL) THEN
        valor = :montos;
        ELSE
        IF (:conc_monto <> 0 AND :conc_monto IS NOT NULL) THEN
        valor = :conc_monto;
        EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
        END
    END
    END
    ELSE
    IF (conc_prov = 'S') THEN
    BEGIN
        conc_monto = :basico;
        IF (conc_porc <> 0 AND conc_porc IS NOT NULL) THEN
        VALOR = (((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans) * :conc_porc) /100;
        ELSE
        IF (porcen <> 0 AND porcen IS NOT NULL) THEN
        VALOR = (((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans) * :porcen) /100;
        ELSE
        IF (montos <> 0 AND montos IS NOT NULL) THEN
        VALOR = :montos;
        ELSE
        IF (conc_monto <> 0 AND conc_monto IS NOT NULL) THEN
        VALOR = :conc_monto;
        EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
    END
item = :item + 1;
END
    IF (liquidaper = 0) THEN
    INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
    VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
    ELSE
    IF (liquidaper = 1) THEN
    BEGIN
    rmod = mod(:periodo, 2);
    IF (rmod = 0) THEN
        INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
        VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
    END
    ELSE
    IF (liquidaper = 2) THEN
    BEGIN
    rmod = mod(:periodo, 4);
    IF (rmod = 0) THEN
        INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
        VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
    END
END
END
END
END
SUSPEND;
END

^

SET TERM ; ^

SET TERM ^ ;

ALTER TRIGGER NOMINA_DETALLE_BI
AS
DECLARE VARIABLE PERIODO INTEGER;
DECLARE VARIABLE fec DATE;
BEGIN
SELECT N.nomi_periodo, n.nomi_feccausa FROM NOMINA N WHERE N.nomi_id = NEW.nomi_id INTO :periodo, :fec;
EXECUTE PROCEDURE DIAS_LABORADOS (NEW.terc_nit, :periodo, :fec)RETURNING_VALUES(NEW.node_diaslab);
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER TRIGGER NOMINA_CONCEPTOS_BU
ACTIVE BEFORE UPDATE POSITION 0
as
begin
  if ((new.noco_deduc = 'S') and (new.noco_valor > 0)) then
  NEW.noco_valor = NEW.noco_valor * (-1);
end
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE DIAS_LABORADOS(
    NITEMPL VARCHAR(20),
    PERIODO INTEGER,
    FEC DATE)
RETURNS (
    TOTALDIASLAB INTEGER)
AS
DECLARE VARIABLE diasnolab INTEGER;
DECLARE VARIABLE diaslabxper INTEGER;
DECLARE VARIABLE perpago INTEGER;
DECLARE VARIABLE fecing DATE;
BEGIN
SELECT E.empl_ppago, E.empl_fecing
FROM EMPLEADOS E WHERE TERC_NIT = :nitempl
INTO :perpago, :fecing;
IF (perpago = 1) THEN
diaslabxper = 30;
ELSE
IF (perpago = 2) THEN
diaslabxper = 15;
ELSE
IF (perpago = 3) THEN
diaslabxper = 7;
if (SUBSTR(fec,1,8) = SUBSTR(fecing,1,8)) then
BEGIN
diaslabxper = cast(substr(fec,8,9) as integer) - cast(substr(fecing,8,9) as integer);
END
SELECT SUM (NONO_DURA)
FROM nomina_novedades WHERE TERC_NIT = :nitempl AND TNOV_COD = 9 AND NONO_PERIODO = :periodo
INTO :diasnolab;
totaldiaslab =  :diaslabxper - :diasnolab;
IF (totaldiaslab IS NULL) THEN
totaldiaslab =  :diaslabxper;
SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE CAUSA_NOMINA(
    FEC DATE,
    PERIODO INTEGER,
    PERIODICIDAD INTEGER,
    PAGOGLOBAL CHAR(1),
    ANO CHAR(4))
RETURNS (
    IDNOMINA INTEGER)
AS
DECLARE VARIABLE item INTEGER;
DECLARE VARIABLE nite VARCHAR(20) CHARACTER SET none;
DECLARE VARIABLE nit_tercero VARCHAR(20);
DECLARE VARIABLE concept INTEGER;
DECLARE VARIABLE montos NUMERIC(18,2);
DECLARE VARIABLE porcen NUMERIC(9,4);
DECLARE VARIABLE entidad VARCHAR(20);
DECLARE VARIABLE conc_cod INTEGER;
DECLARE VARIABLE conc_deduc CHAR(1);
DECLARE VARIABLE conc_porc NUMERIC(9,4);
DECLARE VARIABLE conc_entidad INTEGER;
DECLARE VARIABLE conc_monto NUMERIC(18,2);
DECLARE VARIABLE conc_modifi CHAR(1);
DECLARE VARIABLE conc_promedio CHAR(1);
DECLARE VARIABLE emco_perprom INTEGER;
DECLARE VARIABLE valor NUMERIC(18,2);
DECLARE VARIABLE diaslab INTEGER;
DECLARE VARIABLE conc_prov CHAR(1);
DECLARE VARIABLE conc_aporte CHAR(1);
DECLARE VARIABLE numeroprom INTEGER;
DECLARE VARIABLE conc_aplicaprom CHAR(1);
DECLARE VARIABLE perinicial INTEGER;
DECLARE VARIABLE anoprom INTEGER;
DECLARE VARIABLE conc_dias CHAR(1);
DECLARE VARIABLE conc_otroconc CHAR(1);
DECLARE VARIABLE conc_codotroconc INTEGER;
DECLARE VARIABLE anosum INTEGER;
DECLARE VARIABLE salario CHAR(1) CHARACTER SET none;
DECLARE VARIABLE liquidaper INTEGER;
DECLARE VARIABLE rmod NUMERIC(2,2);
DECLARE VARIABLE basico NUMERIC(18,2);
DECLARE VARIABLE niteps VARCHAR(20);
DECLARE VARIABLE nitafc VARCHAR(20);
DECLARE VARIABLE nitafp VARCHAR(20);
DECLARE VARIABLE nitccf VARCHAR(20);
DECLARE VARIABLE gtoempr CHAR(1);
DECLARE VARIABLE comision NUMERIC(18,2);
DECLARE VARIABLE cambsaltrans NUMERIC(18,2);
DECLARE VARIABLE SALDOSINI NUMERIC(18,2);
DECLARE VARIABLE duranov INTEGER;
DECLARE VARIABLE base NUMERIC(18,2);
BEGIN
/*SI ES QUINCENAL*/
IF (periodicidad = 2) THEN
BEGIN
EXECUTE PROCEDURE cambie_id_nomina RETURNING_VALUES(:idnomina);
INSERT INTO nomina (nomi_id, NOMI_FECCAUSA, NOMI_PAGOGLOBAL, NOMI_PERIODOCIDAD, NOMI_PERIODO, NOMI_ANO, NOMI_LIQOK)
VALUES (:IDNOMINA, :fec,:pagoglobal, :periodicidad, :periodo, :ano, 'N');
 BEGIN
    item = 1;
    FOR SELECT E.TERC_NIT, E.empl_salario, e.empl_eps, e.empl_afc, e.empl_afp, e.empl_ccf
    FROM EMPLEADOS E
    WHERE E.empl_ppago = 2
    INTO :nite, :basico, :niteps, :nitafc, :nitafp, :nitccf
    DO
    BEGIN
    FOR SELECT CE.TERC_NIT, CE.CONC_COD, CE.EMCO_MONTO, CE.EMCO_PORC, ce.empl_entidad, CE.emco_perprom, CE.emco_luquidaper, CN.CONC_COD, CN.CONC_DEDUC,CN.CONC_PORC, CN.CONC_ENTIDAD, CN.CONC_MONTO,  CN.CONC_DIAS, CN.CONC_MODIFI,
    CN.CONC_PROMEDIO, CN.conc_salario, CE.emco_perprom, CN.conc_prov, CN.conc_aporte, CN.conc_aplicaprom, cn.conc_otroconc, cn.conc_codotroconc, CN.conc_gtoempr, CN.conc_base
    FROM empleado_conceptos CE, CONCEPTOS_NOMINA CN WHERE ((CE.terc_nit = :nite) AND (CE.CONC_COD = CN.CONC_COD) AND (CN.conc_fecini <= :fec AND CN.conc_fecfin >= :FEC) ) OR ((CE.terc_nit = :nite)
    AND (CE.CONC_COD = CN.CONC_COD) AND (cn.conc_todosper = 'N') AND (CE.emco_ppago = :periodo)) OR  ((CE.terc_nit = :nite) AND (CE.CONC_COD = CN.CONC_COD) AND cn.conc_todosper = 'S')  ORDER BY (TERC_NIT )
    INTO :nit_tercero, :concept,  :montos, :porcen, :entidad, :numeroprom, :liquidaper ,:CONC_COD, :CONC_DEDUC, :CONC_PORC,
    :CONC_ENTIDAD, :CONC_MONTO, :CONC_DIAS, :CONC_MODIFI,:CONC_PROMEDIO, :salario,:EMCO_PERPROM, :conc_prov, :conc_aporte , :CONC_APLICAPROM, :conc_otroconc, :conc_codotroconc, :gtoempr, :base
    DO
BEGIN
    IF (conc_dias = 'S') THEN
    EXECUTE PROCEDURE DIAS_LABORADOS (:nite, :periodo, :fec) RETURNING_VALUES (:diaslab);
    ELSE
    BEGIN
    IF (liquidaper = 0) THEN
    diaslab = 15;
    ELSE
    IF (liquidaper = 1) THEN
    diaslab = 30;
    ELSE
    IF (liquidaper = 2) THEN
    diaslab = 60;
    END
 SELECT ((n.nono_valor /30) * n.nono_dura), (n.nono_dura) FROM nomina_novedades n WHERE n.tnov_cod = 11 AND n.terc_nit = :nite AND n.nono_periodo = :periodo INTO :cambsaltrans, :duranov;
 IF (cambsaltrans IS NULL) THEN
 cambsaltrans = 0;
 if (duranov is null) then
 duranov = 0;
 diaslab = :diaslab - :duranov;
 if (conc_cod = 921) then
 begin
 if (porcen IS NOT NULL AND porcen <> 0) then
 valor = ((basico / 30)* :diaslab ) * :PORCEN /100;
 ELSE
 if (conc_porc IS NOT null AND conc_porc <> 0) then
 valor = ((:basico / 30)* :diaslab ) * :conc_porc /100;
 EXECUTE PROCEDURE REDONDEE(:valor, 5) RETURNING_VALUES (VALOR);
 end
 ELSE
 if (conc_cod = 922) then
 BEGIN
 SELECT P.prcu_monto FROM prestamo_cuotas P, prestamo_nomina PN WHERE P.prcu_ano = :ano AND P.prcu_periodo = :periodo AND PN.prno_id = P.prno_id AND PN.terc_nit = :nite INTO :valor;
 IF (valor IS NULL) THEN
 valor = 0;
 EXECUTE PROCEDURE REDONDEE(:valor, 5) RETURNING_VALUES (VALOR);
 item = :item + 1;
 update prestamo_cuotas  P SET prcu_ok = 'S' WHERE P.prcu_ano = :ano AND P.prcu_periodo = :periodo AND P.prno_id = (SELECT PN.prno_id FROM PRESTAMO_NOMINA PN WHERE PN.terc_nit = :nite);
 END
 ELSE
 BEGIN
    IF ((:montos = 0) OR (:montos IS NULL)) THEN
      BEGIN
      IF ((CONC_PORC = 0 AND :porcen = 0) OR (CONC_PORC IS NULL AND :porcen = 0) OR (CONC_PORC = 0 AND :porcen IS NULL) OR (CONC_PORC IS NULL AND :porcen IS NULL) ) THEN
        BEGIN
        IF ((conc_monto <> 0) AND (conc_monto IS NOT NULL) ) THEN
        BEGIN
        VALOR = :CONC_MONTO/30 * :diaslab;
        EXECUTE PROCEDURE REDONDEE(:valor, 5) RETURNING_VALUES (VALOR);
        END
        ELSE
        IF (salario = 'S' AND CONC_COD <> 900 AND CONC_COD <> 920) THEN
        BEGIN
        conc_monto = :basico;
        VALOR = (:conc_monto/30 * :diaslab ) + :cambsaltrans;
        EXECUTE PROCEDURE REDONDEE(:valor, 5) RETURNING_VALUES (VALOR);
        END
        ELSE
        valor = montos;
        END
       ELSE
       BEGIN
        IF (:porcen <> 0) THEN
          BEGIN
            IF ((conc_monto <> 0) AND (conc_monto IS NOT NULL) ) THEN
            BEGIN
              VALOR = ((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans * :PORCEN) /100;
              EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
            END
          END
          ELSE
          BEGIN
            IF ((conc_monto <> 0) AND (conc_monto IS NOT NULL) ) THEN
            BEGIN
              VALOR = ((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans * :conc_porc) /100;
              EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
            END
            ELSE
        IF (salario = 'S' AND CONC_COD <> 900 AND CONC_COD <> 920) THEN
            BEGIN
              conc_monto = :basico;
              VALOR = ((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans * :conc_porc) /100;
              EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
            END
          END
       END
      END
    ELSE
    BEGIN
      IF (CONC_PORC = 0 AND :porcen = 0) THEN
      BEGIN
      VALOR = (:montos/30 * :diaslab);
      EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
      END
      ELSE
      BEGIN
        IF (:porcen <> 0) THEN
          BEGIN
          VALOR = ((:MONTOS/30 * :diaslab )+ :cambsaltrans * :PORCEN) /100;
          EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
          END
          ELSE
          BEGIN
          VALOR = ((:montos/30 * :diaslab )+ :cambsaltrans * :CONC_PORC) /100;
          END
          EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
       END
   END
    IF (conc_promedio = 'S') THEN
    BEGIN
    perinicial = :periodo - (:numeroprom) + 1;
    anoprom = CAST (ano AS INTEGER);
    IF (perinicial <= 0) THEN
    BEGIN
    perinicial = 24 + :PERINICIAL;
    anoprom = CAST(ANO AS INTEGER) - 1;
    END
    SELECT SUM (noco_valor) FROM nomina_conceptos n WHERE n.noco_aplicaprom = 'S' AND N.noco_periodo >= :perinicial - 1 AND N.noco_periodo < :periodo AND N.noco_ano >= :anoprom AND N.noco_ano <= :ano AND terc_nit = :nite INTO :valor;
    valor = (valor / numeroprom)/*/ 30 * :diaslab*/;
    SELECT NOCO_VALOR FROM NOMINA_CONCEPTOS WHERE CONC_COD = :conc_cod AND TERC_NIT  = :nite AND NOCO_PAGOOK = 'N' AND NOCO_PERIODO = 0 INTO :saldosini;
    IF (saldosini IS NULL) THEN
    saldosini = 0;
    ELSE
    UPDATE nomina_conceptos N SET noco_pagook = 'S' WHERE n.noco_aplicaprom = 'S' AND N.noco_periodo >= :perinicial - 1 AND N.noco_periodo < :periodo AND N.noco_ano >= :anoprom AND N.noco_ano <= :ano  AND CONC_COD = :conc_cod AND terc_nit = :nite AND NOCO_PERIODO = 0;
    VALOR = :valor + :saldosini;
    EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
    UPDATE nomina_conceptos N SET noco_pagook = 'S' WHERE n.noco_aplicaprom = 'S' AND N.noco_periodo >= :perinicial - 1 AND N.noco_periodo < :periodo AND N.noco_ano >= :anoprom AND N.noco_ano <= :ano  AND CONC_COD = :conc_cod AND terc_nit = :nite;
    END
    IF (conc_otroconc = 'S') THEN
    BEGIN
    anosum = CAST(ano AS INTEGER);
    anosum = anosum - 1;
    SELECT SUM (noco_valor) FROM nomina_conceptos n WHERE n.noco_ano = :anosum AND n.conc_cod = :conc_codotroconc AND N.terc_nit = :nite INTO :valor;
    SELECT NOCO_VALOR FROM NOMINA_CONCEPTOS WHERE noco_ano = :anosum AND conc_cod = :conc_codotroconc AND terc_nit = :nite AND NOCO_PERIODO = 0 INTO :saldosini;
    IF (saldosini IS NULL) THEN
    saldosini = 0;
    ELSE
    UPDATE nomina_conceptos SET noco_pagook = 'S' WHERE noco_ano = :anosum AND conc_cod = :conc_codotroconc AND NOCO_PERIODO = 0 AND terc_nit = :nite;
    VALOR = :valor + :saldosini;
    UPDATE nomina_conceptos SET noco_pagook = 'S' WHERE noco_ano = :anosum AND conc_cod = :conc_codotroconc AND terc_nit = :nite;
    END
/*SI EL CONCEPTO ES UN APORTE*/
IF (conc_aporte = 'S') THEN
BEGIN
    IF ((:entidad = '' ) OR (entidad IS NULL)) THEN
    BEGIN
     SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
     IF (comision IS NULL) THEN
     comision = 0;
     valor = :basico + :comision;
    IF ((conc_cod = 904) OR (conc_cod = 905) OR (conc_cod = 906)) THEN
            BEGIN
            entidad = :nitafp;
                IF (conc_cod = 904) THEN
                BEGIN
                SELECT A.paan_afptr FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = (((((:basico /30) * :diaslab ) + :comision)+ :cambsaltrans) * :PORCEN) /100;
                END
                ELSE
                IF ((conc_cod = 905) OR (conc_cod = 906)) THEN
                BEGIN
                SELECT A.paan_afpem FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = (((((:basico /30) * :diaslab ) + :comision)+ :cambsaltrans) * :PORCEN) /100;
                END
                EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
            END
            ELSE
       IF ((conc_cod = 907) OR (conc_cod = 914) OR (conc_cod = 915)) THEN
            BEGIN
            entidad = :niteps;
                IF (conc_cod = 907) THEN
                BEGIN
                SELECT A.paan_epstr FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = (((((:basico )/30 * :diaslab ) + :comision)+ :cambsaltrans) * :PORCEN) /100;
                END
                ELSE
                IF ((conc_cod = 914) OR (conc_cod = 915)) THEN
                BEGIN
                SELECT A.paan_epsem FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = (((((:basico )/30 * :diaslab ) + :comision)+ :cambsaltrans) * :PORCEN) /100;
                END
                EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
            END
            ELSE
       IF ((conc_cod = 910) OR (conc_cod = 911) OR (conc_cod = 916) OR (conc_cod = 917) OR (conc_cod = 918) OR (conc_cod = 919)) THEN
            BEGIN
            entidad = :nitccf;
            SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
            IF (comision IS NULL) THEN
            comision = 0;
                IF ((conc_cod = 910) OR (conc_cod = 911) ) THEN
                BEGIN
                SELECT A.paan_ccf FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = (((((:basico )/30 * :diaslab ) + :comision)+ :cambsaltrans) * :PORCEN) /100;
                EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
                END
                ELSE
                IF ((conc_cod = 916) OR (conc_cod = 917)) THEN
                BEGIN
                SELECT A.paan_icbf FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = (((((:basico )/30 * :diaslab ) + :comision)+ :cambsaltrans) * :PORCEN) /100;
                EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
                END
                ELSE
                IF ((conc_cod = 918) OR (conc_cod = 919)) THEN
                BEGIN
                SELECT A.paan_sena FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = (((((:basico )/30 * :diaslab ) + :comision)+ :cambsaltrans) * :PORCEN) /100;
                EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
                END
            END
            ELSE
        IF ((conc_cod = 912) OR (conc_cod = 913)) THEN
            BEGIN
            entidad = :nitafc;
            SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
            IF (comision IS NULL) THEN
            comision = 0;
                IF ((conc_cod = 912) OR (conc_cod = 913) ) THEN
                BEGIN
                SELECT A.paan_cesemp FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = ((((:basico + :comision)/30 * :diaslab )+ :cambsaltrans) * :PORCEN) /100;
                EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
                END
            END
            ELSE
        BEGIN
        IF (comision IS NULL) THEN
        comision = 0;
        SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
        conc_monto = :basico + :comision;
        IF (conc_porc <> 0 AND conc_porc IS NOT NULL) THEN
        VALOR = (((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans) * :conc_porc) /100;
        ELSE
        IF (:porcen <> 0 AND :porcen IS NOT NULL) THEN
        VALOR = (((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans) * :porcen) /100;
        ELSE
        IF (:montos <> 0 AND :montos IS NOT NULL) THEN
        valor = :montos;
        ELSE
        IF (:conc_monto <> 0 AND :conc_monto IS NOT NULL) THEN
        valor = :conc_monto;
        EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
        END
    END
    END
    ELSE
    IF (conc_prov = 'S') THEN
    BEGIN
        conc_monto = :basico;
        IF (conc_porc <> 0 AND conc_porc IS NOT NULL) THEN
        VALOR = (((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans) * :conc_porc) /100;
        ELSE
        IF (porcen <> 0 AND porcen IS NOT NULL) THEN
        VALOR = (((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans) * :porcen) /100;
        ELSE
        IF (montos <> 0 AND montos IS NOT NULL) THEN
        VALOR = :montos;
        ELSE
        IF (conc_monto <> 0 AND conc_monto IS NOT NULL) THEN
        VALOR = :conc_monto;
        EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
    END
item = :item + 1;
END
 IF (conc_cod = 920) THEN
 BEGIN
 SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :valor;
 IF (valor IS NULL) THEN
 valor = 0;
 item = :item + 1;
 END
    IF (liquidaper = 0) THEN
    INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
    VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
    ELSE
    IF (liquidaper = 1) THEN
    BEGIN
    rmod = mod(:periodo, 2);
    IF (rmod = 0) THEN
        INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
        VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
    END
    ELSE
    IF (liquidaper = 2) THEN
    BEGIN
    rmod = mod(:periodo, 4);
    IF (rmod = 0) THEN
        INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
        VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
    END
END
END
END
END
ELSE
/*SI ES MENSUAL*/
IF (periodicidad = 1) THEN
BEGIN
EXECUTE PROCEDURE cambie_id_nomina RETURNING_VALUES(:idnomina);
INSERT INTO nomina (nomi_id, NOMI_FECCAUSA, NOMI_PAGOGLOBAL, NOMI_PERIODOCIDAD, NOMI_PERIODO, NOMI_ANO, NOMI_LIQOK)
VALUES (:IDNOMINA, :fec,:pagoglobal, :periodicidad, :periodo, :ano, 'N');
    BEGIN
    item = 1;
    FOR SELECT E.TERC_NIT, E.empl_salario, e.empl_eps, e.empl_afc, e.empl_afp, e.empl_ccf
    FROM EMPLEADOS E
    WHERE E.empl_ppago = 1
    INTO :nite, :basico, :niteps, :nitafc, :nitafp, :nitccf
    DO
    FOR SELECT CE.TERC_NIT, CE.CONC_COD, CE.EMCO_MONTO, CE.EMCO_PORC, ce.empl_entidad, CE.emco_perprom, CE.emco_luquidaper,    CN.CONC_COD, CN.CONC_DEDUC,CN.CONC_PORC, CN.CONC_ENTIDAD, CN.CONC_MONTO,  CN.CONC_DIAS, CN.CONC_MODIFI,
    CN.CONC_PROMEDIO, CN.conc_salario, CE.emco_perprom, CN.conc_prov, CN.conc_aporte, CN.conc_aplicaprom, cn.conc_otroconc, cn.conc_codotroconc, CN.conc_gtoempr
    FROM empleado_conceptos CE, CONCEPTOS_NOMINA CN WHERE ((CE.terc_nit = :nite) AND (CE.CONC_COD = CN.CONC_COD) AND (CN.conc_fecini <= :fec AND CN.conc_fecfin >= :FEC) ) OR ((CE.terc_nit = :nite)
    AND (CE.CONC_COD = CN.CONC_COD) AND (cn.conc_todosper = 'N') AND (CE.emco_ppago = :periodo)) OR  ((CE.terc_nit = :nite) AND (CE.CONC_COD = CN.CONC_COD) AND cn.conc_todosper = 'S')  ORDER BY (TERC_NIT)
    INTO :nit_tercero, :concept,  :montos, :porcen, :entidad, :numeroprom, :liquidaper ,:CONC_COD, :CONC_DEDUC, :CONC_PORC,
    :CONC_ENTIDAD, :CONC_MONTO, :CONC_DIAS, :CONC_MODIFI,:CONC_PROMEDIO, :salario,:EMCO_PERPROM, :conc_prov, :conc_aporte , :CONC_APLICAPROM, :conc_otroconc, :conc_codotroconc, :gtoempr    DO
BEGIN
    IF (conc_dias = 'S') THEN
    EXECUTE PROCEDURE DIAS_LABORADOS (:nite, :periodo, :fec) RETURNING_VALUES (:diaslab);
    ELSE
    diaslab = 30;
 SELECT ((n.nono_valor /30) * n.nono_dura), (n.nono_dura) FROM nomina_novedades n WHERE n.tnov_cod = 11 AND n.terc_nit = :nite AND n.nono_periodo = :periodo INTO :cambsaltrans, :duranov;
 IF (cambsaltrans IS NULL) THEN
 cambsaltrans = 0;
 if (duranov is null) then
 duranov = 0;
 diaslab = :diaslab - :duranov;
 if (conc_cod = 921) then
 begin
 if (porcen IS NOT NULL AND porcen <> 0) then
 valor = ((basico / 30)* :diaslab ) * :PORCEN /100;
 ELSE
 if (conc_porc IS NOT null AND conc_porc <> 0) then
 valor = ((:basico / 30)* :diaslab ) * :conc_porc /100;
 EXECUTE PROCEDURE REDONDEE(:valor, 5) RETURNING_VALUES (VALOR);
 end
 ELSE
 if (conc_cod = 922) then
 BEGIN
 SELECT P.prcu_monto FROM prestamo_cuotas P, prestamo_nomina PN WHERE P.prcu_ano = :ano AND P.prcu_periodo = :periodo AND PN.prno_id = P.prno_id AND PN.terc_nit = :nite INTO :valor;
 IF (valor IS NULL) THEN
 valor = 0;
 EXECUTE PROCEDURE REDONDEE(:valor, 5) RETURNING_VALUES (VALOR);
 item = :item + 1;
 update prestamo_cuotas  P SET prcu_ok = 'S' WHERE P.prcu_ano = :ano AND P.prcu_periodo = :periodo AND P.prno_id = (SELECT PN.prno_id FROM PRESTAMO_NOMINA PN WHERE PN.terc_nit = :nite);
 END
 ELSE
 BEGIN
    IF ((:montos = 0) OR (:montos IS NULL)) THEN
      BEGIN
      IF ((CONC_PORC = 0 AND :porcen = 0) OR (CONC_PORC IS NULL AND :porcen = 0) OR (CONC_PORC = 0 AND :porcen IS NULL) OR (CONC_PORC IS NULL AND :porcen IS NULL) ) THEN
        BEGIN
        IF ((conc_monto <> 0) AND (conc_monto IS NOT NULL) ) THEN
        BEGIN
        VALOR = :CONC_MONTO/30 * :diaslab;
        EXECUTE PROCEDURE REDONDEE(:valor, 5) RETURNING_VALUES (VALOR);
        END
        ELSE
        IF (salario = 'S' AND CONC_COD <> 900 AND CONC_COD <> 920) THEN
        BEGIN
        conc_monto = :basico;
        VALOR = (:conc_monto/30 * :diaslab ) + :cambsaltrans;
        EXECUTE PROCEDURE REDONDEE(:valor, 5) RETURNING_VALUES (VALOR);
        END
        ELSE
        valor = montos;
        END
       ELSE
       BEGIN
        IF (:porcen <> 0) THEN
          BEGIN
            IF ((conc_monto <> 0) AND (conc_monto IS NOT NULL) ) THEN
            BEGIN
              VALOR = ((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans * :PORCEN) /100;
              EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
            END
          END
          ELSE
          BEGIN
            IF ((conc_monto <> 0) AND (conc_monto IS NOT NULL) ) THEN
            BEGIN
              VALOR = ((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans * :conc_porc) /100;
              EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
            END
            ELSE
        IF (salario = 'S' AND CONC_COD <> 900 AND CONC_COD <> 920) THEN
            BEGIN
              conc_monto = :basico;
              VALOR = ((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans * :conc_porc) /100;
              EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
            END
          END
       END
      END
    ELSE
    BEGIN
      IF (CONC_PORC = 0 AND :porcen = 0) THEN
      BEGIN
      VALOR = (:montos/30 * :diaslab);
      EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
      END
      ELSE
      BEGIN
        IF (:porcen <> 0) THEN
          BEGIN
          VALOR = ((:MONTOS/30 * :diaslab )+ :cambsaltrans * :PORCEN) /100;
          EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
          END
          ELSE
          BEGIN
          VALOR = ((:montos/30 * :diaslab )+ :cambsaltrans * :CONC_PORC) /100;
          END
          EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
       END
   END
    IF (conc_promedio = 'S') THEN
    BEGIN
    perinicial = :periodo - (:numeroprom) + 1;
    anoprom = CAST (ano AS INTEGER);
    IF (perinicial <= 0) THEN
    BEGIN
    perinicial = 24 + :PERINICIAL;
    anoprom = CAST(ANO AS INTEGER) - 1;
    END
    SELECT SUM (noco_valor) FROM nomina_conceptos n WHERE n.noco_aplicaprom = 'S' AND N.noco_periodo >= :perinicial - 1 AND N.noco_periodo < :periodo AND N.noco_ano >= :anoprom AND N.noco_ano <= :ano AND terc_nit = :nite INTO :valor;
    valor = (valor / numeroprom)/*/ 30 * :diaslab*/;
    SELECT NOCO_VALOR FROM NOMINA_CONCEPTOS WHERE CONC_COD = :conc_cod AND TERC_NIT  = :nite AND NOCO_PAGOOK = 'N' AND NOCO_PERIODO = 0 INTO :saldosini;
    IF (saldosini IS NULL) THEN
    saldosini = 0;
    ELSE
    UPDATE nomina_conceptos N SET noco_pagook = 'S' WHERE n.noco_aplicaprom = 'S' AND N.noco_periodo >= :perinicial - 1 AND N.noco_periodo < :periodo AND N.noco_ano >= :anoprom AND N.noco_ano <= :ano  AND CONC_COD = :conc_cod AND terc_nit = :nite AND NOCO_PERIODO = 0;
    VALOR = :valor + :saldosini;
    EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
    UPDATE nomina_conceptos N SET noco_pagook = 'S' WHERE n.noco_aplicaprom = 'S' AND N.noco_periodo >= :perinicial - 1 AND N.noco_periodo < :periodo AND N.noco_ano >= :anoprom AND N.noco_ano <= :ano  AND CONC_COD = :conc_cod AND terc_nit = :nite;
    END
    IF (conc_otroconc = 'S') THEN
    BEGIN
    anosum = CAST(ano AS INTEGER);
    anosum = anosum - 1;
    SELECT SUM (noco_valor) FROM nomina_conceptos n WHERE n.noco_ano = :anosum AND n.conc_cod = :conc_codotroconc AND N.terc_nit = :nite INTO :valor;
    SELECT NOCO_VALOR FROM NOMINA_CONCEPTOS WHERE noco_ano = :anosum AND conc_cod = :conc_codotroconc AND terc_nit = :nite AND NOCO_PERIODO = 0 INTO :saldosini;
    IF (saldosini IS NULL) THEN
    saldosini = 0;
    ELSE
    UPDATE nomina_conceptos SET noco_pagook = 'S' WHERE noco_ano = :anosum AND conc_cod = :conc_codotroconc AND NOCO_PERIODO = 0 AND terc_nit = :nite;
    VALOR = :valor + :saldosini;
    UPDATE nomina_conceptos SET noco_pagook = 'S' WHERE noco_ano = :anosum AND conc_cod = :conc_codotroconc AND terc_nit = :nite;
    END
/*SI EL CONCEPTO ES UN APORTE*/
IF (conc_aporte = 'S') THEN
BEGIN
    IF ((:entidad = '' ) OR (entidad IS NULL)) THEN
    BEGIN
     SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
     IF (comision IS NULL) THEN
     comision = 0;
     valor = :basico + :comision;
    IF ((conc_cod = 904) OR (conc_cod = 905) OR (conc_cod = 906)) THEN
            BEGIN
            entidad = :nitafp;
                IF (conc_cod = 904) THEN
                BEGIN
                SELECT A.paan_afptr FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = (((((:basico /30) * :diaslab ) + :comision)+ :cambsaltrans) * :PORCEN) /100;
                END
                ELSE
                IF ((conc_cod = 905) OR (conc_cod = 906)) THEN
                BEGIN
                SELECT A.paan_afpem FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = (((((:basico /30) * :diaslab ) + :comision)+ :cambsaltrans) * :PORCEN) /100;
                END
                EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
            END
            ELSE
       IF ((conc_cod = 907) OR (conc_cod = 914) OR (conc_cod = 915)) THEN
            BEGIN
            entidad = :niteps;
                IF (conc_cod = 907) THEN
                BEGIN
                SELECT A.paan_epstr FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = (((((:basico )/30 * :diaslab ) + :comision)+ :cambsaltrans) * :PORCEN) /100;
                END
                ELSE
                IF ((conc_cod = 914) OR (conc_cod = 915)) THEN
                BEGIN
                SELECT A.paan_epsem FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = (((((:basico )/30 * :diaslab ) + :comision)+ :cambsaltrans) * :PORCEN) /100;
                END
                EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
            END
            ELSE
       IF ((conc_cod = 910) OR (conc_cod = 911) OR (conc_cod = 916) OR (conc_cod = 917) OR (conc_cod = 918) OR (conc_cod = 919)) THEN
            BEGIN
            entidad = :nitccf;
            SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
            IF (comision IS NULL) THEN
            comision = 0;
                IF ((conc_cod = 910) OR (conc_cod = 911) ) THEN
                BEGIN
                SELECT A.paan_ccf FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = (((((:basico )/30 * :diaslab ) + :comision)+ :cambsaltrans) * :PORCEN) /100;
                EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
                END
                ELSE
                IF ((conc_cod = 916) OR (conc_cod = 917)) THEN
                BEGIN
                SELECT A.paan_icbf FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = (((((:basico )/30 * :diaslab ) + :comision)+ :cambsaltrans) * :PORCEN) /100;
                EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
                END
                ELSE
                IF ((conc_cod = 918) OR (conc_cod = 919)) THEN
                BEGIN
                SELECT A.paan_sena FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = (((((:basico )/30 * :diaslab ) + :comision)+ :cambsaltrans) * :PORCEN) /100;
                EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
                END
            END
            ELSE
        IF ((conc_cod = 912) OR (conc_cod = 913)) THEN
            BEGIN
            entidad = :nitafc;
            SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
            IF (comision IS NULL) THEN
            comision = 0;
                IF ((conc_cod = 912) OR (conc_cod = 913) ) THEN
                BEGIN
                SELECT A.paan_cesemp FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = ((((:basico + :comision)/30 * :diaslab )+ :cambsaltrans) * :PORCEN) /100;
                EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
                END
            END
            ELSE
        BEGIN
        IF (comision IS NULL) THEN
        comision = 0;
        SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
        conc_monto = :basico + :comision;
        IF (conc_porc <> 0 AND conc_porc IS NOT NULL) THEN
        VALOR = (((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans) * :conc_porc) /100;
        ELSE
        IF (:porcen <> 0 AND :porcen IS NOT NULL) THEN
        VALOR = (((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans) * :porcen) /100;
        ELSE
        IF (:montos <> 0 AND :montos IS NOT NULL) THEN
        valor = :montos;
        ELSE
        IF (:conc_monto <> 0 AND :conc_monto IS NOT NULL) THEN
        valor = :conc_monto;
        EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
        END
    END
    END
    ELSE
    IF (conc_prov = 'S') THEN
    BEGIN
        conc_monto = :basico;
        IF (conc_porc <> 0 AND conc_porc IS NOT NULL) THEN
        VALOR = (((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans) * :conc_porc) /100;
        ELSE
        IF (porcen <> 0 AND porcen IS NOT NULL) THEN
        VALOR = (((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans) * :porcen) /100;
        ELSE
        IF (montos <> 0 AND montos IS NOT NULL) THEN
        VALOR = :montos;
        ELSE
        IF (conc_monto <> 0 AND conc_monto IS NOT NULL) THEN
        VALOR = :conc_monto;
        EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
    END
item = :item + 1;
END
IF (conc_cod = 920) THEN
 BEGIN
 SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :valor;
 IF (valor IS NULL) THEN
 valor = 0;
 item = :item + 1;
 END
    IF (liquidaper = 0) THEN
    INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
    VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
    ELSE
    IF (liquidaper = 1) THEN
    BEGIN
    rmod = mod(:periodo, 2);
    IF (rmod = 0) THEN
        INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
        VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
    END
    ELSE
    IF (liquidaper = 2) THEN
    BEGIN
    rmod = mod(:periodo, 4);
    IF (rmod = 0) THEN
        INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
        VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
    END
END
END
END
ELSE
/*SI ES SEMANAL*/
IF (periodicidad = 3) THEN
BEGIN
EXECUTE PROCEDURE cambie_id_nomina RETURNING_VALUES(:idnomina);
INSERT INTO nomina (nomi_id, NOMI_FECCAUSA, NOMI_PAGOGLOBAL, NOMI_PERIODOCIDAD, NOMI_PERIODO, NOMI_ANO, NOMI_LIQOK)
VALUES (:IDNOMINA, :fec,:pagoglobal, :periodicidad, :periodo, :ano, 'N');
    BEGIN
    item = 1;
    FOR SELECT E.TERC_NIT, E.empl_salario, e.empl_eps, e.empl_afc, e.empl_afp, e.empl_ccf
    FROM EMPLEADOS E
    WHERE E.empl_ppago = 3
    INTO :nite, :basico, :niteps, :nitafc, :nitafp, :nitccf
    DO
    BEGIN
    FOR SELECT CE.TERC_NIT, CE.CONC_COD, CE.EMCO_MONTO, CE.EMCO_PORC, ce.empl_entidad, CE.emco_perprom, CE.emco_luquidaper,    CN.CONC_COD, CN.CONC_DEDUC,CN.CONC_PORC, CN.CONC_ENTIDAD, CN.CONC_MONTO,  CN.CONC_DIAS, CN.CONC_MODIFI,
    CN.CONC_PROMEDIO, CN.conc_salario, CE.emco_perprom, CN.conc_prov, CN.conc_aporte, CN.conc_aplicaprom, cn.conc_otroconc, cn.conc_codotroconc, CN.conc_gtoempr
    FROM empleado_conceptos CE, CONCEPTOS_NOMINA CN WHERE ((CE.terc_nit = :nite) AND (CE.CONC_COD = CN.CONC_COD) AND (CN.conc_fecini <= :fec AND CN.conc_fecfin >= :FEC) ) OR ((CE.terc_nit = :nite)
    AND (CE.CONC_COD = CN.CONC_COD) AND (cn.conc_todosper = 'N') AND (CE.emco_ppago = :periodo)) OR  ((CE.terc_nit = :nite) AND (CE.CONC_COD = CN.CONC_COD) AND cn.conc_todosper = 'S')  ORDER BY (TERC_NIT)
    INTO :nit_tercero, :concept,  :montos, :porcen, :entidad, :numeroprom, :liquidaper ,:CONC_COD, :CONC_DEDUC, :CONC_PORC,
    :CONC_ENTIDAD, :CONC_MONTO, :CONC_DIAS, :CONC_MODIFI,:CONC_PROMEDIO, :salario,:EMCO_PERPROM, :conc_prov, :conc_aporte , :CONC_APLICAPROM, :conc_otroconc, :conc_codotroconc, :gtoempr
    DO
BEGIN
    IF (conc_dias = 'S') THEN
    EXECUTE PROCEDURE DIAS_LABORADOS (:nite, :periodo, :fec) RETURNING_VALUES (:diaslab);
    ELSE
    BEGIN
    IF (liquidaper = 0) THEN
    diaslab = 7;
    ELSE
    IF (liquidaper = 1) THEN
    diaslab = 15;
    ELSE
    IF (liquidaper = 2) THEN
    diaslab = 30;
    END
 SELECT ((n.nono_valor /30) * n.nono_dura), (n.nono_dura) FROM nomina_novedades n WHERE n.tnov_cod = 11 AND n.terc_nit = :nite AND n.nono_periodo = :periodo INTO :cambsaltrans, :duranov;
 IF (cambsaltrans IS NULL) THEN
 cambsaltrans = 0;
 if (duranov is null) then
 duranov = 0;
 diaslab = :diaslab - :duranov;
 IF (conc_cod = 920) THEN
 BEGIN
 SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :valor;
 IF (valor IS NULL) THEN
 valor = 0;
 item = :item + 1;
 END
 ELSE
 if (conc_cod = 921) then
 begin
 if (porcen IS NOT NULL AND porcen <> 0) then
 valor = ((basico / 30)* :diaslab ) * :PORCEN /100;
 ELSE
 if (conc_porc IS NOT null AND conc_porc <> 0) then
 valor = ((:basico / 30)* :diaslab ) * :conc_porc /100;
 EXECUTE PROCEDURE REDONDEE(:valor, 5) RETURNING_VALUES (VALOR);
 end
 ELSE
 if (conc_cod = 922) then
 BEGIN
 SELECT P.prcu_monto FROM prestamo_cuotas P, prestamo_nomina PN WHERE P.prcu_ano = :ano AND P.prcu_periodo = :periodo AND PN.prno_id = P.prno_id AND PN.terc_nit = :nite INTO :valor;
 IF (valor IS NULL) THEN
 valor = 0;
 EXECUTE PROCEDURE REDONDEE(:valor, 5) RETURNING_VALUES (VALOR);
 item = :item + 1;
 update prestamo_cuotas  P SET prcu_ok = 'S' WHERE P.prcu_ano = :ano AND P.prcu_periodo = :periodo AND P.prno_id = (SELECT PN.prno_id FROM PRESTAMO_NOMINA PN WHERE PN.terc_nit = :nite);
 END
 ELSE
 BEGIN
    IF ((:montos = 0) OR (:montos IS NULL)) THEN
      BEGIN
      IF ((CONC_PORC = 0 AND :porcen = 0) OR (CONC_PORC IS NULL AND :porcen = 0) OR (CONC_PORC = 0 AND :porcen IS NULL) OR (CONC_PORC IS NULL AND :porcen IS NULL) ) THEN
        BEGIN
        IF ((conc_monto <> 0) AND (conc_monto IS NOT NULL) ) THEN
        BEGIN
        VALOR = :CONC_MONTO/30 * :diaslab;
        EXECUTE PROCEDURE REDONDEE(:valor, 5) RETURNING_VALUES (VALOR);
        END
        ELSE
        IF (salario = 'S' AND CONC_COD <> 900 AND CONC_COD <> 920) THEN
        BEGIN
        conc_monto = :basico;
        VALOR = (:conc_monto/30 * :diaslab ) + :cambsaltrans;
        EXECUTE PROCEDURE REDONDEE(:valor, 5) RETURNING_VALUES (VALOR);
        END
        ELSE
        valor = montos;
        END
       ELSE
       BEGIN
        IF (:porcen <> 0) THEN
          BEGIN
            IF ((conc_monto <> 0) AND (conc_monto IS NOT NULL) ) THEN
            BEGIN
              VALOR = ((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans * :PORCEN) /100;
              EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
            END
          END
          ELSE
          BEGIN
            IF ((conc_monto <> 0) AND (conc_monto IS NOT NULL) ) THEN
            BEGIN
              VALOR = ((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans * :conc_porc) /100;
              EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
            END
            ELSE
        IF (salario = 'S' AND CONC_COD <> 900 AND CONC_COD <> 920) THEN
            BEGIN
              conc_monto = :basico;
              VALOR = ((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans * :conc_porc) /100;
              EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
            END
          END
       END
      END
    ELSE
    BEGIN
      IF (CONC_PORC = 0 AND :porcen = 0) THEN
      BEGIN
      VALOR = (:montos/30 * :diaslab);
      EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
      END
      ELSE
      BEGIN
        IF (:porcen <> 0) THEN
          BEGIN
          VALOR = ((:MONTOS/30 * :diaslab )+ :cambsaltrans * :PORCEN) /100;
          EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
          END
          ELSE
          BEGIN
          VALOR = ((:montos/30 * :diaslab )+ :cambsaltrans * :CONC_PORC) /100;
          END
          EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
       END
   END
    IF (conc_promedio = 'S') THEN
    BEGIN
    perinicial = :periodo - (:numeroprom) + 1;
    anoprom = CAST (ano AS INTEGER);
    IF (perinicial <= 0) THEN
    BEGIN
    perinicial = 24 + :PERINICIAL;
    anoprom = CAST(ANO AS INTEGER) - 1;
    END
    SELECT SUM (noco_valor) FROM nomina_conceptos n WHERE n.noco_aplicaprom = 'S' AND N.noco_periodo >= :perinicial - 1 AND N.noco_periodo < :periodo AND N.noco_ano >= :anoprom AND N.noco_ano <= :ano AND terc_nit = :nite INTO :valor;
    valor = (valor / numeroprom)/*/ 30 * :diaslab*/;
    SELECT NOCO_VALOR FROM NOMINA_CONCEPTOS WHERE CONC_COD = :conc_cod AND TERC_NIT  = :nite AND NOCO_PAGOOK = 'N' AND NOCO_PERIODO = 0 INTO :saldosini;
    IF (saldosini IS NULL) THEN
    saldosini = 0;
    ELSE
    UPDATE nomina_conceptos N SET noco_pagook = 'S' WHERE n.noco_aplicaprom = 'S' AND N.noco_periodo >= :perinicial - 1 AND N.noco_periodo < :periodo AND N.noco_ano >= :anoprom AND N.noco_ano <= :ano  AND CONC_COD = :conc_cod AND terc_nit = :nite AND NOCO_PERIODO = 0;
    VALOR = :valor + :saldosini;
    EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
    UPDATE nomina_conceptos N SET noco_pagook = 'S' WHERE n.noco_aplicaprom = 'S' AND N.noco_periodo >= :perinicial - 1 AND N.noco_periodo < :periodo AND N.noco_ano >= :anoprom AND N.noco_ano <= :ano  AND CONC_COD = :conc_cod AND terc_nit = :nite;
    END
    IF (conc_otroconc = 'S') THEN
    BEGIN
    anosum = CAST(ano AS INTEGER);
    anosum = anosum - 1;
    SELECT SUM (noco_valor) FROM nomina_conceptos n WHERE n.noco_ano = :anosum AND n.conc_cod = :conc_codotroconc AND N.terc_nit = :nite INTO :valor;
    SELECT NOCO_VALOR FROM NOMINA_CONCEPTOS WHERE noco_ano = :anosum AND conc_cod = :conc_codotroconc AND terc_nit = :nite AND NOCO_PERIODO = 0 INTO :saldosini;
    IF (saldosini IS NULL) THEN
    saldosini = 0;
    ELSE
    UPDATE nomina_conceptos SET noco_pagook = 'S' WHERE noco_ano = :anosum AND conc_cod = :conc_codotroconc AND NOCO_PERIODO = 0 AND terc_nit = :nite;
    VALOR = :valor + :saldosini;
    UPDATE nomina_conceptos SET noco_pagook = 'S' WHERE noco_ano = :anosum AND conc_cod = :conc_codotroconc AND terc_nit = :nite;
    END
/*SI EL CONCEPTO ES UN APORTE*/
IF (conc_aporte = 'S') THEN
BEGIN
    IF ((:entidad = '' ) OR (entidad IS NULL)) THEN
    BEGIN
     SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
     IF (comision IS NULL) THEN
     comision = 0;
     valor = :basico + :comision;
    IF ((conc_cod = 904) OR (conc_cod = 905) OR (conc_cod = 906)) THEN
            BEGIN
            entidad = :nitafp;
                IF (conc_cod = 904) THEN
                BEGIN
                SELECT A.paan_afptr FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = (((((:basico /30) * :diaslab ) + :comision)+ :cambsaltrans) * :PORCEN) /100;
                END
                ELSE
                IF ((conc_cod = 905) OR (conc_cod = 906)) THEN
                BEGIN
                SELECT A.paan_afpem FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = (((((:basico /30) * :diaslab ) + :comision)+ :cambsaltrans) * :PORCEN) /100;
                END
                EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
            END
            ELSE
       IF ((conc_cod = 907) OR (conc_cod = 914) OR (conc_cod = 915)) THEN
            BEGIN
            entidad = :niteps;
                IF (conc_cod = 907) THEN
                BEGIN
                SELECT A.paan_epstr FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = (((((:basico )/30 * :diaslab ) + :comision)+ :cambsaltrans) * :PORCEN) /100;
                END
                ELSE
                IF ((conc_cod = 914) OR (conc_cod = 915)) THEN
                BEGIN
                SELECT A.paan_epsem FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = (((((:basico )/30 * :diaslab ) + :comision)+ :cambsaltrans) * :PORCEN) /100;
                END
                EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
            END
            ELSE
       IF ((conc_cod = 910) OR (conc_cod = 911) OR (conc_cod = 916) OR (conc_cod = 917) OR (conc_cod = 918) OR (conc_cod = 919)) THEN
            BEGIN
            entidad = :nitccf;
            SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
            IF (comision IS NULL) THEN
            comision = 0;
                IF ((conc_cod = 910) OR (conc_cod = 911) ) THEN
                BEGIN
                SELECT A.paan_ccf FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = (((((:basico )/30 * :diaslab ) + :comision)+ :cambsaltrans) * :PORCEN) /100;
                EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
                END
                ELSE
                IF ((conc_cod = 916) OR (conc_cod = 917)) THEN
                BEGIN
                SELECT A.paan_icbf FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = (((((:basico )/30 * :diaslab ) + :comision)+ :cambsaltrans) * :PORCEN) /100;
                EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
                END
                ELSE
                IF ((conc_cod = 918) OR (conc_cod = 919)) THEN
                BEGIN
                SELECT A.paan_sena FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = (((((:basico )/30 * :diaslab ) + :comision)+ :cambsaltrans) * :PORCEN) /100;
                EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
                END
            END
            ELSE
        IF ((conc_cod = 912) OR (conc_cod = 913)) THEN
            BEGIN
            entidad = :nitafc;
            SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
            IF (comision IS NULL) THEN
            comision = 0;
                IF ((conc_cod = 912) OR (conc_cod = 913) ) THEN
                BEGIN
                SELECT A.paan_cesemp FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = ((((:basico + :comision)/30 * :diaslab )+ :cambsaltrans) * :PORCEN) /100;
                EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
                END
            END
            ELSE
        BEGIN
        IF (comision IS NULL) THEN
        comision = 0;
        SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
        conc_monto = :basico + :comision;
        IF (conc_porc <> 0 AND conc_porc IS NOT NULL) THEN
        VALOR = (((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans) * :conc_porc) /100;
        ELSE
        IF (:porcen <> 0 AND :porcen IS NOT NULL) THEN
        VALOR = (((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans) * :porcen) /100;
        ELSE
        IF (:montos <> 0 AND :montos IS NOT NULL) THEN
        valor = :montos;
        ELSE
        IF (:conc_monto <> 0 AND :conc_monto IS NOT NULL) THEN
        valor = :conc_monto;
        EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
        END
    END
    END
    ELSE
    IF (conc_prov = 'S') THEN
    BEGIN
        conc_monto = :basico;
        IF (conc_porc <> 0 AND conc_porc IS NOT NULL) THEN
        VALOR = (((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans) * :conc_porc) /100;
        ELSE
        IF (porcen <> 0 AND porcen IS NOT NULL) THEN
        VALOR = (((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans) * :porcen) /100;
        ELSE
        IF (montos <> 0 AND montos IS NOT NULL) THEN
        VALOR = :montos;
        ELSE
        IF (conc_monto <> 0 AND conc_monto IS NOT NULL) THEN
        VALOR = :conc_monto;
        EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
    END
item = :item + 1;
END
    IF (liquidaper = 0) THEN
    INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
    VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
    ELSE
    IF (liquidaper = 1) THEN
    BEGIN
    rmod = mod(:periodo, 2);
    IF (rmod = 0) THEN
        INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
        VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
    END
    ELSE
    IF (liquidaper = 2) THEN
    BEGIN
    rmod = mod(:periodo, 4);
    IF (rmod = 0) THEN
        INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
        VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
    END
END
END
END
END
SUSPEND;
END
^

SET TERM ; ^


CREATE EXCEPTION CONCEPTO_ASIGNADO_EMPLEADO 'El concepto ya fue asignado a un empleado';
CREATE EXCEPTION CONCEPTO_CON_MOVIMIENTO 'El concepto ya fue utilizado en una liquidacion';

SET TERM ^ ;

create trigger CONCEPTOS_NOMINA_BD for CONCEPTOS_NOMINA
active BEFORE DELETE position 0
as
declare variable numconc INTEGER;
begin
select count(conc_cod) from empleado_conceptos where conc_cod = old.conc_cod into :numconc;
if (numconc > 0) then
exception concepto_asignado_empleado;
select count(conc_cod) from nomina_conceptos where conc_cod = old.conc_cod into :numconc;
if (numconc > 0) then
exception CONCEPTO_CON_MOVIMIENTO;
end
^

SET TERM ; ^

GRANT UPDATE,REFERENCES ON CONCEPTOS_NOMINA TO TRIGGER CONCEPTOS_NOMINA_BD;
GRANT SELECT ON EMPLEADO_CONCEPTOS TO TRIGGER CONCEPTOS_NOMINA_BD;
GRANT SELECT ON NOMINA_CONCEPTOS TO TRIGGER CONCEPTOS_NOMINA_BD;

SET TERM ^ ;

create trigger EMPLEADO_CONCEPTOS_BD for EMPLEADO_CONCEPTOS
active BEFORE DELETE position 0
as
declare variable numconc INTEGER;
begin
select count(conc_cod) from nomina_conceptos where conc_cod = old.conc_cod into :numconc;
if (numconc > 0) then
exception CONCEPTO_CON_MOVIMIENTO;
end
^

SET TERM ; ^

GRANT UPDATE,REFERENCES ON EMPLEADO_CONCEPTOS TO TRIGGER EMPLEADO_CONCEPTOS_BD;
GRANT SELECT ON NOMINA_CONCEPTOS TO TRIGGER EMPLEADO_CONCEPTOS_BD;


INSERT INTO IMPORTACION_INVENTARIO (IMIN_TIPO, IMIN_DATO, IMIN_COLUMNA, IMIN_ANCHO) VALUES (20, 'EMPL_FECING', 30, 10);
INSERT INTO IMPORTACION_INVENTARIO (IMIN_TIPO, IMIN_DATO, IMIN_COLUMNA, IMIN_ANCHO) VALUES (20, 'EMPL_FECNAC', 31, 10);
INSERT INTO IMPORTACION_INVENTARIO (IMIN_TIPO, IMIN_DATO, IMIN_COLUMNA, IMIN_ANCHO) VALUES (20, 'EMPL_ESTCIVIL', 32, 1);


INSERT INTO NOMBRES_CAMPOS (NOMBRE, DESCRIPCION) VALUES ('EMPL_FECNAC', 'Fecha de nacimiento');
INSERT INTO NOMBRES_CAMPOS (NOMBRE, DESCRIPCION) VALUES ('EMPL_FECING', 'Fecha de ingreso');
INSERT INTO NOMBRES_CAMPOS (NOMBRE, DESCRIPCION) VALUES ('EMPL_ESTCIVIL', 'Estado civi (C,S,D,V,U)');



INSERT INTO TIPO_DOCUMENTO (TIDO_COD, TIDO_NOMCORTO, TIDO_NOMLARGO, TIDO_MODULO, TIDO_INVE, TIDO_CART, TIDO_CXP, TIDO_CAJA, TIDO_BCOS) VALUES (90, 'ANTNOMI', 'ANTICIPOS NOMINA', 'NOMINA', 'N', 'N', 'N', 'N', 'N');
INSERT INTO TIPO_DOCUMENTO (TIDO_COD, TIDO_NOMCORTO, TIDO_NOMLARGO, TIDO_MODULO, TIDO_INVE, TIDO_CART, TIDO_CXP, TIDO_CAJA, TIDO_BCOS) VALUES (91, 'PAGNOMI', 'PAGOS DE NOMINA', 'NOMINA', 'N', 'N', 'N', 'N', 'N');
INSERT INTO TIPO_DOCUMENTO (TIDO_COD, TIDO_NOMCORTO, TIDO_NOMLARGO, TIDO_MODULO, TIDO_INVE, TIDO_CART, TIDO_CXP, TIDO_CAJA, TIDO_BCOS) VALUES (92, 'CAUSNOMI', 'CAUSACION DE NOMINA', 'NOMINA', 'N', 'N', 'N', 'N', 'N');
INSERT INTO TIPO_DOCUMENTO (TIDO_COD, TIDO_NOMCORTO, TIDO_NOMLARGO, TIDO_MODULO, TIDO_INVE, TIDO_CART, TIDO_CXP, TIDO_CAJA, TIDO_BCOS) VALUES (93, 'APORPAG', 'PAGOAPORTES', 'NOMINA', 'N', 'N', 'N', 'N', 'N');

SET TERM ^ ;

ALTER PROCEDURE CAUSA_NOMINA(
    FEC DATE,
    PERIODO INTEGER,
    PERIODICIDAD INTEGER,
    PAGOGLOBAL CHAR(1),
    ANO CHAR(4))
RETURNS (
    IDNOMINA INTEGER)
AS
DECLARE VARIABLE item INTEGER;
DECLARE VARIABLE nite VARCHAR(20) CHARACTER SET none;
DECLARE VARIABLE nit_tercero VARCHAR(20);
DECLARE VARIABLE concept INTEGER;
DECLARE VARIABLE montos NUMERIC(18,2);
DECLARE VARIABLE porcen NUMERIC(9,4);
DECLARE VARIABLE entidad VARCHAR(20);
DECLARE VARIABLE conc_cod INTEGER;
DECLARE VARIABLE conc_deduc CHAR(1);
DECLARE VARIABLE conc_porc NUMERIC(9,4);
DECLARE VARIABLE conc_entidad INTEGER;
DECLARE VARIABLE conc_monto NUMERIC(18,2);
DECLARE VARIABLE conc_modifi CHAR(1);
DECLARE VARIABLE conc_promedio CHAR(1);
DECLARE VARIABLE emco_perprom INTEGER;
DECLARE VARIABLE valor NUMERIC(18,2);
DECLARE VARIABLE diaslab INTEGER;
DECLARE VARIABLE conc_prov CHAR(1);
DECLARE VARIABLE conc_aporte CHAR(1);
DECLARE VARIABLE numeroprom INTEGER;
DECLARE VARIABLE conc_aplicaprom CHAR(1);
DECLARE VARIABLE perinicial INTEGER;
DECLARE VARIABLE anoprom INTEGER;
DECLARE VARIABLE conc_dias CHAR(1);
DECLARE VARIABLE conc_otroconc CHAR(1);
DECLARE VARIABLE conc_codotroconc INTEGER;
DECLARE VARIABLE anosum INTEGER;
DECLARE VARIABLE salario CHAR(1) CHARACTER SET none;
DECLARE VARIABLE liquidaper INTEGER;
DECLARE VARIABLE rmod NUMERIC(2,2);
DECLARE VARIABLE basico NUMERIC(18,2);
DECLARE VARIABLE niteps VARCHAR(20);
DECLARE VARIABLE nitafc VARCHAR(20);
DECLARE VARIABLE nitafp VARCHAR(20);
DECLARE VARIABLE nitccf VARCHAR(20);
DECLARE VARIABLE gtoempr CHAR(1);
DECLARE VARIABLE comision NUMERIC(18,2);
DECLARE VARIABLE cambsaltrans NUMERIC(18,2);
DECLARE VARIABLE SALDOSINI NUMERIC(18,2);
DECLARE VARIABLE duranov INTEGER;
DECLARE VARIABLE base NUMERIC(18,2);
BEGIN
/*SI ES QUINCENAL*/
IF (periodicidad = 2) THEN
BEGIN
EXECUTE PROCEDURE cambie_id_nomina RETURNING_VALUES(:idnomina);
INSERT INTO nomina (nomi_id, NOMI_FECCAUSA, NOMI_PAGOGLOBAL, NOMI_PERIODOCIDAD, NOMI_PERIODO, NOMI_ANO, NOMI_LIQOK)
VALUES (:IDNOMINA, :fec,:pagoglobal, :periodicidad, :periodo, :ano, 'N');
 BEGIN
    item = 1;
    FOR SELECT E.TERC_NIT, E.empl_salario, e.empl_eps, e.empl_afc, e.empl_afp, e.empl_ccf
    FROM EMPLEADOS E
    WHERE E.empl_ppago = 2
    INTO :nite, :basico, :niteps, :nitafc, :nitafp, :nitccf
    DO
    BEGIN
    FOR SELECT CE.TERC_NIT, CE.CONC_COD, CE.EMCO_MONTO, CE.EMCO_PORC, ce.empl_entidad, CE.emco_perprom, CE.emco_luquidaper, CN.CONC_COD, CN.CONC_DEDUC,CN.CONC_PORC, CN.CONC_ENTIDAD, CN.CONC_MONTO,  CN.CONC_DIAS, CN.CONC_MODIFI,
    CN.CONC_PROMEDIO, CN.conc_salario, CE.emco_perprom, CN.conc_prov, CN.conc_aporte, CN.conc_aplicaprom, cn.conc_otroconc, cn.conc_codotroconc, CN.conc_gtoempr, CN.conc_base
    FROM empleado_conceptos CE, CONCEPTOS_NOMINA CN WHERE ((CE.terc_nit = :nite) AND (CE.CONC_COD = CN.CONC_COD) AND (CN.conc_fecini <= :fec AND CN.conc_fecfin >= :FEC) ) OR ((CE.terc_nit = :nite)
    AND (CE.CONC_COD = CN.CONC_COD) AND (cn.conc_todosper = 'N') AND (CE.emco_ppago = :periodo)) OR  ((CE.terc_nit = :nite) AND (CE.CONC_COD = CN.CONC_COD) AND cn.conc_todosper = 'S')  ORDER BY (TERC_NIT )
    INTO :nit_tercero, :concept,  :montos, :porcen, :entidad, :numeroprom, :liquidaper ,:CONC_COD, :CONC_DEDUC, :CONC_PORC,
    :CONC_ENTIDAD, :CONC_MONTO, :CONC_DIAS, :CONC_MODIFI,:CONC_PROMEDIO, :salario,:EMCO_PERPROM, :conc_prov, :conc_aporte , :CONC_APLICAPROM, :conc_otroconc, :conc_codotroconc, :gtoempr, :base
    DO
BEGIN
    IF (conc_dias = 'S') THEN
    EXECUTE PROCEDURE DIAS_LABORADOS (:nite, :periodo, :fec) RETURNING_VALUES (:diaslab);
    ELSE
    BEGIN
    IF (liquidaper = 0) THEN
    diaslab = 15;
    ELSE
    IF (liquidaper = 1) THEN
    diaslab = 30;
    ELSE
    IF (liquidaper = 2) THEN
    diaslab = 60;
    END
 SELECT ((n.nono_valor /30) * n.nono_dura), (n.nono_dura) FROM nomina_novedades n WHERE n.tnov_cod = 11 AND n.terc_nit = :nite AND n.nono_periodo = :periodo INTO :cambsaltrans, :duranov;
 IF (cambsaltrans IS NULL) THEN
 cambsaltrans = 0;
 if (duranov is null) then
 duranov = 0;
 diaslab = :diaslab - :duranov;
 if (conc_cod = 921) then
 begin
 if (porcen IS NOT NULL AND porcen <> 0) then
 valor = ((basico / 30)* :diaslab ) * :PORCEN /100;
 ELSE
 if (conc_porc IS NOT null AND conc_porc <> 0) then
 valor = ((:basico / 30)* :diaslab ) * :conc_porc /100;
 EXECUTE PROCEDURE REDONDEE(:valor, 5) RETURNING_VALUES (VALOR);
 end
 ELSE
 if (conc_cod = 922) then
 BEGIN
 SELECT P.prcu_monto FROM prestamo_cuotas P, prestamo_nomina PN WHERE P.prcu_ano = :ano AND P.prcu_periodo = :periodo AND PN.prno_id = P.prno_id AND PN.terc_nit = :nite INTO :valor;
 IF (valor IS NULL) THEN
 valor = 0;
 EXECUTE PROCEDURE REDONDEE(:valor, 5) RETURNING_VALUES (VALOR);
 item = :item + 1;
 update prestamo_cuotas  P SET prcu_ok = 'S' WHERE P.prcu_ano = :ano AND P.prcu_periodo = :periodo AND P.prno_id = (SELECT PN.prno_id FROM PRESTAMO_NOMINA PN WHERE PN.terc_nit = :nite);
 END
 ELSE
 BEGIN
    IF ((:montos = 0) OR (:montos IS NULL)) THEN
      BEGIN
      IF ((CONC_PORC = 0 AND :porcen = 0) OR (CONC_PORC IS NULL AND :porcen = 0) OR (CONC_PORC = 0 AND :porcen IS NULL) OR (CONC_PORC IS NULL AND :porcen IS NULL) ) THEN
        BEGIN
        IF ((conc_monto <> 0) AND (conc_monto IS NOT NULL) ) THEN
        BEGIN
        VALOR = :CONC_MONTO;
        EXECUTE PROCEDURE REDONDEE(:valor, 5) RETURNING_VALUES (VALOR);
        END
        ELSE
        IF (salario = 'S' AND CONC_COD <> 900 AND CONC_COD <> 920) THEN
        BEGIN
        conc_monto = :basico;
        VALOR = (:conc_monto/30 * :diaslab ) + :cambsaltrans;
        EXECUTE PROCEDURE REDONDEE(:valor, 5) RETURNING_VALUES (VALOR);
        END
        ELSE
        valor = montos;
        END
       ELSE
       BEGIN
        IF (:porcen <> 0) THEN
          BEGIN
            IF ((conc_monto <> 0) AND (conc_monto IS NOT NULL) ) THEN
            BEGIN
              VALOR = ((:CONC_MONTO ) * :PORCEN) /100;
              EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
            END
          END
          ELSE
          BEGIN
            IF ((conc_monto <> 0) AND (conc_monto IS NOT NULL) ) THEN
            BEGIN
              VALOR = ((:CONC_MONTO) * :conc_porc) /100;
              EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
            END
            ELSE
        IF (salario = 'S' AND CONC_COD <> 900 AND CONC_COD <> 920) THEN
            BEGIN
              conc_monto = :basico;
              VALOR = ((:CONC_MONTO)+ :cambsaltrans * :conc_porc) /100;
              EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
            END
          END
       END
      END
    ELSE
    BEGIN
      IF ((CONC_PORC = 0 or (conc_porc is null)) AND (:porcen = 0 or (porcen is null))) THEN
      BEGIN
      VALOR = (:montos);
      EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
      END
      ELSE
      BEGIN
        IF (:porcen <> 0 and porcen is not null) THEN
          BEGIN
          VALOR = ((:MONTOS ) * :PORCEN) /100;
          EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
          END
          ELSE
          BEGIN
          VALOR = ((:montos) * :CONC_PORC) /100;
          END
          EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
       END
   END
    IF (conc_promedio = 'S') THEN
    BEGIN
    perinicial = :periodo - (:numeroprom) + 1;
    anoprom = CAST (ano AS INTEGER);
    IF (perinicial <= 0) THEN
    BEGIN
    perinicial = 24 + :PERINICIAL;
    anoprom = CAST(ANO AS INTEGER) - 1;
    END
    SELECT SUM (noco_valor) FROM nomina_conceptos n WHERE n.noco_aplicaprom = 'S' AND N.noco_periodo >= :perinicial - 1 AND N.noco_periodo < :periodo AND N.noco_ano >= :anoprom AND N.noco_ano <= :ano AND terc_nit = :nite INTO :valor;
    valor = (valor / numeroprom);
    SELECT NOCO_VALOR FROM NOMINA_CONCEPTOS WHERE CONC_COD = :conc_cod AND TERC_NIT  = :nite AND NOCO_PAGOOK = 'N' AND NOCO_PERIODO = 0 INTO :saldosini;
    IF (saldosini IS NULL) THEN
    saldosini = 0;
    ELSE
    UPDATE nomina_conceptos N SET noco_pagook = 'S' WHERE n.noco_aplicaprom = 'S' AND N.noco_periodo >= :perinicial - 1 AND N.noco_periodo < :periodo AND N.noco_ano >= :anoprom AND N.noco_ano <= :ano  AND CONC_COD = :conc_cod AND terc_nit = :nite AND NOCO_PERIODO = 0;
    VALOR = :valor + :saldosini;
    EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
    UPDATE nomina_conceptos N SET noco_pagook = 'S' WHERE n.noco_aplicaprom = 'S' AND N.noco_periodo >= :perinicial - 1 AND N.noco_periodo < :periodo AND N.noco_ano >= :anoprom AND N.noco_ano <= :ano  AND CONC_COD = :conc_cod AND terc_nit = :nite;
    END
    IF (conc_otroconc = 'S') THEN
    BEGIN
    anosum = CAST(ano AS INTEGER);
    anosum = anosum - 1;
    SELECT SUM (noco_valor) FROM nomina_conceptos n WHERE n.noco_ano = :anosum AND n.conc_cod = :conc_codotroconc AND N.terc_nit = :nite INTO :valor;
    SELECT NOCO_VALOR FROM NOMINA_CONCEPTOS WHERE noco_ano = :anosum AND conc_cod = :conc_codotroconc AND terc_nit = :nite AND NOCO_PERIODO = 0 INTO :saldosini;
    IF (saldosini IS NULL) THEN
    saldosini = 0;
    ELSE
    UPDATE nomina_conceptos SET noco_pagook = 'S' WHERE noco_ano = :anosum AND conc_cod = :conc_codotroconc AND NOCO_PERIODO = 0 AND terc_nit = :nite;
    VALOR = :valor + :saldosini;
    UPDATE nomina_conceptos SET noco_pagook = 'S' WHERE noco_ano = :anosum AND conc_cod = :conc_codotroconc AND terc_nit = :nite;
    END
/*SI EL CONCEPTO ES UN APORTE*/
IF (conc_aporte = 'S') THEN
BEGIN
    IF ((:entidad = '' ) OR (entidad IS NULL)) THEN
    BEGIN
     SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
     IF (comision IS NULL) THEN
     comision = 0;
     valor = :basico + :comision;
    IF ((conc_cod = 904) OR (conc_cod = 905) OR (conc_cod = 906)) THEN
            BEGIN
            entidad = :nitafp;
                IF (conc_cod = 904) THEN
                BEGIN
                SELECT A.paan_afptr FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = (((((:basico /30) * :diaslab ) + :comision)+ :cambsaltrans) * :PORCEN) /100;
                END
                ELSE
                IF ((conc_cod = 905) OR (conc_cod = 906)) THEN
                BEGIN
                SELECT A.paan_afpem FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = (((((:basico /30) * :diaslab ) + :comision)+ :cambsaltrans) * :PORCEN) /100;
                END
                EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
            END
            ELSE
       IF ((conc_cod = 907) OR (conc_cod = 914) OR (conc_cod = 915)) THEN
            BEGIN
            entidad = :niteps;
                IF (conc_cod = 907) THEN
                BEGIN
                SELECT A.paan_epstr FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = (((((:basico )/30 * :diaslab ) + :comision)+ :cambsaltrans) * :PORCEN) /100;
                END
                ELSE
                IF ((conc_cod = 914) OR (conc_cod = 915)) THEN
                BEGIN
                SELECT A.paan_epsem FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = (((((:basico )/30 * :diaslab ) + :comision)+ :cambsaltrans) * :PORCEN) /100;
                END
                EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
            END
            ELSE
       IF ((conc_cod = 910) OR (conc_cod = 911) OR (conc_cod = 916) OR (conc_cod = 917) OR (conc_cod = 918) OR (conc_cod = 919)) THEN
            BEGIN
            entidad = :nitccf;
            SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
            IF (comision IS NULL) THEN
            comision = 0;
                IF ((conc_cod = 910) OR (conc_cod = 911) ) THEN
                BEGIN
                SELECT A.paan_ccf FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = (((((:basico )/30 * :diaslab ) + :comision)+ :cambsaltrans) * :PORCEN) /100;
                EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
                END
                ELSE
                IF ((conc_cod = 916) OR (conc_cod = 917)) THEN
                BEGIN
                SELECT A.paan_icbf FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = (((((:basico )/30 * :diaslab ) + :comision)+ :cambsaltrans) * :PORCEN) /100;
                EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
                END
                ELSE
                IF ((conc_cod = 918) OR (conc_cod = 919)) THEN
                BEGIN
                SELECT A.paan_sena FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = (((((:basico )/30 * :diaslab ) + :comision)+ :cambsaltrans) * :PORCEN) /100;
                EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
                END
            END
            ELSE
        IF ((conc_cod = 912) OR (conc_cod = 913)) THEN
            BEGIN
            entidad = :nitafc;
            SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
            IF (comision IS NULL) THEN
            comision = 0;
                IF ((conc_cod = 912) OR (conc_cod = 913) ) THEN
                BEGIN
                SELECT A.paan_cesemp FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = ((((:basico + :comision)/30 * :diaslab )+ :cambsaltrans) * :PORCEN) /100;
                EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
                END
            END
            ELSE
        BEGIN
        IF (comision IS NULL) THEN
        comision = 0;
        SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
        conc_monto = :basico + :comision;
        IF (conc_porc <> 0 AND conc_porc IS NOT NULL) THEN
        VALOR = (((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans) * :conc_porc) /100;
        ELSE
        IF (:porcen <> 0 AND :porcen IS NOT NULL) THEN
        VALOR = (((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans) * :porcen) /100;
        ELSE
        IF (:montos <> 0 AND :montos IS NOT NULL) THEN
        valor = :montos;
        ELSE
        IF (:conc_monto <> 0 AND :conc_monto IS NOT NULL) THEN
        valor = :conc_monto;
        EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
        END
    END
    END
    ELSE
    IF (conc_prov = 'S') THEN
    BEGIN
        conc_monto = :basico;
        IF (conc_porc <> 0 AND conc_porc IS NOT NULL) THEN
        VALOR = (((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans) * :conc_porc) /100;
        ELSE
        IF (porcen <> 0 AND porcen IS NOT NULL) THEN
        VALOR = (((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans) * :porcen) /100;
        ELSE
        IF (montos <> 0 AND montos IS NOT NULL) THEN
        VALOR = :montos;
        ELSE
        IF (conc_monto <> 0 AND conc_monto IS NOT NULL) THEN
        VALOR = :conc_monto;
        EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
    END
item = :item + 1;
END
 IF (conc_cod = 920) THEN
 BEGIN
 SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :valor;
 IF (valor IS NULL) THEN
 valor = 0;
 item = :item + 1;
 END
    IF (liquidaper = 0) THEN
    INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
    VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
    ELSE
    IF (liquidaper = 1) THEN
    BEGIN
    rmod = mod(:periodo, 2);
    IF (rmod = 0) THEN
        INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
        VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
    END
    ELSE
    IF (liquidaper = 2) THEN
    BEGIN
    rmod = mod(:periodo, 4);
    IF (rmod = 0) THEN
        INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
        VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
    END
END
END
END
END
ELSE
/*SI ES MENSUAL*/
IF (periodicidad = 1) THEN
BEGIN
EXECUTE PROCEDURE cambie_id_nomina RETURNING_VALUES(:idnomina);
INSERT INTO nomina (nomi_id, NOMI_FECCAUSA, NOMI_PAGOGLOBAL, NOMI_PERIODOCIDAD, NOMI_PERIODO, NOMI_ANO, NOMI_LIQOK)
VALUES (:IDNOMINA, :fec,:pagoglobal, :periodicidad, :periodo, :ano, 'N');
    BEGIN
    item = 1;
    FOR SELECT E.TERC_NIT, E.empl_salario, e.empl_eps, e.empl_afc, e.empl_afp, e.empl_ccf
    FROM EMPLEADOS E
    WHERE E.empl_ppago = 1
    INTO :nite, :basico, :niteps, :nitafc, :nitafp, :nitccf
    DO
    FOR SELECT CE.TERC_NIT, CE.CONC_COD, CE.EMCO_MONTO, CE.EMCO_PORC, ce.empl_entidad, CE.emco_perprom, CE.emco_luquidaper,    CN.CONC_COD, CN.CONC_DEDUC,CN.CONC_PORC, CN.CONC_ENTIDAD, CN.CONC_MONTO,  CN.CONC_DIAS, CN.CONC_MODIFI,
    CN.CONC_PROMEDIO, CN.conc_salario, CE.emco_perprom, CN.conc_prov, CN.conc_aporte, CN.conc_aplicaprom, cn.conc_otroconc, cn.conc_codotroconc, CN.conc_gtoempr
    FROM empleado_conceptos CE, CONCEPTOS_NOMINA CN WHERE ((CE.terc_nit = :nite) AND (CE.CONC_COD = CN.CONC_COD) AND (CN.conc_fecini <= :fec AND CN.conc_fecfin >= :FEC) ) OR ((CE.terc_nit = :nite)
    AND (CE.CONC_COD = CN.CONC_COD) AND (cn.conc_todosper = 'N') AND (CE.emco_ppago = :periodo)) OR  ((CE.terc_nit = :nite) AND (CE.CONC_COD = CN.CONC_COD) AND cn.conc_todosper = 'S')  ORDER BY (TERC_NIT)
    INTO :nit_tercero, :concept,  :montos, :porcen, :entidad, :numeroprom, :liquidaper ,:CONC_COD, :CONC_DEDUC, :CONC_PORC,
    :CONC_ENTIDAD, :CONC_MONTO, :CONC_DIAS, :CONC_MODIFI,:CONC_PROMEDIO, :salario,:EMCO_PERPROM, :conc_prov, :conc_aporte , :CONC_APLICAPROM, :conc_otroconc, :conc_codotroconc, :gtoempr    DO
BEGIN
    IF (conc_dias = 'S') THEN
    EXECUTE PROCEDURE DIAS_LABORADOS (:nite, :periodo, :fec) RETURNING_VALUES (:diaslab);
    ELSE
    diaslab = 30;
 SELECT ((n.nono_valor /30) * n.nono_dura), (n.nono_dura) FROM nomina_novedades n WHERE n.tnov_cod = 11 AND n.terc_nit = :nite AND n.nono_periodo = :periodo INTO :cambsaltrans, :duranov;
 IF (cambsaltrans IS NULL) THEN
 cambsaltrans = 0;
 if (duranov is null) then
 duranov = 0;
 diaslab = :diaslab - :duranov;
 if (conc_cod = 921) then
 begin
 if (porcen IS NOT NULL AND porcen <> 0) then
 valor = ((basico / 30)* :diaslab ) * :PORCEN /100;
 ELSE
 if (conc_porc IS NOT null AND conc_porc <> 0) then
 valor = ((:basico / 30)* :diaslab ) * :conc_porc /100;
 EXECUTE PROCEDURE REDONDEE(:valor, 5) RETURNING_VALUES (VALOR);
 end
 ELSE
 if (conc_cod = 922) then
 BEGIN
 SELECT P.prcu_monto FROM prestamo_cuotas P, prestamo_nomina PN WHERE P.prcu_ano = :ano AND P.prcu_periodo = :periodo AND PN.prno_id = P.prno_id AND PN.terc_nit = :nite INTO :valor;
 IF (valor IS NULL) THEN
 valor = 0;
 EXECUTE PROCEDURE REDONDEE(:valor, 5) RETURNING_VALUES (VALOR);
 item = :item + 1;
 update prestamo_cuotas  P SET prcu_ok = 'S' WHERE P.prcu_ano = :ano AND P.prcu_periodo = :periodo AND P.prno_id = (SELECT PN.prno_id FROM PRESTAMO_NOMINA PN WHERE PN.terc_nit = :nite);
 END
 ELSE
 BEGIN
    IF ((:montos = 0) OR (:montos IS NULL)) THEN
      BEGIN
      IF ((CONC_PORC = 0 AND :porcen = 0) OR (CONC_PORC IS NULL AND :porcen = 0) OR (CONC_PORC = 0 AND :porcen IS NULL) OR (CONC_PORC IS NULL AND :porcen IS NULL) ) THEN
        BEGIN
        IF ((conc_monto <> 0) AND (conc_monto IS NOT NULL) ) THEN
        BEGIN
        VALOR = :CONC_MONTO/30 * :diaslab;
        EXECUTE PROCEDURE REDONDEE(:valor, 5) RETURNING_VALUES (VALOR);
        END
        ELSE
        IF (salario = 'S' AND CONC_COD <> 900 AND CONC_COD <> 920) THEN
        BEGIN
        conc_monto = :basico;
        VALOR = (:conc_monto/30 * :diaslab ) + :cambsaltrans;
        EXECUTE PROCEDURE REDONDEE(:valor, 5) RETURNING_VALUES (VALOR);
        END
        ELSE
        valor = montos;
        END
       ELSE
       BEGIN
        IF (:porcen <> 0) THEN
          BEGIN
            IF ((conc_monto <> 0) AND (conc_monto IS NOT NULL) ) THEN
            BEGIN
              VALOR = ((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans * :PORCEN) /100;
              EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
            END
          END
          ELSE
          BEGIN
            IF ((conc_monto <> 0) AND (conc_monto IS NOT NULL) ) THEN
            BEGIN
              VALOR = ((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans * :conc_porc) /100;
              EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
            END
            ELSE
        IF (salario = 'S' AND CONC_COD <> 900 AND CONC_COD <> 920) THEN
            BEGIN
              conc_monto = :basico;
              VALOR = ((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans * :conc_porc) /100;
              EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
            END
          END
       END
      END
    ELSE
    BEGIN
      IF (CONC_PORC = 0 AND :porcen = 0) THEN
      BEGIN
      VALOR = (:montos/30 * :diaslab);
      EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
      END
      ELSE
      BEGIN
        IF (:porcen <> 0) THEN
          BEGIN
          VALOR = ((:MONTOS/30 * :diaslab )+ :cambsaltrans * :PORCEN) /100;
          EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
          END
          ELSE
          BEGIN
          VALOR = ((:montos/30 * :diaslab )+ :cambsaltrans * :CONC_PORC) /100;
          END
          EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
       END
   END
    IF (conc_promedio = 'S') THEN
    BEGIN
    perinicial = :periodo - (:numeroprom) + 1;
    anoprom = CAST (ano AS INTEGER);
    IF (perinicial <= 0) THEN
    BEGIN
    perinicial = 24 + :PERINICIAL;
    anoprom = CAST(ANO AS INTEGER) - 1;
    END
    SELECT SUM (noco_valor) FROM nomina_conceptos n WHERE n.noco_aplicaprom = 'S' AND N.noco_periodo >= :perinicial - 1 AND N.noco_periodo < :periodo AND N.noco_ano >= :anoprom AND N.noco_ano <= :ano AND terc_nit = :nite INTO :valor;
    valor = (valor / numeroprom)/*/ 30 * :diaslab*/;
    SELECT NOCO_VALOR FROM NOMINA_CONCEPTOS WHERE CONC_COD = :conc_cod AND TERC_NIT  = :nite AND NOCO_PAGOOK = 'N' AND NOCO_PERIODO = 0 INTO :saldosini;
    IF (saldosini IS NULL) THEN
    saldosini = 0;
    ELSE
    UPDATE nomina_conceptos N SET noco_pagook = 'S' WHERE n.noco_aplicaprom = 'S' AND N.noco_periodo >= :perinicial - 1 AND N.noco_periodo < :periodo AND N.noco_ano >= :anoprom AND N.noco_ano <= :ano  AND CONC_COD = :conc_cod AND terc_nit = :nite AND NOCO_PERIODO = 0;
    VALOR = :valor + :saldosini;
    EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
    UPDATE nomina_conceptos N SET noco_pagook = 'S' WHERE n.noco_aplicaprom = 'S' AND N.noco_periodo >= :perinicial - 1 AND N.noco_periodo < :periodo AND N.noco_ano >= :anoprom AND N.noco_ano <= :ano  AND CONC_COD = :conc_cod AND terc_nit = :nite;
    END
    IF (conc_otroconc = 'S') THEN
    BEGIN
    anosum = CAST(ano AS INTEGER);
    anosum = anosum - 1;
    SELECT SUM (noco_valor) FROM nomina_conceptos n WHERE n.noco_ano = :anosum AND n.conc_cod = :conc_codotroconc AND N.terc_nit = :nite INTO :valor;
    SELECT NOCO_VALOR FROM NOMINA_CONCEPTOS WHERE noco_ano = :anosum AND conc_cod = :conc_codotroconc AND terc_nit = :nite AND NOCO_PERIODO = 0 INTO :saldosini;
    IF (saldosini IS NULL) THEN
    saldosini = 0;
    ELSE
    UPDATE nomina_conceptos SET noco_pagook = 'S' WHERE noco_ano = :anosum AND conc_cod = :conc_codotroconc AND NOCO_PERIODO = 0 AND terc_nit = :nite;
    VALOR = :valor + :saldosini;
    UPDATE nomina_conceptos SET noco_pagook = 'S' WHERE noco_ano = :anosum AND conc_cod = :conc_codotroconc AND terc_nit = :nite;
    END
/*SI EL CONCEPTO ES UN APORTE*/
IF (conc_aporte = 'S') THEN
BEGIN
    IF ((:entidad = '' ) OR (entidad IS NULL)) THEN
    BEGIN
     SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
     IF (comision IS NULL) THEN
     comision = 0;
     valor = :basico + :comision;
    IF ((conc_cod = 904) OR (conc_cod = 905) OR (conc_cod = 906)) THEN
            BEGIN
            entidad = :nitafp;
                IF (conc_cod = 904) THEN
                BEGIN
                SELECT A.paan_afptr FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = (((((:basico /30) * :diaslab ) + :comision)+ :cambsaltrans) * :PORCEN) /100;
                END
                ELSE
                IF ((conc_cod = 905) OR (conc_cod = 906)) THEN
                BEGIN
                SELECT A.paan_afpem FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = (((((:basico /30) * :diaslab ) + :comision)+ :cambsaltrans) * :PORCEN) /100;
                END
                EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
            END
            ELSE
       IF ((conc_cod = 907) OR (conc_cod = 914) OR (conc_cod = 915)) THEN
            BEGIN
            entidad = :niteps;
                IF (conc_cod = 907) THEN
                BEGIN
                SELECT A.paan_epstr FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = (((((:basico )/30 * :diaslab ) + :comision)+ :cambsaltrans) * :PORCEN) /100;
                END
                ELSE
                IF ((conc_cod = 914) OR (conc_cod = 915)) THEN
                BEGIN
                SELECT A.paan_epsem FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = (((((:basico )/30 * :diaslab ) + :comision)+ :cambsaltrans) * :PORCEN) /100;
                END
                EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
            END
            ELSE
       IF ((conc_cod = 910) OR (conc_cod = 911) OR (conc_cod = 916) OR (conc_cod = 917) OR (conc_cod = 918) OR (conc_cod = 919)) THEN
            BEGIN
            entidad = :nitccf;
            SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
            IF (comision IS NULL) THEN
            comision = 0;
                IF ((conc_cod = 910) OR (conc_cod = 911) ) THEN
                BEGIN
                SELECT A.paan_ccf FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = (((((:basico )/30 * :diaslab ) + :comision)+ :cambsaltrans) * :PORCEN) /100;
                EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
                END
                ELSE
                IF ((conc_cod = 916) OR (conc_cod = 917)) THEN
                BEGIN
                SELECT A.paan_icbf FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = (((((:basico )/30 * :diaslab ) + :comision)+ :cambsaltrans) * :PORCEN) /100;
                EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
                END
                ELSE
                IF ((conc_cod = 918) OR (conc_cod = 919)) THEN
                BEGIN
                SELECT A.paan_sena FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = (((((:basico )/30 * :diaslab ) + :comision)+ :cambsaltrans) * :PORCEN) /100;
                EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
                END
            END
            ELSE
        IF ((conc_cod = 912) OR (conc_cod = 913)) THEN
            BEGIN
            entidad = :nitafc;
            SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
            IF (comision IS NULL) THEN
            comision = 0;
                IF ((conc_cod = 912) OR (conc_cod = 913) ) THEN
                BEGIN
                SELECT A.paan_cesemp FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = ((((:basico + :comision)/30 * :diaslab )+ :cambsaltrans) * :PORCEN) /100;
                EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
                END
            END
            ELSE
        BEGIN
        IF (comision IS NULL) THEN
        comision = 0;
        SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
        conc_monto = :basico + :comision;
        IF (conc_porc <> 0 AND conc_porc IS NOT NULL) THEN
        VALOR = (((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans) * :conc_porc) /100;
        ELSE
        IF (:porcen <> 0 AND :porcen IS NOT NULL) THEN
        VALOR = (((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans) * :porcen) /100;
        ELSE
        IF (:montos <> 0 AND :montos IS NOT NULL) THEN
        valor = :montos;
        ELSE
        IF (:conc_monto <> 0 AND :conc_monto IS NOT NULL) THEN
        valor = :conc_monto;
        EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
        END
    END
    END
    ELSE
    IF (conc_prov = 'S') THEN
    BEGIN
        conc_monto = :basico;
        IF (conc_porc <> 0 AND conc_porc IS NOT NULL) THEN
        VALOR = (((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans) * :conc_porc) /100;
        ELSE
        IF (porcen <> 0 AND porcen IS NOT NULL) THEN
        VALOR = (((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans) * :porcen) /100;
        ELSE
        IF (montos <> 0 AND montos IS NOT NULL) THEN
        VALOR = :montos;
        ELSE
        IF (conc_monto <> 0 AND conc_monto IS NOT NULL) THEN
        VALOR = :conc_monto;
        EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
    END
item = :item + 1;
END
IF (conc_cod = 920) THEN
 BEGIN
 SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :valor;
 IF (valor IS NULL) THEN
 valor = 0;
 item = :item + 1;
 END
    IF (liquidaper = 0) THEN
    INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
    VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
    ELSE
    IF (liquidaper = 1) THEN
    BEGIN
    rmod = mod(:periodo, 2);
    IF (rmod = 0) THEN
        INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
        VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
    END
    ELSE
    IF (liquidaper = 2) THEN
    BEGIN
    rmod = mod(:periodo, 4);
    IF (rmod = 0) THEN
        INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
        VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
    END
END
END
END
ELSE
/*SI ES SEMANAL*/
IF (periodicidad = 3) THEN
BEGIN
EXECUTE PROCEDURE cambie_id_nomina RETURNING_VALUES(:idnomina);
INSERT INTO nomina (nomi_id, NOMI_FECCAUSA, NOMI_PAGOGLOBAL, NOMI_PERIODOCIDAD, NOMI_PERIODO, NOMI_ANO, NOMI_LIQOK)
VALUES (:IDNOMINA, :fec,:pagoglobal, :periodicidad, :periodo, :ano, 'N');
    BEGIN
    item = 1;
    FOR SELECT E.TERC_NIT, E.empl_salario, e.empl_eps, e.empl_afc, e.empl_afp, e.empl_ccf
    FROM EMPLEADOS E
    WHERE E.empl_ppago = 3
    INTO :nite, :basico, :niteps, :nitafc, :nitafp, :nitccf
    DO
    BEGIN
    FOR SELECT CE.TERC_NIT, CE.CONC_COD, CE.EMCO_MONTO, CE.EMCO_PORC, ce.empl_entidad, CE.emco_perprom, CE.emco_luquidaper,    CN.CONC_COD, CN.CONC_DEDUC,CN.CONC_PORC, CN.CONC_ENTIDAD, CN.CONC_MONTO,  CN.CONC_DIAS, CN.CONC_MODIFI,
    CN.CONC_PROMEDIO, CN.conc_salario, CE.emco_perprom, CN.conc_prov, CN.conc_aporte, CN.conc_aplicaprom, cn.conc_otroconc, cn.conc_codotroconc, CN.conc_gtoempr
    FROM empleado_conceptos CE, CONCEPTOS_NOMINA CN WHERE ((CE.terc_nit = :nite) AND (CE.CONC_COD = CN.CONC_COD) AND (CN.conc_fecini <= :fec AND CN.conc_fecfin >= :FEC) ) OR ((CE.terc_nit = :nite)
    AND (CE.CONC_COD = CN.CONC_COD) AND (cn.conc_todosper = 'N') AND (CE.emco_ppago = :periodo)) OR  ((CE.terc_nit = :nite) AND (CE.CONC_COD = CN.CONC_COD) AND cn.conc_todosper = 'S')  ORDER BY (TERC_NIT)
    INTO :nit_tercero, :concept,  :montos, :porcen, :entidad, :numeroprom, :liquidaper ,:CONC_COD, :CONC_DEDUC, :CONC_PORC,
    :CONC_ENTIDAD, :CONC_MONTO, :CONC_DIAS, :CONC_MODIFI,:CONC_PROMEDIO, :salario,:EMCO_PERPROM, :conc_prov, :conc_aporte , :CONC_APLICAPROM, :conc_otroconc, :conc_codotroconc, :gtoempr
    DO
BEGIN
    IF (conc_dias = 'S') THEN
    EXECUTE PROCEDURE DIAS_LABORADOS (:nite, :periodo, :fec) RETURNING_VALUES (:diaslab);
    ELSE
    BEGIN
    IF (liquidaper = 0) THEN
    diaslab = 7;
    ELSE
    IF (liquidaper = 1) THEN
    diaslab = 15;
    ELSE
    IF (liquidaper = 2) THEN
    diaslab = 30;
    END
 SELECT ((n.nono_valor /30) * n.nono_dura), (n.nono_dura) FROM nomina_novedades n WHERE n.tnov_cod = 11 AND n.terc_nit = :nite AND n.nono_periodo = :periodo INTO :cambsaltrans, :duranov;
 IF (cambsaltrans IS NULL) THEN
 cambsaltrans = 0;
 if (duranov is null) then
 duranov = 0;
 diaslab = :diaslab - :duranov;
 IF (conc_cod = 920) THEN
 BEGIN
 SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :valor;
 IF (valor IS NULL) THEN
 valor = 0;
 item = :item + 1;
 END
 ELSE
 if (conc_cod = 921) then
 begin
 if (porcen IS NOT NULL AND porcen <> 0) then
 valor = ((basico / 30)* :diaslab ) * :PORCEN /100;
 ELSE
 if (conc_porc IS NOT null AND conc_porc <> 0) then
 valor = ((:basico / 30)* :diaslab ) * :conc_porc /100;
 EXECUTE PROCEDURE REDONDEE(:valor, 5) RETURNING_VALUES (VALOR);
 end
 ELSE
 if (conc_cod = 922) then
 BEGIN
 SELECT P.prcu_monto FROM prestamo_cuotas P, prestamo_nomina PN WHERE P.prcu_ano = :ano AND P.prcu_periodo = :periodo AND PN.prno_id = P.prno_id AND PN.terc_nit = :nite INTO :valor;
 IF (valor IS NULL) THEN
 valor = 0;
 EXECUTE PROCEDURE REDONDEE(:valor, 5) RETURNING_VALUES (VALOR);
 item = :item + 1;
 update prestamo_cuotas  P SET prcu_ok = 'S' WHERE P.prcu_ano = :ano AND P.prcu_periodo = :periodo AND P.prno_id = (SELECT PN.prno_id FROM PRESTAMO_NOMINA PN WHERE PN.terc_nit = :nite);
 END
 ELSE
 BEGIN
    IF ((:montos = 0) OR (:montos IS NULL)) THEN
      BEGIN
      IF ((CONC_PORC = 0 AND :porcen = 0) OR (CONC_PORC IS NULL AND :porcen = 0) OR (CONC_PORC = 0 AND :porcen IS NULL) OR (CONC_PORC IS NULL AND :porcen IS NULL) ) THEN
        BEGIN
        IF ((conc_monto <> 0) AND (conc_monto IS NOT NULL) ) THEN
        BEGIN
        VALOR = :CONC_MONTO/30 * :diaslab;
        EXECUTE PROCEDURE REDONDEE(:valor, 5) RETURNING_VALUES (VALOR);
        END
        ELSE
        IF (salario = 'S' AND CONC_COD <> 900 AND CONC_COD <> 920) THEN
        BEGIN
        conc_monto = :basico;
        VALOR = (:conc_monto/30 * :diaslab ) + :cambsaltrans;
        EXECUTE PROCEDURE REDONDEE(:valor, 5) RETURNING_VALUES (VALOR);
        END
        ELSE
        valor = montos;
        END
       ELSE
       BEGIN
        IF (:porcen <> 0) THEN
          BEGIN
            IF ((conc_monto <> 0) AND (conc_monto IS NOT NULL) ) THEN
            BEGIN
              VALOR = ((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans * :PORCEN) /100;
              EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
            END
          END
          ELSE
          BEGIN
            IF ((conc_monto <> 0) AND (conc_monto IS NOT NULL) ) THEN
            BEGIN
              VALOR = ((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans * :conc_porc) /100;
              EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
            END
            ELSE
        IF (salario = 'S' AND CONC_COD <> 900 AND CONC_COD <> 920) THEN
            BEGIN
              conc_monto = :basico;
              VALOR = ((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans * :conc_porc) /100;
              EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
            END
          END
       END
      END
    ELSE
    BEGIN
      IF (CONC_PORC = 0 AND :porcen = 0) THEN
      BEGIN
      VALOR = (:montos/30 * :diaslab);
      EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
      END
      ELSE
      BEGIN
        IF (:porcen <> 0) THEN
          BEGIN
          VALOR = ((:MONTOS/30 * :diaslab )+ :cambsaltrans * :PORCEN) /100;
          EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
          END
          ELSE
          BEGIN
          VALOR = ((:montos/30 * :diaslab )+ :cambsaltrans * :CONC_PORC) /100;
          END
          EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
       END
   END
    IF (conc_promedio = 'S') THEN
    BEGIN
    perinicial = :periodo - (:numeroprom) + 1;
    anoprom = CAST (ano AS INTEGER);
    IF (perinicial <= 0) THEN
    BEGIN
    perinicial = 24 + :PERINICIAL;
    anoprom = CAST(ANO AS INTEGER) - 1;
    END
    SELECT SUM (noco_valor) FROM nomina_conceptos n WHERE n.noco_aplicaprom = 'S' AND N.noco_periodo >= :perinicial - 1 AND N.noco_periodo < :periodo AND N.noco_ano >= :anoprom AND N.noco_ano <= :ano AND terc_nit = :nite INTO :valor;
    valor = (valor / numeroprom)/*/ 30 * :diaslab*/;
    SELECT NOCO_VALOR FROM NOMINA_CONCEPTOS WHERE CONC_COD = :conc_cod AND TERC_NIT  = :nite AND NOCO_PAGOOK = 'N' AND NOCO_PERIODO = 0 INTO :saldosini;
    IF (saldosini IS NULL) THEN
    saldosini = 0;
    ELSE
    UPDATE nomina_conceptos N SET noco_pagook = 'S' WHERE n.noco_aplicaprom = 'S' AND N.noco_periodo >= :perinicial - 1 AND N.noco_periodo < :periodo AND N.noco_ano >= :anoprom AND N.noco_ano <= :ano  AND CONC_COD = :conc_cod AND terc_nit = :nite AND NOCO_PERIODO = 0;
    VALOR = :valor + :saldosini;
    EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
    UPDATE nomina_conceptos N SET noco_pagook = 'S' WHERE n.noco_aplicaprom = 'S' AND N.noco_periodo >= :perinicial - 1 AND N.noco_periodo < :periodo AND N.noco_ano >= :anoprom AND N.noco_ano <= :ano  AND CONC_COD = :conc_cod AND terc_nit = :nite;
    END
    IF (conc_otroconc = 'S') THEN
    BEGIN
    anosum = CAST(ano AS INTEGER);
    anosum = anosum - 1;
    SELECT SUM (noco_valor) FROM nomina_conceptos n WHERE n.noco_ano = :anosum AND n.conc_cod = :conc_codotroconc AND N.terc_nit = :nite INTO :valor;
    SELECT NOCO_VALOR FROM NOMINA_CONCEPTOS WHERE noco_ano = :anosum AND conc_cod = :conc_codotroconc AND terc_nit = :nite AND NOCO_PERIODO = 0 INTO :saldosini;
    IF (saldosini IS NULL) THEN
    saldosini = 0;
    ELSE
    UPDATE nomina_conceptos SET noco_pagook = 'S' WHERE noco_ano = :anosum AND conc_cod = :conc_codotroconc AND NOCO_PERIODO = 0 AND terc_nit = :nite;
    VALOR = :valor + :saldosini;
    UPDATE nomina_conceptos SET noco_pagook = 'S' WHERE noco_ano = :anosum AND conc_cod = :conc_codotroconc AND terc_nit = :nite;
    END
/*SI EL CONCEPTO ES UN APORTE*/
IF (conc_aporte = 'S') THEN
BEGIN
    IF ((:entidad = '' ) OR (entidad IS NULL)) THEN
    BEGIN
     SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
     IF (comision IS NULL) THEN
     comision = 0;
     valor = :basico + :comision;
    IF ((conc_cod = 904) OR (conc_cod = 905) OR (conc_cod = 906)) THEN
            BEGIN
            entidad = :nitafp;
                IF (conc_cod = 904) THEN
                BEGIN
                SELECT A.paan_afptr FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = (((((:basico /30) * :diaslab ) + :comision)+ :cambsaltrans) * :PORCEN) /100;
                END
                ELSE
                IF ((conc_cod = 905) OR (conc_cod = 906)) THEN
                BEGIN
                SELECT A.paan_afpem FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = (((((:basico /30) * :diaslab ) + :comision)+ :cambsaltrans) * :PORCEN) /100;
                END
                EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
            END
            ELSE
       IF ((conc_cod = 907) OR (conc_cod = 914) OR (conc_cod = 915)) THEN
            BEGIN
            entidad = :niteps;
                IF (conc_cod = 907) THEN
                BEGIN
                SELECT A.paan_epstr FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = (((((:basico )/30 * :diaslab ) + :comision)+ :cambsaltrans) * :PORCEN) /100;
                END
                ELSE
                IF ((conc_cod = 914) OR (conc_cod = 915)) THEN
                BEGIN
                SELECT A.paan_epsem FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = (((((:basico )/30 * :diaslab ) + :comision)+ :cambsaltrans) * :PORCEN) /100;
                END
                EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
            END
            ELSE
       IF ((conc_cod = 910) OR (conc_cod = 911) OR (conc_cod = 916) OR (conc_cod = 917) OR (conc_cod = 918) OR (conc_cod = 919)) THEN
            BEGIN
            entidad = :nitccf;
            SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
            IF (comision IS NULL) THEN
            comision = 0;
                IF ((conc_cod = 910) OR (conc_cod = 911) ) THEN
                BEGIN
                SELECT A.paan_ccf FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = (((((:basico )/30 * :diaslab ) + :comision)+ :cambsaltrans) * :PORCEN) /100;
                EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
                END
                ELSE
                IF ((conc_cod = 916) OR (conc_cod = 917)) THEN
                BEGIN
                SELECT A.paan_icbf FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = (((((:basico )/30 * :diaslab ) + :comision)+ :cambsaltrans) * :PORCEN) /100;
                EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
                END
                ELSE
                IF ((conc_cod = 918) OR (conc_cod = 919)) THEN
                BEGIN
                SELECT A.paan_sena FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = (((((:basico )/30 * :diaslab ) + :comision)+ :cambsaltrans) * :PORCEN) /100;
                EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
                END
            END
            ELSE
        IF ((conc_cod = 912) OR (conc_cod = 913)) THEN
            BEGIN
            entidad = :nitafc;
            SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
            IF (comision IS NULL) THEN
            comision = 0;
                IF ((conc_cod = 912) OR (conc_cod = 913) ) THEN
                BEGIN
                SELECT A.paan_cesemp FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = ((((:basico + :comision)/30 * :diaslab )+ :cambsaltrans) * :PORCEN) /100;
                EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
                END
            END
            ELSE
        BEGIN
        IF (comision IS NULL) THEN
        comision = 0;
        SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
        conc_monto = :basico + :comision;
        IF (conc_porc <> 0 AND conc_porc IS NOT NULL) THEN
        VALOR = (((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans) * :conc_porc) /100;
        ELSE
        IF (:porcen <> 0 AND :porcen IS NOT NULL) THEN
        VALOR = (((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans) * :porcen) /100;
        ELSE
        IF (:montos <> 0 AND :montos IS NOT NULL) THEN
        valor = :montos;
        ELSE
        IF (:conc_monto <> 0 AND :conc_monto IS NOT NULL) THEN
        valor = :conc_monto;
        EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
        END
    END
    END
    ELSE
    IF (conc_prov = 'S') THEN
    BEGIN
        conc_monto = :basico;
        IF (conc_porc <> 0 AND conc_porc IS NOT NULL) THEN
        VALOR = (((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans) * :conc_porc) /100;
        ELSE
        IF (porcen <> 0 AND porcen IS NOT NULL) THEN
        VALOR = (((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans) * :porcen) /100;
        ELSE
        IF (montos <> 0 AND montos IS NOT NULL) THEN
        VALOR = :montos;
        ELSE
        IF (conc_monto <> 0 AND conc_monto IS NOT NULL) THEN
        VALOR = :conc_monto;
        EXECUTE PROCEDURE REDONDEE(:valor, 5)RETURNING_VALUES (VALOR);
    END
item = :item + 1;
END
    IF (liquidaper = 0) THEN
    INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
    VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
    ELSE
    IF (liquidaper = 1) THEN
    BEGIN
    rmod = mod(:periodo, 2);
    IF (rmod = 0) THEN
        INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
        VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
    END
    ELSE
    IF (liquidaper = 2) THEN
    BEGIN
    rmod = mod(:periodo, 4);
    IF (rmod = 0) THEN
        INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
        VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
    END
END
END
END
END
SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER TRIGGER empleado_llamados_bi
active before insert position 0
AS
declare VARIABLE IT integer;
begin
SELECT MAX (emll_item) FROM empleado_llamados into :IT;
if (it is null) then
it = 0;
new.emll_item = IT+1;
end
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE CAUSA_NOMINA (
    fec date,
    periodo integer,
    periodicidad integer,
    pagoglobal char(1),
    ano char(4))
returns (
    idnomina integer)
as
declare variable item integer;
declare variable nite varchar(20) character set none;
declare variable nit_tercero varchar(20);
declare variable concept integer;
declare variable montos numeric(18,2);
declare variable porcen numeric(9,4);
declare variable entidad varchar(20);
declare variable conc_cod integer;
declare variable conc_deduc char(1);
declare variable conc_porc numeric(9,4);
declare variable conc_entidad integer;
declare variable conc_monto numeric(18,2);
declare variable conc_modifi char(1);
declare variable conc_promedio char(1);
declare variable emco_perprom integer;
declare variable valor numeric(18,2);
declare variable diaslab integer;
declare variable conc_prov char(1);
declare variable conc_aporte char(1);
declare variable numeroprom integer;
declare variable conc_aplicaprom char(1);
declare variable perinicial integer;
declare variable anoprom integer;
declare variable conc_dias char(1);
declare variable conc_otroconc char(1);
declare variable conc_codotroconc integer;
declare variable anosum integer;
declare variable salario char(1) character set none;
declare variable liquidaper integer;
declare variable rmod numeric(2,2);
declare variable basico numeric(18,2);
declare variable niteps varchar(20);
declare variable nitafc varchar(20);
declare variable nitafp varchar(20);
declare variable nitccf varchar(20);
declare variable gtoempr char(1);
declare variable comision numeric(18,2);
declare variable cambsaltrans numeric(18,2);
declare variable saldosini numeric(18,2);
declare variable duranov integer;
declare variable base numeric(18,2);
BEGIN
/*SI ES QUINCENAL*/
IF (periodicidad = 2) THEN
BEGIN
EXECUTE PROCEDURE cambie_id_nomina RETURNING_VALUES(:idnomina);
INSERT INTO nomina (nomi_id, NOMI_FECCAUSA, NOMI_PAGOGLOBAL, NOMI_PERIODOCIDAD, NOMI_PERIODO, NOMI_ANO, NOMI_LIQOK)
VALUES (:IDNOMINA, :fec,:pagoglobal, :periodicidad, :periodo, :ano, 'N');
 BEGIN
    item = 1;
    FOR SELECT E.TERC_NIT, E.empl_salario, e.empl_eps, e.empl_afc, e.empl_afp, e.empl_ccf
    FROM EMPLEADOS E
    WHERE E.empl_ppago = 2
    INTO :nite, :basico, :niteps, :nitafc, :nitafp, :nitccf
    DO
    BEGIN
    FOR SELECT CE.TERC_NIT, CE.CONC_COD, CE.EMCO_MONTO, CE.EMCO_PORC, ce.empl_entidad, CE.emco_perprom, CE.emco_luquidaper, CN.CONC_COD, CN.CONC_DEDUC,CN.CONC_PORC, CN.CONC_ENTIDAD, CN.CONC_MONTO,  CN.CONC_DIAS, CN.CONC_MODIFI,
    CN.CONC_PROMEDIO, CN.conc_salario, CE.emco_perprom, CN.conc_prov, CN.conc_aporte, CN.conc_aplicaprom, cn.conc_otroconc, cn.conc_codotroconc, CN.conc_gtoempr, CN.conc_base
    FROM empleado_conceptos CE, CONCEPTOS_NOMINA CN WHERE ((CE.terc_nit = :nite) AND (CE.CONC_COD = CN.CONC_COD) AND (CN.conc_fecini <= :fec AND CN.conc_fecfin >= :FEC) ) OR ((CE.terc_nit = :nite)
    AND (CE.CONC_COD = CN.CONC_COD) AND (cn.conc_todosper = 'N') AND (CE.emco_ppago = :periodo)) OR  ((CE.terc_nit = :nite) AND (CE.CONC_COD = CN.CONC_COD) AND cn.conc_todosper = 'S')  ORDER BY (TERC_NIT )
    INTO :nit_tercero, :concept,  :montos, :porcen, :entidad, :numeroprom, :liquidaper ,:CONC_COD, :CONC_DEDUC, :CONC_PORC,
    :CONC_ENTIDAD, :CONC_MONTO, :CONC_DIAS, :CONC_MODIFI,:CONC_PROMEDIO, :salario,:EMCO_PERPROM, :conc_prov, :conc_aporte , :CONC_APLICAPROM, :conc_otroconc, :conc_codotroconc, :gtoempr, :base
    DO
BEGIN
    IF (conc_dias = 'S') THEN
    EXECUTE PROCEDURE DIAS_LABORADOS (:nite, :periodo, :fec) RETURNING_VALUES (:diaslab);
    ELSE
    BEGIN
    IF (liquidaper = 0) THEN
    diaslab = 15;
    ELSE
    IF (liquidaper = 1) THEN
    diaslab = 30;
    ELSE
    IF (liquidaper = 2) THEN
    diaslab = 60;
    END
 SELECT ((n.nono_valor /30) * n.nono_dura), (n.nono_dura) FROM nomina_novedades n WHERE n.tnov_cod = 11 AND n.terc_nit = :nite AND n.nono_periodo = :periodo INTO :cambsaltrans, :duranov;
 IF (cambsaltrans IS NULL) THEN
 cambsaltrans = 0;
 if (duranov is null) then
 duranov = 0;
 diaslab = :diaslab - :duranov;
 if (conc_cod = 921) then
 begin
 if (porcen IS NOT NULL AND porcen <> 0) then
 valor = ((basico / 30)* :diaslab ) * :PORCEN /100;
 ELSE
 if (conc_porc IS NOT null AND conc_porc <> 0) then
 valor = ((:basico / 30)* :diaslab ) * :conc_porc /100;
   EXECUTE PROCEDURE REDONDEE(:valor, 0) RETURNING_VALUES (VALOR);
 end
 ELSE
 if (conc_cod = 922) then
 BEGIN
 SELECT P.prcu_monto FROM prestamo_cuotas P, prestamo_nomina PN WHERE P.prcu_ano = :ano AND P.prcu_periodo = :periodo AND PN.prno_id = P.prno_id AND PN.terc_nit = :nite INTO :valor;
 IF (valor IS NULL) THEN
 valor = 0;
   EXECUTE PROCEDURE REDONDEE(:valor, 0) RETURNING_VALUES (VALOR);
 item = :item + 1;
 update prestamo_cuotas  P SET prcu_ok = 'S' WHERE P.prcu_ano = :ano AND P.prcu_periodo = :periodo AND P.prno_id = (SELECT PN.prno_id FROM PRESTAMO_NOMINA PN WHERE PN.terc_nit = :nite);
 END
 ELSE
 BEGIN
    IF ((:montos = 0) OR (:montos IS NULL)) THEN
      BEGIN
      IF ((CONC_PORC = 0 AND :porcen = 0) OR (CONC_PORC IS NULL AND :porcen = 0) OR (CONC_PORC = 0 AND :porcen IS NULL) OR (CONC_PORC IS NULL AND :porcen IS NULL) ) THEN
        BEGIN
        IF ((conc_monto <> 0) AND (conc_monto IS NOT NULL) ) THEN
        BEGIN
        VALOR = :CONC_MONTO;
          EXECUTE PROCEDURE REDONDEE(:valor, 0) RETURNING_VALUES (VALOR);
        END
        ELSE
        IF (salario = 'S' AND CONC_COD <> 900 AND CONC_COD <> 920) THEN
        BEGIN
        conc_monto = :basico;
        VALOR = (:conc_monto/30 * :diaslab ) + :cambsaltrans;
          EXECUTE PROCEDURE REDONDEE(:valor, 0) RETURNING_VALUES (VALOR);
        END
        ELSE
        valor = montos;
        END
       ELSE
       BEGIN
        IF (:porcen <> 0) THEN
          BEGIN
            IF ((conc_monto <> 0) AND (conc_monto IS NOT NULL) ) THEN
            BEGIN
              VALOR = ((:CONC_MONTO ) * :PORCEN) /100;
                 EXECUTE PROCEDURE REDONDEE(:valor, 0) RETURNING_VALUES (VALOR);
            END
          END
          ELSE
          BEGIN
            IF ((conc_monto <> 0) AND (conc_monto IS NOT NULL) ) THEN
            BEGIN
              VALOR = ((:CONC_MONTO) * :conc_porc) /100;
                 EXECUTE PROCEDURE REDONDEE(:valor, 0) RETURNING_VALUES (VALOR);
            END
            ELSE
        IF (salario = 'S' AND CONC_COD <> 900 AND CONC_COD <> 920) THEN
            BEGIN
              conc_monto = :basico;
              VALOR = ((:CONC_MONTO)+ :cambsaltrans * :conc_porc) /100;
                 EXECUTE PROCEDURE REDONDEE(:valor, 0) RETURNING_VALUES (VALOR);
            END
          END
       END
      END
    ELSE
    BEGIN
      IF ((CONC_PORC = 0 or (conc_porc is null)) AND (:porcen = 0 or (porcen is null))) THEN
      BEGIN
      VALOR = (:montos);
         EXECUTE PROCEDURE REDONDEE(:valor, 0) RETURNING_VALUES (VALOR);
      END
      ELSE
      BEGIN
        IF (:porcen <> 0 and porcen is not null) THEN
          BEGIN
          VALOR = ((:MONTOS ) * :PORCEN) /100;
             EXECUTE PROCEDURE REDONDEE(:valor, 0) RETURNING_VALUES (VALOR);
          END
          ELSE
          BEGIN
          VALOR = ((:montos) * :CONC_PORC) /100;
          END
             EXECUTE PROCEDURE REDONDEE(:valor, 0) RETURNING_VALUES (VALOR);
       END
   END
    IF (conc_promedio = 'S') THEN
    BEGIN
    perinicial = :periodo - (:numeroprom) + 1;
    anoprom = CAST (ano AS INTEGER);
    IF (perinicial <= 0) THEN
    BEGIN
    perinicial = 24 + :PERINICIAL;
    anoprom = CAST(ANO AS INTEGER) - 1;
    END
    SELECT SUM (noco_valor) FROM nomina_conceptos n WHERE n.noco_aplicaprom = 'S' AND N.noco_periodo >= :perinicial - 1 AND N.noco_periodo < :periodo AND N.noco_ano >= :anoprom AND N.noco_ano <= :ano AND terc_nit = :nite INTO :valor;
    valor = (valor / numeroprom);
    SELECT NOCO_VALOR FROM NOMINA_CONCEPTOS WHERE CONC_COD = :conc_cod AND TERC_NIT  = :nite AND NOCO_PAGOOK = 'N' AND NOCO_PERIODO = 0 INTO :saldosini;
    IF (saldosini IS NULL) THEN
    saldosini = 0;
    ELSE
    UPDATE nomina_conceptos N SET noco_pagook = 'S' WHERE n.noco_aplicaprom = 'S' AND N.noco_periodo >= :perinicial - 1 AND N.noco_periodo < :periodo AND N.noco_ano >= :anoprom AND N.noco_ano <= :ano  AND CONC_COD = :conc_cod AND terc_nit = :nite AND NOCO_PERIODO = 0;
    VALOR = :valor + :saldosini;
       EXECUTE PROCEDURE REDONDEE(:valor, 0) RETURNING_VALUES (VALOR);
    UPDATE nomina_conceptos N SET noco_pagook = 'S' WHERE n.noco_aplicaprom = 'S' AND N.noco_periodo >= :perinicial - 1 AND N.noco_periodo < :periodo AND N.noco_ano >= :anoprom AND N.noco_ano <= :ano  AND CONC_COD = :conc_cod AND terc_nit = :nite;
    END
    IF (conc_otroconc = 'S') THEN
    BEGIN
    anosum = CAST(ano AS INTEGER);
    anosum = anosum - 1;
    SELECT SUM (noco_valor) FROM nomina_conceptos n WHERE n.noco_ano = :anosum AND n.conc_cod = :conc_codotroconc AND N.terc_nit = :nite INTO :valor;
    SELECT NOCO_VALOR FROM NOMINA_CONCEPTOS WHERE noco_ano = :anosum AND conc_cod = :conc_codotroconc AND terc_nit = :nite AND NOCO_PERIODO = 0 INTO :saldosini;
    IF (saldosini IS NULL) THEN
    saldosini = 0;
    ELSE
    UPDATE nomina_conceptos SET noco_pagook = 'S' WHERE noco_ano = :anosum AND conc_cod = :conc_codotroconc AND NOCO_PERIODO = 0 AND terc_nit = :nite;
    VALOR = :valor + :saldosini;
    UPDATE nomina_conceptos SET noco_pagook = 'S' WHERE noco_ano = :anosum AND conc_cod = :conc_codotroconc AND terc_nit = :nite;
    END
/*SI EL CONCEPTO ES UN APORTE*/
IF (conc_aporte = 'S') THEN
BEGIN
    IF ((:entidad = '' ) OR (entidad IS NULL)) THEN
    BEGIN
     SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
     IF (comision IS NULL) THEN
     comision = 0;
     valor = :basico + :comision;
    IF ((conc_cod = 904) OR (conc_cod = 905) OR (conc_cod = 906)) THEN
            BEGIN
            entidad = :nitafp;
                IF (conc_cod = 904) THEN
                BEGIN
                SELECT A.paan_afptr FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = (((((:basico /30) * :diaslab ) + :comision)+ :cambsaltrans) * :PORCEN) /100;
                END
                ELSE
                IF ((conc_cod = 905) OR (conc_cod = 906)) THEN
                BEGIN
                SELECT A.paan_afpem FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = (((((:basico /30) * :diaslab ) + :comision)+ :cambsaltrans) * :PORCEN) /100;
                END
                   EXECUTE PROCEDURE REDONDEE(:valor, 0) RETURNING_VALUES (VALOR);
            END
            ELSE
       IF ((conc_cod = 907) OR (conc_cod = 914) OR (conc_cod = 915)) THEN
            BEGIN
            entidad = :niteps;
                IF (conc_cod = 907) THEN
                BEGIN
                SELECT A.paan_epstr FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = (((((:basico )/30 * :diaslab ) + :comision)+ :cambsaltrans) * :PORCEN) /100;
                END
                ELSE
                IF ((conc_cod = 914) OR (conc_cod = 915)) THEN
                BEGIN
                SELECT A.paan_epsem FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = (((((:basico )/30 * :diaslab ) + :comision)+ :cambsaltrans) * :PORCEN) /100;
                END
                   EXECUTE PROCEDURE REDONDEE(:valor, 0) RETURNING_VALUES (VALOR);
            END
            ELSE
       IF ((conc_cod = 910) OR (conc_cod = 911) OR (conc_cod = 916) OR (conc_cod = 917) OR (conc_cod = 918) OR (conc_cod = 919)) THEN
            BEGIN
            entidad = :nitccf;
            SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
            IF (comision IS NULL) THEN
            comision = 0;
                IF ((conc_cod = 910) OR (conc_cod = 911) ) THEN
                BEGIN
                SELECT A.paan_ccf FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = (((((:basico )/30 * :diaslab ) + :comision)+ :cambsaltrans) * :PORCEN) /100;
                   EXECUTE PROCEDURE REDONDEE(:valor, 0) RETURNING_VALUES (VALOR);
                END
                ELSE
                IF ((conc_cod = 916) OR (conc_cod = 917)) THEN
                BEGIN
                SELECT A.paan_icbf FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = (((((:basico )/30 * :diaslab ) + :comision)+ :cambsaltrans) * :PORCEN) /100;
                   EXECUTE PROCEDURE REDONDEE(:valor, 0) RETURNING_VALUES (VALOR);
                END
                ELSE
                IF ((conc_cod = 918) OR (conc_cod = 919)) THEN
                BEGIN
                SELECT A.paan_sena FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = (((((:basico )/30 * :diaslab ) + :comision)+ :cambsaltrans) * :PORCEN) /100;
                   EXECUTE PROCEDURE REDONDEE(:valor, 0) RETURNING_VALUES (VALOR);
                END
            END
            ELSE
        IF ((conc_cod = 912) OR (conc_cod = 913)) THEN
            BEGIN
            entidad = :nitafc;
            SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
            IF (comision IS NULL) THEN
            comision = 0;
                IF ((conc_cod = 912) OR (conc_cod = 913) ) THEN
                BEGIN
                SELECT A.paan_cesemp FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = ((((:basico + :comision)/30 * :diaslab )+ :cambsaltrans) * :PORCEN) /100;
                   EXECUTE PROCEDURE REDONDEE(:valor, 0) RETURNING_VALUES (VALOR);
                END
            END
            ELSE
        BEGIN
        IF (comision IS NULL) THEN
        comision = 0;
        SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
        conc_monto = :basico + :comision;
        IF (conc_porc <> 0 AND conc_porc IS NOT NULL) THEN
        VALOR = (((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans) * :conc_porc) /100;
        ELSE
        IF (:porcen <> 0 AND :porcen IS NOT NULL) THEN
        VALOR = (((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans) * :porcen) /100;
        ELSE
        IF (:montos <> 0 AND :montos IS NOT NULL) THEN
        valor = :montos;
        ELSE
        IF (:conc_monto <> 0 AND :conc_monto IS NOT NULL) THEN
        valor = :conc_monto;
           EXECUTE PROCEDURE REDONDEE(:valor, 0) RETURNING_VALUES (VALOR);
        END
    END
    END
    ELSE
    IF (conc_prov = 'S') THEN
    BEGIN
        conc_monto = :basico;
        IF (conc_porc <> 0 AND conc_porc IS NOT NULL) THEN
        VALOR = (((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans) * :conc_porc) /100;
        ELSE
        IF (porcen <> 0 AND porcen IS NOT NULL) THEN
        VALOR = (((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans) * :porcen) /100;
        ELSE
        IF (montos <> 0 AND montos IS NOT NULL) THEN
        VALOR = :montos;
        ELSE
        IF (conc_monto <> 0 AND conc_monto IS NOT NULL) THEN
        VALOR = :conc_monto;
           EXECUTE PROCEDURE REDONDEE(:valor, 0) RETURNING_VALUES (VALOR);
    END
item = :item + 1;
END
 IF (conc_cod = 920) THEN
 BEGIN
 SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :valor;
 IF (valor IS NULL) THEN
 valor = 0;
 item = :item + 1;
 END
    IF (liquidaper = 0) THEN
    INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
    VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
    ELSE
    IF (liquidaper = 1) THEN
    BEGIN
    rmod = mod(:periodo, 2);
    IF (rmod = 0) THEN
        INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
        VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
    END
    ELSE
    IF (liquidaper = 2) THEN
    BEGIN
    rmod = mod(:periodo, 4);
    IF (rmod = 0) THEN
        INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
        VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
    END
END
END
END
END
ELSE
/*SI ES MENSUAL*/
IF (periodicidad = 1) THEN
BEGIN
EXECUTE PROCEDURE cambie_id_nomina RETURNING_VALUES(:idnomina);
INSERT INTO nomina (nomi_id, NOMI_FECCAUSA, NOMI_PAGOGLOBAL, NOMI_PERIODOCIDAD, NOMI_PERIODO, NOMI_ANO, NOMI_LIQOK)
VALUES (:IDNOMINA, :fec,:pagoglobal, :periodicidad, :periodo, :ano, 'N');
    BEGIN
    item = 1;
    FOR SELECT E.TERC_NIT, E.empl_salario, e.empl_eps, e.empl_afc, e.empl_afp, e.empl_ccf
    FROM EMPLEADOS E
    WHERE E.empl_ppago = 1
    INTO :nite, :basico, :niteps, :nitafc, :nitafp, :nitccf
    DO
    FOR SELECT CE.TERC_NIT, CE.CONC_COD, CE.EMCO_MONTO, CE.EMCO_PORC, ce.empl_entidad, CE.emco_perprom, CE.emco_luquidaper,    CN.CONC_COD, CN.CONC_DEDUC,CN.CONC_PORC, CN.CONC_ENTIDAD, CN.CONC_MONTO,  CN.CONC_DIAS, CN.CONC_MODIFI,
    CN.CONC_PROMEDIO, CN.conc_salario, CE.emco_perprom, CN.conc_prov, CN.conc_aporte, CN.conc_aplicaprom, cn.conc_otroconc, cn.conc_codotroconc, CN.conc_gtoempr
    FROM empleado_conceptos CE, CONCEPTOS_NOMINA CN WHERE ((CE.terc_nit = :nite) AND (CE.CONC_COD = CN.CONC_COD) AND (CN.conc_fecini <= :fec AND CN.conc_fecfin >= :FEC) ) OR ((CE.terc_nit = :nite)
    AND (CE.CONC_COD = CN.CONC_COD) AND (cn.conc_todosper = 'N') AND (CE.emco_ppago = :periodo)) OR  ((CE.terc_nit = :nite) AND (CE.CONC_COD = CN.CONC_COD) AND cn.conc_todosper = 'S')  ORDER BY (TERC_NIT)
    INTO :nit_tercero, :concept,  :montos, :porcen, :entidad, :numeroprom, :liquidaper ,:CONC_COD, :CONC_DEDUC, :CONC_PORC,
    :CONC_ENTIDAD, :CONC_MONTO, :CONC_DIAS, :CONC_MODIFI,:CONC_PROMEDIO, :salario,:EMCO_PERPROM, :conc_prov, :conc_aporte , :CONC_APLICAPROM, :conc_otroconc, :conc_codotroconc, :gtoempr    DO
BEGIN
    IF (conc_dias = 'S') THEN
    EXECUTE PROCEDURE DIAS_LABORADOS (:nite, :periodo, :fec) RETURNING_VALUES (:diaslab);
    ELSE
    diaslab = 30;
 SELECT ((n.nono_valor /30) * n.nono_dura), (n.nono_dura) FROM nomina_novedades n WHERE n.tnov_cod = 11 AND n.terc_nit = :nite AND n.nono_periodo = :periodo INTO :cambsaltrans, :duranov;
 IF (cambsaltrans IS NULL) THEN
 cambsaltrans = 0;
 if (duranov is null) then
 duranov = 0;
 diaslab = :diaslab - :duranov;
 if (conc_cod = 921) then
 begin
 if (porcen IS NOT NULL AND porcen <> 0) then
 valor = ((basico / 30)* :diaslab ) * :PORCEN /100;
 ELSE
 if (conc_porc IS NOT null AND conc_porc <> 0) then
 valor = ((:basico / 30)* :diaslab ) * :conc_porc /100;
   EXECUTE PROCEDURE REDONDEE(:valor, 0) RETURNING_VALUES (VALOR);
 end
 ELSE
 if (conc_cod = 922) then
 BEGIN
 SELECT P.prcu_monto FROM prestamo_cuotas P, prestamo_nomina PN WHERE P.prcu_ano = :ano AND P.prcu_periodo = :periodo AND PN.prno_id = P.prno_id AND PN.terc_nit = :nite INTO :valor;
 IF (valor IS NULL) THEN
 valor = 0;
   EXECUTE PROCEDURE REDONDEE(:valor, 0) RETURNING_VALUES (VALOR);
 item = :item + 1;
 update prestamo_cuotas  P SET prcu_ok = 'S' WHERE P.prcu_ano = :ano AND P.prcu_periodo = :periodo AND P.prno_id = (SELECT PN.prno_id FROM PRESTAMO_NOMINA PN WHERE PN.terc_nit = :nite);
 END
 ELSE
 BEGIN
    IF ((:montos = 0) OR (:montos IS NULL)) THEN
      BEGIN
      IF ((CONC_PORC = 0 AND :porcen = 0) OR (CONC_PORC IS NULL AND :porcen = 0) OR (CONC_PORC = 0 AND :porcen IS NULL) OR (CONC_PORC IS NULL AND :porcen IS NULL) ) THEN
        BEGIN
        IF ((conc_monto <> 0) AND (conc_monto IS NOT NULL) ) THEN
        BEGIN
        VALOR = :CONC_MONTO/30 * :diaslab;
          EXECUTE PROCEDURE REDONDEE(:valor, 0) RETURNING_VALUES (VALOR);
        END
        ELSE
        IF (salario = 'S' AND CONC_COD <> 900 AND CONC_COD <> 920) THEN
        BEGIN
        conc_monto = :basico;
        VALOR = (:conc_monto/30 * :diaslab ) + :cambsaltrans;
          EXECUTE PROCEDURE REDONDEE(:valor, 0) RETURNING_VALUES (VALOR);
        END
        ELSE
        valor = montos;
        END
       ELSE
       BEGIN
        IF (:porcen <> 0) THEN
          BEGIN
            IF ((conc_monto <> 0) AND (conc_monto IS NOT NULL) ) THEN
            BEGIN
              VALOR = ((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans * :PORCEN) /100;
                 EXECUTE PROCEDURE REDONDEE(:valor, 0) RETURNING_VALUES (VALOR);
            END
          END
          ELSE
          BEGIN
            IF ((conc_monto <> 0) AND (conc_monto IS NOT NULL) ) THEN
            BEGIN
              VALOR = ((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans * :conc_porc) /100;
                 EXECUTE PROCEDURE REDONDEE(:valor, 0) RETURNING_VALUES (VALOR);
            END
            ELSE
        IF (salario = 'S' AND CONC_COD <> 900 AND CONC_COD <> 920) THEN
            BEGIN
              conc_monto = :basico;
              VALOR = ((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans * :conc_porc) /100;
                 EXECUTE PROCEDURE REDONDEE(:valor, 0) RETURNING_VALUES (VALOR);
            END
          END
       END
      END
    ELSE
    BEGIN
      IF (CONC_PORC = 0 AND :porcen = 0) THEN
      BEGIN
      VALOR = (:montos/30 * :diaslab);
         EXECUTE PROCEDURE REDONDEE(:valor, 0) RETURNING_VALUES (VALOR);
      END
      ELSE
      BEGIN
        IF (:porcen <> 0) THEN
          BEGIN
          VALOR = ((:MONTOS/30 * :diaslab )+ :cambsaltrans * :PORCEN) /100;
             EXECUTE PROCEDURE REDONDEE(:valor, 0) RETURNING_VALUES (VALOR);
          END
          ELSE
          BEGIN
          VALOR = ((:montos/30 * :diaslab )+ :cambsaltrans * :CONC_PORC) /100;
          END
             EXECUTE PROCEDURE REDONDEE(:valor, 0) RETURNING_VALUES (VALOR);
       END
   END
    IF (conc_promedio = 'S') THEN
    BEGIN
    perinicial = :periodo - (:numeroprom) + 1;
    anoprom = CAST (ano AS INTEGER);
    IF (perinicial <= 0) THEN
    BEGIN
    perinicial = 24 + :PERINICIAL;
    anoprom = CAST(ANO AS INTEGER) - 1;
    END
    SELECT SUM (noco_valor) FROM nomina_conceptos n WHERE n.noco_aplicaprom = 'S' AND N.noco_periodo >= :perinicial - 1 AND N.noco_periodo < :periodo AND N.noco_ano >= :anoprom AND N.noco_ano <= :ano AND terc_nit = :nite INTO :valor;
    valor = (valor / numeroprom)/*/ 30 * :diaslab*/;
    SELECT NOCO_VALOR FROM NOMINA_CONCEPTOS WHERE CONC_COD = :conc_cod AND TERC_NIT  = :nite AND NOCO_PAGOOK = 'N' AND NOCO_PERIODO = 0 INTO :saldosini;
    IF (saldosini IS NULL) THEN
    saldosini = 0;
    ELSE
    UPDATE nomina_conceptos N SET noco_pagook = 'S' WHERE n.noco_aplicaprom = 'S' AND N.noco_periodo >= :perinicial - 1 AND N.noco_periodo < :periodo AND N.noco_ano >= :anoprom AND N.noco_ano <= :ano  AND CONC_COD = :conc_cod AND terc_nit = :nite AND NOCO_PERIODO = 0;
    VALOR = :valor + :saldosini;
       EXECUTE PROCEDURE REDONDEE(:valor, 0) RETURNING_VALUES (VALOR);
    UPDATE nomina_conceptos N SET noco_pagook = 'S' WHERE n.noco_aplicaprom = 'S' AND N.noco_periodo >= :perinicial - 1 AND N.noco_periodo < :periodo AND N.noco_ano >= :anoprom AND N.noco_ano <= :ano  AND CONC_COD = :conc_cod AND terc_nit = :nite;
    END
    IF (conc_otroconc = 'S') THEN
    BEGIN
    anosum = CAST(ano AS INTEGER);
    anosum = anosum - 1;
    SELECT SUM (noco_valor) FROM nomina_conceptos n WHERE n.noco_ano = :anosum AND n.conc_cod = :conc_codotroconc AND N.terc_nit = :nite INTO :valor;
    SELECT NOCO_VALOR FROM NOMINA_CONCEPTOS WHERE noco_ano = :anosum AND conc_cod = :conc_codotroconc AND terc_nit = :nite AND NOCO_PERIODO = 0 INTO :saldosini;
    IF (saldosini IS NULL) THEN
    saldosini = 0;
    ELSE
    UPDATE nomina_conceptos SET noco_pagook = 'S' WHERE noco_ano = :anosum AND conc_cod = :conc_codotroconc AND NOCO_PERIODO = 0 AND terc_nit = :nite;
    VALOR = :valor + :saldosini;
    UPDATE nomina_conceptos SET noco_pagook = 'S' WHERE noco_ano = :anosum AND conc_cod = :conc_codotroconc AND terc_nit = :nite;
    END
/*SI EL CONCEPTO ES UN APORTE*/
IF (conc_aporte = 'S') THEN
BEGIN
    IF ((:entidad = '' ) OR (entidad IS NULL)) THEN
    BEGIN
     SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
     IF (comision IS NULL) THEN
     comision = 0;
     valor = :basico + :comision;
    IF ((conc_cod = 904) OR (conc_cod = 905) OR (conc_cod = 906)) THEN
            BEGIN
            entidad = :nitafp;
                IF (conc_cod = 904) THEN
                BEGIN
                SELECT A.paan_afptr FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = (((((:basico /30) * :diaslab ) + :comision)+ :cambsaltrans) * :PORCEN) /100;
                END
                ELSE
                IF ((conc_cod = 905) OR (conc_cod = 906)) THEN
                BEGIN
                SELECT A.paan_afpem FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = (((((:basico /30) * :diaslab ) + :comision)+ :cambsaltrans) * :PORCEN) /100;
                END
                   EXECUTE PROCEDURE REDONDEE(:valor, 0) RETURNING_VALUES (VALOR);
            END
            ELSE
       IF ((conc_cod = 907) OR (conc_cod = 914) OR (conc_cod = 915)) THEN
            BEGIN
            entidad = :niteps;
                IF (conc_cod = 907) THEN
                BEGIN
                SELECT A.paan_epstr FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = (((((:basico )/30 * :diaslab ) + :comision)+ :cambsaltrans) * :PORCEN) /100;
                END
                ELSE
                IF ((conc_cod = 914) OR (conc_cod = 915)) THEN
                BEGIN
                SELECT A.paan_epsem FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = (((((:basico )/30 * :diaslab ) + :comision)+ :cambsaltrans) * :PORCEN) /100;
                END
                   EXECUTE PROCEDURE REDONDEE(:valor, 0) RETURNING_VALUES (VALOR);
            END
            ELSE
       IF ((conc_cod = 910) OR (conc_cod = 911) OR (conc_cod = 916) OR (conc_cod = 917) OR (conc_cod = 918) OR (conc_cod = 919)) THEN
            BEGIN
            entidad = :nitccf;
            SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
            IF (comision IS NULL) THEN
            comision = 0;
                IF ((conc_cod = 910) OR (conc_cod = 911) ) THEN
                BEGIN
                SELECT A.paan_ccf FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = (((((:basico )/30 * :diaslab ) + :comision)+ :cambsaltrans) * :PORCEN) /100;
                   EXECUTE PROCEDURE REDONDEE(:valor, 0) RETURNING_VALUES (VALOR);
                END
                ELSE
                IF ((conc_cod = 916) OR (conc_cod = 917)) THEN
                BEGIN
                SELECT A.paan_icbf FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = (((((:basico )/30 * :diaslab ) + :comision)+ :cambsaltrans) * :PORCEN) /100;
                   EXECUTE PROCEDURE REDONDEE(:valor, 0) RETURNING_VALUES (VALOR);
                END
                ELSE
                IF ((conc_cod = 918) OR (conc_cod = 919)) THEN
                BEGIN
                SELECT A.paan_sena FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = (((((:basico )/30 * :diaslab ) + :comision)+ :cambsaltrans) * :PORCEN) /100;
                   EXECUTE PROCEDURE REDONDEE(:valor, 0) RETURNING_VALUES (VALOR);
                END
            END
            ELSE
        IF ((conc_cod = 912) OR (conc_cod = 913)) THEN
            BEGIN
            entidad = :nitafc;
            SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
            IF (comision IS NULL) THEN
            comision = 0;
                IF ((conc_cod = 912) OR (conc_cod = 913) ) THEN
                BEGIN
                SELECT A.paan_cesemp FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = ((((:basico + :comision)/30 * :diaslab )+ :cambsaltrans) * :PORCEN) /100;
                   EXECUTE PROCEDURE REDONDEE(:valor, 0) RETURNING_VALUES (VALOR);
                END
            END
            ELSE
        BEGIN
        IF (comision IS NULL) THEN
        comision = 0;
        SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
        conc_monto = :basico + :comision;
        IF (conc_porc <> 0 AND conc_porc IS NOT NULL) THEN
        VALOR = (((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans) * :conc_porc) /100;
        ELSE
        IF (:porcen <> 0 AND :porcen IS NOT NULL) THEN
        VALOR = (((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans) * :porcen) /100;
        ELSE
        IF (:montos <> 0 AND :montos IS NOT NULL) THEN
        valor = :montos;
        ELSE
        IF (:conc_monto <> 0 AND :conc_monto IS NOT NULL) THEN
        valor = :conc_monto;
           EXECUTE PROCEDURE REDONDEE(:valor, 0) RETURNING_VALUES (VALOR);
        END
    END
    END
    ELSE
    IF (conc_prov = 'S') THEN
    BEGIN
        conc_monto = :basico;
        IF (conc_porc <> 0 AND conc_porc IS NOT NULL) THEN
        VALOR = (((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans) * :conc_porc) /100;
        ELSE
        IF (porcen <> 0 AND porcen IS NOT NULL) THEN
        VALOR = (((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans) * :porcen) /100;
        ELSE
        IF (montos <> 0 AND montos IS NOT NULL) THEN
        VALOR = :montos;
        ELSE
        IF (conc_monto <> 0 AND conc_monto IS NOT NULL) THEN
        VALOR = :conc_monto;
           EXECUTE PROCEDURE REDONDEE(:valor, 0) RETURNING_VALUES (VALOR);
    END
item = :item + 1;
END
IF (conc_cod = 920) THEN
 BEGIN
 SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :valor;
 IF (valor IS NULL) THEN
 valor = 0;
 item = :item + 1;
 END
    IF (liquidaper = 0) THEN
    INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
    VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
    ELSE
    IF (liquidaper = 1) THEN
    BEGIN
    rmod = mod(:periodo, 2);
    IF (rmod = 0) THEN
        INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
        VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
    END
    ELSE
    IF (liquidaper = 2) THEN
    BEGIN
    rmod = mod(:periodo, 4);
    IF (rmod = 0) THEN
        INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
        VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
    END
END
END
END
ELSE
/*SI ES SEMANAL*/
IF (periodicidad = 3) THEN
BEGIN
EXECUTE PROCEDURE cambie_id_nomina RETURNING_VALUES(:idnomina);
INSERT INTO nomina (nomi_id, NOMI_FECCAUSA, NOMI_PAGOGLOBAL, NOMI_PERIODOCIDAD, NOMI_PERIODO, NOMI_ANO, NOMI_LIQOK)
VALUES (:IDNOMINA, :fec,:pagoglobal, :periodicidad, :periodo, :ano, 'N');
    BEGIN
    item = 1;
    FOR SELECT E.TERC_NIT, E.empl_salario, e.empl_eps, e.empl_afc, e.empl_afp, e.empl_ccf
    FROM EMPLEADOS E
    WHERE E.empl_ppago = 3
    INTO :nite, :basico, :niteps, :nitafc, :nitafp, :nitccf
    DO
    BEGIN
    FOR SELECT CE.TERC_NIT, CE.CONC_COD, CE.EMCO_MONTO, CE.EMCO_PORC, ce.empl_entidad, CE.emco_perprom, CE.emco_luquidaper,    CN.CONC_COD, CN.CONC_DEDUC,CN.CONC_PORC, CN.CONC_ENTIDAD, CN.CONC_MONTO,  CN.CONC_DIAS, CN.CONC_MODIFI,
    CN.CONC_PROMEDIO, CN.conc_salario, CE.emco_perprom, CN.conc_prov, CN.conc_aporte, CN.conc_aplicaprom, cn.conc_otroconc, cn.conc_codotroconc, CN.conc_gtoempr
    FROM empleado_conceptos CE, CONCEPTOS_NOMINA CN WHERE ((CE.terc_nit = :nite) AND (CE.CONC_COD = CN.CONC_COD) AND (CN.conc_fecini <= :fec AND CN.conc_fecfin >= :FEC) ) OR ((CE.terc_nit = :nite)
    AND (CE.CONC_COD = CN.CONC_COD) AND (cn.conc_todosper = 'N') AND (CE.emco_ppago = :periodo)) OR  ((CE.terc_nit = :nite) AND (CE.CONC_COD = CN.CONC_COD) AND cn.conc_todosper = 'S')  ORDER BY (TERC_NIT)
    INTO :nit_tercero, :concept,  :montos, :porcen, :entidad, :numeroprom, :liquidaper ,:CONC_COD, :CONC_DEDUC, :CONC_PORC,
    :CONC_ENTIDAD, :CONC_MONTO, :CONC_DIAS, :CONC_MODIFI,:CONC_PROMEDIO, :salario,:EMCO_PERPROM, :conc_prov, :conc_aporte , :CONC_APLICAPROM, :conc_otroconc, :conc_codotroconc, :gtoempr
    DO
BEGIN
    IF (conc_dias = 'S') THEN
    EXECUTE PROCEDURE DIAS_LABORADOS (:nite, :periodo, :fec) RETURNING_VALUES (:diaslab);
    ELSE
    BEGIN
    IF (liquidaper = 0) THEN
    diaslab = 7;
    ELSE
    IF (liquidaper = 1) THEN
    diaslab = 15;
    ELSE
    IF (liquidaper = 2) THEN
    diaslab = 30;
    END
 SELECT ((n.nono_valor /30) * n.nono_dura), (n.nono_dura) FROM nomina_novedades n WHERE n.tnov_cod = 11 AND n.terc_nit = :nite AND n.nono_periodo = :periodo INTO :cambsaltrans, :duranov;
 IF (cambsaltrans IS NULL) THEN
 cambsaltrans = 0;
 if (duranov is null) then
 duranov = 0;
 diaslab = :diaslab - :duranov;
 IF (conc_cod = 920) THEN
 BEGIN
 SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :valor;
 IF (valor IS NULL) THEN
 valor = 0;
 item = :item + 1;
 END
 ELSE
 if (conc_cod = 921) then
 begin
 if (porcen IS NOT NULL AND porcen <> 0) then
 valor = ((basico / 30)* :diaslab ) * :PORCEN /100;
 ELSE
 if (conc_porc IS NOT null AND conc_porc <> 0) then
 valor = ((:basico / 30)* :diaslab ) * :conc_porc /100;
   EXECUTE PROCEDURE REDONDEE(:valor, 0) RETURNING_VALUES (VALOR);
 end
 ELSE
 if (conc_cod = 922) then
 BEGIN
 SELECT P.prcu_monto FROM prestamo_cuotas P, prestamo_nomina PN WHERE P.prcu_ano = :ano AND P.prcu_periodo = :periodo AND PN.prno_id = P.prno_id AND PN.terc_nit = :nite INTO :valor;
 IF (valor IS NULL) THEN
 valor = 0;
   EXECUTE PROCEDURE REDONDEE(:valor, 0) RETURNING_VALUES (VALOR);
 item = :item + 1;
 update prestamo_cuotas  P SET prcu_ok = 'S' WHERE P.prcu_ano = :ano AND P.prcu_periodo = :periodo AND P.prno_id = (SELECT PN.prno_id FROM PRESTAMO_NOMINA PN WHERE PN.terc_nit = :nite);
 END
 ELSE
 BEGIN
    IF ((:montos = 0) OR (:montos IS NULL)) THEN
      BEGIN
      IF ((CONC_PORC = 0 AND :porcen = 0) OR (CONC_PORC IS NULL AND :porcen = 0) OR (CONC_PORC = 0 AND :porcen IS NULL) OR (CONC_PORC IS NULL AND :porcen IS NULL) ) THEN
        BEGIN
        IF ((conc_monto <> 0) AND (conc_monto IS NOT NULL) ) THEN
        BEGIN
        VALOR = :CONC_MONTO/30 * :diaslab;
          EXECUTE PROCEDURE REDONDEE(:valor, 0) RETURNING_VALUES (VALOR);
        END
        ELSE
        IF (salario = 'S' AND CONC_COD <> 900 AND CONC_COD <> 920) THEN
        BEGIN
        conc_monto = :basico;
        VALOR = (:conc_monto/30 * :diaslab ) + :cambsaltrans;
          EXECUTE PROCEDURE REDONDEE(:valor, 0) RETURNING_VALUES (VALOR);
        END
        ELSE
        valor = montos;
        END
       ELSE
       BEGIN
        IF (:porcen <> 0) THEN
          BEGIN
            IF ((conc_monto <> 0) AND (conc_monto IS NOT NULL) ) THEN
            BEGIN
              VALOR = ((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans * :PORCEN) /100;
                 EXECUTE PROCEDURE REDONDEE(:valor, 0) RETURNING_VALUES (VALOR);
            END
          END
          ELSE
          BEGIN
            IF ((conc_monto <> 0) AND (conc_monto IS NOT NULL) ) THEN
            BEGIN
              VALOR = ((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans * :conc_porc) /100;
                 EXECUTE PROCEDURE REDONDEE(:valor, 0) RETURNING_VALUES (VALOR);
            END
            ELSE
        IF (salario = 'S' AND CONC_COD <> 900 AND CONC_COD <> 920) THEN
            BEGIN
              conc_monto = :basico;
              VALOR = ((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans * :conc_porc) /100;
                 EXECUTE PROCEDURE REDONDEE(:valor, 0) RETURNING_VALUES (VALOR);
            END
          END
       END
      END
    ELSE
    BEGIN
      IF (CONC_PORC = 0 AND :porcen = 0) THEN
      BEGIN
      VALOR = (:montos/30 * :diaslab);
         EXECUTE PROCEDURE REDONDEE(:valor, 0) RETURNING_VALUES (VALOR);
      END
      ELSE
      BEGIN
        IF (:porcen <> 0) THEN
          BEGIN
          VALOR = ((:MONTOS/30 * :diaslab )+ :cambsaltrans * :PORCEN) /100;
             EXECUTE PROCEDURE REDONDEE(:valor, 0) RETURNING_VALUES (VALOR);
          END
          ELSE
          BEGIN
          VALOR = ((:montos/30 * :diaslab )+ :cambsaltrans * :CONC_PORC) /100;
          END
             EXECUTE PROCEDURE REDONDEE(:valor, 0) RETURNING_VALUES (VALOR);
       END
   END
    IF (conc_promedio = 'S') THEN
    BEGIN
    perinicial = :periodo - (:numeroprom) + 1;
    anoprom = CAST (ano AS INTEGER);
    IF (perinicial <= 0) THEN
    BEGIN
    perinicial = 24 + :PERINICIAL;
    anoprom = CAST(ANO AS INTEGER) - 1;
    END
    SELECT SUM (noco_valor) FROM nomina_conceptos n WHERE n.noco_aplicaprom = 'S' AND N.noco_periodo >= :perinicial - 1 AND N.noco_periodo < :periodo AND N.noco_ano >= :anoprom AND N.noco_ano <= :ano AND terc_nit = :nite INTO :valor;
    valor = (valor / numeroprom)/*/ 30 * :diaslab*/;
    SELECT NOCO_VALOR FROM NOMINA_CONCEPTOS WHERE CONC_COD = :conc_cod AND TERC_NIT  = :nite AND NOCO_PAGOOK = 'N' AND NOCO_PERIODO = 0 INTO :saldosini;
    IF (saldosini IS NULL) THEN
    saldosini = 0;
    ELSE
    UPDATE nomina_conceptos N SET noco_pagook = 'S' WHERE n.noco_aplicaprom = 'S' AND N.noco_periodo >= :perinicial - 1 AND N.noco_periodo < :periodo AND N.noco_ano >= :anoprom AND N.noco_ano <= :ano  AND CONC_COD = :conc_cod AND terc_nit = :nite AND NOCO_PERIODO = 0;
    VALOR = :valor + :saldosini;
       EXECUTE PROCEDURE REDONDEE(:valor, 0) RETURNING_VALUES (VALOR);
    UPDATE nomina_conceptos N SET noco_pagook = 'S' WHERE n.noco_aplicaprom = 'S' AND N.noco_periodo >= :perinicial - 1 AND N.noco_periodo < :periodo AND N.noco_ano >= :anoprom AND N.noco_ano <= :ano  AND CONC_COD = :conc_cod AND terc_nit = :nite;
    END
    IF (conc_otroconc = 'S') THEN
    BEGIN
    anosum = CAST(ano AS INTEGER);
    anosum = anosum - 1;
    SELECT SUM (noco_valor) FROM nomina_conceptos n WHERE n.noco_ano = :anosum AND n.conc_cod = :conc_codotroconc AND N.terc_nit = :nite INTO :valor;
    SELECT NOCO_VALOR FROM NOMINA_CONCEPTOS WHERE noco_ano = :anosum AND conc_cod = :conc_codotroconc AND terc_nit = :nite AND NOCO_PERIODO = 0 INTO :saldosini;
    IF (saldosini IS NULL) THEN
    saldosini = 0;
    ELSE
    UPDATE nomina_conceptos SET noco_pagook = 'S' WHERE noco_ano = :anosum AND conc_cod = :conc_codotroconc AND NOCO_PERIODO = 0 AND terc_nit = :nite;
    VALOR = :valor + :saldosini;
    UPDATE nomina_conceptos SET noco_pagook = 'S' WHERE noco_ano = :anosum AND conc_cod = :conc_codotroconc AND terc_nit = :nite;
    END
/*SI EL CONCEPTO ES UN APORTE*/
IF (conc_aporte = 'S') THEN
BEGIN
    IF ((:entidad = '' ) OR (entidad IS NULL)) THEN
    BEGIN
     SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
     IF (comision IS NULL) THEN
     comision = 0;
     valor = :basico + :comision;
    IF ((conc_cod = 904) OR (conc_cod = 905) OR (conc_cod = 906)) THEN
            BEGIN
            entidad = :nitafp;
                IF (conc_cod = 904) THEN
                BEGIN
                SELECT A.paan_afptr FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = (((((:basico /30) * :diaslab ) + :comision)+ :cambsaltrans) * :PORCEN) /100;
                END
                ELSE
                IF ((conc_cod = 905) OR (conc_cod = 906)) THEN
                BEGIN
                SELECT A.paan_afpem FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = (((((:basico /30) * :diaslab ) + :comision)+ :cambsaltrans) * :PORCEN) /100;
                END
                   EXECUTE PROCEDURE REDONDEE(:valor, 0) RETURNING_VALUES (VALOR);
            END
            ELSE
       IF ((conc_cod = 907) OR (conc_cod = 914) OR (conc_cod = 915)) THEN
            BEGIN
            entidad = :niteps;
                IF (conc_cod = 907) THEN
                BEGIN
                SELECT A.paan_epstr FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = (((((:basico )/30 * :diaslab ) + :comision)+ :cambsaltrans) * :PORCEN) /100;
                END
                ELSE
                IF ((conc_cod = 914) OR (conc_cod = 915)) THEN
                BEGIN
                SELECT A.paan_epsem FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = (((((:basico )/30 * :diaslab ) + :comision)+ :cambsaltrans) * :PORCEN) /100;
                END
                   EXECUTE PROCEDURE REDONDEE(:valor, 0) RETURNING_VALUES (VALOR);
            END
            ELSE
       IF ((conc_cod = 910) OR (conc_cod = 911) OR (conc_cod = 916) OR (conc_cod = 917) OR (conc_cod = 918) OR (conc_cod = 919)) THEN
            BEGIN
            entidad = :nitccf;
            SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
            IF (comision IS NULL) THEN
            comision = 0;
                IF ((conc_cod = 910) OR (conc_cod = 911) ) THEN
                BEGIN
                SELECT A.paan_ccf FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = (((((:basico )/30 * :diaslab ) + :comision)+ :cambsaltrans) * :PORCEN) /100;
                   EXECUTE PROCEDURE REDONDEE(:valor, 0) RETURNING_VALUES (VALOR);
                END
                ELSE
                IF ((conc_cod = 916) OR (conc_cod = 917)) THEN
                BEGIN
                SELECT A.paan_icbf FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = (((((:basico )/30 * :diaslab ) + :comision)+ :cambsaltrans) * :PORCEN) /100;
                   EXECUTE PROCEDURE REDONDEE(:valor, 0) RETURNING_VALUES (VALOR);
                END
                ELSE
                IF ((conc_cod = 918) OR (conc_cod = 919)) THEN
                BEGIN
                SELECT A.paan_sena FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = (((((:basico )/30 * :diaslab ) + :comision)+ :cambsaltrans) * :PORCEN) /100;
                   EXECUTE PROCEDURE REDONDEE(:valor, 0) RETURNING_VALUES (VALOR);
                END
            END
            ELSE
        IF ((conc_cod = 912) OR (conc_cod = 913)) THEN
            BEGIN
            entidad = :nitafc;
            SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
            IF (comision IS NULL) THEN
            comision = 0;
                IF ((conc_cod = 912) OR (conc_cod = 913) ) THEN
                BEGIN
                SELECT A.paan_cesemp FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = ((((:basico + :comision)/30 * :diaslab )+ :cambsaltrans) * :PORCEN) /100;
                   EXECUTE PROCEDURE REDONDEE(:valor, 0) RETURNING_VALUES (VALOR);
                END
            END
            ELSE
        BEGIN
        IF (comision IS NULL) THEN
        comision = 0;
        SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
        conc_monto = :basico + :comision;
        IF (conc_porc <> 0 AND conc_porc IS NOT NULL) THEN
        VALOR = (((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans) * :conc_porc) /100;
        ELSE
        IF (:porcen <> 0 AND :porcen IS NOT NULL) THEN
        VALOR = (((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans) * :porcen) /100;
        ELSE
        IF (:montos <> 0 AND :montos IS NOT NULL) THEN
        valor = :montos;
        ELSE
        IF (:conc_monto <> 0 AND :conc_monto IS NOT NULL) THEN
        valor = :conc_monto;
           EXECUTE PROCEDURE REDONDEE(:valor, 0) RETURNING_VALUES (VALOR);
        END
    END
    END
    ELSE
    IF (conc_prov = 'S') THEN
    BEGIN
        conc_monto = :basico;
        IF (conc_porc <> 0 AND conc_porc IS NOT NULL) THEN
        VALOR = (((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans) * :conc_porc) /100;
        ELSE
        IF (porcen <> 0 AND porcen IS NOT NULL) THEN
        VALOR = (((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans) * :porcen) /100;
        ELSE
        IF (montos <> 0 AND montos IS NOT NULL) THEN
        VALOR = :montos;
        ELSE
        IF (conc_monto <> 0 AND conc_monto IS NOT NULL) THEN
        VALOR = :conc_monto;
           EXECUTE PROCEDURE REDONDEE(:valor, 0) RETURNING_VALUES (VALOR);
    END
item = :item + 1;
END
    IF (liquidaper = 0) THEN
    INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
    VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
    ELSE
    IF (liquidaper = 1) THEN
    BEGIN
    rmod = mod(:periodo, 2);
    IF (rmod = 0) THEN
        INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
        VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
    END
    ELSE
    IF (liquidaper = 2) THEN
    BEGIN
    rmod = mod(:periodo, 4);
    IF (rmod = 0) THEN
        INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
        VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
    END
END
END
END
END
SUSPEND;
END
^

SET TERM ; ^


SET TERM ^ ;

CREATE trigger nomina_detalle_ai0 for nomina_detalle
active after insert position 0
AS
begin
EXECUTE PROCEDURE liquida_horas_extra (NEW.terc_nit,NEW.nomi_id,NEW.node_horasdi,NEW.node_horasno,NEW.node_horasfd,NEW.node_horasfn, NEW.node_ano);
end
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE IMPR_PLANILLA_NOMINA (
    id INTEGER,
    pago CHAR(1),
    cta CHAR(1))
RETURNS (
    fecha DATE,
    observaciones BLOB SUB_TYPE 0 SEGMENT SIZE 80,
    pagoglobal CHAR(1),
    periodo INTEGER,
    ano CHAR(4),
    periodicidad VARCHAR(60),
    nitempl VARCHAR(20),
    valor NUMERIC(18,2),
    deduc CHAR(1),
    nombreempl VARCHAR(60),
    nomcortconc VARCHAR(60),
    nombreconc VARCHAR(60),
    codconc INTEGER,
    prov CHAR(1),
    totalempl NUMERIC(18,2),
    totaldeduc NUMERIC(18,2),
    totaldeveng NUMERIC(18,2),
    numempl INTEGER,
    ctaempl VARCHAR(25),
    totalctas NUMERIC(18,2))
AS
DECLARE VARIABLE NITANT VARCHAR(20);
DECLARE VARIABLE nitnue VARCHAR(20);
DECLARE VARIABLE NUMCONC INTEGER;
BEGIN
numempl = 0;
nitant = 0;
nitnue = 0;
IF (PAGO = 'N') THEN
BEGIN
FOR SELECT N.nomi_feccausa, N.nomi_obs, N.nomi_pagoglobal, N.nomi_periodo, N.nomi_ano, P.ppag_nombre FROM NOMINA N, periodo_pago P
 WHERE P.ppag_cod = N.nomi_periodocidad AND N.nomi_id = :ID
 INTO :fecha, :observaciones, :pagoglobal, :periodo, :ano, :periodicidad
 DO
 BEGIN
 FOR SELECT NC.terc_nit, NC.noco_valor, NC.noco_deduc, T.terc_nom, C.conc_nomcorto, C.conc_nombre, NC.conc_cod, NC.noco_prov FROM NOMINA_CONCEPTOS NC, TERCEROS T, EMPLEADOS E, CONCEPTOS_NOMINA C
        WHERE NC.nomi_id = :ID AND T.terc_nit = E.terc_nit AND C.conc_cod = NC.conc_cod AND t.terc_nit = nc.terc_nit
      INTO :nitempl, :valor, :deduc, :nombreempl, :nomcortconc, :nombreconc, :codconc, :prov
 DO
 BEGIN
 IF (valor IS NULL) THEN
 valor = 0;
 SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND TERC_NIT = :nitempl INTO :totalempl;
 SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND TERC_NIT = :nitempl AND NC.noco_deduc = 'S' INTO :totaldeduc;
 SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND TERC_NIT = :nitempl AND NC.noco_deduc = 'N' INTO :totaldeveng;
  SUSPEND;
 END
 END
END
ELSE
IF (PAGO = 'S') THEN
BEGIN
FOR SELECT N.nomi_feccausa, N.nomi_obs, N.nomi_pagoglobal, N.nomi_periodo, N.nomi_ano, P.ppag_nombre FROM NOMINA N, periodo_pago P
 WHERE P.ppag_cod = N.nomi_periodocidad AND N.nomi_id = :ID
 INTO :fecha, :observaciones, :pagoglobal, :periodo, :ano, :periodicidad
 DO
 BEGIN
 FOR SELECT NC.terc_nit, NC.noco_valor, NC.noco_deduc, T.terc_nom, C.conc_nomcorto, C.conc_nombre, NC.conc_cod, NC.noco_prov FROM NOMINA_CONCEPTOS NC, TERCEROS T, EMPLEADOS E, CONCEPTOS_NOMINA C
        WHERE NC.nomi_id = :ID AND T.terc_nit = E.terc_nit AND C.conc_cod = NC.conc_cod AND t.terc_nit = nc.terc_nit AND NC.noco_prov = 'N' AND NC.noco_gtoempr = 'N'
      INTO :nitempl, :valor, :deduc, :nombreempl, :nomcortconc, :nombreconc, :codconc, :prov
 DO
 BEGIN
 IF (valor IS NULL) THEN
 valor = 0;
 SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND TERC_NIT = :nitempl INTO :totalempl;
 SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND TERC_NIT = :nitempl AND NC.noco_deduc = 'S' INTO :totaldeduc;
 SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND TERC_NIT = :nitempl AND NC.noco_deduc = 'N' INTO :totaldeveng;
 IF (cta = 'S') THEN
 BEGIN
 SELECT COUNT(CONC_COD) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND TERC_NIT = :nitempl INTO :numconc;
 totalempl = totalempl / :numconc;
 SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND TERC_NIT = :nitempl INTO :totalctas;
 END
 SELECT TERC_NIT, EMPL_CUENTA FROM EMPLEADOS WHERE TERC_NIT = :nitempl INTO :nitnue, :ctaempl;
 IF (nitnue IS NOT NULL) THEN
 BEGIN
 IF (nitnue <> nitant) THEN
 numempl = :numempl + 1;
 nitant = :nitnue;
 END
  SUSPEND;
 END
 END
END
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE LIQUIDACION_EMPLEADO (
    nitempl varchar(20),
    fecliq date,
    diaslaborados integer)
returns (
    prima numeric(18,2),
    cesantia numeric(18,2),
    intcesant numeric(18,2),
    vacacion numeric(18,2),
    sueldo numeric(18,2),
    auxtransp numeric(18,2),
    epsempl numeric(18,2),
    afpempl numeric(18,2),
    dsprestamo numeric(18,2),
    empreps numeric(18,2),
    emprafp numeric(18,2),
    emprarp numeric(18,2),
    emprccf numeric(18,2),
    emprsena numeric(18,2),
    empricbf numeric(18,2),
    totpagos numeric(18,2),
    totdesc numeric(18,2),
    total numeric(18,2),
    totempr numeric(18,2))
as
declare variable salario numeric(18,2);
declare variable porcepsempl numeric(9,4);
declare variable porcafpempl numeric(9,4);
declare variable auxt numeric(18,2);
declare variable pempreps numeric(9,4);
declare variable pemprafp numeric(9,4);
declare variable pemprarp numeric(9,4);
declare variable pemprccf numeric(9,4);
declare variable pemprsena numeric(9,4);
declare variable pempricbf numeric(9,4);
BEGIN
SELECT E.empl_salario FROM EMPLEADOS E WHERE TERC_NIT = :nitempl INTO :salario;
sueldo = (:salario / 30) * :diaslaborados;
EXECUTE PROCEDURE REDONDEE(:SUELDO, -2) RETURNING_VALUES (:sueldo);

SELECT SUM (NOCO_VALOR) FROM NOMINA_CONCEPTOS WHERE TERC_NIT = :nitempl AND (CONC_COD = 15 OR CONC_COD = 16 OR CONC_COD = 21 OR CONC_COD = 22) AND NOCO_PAGOOK = 'N' INTO :prima;
IF (prima IS NULL) THEN
prima = 0;
prima = :prima + ((:salario / 12)/ 30) * :diaslaborados;
EXECUTE PROCEDURE REDONDEE(:prima, -1) RETURNING_VALUES (:prima);

SELECT SUM (NOCO_VALOR) FROM NOMINA_CONCEPTOS WHERE TERC_NIT = :nitempl AND (CONC_COD = 912 OR CONC_COD = 913) AND NOCO_PAGOOK = 'N' INTO :cesantia;
IF (cesantia IS NULL) THEN
cesantia = 0;
cesantia = :cesantia + ((:salario / 12)/ 30) * :diaslaborados;
EXECUTE PROCEDURE REDONDEE(:cesantia, -2) RETURNING_VALUES (:cesantia);

SELECT SUM (NOCO_VALOR) FROM NOMINA_CONCEPTOS WHERE TERC_NIT = :nitempl AND (CONC_COD = 3 OR CONC_COD = 19) AND NOCO_PAGOOK = 'N' INTO :intcesant;
IF (intcesant IS NULL) THEN
intcesant = 0;
intcesant = ((((:salario / 12)/ 30) * :diaslaborados)*1/ 100)+ :intcesant;
EXECUTE PROCEDURE REDONDEE(:intcesant, -2) RETURNING_VALUES (:intcesant);

SELECT SUM (NOCO_VALOR) FROM NOMINA_CONCEPTOS WHERE TERC_NIT = :nitempl AND (CONC_COD = 14 OR CONC_COD = 20) AND NOCO_PAGOOK = 'N' INTO :vacacion;
IF (vacacion IS NULL) THEN
vacacion = 0;
vacacion = :vacacion + ((:salario / 12)/ 30) * :diaslaborados;
EXECUTE PROCEDURE REDONDEE(:vacacion, -2) RETURNING_VALUES (:vacacion);

SELECT P.paan_epstr FROM PARAMETROS_ANO P WHERE P.paan_ano = SUBSTR(:fecliq, 1,4) INTO :porcepsempl;
epsempl = (sueldo * :porcepsempl) / 100;
EXECUTE PROCEDURE REDONDEE(:epsempl, -2) RETURNING_VALUES (:epsempl);

SELECT P.paan_afptr FROM PARAMETROS_ANO P WHERE P.paan_ano = SUBSTR(:fecliq, 1,4) INTO :porcafpempl;
afpempl = (sueldo * :porcafpempl) / 100;
EXECUTE PROCEDURE REDONDEE(:afpempl, -2) RETURNING_VALUES (:afpempl);

SELECT P.paan_auxtr FROM PARAMETROS_ANO P WHERE P.paan_ano = SUBSTR(:fecliq, 1,4) INTO :auxt;
auxtransp = (:auxt / 30) * diaslaborados;
EXECUTE PROCEDURE REDONDEE(:auxtransp, -2) RETURNING_VALUES (:auxtransp);

SELECT SUM (PRCU_MONTO) FROM PRESTAMO_CUOTAS P, PRESTAMO_NOMINA PN WHERE PN.prno_id = P.prno_id AND PN.terc_nit = :nitempl AND P.prcu_ok = 'N' INTO :dsprestamo;
IF (dsprestamo IS NULL) THEN
dsprestamo = 0;

SELECT P.paan_epsem FROM PARAMETROS_ANO P WHERE P.paan_ano = SUBSTR(:fecliq, 1,4) INTO :pempreps;
empreps = (sueldo * :pempreps) / 100;
EXECUTE PROCEDURE REDONDEE(:empreps, -2) RETURNING_VALUES (:empreps);

SELECT P.paan_afpem FROM PARAMETROS_ANO P WHERE P.paan_ano = SUBSTR(:fecliq, 1,4) INTO :pemprafp;
emprafp = (sueldo * :pemprafp) / 100;
EXECUTE PROCEDURE REDONDEE(:emprafp, -2) RETURNING_VALUES (:emprafp);

SELECT P.dpto_tararp FROM DEPARTAMENTO P, EMPLEADOS E WHERE P.dpto_cod = E.empl_dpto AND E.terc_nit = :nitempl INTO :pemprafp;
emprarp = (sueldo * :pemprarp) / 100;
EXECUTE PROCEDURE REDONDEE(:emprarp, -2) RETURNING_VALUES (:emprarp);

SELECT P.paan_ccf FROM PARAMETROS_ANO P WHERE P.paan_ano = SUBSTR(:fecliq, 1,4) INTO :pemprccf;
emprccf = (sueldo * :pemprccf) / 100;
EXECUTE PROCEDURE REDONDEE(:emprccf, -2) RETURNING_VALUES (:emprccf);

SELECT P.paan_sena FROM PARAMETROS_ANO P WHERE P.paan_ano = SUBSTR(:fecliq, 1,4) INTO :pemprsena;
emprsena = (sueldo * :pemprsena) / 100;
EXECUTE PROCEDURE REDONDEE(:emprsena, -2) RETURNING_VALUES (:emprsena);

SELECT P.paan_icbf FROM PARAMETROS_ANO P WHERE P.paan_ano = SUBSTR(:fecliq, 1,4) INTO :pempricbf;
empricbf = (sueldo * :pempricbf) / 100;
EXECUTE PROCEDURE REDONDEE(:empricbf, -2) RETURNING_VALUES (:empricbf);

totpagos = :PRIMA + :CESANTIA + :INTCESANT + :VACACION + :SUELDO + :AUXTRANSP;
totdesc = :EPSEMPL + :AFPEMPL + :DSPRESTAMO;
total = :totpagos - :totdesc;
totempr = :EMPREPS + :EMPRAFP + :EMPRARP + :EMPRCCF + :EMPRSENA + :EMPRICBF;
SUSPEND;
END
^

SET TERM ; ^


SET TERM ^ ;

ALTER PROCEDURE REP_EMPLEADOS (
    desde varchar(20),
    hasta varchar(20),
    agrupa char(1),
    agrdesde varchar(20),
    agrhasta varchar(20),
    cumpleanos char(1),
    fecha date)
returns (
    terc_nit varchar(20),
    nombreempl varchar(60),
    empl_fecnac date,
    empl_fecing date,
    empl_salario numeric(18,2),
    empl_salinteg char(1),
    empl_salvar char(1),
    empl_cargo varchar(60),
    empl_sucur integer,
    nomeps varchar(60),
    nomarp varchar(60),
    empl_extranj char(1),
    empl_afpesp integer,
    empl_afpvoltr char(1),
    empl_afpvoltrapor numeric(18,2),
    empl_afpvolem char(1),
    empl_afpvolemapor numeric(18,2),
    nomafc varchar(60),
    empl_auxtr char(1),
    empl_cuenta varchar(25),
    empl_foto blob sub_type 0 segment size 80,
    nomccf varchar(60),
    nomafp varchar(60),
    nombretico varchar(60),
    nombresubti varchar(60),
    nomdepto varchar(60),
    nomseccion varchar(60),
    nomarea varchar(60),
    sexo char(20),
    estadocivil varchar(20),
    nombreper varchar(20),
    nombrebnco varchar(60),
    nomformpago varchar(20),
    nomtipocta varchar(20),
    direccion varchar(60),
    telefono varchar(40),
    empl_dpto integer,
    nomsucur varchar(60),
    mail varchar(100),
    cel varchar(25),
    observaciones blob sub_type 0 segment size 80,
    foto blob sub_type 0 segment size 80,
    feccumple varchar(10))
as
declare variable tcot_cod integer;
declare variable stco_cod integer;
declare variable empl_secc integer;
declare variable empl_area integer;
declare variable empl_sexo char(1);
declare variable empl_estcivil char(1);
declare variable empl_ppago integer;
declare variable empl_eps varchar(20);
declare variable empl_arp varchar(20);
declare variable empl_ccf varchar(20);
declare variable empl_afc varchar(20);
declare variable empl_afp varchar(20);
declare variable empl_banco integer;
declare variable empl_tipocta char(1);
declare variable empl_formpago char(1);
declare variable fecnaccumpl date;
declare variable mescumple varchar(2);
declare variable diacumple varchar(2);
declare variable ano varchar(5);
declare variable anoact integer;
BEGIN
if (:cumpleanos = 'N') then
BEGIN
if (agrupa = 'D') then
begin
 FOR SELECT E.terc_nit, empl_fecnac, empl_fecing, empl_salario, empl_salinteg, empl_salvar, empl_sexo, empl_estcivil, empl_cargo, empl_ppago, empl_sucur, empl_dpto, empl_secc, empl_area, empl_eps, empl_arp, empl_extranj, empl_afpesp, empl_afpvoltr, empl_afpvoltrapor, empl_afpvolem, empl_afpvolemapor, empl_afc, empl_auxtr, empl_banco, empl_cuenta, empl_tipocta, empl_foto, empl_formpago, empl_ccf, e.tcot_cod, e.stco_cod, E.empl_afp, T.terc_email, T.terc_cel, E.empl_obs, e.empl_foto
   FROM EMPLEADOS e, TERCEROS T
      WHERE T.TERC_NIT = E.TERC_NIT AND e.empl_fecret is null and E.terc_nit >= :desde and E.terc_nit <= :hasta and e.empl_dpto >= :agrdesde and e.empl_dpto <= :agrhasta
      order by TERC_NIT
       into :terc_nit, :empl_fecnac, :empl_fecing, :empl_salario, :empl_salinteg, :empl_salvar, :empl_sexo, :empl_estcivil, :empl_cargo, :empl_ppago, :empl_sucur, :empl_dpto, :empl_secc, :empl_area, :empl_eps, :empl_arp, :empl_extranj, :empl_afpesp, :empl_afpvoltr, :empl_afpvoltrapor, :empl_afpvolem, :empl_afpvolemapor, :empl_afc, :empl_auxtr, :empl_banco, :empl_cuenta, :empl_tipocta, :empl_foto, :empl_formpago, :empl_ccf, :tcot_cod, :stco_cod, :empl_afp, :mail, :cel, :observaciones, :foto
    do
  BEGIN
  select t.tcot_nombre from tipo_cotizante t where t.tcot_cod = :tcot_cod into :nombretico;
  select s.stco_nombre from subtipo_cotizante s where s.tcot_cod = :tcot_cod
  into :nombretico;
  SELECT TERC_NOM, TERC_DIR, TERC_TEL FROM TERCEROS WHERE  TERC_NIT = :terc_nit INTO :nombreempl, :direccion, :telefono;
  select dpto_nombre FROM DEPARTAMENTO WHERE dpto_cod = :empl_dpto INTO :nomdepto;
  SELECT S.secc_nom from SECCION S WHERE S.secc_cod = :empl_secc and s.dpto_cod = :empl_dpto INTO :nomseccion;
  SELECT A.area_nombre FROM AREA A WHERE A.area_cod = :empl_area and a.secc_cod = :empl_secc and a.dpto_cod = :empl_dpto INTO :nomarea;
  SELECT P.ppag_nombre FROM periodo_pago p WHERE P.ppag_cod = :empl_ppago INTO :nombreper;
  select t.terc_nom  from terceros t, ADMINISTRADORA A where T.terc_nit = A.terc_nit AND t.terc_nit = :empl_eps and t.terc_admini = 'S' AND A.admi_eps = 'S' INTO :nomeps;
  select t.terc_nom  from terceros t, ADMINISTRADORA A where T.terc_nit = A.terc_nit AND t.terc_nit = :empl_arp and t.terc_admini = 'S' AND A.admi_arp = 'S' INTO :nomarp;
  select t.terc_nom  from terceros t, ADMINISTRADORA A where T.terc_nit = A.terc_nit AND t.terc_nit = :empl_ccf and t.terc_admini = 'S' AND A.admi_ccf = 'S' INTO :nomccf;
  select t.terc_nom  from terceros t, ADMINISTRADORA A where T.terc_nit = A.terc_nit AND t.terc_nit = :empl_afp and t.terc_admini = 'S' AND A.admi_afp = 'S' INTO :nomafp;
  select t.terc_nom  from terceros t, ADMINISTRADORA A where T.terc_nit = A.terc_nit AND t.terc_nit = :empl_afc and t.terc_admini = 'S' AND A.admi_afc = 'S' INTO :nomafc;
  SELECT B.banc_nombre FROM BANCOS B WHERE B.banc_cod = :empl_banco INTO :nombrebnco;
  select s.sucu_nombre from sucursales s where s.sucu_id = :empl_sucur into :nomsucur;
  if (empl_formpago = 'C') then
  nomformpago = 'CAJA';
  ELSE
  if (empl_formpago = 'B') then
  nomformpago = 'BANCO';
  if (empl_tipocta = 'A') then
  nomtipocta = 'AHORROS';
  ELSE
  if (empl_tipocta = 'C') then
  nomtipocta = 'CORRIENTE';
  if (empl_sexo = 'M') then
  sexo = 'MASCULINO';
  ELSE
  if (empl_sexo = 'F') then
  SEXO = 'FEMENINO';
  if (empl_estcivil = 'S') then
  estadocivil = 'SOLTERO(A)';
  ELSE
  if (empl_estcivil = 'C') then
  estadocivil = 'CASADO(A)';
  ELSE
  if (empl_estcivil = 'D') then
  estadocivil = 'DIVORCIADO(A)';
  ELSE
  if (empl_estcivil = 'V') then
  estadocivil = 'VIUDO(A)';
  ELSE
  if (empl_estcivil = 'U') then
  estadocivil = 'UNION LIBRE';
  suspend;
  END
end
else
if (agrupa = 'S') then
BEGIN
 FOR SELECT E.terc_nit, empl_fecnac, empl_fecing, empl_salario, empl_salinteg, empl_salvar, empl_sexo, empl_estcivil, empl_cargo, empl_ppago, empl_sucur, empl_dpto, empl_secc, empl_area, empl_eps, empl_arp, empl_extranj, empl_afpesp, empl_afpvoltr, empl_afpvoltrapor, empl_afpvolem, empl_afpvolemapor, empl_afc, empl_auxtr, empl_banco, empl_cuenta, empl_tipocta, empl_foto, empl_formpago, empl_ccf, e.tcot_cod, e.stco_cod, E.empl_afp, T.terc_email, T.terc_cel, E.empl_obs, e.empl_foto
   FROM EMPLEADOS e, TERCEROS T
      WHERE T.TERC_NIT = E.TERC_NIT AND e.empl_fecret is null and E.terc_nit >= :desde and E.terc_nit <= :hasta and e.empl_dpto >= :agrdesde and e.empl_dpto <= :agrhasta
      order by TERC_NIT
       into :terc_nit, :empl_fecnac, :empl_fecing, :empl_salario, :empl_salinteg, :empl_salvar, :empl_sexo, :empl_estcivil, :empl_cargo, :empl_ppago, :empl_sucur, :empl_dpto, :empl_secc, :empl_area, :empl_eps, :empl_arp, :empl_extranj, :empl_afpesp, :empl_afpvoltr, :empl_afpvoltrapor, :empl_afpvolem, :empl_afpvolemapor, :empl_afc, :empl_auxtr, :empl_banco, :empl_cuenta, :empl_tipocta, :empl_foto, :empl_formpago, :empl_ccf, :tcot_cod, :stco_cod, :empl_afp, :mail, :cel, :observaciones, :foto
    do
  BEGIN
  select t.tcot_nombre from tipo_cotizante t where t.tcot_cod = :tcot_cod into :nombretico;
  select s.stco_nombre from subtipo_cotizante s where s.tcot_cod = :tcot_cod
  into :nombretico;
  SELECT TERC_NOM, TERC_DIR, TERC_TEL FROM TERCEROS WHERE  TERC_NIT = :terc_nit INTO :nombreempl, :direccion, :telefono;
  select dpto_nombre FROM DEPARTAMENTO WHERE dpto_cod = :empl_dpto INTO :nomdepto;
  SELECT S.secc_nom from SECCION S WHERE S.secc_cod = :empl_secc and s.dpto_cod = :empl_dpto INTO :nomseccion;
  SELECT A.area_nombre FROM AREA A WHERE A.area_cod = :empl_area and a.secc_cod = :empl_secc and a.dpto_cod = :empl_dpto INTO :nomarea;
  SELECT P.ppag_nombre FROM periodo_pago p WHERE P.ppag_cod = :empl_ppago INTO :nombreper;
  select t.terc_nom  from terceros t, ADMINISTRADORA A where T.terc_nit = A.terc_nit AND t.terc_nit = :empl_eps and t.terc_admini = 'S' AND A.admi_eps = 'S' INTO :nomeps;
  select t.terc_nom  from terceros t, ADMINISTRADORA A where T.terc_nit = A.terc_nit AND t.terc_nit = :empl_arp and t.terc_admini = 'S' AND A.admi_arp = 'S' INTO :nomarp;
  select t.terc_nom  from terceros t, ADMINISTRADORA A where T.terc_nit = A.terc_nit AND t.terc_nit = :empl_ccf and t.terc_admini = 'S' AND A.admi_ccf = 'S' INTO :nomccf;
  select t.terc_nom  from terceros t, ADMINISTRADORA A where T.terc_nit = A.terc_nit AND t.terc_nit = :empl_afp and t.terc_admini = 'S' AND A.admi_afp = 'S' INTO :nomafp;
  select t.terc_nom  from terceros t, ADMINISTRADORA A where T.terc_nit = A.terc_nit AND t.terc_nit = :empl_afc and t.terc_admini = 'S' AND A.admi_afc = 'S' INTO :nomafc;
  SELECT B.banc_nombre FROM BANCOS B WHERE B.banc_cod = :empl_banco INTO :nombrebnco;
  select s.sucu_nombre from sucursales s where s.sucu_id = :empl_sucur into :nomsucur;
  if (empl_formpago = 'C') then
  nomformpago = 'CAJA';
  ELSE
  if (empl_formpago = 'B') then
  nomformpago = 'BANCO';
  if (empl_tipocta = 'A') then
  nomtipocta = 'AHORROS';
  ELSE
  if (empl_tipocta = 'C') then
  nomtipocta = 'CORRIENTE';
  if (empl_sexo = 'M') then
  sexo = 'MASCULINO';
  ELSE
  if (empl_sexo = 'F') then
  SEXO = 'FEMENINO';
  if (empl_estcivil = 'S') then
  estadocivil = 'SOLTERO(A)';
  ELSE
  if (empl_estcivil = 'C') then
  estadocivil = 'CASADO(A)';
  ELSE
  if (empl_estcivil = 'D') then
  estadocivil = 'DIVORCIADO(A)';
  ELSE
  if (empl_estcivil = 'V') then
  estadocivil = 'VIUDO(A)';
  ELSE
  if (empl_estcivil = 'U') then
  estadocivil = 'UNION LIBRE';
  suspend;
  END
end
ELSE
begin
 FOR SELECT E.terc_nit, empl_fecnac, empl_fecing, empl_salario, empl_salinteg, empl_salvar, empl_sexo, empl_estcivil, empl_cargo, empl_ppago, empl_sucur, empl_dpto, empl_secc, empl_area, empl_eps, empl_arp, empl_extranj, empl_afpesp, empl_afpvoltr, empl_afpvoltrapor, empl_afpvolem, empl_afpvolemapor, empl_afc, empl_auxtr, empl_banco, empl_cuenta, empl_tipocta, empl_foto, empl_formpago, empl_ccf, e.tcot_cod, e.stco_cod, E.empl_afp, T.terc_email, T.terc_cel, E.empl_obs, e.empl_foto
   FROM EMPLEADOS e, TERCEROS T
      WHERE T.TERC_NIT = E.TERC_NIT AND e.empl_fecret is null and E.terc_nit >= :desde and E.terc_nit <= :hasta and e.empl_dpto >= :agrdesde and e.empl_dpto <= :agrhasta
      order by TERC_NIT
       into :terc_nit, :empl_fecnac, :empl_fecing, :empl_salario, :empl_salinteg, :empl_salvar, :empl_sexo, :empl_estcivil, :empl_cargo, :empl_ppago, :empl_sucur, :empl_dpto, :empl_secc, :empl_area, :empl_eps, :empl_arp, :empl_extranj, :empl_afpesp, :empl_afpvoltr, :empl_afpvoltrapor, :empl_afpvolem, :empl_afpvolemapor, :empl_afc, :empl_auxtr, :empl_banco, :empl_cuenta, :empl_tipocta, :empl_foto, :empl_formpago, :empl_ccf, :tcot_cod, :stco_cod, :empl_afp, :mail, :cel, :observaciones, :foto
    do
  BEGIN
  select t.tcot_nombre from tipo_cotizante t where t.tcot_cod = :tcot_cod into :nombretico;
  select s.stco_nombre from subtipo_cotizante s where s.tcot_cod = :tcot_cod
  into :nombretico;
  SELECT TERC_NOM, TERC_DIR, TERC_TEL FROM TERCEROS WHERE  TERC_NIT = :terc_nit INTO :nombreempl, :direccion, :telefono;
  select dpto_nombre FROM DEPARTAMENTO WHERE dpto_cod = :empl_dpto INTO :nomdepto;
  SELECT S.secc_nom from SECCION S WHERE S.secc_cod = :empl_secc and s.dpto_cod = :empl_dpto INTO :nomseccion;
  SELECT A.area_nombre FROM AREA A WHERE A.area_cod = :empl_area and a.secc_cod = :empl_secc and a.dpto_cod = :empl_dpto INTO :nomarea;
  SELECT P.ppag_nombre FROM periodo_pago p WHERE P.ppag_cod = :empl_ppago INTO :nombreper;
  select t.terc_nom  from terceros t, ADMINISTRADORA A where T.terc_nit = A.terc_nit AND t.terc_nit = :empl_eps and t.terc_admini = 'S' AND A.admi_eps = 'S' INTO :nomeps;
  select t.terc_nom  from terceros t, ADMINISTRADORA A where T.terc_nit = A.terc_nit AND t.terc_nit = :empl_arp and t.terc_admini = 'S' AND A.admi_arp = 'S' INTO :nomarp;
  select t.terc_nom  from terceros t, ADMINISTRADORA A where T.terc_nit = A.terc_nit AND t.terc_nit = :empl_ccf and t.terc_admini = 'S' AND A.admi_ccf = 'S' INTO :nomccf;
  select t.terc_nom  from terceros t, ADMINISTRADORA A where T.terc_nit = A.terc_nit AND t.terc_nit = :empl_afp and t.terc_admini = 'S' AND A.admi_afp = 'S' INTO :nomafp;
  select t.terc_nom  from terceros t, ADMINISTRADORA A where T.terc_nit = A.terc_nit AND t.terc_nit = :empl_afc and t.terc_admini = 'S' AND A.admi_afc = 'S' INTO :nomafc;
  SELECT B.banc_nombre FROM BANCOS B WHERE B.banc_cod = :empl_banco INTO :nombrebnco;
  select s.sucu_nombre from sucursales s where s.sucu_id = :empl_sucur into :nomsucur;
  if (empl_formpago = 'C') then
  nomformpago = 'CAJA';
  ELSE
  if (empl_formpago = 'B') then
  nomformpago = 'BANCO';
  if (empl_tipocta = 'A') then
  nomtipocta = 'AHORROS';
  ELSE
  if (empl_tipocta = 'C') then
  nomtipocta = 'CORRIENTE';
  if (empl_sexo = 'M') then
  sexo = 'MASCULINO';
  ELSE
  if (empl_sexo = 'F') then
  SEXO = 'FEMENINO';
  if (empl_estcivil = 'S') then
  estadocivil = 'SOLTERO(A)';
  ELSE
  if (empl_estcivil = 'C') then
  estadocivil = 'CASADO(A)';
  ELSE
  if (empl_estcivil = 'D') then
  estadocivil = 'DIVORCIADO(A)';
  ELSE
  if (empl_estcivil = 'V') then
  estadocivil = 'VIUDO(A)';
  ELSE
  if (empl_estcivil = 'U') then
  estadocivil = 'UNION LIBRE';
  suspend;
  END
end
END
ELSE
if (cumpleanos = 'S') then
BEGIN
FOR SELECT E.EMPL_FECNAC, E.terc_nit,  T.terc_nom FROM EMPLEADOS E, TERCEROS T WHERE T.terc_nit = E.terc_nit
INTO :fecnaccumpl, :terc_nit, :nombreempl
DO
if (fecnaccumpl IS NOT NULL) then
BEGIN
anoact = SUBSTR(fecha, 1,4);
mescumple = SUBSTR(:fecnaccumpl, 6,7);
diacumple = SUBSTR(:fecnaccumpl, 9,10);
feccumple = :anoact || '/' || :mescumple || '/' || :diacumple;
SUSPEND;
END
END
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE LIQUIDA_HORAS_EXTRA(
    NIT VARCHAR(20),
    ID INTEGER,
    HD SMALLINT,
    HN SMALLINT,
    HFD SMALLINT,
    HFN SMALLINT,
    ANO CHAR(4))
AS
declare variable tot_he numeric(18,2);
declare variable tot_fesd numeric(18,2);
declare variable tot_fesn numeric(18,2);
declare variable tot_diur numeric(18,2);
declare variable tot_noct numeric(18,2);
declare variable tar_fesd numeric(9,4);
declare variable tar_fesn numeric(9,4);
declare variable tar_diur numeric(9,4);
declare variable tar_noct numeric(9,4);
declare variable monto integer;
begin
SELECT EMPL_SALARIO FROM empleados WHERE TERC_NIT = :NIT into :monto;
  monto = :monto / 240;
  EXECUTE PROCEDURE REDONDEE(:monto, 0)returning_values (:monto);
select PAAN_HORASDI, PAAN_HORASNO, PAAN_HORASFN, PAAN_HORASFD FROM PARAMETROS_ANO WHERE paan_ano = :ano
  into :tar_diur, :tar_noct, :tar_fesn, :tar_fesd;
  tot_diur = :monto * tar_diur;
  tot_noct = :monto * tar_noct;
  tot_fesn = :monto * tar_fesn;
  tot_fesd = :monto * tar_fesd;
  tot_diur = :tot_diur * :hd;
  tot_noct = :tot_noct * :hn;
  tot_fesn = :tot_fesn * :hfn;
  tot_fesd = :tot_fesd * :hfd;
  tot_he =  tot_diur + tot_noct + tot_fesd + tot_fesn;
  EXECUTE PROCEDURE REDONDEE(:tot_he, 0)returning_values (:tot_he);
update nomina_detalle set node_extras = :tot_he where nomi_id = :id and terc_nit = :nit;
update nomina_conceptos set noco_valor = :tot_he where nomi_id = :id and terc_nit = :nit and conc_cod = 900;
  suspend;
end
^

SET TERM ; ^

ALTER TABLE TIPO_DOCUMENTO
ADD TIDO_NOM BOOLEANO;


INSERT INTO CONFIGURACION (CONF_MODULO, CONF_CATEGORIA, CONF_PROPIEDAD, CONF_VALOR, CONF_POSIBLES, CONF_AYUDA) VALUES ('NOMINA', 'GENERAL', 'REDONDEO AL MULTIPLO DE DIEZ EN TOTALES', '0', '-2,-1,0,1,2', 'Indique 0: redondeo pesos, 1:redondeo a 10, 2: redondeo a 100, -1:Redondeo a decimal, -2:redondeo a centavo.');

SET TERM ^ ;

ALTER PROCEDURE CAUSA_NOMINA(
    FEC DATE,
    PERIODO INTEGER,
    PERIODICIDAD INTEGER,
    PAGOGLOBAL CHAR(1),
    ANO CHAR(4))
RETURNS (
    IDNOMINA INTEGER)
AS
declare variable item integer;
declare variable nite varchar(20) character set none;
declare variable nit_tercero varchar(20);
declare variable concept integer;
declare variable montos numeric(18,2);
declare variable porcen numeric(9,4);
declare variable entidad varchar(20);
declare variable conc_cod integer;
declare variable conc_deduc char(1);
declare variable conc_porc numeric(9,4);
declare variable conc_entidad integer;
declare variable conc_monto numeric(18,2);
declare variable conc_modifi char(1);
declare variable conc_promedio char(1);
declare variable emco_perprom integer;
declare variable valor numeric(18,2);
declare variable diaslab integer;
declare variable conc_prov char(1);
declare variable conc_aporte char(1);
declare variable numeroprom integer;
declare variable conc_aplicaprom char(1);
declare variable perinicial integer;
declare variable anoprom integer;
declare variable conc_dias char(1);
declare variable conc_otroconc char(1);
declare variable conc_codotroconc integer;
declare variable anosum integer;
declare variable salario char(1) character set none;
declare variable liquidaper integer;
declare variable rmod numeric(2,2);
declare variable basico numeric(18,2);
declare variable niteps varchar(20);
declare variable nitafc varchar(20);
declare variable nitafp varchar(20);
declare variable nitccf varchar(20);
declare variable gtoempr char(1);
declare variable comision numeric(18,2);
declare variable cambsaltrans numeric(18,2);
declare variable saldosini numeric(18,2);
declare variable duranov integer;
declare variable base numeric(18,2);
declare variable aprox integer;
BEGIN
/*SI ES QUINCENAL*/
EXECUTE PROCEDURE cambie_id_nomina RETURNING_VALUES(:idnomina);
INSERT INTO nomina (nomi_id, NOMI_FECCAUSA, NOMI_PAGOGLOBAL, NOMI_PERIODOCIDAD, NOMI_PERIODO, NOMI_ANO, NOMI_LIQOK)
VALUES (:IDNOMINA, :fec,:pagoglobal, :periodicidad, :periodo, :ano, 'N');
 BEGIN
    item = 1;
    FOR SELECT E.TERC_NIT, E.empl_salario, e.empl_eps, e.empl_afc, e.empl_afp, e.empl_ccf
    FROM EMPLEADOS E
    WHERE E.empl_ppago = :periodicidad
    INTO :nite, :basico, :niteps, :nitafc, :nitafp, :nitccf
    DO
    BEGIN
    FOR SELECT CE.TERC_NIT, CE.CONC_COD, CE.EMCO_MONTO, CE.EMCO_PORC, ce.empl_entidad, CE.emco_perprom, CE.emco_luquidaper, CN.CONC_COD, CN.CONC_DEDUC,CN.CONC_PORC, CN.CONC_ENTIDAD, CN.CONC_MONTO,  CN.CONC_DIAS, CN.CONC_MODIFI,
    CN.CONC_PROMEDIO, CN.conc_salario, CE.emco_perprom, CN.conc_prov, CN.conc_aporte, CN.conc_aplicaprom, cn.conc_otroconc, cn.conc_codotroconc, CN.conc_gtoempr, CN.conc_base
    FROM empleado_conceptos CE, CONCEPTOS_NOMINA CN WHERE ((CE.terc_nit = :nite) AND (CE.CONC_COD = CN.CONC_COD) AND (CN.conc_fecini <= :fec AND CN.conc_fecfin >= :FEC) ) OR ((CE.terc_nit = :nite)
    AND (CE.CONC_COD = CN.CONC_COD) AND (cn.conc_todosper = 'N') AND (CE.emco_ppago = :periodo)) OR  ((CE.terc_nit = :nite) AND (CE.CONC_COD = CN.CONC_COD) AND cn.conc_todosper = 'S')  ORDER BY (TERC_NIT )
    INTO :nit_tercero, :concept,  :montos, :porcen, :entidad, :numeroprom, :liquidaper ,:CONC_COD, :CONC_DEDUC, :CONC_PORC,
    :CONC_ENTIDAD, :CONC_MONTO, :CONC_DIAS, :CONC_MODIFI,:CONC_PROMEDIO, :salario,:EMCO_PERPROM, :conc_prov, :conc_aporte , :CONC_APLICAPROM, :conc_otroconc, :conc_codotroconc, :gtoempr, :base
    DO
BEGIN
IF (periodicidad = 2) THEN
BEGIN
    IF (conc_dias = 'S') THEN
    EXECUTE PROCEDURE DIAS_LABORADOS (:nite, :periodo, :fec) RETURNING_VALUES (:diaslab);
    ELSE
    BEGIN
    IF (liquidaper = 0) THEN
    diaslab = 15;
    ELSE
    IF (liquidaper = 1) THEN
    diaslab = 30;
    ELSE
    IF (liquidaper = 2) THEN
    diaslab = 60;
    END
END
   ELSE
IF (periodicidad = 1) THEN
BEGIN
    IF (conc_dias = 'S') THEN
    EXECUTE PROCEDURE DIAS_LABORADOS (:nite, :periodo, :fec) RETURNING_VALUES (:diaslab);
    ELSE
    diaslab = 30;
END
   ELSE
IF (periodicidad = 3) THEN
BEGIN
    IF (conc_dias = 'S') THEN
    EXECUTE PROCEDURE DIAS_LABORADOS (:nite, :periodo, :fec) RETURNING_VALUES (:diaslab);
    ELSE
    BEGIN
    IF (liquidaper = 0) THEN
    diaslab = 7;
    ELSE
    IF (liquidaper = 1) THEN
    diaslab = 15;
    ELSE
    IF (liquidaper = 2) THEN
    diaslab = 30;
    END
END
 SELECT ((n.nono_valor /30) * n.nono_dura), (n.nono_dura) FROM nomina_novedades n WHERE n.tnov_cod = 11 AND n.terc_nit = :nite AND n.nono_periodo = :periodo INTO :cambsaltrans, :duranov;
 IF (cambsaltrans IS NULL) THEN
 cambsaltrans = 0;
 if (duranov is null) then
 duranov = 0;
 diaslab = :diaslab - :duranov;
 if (conc_cod = 921) then
 begin
 if (porcen IS NOT NULL AND porcen <> 0) then
 valor = ((basico / 30)* :diaslab ) * :PORCEN /100;
 ELSE
 if (conc_porc IS NOT null AND conc_porc <> 0) then
 valor = ((:basico / 30)* :diaslab ) * :conc_porc /100;
 end
 ELSE
 if (conc_cod = 922) then
 BEGIN
 SELECT P.prcu_monto FROM prestamo_cuotas P, prestamo_nomina PN WHERE P.prcu_ano = :ano AND P.prcu_periodo = :periodo AND PN.prno_id = P.prno_id AND PN.terc_nit = :nite INTO :valor;
 IF (valor IS NULL) THEN
 valor = 0;
 item = :item + 1;
 update prestamo_cuotas  P SET prcu_ok = 'S' WHERE P.prcu_ano = :ano AND P.prcu_periodo = :periodo AND P.prno_id = (SELECT PN.prno_id FROM PRESTAMO_NOMINA PN WHERE PN.terc_nit = :nite);
 END
 ELSE
 BEGIN
    IF ((:montos = 0) OR (:montos IS NULL)) THEN
      BEGIN
      IF ((CONC_PORC = 0 AND :porcen = 0) OR (CONC_PORC IS NULL AND :porcen = 0) OR (CONC_PORC = 0 AND :porcen IS NULL) OR (CONC_PORC IS NULL AND :porcen IS NULL) ) THEN
        BEGIN
        IF ((conc_monto <> 0) AND (conc_monto IS NOT NULL) ) THEN
        BEGIN
        VALOR = :CONC_MONTO;
        END
        ELSE
        IF (salario = 'S' AND CONC_COD <> 900 AND CONC_COD <> 920) THEN
        BEGIN
        conc_monto = :basico;
        VALOR = (:conc_monto/30 * :diaslab ) + :cambsaltrans;
        END
        ELSE
        valor = montos;
        END
       ELSE
       BEGIN
        IF (:porcen <> 0) THEN
          BEGIN
            IF ((conc_monto <> 0) AND (conc_monto IS NOT NULL) ) THEN
            BEGIN
              VALOR = ((:CONC_MONTO ) * :PORCEN) /100;
            END
          END
          ELSE
          BEGIN
            IF ((conc_monto <> 0) AND (conc_monto IS NOT NULL) ) THEN
            BEGIN
              VALOR = ((:CONC_MONTO) * :conc_porc) /100;
            END
            ELSE
        IF (salario = 'S' AND CONC_COD <> 900 AND CONC_COD <> 920) THEN
            BEGIN
              conc_monto = :basico;
              VALOR = ((:CONC_MONTO)+ :cambsaltrans * :conc_porc) /100;
            END
          END
       END
      END
    ELSE
    BEGIN
      IF ((CONC_PORC = 0 or (conc_porc is null)) AND (:porcen = 0 or (porcen is null))) THEN
      BEGIN
      VALOR = (:montos);
      END
      ELSE
      BEGIN
        IF (:porcen <> 0 and porcen is not null) THEN
          BEGIN
          VALOR = ((:MONTOS ) * :PORCEN) /100;
          END
          ELSE
          BEGIN
          VALOR = ((:montos) * :CONC_PORC) /100;
          END
       END
   END
    IF (conc_promedio = 'S') THEN
    BEGIN
    perinicial = :periodo - (:numeroprom) + 1;
    anoprom = CAST (ano AS INTEGER);
    IF (perinicial <= 0) THEN
    BEGIN
    perinicial = 24 + :PERINICIAL;
    anoprom = CAST(ANO AS INTEGER) - 1;
    END
    SELECT SUM (noco_valor) FROM nomina_conceptos n WHERE n.noco_aplicaprom = 'S' AND N.noco_periodo >= :perinicial - 1 AND N.noco_periodo < :periodo AND N.noco_ano >= :anoprom AND N.noco_ano <= :ano AND terc_nit = :nite INTO :valor;
    valor = (valor / numeroprom);
    SELECT NOCO_VALOR FROM NOMINA_CONCEPTOS WHERE CONC_COD = :conc_cod AND TERC_NIT  = :nite AND NOCO_PAGOOK = 'N' AND NOCO_PERIODO = 0 INTO :saldosini;
    IF (saldosini IS NULL) THEN
    saldosini = 0;
    ELSE
    UPDATE nomina_conceptos N SET noco_pagook = 'S' WHERE n.noco_aplicaprom = 'S' AND N.noco_periodo >= :perinicial - 1 AND N.noco_periodo < :periodo AND N.noco_ano >= :anoprom AND N.noco_ano <= :ano  AND CONC_COD = :conc_cod AND terc_nit = :nite AND NOCO_PERIODO = 0;
    VALOR = :valor + :saldosini;
    UPDATE nomina_conceptos N SET noco_pagook = 'S' WHERE n.noco_aplicaprom = 'S' AND N.noco_periodo >= :perinicial - 1 AND N.noco_periodo < :periodo AND N.noco_ano >= :anoprom AND N.noco_ano <= :ano  AND CONC_COD = :conc_cod AND terc_nit = :nite;
    END
    IF (conc_otroconc = 'S') THEN
    BEGIN
    anosum = CAST(ano AS INTEGER);
    anosum = anosum - 1;
    SELECT SUM (noco_valor) FROM nomina_conceptos n WHERE n.noco_ano = :anosum AND n.conc_cod = :conc_codotroconc AND N.terc_nit = :nite INTO :valor;
    SELECT NOCO_VALOR FROM NOMINA_CONCEPTOS WHERE noco_ano = :anosum AND conc_cod = :conc_codotroconc AND terc_nit = :nite AND NOCO_PERIODO = 0 INTO :saldosini;
    IF (saldosini IS NULL) THEN
    saldosini = 0;
    ELSE
    UPDATE nomina_conceptos SET noco_pagook = 'S' WHERE noco_ano = :anosum AND conc_cod = :conc_codotroconc AND NOCO_PERIODO = 0 AND terc_nit = :nite;
    VALOR = :valor + :saldosini;
    UPDATE nomina_conceptos SET noco_pagook = 'S' WHERE noco_ano = :anosum AND conc_cod = :conc_codotroconc AND terc_nit = :nite;
    END
/*SI EL CONCEPTO ES UN APORTE*/
IF (conc_aporte = 'S') THEN
BEGIN
    IF ((:entidad = '' ) OR (entidad IS NULL)) THEN
    BEGIN
     SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
     IF (comision IS NULL) THEN
     comision = 0;
     valor = :basico + :comision;
    IF ((conc_cod = 904) OR (conc_cod = 905) OR (conc_cod = 906)) THEN
            BEGIN
            entidad = :nitafp;
                IF (conc_cod = 904) THEN
                BEGIN
                SELECT A.paan_afptr FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = (((((:basico /30) * :diaslab ) + :comision)+ :cambsaltrans) * :PORCEN) /100;
                END
                ELSE
                IF ((conc_cod = 905) OR (conc_cod = 906)) THEN
                BEGIN
                SELECT A.paan_afpem FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = (((((:basico /30) * :diaslab ) + :comision)+ :cambsaltrans) * :PORCEN) /100;
                END
            END
            ELSE
       IF ((conc_cod = 907) OR (conc_cod = 914) OR (conc_cod = 915)) THEN
            BEGIN
            entidad = :niteps;
                IF (conc_cod = 907) THEN
                BEGIN
                SELECT A.paan_epstr FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = (((((:basico )/30 * :diaslab ) + :comision)+ :cambsaltrans) * :PORCEN) /100;
                END
                ELSE
                IF ((conc_cod = 914) OR (conc_cod = 915)) THEN
                BEGIN
                SELECT A.paan_epsem FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = (((((:basico )/30 * :diaslab ) + :comision)+ :cambsaltrans) * :PORCEN) /100;
                END
            END
            ELSE
       IF ((conc_cod = 910) OR (conc_cod = 911) OR (conc_cod = 916) OR (conc_cod = 917) OR (conc_cod = 918) OR (conc_cod = 919)) THEN
            BEGIN
            entidad = :nitccf;
            SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
            IF (comision IS NULL) THEN
            comision = 0;
                IF ((conc_cod = 910) OR (conc_cod = 911) ) THEN
                BEGIN
                SELECT A.paan_ccf FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = (((((:basico )/30 * :diaslab ) + :comision)+ :cambsaltrans) * :PORCEN) /100;
                END
                ELSE
                IF ((conc_cod = 916) OR (conc_cod = 917)) THEN
                BEGIN
                SELECT A.paan_icbf FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = (((((:basico )/30 * :diaslab ) + :comision)+ :cambsaltrans) * :PORCEN) /100;
                END
                ELSE
                IF ((conc_cod = 918) OR (conc_cod = 919)) THEN
                BEGIN
                SELECT A.paan_sena FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = (((((:basico )/30 * :diaslab ) + :comision)+ :cambsaltrans) * :PORCEN) /100;
                END
            END
            ELSE
        IF ((conc_cod = 912) OR (conc_cod = 913)) THEN
            BEGIN
            entidad = :nitafc;
            SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
            IF (comision IS NULL) THEN
            comision = 0;
                IF ((conc_cod = 912) OR (conc_cod = 913) ) THEN
                BEGIN
                SELECT A.paan_cesemp FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = ((((:basico + :comision)/30 * :diaslab )+ :cambsaltrans) * :PORCEN) /100;
                END
            END
            ELSE
        BEGIN
        IF (comision IS NULL) THEN
        comision = 0;
        SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
        conc_monto = :basico + :comision;
        IF (conc_porc <> 0 AND conc_porc IS NOT NULL) THEN
        VALOR = (((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans) * :conc_porc) /100;
        ELSE
        IF (:porcen <> 0 AND :porcen IS NOT NULL) THEN
        VALOR = (((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans) * :porcen) /100;
        ELSE
        IF (:montos <> 0 AND :montos IS NOT NULL) THEN
        valor = :montos;
        ELSE
        IF (:conc_monto <> 0 AND :conc_monto IS NOT NULL) THEN
        valor = :conc_monto;
        END
    END
    END
    ELSE
    IF (conc_prov = 'S') THEN
    BEGIN
        conc_monto = :basico;
        IF (conc_porc <> 0 AND conc_porc IS NOT NULL) THEN
        VALOR = (((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans) * :conc_porc) /100;
        ELSE
        IF (porcen <> 0 AND porcen IS NOT NULL) THEN
        VALOR = (((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans) * :porcen) /100;
        ELSE
        IF (montos <> 0 AND montos IS NOT NULL) THEN
        VALOR = :montos;
        ELSE
        IF (conc_monto <> 0 AND conc_monto IS NOT NULL) THEN
        VALOR = :conc_monto;
    END
item = :item + 1;
END
 IF (conc_cod = 920) THEN
 BEGIN
 SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :valor;
 IF (valor IS NULL) THEN
 valor = 0;
 item = :item + 1;
 END
    EXECUTE PROCEDURE LEE_CONFIGURACION('NOMINA','GENERAL','REDONDEO AL MULTIPLO DE DIEZ EN TOTALES')returning_values(:aprox);
    EXECUTE PROCEDURE REDONDEE(:valor, :aprox) RETURNING_VALUES (VALOR);
    IF (liquidaper = 0) THEN
    INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
    VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
    ELSE
    IF (liquidaper = 1) THEN
    BEGIN
    rmod = mod(:periodo, 2);
    IF (rmod = 0) THEN
        INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
        VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
    END
    ELSE
    IF (liquidaper = 2) THEN
    BEGIN
    rmod = mod(:periodo, 4);
    IF (rmod = 0) THEN
        INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
        VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
    END
  END
 END
END
SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE REDONDEE(
    VALOR NUMERIC(18,4),
    DIG INTEGER)
RETURNS (
    RESPUESTA NUMERIC(18,4))
AS
declare variable AUX NUMERIC(18, 4);
declare variable PRCX2 NUMERIC(18, 4);
begin
if (DIG = -2) then
    BEGIN
    VALOR = VALOR * 100;
    END
if (DIG = -1) then
    BEGIN
    VALOR = VALOR * 10;
    END

if (DIG = 1) then
   BEGIN
   VALOR = VALOR / 10;
   END

if (DIG = 2) then
   BEGIN
   VALOR = VALOR / 100;
   END

if (DIG = 1000) then
BEGIN
VALOR = VALOR / 1000;
END

if (DIG = 5) then
   begin
   valor = ((valor * 2) / 100);
   end
/* REDONDEE A ENTERO */
AUX = VALOR - FLOOR(VALOR);
if (AUX > 0.5) then
  RESPUESTA = CEILING(VALOR);
ELSE
  RESPUESTA = FLOOR(VALOR);

if (DIG = -2) then
    BEGIN
    RESPUESTA = RESPUESTA / 100;
    END
if (DIG = -1) then
    BEGIN
    RESPUESTA = RESPUESTA / 10;
    END

if (DIG = 1) then
    BEGIN
    RESPUESTA = RESPUESTA * 10;
    END

if (DIG = 2) then
    BEGIN
    RESPUESTA = RESPUESTA * 100;
    END

if (DIG = 1000) then
    BEGIN
    RESPUESTA = RESPUESTA * 1000;
    END

if (DIG = 5) then
   begin
     RESPUESTA = ((RESPUESTA * 100) / 2);
   end
suspend;
end
^

SET TERM ; ^


update RDB$RELATION_FIELDS set
RDB$NULL_FLAG = NULL
where (RDB$FIELD_NAME = 'NONO_NVODEPTO') and
(RDB$RELATION_NAME = 'NOMINA_NOVEDADES')
;

SET TERM ^ ;

ALTER PROCEDURE CALC_SALDOSINI_NOMINA(
    FECHA DATE)
RETURNS (
    EMPLNIT VARCHAR(20),
    EMPLNOM VARCHAR(60),
    PRIMAJUNIO NUMERIC(18,2),
    CONC_CODPRIMAJUN INTEGER,
    PRIMADIC NUMERIC(18,2),
    CONC_CODPRIMADIC INTEGER,
    CESANTIA NUMERIC(18,2),
    CONC_CODCESAN INTEGER,
    VACAC NUMERIC(18,2),
    CONC_CODVACACI INTEGER,
    INTCES NUMERIC(18,2),
    CONC_CODINTCES INTEGER)
AS
DECLARE VARIABLE numeromeses INTEGER;
declare variable fechaing date;
DECLARE VARIABLE ANOACT INTEGER;
DECLARE VARIABLE MESACT INTEGER;
DECLARE VARIABLE DIAACT INTEGER;
DECLARE VARIABLE ANOING INTEGER;
DECLARE VARIABLE DIAING INTEGER;
DECLARE VARIABLE MESING INTEGER;
DECLARE VARIABLE salario NUMERIC(18,2);
declare variable item integer;
declare variable idsaldo integer;
BEGIN
delete from nomina where nomi_periodo = 0;
idsaldo = gen_id(id_nomina,1);
insert into nomina  (nomi_id, nomi_feccausa, nomi_liqok, nomi_periodo) values (:idsaldo, :fecha, 'S', 0);
item = 1;
anoact = CAST(substr(:fecha,1,4)AS INTEGER);
mesact = CAST(substr(:fecha,6,7)AS INTEGER);
diaact = CAST(substr(:fecha,9,10)AS INTEGER);
FOR SELECT  E.TERC_NIT, T.TERC_NOM, E.EMPL_FECING, E.empl_salario FROM EMPLEADOS E, TERCEROS T WHERE T.terc_nit = E.terc_nit AND e.empl_fecing <= :fecha INTO :emplnit, :emplnom, :fechaing, :salario
DO
  BEGIN
    anoing = CAST(substr(:fechaing,1,4)AS INTEGER);
    mesing = CAST(substr(:fechaing,6,7)AS INTEGER);
    diaing = CAST(substr(:fechaing,9,10)AS INTEGER);
    numeromeses = mesact - 1;
    cesantia = (:salario / 12) * :numeromeses;
    intces = cesantia * 1 /100;
    numeromeses = ((:anoact-:anoing)*12)-((:mesact-:mesing)*(-1))-1;
    if (numeromeses > 12) then
    numeromeses = 12;
    IF (numeromeses < 0) THEN
    numeromeses = 0;
    vacac = (:salario / 12) * :numeromeses;
    IF (anoact = anoing) THEN
    BEGIN
    IF (mesact > 1 AND mesact <= 6) THEN
    BEGIN
    numeromeses = :mesact - :mesing;
    primajunio = (:salario / 12) * :numeromeses;
    END
    ELSE
    primajunio = 0;
    IF (mesact > 7 AND mesact <= 12) THEN
    BEGIN
    numeromeses = :mesact - 6;
    primadic = (:salario / 12) * (:numeromeses);
    END
    END
    ELSE
    IF (mesact > 1 AND mesact <= 6) THEN
    begin
    numeromeses = :mesact - 1;
    primajunio = (:salario / 12) * :numeromeses;
    end
    else
    IF (mesact > 7 AND mesact <= 12) THEN
    BEGIN
    numeromeses = :mesact - 7;
    primadic = (:salario / 12) * (:numeromeses);
    END
EXECUTE PROCEDURE redondee(:primajunio, 5) RETURNING_VALUES :primajunio;
EXECUTE PROCEDURE redondee(:primadic, 5) RETURNING_VALUES :primadic;
EXECUTE PROCEDURE redondee(:cesantia, 5) RETURNING_VALUES :cesantia;
EXECUTE PROCEDURE redondee(:intces, 5) RETURNING_VALUES :intces;
EXECUTE PROCEDURE redondee(:vacac, 5) RETURNING_VALUES :vacac;
/*if ( cesantia <> 0 AND cesantia IS NOT NULL and  intces <> 0 AND intces IS NOT NULL and primajunio <> 0 AND primajunio IS NOT NULL and vacac <> 0 AND vacac IS NOT NULL and primadic <> 0 AND primadic IS NOT NULL) then*/
select conc_cod from empleado_conceptos where ((conc_cod = 912) or (conc_cod = 913)) and terc_nit = :emplnit into :conc_codcesan;
select conc_cod from empleado_conceptos where ((conc_cod = 3) or (conc_cod = 19)) and terc_nit = :emplnit into :conc_codintces;
select conc_cod from empleado_conceptos where ((conc_cod = 15) or (conc_cod = 21)) and terc_nit = :emplnit into :conc_codprimajun;
select conc_cod from empleado_conceptos where ((conc_cod = 16) or (conc_cod = 22)) and terc_nit = :emplnit into :conc_codprimadic;
select conc_cod from empleado_conceptos where ((conc_cod = 14) or (conc_cod = 20)) and terc_nit = :emplnit  into :conc_codvacaci;
if (cesantia <> 0 AND cesantia IS NOT NULL) then
begin
INSERT INTO NOMINA_CONCEPTOS (NOMI_ID, NOCO_ITEM, CONC_COD, TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC, NOCO_PROV, NOCO_APORTE, NOCO_PAGOOK, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, NOCO_GTOEMPR) VALUES (:idsaldo, :item, :conc_codcesan, :emplnit, :cesantia, '', 'N', 'S', 'N', 'N', 0, :anoact, 'N', 'N', 'N', 'S');
item = :item + 1;
end
if (intces <> 0 AND intces IS NOT NULL) then
begin
INSERT INTO NOMINA_CONCEPTOS (NOMI_ID, NOCO_ITEM, CONC_COD, TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC, NOCO_PROV, NOCO_APORTE, NOCO_PAGOOK, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, NOCO_GTOEMPR) VALUES (:idsaldo, :item, :conc_codintces, :emplnit, :intces, '', 'N', 'S', 'N', 'N', 0, :anoact, 'N', 'N', 'N', 'S');
item = :item + 1;
end
if (primajunio <> 0 AND primajunio IS NOT NULL) then
begin
INSERT INTO NOMINA_CONCEPTOS (NOMI_ID, NOCO_ITEM, CONC_COD, TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC, NOCO_PROV, NOCO_APORTE, NOCO_PAGOOK, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, NOCO_GTOEMPR) VALUES (:idsaldo, :item, :conc_codprimajun, :emplnit, :primajunio, '', 'N', 'S', 'N', 'N', 0, :anoact, 'N', 'N', 'N', 'S');
item = :item + 1;
end
if (primadic <> 0 AND primadic IS NOT NULL) then
begin
INSERT INTO NOMINA_CONCEPTOS (NOMI_ID, NOCO_ITEM, CONC_COD, TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC, NOCO_PROV, NOCO_APORTE, NOCO_PAGOOK, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, NOCO_GTOEMPR) VALUES (:idsaldo, :item, :conc_codprimadic, :emplnit, :primadic, '', 'N', 'S', 'N', 'N', 0, :anoact, 'N', 'N', 'N', 'S');
item = :item + 1;
end
if (vacac <> 0 AND vacac IS NOT NULL) then
begin
INSERT INTO NOMINA_CONCEPTOS (NOMI_ID, NOCO_ITEM, CONC_COD, TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC, NOCO_PROV, NOCO_APORTE, NOCO_PAGOOK, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, NOCO_GTOEMPR) VALUES (:idsaldo, :item, :conc_codvacaci, :emplnit, :vacac, '', 'N', 'S', 'N', 'N', 0, :anoact, 'N', 'N', 'N', 'S');
item = :item + 1;
end
    SUSPEND;
  END
END
^

SET TERM ; ^


update RDB$RELATION_FIELDS set
RDB$NULL_FLAG = NULL
where (RDB$FIELD_NAME = 'NOCO_ANO') and
(RDB$RELATION_NAME = 'NOMINA_CONCEPTOS')
;

SET TERM ^ ;

ALTER PROCEDURE LIQUIDACION_APORTES(
    ID_NOMINA_1 INTEGER,
    ID_NOMINA_2 INTEGER,
    ID_NOMINA_3 INTEGER,
    ID_NOMINA_4 INTEGER,
    ID_NOMINA_5 INTEGER,
    ID_NOMINA_6 INTEGER,
    ID_NOMINA_7 INTEGER,
    INTMORA NUMERIC(18,2),
    FECHA DATE,
    FORMULARIO VARCHAR(10))
RETURNS (
    IDAPORTE INTEGER)
AS
declare variable itemaportadmi integer;
declare variable itemdetaport integer;
declare variable nit varchar(20);
declare variable eps char(1);
declare variable afp char(1);
declare variable ccf char(1);
declare variable afc char(1);
declare variable arp char(1);
declare variable nombreadmin varchar(60);
declare variable totadmin numeric(18,2);
declare variable totadminneg numeric(18,2);
declare variable tipoaport char(1);
declare variable ano char(4);
declare variable nitempl varchar(20);
declare variable totdetvalor numeric(18,2);
declare variable totdetvalorneg numeric(18,2);
declare variable totibc integer;
begin
itemaportadmi = 1;
itemdetaport = 1;
ANO = SUBSTR(fecha, 1, 4);
idaporte = gen_id(id_pgaport,1);
select PAAN_TIPOAPORT from parametros_ano where PAAN_ANO = :ANO into :tipoaport;
for select A.TERC_NIT, A.ADMI_EPS, A.ADMI_AFP, A.ADMI_CCF, A.ADMI_AFC, A.ADMI_ARP, T.TERC_NOM from ADMINISTRADORA A, TERCEROS t
  where T.TERC_NIT = A.TERC_NIT and t.terc_admini = 'S' Into :nit, :eps, :afp, :CCF, :afc, :arp, :nombreadmin
  do
  begin
  select sum (noco_valor) from nomina_conceptos N
  where (N.noco_aporte = 'S' and N.noco_entidad = :nit and N.nomi_id = :id_nomina_1 AND N.noco_valor > 0) or
        (N.noco_aporte = 'S' and N.noco_entidad = :nit and N.nomi_id = :id_nomina_2 AND N.noco_valor > 0)or
        (N.noco_aporte = 'S' and N.noco_entidad = :nit and N.nomi_id = :id_nomina_3 AND N.noco_valor > 0) or
        (N.noco_aporte = 'S' and N.noco_entidad = :nit and N.nomi_id = :id_nomina_4 AND N.noco_valor > 0) or
        (N.noco_aporte = 'S' and N.noco_entidad = :nit and N.nomi_id = :id_nomina_5 AND N.noco_valor > 0) or
        (N.noco_aporte = 'S' and N.noco_entidad = :nit and N.nomi_id = :id_nomina_6 AND N.noco_valor > 0) or
        (N.noco_aporte = 'S' and N.noco_entidad = :nit and N.nomi_id = :id_nomina_7 AND N.noco_valor > 0)
  into :totadmin;
  select sum (noco_valor*(-1)) from nomina_conceptos N
  where (N.noco_aporte = 'S' and N.noco_entidad = :nit and N.nomi_id = :id_nomina_1 AND N.noco_valor < 0) or
        (N.noco_aporte = 'S' and N.noco_entidad = :nit and N.nomi_id = :id_nomina_2 AND N.noco_valor < 0)or
        (N.noco_aporte = 'S' and N.noco_entidad = :nit and N.nomi_id = :id_nomina_3 AND N.noco_valor < 0) or
        (N.noco_aporte = 'S' and N.noco_entidad = :nit and N.nomi_id = :id_nomina_4 AND N.noco_valor < 0) or
        (N.noco_aporte = 'S' and N.noco_entidad = :nit and N.nomi_id = :id_nomina_5 AND N.noco_valor < 0) or
        (N.noco_aporte = 'S' and N.noco_entidad = :nit and N.nomi_id = :id_nomina_6 AND N.noco_valor < 0) or
        (N.noco_aporte = 'S' and N.noco_entidad = :nit and N.nomi_id = :id_nomina_7 AND N.noco_valor < 0)
  into :totadminneg;
  totadmin = :totadminneg + :totadmin;
  if (totadmin IS NOT NULL) then
  BEGIN
  insert into pago_aportes (pgap_id, pgap_item, pgap_tipoap, pgap_conpago, pgap_admin, pgap_monto, pgap_intmora, pgap_fecha, pgap_formulario) values
                           (:idaporte, :itemaportadmi, :tipoaport, '', :nit, :totadmin, :intmora, :fecha, :formulario);
  if (CCF = 'S') then
  for select TERC_NIT from EMPLEADOS where EMPL_CCF = :NIT into :nitempl
  do
  begin
  select sum (NOCO_VALOR) from NOMINA_CONCEPTOS
  where (TERC_NIT = :nitempl and NOCO_SALARIO = 'S' and nomi_id = :id_nomina_1) or
        (TERC_NIT = :nitempl and NOCO_SALARIO = 'S' and nomi_id = :id_nomina_2) or
        (TERC_NIT = :nitempl and NOCO_SALARIO = 'S' and nomi_id = :id_nomina_3) or
        (TERC_NIT = :nitempl and NOCO_SALARIO = 'S' and nomi_id = :id_nomina_4) or
        (TERC_NIT = :nitempl and NOCO_SALARIO = 'S' and nomi_id = :id_nomina_5) or
        (TERC_NIT = :nitempl and NOCO_SALARIO = 'S' and nomi_id = :id_nomina_6) or
        (TERC_NIT = :nitempl and NOCO_SALARIO = 'S' and nomi_id = :id_nomina_7)
        into :totibc;
  select sum (NOCO_VALOR) from NOMINA_CONCEPTOS
  where (TERC_NIT = :nitempl and NOCO_ENTIDAD = :nit and NOCO_APORTE = 'S' and nomi_id = :id_nomina_1 AND noco_valor > 0) or
        (TERC_NIT = :nitempl and NOCO_ENTIDAD = :nit and NOCO_APORTE = 'S' and nomi_id = :id_nomina_2 AND noco_valor > 0) or
        (TERC_NIT = :nitempl and NOCO_ENTIDAD = :nit and NOCO_APORTE = 'S' and nomi_id = :id_nomina_3 AND noco_valor > 0) or
        (TERC_NIT = :nitempl and NOCO_ENTIDAD = :nit and NOCO_APORTE = 'S' and nomi_id = :id_nomina_4 AND noco_valor > 0) or
        (TERC_NIT = :nitempl and NOCO_ENTIDAD = :nit and NOCO_APORTE = 'S' and nomi_id = :id_nomina_5 AND noco_valor > 0) or
        (TERC_NIT = :nitempl and NOCO_ENTIDAD = :nit and NOCO_APORTE = 'S' and nomi_id = :id_nomina_6 AND noco_valor > 0) or
        (TERC_NIT = :nitempl and NOCO_ENTIDAD = :nit and NOCO_APORTE = 'S' and nomi_id = :id_nomina_7 AND noco_valor > 0)
        into :totdetvalor;
  select sum (NOCO_VALOR) from NOMINA_CONCEPTOS
  where (TERC_NIT = :nitempl and NOCO_ENTIDAD = :nit and NOCO_APORTE = 'S' and nomi_id = :id_nomina_1 AND noco_valor < 0) or
        (TERC_NIT = :nitempl and NOCO_ENTIDAD = :nit and NOCO_APORTE = 'S' and nomi_id = :id_nomina_2 AND noco_valor < 0) or
        (TERC_NIT = :nitempl and NOCO_ENTIDAD = :nit and NOCO_APORTE = 'S' and nomi_id = :id_nomina_3 AND noco_valor < 0) or
        (TERC_NIT = :nitempl and NOCO_ENTIDAD = :nit and NOCO_APORTE = 'S' and nomi_id = :id_nomina_4 AND noco_valor < 0) or
        (TERC_NIT = :nitempl and NOCO_ENTIDAD = :nit and NOCO_APORTE = 'S' and nomi_id = :id_nomina_5 AND noco_valor < 0) or
        (TERC_NIT = :nitempl and NOCO_ENTIDAD = :nit and NOCO_APORTE = 'S' and nomi_id = :id_nomina_6 AND noco_valor < 0) or
        (TERC_NIT = :nitempl and NOCO_ENTIDAD = :nit and NOCO_APORTE = 'S' and nomi_id = :id_nomina_7 AND noco_valor < 0)
        into :totdetvalorneg;
  totdetvalor = :totdetvalorneg + :totdetvalor;
  if ((:totdetvalor is not null) and (:totibc is not null)) then
  begin
  insert into PAGO_APORTES_DETALLE (pgap_id, pgap_item, pade_itemdet, terc_nit, pade_ibc, pade_cotobl)
                             values(:idaporte, :itemaportadmi, :itemdetaport, :nitempl, :totibc, :totdetvalor);
    itemdetaport = :itemdetaport + 1;
  end
  end
if (EPS = 'S') then
  for select TERC_NIT from EMPLEADOS where EMPL_EPS = :NIT into :nitempl
  do
  begin
  select sum (NOCO_VALOR) from NOMINA_CONCEPTOS
  where (TERC_NIT = :nitempl and NOCO_SALARIO = 'S' and nomi_id = :id_nomina_1) or
        (TERC_NIT = :nitempl and NOCO_SALARIO = 'S' and nomi_id = :id_nomina_2) or
        (TERC_NIT = :nitempl and NOCO_SALARIO = 'S' and nomi_id = :id_nomina_3) or
        (TERC_NIT = :nitempl and NOCO_SALARIO = 'S' and nomi_id = :id_nomina_4) or
        (TERC_NIT = :nitempl and NOCO_SALARIO = 'S' and nomi_id = :id_nomina_5) or
        (TERC_NIT = :nitempl and NOCO_SALARIO = 'S' and nomi_id = :id_nomina_6) or
        (TERC_NIT = :nitempl and NOCO_SALARIO = 'S' and nomi_id = :id_nomina_7)
        into :totibc;
  select sum (NOCO_VALOR) from NOMINA_CONCEPTOS
  where (TERC_NIT = :nitempl and NOCO_ENTIDAD = :nit and NOCO_APORTE = 'S' and nomi_id = :id_nomina_1) or
        (TERC_NIT = :nitempl and NOCO_ENTIDAD = :nit and NOCO_APORTE = 'S' and nomi_id = :id_nomina_2) or
        (TERC_NIT = :nitempl and NOCO_ENTIDAD = :nit and NOCO_APORTE = 'S' and nomi_id = :id_nomina_3) or
        (TERC_NIT = :nitempl and NOCO_ENTIDAD = :nit and NOCO_APORTE = 'S' and nomi_id = :id_nomina_4) or
        (TERC_NIT = :nitempl and NOCO_ENTIDAD = :nit and NOCO_APORTE = 'S' and nomi_id = :id_nomina_5) or
        (TERC_NIT = :nitempl and NOCO_ENTIDAD = :nit and NOCO_APORTE = 'S' and nomi_id = :id_nomina_6) or
        (TERC_NIT = :nitempl and NOCO_ENTIDAD = :nit and NOCO_APORTE = 'S' and nomi_id = :id_nomina_7)
        into :totdetvalor;
  select sum (NOCO_VALOR) from NOMINA_CONCEPTOS
  where (TERC_NIT = :nitempl and NOCO_ENTIDAD = :nit and NOCO_APORTE = 'S' and nomi_id = :id_nomina_1 AND noco_valor < 0) or
        (TERC_NIT = :nitempl and NOCO_ENTIDAD = :nit and NOCO_APORTE = 'S' and nomi_id = :id_nomina_2 AND noco_valor < 0) or
        (TERC_NIT = :nitempl and NOCO_ENTIDAD = :nit and NOCO_APORTE = 'S' and nomi_id = :id_nomina_3 AND noco_valor < 0) or
        (TERC_NIT = :nitempl and NOCO_ENTIDAD = :nit and NOCO_APORTE = 'S' and nomi_id = :id_nomina_4 AND noco_valor < 0) or
        (TERC_NIT = :nitempl and NOCO_ENTIDAD = :nit and NOCO_APORTE = 'S' and nomi_id = :id_nomina_5 AND noco_valor < 0) or
        (TERC_NIT = :nitempl and NOCO_ENTIDAD = :nit and NOCO_APORTE = 'S' and nomi_id = :id_nomina_6 AND noco_valor < 0) or
        (TERC_NIT = :nitempl and NOCO_ENTIDAD = :nit and NOCO_APORTE = 'S' and nomi_id = :id_nomina_7 AND noco_valor < 0)
        into :totdetvalorneg;
  totdetvalor = :totdetvalorneg + :totdetvalor;
  if ((:totdetvalor is not null) and (:totibc is not null)) then
  begin
  insert into PAGO_APORTES_DETALLE (pgap_id, pgap_item, pade_itemdet, terc_nit, pade_ibc, pade_cotobl)
                             values(:idaporte, :itemaportadmi, :itemdetaport, :nitempl, :totibc, :totdetvalor);
    itemdetaport = :itemdetaport + 1;
  end
  end
if (afp = 'S') then
  for select TERC_NIT from EMPLEADOS where EMPL_AFP = :NIT into :nitempl
  do
  begin
  select sum (NOCO_VALOR) from NOMINA_CONCEPTOS
  where (TERC_NIT = :nitempl and NOCO_SALARIO = 'S' and nomi_id = :id_nomina_1) or
        (TERC_NIT = :nitempl and NOCO_SALARIO = 'S' and nomi_id = :id_nomina_2) or
        (TERC_NIT = :nitempl and NOCO_SALARIO = 'S' and nomi_id = :id_nomina_3) or
        (TERC_NIT = :nitempl and NOCO_SALARIO = 'S' and nomi_id = :id_nomina_4) or
        (TERC_NIT = :nitempl and NOCO_SALARIO = 'S' and nomi_id = :id_nomina_5) or
        (TERC_NIT = :nitempl and NOCO_SALARIO = 'S' and nomi_id = :id_nomina_6) or
        (TERC_NIT = :nitempl and NOCO_SALARIO = 'S' and nomi_id = :id_nomina_7)
        into :totibc;
  select sum (NOCO_VALOR) from NOMINA_CONCEPTOS
  where (TERC_NIT = :nitempl and NOCO_ENTIDAD = :nit and NOCO_APORTE = 'S' and nomi_id = :id_nomina_1) or
        (TERC_NIT = :nitempl and NOCO_ENTIDAD = :nit and NOCO_APORTE = 'S' and nomi_id = :id_nomina_2) or
        (TERC_NIT = :nitempl and NOCO_ENTIDAD = :nit and NOCO_APORTE = 'S' and nomi_id = :id_nomina_3) or
        (TERC_NIT = :nitempl and NOCO_ENTIDAD = :nit and NOCO_APORTE = 'S' and nomi_id = :id_nomina_4) or
        (TERC_NIT = :nitempl and NOCO_ENTIDAD = :nit and NOCO_APORTE = 'S' and nomi_id = :id_nomina_5) or
        (TERC_NIT = :nitempl and NOCO_ENTIDAD = :nit and NOCO_APORTE = 'S' and nomi_id = :id_nomina_6) or
        (TERC_NIT = :nitempl and NOCO_ENTIDAD = :nit and NOCO_APORTE = 'S' and nomi_id = :id_nomina_7)
        into :totdetvalor;
  if ((:totdetvalor is not null) and (:totibc is not null)) then
  begin
  insert into PAGO_APORTES_DETALLE (pgap_id, pgap_item, pade_itemdet, terc_nit, pade_ibc, pade_cotobl)
                             values(:idaporte, :itemaportadmi, :itemdetaport, :nitempl, :totibc, :totdetvalor);
    itemdetaport = :itemdetaport + 1;
  end
  end
if (AFC = 'S') then
  for select TERC_NIT from EMPLEADOS where EMPL_AFC = :NIT into :nitempl
  do
  begin
  select sum (NOCO_VALOR) from NOMINA_CONCEPTOS
  where (TERC_NIT = :nitempl and NOCO_SALARIO = 'S' and nomi_id = :id_nomina_1) or
        (TERC_NIT = :nitempl and NOCO_SALARIO = 'S' and nomi_id = :id_nomina_2) or
        (TERC_NIT = :nitempl and NOCO_SALARIO = 'S' and nomi_id = :id_nomina_3) or
        (TERC_NIT = :nitempl and NOCO_SALARIO = 'S' and nomi_id = :id_nomina_4) or
        (TERC_NIT = :nitempl and NOCO_SALARIO = 'S' and nomi_id = :id_nomina_5) or
        (TERC_NIT = :nitempl and NOCO_SALARIO = 'S' and nomi_id = :id_nomina_6) or
        (TERC_NIT = :nitempl and NOCO_SALARIO = 'S' and nomi_id = :id_nomina_7)
        into :totibc;
  select sum (NOCO_VALOR) from NOMINA_CONCEPTOS
  where (TERC_NIT = :nitempl and NOCO_ENTIDAD = :nit and NOCO_APORTE = 'S' and nomi_id = :id_nomina_1) or
        (TERC_NIT = :nitempl and NOCO_ENTIDAD = :nit and NOCO_APORTE = 'S' and nomi_id = :id_nomina_2) or
        (TERC_NIT = :nitempl and NOCO_ENTIDAD = :nit and NOCO_APORTE = 'S' and nomi_id = :id_nomina_3) or
        (TERC_NIT = :nitempl and NOCO_ENTIDAD = :nit and NOCO_APORTE = 'S' and nomi_id = :id_nomina_4) or
        (TERC_NIT = :nitempl and NOCO_ENTIDAD = :nit and NOCO_APORTE = 'S' and nomi_id = :id_nomina_5) or
        (TERC_NIT = :nitempl and NOCO_ENTIDAD = :nit and NOCO_APORTE = 'S' and nomi_id = :id_nomina_6) or
        (TERC_NIT = :nitempl and NOCO_ENTIDAD = :nit and NOCO_APORTE = 'S' and nomi_id = :id_nomina_7)
        into :totdetvalor;
  if ((:totdetvalor is not null) and (:totibc is not null)) then
  begin
  insert into PAGO_APORTES_DETALLE (pgap_id, pgap_item, pade_itemdet, terc_nit, pade_ibc, pade_cotobl)
                             values(:idaporte, :itemaportadmi, :itemdetaport, :nitempl, :totibc, :totdetvalor);
    itemdetaport = :itemdetaport + 1;
  end
  end
if (ARP = 'S') then
  for select TERC_NIT from EMPLEADOS where EMPL_ARP = :NIT into :nitempl
  do
  begin
  select sum (NOCO_VALOR) from NOMINA_CONCEPTOS
  where (TERC_NIT = :nitempl and NOCO_SALARIO = 'S' and nomi_id = :id_nomina_1) or
        (TERC_NIT = :nitempl and NOCO_SALARIO = 'S' and nomi_id = :id_nomina_2) or
        (TERC_NIT = :nitempl and NOCO_SALARIO = 'S' and nomi_id = :id_nomina_3) or
        (TERC_NIT = :nitempl and NOCO_SALARIO = 'S' and nomi_id = :id_nomina_4) or
        (TERC_NIT = :nitempl and NOCO_SALARIO = 'S' and nomi_id = :id_nomina_5) or
        (TERC_NIT = :nitempl and NOCO_SALARIO = 'S' and nomi_id = :id_nomina_6) or
        (TERC_NIT = :nitempl and NOCO_SALARIO = 'S' and nomi_id = :id_nomina_7)
        into :totibc;
  select sum (NOCO_VALOR) from NOMINA_CONCEPTOS
  where (TERC_NIT = :nitempl and NOCO_ENTIDAD = :nit and NOCO_APORTE = 'S' and nomi_id = :id_nomina_1) or
        (TERC_NIT = :nitempl and NOCO_ENTIDAD = :nit and NOCO_APORTE = 'S' and nomi_id = :id_nomina_2) or
        (TERC_NIT = :nitempl and NOCO_ENTIDAD = :nit and NOCO_APORTE = 'S' and nomi_id = :id_nomina_3) or
        (TERC_NIT = :nitempl and NOCO_ENTIDAD = :nit and NOCO_APORTE = 'S' and nomi_id = :id_nomina_4) or
        (TERC_NIT = :nitempl and NOCO_ENTIDAD = :nit and NOCO_APORTE = 'S' and nomi_id = :id_nomina_5) or
        (TERC_NIT = :nitempl and NOCO_ENTIDAD = :nit and NOCO_APORTE = 'S' and nomi_id = :id_nomina_6) or
        (TERC_NIT = :nitempl and NOCO_ENTIDAD = :nit and NOCO_APORTE = 'S' and nomi_id = :id_nomina_7)
        into :totdetvalor;
  if ((:totdetvalor is not null) and (:totibc is not null)) then
  begin
  insert into PAGO_APORTES_DETALLE (pgap_id, pgap_item, pade_itemdet, terc_nit, pade_ibc, pade_cotobl)
                             values(:idaporte, :itemaportadmi, :itemdetaport, :nitempl, :totibc, :totdetvalor);
    itemdetaport = :itemdetaport + 1;
  end
  end
  update nomina n set n.nomi_aporok = 'S' where N.NOMI_ID = :id_nomina_1 or (N.NOMI_ID = :id_nomina_2) or (N.NOMI_ID = :id_nomina_3) or (N.NOMI_ID = :id_nomina_4)
  or (N.NOMI_ID = :id_nomina_5) or (N.NOMI_ID = :id_nomina_6) or (N.NOMI_ID = :id_nomina_7);
  if (totadmin IS NOT NULL) then
  itemaportadmi = :itemaportadmi + 1;
  itemdetaport = 1;
  SUSPEND;
  END
end
end
^

SET TERM ; ^

SET TERM ^ ; 



/******************************************************************************/
/****                          Stored Procedures                           ****/
/******************************************************************************/

CREATE PROCEDURE CEROS_ANCHO_FIJO (
    DATO VARCHAR(200) CHARACTER SET NONE,
    LONGDATO INTEGER,
    TIPODATO CHAR(1) CHARACTER SET NONE)
RETURNS (
    DATOCEROS VARCHAR(200) CHARACTER SET NONE)
AS
BEGIN
  EXIT;
END^



SET TERM ; ^

SET TERM ^ ; 



/******************************************************************************/
/****                          Stored Procedures                           ****/
/******************************************************************************/

CREATE PROCEDURE FORM_INTEGRADO_ELECTRONICO (
    IDDOC INTEGER,
    FECLIQ VARCHAR(8) CHARACTER SET NONE,
    CODOPER VARCHAR(2) CHARACTER SET NONE)
RETURNS (
    DATOS VARCHAR(591) CHARACTER SET NONE)
AS
BEGIN
  EXIT;
END^



SET TERM ; ^


/******************************************************************************/
/****                          Stored Procedures                           ****/
/******************************************************************************/


SET TERM ^ ;

ALTER PROCEDURE FORM_INTEGRADO_ELECTRONICO (
    IDDOC INTEGER,
    FECLIQ VARCHAR(8) CHARACTER SET NONE,
    CODOPER VARCHAR(2) CHARACTER SET NONE)
RETURNS (
    DATOS VARCHAR(591) CHARACTER SET NONE)
AS
DECLARE VARIABLE tipreg VARCHAR(2);
DECLARE VARIABLE sec VARCHAR(5);
DECLARE VARIABLE nomcia VARCHAR(200);
DECLARE VARIABLE tipdocaport VARCHAR(2);
DECLARE VARIABLE nitcia VARCHAR(16);
DECLARE VARIABLE dvcia VARCHAR(1);
DECLARE VARIABLE formapresent VARCHAR(1);
DECLARE VARIABLE codsucur VARCHAR(10);
DECLARE VARIABLE nomsucur VARCHAR(40);
DECLARE VARIABLE codarp VARCHAR(6);
DECLARE VARIABLE perliq VARCHAR(7);
DECLARE VARIABLE perliqsalud CHAR(6);
DECLARE VARIABLE numform VARCHAR(10);
DECLARE VARIABLE vlornomi VARCHAR(12);
DECLARE VARIABLE vlornomiint INTEGER;
DECLARE VARIABLE nitempl VARCHAR(16);
DECLARE VARIABLE SECINT INTEGER;
DECLARE VARIABLE TIPOID VARCHAR(2);
DECLARE VARIABLE TIPOCOT VARCHAR(2);
DECLARE VARIABLE NOM1 VARCHAR(20);
DECLARE VARIABLE NOM2 VARCHAR(30);
DECLARE VARIABLE APE1 VARCHAR(20);
DECLARE VARIABLE APE2 VARCHAR(30);
DECLARE VARIABLE fecing DATE;
DECLARE VARIABLE fecret DATE;
DECLARE VARIABLE countnov INTEGER;
DECLARE VARIABLE novedad VARCHAR(1);
DECLARE VARIABLE codadmin VARCHAR(6);
DECLARE VARIABLE diaslab VARCHAR(3);
DECLARE VARIABLE salminimo VARCHAR(22);
DECLARE VARIABLE fecanomes CHAR(7);
DECLARE VARIABLE salbasic VARCHAR(22);
declare variable incap VARCHAR(2);
BEGIN
TIPREG = '01';
DATOS = :tipreg;
SEC = '00001';
DATOS = :DATOS || :sec;
EXECUTE PROCEDURE LEE_CONFIGURACION ('GENERAL','GENERAL','NOMBRE COMPAÑIA') RETURNING_VALUES (:nomcia);
EXECUTE PROCEDURE CEROS_ANCHO_FIJO (:nomcia, 200, 'A') RETURNING_VALUES (:nomcia);
DATOS = :DATOS || :nomcia;
DATOS = :DATOS || 'NI';
EXECUTE PROCEDURE LEE_CONFIGURACION ('CONTABILIDAD','GENERAL','NIT COMPAÑIA') RETURNING_VALUES (:nitcia);
EXECUTE PROCEDURE DV (nitcia) RETURNING_VALUES (dvcia);
EXECUTE PROCEDURE CEROS_ANCHO_FIJO (:nitcia, 16, 'A') RETURNING_VALUES (:nitcia);
DATOS = :DATOS || :nitcia;
DATOS = :DATOS || :dvcia;
FORMAPRESENT = 'U';
DATOS = :DATOS || :formapresent;
codsucur = '';
EXECUTE PROCEDURE CEROS_ANCHO_FIJO (:codsucur, 10, 'A') RETURNING_VALUES (:codsucur);
DATOS = :DATOS || :codsucur;
nomsucur = '';
EXECUTE PROCEDURE CEROS_ANCHO_FIJO (:nomsucur, 40, 'A') RETURNING_VALUES (:nomsucur);
DATOS = :DATOS || :nomsucur;
SELECT ADMI_CODARP FROM ADMINISTRADORA A, PARAMETROS_ANO P WHERE P.paan_nitarp = A.terc_nit INTO :codarp;
EXECUTE PROCEDURE CEROS_ANCHO_FIJO (:codarp, 6, 'A') RETURNING_VALUES (:codarp);
DATOS = :DATOS || :codarp;
SELECT SUBSTRING(P.pgap_fecha FROM 1 FOR 7) FROM PAGO_APORTES P WHERE P.pgap_id = :iddoc AND p.pgap_item = 1 INTO :perliq;
perliq = substr(perliq, 1,4) || substr(perliq, 6,8);
DATOS = :DATOS || :perliq;
perliqsalud = :perliq;
DATOS = :DATOS || :perliqsalud;
SELECT pgap_formulario FROM PAGO_APORTES WHERE PGAP_ID = :iddoc AND pgap_item = 1 INTO :numform;
EXECUTE PROCEDURE CEROS_ANCHO_FIJO (:numform, 10, 'A') RETURNING_VALUES (:numform);
DATOS = :DATOS || :numform;
DATOS = :DATOS || :fecliq;
/*EXECUTE PROCEDURE CEROS_ANCHO_FIJO (:nroemple, 5, 'N') RETURNING_VALUES (:nroemple);
DATOS = :DATOS || :nroemple; */
SELECT SUM(pade_ibc) FROM PAGO_APORTES_DETALLE WHERE PGAP_ID = :iddoc INTO :vlornomi;
vlornomiint = CAST(:vlornomi AS INTEGER);
vlornomi = CAST(vlornomiint AS VARCHAR(12));
EXECUTE PROCEDURE CEROS_ANCHO_FIJO (:vlornomi, 12, 'N') RETURNING_VALUES (:vlornomi);
DATOS = :DATOS || :vlornomi;
EXECUTE PROCEDURE CEROS_ANCHO_FIJO (:codoper, 2, 'N') RETURNING_VALUES (:codoper);
DATOS = :DATOS || :codoper;
SUSPEND;
datos = '';
secint = 1;
FOR SELECT e.terc_nit, T.terc_tipoid, E.tcot_cod, T.terc_nombre1, T.terc_nombre2, T.terc_apellido1, T.terc_apellido2, E.empl_fecing, e.empl_fecret FROM empleados e, TERCEROS T
WHERE (e.empl_fecret > substr(:fecliq,1,4) || '/' || substr(:fecliq,5,6) || '/' || substr(:fecliq,7,8) OR (e.empl_fecret IS NULL))  AND e.empl_fecing < substr(:fecliq,1,4) || '/' || substr(:fecliq,5,6) || '/' || substr(:fecliq,7,8) AND T.terc_nit = E.terc_nit
INTO :nitempl, :tipoid, :tipocot, :nom1, :nom2, :ape1, :ape2, :fecing, :fecret
DO
 BEGIN
    tipreg  = '02';
    DATOS = :datos || tipreg;
    secint = secint + 1;
    EXECUTE PROCEDURE CEROS_ANCHO_FIJO (CAST(secint AS VARCHAR(200)), 5, 'N') RETURNING_VALUES (:sec);
    DATOS = DATOS || :SEC;
    IF (:tipoid = 'N') THEN
    tipoid = 'NI';
    IF (:tipoid = 'C') THEN
    tipoid = 'CC';
    IF (:tipoid = 'E') THEN
    tipoid = 'CE';
    IF (:tipoid = 'T') THEN
    tipoid = 'TI';
    IF (:tipoid = 'R') THEN
    tipoid = 'RC';
    IF (:tipoid = 'P') THEN
    tipoid = 'PA';
    IF (:tipoid = 'J') THEN
    tipoid = 'CC';
    DATOS = DATOS || tipoid;
    EXECUTE PROCEDURE CEROS_ANCHO_FIJO (:nitempl, 16, 'A') RETURNING_VALUES (:nitempl);
    DATOS = DATOS || :nitempl;
    datos = datos || '0';
    EXECUTE PROCEDURE CEROS_ANCHO_FIJO (:tipocot, 1, 'N') RETURNING_VALUES (:tipocot);
    datos = datos || :tipocot;
    EXECUTE PROCEDURE CEROS_ANCHO_FIJO (:ape1, 20, 'A') RETURNING_VALUES (:ape1);
    IF (ape1 IS NULL) THEN
    ape1 = '';
    DATOS = DATOS || :ape1;
    EXECUTE PROCEDURE CEROS_ANCHO_FIJO (:ape2, 30, 'A') RETURNING_VALUES (:ape2);
    IF (ape2 IS NULL) THEN
    ape2 = '';
    DATOS = DATOS || :ape2;
    EXECUTE PROCEDURE CEROS_ANCHO_FIJO (:nom1, 20, 'A') RETURNING_VALUES (:nom1);
    IF (nom1 IS NULL) THEN
    nom1 = '';
    DATOS = DATOS || :nom1;
    EXECUTE PROCEDURE CEROS_ANCHO_FIJO (:nom2, 30, 'A') RETURNING_VALUES (:nom2);
    IF (nom2 IS NULL) THEN
    nom2 = '';
    DATOS = DATOS || :nom2;
    IF ((substr(:fecing,6,7) = substr(:fecliq,5,6)) AND (substr(:fecing,1,4) = substr(:fecliq,1,4))) THEN
    novedad = 'X';
    ELSE
    novedad = ' ';
    datos = :datos || :novedad;
    IF (:fecret IS NOT NULL AND (substr(:fecret,6,7) = substr(:fecliq,5,6))) THEN
    novedad = 'X';
    ELSE
    novedad = ' ';
    datos = :datos || :novedad;
    SELECT COUNT(*) FROM nomina_novedades v WHERE (substr(nono_fecha, 1,4) = substr(:fecliq,1,4)) AND (substr(nono_fecha, 6,7) = substr(:fecliq,6,7)) AND v.tnov_cod = 5 AND V.nono_tipoadm = 'E' INTO :countnov;
    IF (:countnov > 0) THEN
    novedad = 'X';
    ELSE
    novedad = ' ';
    datos = :datos || :novedad;
   SELECT COUNT(*) FROM nomina_novedades v WHERE (substr(nono_fecha, 1,4) = substr(:fecliq,1,4)) AND (substr(nono_fecha, 6,7) = substr(:fecliq,6,7)) AND v.tnov_cod = 5 AND V.nono_tipoadm = 'E' INTO :countnov;
    IF (:countnov > 0) THEN
    novedad = 'X';
    ELSE
    novedad = ' ';
    datos = :datos || :novedad;
    SELECT COUNT(*) FROM nomina_novedades v WHERE (substr(nono_fecha, 1,4) = substr(:fecliq,1,4)) AND (substr(nono_fecha, 6,7) = substr(:fecliq,6,7)) AND v.tnov_cod = 5 AND V.nono_tipoadm = 'A' INTO :countnov;
    IF (:countnov > 0) THEN
    novedad = 'X';
    ELSE
    novedad = ' ';
    datos = :datos || :novedad;    
    SELECT COUNT(*) FROM nomina_novedades v WHERE (substr(nono_fecha, 1,4) = substr(:fecliq,1,4)) AND (substr(nono_fecha, 6,7) = substr(:fecliq,6,7)) AND v.tnov_cod = 5 AND V.nono_tipoadm = 'A' INTO :countnov;
    IF (:countnov > 0) THEN
    novedad = 'X';
    ELSE
    novedad = ' ';
    datos = :datos || :novedad;
    SELECT COUNT(*) FROM nomina_novedades v WHERE (substr(nono_fecha, 1,4) = substr(:fecliq,1,4)) AND (substr(nono_fecha, 6,7) = substr(:fecliq,6,7)) AND v.tnov_cod = 8 AND V.nono_tipoadm = 'A' INTO :countnov;
    IF (:countnov > 0) THEN
    novedad = 'X';
    ELSE
    novedad = ' ';
    datos = :datos || :novedad;
    SELECT COUNT(*) FROM nomina_novedades v WHERE (substr(nono_fecha, 1,4) = substr(:fecliq,1,4)) AND (substr(nono_fecha, 6,7) = substr(:fecliq,6,7)) AND v.tnov_cod = 10 AND V.nono_tipoadm = 'A' INTO :countnov;
    IF (:countnov > 0) THEN
    novedad = 'X';
    ELSE
    novedad = ' ';
    datos = :datos || :novedad;
    SELECT COUNT(*) FROM nomina_novedades v WHERE (substr(nono_fecha, 1,4) = substr(:fecliq,1,4)) AND (substr(nono_fecha, 6,7) = substr(:fecliq,6,7)) AND v.tnov_cod = 11 INTO :countnov;
    IF (:countnov > 0) THEN
    novedad = 'X';
    ELSE
    novedad = ' ';
    datos = :datos || :novedad;    
    SELECT COUNT(*) FROM nomina_novedades v WHERE (substr(nono_fecha, 1,4) = substr(:fecliq,1,4)) AND (substr(nono_fecha, 6,7) = substr(:fecliq,6,7)) AND v.tnov_cod = 9 INTO :countnov;
    IF (:countnov > 0) THEN
    novedad = 'X';
    ELSE
    novedad = ' ';
    datos = :datos || :novedad;    
    SELECT COUNT(*) FROM nomina_novedades v WHERE (substr(nono_fecha, 1,4) = substr(:fecliq,1,4)) AND (substr(nono_fecha, 6,7) = substr(:fecliq,6,7)) AND v.tnov_cod = 2 INTO :countnov;
    IF (:countnov > 0) THEN
    novedad = 'X';
    ELSE
    novedad = ' ';
    datos = :datos || :novedad;    
    SELECT COUNT(*) FROM nomina_novedades v WHERE (substr(nono_fecha, 1,4) = substr(:fecliq,1,4)) AND (substr(nono_fecha, 6,7) = substr(:fecliq,6,7)) AND v.tnov_cod = 4 INTO :countnov;
    IF (:countnov > 0) THEN
    novedad = 'X';
    ELSE
    novedad = ' ';
    datos = :datos || :novedad;
    SELECT COUNT(*) FROM nomina_novedades v WHERE (substr(nono_fecha, 1,4) = substr(:fecliq,1,4)) AND (substr(nono_fecha, 6,7) = substr(:fecliq,6,7)) AND v.tnov_cod = 6 INTO :countnov;
    IF (:countnov > 0) THEN
    novedad = 'X';
    ELSE
    novedad = ' ';
    datos = :datos || :novedad;    
    SELECT COUNT(*) FROM nomina_novedades v WHERE (substr(nono_fecha, 1,4) = substr(:fecliq,1,4)) AND (substr(nono_fecha, 6,7) = substr(:fecliq,6,7)) AND v.tnov_cod = 1 INTO :countnov;
    IF (:countnov > 0) THEN
    novedad = 'X';
    ELSE
    novedad = ' ';
    datos = :datos || :novedad;    
    SELECT COUNT(*) FROM nomina_novedades v WHERE (substr(nono_fecha, 1,4) = substr(:fecliq,1,4)) AND (substr(nono_fecha, 6,7) = substr(:fecliq,6,7)) AND v.tnov_cod = 7 INTO :countnov;
    IF (:countnov > 0) THEN
    novedad = 'X';
    ELSE
    novedad = ' ';
    datos = :datos || :novedad;
    SELECT v.nono_dura FROM nomina_novedades v WHERE (substr(nono_fecha, 1,4) = substr(:fecliq,1,4)) AND (substr(nono_fecha, 6,7) = substr(:fecliq,6,7)) AND v.tnov_cod = 3 INTO :countnov;
    IF (:countnov > 0) THEN
    BEGIN
    novedad = :countnov;
    END
    ELSE
    BEGIN
    countnov = 0;
    END
    EXECUTE PROCEDURE CEROS_ANCHO_FIJO (:countnov, 2, 'N') RETURNING_VALUES (:incap);
    datos = :datos || :incap;
    SELECT a.admi_codafp FROM ADMINISTRADORA A, EMPLEADOS E WHERE E.empl_afp = A.terc_nit AND E.terc_nit = :nitempl INTO :codadmin;
    IF (:codadmin IS NULL) THEN
    codadmin = ' ';
    EXECUTE PROCEDURE CEROS_ANCHO_FIJO (:codadmin, 6, 'A') RETURNING_VALUES (:codadmin);
    datos = :datos || :codadmin;
    codadmin = '';
    SELECT A.admi_codafp FROM nomina_novedades v, EMPLEADOS E, ADMINISTRADORA A WHERE (substr(nono_fecha, 1,4) = substr(:fecliq,1,4)) AND (substr(nono_fecha, 6,7) = substr(:fecliq,6,7)) AND v.tnov_cod = 5 AND V.nono_tipoadm = 'A' AND V.nono_nvaadm = A.terc_nit INTO :codadmin;
    IF (:codadmin IS NULL) THEN
    codadmin = ' ';
    EXECUTE PROCEDURE CEROS_ANCHO_FIJO (:codadmin, 6, 'A') RETURNING_VALUES (:codadmin);
    datos = :datos || :codadmin;
    codadmin = '';
    SELECT a.admi_codeps FROM ADMINISTRADORA A, EMPLEADOS E WHERE E.empl_eps = A.terc_nit AND E.terc_nit = :nitempl INTO :codadmin;
    IF (:codadmin IS NULL) THEN
    codadmin = ' ';
    EXECUTE PROCEDURE CEROS_ANCHO_FIJO (:codadmin, 6, 'A') RETURNING_VALUES (:codadmin);
    datos = :datos || :codadmin;
    codadmin = '';
    SELECT A.admi_codeps FROM nomina_novedades v, EMPLEADOS E, ADMINISTRADORA A WHERE (substr(nono_fecha, 1,4) = substr(:fecliq,1,4)) AND (substr(nono_fecha, 6,7) = substr(:fecliq,6,7)) AND v.tnov_cod = 5 AND V.nono_tipoadm = 'E' AND V.nono_nvaadm = A.terc_nit INTO :codadmin;
    IF (:codadmin IS NULL) THEN
    codadmin = ' ';
    SELECT A.admi_codeps FROM nomina_novedades v, EMPLEADOS E, ADMINISTRADORA A WHERE (substr(nono_fecha, 1,4) = substr(:fecliq,1,4)) AND (substr(nono_fecha, 6,7) = substr(:fecliq,6,7)) AND v.tnov_cod = 5 AND V.nono_tipoadm = 'E' AND V.nono_nvaadm = A.terc_nit INTO :codadmin;
    IF (:codadmin IS NULL) THEN
    codadmin = ' ';
    EXECUTE PROCEDURE CEROS_ANCHO_FIJO (:codadmin, 6, 'A') RETURNING_VALUES (:codadmin);
    datos = :datos || :codadmin;
    codadmin = '';
    SELECT A.admi_codeps FROM nomina_novedades v, EMPLEADOS E, ADMINISTRADORA A WHERE (substr(nono_fecha, 1,4) = substr(:fecliq,1,4)) AND (substr(nono_fecha, 6,7) = substr(:fecliq,6,7)) AND v.tnov_cod = 5 AND V.nono_tipoadm = 'E' AND V.nono_nvaadm = A.terc_nit INTO :codadmin;
    IF (:codadmin IS NULL) THEN
    codadmin = ' ';
    EXECUTE PROCEDURE CEROS_ANCHO_FIJO (:codadmin, 6, 'A') RETURNING_VALUES (:codadmin);
    datos = :datos || :codadmin;
    codadmin = '';
/*    SELECT A.admi_ccf FROM EMPLEADOS E, ADMINISTRADORA A WHERE A.terc_nit = E.terc_nit AND E.terc_nit = :nitempl INTO :codadmin;
    EXECUTE PROCEDURE CEROS_ANCHO_FIJO (:codadmin, 6, 'A') RETURNING_VALUES (:codadmin);
    datos = :datos || :codadmin;
    codadmin = '';*/
    fecanomes = substr(:fecliq,1,4) || '-' || substr(:fecliq,5,6);
    SELECT SUM(ND.node_diaslab) FROM NOMINA N, NOMINA_DETALLE ND WHERE SUBSTR(N.nomi_feccausa, 1,7) = :fecanomes AND N.nomi_id = ND.nomi_id AND ND.terc_nit = :nitempl INTO :diaslab;
    IF (:diaslab IS NULL) THEN
    diaslab = '00';
    EXECUTE PROCEDURE CEROS_ANCHO_FIJO (:diaslab, 2, 'N') RETURNING_VALUES (:diaslab);
    Datos = :datos || :diaslab;
    SELECT SUM(ND.node_diaslab) FROM NOMINA N, NOMINA_DETALLE ND WHERE SUBSTR(N.nomi_feccausa, 1,7) = :fecanomes AND N.nomi_id = ND.nomi_id AND ND.terc_nit = :nitempl INTO :diaslab;
    IF (:diaslab IS NULL) THEN
    diaslab = '00';
    EXECUTE PROCEDURE CEROS_ANCHO_FIJO (:diaslab, 2, 'N') RETURNING_VALUES (:diaslab);
    Datos = :datos || :diaslab;
    SELECT SUM(ND.node_diaslab) FROM NOMINA N, NOMINA_DETALLE ND WHERE SUBSTR(N.nomi_feccausa, 1,7) = :fecanomes AND N.nomi_id = ND.nomi_id AND ND.terc_nit = :nitempl INTO :diaslab;
    IF (:diaslab IS NULL) THEN
    diaslab = '00';
    EXECUTE PROCEDURE CEROS_ANCHO_FIJO (:diaslab, 2, 'N') RETURNING_VALUES (:diaslab);
    Datos = :datos || :diaslab;
    SELECT e.empl_salario FROM empleados e WHERE e.terc_nit = :nitempl INTO :salbasic;
    IF (:salbasic IS NULL) THEN
    salbasic = '0';
    salbasic = substr(salbasic,1,strlen(salbasic)-3);
    EXECUTE PROCEDURE CEROS_ANCHO_FIJO (:salbasic, 9, 'N') RETURNING_VALUES (:salbasic);
    Datos = :datos || :salbasic;
    SELECT e.empl_salario FROM empleados e WHERE e.terc_nit = :nitempl INTO :salbasic;
    IF (:salbasic IS NULL) THEN
    salbasic = '0';
    execute procedure redondee (salbasic,1000)returning_values(salbasic);
    salbasic = substr(salbasic,1,strlen(salbasic)-5);
    EXECUTE PROCEDURE CEROS_ANCHO_FIJO (:salbasic, 9, 'N') RETURNING_VALUES (:salbasic);
    Datos = :datos || :salbasic;
    Datos = :datos || :salbasic;
    Datos = :datos || :salbasic;
    Datos = :datos || :salbasic;
    Datos = :datos || :salbasic;
    datos = :datos || '0.15';
/*    datos = :datos || '30';
    datos = :datos || '00';
    select P.paan_salminimo from PARAMETROS_ANO P WHERE P.paan_ano = SUBSTR(:fecpago, 1,8) INTO :salminimo;
  */
    SUSPEND;
    datos = '';
    END
END
^


SET TERM ; ^


/******************************************************************************/
/****                              Privileges                              ****/
/******************************************************************************/


/* Privileges of users */
GRANT EXECUTE ON PROCEDURE FORM_INTEGRADO_ELECTRONICO TO PUBLIC;

SET TERM ^ ;

ALTER PROCEDURE FORM_INTEGRADO_ELECTRONICO(
    IDDOC INTEGER,
    FECLIQ VARCHAR(8),
    CODOPER VARCHAR(2))
RETURNS (
    DATOS VARCHAR(591))
AS
DECLARE VARIABLE tipreg VARCHAR(2);
DECLARE VARIABLE sec VARCHAR(5);
DECLARE VARIABLE nomcia VARCHAR(200);
DECLARE VARIABLE tipdocaport VARCHAR(2);
DECLARE VARIABLE nitcia VARCHAR(16);
DECLARE VARIABLE dvcia VARCHAR(1);
DECLARE VARIABLE formapresent VARCHAR(1);
DECLARE VARIABLE codsucur VARCHAR(10);
DECLARE VARIABLE nomsucur VARCHAR(40);
DECLARE VARIABLE codarp VARCHAR(6);
DECLARE VARIABLE perliq VARCHAR(7);
DECLARE VARIABLE perliqsalud CHAR(6);
DECLARE VARIABLE numform VARCHAR(10);
DECLARE VARIABLE vlornomi VARCHAR(12);
DECLARE VARIABLE vlornomiint INTEGER;
DECLARE VARIABLE nitempl VARCHAR(16);
DECLARE VARIABLE SECINT INTEGER;
DECLARE VARIABLE TIPOID VARCHAR(2);
DECLARE VARIABLE TIPOCOT VARCHAR(2);
DECLARE VARIABLE NOM1 VARCHAR(20);
DECLARE VARIABLE NOM2 VARCHAR(30);
DECLARE VARIABLE APE1 VARCHAR(20);
DECLARE VARIABLE APE2 VARCHAR(30);
DECLARE VARIABLE fecing DATE;
DECLARE VARIABLE fecret DATE;
DECLARE VARIABLE countnov INTEGER;
DECLARE VARIABLE novedad VARCHAR(1);
DECLARE VARIABLE codadmin VARCHAR(6);
DECLARE VARIABLE diaslab VARCHAR(3);
DECLARE VARIABLE salminimo VARCHAR(22);
DECLARE VARIABLE fecanomes CHAR(7);
DECLARE VARIABLE salbasic VARCHAR(22);
declare variable incap VARCHAR(2);
BEGIN
TIPREG = '01';
DATOS = :tipreg;
SEC = '00001';
DATOS = :DATOS || :sec;
EXECUTE PROCEDURE LEE_CONFIGURACION ('GENERAL','GENERAL','NOMBRE COMPAÑIA') RETURNING_VALUES (:nomcia);
EXECUTE PROCEDURE CEROS_ANCHO_FIJO (:nomcia, 200, 'A') RETURNING_VALUES (:nomcia);
DATOS = :DATOS || :nomcia;
DATOS = :DATOS || 'NI';
EXECUTE PROCEDURE LEE_CONFIGURACION ('CONTABILIDAD','GENERAL','NIT COMPAÑIA') RETURNING_VALUES (:nitcia);
EXECUTE PROCEDURE DV (nitcia) RETURNING_VALUES (dvcia);
EXECUTE PROCEDURE CEROS_ANCHO_FIJO (:nitcia, 16, 'A') RETURNING_VALUES (:nitcia);
DATOS = :DATOS || :nitcia;
DATOS = :DATOS || :dvcia;
FORMAPRESENT = 'U';
DATOS = :DATOS || :formapresent;
codsucur = '';
EXECUTE PROCEDURE CEROS_ANCHO_FIJO (:codsucur, 10, 'A') RETURNING_VALUES (:codsucur);
DATOS = :DATOS || :codsucur;
nomsucur = '';
EXECUTE PROCEDURE CEROS_ANCHO_FIJO (:nomsucur, 40, 'A') RETURNING_VALUES (:nomsucur);
DATOS = :DATOS || :nomsucur;
SELECT ADMI_CODARP FROM ADMINISTRADORA A, PARAMETROS_ANO P WHERE P.paan_nitarp = A.terc_nit INTO :codarp;
EXECUTE PROCEDURE CEROS_ANCHO_FIJO (:codarp, 6, 'A') RETURNING_VALUES (:codarp);
DATOS = :DATOS || :codarp;
SELECT SUBSTRING(P.pgap_fecha FROM 1 FOR 7) FROM PAGO_APORTES P WHERE P.pgap_id = :iddoc AND p.pgap_item = 1 INTO :perliq;
perliq = substr(perliq, 1,4) || substr(perliq, 6,8);
DATOS = :DATOS || :perliq;
perliqsalud = :perliq;
DATOS = :DATOS || :perliqsalud;
SELECT pgap_formulario FROM PAGO_APORTES WHERE PGAP_ID = :iddoc AND pgap_item = 1 INTO :numform;
EXECUTE PROCEDURE CEROS_ANCHO_FIJO (:numform, 10, 'A') RETURNING_VALUES (:numform);
DATOS = :DATOS || :numform;
DATOS = :DATOS || :fecliq;
/*EXECUTE PROCEDURE CEROS_ANCHO_FIJO (:nroemple, 5, 'N') RETURNING_VALUES (:nroemple);
DATOS = :DATOS || :nroemple; */
SELECT SUM(pade_ibc) FROM PAGO_APORTES_DETALLE WHERE PGAP_ID = :iddoc INTO :vlornomi;
vlornomiint = CAST(:vlornomi AS INTEGER);
vlornomi = CAST(vlornomiint AS VARCHAR(12));
EXECUTE PROCEDURE CEROS_ANCHO_FIJO (:vlornomi, 12, 'N') RETURNING_VALUES (:vlornomi);
DATOS = :DATOS || :vlornomi;
EXECUTE PROCEDURE CEROS_ANCHO_FIJO (:codoper, 2, 'N') RETURNING_VALUES (:codoper);
DATOS = :DATOS || :codoper;
SUSPEND;
datos = '';
secint = 1;
FOR SELECT e.terc_nit, T.terc_tipoid, E.tcot_cod, T.terc_nombre1, T.terc_nombre2, T.terc_apellido1, T.terc_apellido2, E.empl_fecing, e.empl_fecret FROM empleados e, TERCEROS T
WHERE (e.empl_fecret > substr(:fecliq,1,4) || '/' || substr(:fecliq,5,6) || '/' || substr(:fecliq,7,8) OR (e.empl_fecret IS NULL))  AND e.empl_fecing < substr(:fecliq,1,4) || '/' || substr(:fecliq,5,6) || '/' || substr(:fecliq,7,8) AND T.terc_nit = E.terc_nit
INTO :nitempl, :tipoid, :tipocot, :nom1, :nom2, :ape1, :ape2, :fecing, :fecret
DO
 BEGIN
    tipreg  = '02';
    DATOS = :datos || tipreg;
    secint = secint + 1;
    EXECUTE PROCEDURE CEROS_ANCHO_FIJO (CAST(secint AS VARCHAR(200)), 5, 'N') RETURNING_VALUES (:sec);
    DATOS = DATOS || :SEC;
    IF (:tipoid = 'N') THEN
    tipoid = 'NI';
    IF (:tipoid = 'C') THEN
    tipoid = 'CC';
    IF (:tipoid = 'E') THEN
    tipoid = 'CE';
    IF (:tipoid = 'T') THEN
    tipoid = 'TI';
    IF (:tipoid = 'R') THEN
    tipoid = 'RC';
    IF (:tipoid = 'P') THEN
    tipoid = 'PA';
    IF (:tipoid = 'J') THEN
    tipoid = 'CC';
    DATOS = DATOS || tipoid;
    EXECUTE PROCEDURE CEROS_ANCHO_FIJO (:nitempl, 16, 'A') RETURNING_VALUES (:nitempl);
    DATOS = DATOS || :nitempl;
    datos = datos || '0';
    EXECUTE PROCEDURE CEROS_ANCHO_FIJO (:tipocot, 1, 'N') RETURNING_VALUES (:tipocot);
    datos = datos || :tipocot;
    EXECUTE PROCEDURE CEROS_ANCHO_FIJO (:ape1, 20, 'A') RETURNING_VALUES (:ape1);
    IF (ape1 IS NULL) THEN
    ape1 = '';
    DATOS = DATOS || :ape1;
    EXECUTE PROCEDURE CEROS_ANCHO_FIJO (:ape2, 30, 'A') RETURNING_VALUES (:ape2);
    IF (ape2 IS NULL) THEN
    ape2 = '';
    DATOS = DATOS || :ape2;
    EXECUTE PROCEDURE CEROS_ANCHO_FIJO (:nom1, 20, 'A') RETURNING_VALUES (:nom1);
    IF (nom1 IS NULL) THEN
    nom1 = '';
    DATOS = DATOS || :nom1;
    EXECUTE PROCEDURE CEROS_ANCHO_FIJO (:nom2, 30, 'A') RETURNING_VALUES (:nom2);
    IF (nom2 IS NULL) THEN
    nom2 = '';
    DATOS = DATOS || :nom2;
    IF ((substr(:fecing,6,7) = substr(:fecliq,5,6)) AND (substr(:fecing,1,4) = substr(:fecliq,1,4))) THEN
    novedad = 'X';
    ELSE
    novedad = ' ';
    datos = :datos || :novedad;
    IF (:fecret IS NOT NULL AND (substr(:fecret,6,7) = substr(:fecliq,5,6))) THEN
    novedad = 'X';
    ELSE
    novedad = ' ';
    datos = :datos || :novedad;
    SELECT COUNT(*) FROM nomina_novedades v WHERE (substr(nono_fecha, 1,4) = substr(:fecliq,1,4)) AND (substr(nono_fecha, 6,7) = substr(:fecliq,6,7)) AND v.tnov_cod = 5 AND V.nono_tipoadm = 'E' INTO :countnov;
    IF (:countnov > 0) THEN
    novedad = 'X';
    ELSE
    novedad = ' ';
    datos = :datos || :novedad;
   SELECT COUNT(*) FROM nomina_novedades v WHERE (substr(nono_fecha, 1,4) = substr(:fecliq,1,4)) AND (substr(nono_fecha, 6,7) = substr(:fecliq,6,7)) AND v.tnov_cod = 5 AND V.nono_tipoadm = 'E' INTO :countnov;
    IF (:countnov > 0) THEN
    novedad = 'X';
    ELSE
    novedad = ' ';
    datos = :datos || :novedad;
    SELECT COUNT(*) FROM nomina_novedades v WHERE (substr(nono_fecha, 1,4) = substr(:fecliq,1,4)) AND (substr(nono_fecha, 6,7) = substr(:fecliq,6,7)) AND v.tnov_cod = 5 AND V.nono_tipoadm = 'A' INTO :countnov;
    IF (:countnov > 0) THEN
    novedad = 'X';
    ELSE
    novedad = ' ';
    datos = :datos || :novedad;    
    SELECT COUNT(*) FROM nomina_novedades v WHERE (substr(nono_fecha, 1,4) = substr(:fecliq,1,4)) AND (substr(nono_fecha, 6,7) = substr(:fecliq,6,7)) AND v.tnov_cod = 5 AND V.nono_tipoadm = 'A' INTO :countnov;
    IF (:countnov > 0) THEN
    novedad = 'X';
    ELSE
    novedad = ' ';
    datos = :datos || :novedad;
    SELECT COUNT(*) FROM nomina_novedades v WHERE (substr(nono_fecha, 1,4) = substr(:fecliq,1,4)) AND (substr(nono_fecha, 6,7) = substr(:fecliq,6,7)) AND v.tnov_cod = 8 AND V.nono_tipoadm = 'A' INTO :countnov;
    IF (:countnov > 0) THEN
    novedad = 'X';
    ELSE
    novedad = ' ';
    datos = :datos || :novedad;
    SELECT COUNT(*) FROM nomina_novedades v WHERE (substr(nono_fecha, 1,4) = substr(:fecliq,1,4)) AND (substr(nono_fecha, 6,7) = substr(:fecliq,6,7)) AND v.tnov_cod = 10 AND V.nono_tipoadm = 'A' INTO :countnov;
    IF (:countnov > 0) THEN
    novedad = 'X';
    ELSE
    novedad = ' ';
    datos = :datos || :novedad;
    SELECT COUNT(*) FROM nomina_novedades v WHERE (substr(nono_fecha, 1,4) = substr(:fecliq,1,4)) AND (substr(nono_fecha, 6,7) = substr(:fecliq,6,7)) AND v.tnov_cod = 11 INTO :countnov;
    IF (:countnov > 0) THEN
    novedad = 'X';
    ELSE
    novedad = ' ';
    datos = :datos || :novedad;    
    SELECT COUNT(*) FROM nomina_novedades v WHERE (substr(nono_fecha, 1,4) = substr(:fecliq,1,4)) AND (substr(nono_fecha, 6,7) = substr(:fecliq,6,7)) AND v.tnov_cod = 9 INTO :countnov;
    IF (:countnov > 0) THEN
    novedad = 'X';
    ELSE
    novedad = ' ';
    datos = :datos || :novedad;    
    SELECT COUNT(*) FROM nomina_novedades v WHERE (substr(nono_fecha, 1,4) = substr(:fecliq,1,4)) AND (substr(nono_fecha, 6,7) = substr(:fecliq,6,7)) AND v.tnov_cod = 2 INTO :countnov;
    IF (:countnov > 0) THEN
    novedad = 'X';
    ELSE
    novedad = ' ';
    datos = :datos || :novedad;    
    SELECT COUNT(*) FROM nomina_novedades v WHERE (substr(nono_fecha, 1,4) = substr(:fecliq,1,4)) AND (substr(nono_fecha, 6,7) = substr(:fecliq,6,7)) AND v.tnov_cod = 4 INTO :countnov;
    IF (:countnov > 0) THEN
    novedad = 'X';
    ELSE
    novedad = ' ';
    datos = :datos || :novedad;
    SELECT COUNT(*) FROM nomina_novedades v WHERE (substr(nono_fecha, 1,4) = substr(:fecliq,1,4)) AND (substr(nono_fecha, 6,7) = substr(:fecliq,6,7)) AND v.tnov_cod = 6 INTO :countnov;
    IF (:countnov > 0) THEN
    novedad = 'X';
    ELSE
    novedad = ' ';
    datos = :datos || :novedad;    
    SELECT COUNT(*) FROM nomina_novedades v WHERE (substr(nono_fecha, 1,4) = substr(:fecliq,1,4)) AND (substr(nono_fecha, 6,7) = substr(:fecliq,6,7)) AND v.tnov_cod = 1 INTO :countnov;
    IF (:countnov > 0) THEN
    novedad = 'X';
    ELSE
    novedad = ' ';
    datos = :datos || :novedad;    
    SELECT COUNT(*) FROM nomina_novedades v WHERE (substr(nono_fecha, 1,4) = substr(:fecliq,1,4)) AND (substr(nono_fecha, 6,7) = substr(:fecliq,6,7)) AND v.tnov_cod = 7 INTO :countnov;
    IF (:countnov > 0) THEN
    novedad = 'X';
    ELSE
    novedad = ' ';
    datos = :datos || :novedad;
    SELECT v.nono_dura FROM nomina_novedades v WHERE (substr(nono_fecha, 1,4) = substr(:fecliq,1,4)) AND (substr(nono_fecha, 6,7) = substr(:fecliq,6,7)) AND v.tnov_cod = 3 INTO :countnov;
    IF (:countnov > 0) THEN
    BEGIN
    novedad = :countnov;
    END
    ELSE
    BEGIN
    countnov = 0;
    END
    EXECUTE PROCEDURE CEROS_ANCHO_FIJO (:countnov, 2, 'N') RETURNING_VALUES (:incap);
    datos = :datos || :incap;
    SELECT a.admi_codafp FROM ADMINISTRADORA A, EMPLEADOS E WHERE E.empl_afp = A.terc_nit AND E.terc_nit = :nitempl INTO :codadmin;
    IF (:codadmin IS NULL) THEN
    codadmin = ' ';
    EXECUTE PROCEDURE CEROS_ANCHO_FIJO (:codadmin, 6, 'A') RETURNING_VALUES (:codadmin);
    datos = :datos || :codadmin;
    codadmin = '';
    SELECT A.admi_codafp FROM nomina_novedades v, EMPLEADOS E, ADMINISTRADORA A WHERE (substr(nono_fecha, 1,4) = substr(:fecliq,1,4)) AND (substr(nono_fecha, 6,7) = substr(:fecliq,6,7)) AND v.tnov_cod = 5 AND V.nono_tipoadm = 'A' AND V.nono_nvaadm = A.terc_nit INTO :codadmin;
    IF (:codadmin IS NULL) THEN
    codadmin = ' ';
    EXECUTE PROCEDURE CEROS_ANCHO_FIJO (:codadmin, 6, 'A') RETURNING_VALUES (:codadmin);
    datos = :datos || :codadmin;
    codadmin = '';
    SELECT a.admi_codeps FROM ADMINISTRADORA A, EMPLEADOS E WHERE E.empl_eps = A.terc_nit AND E.terc_nit = :nitempl INTO :codadmin;
    IF (:codadmin IS NULL) THEN
    codadmin = ' ';
    EXECUTE PROCEDURE CEROS_ANCHO_FIJO (:codadmin, 6, 'A') RETURNING_VALUES (:codadmin);
    datos = :datos || :codadmin;
    codadmin = '';
    SELECT A.admi_codeps FROM nomina_novedades v, EMPLEADOS E, ADMINISTRADORA A WHERE (substr(nono_fecha, 1,4) = substr(:fecliq,1,4)) AND (substr(nono_fecha, 6,7) = substr(:fecliq,6,7)) AND v.tnov_cod = 5 AND V.nono_tipoadm = 'E' AND V.nono_nvaadm = A.terc_nit INTO :codadmin;
    IF (:codadmin IS NULL) THEN
    codadmin = ' ';
    SELECT A.admi_codeps FROM nomina_novedades v, EMPLEADOS E, ADMINISTRADORA A WHERE (substr(nono_fecha, 1,4) = substr(:fecliq,1,4)) AND (substr(nono_fecha, 6,7) = substr(:fecliq,6,7)) AND v.tnov_cod = 5 AND V.nono_tipoadm = 'E' AND V.nono_nvaadm = A.terc_nit INTO :codadmin;
    IF (:codadmin IS NULL) THEN
    codadmin = ' ';
    EXECUTE PROCEDURE CEROS_ANCHO_FIJO (:codadmin, 6, 'A') RETURNING_VALUES (:codadmin);
    datos = :datos || :codadmin;
    codadmin = '';
    SELECT A.admi_codeps FROM nomina_novedades v, EMPLEADOS E, ADMINISTRADORA A WHERE (substr(nono_fecha, 1,4) = substr(:fecliq,1,4)) AND (substr(nono_fecha, 6,7) = substr(:fecliq,6,7)) AND v.tnov_cod = 5 AND V.nono_tipoadm = 'E' AND V.nono_nvaadm = A.terc_nit INTO :codadmin;
    IF (:codadmin IS NULL) THEN
    codadmin = ' ';
    EXECUTE PROCEDURE CEROS_ANCHO_FIJO (:codadmin, 6, 'A') RETURNING_VALUES (:codadmin);
    datos = :datos || :codadmin;
    codadmin = '';
/*    SELECT A.admi_ccf FROM EMPLEADOS E, ADMINISTRADORA A WHERE A.terc_nit = E.terc_nit AND E.terc_nit = :nitempl INTO :codadmin;
    EXECUTE PROCEDURE CEROS_ANCHO_FIJO (:codadmin, 6, 'A') RETURNING_VALUES (:codadmin);
    datos = :datos || :codadmin;
    codadmin = '';*/
    fecanomes = substr(:fecliq,1,4) || '-' || substr(:fecliq,5,6);
    SELECT SUM(ND.node_diaslab) FROM NOMINA N, NOMINA_DETALLE ND WHERE SUBSTR(N.nomi_feccausa, 1,7) = :fecanomes AND N.nomi_id = ND.nomi_id AND ND.terc_nit = :nitempl INTO :diaslab;
    IF (:diaslab IS NULL) THEN
    diaslab = '00';
    EXECUTE PROCEDURE CEROS_ANCHO_FIJO (:diaslab, 2, 'N') RETURNING_VALUES (:diaslab);
    Datos = :datos || :diaslab;
    SELECT SUM(ND.node_diaslab) FROM NOMINA N, NOMINA_DETALLE ND WHERE SUBSTR(N.nomi_feccausa, 1,7) = :fecanomes AND N.nomi_id = ND.nomi_id AND ND.terc_nit = :nitempl INTO :diaslab;
    IF (:diaslab IS NULL) THEN
    diaslab = '00';
    EXECUTE PROCEDURE CEROS_ANCHO_FIJO (:diaslab, 2, 'N') RETURNING_VALUES (:diaslab);
    Datos = :datos || :diaslab;
    SELECT SUM(ND.node_diaslab) FROM NOMINA N, NOMINA_DETALLE ND WHERE SUBSTR(N.nomi_feccausa, 1,7) = :fecanomes AND N.nomi_id = ND.nomi_id AND ND.terc_nit = :nitempl INTO :diaslab;
    IF (:diaslab IS NULL) THEN
    diaslab = '00';
    EXECUTE PROCEDURE CEROS_ANCHO_FIJO (:diaslab, 2, 'N') RETURNING_VALUES (:diaslab);
    Datos = :datos || :diaslab;
    SELECT e.empl_salario FROM empleados e WHERE e.terc_nit = :nitempl INTO :salbasic;
    IF (:salbasic IS NULL) THEN
    salbasic = '0';
    salbasic = substr(salbasic,1,strlen(salbasic)-3);
    EXECUTE PROCEDURE CEROS_ANCHO_FIJO (:salbasic, 9, 'N') RETURNING_VALUES (:salbasic);
    Datos = :datos || :salbasic;
    SELECT e.empl_salario FROM empleados e WHERE e.terc_nit = :nitempl INTO :salbasic;
    IF (:salbasic IS NULL) THEN
    salbasic = '0';
    execute procedure redondee (salbasic,1000)returning_values(salbasic);
    salbasic = substr(salbasic,1,strlen(salbasic)-5);
    EXECUTE PROCEDURE CEROS_ANCHO_FIJO (:salbasic, 9, 'N') RETURNING_VALUES (:salbasic);
    Datos = :datos || :salbasic;
    Datos = :datos || :salbasic;
    Datos = :datos || :salbasic;
    Datos = :datos || :salbasic;
    Datos = :datos || :salbasic;
    datos = :datos || '0.15';
/*    datos = :datos || '30';
    datos = :datos || '00';
    select P.paan_salminimo from PARAMETROS_ANO P WHERE P.paan_ano = SUBSTR(:fecpago, 1,8) INTO :salminimo;
  */
    SUSPEND;
    datos = '';
    END
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE LIQUIDACION_APORTES(
    ID_NOMINA_1 INTEGER,
    ID_NOMINA_2 INTEGER,
    ID_NOMINA_3 INTEGER,
    ID_NOMINA_4 INTEGER,
    ID_NOMINA_5 INTEGER,
    ID_NOMINA_6 INTEGER,
    ID_NOMINA_7 INTEGER,
    INTMORA NUMERIC(18,2),
    FECHA DATE,
    FORMULARIO VARCHAR(10))
RETURNS (
    IDAPORTE INTEGER)
AS
declare variable itemaportadmi integer;
declare variable itemdetaport integer;
declare variable nit varchar(20);
declare variable eps char(1);
declare variable afp char(1);
declare variable ccf char(1);
declare variable afc char(1);
declare variable arp char(1);
declare variable nombreadmin varchar(60);
declare variable totadmin numeric(18,2);
declare variable totadminneg numeric(18,2);
declare variable tipoaport char(1);
declare variable ano char(4);
declare variable nitempl varchar(20);
declare variable totdetvalor numeric(18,2);
declare variable totdetvalorneg numeric(18,2);
declare variable totibc integer;
begin
itemaportadmi = 1;
itemdetaport = 1;
ANO = SUBSTR(fecha, 1, 4);
idaporte = gen_id(id_pgaport,1);
select PAAN_TIPOAPORT from parametros_ano where PAAN_ANO = :ANO into :tipoaport;
for select A.TERC_NIT, A.ADMI_EPS, A.ADMI_AFP, A.ADMI_CCF, A.ADMI_AFC, A.ADMI_ARP, T.TERC_NOM from ADMINISTRADORA A, TERCEROS t
  where T.TERC_NIT = A.TERC_NIT and t.terc_admini = 'S' Into :nit, :eps, :afp, :CCF, :afc, :arp, :nombreadmin
  do
  begin
  select sum (noco_valor) from nomina_conceptos N
  where (N.noco_aporte = 'S' and N.noco_entidad = :nit and (nomi_id = :id_nomina_1 or (nomi_id = :id_nomina_2) or (nomi_id = :id_nomina_3) or (nomi_id = :id_nomina_4) or (nomi_id = :id_nomina_5) or (nomi_id = :id_nomina_6) or (nomi_id = :id_nomina_7)) AND N.noco_valor > 0)
  into :totadmin;
  select sum (noco_valor*(-1)) from nomina_conceptos N
  where (N.noco_aporte = 'S' and N.noco_entidad = :nit and (nomi_id = :id_nomina_1 or (nomi_id = :id_nomina_2) or (nomi_id = :id_nomina_3) or (nomi_id = :id_nomina_4) or (nomi_id = :id_nomina_5) or (nomi_id = :id_nomina_6) or (nomi_id = :id_nomina_7)) AND N.noco_valor < 0)
  into :totadminneg;
  totadmin = :totadminneg + :totadmin;
  if (totadmin IS NOT NULL) then
  BEGIN
  insert into pago_aportes (pgap_id, pgap_item, pgap_tipoap, pgap_conpago, pgap_admin, pgap_monto, pgap_intmora, pgap_fecha, pgap_formulario) values
                           (:idaporte, :itemaportadmi, :tipoaport, '', :nit, :totadmin, :intmora, :fecha, :formulario);
  if (CCF = 'S') then
  for select TERC_NIT from EMPLEADOS where EMPL_CCF = :NIT into :nitempl
  do
  begin
  select sum (NOCO_VALOR) from NOMINA_CONCEPTOS
        where (TERC_NIT = :nitempl and NOCO_SALARIO = 'S' and (nomi_id = :id_nomina_1 or (nomi_id = :id_nomina_2) or (nomi_id = :id_nomina_3) or (nomi_id = :id_nomina_4) or (nomi_id = :id_nomina_5) or (nomi_id = :id_nomina_6) or (nomi_id = :id_nomina_7)))
        into :totibc;
  select sum (NOCO_VALOR) from NOMINA_CONCEPTOS N
         where (TERC_NIT = :nitempl and NOCO_ENTIDAD = :nit and NOCO_APORTE = 'S' and (nomi_id = :id_nomina_1 or (nomi_id = :id_nomina_2) or (nomi_id = :id_nomina_3) or (nomi_id = :id_nomina_4) or (nomi_id = :id_nomina_5) or (nomi_id = :id_nomina_6) or (nomi_id = :id_nomina_7))
         AND noco_valor > 0 and (N.conc_cod = 910 or (N.conc_cod = 911) or (N.conc_cod = 916) or (N.conc_cod = 917) or (N.conc_cod = 918) or (N.conc_cod = 919)))
       into :totdetvalor;
  select sum (NOCO_VALOR*(-1)) from NOMINA_CONCEPTOS N
         where (TERC_NIT = :nitempl and NOCO_ENTIDAD = :nit and NOCO_APORTE = 'S' and (nomi_id = :id_nomina_1 or (nomi_id = :id_nomina_2) or (nomi_id = :id_nomina_3) or (nomi_id = :id_nomina_4) or (nomi_id = :id_nomina_5) or (nomi_id = :id_nomina_6) or (nomi_id = :id_nomina_7))
         AND noco_valor < 0 and (N.conc_cod = 910 or (N.conc_cod = 911) or (N.conc_cod = 916) or (N.conc_cod = 917) or (N.conc_cod = 918) or (N.conc_cod = 919)))
        into :totdetvalorneg;
  totdetvalor = :totdetvalorneg + :totdetvalor;
  if ((:totdetvalor is not null) and (:totibc is not null)) then
  begin
  insert into PAGO_APORTES_DETALLE (pgap_id, pgap_item, pade_itemdet, terc_nit, pade_ibc, pade_cotobl)
                             values(:idaporte, :itemaportadmi, :itemdetaport, :nitempl, :totibc, :totdetvalor);
    itemdetaport = :itemdetaport + 1;
  totdetvalor = 0;
  end
  end
if (EPS = 'S') then
  for select TERC_NIT from EMPLEADOS where EMPL_EPS = :NIT into :nitempl
  do
  begin
  select sum (NOCO_VALOR) from NOMINA_CONCEPTOS N
        where (TERC_NIT = :nitempl and NOCO_SALARIO = 'S' and (nomi_id = :id_nomina_1 or (nomi_id = :id_nomina_2) or (nomi_id = :id_nomina_3) or (nomi_id = :id_nomina_4) or (nomi_id = :id_nomina_5) or (nomi_id = :id_nomina_6) or (nomi_id = :id_nomina_7)))
        into :totibc;
  select sum (NOCO_VALOR) from NOMINA_CONCEPTOS N
         where (TERC_NIT = :nitempl and NOCO_ENTIDAD = :nit and NOCO_APORTE = 'S' and (nomi_id = :id_nomina_1 or (nomi_id = :id_nomina_2) or (nomi_id = :id_nomina_3) or (nomi_id = :id_nomina_4) or (nomi_id = :id_nomina_5) or (nomi_id = :id_nomina_6) or (nomi_id = :id_nomina_7))
         AND noco_valor > 0 and (N.conc_cod = 907 or (N.conc_cod = 914) or (N.conc_cod = 915)))
        into :totdetvalor;
  select sum (NOCO_VALOR*(-1)) from NOMINA_CONCEPTOS N
         where (TERC_NIT = :nitempl and NOCO_ENTIDAD = :nit and NOCO_APORTE = 'S' and (nomi_id = :id_nomina_1 or (nomi_id = :id_nomina_2) or (nomi_id = :id_nomina_3) or (nomi_id = :id_nomina_4) or (nomi_id = :id_nomina_5) or (nomi_id = :id_nomina_6) or (nomi_id = :id_nomina_7))
         AND noco_valor < 0 and (N.conc_cod = 907 or (N.conc_cod = 914) or (N.conc_cod = 915)))
        into :totdetvalorneg;
  totdetvalor = :totdetvalorneg + :totdetvalor;
  if ((:totdetvalor is not null) and (:totibc is not null)) then
  begin
  insert into PAGO_APORTES_DETALLE (pgap_id, pgap_item, pade_itemdet, terc_nit, pade_ibc, pade_cotobl)
                             values(:idaporte, :itemaportadmi, :itemdetaport, :nitempl, :totibc, :totdetvalor);
  itemdetaport = :itemdetaport + 1;
  totdetvalor = 0;
  end
  end
if (afp = 'S') then
  for select TERC_NIT from EMPLEADOS where EMPL_AFP = :NIT into :nitempl
  do
  begin
  select sum (NOCO_VALOR) from NOMINA_CONCEPTOS
        where (TERC_NIT = :nitempl and NOCO_SALARIO = 'S'
        and (nomi_id = :id_nomina_1 or (nomi_id = :id_nomina_2) or (nomi_id = :id_nomina_3) or (nomi_id = :id_nomina_4) or (nomi_id = :id_nomina_5) or (nomi_id = :id_nomina_6) or (nomi_id = :id_nomina_7)))
        into :totibc;
  select sum (NOCO_VALOR) from NOMINA_CONCEPTOS N
         where (TERC_NIT = :nitempl and NOCO_ENTIDAD = :nit and NOCO_APORTE = 'S' and (nomi_id = :id_nomina_1 or (nomi_id = :id_nomina_2) or (nomi_id = :id_nomina_3) or (nomi_id = :id_nomina_4) or (nomi_id = :id_nomina_5) or (nomi_id = :id_nomina_6) or (nomi_id = :id_nomina_7)) AND noco_valor > 0 and (N.conc_cod = 904 or (N.conc_cod = 905) or (N.conc_cod = 906)))
         into :totdetvalor;
  select sum (NOCO_VALOR*(-1)) from NOMINA_CONCEPTOS N
         where (TERC_NIT = :nitempl and NOCO_ENTIDAD = :nit and NOCO_APORTE = 'S' and (nomi_id = :id_nomina_1 or (nomi_id = :id_nomina_2) or (nomi_id = :id_nomina_3) or (nomi_id = :id_nomina_4) or (nomi_id = :id_nomina_5) or (nomi_id = :id_nomina_6) or (nomi_id = :id_nomina_7)) AND noco_valor < 0 and (N.conc_cod = 904 or (N.conc_cod = 905) or (N.conc_cod = 906)))         into :totdetvalorneg;
  totdetvalor = :totdetvalorneg + :totdetvalor;
  if ((:totdetvalor is not null) and (:totibc is not null)) then
  begin
  insert into PAGO_APORTES_DETALLE (pgap_id, pgap_item, pade_itemdet, terc_nit, pade_ibc, pade_cotobl)
                             values(:idaporte, :itemaportadmi, :itemdetaport, :nitempl, :totibc, :totdetvalor);
    itemdetaport = :itemdetaport + 1;
    totdetvalor = 0;
  end
  end
if (AFC = 'S') then
  for select TERC_NIT from EMPLEADOS where EMPL_AFC = :NIT into :nitempl
  do
  begin
  select sum (NOCO_VALOR) from NOMINA_CONCEPTOS N
        where (TERC_NIT = :nitempl and NOCO_SALARIO = 'S' and (nomi_id = :id_nomina_1 or (nomi_id = :id_nomina_2) or (nomi_id = :id_nomina_3) or (nomi_id = :id_nomina_4) or (nomi_id = :id_nomina_5) or (nomi_id = :id_nomina_6) or (nomi_id = :id_nomina_7)))
        into :totibc;
  select sum (NOCO_VALOR) from NOMINA_CONCEPTOS N
         where (TERC_NIT = :nitempl and NOCO_ENTIDAD = :nit and NOCO_APORTE = 'S' and (nomi_id = :id_nomina_1 or (nomi_id = :id_nomina_2) or (nomi_id = :id_nomina_3) or (nomi_id = :id_nomina_4) or (nomi_id = :id_nomina_5) or (nomi_id = :id_nomina_6) or (nomi_id = :id_nomina_7))
         AND noco_valor > 0 and (N.conc_cod = 912 or (N.conc_cod = 913)))
        into :totdetvalor;
  select sum (NOCO_VALOR*(-1)) from NOMINA_CONCEPTOS N
         where (TERC_NIT = :nitempl and NOCO_ENTIDAD = :nit and NOCO_APORTE = 'S' and (nomi_id = :id_nomina_1 or (nomi_id = :id_nomina_2) or (nomi_id = :id_nomina_3) or (nomi_id = :id_nomina_4) or (nomi_id = :id_nomina_5) or (nomi_id = :id_nomina_6) or (nomi_id = :id_nomina_7))
         AND noco_valor < 0 and (N.conc_cod = 912 or (N.conc_cod = 913)))
        into :totdetvalorneg;
  totdetvalor = :totdetvalorneg + :totdetvalor;
  if ((:totdetvalor is not null) and (:totibc is not null)) then
  begin
  insert into PAGO_APORTES_DETALLE (pgap_id, pgap_item, pade_itemdet, terc_nit, pade_ibc, pade_cotobl)
                             values(:idaporte, :itemaportadmi, :itemdetaport, :nitempl, :totibc, :totdetvalor);
    itemdetaport = :itemdetaport + 1;
  totdetvalor = 0;
  end
  end
if (ARP = 'S') then
  for select TERC_NIT from EMPLEADOS where EMPL_ARP = :NIT into :nitempl
  do
  begin
  select sum (NOCO_VALOR) from NOMINA_CONCEPTOS N
        where (TERC_NIT = :nitempl and NOCO_SALARIO = 'S' and (nomi_id = :id_nomina_1 or (nomi_id = :id_nomina_2) or (nomi_id = :id_nomina_3) or (nomi_id = :id_nomina_4) or (nomi_id = :id_nomina_5) or (nomi_id = :id_nomina_6) or (nomi_id = :id_nomina_7)))
        into :totibc;
  select sum (NOCO_VALOR) from NOMINA_CONCEPTOS N
         where (TERC_NIT = :nitempl and NOCO_ENTIDAD = :nit and NOCO_APORTE = 'S' and (nomi_id = :id_nomina_1 or (nomi_id = :id_nomina_2) or (nomi_id = :id_nomina_3) or (nomi_id = :id_nomina_4) or (nomi_id = :id_nomina_5) or (nomi_id = :id_nomina_6) or (nomi_id = :id_nomina_7))
         AND noco_valor > 0 and (N.conc_cod = 908 or (N.conc_cod = 909)))
        into :totdetvalor;
  select sum (NOCO_VALOR*(-1)) from NOMINA_CONCEPTOS N
         where (TERC_NIT = :nitempl and NOCO_ENTIDAD = :nit and NOCO_APORTE = 'S' and (nomi_id = :id_nomina_1 or (nomi_id = :id_nomina_2) or (nomi_id = :id_nomina_3) or (nomi_id = :id_nomina_4) or (nomi_id = :id_nomina_5) or (nomi_id = :id_nomina_6) or (nomi_id = :id_nomina_7))
         AND noco_valor < 0 and (N.conc_cod = 908 or (N.conc_cod = 909)))
        into :totdetvalorneg;
  totdetvalor = :totdetvalorneg + :totdetvalor;
  if ((:totdetvalor is not null) and (:totibc is not null)) then
  begin
  insert into PAGO_APORTES_DETALLE (pgap_id, pgap_item, pade_itemdet, terc_nit, pade_ibc, pade_cotobl)
                             values(:idaporte, :itemaportadmi, :itemdetaport, :nitempl, :totibc, :totdetvalor);
    itemdetaport = :itemdetaport + 1;
  totdetvalor = 0;
  end
  end
  if (totadmin IS NOT NULL) then
  itemaportadmi = :itemaportadmi + 1;
  itemdetaport = 1;
  SUSPEND;
  END
end
end
^

SET TERM ; ^


ALTER TABLE PAGO_APORTES_DETALLE
ADD PADE_TIPAP CHAR(3);

SET TERM ^ ;

ALTER PROCEDURE LIQUIDACION_APORTES(
    ID_NOMINA_1 INTEGER,
    ID_NOMINA_2 INTEGER,
    ID_NOMINA_3 INTEGER,
    ID_NOMINA_4 INTEGER,
    ID_NOMINA_5 INTEGER,
    ID_NOMINA_6 INTEGER,
    ID_NOMINA_7 INTEGER,
    INTMORA NUMERIC(18,2),
    FECHA DATE,
    FORMULARIO VARCHAR(10))
RETURNS (
    IDAPORTE INTEGER)
AS
declare variable itemaportadmi integer;
declare variable itemdetaport integer;
declare variable nit varchar(20);
declare variable eps char(1);
declare variable afp char(1);
declare variable ccf char(1);
declare variable afc char(1);
declare variable arp char(1);
declare variable nombreadmin varchar(60);
declare variable totadmin numeric(18,2);
declare variable totadminneg numeric(18,2);
declare variable tipoaport char(1);
declare variable ano char(4);
declare variable nitempl varchar(20);
declare variable totdetvalor numeric(18,2);
declare variable totdetvalorneg numeric(18,2);
declare variable totibc integer;
begin
itemaportadmi = 1;
itemdetaport = 1;
ANO = SUBSTR(fecha, 1, 4);
idaporte = gen_id(id_pgaport,1);
select PAAN_TIPOAPORT from parametros_ano where PAAN_ANO = :ANO into :tipoaport;
for select A.TERC_NIT, A.ADMI_EPS, A.ADMI_AFP, A.ADMI_CCF, A.ADMI_AFC, A.ADMI_ARP, T.TERC_NOM from ADMINISTRADORA A, TERCEROS t
  where T.TERC_NIT = A.TERC_NIT and t.terc_admini = 'S' Into :nit, :eps, :afp, :CCF, :afc, :arp, :nombreadmin
  do
  begin
  select sum (noco_valor) from nomina_conceptos N
  where (N.noco_aporte = 'S' and N.noco_entidad = :nit and (nomi_id = :id_nomina_1 or (nomi_id = :id_nomina_2) or (nomi_id = :id_nomina_3) or (nomi_id = :id_nomina_4) or (nomi_id = :id_nomina_5) or (nomi_id = :id_nomina_6) or (nomi_id = :id_nomina_7)) AND N.noco_valor > 0)
  into :totadmin;
  select sum (noco_valor*(-1)) from nomina_conceptos N
  where (N.noco_aporte = 'S' and N.noco_entidad = :nit and (nomi_id = :id_nomina_1 or (nomi_id = :id_nomina_2) or (nomi_id = :id_nomina_3) or (nomi_id = :id_nomina_4) or (nomi_id = :id_nomina_5) or (nomi_id = :id_nomina_6) or (nomi_id = :id_nomina_7)) AND N.noco_valor < 0)
  into :totadminneg;
  totadmin = :totadminneg + :totadmin;
  if (totadmin IS NOT NULL) then
  BEGIN
  insert into pago_aportes (pgap_id, pgap_item, pgap_tipoap, pgap_conpago, pgap_admin, pgap_monto, pgap_intmora, pgap_fecha, pgap_formulario) values
                           (:idaporte, :itemaportadmi, :tipoaport, '', :nit, :totadmin, :intmora, :fecha, :formulario);
  if (CCF = 'S') then
  for select TERC_NIT from EMPLEADOS where EMPL_CCF = :NIT into :nitempl
  do
  begin
  select sum (NOCO_VALOR) from NOMINA_CONCEPTOS
        where (TERC_NIT = :nitempl and NOCO_SALARIO = 'S' and (nomi_id = :id_nomina_1 or (nomi_id = :id_nomina_2) or (nomi_id = :id_nomina_3) or (nomi_id = :id_nomina_4) or (nomi_id = :id_nomina_5) or (nomi_id = :id_nomina_6) or (nomi_id = :id_nomina_7)))
        into :totibc;
  select sum (NOCO_VALOR) from NOMINA_CONCEPTOS N
         where (TERC_NIT = :nitempl and NOCO_ENTIDAD = :nit and NOCO_APORTE = 'S' and (nomi_id = :id_nomina_1 or (nomi_id = :id_nomina_2) or (nomi_id = :id_nomina_3) or (nomi_id = :id_nomina_4) or (nomi_id = :id_nomina_5) or (nomi_id = :id_nomina_6) or (nomi_id = :id_nomina_7))
         AND noco_valor > 0 and (N.conc_cod = 910 or (N.conc_cod = 911) or (N.conc_cod = 916) or (N.conc_cod = 917) or (N.conc_cod = 918) or (N.conc_cod = 919)))
       into :totdetvalor;
  select sum (NOCO_VALOR*(-1)) from NOMINA_CONCEPTOS N
         where (TERC_NIT = :nitempl and NOCO_ENTIDAD = :nit and NOCO_APORTE = 'S' and (nomi_id = :id_nomina_1 or (nomi_id = :id_nomina_2) or (nomi_id = :id_nomina_3) or (nomi_id = :id_nomina_4) or (nomi_id = :id_nomina_5) or (nomi_id = :id_nomina_6) or (nomi_id = :id_nomina_7))
         AND noco_valor < 0 and (N.conc_cod = 910 or (N.conc_cod = 911) or (N.conc_cod = 916) or (N.conc_cod = 917) or (N.conc_cod = 918) or (N.conc_cod = 919)))
        into :totdetvalorneg;
  totdetvalor = :totdetvalorneg + :totdetvalor;
  if ((:totdetvalor is not null) and (:totibc is not null)) then
  begin
  insert into PAGO_APORTES_DETALLE (pgap_id, pgap_item, pade_itemdet, terc_nit, pade_ibc, pade_cotobl, pade_tipap)
                             values(:idaporte, :itemaportadmi, :itemdetaport, :nitempl, :totibc, :totdetvalor,'CCF');
    itemdetaport = :itemdetaport + 1;
  totdetvalor = 0;
  end
  end
if (EPS = 'S') then
  for select TERC_NIT from EMPLEADOS where EMPL_EPS = :NIT into :nitempl
  do
  begin
  select sum (NOCO_VALOR) from NOMINA_CONCEPTOS N
        where (TERC_NIT = :nitempl and NOCO_SALARIO = 'S' and (nomi_id = :id_nomina_1 or (nomi_id = :id_nomina_2) or (nomi_id = :id_nomina_3) or (nomi_id = :id_nomina_4) or (nomi_id = :id_nomina_5) or (nomi_id = :id_nomina_6) or (nomi_id = :id_nomina_7)))
        into :totibc;
  select sum (NOCO_VALOR) from NOMINA_CONCEPTOS N
         where (TERC_NIT = :nitempl and NOCO_ENTIDAD = :nit and NOCO_APORTE = 'S' and (nomi_id = :id_nomina_1 or (nomi_id = :id_nomina_2) or (nomi_id = :id_nomina_3) or (nomi_id = :id_nomina_4) or (nomi_id = :id_nomina_5) or (nomi_id = :id_nomina_6) or (nomi_id = :id_nomina_7))
         AND noco_valor > 0 and (N.conc_cod = 907 or (N.conc_cod = 914) or (N.conc_cod = 915)))
        into :totdetvalor;
  select sum (NOCO_VALOR*(-1)) from NOMINA_CONCEPTOS N
         where (TERC_NIT = :nitempl and NOCO_ENTIDAD = :nit and NOCO_APORTE = 'S' and (nomi_id = :id_nomina_1 or (nomi_id = :id_nomina_2) or (nomi_id = :id_nomina_3) or (nomi_id = :id_nomina_4) or (nomi_id = :id_nomina_5) or (nomi_id = :id_nomina_6) or (nomi_id = :id_nomina_7))
         AND noco_valor < 0 and (N.conc_cod = 907 or (N.conc_cod = 914) or (N.conc_cod = 915)))
        into :totdetvalorneg;
  totdetvalor = :totdetvalorneg + :totdetvalor;
  if ((:totdetvalor is not null) and (:totibc is not null)) then
  begin
  insert into PAGO_APORTES_DETALLE (pgap_id, pgap_item, pade_itemdet, terc_nit, pade_ibc, pade_cotobl, pade_tipap)
                             values(:idaporte, :itemaportadmi, :itemdetaport, :nitempl, :totibc, :totdetvalor,'EPS');
  itemdetaport = :itemdetaport + 1;
  totdetvalor = 0;
  end
  end
if (afp = 'S') then
  for select TERC_NIT from EMPLEADOS where EMPL_AFP = :NIT into :nitempl
  do
  begin
  select sum (NOCO_VALOR) from NOMINA_CONCEPTOS
        where (TERC_NIT = :nitempl and NOCO_SALARIO = 'S'
        and (nomi_id = :id_nomina_1 or (nomi_id = :id_nomina_2) or (nomi_id = :id_nomina_3) or (nomi_id = :id_nomina_4) or (nomi_id = :id_nomina_5) or (nomi_id = :id_nomina_6) or (nomi_id = :id_nomina_7)))
        into :totibc;
  select sum (NOCO_VALOR) from NOMINA_CONCEPTOS N
         where (TERC_NIT = :nitempl and NOCO_ENTIDAD = :nit and NOCO_APORTE = 'S' and (nomi_id = :id_nomina_1 or (nomi_id = :id_nomina_2) or (nomi_id = :id_nomina_3) or (nomi_id = :id_nomina_4) or (nomi_id = :id_nomina_5) or (nomi_id = :id_nomina_6) or (nomi_id = :id_nomina_7)) AND noco_valor > 0 and (N.conc_cod = 904 or (N.conc_cod = 905) or (N.conc_cod = 906)))
         into :totdetvalor;
  select sum (NOCO_VALOR*(-1)) from NOMINA_CONCEPTOS N
         where (TERC_NIT = :nitempl and NOCO_ENTIDAD = :nit and NOCO_APORTE = 'S' and (nomi_id = :id_nomina_1 or (nomi_id = :id_nomina_2) or (nomi_id = :id_nomina_3) or (nomi_id = :id_nomina_4) or (nomi_id = :id_nomina_5) or (nomi_id = :id_nomina_6) or (nomi_id = :id_nomina_7)) AND noco_valor < 0 and (N.conc_cod = 904 or (N.conc_cod = 905) or (N.conc_cod = 906)))         into :totdetvalorneg;
  totdetvalor = :totdetvalorneg + :totdetvalor;
  if ((:totdetvalor is not null) and (:totibc is not null)) then
  begin
  insert into PAGO_APORTES_DETALLE (pgap_id, pgap_item, pade_itemdet, terc_nit, pade_ibc, pade_cotobl, pade_tipap)
                             values(:idaporte, :itemaportadmi, :itemdetaport, :nitempl, :totibc, :totdetvalor,'AFP');
    itemdetaport = :itemdetaport + 1;
    totdetvalor = 0;
  end
  end
if (AFC = 'S') then
  for select TERC_NIT from EMPLEADOS where EMPL_AFC = :NIT into :nitempl
  do
  begin
  select sum (NOCO_VALOR) from NOMINA_CONCEPTOS N
        where (TERC_NIT = :nitempl and NOCO_SALARIO = 'S' and (nomi_id = :id_nomina_1 or (nomi_id = :id_nomina_2) or (nomi_id = :id_nomina_3) or (nomi_id = :id_nomina_4) or (nomi_id = :id_nomina_5) or (nomi_id = :id_nomina_6) or (nomi_id = :id_nomina_7)))
        into :totibc;
  select sum (NOCO_VALOR) from NOMINA_CONCEPTOS N
         where (TERC_NIT = :nitempl and NOCO_ENTIDAD = :nit and NOCO_APORTE = 'S' and (nomi_id = :id_nomina_1 or (nomi_id = :id_nomina_2) or (nomi_id = :id_nomina_3) or (nomi_id = :id_nomina_4) or (nomi_id = :id_nomina_5) or (nomi_id = :id_nomina_6) or (nomi_id = :id_nomina_7))
         AND noco_valor > 0 and (N.conc_cod = 912 or (N.conc_cod = 913)))
        into :totdetvalor;
  select sum (NOCO_VALOR*(-1)) from NOMINA_CONCEPTOS N
         where (TERC_NIT = :nitempl and NOCO_ENTIDAD = :nit and NOCO_APORTE = 'S' and (nomi_id = :id_nomina_1 or (nomi_id = :id_nomina_2) or (nomi_id = :id_nomina_3) or (nomi_id = :id_nomina_4) or (nomi_id = :id_nomina_5) or (nomi_id = :id_nomina_6) or (nomi_id = :id_nomina_7))
         AND noco_valor < 0 and (N.conc_cod = 912 or (N.conc_cod = 913)))
        into :totdetvalorneg;
  totdetvalor = :totdetvalorneg + :totdetvalor;
  if ((:totdetvalor is not null) and (:totibc is not null)) then
  begin
  insert into PAGO_APORTES_DETALLE (pgap_id, pgap_item, pade_itemdet, terc_nit, pade_ibc, pade_cotobl, pade_tipap)
                             values(:idaporte, :itemaportadmi, :itemdetaport, :nitempl, :totibc, :totdetvalor,'AFC');    itemdetaport = :itemdetaport + 1;
  totdetvalor = 0;
  end
  end
if (ARP = 'S') then
  for select TERC_NIT from EMPLEADOS where EMPL_ARP = :NIT into :nitempl
  do
  begin
  select sum (NOCO_VALOR) from NOMINA_CONCEPTOS N
        where (TERC_NIT = :nitempl and NOCO_SALARIO = 'S' and (nomi_id = :id_nomina_1 or (nomi_id = :id_nomina_2) or (nomi_id = :id_nomina_3) or (nomi_id = :id_nomina_4) or (nomi_id = :id_nomina_5) or (nomi_id = :id_nomina_6) or (nomi_id = :id_nomina_7)))
        into :totibc;
  select sum (NOCO_VALOR) from NOMINA_CONCEPTOS N
         where (TERC_NIT = :nitempl and NOCO_ENTIDAD = :nit and NOCO_APORTE = 'S' and (nomi_id = :id_nomina_1 or (nomi_id = :id_nomina_2) or (nomi_id = :id_nomina_3) or (nomi_id = :id_nomina_4) or (nomi_id = :id_nomina_5) or (nomi_id = :id_nomina_6) or (nomi_id = :id_nomina_7))
         AND noco_valor > 0 and (N.conc_cod = 908 or (N.conc_cod = 909)))
        into :totdetvalor;
  select sum (NOCO_VALOR*(-1)) from NOMINA_CONCEPTOS N
         where (TERC_NIT = :nitempl and NOCO_ENTIDAD = :nit and NOCO_APORTE = 'S' and (nomi_id = :id_nomina_1 or (nomi_id = :id_nomina_2) or (nomi_id = :id_nomina_3) or (nomi_id = :id_nomina_4) or (nomi_id = :id_nomina_5) or (nomi_id = :id_nomina_6) or (nomi_id = :id_nomina_7))
         AND noco_valor < 0 and (N.conc_cod = 908 or (N.conc_cod = 909)))
        into :totdetvalorneg;
  totdetvalor = :totdetvalorneg + :totdetvalor;
  if ((:totdetvalor is not null) and (:totibc is not null)) then
  begin
  insert into PAGO_APORTES_DETALLE (pgap_id, pgap_item, pade_itemdet, terc_nit, pade_ibc, pade_cotobl, pade_tipap)
                             values(:idaporte, :itemaportadmi, :itemdetaport, :nitempl, :totibc, :totdetvalor,'ARP');    itemdetaport = :itemdetaport + 1;
  totdetvalor = 0;
  end
  end
  if (totadmin IS NOT NULL) then
  itemaportadmi = :itemaportadmi + 1;
  itemdetaport = 1;
  SUSPEND;
  END
end
end
^

SET TERM ; ^


ALTER TABLE NOMINA_NOVEDADES
ADD NONO_AUTINCAPLIS VARCHAR(15);

/******************************************************************************/
/****         Generated by IBExpert 2006.12.13 2008/10/22 10:30:19         ****/
/******************************************************************************/

SET SQL DIALECT 3;

SET NAMES NONE;



SET TERM ^ ; 



/******************************************************************************/
/****                          Stored Procedures                           ****/
/******************************************************************************/

CREATE PROCEDURE CAUSA_NOMINA_PROV (
    FEC DATE,
    PERIODO INTEGER,
    PERIODICIDAD INTEGER,
    PAGOGLOBAL CHAR(1) CHARACTER SET NONE,
    ANO CHAR(4) CHARACTER SET NONE)
RETURNS (
    IDNOMINA INTEGER)
AS
BEGIN
  EXIT;
END^



SET TERM ; ^
/******************************************************************************/
/****                              Generators                              ****/
/******************************************************************************/

CREATE GENERATOR ID_NOMINA_PROV;
SET GENERATOR ID_NOMINA_PROV TO 0;


/******************************************************************************/
/****                                Tables                                ****/
/******************************************************************************/



CREATE TABLE NOMINA_PROV (
    NOPO_ID            ID NOT NULL,
    NOPO_FECCAUSA      FECHA,
    NOPO_OBS           BLOB SUB_TYPE 0 SEGMENT SIZE 80,
    NOPO_PAGOGLOBAL    BOOLEANO,
    NOPO_PERIODOCIDAD  ID,
    NOPO_PERIODO       ID,
    NOPO_ANO           ANO,
    NOPO_LIQOK         BOOLEANO,
    NOPO_APOROK        CHAR(1) CHARACTER SET NONE,
    NOPO_PAGOOK        BOOLEANO
);


CREATE TABLE NOMINA_COMISIONES_PROV (
    NCOP_ID            INTEGER NOT NULL,
    NCOP_ITEM          INTEGER NOT NULL,
    NCOP_PERIODICIDAD  INTEGER,
    TERC_NIT           NIT,
    NCOP_ANO           ANO,
    NCOP_PERIODO       INTEGER,
    NCOP_MONTO         MONTO
);


CREATE TABLE nomina_conceptos_prov (
    NOPO_ID          ID NOT NULL,
    NCOP_ITEM        ID NOT NULL,
    CONC_COD         ID,
    TERC_NIT         NIT,
    NCOP_VALOR       MONTO,
    NCOP_ENTIDAD     NIT,
    NCOP_DEDUC       CHAR(1) CHARACTER SET NONE,
    NCOP_PROV        CHAR(1) CHARACTER SET NONE,
    NCOP_APORTE      BOOLEANO,
    NCOP_PAGOOK      BOOLEANO,
    NCOP_PERIODO     INTEGER,
    NCOP_ANO         ANO,
    NCOP_MOD         BOOLEANO,
    NCOP_APLICAPROM  BOOLEANO,
    NCOP_SALARIO     BOOLEANO,
    NCOP_GTOEMPR     CHAR(1) CHARACTER SET NONE
);


CREATE TABLE NOMINA_DETALLE_PROV (
    NOPO_ID        ID NOT NULL,
    TERC_NIT       NIT NOT NULL,
    NDEP_HORASDI   ENTERO,
    NDEP_HORASNO   ENTERO,
    NDEP_HORASFD   ENTERO,
    NDEP_HORASFN   ENTERO,
    NDEP_EXTRAS    MONTO,
    NDEP_OTROSDEV  MONTO,
    NDEP_PRESTA    MONTO,
    NDEP_OTROSDES  MONTO,
    NDEP_RETEN     MONTO,
    NDEP_ANO       ANO,
    NDEP_DIASLAB   INTEGER
);




/******************************************************************************/
/****                             Primary Keys                             ****/
/******************************************************************************/

ALTER TABLE NOMINA_PROV ADD CONSTRAINT PK_NOMINA_PROV PRIMARY KEY (NOPO_ID);
ALTER TABLE NOMINA_COMISIONES_PROV ADD CONSTRAINT PK_NOMINA_COMISIONES_PROV PRIMARY KEY (NCOP_ID, NCOP_ITEM);
ALTER TABLE nomina_conceptos_prov ADD CONSTRAINT PK_nominaconceptosprov_NOPO_ID PRIMARY KEY (NCOP_ITEM, NOPO_ID);
ALTER TABLE NOMINA_DETALLE_PROV ADD CONSTRAINT PK_NOMINA_DETALLE_PROV PRIMARY KEY (NOPO_ID, TERC_NIT);


/******************************************************************************/
/****                             Foreign Keys                             ****/
/******************************************************************************/

ALTER TABLE NOMINA_COMISIONES_PROV ADD CONSTRAINT FK_NOMINA_COMISIONES_PROV_2 FOREIGN KEY (TERC_NIT) REFERENCES TERCEROS (TERC_NIT);
ALTER TABLE nomina_conceptos_prov ADD CONSTRAINT FK_nominaconceptosprov_MONI_ID FOREIGN KEY (NOPO_ID) REFERENCES NOMINA_PROV (NOPO_ID) ON DELETE CASCADE ON UPDATE CASCADE;
ALTER TABLE NOMINA_DETALLE_PROV ADD CONSTRAINT FK_NOMINA_D_FK_NOMINA_PROV FOREIGN KEY (NOPO_ID) REFERENCES NOMINA_PROV (NOPO_ID) ON DELETE CASCADE ON UPDATE CASCADE;


/******************************************************************************/
/****                               Triggers                               ****/
/******************************************************************************/


SET TERM ^ ;


/******************************************************************************/
/****                         Triggers for tables                          ****/
/******************************************************************************/


/* Trigger: NOMINA_BI */
CREATE TRIGGER NOMINA_PROV_BI FOR NOMINA_PROV
ACTIVE BEFORE INSERT POSITION 0
as
declare variable existe integer;
begin
  existe = 0;
  select count(NOPO_id) from nomina_PROV where NOPO_PERIODOCIDAD = new.NOPO_PERIODOCIDAD and NOPO_ano = new.NOPO_ano and NOPO_periodo = new.NOPO_periodo into :existe;
  if (existe > 0) then
    exception nomina_registrada;
end
^


/* Trigger: nomina_conceptos_prov_BI0 */
CREATE TRIGGER nomina_conceptos_prov_BI FOR nomina_conceptos_prov
ACTIVE BEFORE INSERT POSITION 0
AS
declare variable ITEM INTEGER;
declare variable NOMIID INTEGER;
declare variable NOMIIDmaestro INTEGER;
begin
  /* Trigger text */
if (new.NOPO_id <> 0) then
begin
  select max (NOPO_ID) FROM nomina_PROV INTO :NOMIIDMAESTRO;
  SELECT MAX (NCOP_ITEM) FROM nomina_conceptos_prov WHERE NOPO_ID = :NOMIIDMAESTRO
  into :item;
  if (item is null) then
  BEGIN
  item = 1;
  NEW.NOPO_id = :NOMIIDMAESTRO;
  NEW.NCOP_item = :ITEM;
  END
  ELSE
  BEGIN
  ITEM = ITEM + 1;
  NEW.NOPO_id = :NOMIIDMAESTRO;
  NEW.NCOP_item = :ITEM;
  END
end
  if (new.NCOP_deduc = 'S') then
  NEW.NCOP_valor = NEW.NCOP_valor * (-1);
  if (new.NCOP_pagook is null) then
  new.NCOP_pagook = 'N';
end
^


/* Trigger: nomina_conceptos_prov_BU */
CREATE TRIGGER nomina_conceptos_PROV_BU FOR nomina_conceptos_prov
ACTIVE BEFORE UPDATE POSITION 0
as
begin
  if ((new.NCOP_deduc = 'S') and (new.NCOP_valor > 0)) then
  NEW.NCOP_valor = NEW.NCOP_valor * (-1);
end
^


/* Trigger: NOMINA_DETALLE_AI0 */
CREATE TRIGGER NOMINA_DETALLE_PROV_AI0 FOR NOMINA_DETALLE_PROV
ACTIVE AFTER INSERT POSITION 0
AS
begin
EXECUTE PROCEDURE liquida_horas_extra (NEW.terc_nit,NEW.NOPO_id,NEW.NDEP_horasdi,NEW.NDEP_horasno,NEW.NDEP_horasfd,NEW.NDEP_horasfn, NEW.NDEP_ano);
end
^


/* Trigger: NOMINA_DETALLE_BI */
CREATE TRIGGER NOMINA_DETALLE_PROV_BI FOR NOMINA_DETALLE_PROV
ACTIVE BEFORE INSERT POSITION 0
as
declare variable PERIODO INTEGER;
declare variable fec date;
begin
SELECT N.NOPO_periodo, n.NOPO_feccausa FROM NOMINA_PROV N WHERE N.NOPO_id = NEW.NOPO_id INTO :periodo, :fec;
EXECUTE PROCEDURE DIAS_LABORADOS (NEW.terc_nit, :periodo, :fec)returning_values(NEW.NDEP_diaslab);
end
^



/******************************************************************************/
/****                          Stored Procedures                           ****/
/******************************************************************************/

CREATE PROCEDURE CAMBIE_ID_NOMINA_PROV
RETURNS (
    ID INTEGER)
AS
BEGIN
  EXIT;
END^



SET TERM ; ^
/******************************************************************************/
/****                          Stored Procedures                           ****/
/******************************************************************************/


SET TERM ^ ;

ALTER PROCEDURE CAMBIE_ID_NOMINA_PROV
RETURNS (
    ID INTEGER)
AS
declare variable numrows integer;
BEGIN
/* TRAE EL ID NUEVO Y LO ACTUALIZA */
NUMROWS = 1;
while (NUMROWS > 0) DO
    BEGIN
    ID = GEN_ID(id_nomina_PROV, 1);
    /* VERIFIQUE SI YA EXISTE */
    SELECT COUNT(*) FROM NOMINA_PROV WHERE NOPO_ID = :ID INTO :NUMROWS;
    END
SUSPEND;
END
^


SET TERM ; ^


/******************************************************************************/
/****                              Privileges                              ****/
/******************************************************************************/


/* Privileges of users */
GRANT EXECUTE ON PROCEDURE CAMBIE_ID_NOMINA_PROV TO PUBLIC;




/******************************************************************************/
/****                          Stored Procedures                           ****/
/******************************************************************************/


SET TERM ^ ;

ALTER PROCEDURE CAUSA_NOMINA_PROV (
    FEC DATE,
    PERIODO INTEGER,
    PERIODICIDAD INTEGER,
    PAGOGLOBAL CHAR(1) CHARACTER SET NONE,
    ANO CHAR(4) CHARACTER SET NONE)
RETURNS (
    IDNOMINA INTEGER)
AS
declare variable item integer;
declare variable nite varchar(20) character set none;
declare variable nit_tercero varchar(20);
declare variable concept integer;
declare variable montos numeric(18,2);
declare variable porcen numeric(9,4);
declare variable entidad varchar(20);
declare variable conc_cod integer;
declare variable conc_deduc char(1);
declare variable conc_porc numeric(9,4);
declare variable conc_entidad integer;
declare variable conc_monto numeric(18,2);
declare variable conc_modifi char(1);
declare variable conc_promedio char(1);
declare variable emco_perprom integer;
declare variable valor numeric(18,2);
declare variable diaslab integer;
declare variable conc_prov char(1);
declare variable conc_aporte char(1);
declare variable numeroprom integer;
declare variable conc_aplicaprom char(1);
declare variable perinicial integer;
declare variable anoprom integer;
declare variable conc_dias char(1);
declare variable conc_otroconc char(1);
declare variable conc_codotroconc integer;
declare variable anosum integer;
declare variable salario char(1) character set none;
declare variable liquidaper integer;
declare variable rmod numeric(2,2);
declare variable basico numeric(18,2);
declare variable niteps varchar(20);
declare variable nitafc varchar(20);
declare variable nitafp varchar(20);
declare variable nitccf varchar(20);
declare variable gtoempr char(1);
declare variable comision numeric(18,2);
declare variable cambsaltrans numeric(18,2);
declare variable saldosini numeric(18,2);
declare variable duranov integer;
declare variable base numeric(18,2);
declare variable aprox integer;
BEGIN
/*SI ES QUINCENAL*/
EXECUTE PROCEDURE cambie_id_nomina_PROV RETURNING_VALUES(:idnomina);
INSERT INTO nomina_prov (NOPO_id, NOPO_FECCAUSA, NOPO_PAGOGLOBAL, NOPO_PERIODOCIDAD, NOPO_PERIODO, NOPO_ANO, NOPO_LIQOK)
VALUES (:IDNOMINA, :fec,:pagoglobal, :periodicidad, :periodo, :ano, 'N');
 BEGIN
    item = 1;
    FOR SELECT E.TERC_NIT, E.empl_salario, e.empl_eps, e.empl_afc, e.empl_afp, e.empl_ccf
    FROM EMPLEADOS E
    WHERE E.empl_ppago = :periodicidad
    INTO :nite, :basico, :niteps, :nitafc, :nitafp, :nitccf
    DO
    BEGIN
    FOR SELECT CE.TERC_NIT, CE.CONC_COD, CE.EMCO_MONTO, CE.EMCO_PORC, ce.empl_entidad, CE.emco_perprom, CE.emco_luquidaper, CN.CONC_COD, CN.CONC_DEDUC,CN.CONC_PORC, CN.CONC_ENTIDAD, CN.CONC_MONTO,  CN.CONC_DIAS, CN.CONC_MODIFI,
    CN.CONC_PROMEDIO, CN.conc_salario, CE.emco_perprom, CN.conc_prov, CN.conc_aporte, CN.conc_aplicaprom, cn.conc_otroconc, cn.conc_codotroconc, CN.conc_gtoempr, CN.conc_base
    FROM empleado_conceptos CE, CONCEPTOS_NOMINA CN WHERE ((CE.terc_nit = :nite) AND (CE.CONC_COD = CN.CONC_COD) AND (CN.conc_fecini <= :fec AND CN.conc_fecfin >= :FEC) ) OR ((CE.terc_nit = :nite)
    AND (CE.CONC_COD = CN.CONC_COD) AND (cn.conc_todosper = 'N') AND (CE.emco_ppago = :periodo)) OR  ((CE.terc_nit = :nite) AND (CE.CONC_COD = CN.CONC_COD) AND cn.conc_todosper = 'S')  ORDER BY (TERC_NIT )
    INTO :nit_tercero, :concept,  :montos, :porcen, :entidad, :numeroprom, :liquidaper ,:CONC_COD, :CONC_DEDUC, :CONC_PORC,
    :CONC_ENTIDAD, :CONC_MONTO, :CONC_DIAS, :CONC_MODIFI,:CONC_PROMEDIO, :salario,:EMCO_PERPROM, :conc_prov, :conc_aporte , :CONC_APLICAPROM, :conc_otroconc, :conc_codotroconc, :gtoempr, :base
    DO
BEGIN
IF (periodicidad = 2) THEN
BEGIN
    IF (conc_dias = 'S') THEN
    EXECUTE PROCEDURE DIAS_LABORADOS (:nite, :periodo, :fec) RETURNING_VALUES (:diaslab);
    ELSE
    BEGIN
    IF (liquidaper = 0) THEN
    diaslab = 15;
    ELSE
    IF (liquidaper = 1) THEN
    diaslab = 30;
    ELSE
    IF (liquidaper = 2) THEN
    diaslab = 60;
    END
END
   ELSE
IF (periodicidad = 1) THEN
BEGIN
    IF (conc_dias = 'S') THEN
    EXECUTE PROCEDURE DIAS_LABORADOS (:nite, :periodo, :fec) RETURNING_VALUES (:diaslab);
    ELSE
    diaslab = 30;
END
   ELSE
IF (periodicidad = 3) THEN
BEGIN
    IF (conc_dias = 'S') THEN
    EXECUTE PROCEDURE DIAS_LABORADOS (:nite, :periodo, :fec) RETURNING_VALUES (:diaslab);
    ELSE
    BEGIN
    IF (liquidaper = 0) THEN
    diaslab = 7;
    ELSE
    IF (liquidaper = 1) THEN
    diaslab = 15;
    ELSE
    IF (liquidaper = 2) THEN
    diaslab = 30;
    END
END
 SELECT ((n.nono_valor /30) * n.nono_dura), (n.nono_dura) FROM nomina_novedades n WHERE n.tnov_cod = 11 AND n.terc_nit = :nite AND n.nono_periodo = :periodo INTO :cambsaltrans, :duranov;
 IF (cambsaltrans IS NULL) THEN
 cambsaltrans = 0;
 if (duranov is null) then
 duranov = 0;
 diaslab = :diaslab - :duranov;
 if (conc_cod = 921) then
 begin
 if (porcen IS NOT NULL AND porcen <> 0) then
 valor = ((basico / 30)* :diaslab ) * :PORCEN /100;
 ELSE
 if (conc_porc IS NOT null AND conc_porc <> 0) then
 valor = ((:basico / 30)* :diaslab ) * :conc_porc /100;
 end
 ELSE
 if (conc_cod = 922) then
 BEGIN
 SELECT P.prcu_monto FROM prestamo_cuotas P, prestamo_nomina PN WHERE P.prcu_ano = :ano AND P.prcu_periodo = :periodo AND PN.prno_id = P.prno_id AND PN.terc_nit = :nite INTO :valor;
 IF (valor IS NULL) THEN
 valor = 0;
 item = :item + 1;
 update prestamo_cuotas  P SET prcu_ok = 'S' WHERE P.prcu_ano = :ano AND P.prcu_periodo = :periodo AND P.prno_id = (SELECT PN.prno_id FROM prestamo_nomina PN WHERE PN.terc_nit = :nite);
 END
 ELSE
 BEGIN
    IF ((:montos = 0) OR (:montos IS NULL)) THEN
      BEGIN
      IF ((CONC_PORC = 0 AND :porcen = 0) OR (CONC_PORC IS NULL AND :porcen = 0) OR (CONC_PORC = 0 AND :porcen IS NULL) OR (CONC_PORC IS NULL AND :porcen IS NULL) ) THEN
        BEGIN
        IF ((conc_monto <> 0) AND (conc_monto IS NOT NULL) ) THEN
        BEGIN
        VALOR = :CONC_MONTO;
        END
        ELSE
        IF (salario = 'S' AND CONC_COD <> 900 AND CONC_COD <> 920) THEN
        BEGIN
        conc_monto = :basico;
        VALOR = (:conc_monto/30 * :diaslab ) + :cambsaltrans;
        END
        ELSE
        valor = montos;
        END
       ELSE
       BEGIN
        IF (:porcen <> 0) THEN
          BEGIN
            IF ((conc_monto <> 0) AND (conc_monto IS NOT NULL) ) THEN
            BEGIN
              VALOR = ((:CONC_MONTO ) * :PORCEN) /100;
            END
          END
          ELSE
          BEGIN
            IF ((conc_monto <> 0) AND (conc_monto IS NOT NULL) ) THEN
            BEGIN
              VALOR = ((:CONC_MONTO) * :conc_porc) /100;
            END
            ELSE
        IF (salario = 'S' AND CONC_COD <> 900 AND CONC_COD <> 920) THEN
            BEGIN
              conc_monto = :basico;
              VALOR = ((:CONC_MONTO)+ :cambsaltrans * :conc_porc) /100;
            END
          END
       END
      END
    ELSE
    BEGIN
      IF ((CONC_PORC = 0 or (conc_porc is null)) AND (:porcen = 0 or (porcen is null))) THEN
      BEGIN
      VALOR = (:montos);
      END
      ELSE
      BEGIN
        IF (:porcen <> 0 and porcen is not null) THEN
          BEGIN
          VALOR = ((:MONTOS ) * :PORCEN) /100;
          END
          ELSE
          BEGIN
          VALOR = ((:montos) * :CONC_PORC) /100;
          END
       END
   END
    IF (conc_promedio = 'S') THEN
    BEGIN
    perinicial = :periodo - (:numeroprom) + 1;
    anoprom = CAST (ano AS INTEGER);
    IF (perinicial <= 0) THEN
    BEGIN
    perinicial = 24 + :PERINICIAL;
    anoprom = CAST(ANO AS INTEGER) - 1;
    END
    SELECT SUM (NCOP_valor) FROM nomina_conceptos_prov n WHERE n.NCOP_aplicaprom = 'S' AND N.NCOP_periodo >= :perinicial - 1 AND N.NCOP_periodo < :periodo AND N.NCOP_ano >= :anoprom AND N.NCOP_ano <= :ano AND terc_nit = :nite INTO :valor;
    valor = (valor / numeroprom);
    SELECT NCOP_VALOR FROM nomina_conceptos_prov WHERE CONC_COD = :conc_cod AND TERC_NIT  = :nite AND NCOP_PAGOOK = 'N' AND NCOP_PERIODO = 0 INTO :saldosini;
    IF (saldosini IS NULL) THEN
    saldosini = 0;
    ELSE
    UPDATE nomina_conceptos_prov N SET NCOP_pagook = 'S' WHERE n.NCOP_aplicaprom = 'S' AND N.NCOP_periodo >= :perinicial - 1 AND N.NCOP_periodo < :periodo AND N.NCOP_ano >= :anoprom AND N.NCOP_ano <= :ano  AND CONC_COD = :conc_cod AND terc_nit = :nite AND NCOP_PERIODO = 0;
    VALOR = :valor + :saldosini;
    UPDATE nomina_conceptos_prov N SET NCOP_pagook = 'S' WHERE n.NCOP_aplicaprom = 'S' AND N.NCOP_periodo >= :perinicial - 1 AND N.NCOP_periodo < :periodo AND N.NCOP_ano >= :anoprom AND N.NCOP_ano <= :ano  AND CONC_COD = :conc_cod AND terc_nit = :nite;
    END
    IF (conc_otroconc = 'S') THEN
    BEGIN
    anosum = CAST(ano AS INTEGER);
    anosum = anosum - 1;
    SELECT SUM (NCOP_valor) FROM nomina_conceptos_prov n WHERE n.NCOP_ano = :anosum AND n.conc_cod = :conc_codotroconc AND N.terc_nit = :nite INTO :valor;
    SELECT NCOP_VALOR FROM nomina_conceptos_prov WHERE NCOP_ano = :anosum AND conc_cod = :conc_codotroconc AND terc_nit = :nite AND NCOP_PERIODO = 0 INTO :saldosini;
    IF (saldosini IS NULL) THEN
    saldosini = 0;
    ELSE
    UPDATE nomina_conceptos_prov SET NCOP_pagook = 'S' WHERE NCOP_ano = :anosum AND conc_cod = :conc_codotroconc AND NCOP_PERIODO = 0 AND terc_nit = :nite;
    VALOR = :valor + :saldosini;
    UPDATE nomina_conceptos_prov SET NCOP_pagook = 'S' WHERE NCOP_ano = :anosum AND conc_cod = :conc_codotroconc AND terc_nit = :nite;
    END
/*SI EL CONCEPTO ES UN APORTE*/
IF (conc_aporte = 'S') THEN
BEGIN
    IF ((:entidad = '' ) OR (entidad IS NULL)) THEN
    BEGIN
     SELECT c.NCOP_monto FROM nomina_comisiones_PROV c WHERE c.NCOP_ano = :ano AND c.NCOP_periodo = :periodo AND c.NCOP_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
     IF (comision IS NULL) THEN
     comision = 0;
     valor = :basico + :comision;
    IF ((conc_cod = 904) OR (conc_cod = 905) OR (conc_cod = 906)) THEN
            BEGIN
            entidad = :nitafp;
                IF (conc_cod = 904) THEN
                BEGIN
                SELECT A.paan_afptr FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = (((((:basico /30) * :diaslab ) + :comision)+ :cambsaltrans) * :PORCEN) /100;
                END
                ELSE
                IF ((conc_cod = 905) OR (conc_cod = 906)) THEN
                BEGIN
                SELECT A.paan_afpem FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = (((((:basico /30) * :diaslab ) + :comision)+ :cambsaltrans) * :PORCEN) /100;
                END
            END
            ELSE
       IF ((conc_cod = 907) OR (conc_cod = 914) OR (conc_cod = 915)) THEN
            BEGIN
            entidad = :niteps;
                IF (conc_cod = 907) THEN
                BEGIN
                SELECT A.paan_epstr FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = (((((:basico )/30 * :diaslab ) + :comision)+ :cambsaltrans) * :PORCEN) /100;
                END
                ELSE
                IF ((conc_cod = 914) OR (conc_cod = 915)) THEN
                BEGIN
                SELECT A.paan_epsem FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = (((((:basico )/30 * :diaslab ) + :comision)+ :cambsaltrans) * :PORCEN) /100;
                END
            END
            ELSE
       IF ((conc_cod = 910) OR (conc_cod = 911) OR (conc_cod = 916) OR (conc_cod = 917) OR (conc_cod = 918) OR (conc_cod = 919)) THEN
            BEGIN
            entidad = :nitccf;
            SELECT c.NCOP_monto FROM nomina_comisiones_PROV c WHERE c.NCOP_ano = :ano AND c.NCOP_periodo = :periodo AND c.NCOP_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
            IF (comision IS NULL) THEN
            comision = 0;
                IF ((conc_cod = 910) OR (conc_cod = 911) ) THEN
                BEGIN
                SELECT A.paan_ccf FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = (((((:basico )/30 * :diaslab ) + :comision)+ :cambsaltrans) * :PORCEN) /100;
                END
                ELSE
                IF ((conc_cod = 916) OR (conc_cod = 917)) THEN
                BEGIN
                SELECT A.paan_icbf FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = (((((:basico )/30 * :diaslab ) + :comision)+ :cambsaltrans) * :PORCEN) /100;
                END
                ELSE
                IF ((conc_cod = 918) OR (conc_cod = 919)) THEN
                BEGIN
                SELECT A.paan_sena FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = (((((:basico )/30 * :diaslab ) + :comision)+ :cambsaltrans) * :PORCEN) /100;
                END
            END
            ELSE
        IF ((conc_cod = 912) OR (conc_cod = 913)) THEN
            BEGIN
            entidad = :nitafc;
            SELECT c.NCOP_monto FROM nomina_comisiones_PROV c WHERE c.NCOP_ano = :ano AND c.NCOP_periodo = :periodo AND c.NCOP_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
            IF (comision IS NULL) THEN
            comision = 0;
                IF ((conc_cod = 912) OR (conc_cod = 913) ) THEN
                BEGIN
                SELECT A.paan_cesemp FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = ((((:basico + :comision)/30 * :diaslab )+ :cambsaltrans) * :PORCEN) /100;
                END
            END
            ELSE
        BEGIN
        IF (comision IS NULL) THEN
        comision = 0;
        SELECT c.NCOP_monto FROM nomina_comisiones_PROV c WHERE c.NCOP_ano = :ano AND c.NCOP_periodo = :periodo AND c.NCOP_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
        conc_monto = :basico + :comision;
        IF (conc_porc <> 0 AND conc_porc IS NOT NULL) THEN
        VALOR = (((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans) * :conc_porc) /100;
        ELSE
        IF (:porcen <> 0 AND :porcen IS NOT NULL) THEN
        VALOR = (((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans) * :porcen) /100;
        ELSE
        IF (:montos <> 0 AND :montos IS NOT NULL) THEN
        valor = :montos;
        ELSE
        IF (:conc_monto <> 0 AND :conc_monto IS NOT NULL) THEN
        valor = :conc_monto;
        END
    END
    END
    ELSE
    IF (conc_prov = 'S') THEN
    BEGIN
        conc_monto = :basico;
        IF (conc_porc <> 0 AND conc_porc IS NOT NULL) THEN
        VALOR = (((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans) * :conc_porc) /100;
        ELSE
        IF (porcen <> 0 AND porcen IS NOT NULL) THEN
        VALOR = (((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans) * :porcen) /100;
        ELSE
        IF (montos <> 0 AND montos IS NOT NULL) THEN
        VALOR = :montos;
        ELSE
        IF (conc_monto <> 0 AND conc_monto IS NOT NULL) THEN
        VALOR = :conc_monto;
    END
item = :item + 1;
END
 IF (conc_cod = 920) THEN
 BEGIN
 SELECT c.NCOP_monto FROM nomina_comisiones_PROV c WHERE c.NCOP_ano = :ano AND c.NCOP_periodo = :periodo AND c.NCOP_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :valor;
 IF (valor IS NULL) THEN
 valor = 0;
 item = :item + 1;
 END
    EXECUTE PROCEDURE LEE_CONFIGURACION('NOMINA','GENERAL','REDONDEO AL MULTIPLO DE DIEZ EN TOTALES')returning_values(:aprox);
    EXECUTE PROCEDURE REDONDEE(:valor, :aprox) RETURNING_VALUES (VALOR);
    IF (liquidaper = 0) THEN
    INSERT INTO nomina_conceptos_prov (NOPO_ID, NCOP_ITEM, conc_cod,  TERC_NIT, NCOP_VALOR, NCOP_ENTIDAD, NCOP_DEDUC , NCOP_PROV, NCOP_APORTE, NCOP_PERIODO, NCOP_ANO, NCOP_MOD, NCOP_APLICAPROM, NCOP_SALARIO, NCOP_gtoempr)
    VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
    ELSE
    IF (liquidaper = 1) THEN
    BEGIN
    rmod = mod(:periodo, 2);
    IF (rmod = 0) THEN
        INSERT INTO nomina_conceptos_prov (NOPO_ID, NCOP_ITEM, conc_cod,  TERC_NIT, NCOP_VALOR, NCOP_ENTIDAD, NCOP_DEDUC , NCOP_PROV, NCOP_APORTE, NCOP_PERIODO, NCOP_ANO, NCOP_MOD, NCOP_APLICAPROM, NCOP_SALARIO, NCOP_gtoempr)
        VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
    END
    ELSE
    IF (liquidaper = 2) THEN
    BEGIN
    rmod = mod(:periodo, 4);
    IF (rmod = 0) THEN
        INSERT INTO nomina_conceptos_prov (NOPO_ID, NCOP_ITEM, conc_cod,  TERC_NIT, NCOP_VALOR, NCOP_ENTIDAD, NCOP_DEDUC , NCOP_PROV, NCOP_APORTE, NCOP_PERIODO, NCOP_ANO, NCOP_MOD, NCOP_APLICAPROM, NCOP_SALARIO, NCOP_gtoempr)
        VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
    END
  END
 END
END
SUSPEND;
END
^


SET TERM ; ^


/******************************************************************************/
/****                              Privileges                              ****/
/******************************************************************************/


/* Privileges of users */
GRANT ALL ON NOMINA_PROV TO PUBLIC;
GRANT ALL ON NOMINA_COMISIONES TO PUBLIC;
GRANT ALL ON nomina_conceptos_prov TO PUBLIC;
GRANT ALL ON NOMINA_DETALLE_PROV TO PUBLIC;
GRANT EXECUTE ON PROCEDURE CAUSA_NOMINA_PROV TO PUBLIC;

/* Privileges of triggers */
GRANT UPDATE, REFERENCES ON nomina_conceptos_prov TO TRIGGER nomina_conceptos_prov_BU;
GRANT SELECT ON NOMINA_PROV TO TRIGGER NOMINA_DETALLE_PROV_BI;
GRANT UPDATE, REFERENCES ON NOMINA_DETALLE_PROV TO TRIGGER NOMINA_DETALLE_PROV_BI;
GRANT EXECUTE ON PROCEDURE DIAS_LABORADOS TO TRIGGER NOMINA_DETALLE_PROV_BI;

/* Privileges of procedures */
GRANT SELECT ON CONCEPTOS_NOMINA TO PROCEDURE CAUSA_NOMINA_PROV;
GRANT SELECT ON EMPLEADOS TO PROCEDURE CAUSA_NOMINA_PROV;
GRANT SELECT ON EMPLEADO_CONCEPTOS TO PROCEDURE CAUSA_NOMINA_PROV;
GRANT INSERT ON NOMINA_PROV TO PROCEDURE CAUSA_NOMINA_PROV;
GRANT INSERT ON nomina_conceptos_prov TO PROCEDURE CAUSA_NOMINA_PROV;
GRANT EXECUTE ON PROCEDURE CAMBIE_ID_NOMINA_PROV TO PROCEDURE CAUSA_NOMINA_PROV;
GRANT EXECUTE ON PROCEDURE DIAS_LABORADOS TO PROCEDURE CAUSA_NOMINA_PROV;
GRANT EXECUTE ON PROCEDURE REDONDEE TO PROCEDURE CAUSA_NOMINA_PROV;


SET TERM ^ ; 



/******************************************************************************/
/****                          Stored Procedures                           ****/
/******************************************************************************/

CREATE PROCEDURE IMPR_PLANILLA_NOMINA_PROV (
    ID INTEGER,
    PAGO CHAR(1) CHARACTER SET NONE,
    CTA CHAR(1) CHARACTER SET NONE)
RETURNS (
    FECHA DATE,
    OBSERVACIONES BLOB SUB_TYPE 0 SEGMENT SIZE 80,
    PAGOGLOBAL CHAR(1) CHARACTER SET NONE,
    PERIODO INTEGER,
    ANO CHAR(4) CHARACTER SET NONE,
    PERIODICIDAD VARCHAR(60) CHARACTER SET NONE,
    NITEMPL VARCHAR(20) CHARACTER SET NONE,
    VALOR NUMERIC(18,2),
    DEDUC CHAR(1) CHARACTER SET NONE,
    NOMBREEMPL VARCHAR(60) CHARACTER SET NONE,
    NOMCORTCONC VARCHAR(60) CHARACTER SET NONE,
    NOMBRECONC VARCHAR(60) CHARACTER SET NONE,
    CODCONC INTEGER,
    PROV CHAR(1) CHARACTER SET NONE,
    TOTALEMPL NUMERIC(18,2),
    TOTALDEDUC NUMERIC(18,2),
    TOTALDEVENG NUMERIC(18,2),
    NUMEMPL INTEGER,
    CTAEMPL VARCHAR(25) CHARACTER SET NONE,
    TOTALCTAS NUMERIC(18,2),
    SDOEMPL NUMERIC(18,2),
    DIASLAB INTEGER)
AS
BEGIN
  EXIT;
END^



SET TERM ; ^


/******************************************************************************/
/****                          Stored Procedures                           ****/
/******************************************************************************/


SET TERM ^ ;

ALTER PROCEDURE IMPR_PLANILLA_NOMINA_PROV (
    ID INTEGER,
    PAGO CHAR(1) CHARACTER SET NONE,
    CTA CHAR(1) CHARACTER SET NONE)
RETURNS (
    FECHA DATE,
    OBSERVACIONES BLOB SUB_TYPE 0 SEGMENT SIZE 80,
    PAGOGLOBAL CHAR(1) CHARACTER SET NONE,
    PERIODO INTEGER,
    ANO CHAR(4) CHARACTER SET NONE,
    PERIODICIDAD VARCHAR(60) CHARACTER SET NONE,
    NITEMPL VARCHAR(20) CHARACTER SET NONE,
    VALOR NUMERIC(18,2),
    DEDUC CHAR(1) CHARACTER SET NONE,
    NOMBREEMPL VARCHAR(60) CHARACTER SET NONE,
    NOMCORTCONC VARCHAR(60) CHARACTER SET NONE,
    NOMBRECONC VARCHAR(60) CHARACTER SET NONE,
    CODCONC INTEGER,
    PROV CHAR(1) CHARACTER SET NONE,
    TOTALEMPL NUMERIC(18,2),
    TOTALDEDUC NUMERIC(18,2),
    TOTALDEVENG NUMERIC(18,2),
    NUMEMPL INTEGER,
    CTAEMPL VARCHAR(25) CHARACTER SET NONE,
    TOTALCTAS NUMERIC(18,2),
    SDOEMPL NUMERIC(18,2),
    DIASLAB INTEGER)
AS
DECLARE VARIABLE NITANT VARCHAR(20);
DECLARE VARIABLE nitnue VARCHAR(20);
DECLARE VARIABLE NUMCONC INTEGER;
BEGIN
numempl = 0;
nitant = 0;
nitnue = 0;
IF (PAGO = 'N') THEN
BEGIN
FOR SELECT N.nopo_feccausa, N.nopo_obs, N.nopo_pagoglobal, N.nopo_periodo, N.nopo_ano, P.ppag_nombre, ND.ndep_diaslab FROM NOMINA_PROV N, periodo_pago P, NOMINA_DETALLE_PROV ND
 WHERE P.ppag_cod = N.nopo_periodocidad AND N.nopo_id = :ID AND N.nopo_id = ND.nopo_id
 INTO :fecha, :observaciones, :pagoglobal, :periodo, :ano, :periodicidad, :diaslab
 DO
 BEGIN
 FOR SELECT NC.terc_nit, NC.ncop_valor, NC.ncop_deduc, T.terc_nom, C.conc_nomcorto, C.conc_nombre, NC.conc_cod, NC.ncop_prov FROM NOMINA_CONCEPTOS_PROV NC, TERCEROS T, EMPLEADOS E, CONCEPTOS_NOMINA C
        WHERE NC.nopo_id = :ID AND T.terc_nit = E.terc_nit AND C.conc_cod = NC.conc_cod AND t.terc_nit = nc.terc_nit
      INTO :nitempl, :valor, :deduc, :nombreempl, :nomcortconc, :nombreconc, :codconc, :prov
 DO
 BEGIN
 IF (valor IS NULL) THEN
 valor = 0;
 SELECT SUM(NC.ncop_valor) FROM NOMINA_CONCEPTOS_PROV NC WHERE NC.ncop_prov = 'N' AND ncop_GTOEMPR = 'N' AND nopo_ID = :id AND TERC_NIT = :nitempl INTO :totalempl;
 SELECT SUM(NC.ncop_valor) FROM NOMINA_CONCEPTOS_PROV NC WHERE NC.ncop_prov = 'N' AND ncop_GTOEMPR = 'N' AND nopo_ID = :id AND TERC_NIT = :nitempl AND NC.ncop_deduc = 'S' INTO :totaldeduc;
 SELECT SUM(NC.ncop_valor) FROM NOMINA_CONCEPTOS_PROV NC WHERE NC.ncop_prov = 'N' AND ncop_GTOEMPR = 'N' AND nopo_ID = :id AND TERC_NIT = :nitempl AND NC.ncop_deduc = 'N' INTO :totaldeveng;
  SUSPEND;
 END
 END
END
ELSE
IF (PAGO = 'S') THEN
BEGIN
FOR SELECT N.nopo_feccausa, N.nopo_obs, N.nopo_pagoglobal, N.nopo_periodo, N.nopo_ano, P.ppag_nombre FROM NOMINA_PROV N, periodo_pago P
 WHERE P.ppag_cod = N.nopo_periodocidad AND N.nopo_id = :ID
 INTO :fecha, :observaciones, :pagoglobal, :periodo, :ano, :periodicidad
 DO
 BEGIN
 FOR SELECT NC.terc_nit, NC.ncop_valor, NC.ncop_deduc, T.terc_nom, C.conc_nomcorto, C.conc_nombre, NC.conc_cod, NC.ncop_prov FROM NOMINA_CONCEPTOS_PROV NC, TERCEROS T, EMPLEADOS E, CONCEPTOS_NOMINA C
        WHERE NC.nopo_id = :ID AND T.terc_nit = E.terc_nit AND C.conc_cod = NC.conc_cod AND t.terc_nit = nc.terc_nit AND NC.ncop_prov = 'N' AND NC.ncop_gtoempr = 'N'
      INTO :nitempl, :valor, :deduc, :nombreempl, :nomcortconc, :nombreconc, :codconc, :prov
 DO
 BEGIN
 IF (valor IS NULL) THEN
 valor = 0;
 SELECT SUM(NC.ncop_valor) FROM NOMINA_CONCEPTOS_PROV NC WHERE NC.ncop_prov = 'N' AND ncop_GTOEMPR = 'N' AND nopo_ID = :id AND TERC_NIT = :nitempl INTO :totalempl;
 SELECT SUM(NC.ncop_valor) FROM NOMINA_CONCEPTOS_PROV NC WHERE NC.ncop_prov = 'N' AND ncop_GTOEMPR = 'N' AND nopo_ID = :id AND TERC_NIT = :nitempl AND NC.ncop_deduc = 'S' INTO :totaldeduc;
 SELECT SUM(NC.ncop_valor) FROM NOMINA_CONCEPTOS_PROV NC WHERE NC.ncop_prov = 'N' AND ncop_GTOEMPR = 'N' AND nopo_ID = :id AND TERC_NIT = :nitempl AND NC.ncop_deduc = 'N' INTO :totaldeveng;
 IF (cta = 'S') THEN
 BEGIN
 SELECT COUNT(CONC_COD) FROM NOMINA_CONCEPTOS_PROV NC WHERE NC.ncop_prov = 'N' AND ncop_GTOEMPR = 'N' AND nopo_ID = :id AND TERC_NIT = :nitempl INTO :numconc;
 totalempl = totalempl / :numconc;
 SELECT SUM(NC.ncop_valor) FROM NOMINA_CONCEPTOS_PROV NC WHERE NC.ncop_prov = 'N' AND ncop_GTOEMPR = 'N' AND nopo_ID = :id AND TERC_NIT = :nitempl INTO :totalctas;
 END
 SELECT TERC_NIT, EMPL_CUENTA, EMPL_SALARIO FROM EMPLEADOS WHERE TERC_NIT = :nitempl INTO :nitnue, :ctaempl, :sdoempl;
 IF (nitnue IS NOT NULL) THEN
 BEGIN
 IF (nitnue <> nitant) THEN
 numempl = :numempl + 1;
 nitant = :nitnue;
 END
  SUSPEND;
 END
 END
END
END
^


SET TERM ; ^


/******************************************************************************/
/****                              Privileges                              ****/
/******************************************************************************/


/* Privileges of users */
GRANT EXECUTE ON PROCEDURE IMPR_PLANILLA_NOMINA_PROV TO PUBLIC;

ALTER TABLE NOMINA_PROV
ADD NOPO_OK BOOLEANO;

SET TERM ^ ;

ALTER PROCEDURE CAUSA_NOMINA(
    FEC DATE,
    PERIODO INTEGER,
    PERIODICIDAD INTEGER,
    PAGOGLOBAL CHAR(1),
    ANO CHAR(4))
RETURNS (
    IDNOMINA INTEGER)
AS
declare variable item integer;
declare variable nite varchar(20) character set none;
declare variable nit_tercero varchar(20);
declare variable concept integer;
declare variable montos numeric(18,2);
declare variable porcen numeric(9,4);
declare variable entidad varchar(20);
declare variable conc_cod integer;
declare variable conc_deduc char(1);
declare variable conc_porc numeric(9,4);
declare variable conc_entidad integer;
declare variable conc_monto numeric(18,2);
declare variable conc_modifi char(1);
declare variable conc_promedio char(1);
declare variable emco_perprom integer;
declare variable valor numeric(18,2);
declare variable diaslab integer;
declare variable conc_prov char(1);
declare variable conc_aporte char(1);
declare variable numeroprom integer;
declare variable conc_aplicaprom char(1);
declare variable perinicial integer;
declare variable anoprom integer;
declare variable conc_dias char(1);
declare variable conc_otroconc char(1);
declare variable conc_codotroconc integer;
declare variable anosum integer;
declare variable salario char(1) character set none;
declare variable liquidaper integer;
declare variable rmod numeric(2,2);
declare variable basico numeric(18,2);
declare variable niteps varchar(20);
declare variable nitafc varchar(20);
declare variable nitafp varchar(20);
declare variable nitccf varchar(20);
declare variable gtoempr char(1);
declare variable comision numeric(18,2);
declare variable cambsaltrans numeric(18,2);
declare variable saldosini numeric(18,2);
declare variable duranov integer;
declare variable base numeric(18,2);
declare variable aprox integer;
BEGIN
/*SI ES QUINCENAL*/
EXECUTE PROCEDURE cambie_id_nomina RETURNING_VALUES(:idnomina);
INSERT INTO nomina (nomi_id, NOMI_FECCAUSA, NOMI_PAGOGLOBAL, NOMI_PERIODOCIDAD, NOMI_PERIODO, NOMI_ANO, NOMI_LIQOK)
VALUES (:IDNOMINA, :fec,:pagoglobal, :periodicidad, :periodo, :ano, 'N');
 BEGIN
    item = 1;
    FOR SELECT E.TERC_NIT, E.empl_salario, e.empl_eps, e.empl_afc, e.empl_afp, e.empl_ccf
    FROM EMPLEADOS E
    WHERE E.empl_ppago = :periodicidad AND E.empl_fecret IS NULL
    INTO :nite, :basico, :niteps, :nitafc, :nitafp, :nitccf
    DO
    BEGIN
    FOR SELECT CE.TERC_NIT, CE.CONC_COD, CE.EMCO_MONTO, CE.EMCO_PORC, ce.empl_entidad, CE.emco_perprom, CE.emco_luquidaper, CN.CONC_COD, CN.CONC_DEDUC,CN.CONC_PORC, CN.CONC_ENTIDAD, CN.CONC_MONTO,  CN.CONC_DIAS, CN.CONC_MODIFI,
    CN.CONC_PROMEDIO, CN.conc_salario, CE.emco_perprom, CN.conc_prov, CN.conc_aporte, CN.conc_aplicaprom, cn.conc_otroconc, cn.conc_codotroconc, CN.conc_gtoempr, CN.conc_base
    FROM empleado_conceptos CE, CONCEPTOS_NOMINA CN WHERE ((CE.terc_nit = :nite) AND (CE.CONC_COD = CN.CONC_COD) AND (CN.conc_fecini <= :fec AND CN.conc_fecfin >= :FEC) ) OR ((CE.terc_nit = :nite)
    AND (CE.CONC_COD = CN.CONC_COD) AND (cn.conc_todosper = 'N') AND (CE.emco_ppago = :periodo)) OR  ((CE.terc_nit = :nite) AND (CE.CONC_COD = CN.CONC_COD) AND cn.conc_todosper = 'S')  ORDER BY (TERC_NIT )
    INTO :nit_tercero, :concept,  :montos, :porcen, :entidad, :numeroprom, :liquidaper ,:CONC_COD, :CONC_DEDUC, :CONC_PORC,
    :CONC_ENTIDAD, :CONC_MONTO, :CONC_DIAS, :CONC_MODIFI,:CONC_PROMEDIO, :salario,:EMCO_PERPROM, :conc_prov, :conc_aporte , :CONC_APLICAPROM, :conc_otroconc, :conc_codotroconc, :gtoempr, :base
    DO
BEGIN
IF (periodicidad = 2) THEN
BEGIN
    IF (conc_dias = 'S') THEN
    EXECUTE PROCEDURE DIAS_LABORADOS (:nite, :periodo, :fec) RETURNING_VALUES (:diaslab);
    ELSE
    BEGIN
    IF (liquidaper = 0) THEN
    diaslab = 15;
    ELSE
    IF (liquidaper = 1) THEN
    diaslab = 30;
    ELSE
    IF (liquidaper = 2) THEN
    diaslab = 60;
    END
END
   ELSE
IF (periodicidad = 1) THEN
BEGIN
    IF (conc_dias = 'S') THEN
    EXECUTE PROCEDURE DIAS_LABORADOS (:nite, :periodo, :fec) RETURNING_VALUES (:diaslab);
    ELSE
    diaslab = 30;
END
   ELSE
IF (periodicidad = 3) THEN
BEGIN
    IF (conc_dias = 'S') THEN
    EXECUTE PROCEDURE DIAS_LABORADOS (:nite, :periodo, :fec) RETURNING_VALUES (:diaslab);
    ELSE
    BEGIN
    IF (liquidaper = 0) THEN
    diaslab = 7;
    ELSE
    IF (liquidaper = 1) THEN
    diaslab = 15;
    ELSE
    IF (liquidaper = 2) THEN
    diaslab = 30;
    END
END
 SELECT ((n.nono_valor /30) * n.nono_dura), (n.nono_dura) FROM nomina_novedades n WHERE n.tnov_cod = 11 AND n.terc_nit = :nite AND n.nono_periodo = :periodo INTO :cambsaltrans, :duranov;
 IF (cambsaltrans IS NULL) THEN
 cambsaltrans = 0;
 if (duranov is null) then
 duranov = 0;
 diaslab = :diaslab - :duranov;
 if (conc_cod = 921) then
 begin
 if (porcen IS NOT NULL AND porcen <> 0) then
 valor = ((basico / 30)* :diaslab ) * :PORCEN /100;
 ELSE
 if (conc_porc IS NOT null AND conc_porc <> 0) then
 valor = ((:basico / 30)* :diaslab ) * :conc_porc /100;
 end
 ELSE
 if (conc_cod = 922) then
 BEGIN
 SELECT P.prcu_monto FROM prestamo_cuotas P, prestamo_nomina PN WHERE P.prcu_ano = :ano AND P.prcu_periodo = :periodo AND PN.prno_id = P.prno_id AND PN.terc_nit = :nite INTO :valor;
 IF (valor IS NULL) THEN
 valor = 0;
 item = :item + 1;
 update prestamo_cuotas  P SET prcu_ok = 'S' WHERE P.prcu_ano = :ano AND P.prcu_periodo = :periodo AND P.prno_id = (SELECT PN.prno_id FROM PRESTAMO_NOMINA PN WHERE PN.terc_nit = :nite);
 END
 ELSE
 BEGIN
    IF ((:montos = 0) OR (:montos IS NULL)) THEN
      BEGIN
      IF ((CONC_PORC = 0 AND :porcen = 0) OR (CONC_PORC IS NULL AND :porcen = 0) OR (CONC_PORC = 0 AND :porcen IS NULL) OR (CONC_PORC IS NULL AND :porcen IS NULL) ) THEN
        BEGIN
        IF ((conc_monto <> 0) AND (conc_monto IS NOT NULL) ) THEN
        BEGIN
        VALOR = :CONC_MONTO;
        if (:conc_dias = 'S') then
        valor = (:valor / 30) * :diaslab;
        END
        ELSE
        IF (salario = 'S' AND CONC_COD <> 900 AND CONC_COD <> 920) THEN
        BEGIN
        conc_monto = :basico;
        VALOR = (:conc_monto/30 * :diaslab ) + :cambsaltrans;
        END
        ELSE
        BEGIN
        valor = montos;
        if (:conc_dias = 'S') then
        valor = (:valor / 30) * :diaslab;
        END
        END
       ELSE
       BEGIN
        IF (:porcen <> 0) THEN
          BEGIN
            IF ((conc_monto <> 0) AND (conc_monto IS NOT NULL) ) THEN
            BEGIN
              VALOR = ((:CONC_MONTO ) * :PORCEN) /100;
            END
          END
          ELSE
          BEGIN
            IF ((conc_monto <> 0) AND (conc_monto IS NOT NULL) ) THEN
            BEGIN
              VALOR = ((:CONC_MONTO) * :conc_porc) /100;
            END
            ELSE
        IF (salario = 'S' AND CONC_COD <> 900 AND CONC_COD <> 920) THEN
            BEGIN
              conc_monto = :basico;
              VALOR = ((:CONC_MONTO)+ :cambsaltrans * :conc_porc) /100;
            END
          END
       END
      END
    ELSE
    BEGIN
      IF ((CONC_PORC = 0 or (conc_porc is null)) AND (:porcen = 0 or (porcen is null))) THEN
      BEGIN
      VALOR = (:montos);
      if (:conc_dias = 'S') then
      valor = (:valor / 30) * :diaslab;
      END
      ELSE
      BEGIN
        IF (:porcen <> 0 and porcen is not null) THEN
          BEGIN
          VALOR = ((:MONTOS ) * :PORCEN) /100;
          END
          ELSE
          BEGIN
          VALOR = ((:montos) * :CONC_PORC) /100;
          END
       END
   END
    IF (conc_promedio = 'S') THEN
    BEGIN
    perinicial = :periodo - (:numeroprom) + 1;
    anoprom = CAST (ano AS INTEGER);
    IF (perinicial <= 0) THEN
    BEGIN
    perinicial = 24 + :PERINICIAL;
    anoprom = CAST(ANO AS INTEGER) - 1;
    END
    SELECT SUM (noco_valor) FROM nomina_conceptos n WHERE n.noco_aplicaprom = 'S' AND N.noco_periodo >= :perinicial - 1 AND N.noco_periodo < :periodo AND N.noco_ano >= :anoprom AND N.noco_ano <= :ano AND terc_nit = :nite INTO :valor;
    valor = (valor / numeroprom);
    SELECT NOCO_VALOR FROM NOMINA_CONCEPTOS WHERE CONC_COD = :conc_cod AND TERC_NIT  = :nite AND NOCO_PAGOOK = 'N' AND NOCO_PERIODO = 0 INTO :saldosini;
    IF (saldosini IS NULL) THEN
    saldosini = 0;
    ELSE
    UPDATE nomina_conceptos N SET noco_pagook = 'S' WHERE n.noco_aplicaprom = 'S' AND N.noco_periodo >= :perinicial - 1 AND N.noco_periodo < :periodo AND N.noco_ano >= :anoprom AND N.noco_ano <= :ano  AND CONC_COD = :conc_cod AND terc_nit = :nite AND NOCO_PERIODO = 0;
    VALOR = :valor + :saldosini;
    UPDATE nomina_conceptos N SET noco_pagook = 'S' WHERE n.noco_aplicaprom = 'S' AND N.noco_periodo >= :perinicial - 1 AND N.noco_periodo < :periodo AND N.noco_ano >= :anoprom AND N.noco_ano <= :ano  AND CONC_COD = :conc_cod AND terc_nit = :nite;
    END
    IF (conc_otroconc = 'S') THEN
    BEGIN
    anosum = CAST(ano AS INTEGER);
    anosum = anosum - 1;
    SELECT SUM (noco_valor) FROM nomina_conceptos n WHERE n.noco_ano = :anosum AND n.conc_cod = :conc_codotroconc AND N.terc_nit = :nite INTO :valor;
    SELECT NOCO_VALOR FROM NOMINA_CONCEPTOS WHERE noco_ano = :anosum AND conc_cod = :conc_codotroconc AND terc_nit = :nite AND NOCO_PERIODO = 0 INTO :saldosini;
    IF (saldosini IS NULL) THEN
    saldosini = 0;
    ELSE
    UPDATE nomina_conceptos SET noco_pagook = 'S' WHERE noco_ano = :anosum AND conc_cod = :conc_codotroconc AND NOCO_PERIODO = 0 AND terc_nit = :nite;
    VALOR = :valor + :saldosini;
    UPDATE nomina_conceptos SET noco_pagook = 'S' WHERE noco_ano = :anosum AND conc_cod = :conc_codotroconc AND terc_nit = :nite;
    END
/*SI EL CONCEPTO ES UN APORTE*/
IF (conc_aporte = 'S') THEN
BEGIN
    IF ((:entidad = '' ) OR (entidad IS NULL)) THEN
    BEGIN
     SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
     IF (comision IS NULL) THEN
     comision = 0;
     valor = :basico + :comision;
    IF ((conc_cod = 904) OR (conc_cod = 905) OR (conc_cod = 906)) THEN
            BEGIN
            entidad = :nitafp;
                IF (conc_cod = 904) THEN
                BEGIN
                SELECT A.paan_afptr FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = (((((:basico /30) * :diaslab ) + :comision)+ :cambsaltrans) * :PORCEN) /100;
                END
                ELSE
                IF ((conc_cod = 905) OR (conc_cod = 906)) THEN
                BEGIN
                SELECT A.paan_afpem FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = (((((:basico /30) * :diaslab ) + :comision)+ :cambsaltrans) * :PORCEN) /100;
                END
            END
            ELSE
       IF ((conc_cod = 907) OR (conc_cod = 914) OR (conc_cod = 915)) THEN
            BEGIN
            entidad = :niteps;
                IF (conc_cod = 907) THEN
                BEGIN
                SELECT A.paan_epstr FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = (((((:basico )/30 * :diaslab ) + :comision)+ :cambsaltrans) * :PORCEN) /100;
                END
                ELSE
                IF ((conc_cod = 914) OR (conc_cod = 915)) THEN
                BEGIN
                SELECT A.paan_epsem FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = (((((:basico )/30 * :diaslab ) + :comision)+ :cambsaltrans) * :PORCEN) /100;
                END
            END
            ELSE
       IF ((conc_cod = 910) OR (conc_cod = 911) OR (conc_cod = 916) OR (conc_cod = 917) OR (conc_cod = 918) OR (conc_cod = 919)) THEN
            BEGIN
            entidad = :nitccf;
            SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
            IF (comision IS NULL) THEN
            comision = 0;
                IF ((conc_cod = 910) OR (conc_cod = 911) ) THEN
                BEGIN
                SELECT A.paan_ccf FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = (((((:basico )/30 * :diaslab ) + :comision)+ :cambsaltrans) * :PORCEN) /100;
                END
                ELSE
                IF ((conc_cod = 916) OR (conc_cod = 917)) THEN
                BEGIN
                SELECT A.paan_icbf FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = (((((:basico )/30 * :diaslab ) + :comision)+ :cambsaltrans) * :PORCEN) /100;
                END
                ELSE
                IF ((conc_cod = 918) OR (conc_cod = 919)) THEN
                BEGIN
                SELECT A.paan_sena FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = (((((:basico )/30 * :diaslab ) + :comision)+ :cambsaltrans) * :PORCEN) /100;
                END
            END
            ELSE
        IF ((conc_cod = 912) OR (conc_cod = 913)) THEN
            BEGIN
            entidad = :nitafc;
            SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
            IF (comision IS NULL) THEN
            comision = 0;
                IF ((conc_cod = 912) OR (conc_cod = 913) ) THEN
                BEGIN
                SELECT A.paan_cesemp FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = ((((:basico + :comision)/30 * :diaslab )+ :cambsaltrans) * :PORCEN) /100;
                END
            END
            ELSE
        BEGIN
        IF (comision IS NULL) THEN
        comision = 0;
        SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
        conc_monto = :basico + :comision;
        IF (conc_porc <> 0 AND conc_porc IS NOT NULL) THEN
        VALOR = (((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans) * :conc_porc) /100;
        ELSE
        IF (:porcen <> 0 AND :porcen IS NOT NULL) THEN
        VALOR = (((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans) * :porcen) /100;
        ELSE
        IF (:montos <> 0 AND :montos IS NOT NULL) THEN
        valor = :montos;
        ELSE
        IF (:conc_monto <> 0 AND :conc_monto IS NOT NULL) THEN
        valor = :conc_monto;
        END
    END
    END
    ELSE
    IF (conc_prov = 'S') THEN
    BEGIN
        conc_monto = :basico;
        IF (conc_porc <> 0 AND conc_porc IS NOT NULL) THEN
        VALOR = (((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans) * :conc_porc) /100;
        ELSE
        IF (porcen <> 0 AND porcen IS NOT NULL) THEN
        VALOR = (((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans) * :porcen) /100;
        ELSE
        IF (montos <> 0 AND montos IS NOT NULL) THEN
        VALOR = :montos;
        ELSE
        IF (conc_monto <> 0 AND conc_monto IS NOT NULL) THEN
        VALOR = :conc_monto;
    END
item = :item + 1;
END
 IF (conc_cod = 920) THEN
 BEGIN
 SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :valor;
 IF (valor IS NULL) THEN
 valor = 0;
 item = :item + 1;
 END
    EXECUTE PROCEDURE LEE_CONFIGURACION('NOMINA','GENERAL','REDONDEO AL MULTIPLO DE DIEZ EN TOTALES')returning_values(:aprox);
    EXECUTE PROCEDURE REDONDEE(:valor, :aprox) RETURNING_VALUES (VALOR);
    IF (liquidaper = 0) THEN
    INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
    VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
    ELSE
    IF (liquidaper = 1) THEN
    BEGIN
    rmod = mod(:periodo, 2);
    IF (rmod = 0) THEN
        INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
        VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
    END
    ELSE
    IF (liquidaper = 2) THEN
    BEGIN
    rmod = mod(:periodo, 4);
    IF (rmod = 0) THEN
        INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
        VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
    END
  END
 END
END
SUSPEND;
END
^

SET TERM ; ^


SET TERM ^ ;

ALTER TRIGGER NOMINA_CONCEPTOS_BI0
ACTIVE BEFORE INSERT POSITION 0
AS
declare variable ITEM INTEGER;
declare variable NOMIID INTEGER;
declare variable NOMIIDmaestro INTEGER;
begin
if (new.nomi_id <> 0) then
begin
  select max (NOMI_ID) FROM nomina INTO :NOMIIDMAESTRO;
  SELECT MAX (NOCO_ITEM) FROM nomina_conceptos WHERE NOMI_ID = :NOMIIDMAESTRO
  into :item;
  if (item is null) then
  BEGIN
  item = 1;
  NEW.nomi_id = :NOMIIDMAESTRO;
  NEW.noco_item = :ITEM;
  END
  ELSE
  BEGIN
  ITEM = ITEM + 1;
  NEW.nomi_id = :NOMIIDMAESTRO;
  NEW.noco_item = :ITEM;
  END
end
  if (new.noco_deduc = 'S' and new.noco_valor > 0) then
  NEW.noco_valor = NEW.noco_valor * (-1);
  if (new.noco_pagook is null) then
  new.noco_pagook = 'N';
end
^



CREATE PROCEDURE TRAER_NOMINA_PROVISIONAL (
    IDDOC INTEGER)
RETURNS (
    IDNOMINA INTEGER)
AS
BEGIN
  EXIT;
END^



SET TERM ; ^


SET TERM ^ ;

ALTER TABLE NOMINA ADD NOMI_PROVI VARCHAR(5);
^

ALTER PROCEDURE TRAER_NOMINA_PROVISIONAL (
    IDDOC INTEGER)
RETURNS (
    IDNOMINA INTEGER)
AS
begin
idnomina = GEN_ID(id_nomina,1);
INSERT INTO NOMINA (nomi_id, nomi_feccausa, nomi_obs, nomi_pagoglobal, nomi_periodocidad, nomi_periodo,nomi_ano, nomi_liqok, nomi_aporok, nomi_pagook, nomi_provi)
SELECT :idnomina ,nopo_feccausa, nopo_obs, nopo_pagoglobal, nopo_periodocidad, nopo_periodo,nopo_ano, 'N', nopo_aporok, nopo_pagook, nopo_ano || nopo_periodo FROM NOMINA_PROV WHERE NOPO_ID = :iddoc;

INSERT INTO NOMINA_CONCEPTOS (nomi_id,noco_item,conc_cod,terc_nit,noco_valor,noco_entidad,noco_deduc,noco_prov,noco_aporte,noco_pagook,noco_periodo,noco_ano,noco_mod,noco_aplicaprom,noco_salario,noco_gtoempr)
SELECT :idnomina ,ncop_item,conc_cod,terc_nit,ncop_valor,ncop_entidad,ncop_deduc,ncop_prov,ncop_aporte,ncop_pagook,ncop_periodo,ncop_ano,ncop_mod,ncop_aplicaprom,ncop_salario,ncop_gtoempr FROM NOMINA_CONCEPTOS_PROV
       WHERE NOPO_ID = :iddoc;
       
INSERT INTO NOMINA_DETALLE  (nomi_id,terc_nit,node_horasdi,node_horasno,node_horasfd,node_horasfn,node_extras,node_otrosdev,node_presta,node_otrosdes,node_reten,node_ano,node_diaslab)
SELECT :idnomina,terc_nit,NDEP_horasdi,NDEP_horasno,NDEP_horasfd,NDEP_horasfn,NDEP_extras,NDEP_otrosdev,NDEP_presta,NDEP_otrosdes,NDEP_reten,NDEP_ano,NDEP_diaslab FROM NOMINA_DETALLE_PROV
       WHERE NOPO_ID = :iddoc;
  suspend;
end
^


SET TERM ; ^

SET TERM ^ ;

ALTER procedure  TRAER_NOMINA_PROVISIONAL
(iddoc integer)
returns
(idnomina integer)
as
begin
idnomina = GEN_ID(id_nomina,1);
INSERT INTO NOMINA (nomi_id, nomi_feccausa, nomi_obs, nomi_pagoglobal, nomi_periodocidad, nomi_periodo,nomi_ano, nomi_liqok, nomi_aporok, nomi_pagook, nomi_provi)
SELECT :idnomina ,nopo_feccausa, nopo_obs, nopo_pagoglobal, nopo_periodocidad, nopo_periodo,nopo_ano, 'N', nopo_aporok, nopo_pagook, nopo_ano || nopo_periodo FROM NOMINA_PROV WHERE NOPO_ID = :iddoc;

INSERT INTO NOMINA_CONCEPTOS (nomi_id,noco_item,conc_cod,terc_nit,noco_valor,noco_entidad,noco_deduc,noco_prov,noco_aporte,noco_pagook,noco_periodo,noco_ano,noco_mod,noco_aplicaprom,noco_salario,noco_gtoempr)
SELECT :idnomina ,ncop_item,conc_cod,terc_nit,ncop_valor,ncop_entidad,ncop_deduc,ncop_prov,ncop_aporte,ncop_pagook,ncop_periodo,ncop_ano,ncop_mod,ncop_aplicaprom,ncop_salario,ncop_gtoempr FROM NOMINA_CONCEPTOS_PROV
       WHERE NOPO_ID = :iddoc;

  suspend;
end
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE CAUSA_NOMINA_PROV(
    FEC DATE,
    PERIODO INTEGER,
    PERIODICIDAD INTEGER,
    PAGOGLOBAL CHAR(1),
    ANO CHAR(4))
RETURNS (
    IDNOMINA INTEGER)
AS
declare variable item integer;
declare variable nite varchar(20) character set none;
declare variable nit_tercero varchar(20);
declare variable concept integer;
declare variable montos numeric(18,2);
declare variable porcen numeric(9,4);
declare variable entidad varchar(20);
declare variable conc_cod integer;
declare variable conc_deduc char(1);
declare variable conc_porc numeric(9,4);
declare variable conc_entidad integer;
declare variable conc_monto numeric(18,2);
declare variable conc_modifi char(1);
declare variable conc_promedio char(1);
declare variable emco_perprom integer;
declare variable valor numeric(18,2);
declare variable diaslab integer;
declare variable conc_prov char(1);
declare variable conc_aporte char(1);
declare variable numeroprom integer;
declare variable conc_aplicaprom char(1);
declare variable perinicial integer;
declare variable anoprom integer;
declare variable conc_dias char(1);
declare variable conc_otroconc char(1);
declare variable conc_codotroconc integer;
declare variable anosum integer;
declare variable salario char(1) character set none;
declare variable liquidaper integer;
declare variable rmod numeric(2,2);
declare variable basico numeric(18,2);
declare variable niteps varchar(20);
declare variable nitafc varchar(20);
declare variable nitafp varchar(20);
declare variable nitccf varchar(20);
declare variable gtoempr char(1);
declare variable comision numeric(18,2);
declare variable cambsaltrans numeric(18,2);
declare variable saldosini numeric(18,2);
declare variable duranov integer;
declare variable base numeric(18,2);
declare variable aprox integer;
BEGIN
/*SI ES QUINCENAL*/
EXECUTE PROCEDURE cambie_id_nomina_PROV RETURNING_VALUES(:idnomina);
INSERT INTO nomina_prov (NOPO_id, NOPO_FECCAUSA, NOPO_PAGOGLOBAL, NOPO_PERIODOCIDAD, NOPO_PERIODO, NOPO_ANO, NOPO_LIQOK)
VALUES (:IDNOMINA, :fec,:pagoglobal, :periodicidad, :periodo, :ano, 'N');
 BEGIN
    item = 1;
    FOR SELECT E.TERC_NIT, E.empl_salario, e.empl_eps, e.empl_afc, e.empl_afp, e.empl_ccf
    FROM EMPLEADOS E
    WHERE E.empl_ppago = :periodicidad AND E.empl_fecret IS NULL
    INTO :nite, :basico, :niteps, :nitafc, :nitafp, :nitccf
    DO
    BEGIN
    FOR SELECT CE.TERC_NIT, CE.CONC_COD, CE.EMCO_MONTO, CE.EMCO_PORC, ce.empl_entidad, CE.emco_perprom, CE.emco_luquidaper, CN.CONC_COD, CN.CONC_DEDUC,CN.CONC_PORC, CN.CONC_ENTIDAD, CN.CONC_MONTO,  CN.CONC_DIAS, CN.CONC_MODIFI,
    CN.CONC_PROMEDIO, CN.conc_salario, CE.emco_perprom, CN.conc_prov, CN.conc_aporte, CN.conc_aplicaprom, cn.conc_otroconc, cn.conc_codotroconc, CN.conc_gtoempr, CN.conc_base
    FROM empleado_conceptos CE, CONCEPTOS_NOMINA CN WHERE ((CE.terc_nit = :nite) AND (CE.CONC_COD = CN.CONC_COD) AND (CN.conc_fecini <= :fec AND CN.conc_fecfin >= :FEC) ) OR ((CE.terc_nit = :nite)
    AND (CE.CONC_COD = CN.CONC_COD) AND (cn.conc_todosper = 'N') AND (CE.emco_ppago = :periodo)) OR  ((CE.terc_nit = :nite) AND (CE.CONC_COD = CN.CONC_COD) AND cn.conc_todosper = 'S')  ORDER BY (TERC_NIT )
    INTO :nit_tercero, :concept,  :montos, :porcen, :entidad, :numeroprom, :liquidaper ,:CONC_COD, :CONC_DEDUC, :CONC_PORC,
    :CONC_ENTIDAD, :CONC_MONTO, :CONC_DIAS, :CONC_MODIFI,:CONC_PROMEDIO, :salario,:EMCO_PERPROM, :conc_prov, :conc_aporte , :CONC_APLICAPROM, :conc_otroconc, :conc_codotroconc, :gtoempr, :base
    DO
BEGIN
IF (periodicidad = 2) THEN
BEGIN
    IF (conc_dias = 'S') THEN
    EXECUTE PROCEDURE DIAS_LABORADOS (:nite, :periodo, :fec) RETURNING_VALUES (:diaslab);
    ELSE
    BEGIN
    IF (liquidaper = 0) THEN
    diaslab = 15;
    ELSE
    IF (liquidaper = 1) THEN
    diaslab = 30;
    ELSE
    IF (liquidaper = 2) THEN
    diaslab = 60;
    END
END
   ELSE
IF (periodicidad = 1) THEN
BEGIN
    IF (conc_dias = 'S') THEN
    EXECUTE PROCEDURE DIAS_LABORADOS (:nite, :periodo, :fec) RETURNING_VALUES (:diaslab);
    ELSE
    diaslab = 30;
END
   ELSE
IF (periodicidad = 3) THEN
BEGIN
    IF (conc_dias = 'S') THEN
    EXECUTE PROCEDURE DIAS_LABORADOS (:nite, :periodo, :fec) RETURNING_VALUES (:diaslab);
    ELSE
    BEGIN
    IF (liquidaper = 0) THEN
    diaslab = 7;
    ELSE
    IF (liquidaper = 1) THEN
    diaslab = 15;
    ELSE
    IF (liquidaper = 2) THEN
    diaslab = 30;
    END
END
 SELECT ((n.nono_valor /30) * n.nono_dura), (n.nono_dura) FROM nomina_novedades n WHERE n.tnov_cod = 11 AND n.terc_nit = :nite AND n.nono_periodo = :periodo INTO :cambsaltrans, :duranov;
 IF (cambsaltrans IS NULL) THEN
 cambsaltrans = 0;
 if (duranov is null) then
 duranov = 0;
 diaslab = :diaslab - :duranov;
 if (conc_cod = 921) then
 begin
 if (porcen IS NOT NULL AND porcen <> 0) then
 valor = ((basico / 30)* :diaslab ) * :PORCEN /100;
 ELSE
 if (conc_porc IS NOT null AND conc_porc <> 0) then
 valor = ((:basico / 30)* :diaslab ) * :conc_porc /100;
 end
 ELSE
 if (conc_cod = 922) then
 BEGIN
 SELECT P.prcu_monto FROM prestamo_cuotas P, prestamo_nomina PN WHERE P.prcu_ano = :ano AND P.prcu_periodo = :periodo AND PN.prno_id = P.prno_id AND PN.terc_nit = :nite INTO :valor;
 IF (valor IS NULL) THEN
 valor = 0;
 item = :item + 1;
 update prestamo_cuotas  P SET prcu_ok = 'S' WHERE P.prcu_ano = :ano AND P.prcu_periodo = :periodo AND P.prno_id = (SELECT PN.prno_id FROM prestamo_nomina PN WHERE PN.terc_nit = :nite);
 END
 ELSE
 BEGIN
    IF ((:montos = 0) OR (:montos IS NULL)) THEN
      BEGIN
      IF ((CONC_PORC = 0 AND :porcen = 0) OR (CONC_PORC IS NULL AND :porcen = 0) OR (CONC_PORC = 0 AND :porcen IS NULL) OR (CONC_PORC IS NULL AND :porcen IS NULL) ) THEN
        BEGIN
        IF ((conc_monto <> 0) AND (conc_monto IS NOT NULL) ) THEN
        BEGIN
        VALOR = :CONC_MONTO;
        END
        ELSE
        IF (salario = 'S' AND CONC_COD <> 900 AND CONC_COD <> 920) THEN
        BEGIN
        conc_monto = :basico;
        VALOR = (:conc_monto/30 * :diaslab ) + :cambsaltrans;
        END
        ELSE
        valor = montos;
        END
       ELSE
       BEGIN
        IF (:porcen <> 0) THEN
          BEGIN
            IF ((conc_monto <> 0) AND (conc_monto IS NOT NULL) ) THEN
            BEGIN
              VALOR = ((:CONC_MONTO ) * :PORCEN) /100;
            END
          END
          ELSE
          BEGIN
            IF ((conc_monto <> 0) AND (conc_monto IS NOT NULL) ) THEN
            BEGIN
              VALOR = ((:CONC_MONTO) * :conc_porc) /100;
            END
            ELSE
        IF (salario = 'S' AND CONC_COD <> 900 AND CONC_COD <> 920) THEN
            BEGIN
              conc_monto = :basico;
              VALOR = ((:CONC_MONTO)+ :cambsaltrans * :conc_porc) /100;
            END
          END
       END
      END
    ELSE
    BEGIN
      IF ((CONC_PORC = 0 or (conc_porc is null)) AND (:porcen = 0 or (porcen is null))) THEN
      BEGIN
      VALOR = (:montos);
      END
      ELSE
      BEGIN
        IF (:porcen <> 0 and porcen is not null) THEN
          BEGIN
          VALOR = ((:MONTOS ) * :PORCEN) /100;
          END
          ELSE
          BEGIN
          VALOR = ((:montos) * :CONC_PORC) /100;
          END
       END
   END
    IF (conc_promedio = 'S') THEN
    BEGIN
    perinicial = :periodo - (:numeroprom) + 1;
    anoprom = CAST (ano AS INTEGER);
    IF (perinicial <= 0) THEN
    BEGIN
    perinicial = 24 + :PERINICIAL;
    anoprom = CAST(ANO AS INTEGER) - 1;
    END
    SELECT SUM (NCOP_valor) FROM nomina_conceptos_prov n WHERE n.NCOP_aplicaprom = 'S' AND N.NCOP_periodo >= :perinicial - 1 AND N.NCOP_periodo < :periodo AND N.NCOP_ano >= :anoprom AND N.NCOP_ano <= :ano AND terc_nit = :nite INTO :valor;
    valor = (valor / numeroprom);
    SELECT NCOP_VALOR FROM nomina_conceptos_prov WHERE CONC_COD = :conc_cod AND TERC_NIT  = :nite AND NCOP_PAGOOK = 'N' AND NCOP_PERIODO = 0 INTO :saldosini;
    IF (saldosini IS NULL) THEN
    saldosini = 0;
    ELSE
    UPDATE nomina_conceptos_prov N SET NCOP_pagook = 'S' WHERE n.NCOP_aplicaprom = 'S' AND N.NCOP_periodo >= :perinicial - 1 AND N.NCOP_periodo < :periodo AND N.NCOP_ano >= :anoprom AND N.NCOP_ano <= :ano  AND CONC_COD = :conc_cod AND terc_nit = :nite AND NCOP_PERIODO = 0;
    VALOR = :valor + :saldosini;
    UPDATE nomina_conceptos_prov N SET NCOP_pagook = 'S' WHERE n.NCOP_aplicaprom = 'S' AND N.NCOP_periodo >= :perinicial - 1 AND N.NCOP_periodo < :periodo AND N.NCOP_ano >= :anoprom AND N.NCOP_ano <= :ano  AND CONC_COD = :conc_cod AND terc_nit = :nite;
    END
    IF (conc_otroconc = 'S') THEN
    BEGIN
    anosum = CAST(ano AS INTEGER);
    anosum = anosum - 1;
    SELECT SUM (NCOP_valor) FROM nomina_conceptos_prov n WHERE n.NCOP_ano = :anosum AND n.conc_cod = :conc_codotroconc AND N.terc_nit = :nite INTO :valor;
    SELECT NCOP_VALOR FROM nomina_conceptos_prov WHERE NCOP_ano = :anosum AND conc_cod = :conc_codotroconc AND terc_nit = :nite AND NCOP_PERIODO = 0 INTO :saldosini;
    IF (saldosini IS NULL) THEN
    saldosini = 0;
    ELSE
    UPDATE nomina_conceptos_prov SET NCOP_pagook = 'S' WHERE NCOP_ano = :anosum AND conc_cod = :conc_codotroconc AND NCOP_PERIODO = 0 AND terc_nit = :nite;
    VALOR = :valor + :saldosini;
    UPDATE nomina_conceptos_prov SET NCOP_pagook = 'S' WHERE NCOP_ano = :anosum AND conc_cod = :conc_codotroconc AND terc_nit = :nite;
    END
/*SI EL CONCEPTO ES UN APORTE*/
IF (conc_aporte = 'S') THEN
BEGIN
    IF ((:entidad = '' ) OR (entidad IS NULL)) THEN
    BEGIN
     SELECT c.NCOP_monto FROM nomina_comisiones_PROV c WHERE c.NCOP_ano = :ano AND c.NCOP_periodo = :periodo AND c.NCOP_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
     IF (comision IS NULL) THEN
     comision = 0;
     valor = :basico + :comision;
    IF ((conc_cod = 904) OR (conc_cod = 905) OR (conc_cod = 906)) THEN
            BEGIN
            entidad = :nitafp;
                IF (conc_cod = 904) THEN
                BEGIN
                SELECT A.paan_afptr FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = (((((:basico /30) * :diaslab ) + :comision)+ :cambsaltrans) * :PORCEN) /100;
                END
                ELSE
                IF ((conc_cod = 905) OR (conc_cod = 906)) THEN
                BEGIN
                SELECT A.paan_afpem FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = (((((:basico /30) * :diaslab ) + :comision)+ :cambsaltrans) * :PORCEN) /100;
                END
            END
            ELSE
       IF ((conc_cod = 907) OR (conc_cod = 914) OR (conc_cod = 915)) THEN
            BEGIN
            entidad = :niteps;
                IF (conc_cod = 907) THEN
                BEGIN
                SELECT A.paan_epstr FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = (((((:basico )/30 * :diaslab ) + :comision)+ :cambsaltrans) * :PORCEN) /100;
                END
                ELSE
                IF ((conc_cod = 914) OR (conc_cod = 915)) THEN
                BEGIN
                SELECT A.paan_epsem FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = (((((:basico )/30 * :diaslab ) + :comision)+ :cambsaltrans) * :PORCEN) /100;
                END
            END
            ELSE
       IF ((conc_cod = 910) OR (conc_cod = 911) OR (conc_cod = 916) OR (conc_cod = 917) OR (conc_cod = 918) OR (conc_cod = 919)) THEN
            BEGIN
            entidad = :nitccf;
            SELECT c.NCOP_monto FROM nomina_comisiones_PROV c WHERE c.NCOP_ano = :ano AND c.NCOP_periodo = :periodo AND c.NCOP_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
            IF (comision IS NULL) THEN
            comision = 0;
                IF ((conc_cod = 910) OR (conc_cod = 911) ) THEN
                BEGIN
                SELECT A.paan_ccf FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = (((((:basico )/30 * :diaslab ) + :comision)+ :cambsaltrans) * :PORCEN) /100;
                END
                ELSE
                IF ((conc_cod = 916) OR (conc_cod = 917)) THEN
                BEGIN
                SELECT A.paan_icbf FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = (((((:basico )/30 * :diaslab ) + :comision)+ :cambsaltrans) * :PORCEN) /100;
                END
                ELSE
                IF ((conc_cod = 918) OR (conc_cod = 919)) THEN
                BEGIN
                SELECT A.paan_sena FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = (((((:basico )/30 * :diaslab ) + :comision)+ :cambsaltrans) * :PORCEN) /100;
                END
            END
            ELSE
        IF ((conc_cod = 912) OR (conc_cod = 913)) THEN
            BEGIN
            entidad = :nitafc;
            SELECT c.NCOP_monto FROM nomina_comisiones_PROV c WHERE c.NCOP_ano = :ano AND c.NCOP_periodo = :periodo AND c.NCOP_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
            IF (comision IS NULL) THEN
            comision = 0;
                IF ((conc_cod = 912) OR (conc_cod = 913) ) THEN
                BEGIN
                SELECT A.paan_cesemp FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = ((((:basico + :comision)/30 * :diaslab )+ :cambsaltrans) * :PORCEN) /100;
                END
            END
            ELSE
        BEGIN
        IF (comision IS NULL) THEN
        comision = 0;
        SELECT c.NCOP_monto FROM nomina_comisiones_PROV c WHERE c.NCOP_ano = :ano AND c.NCOP_periodo = :periodo AND c.NCOP_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
        conc_monto = :basico + :comision;
        IF (conc_porc <> 0 AND conc_porc IS NOT NULL) THEN
        VALOR = (((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans) * :conc_porc) /100;
        ELSE
        IF (:porcen <> 0 AND :porcen IS NOT NULL) THEN
        VALOR = (((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans) * :porcen) /100;
        ELSE
        IF (:montos <> 0 AND :montos IS NOT NULL) THEN
        valor = :montos;
        ELSE
        IF (:conc_monto <> 0 AND :conc_monto IS NOT NULL) THEN
        valor = :conc_monto;
        END
    END
    END
    ELSE
    IF (conc_prov = 'S') THEN
    BEGIN
        conc_monto = :basico;
        IF (conc_porc <> 0 AND conc_porc IS NOT NULL) THEN
        VALOR = (((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans) * :conc_porc) /100;
        ELSE
        IF (porcen <> 0 AND porcen IS NOT NULL) THEN
        VALOR = (((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans) * :porcen) /100;
        ELSE
        IF (montos <> 0 AND montos IS NOT NULL) THEN
        VALOR = :montos;
        ELSE
        IF (conc_monto <> 0 AND conc_monto IS NOT NULL) THEN
        VALOR = :conc_monto;
    END
item = :item + 1;
END
 IF (conc_cod = 920) THEN
 BEGIN
 SELECT c.NCOP_monto FROM nomina_comisiones_PROV c WHERE c.NCOP_ano = :ano AND c.NCOP_periodo = :periodo AND c.NCOP_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :valor;
 IF (valor IS NULL) THEN
 valor = 0;
 item = :item + 1;
 END
    EXECUTE PROCEDURE LEE_CONFIGURACION('NOMINA','GENERAL','REDONDEO AL MULTIPLO DE DIEZ EN TOTALES')returning_values(:aprox);
    EXECUTE PROCEDURE REDONDEE(:valor, :aprox) RETURNING_VALUES (VALOR);
    IF (liquidaper = 0) THEN
    INSERT INTO nomina_conceptos_prov (NOPO_ID, NCOP_ITEM, conc_cod,  TERC_NIT, NCOP_VALOR, NCOP_ENTIDAD, NCOP_DEDUC , NCOP_PROV, NCOP_APORTE, NCOP_PERIODO, NCOP_ANO, NCOP_MOD, NCOP_APLICAPROM, NCOP_SALARIO, NCOP_gtoempr)
    VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
    ELSE
    IF (liquidaper = 1) THEN
    BEGIN
    rmod = mod(:periodo, 2);
    IF (rmod = 0) THEN
        INSERT INTO nomina_conceptos_prov (NOPO_ID, NCOP_ITEM, conc_cod,  TERC_NIT, NCOP_VALOR, NCOP_ENTIDAD, NCOP_DEDUC , NCOP_PROV, NCOP_APORTE, NCOP_PERIODO, NCOP_ANO, NCOP_MOD, NCOP_APLICAPROM, NCOP_SALARIO, NCOP_gtoempr)
        VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
    END
    ELSE
    IF (liquidaper = 2) THEN
    BEGIN
    rmod = mod(:periodo, 4);
    IF (rmod = 0) THEN
        INSERT INTO nomina_conceptos_prov (NOPO_ID, NCOP_ITEM, conc_cod,  TERC_NIT, NCOP_VALOR, NCOP_ENTIDAD, NCOP_DEDUC , NCOP_PROV, NCOP_APORTE, NCOP_PERIODO, NCOP_ANO, NCOP_MOD, NCOP_APLICAPROM, NCOP_SALARIO, NCOP_gtoempr)
        VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
    END
  END
 END
END
SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE CAUSA_NOMINA(
    FEC DATE,
    PERIODO INTEGER,
    PERIODICIDAD INTEGER,
    PAGOGLOBAL CHAR(1),
    ANO CHAR(4))
RETURNS (
    IDNOMINA INTEGER)
AS
declare variable item integer;
declare variable nite varchar(20) character set none;
declare variable nit_tercero varchar(20);
declare variable concept integer;
declare variable montos numeric(18,2);
declare variable porcen numeric(9,4);
declare variable entidad varchar(20);
declare variable conc_cod integer;
declare variable conc_deduc char(1);
declare variable conc_porc numeric(9,4);
declare variable conc_entidad integer;
declare variable conc_monto numeric(18,2);
declare variable conc_modifi char(1);
declare variable conc_promedio char(1);
declare variable emco_perprom integer;
declare variable valor numeric(18,2);
declare variable diaslab integer;
declare variable conc_prov char(1);
declare variable conc_aporte char(1);
declare variable numeroprom integer;
declare variable conc_aplicaprom char(1);
declare variable perinicial integer;
declare variable anoprom integer;
declare variable conc_dias char(1);
declare variable conc_otroconc char(1);
declare variable conc_codotroconc integer;
declare variable anosum integer;
declare variable salario char(1) character set none;
declare variable liquidaper integer;
declare variable rmod numeric(2,2);
declare variable basico numeric(18,2);
declare variable niteps varchar(20);
declare variable nitafc varchar(20);
declare variable nitafp varchar(20);
declare variable nitccf varchar(20);
declare variable gtoempr char(1);
declare variable comision numeric(18,2);
declare variable cambsaltrans numeric(18,2);
declare variable saldosini numeric(18,2);
declare variable duranov integer;
declare variable base numeric(18,2);
declare variable aprox integer;
BEGIN
/*SI ES QUINCENAL*/
EXECUTE PROCEDURE cambie_id_nomina RETURNING_VALUES(:idnomina);
INSERT INTO nomina (nomi_id, NOMI_FECCAUSA, NOMI_PAGOGLOBAL, NOMI_PERIODOCIDAD, NOMI_PERIODO, NOMI_ANO, NOMI_LIQOK)
VALUES (:IDNOMINA, :fec,:pagoglobal, :periodicidad, :periodo, :ano, 'N');
 BEGIN
    item = 1;
    FOR SELECT E.TERC_NIT, E.empl_salario, e.empl_eps, e.empl_afc, e.empl_afp, e.empl_ccf
    FROM EMPLEADOS E
    WHERE E.empl_ppago = :periodicidad AND E.empl_fecret IS NULL
    INTO :nite, :basico, :niteps, :nitafc, :nitafp, :nitccf
    DO
    BEGIN
    FOR SELECT CE.TERC_NIT, CE.CONC_COD, CE.EMCO_MONTO, CE.EMCO_PORC, ce.empl_entidad, CE.emco_perprom, CE.emco_luquidaper, CN.CONC_COD, CN.CONC_DEDUC,CN.CONC_PORC, CN.CONC_ENTIDAD, CN.CONC_MONTO,  CN.CONC_DIAS, CN.CONC_MODIFI,
    CN.CONC_PROMEDIO, CN.conc_salario, CE.emco_perprom, CN.conc_prov, CN.conc_aporte, CN.conc_aplicaprom, cn.conc_otroconc, cn.conc_codotroconc, CN.conc_gtoempr, CN.conc_base
    FROM empleado_conceptos CE, CONCEPTOS_NOMINA CN WHERE ((CE.terc_nit = :nite) AND (CE.CONC_COD = CN.CONC_COD) AND (CN.conc_fecini <= :fec AND CN.conc_fecfin >= :FEC) ) OR ((CE.terc_nit = :nite)
    AND (CE.CONC_COD = CN.CONC_COD) AND (cn.conc_todosper = 'N') AND (CE.emco_ppago = :periodo)) OR  ((CE.terc_nit = :nite) AND (CE.CONC_COD = CN.CONC_COD) AND cn.conc_todosper = 'S')  ORDER BY (TERC_NIT )
    INTO :nit_tercero, :concept,  :montos, :porcen, :entidad, :numeroprom, :liquidaper ,:CONC_COD, :CONC_DEDUC, :CONC_PORC,
    :CONC_ENTIDAD, :CONC_MONTO, :CONC_DIAS, :CONC_MODIFI,:CONC_PROMEDIO, :salario,:EMCO_PERPROM, :conc_prov, :conc_aporte , :CONC_APLICAPROM, :conc_otroconc, :conc_codotroconc, :gtoempr, :base
    DO
BEGIN
IF (periodicidad = 2) THEN
BEGIN
    IF (conc_dias = 'S') THEN
    EXECUTE PROCEDURE DIAS_LABORADOS (:nite, :periodo, :fec) RETURNING_VALUES (:diaslab);
    ELSE
    BEGIN
    IF (liquidaper = 0) THEN
    diaslab = 15;
    ELSE
    IF (liquidaper = 1) THEN
    diaslab = 30;
    ELSE
    IF (liquidaper = 2) THEN
    diaslab = 60;
    END
END
   ELSE
IF (periodicidad = 1) THEN
BEGIN
    IF (conc_dias = 'S') THEN
    EXECUTE PROCEDURE DIAS_LABORADOS (:nite, :periodo, :fec) RETURNING_VALUES (:diaslab);
    ELSE
    diaslab = 30;
END
   ELSE
IF (periodicidad = 3) THEN
BEGIN
    IF (conc_dias = 'S') THEN
    EXECUTE PROCEDURE DIAS_LABORADOS (:nite, :periodo, :fec) RETURNING_VALUES (:diaslab);
    ELSE
    BEGIN
    IF (liquidaper = 0) THEN
    diaslab = 7;
    ELSE
    IF (liquidaper = 1) THEN
    diaslab = 15;
    ELSE
    IF (liquidaper = 2) THEN
    diaslab = 30;
    END
END
 SELECT ((n.nono_valor /30) * n.nono_dura), (n.nono_dura) FROM nomina_novedades n WHERE n.tnov_cod = 11 AND n.terc_nit = :nite AND n.nono_periodo = :periodo INTO :cambsaltrans, :duranov;
 IF (cambsaltrans IS NULL) THEN
 cambsaltrans = 0;
 if (duranov is null) then
 duranov = 0;
 diaslab = :diaslab - :duranov;
 if (conc_cod = 921) then
 begin
 if (porcen IS NOT NULL AND porcen <> 0) then
 valor = ((basico / 30)* :diaslab ) * :PORCEN /100;
 ELSE
 if (conc_porc IS NOT null AND conc_porc <> 0) then
 valor = ((:basico / 30)* :diaslab ) * :conc_porc /100;
 end
 ELSE
 if (conc_cod = 922) then
 BEGIN
 SELECT P.prcu_monto FROM prestamo_cuotas P, prestamo_nomina PN WHERE P.prcu_ano = :ano AND P.prcu_periodo = :periodo AND PN.prno_id = P.prno_id AND PN.terc_nit = :nite INTO :valor;
 IF (valor IS NULL) THEN
 valor = 0;
 item = :item + 1;
 update prestamo_cuotas  P SET prcu_ok = 'S' WHERE P.prcu_ano = :ano AND P.prcu_periodo = :periodo AND P.prno_id = (SELECT PN.prno_id FROM PRESTAMO_NOMINA PN WHERE PN.terc_nit = :nite);
 END
 ELSE
 BEGIN
    IF ((:montos = 0) OR (:montos IS NULL)) THEN
      BEGIN
      IF ((CONC_PORC = 0 AND :porcen = 0) OR (CONC_PORC IS NULL AND :porcen = 0) OR (CONC_PORC = 0 AND :porcen IS NULL) OR (CONC_PORC IS NULL AND :porcen IS NULL) ) THEN
        BEGIN
        IF ((conc_monto <> 0) AND (conc_monto IS NOT NULL) ) THEN
        BEGIN
        VALOR = :CONC_MONTO;
        if (:conc_dias = 'S') then
        valor = (:valor / 30) * :diaslab;
        END
        ELSE
        IF (salario = 'S' AND CONC_COD <> 900 AND CONC_COD <> 920) THEN
        BEGIN
        conc_monto = :basico;
        VALOR = (:conc_monto/30 * :diaslab ) + :cambsaltrans;
        END
        ELSE
        BEGIN
        valor = montos;
        if (:conc_dias = 'S') then
        valor = (:valor / 30) * :diaslab;
        END
        END
       ELSE
       BEGIN
        IF (:porcen <> 0) THEN
          BEGIN
            IF ((conc_monto <> 0) AND (conc_monto IS NOT NULL) ) THEN
            BEGIN
              VALOR = ((:CONC_MONTO ) * :PORCEN) /100;
            END
          END
          ELSE
          BEGIN
            IF ((conc_monto <> 0) AND (conc_monto IS NOT NULL) ) THEN
            BEGIN
              VALOR = ((:CONC_MONTO) * :conc_porc) /100;
            END
            ELSE
        IF (salario = 'S' AND CONC_COD <> 900 AND CONC_COD <> 920) THEN
            BEGIN
              conc_monto = :basico;
              VALOR = ((:CONC_MONTO)+ :cambsaltrans * :conc_porc) /100;
            END
          END
       END
      END
    ELSE
    BEGIN
      IF ((CONC_PORC = 0 or (conc_porc is null)) AND (:porcen = 0 or (porcen is null))) THEN
      BEGIN
      VALOR = (:montos);
      if (:conc_dias = 'S') then
      valor = (:valor / 30) * :diaslab;
      END
      ELSE
      BEGIN
        IF (:porcen <> 0 and porcen is not null) THEN
          BEGIN
          VALOR = ((:MONTOS ) * :PORCEN) /100;
          END
          ELSE
          BEGIN
          VALOR = ((:montos) * :CONC_PORC) /100;
          END
       END
   END
    IF (conc_promedio = 'S') THEN
    BEGIN
    perinicial = :periodo - (:numeroprom) + 1;
    anoprom = CAST (ano AS INTEGER);
    IF (perinicial <= 0) THEN
    BEGIN
    perinicial = 24 + :PERINICIAL;
    anoprom = CAST(ANO AS INTEGER) - 1;
    END
    SELECT SUM (noco_valor) FROM nomina_conceptos n WHERE n.noco_aplicaprom = 'S' AND N.noco_periodo >= :perinicial - 1 AND N.noco_periodo < :periodo AND N.noco_ano >= :anoprom AND N.noco_ano <= :ano AND terc_nit = :nite INTO :valor;
    valor = (valor / numeroprom);
    SELECT NOCO_VALOR FROM NOMINA_CONCEPTOS WHERE CONC_COD = :conc_cod AND TERC_NIT  = :nite AND NOCO_PAGOOK = 'N' AND NOCO_PERIODO = 0 INTO :saldosini;
    IF (saldosini IS NULL) THEN
    saldosini = 0;
    ELSE
    UPDATE nomina_conceptos N SET noco_pagook = 'S' WHERE n.noco_aplicaprom = 'S' AND N.noco_periodo >= :perinicial - 1 AND N.noco_periodo < :periodo AND N.noco_ano >= :anoprom AND N.noco_ano <= :ano  AND CONC_COD = :conc_cod AND terc_nit = :nite AND NOCO_PERIODO = 0;
    VALOR = :valor + :saldosini;
    UPDATE nomina_conceptos N SET noco_pagook = 'S' WHERE n.noco_aplicaprom = 'S' AND N.noco_periodo >= :perinicial - 1 AND N.noco_periodo < :periodo AND N.noco_ano >= :anoprom AND N.noco_ano <= :ano  AND CONC_COD = :conc_cod AND terc_nit = :nite;
    END
    IF (conc_otroconc = 'S') THEN
    BEGIN
    anosum = CAST(ano AS INTEGER);
    anosum = anosum - 1;
    SELECT SUM (noco_valor) FROM nomina_conceptos n WHERE n.noco_ano = :anosum AND n.conc_cod = :conc_codotroconc AND N.terc_nit = :nite INTO :valor;
    SELECT NOCO_VALOR FROM NOMINA_CONCEPTOS WHERE noco_ano = :anosum AND conc_cod = :conc_codotroconc AND terc_nit = :nite AND NOCO_PERIODO = 0 INTO :saldosini;
    IF (saldosini IS NULL) THEN
    saldosini = 0;
    ELSE
    UPDATE nomina_conceptos SET noco_pagook = 'S' WHERE noco_ano = :anosum AND conc_cod = :conc_codotroconc AND NOCO_PERIODO = 0 AND terc_nit = :nite;
    VALOR = :valor + :saldosini;
    UPDATE nomina_conceptos SET noco_pagook = 'S' WHERE noco_ano = :anosum AND conc_cod = :conc_codotroconc AND terc_nit = :nite;
    END
/*SI EL CONCEPTO ES UN APORTE*/
IF (conc_aporte = 'S') THEN
BEGIN
    IF ((:entidad = '' ) OR (entidad IS NULL)) THEN
    BEGIN
     SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
     IF (comision IS NULL) THEN
     comision = 0;
     valor = :basico + :comision;
    IF ((conc_cod = 904) OR (conc_cod = 905) OR (conc_cod = 906)) THEN
            BEGIN
            entidad = :nitafp;
                IF (conc_cod = 904) THEN
                BEGIN
                SELECT A.paan_afptr FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = (((((:basico /30) * :diaslab ) + :comision)+ :cambsaltrans) * :PORCEN) /100;
                END
                ELSE
                IF ((conc_cod = 905) OR (conc_cod = 906)) THEN
                BEGIN
                SELECT A.paan_afpem FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = (((((:basico /30) * :diaslab ) + :comision)+ :cambsaltrans) * :PORCEN) /100;
                END
            END
            ELSE
       IF ((conc_cod = 907) OR (conc_cod = 914) OR (conc_cod = 915)) THEN
            BEGIN
            entidad = :niteps;
                IF (conc_cod = 907) THEN
                BEGIN
                SELECT A.paan_epstr FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = (((((:basico )/30 * :diaslab ) + :comision)+ :cambsaltrans) * :PORCEN) /100;
                END
                ELSE
                IF ((conc_cod = 914) OR (conc_cod = 915)) THEN
                BEGIN
                SELECT A.paan_epsem FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = (((((:basico )/30 * :diaslab ) + :comision)+ :cambsaltrans) * :PORCEN) /100;
                END
            END
            ELSE
       IF ((conc_cod = 910) OR (conc_cod = 911) OR (conc_cod = 916) OR (conc_cod = 917) OR (conc_cod = 918) OR (conc_cod = 919)) THEN
            BEGIN
            entidad = :nitccf;
            SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
            IF (comision IS NULL) THEN
            comision = 0;
                IF ((conc_cod = 910) OR (conc_cod = 911) ) THEN
                BEGIN
                SELECT A.paan_ccf FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = (((((:basico )/30 * :diaslab ) + :comision)+ :cambsaltrans) * :PORCEN) /100;
                END
                ELSE
                IF ((conc_cod = 916) OR (conc_cod = 917)) THEN
                BEGIN
                SELECT A.paan_icbf FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = (((((:basico )/30 * :diaslab ) + :comision)+ :cambsaltrans) * :PORCEN) /100;
                END
                ELSE
                IF ((conc_cod = 918) OR (conc_cod = 919)) THEN
                BEGIN
                SELECT A.paan_sena FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = (((((:basico )/30 * :diaslab ) + :comision)+ :cambsaltrans) * :PORCEN) /100;
                END
            END
            ELSE
        IF ((conc_cod = 912) OR (conc_cod = 913)) THEN
            BEGIN
            entidad = :nitafc;
            SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
            IF (comision IS NULL) THEN
            comision = 0;
                IF ((conc_cod = 912) OR (conc_cod = 913) ) THEN
                BEGIN
                SELECT A.paan_cesemp FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = ((((:basico + :comision)/30 * :diaslab )+ :cambsaltrans) * :PORCEN) /100;
                END
            END
            ELSE
        BEGIN
        IF (comision IS NULL) THEN
        comision = 0;
        SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
        conc_monto = :basico + :comision;
        IF (conc_porc <> 0 AND conc_porc IS NOT NULL) THEN
        VALOR = (((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans) * :conc_porc) /100;
        ELSE
        IF (:porcen <> 0 AND :porcen IS NOT NULL) THEN
        VALOR = (((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans) * :porcen) /100;
        ELSE
        IF (:montos <> 0 AND :montos IS NOT NULL) THEN
        valor = :montos;
        ELSE
        IF (:conc_monto <> 0 AND :conc_monto IS NOT NULL) THEN
        valor = :conc_monto;
        END
    END
    END
    ELSE
    IF (conc_prov = 'S') THEN
    BEGIN
        conc_monto = :basico;
        IF (conc_porc <> 0 AND conc_porc IS NOT NULL) THEN
        VALOR = (((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans) * :conc_porc) /100;
        ELSE
        IF (porcen <> 0 AND porcen IS NOT NULL) THEN
        VALOR = (((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans) * :porcen) /100;
        ELSE
        IF (montos <> 0 AND montos IS NOT NULL) THEN
        VALOR = :montos;
        ELSE
        IF (conc_monto <> 0 AND conc_monto IS NOT NULL) THEN
        VALOR = :conc_monto;
    END
item = :item + 1;
END
 IF (conc_cod = 920) THEN
 BEGIN
 SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :valor;
 IF (valor IS NULL) THEN
 valor = 0;
 item = :item + 1;
 END
    EXECUTE PROCEDURE LEE_CONFIGURACION('NOMINA','GENERAL','REDONDEO AL MULTIPLO DE DIEZ EN TOTALES')returning_values(:aprox);
    EXECUTE PROCEDURE REDONDEE(:valor, :aprox) RETURNING_VALUES (VALOR);
    IF (liquidaper = 0) THEN
    INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
    VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
    ELSE
    IF (liquidaper = 1) THEN
    BEGIN
    rmod = mod(:periodo, 2);
    IF (rmod = 0) THEN
        INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
        VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
    END
    ELSE
    IF (liquidaper = 2) THEN
    BEGIN
    rmod = mod(:periodo, 4);
    IF (rmod = 0) THEN
        INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
        VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
   END
  END
 END
END
SUSPEND;
END
^

SET TERM ; ^



GRANT EXECUTE ON PROCEDURE CAMBIE_ID_NOMINA TO PUBLIC;
GRANT EXECUTE ON PROCEDURE CAMBIE_ID_NOMINA_PROV TO PUBLIC;
GRANT EXECUTE ON PROCEDURE CAMBIE_ID_NOMINACOMISIONES TO PUBLIC;
GRANT EXECUTE ON PROCEDURE CAMBIE_ID_NOVEDAD TO PUBLIC;
GRANT EXECUTE ON PROCEDURE CAMBIE_ID_PAGO_NOMINA TO PUBLIC;
GRANT EXECUTE ON PROCEDURE CAUSA_NOMINA TO PUBLIC;
GRANT EXECUTE ON PROCEDURE CAUSA_NOMINA_PROV TO PUBLIC;
GRANT EXECUTE ON PROCEDURE CEROS_ANCHO_FIJO TO PUBLIC;
GRANT EXECUTE ON PROCEDURE CONTABIL_NOMINA TO PUBLIC;
GRANT EXECUTE ON PROCEDURE CONTABIL_PAGONOMI TO PUBLIC;
GRANT EXECUTE ON PROCEDURE EGRESO_NOMINA TO PUBLIC;
GRANT EXECUTE ON PROCEDURE FORM_INTEGRADO_ELECTRONICO TO PUBLIC;
GRANT EXECUTE ON PROCEDURE IMPR_PLANILLA_NOMINA TO PUBLIC;
GRANT EXECUTE ON PROCEDURE IMPR_PLANILLA_NOMINA_PROV TO PUBLIC;
GRANT EXECUTE ON PROCEDURE LIQUIDA_HORAS_EXTRA TO PUBLIC;
GRANT EXECUTE ON PROCEDURE LIQUIDA_VACACIONES TO PUBLIC;
GRANT EXECUTE ON PROCEDURE LIQUIDACION_APORTES TO PUBLIC;
GRANT EXECUTE ON PROCEDURE LIQUIDACION_EMPLEADO TO PUBLIC;
GRANT EXECUTE ON PROCEDURE NOVEDADESXPERIODO TO PUBLIC;
GRANT EXECUTE ON PROCEDURE PAGO_NOMINA_XEMPL TO PUBLIC;
GRANT EXECUTE ON PROCEDURE PLANILLA_NOMINA_NOVEDADES TO PUBLIC;
GRANT EXECUTE ON PROCEDURE REP_EMPLEADOS TO PUBLIC;
GRANT EXECUTE ON PROCEDURE TRAER_NOMINA_PROVISIONAL TO PUBLIC;
GRANT ALL ON ADMINISTRADORA TO PUBLIC;
GRANT ALL ON AREA TO PUBLIC;
GRANT ALL ON CESANTIA_DETALLE TO PUBLIC;
GRANT ALL ON CESANTIAS TO PUBLIC;
GRANT ALL ON CESANTIAS_RETIROS TO PUBLIC;
GRANT ALL ON CONCEPTOS_NOMINA TO PUBLIC;
GRANT ALL ON CONSOLIDADO_NOMINA TO PUBLIC;
GRANT ALL ON CONSOLIDADO_NOMINA_PROV TO PUBLIC;
GRANT ALL ON DEPARTAMENTO TO PUBLIC;
GRANT ALL ON EDUCACION_FORMAL_EMPLEADO TO PUBLIC;
GRANT ALL ON EMPLEADO_BENEFICIARIOS TO PUBLIC;
GRANT ALL ON EMPLEADO_CONCEPTOS TO PUBLIC;
GRANT ALL ON EMPLEADO_FORMACION TO PUBLIC;
GRANT ALL ON EMPLEADO_LLAMADOS TO PUBLIC;
GRANT ALL ON EMPLEADOS TO PUBLIC;
GRANT ALL ON INCAPACIDADES TO PUBLIC;
GRANT ALL ON INTERFAZ_NOMINA TO PUBLIC;
GRANT ALL ON LIQUIDACION TO PUBLIC;
GRANT ALL ON LLAMADOS_ATENCION TO PUBLIC;
GRANT ALL ON NIVEL_FORMACION TO PUBLIC;
GRANT ALL ON NOMINA TO PUBLIC;
GRANT ALL ON NOMINA_COMISIONES TO PUBLIC;
GRANT ALL ON NOMINA_COMISIONES_PROV TO PUBLIC;
GRANT ALL ON NOMINA_CONCEPTOS TO PUBLIC;
GRANT ALL ON NOMINA_CONCEPTOS_PROV TO PUBLIC;
GRANT ALL ON NOMINA_DETALLE TO PUBLIC;
GRANT ALL ON NOMINA_DETALLE_PROV TO PUBLIC;
GRANT ALL ON NOMINA_NOVEDADES TO PUBLIC;
GRANT ALL ON NOMINA_PROV TO PUBLIC;
GRANT ALL ON PAGO_APORTES TO PUBLIC;
GRANT ALL ON PAGO_APORTES_DETALLE TO PUBLIC;
GRANT ALL ON PAGO_NOMINA TO PUBLIC;
GRANT ALL ON PAGO_NOMINA_DET TO PUBLIC;
GRANT ALL ON PARAMETROS_ANO TO PUBLIC;
GRANT ALL ON PARENTESCO TO PUBLIC;
GRANT ALL ON PRESTAMO_CUOTAS TO PUBLIC;
GRANT ALL ON PRESTAMO_NOMINA TO PUBLIC;
GRANT ALL ON SECCION TO PUBLIC;
GRANT ALL ON TIPOS_NOVEDAD TO PUBLIC;
GRANT ALL ON VACACIONES TO PUBLIC;

DROP TRIGGER NOMINA_CONCEPTOS_BI0;

SET TERM ^ ;

CREATE OR ALTER PROCEDURE CAUSA_NOMINA(
    FEC DATE,
    PERIODO INTEGER,
    PERIODICIDAD INTEGER,
    PAGOGLOBAL CHAR(1),
    ANO CHAR(4))
RETURNS (
    IDNOMINA INTEGER)
AS
declare variable item integer;
declare variable nite varchar(20) character set none;
declare variable nit_tercero varchar(20);
declare variable concept integer;
declare variable montos numeric(18,2);
declare variable porcen numeric(9,4);
declare variable entidad varchar(20);
declare variable conc_cod integer;
declare variable conc_deduc char(1);
declare variable conc_porc numeric(9,4);
declare variable conc_entidad integer;
declare variable conc_monto numeric(18,2);
declare variable conc_modifi char(1);
declare variable conc_promedio char(1);
declare variable emco_perprom integer;
declare variable valor numeric(18,2);
declare variable diaslab integer;
declare variable conc_prov char(1);
declare variable conc_aporte char(1);
declare variable numeroprom integer;
declare variable conc_aplicaprom char(1);
declare variable perinicial integer;
declare variable anoprom integer;
declare variable conc_dias char(1);
declare variable conc_otroconc char(1);
declare variable conc_codotroconc integer;
declare variable anosum integer;
declare variable salario char(1) character set none;
declare variable liquidaper integer;
declare variable rmod numeric(2,2);
declare variable basico numeric(18,2);
declare variable niteps varchar(20);
declare variable nitafc varchar(20);
declare variable nitafp varchar(20);
declare variable nitccf varchar(20);
declare variable gtoempr char(1);
declare variable comision numeric(18,2);
declare variable cambsaltrans numeric(18,2);
declare variable saldosini numeric(18,2);
declare variable duranov integer;
declare variable base numeric(18,2);
declare variable aprox integer;
BEGIN
/*SI ES QUINCENAL*/
EXECUTE PROCEDURE cambie_id_nomina RETURNING_VALUES(:idnomina);
INSERT INTO nomina (nomi_id, NOMI_FECCAUSA, NOMI_PAGOGLOBAL, NOMI_PERIODOCIDAD, NOMI_PERIODO, NOMI_ANO, NOMI_LIQOK)
VALUES (:IDNOMINA, :fec,:pagoglobal, :periodicidad, :periodo, :ano, 'N');
 BEGIN
    item = 1;
    FOR SELECT E.TERC_NIT, E.empl_salario, e.empl_eps, e.empl_afc, e.empl_afp, e.empl_ccf
    FROM EMPLEADOS E
    WHERE E.empl_ppago = :periodicidad AND E.empl_fecret IS NULL
    INTO :nite, :basico, :niteps, :nitafc, :nitafp, :nitccf
    DO
    BEGIN
    FOR SELECT CE.TERC_NIT, CE.CONC_COD, CE.EMCO_MONTO, CE.EMCO_PORC, ce.empl_entidad, CE.emco_perprom, CE.emco_luquidaper, CN.CONC_COD, CN.CONC_DEDUC,CN.CONC_PORC, CN.CONC_ENTIDAD, CN.CONC_MONTO,  CN.CONC_DIAS, CN.CONC_MODIFI,
    CN.CONC_PROMEDIO, CN.conc_salario, CE.emco_perprom, CN.conc_prov, CN.conc_aporte, CN.conc_aplicaprom, cn.conc_otroconc, cn.conc_codotroconc, CN.conc_gtoempr, CN.conc_base
    FROM empleado_conceptos CE, CONCEPTOS_NOMINA CN WHERE ((CE.terc_nit = :nite) AND (CE.CONC_COD = CN.CONC_COD) AND (CN.conc_fecini <= :fec AND CN.conc_fecfin >= :FEC) ) OR ((CE.terc_nit = :nite)
    AND (CE.CONC_COD = CN.CONC_COD) AND (cn.conc_todosper = 'N') AND (CE.emco_ppago = :periodo)) OR  ((CE.terc_nit = :nite) AND (CE.CONC_COD = CN.CONC_COD) AND cn.conc_todosper = 'S')  ORDER BY (TERC_NIT )
    INTO :nit_tercero, :concept,  :montos, :porcen, :entidad, :numeroprom, :liquidaper ,:CONC_COD, :CONC_DEDUC, :CONC_PORC,
    :CONC_ENTIDAD, :CONC_MONTO, :CONC_DIAS, :CONC_MODIFI,:CONC_PROMEDIO, :salario,:EMCO_PERPROM, :conc_prov, :conc_aporte , :CONC_APLICAPROM, :conc_otroconc, :conc_codotroconc, :gtoempr, :base
    DO
BEGIN
IF (periodicidad = 2) THEN
BEGIN
    IF (conc_dias = 'S') THEN
    EXECUTE PROCEDURE DIAS_LABORADOS (:nite, :periodo, :fec) RETURNING_VALUES (:diaslab);
    ELSE
    BEGIN
    IF (liquidaper = 0) THEN
    diaslab = 15;
    ELSE
    IF (liquidaper = 1) THEN
    diaslab = 30;
    ELSE
    IF (liquidaper = 2) THEN
    diaslab = 60;
    END
END
   ELSE
IF (periodicidad = 1) THEN
BEGIN
    IF (conc_dias = 'S') THEN
    EXECUTE PROCEDURE DIAS_LABORADOS (:nite, :periodo, :fec) RETURNING_VALUES (:diaslab);
    ELSE
    diaslab = 30;
END
   ELSE
IF (periodicidad = 3) THEN
BEGIN
    IF (conc_dias = 'S') THEN
    EXECUTE PROCEDURE DIAS_LABORADOS (:nite, :periodo, :fec) RETURNING_VALUES (:diaslab);
    ELSE
    BEGIN
    IF (liquidaper = 0) THEN
    diaslab = 7;
    ELSE
    IF (liquidaper = 1) THEN
    diaslab = 15;
    ELSE
    IF (liquidaper = 2) THEN
    diaslab = 30;
    END
END
 SELECT ((n.nono_valor /30) * n.nono_dura), (n.nono_dura) FROM nomina_novedades n WHERE n.tnov_cod = 11 AND n.terc_nit = :nite AND n.nono_periodo = :periodo INTO :cambsaltrans, :duranov;
 IF (cambsaltrans IS NULL) THEN
 cambsaltrans = 0;
 if (duranov is null) then
 duranov = 0;
 diaslab = :diaslab - :duranov;
 if (conc_cod = 921) then
 begin
 if (porcen IS NOT NULL AND porcen <> 0) then
 valor = ((basico / 30)* :diaslab ) * :PORCEN /100;
 ELSE
 if (conc_porc IS NOT null AND conc_porc <> 0) then
 valor = ((:basico / 30)* :diaslab ) * :conc_porc /100;
 end
 ELSE
 if (conc_cod = 922) then
 BEGIN
 SELECT P.prcu_monto FROM prestamo_cuotas P, prestamo_nomina PN WHERE P.prcu_ano = :ano AND P.prcu_periodo = :periodo AND PN.prno_id = P.prno_id AND PN.terc_nit = :nite INTO :valor;
 IF (valor IS NULL) THEN
 valor = 0;
 item = :item + 1;
 update prestamo_cuotas  P SET prcu_ok = 'S' WHERE P.prcu_ano = :ano AND P.prcu_periodo = :periodo AND P.prno_id = (SELECT PN.prno_id FROM PRESTAMO_NOMINA PN WHERE PN.terc_nit = :nite);
 END
 ELSE
 BEGIN
    IF ((:montos = 0) OR (:montos IS NULL)) THEN
      BEGIN
      IF ((CONC_PORC = 0 AND :porcen = 0) OR (CONC_PORC IS NULL AND :porcen = 0) OR (CONC_PORC = 0 AND :porcen IS NULL) OR (CONC_PORC IS NULL AND :porcen IS NULL) ) THEN
        BEGIN
        IF ((conc_monto <> 0) AND (conc_monto IS NOT NULL) ) THEN
        BEGIN
        VALOR = :CONC_MONTO;
        if (:conc_dias = 'S') then
        valor = (:valor / 30) * :diaslab;
        END
        ELSE
        IF (salario = 'S' AND CONC_COD <> 900 AND CONC_COD <> 920) THEN
        BEGIN
        conc_monto = :basico;
        VALOR = (:conc_monto/30 * :diaslab ) + :cambsaltrans;
        END
        ELSE
        BEGIN
        valor = montos;
        if (:conc_dias = 'S') then
        valor = (:valor / 30) * :diaslab;
        END
        END
       ELSE
       BEGIN
        IF (:porcen <> 0) THEN
          BEGIN
            IF ((conc_monto <> 0) AND (conc_monto IS NOT NULL) ) THEN
            BEGIN
              VALOR = ((:CONC_MONTO ) * :PORCEN) /100;
            END
          END
          ELSE
          BEGIN
            IF ((conc_monto <> 0) AND (conc_monto IS NOT NULL) ) THEN
            BEGIN
              VALOR = ((:CONC_MONTO) * :conc_porc) /100;
            END
            ELSE
        IF (salario = 'S' AND CONC_COD <> 900 AND CONC_COD <> 920) THEN
            BEGIN
              conc_monto = :basico;
              VALOR = ((:CONC_MONTO)+ :cambsaltrans * :conc_porc) /100;
            END
          END
       END
      END
    ELSE
    BEGIN
      IF ((CONC_PORC = 0 or (conc_porc is null)) AND (:porcen = 0 or (porcen is null))) THEN
      BEGIN
      VALOR = (:montos);
      if (:conc_dias = 'S') then
      valor = (:valor / 30) * :diaslab;
      END
      ELSE
      BEGIN
        IF (:porcen <> 0 and porcen is not null) THEN
          BEGIN
          VALOR = ((:MONTOS ) * :PORCEN) /100;
          END
          ELSE
          BEGIN
          VALOR = ((:montos) * :CONC_PORC) /100;
          END
       END
   END
    IF (conc_promedio = 'S') THEN
    BEGIN
    perinicial = :periodo - (:numeroprom) + 1;
    anoprom = CAST (ano AS INTEGER);
    IF (perinicial <= 0) THEN
    BEGIN
    perinicial = 24 + :PERINICIAL;
    anoprom = CAST(ANO AS INTEGER) - 1;
    END
    SELECT SUM (noco_valor) FROM nomina_conceptos n WHERE n.noco_aplicaprom = 'S' AND N.noco_periodo >= :perinicial - 1 AND N.noco_periodo < :periodo AND N.noco_ano >= :anoprom AND N.noco_ano <= :ano AND terc_nit = :nite INTO :valor;
    valor = (valor / numeroprom);
    SELECT NOCO_VALOR FROM NOMINA_CONCEPTOS WHERE CONC_COD = :conc_cod AND TERC_NIT  = :nite AND NOCO_PAGOOK = 'N' AND NOCO_PERIODO = 0 INTO :saldosini;
    IF (saldosini IS NULL) THEN
    saldosini = 0;
    ELSE
    UPDATE nomina_conceptos N SET noco_pagook = 'S' WHERE n.noco_aplicaprom = 'S' AND N.noco_periodo >= :perinicial - 1 AND N.noco_periodo < :periodo AND N.noco_ano >= :anoprom AND N.noco_ano <= :ano  AND CONC_COD = :conc_cod AND terc_nit = :nite AND NOCO_PERIODO = 0;
    VALOR = :valor + :saldosini;
    UPDATE nomina_conceptos N SET noco_pagook = 'S' WHERE n.noco_aplicaprom = 'S' AND N.noco_periodo >= :perinicial - 1 AND N.noco_periodo < :periodo AND N.noco_ano >= :anoprom AND N.noco_ano <= :ano  AND CONC_COD = :conc_cod AND terc_nit = :nite;
    END
    IF (conc_otroconc = 'S') THEN
    BEGIN
    anosum = CAST(ano AS INTEGER);
    anosum = anosum - 1;
    SELECT SUM (noco_valor) FROM nomina_conceptos n WHERE n.noco_ano = :anosum AND n.conc_cod = :conc_codotroconc AND N.terc_nit = :nite INTO :valor;
    SELECT NOCO_VALOR FROM NOMINA_CONCEPTOS WHERE noco_ano = :anosum AND conc_cod = :conc_codotroconc AND terc_nit = :nite AND NOCO_PERIODO = 0 INTO :saldosini;
    IF (saldosini IS NULL) THEN
    saldosini = 0;
    ELSE
    UPDATE nomina_conceptos SET noco_pagook = 'S' WHERE noco_ano = :anosum AND conc_cod = :conc_codotroconc AND NOCO_PERIODO = 0 AND terc_nit = :nite;
    VALOR = :valor + :saldosini;
    UPDATE nomina_conceptos SET noco_pagook = 'S' WHERE noco_ano = :anosum AND conc_cod = :conc_codotroconc AND terc_nit = :nite;
    END
/*SI EL CONCEPTO ES UN APORTE*/
IF (conc_aporte = 'S') THEN
BEGIN
    IF ((:entidad = '' ) OR (entidad IS NULL)) THEN
    BEGIN
     SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
     IF (comision IS NULL) THEN
     comision = 0;
     valor = :basico + :comision;
    IF ((conc_cod = 904) OR (conc_cod = 905) OR (conc_cod = 906)) THEN
            BEGIN
            entidad = :nitafp;
                IF (conc_cod = 904) THEN
                BEGIN
                SELECT A.paan_afptr FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = (((((:basico /30) * :diaslab ) + :comision)+ :cambsaltrans) * :PORCEN) /100;
                END
                ELSE
                IF ((conc_cod = 905) OR (conc_cod = 906)) THEN
                BEGIN
                SELECT A.paan_afpem FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = (((((:basico /30) * :diaslab ) + :comision)+ :cambsaltrans) * :PORCEN) /100;
                END
            END
            ELSE
       IF ((conc_cod = 907) OR (conc_cod = 914) OR (conc_cod = 915)) THEN
            BEGIN
            entidad = :niteps;
                IF (conc_cod = 907) THEN
                BEGIN
                SELECT A.paan_epstr FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = (((((:basico )/30 * :diaslab ) + :comision)+ :cambsaltrans) * :PORCEN) /100;
                END
                ELSE
                IF ((conc_cod = 914) OR (conc_cod = 915)) THEN
                BEGIN
                SELECT A.paan_epsem FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = (((((:basico )/30 * :diaslab ) + :comision)+ :cambsaltrans) * :PORCEN) /100;
                END
            END
            ELSE
       IF ((conc_cod = 910) OR (conc_cod = 911) OR (conc_cod = 916) OR (conc_cod = 917) OR (conc_cod = 918) OR (conc_cod = 919)) THEN
            BEGIN
            entidad = :nitccf;
            SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
            IF (comision IS NULL) THEN
            comision = 0;
                IF ((conc_cod = 910) OR (conc_cod = 911) ) THEN
                BEGIN
                SELECT A.paan_ccf FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = (((((:basico )/30 * :diaslab ) + :comision)+ :cambsaltrans) * :PORCEN) /100;
                END
                ELSE
                IF ((conc_cod = 916) OR (conc_cod = 917)) THEN
                BEGIN
                SELECT A.paan_icbf FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = (((((:basico )/30 * :diaslab ) + :comision)+ :cambsaltrans) * :PORCEN) /100;
                END
                ELSE
                IF ((conc_cod = 918) OR (conc_cod = 919)) THEN
                BEGIN
                SELECT A.paan_sena FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = (((((:basico )/30 * :diaslab ) + :comision)+ :cambsaltrans) * :PORCEN) /100;
                END
            END
            ELSE
        IF ((conc_cod = 912) OR (conc_cod = 913)) THEN
            BEGIN
            entidad = :nitafc;
            SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
            IF (comision IS NULL) THEN
            comision = 0;
                IF ((conc_cod = 912) OR (conc_cod = 913) ) THEN
                BEGIN
                SELECT A.paan_cesemp FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = ((((:basico + :comision)/30 * :diaslab )+ :cambsaltrans) * :PORCEN) /100;
                END
            END
            ELSE
        BEGIN
        IF (comision IS NULL) THEN
        comision = 0;
        SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
        conc_monto = :basico + :comision;
        IF (conc_porc <> 0 AND conc_porc IS NOT NULL) THEN
        VALOR = (((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans) * :conc_porc) /100;
        ELSE
        IF (:porcen <> 0 AND :porcen IS NOT NULL) THEN
        VALOR = (((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans) * :porcen) /100;
        ELSE
        IF (:montos <> 0 AND :montos IS NOT NULL) THEN
        valor = :montos;
        ELSE
        IF (:conc_monto <> 0 AND :conc_monto IS NOT NULL) THEN
        valor = :conc_monto;
        END
    END
    END
    ELSE
    IF (conc_prov = 'S') THEN
    BEGIN
        conc_monto = :basico;
        IF (conc_porc <> 0 AND conc_porc IS NOT NULL) THEN
        VALOR = (((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans) * :conc_porc) /100;
        ELSE
        IF (porcen <> 0 AND porcen IS NOT NULL) THEN
        VALOR = (((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans) * :porcen) /100;
        ELSE
        IF (montos <> 0 AND montos IS NOT NULL) THEN
        VALOR = :montos;
        ELSE
        IF (conc_monto <> 0 AND conc_monto IS NOT NULL) THEN
        VALOR = :conc_monto;
    END
item = :item + 1;
END
 IF (conc_cod = 920) THEN
 BEGIN
 SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :valor;
 IF (valor IS NULL) THEN
 valor = 0;
 item = :item + 1;
 END
    EXECUTE PROCEDURE LEE_CONFIGURACION('NOMINA','GENERAL','REDONDEO AL MULTIPLO DE DIEZ EN TOTALES')returning_values(:aprox);
    EXECUTE PROCEDURE REDONDEE(:valor, :aprox) RETURNING_VALUES (VALOR);
    IF (liquidaper = 0) THEN
    INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
    VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
    ELSE
    IF (liquidaper = 1) THEN
    BEGIN
    rmod = mod(:periodo, 2);
    IF (rmod = 0) THEN
        INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
        VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
    END
    ELSE
    IF (liquidaper = 2) THEN
    BEGIN
    rmod = mod(:periodo, 4);
    IF (rmod = 0) THEN
        INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
        VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
   END
  END
 END
END
SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER PROCEDURE LIQUIDA_HORAS_EXTRA(
    NIT VARCHAR(20),
    ID INTEGER,
    HD SMALLINT,
    HN SMALLINT,
    HFD SMALLINT,
    HFN SMALLINT,
    ANO CHAR(4),
    provi char(1))
AS
declare variable tot_he numeric(18,2);
declare variable tot_fesd numeric(18,2);
declare variable tot_fesn numeric(18,2);
declare variable tot_diur numeric(18,2);
declare variable tot_noct numeric(18,2);
declare variable tar_fesd numeric(9,4);
declare variable tar_fesn numeric(9,4);
declare variable tar_diur numeric(9,4);
declare variable tar_noct numeric(9,4);
declare variable monto integer;
begin
if (PROVI = 'N') then
BEGIN
SELECT EMPL_SALARIO FROM empleados WHERE TERC_NIT = :NIT into :monto;
  monto = :monto / 240;
  EXECUTE PROCEDURE REDONDEE(:monto, 0)returning_values (:monto);
select PAAN_HORASDI, PAAN_HORASNO, PAAN_HORASFN, PAAN_HORASFD FROM PARAMETROS_ANO WHERE paan_ano = :ano
  into :tar_diur, :tar_noct, :tar_fesn, :tar_fesd;
  tot_diur = :monto * tar_diur;
  tot_noct = :monto * tar_noct;
  tot_fesn = :monto * tar_fesn;
  tot_fesd = :monto * tar_fesd;
  tot_diur = :tot_diur * :hd;
  tot_noct = :tot_noct * :hn;
  tot_fesn = :tot_fesn * :hfn;
  tot_fesd = :tot_fesd * :hfd;
  tot_he =  tot_diur + tot_noct + tot_fesd + tot_fesn;
  EXECUTE PROCEDURE REDONDEE(:tot_he, 0)returning_values (:tot_he);
update nomina_detalle set node_extras = :tot_he where nomi_id = :id and terc_nit = :nit;
update nomina_conceptos set noco_valor = :tot_he where nomi_id = :id and terc_nit = :nit and conc_cod = 900;
  suspend;
END
ELSE
BEGIN
SELECT EMPL_SALARIO FROM empleados WHERE TERC_NIT = :NIT into :monto;
  monto = :monto / 240;
  EXECUTE PROCEDURE REDONDEE(:monto, 0)returning_values (:monto);
select PAAN_HORASDI, PAAN_HORASNO, PAAN_HORASFN, PAAN_HORASFD FROM PARAMETROS_ANO WHERE paan_ano = :ano
  into :tar_diur, :tar_noct, :tar_fesn, :tar_fesd;
  tot_diur = :monto * tar_diur;
  tot_noct = :monto * tar_noct;
  tot_fesn = :monto * tar_fesn;
  tot_fesd = :monto * tar_fesd;
  tot_diur = :tot_diur * :hd;
  tot_noct = :tot_noct * :hn;
  tot_fesn = :tot_fesn * :hfn;
  tot_fesd = :tot_fesd * :hfd;
  tot_he =  tot_diur + tot_noct + tot_fesd + tot_fesn;
  EXECUTE PROCEDURE REDONDEE(:tot_he, 0)returning_values (:tot_he);
update nomina_detalle_PROV set ndep_extras = :tot_he where nopo_id = :id and terc_nit = :nit;
update nomina_conceptos_PROV set ncop_valor = :tot_he where nopo_id = :id and terc_nit = :nit and conc_cod = 900;
  suspend;
END
end
^

SET TERM ; ^

SET TERM ^ ;

ALTER TRIGGER NOMINA_DETALLE_AI0
ACTIVE AFTER INSERT POSITION 0
AS
begin
EXECUTE PROCEDURE liquida_horas_extra (NEW.terc_nit,NEW.nomi_id,NEW.node_horasdi,NEW.node_horasno,NEW.node_horasfd,NEW.node_horasfn, NEW.node_ano, 'N');
end
^

SET TERM ; ^

SET TERM ^ ;

ALTER TRIGGER nomina_detalle_prov_ai0
ACTIVE AFTER INSERT POSITION 0
AS
begin
EXECUTE PROCEDURE liquida_horas_extra (NEW.terc_nit,NEW.nopo_id,NEW.ndep_horasdi,NEW.ndep_horasno,NEW.ndep_horasfd,NEW.ndep_horasfn, NEW.ndep_ano, 'S');
end
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE IMPR_PLANILLA_NOMINA(
    ID INTEGER,
    PAGO CHAR(1),
    CTA CHAR(1))
RETURNS (
    FECHA DATE,
    OBSERVACIONES BLOB SUB_TYPE 0 SEGMENT SIZE 80,
    PAGOGLOBAL CHAR(1),
    PERIODO INTEGER,
    ANO CHAR(4),
    PERIODICIDAD VARCHAR(60),
    NITEMPL VARCHAR(20),
    VALOR NUMERIC(18,2),
    DEDUC CHAR(1),
    NOMBREEMPL VARCHAR(60),
    NOMCORTCONC VARCHAR(60),
    NOMBRECONC VARCHAR(60),
    CODCONC INTEGER,
    PROV CHAR(1),
    TOTALEMPL NUMERIC(18,2),
    TOTALDEDUC NUMERIC(18,2),
    TOTALDEVENG NUMERIC(18,2),
    NUMEMPL INTEGER,
    CTAEMPL VARCHAR(25),
    TOTALCTAS NUMERIC(18,2))
AS
DECLARE VARIABLE NITANT VARCHAR(20);
DECLARE VARIABLE nitnue VARCHAR(20);
DECLARE VARIABLE NUMCONC INTEGER;
BEGIN
numempl = 0;
nitant = 0;
nitnue = 0;
IF (PAGO = 'N') THEN
BEGIN
FOR SELECT N.nomi_feccausa, N.nomi_obs, N.nomi_pagoglobal, N.nomi_periodo, N.nomi_ano, P.ppag_nombre FROM NOMINA N, periodo_pago P
 WHERE P.ppag_cod = N.nomi_periodocidad AND N.nomi_id = :ID
 INTO :fecha, :observaciones, :pagoglobal, :periodo, :ano, :periodicidad
 DO
 BEGIN
 FOR SELECT NC.terc_nit, NC.noco_valor, NC.noco_deduc, T.terc_nom, C.conc_nomcorto, C.conc_nombre, NC.conc_cod, NC.noco_prov FROM NOMINA_CONCEPTOS NC, TERCEROS T, EMPLEADOS E, CONCEPTOS_NOMINA C
        WHERE NC.nomi_id = :ID AND T.terc_nit = E.terc_nit AND C.conc_cod = NC.conc_cod AND t.terc_nit = nc.terc_nit
      INTO :nitempl, :valor, :deduc, :nombreempl, :nomcortconc, :nombreconc, :codconc, :prov
 DO
 BEGIN
 IF (valor IS NULL) THEN
 valor = 0;
 SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND TERC_NIT = :nitempl INTO :totalempl;
 SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND TERC_NIT = :nitempl AND NC.noco_deduc = 'S' INTO :totaldeduc;
 SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND TERC_NIT = :nitempl AND NC.noco_deduc = 'N' INTO :totaldeveng;
  SUSPEND;
 END
 END
END
ELSE
IF (PAGO = 'S') THEN
BEGIN
FOR SELECT N.nomi_feccausa, N.nomi_obs, N.nomi_pagoglobal, N.nomi_periodo, N.nomi_ano, P.ppag_nombre FROM NOMINA N, periodo_pago P
 WHERE P.ppag_cod = N.nomi_periodocidad AND N.nomi_id = :ID
 INTO :fecha, :observaciones, :pagoglobal, :periodo, :ano, :periodicidad
 DO
 BEGIN
 FOR SELECT NC.terc_nit, NC.noco_valor, NC.noco_deduc, T.terc_nom, C.conc_nomcorto, C.conc_nombre, NC.conc_cod, NC.noco_prov FROM NOMINA_CONCEPTOS NC, TERCEROS T, EMPLEADOS E, CONCEPTOS_NOMINA C
        WHERE NC.nomi_id = :ID AND T.terc_nit = E.terc_nit AND C.conc_cod = NC.conc_cod AND t.terc_nit = nc.terc_nit AND NC.noco_prov = 'N' AND NC.noco_gtoempr = 'N'
      INTO :nitempl, :valor, :deduc, :nombreempl, :nomcortconc, :nombreconc, :codconc, :prov
 DO
 BEGIN
 IF (valor IS NULL) THEN
 valor = 0;
 SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND TERC_NIT = :nitempl INTO :totalempl;
 SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND TERC_NIT = :nitempl AND NC.noco_deduc = 'S' INTO :totaldeduc;
 SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND TERC_NIT = :nitempl AND NC.noco_deduc = 'N' INTO :totaldeveng;
 IF (cta = 'S') THEN
 BEGIN
 SELECT COUNT(CONC_COD) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND TERC_NIT = :nitempl INTO :numconc;
 totalempl = totalempl / :numconc;
 SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND TERC_NIT = :nitempl INTO :totalctas;
 END
 SELECT TERC_NIT, EMPL_CUENTA FROM EMPLEADOS WHERE TERC_NIT = :nitempl INTO :nitnue, :ctaempl;
 IF (nitnue IS NOT NULL) THEN
 BEGIN
 IF (nitnue <> nitant) THEN
 numempl = :numempl + 1;
 nitant = :nitnue;
 END
  SUSPEND;
 END
 END
END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER PROCEDURE IMPR_PLANILLA_NOMINA_PROV(
    ID INTEGER,
    PAGO CHAR(1),
    CTA CHAR(1))
RETURNS (
    FECHA DATE,
    OBSERVACIONES BLOB SUB_TYPE 0 SEGMENT SIZE 80,
    PAGOGLOBAL CHAR(1),
    PERIODO INTEGER,
    ANO CHAR(4),
    PERIODICIDAD VARCHAR(60),
    NITEMPL VARCHAR(20),
    VALOR NUMERIC(18,2),
    DEDUC CHAR(1),
    NOMBREEMPL VARCHAR(60),
    NOMCORTCONC VARCHAR(60),
    NOMBRECONC VARCHAR(60),
    CODCONC INTEGER,
    PROV CHAR(1),
    TOTALEMPL NUMERIC(18,2),
    TOTALDEDUC NUMERIC(18,2),
    TOTALDEVENG NUMERIC(18,2),
    NUMEMPL INTEGER,
    CTAEMPL VARCHAR(25),
    TOTALCTAS NUMERIC(18,2),
    SDOEMPL NUMERIC(18,2),
    DIASLAB INTEGER)
AS
DECLARE VARIABLE NITANT VARCHAR(20);
DECLARE VARIABLE nitnue VARCHAR(20);
DECLARE VARIABLE NUMCONC INTEGER;
BEGIN
numempl = 0;
nitant = 0;
nitnue = 0;
IF (PAGO = 'N') THEN
BEGIN
FOR SELECT N.nopo_feccausa, N.nopo_obs, N.nopo_pagoglobal, N.nopo_periodo, N.nopo_ano, P.ppag_nombre, ND.ndep_diaslab FROM NOMINA_PROV N, periodo_pago P, NOMINA_DETALLE_PROV ND
 WHERE P.ppag_cod = N.nopo_periodocidad AND N.nopo_id = :ID AND N.nopo_id = ND.nopo_id
 INTO :fecha, :observaciones, :pagoglobal, :periodo, :ano, :periodicidad, :diaslab
 DO
 BEGIN
 FOR SELECT NC.terc_nit, NC.ncop_valor, NC.ncop_deduc, T.terc_nom, C.conc_nomcorto, C.conc_nombre, NC.conc_cod, NC.ncop_prov FROM NOMINA_CONCEPTOS_PROV NC, TERCEROS T, EMPLEADOS E, CONCEPTOS_NOMINA C
        WHERE NC.nopo_id = :ID AND T.terc_nit = E.terc_nit AND C.conc_cod = NC.conc_cod AND t.terc_nit = nc.terc_nit
      INTO :nitempl, :valor, :deduc, :nombreempl, :nomcortconc, :nombreconc, :codconc, :prov
 DO
 BEGIN
 IF (valor IS NULL) THEN
 valor = 0;
 SELECT SUM(NC.ncop_valor) FROM NOMINA_CONCEPTOS_PROV NC WHERE NC.ncop_prov = 'N' AND ncop_GTOEMPR = 'N' AND nopo_ID = :id AND TERC_NIT = :nitempl INTO :totalempl;
 SELECT SUM(NC.ncop_valor) FROM NOMINA_CONCEPTOS_PROV NC WHERE NC.ncop_prov = 'N' AND ncop_GTOEMPR = 'N' AND nopo_ID = :id AND TERC_NIT = :nitempl AND NC.ncop_deduc = 'S' INTO :totaldeduc;
 SELECT SUM(NC.ncop_valor) FROM NOMINA_CONCEPTOS_PROV NC WHERE NC.ncop_prov = 'N' AND ncop_GTOEMPR = 'N' AND nopo_ID = :id AND TERC_NIT = :nitempl AND NC.ncop_deduc = 'N' INTO :totaldeveng;
  SUSPEND;
 END
 END
END
ELSE
IF (PAGO = 'S') THEN
BEGIN
FOR SELECT N.nopo_feccausa, N.nopo_obs, N.nopo_pagoglobal, N.nopo_periodo, N.nopo_ano, P.ppag_nombre FROM NOMINA_PROV N, periodo_pago P
 WHERE P.ppag_cod = N.nopo_periodocidad AND N.nopo_id = :ID
 INTO :fecha, :observaciones, :pagoglobal, :periodo, :ano, :periodicidad
 DO
 BEGIN
 FOR SELECT NC.terc_nit, NC.ncop_valor, NC.ncop_deduc, T.terc_nom, C.conc_nomcorto, C.conc_nombre, NC.conc_cod, NC.ncop_prov FROM NOMINA_CONCEPTOS_PROV NC, TERCEROS T, EMPLEADOS E, CONCEPTOS_NOMINA C
        WHERE NC.nopo_id = :ID AND T.terc_nit = E.terc_nit AND C.conc_cod = NC.conc_cod AND t.terc_nit = nc.terc_nit AND NC.ncop_prov = 'N' AND NC.ncop_gtoempr = 'N'
      INTO :nitempl, :valor, :deduc, :nombreempl, :nomcortconc, :nombreconc, :codconc, :prov
 DO
 BEGIN
 IF (valor IS NULL) THEN
 valor = 0;
 SELECT SUM(NC.ncop_valor) FROM NOMINA_CONCEPTOS_PROV NC WHERE NC.ncop_prov = 'N' AND ncop_GTOEMPR = 'N' AND nopo_ID = :id AND TERC_NIT = :nitempl INTO :totalempl;
 SELECT SUM(NC.ncop_valor) FROM NOMINA_CONCEPTOS_PROV NC WHERE NC.ncop_prov = 'N' AND ncop_GTOEMPR = 'N' AND nopo_ID = :id AND TERC_NIT = :nitempl AND NC.ncop_deduc = 'S' INTO :totaldeduc;
 SELECT SUM(NC.ncop_valor) FROM NOMINA_CONCEPTOS_PROV NC WHERE NC.ncop_prov = 'N' AND ncop_GTOEMPR = 'N' AND nopo_ID = :id AND TERC_NIT = :nitempl AND NC.ncop_deduc = 'N' INTO :totaldeveng;
 IF (cta = 'S') THEN
 BEGIN
 SELECT COUNT(CONC_COD) FROM NOMINA_CONCEPTOS_PROV NC WHERE NC.ncop_prov = 'N' AND ncop_GTOEMPR = 'N' AND nopo_ID = :id AND TERC_NIT = :nitempl INTO :numconc;
 totalempl = totalempl / :numconc;
 SELECT SUM(NC.ncop_valor) FROM NOMINA_CONCEPTOS_PROV NC WHERE NC.ncop_prov = 'N' AND ncop_GTOEMPR = 'N' AND nopo_ID = :id AND TERC_NIT = :nitempl INTO :totalctas;
 END
 SELECT TERC_NIT, EMPL_CUENTA, EMPL_SALARIO FROM EMPLEADOS WHERE TERC_NIT = :nitempl INTO :nitnue, :ctaempl, :sdoempl;
 IF (nitnue IS NOT NULL) THEN
 BEGIN
 IF (nitnue <> nitant) THEN
 numempl = :numempl + 1;
 nitant = :nitnue;
 END
  SUSPEND;
 END
 END
END
END
^

SET TERM ; ^

update RDB$RELATION_FIELDS set
RDB$FIELD_SOURCE = 'NUMERO'
where (RDB$FIELD_NAME = 'NOMI_PROVI') and
(RDB$RELATION_NAME = 'NOMINA')
;

ALTER TABLE BANCOS ADD BANC_CODACH VARCHAR(9);

SET TERM ^ ;

CREATE OR ALTER PROCEDURE CEROS_ANCHO_FIJO(
    DATO VARCHAR(200),
    LONGDATO INTEGER,
    TIPODATO CHAR(1))
RETURNS (
    DATOCEROS VARCHAR(200))
AS
DECLARE VARIABLE CONT INTEGER;
DECLARE VARIABLE NUMEROCEROS INTEGER;
declare variable CEROS VARCHAR(200);
declare variable TAM INTEGER;
declare variable AUX VARCHAR(200);
BEGIN
if (dato is null) then
dato = ' ';
if (TIPODATO = 'N') then
BEGIN
CONT = 1;
CEROS = '';
TAM = STRLEN(DATO);
if (:tam > :longdato) then
    DATO = substr(:dato,1,strlen(dato)-(:tam - :longdato));
NUMEROCEROS = :LONGDATO - :TAM;
WHILE (CONT <= NUMEROCEROS ) DO
BEGIN
CEROS = CEROS || '0';
CONT = :cont + 1;
END
DATOCEROS = CEROS || dato ;
  SUSPEND;
END
ELSE
if (TIPODATO = 'A') then
BEGIN
CONT = 1;
CEROS = '';
TAM = STRLEN(DATO);
if (:tam > :longdato) then
DATO = substr(:dato,1,strlen(dato)-(:tam - :longdato));
NUMEROCEROS = :LONGDATO - :TAM;
WHILE (CONT <= NUMEROCEROS ) DO
BEGIN
CEROS = CEROS || ' ';
CONT = :cont + 1;
END
DATOCEROS = DATO || CEROS ;
  SUSPEND;
END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER PROCEDURE ARCHIVO_BANCO(
    IDDOC INTEGER,
    FECHA DATE)
RETURNS (
    DATOS VARCHAR(591))
AS
DECLARE VARIABLE dat VARCHAR(60);
declare variable NOMBREEMPL VARCHAR(60);
declare variable NUMDOCID VARCHAR(20);
declare variable CUENTAEMPL VARCHAR(25);
declare variable BANCO INTEGER;
declare variable tipocta char(1);
BEGIN
datos = '';
dat = '1';
datos = :datos || :dat;
EXECUTE PROCEDURE lee_configuracion('CONTABILIDAD','GENERAL','NIT COMPAÑIA')returning_values (:dat);
EXECUTE PROCEDURE ceros_ancho_fijo(:dat,10,'N')returning_values(:dat);
datos = :datos || :dat;
dat = '';
EXECUTE PROCEDURE lee_configuracion('GENERAL','GENERAL','NOMBRE COMPAÑIA')returning_values (:dat);
EXECUTE PROCEDURE ceros_ancho_fijo(:dat,16,'A')returning_values(:dat);
datos = :datos || :dat;
dat = '225';
datos = :datos || :dat;
dat = 'NOMINA';
EXECUTE PROCEDURE ceros_ancho_fijo(:dat,10,'A')returning_values(:dat);
datos = :datos || :dat;
dat = substr(:fecha,3,4)|| substr(:fecha,6,7) || substr(:fecha,9,10);
datos = :datos || :dat;
dat = 'B';
datos = :datos || :dat;
dat = substr(:fecha,3,4)|| substr(:fecha,6,7) || substr(:fecha,9,10);
datos = :datos || :dat;
SELECT COUNT(NOMI_ID) FROM NOMINA_DETALLE WHERE NOMI_ID = :iddoc INTO :dat;
EXECUTE PROCEDURE ceros_ancho_fijo(:dat,6,'N')returning_values(:dat);
datos = :datos || :dat;
dat = '000000000000';
datos = :datos || :dat;
SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :iddoc INTO :dat;
dat = substr(:dat,1,strlen(:dat)-3);
EXECUTE PROCEDURE ceros_ancho_fijo(:dat,12,'N')returning_values(:dat);
datos = :datos || :dat;
EXECUTE PROCEDURE lee_configuracion('NOMINA', 'GENERAL', 'NUMERO DE CUENTA DEL BANCO')returning_values (:dat);
EXECUTE PROCEDURE ceros_ancho_fijo(:dat,11,'N')returning_values(:dat);
datos = :datos || :dat;
EXECUTE PROCEDURE lee_configuracion('NOMINA', 'GENERAL', 'TIPO CUENTA')returning_values (:dat);
EXECUTE PROCEDURE ceros_ancho_fijo(:dat,1,'A')returning_values(:dat);
datos = :datos || :dat;
  SUSPEND;
datos = '';
FOR SELECT D.terc_nit, T.terc_nom, E.empl_cuenta, E.empl_banco, e.empl_tipocta FROM empleados E, NOMINA_DETALLE D, TERCEROS T WHERE D.terc_nit = E.terc_nit AND T.terc_nit = E.terc_nit AND D.nomi_id = :iddoc INTO :numdocid, :nombreempl, :cuentaempl, :banco, :tipocta
DO
BEGIN
dat = '6';
datos = :datos || :dat;
dat = :numdocid;
EXECUTE PROCEDURE ceros_ancho_fijo(:dat,15,'N')returning_values(:dat);
datos = :datos || :dat;
dat = :nombreempl;
EXECUTE PROCEDURE ceros_ancho_fijo(:dat,18,'A')returning_values(:dat);
datos = :datos || :dat;
SELECT B.banc_codach FROM BANCOS B WHERE B.banc_cod = :banco INTO :dat;
EXECUTE PROCEDURE ceros_ancho_fijo(:dat,9,'N')returning_values(:dat);
datos = :datos || :dat;
dat = :cuentaempl;
EXECUTE PROCEDURE ceros_ancho_fijo(:dat,17,'N')returning_values(:dat);
datos = :datos || :dat;
dat = 'S';
datos = :datos || :dat;
if (:tipocta = 'C') then
dat=  '27';
ELSE
if (:tipocta = 'A') then
dat=  '37';
datos = :datos || :dat;
SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NC.terc_nit = :numdocid AND NOMI_ID = :iddoc INTO :dat;
dat = substr(:dat,1,strlen(:dat)-3);
EXECUTE PROCEDURE ceros_ancho_fijo(:dat,10,'N')returning_values(:dat);
datos = :datos || :dat;
dat = 'NOMINA';
EXECUTE PROCEDURE ceros_ancho_fijo(:dat,9,'A')returning_values(:dat);
datos = :datos || :dat;
if (substr(:fecha,6,7) = '01') then
dat= 'ENERO';
ELSE
if (substr(:fecha,6,7) = '02') then
dat= 'FEBRERO';
ELSE
if (substr(:fecha,6,7) = '03') then
dat= 'MARZO';
ELSE
if (substr(:fecha,6,7) = '04') then
dat= 'ABRIL';
ELSE
if (substr(:fecha,6,7) = '05') then
dat= 'MAYO';
ELSE
if (substr(:fecha,6,7) = '06') then
dat= 'JUNIO';
ELSE
if (substr(:fecha,6,7) = '07') then
dat= 'JULIO';
ELSE
if (substr(:fecha,6,7) = '08') then
dat= 'AGOSTO';
ELSE
if (substr(:fecha,6,7) = '09') then
dat= 'SEPTIEMBRE';
ELSE
if (substr(:fecha,6,7) = '10') then
dat= 'OCTUBRE';
if (substr(:fecha,6,7) = '11') then
dat= 'NOVIEMBRE';
ELSE
if (substr(:fecha,6,7) = '12') then
dat= 'DICIEMBRE';
EXECUTE PROCEDURE ceros_ancho_fijo(:dat,12,'A')returning_values(:dat);
datos = :datos || :dat;
dat= ' ';
datos = :datos || :dat;
SUSPEND;
datos = '';
END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER PROCEDURE DIAS_LABORADOS (
    nitempl varchar(20),
    periodo integer,
    fec date)
returns (
    totaldiaslab integer)
as
declare variable diasnolab integer;
declare variable diaslabxper integer;
declare variable perpago integer;
declare variable fecing date;
declare variable diasfec integer;
declare variable diasing integer;
BEGIN
SELECT E.empl_ppago, E.empl_fecing
FROM EMPLEADOS E WHERE TERC_NIT = :nitempl
INTO :perpago, :fecing;
IF (perpago = 1) THEN
diaslabxper = 30;
ELSE
IF (perpago = 2) THEN
diaslabxper = 15;
ELSE
IF (perpago = 3) THEN
diaslabxper = 7;
if (SUBSTR(fecing,1,7) = SUBSTR(FEC,1,7)) then
BEGIN
diasfec = cast(substr(fec,9,10) as integer);
diasing = cast(substr(fecing,9,10) as integer);
diaslabxper = diasfec - diasing;
if ((diaslabxper > 15) and (perpago = 2)) then
diaslabxper = 15;
END
SELECT SUM (NONO_DURA)
FROM nomina_novedades WHERE TERC_NIT = :nitempl AND TNOV_COD = 9 AND NONO_PERIODO = :periodo
INTO :diasnolab;
totaldiaslab =  :diaslabxper - :diasnolab;
IF (totaldiaslab IS NULL) THEN
totaldiaslab =  :diaslabxper;
SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER PROCEDURE LIQUIDACION_APORTES (
    id_nomina_1 integer,
    id_nomina_2 integer,
    id_nomina_3 integer,
    id_nomina_4 integer,
    id_nomina_5 integer,
    id_nomina_6 integer,
    id_nomina_7 integer,
    intmora numeric(18,2),
    fecha date,
    formulario varchar(10))
returns (
    idaporte integer)
as
declare variable itemaportadmi integer;
declare variable itemdetaport integer;
declare variable nit varchar(20);
declare variable eps char(1);
declare variable afp char(1);
declare variable ccf char(1);
declare variable afc char(1);
declare variable arp char(1);
declare variable nombreadmin varchar(60);
declare variable totadmin numeric(18,2);
declare variable totadminneg numeric(18,2);
declare variable tipoaport char(1);
declare variable ano char(4);
declare variable nitempl varchar(20);
declare variable totdetvalor numeric(18,2);
declare variable totdetvalorneg numeric(18,2);
declare variable totibc integer;
begin
itemaportadmi = 1;
itemdetaport = 1;
ANO = SUBSTR(fecha, 1, 4);
idaporte = gen_id(id_pgaport,1);
select PAAN_TIPOAPORT from parametros_ano where PAAN_ANO = :ANO into :tipoaport;
for select A.TERC_NIT, A.ADMI_EPS, A.ADMI_AFP, A.ADMI_CCF, A.ADMI_AFC, A.ADMI_ARP, T.TERC_NOM from ADMINISTRADORA A, TERCEROS t
  where T.TERC_NIT = A.TERC_NIT and t.terc_admini = 'S' Into :nit, :eps, :afp, :CCF, :afc, :arp, :nombreadmin
  do
  begin
  select sum (noco_valor) from nomina_conceptos N
  where (N.noco_aporte = 'S' and N.noco_entidad = :nit and (nomi_id = :id_nomina_1 or (nomi_id = :id_nomina_2) or (nomi_id = :id_nomina_3) or (nomi_id = :id_nomina_4) or (nomi_id = :id_nomina_5) or (nomi_id = :id_nomina_6) or (nomi_id = :id_nomina_7)) AND N.noco_valor > 0)
  into :totadmin;
  if (totadmin is null) then
  totadmin = 0;
  select sum (noco_valor*(-1)) from nomina_conceptos N
  where (N.noco_aporte = 'S' and N.noco_entidad = :nit and (nomi_id = :id_nomina_1 or (nomi_id = :id_nomina_2) or (nomi_id = :id_nomina_3) or (nomi_id = :id_nomina_4) or (nomi_id = :id_nomina_5) or (nomi_id = :id_nomina_6) or (nomi_id = :id_nomina_7)) AND N.noco_valor < 0)
  into :totadminneg;
  if (totadminneg is null) then
  totadminneg = 0;
  totadmin = :totadminneg + :totadmin;
  if (totadmin IS NOT NULL and totadmin <> 0) then
  BEGIN
  insert into pago_aportes (pgap_id, pgap_item, pgap_tipoap, pgap_conpago, pgap_admin, pgap_monto, pgap_intmora, pgap_fecha, pgap_formulario) values
                           (:idaporte, :itemaportadmi, :tipoaport, '', :nit, :totadmin, :intmora, :fecha, :formulario);
  if (CCF = 'S') then
  for select TERC_NIT from EMPLEADOS where EMPL_CCF = :NIT into :nitempl
  do
  begin
  select sum (NOCO_VALOR) from NOMINA_CONCEPTOS
        where (TERC_NIT = :nitempl and NOCO_SALARIO = 'S' and (nomi_id = :id_nomina_1 or (nomi_id = :id_nomina_2) or (nomi_id = :id_nomina_3) or (nomi_id = :id_nomina_4) or (nomi_id = :id_nomina_5) or (nomi_id = :id_nomina_6) or (nomi_id = :id_nomina_7)))
        into :totibc;
  select sum (NOCO_VALOR) from NOMINA_CONCEPTOS N
         where (TERC_NIT = :nitempl and NOCO_ENTIDAD = :nit and NOCO_APORTE = 'S' and (nomi_id = :id_nomina_1 or (nomi_id = :id_nomina_2) or (nomi_id = :id_nomina_3) or (nomi_id = :id_nomina_4) or (nomi_id = :id_nomina_5) or (nomi_id = :id_nomina_6) or (nomi_id = :id_nomina_7))
         AND noco_valor > 0 and (N.conc_cod = 910 or (N.conc_cod = 911) or (N.conc_cod = 916) or (N.conc_cod = 917) or (N.conc_cod = 918) or (N.conc_cod = 919)))
       into :totdetvalor;
    if (totdetvalor is null) then
  totdetvalor = 0;
  select sum (NOCO_VALOR*(-1)) from NOMINA_CONCEPTOS N
         where (TERC_NIT = :nitempl and NOCO_ENTIDAD = :nit and NOCO_APORTE = 'S' and (nomi_id = :id_nomina_1 or (nomi_id = :id_nomina_2) or (nomi_id = :id_nomina_3) or (nomi_id = :id_nomina_4) or (nomi_id = :id_nomina_5) or (nomi_id = :id_nomina_6) or (nomi_id = :id_nomina_7))
         AND noco_valor < 0 and (N.conc_cod = 910 or (N.conc_cod = 911) or (N.conc_cod = 916) or (N.conc_cod = 917) or (N.conc_cod = 918) or (N.conc_cod = 919)))
        into :totdetvalorneg;
  if (totdetvalorneg is null) then
  totdetvalorneg = 0;
  totdetvalor = :totdetvalorneg + :totdetvalor;
  if ((:totdetvalor is not null) and (:totibc is not null) and totdetvalor <> 0) then
  begin
  insert into PAGO_APORTES_DETALLE (pgap_id, pgap_item, pade_itemdet, terc_nit, pade_ibc, pade_cotobl, pade_tipap)
                             values(:idaporte, :itemaportadmi, :itemdetaport, :nitempl, :totibc, :totdetvalor,'CCF');
    itemdetaport = :itemdetaport + 1;
  totdetvalor = 0;
  end
  end
if (EPS = 'S') then
  for select TERC_NIT from EMPLEADOS where EMPL_EPS = :NIT into :nitempl
  do
  begin
  select sum (NOCO_VALOR) from NOMINA_CONCEPTOS N
        where (TERC_NIT = :nitempl and NOCO_SALARIO = 'S' and (nomi_id = :id_nomina_1 or (nomi_id = :id_nomina_2) or (nomi_id = :id_nomina_3) or (nomi_id = :id_nomina_4) or (nomi_id = :id_nomina_5) or (nomi_id = :id_nomina_6) or (nomi_id = :id_nomina_7)))
        into :totibc;
  select sum (NOCO_VALOR) from NOMINA_CONCEPTOS N
         where (TERC_NIT = :nitempl and NOCO_ENTIDAD = :nit and NOCO_APORTE = 'S' and (nomi_id = :id_nomina_1 or (nomi_id = :id_nomina_2) or (nomi_id = :id_nomina_3) or (nomi_id = :id_nomina_4) or (nomi_id = :id_nomina_5) or (nomi_id = :id_nomina_6) or (nomi_id = :id_nomina_7))
         AND noco_valor > 0 and (N.conc_cod = 907 or (N.conc_cod = 914) or (N.conc_cod = 915)))
        into :totdetvalor;
  select sum (NOCO_VALOR*(-1)) from NOMINA_CONCEPTOS N
         where (TERC_NIT = :nitempl and NOCO_ENTIDAD = :nit and NOCO_APORTE = 'S' and (nomi_id = :id_nomina_1 or (nomi_id = :id_nomina_2) or (nomi_id = :id_nomina_3) or (nomi_id = :id_nomina_4) or (nomi_id = :id_nomina_5) or (nomi_id = :id_nomina_6) or (nomi_id = :id_nomina_7))
         AND noco_valor < 0 and (N.conc_cod = 907 or (N.conc_cod = 914) or (N.conc_cod = 915)))
        into :totdetvalorneg;
          if (totdetvalorneg is null) then
  totdetvalorneg = 0;
  totdetvalor = :totdetvalorneg + :totdetvalor;
  if ((:totdetvalor is not null) and (:totibc is not null) and totdetvalor <> 0) then
  begin
  insert into PAGO_APORTES_DETALLE (pgap_id, pgap_item, pade_itemdet, terc_nit, pade_ibc, pade_cotobl, pade_tipap)
                             values(:idaporte, :itemaportadmi, :itemdetaport, :nitempl, :totibc, :totdetvalor,'EPS');
  itemdetaport = :itemdetaport + 1;
  totdetvalor = 0;
  end
  end
if (afp = 'S') then
  for select TERC_NIT from EMPLEADOS where EMPL_AFP = :NIT into :nitempl
  do
  begin
  select sum (NOCO_VALOR) from NOMINA_CONCEPTOS
        where (TERC_NIT = :nitempl and NOCO_SALARIO = 'S'
        and (nomi_id = :id_nomina_1 or (nomi_id = :id_nomina_2) or (nomi_id = :id_nomina_3) or (nomi_id = :id_nomina_4) or (nomi_id = :id_nomina_5) or (nomi_id = :id_nomina_6) or (nomi_id = :id_nomina_7)))
        into :totibc;
  select sum (NOCO_VALOR) from NOMINA_CONCEPTOS N
         where (TERC_NIT = :nitempl and NOCO_ENTIDAD = :nit and NOCO_APORTE = 'S' and (nomi_id = :id_nomina_1 or (nomi_id = :id_nomina_2) or (nomi_id = :id_nomina_3) or (nomi_id = :id_nomina_4) or (nomi_id = :id_nomina_5) or (nomi_id = :id_nomina_6) or (nomi_id = :id_nomina_7)) AND noco_valor > 0 and (N.conc_cod = 904 or (N.conc_cod = 905) or (N.conc_cod = 906)))
         into :totdetvalor;
             if (totdetvalor is null) then
  totdetvalor = 0;
  select sum (NOCO_VALOR*(-1)) from NOMINA_CONCEPTOS N
         where (TERC_NIT = :nitempl and NOCO_ENTIDAD = :nit and NOCO_APORTE = 'S' and (nomi_id = :id_nomina_1 or (nomi_id = :id_nomina_2) or (nomi_id = :id_nomina_3) or (nomi_id = :id_nomina_4) or (nomi_id = :id_nomina_5) or (nomi_id = :id_nomina_6) or (nomi_id = :id_nomina_7)) AND noco_valor < 0 and (N.conc_cod = 904 or (N.conc_cod = 905) or (N.conc_cod = 906)))
         into :totdetvalorneg;
           if (totdetvalorneg is null) then
  totdetvalorneg = 0;
  totdetvalor = :totdetvalorneg + :totdetvalor;
  if ((:totdetvalor is not null) and (:totibc is not null) and totdetvalor <> 0) then
  begin
  insert into PAGO_APORTES_DETALLE (pgap_id, pgap_item, pade_itemdet, terc_nit, pade_ibc, pade_cotobl, pade_tipap)
                             values(:idaporte, :itemaportadmi, :itemdetaport, :nitempl, :totibc, :totdetvalor,'AFP');
    itemdetaport = :itemdetaport + 1;
    totdetvalor = 0;
  end
  end
if (AFC = 'S') then
  for select TERC_NIT from EMPLEADOS where EMPL_AFC = :NIT into :nitempl
  do
  begin
  select sum (NOCO_VALOR) from NOMINA_CONCEPTOS N
        where (TERC_NIT = :nitempl and NOCO_SALARIO = 'S' and (nomi_id = :id_nomina_1 or (nomi_id = :id_nomina_2) or (nomi_id = :id_nomina_3) or (nomi_id = :id_nomina_4) or (nomi_id = :id_nomina_5) or (nomi_id = :id_nomina_6) or (nomi_id = :id_nomina_7)))
        into :totibc;
  select sum (NOCO_VALOR) from NOMINA_CONCEPTOS N
         where (TERC_NIT = :nitempl and NOCO_ENTIDAD = :nit and NOCO_APORTE = 'S' and (nomi_id = :id_nomina_1 or (nomi_id = :id_nomina_2) or (nomi_id = :id_nomina_3) or (nomi_id = :id_nomina_4) or (nomi_id = :id_nomina_5) or (nomi_id = :id_nomina_6) or (nomi_id = :id_nomina_7))
         AND noco_valor > 0 and (N.conc_cod = 912 or (N.conc_cod = 913)))
        into :totdetvalor;
            if (totdetvalor is null) then
  totdetvalor = 0;
  select sum (NOCO_VALOR*(-1)) from NOMINA_CONCEPTOS N
         where (TERC_NIT = :nitempl and NOCO_ENTIDAD = :nit and NOCO_APORTE = 'S' and (nomi_id = :id_nomina_1 or (nomi_id = :id_nomina_2) or (nomi_id = :id_nomina_3) or (nomi_id = :id_nomina_4) or (nomi_id = :id_nomina_5) or (nomi_id = :id_nomina_6) or (nomi_id = :id_nomina_7))
         AND noco_valor < 0 and (N.conc_cod = 912 or (N.conc_cod = 913)))
        into :totdetvalorneg;
          if (totdetvalorneg is null) then
  totdetvalorneg = 0;
  totdetvalor = :totdetvalorneg + :totdetvalor;
  if ((:totdetvalor is not null) and (:totibc is not null) and totdetvalor <> 0) then
  begin
  insert into PAGO_APORTES_DETALLE (pgap_id, pgap_item, pade_itemdet, terc_nit, pade_ibc, pade_cotobl, pade_tipap)
                             values(:idaporte, :itemaportadmi, :itemdetaport, :nitempl, :totibc, :totdetvalor,'AFC');    itemdetaport = :itemdetaport + 1;
  totdetvalor = 0;
  end
  end
if (ARP = 'S') then
  for select TERC_NIT from EMPLEADOS where EMPL_ARP = :NIT into :nitempl
  do
  begin
  select sum (NOCO_VALOR) from NOMINA_CONCEPTOS N
        where (TERC_NIT = :nitempl and NOCO_SALARIO = 'S' and (nomi_id = :id_nomina_1 or (nomi_id = :id_nomina_2) or (nomi_id = :id_nomina_3) or (nomi_id = :id_nomina_4) or (nomi_id = :id_nomina_5) or (nomi_id = :id_nomina_6) or (nomi_id = :id_nomina_7)))
        into :totibc;
  select sum (NOCO_VALOR) from NOMINA_CONCEPTOS N
         where (TERC_NIT = :nitempl and NOCO_ENTIDAD = :nit and NOCO_APORTE = 'S' and (nomi_id = :id_nomina_1 or (nomi_id = :id_nomina_2) or (nomi_id = :id_nomina_3) or (nomi_id = :id_nomina_4) or (nomi_id = :id_nomina_5) or (nomi_id = :id_nomina_6) or (nomi_id = :id_nomina_7))
         AND noco_valor > 0 and (N.conc_cod = 908 or (N.conc_cod = 909)))
        into :totdetvalor;
            if (totdetvalor is null) then
  totdetvalor = 0;
  select sum (NOCO_VALOR*(-1)) from NOMINA_CONCEPTOS N
         where (TERC_NIT = :nitempl and NOCO_ENTIDAD = :nit and NOCO_APORTE = 'S' and (nomi_id = :id_nomina_1 or (nomi_id = :id_nomina_2) or (nomi_id = :id_nomina_3) or (nomi_id = :id_nomina_4) or (nomi_id = :id_nomina_5) or (nomi_id = :id_nomina_6) or (nomi_id = :id_nomina_7))
         AND noco_valor < 0 and (N.conc_cod = 908 or (N.conc_cod = 909)))
        into :totdetvalorneg;
          if (totdetvalorneg is null) then
  totdetvalorneg = 0;
  totdetvalor = :totdetvalorneg + :totdetvalor;
  if ((:totdetvalor is not null) and (:totibc is not null) and totdetvalor <> 0) then
  begin
  insert into PAGO_APORTES_DETALLE (pgap_id, pgap_item, pade_itemdet, terc_nit, pade_ibc, pade_cotobl, pade_tipap)
                             values(:idaporte, :itemaportadmi, :itemdetaport, :nitempl, :totibc, :totdetvalor,'ARP');    itemdetaport = :itemdetaport + 1;
  totdetvalor = 0;
  end
  end
  if (totadmin IS NOT NULL) then
  itemaportadmi = :itemaportadmi + 1;
  itemdetaport = 1;
  END
  SUSPEND;
end
end
^

SET TERM ; ^



update empleado_conceptos e set e.conc_cod = 923 where conc_cod = 3;
update conceptos_nomina e set e.conc_cod = 923 where conc_cod = 3;
update nomina_conceptos e set e.conc_cod = 923 where conc_cod = 3;
update empleado_conceptos e set e.conc_cod = 924 where conc_cod = 19;
update conceptos_nomina e set e.conc_cod = 924 where conc_cod = 19;
update nomina_conceptos e set e.conc_cod = 924 where conc_cod = 19;
update empleado_conceptos e set e.conc_cod = 925 where conc_cod = 15;
update conceptos_nomina e set e.conc_cod = 925 where conc_cod = 15;
update nomina_conceptos e set e.conc_cod = 925 where conc_cod = 15;
update empleado_conceptos e set e.conc_cod = 926 where conc_cod = 16;
update conceptos_nomina e set e.conc_cod = 926 where conc_cod = 16;
update nomina_conceptos e set e.conc_cod = 926 where conc_cod = 16;
update empleado_conceptos e set e.conc_cod = 927 where conc_cod = 21;
update conceptos_nomina e set e.conc_cod = 927 where conc_cod = 21;
update nomina_conceptos e set e.conc_cod = 927 where conc_cod = 21;
update empleado_conceptos e set e.conc_cod = 928 where conc_cod = 22;
update conceptos_nomina e set e.conc_cod = 928 where conc_cod = 22;
update nomina_conceptos e set e.conc_cod = 928 where conc_cod = 22;
update empleado_conceptos e set e.conc_cod = 929 where conc_cod = 14;
update conceptos_nomina e set e.conc_cod = 929 where conc_cod = 14;
update nomina_conceptos e set e.conc_cod = 929 where conc_cod = 14;
update empleado_conceptos e set e.conc_cod = 930 where conc_cod = 20;
update conceptos_nomina e set e.conc_cod = 930 where conc_cod = 20;
update nomina_conceptos e set e.conc_cod = 930 where conc_cod = 20;

SET TERM ^ ;

CREATE OR ALTER PROCEDURE CALC_SALDOSINI_NOMINA(
    FECHA DATE)
RETURNS (
    EMPLNIT VARCHAR(20),
    EMPLNOM VARCHAR(60),
    PRIMAJUNIO NUMERIC(18,2),
    CONC_CODPRIMAJUN INTEGER,
    PRIMADIC NUMERIC(18,2),
    CONC_CODPRIMADIC INTEGER,
    CESANTIA NUMERIC(18,2),
    CONC_CODCESAN INTEGER,
    VACAC NUMERIC(18,2),
    CONC_CODVACACI INTEGER,
    INTCES NUMERIC(18,2),
    CONC_CODINTCES INTEGER)
AS
DECLARE VARIABLE numeromeses INTEGER;
declare variable fechaing date;
DECLARE VARIABLE ANOACT INTEGER;
DECLARE VARIABLE MESACT INTEGER;
DECLARE VARIABLE DIAACT INTEGER;
DECLARE VARIABLE ANOING INTEGER;
DECLARE VARIABLE DIAING INTEGER;
DECLARE VARIABLE MESING INTEGER;
DECLARE VARIABLE salario NUMERIC(18,2);
declare variable item integer;
declare variable idsaldo integer;
BEGIN
delete from nomina where nomi_periodo = 0;
idsaldo = gen_id(id_nomina,1);
insert into nomina  (nomi_id, nomi_feccausa, nomi_liqok, nomi_periodo) values (:idsaldo, :fecha, 'S', 0);
item = 1;
anoact = CAST(substr(:fecha,1,4)AS INTEGER);
mesact = CAST(substr(:fecha,6,7)AS INTEGER);
diaact = CAST(substr(:fecha,9,10)AS INTEGER);
FOR SELECT  E.TERC_NIT, T.TERC_NOM, E.EMPL_FECING, E.empl_salario FROM EMPLEADOS E, TERCEROS T WHERE T.terc_nit = E.terc_nit AND e.empl_fecing <= :fecha INTO :emplnit, :emplnom, :fechaing, :salario
DO
  BEGIN
    anoing = CAST(substr(:fechaing,1,4)AS INTEGER);
    mesing = CAST(substr(:fechaing,6,7)AS INTEGER);
    diaing = CAST(substr(:fechaing,9,10)AS INTEGER);
    numeromeses = mesact - 1;
    cesantia = (:salario / 12) * :numeromeses;
    intces = cesantia * 1 /100;
    numeromeses = ((:anoact-:anoing)*12)-((:mesact-:mesing)*(-1))-1;
    if (numeromeses > 12) then
    numeromeses = 12;
    IF (numeromeses < 0) THEN
    numeromeses = 0;
    vacac = (:salario / 12) * :numeromeses;
    IF (anoact = anoing) THEN
    BEGIN
    IF (mesact > 1 AND mesact <= 6) THEN
    BEGIN
    numeromeses = :mesact - :mesing;
    primajunio = (:salario / 12) * :numeromeses;
    END
    ELSE
    primajunio = 0;
    IF (mesact > 7 AND mesact <= 12) THEN
    BEGIN
    numeromeses = :mesact - 6;
    primadic = (:salario / 12) * (:numeromeses);
    END
    END
    ELSE
    IF (mesact > 1 AND mesact <= 6) THEN
    begin
    numeromeses = :mesact - 1;
    primajunio = (:salario / 12) * :numeromeses;
    end
    else
    IF (mesact > 7 AND mesact <= 12) THEN
    BEGIN
    numeromeses = :mesact - 7;
    primadic = (:salario / 12) * (:numeromeses);
    END
EXECUTE PROCEDURE redondee(:primajunio, 5) RETURNING_VALUES :primajunio;
EXECUTE PROCEDURE redondee(:primadic, 5) RETURNING_VALUES :primadic;
EXECUTE PROCEDURE redondee(:cesantia, 5) RETURNING_VALUES :cesantia;
EXECUTE PROCEDURE redondee(:intces, 5) RETURNING_VALUES :intces;
EXECUTE PROCEDURE redondee(:vacac, 5) RETURNING_VALUES :vacac;
/*if ( cesantia <> 0 AND cesantia IS NOT NULL and  intces <> 0 AND intces IS NOT NULL and primajunio <> 0 AND primajunio IS NOT NULL and vacac <> 0 AND vacac IS NOT NULL and primadic <> 0 AND primadic IS NOT NULL) then*/
select conc_cod from empleado_conceptos where ((conc_cod = 912) or (conc_cod = 913)) and terc_nit = :emplnit into :conc_codcesan;
select conc_cod from empleado_conceptos where ((conc_cod = 923) or (conc_cod = 924)) and terc_nit = :emplnit into :conc_codintces;
select conc_cod from empleado_conceptos where ((conc_cod = 925) or (conc_cod = 927)) and terc_nit = :emplnit into :conc_codprimajun;
select conc_cod from empleado_conceptos where ((conc_cod = 926) or (conc_cod = 928)) and terc_nit = :emplnit into :conc_codprimadic;
select conc_cod from empleado_conceptos where ((conc_cod = 929) or (conc_cod = 930)) and terc_nit = :emplnit  into :conc_codvacaci;
if (cesantia <> 0 AND cesantia IS NOT NULL) then
begin
INSERT INTO NOMINA_CONCEPTOS (NOMI_ID, NOCO_ITEM, CONC_COD, TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC, NOCO_PROV, NOCO_APORTE, NOCO_PAGOOK, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, NOCO_GTOEMPR) VALUES (:idsaldo, :item, :conc_codcesan, :emplnit, :cesantia, '', 'N', 'S', 'N', 'N', 0, :anoact, 'N', 'N', 'N', 'S');
item = :item + 1;
end
if (intces <> 0 AND intces IS NOT NULL) then
begin
INSERT INTO NOMINA_CONCEPTOS (NOMI_ID, NOCO_ITEM, CONC_COD, TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC, NOCO_PROV, NOCO_APORTE, NOCO_PAGOOK, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, NOCO_GTOEMPR) VALUES (:idsaldo, :item, :conc_codintces, :emplnit, :intces, '', 'N', 'S', 'N', 'N', 0, :anoact, 'N', 'N', 'N', 'S');
item = :item + 1;
end
if (primajunio <> 0 AND primajunio IS NOT NULL) then
begin
INSERT INTO NOMINA_CONCEPTOS (NOMI_ID, NOCO_ITEM, CONC_COD, TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC, NOCO_PROV, NOCO_APORTE, NOCO_PAGOOK, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, NOCO_GTOEMPR) VALUES (:idsaldo, :item, :conc_codprimajun, :emplnit, :primajunio, '', 'N', 'S', 'N', 'N', 0, :anoact, 'N', 'N', 'N', 'S');
item = :item + 1;
end
if (primadic <> 0 AND primadic IS NOT NULL) then
begin
INSERT INTO NOMINA_CONCEPTOS (NOMI_ID, NOCO_ITEM, CONC_COD, TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC, NOCO_PROV, NOCO_APORTE, NOCO_PAGOOK, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, NOCO_GTOEMPR) VALUES (:idsaldo, :item, :conc_codprimadic, :emplnit, :primadic, '', 'N', 'S', 'N', 'N', 0, :anoact, 'N', 'N', 'N', 'S');
item = :item + 1;
end
if (vacac <> 0 AND vacac IS NOT NULL) then
begin
INSERT INTO NOMINA_CONCEPTOS (NOMI_ID, NOCO_ITEM, CONC_COD, TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC, NOCO_PROV, NOCO_APORTE, NOCO_PAGOOK, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, NOCO_GTOEMPR) VALUES (:idsaldo, :item, :conc_codvacaci, :emplnit, :vacac, '', 'N', 'S', 'N', 'N', 0, :anoact, 'N', 'N', 'N', 'S');
item = :item + 1;
end
    SUSPEND;
  END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER PROCEDURE NOVEDADESXPERIODO(
    ANO CHAR(4),
    PERIODO INTEGER,
    PERIODI INTEGER)
RETURNS (
    IDNONO INTEGER,
    NIT VARCHAR(20),
    NOMBRE VARCHAR(60),
    TIPONOVE VARCHAR(60),
    NUMPER INTEGER,
    DIA INTEGER,
    DURACION INTEGER,
    FECHANO DATE)
AS
DECLARE VARIABLE codnove CHAR(3);
DECLARE VARIABLE numperi INTEGER;
DECLARE VARIABLE numperif INTEGER;
BEGIN
    FOR SELECT NONO_ID, terc_nit, tnov_cod, nono_periodo, nono_diaini, nono_dura, nono_fecha
    FROM  nomina_novedades N WHERE
    nono_ppago = :PERIODI AND nono_periodo =: periodo AND Nono_ano =: ano
    INTO :idnono, :nit, :codnove, :numper, :dia, :duracion, :fechano
    DO
    BEGIN
    SELECT terc_nom FROM terceros WHERE terc_nit = :nit INTO nombre;
    SELECT tnov_nombre FROM tipos_novedad WHERE tnov_cod = :codnove INTO tiponove;
    SUSPEND;
    END
END
^

SET TERM ; ^

DROP TRIGGER CONSOLIDADO_NOMINA_BI;


SET TERM ^ ;

create trigger CONSOLIDADO_NOMINA_BI for CONSOLIDADO_NOMINA
active BEFORE INSERT position 0
AS
DECLARE VARIABLE ITEM INTEGER;
BEGIN
SELECT MAX(C.cono_item) FROM CONSOLIDADO_NOMINA C WHERE C.cono_id = NEW.cono_id INTO :item;
IF (ITEM IS NOT NULL) THEN
NEW.cono_item = :item + 1;
ELSE
NEW.cono_item = 1;
if (new.cono_abono is null) then
new.cono_abono = 0;
if (new.cono_valor is null) then
new.cono_valor = 0;
END
^

SET TERM ; ^

GRANT SELECT,UPDATE,REFERENCES ON CONSOLIDADO_NOMINA TO TRIGGER CONSOLIDADO_NOMINA_BI;

ALTER TABLE BANCOS ADD BANC_CODACH VARCHAR(7);

INSERT INTO CONFIGURACION (CONF_MODULO, CONF_CATEGORIA, CONF_PROPIEDAD, CONF_VALOR, CONF_POSIBLES, CONF_AYUDA) VALUES ('NOMINA', 'GENERAL', 'NUMERO DE CUENTA DEL BANCO', '12345678901', NULL, 'Numero de cuenta del banco para exportar archivo del banco');
INSERT INTO CONFIGURACION (CONF_MODULO, CONF_CATEGORIA, CONF_PROPIEDAD, CONF_VALOR, CONF_POSIBLES, CONF_AYUDA) VALUES ('NOMINA', 'GENERAL', 'PERIODICIDAD DE PAGO PARA VER NOVEDADES POR PERIODO', 'Q', 'M,Q,S', 'M:Mensual,Q:Quincenal,S:Semanal');
INSERT INTO CONFIGURACION (CONF_MODULO, CONF_CATEGORIA, CONF_PROPIEDAD, CONF_VALOR, CONF_POSIBLES, CONF_AYUDA) VALUES ('NOMINA', 'GENERAL', 'REDONDEO AL MULTIPLO DE DIEZ EN TOTALES', '0', '-2,-1,0,1,2', 'Indique 0: redondeo pesos, 1:redondeo a 10, 2: redondeo a 100, -1:Redondeo a decimal, -2:redondeo a centavo.');
INSERT INTO CONFIGURACION (CONF_MODULO, CONF_CATEGORIA, CONF_PROPIEDAD, CONF_VALOR, CONF_POSIBLES, CONF_AYUDA) VALUES ('NOMINA', 'GENERAL', 'TIPO CUENTA', 'D', 'D,S', 'D: Corriente, S: Ahorros');


UPDATE CONCEPTOS_NOMINA
SET CONC_NOMBRE = 'SUELDO',
    CONC_DEDUC = 'N',
    CONC_FECINI = '1-JAN-2008',
    CONC_FECFIN = '31-DEC-2008',
    CONC_PORC = 0,
    CONC_BASE = 0,
    CONC_ENTIDAD = NULL,
    CONC_MONTO = NULL,
    CONC_CTAGAST = '520506',
    CONC_DIAS = 'S',
    CONC_MODIFI = 'S',
    CONC_DIAPAGO = NULL,
    CONC_PROMEDIO = 'N',
    CONC_TODOSPER = 'S',
    CONC_PROV = 'N',
    CONC_PERACTUAL = 'N',
    CONC_APORTE = 'N',
    CONC_APLICAPROM = 'S',
    CONC_PERPROMEDIO = NULL,
    CONC_OTROCONC = 'N',
    CONC_CODOTROCONC = 0,
    CONC_SALARIO = 'S',
    CONC_CTACXP = '250505',
    CONC_NOMCORTO = 'Sueldo',
    CONC_PERIODOS = NULL,
    CONC_GTOEMPR = 'N'
WHERE (CONC_COD = 1);


UPDATE CONCEPTOS_NOMINA
SET CONC_NOMBRE = 'AUXILIO DE TRANSPORTE',
    CONC_DEDUC = 'N',
    CONC_FECINI = '1-JAN-2008',
    CONC_FECFIN = '31-DEC-2008',
    CONC_PORC = 0,
    CONC_BASE = 0,
    CONC_ENTIDAD = NULL,
    CONC_MONTO = 55000,
    CONC_CTAGAST = '520527',
    CONC_DIAS = 'S',
    CONC_MODIFI = 'S',
    CONC_DIAPAGO = NULL,
    CONC_PROMEDIO = 'N',
    CONC_TODOSPER = 'S',
    CONC_PROV = 'N',
    CONC_PERACTUAL = 'N',
    CONC_APORTE = 'N',
    CONC_APLICAPROM = 'N',
    CONC_PERPROMEDIO = NULL,
    CONC_OTROCONC = 'N',
    CONC_CODOTROCONC = 0,
    CONC_SALARIO = 'N',
    CONC_CTACXP = '250505',
    CONC_NOMCORTO = 'Aux. trans',
    CONC_PERIODOS = NULL,
    CONC_GTOEMPR = 'N'
WHERE (CONC_COD = 2);


UPDATE CONCEPTOS_NOMINA
SET CONC_NOMBRE = 'SALARIO INTEGRAL 70%',
    CONC_DEDUC = 'N',
    CONC_FECINI = '1-JAN-2008',
    CONC_FECFIN = '31-DEC-2008',
    CONC_PORC = 0,
    CONC_BASE = 0,
    CONC_ENTIDAD = NULL,
    CONC_MONTO = NULL,
    CONC_CTAGAST = '510503',
    CONC_DIAS = 'S',
    CONC_MODIFI = 'S',
    CONC_DIAPAGO = NULL,
    CONC_PROMEDIO = 'N',
    CONC_TODOSPER = 'S',
    CONC_PROV = 'N',
    CONC_PERACTUAL = 'N',
    CONC_APORTE = 'N',
    CONC_APLICAPROM = 'N',
    CONC_PERPROMEDIO = NULL,
    CONC_OTROCONC = 'N',
    CONC_CODOTROCONC = 0,
    CONC_SALARIO = 'N',
    CONC_CTACXP = '250505',
    CONC_NOMCORTO = 'Integral',
    CONC_PERIODOS = NULL,
    CONC_GTOEMPR = 'N'
WHERE (CONC_COD = 4);


UPDATE CONCEPTOS_NOMINA
SET CONC_NOMBRE = 'PAGO INTERESES DE CESANTIAS',
    CONC_DEDUC = 'N',
    CONC_FECINI = '1-JAN-2008',
    CONC_FECFIN = '31-JAN-2008',
    CONC_PORC = 8.3333,
    CONC_BASE = 0,
    CONC_ENTIDAD = NULL,
    CONC_MONTO = NULL,
    CONC_CTAGAST = '520506',
    CONC_DIAS = 'N',
    CONC_MODIFI = 'S',
    CONC_DIAPAGO = NULL,
    CONC_PROMEDIO = 'N',
    CONC_TODOSPER = 'N',
    CONC_PROV = 'N',
    CONC_PERACTUAL = 'N',
    CONC_APORTE = 'N',
    CONC_APLICAPROM = 'N',
    CONC_PERPROMEDIO = NULL,
    CONC_OTROCONC = 'S',
    CONC_CODOTROCONC = 6,
    CONC_SALARIO = 'N',
    CONC_CTACXP = '2515',
    CONC_NOMCORTO = 'Pago int.',
    CONC_PERIODOS = NULL,
    CONC_GTOEMPR = 'N'
WHERE (CONC_COD = 5);


UPDATE CONCEPTOS_NOMINA
SET CONC_NOMBRE = 'INDEMNIZACION',
    CONC_DEDUC = 'N',
    CONC_FECINI = '1-JAN-2008',
    CONC_FECFIN = '31-DEC-2008',
    CONC_PORC = 0,
    CONC_BASE = 0,
    CONC_ENTIDAD = NULL,
    CONC_MONTO = NULL,
    CONC_CTAGAST = '510560',
    CONC_DIAS = 'N',
    CONC_MODIFI = 'S',
    CONC_DIAPAGO = NULL,
    CONC_PROMEDIO = 'N',
    CONC_TODOSPER = 'N',
    CONC_PROV = 'N',
    CONC_PERACTUAL = 'N',
    CONC_APORTE = 'N',
    CONC_APLICAPROM = 'N',
    CONC_PERPROMEDIO = NULL,
    CONC_OTROCONC = 'N',
    CONC_CODOTROCONC = 0,
    CONC_SALARIO = 'N',
    CONC_CTACXP = '250505',
    CONC_NOMCORTO = 'Indemniza',
    CONC_PERIODOS = NULL,
    CONC_GTOEMPR = 'N'
WHERE (CONC_COD = 7);


UPDATE CONCEPTOS_NOMINA
SET CONC_NOMBRE = 'APORTE PENSIÓN VOLUNTARIA EMPLEADOR',
    CONC_DEDUC = 'N',
    CONC_FECINI = '1-JAN-2008',
    CONC_FECFIN = '31-DEC-2008',
    CONC_PORC = 0,
    CONC_BASE = 0,
    CONC_ENTIDAD = NULL,
    CONC_MONTO = NULL,
    CONC_CTAGAST = NULL,
    CONC_DIAS = 'N',
    CONC_MODIFI = 'S',
    CONC_DIAPAGO = NULL,
    CONC_PROMEDIO = 'N',
    CONC_TODOSPER = 'S',
    CONC_PROV = 'N',
    CONC_PERACTUAL = 'N',
    CONC_APORTE = 'S',
    CONC_APLICAPROM = 'N',
    CONC_PERPROMEDIO = NULL,
    CONC_OTROCONC = 'N',
    CONC_CODOTROCONC = 0,
    CONC_SALARIO = 'N',
    CONC_CTACXP = NULL,
    CONC_NOMCORTO = 'Afp vol empr.',
    CONC_PERIODOS = NULL,
    CONC_GTOEMPR = 'N'
WHERE (CONC_COD = 8);


UPDATE CONCEPTOS_NOMINA
SET CONC_NOMBRE = 'CUOTA MEDICINA PREPAGADA',
    CONC_DEDUC = 'S',
    CONC_FECINI = '1-JAN-2008',
    CONC_FECFIN = '31-DEC-2008',
    CONC_PORC = 0,
    CONC_BASE = 0,
    CONC_ENTIDAD = NULL,
    CONC_MONTO = NULL,
    CONC_CTAGAST = '250505',
    CONC_DIAS = 'N',
    CONC_MODIFI = 'S',
    CONC_DIAPAGO = NULL,
    CONC_PROMEDIO = 'N',
    CONC_TODOSPER = 'N',
    CONC_PROV = 'N',
    CONC_PERACTUAL = 'N',
    CONC_APORTE = 'N',
    CONC_APLICAPROM = 'N',
    CONC_PERPROMEDIO = NULL,
    CONC_OTROCONC = 'N',
    CONC_CODOTROCONC = 0,
    CONC_SALARIO = 'N',
    CONC_CTACXP = '510569',
    CONC_NOMCORTO = 'Med. prep',
    CONC_PERIODOS = NULL,
    CONC_GTOEMPR = 'N'
WHERE (CONC_COD = 9);


UPDATE CONCEPTOS_NOMINA
SET CONC_NOMBRE = 'BONIFICACIÓN',
    CONC_DEDUC = 'N',
    CONC_FECINI = '1-JAN-2008',
    CONC_FECFIN = '31-DEC-2008',
    CONC_PORC = 0,
    CONC_BASE = 0,
    CONC_ENTIDAD = NULL,
    CONC_MONTO = NULL,
    CONC_CTAGAST = NULL,
    CONC_DIAS = 'N',
    CONC_MODIFI = 'S',
    CONC_DIAPAGO = NULL,
    CONC_PROMEDIO = 'N',
    CONC_TODOSPER = 'N',
    CONC_PROV = 'N',
    CONC_PERACTUAL = 'N',
    CONC_APORTE = 'N',
    CONC_APLICAPROM = 'N',
    CONC_PERPROMEDIO = NULL,
    CONC_OTROCONC = 'N',
    CONC_CODOTROCONC = 0,
    CONC_SALARIO = 'N',
    CONC_CTACXP = NULL,
    CONC_NOMCORTO = 'Bonifi.',
    CONC_PERIODOS = NULL,
    CONC_GTOEMPR = 'N'
WHERE (CONC_COD = 10);


UPDATE CONCEPTOS_NOMINA
SET CONC_NOMBRE = 'RETROACTIVO',
    CONC_DEDUC = 'N',
    CONC_FECINI = '1-JAN-2008',
    CONC_FECFIN = '31-DEC-2008',
    CONC_PORC = 0,
    CONC_BASE = 0,
    CONC_ENTIDAD = NULL,
    CONC_MONTO = NULL,
    CONC_CTAGAST = NULL,
    CONC_DIAS = 'N',
    CONC_MODIFI = 'S',
    CONC_DIAPAGO = NULL,
    CONC_PROMEDIO = 'N',
    CONC_TODOSPER = 'N',
    CONC_PROV = 'N',
    CONC_PERACTUAL = 'N',
    CONC_APORTE = 'N',
    CONC_APLICAPROM = 'N',
    CONC_PERPROMEDIO = NULL,
    CONC_OTROCONC = 'N',
    CONC_CODOTROCONC = 0,
    CONC_SALARIO = 'N',
    CONC_CTACXP = NULL,
    CONC_NOMCORTO = 'Retroac.',
    CONC_PERIODOS = NULL,
    CONC_GTOEMPR = 'N'
WHERE (CONC_COD = 11);


UPDATE CONCEPTOS_NOMINA
SET CONC_NOMBRE = 'APORTE PENSIÓN VOLUNTARIA EMPLEADO',
    CONC_DEDUC = 'S',
    CONC_FECINI = '1-JAN-2008',
    CONC_FECFIN = '31-DEC-2008',
    CONC_PORC = 0,
    CONC_BASE = 0,
    CONC_ENTIDAD = NULL,
    CONC_MONTO = NULL,
    CONC_CTAGAST = '250505',
    CONC_DIAS = 'N',
    CONC_MODIFI = 'S',
    CONC_DIAPAGO = NULL,
    CONC_PROMEDIO = 'N',
    CONC_TODOSPER = 'S',
    CONC_PROV = 'N',
    CONC_PERACTUAL = 'N',
    CONC_APORTE = 'N',
    CONC_APLICAPROM = 'N',
    CONC_PERPROMEDIO = NULL,
    CONC_OTROCONC = 'N',
    CONC_CODOTROCONC = 0,
    CONC_SALARIO = 'N',
    CONC_CTACXP = '510570',
    CONC_NOMCORTO = 'AFP vol trab.',
    CONC_PERIODOS = NULL,
    CONC_GTOEMPR = 'N'
WHERE (CONC_COD = 12);


UPDATE CONCEPTOS_NOMINA
SET CONC_NOMBRE = 'AJUSTE PRIMA',
    CONC_DEDUC = 'N',
    CONC_FECINI = '1-JAN-2008',
    CONC_FECFIN = '31-DEC-2008',
    CONC_PORC = 0,
    CONC_BASE = 0,
    CONC_ENTIDAD = NULL,
    CONC_MONTO = NULL,
    CONC_CTAGAST = '261020',
    CONC_DIAS = 'N',
    CONC_MODIFI = 'S',
    CONC_DIAPAGO = NULL,
    CONC_PROMEDIO = 'S',
    CONC_TODOSPER = 'N',
    CONC_PROV = 'N',
    CONC_PERACTUAL = 'N',
    CONC_APORTE = 'N',
    CONC_APLICAPROM = 'N',
    CONC_PERPROMEDIO = NULL,
    CONC_OTROCONC = 'N',
    CONC_CODOTROCONC = 0,
    CONC_SALARIO = 'N',
    CONC_CTACXP = '261020',
    CONC_NOMCORTO = 'Ajus. prima',
    CONC_PERIODOS = NULL,
    CONC_GTOEMPR = 'N'
WHERE (CONC_COD = 13);


UPDATE CONCEPTOS_NOMINA
SET CONC_NOMBRE = 'PAGO PRIMA JUNIO',
    CONC_DEDUC = 'N',
    CONC_FECINI = '1-JAN-2008',
    CONC_FECFIN = '1-JAN-2008',
    CONC_PORC = NULL,
    CONC_BASE = 0,
    CONC_ENTIDAD = NULL,
    CONC_MONTO = NULL,
    CONC_CTAGAST = '510536',
    CONC_DIAS = 'N',
    CONC_MODIFI = 'S',
    CONC_DIAPAGO = 30,
    CONC_PROMEDIO = 'S',
    CONC_TODOSPER = 'N',
    CONC_PROV = 'N',
    CONC_PERACTUAL = 'S',
    CONC_APORTE = 'N',
    CONC_APLICAPROM = 'N',
    CONC_PERPROMEDIO = NULL,
    CONC_OTROCONC = 'N',
    CONC_CODOTROCONC = 0,
    CONC_SALARIO = 'N',
    CONC_CTACXP = '261020',
    CONC_NOMCORTO = 'Pgo prima jun',
    CONC_PERIODOS = NULL,
    CONC_GTOEMPR = 'N'
WHERE (CONC_COD = 17);


UPDATE CONCEPTOS_NOMINA
SET CONC_NOMBRE = 'PAGO PRIMA DICIEMBRE',
    CONC_DEDUC = 'N',
    CONC_FECINI = '1-JAN-2008',
    CONC_FECFIN = '1-JAN-2008',
    CONC_PORC = NULL,
    CONC_BASE = 0,
    CONC_ENTIDAD = NULL,
    CONC_MONTO = NULL,
    CONC_CTAGAST = '510536',
    CONC_DIAS = 'N',
    CONC_MODIFI = 'S',
    CONC_DIAPAGO = 20,
    CONC_PROMEDIO = 'S',
    CONC_TODOSPER = 'N',
    CONC_PROV = 'N',
    CONC_PERACTUAL = 'S',
    CONC_APORTE = 'N',
    CONC_APLICAPROM = 'N',
    CONC_PERPROMEDIO = NULL,
    CONC_OTROCONC = 'N',
    CONC_CODOTROCONC = 0,
    CONC_SALARIO = 'N',
    CONC_CTACXP = '261020',
    CONC_NOMCORTO = 'Pgo prim dic',
    CONC_PERIODOS = NULL,
    CONC_GTOEMPR = 'N'
WHERE (CONC_COD = 18);


UPDATE CONCEPTOS_NOMINA
SET CONC_NOMBRE = 'CUOTA MEDICINA PREPAGADA',
    CONC_DEDUC = 'N',
    CONC_FECINI = '1-JAN-2008',
    CONC_FECFIN = '31-DEC-2008',
    CONC_PORC = 0,
    CONC_BASE = 0,
    CONC_ENTIDAD = NULL,
    CONC_MONTO = NULL,
    CONC_CTAGAST = '250505',
    CONC_DIAS = 'N',
    CONC_MODIFI = 'S',
    CONC_DIAPAGO = NULL,
    CONC_PROMEDIO = 'N',
    CONC_TODOSPER = 'N',
    CONC_PROV = 'N',
    CONC_PERACTUAL = 'N',
    CONC_APORTE = 'S',
    CONC_APLICAPROM = 'N',
    CONC_PERPROMEDIO = NULL,
    CONC_OTROCONC = 'N',
    CONC_CODOTROCONC = 0,
    CONC_SALARIO = 'N',
    CONC_CTACXP = '510569',
    CONC_NOMCORTO = 'Med prep.',
    CONC_PERIODOS = NULL,
    CONC_GTOEMPR = 'N'
WHERE (CONC_COD = 24);


UPDATE CONCEPTOS_NOMINA
SET CONC_NOMBRE = 'HORAS EXTRA',
    CONC_DEDUC = 'N',
    CONC_FECINI = '1-JAN-2008',
    CONC_FECFIN = '31-DEC-2007',
    CONC_PORC = 0,
    CONC_BASE = 0,
    CONC_ENTIDAD = NULL,
    CONC_MONTO = 0,
    CONC_CTAGAST = '520515',
    CONC_DIAS = 'N',
    CONC_MODIFI = 'S',
    CONC_DIAPAGO = NULL,
    CONC_PROMEDIO = 'N',
    CONC_TODOSPER = 'S',
    CONC_PROV = 'N',
    CONC_PERACTUAL = 'S',
    CONC_APORTE = 'N',
    CONC_APLICAPROM = 'S',
    CONC_PERPROMEDIO = NULL,
    CONC_OTROCONC = 'N',
    CONC_CODOTROCONC = 0,
    CONC_SALARIO = 'S',
    CONC_CTACXP = '250505',
    CONC_NOMCORTO = 'Horas ext.',
    CONC_PERIODOS = NULL,
    CONC_GTOEMPR = 'H'
WHERE (CONC_COD = 900);


UPDATE CONCEPTOS_NOMINA
SET CONC_NOMBRE = 'AFP EMPLEADO',
    CONC_DEDUC = 'S',
    CONC_FECINI = '1-JAN-2008',
    CONC_FECFIN = '31-DEC-2008',
    CONC_PORC = NULL,
    CONC_BASE = 0,
    CONC_ENTIDAD = NULL,
    CONC_MONTO = NULL,
    CONC_CTAGAST = '250505',
    CONC_DIAS = 'N',
    CONC_MODIFI = 'S',
    CONC_DIAPAGO = 1,
    CONC_PROMEDIO = 'N',
    CONC_TODOSPER = 'S',
    CONC_PROV = 'N',
    CONC_PERACTUAL = 'N',
    CONC_APORTE = 'S',
    CONC_APLICAPROM = 'N',
    CONC_PERPROMEDIO = NULL,
    CONC_OTROCONC = 'N',
    CONC_CODOTROCONC = 0,
    CONC_SALARIO = 'N',
    CONC_CTACXP = '510570',
    CONC_NOMCORTO = 'AFP trab.',
    CONC_PERIODOS = NULL,
    CONC_GTOEMPR = 'N'
WHERE (CONC_COD = 904);


UPDATE CONCEPTOS_NOMINA
SET CONC_NOMBRE = 'AFP EMPLEADOR ADMIN',
    CONC_DEDUC = 'N',
    CONC_FECINI = '1-JAN-2008',
    CONC_FECFIN = '31-DEC-2008',
    CONC_PORC = NULL,
    CONC_BASE = 0,
    CONC_ENTIDAD = NULL,
    CONC_MONTO = NULL,
    CONC_CTAGAST = '510570',
    CONC_DIAS = 'N',
    CONC_MODIFI = 'S',
    CONC_DIAPAGO = NULL,
    CONC_PROMEDIO = 'N',
    CONC_TODOSPER = 'S',
    CONC_PROV = 'N',
    CONC_PERACTUAL = 'N',
    CONC_APORTE = 'S',
    CONC_APLICAPROM = 'N',
    CONC_PERPROMEDIO = NULL,
    CONC_OTROCONC = 'N',
    CONC_CODOTROCONC = 0,
    CONC_SALARIO = 'N',
    CONC_CTACXP = '238030',
    CONC_NOMCORTO = 'AFP empresa',
    CONC_PERIODOS = NULL,
    CONC_GTOEMPR = 'S'
WHERE (CONC_COD = 905);


UPDATE CONCEPTOS_NOMINA
SET CONC_NOMBRE = 'AFP EMPLEADOR VENTAS',
    CONC_DEDUC = 'N',
    CONC_FECINI = '1-JAN-2008',
    CONC_FECFIN = '31-DEC-2008',
    CONC_PORC = NULL,
    CONC_BASE = 0,
    CONC_ENTIDAD = NULL,
    CONC_MONTO = NULL,
    CONC_CTAGAST = '520570',
    CONC_DIAS = 'N',
    CONC_MODIFI = 'S',
    CONC_DIAPAGO = NULL,
    CONC_PROMEDIO = 'N',
    CONC_TODOSPER = 'S',
    CONC_PROV = 'N',
    CONC_PERACTUAL = 'N',
    CONC_APORTE = 'S',
    CONC_APLICAPROM = 'N',
    CONC_PERPROMEDIO = NULL,
    CONC_OTROCONC = 'N',
    CONC_CODOTROCONC = 0,
    CONC_SALARIO = 'N',
    CONC_CTACXP = '238030',
    CONC_NOMCORTO = 'AFP empresa.',
    CONC_PERIODOS = NULL,
    CONC_GTOEMPR = 'S'
WHERE (CONC_COD = 906);


UPDATE CONCEPTOS_NOMINA
SET CONC_NOMBRE = 'EPS TRABAJADOR',
    CONC_DEDUC = 'S',
    CONC_FECINI = '1-JAN-2008',
    CONC_FECFIN = '31-DEC-2008',
    CONC_PORC = NULL,
    CONC_BASE = 0,
    CONC_ENTIDAD = NULL,
    CONC_MONTO = NULL,
    CONC_CTAGAST = '250505',
    CONC_DIAS = 'N',
    CONC_MODIFI = 'S',
    CONC_DIAPAGO = 1,
    CONC_PROMEDIO = 'N',
    CONC_TODOSPER = 'S',
    CONC_PROV = 'N',
    CONC_PERACTUAL = 'N',
    CONC_APORTE = 'S',
    CONC_APLICAPROM = 'N',
    CONC_PERPROMEDIO = NULL,
    CONC_OTROCONC = 'N',
    CONC_CODOTROCONC = 0,
    CONC_SALARIO = 'N',
    CONC_CTACXP = '237005',
    CONC_NOMCORTO = 'EPS trab.',
    CONC_PERIODOS = NULL,
    CONC_GTOEMPR = 'N'
WHERE (CONC_COD = 907);


UPDATE CONCEPTOS_NOMINA
SET CONC_NOMBRE = 'ARP ADMINISTRATIVO',
    CONC_DEDUC = 'N',
    CONC_FECINI = '1-JAN-2008',
    CONC_FECFIN = '31-DEC-2008',
    CONC_PORC = 0.25,
    CONC_BASE = 0,
    CONC_ENTIDAD = NULL,
    CONC_MONTO = NULL,
    CONC_CTAGAST = '510568',
    CONC_DIAS = 'N',
    CONC_MODIFI = 'S',
    CONC_DIAPAGO = NULL,
    CONC_PROMEDIO = 'N',
    CONC_TODOSPER = 'S',
    CONC_PROV = 'N',
    CONC_PERACTUAL = 'N',
    CONC_APORTE = 'S',
    CONC_APLICAPROM = 'N',
    CONC_PERPROMEDIO = NULL,
    CONC_OTROCONC = 'N',
    CONC_CODOTROCONC = 0,
    CONC_SALARIO = 'N',
    CONC_CTACXP = '237006',
    CONC_NOMCORTO = 'ARP',
    CONC_PERIODOS = NULL,
    CONC_GTOEMPR = 'S'
WHERE (CONC_COD = 908);


UPDATE CONCEPTOS_NOMINA
SET CONC_NOMBRE = 'ARP VENTAS',
    CONC_DEDUC = 'N',
    CONC_FECINI = '1-JAN-2008',
    CONC_FECFIN = '31-DEC-2008',
    CONC_PORC = 0,
    CONC_BASE = 0,
    CONC_ENTIDAD = NULL,
    CONC_MONTO = NULL,
    CONC_CTAGAST = '520568',
    CONC_DIAS = 'N',
    CONC_MODIFI = 'S',
    CONC_DIAPAGO = NULL,
    CONC_PROMEDIO = 'N',
    CONC_TODOSPER = 'S',
    CONC_PROV = 'N',
    CONC_PERACTUAL = 'N',
    CONC_APORTE = 'S',
    CONC_APLICAPROM = 'N',
    CONC_PERPROMEDIO = NULL,
    CONC_OTROCONC = 'N',
    CONC_CODOTROCONC = 0,
    CONC_SALARIO = 'N',
    CONC_CTACXP = '237006',
    CONC_NOMCORTO = 'ARP.',
    CONC_PERIODOS = NULL,
    CONC_GTOEMPR = 'S'
WHERE (CONC_COD = 909);


UPDATE CONCEPTOS_NOMINA
SET CONC_NOMBRE = 'CCF ADMINISTRATIVO',
    CONC_DEDUC = 'N',
    CONC_FECINI = '1-JAN-2008',
    CONC_FECFIN = '31-DEC-2008',
    CONC_PORC = NULL,
    CONC_BASE = 0,
    CONC_ENTIDAD = NULL,
    CONC_MONTO = NULL,
    CONC_CTAGAST = '510572',
    CONC_DIAS = 'N',
    CONC_MODIFI = 'S',
    CONC_DIAPAGO = NULL,
    CONC_PROMEDIO = 'N',
    CONC_TODOSPER = 'S',
    CONC_PROV = 'N',
    CONC_PERACTUAL = 'N',
    CONC_APORTE = 'S',
    CONC_APLICAPROM = 'N',
    CONC_PERPROMEDIO = NULL,
    CONC_OTROCONC = 'N',
    CONC_CODOTROCONC = 0,
    CONC_SALARIO = 'N',
    CONC_CTACXP = '237010',
    CONC_NOMCORTO = 'CCF',
    CONC_PERIODOS = NULL,
    CONC_GTOEMPR = 'S'
WHERE (CONC_COD = 910);


UPDATE CONCEPTOS_NOMINA
SET CONC_NOMBRE = 'CCF VENTAS',
    CONC_DEDUC = 'N',
    CONC_FECINI = '1-JAN-2008',
    CONC_FECFIN = '31-DEC-2008',
    CONC_PORC = NULL,
    CONC_BASE = 0,
    CONC_ENTIDAD = NULL,
    CONC_MONTO = NULL,
    CONC_CTAGAST = '520572',
    CONC_DIAS = 'N',
    CONC_MODIFI = 'S',
    CONC_DIAPAGO = NULL,
    CONC_PROMEDIO = 'N',
    CONC_TODOSPER = 'S',
    CONC_PROV = 'N',
    CONC_PERACTUAL = 'N',
    CONC_APORTE = 'S',
    CONC_APLICAPROM = 'N',
    CONC_PERPROMEDIO = NULL,
    CONC_OTROCONC = 'N',
    CONC_CODOTROCONC = 0,
    CONC_SALARIO = 'N',
    CONC_CTACXP = '237010',
    CONC_NOMCORTO = 'CCF',
    CONC_PERIODOS = NULL,
    CONC_GTOEMPR = 'S'
WHERE (CONC_COD = 911);


UPDATE CONCEPTOS_NOMINA
SET CONC_NOMBRE = 'CESANTIAS ADMIN',
    CONC_DEDUC = 'N',
    CONC_FECINI = '1-JAN-2008',
    CONC_FECFIN = '31-DEC-2008',
    CONC_PORC = NULL,
    CONC_BASE = 0,
    CONC_ENTIDAD = NULL,
    CONC_MONTO = NULL,
    CONC_CTAGAST = '510530',
    CONC_DIAS = 'N',
    CONC_MODIFI = 'S',
    CONC_DIAPAGO = NULL,
    CONC_PROMEDIO = 'N',
    CONC_TODOSPER = 'S',
    CONC_PROV = 'S',
    CONC_PERACTUAL = 'N',
    CONC_APORTE = 'S',
    CONC_APLICAPROM = 'N',
    CONC_PERPROMEDIO = NULL,
    CONC_OTROCONC = 'N',
    CONC_CODOTROCONC = 0,
    CONC_SALARIO = 'N',
    CONC_CTACXP = '261005',
    CONC_NOMCORTO = 'Cesantias.',
    CONC_PERIODOS = NULL,
    CONC_GTOEMPR = 'S'
WHERE (CONC_COD = 912);


UPDATE CONCEPTOS_NOMINA
SET CONC_NOMBRE = 'CESANTIAS VENTAS',
    CONC_DEDUC = 'N',
    CONC_FECINI = '1-JAN-2008',
    CONC_FECFIN = '31-DEC-2008',
    CONC_PORC = NULL,
    CONC_BASE = 0,
    CONC_ENTIDAD = NULL,
    CONC_MONTO = NULL,
    CONC_CTAGAST = '520530',
    CONC_DIAS = 'N',
    CONC_MODIFI = 'S',
    CONC_DIAPAGO = NULL,
    CONC_PROMEDIO = 'N',
    CONC_TODOSPER = 'S',
    CONC_PROV = 'S',
    CONC_PERACTUAL = 'N',
    CONC_APORTE = 'S',
    CONC_APLICAPROM = 'N',
    CONC_PERPROMEDIO = NULL,
    CONC_OTROCONC = 'N',
    CONC_CODOTROCONC = 0,
    CONC_SALARIO = 'N',
    CONC_CTACXP = '261005',
    CONC_NOMCORTO = 'Cesantias',
    CONC_PERIODOS = NULL,
    CONC_GTOEMPR = 'S'
WHERE (CONC_COD = 913);


UPDATE CONCEPTOS_NOMINA
SET CONC_NOMBRE = 'EPS EMPLEADOR ADMIN',
    CONC_DEDUC = 'N',
    CONC_FECINI = '1-JAN-2008',
    CONC_FECFIN = '31-DEC-2008',
    CONC_PORC = NULL,
    CONC_BASE = 0,
    CONC_ENTIDAD = NULL,
    CONC_MONTO = NULL,
    CONC_CTAGAST = '510569',
    CONC_DIAS = 'N',
    CONC_MODIFI = 'S',
    CONC_DIAPAGO = NULL,
    CONC_PROMEDIO = 'N',
    CONC_TODOSPER = 'S',
    CONC_PROV = 'N',
    CONC_PERACTUAL = 'N',
    CONC_APORTE = 'S',
    CONC_APLICAPROM = 'N',
    CONC_PERPROMEDIO = NULL,
    CONC_OTROCONC = 'N',
    CONC_CODOTROCONC = 0,
    CONC_SALARIO = 'N',
    CONC_CTACXP = '238030',
    CONC_NOMCORTO = 'EPS empresa',
    CONC_PERIODOS = NULL,
    CONC_GTOEMPR = 'S'
WHERE (CONC_COD = 914);


UPDATE CONCEPTOS_NOMINA
SET CONC_NOMBRE = 'EPS EMPLEADOR VENTAS',
    CONC_DEDUC = 'N',
    CONC_FECINI = '1-JAN-2008',
    CONC_FECFIN = '31-DEC-2008',
    CONC_PORC = NULL,
    CONC_BASE = 0,
    CONC_ENTIDAD = NULL,
    CONC_MONTO = NULL,
    CONC_CTAGAST = '520569',
    CONC_DIAS = 'N',
    CONC_MODIFI = 'S',
    CONC_DIAPAGO = NULL,
    CONC_PROMEDIO = 'N',
    CONC_TODOSPER = 'S',
    CONC_PROV = 'N',
    CONC_PERACTUAL = 'N',
    CONC_APORTE = 'S',
    CONC_APLICAPROM = 'N',
    CONC_PERPROMEDIO = NULL,
    CONC_OTROCONC = 'N',
    CONC_CODOTROCONC = 0,
    CONC_SALARIO = 'N',
    CONC_CTACXP = '238030',
    CONC_NOMCORTO = 'EPS empresa.',
    CONC_PERIODOS = NULL,
    CONC_GTOEMPR = 'S'
WHERE (CONC_COD = 915);


UPDATE CONCEPTOS_NOMINA
SET CONC_NOMBRE = 'ICBF ADMINISTRATIVO',
    CONC_DEDUC = 'N',
    CONC_FECINI = '1-JAN-2008',
    CONC_FECFIN = '31-DEC-2008',
    CONC_PORC = NULL,
    CONC_BASE = 0,
    CONC_ENTIDAD = NULL,
    CONC_MONTO = NULL,
    CONC_CTAGAST = '510575',
    CONC_DIAS = 'N',
    CONC_MODIFI = 'S',
    CONC_DIAPAGO = NULL,
    CONC_PROMEDIO = 'N',
    CONC_TODOSPER = 'S',
    CONC_PROV = 'N',
    CONC_PERACTUAL = 'N',
    CONC_APORTE = 'S',
    CONC_APLICAPROM = 'N',
    CONC_PERPROMEDIO = NULL,
    CONC_OTROCONC = 'N',
    CONC_CODOTROCONC = 0,
    CONC_SALARIO = 'N',
    CONC_CTACXP = '237010',
    CONC_NOMCORTO = 'ICBF',
    CONC_PERIODOS = NULL,
    CONC_GTOEMPR = 'S'
WHERE (CONC_COD = 916);


UPDATE CONCEPTOS_NOMINA
SET CONC_NOMBRE = 'ICBF VENTAS',
    CONC_DEDUC = 'N',
    CONC_FECINI = '1-JAN-2008',
    CONC_FECFIN = '31-DEC-2008',
    CONC_PORC = NULL,
    CONC_BASE = 0,
    CONC_ENTIDAD = NULL,
    CONC_MONTO = NULL,
    CONC_CTAGAST = '520575',
    CONC_DIAS = 'N',
    CONC_MODIFI = 'S',
    CONC_DIAPAGO = NULL,
    CONC_PROMEDIO = 'N',
    CONC_TODOSPER = 'S',
    CONC_PROV = 'N',
    CONC_PERACTUAL = 'N',
    CONC_APORTE = 'S',
    CONC_APLICAPROM = 'N',
    CONC_PERPROMEDIO = NULL,
    CONC_OTROCONC = 'N',
    CONC_CODOTROCONC = 0,
    CONC_SALARIO = 'N',
    CONC_CTACXP = '237010',
    CONC_NOMCORTO = 'ICBF.',
    CONC_PERIODOS = NULL,
    CONC_GTOEMPR = 'S'
WHERE (CONC_COD = 917);


UPDATE CONCEPTOS_NOMINA
SET CONC_NOMBRE = 'SENA ADMINISTRATIVO',
    CONC_DEDUC = 'N',
    CONC_FECINI = '1-JAN-2008',
    CONC_FECFIN = '31-DEC-2008',
    CONC_PORC = NULL,
    CONC_BASE = 0,
    CONC_ENTIDAD = NULL,
    CONC_MONTO = NULL,
    CONC_CTAGAST = '510578',
    CONC_DIAS = 'N',
    CONC_MODIFI = 'S',
    CONC_DIAPAGO = NULL,
    CONC_PROMEDIO = 'N',
    CONC_TODOSPER = 'S',
    CONC_PROV = 'N',
    CONC_PERACTUAL = 'N',
    CONC_APORTE = 'S',
    CONC_APLICAPROM = 'N',
    CONC_PERPROMEDIO = NULL,
    CONC_OTROCONC = 'N',
    CONC_CODOTROCONC = 0,
    CONC_SALARIO = 'N',
    CONC_CTACXP = '237010',
    CONC_NOMCORTO = 'Sena.',
    CONC_PERIODOS = NULL,
    CONC_GTOEMPR = 'S'
WHERE (CONC_COD = 918);


UPDATE CONCEPTOS_NOMINA
SET CONC_NOMBRE = 'SENA VENTAS',
    CONC_DEDUC = 'N',
    CONC_FECINI = '1-JAN-2008',
    CONC_FECFIN = '31-DEC-2008',
    CONC_PORC = NULL,
    CONC_BASE = 0,
    CONC_ENTIDAD = NULL,
    CONC_MONTO = NULL,
    CONC_CTAGAST = '520578',
    CONC_DIAS = 'N',
    CONC_MODIFI = 'S',
    CONC_DIAPAGO = NULL,
    CONC_PROMEDIO = 'N',
    CONC_TODOSPER = 'S',
    CONC_PROV = 'N',
    CONC_PERACTUAL = 'N',
    CONC_APORTE = 'S',
    CONC_APLICAPROM = 'N',
    CONC_PERPROMEDIO = NULL,
    CONC_OTROCONC = 'N',
    CONC_CODOTROCONC = 0,
    CONC_SALARIO = 'N',
    CONC_CTACXP = '237010',
    CONC_NOMCORTO = 'Sena',
    CONC_PERIODOS = NULL,
    CONC_GTOEMPR = 'S'
WHERE (CONC_COD = 919);


UPDATE CONCEPTOS_NOMINA
SET CONC_NOMBRE = 'COMISIONES',
    CONC_DEDUC = 'N',
    CONC_FECINI = '1-JAN-2008',
    CONC_FECFIN = '31-DEC-2008',
    CONC_PORC = 0,
    CONC_BASE = 0,
    CONC_ENTIDAD = NULL,
    CONC_MONTO = 0,
    CONC_CTAGAST = '520518',
    CONC_DIAS = 'N',
    CONC_MODIFI = 'S',
    CONC_DIAPAGO = NULL,
    CONC_PROMEDIO = 'N',
    CONC_TODOSPER = 'N',
    CONC_PROV = 'N',
    CONC_PERACTUAL = 'N',
    CONC_APORTE = 'N',
    CONC_APLICAPROM = 'S',
    CONC_PERPROMEDIO = NULL,
    CONC_OTROCONC = 'N',
    CONC_CODOTROCONC = 0,
    CONC_SALARIO = 'S',
    CONC_CTACXP = '250505',
    CONC_NOMCORTO = 'Comision',
    CONC_PERIODOS = NULL,
    CONC_GTOEMPR = 'N'
WHERE (CONC_COD = 920);


UPDATE CONCEPTOS_NOMINA
SET CONC_NOMBRE = 'RETENCION EN LA FUENTE',
    CONC_DEDUC = 'S',
    CONC_FECINI = '1-JAN-2008',
    CONC_FECFIN = '31-DEC-2008',
    CONC_PORC = 1,
    CONC_BASE = 0,
    CONC_ENTIDAD = NULL,
    CONC_MONTO = NULL,
    CONC_CTAGAST = NULL,
    CONC_DIAS = 'N',
    CONC_MODIFI = 'S',
    CONC_DIAPAGO = NULL,
    CONC_PROMEDIO = 'N',
    CONC_TODOSPER = 'S',
    CONC_PROV = 'N',
    CONC_PERACTUAL = 'N',
    CONC_APORTE = 'N',
    CONC_APLICAPROM = 'N',
    CONC_PERPROMEDIO = NULL,
    CONC_OTROCONC = 'N',
    CONC_CODOTROCONC = 0,
    CONC_SALARIO = 'N',
    CONC_CTACXP = NULL,
    CONC_NOMCORTO = 'Retencion',
    CONC_PERIODOS = NULL,
    CONC_GTOEMPR = 'N'
WHERE (CONC_COD = 921);


UPDATE CONCEPTOS_NOMINA
SET CONC_NOMBRE = 'PRESTAMOS',
    CONC_DEDUC = 'S',
    CONC_FECINI = '1-JAN-2008',
    CONC_FECFIN = '1-JAN-2008',
    CONC_PORC = 0,
    CONC_BASE = 0,
    CONC_ENTIDAD = NULL,
    CONC_MONTO = 0,
    CONC_CTAGAST = NULL,
    CONC_DIAS = 'N',
    CONC_MODIFI = 'S',
    CONC_DIAPAGO = NULL,
    CONC_PROMEDIO = 'N',
    CONC_TODOSPER = 'S',
    CONC_PROV = 'N',
    CONC_PERACTUAL = 'N',
    CONC_APORTE = 'N',
    CONC_APLICAPROM = 'N',
    CONC_PERPROMEDIO = NULL,
    CONC_OTROCONC = 'N',
    CONC_CODOTROCONC = NULL,
    CONC_SALARIO = 'N',
    CONC_CTACXP = NULL,
    CONC_NOMCORTO = 'Prestamo',
    CONC_PERIODOS = NULL,
    CONC_GTOEMPR = 'N'
WHERE (CONC_COD = 922);


UPDATE CONCEPTOS_NOMINA
SET CONC_NOMBRE = 'INT. DE CESANTIAS ADMIN',
    CONC_DEDUC = 'N',
    CONC_FECINI = '1-JAN-2008',
    CONC_FECFIN = '31-JAN-2008',
    CONC_PORC = 0.0833,
    CONC_BASE = 0,
    CONC_ENTIDAD = NULL,
    CONC_MONTO = NULL,
    CONC_CTAGAST = '510533',
    CONC_DIAS = 'N',
    CONC_MODIFI = 'S',
    CONC_DIAPAGO = NULL,
    CONC_PROMEDIO = 'N',
    CONC_TODOSPER = 'S',
    CONC_PROV = 'S',
    CONC_PERACTUAL = 'N',
    CONC_APORTE = 'N',
    CONC_APLICAPROM = 'N',
    CONC_PERPROMEDIO = NULL,
    CONC_OTROCONC = 'N',
    CONC_CODOTROCONC = 0,
    CONC_SALARIO = 'N',
    CONC_CTACXP = '261005',
    CONC_NOMCORTO = 'Int. cesan',
    CONC_PERIODOS = NULL,
    CONC_GTOEMPR = 'N'
WHERE (CONC_COD = 923);


UPDATE CONCEPTOS_NOMINA
SET CONC_NOMBRE = 'INT. DE CESANTIAS VENTAS',
    CONC_DEDUC = 'N',
    CONC_FECINI = '1-JAN-2008',
    CONC_FECFIN = '31-JAN-2008',
    CONC_PORC = 0.0833,
    CONC_BASE = 0,
    CONC_ENTIDAD = NULL,
    CONC_MONTO = NULL,
    CONC_CTAGAST = '520533',
    CONC_DIAS = 'N',
    CONC_MODIFI = 'S',
    CONC_DIAPAGO = NULL,
    CONC_PROMEDIO = 'N',
    CONC_TODOSPER = 'S',
    CONC_PROV = 'S',
    CONC_PERACTUAL = 'N',
    CONC_APORTE = 'N',
    CONC_APLICAPROM = 'N',
    CONC_PERPROMEDIO = NULL,
    CONC_OTROCONC = 'N',
    CONC_CODOTROCONC = 0,
    CONC_SALARIO = 'N',
    CONC_CTACXP = '261005',
    CONC_NOMCORTO = 'Int. cesan.',
    CONC_PERIODOS = NULL,
    CONC_GTOEMPR = 'N'
WHERE (CONC_COD = 924);


UPDATE CONCEPTOS_NOMINA
SET CONC_NOMBRE = 'PROV. PRIMA JUNIO ADMIN',
    CONC_DEDUC = 'N',
    CONC_FECINI = '1-JAN-2008',
    CONC_FECFIN = '30-JUN-2008',
    CONC_PORC = 8.3333,
    CONC_BASE = 0,
    CONC_ENTIDAD = NULL,
    CONC_MONTO = NULL,
    CONC_CTAGAST = '510536',
    CONC_DIAS = 'N',
    CONC_MODIFI = 'S',
    CONC_DIAPAGO = 30,
    CONC_PROMEDIO = 'N',
    CONC_TODOSPER = 'N',
    CONC_PROV = 'S',
    CONC_PERACTUAL = 'S',
    CONC_APORTE = 'N',
    CONC_APLICAPROM = 'N',
    CONC_PERPROMEDIO = NULL,
    CONC_OTROCONC = 'N',
    CONC_CODOTROCONC = 0,
    CONC_SALARIO = 'N',
    CONC_CTACXP = '261020',
    CONC_NOMCORTO = 'Prima jun.',
    CONC_PERIODOS = NULL,
    CONC_GTOEMPR = 'N'
WHERE (CONC_COD = 925);


UPDATE CONCEPTOS_NOMINA
SET CONC_NOMBRE = 'PROV. PRIMA  DICIEMBRE ADMIN',
    CONC_DEDUC = 'N',
    CONC_FECINI = '1-JUL-2008',
    CONC_FECFIN = '31-DEC-2008',
    CONC_PORC = 8.3333,
    CONC_BASE = 0,
    CONC_ENTIDAD = NULL,
    CONC_MONTO = NULL,
    CONC_CTAGAST = '510536',
    CONC_DIAS = 'N',
    CONC_MODIFI = 'S',
    CONC_DIAPAGO = 20,
    CONC_PROMEDIO = 'N',
    CONC_TODOSPER = 'N',
    CONC_PROV = 'S',
    CONC_PERACTUAL = 'S',
    CONC_APORTE = 'N',
    CONC_APLICAPROM = 'N',
    CONC_PERPROMEDIO = NULL,
    CONC_OTROCONC = 'N',
    CONC_CODOTROCONC = 0,
    CONC_SALARIO = 'N',
    CONC_CTACXP = '261020',
    CONC_NOMCORTO = 'Prima dic',
    CONC_PERIODOS = NULL,
    CONC_GTOEMPR = 'N'
WHERE (CONC_COD = 926);


UPDATE CONCEPTOS_NOMINA
SET CONC_NOMBRE = 'PROV. PRIMA JUNIO VENTAS',
    CONC_DEDUC = 'N',
    CONC_FECINI = '1-JAN-2008',
    CONC_FECFIN = '30-JUN-2008',
    CONC_PORC = 8.3333,
    CONC_BASE = 0,
    CONC_ENTIDAD = NULL,
    CONC_MONTO = NULL,
    CONC_CTAGAST = '520536',
    CONC_DIAS = 'N',
    CONC_MODIFI = 'S',
    CONC_DIAPAGO = 30,
    CONC_PROMEDIO = 'N',
    CONC_TODOSPER = 'N',
    CONC_PROV = 'S',
    CONC_PERACTUAL = 'S',
    CONC_APORTE = 'N',
    CONC_APLICAPROM = 'N',
    CONC_PERPROMEDIO = NULL,
    CONC_OTROCONC = 'N',
    CONC_CODOTROCONC = 0,
    CONC_SALARIO = 'N',
    CONC_CTACXP = '261020',
    CONC_NOMCORTO = 'Prima jun..',
    CONC_PERIODOS = NULL,
    CONC_GTOEMPR = 'N'
WHERE (CONC_COD = 927);


UPDATE CONCEPTOS_NOMINA
SET CONC_NOMBRE = 'PROV. PRIMA  DICIEMBRE VENTAS',
    CONC_DEDUC = 'N',
    CONC_FECINI = '1-JUL-2008',
    CONC_FECFIN = '31-DEC-2008',
    CONC_PORC = 8.3333,
    CONC_BASE = 0,
    CONC_ENTIDAD = NULL,
    CONC_MONTO = NULL,
    CONC_CTAGAST = '520536',
    CONC_DIAS = 'N',
    CONC_MODIFI = 'S',
    CONC_DIAPAGO = 20,
    CONC_PROMEDIO = 'N',
    CONC_TODOSPER = 'N',
    CONC_PROV = 'S',
    CONC_PERACTUAL = 'S',
    CONC_APORTE = 'N',
    CONC_APLICAPROM = 'N',
    CONC_PERPROMEDIO = NULL,
    CONC_OTROCONC = 'N',
    CONC_CODOTROCONC = 0,
    CONC_SALARIO = 'N',
    CONC_CTACXP = '261020',
    CONC_NOMCORTO = 'Prim dic.',
    CONC_PERIODOS = NULL,
    CONC_GTOEMPR = 'N'
WHERE (CONC_COD = 928);


UPDATE CONCEPTOS_NOMINA
SET CONC_NOMBRE = 'VACACIONES ADMIN',
    CONC_DEDUC = 'N',
    CONC_FECINI = '1-JAN-2008',
    CONC_FECFIN = '31-DEC-2008',
    CONC_PORC = 8.3333,
    CONC_BASE = 0,
    CONC_ENTIDAD = NULL,
    CONC_MONTO = NULL,
    CONC_CTAGAST = '510539',
    CONC_DIAS = 'N',
    CONC_MODIFI = 'S',
    CONC_DIAPAGO = NULL,
    CONC_PROMEDIO = 'N',
    CONC_TODOSPER = 'S',
    CONC_PROV = 'S',
    CONC_PERACTUAL = 'N',
    CONC_APORTE = 'N',
    CONC_APLICAPROM = 'N',
    CONC_PERPROMEDIO = NULL,
    CONC_OTROCONC = 'N',
    CONC_CODOTROCONC = 0,
    CONC_SALARIO = 'N',
    CONC_CTACXP = '261015',
    CONC_NOMCORTO = 'Vacaciones',
    CONC_PERIODOS = NULL,
    CONC_GTOEMPR = 'N'
WHERE (CONC_COD = 929);


UPDATE CONCEPTOS_NOMINA
SET CONC_NOMBRE = 'VACACIONES VENTAS',
    CONC_DEDUC = 'N',
    CONC_FECINI = '1-JAN-2008',
    CONC_FECFIN = '31-DEC-2008',
    CONC_PORC = 8.3333,
    CONC_BASE = 0,
    CONC_ENTIDAD = NULL,
    CONC_MONTO = NULL,
    CONC_CTAGAST = '520539',
    CONC_DIAS = 'N',
    CONC_MODIFI = 'S',
    CONC_DIAPAGO = NULL,
    CONC_PROMEDIO = 'N',
    CONC_TODOSPER = 'S',
    CONC_PROV = 'S',
    CONC_PERACTUAL = 'N',
    CONC_APORTE = 'N',
    CONC_APLICAPROM = 'N',
    CONC_PERPROMEDIO = NULL,
    CONC_OTROCONC = 'N',
    CONC_CODOTROCONC = 0,
    CONC_SALARIO = 'N',
    CONC_CTACXP = '261015',
    CONC_NOMCORTO = 'Vacaciones.',
    CONC_PERIODOS = NULL,
    CONC_GTOEMPR = 'N'
WHERE (CONC_COD = 930);

UPDATE CONCEPTOS_NOMINA
SET CONC_NOMBRE = 'HORAS EXTRA',
    CONC_DEDUC = 'N',
    CONC_FECINI = '1-JAN-2008',
    CONC_FECFIN = '31-DEC-2007',
    CONC_PORC = 0,
    CONC_BASE = 0,
    CONC_ENTIDAD = NULL,
    CONC_MONTO = 0,
    CONC_CTAGAST = '520515',
    CONC_DIAS = 'N',
    CONC_MODIFI = 'S',
    CONC_DIAPAGO = NULL,
    CONC_PROMEDIO = 'N',
    CONC_TODOSPER = 'S',
    CONC_PROV = 'N',
    CONC_PERACTUAL = 'S',
    CONC_APORTE = 'N',
    CONC_APLICAPROM = 'S',
    CONC_PERPROMEDIO = NULL,
    CONC_OTROCONC = 'N',
    CONC_CODOTROCONC = 0,
    CONC_SALARIO = 'S',
    CONC_CTACXP = '250505',
    CONC_NOMCORTO = 'Horas ext.',
    CONC_PERIODOS = NULL,
    CONC_GTOEMPR = 'N'
WHERE (CONC_COD = 900);

SET TERM ^ ;

ALTER PROCEDURE NOVEDADESXPERIODO(
    ANO CHAR(4),
    PERIODO INTEGER,
    PERIODI INTEGER)
RETURNS (
    IDNONO INTEGER,
    NIT VARCHAR(20),
    NOMBRE VARCHAR(60),
    TIPONOVE VARCHAR(60),
    NUMPER INTEGER,
    DIA INTEGER,
    DURACION INTEGER,
    FECHANO DATE,
    VALOR NUMERIC(18,2))
AS
DECLARE VARIABLE codnove CHAR(3);
DECLARE VARIABLE numperi INTEGER;
DECLARE VARIABLE numperif INTEGER;
BEGIN
    FOR SELECT NONO_ID, terc_nit, tnov_cod, nono_periodo, nono_diaini, nono_dura, nono_fecha, N.nono_valor
    FROM  nomina_novedades N WHERE
    nono_ppago = :PERIODI AND nono_periodo =: periodo AND Nono_ano =: ano
    INTO :idnono, :nit, :codnove, :numper, :dia, :duracion, :fechano, :valor
    DO
    BEGIN
    SELECT terc_nom FROM terceros WHERE terc_nit = :nit INTO nombre;
    SELECT tnov_nombre FROM tipos_novedad WHERE tnov_cod = :codnove INTO tiponove;
    SUSPEND;
    END
END
^

SET TERM ; ^


ALTER TABLE CONSOLIDADO_NOMINA
ADD CONO_DEB BOOLEANO;

SET TERM ^ ;

ALTER PROCEDURE CONSOLIDA_CONC_NOMINA(
    ID_NOMINA INTEGER)
AS
DECLARE VARIABLE id INTEGER;
DECLARE VARIABLE noco_item INTEGER;
DECLARE VARIABLE nit VARCHAR(20) CHARACTER SET none;
DECLARE VARIABLE valor NUMERIC(18,2);
DECLARE VARIABLE entidad VARCHAR(20) CHARACTER SET none;
DECLARE VARIABLE periodo INTEGER;
DECLARE VARIABLE ano CHAR(4) CHARACTER SET none;
DECLARE VARIABLE periodi INTEGER;
DECLARE VARIABLE deduc CHAR(1) CHARACTER SET none;
DECLARE VARIABLE prov CHAR(1) CHARACTER SET none;
DECLARE VARIABLE aporte CHAR(1) CHARACTER SET none;
DECLARE VARIABLE idexiste INTEGER;
DECLARE VARIABLE item INTEGER;
DECLARE VARIABLE idanterior INTEGER;
DECLARE VARIABLE itemanterior INTEGER;
DECLARE VARIABLE conc_cod VARCHAR(5);
DECLARE VARIABLE gtoempr CHAR(1);
BEGIN
DELETE FROM CONSOLIDADO_NOMINA WHERE CONO_IDORI = :ID_NOMINA;
    id = GEN_ID(id_consnoprov, 1);
        SELECT nomi_periodocidad FROM NOMINA WHERE NOMI_ID = :ID_NOMINA INTO :periodi;
        FOR SELECT NOCO_ITEM, CONC_COD, TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_PERIODO, NOCO_ANO, noco_deduc, noco_prov, noco_aporte, noco_gtoempr  FROM NOMINA_CONCEPTOS WHERE NOMI_ID = :id_nomina AND NOCO_gtoempr = 'N' AND NOCO_PROV = 'N'
        INTO :noco_item, :conc_cod, :nit, :valor, :entidad, :periodo, :ano, :deduc, :prov, :aporte, :gtoempr
        DO
        BEGIN
        IF (valor <> 0) THEN
            INSERT INTO consolidado_nomina (cono_id, cono_item ,cono_tipodes, cono_tipoori,  cono_idori, cono_periodo, cono_ano,  cono_valor, conc_cod, terc_nit, cono_pagook, cono_PERIODICIDAD, cono_DEDUC, cono_PROV, cono_APORTE, cono_gtoempr, cono_deb)
                                    VALUES (:id, :noco_item, 91, 92, :id_nomina, :periodo, :ano, :valor, :conc_cod, :nit, 'N', :periodi, :deduc, :prov, :aporte, :gtoempr, 'N');
        END
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE PAGO_NOMINA_XEMPL(
    IDDOC INTEGER)
RETURNS (
    NITEMPL VARCHAR(20),
    NOMBREEMPL VARCHAR(60),
    DEVENGOS NUMERIC(18,2),
    DEDUCIBLES NUMERIC(18,2),
    TOTAL NUMERIC(18,2),
    PAGAR CHAR(1))
AS
declare variable abonodeduc NUMERIC(18,2);
declare variable abonodeven NUMERIC(18,2);
begin
FOR SELECT E.TERC_NIT, T.TERC_NOM FROM EMPLEADOS E, TERCEROS T WHERE T.terc_nit =  E.terc_nit
    INTO :nitempl, :nombreempl
    DO
    BEGIN
    /*SUMA DEDUCIBLES*/
    SELECT SUM(c.cono_valor) FROM consolidado_nomina C
    WHERE C.cono_idori = :iddoc AND C.cono_deduc = 'S' AND C.cono_gtoempr = 'N'
    AND C.cono_prov = 'N' AND C.terc_nit = :nitempl  and c.cono_pagook = 'N'
    AND C.cono_tipoori = 92
    INTO :deducibles;
    if (deducibles is null) then
    deducibles = 0;
    SELECT SUM(c.cono_abono) FROM consolidado_nomina C
    WHERE C.cono_idori = :iddoc AND C.cono_deduc = 'S' AND C.cono_gtoempr = 'N'
    AND C.cono_prov = 'N' AND C.terc_nit = :nitempl  and c.cono_pagook = 'S'
    AND C.cono_tipoori = 92 AND C.cono_deb = 'S'
    INTO :abonodeduc;
    if (abonodeduc is null) then
    abonodeduc = 0;
    deducibles = :deducibles - :abonodeduc;
    /*SUMA DEVENGOS*/
    SELECT SUM(c.cono_valor) FROM consolidado_nomina C
    WHERE C.cono_idori = :iddoc AND C.cono_deduc = 'N' AND C.cono_gtoempr = 'N'
    AND C.cono_prov = 'N' AND C.terc_nit = :nitempl and c.cono_pagook = 'N'
    AND C.cono_tipoori = 92
    INTO :devengos;
    if (devengos is null) then
    devengos = 0;
    SELECT SUM(C.cono_abono) FROM consolidado_nomina C
    WHERE C.cono_idori = :iddoc AND C.cono_deduc = 'N' AND C.cono_gtoempr = 'N'
    AND C.cono_prov = 'N' AND C.terc_nit = :nitempl and c.cono_pagook = 'S'
    AND C.cono_tipoori = 92 AND C.cono_deb = 'S'
    INTO :abonodeven;
    if (abonodeven is null) then
    abonodeven = 0;
    devengos = :devengos - :abonodeven;
    total = :devengos + :deducibles;
    pagar = 'S';
    if ((total > 0) and (total is not null))  then
    suspend;
    END
end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER PROCEDURE PAGO_NOMINA_XEMPL_DETA(
    IDDOC INTEGER)
RETURNS (
    CONO_ID INTEGER,
    CONO_ITEM INTEGER,
    CONO_TIPODES INTEGER,
    CONO_TIPOORI INTEGER,
    CONO_IDDES INTEGER,
    CONO_IDORI INTEGER,
    CONO_PERIODO INTEGER,
    CONO_ANO CHAR(4),
    CONO_VALOR NUMERIC(18,2),
    CONO_ABONO NUMERIC(18,2),
    CONO_PAGOOK CHAR(1),
    TERC_NIT VARCHAR(20),
    CONC_COD VARCHAR(5),
    CONO_PERIODICIDAD INTEGER,
    CONO_DEDUC CHAR(1),
    CONO_PROV CHAR(1),
    CONO_APORTE CHAR(1),
    CONO_GTOEMPR CHAR(1),
    CONO_DEB CHAR(1))
AS
declare variable ABONO NUMERIC(18,2);
declare variable NITEMPL VARCHAR(20);
BEGIN
FOR SELECT TERC_NIT FROM NOMINA_DETALLE WHERE NOMI_ID = :iddoc INTO :NITEMPL
DO
BEGIN
FOR SELECT CONC_COD
FROM CONSOLIDADO_NOMINA C WHERE C.cono_idori = :iddoc AND C.terc_nit = :nitempl AND C.cono_deb = 'N'
     INTO :CONC_COD
     DO
     begin
     SELECT CONO_ID ,CONO_ITEM,CONO_TIPODES,CONO_TIPOORI,CONO_IDDES,CONO_IDORI,CONO_PERIODO,CONO_ANO,CONO_VALOR,CONO_ABONO,CONO_PAGOOK,TERC_NIT,CONO_PERIODICIDAD,CONO_DEDUC,CONO_PROV,CONO_APORTE,CONO_GTOEMPR, CONO_DEB
     FROM CONSOLIDADO_NOMINA C WHERE C.cono_idori = :iddoc AND C.terc_nit = :nitempl AND C.CONC_COD = :CONC_COD AND C.cono_deb = 'N'
     INTO :CONO_ID ,:CONO_ITEM,:CONO_TIPODES,:CONO_TIPOORI,:CONO_IDDES,:CONO_IDORI,:CONO_PERIODO,:CONO_ANO,:CONO_VALOR,:CONO_ABONO,:CONO_PAGOOK,:TERC_NIT,:CONO_PERIODICIDAD,:CONO_DEDUC,:CONO_PROV,:CONO_APORTE,:CONO_GTOEMPR, :CONO_DEB;
     SELECT SUM(cono_abono) FROM CONSOLIDADO_NOMINA C WHERE C.cono_idori = :iddoc AND C.terc_nit = :nitempl AND C.CONC_COD = :CONC_COD
     AND C.cono_deb = 'S' INTO :abono;
     if (abono IS NULL) then
     abono = 0;
     cono_valor = :cono_valor - :abono;
     cono_abono = :cono_valor;
     if (cono_valor <> 0) then
     SUSPEND;
     end
END
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE CONSOLIDA_CONC_NOMINA(
    ID_NOMINA INTEGER)
AS
DECLARE VARIABLE id INTEGER;
DECLARE VARIABLE noco_item INTEGER;
DECLARE VARIABLE nit VARCHAR(20) CHARACTER SET none;
DECLARE VARIABLE valor NUMERIC(18,2);
DECLARE VARIABLE entidad VARCHAR(20) CHARACTER SET none;
DECLARE VARIABLE periodo INTEGER;
DECLARE VARIABLE ano CHAR(4) CHARACTER SET none;
DECLARE VARIABLE periodi INTEGER;
DECLARE VARIABLE deduc CHAR(1) CHARACTER SET none;
DECLARE VARIABLE prov CHAR(1) CHARACTER SET none;
DECLARE VARIABLE aporte CHAR(1) CHARACTER SET none;
DECLARE VARIABLE idexiste INTEGER;
DECLARE VARIABLE item INTEGER;
DECLARE VARIABLE idanterior INTEGER;
DECLARE VARIABLE itemanterior INTEGER;
DECLARE VARIABLE conc_cod VARCHAR(5);
DECLARE VARIABLE gtoempr CHAR(1);
BEGIN
/*DELETE FROM CONSOLIDADO_NOMINA WHERE CONO_IDORI = :ID_NOMINA AND CONO_DEB = 'N' ;*/
    id = GEN_ID(id_consnoprov, 1);
        SELECT nomi_periodocidad FROM NOMINA WHERE NOMI_ID = :ID_NOMINA INTO :periodi;
        FOR SELECT NOCO_ITEM, CONC_COD, TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_PERIODO, NOCO_ANO, noco_deduc, noco_prov, noco_aporte, noco_gtoempr  FROM NOMINA_CONCEPTOS WHERE NOMI_ID = :id_nomina AND NOCO_gtoempr = 'N' AND NOCO_PROV = 'N'
        INTO :noco_item, :conc_cod, :nit, :valor, :entidad, :periodo, :ano, :deduc, :prov, :aporte, :gtoempr
        DO
        BEGIN
        IF (valor <> 0) THEN
            INSERT INTO consolidado_nomina (cono_id, cono_item ,cono_tipodes, cono_tipoori,  cono_idori, cono_periodo, cono_ano,  cono_valor, conc_cod, terc_nit, cono_pagook, cono_PERIODICIDAD, cono_DEDUC, cono_PROV, cono_APORTE, cono_gtoempr, cono_deb)
                                    VALUES (:id, :noco_item, 91, 92, :id_nomina, :periodo, :ano, :valor, :conc_cod, :nit, 'N', :periodi, :deduc, :prov, :aporte, :gtoempr, 'N');
        END
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE EGRESO_NOMINA(
    IDNOMINA INTEGER,
    PGLOBAL CHAR(1),
    NITBENE VARCHAR(20),
    FECHAEGR DATE,
    PREF VARCHAR(4),
    NUMEROEGR VARCHAR(6),
    CONCEPTO VARCHAR(60),
    OBSERVACIONES BLOB SUB_TYPE 0 SEGMENT SIZE 80,
    NOMBREBENE VARCHAR(60),
    CAJA INTEGER,
    USUARIOEGR VARCHAR(10),
    PAGO CHAR(1),
    CUENTAID INTEGER,
    FECHAEGRBNCO DATE,
    PREFEGREBNCO VARCHAR(4),
    NUMEROEGREBNCO VARCHAR(6),
    BENEBNCO VARCHAR(60),
    CONCEPTOBNCO VARCHAR(60),
    GMF CHAR(1),
    FORMAPAGOID INTEGER,
    CAJABNCO VARCHAR(2),
    CAJABNCOCUENTA VARCHAR(20),
    CAJABNCONUMEROEGR VARCHAR(20),
    FORMULARIO VARCHAR(10))
AS
declare variable porcreten numeric(9,4);
declare variable nitempl varchar(60);
declare variable idpago integer;
declare variable totdevenempl numeric(18,2);
declare variable retencionempl numeric(18,2);
declare variable periodicidad integer;
declare variable idegreso integer;
declare variable nitemplnglo varchar(20) character set none;
declare variable numegresointeger integer;
declare variable ok char(1) character set none;
declare variable itempago integer;
declare variable he numeric(18,2);
declare variable hed numeric(18,2);
declare variable hen numeric(18,2);
declare variable hefd numeric(18,2);
declare variable hefn numeric(18,2);
declare variable otrosdev numeric(18,2);
declare variable otrosded integer;
declare variable pagoempl char(1);
declare variable periodo integer;
declare variable nomiano char(4);
declare variable emplnom varchar(60);
declare variable devengos numeric(18,2);
declare variable deducibles numeric(18,2);
declare variable total numeric(18,2);
declare variable reten numeric(18,2);
begin
select nomi_pagook, nomi_periodo, nomi_ano from nomina where nomi_id = :idnomina into :ok, :periodo, :nomiano;
if (ok = 'N') then
BEGIN
if (pglobal = 'S') then
BEGIN
/*    for select terc_nit from nomina_detalle WHERE NOMI_ID = :idnomina INTO :nitemplnglo
    do
    begin */
    SELECT SUM (NC.CONO_ABONO) FROM CONSOLIDADO_NOMINA NC WHERE NC.CONO_IDORI = :IDNOMINA AND CONO_TIPOORI = 92 and cono_pagook = 'N'
    AND CONO_prov = 'N' AND CONO_APORTE = 'N' and CONO_DEB = 'S'
        INTO :total;
    if((:TOTAL IS NOT NULL) and (:total <> 0)) then
    BEGIN
    EXECUTE PROCEDURE cambie_id_egreso returning_values (:idegreso);
    INSERT INTO egresos (EGRE_ID, TIDO_COD, PREF_PRE, EGRE_numero, EGRE_fecha, EGRE_CONC, EGRE_MONTO, EGRE_RTFTEMONTO, EGRE_OBS, EGRE_NOMTERC, EGRE_ANULADO, EGRE_TRANSMIT, TERC_NIT, EGRE_TIPO, CAJA_ID, EGRE_usuario, NUMOK, CLEG_ID)
                 VALUES (:idegreso,62, :pref, :numeroegr, :fechaegr, :concepto, :total, 0, :observaciones, :nombrebene, 'N', 'N', :nitbene, '3', :caja, :usuarioegr, 'S', 0);
    if (pago = 'B') then
    INSERT INTO egresos_banco (EGRE_ID, EGBC_TIPOBCO, CUBA_COD, EGBC_numero, EGBC_fecha, PRBA_PREF, EGBC_BENEF, EGBC_MONTO, EGBC_CONCEPTO, EGBC_GMF, EGBC_ANULADO, EGBC_TRANSMIT) VALUES (:idegreso, 72, :cuentaid, :numeroegrebnco, :fechaegrbnco, :prefegrebnco, :benebnco, :total, :conceptobnco, :gmf, 'N', 'N');
    ELSE
    if (pago = 'C') then
    INSERT INTO egresos_caja (EGRE_ID, EGCA_ITEM, CAJA_ID, FOPA_ID, EGCA_BANCO, EGCA_CUENTA, EGCA_numero, EGCA_fecha, EGCA_MONTO, EGCA_ANULADO, EGCA_TRANSMIT) VALUES (:idegreso, 1, :caja, :formapagoid, :cajabnco, :cajabncocuenta, :cajabnconumeroegr, :fechaegr, :total, 'N', 'N');
    /*REGISTRE EL PAGO*/
    idpago = GEN_ID(id_pagonomi, 1);
    insert INTO pago_nomina (pgno_id, pgno_fecha, pgno_tipopago, pgno_egreid, pgno_egrepre, pgno_egrenum, pgno_monto, pgno_nomina, pgno_nit, pgno_formulario, PGNO_ANT)
                 VALUES (:idpago, :fechaegr, :pago , :idegreso, :pref, :numeroegr, :total, :idnomina, :nitbene, :formulario, 'N');
    update NOMINA SET NOMI_pagook = 'N' WHERE NOMI_ID = :IDNOMINA;
    END
    FOR SELECT TERC_NIT FROM nomina_detalle WHERE NOMI_ID = :idnomina into :nitemplnglo
    DO
    BEGIN
    SELECT SUM (NC.CONO_ABONO) FROM CONSOLIDADO_NOMINA NC WHERE NC.CONO_IDORI = :IDNOMINA AND CONO_TIPOORI = 92 and cono_pagook = 'N'
    AND CONO_prov = 'N' AND CONO_APORTE = 'N' and CONO_DEB = 'S'
        INTO :total;
    select max (pgno_item), max (pgno_id) from pago_nomina_det WHERE PGNO_ID = :idpago INTO :itempago, :idpago;
    if (:itempago IS NULL) then
    itempago = 0;
    itempago = :itempago + 1;
    insert INTO pago_nomina_det  (pgno_id, terc_nit, pgnd_monto, pgno_item)
                 VALUES (:idpago, :nitemplnglo, :total, :itempago);
    END
/*    end*/
END
ELSE
if (pglobal = 'N') then
BEGIN
    EXECUTE PROCEDURE cambie_id_egreso returning_values (:idegreso);
    FOR SELECT TERC_NIT FROM nomina_detalle WHERE NOMI_ID = :idnomina into :nitemplnglo
    DO
    BEGIN
    SELECT SUM (cono_abono) FROM CONSOLIDADO_NOMINA WHERE CONO_IDORI = :IDNOMINA AND CONO_TIPOORI = 92 and cono_pagook = 'N'
    AND CONO_deduc = 'N' AND cono_prov = 'N' and CONO_DEB = 'S' and TERC_NIT = :nitemplnglo
    INTO :totdevenempl;
    SELECT NOMI_PERIODOCIDAD FROM nomina WHERE NOMI_ID = :idnomina INTO :periodicidad;
    SELECT SUM (NC.CONO_ABONO) FROM CONSOLIDADO_NOMINA NC WHERE NC.CONO_IDORI = :IDNOMINA AND CONO_TIPOORI = 92 and cono_pagook = 'N'
    AND CONO_prov = 'N' AND CONO_APORTE = 'N' and CONO_DEB = 'S' AND TERC_NIT = :nitemplnglo
        INTO :total;
    SELECT TERC_NOM FROM TERCEROS WHERE TERC_NIT = :nitemplnglo INTO :emplnom;
    concepto = 'PAGO NOMINA ' || 'DEL PERIODO ' || CAST (periodo AS CHAR(2)) || ' DEL ' || nomiano;
    if((:TOTAL IS NOT NULL) or (:total <> 0)) then
    BEGIN
    INSERT INTO egresos (EGRE_ID, TIDO_COD, PREF_PRE, EGRE_numero, EGRE_fecha, EGRE_CONC, EGRE_MONTO, EGRE_RTFTEMONTO, EGRE_OBS, EGRE_NOMTERC, EGRE_ANULADO, EGRE_TRANSMIT, TERC_NIT, EGRE_TIPO, CAJA_ID, EGRE_usuario, NUMOK, CLEG_ID)
                 VALUES (:idegreso,62, :pref, :numeroegr, :fechaegr, :concepto, :total, :reten, :observaciones, :emplnom, 'N', 'N', :nitemplnglo, '3', :caja, :usuarioegr, 'S', 0);
    SELECT empl_formpago FROM EMPLEADOS WHERE TERC_NIT = :nitemplnglo INTO :pagoempl;
    if (pagoempl = 'B') then
    begin
    conceptobnco = :concepto;
    INSERT INTO egresos_banco (EGRE_ID, EGBC_TIPOBCO, CUBA_COD, EGBC_numero, EGBC_fecha, PRBA_PREF, EGBC_BENEF, EGBC_MONTO, EGBC_CONCEPTO, EGBC_GMF, EGBC_ANULADO, EGBC_TRANSMIT)
                       VALUES (:idegreso, 72, :cuentaid, :numeroegrebnco, :fechaegrbnco, :prefegrebnco, :nitemplnglo, :total, :conceptobnco, :gmf, 'N', 'N');
    end
    ELSE
    if (pagoempl = 'C') then
    INSERT INTO egresos_caja (EGRE_ID, EGCA_ITEM, CAJA_ID, FOPA_ID, EGCA_BANCO, EGCA_CUENTA, EGCA_numero, EGCA_fecha, EGCA_MONTO, EGCA_ANULADO, EGCA_TRANSMIT)
                 VALUES (:idegreso, 1, :caja, :formapagoid, :cajabnco, :cajabncocuenta, :cajabnconumeroegr, :fechaegr, :total, 'N', 'N');
        EXECUTE PROCEDURE cambie_id_egreso returning_values (:idegreso);

EXECUTE PROCEDURE cambie_id_pago_nomina returning_values (:idpago);
numegresointeger = cast (numeroegr as integer);
numegresointeger = numegresointeger + 1;
execute procedure completa_ceros(numegresointeger)returning_values :numeroegr;
    END
    EXECUTE PROCEDURE cambie_id_pago_nomina returning_values (:idpago);
    INSERT INTO pago_nomina (pgno_id, pgno_fecha, pgno_tipopago, pgno_egreid, pgno_egrepre, pgno_egrenum, pgno_monto, pgno_nomina, pgno_nit, pgno_formulario, PGNO_ANT)
                 VALUES (:idpago, :fechaegr, :pago , :idegreso, :pref, :numeroegr, 0, :idnomina, '', :formulario, 'N');
    SELECT SUM (cono_abono) FROM CONSOLIDADO_NOMINA WHERE CONO_IDORI = :IDNOMINA AND CONO_TIPOORI = 92 and cono_pagook = 'N'
    AND CONO_deduc = 'N' AND cono_prov = 'N' and TERC_NIT = :nitemplnglo
    INTO :totdevenempl;
    SELECT NOMI_PERIODOCIDAD FROM nomina WHERE NOMI_ID = :idnomina INTO :periodicidad;
    select max (pgno_item) from pago_nomina_det WHERE PGNO_ID = :idpago INTO :itempago;
    if (:itempago IS NULL) then
    itempago = 0;
    itempago = :itempago + 1;
    insert INTO pago_nomina_det  (pgno_id, terc_nit, pgnd_monto, pgno_item)
                 VALUES (:idpago, :nitemplnglo, :total, :itempago);
update CONSOLIDADO_NOMINA NC set nc.cono_pagook = 'S' WHERE NC.CONO_IDORI = :IDNOMINA AND CONO_TIPOORI = 92 and cono_pagook = 'N'
    AND CONO_prov = 'N' AND CONO_APORTE = 'N' and CONO_DEB = 'S' AND TERC_NIT = :nitemplnglo;
END
END
END
ELSE
exception nomina_con_pago;
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER PROCEDURE DIAS_LABORADOS (
    nitempl varchar(20),
    periodo integer,
    fec date)
returns (
    totaldiaslab integer)
as
declare variable diasnolab integer;
declare variable diaslabxper integer;
declare variable perpago integer;
declare variable fecing date;
declare variable diasfec integer;
declare variable diasing integer;
BEGIN
SELECT E.empl_ppago, E.empl_fecing
FROM EMPLEADOS E WHERE TERC_NIT = :nitempl
INTO :perpago, :fecing;
IF (perpago = 1) THEN
diaslabxper = 30;
ELSE
IF (perpago = 2) THEN
diaslabxper = 15;
ELSE
IF (perpago = 3) THEN
diaslabxper = 7;
if (SUBSTR(fecing,1,7) = SUBSTR(FEC,1,7)) then
BEGIN
diasfec = cast(substr(fec,9,10) as integer);
diasing = cast(substr(fecing,9,10) as integer)-1;
diaslabxper = diasfec - diasing;
if ((diaslabxper > 15) and (perpago = 2)) then
diaslabxper = 15;
END
SELECT SUM (NONO_DURA)
FROM nomina_novedades WHERE TERC_NIT = :nitempl AND TNOV_COD = 9 AND NONO_PERIODO = :periodo
INTO :diasnolab;
totaldiaslab =  :diaslabxper - :diasnolab;
IF (totaldiaslab IS NULL) THEN
totaldiaslab =  :diaslabxper;
SUSPEND;
END
^

SET TERM ; ^

GRANT ALL ON tipo_cotizante TO PUBLIC;
GRANT ALL ON subtipo_cotizante TO PUBLIC;
GRANT ALL ON experiencia_laboral_empleado TO PUBLIC;
GRANT EXECUTE ON PROCEDURE consolida_conc_nomina TO PUBLIC;
GRANT ALL ON retenciones TO PUBLIC;
GRANT ALL ON afp_especial TO PUBLIC;


DROP TRIGGER EMPLEADO_CONCEPTOS_BD;


INSERT INTO CONFIGURACION (CONF_MODULO, CONF_CATEGORIA, CONF_PROPIEDAD, CONF_VALOR, CONF_POSIBLES, CONF_AYUDA) VALUES ('NOMINA', 'LIQUIDACION', 'ACTIVAR SIEMPRE NOMINA CONFIRMADA', 'SI', 'SI,NO', 'SI: El valor predeterminado para confirmar sera si, NO: El valor predeterminado para confirmar sera no');

CREATE TABLE PERIODO_PAGO_NOMBRE (
    PPAG_COD INTEGER NOT NULL,
    PNOM_ITEM INTEGER NOT NULL,
    PNOM_NOMBRE NOMBRE);
alter table PERIODO_PAGO_NOMBRE
add constraint PK_PERIODO_PAGO_NOMBRE
primary key (PPAG_COD,PNOM_ITEM);

alter table PERIODO_PAGO_NOMBRE
add constraint FK_PERIODO_PAGO_NOMBRE_2
foreign key (PPAG_COD)
references PERIODO_PAGO(PPAG_COD);

SET TERM ^ ;

create or alter  trigger PERIODO_PAGO_NOMBRE_BI for PERIODO_PAGO_NOMBRE
active BEFORE INSERT position 0
as
declare variable maxitem integer;
begin
select max(P.pnom_item) from PERIODO_PAGO_NOMBRE P WHERE P.ppag_cod = NEW.ppag_cod INTO :maxitem;
if (MAXITEM IS NULL) then
MAXITEM = 0;
NEW.pnom_item = maxitem + 1;
end
^

SET TERM ; ^

GRANT SELECT,UPDATE,REFERENCES ON PERIODO_PAGO_NOMBRE TO TRIGGER PERIODO_PAGO_NOMBRE_BI;

ALTER TABLE PERIODO_PAGO_NOMBRE
ADD PPAG_PERIODO INTEGER;

SET TERM ^ ;

ALTER PROCEDURE DIAS_LABORADOS(
    NITEMPL VARCHAR(20),
    PERIODO INTEGER,
    FEC DATE,
    MENSUAL CHAR(1))
RETURNS (
    TOTALDIASLAB INTEGER)
AS
DECLARE VARIABLE diasnolab INTEGER;
DECLARE VARIABLE diaslabxper INTEGER;
DECLARE VARIABLE perpago INTEGER;
DECLARE VARIABLE fecing DATE;
BEGIN
SELECT E.empl_ppago, E.empl_fecing
FROM EMPLEADOS E WHERE TERC_NIT = :nitempl
INTO :perpago, :fecing;
if (mensual = 'N') then
BEGIN
IF (perpago = 1) THEN
diaslabxper = 30;
ELSE
IF (perpago = 2) THEN
diaslabxper = 15;
ELSE
IF (perpago = 3) THEN
diaslabxper = 7;
END
ELSE
diaslabxper = 30;
if (SUBSTR(fecing,1,8) = SUBSTR(FEC,1,8)) then
BEGIN
diaslabxper = cast(substr(fec,7,8) as integer) - cast(substr(fecing,7,8) as integer);
END
SELECT SUM (NONO_DURA)
FROM nomina_novedades WHERE TERC_NIT = :nitempl AND TNOV_COD = 9 AND NONO_PERIODO = :periodo
INTO :diasnolab;
totaldiaslab =  :diaslabxper - :diasnolab;
IF (totaldiaslab IS NULL) THEN
totaldiaslab =  :diaslabxper;
SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE CAUSA_NOMINA(
    FEC DATE,
    PERIODO INTEGER,
    PERIODICIDAD INTEGER,
    PAGOGLOBAL CHAR(1),
    ANO CHAR(4))
RETURNS (
    IDNOMINA INTEGER)
AS
DECLARE VARIABLE item INTEGER;
DECLARE VARIABLE nite VARCHAR(20) CHARACTER SET none;
DECLARE VARIABLE nit_tercero VARCHAR(20);
DECLARE VARIABLE concept INTEGER;
DECLARE VARIABLE montos NUMERIC(18,2);
DECLARE VARIABLE porcen NUMERIC(9,4);
DECLARE VARIABLE entidad VARCHAR(20);
DECLARE VARIABLE conc_cod INTEGER;
DECLARE VARIABLE conc_deduc CHAR(1);
DECLARE VARIABLE conc_porc NUMERIC(9,4);
DECLARE VARIABLE conc_entidad INTEGER;
DECLARE VARIABLE conc_monto NUMERIC(18,2);
DECLARE VARIABLE conc_modifi CHAR(1);
DECLARE VARIABLE conc_promedio CHAR(1);
DECLARE VARIABLE emco_perprom INTEGER;
DECLARE VARIABLE valor NUMERIC(18,2);
DECLARE VARIABLE diaslab INTEGER;
DECLARE VARIABLE conc_prov CHAR(1);
DECLARE VARIABLE conc_aporte CHAR(1);
DECLARE VARIABLE numeroprom INTEGER;
DECLARE VARIABLE conc_aplicaprom CHAR(1);
DECLARE VARIABLE perinicial INTEGER;
DECLARE VARIABLE anoprom INTEGER;
DECLARE VARIABLE conc_dias CHAR(1);
DECLARE VARIABLE conc_otroconc CHAR(1);
DECLARE VARIABLE conc_codotroconc INTEGER;
DECLARE VARIABLE anosum INTEGER;
DECLARE VARIABLE salario CHAR(1) CHARACTER SET none;
DECLARE VARIABLE liquidaper INTEGER;
DECLARE VARIABLE rmod NUMERIC(2,2);
DECLARE VARIABLE basico NUMERIC(18,2);
DECLARE VARIABLE niteps VARCHAR(20);
DECLARE VARIABLE nitafc VARCHAR(20);
DECLARE VARIABLE nitafp VARCHAR(20);
DECLARE VARIABLE nitccf VARCHAR(20);
DECLARE VARIABLE gtoempr CHAR(1);
DECLARE VARIABLE comision NUMERIC(18,2);
DECLARE VARIABLE cambsaltrans NUMERIC(18,2);
DECLARE VARIABLE saldosini NUMERIC(18,2);
DECLARE VARIABLE duranov INTEGER;
DECLARE VARIABLE base NUMERIC(18,2);
DECLARE VARIABLE aprox INTEGER;
DECLARE VARIABLE mensual CHAR(1);
BEGIN
/* SI ES QUINCENAL */
EXECUTE PROCEDURE cambie_id_nomina RETURNING_VALUES(:idnomina);
INSERT INTO nomina (nomi_id, NOMI_FECCAUSA, NOMI_PAGOGLOBAL, NOMI_PERIODOCIDAD, NOMI_PERIODO, NOMI_ANO, NOMI_LIQOK)
VALUES (:IDNOMINA, :fec,:pagoglobal, :periodicidad, :periodo, :ano, 'N');
 BEGIN
    item = 1;
    FOR SELECT E.TERC_NIT, E.empl_salario, e.empl_eps, e.empl_afc, e.empl_afp, e.empl_ccf
    FROM EMPLEADOS E
    WHERE E.empl_ppago = :periodicidad AND E.empl_fecret IS NULL
    INTO :nite, :basico, :niteps, :nitafc, :nitafp, :nitccf
    DO
    BEGIN
    FOR SELECT CE.TERC_NIT, CE.CONC_COD, CE.EMCO_MONTO, CE.EMCO_PORC, ce.empl_entidad, CE.emco_perprom, CE.emco_luquidaper, CE.emco_mensual, CN.CONC_COD, CN.CONC_DEDUC,CN.CONC_PORC, CN.CONC_ENTIDAD, CN.CONC_MONTO,  CN.CONC_DIAS, CN.CONC_MODIFI,
    CN.CONC_PROMEDIO, CN.conc_salario, CE.emco_perprom, CN.conc_prov, CN.conc_aporte, CN.conc_aplicaprom, cn.conc_otroconc, cn.conc_codotroconc, CN.conc_gtoempr, CN.conc_base
    FROM empleado_conceptos CE, CONCEPTOS_NOMINA CN WHERE ((CE.terc_nit = :nite) AND (CE.CONC_COD = CN.CONC_COD) AND (CN.conc_fecini <= :fec AND CN.conc_fecfin >= :FEC) ) OR ((CE.terc_nit = :nite)
    AND (CE.CONC_COD = CN.CONC_COD) AND (cn.conc_todosper = 'N') AND (CE.emco_ppago = :periodo)) OR  ((CE.terc_nit = :nite) AND (CE.CONC_COD = CN.CONC_COD) AND cn.conc_todosper = 'S')  ORDER BY (TERC_NIT )
    INTO :nit_tercero, :concept,  :montos, :porcen, :entidad, :numeroprom, :liquidaper, :mensual ,:CONC_COD, :CONC_DEDUC, :CONC_PORC,
    :CONC_ENTIDAD, :CONC_MONTO, :CONC_DIAS, :CONC_MODIFI,:CONC_PROMEDIO, :salario,:EMCO_PERPROM, :conc_prov, :conc_aporte , :CONC_APLICAPROM, :conc_otroconc, :conc_codotroconc, :gtoempr, :base
    DO
BEGIN
    IF (conc_dias = 'S') THEN
    EXECUTE PROCEDURE DIAS_LABORADOS (:nite, :periodo, :fec, :mensual) RETURNING_VALUES (:diaslab);
    ELSE
    BEGIN
    diaslab = 15;
    if (mensual = 'S') then
    BEGIN
    IF (periodicidad = 2) THEN
    diaslab = 30;
    ELSE
    IF (liquidaper = 3) THEN
    diaslab = 30;
    END
    END
 SELECT ((n.nono_valor /30) * n.nono_dura), (n.nono_dura) FROM nomina_novedades n WHERE n.tnov_cod = 11 AND n.terc_nit = :nite AND n.nono_periodo = :periodo INTO :cambsaltrans, :duranov;
 IF (cambsaltrans IS NULL) THEN
 cambsaltrans = 0;
 IF (duranov IS NULL) THEN
 duranov = 0;
 diaslab = :diaslab - :duranov;
 IF (conc_cod = 921) THEN
 BEGIN
 IF (porcen IS NOT NULL AND porcen <> 0) THEN
 valor = ((basico / 30)* :diaslab ) * :PORCEN /100;
 ELSE
 IF (conc_porc IS NOT NULL AND conc_porc <> 0) THEN
 valor = ((basico / 30)* :diaslab ) * :conc_porc /100;
 END
 ELSE
 IF (conc_cod = 922) THEN
 BEGIN
 SELECT P.prcu_monto FROM prestamo_cuotas P, prestamo_nomina PN WHERE P.prcu_ano = :ano AND P.prcu_periodo = :periodo AND PN.prno_id = P.prno_id AND PN.terc_nit = :nite INTO :valor;
 IF (valor IS NULL) THEN
 valor = 0;
 item = :item + 1;
 UPDATE prestamo_cuotas  P SET prcu_ok = 'S' WHERE P.prcu_ano = :ano AND P.prcu_periodo = :periodo AND P.prno_id = (SELECT PN.prno_id FROM PRESTAMO_NOMINA PN WHERE PN.terc_nit = :nite);
 END
 ELSE
 BEGIN
    IF ((:montos = 0) OR (:montos IS NULL)) THEN
      BEGIN
      IF ((CONC_PORC = 0 AND :porcen = 0) OR (CONC_PORC IS NULL AND :porcen = 0) OR (CONC_PORC = 0 AND :porcen IS NULL) OR (CONC_PORC IS NULL AND :porcen IS NULL) ) THEN
        BEGIN
        IF ((conc_monto <> 0) AND (conc_monto IS NOT NULL) ) THEN
        BEGIN
        VALOR = :CONC_MONTO;
        IF (:conc_dias = 'S') THEN
        valor = (:valor / 30) * :diaslab;
        END
        ELSE
        IF (salario = 'S' AND CONC_COD <> 900 AND CONC_COD <> 920) THEN
        BEGIN
        conc_monto = :basico;
        VALOR = (:conc_monto/30 * :diaslab ) + :cambsaltrans;
        END
        ELSE
        BEGIN
        valor = montos;
        IF (:conc_dias = 'S') THEN
        valor = (:valor / 30) * :diaslab;
        END
        END
       ELSE
       BEGIN
        IF (:porcen <> 0) THEN
          BEGIN
            IF ((conc_monto <> 0) AND (conc_monto IS NOT NULL) ) THEN
            BEGIN
              VALOR = ((:CONC_MONTO ) * :PORCEN) /100;
            END
          END
          ELSE
          BEGIN
            IF ((conc_monto <> 0) AND (conc_monto IS NOT NULL) ) THEN
            BEGIN
              VALOR = ((:CONC_MONTO) * :conc_porc) /100;
            END
            ELSE
        IF (salario = 'S' AND CONC_COD <> 900 AND CONC_COD <> 920) THEN
            BEGIN
              conc_monto = :basico;
              VALOR = ((:CONC_MONTO)+ :cambsaltrans * :conc_porc) /100;
            END
          END
       END
      END
    ELSE
    BEGIN
      IF ((CONC_PORC = 0 OR (conc_porc IS NULL)) AND (:porcen = 0 OR (porcen IS NULL))) THEN
      BEGIN
      VALOR = (:montos);
      IF (:conc_dias = 'S') THEN
      valor = (:valor / 30) * :diaslab;
      END
      ELSE
      BEGIN
        IF (:porcen <> 0 AND porcen IS NOT NULL) THEN
          BEGIN
          VALOR = ((:MONTOS ) * :PORCEN) /100;
          END
          ELSE
          BEGIN
          VALOR = ((:montos) * :CONC_PORC) /100;
          END
       END
   END
    IF (conc_promedio = 'S') THEN
    BEGIN
    perinicial = :periodo - (:numeroprom) + 1;
    anoprom = CAST (ano AS INTEGER);
    IF (perinicial <= 0) THEN
    BEGIN
    perinicial = 24 + :PERINICIAL;
    anoprom = CAST(ANO AS INTEGER) - 1;
    END
    SELECT SUM (noco_valor) FROM nomina_conceptos n WHERE n.noco_aplicaprom = 'S' AND N.noco_periodo >= :perinicial - 1 AND N.noco_periodo < :periodo AND N.noco_ano >= :anoprom AND N.noco_ano <= :ano AND terc_nit = :nite INTO :valor;
    valor = (valor / numeroprom);
    SELECT NOCO_VALOR FROM NOMINA_CONCEPTOS WHERE CONC_COD = :conc_cod AND TERC_NIT  = :nite AND NOCO_PAGOOK = 'N' AND NOCO_PERIODO = 0 INTO :saldosini;
    IF (saldosini IS NULL) THEN
    saldosini = 0;
    ELSE
    UPDATE nomina_conceptos N SET noco_pagook = 'S' WHERE n.noco_aplicaprom = 'S' AND N.noco_periodo >= :perinicial - 1 AND N.noco_periodo < :periodo AND N.noco_ano >= :anoprom AND N.noco_ano <= :ano  AND CONC_COD = :conc_cod AND terc_nit = :nite AND NOCO_PERIODO = 0;
    VALOR = :valor + :saldosini;
    UPDATE nomina_conceptos N SET noco_pagook = 'S' WHERE n.noco_aplicaprom = 'S' AND N.noco_periodo >= :perinicial - 1 AND N.noco_periodo < :periodo AND N.noco_ano >= :anoprom AND N.noco_ano <= :ano  AND CONC_COD = :conc_cod AND terc_nit = :nite;
    END
    IF (conc_otroconc = 'S') THEN
    BEGIN
    anosum = CAST(ano AS INTEGER);
    anosum = anosum - 1;
    SELECT SUM (noco_valor) FROM nomina_conceptos n WHERE n.noco_ano = :anosum AND n.conc_cod = :conc_codotroconc AND N.terc_nit = :nite INTO :valor;
    SELECT NOCO_VALOR FROM NOMINA_CONCEPTOS WHERE noco_ano = :anosum AND conc_cod = :conc_codotroconc AND terc_nit = :nite AND NOCO_PERIODO = 0 INTO :saldosini;
    IF (saldosini IS NULL) THEN
    saldosini = 0;
    ELSE
    UPDATE nomina_conceptos SET noco_pagook = 'S' WHERE noco_ano = :anosum AND conc_cod = :conc_codotroconc AND NOCO_PERIODO = 0 AND terc_nit = :nite;
    VALOR = :valor + :saldosini;
    UPDATE nomina_conceptos SET noco_pagook = 'S' WHERE noco_ano = :anosum AND conc_cod = :conc_codotroconc AND terc_nit = :nite;
    END
/*SI EL CONCEPTO ES UN APORTE*/
IF (conc_aporte = 'S') THEN
BEGIN
    IF ((:entidad = '' ) OR (entidad IS NULL)) THEN
    BEGIN
     SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
     IF (comision IS NULL) THEN
     comision = 0;
     valor = :basico + :comision;
    IF ((conc_cod = 904) OR (conc_cod = 905) OR (conc_cod = 906)) THEN
            BEGIN
            entidad = :nitafp;
                IF (conc_cod = 904) THEN
                BEGIN
                SELECT A.paan_afptr FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = (((((:basico /30) * :diaslab ) + :comision)+ :cambsaltrans) * :PORCEN) /100;
                END
                ELSE
                IF ((conc_cod = 905) OR (conc_cod = 906)) THEN
                BEGIN
                SELECT A.paan_afpem FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = (((((:basico /30) * :diaslab ) + :comision)+ :cambsaltrans) * :PORCEN) /100;
                END
            END
            ELSE
       IF ((conc_cod = 907) OR (conc_cod = 914) OR (conc_cod = 915)) THEN
            BEGIN
            entidad = :niteps;
                IF (conc_cod = 907) THEN
                BEGIN
                SELECT A.paan_epstr FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = (((((:basico )/30 * :diaslab ) + :comision)+ :cambsaltrans) * :PORCEN) /100;
                END
                ELSE
                IF ((conc_cod = 914) OR (conc_cod = 915)) THEN
                BEGIN
                SELECT A.paan_epsem FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = (((((:basico )/30 * :diaslab ) + :comision)+ :cambsaltrans) * :PORCEN) /100;
                END
            END
            ELSE
       IF ((conc_cod = 910) OR (conc_cod = 911) OR (conc_cod = 916) OR (conc_cod = 917) OR (conc_cod = 918) OR (conc_cod = 919)) THEN
            BEGIN
            entidad = :nitccf;
            SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
            IF (comision IS NULL) THEN
            comision = 0;
                IF ((conc_cod = 910) OR (conc_cod = 911) ) THEN
                BEGIN
                SELECT A.paan_ccf FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = (((((:basico )/30 * :diaslab ) + :comision)+ :cambsaltrans) * :PORCEN) /100;
                END
                ELSE
                IF ((conc_cod = 916) OR (conc_cod = 917)) THEN
                BEGIN
                SELECT A.paan_icbf FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = (((((:basico )/30 * :diaslab ) + :comision)+ :cambsaltrans) * :PORCEN) /100;
                END
                ELSE
                IF ((conc_cod = 918) OR (conc_cod = 919)) THEN
                BEGIN
                SELECT A.paan_sena FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = (((((:basico )/30 * :diaslab ) + :comision)+ :cambsaltrans) * :PORCEN) /100;
                END
            END
            ELSE
        IF ((conc_cod = 912) OR (conc_cod = 913)) THEN
            BEGIN
            entidad = :nitafc;
            SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
            IF (comision IS NULL) THEN
            comision = 0;
                IF ((conc_cod = 912) OR (conc_cod = 913) ) THEN
                BEGIN
                SELECT A.paan_cesemp FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = ((((:basico + :comision)/30 * :diaslab )+ :cambsaltrans) * :PORCEN) /100;
                END
            END
            ELSE
        BEGIN
        IF (comision IS NULL) THEN
        comision = 0;
        SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
        conc_monto = :basico + :comision;
        IF (conc_porc <> 0 AND conc_porc IS NOT NULL) THEN
        VALOR = (((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans) * :conc_porc) /100;
        ELSE
        IF (:porcen <> 0 AND :porcen IS NOT NULL) THEN
        VALOR = (((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans) * :porcen) /100;
        ELSE
        IF (:montos <> 0 AND :montos IS NOT NULL) THEN
        valor = :montos;
        ELSE
        IF (:conc_monto <> 0 AND :conc_monto IS NOT NULL) THEN
        valor = :conc_monto;
        END
    END
    END
    ELSE
    IF (conc_prov = 'S') THEN
    BEGIN
        conc_monto = :basico;
        IF (conc_porc <> 0 AND conc_porc IS NOT NULL) THEN
        VALOR = (((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans) * :conc_porc) /100;
        ELSE
        IF (porcen <> 0 AND porcen IS NOT NULL) THEN
        VALOR = (((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans) * :porcen) /100;
        ELSE
        IF (montos <> 0 AND montos IS NOT NULL) THEN
        VALOR = :montos;
        ELSE
        IF (conc_monto <> 0 AND conc_monto IS NOT NULL) THEN
        VALOR = :conc_monto;
    END
item = :item + 1;
END
 IF (conc_cod = 920) THEN
 BEGIN
 SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :valor;
 IF (valor IS NULL) THEN
 valor = 0;
 item = :item + 1;
 END
    EXECUTE PROCEDURE LEE_CONFIGURACION('NOMINA','GENERAL','REDONDEO AL MULTIPLO DE DIEZ EN TOTALES')RETURNING_VALUES(:aprox);
    EXECUTE PROCEDURE REDONDEE(:valor, :aprox) RETURNING_VALUES (VALOR);
    IF ((mensual = 'N') or (periodicidad = 1))  THEN
    INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
    VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
    ELSE
    IF (mensual = 'S') THEN
    BEGIN
         IF ((:periodicidad = 2) AND (liquidaper = 1)) THEN
         BEGIN
          IF ((periodo = 1) OR (periodo = 3) OR (periodo = 5) OR (periodo = 7) OR (periodo = 9) OR (periodo = 11)
          OR (periodo = 13) OR (periodo = 15) OR (periodo = 17) OR (periodo = 19) OR (periodo = 21) OR (periodo = 23)) THEN
             INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
             VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
         END
         ELSE
         IF ((:periodicidad = 2) AND (liquidaper = 2)) THEN
         BEGIN
          IF ((periodo = 2) OR (periodo = 4) OR (periodo = 6) OR (periodo = 8) OR (periodo = 10) OR (periodo = 12)
          OR (periodo = 14) OR (periodo = 16) OR (periodo = 18) OR (periodo = 20) OR (periodo = 22) OR (periodo = 24)) THEN
             INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
             VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
         END
         ELSE
         IF ((:periodicidad = 3) AND (liquidaper = 1)) THEN
         BEGIN
          IF ((periodo = 1) OR (periodo = 5) OR (periodo = 9) OR (periodo = 13) OR (periodo = 17) OR (periodo = 21)
          OR (periodo = 25) OR (periodo = 29) OR (periodo = 33) OR (periodo = 37) OR (periodo = 41) OR (periodo = 45)
          OR (periodo = 49)) THEN
             INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
             VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
         END
         ELSE
         IF ((:periodicidad = 3) AND (liquidaper = 2)) THEN
         BEGIN
          IF ((periodo = 2) OR (periodo = 6) OR (periodo = 10) OR (periodo = 14) OR (periodo = 18) OR (periodo = 22)
          OR (periodo = 26) OR (periodo = 30) OR (periodo = 34) OR (periodo = 38) OR (periodo = 42) OR (periodo = 46)
          OR (periodo = 50)) THEN
            INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
             VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
         END
         ELSE
         IF ((:periodicidad = 3) AND (liquidaper = 3)) THEN
         BEGIN
          IF ((periodo = 3) OR (periodo = 7) OR (periodo = 11) OR (periodo = 15) OR (periodo = 19) OR (periodo = 23)
          OR (periodo = 27) OR (periodo = 31) OR (periodo = 35) OR (periodo = 39) OR (periodo = 43) OR (periodo = 47)
          OR (periodo = 51)) THEN
            INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
             VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
         END
         ELSE
         IF ((:periodicidad = 3) AND (liquidaper = 4)) THEN
         BEGIN
          IF ((periodo = 4) OR (periodo = 8) OR (periodo = 12) OR (periodo = 16) OR (periodo = 20) OR (periodo = 24)
          OR (periodo = 29) OR (periodo = 32) OR (periodo = 36) OR (periodo = 40) OR (periodo = 44) OR (periodo = 48)
          OR (periodo = 52)) THEN
            INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
             VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
         END
    END
  END
 END
END
SUSPEND;
END
^

SET TERM ; ^


SET TERM ^ ;

CREATE TRIGGER LIQUIDACION_AI FOR LIQUIDACION
ACTIVE AFTER INSERT POSITION 0
AS
BEGIN
UPDATE EMPLEADOS SET EMPL_FECRET = NEW.liqd_fecha WHERE TERC_NIT = NEW.terc_nit;
END
^

SET TERM ; ^

GRANT UPDATE,REFERENCES ON LIQUIDACION TO TRIGGER LIQUIDACION_AI;
GRANT SELECT,UPDATE ON EMPLEADOS TO TRIGGER LIQUIDACION_AI;

ALTER TABLE LIQUIDACION
ADD LIQD_DIASLAB INTEGER;

SET TERM ^ ;

ALTER PROCEDURE LIQUIDACION_EMPLEADO(
    NITEMPL VARCHAR(20),
    FECLIQ DATE,
    DIASLABORADOS INTEGER)
RETURNS (
    PRIMA NUMERIC(18,2),
    CESANTIA NUMERIC(18,2),
    INTCESANT NUMERIC(18,2),
    VACACION NUMERIC(18,2),
    SUELDO NUMERIC(18,2),
    AUXTRANSP NUMERIC(18,2),
    EPSEMPL NUMERIC(18,2),
    AFPEMPL NUMERIC(18,2),
    DSPRESTAMO NUMERIC(18,2),
    EMPREPS NUMERIC(18,2),
    EMPRAFP NUMERIC(18,2),
    EMPRARP NUMERIC(18,2),
    EMPRCCF NUMERIC(18,2),
    EMPRSENA NUMERIC(18,2),
    EMPRICBF NUMERIC(18,2),
    TOTPAGOS NUMERIC(18,2),
    TOTDESC NUMERIC(18,2),
    TOTAL NUMERIC(18,2),
    TOTEMPR NUMERIC(18,2))
AS
DECLARE VARIABLE salario NUMERIC(18,2);
DECLARE VARIABLE porcepsempl NUMERIC(9,4);
DECLARE VARIABLE porcafpempl NUMERIC(9,4);
DECLARE VARIABLE auxt NUMERIC(18,2);
DECLARE VARIABLE pempreps NUMERIC(9,4);
DECLARE VARIABLE pemprafp NUMERIC(9,4);
DECLARE VARIABLE pemprarp NUMERIC(9,4);
DECLARE VARIABLE pemprccf NUMERIC(9,4);
DECLARE VARIABLE pemprsena NUMERIC(9,4);
DECLARE VARIABLE pempricbf NUMERIC(9,4);
BEGIN
SELECT E.empl_salario FROM EMPLEADOS E WHERE TERC_NIT = :nitempl INTO :salario;
sueldo = (:salario / 30) * :diaslaborados;
EXECUTE PROCEDURE REDONDEE(:SUELDO, -2) RETURNING_VALUES (:sueldo);

SELECT SUM (NOCO_VALOR) FROM NOMINA_CONCEPTOS WHERE TERC_NIT = :nitempl AND ((conc_cod = 925) OR (conc_cod = 927) OR (conc_cod = 926) OR (conc_cod = 928)) AND NOCO_PAGOOK = 'N' INTO :prima;
IF (prima IS NULL) THEN
prima = 0;
prima = :prima + ((:salario / 12)/ 30) * :diaslaborados;
EXECUTE PROCEDURE REDONDEE(:prima, -1) RETURNING_VALUES (:prima);

SELECT SUM (NOCO_VALOR) FROM NOMINA_CONCEPTOS WHERE TERC_NIT = :nitempl AND ((conc_cod = 912) OR (conc_cod = 913)) AND NOCO_PAGOOK = 'N' INTO :cesantia;
IF (cesantia IS NULL) THEN
cesantia = 0;
cesantia = :cesantia + ((:salario / 12)/ 30) * :diaslaborados;
EXECUTE PROCEDURE REDONDEE(:cesantia, -2) RETURNING_VALUES (:cesantia);

SELECT SUM (NOCO_VALOR) FROM NOMINA_CONCEPTOS WHERE TERC_NIT = :nitempl AND ((conc_cod = 923) OR (conc_cod = 924)) AND NOCO_PAGOOK = 'N' INTO :intcesant;
IF (intcesant IS NULL) THEN
intcesant = 0;
intcesant = ((((:salario / 12)/ 30) * :diaslaborados)*1/ 100)+ :intcesant;
EXECUTE PROCEDURE REDONDEE(:intcesant, -2) RETURNING_VALUES (:intcesant);

SELECT SUM (NOCO_VALOR) FROM NOMINA_CONCEPTOS WHERE TERC_NIT = :nitempl AND ((conc_cod = 929) OR (conc_cod = 930)) AND NOCO_PAGOOK = 'N' INTO :vacacion;
IF (vacacion IS NULL) THEN
vacacion = 0;
vacacion = :vacacion + ((:salario / 12)/ 30) * :diaslaborados;
EXECUTE PROCEDURE REDONDEE(:vacacion, -2) RETURNING_VALUES (:vacacion);

SELECT P.paan_epstr FROM PARAMETROS_ANO P WHERE P.paan_ano = SUBSTR(:fecliq, 1,4) INTO :porcepsempl;
epsempl = (sueldo * :porcepsempl) / 100;
EXECUTE PROCEDURE REDONDEE(:epsempl, -2) RETURNING_VALUES (:epsempl);

SELECT P.paan_afptr FROM PARAMETROS_ANO P WHERE P.paan_ano = SUBSTR(:fecliq, 1,4) INTO :porcafpempl;
afpempl = (sueldo * :porcafpempl) / 100;
EXECUTE PROCEDURE REDONDEE(:afpempl, -2) RETURNING_VALUES (:afpempl);

SELECT P.paan_auxtr FROM PARAMETROS_ANO P WHERE P.paan_ano = SUBSTR(:fecliq, 1,4) INTO :auxt;
auxtransp = (:auxt / 30) * diaslaborados;
EXECUTE PROCEDURE REDONDEE(:auxtransp, -2) RETURNING_VALUES (:auxtransp);

SELECT SUM (PRCU_MONTO) FROM PRESTAMO_CUOTAS P, PRESTAMO_NOMINA PN WHERE PN.prno_id = P.prno_id AND PN.terc_nit = :nitempl AND P.prcu_ok = 'N' INTO :dsprestamo;
IF (dsprestamo IS NULL) THEN
dsprestamo = 0;

SELECT P.paan_epsem FROM PARAMETROS_ANO P WHERE P.paan_ano = SUBSTR(:fecliq, 1,4) INTO :pempreps;
empreps = (sueldo * :pempreps) / 100;
EXECUTE PROCEDURE REDONDEE(:empreps, -2) RETURNING_VALUES (:empreps);

SELECT P.paan_afpem FROM PARAMETROS_ANO P WHERE P.paan_ano = SUBSTR(:fecliq, 1,4) INTO :pemprafp;
emprafp = (sueldo * :pemprafp) / 100;
EXECUTE PROCEDURE REDONDEE(:emprafp, -2) RETURNING_VALUES (:emprafp);

SELECT P.dpto_tararp FROM DEPARTAMENTO P, EMPLEADOS E WHERE P.dpto_cod = E.empl_dpto AND E.terc_nit = :nitempl INTO :pemprafp;
emprarp = (sueldo * :pemprarp) / 100;
EXECUTE PROCEDURE REDONDEE(:emprarp, -2) RETURNING_VALUES (:emprarp);

SELECT P.paan_ccf FROM PARAMETROS_ANO P WHERE P.paan_ano = SUBSTR(:fecliq, 1,4) INTO :pemprccf;
emprccf = (sueldo * :pemprccf) / 100;
EXECUTE PROCEDURE REDONDEE(:emprccf, -2) RETURNING_VALUES (:emprccf);

SELECT P.paan_sena FROM PARAMETROS_ANO P WHERE P.paan_ano = SUBSTR(:fecliq, 1,4) INTO :pemprsena;
emprsena = (sueldo * :pemprsena) / 100;
EXECUTE PROCEDURE REDONDEE(:emprsena, -2) RETURNING_VALUES (:emprsena);

SELECT P.paan_icbf FROM PARAMETROS_ANO P WHERE P.paan_ano = SUBSTR(:fecliq, 1,4) INTO :pempricbf;
empricbf = (sueldo * :pempricbf) / 100;
EXECUTE PROCEDURE REDONDEE(:empricbf, -2) RETURNING_VALUES (:empricbf);

totpagos = :PRIMA + :CESANTIA + :INTCESANT + :VACACION + :SUELDO + :AUXTRANSP;
totdesc = :EPSEMPL + :AFPEMPL + :DSPRESTAMO;
total = :totpagos - :totdesc;
totempr = :EMPREPS + :EMPRAFP + :EMPRARP + :EMPRCCF + :EMPRSENA + :EMPRICBF;
SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE DIAS_LABORADOS(
    NITEMPL VARCHAR(20),
    PERIODO INTEGER,
    FEC DATE,
    MENSUAL CHAR(1))
RETURNS (
    TOTALDIASLAB INTEGER,
    diasfec integer,
    diasing integer)
AS
DECLARE VARIABLE diasnolab INTEGER;
DECLARE VARIABLE diaslabxper INTEGER;
DECLARE VARIABLE perpago INTEGER;
DECLARE VARIABLE fecing DATE;
/*declare variable diasfec integer;
declare variable diasing integer;*/
BEGIN
SELECT E.empl_ppago, E.empl_fecing
FROM EMPLEADOS E WHERE TERC_NIT = :nitempl
INTO :perpago, :fecing;
if (mensual = 'N') then
BEGIN
IF (perpago = 1) THEN
diaslabxper = 30;
ELSE
IF (perpago = 2) THEN
diaslabxper = 15;
ELSE
IF (perpago = 3) THEN
diaslabxper = 7;
END
ELSE
diaslabxper = 30;
if (SUBSTR(fecing,1,7) = SUBSTR(FEC,1,7)) then
BEGIN
diasfec = cast(substr(fec,9,10) as integer);
diasing = cast(substr(fecing,9,10) as integer);
diaslabxper = diasfec - diasing;
if ((diaslabxper > 15) and (perpago = 2)) then
diaslabxper = 15;
END
SELECT SUM (NONO_DURA)
FROM nomina_novedades WHERE TERC_NIT = :nitempl AND TNOV_COD = 9 AND NONO_PERIODO = :periodo
INTO :diasnolab;
totaldiaslab =  :diaslabxper - :diasnolab;
IF (totaldiaslab IS NULL) THEN
totaldiaslab =  :diaslabxper;
SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE DIAS_LABORADOS(
    NITEMPL VARCHAR(20),
    PERIODO INTEGER,
    FEC DATE,
    MENSUAL CHAR(1))
RETURNS (
    TOTALDIASLAB INTEGER)
AS
DECLARE VARIABLE diasnolab INTEGER;
DECLARE VARIABLE diaslabxper INTEGER;
DECLARE VARIABLE perpago INTEGER;
DECLARE VARIABLE fecing DATE;
DECLARE VARIABLE DIASFEC INTEGER;
DECLARE VARIABLE DIASING INTEGER;
BEGIN
SELECT E.empl_ppago, E.empl_fecing
FROM EMPLEADOS E WHERE TERC_NIT = :nitempl
INTO :perpago, :fecing;
IF (mensual = 'N') THEN
BEGIN
IF (perpago = 1) THEN
diaslabxper = 30;
ELSE
IF (perpago = 2) THEN
diaslabxper = 15;
ELSE
IF (perpago = 3) THEN
diaslabxper = 7;
END
ELSE
diaslabxper = 30;
IF (SUBSTR(fecing,1,7) = SUBSTR(FEC,1,7)) THEN
BEGIN
diasfec = CAST(substr(fec,9,10) AS INTEGER);
diasing = CAST(substr(fecing,9,10) AS INTEGER);
diaslabxper = diasfec - diasing;
IF ((diaslabxper > 15) AND (perpago = 2)) THEN
diaslabxper = 15;
END
SELECT SUM (NONO_DURA)
FROM nomina_novedades WHERE TERC_NIT = :nitempl AND TNOV_COD = 9 AND NONO_PERIODO = :periodo
INTO :diasnolab;
totaldiaslab =  :diaslabxper - :diasnolab;
IF (totaldiaslab IS NULL) THEN
totaldiaslab =  :diaslabxper;
SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER TRIGGER NOMINA_DETALLE_BI
ACTIVE BEFORE INSERT POSITION 0
as
declare variable PERIODO INTEGER;
declare variable fec date;
begin
SELECT N.nomi_periodo, n.nomi_feccausa FROM NOMINA N WHERE N.nomi_id = NEW.nomi_id INTO :periodo, :fec;
EXECUTE PROCEDURE DIAS_LABORADOS (NEW.terc_nit, :periodo, :fec, 'N')returning_values(NEW.node_diaslab);
end
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE IMPR_PLANILLA_NOMINA(
    ID INTEGER,
    PAGO CHAR(1),
    CTA CHAR(1))
RETURNS (
    FECHA DATE,
    OBSERVACIONES BLOB SUB_TYPE 0 SEGMENT SIZE 80,
    PAGOGLOBAL CHAR(1),
    PERIODO INTEGER,
    ANO CHAR(4),
    PERIODICIDAD VARCHAR(60),
    NITEMPL VARCHAR(20),
    VALOR NUMERIC(18,2),
    DEDUC CHAR(1),
    NOMBREEMPL VARCHAR(60),
    NOMCORTCONC VARCHAR(60),
    NOMBRECONC VARCHAR(60),
    CODCONC INTEGER,
    PROV CHAR(1),
    TOTALEMPL NUMERIC(18,2),
    TOTALDEDUC NUMERIC(18,2),
    TOTALDEVENG NUMERIC(18,2),
    NUMEMPL INTEGER,
    CTAEMPL VARCHAR(25),
    TOTALCTAS NUMERIC(18,2),
    TOTALNOMI NUMERIC(18,2),
    TOTALAPOR NUMERIC(18,2))
AS
DECLARE VARIABLE NITANT VARCHAR(20);
DECLARE VARIABLE nitnue VARCHAR(20);
DECLARE VARIABLE NUMCONC INTEGER;
declare variable TOTALNOMINEG NUMERIC(18,2);
declare variable TOTALAPORNEG NUMERIC(18,2);
BEGIN
numempl = 0;
nitant = 0;
nitnue = 0;
IF (PAGO = 'N') THEN
BEGIN
FOR SELECT N.nomi_feccausa, N.nomi_obs, N.nomi_pagoglobal, N.nomi_periodo, N.nomi_ano, P.ppag_nombre FROM NOMINA N, periodo_pago P
 WHERE P.ppag_cod = N.nomi_periodocidad AND N.nomi_id = :ID
 INTO :fecha, :observaciones, :pagoglobal, :periodo, :ano, :periodicidad
 DO
 BEGIN
 FOR SELECT NC.terc_nit, NC.noco_valor, NC.noco_deduc, T.terc_nom, C.conc_nomcorto, C.conc_nombre, NC.conc_cod, NC.noco_prov FROM NOMINA_CONCEPTOS NC, TERCEROS T, EMPLEADOS E, CONCEPTOS_NOMINA C
        WHERE NC.nomi_id = :ID AND T.terc_nit = E.terc_nit AND C.conc_cod = NC.conc_cod AND t.terc_nit = nc.terc_nit
      INTO :nitempl, :valor, :deduc, :nombreempl, :nomcortconc, :nombreconc, :codconc, :prov
 DO
 BEGIN
 IF (valor IS NULL) THEN
 valor = 0;
 SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND TERC_NIT = :nitempl INTO :totalempl;
 SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND TERC_NIT = :nitempl AND NC.noco_deduc = 'S' INTO :totaldeduc;
 SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND TERC_NIT = :nitempl AND NC.noco_deduc = 'N' INTO :totaldeveng;
 SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id into :totalnomi;
 SELECT SUM(NC.noco_valor*-1) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_APORTE = 'S' AND NOCO_VALOR < 0 AND NOMI_ID = :id into :totalaporneg;
 SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_APORTE = 'S' AND NOCO_VALOR > 0 AND NOMI_ID = :id into :totalapor;
 totalapor = :totalapor + totalaporneg;
  SUSPEND;
 END
 END
END
ELSE
IF (PAGO = 'S') THEN
BEGIN
FOR SELECT N.nomi_feccausa, N.nomi_obs, N.nomi_pagoglobal, N.nomi_periodo, N.nomi_ano, P.ppag_nombre FROM NOMINA N, periodo_pago P
 WHERE P.ppag_cod = N.nomi_periodocidad AND N.nomi_id = :ID
 INTO :fecha, :observaciones, :pagoglobal, :periodo, :ano, :periodicidad
 DO
 BEGIN
 FOR SELECT NC.terc_nit, NC.noco_valor, NC.noco_deduc, T.terc_nom, C.conc_nomcorto, C.conc_nombre, NC.conc_cod, NC.noco_prov FROM NOMINA_CONCEPTOS NC, TERCEROS T, EMPLEADOS E, CONCEPTOS_NOMINA C
        WHERE NC.nomi_id = :ID AND T.terc_nit = E.terc_nit AND C.conc_cod = NC.conc_cod AND t.terc_nit = nc.terc_nit AND NC.noco_prov = 'N' AND NC.noco_gtoempr = 'N'
      INTO :nitempl, :valor, :deduc, :nombreempl, :nomcortconc, :nombreconc, :codconc, :prov
 DO
 BEGIN
 IF (valor IS NULL) THEN
 valor = 0;
 SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND TERC_NIT = :nitempl INTO :totalempl;
 SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND TERC_NIT = :nitempl AND NC.noco_deduc = 'S' INTO :totaldeduc;
 SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND TERC_NIT = :nitempl AND NC.noco_deduc = 'N' INTO :totaldeveng;
 IF (cta = 'S') THEN
 BEGIN
 SELECT COUNT(CONC_COD) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND TERC_NIT = :nitempl INTO :numconc;
 totalempl = totalempl / :numconc;
 SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND TERC_NIT = :nitempl INTO :totalctas;
 END
 SELECT TERC_NIT, EMPL_CUENTA FROM EMPLEADOS WHERE TERC_NIT = :nitempl INTO :nitnue, :ctaempl;
 IF (nitnue IS NOT NULL) THEN
 BEGIN
 IF (nitnue <> nitant) THEN
 numempl = :numempl + 1;
 nitant = :nitnue;
 END
 SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id into :totalnomi;
 SELECT SUM(NC.noco_valor*-1) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_APORTE = 'S' AND NOCO_VALOR < 0 AND NOMI_ID = :id into :totalaporneg;
 SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_APORTE = 'S' AND NOCO_VALOR > 0 AND NOMI_ID = :id into :totalapor;
 totalapor = :totalapor + totalaporneg;
 SUSPEND;
 END
 END
END
END
^

SET TERM ; ^

ALTER TABLE VENDEDORES
ADD VEND_NIT NIT;

ALTER TABLE EMPLEADOS
ADD EMPL_TIPOCOMI CHAR(1);

CREATE TABLE PROGRAM_VACACIONES (
    PRVA_ITEM INTEGER NOT NULL,
    TERC_NIT NIT,
    PRVA_FECHA DATE);
alter table PROGRAM_VACACIONES
add constraint PK_PROGRAM_VACACIONES
primary key (PRVA_ITEM);

alter table PROGRAM_VACACIONES
add constraint FK_PROGRAM_VACACIONES_2
foreign key (TERC_NIT)
references EMPLEADOS(TERC_NIT);

SET TERM ^ ;

create trigger PROGRAM_VACACIONES_BI for PROGRAM_VACACIONES
active BEFORE INSERT position 0
as
declare variable maxitem integer;
begin
select max(P.prva_item) from program_vacaciones P INTO :maxitem;
if (MAXITEM IS NULL) then
MAXITEM = 0;
NEW.prva_item = maxitem + 1;
end
^

SET TERM ; ^

GRANT SELECT,UPDATE,REFERENCES ON PROGRAM_VACACIONES TO TRIGGER PROGRAM_VACACIONES_BI;


INSERT INTO program_vacaciones (terc_nit) SELECT TERC_NIT FROM EMPLEADOS;

SET TERM ^ ;

create trigger EMPLEADOS_AI for EMPLEADOS
active AFTER INSERT position 0
as
begin
INSERT INTO program_vacaciones (TERC_NIT) VALUES (NEW.terc_nit);
end
^

SET TERM ; ^

GRANT UPDATE,REFERENCES ON EMPLEADOS TO TRIGGER EMPLEADOS_AI;
GRANT INSERT ON PROGRAM_VACACIONES TO TRIGGER EMPLEADOS_AI;

ALTER TABLE NOMINA_COMISIONES
ADD NCOM_FECDESDE DATE;

ALTER TABLE NOMINA_COMISIONES
ADD NCOM_FECHASTA DATE;

ALTER TABLE REVISION
ADD REVI_NOMINA DATE;

CREATE EXCEPTION COMISIONES_CALCULADAS 'Las comisiones para algunos de estos días ya fuerón tomados en cuenta';

SET TERM ^ ;

CREATE TRIGGER NOMINA_COMISIONES_BI FOR NOMINA_COMISIONES
ACTIVE BEFORE INSERT POSITION 0
AS
declare variable EXISTE CHAR(1);
BEGIN
IF (NEW.ncom_fecdesde IS NOT NULL AND NEW.ncom_fechasta IS NOT NULL) THEN
BEGIN
SELECT 'S' FROM NOMINA_COMISIONES N WHERE (N.ncom_fecdesde > NEW.ncom_fecdesde AND N.ncom_fechasta < NEW.ncom_fecdesde) or (N.ncom_fecdesde > NEW.ncom_fechasta AND N.ncom_fechasta < NEW.ncom_fechasta) INTO :existe;
if (EXISTE IS NOT NULL) then
EXCEPTION COMISIONES_CALCULADAS;
END
END
^

SET TERM ; ^

GRANT SELECT,UPDATE,REFERENCES ON NOMINA_COMISIONES TO TRIGGER NOMINA_COMISIONES_BI;

SET TERM ^ ;

CREATE OR ALTER PROCEDURE CALC_SALDOSINI_NOMINA(
    FECHA DATE)
RETURNS (
    EMPLNIT VARCHAR(20),
    EMPLNOM VARCHAR(60),
    PRIMAJUNIO NUMERIC(18,2),
    CONC_CODPRIMAJUN INTEGER,
    PRIMADIC NUMERIC(18,2),
    CONC_CODPRIMADIC INTEGER,
    CESANTIA NUMERIC(18,2),
    CONC_CODCESAN INTEGER,
    VACAC NUMERIC(18,2),
    CONC_CODVACACI INTEGER,
    INTCES NUMERIC(18,2),
    CONC_CODINTCES INTEGER)
AS
DECLARE VARIABLE numeromeses INTEGER;
declare variable fechaing date;
DECLARE VARIABLE ANOACT INTEGER;
DECLARE VARIABLE MESACT INTEGER;
DECLARE VARIABLE DIAACT INTEGER;
DECLARE VARIABLE ANOING INTEGER;
DECLARE VARIABLE DIAING INTEGER;
DECLARE VARIABLE MESING INTEGER;
DECLARE VARIABLE salario NUMERIC(18,2);
declare variable item integer;
declare variable idsaldo integer;
BEGIN
delete from nomina where nomi_periodo = 0;
idsaldo = gen_id(id_nomina,1);
insert into nomina  (nomi_id, nomi_feccausa, nomi_liqok, nomi_periodo) values (:idsaldo, :fecha, 'S', 0);
item = 1;
anoact = CAST(substr(:fecha,1,4)AS INTEGER);
mesact = CAST(substr(:fecha,6,7)AS INTEGER);
diaact = CAST(substr(:fecha,9,10)AS INTEGER);
FOR SELECT  E.TERC_NIT, T.TERC_NOM, E.EMPL_FECING, E.empl_salario FROM EMPLEADOS E, TERCEROS T WHERE T.terc_nit = E.terc_nit AND e.empl_fecing <= :fecha INTO :emplnit, :emplnom, :fechaing, :salario
DO
  BEGIN
    anoing = CAST(substr(:fechaing,1,4)AS INTEGER);
    mesing = CAST(substr(:fechaing,6,7)AS INTEGER);
    diaing = CAST(substr(:fechaing,9,10)AS INTEGER);
    numeromeses = mesact - 1;
    cesantia = (:salario / 12) * :numeromeses;
    intces = cesantia * 1 /100;
    numeromeses = ((:anoact-:anoing)*12)-((:mesact-:mesing)*(-1))-1;
    if (numeromeses > 12) then
    numeromeses = 12;
    IF (numeromeses < 0) THEN
    numeromeses = 0;
    vacac = ((:salario / 12) * :numeromeses) / 2;
    IF (anoact = anoing) THEN
    BEGIN
    IF (mesact > 1 AND mesact <= 6) THEN
    BEGIN
    numeromeses = :mesact - :mesing;
    primajunio = (:salario / 12) * :numeromeses;
    END
    ELSE
    primajunio = 0;
    IF (mesact > 7 AND mesact <= 12) THEN
    BEGIN
    numeromeses = :mesact - 6;
    primadic = (:salario / 12) * (:numeromeses);
    END
    END
    ELSE
    IF (mesact > 1 AND mesact <= 6) THEN
    begin
    numeromeses = :mesact - 1;
    primajunio = (:salario / 12) * :numeromeses;
    end
    else
    IF (mesact > 7 AND mesact <= 12) THEN
    BEGIN
    numeromeses = :mesact - 7;
    primadic = (:salario / 12) * (:numeromeses);
    END
EXECUTE PROCEDURE redondee(:primajunio, 5) RETURNING_VALUES :primajunio;
EXECUTE PROCEDURE redondee(:primadic, 5) RETURNING_VALUES :primadic;
EXECUTE PROCEDURE redondee(:cesantia, 5) RETURNING_VALUES :cesantia;
EXECUTE PROCEDURE redondee(:intces, 5) RETURNING_VALUES :intces;
EXECUTE PROCEDURE redondee(:vacac, 5) RETURNING_VALUES :vacac;
/*if ( cesantia <> 0 AND cesantia IS NOT NULL and  intces <> 0 AND intces IS NOT NULL and primajunio <> 0 AND primajunio IS NOT NULL and vacac <> 0 AND vacac IS NOT NULL and primadic <> 0 AND primadic IS NOT NULL) then*/
select conc_cod from empleado_conceptos where ((conc_cod = 912) or (conc_cod = 913)) and terc_nit = :emplnit into :conc_codcesan;
select conc_cod from empleado_conceptos where ((conc_cod = 923) or (conc_cod = 924)) and terc_nit = :emplnit into :conc_codintces;
select conc_cod from empleado_conceptos where ((conc_cod = 925) or (conc_cod = 927)) and terc_nit = :emplnit into :conc_codprimajun;
select conc_cod from empleado_conceptos where ((conc_cod = 926) or (conc_cod = 928)) and terc_nit = :emplnit into :conc_codprimadic;
select conc_cod from empleado_conceptos where ((conc_cod = 929) or (conc_cod = 930)) and terc_nit = :emplnit  into :conc_codvacaci;
if (cesantia <> 0 AND cesantia IS NOT NULL) then
begin
INSERT INTO NOMINA_CONCEPTOS (NOMI_ID, NOCO_ITEM, CONC_COD, TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC, NOCO_PROV, NOCO_APORTE, NOCO_PAGOOK, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, NOCO_GTOEMPR) VALUES (:idsaldo, :item, :conc_codcesan, :emplnit, :cesantia, '', 'N', 'S', 'N', 'N', 0, :anoact, 'N', 'N', 'N', 'S');
item = :item + 1;
end
if (intces <> 0 AND intces IS NOT NULL) then
begin
INSERT INTO NOMINA_CONCEPTOS (NOMI_ID, NOCO_ITEM, CONC_COD, TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC, NOCO_PROV, NOCO_APORTE, NOCO_PAGOOK, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, NOCO_GTOEMPR) VALUES (:idsaldo, :item, :conc_codintces, :emplnit, :intces, '', 'N', 'S', 'N', 'N', 0, :anoact, 'N', 'N', 'N', 'S');
item = :item + 1;
end
if (primajunio <> 0 AND primajunio IS NOT NULL) then
begin
INSERT INTO NOMINA_CONCEPTOS (NOMI_ID, NOCO_ITEM, CONC_COD, TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC, NOCO_PROV, NOCO_APORTE, NOCO_PAGOOK, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, NOCO_GTOEMPR) VALUES (:idsaldo, :item, :conc_codprimajun, :emplnit, :primajunio, '', 'N', 'S', 'N', 'N', 0, :anoact, 'N', 'N', 'N', 'S');
item = :item + 1;
end
if (primadic <> 0 AND primadic IS NOT NULL) then
begin
INSERT INTO NOMINA_CONCEPTOS (NOMI_ID, NOCO_ITEM, CONC_COD, TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC, NOCO_PROV, NOCO_APORTE, NOCO_PAGOOK, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, NOCO_GTOEMPR) VALUES (:idsaldo, :item, :conc_codprimadic, :emplnit, :primadic, '', 'N', 'S', 'N', 'N', 0, :anoact, 'N', 'N', 'N', 'S');
item = :item + 1;
end
if (vacac <> 0 AND vacac IS NOT NULL) then
begin
INSERT INTO NOMINA_CONCEPTOS (NOMI_ID, NOCO_ITEM, CONC_COD, TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC, NOCO_PROV, NOCO_APORTE, NOCO_PAGOOK, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, NOCO_GTOEMPR) VALUES (:idsaldo, :item, :conc_codvacaci, :emplnit, :vacac, '', 'N', 'S', 'N', 'N', 0, :anoact, 'N', 'N', 'N', 'S');
item = :item + 1;
end
    SUSPEND;
  END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER PROCEDURE CALCULA_COMISIONES_NOMINA(
    FECINI DATE,
    FECFIN DATE,
    PERIODICIDAD INTEGER,
    PERIODO INTEGER,
    ANO CHAR(4))
RETURNS(IDCOMI INTEGER)
AS
DECLARE VARIABLE DTOMONTO NUMERIC(18,2);
DECLARE VARIABLE IVAMONTO NUMERIC(18,2);
DECLARE VARIABLE EXTRA NUMERIC(18,2);
DECLARE VARIABLE TOTAL NUMERIC(18,2);
DECLARE VARIABLE BASE NUMERIC(18,2);
DECLARE VARIABLE BASEDEV NUMERIC(18,2);
DECLARE VARIABLE SITOT CHAR(2);
DECLARE VARIABLE COMIMONTODEV NUMERIC(18,2);
DECLARE VARIABLE IDFACT INTEGER;
DECLARE VARIABLE CONSUMO NUMERIC(18,2);
DECLARE VARIABLE ITEM INTEGER;
DECLARE VARIABLE CODVEND INTEGER;
DECLARE VARIABLE COMIMONTO NUMERIC(18,2);
DECLARE VARIABLE COMIPORC NUMERIC(9,2);
DECLARE VARIABLE VENDNIT VARCHAR(20);
DECLARE VARIABLE EXISTE NUMERIC(18,2);
BEGIN
EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION', 'VENDEDORES', 'COMISIONES EN VENTA INCLUYENDO IMPUESTOS') RETURNING_VALUES (:SITOT);
ITEM = 1;
FOR SELECT VEND_COD, VEND_NIT
    FROM VENDEDORES, EMPLEADOS E
    WHERE /*VEND_COD >= :DESDE AND VEND_COD <= :HASTA AND*/ VEND_NIT = E.terc_nit
    AND E.EMPL_FECING >= :FECINI AND E.EMPL_FECING <= :FECFIN
    INTO :CODVEND, :VENDNIT
    DO  
    BEGIN
    FOR SELECT  SUM(FACT_TOTAL), SUM(FACT_EXTRA), SUM(FACT_IVAMONTO), SUM(FACT_COMIPORC), SUM(FACT_COMIMONTO), SUM(FADE_CONSUMO)
        FROM FACTURAS f, facturas_detalle d WHERE F.FACT_ID = D.FACT_ID AND VEND_COD = :CODVEND AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND FACT_ANULADO = 'N'
        GROUP BY F.vend_cod
        INTO :TOTAL, :EXTRA, :IVAMONTO, :COMIPORC, :COMIMONTO, :CONSUMO
        DO
        BEGIN
        IF (COMIPORC <> 0) THEN
            BEGIN
            BASE = :comimonto * 100 / :comiporc;
            EXECUTE PROCEDURE redondee(:BASE, 0) RETURNING_VALUES (:BASE);
            END
        ELSE
            IF (SITOT = 'SI') THEN
                BASE = TOTAL;
            ELSE
                BASE = TOTAL - EXTRA - IVAMONTO - CONSUMO;
        END
    FOR SELECT MAX(DEVT_DTOMONTO), MAX(DEVT_IVAMONTO), MAX(DEVT_EXTRA), MAX(DEVT_TOTAL), MAX(DEVT_COMIPORC), MAX(DEVT_COMIMONTO), MAX(DEVT_FACTID), SUM(DVDE_CONSUMO)
        FROM DEVOLUCIONES_VENTAS V, DEVOLUCIONES_VENTAS_DETALLE D WHERE V.DEVT_ID = D.DEVT_ID AND VEND_COD = :CODVEND AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND DEVT_ANULADO = 'N'
        GROUP BY v.DEVT_ID
        INTO  :DTOMONTO,:IVAMONTO, :EXTRA, :TOTAL, :COMIPORC, :COMIMONTO, :IDFACT, :CONSUMO
        DO
        BEGIN
        IF (COMIPORC <> 0) THEN
            BEGIN
            BASEDEV = :comimontodev * 100 / :comiporc;
            EXECUTE PROCEDURE redondee(:BASE, 0) RETURNING_VALUES (:BASE);
            END
        ELSE
            IF (SITOT = 'SI') THEN
                BASEDEV = TOTAL;
            ELSE
                BASEDEV = TOTAL - EXTRA - IVAMONTO - CONSUMO;
        BASEDEV = BASEDEV * -1;
        COMIMONTODEV = COMIMONTODEV * -1;
        END
     IF (comimonto IS NULL) THEN
        comimonto = 0;
     IF (comimontodev IS NULL) THEN
        comimontodev = 0;
    comimonto = :comimonto + :comimontodev;
    SELECT N.ncom_monto, n.ncom_id FROM NOMINA_COMISIONES N WHERE N.terc_nit = :vendnit AND N.ncom_ano = :ano AND N.ncom_periodicidad = :periodicidad AND N.ncom_periodo = :periodo INTO :existe, :idcomi;
    IF (EXISTE IS NULL) THEN
    BEGIN
    idcomi = GEN_ID(id_nomicomi,1);
    INSERT INTO NOMINA_COMISIONES  (ncom_id, ncom_item, ncom_periodicidad, terc_nit, ncom_ano, ncom_periodo, ncom_monto, ncom_fecdesde, ncom_fechasta)
                             VALUES(:idcomi,:item,:periodicidad, :vendnit, :ano, :periodo, :comimonto, :fecini, :fecfin);
    END
    ELSE
    UPDATE NOMINA_COMISIONES N SET N.ncom_monto = :existe + :comimonto WHERE N.terc_nit = :vendnit AND N.ncom_ano = :ano AND N.ncom_periodicidad = :periodicidad AND N.ncom_periodo = :periodo;
    ITEM = ITEM + 1;
    END
    SUSPEND;
END
^

SET TERM ; ^

CREATE TABLE PERIODO_PAGO_NOMBRE (
    PPAG_COD      INTEGER NOT NULL,
    PNOM_ITEM     INTEGER NOT NULL,
    PNOM_NOMBRE   NOMBRE,
    PPAG_PERIODO  INTEGER
);



ALTER TABLE PERIODO_PAGO_NOMBRE ADD CONSTRAINT PK_PERIODO_PAGO_NOMBRE PRIMARY KEY (PPAG_COD, PNOM_ITEM);

ALTER TABLE PERIODO_PAGO_NOMBRE ADD CONSTRAINT FK_PERIODO_PAGO_NOMBRE_2 FOREIGN KEY (PPAG_COD) REFERENCES PERIODO_PAGO (PPAG_COD);

SET TERM ^ ;

CREATE TRIGGER PERIODO_PAGO_NOMBRE_BI FOR PERIODO_PAGO_NOMBRE
ACTIVE BEFORE INSERT POSITION 0
as
declare variable maxitem integer;
begin
select max(P.pnom_item) from PERIODO_PAGO_NOMBRE P WHERE P.ppag_cod = NEW.ppag_cod INTO :maxitem;
if (MAXITEM IS NULL) then
MAXITEM = 0;
NEW.pnom_item = maxitem + 1;
end
^

SET TERM ; ^

UPDATE REVISION SET revi_nomina = '2008/12/04';

CREATE TABLE HORARIO_EMPLEADO (
    HOEM_ID         INTEGER NOT NULL,
    TERC_NIT        VARCHAR(20),
    HOEM_TIPOCONTR  CHAR(1) CHARACTER SET NONE
);


CREATE TABLE HORARIO_EMPLEADO_DET (
    HOEM_ID       INTEGER NOT NULL,
    HOEM_DIA      INTEGER NOT NULL,
    HOED_HORAENT  TIME,
    HOED_HORASAL  TIME,
    HOED_LABOR    CHAR(1) CHARACTER SET NONE
);

ALTER TABLE HORARIO_EMPLEADO ADD CONSTRAINT PK_HORARIO_EMPLEADO1 PRIMARY KEY (HOEM_ID);
ALTER TABLE HORARIO_EMPLEADO_DET ADD CONSTRAINT PK_HORARIO_EMPLEADO_DET PRIMARY KEY (HOEM_ID);
ALTER TABLE HORARIO_EMPLEADO_DET ADD CONSTRAINT FK_HORARIO_EMPLEADO_DET_2 FOREIGN KEY (HOEM_ID) REFERENCES HORARIO_EMPLEADO (HOEM_ID);


UPDATE RDB$RELATION_FIELDS SET
RDB$FIELD_SOURCE = 'NIT'
WHERE (RDB$FIELD_NAME = 'TERC_NIT') AND
(RDB$RELATION_NAME = 'HORARIO_EMPLEADO')
;

ALTER TABLE HORARIO_EMPLEADO_DET
ADD HOED_LABOR CHAR(1);

CREATE GENERATOR ID_HORAEMPL;
SET GENERATOR ID_HORAEMPL TO 0;

ALTER TABLE HORARIO_EMPLEADO_DET
ADD CONSTRAINT FK_HORARIO_EMPLEADO_DET_2
FOREIGN KEY (HOEM_ID)
REFERENCES HORARIO_EMPLEADO(HOEM_ID);

SET TERM ^ ;

CREATE PROCEDURE CAMBIE_ID_HORARIOEMPL
RETURNS (
    ID INTEGER)
AS
BEGIN
  EXIT;
END^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE CAMBIE_ID_HORARIOEMPL
RETURNS (
    ID INTEGER)
AS
DECLARE VARIABLE numrows INTEGER;
BEGIN
/* TRAE EL ID NUEVO Y LO ACTUALIZA */
NUMROWS = 1;
WHILE (NUMROWS > 0) DO
    BEGIN
    ID = GEN_ID(id_horaempl, 1);
    /* VERIFIQUE SI YA EXISTE */
    SELECT COUNT(*) FROM HORARIO_EMPLEADO WHERE HOEM_ID = :ID INTO :NUMROWS;
    END
SUSPEND;
END
^

SET TERM ; ^


CREATE TABLE CONFIGURACION_HORAS_EMPLEADO (
    TERC_NIT       VARCHAR(20) CHARACTER SET NONE NOT NULL,
    NUHO_ENTRADA   TIME,
    NUHO_SALIDA    TIME,
    NUHO_DIAEXTRA  TIME
);

ALTER TABLE CONFIGURACION_HORAS_EMPLEADO ADD CONSTRAINT PK_CONFIGURACION_NUMERO_HORAS PRIMARY KEY (TERC_NIT);


GRANT UPDATE,REFERENCES ON HORARIO_EMPLEADO TO TRIGGER HORARIO_EMPLEADO_BI;

ALTER TABLE HORARIO_EMPLEADO_DET DROP CONSTRAINT PK_HORARIO_EMPLEADO_DET;
alter table HORARIO_EMPLEADO_DET
add constraint PK_HORARIO_EMPLEADO_DET
primary key (HOEM_ID,HOEM_DIA)
using index PK_HORARIO_EMPLEADO_DET;


UPDATE REVISION SET revi_nomina = '2008/12/05';

DROP TRIGGER NOMINA_DETALLE_PROV_BI;


DROP PROCEDURE CAUSA_NOMINA;
DROP TRIGGER NOMINA_DETALLE_BI;
DROP PROCEDURE DIAS_LABORADOS;


SET TERM ^ ;

CREATE OR ALTER PROCEDURE DIAS_LABORADOS(
    NITEMPL VARCHAR(20),
    PERIODO INTEGER,
    FEC DATE,
    MENSUAL CHAR(1))
RETURNS (
    TOTALDIASLAB INTEGER)
AS
DECLARE VARIABLE diasnolab INTEGER;
DECLARE VARIABLE diaslabxper INTEGER;
DECLARE VARIABLE perpago INTEGER;
DECLARE VARIABLE fecing DATE;
DECLARE VARIABLE DIASFEC INTEGER;
DECLARE VARIABLE DIASING INTEGER;
BEGIN
SELECT E.empl_ppago, E.empl_fecing
FROM EMPLEADOS E WHERE TERC_NIT = :nitempl
INTO :perpago, :fecing;
IF (mensual = 'N') THEN
BEGIN
IF (perpago = 1) THEN
diaslabxper = 30;
ELSE
IF (perpago = 2) THEN
diaslabxper = 15;
ELSE
IF (perpago = 3) THEN
diaslabxper = 7;
END
ELSE
diaslabxper = 30;
IF (SUBSTR(fecing,1,7) = SUBSTR(FEC,1,7)) THEN
BEGIN
diasfec = CAST(substr(fec,9,10) AS INTEGER);
diasing = CAST(substr(fecing,9,10) AS INTEGER);
diaslabxper = diasfec - diasing;
IF ((diaslabxper > 15) AND (perpago = 2)) THEN
diaslabxper = 15;
END
SELECT SUM (NONO_DURA)
FROM nomina_novedades WHERE TERC_NIT = :nitempl AND TNOV_COD = 9 AND NONO_PERIODO = :periodo
INTO :diasnolab;
totaldiaslab =  :diaslabxper - :diasnolab;
IF (totaldiaslab IS NULL) THEN
totaldiaslab =  :diaslabxper;
SUSPEND;
END
^

SET TERM ; ^



SET TERM ^ ;

CREATE OR ALTER PROCEDURE CAUSA_NOMINA(
    FEC DATE,
    PERIODO INTEGER,
    PERIODICIDAD INTEGER,
    PAGOGLOBAL CHAR(1),
    ANO CHAR(4))
RETURNS (
    IDNOMINA INTEGER)
AS
DECLARE VARIABLE item INTEGER;
DECLARE VARIABLE nite VARCHAR(20) CHARACTER SET none;
DECLARE VARIABLE nit_tercero VARCHAR(20);
DECLARE VARIABLE concept INTEGER;
DECLARE VARIABLE montos NUMERIC(18,2);
DECLARE VARIABLE porcen NUMERIC(9,4);
DECLARE VARIABLE entidad VARCHAR(20);
DECLARE VARIABLE conc_cod INTEGER;
DECLARE VARIABLE conc_deduc CHAR(1);
DECLARE VARIABLE conc_porc NUMERIC(9,4);
DECLARE VARIABLE conc_entidad INTEGER;
DECLARE VARIABLE conc_monto NUMERIC(18,2);
DECLARE VARIABLE conc_modifi CHAR(1);
DECLARE VARIABLE conc_promedio CHAR(1);
DECLARE VARIABLE emco_perprom INTEGER;
DECLARE VARIABLE valor NUMERIC(18,2);
DECLARE VARIABLE diaslab INTEGER;
DECLARE VARIABLE conc_prov CHAR(1);
DECLARE VARIABLE conc_aporte CHAR(1);
DECLARE VARIABLE numeroprom INTEGER;
DECLARE VARIABLE conc_aplicaprom CHAR(1);
DECLARE VARIABLE perinicial INTEGER;
DECLARE VARIABLE anoprom INTEGER;
DECLARE VARIABLE conc_dias CHAR(1);
DECLARE VARIABLE conc_otroconc CHAR(1);
DECLARE VARIABLE conc_codotroconc INTEGER;
DECLARE VARIABLE anosum INTEGER;
DECLARE VARIABLE salario CHAR(1) CHARACTER SET none;
DECLARE VARIABLE liquidaper INTEGER;
DECLARE VARIABLE rmod NUMERIC(2,2);
DECLARE VARIABLE basico NUMERIC(18,2);
DECLARE VARIABLE niteps VARCHAR(20);
DECLARE VARIABLE nitafc VARCHAR(20);
DECLARE VARIABLE nitafp VARCHAR(20);
DECLARE VARIABLE nitccf VARCHAR(20);
DECLARE VARIABLE gtoempr CHAR(1);
DECLARE VARIABLE comision NUMERIC(18,2);
DECLARE VARIABLE cambsaltrans NUMERIC(18,2);
DECLARE VARIABLE saldosini NUMERIC(18,2);
DECLARE VARIABLE duranov INTEGER;
DECLARE VARIABLE base NUMERIC(18,2);
DECLARE VARIABLE aprox INTEGER;
DECLARE VARIABLE mensual CHAR(1);
BEGIN
/* SI ES QUINCENAL */
EXECUTE PROCEDURE cambie_id_nomina RETURNING_VALUES(:idnomina);
INSERT INTO nomina (nomi_id, NOMI_FECCAUSA, NOMI_PAGOGLOBAL, NOMI_PERIODOCIDAD, NOMI_PERIODO, NOMI_ANO, NOMI_LIQOK)
VALUES (:IDNOMINA, :fec,:pagoglobal, :periodicidad, :periodo, :ano, 'N');
 BEGIN
    item = 1;
    FOR SELECT E.TERC_NIT, E.empl_salario, e.empl_eps, e.empl_afc, e.empl_afp, e.empl_ccf
    FROM EMPLEADOS E
    WHERE E.empl_ppago = :periodicidad AND E.empl_fecret IS NULL
    INTO :nite, :basico, :niteps, :nitafc, :nitafp, :nitccf
    DO
    BEGIN
    FOR SELECT CE.TERC_NIT, CE.CONC_COD, CE.EMCO_MONTO, CE.EMCO_PORC, ce.empl_entidad, CE.emco_perprom, CE.emco_luquidaper, CE.emco_mensual, CN.CONC_COD, CN.CONC_DEDUC,CN.CONC_PORC, CN.CONC_ENTIDAD, CN.CONC_MONTO,  CN.CONC_DIAS, CN.CONC_MODIFI,
    CN.CONC_PROMEDIO, CN.conc_salario, CE.emco_perprom, CN.conc_prov, CN.conc_aporte, CN.conc_aplicaprom, cn.conc_otroconc, cn.conc_codotroconc, CN.conc_gtoempr, CN.conc_base
    FROM empleado_conceptos CE, CONCEPTOS_NOMINA CN WHERE ((CE.terc_nit = :nite) AND (CE.CONC_COD = CN.CONC_COD) AND (CN.conc_fecini <= :fec AND CN.conc_fecfin >= :FEC) ) OR ((CE.terc_nit = :nite)
    AND (CE.CONC_COD = CN.CONC_COD) AND (cn.conc_todosper = 'N') AND (CE.emco_ppago = :periodo)) OR  ((CE.terc_nit = :nite) AND (CE.CONC_COD = CN.CONC_COD) AND cn.conc_todosper = 'S')  ORDER BY (TERC_NIT )
    INTO :nit_tercero, :concept,  :montos, :porcen, :entidad, :numeroprom, :liquidaper, :mensual ,:CONC_COD, :CONC_DEDUC, :CONC_PORC,
    :CONC_ENTIDAD, :CONC_MONTO, :CONC_DIAS, :CONC_MODIFI,:CONC_PROMEDIO, :salario,:EMCO_PERPROM, :conc_prov, :conc_aporte , :CONC_APLICAPROM, :conc_otroconc, :conc_codotroconc, :gtoempr, :base
    DO
BEGIN
    IF (conc_dias = 'S') THEN
    EXECUTE PROCEDURE DIAS_LABORADOS (:nite, :periodo, :fec, :mensual) RETURNING_VALUES (:diaslab);
    ELSE
    BEGIN
    diaslab = 15;
    IF (mensual = 'S') THEN
    BEGIN
    IF (periodicidad = 2) THEN
    diaslab = 30;
    ELSE
    IF (liquidaper = 3) THEN
    diaslab = 30;
    END
    END
 SELECT ((n.nono_valor /30) * n.nono_dura), (n.nono_dura) FROM nomina_novedades n WHERE n.tnov_cod = 11 AND n.terc_nit = :nite AND n.nono_periodo = :periodo INTO :cambsaltrans, :duranov;
 IF (cambsaltrans IS NULL) THEN
 cambsaltrans = 0;
 IF (duranov IS NULL) THEN
 duranov = 0;
 diaslab = :diaslab - :duranov;
 IF (conc_cod = 921) THEN
 BEGIN
 IF (porcen IS NOT NULL AND porcen <> 0) THEN
 valor = ((basico / 30)* :diaslab ) * :PORCEN /100;
 ELSE
 IF (conc_porc IS NOT NULL AND conc_porc <> 0) THEN
 valor = ((basico / 30)* :diaslab ) * :conc_porc /100;
 END
 ELSE
 IF (conc_cod = 922) THEN
 BEGIN
 SELECT P.prcu_monto FROM prestamo_cuotas P, prestamo_nomina PN WHERE P.prcu_ano = :ano AND P.prcu_periodo = :periodo AND PN.prno_id = P.prno_id AND PN.terc_nit = :nite INTO :valor;
 IF (valor IS NULL) THEN
 valor = 0;
 item = :item + 1;
 UPDATE prestamo_cuotas  P SET prcu_ok = 'S' WHERE P.prcu_ano = :ano AND P.prcu_periodo = :periodo AND P.prno_id = (SELECT PN.prno_id FROM PRESTAMO_NOMINA PN WHERE PN.terc_nit = :nite);
 END
 ELSE
 BEGIN
    IF ((:montos = 0) OR (:montos IS NULL)) THEN
      BEGIN
      IF ((CONC_PORC = 0 AND :porcen = 0) OR (CONC_PORC IS NULL AND :porcen = 0) OR (CONC_PORC = 0 AND :porcen IS NULL) OR (CONC_PORC IS NULL AND :porcen IS NULL) ) THEN
        BEGIN
        IF ((conc_monto <> 0) AND (conc_monto IS NOT NULL) ) THEN
        BEGIN
        VALOR = :CONC_MONTO;
        IF (:conc_dias = 'S') THEN
        valor = (:valor / 30) * :diaslab;
        END
        ELSE
        IF (salario = 'S' AND CONC_COD <> 900 AND CONC_COD <> 920) THEN
        BEGIN
        conc_monto = :basico;
        VALOR = (:conc_monto/30 * :diaslab ) + :cambsaltrans;
        END
        ELSE
        BEGIN
        valor = montos;
        IF (:conc_dias = 'S') THEN
        valor = (:valor / 30) * :diaslab;
        END
        END
       ELSE
       BEGIN
        IF (:porcen <> 0) THEN
          BEGIN
            IF ((conc_monto <> 0) AND (conc_monto IS NOT NULL) ) THEN
            BEGIN
              VALOR = ((:CONC_MONTO ) * :PORCEN) /100;
            END
          END
          ELSE
          BEGIN
            IF ((conc_monto <> 0) AND (conc_monto IS NOT NULL) ) THEN
            BEGIN
              VALOR = ((:CONC_MONTO) * :conc_porc) /100;
            END
            ELSE
        IF (salario = 'S' AND CONC_COD <> 900 AND CONC_COD <> 920) THEN
            BEGIN
              conc_monto = :basico;
              VALOR = ((:CONC_MONTO)+ :cambsaltrans * :conc_porc) /100;
            END
          END
       END
      END
    ELSE
    BEGIN
      IF ((CONC_PORC = 0 OR (conc_porc IS NULL)) AND (:porcen = 0 OR (porcen IS NULL))) THEN
      BEGIN
      VALOR = (:montos);
      IF (:conc_dias = 'S') THEN
      valor = (:valor / 30) * :diaslab;
      END
      ELSE
      BEGIN
        IF (:porcen <> 0 AND porcen IS NOT NULL) THEN
          BEGIN
          VALOR = ((:MONTOS ) * :PORCEN) /100;
          END
          ELSE
          BEGIN
          VALOR = ((:montos) * :CONC_PORC) /100;
          END
       END
   END
    IF (conc_promedio = 'S') THEN
    BEGIN
    perinicial = :periodo - (:numeroprom) + 1;
    anoprom = CAST (ano AS INTEGER);
    IF (perinicial <= 0) THEN
    BEGIN
    perinicial = 24 + :PERINICIAL;
    anoprom = CAST(ANO AS INTEGER) - 1;
    END
    SELECT SUM (noco_valor) FROM nomina_conceptos n WHERE n.noco_aplicaprom = 'S' AND N.noco_periodo >= :perinicial - 1 AND N.noco_periodo < :periodo AND N.noco_ano >= :anoprom AND N.noco_ano <= :ano AND terc_nit = :nite INTO :valor;
    valor = (valor / numeroprom);
    SELECT NOCO_VALOR FROM NOMINA_CONCEPTOS WHERE CONC_COD = :conc_cod AND TERC_NIT  = :nite AND NOCO_PAGOOK = 'N' AND NOCO_PERIODO = 0 INTO :saldosini;
    IF (saldosini IS NULL) THEN
    saldosini = 0;
    ELSE
    UPDATE nomina_conceptos N SET noco_pagook = 'S' WHERE n.noco_aplicaprom = 'S' AND N.noco_periodo >= :perinicial - 1 AND N.noco_periodo < :periodo AND N.noco_ano >= :anoprom AND N.noco_ano <= :ano  AND CONC_COD = :conc_cod AND terc_nit = :nite AND NOCO_PERIODO = 0;
    VALOR = :valor + :saldosini;
    UPDATE nomina_conceptos N SET noco_pagook = 'S' WHERE n.noco_aplicaprom = 'S' AND N.noco_periodo >= :perinicial - 1 AND N.noco_periodo < :periodo AND N.noco_ano >= :anoprom AND N.noco_ano <= :ano  AND CONC_COD = :conc_cod AND terc_nit = :nite;
    END
    IF (conc_otroconc = 'S') THEN
    BEGIN
    anosum = CAST(ano AS INTEGER);
    anosum = anosum - 1;
    SELECT SUM (noco_valor) FROM nomina_conceptos n WHERE n.noco_ano = :anosum AND n.conc_cod = :conc_codotroconc AND N.terc_nit = :nite INTO :valor;
    SELECT NOCO_VALOR FROM NOMINA_CONCEPTOS WHERE noco_ano = :anosum AND conc_cod = :conc_codotroconc AND terc_nit = :nite AND NOCO_PERIODO = 0 INTO :saldosini;
    IF (saldosini IS NULL) THEN
    saldosini = 0;
    ELSE
    UPDATE nomina_conceptos SET noco_pagook = 'S' WHERE noco_ano = :anosum AND conc_cod = :conc_codotroconc AND NOCO_PERIODO = 0 AND terc_nit = :nite;
    VALOR = :valor + :saldosini;
    UPDATE nomina_conceptos SET noco_pagook = 'S' WHERE noco_ano = :anosum AND conc_cod = :conc_codotroconc AND terc_nit = :nite;
    END
/*SI EL CONCEPTO ES UN APORTE*/
IF (conc_aporte = 'S') THEN
BEGIN
    IF ((:entidad = '' ) OR (entidad IS NULL)) THEN
    BEGIN
     SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
    IF (comision IS NULL) THEN
     comision = 0;
     valor = :basico + :comision;
    IF ((conc_cod = 904) OR (conc_cod = 905) OR (conc_cod = 906)) THEN
            BEGIN
            entidad = :nitafp;
                IF (conc_cod = 904) THEN
                BEGIN
                SELECT A.paan_afptr FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = (((((:basico /30) * :diaslab ) + :comision)+ :cambsaltrans) * :PORCEN) /100;
                END
                ELSE
                IF ((conc_cod = 905) OR (conc_cod = 906)) THEN
                BEGIN
                SELECT A.paan_afpem FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = (((((:basico /30) * :diaslab ) + :comision)+ :cambsaltrans) * :PORCEN) /100;
                END
            END
            ELSE
       IF ((conc_cod = 907) OR (conc_cod = 914) OR (conc_cod = 915)) THEN
            BEGIN
            entidad = :niteps;
                IF (conc_cod = 907) THEN
                BEGIN
                SELECT A.paan_epstr FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = (((((:basico )/30 * :diaslab ) + :comision)+ :cambsaltrans) * :PORCEN) /100;
                END
                ELSE
                IF ((conc_cod = 914) OR (conc_cod = 915)) THEN
                BEGIN
                SELECT A.paan_epsem FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = (((((:basico )/30 * :diaslab ) + :comision)+ :cambsaltrans) * :PORCEN) /100;
                END
            END
            ELSE
       IF ((conc_cod = 910) OR (conc_cod = 911) OR (conc_cod = 916) OR (conc_cod = 917) OR (conc_cod = 918) OR (conc_cod = 919)) THEN
            BEGIN
            entidad = :nitccf;
            SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
            IF (comision IS NULL) THEN
            comision = 0;
                IF ((conc_cod = 910) OR (conc_cod = 911) ) THEN
                BEGIN
                SELECT A.paan_ccf FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = (((((:basico )/30 * :diaslab ) + :comision)+ :cambsaltrans) * :PORCEN) /100;
                END
                ELSE
                IF ((conc_cod = 916) OR (conc_cod = 917)) THEN
                BEGIN
                SELECT A.paan_icbf FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = (((((:basico )/30 * :diaslab ) + :comision)+ :cambsaltrans) * :PORCEN) /100;
                END
                ELSE
                IF ((conc_cod = 918) OR (conc_cod = 919)) THEN
                BEGIN
                SELECT A.paan_sena FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = (((((:basico )/30 * :diaslab ) + :comision)+ :cambsaltrans) * :PORCEN) /100;
                END
            END
            ELSE
        IF ((conc_cod = 912) OR (conc_cod = 913)) THEN
            BEGIN
            entidad = :nitafc;
            SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
            IF (comision IS NULL) THEN
            comision = 0;
                IF ((conc_cod = 912) OR (conc_cod = 913) ) THEN
                BEGIN
                SELECT A.paan_cesemp FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = ((((:basico + :comision)/30 * :diaslab )+ :cambsaltrans) * :PORCEN) /100;
                END
            END
            ELSE
        BEGIN
        IF (comision IS NULL) THEN
        comision = 0;
        SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
        conc_monto = :basico + :comision;
        IF (conc_porc <> 0 AND conc_porc IS NOT NULL) THEN
        VALOR = (((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans) * :conc_porc) /100;
        ELSE
        IF (:porcen <> 0 AND :porcen IS NOT NULL) THEN
        VALOR = (((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans) * :porcen) /100;
        ELSE
        IF (:montos <> 0 AND :montos IS NOT NULL) THEN
        valor = :montos;
        ELSE
        IF (:conc_monto <> 0 AND :conc_monto IS NOT NULL) THEN
        valor = :conc_monto;
        END
    END
    END
    ELSE
    IF (conc_prov = 'S') THEN
    BEGIN
        conc_monto = :basico;
        IF (conc_porc <> 0 AND conc_porc IS NOT NULL) THEN
        VALOR = (((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans) * :conc_porc) /100;
        ELSE
        IF (porcen <> 0 AND porcen IS NOT NULL) THEN
        VALOR = (((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans) * :porcen) /100;
        ELSE
        IF (montos <> 0 AND montos IS NOT NULL) THEN
        VALOR = :montos;
        ELSE
        IF (conc_monto <> 0 AND conc_monto IS NOT NULL) THEN
        VALOR = :conc_monto;
    END
item = :item + 1;
END
 IF (conc_cod = 920) THEN
 BEGIN
 SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :valor;
 IF (valor IS NULL) THEN
 valor = 0;
 item = :item + 1;
 END
    EXECUTE PROCEDURE LEE_CONFIGURACION('NOMINA','GENERAL','REDONDEO AL MULTIPLO DE DIEZ EN TOTALES')RETURNING_VALUES(:aprox);
    EXECUTE PROCEDURE REDONDEE(:valor, :aprox) RETURNING_VALUES (VALOR);
    IF ((mensual = 'N') OR (periodicidad = 1))  THEN
    INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
    VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
    ELSE
    IF (mensual = 'S') THEN
    BEGIN
         IF ((:periodicidad = 2) AND (liquidaper = 1)) THEN
         BEGIN
          IF ((periodo = 1) OR (periodo = 3) OR (periodo = 5) OR (periodo = 7) OR (periodo = 9) OR (periodo = 11)
          OR (periodo = 13) OR (periodo = 15) OR (periodo = 17) OR (periodo = 19) OR (periodo = 21) OR (periodo = 23)) THEN
             INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
             VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
         END
         ELSE
         IF ((:periodicidad = 2) AND (liquidaper = 2)) THEN
         BEGIN
          IF ((periodo = 2) OR (periodo = 4) OR (periodo = 6) OR (periodo = 8) OR (periodo = 10) OR (periodo = 12)
          OR (periodo = 14) OR (periodo = 16) OR (periodo = 18) OR (periodo = 20) OR (periodo = 22) OR (periodo = 24)) THEN
             INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
             VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
         END
         ELSE
         IF ((:periodicidad = 3) AND (liquidaper = 1)) THEN
         BEGIN
          IF ((periodo = 1) OR (periodo = 5) OR (periodo = 9) OR (periodo = 13) OR (periodo = 17) OR (periodo = 21)
          OR (periodo = 25) OR (periodo = 29) OR (periodo = 33) OR (periodo = 37) OR (periodo = 41) OR (periodo = 45)
          OR (periodo = 49)) THEN
             INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
             VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
         END
         ELSE
         IF ((:periodicidad = 3) AND (liquidaper = 2)) THEN
         BEGIN
          IF ((periodo = 2) OR (periodo = 6) OR (periodo = 10) OR (periodo = 14) OR (periodo = 18) OR (periodo = 22)
          OR (periodo = 26) OR (periodo = 30) OR (periodo = 34) OR (periodo = 38) OR (periodo = 42) OR (periodo = 46)
          OR (periodo = 50)) THEN
            INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
             VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
         END
         ELSE
         IF ((:periodicidad = 3) AND (liquidaper = 3)) THEN
         BEGIN
          IF ((periodo = 3) OR (periodo = 7) OR (periodo = 11) OR (periodo = 15) OR (periodo = 19) OR (periodo = 23)
          OR (periodo = 27) OR (periodo = 31) OR (periodo = 35) OR (periodo = 39) OR (periodo = 43) OR (periodo = 47)
          OR (periodo = 51)) THEN
            INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
             VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
         END
         ELSE
         IF ((:periodicidad = 3) AND (liquidaper = 4)) THEN
         BEGIN
          IF ((periodo = 4) OR (periodo = 8) OR (periodo = 12) OR (periodo = 16) OR (periodo = 20) OR (periodo = 24)
          OR (periodo = 29) OR (periodo = 32) OR (periodo = 36) OR (periodo = 40) OR (periodo = 44) OR (periodo = 48)
          OR (periodo = 52)) THEN
            INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
             VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
         END
    END
  END
 END
END
SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

create trigger NOMINA_DETALLE_BI for NOMINA_DETALLE
active BEFORE INSERT position 0
as
declare variable PERIODO INTEGER;
declare variable fec date;
begin
SELECT N.nomi_periodo, n.nomi_feccausa FROM NOMINA N WHERE N.nomi_id = NEW.nomi_id INTO :periodo, :fec;
EXECUTE PROCEDURE DIAS_LABORADOS (NEW.terc_nit, :periodo, :fec, 'N')returning_values(NEW.node_diaslab);
end
^

SET TERM ; ^

GRANT UPDATE,REFERENCES ON NOMINA_DETALLE TO TRIGGER NOMINA_DETALLE_BI;
GRANT SELECT ON NOMINA TO TRIGGER NOMINA_DETALLE_BI;
GRANT EXECUTE ON PROCEDURE DIAS_LABORADOS TO TRIGGER NOMINA_DETALLE_BI;

UPDATE REVISION SET revi_nomina = '2008/12/09';

CREATE TABLE ENTRADAS_SALIDAS_EMPLEADO (
    INEN_ID      INTEGER NOT NULL,
    TERC_NIT     NIT,
    INEN_HOREN   TIME,
    INEN_HORSAL  TIME,
    INEN_FECHA   DATE
);

ALTER TABLE ENTRADAS_SALIDAS_EMPLEADO ADD CONSTRAINT PK_INGRESOS_ENTRADAS_EMPLEADO PRIMARY KEY (INEN_ID);

CREATE GENERATOR ID_ENTRSALEMPL;

SET TERM ^ ;

create procedure CAMBIE_ID_ENTRSALEMPL
returns (ID INTEGER)
AS
declare variable NUMROWS INTEGER;
BEGIN
NUMROWS = 1;
while (NUMROWS > 0) DO
    BEGIN
    ID = GEN_ID(id_entrsalempl, 1);
    /* VERIFIQUE SI YA EXISTE */
    SELECT COUNT(*) FROM entradas_salidas_empleado E WHERE E.inen_id = :ID INTO :NUMROWS;
    END
SUSPEND;
END
^

SET TERM ; ^

ALTER TABLE ENTRADAS_SALIDAS_EMPLEADO DROP INEN_FECHA;
ALTER TABLE ENTRADAS_SALIDAS_EMPLEADO ADD INEN_FECHA DATE;

UPDATE REVISION SET revi_nomina = '2008/12/10';


CREATE TABLE DOCUMENTOS_IMPORT_EMPLEADO (
    TERC_NIT VARCHAR(20)NOT NULL,
    DOEM_ITEM INTEGER NOT NULL,
    DOEM_DOC BLOB SUB_TYPE 0 SEGMENT SIZE 80);
alter table DOCUMENTOS_IMPORT_EMPLEADO
add constraint PK_DOCUMENTOS_IMPORT_EMPLEADO
primary key (TERC_NIT,DOEM_ITEM);

UPDATE REVISION SET revi_nomina = '2008/12/12';
SET TERM ^ ;

create trigger DOCUMENTOS_IMPORT_EMPLEADO_BI for DOCUMENTOS_IMPORT_EMPLEADO
active BEFORE INSERT position 0
as
declare variable maxitem integer;
begin
select max(P.doem_item) from DOCUMENTOS_IMPORT_EMPLEADO P WHERE P.terc_nit = NEW.terc_nit INTO :maxitem;
if (MAXITEM IS NULL) then
MAXITEM = 0;
NEW.doem_item = maxitem + 1;
end
^

SET TERM ; ^

GRANT SELECT,UPDATE,REFERENCES ON DOCUMENTOS_IMPORT_EMPLEADO TO TRIGGER DOCUMENTOS_IMPORT_EMPLEADO_BI;

UPDATE REVISION SET revi_nomina = '2008/12/15';

DELETE FROM PARENTESCO;

INSERT INTO PARENTESCO (PARE_COD, PARE_NOM, PARE_CODIGO) VALUES ('H', 'HIJO', 1);
INSERT INTO PARENTESCO (PARE_COD, PARE_NOM, PARE_CODIGO) VALUES ('P', 'PADRE', 2);
INSERT INTO PARENTESCO (PARE_COD, PARE_NOM, PARE_CODIGO) VALUES ('M', 'MADRE', 3);
INSERT INTO PARENTESCO (PARE_COD, PARE_NOM, PARE_CODIGO) VALUES ('E', 'HERMANO', 4);
INSERT INTO PARENTESCO (PARE_COD, PARE_NOM, PARE_CODIGO) VALUES ('S', 'SOBRINO', 5);
INSERT INTO PARENTESCO (PARE_COD, PARE_NOM, PARE_CODIGO) VALUES ('T', 'TIO', 6);
INSERT INTO PARENTESCO (PARE_COD, PARE_NOM, PARE_CODIGO) VALUES ('A', 'ABUELA', 7);
INSERT INTO PARENTESCO (PARE_COD, PARE_NOM, PARE_CODIGO) VALUES ('O', 'ABUELO', 8);
INSERT INTO PARENTESCO (PARE_COD, PARE_NOM, PARE_CODIGO) VALUES ('X', 'ESPOSA', 9);

SET TERM ^ ;

create trigger PAGO_NOMINA_DET_BI for PAGO_NOMINA_DET
active BEFORE INSERT position 0
as
begin
if (NEW.terc_nit IS NULL) then
SELECT P.pgno_nit FROM pago_nomina P WHERE P.pgno_id = NEW.pgno_id INTO NEW.terc_nit;
end
^

SET TERM ; ^

GRANT UPDATE,REFERENCES ON PAGO_NOMINA_DET TO TRIGGER PAGO_NOMINA_DET_BI;
GRANT SELECT ON PAGO_NOMINA TO TRIGGER PAGO_NOMINA_DET_BI;

SET TERM ^ ;

ALTER PROCEDURE EGRESO_NOMINA(
    IDNOMINA INTEGER,
    PGLOBAL CHAR(1),
    NITBENE VARCHAR(20),
    FECHAEGR DATE,
    PREF VARCHAR(4),
    NUMEROEGR VARCHAR(6),
    CONCEPTO VARCHAR(60),
    OBSERVACIONES BLOB SUB_TYPE 0 SEGMENT SIZE 80,
    NOMBREBENE VARCHAR(60),
    CAJA INTEGER,
    USUARIOEGR VARCHAR(10),
    PAGO CHAR(1),
    CUENTAID INTEGER,
    FECHAEGRBNCO DATE,
    PREFEGREBNCO VARCHAR(4),
    NUMEROEGREBNCO VARCHAR(6),
    BENEBNCO VARCHAR(60),
    CONCEPTOBNCO VARCHAR(60),
    GMF CHAR(1),
    FORMAPAGOID INTEGER,
    CAJABNCO VARCHAR(2),
    CAJABNCOCUENTA VARCHAR(20),
    CAJABNCONUMEROEGR VARCHAR(20),
    FORMULARIO VARCHAR(10))
AS
declare variable porcreten numeric(9,4);
declare variable nitempl varchar(60);
declare variable idpago integer;
declare variable totdevenempl numeric(18,2);
declare variable retencionempl numeric(18,2);
declare variable periodicidad integer;
declare variable idegreso integer;
declare variable nitemplnglo varchar(20) character set none;
declare variable numegresointeger integer;
declare variable ok char(1) character set none;
declare variable itempago integer;
declare variable he numeric(18,2);
declare variable hed numeric(18,2);
declare variable hen numeric(18,2);
declare variable hefd numeric(18,2);
declare variable hefn numeric(18,2);
declare variable otrosdev numeric(18,2);
declare variable otrosded integer;
declare variable pagoempl char(1);
declare variable periodo integer;
declare variable nomiano char(4);
declare variable emplnom varchar(60);
declare variable devengos numeric(18,2);
declare variable deducibles numeric(18,2);
declare variable total numeric(18,2);
declare variable reten numeric(18,2);
begin
select nomi_pagook, nomi_periodo, nomi_ano from nomina where nomi_id = :idnomina into :ok, :periodo, :nomiano;
if (ok = 'N') then
BEGIN
if (pglobal = 'S') then
BEGIN
/*    for select terc_nit from nomina_detalle WHERE NOMI_ID = :idnomina INTO :nitemplnglo
    do
    begin */
    SELECT SUM (NC.CONO_ABONO) FROM CONSOLIDADO_NOMINA NC WHERE NC.CONO_IDORI = :IDNOMINA AND CONO_TIPOORI = 92 and cono_pagook = 'N'
    AND CONO_prov = 'N' AND CONO_APORTE = 'N' and CONO_DEB = 'S'
        INTO :total;
    if((:TOTAL IS NOT NULL) and (:total <> 0)) then
    BEGIN
    EXECUTE PROCEDURE cambie_id_egreso returning_values (:idegreso);
    INSERT INTO egresos (EGRE_ID, TIDO_COD, PREF_PRE, EGRE_numero, EGRE_fecha, EGRE_CONC, EGRE_MONTO, EGRE_RTFTEMONTO, EGRE_OBS, EGRE_NOMTERC, EGRE_ANULADO, EGRE_TRANSMIT, TERC_NIT, EGRE_TIPO, CAJA_ID, EGRE_usuario, NUMOK, CLEG_ID)
                 VALUES (:idegreso,62, :pref, :numeroegr, :fechaegr, :concepto, :total, 0, :observaciones, :nombrebene, 'N', 'N', :nitbene, '3', :caja, :usuarioegr, 'S', 0);
    if (pago = 'B') then
    INSERT INTO egresos_banco (EGRE_ID, EGBC_TIPOBCO, CUBA_COD, EGBC_numero, EGBC_fecha, PRBA_PREF, EGBC_BENEF, EGBC_MONTO, EGBC_CONCEPTO, EGBC_GMF, EGBC_ANULADO, EGBC_TRANSMIT) VALUES (:idegreso, 72, :cuentaid, :numeroegrebnco, :fechaegrbnco, :prefegrebnco, :benebnco, :total, :conceptobnco, :gmf, 'N', 'N');
    ELSE
    if (pago = 'C') then
    INSERT INTO egresos_caja (EGRE_ID, EGCA_ITEM, CAJA_ID, FOPA_ID, EGCA_BANCO, EGCA_CUENTA, EGCA_numero, EGCA_fecha, EGCA_MONTO, EGCA_ANULADO, EGCA_TRANSMIT) VALUES (:idegreso, 1, :caja, :formapagoid, :cajabnco, :cajabncocuenta, :cajabnconumeroegr, :fechaegr, :total, 'N', 'N');
    /*REGISTRE EL PAGO*/
    idpago = GEN_ID(id_pagonomi, 1);
    insert INTO pago_nomina (pgno_id, pgno_fecha, pgno_tipopago, pgno_egreid, pgno_egrepre, pgno_egrenum, pgno_monto, pgno_nomina, pgno_nit, pgno_formulario, PGNO_ANT)
                 VALUES (:idpago, :fechaegr, :pago , :idegreso, :pref, :numeroegr, :total, :idnomina, :nitbene, :formulario, 'N');
    update NOMINA SET NOMI_pagook = 'N' WHERE NOMI_ID = :IDNOMINA;
    END
    FOR SELECT TERC_NIT FROM nomina_detalle WHERE NOMI_ID = :idnomina into :nitemplnglo
    DO
    BEGIN
    SELECT SUM (NC.CONO_ABONO) FROM CONSOLIDADO_NOMINA NC WHERE NC.CONO_IDORI = :IDNOMINA AND CONO_TIPOORI = 92 and cono_pagook = 'N'
    AND CONO_prov = 'N' AND CONO_APORTE = 'N' and CONO_DEB = 'S'
        INTO :total;
    select max (pgno_item), max (pgno_id) from pago_nomina_det WHERE PGNO_ID = :idpago INTO :itempago, :idpago;
    if (:itempago IS NULL) then
    itempago = 0;
    itempago = :itempago + 1;
    insert INTO pago_nomina_det  (pgno_id, terc_nit, pgnd_monto, pgno_item)
                 VALUES (:idpago, :nitemplnglo, :total, :itempago);
    END
/*    end*/
END
ELSE
if (pglobal = 'N') then
BEGIN
    EXECUTE PROCEDURE cambie_id_egreso returning_values (:idegreso);
    EXECUTE PROCEDURE cambie_id_pago_nomina returning_values (:idpago);
    FOR SELECT TERC_NIT FROM nomina_detalle WHERE NOMI_ID = :idnomina into :nitemplnglo
    DO
    BEGIN
    SELECT SUM (cono_abono) FROM CONSOLIDADO_NOMINA WHERE CONO_IDORI = :IDNOMINA AND CONO_TIPOORI = 92 and cono_pagook = 'N'
    AND CONO_deduc = 'N' AND cono_prov = 'N' and CONO_DEB = 'S' and TERC_NIT = :nitemplnglo
    INTO :totdevenempl;
    SELECT NOMI_PERIODOCIDAD FROM nomina WHERE NOMI_ID = :idnomina INTO :periodicidad;
    SELECT SUM (NC.CONO_ABONO) FROM CONSOLIDADO_NOMINA NC WHERE NC.CONO_IDORI = :IDNOMINA AND CONO_TIPOORI = 92 and cono_pagook = 'N'
    AND CONO_prov = 'N' AND CONO_APORTE = 'N' and CONO_DEB = 'S' AND TERC_NIT = :nitemplnglo
        INTO :total;
    SELECT TERC_NOM FROM TERCEROS WHERE TERC_NIT = :nitemplnglo INTO :emplnom;
    concepto = 'PAGO NOMINA ' || 'DEL PERIODO ' || CAST (periodo AS CHAR(2)) || ' DEL ' || nomiano;
    if((:TOTAL IS NOT NULL) or (:total <> 0)) then
    BEGIN
    INSERT INTO egresos (EGRE_ID, TIDO_COD, PREF_PRE, EGRE_numero, EGRE_fecha, EGRE_CONC, EGRE_MONTO, EGRE_RTFTEMONTO, EGRE_OBS, EGRE_NOMTERC, EGRE_ANULADO, EGRE_TRANSMIT, TERC_NIT, EGRE_TIPO, CAJA_ID, EGRE_usuario, NUMOK, CLEG_ID)
                 VALUES (:idegreso,62, :pref, :numeroegr, :fechaegr, :concepto, :total, :reten, :observaciones, :emplnom, 'N', 'N', :nitemplnglo, '3', :caja, :usuarioegr, 'S', 0);
    SELECT empl_formpago FROM EMPLEADOS WHERE TERC_NIT = :nitemplnglo INTO :pagoempl;
    if (pagoempl = 'B') then
    begin
    conceptobnco = :concepto;
    INSERT INTO egresos_banco (EGRE_ID, EGBC_TIPOBCO, CUBA_COD, EGBC_numero, EGBC_fecha, PRBA_PREF, EGBC_BENEF, EGBC_MONTO, EGBC_CONCEPTO, EGBC_GMF, EGBC_ANULADO, EGBC_TRANSMIT)
                       VALUES (:idegreso, 72, :cuentaid, :numeroegrebnco, :fechaegrbnco, :prefegrebnco, :nitemplnglo, :total, :conceptobnco, :gmf, 'N', 'N');
    end
    ELSE
    if (pagoempl = 'C') then
    INSERT INTO egresos_caja (EGRE_ID, EGCA_ITEM, CAJA_ID, FOPA_ID, EGCA_BANCO, EGCA_CUENTA, EGCA_numero, EGCA_fecha, EGCA_MONTO, EGCA_ANULADO, EGCA_TRANSMIT)
                 VALUES (:idegreso, 1, :caja, :formapagoid, :cajabnco, :cajabncocuenta, :cajabnconumeroegr, :fechaegr, :total, 'N', 'N');
    END
    EXECUTE PROCEDURE cambie_id_pago_nomina returning_values (:idpago);
    INSERT INTO pago_nomina (pgno_id, pgno_fecha, pgno_tipopago, pgno_egreid, pgno_egrepre, pgno_egrenum, pgno_monto, pgno_nomina, pgno_nit, pgno_formulario, PGNO_ANT)
                 VALUES (:idpago, :fechaegr, :pago , :idegreso, :pref, :numeroegr, 0, :idnomina, '', :formulario, 'N');
    SELECT SUM (cono_abono) FROM CONSOLIDADO_NOMINA WHERE CONO_IDORI = :IDNOMINA AND CONO_TIPOORI = 92 and cono_pagook = 'N'
    AND CONO_deduc = 'N' AND cono_prov = 'N' and TERC_NIT = :nitemplnglo
    INTO :totdevenempl;
    SELECT NOMI_PERIODOCIDAD FROM nomina WHERE NOMI_ID = :idnomina INTO :periodicidad;
    select max (pgno_item) from pago_nomina_det WHERE PGNO_ID = :idpago INTO :itempago;
    if (:itempago IS NULL) then
    itempago = 0;
    itempago = :itempago + 1;
    insert INTO pago_nomina_det  (pgno_id, terc_nit, pgnd_monto, pgno_item)
                 VALUES (:idpago, :nitemplnglo, :total, :itempago);
    numegresointeger = cast (numeroegr as integer);
    numegresointeger = numegresointeger + 1;
    execute procedure completa_ceros(numegresointeger)returning_values :numeroegr;
update CONSOLIDADO_NOMINA NC set nc.cono_pagook = 'S' WHERE NC.CONO_IDORI = :IDNOMINA AND CONO_TIPOORI = 92 and cono_pagook = 'N'
    AND CONO_prov = 'N' AND CONO_APORTE = 'N' and CONO_DEB = 'S' AND TERC_NIT = :nitemplnglo;
END
END
END
ELSE
exception nomina_con_pago;
END
^

SET TERM ; ^

 INSERT INTO TIPO_ID (TIID_COD, TIID_NOM, TIID_CODIGO) VALUES ('U', 'NIUP', 40);

SET TERM ^ ;

ALTER TRIGGER NOMINA_AD
ACTIVE AFTER DELETE POSITION 0
AS
declare variable consec INTEGER;
BEGIN
/* borre la contabilización */
select enco_consec from comprobante_encabezado where enco_tiporef = 92 and enco_idref = old.nomi_id INTO :consec;
if (NOT consec is null) then
  delete from comprobante_detalle where enco_consec = :consec;
  delete from comprobante_encabezado where enco_tiporef = 92 and enco_idref = OLD.nomi_id;

  delete from consolidado_nomina  where cono_tipoori = 92 and cono_idori = OLD.nomi_id;
end
^

SET TERM ; ^

  SET TERM ^ ;

ALTER TRIGGER VACACIONES_AI
ACTIVE AFTER INSERT POSITION 0
as
declare variable PPAGO INTEGER;
begin
SELECT E.empl_ppago FROM EMPLEADOS E WHERE E.terc_nit = NEW.terc_nit INTO :ppago;
INSERT INTO NOMINA_NOVEDADES (nono_id, terc_nit, tnov_cod, nono_dura, nono_valor, nono_ppago,nono_periodo, nono_fecha, nono_ok, nono_ano)
            VALUES (GEN_ID(id_nomi_novedades, 1), new.terc_nit,6, NEW.vaca_dias, NEW.vaca_monto, :ppago,NEW.vaca_periodo, NEW.vaca_fecha, 'S', substr(new.vaca_fecha,1,4));
end
^

SET TERM ; ^



update RDB$RELATION_FIELDS set
RDB$NULL_FLAG = NULL
where (RDB$FIELD_NAME = 'NONO_PPAGO') and
(RDB$RELATION_NAME = 'NOMINA_NOVEDADES')
;

SET TERM ^ ;

CREATE PROCEDURE IMPR_APORTES (
    IDDOC INTEGER)
RETURNS (
    ITEM INTEGER,
    TIPOAP CHAR(1) CHARACTER SET NONE,
    CONPAGO CHAR(1) CHARACTER SET NONE,
    ADMINI VARCHAR(20) CHARACTER SET NONE,
    NOMADMIN VARCHAR(60) CHARACTER SET NONE,
    MONTO NUMERIC(18,2),
    INTMORA NUMERIC(18,2),
    FECHA DATE,
    FORMULARIO VARCHAR(10) CHARACTER SET NONE,
    ITEMDET INTEGER,
    NITEMPL VARCHAR(20) CHARACTER SET NONE,
    NOMEMPL VARCHAR(60) CHARACTER SET NONE,
    IBC NUMERIC(18,2),
    COTOBL NUMERIC(18,2),
    VALORNORET NUMERIC(18,2),
    TIPAP CHAR(3) CHARACTER SET NONE)
AS
BEGIN
  EXIT;
END^



SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE IMPR_APORTES (
    IDDOC INTEGER)
RETURNS (
    ITEM INTEGER,
    TIPOAP CHAR(1) CHARACTER SET NONE,
    CONPAGO CHAR(1) CHARACTER SET NONE,
    ADMINI VARCHAR(20) CHARACTER SET NONE,
    NOMADMIN VARCHAR(60) CHARACTER SET NONE,
    MONTO NUMERIC(18,2),
    INTMORA NUMERIC(18,2),
    FECHA DATE,
    FORMULARIO VARCHAR(10) CHARACTER SET NONE,
    ITEMDET INTEGER,
    NITEMPL VARCHAR(20) CHARACTER SET NONE,
    NOMEMPL VARCHAR(60) CHARACTER SET NONE,
    IBC NUMERIC(18,2),
    COTOBL NUMERIC(18,2),
    VALORNORET NUMERIC(18,2),
    TIPAP CHAR(3) CHARACTER SET NONE)
AS
BEGIN
FOR SELECT P.pgap_item,P.pgap_tipoap,P.pgap_conpago,P.pgap_admin,T.terc_nom,P.pgap_monto,P.pgap_intmora,P.pgap_fecha,P.pgap_formulario FROM pago_aportes P, TERCEROS T WHERE P.pgap_id = :iddoc AND T.terc_nit = P.pgap_admin
       INTO :item,:tipoap,:conpago,:admini,:nomadmin,:monto,:intmora,:fecha,:formulario
  DO
  BEGIN
  FOR SELECT D.pade_itemdet,D.terc_nit,T.terc_nom ,D.pade_ibc,D.pade_cotobl,D.pade_valornoret,D.pade_tipap  FROM PAGO_APORTES_DETALLE D, terceros T WHERE D.pgap_item = :item AND D.pgap_id = :iddoc AND T.terc_nit = D.terc_nit
       INTO :itemdet,:nitempl,:nomempl,:ibc,:cotobl,:valornoret,:tipap
       DO
       SUSPEND;
  END
END
^


SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER PROCEDURE REP_HOJADEVIDA(
    NITEMPL VARCHAR(20))
RETURNS (
    NOMBREEMPL VARCHAR(60),
    INSTITU VARCHAR(60),
    PROGRAMA VARCHAR(60),
    DESDE VARCHAR(20),
    HASTA VARCHAR(20),
    EMPRESA VARCHAR(60),
    DESDEEX DATE,
    HASTAEX DATE,
    CARGO VARCHAR(60),
    FUNCIONES BLOB SUB_TYPE 0 SEGMENT SIZE 80,
    nitbene  VARCHAR(20),
    NOMBENE VARCHAR(60),
    PARENTBENE VARCHAR(20),
    EPS VARCHAR(60),
    AFP VARCHAR(60),
    ARP VARCHAR(60),
    CCF VARCHAR(60),
    FOTO BLOB)
AS
BEGIN
FOR SELECT T.terc_nom FROM TERCEROS T WHERE T.terc_nit = :nitempl INTO :nombreempl
DO
BEGIN
SELECT E.empl_foto FROM EMPLEADOS E WHERE E.terc_nit = :nitempl INTO :foto;
FOR SELECT E.edfo_insti, E.edfo_programa, E.edfo_desde, E.edfo_hasta FROM EDUCACION_FORMAL_EMPLEADO E WHERE E.terc_nit = :nitempl INTO :institu, :programa, :desde, :hasta
DO
BEGIN
  SUSPEND;
END
institu = '';
programa = '';
desde = '';
hasta = '';
FOR SELECT  X.exla_empresa, X.exla_desde, X.exla_hasta, X.exla_cargo, X.exla_funciones FROM EXPERIENCIA_LABORAL_EMPLEADO X WHERE X.terc_nit = :nitempl INTO :empresa, :desdeex, :hastaex, :cargo, :funciones
DO
BEGIN
  SUSPEND;
END
empresa = '';
desdeex= NULL;
hastaex = NULL;
cargo = '';
funciones = NULL;
FOR SELECT E.embe_docid,E.embe_apellido1 || ' ' || E.embe_apellido2 || ' ' || E.embe_nombre1, P.pare_nom FROM EMPLEADO_BENEFICIARIOS E, PARENTESCO P WHERE P.pare_cod = E.embe_parent AND E.terc_nit = :nitempl
    INTO :nitbene, :nombene, :parentbene
    DO
  SUSPEND;

nitbene = '';
nombene = '';
parentbene = '';
SELECT T.terc_nom FROM EMPLEADOS E, TERCEROS T  WHERE T.terc_nit = E.empl_eps AND E.terc_nit = :nitempl INTO :eps;
SELECT T.terc_nom FROM EMPLEADOS E, TERCEROS T  WHERE T.terc_nit = E.empl_arp AND E.terc_nit = :nitempl INTO :arp;
SELECT T.terc_nom FROM EMPLEADOS E, TERCEROS T  WHERE T.terc_nit = E.empl_afp AND E.terc_nit = :nitempl INTO :afp;
SELECT T.terc_nom FROM EMPLEADOS E, TERCEROS T  WHERE T.terc_nit = E.empl_ccf AND E.terc_nit = :nitempl INTO :ccf;
SUSPEND;
eps = '';
arp = '';
afp = '';
ccf = '';
END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE PROCEDURE REP_HISTOEMPL (
    FECDESDE DATE,
    FECHASTA DATE,
    PERDESDE INTEGER,
    PERHASTA INTEGER,
    PERIODICIDAD INTEGER)
RETURNS (
    NOMI_FECCAUSA DATE,
    CONC_NOMBRE VARCHAR(60) CHARACTER SET NONE,
    CONC_COD INTEGER,
    TERC_NIT VARCHAR(20) CHARACTER SET NONE,
    NOCO_VALOR NUMERIC(18,2),
    NOCO_ENTIDAD VARCHAR(20) CHARACTER SET NONE,
    NOCO_DEDUC CHAR(1) CHARACTER SET NONE,
    NOCO_PROV CHAR(1) CHARACTER SET NONE,
    NOCO_APORTE CHAR(1) CHARACTER SET NONE,
    NOCO_PAGOOK CHAR(1) CHARACTER SET NONE,
    NOCO_PERIODO INTEGER,
    NOCO_ANO CHAR(4) CHARACTER SET NONE,
    NOCO_APLICAPROM CHAR(1) CHARACTER SET NONE,
    NOCO_SALARIO CHAR(1) CHARACTER SET NONE,
    NOCO_GTOEMPR CHAR(1) CHARACTER SET NONE,
    CONC_NOMCORTO VARCHAR(60) CHARACTER SET NONE,
    PNOM_NOMBRE VARCHAR(60) CHARACTER SET NONE,
    TERC_NOM VARCHAR(60) CHARACTER SET NONE)
AS
BEGIN
  EXIT;
END^



SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE REP_HISTOEMPL (
    FECDESDE DATE,
    FECHASTA DATE,
    PERDESDE INTEGER,
    PERHASTA INTEGER,
    PERIODICIDAD INTEGER)
RETURNS (
    NOMI_FECCAUSA DATE,
    CONC_NOMBRE VARCHAR(60) CHARACTER SET NONE,
    CONC_COD INTEGER,
    TERC_NIT VARCHAR(20) CHARACTER SET NONE,
    NOCO_VALOR NUMERIC(18,2),
    NOCO_ENTIDAD VARCHAR(20) CHARACTER SET NONE,
    NOCO_DEDUC CHAR(1) CHARACTER SET NONE,
    NOCO_PROV CHAR(1) CHARACTER SET NONE,
    NOCO_APORTE CHAR(1) CHARACTER SET NONE,
    NOCO_PAGOOK CHAR(1) CHARACTER SET NONE,
    NOCO_PERIODO INTEGER,
    NOCO_ANO CHAR(4) CHARACTER SET NONE,
    NOCO_APLICAPROM CHAR(1) CHARACTER SET NONE,
    NOCO_SALARIO CHAR(1) CHARACTER SET NONE,
    NOCO_GTOEMPR CHAR(1) CHARACTER SET NONE,
    CONC_NOMCORTO VARCHAR(60) CHARACTER SET NONE,
    PNOM_NOMBRE VARCHAR(60) CHARACTER SET NONE,
    TERC_NOM VARCHAR(60) CHARACTER SET NONE)
AS
BEGIN
FOR SELECT MAX(O.nomi_feccausa),MAX(C.conc_nombre),MAX(N.conc_cod), MAX(N.terc_nit),SUM(N.noco_valor),MAX(N.noco_entidad),MAX(N.noco_deduc),MAX(N.noco_prov),MAX(N.noco_aporte),MAX(N.noco_pagook), MAX(N.noco_periodo),MAX(N.noco_ano), MAX(N.noco_aplicaprom),MAX(N.noco_salario),MAX(N.noco_gtoempr),MAX(C.conc_nomcorto),MAX(P.pnom_nombre),MAX(T.terc_nom)
FROM NOMINA_CONCEPTOS N, CONCEPTOS_NOMINA C, NOMINA O, PERIODO_PAGO_NOMBRE P, TERCEROS T
WHERE N.noco_periodo <> 0 AND c.conc_cod = n.conc_cod AND O.nomi_id = N.nomi_id AND P.ppag_periodo = N.noco_periodo AND O.nomi_periodocidad = P.ppag_cod AND T.terc_nit = N.terc_nit AND o.nomi_feccausa >= :fecdesde AND o.nomi_feccausa <= :fechasta and o.nomi_periodo >= :perdesde and o.nomi_periodo <= :perhasta and o.nomi_periodocidad = :periodicidad
GROUP BY N.conc_cod,N.terc_nit
INTO :nomi_feccausa, :conc_nombre, :conc_cod, :terc_nit, :noco_valor,:noco_entidad, :noco_deduc, :noco_prov, :noco_aporte, :noco_pagook, :noco_periodo, :noco_ano,:noco_aplicaprom, :noco_salario, :noco_gtoempr, :conc_nomcorto, :pnom_nombre, :terc_nom
DO
  SUSPEND;
END
^


SET TERM ; ^

SET TERM ^ ;

CREATE PROCEDURE HISTORICO_EMPLEADO (
    FEC DATE,
    PERDESDE INTEGER,
    PERHASTA INTEGER,
    EMPLDESDE VARCHAR(20) CHARACTER SET NONE,
    EMPLHASTA VARCHAR(20) CHARACTER SET NONE)
RETURNS (
    FECNOM DATE,
    CONCNOM VARCHAR(60) CHARACTER SET NONE,
    COD INTEGER,
    NIT VARCHAR(20) CHARACTER SET NONE,
    VALOR NUMERIC(18,2),
    ENTIDAD VARCHAR(20) CHARACTER SET NONE,
    DEDUC CHAR(1) CHARACTER SET NONE,
    PROV CHAR(1) CHARACTER SET NONE,
    APORTE CHAR(1) CHARACTER SET NONE,
    PAGOOK CHAR(1) CHARACTER SET NONE,
    PERIODO INTEGER,
    ANO CHAR(4) CHARACTER SET NONE,
    APLICAPROM CHAR(1) CHARACTER SET NONE,
    SALARIO CHAR(1) CHARACTER SET NONE,
    GTOEMPR CHAR(1) CHARACTER SET NONE,
    NOMCORTO VARCHAR(60) CHARACTER SET NONE,
    NOMPER VARCHAR(60) CHARACTER SET NONE,
    NOMEMPL VARCHAR(60) CHARACTER SET NONE)
AS
BEGIN
  EXIT;
END^



SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE HISTORICO_EMPLEADO (
    FEC DATE,
    PERDESDE INTEGER,
    PERHASTA INTEGER,
    EMPLDESDE VARCHAR(20) CHARACTER SET NONE,
    EMPLHASTA VARCHAR(20) CHARACTER SET NONE)
RETURNS (
    FECNOM DATE,
    CONCNOM VARCHAR(60) CHARACTER SET NONE,
    COD INTEGER,
    NIT VARCHAR(20) CHARACTER SET NONE,
    VALOR NUMERIC(18,2),
    ENTIDAD VARCHAR(20) CHARACTER SET NONE,
    DEDUC CHAR(1) CHARACTER SET NONE,
    PROV CHAR(1) CHARACTER SET NONE,
    APORTE CHAR(1) CHARACTER SET NONE,
    PAGOOK CHAR(1) CHARACTER SET NONE,
    PERIODO INTEGER,
    ANO CHAR(4) CHARACTER SET NONE,
    APLICAPROM CHAR(1) CHARACTER SET NONE,
    SALARIO CHAR(1) CHARACTER SET NONE,
    GTOEMPR CHAR(1) CHARACTER SET NONE,
    NOMCORTO VARCHAR(60) CHARACTER SET NONE,
    NOMPER VARCHAR(60) CHARACTER SET NONE,
    NOMEMPL VARCHAR(60) CHARACTER SET NONE)
AS
BEGIN
FOR SELECT O.nomi_feccausa,C.conc_nombre,N.conc_cod, N.terc_nit,N.noco_valor,N.noco_entidad,N.noco_deduc,
 N.noco_prov,N.noco_aporte,N.noco_pagook, N.noco_periodo,N.noco_ano,
 N.noco_aplicaprom,N.noco_salario,N.noco_gtoempr,C.conc_nomcorto,P.pnom_nombre, T.terc_nom
 FROM NOMINA_CONCEPTOS N, CONCEPTOS_NOMINA C, NOMINA O, PERIODO_PAGO_NOMBRE P, TERCEROS T
 WHERE N.noco_periodo <> 0 AND c.conc_cod = n.conc_cod AND O.nomi_feccausa <= :fec AND O.nomi_id = N.nomi_id AND P.ppag_periodo = N.noco_periodo AND O.nomi_periodocidad = P.ppag_cod
 AND O.nomi_ano = SUBSTR(:fec,1,4) AND T.terc_nit = N.terc_nit AND N.terc_nit >= :empldesde AND N.terc_nit <= :emplhasta
 AND N.noco_periodo >= :perdesde AND N.noco_periodo <= :perhasta
 ORDER BY N.noco_periodo
 INTO :fecnom,:concnom,:cod, :Nit,:valor,:entidad,:deduc, :prov,:aporte,:pagook, :periodo,:ano,
 :aplicaprom,:salario,:gtoempr,:nomcorto,:nomper, :nomempl
 DO
 BEGIN

  SUSPEND;
 END
END
^


SET TERM ; ^

DROP PROCEDURE CAUSA_NOMINA_PROV;
DROP PROCEDURE CAUSA_NOMINA;
DROP TRIGGER NOMINA_DETALLE_BI;
DROP PROCEDURE DIAS_LABORADOS;

SET TERM ^ ;

CREATE OR ALTER PROCEDURE DIAS_LABORADOS(
    NITEMPL VARCHAR(20),
    PERIODO INTEGER,
    FEC DATE,
    MENSUAL CHAR(1))
RETURNS (
    TOTALDIASLAB INTEGER)
AS
DECLARE VARIABLE diasnolab INTEGER;
DECLARE VARIABLE diaslabxper INTEGER;
DECLARE VARIABLE perpago INTEGER;
DECLARE VARIABLE fecing DATE;
DECLARE VARIABLE DIASFEC INTEGER;
DECLARE VARIABLE DIASING INTEGER;
BEGIN
SELECT E.empl_ppago, E.empl_fecing
FROM EMPLEADOS E WHERE TERC_NIT = :nitempl
INTO :perpago, :fecing;
IF (mensual = 'N') THEN
BEGIN
IF (perpago = 1) THEN
diaslabxper = 30;
ELSE
IF (perpago = 2) THEN
diaslabxper = 15;
ELSE
IF (perpago = 3) THEN
diaslabxper = 7;
END
ELSE
diaslabxper = 30;
IF (SUBSTR(fecing,1,7) = SUBSTR(FEC,1,7)) THEN
BEGIN
diasfec = CAST(substr(fec,9,10) AS INTEGER);
diasing = CAST(substr(fecing,9,10) AS INTEGER);
diaslabxper = diasfec - diasing;
IF ((diaslabxper > 15) AND (perpago = 2)) THEN
diaslabxper = 15;
END
SELECT SUM (NONO_DURA)
FROM nomina_novedades WHERE TERC_NIT = :nitempl AND TNOV_COD = 9 AND NONO_PERIODO = :periodo
INTO :diasnolab;
totaldiaslab =  :diaslabxper - :diasnolab;
IF (totaldiaslab IS NULL) THEN
totaldiaslab =  :diaslabxper;
SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER PROCEDURE CAUSA_NOMINA(
    FEC DATE,
    PERIODO INTEGER,
    PERIODICIDAD INTEGER,
    PAGOGLOBAL CHAR(1),
    ANO CHAR(4))
RETURNS (
    IDNOMINA INTEGER)
AS
DECLARE VARIABLE item INTEGER;
DECLARE VARIABLE nite VARCHAR(20) CHARACTER SET none;
DECLARE VARIABLE nit_tercero VARCHAR(20);
DECLARE VARIABLE concept INTEGER;
DECLARE VARIABLE montos NUMERIC(18,2);
DECLARE VARIABLE porcen NUMERIC(9,4);
DECLARE VARIABLE entidad VARCHAR(20);
DECLARE VARIABLE conc_cod INTEGER;
DECLARE VARIABLE conc_deduc CHAR(1);
DECLARE VARIABLE conc_porc NUMERIC(9,4);
DECLARE VARIABLE conc_entidad INTEGER;
DECLARE VARIABLE conc_monto NUMERIC(18,2);
DECLARE VARIABLE conc_modifi CHAR(1);
DECLARE VARIABLE conc_promedio CHAR(1);
DECLARE VARIABLE emco_perprom INTEGER;
DECLARE VARIABLE valor NUMERIC(18,2);
DECLARE VARIABLE diaslab INTEGER;
DECLARE VARIABLE conc_prov CHAR(1);
DECLARE VARIABLE conc_aporte CHAR(1);
DECLARE VARIABLE numeroprom INTEGER;
DECLARE VARIABLE conc_aplicaprom CHAR(1);
DECLARE VARIABLE perinicial INTEGER;
DECLARE VARIABLE anoprom INTEGER;
DECLARE VARIABLE conc_dias CHAR(1);
DECLARE VARIABLE conc_otroconc CHAR(1);
DECLARE VARIABLE conc_codotroconc INTEGER;
DECLARE VARIABLE anosum INTEGER;
DECLARE VARIABLE salario CHAR(1) CHARACTER SET none;
DECLARE VARIABLE liquidaper INTEGER;
DECLARE VARIABLE rmod NUMERIC(2,2);
DECLARE VARIABLE basico NUMERIC(18,2);
DECLARE VARIABLE niteps VARCHAR(20);
DECLARE VARIABLE nitafc VARCHAR(20);
DECLARE VARIABLE nitafp VARCHAR(20);
DECLARE VARIABLE nitccf VARCHAR(20);
DECLARE VARIABLE gtoempr CHAR(1);
DECLARE VARIABLE comision NUMERIC(18,2);
DECLARE VARIABLE cambsaltrans NUMERIC(18,2);
DECLARE VARIABLE saldosini NUMERIC(18,2);
DECLARE VARIABLE duranov INTEGER;
DECLARE VARIABLE base NUMERIC(18,2);
DECLARE VARIABLE aprox INTEGER;
DECLARE VARIABLE mensual CHAR(1);
BEGIN
/* SI ES QUINCENAL */ /*$$IBE$$ 
EXECUTE PROCEDURE cambie_id_nomina RETURNING_VALUES(:idnomina);
INSERT INTO nomina (nomi_id, NOMI_FECCAUSA, NOMI_PAGOGLOBAL, NOMI_PERIODOCIDAD, NOMI_PERIODO, NOMI_ANO, NOMI_LIQOK)
VALUES (:IDNOMINA, :fec,:pagoglobal, :periodicidad, :periodo, :ano, 'N');
 BEGIN
    item = 1;
    FOR SELECT E.TERC_NIT, E.empl_salario, e.empl_eps, e.empl_afc, e.empl_afp, e.empl_ccf
    FROM EMPLEADOS E
    WHERE E.empl_ppago = :periodicidad AND E.empl_fecret IS NULL
    INTO :nite, :basico, :niteps, :nitafc, :nitafp, :nitccf
    DO
    BEGIN
    FOR SELECT CE.TERC_NIT, CE.CONC_COD, CE.EMCO_MONTO, CE.EMCO_PORC, ce.empl_entidad, CE.emco_perprom, CE.emco_luquidaper, CE.emco_mensual, CN.CONC_COD, CN.CONC_DEDUC,CN.CONC_PORC, CN.CONC_ENTIDAD, CN.CONC_MONTO,  CN.CONC_DIAS, CN.CONC_MODIFI,
    CN.CONC_PROMEDIO, CN.conc_salario, CE.emco_perprom, CN.conc_prov, CN.conc_aporte, CN.conc_aplicaprom, cn.conc_otroconc, cn.conc_codotroconc, CN.conc_gtoempr, CN.conc_base
    FROM empleado_conceptos CE, CONCEPTOS_NOMINA CN WHERE ((CE.terc_nit = :nite) AND (CE.CONC_COD = CN.CONC_COD) AND (CN.conc_fecini <= :fec AND CN.conc_fecfin >= :FEC) ) OR ((CE.terc_nit = :nite)
    AND (CE.CONC_COD = CN.CONC_COD) AND (cn.conc_todosper = 'N') AND (CE.emco_ppago = :periodo)) OR  ((CE.terc_nit = :nite) AND (CE.CONC_COD = CN.CONC_COD) AND cn.conc_todosper = 'S')  ORDER BY (TERC_NIT )
    INTO :nit_tercero, :concept,  :montos, :porcen, :entidad, :numeroprom, :liquidaper, :mensual ,:CONC_COD, :CONC_DEDUC, :CONC_PORC,
    :CONC_ENTIDAD, :CONC_MONTO, :CONC_DIAS, :CONC_MODIFI,:CONC_PROMEDIO, :salario,:EMCO_PERPROM, :conc_prov, :conc_aporte , :CONC_APLICAPROM, :conc_otroconc, :conc_codotroconc, :gtoempr, :base
    DO
BEGIN
    IF (conc_dias = 'S') THEN
    EXECUTE PROCEDURE DIAS_LABORADOS (:nite, :periodo, :fec, :mensual) RETURNING_VALUES (:diaslab);
    ELSE
    BEGIN
    diaslab = 15;
    IF (mensual = 'S') THEN
    BEGIN
    IF (periodicidad = 2) THEN
    diaslab = 30;
    ELSE
    IF (liquidaper = 3) THEN
    diaslab = 30;
    END
    END
 SELECT ((n.nono_valor /30) * n.nono_dura), (n.nono_dura) FROM nomina_novedades n WHERE n.tnov_cod = 11 AND n.terc_nit = :nite AND n.nono_periodo = :periodo INTO :cambsaltrans, :duranov;
 IF (cambsaltrans IS NULL) THEN
 cambsaltrans = 0;
 IF (duranov IS NULL) THEN
 duranov = 0;
 diaslab = :diaslab - :duranov;
 IF (conc_cod = 921) THEN
 BEGIN
 IF (porcen IS NOT NULL AND porcen <> 0) THEN
 valor = ((basico / 30)* :diaslab ) * :PORCEN /100;
 ELSE
 IF (conc_porc IS NOT NULL AND conc_porc <> 0) THEN
 valor = ((basico / 30)* :diaslab ) * :conc_porc /100;
 END
 ELSE
 IF (conc_cod = 922) THEN
 BEGIN
 SELECT P.prcu_monto FROM prestamo_cuotas P, prestamo_nomina PN WHERE P.prcu_ano = :ano AND P.prcu_periodo = :periodo AND PN.prno_id = P.prno_id AND PN.terc_nit = :nite INTO :valor;
 IF (valor IS NULL) THEN
 valor = 0;
 item = :item + 1;
 UPDATE prestamo_cuotas  P SET prcu_ok = 'S' WHERE P.prcu_ano = :ano AND P.prcu_periodo = :periodo AND P.prno_id = (SELECT PN.prno_id FROM PRESTAMO_NOMINA PN WHERE PN.terc_nit = :nite);
 END
 ELSE
 BEGIN
    IF ((:montos = 0) OR (:montos IS NULL)) THEN
      BEGIN
      IF ((CONC_PORC = 0 AND :porcen = 0) OR (CONC_PORC IS NULL AND :porcen = 0) OR (CONC_PORC = 0 AND :porcen IS NULL) OR (CONC_PORC IS NULL AND :porcen IS NULL) ) THEN
        BEGIN
        IF ((conc_monto <> 0) AND (conc_monto IS NOT NULL) ) THEN
        BEGIN
        VALOR = :CONC_MONTO;
        IF (:conc_dias = 'S') THEN
        valor = (:valor / 30) * :diaslab;
        END
        ELSE
        IF (salario = 'S' AND CONC_COD <> 900 AND CONC_COD <> 920) THEN
        BEGIN
        conc_monto = :basico;
        VALOR = (:conc_monto/30 * :diaslab ) + :cambsaltrans;
        END
        ELSE
        BEGIN
        valor = montos;
        IF (:conc_dias = 'S') THEN
        valor = (:valor / 30) * :diaslab;
        END
        END
       ELSE
       BEGIN
        IF (:porcen <> 0) THEN
          BEGIN
            IF ((conc_monto <> 0) AND (conc_monto IS NOT NULL) ) THEN
            BEGIN
              VALOR = ((:CONC_MONTO ) * :PORCEN) /100;
            END
          END
          ELSE
          BEGIN
            IF ((conc_monto <> 0) AND (conc_monto IS NOT NULL) ) THEN
            BEGIN
              VALOR = ((:CONC_MONTO) * :conc_porc) /100;
            END
            ELSE
        IF (salario = 'S' AND CONC_COD <> 900 AND CONC_COD <> 920) THEN
            BEGIN
              conc_monto = :basico;
              VALOR = ((:CONC_MONTO)+ :cambsaltrans * :conc_porc) /100;
            END
          END
       END
      END
    ELSE
    BEGIN
      IF ((CONC_PORC = 0 OR (conc_porc IS NULL)) AND (:porcen = 0 OR (porcen IS NULL))) THEN
      BEGIN
      VALOR = (:montos);
      IF (:conc_dias = 'S') THEN
      valor = (:valor / 30) * :diaslab;
      END
      ELSE
      BEGIN
        IF (:porcen <> 0 AND porcen IS NOT NULL) THEN
          BEGIN
          VALOR = ((:MONTOS ) * :PORCEN) /100;
          END
          ELSE
          BEGIN
          VALOR = ((:montos) * :CONC_PORC) /100;
          END
       END
   END
    IF (conc_promedio = 'S') THEN
    BEGIN
    perinicial = :periodo - (:numeroprom) + 1;
    anoprom = CAST (ano AS INTEGER);
    IF (perinicial <= 0) THEN
    BEGIN
    perinicial = 24 + :PERINICIAL;
    anoprom = CAST(ANO AS INTEGER) - 1;
    END
    SELECT SUM (noco_valor) FROM nomina_conceptos n WHERE n.noco_aplicaprom = 'S' AND N.noco_periodo >= :perinicial - 1 AND N.noco_periodo < :periodo AND N.noco_ano >= :anoprom AND N.noco_ano <= :ano AND terc_nit = :nite INTO :valor;
    valor = (valor / numeroprom);
    SELECT NOCO_VALOR FROM NOMINA_CONCEPTOS WHERE CONC_COD = :conc_cod AND TERC_NIT  = :nite AND NOCO_PAGOOK = 'N' AND NOCO_PERIODO = 0 INTO :saldosini;
    IF (saldosini IS NULL) THEN
    saldosini = 0;
    ELSE
    UPDATE nomina_conceptos N SET noco_pagook = 'S' WHERE n.noco_aplicaprom = 'S' AND N.noco_periodo >= :perinicial - 1 AND N.noco_periodo < :periodo AND N.noco_ano >= :anoprom AND N.noco_ano <= :ano  AND CONC_COD = :conc_cod AND terc_nit = :nite AND NOCO_PERIODO = 0;
    VALOR = :valor + :saldosini;
    UPDATE nomina_conceptos N SET noco_pagook = 'S' WHERE n.noco_aplicaprom = 'S' AND N.noco_periodo >= :perinicial - 1 AND N.noco_periodo < :periodo AND N.noco_ano >= :anoprom AND N.noco_ano <= :ano  AND CONC_COD = :conc_cod AND terc_nit = :nite;
    END
    IF (conc_otroconc = 'S') THEN
    BEGIN
    anosum = CAST(ano AS INTEGER);
    anosum = anosum - 1;
    SELECT SUM (noco_valor) FROM nomina_conceptos n WHERE n.noco_ano = :anosum AND n.conc_cod = :conc_codotroconc AND N.terc_nit = :nite INTO :valor;
    SELECT NOCO_VALOR FROM NOMINA_CONCEPTOS WHERE noco_ano = :anosum AND conc_cod = :conc_codotroconc AND terc_nit = :nite AND NOCO_PERIODO = 0 INTO :saldosini;
    IF (saldosini IS NULL) THEN
    saldosini = 0;
    ELSE
    UPDATE nomina_conceptos SET noco_pagook = 'S' WHERE noco_ano = :anosum AND conc_cod = :conc_codotroconc AND NOCO_PERIODO = 0 AND terc_nit = :nite;
    VALOR = :valor + :saldosini;
    UPDATE nomina_conceptos SET noco_pagook = 'S' WHERE noco_ano = :anosum AND conc_cod = :conc_codotroconc AND terc_nit = :nite;
    END
 $$IBE$$*/ /*SI EL CONCEPTO ES UN APORTE*/ /*$$IBE$$ 
IF (conc_aporte = 'S') THEN
BEGIN
    IF ((:entidad = '' ) OR (entidad IS NULL)) THEN
    BEGIN
     SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
    IF (comision IS NULL) THEN
     comision = 0;
     valor = :basico + :comision;
    IF ((conc_cod = 904) OR (conc_cod = 905) OR (conc_cod = 906)) THEN
            BEGIN
            entidad = :nitafp;
                IF (conc_cod = 904) THEN
                BEGIN
                SELECT A.paan_afptr FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = (((((:basico /30) * :diaslab ) + :comision)+ :cambsaltrans) * :PORCEN) /100;
                END
                ELSE
                IF ((conc_cod = 905) OR (conc_cod = 906)) THEN
                BEGIN
                SELECT A.paan_afpem FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = (((((:basico /30) * :diaslab ) + :comision)+ :cambsaltrans) * :PORCEN) /100;
                END
            END
            ELSE
       IF ((conc_cod = 907) OR (conc_cod = 914) OR (conc_cod = 915)) THEN
            BEGIN
            entidad = :niteps;
                IF (conc_cod = 907) THEN
                BEGIN
                SELECT A.paan_epstr FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = (((((:basico )/30 * :diaslab ) + :comision)+ :cambsaltrans) * :PORCEN) /100;
                END
                ELSE
                IF ((conc_cod = 914) OR (conc_cod = 915)) THEN
                BEGIN
                SELECT A.paan_epsem FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = (((((:basico )/30 * :diaslab ) + :comision)+ :cambsaltrans) * :PORCEN) /100;
                END
            END
            ELSE
       IF ((conc_cod = 910) OR (conc_cod = 911) OR (conc_cod = 916) OR (conc_cod = 917) OR (conc_cod = 918) OR (conc_cod = 919)) THEN
            BEGIN
            entidad = :nitccf;
            SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
            IF (comision IS NULL) THEN
            comision = 0;
                IF ((conc_cod = 910) OR (conc_cod = 911) ) THEN
                BEGIN
                SELECT A.paan_ccf FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = (((((:basico )/30 * :diaslab ) + :comision)+ :cambsaltrans) * :PORCEN) /100;
                END
                ELSE
                IF ((conc_cod = 916) OR (conc_cod = 917)) THEN
                BEGIN
                SELECT A.paan_icbf FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = (((((:basico )/30 * :diaslab ) + :comision)+ :cambsaltrans) * :PORCEN) /100;
                END
                ELSE
                IF ((conc_cod = 918) OR (conc_cod = 919)) THEN
                BEGIN
                SELECT A.paan_sena FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = (((((:basico )/30 * :diaslab ) + :comision)+ :cambsaltrans) * :PORCEN) /100;
                END
            END
            ELSE
        IF ((conc_cod = 912) OR (conc_cod = 913)) THEN
            BEGIN
            entidad = :nitafc;
            SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
            IF (comision IS NULL) THEN
            comision = 0;
                IF ((conc_cod = 912) OR (conc_cod = 913) ) THEN
                BEGIN
                SELECT A.paan_cesemp FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = ((((:basico + :comision)/30 * :diaslab )+ :cambsaltrans) * :PORCEN) /100;
                END
            END
            ELSE
        BEGIN
        IF (comision IS NULL) THEN
        comision = 0;
        SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
        conc_monto = :basico + :comision;
        IF (conc_porc <> 0 AND conc_porc IS NOT NULL) THEN
        VALOR = (((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans) * :conc_porc) /100;
        ELSE
        IF (:porcen <> 0 AND :porcen IS NOT NULL) THEN
        VALOR = (((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans) * :porcen) /100;
        ELSE
        IF (:montos <> 0 AND :montos IS NOT NULL) THEN
        valor = :montos;
        ELSE
        IF (:conc_monto <> 0 AND :conc_monto IS NOT NULL) THEN
        valor = :conc_monto;
        END
    END
    END
    ELSE
    IF (conc_prov = 'S') THEN
    BEGIN
        conc_monto = :basico;
        IF (conc_porc <> 0 AND conc_porc IS NOT NULL) THEN
        VALOR = (((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans) * :conc_porc) /100;
        ELSE
        IF (porcen <> 0 AND porcen IS NOT NULL) THEN
        VALOR = (((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans) * :porcen) /100;
        ELSE
        IF (montos <> 0 AND montos IS NOT NULL) THEN
        VALOR = :montos;
        ELSE
        IF (conc_monto <> 0 AND conc_monto IS NOT NULL) THEN
        VALOR = :conc_monto;
    END
item = :item + 1;
END
 IF (conc_cod = 920) THEN
 BEGIN
 SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :valor;
 IF (valor IS NULL) THEN
 valor = 0;
 item = :item + 1;
 END
    EXECUTE PROCEDURE LEE_CONFIGURACION('NOMINA','GENERAL','REDONDEO AL MULTIPLO DE DIEZ EN TOTALES')RETURNING_VALUES(:aprox);
    EXECUTE PROCEDURE REDONDEE(:valor, :aprox) RETURNING_VALUES (VALOR);
    IF ((mensual = 'N') OR (periodicidad = 1))  THEN
    INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
    VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
    ELSE
    IF (mensual = 'S') THEN
    BEGIN
         IF ((:periodicidad = 2) AND (liquidaper = 1)) THEN
         BEGIN
          IF ((periodo = 1) OR (periodo = 3) OR (periodo = 5) OR (periodo = 7) OR (periodo = 9) OR (periodo = 11)
          OR (periodo = 13) OR (periodo = 15) OR (periodo = 17) OR (periodo = 19) OR (periodo = 21) OR (periodo = 23)) THEN
             INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
             VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
         END
         ELSE
         IF ((:periodicidad = 2) AND (liquidaper = 2)) THEN
         BEGIN
          IF ((periodo = 2) OR (periodo = 4) OR (periodo = 6) OR (periodo = 8) OR (periodo = 10) OR (periodo = 12)
          OR (periodo = 14) OR (periodo = 16) OR (periodo = 18) OR (periodo = 20) OR (periodo = 22) OR (periodo = 24)) THEN
             INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
             VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
         END
         ELSE
         IF ((:periodicidad = 3) AND (liquidaper = 1)) THEN
         BEGIN
          IF ((periodo = 1) OR (periodo = 5) OR (periodo = 9) OR (periodo = 13) OR (periodo = 17) OR (periodo = 21)
          OR (periodo = 25) OR (periodo = 29) OR (periodo = 33) OR (periodo = 37) OR (periodo = 41) OR (periodo = 45)
          OR (periodo = 49)) THEN
             INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
             VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
         END
         ELSE
         IF ((:periodicidad = 3) AND (liquidaper = 2)) THEN
         BEGIN
          IF ((periodo = 2) OR (periodo = 6) OR (periodo = 10) OR (periodo = 14) OR (periodo = 18) OR (periodo = 22)
          OR (periodo = 26) OR (periodo = 30) OR (periodo = 34) OR (periodo = 38) OR (periodo = 42) OR (periodo = 46)
          OR (periodo = 50)) THEN
            INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
             VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
         END
         ELSE
         IF ((:periodicidad = 3) AND (liquidaper = 3)) THEN
         BEGIN
          IF ((periodo = 3) OR (periodo = 7) OR (periodo = 11) OR (periodo = 15) OR (periodo = 19) OR (periodo = 23)
          OR (periodo = 27) OR (periodo = 31) OR (periodo = 35) OR (periodo = 39) OR (periodo = 43) OR (periodo = 47)
          OR (periodo = 51)) THEN
            INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
             VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
         END
         ELSE
         IF ((:periodicidad = 3) AND (liquidaper = 4)) THEN
         BEGIN
          IF ((periodo = 4) OR (periodo = 8) OR (periodo = 12) OR (periodo = 16) OR (periodo = 20) OR (periodo = 24)
          OR (periodo = 29) OR (periodo = 32) OR (periodo = 36) OR (periodo = 40) OR (periodo = 44) OR (periodo = 48)
          OR (periodo = 52)) THEN
            INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
             VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
         END
    END
  END
 END
END
SUSPEND;
 $$IBE$$*/ EXIT;
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER PROCEDURE CAUSA_NOMINA(
    FEC DATE,
    PERIODO INTEGER,
    PERIODICIDAD INTEGER,
    PAGOGLOBAL CHAR(1),
    ANO CHAR(4))
RETURNS (
    IDNOMINA INTEGER)
AS
DECLARE VARIABLE item INTEGER;
DECLARE VARIABLE nite VARCHAR(20) CHARACTER SET none;
DECLARE VARIABLE nit_tercero VARCHAR(20);
DECLARE VARIABLE concept INTEGER;
DECLARE VARIABLE montos NUMERIC(18,2);
DECLARE VARIABLE porcen NUMERIC(9,4);
DECLARE VARIABLE entidad VARCHAR(20);
DECLARE VARIABLE conc_cod INTEGER;
DECLARE VARIABLE conc_deduc CHAR(1);
DECLARE VARIABLE conc_porc NUMERIC(9,4);
DECLARE VARIABLE conc_entidad INTEGER;
DECLARE VARIABLE conc_monto NUMERIC(18,2);
DECLARE VARIABLE conc_modifi CHAR(1);
DECLARE VARIABLE conc_promedio CHAR(1);
DECLARE VARIABLE emco_perprom INTEGER;
DECLARE VARIABLE valor NUMERIC(18,2);
DECLARE VARIABLE diaslab INTEGER;
DECLARE VARIABLE conc_prov CHAR(1);
DECLARE VARIABLE conc_aporte CHAR(1);
DECLARE VARIABLE numeroprom INTEGER;
DECLARE VARIABLE conc_aplicaprom CHAR(1);
DECLARE VARIABLE perinicial INTEGER;
DECLARE VARIABLE anoprom INTEGER;
DECLARE VARIABLE conc_dias CHAR(1);
DECLARE VARIABLE conc_otroconc CHAR(1);
DECLARE VARIABLE conc_codotroconc INTEGER;
DECLARE VARIABLE anosum INTEGER;
DECLARE VARIABLE salario CHAR(1) CHARACTER SET none;
DECLARE VARIABLE liquidaper INTEGER;
DECLARE VARIABLE rmod NUMERIC(2,2);
DECLARE VARIABLE basico NUMERIC(18,2);
DECLARE VARIABLE niteps VARCHAR(20);
DECLARE VARIABLE nitafc VARCHAR(20);
DECLARE VARIABLE nitafp VARCHAR(20);
DECLARE VARIABLE nitccf VARCHAR(20);
DECLARE VARIABLE gtoempr CHAR(1);
DECLARE VARIABLE comision NUMERIC(18,2);
DECLARE VARIABLE cambsaltrans NUMERIC(18,2);
DECLARE VARIABLE saldosini NUMERIC(18,2);
DECLARE VARIABLE duranov INTEGER;
DECLARE VARIABLE base NUMERIC(18,2);
DECLARE VARIABLE aprox INTEGER;
DECLARE VARIABLE mensual CHAR(1);
BEGIN
/* SI ES QUINCENAL */
EXECUTE PROCEDURE cambie_id_nomina RETURNING_VALUES(:idnomina);
INSERT INTO nomina (nomi_id, NOMI_FECCAUSA, NOMI_PAGOGLOBAL, NOMI_PERIODOCIDAD, NOMI_PERIODO, NOMI_ANO, NOMI_LIQOK)
VALUES (:IDNOMINA, :fec,:pagoglobal, :periodicidad, :periodo, :ano, 'N');
 BEGIN
    item = 1;
    FOR SELECT E.TERC_NIT, E.empl_salario, e.empl_eps, e.empl_afc, e.empl_afp, e.empl_ccf
    FROM EMPLEADOS E
    WHERE E.empl_ppago = :periodicidad AND E.empl_fecret IS NULL
    INTO :nite, :basico, :niteps, :nitafc, :nitafp, :nitccf
    DO
    BEGIN
    FOR SELECT CE.TERC_NIT, CE.CONC_COD, CE.EMCO_MONTO, CE.EMCO_PORC, ce.empl_entidad, CE.emco_perprom, CE.emco_luquidaper, CE.emco_mensual, CN.CONC_COD, CN.CONC_DEDUC,CN.CONC_PORC, CN.CONC_ENTIDAD, CN.CONC_MONTO,  CN.CONC_DIAS, CN.CONC_MODIFI,
    CN.CONC_PROMEDIO, CN.conc_salario, CE.emco_perprom, CN.conc_prov, CN.conc_aporte, CN.conc_aplicaprom, cn.conc_otroconc, cn.conc_codotroconc, CN.conc_gtoempr, CN.conc_base
    FROM empleado_conceptos CE, CONCEPTOS_NOMINA CN WHERE ((CE.terc_nit = :nite) AND (CE.CONC_COD = CN.CONC_COD) AND (CN.conc_fecini <= :fec AND CN.conc_fecfin >= :FEC) ) OR ((CE.terc_nit = :nite)
    AND (CE.CONC_COD = CN.CONC_COD) AND (cn.conc_todosper = 'N') AND (CE.emco_ppago = :periodo)) OR  ((CE.terc_nit = :nite) AND (CE.CONC_COD = CN.CONC_COD) AND cn.conc_todosper = 'S')  ORDER BY (TERC_NIT )
    INTO :nit_tercero, :concept,  :montos, :porcen, :entidad, :numeroprom, :liquidaper, :mensual ,:CONC_COD, :CONC_DEDUC, :CONC_PORC,
    :CONC_ENTIDAD, :CONC_MONTO, :CONC_DIAS, :CONC_MODIFI,:CONC_PROMEDIO, :salario,:EMCO_PERPROM, :conc_prov, :conc_aporte , :CONC_APLICAPROM, :conc_otroconc, :conc_codotroconc, :gtoempr, :base
    DO
BEGIN
    IF (conc_dias = 'S') THEN
    EXECUTE PROCEDURE DIAS_LABORADOS (:nite, :periodo, :fec, :mensual) RETURNING_VALUES (:diaslab);
    ELSE
    BEGIN
    diaslab = 15;
    IF (mensual = 'S') THEN
    BEGIN
    IF (periodicidad = 2) THEN
    diaslab = 30;
    ELSE
    IF (liquidaper = 3) THEN
    diaslab = 30;
    END
    END
 SELECT ((n.nono_valor /30) * n.nono_dura), (n.nono_dura) FROM nomina_novedades n WHERE n.tnov_cod = 11 AND n.terc_nit = :nite AND n.nono_periodo = :periodo INTO :cambsaltrans, :duranov;
 IF (cambsaltrans IS NULL) THEN
 cambsaltrans = 0;
 IF (duranov IS NULL) THEN
 duranov = 0;
 diaslab = :diaslab - :duranov;
 IF (conc_cod = 921) THEN
 BEGIN
 IF (porcen IS NOT NULL AND porcen <> 0) THEN
 valor = ((basico / 30)* :diaslab ) * :PORCEN /100;
 ELSE
 IF (conc_porc IS NOT NULL AND conc_porc <> 0) THEN
 valor = ((basico / 30)* :diaslab ) * :conc_porc /100;
 END
 ELSE
 IF (conc_cod = 922) THEN
 BEGIN
 SELECT P.prcu_monto FROM prestamo_cuotas P, prestamo_nomina PN WHERE P.prcu_ano = :ano AND P.prcu_periodo = :periodo AND PN.prno_id = P.prno_id AND PN.terc_nit = :nite INTO :valor;
 IF (valor IS NULL) THEN
 valor = 0;
 item = :item + 1;
 UPDATE prestamo_cuotas  P SET prcu_ok = 'S' WHERE P.prcu_ano = :ano AND P.prcu_periodo = :periodo AND P.prno_id = (SELECT PN.prno_id FROM PRESTAMO_NOMINA PN WHERE PN.terc_nit = :nite);
 END
 ELSE
 BEGIN
    IF ((:montos = 0) OR (:montos IS NULL)) THEN
      BEGIN
      IF ((CONC_PORC = 0 AND :porcen = 0) OR (CONC_PORC IS NULL AND :porcen = 0) OR (CONC_PORC = 0 AND :porcen IS NULL) OR (CONC_PORC IS NULL AND :porcen IS NULL) ) THEN
        BEGIN
        IF ((conc_monto <> 0) AND (conc_monto IS NOT NULL) ) THEN
        BEGIN
        VALOR = :CONC_MONTO;
        IF (:conc_dias = 'S') THEN
        valor = (:valor / 30) * :diaslab;
        END
        ELSE
        IF (salario = 'S' AND CONC_COD <> 900 AND CONC_COD <> 920) THEN
        BEGIN
        conc_monto = :basico;
        VALOR = (:conc_monto/30 * :diaslab ) + :cambsaltrans;
        END
        ELSE
        BEGIN
        valor = montos;
        IF (:conc_dias = 'S') THEN
        valor = (:valor / 30) * :diaslab;
        END
        END
       ELSE
       BEGIN
        IF (:porcen <> 0) THEN
          BEGIN
            IF ((conc_monto <> 0) AND (conc_monto IS NOT NULL) ) THEN
            BEGIN
              VALOR = ((:CONC_MONTO ) * :PORCEN) /100;
            END
          END
          ELSE
          BEGIN
            IF ((conc_monto <> 0) AND (conc_monto IS NOT NULL) ) THEN
            BEGIN
              VALOR = ((:CONC_MONTO) * :conc_porc) /100;
            END
            ELSE
        IF (salario = 'S' AND CONC_COD <> 900 AND CONC_COD <> 920) THEN
            BEGIN
              conc_monto = :basico;
              VALOR = ((:CONC_MONTO)+ :cambsaltrans * :conc_porc) /100;
            END
          END
       END
      END
    ELSE
    BEGIN
      IF ((CONC_PORC = 0 OR (conc_porc IS NULL)) AND (:porcen = 0 OR (porcen IS NULL))) THEN
      BEGIN
      VALOR = (:montos);
      IF (:conc_dias = 'S') THEN
      valor = (:valor / 30) * :diaslab;
      END
      ELSE
      BEGIN
        IF (:porcen <> 0 AND porcen IS NOT NULL) THEN
          BEGIN
          VALOR = ((:MONTOS ) * :PORCEN) /100;
          END
          ELSE
          BEGIN
          VALOR = ((:montos) * :CONC_PORC) /100;
          END
       END
   END
    IF (conc_promedio = 'S') THEN
    BEGIN
    perinicial = :periodo - (:numeroprom) + 1;
    anoprom = CAST (ano AS INTEGER);
    IF (perinicial <= 0) THEN
    BEGIN
    perinicial = 24 + :PERINICIAL;
    anoprom = CAST(ANO AS INTEGER) - 1;
    END
    SELECT SUM (noco_valor) FROM nomina_conceptos n WHERE n.noco_aplicaprom = 'S' AND N.noco_periodo >= :perinicial - 1 AND N.noco_periodo < :periodo AND N.noco_ano >= :anoprom AND N.noco_ano <= :ano AND terc_nit = :nite INTO :valor;
    valor = (valor / numeroprom);
    SELECT NOCO_VALOR FROM NOMINA_CONCEPTOS WHERE CONC_COD = :conc_cod AND TERC_NIT  = :nite AND NOCO_PAGOOK = 'N' AND NOCO_PERIODO = 0 INTO :saldosini;
    IF (saldosini IS NULL) THEN
    saldosini = 0;
    ELSE
    UPDATE nomina_conceptos N SET noco_pagook = 'S' WHERE n.noco_aplicaprom = 'S' AND N.noco_periodo >= :perinicial - 1 AND N.noco_periodo < :periodo AND N.noco_ano >= :anoprom AND N.noco_ano <= :ano  AND CONC_COD = :conc_cod AND terc_nit = :nite AND NOCO_PERIODO = 0;
    VALOR = :valor + :saldosini;
    UPDATE nomina_conceptos N SET noco_pagook = 'S' WHERE n.noco_aplicaprom = 'S' AND N.noco_periodo >= :perinicial - 1 AND N.noco_periodo < :periodo AND N.noco_ano >= :anoprom AND N.noco_ano <= :ano  AND CONC_COD = :conc_cod AND terc_nit = :nite;
    END
    IF (conc_otroconc = 'S') THEN
    BEGIN
    anosum = CAST(ano AS INTEGER);
    anosum = anosum - 1;
    SELECT SUM (noco_valor) FROM nomina_conceptos n WHERE n.noco_ano = :anosum AND n.conc_cod = :conc_codotroconc AND N.terc_nit = :nite INTO :valor;
    SELECT NOCO_VALOR FROM NOMINA_CONCEPTOS WHERE noco_ano = :anosum AND conc_cod = :conc_codotroconc AND terc_nit = :nite AND NOCO_PERIODO = 0 INTO :saldosini;
    IF (saldosini IS NULL) THEN
    saldosini = 0;
    ELSE
    UPDATE nomina_conceptos SET noco_pagook = 'S' WHERE noco_ano = :anosum AND conc_cod = :conc_codotroconc AND NOCO_PERIODO = 0 AND terc_nit = :nite;
    VALOR = :valor + :saldosini;
    UPDATE nomina_conceptos SET noco_pagook = 'S' WHERE noco_ano = :anosum AND conc_cod = :conc_codotroconc AND terc_nit = :nite;
    END
/*SI EL CONCEPTO ES UN APORTE*/
IF (conc_aporte = 'S') THEN
BEGIN
    IF ((:entidad = '' ) OR (entidad IS NULL)) THEN
    BEGIN
     SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
    IF (comision IS NULL) THEN
     comision = 0;
     valor = :basico + :comision;
    IF ((conc_cod = 904) OR (conc_cod = 905) OR (conc_cod = 906)) THEN
            BEGIN
            entidad = :nitafp;
                IF (conc_cod = 904) THEN
                BEGIN
                SELECT A.paan_afptr FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = (((((:basico /30) * :diaslab ) + :comision)+ :cambsaltrans) * :PORCEN) /100;
                END
                ELSE
                IF ((conc_cod = 905) OR (conc_cod = 906)) THEN
                BEGIN
                SELECT A.paan_afpem FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = (((((:basico /30) * :diaslab ) + :comision)+ :cambsaltrans) * :PORCEN) /100;
                END
            END
            ELSE
       IF ((conc_cod = 907) OR (conc_cod = 914) OR (conc_cod = 915)) THEN
            BEGIN
            entidad = :niteps;
                IF (conc_cod = 907) THEN
                BEGIN
                SELECT A.paan_epstr FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = (((((:basico )/30 * :diaslab ) + :comision)+ :cambsaltrans) * :PORCEN) /100;
                END
                ELSE
                IF ((conc_cod = 914) OR (conc_cod = 915)) THEN
                BEGIN
                SELECT A.paan_epsem FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = (((((:basico )/30 * :diaslab ) + :comision)+ :cambsaltrans) * :PORCEN) /100;
                END
            END
            ELSE
       IF ((conc_cod = 910) OR (conc_cod = 911) OR (conc_cod = 916) OR (conc_cod = 917) OR (conc_cod = 918) OR (conc_cod = 919)) THEN
            BEGIN
            entidad = :nitccf;
            SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
            IF (comision IS NULL) THEN
            comision = 0;
                IF ((conc_cod = 910) OR (conc_cod = 911) ) THEN
                BEGIN
                SELECT A.paan_ccf FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = (((((:basico )/30 * :diaslab ) + :comision)+ :cambsaltrans) * :PORCEN) /100;
                END
                ELSE
                IF ((conc_cod = 916) OR (conc_cod = 917)) THEN
                BEGIN
                SELECT A.paan_icbf FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = (((((:basico )/30 * :diaslab ) + :comision)+ :cambsaltrans) * :PORCEN) /100;
                END
                ELSE
                IF ((conc_cod = 918) OR (conc_cod = 919)) THEN
                BEGIN
                SELECT A.paan_sena FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = (((((:basico )/30 * :diaslab ) + :comision)+ :cambsaltrans) * :PORCEN) /100;
                END
            END
            ELSE
        IF ((conc_cod = 912) OR (conc_cod = 913)) THEN
            BEGIN
            entidad = :nitafc;
            SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
            IF (comision IS NULL) THEN
            comision = 0;
                IF ((conc_cod = 912) OR (conc_cod = 913) ) THEN
                BEGIN
                SELECT A.paan_cesemp FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = ((((:basico + :comision)/30 * :diaslab )+ :cambsaltrans) * :PORCEN) /100;
                END
            END
            ELSE
        BEGIN
        IF (comision IS NULL) THEN
        comision = 0;
        SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
        conc_monto = :basico + :comision;
        IF (conc_porc <> 0 AND conc_porc IS NOT NULL) THEN
        VALOR = (((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans) * :conc_porc) /100;
        ELSE
        IF (:porcen <> 0 AND :porcen IS NOT NULL) THEN
        VALOR = (((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans) * :porcen) /100;
        ELSE
        IF (:montos <> 0 AND :montos IS NOT NULL) THEN
        valor = :montos;
        ELSE
        IF (:conc_monto <> 0 AND :conc_monto IS NOT NULL) THEN
        valor = :conc_monto;
        END
    END
    END
    ELSE
    IF (conc_prov = 'S') THEN
    BEGIN
        conc_monto = :basico;
        IF (conc_porc <> 0 AND conc_porc IS NOT NULL) THEN
        VALOR = (((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans) * :conc_porc) /100;
        ELSE
        IF (porcen <> 0 AND porcen IS NOT NULL) THEN
        VALOR = (((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans) * :porcen) /100;
        ELSE
        IF (montos <> 0 AND montos IS NOT NULL) THEN
        VALOR = :montos;
        ELSE
        IF (conc_monto <> 0 AND conc_monto IS NOT NULL) THEN
        VALOR = :conc_monto;
    END
item = :item + 1;
END
 IF (conc_cod = 920) THEN
 BEGIN
 SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :valor;
 IF (valor IS NULL) THEN
 valor = 0;
 item = :item + 1;
 END
    EXECUTE PROCEDURE LEE_CONFIGURACION('NOMINA','GENERAL','REDONDEO AL MULTIPLO DE DIEZ EN TOTALES')RETURNING_VALUES(:aprox);
    EXECUTE PROCEDURE REDONDEE(:valor, :aprox) RETURNING_VALUES (VALOR);
    IF ((mensual = 'N') OR (periodicidad = 1))  THEN
    INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
    VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
    ELSE
    IF (mensual = 'S') THEN
    BEGIN
         IF ((:periodicidad = 2) AND (liquidaper = 1)) THEN
         BEGIN
          IF ((periodo = 1) OR (periodo = 3) OR (periodo = 5) OR (periodo = 7) OR (periodo = 9) OR (periodo = 11)
          OR (periodo = 13) OR (periodo = 15) OR (periodo = 17) OR (periodo = 19) OR (periodo = 21) OR (periodo = 23)) THEN
             INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
             VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
         END
         ELSE
         IF ((:periodicidad = 2) AND (liquidaper = 2)) THEN
         BEGIN
          IF ((periodo = 2) OR (periodo = 4) OR (periodo = 6) OR (periodo = 8) OR (periodo = 10) OR (periodo = 12)
          OR (periodo = 14) OR (periodo = 16) OR (periodo = 18) OR (periodo = 20) OR (periodo = 22) OR (periodo = 24)) THEN
             INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
             VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
         END
         ELSE
         IF ((:periodicidad = 3) AND (liquidaper = 1)) THEN
         BEGIN
          IF ((periodo = 1) OR (periodo = 5) OR (periodo = 9) OR (periodo = 13) OR (periodo = 17) OR (periodo = 21)
          OR (periodo = 25) OR (periodo = 29) OR (periodo = 33) OR (periodo = 37) OR (periodo = 41) OR (periodo = 45)
          OR (periodo = 49)) THEN
             INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
             VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
         END
         ELSE
         IF ((:periodicidad = 3) AND (liquidaper = 2)) THEN
         BEGIN
          IF ((periodo = 2) OR (periodo = 6) OR (periodo = 10) OR (periodo = 14) OR (periodo = 18) OR (periodo = 22)
          OR (periodo = 26) OR (periodo = 30) OR (periodo = 34) OR (periodo = 38) OR (periodo = 42) OR (periodo = 46)
          OR (periodo = 50)) THEN
            INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
             VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
         END
         ELSE
         IF ((:periodicidad = 3) AND (liquidaper = 3)) THEN
         BEGIN
          IF ((periodo = 3) OR (periodo = 7) OR (periodo = 11) OR (periodo = 15) OR (periodo = 19) OR (periodo = 23)
          OR (periodo = 27) OR (periodo = 31) OR (periodo = 35) OR (periodo = 39) OR (periodo = 43) OR (periodo = 47)
          OR (periodo = 51)) THEN
            INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
             VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
         END
         ELSE
         IF ((:periodicidad = 3) AND (liquidaper = 4)) THEN
         BEGIN
          IF ((periodo = 4) OR (periodo = 8) OR (periodo = 12) OR (periodo = 16) OR (periodo = 20) OR (periodo = 24)
          OR (periodo = 29) OR (periodo = 32) OR (periodo = 36) OR (periodo = 40) OR (periodo = 44) OR (periodo = 48)
          OR (periodo = 52)) THEN
            INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
             VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
         END
    END
  END
 END
END
SUSPEND;
END

^

SET TERM ; ^




GRANT EXECUTE ON PROCEDURE CAMBIE_ID_NOMINA TO PUBLIC;;

GRANT EXECUTE ON PROCEDURE CAMBIE_ID_NOVEDAD TO PUBLIC;

GRANT EXECUTE ON PROCEDURE CAMBIE_ID_PAGO_NOMINA TO PUBLIC;

GRANT EXECUTE ON PROCEDURE CAMBIE_ID_PRESTAMOS TO PUBLIC;

GRANT EXECUTE ON PROCEDURE CAUSA_NOMINA TO PUBLIC;

GRANT EXECUTE ON PROCEDURE CONSOLIDA_CONC_NOMINA TO PUBLIC;

GRANT EXECUTE ON PROCEDURE CONSOLIDA_CONC_NOMINA_PROV TO PUBLIC;

GRANT EXECUTE ON PROCEDURE CONTABIL_NOMINA TO PUBLIC;

GRANT EXECUTE ON PROCEDURE CONTABIL_PAGONOMI TO PUBLIC;

GRANT EXECUTE ON PROCEDURE DIAS_LABORADOS TO PUBLIC;

GRANT EXECUTE ON PROCEDURE EGRESO_NOMINA TO PUBLIC;

GRANT EXECUTE ON PROCEDURE IMPR_PLANILLA_NOMINA TO PUBLIC;

GRANT EXECUTE ON PROCEDURE LIQUIDA_HORAS_EXTRA TO PUBLIC;

GRANT EXECUTE ON PROCEDURE LIQUIDACION_APORTES TO PUBLIC;

GRANT EXECUTE ON PROCEDURE NOVEDADESXPERIODO TO PUBLIC;

GRANT EXECUTE ON PROCEDURE PAGO_NOMINA_XEMPL TO PUBLIC;

GRANT EXECUTE ON PROCEDURE PLANILLA_NOMINA_NOVEDADES TO PUBLIC;

GRANT EXECUTE ON PROCEDURE REP_EMPLEADOS TO PUBLIC;


GRANT ALL ON ADMINISTRADORA TO PUBLIC;

GRANT ALL ON AFP_ESPECIAL TO PUBLIC;

GRANT ALL ON ANTICIPOS_NOMINA TO PUBLIC;

GRANT ALL ON AREA TO PUBLIC;

GRANT ALL ON CESANTIA_DETALLE TO PUBLIC;

GRANT ALL ON CESANTIAS TO PUBLIC;

GRANT ALL ON CESANTIAS_RETIROS TO PUBLIC;

GRANT ALL ON CONCEPTOS_NOMINA TO PUBLIC;

GRANT ALL ON CONSOLIDADO_NOMINA TO PUBLIC;

GRANT ALL ON CONSOLIDADO_NOMINA_PROV TO PUBLIC;

GRANT ALL ON DEPARTAMENTO TO PUBLIC;

GRANT ALL ON EMPLEADO_BENEFICIARIOS TO PUBLIC;

GRANT ALL ON EMPLEADO_CONCEPTOS TO PUBLIC;

GRANT ALL ON EMPLEADO_FORMACION TO PUBLIC;

GRANT ALL ON EMPLEADO_LLAMADOS TO PUBLIC;

GRANT ALL ON EMPLEADOS TO PUBLIC;

GRANT ALL ON INCAPACIDADES TO PUBLIC;

GRANT ALL ON INTERFAZ_NOMINA TO PUBLIC;

GRANT ALL ON LIQUIDACION TO PUBLIC;

GRANT ALL ON LLAMADOS_ATENCION TO PUBLIC;

GRANT ALL ON NIVEL_FORMACION TO PUBLIC;

GRANT ALL ON NOMINA TO PUBLIC;

GRANT ALL ON NOMINA_CONCEPTOS TO PUBLIC;

GRANT ALL ON NOMINA_DETALLE TO PUBLIC;

GRANT ALL ON NOMINA_NOVEDADES TO PUBLIC;

GRANT ALL ON PAGO_APORTES TO PUBLIC;

GRANT ALL ON PAGO_APORTES_DETALLE TO PUBLIC;

GRANT ALL ON PAGO_NOMINA TO PUBLIC;

GRANT ALL ON PAGO_NOMINA_DET TO PUBLIC;

GRANT ALL ON PARAMETROS_ANO TO PUBLIC;

GRANT ALL ON PARENTESCO TO PUBLIC;

GRANT ALL ON PERIODO_PAGO TO PUBLIC;

GRANT ALL ON PRESTAMO_CUOTAS TO PUBLIC;

GRANT ALL ON PRESTAMO_NOMINA TO PUBLIC;

GRANT ALL ON RETENCIONES TO PUBLIC;

GRANT ALL ON SECCION TO PUBLIC;

GRANT ALL ON SUBTIPO_COTIZANTE TO PUBLIC;

GRANT ALL ON TIPO_COTIZANTE TO PUBLIC;

GRANT ALL ON TIPOS_NOVEDAD TO PUBLIC;

GRANT ALL ON VACACIONES TO PUBLIC;

GRANT ALL ON NOMINA_COMISIONES TO PUBLIC;

GRANT ALL ON PARENTESCO TO PUBLIC;

GRANT ALL ON EDUCACION_FORMAL_EMPLEADO TO PUBLIC;

GRANT ALL ON EXPERIENCIA_LABORAL_EMPLEADO TO PUBLIC;

UPDATE REVISION SET revi_nomina = '2008/12/30';


SET TERM ^ ;

CREATE OR ALTER PROCEDURE CAUSA_NOMINA (
    fec date,
    periodo integer,
    periodicidad integer,
    pagoglobal char(1),
    ano char(4))
returns (
    idnomina integer)
as
declare variable item integer;
declare variable nite varchar(20) character set none;
declare variable nit_tercero varchar(20);
declare variable concept integer;
declare variable montos numeric(18,2);
declare variable porcen numeric(9,4);
declare variable entidad varchar(20);
declare variable conc_cod integer;
declare variable conc_deduc char(1);
declare variable conc_porc numeric(9,4);
declare variable conc_entidad integer;
declare variable conc_monto numeric(18,2);
declare variable conc_modifi char(1);
declare variable conc_promedio char(1);
declare variable emco_perprom integer;
declare variable valor numeric(18,2);
declare variable diaslab integer;
declare variable conc_prov char(1);
declare variable conc_aporte char(1);
declare variable numeroprom integer;
declare variable conc_aplicaprom char(1);
declare variable perinicial integer;
declare variable anoprom integer;
declare variable conc_dias char(1);
declare variable conc_otroconc char(1);
declare variable conc_codotroconc integer;
declare variable anosum integer;
declare variable salario char(1) character set none;
declare variable liquidaper integer;
declare variable rmod numeric(2,2);
declare variable basico numeric(18,2);
declare variable niteps varchar(20);
declare variable nitafc varchar(20);
declare variable nitafp varchar(20);
declare variable nitccf varchar(20);
declare variable gtoempr char(1);
declare variable comision numeric(18,2);
declare variable cambsaltrans numeric(18,2);
declare variable saldosini numeric(18,2);
declare variable duranov integer;
declare variable base numeric(18,2);
declare variable aprox integer;
declare variable mensual char(1);
BEGIN
/* SI ES QUINCENAL */
EXECUTE PROCEDURE cambie_id_nomina RETURNING_VALUES(:idnomina);
INSERT INTO nomina (nomi_id, NOMI_FECCAUSA, NOMI_PAGOGLOBAL, NOMI_PERIODOCIDAD, NOMI_PERIODO, NOMI_ANO, NOMI_LIQOK)
VALUES (:IDNOMINA, :fec,:pagoglobal, :periodicidad, :periodo, :ano, 'N');
 BEGIN
    item = 1;
    FOR SELECT E.TERC_NIT, E.empl_salario, e.empl_eps, e.empl_afc, e.empl_afp, e.empl_ccf
    FROM EMPLEADOS E
    WHERE E.empl_ppago = :periodicidad AND E.empl_fecret IS NULL
    INTO :nite, :basico, :niteps, :nitafc, :nitafp, :nitccf
    DO
    BEGIN
    FOR SELECT CE.TERC_NIT, CE.CONC_COD, CE.EMCO_MONTO, CE.EMCO_PORC, ce.empl_entidad, CE.emco_perprom, CE.emco_luquidaper, CE.emco_mensual, CN.CONC_COD, CN.CONC_DEDUC,CN.CONC_PORC, CN.CONC_ENTIDAD, CN.CONC_MONTO,  CN.CONC_DIAS, CN.CONC_MODIFI,
    CN.CONC_PROMEDIO, CN.conc_salario, CE.emco_perprom, CN.conc_prov, CN.conc_aporte, CN.conc_aplicaprom, cn.conc_otroconc, cn.conc_codotroconc, CN.conc_gtoempr, CN.conc_base
    FROM empleado_conceptos CE, CONCEPTOS_NOMINA CN WHERE ((CE.terc_nit = :nite) AND (CE.CONC_COD = CN.CONC_COD) AND (CN.conc_fecini <= :fec AND CN.conc_fecfin >= :FEC) ) OR ((CE.terc_nit = :nite)
    AND (CE.CONC_COD = CN.CONC_COD) AND (cn.conc_todosper = 'N') AND (CE.emco_ppago = :periodo)) OR  ((CE.terc_nit = :nite) AND (CE.CONC_COD = CN.CONC_COD) AND cn.conc_todosper = 'S')  ORDER BY (TERC_NIT )
    INTO :nit_tercero, :concept,  :montos, :porcen, :entidad, :numeroprom, :liquidaper, :mensual ,:CONC_COD, :CONC_DEDUC, :CONC_PORC,
    :CONC_ENTIDAD, :CONC_MONTO, :CONC_DIAS, :CONC_MODIFI,:CONC_PROMEDIO, :salario,:EMCO_PERPROM, :conc_prov, :conc_aporte , :CONC_APLICAPROM, :conc_otroconc, :conc_codotroconc, :gtoempr, :base
    DO
BEGIN
    IF (conc_dias = 'S') THEN
/*    EXECUTE PROCEDURE DIAS_LABORADOS (:nite, :periodo, :fec, :mensual) RETURNING_VALUES (:diaslab);
    ELSE
*/    BEGIN
    diaslab = 15;
    IF (mensual = 'S') THEN
    BEGIN
    IF (periodicidad = 2) THEN
    diaslab = 30;
    ELSE
    IF (liquidaper = 3) THEN
    diaslab = 30;
    END
    END
 SELECT ((n.nono_valor /30) * n.nono_dura), (n.nono_dura) FROM nomina_novedades n WHERE n.tnov_cod = 11 AND n.terc_nit = :nite AND n.nono_periodo = :periodo INTO :cambsaltrans, :duranov;
 IF (cambsaltrans IS NULL) THEN
 cambsaltrans = 0;
 IF (duranov IS NULL) THEN
 duranov = 0;
 diaslab = :diaslab - :duranov;
 IF (conc_cod = 921) THEN
 BEGIN
 IF (porcen IS NOT NULL AND porcen <> 0) THEN
 valor = ((basico / 30)* :diaslab ) * :PORCEN /100;
 ELSE
 IF (conc_porc IS NOT NULL AND conc_porc <> 0) THEN
 valor = ((basico / 30)* :diaslab ) * :conc_porc /100;
 END
 ELSE
 IF (conc_cod = 922) THEN
 BEGIN
 SELECT P.prcu_monto FROM prestamo_cuotas P, prestamo_nomina PN WHERE P.prcu_ano = :ano AND P.prcu_periodo = :periodo AND PN.prno_id = P.prno_id AND PN.terc_nit = :nite INTO :valor;
 IF (valor IS NULL) THEN
 valor = 0;
 item = :item + 1;
 UPDATE prestamo_cuotas  P SET prcu_ok = 'S' WHERE P.prcu_ano = :ano AND P.prcu_periodo = :periodo AND P.prno_id = (SELECT PN.prno_id FROM PRESTAMO_NOMINA PN WHERE PN.terc_nit = :nite);
 END
 ELSE
 BEGIN
    IF ((:montos = 0) OR (:montos IS NULL)) THEN
      BEGIN
      IF ((CONC_PORC = 0 AND :porcen = 0) OR (CONC_PORC IS NULL AND :porcen = 0) OR (CONC_PORC = 0 AND :porcen IS NULL) OR (CONC_PORC IS NULL AND :porcen IS NULL) ) THEN
        BEGIN
        IF ((conc_monto <> 0) AND (conc_monto IS NOT NULL) ) THEN
        BEGIN
        VALOR = :CONC_MONTO;
        IF (:conc_dias = 'S') THEN
        valor = (:valor / 30) * :diaslab;
        END
        ELSE
        IF (salario = 'S' AND CONC_COD <> 900 AND CONC_COD <> 920) THEN
        BEGIN
        conc_monto = :basico;
        VALOR = (:conc_monto/30 * :diaslab ) + :cambsaltrans;
        END
        ELSE
        BEGIN
        valor = montos;
        IF (:conc_dias = 'S') THEN
        valor = (:valor / 30) * :diaslab;
        END
        END
       ELSE
       BEGIN
        IF (:porcen <> 0) THEN
          BEGIN
            IF ((conc_monto <> 0) AND (conc_monto IS NOT NULL) ) THEN
            BEGIN
              VALOR = ((:CONC_MONTO ) * :PORCEN) /100;
            END
          END
          ELSE
          BEGIN
            IF ((conc_monto <> 0) AND (conc_monto IS NOT NULL) ) THEN
            BEGIN
              VALOR = ((:CONC_MONTO) * :conc_porc) /100;
            END
            ELSE
        IF (salario = 'S' AND CONC_COD <> 900 AND CONC_COD <> 920) THEN
            BEGIN
              conc_monto = :basico;
              VALOR = ((:CONC_MONTO)+ :cambsaltrans * :conc_porc) /100;
            END
            ELSE
            if (:conc_monto = 0 AND :montos = 0) then
            BEGIN
            conc_monto = :basico;
            VALOR = (((:CONC_MONTO / 30) * :diaslab) + :cambsaltrans * :conc_porc) /100;
            END
          END
       END
      END
    ELSE
    BEGIN
      IF ((CONC_PORC = 0 OR (conc_porc IS NULL)) AND (:porcen = 0 OR (porcen IS NULL))) THEN
      BEGIN
      VALOR = (:montos);
      IF (:conc_dias = 'S') THEN
      valor = (:valor / 30) * :diaslab;
      END
      ELSE
      BEGIN
        IF (:porcen <> 0 AND porcen IS NOT NULL) THEN
          BEGIN
          VALOR = ((:MONTOS ) * :PORCEN) /100;
          END
          ELSE
          BEGIN
          VALOR = ((:montos) * :CONC_PORC) /100;
          END
          END
   END
    IF (conc_promedio = 'S') THEN
    BEGIN
    perinicial = :periodo - (:numeroprom) + 1;
    anoprom = CAST (ano AS INTEGER);
    IF (perinicial <= 0) THEN
    BEGIN
    perinicial = 24 + :PERINICIAL;
    anoprom = CAST(ANO AS INTEGER) - 1;
    END
    SELECT SUM (noco_valor) FROM nomina_conceptos n WHERE n.noco_aplicaprom = 'S' AND N.noco_periodo >= :perinicial - 1 AND N.noco_periodo < :periodo AND N.noco_ano >= :anoprom AND N.noco_ano <= :ano AND terc_nit = :nite INTO :valor;
    valor = (valor / numeroprom);
    SELECT NOCO_VALOR FROM NOMINA_CONCEPTOS WHERE CONC_COD = :conc_cod AND TERC_NIT  = :nite AND NOCO_PAGOOK = 'N' AND NOCO_PERIODO = 0 INTO :saldosini;
    IF (saldosini IS NULL) THEN
    saldosini = 0;
    ELSE
    UPDATE nomina_conceptos N SET noco_pagook = 'S' WHERE n.noco_aplicaprom = 'S' AND N.noco_periodo >= :perinicial - 1 AND N.noco_periodo < :periodo AND N.noco_ano >= :anoprom AND N.noco_ano <= :ano  AND CONC_COD = :conc_cod AND terc_nit = :nite AND NOCO_PERIODO = 0;
    VALOR = :valor + :saldosini;
    UPDATE nomina_conceptos N SET noco_pagook = 'S' WHERE n.noco_aplicaprom = 'S' AND N.noco_periodo >= :perinicial - 1 AND N.noco_periodo < :periodo AND N.noco_ano >= :anoprom AND N.noco_ano <= :ano  AND CONC_COD = :conc_cod AND terc_nit = :nite;
    END
    IF (conc_otroconc = 'S') THEN
    BEGIN
    anosum = CAST(ano AS INTEGER);
    anosum = anosum - 1;
    SELECT SUM (noco_valor) FROM nomina_conceptos n WHERE n.noco_ano = :anosum AND n.conc_cod = :conc_codotroconc AND N.terc_nit = :nite INTO :valor;
    SELECT NOCO_VALOR FROM NOMINA_CONCEPTOS WHERE noco_ano = :anosum AND conc_cod = :conc_codotroconc AND terc_nit = :nite AND NOCO_PERIODO = 0 INTO :saldosini;
    IF (saldosini IS NULL) THEN
    saldosini = 0;
    ELSE
    UPDATE nomina_conceptos SET noco_pagook = 'S' WHERE noco_ano = :anosum AND conc_cod = :conc_codotroconc AND NOCO_PERIODO = 0 AND terc_nit = :nite;
    VALOR = :valor + :saldosini;
    UPDATE nomina_conceptos SET noco_pagook = 'S' WHERE noco_ano = :anosum AND conc_cod = :conc_codotroconc AND terc_nit = :nite;
    END
/*SI EL CONCEPTO ES UN APORTE*/
IF (conc_aporte = 'S') THEN
BEGIN
    IF ((:entidad = '' ) OR (entidad IS NULL)) THEN
    BEGIN
     SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
    IF (comision IS NULL) THEN
     comision = 0;
     valor = :basico + :comision;
    IF ((conc_cod = 904) OR (conc_cod = 905) OR (conc_cod = 906)) THEN
            BEGIN
            entidad = :nitafp;
                IF (conc_cod = 904) THEN
                BEGIN
                SELECT A.paan_afptr FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = (((((:basico /30) * :diaslab ) + :comision)+ :cambsaltrans) * :PORCEN) /100;
                END
                ELSE
                IF ((conc_cod = 905) OR (conc_cod = 906)) THEN
                BEGIN
                SELECT A.paan_afpem FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = (((((:basico /30) * :diaslab ) + :comision)+ :cambsaltrans) * :PORCEN) /100;
                END
            END
            ELSE
       IF ((conc_cod = 907) OR (conc_cod = 914) OR (conc_cod = 915)) THEN
            BEGIN
            entidad = :niteps;
                IF (conc_cod = 907) THEN
                BEGIN
                SELECT A.paan_epstr FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = (((((:basico )/30 * :diaslab ) + :comision)+ :cambsaltrans) * :PORCEN) /100;
                END
                ELSE
                IF ((conc_cod = 914) OR (conc_cod = 915)) THEN
                BEGIN
                SELECT A.paan_epsem FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = (((((:basico )/30 * :diaslab ) + :comision)+ :cambsaltrans) * :PORCEN) /100;
                END
            END
            ELSE
       IF ((conc_cod = 910) OR (conc_cod = 911) OR (conc_cod = 916) OR (conc_cod = 917) OR (conc_cod = 918) OR (conc_cod = 919)) THEN
            BEGIN
            entidad = :nitccf;
            SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
            IF (comision IS NULL) THEN
            comision = 0;
                IF ((conc_cod = 910) OR (conc_cod = 911) ) THEN
                BEGIN
                SELECT A.paan_ccf FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = (((((:basico )/30 * :diaslab ) + :comision)+ :cambsaltrans) * :PORCEN) /100;
                END
                ELSE
                IF ((conc_cod = 916) OR (conc_cod = 917)) THEN
                BEGIN
                SELECT A.paan_icbf FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = (((((:basico )/30 * :diaslab ) + :comision)+ :cambsaltrans) * :PORCEN) /100;
                END
                ELSE
                IF ((conc_cod = 918) OR (conc_cod = 919)) THEN
                BEGIN
                SELECT A.paan_sena FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = (((((:basico )/30 * :diaslab ) + :comision)+ :cambsaltrans) * :PORCEN) /100;
                END
            END
            ELSE
        IF ((conc_cod = 912) OR (conc_cod = 913)) THEN
            BEGIN
            entidad = :nitafc;
            SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
            IF (comision IS NULL) THEN
            comision = 0;
                IF ((conc_cod = 912) OR (conc_cod = 913) ) THEN
                BEGIN
                SELECT A.paan_cesemp FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = ((((:basico + :comision)/30 * :diaslab )+ :cambsaltrans) * :PORCEN) /100;
                END
            END
            ELSE
        BEGIN
        IF (comision IS NULL) THEN
        comision = 0;
        SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
        conc_monto = :basico + :comision;
        IF (conc_porc <> 0 AND conc_porc IS NOT NULL) THEN
        VALOR = (((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans) * :conc_porc) /100;
        ELSE
        IF (:porcen <> 0 AND :porcen IS NOT NULL) THEN
        VALOR = (((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans) * :porcen) /100;
        ELSE
        IF (:montos <> 0 AND :montos IS NOT NULL) THEN
        valor = :montos;
        ELSE
        IF (:conc_monto <> 0 AND :conc_monto IS NOT NULL) THEN
        valor = :conc_monto;
        END
    END
    END
    ELSE
    IF (conc_prov = 'S') THEN
    BEGIN
        conc_monto = :basico;
        IF (conc_porc <> 0 AND conc_porc IS NOT NULL) THEN
        VALOR = (((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans) * :conc_porc) /100;
        ELSE
        IF (porcen <> 0 AND porcen IS NOT NULL) THEN
        VALOR = (((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans) * :porcen) /100;
        ELSE
        IF (montos <> 0 AND montos IS NOT NULL) THEN
        VALOR = :montos;
        ELSE
        IF (conc_monto <> 0 AND conc_monto IS NOT NULL) THEN
        VALOR = :conc_monto;
    END
item = :item + 1;
END
 IF (conc_cod = 920) THEN
 BEGIN
 SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :valor;
 IF (valor IS NULL) THEN
 valor = 0;
 item = :item + 1;
 END
    EXECUTE PROCEDURE LEE_CONFIGURACION('NOMINA','GENERAL','REDONDEO AL MULTIPLO DE DIEZ EN TOTALES')RETURNING_VALUES(:aprox);
    EXECUTE PROCEDURE REDONDEE(:valor, :aprox) RETURNING_VALUES (VALOR);
    IF ((mensual = 'N') OR (periodicidad = 1))  THEN
    INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
    VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
    ELSE
    IF (mensual = 'S') THEN
    BEGIN
         IF ((:periodicidad = 2) AND (liquidaper = 1)) THEN
         BEGIN
          IF ((periodo = 1) OR (periodo = 3) OR (periodo = 5) OR (periodo = 7) OR (periodo = 9) OR (periodo = 11)
          OR (periodo = 13) OR (periodo = 15) OR (periodo = 17) OR (periodo = 19) OR (periodo = 21) OR (periodo = 23)) THEN
             INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
             VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
         END
         ELSE
         IF ((:periodicidad = 2) AND (liquidaper = 2)) THEN
         BEGIN
          IF ((periodo = 2) OR (periodo = 4) OR (periodo = 6) OR (periodo = 8) OR (periodo = 10) OR (periodo = 12)
          OR (periodo = 14) OR (periodo = 16) OR (periodo = 18) OR (periodo = 20) OR (periodo = 22) OR (periodo = 24)) THEN
             INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
             VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
         END
         ELSE
         IF ((:periodicidad = 3) AND (liquidaper = 1)) THEN
         BEGIN
          IF ((periodo = 1) OR (periodo = 5) OR (periodo = 9) OR (periodo = 13) OR (periodo = 17) OR (periodo = 21)
          OR (periodo = 25) OR (periodo = 29) OR (periodo = 33) OR (periodo = 37) OR (periodo = 41) OR (periodo = 45)
          OR (periodo = 49)) THEN
             INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
             VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
         END
         ELSE
         IF ((:periodicidad = 3) AND (liquidaper = 2)) THEN
         BEGIN
          IF ((periodo = 2) OR (periodo = 6) OR (periodo = 10) OR (periodo = 14) OR (periodo = 18) OR (periodo = 22)
          OR (periodo = 26) OR (periodo = 30) OR (periodo = 34) OR (periodo = 38) OR (periodo = 42) OR (periodo = 46)
          OR (periodo = 50)) THEN
            INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
             VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
         END
         ELSE
         IF ((:periodicidad = 3) AND (liquidaper = 3)) THEN
         BEGIN
          IF ((periodo = 3) OR (periodo = 7) OR (periodo = 11) OR (periodo = 15) OR (periodo = 19) OR (periodo = 23)
          OR (periodo = 27) OR (periodo = 31) OR (periodo = 35) OR (periodo = 39) OR (periodo = 43) OR (periodo = 47)
          OR (periodo = 51)) THEN
            INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
             VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
         END
         ELSE
         IF ((:periodicidad = 3) AND (liquidaper = 4)) THEN
         BEGIN
          IF ((periodo = 4) OR (periodo = 8) OR (periodo = 12) OR (periodo = 16) OR (periodo = 20) OR (periodo = 24)
          OR (periodo = 29) OR (periodo = 32) OR (periodo = 36) OR (periodo = 40) OR (periodo = 44) OR (periodo = 48)
          OR (periodo = 52)) THEN
            INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
             VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
         END
    END
  END
 END
END
SUSPEND;
END
^

SET TERM ; ^


SET TERM ^ ;

CREATE OR ALTER PROCEDURE DIAS_LABORADOS (
    nitempl varchar(20),
    periodo integer,
    fec date,
    mensual char(1))
returns (
    totaldiaslab integer)
as
declare variable diasnolab integer;
declare variable diaslabxper integer;
declare variable perpago integer;
declare variable fecing date;
declare variable diasfec integer;
declare variable diasing integer;
BEGIN
SELECT E.empl_ppago, E.empl_fecing
FROM EMPLEADOS E WHERE TERC_NIT = :nitempl
INTO :perpago, :fecing;
IF (mensual = 'N') THEN
BEGIN
IF (perpago = 1) THEN
diaslabxper = 30;
ELSE
IF (perpago = 2) THEN
diaslabxper = 15;
ELSE
IF (perpago = 3) THEN
diaslabxper = 7;
END
ELSE
diaslabxper = 30;
IF (SUBSTR(fecing,1,7) = SUBSTR(FEC,1,7)) THEN
BEGIN
diasfec = CAST(substr(fec,9,10) AS INTEGER);
diasing = CAST(substr(fecing,9,10) AS INTEGER);
diaslabxper = diasfec - diasing;
IF ((diaslabxper > 15) AND (perpago = 2)) THEN
diaslabxper = 15;
END
SELECT SUM (NONO_DURA)
FROM nomina_novedades WHERE TERC_NIT = :nitempl AND (TNOV_COD = 9 or (TNOV_COD = 6) or (TNOV_COD = 2) or (TNOV_COD =3) or (TNOV_COD = 4)  ) AND NONO_PERIODO = :periodo
INTO :diasnolab;
totaldiaslab =  :diaslabxper - :diasnolab;
IF (totaldiaslab IS NULL) THEN
totaldiaslab =  :diaslabxper;
SUSPEND;
END
^

SET TERM ; ^


SET TERM ^ ;

CREATE OR ALTER PROCEDURE CAUSA_NOMINA (
    fec date,
    periodo integer,
    periodicidad integer,
    pagoglobal char(1),
    ano char(4))
returns (
    idnomina integer)
as
declare variable item integer;
declare variable nite varchar(20) character set none;
declare variable nit_tercero varchar(20);
declare variable concept integer;
declare variable montos numeric(18,2);
declare variable porcen numeric(9,4);
declare variable entidad varchar(20);
declare variable conc_cod integer;
declare variable conc_deduc char(1);
declare variable conc_porc numeric(9,4);
declare variable conc_entidad integer;
declare variable conc_monto numeric(18,2);
declare variable conc_modifi char(1);
declare variable conc_promedio char(1);
declare variable emco_perprom integer;
declare variable valor numeric(18,2);
declare variable diaslab integer;
declare variable conc_prov char(1);
declare variable conc_aporte char(1);
declare variable numeroprom integer;
declare variable conc_aplicaprom char(1);
declare variable perinicial integer;
declare variable anoprom integer;
declare variable conc_dias char(1);
declare variable conc_otroconc char(1);
declare variable conc_codotroconc integer;
declare variable anosum integer;
declare variable salario char(1) character set none;
declare variable liquidaper integer;
declare variable rmod numeric(2,2);
declare variable basico numeric(18,2);
declare variable niteps varchar(20);
declare variable nitafc varchar(20);
declare variable nitafp varchar(20);
declare variable nitccf varchar(20);
declare variable gtoempr char(1);
declare variable comision numeric(18,2);
declare variable cambsaltrans numeric(18,2);
declare variable saldosini numeric(18,2);
declare variable duranov integer;
declare variable base numeric(18,2);
declare variable aprox integer;
declare variable mensual char(1);
BEGIN
/* SI ES QUINCENAL */
EXECUTE PROCEDURE cambie_id_nomina RETURNING_VALUES(:idnomina);
INSERT INTO nomina (nomi_id, NOMI_FECCAUSA, NOMI_PAGOGLOBAL, NOMI_PERIODOCIDAD, NOMI_PERIODO, NOMI_ANO, NOMI_LIQOK)
VALUES (:IDNOMINA, :fec,:pagoglobal, :periodicidad, :periodo, :ano, 'N');
 BEGIN
    item = 1;
    FOR SELECT E.TERC_NIT, E.empl_salario, e.empl_eps, e.empl_afc, e.empl_afp, e.empl_ccf
    FROM EMPLEADOS E
    WHERE E.empl_ppago = :periodicidad AND E.empl_fecret IS NULL
    INTO :nite, :basico, :niteps, :nitafc, :nitafp, :nitccf
    DO
    BEGIN
    FOR SELECT CE.TERC_NIT, CE.CONC_COD, CE.EMCO_MONTO, CE.EMCO_PORC, ce.empl_entidad, CE.emco_perprom, CE.emco_luquidaper, CE.emco_mensual, CN.CONC_COD, CN.CONC_DEDUC,CN.CONC_PORC, CN.CONC_ENTIDAD, CN.CONC_MONTO,  CN.CONC_DIAS, CN.CONC_MODIFI,
    CN.CONC_PROMEDIO, CN.conc_salario, CE.emco_perprom, CN.conc_prov, CN.conc_aporte, CN.conc_aplicaprom, cn.conc_otroconc, cn.conc_codotroconc, CN.conc_gtoempr, CN.conc_base
    FROM empleado_conceptos CE, CONCEPTOS_NOMINA CN WHERE ((CE.terc_nit = :nite) AND (CE.CONC_COD = CN.CONC_COD) AND (CN.conc_fecini <= :fec AND CN.conc_fecfin >= :FEC) ) OR ((CE.terc_nit = :nite)
    AND (CE.CONC_COD = CN.CONC_COD) AND (cn.conc_todosper = 'N') AND (CE.emco_ppago = :periodo)) OR  ((CE.terc_nit = :nite) AND (CE.CONC_COD = CN.CONC_COD) AND cn.conc_todosper = 'S')  ORDER BY (TERC_NIT )
    INTO :nit_tercero, :concept,  :montos, :porcen, :entidad, :numeroprom, :liquidaper, :mensual ,:CONC_COD, :CONC_DEDUC, :CONC_PORC,
    :CONC_ENTIDAD, :CONC_MONTO, :CONC_DIAS, :CONC_MODIFI,:CONC_PROMEDIO, :salario,:EMCO_PERPROM, :conc_prov, :conc_aporte , :CONC_APLICAPROM, :conc_otroconc, :conc_codotroconc, :gtoempr, :base
    DO
BEGIN
    IF (conc_dias = 'S') THEN
    EXECUTE PROCEDURE DIAS_LABORADOS (:nite, :periodo, :fec, :mensual) RETURNING_VALUES (:diaslab);
    ELSE
    BEGIN
    diaslab = 15;
    IF (mensual = 'S') THEN
    BEGIN
    IF (periodicidad = 2) THEN
    diaslab = 30;
    ELSE
    IF (liquidaper = 3) THEN
    diaslab = 30;
    END
    END
 SELECT ((n.nono_valor /30) * n.nono_dura), (n.nono_dura) FROM nomina_novedades n WHERE n.tnov_cod = 11 AND n.terc_nit = :nite AND n.nono_periodo = :periodo INTO :cambsaltrans, :duranov;
 IF (cambsaltrans IS NULL) THEN
 cambsaltrans = 0;
 IF (duranov IS NULL) THEN
 duranov = 0;
 diaslab = :diaslab - :duranov;
 IF (conc_cod = 921) THEN
 BEGIN
 IF (porcen IS NOT NULL AND porcen <> 0) THEN
 valor = ((basico / 30)* :diaslab ) * :PORCEN /100;
 ELSE
 IF (conc_porc IS NOT NULL AND conc_porc <> 0) THEN
 valor = ((basico / 30)* :diaslab ) * :conc_porc /100;
 END
 ELSE
 IF (conc_cod = 922) THEN
 BEGIN
 SELECT P.prcu_monto FROM prestamo_cuotas P, prestamo_nomina PN WHERE P.prcu_ano = :ano AND P.prcu_periodo = :periodo AND PN.prno_id = P.prno_id AND PN.terc_nit = :nite INTO :valor;
 IF (valor IS NULL) THEN
 valor = 0;
 item = :item + 1;
 UPDATE prestamo_cuotas  P SET prcu_ok = 'S' WHERE P.prcu_ano = :ano AND P.prcu_periodo = :periodo AND P.prno_id = (SELECT PN.prno_id FROM PRESTAMO_NOMINA PN WHERE PN.terc_nit = :nite);
 END
 ELSE
 BEGIN
    IF ((:montos = 0) OR (:montos IS NULL)) THEN
      BEGIN
      IF ((CONC_PORC = 0 AND :porcen = 0) OR (CONC_PORC IS NULL AND :porcen = 0) OR (CONC_PORC = 0 AND :porcen IS NULL) OR (CONC_PORC IS NULL AND :porcen IS NULL) ) THEN
        BEGIN
        IF ((conc_monto <> 0) AND (conc_monto IS NOT NULL) ) THEN
        BEGIN
        VALOR = :CONC_MONTO;
        IF (:conc_dias = 'S') THEN
        valor = (:valor / 30) * :diaslab;
        END
        ELSE
        IF (salario = 'S' AND CONC_COD <> 900 AND CONC_COD <> 920) THEN
        BEGIN
        conc_monto = :basico;
        VALOR = (:conc_monto/30 * :diaslab ) + :cambsaltrans;
        END
        ELSE
        BEGIN
        valor = montos;
        IF (:conc_dias = 'S') THEN
        valor = (:valor / 30) * :diaslab;
        END
        END
       ELSE
       BEGIN
        IF (:porcen <> 0) THEN
          BEGIN
            IF ((conc_monto <> 0) AND (conc_monto IS NOT NULL) ) THEN
            BEGIN
              VALOR = ((:CONC_MONTO ) * :PORCEN) /100;
            END
          END
          ELSE
          BEGIN
            IF ((conc_monto <> 0) AND (conc_monto IS NOT NULL) ) THEN
            BEGIN
              VALOR = ((:CONC_MONTO) * :conc_porc) /100;
            END
            ELSE
        IF (salario = 'S' AND CONC_COD <> 900 AND CONC_COD <> 920) THEN
            BEGIN
              conc_monto = :basico;
              VALOR = ((:CONC_MONTO)+ :cambsaltrans * :conc_porc) /100;
            END
            ELSE
            if (:conc_monto = 0 AND :montos = 0) then
            BEGIN
            conc_monto = :basico;
            VALOR = (((:CONC_MONTO / 30) * :diaslab) + :cambsaltrans * :conc_porc) /100;
            END
          END
       END
      END
    ELSE
    BEGIN
      IF ((CONC_PORC = 0 OR (conc_porc IS NULL)) AND (:porcen = 0 OR (porcen IS NULL))) THEN
      BEGIN
      VALOR = (:montos);
      IF (:conc_dias = 'S') THEN
      valor = (:valor / 30) * :diaslab;
      END
      ELSE
      BEGIN
        IF (:porcen <> 0 AND porcen IS NOT NULL) THEN
          BEGIN
          VALOR = ((:MONTOS ) * :PORCEN) /100;
          END
          ELSE
          BEGIN
          VALOR = ((:montos) * :CONC_PORC) /100;
          END
          END
   END
    IF (conc_promedio = 'S') THEN
    BEGIN
    perinicial = :periodo - (:numeroprom) + 1;
    anoprom = CAST (ano AS INTEGER);
    IF (perinicial <= 0) THEN
    BEGIN
    perinicial = 24 + :PERINICIAL;
    anoprom = CAST(ANO AS INTEGER) - 1;
    END
    SELECT SUM (noco_valor) FROM nomina_conceptos n WHERE n.noco_aplicaprom = 'S' AND N.noco_periodo >= :perinicial - 1 AND N.noco_periodo < :periodo AND N.noco_ano >= :anoprom AND N.noco_ano <= :ano AND terc_nit = :nite INTO :valor;
    valor = (valor / numeroprom);
    SELECT NOCO_VALOR FROM NOMINA_CONCEPTOS WHERE CONC_COD = :conc_cod AND TERC_NIT  = :nite AND NOCO_PAGOOK = 'N' AND NOCO_PERIODO = 0 INTO :saldosini;
    IF (saldosini IS NULL) THEN
    saldosini = 0;
    ELSE
    UPDATE nomina_conceptos N SET noco_pagook = 'S' WHERE n.noco_aplicaprom = 'S' AND N.noco_periodo >= :perinicial - 1 AND N.noco_periodo < :periodo AND N.noco_ano >= :anoprom AND N.noco_ano <= :ano  AND CONC_COD = :conc_cod AND terc_nit = :nite AND NOCO_PERIODO = 0;
    VALOR = :valor + :saldosini;
    UPDATE nomina_conceptos N SET noco_pagook = 'S' WHERE n.noco_aplicaprom = 'S' AND N.noco_periodo >= :perinicial - 1 AND N.noco_periodo < :periodo AND N.noco_ano >= :anoprom AND N.noco_ano <= :ano  AND CONC_COD = :conc_cod AND terc_nit = :nite;
    END
    IF (conc_otroconc = 'S') THEN
    BEGIN
    anosum = CAST(ano AS INTEGER);
    anosum = anosum - 1;
    SELECT SUM (noco_valor) FROM nomina_conceptos n WHERE n.noco_ano = :anosum AND n.conc_cod = :conc_codotroconc AND N.terc_nit = :nite INTO :valor;
    SELECT NOCO_VALOR FROM NOMINA_CONCEPTOS WHERE noco_ano = :anosum AND conc_cod = :conc_codotroconc AND terc_nit = :nite AND NOCO_PERIODO = 0 INTO :saldosini;
    IF (saldosini IS NULL) THEN
    saldosini = 0;
    ELSE
    UPDATE nomina_conceptos SET noco_pagook = 'S' WHERE noco_ano = :anosum AND conc_cod = :conc_codotroconc AND NOCO_PERIODO = 0 AND terc_nit = :nite;
    VALOR = :valor + :saldosini;
    UPDATE nomina_conceptos SET noco_pagook = 'S' WHERE noco_ano = :anosum AND conc_cod = :conc_codotroconc AND terc_nit = :nite;
    END
/*SI EL CONCEPTO ES UN APORTE*/
IF (conc_aporte = 'S') THEN
BEGIN
    IF ((:entidad = '' ) OR (entidad IS NULL)) THEN
    BEGIN
     SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
    IF (comision IS NULL) THEN
     comision = 0;
     valor = :basico + :comision;
    IF ((conc_cod = 904) OR (conc_cod = 905) OR (conc_cod = 906)) THEN
            BEGIN
            entidad = :nitafp;
                IF (conc_cod = 904) THEN
                BEGIN
                SELECT A.paan_afptr FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = (((((:basico /30) * :diaslab ) + :comision)+ :cambsaltrans) * :PORCEN) /100;
                END
                ELSE
                IF ((conc_cod = 905) OR (conc_cod = 906)) THEN
                BEGIN
                SELECT A.paan_afpem FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = (((((:basico /30) * :diaslab ) + :comision)+ :cambsaltrans) * :PORCEN) /100;
                END
            END
            ELSE
       IF ((conc_cod = 907) OR (conc_cod = 914) OR (conc_cod = 915)) THEN
            BEGIN
            entidad = :niteps;
                IF (conc_cod = 907) THEN
                BEGIN
                SELECT A.paan_epstr FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = (((((:basico )/30 * :diaslab ) + :comision)+ :cambsaltrans) * :PORCEN) /100;
                END
                ELSE
                IF ((conc_cod = 914) OR (conc_cod = 915)) THEN
                BEGIN
                SELECT A.paan_epsem FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = (((((:basico )/30 * :diaslab ) + :comision)+ :cambsaltrans) * :PORCEN) /100;
                END
            END
            ELSE
       IF ((conc_cod = 910) OR (conc_cod = 911) OR (conc_cod = 916) OR (conc_cod = 917) OR (conc_cod = 918) OR (conc_cod = 919)) THEN
            BEGIN
            entidad = :nitccf;
            SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
            IF (comision IS NULL) THEN
            comision = 0;
                IF ((conc_cod = 910) OR (conc_cod = 911) ) THEN
                BEGIN
                SELECT A.paan_ccf FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = (((((:basico )/30 * :diaslab ) + :comision)+ :cambsaltrans) * :PORCEN) /100;
                END
                ELSE
                IF ((conc_cod = 916) OR (conc_cod = 917)) THEN
                BEGIN
                SELECT A.paan_icbf FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = (((((:basico )/30 * :diaslab ) + :comision)+ :cambsaltrans) * :PORCEN) /100;
                END
                ELSE
                IF ((conc_cod = 918) OR (conc_cod = 919)) THEN
                BEGIN
                SELECT A.paan_sena FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = (((((:basico )/30 * :diaslab ) + :comision)+ :cambsaltrans) * :PORCEN) /100;
                END
            END
            ELSE
        IF ((conc_cod = 912) OR (conc_cod = 913)) THEN
            BEGIN
            entidad = :nitafc;
            SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
            IF (comision IS NULL) THEN
            comision = 0;
                IF ((conc_cod = 912) OR (conc_cod = 913) ) THEN
                BEGIN
                SELECT A.paan_cesemp FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = ((((:basico + :comision)/30 * :diaslab )+ :cambsaltrans) * :PORCEN) /100;
                END
            END
            ELSE
        BEGIN
        IF (comision IS NULL) THEN
        comision = 0;
        SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
        conc_monto = :basico + :comision;
        IF (conc_porc <> 0 AND conc_porc IS NOT NULL) THEN
        VALOR = (((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans) * :conc_porc) /100;
        ELSE
        IF (:porcen <> 0 AND :porcen IS NOT NULL) THEN
        VALOR = (((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans) * :porcen) /100;
        ELSE
        IF (:montos <> 0 AND :montos IS NOT NULL) THEN
        valor = :montos;
        ELSE
        IF (:conc_monto <> 0 AND :conc_monto IS NOT NULL) THEN
        valor = :conc_monto;
        END
    END
    END
    ELSE
    IF (conc_prov = 'S') THEN
    BEGIN
        conc_monto = :basico;
        IF (conc_porc <> 0 AND conc_porc IS NOT NULL) THEN
        VALOR = (((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans) * :conc_porc) /100;
        ELSE
        IF (porcen <> 0 AND porcen IS NOT NULL) THEN
        VALOR = (((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans) * :porcen) /100;
        ELSE
        IF (montos <> 0 AND montos IS NOT NULL) THEN
        VALOR = :montos;
        ELSE
        IF (conc_monto <> 0 AND conc_monto IS NOT NULL) THEN
        VALOR = :conc_monto;
    END
item = :item + 1;
END
 IF (conc_cod = 920) THEN
 BEGIN
 SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :valor;
 IF (valor IS NULL) THEN
 valor = 0;
 item = :item + 1;
 END
    EXECUTE PROCEDURE LEE_CONFIGURACION('NOMINA','GENERAL','REDONDEO AL MULTIPLO DE DIEZ EN TOTALES')RETURNING_VALUES(:aprox);
    EXECUTE PROCEDURE REDONDEE(:valor, :aprox) RETURNING_VALUES (VALOR);
    IF ((mensual = 'N') OR (periodicidad = 1))  THEN
    INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
    VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
    ELSE
    IF (mensual = 'S') THEN
    BEGIN
         IF ((:periodicidad = 2) AND (liquidaper = 1)) THEN
         BEGIN
          IF ((periodo = 1) OR (periodo = 3) OR (periodo = 5) OR (periodo = 7) OR (periodo = 9) OR (periodo = 11)
          OR (periodo = 13) OR (periodo = 15) OR (periodo = 17) OR (periodo = 19) OR (periodo = 21) OR (periodo = 23)) THEN
             INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
             VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
         END
         ELSE
         IF ((:periodicidad = 2) AND (liquidaper = 2)) THEN
         BEGIN
          IF ((periodo = 2) OR (periodo = 4) OR (periodo = 6) OR (periodo = 8) OR (periodo = 10) OR (periodo = 12)
          OR (periodo = 14) OR (periodo = 16) OR (periodo = 18) OR (periodo = 20) OR (periodo = 22) OR (periodo = 24)) THEN
             INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
             VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
         END
         ELSE
         IF ((:periodicidad = 3) AND (liquidaper = 1)) THEN
         BEGIN
          IF ((periodo = 1) OR (periodo = 5) OR (periodo = 9) OR (periodo = 13) OR (periodo = 17) OR (periodo = 21)
          OR (periodo = 25) OR (periodo = 29) OR (periodo = 33) OR (periodo = 37) OR (periodo = 41) OR (periodo = 45)
          OR (periodo = 49)) THEN
             INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
             VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
         END
         ELSE
         IF ((:periodicidad = 3) AND (liquidaper = 2)) THEN
         BEGIN
          IF ((periodo = 2) OR (periodo = 6) OR (periodo = 10) OR (periodo = 14) OR (periodo = 18) OR (periodo = 22)
          OR (periodo = 26) OR (periodo = 30) OR (periodo = 34) OR (periodo = 38) OR (periodo = 42) OR (periodo = 46)
          OR (periodo = 50)) THEN
            INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
             VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
         END
         ELSE
         IF ((:periodicidad = 3) AND (liquidaper = 3)) THEN
         BEGIN
          IF ((periodo = 3) OR (periodo = 7) OR (periodo = 11) OR (periodo = 15) OR (periodo = 19) OR (periodo = 23)
          OR (periodo = 27) OR (periodo = 31) OR (periodo = 35) OR (periodo = 39) OR (periodo = 43) OR (periodo = 47)
          OR (periodo = 51)) THEN
            INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
             VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
         END
         ELSE
         IF ((:periodicidad = 3) AND (liquidaper = 4)) THEN
         BEGIN
          IF ((periodo = 4) OR (periodo = 8) OR (periodo = 12) OR (periodo = 16) OR (periodo = 20) OR (periodo = 24)
          OR (periodo = 29) OR (periodo = 32) OR (periodo = 36) OR (periodo = 40) OR (periodo = 44) OR (periodo = 48)
          OR (periodo = 52)) THEN
            INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
             VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
         END
    END
  END
 END
END
SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER PROCEDURE LIQUIDA_HORAS_EXTRA (
    nit varchar(20),
    id integer,
    hd smallint,
    hn smallint,
    hfd smallint,
    hfn smallint,
    ano char(4),
    provi char(1))
as
declare variable tot_he numeric(18,2);
declare variable tot_fesd numeric(18,2);
declare variable tot_fesn numeric(18,2);
declare variable tot_diur numeric(18,2);
declare variable tot_noct numeric(18,2);
declare variable tar_fesd numeric(9,4);
declare variable tar_fesn numeric(9,4);
declare variable tar_diur numeric(9,4);
declare variable tar_noct numeric(9,4);
declare variable monto integer;
begin
if (PROVI = 'N') then
BEGIN
SELECT EMPL_SALARIO FROM empleados WHERE TERC_NIT = :NIT into :monto;
  monto = :monto / 240;
select PAAN_HORASDI, PAAN_HORASNO, PAAN_HORASFN, PAAN_HORASFD FROM PARAMETROS_ANO WHERE paan_ano = :ano
  into :tar_diur, :tar_noct, :tar_fesn, :tar_fesd;
  tot_diur = :monto * tar_diur;
  tot_noct = :monto * tar_noct;
  tot_fesn = :monto * tar_fesn;
  tot_fesd = :monto * tar_fesd;
  tot_diur = :tot_diur * :hd;
  tot_noct = :tot_noct * :hn;
  tot_fesn = :tot_fesn * :hfn;
  tot_fesd = :tot_fesd * :hfd;
  tot_he =  tot_diur + tot_noct + tot_fesd + tot_fesn;
update nomina_detalle set node_extras = :tot_he where nomi_id = :id and terc_nit = :nit;
update nomina_conceptos set noco_valor = :tot_he where nomi_id = :id and terc_nit = :nit and conc_cod = 900;
  suspend;
END
ELSE
BEGIN
SELECT EMPL_SALARIO FROM empleados WHERE TERC_NIT = :NIT into :monto;
  monto = :monto / 240;
select PAAN_HORASDI, PAAN_HORASNO, PAAN_HORASFN, PAAN_HORASFD FROM PARAMETROS_ANO WHERE paan_ano = :ano
  into :tar_diur, :tar_noct, :tar_fesn, :tar_fesd;
  tot_diur = :monto * tar_diur;
  tot_noct = :monto * tar_noct;
  tot_fesn = :monto * tar_fesn;
  tot_fesd = :monto * tar_fesd;
  tot_diur = :tot_diur * :hd;
  tot_noct = :tot_noct * :hn;
  tot_fesn = :tot_fesn * :hfn;
  tot_fesd = :tot_fesd * :hfd;
  tot_he =  tot_diur + tot_noct + tot_fesd + tot_fesn;
update nomina_detalle_PROV set ndep_extras = :tot_he where nopo_id = :id and terc_nit = :nit;
update nomina_conceptos_PROV set ncop_valor = :tot_he where nopo_id = :id and terc_nit = :nit and conc_cod = 900;
  suspend;
END
end
^

SET TERM ; ^


DROP TRIGGER NOMINA_DETALLE_AI0;
DROP TRIGGER nomina_detalle_prov_ai0;

CREATE TABLE NOMINA_HORASEXT (
    NOEX_PERIODIO INTEGER NOT NULL,
    TERC_NIT NIT NOT NULL,
    NOEX_DIUR INTEGER,
    NOEX_FDIUR INTEGER,
    NOEX_NOCT INTEGER,
    NOEX_FNOCT INTEGER);
alter table NOMINA_HORASEXT
add constraint PK_NOMINA_HORASEXT
primary key (NOEX_PERIODIO,TERC_NIT);

ALTER TABLE NOMINA_HORASEXT ADD NOEX_MONTO NUMERIC(18,2);
ALTER TABLE NOMINA_HORASEXT ADD NOEX_periodicidad INTEGER;
ALTER TABLE NOMINA_HORASEXT ADD NOEX_ANO CHAR(4);

SET TERM ^ ;

ALTER PROCEDURE LIQUIDA_HORAS_EXTRA(
    NIT VARCHAR(20),
    HD SMALLINT,
    HN SMALLINT,
    HFD SMALLINT,
    HFN SMALLINT,
    ANO CHAR(4),
    PROVI CHAR(1))
RETURNS( tot_he numeric(18,2))
AS
declare variable tot_fesd numeric(18,2);
declare variable tot_fesn numeric(18,2);
declare variable tot_diur numeric(18,2);
declare variable tot_noct numeric(18,2);
declare variable tar_fesd numeric(9,4);
declare variable tar_fesn numeric(9,4);
declare variable tar_diur numeric(9,4);
declare variable tar_noct numeric(9,4);
declare variable monto integer;
begin
if (PROVI = 'N') then
BEGIN
SELECT EMPL_SALARIO FROM empleados WHERE TERC_NIT = :NIT into :monto;
  monto = :monto / 240;
select PAAN_HORASDI, PAAN_HORASNO, PAAN_HORASFN, PAAN_HORASFD FROM PARAMETROS_ANO WHERE paan_ano = :ano
  into :tar_diur, :tar_noct, :tar_fesn, :tar_fesd;
  tot_diur = :monto * tar_diur;
  tot_noct = :monto * tar_noct;
  tot_fesn = :monto * tar_fesn;
  tot_fesd = :monto * tar_fesd;
  tot_diur = :tot_diur * :hd;
  tot_noct = :tot_noct * :hn;
  tot_fesn = :tot_fesn * :hfn;
  tot_fesd = :tot_fesd * :hfd;
  tot_he =  tot_diur + tot_noct + tot_fesd + tot_fesn;
  suspend;
END
end
^

SET TERM ; ^

SET TERM ^ ;

create trigger NOMINA_HORASEXT_BI for NOMINA_HORASEXT
active BEFORE INSERT position 0
as
begin
execute PROCEDURE liquida_horas_extra (NEW.terc_nit,NEW.noex_diur,NEW.noex_noct,NEW.noex_fdiur,NEW.noex_fnoct,NEW.noex_ano,'N')returning_values(NEW.noex_monto);
end
^

SET TERM ; ^

GRANT UPDATE,REFERENCES ON NOMINA_HORASEXT TO TRIGGER NOMINA_HORASEXT_BI;
GRANT EXECUTE ON PROCEDURE LIQUIDA_HORAS_EXTRA TO TRIGGER NOMINA_HORASEXT_BI;

ALTER TABLE NOMINA_HORASEXT DROP CONSTRAINT PK_NOMINA_HORASEXT;


INSERT INTO CONCEPTOS_NOMINA (CONC_COD, CONC_NOMBRE, CONC_DEDUC, CONC_FECINI, CONC_FECFIN, CONC_PORC, CONC_BASE, CONC_ENTIDAD, CONC_MONTO, CONC_CTAGAST, CONC_DIAS, CONC_MODIFI, CONC_DIAPAGO, CONC_PROMEDIO, CONC_TODOSPER, CONC_PROV, CONC_PERACTUAL, CONC_APORTE, CONC_APLICAPROM, CONC_PERPROMEDIO, CONC_OTROCONC, CONC_CODOTROCONC, CONC_SALARIO, CONC_CTACXP, CONC_NOMCORTO, CONC_PERIODOS, CONC_GTOEMPR) VALUES (931, 'HORAS EXTRAS ADMIN', 'N', '1-JAN-2008', '31-DEC-2008', 0, 0, NULL, 0, '51051501', 'N', 'S', NULL, 'N', 'S', 'N', 'S', 'N', 'S', NULL, 'N', NULL, 'N', '250505', 'HORAS EXT', NULL, 'N');

SET TERM ^ ;

ALTER PROCEDURE CAUSA_NOMINA(
    FEC DATE,
    PERIODO INTEGER,
    PERIODICIDAD INTEGER,
    PAGOGLOBAL CHAR(1),
    ANO CHAR(4))
RETURNS (
    IDNOMINA INTEGER)
AS
declare variable item integer;
declare variable nite varchar(20) character set none;
declare variable nit_tercero varchar(20);
declare variable concept integer;
declare variable montos numeric(18,2);
declare variable porcen numeric(9,4);
declare variable entidad varchar(20);
declare variable conc_cod integer;
declare variable conc_deduc char(1);
declare variable conc_porc numeric(9,4);
declare variable conc_entidad integer;
declare variable conc_monto numeric(18,2);
declare variable conc_modifi char(1);
declare variable conc_promedio char(1);
declare variable emco_perprom integer;
declare variable valor numeric(18,2);
declare variable diaslab integer;
declare variable conc_prov char(1);
declare variable conc_aporte char(1);
declare variable numeroprom integer;
declare variable conc_aplicaprom char(1);
declare variable perinicial integer;
declare variable anoprom integer;
declare variable conc_dias char(1);
declare variable conc_otroconc char(1);
declare variable conc_codotroconc integer;
declare variable anosum integer;
declare variable salario char(1) character set none;
declare variable liquidaper integer;
declare variable rmod numeric(2,2);
declare variable basico numeric(18,2);
declare variable niteps varchar(20);
declare variable nitafc varchar(20);
declare variable nitafp varchar(20);
declare variable nitccf varchar(20);
declare variable gtoempr char(1);
declare variable comision numeric(18,2);
declare variable cambsaltrans numeric(18,2);
declare variable saldosini numeric(18,2);
declare variable duranov integer;
declare variable base numeric(18,2);
declare variable aprox integer;
declare variable mensual char(1);
BEGIN
/* SI ES QUINCENAL */
EXECUTE PROCEDURE cambie_id_nomina RETURNING_VALUES(:idnomina);
INSERT INTO nomina (nomi_id, NOMI_FECCAUSA, NOMI_PAGOGLOBAL, NOMI_PERIODOCIDAD, NOMI_PERIODO, NOMI_ANO, NOMI_LIQOK)
VALUES (:IDNOMINA, :fec,:pagoglobal, :periodicidad, :periodo, :ano, 'N');
 BEGIN
    item = 1;
    FOR SELECT E.TERC_NIT, E.empl_salario, e.empl_eps, e.empl_afc, e.empl_afp, e.empl_ccf
    FROM EMPLEADOS E
    WHERE E.empl_ppago = :periodicidad AND E.empl_fecret IS NULL
    INTO :nite, :basico, :niteps, :nitafc, :nitafp, :nitccf
    DO
    BEGIN
    FOR SELECT CE.TERC_NIT, CE.CONC_COD, CE.EMCO_MONTO, CE.EMCO_PORC, ce.empl_entidad, CE.emco_perprom, CE.emco_luquidaper, CE.emco_mensual, CN.CONC_COD, CN.CONC_DEDUC,CN.CONC_PORC, CN.CONC_ENTIDAD, CN.CONC_MONTO,  CN.CONC_DIAS, CN.CONC_MODIFI,
    CN.CONC_PROMEDIO, CN.conc_salario, CE.emco_perprom, CN.conc_prov, CN.conc_aporte, CN.conc_aplicaprom, cn.conc_otroconc, cn.conc_codotroconc, CN.conc_gtoempr, CN.conc_base
    FROM empleado_conceptos CE, CONCEPTOS_NOMINA CN WHERE ((CE.terc_nit = :nite) AND (CE.CONC_COD = CN.CONC_COD) AND (CN.conc_fecini <= :fec AND CN.conc_fecfin >= :FEC) ) OR ((CE.terc_nit = :nite)
    AND (CE.CONC_COD = CN.CONC_COD) AND (cn.conc_todosper = 'N') AND (CE.emco_ppago = :periodo)) OR  ((CE.terc_nit = :nite) AND (CE.CONC_COD = CN.CONC_COD) AND cn.conc_todosper = 'S')  ORDER BY (TERC_NIT )
    INTO :nit_tercero, :concept,  :montos, :porcen, :entidad, :numeroprom, :liquidaper, :mensual ,:CONC_COD, :CONC_DEDUC, :CONC_PORC,
    :CONC_ENTIDAD, :CONC_MONTO, :CONC_DIAS, :CONC_MODIFI,:CONC_PROMEDIO, :salario,:EMCO_PERPROM, :conc_prov, :conc_aporte , :CONC_APLICAPROM, :conc_otroconc, :conc_codotroconc, :gtoempr, :base
    DO
BEGIN
    IF (conc_dias = 'S') THEN
    EXECUTE PROCEDURE DIAS_LABORADOS (:nite, :periodo, :fec, :mensual) RETURNING_VALUES (:diaslab);
    ELSE
    BEGIN
    diaslab = 15;
    IF (mensual = 'S') THEN
    BEGIN
    IF (periodicidad = 2) THEN
    diaslab = 30;
    ELSE
    IF (liquidaper = 3) THEN
    diaslab = 30;
    END
    END
 SELECT ((n.nono_valor /30) * n.nono_dura), (n.nono_dura) FROM nomina_novedades n WHERE n.tnov_cod = 11 AND n.terc_nit = :nite AND n.nono_periodo = :periodo INTO :cambsaltrans, :duranov;
 IF (cambsaltrans IS NULL) THEN
 cambsaltrans = 0;
 IF (duranov IS NULL) THEN
 duranov = 0;
 diaslab = :diaslab - :duranov;
 IF (conc_cod = 921) THEN
 BEGIN
 IF (porcen IS NOT NULL AND porcen <> 0) THEN
 valor = ((basico / 30)* :diaslab ) * :PORCEN /100;
 ELSE
 IF (conc_porc IS NOT NULL AND conc_porc <> 0) THEN
 valor = ((basico / 30)* :diaslab ) * :conc_porc /100;
 END
 ELSE
 IF (conc_cod = 922) THEN
 BEGIN
 SELECT P.prcu_monto FROM prestamo_cuotas P, prestamo_nomina PN WHERE P.prcu_ano = :ano AND P.prcu_periodo = :periodo AND PN.prno_id = P.prno_id AND PN.terc_nit = :nite INTO :valor;
 IF (valor IS NULL) THEN
 valor = 0;
 item = :item + 1;
 UPDATE prestamo_cuotas  P SET prcu_ok = 'S' WHERE P.prcu_ano = :ano AND P.prcu_periodo = :periodo AND P.prno_id = (SELECT PN.prno_id FROM PRESTAMO_NOMINA PN WHERE PN.terc_nit = :nite);
 END
 ELSE
 BEGIN
    IF ((:montos = 0) OR (:montos IS NULL)) THEN
      BEGIN
      IF ((CONC_PORC = 0 AND :porcen = 0) OR (CONC_PORC IS NULL AND :porcen = 0) OR (CONC_PORC = 0 AND :porcen IS NULL) OR (CONC_PORC IS NULL AND :porcen IS NULL) ) THEN
        BEGIN
        IF ((conc_monto <> 0) AND (conc_monto IS NOT NULL) ) THEN
        BEGIN
        VALOR = :CONC_MONTO;
        IF (:conc_dias = 'S') THEN
        valor = (:valor / 30) * :diaslab;
        END
        ELSE
        IF (salario = 'S' AND CONC_COD <> 900 AND CONC_COD <> 920) THEN
        BEGIN
        conc_monto = :basico;
        VALOR = (:conc_monto/30 * :diaslab ) + :cambsaltrans;
        END
        ELSE
        BEGIN
        valor = montos;
        IF (:conc_dias = 'S') THEN
        valor = (:valor / 30) * :diaslab;
        END
        END
       ELSE
       BEGIN
        IF (:porcen <> 0) THEN
          BEGIN
            IF ((conc_monto <> 0) AND (conc_monto IS NOT NULL) ) THEN
            BEGIN
              VALOR = ((:CONC_MONTO ) * :PORCEN) /100;
            END
          END
          ELSE
          BEGIN
            IF ((conc_monto <> 0) AND (conc_monto IS NOT NULL) ) THEN
            BEGIN
              VALOR = ((:CONC_MONTO) * :conc_porc) /100;
            END
            ELSE
        IF (salario = 'S' AND CONC_COD <> 900 AND CONC_COD <> 920) THEN
            BEGIN
              conc_monto = :basico;
              VALOR = ((:CONC_MONTO)+ :cambsaltrans * :conc_porc) /100;
            END
            ELSE
            if (:conc_monto = 0 AND :montos = 0) then
            BEGIN
            conc_monto = :basico;
            VALOR = (((:CONC_MONTO / 30) * :diaslab) + :cambsaltrans * :conc_porc) /100;
            END
          END
       END
      END
    ELSE
    BEGIN
      IF ((CONC_PORC = 0 OR (conc_porc IS NULL)) AND (:porcen = 0 OR (porcen IS NULL))) THEN
      BEGIN
      VALOR = (:montos);
      IF (:conc_dias = 'S') THEN
      valor = (:valor / 30) * :diaslab;
      END
      ELSE
      BEGIN
        IF (:porcen <> 0 AND porcen IS NOT NULL) THEN
          BEGIN
          VALOR = ((:MONTOS ) * :PORCEN) /100;
          END
          ELSE
          BEGIN
          VALOR = ((:montos) * :CONC_PORC) /100;
          END
          END
   END
    IF (conc_promedio = 'S') THEN
    BEGIN
    perinicial = :periodo - (:numeroprom) + 1;
    anoprom = CAST (ano AS INTEGER);
    IF (perinicial <= 0) THEN
    BEGIN
    perinicial = 24 + :PERINICIAL;
    anoprom = CAST(ANO AS INTEGER) - 1;
    END
    SELECT SUM (noco_valor) FROM nomina_conceptos n WHERE n.noco_aplicaprom = 'S' AND N.noco_periodo >= :perinicial - 1 AND N.noco_periodo < :periodo AND N.noco_ano >= :anoprom AND N.noco_ano <= :ano AND terc_nit = :nite INTO :valor;
    valor = (valor / numeroprom);
    SELECT NOCO_VALOR FROM NOMINA_CONCEPTOS WHERE CONC_COD = :conc_cod AND TERC_NIT  = :nite AND NOCO_PAGOOK = 'N' AND NOCO_PERIODO = 0 INTO :saldosini;
    IF (saldosini IS NULL) THEN
    saldosini = 0;
    ELSE
    UPDATE nomina_conceptos N SET noco_pagook = 'S' WHERE n.noco_aplicaprom = 'S' AND N.noco_periodo >= :perinicial - 1 AND N.noco_periodo < :periodo AND N.noco_ano >= :anoprom AND N.noco_ano <= :ano  AND CONC_COD = :conc_cod AND terc_nit = :nite AND NOCO_PERIODO = 0;
    VALOR = :valor + :saldosini;
    UPDATE nomina_conceptos N SET noco_pagook = 'S' WHERE n.noco_aplicaprom = 'S' AND N.noco_periodo >= :perinicial - 1 AND N.noco_periodo < :periodo AND N.noco_ano >= :anoprom AND N.noco_ano <= :ano  AND CONC_COD = :conc_cod AND terc_nit = :nite;
    END
    IF (conc_otroconc = 'S') THEN
    BEGIN
    anosum = CAST(ano AS INTEGER);
    anosum = anosum - 1;
    SELECT SUM (noco_valor) FROM nomina_conceptos n WHERE n.noco_ano = :anosum AND n.conc_cod = :conc_codotroconc AND N.terc_nit = :nite INTO :valor;
    SELECT NOCO_VALOR FROM NOMINA_CONCEPTOS WHERE noco_ano = :anosum AND conc_cod = :conc_codotroconc AND terc_nit = :nite AND NOCO_PERIODO = 0 INTO :saldosini;
    IF (saldosini IS NULL) THEN
    saldosini = 0;
    ELSE
    UPDATE nomina_conceptos SET noco_pagook = 'S' WHERE noco_ano = :anosum AND conc_cod = :conc_codotroconc AND NOCO_PERIODO = 0 AND terc_nit = :nite;
    VALOR = :valor + :saldosini;
    UPDATE nomina_conceptos SET noco_pagook = 'S' WHERE noco_ano = :anosum AND conc_cod = :conc_codotroconc AND terc_nit = :nite;
    END
/*SI EL CONCEPTO ES UN APORTE*/
IF (conc_aporte = 'S') THEN
BEGIN
    IF ((:entidad = '' ) OR (entidad IS NULL)) THEN
    BEGIN
     SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
    IF (comision IS NULL) THEN
     comision = 0;
     valor = :basico + :comision;
    IF ((conc_cod = 904) OR (conc_cod = 905) OR (conc_cod = 906)) THEN
            BEGIN
            entidad = :nitafp;
                IF (conc_cod = 904) THEN
                BEGIN
                SELECT A.paan_afptr FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = (((((:basico /30) * :diaslab ) + :comision)+ :cambsaltrans) * :PORCEN) /100;
                END
                ELSE
                IF ((conc_cod = 905) OR (conc_cod = 906)) THEN
                BEGIN
                SELECT A.paan_afpem FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = (((((:basico /30) * :diaslab ) + :comision)+ :cambsaltrans) * :PORCEN) /100;
                END
            END
            ELSE
       IF ((conc_cod = 907) OR (conc_cod = 914) OR (conc_cod = 915)) THEN
            BEGIN
            entidad = :niteps;
                IF (conc_cod = 907) THEN
                BEGIN
                SELECT A.paan_epstr FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = (((((:basico )/30 * :diaslab ) + :comision)+ :cambsaltrans) * :PORCEN) /100;
                END
                ELSE
                IF ((conc_cod = 914) OR (conc_cod = 915)) THEN
                BEGIN
                SELECT A.paan_epsem FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = (((((:basico )/30 * :diaslab ) + :comision)+ :cambsaltrans) * :PORCEN) /100;
                END
            END
            ELSE
       IF ((conc_cod = 910) OR (conc_cod = 911) OR (conc_cod = 916) OR (conc_cod = 917) OR (conc_cod = 918) OR (conc_cod = 919)) THEN
            BEGIN
            entidad = :nitccf;
            SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
            IF (comision IS NULL) THEN
            comision = 0;
                IF ((conc_cod = 910) OR (conc_cod = 911) ) THEN
                BEGIN
                SELECT A.paan_ccf FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = (((((:basico )/30 * :diaslab ) + :comision)+ :cambsaltrans) * :PORCEN) /100;
                END
                ELSE
                IF ((conc_cod = 916) OR (conc_cod = 917)) THEN
                BEGIN
                SELECT A.paan_icbf FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = (((((:basico )/30 * :diaslab ) + :comision)+ :cambsaltrans) * :PORCEN) /100;
                END
                ELSE
                IF ((conc_cod = 918) OR (conc_cod = 919)) THEN
                BEGIN
                SELECT A.paan_sena FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = (((((:basico )/30 * :diaslab ) + :comision)+ :cambsaltrans) * :PORCEN) /100;
                END
            END
            ELSE
        IF ((conc_cod = 912) OR (conc_cod = 913)) THEN
            BEGIN
            entidad = :nitafc;
            SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
            IF (comision IS NULL) THEN
            comision = 0;
                IF ((conc_cod = 912) OR (conc_cod = 913) ) THEN
                BEGIN
                SELECT A.paan_cesemp FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = ((((:basico + :comision)/30 * :diaslab )+ :cambsaltrans) * :PORCEN) /100;
                END
            END
            ELSE
        BEGIN
        IF (comision IS NULL) THEN
        comision = 0;
        SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
        conc_monto = :basico + :comision;
        IF (conc_porc <> 0 AND conc_porc IS NOT NULL) THEN
        VALOR = (((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans) * :conc_porc) /100;
        ELSE
        IF (:porcen <> 0 AND :porcen IS NOT NULL) THEN
        VALOR = (((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans) * :porcen) /100;
        ELSE
        IF (:montos <> 0 AND :montos IS NOT NULL) THEN
        valor = :montos;
        ELSE
        IF (:conc_monto <> 0 AND :conc_monto IS NOT NULL) THEN
        valor = :conc_monto;
        END
    END
    END
    ELSE
    IF (conc_prov = 'S') THEN
    BEGIN
        conc_monto = :basico;
        IF (conc_porc <> 0 AND conc_porc IS NOT NULL) THEN
        VALOR = (((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans) * :conc_porc) /100;
        ELSE
        IF (porcen <> 0 AND porcen IS NOT NULL) THEN
        VALOR = (((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans) * :porcen) /100;
        ELSE
        IF (montos <> 0 AND montos IS NOT NULL) THEN
        VALOR = :montos;
        ELSE
        IF (conc_monto <> 0 AND conc_monto IS NOT NULL) THEN
        VALOR = :conc_monto;
    END
item = :item + 1;
END
 IF (conc_cod = 920) THEN
 BEGIN
 SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :valor;
 IF (valor IS NULL) THEN
 valor = 0;
 item = :item + 1;
 END
 ELSE
 if (conc_cod = 900 or (:conc_cod = 931)) then
 BEGIN
 SELECT c.noex_monto FROM nomina_horasext c WHERE c.noex_ano = :ano AND c.noex_periodio = :periodo AND c.noex_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :valor;
 IF (valor IS NULL) THEN
 valor = 0;
 item = :item + 1;
 END
    EXECUTE PROCEDURE LEE_CONFIGURACION('NOMINA','GENERAL','REDONDEO AL MULTIPLO DE DIEZ EN TOTALES')RETURNING_VALUES(:aprox);
    EXECUTE PROCEDURE REDONDEE(:valor, :aprox) RETURNING_VALUES (VALOR);
    IF ((mensual = 'N') OR (periodicidad = 1))  THEN
    INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
    VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
    ELSE
    IF (mensual = 'S') THEN
    BEGIN
         IF ((:periodicidad = 2) AND (liquidaper = 1)) THEN
         BEGIN
          IF ((periodo = 1) OR (periodo = 3) OR (periodo = 5) OR (periodo = 7) OR (periodo = 9) OR (periodo = 11)
          OR (periodo = 13) OR (periodo = 15) OR (periodo = 17) OR (periodo = 19) OR (periodo = 21) OR (periodo = 23)) THEN
             INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
             VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
         END
         ELSE
         IF ((:periodicidad = 2) AND (liquidaper = 2)) THEN
         BEGIN
          IF ((periodo = 2) OR (periodo = 4) OR (periodo = 6) OR (periodo = 8) OR (periodo = 10) OR (periodo = 12)
          OR (periodo = 14) OR (periodo = 16) OR (periodo = 18) OR (periodo = 20) OR (periodo = 22) OR (periodo = 24)) THEN
             INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
             VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
         END
         ELSE
         IF ((:periodicidad = 3) AND (liquidaper = 1)) THEN
         BEGIN
          IF ((periodo = 1) OR (periodo = 5) OR (periodo = 9) OR (periodo = 13) OR (periodo = 17) OR (periodo = 21)
          OR (periodo = 25) OR (periodo = 29) OR (periodo = 33) OR (periodo = 37) OR (periodo = 41) OR (periodo = 45)
          OR (periodo = 49)) THEN
             INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
             VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
         END
         ELSE
         IF ((:periodicidad = 3) AND (liquidaper = 2)) THEN
         BEGIN
          IF ((periodo = 2) OR (periodo = 6) OR (periodo = 10) OR (periodo = 14) OR (periodo = 18) OR (periodo = 22)
          OR (periodo = 26) OR (periodo = 30) OR (periodo = 34) OR (periodo = 38) OR (periodo = 42) OR (periodo = 46)
          OR (periodo = 50)) THEN
            INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
             VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
         END
         ELSE
         IF ((:periodicidad = 3) AND (liquidaper = 3)) THEN
         BEGIN
          IF ((periodo = 3) OR (periodo = 7) OR (periodo = 11) OR (periodo = 15) OR (periodo = 19) OR (periodo = 23)
          OR (periodo = 27) OR (periodo = 31) OR (periodo = 35) OR (periodo = 39) OR (periodo = 43) OR (periodo = 47)
          OR (periodo = 51)) THEN
            INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
             VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
         END
         ELSE
         IF ((:periodicidad = 3) AND (liquidaper = 4)) THEN
         BEGIN
          IF ((periodo = 4) OR (periodo = 8) OR (periodo = 12) OR (periodo = 16) OR (periodo = 20) OR (periodo = 24)
          OR (periodo = 29) OR (periodo = 32) OR (periodo = 36) OR (periodo = 40) OR (periodo = 44) OR (periodo = 48)
          OR (periodo = 52)) THEN
            INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
             VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
         END
    END
  END
 END
END
SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER PROCEDURE LIQUIDA_HORAS_EXTRA (
    nit varchar(20),
    hd smallint,
    hn smallint,
    hfd smallint,
    hfn smallint,
    ano char(4),
    provi char(1))
returns (
    tot_he numeric(18,0))
as
declare variable tot_fesd numeric(18,10);
declare variable tot_fesn numeric(18,10);
declare variable tot_diur numeric(18,10);
declare variable tot_noct numeric(18,10);
declare variable tar_fesd numeric(9,4);
declare variable tar_fesn numeric(9,4);
declare variable tar_diur numeric(9,4);
declare variable tar_noct numeric(9,4);
declare variable monto NUMERIC(18,10);
begin
if (PROVI = 'N') then
BEGIN
SELECT EMPL_SALARIO FROM empleados WHERE TERC_NIT = :NIT into :monto;
  monto = :monto / 240;
select PAAN_HORASDI, PAAN_HORASNO, PAAN_HORASFN, PAAN_HORASFD FROM PARAMETROS_ANO WHERE paan_ano = :ano
  into :tar_diur, :tar_noct, :tar_fesn, :tar_fesd;
  tot_diur = :monto * tar_diur;
  tot_noct = :monto * tar_noct;
  tot_fesn = :monto * tar_fesn;
  tot_fesd = :monto * tar_fesd;
  tot_diur = :tot_diur * :hd;
  tot_noct = :tot_noct * :hn;
  tot_fesn = :tot_fesn * :hfn;
  tot_fesd = :tot_fesd * :hfd;
  tot_he =  tot_diur + tot_noct + tot_fesd + tot_fesn;
  suspend;
END
end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER PROCEDURE CAUSA_NOMINA (
    fec date,
    periodo integer,
    periodicidad integer,
    pagoglobal char(1),
    ano char(4))
returns (
    idnomina integer)
as
declare variable item integer;
declare variable nite varchar(20) character set none;
declare variable nit_tercero varchar(20);
declare variable concept integer;
declare variable montos numeric(18,2);
declare variable porcen numeric(9,4);
declare variable entidad varchar(20);
declare variable conc_cod integer;
declare variable conc_deduc char(1);
declare variable conc_porc numeric(9,4);
declare variable conc_entidad integer;
declare variable conc_monto numeric(18,2);
declare variable conc_modifi char(1);
declare variable conc_promedio char(1);
declare variable emco_perprom integer;
declare variable valor numeric(18,2);
declare variable diaslab integer;
declare variable conc_prov char(1);
declare variable conc_aporte char(1);
declare variable numeroprom integer;
declare variable conc_aplicaprom char(1);
declare variable perinicial integer;
declare variable anoprom integer;
declare variable conc_dias char(1);
declare variable conc_otroconc char(1);
declare variable conc_codotroconc integer;
declare variable anosum integer;
declare variable salario char(1) character set none;
declare variable liquidaper integer;
declare variable rmod numeric(2,2);
declare variable basico numeric(18,2);
declare variable niteps varchar(20);
declare variable nitafc varchar(20);
declare variable nitafp varchar(20);
declare variable nitccf varchar(20);
declare variable gtoempr char(1);
declare variable comision numeric(18,2);
declare variable cambsaltrans numeric(18,2);
declare variable saldosini numeric(18,2);
declare variable duranov integer;
declare variable base numeric(18,2);
declare variable aprox integer;
declare variable mensual char(1);
declare variable horasex numeric(18,2);
BEGIN
/* SI ES QUINCENAL */
EXECUTE PROCEDURE cambie_id_nomina RETURNING_VALUES(:idnomina);
INSERT INTO nomina (nomi_id, NOMI_FECCAUSA, NOMI_PAGOGLOBAL, NOMI_PERIODOCIDAD, NOMI_PERIODO, NOMI_ANO, NOMI_LIQOK)
VALUES (:IDNOMINA, :fec,:pagoglobal, :periodicidad, :periodo, :ano, 'N');
 BEGIN
    item = 1;
    FOR SELECT E.TERC_NIT, E.empl_salario, e.empl_eps, e.empl_afc, e.empl_afp, e.empl_ccf
    FROM EMPLEADOS E
    WHERE E.empl_ppago = :periodicidad AND E.empl_fecret IS NULL
    INTO :nite, :basico, :niteps, :nitafc, :nitafp, :nitccf
    DO
    BEGIN
    FOR SELECT CE.TERC_NIT, CE.CONC_COD, CE.EMCO_MONTO, CE.EMCO_PORC, ce.empl_entidad, CE.emco_perprom, CE.emco_luquidaper, CE.emco_mensual, CN.CONC_COD, CN.CONC_DEDUC,CN.CONC_PORC, CN.CONC_ENTIDAD, CN.CONC_MONTO,  CN.CONC_DIAS, CN.CONC_MODIFI,
    CN.CONC_PROMEDIO, CN.conc_salario, CE.emco_perprom, CN.conc_prov, CN.conc_aporte, CN.conc_aplicaprom, cn.conc_otroconc, cn.conc_codotroconc, CN.conc_gtoempr, CN.conc_base
    FROM empleado_conceptos CE, CONCEPTOS_NOMINA CN WHERE ((CE.terc_nit = :nite) AND (CE.CONC_COD = CN.CONC_COD) AND (CN.conc_fecini <= :fec AND CN.conc_fecfin >= :FEC) ) OR ((CE.terc_nit = :nite)
    AND (CE.CONC_COD = CN.CONC_COD) AND (cn.conc_todosper = 'N') AND (CE.emco_ppago = :periodo)) OR  ((CE.terc_nit = :nite) AND (CE.CONC_COD = CN.CONC_COD) AND cn.conc_todosper = 'S')  ORDER BY (TERC_NIT )
    INTO :nit_tercero, :concept,  :montos, :porcen, :entidad, :numeroprom, :liquidaper, :mensual ,:CONC_COD, :CONC_DEDUC, :CONC_PORC,
    :CONC_ENTIDAD, :CONC_MONTO, :CONC_DIAS, :CONC_MODIFI,:CONC_PROMEDIO, :salario,:EMCO_PERPROM, :conc_prov, :conc_aporte , :CONC_APLICAPROM, :conc_otroconc, :conc_codotroconc, :gtoempr, :base
    DO
BEGIN
    IF (conc_dias = 'S') THEN
    EXECUTE PROCEDURE DIAS_LABORADOS (:nite, :periodo, :fec, :mensual) RETURNING_VALUES (:diaslab);
    ELSE
    BEGIN
    diaslab = 15;
    IF (mensual = 'S') THEN
    BEGIN
    IF (periodicidad = 2) THEN
    diaslab = 30;
    ELSE
    IF (liquidaper = 3) THEN
    diaslab = 30;
    END
    END
 SELECT ((n.nono_valor /30) * n.nono_dura), (n.nono_dura) FROM nomina_novedades n WHERE n.tnov_cod = 11 AND n.terc_nit = :nite AND n.nono_periodo = :periodo INTO :cambsaltrans, :duranov;
 IF (cambsaltrans IS NULL) THEN
 cambsaltrans = 0;
 IF (duranov IS NULL) THEN
 duranov = 0;
 diaslab = :diaslab - :duranov;
 IF (conc_cod = 921) THEN
 BEGIN
 IF (porcen IS NOT NULL AND porcen <> 0) THEN
 valor = ((basico / 30)* :diaslab ) * :PORCEN /100;
 ELSE
 IF (conc_porc IS NOT NULL AND conc_porc <> 0) THEN
 valor = ((basico / 30)* :diaslab ) * :conc_porc /100;
 END
 ELSE
 IF (conc_cod = 922) THEN
 BEGIN
 SELECT P.prcu_monto FROM prestamo_cuotas P, prestamo_nomina PN WHERE P.prcu_ano = :ano AND P.prcu_periodo = :periodo AND PN.prno_id = P.prno_id AND PN.terc_nit = :nite INTO :valor;
 IF (valor IS NULL) THEN
 valor = 0;
 item = :item + 1;
 UPDATE prestamo_cuotas  P SET prcu_ok = 'S' WHERE P.prcu_ano = :ano AND P.prcu_periodo = :periodo AND P.prno_id = (SELECT PN.prno_id FROM PRESTAMO_NOMINA PN WHERE PN.terc_nit = :nite);
 END
 ELSE
 BEGIN
    IF ((:montos = 0) OR (:montos IS NULL)) THEN
      BEGIN
      IF ((CONC_PORC = 0 AND :porcen = 0) OR (CONC_PORC IS NULL AND :porcen = 0) OR (CONC_PORC = 0 AND :porcen IS NULL) OR (CONC_PORC IS NULL AND :porcen IS NULL) ) THEN
        BEGIN
        IF ((conc_monto <> 0) AND (conc_monto IS NOT NULL) ) THEN
        BEGIN
        VALOR = :CONC_MONTO;
        IF (:conc_dias = 'S') THEN
        valor = (:valor / 30) * :diaslab;
        END
        ELSE
        IF (salario = 'S' AND CONC_COD <> 900 AND CONC_COD <> 920) THEN
        BEGIN
        conc_monto = :basico;
        VALOR = (:conc_monto/30 * :diaslab ) + :cambsaltrans;
        END
        ELSE
        BEGIN
        valor = montos;
        IF (:conc_dias = 'S') THEN
        valor = (:valor / 30) * :diaslab;
        END
        END
       ELSE
       BEGIN
        IF (:porcen <> 0) THEN
          BEGIN
            IF ((conc_monto <> 0) AND (conc_monto IS NOT NULL) ) THEN
            BEGIN
              VALOR = ((:CONC_MONTO ) * :PORCEN) /100;
            END
          END
          ELSE
          BEGIN
            IF ((conc_monto <> 0) AND (conc_monto IS NOT NULL) ) THEN
            BEGIN
              VALOR = ((:CONC_MONTO) * :conc_porc) /100;
            END
            ELSE
        IF (salario = 'S' AND CONC_COD <> 900 AND CONC_COD <> 920) THEN
            BEGIN
              conc_monto = :basico;
              VALOR = ((:CONC_MONTO)+ :cambsaltrans * :conc_porc) /100;
            END
            ELSE
            if (:conc_monto = 0 AND :montos = 0) then
            BEGIN
            conc_monto = :basico;
            VALOR = (((:CONC_MONTO / 30) * :diaslab) + :cambsaltrans * :conc_porc) /100;
            END
          END
       END
      END
    ELSE
    BEGIN
      IF ((CONC_PORC = 0 OR (conc_porc IS NULL)) AND (:porcen = 0 OR (porcen IS NULL))) THEN
      BEGIN
      VALOR = (:montos);
      IF (:conc_dias = 'S') THEN
      valor = (:valor / 30) * :diaslab;
      END
      ELSE
      BEGIN
        IF (:porcen <> 0 AND porcen IS NOT NULL) THEN
          BEGIN
          VALOR = ((:MONTOS ) * :PORCEN) /100;
          END
          ELSE
          BEGIN
          VALOR = ((:montos) * :CONC_PORC) /100;
          END
          END
   END
    IF (conc_promedio = 'S') THEN
    BEGIN
    perinicial = :periodo - (:numeroprom) + 1;
    anoprom = CAST (ano AS INTEGER);
    IF (perinicial <= 0) THEN
    BEGIN
    perinicial = 24 + :PERINICIAL;
    anoprom = CAST(ANO AS INTEGER) - 1;
    END
    SELECT SUM (noco_valor) FROM nomina_conceptos n WHERE n.noco_aplicaprom = 'S' AND N.noco_periodo >= :perinicial - 1 AND N.noco_periodo < :periodo AND N.noco_ano >= :anoprom AND N.noco_ano <= :ano AND terc_nit = :nite INTO :valor;
    valor = (valor / numeroprom);
    SELECT NOCO_VALOR FROM NOMINA_CONCEPTOS WHERE CONC_COD = :conc_cod AND TERC_NIT  = :nite AND NOCO_PAGOOK = 'N' AND NOCO_PERIODO = 0 INTO :saldosini;
    IF (saldosini IS NULL) THEN
    saldosini = 0;
    ELSE
    UPDATE nomina_conceptos N SET noco_pagook = 'S' WHERE n.noco_aplicaprom = 'S' AND N.noco_periodo >= :perinicial - 1 AND N.noco_periodo < :periodo AND N.noco_ano >= :anoprom AND N.noco_ano <= :ano  AND CONC_COD = :conc_cod AND terc_nit = :nite AND NOCO_PERIODO = 0;
    VALOR = :valor + :saldosini;
    UPDATE nomina_conceptos N SET noco_pagook = 'S' WHERE n.noco_aplicaprom = 'S' AND N.noco_periodo >= :perinicial - 1 AND N.noco_periodo < :periodo AND N.noco_ano >= :anoprom AND N.noco_ano <= :ano  AND CONC_COD = :conc_cod AND terc_nit = :nite;
    END
    IF (conc_otroconc = 'S') THEN
    BEGIN
    anosum = CAST(ano AS INTEGER);
    anosum = anosum - 1;
    SELECT SUM (noco_valor) FROM nomina_conceptos n WHERE n.noco_ano = :anosum AND n.conc_cod = :conc_codotroconc AND N.terc_nit = :nite INTO :valor;
    SELECT NOCO_VALOR FROM NOMINA_CONCEPTOS WHERE noco_ano = :anosum AND conc_cod = :conc_codotroconc AND terc_nit = :nite AND NOCO_PERIODO = 0 INTO :saldosini;
    IF (saldosini IS NULL) THEN
    saldosini = 0;
    ELSE
    UPDATE nomina_conceptos SET noco_pagook = 'S' WHERE noco_ano = :anosum AND conc_cod = :conc_codotroconc AND NOCO_PERIODO = 0 AND terc_nit = :nite;
    VALOR = :valor + :saldosini;
    UPDATE nomina_conceptos SET noco_pagook = 'S' WHERE noco_ano = :anosum AND conc_cod = :conc_codotroconc AND terc_nit = :nite;
    END
/*SI EL CONCEPTO ES UN APORTE*/
IF (conc_aporte = 'S') THEN
BEGIN
    horasex = null;
    IF ((:entidad = '' ) OR (entidad IS NULL)) THEN
    BEGIN
     SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
    IF (comision IS NULL) THEN
     comision = 0;
     valor = :basico + :comision + :horasex;

    IF ((conc_cod = 904) OR (conc_cod = 905) OR (conc_cod = 906)) THEN
            BEGIN
            entidad = :nitafp;
                IF (conc_cod = 904) THEN
                BEGIN
                SELECT A.paan_afptr FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                SELECT c.noex_monto FROM nomina_horasext c WHERE c.noex_ano = :ano AND c.noex_periodio = :periodo AND c.noex_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :horasex;
                if (horasex is not null) then
                VALOR = (((((:basico )/30 * :diaslab ) + :comision + :horasex)+ :cambsaltrans) * :PORCEN) /100;
                else
                VALOR = (((((:basico )/30 * :diaslab ) + :comision /*+ :horasex*/)+ :cambsaltrans) * :PORCEN) /100;
                END
                ELSE
                IF ((conc_cod = 905) OR (conc_cod = 906)) THEN
                BEGIN
                SELECT A.paan_afpem FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                SELECT c.noex_monto FROM nomina_horasext c WHERE c.noex_ano = :ano AND c.noex_periodio = :periodo AND c.noex_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :horasex;
                if (horasex is not null) then
                VALOR = (((((:basico )/30 * :diaslab ) + :comision + :horasex)+ :cambsaltrans) * :PORCEN) /100;
                else
                VALOR = (((((:basico )/30 * :diaslab ) + :comision /*+ :horasex*/)+ :cambsaltrans) * :PORCEN) /100;
                END
            END
            ELSE
       IF ((conc_cod = 907) OR (conc_cod = 914) OR (conc_cod = 915)) THEN
            BEGIN
            entidad = :niteps;
                IF (conc_cod = 907) THEN
                BEGIN
                SELECT A.paan_epstr FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                SELECT c.noex_monto FROM nomina_horasext c WHERE c.noex_ano = :ano AND c.noex_periodio = :periodo AND c.noex_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :horasex;
                if (horasex is not null) then
                VALOR = (((((:basico )/30 * :diaslab ) + :comision + :horasex)+ :cambsaltrans) * :PORCEN) /100;
                else
                VALOR = (((((:basico )/30 * :diaslab ) + :comision /*+ :horasex*/)+ :cambsaltrans) * :PORCEN) /100;
                END
                ELSE
                IF ((conc_cod = 914) OR (conc_cod = 915)) THEN
                BEGIN
                SELECT A.paan_epsem FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                SELECT c.noex_monto FROM nomina_horasext c WHERE c.noex_ano = :ano AND c.noex_periodio = :periodo AND c.noex_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :horasex;
                if (horasex is not null) then
                VALOR = (((((:basico )/30 * :diaslab ) + :comision + :horasex)+ :cambsaltrans) * :PORCEN) /100;
                else
                VALOR = (((((:basico )/30 * :diaslab ) + :comision /*+ :horasex*/)+ :cambsaltrans) * :PORCEN) /100;
                END
            END
            ELSE
       IF ((conc_cod = 910) OR (conc_cod = 911) OR (conc_cod = 916) OR (conc_cod = 917) OR (conc_cod = 918) OR (conc_cod = 919)) THEN
            BEGIN
            entidad = :nitccf;
            SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
            IF (comision IS NULL) THEN
            comision = 0;
                IF ((conc_cod = 910) OR (conc_cod = 911) ) THEN
                BEGIN
                SELECT A.paan_ccf FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                SELECT c.noex_monto FROM nomina_horasext c WHERE c.noex_ano = :ano AND c.noex_periodio = :periodo AND c.noex_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :horasex;
                if (horasex is not null) then
                VALOR = (((((:basico )/30 * :diaslab ) + :comision + :horasex)+ :cambsaltrans) * :PORCEN) /100;
                else
                VALOR = (((((:basico )/30 * :diaslab ) + :comision /*+ :horasex*/)+ :cambsaltrans) * :PORCEN) /100;
                END
                ELSE
                IF ((conc_cod = 916) OR (conc_cod = 917)) THEN
                BEGIN
                SELECT A.paan_icbf FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                SELECT c.noex_monto FROM nomina_horasext c WHERE c.noex_ano = :ano AND c.noex_periodio = :periodo AND c.noex_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :horasex;
                if (horasex is not null) then
                VALOR = (((((:basico )/30 * :diaslab ) + :comision + :horasex)+ :cambsaltrans) * :PORCEN) /100;
                else
                VALOR = (((((:basico )/30 * :diaslab ) + :comision /*+ :horasex*/)+ :cambsaltrans) * :PORCEN) /100;
                END
                ELSE
                IF ((conc_cod = 918) OR (conc_cod = 919)) THEN
                BEGIN
                SELECT A.paan_sena FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                SELECT c.noex_monto FROM nomina_horasext c WHERE c.noex_ano = :ano AND c.noex_periodio = :periodo AND c.noex_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :horasex;
                if (horasex is not null) then
                VALOR = (((((:basico )/30 * :diaslab ) + :comision + :horasex)+ :cambsaltrans) * :PORCEN) /100;
                else
                VALOR = (((((:basico )/30 * :diaslab ) + :comision /*+ :horasex*/)+ :cambsaltrans) * :PORCEN) /100;
                END
            END
            ELSE
        IF ((conc_cod = 912) OR (conc_cod = 913)) THEN
            BEGIN
            entidad = :nitafc;
            SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
            IF (comision IS NULL) THEN
            comision = 0;
                IF ((conc_cod = 912) OR (conc_cod = 913) ) THEN
                BEGIN
                SELECT A.paan_cesemp FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                SELECT c.noex_monto FROM nomina_horasext c WHERE c.noex_ano = :ano AND c.noex_periodio = :periodo AND c.noex_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :horasex;
                if (horasex is not null) then
                VALOR = (((((:basico )/30 * :diaslab ) + :comision + :horasex)+ :cambsaltrans) * :PORCEN) /100;
                else
                VALOR = (((((:basico )/30 * :diaslab ) + :comision /*+ :horasex*/)+ :cambsaltrans) * :PORCEN) /100;
                END
            END
            ELSE
        BEGIN
        IF (comision IS NULL) THEN
        comision = 0;
        SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
        conc_monto = :basico + :comision;
        IF (conc_porc <> 0 AND conc_porc IS NOT NULL) THEN
        VALOR = (((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans) * :conc_porc) /100;
        ELSE
        IF (:porcen <> 0 AND :porcen IS NOT NULL) THEN
        VALOR = (((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans) * :porcen) /100;
        ELSE
        IF (:montos <> 0 AND :montos IS NOT NULL) THEN
        valor = :montos;
        ELSE
        IF (:conc_monto <> 0 AND :conc_monto IS NOT NULL) THEN
        valor = :conc_monto;
        END
    END
    END
    ELSE
    IF (conc_prov = 'S') THEN
    BEGIN
        conc_monto = :basico;
        IF (conc_porc <> 0 AND conc_porc IS NOT NULL) THEN
        VALOR = (((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans) * :conc_porc) /100;
        ELSE
        IF (porcen <> 0 AND porcen IS NOT NULL) THEN
        VALOR = (((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans) * :porcen) /100;
        ELSE
        IF (montos <> 0 AND montos IS NOT NULL) THEN
        VALOR = :montos;
        ELSE
        IF (conc_monto <> 0 AND conc_monto IS NOT NULL) THEN
        VALOR = :conc_monto;
    END
item = :item + 1;
END
 IF (conc_cod = 920) THEN
 BEGIN
 SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :valor;
 IF (valor IS NULL) THEN
 valor = 0;
 item = :item + 1;
 END
 ELSE
 if (conc_cod = 900 or (:conc_cod = 931)) then
 BEGIN
 SELECT c.noex_monto FROM nomina_horasext c WHERE c.noex_ano = :ano AND c.noex_periodio = :periodo AND c.noex_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :valor;
 IF (valor IS NULL) THEN
 valor = 0;
 item = :item + 1;
 END
    EXECUTE PROCEDURE LEE_CONFIGURACION('NOMINA','GENERAL','REDONDEO AL MULTIPLO DE DIEZ EN TOTALES')RETURNING_VALUES(:aprox);
    EXECUTE PROCEDURE REDONDEE(:valor, :aprox) RETURNING_VALUES (VALOR);
    IF ((mensual = 'N') OR (periodicidad = 1))  THEN
    INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
    VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
    ELSE
    IF (mensual = 'S') THEN
    BEGIN
         IF ((:periodicidad = 2) AND (liquidaper = 1)) THEN
         BEGIN
          IF ((periodo = 1) OR (periodo = 3) OR (periodo = 5) OR (periodo = 7) OR (periodo = 9) OR (periodo = 11)
          OR (periodo = 13) OR (periodo = 15) OR (periodo = 17) OR (periodo = 19) OR (periodo = 21) OR (periodo = 23)) THEN
             INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
             VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
         END
         ELSE
         IF ((:periodicidad = 2) AND (liquidaper = 2)) THEN
         BEGIN
          IF ((periodo = 2) OR (periodo = 4) OR (periodo = 6) OR (periodo = 8) OR (periodo = 10) OR (periodo = 12)
          OR (periodo = 14) OR (periodo = 16) OR (periodo = 18) OR (periodo = 20) OR (periodo = 22) OR (periodo = 24)) THEN
             INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
             VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
         END
         ELSE
         IF ((:periodicidad = 3) AND (liquidaper = 1)) THEN
         BEGIN
          IF ((periodo = 1) OR (periodo = 5) OR (periodo = 9) OR (periodo = 13) OR (periodo = 17) OR (periodo = 21)
          OR (periodo = 25) OR (periodo = 29) OR (periodo = 33) OR (periodo = 37) OR (periodo = 41) OR (periodo = 45)
          OR (periodo = 49)) THEN
             INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
             VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
         END
         ELSE
         IF ((:periodicidad = 3) AND (liquidaper = 2)) THEN
         BEGIN
          IF ((periodo = 2) OR (periodo = 6) OR (periodo = 10) OR (periodo = 14) OR (periodo = 18) OR (periodo = 22)
          OR (periodo = 26) OR (periodo = 30) OR (periodo = 34) OR (periodo = 38) OR (periodo = 42) OR (periodo = 46)
          OR (periodo = 50)) THEN
            INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
             VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
         END
         ELSE
         IF ((:periodicidad = 3) AND (liquidaper = 3)) THEN
         BEGIN
          IF ((periodo = 3) OR (periodo = 7) OR (periodo = 11) OR (periodo = 15) OR (periodo = 19) OR (periodo = 23)
          OR (periodo = 27) OR (periodo = 31) OR (periodo = 35) OR (periodo = 39) OR (periodo = 43) OR (periodo = 47)
          OR (periodo = 51)) THEN
            INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
             VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
         END
         ELSE
         IF ((:periodicidad = 3) AND (liquidaper = 4)) THEN
         BEGIN
          IF ((periodo = 4) OR (periodo = 8) OR (periodo = 12) OR (periodo = 16) OR (periodo = 20) OR (periodo = 24)
          OR (periodo = 29) OR (periodo = 32) OR (periodo = 36) OR (periodo = 40) OR (periodo = 44) OR (periodo = 48)
          OR (periodo = 52)) THEN
            INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
             VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
         END
    END
  END
 END
END
SUSPEND;
END
^

SET TERM ; ^


DROP PROCEDURE TRAER_NOMINA_PROVISIONAL;

ALTER TABLE NOMINA DROP NOMI_PROVI;

DROP PROCEDURE CAUSA_NOMINA_PROV;
DROP PROCEDURE CAUSA_NOMINA;
DROP TRIGGER NOMINA_DETALLE_BI;
DROP PROCEDURE DIAS_LABORADOS;

SET TERM ^ ;

CREATE OR ALTER PROCEDURE DIAS_LABORADOS(
    NITEMPL VARCHAR(20),
    PERIODO INTEGER,
    FEC DATE,
    MENSUAL CHAR(1))
RETURNS (
    TOTALDIASLAB INTEGER)
AS
DECLARE VARIABLE diasnolab INTEGER;
DECLARE VARIABLE diaslabxper INTEGER;
DECLARE VARIABLE perpago INTEGER;
DECLARE VARIABLE fecing DATE;
DECLARE VARIABLE DIASFEC INTEGER;
DECLARE VARIABLE DIASING INTEGER;
BEGIN
SELECT E.empl_ppago, E.empl_fecing
FROM EMPLEADOS E WHERE TERC_NIT = :nitempl
INTO :perpago, :fecing;
IF (mensual = 'N') THEN
BEGIN
IF (perpago = 1) THEN
diaslabxper = 30;
ELSE
IF (perpago = 2) THEN
diaslabxper = 15;
ELSE
IF (perpago = 3) THEN
diaslabxper = 7;
END
ELSE
diaslabxper = 30;
IF (SUBSTR(fecing,1,7) = SUBSTR(FEC,1,7)) THEN
BEGIN
diasfec = CAST(substr(fec,9,10) AS INTEGER);
diasing = CAST(substr(fecing,9,10) AS INTEGER);
diaslabxper = diasfec - diasing;
IF ((diaslabxper > 15) AND (perpago = 2)) THEN
diaslabxper = 15;
END
SELECT SUM (NONO_DURA)
FROM nomina_novedades WHERE TERC_NIT = :nitempl AND TNOV_COD = 9 AND NONO_PERIODO = :periodo
INTO :diasnolab;
totaldiaslab =  :diaslabxper - :diasnolab;
IF (totaldiaslab IS NULL) THEN
totaldiaslab =  :diaslabxper;
SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER PROCEDURE CAUSA_NOMINA(
    FEC DATE,
    PERIODO INTEGER,
    PERIODICIDAD INTEGER,
    PAGOGLOBAL CHAR(1),
    ANO CHAR(4))
RETURNS (
    IDNOMINA INTEGER)
AS
DECLARE VARIABLE item INTEGER;
DECLARE VARIABLE nite VARCHAR(20) CHARACTER SET none;
DECLARE VARIABLE nit_tercero VARCHAR(20);
DECLARE VARIABLE concept INTEGER;
DECLARE VARIABLE montos NUMERIC(18,2);
DECLARE VARIABLE porcen NUMERIC(9,4);
DECLARE VARIABLE entidad VARCHAR(20);
DECLARE VARIABLE conc_cod INTEGER;
DECLARE VARIABLE conc_deduc CHAR(1);
DECLARE VARIABLE conc_porc NUMERIC(9,4);
DECLARE VARIABLE conc_entidad INTEGER;
DECLARE VARIABLE conc_monto NUMERIC(18,2);
DECLARE VARIABLE conc_modifi CHAR(1);
DECLARE VARIABLE conc_promedio CHAR(1);
DECLARE VARIABLE emco_perprom INTEGER;
DECLARE VARIABLE valor NUMERIC(18,2);
DECLARE VARIABLE diaslab INTEGER;
DECLARE VARIABLE conc_prov CHAR(1);
DECLARE VARIABLE conc_aporte CHAR(1);
DECLARE VARIABLE numeroprom INTEGER;
DECLARE VARIABLE conc_aplicaprom CHAR(1);
DECLARE VARIABLE perinicial INTEGER;
DECLARE VARIABLE anoprom INTEGER;
DECLARE VARIABLE conc_dias CHAR(1);
DECLARE VARIABLE conc_otroconc CHAR(1);
DECLARE VARIABLE conc_codotroconc INTEGER;
DECLARE VARIABLE anosum INTEGER;
DECLARE VARIABLE salario CHAR(1) CHARACTER SET none;
DECLARE VARIABLE liquidaper INTEGER;
DECLARE VARIABLE rmod NUMERIC(2,2);
DECLARE VARIABLE basico NUMERIC(18,2);
DECLARE VARIABLE niteps VARCHAR(20);
DECLARE VARIABLE nitafc VARCHAR(20);
DECLARE VARIABLE nitafp VARCHAR(20);
DECLARE VARIABLE nitccf VARCHAR(20);
DECLARE VARIABLE gtoempr CHAR(1);
DECLARE VARIABLE comision NUMERIC(18,2);
DECLARE VARIABLE cambsaltrans NUMERIC(18,2);
DECLARE VARIABLE saldosini NUMERIC(18,2);
DECLARE VARIABLE duranov INTEGER;
DECLARE VARIABLE base NUMERIC(18,2);
DECLARE VARIABLE aprox INTEGER;
DECLARE VARIABLE mensual CHAR(1);
BEGIN
/* SI ES QUINCENAL */ /*$$IBE$$ 
EXECUTE PROCEDURE cambie_id_nomina RETURNING_VALUES(:idnomina);
INSERT INTO nomina (nomi_id, NOMI_FECCAUSA, NOMI_PAGOGLOBAL, NOMI_PERIODOCIDAD, NOMI_PERIODO, NOMI_ANO, NOMI_LIQOK)
VALUES (:IDNOMINA, :fec,:pagoglobal, :periodicidad, :periodo, :ano, 'N');
 BEGIN
    item = 1;
    FOR SELECT E.TERC_NIT, E.empl_salario, e.empl_eps, e.empl_afc, e.empl_afp, e.empl_ccf
    FROM EMPLEADOS E
    WHERE E.empl_ppago = :periodicidad AND E.empl_fecret IS NULL
    INTO :nite, :basico, :niteps, :nitafc, :nitafp, :nitccf
    DO
    BEGIN
    FOR SELECT CE.TERC_NIT, CE.CONC_COD, CE.EMCO_MONTO, CE.EMCO_PORC, ce.empl_entidad, CE.emco_perprom, CE.emco_luquidaper, CE.emco_mensual, CN.CONC_COD, CN.CONC_DEDUC,CN.CONC_PORC, CN.CONC_ENTIDAD, CN.CONC_MONTO,  CN.CONC_DIAS, CN.CONC_MODIFI,
    CN.CONC_PROMEDIO, CN.conc_salario, CE.emco_perprom, CN.conc_prov, CN.conc_aporte, CN.conc_aplicaprom, cn.conc_otroconc, cn.conc_codotroconc, CN.conc_gtoempr, CN.conc_base
    FROM empleado_conceptos CE, CONCEPTOS_NOMINA CN WHERE ((CE.terc_nit = :nite) AND (CE.CONC_COD = CN.CONC_COD) AND (CN.conc_fecini <= :fec AND CN.conc_fecfin >= :FEC) ) OR ((CE.terc_nit = :nite)
    AND (CE.CONC_COD = CN.CONC_COD) AND (cn.conc_todosper = 'N') AND (CE.emco_ppago = :periodo)) OR  ((CE.terc_nit = :nite) AND (CE.CONC_COD = CN.CONC_COD) AND cn.conc_todosper = 'S')  ORDER BY (TERC_NIT )
    INTO :nit_tercero, :concept,  :montos, :porcen, :entidad, :numeroprom, :liquidaper, :mensual ,:CONC_COD, :CONC_DEDUC, :CONC_PORC,
    :CONC_ENTIDAD, :CONC_MONTO, :CONC_DIAS, :CONC_MODIFI,:CONC_PROMEDIO, :salario,:EMCO_PERPROM, :conc_prov, :conc_aporte , :CONC_APLICAPROM, :conc_otroconc, :conc_codotroconc, :gtoempr, :base
    DO
BEGIN
    IF (conc_dias = 'S') THEN
    EXECUTE PROCEDURE DIAS_LABORADOS (:nite, :periodo, :fec, :mensual) RETURNING_VALUES (:diaslab);
    ELSE
    BEGIN
    diaslab = 15;
    IF (mensual = 'S') THEN
    BEGIN
    IF (periodicidad = 2) THEN
    diaslab = 30;
    ELSE
    IF (liquidaper = 3) THEN
    diaslab = 30;
    END
    END
 SELECT ((n.nono_valor /30) * n.nono_dura), (n.nono_dura) FROM nomina_novedades n WHERE n.tnov_cod = 11 AND n.terc_nit = :nite AND n.nono_periodo = :periodo INTO :cambsaltrans, :duranov;
 IF (cambsaltrans IS NULL) THEN
 cambsaltrans = 0;
 IF (duranov IS NULL) THEN
 duranov = 0;
 diaslab = :diaslab - :duranov;
 IF (conc_cod = 921) THEN
 BEGIN
 IF (porcen IS NOT NULL AND porcen <> 0) THEN
 valor = ((basico / 30)* :diaslab ) * :PORCEN /100;
 ELSE
 IF (conc_porc IS NOT NULL AND conc_porc <> 0) THEN
 valor = ((basico / 30)* :diaslab ) * :conc_porc /100;
 END
 ELSE
 IF (conc_cod = 922) THEN
 BEGIN
 SELECT P.prcu_monto FROM prestamo_cuotas P, prestamo_nomina PN WHERE P.prcu_ano = :ano AND P.prcu_periodo = :periodo AND PN.prno_id = P.prno_id AND PN.terc_nit = :nite INTO :valor;
 IF (valor IS NULL) THEN
 valor = 0;
 item = :item + 1;
 UPDATE prestamo_cuotas  P SET prcu_ok = 'S' WHERE P.prcu_ano = :ano AND P.prcu_periodo = :periodo AND P.prno_id = (SELECT PN.prno_id FROM PRESTAMO_NOMINA PN WHERE PN.terc_nit = :nite);
 END
 ELSE
 BEGIN
    IF ((:montos = 0) OR (:montos IS NULL)) THEN
      BEGIN
      IF ((CONC_PORC = 0 AND :porcen = 0) OR (CONC_PORC IS NULL AND :porcen = 0) OR (CONC_PORC = 0 AND :porcen IS NULL) OR (CONC_PORC IS NULL AND :porcen IS NULL) ) THEN
        BEGIN
        IF ((conc_monto <> 0) AND (conc_monto IS NOT NULL) ) THEN
        BEGIN
        VALOR = :CONC_MONTO;
        IF (:conc_dias = 'S') THEN
        valor = (:valor / 30) * :diaslab;
        END
        ELSE
        IF (salario = 'S' AND CONC_COD <> 900 AND CONC_COD <> 920) THEN
        BEGIN
        conc_monto = :basico;
        VALOR = (:conc_monto/30 * :diaslab ) + :cambsaltrans;
        END
        ELSE
        BEGIN
        valor = montos;
        IF (:conc_dias = 'S') THEN
        valor = (:valor / 30) * :diaslab;
        END
        END
       ELSE
       BEGIN
        IF (:porcen <> 0) THEN
          BEGIN
            IF ((conc_monto <> 0) AND (conc_monto IS NOT NULL) ) THEN
            BEGIN
              VALOR = ((:CONC_MONTO ) * :PORCEN) /100;
            END
          END
          ELSE
          BEGIN
            IF ((conc_monto <> 0) AND (conc_monto IS NOT NULL) ) THEN
            BEGIN
              VALOR = ((:CONC_MONTO) * :conc_porc) /100;
            END
            ELSE
        IF (salario = 'S' AND CONC_COD <> 900 AND CONC_COD <> 920) THEN
            BEGIN
              conc_monto = :basico;
              VALOR = ((:CONC_MONTO)+ :cambsaltrans * :conc_porc) /100;
            END
          END
       END
      END
    ELSE
    BEGIN
      IF ((CONC_PORC = 0 OR (conc_porc IS NULL)) AND (:porcen = 0 OR (porcen IS NULL))) THEN
      BEGIN
      VALOR = (:montos);
      IF (:conc_dias = 'S') THEN
      valor = (:valor / 30) * :diaslab;
      END
      ELSE
      BEGIN
        IF (:porcen <> 0 AND porcen IS NOT NULL) THEN
          BEGIN
          VALOR = ((:MONTOS ) * :PORCEN) /100;
          END
          ELSE
          BEGIN
          VALOR = ((:montos) * :CONC_PORC) /100;
          END
       END
   END
    IF (conc_promedio = 'S') THEN
    BEGIN
    perinicial = :periodo - (:numeroprom) + 1;
    anoprom = CAST (ano AS INTEGER);
    IF (perinicial <= 0) THEN
    BEGIN
    perinicial = 24 + :PERINICIAL;
    anoprom = CAST(ANO AS INTEGER) - 1;
    END
    SELECT SUM (noco_valor) FROM nomina_conceptos n WHERE n.noco_aplicaprom = 'S' AND N.noco_periodo >= :perinicial - 1 AND N.noco_periodo < :periodo AND N.noco_ano >= :anoprom AND N.noco_ano <= :ano AND terc_nit = :nite INTO :valor;
    valor = (valor / numeroprom);
    SELECT NOCO_VALOR FROM NOMINA_CONCEPTOS WHERE CONC_COD = :conc_cod AND TERC_NIT  = :nite AND NOCO_PAGOOK = 'N' AND NOCO_PERIODO = 0 INTO :saldosini;
    IF (saldosini IS NULL) THEN
    saldosini = 0;
    ELSE
    UPDATE nomina_conceptos N SET noco_pagook = 'S' WHERE n.noco_aplicaprom = 'S' AND N.noco_periodo >= :perinicial - 1 AND N.noco_periodo < :periodo AND N.noco_ano >= :anoprom AND N.noco_ano <= :ano  AND CONC_COD = :conc_cod AND terc_nit = :nite AND NOCO_PERIODO = 0;
    VALOR = :valor + :saldosini;
    UPDATE nomina_conceptos N SET noco_pagook = 'S' WHERE n.noco_aplicaprom = 'S' AND N.noco_periodo >= :perinicial - 1 AND N.noco_periodo < :periodo AND N.noco_ano >= :anoprom AND N.noco_ano <= :ano  AND CONC_COD = :conc_cod AND terc_nit = :nite;
    END
    IF (conc_otroconc = 'S') THEN
    BEGIN
    anosum = CAST(ano AS INTEGER);
    anosum = anosum - 1;
    SELECT SUM (noco_valor) FROM nomina_conceptos n WHERE n.noco_ano = :anosum AND n.conc_cod = :conc_codotroconc AND N.terc_nit = :nite INTO :valor;
    SELECT NOCO_VALOR FROM NOMINA_CONCEPTOS WHERE noco_ano = :anosum AND conc_cod = :conc_codotroconc AND terc_nit = :nite AND NOCO_PERIODO = 0 INTO :saldosini;
    IF (saldosini IS NULL) THEN
    saldosini = 0;
    ELSE
    UPDATE nomina_conceptos SET noco_pagook = 'S' WHERE noco_ano = :anosum AND conc_cod = :conc_codotroconc AND NOCO_PERIODO = 0 AND terc_nit = :nite;
    VALOR = :valor + :saldosini;
    UPDATE nomina_conceptos SET noco_pagook = 'S' WHERE noco_ano = :anosum AND conc_cod = :conc_codotroconc AND terc_nit = :nite;
    END
 $$IBE$$*/ /*SI EL CONCEPTO ES UN APORTE*/ /*$$IBE$$ 
IF (conc_aporte = 'S') THEN
BEGIN
    IF ((:entidad = '' ) OR (entidad IS NULL)) THEN
    BEGIN
     SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
    IF (comision IS NULL) THEN
     comision = 0;
     valor = :basico + :comision;
    IF ((conc_cod = 904) OR (conc_cod = 905) OR (conc_cod = 906)) THEN
            BEGIN
            entidad = :nitafp;
                IF (conc_cod = 904) THEN
                BEGIN
                SELECT A.paan_afptr FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = (((((:basico /30) * :diaslab ) + :comision)+ :cambsaltrans) * :PORCEN) /100;
                END
                ELSE
                IF ((conc_cod = 905) OR (conc_cod = 906)) THEN
                BEGIN
                SELECT A.paan_afpem FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = (((((:basico /30) * :diaslab ) + :comision)+ :cambsaltrans) * :PORCEN) /100;
                END
            END
            ELSE
       IF ((conc_cod = 907) OR (conc_cod = 914) OR (conc_cod = 915)) THEN
            BEGIN
            entidad = :niteps;
                IF (conc_cod = 907) THEN
                BEGIN
                SELECT A.paan_epstr FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = (((((:basico )/30 * :diaslab ) + :comision)+ :cambsaltrans) * :PORCEN) /100;
                END
                ELSE
                IF ((conc_cod = 914) OR (conc_cod = 915)) THEN
                BEGIN
                SELECT A.paan_epsem FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = (((((:basico )/30 * :diaslab ) + :comision)+ :cambsaltrans) * :PORCEN) /100;
                END
            END
            ELSE
       IF ((conc_cod = 910) OR (conc_cod = 911) OR (conc_cod = 916) OR (conc_cod = 917) OR (conc_cod = 918) OR (conc_cod = 919)) THEN
            BEGIN
            entidad = :nitccf;
            SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
            IF (comision IS NULL) THEN
            comision = 0;
                IF ((conc_cod = 910) OR (conc_cod = 911) ) THEN
                BEGIN
                SELECT A.paan_ccf FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = (((((:basico )/30 * :diaslab ) + :comision)+ :cambsaltrans) * :PORCEN) /100;
                END
                ELSE
                IF ((conc_cod = 916) OR (conc_cod = 917)) THEN
                BEGIN
                SELECT A.paan_icbf FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = (((((:basico )/30 * :diaslab ) + :comision)+ :cambsaltrans) * :PORCEN) /100;
                END
                ELSE
                IF ((conc_cod = 918) OR (conc_cod = 919)) THEN
                BEGIN
                SELECT A.paan_sena FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = (((((:basico )/30 * :diaslab ) + :comision)+ :cambsaltrans) * :PORCEN) /100;
                END
            END
            ELSE
        IF ((conc_cod = 912) OR (conc_cod = 913)) THEN
            BEGIN
            entidad = :nitafc;
            SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
            IF (comision IS NULL) THEN
            comision = 0;
                IF ((conc_cod = 912) OR (conc_cod = 913) ) THEN
                BEGIN
                SELECT A.paan_cesemp FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = ((((:basico + :comision)/30 * :diaslab )+ :cambsaltrans) * :PORCEN) /100;
                END
            END
            ELSE
        BEGIN
        IF (comision IS NULL) THEN
        comision = 0;
        SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
        conc_monto = :basico + :comision;
        IF (conc_porc <> 0 AND conc_porc IS NOT NULL) THEN
        VALOR = (((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans) * :conc_porc) /100;
        ELSE
        IF (:porcen <> 0 AND :porcen IS NOT NULL) THEN
        VALOR = (((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans) * :porcen) /100;
        ELSE
        IF (:montos <> 0 AND :montos IS NOT NULL) THEN
        valor = :montos;
        ELSE
        IF (:conc_monto <> 0 AND :conc_monto IS NOT NULL) THEN
        valor = :conc_monto;
        END
    END
    END
    ELSE
    IF (conc_prov = 'S') THEN
    BEGIN
        conc_monto = :basico;
        IF (conc_porc <> 0 AND conc_porc IS NOT NULL) THEN
        VALOR = (((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans) * :conc_porc) /100;
        ELSE
        IF (porcen <> 0 AND porcen IS NOT NULL) THEN
        VALOR = (((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans) * :porcen) /100;
        ELSE
        IF (montos <> 0 AND montos IS NOT NULL) THEN
        VALOR = :montos;
        ELSE
        IF (conc_monto <> 0 AND conc_monto IS NOT NULL) THEN
        VALOR = :conc_monto;
    END
item = :item + 1;
END
 IF (conc_cod = 920) THEN
 BEGIN
 SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :valor;
 IF (valor IS NULL) THEN
 valor = 0;
 item = :item + 1;
 END
    EXECUTE PROCEDURE LEE_CONFIGURACION('NOMINA','GENERAL','REDONDEO AL MULTIPLO DE DIEZ EN TOTALES')RETURNING_VALUES(:aprox);
    EXECUTE PROCEDURE REDONDEE(:valor, :aprox) RETURNING_VALUES (VALOR);
    IF ((mensual = 'N') OR (periodicidad = 1))  THEN
    INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
    VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
    ELSE
    IF (mensual = 'S') THEN
    BEGIN
         IF ((:periodicidad = 2) AND (liquidaper = 1)) THEN
         BEGIN
          IF ((periodo = 1) OR (periodo = 3) OR (periodo = 5) OR (periodo = 7) OR (periodo = 9) OR (periodo = 11)
          OR (periodo = 13) OR (periodo = 15) OR (periodo = 17) OR (periodo = 19) OR (periodo = 21) OR (periodo = 23)) THEN
             INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
             VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
         END
         ELSE
         IF ((:periodicidad = 2) AND (liquidaper = 2)) THEN
         BEGIN
          IF ((periodo = 2) OR (periodo = 4) OR (periodo = 6) OR (periodo = 8) OR (periodo = 10) OR (periodo = 12)
          OR (periodo = 14) OR (periodo = 16) OR (periodo = 18) OR (periodo = 20) OR (periodo = 22) OR (periodo = 24)) THEN
             INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
             VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
         END
         ELSE
         IF ((:periodicidad = 3) AND (liquidaper = 1)) THEN
         BEGIN
          IF ((periodo = 1) OR (periodo = 5) OR (periodo = 9) OR (periodo = 13) OR (periodo = 17) OR (periodo = 21)
          OR (periodo = 25) OR (periodo = 29) OR (periodo = 33) OR (periodo = 37) OR (periodo = 41) OR (periodo = 45)
          OR (periodo = 49)) THEN
             INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
             VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
         END
         ELSE
         IF ((:periodicidad = 3) AND (liquidaper = 2)) THEN
         BEGIN
          IF ((periodo = 2) OR (periodo = 6) OR (periodo = 10) OR (periodo = 14) OR (periodo = 18) OR (periodo = 22)
          OR (periodo = 26) OR (periodo = 30) OR (periodo = 34) OR (periodo = 38) OR (periodo = 42) OR (periodo = 46)
          OR (periodo = 50)) THEN
            INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
             VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
         END
         ELSE
         IF ((:periodicidad = 3) AND (liquidaper = 3)) THEN
         BEGIN
          IF ((periodo = 3) OR (periodo = 7) OR (periodo = 11) OR (periodo = 15) OR (periodo = 19) OR (periodo = 23)
          OR (periodo = 27) OR (periodo = 31) OR (periodo = 35) OR (periodo = 39) OR (periodo = 43) OR (periodo = 47)
          OR (periodo = 51)) THEN
            INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
             VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
         END
         ELSE
         IF ((:periodicidad = 3) AND (liquidaper = 4)) THEN
         BEGIN
          IF ((periodo = 4) OR (periodo = 8) OR (periodo = 12) OR (periodo = 16) OR (periodo = 20) OR (periodo = 24)
          OR (periodo = 29) OR (periodo = 32) OR (periodo = 36) OR (periodo = 40) OR (periodo = 44) OR (periodo = 48)
          OR (periodo = 52)) THEN
            INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
             VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
         END
    END
  END
 END
END
SUSPEND;
 $$IBE$$*/ EXIT;
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER PROCEDURE CAUSA_NOMINA(
    FEC DATE,
    PERIODO INTEGER,
    PERIODICIDAD INTEGER,
    PAGOGLOBAL CHAR(1),
    ANO CHAR(4))
RETURNS (
    IDNOMINA INTEGER)
AS
DECLARE VARIABLE item INTEGER;
DECLARE VARIABLE nite VARCHAR(20) CHARACTER SET none;
DECLARE VARIABLE nit_tercero VARCHAR(20);
DECLARE VARIABLE concept INTEGER;
DECLARE VARIABLE montos NUMERIC(18,2);
DECLARE VARIABLE porcen NUMERIC(9,4);
DECLARE VARIABLE entidad VARCHAR(20);
DECLARE VARIABLE conc_cod INTEGER;
DECLARE VARIABLE conc_deduc CHAR(1);
DECLARE VARIABLE conc_porc NUMERIC(9,4);
DECLARE VARIABLE conc_entidad INTEGER;
DECLARE VARIABLE conc_monto NUMERIC(18,2);
DECLARE VARIABLE conc_modifi CHAR(1);
DECLARE VARIABLE conc_promedio CHAR(1);
DECLARE VARIABLE emco_perprom INTEGER;
DECLARE VARIABLE valor NUMERIC(18,2);
DECLARE VARIABLE diaslab INTEGER;
DECLARE VARIABLE conc_prov CHAR(1);
DECLARE VARIABLE conc_aporte CHAR(1);
DECLARE VARIABLE numeroprom INTEGER;
DECLARE VARIABLE conc_aplicaprom CHAR(1);
DECLARE VARIABLE perinicial INTEGER;
DECLARE VARIABLE anoprom INTEGER;
DECLARE VARIABLE conc_dias CHAR(1);
DECLARE VARIABLE conc_otroconc CHAR(1);
DECLARE VARIABLE conc_codotroconc INTEGER;
DECLARE VARIABLE anosum INTEGER;
DECLARE VARIABLE salario CHAR(1) CHARACTER SET none;
DECLARE VARIABLE liquidaper INTEGER;
DECLARE VARIABLE rmod NUMERIC(2,2);
DECLARE VARIABLE basico NUMERIC(18,2);
DECLARE VARIABLE niteps VARCHAR(20);
DECLARE VARIABLE nitafc VARCHAR(20);
DECLARE VARIABLE nitafp VARCHAR(20);
DECLARE VARIABLE nitccf VARCHAR(20);
DECLARE VARIABLE gtoempr CHAR(1);
DECLARE VARIABLE comision NUMERIC(18,2);
DECLARE VARIABLE cambsaltrans NUMERIC(18,2);
DECLARE VARIABLE saldosini NUMERIC(18,2);
DECLARE VARIABLE duranov INTEGER;
DECLARE VARIABLE base NUMERIC(18,2);
DECLARE VARIABLE aprox INTEGER;
DECLARE VARIABLE mensual CHAR(1);
BEGIN
/* SI ES QUINCENAL */
EXECUTE PROCEDURE cambie_id_nomina RETURNING_VALUES(:idnomina);
INSERT INTO nomina (nomi_id, NOMI_FECCAUSA, NOMI_PAGOGLOBAL, NOMI_PERIODOCIDAD, NOMI_PERIODO, NOMI_ANO, NOMI_LIQOK)
VALUES (:IDNOMINA, :fec,:pagoglobal, :periodicidad, :periodo, :ano, 'N');
 BEGIN
    item = 1;
    FOR SELECT E.TERC_NIT, E.empl_salario, e.empl_eps, e.empl_afc, e.empl_afp, e.empl_ccf
    FROM EMPLEADOS E
    WHERE E.empl_ppago = :periodicidad AND E.empl_fecret IS NULL
    INTO :nite, :basico, :niteps, :nitafc, :nitafp, :nitccf
    DO
    BEGIN
    FOR SELECT CE.TERC_NIT, CE.CONC_COD, CE.EMCO_MONTO, CE.EMCO_PORC, ce.empl_entidad, CE.emco_perprom, CE.emco_luquidaper, CE.emco_mensual, CN.CONC_COD, CN.CONC_DEDUC,CN.CONC_PORC, CN.CONC_ENTIDAD, CN.CONC_MONTO,  CN.CONC_DIAS, CN.CONC_MODIFI,
    CN.CONC_PROMEDIO, CN.conc_salario, CE.emco_perprom, CN.conc_prov, CN.conc_aporte, CN.conc_aplicaprom, cn.conc_otroconc, cn.conc_codotroconc, CN.conc_gtoempr, CN.conc_base
    FROM empleado_conceptos CE, CONCEPTOS_NOMINA CN WHERE ((CE.terc_nit = :nite) AND (CE.CONC_COD = CN.CONC_COD) AND (CN.conc_fecini <= :fec AND CN.conc_fecfin >= :FEC) ) OR ((CE.terc_nit = :nite)
    AND (CE.CONC_COD = CN.CONC_COD) AND (cn.conc_todosper = 'N') AND (CE.emco_ppago = :periodo)) OR  ((CE.terc_nit = :nite) AND (CE.CONC_COD = CN.CONC_COD) AND cn.conc_todosper = 'S')  ORDER BY (TERC_NIT )
    INTO :nit_tercero, :concept,  :montos, :porcen, :entidad, :numeroprom, :liquidaper, :mensual ,:CONC_COD, :CONC_DEDUC, :CONC_PORC,
    :CONC_ENTIDAD, :CONC_MONTO, :CONC_DIAS, :CONC_MODIFI,:CONC_PROMEDIO, :salario,:EMCO_PERPROM, :conc_prov, :conc_aporte , :CONC_APLICAPROM, :conc_otroconc, :conc_codotroconc, :gtoempr, :base
    DO
BEGIN
    IF (conc_dias = 'S') THEN
    EXECUTE PROCEDURE DIAS_LABORADOS (:nite, :periodo, :fec, :mensual) RETURNING_VALUES (:diaslab);
    ELSE
    BEGIN
    diaslab = 15;
    IF (mensual = 'S') THEN
    BEGIN
    IF (periodicidad = 2) THEN
    diaslab = 30;
    ELSE
    IF (liquidaper = 3) THEN
    diaslab = 30;
    END
    END
 SELECT ((n.nono_valor /30) * n.nono_dura), (n.nono_dura) FROM nomina_novedades n WHERE n.tnov_cod = 11 AND n.terc_nit = :nite AND n.nono_periodo = :periodo INTO :cambsaltrans, :duranov;
 IF (cambsaltrans IS NULL) THEN
 cambsaltrans = 0;
 IF (duranov IS NULL) THEN
 duranov = 0;
 diaslab = :diaslab - :duranov;
 IF (conc_cod = 921) THEN
 BEGIN
 IF (porcen IS NOT NULL AND porcen <> 0) THEN
 valor = ((basico / 30)* :diaslab ) * :PORCEN /100;
 ELSE
 IF (conc_porc IS NOT NULL AND conc_porc <> 0) THEN
 valor = ((basico / 30)* :diaslab ) * :conc_porc /100;
 END
 ELSE
 IF (conc_cod = 922) THEN
 BEGIN
 SELECT P.prcu_monto FROM prestamo_cuotas P, prestamo_nomina PN WHERE P.prcu_ano = :ano AND P.prcu_periodo = :periodo AND PN.prno_id = P.prno_id AND PN.terc_nit = :nite INTO :valor;
 IF (valor IS NULL) THEN
 valor = 0;
 item = :item + 1;
 UPDATE prestamo_cuotas  P SET prcu_ok = 'S' WHERE P.prcu_ano = :ano AND P.prcu_periodo = :periodo AND P.prno_id = (SELECT PN.prno_id FROM PRESTAMO_NOMINA PN WHERE PN.terc_nit = :nite);
 END
 ELSE
 BEGIN
    IF ((:montos = 0) OR (:montos IS NULL)) THEN
      BEGIN
      IF ((CONC_PORC = 0 AND :porcen = 0) OR (CONC_PORC IS NULL AND :porcen = 0) OR (CONC_PORC = 0 AND :porcen IS NULL) OR (CONC_PORC IS NULL AND :porcen IS NULL) ) THEN
        BEGIN
        IF ((conc_monto <> 0) AND (conc_monto IS NOT NULL) ) THEN
        BEGIN
        VALOR = :CONC_MONTO;
        IF (:conc_dias = 'S') THEN
        valor = (:valor / 30) * :diaslab;
        END
        ELSE
        IF (salario = 'S' AND CONC_COD <> 900 AND CONC_COD <> 920) THEN
        BEGIN
        conc_monto = :basico;
        VALOR = (:conc_monto/30 * :diaslab ) + :cambsaltrans;
        END
        ELSE
        BEGIN
        valor = montos;
        IF (:conc_dias = 'S') THEN
        valor = (:valor / 30) * :diaslab;
        END
        END
       ELSE
       BEGIN
        IF (:porcen <> 0) THEN
          BEGIN
            IF ((conc_monto <> 0) AND (conc_monto IS NOT NULL) ) THEN
            BEGIN
              VALOR = ((:CONC_MONTO ) * :PORCEN) /100;
            END
          END
          ELSE
          BEGIN
            IF ((conc_monto <> 0) AND (conc_monto IS NOT NULL) ) THEN
            BEGIN
              VALOR = ((:CONC_MONTO) * :conc_porc) /100;
            END
            ELSE
        IF (salario = 'S' AND CONC_COD <> 900 AND CONC_COD <> 920) THEN
            BEGIN
              conc_monto = :basico;
              VALOR = ((:CONC_MONTO)+ :cambsaltrans * :conc_porc) /100;
            END
          END
       END
      END
    ELSE
    BEGIN
      IF ((CONC_PORC = 0 OR (conc_porc IS NULL)) AND (:porcen = 0 OR (porcen IS NULL))) THEN
      BEGIN
      VALOR = (:montos);
      IF (:conc_dias = 'S') THEN
      valor = (:valor / 30) * :diaslab;
      END
      ELSE
      BEGIN
        IF (:porcen <> 0 AND porcen IS NOT NULL) THEN
          BEGIN
          VALOR = ((:MONTOS ) * :PORCEN) /100;
          END
          ELSE
          BEGIN
          VALOR = ((:montos) * :CONC_PORC) /100;
          END
       END
   END
    IF (conc_promedio = 'S') THEN
    BEGIN
    perinicial = :periodo - (:numeroprom) + 1;
    anoprom = CAST (ano AS INTEGER);
    IF (perinicial <= 0) THEN
    BEGIN
    perinicial = 24 + :PERINICIAL;
    anoprom = CAST(ANO AS INTEGER) - 1;
    END
    SELECT SUM (noco_valor) FROM nomina_conceptos n WHERE n.noco_aplicaprom = 'S' AND N.noco_periodo >= :perinicial - 1 AND N.noco_periodo < :periodo AND N.noco_ano >= :anoprom AND N.noco_ano <= :ano AND terc_nit = :nite INTO :valor;
    valor = (valor / numeroprom);
    SELECT NOCO_VALOR FROM NOMINA_CONCEPTOS WHERE CONC_COD = :conc_cod AND TERC_NIT  = :nite AND NOCO_PAGOOK = 'N' AND NOCO_PERIODO = 0 INTO :saldosini;
    IF (saldosini IS NULL) THEN
    saldosini = 0;
    ELSE
    UPDATE nomina_conceptos N SET noco_pagook = 'S' WHERE n.noco_aplicaprom = 'S' AND N.noco_periodo >= :perinicial - 1 AND N.noco_periodo < :periodo AND N.noco_ano >= :anoprom AND N.noco_ano <= :ano  AND CONC_COD = :conc_cod AND terc_nit = :nite AND NOCO_PERIODO = 0;
    VALOR = :valor + :saldosini;
    UPDATE nomina_conceptos N SET noco_pagook = 'S' WHERE n.noco_aplicaprom = 'S' AND N.noco_periodo >= :perinicial - 1 AND N.noco_periodo < :periodo AND N.noco_ano >= :anoprom AND N.noco_ano <= :ano  AND CONC_COD = :conc_cod AND terc_nit = :nite;
    END
    IF (conc_otroconc = 'S') THEN
    BEGIN
    anosum = CAST(ano AS INTEGER);
    anosum = anosum - 1;
    SELECT SUM (noco_valor) FROM nomina_conceptos n WHERE n.noco_ano = :anosum AND n.conc_cod = :conc_codotroconc AND N.terc_nit = :nite INTO :valor;
    SELECT NOCO_VALOR FROM NOMINA_CONCEPTOS WHERE noco_ano = :anosum AND conc_cod = :conc_codotroconc AND terc_nit = :nite AND NOCO_PERIODO = 0 INTO :saldosini;
    IF (saldosini IS NULL) THEN
    saldosini = 0;
    ELSE
    UPDATE nomina_conceptos SET noco_pagook = 'S' WHERE noco_ano = :anosum AND conc_cod = :conc_codotroconc AND NOCO_PERIODO = 0 AND terc_nit = :nite;
    VALOR = :valor + :saldosini;
    UPDATE nomina_conceptos SET noco_pagook = 'S' WHERE noco_ano = :anosum AND conc_cod = :conc_codotroconc AND terc_nit = :nite;
    END
/*SI EL CONCEPTO ES UN APORTE*/
IF (conc_aporte = 'S') THEN
BEGIN
    IF ((:entidad = '' ) OR (entidad IS NULL)) THEN
    BEGIN
     SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
    IF (comision IS NULL) THEN
     comision = 0;
     valor = :basico + :comision;
    IF ((conc_cod = 904) OR (conc_cod = 905) OR (conc_cod = 906)) THEN
            BEGIN
            entidad = :nitafp;
                IF (conc_cod = 904) THEN
                BEGIN
                SELECT A.paan_afptr FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = (((((:basico /30) * :diaslab ) + :comision)+ :cambsaltrans) * :PORCEN) /100;
                END
                ELSE
                IF ((conc_cod = 905) OR (conc_cod = 906)) THEN
                BEGIN
                SELECT A.paan_afpem FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = (((((:basico /30) * :diaslab ) + :comision)+ :cambsaltrans) * :PORCEN) /100;
                END
            END
            ELSE
       IF ((conc_cod = 907) OR (conc_cod = 914) OR (conc_cod = 915)) THEN
            BEGIN
            entidad = :niteps;
                IF (conc_cod = 907) THEN
                BEGIN
                SELECT A.paan_epstr FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = (((((:basico )/30 * :diaslab ) + :comision)+ :cambsaltrans) * :PORCEN) /100;
                END
                ELSE
                IF ((conc_cod = 914) OR (conc_cod = 915)) THEN
                BEGIN
                SELECT A.paan_epsem FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = (((((:basico )/30 * :diaslab ) + :comision)+ :cambsaltrans) * :PORCEN) /100;
                END
            END
            ELSE
       IF ((conc_cod = 910) OR (conc_cod = 911) OR (conc_cod = 916) OR (conc_cod = 917) OR (conc_cod = 918) OR (conc_cod = 919)) THEN
            BEGIN
            entidad = :nitccf;
            SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
            IF (comision IS NULL) THEN
            comision = 0;
                IF ((conc_cod = 910) OR (conc_cod = 911) ) THEN
                BEGIN
                SELECT A.paan_ccf FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = (((((:basico )/30 * :diaslab ) + :comision)+ :cambsaltrans) * :PORCEN) /100;
                END
                ELSE
                IF ((conc_cod = 916) OR (conc_cod = 917)) THEN
                BEGIN
                SELECT A.paan_icbf FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = (((((:basico )/30 * :diaslab ) + :comision)+ :cambsaltrans) * :PORCEN) /100;
                END
                ELSE
                IF ((conc_cod = 918) OR (conc_cod = 919)) THEN
                BEGIN
                SELECT A.paan_sena FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = (((((:basico )/30 * :diaslab ) + :comision)+ :cambsaltrans) * :PORCEN) /100;
                END
            END
            ELSE
        IF ((conc_cod = 912) OR (conc_cod = 913)) THEN
            BEGIN
            entidad = :nitafc;
            SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
            IF (comision IS NULL) THEN
            comision = 0;
                IF ((conc_cod = 912) OR (conc_cod = 913) ) THEN
                BEGIN
                SELECT A.paan_cesemp FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                VALOR = ((((:basico + :comision)/30 * :diaslab )+ :cambsaltrans) * :PORCEN) /100;
                END
            END
            ELSE
        BEGIN
        IF (comision IS NULL) THEN
        comision = 0;
        SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
        conc_monto = :basico + :comision;
        IF (conc_porc <> 0 AND conc_porc IS NOT NULL) THEN
        VALOR = (((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans) * :conc_porc) /100;
        ELSE
        IF (:porcen <> 0 AND :porcen IS NOT NULL) THEN
        VALOR = (((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans) * :porcen) /100;
        ELSE
        IF (:montos <> 0 AND :montos IS NOT NULL) THEN
        valor = :montos;
        ELSE
        IF (:conc_monto <> 0 AND :conc_monto IS NOT NULL) THEN
        valor = :conc_monto;
        END
    END
    END
    ELSE
    IF (conc_prov = 'S') THEN
    BEGIN
        conc_monto = :basico;
        IF (conc_porc <> 0 AND conc_porc IS NOT NULL) THEN
        VALOR = (((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans) * :conc_porc) /100;
        ELSE
        IF (porcen <> 0 AND porcen IS NOT NULL) THEN
        VALOR = (((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans) * :porcen) /100;
        ELSE
        IF (montos <> 0 AND montos IS NOT NULL) THEN
        VALOR = :montos;
        ELSE
        IF (conc_monto <> 0 AND conc_monto IS NOT NULL) THEN
        VALOR = :conc_monto;
    END
item = :item + 1;
END
 IF (conc_cod = 920) THEN
 BEGIN
 SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :valor;
 IF (valor IS NULL) THEN
 valor = 0;
 item = :item + 1;
 END
    EXECUTE PROCEDURE LEE_CONFIGURACION('NOMINA','GENERAL','REDONDEO AL MULTIPLO DE DIEZ EN TOTALES')RETURNING_VALUES(:aprox);
    EXECUTE PROCEDURE REDONDEE(:valor, :aprox) RETURNING_VALUES (VALOR);
    IF ((mensual = 'N') OR (periodicidad = 1))  THEN
    INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
    VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
    ELSE
    IF (mensual = 'S') THEN
    BEGIN
         IF ((:periodicidad = 2) AND (liquidaper = 1)) THEN
         BEGIN
          IF ((periodo = 1) OR (periodo = 3) OR (periodo = 5) OR (periodo = 7) OR (periodo = 9) OR (periodo = 11)
          OR (periodo = 13) OR (periodo = 15) OR (periodo = 17) OR (periodo = 19) OR (periodo = 21) OR (periodo = 23)) THEN
             INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
             VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
         END
         ELSE
         IF ((:periodicidad = 2) AND (liquidaper = 2)) THEN
         BEGIN
          IF ((periodo = 2) OR (periodo = 4) OR (periodo = 6) OR (periodo = 8) OR (periodo = 10) OR (periodo = 12)
          OR (periodo = 14) OR (periodo = 16) OR (periodo = 18) OR (periodo = 20) OR (periodo = 22) OR (periodo = 24)) THEN
             INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
             VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
         END
         ELSE
         IF ((:periodicidad = 3) AND (liquidaper = 1)) THEN
         BEGIN
          IF ((periodo = 1) OR (periodo = 5) OR (periodo = 9) OR (periodo = 13) OR (periodo = 17) OR (periodo = 21)
          OR (periodo = 25) OR (periodo = 29) OR (periodo = 33) OR (periodo = 37) OR (periodo = 41) OR (periodo = 45)
          OR (periodo = 49)) THEN
             INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
             VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
         END
         ELSE
         IF ((:periodicidad = 3) AND (liquidaper = 2)) THEN
         BEGIN
          IF ((periodo = 2) OR (periodo = 6) OR (periodo = 10) OR (periodo = 14) OR (periodo = 18) OR (periodo = 22)
          OR (periodo = 26) OR (periodo = 30) OR (periodo = 34) OR (periodo = 38) OR (periodo = 42) OR (periodo = 46)
          OR (periodo = 50)) THEN
            INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
             VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
         END
         ELSE
         IF ((:periodicidad = 3) AND (liquidaper = 3)) THEN
         BEGIN
          IF ((periodo = 3) OR (periodo = 7) OR (periodo = 11) OR (periodo = 15) OR (periodo = 19) OR (periodo = 23)
          OR (periodo = 27) OR (periodo = 31) OR (periodo = 35) OR (periodo = 39) OR (periodo = 43) OR (periodo = 47)
          OR (periodo = 51)) THEN
            INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
             VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
         END
         ELSE
         IF ((:periodicidad = 3) AND (liquidaper = 4)) THEN
         BEGIN
          IF ((periodo = 4) OR (periodo = 8) OR (periodo = 12) OR (periodo = 16) OR (periodo = 20) OR (periodo = 24)
          OR (periodo = 29) OR (periodo = 32) OR (periodo = 36) OR (periodo = 40) OR (periodo = 44) OR (periodo = 48)
          OR (periodo = 52)) THEN
            INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
             VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
         END
    END
  END
 END
END
SUSPEND;
END

^

SET TERM ; ^


SET TERM ^ ;

ALTER PROCEDURE IMPR_PLANILLA_NOMINA(
    ID INTEGER,
    PAGO CHAR(1),
    CTA CHAR(1))
RETURNS (
    FECHA DATE,
    OBSERVACIONES BLOB SUB_TYPE 0 SEGMENT SIZE 80,
    PAGOGLOBAL CHAR(1),
    PERIODO INTEGER,
    ANO CHAR(4),
    PERIODICIDAD VARCHAR(60),
    NITEMPL VARCHAR(20),
    VALOR NUMERIC(18,2),
    DEDUC CHAR(1),
    NOMBREEMPL VARCHAR(60),
    NOMCORTCONC VARCHAR(60),
    NOMBRECONC VARCHAR(60),
    CODCONC INTEGER,
    PROV CHAR(1),
    TOTALEMPL NUMERIC(18,2),
    TOTALDEDUC NUMERIC(18,2),
    TOTALDEVENG NUMERIC(18,2),
    NUMEMPL INTEGER,
    CTAEMPL VARCHAR(25),
    TOTALCTAS NUMERIC(18,2),
    TOTALNOMI NUMERIC(18,2),
    TOTALAPOR NUMERIC(18,2))
AS
DECLARE VARIABLE NITANT VARCHAR(20);
DECLARE VARIABLE nitnue VARCHAR(20);
DECLARE VARIABLE NUMCONC INTEGER;
declare variable TOTALNOMINEG NUMERIC(18,2);
declare variable TOTALAPORNEG NUMERIC(18,2);
BEGIN
numempl = 0;
nitant = 0;
nitnue = 0;
IF (PAGO = 'N') THEN
BEGIN
FOR SELECT N.nomi_feccausa, N.nomi_obs, N.nomi_pagoglobal, N.nomi_periodo, N.nomi_ano, P.ppag_nombre FROM NOMINA N, periodo_pago P
 WHERE P.ppag_cod = N.nomi_periodocidad AND N.nomi_id = :ID
 INTO :fecha, :observaciones, :pagoglobal, :periodo, :ano, :periodicidad
 DO
 BEGIN
 FOR SELECT NC.terc_nit, NC.noco_valor, NC.noco_deduc, T.terc_nom, C.conc_nomcorto, C.conc_nombre, NC.conc_cod, NC.noco_prov FROM NOMINA_CONCEPTOS NC, TERCEROS T, EMPLEADOS E, CONCEPTOS_NOMINA C
        WHERE NC.nomi_id = :ID AND T.terc_nit = E.terc_nit AND C.conc_cod = NC.conc_cod AND t.terc_nit = nc.terc_nit
      INTO :nitempl, :valor, :deduc, :nombreempl, :nomcortconc, :nombreconc, :codconc, :prov
 DO
 BEGIN
 IF (valor IS NULL) THEN
 valor = 0;
 SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND TERC_NIT = :nitempl INTO :totalempl;
 SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND TERC_NIT = :nitempl AND NC.noco_deduc = 'S' INTO :totaldeduc;
 SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND TERC_NIT = :nitempl AND NC.noco_deduc = 'N' INTO :totaldeveng;
 SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id into :totalnomi;
 SELECT SUM(NC.noco_valor*-1) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_APORTE = 'S' AND NOCO_VALOR < 0 AND NOMI_ID = :id into :totalaporneg;
 SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_APORTE = 'S' AND NOCO_VALOR > 0 AND NOMI_ID = :id into :totalapor;
 totalapor = :totalapor + totalaporneg;
  SUSPEND;
 END
nitempl = '';
valor = NULL;
deduc = '';
nombreempl = NULL;
nomcortconc = NULL;
nombreconc = NULL;
codconc = NULL;
prov = NULL;
 FOR SELECT MAX(N.conc_cod) FROM NOMINA_CONCEPTOS N WHERE N.nomi_id = :id
 group BY N.conc_cod
 INTO :codconc
 DO
 BEGIN
 SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC
 WHERE NC.nomi_id = :ID AND NC.conc_cod = :codconc
 GROUP BY NC.conc_cod
 INTO :valor;
 nitempl = '';
 nombreempl = 'TOTAL';
 deduc = 'N';
 prov = 'N';
 SELECT C.conc_nombre,C.conc_nomcorto FROM CONCEPTOS_NOMINA C WHERE C.conc_cod = :codconc INTO :nombreconc,:nomcortconc;
 SUSPEND;
 END
 END
END
ELSE
IF (PAGO = 'S') THEN
BEGIN
FOR SELECT N.nomi_feccausa, N.nomi_obs, N.nomi_pagoglobal, N.nomi_periodo, N.nomi_ano, P.ppag_nombre FROM NOMINA N, periodo_pago P
 WHERE P.ppag_cod = N.nomi_periodocidad AND N.nomi_id = :ID
 INTO :fecha, :observaciones, :pagoglobal, :periodo, :ano, :periodicidad
 DO
 BEGIN
 FOR SELECT NC.terc_nit, NC.noco_valor, NC.noco_deduc, T.terc_nom, C.conc_nomcorto, C.conc_nombre, NC.conc_cod, NC.noco_prov FROM NOMINA_CONCEPTOS NC, TERCEROS T, EMPLEADOS E, CONCEPTOS_NOMINA C
        WHERE NC.nomi_id = :ID AND T.terc_nit = E.terc_nit AND C.conc_cod = NC.conc_cod AND t.terc_nit = nc.terc_nit AND NC.noco_prov = 'N' AND NC.noco_gtoempr = 'N'
      INTO :nitempl, :valor, :deduc, :nombreempl, :nomcortconc, :nombreconc, :codconc, :prov
 DO
 BEGIN
 IF (valor IS NULL) THEN
 valor = 0;
 SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND TERC_NIT = :nitempl INTO :totalempl;
 SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND TERC_NIT = :nitempl AND NC.noco_deduc = 'S' INTO :totaldeduc;
 SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND TERC_NIT = :nitempl AND NC.noco_deduc = 'N' INTO :totaldeveng;
 IF (cta = 'S') THEN
 BEGIN
 SELECT COUNT(CONC_COD) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND TERC_NIT = :nitempl INTO :numconc;
 totalempl = totalempl / :numconc;
 SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND TERC_NIT = :nitempl INTO :totalctas;
 END
 SELECT TERC_NIT, EMPL_CUENTA FROM EMPLEADOS WHERE TERC_NIT = :nitempl INTO :nitnue, :ctaempl;
 IF (nitnue IS NOT NULL) THEN
 BEGIN
 IF (nitnue <> nitant) THEN
 numempl = :numempl + 1;
 nitant = :nitnue;
 END
 SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id into :totalnomi;
 SELECT SUM(NC.noco_valor*-1) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_APORTE = 'S' AND NOCO_VALOR < 0 AND NOMI_ID = :id into :totalaporneg;
 SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_APORTE = 'S' AND NOCO_VALOR > 0 AND NOMI_ID = :id into :totalapor;
 totalapor = :totalapor + totalaporneg;
 SUSPEND;
 END
nitempl = '';
valor = NULL;
deduc = '';
nombreempl = NULL;
nomcortconc = NULL;
nombreconc = NULL;
codconc = NULL;
prov = NULL;
 FOR SELECT MAX(N.conc_cod) FROM NOMINA_CONCEPTOS N WHERE N.nomi_id = :id AND N.noco_prov = 'N' AND N.noco_gtoempr = 'N'
 group BY N.conc_cod
 INTO :codconc
 DO
 BEGIN
 SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC
 WHERE NC.nomi_id = :ID AND NC.conc_cod = :codconc
 GROUP BY NC.conc_cod
 INTO :valor;
 nitempl = '';
 nombreempl = 'TOTAL';
 deduc = 'N';
 prov = 'N';
 SELECT C.conc_nombre,C.conc_nomcorto FROM CONCEPTOS_NOMINA C WHERE C.conc_cod = :codconc INTO :nombreconc,:nomcortconc;
 SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id INTO :totalempl;
 SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND NC.noco_deduc = 'S' INTO :totaldeduc;
 SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND NC.noco_deduc = 'N' INTO :totaldeveng;
 SUSPEND;
 END
 END
END
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE IMPR_PLANILLA_NOMINA(
    ID INTEGER,
    PAGO CHAR(1),
    CTA CHAR(1),
    EMPL CHAR(1))
RETURNS (
    FECHA DATE,
    OBSERVACIONES BLOB SUB_TYPE 0 SEGMENT SIZE 80,
    PAGOGLOBAL CHAR(1),
    PERIODO INTEGER,
    ANO CHAR(4),
    PERIODICIDAD VARCHAR(60),
    NITEMPL VARCHAR(20),
    VALOR NUMERIC(18,2),
    DEDUC CHAR(1),
    NOMBREEMPL VARCHAR(60),
    NOMCORTCONC VARCHAR(60),
    NOMBRECONC VARCHAR(60),
    CODCONC INTEGER,
    PROV CHAR(1),
    TOTALEMPL NUMERIC(18,2),
    TOTALDEDUC NUMERIC(18,2),
    TOTALDEVENG NUMERIC(18,2),
    NUMEMPL INTEGER,
    CTAEMPL VARCHAR(25),
    TOTALCTAS NUMERIC(18,2),
    TOTALNOMI NUMERIC(18,2),
    TOTALAPOR NUMERIC(18,2),
    NOMPER VARCHAR(60))
AS
DECLARE VARIABLE NITANT VARCHAR(20);
DECLARE VARIABLE nitnue VARCHAR(20);
DECLARE VARIABLE NUMCONC INTEGER;
declare variable TOTALNOMINEG NUMERIC(18,2);
declare variable TOTALAPORNEG NUMERIC(18,2);
BEGIN
numempl = 0;
nitant = 0;
nitnue = 0;
IF (PAGO = 'N') THEN
BEGIN
FOR SELECT N.nomi_feccausa, N.nomi_obs, N.nomi_pagoglobal, N.nomi_periodo, N.nomi_ano, P.ppag_nombre, PN.pnom_nombre FROM NOMINA N, periodo_pago P, periodo_pago_nombre PN
 WHERE P.ppag_cod = N.nomi_periodocidad AND N.nomi_id = :ID AND PN.ppag_cod = N.nomi_periodocidad AND PN.ppag_periodo = N.nomi_periodo
 INTO :fecha, :observaciones, :pagoglobal, :periodo, :ano, :periodicidad, :NOMPER
 DO
 BEGIN
 FOR SELECT NC.terc_nit, NC.noco_valor, NC.noco_deduc, T.terc_nom, C.conc_nomcorto, C.conc_nombre, NC.conc_cod, NC.noco_prov FROM NOMINA_CONCEPTOS NC, TERCEROS T, EMPLEADOS E, CONCEPTOS_NOMINA C
        WHERE NC.nomi_id = :ID AND T.terc_nit = E.terc_nit AND C.conc_cod = NC.conc_cod AND t.terc_nit = nc.terc_nit
      INTO :nitempl, :valor, :deduc, :nombreempl, :nomcortconc, :nombreconc, :codconc, :prov
 DO
 BEGIN
 IF (valor IS NULL) THEN
 valor = 0;
 SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND TERC_NIT = :nitempl INTO :totalempl;
 SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND TERC_NIT = :nitempl AND NC.noco_deduc = 'S' INTO :totaldeduc;
 SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND TERC_NIT = :nitempl AND NC.noco_deduc = 'N' INTO :totaldeveng;
 SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id into :totalnomi;
 SELECT SUM(NC.noco_valor*-1) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_APORTE = 'S' AND NOCO_VALOR < 0 AND NOMI_ID = :id into :totalaporneg;
 SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_APORTE = 'S' AND NOCO_VALOR > 0 AND NOMI_ID = :id into :totalapor;
 totalapor = :totalapor + totalaporneg;
  SUSPEND;
 END
nitempl = '';
valor = NULL;
deduc = '';
nombreempl = NULL;
nomcortconc = NULL;
nombreconc = NULL;
codconc = NULL;
prov = NULL;
 FOR SELECT MAX(N.conc_cod) FROM NOMINA_CONCEPTOS N WHERE N.nomi_id = :id
 group BY N.conc_cod
 INTO :codconc
 DO
 BEGIN
 SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC
 WHERE NC.nomi_id = :ID AND NC.conc_cod = :codconc
 GROUP BY NC.conc_cod
 INTO :valor;
 nitempl = '';
 nombreempl = '';
 deduc = 'N';
 prov = 'N';
 SELECT C.conc_nombre,C.conc_nomcorto FROM CONCEPTOS_NOMINA C WHERE C.conc_cod = :codconc INTO :nombreconc,:nomcortconc;
 SUSPEND;
 END
 END
END
ELSE
IF (PAGO = 'S') THEN
BEGIN
FOR SELECT N.nomi_feccausa, N.nomi_obs, N.nomi_pagoglobal, N.nomi_periodo, N.nomi_ano, P.ppag_nombre, PN.pnom_nombre FROM NOMINA N, periodo_pago P, periodo_pago_nombre PN
 WHERE P.ppag_cod = N.nomi_periodocidad AND N.nomi_id = :ID AND PN.ppag_cod = N.nomi_periodocidad AND PN.ppag_periodo = N.nomi_periodo
 INTO :fecha, :observaciones, :pagoglobal, :periodo, :ano, :periodicidad, :NOMPER
 DO
 BEGIN
 FOR SELECT NC.terc_nit, NC.noco_valor, NC.noco_deduc, T.terc_nom, C.conc_nomcorto, C.conc_nombre, NC.conc_cod, NC.noco_prov FROM NOMINA_CONCEPTOS NC, TERCEROS T, EMPLEADOS E, CONCEPTOS_NOMINA C
        WHERE NC.nomi_id = :ID AND T.terc_nit = E.terc_nit AND C.conc_cod = NC.conc_cod AND t.terc_nit = nc.terc_nit AND NC.noco_prov = 'N' AND NC.noco_gtoempr = 'N'
      INTO :nitempl, :valor, :deduc, :nombreempl, :nomcortconc, :nombreconc, :codconc, :prov
 DO
 BEGIN
 IF (valor IS NULL) THEN
 valor = 0;
 SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND TERC_NIT = :nitempl INTO :totalempl;
 SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND TERC_NIT = :nitempl AND NC.noco_deduc = 'S' INTO :totaldeduc;
 SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND TERC_NIT = :nitempl AND NC.noco_deduc = 'N' INTO :totaldeveng;
 IF (cta = 'S') THEN
 BEGIN
 SELECT COUNT(CONC_COD) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND TERC_NIT = :nitempl INTO :numconc;
 totalempl = totalempl / :numconc;
 SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND TERC_NIT = :nitempl INTO :totalctas;
 END
 SELECT TERC_NIT, EMPL_CUENTA FROM EMPLEADOS WHERE TERC_NIT = :nitempl INTO :nitnue, :ctaempl;
 IF (nitnue IS NOT NULL) THEN
 BEGIN
 IF (nitnue <> nitant) THEN
 numempl = :numempl + 1;
 nitant = :nitnue;
 END
 SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id into :totalnomi;
 SELECT SUM(NC.noco_valor*-1) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_APORTE = 'S' AND NOCO_VALOR < 0 AND NOMI_ID = :id into :totalaporneg;
 SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_APORTE = 'S' AND NOCO_VALOR > 0 AND NOMI_ID = :id into :totalapor;
 totalapor = :totalapor + totalaporneg;
 SUSPEND;
 END
if ( EMPL = 'N') then
BEGIN
nitempl = '';
valor = NULL;
deduc = '';
nombreempl = NULL;
nomcortconc = NULL;
nombreconc = NULL;
codconc = NULL;
prov = NULL;
 FOR SELECT MAX(N.conc_cod) FROM NOMINA_CONCEPTOS N WHERE N.nomi_id = :id AND N.noco_prov = 'N' AND N.noco_gtoempr = 'N'
 group BY N.conc_cod
 INTO :codconc
 DO
 BEGIN
 SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC
 WHERE NC.nomi_id = :ID AND NC.conc_cod = :codconc
 GROUP BY NC.conc_cod
 INTO :valor;
 nitempl = '';
 nombreempl = '';
 deduc = 'N';
 prov = 'N';
 SELECT C.conc_nombre,C.conc_nomcorto FROM CONCEPTOS_NOMINA C WHERE C.conc_cod = :codconc INTO :nombreconc,:nomcortconc;
 SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id INTO :totalempl;
 SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND NC.noco_deduc = 'S' INTO :totaldeduc;
 SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND NC.noco_deduc = 'N' INTO :totaldeveng;
 SUSPEND;
 END
END
 END
END
END
^

SET TERM ; ^



INSERT INTO CONCEPTOS_NOMINA (CONC_COD, CONC_NOMBRE, CONC_DEDUC, CONC_FECINI, CONC_FECFIN, CONC_PORC, CONC_BASE, CONC_ENTIDAD, CONC_MONTO, CONC_CTAGAST, CONC_DIAS, CONC_MODIFI, CONC_DIAPAGO, CONC_PROMEDIO, CONC_TODOSPER, CONC_PROV, CONC_PERACTUAL, CONC_APORTE, CONC_APLICAPROM, CONC_PERPROMEDIO, CONC_OTROCONC, CONC_CODOTROCONC, CONC_SALARIO, CONC_CTACXP, CONC_NOMCORTO, CONC_PERIODOS, CONC_GTOEMPR) VALUES (932, 'INCAPACIDAD', 'N', '1-JAN-2008', '31-DEC-2008', 0, 0, NULL, 0, NULL, 'N', 'S', NULL, 'N', 'S', 'N', 'N', 'N', 'S', NULL, 'N', NULL, 'S', NULL, 'Incapacidad', NULL, 'N');

SET TERM ^ ;

ALTER PROCEDURE CONSOLIDA_CONC_NOMINA(
    ID_NOMINA INTEGER)
AS
DECLARE VARIABLE id INTEGER;
DECLARE VARIABLE noco_item INTEGER;
DECLARE VARIABLE nit VARCHAR(20) CHARACTER SET none;
DECLARE VARIABLE valor NUMERIC(18,2);
DECLARE VARIABLE entidad VARCHAR(20) CHARACTER SET none;
DECLARE VARIABLE periodo INTEGER;
DECLARE VARIABLE ano CHAR(4) CHARACTER SET none;
DECLARE VARIABLE periodi INTEGER;
DECLARE VARIABLE deduc CHAR(1) CHARACTER SET none;
DECLARE VARIABLE prov CHAR(1) CHARACTER SET none;
DECLARE VARIABLE aporte CHAR(1) CHARACTER SET none;
DECLARE VARIABLE idexiste INTEGER;
DECLARE VARIABLE item INTEGER;
DECLARE VARIABLE idanterior INTEGER;
DECLARE VARIABLE itemanterior INTEGER;
DECLARE VARIABLE conc_cod VARCHAR(5);
DECLARE VARIABLE gtoempr CHAR(1);
BEGIN
DELETE FROM CONSOLIDADO_NOMINA WHERE CONO_IDORI = :ID_NOMINA AND CONO_DEB = 'N' ;
    id = GEN_ID(id_consno, 1);
        SELECT nomi_periodocidad FROM NOMINA WHERE NOMI_ID = :ID_NOMINA INTO :periodi;
        FOR SELECT NOCO_ITEM, CONC_COD, TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_PERIODO, NOCO_ANO, noco_deduc, noco_prov, noco_aporte, noco_gtoempr  FROM NOMINA_CONCEPTOS WHERE NOMI_ID = :id_nomina AND NOCO_gtoempr = 'N' AND NOCO_PROV = 'N'
        INTO :noco_item, :conc_cod, :nit, :valor, :entidad, :periodo, :ano, :deduc, :prov, :aporte, :gtoempr
        DO
        BEGIN
        IF (valor <> 0) THEN
            INSERT INTO consolidado_nomina (cono_id, cono_item ,cono_tipodes, cono_tipoori,  cono_idori, cono_periodo, cono_ano,  cono_valor, conc_cod, terc_nit, cono_pagook, cono_PERIODICIDAD, cono_DEDUC, cono_PROV, cono_APORTE, cono_gtoempr, cono_deb)
                                    VALUES (:id, :noco_item, 91, 92, :id_nomina, :periodo, :ano, :valor, :conc_cod, :nit, 'N', :periodi, :deduc, :prov, :aporte, :gtoempr, 'N');
        END
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE EGRESO_NOMINA(
    IDNOMINA INTEGER,
    PGLOBAL CHAR(1),
    NITBENE VARCHAR(20),
    FECHAEGR DATE,
    PREF VARCHAR(4),
    NUMEROEGR VARCHAR(6),
    CONCEPTO VARCHAR(60),
    OBSERVACIONES BLOB SUB_TYPE 0 SEGMENT SIZE 80,
    NOMBREBENE VARCHAR(60),
    CAJA INTEGER,
    USUARIOEGR VARCHAR(10),
    PAGO CHAR(1),
    CUENTAID INTEGER,
    FECHAEGRBNCO DATE,
    PREFEGREBNCO VARCHAR(4),
    NUMEROEGREBNCO VARCHAR(6),
    BENEBNCO VARCHAR(60),
    CONCEPTOBNCO VARCHAR(60),
    GMF CHAR(1),
    FORMAPAGOID INTEGER,
    CAJABNCO VARCHAR(2),
    CAJABNCOCUENTA VARCHAR(20),
    CAJABNCONUMEROEGR VARCHAR(20),
    FORMULARIO VARCHAR(10))
AS
declare variable porcreten numeric(9,4);
declare variable nitempl varchar(60);
declare variable idpago integer;
declare variable totdevenempl numeric(18,2);
declare variable retencionempl numeric(18,2);
declare variable periodicidad integer;
declare variable idegreso integer;
declare variable nitemplnglo varchar(20) character set none;
declare variable numegresointeger integer;
declare variable ok char(1) character set none;
declare variable itempago integer;
declare variable he numeric(18,2);
declare variable hed numeric(18,2);
declare variable hen numeric(18,2);
declare variable hefd numeric(18,2);
declare variable hefn numeric(18,2);
declare variable otrosdev numeric(18,2);
declare variable otrosded integer;
declare variable pagoempl char(1);
declare variable periodo integer;
declare variable nomiano char(4);
declare variable emplnom varchar(60);
declare variable devengos numeric(18,2);
declare variable deducibles numeric(18,2);
declare variable total numeric(18,2);
declare variable reten numeric(18,2);
begin
select nomi_pagook, nomi_periodo, nomi_ano from nomina where nomi_id = :idnomina into :ok, :periodo, :nomiano;
if (ok = 'N') then
BEGIN
if (pglobal = 'S') then
BEGIN
/*    for select terc_nit from nomina_detalle WHERE NOMI_ID = :idnomina INTO :nitemplnglo
    do
    begin */
    SELECT SUM (NC.CONO_ABONO) FROM CONSOLIDADO_NOMINA NC WHERE NC.CONO_IDORI = :IDNOMINA AND CONO_TIPOORI = 92 and cono_pagook = 'N'
    AND CONO_prov = 'N' AND CONO_APORTE = 'N' and CONO_DEB = 'S'
        INTO :total;
    if((:TOTAL IS NOT NULL) and (:total <> 0)) then
    BEGIN
    EXECUTE PROCEDURE cambie_id_egreso returning_values (:idegreso);
    INSERT INTO egresos (EGRE_ID, TIDO_COD, PREF_PRE, EGRE_numero, EGRE_fecha, EGRE_CONC, EGRE_MONTO, EGRE_RTFTEMONTO, EGRE_OBS, EGRE_NOMTERC, EGRE_ANULADO, EGRE_TRANSMIT, TERC_NIT, EGRE_TIPO, CAJA_ID, EGRE_usuario, NUMOK, CLEG_ID)
                 VALUES (:idegreso,62, :pref, :numeroegr, :fechaegr, :concepto, :total, 0, :observaciones, :nombrebene, 'N', 'N', :nitbene, '3', :caja, :usuarioegr, 'S', 0);
    if (pago = 'B') then
    INSERT INTO egresos_banco (EGRE_ID, EGBC_TIPOBCO, CUBA_COD, EGBC_numero, EGBC_fecha, PRBA_PREF, EGBC_BENEF, EGBC_MONTO, EGBC_CONCEPTO, EGBC_GMF, EGBC_ANULADO, EGBC_TRANSMIT) VALUES (:idegreso, 72, :cuentaid, :numeroegrebnco, :fechaegrbnco, :prefegrebnco, :benebnco, :total, :conceptobnco, :gmf, 'N', 'N');
  ELSE
    if (pago = 'C') then
    INSERT INTO egresos_caja (EGRE_ID, EGCA_ITEM, CAJA_ID, FOPA_ID, EGCA_BANCO, EGCA_CUENTA, EGCA_numero, EGCA_fecha, EGCA_MONTO, EGCA_ANULADO, EGCA_TRANSMIT) VALUES (:idegreso, 1, :caja, :formapagoid, :cajabnco, :cajabncocuenta, :cajabnconumeroegr, :fechaegr, :total, 'N', 'N');
    idpago = GEN_ID(id_pagonomi, 1);
    insert INTO pago_nomina (pgno_id, pgno_fecha, pgno_tipopago, pgno_egreid, pgno_egrepre, pgno_egrenum, pgno_monto, pgno_nomina, pgno_nit, pgno_formulario, PGNO_ANT)
                 VALUES (:idpago, :fechaegr, :pago , :idegreso, :pref, :numeroegr, :total, :idnomina, :nitbene, :formulario, 'N');
    update NOMINA SET NOMI_pagook = 'N' WHERE NOMI_ID = :IDNOMINA;
    END
    FOR SELECT TERC_NIT FROM nomina_detalle WHERE NOMI_ID = :idnomina into :nitemplnglo
    DO
    BEGIN
    SELECT SUM (NC.CONO_ABONO) FROM CONSOLIDADO_NOMINA NC WHERE NC.CONO_IDORI = :IDNOMINA AND CONO_TIPOORI = 92 and cono_pagook = 'N'
    AND CONO_prov = 'N' AND CONO_APORTE = 'N' and CONO_DEB = 'S'
        INTO :total;
    select max (pgno_item), max (pgno_id) from pago_nomina_det WHERE PGNO_ID = :idpago INTO :itempago, :idpago;
    if (:itempago IS NULL) then
    itempago = 0;
    itempago = :itempago + 1;
/*    insert INTO pago_nomina_det  (pgno_id, terc_nit, pgnd_monto, pgno_item)
                 VALUES (:idpago, :nitemplnglo, :total, :itempago);
*/    END
/*    end*/
END
ELSE
if (pglobal = 'N') then
BEGIN
/*    EXECUTE PROCEDURE cambie_id_egreso returning_values (:idegreso);
    EXECUTE PROCEDURE cambie_id_pago_nomina returning_values (:idpago);
    FOR SELECT TERC_NIT FROM nomina_detalle WHERE NOMI_ID = :idnomina into :nitemplnglo
    DO
    BEGIN
    SELECT SUM (cono_abono) FROM CONSOLIDADO_NOMINA WHERE CONO_IDORI = :IDNOMINA AND CONO_TIPOORI = 92 and cono_pagook = 'N'
    AND CONO_deduc = 'N' AND cono_prov = 'N' and CONO_DEB = 'S' and TERC_NIT = :nitemplnglo
    INTO :totdevenempl;
    SELECT NOMI_PERIODOCIDAD FROM nomina WHERE NOMI_ID = :idnomina INTO :periodicidad;
    SELECT SUM (NC.CONO_ABONO) FROM CONSOLIDADO_NOMINA NC WHERE NC.CONO_IDORI = :IDNOMINA AND CONO_TIPOORI = 92 and cono_pagook = 'N'
    AND CONO_prov = 'N' AND CONO_APORTE = 'N' and CONO_DEB = 'S' AND TERC_NIT = :nitemplnglo
        INTO :total;
    SELECT TERC_NOM FROM TERCEROS WHERE TERC_NIT = :nitemplnglo INTO :emplnom;
    concepto = 'PAGO NOMINA ' || 'DEL PERIODO ' || CAST (periodo AS CHAR(2)) || ' DEL ' || nomiano;
    if((:TOTAL IS NOT NULL) or (:total <> 0)) then
    BEGIN
    INSERT INTO egresos (EGRE_ID, TIDO_COD, PREF_PRE, EGRE_numero, EGRE_fecha, EGRE_CONC, EGRE_MONTO, EGRE_RTFTEMONTO, EGRE_OBS, EGRE_NOMTERC, EGRE_ANULADO, EGRE_TRANSMIT, TERC_NIT, EGRE_TIPO, CAJA_ID, EGRE_usuario, NUMOK, CLEG_ID)
                 VALUES (:idegreso,62, :pref, :numeroegr, :fechaegr, :concepto, :total, :reten, :observaciones, :emplnom, 'N', 'N', :nitemplnglo, '3', :caja, :usuarioegr, 'S', 0);
    SELECT empl_formpago FROM EMPLEADOS WHERE TERC_NIT = :nitemplnglo INTO :pagoempl;
    if (pagoempl = 'B') then
    begin
    conceptobnco = :concepto;
    INSERT INTO egresos_banco (EGRE_ID, EGBC_TIPOBCO, CUBA_COD, EGBC_numero, EGBC_fecha, PRBA_PREF, EGBC_BENEF, EGBC_MONTO, EGBC_CONCEPTO, EGBC_GMF, EGBC_ANULADO, EGBC_TRANSMIT)
                       VALUES (:idegreso, 72, :cuentaid, :numeroegrebnco, :fechaegrbnco, :prefegrebnco, :nitemplnglo, :total, :conceptobnco, :gmf, 'N', 'N');
    end
    ELSE
    if (pagoempl = 'C') then
    INSERT INTO egresos_caja (EGRE_ID, EGCA_ITEM, CAJA_ID, FOPA_ID, EGCA_BANCO, EGCA_CUENTA, EGCA_numero, EGCA_fecha, EGCA_MONTO, EGCA_ANULADO, EGCA_TRANSMIT)
                 VALUES (:idegreso, 1, :caja, :formapagoid, :cajabnco, :cajabncocuenta, :cajabnconumeroegr, :fechaegr, :total, 'N', 'N');
    END
    EXECUTE PROCEDURE cambie_id_pago_nomina returning_values (:idpago);
    INSERT INTO pago_nomina (pgno_id, pgno_fecha, pgno_tipopago, pgno_egreid, pgno_egrepre, pgno_egrenum, pgno_monto, pgno_nomina, pgno_nit, pgno_formulario, PGNO_ANT)
                 VALUES (:idpago, :fechaegr, :pago , :idegreso, :pref, :numeroegr, 0, :idnomina, '', :formulario, 'N');
    SELECT SUM (cono_abono) FROM CONSOLIDADO_NOMINA WHERE CONO_IDORI = :IDNOMINA AND CONO_TIPOORI = 92 and cono_pagook = 'N'
    AND CONO_deduc = 'N' AND cono_prov = 'N' and TERC_NIT = :nitemplnglo
    INTO :totdevenempl;
    SELECT NOMI_PERIODOCIDAD FROM nomina WHERE NOMI_ID = :idnomina INTO :periodicidad;
    select max (pgno_item) from pago_nomina_det WHERE PGNO_ID = :idpago INTO :itempago;
    if (:itempago IS NULL) then
    itempago = 0;
    itempago = :itempago + 1;
    insert INTO pago_nomina_det  (pgno_id, terc_nit, pgnd_monto, pgno_item)
                 VALUES (:idpago, :nitemplnglo, :total, :itempago);
    numegresointeger = cast (numeroegr as integer);
    numegresointeger = numegresointeger + 1;
    execute procedure completa_ceros(numegresointeger)returning_values :numeroegr;
update CONSOLIDADO_NOMINA NC set nc.cono_pagook = 'S' WHERE NC.CONO_IDORI = :IDNOMINA AND CONO_TIPOORI = 92 and cono_pagook = 'N'
    AND CONO_prov = 'N' AND CONO_APORTE = 'N' and CONO_DEB = 'S' AND TERC_NIT = :nitemplnglo;
END*/
END
END
ELSE
exception nomina_con_pago;
END
^

SET TERM ; ^

DROP TRIGGER NOMINA_HORASEXT_BI;
DROP PROCEDURE LIQUIDA_HORAS_EXTRA;



SET TERM ^ ;

CREATE OR ALTER PROCEDURE LIQUIDA_HORAS_EXTRA(
    NIT VARCHAR(20),
    HD SMALLINT,
    HN SMALLINT,
    HFD SMALLINT,
    HFN SMALLINT,
    ANO CHAR(4),
    PROVI CHAR(1))
RETURNS (
    TOT_HE NUMERIC(18,0))
AS
declare variable tot_fesd numeric(18,10);
declare variable tot_fesn numeric(18,10);
declare variable tot_diur numeric(18,10);
declare variable tot_noct numeric(18,10);
declare variable tar_fesd numeric(9,4);
declare variable tar_fesn numeric(9,4);
declare variable tar_diur numeric(9,4);
declare variable tar_noct numeric(9,4);
declare variable monto NUMERIC(18,10);
begin
if (PROVI = 'N') then
BEGIN
SELECT EMPL_SALARIO FROM empleados WHERE TERC_NIT = :NIT into :monto;
  monto = :monto / 240;
select PAAN_HORASDI, PAAN_HORASNO, PAAN_HORASFN, PAAN_HORASFD FROM PARAMETROS_ANO WHERE paan_ano = :ano
  into :tar_diur, :tar_noct, :tar_fesn, :tar_fesd;
  tot_diur = :monto * tar_diur;
  tot_noct = :monto * tar_noct;
  tot_fesn = :monto * tar_fesn;
  tot_fesd = :monto * tar_fesd;
  tot_diur = :tot_diur * :hd;
  tot_noct = :tot_noct * :hn;
  tot_fesn = :tot_fesn * :hfn;
  tot_fesd = :tot_fesd * :hfd;
  tot_he =  tot_diur + tot_noct + tot_fesd + tot_fesn;
  suspend;
END
end
^

SET TERM ; ^



SET TERM ^ ;

create trigger NOMINA_HORASEXT_BI for NOMINA_HORASEXT
active BEFORE INSERT position 0
as
begin
execute PROCEDURE liquida_horas_extra (NEW.terc_nit,NEW.noex_diur,NEW.noex_noct,NEW.noex_fdiur,NEW.noex_fnoct,NEW.noex_ano,'N')returning_values(NEW.noex_monto);
end
^

SET TERM ; ^

GRANT UPDATE,REFERENCES ON NOMINA_HORASEXT TO TRIGGER NOMINA_HORASEXT_BI;
GRANT EXECUTE ON PROCEDURE LIQUIDA_HORAS_EXTRA TO TRIGGER NOMINA_HORASEXT_BI;

ALTER TABLE CONCEPTOS_NOMINA
ADD CONC_CXP CHAR(1);

ALTER TABLE CONCEPTOS_NOMINA
ADD CONC_CART CHAR(1);

UPDATE CONCEPTOS_NOMINA SET CONC_CXP = 'N' WHERE CONC_CXP IS NULL;
UPDATE CONCEPTOS_NOMINA SET CONC_CART = 'N' WHERE CONC_CART IS NULL;

CREATE TABLE NOMINA_CARTERA (
    NOCA_ID INTEGER NOT NULL,
    NOCA_ITEM INTEGER NOT NULL,
    NOCA_PERIODICIDAD INTEGER,
    TERC_NIT INTEGER,
    NOCA_PERIODO INTEGER,
    NOCA_ANO INTEGER,
    NOCA_MONTO INTEGER);
alter table NOMINA_CARTERA
add constraint PK_NOMINA_CARTERA
primary key (NOCA_ID,NOCA_ITEM);

SET TERM ^ ;

/* Trigger: CONSOLIDADO_NOMINA_BI */
CREATE TRIGGER CONSOLIDADO_NOMINA_BI FOR CONSOLIDADO_NOMINA
ACTIVE BEFORE INSERT POSITION 0
AS
DECLARE VARIABLE ITEM INTEGER;
BEGIN
SELECT MAX(C.cono_item) FROM CONSOLIDADO_NOMINA C WHERE C.cono_id = NEW.cono_id INTO :item;
IF (ITEM IS NOT NULL) THEN
NEW.cono_item = :item + 1;
ELSE
NEW.cono_item = 1;
if (new.cono_abono is null) then
new.cono_abono = 0;
if (new.cono_valor is null) then
new.cono_valor = 0;
END
^


SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE EGRESO_NOMINA(
    IDNOMINA INTEGER,
    PGLOBAL CHAR(1),
    NITBENE VARCHAR(20),
    FECHAEGR DATE,
    PREF VARCHAR(4),
    NUMEROEGR VARCHAR(6),
    CONCEPTO VARCHAR(60),
    OBSERVACIONES BLOB SUB_TYPE 0 SEGMENT SIZE 80,
    NOMBREBENE VARCHAR(60),
    CAJA INTEGER,
    USUARIOEGR VARCHAR(10),
    PAGO CHAR(1),
    CUENTAID INTEGER,
    FECHAEGRBNCO DATE,
    PREFEGREBNCO VARCHAR(4),
    NUMEROEGREBNCO VARCHAR(6),
    BENEBNCO VARCHAR(60),
    CONCEPTOBNCO VARCHAR(60),
    GMF CHAR(1),
    FORMAPAGOID INTEGER,
    CAJABNCO VARCHAR(2),
    CAJABNCOCUENTA VARCHAR(20),
    CAJABNCONUMEROEGR VARCHAR(20),
    FORMULARIO VARCHAR(10))
AS
declare variable porcreten numeric(9,4);
declare variable nitempl varchar(60);
declare variable idpago integer;
declare variable totdevenempl numeric(18,2);
declare variable retencionempl numeric(18,2);
declare variable periodicidad integer;
declare variable idegreso integer;
declare variable nitemplnglo varchar(20) character set none;
declare variable numegresointeger integer;
declare variable ok char(1) character set none;
declare variable itempago integer;
declare variable he numeric(18,2);
declare variable hed numeric(18,2);
declare variable hen numeric(18,2);
declare variable hefd numeric(18,2);
declare variable hefn numeric(18,2);
declare variable otrosdev numeric(18,2);
declare variable otrosded integer;
declare variable pagoempl char(1);
declare variable periodo integer;
declare variable nomiano char(4);
declare variable emplnom varchar(60);
declare variable devengos numeric(18,2);
declare variable deducibles numeric(18,2);
declare variable total numeric(18,2);
declare variable reten numeric(18,2);
begin
select nomi_pagook, nomi_periodo, nomi_ano from nomina where nomi_id = :idnomina into :ok, :periodo, :nomiano;
if (ok = 'N') then
BEGIN
if (pglobal = 'S') then
BEGIN
/*    for select terc_nit from nomina_detalle WHERE NOMI_ID = :idnomina INTO :nitemplnglo
    do
    begin */
    SELECT SUM (NC.CONO_ABONO) FROM CONSOLIDADO_NOMINA NC WHERE NC.CONO_IDORI = :IDNOMINA AND CONO_TIPOORI = 92 and cono_pagook = 'N'
    AND CONO_prov = 'N' AND CONO_APORTE = 'N' and CONO_DEB = 'S'
        INTO :total;
    if((:TOTAL IS NOT NULL) and (:total <> 0)) then
    BEGIN
    EXECUTE PROCEDURE cambie_id_egreso returning_values (:idegreso);
    INSERT INTO egresos (EGRE_ID, TIDO_COD, PREF_PRE, EGRE_numero, EGRE_fecha, EGRE_CONC, EGRE_MONTO, EGRE_RTFTEMONTO, EGRE_OBS, EGRE_NOMTERC, EGRE_ANULADO, EGRE_TRANSMIT, TERC_NIT, EGRE_TIPO, CAJA_ID, EGRE_usuario, NUMOK, CLEG_ID)
                 VALUES (:idegreso,62, :pref, :numeroegr, :fechaegr, :concepto, :total, 0, :observaciones, :nombrebene, 'N', 'N', :nitbene, '3', :caja, :usuarioegr, 'S', 0);
    if (pago = 'B') then
    INSERT INTO egresos_banco (EGRE_ID, EGBC_TIPOBCO, CUBA_COD, EGBC_numero, EGBC_fecha, PRBA_PREF, EGBC_BENEF, EGBC_MONTO, EGBC_CONCEPTO, EGBC_GMF, EGBC_ANULADO, EGBC_TRANSMIT) VALUES (:idegreso, 72, :cuentaid, :numeroegrebnco, :fechaegrbnco, :prefegrebnco, :benebnco, :total, :conceptobnco, :gmf, 'N', 'N');
  ELSE
    if (pago = 'C') then
    INSERT INTO egresos_caja (EGRE_ID, EGCA_ITEM, CAJA_ID, FOPA_ID, EGCA_BANCO, EGCA_CUENTA, EGCA_numero, EGCA_fecha, EGCA_MONTO, EGCA_ANULADO, EGCA_TRANSMIT) VALUES (:idegreso, 1, :caja, :formapagoid, :cajabnco, :cajabncocuenta, :cajabnconumeroegr, :fechaegr, :total, 'N', 'N');
    idpago = GEN_ID(id_pagonomi, 1);
    insert INTO pago_nomina (pgno_id, pgno_fecha, pgno_tipopago, pgno_egreid, pgno_egrepre, pgno_egrenum, pgno_monto, pgno_nomina, pgno_nit, pgno_formulario, PGNO_ANT)
                 VALUES (:idpago, :fechaegr, :pago , :idegreso, :pref, :numeroegr, :total, :idnomina, :nitbene, :formulario, 'N');
    update NOMINA SET NOMI_pagook = 'N' WHERE NOMI_ID = :IDNOMINA;
    END
    FOR SELECT TERC_NIT FROM nomina_detalle WHERE NOMI_ID = :idnomina into :nitemplnglo
    DO
    BEGIN
    SELECT SUM (NC.CONO_ABONO) FROM CONSOLIDADO_NOMINA NC WHERE NC.CONO_IDORI = :IDNOMINA AND CONO_TIPOORI = 92 and cono_pagook = 'N'
    AND CONO_prov = 'N' AND CONO_APORTE = 'N' and CONO_DEB = 'S'
        INTO :total;
    select max (pgno_item), max (pgno_id) from pago_nomina_det WHERE PGNO_ID = :idpago INTO :itempago, :idpago;
    if (:itempago IS NULL) then
    itempago = 0;
    itempago = :itempago + 1;
/*    insert INTO pago_nomina_det  (pgno_id, terc_nit, pgnd_monto, pgno_item)
                 VALUES (:idpago, :nitemplnglo, :total, :itempago);
*/    END
/*    end*/
END
ELSE
if (pglobal = 'N') then
BEGIN
    EXECUTE PROCEDURE cambie_id_egreso returning_values (:idegreso);
    EXECUTE PROCEDURE cambie_id_pago_nomina returning_values (:idpago);
    FOR SELECT TERC_NIT FROM nomina_detalle WHERE NOMI_ID = :idnomina into :nitemplnglo
    DO
    BEGIN
    SELECT SUM (cono_abono) FROM CONSOLIDADO_NOMINA WHERE CONO_IDORI = :IDNOMINA AND CONO_TIPOORI = 92 and cono_pagook = 'N'
    AND CONO_deduc = 'N' AND cono_prov = 'N' and CONO_DEB = 'S' and TERC_NIT = :nitemplnglo
    INTO :totdevenempl;
    SELECT NOMI_PERIODOCIDAD FROM nomina WHERE NOMI_ID = :idnomina INTO :periodicidad;
    SELECT SUM (NC.CONO_ABONO) FROM CONSOLIDADO_NOMINA NC WHERE NC.CONO_IDORI = :IDNOMINA AND CONO_TIPOORI = 92 and cono_pagook = 'N'
    AND CONO_prov = 'N' AND CONO_APORTE = 'N' and CONO_DEB = 'S' AND TERC_NIT = :nitemplnglo
        INTO :total;
    SELECT TERC_NOM FROM TERCEROS WHERE TERC_NIT = :nitemplnglo INTO :emplnom;
    concepto = 'PAGO NOMINA ' || 'DEL PERIODO ' || CAST (periodo AS CHAR(2)) || ' DEL ' || nomiano;
    if((:TOTAL IS NOT NULL) or (:total <> 0)) then
    BEGIN
    INSERT INTO egresos (EGRE_ID, TIDO_COD, PREF_PRE, EGRE_numero, EGRE_fecha, EGRE_CONC, EGRE_MONTO, EGRE_RTFTEMONTO, EGRE_OBS, EGRE_NOMTERC, EGRE_ANULADO, EGRE_TRANSMIT, TERC_NIT, EGRE_TIPO, CAJA_ID, EGRE_usuario, NUMOK, CLEG_ID)
                 VALUES (:idegreso,62, :pref, :numeroegr, :fechaegr, :concepto, :total, :reten, :observaciones, :emplnom, 'N', 'N', :nitemplnglo, '3', :caja, :usuarioegr, 'S', 0);
    SELECT empl_formpago FROM EMPLEADOS WHERE TERC_NIT = :nitemplnglo INTO :pagoempl;
    if (pagoempl = 'B') then
    begin
    conceptobnco = :concepto;
    INSERT INTO egresos_banco (EGRE_ID, EGBC_TIPOBCO, CUBA_COD, EGBC_numero, EGBC_fecha, PRBA_PREF, EGBC_BENEF, EGBC_MONTO, EGBC_CONCEPTO, EGBC_GMF, EGBC_ANULADO, EGBC_TRANSMIT)
                       VALUES (:idegreso, 72, :cuentaid, :numeroegrebnco, :fechaegrbnco, :prefegrebnco, :nitemplnglo, :total, :conceptobnco, :gmf, 'N', 'N');
    end
    ELSE
    if (pagoempl = 'C') then
    INSERT INTO egresos_caja (EGRE_ID, EGCA_ITEM, CAJA_ID, FOPA_ID, EGCA_BANCO, EGCA_CUENTA, EGCA_numero, EGCA_fecha, EGCA_MONTO, EGCA_ANULADO, EGCA_TRANSMIT)
                 VALUES (:idegreso, 1, :caja, :formapagoid, :cajabnco, :cajabncocuenta, :cajabnconumeroegr, :fechaegr, :total, 'N', 'N');
    END
    EXECUTE PROCEDURE cambie_id_pago_nomina returning_values (:idpago);
    INSERT INTO pago_nomina (pgno_id, pgno_fecha, pgno_tipopago, pgno_egreid, pgno_egrepre, pgno_egrenum, pgno_monto, pgno_nomina, pgno_nit, pgno_formulario, PGNO_ANT)
                 VALUES (:idpago, :fechaegr, :pago , :idegreso, :pref, :numeroegr, 0, :idnomina, '', :formulario, 'N');
    SELECT SUM (cono_abono) FROM CONSOLIDADO_NOMINA WHERE CONO_IDORI = :IDNOMINA AND CONO_TIPOORI = 92 and cono_pagook = 'N'
    AND CONO_deduc = 'N' AND cono_prov = 'N' and TERC_NIT = :nitemplnglo
    INTO :totdevenempl;
    SELECT NOMI_PERIODOCIDAD FROM nomina WHERE NOMI_ID = :idnomina INTO :periodicidad;
    select max (pgno_item) from pago_nomina_det WHERE PGNO_ID = :idpago INTO :itempago;
    if (:itempago IS NULL) then
    itempago = 0;
    itempago = :itempago + 1;
    insert INTO pago_nomina_det  (pgno_id, terc_nit, pgnd_monto, pgno_item)
                 VALUES (:idpago, :nitemplnglo, :total, :itempago);
    numegresointeger = cast (numeroegr as integer);
    numegresointeger = numegresointeger + 1;
    execute procedure completa_ceros(numegresointeger)returning_values :numeroegr;
update CONSOLIDADO_NOMINA NC set nc.cono_pagook = 'S' WHERE NC.CONO_IDORI = :IDNOMINA AND CONO_TIPOORI = 92 and cono_pagook = 'N'
    AND CONO_prov = 'N' AND CONO_APORTE = 'N' and CONO_DEB = 'S' AND TERC_NIT = :nitemplnglo;
END
END
END
ELSE
exception nomina_con_pago;
END
^

SET TERM ; ^


SET TERM ^ ;

ALTER PROCEDURE IMPR_PLANILLA_NOMINA(
    ID INTEGER,
    PAGO CHAR(1),
    CTA CHAR(1),
    EMPL CHAR(1))
RETURNS (
    FECHA DATE,
    OBSERVACIONES BLOB SUB_TYPE 0 SEGMENT SIZE 80,
    PAGOGLOBAL CHAR(1),
    PERIODO INTEGER,
    ANO CHAR(4),
    PERIODICIDAD VARCHAR(60),
    NITEMPL VARCHAR(20),
    VALOR NUMERIC(18,2),
    DEDUC CHAR(1),
    NOMBREEMPL VARCHAR(60),
    NOMCORTCONC VARCHAR(60),
    NOMBRECONC VARCHAR(60),
    CODCONC INTEGER,
    PROV CHAR(1),
    TOTALEMPL NUMERIC(18,2),
    TOTALDEDUC NUMERIC(18,2),
    TOTALDEVENG NUMERIC(18,2),
    NUMEMPL INTEGER,
    CTAEMPL VARCHAR(25),
    TOTALCTAS NUMERIC(18,2),
    TOTALNOMI NUMERIC(18,2),
    TOTALAPOR NUMERIC(18,2),
    NOMPER VARCHAR(60),
    ORG CHAR(1),
    CARGOEMPL VARCHAR(60),
    DEPTOEMPL VARCHAR(60),
    NUMCOP INTEGER,
    NOMBRE_COPIA VARCHAR(60))
AS
DECLARE VARIABLE NITANT VARCHAR(20);
DECLARE VARIABLE nitnue VARCHAR(20);
DECLARE VARIABLE NUMCONC INTEGER;
DECLARE VARIABLE TOTALNOMINEG NUMERIC(18,2);
DECLARE VARIABLE TOTALAPORNEG NUMERIC(18,2);
BEGIN
SELECT N.nuco_copia FROM NUMERO_COPIA N WHERE N.tido_cod = 92 AND N.nuco_id = :id INTO :NUMCOP;
IF (numcop IS NULL) THEN
BEGIN
numcop = 0;
INSERT INTO NUMERO_COPIA (TIDO_COD, NUCO_ID, NUCO_COPIA) VALUES (92,:id,:numcop);
END
ELSE
BEGIN
numcop = :numcop + 1;
UPDATE numero_copia N SET N.nuco_copia = :numcop WHERE N.tido_cod = 92 AND N.nuco_id = :id;
END
SELECT N.noco_nombre FROM nombres_copias N WHERE N.noco_id = :numcop INTO :nombre_copia;
numempl = 0;
nitant = 0;
nitnue = 0;
IF (PAGO = 'N') THEN
BEGIN
FOR SELECT N.nomi_feccausa, N.nomi_obs, N.nomi_pagoglobal, N.nomi_periodo, N.nomi_ano, P.ppag_nombre, PN.pnom_nombre FROM NOMINA N, periodo_pago P, periodo_pago_nombre PN
 WHERE P.ppag_cod = N.nomi_periodocidad AND N.nomi_id = :ID AND PN.ppag_cod = N.nomi_periodocidad AND PN.ppag_periodo = N.nomi_periodo
 INTO :fecha, :observaciones, :pagoglobal, :periodo, :ano, :periodicidad, :NOMPER
 DO
 BEGIN
 FOR SELECT NC.terc_nit, NC.noco_valor, NC.noco_deduc, T.terc_nom, C.conc_nomcorto, C.conc_nombre, NC.conc_cod, NC.noco_prov, E.empl_cargo FROM NOMINA_CONCEPTOS NC, TERCEROS T, EMPLEADOS E, CONCEPTOS_NOMINA C
        WHERE NC.nomi_id = :ID AND T.terc_nit = E.terc_nit AND C.conc_cod = NC.conc_cod AND t.terc_nit = nc.terc_nit
      INTO :nitempl, :valor, :deduc, :nombreempl, :nomcortconc, :nombreconc, :codconc, :prov, :cargoempl
 DO
 BEGIN
 IF (valor IS NULL) THEN
 valor = 0;
 SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND TERC_NIT = :nitempl INTO :totalempl;
 SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND TERC_NIT = :nitempl AND NC.noco_deduc = 'S' INTO :totaldeduc;
 SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND TERC_NIT = :nitempl AND NC.noco_deduc = 'N' INTO :totaldeveng;
 SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id INTO :totalnomi;
 SELECT SUM(NC.noco_valor*-1) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_APORTE = 'S' AND NOCO_VALOR < 0 AND NOMI_ID = :id INTO :totalaporneg;
 SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_APORTE = 'S' AND NOCO_VALOR > 0 AND NOMI_ID = :id INTO :totalapor;
 totalapor = :totalapor + totalaporneg;
  SUSPEND;
 END
nitempl = '';
valor = NULL;
deduc = '';
nombreempl = NULL;
nomcortconc = NULL;
nombreconc = NULL;
codconc = NULL;
prov = NULL;
 FOR SELECT MAX(N.conc_cod) FROM NOMINA_CONCEPTOS N WHERE N.nomi_id = :id
 GROUP BY N.conc_cod
 INTO :codconc
 DO
 BEGIN
 SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC
 WHERE NC.nomi_id = :ID AND NC.conc_cod = :codconc
 GROUP BY NC.conc_cod
 INTO :valor;
 nitempl = '';
 nombreempl = '';
 deduc = 'N';
 prov = 'N';
 SELECT C.conc_nombre,C.conc_nomcorto FROM CONCEPTOS_NOMINA C WHERE C.conc_cod = :codconc INTO :nombreconc,:nomcortconc;
 SUSPEND;
 END
 END
END
ELSE
IF (PAGO = 'S') THEN
BEGIN
FOR SELECT N.nomi_feccausa, N.nomi_obs, N.nomi_pagoglobal, N.nomi_periodo, N.nomi_ano, P.ppag_nombre, PN.pnom_nombre FROM NOMINA N, periodo_pago P, periodo_pago_nombre PN
 WHERE P.ppag_cod = N.nomi_periodocidad AND N.nomi_id = :ID AND PN.ppag_cod = N.nomi_periodocidad AND PN.ppag_periodo = N.nomi_periodo
 INTO :fecha, :observaciones, :pagoglobal, :periodo, :ano, :periodicidad, :NOMPER
 DO
 BEGIN
 FOR SELECT NC.terc_nit, NC.noco_valor, NC.noco_deduc, T.terc_nom, C.conc_nomcorto, C.conc_nombre, NC.conc_cod, NC.noco_prov, E.empl_cargo, D.dpto_nombre
     FROM NOMINA_CONCEPTOS NC, TERCEROS T, EMPLEADOS E, CONCEPTOS_NOMINA C, DEPARTAMENTO D
     WHERE NC.nomi_id = :ID AND T.terc_nit = E.terc_nit AND C.conc_cod = NC.conc_cod AND t.terc_nit = nc.terc_nit AND D.dpto_cod = E.empl_dpto AND NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N'
     INTO :nitempl, :valor, :deduc, :nombreempl, :nomcortconc, :nombreconc, :codconc, :prov, :cargoempl,:deptoempl
 DO
 BEGIN
 IF (valor IS NULL) THEN
 valor = 0;
 SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND TERC_NIT = :nitempl INTO :totalempl;
 SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND TERC_NIT = :nitempl AND NC.noco_deduc = 'S' INTO :totaldeduc;
 SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND TERC_NIT = :nitempl AND NC.noco_deduc = 'N' INTO :totaldeveng;
 IF (cta = 'S') THEN
 BEGIN
 SELECT COUNT(CONC_COD) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND TERC_NIT = :nitempl INTO :numconc;
 totalempl = totalempl / :numconc;
 SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND TERC_NIT = :nitempl INTO :totalctas;
 END
 SELECT TERC_NIT, EMPL_CUENTA FROM EMPLEADOS WHERE TERC_NIT = :nitempl INTO :nitnue, :ctaempl;
 IF (nitnue IS NOT NULL) THEN
 BEGIN
 IF (nitnue <> nitant) THEN
 numempl = :numempl + 1;
 nitant = :nitnue;
 END
 SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id INTO :totalnomi;
 SELECT SUM(NC.noco_valor*-1) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_APORTE = 'S' AND NOCO_VALOR < 0 AND NOMI_ID = :id INTO :totalaporneg;
 SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_APORTE = 'S' AND NOCO_VALOR > 0 AND NOMI_ID = :id INTO :totalapor;
 totalapor = :totalapor + totalaporneg;
 SUSPEND;
 END
IF ( EMPL = 'N') THEN
BEGIN
nitempl = '';
valor = NULL;
deduc = '';
nombreempl = NULL;
nomcortconc = NULL;
nombreconc = NULL;
codconc = NULL;
prov = NULL;
totalempl = NULL;
ctaempl = NULL;
IF (cta = 'N') THEN
BEGIN
 FOR SELECT MAX(N.conc_cod) FROM NOMINA_CONCEPTOS N WHERE N.nomi_id = :id AND N.noco_prov = 'N' AND N.noco_gtoempr = 'N'
 GROUP BY N.conc_cod
 INTO :codconc
 DO
 BEGIN
 SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC
 WHERE NC.nomi_id = :ID AND NC.conc_cod = :codconc
 GROUP BY NC.conc_cod
 INTO :valor;
 nitempl = '';
 nombreempl = '';
 deduc = 'N';
 prov = 'N';
 SELECT C.conc_nombre,C.conc_nomcorto FROM CONCEPTOS_NOMINA C WHERE C.conc_cod = :codconc INTO :nombreconc,:nomcortconc;
 SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id INTO :totalempl;
 SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND NC.noco_deduc = 'S' INTO :totaldeduc;
 SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND NC.noco_deduc = 'N' INTO :totaldeveng;
 SUSPEND;
 END
END
END
 END
END
END
^

SET TERM ; ^

INSERT INTO CONFIGURACION (CONF_MODULO, CONF_CATEGORIA, CONF_PROPIEDAD, CONF_VALOR, CONF_POSIBLES, CONF_AYUDA) VALUES ('NOMINA', 'GENERAL', 'DIRECCION REPORTES', 'C:\SYSPLUS\NOMINA\REPORTES', NULL, 'Dirección de la carpeta de reportes para la compañia');

INSERT INTO NOMBRES_COPIAS (NOCO_ID, NOCO_NOMBRE) VALUES (4, 'COPIA - 4');
INSERT INTO NOMBRES_COPIAS (NOCO_ID, NOCO_NOMBRE) VALUES (5, 'COPIA - 5');
INSERT INTO NOMBRES_COPIAS (NOCO_ID, NOCO_NOMBRE) VALUES (6, 'COPIA - 6');
INSERT INTO NOMBRES_COPIAS (NOCO_ID, NOCO_NOMBRE) VALUES (7, 'COPIA - 7');
INSERT INTO NOMBRES_COPIAS (NOCO_ID, NOCO_NOMBRE) VALUES (8, 'COPIA - 8');
INSERT INTO NOMBRES_COPIAS (NOCO_ID, NOCO_NOMBRE) VALUES (9, 'COPIA - 9');
INSERT INTO NOMBRES_COPIAS (NOCO_ID, NOCO_NOMBRE) VALUES (10, 'COPIA - 10');

ALTER TABLE LIQUIDACION
ADD LIQD_INDEMNIZACION MONTO;

ALTER TABLE VACACIONES
ADD VACA_FECFIN DATE;

SET TERM ^ ;

CREATE OR ALTER procedure CERTIFICA_LABORAL (
       FEC DATE,
       NITEMPL VARCHAR(20))
returns (
        NOMEMPL VARCHAR(60),
        FECING DATE,
        SALARIO NUMERIC(18,2),
        SALARIOLET VARCHAR(60),
        NOMTIPOCONT VARCHAR(60),
        FECHAEXPED DATE,
        CARGOEMPL VARCHAR(60))
as
declare variable TIPCONT CHAR(1);
begin
SELECT E.empl_fecing, E.empl_salario, E.empl_cargo,T.terc_nom, H.hoem_tipocontr FROM EMPLEADOS E, TERCEROS T, horario_empleado H
WHERE T.terc_nit = E.terc_nit AND E.terc_nit = :nitempl AND E.terc_nit = H.terc_nit INTO :fecing,:salario,:cargoempl, :nomempl, :tipcont;
if (tipcont = 'I') then
nomtipocont = 'a termino indefinido';
else
if (tipcont = 'D') then
nomtipocont = 'a termino fijo';
fechaexped = :fec;
  suspend;
end
^

SET TERM ; ^

ALTER TABLE EMPLEADO_BENEFICIARIOS
ADD EMBE_EDAD INTEGER;

ALTER TABLE CONCEPTOS_NOMINA
ADD CONC_TOMSAL INTEGER;

UPDATE CONCEPTOS_NOMINA SET CONC_TOMSAL = 0;

ALTER TABLE EMPLEADO_CONCEPTOS
ADD EMCO_TOMSAL INTEGER;

UPDATE EMPLEADO_CONCEPTOS SET EMCO_TOMSAL = 0;

SET TERM ^ ;

CREATE OR ALTER PROCEDURE DIAS_LABORADOS(
    NITEMPL VARCHAR(20),
    PERIODO INTEGER,
    FEC DATE,
    MENSUAL CHAR(1),
    APORTE CHAR(1))
RETURNS (
    TOTALDIASLAB INTEGER)
AS
DECLARE VARIABLE diasnolab INTEGER;
DECLARE VARIABLE diaslabxper INTEGER;
DECLARE VARIABLE perpago INTEGER;
DECLARE VARIABLE fecing DATE;
DECLARE VARIABLE diasfec INTEGER;
DECLARE VARIABLE diasing INTEGER;
DECLARE VARIABLE existe CHAR(1);
BEGIN
SELECT E.empl_ppago, E.empl_fecing
FROM EMPLEADOS E WHERE TERC_NIT = :nitempl
INTO :perpago, :fecing;
IF (mensual = 'N') THEN
BEGIN
IF (perpago = 1) THEN
diaslabxper = 30;
ELSE
IF (perpago = 2) THEN
diaslabxper = 15;
ELSE
IF (perpago = 3) THEN
diaslabxper = 7;
END
ELSE
diaslabxper = 30;
IF (SUBSTR(fecing,1,7) = SUBSTR(FEC,1,7)) THEN
BEGIN
diasfec = CAST(substr(fec,9,10) AS INTEGER);
diasing = CAST(substr(fecing,9,10) AS INTEGER);
diaslabxper = diasfec - diasing;
IF ((diaslabxper > 15) AND (perpago = 2)) THEN
diaslabxper = 15;
END
SELECT 'S' FROM nomina_novedades WHERE TERC_NIT = :nitempl AND (TNOV_COD = 9 or (tnov_cod = 2) or (tnov_cod = 3)   ) AND NONO_PERIODO = :periodo
INTO :existe;
IF ((aporte = 'N' ) OR (:existe = 'S'))  THEN
BEGIN
SELECT SUM (NONO_DURA)
FROM nomina_novedades WHERE TERC_NIT = :nitempl AND (TNOV_COD = 9 OR (TNOV_COD = 6) OR (TNOV_COD = 2) OR (TNOV_COD =3) OR (TNOV_COD = 4)  ) AND NONO_PERIODO = :periodo
INTO :diasnolab;
totaldiaslab =  :diaslabxper - :diasnolab;
END
IF (totaldiaslab IS NULL) THEN
totaldiaslab =  :diaslabxper;
SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER PROCEDURE CAUSA_NOMINA(
    FEC DATE,
    PERIODO INTEGER,
    PERIODICIDAD INTEGER,
    PAGOGLOBAL CHAR(1),
    ANO CHAR(4))
RETURNS (
    IDNOMINA INTEGER)
AS
declare variable item integer;
declare variable nite varchar(20) character set none;
declare variable nit_tercero varchar(20);
declare variable concept integer;
declare variable montos numeric(18,2);
declare variable porcen numeric(9,4);
declare variable entidad varchar(20);
declare variable conc_cod integer;
declare variable conc_deduc char(1);
declare variable conc_porc numeric(9,4);
declare variable conc_entidad integer;
declare variable conc_monto numeric(18,2);
declare variable conc_modifi char(1);
declare variable conc_promedio char(1);
declare variable emco_perprom integer;
declare variable valor numeric(18,2);
declare variable diaslab integer;
declare variable conc_prov char(1);
declare variable conc_aporte char(1);
declare variable numeroprom integer;
declare variable conc_aplicaprom char(1);
declare variable perinicial integer;
declare variable anoprom integer;
declare variable conc_dias char(1);
declare variable conc_otroconc char(1);
declare variable conc_codotroconc integer;
declare variable anosum integer;
declare variable salario char(1) character set none;
declare variable liquidaper integer;
declare variable rmod numeric(2,2);
declare variable basico numeric(18,2);
declare variable niteps varchar(20);
declare variable nitafc varchar(20);
declare variable nitafp varchar(20);
declare variable nitccf varchar(20);
declare variable gtoempr char(1);
declare variable comision numeric(18,2);
declare variable cambsaltrans numeric(18,2);
declare variable saldosini numeric(18,2);
declare variable duranov integer;
declare variable base numeric(18,2);
declare variable aprox integer;
declare variable mensual char(1);
declare variable horasex numeric(18,2);
declare variable diasnov integer;
declare variable tomasal integer;
declare variable retroact numeric(18,2);
BEGIN
/* SI ES QUINCENAL */
EXECUTE PROCEDURE cambie_id_nomina RETURNING_VALUES(:idnomina);
INSERT INTO nomina (nomi_id, NOMI_FECCAUSA, NOMI_PAGOGLOBAL, NOMI_PERIODOCIDAD, NOMI_PERIODO, NOMI_ANO, NOMI_LIQOK)
VALUES (:IDNOMINA, :fec,:pagoglobal, :periodicidad, :periodo, :ano, 'N');
 BEGIN
    item = 1;
    FOR SELECT E.TERC_NIT, E.empl_salario, e.empl_eps, e.empl_afc, e.empl_afp, e.empl_ccf
    FROM EMPLEADOS E
    WHERE E.empl_ppago = :periodicidad AND E.empl_fecret IS NULL
    INTO :nite, :basico, :niteps, :nitafc, :nitafp, :nitccf
    DO
    BEGIN
    FOR SELECT CE.TERC_NIT, CE.CONC_COD, CE.EMCO_MONTO, CE.EMCO_PORC, ce.empl_entidad, CE.emco_perprom, CE.emco_luquidaper, CE.emco_mensual, CN.CONC_COD, CN.CONC_DEDUC,CN.CONC_PORC, CN.CONC_ENTIDAD, CN.CONC_MONTO,  CN.CONC_DIAS, CN.CONC_MODIFI,
    CN.CONC_PROMEDIO, CN.conc_salario, CE.emco_perprom, CN.conc_prov, CN.conc_aporte, CN.conc_aplicaprom, cn.conc_otroconc, cn.conc_codotroconc, CN.conc_gtoempr, CN.conc_base, CE.emco_tomsal
    FROM empleado_conceptos CE, CONCEPTOS_NOMINA CN WHERE ((CE.terc_nit = :nite) AND (CE.CONC_COD = CN.CONC_COD) AND (CN.conc_fecini <= :fec AND CN.conc_fecfin >= :FEC) ) OR ((CE.terc_nit = :nite)
    AND (CE.CONC_COD = CN.CONC_COD) AND (cn.conc_todosper = 'N') AND (CE.emco_ppago = :periodo)) OR  ((CE.terc_nit = :nite) AND (CE.CONC_COD = CN.CONC_COD) AND cn.conc_todosper = 'S')  ORDER BY (TERC_NIT )
    INTO :nit_tercero, :concept,  :montos, :porcen, :entidad, :numeroprom, :liquidaper, :mensual ,:CONC_COD, :CONC_DEDUC, :CONC_PORC,
    :CONC_ENTIDAD, :CONC_MONTO, :CONC_DIAS, :CONC_MODIFI,:CONC_PROMEDIO, :salario,:EMCO_PERPROM, :conc_prov, :conc_aporte , :CONC_APLICAPROM, :conc_otroconc, :conc_codotroconc, :gtoempr, :base, :tomasal
    DO
BEGIN
    IF (conc_dias = 'S') THEN
    EXECUTE PROCEDURE DIAS_LABORADOS (:nite, :periodo, :fec, :mensual,:conc_aporte) RETURNING_VALUES (:diaslab);
    ELSE
    BEGIN
    diaslab = 15;
    IF (mensual = 'S') THEN
    BEGIN
    IF (periodicidad = 2) THEN
    diaslab = 30;
    ELSE
    IF (liquidaper = 3) THEN
    diaslab = 30;
    END
    END
    if (:tomasal <> 0) then
    begin
         IF ((:periodicidad = 2) AND (:tomasal <> 2)) THEN
         BEGIN
          IF ((periodo = 2) OR (periodo = 4) OR (periodo = 6) OR (periodo = 8) OR (periodo = 10) OR (periodo = 12)
          OR (periodo = 14) OR (periodo = 16) OR (periodo = 18) OR (periodo = 20) OR (periodo = 22) OR (periodo = 24)) THEN
         basico = 0;
         END
         ELSE
         IF ((:periodicidad = 3) AND (:tomasal <> 1)) THEN
         BEGIN
          IF ((periodo = 1) OR (periodo = 5) OR (periodo = 9) OR (periodo = 13) OR (periodo = 17) OR (periodo = 21)
          OR (periodo = 25) OR (periodo = 29) OR (periodo = 33) OR (periodo = 37) OR (periodo = 41) OR (periodo = 45)
          OR (periodo = 49)) THEN
          basico = 0;
         END
         ELSE
         IF ((:periodicidad = 3) AND (:tomasal <> 2)) THEN
         BEGIN
          IF ((periodo = 2) OR (periodo = 6) OR (periodo = 10) OR (periodo = 14) OR (periodo = 18) OR (periodo = 22)
          OR (periodo = 26) OR (periodo = 30) OR (periodo = 34) OR (periodo = 38) OR (periodo = 42) OR (periodo = 46)
          OR (periodo = 50)) THEN
          basico = 0;
         END
         ELSE
         IF ((:periodicidad = 3) AND (:tomasal <> 3)) THEN
         BEGIN
          IF ((periodo = 3) OR (periodo = 7) OR (periodo = 11) OR (periodo = 15) OR (periodo = 19) OR (periodo = 23)
          OR (periodo = 27) OR (periodo = 31) OR (periodo = 35) OR (periodo = 39) OR (periodo = 43) OR (periodo = 47)
          OR (periodo = 51)) THEN
          basico = 0;
         END
         ELSE
         IF ((:periodicidad = 3) AND (:tomasal <> 4)) THEN
         BEGIN
          IF ((periodo = 4) OR (periodo = 8) OR (periodo = 12) OR (periodo = 16) OR (periodo = 20) OR (periodo = 24)
          OR (periodo = 29) OR (periodo = 32) OR (periodo = 36) OR (periodo = 40) OR (periodo = 44) OR (periodo = 48)
          OR (periodo = 52)) THEN
          basico = 0;
         END
    end
    ELSE
    SELECT E.empl_salario FROM EMPLEADOS E WHERE E.terc_nit = :nite INTO :basico;
 SELECT ((n.nono_valor /30) * n.nono_dura), (n.nono_dura) FROM nomina_novedades n WHERE n.tnov_cod = 11 AND n.terc_nit = :nite AND n.nono_periodo = :periodo INTO :cambsaltrans, :duranov;
 IF (cambsaltrans IS NULL) THEN
 cambsaltrans = 0;
 IF (duranov IS NULL) THEN
 duranov = 0;
 diaslab = :diaslab - :duranov;
 IF (conc_cod = 921) THEN
 BEGIN
 IF (porcen IS NOT NULL AND porcen <> 0) THEN
 valor = ((basico / 30)* :diaslab ) * :PORCEN /100;
 ELSE
 IF (conc_porc IS NOT NULL AND conc_porc <> 0) THEN
 valor = ((basico / 30)* :diaslab ) * :conc_porc /100;
 END
 ELSE
 IF (conc_cod = 922) THEN
 BEGIN
 SELECT P.prcu_monto FROM prestamo_cuotas P, prestamo_nomina PN WHERE P.prcu_ano = :ano AND P.prcu_periodo = :periodo AND PN.prno_id = P.prno_id AND PN.terc_nit = :nite INTO :valor;
 IF (valor IS NULL) THEN
 valor = 0;
 item = :item + 1;
 UPDATE prestamo_cuotas  P SET prcu_ok = 'S' WHERE P.prcu_ano = :ano AND P.prcu_periodo = :periodo AND P.prno_id = (SELECT PN.prno_id FROM PRESTAMO_NOMINA PN WHERE PN.terc_nit = :nite);
 END
 ELSE
 BEGIN
    IF ((:montos = 0) OR (:montos IS NULL)) THEN
      BEGIN
      IF ((CONC_PORC = 0 AND :porcen = 0) OR (CONC_PORC IS NULL AND :porcen = 0) OR (CONC_PORC = 0 AND :porcen IS NULL) OR (CONC_PORC IS NULL AND :porcen IS NULL) ) THEN
        BEGIN
        IF ((conc_monto <> 0) AND (conc_monto IS NOT NULL) ) THEN
        BEGIN
        VALOR = :CONC_MONTO;
        IF (:conc_dias = 'S') THEN
        valor = (:valor / 30) * :diaslab;
        END
        ELSE
        IF (salario = 'S' AND CONC_COD <> 900 AND CONC_COD <> 920) THEN
        BEGIN
        conc_monto = :basico;
        VALOR = (:conc_monto/30 * :diaslab ) + :cambsaltrans;
        END
        ELSE
        BEGIN
        valor = montos;
        IF (:conc_dias = 'S') THEN
        valor = (:valor / 30) * :diaslab;
        END
        END
       ELSE
       BEGIN
        IF (:porcen <> 0) THEN
          BEGIN
            IF ((conc_monto <> 0) AND (conc_monto IS NOT NULL) ) THEN
            BEGIN
              VALOR = ((:CONC_MONTO ) * :PORCEN) /100;
            END
          END
          ELSE
          BEGIN
            IF ((conc_monto <> 0) AND (conc_monto IS NOT NULL) ) THEN
            BEGIN
              VALOR = ((:CONC_MONTO) * :conc_porc) /100;
            END
            ELSE
        IF (salario = 'S' AND CONC_COD <> 900 AND CONC_COD <> 920) THEN
            BEGIN
              conc_monto = :basico;
              VALOR = ((:CONC_MONTO)+ :cambsaltrans * :conc_porc) /100;
            END
            ELSE
            if (:conc_monto = 0 AND :montos = 0) then
            BEGIN
            conc_monto = :basico;
            VALOR = (((:CONC_MONTO / 30) * :diaslab) + :cambsaltrans * :conc_porc) /100;
            END
          END
       END
      END
    ELSE
    BEGIN
      IF ((CONC_PORC = 0 OR (conc_porc IS NULL)) AND (:porcen = 0 OR (porcen IS NULL))) THEN
      BEGIN
      VALOR = (:montos);
      IF (:conc_dias = 'S') THEN
      valor = (:valor / 30) * :diaslab;
      END
      ELSE
      BEGIN
        IF (:porcen <> 0 AND porcen IS NOT NULL) THEN
          BEGIN
          VALOR = ((:MONTOS ) * :PORCEN) /100;
          END
          ELSE
          BEGIN
          VALOR = ((:montos) * :CONC_PORC) /100;
          END
          END
   END
    IF (conc_promedio = 'S') THEN
    BEGIN
    perinicial = :periodo - (:numeroprom) + 1;
    anoprom = CAST (ano AS INTEGER);
    IF (perinicial <= 0) THEN
    BEGIN
    perinicial = 24 + :PERINICIAL;
    anoprom = CAST(ANO AS INTEGER) - 1;
    END
    SELECT SUM (noco_valor) FROM nomina_conceptos n WHERE n.noco_aplicaprom = 'S' AND N.noco_periodo >= :perinicial - 1 AND N.noco_periodo < :periodo AND N.noco_ano >= :anoprom AND N.noco_ano <= :ano AND terc_nit = :nite INTO :valor;
    valor = (valor / numeroprom);
    SELECT NOCO_VALOR FROM NOMINA_CONCEPTOS WHERE CONC_COD = :conc_cod AND TERC_NIT  = :nite AND NOCO_PAGOOK = 'N' AND NOCO_PERIODO = 0 INTO :saldosini;
    IF (saldosini IS NULL) THEN
    saldosini = 0;
    ELSE
    UPDATE nomina_conceptos N SET noco_pagook = 'S' WHERE n.noco_aplicaprom = 'S' AND N.noco_periodo >= :perinicial - 1 AND N.noco_periodo < :periodo AND N.noco_ano >= :anoprom AND N.noco_ano <= :ano  AND CONC_COD = :conc_cod AND terc_nit = :nite AND NOCO_PERIODO = 0;
    VALOR = :valor + :saldosini;
    UPDATE nomina_conceptos N SET noco_pagook = 'S' WHERE n.noco_aplicaprom = 'S' AND N.noco_periodo >= :perinicial - 1 AND N.noco_periodo < :periodo AND N.noco_ano >= :anoprom AND N.noco_ano <= :ano  AND CONC_COD = :conc_cod AND terc_nit = :nite;
    END
    IF (conc_otroconc = 'S') THEN
    BEGIN
    anosum = CAST(ano AS INTEGER);
    anosum = anosum - 1;
    SELECT SUM (noco_valor) FROM nomina_conceptos n WHERE n.noco_ano = :anosum AND n.conc_cod = :conc_codotroconc AND N.terc_nit = :nite INTO :valor;
    SELECT NOCO_VALOR FROM NOMINA_CONCEPTOS WHERE noco_ano = :anosum AND conc_cod = :conc_codotroconc AND terc_nit = :nite AND NOCO_PERIODO = 0 INTO :saldosini;
    IF (saldosini IS NULL) THEN
    saldosini = 0;
    ELSE
    UPDATE nomina_conceptos SET noco_pagook = 'S' WHERE noco_ano = :anosum AND conc_cod = :conc_codotroconc AND NOCO_PERIODO = 0 AND terc_nit = :nite;
    VALOR = :valor + :saldosini;
    UPDATE nomina_conceptos SET noco_pagook = 'S' WHERE noco_ano = :anosum AND conc_cod = :conc_codotroconc AND terc_nit = :nite;
    END
/*SI EL CONCEPTO ES UN APORTE*/
IF (conc_aporte = 'S') THEN
BEGIN
    horasex = null;
    diasnov = null;
    IF ((:entidad = '' ) OR (entidad IS NULL)) THEN
    BEGIN
     SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
    IF (comision IS NULL) THEN
     comision = 0;
     SELECT C.emco_monto FROM EMPLEADO_CONCEPTOS C WHERE C.terc_nit = :nite AND C.conc_cod = 933 INTO :retroact;
     if (retroact IS NULL ) then
     retroact = 0;
     valor = :basico + :comision + :horasex + :retroact;
     select n.nono_dura from nomina_novedades n where n.terc_nit = :nite and n.tnov_cod = 6 and n.nono_periodo = :periodo and n.nono_ano = :ano into :diasnov;
     if (diasnov is null) then
     diasnov = 0;
     if ((diasnov is not null) and (diasnov <> 0)) then
     diaslab = :diaslab - :diasnov;
    IF ((conc_cod = 904) OR (conc_cod = 905) OR (conc_cod = 906)) THEN
            BEGIN
            entidad = :nitafp;
                IF (conc_cod = 904) THEN
                BEGIN
                SELECT A.paan_afptr FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                SELECT c.noex_monto FROM nomina_horasext c WHERE c.noex_ano = :ano AND c.noex_periodio = :periodo AND c.noex_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :horasex;
                if (horasex is not null) then
                VALOR = (((((:basico )/30 * :diaslab ) + :comision + :horasex + :retroact)+ :cambsaltrans) * :PORCEN) /100;
                else
                VALOR = (((((:basico )/30 * :diaslab ) + :comision + :retroact)+ :cambsaltrans) * :PORCEN) /100;
                END
                ELSE
                IF ((conc_cod = 905) OR (conc_cod = 906)) THEN
                BEGIN
                SELECT A.paan_afpem FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                SELECT c.noex_monto FROM nomina_horasext c WHERE c.noex_ano = :ano AND c.noex_periodio = :periodo AND c.noex_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :horasex;
                if (horasex is not null) then
                VALOR = (((((:basico )/30 * :diaslab ) + :comision + :horasex + :retroact)+ :cambsaltrans) * :PORCEN) /100;
                else
                VALOR = (((((:basico )/30 * :diaslab ) + :comision + :retroact)+ :cambsaltrans) * :PORCEN) /100;
                END
            END
            ELSE
       IF ((conc_cod = 907) OR (conc_cod = 914) OR (conc_cod = 915)) THEN
            BEGIN
            entidad = :niteps;
                IF (conc_cod = 907) THEN
                BEGIN
                SELECT A.paan_epstr FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                SELECT c.noex_monto FROM nomina_horasext c WHERE c.noex_ano = :ano AND c.noex_periodio = :periodo AND c.noex_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :horasex;
                if (horasex is not null) then
                VALOR = (((((:basico )/30 * :diaslab ) + :comision + :horasex + :retroact)+ :cambsaltrans) * :PORCEN) /100;
                else
                VALOR = (((((:basico )/30 * :diaslab ) + :comision + :retroact)+ :cambsaltrans) * :PORCEN) /100;
                END
                ELSE
                IF ((conc_cod = 914) OR (conc_cod = 915)) THEN
                BEGIN
                SELECT A.paan_epsem FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                SELECT c.noex_monto FROM nomina_horasext c WHERE c.noex_ano = :ano AND c.noex_periodio = :periodo AND c.noex_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :horasex;
                if (horasex is not null) then
                VALOR = (((((:basico )/30 * :diaslab ) + :comision + :horasex + :retroact)+ :cambsaltrans) * :PORCEN) /100;
                else
                VALOR = (((((:basico )/30 * :diaslab ) + :comision + :retroact)+ :cambsaltrans) * :PORCEN) /100;
                END
            END
            ELSE
       IF ((conc_cod = 910) OR (conc_cod = 911) OR (conc_cod = 916) OR (conc_cod = 917) OR (conc_cod = 918) OR (conc_cod = 919)) THEN
            BEGIN
            entidad = :nitccf;
            SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
            IF (comision IS NULL) THEN
            comision = 0;
                IF ((conc_cod = 910) OR (conc_cod = 911) ) THEN
                BEGIN
                SELECT A.paan_ccf FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                SELECT c.noex_monto FROM nomina_horasext c WHERE c.noex_ano = :ano AND c.noex_periodio = :periodo AND c.noex_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :horasex;
                if (horasex is not null) then
                VALOR = (((((:basico )/30 * :diaslab ) + :comision + :horasex + :retroact)+ :cambsaltrans) * :PORCEN) /100;
                else
                VALOR = (((((:basico )/30 * :diaslab ) + :comision + :retroact /*+ :horasex*/)+ :cambsaltrans) * :PORCEN) /100;
                END
                ELSE
                IF ((conc_cod = 916) OR (conc_cod = 917)) THEN
                BEGIN
                SELECT A.paan_icbf FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                SELECT c.noex_monto FROM nomina_horasext c WHERE c.noex_ano = :ano AND c.noex_periodio = :periodo AND c.noex_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :horasex;
                if (horasex is not null) then
                VALOR = (((((:basico )/30 * :diaslab ) + :comision + :horasex + :retroact)+ :cambsaltrans) * :PORCEN) /100;
                else
                VALOR = (((((:basico )/30 * :diaslab ) + :comision + :retroact/*+ :horasex*/)+ :cambsaltrans) * :PORCEN) /100;
                END
                ELSE
                IF ((conc_cod = 918) OR (conc_cod = 919)) THEN
                BEGIN
                SELECT A.paan_sena FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                SELECT c.noex_monto FROM nomina_horasext c WHERE c.noex_ano = :ano AND c.noex_periodio = :periodo AND c.noex_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :horasex;
                if (horasex is not null) then
                VALOR = (((((:basico )/30 * :diaslab ) + :comision + :horasex + :retroact)+ :cambsaltrans) * :PORCEN) /100;
                else
                VALOR = (((((:basico )/30 * :diaslab ) + :comision + :retroact/*+ :horasex*/)+ :cambsaltrans) * :PORCEN) /100;
                END
            END
            ELSE
        IF ((conc_cod = 912) OR (conc_cod = 913)) THEN
            BEGIN
            entidad = :nitafc;
            SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
            IF (comision IS NULL) THEN
            comision = 0;
                IF ((conc_cod = 912) OR (conc_cod = 913) ) THEN
                BEGIN
/*                SELECT A.paan_cesemp FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
*/                SELECT c.noex_monto FROM nomina_horasext c WHERE c.noex_ano = :ano AND c.noex_periodio = :periodo AND c.noex_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :horasex;
                if (horasex is not null) then
                VALOR = (((((:basico )/30 * :diaslab ) + :comision + :horasex + :retroact)+ :cambsaltrans) * :PORCEN) /100;
                else
                VALOR = (((((:basico )/30 * :diaslab ) + :comision + :retroact/*+ :horasex*/)+ :cambsaltrans) * :PORCEN) /100;
                END
            END
            ELSE
        BEGIN
        IF (comision IS NULL) THEN
        comision = 0;
        SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
        conc_monto = :basico + :comision;
        IF (conc_porc <> 0 AND conc_porc IS NOT NULL) THEN
        VALOR = (((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans) * :conc_porc) /100;
        ELSE
        IF (:porcen <> 0 AND :porcen IS NOT NULL) THEN
        VALOR = (((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans) * :porcen) /100;
        ELSE
        IF (:montos <> 0 AND :montos IS NOT NULL) THEN
        valor = :montos;
        ELSE
        IF (:conc_monto <> 0 AND :conc_monto IS NOT NULL) THEN
        valor = :conc_monto;
        END
    END
    END
    ELSE
    IF (conc_prov = 'S') THEN
    BEGIN
        conc_monto = :basico;
        IF (conc_porc <> 0 AND conc_porc IS NOT NULL) THEN
        VALOR = (((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans) * :conc_porc) /100;
        ELSE
        IF (porcen <> 0 AND porcen IS NOT NULL) THEN
        VALOR = (((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans) * :porcen) /100;
        ELSE
        IF (montos <> 0 AND montos IS NOT NULL) THEN
        VALOR = :montos;
        ELSE
        IF (conc_monto <> 0 AND conc_monto IS NOT NULL) THEN
        VALOR = :conc_monto;
    END
item = :item + 1;
END
 IF (conc_cod = 920) THEN
 BEGIN
 SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :valor;
 IF (valor IS NULL) THEN
 valor = 0;
 item = :item + 1;
 END
 ELSE
 if (conc_cod = 900 or (:conc_cod = 931)) then
 BEGIN
 SELECT c.noex_monto FROM nomina_horasext c WHERE c.noex_ano = :ano AND c.noex_periodio = :periodo AND c.noex_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :valor;
 IF (valor IS NULL) THEN
 valor = 0;
 item = :item + 1;
 END
 ELSE
 if (conc_cod = 932) then
 BEGIN
 select N.nono_dura FROM NOMINA_NOVEDADES N WHERE N.terc_nit = :nite AND N.nono_periodo = :periodo AND N.nono_ano = :ano INTO :diasnov;
 if (:diasnov IS NULL) then
 valor = 0;
 else
 valor = (:basico / 30)* :diasnov;
 END
    EXECUTE PROCEDURE LEE_CONFIGURACION('NOMINA','GENERAL','REDONDEO AL MULTIPLO DE DIEZ EN TOTALES')RETURNING_VALUES(:aprox);
    EXECUTE PROCEDURE REDONDEE(:valor, :aprox) RETURNING_VALUES (VALOR);
    IF ((mensual = 'N') OR (periodicidad = 1))  THEN
    INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
    VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
    ELSE
    IF (mensual = 'S') THEN
    BEGIN
         IF ((:periodicidad = 2) AND (liquidaper = 1)) THEN
         BEGIN
          IF ((periodo = 1) OR (periodo = 3) OR (periodo = 5) OR (periodo = 7) OR (periodo = 9) OR (periodo = 11)
          OR (periodo = 13) OR (periodo = 15) OR (periodo = 17) OR (periodo = 19) OR (periodo = 21) OR (periodo = 23)) THEN
             INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
             VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
         END
         ELSE
         IF ((:periodicidad = 2) AND (liquidaper = 2)) THEN
         BEGIN
          IF ((periodo = 2) OR (periodo = 4) OR (periodo = 6) OR (periodo = 8) OR (periodo = 10) OR (periodo = 12)
          OR (periodo = 14) OR (periodo = 16) OR (periodo = 18) OR (periodo = 20) OR (periodo = 22) OR (periodo = 24)) THEN
             INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
             VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
         END
         ELSE
         IF ((:periodicidad = 3) AND (liquidaper = 1)) THEN
         BEGIN
          IF ((periodo = 1) OR (periodo = 5) OR (periodo = 9) OR (periodo = 13) OR (periodo = 17) OR (periodo = 21)
          OR (periodo = 25) OR (periodo = 29) OR (periodo = 33) OR (periodo = 37) OR (periodo = 41) OR (periodo = 45)
          OR (periodo = 49)) THEN
             INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
             VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
         END
         ELSE
         IF ((:periodicidad = 3) AND (liquidaper = 2)) THEN
         BEGIN
          IF ((periodo = 2) OR (periodo = 6) OR (periodo = 10) OR (periodo = 14) OR (periodo = 18) OR (periodo = 22)
          OR (periodo = 26) OR (periodo = 30) OR (periodo = 34) OR (periodo = 38) OR (periodo = 42) OR (periodo = 46)
          OR (periodo = 50)) THEN
            INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
             VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
         END
         ELSE
         IF ((:periodicidad = 3) AND (liquidaper = 3)) THEN
         BEGIN
          IF ((periodo = 3) OR (periodo = 7) OR (periodo = 11) OR (periodo = 15) OR (periodo = 19) OR (periodo = 23)
          OR (periodo = 27) OR (periodo = 31) OR (periodo = 35) OR (periodo = 39) OR (periodo = 43) OR (periodo = 47)
          OR (periodo = 51)) THEN
            INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
             VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
         END
         ELSE
         IF ((:periodicidad = 3) AND (liquidaper = 4)) THEN
         BEGIN
          IF ((periodo = 4) OR (periodo = 8) OR (periodo = 12) OR (periodo = 16) OR (periodo = 20) OR (periodo = 24)
          OR (periodo = 29) OR (periodo = 32) OR (periodo = 36) OR (periodo = 40) OR (periodo = 44) OR (periodo = 48)
          OR (periodo = 52)) THEN
            INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
             VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
         END
    END
  END
 END
END
SUSPEND;
END
^

SET TERM ; ^

ALTER TABLE PARAMETROS_ANO DROP PAAN_CESEMP;

ALTER TABLE PARAMETROS_ANO ADD PAAN_CESEMP NUMERIC(18,2);

SET TERM ^ ;

CREATE OR ALTER PROCEDURE CAUSA_NOMINA(
    FEC DATE,
    PERIODO INTEGER,
    PERIODICIDAD INTEGER,
    PAGOGLOBAL CHAR(1),
    ANO CHAR(4))
RETURNS (
    IDNOMINA INTEGER)
AS
declare variable item integer;
declare variable nite varchar(20) character set none;
declare variable nit_tercero varchar(20);
declare variable concept integer;
declare variable montos numeric(18,2);
declare variable porcen numeric(9,4);
declare variable entidad varchar(20);
declare variable conc_cod integer;
declare variable conc_deduc char(1);
declare variable conc_porc numeric(9,4);
declare variable conc_entidad integer;
declare variable conc_monto numeric(18,2);
declare variable conc_modifi char(1);
declare variable conc_promedio char(1);
declare variable emco_perprom integer;
declare variable valor numeric(18,2);
declare variable diaslab integer;
declare variable conc_prov char(1);
declare variable conc_aporte char(1);
declare variable numeroprom integer;
declare variable conc_aplicaprom char(1);
declare variable perinicial integer;
declare variable anoprom integer;
declare variable conc_dias char(1);
declare variable conc_otroconc char(1);
declare variable conc_codotroconc integer;
declare variable anosum integer;
declare variable salario char(1) character set none;
declare variable liquidaper integer;
declare variable rmod numeric(2,2);
declare variable basico numeric(18,2);
declare variable niteps varchar(20);
declare variable nitafc varchar(20);
declare variable nitafp varchar(20);
declare variable nitccf varchar(20);
declare variable gtoempr char(1);
declare variable comision numeric(18,2);
declare variable cambsaltrans numeric(18,2);
declare variable saldosini numeric(18,2);
declare variable duranov integer;
declare variable base numeric(18,2);
declare variable aprox integer;
declare variable mensual char(1);
declare variable horasex numeric(18,2);
declare variable diasnov integer;
declare variable tomasal integer;
declare variable retroact numeric(18,2);
BEGIN
/* SI ES QUINCENAL */
EXECUTE PROCEDURE cambie_id_nomina RETURNING_VALUES(:idnomina);
INSERT INTO nomina (nomi_id, NOMI_FECCAUSA, NOMI_PAGOGLOBAL, NOMI_PERIODOCIDAD, NOMI_PERIODO, NOMI_ANO, NOMI_LIQOK)
VALUES (:IDNOMINA, :fec,:pagoglobal, :periodicidad, :periodo, :ano, 'N');
 BEGIN
    item = 1;
    FOR SELECT E.TERC_NIT, E.empl_salario, e.empl_eps, e.empl_afc, e.empl_afp, e.empl_ccf
    FROM EMPLEADOS E
    WHERE E.empl_ppago = :periodicidad AND E.empl_fecret IS NULL
    INTO :nite, :basico, :niteps, :nitafc, :nitafp, :nitccf
    DO
    BEGIN
    FOR SELECT CE.TERC_NIT, CE.CONC_COD, CE.EMCO_MONTO, CE.EMCO_PORC, ce.empl_entidad, CE.emco_perprom, CE.emco_luquidaper, CE.emco_mensual, CN.CONC_COD, CN.CONC_DEDUC,CN.CONC_PORC, CN.CONC_ENTIDAD, CN.CONC_MONTO,  CN.CONC_DIAS, CN.CONC_MODIFI,
    CN.CONC_PROMEDIO, CN.conc_salario, CE.emco_perprom, CN.conc_prov, CN.conc_aporte, CN.conc_aplicaprom, cn.conc_otroconc, cn.conc_codotroconc, CN.conc_gtoempr, CN.conc_base, CE.emco_tomsal
    FROM empleado_conceptos CE, CONCEPTOS_NOMINA CN WHERE ((CE.terc_nit = :nite) AND (CE.CONC_COD = CN.CONC_COD) AND (CN.conc_fecini <= :fec AND CN.conc_fecfin >= :FEC) ) OR ((CE.terc_nit = :nite)
    AND (CE.CONC_COD = CN.CONC_COD) AND (cn.conc_todosper = 'N') AND (CE.emco_ppago = :periodo)) OR  ((CE.terc_nit = :nite) AND (CE.CONC_COD = CN.CONC_COD) AND cn.conc_todosper = 'S')  ORDER BY (TERC_NIT )
    INTO :nit_tercero, :concept,  :montos, :porcen, :entidad, :numeroprom, :liquidaper, :mensual ,:CONC_COD, :CONC_DEDUC, :CONC_PORC,
    :CONC_ENTIDAD, :CONC_MONTO, :CONC_DIAS, :CONC_MODIFI,:CONC_PROMEDIO, :salario,:EMCO_PERPROM, :conc_prov, :conc_aporte , :CONC_APLICAPROM, :conc_otroconc, :conc_codotroconc, :gtoempr, :base, :tomasal
    DO
BEGIN
    IF (conc_dias = 'S') THEN
    EXECUTE PROCEDURE DIAS_LABORADOS (:nite, :periodo, :fec, :mensual,:conc_aporte) RETURNING_VALUES (:diaslab);
    ELSE
    BEGIN
    diaslab = 15;
    IF (mensual = 'S') THEN
    BEGIN
    IF (periodicidad = 2) THEN
    diaslab = 30;
    ELSE
    IF (liquidaper = 3) THEN
    diaslab = 30;
    END
    END
    if (:tomasal <> 0) then
    begin
         IF ((:periodicidad = 2) AND (:tomasal <> 2)) THEN
         BEGIN
          IF ((periodo = 2) OR (periodo = 4) OR (periodo = 6) OR (periodo = 8) OR (periodo = 10) OR (periodo = 12)
          OR (periodo = 14) OR (periodo = 16) OR (periodo = 18) OR (periodo = 20) OR (periodo = 22) OR (periodo = 24)) THEN
         basico = 0;
         END
         ELSE
         IF ((:periodicidad = 3) AND (:tomasal <> 1)) THEN
         BEGIN
          IF ((periodo = 1) OR (periodo = 5) OR (periodo = 9) OR (periodo = 13) OR (periodo = 17) OR (periodo = 21)
          OR (periodo = 25) OR (periodo = 29) OR (periodo = 33) OR (periodo = 37) OR (periodo = 41) OR (periodo = 45)
          OR (periodo = 49)) THEN
          basico = 0;
         END
         ELSE
         IF ((:periodicidad = 3) AND (:tomasal <> 2)) THEN
         BEGIN
          IF ((periodo = 2) OR (periodo = 6) OR (periodo = 10) OR (periodo = 14) OR (periodo = 18) OR (periodo = 22)
          OR (periodo = 26) OR (periodo = 30) OR (periodo = 34) OR (periodo = 38) OR (periodo = 42) OR (periodo = 46)
          OR (periodo = 50)) THEN
          basico = 0;
         END
         ELSE
         IF ((:periodicidad = 3) AND (:tomasal <> 3)) THEN
         BEGIN
          IF ((periodo = 3) OR (periodo = 7) OR (periodo = 11) OR (periodo = 15) OR (periodo = 19) OR (periodo = 23)
          OR (periodo = 27) OR (periodo = 31) OR (periodo = 35) OR (periodo = 39) OR (periodo = 43) OR (periodo = 47)
          OR (periodo = 51)) THEN
          basico = 0;
         END
         ELSE
         IF ((:periodicidad = 3) AND (:tomasal <> 4)) THEN
         BEGIN
          IF ((periodo = 4) OR (periodo = 8) OR (periodo = 12) OR (periodo = 16) OR (periodo = 20) OR (periodo = 24)
          OR (periodo = 29) OR (periodo = 32) OR (periodo = 36) OR (periodo = 40) OR (periodo = 44) OR (periodo = 48)
          OR (periodo = 52)) THEN
          basico = 0;
         END
    end
    ELSE
    SELECT E.empl_salario FROM EMPLEADOS E WHERE E.terc_nit = :nite INTO :basico;
 SELECT ((n.nono_valor /30) * n.nono_dura), (n.nono_dura) FROM nomina_novedades n WHERE n.tnov_cod = 11 AND n.terc_nit = :nite AND n.nono_periodo = :periodo INTO :cambsaltrans, :duranov;
 IF (cambsaltrans IS NULL) THEN
 cambsaltrans = 0;
 IF (duranov IS NULL) THEN
 duranov = 0;
 diaslab = :diaslab - :duranov;
 IF (conc_cod = 921) THEN
 BEGIN
 IF (porcen IS NOT NULL AND porcen <> 0) THEN
 valor = ((basico / 30)* :diaslab ) * :PORCEN /100;
 ELSE
 IF (conc_porc IS NOT NULL AND conc_porc <> 0) THEN
 valor = ((basico / 30)* :diaslab ) * :conc_porc /100;
 END
 ELSE
 IF (conc_cod = 922) THEN
 BEGIN
 SELECT P.prcu_monto FROM prestamo_cuotas P, prestamo_nomina PN WHERE P.prcu_ano = :ano AND P.prcu_periodo = :periodo AND PN.prno_id = P.prno_id AND PN.terc_nit = :nite INTO :valor;
 IF (valor IS NULL) THEN
 valor = 0;
 item = :item + 1;
 UPDATE prestamo_cuotas  P SET prcu_ok = 'S' WHERE P.prcu_ano = :ano AND P.prcu_periodo = :periodo AND P.prno_id = (SELECT PN.prno_id FROM PRESTAMO_NOMINA PN WHERE PN.terc_nit = :nite);
 END
 ELSE
 BEGIN
    IF ((:montos = 0) OR (:montos IS NULL)) THEN
      BEGIN
      IF ((CONC_PORC = 0 AND :porcen = 0) OR (CONC_PORC IS NULL AND :porcen = 0) OR (CONC_PORC = 0 AND :porcen IS NULL) OR (CONC_PORC IS NULL AND :porcen IS NULL) ) THEN
        BEGIN
        IF ((conc_monto <> 0) AND (conc_monto IS NOT NULL) ) THEN
        BEGIN
        VALOR = :CONC_MONTO;
        IF (:conc_dias = 'S') THEN
        valor = (:valor / 30) * :diaslab;
        END
        ELSE
        IF (salario = 'S' AND CONC_COD <> 900 AND CONC_COD <> 920) THEN
        BEGIN
        conc_monto = :basico;
        VALOR = (:conc_monto/30 * :diaslab ) + :cambsaltrans;
        END
        ELSE
        BEGIN
        valor = montos;
        IF (:conc_dias = 'S') THEN
        valor = (:valor / 30) * :diaslab;
        END
        END
       ELSE
       BEGIN
        IF (:porcen <> 0) THEN
          BEGIN
            IF ((conc_monto <> 0) AND (conc_monto IS NOT NULL) ) THEN
            BEGIN
              VALOR = ((:CONC_MONTO ) * :PORCEN) /100;
            END
          END
          ELSE
          BEGIN
            IF ((conc_monto <> 0) AND (conc_monto IS NOT NULL) ) THEN
            BEGIN
              VALOR = ((:CONC_MONTO) * :conc_porc) /100;
            END
            ELSE
        IF (salario = 'S' AND CONC_COD <> 900 AND CONC_COD <> 920) THEN
            BEGIN
              conc_monto = :basico;
              VALOR = ((:CONC_MONTO)+ :cambsaltrans * :conc_porc) /100;
            END
            ELSE
            if (:conc_monto = 0 AND :montos = 0) then
            BEGIN
            conc_monto = :basico;
            VALOR = (((:CONC_MONTO / 30) * :diaslab) + :cambsaltrans * :conc_porc) /100;
            END
          END
       END
      END
    ELSE
    BEGIN
      IF ((CONC_PORC = 0 OR (conc_porc IS NULL)) AND (:porcen = 0 OR (porcen IS NULL))) THEN
      BEGIN
      VALOR = (:montos);
      IF (:conc_dias = 'S') THEN
      valor = (:valor / 30) * :diaslab;
      END
      ELSE
      BEGIN
        IF (:porcen <> 0 AND porcen IS NOT NULL) THEN
          BEGIN
          VALOR = ((:MONTOS ) * :PORCEN) /100;
          END
          ELSE
          BEGIN
          VALOR = ((:montos) * :CONC_PORC) /100;
          END
          END
   END
    IF (conc_promedio = 'S') THEN
    BEGIN
    perinicial = :periodo - (:numeroprom) + 1;
    anoprom = CAST (ano AS INTEGER);
    IF (perinicial <= 0) THEN
    BEGIN
    perinicial = 24 + :PERINICIAL;
    anoprom = CAST(ANO AS INTEGER) - 1;
    END
    SELECT SUM (noco_valor) FROM nomina_conceptos n WHERE n.noco_aplicaprom = 'S' AND N.noco_periodo >= :perinicial - 1 AND N.noco_periodo < :periodo AND N.noco_ano >= :anoprom AND N.noco_ano <= :ano AND terc_nit = :nite INTO :valor;
    valor = (valor / numeroprom);
    SELECT NOCO_VALOR FROM NOMINA_CONCEPTOS WHERE CONC_COD = :conc_cod AND TERC_NIT  = :nite AND NOCO_PAGOOK = 'N' AND NOCO_PERIODO = 0 INTO :saldosini;
    IF (saldosini IS NULL) THEN
    saldosini = 0;
    ELSE
    UPDATE nomina_conceptos N SET noco_pagook = 'S' WHERE n.noco_aplicaprom = 'S' AND N.noco_periodo >= :perinicial - 1 AND N.noco_periodo < :periodo AND N.noco_ano >= :anoprom AND N.noco_ano <= :ano  AND CONC_COD = :conc_cod AND terc_nit = :nite AND NOCO_PERIODO = 0;
    VALOR = :valor + :saldosini;
    UPDATE nomina_conceptos N SET noco_pagook = 'S' WHERE n.noco_aplicaprom = 'S' AND N.noco_periodo >= :perinicial - 1 AND N.noco_periodo < :periodo AND N.noco_ano >= :anoprom AND N.noco_ano <= :ano  AND CONC_COD = :conc_cod AND terc_nit = :nite;
    END
    IF (conc_otroconc = 'S') THEN
    BEGIN
    anosum = CAST(ano AS INTEGER);
    anosum = anosum - 1;
    SELECT SUM (noco_valor) FROM nomina_conceptos n WHERE n.noco_ano = :anosum AND n.conc_cod = :conc_codotroconc AND N.terc_nit = :nite INTO :valor;
    SELECT NOCO_VALOR FROM NOMINA_CONCEPTOS WHERE noco_ano = :anosum AND conc_cod = :conc_codotroconc AND terc_nit = :nite AND NOCO_PERIODO = 0 INTO :saldosini;
    IF (saldosini IS NULL) THEN
    saldosini = 0;
    ELSE
    UPDATE nomina_conceptos SET noco_pagook = 'S' WHERE noco_ano = :anosum AND conc_cod = :conc_codotroconc AND NOCO_PERIODO = 0 AND terc_nit = :nite;
    VALOR = :valor + :saldosini;
    UPDATE nomina_conceptos SET noco_pagook = 'S' WHERE noco_ano = :anosum AND conc_cod = :conc_codotroconc AND terc_nit = :nite;
    END
/*SI EL CONCEPTO ES UN APORTE*/
IF (conc_aporte = 'S') THEN
BEGIN
    horasex = null;
    diasnov = null;
    IF ((:entidad = '' ) OR (entidad IS NULL)) THEN
    BEGIN
     SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
    IF (comision IS NULL) THEN
     comision = 0;
     SELECT C.emco_monto FROM EMPLEADO_CONCEPTOS C WHERE C.terc_nit = :nite AND C.conc_cod = 933 INTO :retroact;
     if (retroact IS NULL ) then
     retroact = 0;
     valor = :basico + :comision + :horasex + :retroact;
     select n.nono_dura from nomina_novedades n where n.terc_nit = :nite and n.tnov_cod = 6 and n.nono_periodo = :periodo and n.nono_ano = :ano into :diasnov;
     if (diasnov is null) then
     diasnov = 0;
     if ((diasnov is not null) and (diasnov <> 0)) then
     diaslab = :diaslab - :diasnov;
    IF ((conc_cod = 904) OR (conc_cod = 905) OR (conc_cod = 906)) THEN
            BEGIN
            entidad = :nitafp;
                IF (conc_cod = 904) THEN
                BEGIN
                SELECT A.paan_afptr FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                SELECT c.noex_monto FROM nomina_horasext c WHERE c.noex_ano = :ano AND c.noex_periodio = :periodo AND c.noex_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :horasex;
                if (horasex is not null) then
                VALOR = (((((:basico )/30 * :diaslab ) + :comision + :horasex + :retroact)+ :cambsaltrans) * :PORCEN) /100;
                else
                VALOR = (((((:basico )/30 * :diaslab ) + :comision + :retroact)+ :cambsaltrans) * :PORCEN) /100;
                END
                ELSE
                IF ((conc_cod = 905) OR (conc_cod = 906)) THEN
                BEGIN
                SELECT A.paan_afpem FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                SELECT c.noex_monto FROM nomina_horasext c WHERE c.noex_ano = :ano AND c.noex_periodio = :periodo AND c.noex_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :horasex;
                if (horasex is not null) then
                VALOR = (((((:basico )/30 * :diaslab ) + :comision + :horasex + :retroact)+ :cambsaltrans) * :PORCEN) /100;
                else
                VALOR = (((((:basico )/30 * :diaslab ) + :comision + :retroact)+ :cambsaltrans) * :PORCEN) /100;
                END
            END
            ELSE
       IF ((conc_cod = 907) OR (conc_cod = 914) OR (conc_cod = 915)) THEN
            BEGIN
            entidad = :niteps;
                IF (conc_cod = 907) THEN
                BEGIN
                SELECT A.paan_epstr FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                SELECT c.noex_monto FROM nomina_horasext c WHERE c.noex_ano = :ano AND c.noex_periodio = :periodo AND c.noex_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :horasex;
                if (horasex is not null) then
                VALOR = (((((:basico )/30 * :diaslab ) + :comision + :horasex + :retroact)+ :cambsaltrans) * :PORCEN) /100;
                else
                VALOR = (((((:basico )/30 * :diaslab ) + :comision + :retroact)+ :cambsaltrans) * :PORCEN) /100;
                END
                ELSE
                IF ((conc_cod = 914) OR (conc_cod = 915)) THEN
                BEGIN
                SELECT A.paan_epsem FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                SELECT c.noex_monto FROM nomina_horasext c WHERE c.noex_ano = :ano AND c.noex_periodio = :periodo AND c.noex_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :horasex;
                if (horasex is not null) then
                VALOR = (((((:basico )/30 * :diaslab ) + :comision + :horasex + :retroact)+ :cambsaltrans) * :PORCEN) /100;
                else
                VALOR = (((((:basico )/30 * :diaslab ) + :comision + :retroact)+ :cambsaltrans) * :PORCEN) /100;
                END
            END
            ELSE
       IF ((conc_cod = 910) OR (conc_cod = 911) OR (conc_cod = 916) OR (conc_cod = 917) OR (conc_cod = 918) OR (conc_cod = 919)) THEN
            BEGIN
            entidad = :nitccf;
            SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
            IF (comision IS NULL) THEN
            comision = 0;
                IF ((conc_cod = 910) OR (conc_cod = 911) ) THEN
                BEGIN
                SELECT A.paan_ccf FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                SELECT c.noex_monto FROM nomina_horasext c WHERE c.noex_ano = :ano AND c.noex_periodio = :periodo AND c.noex_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :horasex;
                if (horasex is not null) then
                VALOR = (((((:basico )/30 * :diaslab ) + :comision + :horasex + :retroact)+ :cambsaltrans) * :PORCEN) /100;
                else
                VALOR = (((((:basico )/30 * :diaslab ) + :comision + :retroact /*+ :horasex*/)+ :cambsaltrans) * :PORCEN) /100;
                END
                ELSE
                IF ((conc_cod = 916) OR (conc_cod = 917)) THEN
                BEGIN
                SELECT A.paan_icbf FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                SELECT c.noex_monto FROM nomina_horasext c WHERE c.noex_ano = :ano AND c.noex_periodio = :periodo AND c.noex_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :horasex;
                if (horasex is not null) then
                VALOR = (((((:basico )/30 * :diaslab ) + :comision + :horasex + :retroact)+ :cambsaltrans) * :PORCEN) /100;
                else
                VALOR = (((((:basico )/30 * :diaslab ) + :comision + :retroact/*+ :horasex*/)+ :cambsaltrans) * :PORCEN) /100;
                END
                ELSE
                IF ((conc_cod = 918) OR (conc_cod = 919)) THEN
                BEGIN
                SELECT A.paan_sena FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                SELECT c.noex_monto FROM nomina_horasext c WHERE c.noex_ano = :ano AND c.noex_periodio = :periodo AND c.noex_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :horasex;
                if (horasex is not null) then
                VALOR = (((((:basico )/30 * :diaslab ) + :comision + :horasex + :retroact)+ :cambsaltrans) * :PORCEN) /100;
                else
                VALOR = (((((:basico )/30 * :diaslab ) + :comision + :retroact/*+ :horasex*/)+ :cambsaltrans) * :PORCEN) /100;
                END
            END
            ELSE
        IF ((conc_cod = 912) OR (conc_cod = 913)) THEN
            BEGIN
            entidad = :nitafc;
            SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
            IF (comision IS NULL) THEN
            comision = 0;
                IF ((conc_cod = 912) OR (conc_cod = 913) ) THEN
                BEGIN
                SELECT A.paan_cesemp FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                SELECT c.noex_monto FROM nomina_horasext c WHERE c.noex_ano = :ano AND c.noex_periodio = :periodo AND c.noex_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :horasex;
                if (horasex is not null) then
                VALOR = (((((:basico )/30 * :diaslab ) + :comision + :horasex + :retroact)+ :cambsaltrans) * :PORCEN) /100;
                else
                VALOR = (((((:basico )/30 * :diaslab ) + :comision + :retroact/*+ :horasex*/)+ :cambsaltrans) * :PORCEN) /100;
                END
            END
            ELSE
        BEGIN
        IF (comision IS NULL) THEN
        comision = 0;
        SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
        conc_monto = :basico + :comision;
        IF (conc_porc <> 0 AND conc_porc IS NOT NULL) THEN
        VALOR = (((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans) * :conc_porc) /100;
        ELSE
        IF (:porcen <> 0 AND :porcen IS NOT NULL) THEN
        VALOR = (((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans) * :porcen) /100;
        ELSE
        IF (:montos <> 0 AND :montos IS NOT NULL) THEN
        valor = :montos;
        ELSE
        IF (:conc_monto <> 0 AND :conc_monto IS NOT NULL) THEN
        valor = :conc_monto;
        END
    END
    END
    ELSE
    IF (conc_prov = 'S') THEN
    BEGIN
        conc_monto = :basico;
        IF (conc_porc <> 0 AND conc_porc IS NOT NULL) THEN
        VALOR = (((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans) * :conc_porc) /100;
        ELSE
        IF (porcen <> 0 AND porcen IS NOT NULL) THEN
        VALOR = (((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans) * :porcen) /100;
        ELSE
        IF (montos <> 0 AND montos IS NOT NULL) THEN
        VALOR = :montos;
        ELSE
        IF (conc_monto <> 0 AND conc_monto IS NOT NULL) THEN
        VALOR = :conc_monto;
    END
item = :item + 1;
END
 IF (conc_cod = 920) THEN
 BEGIN
 SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :valor;
 IF (valor IS NULL) THEN
 valor = 0;
 item = :item + 1;
 END
 ELSE
 if (conc_cod = 900 or (:conc_cod = 931)) then
 BEGIN
 SELECT c.noex_monto FROM nomina_horasext c WHERE c.noex_ano = :ano AND c.noex_periodio = :periodo AND c.noex_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :valor;
 IF (valor IS NULL) THEN
 valor = 0;
 item = :item + 1;
 END
 ELSE
 if (conc_cod = 932) then
 BEGIN
 select N.nono_dura FROM NOMINA_NOVEDADES N WHERE N.terc_nit = :nite AND N.nono_periodo = :periodo AND N.nono_ano = :ano INTO :diasnov;
 if (:diasnov IS NULL) then
 valor = 0;
 else
 valor = (:basico / 30)* :diasnov;
 END
    EXECUTE PROCEDURE LEE_CONFIGURACION('NOMINA','GENERAL','REDONDEO AL MULTIPLO DE DIEZ EN TOTALES')RETURNING_VALUES(:aprox);
    EXECUTE PROCEDURE REDONDEE(:valor, :aprox) RETURNING_VALUES (VALOR);
    IF ((mensual = 'N') OR (periodicidad = 1))  THEN
    INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
    VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
    ELSE
    IF (mensual = 'S') THEN
    BEGIN
         IF ((:periodicidad = 2) AND (liquidaper = 1)) THEN
         BEGIN
          IF ((periodo = 1) OR (periodo = 3) OR (periodo = 5) OR (periodo = 7) OR (periodo = 9) OR (periodo = 11)
          OR (periodo = 13) OR (periodo = 15) OR (periodo = 17) OR (periodo = 19) OR (periodo = 21) OR (periodo = 23)) THEN
             INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
             VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
         END
         ELSE
         IF ((:periodicidad = 2) AND (liquidaper = 2)) THEN
         BEGIN
          IF ((periodo = 2) OR (periodo = 4) OR (periodo = 6) OR (periodo = 8) OR (periodo = 10) OR (periodo = 12)
          OR (periodo = 14) OR (periodo = 16) OR (periodo = 18) OR (periodo = 20) OR (periodo = 22) OR (periodo = 24)) THEN
             INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
             VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
         END
         ELSE
         IF ((:periodicidad = 3) AND (liquidaper = 1)) THEN
         BEGIN
          IF ((periodo = 1) OR (periodo = 5) OR (periodo = 9) OR (periodo = 13) OR (periodo = 17) OR (periodo = 21)
          OR (periodo = 25) OR (periodo = 29) OR (periodo = 33) OR (periodo = 37) OR (periodo = 41) OR (periodo = 45)
          OR (periodo = 49)) THEN
             INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
             VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
         END
         ELSE
         IF ((:periodicidad = 3) AND (liquidaper = 2)) THEN
         BEGIN
          IF ((periodo = 2) OR (periodo = 6) OR (periodo = 10) OR (periodo = 14) OR (periodo = 18) OR (periodo = 22)
          OR (periodo = 26) OR (periodo = 30) OR (periodo = 34) OR (periodo = 38) OR (periodo = 42) OR (periodo = 46)
          OR (periodo = 50)) THEN
            INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
             VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
         END
         ELSE
         IF ((:periodicidad = 3) AND (liquidaper = 3)) THEN
         BEGIN
          IF ((periodo = 3) OR (periodo = 7) OR (periodo = 11) OR (periodo = 15) OR (periodo = 19) OR (periodo = 23)
          OR (periodo = 27) OR (periodo = 31) OR (periodo = 35) OR (periodo = 39) OR (periodo = 43) OR (periodo = 47)
          OR (periodo = 51)) THEN
            INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
             VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
         END
         ELSE
         IF ((:periodicidad = 3) AND (liquidaper = 4)) THEN
         BEGIN
          IF ((periodo = 4) OR (periodo = 8) OR (periodo = 12) OR (periodo = 16) OR (periodo = 20) OR (periodo = 24)
          OR (periodo = 29) OR (periodo = 32) OR (periodo = 36) OR (periodo = 40) OR (periodo = 44) OR (periodo = 48)
          OR (periodo = 52)) THEN
            INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
             VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
         END
    END
  END
 END
END
SUSPEND;
END
^

SET TERM ; ^

UPDATE CONCEPTOS_NOMINA
SET CONC_NOMBRE = 'AFP TRABAJADOR',
    CONC_DIAS = 'S'
WHERE (CONC_COD = 904);


UPDATE CONCEPTOS_NOMINA
SET CONC_NOMBRE = 'EPS TRABAJADOR',
    CONC_DIAS = 'S'
WHERE (CONC_COD = 907);

INSERT INTO TERCEROS (TERC_NIT, TERC_NOM, TERC_DIR, TERC_CIU, TERC_TEL, TERC_CONTACTO, TERC_OBS, TERC_EMAIL, TERC_FAX, TERC_CEL, TERC_CLIE, TERC_PROV, TERC_EMPL, TERC_CTARTFTE, TERC_CTARTIVA, TERC_CTARTICA, TERC_CTAVENTA, TERC_CTACLIENTE, TERC_CTAPROV, TERC_CTAEMPL, TERC_DV, CIUD_COD, TERC_TIPOID, TERC_USUARIO, TERC_APELLIDO1, TERC_APELLIDO2, TERC_NOMBRE1, TERC_NOMBRE2, TERC_EXENTO, TERC_ANIV, TERC_ESTADO, TERC_ADMINI) VALUES ('800088702', 'SUSALUD', 'AVENIA DORADO No. 68B-85 PISO 6', '11001', '6078787', NULL, NULL, NULL, NULL, NULL, 'N', 'N', 'N', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'J', NULL, NULL, NULL, NULL, NULL, 'N', NULL, 'S', 'S');
INSERT INTO TERCEROS (TERC_NIT, TERC_NOM, TERC_DIR, TERC_CIU, TERC_TEL, TERC_CONTACTO, TERC_OBS, TERC_EMAIL, TERC_FAX, TERC_CEL, TERC_CLIE, TERC_PROV, TERC_EMPL, TERC_CTARTFTE, TERC_CTARTIVA, TERC_CTARTICA, TERC_CTAVENTA, TERC_CTACLIENTE, TERC_CTAPROV, TERC_CTAEMPL, TERC_DV, CIUD_COD, TERC_TIPOID, TERC_USUARIO, TERC_APELLIDO1, TERC_APELLIDO2, TERC_NOMBRE1, TERC_NOMBRE2, TERC_EXENTO, TERC_ANIV, TERC_ESTADO, TERC_ADMINI) VALUES ('800130907', 'SALUD TOTAL S.A.', 'CARRERA 16 # 40-45', '11001', '4854555', NULL, NULL, NULL, NULL, NULL, 'N', 'N', 'N', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'J', NULL, NULL, NULL, NULL, NULL, 'N', NULL, 'S', 'S');
INSERT INTO TERCEROS (TERC_NIT, TERC_NOM, TERC_DIR, TERC_CIU, TERC_TEL, TERC_CONTACTO, TERC_OBS, TERC_EMAIL, TERC_FAX, TERC_CEL, TERC_CLIE, TERC_PROV, TERC_EMPL, TERC_CTARTFTE, TERC_CTARTIVA, TERC_CTARTICA, TERC_CTAVENTA, TERC_CTACLIENTE, TERC_CTAPROV, TERC_CTAEMPL, TERC_DV, CIUD_COD, TERC_TIPOID, TERC_USUARIO, TERC_APELLIDO1, TERC_APELLIDO2, TERC_NOMBRE1, TERC_NOMBRE2, TERC_EXENTO, TERC_ANIV, TERC_ESTADO, TERC_ADMINI) VALUES ('800224808', 'PORVENIR', 'CARRERA 13 # 25-75 / CARRERA 13 # 53-95', 'BOGOTÁ - Bogotá D.C', '4048888', NULL, NULL, NULL, NULL, NULL, 'N', 'N', 'N', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '11001', 'J', 'SYSDBA', NULL, NULL, NULL, NULL, 'N', NULL, 'S', 'S');
INSERT INTO TERCEROS (TERC_NIT, TERC_NOM, TERC_DIR, TERC_CIU, TERC_TEL, TERC_CONTACTO, TERC_OBS, TERC_EMAIL, TERC_FAX, TERC_CEL, TERC_CLIE, TERC_PROV, TERC_EMPL, TERC_CTARTFTE, TERC_CTARTIVA, TERC_CTARTICA, TERC_CTAVENTA, TERC_CTACLIENTE, TERC_CTAPROV, TERC_CTAEMPL, TERC_DV, CIUD_COD, TERC_TIPOID, TERC_USUARIO, TERC_APELLIDO1, TERC_APELLIDO2, TERC_NOMBRE1, TERC_NOMBRE2, TERC_EXENTO, TERC_ANIV, TERC_ESTADO, TERC_ADMINI) VALUES ('800224827', 'ING FONDO DE PENSIONES OBLIGATORIAS', 'AVENIDA  CALLE  82 # 10-47 LOCAL 5', 'BOGOTÁ - Bogotá D.C', '5942666', NULL, NULL, NULL, NULL, NULL, 'N', 'N', 'N', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '11001', 'J', 'SYSDBA', NULL, NULL, NULL, NULL, 'N', NULL, 'S', 'S');
INSERT INTO TERCEROS (TERC_NIT, TERC_NOM, TERC_DIR, TERC_CIU, TERC_TEL, TERC_CONTACTO, TERC_OBS, TERC_EMAIL, TERC_FAX, TERC_CEL, TERC_CLIE, TERC_PROV, TERC_EMPL, TERC_CTARTFTE, TERC_CTARTIVA, TERC_CTARTICA, TERC_CTAVENTA, TERC_CTACLIENTE, TERC_CTAPROV, TERC_CTAEMPL, TERC_DV, CIUD_COD, TERC_TIPOID, TERC_USUARIO, TERC_APELLIDO1, TERC_APELLIDO2, TERC_NOMBRE1, TERC_NOMBRE2, TERC_EXENTO, TERC_ANIV, TERC_ESTADO, TERC_ADMINI) VALUES ('800227940', 'COLFONDOS', ' CARRERA   67# 7-96', 'USIACURÍ - Atlántico', '669500', NULL, NULL, NULL, NULL, NULL, 'N', 'N', 'N', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '08849', 'J', 'SYSDBA', NULL, NULL, NULL, NULL, 'N', NULL, 'S', 'S');
INSERT INTO TERCEROS (TERC_NIT, TERC_NOM, TERC_DIR, TERC_CIU, TERC_TEL, TERC_CONTACTO, TERC_OBS, TERC_EMAIL, TERC_FAX, TERC_CEL, TERC_CLIE, TERC_PROV, TERC_EMPL, TERC_CTARTFTE, TERC_CTARTIVA, TERC_CTARTICA, TERC_CTAVENTA, TERC_CTACLIENTE, TERC_CTAPROV, TERC_CTAEMPL, TERC_DV, CIUD_COD, TERC_TIPOID, TERC_USUARIO, TERC_APELLIDO1, TERC_APELLIDO2, TERC_NOMBRE1, TERC_NOMBRE2, TERC_EXENTO, TERC_ANIV, TERC_ESTADO, TERC_ADMINI) VALUES ('800229739', 'PENSIONES Y CESANTIAS PROTECCION', 'CALLE  17 # 25-22', 'BOGOTÁ - Bogotá D.C', '3442100', NULL, NULL, NULL, NULL, NULL, 'N', 'N', 'N', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '11001', 'J', 'SYSDBA', NULL, NULL, NULL, NULL, 'N', NULL, 'S', 'S');
INSERT INTO TERCEROS (TERC_NIT, TERC_NOM, TERC_DIR, TERC_CIU, TERC_TEL, TERC_CONTACTO, TERC_OBS, TERC_EMAIL, TERC_FAX, TERC_CEL, TERC_CLIE, TERC_PROV, TERC_EMPL, TERC_CTARTFTE, TERC_CTARTIVA, TERC_CTARTICA, TERC_CTAVENTA, TERC_CTACLIENTE, TERC_CTAPROV, TERC_CTAEMPL, TERC_DV, CIUD_COD, TERC_TIPOID, TERC_USUARIO, TERC_APELLIDO1, TERC_APELLIDO2, TERC_NOMBRE1, TERC_NOMBRE2, TERC_EXENTO, TERC_ANIV, TERC_ESTADO, TERC_ADMINI) VALUES ('800250119', 'ENTIDAD PROM DE SALUD ORG. COOPERATIVO SALUDCOOP', 'AVENIDA CARRERA 68 No. 13-71', '11001', '6511000', NULL, NULL, NULL, NULL, NULL, 'N', 'N', 'N', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'J', NULL, NULL, NULL, NULL, NULL, 'N', NULL, 'S', 'S');
INSERT INTO TERCEROS (TERC_NIT, TERC_NOM, TERC_DIR, TERC_CIU, TERC_TEL, TERC_CONTACTO, TERC_OBS, TERC_EMAIL, TERC_FAX, TERC_CEL, TERC_CLIE, TERC_PROV, TERC_EMPL, TERC_CTARTFTE, TERC_CTARTIVA, TERC_CTARTICA, TERC_CTAVENTA, TERC_CTACLIENTE, TERC_CTAPROV, TERC_CTAEMPL, TERC_DV, CIUD_COD, TERC_TIPOID, TERC_USUARIO, TERC_APELLIDO1, TERC_APELLIDO2, TERC_NOMBRE1, TERC_NOMBRE2, TERC_EXENTO, TERC_ANIV, TERC_ESTADO, TERC_ADMINI) VALUES ('800251440', 'ENTIDAD PROMOTORA DE SALUD SANITAS S.A.', 'AUTOPISTA NORTE # 124-02', '11001', '3759000', NULL, NULL, NULL, NULL, NULL, 'N', 'N', 'N', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'J', NULL, NULL, NULL, NULL, NULL, 'N', NULL, 'S', 'S');
INSERT INTO TERCEROS (TERC_NIT, TERC_NOM, TERC_DIR, TERC_CIU, TERC_TEL, TERC_CONTACTO, TERC_OBS, TERC_EMAIL, TERC_FAX, TERC_CEL, TERC_CLIE, TERC_PROV, TERC_EMPL, TERC_CTARTFTE, TERC_CTARTIVA, TERC_CTARTICA, TERC_CTAVENTA, TERC_CTACLIENTE, TERC_CTAPROV, TERC_CTAEMPL, TERC_DV, CIUD_COD, TERC_TIPOID, TERC_USUARIO, TERC_APELLIDO1, TERC_APELLIDO2, TERC_NOMBRE1, TERC_NOMBRE2, TERC_EXENTO, TERC_ANIV, TERC_ESTADO, TERC_ADMINI) VALUES ('805000427', 'COOMEVA EPS', '  AV CALLE 80 # 92-27', '11001', '4465444', NULL, NULL, NULL, NULL, NULL, 'N', 'N', 'N', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'J', NULL, NULL, NULL, NULL, NULL, 'N', NULL, 'S', 'S');
INSERT INTO TERCEROS (TERC_NIT, TERC_NOM, TERC_DIR, TERC_CIU, TERC_TEL, TERC_CONTACTO, TERC_OBS, TERC_EMAIL, TERC_FAX, TERC_CEL, TERC_CLIE, TERC_PROV, TERC_EMPL, TERC_CTARTFTE, TERC_CTARTIVA, TERC_CTARTICA, TERC_CTAVENTA, TERC_CTACLIENTE, TERC_CTAPROV, TERC_CTAEMPL, TERC_DV, CIUD_COD, TERC_TIPOID, TERC_USUARIO, TERC_APELLIDO1, TERC_APELLIDO2, TERC_NOMBRE1, TERC_NOMBRE2, TERC_EXENTO, TERC_ANIV, TERC_ESTADO, TERC_ADMINI) VALUES ('830003564', 'EPS FAMISANAR  LIMITADA CAFAM-COLSUBSIDIO', 'CARRERA 13 A # 77-6', '11001', '4446660', NULL, NULL, NULL, NULL, NULL, 'N', 'N', 'N', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'J', NULL, NULL, NULL, NULL, NULL, 'N', NULL, 'S', 'S');
INSERT INTO TERCEROS (TERC_NIT, TERC_NOM, TERC_DIR, TERC_CIU, TERC_TEL, TERC_CONTACTO, TERC_OBS, TERC_EMAIL, TERC_FAX, TERC_CEL, TERC_CLIE, TERC_PROV, TERC_EMPL, TERC_CTARTFTE, TERC_CTARTIVA, TERC_CTARTICA, TERC_CTAVENTA, TERC_CTACLIENTE, TERC_CTAPROV, TERC_CTAEMPL, TERC_DV, CIUD_COD, TERC_TIPOID, TERC_USUARIO, TERC_APELLIDO1, TERC_APELLIDO2, TERC_NOMBRE1, TERC_NOMBRE2, TERC_EXENTO, TERC_ANIV, TERC_ESTADO, TERC_ADMINI) VALUES ('860013816', 'INSTITUTO DE SEGUROS SOCIALES I.S.S. PENSIONES', 'CARRERA 13 # 27-00 PISO 3', 'BOGOTÁ - Bogotá D.C', '3437313', NULL, NULL, NULL, NULL, NULL, 'N', 'N', 'N', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '11001', 'J', 'SYSDBA', NULL, NULL, NULL, NULL, 'N', NULL, 'S', 'S');
INSERT INTO TERCEROS (TERC_NIT, TERC_NOM, TERC_DIR, TERC_CIU, TERC_TEL, TERC_CONTACTO, TERC_OBS, TERC_EMAIL, TERC_FAX, TERC_CEL, TERC_CLIE, TERC_PROV, TERC_EMPL, TERC_CTARTFTE, TERC_CTARTIVA, TERC_CTARTICA, TERC_CTAVENTA, TERC_CTACLIENTE, TERC_CTAPROV, TERC_CTAEMPL, TERC_DV, CIUD_COD, TERC_TIPOID, TERC_USUARIO, TERC_APELLIDO1, TERC_APELLIDO2, TERC_NOMBRE1, TERC_NOMBRE2, TERC_EXENTO, TERC_ANIV, TERC_ESTADO, TERC_ADMINI) VALUES ('860066942', 'COMPENSAR ENTIDAD PROMOTORA DE SALUD', 'AVENIDA 68 # 49A -47', 'BOGOTÁ - Bogotá D.C', '3077001', NULL, NULL, NULL, NULL, NULL, 'N', 'N', 'N', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '11001', 'J', 'SYSDBA', NULL, NULL, NULL, NULL, 'N', NULL, 'S', 'S');
INSERT INTO TERCEROS (TERC_NIT, TERC_NOM, TERC_DIR, TERC_CIU, TERC_TEL, TERC_CONTACTO, TERC_OBS, TERC_EMAIL, TERC_FAX, TERC_CEL, TERC_CLIE, TERC_PROV, TERC_EMPL, TERC_CTARTFTE, TERC_CTARTIVA, TERC_CTARTICA, TERC_CTAVENTA, TERC_CTACLIENTE, TERC_CTAPROV, TERC_CTAEMPL, TERC_DV, CIUD_COD, TERC_TIPOID, TERC_USUARIO, TERC_APELLIDO1, TERC_APELLIDO2, TERC_NOMBRE1, TERC_NOMBRE2, TERC_EXENTO, TERC_ANIV, TERC_ESTADO, TERC_ADMINI) VALUES ('899999034', 'SENA', 'CARRERA 8 No. 8-69 TORRE CENTRAL PISO 6', '11001', '5461500', NULL, NULL, NULL, NULL, NULL, 'N', 'N', 'N', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'J', NULL, NULL, NULL, NULL, NULL, 'N', NULL, 'S', 'S');

COMMIT WORK;

INSERT INTO ADMINISTRADORA (ADMI_EPS, ADMI_ARP, ADMI_AFP, ADMI_CCF, ADMI_INTDIA, ADMI_COD, ADMI_CTACXP, TERC_NIT, ADMI_AFC, ADMI_CODARP, ADMI_CODEPS, ADMI_CODAFP, ADMI_CODAFC, ADMI_CODCCF) VALUES ('S', 'N', 'N', 'N', NULL, '', NULL, '800088702', 'N', NULL, 'EPS010', NULL, NULL, NULL);
INSERT INTO ADMINISTRADORA (ADMI_EPS, ADMI_ARP, ADMI_AFP, ADMI_CCF, ADMI_INTDIA, ADMI_COD, ADMI_CTACXP, TERC_NIT, ADMI_AFC, ADMI_CODARP, ADMI_CODEPS, ADMI_CODAFP, ADMI_CODAFC, ADMI_CODCCF) VALUES ('S', 'N', 'N', 'N', NULL, '', NULL, '800130907', 'N', NULL, 'EPS002', NULL, NULL, NULL);
INSERT INTO ADMINISTRADORA (ADMI_EPS, ADMI_ARP, ADMI_AFP, ADMI_CCF, ADMI_INTDIA, ADMI_COD, ADMI_CTACXP, TERC_NIT, ADMI_AFC, ADMI_CODARP, ADMI_CODEPS, ADMI_CODAFP, ADMI_CODAFC, ADMI_CODCCF) VALUES ('N', 'N', 'S', 'N', NULL, '', NULL, '800224808', 'N', NULL, NULL, '230301', NULL, NULL);
INSERT INTO ADMINISTRADORA (ADMI_EPS, ADMI_ARP, ADMI_AFP, ADMI_CCF, ADMI_INTDIA, ADMI_COD, ADMI_CTACXP, TERC_NIT, ADMI_AFC, ADMI_CODARP, ADMI_CODEPS, ADMI_CODAFP, ADMI_CODAFC, ADMI_CODCCF) VALUES ('N', 'N', 'S', 'N', NULL, '', NULL, '800224827', 'N', NULL, NULL, '230801', NULL, NULL);
INSERT INTO ADMINISTRADORA (ADMI_EPS, ADMI_ARP, ADMI_AFP, ADMI_CCF, ADMI_INTDIA, ADMI_COD, ADMI_CTACXP, TERC_NIT, ADMI_AFC, ADMI_CODARP, ADMI_CODEPS, ADMI_CODAFP, ADMI_CODAFC, ADMI_CODCCF) VALUES ('N', 'N', 'S', 'N', NULL, '', NULL, '800227940', 'N', NULL, NULL, '231001', NULL, NULL);
INSERT INTO ADMINISTRADORA (ADMI_EPS, ADMI_ARP, ADMI_AFP, ADMI_CCF, ADMI_INTDIA, ADMI_COD, ADMI_CTACXP, TERC_NIT, ADMI_AFC, ADMI_CODARP, ADMI_CODEPS, ADMI_CODAFP, ADMI_CODAFC, ADMI_CODCCF) VALUES ('N', 'N', 'S', 'N', NULL, '', NULL, '800229739', 'N', NULL, NULL, '230201', NULL, NULL);
INSERT INTO ADMINISTRADORA (ADMI_EPS, ADMI_ARP, ADMI_AFP, ADMI_CCF, ADMI_INTDIA, ADMI_COD, ADMI_CTACXP, TERC_NIT, ADMI_AFC, ADMI_CODARP, ADMI_CODEPS, ADMI_CODAFP, ADMI_CODAFC, ADMI_CODCCF) VALUES ('S', 'N', 'N', 'N', NULL, '', NULL, '800250119', 'N', NULL, 'EPS013', NULL, NULL, NULL);
INSERT INTO ADMINISTRADORA (ADMI_EPS, ADMI_ARP, ADMI_AFP, ADMI_CCF, ADMI_INTDIA, ADMI_COD, ADMI_CTACXP, TERC_NIT, ADMI_AFC, ADMI_CODARP, ADMI_CODEPS, ADMI_CODAFP, ADMI_CODAFC, ADMI_CODCCF) VALUES ('S', 'N', 'N', 'N', NULL, '', NULL, '800251440', 'N', NULL, 'EPS005', NULL, NULL, NULL);
INSERT INTO ADMINISTRADORA (ADMI_EPS, ADMI_ARP, ADMI_AFP, ADMI_CCF, ADMI_INTDIA, ADMI_COD, ADMI_CTACXP, TERC_NIT, ADMI_AFC, ADMI_CODARP, ADMI_CODEPS, ADMI_CODAFP, ADMI_CODAFC, ADMI_CODCCF) VALUES ('S', 'N', 'N', 'N', 'M', '805000427', NULL, '805000427', 'N', NULL, NULL, NULL, NULL, NULL);
INSERT INTO ADMINISTRADORA (ADMI_EPS, ADMI_ARP, ADMI_AFP, ADMI_CCF, ADMI_INTDIA, ADMI_COD, ADMI_CTACXP, TERC_NIT, ADMI_AFC, ADMI_CODARP, ADMI_CODEPS, ADMI_CODAFP, ADMI_CODAFC, ADMI_CODCCF) VALUES ('S', 'N', 'N', 'N', NULL, '', NULL, '830003564', 'N', NULL, 'EPS017', NULL, NULL, NULL);
INSERT INTO ADMINISTRADORA (ADMI_EPS, ADMI_ARP, ADMI_AFP, ADMI_CCF, ADMI_INTDIA, ADMI_COD, ADMI_CTACXP, TERC_NIT, ADMI_AFC, ADMI_CODARP, ADMI_CODEPS, ADMI_CODAFP, ADMI_CODAFC, ADMI_CODCCF) VALUES ('S', 'S', 'S', 'N', NULL, '', NULL, '860013816', 'N', '123', NULL, '25-11', NULL, NULL);
INSERT INTO ADMINISTRADORA (ADMI_EPS, ADMI_ARP, ADMI_AFP, ADMI_CCF, ADMI_INTDIA, ADMI_COD, ADMI_CTACXP, TERC_NIT, ADMI_AFC, ADMI_CODARP, ADMI_CODEPS, ADMI_CODAFP, ADMI_CODAFC, ADMI_CODCCF) VALUES ('S', 'N', 'N', 'S', NULL, '', NULL, '860066942', 'N', NULL, 'EPS008', NULL, NULL, 'CCFCOM');
INSERT INTO ADMINISTRADORA (ADMI_EPS, ADMI_ARP, ADMI_AFP, ADMI_CCF, ADMI_INTDIA, ADMI_COD, ADMI_CTACXP, TERC_NIT, ADMI_AFC, ADMI_CODARP, ADMI_CODEPS, ADMI_CODAFP, ADMI_CODAFC, ADMI_CODCCF) VALUES ('N', 'N', 'N', 'N', NULL, '', NULL, '899999034', 'S', NULL, NULL, NULL, 'PASENA', NULL);

COMMIT WORK;

UPDATE NOMINA_CONCEPTOS NC SET NC.CONC_COD = 933 WHERE CONC_COD = 11;
UPDATE EMPLEADO_CONCEPTOS NC SET NC.CONC_COD = 933 WHERE CONC_COD = 11;
UPDATE CONCEPTOS_NOMINA NC SET NC.CONC_COD = 933 WHERE CONC_COD = 11;


INSERT INTO PARAMETROS_ANO (PAAN_ANO, PAAN_SALMINIMO, PAAN_AUXTR, PAAN_SENA, PAAN_ICBF, PAAN_CCF, PAAN_EPSTR, PAAN_EPSEM, PAAN_EPSFON, PAAN_AFPTR, PAAN_AFPEM, PAAN_AFPFON, PAAN_AFPSMF, PAAN_INTMORA, PAAN_ARP, PAAN_PEQAPOR, PAAN_HORASDI, PAAN_HORASNO, PAAN_HORASFD, PAAN_HORASFN, PAAN_TIPOAPORT, PAAN_NITARP, PAAN_CESEMP) VALUES ('2009', 469900, 59300, 2, 3, 4, 4, 8.5, NULL, 4, 11.625, NULL, NULL, NULL, NULL, 'N', 1.25, 1.75, 2.25, 2.75, 'B', NULL, 8.33);

SET TERM ^ ;

CREATE OR ALTER TRIGGER NOMINA_HORASEXT_BI FOR NOMINA_HORASEXT
ACTIVE BEFORE INSERT POSITION 0
as
begin
if (NEW.noex_diur <> 0 OR NEW.noex_fdiur <> 0 OR NEW.noex_noct <> 0 OR NEW.noex_fnoct <> 0) then
execute PROCEDURE liquida_horas_extra (NEW.terc_nit,NEW.noex_diur,NEW.noex_noct,NEW.noex_fdiur,NEW.noex_fnoct,NEW.noex_ano,'N')returning_values(NEW.noex_monto);
end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER NOMINA_HORASEXT_BU FOR NOMINA_HORASEXT
ACTIVE BEFORE UPDATE POSITION 0
as
begin
if (NEW.noex_diur <> 0 OR NEW.noex_fdiur <> 0 OR NEW.noex_noct <> 0 OR NEW.noex_fnoct <> 0) then
execute PROCEDURE liquida_horas_extra (NEW.terc_nit,NEW.noex_diur,NEW.noex_noct,NEW.noex_fdiur,NEW.noex_fnoct,NEW.noex_ano,'N')returning_values(NEW.noex_monto);
end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER EMPLEADO_CONCEPTOS_BI
ACTIVE BEFORE INSERT POSITION 0
as
begin
if (new.emco_monto is null) then
new.emco_monto = 0;
if (new.emco_porc is null) then
new.emco_porc = 0;
if (new.emco_tomsal is null) then
new.emco_tomsal = 0;
end
^

SET TERM ; ^

update RDB$RELATION_FIELDS set
RDB$FIELD_SOURCE = 'NIT'
where (RDB$FIELD_NAME = 'PGAP_ADMIN') and
(RDB$RELATION_NAME = 'PAGO_APORTES')
;

INSERT INTO PERIODO_PAGO_NOMBRE (PPAG_COD, PNOM_ITEM, PNOM_NOMBRE, PPAG_PERIODO) VALUES (2, 1, '1 al 15 enero', 1);
INSERT INTO PERIODO_PAGO_NOMBRE (PPAG_COD, PNOM_ITEM, PNOM_NOMBRE, PPAG_PERIODO) VALUES (2, 2, '16 al 31 enero', 2);
INSERT INTO PERIODO_PAGO_NOMBRE (PPAG_COD, PNOM_ITEM, PNOM_NOMBRE, PPAG_PERIODO) VALUES (2, 3, '1 al 15 febrero', 3);
INSERT INTO PERIODO_PAGO_NOMBRE (PPAG_COD, PNOM_ITEM, PNOM_NOMBRE, PPAG_PERIODO) VALUES (2, 4, '16 al 28 febrero', 4);
INSERT INTO PERIODO_PAGO_NOMBRE (PPAG_COD, PNOM_ITEM, PNOM_NOMBRE, PPAG_PERIODO) VALUES (2, 5, '1 al 15 marzo', 5);
INSERT INTO PERIODO_PAGO_NOMBRE (PPAG_COD, PNOM_ITEM, PNOM_NOMBRE, PPAG_PERIODO) VALUES (2, 6, '16 al 31 marzo', 6);
INSERT INTO PERIODO_PAGO_NOMBRE (PPAG_COD, PNOM_ITEM, PNOM_NOMBRE, PPAG_PERIODO) VALUES (2, 7, '1 al 15 abril', 7);
INSERT INTO PERIODO_PAGO_NOMBRE (PPAG_COD, PNOM_ITEM, PNOM_NOMBRE, PPAG_PERIODO) VALUES (2, 8, '16 al 30 abril', 8);
INSERT INTO PERIODO_PAGO_NOMBRE (PPAG_COD, PNOM_ITEM, PNOM_NOMBRE, PPAG_PERIODO) VALUES (2, 9, '1 al 15 mayo', 1);
INSERT INTO PERIODO_PAGO_NOMBRE (PPAG_COD, PNOM_ITEM, PNOM_NOMBRE, PPAG_PERIODO) VALUES (2, 10, '16 al 31 mayo', 2);
INSERT INTO PERIODO_PAGO_NOMBRE (PPAG_COD, PNOM_ITEM, PNOM_NOMBRE, PPAG_PERIODO) VALUES (2, 11, '1 al 15 junio', 3);
INSERT INTO PERIODO_PAGO_NOMBRE (PPAG_COD, PNOM_ITEM, PNOM_NOMBRE, PPAG_PERIODO) VALUES (2, 12, '16 al 28 junio', 4);
INSERT INTO PERIODO_PAGO_NOMBRE (PPAG_COD, PNOM_ITEM, PNOM_NOMBRE, PPAG_PERIODO) VALUES (2, 13, '1 al 15 julio', 5);
INSERT INTO PERIODO_PAGO_NOMBRE (PPAG_COD, PNOM_ITEM, PNOM_NOMBRE, PPAG_PERIODO) VALUES (2, 14, '16 al 31 julio', 6);
INSERT INTO PERIODO_PAGO_NOMBRE (PPAG_COD, PNOM_ITEM, PNOM_NOMBRE, PPAG_PERIODO) VALUES (2, 15, '1 al 15 agosto', 7);
INSERT INTO PERIODO_PAGO_NOMBRE (PPAG_COD, PNOM_ITEM, PNOM_NOMBRE, PPAG_PERIODO) VALUES (2, 16, '16 al 30 agosto', 8);
INSERT INTO PERIODO_PAGO_NOMBRE (PPAG_COD, PNOM_ITEM, PNOM_NOMBRE, PPAG_PERIODO) VALUES (2, 17, '1 al 15 septiembre', 1);
INSERT INTO PERIODO_PAGO_NOMBRE (PPAG_COD, PNOM_ITEM, PNOM_NOMBRE, PPAG_PERIODO) VALUES (2, 18, '16 al 31 septiembre', 2);
INSERT INTO PERIODO_PAGO_NOMBRE (PPAG_COD, PNOM_ITEM, PNOM_NOMBRE, PPAG_PERIODO) VALUES (2, 19, '1 al 15 octubre', 3);
INSERT INTO PERIODO_PAGO_NOMBRE (PPAG_COD, PNOM_ITEM, PNOM_NOMBRE, PPAG_PERIODO) VALUES (2, 20, '16 al 28 octubre', 4);
INSERT INTO PERIODO_PAGO_NOMBRE (PPAG_COD, PNOM_ITEM, PNOM_NOMBRE, PPAG_PERIODO) VALUES (2, 21, '1 al 15 noviembre', 5);
INSERT INTO PERIODO_PAGO_NOMBRE (PPAG_COD, PNOM_ITEM, PNOM_NOMBRE, PPAG_PERIODO) VALUES (2, 22, '16 al 31 noviembre', 6);
INSERT INTO PERIODO_PAGO_NOMBRE (PPAG_COD, PNOM_ITEM, PNOM_NOMBRE, PPAG_PERIODO) VALUES (2, 23, '1 al 15 diciembre', 7);
INSERT INTO PERIODO_PAGO_NOMBRE (PPAG_COD, PNOM_ITEM, PNOM_NOMBRE, PPAG_PERIODO) VALUES (2, 24, '16 al 30 diciembre', 8);

COMMIT WORK;

INSERT INTO PERIODO_PAGO_NOMBRE (PPAG_COD, PNOM_ITEM, PNOM_NOMBRE, PPAG_PERIODO) VALUES (1, 1, 'Enero', 1);
INSERT INTO PERIODO_PAGO_NOMBRE (PPAG_COD, PNOM_ITEM, PNOM_NOMBRE, PPAG_PERIODO) VALUES (1, 2, 'Febrero', 2);
INSERT INTO PERIODO_PAGO_NOMBRE (PPAG_COD, PNOM_ITEM, PNOM_NOMBRE, PPAG_PERIODO) VALUES (1, 3, 'Marzo', 3);
INSERT INTO PERIODO_PAGO_NOMBRE (PPAG_COD, PNOM_ITEM, PNOM_NOMBRE, PPAG_PERIODO) VALUES (1, 4, 'Abril', 4);
INSERT INTO PERIODO_PAGO_NOMBRE (PPAG_COD, PNOM_ITEM, PNOM_NOMBRE, PPAG_PERIODO) VALUES (1, 5, 'Mayo', 5);
INSERT INTO PERIODO_PAGO_NOMBRE (PPAG_COD, PNOM_ITEM, PNOM_NOMBRE, PPAG_PERIODO) VALUES (1, 6, 'Junio', 6);
INSERT INTO PERIODO_PAGO_NOMBRE (PPAG_COD, PNOM_ITEM, PNOM_NOMBRE, PPAG_PERIODO) VALUES (1, 7, 'Julio', 7);
INSERT INTO PERIODO_PAGO_NOMBRE (PPAG_COD, PNOM_ITEM, PNOM_NOMBRE, PPAG_PERIODO) VALUES (1, 8, 'Agosto', 8);
INSERT INTO PERIODO_PAGO_NOMBRE (PPAG_COD, PNOM_ITEM, PNOM_NOMBRE, PPAG_PERIODO) VALUES (1, 9, 'Septiembre', 9);
INSERT INTO PERIODO_PAGO_NOMBRE (PPAG_COD, PNOM_ITEM, PNOM_NOMBRE, PPAG_PERIODO) VALUES (1, 10, 'Octubre', 10);
INSERT INTO PERIODO_PAGO_NOMBRE (PPAG_COD, PNOM_ITEM, PNOM_NOMBRE, PPAG_PERIODO) VALUES (1, 11, 'Noviembre', 11);
INSERT INTO PERIODO_PAGO_NOMBRE (PPAG_COD, PNOM_ITEM, PNOM_NOMBRE, PPAG_PERIODO) VALUES (1, 12, 'Dciembre', 12);

COMMIT WORK;

UPDATE REVISION SET revi_nomina = '2009/02/03';
/*NOMINA 20090205*/

ALTER TABLE EMPLEADOS
ADD EMPL_CONTRANOS DATE;


INSERT INTO CONFIGURACION (CONF_MODULO, CONF_CATEGORIA, CONF_PROPIEDAD, CONF_VALOR, CONF_POSIBLES, CONF_AYUDA) VALUES ('NOMINA', 'EMPLEADO', 'DIAS PARA ANUNCIAR ALERTA DE CONTRATO', '45', NULL, 'Numero de dias antes de vencimiento de contrato para alerta');

SET TERM ^ ;

ALTER PROCEDURE IMPR_PLANILLA_NOMINA(
    ID INTEGER,
    PAGO CHAR(1),
    CTA CHAR(1),
    EMPL CHAR(1))
RETURNS (
    FECHA DATE,
    OBSERVACIONES BLOB SUB_TYPE 0 SEGMENT SIZE 80,
    PAGOGLOBAL CHAR(1),
    PERIODO INTEGER,
    ANO CHAR(4),
    PERIODICIDAD VARCHAR(60),
    NITEMPL VARCHAR(20),
    VALOR NUMERIC(18,2),
    DEDUC CHAR(1),
    NOMBREEMPL VARCHAR(60),
    NOMCORTCONC VARCHAR(60),
    NOMBRECONC VARCHAR(60),
    CODCONC INTEGER,
    PROV CHAR(1),
    TOTALEMPL NUMERIC(18,2),
    TOTALDEDUC NUMERIC(18,2),
    TOTALDEVENG NUMERIC(18,2),
    NUMEMPL INTEGER,
    CTAEMPL VARCHAR(25),
    TOTALCTAS NUMERIC(18,2),
    TOTALNOMI NUMERIC(18,2),
    TOTALAPOR NUMERIC(18,2),
    NOMPER VARCHAR(60),
    ORG INTEGER,
    CARGOEMPL VARCHAR(60),
    DEPTOEMPL VARCHAR(60),
    NUMCOP INTEGER,
    NOMBRE_COPIA VARCHAR(60))
AS
DECLARE VARIABLE NITANT VARCHAR(20);
DECLARE VARIABLE nitnue VARCHAR(20);
DECLARE VARIABLE NUMCONC INTEGER;
DECLARE VARIABLE TOTALNOMINEG NUMERIC(18,2);
DECLARE VARIABLE TOTALAPORNEG NUMERIC(18,2);
declare variable PAR INTEGER;
declare variable IMPAR INTEGER;
declare variable ANTDEDUC CHAR(1);
declare variable nitdeduc VARCHAR(20);
declare variable NITTOT VARCHAR(20);
BEGIN
SELECT N.nuco_copia FROM NUMERO_COPIA N WHERE N.tido_cod = 92 AND N.nuco_id = :id INTO :NUMCOP;
IF (numcop IS NULL) THEN
BEGIN
numcop = 0;
INSERT INTO NUMERO_COPIA (TIDO_COD, NUCO_ID, NUCO_COPIA) VALUES (92,:id,:numcop);
END
ELSE
BEGIN
numcop = :numcop + 1;
UPDATE numero_copia N SET N.nuco_copia = :numcop WHERE N.tido_cod = 92 AND N.nuco_id = :id;
END
SELECT N.noco_nombre FROM nombres_copias N WHERE N.noco_id = :numcop INTO :nombre_copia;
numempl = 0;
nitant = 0;
nitnue = 0;
IF (PAGO = 'N') THEN
BEGIN
FOR SELECT N.nomi_feccausa, N.nomi_obs, N.nomi_pagoglobal, N.nomi_periodo, N.nomi_ano, P.ppag_nombre, PN.pnom_nombre FROM NOMINA N, periodo_pago P, periodo_pago_nombre PN
 WHERE P.ppag_cod = N.nomi_periodocidad AND N.nomi_id = :ID AND PN.ppag_cod = N.nomi_periodocidad AND PN.ppag_periodo = N.nomi_periodo
 INTO :fecha, :observaciones, :pagoglobal, :periodo, :ano, :periodicidad, :NOMPER
 DO
 BEGIN
 FOR SELECT NC.terc_nit, NC.noco_valor, NC.noco_deduc, T.terc_nom, C.conc_nomcorto, C.conc_nombre, NC.conc_cod, NC.noco_prov, E.empl_cargo FROM NOMINA_CONCEPTOS NC, TERCEROS T, EMPLEADOS E, CONCEPTOS_NOMINA C
        WHERE NC.nomi_id = :ID AND T.terc_nit = E.terc_nit AND C.conc_cod = NC.conc_cod AND t.terc_nit = nc.terc_nit
      INTO :nitempl, :valor, :deduc, :nombreempl, :nomcortconc, :nombreconc, :codconc, :prov, :cargoempl
 DO
 BEGIN
 IF (valor IS NULL) THEN
 valor = 0;
 SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND TERC_NIT = :nitempl INTO :totalempl;
 SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND TERC_NIT = :nitempl AND NC.noco_deduc = 'S' INTO :totaldeduc;
 SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND TERC_NIT = :nitempl AND NC.noco_deduc = 'N' INTO :totaldeveng;
 SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id INTO :totalnomi;
 SELECT SUM(NC.noco_valor*-1) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_APORTE = 'S' AND NOCO_VALOR < 0 AND NOMI_ID = :id INTO :totalaporneg;
 SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_APORTE = 'S' AND NOCO_VALOR > 0 AND NOMI_ID = :id INTO :totalapor;
 totalapor = :totalapor + totalaporneg;
  SUSPEND;
 END
nitempl = '';
valor = NULL;
deduc = '';
nombreempl = NULL;
nomcortconc = NULL;
nombreconc = NULL;
codconc = NULL;
prov = NULL;
 FOR SELECT MAX(N.conc_cod) FROM NOMINA_CONCEPTOS N WHERE N.nomi_id = :id
 GROUP BY N.conc_cod
 INTO :codconc
 DO
 BEGIN
 SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC
 WHERE NC.nomi_id = :ID AND NC.conc_cod = :codconc
 GROUP BY NC.conc_cod
 INTO :valor;
 nitempl = '';
 nombreempl = '';
 deduc = 'N';
 prov = 'N';
 SELECT C.conc_nombre,C.conc_nomcorto FROM CONCEPTOS_NOMINA C WHERE C.conc_cod = :codconc INTO :nombreconc,:nomcortconc;
 SUSPEND;
 END
 END
END
ELSE
IF (PAGO = 'S') THEN
BEGIN
par = 2;
impar = 1;
FOR SELECT N.nomi_feccausa, N.nomi_obs, N.nomi_pagoglobal, N.nomi_periodo, N.nomi_ano, P.ppag_nombre, PN.pnom_nombre FROM NOMINA N, periodo_pago P, periodo_pago_nombre PN
 WHERE P.ppag_cod = N.nomi_periodocidad AND N.nomi_id = :ID AND PN.ppag_cod = N.nomi_periodocidad AND PN.ppag_periodo = N.nomi_periodo
 INTO :fecha, :observaciones, :pagoglobal, :periodo, :ano, :periodicidad, :NOMPER
 DO
 BEGIN
 FOR SELECT NC.terc_nit, NC.noco_valor, NC.noco_deduc, T.terc_nom, C.conc_nomcorto, C.conc_nombre, NC.conc_cod, NC.noco_prov, E.empl_cargo, D.dpto_nombre
     FROM NOMINA_CONCEPTOS NC, TERCEROS T, EMPLEADOS E, CONCEPTOS_NOMINA C, DEPARTAMENTO D
     WHERE NC.nomi_id = :ID AND T.terc_nit = E.terc_nit AND C.conc_cod = NC.conc_cod AND t.terc_nit = nc.terc_nit AND D.dpto_cod = E.empl_dpto AND NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N'
     ORDER BY NC.terc_nit
     INTO :nitempl, :valor, :deduc, :nombreempl, :nomcortconc, :nombreconc, :codconc, :prov, :cargoempl,:deptoempl
 DO
 BEGIN
 IF (valor IS NULL) THEN
 valor = 0;
 if (nitempl <> nitdeduc) then
 BEGIN
 par = 2;
 impar = 1;
 END
 nitdeduc = :nitempl;
 if (:deduc = 'S') then
 BEGIN
 antdeduc = 'S';
 org = :par;
 par = :par + 2;
 END
 ELSE
 BEGIN
 antdeduc = 'N';
 org = :impar;
 impar = :impar + 2;
 END
 SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND TERC_NIT = :nitempl INTO :totalempl;
 SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND TERC_NIT = :nitempl AND NC.noco_deduc = 'S' INTO :totaldeduc;
 SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND TERC_NIT = :nitempl AND NC.noco_deduc = 'N' INTO :totaldeveng;
 IF (cta = 'S') THEN
 BEGIN
 SELECT COUNT(CONC_COD) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND TERC_NIT = :nitempl INTO :numconc;
 totalempl = totalempl / :numconc;
 SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND TERC_NIT = :nitempl INTO :totalctas;
 END
 SELECT TERC_NIT, EMPL_CUENTA FROM EMPLEADOS WHERE TERC_NIT = :nitempl INTO :nitnue, :ctaempl;
 IF (nitnue IS NOT NULL) THEN
 BEGIN
 IF (nitnue <> nitant) THEN
 numempl = :numempl + 1;
 nitant = :nitnue;
 END
 SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id INTO :totalnomi;
 SELECT SUM(NC.noco_valor*-1) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_APORTE = 'S' AND NOCO_VALOR < 0 AND NOMI_ID = :id INTO :totalaporneg;
 SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_APORTE = 'S' AND NOCO_VALOR > 0 AND NOMI_ID = :id INTO :totalapor;
 totalapor = :totalapor + totalaporneg;
 SUSPEND;
 END
IF ( EMPL = 'N') THEN
BEGIN
nitempl = '';
valor = NULL;
deduc = '';
nombreempl = NULL;
nomcortconc = NULL;
nombreconc = NULL;
codconc = NULL;
prov = NULL;
totalempl = NULL;
ctaempl = NULL;
IF (cta = 'N') THEN
BEGIN
 FOR SELECT MAX(N.conc_cod) FROM NOMINA_CONCEPTOS N WHERE N.nomi_id = :id AND N.noco_prov = 'N' AND N.noco_gtoempr = 'N'
 GROUP BY N.conc_cod
 INTO :codconc
 DO
 BEGIN
 SELECT SUM(NC.noco_valor), MAX(NC.noco_deduc) FROM NOMINA_CONCEPTOS NC
 WHERE NC.nomi_id = :ID AND NC.conc_cod = :codconc
 GROUP BY NC.conc_cod
 INTO :valor, :deduc;
 nitempl = '';
 nombreempl = '';
 prov = 'N';
 SELECT C.conc_nombre,C.conc_nomcorto FROM CONCEPTOS_NOMINA C WHERE C.conc_cod = :codconc INTO :nombreconc,:nomcortconc;
 SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id INTO :totalempl;
 SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND NC.noco_deduc = 'S' INTO :totaldeduc;
 SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND NC.noco_deduc = 'N' INTO :totaldeveng;
 SUSPEND;
 END
 FOR SELECT E.TERC_NIT, T.TERC_NOM FROM empleados E, TERCEROS T
 WHERE EXISTS (SELECT C.TERC_NIT FROM NOMINA_CONCEPTOS C WHERE C.nomi_id = :id AND C.terc_nit = E.terc_nit) AND T.terc_nit = E.terc_nit
 INTO :nitempl, :nombreempl
 DO
 BEGIN
 deduc = 'N';
 nomcortconc = 'TOTAL DEV';
 nombreconc = 'TOTAL DEV';
 codconc = 9999;
 prov = 'N';
 SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND NC.terc_nit = :nitempl INTO :VALOR;
 SUSPEND;
 deduc = 'S';
 nomcortconc = 'TOTAL DEDUC';
 nombreconc = 'TOTAL DEDUC';
 codconc = 99999;
 prov = 'N';
 SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND NC.noco_deduc = 'S' AND NC.terc_nit = :nitempl INTO :VALOR;
 SUSPEND;
 deduc = 'S';
 nomcortconc = 'TOTAL EMPL';
 nombreconc = 'TOTAL EMPL';
 codconc = 999999;
 prov = 'N';
 SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND NC.noco_deduc = 'N' AND NC.terc_nit = : nitempl INTO :VALOR;
 SUSPEND;
 END
/*TOTALES*/
 deduc = 'N';
 nomcortconc = 'TOTAL DEV';
 nombreconc = 'TOTAL DEV';
 codconc = 9999;
 prov = 'N';
 SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id INTO :VALOR;
 nitempl = '';
 nombreempl = '';
 SUSPEND;
 deduc = 'S';
 nomcortconc = 'TOTAL DEDUC';
 nombreconc = 'TOTAL DEDUC';
 codconc = 99999;
 prov = 'N';
 SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND NC.noco_deduc = 'S' INTO :VALOR;
 nitempl = '';
 nombreempl = '';
 SUSPEND;
 deduc = 'S';
 nomcortconc = 'TOTAL EMPL';
 nombreconc = 'TOTAL EMPL';
 codconc = 999999;
 prov = 'N';
 SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND NC.noco_deduc = 'N' INTO :VALOR;
 nitempl = '';
 nombreempl = '';
 SUSPEND;
/*TOTALES*/
END
END
 END
END
END
^

SET TERM ; ^

/*20090209*/

ALTER TABLE EMPLEADOS
ADD EMPL_TIPOCONT CHAR(1);

/*20090210*/


CREATE TABLE VACACIONES_DISFRUT(
    TERC_NIT VARCHAR(20),
    VADI_ID INTEGER NOT NULL);
ALTER TABLE VACACIONES_DISFRUT
ADD CONSTRAINT PK_VACACIONES_DISFRUT
PRIMARY KEY (VADI_ID);

CREATE TABLE VACACIONES_DISFRUT_DET(
    VADI_ID INTEGER NOT NULL,
    VADE_ITEM INTEGER NOT NULL,
    VADI_PERDESDE ANO,
    VADI_PERHASTA ANO,
    VADI_DISFRUTADOS BOOLEANO);
ALTER TABLE VACACIONES_DISFRUT_DET
ADD CONSTRAINT PK_VACACIONES_DISFRUT_DET
PRIMARY KEY (VADI_ID,VADE_ITEM);

ALTER TABLE VACACIONES_DISFRUT_DET
ADD CONSTRAINT FK_VACACIONES_DISFRUT_DET_2
FOREIGN KEY (VADI_ID)
REFERENCES VACACIONES_DISFRUT(VADI_ID);

CREATE GENERATOR ID_DISFVACAC;

SET TERM ^ ;

CREATE OR ALTER PROCEDURE CAMBIE_ID_DISFVACAC
RETURNS (
    ID INTEGER)
AS
declare variable numrows integer;
BEGIN
/* TRAE EL ID NUEVO Y LO ACTUALIZA */
NUMROWS = 1;
while (NUMROWS > 0) DO
    BEGIN
    ID = GEN_ID(id_disfvacac, 1);
    /* VERIFIQUE SI YA EXISTE */
    SELECT COUNT(*) FROM VACACIONES_DISFRUT V WHERE V.vadi_id = :ID INTO :NUMROWS;
    END
SUSPEND;
END
^

SET TERM ; ^

/*20090211*/

SET TERM ^ ;

CREATE OR ALTER PROCEDURE ALERTAS_CONTRATO_EMPL(
    FEC DATE)
RETURNS (
    DIAS INTEGER,
    MENSAJE VARCHAR(60),
    EMPLNOM VARCHAR(60))
AS
DECLARE VARIABLE fecing DATE;
DECLARE VARIABLE confdias INTEGER;
BEGIN
FOR SELECT CAST(E.empl_contranos - :fec AS INTEGER), T.terc_nom FROM EMPLEADOS E, TERCEROS T
 WHERE T.terc_nit = E.terc_nit
 INTO :dias, :emplnom
DO
BEGIN
IF (dias IS NOT NULL) THEN
BEGIN
EXECUTE PROCEDURE LEE_CONFIGURACION ('NOMINA','EMPLEADO','DIAS PARA ANUNCIAR ALERTA DE CONTRATO')RETURNING_VALUES(:confdias);
IF ((dias <= :confdias) or (dias < 0))  THEN
BEGIN
if (dias < 0) then
BEGIN
mensaje = 'EL CONTRATO VENCIO HACE';
dias = :dias *(-1);
END
ELSE
BEGIN
IF (dias <= :confdias) THEN
mensaje = 'EL CONTRATO VENCE EN';
END
  SUSPEND;
END
END
END
END
^

SET TERM ; ^


/*20090212*/

ALTER TABLE EDUCACION_FORMAL_EMPLEADO
ADD NIVI_COD INTEGER;

/*20090213*/

SET TERM ^ ;

create trigger NOMINA_DETALLE_BI for NOMINA_DETALLE
active BEFORE INSERT position 0
as
declare variable PERIODO integer;
declare variable FEC DATE;
begin
SELECT N.nomi_periodo,N.nomi_feccausa FROM NOMINA N WHERE N.nomi_id = NEW.nomi_id INTO :periodo,:fec;
EXECUTE PROCEDURE DIAS_LABORADOS(NEW.terc_nit,:periodo,:fec,'N','N')returning_values(NEW.node_diaslab);
end
^

SET TERM ; ^

GRANT UPDATE,REFERENCES ON NOMINA_DETALLE TO TRIGGER NOMINA_DETALLE_BI;
GRANT SELECT ON NOMINA TO TRIGGER NOMINA_DETALLE_BI;
GRANT EXECUTE ON PROCEDURE DIAS_LABORADOS TO TRIGGER NOMINA_DETALLE_BI;

SET TERM ^ ;

CREATE OR ALTER PROCEDURE IMPR_PLANILLA_NOMINA(
    ID INTEGER,
    PAGO CHAR(1),
    CTA CHAR(1),
    EMPL CHAR(1))
RETURNS (
    FECHA DATE,
    OBSERVACIONES BLOB SUB_TYPE 0 SEGMENT SIZE 80,
    PAGOGLOBAL CHAR(1),
    PERIODO INTEGER,
    ANO CHAR(4),
    PERIODICIDAD VARCHAR(60),
    NITEMPL VARCHAR(20),
    VALOR NUMERIC(18,2),
    DEDUC CHAR(1),
    NOMBREEMPL VARCHAR(60),
    NOMCORTCONC VARCHAR(60),
    NOMBRECONC VARCHAR(60),
    CODCONC INTEGER,
    PROV CHAR(1),
    TOTALEMPL NUMERIC(18,2),
    TOTALDEDUC NUMERIC(18,2),
    TOTALDEVENG NUMERIC(18,2),
    NUMEMPL INTEGER,
    CTAEMPL VARCHAR(25),
    TOTALCTAS NUMERIC(18,2),
    TOTALNOMI NUMERIC(18,2),
    TOTALAPOR NUMERIC(18,2),
    NOMPER VARCHAR(60),
    ORG INTEGER,
    CARGOEMPL VARCHAR(60),
    DEPTOEMPL VARCHAR(60),
    NUMCOP INTEGER,
    NOMBRE_COPIA VARCHAR(60),
    DIASLAB INTEGER)
AS
DECLARE VARIABLE NITANT VARCHAR(20);
DECLARE VARIABLE nitnue VARCHAR(20);
DECLARE VARIABLE NUMCONC INTEGER;
DECLARE VARIABLE TOTALNOMINEG NUMERIC(18,2);
DECLARE VARIABLE TOTALAPORNEG NUMERIC(18,2);
declare variable PAR INTEGER;
declare variable IMPAR INTEGER;
declare variable ANTDEDUC CHAR(1);
declare variable nitdeduc VARCHAR(20);
declare variable NITTOT VARCHAR(20);
BEGIN
SELECT N.nuco_copia FROM NUMERO_COPIA N WHERE N.tido_cod = 92 AND N.nuco_id = :id INTO :NUMCOP;
IF (numcop IS NULL) THEN
BEGIN
numcop = 0;
INSERT INTO NUMERO_COPIA (TIDO_COD, NUCO_ID, NUCO_COPIA) VALUES (92,:id,:numcop);
END
ELSE
BEGIN
numcop = :numcop + 1;
UPDATE numero_copia N SET N.nuco_copia = :numcop WHERE N.tido_cod = 92 AND N.nuco_id = :id;
END
SELECT N.noco_nombre FROM nombres_copias N WHERE N.noco_id = :numcop INTO :nombre_copia;
numempl = 0;
nitant = 0;
nitnue = 0;
IF (PAGO = 'N') THEN
BEGIN
FOR SELECT N.nomi_feccausa, N.nomi_obs, N.nomi_pagoglobal, N.nomi_periodo, N.nomi_ano, P.ppag_nombre, PN.pnom_nombre FROM NOMINA N, periodo_pago P, periodo_pago_nombre PN
 WHERE P.ppag_cod = N.nomi_periodocidad AND N.nomi_id = :ID AND PN.ppag_cod = N.nomi_periodocidad AND PN.ppag_periodo = N.nomi_periodo
 INTO :fecha, :observaciones, :pagoglobal, :periodo, :ano, :periodicidad, :NOMPER
 DO
 BEGIN
 FOR SELECT NC.terc_nit, NC.noco_valor, NC.noco_deduc, T.terc_nom, C.conc_nomcorto, C.conc_nombre, NC.conc_cod, NC.noco_prov, E.empl_cargo FROM NOMINA_CONCEPTOS NC, TERCEROS T, EMPLEADOS E, CONCEPTOS_NOMINA C
        WHERE NC.nomi_id = :ID AND T.terc_nit = E.terc_nit AND C.conc_cod = NC.conc_cod AND t.terc_nit = nc.terc_nit
      INTO :nitempl, :valor, :deduc, :nombreempl, :nomcortconc, :nombreconc, :codconc, :prov, :cargoempl
 DO
 BEGIN
 IF (valor IS NULL) THEN
 valor = 0;
 SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND TERC_NIT = :nitempl INTO :totalempl;
 SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND TERC_NIT = :nitempl AND NC.noco_deduc = 'S' INTO :totaldeduc;
 SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND TERC_NIT = :nitempl AND NC.noco_deduc = 'N' INTO :totaldeveng;
 SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id INTO :totalnomi;
 SELECT SUM(NC.noco_valor*-1) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_APORTE = 'S' AND NOCO_VALOR < 0 AND NOMI_ID = :id INTO :totalaporneg;
 SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_APORTE = 'S' AND NOCO_VALOR > 0 AND NOMI_ID = :id INTO :totalapor;
 totalapor = :totalapor + totalaporneg;
  SUSPEND;
 END
nitempl = '';
valor = NULL;
deduc = '';
nombreempl = NULL;
nomcortconc = NULL;
nombreconc = NULL;
codconc = NULL;
prov = NULL;
 FOR SELECT MAX(N.conc_cod) FROM NOMINA_CONCEPTOS N WHERE N.nomi_id = :id
 GROUP BY N.conc_cod
 INTO :codconc
 DO
 BEGIN
 SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC
 WHERE NC.nomi_id = :ID AND NC.conc_cod = :codconc
 GROUP BY NC.conc_cod
 INTO :valor;
 nitempl = '';
 nombreempl = '';
 deduc = 'N';
 prov = 'N';
 SELECT C.conc_nombre,C.conc_nomcorto FROM CONCEPTOS_NOMINA C WHERE C.conc_cod = :codconc INTO :nombreconc,:nomcortconc;
 SUSPEND;
 END
 END
END
ELSE
IF (PAGO = 'S') THEN
BEGIN
par = 2;
impar = 1;
FOR SELECT N.nomi_feccausa, N.nomi_obs, N.nomi_pagoglobal, N.nomi_periodo, N.nomi_ano, P.ppag_nombre, PN.pnom_nombre FROM NOMINA N, periodo_pago P, periodo_pago_nombre PN
 WHERE P.ppag_cod = N.nomi_periodocidad AND N.nomi_id = :ID AND PN.ppag_cod = N.nomi_periodocidad AND PN.ppag_periodo = N.nomi_periodo
 INTO :fecha, :observaciones, :pagoglobal, :periodo, :ano, :periodicidad, :NOMPER
 DO
 BEGIN
 FOR SELECT NC.terc_nit, NC.noco_valor, NC.noco_deduc, T.terc_nom, C.conc_nomcorto, C.conc_nombre, NC.conc_cod, NC.noco_prov, E.empl_cargo, D.dpto_nombre, ND.node_diaslab
     FROM NOMINA_CONCEPTOS NC, TERCEROS T, EMPLEADOS E, CONCEPTOS_NOMINA C, DEPARTAMENTO D, NOMINA_DETALLE ND
     WHERE NC.nomi_id = :ID AND T.terc_nit = E.terc_nit AND C.conc_cod = NC.conc_cod AND t.terc_nit = nc.terc_nit AND D.dpto_cod = E.empl_dpto AND NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N'
     AND ND.nomi_id = :id AND ND.terc_nit = E.terc_nit
     ORDER BY NC.terc_nit
     INTO :nitempl, :valor, :deduc, :nombreempl, :nomcortconc, :nombreconc, :codconc, :prov, :cargoempl,:deptoempl,:diaslab
 DO
 BEGIN
 IF (valor IS NULL) THEN
 valor = 0;
 if (nitempl <> nitdeduc) then
 BEGIN
 par = 2;
 impar = 1;
 END
 nitdeduc = :nitempl;
 if (:deduc = 'S') then
 BEGIN
 antdeduc = 'S';
 org = :par;
 par = :par + 2;
 END
 ELSE
 BEGIN
 antdeduc = 'N';
 org = :impar;
 impar = :impar + 2;
 END
 SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND TERC_NIT = :nitempl INTO :totalempl;
 SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND TERC_NIT = :nitempl AND NC.noco_deduc = 'S' INTO :totaldeduc;
 SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND TERC_NIT = :nitempl AND NC.noco_deduc = 'N' INTO :totaldeveng;
 IF (cta = 'S') THEN
 BEGIN
 SELECT COUNT(CONC_COD) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND TERC_NIT = :nitempl INTO :numconc;
 totalempl = totalempl / :numconc;
 SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND TERC_NIT = :nitempl INTO :totalctas;
 END
 SELECT TERC_NIT, EMPL_CUENTA FROM EMPLEADOS WHERE TERC_NIT = :nitempl INTO :nitnue, :ctaempl;
 IF (nitnue IS NOT NULL) THEN
 BEGIN
 IF (nitnue <> nitant) THEN
 numempl = :numempl + 1;
 nitant = :nitnue;
 END
 SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id INTO :totalnomi;
 SELECT SUM(NC.noco_valor*-1) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_APORTE = 'S' AND NOCO_VALOR < 0 AND NOMI_ID = :id INTO :totalaporneg;
 SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_APORTE = 'S' AND NOCO_VALOR > 0 AND NOMI_ID = :id INTO :totalapor;
 totalapor = :totalapor + totalaporneg;
 SUSPEND;
 END
IF ( EMPL = 'N') THEN
BEGIN
nitempl = '';
valor = NULL;
deduc = '';
nombreempl = NULL;
nomcortconc = NULL;
nombreconc = NULL;
codconc = NULL;
prov = NULL;
totalempl = NULL;
ctaempl = NULL;
IF (cta = 'N') THEN
BEGIN
 FOR SELECT MAX(N.conc_cod) FROM NOMINA_CONCEPTOS N WHERE N.nomi_id = :id AND N.noco_prov = 'N' AND N.noco_gtoempr = 'N'
 GROUP BY N.conc_cod
 INTO :codconc
 DO
 BEGIN
 SELECT SUM(NC.noco_valor), MAX(NC.noco_deduc) FROM NOMINA_CONCEPTOS NC
 WHERE NC.nomi_id = :ID AND NC.conc_cod = :codconc
 GROUP BY NC.conc_cod
 INTO :valor, :deduc;
 nitempl = '';
 nombreempl = '';
 prov = 'N';
 SELECT C.conc_nombre,C.conc_nomcorto FROM CONCEPTOS_NOMINA C WHERE C.conc_cod = :codconc INTO :nombreconc,:nomcortconc;
 SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id INTO :totalempl;
 SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND NC.noco_deduc = 'S' INTO :totaldeduc;
 SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND NC.noco_deduc = 'N' INTO :totaldeveng;
 SUSPEND;
 END
 FOR SELECT E.TERC_NIT, T.TERC_NOM FROM empleados E, TERCEROS T
 WHERE EXISTS (SELECT C.TERC_NIT FROM NOMINA_CONCEPTOS C WHERE C.nomi_id = :id AND C.terc_nit = E.terc_nit) AND T.terc_nit = E.terc_nit
 INTO :nitempl, :nombreempl
 DO
 BEGIN
 deduc = 'N';
 nomcortconc = 'TOTAL DEV';
 nombreconc = 'TOTAL DEV';
 codconc = 9999;
 prov = 'N';
 SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND NC.terc_nit = :nitempl INTO :VALOR;
 SUSPEND;
 deduc = 'S';
 nomcortconc = 'TOTAL DEDUC';
 nombreconc = 'TOTAL DEDUC';
 codconc = 99999;
 prov = 'N';
 SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND NC.noco_deduc = 'S' AND NC.terc_nit = :nitempl INTO :VALOR;
 SUSPEND;
 deduc = 'S';
 nomcortconc = 'TOTAL EMPL';
 nombreconc = 'TOTAL EMPL';
 codconc = 999999;
 prov = 'N';
 SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND NC.noco_deduc = 'N' AND NC.terc_nit = : nitempl INTO :VALOR;
 SUSPEND;
 END
/*TOTALES*/
 deduc = 'N';
 nomcortconc = 'TOTAL DEV';
 nombreconc = 'TOTAL DEV';
 codconc = 9999;
 prov = 'N';
 SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id INTO :VALOR;
 nitempl = '';
 nombreempl = '';
 SUSPEND;
 deduc = 'S';
 nomcortconc = 'TOTAL DEDUC';
 nombreconc = 'TOTAL DEDUC';
 codconc = 99999;
 prov = 'N';
 SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND NC.noco_deduc = 'S' INTO :VALOR;
 nitempl = '';
 nombreempl = '';
 SUSPEND;
 deduc = 'S';
 nomcortconc = 'TOTAL EMPL';
 nombreconc = 'TOTAL EMPL';
 codconc = 999999;
 prov = 'N';
 SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND NC.noco_deduc = 'N' INTO :VALOR;
 nitempl = '';
 nombreempl = '';
 SUSPEND;
/*TOTALES*/
END
END
 END
END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER PROCEDURE CAUSA_NOMINA (
    fec date,
    periodo integer,
    periodicidad integer,
    pagoglobal char(1),
    ano char(4))
returns (
    idnomina integer)
as
declare variable item integer;
declare variable nite varchar(20) character set none;
declare variable nit_tercero varchar(20);
declare variable concept integer;
declare variable montos numeric(18,2);
declare variable porcen numeric(9,4);
declare variable entidad varchar(20);
declare variable conc_cod integer;
declare variable conc_deduc char(1);
declare variable conc_porc numeric(9,4);
declare variable conc_entidad integer;
declare variable conc_monto numeric(18,2);
declare variable conc_modifi char(1);
declare variable conc_promedio char(1);
declare variable emco_perprom integer;
declare variable valor numeric(18,2);
declare variable diaslab integer;
declare variable conc_prov char(1);
declare variable conc_aporte char(1);
declare variable numeroprom integer;
declare variable conc_aplicaprom char(1);
declare variable perinicial integer;
declare variable anoprom integer;
declare variable conc_dias char(1);
declare variable conc_otroconc char(1);
declare variable conc_codotroconc integer;
declare variable anosum integer;
declare variable salario char(1) character set none;
declare variable liquidaper integer;
declare variable rmod numeric(2,2);
declare variable basico numeric(18,2);
declare variable niteps varchar(20);
declare variable nitafc varchar(20);
declare variable nitafp varchar(20);
declare variable nitccf varchar(20);
declare variable gtoempr char(1);
declare variable comision numeric(18,2);
declare variable cambsaltrans numeric(18,2);
declare variable saldosini numeric(18,2);
declare variable duranov integer;
declare variable base numeric(18,2);
declare variable aprox integer;
declare variable mensual char(1);
declare variable horasex numeric(18,2);
declare variable diasnov integer;
declare variable tomasal integer;
declare variable retroact numeric(18,2);
BEGIN
/* SI ES QUINCENAL */
EXECUTE PROCEDURE cambie_id_nomina RETURNING_VALUES(:idnomina);
INSERT INTO nomina (nomi_id, NOMI_FECCAUSA, NOMI_PAGOGLOBAL, NOMI_PERIODOCIDAD, NOMI_PERIODO, NOMI_ANO, NOMI_LIQOK)
VALUES (:IDNOMINA, :fec,:pagoglobal, :periodicidad, :periodo, :ano, 'N');
 BEGIN
fec = substr(fec,1,8) || (CAST(substr(fec,9,10) AS INTEGER)+1);
    item = 1;
    FOR SELECT E.TERC_NIT, E.empl_salario, e.empl_eps, e.empl_afc, e.empl_afp, e.empl_ccf
    FROM EMPLEADOS E
    WHERE E.empl_ppago = :periodicidad AND E.empl_fecret IS NULL
    INTO :nite, :basico, :niteps, :nitafc, :nitafp, :nitccf
    DO
    BEGIN
    FOR SELECT CE.TERC_NIT, CE.CONC_COD, CE.EMCO_MONTO, CE.EMCO_PORC, ce.empl_entidad, CE.emco_perprom, CE.emco_luquidaper, CE.emco_mensual, CN.CONC_COD, CN.CONC_DEDUC,CN.CONC_PORC, CN.CONC_ENTIDAD, CN.CONC_MONTO,  CN.CONC_DIAS, CN.CONC_MODIFI,
    CN.CONC_PROMEDIO, CN.conc_salario, CE.emco_perprom, CN.conc_prov, CN.conc_aporte, CN.conc_aplicaprom, cn.conc_otroconc, cn.conc_codotroconc, CN.conc_gtoempr, CN.conc_base, CE.emco_tomsal
    FROM empleado_conceptos CE, CONCEPTOS_NOMINA CN WHERE ((CE.terc_nit = :nite) AND (CE.CONC_COD = CN.CONC_COD) AND (CN.conc_fecini <= :fec AND CN.conc_fecfin >= :FEC) ) OR ((CE.terc_nit = :nite)
    AND (CE.CONC_COD = CN.CONC_COD) AND (cn.conc_todosper = 'N') AND (CE.emco_ppago = :periodo)) OR  ((CE.terc_nit = :nite) AND (CE.CONC_COD = CN.CONC_COD) AND cn.conc_todosper = 'S')  ORDER BY (TERC_NIT )
    INTO :nit_tercero, :concept,  :montos, :porcen, :entidad, :numeroprom, :liquidaper, :mensual ,:CONC_COD, :CONC_DEDUC, :CONC_PORC,
    :CONC_ENTIDAD, :CONC_MONTO, :CONC_DIAS, :CONC_MODIFI,:CONC_PROMEDIO, :salario,:EMCO_PERPROM, :conc_prov, :conc_aporte , :CONC_APLICAPROM, :conc_otroconc, :conc_codotroconc, :gtoempr, :base, :tomasal
    DO
BEGIN
    IF (conc_dias = 'S') THEN
    EXECUTE PROCEDURE DIAS_LABORADOS (:nite, :periodo, :fec, :mensual,:conc_aporte) RETURNING_VALUES (:diaslab);
    ELSE
    BEGIN
    diaslab = 15;
    IF (mensual = 'S') THEN
    BEGIN
    IF (periodicidad = 2) THEN
    diaslab = 30;
    ELSE
    IF (liquidaper = 3) THEN
    diaslab = 30;
    END
    END
    if (:tomasal <> 0) then
    begin
         IF ((:periodicidad = 2) AND (:tomasal <> 2)) THEN
         BEGIN
          IF ((periodo = 2) OR (periodo = 4) OR (periodo = 6) OR (periodo = 8) OR (periodo = 10) OR (periodo = 12)
          OR (periodo = 14) OR (periodo = 16) OR (periodo = 18) OR (periodo = 20) OR (periodo = 22) OR (periodo = 24)) THEN
         basico = 0;
         END
         ELSE
         IF ((:periodicidad = 3) AND (:tomasal <> 1)) THEN
         BEGIN
          IF ((periodo = 1) OR (periodo = 5) OR (periodo = 9) OR (periodo = 13) OR (periodo = 17) OR (periodo = 21)
          OR (periodo = 25) OR (periodo = 29) OR (periodo = 33) OR (periodo = 37) OR (periodo = 41) OR (periodo = 45)
          OR (periodo = 49)) THEN
          basico = 0;
         END
         ELSE
         IF ((:periodicidad = 3) AND (:tomasal <> 2)) THEN
         BEGIN
          IF ((periodo = 2) OR (periodo = 6) OR (periodo = 10) OR (periodo = 14) OR (periodo = 18) OR (periodo = 22)
          OR (periodo = 26) OR (periodo = 30) OR (periodo = 34) OR (periodo = 38) OR (periodo = 42) OR (periodo = 46)
          OR (periodo = 50)) THEN
          basico = 0;
         END
         ELSE
         IF ((:periodicidad = 3) AND (:tomasal <> 3)) THEN
         BEGIN
          IF ((periodo = 3) OR (periodo = 7) OR (periodo = 11) OR (periodo = 15) OR (periodo = 19) OR (periodo = 23)
          OR (periodo = 27) OR (periodo = 31) OR (periodo = 35) OR (periodo = 39) OR (periodo = 43) OR (periodo = 47)
          OR (periodo = 51)) THEN
          basico = 0;
         END
         ELSE
         IF ((:periodicidad = 3) AND (:tomasal <> 4)) THEN
         BEGIN
          IF ((periodo = 4) OR (periodo = 8) OR (periodo = 12) OR (periodo = 16) OR (periodo = 20) OR (periodo = 24)
          OR (periodo = 29) OR (periodo = 32) OR (periodo = 36) OR (periodo = 40) OR (periodo = 44) OR (periodo = 48)
          OR (periodo = 52)) THEN
          basico = 0;
         END
    end
    ELSE
    SELECT E.empl_salario FROM EMPLEADOS E WHERE E.terc_nit = :nite INTO :basico;
 SELECT ((n.nono_valor /30) * n.nono_dura), (n.nono_dura) FROM nomina_novedades n WHERE n.tnov_cod = 11 AND n.terc_nit = :nite AND n.nono_periodo = :periodo INTO :cambsaltrans, :duranov;
 IF (cambsaltrans IS NULL) THEN
 cambsaltrans = 0;
 IF (duranov IS NULL) THEN
 duranov = 0;
 diaslab = :diaslab - :duranov;
 IF (conc_cod = 921) THEN
 BEGIN
 IF (porcen IS NOT NULL AND porcen <> 0) THEN
 valor = ((basico / 30)* :diaslab ) * :PORCEN /100;
 ELSE
 IF (conc_porc IS NOT NULL AND conc_porc <> 0) THEN
 valor = ((basico / 30)* :diaslab ) * :conc_porc /100;
 END
 ELSE
 IF (conc_cod = 922) THEN
 BEGIN
 SELECT P.prcu_monto FROM prestamo_cuotas P, prestamo_nomina PN WHERE P.prcu_ano = :ano AND P.prcu_periodo = :periodo AND PN.prno_id = P.prno_id AND PN.terc_nit = :nite INTO :valor;
 IF (valor IS NULL) THEN
 valor = 0;
 item = :item + 1;
 UPDATE prestamo_cuotas  P SET prcu_ok = 'S' WHERE P.prcu_ano = :ano AND P.prcu_periodo = :periodo AND P.prno_id = (SELECT PN.prno_id FROM PRESTAMO_NOMINA PN WHERE PN.terc_nit = :nite);
 END
 ELSE
 BEGIN
    IF ((:montos = 0) OR (:montos IS NULL)) THEN
      BEGIN
      IF ((CONC_PORC = 0 AND :porcen = 0) OR (CONC_PORC IS NULL AND :porcen = 0) OR (CONC_PORC = 0 AND :porcen IS NULL) OR (CONC_PORC IS NULL AND :porcen IS NULL) ) THEN
        BEGIN
        IF ((conc_monto <> 0) AND (conc_monto IS NOT NULL) ) THEN
        BEGIN
        VALOR = :CONC_MONTO;
        IF (:conc_dias = 'S') THEN
        valor = (:valor / 30) * :diaslab;
        END
        ELSE
        IF (salario = 'S' AND CONC_COD <> 900 AND CONC_COD <> 920) THEN
        BEGIN
        conc_monto = :basico;
        VALOR = (:conc_monto/30 * :diaslab ) + :cambsaltrans;
        END
        ELSE
        BEGIN
        valor = montos;
        IF (:conc_dias = 'S') THEN
        valor = (:valor / 30) * :diaslab;
        END
        END
       ELSE
       BEGIN
        IF (:porcen <> 0) THEN
          BEGIN
            IF ((conc_monto <> 0) AND (conc_monto IS NOT NULL) ) THEN
            BEGIN
              VALOR = ((:CONC_MONTO ) * :PORCEN) /100;
            END
          END
          ELSE
          BEGIN
            IF ((conc_monto <> 0) AND (conc_monto IS NOT NULL) ) THEN
            BEGIN
              VALOR = ((:CONC_MONTO) * :conc_porc) /100;
            END
            ELSE
        IF (salario = 'S' AND CONC_COD <> 900 AND CONC_COD <> 920) THEN
            BEGIN
              conc_monto = :basico;
              VALOR = ((:CONC_MONTO)+ :cambsaltrans * :conc_porc) /100;
            END
            ELSE
            if (:conc_monto = 0 AND :montos = 0) then
            BEGIN
            conc_monto = :basico;
            VALOR = (((:CONC_MONTO / 30) * :diaslab) + :cambsaltrans * :conc_porc) /100;
            END
          END
       END
      END
    ELSE
    BEGIN
      IF ((CONC_PORC = 0 OR (conc_porc IS NULL)) AND (:porcen = 0 OR (porcen IS NULL))) THEN
      BEGIN
      VALOR = (:montos);
      IF (:conc_dias = 'S') THEN
      valor = (:valor / 30) * :diaslab;
      END
      ELSE
      BEGIN
        IF (:porcen <> 0 AND porcen IS NOT NULL) THEN
          BEGIN
          VALOR = ((:MONTOS ) * :PORCEN) /100;
          END
          ELSE
          BEGIN
          VALOR = ((:montos) * :CONC_PORC) /100;
          END
          END
   END
    IF (conc_promedio = 'S') THEN
    BEGIN
    perinicial = :periodo - (:numeroprom) + 1;
    anoprom = CAST (ano AS INTEGER);
    IF (perinicial <= 0) THEN
    BEGIN
    perinicial = 24 + :PERINICIAL;
    anoprom = CAST(ANO AS INTEGER) - 1;
    END
    SELECT SUM (noco_valor) FROM nomina_conceptos n WHERE n.noco_aplicaprom = 'S' AND N.noco_periodo >= :perinicial - 1 AND N.noco_periodo < :periodo AND N.noco_ano >= :anoprom AND N.noco_ano <= :ano AND terc_nit = :nite INTO :valor;
    valor = (valor / numeroprom);
    SELECT NOCO_VALOR FROM NOMINA_CONCEPTOS WHERE CONC_COD = :conc_cod AND TERC_NIT  = :nite AND NOCO_PAGOOK = 'N' AND NOCO_PERIODO = 0 INTO :saldosini;
    IF (saldosini IS NULL) THEN
    saldosini = 0;
    ELSE
    UPDATE nomina_conceptos N SET noco_pagook = 'S' WHERE n.noco_aplicaprom = 'S' AND N.noco_periodo >= :perinicial - 1 AND N.noco_periodo < :periodo AND N.noco_ano >= :anoprom AND N.noco_ano <= :ano  AND CONC_COD = :conc_cod AND terc_nit = :nite AND NOCO_PERIODO = 0;
    VALOR = :valor + :saldosini;
    UPDATE nomina_conceptos N SET noco_pagook = 'S' WHERE n.noco_aplicaprom = 'S' AND N.noco_periodo >= :perinicial - 1 AND N.noco_periodo < :periodo AND N.noco_ano >= :anoprom AND N.noco_ano <= :ano  AND CONC_COD = :conc_cod AND terc_nit = :nite;
    END
    IF (conc_otroconc = 'S') THEN
    BEGIN
    anosum = CAST(ano AS INTEGER);
    anosum = anosum - 1;
    SELECT SUM (noco_valor) FROM nomina_conceptos n WHERE n.noco_ano = :anosum AND n.conc_cod = :conc_codotroconc AND N.terc_nit = :nite INTO :valor;
    SELECT NOCO_VALOR FROM NOMINA_CONCEPTOS WHERE noco_ano = :anosum AND conc_cod = :conc_codotroconc AND terc_nit = :nite AND NOCO_PERIODO = 0 INTO :saldosini;
    IF (saldosini IS NULL) THEN
    saldosini = 0;
    ELSE
    UPDATE nomina_conceptos SET noco_pagook = 'S' WHERE noco_ano = :anosum AND conc_cod = :conc_codotroconc AND NOCO_PERIODO = 0 AND terc_nit = :nite;
    VALOR = :valor + :saldosini;
    UPDATE nomina_conceptos SET noco_pagook = 'S' WHERE noco_ano = :anosum AND conc_cod = :conc_codotroconc AND terc_nit = :nite;
    END
/*SI EL CONCEPTO ES UN APORTE*/
IF (conc_aporte = 'S') THEN
BEGIN
    horasex = null;
    diasnov = null;
    IF ((:entidad = '' ) OR (entidad IS NULL)) THEN
    BEGIN
     SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
    IF (comision IS NULL) THEN
     comision = 0;
     SELECT C.emco_monto FROM EMPLEADO_CONCEPTOS C WHERE C.terc_nit = :nite AND C.conc_cod = 933 INTO :retroact;
     if (retroact IS NULL ) then
     retroact = 0;
     valor = :basico + :comision + :horasex + :retroact;
     select n.nono_dura from nomina_novedades n where n.terc_nit = :nite and n.tnov_cod = 6 and n.nono_periodo = :periodo and n.nono_ano = :ano into :diasnov;
     if (diasnov is null) then
     diasnov = 0;
     if ((diasnov is not null) and (diasnov <> 0)) then
     diaslab = :diaslab - :diasnov;
    IF ((conc_cod = 904) OR (conc_cod = 905) OR (conc_cod = 906)) THEN
            BEGIN
            entidad = :nitafp;
                IF (conc_cod = 904) THEN
                BEGIN
                SELECT A.paan_afptr FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                SELECT c.noex_monto FROM nomina_horasext c WHERE c.noex_ano = :ano AND c.noex_periodio = :periodo AND c.noex_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :horasex;
                if (horasex is not null) then
                VALOR = (((((:basico )/30 * :diaslab ) + :comision + :horasex + :retroact)+ :cambsaltrans) * :PORCEN) /100;
                else
                VALOR = (((((:basico )/30 * :diaslab ) + :comision + :retroact)+ :cambsaltrans) * :PORCEN) /100;
                END
                ELSE
                IF ((conc_cod = 905) OR (conc_cod = 906)) THEN
                BEGIN
                SELECT A.paan_afpem FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                SELECT c.noex_monto FROM nomina_horasext c WHERE c.noex_ano = :ano AND c.noex_periodio = :periodo AND c.noex_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :horasex;
                if (horasex is not null) then
                VALOR = (((((:basico )/30 * :diaslab ) + :comision + :horasex + :retroact)+ :cambsaltrans) * :PORCEN) /100;
                else
                VALOR = (((((:basico )/30 * :diaslab ) + :comision + :retroact)+ :cambsaltrans) * :PORCEN) /100;
                END
            END
            ELSE
       IF ((conc_cod = 907) OR (conc_cod = 914) OR (conc_cod = 915)) THEN
            BEGIN
            entidad = :niteps;
                IF (conc_cod = 907) THEN
                BEGIN
                SELECT A.paan_epstr FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                SELECT c.noex_monto FROM nomina_horasext c WHERE c.noex_ano = :ano AND c.noex_periodio = :periodo AND c.noex_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :horasex;
                if (horasex is not null) then
                VALOR = (((((:basico )/30 * :diaslab ) + :comision + :horasex + :retroact)+ :cambsaltrans) * :PORCEN) /100;
                else
                VALOR = (((((:basico )/30 * :diaslab ) + :comision + :retroact)+ :cambsaltrans) * :PORCEN) /100;
                END
                ELSE
                IF ((conc_cod = 914) OR (conc_cod = 915)) THEN
                BEGIN
                SELECT A.paan_epsem FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                SELECT c.noex_monto FROM nomina_horasext c WHERE c.noex_ano = :ano AND c.noex_periodio = :periodo AND c.noex_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :horasex;
                if (horasex is not null) then
                VALOR = (((((:basico )/30 * :diaslab ) + :comision + :horasex + :retroact)+ :cambsaltrans) * :PORCEN) /100;
                else
                VALOR = (((((:basico )/30 * :diaslab ) + :comision + :retroact)+ :cambsaltrans) * :PORCEN) /100;
                END
            END
            ELSE
       IF ((conc_cod = 910) OR (conc_cod = 911) OR (conc_cod = 916) OR (conc_cod = 917) OR (conc_cod = 918) OR (conc_cod = 919)) THEN
            BEGIN
            entidad = :nitccf;
            SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
            IF (comision IS NULL) THEN
            comision = 0;
                IF ((conc_cod = 910) OR (conc_cod = 911) ) THEN
                BEGIN
                SELECT A.paan_ccf FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                SELECT c.noex_monto FROM nomina_horasext c WHERE c.noex_ano = :ano AND c.noex_periodio = :periodo AND c.noex_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :horasex;
                if (horasex is not null) then
                VALOR = (((((:basico )/30 * :diaslab ) + :comision + :horasex + :retroact)+ :cambsaltrans) * :PORCEN) /100;
                else
                VALOR = (((((:basico )/30 * :diaslab ) + :comision + :retroact /*+ :horasex*/)+ :cambsaltrans) * :PORCEN) /100;
                END
                ELSE
                IF ((conc_cod = 916) OR (conc_cod = 917)) THEN
                BEGIN
                SELECT A.paan_icbf FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                SELECT c.noex_monto FROM nomina_horasext c WHERE c.noex_ano = :ano AND c.noex_periodio = :periodo AND c.noex_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :horasex;
                if (horasex is not null) then
                VALOR = (((((:basico )/30 * :diaslab ) + :comision + :horasex + :retroact)+ :cambsaltrans) * :PORCEN) /100;
                else
                VALOR = (((((:basico )/30 * :diaslab ) + :comision + :retroact/*+ :horasex*/)+ :cambsaltrans) * :PORCEN) /100;
                END
                ELSE
                IF ((conc_cod = 918) OR (conc_cod = 919)) THEN
                BEGIN
                SELECT A.paan_sena FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                SELECT c.noex_monto FROM nomina_horasext c WHERE c.noex_ano = :ano AND c.noex_periodio = :periodo AND c.noex_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :horasex;
                if (horasex is not null) then
                VALOR = (((((:basico )/30 * :diaslab ) + :comision + :horasex + :retroact)+ :cambsaltrans) * :PORCEN) /100;
                else
                VALOR = (((((:basico )/30 * :diaslab ) + :comision + :retroact/*+ :horasex*/)+ :cambsaltrans) * :PORCEN) /100;
                END
            END
            ELSE
        IF ((conc_cod = 912) OR (conc_cod = 913)) THEN
            BEGIN
            entidad = :nitafc;
            SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
            IF (comision IS NULL) THEN
            comision = 0;
                IF ((conc_cod = 912) OR (conc_cod = 913) ) THEN
                BEGIN
                SELECT A.paan_cesemp FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                SELECT c.noex_monto FROM nomina_horasext c WHERE c.noex_ano = :ano AND c.noex_periodio = :periodo AND c.noex_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :horasex;
                if (horasex is not null) then
                VALOR = (((((:basico )/30 * :diaslab ) + :comision + :horasex + :retroact)+ :cambsaltrans) * :PORCEN) /100;
                else
                VALOR = (((((:basico )/30 * :diaslab ) + :comision + :retroact/*+ :horasex*/)+ :cambsaltrans) * :PORCEN) /100;
                END
            END
            ELSE
        BEGIN
        IF (comision IS NULL) THEN
        comision = 0;
        SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
        conc_monto = :basico + :comision;
        IF (conc_porc <> 0 AND conc_porc IS NOT NULL) THEN
        VALOR = (((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans) * :conc_porc) /100;
        ELSE
        IF (:porcen <> 0 AND :porcen IS NOT NULL) THEN
        VALOR = (((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans) * :porcen) /100;
        ELSE
        IF (:montos <> 0 AND :montos IS NOT NULL) THEN
        valor = :montos;
        ELSE
        IF (:conc_monto <> 0 AND :conc_monto IS NOT NULL) THEN
        valor = :conc_monto;
        END
    END
    END
    ELSE
    IF (conc_prov = 'S') THEN
    BEGIN
        conc_monto = :basico;
        IF (conc_porc <> 0 AND conc_porc IS NOT NULL) THEN
        VALOR = (((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans) * :conc_porc) /100;
        ELSE
        IF (porcen <> 0 AND porcen IS NOT NULL) THEN
        VALOR = (((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans) * :porcen) /100;
        ELSE
        IF (montos <> 0 AND montos IS NOT NULL) THEN
        VALOR = :montos;
        ELSE
        IF (conc_monto <> 0 AND conc_monto IS NOT NULL) THEN
        VALOR = :conc_monto;
    END
item = :item + 1;
END
 IF (conc_cod = 920) THEN
 BEGIN
 SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :valor;
 IF (valor IS NULL) THEN
 valor = 0;
 item = :item + 1;
 END
 ELSE
 if (conc_cod = 900 or (:conc_cod = 931)) then
 BEGIN
 SELECT c.noex_monto FROM nomina_horasext c WHERE c.noex_ano = :ano AND c.noex_periodio = :periodo AND c.noex_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :valor;
 IF (valor IS NULL) THEN
 valor = 0;
 item = :item + 1;
 END
 ELSE
 if (conc_cod = 932) then
 BEGIN
 select N.nono_dura FROM NOMINA_NOVEDADES N WHERE N.terc_nit = :nite AND N.nono_periodo = :periodo AND N.nono_ano = :ano INTO :diasnov;
 if (:diasnov IS NULL) then
 valor = 0;
 else
 valor = (:basico / 30)* :diasnov;
 END
    EXECUTE PROCEDURE LEE_CONFIGURACION('NOMINA','GENERAL','REDONDEO AL MULTIPLO DE DIEZ EN TOTALES')RETURNING_VALUES(:aprox);
    EXECUTE PROCEDURE REDONDEE(:valor, :aprox) RETURNING_VALUES (VALOR);
    IF ((mensual = 'N') OR (periodicidad = 1))  THEN
    INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
    VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
    ELSE
    IF (mensual = 'S') THEN
    BEGIN
         IF ((:periodicidad = 2) AND (liquidaper = 1)) THEN
         BEGIN
          IF ((periodo = 1) OR (periodo = 3) OR (periodo = 5) OR (periodo = 7) OR (periodo = 9) OR (periodo = 11)
          OR (periodo = 13) OR (periodo = 15) OR (periodo = 17) OR (periodo = 19) OR (periodo = 21) OR (periodo = 23)) THEN
             INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
             VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
         END
         ELSE
         IF ((:periodicidad = 2) AND (liquidaper = 2)) THEN
         BEGIN
          IF ((periodo = 2) OR (periodo = 4) OR (periodo = 6) OR (periodo = 8) OR (periodo = 10) OR (periodo = 12)
          OR (periodo = 14) OR (periodo = 16) OR (periodo = 18) OR (periodo = 20) OR (periodo = 22) OR (periodo = 24)) THEN
             INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
             VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
         END
         ELSE
         IF ((:periodicidad = 3) AND (liquidaper = 1)) THEN
         BEGIN
          IF ((periodo = 1) OR (periodo = 5) OR (periodo = 9) OR (periodo = 13) OR (periodo = 17) OR (periodo = 21)
          OR (periodo = 25) OR (periodo = 29) OR (periodo = 33) OR (periodo = 37) OR (periodo = 41) OR (periodo = 45)
          OR (periodo = 49)) THEN
             INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
             VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
         END
         ELSE
         IF ((:periodicidad = 3) AND (liquidaper = 2)) THEN
         BEGIN
          IF ((periodo = 2) OR (periodo = 6) OR (periodo = 10) OR (periodo = 14) OR (periodo = 18) OR (periodo = 22)
          OR (periodo = 26) OR (periodo = 30) OR (periodo = 34) OR (periodo = 38) OR (periodo = 42) OR (periodo = 46)
          OR (periodo = 50)) THEN
            INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
             VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
         END
         ELSE
         IF ((:periodicidad = 3) AND (liquidaper = 3)) THEN
         BEGIN
          IF ((periodo = 3) OR (periodo = 7) OR (periodo = 11) OR (periodo = 15) OR (periodo = 19) OR (periodo = 23)
          OR (periodo = 27) OR (periodo = 31) OR (periodo = 35) OR (periodo = 39) OR (periodo = 43) OR (periodo = 47)
          OR (periodo = 51)) THEN
            INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
             VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
         END
         ELSE
         IF ((:periodicidad = 3) AND (liquidaper = 4)) THEN
         BEGIN
          IF ((periodo = 4) OR (periodo = 8) OR (periodo = 12) OR (periodo = 16) OR (periodo = 20) OR (periodo = 24)
          OR (periodo = 29) OR (periodo = 32) OR (periodo = 36) OR (periodo = 40) OR (periodo = 44) OR (periodo = 48)
          OR (periodo = 52)) THEN
            INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
             VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
         END
    END
  END
 END
END
SUSPEND;
END
^

SET TERM ; ^

UPDATE REVISION SET revi_nomina = '2009/02/15';

UPDATE CONCEPTOS_NOMINA
SET CONC_NOMCORTO = 'CCF.'
WHERE (CONC_COD = 911);


UPDATE PARAMETROS_ANO
SET PAAN_SALMINIMO = 496900
WHERE (PAAN_ANO = '2009');

SET TERM ^ ;

ALTER PROCEDURE CAUSA_NOMINA(
    FEC DATE,
    PERIODO INTEGER,
    PERIODICIDAD INTEGER,
    PAGOGLOBAL CHAR(1),
    ANO CHAR(4))
RETURNS (
    IDNOMINA INTEGER)
AS
DECLARE VARIABLE item INTEGER;
DECLARE VARIABLE nite VARCHAR(20) CHARACTER SET none;
DECLARE VARIABLE nit_tercero VARCHAR(20);
DECLARE VARIABLE concept INTEGER;
DECLARE VARIABLE montos NUMERIC(18,2);
DECLARE VARIABLE porcen NUMERIC(9,4);
DECLARE VARIABLE entidad VARCHAR(20);
DECLARE VARIABLE conc_cod INTEGER;
DECLARE VARIABLE conc_deduc CHAR(1);
DECLARE VARIABLE conc_porc NUMERIC(9,4);
DECLARE VARIABLE conc_entidad INTEGER;
DECLARE VARIABLE conc_monto NUMERIC(18,2);
DECLARE VARIABLE conc_modifi CHAR(1);
DECLARE VARIABLE conc_promedio CHAR(1);
DECLARE VARIABLE emco_perprom INTEGER;
DECLARE VARIABLE valor NUMERIC(18,2);
DECLARE VARIABLE diaslab INTEGER;
DECLARE VARIABLE conc_prov CHAR(1);
DECLARE VARIABLE conc_aporte CHAR(1);
DECLARE VARIABLE numeroprom INTEGER;
DECLARE VARIABLE conc_aplicaprom CHAR(1);
DECLARE VARIABLE perinicial INTEGER;
DECLARE VARIABLE anoprom INTEGER;
DECLARE VARIABLE conc_dias CHAR(1);
DECLARE VARIABLE conc_otroconc CHAR(1);
DECLARE VARIABLE conc_codotroconc INTEGER;
DECLARE VARIABLE anosum INTEGER;
DECLARE VARIABLE salario CHAR(1) CHARACTER SET none;
DECLARE VARIABLE liquidaper INTEGER;
DECLARE VARIABLE rmod NUMERIC(2,2);
DECLARE VARIABLE basico NUMERIC(18,2);
DECLARE VARIABLE niteps VARCHAR(20);
DECLARE VARIABLE nitafc VARCHAR(20);
DECLARE VARIABLE nitafp VARCHAR(20);
DECLARE VARIABLE nitccf VARCHAR(20);
DECLARE VARIABLE gtoempr CHAR(1);
DECLARE VARIABLE comision NUMERIC(18,2);
DECLARE VARIABLE cambsaltrans NUMERIC(18,2);
DECLARE VARIABLE saldosini NUMERIC(18,2);
DECLARE VARIABLE duranov INTEGER;
DECLARE VARIABLE base NUMERIC(18,2);
DECLARE VARIABLE aprox INTEGER;
DECLARE VARIABLE mensual CHAR(1);
DECLARE VARIABLE horasex NUMERIC(18,2);
DECLARE VARIABLE diasnov INTEGER;
DECLARE VARIABLE tomasal INTEGER;
DECLARE VARIABLE retroact NUMERIC(18,2);
BEGIN
 EXECUTE PROCEDURE cambie_id_nomina RETURNING_VALUES(:idnomina);
 INSERT INTO nomina (nomi_id, NOMI_FECCAUSA, NOMI_PAGOGLOBAL, NOMI_PERIODOCIDAD, NOMI_PERIODO, NOMI_ANO, NOMI_LIQOK)
 VALUES (:IDNOMINA, :fec,:pagoglobal, :periodicidad, :periodo, :ano, 'N');
 fec = substr(fec,1,8) || (CAST(substr(fec,9,10) AS INTEGER)+1);
 item = 1;
 FOR SELECT E.TERC_NIT, E.empl_salario, e.empl_eps, e.empl_afc, e.empl_afp, e.empl_ccf
 FROM EMPLEADOS E
 WHERE E.empl_ppago = :periodicidad AND E.empl_fecret IS NULL
 INTO :nite, :basico, :niteps, :nitafc, :nitafp, :nitccf
 DO
 BEGIN
  FOR SELECT CE.TERC_NIT, CE.CONC_COD, CE.EMCO_MONTO, CE.EMCO_PORC, ce.empl_entidad, CE.emco_perprom, CE.emco_luquidaper, CE.emco_mensual, CN.CONC_COD, CN.CONC_DEDUC,CN.CONC_PORC, CN.CONC_ENTIDAD, CN.CONC_MONTO,  CN.CONC_DIAS, CN.CONC_MODIFI,
  CN.CONC_PROMEDIO, CN.conc_salario, CE.emco_perprom, CN.conc_prov, CN.conc_aporte, CN.conc_aplicaprom, cn.conc_otroconc, cn.conc_codotroconc, CN.conc_gtoempr, CN.conc_base, CE.emco_tomsal
  FROM empleado_conceptos CE, CONCEPTOS_NOMINA CN WHERE ((CE.terc_nit = :nite) AND (CE.CONC_COD = CN.CONC_COD) AND (CN.conc_fecini <= :fec AND CN.conc_fecfin >= :FEC) ) OR ((CE.terc_nit = :nite)
  AND (CE.CONC_COD = CN.CONC_COD) AND (cn.conc_todosper = 'N') AND (CE.emco_ppago = :periodo)) OR  ((CE.terc_nit = :nite) AND (CE.CONC_COD = CN.CONC_COD) AND cn.conc_todosper = 'S')  ORDER BY (TERC_NIT )
  INTO :nit_tercero, :concept,  :montos, :porcen, :entidad, :numeroprom, :liquidaper, :mensual ,:CONC_COD, :CONC_DEDUC, :CONC_PORC,
  :CONC_ENTIDAD, :CONC_MONTO, :CONC_DIAS, :CONC_MODIFI,:CONC_PROMEDIO, :salario,:EMCO_PERPROM, :conc_prov, :conc_aporte , :CONC_APLICAPROM, :conc_otroconc, :conc_codotroconc, :gtoempr, :base, :tomasal
  DO
  BEGIN
   IF (conc_dias = 'S') THEN
   EXECUTE PROCEDURE DIAS_LABORADOS (:nite, :periodo, :fec, :mensual,:conc_aporte) RETURNING_VALUES (:diaslab);
   ELSE
   BEGIN
    diaslab = 15;
    IF (mensual = 'S') THEN
    BEGIN
     IF (periodicidad = 2) THEN
     diaslab = 30;
     ELSE
     IF (liquidaper = 3) THEN
     diaslab = 30;
    END
   END
   IF (:tomasal <> 0) THEN
   BEGIN
    IF ((:periodicidad = 2) AND (:tomasal <> 2)) THEN
    BEGIN
     IF ((periodo = 2) OR (periodo = 4) OR (periodo = 6) OR (periodo = 8) OR (periodo = 10) OR (periodo = 12)
     OR (periodo = 14) OR (periodo = 16) OR (periodo = 18) OR (periodo = 20) OR (periodo = 22) OR (periodo = 24)) THEN
     basico = 0;
    END
    ELSE
    IF ((:periodicidad = 3) AND (:tomasal <> 1)) THEN
    BEGIN
     IF ((periodo = 1) OR (periodo = 5) OR (periodo = 9) OR (periodo = 13) OR (periodo = 17) OR (periodo = 21)
     OR (periodo = 25) OR (periodo = 29) OR (periodo = 33) OR (periodo = 37) OR (periodo = 41) OR (periodo = 45)
     OR (periodo = 49)) THEN
     basico = 0;
    END
    ELSE
     IF ((:periodicidad = 3) AND (:tomasal <> 2)) THEN
     BEGIN
      IF ((periodo = 2) OR (periodo = 6) OR (periodo = 10) OR (periodo = 14) OR (periodo = 18) OR (periodo = 22)
      OR (periodo = 26) OR (periodo = 30) OR (periodo = 34) OR (periodo = 38) OR (periodo = 42) OR (periodo = 46)
      OR (periodo = 50)) THEN
      basico = 0;
     END
     ELSE
     IF ((:periodicidad = 3) AND (:tomasal <> 3)) THEN
     BEGIN
      IF ((periodo = 3) OR (periodo = 7) OR (periodo = 11) OR (periodo = 15) OR (periodo = 19) OR (periodo = 23)
      OR (periodo = 27) OR (periodo = 31) OR (periodo = 35) OR (periodo = 39) OR (periodo = 43) OR (periodo = 47)
      OR (periodo = 51)) THEN
      basico = 0;
     END
     ELSE
     IF ((:periodicidad = 3) AND (:tomasal <> 4)) THEN
     BEGIN
      IF ((periodo = 4) OR (periodo = 8) OR (periodo = 12) OR (periodo = 16) OR (periodo = 20) OR (periodo = 24)
      OR (periodo = 29) OR (periodo = 32) OR (periodo = 36) OR (periodo = 40) OR (periodo = 44) OR (periodo = 48)
      OR (periodo = 52)) THEN
      basico = 0;
     END
   END
   ELSE
   BEGIN
    SELECT E.empl_salario FROM EMPLEADOS E WHERE E.terc_nit = :nite INTO :basico;
    SELECT ((n.nono_valor /30) * n.nono_dura), (n.nono_dura) FROM nomina_novedades n WHERE n.tnov_cod = 11 AND n.terc_nit = :nite AND n.nono_periodo = :periodo INTO :cambsaltrans, :duranov;
    IF (cambsaltrans IS NULL) THEN
    cambsaltrans = 0;
    IF (duranov IS NULL) THEN
    duranov = 0;
    diaslab = :diaslab - :duranov;
    IF (conc_cod = 922) THEN
    BEGIN
     SELECT P.prcu_monto FROM prestamo_cuotas P, prestamo_nomina PN WHERE P.prcu_ano = :ano AND P.prcu_periodo = :periodo AND PN.prno_id = P.prno_id AND PN.terc_nit = :nite INTO :valor;
     IF (valor IS NULL) THEN
     valor = 0;
     item = :item + 1;
     UPDATE prestamo_cuotas  P SET prcu_ok = 'S' WHERE P.prcu_ano = :ano AND P.prcu_periodo = :periodo AND P.prno_id = (SELECT PN.prno_id FROM PRESTAMO_NOMINA PN WHERE PN.terc_nit = :nite);
    END
    ELSE
    IF ((:montos = 0) OR (:montos IS NULL)) THEN
    BEGIN
     IF ((CONC_PORC = 0 AND :porcen = 0) OR (CONC_PORC IS NULL AND :porcen = 0) OR (CONC_PORC = 0 AND :porcen IS NULL) OR (CONC_PORC IS NULL AND :porcen IS NULL) ) THEN
     BEGIN
      IF ((conc_monto <> 0) AND (conc_monto IS NOT NULL) ) THEN
      BEGIN
       VALOR = :CONC_MONTO;
       IF (:conc_dias = 'S') THEN
       valor = (:valor / 30) * :diaslab;
      END
      ELSE
      IF (salario = 'S' AND CONC_COD <> 900 AND CONC_COD <> 920) THEN
      BEGIN
       conc_monto = :basico;
       VALOR = (:conc_monto/30 * :diaslab ) + :cambsaltrans;
      END
      ELSE
      BEGIN
       valor = montos;
       IF (:conc_dias = 'S') THEN
       valor = (:valor / 30) * :diaslab;
      END
     END
     ELSE
     BEGIN
      IF (:porcen <> 0) THEN
      BEGIN
       IF ((conc_monto <> 0) AND (conc_monto IS NOT NULL) ) THEN
       BEGIN
        VALOR = ((:CONC_MONTO ) * :PORCEN) /100;
       END
      END
      ELSE
      BEGIN
       IF ((conc_monto <> 0) AND (conc_monto IS NOT NULL) ) THEN
       BEGIN
        VALOR = ((:CONC_MONTO) * :conc_porc) /100;
       END
       ELSE
       IF (salario = 'S' AND CONC_COD <> 900 AND CONC_COD <> 920) THEN
       BEGIN
        conc_monto = :basico;
        VALOR = ((:CONC_MONTO)+ :cambsaltrans * :conc_porc) /100;
       END
       ELSE
       IF (:conc_monto = 0 AND :montos = 0) THEN
       BEGIN
        conc_monto = :basico;
        VALOR = (((:CONC_MONTO / 30) * :diaslab) + :cambsaltrans * :conc_porc) /100;
       END
      END
     END
    END
    ELSE
    IF ((CONC_PORC = 0 OR (conc_porc IS NULL)) AND (:porcen = 0 OR (porcen IS NULL))) THEN
    BEGIN
     VALOR = (:montos);
     IF (:conc_dias = 'S') THEN
     valor = (:valor / 30) * :diaslab;
    END
    ELSE
    IF (:porcen <> 0 AND porcen IS NOT NULL) THEN
    BEGIN
     VALOR = ((:MONTOS ) * :PORCEN) /100;
    END
    ELSE
    BEGIN
     VALOR = ((:montos) * :CONC_PORC) /100;
    END
    IF (conc_promedio = 'S') THEN
    BEGIN
     perinicial = :periodo - (:numeroprom) + 1;
     anoprom = CAST (ano AS INTEGER);
     IF (perinicial <= 0) THEN
     BEGIN
      perinicial = 24 + :PERINICIAL;
      anoprom = CAST(ANO AS INTEGER) - 1;
     END
     SELECT SUM (noco_valor) FROM nomina_conceptos n WHERE n.noco_aplicaprom = 'S' AND N.noco_periodo >= :perinicial - 1 AND N.noco_periodo < :periodo AND N.noco_ano >= :anoprom AND N.noco_ano <= :ano AND terc_nit = :nite INTO :valor;
     valor = (valor / numeroprom);
     SELECT NOCO_VALOR FROM NOMINA_CONCEPTOS WHERE CONC_COD = :conc_cod AND TERC_NIT  = :nite AND NOCO_PAGOOK = 'N' AND NOCO_PERIODO = 0 INTO :saldosini;
     IF (saldosini IS NULL) THEN
     saldosini = 0;
     ELSE
     UPDATE nomina_conceptos N SET noco_pagook = 'S' WHERE n.noco_aplicaprom = 'S' AND N.noco_periodo >= :perinicial - 1 AND N.noco_periodo < :periodo AND N.noco_ano >= :anoprom AND N.noco_ano <= :ano  AND CONC_COD = :conc_cod AND terc_nit = :nite AND NOCO_PERIODO = 0;
     VALOR = :valor + :saldosini;
     UPDATE nomina_conceptos N SET noco_pagook = 'S' WHERE n.noco_aplicaprom = 'S' AND N.noco_periodo >= :perinicial - 1 AND N.noco_periodo < :periodo AND N.noco_ano >= :anoprom AND N.noco_ano <= :ano  AND CONC_COD = :conc_cod AND terc_nit = :nite;
    END
    ELSE
    IF (conc_otroconc = 'S') THEN
    BEGIN
     anosum = CAST(ano AS INTEGER);
     anosum = anosum - 1;
     SELECT SUM (noco_valor) FROM nomina_conceptos n WHERE n.noco_ano = :anosum AND n.conc_cod = :conc_codotroconc AND N.terc_nit = :nite INTO :valor;
     SELECT NOCO_VALOR FROM NOMINA_CONCEPTOS WHERE noco_ano = :anosum AND conc_cod = :conc_codotroconc AND terc_nit = :nite AND NOCO_PERIODO = 0 INTO :saldosini;
     IF (saldosini IS NULL) THEN
     saldosini = 0;
     ELSE
     UPDATE nomina_conceptos SET noco_pagook = 'S' WHERE noco_ano = :anosum AND conc_cod = :conc_codotroconc AND NOCO_PERIODO = 0 AND terc_nit = :nite;
     VALOR = :valor + :saldosini;
     UPDATE nomina_conceptos SET noco_pagook = 'S' WHERE noco_ano = :anosum AND conc_cod = :conc_codotroconc AND terc_nit = :nite;
    END
    ELSE
    IF (conc_aporte = 'S') THEN
    BEGIN
     horasex = NULL;
     diasnov = NULL;
     IF ((:entidad = '' ) OR (entidad IS NULL)) THEN
     BEGIN
      SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
      IF (comision IS NULL) THEN
      comision = 0;
      SELECT C.emco_monto FROM EMPLEADO_CONCEPTOS C WHERE C.terc_nit = :nite AND C.conc_cod = 933 INTO :retroact;
      IF (retroact IS NULL ) THEN
      retroact = 0;
      valor = :basico + :comision + :horasex + :retroact;
      SELECT n.nono_dura FROM nomina_novedades n WHERE n.terc_nit = :nite AND n.tnov_cod = 6 AND n.nono_periodo = :periodo AND n.nono_ano = :ano INTO :diasnov;
      IF (diasnov IS NULL) THEN
      diasnov = 0;
      IF ((diasnov IS NOT NULL) AND (diasnov <> 0)) THEN
      diaslab = :diaslab - :diasnov;
      IF ((conc_cod = 904) OR (conc_cod = 905) OR (conc_cod = 906)) THEN
      BEGIN
       entidad = :nitafp;
       IF (conc_cod = 904) THEN
       BEGIN
        SELECT A.paan_afptr FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
        SELECT c.noex_monto FROM nomina_horasext c WHERE c.noex_ano = :ano AND c.noex_periodio = :periodo AND c.noex_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :horasex;
        IF (horasex IS NOT NULL) THEN
        VALOR = (((((:basico )/30 * :diaslab ) + :comision + :horasex + :retroact)+ :cambsaltrans) * :PORCEN) /100;
        ELSE
        VALOR = (((((:basico )/30 * :diaslab ) + :comision + :retroact)+ :cambsaltrans) * :PORCEN) /100;
       END
       ELSE
       IF ((conc_cod = 905) OR (conc_cod = 906)) THEN
       BEGIN
        SELECT A.paan_afpem FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
        SELECT c.noex_monto FROM nomina_horasext c WHERE c.noex_ano = :ano AND c.noex_periodio = :periodo AND c.noex_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :horasex;
        IF (horasex IS NOT NULL) THEN
        VALOR = (((((:basico )/30 * :diaslab ) + :comision + :horasex + :retroact)+ :cambsaltrans) * :PORCEN) /100;
        ELSE
        VALOR = (((((:basico )/30 * :diaslab ) + :comision + :retroact)+ :cambsaltrans) * :PORCEN) /100;
       END
      END
      ELSE
      IF ((conc_cod = 907) OR (conc_cod = 914) OR (conc_cod = 915)) THEN
      BEGIN
       entidad = :niteps;
       IF (conc_cod = 907) THEN
       BEGIN
        SELECT A.paan_epstr FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
        SELECT c.noex_monto FROM nomina_horasext c WHERE c.noex_ano = :ano AND c.noex_periodio = :periodo AND c.noex_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :horasex;
        IF (horasex IS NOT NULL) THEN
        VALOR = (((((:basico )/30 * :diaslab ) + :comision + :horasex + :retroact)+ :cambsaltrans) * :PORCEN) /100;
        ELSE
        VALOR = (((((:basico )/30 * :diaslab ) + :comision + :retroact)+ :cambsaltrans) * :PORCEN) /100;
       END
       ELSE
       IF ((conc_cod = 914) OR (conc_cod = 915)) THEN
       BEGIN
        SELECT A.paan_epsem FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
        SELECT c.noex_monto FROM nomina_horasext c WHERE c.noex_ano = :ano AND c.noex_periodio = :periodo AND c.noex_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :horasex;
        IF (horasex IS NOT NULL) THEN
        VALOR = (((((:basico )/30 * :diaslab ) + :comision + :horasex + :retroact)+ :cambsaltrans) * :PORCEN) /100;
        ELSE
        VALOR = (((((:basico )/30 * :diaslab ) + :comision + :retroact)+ :cambsaltrans) * :PORCEN) /100;
       END
      END
      ELSE
      IF ((conc_cod = 910) OR (conc_cod = 911) OR (conc_cod = 916) OR (conc_cod = 917) OR (conc_cod = 918) OR (conc_cod = 919)) THEN
      BEGIN
       entidad = :nitccf;
       SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
       IF (comision IS NULL) THEN
       comision = 0;
       IF ((conc_cod = 910) OR (conc_cod = 911) ) THEN
       BEGIN
        SELECT A.paan_ccf FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
        SELECT c.noex_monto FROM nomina_horasext c WHERE c.noex_ano = :ano AND c.noex_periodio = :periodo AND c.noex_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :horasex;
        IF (horasex IS NOT NULL) THEN
        VALOR = (((((:basico )/30 * :diaslab ) + :comision + :horasex + :retroact)+ :cambsaltrans) * :PORCEN) /100;
        ELSE
        VALOR = (((((:basico )/30 * :diaslab ) + :comision + :retroact /*+ :horasex*/)+ :cambsaltrans) * :PORCEN) /100;
       END
       ELSE
       IF ((conc_cod = 916) OR (conc_cod = 917)) THEN
       BEGIN
        SELECT A.paan_icbf FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
        SELECT c.noex_monto FROM nomina_horasext c WHERE c.noex_ano = :ano AND c.noex_periodio = :periodo AND c.noex_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :horasex;
        IF (horasex IS NOT NULL) THEN
        VALOR = (((((:basico )/30 * :diaslab ) + :comision + :horasex + :retroact)+ :cambsaltrans) * :PORCEN) /100;
        ELSE
        VALOR = (((((:basico )/30 * :diaslab ) + :comision + :retroact/*+ :horasex*/)+ :cambsaltrans) * :PORCEN) /100;
       END
       ELSE
       IF ((conc_cod = 918) OR (conc_cod = 919)) THEN
       BEGIN
        SELECT A.paan_sena FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
        SELECT c.noex_monto FROM nomina_horasext c WHERE c.noex_ano = :ano AND c.noex_periodio = :periodo AND c.noex_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :horasex;
        IF (horasex IS NOT NULL) THEN
        VALOR = (((((:basico )/30 * :diaslab ) + :comision + :horasex + :retroact)+ :cambsaltrans) * :PORCEN) /100;
        ELSE
        VALOR = (((((:basico )/30 * :diaslab ) + :comision + :retroact/*+ :horasex*/)+ :cambsaltrans) * :PORCEN) /100;
       END
      END
      ELSE
      IF ((conc_cod = 912) OR (conc_cod = 913)) THEN
      BEGIN
       entidad = :nitafc;
       SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
       IF (comision IS NULL) THEN
       comision = 0;
       IF ((conc_cod = 912) OR (conc_cod = 913) ) THEN
       BEGIN
        SELECT A.paan_cesemp FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
        SELECT c.noex_monto FROM nomina_horasext c WHERE c.noex_ano = :ano AND c.noex_periodio = :periodo AND c.noex_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :horasex;
        IF (horasex IS NOT NULL) THEN
        VALOR = (((((:basico )/30 * :diaslab ) + :comision + :horasex + :retroact)+ :cambsaltrans) * :PORCEN) /100;
        ELSE
        VALOR = (((((:basico )/30 * :diaslab ) + :comision + :retroact/*+ :horasex*/)+ :cambsaltrans) * :PORCEN) /100;
       END
      END
      ELSE
      BEGIN
       IF (comision IS NULL) THEN
       comision = 0;
       SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
       conc_monto = :basico + :comision;
       IF (conc_porc <> 0 AND conc_porc IS NOT NULL) THEN
       VALOR = (((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans) * :conc_porc) /100;
       ELSE
       IF (:porcen <> 0 AND :porcen IS NOT NULL) THEN
       VALOR = (((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans) * :porcen) /100;
       ELSE
       IF (:montos <> 0 AND :montos IS NOT NULL) THEN
       valor = :montos;
       ELSE
       IF (:conc_monto <> 0 AND :conc_monto IS NOT NULL) THEN
       valor = :conc_monto;
      END
     END
     item = :item + 1;
    END
    ELSE
    IF (conc_prov = 'S') THEN
    BEGIN
     conc_monto = :basico;
     IF (conc_porc <> 0 AND conc_porc IS NOT NULL) THEN
     VALOR = (((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans) * :conc_porc) /100;
     ELSE
     IF (porcen <> 0 AND porcen IS NOT NULL) THEN
     VALOR = (((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans) * :porcen) /100;
     ELSE
     IF (montos <> 0 AND montos IS NOT NULL) THEN
     VALOR = :montos;
     ELSE
     IF (conc_monto <> 0 AND conc_monto IS NOT NULL) THEN
     VALOR = :conc_monto;
     item = :item + 1;
    END
    ELSE
    IF (conc_cod = 920) THEN
    BEGIN
     SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :valor;
     IF (valor IS NULL) THEN
     valor = 0;
     item = :item + 1;
    END
    ELSE
    IF (conc_cod = 900 OR (:conc_cod = 931)) THEN
    BEGIN
     SELECT c.noex_monto FROM nomina_horasext c WHERE c.noex_ano = :ano AND c.noex_periodio = :periodo AND c.noex_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :valor;
     IF (valor IS NULL) THEN
     valor = 0;
     item = :item + 1;
    END
    ELSE
    IF (conc_cod = 932) THEN
    BEGIN
     SELECT N.nono_dura FROM NOMINA_NOVEDADES N WHERE N.terc_nit = :nite AND N.nono_periodo = :periodo AND N.nono_ano = :ano INTO :diasnov;
     IF (:diasnov IS NULL) THEN
     valor = 0;
     ELSE
     valor = (:basico / 30)* :diasnov;
    END
    ELSE
    IF (conc_cod = 921) THEN
    BEGIN
     IF (porcen IS NOT NULL AND porcen <> 0) THEN
     valor = ((basico / 30)* :diaslab ) * :PORCEN /100;
     ELSE
     IF (conc_porc IS NOT NULL AND conc_porc <> 0) THEN
     valor = ((basico / 30)* :diaslab ) * :conc_porc /100;
    END
    EXECUTE PROCEDURE LEE_CONFIGURACION('NOMINA','GENERAL','REDONDEO AL MULTIPLO DE DIEZ EN TOTALES')RETURNING_VALUES(:aprox);
    EXECUTE PROCEDURE REDONDEE(:valor, :aprox) RETURNING_VALUES (VALOR);
    IF ((mensual = 'N') OR (periodicidad = 1))  THEN
    INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
    VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
    ELSE
    IF (mensual = 'S') THEN
    BEGIN
     IF ((:periodicidad = 2) AND (liquidaper = 1)) THEN
     BEGIN
      IF ((periodo = 1) OR (periodo = 3) OR (periodo = 5) OR (periodo = 7) OR (periodo = 9) OR (periodo = 11)
      OR (periodo = 13) OR (periodo = 15) OR (periodo = 17) OR (periodo = 19) OR (periodo = 21) OR (periodo = 23)) THEN
      INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
      VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
     END
     ELSE
     IF ((:periodicidad = 2) AND (liquidaper = 2)) THEN
     BEGIN
      IF ((periodo = 2) OR (periodo = 4) OR (periodo = 6) OR (periodo = 8) OR (periodo = 10) OR (periodo = 12)
      OR (periodo = 14) OR (periodo = 16) OR (periodo = 18) OR (periodo = 20) OR (periodo = 22) OR (periodo = 24)) THEN
      INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
      VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
     END
     ELSE
     IF ((:periodicidad = 3) AND (liquidaper = 1)) THEN
     BEGIN
      IF ((periodo = 1) OR (periodo = 5) OR (periodo = 9) OR (periodo = 13) OR (periodo = 17) OR (periodo = 21)
      OR (periodo = 25) OR (periodo = 29) OR (periodo = 33) OR (periodo = 37) OR (periodo = 41) OR (periodo = 45)
      OR (periodo = 49)) THEN
      INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
      VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
    END
    ELSE
     IF ((:periodicidad = 3) AND (liquidaper = 2)) THEN
     BEGIN
      IF ((periodo = 2) OR (periodo = 6) OR (periodo = 10) OR (periodo = 14) OR (periodo = 18) OR (periodo = 22)
      OR (periodo = 26) OR (periodo = 30) OR (periodo = 34) OR (periodo = 38) OR (periodo = 42) OR (periodo = 46)
      OR (periodo = 50)) THEN
      INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
      VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
     END
     ELSE
     IF ((:periodicidad = 3) AND (liquidaper = 3)) THEN
     BEGIN
      IF ((periodo = 3) OR (periodo = 7) OR (periodo = 11) OR (periodo = 15) OR (periodo = 19) OR (periodo = 23)
      OR (periodo = 27) OR (periodo = 31) OR (periodo = 35) OR (periodo = 39) OR (periodo = 43) OR (periodo = 47)
      OR (periodo = 51)) THEN
      INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
      VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
     END
     ELSE
     IF ((:periodicidad = 3) AND (liquidaper = 4)) THEN
     BEGIN
      IF ((periodo = 4) OR (periodo = 8) OR (periodo = 12) OR (periodo = 16) OR (periodo = 20) OR (periodo = 24)
      OR (periodo = 29) OR (periodo = 32) OR (periodo = 36) OR (periodo = 40) OR (periodo = 44) OR (periodo = 48)
      OR (periodo = 52)) THEN
      INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
      VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
     END
    END
  VALOR = 0;
  basico = 0;
   END
  END
 END
 SUSPEND;
END
^

SET TERM ; ^

GRANT ALL ON PERIODO_PAGO_NOMBRE TO PUBLIC;

GRANT ALL ON NOMINA_HORASEXT TO PUBLIC;

GRANT EXECUTE ON PROCEDURE DIAS_LABORADOS TO PUBLIC;

GRANT EXECUTE ON PROCEDURE CAUSA_NOMINA TO PUBLIC;

GRANT EXECUTE ON PROCEDURE ALERTAS_CONTRATO_EMPL TO PUBLIC;

SET TERM ^ ;

ALTER PROCEDURE CAUSA_NOMINA(
    FEC DATE,
    PERIODO INTEGER,
    PERIODICIDAD INTEGER,
    PAGOGLOBAL CHAR(1),
    ANO CHAR(4))
RETURNS (
    IDNOMINA INTEGER)
AS
DECLARE VARIABLE item INTEGER;
DECLARE VARIABLE nite VARCHAR(20) CHARACTER SET none;
DECLARE VARIABLE nit_tercero VARCHAR(20);
DECLARE VARIABLE concept INTEGER;
DECLARE VARIABLE montos NUMERIC(18,2);
DECLARE VARIABLE porcen NUMERIC(9,4);
DECLARE VARIABLE entidad VARCHAR(20);
DECLARE VARIABLE conc_cod INTEGER;
DECLARE VARIABLE conc_deduc CHAR(1);
DECLARE VARIABLE conc_porc NUMERIC(9,4);
DECLARE VARIABLE conc_entidad INTEGER;
DECLARE VARIABLE conc_monto NUMERIC(18,2);
DECLARE VARIABLE conc_modifi CHAR(1);
DECLARE VARIABLE conc_promedio CHAR(1);
DECLARE VARIABLE emco_perprom INTEGER;
DECLARE VARIABLE valor NUMERIC(18,2);
DECLARE VARIABLE diaslab INTEGER;
DECLARE VARIABLE conc_prov CHAR(1);
DECLARE VARIABLE conc_aporte CHAR(1);
DECLARE VARIABLE numeroprom INTEGER;
DECLARE VARIABLE conc_aplicaprom CHAR(1);
DECLARE VARIABLE perinicial INTEGER;
DECLARE VARIABLE anoprom INTEGER;
DECLARE VARIABLE conc_dias CHAR(1);
DECLARE VARIABLE conc_otroconc CHAR(1);
DECLARE VARIABLE conc_codotroconc INTEGER;
DECLARE VARIABLE anosum INTEGER;
DECLARE VARIABLE salario CHAR(1) CHARACTER SET none;
DECLARE VARIABLE liquidaper INTEGER;
DECLARE VARIABLE rmod NUMERIC(2,2);
DECLARE VARIABLE basico NUMERIC(18,2);
DECLARE VARIABLE niteps VARCHAR(20);
DECLARE VARIABLE nitafc VARCHAR(20);
DECLARE VARIABLE nitafp VARCHAR(20);
DECLARE VARIABLE nitccf VARCHAR(20);
DECLARE VARIABLE gtoempr CHAR(1);
DECLARE VARIABLE comision NUMERIC(18,2);
DECLARE VARIABLE cambsaltrans NUMERIC(18,2);
DECLARE VARIABLE saldosini NUMERIC(18,2);
DECLARE VARIABLE duranov INTEGER;
DECLARE VARIABLE base NUMERIC(18,2);
DECLARE VARIABLE aprox INTEGER;
DECLARE VARIABLE mensual CHAR(1);
DECLARE VARIABLE horasex NUMERIC(18,2);
DECLARE VARIABLE diasnov INTEGER;
DECLARE VARIABLE tomasal INTEGER;
DECLARE VARIABLE retroact NUMERIC(18,2);
BEGIN
 EXECUTE PROCEDURE cambie_id_nomina RETURNING_VALUES(:idnomina);
 INSERT INTO nomina (nomi_id, NOMI_FECCAUSA, NOMI_PAGOGLOBAL, NOMI_PERIODOCIDAD, NOMI_PERIODO, NOMI_ANO, NOMI_LIQOK)
 VALUES (:IDNOMINA, :fec,:pagoglobal, :periodicidad, :periodo, :ano, 'N');
 fec = substr(fec,1,8) || (CAST(substr(fec,9,10) AS INTEGER)+1);
 item = 1;
 FOR SELECT E.TERC_NIT, E.empl_salario, e.empl_eps, e.empl_afc, e.empl_afp, e.empl_ccf
 FROM EMPLEADOS E
 WHERE E.empl_ppago = :periodicidad AND E.empl_fecret IS NULL
 INTO :nite, :basico, :niteps, :nitafc, :nitafp, :nitccf
 DO
 BEGIN
  FOR SELECT CE.TERC_NIT, CE.CONC_COD, CE.EMCO_MONTO, CE.EMCO_PORC, ce.empl_entidad, CE.emco_perprom, CE.emco_luquidaper, CE.emco_mensual, CN.CONC_COD, CN.CONC_DEDUC,CN.CONC_PORC, CN.CONC_ENTIDAD, CN.CONC_MONTO,  CN.CONC_DIAS, CN.CONC_MODIFI,
  CN.CONC_PROMEDIO, CN.conc_salario, CE.emco_perprom, CN.conc_prov, CN.conc_aporte, CN.conc_aplicaprom, cn.conc_otroconc, cn.conc_codotroconc, CN.conc_gtoempr, CN.conc_base, CE.emco_tomsal
  FROM empleado_conceptos CE, CONCEPTOS_NOMINA CN WHERE ((CE.terc_nit = :nite) AND (CE.CONC_COD = CN.CONC_COD) AND (CN.conc_fecini <= :fec AND CN.conc_fecfin >= :FEC) ) OR ((CE.terc_nit = :nite)
  AND (CE.CONC_COD = CN.CONC_COD) AND (cn.conc_todosper = 'N') AND (CE.emco_ppago = :periodo)) OR  ((CE.terc_nit = :nite) AND (CE.CONC_COD = CN.CONC_COD) AND cn.conc_todosper = 'S')  ORDER BY (TERC_NIT )
  INTO :nit_tercero, :concept,  :montos, :porcen, :entidad, :numeroprom, :liquidaper, :mensual ,:CONC_COD, :CONC_DEDUC, :CONC_PORC,
  :CONC_ENTIDAD, :CONC_MONTO, :CONC_DIAS, :CONC_MODIFI,:CONC_PROMEDIO, :salario,:EMCO_PERPROM, :conc_prov, :conc_aporte , :CONC_APLICAPROM, :conc_otroconc, :conc_codotroconc, :gtoempr, :base, :tomasal
  DO
  BEGIN
   IF (conc_dias = 'S') THEN
   EXECUTE PROCEDURE DIAS_LABORADOS (:nite, :periodo, :fec, :mensual,:conc_aporte) RETURNING_VALUES (:diaslab);
   ELSE
   BEGIN
    diaslab = 15;
    IF (mensual = 'S') THEN
    BEGIN
     IF (periodicidad = 2) THEN
     diaslab = 30;
     ELSE
     IF (liquidaper = 3) THEN
     diaslab = 30;
    END
   END
   IF (:tomasal <> 0) THEN
   BEGIN
    IF ((:periodicidad = 2) AND (:tomasal <> 2)) THEN
    BEGIN
     IF ((periodo = 2) OR (periodo = 4) OR (periodo = 6) OR (periodo = 8) OR (periodo = 10) OR (periodo = 12)
     OR (periodo = 14) OR (periodo = 16) OR (periodo = 18) OR (periodo = 20) OR (periodo = 22) OR (periodo = 24)) THEN
     basico = 0;
    END
    ELSE
    IF ((:periodicidad = 3) AND (:tomasal <> 1)) THEN
    BEGIN
     IF ((periodo = 1) OR (periodo = 5) OR (periodo = 9) OR (periodo = 13) OR (periodo = 17) OR (periodo = 21)
     OR (periodo = 25) OR (periodo = 29) OR (periodo = 33) OR (periodo = 37) OR (periodo = 41) OR (periodo = 45)
     OR (periodo = 49)) THEN
     basico = 0;
    END
    ELSE
     IF ((:periodicidad = 3) AND (:tomasal <> 2)) THEN
     BEGIN
      IF ((periodo = 2) OR (periodo = 6) OR (periodo = 10) OR (periodo = 14) OR (periodo = 18) OR (periodo = 22)
      OR (periodo = 26) OR (periodo = 30) OR (periodo = 34) OR (periodo = 38) OR (periodo = 42) OR (periodo = 46)
      OR (periodo = 50)) THEN
      basico = 0;
     END
     ELSE
     IF ((:periodicidad = 3) AND (:tomasal <> 3)) THEN
     BEGIN
      IF ((periodo = 3) OR (periodo = 7) OR (periodo = 11) OR (periodo = 15) OR (periodo = 19) OR (periodo = 23)
      OR (periodo = 27) OR (periodo = 31) OR (periodo = 35) OR (periodo = 39) OR (periodo = 43) OR (periodo = 47)
      OR (periodo = 51)) THEN
      basico = 0;
     END
     ELSE
     IF ((:periodicidad = 3) AND (:tomasal <> 4)) THEN
     BEGIN
      IF ((periodo = 4) OR (periodo = 8) OR (periodo = 12) OR (periodo = 16) OR (periodo = 20) OR (periodo = 24)
      OR (periodo = 29) OR (periodo = 32) OR (periodo = 36) OR (periodo = 40) OR (periodo = 44) OR (periodo = 48)
      OR (periodo = 52)) THEN
      basico = 0;
     END
   END
   ELSE
   BEGIN
    SELECT E.empl_salario FROM EMPLEADOS E WHERE E.terc_nit = :nite INTO :basico;
    SELECT ((n.nono_valor /30) * n.nono_dura), (n.nono_dura) FROM nomina_novedades n WHERE n.tnov_cod = 11 AND n.terc_nit = :nite AND n.nono_periodo = :periodo INTO :cambsaltrans, :duranov;
    IF (cambsaltrans IS NULL) THEN
    cambsaltrans = 0;
    IF (duranov IS NULL) THEN
    duranov = 0;
    diaslab = :diaslab - :duranov;
    IF (conc_cod = 922) THEN
    BEGIN
     SELECT sum(P.prcu_monto) FROM prestamo_cuotas P, prestamo_nomina PN WHERE P.prcu_ano = :ano AND P.prcu_periodo = :periodo AND PN.prno_id = P.prno_id AND PN.terc_nit = :nite INTO :valor;
     IF (valor IS NULL) THEN
     valor = 0;
     item = :item + 1;
     UPDATE prestamo_cuotas  P SET prcu_ok = 'S' WHERE P.prcu_ano = :ano AND P.prcu_periodo = :periodo AND P.prno_id = (SELECT PN.prno_id FROM PRESTAMO_NOMINA PN WHERE PN.terc_nit = :nite);
    END
    ELSE
    IF ((:montos = 0) OR (:montos IS NULL)) THEN
    BEGIN
     IF ((CONC_PORC = 0 AND :porcen = 0) OR (CONC_PORC IS NULL AND :porcen = 0) OR (CONC_PORC = 0 AND :porcen IS NULL) OR (CONC_PORC IS NULL AND :porcen IS NULL) ) THEN
     BEGIN
      IF ((conc_monto <> 0) AND (conc_monto IS NOT NULL) ) THEN
      BEGIN
       VALOR = :CONC_MONTO;
       IF (:conc_dias = 'S') THEN
       valor = (:valor / 30) * :diaslab;
      END
      ELSE
      IF (salario = 'S' AND CONC_COD <> 900 AND CONC_COD <> 920) THEN
      BEGIN
       conc_monto = :basico;
       VALOR = (:conc_monto/30 * :diaslab ) + :cambsaltrans;
      END
      ELSE
      BEGIN
       valor = montos;
       IF (:conc_dias = 'S') THEN
       valor = (:valor / 30) * :diaslab;
      END
     END
     ELSE
     BEGIN
      IF (:porcen <> 0) THEN
      BEGIN
       IF ((conc_monto <> 0) AND (conc_monto IS NOT NULL) ) THEN
       BEGIN
        VALOR = ((:CONC_MONTO ) * :PORCEN) /100;
       END
      END
      ELSE
      BEGIN
       IF ((conc_monto <> 0) AND (conc_monto IS NOT NULL) ) THEN
       BEGIN
        VALOR = ((:CONC_MONTO) * :conc_porc) /100;
       END
       ELSE
       IF (salario = 'S' AND CONC_COD <> 900 AND CONC_COD <> 920) THEN
       BEGIN
        conc_monto = :basico;
        VALOR = ((:CONC_MONTO)+ :cambsaltrans * :conc_porc) /100;
       END
       ELSE
       IF (:conc_monto = 0 AND :montos = 0) THEN
       BEGIN
        conc_monto = :basico;
        VALOR = (((:CONC_MONTO / 30) * :diaslab) + :cambsaltrans * :conc_porc) /100;
       END
      END
     END
    END
    ELSE
    IF ((CONC_PORC = 0 OR (conc_porc IS NULL)) AND (:porcen = 0 OR (porcen IS NULL))) THEN
    BEGIN
     VALOR = (:montos);
     IF (:conc_dias = 'S') THEN
     valor = (:valor / 30) * :diaslab;
    END
    ELSE
    IF (:porcen <> 0 AND porcen IS NOT NULL) THEN
    BEGIN
     VALOR = ((:MONTOS ) * :PORCEN) /100;
    END
    ELSE
    BEGIN
     VALOR = ((:montos) * :CONC_PORC) /100;
    END
    IF (conc_promedio = 'S') THEN
    BEGIN
     perinicial = :periodo - (:numeroprom) + 1;
     anoprom = CAST (ano AS INTEGER);
     IF (perinicial <= 0) THEN
     BEGIN
      perinicial = 24 + :PERINICIAL;
      anoprom = CAST(ANO AS INTEGER) - 1;
     END
     SELECT SUM (noco_valor) FROM nomina_conceptos n WHERE n.noco_aplicaprom = 'S' AND N.noco_periodo >= :perinicial - 1 AND N.noco_periodo < :periodo AND N.noco_ano >= :anoprom AND N.noco_ano <= :ano AND terc_nit = :nite INTO :valor;
     valor = (valor / numeroprom);
     SELECT NOCO_VALOR FROM NOMINA_CONCEPTOS WHERE CONC_COD = :conc_cod AND TERC_NIT  = :nite AND NOCO_PAGOOK = 'N' AND NOCO_PERIODO = 0 INTO :saldosini;
     IF (saldosini IS NULL) THEN
     saldosini = 0;
     ELSE
     UPDATE nomina_conceptos N SET noco_pagook = 'S' WHERE n.noco_aplicaprom = 'S' AND N.noco_periodo >= :perinicial - 1 AND N.noco_periodo < :periodo AND N.noco_ano >= :anoprom AND N.noco_ano <= :ano  AND CONC_COD = :conc_cod AND terc_nit = :nite AND NOCO_PERIODO = 0;
     VALOR = :valor + :saldosini;
     UPDATE nomina_conceptos N SET noco_pagook = 'S' WHERE n.noco_aplicaprom = 'S' AND N.noco_periodo >= :perinicial - 1 AND N.noco_periodo < :periodo AND N.noco_ano >= :anoprom AND N.noco_ano <= :ano  AND CONC_COD = :conc_cod AND terc_nit = :nite;
    END
    ELSE
    IF (conc_otroconc = 'S') THEN
    BEGIN
     anosum = CAST(ano AS INTEGER);
     anosum = anosum - 1;
     SELECT SUM (noco_valor) FROM nomina_conceptos n WHERE n.noco_ano = :anosum AND n.conc_cod = :conc_codotroconc AND N.terc_nit = :nite INTO :valor;
     SELECT NOCO_VALOR FROM NOMINA_CONCEPTOS WHERE noco_ano = :anosum AND conc_cod = :conc_codotroconc AND terc_nit = :nite AND NOCO_PERIODO = 0 INTO :saldosini;
     IF (saldosini IS NULL) THEN
     saldosini = 0;
     ELSE
     UPDATE nomina_conceptos SET noco_pagook = 'S' WHERE noco_ano = :anosum AND conc_cod = :conc_codotroconc AND NOCO_PERIODO = 0 AND terc_nit = :nite;
     VALOR = :valor + :saldosini;
     UPDATE nomina_conceptos SET noco_pagook = 'S' WHERE noco_ano = :anosum AND conc_cod = :conc_codotroconc AND terc_nit = :nite;
    END
    ELSE
    IF (conc_aporte = 'S') THEN
    BEGIN
     horasex = NULL;
     diasnov = NULL;
     IF ((:entidad = '' ) OR (entidad IS NULL)) THEN
     BEGIN
      SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
      IF (comision IS NULL) THEN
      comision = 0;
      SELECT C.emco_monto FROM EMPLEADO_CONCEPTOS C WHERE C.terc_nit = :nite AND C.conc_cod = 933 INTO :retroact;
      IF (retroact IS NULL ) THEN
      retroact = 0;
      valor = :basico + :comision + :horasex + :retroact;
      SELECT n.nono_dura FROM nomina_novedades n WHERE n.terc_nit = :nite AND n.tnov_cod = 6 AND n.nono_periodo = :periodo AND n.nono_ano = :ano INTO :diasnov;
      IF (diasnov IS NULL) THEN
      diasnov = 0;
      IF ((diasnov IS NOT NULL) AND (diasnov <> 0)) THEN
      diaslab = :diaslab - :diasnov;
      IF ((conc_cod = 904) OR (conc_cod = 905) OR (conc_cod = 906)) THEN
      BEGIN
       entidad = :nitafp;
       IF (conc_cod = 904) THEN
       BEGIN
        SELECT A.paan_afptr FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
        SELECT c.noex_monto FROM nomina_horasext c WHERE c.noex_ano = :ano AND c.noex_periodio = :periodo AND c.noex_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :horasex;
        IF (horasex IS NOT NULL) THEN
        VALOR = (((((:basico )/30 * :diaslab ) + :comision + :horasex + :retroact)+ :cambsaltrans) * :PORCEN) /100;
        ELSE
        VALOR = (((((:basico )/30 * :diaslab ) + :comision + :retroact)+ :cambsaltrans) * :PORCEN) /100;
       END
       ELSE
       IF ((conc_cod = 905) OR (conc_cod = 906)) THEN
       BEGIN
        SELECT A.paan_afpem FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
        SELECT c.noex_monto FROM nomina_horasext c WHERE c.noex_ano = :ano AND c.noex_periodio = :periodo AND c.noex_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :horasex;
        IF (horasex IS NOT NULL) THEN
        VALOR = (((((:basico )/30 * :diaslab ) + :comision + :horasex + :retroact)+ :cambsaltrans) * :PORCEN) /100;
        ELSE
        VALOR = (((((:basico )/30 * :diaslab ) + :comision + :retroact)+ :cambsaltrans) * :PORCEN) /100;
       END
      END
      ELSE
      IF ((conc_cod = 907) OR (conc_cod = 914) OR (conc_cod = 915)) THEN
      BEGIN
       entidad = :niteps;
       IF (conc_cod = 907) THEN
       BEGIN
        SELECT A.paan_epstr FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
        SELECT c.noex_monto FROM nomina_horasext c WHERE c.noex_ano = :ano AND c.noex_periodio = :periodo AND c.noex_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :horasex;
        IF (horasex IS NOT NULL) THEN
        VALOR = (((((:basico )/30 * :diaslab ) + :comision + :horasex + :retroact)+ :cambsaltrans) * :PORCEN) /100;
        ELSE
        VALOR = (((((:basico )/30 * :diaslab ) + :comision + :retroact)+ :cambsaltrans) * :PORCEN) /100;
       END
       ELSE
       IF ((conc_cod = 914) OR (conc_cod = 915)) THEN
       BEGIN
        SELECT A.paan_epsem FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
        SELECT c.noex_monto FROM nomina_horasext c WHERE c.noex_ano = :ano AND c.noex_periodio = :periodo AND c.noex_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :horasex;
        IF (horasex IS NOT NULL) THEN
        VALOR = (((((:basico )/30 * :diaslab ) + :comision + :horasex + :retroact)+ :cambsaltrans) * :PORCEN) /100;
        ELSE
        VALOR = (((((:basico )/30 * :diaslab ) + :comision + :retroact)+ :cambsaltrans) * :PORCEN) /100;
       END
      END
      ELSE
      IF ((conc_cod = 910) OR (conc_cod = 911) OR (conc_cod = 916) OR (conc_cod = 917) OR (conc_cod = 918) OR (conc_cod = 919)) THEN
      BEGIN
       entidad = :nitccf;
       SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
       IF (comision IS NULL) THEN
       comision = 0;
       IF ((conc_cod = 910) OR (conc_cod = 911) ) THEN
       BEGIN
        SELECT A.paan_ccf FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
        SELECT c.noex_monto FROM nomina_horasext c WHERE c.noex_ano = :ano AND c.noex_periodio = :periodo AND c.noex_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :horasex;
        IF (horasex IS NOT NULL) THEN
        VALOR = (((((:basico )/30 * :diaslab ) + :comision + :horasex + :retroact)+ :cambsaltrans) * :PORCEN) /100;
        ELSE
        VALOR = (((((:basico )/30 * :diaslab ) + :comision + :retroact /*+ :horasex*/)+ :cambsaltrans) * :PORCEN) /100;
       END
       ELSE
       IF ((conc_cod = 916) OR (conc_cod = 917)) THEN
       BEGIN
        SELECT A.paan_icbf FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
        SELECT c.noex_monto FROM nomina_horasext c WHERE c.noex_ano = :ano AND c.noex_periodio = :periodo AND c.noex_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :horasex;
        IF (horasex IS NOT NULL) THEN
        VALOR = (((((:basico )/30 * :diaslab ) + :comision + :horasex + :retroact)+ :cambsaltrans) * :PORCEN) /100;
        ELSE
        VALOR = (((((:basico )/30 * :diaslab ) + :comision + :retroact/*+ :horasex*/)+ :cambsaltrans) * :PORCEN) /100;
       END
       ELSE
       IF ((conc_cod = 918) OR (conc_cod = 919)) THEN
       BEGIN
        SELECT A.paan_sena FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
        SELECT c.noex_monto FROM nomina_horasext c WHERE c.noex_ano = :ano AND c.noex_periodio = :periodo AND c.noex_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :horasex;
        IF (horasex IS NOT NULL) THEN
        VALOR = (((((:basico )/30 * :diaslab ) + :comision + :horasex + :retroact)+ :cambsaltrans) * :PORCEN) /100;
        ELSE
        VALOR = (((((:basico )/30 * :diaslab ) + :comision + :retroact/*+ :horasex*/)+ :cambsaltrans) * :PORCEN) /100;
       END
      END
      ELSE
      IF ((conc_cod = 912) OR (conc_cod = 913)) THEN
      BEGIN
       entidad = :nitafc;
       SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
       IF (comision IS NULL) THEN
       comision = 0;
       IF ((conc_cod = 912) OR (conc_cod = 913) ) THEN
       BEGIN
        SELECT A.paan_cesemp FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
        SELECT c.noex_monto FROM nomina_horasext c WHERE c.noex_ano = :ano AND c.noex_periodio = :periodo AND c.noex_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :horasex;
        IF (horasex IS NOT NULL) THEN
        VALOR = (((((:basico )/30 * :diaslab ) + :comision + :horasex + :retroact)+ :cambsaltrans) * :PORCEN) /100;
        ELSE
        VALOR = (((((:basico )/30 * :diaslab ) + :comision + :retroact/*+ :horasex*/)+ :cambsaltrans) * :PORCEN) /100;
       END
      END
      ELSE
      BEGIN
       IF (comision IS NULL) THEN
       comision = 0;
       SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
       conc_monto = :basico + :comision;
       IF (conc_porc <> 0 AND conc_porc IS NOT NULL) THEN
       VALOR = (((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans) * :conc_porc) /100;
       ELSE
       IF (:porcen <> 0 AND :porcen IS NOT NULL) THEN
       VALOR = (((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans) * :porcen) /100;
       ELSE
       IF (:montos <> 0 AND :montos IS NOT NULL) THEN
       valor = :montos;
       ELSE
       IF (:conc_monto <> 0 AND :conc_monto IS NOT NULL) THEN
       valor = :conc_monto;
      END
     END
     item = :item + 1;
    END
    ELSE
    IF (conc_prov = 'S') THEN
    BEGIN
     conc_monto = :basico;
     IF (conc_porc <> 0 AND conc_porc IS NOT NULL) THEN
     VALOR = (((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans) * :conc_porc) /100;
     ELSE
     IF (porcen <> 0 AND porcen IS NOT NULL) THEN
     VALOR = (((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans) * :porcen) /100;
     ELSE
     IF (montos <> 0 AND montos IS NOT NULL) THEN
     VALOR = :montos;
     ELSE
     IF (conc_monto <> 0 AND conc_monto IS NOT NULL) THEN
     VALOR = :conc_monto;
     item = :item + 1;
    END
    ELSE
    IF (conc_cod = 920) THEN
    BEGIN
     SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :valor;
     IF (valor IS NULL) THEN
     valor = 0;
     item = :item + 1;
    END
    ELSE
    IF (conc_cod = 900 OR (:conc_cod = 931)) THEN
    BEGIN
     SELECT c.noex_monto FROM nomina_horasext c WHERE c.noex_ano = :ano AND c.noex_periodio = :periodo AND c.noex_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :valor;
     IF (valor IS NULL) THEN
     valor = 0;
     item = :item + 1;
    END
    ELSE
    IF (conc_cod = 932) THEN
    BEGIN
     SELECT N.nono_dura FROM NOMINA_NOVEDADES N WHERE N.terc_nit = :nite AND N.nono_periodo = :periodo AND N.nono_ano = :ano INTO :diasnov;
     IF (:diasnov IS NULL) THEN
     valor = 0;
     ELSE
     valor = (:basico / 30)* :diasnov;
    END
    ELSE
    IF (conc_cod = 921) THEN
    BEGIN
     IF (porcen IS NOT NULL AND porcen <> 0) THEN
     valor = ((basico / 30)* :diaslab ) * :PORCEN /100;
     ELSE
     IF (conc_porc IS NOT NULL AND conc_porc <> 0) THEN
     valor = ((basico / 30)* :diaslab ) * :conc_porc /100;
    END
    EXECUTE PROCEDURE LEE_CONFIGURACION('NOMINA','GENERAL','REDONDEO AL MULTIPLO DE DIEZ EN TOTALES')RETURNING_VALUES(:aprox);
    EXECUTE PROCEDURE REDONDEE(:valor, :aprox) RETURNING_VALUES (VALOR);
    IF ((mensual = 'N') OR (periodicidad = 1))  THEN
    INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
    VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
    ELSE
    IF (mensual = 'S') THEN
    BEGIN
     IF ((:periodicidad = 2) AND (liquidaper = 1)) THEN
     BEGIN
      IF ((periodo = 1) OR (periodo = 3) OR (periodo = 5) OR (periodo = 7) OR (periodo = 9) OR (periodo = 11)
      OR (periodo = 13) OR (periodo = 15) OR (periodo = 17) OR (periodo = 19) OR (periodo = 21) OR (periodo = 23)) THEN
      INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
      VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
     END
     ELSE
     IF ((:periodicidad = 2) AND (liquidaper = 2)) THEN
     BEGIN
      IF ((periodo = 2) OR (periodo = 4) OR (periodo = 6) OR (periodo = 8) OR (periodo = 10) OR (periodo = 12)
      OR (periodo = 14) OR (periodo = 16) OR (periodo = 18) OR (periodo = 20) OR (periodo = 22) OR (periodo = 24)) THEN
      INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
      VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
     END
     ELSE
     IF ((:periodicidad = 3) AND (liquidaper = 1)) THEN
     BEGIN
      IF ((periodo = 1) OR (periodo = 5) OR (periodo = 9) OR (periodo = 13) OR (periodo = 17) OR (periodo = 21)
      OR (periodo = 25) OR (periodo = 29) OR (periodo = 33) OR (periodo = 37) OR (periodo = 41) OR (periodo = 45)
      OR (periodo = 49)) THEN
      INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
      VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
    END
    ELSE
     IF ((:periodicidad = 3) AND (liquidaper = 2)) THEN
     BEGIN
      IF ((periodo = 2) OR (periodo = 6) OR (periodo = 10) OR (periodo = 14) OR (periodo = 18) OR (periodo = 22)
      OR (periodo = 26) OR (periodo = 30) OR (periodo = 34) OR (periodo = 38) OR (periodo = 42) OR (periodo = 46)
      OR (periodo = 50)) THEN
      INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
      VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
     END
     ELSE
     IF ((:periodicidad = 3) AND (liquidaper = 3)) THEN
     BEGIN
      IF ((periodo = 3) OR (periodo = 7) OR (periodo = 11) OR (periodo = 15) OR (periodo = 19) OR (periodo = 23)
      OR (periodo = 27) OR (periodo = 31) OR (periodo = 35) OR (periodo = 39) OR (periodo = 43) OR (periodo = 47)
      OR (periodo = 51)) THEN
      INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
      VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
     END
     ELSE
     IF ((:periodicidad = 3) AND (liquidaper = 4)) THEN
     BEGIN
      IF ((periodo = 4) OR (periodo = 8) OR (periodo = 12) OR (periodo = 16) OR (periodo = 20) OR (periodo = 24)
      OR (periodo = 29) OR (periodo = 32) OR (periodo = 36) OR (periodo = 40) OR (periodo = 44) OR (periodo = 48)
      OR (periodo = 52)) THEN
      INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
      VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
     END
    END
  VALOR = 0;
  basico = 0;
   END
  END
 END
 SUSPEND;
END
^

SET TERM ; ^


SET TERM ^ ;

ALTER PROCEDURE CAUSA_NOMINA(
    FEC DATE,
    PERIODO INTEGER,
    PERIODICIDAD INTEGER,
    PAGOGLOBAL CHAR(1),
    ANO CHAR(4))
RETURNS (
    IDNOMINA INTEGER)
AS
DECLARE VARIABLE item INTEGER;
DECLARE VARIABLE nite VARCHAR(20) CHARACTER SET none;
DECLARE VARIABLE nit_tercero VARCHAR(20);
DECLARE VARIABLE concept INTEGER;
DECLARE VARIABLE montos NUMERIC(18,2);
DECLARE VARIABLE porcen NUMERIC(9,4);
DECLARE VARIABLE entidad VARCHAR(20);
DECLARE VARIABLE conc_cod INTEGER;
DECLARE VARIABLE conc_deduc CHAR(1);
DECLARE VARIABLE conc_porc NUMERIC(9,4);
DECLARE VARIABLE conc_entidad INTEGER;
DECLARE VARIABLE conc_monto NUMERIC(18,2);
DECLARE VARIABLE conc_modifi CHAR(1);
DECLARE VARIABLE conc_promedio CHAR(1);
DECLARE VARIABLE emco_perprom INTEGER;
DECLARE VARIABLE valor NUMERIC(18,2);
DECLARE VARIABLE diaslab INTEGER;
DECLARE VARIABLE conc_prov CHAR(1);
DECLARE VARIABLE conc_aporte CHAR(1);
DECLARE VARIABLE numeroprom INTEGER;
DECLARE VARIABLE conc_aplicaprom CHAR(1);
DECLARE VARIABLE perinicial INTEGER;
DECLARE VARIABLE anoprom INTEGER;
DECLARE VARIABLE conc_dias CHAR(1);
DECLARE VARIABLE conc_otroconc CHAR(1);
DECLARE VARIABLE conc_codotroconc INTEGER;
DECLARE VARIABLE anosum INTEGER;
DECLARE VARIABLE salario CHAR(1) CHARACTER SET none;
DECLARE VARIABLE liquidaper INTEGER;
DECLARE VARIABLE rmod NUMERIC(2,2);
DECLARE VARIABLE basico NUMERIC(18,2);
DECLARE VARIABLE niteps VARCHAR(20);
DECLARE VARIABLE nitafc VARCHAR(20);
DECLARE VARIABLE nitafp VARCHAR(20);
DECLARE VARIABLE nitccf VARCHAR(20);
DECLARE VARIABLE gtoempr CHAR(1);
DECLARE VARIABLE comision NUMERIC(18,2);
DECLARE VARIABLE cambsaltrans NUMERIC(18,2);
DECLARE VARIABLE saldosini NUMERIC(18,2);
DECLARE VARIABLE duranov INTEGER;
DECLARE VARIABLE base NUMERIC(18,2);
DECLARE VARIABLE aprox INTEGER;
DECLARE VARIABLE mensual CHAR(1);
DECLARE VARIABLE horasex NUMERIC(18,2);
DECLARE VARIABLE diasnov INTEGER;
DECLARE VARIABLE tomasal INTEGER;
DECLARE VARIABLE retroact NUMERIC(18,2);
DECLARE VARIABLE incap NUMERIC(18,2);
BEGIN
 EXECUTE PROCEDURE cambie_id_nomina RETURNING_VALUES(:idnomina);
 INSERT INTO nomina (nomi_id, NOMI_FECCAUSA, NOMI_PAGOGLOBAL, NOMI_PERIODOCIDAD, NOMI_PERIODO, NOMI_ANO, NOMI_LIQOK)
 VALUES (:IDNOMINA, :fec,:pagoglobal, :periodicidad, :periodo, :ano, 'N');
 fec = substr(fec,1,8) || (CAST(substr(fec,9,10) AS INTEGER)+1);
 item = 1;
 FOR SELECT E.TERC_NIT, E.empl_salario, e.empl_eps, e.empl_afc, e.empl_afp, e.empl_ccf
 FROM EMPLEADOS E
 WHERE E.empl_ppago = :periodicidad AND E.empl_fecret IS NULL
 INTO :nite, :basico, :niteps, :nitafc, :nitafp, :nitccf
 DO
 BEGIN
  FOR SELECT CE.TERC_NIT, CE.CONC_COD, CE.EMCO_MONTO, CE.EMCO_PORC, ce.empl_entidad, CE.emco_perprom, CE.emco_luquidaper, CE.emco_mensual, CN.CONC_COD, CN.CONC_DEDUC,CN.CONC_PORC, CN.CONC_ENTIDAD, CN.CONC_MONTO,  CN.CONC_DIAS, CN.CONC_MODIFI,
  CN.CONC_PROMEDIO, CN.conc_salario, CE.emco_perprom, CN.conc_prov, CN.conc_aporte, CN.conc_aplicaprom, cn.conc_otroconc, cn.conc_codotroconc, CN.conc_gtoempr, CN.conc_base, CE.emco_tomsal
  FROM empleado_conceptos CE, CONCEPTOS_NOMINA CN WHERE ((CE.terc_nit = :nite) AND (CE.CONC_COD = CN.CONC_COD) AND (CN.conc_fecini <= :fec AND CN.conc_fecfin >= :FEC) ) OR ((CE.terc_nit = :nite)
  AND (CE.CONC_COD = CN.CONC_COD) AND (cn.conc_todosper = 'N') AND (CE.emco_ppago = :periodo)) OR  ((CE.terc_nit = :nite) AND (CE.CONC_COD = CN.CONC_COD) AND cn.conc_todosper = 'S')  ORDER BY (TERC_NIT )
  INTO :nit_tercero, :concept,  :montos, :porcen, :entidad, :numeroprom, :liquidaper, :mensual ,:CONC_COD, :CONC_DEDUC, :CONC_PORC,
  :CONC_ENTIDAD, :CONC_MONTO, :CONC_DIAS, :CONC_MODIFI,:CONC_PROMEDIO, :salario,:EMCO_PERPROM, :conc_prov, :conc_aporte , :CONC_APLICAPROM, :conc_otroconc, :conc_codotroconc, :gtoempr, :base, :tomasal
  DO
  BEGIN
   IF (conc_dias = 'S') THEN
   EXECUTE PROCEDURE DIAS_LABORADOS (:nite, :periodo, :fec, :mensual,:conc_aporte) RETURNING_VALUES (:diaslab);
   ELSE
   BEGIN
    diaslab = 15;
    IF (mensual = 'S') THEN
    BEGIN
     IF (periodicidad = 2) THEN
     diaslab = 30;
     ELSE
     IF (liquidaper = 3) THEN
     diaslab = 30;
    END
   END
   IF (:tomasal <> 0) THEN
   BEGIN
    IF ((:periodicidad = 2) AND (:tomasal <> 2)) THEN
    BEGIN
     IF ((periodo = 2) OR (periodo = 4) OR (periodo = 6) OR (periodo = 8) OR (periodo = 10) OR (periodo = 12)
     OR (periodo = 14) OR (periodo = 16) OR (periodo = 18) OR (periodo = 20) OR (periodo = 22) OR (periodo = 24)) THEN
     basico = 0;
    END
    ELSE
    IF ((:periodicidad = 3) AND (:tomasal <> 1)) THEN
    BEGIN
     IF ((periodo = 1) OR (periodo = 5) OR (periodo = 9) OR (periodo = 13) OR (periodo = 17) OR (periodo = 21)
     OR (periodo = 25) OR (periodo = 29) OR (periodo = 33) OR (periodo = 37) OR (periodo = 41) OR (periodo = 45)
     OR (periodo = 49)) THEN
     basico = 0;
    END
    ELSE
     IF ((:periodicidad = 3) AND (:tomasal <> 2)) THEN
     BEGIN
      IF ((periodo = 2) OR (periodo = 6) OR (periodo = 10) OR (periodo = 14) OR (periodo = 18) OR (periodo = 22)
      OR (periodo = 26) OR (periodo = 30) OR (periodo = 34) OR (periodo = 38) OR (periodo = 42) OR (periodo = 46)
      OR (periodo = 50)) THEN
      basico = 0;
     END
     ELSE
     IF ((:periodicidad = 3) AND (:tomasal <> 3)) THEN
     BEGIN
      IF ((periodo = 3) OR (periodo = 7) OR (periodo = 11) OR (periodo = 15) OR (periodo = 19) OR (periodo = 23)
      OR (periodo = 27) OR (periodo = 31) OR (periodo = 35) OR (periodo = 39) OR (periodo = 43) OR (periodo = 47)
      OR (periodo = 51)) THEN
      basico = 0;
     END
     ELSE
     IF ((:periodicidad = 3) AND (:tomasal <> 4)) THEN
     BEGIN
      IF ((periodo = 4) OR (periodo = 8) OR (periodo = 12) OR (periodo = 16) OR (periodo = 20) OR (periodo = 24)
      OR (periodo = 29) OR (periodo = 32) OR (periodo = 36) OR (periodo = 40) OR (periodo = 44) OR (periodo = 48)
      OR (periodo = 52)) THEN
      basico = 0;
     END
   END
   ELSE
   BEGIN
    SELECT E.empl_salario FROM EMPLEADOS E WHERE E.terc_nit = :nite INTO :basico;
    SELECT ((n.nono_valor /30) * n.nono_dura), (n.nono_dura) FROM nomina_novedades n WHERE n.tnov_cod = 11 AND n.terc_nit = :nite AND n.nono_periodo = :periodo INTO :cambsaltrans, :duranov;
    IF (cambsaltrans IS NULL) THEN
    cambsaltrans = 0;
    IF (duranov IS NULL) THEN
    duranov = 0;
    diaslab = :diaslab - :duranov;
    IF (conc_cod = 922) THEN
    BEGIN
     SELECT SUM(P.prcu_monto) FROM prestamo_cuotas P, prestamo_nomina PN WHERE P.prcu_ano = :ano AND P.prcu_periodo = :periodo AND PN.prno_id = P.prno_id AND PN.terc_nit = :nite INTO :valor;
     IF (valor IS NULL) THEN
     valor = 0;
     item = :item + 1;
     UPDATE prestamo_cuotas  P SET prcu_ok = 'S' WHERE P.prcu_ano = :ano AND P.prcu_periodo = :periodo AND P.prno_id = (SELECT PN.prno_id FROM PRESTAMO_NOMINA PN WHERE PN.terc_nit = :nite);
    END
    ELSE
    IF ((:montos = 0) OR (:montos IS NULL)) THEN
    BEGIN
     IF ((CONC_PORC = 0 AND :porcen = 0) OR (CONC_PORC IS NULL AND :porcen = 0) OR (CONC_PORC = 0 AND :porcen IS NULL) OR (CONC_PORC IS NULL AND :porcen IS NULL) ) THEN
     BEGIN
      IF ((conc_monto <> 0) AND (conc_monto IS NOT NULL) ) THEN
      BEGIN
       VALOR = :CONC_MONTO;
       IF (:conc_dias = 'S') THEN
       valor = (:valor / 30) * :diaslab;
      END
      ELSE
      IF (salario = 'S' AND CONC_COD <> 900 AND CONC_COD <> 920) THEN
      BEGIN
       conc_monto = :basico;
       VALOR = (:conc_monto/30 * :diaslab ) + :cambsaltrans;
      END
      ELSE
      BEGIN
       valor = montos;
       IF (:conc_dias = 'S') THEN
       valor = (:valor / 30) * :diaslab;
      END
     END
     ELSE
     BEGIN
      IF (:porcen <> 0) THEN
      BEGIN
       IF ((conc_monto <> 0) AND (conc_monto IS NOT NULL) ) THEN
       BEGIN
        VALOR = ((:CONC_MONTO ) * :PORCEN) /100;
       END
      END
      ELSE
      BEGIN
       IF ((conc_monto <> 0) AND (conc_monto IS NOT NULL) ) THEN
       BEGIN
        VALOR = ((:CONC_MONTO) * :conc_porc) /100;
       END
       ELSE
       IF (salario = 'S' AND CONC_COD <> 900 AND CONC_COD <> 920) THEN
       BEGIN
        conc_monto = :basico;
        VALOR = ((:CONC_MONTO)+ :cambsaltrans * :conc_porc) /100;
       END
       ELSE
       IF (:conc_monto = 0 AND :montos = 0) THEN
       BEGIN
        conc_monto = :basico;
        VALOR = (((:CONC_MONTO / 30) * :diaslab) + :cambsaltrans * :conc_porc) /100;
       END
      END
     END
    END
    ELSE
    IF ((CONC_PORC = 0 OR (conc_porc IS NULL)) AND (:porcen = 0 OR (porcen IS NULL))) THEN
    BEGIN
     VALOR = (:montos);
     IF (:conc_dias = 'S') THEN
     valor = (:valor / 30) * :diaslab;
    END
    ELSE
    IF (:porcen <> 0 AND porcen IS NOT NULL) THEN
    BEGIN
     VALOR = ((:MONTOS ) * :PORCEN) /100;
    END
    ELSE
    BEGIN
     VALOR = ((:montos) * :CONC_PORC) /100;
    END
    IF (conc_promedio = 'S') THEN
    BEGIN
     perinicial = :periodo - (:numeroprom) + 1;
     anoprom = CAST (ano AS INTEGER);
     IF (perinicial <= 0) THEN
     BEGIN
      perinicial = 24 + :PERINICIAL;
      anoprom = CAST(ANO AS INTEGER) - 1;
     END
     SELECT SUM (noco_valor) FROM nomina_conceptos n WHERE n.noco_aplicaprom = 'S' AND N.noco_periodo >= :perinicial - 1 AND N.noco_periodo < :periodo AND N.noco_ano >= :anoprom AND N.noco_ano <= :ano AND terc_nit = :nite INTO :valor;
     valor = (valor / numeroprom);
     SELECT NOCO_VALOR FROM NOMINA_CONCEPTOS WHERE CONC_COD = :conc_cod AND TERC_NIT  = :nite AND NOCO_PAGOOK = 'N' AND NOCO_PERIODO = 0 INTO :saldosini;
     IF (saldosini IS NULL) THEN
     saldosini = 0;
     ELSE
     UPDATE nomina_conceptos N SET noco_pagook = 'S' WHERE n.noco_aplicaprom = 'S' AND N.noco_periodo >= :perinicial - 1 AND N.noco_periodo < :periodo AND N.noco_ano >= :anoprom AND N.noco_ano <= :ano  AND CONC_COD = :conc_cod AND terc_nit = :nite AND NOCO_PERIODO = 0;
     VALOR = :valor + :saldosini;
     UPDATE nomina_conceptos N SET noco_pagook = 'S' WHERE n.noco_aplicaprom = 'S' AND N.noco_periodo >= :perinicial - 1 AND N.noco_periodo < :periodo AND N.noco_ano >= :anoprom AND N.noco_ano <= :ano  AND CONC_COD = :conc_cod AND terc_nit = :nite;
    END
    ELSE
    IF (conc_otroconc = 'S') THEN
    BEGIN
     anosum = CAST(ano AS INTEGER);
     anosum = anosum - 1;
     SELECT SUM (noco_valor) FROM nomina_conceptos n WHERE n.noco_ano = :anosum AND n.conc_cod = :conc_codotroconc AND N.terc_nit = :nite INTO :valor;
     SELECT NOCO_VALOR FROM NOMINA_CONCEPTOS WHERE noco_ano = :anosum AND conc_cod = :conc_codotroconc AND terc_nit = :nite AND NOCO_PERIODO = 0 INTO :saldosini;
     IF (saldosini IS NULL) THEN
     saldosini = 0;
     ELSE
     UPDATE nomina_conceptos SET noco_pagook = 'S' WHERE noco_ano = :anosum AND conc_cod = :conc_codotroconc AND NOCO_PERIODO = 0 AND terc_nit = :nite;
     VALOR = :valor + :saldosini;
     UPDATE nomina_conceptos SET noco_pagook = 'S' WHERE noco_ano = :anosum AND conc_cod = :conc_codotroconc AND terc_nit = :nite;
    END
    ELSE
    IF (conc_aporte = 'S') THEN
    BEGIN
     horasex = NULL;
     diasnov = NULL;
     IF ((:entidad = '' ) OR (entidad IS NULL)) THEN
     BEGIN
      SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
      IF (comision IS NULL) THEN
      comision = 0;
      SELECT C.emco_monto FROM EMPLEADO_CONCEPTOS C WHERE C.terc_nit = :nite AND C.conc_cod = 933 INTO :retroact;
      IF (retroact IS NULL ) THEN
      retroact = 0;
      SELECT N.nono_dura FROM NOMINA_NOVEDADES N WHERE N.terc_nit = :nite AND N.nono_periodo = :periodo AND N.nono_ano = :ano INTO :diasnov;
      IF (:diasnov IS NULL) THEN
      incap = 0;
      ELSE
      incap = (:basico / 30)* :diasnov;
      valor = :basico + :comision + :horasex + :retroact + :incap;
      IF ((conc_cod = 904) OR (conc_cod = 905) OR (conc_cod = 906)) THEN
      BEGIN
       entidad = :nitafp;
       IF (conc_cod = 904) THEN
       BEGIN
        SELECT A.paan_afptr FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
        SELECT N.nono_dura FROM NOMINA_NOVEDADES N WHERE N.terc_nit = :nite AND N.nono_periodo = :periodo AND N.nono_ano = :ano INTO :diasnov;
        IF (:diasnov IS NULL) THEN
        incap = 0;
        ELSE
        incap = (:basico / 30)* :diasnov;
        SELECT c.noex_monto FROM nomina_horasext c WHERE c.noex_ano = :ano AND c.noex_periodio = :periodo AND c.noex_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :horasex;
        IF (horasex IS NOT NULL) THEN
        VALOR = (((((:basico )/30 * :diaslab ) + :comision + :horasex + :retroact+ :incap)+ :cambsaltrans ) * :PORCEN) /100;
        ELSE
        VALOR = ((((:basico)/30 * :diaslab ) + :comision + :retroact+ :cambsaltrans  + :incap) * :PORCEN) /100;
       END
       ELSE
       IF ((conc_cod = 905) OR (conc_cod = 906)) THEN
       BEGIN
        SELECT A.paan_afpem FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
        SELECT N.nono_dura FROM NOMINA_NOVEDADES N WHERE N.terc_nit = :nite AND N.nono_periodo = :periodo AND N.nono_ano = :ano INTO :diasnov;
        IF (:diasnov IS NULL) THEN
        incap = 0;
        ELSE
        incap = (:basico / 30)* :diasnov;
        SELECT c.noex_monto FROM nomina_horasext c WHERE c.noex_ano = :ano AND c.noex_periodio = :periodo AND c.noex_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :horasex;
        IF (horasex IS NOT NULL) THEN
        VALOR = (((((:basico )/30 * :diaslab ) + :comision + :horasex + :retroact)+ :cambsaltrans + :incap) * :PORCEN) /100;
        ELSE
        VALOR = (((((:basico )/30 * :diaslab ) + :comision + :retroact)+ :cambsaltrans + :incap) * :PORCEN) /100;
       END
      END
      ELSE
      IF ((conc_cod = 907) OR (conc_cod = 914) OR (conc_cod = 915)) THEN
      BEGIN
       entidad = :niteps;
       IF (conc_cod = 907) THEN
       BEGIN
        SELECT A.paan_epstr FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
        SELECT N.nono_dura FROM NOMINA_NOVEDADES N WHERE N.terc_nit = :nite AND N.nono_periodo = :periodo AND N.nono_ano = :ano INTO :diasnov;
        IF (:diasnov IS NULL) THEN
        incap = 0;
        ELSE
        incap = (:basico / 30)* :diasnov;
        SELECT c.noex_monto FROM nomina_horasext c WHERE c.noex_ano = :ano AND c.noex_periodio = :periodo AND c.noex_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :horasex;
        IF (horasex IS NOT NULL) THEN
        VALOR = (((((:basico )/30 * :diaslab ) + :comision + :horasex + :retroact)+ :cambsaltrans + :incap) * :PORCEN) /100;
        ELSE
        VALOR = (((((:basico )/30 * :diaslab ) + :comision + :retroact)+ :cambsaltrans + :incap) * :PORCEN) /100;
       END
       ELSE
       IF ((conc_cod = 914) OR (conc_cod = 915)) THEN
       BEGIN
        SELECT A.paan_epsem FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
        SELECT N.nono_dura FROM NOMINA_NOVEDADES N WHERE N.terc_nit = :nite AND N.nono_periodo = :periodo AND N.nono_ano = :ano INTO :diasnov;
        IF (:diasnov IS NULL) THEN
        incap = 0;
        ELSE
        incap = (:basico / 30)* :diasnov;
        SELECT c.noex_monto FROM nomina_horasext c WHERE c.noex_ano = :ano AND c.noex_periodio = :periodo AND c.noex_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :horasex;
        IF (horasex IS NOT NULL) THEN
        VALOR = (((((:basico )/30 * :diaslab ) + :comision + :horasex + :retroact)+ :cambsaltrans + :incap) * :PORCEN) /100;
        ELSE
        VALOR = (((((:basico )/30 * :diaslab ) + :comision + :retroact)+ :cambsaltrans + :incap) * :PORCEN) /100;
       END
      END
      ELSE
      IF ((conc_cod = 910) OR (conc_cod = 911) OR (conc_cod = 916) OR (conc_cod = 917) OR (conc_cod = 918) OR (conc_cod = 919)) THEN
      BEGIN
       entidad = :nitccf;
       SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
       IF (comision IS NULL) THEN
       comision = 0;
       SELECT N.nono_dura FROM NOMINA_NOVEDADES N WHERE N.terc_nit = :nite AND N.nono_periodo = :periodo AND N.nono_ano = :ano INTO :diasnov;
       IF (:diasnov IS NULL) THEN
       incap = 0;
       ELSE
       incap = (:basico / 30)* :diasnov;
       IF ((conc_cod = 910) OR (conc_cod = 911) ) THEN
       BEGIN
        SELECT A.paan_ccf FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
      SELECT N.nono_dura FROM NOMINA_NOVEDADES N WHERE N.terc_nit = :nite AND N.nono_periodo = :periodo AND N.nono_ano = :ano INTO :diasnov;
      IF (:diasnov IS NULL) THEN
      incap = 0;
      ELSE
      incap = (:basico / 30)* :diasnov;
        SELECT c.noex_monto FROM nomina_horasext c WHERE c.noex_ano = :ano AND c.noex_periodio = :periodo AND c.noex_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :horasex;
        IF (horasex IS NOT NULL) THEN
        VALOR = (((((:basico )/30 * :diaslab ) + :comision + :horasex + :retroact)+ :cambsaltrans + :incap) * :PORCEN) /100;
        ELSE
        VALOR = (((((:basico )/30 * :diaslab ) + :comision + :retroact)+ :cambsaltrans + :incap) * :PORCEN) /100;
       END
       ELSE
       IF ((conc_cod = 916) OR (conc_cod = 917)) THEN
       BEGIN
        SELECT A.paan_icbf FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
      SELECT N.nono_dura FROM NOMINA_NOVEDADES N WHERE N.terc_nit = :nite AND N.nono_periodo = :periodo AND N.nono_ano = :ano INTO :diasnov;
      IF (:diasnov IS NULL) THEN
      incap = 0;
      ELSE
      incap = (:basico / 30)* :diasnov;      SELECT N.nono_dura FROM NOMINA_NOVEDADES N WHERE N.terc_nit = :nite AND N.nono_periodo = :periodo AND N.nono_ano = :ano INTO :diasnov;
      IF (:diasnov IS NULL) THEN
      incap = 0;
      ELSE
      incap = (:basico / 30)* :diasnov;
        SELECT c.noex_monto FROM nomina_horasext c WHERE c.noex_ano = :ano AND c.noex_periodio = :periodo AND c.noex_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :horasex;
        IF (horasex IS NOT NULL) THEN
        VALOR = (((((:basico )/30 * :diaslab ) + :comision + :horasex + :retroact)+ :cambsaltrans + :incap) * :PORCEN) /100;
        ELSE
        VALOR = (((((:basico )/30 * :diaslab ) + :comision + :retroact)+ :cambsaltrans + :incap) * :PORCEN) /100;
       END
       ELSE
       IF ((conc_cod = 918) OR (conc_cod = 919)) THEN
       BEGIN
        SELECT A.paan_sena FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
      SELECT N.nono_dura FROM NOMINA_NOVEDADES N WHERE N.terc_nit = :nite AND N.nono_periodo = :periodo AND N.nono_ano = :ano INTO :diasnov;
      IF (:diasnov IS NULL) THEN
      incap = 0;
      ELSE
      incap = (:basico / 30)* :diasnov;
        SELECT c.noex_monto FROM nomina_horasext c WHERE c.noex_ano = :ano AND c.noex_periodio = :periodo AND c.noex_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :horasex;
        IF (horasex IS NOT NULL) THEN
        VALOR = (((((:basico )/30 * :diaslab ) + :comision + :horasex + :retroact)+ :cambsaltrans + :incap) * :PORCEN) /100;
        ELSE
        VALOR = (((((:basico )/30 * :diaslab ) + :comision + :retroact)+ :cambsaltrans + :incap) * :PORCEN) /100;
       END
      END
      ELSE
      IF ((conc_cod = 912) OR (conc_cod = 913)) THEN
      BEGIN
       entidad = :nitafc;
       SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
       IF (comision IS NULL) THEN
       comision = 0;
      SELECT N.nono_dura FROM NOMINA_NOVEDADES N WHERE N.terc_nit = :nite AND N.nono_periodo = :periodo AND N.nono_ano = :ano INTO :diasnov;
      IF (:diasnov IS NULL) THEN
      incap = 0;
      ELSE
      incap = (:basico / 30)* :diasnov;
       IF ((conc_cod = 912) OR (conc_cod = 913) ) THEN
       BEGIN
        SELECT A.paan_cesemp FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
        SELECT c.noex_monto FROM nomina_horasext c WHERE c.noex_ano = :ano AND c.noex_periodio = :periodo AND c.noex_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :horasex;
        IF (horasex IS NOT NULL) THEN
        VALOR = (((((:basico )/30 * :diaslab ) + :comision + :horasex + :retroact)+ :cambsaltrans + :incap) * :PORCEN) /100;
        ELSE
        VALOR = (((((:basico )/30 * :diaslab ) + :comision + :retroact)+ :cambsaltrans + :incap) * :PORCEN) /100;
       END
      END
      ELSE
      BEGIN
       IF (comision IS NULL) THEN
       comision = 0;
       SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
       conc_monto = :basico + :comision;
       IF (conc_porc <> 0 AND conc_porc IS NOT NULL) THEN
       VALOR = (((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans + :incap) * :conc_porc) /100;
       ELSE
       IF (:porcen <> 0 AND :porcen IS NOT NULL) THEN
       VALOR = (((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans + :incap) * :porcen) /100;
       ELSE
       IF (:montos <> 0 AND :montos IS NOT NULL) THEN
       valor = :montos;
       ELSE
       IF (:conc_monto <> 0 AND :conc_monto IS NOT NULL) THEN
       valor = :conc_monto;
      END
     END
     item = :item + 1;
    END
    ELSE
    IF (conc_prov = 'S') THEN
    BEGIN
     conc_monto = :basico;
     IF (conc_porc <> 0 AND conc_porc IS NOT NULL) THEN
     VALOR = (((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans + :incap) * :conc_porc) /100;
     ELSE
     IF (porcen <> 0 AND porcen IS NOT NULL) THEN
     VALOR = (((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans + :incap) * :porcen) /100;
     ELSE
     IF (montos <> 0 AND montos IS NOT NULL) THEN
     VALOR = :montos;
     ELSE
     IF (conc_monto <> 0 AND conc_monto IS NOT NULL) THEN
     VALOR = :conc_monto;
     item = :item + 1;
    END
    ELSE
    IF (conc_cod = 920) THEN
    BEGIN
     SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :valor;
     IF (valor IS NULL) THEN
     valor = 0;
     item = :item + 1;
    END
    ELSE
    IF (conc_cod = 900 OR (:conc_cod = 931)) THEN
    BEGIN
     SELECT c.noex_monto FROM nomina_horasext c WHERE c.noex_ano = :ano AND c.noex_periodio = :periodo AND c.noex_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :valor;
     IF (valor IS NULL) THEN
     valor = 0;
     item = :item + 1;
    END
    ELSE
    IF (conc_cod = 932) THEN
    BEGIN
     SELECT N.nono_dura FROM NOMINA_NOVEDADES N WHERE N.terc_nit = :nite AND N.nono_periodo = :periodo AND N.nono_ano = :ano INTO :diasnov;
     IF (:diasnov IS NULL) THEN
     valor = 0;
     ELSE
     valor = (:basico / 30)* :diasnov;
    END
    ELSE
    IF (conc_cod = 921) THEN
    BEGIN
     IF (porcen IS NOT NULL AND porcen <> 0) THEN
     valor = ((basico / 30)* :diaslab ) * :PORCEN /100;
     ELSE
     IF (conc_porc IS NOT NULL AND conc_porc <> 0) THEN
     valor = ((basico / 30)* :diaslab ) * :conc_porc /100;
    END
    EXECUTE PROCEDURE LEE_CONFIGURACION('NOMINA','GENERAL','REDONDEO AL MULTIPLO DE DIEZ EN TOTALES')RETURNING_VALUES(:aprox);
    EXECUTE PROCEDURE REDONDEE(:valor, :aprox) RETURNING_VALUES (VALOR);
    IF ((mensual = 'N') OR (periodicidad = 1))  THEN
    INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
    VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
    ELSE
    IF (mensual = 'S') THEN
    BEGIN
     IF ((:periodicidad = 2) AND (liquidaper = 1)) THEN
     BEGIN
      IF ((periodo = 1) OR (periodo = 3) OR (periodo = 5) OR (periodo = 7) OR (periodo = 9) OR (periodo = 11)
      OR (periodo = 13) OR (periodo = 15) OR (periodo = 17) OR (periodo = 19) OR (periodo = 21) OR (periodo = 23)) THEN
      INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
      VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
     END
     ELSE
     IF ((:periodicidad = 2) AND (liquidaper = 2)) THEN
     BEGIN
      IF ((periodo = 2) OR (periodo = 4) OR (periodo = 6) OR (periodo = 8) OR (periodo = 10) OR (periodo = 12)
      OR (periodo = 14) OR (periodo = 16) OR (periodo = 18) OR (periodo = 20) OR (periodo = 22) OR (periodo = 24)) THEN
      INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
      VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
     END
     ELSE
     IF ((:periodicidad = 3) AND (liquidaper = 1)) THEN
     BEGIN
      IF ((periodo = 1) OR (periodo = 5) OR (periodo = 9) OR (periodo = 13) OR (periodo = 17) OR (periodo = 21)
      OR (periodo = 25) OR (periodo = 29) OR (periodo = 33) OR (periodo = 37) OR (periodo = 41) OR (periodo = 45)
      OR (periodo = 49)) THEN
      INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
      VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
    END
    ELSE
     IF ((:periodicidad = 3) AND (liquidaper = 2)) THEN
     BEGIN
      IF ((periodo = 2) OR (periodo = 6) OR (periodo = 10) OR (periodo = 14) OR (periodo = 18) OR (periodo = 22)
      OR (periodo = 26) OR (periodo = 30) OR (periodo = 34) OR (periodo = 38) OR (periodo = 42) OR (periodo = 46)
      OR (periodo = 50)) THEN
      INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
      VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
     END
     ELSE
     IF ((:periodicidad = 3) AND (liquidaper = 3)) THEN
     BEGIN
      IF ((periodo = 3) OR (periodo = 7) OR (periodo = 11) OR (periodo = 15) OR (periodo = 19) OR (periodo = 23)
      OR (periodo = 27) OR (periodo = 31) OR (periodo = 35) OR (periodo = 39) OR (periodo = 43) OR (periodo = 47)
      OR (periodo = 51)) THEN
      INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
      VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
     END
     ELSE
     IF ((:periodicidad = 3) AND (liquidaper = 4)) THEN
     BEGIN
      IF ((periodo = 4) OR (periodo = 8) OR (periodo = 12) OR (periodo = 16) OR (periodo = 20) OR (periodo = 24)
      OR (periodo = 29) OR (periodo = 32) OR (periodo = 36) OR (periodo = 40) OR (periodo = 44) OR (periodo = 48)
      OR (periodo = 52)) THEN
      INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
      VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
     END
    END
  VALOR = 0;
  basico = 0;
   END
  END
 END
 SUSPEND;
END
^

SET TERM ; ^


SET TERM ^ ;

CREATE OR ALTER PROCEDURE CONS_SALDOSINI_NOMINA
RETURNS (
    EMPLNIT VARCHAR(20),
    EMPLNOM VARCHAR(60),
    PRIMAJUNIO NUMERIC(18,2),
    CONC_CODPRIMAJUN INTEGER,
    PRIMADIC NUMERIC(18,2),
    CONC_CODPRIMADIC INTEGER,
    CESANTIA NUMERIC(18,2),
    CONC_CODCESAN INTEGER,
    VACAC NUMERIC(18,2),
    CONC_CODVACACI INTEGER,
    INTCES NUMERIC(18,2),
    CONC_CODINTCES INTEGER)
AS
DECLARE VARIABLE numeromeses INTEGER;
declare variable fechaing date;
DECLARE VARIABLE ANOACT INTEGER;
DECLARE VARIABLE MESACT INTEGER;
DECLARE VARIABLE DIAACT INTEGER;
DECLARE VARIABLE ANOING INTEGER;
DECLARE VARIABLE DIAING INTEGER;
DECLARE VARIABLE MESING INTEGER;
DECLARE VARIABLE salario NUMERIC(18,2);
declare variable item integer;
declare variable idsaldo integer;
BEGIN
FOR SELECT  E.TERC_NIT, T.TERC_NOM, E.EMPL_FECING, E.empl_salario FROM EMPLEADOS E, TERCEROS T WHERE T.terc_nit = E.terc_nit INTO :emplnit, :emplnom, :fechaing, :salario
DO
  BEGIN
   SELECT NC.noco_valor FROM NOMINA_CONCEPTOS NC WHERE ((conc_cod = 912) OR (conc_cod = 913)) AND terc_nit = :emplnit AND nc.noco_periodo = 0 INTO :cesantia;
   SELECT NC.noco_valor FROM NOMINA_CONCEPTOS NC WHERE ((conc_cod = 923) OR (conc_cod = 924)) AND terc_nit = :emplnit AND nc.noco_periodo = 0 INTO :intces;
   SELECT NC.noco_valor FROM NOMINA_CONCEPTOS NC WHERE ((conc_cod = 925) OR (conc_cod = 927)) AND terc_nit = :emplnit AND nc.noco_periodo = 0 INTO :primajunio;
   SELECT NC.noco_valor FROM NOMINA_CONCEPTOS NC WHERE ((conc_cod = 926) OR (conc_cod = 928)) AND terc_nit = :emplnit AND nc.noco_periodo = 0 INTO :primadic;
   SELECT NC.noco_valor FROM NOMINA_CONCEPTOS NC WHERE ((conc_cod = 929) OR (conc_cod = 930)) AND terc_nit = :emplnit AND nc.noco_periodo = 0 INTO :vacac;

   select conc_cod from empleado_conceptos where ((conc_cod = 912) or (conc_cod = 913)) and terc_nit = :emplnit into :conc_codcesan;
   select conc_cod from empleado_conceptos where ((conc_cod = 923) or (conc_cod = 924)) and terc_nit = :emplnit into :conc_codintces;
   select conc_cod from empleado_conceptos where ((conc_cod = 925) or (conc_cod = 927)) and terc_nit = :emplnit into :conc_codprimajun;
   select conc_cod from empleado_conceptos where ((conc_cod = 926) or (conc_cod = 928)) and terc_nit = :emplnit into :conc_codprimadic;
   select conc_cod from empleado_conceptos where ((conc_cod = 929) or (conc_cod = 930)) and terc_nit = :emplnit  into :conc_codvacaci;
  END
  SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER PROCEDURE REP_CONCEP_XPAGAR(
    FEC DATE,
    NITDESDE VARCHAR(20),
    NITHASTA VARCHAR(20),
    PERDESDE INTEGER,
    PERHASTA INTEGER)
RETURNS (
    CONO_IDORI INTEGER,
    CONO_PERIODO INTEGER,
    CONO_ANO CHAR(4),
    CONO_VALOR NUMERIC(18,2),
    CONO_ABONO NUMERIC(18,2),
    TERC_NIT VARCHAR(20),
    CONC_COD VARCHAR(5),
    NOMCONC VARCHAR(60),
    NOMCORTCONC VARCHAR(60),
    CONO_PERIODICIDAD INTEGER,
    CONO_DEDUC CHAR(1),
    CONO_PROV CHAR(1),
    CONO_APORTE CHAR(1),
    CONO_GTOEMPR CHAR(1),
    NOMPER VARCHAR(60),
    NOMEMPL VARCHAR(60))
AS
declare variable iddoc INTEGER;
declare variable ABONO NUMERIC(18,2);
declare variable NITEMPL VARCHAR(20);
BEGIN
FOR SELECT N.nomi_id, P.pnom_nombre FROM NOMINA N, PERIODO_PAGO_NOMBRE P
WHERE N.nomi_feccausa <= :fec AND N.nomi_periodo = P.ppag_periodo AND N.nomi_periodocidad = P.ppag_cod AND N.nomi_periodo >= :perdesde AND N.nomi_periodo <= :perhasta
INTO :iddoc, :nomper
DO
BEGIN
FOR SELECT ND.TERC_NIT, T.TERC_NOM FROM NOMINA_DETALLE ND, TERCEROS T
WHERE NOMI_ID = :iddoc AND ND.TERC_NIT >= :nitdesde AND ND.TERC_NIT <= :nithasta
AND ND.terc_nit = T.terc_nit
INTO :NITEMPL, :nomempl
DO
BEGIN
FOR SELECT CONC_COD
FROM CONSOLIDADO_NOMINA C WHERE C.cono_idori = :iddoc AND C.terc_nit = :nitempl AND C.cono_deb = 'N'
     INTO :CONC_COD
     DO
     BEGIN
     SELECT CONO_IDORI,CONO_PERIODO,CONO_ANO,CONO_VALOR,CONO_ABONO,TERC_NIT,CONO_PERIODICIDAD,CONO_DEDUC,CONO_PROV,CONO_APORTE,CONO_GTOEMPR, CN.conc_nombre, CN.conc_nomcorto
     FROM CONSOLIDADO_NOMINA C, CONCEPTOS_NOMINA CN WHERE C.cono_idori = :iddoc AND C.terc_nit = :nitempl AND C.CONC_COD = :CONC_COD AND C.cono_deb = 'N' AND CN.conc_cod = C.conc_cod
     INTO :CONO_IDORI,:CONO_PERIODO,:CONO_ANO,:CONO_VALOR,:CONO_ABONO,:TERC_NIT,:CONO_PERIODICIDAD,:CONO_DEDUC,:CONO_PROV,:CONO_APORTE,:CONO_GTOEMPR, :nomconc, :nomcortconc;
     SELECT SUM(cono_abono) FROM CONSOLIDADO_NOMINA C WHERE C.cono_idori = :iddoc AND C.terc_nit = :nitempl AND C.CONC_COD = :CONC_COD
     AND C.cono_deb = 'S' INTO :abono;
     IF (abono IS NULL) THEN
     abono = 0;
     cono_valor = :cono_valor - :abono;
     IF (cono_valor <> 0) THEN
     SUSPEND;
     END
END
END
END
^

SET TERM ; ^


SET TERM ^ ;

ALTER PROCEDURE EGRESO_NOMINA(
    IDNOMINA INTEGER,
    PGLOBAL CHAR(1),
    NITBENE VARCHAR(20),
    FECHAEGR DATE,
    PREF VARCHAR(4),
    NUMEROEGR VARCHAR(6),
    CONCEPTO VARCHAR(60),
    OBSERVACIONES BLOB SUB_TYPE 0 SEGMENT SIZE 80,
    NOMBREBENE VARCHAR(60),
    CAJA INTEGER,
    USUARIOEGR VARCHAR(10),
    PAGO CHAR(1),
    CUENTAID INTEGER,
    FECHAEGRBNCO DATE,
    PREFEGREBNCO VARCHAR(4),
    NUMEROEGREBNCO VARCHAR(6),
    BENEBNCO VARCHAR(60),
    CONCEPTOBNCO VARCHAR(60),
    GMF CHAR(1),
    FORMAPAGOID INTEGER,
    CAJABNCO VARCHAR(2),
    CAJABNCOCUENTA VARCHAR(20),
    CAJABNCONUMEROEGR VARCHAR(20),
    FORMULARIO VARCHAR(10))
AS
declare variable porcreten numeric(9,4);
declare variable nitempl varchar(60);
declare variable idpago integer;
declare variable totdevenempl numeric(18,2);
declare variable retencionempl numeric(18,2);
declare variable periodicidad integer;
declare variable idegreso integer;
declare variable nitemplnglo varchar(20) character set none;
declare variable numegresointeger integer;
declare variable ok char(1) character set none;
declare variable itempago integer;
declare variable he numeric(18,2);
declare variable hed numeric(18,2);
declare variable hen numeric(18,2);
declare variable hefd numeric(18,2);
declare variable hefn numeric(18,2);
declare variable otrosdev numeric(18,2);
declare variable otrosded integer;
declare variable pagoempl char(1);
declare variable periodo integer;
declare variable nomiano char(4);
declare variable emplnom varchar(60);
declare variable devengos numeric(18,2);
declare variable deducibles numeric(18,2);
declare variable total numeric(18,2);
declare variable reten numeric(18,2);
begin
select nomi_pagook, nomi_periodo, nomi_ano from nomina where nomi_id = :idnomina into :ok, :periodo, :nomiano;
if (ok = 'N') then
BEGIN
if (pglobal = 'S') then
BEGIN
    SELECT SUM (NC.CONO_ABONO) FROM CONSOLIDADO_NOMINA NC WHERE NC.CONO_IDORI = :IDNOMINA AND CONO_TIPOORI = 92 and cono_pagook = 'N'
    AND CONO_prov = 'N' AND CONO_APORTE = 'N' and CONO_DEB = 'S'
        INTO :total;
    if((:TOTAL IS NOT NULL) and (:total <> 0)) then
    BEGIN
    EXECUTE PROCEDURE cambie_id_egreso returning_values (:idegreso);
    INSERT INTO egresos (EGRE_ID, TIDO_COD, PREF_PRE, EGRE_numero, EGRE_fecha, EGRE_CONC, EGRE_MONTO, EGRE_RTFTEMONTO, EGRE_OBS, EGRE_NOMTERC, EGRE_ANULADO, EGRE_TRANSMIT, TERC_NIT, EGRE_TIPO, CAJA_ID, EGRE_usuario, NUMOK, CLEG_ID)
                 VALUES (:idegreso,62, :pref, :numeroegr, :fechaegr, :concepto, :total, 0, :observaciones, :nombrebene, 'N', 'N', :nitbene, '3', :caja, :usuarioegr, 'S', 0);
    if (pago = 'B') then
    INSERT INTO egresos_banco (EGRE_ID, EGBC_TIPOBCO, CUBA_COD, EGBC_numero, EGBC_fecha, PRBA_PREF, EGBC_BENEF, EGBC_MONTO, EGBC_CONCEPTO, EGBC_GMF, EGBC_ANULADO, EGBC_TRANSMIT) VALUES (:idegreso, 72, :cuentaid, :numeroegrebnco, :fechaegrbnco, :prefegrebnco, :benebnco, :total, :conceptobnco, :gmf, 'N', 'N');
  ELSE
    if (pago = 'C') then
    INSERT INTO egresos_caja (EGRE_ID, EGCA_ITEM, CAJA_ID, FOPA_ID, EGCA_BANCO, EGCA_CUENTA, EGCA_numero, EGCA_fecha, EGCA_MONTO, EGCA_ANULADO, EGCA_TRANSMIT) VALUES (:idegreso, 1, :caja, :formapagoid, :cajabnco, :cajabncocuenta, :cajabnconumeroegr, :fechaegr, :total, 'N', 'N');
    idpago = GEN_ID(id_pagonomi, 1);
    insert INTO pago_nomina (pgno_id, pgno_fecha, pgno_tipopago, pgno_egreid, pgno_egrepre, pgno_egrenum, pgno_monto, pgno_nomina, pgno_nit, pgno_formulario, PGNO_ANT)
                 VALUES (:idpago, :fechaegr, :pago , :idegreso, :pref, :numeroegr, :total, :idnomina, :nitbene, :formulario, 'N');
    update NOMINA SET NOMI_pagook = 'N' WHERE NOMI_ID = :IDNOMINA;
    END
    FOR SELECT TERC_NIT FROM nomina_detalle WHERE NOMI_ID = :idnomina into :nitemplnglo
    DO
    BEGIN
    SELECT SUM (NC.CONO_ABONO) FROM CONSOLIDADO_NOMINA NC WHERE NC.CONO_IDORI = :IDNOMINA AND CONO_TIPOORI = 92 and cono_pagook = 'N'
    AND CONO_prov = 'N' AND CONO_APORTE = 'N' and CONO_DEB = 'S'
        INTO :total;
    select max (pgno_item), max (pgno_id) from pago_nomina_det WHERE PGNO_ID = :idpago INTO :itempago, :idpago;
    if (:itempago IS NULL) then
    itempago = 0;
    itempago = :itempago + 1;
    END
END
ELSE
if (pglobal = 'N') then
BEGIN
    EXECUTE PROCEDURE cambie_id_pago_nomina returning_values (:idpago);
    FOR SELECT TERC_NIT FROM nomina_detalle WHERE NOMI_ID = :idnomina into :nitemplnglo
    DO
    BEGIN
    EXECUTE PROCEDURE cambie_id_egreso returning_values (:idegreso);
    SELECT SUM (cono_abono) FROM CONSOLIDADO_NOMINA WHERE CONO_IDORI = :IDNOMINA AND CONO_TIPOORI = 92 and cono_pagook = 'N'
    AND CONO_deduc = 'N' AND cono_prov = 'N' and CONO_DEB = 'S' and TERC_NIT = :nitemplnglo
    INTO :totdevenempl;
    SELECT NOMI_PERIODOCIDAD FROM nomina WHERE NOMI_ID = :idnomina INTO :periodicidad;
    SELECT SUM (NC.CONO_ABONO) FROM CONSOLIDADO_NOMINA NC WHERE NC.CONO_IDORI = :IDNOMINA AND CONO_TIPOORI = 92 and cono_pagook = 'N'
    AND CONO_prov = 'N' AND CONO_APORTE = 'N' and CONO_DEB = 'S' AND TERC_NIT = :nitemplnglo
        INTO :total;
    SELECT TERC_NOM FROM TERCEROS WHERE TERC_NIT = :nitemplnglo INTO :emplnom;
    concepto = 'PAGO NOMINA ' || 'DEL PERIODO ' || CAST (periodo AS CHAR(2)) || ' DEL ' || nomiano;
    if((:TOTAL IS NOT NULL) or (:total <> 0)) then
    BEGIN
    INSERT INTO egresos (EGRE_ID, TIDO_COD, PREF_PRE, EGRE_numero, EGRE_fecha, EGRE_CONC, EGRE_MONTO, EGRE_RTFTEMONTO, EGRE_OBS, EGRE_NOMTERC, EGRE_ANULADO, EGRE_TRANSMIT, TERC_NIT, EGRE_TIPO, CAJA_ID, EGRE_usuario, NUMOK, CLEG_ID)
                 VALUES (:idegreso,62, :pref, :numeroegr, :fechaegr, :concepto, :total, :reten, :observaciones, :emplnom, 'N', 'N', :nitemplnglo, '3', :caja, :usuarioegr, 'S', 0);
    SELECT empl_formpago FROM EMPLEADOS WHERE TERC_NIT = :nitemplnglo INTO :pagoempl;
    if (pagoempl = 'B') then
    begin
    conceptobnco = :concepto;
    INSERT INTO egresos_banco (EGRE_ID, EGBC_TIPOBCO, CUBA_COD, EGBC_numero, EGBC_fecha, PRBA_PREF, EGBC_BENEF, EGBC_MONTO, EGBC_CONCEPTO, EGBC_GMF, EGBC_ANULADO, EGBC_TRANSMIT)
                       VALUES (:idegreso, 72, :cuentaid, :numeroegrebnco, :fechaegrbnco, :prefegrebnco, :nitemplnglo, :total, :conceptobnco, :gmf, 'N', 'N');
    end
    ELSE
    if (pagoempl = 'C') then
    INSERT INTO egresos_caja (EGRE_ID, EGCA_ITEM, CAJA_ID, FOPA_ID, EGCA_BANCO, EGCA_CUENTA, EGCA_numero, EGCA_fecha, EGCA_MONTO, EGCA_ANULADO, EGCA_TRANSMIT)
                 VALUES (:idegreso, 1, :caja, :formapagoid, :cajabnco, :cajabncocuenta, :cajabnconumeroegr, :fechaegr, :total, 'N', 'N');
    END
    EXECUTE PROCEDURE cambie_id_pago_nomina returning_values (:idpago);
    INSERT INTO pago_nomina (pgno_id, pgno_fecha, pgno_tipopago, pgno_egreid, pgno_egrepre, pgno_egrenum, pgno_monto, pgno_nomina, pgno_nit, pgno_formulario, PGNO_ANT)
                 VALUES (:idpago, :fechaegr, :pago , :idegreso, :pref, :numeroegr, 0, :idnomina, '', :formulario, 'N');
    SELECT SUM (cono_abono) FROM CONSOLIDADO_NOMINA WHERE CONO_IDORI = :IDNOMINA AND CONO_TIPOORI = 92 and cono_pagook = 'N'
    AND CONO_deduc = 'N' AND cono_prov = 'N' and TERC_NIT = :nitemplnglo
    INTO :totdevenempl;
    SELECT NOMI_PERIODOCIDAD FROM nomina WHERE NOMI_ID = :idnomina INTO :periodicidad;
    select max (pgno_item) from pago_nomina_det WHERE PGNO_ID = :idpago INTO :itempago;
    if (:itempago IS NULL) then
    itempago = 0;
    itempago = :itempago + 1;
    insert INTO pago_nomina_det  (pgno_id, terc_nit, pgnd_monto, pgno_item)
                 VALUES (:idpago, :nitemplnglo, :total, :itempago);
    numegresointeger = cast (numeroegr as integer);
    numegresointeger = numegresointeger + 1;
    execute procedure completa_ceros(numegresointeger)returning_values :numeroegr;
update CONSOLIDADO_NOMINA NC set nc.cono_pagook = 'S' WHERE NC.CONO_IDORI = :IDNOMINA AND CONO_TIPOORI = 92 and cono_pagook = 'N'
    AND CONO_prov = 'N' AND CONO_APORTE = 'N' and CONO_DEB = 'S' AND TERC_NIT = :nitemplnglo;
    END
END
END
ELSE
exception nomina_con_pago;
END
^

SET TERM ; ^


UPDATE REVISION SET revi_nomina = '2009/02/20';

SET TERM ^ ;

ALTER PROCEDURE CAUSA_NOMINA(
    FEC DATE,
    PERIODO INTEGER,
    PERIODICIDAD INTEGER,
    PAGOGLOBAL CHAR(1),
    ANO CHAR(4))
RETURNS (
    IDNOMINA INTEGER)
AS
DECLARE VARIABLE item INTEGER;
DECLARE VARIABLE nite VARCHAR(20) CHARACTER SET none;
DECLARE VARIABLE nit_tercero VARCHAR(20);
DECLARE VARIABLE concept INTEGER;
DECLARE VARIABLE montos NUMERIC(18,2);
DECLARE VARIABLE porcen NUMERIC(9,4);
DECLARE VARIABLE entidad VARCHAR(20);
DECLARE VARIABLE conc_cod INTEGER;
DECLARE VARIABLE conc_deduc CHAR(1);
DECLARE VARIABLE conc_porc NUMERIC(9,4);
DECLARE VARIABLE conc_entidad INTEGER;
DECLARE VARIABLE conc_monto NUMERIC(18,2);
DECLARE VARIABLE conc_modifi CHAR(1);
DECLARE VARIABLE conc_promedio CHAR(1);
DECLARE VARIABLE emco_perprom INTEGER;
DECLARE VARIABLE valor NUMERIC(18,2);
DECLARE VARIABLE diaslab INTEGER;
DECLARE VARIABLE conc_prov CHAR(1);
DECLARE VARIABLE conc_aporte CHAR(1);
DECLARE VARIABLE numeroprom INTEGER;
DECLARE VARIABLE conc_aplicaprom CHAR(1);
DECLARE VARIABLE perinicial INTEGER;
DECLARE VARIABLE anoprom INTEGER;
DECLARE VARIABLE conc_dias CHAR(1);
DECLARE VARIABLE conc_otroconc CHAR(1);
DECLARE VARIABLE conc_codotroconc INTEGER;
DECLARE VARIABLE anosum INTEGER;
DECLARE VARIABLE salario CHAR(1) CHARACTER SET none;
DECLARE VARIABLE liquidaper INTEGER;
DECLARE VARIABLE rmod NUMERIC(2,2);
DECLARE VARIABLE basico NUMERIC(18,2);
DECLARE VARIABLE niteps VARCHAR(20);
DECLARE VARIABLE nitafc VARCHAR(20);
DECLARE VARIABLE nitafp VARCHAR(20);
DECLARE VARIABLE nitccf VARCHAR(20);
DECLARE VARIABLE gtoempr CHAR(1);
DECLARE VARIABLE comision NUMERIC(18,2);
DECLARE VARIABLE cambsaltrans NUMERIC(18,2);
DECLARE VARIABLE saldosini NUMERIC(18,2);
DECLARE VARIABLE duranov INTEGER;
DECLARE VARIABLE base NUMERIC(18,2);
DECLARE VARIABLE aprox INTEGER;
DECLARE VARIABLE mensual CHAR(1);
DECLARE VARIABLE horasex NUMERIC(18,2);
DECLARE VARIABLE diasnov INTEGER;
DECLARE VARIABLE tomasal INTEGER;
DECLARE VARIABLE retroact NUMERIC(18,2);
DECLARE VARIABLE incap NUMERIC(18,2);
BEGIN
 EXECUTE PROCEDURE cambie_id_nomina RETURNING_VALUES(:idnomina);
 INSERT INTO nomina (nomi_id, NOMI_FECCAUSA, NOMI_PAGOGLOBAL, NOMI_PERIODOCIDAD, NOMI_PERIODO, NOMI_ANO, NOMI_LIQOK)
 VALUES (:IDNOMINA, :fec,:pagoglobal, :periodicidad, :periodo, :ano, 'N');
/* fec = substr(fec,1,8) || (CAST(substr(fec,9,10) AS INTEGER)+1);
*/ item = 1;
 FOR SELECT E.TERC_NIT, E.empl_salario, e.empl_eps, e.empl_afc, e.empl_afp, e.empl_ccf
 FROM EMPLEADOS E
 WHERE E.empl_ppago = :periodicidad AND E.empl_fecret IS NULL
 INTO :nite, :basico, :niteps, :nitafc, :nitafp, :nitccf
 DO
 BEGIN
  FOR SELECT CE.TERC_NIT, CE.CONC_COD, CE.EMCO_MONTO, CE.EMCO_PORC, ce.empl_entidad, CE.emco_perprom, CE.emco_luquidaper, CE.emco_mensual, CN.CONC_COD, CN.CONC_DEDUC,CN.CONC_PORC, CN.CONC_ENTIDAD, CN.CONC_MONTO,  CN.CONC_DIAS, CN.CONC_MODIFI,
  CN.CONC_PROMEDIO, CN.conc_salario, CE.emco_perprom, CN.conc_prov, CN.conc_aporte, CN.conc_aplicaprom, cn.conc_otroconc, cn.conc_codotroconc, CN.conc_gtoempr, CN.conc_base, CE.emco_tomsal
  FROM empleado_conceptos CE, CONCEPTOS_NOMINA CN WHERE ((CE.terc_nit = :nite) AND (CE.CONC_COD = CN.CONC_COD) AND (CN.conc_fecini <= :fec AND CN.conc_fecfin >= :FEC) ) OR ((CE.terc_nit = :nite)
  AND (CE.CONC_COD = CN.CONC_COD) AND (cn.conc_todosper = 'N') AND (CE.emco_ppago = :periodo)) OR  ((CE.terc_nit = :nite) AND (CE.CONC_COD = CN.CONC_COD) AND cn.conc_todosper = 'S')  ORDER BY (TERC_NIT )
  INTO :nit_tercero, :concept,  :montos, :porcen, :entidad, :numeroprom, :liquidaper, :mensual ,:CONC_COD, :CONC_DEDUC, :CONC_PORC,
  :CONC_ENTIDAD, :CONC_MONTO, :CONC_DIAS, :CONC_MODIFI,:CONC_PROMEDIO, :salario,:EMCO_PERPROM, :conc_prov, :conc_aporte , :CONC_APLICAPROM, :conc_otroconc, :conc_codotroconc, :gtoempr, :base, :tomasal
  DO
  BEGIN
   IF (conc_dias = 'S') THEN
   EXECUTE PROCEDURE DIAS_LABORADOS (:nite, :periodo, :fec, :mensual,:conc_aporte) RETURNING_VALUES (:diaslab);
   ELSE
   BEGIN
    diaslab = 15;
    IF (mensual = 'S') THEN
    BEGIN
     IF (periodicidad = 2) THEN
     diaslab = 30;
     ELSE
     IF (liquidaper = 3) THEN
     diaslab = 30;
    END
   END
   IF (:tomasal <> 0) THEN
   BEGIN
    IF ((:periodicidad = 2) AND (:tomasal <> 2)) THEN
    BEGIN
     IF ((periodo = 2) OR (periodo = 4) OR (periodo = 6) OR (periodo = 8) OR (periodo = 10) OR (periodo = 12)
     OR (periodo = 14) OR (periodo = 16) OR (periodo = 18) OR (periodo = 20) OR (periodo = 22) OR (periodo = 24)) THEN
     basico = 0;
    END
    ELSE
    IF ((:periodicidad = 3) AND (:tomasal <> 1)) THEN
    BEGIN
     IF ((periodo = 1) OR (periodo = 5) OR (periodo = 9) OR (periodo = 13) OR (periodo = 17) OR (periodo = 21)
     OR (periodo = 25) OR (periodo = 29) OR (periodo = 33) OR (periodo = 37) OR (periodo = 41) OR (periodo = 45)
     OR (periodo = 49)) THEN
     basico = 0;
    END
    ELSE
     IF ((:periodicidad = 3) AND (:tomasal <> 2)) THEN
     BEGIN
      IF ((periodo = 2) OR (periodo = 6) OR (periodo = 10) OR (periodo = 14) OR (periodo = 18) OR (periodo = 22)
      OR (periodo = 26) OR (periodo = 30) OR (periodo = 34) OR (periodo = 38) OR (periodo = 42) OR (periodo = 46)
      OR (periodo = 50)) THEN
      basico = 0;
     END
     ELSE
     IF ((:periodicidad = 3) AND (:tomasal <> 3)) THEN
     BEGIN
      IF ((periodo = 3) OR (periodo = 7) OR (periodo = 11) OR (periodo = 15) OR (periodo = 19) OR (periodo = 23)
      OR (periodo = 27) OR (periodo = 31) OR (periodo = 35) OR (periodo = 39) OR (periodo = 43) OR (periodo = 47)
      OR (periodo = 51)) THEN
      basico = 0;
     END
     ELSE
     IF ((:periodicidad = 3) AND (:tomasal <> 4)) THEN
     BEGIN
      IF ((periodo = 4) OR (periodo = 8) OR (periodo = 12) OR (periodo = 16) OR (periodo = 20) OR (periodo = 24)
      OR (periodo = 29) OR (periodo = 32) OR (periodo = 36) OR (periodo = 40) OR (periodo = 44) OR (periodo = 48)
      OR (periodo = 52)) THEN
      basico = 0;
     END
   END
   ELSE
   BEGIN
    SELECT E.empl_salario FROM EMPLEADOS E WHERE E.terc_nit = :nite INTO :basico;
    SELECT ((n.nono_valor /30) * n.nono_dura), (n.nono_dura) FROM nomina_novedades n WHERE n.tnov_cod = 11 AND n.terc_nit = :nite AND n.nono_periodo = :periodo INTO :cambsaltrans, :duranov;
    IF (cambsaltrans IS NULL) THEN
    cambsaltrans = 0;
    IF (duranov IS NULL) THEN
    duranov = 0;
    diaslab = :diaslab - :duranov;
    IF (conc_cod = 922) THEN
    BEGIN
     SELECT SUM(P.prcu_monto) FROM prestamo_cuotas P, prestamo_nomina PN WHERE P.prcu_ano = :ano AND P.prcu_periodo = :periodo AND PN.prno_id = P.prno_id AND PN.terc_nit = :nite INTO :valor;
     IF (valor IS NULL) THEN
     valor = 0;
     item = :item + 1;
     UPDATE prestamo_cuotas  P SET prcu_ok = 'S' WHERE P.prcu_ano = :ano AND P.prcu_periodo = :periodo AND P.prno_id = (SELECT PN.prno_id FROM PRESTAMO_NOMINA PN WHERE PN.terc_nit = :nite);
    END
    ELSE
    IF ((:montos = 0) OR (:montos IS NULL)) THEN
    BEGIN
     IF ((CONC_PORC = 0 AND :porcen = 0) OR (CONC_PORC IS NULL AND :porcen = 0) OR (CONC_PORC = 0 AND :porcen IS NULL) OR (CONC_PORC IS NULL AND :porcen IS NULL) ) THEN
     BEGIN
      IF ((conc_monto <> 0) AND (conc_monto IS NOT NULL) ) THEN
      BEGIN
       VALOR = :CONC_MONTO;
       IF (:conc_dias = 'S') THEN
       valor = (:valor / 30) * :diaslab;
      END
      ELSE
      IF (salario = 'S' AND CONC_COD <> 900 AND CONC_COD <> 920) THEN
      BEGIN
       conc_monto = :basico;
       VALOR = (:conc_monto/30 * :diaslab ) + :cambsaltrans;
      END
      ELSE
      BEGIN
       valor = montos;
       IF (:conc_dias = 'S') THEN
       valor = (:valor / 30) * :diaslab;
      END
     END
     ELSE
     BEGIN
      IF (:porcen <> 0) THEN
      BEGIN
       IF ((conc_monto <> 0) AND (conc_monto IS NOT NULL) ) THEN
       BEGIN
        VALOR = ((:CONC_MONTO ) * :PORCEN) /100;
       END
      END
      ELSE
      BEGIN
       IF ((conc_monto <> 0) AND (conc_monto IS NOT NULL) ) THEN
       BEGIN
        VALOR = ((:CONC_MONTO) * :conc_porc) /100;
       END
       ELSE
       IF (salario = 'S' AND CONC_COD <> 900 AND CONC_COD <> 920) THEN
       BEGIN
        conc_monto = :basico;
        VALOR = ((:CONC_MONTO)+ :cambsaltrans * :conc_porc) /100;
       END
       ELSE
       IF (:conc_monto = 0 AND :montos = 0) THEN
       BEGIN
        conc_monto = :basico;
        VALOR = (((:CONC_MONTO / 30) * :diaslab) + :cambsaltrans * :conc_porc) /100;
       END
      END
     END
    END
    ELSE
    IF ((CONC_PORC = 0 OR (conc_porc IS NULL)) AND (:porcen = 0 OR (porcen IS NULL))) THEN
    BEGIN
     VALOR = (:montos);
     IF (:conc_dias = 'S') THEN
     valor = (:valor / 30) * :diaslab;
    END
    ELSE
    IF (:porcen <> 0 AND porcen IS NOT NULL) THEN
    BEGIN
     VALOR = ((:MONTOS ) * :PORCEN) /100;
    END
    ELSE
    BEGIN
     VALOR = ((:montos) * :CONC_PORC) /100;
    END
    IF (conc_promedio = 'S') THEN
    BEGIN
     perinicial = :periodo - (:numeroprom) + 1;
     anoprom = CAST (ano AS INTEGER);
     IF (perinicial <= 0) THEN
     BEGIN
      perinicial = 24 + :PERINICIAL;
      anoprom = CAST(ANO AS INTEGER) - 1;
     END
     SELECT SUM (noco_valor) FROM nomina_conceptos n WHERE n.noco_aplicaprom = 'S' AND N.noco_periodo >= :perinicial - 1 AND N.noco_periodo < :periodo AND N.noco_ano >= :anoprom AND N.noco_ano <= :ano AND terc_nit = :nite INTO :valor;
     valor = (valor / numeroprom);
     SELECT NOCO_VALOR FROM NOMINA_CONCEPTOS WHERE CONC_COD = :conc_cod AND TERC_NIT  = :nite AND NOCO_PAGOOK = 'N' AND NOCO_PERIODO = 0 INTO :saldosini;
     IF (saldosini IS NULL) THEN
     saldosini = 0;
     ELSE
     UPDATE nomina_conceptos N SET noco_pagook = 'S' WHERE n.noco_aplicaprom = 'S' AND N.noco_periodo >= :perinicial - 1 AND N.noco_periodo < :periodo AND N.noco_ano >= :anoprom AND N.noco_ano <= :ano  AND CONC_COD = :conc_cod AND terc_nit = :nite AND NOCO_PERIODO = 0;
     VALOR = :valor + :saldosini;
     UPDATE nomina_conceptos N SET noco_pagook = 'S' WHERE n.noco_aplicaprom = 'S' AND N.noco_periodo >= :perinicial - 1 AND N.noco_periodo < :periodo AND N.noco_ano >= :anoprom AND N.noco_ano <= :ano  AND CONC_COD = :conc_cod AND terc_nit = :nite;
    END
    ELSE
    IF (conc_otroconc = 'S') THEN
    BEGIN
     anosum = CAST(ano AS INTEGER);
     anosum = anosum - 1;
     SELECT SUM (noco_valor) FROM nomina_conceptos n WHERE n.noco_ano = :anosum AND n.conc_cod = :conc_codotroconc AND N.terc_nit = :nite INTO :valor;
     SELECT NOCO_VALOR FROM NOMINA_CONCEPTOS WHERE noco_ano = :anosum AND conc_cod = :conc_codotroconc AND terc_nit = :nite AND NOCO_PERIODO = 0 INTO :saldosini;
     IF (saldosini IS NULL) THEN
     saldosini = 0;
     ELSE
     UPDATE nomina_conceptos SET noco_pagook = 'S' WHERE noco_ano = :anosum AND conc_cod = :conc_codotroconc AND NOCO_PERIODO = 0 AND terc_nit = :nite;
     VALOR = :valor + :saldosini;
     UPDATE nomina_conceptos SET noco_pagook = 'S' WHERE noco_ano = :anosum AND conc_cod = :conc_codotroconc AND terc_nit = :nite;
    END
    ELSE
    IF (conc_aporte = 'S') THEN
    BEGIN
     horasex = NULL;
     diasnov = NULL;
     IF ((:entidad = '' ) OR (entidad IS NULL)) THEN
     BEGIN
      SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
      IF (comision IS NULL) THEN
      comision = 0;
      SELECT C.emco_monto FROM EMPLEADO_CONCEPTOS C WHERE C.terc_nit = :nite AND C.conc_cod = 933 INTO :retroact;
      IF (retroact IS NULL ) THEN
      retroact = 0;
      SELECT N.nono_dura FROM NOMINA_NOVEDADES N WHERE N.terc_nit = :nite AND N.nono_periodo = :periodo AND N.nono_ano = :ano AND (N.TNOV_COD = 2 or (N.TNOV_COD = 3) ) INTO :diasnov;
      IF (:diasnov IS NULL) THEN
      incap = 0;
      ELSE
      incap = (:basico / 30)* :diasnov;
      valor = :basico + :comision + :horasex + :retroact + :incap;
      IF ((conc_cod = 904) OR (conc_cod = 905) OR (conc_cod = 906)) THEN
      BEGIN
       entidad = :nitafp;
       IF (conc_cod = 904) THEN
       BEGIN
        SELECT A.paan_afptr FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
        SELECT N.nono_dura FROM NOMINA_NOVEDADES N WHERE N.terc_nit = :nite AND N.nono_periodo = :periodo AND N.nono_ano = :ano AND (N.TNOV_COD = 2 or (N.TNOV_COD = 3) ) INTO :diasnov;
        IF (:diasnov IS NULL) THEN
        incap = 0;
        ELSE
        incap = (:basico / 30)* :diasnov;
        SELECT c.noex_monto FROM nomina_horasext c WHERE c.noex_ano = :ano AND c.noex_periodio = :periodo AND c.noex_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :horasex;
        IF (horasex IS NOT NULL) THEN
        VALOR = (((((:basico )/30 * :diaslab ) + :comision + :horasex + :retroact+ :incap)+ :cambsaltrans ) * :PORCEN) /100;
        ELSE
        VALOR = ((((:basico)/30 * :diaslab ) + :comision + :retroact+ :cambsaltrans  + :incap) * :PORCEN) /100;
       END
       ELSE
       IF ((conc_cod = 905) OR (conc_cod = 906)) THEN
       BEGIN
        SELECT A.paan_afpem FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
        SELECT N.nono_dura FROM NOMINA_NOVEDADES N WHERE N.terc_nit = :nite AND N.nono_periodo = :periodo AND N.nono_ano = :ano AND (N.TNOV_COD = 2 or (N.TNOV_COD = 3) ) INTO :diasnov;
        IF (:diasnov IS NULL) THEN
        incap = 0;
        ELSE
        incap = (:basico / 30)* :diasnov;
        SELECT c.noex_monto FROM nomina_horasext c WHERE c.noex_ano = :ano AND c.noex_periodio = :periodo AND c.noex_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :horasex;
        IF (horasex IS NOT NULL) THEN
        VALOR = (((((:basico )/30 * :diaslab ) + :comision + :horasex + :retroact)+ :cambsaltrans + :incap) * :PORCEN) /100;
        ELSE
        VALOR = (((((:basico )/30 * :diaslab ) + :comision + :retroact)+ :cambsaltrans + :incap) * :PORCEN) /100;
       END
      END
      ELSE
      IF ((conc_cod = 907) OR (conc_cod = 914) OR (conc_cod = 915)) THEN
      BEGIN
       entidad = :niteps;
       IF (conc_cod = 907) THEN
       BEGIN
        SELECT A.paan_epstr FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
        SELECT N.nono_dura FROM NOMINA_NOVEDADES N WHERE N.terc_nit = :nite AND N.nono_periodo = :periodo AND N.nono_ano = :ano AND (N.TNOV_COD = 2 or (N.TNOV_COD = 3) ) INTO :diasnov;
        IF (:diasnov IS NULL) THEN
        incap = 0;
        ELSE
        incap = (:basico / 30)* :diasnov;
        SELECT c.noex_monto FROM nomina_horasext c WHERE c.noex_ano = :ano AND c.noex_periodio = :periodo AND c.noex_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :horasex;
        IF (horasex IS NOT NULL) THEN
        VALOR = (((((:basico )/30 * :diaslab ) + :comision + :horasex + :retroact)+ :cambsaltrans + :incap) * :PORCEN) /100;
        ELSE
        VALOR = (((((:basico )/30 * :diaslab ) + :comision + :retroact)+ :cambsaltrans + :incap) * :PORCEN) /100;
       END
       ELSE
       IF ((conc_cod = 914) OR (conc_cod = 915)) THEN
       BEGIN
        SELECT A.paan_epsem FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
        SELECT N.nono_dura FROM NOMINA_NOVEDADES N WHERE N.terc_nit = :nite AND N.nono_periodo = :periodo AND N.nono_ano = :ano AND (N.TNOV_COD = 2 or (N.TNOV_COD = 3) ) INTO :diasnov;
        IF (:diasnov IS NULL) THEN
        incap = 0;
        ELSE
        incap = (:basico / 30)* :diasnov;
        SELECT c.noex_monto FROM nomina_horasext c WHERE c.noex_ano = :ano AND c.noex_periodio = :periodo AND c.noex_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :horasex;
        IF (horasex IS NOT NULL) THEN
        VALOR = (((((:basico )/30 * :diaslab ) + :comision + :horasex + :retroact)+ :cambsaltrans + :incap) * :PORCEN) /100;
        ELSE
        VALOR = (((((:basico )/30 * :diaslab ) + :comision + :retroact)+ :cambsaltrans + :incap) * :PORCEN) /100;
       END
      END
      ELSE
      IF ((conc_cod = 910) OR (conc_cod = 911) OR (conc_cod = 916) OR (conc_cod = 917) OR (conc_cod = 918) OR (conc_cod = 919)) THEN
      BEGIN
       entidad = :nitccf;
       SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
       IF (comision IS NULL) THEN
       comision = 0;
       SELECT N.nono_dura FROM NOMINA_NOVEDADES N WHERE N.terc_nit = :nite AND N.nono_periodo = :periodo AND N.nono_ano = :ano AND (N.TNOV_COD = 2 or (N.TNOV_COD = 3) ) INTO :diasnov;
       IF (:diasnov IS NULL) THEN
       incap = 0;
       ELSE
       incap = (:basico / 30)* :diasnov;
       IF ((conc_cod = 910) OR (conc_cod = 911) ) THEN
       BEGIN
        SELECT A.paan_ccf FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
      SELECT N.nono_dura FROM NOMINA_NOVEDADES N WHERE N.terc_nit = :nite AND N.nono_periodo = :periodo AND N.nono_ano = :ano AND (N.TNOV_COD = 2 or (N.TNOV_COD = 3) ) INTO :diasnov;
      IF (:diasnov IS NULL) THEN
      incap = 0;
      ELSE
      incap = (:basico / 30)* :diasnov;
        SELECT c.noex_monto FROM nomina_horasext c WHERE c.noex_ano = :ano AND c.noex_periodio = :periodo AND c.noex_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :horasex;
        IF (horasex IS NOT NULL) THEN
        VALOR = (((((:basico )/30 * :diaslab ) + :comision + :horasex + :retroact)+ :cambsaltrans + :incap) * :PORCEN) /100;
        ELSE
        VALOR = (((((:basico )/30 * :diaslab ) + :comision + :retroact)+ :cambsaltrans + :incap) * :PORCEN) /100;
       END
       ELSE
       IF ((conc_cod = 916) OR (conc_cod = 917)) THEN
       BEGIN
        SELECT A.paan_icbf FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
      SELECT N.nono_dura FROM NOMINA_NOVEDADES N WHERE N.terc_nit = :nite AND N.nono_periodo = :periodo AND N.nono_ano = :ano AND (N.TNOV_COD = 2 or (N.TNOV_COD = 3) ) INTO :diasnov;
      IF (:diasnov IS NULL) THEN
      incap = 0;
      ELSE
      incap = (:basico / 30)* :diasnov;      SELECT N.nono_dura FROM NOMINA_NOVEDADES N WHERE N.terc_nit = :nite AND N.nono_periodo = :periodo AND N.nono_ano = :ano AND (N.TNOV_COD = 2 or (N.TNOV_COD = 3) ) INTO :diasnov;
      IF (:diasnov IS NULL) THEN
      incap = 0;
      ELSE
      incap = (:basico / 30)* :diasnov;
        SELECT c.noex_monto FROM nomina_horasext c WHERE c.noex_ano = :ano AND c.noex_periodio = :periodo AND c.noex_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :horasex;
        IF (horasex IS NOT NULL) THEN
        VALOR = (((((:basico )/30 * :diaslab ) + :comision + :horasex + :retroact)+ :cambsaltrans + :incap) * :PORCEN) /100;
        ELSE
        VALOR = (((((:basico )/30 * :diaslab ) + :comision + :retroact)+ :cambsaltrans + :incap) * :PORCEN) /100;
       END
       ELSE
       IF ((conc_cod = 918) OR (conc_cod = 919)) THEN
       BEGIN
        SELECT A.paan_sena FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
      SELECT N.nono_dura FROM NOMINA_NOVEDADES N WHERE N.terc_nit = :nite AND N.nono_periodo = :periodo AND N.nono_ano = :ano AND (N.TNOV_COD = 2 or (N.TNOV_COD = 3) ) INTO :diasnov;
      IF (:diasnov IS NULL) THEN
      incap = 0;
      ELSE
      incap = (:basico / 30)* :diasnov;
        SELECT c.noex_monto FROM nomina_horasext c WHERE c.noex_ano = :ano AND c.noex_periodio = :periodo AND c.noex_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :horasex;
        IF (horasex IS NOT NULL) THEN
        VALOR = (((((:basico )/30 * :diaslab ) + :comision + :horasex + :retroact)+ :cambsaltrans + :incap) * :PORCEN) /100;
        ELSE
        VALOR = (((((:basico )/30 * :diaslab ) + :comision + :retroact)+ :cambsaltrans + :incap) * :PORCEN) /100;
       END
      END
      ELSE
      IF ((conc_cod = 912) OR (conc_cod = 913)) THEN
      BEGIN
       entidad = :nitafc;
       SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
       IF (comision IS NULL) THEN
       comision = 0;
      SELECT N.nono_dura FROM NOMINA_NOVEDADES N WHERE N.terc_nit = :nite AND N.nono_periodo = :periodo AND N.nono_ano = :ano AND (N.TNOV_COD = 2 or (N.TNOV_COD = 3) ) INTO :diasnov;
      IF (:diasnov IS NULL) THEN
      incap = 0;
      ELSE
      incap = (:basico / 30)* :diasnov;
       IF ((conc_cod = 912) OR (conc_cod = 913) ) THEN
       BEGIN
        SELECT A.paan_cesemp FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
        SELECT c.noex_monto FROM nomina_horasext c WHERE c.noex_ano = :ano AND c.noex_periodio = :periodo AND c.noex_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :horasex;
        IF (horasex IS NOT NULL) THEN
        VALOR = (((((:basico )/30 * :diaslab ) + :comision + :horasex + :retroact)+ :cambsaltrans + :incap) * :PORCEN) /100;
        ELSE
        VALOR = (((((:basico )/30 * :diaslab ) + :comision + :retroact)+ :cambsaltrans + :incap) * :PORCEN) /100;
       END
      END
      ELSE
      BEGIN
       IF (comision IS NULL) THEN
       comision = 0;
       SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
       conc_monto = :basico + :comision;
       IF (conc_porc <> 0 AND conc_porc IS NOT NULL) THEN
       VALOR = (((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans + :incap) * :conc_porc) /100;
       ELSE
       IF (:porcen <> 0 AND :porcen IS NOT NULL) THEN
       VALOR = (((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans + :incap) * :porcen) /100;
       ELSE
       IF (:montos <> 0 AND :montos IS NOT NULL) THEN
       valor = :montos;
       ELSE
       IF (:conc_monto <> 0 AND :conc_monto IS NOT NULL) THEN
       valor = :conc_monto;
      END
     END
     item = :item + 1;
    END
    ELSE
    IF (conc_prov = 'S') THEN
    BEGIN
     conc_monto = :basico;
     IF (conc_porc <> 0 AND conc_porc IS NOT NULL) THEN
     VALOR = (((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans + :incap) * :conc_porc) /100;
     ELSE
     IF (porcen <> 0 AND porcen IS NOT NULL) THEN
     VALOR = (((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans + :incap) * :porcen) /100;
     ELSE
     IF (montos <> 0 AND montos IS NOT NULL) THEN
     VALOR = :montos;
     ELSE
     IF (conc_monto <> 0 AND conc_monto IS NOT NULL) THEN
     VALOR = :conc_monto;
     item = :item + 1;
    END
    ELSE
    IF (conc_cod = 920) THEN
    BEGIN
     SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :valor;
     IF (valor IS NULL) THEN
     valor = 0;
     item = :item + 1;
    END
    ELSE
    IF (conc_cod = 900 OR (:conc_cod = 931)) THEN
    BEGIN
     SELECT c.noex_monto FROM nomina_horasext c WHERE c.noex_ano = :ano AND c.noex_periodio = :periodo AND c.noex_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :valor;
     IF (valor IS NULL) THEN
     valor = 0;
     item = :item + 1;
    END
    ELSE
    IF (conc_cod = 932) THEN
    BEGIN
     SELECT N.nono_dura FROM NOMINA_NOVEDADES N WHERE N.terc_nit = :nite AND N.nono_periodo = :periodo AND N.nono_ano = :ano AND (N.TNOV_COD = 2 or (N.TNOV_COD = 3) ) INTO :diasnov;
     IF (:diasnov IS NULL) THEN
     valor = 0;
     ELSE
     valor = (:basico / 30)* :diasnov;
    END
    ELSE
    IF (conc_cod = 921) THEN
    BEGIN
     IF (porcen IS NOT NULL AND porcen <> 0) THEN
     valor = ((basico / 30)* :diaslab ) * :PORCEN /100;
     ELSE
     IF (conc_porc IS NOT NULL AND conc_porc <> 0) THEN
     valor = ((basico / 30)* :diaslab ) * :conc_porc /100;
    END
    EXECUTE PROCEDURE LEE_CONFIGURACION('NOMINA','GENERAL','REDONDEO AL MULTIPLO DE DIEZ EN TOTALES')RETURNING_VALUES(:aprox);
    EXECUTE PROCEDURE REDONDEE(:valor, :aprox) RETURNING_VALUES (VALOR);
    IF ((mensual = 'N') OR (periodicidad = 1))  THEN
    INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
    VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
    ELSE
    IF (mensual = 'S') THEN
    BEGIN
     IF ((:periodicidad = 2) AND (liquidaper = 1)) THEN
     BEGIN
      IF ((periodo = 1) OR (periodo = 3) OR (periodo = 5) OR (periodo = 7) OR (periodo = 9) OR (periodo = 11)
      OR (periodo = 13) OR (periodo = 15) OR (periodo = 17) OR (periodo = 19) OR (periodo = 21) OR (periodo = 23)) THEN
      INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
      VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
     END
     ELSE
     IF ((:periodicidad = 2) AND (liquidaper = 2)) THEN
     BEGIN
      IF ((periodo = 2) OR (periodo = 4) OR (periodo = 6) OR (periodo = 8) OR (periodo = 10) OR (periodo = 12)
      OR (periodo = 14) OR (periodo = 16) OR (periodo = 18) OR (periodo = 20) OR (periodo = 22) OR (periodo = 24)) THEN
      INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
      VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
     END
     ELSE
     IF ((:periodicidad = 3) AND (liquidaper = 1)) THEN
     BEGIN
      IF ((periodo = 1) OR (periodo = 5) OR (periodo = 9) OR (periodo = 13) OR (periodo = 17) OR (periodo = 21)
      OR (periodo = 25) OR (periodo = 29) OR (periodo = 33) OR (periodo = 37) OR (periodo = 41) OR (periodo = 45)
      OR (periodo = 49)) THEN
      INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
      VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
    END
    ELSE
     IF ((:periodicidad = 3) AND (liquidaper = 2)) THEN
     BEGIN
      IF ((periodo = 2) OR (periodo = 6) OR (periodo = 10) OR (periodo = 14) OR (periodo = 18) OR (periodo = 22)
      OR (periodo = 26) OR (periodo = 30) OR (periodo = 34) OR (periodo = 38) OR (periodo = 42) OR (periodo = 46)
      OR (periodo = 50)) THEN
      INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
      VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
     END
     ELSE
     IF ((:periodicidad = 3) AND (liquidaper = 3)) THEN
     BEGIN
      IF ((periodo = 3) OR (periodo = 7) OR (periodo = 11) OR (periodo = 15) OR (periodo = 19) OR (periodo = 23)
      OR (periodo = 27) OR (periodo = 31) OR (periodo = 35) OR (periodo = 39) OR (periodo = 43) OR (periodo = 47)
      OR (periodo = 51)) THEN
      INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
      VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
     END
     ELSE
     IF ((:periodicidad = 3) AND (liquidaper = 4)) THEN
     BEGIN
      IF ((periodo = 4) OR (periodo = 8) OR (periodo = 12) OR (periodo = 16) OR (periodo = 20) OR (periodo = 24)
      OR (periodo = 29) OR (periodo = 32) OR (periodo = 36) OR (periodo = 40) OR (periodo = 44) OR (periodo = 48)
      OR (periodo = 52)) THEN
      INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
      VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
     END
    END
  VALOR = 0;
  basico = 0;
   END
  END
 END
 SUSPEND;
END
^

SET TERM ; ^



INSERT INTO CONCEPTOS_NOMINA (CONC_COD, CONC_NOMBRE, CONC_DEDUC, CONC_FECINI, CONC_FECFIN, CONC_PORC, CONC_BASE, CONC_ENTIDAD, CONC_MONTO, CONC_CTAGAST, CONC_DIAS, CONC_MODIFI, CONC_DIAPAGO, CONC_PROMEDIO, CONC_TODOSPER, CONC_PROV, CONC_PERACTUAL, CONC_APORTE, CONC_APLICAPROM, CONC_PERPROMEDIO, CONC_OTROCONC, CONC_CODOTROCONC, CONC_SALARIO, CONC_CTACXP, CONC_NOMCORTO, CONC_PERIODOS, CONC_GTOEMPR, CONC_CXP, CONC_CART, CONC_TOMSAL) VALUES (934, 'AFP EMPLEADOR PROD.', 'N', '1-JAN-2008', '31-DEC-2008', NULL, 0, NULL, NULL, NULL, 'N', 'S', NULL, 'N', 'S', 'N', 'N', 'S', 'N', NULL, 'N', 0, 'N', '238030', 'AFP empresa..', NULL, 'S', 'N', 'N', 0);
INSERT INTO CONCEPTOS_NOMINA (CONC_COD, CONC_NOMBRE, CONC_DEDUC, CONC_FECINI, CONC_FECFIN, CONC_PORC, CONC_BASE, CONC_ENTIDAD, CONC_MONTO, CONC_CTAGAST, CONC_DIAS, CONC_MODIFI, CONC_DIAPAGO, CONC_PROMEDIO, CONC_TODOSPER, CONC_PROV, CONC_PERACTUAL, CONC_APORTE, CONC_APLICAPROM, CONC_PERPROMEDIO, CONC_OTROCONC, CONC_CODOTROCONC, CONC_SALARIO, CONC_CTACXP, CONC_NOMCORTO, CONC_PERIODOS, CONC_GTOEMPR, CONC_CXP, CONC_CART, CONC_TOMSAL) VALUES (935, 'ARP PROD.', 'N', '1-JAN-2008', '31-DEC-2008', 0.25, 0, NULL, NULL, NULL, 'N', 'S', NULL, 'N', 'S', 'N', 'N', 'S', 'N', NULL, 'N', 0, 'N', '237006', 'ARP..', NULL, 'S', 'N', 'N', 0);
INSERT INTO CONCEPTOS_NOMINA (CONC_COD, CONC_NOMBRE, CONC_DEDUC, CONC_FECINI, CONC_FECFIN, CONC_PORC, CONC_BASE, CONC_ENTIDAD, CONC_MONTO, CONC_CTAGAST, CONC_DIAS, CONC_MODIFI, CONC_DIAPAGO, CONC_PROMEDIO, CONC_TODOSPER, CONC_PROV, CONC_PERACTUAL, CONC_APORTE, CONC_APLICAPROM, CONC_PERPROMEDIO, CONC_OTROCONC, CONC_CODOTROCONC, CONC_SALARIO, CONC_CTACXP, CONC_NOMCORTO, CONC_PERIODOS, CONC_GTOEMPR, CONC_CXP, CONC_CART, CONC_TOMSAL) VALUES (936, 'CCF PROD.', 'N', '1-JAN-2008', '31-DEC-2008', NULL, 0, NULL, NULL, NULL, 'N', 'S', NULL, 'N', 'S', 'N', 'N', 'S', 'N', NULL, 'N', 0, 'N', '237010', 'CCF..', NULL, 'S', 'N', 'N', 0);
INSERT INTO CONCEPTOS_NOMINA (CONC_COD, CONC_NOMBRE, CONC_DEDUC, CONC_FECINI, CONC_FECFIN, CONC_PORC, CONC_BASE, CONC_ENTIDAD, CONC_MONTO, CONC_CTAGAST, CONC_DIAS, CONC_MODIFI, CONC_DIAPAGO, CONC_PROMEDIO, CONC_TODOSPER, CONC_PROV, CONC_PERACTUAL, CONC_APORTE, CONC_APLICAPROM, CONC_PERPROMEDIO, CONC_OTROCONC, CONC_CODOTROCONC, CONC_SALARIO, CONC_CTACXP, CONC_NOMCORTO, CONC_PERIODOS, CONC_GTOEMPR, CONC_CXP, CONC_CART, CONC_TOMSAL) VALUES (937, 'CESANTIAS PROD.', 'N', '1-JAN-2008', '31-DEC-2008', NULL, 0, NULL, NULL, NULL, 'N', 'S', NULL, 'N', 'S', 'S', 'N', 'S', 'N', NULL, 'N', 0, 'N', '261005', 'Cesantias..', NULL, 'S', 'N', 'N', 0);
INSERT INTO CONCEPTOS_NOMINA (CONC_COD, CONC_NOMBRE, CONC_DEDUC, CONC_FECINI, CONC_FECFIN, CONC_PORC, CONC_BASE, CONC_ENTIDAD, CONC_MONTO, CONC_CTAGAST, CONC_DIAS, CONC_MODIFI, CONC_DIAPAGO, CONC_PROMEDIO, CONC_TODOSPER, CONC_PROV, CONC_PERACTUAL, CONC_APORTE, CONC_APLICAPROM, CONC_PERPROMEDIO, CONC_OTROCONC, CONC_CODOTROCONC, CONC_SALARIO, CONC_CTACXP, CONC_NOMCORTO, CONC_PERIODOS, CONC_GTOEMPR, CONC_CXP, CONC_CART, CONC_TOMSAL) VALUES (938, 'EPS EMPLEADOR PROD.', 'N', '1-JAN-2008', '31-DEC-2008', NULL, 0, NULL, NULL, NULL, 'N', 'S', NULL, 'N', 'S', 'N', 'N', 'S', 'N', NULL, 'N', 0, 'N', '238030', 'EPS empresa..', NULL, 'S', 'N', 'N', 0);
INSERT INTO CONCEPTOS_NOMINA (CONC_COD, CONC_NOMBRE, CONC_DEDUC, CONC_FECINI, CONC_FECFIN, CONC_PORC, CONC_BASE, CONC_ENTIDAD, CONC_MONTO, CONC_CTAGAST, CONC_DIAS, CONC_MODIFI, CONC_DIAPAGO, CONC_PROMEDIO, CONC_TODOSPER, CONC_PROV, CONC_PERACTUAL, CONC_APORTE, CONC_APLICAPROM, CONC_PERPROMEDIO, CONC_OTROCONC, CONC_CODOTROCONC, CONC_SALARIO, CONC_CTACXP, CONC_NOMCORTO, CONC_PERIODOS, CONC_GTOEMPR, CONC_CXP, CONC_CART, CONC_TOMSAL) VALUES (939, 'ICBF PROD.', 'N', '1-JAN-2008', '31-DEC-2008', NULL, 0, NULL, NULL, NULL, 'N', 'S', NULL, 'N', 'S', 'N', 'N', 'S', 'N', NULL, 'N', 0, 'N', '237010', 'ICBF..', NULL, 'S', 'N', 'N', 0);
INSERT INTO CONCEPTOS_NOMINA (CONC_COD, CONC_NOMBRE, CONC_DEDUC, CONC_FECINI, CONC_FECFIN, CONC_PORC, CONC_BASE, CONC_ENTIDAD, CONC_MONTO, CONC_CTAGAST, CONC_DIAS, CONC_MODIFI, CONC_DIAPAGO, CONC_PROMEDIO, CONC_TODOSPER, CONC_PROV, CONC_PERACTUAL, CONC_APORTE, CONC_APLICAPROM, CONC_PERPROMEDIO, CONC_OTROCONC, CONC_CODOTROCONC, CONC_SALARIO, CONC_CTACXP, CONC_NOMCORTO, CONC_PERIODOS, CONC_GTOEMPR, CONC_CXP, CONC_CART, CONC_TOMSAL) VALUES (940, 'SENA PROD.', 'N', '1-JAN-2008', '31-DEC-2008', NULL, 0, NULL, NULL, NULL, 'N', 'S', NULL, 'N', 'S', 'N', 'N', 'S', 'N', NULL, 'N', 0, 'N', '237010', 'Sena..', NULL, 'S', 'N', 'N', 0);
INSERT INTO CONCEPTOS_NOMINA (CONC_COD, CONC_NOMBRE, CONC_DEDUC, CONC_FECINI, CONC_FECFIN, CONC_PORC, CONC_BASE, CONC_ENTIDAD, CONC_MONTO, CONC_CTAGAST, CONC_DIAS, CONC_MODIFI, CONC_DIAPAGO, CONC_PROMEDIO, CONC_TODOSPER, CONC_PROV, CONC_PERACTUAL, CONC_APORTE, CONC_APLICAPROM, CONC_PERPROMEDIO, CONC_OTROCONC, CONC_CODOTROCONC, CONC_SALARIO, CONC_CTACXP, CONC_NOMCORTO, CONC_PERIODOS, CONC_GTOEMPR, CONC_CXP, CONC_CART, CONC_TOMSAL) VALUES (941, 'INT. DE CESANTIAS PROD.', 'N', '1-JAN-2008', '31-JAN-2008', 0.0833, 0, NULL, NULL, NULL, 'N', 'S', NULL, 'N', 'S', 'S', 'N', 'N', 'N', NULL, 'N', 0, 'N', '261005', 'Int. cesan..', NULL, 'N', 'N', 'N', 0);
INSERT INTO CONCEPTOS_NOMINA (CONC_COD, CONC_NOMBRE, CONC_DEDUC, CONC_FECINI, CONC_FECFIN, CONC_PORC, CONC_BASE, CONC_ENTIDAD, CONC_MONTO, CONC_CTAGAST, CONC_DIAS, CONC_MODIFI, CONC_DIAPAGO, CONC_PROMEDIO, CONC_TODOSPER, CONC_PROV, CONC_PERACTUAL, CONC_APORTE, CONC_APLICAPROM, CONC_PERPROMEDIO, CONC_OTROCONC, CONC_CODOTROCONC, CONC_SALARIO, CONC_CTACXP, CONC_NOMCORTO, CONC_PERIODOS, CONC_GTOEMPR, CONC_CXP, CONC_CART, CONC_TOMSAL) VALUES (942, 'PROV. PRIMA JUNIO PROD.', 'N', '1-JAN-2008', '30-JUN-2008', 8.3333, 0, NULL, NULL, NULL, 'N', 'S', 30, 'N', 'N', 'S', 'S', 'N', 'N', NULL, 'N', 0, 'N', '261020', 'Prima jun..', NULL, 'N', 'N', 'N', 0);
INSERT INTO CONCEPTOS_NOMINA (CONC_COD, CONC_NOMBRE, CONC_DEDUC, CONC_FECINI, CONC_FECFIN, CONC_PORC, CONC_BASE, CONC_ENTIDAD, CONC_MONTO, CONC_CTAGAST, CONC_DIAS, CONC_MODIFI, CONC_DIAPAGO, CONC_PROMEDIO, CONC_TODOSPER, CONC_PROV, CONC_PERACTUAL, CONC_APORTE, CONC_APLICAPROM, CONC_PERPROMEDIO, CONC_OTROCONC, CONC_CODOTROCONC, CONC_SALARIO, CONC_CTACXP, CONC_NOMCORTO, CONC_PERIODOS, CONC_GTOEMPR, CONC_CXP, CONC_CART, CONC_TOMSAL) VALUES (943, 'PROV. PRIMA  DICIEMBRE PROD.', 'N', '1-JUL-2008', '31-DEC-2008', 8.3333, 0, NULL, NULL, NULL, 'N', 'S', 20, 'N', 'N', 'S', 'S', 'N', 'N', NULL, 'N', 0, 'N', '261020', 'Prima dic..', NULL, 'N', 'N', 'N', 0);
INSERT INTO CONCEPTOS_NOMINA (CONC_COD, CONC_NOMBRE, CONC_DEDUC, CONC_FECINI, CONC_FECFIN, CONC_PORC, CONC_BASE, CONC_ENTIDAD, CONC_MONTO, CONC_CTAGAST, CONC_DIAS, CONC_MODIFI, CONC_DIAPAGO, CONC_PROMEDIO, CONC_TODOSPER, CONC_PROV, CONC_PERACTUAL, CONC_APORTE, CONC_APLICAPROM, CONC_PERPROMEDIO, CONC_OTROCONC, CONC_CODOTROCONC, CONC_SALARIO, CONC_CTACXP, CONC_NOMCORTO, CONC_PERIODOS, CONC_GTOEMPR, CONC_CXP, CONC_CART, CONC_TOMSAL) VALUES (944, 'VACACIONES PROD.', 'N', '1-JAN-2008', '31-DEC-2008', 8.3333, 0, NULL, NULL, NULL, 'N', 'S', NULL, 'N', 'S', 'S', 'N', 'N', 'N', NULL, 'N', 0, 'N', '261015', 'Vacaciones..', NULL, 'N', 'N', 'N', 0);
INSERT INTO CONCEPTOS_NOMINA (CONC_COD, CONC_NOMBRE, CONC_DEDUC, CONC_FECINI, CONC_FECFIN, CONC_PORC, CONC_BASE, CONC_ENTIDAD, CONC_MONTO, CONC_CTAGAST, CONC_DIAS, CONC_MODIFI, CONC_DIAPAGO, CONC_PROMEDIO, CONC_TODOSPER, CONC_PROV, CONC_PERACTUAL, CONC_APORTE, CONC_APLICAPROM, CONC_PERPROMEDIO, CONC_OTROCONC, CONC_CODOTROCONC, CONC_SALARIO, CONC_CTACXP, CONC_NOMCORTO, CONC_PERIODOS, CONC_GTOEMPR, CONC_CXP, CONC_CART, CONC_TOMSAL) VALUES (945, 'HORAS EXTRAS PROD.', 'N', '1-JAN-2008', '31-DEC-2008', 0, 0, NULL, 0, NULL, 'N', 'S', NULL, 'N', 'S', 'N', 'S', 'N', 'S', NULL, 'N', NULL, 'N', '250505', 'HORAS EXT..', NULL, 'N', 'N', 'N', 0);

SET TERM ^ ;

ALTER PROCEDURE CAUSA_NOMINA(
    FEC DATE,
    PERIODO INTEGER,
    PERIODICIDAD INTEGER,
    PAGOGLOBAL CHAR(1),
    ANO CHAR(4))
RETURNS (
    IDNOMINA INTEGER)
AS
DECLARE VARIABLE item INTEGER;
DECLARE VARIABLE nite VARCHAR(20) CHARACTER SET none;
DECLARE VARIABLE nit_tercero VARCHAR(20);
DECLARE VARIABLE concept INTEGER;
DECLARE VARIABLE montos NUMERIC(18,2);
DECLARE VARIABLE porcen NUMERIC(9,4);
DECLARE VARIABLE entidad VARCHAR(20);
DECLARE VARIABLE conc_cod INTEGER;
DECLARE VARIABLE conc_deduc CHAR(1);
DECLARE VARIABLE conc_porc NUMERIC(9,4);
DECLARE VARIABLE conc_entidad INTEGER;
DECLARE VARIABLE conc_monto NUMERIC(18,2);
DECLARE VARIABLE conc_modifi CHAR(1);
DECLARE VARIABLE conc_promedio CHAR(1);
DECLARE VARIABLE emco_perprom INTEGER;
DECLARE VARIABLE valor NUMERIC(18,2);
DECLARE VARIABLE diaslab INTEGER;
DECLARE VARIABLE conc_prov CHAR(1);
DECLARE VARIABLE conc_aporte CHAR(1);
DECLARE VARIABLE numeroprom INTEGER;
DECLARE VARIABLE conc_aplicaprom CHAR(1);
DECLARE VARIABLE perinicial INTEGER;
DECLARE VARIABLE anoprom INTEGER;
DECLARE VARIABLE conc_dias CHAR(1);
DECLARE VARIABLE conc_otroconc CHAR(1);
DECLARE VARIABLE conc_codotroconc INTEGER;
DECLARE VARIABLE anosum INTEGER;
DECLARE VARIABLE salario CHAR(1) CHARACTER SET none;
DECLARE VARIABLE liquidaper INTEGER;
DECLARE VARIABLE rmod NUMERIC(2,2);
DECLARE VARIABLE basico NUMERIC(18,2);
DECLARE VARIABLE niteps VARCHAR(20);
DECLARE VARIABLE nitafc VARCHAR(20);
DECLARE VARIABLE nitafp VARCHAR(20);
DECLARE VARIABLE nitccf VARCHAR(20);
DECLARE VARIABLE gtoempr CHAR(1);
DECLARE VARIABLE comision NUMERIC(18,2);
DECLARE VARIABLE cambsaltrans NUMERIC(18,2);
DECLARE VARIABLE saldosini NUMERIC(18,2);
DECLARE VARIABLE duranov INTEGER;
DECLARE VARIABLE base NUMERIC(18,2);
DECLARE VARIABLE aprox INTEGER;
DECLARE VARIABLE mensual CHAR(1);
DECLARE VARIABLE horasex NUMERIC(18,2);
DECLARE VARIABLE diasnov INTEGER;
DECLARE VARIABLE tomasal INTEGER;
DECLARE VARIABLE retroact NUMERIC(18,2);
DECLARE VARIABLE incap NUMERIC(18,2);
BEGIN
 EXECUTE PROCEDURE cambie_id_nomina RETURNING_VALUES(:idnomina);
 INSERT INTO nomina (nomi_id, NOMI_FECCAUSA, NOMI_PAGOGLOBAL, NOMI_PERIODOCIDAD, NOMI_PERIODO, NOMI_ANO, NOMI_LIQOK)
 VALUES (:IDNOMINA, :fec,:pagoglobal, :periodicidad, :periodo, :ano, 'N');
/* fec = substr(fec,1,8) || (CAST(substr(fec,9,10) AS INTEGER)+1);
*/ item = 1;
 FOR SELECT E.TERC_NIT, E.empl_salario, e.empl_eps, e.empl_afc, e.empl_afp, e.empl_ccf
 FROM EMPLEADOS E
 WHERE E.empl_ppago = :periodicidad AND E.empl_fecret IS NULL
 INTO :nite, :basico, :niteps, :nitafc, :nitafp, :nitccf
 DO
 BEGIN
  FOR SELECT CE.TERC_NIT, CE.CONC_COD, CE.EMCO_MONTO, CE.EMCO_PORC, ce.empl_entidad, CE.emco_perprom, CE.emco_luquidaper, CE.emco_mensual, CN.CONC_COD, CN.CONC_DEDUC,CN.CONC_PORC, CN.CONC_ENTIDAD, CN.CONC_MONTO,  CN.CONC_DIAS, CN.CONC_MODIFI,
  CN.CONC_PROMEDIO, CN.conc_salario, CE.emco_perprom, CN.conc_prov, CN.conc_aporte, CN.conc_aplicaprom, cn.conc_otroconc, cn.conc_codotroconc, CN.conc_gtoempr, CN.conc_base, CE.emco_tomsal
  FROM empleado_conceptos CE, CONCEPTOS_NOMINA CN WHERE ((CE.terc_nit = :nite) AND (CE.CONC_COD = CN.CONC_COD) AND (CN.conc_fecini <= :fec AND CN.conc_fecfin >= :FEC) ) OR ((CE.terc_nit = :nite)
  AND (CE.CONC_COD = CN.CONC_COD) AND (cn.conc_todosper = 'N') AND (CE.emco_ppago = :periodo)) OR  ((CE.terc_nit = :nite) AND (CE.CONC_COD = CN.CONC_COD) AND cn.conc_todosper = 'S')  ORDER BY (TERC_NIT )
  INTO :nit_tercero, :concept,  :montos, :porcen, :entidad, :numeroprom, :liquidaper, :mensual ,:CONC_COD, :CONC_DEDUC, :CONC_PORC,
  :CONC_ENTIDAD, :CONC_MONTO, :CONC_DIAS, :CONC_MODIFI,:CONC_PROMEDIO, :salario,:EMCO_PERPROM, :conc_prov, :conc_aporte , :CONC_APLICAPROM, :conc_otroconc, :conc_codotroconc, :gtoempr, :base, :tomasal
  DO
  BEGIN
   IF (conc_dias = 'S') THEN
   EXECUTE PROCEDURE DIAS_LABORADOS (:nite, :periodo, :fec, :mensual,:conc_aporte) RETURNING_VALUES (:diaslab);
   ELSE
   BEGIN
    diaslab = 15;
    IF (mensual = 'S') THEN
    BEGIN
     IF (periodicidad = 2) THEN
     diaslab = 30;
     ELSE
     IF (liquidaper = 3) THEN
     diaslab = 30;
    END
   END
   IF (:tomasal <> 0) THEN
   BEGIN
    IF ((:periodicidad = 2) AND (:tomasal <> 2)) THEN
    BEGIN
     IF ((periodo = 2) OR (periodo = 4) OR (periodo = 6) OR (periodo = 8) OR (periodo = 10) OR (periodo = 12)
     OR (periodo = 14) OR (periodo = 16) OR (periodo = 18) OR (periodo = 20) OR (periodo = 22) OR (periodo = 24)) THEN
     basico = 0;
    END
    ELSE
    IF ((:periodicidad = 3) AND (:tomasal <> 1)) THEN
    BEGIN
     IF ((periodo = 1) OR (periodo = 5) OR (periodo = 9) OR (periodo = 13) OR (periodo = 17) OR (periodo = 21)
     OR (periodo = 25) OR (periodo = 29) OR (periodo = 33) OR (periodo = 37) OR (periodo = 41) OR (periodo = 45)
     OR (periodo = 49)) THEN
     basico = 0;
    END
    ELSE
     IF ((:periodicidad = 3) AND (:tomasal <> 2)) THEN
     BEGIN
      IF ((periodo = 2) OR (periodo = 6) OR (periodo = 10) OR (periodo = 14) OR (periodo = 18) OR (periodo = 22)
      OR (periodo = 26) OR (periodo = 30) OR (periodo = 34) OR (periodo = 38) OR (periodo = 42) OR (periodo = 46)
      OR (periodo = 50)) THEN
      basico = 0;
     END
     ELSE
     IF ((:periodicidad = 3) AND (:tomasal <> 3)) THEN
     BEGIN
      IF ((periodo = 3) OR (periodo = 7) OR (periodo = 11) OR (periodo = 15) OR (periodo = 19) OR (periodo = 23)
      OR (periodo = 27) OR (periodo = 31) OR (periodo = 35) OR (periodo = 39) OR (periodo = 43) OR (periodo = 47)
      OR (periodo = 51)) THEN
      basico = 0;
     END
     ELSE
     IF ((:periodicidad = 3) AND (:tomasal <> 4)) THEN
     BEGIN
      IF ((periodo = 4) OR (periodo = 8) OR (periodo = 12) OR (periodo = 16) OR (periodo = 20) OR (periodo = 24)
      OR (periodo = 29) OR (periodo = 32) OR (periodo = 36) OR (periodo = 40) OR (periodo = 44) OR (periodo = 48)
      OR (periodo = 52)) THEN
      basico = 0;
     END
   END
   ELSE
   BEGIN
    SELECT E.empl_salario FROM EMPLEADOS E WHERE E.terc_nit = :nite INTO :basico;
    SELECT ((n.nono_valor /30) * n.nono_dura), (n.nono_dura) FROM nomina_novedades n WHERE n.tnov_cod = 11 AND n.terc_nit = :nite AND n.nono_periodo = :periodo INTO :cambsaltrans, :duranov;
    IF (cambsaltrans IS NULL) THEN
    cambsaltrans = 0;
    IF (duranov IS NULL) THEN
    duranov = 0;
    diaslab = :diaslab - :duranov;
    IF (conc_cod = 922) THEN
    BEGIN
     SELECT SUM(P.prcu_monto) FROM prestamo_cuotas P, prestamo_nomina PN WHERE P.prcu_ano = :ano AND P.prcu_periodo = :periodo AND PN.prno_id = P.prno_id AND PN.terc_nit = :nite INTO :valor;
     IF (valor IS NULL) THEN
     valor = 0;
     item = :item + 1;
     UPDATE prestamo_cuotas  P SET prcu_ok = 'S' WHERE P.prcu_ano = :ano AND P.prcu_periodo = :periodo AND P.prno_id = (SELECT PN.prno_id FROM PRESTAMO_NOMINA PN WHERE PN.terc_nit = :nite);
    END
    ELSE
    IF ((:montos = 0) OR (:montos IS NULL)) THEN
    BEGIN
     IF ((CONC_PORC = 0 AND :porcen = 0) OR (CONC_PORC IS NULL AND :porcen = 0) OR (CONC_PORC = 0 AND :porcen IS NULL) OR (CONC_PORC IS NULL AND :porcen IS NULL) ) THEN
     BEGIN
      IF ((conc_monto <> 0) AND (conc_monto IS NOT NULL) ) THEN
      BEGIN
       VALOR = :CONC_MONTO;
       IF (:conc_dias = 'S') THEN
       valor = (:valor / 30) * :diaslab;
      END
      ELSE
      IF (salario = 'S' AND CONC_COD <> 900 AND CONC_COD <> 920) THEN
      BEGIN
       conc_monto = :basico;
       VALOR = (:conc_monto/30 * :diaslab ) + :cambsaltrans;
      END
      ELSE
      BEGIN
       valor = montos;
       IF (:conc_dias = 'S') THEN
       valor = (:valor / 30) * :diaslab;
      END
     END
     ELSE
     BEGIN
      IF (:porcen <> 0) THEN
      BEGIN
       IF ((conc_monto <> 0) AND (conc_monto IS NOT NULL) ) THEN
       BEGIN
        VALOR = ((:CONC_MONTO ) * :PORCEN) /100;
       END
      END
      ELSE
      BEGIN
       IF ((conc_monto <> 0) AND (conc_monto IS NOT NULL) ) THEN
       BEGIN
        VALOR = ((:CONC_MONTO) * :conc_porc) /100;
       END
       ELSE
       IF (salario = 'S' AND CONC_COD <> 900 AND CONC_COD <> 920) THEN
       BEGIN
        conc_monto = :basico;
        VALOR = ((:CONC_MONTO)+ :cambsaltrans * :conc_porc) /100;
       END
       ELSE
       IF (:conc_monto = 0 AND :montos = 0) THEN
       BEGIN
        conc_monto = :basico;
        VALOR = (((:CONC_MONTO / 30) * :diaslab) + :cambsaltrans * :conc_porc) /100;
       END
      END
     END
    END
    ELSE
    IF ((CONC_PORC = 0 OR (conc_porc IS NULL)) AND (:porcen = 0 OR (porcen IS NULL))) THEN
    BEGIN
     VALOR = (:montos);
     IF (:conc_dias = 'S') THEN
     valor = (:valor / 30) * :diaslab;
    END
    ELSE
    IF (:porcen <> 0 AND porcen IS NOT NULL) THEN
    BEGIN
     VALOR = ((:MONTOS ) * :PORCEN) /100;
    END
    ELSE
    BEGIN
     VALOR = ((:montos) * :CONC_PORC) /100;
    END
    IF (conc_promedio = 'S') THEN
    BEGIN
     perinicial = :periodo - (:numeroprom) + 1;
     anoprom = CAST (ano AS INTEGER);
     IF (perinicial <= 0) THEN
     BEGIN
      perinicial = 24 + :PERINICIAL;
      anoprom = CAST(ANO AS INTEGER) - 1;
     END
     SELECT SUM (noco_valor) FROM nomina_conceptos n WHERE n.noco_aplicaprom = 'S' AND N.noco_periodo >= :perinicial - 1 AND N.noco_periodo < :periodo AND N.noco_ano >= :anoprom AND N.noco_ano <= :ano AND terc_nit = :nite INTO :valor;
     valor = (valor / numeroprom);
     SELECT NOCO_VALOR FROM NOMINA_CONCEPTOS WHERE CONC_COD = :conc_cod AND TERC_NIT  = :nite AND NOCO_PAGOOK = 'N' AND NOCO_PERIODO = 0 INTO :saldosini;
     IF (saldosini IS NULL) THEN
     saldosini = 0;
     ELSE
     UPDATE nomina_conceptos N SET noco_pagook = 'S' WHERE n.noco_aplicaprom = 'S' AND N.noco_periodo >= :perinicial - 1 AND N.noco_periodo < :periodo AND N.noco_ano >= :anoprom AND N.noco_ano <= :ano  AND CONC_COD = :conc_cod AND terc_nit = :nite AND NOCO_PERIODO = 0;
     VALOR = :valor + :saldosini;
     UPDATE nomina_conceptos N SET noco_pagook = 'S' WHERE n.noco_aplicaprom = 'S' AND N.noco_periodo >= :perinicial - 1 AND N.noco_periodo < :periodo AND N.noco_ano >= :anoprom AND N.noco_ano <= :ano  AND CONC_COD = :conc_cod AND terc_nit = :nite;
    END
    ELSE
    IF (conc_otroconc = 'S') THEN
    BEGIN
     anosum = CAST(ano AS INTEGER);
     anosum = anosum - 1;
     SELECT SUM (noco_valor) FROM nomina_conceptos n WHERE n.noco_ano = :anosum AND n.conc_cod = :conc_codotroconc AND N.terc_nit = :nite INTO :valor;
     SELECT NOCO_VALOR FROM NOMINA_CONCEPTOS WHERE noco_ano = :anosum AND conc_cod = :conc_codotroconc AND terc_nit = :nite AND NOCO_PERIODO = 0 INTO :saldosini;
     IF (saldosini IS NULL) THEN
     saldosini = 0;
     ELSE
     UPDATE nomina_conceptos SET noco_pagook = 'S' WHERE noco_ano = :anosum AND conc_cod = :conc_codotroconc AND NOCO_PERIODO = 0 AND terc_nit = :nite;
     VALOR = :valor + :saldosini;
     UPDATE nomina_conceptos SET noco_pagook = 'S' WHERE noco_ano = :anosum AND conc_cod = :conc_codotroconc AND terc_nit = :nite;
    END
    ELSE
    IF (conc_aporte = 'S') THEN
    BEGIN
     horasex = NULL;
     diasnov = NULL;
     IF ((:entidad = '' ) OR (entidad IS NULL)) THEN
     BEGIN
      SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
      IF (comision IS NULL) THEN
      comision = 0;
      SELECT C.emco_monto FROM EMPLEADO_CONCEPTOS C WHERE C.terc_nit = :nite AND C.conc_cod = 933 INTO :retroact;
      IF (retroact IS NULL ) THEN
      retroact = 0;
      SELECT N.nono_dura FROM NOMINA_NOVEDADES N WHERE N.terc_nit = :nite AND N.nono_periodo = :periodo AND N.nono_ano = :ano AND (N.TNOV_COD = 2 or (N.TNOV_COD = 3) ) INTO :diasnov;
      IF (:diasnov IS NULL) THEN
      incap = 0;
      ELSE
      incap = (:basico / 30)* :diasnov;
      valor = :basico + :comision + :horasex + :retroact + :incap;
      IF ((conc_cod = 904) OR (conc_cod = 905) OR (conc_cod = 906)) THEN
      BEGIN
       entidad = :nitafp;
       IF (conc_cod = 904) THEN
       BEGIN
        SELECT A.paan_afptr FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
        SELECT N.nono_dura FROM NOMINA_NOVEDADES N WHERE N.terc_nit = :nite AND N.nono_periodo = :periodo AND N.nono_ano = :ano AND (N.TNOV_COD = 2 or (N.TNOV_COD = 3) ) INTO :diasnov;
        IF (:diasnov IS NULL) THEN
        incap = 0;
        ELSE
        incap = (:basico / 30)* :diasnov;
        SELECT c.noex_monto FROM nomina_horasext c WHERE c.noex_ano = :ano AND c.noex_periodio = :periodo AND c.noex_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :horasex;
        IF (horasex IS NOT NULL) THEN
        VALOR = (((((:basico )/30 * :diaslab ) + :comision + :horasex + :retroact+ :incap)+ :cambsaltrans ) * :PORCEN) /100;
        ELSE
        VALOR = ((((:basico)/30 * :diaslab ) + :comision + :retroact+ :cambsaltrans  + :incap) * :PORCEN) /100;
       END
       ELSE
       IF ((conc_cod = 905) OR (conc_cod = 906)) THEN
       BEGIN
        SELECT A.paan_afpem FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
        SELECT N.nono_dura FROM NOMINA_NOVEDADES N WHERE N.terc_nit = :nite AND N.nono_periodo = :periodo AND N.nono_ano = :ano AND (N.TNOV_COD = 2 or (N.TNOV_COD = 3) ) INTO :diasnov;
        IF (:diasnov IS NULL) THEN
        incap = 0;
        ELSE
        incap = (:basico / 30)* :diasnov;
        SELECT c.noex_monto FROM nomina_horasext c WHERE c.noex_ano = :ano AND c.noex_periodio = :periodo AND c.noex_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :horasex;
        IF (horasex IS NOT NULL) THEN
        VALOR = (((((:basico )/30 * :diaslab ) + :comision + :horasex + :retroact)+ :cambsaltrans + :incap) * :PORCEN) /100;
        ELSE
        VALOR = (((((:basico )/30 * :diaslab ) + :comision + :retroact)+ :cambsaltrans + :incap) * :PORCEN) /100;
       END
      END
      ELSE
      IF ((conc_cod = 907) OR (conc_cod = 914) OR (conc_cod = 915)) THEN
      BEGIN
       entidad = :niteps;
       IF (conc_cod = 907) THEN
       BEGIN
        SELECT A.paan_epstr FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
        SELECT N.nono_dura FROM NOMINA_NOVEDADES N WHERE N.terc_nit = :nite AND N.nono_periodo = :periodo AND N.nono_ano = :ano AND (N.TNOV_COD = 2 or (N.TNOV_COD = 3) ) INTO :diasnov;
        IF (:diasnov IS NULL) THEN
        incap = 0;
        ELSE
        incap = (:basico / 30)* :diasnov;
        SELECT c.noex_monto FROM nomina_horasext c WHERE c.noex_ano = :ano AND c.noex_periodio = :periodo AND c.noex_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :horasex;
        IF (horasex IS NOT NULL) THEN
        VALOR = (((((:basico )/30 * :diaslab ) + :comision + :horasex + :retroact)+ :cambsaltrans + :incap) * :PORCEN) /100;
        ELSE
        VALOR = (((((:basico )/30 * :diaslab ) + :comision + :retroact)+ :cambsaltrans + :incap) * :PORCEN) /100;
       END
       ELSE
       IF ((conc_cod = 914) OR (conc_cod = 915)) THEN
       BEGIN
        SELECT A.paan_epsem FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
        SELECT N.nono_dura FROM NOMINA_NOVEDADES N WHERE N.terc_nit = :nite AND N.nono_periodo = :periodo AND N.nono_ano = :ano AND (N.TNOV_COD = 2 or (N.TNOV_COD = 3) ) INTO :diasnov;
        IF (:diasnov IS NULL) THEN
        incap = 0;
        ELSE
        incap = (:basico / 30)* :diasnov;
        SELECT c.noex_monto FROM nomina_horasext c WHERE c.noex_ano = :ano AND c.noex_periodio = :periodo AND c.noex_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :horasex;
        IF (horasex IS NOT NULL) THEN
        VALOR = (((((:basico )/30 * :diaslab ) + :comision + :horasex + :retroact)+ :cambsaltrans + :incap) * :PORCEN) /100;
        ELSE
        VALOR = (((((:basico )/30 * :diaslab ) + :comision + :retroact)+ :cambsaltrans + :incap) * :PORCEN) /100;
       END
      END
      ELSE
      IF ((conc_cod = 910) OR (conc_cod = 911) OR (conc_cod = 916) OR (conc_cod = 917) OR (conc_cod = 918) OR (conc_cod = 919)) THEN
      BEGIN
       entidad = :nitccf;
       SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
       IF (comision IS NULL) THEN
       comision = 0;
       SELECT N.nono_dura FROM NOMINA_NOVEDADES N WHERE N.terc_nit = :nite AND N.nono_periodo = :periodo AND N.nono_ano = :ano AND (N.TNOV_COD = 2 or (N.TNOV_COD = 3) ) INTO :diasnov;
       IF (:diasnov IS NULL) THEN
       incap = 0;
       ELSE
       incap = (:basico / 30)* :diasnov;
       IF ((conc_cod = 910) OR (conc_cod = 911) ) THEN
       BEGIN
        SELECT A.paan_ccf FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
      SELECT N.nono_dura FROM NOMINA_NOVEDADES N WHERE N.terc_nit = :nite AND N.nono_periodo = :periodo AND N.nono_ano = :ano AND (N.TNOV_COD = 2 or (N.TNOV_COD = 3) ) INTO :diasnov;
      IF (:diasnov IS NULL) THEN
      incap = 0;
      ELSE
      incap = (:basico / 30)* :diasnov;
        SELECT c.noex_monto FROM nomina_horasext c WHERE c.noex_ano = :ano AND c.noex_periodio = :periodo AND c.noex_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :horasex;
        IF (horasex IS NOT NULL) THEN
        VALOR = (((((:basico )/30 * :diaslab ) + :comision + :horasex + :retroact)+ :cambsaltrans + :incap) * :PORCEN) /100;
        ELSE
        VALOR = (((((:basico )/30 * :diaslab ) + :comision + :retroact)+ :cambsaltrans + :incap) * :PORCEN) /100;
       END
       ELSE
       IF ((conc_cod = 916) OR (conc_cod = 917)) THEN
       BEGIN
        SELECT A.paan_icbf FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
      SELECT N.nono_dura FROM NOMINA_NOVEDADES N WHERE N.terc_nit = :nite AND N.nono_periodo = :periodo AND N.nono_ano = :ano AND (N.TNOV_COD = 2 or (N.TNOV_COD = 3) ) INTO :diasnov;
      IF (:diasnov IS NULL) THEN
      incap = 0;
      ELSE
      incap = (:basico / 30)* :diasnov;      SELECT N.nono_dura FROM NOMINA_NOVEDADES N WHERE N.terc_nit = :nite AND N.nono_periodo = :periodo AND N.nono_ano = :ano AND (N.TNOV_COD = 2 or (N.TNOV_COD = 3) ) INTO :diasnov;
      IF (:diasnov IS NULL) THEN
      incap = 0;
      ELSE
      incap = (:basico / 30)* :diasnov;
        SELECT c.noex_monto FROM nomina_horasext c WHERE c.noex_ano = :ano AND c.noex_periodio = :periodo AND c.noex_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :horasex;
        IF (horasex IS NOT NULL) THEN
        VALOR = (((((:basico )/30 * :diaslab ) + :comision + :horasex + :retroact)+ :cambsaltrans + :incap) * :PORCEN) /100;
        ELSE
        VALOR = (((((:basico )/30 * :diaslab ) + :comision + :retroact)+ :cambsaltrans + :incap) * :PORCEN) /100;
       END
       ELSE
       IF ((conc_cod = 918) OR (conc_cod = 919)) THEN
       BEGIN
        SELECT A.paan_sena FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
      SELECT N.nono_dura FROM NOMINA_NOVEDADES N WHERE N.terc_nit = :nite AND N.nono_periodo = :periodo AND N.nono_ano = :ano AND (N.TNOV_COD = 2 or (N.TNOV_COD = 3) ) INTO :diasnov;
      IF (:diasnov IS NULL) THEN
      incap = 0;
      ELSE
      incap = (:basico / 30)* :diasnov;
        SELECT c.noex_monto FROM nomina_horasext c WHERE c.noex_ano = :ano AND c.noex_periodio = :periodo AND c.noex_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :horasex;
        IF (horasex IS NOT NULL) THEN
        VALOR = (((((:basico )/30 * :diaslab ) + :comision + :horasex + :retroact)+ :cambsaltrans + :incap) * :PORCEN) /100;
        ELSE
        VALOR = (((((:basico )/30 * :diaslab ) + :comision + :retroact)+ :cambsaltrans + :incap) * :PORCEN) /100;
       END
      END
      ELSE
      IF ((conc_cod = 912) OR (conc_cod = 913)) THEN
      BEGIN
       entidad = :nitafc;
       SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
       IF (comision IS NULL) THEN
       comision = 0;
      SELECT N.nono_dura FROM NOMINA_NOVEDADES N WHERE N.terc_nit = :nite AND N.nono_periodo = :periodo AND N.nono_ano = :ano AND (N.TNOV_COD = 2 or (N.TNOV_COD = 3) ) INTO :diasnov;
      IF (:diasnov IS NULL) THEN
      incap = 0;
      ELSE
      incap = (:basico / 30)* :diasnov;
       IF ((conc_cod = 912) OR (conc_cod = 913) ) THEN
       BEGIN
        SELECT A.paan_cesemp FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
        SELECT c.noex_monto FROM nomina_horasext c WHERE c.noex_ano = :ano AND c.noex_periodio = :periodo AND c.noex_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :horasex;
        IF (horasex IS NOT NULL) THEN
        VALOR = (((((:basico )/30 * :diaslab ) + :comision + :horasex + :retroact)+ :cambsaltrans + :incap) * :PORCEN) /100;
        ELSE
        VALOR = (((((:basico )/30 * :diaslab ) + :comision + :retroact)+ :cambsaltrans + :incap) * :PORCEN) /100;
       END
      END
      ELSE
      BEGIN
       IF (comision IS NULL) THEN
       comision = 0;
       SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
       conc_monto = :basico + :comision;
       IF (conc_porc <> 0 AND conc_porc IS NOT NULL) THEN
       VALOR = (((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans + :incap) * :conc_porc) /100;
       ELSE
       IF (:porcen <> 0 AND :porcen IS NOT NULL) THEN
       VALOR = (((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans + :incap) * :porcen) /100;
       ELSE
       IF (:montos <> 0 AND :montos IS NOT NULL) THEN
       valor = :montos;
       ELSE
       IF (:conc_monto <> 0 AND :conc_monto IS NOT NULL) THEN
       valor = :conc_monto;
      END
     END
     item = :item + 1;
    END
    ELSE
    IF (conc_prov = 'S') THEN
    BEGIN
     conc_monto = :basico;
     IF (conc_porc <> 0 AND conc_porc IS NOT NULL) THEN
     VALOR = (((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans + :incap) * :conc_porc) /100;
     ELSE
     IF (porcen <> 0 AND porcen IS NOT NULL) THEN
     VALOR = (((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans + :incap) * :porcen) /100;
     ELSE
     IF (montos <> 0 AND montos IS NOT NULL) THEN
     VALOR = :montos;
     ELSE
     IF (conc_monto <> 0 AND conc_monto IS NOT NULL) THEN
     VALOR = :conc_monto;
     item = :item + 1;
    END
    ELSE
    IF (conc_cod = 920) THEN
    BEGIN
     SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :valor;
     IF (valor IS NULL) THEN
     valor = 0;
     item = :item + 1;
    END
    ELSE
    IF (conc_cod = 900 OR (:conc_cod = 931) or (:conc_cod = 945) ) THEN
    BEGIN
     SELECT c.noex_monto FROM nomina_horasext c WHERE c.noex_ano = :ano AND c.noex_periodio = :periodo AND c.noex_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :valor;
     IF (valor IS NULL) THEN
     valor = 0;
     item = :item + 1;
    END
    ELSE
    IF (conc_cod = 932) THEN
    BEGIN
     SELECT N.nono_dura FROM NOMINA_NOVEDADES N WHERE N.terc_nit = :nite AND N.nono_periodo = :periodo AND N.nono_ano = :ano AND (N.TNOV_COD = 2 or (N.TNOV_COD = 3) ) INTO :diasnov;
     IF (:diasnov IS NULL) THEN
     valor = 0;
     ELSE
     valor = (:basico / 30)* :diasnov;
    END
    ELSE
    IF (conc_cod = 921) THEN
    BEGIN
     IF (porcen IS NOT NULL AND porcen <> 0) THEN
     valor = ((basico / 30)* :diaslab ) * :PORCEN /100;
     ELSE
     IF (conc_porc IS NOT NULL AND conc_porc <> 0) THEN
     valor = ((basico / 30)* :diaslab ) * :conc_porc /100;
    END
    EXECUTE PROCEDURE LEE_CONFIGURACION('NOMINA','GENERAL','REDONDEO AL MULTIPLO DE DIEZ EN TOTALES')RETURNING_VALUES(:aprox);
    EXECUTE PROCEDURE REDONDEE(:valor, :aprox) RETURNING_VALUES (VALOR);
    IF ((mensual = 'N') OR (periodicidad = 1))  THEN
    INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
    VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
    ELSE
    IF (mensual = 'S') THEN
    BEGIN
     IF ((:periodicidad = 2) AND (liquidaper = 1)) THEN
     BEGIN
      IF ((periodo = 1) OR (periodo = 3) OR (periodo = 5) OR (periodo = 7) OR (periodo = 9) OR (periodo = 11)
      OR (periodo = 13) OR (periodo = 15) OR (periodo = 17) OR (periodo = 19) OR (periodo = 21) OR (periodo = 23)) THEN
      INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
      VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
     END
     ELSE
     IF ((:periodicidad = 2) AND (liquidaper = 2)) THEN
     BEGIN
      IF ((periodo = 2) OR (periodo = 4) OR (periodo = 6) OR (periodo = 8) OR (periodo = 10) OR (periodo = 12)
      OR (periodo = 14) OR (periodo = 16) OR (periodo = 18) OR (periodo = 20) OR (periodo = 22) OR (periodo = 24)) THEN
      INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
      VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
     END
     ELSE
     IF ((:periodicidad = 3) AND (liquidaper = 1)) THEN
     BEGIN
      IF ((periodo = 1) OR (periodo = 5) OR (periodo = 9) OR (periodo = 13) OR (periodo = 17) OR (periodo = 21)
      OR (periodo = 25) OR (periodo = 29) OR (periodo = 33) OR (periodo = 37) OR (periodo = 41) OR (periodo = 45)
      OR (periodo = 49)) THEN
      INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
      VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
    END
    ELSE
     IF ((:periodicidad = 3) AND (liquidaper = 2)) THEN
     BEGIN
      IF ((periodo = 2) OR (periodo = 6) OR (periodo = 10) OR (periodo = 14) OR (periodo = 18) OR (periodo = 22)
      OR (periodo = 26) OR (periodo = 30) OR (periodo = 34) OR (periodo = 38) OR (periodo = 42) OR (periodo = 46)
      OR (periodo = 50)) THEN
      INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
      VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
     END
     ELSE
     IF ((:periodicidad = 3) AND (liquidaper = 3)) THEN
     BEGIN
      IF ((periodo = 3) OR (periodo = 7) OR (periodo = 11) OR (periodo = 15) OR (periodo = 19) OR (periodo = 23)
      OR (periodo = 27) OR (periodo = 31) OR (periodo = 35) OR (periodo = 39) OR (periodo = 43) OR (periodo = 47)
      OR (periodo = 51)) THEN
      INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
      VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
     END
     ELSE
     IF ((:periodicidad = 3) AND (liquidaper = 4)) THEN
     BEGIN
      IF ((periodo = 4) OR (periodo = 8) OR (periodo = 12) OR (periodo = 16) OR (periodo = 20) OR (periodo = 24)
      OR (periodo = 29) OR (periodo = 32) OR (periodo = 36) OR (periodo = 40) OR (periodo = 44) OR (periodo = 48)
      OR (periodo = 52)) THEN
      INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
      VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
     END
    END
  VALOR = 0;
  basico = 0;
   END
  END
 END
 SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE CAUSA_NOMINA(
    FEC DATE,
    PERIODO INTEGER,
    PERIODICIDAD INTEGER,
    PAGOGLOBAL CHAR(1),
    ANO CHAR(4))
RETURNS (
    IDNOMINA INTEGER)
AS
declare variable item integer;
declare variable nite varchar(20) character set none;
declare variable nit_tercero varchar(20);
declare variable concept integer;
declare variable montos numeric(18,2);
declare variable porcen numeric(9,4);
declare variable entidad varchar(20);
declare variable conc_cod integer;
declare variable conc_deduc char(1);
declare variable conc_porc numeric(9,4);
declare variable conc_entidad integer;
declare variable conc_monto numeric(18,2);
declare variable conc_modifi char(1);
declare variable conc_promedio char(1);
declare variable emco_perprom integer;
declare variable valor numeric(18,2);
declare variable diaslab integer;
declare variable conc_prov char(1);
declare variable conc_aporte char(1);
declare variable numeroprom integer;
declare variable conc_aplicaprom char(1);
declare variable perinicial integer;
declare variable anoprom integer;
declare variable conc_dias char(1);
declare variable conc_otroconc char(1);
declare variable conc_codotroconc integer;
declare variable anosum integer;
declare variable salario char(1) character set none;
declare variable liquidaper integer;
declare variable rmod numeric(2,2);
declare variable basico numeric(18,2);
declare variable niteps varchar(20);
declare variable nitafc varchar(20);
declare variable nitafp varchar(20);
declare variable nitccf varchar(20);
declare variable gtoempr char(1);
declare variable comision numeric(18,2);
declare variable cambsaltrans numeric(18,2);
declare variable saldosini numeric(18,2);
declare variable duranov integer;
declare variable base numeric(18,2);
declare variable aprox integer;
declare variable mensual char(1);
declare variable horasex numeric(18,2);
declare variable diasnov integer;
declare variable tomasal integer;
declare variable retroact numeric(18,2);
BEGIN
/* SI ES QUINCENAL */
EXECUTE PROCEDURE cambie_id_nomina RETURNING_VALUES(:idnomina);
INSERT INTO nomina (nomi_id, NOMI_FECCAUSA, NOMI_PAGOGLOBAL, NOMI_PERIODOCIDAD, NOMI_PERIODO, NOMI_ANO, NOMI_LIQOK)
VALUES (:IDNOMINA, :fec,:pagoglobal, :periodicidad, :periodo, :ano, 'N');
 BEGIN
/*fec = substr(fec,1,8) || (CAST(substr(fec,9,10) AS INTEGER)+1);
*/    item = 1;
    FOR SELECT E.TERC_NIT, E.empl_salario, e.empl_eps, e.empl_afc, e.empl_afp, e.empl_ccf
    FROM EMPLEADOS E
    WHERE E.empl_ppago = :periodicidad AND E.empl_fecret IS NULL
    INTO :nite, :basico, :niteps, :nitafc, :nitafp, :nitccf
    DO
    BEGIN
    FOR SELECT CE.TERC_NIT, CE.CONC_COD, CE.EMCO_MONTO, CE.EMCO_PORC, ce.empl_entidad, CE.emco_perprom, CE.emco_luquidaper, CE.emco_mensual, CN.CONC_COD, CN.CONC_DEDUC,CN.CONC_PORC, CN.CONC_ENTIDAD, CN.CONC_MONTO,  CN.CONC_DIAS, CN.CONC_MODIFI,
    CN.CONC_PROMEDIO, CN.conc_salario, CE.emco_perprom, CN.conc_prov, CN.conc_aporte, CN.conc_aplicaprom, cn.conc_otroconc, cn.conc_codotroconc, CN.conc_gtoempr, CN.conc_base, CE.emco_tomsal
    FROM empleado_conceptos CE, CONCEPTOS_NOMINA CN WHERE ((CE.terc_nit = :nite) AND (CE.CONC_COD = CN.CONC_COD) AND (CN.conc_fecini <= :fec AND CN.conc_fecfin >= :FEC) ) OR ((CE.terc_nit = :nite)
    AND (CE.CONC_COD = CN.CONC_COD) AND (cn.conc_todosper = 'N') AND (CE.emco_ppago = :periodo)) OR  ((CE.terc_nit = :nite) AND (CE.CONC_COD = CN.CONC_COD) AND cn.conc_todosper = 'S')  ORDER BY (TERC_NIT )
    INTO :nit_tercero, :concept,  :montos, :porcen, :entidad, :numeroprom, :liquidaper, :mensual ,:CONC_COD, :CONC_DEDUC, :CONC_PORC,
    :CONC_ENTIDAD, :CONC_MONTO, :CONC_DIAS, :CONC_MODIFI,:CONC_PROMEDIO, :salario,:EMCO_PERPROM, :conc_prov, :conc_aporte , :CONC_APLICAPROM, :conc_otroconc, :conc_codotroconc, :gtoempr, :base, :tomasal
    DO
BEGIN
    IF (conc_dias = 'S') THEN
    EXECUTE PROCEDURE DIAS_LABORADOS (:nite, :periodo, :fec, :mensual,:conc_aporte) RETURNING_VALUES (:diaslab);
    ELSE
    BEGIN
    diaslab = 15;
    IF (mensual = 'S') THEN
    BEGIN
    IF (periodicidad = 2) THEN
    diaslab = 30;
    ELSE
    IF (liquidaper = 3) THEN
    diaslab = 30;
    END
    END
    if (:tomasal <> 0) then
    begin
         IF ((:periodicidad = 2) AND (:tomasal <> 2)) THEN
         BEGIN
          IF ((periodo = 2) OR (periodo = 4) OR (periodo = 6) OR (periodo = 8) OR (periodo = 10) OR (periodo = 12)
          OR (periodo = 14) OR (periodo = 16) OR (periodo = 18) OR (periodo = 20) OR (periodo = 22) OR (periodo = 24)) THEN
         basico = 0;
         END
         ELSE
         IF ((:periodicidad = 3) AND (:tomasal <> 1)) THEN
         BEGIN
          IF ((periodo = 1) OR (periodo = 5) OR (periodo = 9) OR (periodo = 13) OR (periodo = 17) OR (periodo = 21)
          OR (periodo = 25) OR (periodo = 29) OR (periodo = 33) OR (periodo = 37) OR (periodo = 41) OR (periodo = 45)
          OR (periodo = 49)) THEN
          basico = 0;
         END
         ELSE
         IF ((:periodicidad = 3) AND (:tomasal <> 2)) THEN
         BEGIN
          IF ((periodo = 2) OR (periodo = 6) OR (periodo = 10) OR (periodo = 14) OR (periodo = 18) OR (periodo = 22)
          OR (periodo = 26) OR (periodo = 30) OR (periodo = 34) OR (periodo = 38) OR (periodo = 42) OR (periodo = 46)
          OR (periodo = 50)) THEN
          basico = 0;
         END
         ELSE
         IF ((:periodicidad = 3) AND (:tomasal <> 3)) THEN
         BEGIN
          IF ((periodo = 3) OR (periodo = 7) OR (periodo = 11) OR (periodo = 15) OR (periodo = 19) OR (periodo = 23)
          OR (periodo = 27) OR (periodo = 31) OR (periodo = 35) OR (periodo = 39) OR (periodo = 43) OR (periodo = 47)
          OR (periodo = 51)) THEN
          basico = 0;
         END
         ELSE
         IF ((:periodicidad = 3) AND (:tomasal <> 4)) THEN
         BEGIN
          IF ((periodo = 4) OR (periodo = 8) OR (periodo = 12) OR (periodo = 16) OR (periodo = 20) OR (periodo = 24)
          OR (periodo = 29) OR (periodo = 32) OR (periodo = 36) OR (periodo = 40) OR (periodo = 44) OR (periodo = 48)
          OR (periodo = 52)) THEN
          basico = 0;
         END
    end
    ELSE
    SELECT E.empl_salario FROM EMPLEADOS E WHERE E.terc_nit = :nite INTO :basico;
 SELECT ((n.nono_valor /30) * n.nono_dura), (n.nono_dura) FROM nomina_novedades n WHERE n.tnov_cod = 11 AND n.terc_nit = :nite AND n.nono_periodo = :periodo INTO :cambsaltrans, :duranov;
 IF (cambsaltrans IS NULL) THEN
 cambsaltrans = 0;
 IF (duranov IS NULL) THEN
 duranov = 0;
 diaslab = :diaslab - :duranov;
 IF (conc_cod = 921) THEN
 BEGIN
 IF (porcen IS NOT NULL AND porcen <> 0) THEN
 valor = ((basico / 30)* :diaslab ) * :PORCEN /100;
 ELSE
 IF (conc_porc IS NOT NULL AND conc_porc <> 0) THEN
 valor = ((basico / 30)* :diaslab ) * :conc_porc /100;
 END
 ELSE
 IF (conc_cod = 922) THEN
 BEGIN
 SELECT P.prcu_monto FROM prestamo_cuotas P, prestamo_nomina PN WHERE P.prcu_ano = :ano AND P.prcu_periodo = :periodo AND PN.prno_id = P.prno_id AND PN.terc_nit = :nite INTO :valor;
 IF (valor IS NULL) THEN
 valor = 0;
 item = :item + 1;
 UPDATE prestamo_cuotas  P SET prcu_ok = 'S' WHERE P.prcu_ano = :ano AND P.prcu_periodo = :periodo AND P.prno_id = (SELECT PN.prno_id FROM PRESTAMO_NOMINA PN WHERE PN.terc_nit = :nite);
 END
 ELSE
 BEGIN
    IF ((:montos = 0) OR (:montos IS NULL)) THEN
      BEGIN
      IF ((CONC_PORC = 0 AND :porcen = 0) OR (CONC_PORC IS NULL AND :porcen = 0) OR (CONC_PORC = 0 AND :porcen IS NULL) OR (CONC_PORC IS NULL AND :porcen IS NULL) ) THEN
        BEGIN
        IF ((conc_monto <> 0) AND (conc_monto IS NOT NULL) ) THEN
        BEGIN
        VALOR = :CONC_MONTO;
        IF (:conc_dias = 'S') THEN
        valor = (:valor / 30) * :diaslab;
        END
        ELSE
        IF (salario = 'S' AND CONC_COD <> 900 AND CONC_COD <> 920) THEN
        BEGIN
        conc_monto = :basico;
        VALOR = (:conc_monto/30 * :diaslab ) + :cambsaltrans;
        END
        ELSE
        BEGIN
        valor = montos;
        IF (:conc_dias = 'S') THEN
        valor = (:valor / 30) * :diaslab;
        END
        END
       ELSE
       BEGIN
        IF (:porcen <> 0) THEN
          BEGIN
            IF ((conc_monto <> 0) AND (conc_monto IS NOT NULL) ) THEN
            BEGIN
              VALOR = ((:CONC_MONTO ) * :PORCEN) /100;
            END
          END
          ELSE
          BEGIN
            IF ((conc_monto <> 0) AND (conc_monto IS NOT NULL) ) THEN
            BEGIN
              VALOR = ((:CONC_MONTO) * :conc_porc) /100;
            END
            ELSE
        IF (salario = 'S' AND CONC_COD <> 900 AND CONC_COD <> 920) THEN
            BEGIN
              conc_monto = :basico;
              VALOR = ((:CONC_MONTO)+ :cambsaltrans * :conc_porc) /100;
            END
            ELSE
            if (:conc_monto = 0 AND :montos = 0) then
            BEGIN
            conc_monto = :basico;
            VALOR = (((:CONC_MONTO / 30) * :diaslab) + :cambsaltrans * :conc_porc) /100;
            END
          END
       END
      END
    ELSE
    BEGIN
      IF ((CONC_PORC = 0 OR (conc_porc IS NULL)) AND (:porcen = 0 OR (porcen IS NULL))) THEN
      BEGIN
      VALOR = (:montos);
      IF (:conc_dias = 'S') THEN
      valor = (:valor / 30) * :diaslab;
      END
      ELSE
      BEGIN
        IF (:porcen <> 0 AND porcen IS NOT NULL) THEN
          BEGIN
          VALOR = ((:MONTOS ) * :PORCEN) /100;
          END
          ELSE
          BEGIN
          VALOR = ((:montos) * :CONC_PORC) /100;
          END
          END
   END
    IF (conc_promedio = 'S') THEN
    BEGIN
    perinicial = :periodo - (:numeroprom) + 1;
    anoprom = CAST (ano AS INTEGER);
    IF (perinicial <= 0) THEN
    BEGIN
    perinicial = 24 + :PERINICIAL;
    anoprom = CAST(ANO AS INTEGER) - 1;
    END
    SELECT SUM (noco_valor) FROM nomina_conceptos n WHERE n.noco_aplicaprom = 'S' AND N.noco_periodo >= :perinicial - 1 AND N.noco_periodo < :periodo AND N.noco_ano >= :anoprom AND N.noco_ano <= :ano AND terc_nit = :nite INTO :valor;
    valor = (valor / numeroprom);
    SELECT NOCO_VALOR FROM NOMINA_CONCEPTOS WHERE CONC_COD = :conc_cod AND TERC_NIT  = :nite AND NOCO_PAGOOK = 'N' AND NOCO_PERIODO = 0 INTO :saldosini;
    IF (saldosini IS NULL) THEN
    saldosini = 0;
    ELSE
    UPDATE nomina_conceptos N SET noco_pagook = 'S' WHERE n.noco_aplicaprom = 'S' AND N.noco_periodo >= :perinicial - 1 AND N.noco_periodo < :periodo AND N.noco_ano >= :anoprom AND N.noco_ano <= :ano  AND CONC_COD = :conc_cod AND terc_nit = :nite AND NOCO_PERIODO = 0;
    VALOR = :valor + :saldosini;
    UPDATE nomina_conceptos N SET noco_pagook = 'S' WHERE n.noco_aplicaprom = 'S' AND N.noco_periodo >= :perinicial - 1 AND N.noco_periodo < :periodo AND N.noco_ano >= :anoprom AND N.noco_ano <= :ano  AND CONC_COD = :conc_cod AND terc_nit = :nite;
    END
    IF (conc_otroconc = 'S') THEN
    BEGIN
    anosum = CAST(ano AS INTEGER);
    anosum = anosum - 1;
    SELECT SUM (noco_valor) FROM nomina_conceptos n WHERE n.noco_ano = :anosum AND n.conc_cod = :conc_codotroconc AND N.terc_nit = :nite INTO :valor;
    SELECT NOCO_VALOR FROM NOMINA_CONCEPTOS WHERE noco_ano = :anosum AND conc_cod = :conc_codotroconc AND terc_nit = :nite AND NOCO_PERIODO = 0 INTO :saldosini;
    IF (saldosini IS NULL) THEN
    saldosini = 0;
    ELSE
    UPDATE nomina_conceptos SET noco_pagook = 'S' WHERE noco_ano = :anosum AND conc_cod = :conc_codotroconc AND NOCO_PERIODO = 0 AND terc_nit = :nite;
    VALOR = :valor + :saldosini;
    UPDATE nomina_conceptos SET noco_pagook = 'S' WHERE noco_ano = :anosum AND conc_cod = :conc_codotroconc AND terc_nit = :nite;
    END
/*SI EL CONCEPTO ES UN APORTE*/
IF (conc_aporte = 'S') THEN
BEGIN
    horasex = null;
    diasnov = null;
    IF ((:entidad = '' ) OR (entidad IS NULL)) THEN
    BEGIN
     SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
    IF (comision IS NULL) THEN
     comision = 0;
     SELECT C.emco_monto FROM EMPLEADO_CONCEPTOS C WHERE C.terc_nit = :nite AND C.conc_cod = 933 INTO :retroact;
     if (retroact IS NULL ) then
     retroact = 0;
     valor = :basico + :comision + :horasex + :retroact;
     select n.nono_dura from nomina_novedades n where n.terc_nit = :nite and n.tnov_cod = 6 and n.nono_periodo = :periodo and n.nono_ano = :ano into :diasnov;
     if (diasnov is null) then
     diasnov = 0;
     if ((diasnov is not null) and (diasnov <> 0)) then
     diaslab = :diaslab - :diasnov;
    IF ((conc_cod = 904) OR (conc_cod = 905) OR (conc_cod = 906)) THEN
            BEGIN
            entidad = :nitafp;
                IF (conc_cod = 904) THEN
                BEGIN
                SELECT A.paan_afptr FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                SELECT c.noex_monto FROM nomina_horasext c WHERE c.noex_ano = :ano AND c.noex_periodio = :periodo AND c.noex_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :horasex;
                if (horasex is not null) then
                VALOR = (((((:basico )/30 * :diaslab ) + :comision + :horasex + :retroact)+ :cambsaltrans) * :PORCEN) /100;
                else
                VALOR = (((((:basico )/30 * :diaslab ) + :comision + :retroact)+ :cambsaltrans) * :PORCEN) /100;
                END
                ELSE
                IF ((conc_cod = 905) OR (conc_cod = 906)) THEN
                BEGIN
                SELECT A.paan_afpem FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                SELECT c.noex_monto FROM nomina_horasext c WHERE c.noex_ano = :ano AND c.noex_periodio = :periodo AND c.noex_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :horasex;
                if (horasex is not null) then
                VALOR = (((((:basico )/30 * :diaslab ) + :comision + :horasex + :retroact)+ :cambsaltrans) * :PORCEN) /100;
                else
                VALOR = (((((:basico )/30 * :diaslab ) + :comision + :retroact)+ :cambsaltrans) * :PORCEN) /100;
                END
            END
            ELSE
       IF ((conc_cod = 907) OR (conc_cod = 914) OR (conc_cod = 915)) THEN
            BEGIN
            entidad = :niteps;
                IF (conc_cod = 907) THEN
                BEGIN
                SELECT A.paan_epstr FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                SELECT c.noex_monto FROM nomina_horasext c WHERE c.noex_ano = :ano AND c.noex_periodio = :periodo AND c.noex_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :horasex;
                if (horasex is not null) then
                VALOR = (((((:basico )/30 * :diaslab ) + :comision + :horasex + :retroact)+ :cambsaltrans) * :PORCEN) /100;
                else
                VALOR = (((((:basico )/30 * :diaslab ) + :comision + :retroact)+ :cambsaltrans) * :PORCEN) /100;
                END
                ELSE
                IF ((conc_cod = 914) OR (conc_cod = 915)) THEN
                BEGIN
                SELECT A.paan_epsem FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                SELECT c.noex_monto FROM nomina_horasext c WHERE c.noex_ano = :ano AND c.noex_periodio = :periodo AND c.noex_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :horasex;
                if (horasex is not null) then
                VALOR = (((((:basico )/30 * :diaslab ) + :comision + :horasex + :retroact)+ :cambsaltrans) * :PORCEN) /100;
                else
                VALOR = (((((:basico )/30 * :diaslab ) + :comision + :retroact)+ :cambsaltrans) * :PORCEN) /100;
                END
            END
            ELSE
       IF ((conc_cod = 910) OR (conc_cod = 911) OR (conc_cod = 916) OR (conc_cod = 917) OR (conc_cod = 918) OR (conc_cod = 919)) THEN
            BEGIN
            entidad = :nitccf;
            SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
            IF (comision IS NULL) THEN
            comision = 0;
                IF ((conc_cod = 910) OR (conc_cod = 911) ) THEN
                BEGIN
                SELECT A.paan_ccf FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                SELECT c.noex_monto FROM nomina_horasext c WHERE c.noex_ano = :ano AND c.noex_periodio = :periodo AND c.noex_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :horasex;
                if (horasex is not null) then
                VALOR = (((((:basico )/30 * :diaslab ) + :comision + :horasex + :retroact)+ :cambsaltrans) * :PORCEN) /100;
                else
                VALOR = (((((:basico )/30 * :diaslab ) + :comision + :retroact /*+ :horasex*/)+ :cambsaltrans) * :PORCEN) /100;
                END
                ELSE
                IF ((conc_cod = 916) OR (conc_cod = 917)) THEN
                BEGIN
                SELECT A.paan_icbf FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                SELECT c.noex_monto FROM nomina_horasext c WHERE c.noex_ano = :ano AND c.noex_periodio = :periodo AND c.noex_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :horasex;
                if (horasex is not null) then
                VALOR = (((((:basico )/30 * :diaslab ) + :comision + :horasex + :retroact)+ :cambsaltrans) * :PORCEN) /100;
                else
                VALOR = (((((:basico )/30 * :diaslab ) + :comision + :retroact/*+ :horasex*/)+ :cambsaltrans) * :PORCEN) /100;
                END
                ELSE
                IF ((conc_cod = 918) OR (conc_cod = 919)) THEN
                BEGIN
                SELECT A.paan_sena FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                SELECT c.noex_monto FROM nomina_horasext c WHERE c.noex_ano = :ano AND c.noex_periodio = :periodo AND c.noex_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :horasex;
                if (horasex is not null) then
                VALOR = (((((:basico )/30 * :diaslab ) + :comision + :horasex + :retroact)+ :cambsaltrans) * :PORCEN) /100;
                else
                VALOR = (((((:basico )/30 * :diaslab ) + :comision + :retroact/*+ :horasex*/)+ :cambsaltrans) * :PORCEN) /100;
                END
            END
            ELSE
        IF ((conc_cod = 912) OR (conc_cod = 913)) THEN
            BEGIN
            entidad = :nitafc;
            SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
            IF (comision IS NULL) THEN
            comision = 0;
                IF ((conc_cod = 912) OR (conc_cod = 913) ) THEN
                BEGIN
                SELECT A.paan_cesemp FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
                SELECT c.noex_monto FROM nomina_horasext c WHERE c.noex_ano = :ano AND c.noex_periodio = :periodo AND c.noex_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :horasex;
                if (horasex is not null) then
                VALOR = (((((:basico )/30 * :diaslab ) + :comision + :horasex + :retroact)+ :cambsaltrans) * :PORCEN) /100;
                else
                VALOR = (((((:basico )/30 * :diaslab ) + :comision + :retroact/*+ :horasex*/)+ :cambsaltrans) * :PORCEN) /100;
                END
            END
            ELSE
        BEGIN
        IF (comision IS NULL) THEN
        comision = 0;
        SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
        conc_monto = :basico + :comision;
        IF (conc_porc <> 0 AND conc_porc IS NOT NULL) THEN
        VALOR = (((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans) * :conc_porc) /100;
        ELSE
        IF (:porcen <> 0 AND :porcen IS NOT NULL) THEN
        VALOR = (((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans) * :porcen) /100;
        ELSE
        IF (:montos <> 0 AND :montos IS NOT NULL) THEN
        valor = :montos;
        ELSE
        IF (:conc_monto <> 0 AND :conc_monto IS NOT NULL) THEN
        valor = :conc_monto;
        END
    END
    END
    ELSE
    IF (conc_prov = 'S') THEN
    BEGIN
        conc_monto = :basico;
        IF (conc_porc <> 0 AND conc_porc IS NOT NULL) THEN
        VALOR = (((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans) * :conc_porc) /100;
        ELSE
        IF (porcen <> 0 AND porcen IS NOT NULL) THEN
        VALOR = (((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans) * :porcen) /100;
        ELSE
        IF (montos <> 0 AND montos IS NOT NULL) THEN
        VALOR = :montos;
        ELSE
        IF (conc_monto <> 0 AND conc_monto IS NOT NULL) THEN
        VALOR = :conc_monto;
    END
item = :item + 1;
END
 IF (conc_cod = 920) THEN
 BEGIN
 SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :valor;
 IF (valor IS NULL) THEN
 valor = 0;
 item = :item + 1;
 END
 ELSE
 if (conc_cod = 900 or (:conc_cod = 931)) then
 BEGIN
 SELECT c.noex_monto FROM nomina_horasext c WHERE c.noex_ano = :ano AND c.noex_periodio = :periodo AND c.noex_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :valor;
 IF (valor IS NULL) THEN
 valor = 0;
 item = :item + 1;
 END
 ELSE
 if (conc_cod = 932) then
 BEGIN
 SELECT N.nono_dura FROM NOMINA_NOVEDADES N WHERE N.terc_nit = :nite AND N.nono_periodo = :periodo AND N.nono_ano = :ano AND (N.TNOV_COD = 2 or (N.TNOV_COD = 3) ) INTO :diasnov;
 if (:diasnov IS NULL) then
 valor = 0;
 else
 valor = (:basico / 30)* :diasnov;
 END
    EXECUTE PROCEDURE LEE_CONFIGURACION('NOMINA','GENERAL','REDONDEO AL MULTIPLO DE DIEZ EN TOTALES')RETURNING_VALUES(:aprox);
    EXECUTE PROCEDURE REDONDEE(:valor, :aprox) RETURNING_VALUES (VALOR);
    IF ((mensual = 'N') OR (periodicidad = 1))  THEN
    INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
    VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
    ELSE
    IF (mensual = 'S') THEN
    BEGIN
         IF ((:periodicidad = 2) AND (liquidaper = 1)) THEN
         BEGIN
          IF ((periodo = 1) OR (periodo = 3) OR (periodo = 5) OR (periodo = 7) OR (periodo = 9) OR (periodo = 11)
          OR (periodo = 13) OR (periodo = 15) OR (periodo = 17) OR (periodo = 19) OR (periodo = 21) OR (periodo = 23)) THEN
             INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
             VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
         END
         ELSE
         IF ((:periodicidad = 2) AND (liquidaper = 2)) THEN
         BEGIN
          IF ((periodo = 2) OR (periodo = 4) OR (periodo = 6) OR (periodo = 8) OR (periodo = 10) OR (periodo = 12)
          OR (periodo = 14) OR (periodo = 16) OR (periodo = 18) OR (periodo = 20) OR (periodo = 22) OR (periodo = 24)) THEN
             INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
             VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
         END
         ELSE
         IF ((:periodicidad = 3) AND (liquidaper = 1)) THEN
         BEGIN
          IF ((periodo = 1) OR (periodo = 5) OR (periodo = 9) OR (periodo = 13) OR (periodo = 17) OR (periodo = 21)
          OR (periodo = 25) OR (periodo = 29) OR (periodo = 33) OR (periodo = 37) OR (periodo = 41) OR (periodo = 45)
          OR (periodo = 49)) THEN
             INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
             VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
         END
         ELSE
         IF ((:periodicidad = 3) AND (liquidaper = 2)) THEN
         BEGIN
          IF ((periodo = 2) OR (periodo = 6) OR (periodo = 10) OR (periodo = 14) OR (periodo = 18) OR (periodo = 22)
          OR (periodo = 26) OR (periodo = 30) OR (periodo = 34) OR (periodo = 38) OR (periodo = 42) OR (periodo = 46)
          OR (periodo = 50)) THEN
            INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
             VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
         END
         ELSE
         IF ((:periodicidad = 3) AND (liquidaper = 3)) THEN
         BEGIN
          IF ((periodo = 3) OR (periodo = 7) OR (periodo = 11) OR (periodo = 15) OR (periodo = 19) OR (periodo = 23)
          OR (periodo = 27) OR (periodo = 31) OR (periodo = 35) OR (periodo = 39) OR (periodo = 43) OR (periodo = 47)
          OR (periodo = 51)) THEN
            INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
             VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
         END
         ELSE
         IF ((:periodicidad = 3) AND (liquidaper = 4)) THEN
         BEGIN
          IF ((periodo = 4) OR (periodo = 8) OR (periodo = 12) OR (periodo = 16) OR (periodo = 20) OR (periodo = 24)
          OR (periodo = 29) OR (periodo = 32) OR (periodo = 36) OR (periodo = 40) OR (periodo = 44) OR (periodo = 48)
          OR (periodo = 52)) THEN
            INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
             VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
         END
    END
  END
 END
END
SUSPEND;
END
^

SET TERM ; ^


SET TERM ^ ;

ALTER PROCEDURE IMPR_PLANILLA_NOMINA(
    ID INTEGER,
    PAGO CHAR(1),
    CTA CHAR(1),
    EMPL CHAR(1))
RETURNS (
    FECHA DATE,
    OBSERVACIONES BLOB SUB_TYPE 0 SEGMENT SIZE 80,
    PAGOGLOBAL CHAR(1),
    PERIODO INTEGER,
    ANO CHAR(4),
    PERIODICIDAD VARCHAR(60),
    NITEMPL VARCHAR(20),
    VALOR NUMERIC(18,2),
    DEDUC CHAR(1),
    NOMBREEMPL VARCHAR(60),
    NOMCORTCONC VARCHAR(60),
    NOMBRECONC VARCHAR(60),
    CODCONC INTEGER,
    PROV CHAR(1),
    TOTALEMPL NUMERIC(18,2),
    TOTALDEDUC NUMERIC(18,2),
    TOTALDEVENG NUMERIC(18,2),
    NUMEMPL INTEGER,
    CTAEMPL VARCHAR(25),
    TOTALCTAS NUMERIC(18,2),
    TOTALNOMI NUMERIC(18,2),
    TOTALAPOR NUMERIC(18,2),
    NOMPER VARCHAR(60),
    ORG INTEGER,
    CARGOEMPL VARCHAR(60),
    DEPTOEMPL VARCHAR(60),
    NUMCOP INTEGER,
    NOMBRE_COPIA VARCHAR(60),
    DIASLAB INTEGER)
AS
DECLARE VARIABLE NITANT VARCHAR(20);
DECLARE VARIABLE nitnue VARCHAR(20);
DECLARE VARIABLE NUMCONC INTEGER;
DECLARE VARIABLE TOTALNOMINEG NUMERIC(18,2);
DECLARE VARIABLE TOTALAPORNEG NUMERIC(18,2);
DECLARE VARIABLE PAR INTEGER;
DECLARE VARIABLE IMPAR INTEGER;
DECLARE VARIABLE ANTDEDUC CHAR(1);
DECLARE VARIABLE nitdeduc VARCHAR(20);
DECLARE VARIABLE NITTOT VARCHAR(20);
BEGIN
 SELECT N.nuco_copia FROM NUMERO_COPIA N WHERE N.tido_cod = 92 AND N.nuco_id = :id INTO :NUMCOP;
 IF (numcop IS NULL) THEN
 BEGIN
  numcop = 0;
  INSERT INTO NUMERO_COPIA (TIDO_COD, NUCO_ID, NUCO_COPIA) VALUES (92,:id,:numcop);
 END
 ELSE
 BEGIN
  numcop = :numcop + 1;
  UPDATE numero_copia N SET N.nuco_copia = :numcop WHERE N.tido_cod = 92 AND N.nuco_id = :id;
 END
 SELECT N.noco_nombre FROM nombres_copias N WHERE N.noco_id = :numcop INTO :nombre_copia;
 numempl = 0;
 nitant = 0;
 nitnue = 0;
 IF (PAGO = 'N') THEN
 BEGIN
  FOR SELECT N.nomi_feccausa, N.nomi_obs, N.nomi_pagoglobal, N.nomi_periodo, N.nomi_ano, P.ppag_nombre, PN.pnom_nombre FROM NOMINA N, periodo_pago P, periodo_pago_nombre PN
  WHERE P.ppag_cod = N.nomi_periodocidad AND N.nomi_id = :ID AND PN.ppag_cod = N.nomi_periodocidad AND PN.ppag_periodo = N.nomi_periodo
  INTO :fecha, :observaciones, :pagoglobal, :periodo, :ano, :periodicidad, :NOMPER
  DO
  BEGIN
   FOR SELECT NC.terc_nit, NC.noco_valor, NC.noco_deduc, T.terc_nom, C.conc_nomcorto, C.conc_nombre, NC.conc_cod, NC.noco_prov, E.empl_cargo FROM NOMINA_CONCEPTOS NC, TERCEROS T, EMPLEADOS E, CONCEPTOS_NOMINA C
   WHERE NC.nomi_id = :ID AND T.terc_nit = E.terc_nit AND C.conc_cod = NC.conc_cod AND t.terc_nit = nc.terc_nit
   INTO :nitempl, :valor, :deduc, :nombreempl, :nomcortconc, :nombreconc, :codconc, :prov, :cargoempl
   DO
   BEGIN
    IF (valor IS NULL) THEN
    valor = 0;
    SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND TERC_NIT = :nitempl INTO :totalempl;
    SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND TERC_NIT = :nitempl AND NC.noco_deduc = 'S' INTO :totaldeduc;
    SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND TERC_NIT = :nitempl AND NC.noco_deduc = 'N' INTO :totaldeveng;
    SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id INTO :totalnomi;
    SELECT SUM(NC.noco_valor*-1) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_APORTE = 'S' AND NOCO_VALOR < 0 AND NOMI_ID = :id INTO :totalaporneg;
    SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_APORTE = 'S' AND NOCO_VALOR > 0 AND NOMI_ID = :id INTO :totalapor;
    totalapor = :totalapor + totalaporneg;
    SUSPEND;
   END
   nitempl = '';
   valor = NULL;
   deduc = '';
   nombreempl = NULL;
   nomcortconc = NULL;
   nombreconc = NULL;
   codconc = NULL;
   prov = NULL;
   FOR SELECT MAX(N.conc_cod) FROM NOMINA_CONCEPTOS N WHERE N.nomi_id = :id
   GROUP BY N.conc_cod
   INTO :codconc
   DO
   BEGIN
    SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC
    WHERE NC.nomi_id = :ID AND NC.conc_cod = :codconc
    GROUP BY NC.conc_cod
    INTO :valor;
    nitempl = '';
    nombreempl = '';
    deduc = 'N';
    prov = 'N';
    SELECT C.conc_nombre,C.conc_nomcorto FROM CONCEPTOS_NOMINA C WHERE C.conc_cod = :codconc INTO :nombreconc,:nomcortconc;
    SUSPEND;
   END
  END
 END
 ELSE
 IF (PAGO = 'S') THEN
 BEGIN
  par = 2;
  impar = 1;
  IF (EMPL = 'N') THEN
  BEGIN
     deduc = 'N';
     nomcortconc = 'TOTAL DEV';
     nombreconc = 'TOTAL DEV';
     codconc = 9999;
     prov = 'N';
     valor = NULL;
     nitempl = '';
     nombreempl = '';
     SUSPEND;
     deduc = 'S';
     nomcortconc = 'TOTAL DEDUC';
     nombreconc = 'TOTAL DEDUC';
     codconc = 99999;
     prov = 'N';
     valor = NULL;
     nitempl = '';
     nombreempl = '';
     SUSPEND;
     deduc = 'S';
     nomcortconc = 'TOTAL EMPL';
     nombreconc = 'TOTAL EMPL';
     codconc = 999999;
     prov = 'N';
     valor = NULL;
     nitempl = '';
     nombreempl = '';
     SUSPEND;
  END
  FOR SELECT N.nomi_feccausa, N.nomi_obs, N.nomi_pagoglobal, N.nomi_periodo, N.nomi_ano, P.ppag_nombre, PN.pnom_nombre FROM NOMINA N, periodo_pago P, periodo_pago_nombre PN
  WHERE P.ppag_cod = N.nomi_periodocidad AND N.nomi_id = :ID AND PN.ppag_cod = N.nomi_periodocidad AND PN.ppag_periodo = N.nomi_periodo
  INTO :fecha, :observaciones, :pagoglobal, :periodo, :ano, :periodicidad, :NOMPER
  DO
  BEGIN
    IF (EMPL = 'N') THEN
    BEGIN
     FOR SELECT MAX(N.conc_cod) FROM NOMINA_CONCEPTOS N WHERE N.nomi_id = :id AND N.noco_prov = 'N' AND N.noco_gtoempr = 'N'
     GROUP BY N.conc_cod
     INTO :codconc
     DO
     BEGIN
      SELECT NULL, MAX(NC.noco_deduc) FROM NOMINA_CONCEPTOS NC
      WHERE NC.nomi_id = :ID AND NC.conc_cod = :codconc
      GROUP BY NC.conc_cod
      INTO :valor, :deduc;
      valor = NULL;
      nitempl = '';
      nombreempl = '';
      prov = 'N';
      SELECT C.conc_nombre,C.conc_nomcorto FROM CONCEPTOS_NOMINA C WHERE C.conc_cod = :codconc INTO :nombreconc,:nomcortconc;
      SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id INTO :totalempl;
      SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND NC.noco_deduc = 'S' INTO :totaldeduc;
      SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND NC.noco_deduc = 'N' INTO :totaldeveng;
      SUSPEND;
     END
   END
   FOR SELECT NC.terc_nit, NC.noco_valor, NC.noco_deduc, T.terc_nom, C.conc_nomcorto, C.conc_nombre, NC.conc_cod, NC.noco_prov, E.empl_cargo, D.dpto_nombre, ND.node_diaslab,NC.terc_nit
   FROM NOMINA_CONCEPTOS NC, TERCEROS T, EMPLEADOS E, CONCEPTOS_NOMINA C, DEPARTAMENTO D, NOMINA_DETALLE ND
   WHERE NC.nomi_id = :ID AND T.terc_nit = E.terc_nit AND C.conc_cod = NC.conc_cod AND t.terc_nit = nc.terc_nit AND D.dpto_cod = E.empl_dpto AND NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N'
   AND ND.nomi_id = :id AND ND.terc_nit = E.terc_nit
   ORDER BY T.terc_nom
   INTO :nitempl, :valor, :deduc, :nombreempl, :nomcortconc, :nombreconc, :codconc, :prov, :cargoempl,:deptoempl,:diaslab,:nitnue
   DO
   BEGIN
    IF ((nitnue <> nitant) AND (nitnue IS NOT NULL)) THEN
     numempl = :numempl + 1;
    IF (valor IS NULL) THEN
    valor = 0;
    IF (nitempl <> nitdeduc) THEN
    BEGIN
     par = 2;
     impar = 1;
    END
    nitdeduc = :nitempl;
    IF (:deduc = 'S') THEN
    BEGIN
     antdeduc = 'S';
     org = :par;
     par = :par + 2;
    END
    ELSE
    BEGIN
     antdeduc = 'N';
     org = :impar;
     impar = :impar + 2;
    END
    SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND TERC_NIT = :nitempl INTO :totalempl;
    SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND TERC_NIT = :nitempl AND NC.noco_deduc = 'S' INTO :totaldeduc;
    SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND TERC_NIT = :nitempl AND NC.noco_deduc = 'N' INTO :totaldeveng;
    IF (cta = 'S') THEN
    BEGIN
     SELECT COUNT(CONC_COD) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND TERC_NIT = :nitempl INTO :numconc;
     totalempl = totalempl / :numconc;
     SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND TERC_NIT = :nitempl INTO :totalctas;
    END
    SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id INTO :totalnomi;
    SELECT SUM(NC.noco_valor*-1) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_APORTE = 'S' AND NOCO_VALOR < 0 AND NOMI_ID = :id INTO :totalaporneg;
    SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_APORTE = 'S' AND NOCO_VALOR > 0 AND NOMI_ID = :id INTO :totalapor;
    totalapor = :totalapor + totalaporneg;
   SUSPEND;
    IF ((nitnue <> nitant) AND (nitnue IS NOT NULL) AND (EMPL = 'N')) THEN
    BEGIN
     deduc = 'N';
     nomcortconc = 'TOTAL DEV';
     nombreconc = 'TOTAL DEV';
     codconc = 9999;
     prov = 'N';
     SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND NC.terc_nit = :nitempl INTO :VALOR;
     SUSPEND;
     deduc = 'S';
     nomcortconc = 'TOTAL DEDUC';
     nombreconc = 'TOTAL DEDUC';
     codconc = 99999;
     prov = 'N';
     SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND NC.noco_deduc = 'S' AND NC.terc_nit = :nitempl INTO :VALOR;
     SUSPEND;
     deduc = 'S';
     nomcortconc = 'TOTAL EMPL';
     nombreconc = 'TOTAL EMPL';
     codconc = 999999;
     prov = 'N';
     SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND NC.noco_deduc = 'N' AND NC.terc_nit = : nitempl INTO :VALOR;
     nitant = :nitnue;
     SUSPEND;
    END
   END
   numempl = :numempl + 1;
   IF ( EMPL = 'N') THEN
   BEGIN
    nitempl = '';
    valor = NULL;
    deduc = '';
    nombreempl = NULL;
    nomcortconc = NULL;
    nombreconc = NULL;
    codconc = NULL;
    prov = NULL;
    totalempl = NULL;
    ctaempl = NULL;
    IF (cta = 'N') THEN
    BEGIN
     FOR SELECT MAX(N.conc_cod) FROM NOMINA_CONCEPTOS N WHERE N.nomi_id = :id AND N.noco_prov = 'N' AND N.noco_gtoempr = 'N'
     GROUP BY N.conc_cod
     INTO :codconc
     DO
     BEGIN
      SELECT SUM(NC.noco_valor), MAX(NC.noco_deduc) FROM NOMINA_CONCEPTOS NC
      WHERE NC.nomi_id = :ID AND NC.conc_cod = :codconc
      GROUP BY NC.conc_cod
      INTO :valor, :deduc;
      nitempl = '-';
      nombreempl = 'TOTAL';
      prov = 'N';
      SELECT C.conc_nombre,C.conc_nomcorto FROM CONCEPTOS_NOMINA C WHERE C.conc_cod = :codconc INTO :nombreconc,:nomcortconc;
      SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id INTO :totalempl;
      SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND NC.noco_deduc = 'S' INTO :totaldeduc;
      SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND NC.noco_deduc = 'N' INTO :totaldeveng;
      SUSPEND;
     END
     deduc = 'N';
     nomcortconc = 'TOTAL DEV';
     nombreconc = 'TOTAL DEV';
     codconc = 9999;
     prov = 'N';
     SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id INTO :VALOR;
     nitempl = '-';
     nombreempl = 'TOTAL';
     SUSPEND;
     deduc = 'S';
     nomcortconc = 'TOTAL DEDUC';
     nombreconc = 'TOTAL DEDUC';
     codconc = 99999;
     prov = 'N';
     SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND NC.noco_deduc = 'S' INTO :VALOR;
     nitempl = '-';
     nombreempl = 'TOTAL';
     SUSPEND;
     deduc = 'S';
     nomcortconc = 'TOTAL EMPL';
     nombreconc = 'TOTAL EMPL';
     codconc = 999999;
     prov = 'N';
     SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND NC.noco_deduc = 'N' INTO :VALOR;
     nitempl = '-';
     nombreempl = 'TOTAL';
     SUSPEND;
    END
   END
  END
 END
END
^

SET TERM ; ^


UPDATE REVISION SET REVI_NOMINA = '2009/03/03';

SET TERM ^ ;

ALTER PROCEDURE LIQUIDA_VACACIONES(
    NITEMPL VARCHAR(20))
RETURNS (
    VACAC NUMERIC(18,2),
    IDVACAC INTEGER)
AS
DECLARE VARIABLE SALDOSINI NUMERIC(18,2);
BEGIN
idvacac = GEN_ID(ID_VACACIONES,1);
SELECT SUM(NOCO_VALOR) FROM NOMINA_CONCEPTOS WHERE TERC_NIT = :NITEMPL AND ((CONC_COD = 929) OR (CONC_COD = 930)) AND NOCO_PAGOOK = 'N' AND NOCO_PERIODO <> 0 INTO :vacac;
IF (vacac IS NULL) THEN
VACAC = 0;
SELECT SUM(NOCO_VALOR) FROM NOMINA_CONCEPTOS WHERE TERC_NIT = :NITEMPL AND ((CONC_COD = 929) OR (CONC_COD = 930)) AND NOCO_PAGOOK = 'N' AND NOCO_PERIODO = 0 INTO :saldosini;
IF (saldosini IS NULL) THEN
saldosini = 0;
vacac = :vacac + :saldosini;
  SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER PROCEDURE HISTORICO_EMPLEADO (
    FEC DATE,
    PERDESDE INTEGER,
    PERHASTA INTEGER,
    EMPLDESDE VARCHAR(20) CHARACTER SET NONE,
    EMPLHASTA VARCHAR(20) CHARACTER SET NONE)
RETURNS (
    FECNOM DATE,
    CONCNOM VARCHAR(60) CHARACTER SET NONE,
    COD INTEGER,
    NIT VARCHAR(20) CHARACTER SET NONE,
    VALOR NUMERIC(18,2),
    ENTIDAD VARCHAR(20) CHARACTER SET NONE,
    DEDUC CHAR(1) CHARACTER SET NONE,
    PROV CHAR(1) CHARACTER SET NONE,
    APORTE CHAR(1) CHARACTER SET NONE,
    PAGOOK CHAR(1) CHARACTER SET NONE,
    PERIODO INTEGER,
    ANO CHAR(4) CHARACTER SET NONE,
    APLICAPROM CHAR(1) CHARACTER SET NONE,
    SALARIO CHAR(1) CHARACTER SET NONE,
    GTOEMPR CHAR(1) CHARACTER SET NONE,
    NOMCORTO VARCHAR(60) CHARACTER SET NONE,
    NOMPER VARCHAR(60) CHARACTER SET NONE,
    NOMEMPL VARCHAR(60) CHARACTER SET NONE)
AS
BEGIN
  EXIT;
END^



SET TERM ; ^


/******************************************************************************/
/****                          Stored Procedures                           ****/
/******************************************************************************/


SET TERM ^ ;

ALTER PROCEDURE HISTORICO_EMPLEADO (
    FEC DATE,
    PERDESDE INTEGER,
    PERHASTA INTEGER,
    EMPLDESDE VARCHAR(20) CHARACTER SET NONE,
    EMPLHASTA VARCHAR(20) CHARACTER SET NONE)
RETURNS (
    FECNOM DATE,
    CONCNOM VARCHAR(60) CHARACTER SET NONE,
    COD INTEGER,
    NIT VARCHAR(20) CHARACTER SET NONE,
    VALOR NUMERIC(18,2),
    ENTIDAD VARCHAR(20) CHARACTER SET NONE,
    DEDUC CHAR(1) CHARACTER SET NONE,
    PROV CHAR(1) CHARACTER SET NONE,
    APORTE CHAR(1) CHARACTER SET NONE,
    PAGOOK CHAR(1) CHARACTER SET NONE,
    PERIODO INTEGER,
    ANO CHAR(4) CHARACTER SET NONE,
    APLICAPROM CHAR(1) CHARACTER SET NONE,
    SALARIO CHAR(1) CHARACTER SET NONE,
    GTOEMPR CHAR(1) CHARACTER SET NONE,
    NOMCORTO VARCHAR(60) CHARACTER SET NONE,
    NOMPER VARCHAR(60) CHARACTER SET NONE,
    NOMEMPL VARCHAR(60) CHARACTER SET NONE)
AS
BEGIN
FOR SELECT O.nomi_feccausa,C.conc_nombre,N.conc_cod, N.terc_nit,N.noco_valor,N.noco_entidad,N.noco_deduc,
 N.noco_prov,N.noco_aporte,N.noco_pagook, N.noco_periodo,N.noco_ano,
 N.noco_aplicaprom,N.noco_salario,N.noco_gtoempr,C.conc_nomcorto,P.pnom_nombre, T.terc_nom
 FROM NOMINA_CONCEPTOS N, CONCEPTOS_NOMINA C, NOMINA O, PERIODO_PAGO_NOMBRE P, TERCEROS T
 WHERE N.noco_periodo <> 0 AND c.conc_cod = n.conc_cod AND O.nomi_feccausa <= :fec AND O.nomi_id = N.nomi_id AND P.ppag_periodo = N.noco_periodo AND O.nomi_periodocidad = P.ppag_cod
 AND O.nomi_ano = SUBSTR(:fec,1,4) AND T.terc_nit = N.terc_nit AND N.terc_nit >= :empldesde AND N.terc_nit <= :emplhasta
 AND N.noco_periodo >= :perdesde AND N.noco_periodo <= :perhasta
 ORDER BY N.noco_periodo
 INTO :fecnom,:concnom,:cod, :Nit,:valor,:entidad,:deduc, :prov,:aporte,:pagook, :periodo,:ano,
 :aplicaprom,:salario,:gtoempr,:nomcorto,:nomper, :nomempl
 DO
 BEGIN

  SUSPEND;
 END
END
^


SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER PROCEDURE CAUSA_NOMINA(
    FEC DATE,
    PERIODO INTEGER,
    PERIODICIDAD INTEGER,
    PAGOGLOBAL CHAR(1),
    ANO CHAR(4))
RETURNS (
    IDNOMINA INTEGER)
AS
declare variable item integer;
declare variable nite varchar(20) character set none;
declare variable nit_tercero varchar(20);
declare variable concept integer;
declare variable montos numeric(18,2);
declare variable porcen numeric(9,4);
declare variable entidad varchar(20);
declare variable conc_cod integer;
declare variable conc_deduc char(1);
declare variable conc_porc numeric(9,4);
declare variable conc_entidad integer;
declare variable conc_monto numeric(18,2);
declare variable conc_modifi char(1);
declare variable conc_promedio char(1);
declare variable emco_perprom integer;
declare variable valor numeric(18,2);
declare variable diaslab integer;
declare variable conc_prov char(1);
declare variable conc_aporte char(1);
declare variable numeroprom integer;
declare variable conc_aplicaprom char(1);
declare variable perinicial integer;
declare variable anoprom integer;
declare variable conc_dias char(1);
declare variable conc_otroconc char(1);
declare variable conc_codotroconc integer;
declare variable anosum integer;
declare variable salario char(1) character set none;
declare variable liquidaper integer;
declare variable rmod numeric(2,2);
declare variable basico numeric(18,2);
declare variable niteps varchar(20);
declare variable nitafc varchar(20);
declare variable nitafp varchar(20);
declare variable nitccf varchar(20);
declare variable gtoempr char(1);
declare variable comision numeric(18,2);
declare variable cambsaltrans numeric(18,2);
declare variable saldosini numeric(18,2);
declare variable duranov integer;
declare variable base numeric(18,2);
declare variable aprox integer;
declare variable mensual char(1);
declare variable horasex numeric(18,2);
declare variable diasnov integer;
declare variable tomasal integer;
declare variable retroact numeric(18,2);
declare variable incap numeric(18,2);
BEGIN
 EXECUTE PROCEDURE cambie_id_nomina RETURNING_VALUES(:idnomina);
 INSERT INTO nomina (nomi_id, NOMI_FECCAUSA, NOMI_PAGOGLOBAL, NOMI_PERIODOCIDAD, NOMI_PERIODO, NOMI_ANO, NOMI_LIQOK)
 VALUES (:IDNOMINA, :fec,:pagoglobal, :periodicidad, :periodo, :ano, 'N');
/* fec = substr(fec,1,8) || (CAST(substr(fec,9,10) AS INTEGER)+1);
*/ item = 1;
 FOR SELECT E.TERC_NIT, E.empl_salario, e.empl_eps, e.empl_afc, e.empl_afp, e.empl_ccf
 FROM EMPLEADOS E
 WHERE E.empl_ppago = :periodicidad AND E.empl_fecret IS NULL
 INTO :nite, :basico, :niteps, :nitafc, :nitafp, :nitccf
 DO
 BEGIN
  FOR SELECT CE.TERC_NIT, CE.CONC_COD, CE.EMCO_MONTO, CE.EMCO_PORC, ce.empl_entidad, CE.emco_perprom, CE.emco_luquidaper, CE.emco_mensual, CN.CONC_COD, CN.CONC_DEDUC,CN.CONC_PORC, CN.CONC_ENTIDAD, CN.CONC_MONTO,  CN.CONC_DIAS, CN.CONC_MODIFI,
  CN.CONC_PROMEDIO, CN.conc_salario, CE.emco_perprom, CN.conc_prov, CN.conc_aporte, CN.conc_aplicaprom, cn.conc_otroconc, cn.conc_codotroconc, CN.conc_gtoempr, CN.conc_base, CE.emco_tomsal
  FROM empleado_conceptos CE, CONCEPTOS_NOMINA CN WHERE ((CE.terc_nit = :nite) AND (CE.CONC_COD = CN.CONC_COD) AND (CE.emco_fecini <= :fec AND CE.emco_fecfin >= :FEC) ) OR ((CE.terc_nit = :nite)
  AND (CE.CONC_COD = CN.CONC_COD) AND (cn.conc_todosper = 'N') AND (CE.emco_ppago = :periodo)) OR  ((CE.terc_nit = :nite) AND (CE.CONC_COD = CN.CONC_COD) AND cn.conc_todosper = 'S')  ORDER BY (TERC_NIT )
  INTO :nit_tercero, :concept,  :montos, :porcen, :entidad, :numeroprom, :liquidaper, :mensual ,:CONC_COD, :CONC_DEDUC, :CONC_PORC,
  :CONC_ENTIDAD, :CONC_MONTO, :CONC_DIAS, :CONC_MODIFI,:CONC_PROMEDIO, :salario,:EMCO_PERPROM, :conc_prov, :conc_aporte , :CONC_APLICAPROM, :conc_otroconc, :conc_codotroconc, :gtoempr, :base, :tomasal
  DO
  BEGIN
   IF (conc_dias = 'S') THEN
   EXECUTE PROCEDURE DIAS_LABORADOS (:nite, :periodo, :fec, :mensual,:conc_aporte) RETURNING_VALUES (:diaslab);
   ELSE
   BEGIN
    diaslab = 15;
    IF (mensual = 'S') THEN
    BEGIN
     IF (periodicidad = 2) THEN
     diaslab = 30;
     ELSE
     IF (liquidaper = 3) THEN
     diaslab = 30;
    END
   END
   IF (:tomasal <> 0) THEN
   BEGIN
    IF ((:periodicidad = 2) AND (:tomasal <> 2)) THEN
    BEGIN
     IF ((periodo = 2) OR (periodo = 4) OR (periodo = 6) OR (periodo = 8) OR (periodo = 10) OR (periodo = 12)
     OR (periodo = 14) OR (periodo = 16) OR (periodo = 18) OR (periodo = 20) OR (periodo = 22) OR (periodo = 24)) THEN
     basico = 0;
    END
    ELSE
    IF ((:periodicidad = 3) AND (:tomasal <> 1)) THEN
    BEGIN
     IF ((periodo = 1) OR (periodo = 5) OR (periodo = 9) OR (periodo = 13) OR (periodo = 17) OR (periodo = 21)
     OR (periodo = 25) OR (periodo = 29) OR (periodo = 33) OR (periodo = 37) OR (periodo = 41) OR (periodo = 45)
     OR (periodo = 49)) THEN
     basico = 0;
    END
    ELSE
     IF ((:periodicidad = 3) AND (:tomasal <> 2)) THEN
     BEGIN
      IF ((periodo = 2) OR (periodo = 6) OR (periodo = 10) OR (periodo = 14) OR (periodo = 18) OR (periodo = 22)
      OR (periodo = 26) OR (periodo = 30) OR (periodo = 34) OR (periodo = 38) OR (periodo = 42) OR (periodo = 46)
      OR (periodo = 50)) THEN
      basico = 0;
     END
     ELSE
     IF ((:periodicidad = 3) AND (:tomasal <> 3)) THEN
     BEGIN
      IF ((periodo = 3) OR (periodo = 7) OR (periodo = 11) OR (periodo = 15) OR (periodo = 19) OR (periodo = 23)
      OR (periodo = 27) OR (periodo = 31) OR (periodo = 35) OR (periodo = 39) OR (periodo = 43) OR (periodo = 47)
      OR (periodo = 51)) THEN
      basico = 0;
     END
     ELSE
     IF ((:periodicidad = 3) AND (:tomasal <> 4)) THEN
     BEGIN
      IF ((periodo = 4) OR (periodo = 8) OR (periodo = 12) OR (periodo = 16) OR (periodo = 20) OR (periodo = 24)
      OR (periodo = 29) OR (periodo = 32) OR (periodo = 36) OR (periodo = 40) OR (periodo = 44) OR (periodo = 48)
      OR (periodo = 52)) THEN
      basico = 0;
     END
   END
   ELSE
   BEGIN
    SELECT E.empl_salario FROM EMPLEADOS E WHERE E.terc_nit = :nite INTO :basico;
    SELECT ((n.nono_valor /30) * n.nono_dura), (n.nono_dura) FROM nomina_novedades n WHERE n.tnov_cod = 11 AND n.terc_nit = :nite AND n.nono_periodo = :periodo INTO :cambsaltrans, :duranov;
    IF (cambsaltrans IS NULL) THEN
    cambsaltrans = 0;
    IF (duranov IS NULL) THEN
    duranov = 0;
    diaslab = :diaslab - :duranov;
    IF (conc_cod = 922) THEN
    BEGIN
     SELECT SUM(P.prcu_monto) FROM prestamo_cuotas P, prestamo_nomina PN WHERE P.prcu_ano = :ano AND P.prcu_periodo = :periodo AND PN.prno_id = P.prno_id AND PN.terc_nit = :nite INTO :valor;
     IF (valor IS NULL) THEN
     valor = 0;
     item = :item + 1;
     UPDATE prestamo_cuotas  P SET prcu_ok = 'S' WHERE P.prcu_ano = :ano AND P.prcu_periodo = :periodo AND P.prno_id = (SELECT PN.prno_id FROM PRESTAMO_NOMINA PN WHERE PN.terc_nit = :nite);
    END
    ELSE
    IF ((:montos = 0) OR (:montos IS NULL)) THEN
    BEGIN
     IF ((CONC_PORC = 0 AND :porcen = 0) OR (CONC_PORC IS NULL AND :porcen = 0) OR (CONC_PORC = 0 AND :porcen IS NULL) OR (CONC_PORC IS NULL AND :porcen IS NULL) ) THEN
     BEGIN
      IF ((conc_monto <> 0) AND (conc_monto IS NOT NULL) ) THEN
      BEGIN
       VALOR = :CONC_MONTO;
       IF (:conc_dias = 'S') THEN
       valor = (:valor / 30) * :diaslab;
      END
      ELSE
      IF (salario = 'S' AND CONC_COD <> 900 AND CONC_COD <> 920) THEN
      BEGIN
       conc_monto = :basico;
       VALOR = (:conc_monto/30 * :diaslab ) + :cambsaltrans;
      END
      ELSE
      BEGIN
       valor = montos;
       IF (:conc_dias = 'S') THEN
       valor = (:valor / 30) * :diaslab;
      END
     END
     ELSE
     BEGIN
      IF (:porcen <> 0) THEN
      BEGIN
       IF ((conc_monto <> 0) AND (conc_monto IS NOT NULL) ) THEN
       BEGIN
        VALOR = ((:CONC_MONTO ) * :PORCEN) /100;
       END
      END
      ELSE
      BEGIN
       IF ((conc_monto <> 0) AND (conc_monto IS NOT NULL) ) THEN
       BEGIN
        VALOR = ((:CONC_MONTO) * :conc_porc) /100;
       END
       ELSE
       IF (salario = 'S' AND CONC_COD <> 900 AND CONC_COD <> 920) THEN
       BEGIN
        conc_monto = :basico;
        VALOR = ((:CONC_MONTO)+ :cambsaltrans * :conc_porc) /100;
       END
       ELSE
       IF (:conc_monto = 0 AND :montos = 0) THEN
       BEGIN
        conc_monto = :basico;
        VALOR = (((:CONC_MONTO / 30) * :diaslab) + :cambsaltrans * :conc_porc) /100;
       END
      END
     END
    END
    ELSE
    IF ((CONC_PORC = 0 OR (conc_porc IS NULL)) AND (:porcen = 0 OR (porcen IS NULL))) THEN
    BEGIN
     VALOR = (:montos);
     IF (:conc_dias = 'S') THEN
     valor = (:valor / 30) * :diaslab;
    END
    ELSE
    IF (:porcen <> 0 AND porcen IS NOT NULL) THEN
    BEGIN
     VALOR = ((:MONTOS ) * :PORCEN) /100;
    END
    ELSE
    BEGIN
     VALOR = ((:montos) * :CONC_PORC) /100;
    END
    IF (conc_promedio = 'S') THEN
    BEGIN
     perinicial = :periodo - (:numeroprom) + 1;
     anoprom = CAST (ano AS INTEGER);
     IF (perinicial <= 0) THEN
     BEGIN
      perinicial = 24 + :PERINICIAL;
      anoprom = CAST(ANO AS INTEGER) - 1;
     END
     SELECT SUM (noco_valor) FROM nomina_conceptos n WHERE n.noco_aplicaprom = 'S' AND N.noco_periodo >= :perinicial - 1 AND N.noco_periodo < :periodo AND N.noco_ano >= :anoprom AND N.noco_ano <= :ano AND terc_nit = :nite INTO :valor;
     valor = (valor / numeroprom);
     SELECT NOCO_VALOR FROM NOMINA_CONCEPTOS WHERE CONC_COD = :conc_cod AND TERC_NIT  = :nite AND NOCO_PAGOOK = 'N' AND NOCO_PERIODO = 0 INTO :saldosini;
     IF (saldosini IS NULL) THEN
     saldosini = 0;
     ELSE
     UPDATE nomina_conceptos N SET noco_pagook = 'S' WHERE n.noco_aplicaprom = 'S' AND N.noco_periodo >= :perinicial - 1 AND N.noco_periodo < :periodo AND N.noco_ano >= :anoprom AND N.noco_ano <= :ano  AND CONC_COD = :conc_cod AND terc_nit = :nite AND NOCO_PERIODO = 0;
     VALOR = :valor + :saldosini;
     UPDATE nomina_conceptos N SET noco_pagook = 'S' WHERE n.noco_aplicaprom = 'S' AND N.noco_periodo >= :perinicial - 1 AND N.noco_periodo < :periodo AND N.noco_ano >= :anoprom AND N.noco_ano <= :ano  AND CONC_COD = :conc_cod AND terc_nit = :nite;
    END
    ELSE
    IF (conc_otroconc = 'S') THEN
    BEGIN
     anosum = CAST(ano AS INTEGER);
     anosum = anosum - 1;
     SELECT SUM (noco_valor) FROM nomina_conceptos n WHERE n.noco_ano = :anosum AND n.conc_cod = :conc_codotroconc AND N.terc_nit = :nite INTO :valor;
     SELECT NOCO_VALOR FROM NOMINA_CONCEPTOS WHERE noco_ano = :anosum AND conc_cod = :conc_codotroconc AND terc_nit = :nite AND NOCO_PERIODO = 0 INTO :saldosini;
     IF (saldosini IS NULL) THEN
     saldosini = 0;
     ELSE
     UPDATE nomina_conceptos SET noco_pagook = 'S' WHERE noco_ano = :anosum AND conc_cod = :conc_codotroconc AND NOCO_PERIODO = 0 AND terc_nit = :nite;
     VALOR = :valor + :saldosini;
     UPDATE nomina_conceptos SET noco_pagook = 'S' WHERE noco_ano = :anosum AND conc_cod = :conc_codotroconc AND terc_nit = :nite;
    END
    ELSE
    IF (conc_aporte = 'S') THEN
    BEGIN
     horasex = NULL;
     diasnov = NULL;
     IF ((:entidad = '' ) OR (entidad IS NULL)) THEN
     BEGIN
      SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
      IF (comision IS NULL) THEN
      comision = 0;
      SELECT C.emco_monto FROM EMPLEADO_CONCEPTOS C WHERE C.terc_nit = :nite AND C.conc_cod = 933 INTO :retroact;
      IF (retroact IS NULL ) THEN
      retroact = 0;
      SELECT N.nono_dura FROM NOMINA_NOVEDADES N WHERE N.terc_nit = :nite AND N.nono_periodo = :periodo AND N.nono_ano = :ano AND (N.tnov_cod = 2 or (N.tnov_cod = 3)) INTO :diasnov;
      IF (:diasnov IS NULL) THEN
      incap = 0;
      ELSE
      incap = (:basico / 30)* :diasnov;
      valor = :basico + :comision + :horasex + :retroact + :incap;
      IF ((conc_cod = 904) OR (conc_cod = 905) OR (conc_cod = 906)) THEN
      BEGIN
       entidad = :nitafp;
       IF (conc_cod = 904) THEN
       BEGIN
        SELECT A.paan_afptr FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
        SELECT N.nono_dura FROM NOMINA_NOVEDADES N WHERE N.terc_nit = :nite AND N.nono_periodo = :periodo AND N.nono_ano = :ano AND (N.tnov_cod = 2 or (N.tnov_cod = 3)) INTO :diasnov;
        IF (:diasnov IS NULL) THEN
        incap = 0;
        ELSE
        incap = (:basico / 30)* :diasnov;
        SELECT c.noex_monto FROM nomina_horasext c WHERE c.noex_ano = :ano AND c.noex_periodio = :periodo AND c.noex_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :horasex;
        IF (horasex IS NOT NULL) THEN
        VALOR = (((((:basico )/30 * :diaslab ) + :comision + :horasex + :retroact+ :incap)+ :cambsaltrans ) * :PORCEN) /100;
        ELSE
        VALOR = ((((:basico)/30 * :diaslab ) + :comision + :retroact+ :cambsaltrans  + :incap) * :PORCEN) /100;
       END
       ELSE
       IF ((conc_cod = 905) OR (conc_cod = 906)) THEN
       BEGIN
        SELECT A.paan_afpem FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
        SELECT N.nono_dura FROM NOMINA_NOVEDADES N WHERE N.terc_nit = :nite AND N.nono_periodo = :periodo AND N.nono_ano = :ano AND (N.tnov_cod = 2 or (N.tnov_cod = 3)) INTO :diasnov;
        IF (:diasnov IS NULL) THEN
        incap = 0;
        ELSE
        incap = (:basico / 30)* :diasnov;
        SELECT c.noex_monto FROM nomina_horasext c WHERE c.noex_ano = :ano AND c.noex_periodio = :periodo AND c.noex_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :horasex;
        IF (horasex IS NOT NULL) THEN
        VALOR = (((((:basico )/30 * :diaslab ) + :comision + :horasex + :retroact)+ :cambsaltrans + :incap) * :PORCEN) /100;
        ELSE
        VALOR = (((((:basico )/30 * :diaslab ) + :comision + :retroact)+ :cambsaltrans + :incap) * :PORCEN) /100;
       END
      END
      ELSE
      IF ((conc_cod = 907) OR (conc_cod = 914) OR (conc_cod = 915)) THEN
      BEGIN
       entidad = :niteps;
       IF (conc_cod = 907) THEN
       BEGIN
        SELECT A.paan_epstr FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
        SELECT N.nono_dura FROM NOMINA_NOVEDADES N WHERE N.terc_nit = :nite AND N.nono_periodo = :periodo AND N.nono_ano = :ano AND (N.tnov_cod = 2 or (N.tnov_cod = 3)) INTO :diasnov;
        IF (:diasnov IS NULL) THEN
        incap = 0;
        ELSE
        incap = (:basico / 30)* :diasnov;
        SELECT c.noex_monto FROM nomina_horasext c WHERE c.noex_ano = :ano AND c.noex_periodio = :periodo AND c.noex_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :horasex;
        IF (horasex IS NOT NULL) THEN
        VALOR = (((((:basico )/30 * :diaslab ) + :comision + :horasex + :retroact)+ :cambsaltrans + :incap) * :PORCEN) /100;
        ELSE
        VALOR = (((((:basico )/30 * :diaslab ) + :comision + :retroact)+ :cambsaltrans + :incap) * :PORCEN) /100;
       END
       ELSE
       IF ((conc_cod = 914) OR (conc_cod = 915)) THEN
       BEGIN
        SELECT A.paan_epsem FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
        SELECT N.nono_dura FROM NOMINA_NOVEDADES N WHERE N.terc_nit = :nite AND N.nono_periodo = :periodo AND N.nono_ano = :ano AND (N.tnov_cod = 2 or (N.tnov_cod = 3)) INTO :diasnov;
        IF (:diasnov IS NULL) THEN
        incap = 0;
        ELSE
        incap = (:basico / 30)* :diasnov;
        SELECT c.noex_monto FROM nomina_horasext c WHERE c.noex_ano = :ano AND c.noex_periodio = :periodo AND c.noex_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :horasex;
        IF (horasex IS NOT NULL) THEN
        VALOR = (((((:basico )/30 * :diaslab ) + :comision + :horasex + :retroact)+ :cambsaltrans + :incap) * :PORCEN) /100;
        ELSE
        VALOR = (((((:basico )/30 * :diaslab ) + :comision + :retroact)+ :cambsaltrans + :incap) * :PORCEN) /100;
       END
      END
      ELSE
      IF ((conc_cod = 910) OR (conc_cod = 911) OR (conc_cod = 916) OR (conc_cod = 917) OR (conc_cod = 918) OR (conc_cod = 919)) THEN
      BEGIN
       entidad = :nitccf;
       SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
       IF (comision IS NULL) THEN
       comision = 0;
       SELECT N.nono_dura FROM NOMINA_NOVEDADES N WHERE N.terc_nit = :nite AND N.nono_periodo = :periodo AND N.nono_ano = :ano AND (N.tnov_cod = 2 or (N.tnov_cod = 3)) INTO :diasnov;
       IF (:diasnov IS NULL) THEN
       incap = 0;
       ELSE
       incap = (:basico / 30)* :diasnov;
       IF ((conc_cod = 910) OR (conc_cod = 911) ) THEN
       BEGIN
        SELECT A.paan_ccf FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
      SELECT N.nono_dura FROM NOMINA_NOVEDADES N WHERE N.terc_nit = :nite AND N.nono_periodo = :periodo AND N.nono_ano = :ano AND (N.tnov_cod = 2 or (N.tnov_cod = 3)) INTO :diasnov;
      IF (:diasnov IS NULL) THEN
      incap = 0;
      ELSE
      incap = (:basico / 30)* :diasnov;
        SELECT c.noex_monto FROM nomina_horasext c WHERE c.noex_ano = :ano AND c.noex_periodio = :periodo AND c.noex_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :horasex;
        IF (horasex IS NOT NULL) THEN
        VALOR = (((((:basico )/30 * :diaslab ) + :comision + :horasex + :retroact)+ :cambsaltrans + :incap) * :PORCEN) /100;
        ELSE
        VALOR = (((((:basico )/30 * :diaslab ) + :comision + :retroact)+ :cambsaltrans + :incap) * :PORCEN) /100;
       END
       ELSE
       IF ((conc_cod = 916) OR (conc_cod = 917)) THEN
       BEGIN
        SELECT A.paan_icbf FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
      SELECT N.nono_dura FROM NOMINA_NOVEDADES N WHERE N.terc_nit = :nite AND N.nono_periodo = :periodo AND N.nono_ano = :ano AND (N.tnov_cod = 2 or (N.tnov_cod = 3)) INTO :diasnov;
      IF (:diasnov IS NULL) THEN
      incap = 0;
      ELSE
      incap = (:basico / 30)* :diasnov;
      SELECT N.nono_dura FROM NOMINA_NOVEDADES N WHERE N.terc_nit = :nite AND N.nono_periodo = :periodo AND N.nono_ano = :ano AND (N.tnov_cod = 2 or (N.tnov_cod = 3)) INTO :diasnov;
      IF (:diasnov IS NULL) THEN
      incap = 0;
      ELSE
      incap = (:basico / 30)* :diasnov;
        SELECT c.noex_monto FROM nomina_horasext c WHERE c.noex_ano = :ano AND c.noex_periodio = :periodo AND c.noex_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :horasex;
        IF (horasex IS NOT NULL) THEN
        VALOR = (((((:basico )/30 * :diaslab ) + :comision + :horasex + :retroact)+ :cambsaltrans + :incap) * :PORCEN) /100;
        ELSE
        VALOR = (((((:basico )/30 * :diaslab ) + :comision + :retroact)+ :cambsaltrans + :incap) * :PORCEN) /100;
       END
       ELSE
       IF ((conc_cod = 918) OR (conc_cod = 919)) THEN
       BEGIN
        SELECT A.paan_sena FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
      SELECT N.nono_dura FROM NOMINA_NOVEDADES N WHERE N.terc_nit = :nite AND N.nono_periodo = :periodo AND N.nono_ano = :ano AND (N.tnov_cod = 2 or (N.tnov_cod = 3)) INTO :diasnov;
      IF (:diasnov IS NULL) THEN
      incap = 0;
      ELSE
      incap = (:basico / 30)* :diasnov;
        SELECT c.noex_monto FROM nomina_horasext c WHERE c.noex_ano = :ano AND c.noex_periodio = :periodo AND c.noex_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :horasex;
        IF (horasex IS NOT NULL) THEN
        VALOR = (((((:basico )/30 * :diaslab ) + :comision + :horasex + :retroact)+ :cambsaltrans + :incap) * :PORCEN) /100;
        ELSE
        VALOR = (((((:basico )/30 * :diaslab ) + :comision + :retroact)+ :cambsaltrans + :incap) * :PORCEN) /100;
       END
      END
      ELSE
      IF ((conc_cod = 912) OR (conc_cod = 913)) THEN
      BEGIN
       entidad = :nitafc;
       SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
       IF (comision IS NULL) THEN
       comision = 0;
      SELECT N.nono_dura FROM NOMINA_NOVEDADES N WHERE N.terc_nit = :nite AND N.nono_periodo = :periodo AND N.nono_ano = :ano AND (N.tnov_cod = 2 or (N.tnov_cod = 3)) INTO :diasnov;
      IF (:diasnov IS NULL) THEN
      incap = 0;
      ELSE
      incap = (:basico / 30)* :diasnov;
       IF ((conc_cod = 912) OR (conc_cod = 913) ) THEN
       BEGIN
        SELECT A.paan_cesemp FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
        SELECT c.noex_monto FROM nomina_horasext c WHERE c.noex_ano = :ano AND c.noex_periodio = :periodo AND c.noex_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :horasex;
        IF (horasex IS NOT NULL) THEN
        VALOR = (((((:basico )/30 * :diaslab ) + :comision + :horasex + :retroact)+ :cambsaltrans + :incap) * :PORCEN) /100;
        ELSE
        VALOR = (((((:basico )/30 * :diaslab ) + :comision + :retroact)+ :cambsaltrans + :incap) * :PORCEN) /100;
       END
      END
      ELSE
      BEGIN
       IF (comision IS NULL) THEN
       comision = 0;
       SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
       conc_monto = :basico + :comision;
       IF (conc_porc <> 0 AND conc_porc IS NOT NULL) THEN
       VALOR = (((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans + :incap) * :conc_porc) /100;
       ELSE
       IF (:porcen <> 0 AND :porcen IS NOT NULL) THEN
       VALOR = (((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans + :incap) * :porcen) /100;
       ELSE
       IF (:montos <> 0 AND :montos IS NOT NULL) THEN
       valor = :montos;
       ELSE
       IF (:conc_monto <> 0 AND :conc_monto IS NOT NULL) THEN
       valor = :conc_monto;
      END
     END
     item = :item + 1;
    END
    ELSE
    IF (conc_prov = 'S') THEN
    BEGIN
     conc_monto = :basico;
     IF (conc_porc <> 0 AND conc_porc IS NOT NULL) THEN
     VALOR = (((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans + :incap) * :conc_porc) /100;
     ELSE
     IF (porcen <> 0 AND porcen IS NOT NULL) THEN
     VALOR = (((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans + :incap) * :porcen) /100;
     ELSE
     IF (montos <> 0 AND montos IS NOT NULL) THEN
     VALOR = :montos;
     ELSE
     IF (conc_monto <> 0 AND conc_monto IS NOT NULL) THEN
     VALOR = :conc_monto;
     item = :item + 1;
    END
    ELSE
    IF (conc_cod = 920) THEN
    BEGIN
     SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :valor;
     IF (valor IS NULL) THEN
     valor = 0;
     item = :item + 1;
    END
    ELSE
    IF (conc_cod = 900 OR (:conc_cod = 931)) THEN
    BEGIN
     SELECT c.noex_monto FROM nomina_horasext c WHERE c.noex_ano = :ano AND c.noex_periodio = :periodo AND c.noex_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :valor;
     IF (valor IS NULL) THEN
     valor = 0;
     item = :item + 1;
    END
    ELSE
    IF (conc_cod = 932) THEN
    BEGIN
     SELECT N.nono_dura FROM NOMINA_NOVEDADES N WHERE N.terc_nit = :nite AND N.nono_periodo = :periodo AND N.nono_ano = :ano AND (N.tnov_cod = 2 or (N.tnov_cod = 3) or (N.tnov_cod = 4)) INTO :diasnov;
     IF (:diasnov IS NULL) THEN
     valor = 0;
     ELSE
     valor = (:basico / 30)* :diasnov;
    END
    ELSE
    IF (conc_cod = 921) THEN
    BEGIN
     IF (porcen IS NOT NULL AND porcen <> 0) THEN
     valor = ((basico / 30)* :diaslab ) * :PORCEN /100;
     ELSE
     IF (conc_porc IS NOT NULL AND conc_porc <> 0) THEN
     valor = ((basico / 30)* :diaslab ) * :conc_porc /100;
    END
    EXECUTE PROCEDURE LEE_CONFIGURACION('NOMINA','GENERAL','REDONDEO AL MULTIPLO DE DIEZ EN TOTALES')RETURNING_VALUES(:aprox);
    EXECUTE PROCEDURE REDONDEE(:valor, :aprox) RETURNING_VALUES (VALOR);
    IF ((mensual = 'N') OR (periodicidad = 1))  THEN
    INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
    VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
    ELSE
    IF (mensual = 'S') THEN
    BEGIN
     IF ((:periodicidad = 2) AND (liquidaper = 1)) THEN
     BEGIN
      IF ((periodo = 1) OR (periodo = 3) OR (periodo = 5) OR (periodo = 7) OR (periodo = 9) OR (periodo = 11)
      OR (periodo = 13) OR (periodo = 15) OR (periodo = 17) OR (periodo = 19) OR (periodo = 21) OR (periodo = 23)) THEN
      INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
      VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
     END
     ELSE
     IF ((:periodicidad = 2) AND (liquidaper = 2)) THEN
     BEGIN
      IF ((periodo = 2) OR (periodo = 4) OR (periodo = 6) OR (periodo = 8) OR (periodo = 10) OR (periodo = 12)
      OR (periodo = 14) OR (periodo = 16) OR (periodo = 18) OR (periodo = 20) OR (periodo = 22) OR (periodo = 24)) THEN
      INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
      VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
     END
     ELSE
     IF ((:periodicidad = 3) AND (liquidaper = 1)) THEN
     BEGIN
      IF ((periodo = 1) OR (periodo = 5) OR (periodo = 9) OR (periodo = 13) OR (periodo = 17) OR (periodo = 21)
      OR (periodo = 25) OR (periodo = 29) OR (periodo = 33) OR (periodo = 37) OR (periodo = 41) OR (periodo = 45)
      OR (periodo = 49)) THEN
      INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
      VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
    END
    ELSE
     IF ((:periodicidad = 3) AND (liquidaper = 2)) THEN
     BEGIN
      IF ((periodo = 2) OR (periodo = 6) OR (periodo = 10) OR (periodo = 14) OR (periodo = 18) OR (periodo = 22)
      OR (periodo = 26) OR (periodo = 30) OR (periodo = 34) OR (periodo = 38) OR (periodo = 42) OR (periodo = 46)
      OR (periodo = 50)) THEN
      INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
      VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
     END
     ELSE
     IF ((:periodicidad = 3) AND (liquidaper = 3)) THEN
     BEGIN
      IF ((periodo = 3) OR (periodo = 7) OR (periodo = 11) OR (periodo = 15) OR (periodo = 19) OR (periodo = 23)
      OR (periodo = 27) OR (periodo = 31) OR (periodo = 35) OR (periodo = 39) OR (periodo = 43) OR (periodo = 47)
      OR (periodo = 51)) THEN
      INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
      VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
     END
     ELSE
     IF ((:periodicidad = 3) AND (liquidaper = 4)) THEN
     BEGIN
      IF ((periodo = 4) OR (periodo = 8) OR (periodo = 12) OR (periodo = 16) OR (periodo = 20) OR (periodo = 24)
      OR (periodo = 29) OR (periodo = 32) OR (periodo = 36) OR (periodo = 40) OR (periodo = 44) OR (periodo = 48)
      OR (periodo = 52)) THEN
      INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
      VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
     END
    END
  VALOR = 0;
  basico = 0;
   END
  END
 END
 SUSPEND;
END
^

SET TERM ; ^

ALTER TABLE NOMINA_HORASEXT
ADD NOEX_ORDNOCT INTEGER;

SET TERM ^ ;

ALTER PROCEDURE CAUSA_NOMINA(
    FEC DATE,
    PERIODO INTEGER,
    PERIODICIDAD INTEGER,
    PAGOGLOBAL CHAR(1),
    ANO CHAR(4))
RETURNS (
    IDNOMINA INTEGER)
AS
declare variable item integer;
declare variable nite varchar(20) character set none;
declare variable nit_tercero varchar(20);
declare variable concept integer;
declare variable montos numeric(18,2);
declare variable porcen numeric(9,4);
declare variable entidad varchar(20);
declare variable conc_cod integer;
declare variable conc_deduc char(1);
declare variable conc_porc numeric(9,4);
declare variable conc_entidad integer;
declare variable conc_monto numeric(18,2);
declare variable conc_modifi char(1);
declare variable conc_promedio char(1);
declare variable emco_perprom integer;
declare variable valor numeric(18,2);
declare variable diaslab integer;
declare variable conc_prov char(1);
declare variable conc_aporte char(1);
declare variable numeroprom integer;
declare variable conc_aplicaprom char(1);
declare variable perinicial integer;
declare variable anoprom integer;
declare variable conc_dias char(1);
declare variable conc_otroconc char(1);
declare variable conc_codotroconc integer;
declare variable anosum integer;
declare variable salario char(1) character set none;
declare variable liquidaper integer;
declare variable rmod numeric(2,2);
declare variable basico numeric(18,2);
declare variable niteps varchar(20);
declare variable nitafc varchar(20);
declare variable nitafp varchar(20);
declare variable nitccf varchar(20);
declare variable gtoempr char(1);
declare variable comision numeric(18,2);
declare variable cambsaltrans numeric(18,2);
declare variable saldosini numeric(18,2);
declare variable duranov integer;
declare variable base numeric(18,2);
declare variable aprox integer;
declare variable mensual char(1);
declare variable horasex numeric(18,2);
declare variable diasnov integer;
declare variable tomasal integer;
declare variable retroact numeric(18,2);
declare variable incap numeric(18,2);
BEGIN /*$$IBE$$ 
 EXECUTE PROCEDURE cambie_id_nomina RETURNING_VALUES(:idnomina);
 INSERT INTO nomina (nomi_id, NOMI_FECCAUSA, NOMI_PAGOGLOBAL, NOMI_PERIODOCIDAD, NOMI_PERIODO, NOMI_ANO, NOMI_LIQOK)
 VALUES (:IDNOMINA, :fec,:pagoglobal, :periodicidad, :periodo, :ano, 'N');
 $$IBE$$*/ /* fec = substr(fec,1,8) || (CAST(substr(fec,9,10) AS INTEGER)+1);
*/ /*$$IBE$$  item = 1;
 FOR SELECT E.TERC_NIT, E.empl_salario, e.empl_eps, e.empl_afc, e.empl_afp, e.empl_ccf
 FROM EMPLEADOS E
 WHERE E.empl_ppago = :periodicidad AND E.empl_fecret IS NULL
 INTO :nite, :basico, :niteps, :nitafc, :nitafp, :nitccf
 DO
 BEGIN
  FOR SELECT CE.TERC_NIT, CE.CONC_COD, CE.EMCO_MONTO, CE.EMCO_PORC, ce.empl_entidad, CE.emco_perprom, CE.emco_luquidaper, CE.emco_mensual, CN.CONC_COD, CN.CONC_DEDUC,CN.CONC_PORC, CN.CONC_ENTIDAD, CN.CONC_MONTO,  CN.CONC_DIAS, CN.CONC_MODIFI,
  CN.CONC_PROMEDIO, CN.conc_salario, CE.emco_perprom, CN.conc_prov, CN.conc_aporte, CN.conc_aplicaprom, cn.conc_otroconc, cn.conc_codotroconc, CN.conc_gtoempr, CN.conc_base, CE.emco_tomsal
  FROM empleado_conceptos CE, CONCEPTOS_NOMINA CN WHERE ((CE.terc_nit = :nite) AND (CE.CONC_COD = CN.CONC_COD) AND (CE.emco_fecini <= :fec AND CE.emco_fecfin >= :FEC) ) OR ((CE.terc_nit = :nite)
  AND (CE.CONC_COD = CN.CONC_COD) AND (cn.conc_todosper = 'N') AND (CE.emco_ppago = :periodo)) OR  ((CE.terc_nit = :nite) AND (CE.CONC_COD = CN.CONC_COD) AND cn.conc_todosper = 'S')  ORDER BY (TERC_NIT )
  INTO :nit_tercero, :concept,  :montos, :porcen, :entidad, :numeroprom, :liquidaper, :mensual ,:CONC_COD, :CONC_DEDUC, :CONC_PORC,
  :CONC_ENTIDAD, :CONC_MONTO, :CONC_DIAS, :CONC_MODIFI,:CONC_PROMEDIO, :salario,:EMCO_PERPROM, :conc_prov, :conc_aporte , :CONC_APLICAPROM, :conc_otroconc, :conc_codotroconc, :gtoempr, :base, :tomasal
  DO
  BEGIN
   IF (conc_dias = 'S') THEN
   EXECUTE PROCEDURE DIAS_LABORADOS (:nite, :periodo, :fec, :mensual,:conc_aporte) RETURNING_VALUES (:diaslab);
   ELSE
   BEGIN
    diaslab = 15;
    IF (mensual = 'S') THEN
    BEGIN
     IF (periodicidad = 2) THEN
     diaslab = 30;
     ELSE
     IF (liquidaper = 3) THEN
     diaslab = 30;
    END
   END
   IF (:tomasal <> 0) THEN
   BEGIN
    IF ((:periodicidad = 2) AND (:tomasal <> 2)) THEN
    BEGIN
     IF ((periodo = 2) OR (periodo = 4) OR (periodo = 6) OR (periodo = 8) OR (periodo = 10) OR (periodo = 12)
     OR (periodo = 14) OR (periodo = 16) OR (periodo = 18) OR (periodo = 20) OR (periodo = 22) OR (periodo = 24)) THEN
     basico = 0;
    END
    ELSE
    IF ((:periodicidad = 3) AND (:tomasal <> 1)) THEN
    BEGIN
     IF ((periodo = 1) OR (periodo = 5) OR (periodo = 9) OR (periodo = 13) OR (periodo = 17) OR (periodo = 21)
     OR (periodo = 25) OR (periodo = 29) OR (periodo = 33) OR (periodo = 37) OR (periodo = 41) OR (periodo = 45)
     OR (periodo = 49)) THEN
     basico = 0;
    END
    ELSE
     IF ((:periodicidad = 3) AND (:tomasal <> 2)) THEN
     BEGIN
      IF ((periodo = 2) OR (periodo = 6) OR (periodo = 10) OR (periodo = 14) OR (periodo = 18) OR (periodo = 22)
      OR (periodo = 26) OR (periodo = 30) OR (periodo = 34) OR (periodo = 38) OR (periodo = 42) OR (periodo = 46)
      OR (periodo = 50)) THEN
      basico = 0;
     END
     ELSE
     IF ((:periodicidad = 3) AND (:tomasal <> 3)) THEN
     BEGIN
      IF ((periodo = 3) OR (periodo = 7) OR (periodo = 11) OR (periodo = 15) OR (periodo = 19) OR (periodo = 23)
      OR (periodo = 27) OR (periodo = 31) OR (periodo = 35) OR (periodo = 39) OR (periodo = 43) OR (periodo = 47)
      OR (periodo = 51)) THEN
      basico = 0;
     END
     ELSE
     IF ((:periodicidad = 3) AND (:tomasal <> 4)) THEN
     BEGIN
      IF ((periodo = 4) OR (periodo = 8) OR (periodo = 12) OR (periodo = 16) OR (periodo = 20) OR (periodo = 24)
      OR (periodo = 29) OR (periodo = 32) OR (periodo = 36) OR (periodo = 40) OR (periodo = 44) OR (periodo = 48)
      OR (periodo = 52)) THEN
      basico = 0;
     END
   END
   ELSE
   BEGIN
    SELECT E.empl_salario FROM EMPLEADOS E WHERE E.terc_nit = :nite INTO :basico;
    SELECT ((n.nono_valor /30) * n.nono_dura), (n.nono_dura) FROM nomina_novedades n WHERE n.tnov_cod = 11 AND n.terc_nit = :nite AND n.nono_periodo = :periodo INTO :cambsaltrans, :duranov;
    IF (cambsaltrans IS NULL) THEN
    cambsaltrans = 0;
    IF (duranov IS NULL) THEN
    duranov = 0;
    diaslab = :diaslab - :duranov;
    IF (conc_cod = 922) THEN
    BEGIN
     SELECT SUM(P.prcu_monto) FROM prestamo_cuotas P, prestamo_nomina PN WHERE P.prcu_ano = :ano AND P.prcu_periodo = :periodo AND PN.prno_id = P.prno_id AND PN.terc_nit = :nite INTO :valor;
     IF (valor IS NULL) THEN
     valor = 0;
     item = :item + 1;
     UPDATE prestamo_cuotas  P SET prcu_ok = 'S' WHERE P.prcu_ano = :ano AND P.prcu_periodo = :periodo AND P.prno_id = (SELECT PN.prno_id FROM PRESTAMO_NOMINA PN WHERE PN.terc_nit = :nite);
    END
    ELSE
    IF ((:montos = 0) OR (:montos IS NULL)) THEN
    BEGIN
     IF ((CONC_PORC = 0 AND :porcen = 0) OR (CONC_PORC IS NULL AND :porcen = 0) OR (CONC_PORC = 0 AND :porcen IS NULL) OR (CONC_PORC IS NULL AND :porcen IS NULL) ) THEN
     BEGIN
      IF ((conc_monto <> 0) AND (conc_monto IS NOT NULL) ) THEN
      BEGIN
       VALOR = :CONC_MONTO;
       IF (:conc_dias = 'S') THEN
       valor = (:valor / 30) * :diaslab;
      END
      ELSE
      IF (salario = 'S' AND CONC_COD <> 900 AND CONC_COD <> 920) THEN
      BEGIN
       conc_monto = :basico;
       VALOR = (:conc_monto/30 * :diaslab ) + :cambsaltrans;
      END
      ELSE
      BEGIN
       valor = montos;
       IF (:conc_dias = 'S') THEN
       valor = (:valor / 30) * :diaslab;
      END
     END
     ELSE
     BEGIN
      IF (:porcen <> 0) THEN
      BEGIN
       IF ((conc_monto <> 0) AND (conc_monto IS NOT NULL) ) THEN
       BEGIN
        VALOR = ((:CONC_MONTO ) * :PORCEN) /100;
       END
      END
      ELSE
      BEGIN
       IF ((conc_monto <> 0) AND (conc_monto IS NOT NULL) ) THEN
       BEGIN
        VALOR = ((:CONC_MONTO) * :conc_porc) /100;
       END
       ELSE
       IF (salario = 'S' AND CONC_COD <> 900 AND CONC_COD <> 920) THEN
       BEGIN
        conc_monto = :basico;
        VALOR = ((:CONC_MONTO)+ :cambsaltrans * :conc_porc) /100;
       END
       ELSE
       IF (:conc_monto = 0 AND :montos = 0) THEN
       BEGIN
        conc_monto = :basico;
        VALOR = (((:CONC_MONTO / 30) * :diaslab) + :cambsaltrans * :conc_porc) /100;
       END
      END
     END
    END
    ELSE
    IF ((CONC_PORC = 0 OR (conc_porc IS NULL)) AND (:porcen = 0 OR (porcen IS NULL))) THEN
    BEGIN
     VALOR = (:montos);
     IF (:conc_dias = 'S') THEN
     valor = (:valor / 30) * :diaslab;
    END
    ELSE
    IF (:porcen <> 0 AND porcen IS NOT NULL) THEN
    BEGIN
     VALOR = ((:MONTOS ) * :PORCEN) /100;
    END
    ELSE
    BEGIN
     VALOR = ((:montos) * :CONC_PORC) /100;
    END
    IF (conc_promedio = 'S') THEN
    BEGIN
     perinicial = :periodo - (:numeroprom) + 1;
     anoprom = CAST (ano AS INTEGER);
     IF (perinicial <= 0) THEN
     BEGIN
      perinicial = 24 + :PERINICIAL;
      anoprom = CAST(ANO AS INTEGER) - 1;
     END
     SELECT SUM (noco_valor) FROM nomina_conceptos n WHERE n.noco_aplicaprom = 'S' AND N.noco_periodo >= :perinicial - 1 AND N.noco_periodo < :periodo AND N.noco_ano >= :anoprom AND N.noco_ano <= :ano AND terc_nit = :nite INTO :valor;
     valor = (valor / numeroprom);
     SELECT NOCO_VALOR FROM NOMINA_CONCEPTOS WHERE CONC_COD = :conc_cod AND TERC_NIT  = :nite AND NOCO_PAGOOK = 'N' AND NOCO_PERIODO = 0 INTO :saldosini;
     IF (saldosini IS NULL) THEN
     saldosini = 0;
     ELSE
     UPDATE nomina_conceptos N SET noco_pagook = 'S' WHERE n.noco_aplicaprom = 'S' AND N.noco_periodo >= :perinicial - 1 AND N.noco_periodo < :periodo AND N.noco_ano >= :anoprom AND N.noco_ano <= :ano  AND CONC_COD = :conc_cod AND terc_nit = :nite AND NOCO_PERIODO = 0;
     VALOR = :valor + :saldosini;
     UPDATE nomina_conceptos N SET noco_pagook = 'S' WHERE n.noco_aplicaprom = 'S' AND N.noco_periodo >= :perinicial - 1 AND N.noco_periodo < :periodo AND N.noco_ano >= :anoprom AND N.noco_ano <= :ano  AND CONC_COD = :conc_cod AND terc_nit = :nite;
    END
    ELSE
    IF (conc_otroconc = 'S') THEN
    BEGIN
     anosum = CAST(ano AS INTEGER);
     anosum = anosum - 1;
     SELECT SUM (noco_valor) FROM nomina_conceptos n WHERE n.noco_ano = :anosum AND n.conc_cod = :conc_codotroconc AND N.terc_nit = :nite INTO :valor;
     SELECT NOCO_VALOR FROM NOMINA_CONCEPTOS WHERE noco_ano = :anosum AND conc_cod = :conc_codotroconc AND terc_nit = :nite AND NOCO_PERIODO = 0 INTO :saldosini;
     IF (saldosini IS NULL) THEN
     saldosini = 0;
     ELSE
     UPDATE nomina_conceptos SET noco_pagook = 'S' WHERE noco_ano = :anosum AND conc_cod = :conc_codotroconc AND NOCO_PERIODO = 0 AND terc_nit = :nite;
     VALOR = :valor + :saldosini;
     UPDATE nomina_conceptos SET noco_pagook = 'S' WHERE noco_ano = :anosum AND conc_cod = :conc_codotroconc AND terc_nit = :nite;
    END
    ELSE
    IF (conc_aporte = 'S') THEN
    BEGIN
     horasex = NULL;
     diasnov = NULL;
     IF ((:entidad = '' ) OR (entidad IS NULL)) THEN
     BEGIN
      SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
      IF (comision IS NULL) THEN
      comision = 0;
      SELECT C.emco_monto FROM EMPLEADO_CONCEPTOS C WHERE C.terc_nit = :nite AND C.conc_cod = 933 INTO :retroact;
      IF (retroact IS NULL ) THEN
      retroact = 0;
      SELECT N.nono_dura FROM NOMINA_NOVEDADES N WHERE N.terc_nit = :nite AND N.nono_periodo = :periodo AND N.nono_ano = :ano AND (N.tnov_cod = 2 or (N.tnov_cod = 3)) INTO :diasnov;
      IF (:diasnov IS NULL) THEN
      incap = 0;
      ELSE
      incap = (:basico / 30)* :diasnov;
      valor = :basico + :comision + :horasex + :retroact + :incap;
      IF ((conc_cod = 904) OR (conc_cod = 905) OR (conc_cod = 906)) THEN
      BEGIN
       entidad = :nitafp;
       IF (conc_cod = 904) THEN
       BEGIN
        SELECT A.paan_afptr FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
        SELECT N.nono_dura FROM NOMINA_NOVEDADES N WHERE N.terc_nit = :nite AND N.nono_periodo = :periodo AND N.nono_ano = :ano AND (N.tnov_cod = 2 or (N.tnov_cod = 3)) INTO :diasnov;
        IF (:diasnov IS NULL) THEN
        incap = 0;
        ELSE
        incap = (:basico / 30)* :diasnov;
        SELECT c.noex_monto FROM nomina_horasext c WHERE c.noex_ano = :ano AND c.noex_periodio = :periodo AND c.noex_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :horasex;
        IF (horasex IS NOT NULL) THEN
        VALOR = (((((:basico )/30 * :diaslab ) + :comision + :horasex + :retroact+ :incap)+ :cambsaltrans ) * :PORCEN) /100;
        ELSE
        VALOR = ((((:basico)/30 * :diaslab ) + :comision + :retroact+ :cambsaltrans  + :incap) * :PORCEN) /100;
       END
       ELSE
       IF ((conc_cod = 905) OR (conc_cod = 906)) THEN
       BEGIN
        SELECT A.paan_afpem FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
        SELECT N.nono_dura FROM NOMINA_NOVEDADES N WHERE N.terc_nit = :nite AND N.nono_periodo = :periodo AND N.nono_ano = :ano AND (N.tnov_cod = 2 or (N.tnov_cod = 3)) INTO :diasnov;
        IF (:diasnov IS NULL) THEN
        incap = 0;
        ELSE
        incap = (:basico / 30)* :diasnov;
        SELECT c.noex_monto FROM nomina_horasext c WHERE c.noex_ano = :ano AND c.noex_periodio = :periodo AND c.noex_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :horasex;
        IF (horasex IS NOT NULL) THEN
        VALOR = (((((:basico )/30 * :diaslab ) + :comision + :horasex + :retroact)+ :cambsaltrans + :incap) * :PORCEN) /100;
        ELSE
        VALOR = (((((:basico )/30 * :diaslab ) + :comision + :retroact)+ :cambsaltrans + :incap) * :PORCEN) /100;
       END
      END
      ELSE
      IF ((conc_cod = 907) OR (conc_cod = 914) OR (conc_cod = 915)) THEN
      BEGIN
       entidad = :niteps;
       IF (conc_cod = 907) THEN
       BEGIN
        SELECT A.paan_epstr FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
        SELECT N.nono_dura FROM NOMINA_NOVEDADES N WHERE N.terc_nit = :nite AND N.nono_periodo = :periodo AND N.nono_ano = :ano AND (N.tnov_cod = 2 or (N.tnov_cod = 3)) INTO :diasnov;
        IF (:diasnov IS NULL) THEN
        incap = 0;
        ELSE
        incap = (:basico / 30)* :diasnov;
        SELECT c.noex_monto FROM nomina_horasext c WHERE c.noex_ano = :ano AND c.noex_periodio = :periodo AND c.noex_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :horasex;
        IF (horasex IS NOT NULL) THEN
        VALOR = (((((:basico )/30 * :diaslab ) + :comision + :horasex + :retroact)+ :cambsaltrans + :incap) * :PORCEN) /100;
        ELSE
        VALOR = (((((:basico )/30 * :diaslab ) + :comision + :retroact)+ :cambsaltrans + :incap) * :PORCEN) /100;
       END
       ELSE
       IF ((conc_cod = 914) OR (conc_cod = 915)) THEN
       BEGIN
        SELECT A.paan_epsem FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
        SELECT N.nono_dura FROM NOMINA_NOVEDADES N WHERE N.terc_nit = :nite AND N.nono_periodo = :periodo AND N.nono_ano = :ano AND (N.tnov_cod = 2 or (N.tnov_cod = 3)) INTO :diasnov;
        IF (:diasnov IS NULL) THEN
        incap = 0;
        ELSE
        incap = (:basico / 30)* :diasnov;
        SELECT c.noex_monto FROM nomina_horasext c WHERE c.noex_ano = :ano AND c.noex_periodio = :periodo AND c.noex_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :horasex;
        IF (horasex IS NOT NULL) THEN
        VALOR = (((((:basico )/30 * :diaslab ) + :comision + :horasex + :retroact)+ :cambsaltrans + :incap) * :PORCEN) /100;
        ELSE
        VALOR = (((((:basico )/30 * :diaslab ) + :comision + :retroact)+ :cambsaltrans + :incap) * :PORCEN) /100;
       END
      END
      ELSE
      IF ((conc_cod = 910) OR (conc_cod = 911) OR (conc_cod = 916) OR (conc_cod = 917) OR (conc_cod = 918) OR (conc_cod = 919)) THEN
      BEGIN
       entidad = :nitccf;
       SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
       IF (comision IS NULL) THEN
       comision = 0;
       SELECT N.nono_dura FROM NOMINA_NOVEDADES N WHERE N.terc_nit = :nite AND N.nono_periodo = :periodo AND N.nono_ano = :ano AND (N.tnov_cod = 2 or (N.tnov_cod = 3)) INTO :diasnov;
       IF (:diasnov IS NULL) THEN
       incap = 0;
       ELSE
       incap = (:basico / 30)* :diasnov;
       IF ((conc_cod = 910) OR (conc_cod = 911) ) THEN
       BEGIN
        SELECT A.paan_ccf FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
      SELECT N.nono_dura FROM NOMINA_NOVEDADES N WHERE N.terc_nit = :nite AND N.nono_periodo = :periodo AND N.nono_ano = :ano AND (N.tnov_cod = 2 or (N.tnov_cod = 3)) INTO :diasnov;
      IF (:diasnov IS NULL) THEN
      incap = 0;
      ELSE
      incap = (:basico / 30)* :diasnov;
        SELECT c.noex_monto FROM nomina_horasext c WHERE c.noex_ano = :ano AND c.noex_periodio = :periodo AND c.noex_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :horasex;
        IF (horasex IS NOT NULL) THEN
        VALOR = (((((:basico )/30 * :diaslab ) + :comision + :horasex + :retroact)+ :cambsaltrans + :incap) * :PORCEN) /100;
        ELSE
        VALOR = (((((:basico )/30 * :diaslab ) + :comision + :retroact)+ :cambsaltrans + :incap) * :PORCEN) /100;
       END
       ELSE
       IF ((conc_cod = 916) OR (conc_cod = 917)) THEN
       BEGIN
        SELECT A.paan_icbf FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
      SELECT N.nono_dura FROM NOMINA_NOVEDADES N WHERE N.terc_nit = :nite AND N.nono_periodo = :periodo AND N.nono_ano = :ano AND (N.tnov_cod = 2 or (N.tnov_cod = 3)) INTO :diasnov;
      IF (:diasnov IS NULL) THEN
      incap = 0;
      ELSE
      incap = (:basico / 30)* :diasnov;
      SELECT N.nono_dura FROM NOMINA_NOVEDADES N WHERE N.terc_nit = :nite AND N.nono_periodo = :periodo AND N.nono_ano = :ano AND (N.tnov_cod = 2 or (N.tnov_cod = 3)) INTO :diasnov;
      IF (:diasnov IS NULL) THEN
      incap = 0;
      ELSE
      incap = (:basico / 30)* :diasnov;
        SELECT c.noex_monto FROM nomina_horasext c WHERE c.noex_ano = :ano AND c.noex_periodio = :periodo AND c.noex_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :horasex;
        IF (horasex IS NOT NULL) THEN
        VALOR = (((((:basico )/30 * :diaslab ) + :comision + :horasex + :retroact)+ :cambsaltrans + :incap) * :PORCEN) /100;
        ELSE
        VALOR = (((((:basico )/30 * :diaslab ) + :comision + :retroact)+ :cambsaltrans + :incap) * :PORCEN) /100;
       END
       ELSE
       IF ((conc_cod = 918) OR (conc_cod = 919)) THEN
       BEGIN
        SELECT A.paan_sena FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
      SELECT N.nono_dura FROM NOMINA_NOVEDADES N WHERE N.terc_nit = :nite AND N.nono_periodo = :periodo AND N.nono_ano = :ano AND (N.tnov_cod = 2 or (N.tnov_cod = 3)) INTO :diasnov;
      IF (:diasnov IS NULL) THEN
      incap = 0;
      ELSE
      incap = (:basico / 30)* :diasnov;
        SELECT c.noex_monto FROM nomina_horasext c WHERE c.noex_ano = :ano AND c.noex_periodio = :periodo AND c.noex_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :horasex;
        IF (horasex IS NOT NULL) THEN
        VALOR = (((((:basico )/30 * :diaslab ) + :comision + :horasex + :retroact)+ :cambsaltrans + :incap) * :PORCEN) /100;
        ELSE
        VALOR = (((((:basico )/30 * :diaslab ) + :comision + :retroact)+ :cambsaltrans + :incap) * :PORCEN) /100;
       END
      END
      ELSE
      IF ((conc_cod = 912) OR (conc_cod = 913)) THEN
      BEGIN
       entidad = :nitafc;
       SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
       IF (comision IS NULL) THEN
       comision = 0;
      SELECT N.nono_dura FROM NOMINA_NOVEDADES N WHERE N.terc_nit = :nite AND N.nono_periodo = :periodo AND N.nono_ano = :ano AND (N.tnov_cod = 2 or (N.tnov_cod = 3)) INTO :diasnov;
      IF (:diasnov IS NULL) THEN
      incap = 0;
      ELSE
      incap = (:basico / 30)* :diasnov;
       IF ((conc_cod = 912) OR (conc_cod = 913) ) THEN
       BEGIN
        SELECT A.paan_cesemp FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
        SELECT c.noex_monto FROM nomina_horasext c WHERE c.noex_ano = :ano AND c.noex_periodio = :periodo AND c.noex_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :horasex;
        IF (horasex IS NOT NULL) THEN
        VALOR = (((((:basico )/30 * :diaslab ) + :comision + :horasex + :retroact)+ :cambsaltrans + :incap) * :PORCEN) /100;
        ELSE
        VALOR = (((((:basico )/30 * :diaslab ) + :comision + :retroact)+ :cambsaltrans + :incap) * :PORCEN) /100;
       END
      END
      ELSE
      BEGIN
       IF (comision IS NULL) THEN
       comision = 0;
       SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
       conc_monto = :basico + :comision;
       IF (conc_porc <> 0 AND conc_porc IS NOT NULL) THEN
       VALOR = (((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans + :incap) * :conc_porc) /100;
       ELSE
       IF (:porcen <> 0 AND :porcen IS NOT NULL) THEN
       VALOR = (((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans + :incap) * :porcen) /100;
       ELSE
       IF (:montos <> 0 AND :montos IS NOT NULL) THEN
       valor = :montos;
       ELSE
       IF (:conc_monto <> 0 AND :conc_monto IS NOT NULL) THEN
       valor = :conc_monto;
      END
     END
     item = :item + 1;
    END
    ELSE
    IF (conc_prov = 'S') THEN
    BEGIN
     conc_monto = :basico;
     IF (conc_porc <> 0 AND conc_porc IS NOT NULL) THEN
     VALOR = (((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans + :incap) * :conc_porc) /100;
     ELSE
     IF (porcen <> 0 AND porcen IS NOT NULL) THEN
     VALOR = (((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans + :incap) * :porcen) /100;
     ELSE
     IF (montos <> 0 AND montos IS NOT NULL) THEN
     VALOR = :montos;
     ELSE
     IF (conc_monto <> 0 AND conc_monto IS NOT NULL) THEN
     VALOR = :conc_monto;
     item = :item + 1;
    END
    ELSE
    IF (conc_cod = 920) THEN
    BEGIN
     SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :valor;
     IF (valor IS NULL) THEN
     valor = 0;
     item = :item + 1;
    END
    ELSE
    IF (conc_cod = 900 OR (:conc_cod = 931)) THEN
    BEGIN
     SELECT c.noex_monto FROM nomina_horasext c WHERE c.noex_ano = :ano AND c.noex_periodio = :periodo AND c.noex_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :valor;
     IF (valor IS NULL) THEN
     valor = 0;
     item = :item + 1;
    END
    ELSE
    IF (conc_cod = 932) THEN
    BEGIN
     SELECT N.nono_dura FROM NOMINA_NOVEDADES N WHERE N.terc_nit = :nite AND N.nono_periodo = :periodo AND N.nono_ano = :ano AND (N.tnov_cod = 2 or (N.tnov_cod = 3)) INTO :diasnov;
     IF (:diasnov IS NULL) THEN
     valor = 0;
     ELSE
     valor = (:basico / 30)* :diasnov;
    END
    ELSE
    IF (conc_cod = 921) THEN
    BEGIN
     IF (porcen IS NOT NULL AND porcen <> 0) THEN
     valor = ((basico / 30)* :diaslab ) * :PORCEN /100;
     ELSE
     IF (conc_porc IS NOT NULL AND conc_porc <> 0) THEN
     valor = ((basico / 30)* :diaslab ) * :conc_porc /100;
    END
    EXECUTE PROCEDURE LEE_CONFIGURACION('NOMINA','GENERAL','REDONDEO AL MULTIPLO DE DIEZ EN TOTALES')RETURNING_VALUES(:aprox);
    EXECUTE PROCEDURE REDONDEE(:valor, :aprox) RETURNING_VALUES (VALOR);
    IF ((mensual = 'N') OR (periodicidad = 1))  THEN
    INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
    VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
    ELSE
    IF (mensual = 'S') THEN
    BEGIN
     IF ((:periodicidad = 2) AND (liquidaper = 1)) THEN
     BEGIN
      IF ((periodo = 1) OR (periodo = 3) OR (periodo = 5) OR (periodo = 7) OR (periodo = 9) OR (periodo = 11)
      OR (periodo = 13) OR (periodo = 15) OR (periodo = 17) OR (periodo = 19) OR (periodo = 21) OR (periodo = 23)) THEN
      INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
      VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
     END
     ELSE
     IF ((:periodicidad = 2) AND (liquidaper = 2)) THEN
     BEGIN
      IF ((periodo = 2) OR (periodo = 4) OR (periodo = 6) OR (periodo = 8) OR (periodo = 10) OR (periodo = 12)
      OR (periodo = 14) OR (periodo = 16) OR (periodo = 18) OR (periodo = 20) OR (periodo = 22) OR (periodo = 24)) THEN
      INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
      VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
     END
     ELSE
     IF ((:periodicidad = 3) AND (liquidaper = 1)) THEN
     BEGIN
      IF ((periodo = 1) OR (periodo = 5) OR (periodo = 9) OR (periodo = 13) OR (periodo = 17) OR (periodo = 21)
      OR (periodo = 25) OR (periodo = 29) OR (periodo = 33) OR (periodo = 37) OR (periodo = 41) OR (periodo = 45)
      OR (periodo = 49)) THEN
      INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
      VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
    END
    ELSE
     IF ((:periodicidad = 3) AND (liquidaper = 2)) THEN
     BEGIN
      IF ((periodo = 2) OR (periodo = 6) OR (periodo = 10) OR (periodo = 14) OR (periodo = 18) OR (periodo = 22)
      OR (periodo = 26) OR (periodo = 30) OR (periodo = 34) OR (periodo = 38) OR (periodo = 42) OR (periodo = 46)
      OR (periodo = 50)) THEN
      INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
      VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
     END
     ELSE
     IF ((:periodicidad = 3) AND (liquidaper = 3)) THEN
     BEGIN
      IF ((periodo = 3) OR (periodo = 7) OR (periodo = 11) OR (periodo = 15) OR (periodo = 19) OR (periodo = 23)
      OR (periodo = 27) OR (periodo = 31) OR (periodo = 35) OR (periodo = 39) OR (periodo = 43) OR (periodo = 47)
      OR (periodo = 51)) THEN
      INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
      VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
     END
     ELSE
     IF ((:periodicidad = 3) AND (liquidaper = 4)) THEN
     BEGIN
      IF ((periodo = 4) OR (periodo = 8) OR (periodo = 12) OR (periodo = 16) OR (periodo = 20) OR (periodo = 24)
      OR (periodo = 29) OR (periodo = 32) OR (periodo = 36) OR (periodo = 40) OR (periodo = 44) OR (periodo = 48)
      OR (periodo = 52)) THEN
      INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
      VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
     END
    END
  VALOR = 0;
  basico = 0;
   END
  END
 END
 SUSPEND;
 $$IBE$$*/ SUSPEND;
END
^

SET TERM ; ^


SET TERM ^ ;

CREATE OR ALTER PROCEDURE DIAS_LABORADOS(
    NITEMPL VARCHAR(20),
    PERIODO INTEGER,
    FEC DATE,
    MENSUAL CHAR(1),
    APORTE CHAR(1))
RETURNS (
    TOTALDIASLAB INTEGER)
AS
DECLARE VARIABLE diasnolab INTEGER;
DECLARE VARIABLE diaslabxper INTEGER;
DECLARE VARIABLE perpago INTEGER;
DECLARE VARIABLE fecing DATE;
DECLARE VARIABLE diasfec INTEGER;
DECLARE VARIABLE diasing INTEGER;
DECLARE VARIABLE existe CHAR(1);
BEGIN
SELECT E.empl_ppago, E.empl_fecing
FROM EMPLEADOS E WHERE TERC_NIT = :nitempl
INTO :perpago, :fecing;
IF (mensual = 'N') THEN
BEGIN
IF (perpago = 1) THEN
diaslabxper = 30;
ELSE
IF (perpago = 2) THEN
diaslabxper = 15;
ELSE
IF (perpago = 3) THEN
diaslabxper = 7;
END
ELSE
diaslabxper = 30;
IF (SUBSTR(fecing,1,7) = SUBSTR(FEC,1,7)) THEN
BEGIN
diasfec = CAST(substr(fec,9,10) AS INTEGER);
diasing = CAST(substr(fecing,9,10) AS INTEGER);
diaslabxper = diasfec - diasing;
IF ((diaslabxper > 15) AND (perpago = 2)) THEN
diaslabxper = 15;
END
SELECT 'S' FROM nomina_novedades WHERE TERC_NIT = :nitempl AND (TNOV_COD = 9 or (tnov_cod = 2) or (tnov_cod = 3) or (tnov_cod = 6)) AND NONO_PERIODO = :periodo
INTO :existe;
IF ((aporte = 'N' ) OR (:existe = 'S'))  THEN
BEGIN
SELECT SUM (NONO_DURA)
FROM nomina_novedades WHERE TERC_NIT = :nitempl AND (TNOV_COD = 9 OR (TNOV_COD = 6) OR (TNOV_COD = 2) OR (TNOV_COD =3) OR (TNOV_COD = 4)  ) AND NONO_PERIODO = :periodo
INTO :diasnolab;
totaldiaslab =  :diaslabxper - :diasnolab;
END
IF (totaldiaslab IS NULL) THEN
totaldiaslab =  :diaslabxper;
SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE CAUSA_NOMINA(
    FEC DATE,
    PERIODO INTEGER,
    PERIODICIDAD INTEGER,
    PAGOGLOBAL CHAR(1),
    ANO CHAR(4))
RETURNS (
    IDNOMINA INTEGER)
AS
declare variable item integer;
declare variable nite varchar(20) character set none;
declare variable nit_tercero varchar(20);
declare variable concept integer;
declare variable montos numeric(18,2);
declare variable porcen numeric(9,4);
declare variable entidad varchar(20);
declare variable conc_cod integer;
declare variable conc_deduc char(1);
declare variable conc_porc numeric(9,4);
declare variable conc_entidad integer;
declare variable conc_monto numeric(18,2);
declare variable conc_modifi char(1);
declare variable conc_promedio char(1);
declare variable emco_perprom integer;
declare variable valor numeric(18,2);
declare variable diaslab integer;
declare variable conc_prov char(1);
declare variable conc_aporte char(1);
declare variable numeroprom integer;
declare variable conc_aplicaprom char(1);
declare variable perinicial integer;
declare variable anoprom integer;
declare variable conc_dias char(1);
declare variable conc_otroconc char(1);
declare variable conc_codotroconc integer;
declare variable anosum integer;
declare variable salario char(1) character set none;
declare variable liquidaper integer;
declare variable rmod numeric(2,2);
declare variable basico numeric(18,2);
declare variable niteps varchar(20);
declare variable nitafc varchar(20);
declare variable nitafp varchar(20);
declare variable nitccf varchar(20);
declare variable gtoempr char(1);
declare variable comision numeric(18,2);
declare variable cambsaltrans numeric(18,2);
declare variable saldosini numeric(18,2);
declare variable duranov integer;
declare variable base numeric(18,2);
declare variable aprox integer;
declare variable mensual char(1);
declare variable horasex numeric(18,2);
declare variable diasnov integer;
declare variable tomasal integer;
declare variable retroact numeric(18,2);
declare variable incap numeric(18,2);
BEGIN
 EXECUTE PROCEDURE cambie_id_nomina RETURNING_VALUES(:idnomina);
 INSERT INTO nomina (nomi_id, NOMI_FECCAUSA, NOMI_PAGOGLOBAL, NOMI_PERIODOCIDAD, NOMI_PERIODO, NOMI_ANO, NOMI_LIQOK)
 VALUES (:IDNOMINA, :fec,:pagoglobal, :periodicidad, :periodo, :ano, 'N');
/* fec = substr(fec,1,8) || (CAST(substr(fec,9,10) AS INTEGER)+1);
*/ item = 1;
 FOR SELECT E.TERC_NIT, E.empl_salario, e.empl_eps, e.empl_afc, e.empl_afp, e.empl_ccf
 FROM EMPLEADOS E
 WHERE E.empl_ppago = :periodicidad AND E.empl_fecret IS NULL
 INTO :nite, :basico, :niteps, :nitafc, :nitafp, :nitccf
 DO
 BEGIN
  FOR SELECT CE.TERC_NIT, CE.CONC_COD, CE.EMCO_MONTO, CE.EMCO_PORC, ce.empl_entidad, CE.emco_perprom, CE.emco_luquidaper, CE.emco_mensual, CN.CONC_COD, CN.CONC_DEDUC,CN.CONC_PORC, CN.CONC_ENTIDAD, CN.CONC_MONTO,  CN.CONC_DIAS, CN.CONC_MODIFI,
  CN.CONC_PROMEDIO, CN.conc_salario, CE.emco_perprom, CN.conc_prov, CN.conc_aporte, CN.conc_aplicaprom, cn.conc_otroconc, cn.conc_codotroconc, CN.conc_gtoempr, CN.conc_base, CE.emco_tomsal
  FROM empleado_conceptos CE, CONCEPTOS_NOMINA CN WHERE ((CE.terc_nit = :nite) AND (CE.CONC_COD = CN.CONC_COD) AND (CE.emco_fecini <= :fec AND CE.emco_fecfin >= :FEC) ) OR ((CE.terc_nit = :nite)
  AND (CE.CONC_COD = CN.CONC_COD) AND (cn.conc_todosper = 'N') AND (CE.emco_ppago = :periodo)) OR  ((CE.terc_nit = :nite) AND (CE.CONC_COD = CN.CONC_COD) AND cn.conc_todosper = 'S')  ORDER BY (TERC_NIT )
  INTO :nit_tercero, :concept,  :montos, :porcen, :entidad, :numeroprom, :liquidaper, :mensual ,:CONC_COD, :CONC_DEDUC, :CONC_PORC,
  :CONC_ENTIDAD, :CONC_MONTO, :CONC_DIAS, :CONC_MODIFI,:CONC_PROMEDIO, :salario,:EMCO_PERPROM, :conc_prov, :conc_aporte , :CONC_APLICAPROM, :conc_otroconc, :conc_codotroconc, :gtoempr, :base, :tomasal
  DO
  BEGIN
   IF (conc_dias = 'S') THEN
   EXECUTE PROCEDURE DIAS_LABORADOS (:nite, :periodo, :fec, :mensual,:conc_aporte) RETURNING_VALUES (:diaslab);
   ELSE
   BEGIN
    diaslab = 15;
    IF (mensual = 'S') THEN
    BEGIN
     IF (periodicidad = 2) THEN
     diaslab = 30;
     ELSE
     IF (liquidaper = 3) THEN
     diaslab = 30;
    END
   END
   IF (:tomasal <> 0) THEN
   BEGIN
    IF ((:periodicidad = 2) AND (:tomasal <> 2)) THEN
    BEGIN
     IF ((periodo = 2) OR (periodo = 4) OR (periodo = 6) OR (periodo = 8) OR (periodo = 10) OR (periodo = 12)
     OR (periodo = 14) OR (periodo = 16) OR (periodo = 18) OR (periodo = 20) OR (periodo = 22) OR (periodo = 24)) THEN
     basico = 0;
    END
    ELSE
    IF ((:periodicidad = 3) AND (:tomasal <> 1)) THEN
    BEGIN
     IF ((periodo = 1) OR (periodo = 5) OR (periodo = 9) OR (periodo = 13) OR (periodo = 17) OR (periodo = 21)
     OR (periodo = 25) OR (periodo = 29) OR (periodo = 33) OR (periodo = 37) OR (periodo = 41) OR (periodo = 45)
     OR (periodo = 49)) THEN
     basico = 0;
    END
    ELSE
     IF ((:periodicidad = 3) AND (:tomasal <> 2)) THEN
     BEGIN
      IF ((periodo = 2) OR (periodo = 6) OR (periodo = 10) OR (periodo = 14) OR (periodo = 18) OR (periodo = 22)
      OR (periodo = 26) OR (periodo = 30) OR (periodo = 34) OR (periodo = 38) OR (periodo = 42) OR (periodo = 46)
      OR (periodo = 50)) THEN
      basico = 0;
     END
     ELSE
     IF ((:periodicidad = 3) AND (:tomasal <> 3)) THEN
     BEGIN
      IF ((periodo = 3) OR (periodo = 7) OR (periodo = 11) OR (periodo = 15) OR (periodo = 19) OR (periodo = 23)
      OR (periodo = 27) OR (periodo = 31) OR (periodo = 35) OR (periodo = 39) OR (periodo = 43) OR (periodo = 47)
      OR (periodo = 51)) THEN
      basico = 0;
     END
     ELSE
     IF ((:periodicidad = 3) AND (:tomasal <> 4)) THEN
     BEGIN
      IF ((periodo = 4) OR (periodo = 8) OR (periodo = 12) OR (periodo = 16) OR (periodo = 20) OR (periodo = 24)
      OR (periodo = 29) OR (periodo = 32) OR (periodo = 36) OR (periodo = 40) OR (periodo = 44) OR (periodo = 48)
      OR (periodo = 52)) THEN
      basico = 0;
     END
   END
   ELSE
   BEGIN
    SELECT E.empl_salario FROM EMPLEADOS E WHERE E.terc_nit = :nite INTO :basico;
    SELECT ((n.nono_valor /30) * n.nono_dura), (n.nono_dura) FROM nomina_novedades n WHERE n.tnov_cod = 11 AND n.terc_nit = :nite AND n.nono_periodo = :periodo INTO :cambsaltrans, :duranov;
    IF (cambsaltrans IS NULL) THEN
    cambsaltrans = 0;
    IF (duranov IS NULL) THEN
    duranov = 0;
    diaslab = :diaslab - :duranov;
    IF (conc_cod = 922) THEN
    BEGIN
     SELECT SUM(P.prcu_monto) FROM prestamo_cuotas P, prestamo_nomina PN WHERE P.prcu_ano = :ano AND P.prcu_periodo = :periodo AND PN.prno_id = P.prno_id AND PN.terc_nit = :nite INTO :valor;
     IF (valor IS NULL) THEN
     valor = 0;
     item = :item + 1;
     UPDATE prestamo_cuotas  P SET prcu_ok = 'S' WHERE P.prcu_ano = :ano AND P.prcu_periodo = :periodo AND P.prno_id = (SELECT PN.prno_id FROM PRESTAMO_NOMINA PN WHERE PN.terc_nit = :nite);
    END
    ELSE
    IF ((:montos = 0) OR (:montos IS NULL)) THEN
    BEGIN
     IF ((CONC_PORC = 0 AND :porcen = 0) OR (CONC_PORC IS NULL AND :porcen = 0) OR (CONC_PORC = 0 AND :porcen IS NULL) OR (CONC_PORC IS NULL AND :porcen IS NULL) ) THEN
     BEGIN
      IF ((conc_monto <> 0) AND (conc_monto IS NOT NULL) ) THEN
      BEGIN
       VALOR = :CONC_MONTO;
       IF (:conc_dias = 'S') THEN
       valor = (:valor / 30) * :diaslab;
      END
      ELSE
      IF (salario = 'S' AND CONC_COD <> 900 AND CONC_COD <> 920) THEN
      BEGIN
       conc_monto = :basico;
       VALOR = (:conc_monto/30 * :diaslab ) + :cambsaltrans;
      END
      ELSE
      BEGIN
       valor = montos;
       IF (:conc_dias = 'S') THEN
       valor = (:valor / 30) * :diaslab;
      END
     END
     ELSE
     BEGIN
      IF (:porcen <> 0) THEN
      BEGIN
       IF ((conc_monto <> 0) AND (conc_monto IS NOT NULL) ) THEN
       BEGIN
        VALOR = ((:CONC_MONTO ) * :PORCEN) /100;
       END
      END
      ELSE
      BEGIN
       IF ((conc_monto <> 0) AND (conc_monto IS NOT NULL) ) THEN
       BEGIN
        VALOR = ((:CONC_MONTO) * :conc_porc) /100;
       END
       ELSE
       IF (salario = 'S' AND CONC_COD <> 900 AND CONC_COD <> 920) THEN
       BEGIN
        conc_monto = :basico;
        VALOR = ((:CONC_MONTO)+ :cambsaltrans * :conc_porc) /100;
       END
       ELSE
       IF (:conc_monto = 0 AND :montos = 0) THEN
       BEGIN
        conc_monto = :basico;
        VALOR = (((:CONC_MONTO / 30) * :diaslab) + :cambsaltrans * :conc_porc) /100;
       END
      END
     END
    END
    ELSE
    IF ((CONC_PORC = 0 OR (conc_porc IS NULL)) AND (:porcen = 0 OR (porcen IS NULL))) THEN
    BEGIN
     VALOR = (:montos);
     IF (:conc_dias = 'S') THEN
     valor = (:valor / 30) * :diaslab;
    END
    ELSE
    IF (:porcen <> 0 AND porcen IS NOT NULL) THEN
    BEGIN
     VALOR = ((:MONTOS ) * :PORCEN) /100;
    END
    ELSE
    BEGIN
     VALOR = ((:montos) * :CONC_PORC) /100;
    END
    IF (conc_promedio = 'S') THEN
    BEGIN
     perinicial = :periodo - (:numeroprom) + 1;
     anoprom = CAST (ano AS INTEGER);
     IF (perinicial <= 0) THEN
     BEGIN
      perinicial = 24 + :PERINICIAL;
      anoprom = CAST(ANO AS INTEGER) - 1;
     END
     SELECT SUM (noco_valor) FROM nomina_conceptos n WHERE n.noco_aplicaprom = 'S' AND N.noco_periodo >= :perinicial - 1 AND N.noco_periodo < :periodo AND N.noco_ano >= :anoprom AND N.noco_ano <= :ano AND terc_nit = :nite INTO :valor;
     valor = (valor / numeroprom);
     SELECT NOCO_VALOR FROM NOMINA_CONCEPTOS WHERE CONC_COD = :conc_cod AND TERC_NIT  = :nite AND NOCO_PAGOOK = 'N' AND NOCO_PERIODO = 0 INTO :saldosini;
     IF (saldosini IS NULL) THEN
     saldosini = 0;
     ELSE
     UPDATE nomina_conceptos N SET noco_pagook = 'S' WHERE n.noco_aplicaprom = 'S' AND N.noco_periodo >= :perinicial - 1 AND N.noco_periodo < :periodo AND N.noco_ano >= :anoprom AND N.noco_ano <= :ano  AND CONC_COD = :conc_cod AND terc_nit = :nite AND NOCO_PERIODO = 0;
     VALOR = :valor + :saldosini;
     UPDATE nomina_conceptos N SET noco_pagook = 'S' WHERE n.noco_aplicaprom = 'S' AND N.noco_periodo >= :perinicial - 1 AND N.noco_periodo < :periodo AND N.noco_ano >= :anoprom AND N.noco_ano <= :ano  AND CONC_COD = :conc_cod AND terc_nit = :nite;
    END
    ELSE
    IF (conc_otroconc = 'S') THEN
    BEGIN
     anosum = CAST(ano AS INTEGER);
     anosum = anosum - 1;
     SELECT SUM (noco_valor) FROM nomina_conceptos n WHERE n.noco_ano = :anosum AND n.conc_cod = :conc_codotroconc AND N.terc_nit = :nite INTO :valor;
     SELECT NOCO_VALOR FROM NOMINA_CONCEPTOS WHERE noco_ano = :anosum AND conc_cod = :conc_codotroconc AND terc_nit = :nite AND NOCO_PERIODO = 0 INTO :saldosini;
     IF (saldosini IS NULL) THEN
     saldosini = 0;
     ELSE
     UPDATE nomina_conceptos SET noco_pagook = 'S' WHERE noco_ano = :anosum AND conc_cod = :conc_codotroconc AND NOCO_PERIODO = 0 AND terc_nit = :nite;
     VALOR = :valor + :saldosini;
     UPDATE nomina_conceptos SET noco_pagook = 'S' WHERE noco_ano = :anosum AND conc_cod = :conc_codotroconc AND terc_nit = :nite;
    END
    ELSE
    IF (conc_aporte = 'S') THEN
    BEGIN
     horasex = NULL;
     diasnov = NULL;
     IF ((:entidad = '' ) OR (entidad IS NULL)) THEN
     BEGIN
      SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
      IF (comision IS NULL) THEN
      comision = 0;
      SELECT C.emco_monto FROM EMPLEADO_CONCEPTOS C WHERE C.terc_nit = :nite AND C.conc_cod = 933 INTO :retroact;
      IF (retroact IS NULL ) THEN
      retroact = 0;
      SELECT N.nono_dura FROM NOMINA_NOVEDADES N WHERE N.terc_nit = :nite AND N.nono_periodo = :periodo AND N.nono_ano = :ano AND (N.tnov_cod = 2 or (N.tnov_cod = 3)) INTO :diasnov;
      IF (:diasnov IS NULL) THEN
      incap = 0;
      ELSE
      incap = (:basico / 30)* :diasnov;
      valor = :basico + :comision + :horasex + :retroact + :incap;
      IF ((conc_cod = 904) OR (conc_cod = 905) OR (conc_cod = 906)) THEN
      BEGIN
       entidad = :nitafp;
       IF (conc_cod = 904) THEN
       BEGIN
        SELECT A.paan_afptr FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
        SELECT N.nono_dura FROM NOMINA_NOVEDADES N WHERE N.terc_nit = :nite AND N.nono_periodo = :periodo AND N.nono_ano = :ano AND (N.tnov_cod = 2 or (N.tnov_cod = 3)) INTO :diasnov;
        IF (:diasnov IS NULL) THEN
        incap = 0;
        ELSE
        incap = (:basico / 30)* :diasnov;
        SELECT c.noex_monto FROM nomina_horasext c WHERE c.noex_ano = :ano AND c.noex_periodio = :periodo AND c.noex_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :horasex;
        IF (horasex IS NOT NULL) THEN
        VALOR = (((((:basico )/30 * :diaslab ) + :comision + :horasex + :retroact+ :incap)+ :cambsaltrans ) * :PORCEN) /100;
        ELSE
        VALOR = ((((:basico)/30 * :diaslab ) + :comision + :retroact+ :cambsaltrans  + :incap) * :PORCEN) /100;
       END
       ELSE
       IF ((conc_cod = 905) OR (conc_cod = 906)) THEN
       BEGIN
        SELECT A.paan_afpem FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
        SELECT N.nono_dura FROM NOMINA_NOVEDADES N WHERE N.terc_nit = :nite AND N.nono_periodo = :periodo AND N.nono_ano = :ano AND (N.tnov_cod = 2 or (N.tnov_cod = 3)) INTO :diasnov;
        IF (:diasnov IS NULL) THEN
        incap = 0;
        ELSE
        incap = (:basico / 30)* :diasnov;
        SELECT c.noex_monto FROM nomina_horasext c WHERE c.noex_ano = :ano AND c.noex_periodio = :periodo AND c.noex_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :horasex;
        IF (horasex IS NOT NULL) THEN
        VALOR = (((((:basico )/30 * :diaslab ) + :comision + :horasex + :retroact)+ :cambsaltrans + :incap) * :PORCEN) /100;
        ELSE
        VALOR = (((((:basico )/30 * :diaslab ) + :comision + :retroact)+ :cambsaltrans + :incap) * :PORCEN) /100;
       END
      END
      ELSE
      IF ((conc_cod = 907) OR (conc_cod = 914) OR (conc_cod = 915)) THEN
      BEGIN
       entidad = :niteps;
       IF (conc_cod = 907) THEN
       BEGIN
        SELECT A.paan_epstr FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
        SELECT N.nono_dura FROM NOMINA_NOVEDADES N WHERE N.terc_nit = :nite AND N.nono_periodo = :periodo AND N.nono_ano = :ano AND (N.tnov_cod = 2 or (N.tnov_cod = 3)) INTO :diasnov;
        IF (:diasnov IS NULL) THEN
        incap = 0;
        ELSE
        incap = (:basico / 30)* :diasnov;
        SELECT c.noex_monto FROM nomina_horasext c WHERE c.noex_ano = :ano AND c.noex_periodio = :periodo AND c.noex_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :horasex;
        IF (horasex IS NOT NULL) THEN
        VALOR = (((((:basico )/30 * :diaslab ) + :comision + :horasex + :retroact)+ :cambsaltrans + :incap) * :PORCEN) /100;
        ELSE
        VALOR = (((((:basico )/30 * :diaslab ) + :comision + :retroact)+ :cambsaltrans + :incap) * :PORCEN) /100;
       END
       ELSE
       IF ((conc_cod = 914) OR (conc_cod = 915)) THEN
       BEGIN
        SELECT A.paan_epsem FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
        SELECT N.nono_dura FROM NOMINA_NOVEDADES N WHERE N.terc_nit = :nite AND N.nono_periodo = :periodo AND N.nono_ano = :ano AND (N.tnov_cod = 2 or (N.tnov_cod = 3)) INTO :diasnov;
        IF (:diasnov IS NULL) THEN
        incap = 0;
        ELSE
        incap = (:basico / 30)* :diasnov;
        SELECT c.noex_monto FROM nomina_horasext c WHERE c.noex_ano = :ano AND c.noex_periodio = :periodo AND c.noex_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :horasex;
        IF (horasex IS NOT NULL) THEN
        VALOR = (((((:basico )/30 * :diaslab ) + :comision + :horasex + :retroact)+ :cambsaltrans + :incap) * :PORCEN) /100;
        ELSE
        VALOR = (((((:basico )/30 * :diaslab ) + :comision + :retroact)+ :cambsaltrans + :incap) * :PORCEN) /100;
       END
      END
      ELSE
      IF ((conc_cod = 910) OR (conc_cod = 911) OR (conc_cod = 916) OR (conc_cod = 917) OR (conc_cod = 918) OR (conc_cod = 919)) THEN
      BEGIN
       entidad = :nitccf;
       SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
       IF (comision IS NULL) THEN
       comision = 0;
       SELECT N.nono_dura FROM NOMINA_NOVEDADES N WHERE N.terc_nit = :nite AND N.nono_periodo = :periodo AND N.nono_ano = :ano AND (N.tnov_cod = 2 or (N.tnov_cod = 3)) INTO :diasnov;
       IF (:diasnov IS NULL) THEN
       incap = 0;
       ELSE
       incap = (:basico / 30)* :diasnov;
       IF ((conc_cod = 910) OR (conc_cod = 911) ) THEN
       BEGIN
        SELECT A.paan_ccf FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
      SELECT N.nono_dura FROM NOMINA_NOVEDADES N WHERE N.terc_nit = :nite AND N.nono_periodo = :periodo AND N.nono_ano = :ano AND (N.tnov_cod = 2 or (N.tnov_cod = 3)) INTO :diasnov;
      IF (:diasnov IS NULL) THEN
      incap = 0;
      ELSE
      incap = (:basico / 30)* :diasnov;
        SELECT c.noex_monto FROM nomina_horasext c WHERE c.noex_ano = :ano AND c.noex_periodio = :periodo AND c.noex_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :horasex;
        IF (horasex IS NOT NULL) THEN
        VALOR = (((((:basico )/30 * :diaslab ) + :comision + :horasex + :retroact)+ :cambsaltrans + :incap) * :PORCEN) /100;
        ELSE
        VALOR = (((((:basico )/30 * :diaslab ) + :comision + :retroact)+ :cambsaltrans + :incap) * :PORCEN) /100;
       END
       ELSE
       IF ((conc_cod = 916) OR (conc_cod = 917)) THEN
       BEGIN
        SELECT A.paan_icbf FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
      SELECT N.nono_dura FROM NOMINA_NOVEDADES N WHERE N.terc_nit = :nite AND N.nono_periodo = :periodo AND N.nono_ano = :ano AND (N.tnov_cod = 2 or (N.tnov_cod = 3)) INTO :diasnov;
      IF (:diasnov IS NULL) THEN
      incap = 0;
      ELSE
      incap = (:basico / 30)* :diasnov;
      SELECT N.nono_dura FROM NOMINA_NOVEDADES N WHERE N.terc_nit = :nite AND N.nono_periodo = :periodo AND N.nono_ano = :ano AND (N.tnov_cod = 2 or (N.tnov_cod = 3)) INTO :diasnov;
      IF (:diasnov IS NULL) THEN
      incap = 0;
      ELSE
      incap = (:basico / 30)* :diasnov;
        SELECT c.noex_monto FROM nomina_horasext c WHERE c.noex_ano = :ano AND c.noex_periodio = :periodo AND c.noex_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :horasex;
        IF (horasex IS NOT NULL) THEN
        VALOR = (((((:basico )/30 * :diaslab ) + :comision + :horasex + :retroact)+ :cambsaltrans + :incap) * :PORCEN) /100;
        ELSE
        VALOR = (((((:basico )/30 * :diaslab ) + :comision + :retroact)+ :cambsaltrans + :incap) * :PORCEN) /100;
       END
       ELSE
       IF ((conc_cod = 918) OR (conc_cod = 919)) THEN
       BEGIN
        SELECT A.paan_sena FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
      SELECT N.nono_dura FROM NOMINA_NOVEDADES N WHERE N.terc_nit = :nite AND N.nono_periodo = :periodo AND N.nono_ano = :ano AND (N.tnov_cod = 2 or (N.tnov_cod = 3)) INTO :diasnov;
      IF (:diasnov IS NULL) THEN
      incap = 0;
      ELSE
      incap = (:basico / 30)* :diasnov;
        SELECT c.noex_monto FROM nomina_horasext c WHERE c.noex_ano = :ano AND c.noex_periodio = :periodo AND c.noex_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :horasex;
        IF (horasex IS NOT NULL) THEN
        VALOR = (((((:basico )/30 * :diaslab ) + :comision + :horasex + :retroact)+ :cambsaltrans + :incap) * :PORCEN) /100;
        ELSE
        VALOR = (((((:basico )/30 * :diaslab ) + :comision + :retroact)+ :cambsaltrans + :incap) * :PORCEN) /100;
       END
      END
      ELSE
      IF ((conc_cod = 912) OR (conc_cod = 913)) THEN
      BEGIN
       entidad = :nitafc;
       SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
       IF (comision IS NULL) THEN
       comision = 0;
      SELECT N.nono_dura FROM NOMINA_NOVEDADES N WHERE N.terc_nit = :nite AND N.nono_periodo = :periodo AND N.nono_ano = :ano AND (N.tnov_cod = 2 or (N.tnov_cod = 3)) INTO :diasnov;
      IF (:diasnov IS NULL) THEN
      incap = 0;
      ELSE
      incap = (:basico / 30)* :diasnov;
       IF ((conc_cod = 912) OR (conc_cod = 913) ) THEN
       BEGIN
        SELECT A.paan_cesemp FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
        SELECT c.noex_monto FROM nomina_horasext c WHERE c.noex_ano = :ano AND c.noex_periodio = :periodo AND c.noex_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :horasex;
        IF (horasex IS NOT NULL) THEN
        VALOR = (((((:basico )/30 * :diaslab ) + :comision + :horasex + :retroact)+ :cambsaltrans + :incap) * :PORCEN) /100;
        ELSE
        VALOR = (((((:basico )/30 * :diaslab ) + :comision + :retroact)+ :cambsaltrans + :incap) * :PORCEN) /100;
       END
      END
      ELSE
      BEGIN
       IF (comision IS NULL) THEN
       comision = 0;
       SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
       conc_monto = :basico + :comision;
       IF (conc_porc <> 0 AND conc_porc IS NOT NULL) THEN
       VALOR = (((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans + :incap) * :conc_porc) /100;
       ELSE
       IF (:porcen <> 0 AND :porcen IS NOT NULL) THEN
       VALOR = (((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans + :incap) * :porcen) /100;
       ELSE
       IF (:montos <> 0 AND :montos IS NOT NULL) THEN
       valor = :montos;
       ELSE
       IF (:conc_monto <> 0 AND :conc_monto IS NOT NULL) THEN
       valor = :conc_monto;
      END
     END
     item = :item + 1;
    END
    ELSE
    IF (conc_prov = 'S') THEN
    BEGIN
     conc_monto = :basico;
     IF (conc_porc <> 0 AND conc_porc IS NOT NULL) THEN
     VALOR = (((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans + :incap) * :conc_porc) /100;
     ELSE
     IF (porcen <> 0 AND porcen IS NOT NULL) THEN
     VALOR = (((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans + :incap) * :porcen) /100;
     ELSE
     IF (montos <> 0 AND montos IS NOT NULL) THEN
     VALOR = :montos;
     ELSE
     IF (conc_monto <> 0 AND conc_monto IS NOT NULL) THEN
     VALOR = :conc_monto;
     item = :item + 1;
    END
    ELSE
    IF (conc_cod = 920) THEN
    BEGIN
     SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :valor;
     IF (valor IS NULL) THEN
     valor = 0;
     item = :item + 1;
    END
    ELSE
    IF (conc_cod = 900 OR (:conc_cod = 931)) THEN
    BEGIN
     SELECT c.noex_monto FROM nomina_horasext c WHERE c.noex_ano = :ano AND c.noex_periodio = :periodo AND c.noex_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :valor;
     IF (valor IS NULL) THEN
     valor = 0;
     item = :item + 1;
    END
    ELSE
    IF (conc_cod = 932) THEN
    BEGIN
     SELECT N.nono_dura FROM NOMINA_NOVEDADES N WHERE N.terc_nit = :nite AND N.nono_periodo = :periodo AND N.nono_ano = :ano AND (N.tnov_cod = 2 or (N.tnov_cod = 3)) INTO :diasnov;
     IF (:diasnov IS NULL) THEN
     valor = 0;
     ELSE
     valor = (:basico / 30)* :diasnov;
    END
    ELSE
    IF (conc_cod = 921) THEN
    BEGIN
     IF (porcen IS NOT NULL AND porcen <> 0) THEN
     valor = ((basico / 30)* :diaslab ) * :PORCEN /100;
     ELSE
     IF (conc_porc IS NOT NULL AND conc_porc <> 0) THEN
     valor = ((basico / 30)* :diaslab ) * :conc_porc /100;
    END
    EXECUTE PROCEDURE LEE_CONFIGURACION('NOMINA','GENERAL','REDONDEO AL MULTIPLO DE DIEZ EN TOTALES')RETURNING_VALUES(:aprox);
    EXECUTE PROCEDURE REDONDEE(:valor, :aprox) RETURNING_VALUES (VALOR);
    IF ((mensual = 'N') OR (periodicidad = 1))  THEN
    INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
    VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
    ELSE
    IF (mensual = 'S') THEN
    BEGIN
     IF ((:periodicidad = 2) AND (liquidaper = 1)) THEN
     BEGIN
      IF ((periodo = 1) OR (periodo = 3) OR (periodo = 5) OR (periodo = 7) OR (periodo = 9) OR (periodo = 11)
      OR (periodo = 13) OR (periodo = 15) OR (periodo = 17) OR (periodo = 19) OR (periodo = 21) OR (periodo = 23)) THEN
      INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
      VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
     END
     ELSE
     IF ((:periodicidad = 2) AND (liquidaper = 2)) THEN
     BEGIN
      IF ((periodo = 2) OR (periodo = 4) OR (periodo = 6) OR (periodo = 8) OR (periodo = 10) OR (periodo = 12)
      OR (periodo = 14) OR (periodo = 16) OR (periodo = 18) OR (periodo = 20) OR (periodo = 22) OR (periodo = 24)) THEN
      INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
      VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
     END
     ELSE
     IF ((:periodicidad = 3) AND (liquidaper = 1)) THEN
     BEGIN
      IF ((periodo = 1) OR (periodo = 5) OR (periodo = 9) OR (periodo = 13) OR (periodo = 17) OR (periodo = 21)
      OR (periodo = 25) OR (periodo = 29) OR (periodo = 33) OR (periodo = 37) OR (periodo = 41) OR (periodo = 45)
      OR (periodo = 49)) THEN
      INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
      VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
    END
    ELSE
     IF ((:periodicidad = 3) AND (liquidaper = 2)) THEN
     BEGIN
      IF ((periodo = 2) OR (periodo = 6) OR (periodo = 10) OR (periodo = 14) OR (periodo = 18) OR (periodo = 22)
      OR (periodo = 26) OR (periodo = 30) OR (periodo = 34) OR (periodo = 38) OR (periodo = 42) OR (periodo = 46)
      OR (periodo = 50)) THEN
      INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
      VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
     END
     ELSE
     IF ((:periodicidad = 3) AND (liquidaper = 3)) THEN
     BEGIN
      IF ((periodo = 3) OR (periodo = 7) OR (periodo = 11) OR (periodo = 15) OR (periodo = 19) OR (periodo = 23)
      OR (periodo = 27) OR (periodo = 31) OR (periodo = 35) OR (periodo = 39) OR (periodo = 43) OR (periodo = 47)
      OR (periodo = 51)) THEN
      INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
      VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
     END
     ELSE
     IF ((:periodicidad = 3) AND (liquidaper = 4)) THEN
     BEGIN
      IF ((periodo = 4) OR (periodo = 8) OR (periodo = 12) OR (periodo = 16) OR (periodo = 20) OR (periodo = 24)
      OR (periodo = 29) OR (periodo = 32) OR (periodo = 36) OR (periodo = 40) OR (periodo = 44) OR (periodo = 48)
      OR (periodo = 52)) THEN
      INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
      VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
     END
    END
  VALOR = 0;
  basico = 0;
   END
  END
 END
 SUSPEND;
END

^

SET TERM ; ^

SET TERM ^ ;

ALTER TRIGGER NOMINA_DETALLE_BI
as
declare variable PERIODO integer;
declare variable FEC DATE;
begin
SELECT N.nomi_periodo,N.nomi_feccausa FROM NOMINA N WHERE N.nomi_id = NEW.nomi_id INTO :periodo,:fec;
EXECUTE PROCEDURE DIAS_LABORADOS(NEW.terc_nit,:periodo,:fec,'N','N')returning_values(NEW.node_diaslab);
end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER PROCEDURE IMPR_PLANILLA_NOMINA(
    ID INTEGER,
    PAGO CHAR(1),
    CTA CHAR(1),
    EMPL CHAR(1))
RETURNS (
    FECHA DATE,
    OBSERVACIONES BLOB SUB_TYPE 0 SEGMENT SIZE 80,
    PAGOGLOBAL CHAR(1),
    PERIODO INTEGER,
    ANO CHAR(4),
    PERIODICIDAD VARCHAR(60),
    NITEMPL VARCHAR(20),
    VALOR NUMERIC(18,2),
    DEDUC CHAR(1),
    NOMBREEMPL VARCHAR(60),
    NOMCORTCONC VARCHAR(60),
    NOMBRECONC VARCHAR(60),
    CODCONC INTEGER,
    PROV CHAR(1),
    TOTALEMPL NUMERIC(18,2),
    TOTALDEDUC NUMERIC(18,2),
    TOTALDEVENG NUMERIC(18,2),
    NUMEMPL INTEGER,
    CTAEMPL VARCHAR(25),
    TOTALCTAS NUMERIC(18,2),
    TOTALNOMI NUMERIC(18,2),
    TOTALAPOR NUMERIC(18,2),
    NOMPER VARCHAR(60),
    ORG INTEGER,
    CARGOEMPL VARCHAR(60),
    DEPTOEMPL VARCHAR(60),
    NUMCOP INTEGER,
    NOMBRE_COPIA VARCHAR(60),
    DIASLAB INTEGER,
    SALARIO NUMERIC(18,2))
AS
DECLARE VARIABLE NITANT VARCHAR(20);
DECLARE VARIABLE nitnue VARCHAR(20);
DECLARE VARIABLE NUMCONC INTEGER;
DECLARE VARIABLE TOTALNOMINEG NUMERIC(18,2);
DECLARE VARIABLE TOTALAPORNEG NUMERIC(18,2);
DECLARE VARIABLE PAR INTEGER;
DECLARE VARIABLE IMPAR INTEGER;
DECLARE VARIABLE ANTDEDUC CHAR(1);
DECLARE VARIABLE nitdeduc VARCHAR(20);
DECLARE VARIABLE NITTOT VARCHAR(20);
BEGIN
 SELECT N.nuco_copia FROM NUMERO_COPIA N WHERE N.tido_cod = 92 AND N.nuco_id = :id INTO :NUMCOP;
 IF (numcop IS NULL) THEN
 BEGIN
  numcop = 0;
  INSERT INTO NUMERO_COPIA (TIDO_COD, NUCO_ID, NUCO_COPIA) VALUES (92,:id,:numcop);
 END
 ELSE
 BEGIN
  numcop = :numcop + 1;
  UPDATE numero_copia N SET N.nuco_copia = :numcop WHERE N.tido_cod = 92 AND N.nuco_id = :id;
 END
 SELECT N.noco_nombre FROM nombres_copias N WHERE N.noco_id = :numcop INTO :nombre_copia;
 numempl = 0;
 nitant = 0;
 nitnue = 0;
 IF (PAGO = 'N') THEN
 BEGIN
  FOR SELECT N.nomi_feccausa, N.nomi_obs, N.nomi_pagoglobal, N.nomi_periodo, N.nomi_ano, P.ppag_nombre, PN.pnom_nombre FROM NOMINA N, periodo_pago P, periodo_pago_nombre PN
  WHERE P.ppag_cod = N.nomi_periodocidad AND N.nomi_id = :ID AND PN.ppag_cod = N.nomi_periodocidad AND PN.ppag_periodo = N.nomi_periodo
  INTO :fecha, :observaciones, :pagoglobal, :periodo, :ano, :periodicidad, :NOMPER
  DO
  BEGIN
   FOR SELECT NC.terc_nit, NC.noco_valor, NC.noco_deduc, T.terc_nom, C.conc_nomcorto, C.conc_nombre, NC.conc_cod, NC.noco_prov, E.empl_cargo FROM NOMINA_CONCEPTOS NC, TERCEROS T, EMPLEADOS E, CONCEPTOS_NOMINA C
   WHERE NC.nomi_id = :ID AND T.terc_nit = E.terc_nit AND C.conc_cod = NC.conc_cod AND t.terc_nit = nc.terc_nit
   INTO :nitempl, :valor, :deduc, :nombreempl, :nomcortconc, :nombreconc, :codconc, :prov, :cargoempl
   DO
   BEGIN
    IF (valor IS NULL) THEN
    valor = 0;
    SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND TERC_NIT = :nitempl INTO :totalempl;
    SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND TERC_NIT = :nitempl AND NC.noco_deduc = 'S' INTO :totaldeduc;
    SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND TERC_NIT = :nitempl AND NC.noco_deduc = 'N' INTO :totaldeveng;
    SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id INTO :totalnomi;
    SELECT SUM(NC.noco_valor*-1) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_APORTE = 'S' AND NOCO_VALOR < 0 AND NOMI_ID = :id INTO :totalaporneg;
    SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_APORTE = 'S' AND NOCO_VALOR > 0 AND NOMI_ID = :id INTO :totalapor;
    totalapor = :totalapor + totalaporneg;
    SUSPEND;
   END
   nitempl = '';
   valor = NULL;
   deduc = '';
   nombreempl = NULL;
   nomcortconc = NULL;
   nombreconc = NULL;
   codconc = NULL;
   prov = NULL;
   FOR SELECT MAX(N.conc_cod) FROM NOMINA_CONCEPTOS N WHERE N.nomi_id = :id
   GROUP BY N.conc_cod
   INTO :codconc
   DO
   BEGIN
    SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC
    WHERE NC.nomi_id = :ID AND NC.conc_cod = :codconc
    GROUP BY NC.conc_cod
    INTO :valor;
    nitempl = '';
    nombreempl = '';
    deduc = 'N';
    prov = 'N';
    SELECT C.conc_nombre,C.conc_nomcorto FROM CONCEPTOS_NOMINA C WHERE C.conc_cod = :codconc INTO :nombreconc,:nomcortconc;
    SUSPEND;
   END
  END
 END
 ELSE
 IF (PAGO = 'S') THEN
 BEGIN
  par = 2;
  impar = 1;
  IF (EMPL = 'N') THEN
  BEGIN
     deduc = 'N';
     nomcortconc = 'TOTAL DEV';
     nombreconc = 'TOTAL DEV';
     codconc = 9999;
     prov = 'N';
     valor = NULL;
     nitempl = '';
     nombreempl = '';
     SUSPEND;
     deduc = 'S';
     nomcortconc = 'TOTAL DEDUC';
     nombreconc = 'TOTAL DEDUC';
     codconc = 99999;
     prov = 'N';
     valor = NULL;
     nitempl = '';
     nombreempl = '';
     SUSPEND;
     deduc = 'S';
     nomcortconc = 'TOTAL EMPL';
     nombreconc = 'TOTAL EMPL';
     codconc = 999999;
     prov = 'N';
     valor = NULL;
     nitempl = '';
     nombreempl = '';
     SUSPEND;
  END
  FOR SELECT N.nomi_feccausa, N.nomi_obs, N.nomi_pagoglobal, N.nomi_periodo, N.nomi_ano, P.ppag_nombre, PN.pnom_nombre FROM NOMINA N, periodo_pago P, periodo_pago_nombre PN
  WHERE P.ppag_cod = N.nomi_periodocidad AND N.nomi_id = :ID AND PN.ppag_cod = N.nomi_periodocidad AND PN.ppag_periodo = N.nomi_periodo
  INTO :fecha, :observaciones, :pagoglobal, :periodo, :ano, :periodicidad, :NOMPER
  DO
  BEGIN
    IF (EMPL = 'N') THEN
    BEGIN
     FOR SELECT MAX(N.conc_cod) FROM NOMINA_CONCEPTOS N WHERE N.nomi_id = :id AND N.noco_prov = 'N' AND N.noco_gtoempr = 'N'
     GROUP BY N.conc_cod
     INTO :codconc
     DO
     BEGIN
      SELECT NULL, MAX(NC.noco_deduc) FROM NOMINA_CONCEPTOS NC
      WHERE NC.nomi_id = :ID AND NC.conc_cod = :codconc
      GROUP BY NC.conc_cod
      INTO :valor, :deduc;
      valor = NULL;
      nitempl = '';
      nombreempl = '';
      prov = 'N';
      SELECT C.conc_nombre,C.conc_nomcorto FROM CONCEPTOS_NOMINA C WHERE C.conc_cod = :codconc INTO :nombreconc,:nomcortconc;
      SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id INTO :totalempl;
      SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND NC.noco_deduc = 'S' INTO :totaldeduc;
      SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND NC.noco_deduc = 'N' INTO :totaldeveng;
      SUSPEND;
     END
   END
   FOR SELECT NC.terc_nit, NC.noco_valor, NC.noco_deduc, T.terc_nom, C.conc_nomcorto, C.conc_nombre, NC.conc_cod, NC.noco_prov, E.empl_cargo, D.dpto_nombre, ND.node_diaslab,NC.terc_nit, E.empl_salario
   FROM NOMINA_CONCEPTOS NC, TERCEROS T, EMPLEADOS E, CONCEPTOS_NOMINA C, DEPARTAMENTO D, NOMINA_DETALLE ND
   WHERE NC.nomi_id = :ID AND T.terc_nit = E.terc_nit AND C.conc_cod = NC.conc_cod AND t.terc_nit = nc.terc_nit AND D.dpto_cod = E.empl_dpto AND NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N'
   AND ND.nomi_id = :id AND ND.terc_nit = E.terc_nit
   ORDER BY T.terc_nom
   INTO :nitempl, :valor, :deduc, :nombreempl, :nomcortconc, :nombreconc, :codconc, :prov, :cargoempl,:deptoempl,:diaslab,:nitnue, :salario
   DO
   BEGIN
    IF ((nitnue <> nitant) AND (nitnue IS NOT NULL)) THEN
     numempl = :numempl + 1;
    IF (valor IS NULL) THEN
    valor = 0;
    IF (nitempl <> nitdeduc) THEN
    BEGIN
     par = 2;
     impar = 1;
    END
    nitdeduc = :nitempl;
    IF (:deduc = 'S') THEN
    BEGIN
     antdeduc = 'S';
     org = :par;
     par = :par + 2;
    END
    ELSE
    BEGIN
     antdeduc = 'N';
     org = :impar;
     impar = :impar + 2;
    END
    SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND TERC_NIT = :nitempl INTO :totalempl;
    SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND TERC_NIT = :nitempl AND NC.noco_deduc = 'S' INTO :totaldeduc;
    SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND TERC_NIT = :nitempl AND NC.noco_deduc = 'N' INTO :totaldeveng;
    IF (cta = 'S') THEN
    BEGIN
     SELECT COUNT(CONC_COD) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND TERC_NIT = :nitempl INTO :numconc;
     totalempl = totalempl / :numconc;
     SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND TERC_NIT = :nitempl INTO :totalctas;
    END
    SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id INTO :totalnomi;
    SELECT SUM(NC.noco_valor*-1) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_APORTE = 'S' AND NOCO_VALOR < 0 AND NOMI_ID = :id INTO :totalaporneg;
    SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_APORTE = 'S' AND NOCO_VALOR > 0 AND NOMI_ID = :id INTO :totalapor;
    totalapor = :totalapor + totalaporneg;
   SUSPEND;
    IF ((nitnue <> nitant) AND (nitnue IS NOT NULL) AND (EMPL = 'N')) THEN
    BEGIN
     deduc = 'N';
     nomcortconc = 'TOTAL DEV';
     nombreconc = 'TOTAL DEV';
     codconc = 9999;
     prov = 'N';
     SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND NC.terc_nit = :nitempl INTO :VALOR;
     SUSPEND;
     deduc = 'S';
     nomcortconc = 'TOTAL DEDUC';
     nombreconc = 'TOTAL DEDUC';
     codconc = 99999;
     prov = 'N';
     SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND NC.noco_deduc = 'S' AND NC.terc_nit = :nitempl INTO :VALOR;
     SUSPEND;
     deduc = 'S';
     nomcortconc = 'TOTAL EMPL';
     nombreconc = 'TOTAL EMPL';
     codconc = 999999;
     prov = 'N';
     SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND NC.noco_deduc = 'N' AND NC.terc_nit = : nitempl INTO :VALOR;
     nitant = :nitnue;
     SUSPEND;
    END
   END
   numempl = :numempl + 1;
   IF ( EMPL = 'N') THEN
   BEGIN
    nitempl = '';
    valor = NULL;
    deduc = '';
    nombreempl = NULL;
    nomcortconc = NULL;
    nombreconc = NULL;
    codconc = NULL;
    prov = NULL;
    totalempl = NULL;
    ctaempl = NULL;
    IF (cta = 'N') THEN
    BEGIN
     FOR SELECT MAX(N.conc_cod) FROM NOMINA_CONCEPTOS N WHERE N.nomi_id = :id AND N.noco_prov = 'N' AND N.noco_gtoempr = 'N'
     GROUP BY N.conc_cod
     INTO :codconc
     DO
     BEGIN
      SELECT SUM(NC.noco_valor), MAX(NC.noco_deduc) FROM NOMINA_CONCEPTOS NC
      WHERE NC.nomi_id = :ID AND NC.conc_cod = :codconc
      GROUP BY NC.conc_cod
      INTO :valor, :deduc;
      nitempl = '-';
      nombreempl = 'TOTAL';
      prov = 'N';
      SELECT C.conc_nombre,C.conc_nomcorto FROM CONCEPTOS_NOMINA C WHERE C.conc_cod = :codconc INTO :nombreconc,:nomcortconc;
      SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id INTO :totalempl;
      SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND NC.noco_deduc = 'S' INTO :totaldeduc;
      SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND NC.noco_deduc = 'N' INTO :totaldeveng;
      SUSPEND;
     END
     deduc = 'N';
     nomcortconc = 'TOTAL DEV';
     nombreconc = 'TOTAL DEV';
     codconc = 9999;
     prov = 'N';
     SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id INTO :VALOR;
     nitempl = '-';
     nombreempl = 'TOTAL';
     SUSPEND;
     deduc = 'S';
     nomcortconc = 'TOTAL DEDUC';
     nombreconc = 'TOTAL DEDUC';
     codconc = 99999;
     prov = 'N';
     SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND NC.noco_deduc = 'S' INTO :VALOR;
     nitempl = '-';
     nombreempl = 'TOTAL';
     SUSPEND;
     deduc = 'S';
     nomcortconc = 'TOTAL EMPL';
     nombreconc = 'TOTAL EMPL';
     codconc = 999999;
     prov = 'N';
     SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND NC.noco_deduc = 'N' INTO :VALOR;
     nitempl = '-';
     nombreempl = 'TOTAL';
     SUSPEND;
    END
   END
  END
 END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER PROCEDURE ARCHIVO_BANCO(
    IDDOC INTEGER,
    FECHA DATE)
RETURNS (
    DATOS VARCHAR(591))
AS
DECLARE VARIABLE dat VARCHAR(60);
declare variable NOMBREEMPL VARCHAR(60);
declare variable NUMDOCID VARCHAR(20);
declare variable CUENTAEMPL VARCHAR(25);
declare variable BANCO INTEGER;
declare variable tipocta char(1);
BEGIN
datos = '';
dat = '1';
datos = :datos || :dat;
EXECUTE PROCEDURE lee_configuracion('CONTABILIDAD','GENERAL','NIT COMPAÑIA')returning_values (:dat);
EXECUTE PROCEDURE ceros_ancho_fijo(:dat,10,'N')returning_values(:dat);
datos = :datos || :dat;
dat = '';
EXECUTE PROCEDURE lee_configuracion('GENERAL','GENERAL','NOMBRE COMPAÑIA')returning_values (:dat);
EXECUTE PROCEDURE ceros_ancho_fijo(:dat,16,'A')returning_values(:dat);
datos = :datos || :dat;
dat = '225';
datos = :datos || :dat;
dat = 'NOMINA';
EXECUTE PROCEDURE ceros_ancho_fijo(:dat,10,'A')returning_values(:dat);
datos = :datos || :dat;
dat = substr(:fecha,3,4)|| substr(:fecha,6,7) || substr(:fecha,9,10);
datos = :datos || :dat;
dat = 'B';
datos = :datos || :dat;
dat = substr(:fecha,3,4)|| substr(:fecha,6,7) || substr(:fecha,9,10);
datos = :datos || :dat;
SELECT COUNT(NOMI_ID) FROM NOMINA_DETALLE WHERE NOMI_ID = :iddoc INTO :dat;
EXECUTE PROCEDURE ceros_ancho_fijo(:dat,6,'N')returning_values(:dat);
datos = :datos || :dat;
dat = '000000000000';
datos = :datos || :dat;
SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :iddoc INTO :dat;
dat = substr(:dat,1,strlen(:dat)-3);
EXECUTE PROCEDURE ceros_ancho_fijo(:dat,12,'N')returning_values(:dat);
datos = :datos || :dat;
EXECUTE PROCEDURE lee_configuracion('NOMINA', 'GENERAL', 'NUMERO DE CUENTA DEL BANCO')returning_values (:dat);
EXECUTE PROCEDURE ceros_ancho_fijo(:dat,11,'N')returning_values(:dat);
datos = :datos || :dat;
EXECUTE PROCEDURE lee_configuracion('NOMINA', 'GENERAL', 'TIPO CUENTA')returning_values (:dat);
EXECUTE PROCEDURE ceros_ancho_fijo(:dat,1,'A')returning_values(:dat);
datos = :datos || :dat;
  SUSPEND;
datos = '';
FOR SELECT D.terc_nit, T.terc_nom, E.empl_cuenta, E.empl_banco, e.empl_tipocta FROM empleados E, NOMINA_DETALLE D, TERCEROS T WHERE D.terc_nit = E.terc_nit AND T.terc_nit = E.terc_nit AND D.nomi_id = :iddoc AND E.empl_formpago = 'B'
INTO :numdocid, :nombreempl, :cuentaempl, :banco, :tipocta
DO
BEGIN
dat = '6';
datos = :datos || :dat;
dat = :numdocid;
EXECUTE PROCEDURE ceros_ancho_fijo(:dat,15,'N')returning_values(:dat);
datos = :datos || :dat;
dat = :nombreempl;
EXECUTE PROCEDURE ceros_ancho_fijo(:dat,18,'A')returning_values(:dat);
datos = :datos || :dat;
SELECT B.banc_codach FROM BANCOS B WHERE B.banc_cod = :banco INTO :dat;
EXECUTE PROCEDURE ceros_ancho_fijo(:dat,9,'N')returning_values(:dat);
datos = :datos || :dat;
dat = :cuentaempl;
EXECUTE PROCEDURE ceros_ancho_fijo(:dat,17,'N')returning_values(:dat);
datos = :datos || :dat;
dat = 'S';
datos = :datos || :dat;
if (:tipocta = 'C') then
dat=  '27';
ELSE
if (:tipocta = 'A') then
dat=  '37';
datos = :datos || :dat;
SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NC.terc_nit = :numdocid AND NOMI_ID = :iddoc INTO :dat;
dat = substr(:dat,1,strlen(:dat)-3);
EXECUTE PROCEDURE ceros_ancho_fijo(:dat,10,'N')returning_values(:dat);
datos = :datos || :dat;
dat = 'NOMINA';
EXECUTE PROCEDURE ceros_ancho_fijo(:dat,9,'A')returning_values(:dat);
datos = :datos || :dat;
if (substr(:fecha,6,7) = '01') then
dat= 'ENERO';
ELSE
if (substr(:fecha,6,7) = '02') then
dat= 'FEBRERO';
ELSE
if (substr(:fecha,6,7) = '03') then
dat= 'MARZO';
ELSE
if (substr(:fecha,6,7) = '04') then
dat= 'ABRIL';
ELSE
if (substr(:fecha,6,7) = '05') then
dat= 'MAYO';
ELSE
if (substr(:fecha,6,7) = '06') then
dat= 'JUNIO';
ELSE
if (substr(:fecha,6,7) = '07') then
dat= 'JULIO';
ELSE
if (substr(:fecha,6,7) = '08') then
dat= 'AGOSTO';
ELSE
if (substr(:fecha,6,7) = '09') then
dat= 'SEPTIEMBRE';
ELSE
if (substr(:fecha,6,7) = '10') then
dat= 'OCTUBRE';
if (substr(:fecha,6,7) = '11') then
dat= 'NOVIEMBRE';
ELSE
if (substr(:fecha,6,7) = '12') then
dat= 'DICIEMBRE';
EXECUTE PROCEDURE ceros_ancho_fijo(:dat,12,'A')returning_values(:dat);
datos = :datos || :dat;
dat= ' ';
datos = :datos || :dat;
SUSPEND;
datos = '';
END
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER TRIGGER nomina_ad
active after delete position 0
AS
declare variable consec INTEGER;
BEGIN
/* borre la contabilización */
select enco_consec from comprobante_encabezado where enco_tiporef = 92 and enco_idref = old.nomi_id INTO :consec;
if (NOT consec is null) then
  delete from comprobante_detalle where enco_consec = :consec;
  delete from comprobante_encabezado where enco_tiporef = 92 and enco_idref = OLD.nomi_id;

  delete from consolidado_nomina  where cono_tipoori = 92 and cono_idori = OLD.nomi_id;

  INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
    VALUES (USER, 92, OLD.nomi_id, 'D', OLD.nomi_ano || OLD.nomi_periodo);

end
^

SET TERM ; ^

UPDATE REVISION R SET R.REVI_NOMINA = '2009/04/14';
SET TERM ^ ;

CREATE OR ALTER PROCEDURE DIAS_LABORADOS(
    NITEMPL VARCHAR(20),
    PERIODO INTEGER,
    FEC DATE,
    MENSUAL CHAR(1),
    APORTE CHAR(1))
RETURNS (
    TOTALDIASLAB INTEGER)
AS
DECLARE VARIABLE diasnolab INTEGER;
DECLARE VARIABLE diaslabxper INTEGER;
DECLARE VARIABLE perpago INTEGER;
DECLARE VARIABLE fecing DATE;
DECLARE VARIABLE diasfec INTEGER;
DECLARE VARIABLE diasing INTEGER;
DECLARE VARIABLE existe CHAR(1);
BEGIN
SELECT E.empl_ppago, E.empl_fecing
FROM EMPLEADOS E WHERE TERC_NIT = :nitempl
INTO :perpago, :fecing;
IF (mensual = 'N') THEN
BEGIN
IF (perpago = 1) THEN
diaslabxper = 30;
ELSE
IF (perpago = 2) THEN
diaslabxper = 15;
ELSE
IF (perpago = 3) THEN
diaslabxper = 7;
END
ELSE
diaslabxper = 30;
if (perpago = 2) then
BEGIN
IF (SUBSTR(fecing,1,7) = SUBSTR(FEC,1,7)) THEN
BEGIN
diasfec = CAST(substr(fec,9,10) AS INTEGER);
diasing = CAST(substr(fecing,9,10) AS INTEGER);
diaslabxper = diasfec - diasing;
IF ((diaslabxper > 15) AND (perpago = 2)) THEN
diaslabxper = 15;
END
END
ELSE
if (perpago = 1) then
BEGIN
IF (SUBSTR(fecing,1,7) = SUBSTR(FEC,1,7)) THEN
BEGIN
diasfec = CAST(substr(fec,9,10) AS INTEGER);
diasing = CAST(substr(fecing,9,10) AS INTEGER);
diaslabxper = diasfec - diasing;
IF ((diaslabxper > 30) AND (perpago = 1)) THEN
diaslabxper = 30;
END
END
SELECT 'S' FROM nomina_novedades WHERE TERC_NIT = :nitempl AND (TNOV_COD = 9 or (tnov_cod = 2) or (tnov_cod = 3) or (tnov_cod = 6)) AND NONO_PERIODO = :periodo
INTO :existe;
IF ((aporte = 'N' ) OR (:existe = 'S'))  THEN
BEGIN
SELECT SUM (NONO_DURA)
FROM nomina_novedades WHERE TERC_NIT = :nitempl AND (TNOV_COD = 9 OR (TNOV_COD = 6) OR (TNOV_COD = 2) OR (TNOV_COD =3) OR (TNOV_COD = 4)  ) AND NONO_PERIODO = :periodo
INTO :diasnolab;
totaldiaslab =  :diaslabxper - :diasnolab;
END
IF (totaldiaslab IS NULL) THEN
totaldiaslab =  :diaslabxper;
SUSPEND;
END
^

SET TERM ; ^


SET TERM ^ ;

CREATE OR ALTER PROCEDURE CAUSA_NOMINA(
    FEC DATE,
    PERIODO INTEGER,
    PERIODICIDAD INTEGER,
    PAGOGLOBAL CHAR(1),
    ANO CHAR(4))
RETURNS (
    IDNOMINA INTEGER)
AS
declare variable item integer;
declare variable nite varchar(20) character set none;
declare variable nit_tercero varchar(20);
declare variable concept integer;
declare variable montos numeric(18,2);
declare variable porcen numeric(9,4);
declare variable entidad varchar(20);
declare variable conc_cod integer;
declare variable conc_deduc char(1);
declare variable conc_porc numeric(9,4);
declare variable conc_entidad integer;
declare variable conc_monto numeric(18,2);
declare variable conc_modifi char(1);
declare variable conc_promedio char(1);
declare variable emco_perprom integer;
declare variable valor numeric(18,2);
declare variable diaslab integer;
declare variable conc_prov char(1);
declare variable conc_aporte char(1);
declare variable numeroprom integer;
declare variable conc_aplicaprom char(1);
declare variable perinicial integer;
declare variable anoprom integer;
declare variable conc_dias char(1);
declare variable conc_otroconc char(1);
declare variable conc_codotroconc integer;
declare variable anosum integer;
declare variable salario char(1) character set none;
declare variable liquidaper integer;
declare variable rmod numeric(2,2);
declare variable basico numeric(18,2);
declare variable niteps varchar(20);
declare variable nitafc varchar(20);
declare variable nitafp varchar(20);
declare variable nitccf varchar(20);
declare variable gtoempr char(1);
declare variable comision numeric(18,2);
declare variable cambsaltrans numeric(18,2);
declare variable saldosini numeric(18,2);
declare variable duranov integer;
declare variable base numeric(18,2);
declare variable aprox integer;
declare variable mensual char(1);
declare variable horasex numeric(18,2);
declare variable diasnov integer;
declare variable tomasal integer;
declare variable retroact numeric(18,2);
declare variable incap numeric(18,2);
BEGIN
 EXECUTE PROCEDURE cambie_id_nomina RETURNING_VALUES(:idnomina);
 INSERT INTO nomina (nomi_id, NOMI_FECCAUSA, NOMI_PAGOGLOBAL, NOMI_PERIODOCIDAD, NOMI_PERIODO, NOMI_ANO, NOMI_LIQOK)
 VALUES (:IDNOMINA, :fec,:pagoglobal, :periodicidad, :periodo, :ano, 'N');
/* fec = substr(fec,1,8) || (CAST(substr(fec,9,10) AS INTEGER)+1);
*/ item = 1;
 FOR SELECT E.TERC_NIT, E.empl_salario, e.empl_eps, e.empl_afc, e.empl_afp, e.empl_ccf
 FROM EMPLEADOS E
 WHERE E.empl_ppago = :periodicidad AND E.empl_fecret IS NULL
 INTO :nite, :basico, :niteps, :nitafc, :nitafp, :nitccf
 DO
 BEGIN
  FOR SELECT CE.TERC_NIT, CE.CONC_COD, CE.EMCO_MONTO, CE.EMCO_PORC, ce.empl_entidad, CE.emco_perprom, CE.emco_luquidaper, CE.emco_mensual, CN.CONC_COD, CN.CONC_DEDUC,CN.CONC_PORC, CN.CONC_ENTIDAD, CN.CONC_MONTO,  CN.CONC_DIAS, CN.CONC_MODIFI,
  CN.CONC_PROMEDIO, CN.conc_salario, CE.emco_perprom, CN.conc_prov, CN.conc_aporte, CN.conc_aplicaprom, cn.conc_otroconc, cn.conc_codotroconc, CN.conc_gtoempr, CN.conc_base, CE.emco_tomsal
  FROM empleado_conceptos CE, CONCEPTOS_NOMINA CN WHERE ((CE.terc_nit = :nite) AND (CE.CONC_COD = CN.CONC_COD) AND (CE.emco_fecini <= :fec AND CE.emco_fecfin >= :FEC) ) OR ((CE.terc_nit = :nite)
  AND (CE.CONC_COD = CN.CONC_COD) AND (cn.conc_todosper = 'N') AND (CE.emco_ppago = :periodo)) OR  ((CE.terc_nit = :nite) AND (CE.CONC_COD = CN.CONC_COD) AND cn.conc_todosper = 'S')  ORDER BY (TERC_NIT )
  INTO :nit_tercero, :concept,  :montos, :porcen, :entidad, :numeroprom, :liquidaper, :mensual ,:CONC_COD, :CONC_DEDUC, :CONC_PORC,
  :CONC_ENTIDAD, :CONC_MONTO, :CONC_DIAS, :CONC_MODIFI,:CONC_PROMEDIO, :salario,:EMCO_PERPROM, :conc_prov, :conc_aporte , :CONC_APLICAPROM, :conc_otroconc, :conc_codotroconc, :gtoempr, :base, :tomasal
  DO
  BEGIN
   IF (conc_dias = 'S') THEN
   EXECUTE PROCEDURE DIAS_LABORADOS (:nite, :periodo, :fec, :mensual,:conc_aporte) RETURNING_VALUES (:diaslab);
   ELSE
   BEGIN
    diaslab = 15;
    IF (mensual = 'S') THEN
    BEGIN
     IF (periodicidad = 2) THEN
     diaslab = 30;
     ELSE
     IF (liquidaper = 3) THEN
     diaslab = 30;
    END
   END
   IF (:tomasal <> 0) THEN
   BEGIN
    IF ((:periodicidad = 2) AND (:tomasal <> 2)) THEN
    BEGIN
     IF ((periodo = 2) OR (periodo = 4) OR (periodo = 6) OR (periodo = 8) OR (periodo = 10) OR (periodo = 12)
     OR (periodo = 14) OR (periodo = 16) OR (periodo = 18) OR (periodo = 20) OR (periodo = 22) OR (periodo = 24)) THEN
     basico = 0;
    END
    ELSE
    IF ((:periodicidad = 3) AND (:tomasal <> 1)) THEN
    BEGIN
     IF ((periodo = 1) OR (periodo = 5) OR (periodo = 9) OR (periodo = 13) OR (periodo = 17) OR (periodo = 21)
     OR (periodo = 25) OR (periodo = 29) OR (periodo = 33) OR (periodo = 37) OR (periodo = 41) OR (periodo = 45)
     OR (periodo = 49)) THEN
     basico = 0;
    END
    ELSE
     IF ((:periodicidad = 3) AND (:tomasal <> 2)) THEN
     BEGIN
      IF ((periodo = 2) OR (periodo = 6) OR (periodo = 10) OR (periodo = 14) OR (periodo = 18) OR (periodo = 22)
      OR (periodo = 26) OR (periodo = 30) OR (periodo = 34) OR (periodo = 38) OR (periodo = 42) OR (periodo = 46)
      OR (periodo = 50)) THEN
      basico = 0;
     END
     ELSE
     IF ((:periodicidad = 3) AND (:tomasal <> 3)) THEN
     BEGIN
      IF ((periodo = 3) OR (periodo = 7) OR (periodo = 11) OR (periodo = 15) OR (periodo = 19) OR (periodo = 23)
      OR (periodo = 27) OR (periodo = 31) OR (periodo = 35) OR (periodo = 39) OR (periodo = 43) OR (periodo = 47)
      OR (periodo = 51)) THEN
      basico = 0;
     END
     ELSE
     IF ((:periodicidad = 3) AND (:tomasal <> 4)) THEN
     BEGIN
      IF ((periodo = 4) OR (periodo = 8) OR (periodo = 12) OR (periodo = 16) OR (periodo = 20) OR (periodo = 24)
      OR (periodo = 29) OR (periodo = 32) OR (periodo = 36) OR (periodo = 40) OR (periodo = 44) OR (periodo = 48)
      OR (periodo = 52)) THEN
      basico = 0;
     END
   END
   ELSE
   BEGIN
    SELECT E.empl_salario FROM EMPLEADOS E WHERE E.terc_nit = :nite INTO :basico;
    SELECT ((n.nono_valor /30) * n.nono_dura), (n.nono_dura) FROM nomina_novedades n WHERE n.tnov_cod = 11 AND n.terc_nit = :nite AND n.nono_periodo = :periodo INTO :cambsaltrans, :duranov;
    IF (cambsaltrans IS NULL) THEN
    cambsaltrans = 0;
    IF (duranov IS NULL) THEN
    duranov = 0;
    diaslab = :diaslab - :duranov;
    IF (conc_cod = 922) THEN
    BEGIN
     SELECT SUM(P.prcu_monto) FROM prestamo_cuotas P, prestamo_nomina PN WHERE P.prcu_ano = :ano AND P.prcu_periodo = :periodo AND PN.prno_id = P.prno_id AND PN.terc_nit = :nite INTO :valor;
     IF (valor IS NULL) THEN
     valor = 0;
     item = :item + 1;
     UPDATE prestamo_cuotas  P SET prcu_ok = 'S' WHERE P.prcu_ano = :ano AND P.prcu_periodo = :periodo AND P.prno_id = (SELECT PN.prno_id FROM PRESTAMO_NOMINA PN WHERE PN.terc_nit = :nite);
    END
    ELSE
    IF ((:montos = 0) OR (:montos IS NULL)) THEN
    BEGIN
     IF ((CONC_PORC = 0 AND :porcen = 0) OR (CONC_PORC IS NULL AND :porcen = 0) OR (CONC_PORC = 0 AND :porcen IS NULL) OR (CONC_PORC IS NULL AND :porcen IS NULL) ) THEN
     BEGIN
      IF ((conc_monto <> 0) AND (conc_monto IS NOT NULL) ) THEN
      BEGIN
       VALOR = :CONC_MONTO;
       IF (:conc_dias = 'S') THEN
       valor = (:valor / 30) * :diaslab;
      END
      ELSE
      IF (salario = 'S' AND CONC_COD <> 900 AND CONC_COD <> 920) THEN
      BEGIN
       conc_monto = :basico;
       VALOR = (:conc_monto/30 * :diaslab ) + :cambsaltrans;
      END
      ELSE
      BEGIN
       valor = montos;
       IF (:conc_dias = 'S') THEN
       valor = (:valor / 30) * :diaslab;
      END
     END
     ELSE
     BEGIN
      IF (:porcen <> 0) THEN
      BEGIN
       IF ((conc_monto <> 0) AND (conc_monto IS NOT NULL) ) THEN
       BEGIN
        VALOR = ((:CONC_MONTO ) * :PORCEN) /100;
       END
      END
      ELSE
      BEGIN
       IF ((conc_monto <> 0) AND (conc_monto IS NOT NULL) ) THEN
       BEGIN
        VALOR = ((:CONC_MONTO) * :conc_porc) /100;
       END
       ELSE
       IF (salario = 'S' AND CONC_COD <> 900 AND CONC_COD <> 920) THEN
       BEGIN
        conc_monto = :basico;
        VALOR = ((:CONC_MONTO)+ :cambsaltrans * :conc_porc) /100;
       END
       ELSE
       IF (:conc_monto = 0 AND :montos = 0) THEN
       BEGIN
        conc_monto = :basico;
        VALOR = (((:CONC_MONTO / 30) * :diaslab) + :cambsaltrans * :conc_porc) /100;
       END
      END
     END
    END
    ELSE
    IF ((CONC_PORC = 0 OR (conc_porc IS NULL)) AND (:porcen = 0 OR (porcen IS NULL))) THEN
    BEGIN
     VALOR = (:montos);
     IF (:conc_dias = 'S') THEN
     valor = (:valor / 30) * :diaslab;
    END
    ELSE
    IF (:porcen <> 0 AND porcen IS NOT NULL) THEN
    BEGIN
     VALOR = ((:MONTOS ) * :PORCEN) /100;
    END
    ELSE
    BEGIN
     VALOR = ((:montos) * :CONC_PORC) /100;
    END
    IF (conc_promedio = 'S') THEN
    BEGIN
     perinicial = :periodo - (:numeroprom) + 1;
     anoprom = CAST (ano AS INTEGER);
     IF (perinicial <= 0) THEN
     BEGIN
      perinicial = 24 + :PERINICIAL;
      anoprom = CAST(ANO AS INTEGER) - 1;
     END
     SELECT SUM (noco_valor) FROM nomina_conceptos n WHERE n.noco_aplicaprom = 'S' AND N.noco_periodo >= :perinicial - 1 AND N.noco_periodo < :periodo AND N.noco_ano >= :anoprom AND N.noco_ano <= :ano AND terc_nit = :nite INTO :valor;
     valor = (valor / numeroprom);
     SELECT NOCO_VALOR FROM NOMINA_CONCEPTOS WHERE CONC_COD = :conc_cod AND TERC_NIT  = :nite AND NOCO_PAGOOK = 'N' AND NOCO_PERIODO = 0 INTO :saldosini;
     IF (saldosini IS NULL) THEN
     saldosini = 0;
     ELSE
     UPDATE nomina_conceptos N SET noco_pagook = 'S' WHERE n.noco_aplicaprom = 'S' AND N.noco_periodo >= :perinicial - 1 AND N.noco_periodo < :periodo AND N.noco_ano >= :anoprom AND N.noco_ano <= :ano  AND CONC_COD = :conc_cod AND terc_nit = :nite AND NOCO_PERIODO = 0;
     VALOR = :valor + :saldosini;
     UPDATE nomina_conceptos N SET noco_pagook = 'S' WHERE n.noco_aplicaprom = 'S' AND N.noco_periodo >= :perinicial - 1 AND N.noco_periodo < :periodo AND N.noco_ano >= :anoprom AND N.noco_ano <= :ano  AND CONC_COD = :conc_cod AND terc_nit = :nite;
    END
    ELSE
    IF (conc_otroconc = 'S') THEN
    BEGIN
     anosum = CAST(ano AS INTEGER);
     anosum = anosum - 1;
     SELECT SUM (noco_valor) FROM nomina_conceptos n WHERE n.noco_ano = :anosum AND n.conc_cod = :conc_codotroconc AND N.terc_nit = :nite INTO :valor;
     SELECT NOCO_VALOR FROM NOMINA_CONCEPTOS WHERE noco_ano = :anosum AND conc_cod = :conc_codotroconc AND terc_nit = :nite AND NOCO_PERIODO = 0 INTO :saldosini;
     IF (saldosini IS NULL) THEN
     saldosini = 0;
     ELSE
     UPDATE nomina_conceptos SET noco_pagook = 'S' WHERE noco_ano = :anosum AND conc_cod = :conc_codotroconc AND NOCO_PERIODO = 0 AND terc_nit = :nite;
     VALOR = :valor + :saldosini;
     UPDATE nomina_conceptos SET noco_pagook = 'S' WHERE noco_ano = :anosum AND conc_cod = :conc_codotroconc AND terc_nit = :nite;
    END
    ELSE
    IF (conc_aporte = 'S') THEN
    BEGIN
     horasex = NULL;
     diasnov = NULL;
     retroact = null;
     IF ((:entidad = '' ) OR (entidad IS NULL)) THEN
     BEGIN
      SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
      IF (comision IS NULL) THEN
      comision = 0;
      SELECT C.emco_monto FROM EMPLEADO_CONCEPTOS C WHERE C.terc_nit = :nite AND C.conc_cod = 933 INTO :retroact;
      IF (retroact IS NULL ) THEN
      retroact = 0;
      SELECT N.nono_dura FROM NOMINA_NOVEDADES N WHERE N.terc_nit = :nite AND N.nono_periodo = :periodo AND N.nono_ano = :ano AND (N.tnov_cod = 2 or (N.tnov_cod = 3)) INTO :diasnov;
      IF (:diasnov IS NULL) THEN
      incap = 0;
      ELSE
      incap = (:basico / 30)* :diasnov;
      valor = :basico + :comision + :horasex + :retroact + :incap;
      IF ((conc_cod = 904) OR (conc_cod = 905) OR (conc_cod = 906)) THEN
      BEGIN
       entidad = :nitafp;
       IF (conc_cod = 904) THEN
       BEGIN
        SELECT A.paan_afptr FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
        SELECT N.nono_dura FROM NOMINA_NOVEDADES N WHERE N.terc_nit = :nite AND N.nono_periodo = :periodo AND N.nono_ano = :ano AND (N.tnov_cod = 2 or (N.tnov_cod = 3)) INTO :diasnov;
        IF (:diasnov IS NULL) THEN
        incap = 0;
        ELSE
        incap = (:basico / 30)* :diasnov;
        SELECT c.noex_monto FROM nomina_horasext c WHERE c.noex_ano = :ano AND c.noex_periodio = :periodo AND c.noex_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :horasex;
        IF (horasex IS NOT NULL) THEN
        VALOR = (((((:basico )/30 * :diaslab ) + :comision + :horasex + :retroact+ :incap)+ :cambsaltrans ) * :PORCEN) /100;
        ELSE
        VALOR = ((((:basico)/30 * :diaslab ) + :comision + :retroact+ :cambsaltrans  + :incap) * :PORCEN) /100;
       END
       ELSE
       IF ((conc_cod = 905) OR (conc_cod = 906)) THEN
       BEGIN
        SELECT A.paan_afpem FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
        SELECT N.nono_dura FROM NOMINA_NOVEDADES N WHERE N.terc_nit = :nite AND N.nono_periodo = :periodo AND N.nono_ano = :ano AND (N.tnov_cod = 2 or (N.tnov_cod = 3)) INTO :diasnov;
        IF (:diasnov IS NULL) THEN
        incap = 0;
        ELSE
        incap = (:basico / 30)* :diasnov;
        SELECT c.noex_monto FROM nomina_horasext c WHERE c.noex_ano = :ano AND c.noex_periodio = :periodo AND c.noex_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :horasex;
        IF (horasex IS NOT NULL) THEN
        VALOR = (((((:basico )/30 * :diaslab ) + :comision + :horasex + :retroact)+ :cambsaltrans + :incap) * :PORCEN) /100;
        ELSE
        VALOR = (((((:basico )/30 * :diaslab ) + :comision + :retroact)+ :cambsaltrans + :incap) * :PORCEN) /100;
       END
      END
      ELSE
      IF ((conc_cod = 907) OR (conc_cod = 914) OR (conc_cod = 915)) THEN
      BEGIN
       entidad = :niteps;
       IF (conc_cod = 907) THEN
       BEGIN
        SELECT A.paan_epstr FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
        SELECT N.nono_dura FROM NOMINA_NOVEDADES N WHERE N.terc_nit = :nite AND N.nono_periodo = :periodo AND N.nono_ano = :ano AND (N.tnov_cod = 2 or (N.tnov_cod = 3)) INTO :diasnov;
        IF (:diasnov IS NULL) THEN
        incap = 0;
        ELSE
        incap = (:basico / 30)* :diasnov;
        SELECT c.noex_monto FROM nomina_horasext c WHERE c.noex_ano = :ano AND c.noex_periodio = :periodo AND c.noex_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :horasex;
        IF (horasex IS NOT NULL) THEN
        VALOR = (((((:basico )/30 * :diaslab ) + :comision + :horasex + :retroact)+ :cambsaltrans + :incap) * :PORCEN) /100;
        ELSE
        VALOR = (((((:basico )/30 * :diaslab ) + :comision + :retroact)+ :cambsaltrans + :incap) * :PORCEN) /100;
       END
       ELSE
       IF ((conc_cod = 914) OR (conc_cod = 915)) THEN
       BEGIN
        SELECT A.paan_epsem FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
        SELECT N.nono_dura FROM NOMINA_NOVEDADES N WHERE N.terc_nit = :nite AND N.nono_periodo = :periodo AND N.nono_ano = :ano AND (N.tnov_cod = 2 or (N.tnov_cod = 3)) INTO :diasnov;
        IF (:diasnov IS NULL) THEN
        incap = 0;
        ELSE
        incap = (:basico / 30)* :diasnov;
        SELECT c.noex_monto FROM nomina_horasext c WHERE c.noex_ano = :ano AND c.noex_periodio = :periodo AND c.noex_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :horasex;
        IF (horasex IS NOT NULL) THEN
        VALOR = (((((:basico )/30 * :diaslab ) + :comision + :horasex + :retroact)+ :cambsaltrans + :incap) * :PORCEN) /100;
        ELSE
        VALOR = (((((:basico )/30 * :diaslab ) + :comision + :retroact)+ :cambsaltrans + :incap) * :PORCEN) /100;
       END
      END
      ELSE
      IF ((conc_cod = 910) OR (conc_cod = 911) OR (conc_cod = 916) OR (conc_cod = 917) OR (conc_cod = 918) OR (conc_cod = 919)) THEN
      BEGIN
       entidad = :nitccf;
       SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
       IF (comision IS NULL) THEN
       comision = 0;
       SELECT N.nono_dura FROM NOMINA_NOVEDADES N WHERE N.terc_nit = :nite AND N.nono_periodo = :periodo AND N.nono_ano = :ano AND (N.tnov_cod = 2 or (N.tnov_cod = 3)) INTO :diasnov;
       IF (:diasnov IS NULL) THEN
       incap = 0;
       ELSE
       incap = (:basico / 30)* :diasnov;
       IF ((conc_cod = 910) OR (conc_cod = 911) ) THEN
       BEGIN
        SELECT A.paan_ccf FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
      SELECT N.nono_dura FROM NOMINA_NOVEDADES N WHERE N.terc_nit = :nite AND N.nono_periodo = :periodo AND N.nono_ano = :ano AND (N.tnov_cod = 2 or (N.tnov_cod = 3)) INTO :diasnov;
      IF (:diasnov IS NULL) THEN
      incap = 0;
      ELSE
      incap = (:basico / 30)* :diasnov;
        SELECT c.noex_monto FROM nomina_horasext c WHERE c.noex_ano = :ano AND c.noex_periodio = :periodo AND c.noex_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :horasex;
        IF (horasex IS NOT NULL) THEN
        VALOR = (((((:basico )/30 * :diaslab ) + :comision + :horasex + :retroact)+ :cambsaltrans + :incap) * :PORCEN) /100;
        ELSE
        VALOR = (((((:basico )/30 * :diaslab ) + :comision + :retroact)+ :cambsaltrans + :incap) * :PORCEN) /100;
       END
       ELSE
       IF ((conc_cod = 916) OR (conc_cod = 917)) THEN
       BEGIN
        SELECT A.paan_icbf FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
      SELECT N.nono_dura FROM NOMINA_NOVEDADES N WHERE N.terc_nit = :nite AND N.nono_periodo = :periodo AND N.nono_ano = :ano AND (N.tnov_cod = 2 or (N.tnov_cod = 3)) INTO :diasnov;
      IF (:diasnov IS NULL) THEN
      incap = 0;
      ELSE
      incap = (:basico / 30)* :diasnov;
      SELECT N.nono_dura FROM NOMINA_NOVEDADES N WHERE N.terc_nit = :nite AND N.nono_periodo = :periodo AND N.nono_ano = :ano AND (N.tnov_cod = 2 or (N.tnov_cod = 3)) INTO :diasnov;
      IF (:diasnov IS NULL) THEN
      incap = 0;
      ELSE
      incap = (:basico / 30)* :diasnov;
        SELECT c.noex_monto FROM nomina_horasext c WHERE c.noex_ano = :ano AND c.noex_periodio = :periodo AND c.noex_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :horasex;
        IF (horasex IS NOT NULL) THEN
        VALOR = (((((:basico )/30 * :diaslab ) + :comision + :horasex + :retroact)+ :cambsaltrans + :incap) * :PORCEN) /100;
        ELSE
        VALOR = (((((:basico )/30 * :diaslab ) + :comision + :retroact)+ :cambsaltrans + :incap) * :PORCEN) /100;
       END
       ELSE
       IF ((conc_cod = 918) OR (conc_cod = 919)) THEN
       BEGIN
        SELECT A.paan_sena FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
      SELECT N.nono_dura FROM NOMINA_NOVEDADES N WHERE N.terc_nit = :nite AND N.nono_periodo = :periodo AND N.nono_ano = :ano AND (N.tnov_cod = 2 or (N.tnov_cod = 3)) INTO :diasnov;
      IF (:diasnov IS NULL) THEN
      incap = 0;
      ELSE
      incap = (:basico / 30)* :diasnov;
        SELECT c.noex_monto FROM nomina_horasext c WHERE c.noex_ano = :ano AND c.noex_periodio = :periodo AND c.noex_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :horasex;
        IF (horasex IS NOT NULL) THEN
        VALOR = (((((:basico )/30 * :diaslab ) + :comision + :horasex + :retroact)+ :cambsaltrans + :incap) * :PORCEN) /100;
        ELSE
        VALOR = (((((:basico )/30 * :diaslab ) + :comision + :retroact)+ :cambsaltrans + :incap) * :PORCEN) /100;
       END
      END
      ELSE
      IF ((conc_cod = 912) OR (conc_cod = 913)) THEN
      BEGIN
       entidad = :nitafc;
       SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
       IF (comision IS NULL) THEN
       comision = 0;
      SELECT N.nono_dura FROM NOMINA_NOVEDADES N WHERE N.terc_nit = :nite AND N.nono_periodo = :periodo AND N.nono_ano = :ano AND (N.tnov_cod = 2 or (N.tnov_cod = 3)) INTO :diasnov;
      IF (:diasnov IS NULL) THEN
      incap = 0;
      ELSE
      incap = (:basico / 30)* :diasnov;
       IF ((conc_cod = 912) OR (conc_cod = 913) ) THEN
       BEGIN
        SELECT A.paan_cesemp FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
        SELECT c.noex_monto FROM nomina_horasext c WHERE c.noex_ano = :ano AND c.noex_periodio = :periodo AND c.noex_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :horasex;
        IF (horasex IS NOT NULL) THEN
        VALOR = (((((:basico )/30 * :diaslab ) + :comision + :horasex + :retroact)+ :cambsaltrans + :incap) * :PORCEN) /100;
        ELSE
        VALOR = (((((:basico )/30 * :diaslab ) + :comision + :retroact)+ :cambsaltrans + :incap) * :PORCEN) /100;
       END
      END
      ELSE
      BEGIN
       IF (comision IS NULL) THEN
       comision = 0;
       SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
       conc_monto = :basico + :comision;
       IF (conc_porc <> 0 AND conc_porc IS NOT NULL) THEN
       VALOR = (((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans + :incap) * :conc_porc) /100;
       ELSE
       IF (:porcen <> 0 AND :porcen IS NOT NULL) THEN
       VALOR = (((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans + :incap) * :porcen) /100;
       ELSE
       IF (:montos <> 0 AND :montos IS NOT NULL) THEN
       valor = :montos;
       ELSE
       IF (:conc_monto <> 0 AND :conc_monto IS NOT NULL) THEN
       valor = :conc_monto;
      END
     END
     item = :item + 1;
    END
    ELSE
    IF (conc_prov = 'S') THEN
    BEGIN
     conc_monto = :basico;
     IF (conc_porc <> 0 AND conc_porc IS NOT NULL) THEN
     VALOR = (((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans + :incap) * :conc_porc) /100;
     ELSE
     IF (porcen <> 0 AND porcen IS NOT NULL) THEN
     VALOR = (((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans + :incap) * :porcen) /100;
     ELSE
     IF (montos <> 0 AND montos IS NOT NULL) THEN
     VALOR = :montos;
     ELSE
     IF (conc_monto <> 0 AND conc_monto IS NOT NULL) THEN
     VALOR = :conc_monto;
     item = :item + 1;
    END
    ELSE
    IF (conc_cod = 920) THEN
    BEGIN
     SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :valor;
     IF (valor IS NULL) THEN
     valor = 0;
     item = :item + 1;
    END
    ELSE
    IF (conc_cod = 900 OR (:conc_cod = 931)) THEN
    BEGIN
     SELECT c.noex_monto FROM nomina_horasext c WHERE c.noex_ano = :ano AND c.noex_periodio = :periodo AND c.noex_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :valor;
     IF (valor IS NULL) THEN
     valor = 0;
     item = :item + 1;
    END
    ELSE
    IF (conc_cod = 932) THEN
    BEGIN
     SELECT N.nono_dura FROM NOMINA_NOVEDADES N WHERE N.terc_nit = :nite AND N.nono_periodo = :periodo AND N.nono_ano = :ano AND (N.tnov_cod = 2 or (N.tnov_cod = 3)) INTO :diasnov;
     IF (:diasnov IS NULL) THEN
     valor = 0;
     ELSE
     valor = (:basico / 30)* :diasnov;
    END
    ELSE
    IF (conc_cod = 921) THEN
    BEGIN
     IF (porcen IS NOT NULL AND porcen <> 0) THEN
     valor = ((basico / 30)* :diaslab ) * :PORCEN /100;
     ELSE
     IF (conc_porc IS NOT NULL AND conc_porc <> 0) THEN
     valor = ((basico / 30)* :diaslab ) * :conc_porc /100;
    END
    EXECUTE PROCEDURE LEE_CONFIGURACION('NOMINA','GENERAL','REDONDEO AL MULTIPLO DE DIEZ EN TOTALES')RETURNING_VALUES(:aprox);
    EXECUTE PROCEDURE REDONDEE(:valor, :aprox) RETURNING_VALUES (VALOR);
    IF ((mensual = 'N') OR (periodicidad = 1))  THEN
    INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
    VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
    ELSE
    IF (mensual = 'S') THEN
    BEGIN
     IF ((:periodicidad = 2) AND (liquidaper = 1)) THEN
     BEGIN
      IF ((periodo = 1) OR (periodo = 3) OR (periodo = 5) OR (periodo = 7) OR (periodo = 9) OR (periodo = 11)
      OR (periodo = 13) OR (periodo = 15) OR (periodo = 17) OR (periodo = 19) OR (periodo = 21) OR (periodo = 23)) THEN
      INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
      VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
     END
     ELSE
     IF ((:periodicidad = 2) AND (liquidaper = 2)) THEN
     BEGIN
      IF ((periodo = 2) OR (periodo = 4) OR (periodo = 6) OR (periodo = 8) OR (periodo = 10) OR (periodo = 12)
      OR (periodo = 14) OR (periodo = 16) OR (periodo = 18) OR (periodo = 20) OR (periodo = 22) OR (periodo = 24)) THEN
      INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
      VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
     END
     ELSE
     IF ((:periodicidad = 3) AND (liquidaper = 1)) THEN
     BEGIN
      IF ((periodo = 1) OR (periodo = 5) OR (periodo = 9) OR (periodo = 13) OR (periodo = 17) OR (periodo = 21)
      OR (periodo = 25) OR (periodo = 29) OR (periodo = 33) OR (periodo = 37) OR (periodo = 41) OR (periodo = 45)
      OR (periodo = 49)) THEN
      INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
      VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
    END
    ELSE
     IF ((:periodicidad = 3) AND (liquidaper = 2)) THEN
     BEGIN
      IF ((periodo = 2) OR (periodo = 6) OR (periodo = 10) OR (periodo = 14) OR (periodo = 18) OR (periodo = 22)
      OR (periodo = 26) OR (periodo = 30) OR (periodo = 34) OR (periodo = 38) OR (periodo = 42) OR (periodo = 46)
      OR (periodo = 50)) THEN
      INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
      VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
     END
     ELSE
     IF ((:periodicidad = 3) AND (liquidaper = 3)) THEN
     BEGIN
      IF ((periodo = 3) OR (periodo = 7) OR (periodo = 11) OR (periodo = 15) OR (periodo = 19) OR (periodo = 23)
      OR (periodo = 27) OR (periodo = 31) OR (periodo = 35) OR (periodo = 39) OR (periodo = 43) OR (periodo = 47)
      OR (periodo = 51)) THEN
      INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
      VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
     END
     ELSE
     IF ((:periodicidad = 3) AND (liquidaper = 4)) THEN
     BEGIN
      IF ((periodo = 4) OR (periodo = 8) OR (periodo = 12) OR (periodo = 16) OR (periodo = 20) OR (periodo = 24)
      OR (periodo = 29) OR (periodo = 32) OR (periodo = 36) OR (periodo = 40) OR (periodo = 44) OR (periodo = 48)
      OR (periodo = 52)) THEN
      INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
      VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
     END
    END
  VALOR = 0;
  basico = 0;
   END
  END
 END
 SUSPEND;
END
^

SET TERM ; ^


SET TERM ^ ;

CREATE OR ALTER PROCEDURE IMPR_PLANILLA_NOMINA (
    id integer,
    pago char(1),
    cta char(1),
    empl char(1))
returns (
    fecha date,
    observaciones blob sub_type 0 segment size 80,
    pagoglobal char(1),
    periodo integer,
    ano char(4),
    periodicidad varchar(60),
    nitempl varchar(20),
    valor numeric(18,2),
    deduc char(1),
    nombreempl varchar(60),
    nomcortconc varchar(60),
    nombreconc varchar(60),
    codconc integer,
    prov char(1),
    totalempl numeric(18,2),
    totaldeduc numeric(18,2),
    totaldeveng numeric(18,2),
    numempl integer,
    ctaempl varchar(25),
    totalctas numeric(18,2),
    totalnomi numeric(18,2),
    totalapor numeric(18,2),
    nomper varchar(60),
    org integer,
    cargoempl varchar(60),
    deptoempl varchar(60),
    numcop integer,
    nombre_copia varchar(60),
    diaslab integer,
    salario numeric(18,2))
as
declare variable nitant varchar(20);
declare variable nitnue varchar(20);
declare variable numconc integer;
declare variable totalnomineg numeric(18,2);
declare variable totalaporneg numeric(18,2);
declare variable par integer;
declare variable impar integer;
declare variable antdeduc char(1);
declare variable nitdeduc varchar(20);
declare variable nittot varchar(20);
BEGIN
 SELECT N.nuco_copia FROM NUMERO_COPIA N WHERE N.tido_cod = 92 AND N.nuco_id = :id INTO :NUMCOP;
 IF (numcop IS NULL) THEN
 BEGIN
  numcop = 0;
  INSERT INTO NUMERO_COPIA (TIDO_COD, NUCO_ID, NUCO_COPIA) VALUES (92,:id,:numcop);
 END
 ELSE
 BEGIN
  numcop = :numcop + 1;
  UPDATE numero_copia N SET N.nuco_copia = :numcop WHERE N.tido_cod = 92 AND N.nuco_id = :id;
 END
 SELECT N.noco_nombre FROM nombres_copias N WHERE N.noco_id = :numcop INTO :nombre_copia;
 numempl = 0;
 nitant = 0;
 nitnue = 0;
 IF (PAGO = 'N') THEN
 BEGIN
  FOR SELECT N.nomi_feccausa, N.nomi_obs, N.nomi_pagoglobal, N.nomi_periodo, N.nomi_ano, P.ppag_nombre, PN.pnom_nombre FROM NOMINA N, periodo_pago P, periodo_pago_nombre PN
  WHERE P.ppag_cod = N.nomi_periodocidad AND N.nomi_id = :ID AND PN.ppag_cod = N.nomi_periodocidad AND PN.ppag_periodo = N.nomi_periodo
  INTO :fecha, :observaciones, :pagoglobal, :periodo, :ano, :periodicidad, :NOMPER
  DO
  BEGIN
   FOR SELECT NC.terc_nit, NC.noco_valor, NC.noco_deduc, T.terc_nom, C.conc_nomcorto, C.conc_nombre, NC.conc_cod, NC.noco_prov, E.empl_cargo FROM NOMINA_CONCEPTOS NC, TERCEROS T, EMPLEADOS E, CONCEPTOS_NOMINA C
   WHERE NC.nomi_id = :ID AND T.terc_nit = E.terc_nit AND C.conc_cod = NC.conc_cod AND t.terc_nit = nc.terc_nit
   INTO :nitempl, :valor, :deduc, :nombreempl, :nomcortconc, :nombreconc, :codconc, :prov, :cargoempl
   DO
   BEGIN
    IF (valor IS NULL) THEN
    valor = 0;
    SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND TERC_NIT = :nitempl INTO :totalempl;
    SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND TERC_NIT = :nitempl AND NC.noco_deduc = 'S' INTO :totaldeduc;
    SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND TERC_NIT = :nitempl AND NC.noco_deduc = 'N' INTO :totaldeveng;
    SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id INTO :totalnomi;
    SELECT SUM(NC.noco_valor*-1) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_APORTE = 'S' AND NOCO_VALOR < 0 AND NOMI_ID = :id INTO :totalaporneg;
    SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_APORTE = 'S' AND NOCO_VALOR > 0 AND NOMI_ID = :id INTO :totalapor;
    totalapor = :totalapor + totalaporneg;
    SUSPEND;
   END
   nitempl = '';
   valor = NULL;
   deduc = '';
   nombreempl = NULL;
   nomcortconc = NULL;
   nombreconc = NULL;
   codconc = NULL;
   prov = NULL;
   FOR SELECT MAX(N.conc_cod) FROM NOMINA_CONCEPTOS N WHERE N.nomi_id = :id
   GROUP BY N.conc_cod
   INTO :codconc
   DO
   BEGIN
    SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC
    WHERE NC.nomi_id = :ID AND NC.conc_cod = :codconc
    GROUP BY NC.conc_cod
    INTO :valor;
    nitempl = '';
    nombreempl = '';
    deduc = 'N';
    prov = 'N';
    SELECT C.conc_nombre,C.conc_nomcorto FROM CONCEPTOS_NOMINA C WHERE C.conc_cod = :codconc INTO :nombreconc,:nomcortconc;
    SUSPEND;
   END
  END
 END
 ELSE
 IF (PAGO = 'S') THEN
 BEGIN
  par = 2;
  impar = 1;
  IF (EMPL = 'N') THEN
  BEGIN
     deduc = 'N';
     nomcortconc = 'TOTAL DEV';
     nombreconc = 'TOTAL DEV';
     codconc = 9999;
     prov = 'N';
     valor = NULL;
     nitempl = '';
     nombreempl = '';
     SUSPEND;
     deduc = 'S';
     nomcortconc = 'TOTAL DEDUC';
     nombreconc = 'TOTAL DEDUC';
     codconc = 99999;
     prov = 'N';
     valor = NULL;
     nitempl = '';
     nombreempl = '';
     SUSPEND;
     deduc = 'S';
     nomcortconc = 'TOTAL EMPL';
     nombreconc = 'TOTAL EMPL';
     codconc = 999999;
     prov = 'N';
     valor = NULL;
     nitempl = '';
     nombreempl = '';
     SUSPEND;
  END
  FOR SELECT N.nomi_feccausa, N.nomi_obs, N.nomi_pagoglobal, N.nomi_periodo, N.nomi_ano, P.ppag_nombre, PN.pnom_nombre FROM NOMINA N, periodo_pago P, periodo_pago_nombre PN
  WHERE P.ppag_cod = N.nomi_periodocidad AND N.nomi_id = :ID AND PN.ppag_cod = N.nomi_periodocidad AND PN.ppag_periodo = N.nomi_periodo
  INTO :fecha, :observaciones, :pagoglobal, :periodo, :ano, :periodicidad, :NOMPER
  DO
  BEGIN
    IF (EMPL = 'N') THEN
    BEGIN
     FOR SELECT MAX(N.conc_cod) FROM NOMINA_CONCEPTOS N WHERE N.nomi_id = :id AND N.noco_prov = 'N' AND N.noco_gtoempr = 'N'
     GROUP BY N.conc_cod
     INTO :codconc
     DO
     BEGIN
      SELECT NULL, MAX(NC.noco_deduc) FROM NOMINA_CONCEPTOS NC
      WHERE NC.nomi_id = :ID AND NC.conc_cod = :codconc
      GROUP BY NC.conc_cod
      INTO :valor, :deduc;
      valor = NULL;
      nitempl = '';
      nombreempl = '';
      prov = 'N';
      SELECT C.conc_nombre,C.conc_nomcorto FROM CONCEPTOS_NOMINA C WHERE C.conc_cod = :codconc INTO :nombreconc,:nomcortconc;
      SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id INTO :totalempl;
      SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND NC.noco_deduc = 'S' INTO :totaldeduc;
      SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND NC.noco_deduc = 'N' INTO :totaldeveng;
      SUSPEND;
     END
   END
   FOR SELECT NC.terc_nit, NC.noco_valor, NC.noco_deduc, T.terc_nom, C.conc_nomcorto, C.conc_nombre, NC.conc_cod, NC.noco_prov, E.empl_cargo, D.dpto_nombre, ND.node_diaslab,NC.terc_nit, E.empl_salario
   FROM NOMINA_CONCEPTOS NC, TERCEROS T, EMPLEADOS E, CONCEPTOS_NOMINA C, DEPARTAMENTO D, NOMINA_DETALLE ND
   WHERE NC.nomi_id = :ID AND T.terc_nit = E.terc_nit AND C.conc_cod = NC.conc_cod AND t.terc_nit = nc.terc_nit AND D.dpto_cod = E.empl_dpto AND NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N'
   AND ND.nomi_id = :id AND ND.terc_nit = E.terc_nit
   ORDER BY T.terc_nom
   INTO :nitempl, :valor, :deduc, :nombreempl, :nomcortconc, :nombreconc, :codconc, :prov, :cargoempl,:deptoempl,:diaslab,:nitnue, :salario
   DO
   BEGIN
    IF ((nitnue <> nitant) AND (nitnue IS NOT NULL)) THEN
     numempl = :numempl + 1;
    IF (valor IS NULL) THEN
    valor = 0;
    IF (nitempl <> nitdeduc) THEN
    BEGIN
     par = 2;
     impar = 1;
    END
    nitdeduc = :nitempl;
    IF (:deduc = 'S') THEN
    BEGIN
     antdeduc = 'S';
     org = :par;
     par = :par + 2;
    END
    ELSE
    BEGIN
     antdeduc = 'N';
     org = :impar;
     impar = :impar + 2;
    END
    SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND TERC_NIT = :nitempl INTO :totalempl;
    SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND TERC_NIT = :nitempl AND NC.noco_deduc = 'S' INTO :totaldeduc;
    SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND TERC_NIT = :nitempl AND NC.noco_deduc = 'N' INTO :totaldeveng;
    IF (cta = 'S') THEN
    BEGIN
     SELECT COUNT(CONC_COD) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND TERC_NIT = :nitempl INTO :numconc;
     totalempl = totalempl / :numconc;
     SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND TERC_NIT = :nitempl INTO :totalctas;
    END
    SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id INTO :totalnomi;
    SELECT SUM(NC.noco_valor*-1) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_APORTE = 'S' AND NOCO_VALOR < 0 AND NOMI_ID = :id INTO :totalaporneg;
    SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_APORTE = 'S' AND NOCO_VALOR > 0 AND NOMI_ID = :id INTO :totalapor;
    totalapor = :totalapor + totalaporneg;
   SUSPEND;
    IF ((nitnue <> nitant) AND (nitnue IS NOT NULL) AND (EMPL = 'N')) THEN
    BEGIN
     deduc = 'N';
     nomcortconc = 'TOTAL DEV';
     nombreconc = 'TOTAL DEV';
     codconc = 9999;
     prov = 'N';
     SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND NC.noco_deduc = 'N' AND NC.terc_nit = : nitempl INTO :VALOR;
     SUSPEND;
     deduc = 'S';
     nomcortconc = 'TOTAL DEDUC';
     nombreconc = 'TOTAL DEDUC';
     codconc = 99999;
     prov = 'N';
     SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND NC.noco_deduc = 'S' AND NC.terc_nit = :nitempl INTO :VALOR;
     SUSPEND;
     deduc = 'S';
     nomcortconc = 'TOTAL EMPL';
     nombreconc = 'TOTAL EMPL';
     codconc = 999999;
     prov = 'N';
     SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND NC.terc_nit = :nitempl INTO :VALOR;
     nitant = :nitnue;
     SUSPEND;
    END
   END
   numempl = :numempl + 1;
   IF ( EMPL = 'N') THEN
   BEGIN
    nitempl = '';
    valor = NULL;
    deduc = '';
    nombreempl = NULL;
    nomcortconc = NULL;
    nombreconc = NULL;
    codconc = NULL;
    prov = NULL;
    totalempl = NULL;
    ctaempl = NULL;
    IF (cta = 'N') THEN
    BEGIN
     FOR SELECT MAX(N.conc_cod) FROM NOMINA_CONCEPTOS N WHERE N.nomi_id = :id AND N.noco_prov = 'N' AND N.noco_gtoempr = 'N'
     GROUP BY N.conc_cod
     INTO :codconc
     DO
     BEGIN
      SELECT SUM(NC.noco_valor), MAX(NC.noco_deduc) FROM NOMINA_CONCEPTOS NC
      WHERE NC.nomi_id = :ID AND NC.conc_cod = :codconc
      GROUP BY NC.conc_cod
      INTO :valor, :deduc;
      nitempl = '-';
      nombreempl = 'TOTAL';
      prov = 'N';
      SELECT C.conc_nombre,C.conc_nomcorto FROM CONCEPTOS_NOMINA C WHERE C.conc_cod = :codconc INTO :nombreconc,:nomcortconc;
      SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id INTO :totalempl;
      SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND NC.noco_deduc = 'S' INTO :totaldeduc;
      SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND NC.noco_deduc = 'N' INTO :totaldeveng;
      SUSPEND;
     END
     deduc = 'N';
     nomcortconc = 'TOTAL DEV';
     nombreconc = 'TOTAL DEV';
     codconc = 9999;
     prov = 'N';
     SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id INTO :VALOR;
     nitempl = '-';
     nombreempl = 'TOTAL';
     SUSPEND;
     deduc = 'S';
     nomcortconc = 'TOTAL DEDUC';
     nombreconc = 'TOTAL DEDUC';
     codconc = 99999;
     prov = 'N';
     SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND NC.noco_deduc = 'S' INTO :VALOR;
     nitempl = '-';
     nombreempl = 'TOTAL';
     SUSPEND;
     deduc = 'S';
     nomcortconc = 'TOTAL EMPL';
     nombreconc = 'TOTAL EMPL';
     codconc = 999999;
     prov = 'N';
     SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND NC.noco_deduc = 'N' INTO :VALOR;
     nitempl = '-';
     nombreempl = 'TOTAL';
     SUSPEND;
    END
   END
  END
 END
END
^

SET TERM ; ^

CREATE TABLE NOMINA_DEPARTAMENTO (
    NOMI_ID INTEGER NOT NULL,
    NODP_DEPTO INTEGER NOT NULL);
ALTER TABLE NOMINA_DEPARTAMENTO
ADD CONSTRAINT PK_NOMINA_DEPARTAMENTO
PRIMARY KEY (NOMI_ID,NODP_DEPTO);

SET TERM ^ ;

create trigger NOMINA_DEPARTAMENTO_BI for NOMINA_DEPARTAMENTO
active BEFORE INSERT position 0
as
declare variable EXISTE CHAR(1);
begin
SELECT 'S' FROM NOMINA_DEPARTAMENTO ND WHERE ND.nomi_id = NEW.nomi_id AND (ND.nodp_depto = NEW.nodp_depto or (nd.nodp_depto = 0)) INTO :existe;
if (EXISTE IS NOT NULL) then
 exception nomina_registrada;
end
^

SET TERM ; ^

GRANT SELECT,UPDATE,REFERENCES ON NOMINA_DEPARTAMENTO TO TRIGGER NOMINA_DEPARTAMENTO_BI;

SET TERM ^ ;

CREATE OR ALTER TRIGGER NOMINA_AD FOR NOMINA
ACTIVE AFTER DELETE POSITION 0
AS
declare variable consec INTEGER;
BEGIN
/* borre la contabilización */
select enco_consec from comprobante_encabezado where enco_tiporef = 92 and enco_idref = old.nomi_id INTO :consec;
if (NOT consec is null) then
  delete from comprobante_detalle where enco_consec = :consec;
  delete from comprobante_encabezado where enco_tiporef = 92 and enco_idref = OLD.nomi_id;

  delete from consolidado_nomina  where cono_tipoori = 92 and cono_idori = OLD.nomi_id;
  delete from nomina_departamento  where nomi_id = OLD.nomi_id;

  INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
    VALUES (USER, 92, OLD.nomi_id, 'D', OLD.nomi_ano || OLD.nomi_periodo);

end
^

SET TERM ; ^

ALTER TABLE NOMINA_HORASEXT
ADD NOEX_SALBASE MONTO;

SET TERM ^ ;

CREATE OR ALTER TRIGGER NOMINA_HORASEXT_BU FOR NOMINA_HORASEXT
ACTIVE BEFORE UPDATE POSITION 0
AS
BEGIN
/*if (NEW.noex_diur <> 0 OR NEW.noex_fdiur <> 0 OR NEW.noex_noct <> 0 OR NEW.noex_fnoct <> 0) then
execute PROCEDURE liquida_horas_extra (NEW.terc_nit,NEW.noex_diur,NEW.noex_noct,NEW.noex_fdiur,NEW.noex_fnoct,NEW.noex_ano,'N')returning_values(NEW.noex_monto);
*/END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER NOMINA_HORASEXT_BI FOR NOMINA_HORASEXT
ACTIVE BEFORE INSERT POSITION 0
AS
BEGIN
/*if (NEW.noex_diur <> 0 OR NEW.noex_fdiur <> 0 OR NEW.noex_noct <> 0 OR NEW.noex_fnoct <> 0) then
execute PROCEDURE liquida_horas_extra (NEW.terc_nit,NEW.noex_diur,NEW.noex_noct,NEW.noex_fdiur,NEW.noex_fnoct,NEW.noex_ano,'N')returning_values(NEW.noex_monto);
*/END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER PROCEDURE LIQUIDA_HORAS_EXTRA(
    NIT VARCHAR(20),
    HD SMALLINT,
    HN SMALLINT,
    HFD SMALLINT,
    HFN SMALLINT,
    ANO CHAR(4),
    PROVI CHAR(1),
    SALBASE NUMERIC(18,2))
RETURNS (
    TOT_HE NUMERIC(18,0))
AS
DECLARE VARIABLE tot_fesd NUMERIC(18,10);
DECLARE VARIABLE tot_fesn NUMERIC(18,10);
DECLARE VARIABLE tot_diur NUMERIC(18,10);
DECLARE VARIABLE tot_noct NUMERIC(18,10);
DECLARE VARIABLE tar_fesd NUMERIC(9,4);
DECLARE VARIABLE tar_fesn NUMERIC(9,4);
DECLARE VARIABLE tar_diur NUMERIC(9,4);
DECLARE VARIABLE tar_noct NUMERIC(9,4);
DECLARE VARIABLE monto NUMERIC(18,10);
BEGIN
IF (PROVI = 'N') THEN
BEGIN
IF ((:SALBASE IS NULL) OR (:SALBASE = 0) ) THEN
SELECT EMPL_SALARIO FROM empleados WHERE TERC_NIT = :NIT INTO :monto;
ELSE
MONTO = :SALBASE;
  monto = :monto / 240;
SELECT PAAN_HORASDI, PAAN_HORASNO, PAAN_HORASFN, PAAN_HORASFD FROM PARAMETROS_ANO WHERE paan_ano = :ano
  INTO :tar_diur, :tar_noct, :tar_fesn, :tar_fesd;
  tot_diur = :monto * tar_diur;
  tot_noct = :monto * tar_noct;
  tot_fesn = :monto * tar_fesn;
  tot_fesd = :monto * tar_fesd;
  tot_diur = :tot_diur * :hd;
  tot_noct = :tot_noct * :hn;
  tot_fesn = :tot_fesn * :hfn;
  tot_fesd = :tot_fesd * :hfd;
  tot_he =  tot_diur + tot_noct + tot_fesd + tot_fesn;
  SUSPEND;
END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER NOMINA_HORASEXT_BU FOR NOMINA_HORASEXT
ACTIVE BEFORE UPDATE POSITION 0
AS
BEGIN
if (NEW.noex_diur <> 0 OR NEW.noex_fdiur <> 0 OR NEW.noex_noct <> 0 OR NEW.noex_fnoct <> 0) then
execute PROCEDURE liquida_horas_extra (NEW.terc_nit,NEW.noex_diur,NEW.noex_noct,NEW.noex_fdiur,NEW.noex_fnoct,NEW.noex_ano,'N',NEW.NOEX_SALBASE)returning_values(NEW.noex_monto);
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER NOMINA_HORASEXT_BI FOR NOMINA_HORASEXT
ACTIVE BEFORE INSERT POSITION 0
AS
BEGIN
if (NEW.noex_diur <> 0 OR NEW.noex_fdiur <> 0 OR NEW.noex_noct <> 0 OR NEW.noex_fnoct <> 0) then
execute PROCEDURE liquida_horas_extra (NEW.terc_nit,NEW.noex_diur,NEW.noex_noct,NEW.noex_fdiur,NEW.noex_fnoct,NEW.noex_ano,'N',NEW.NOEX_SALBASE)returning_values(NEW.noex_monto);
END
^

SET TERM ; ^

INSERT INTO CONCEPTOS_NOMINA (CONC_COD, CONC_NOMBRE, CONC_DEDUC, CONC_FECINI, CONC_FECFIN, CONC_PORC, CONC_BASE, CONC_ENTIDAD, CONC_MONTO, CONC_CTAGAST, CONC_DIAS, CONC_MODIFI, CONC_DIAPAGO, CONC_PROMEDIO, CONC_TODOSPER, CONC_PROV, CONC_PERACTUAL, CONC_APORTE, CONC_APLICAPROM, CONC_PERPROMEDIO, CONC_OTROCONC, CONC_CODOTROCONC, CONC_SALARIO, CONC_CTACXP, CONC_NOMCORTO, CONC_PERIODOS, CONC_GTOEMPR, CONC_CXP, CONC_CART, CONC_TOMSAL) VALUES (952, 'REEMBOLSO', 'N', '1-JAN-2008', '31-DEC-2008', 0, 0, NULL, NULL, NULL, 'N', 'S', NULL, 'N', 'N', 'N', 'N', 'N', 'N', NULL, 'N', 0, 'N', NULL, 'Reembolso', NULL, 'N', 'N', 'N', 0);

SET TERM ^ ;

CREATE OR ALTER PROCEDURE CAUSA_NOMINA(
    FEC DATE,
    PERIODO INTEGER,
    PERIODICIDAD INTEGER,
    PAGOGLOBAL CHAR(1),
    ANO CHAR(4),
    DEPTO INTEGER)
RETURNS (
    IDNOMINA INTEGER,
    ITEMINI INTEGER)
AS
DECLARE VARIABLE item INTEGER;
DECLARE VARIABLE nite VARCHAR(20) CHARACTER SET none;
DECLARE VARIABLE nit_tercero VARCHAR(20);
DECLARE VARIABLE concept INTEGER;
DECLARE VARIABLE montos NUMERIC(18,2);
DECLARE VARIABLE porcen NUMERIC(9,4);
DECLARE VARIABLE entidad VARCHAR(20);
DECLARE VARIABLE conc_cod INTEGER;
DECLARE VARIABLE conc_deduc CHAR(1);
DECLARE VARIABLE conc_porc NUMERIC(9,4);
DECLARE VARIABLE conc_entidad INTEGER;
DECLARE VARIABLE conc_monto NUMERIC(18,2);
DECLARE VARIABLE conc_modifi CHAR(1);
DECLARE VARIABLE conc_promedio CHAR(1);
DECLARE VARIABLE emco_perprom INTEGER;
DECLARE VARIABLE valor NUMERIC(18,2);
DECLARE VARIABLE diaslab INTEGER;
DECLARE VARIABLE conc_prov CHAR(1);
DECLARE VARIABLE conc_aporte CHAR(1);
DECLARE VARIABLE numeroprom INTEGER;
DECLARE VARIABLE conc_aplicaprom CHAR(1);
DECLARE VARIABLE perinicial INTEGER;
DECLARE VARIABLE anoprom INTEGER;
DECLARE VARIABLE conc_dias CHAR(1);
DECLARE VARIABLE conc_otroconc CHAR(1);
DECLARE VARIABLE conc_codotroconc INTEGER;
DECLARE VARIABLE anosum INTEGER;
DECLARE VARIABLE salario CHAR(1) CHARACTER SET none;
DECLARE VARIABLE liquidaper INTEGER;
DECLARE VARIABLE rmod NUMERIC(2,2);
DECLARE VARIABLE basico NUMERIC(18,2);
DECLARE VARIABLE niteps VARCHAR(20);
DECLARE VARIABLE nitafc VARCHAR(20);
DECLARE VARIABLE nitafp VARCHAR(20);
DECLARE VARIABLE nitccf VARCHAR(20);
DECLARE VARIABLE gtoempr CHAR(1);
DECLARE VARIABLE comision NUMERIC(18,2);
DECLARE VARIABLE cambsaltrans NUMERIC(18,2);
DECLARE VARIABLE saldosini NUMERIC(18,2);
DECLARE VARIABLE duranov INTEGER;
DECLARE VARIABLE base NUMERIC(18,2);
DECLARE VARIABLE aprox INTEGER;
DECLARE VARIABLE mensual CHAR(1);
DECLARE VARIABLE horasex NUMERIC(18,2);
DECLARE VARIABLE diasnov INTEGER;
DECLARE VARIABLE tomasal INTEGER;
DECLARE VARIABLE retroact NUMERIC(18,2);
DECLARE VARIABLE reembolso NUMERIC(18,2);
DECLARE VARIABLE incap NUMERIC(18,2);
DECLARE VARIABLE deptoempl INTEGER;
BEGIN
 SELECT N.NOMI_ID FROM NOMINA N WHERE N.nomi_periodo = :periodo AND N.nomi_periodocidad = :periodicidad AND N.nomi_ano = :ano
 INTO :IDNOMINA;
 IF (:idnomina IS NULL) THEN
 BEGIN
  EXECUTE PROCEDURE cambie_id_nomina RETURNING_VALUES(:idnomina);
  INSERT INTO nomina (nomi_id, NOMI_FECCAUSA, NOMI_PAGOGLOBAL, NOMI_PERIODOCIDAD, NOMI_PERIODO, NOMI_ANO, NOMI_LIQOK)
  VALUES (:IDNOMINA, :fec,:pagoglobal, :periodicidad, :periodo, :ano, 'N');
  item = 1;
 END
 ELSE
 BEGIN
  SELECT MAX(N.noco_item) FROM NOMINA_CONCEPTOS N WHERE N.nomi_id = :idnomina
  INTO :item;
 END
 IF (DEPTO = 0) THEN
  INSERT INTO NOMINA_DEPARTAMENTO (nomi_id, nodp_depto)VALUES(:IDNOMINA,0);
 ELSE
  INSERT INTO NOMINA_DEPARTAMENTO (nomi_id, nodp_depto)VALUES(:IDNOMINA,:DEPTO);
 ITEMINI = ITEM;
 FOR SELECT E.TERC_NIT, E.empl_salario, e.empl_eps, e.empl_afc, e.empl_afp, e.empl_ccf, e.empl_dpto
 FROM EMPLEADOS E
 WHERE E.empl_ppago = :periodicidad AND E.empl_fecret IS NULL
 INTO :nite, :basico, :niteps, :nitafc, :nitafp, :nitccf, :deptoempl
 DO
 BEGIN
 IF ((depto = 0) OR (deptoempl = :depto)) THEN
 BEGIN
  FOR SELECT CE.TERC_NIT, CE.CONC_COD, CE.EMCO_MONTO, CE.EMCO_PORC, ce.empl_entidad, CE.emco_perprom, CE.emco_luquidaper, CE.emco_mensual, CN.CONC_COD, CN.CONC_DEDUC,CN.CONC_PORC, CN.CONC_ENTIDAD, CN.CONC_MONTO,  CN.CONC_DIAS, CN.CONC_MODIFI,
  CN.CONC_PROMEDIO, CN.conc_salario, CE.emco_perprom, CN.conc_prov, CN.conc_aporte, CN.conc_aplicaprom, cn.conc_otroconc, cn.conc_codotroconc, CN.conc_gtoempr, CN.conc_base, CE.emco_tomsal
  FROM empleado_conceptos CE, CONCEPTOS_NOMINA CN WHERE ((CE.terc_nit = :nite) AND (CE.CONC_COD = CN.CONC_COD) AND (CE.emco_fecini <= :fec AND CE.emco_fecfin >= :FEC) ) OR ((CE.terc_nit = :nite)
  AND (CE.CONC_COD = CN.CONC_COD) AND (cn.conc_todosper = 'N') AND (CE.emco_ppago = :periodo)) OR  ((CE.terc_nit = :nite) AND (CE.CONC_COD = CN.CONC_COD) AND cn.conc_todosper = 'S')  ORDER BY (TERC_NIT )
  INTO :nit_tercero, :concept,  :montos, :porcen, :entidad, :numeroprom, :liquidaper, :mensual ,:CONC_COD, :CONC_DEDUC, :CONC_PORC,
  :CONC_ENTIDAD, :CONC_MONTO, :CONC_DIAS, :CONC_MODIFI,:CONC_PROMEDIO, :salario,:EMCO_PERPROM, :conc_prov, :conc_aporte , :CONC_APLICAPROM, :conc_otroconc, :conc_codotroconc, :gtoempr, :base, :tomasal
  DO
  BEGIN
   IF (conc_dias = 'S') THEN
   EXECUTE PROCEDURE DIAS_LABORADOS (:nite, :periodo, :fec, :mensual,:conc_aporte) RETURNING_VALUES (:diaslab);
   ELSE
   BEGIN
    diaslab = 15;
    IF (mensual = 'S') THEN
    BEGIN
     IF (periodicidad = 2) THEN
     diaslab = 30;
     ELSE
     IF (liquidaper = 3) THEN
     diaslab = 30;
    END
   END
   IF (:tomasal <> 0) THEN
   BEGIN
    IF ((:periodicidad = 2) AND (:tomasal <> 2)) THEN
    BEGIN
     IF ((periodo = 2) OR (periodo = 4) OR (periodo = 6) OR (periodo = 8) OR (periodo = 10) OR (periodo = 12)
     OR (periodo = 14) OR (periodo = 16) OR (periodo = 18) OR (periodo = 20) OR (periodo = 22) OR (periodo = 24)) THEN
     basico = 0;
    END
    ELSE
    IF ((:periodicidad = 3) AND (:tomasal <> 1)) THEN
    BEGIN
     IF ((periodo = 1) OR (periodo = 5) OR (periodo = 9) OR (periodo = 13) OR (periodo = 17) OR (periodo = 21)
     OR (periodo = 25) OR (periodo = 29) OR (periodo = 33) OR (periodo = 37) OR (periodo = 41) OR (periodo = 45)
     OR (periodo = 49)) THEN
     basico = 0;
    END
    ELSE
     IF ((:periodicidad = 3) AND (:tomasal <> 2)) THEN
     BEGIN
      IF ((periodo = 2) OR (periodo = 6) OR (periodo = 10) OR (periodo = 14) OR (periodo = 18) OR (periodo = 22)
      OR (periodo = 26) OR (periodo = 30) OR (periodo = 34) OR (periodo = 38) OR (periodo = 42) OR (periodo = 46)
      OR (periodo = 50)) THEN
      basico = 0;
     END
     ELSE
     IF ((:periodicidad = 3) AND (:tomasal <> 3)) THEN
     BEGIN
      IF ((periodo = 3) OR (periodo = 7) OR (periodo = 11) OR (periodo = 15) OR (periodo = 19) OR (periodo = 23)
      OR (periodo = 27) OR (periodo = 31) OR (periodo = 35) OR (periodo = 39) OR (periodo = 43) OR (periodo = 47)
      OR (periodo = 51)) THEN
      basico = 0;
     END
     ELSE
     IF ((:periodicidad = 3) AND (:tomasal <> 4)) THEN
     BEGIN
      IF ((periodo = 4) OR (periodo = 8) OR (periodo = 12) OR (periodo = 16) OR (periodo = 20) OR (periodo = 24)
      OR (periodo = 29) OR (periodo = 32) OR (periodo = 36) OR (periodo = 40) OR (periodo = 44) OR (periodo = 48)
      OR (periodo = 52)) THEN
      basico = 0;
     END
   END
   ELSE
   BEGIN
    SELECT E.empl_salario FROM EMPLEADOS E WHERE E.terc_nit = :nite INTO :basico;
    SELECT ((n.nono_valor /30) * n.nono_dura), (n.nono_dura) FROM nomina_novedades n WHERE n.tnov_cod = 11 AND n.terc_nit = :nite AND n.nono_periodo = :periodo INTO :cambsaltrans, :duranov;
    IF (cambsaltrans IS NULL) THEN
    cambsaltrans = 0;
    IF (duranov IS NULL) THEN
    duranov = 0;
    diaslab = :diaslab - :duranov;
    IF (conc_cod = 922) THEN
    BEGIN
     SELECT SUM(P.prcu_monto) FROM prestamo_cuotas P, prestamo_nomina PN WHERE P.prcu_ano = :ano AND P.prcu_periodo = :periodo AND PN.prno_id = P.prno_id AND PN.terc_nit = :nite INTO :valor;
     IF (valor IS NULL) THEN
     valor = 0;
     item = :item + 1;
     UPDATE prestamo_cuotas  P SET prcu_ok = 'S' WHERE P.prcu_ano = :ano AND P.prcu_periodo = :periodo AND P.prno_id = (SELECT PN.prno_id FROM PRESTAMO_NOMINA PN WHERE PN.terc_nit = :nite);
    END
    ELSE
    IF ((:montos = 0) OR (:montos IS NULL)) THEN
    BEGIN
     IF ((CONC_PORC = 0 AND :porcen = 0) OR (CONC_PORC IS NULL AND :porcen = 0) OR (CONC_PORC = 0 AND :porcen IS NULL) OR (CONC_PORC IS NULL AND :porcen IS NULL) ) THEN
     BEGIN
      IF ((conc_monto <> 0) AND (conc_monto IS NOT NULL) ) THEN
      BEGIN
       VALOR = :CONC_MONTO;
       IF (:conc_dias = 'S') THEN
       valor = (:valor / 30) * :diaslab;
      END
      ELSE
      IF (salario = 'S' AND CONC_COD <> 900 AND CONC_COD <> 920) THEN
      BEGIN
       conc_monto = :basico;
       VALOR = (:conc_monto/30 * :diaslab ) + :cambsaltrans;
      END
      ELSE
      BEGIN
       valor = montos;
       IF (:conc_dias = 'S') THEN
       valor = (:valor / 30) * :diaslab;
      END
     END
     ELSE
     BEGIN
      IF (:porcen <> 0) THEN
      BEGIN
       IF ((conc_monto <> 0) AND (conc_monto IS NOT NULL) ) THEN
       BEGIN
        VALOR = ((:CONC_MONTO ) * :PORCEN) /100;
       END
      END
      ELSE
      BEGIN
       IF ((conc_monto <> 0) AND (conc_monto IS NOT NULL) ) THEN
       BEGIN
        VALOR = ((:CONC_MONTO) * :conc_porc) /100;
       END
       ELSE
       IF (salario = 'S' AND CONC_COD <> 900 AND CONC_COD <> 920) THEN
       BEGIN
        conc_monto = :basico;
        VALOR = ((:CONC_MONTO)+ :cambsaltrans * :conc_porc) /100;
       END
       ELSE
       IF (:conc_monto = 0 AND :montos = 0) THEN
       BEGIN
        conc_monto = :basico;
        VALOR = (((:CONC_MONTO / 30) * :diaslab) + :cambsaltrans * :conc_porc) /100;
       END
      END
     END
    END
    ELSE
    IF ((CONC_PORC = 0 OR (conc_porc IS NULL)) AND (:porcen = 0 OR (porcen IS NULL))) THEN
    BEGIN
     VALOR = (:montos);
     IF (:conc_dias = 'S') THEN
     valor = (:valor / 30) * :diaslab;
    END
    ELSE
    IF (:porcen <> 0 AND porcen IS NOT NULL) THEN
    BEGIN
     VALOR = ((:MONTOS ) * :PORCEN) /100;
    END
    ELSE
    BEGIN
     VALOR = ((:montos) * :CONC_PORC) /100;
    END
    IF (conc_promedio = 'S') THEN
    BEGIN
     perinicial = :periodo - (:numeroprom) + 1;
     anoprom = CAST (ano AS INTEGER);
     IF (perinicial <= 0) THEN
     BEGIN
      perinicial = 24 + :PERINICIAL;
      anoprom = CAST(ANO AS INTEGER) - 1;
     END
     SELECT SUM (noco_valor) FROM nomina_conceptos n WHERE n.noco_aplicaprom = 'S' AND N.noco_periodo >= :perinicial - 1 AND N.noco_periodo < :periodo AND N.noco_ano >= :anoprom AND N.noco_ano <= :ano AND terc_nit = :nite INTO :valor;
     valor = (valor / numeroprom);
     SELECT NOCO_VALOR FROM NOMINA_CONCEPTOS WHERE CONC_COD = :conc_cod AND TERC_NIT  = :nite AND NOCO_PAGOOK = 'N' AND NOCO_PERIODO = 0 INTO :saldosini;
     IF (saldosini IS NULL) THEN
     saldosini = 0;
     ELSE
     UPDATE nomina_conceptos N SET noco_pagook = 'S' WHERE n.noco_aplicaprom = 'S' AND N.noco_periodo >= :perinicial - 1 AND N.noco_periodo < :periodo AND N.noco_ano >= :anoprom AND N.noco_ano <= :ano  AND CONC_COD = :conc_cod AND terc_nit = :nite AND NOCO_PERIODO = 0;
     VALOR = :valor + :saldosini;
     UPDATE nomina_conceptos N SET noco_pagook = 'S' WHERE n.noco_aplicaprom = 'S' AND N.noco_periodo >= :perinicial - 1 AND N.noco_periodo < :periodo AND N.noco_ano >= :anoprom AND N.noco_ano <= :ano  AND CONC_COD = :conc_cod AND terc_nit = :nite;
    END
    ELSE
    IF (conc_otroconc = 'S') THEN
    BEGIN
     anosum = CAST(ano AS INTEGER);
     anosum = anosum - 1;
     SELECT SUM (noco_valor) FROM nomina_conceptos n WHERE n.noco_ano = :anosum AND n.conc_cod = :conc_codotroconc AND N.terc_nit = :nite INTO :valor;
     SELECT NOCO_VALOR FROM NOMINA_CONCEPTOS WHERE noco_ano = :anosum AND conc_cod = :conc_codotroconc AND terc_nit = :nite AND NOCO_PERIODO = 0 INTO :saldosini;
     IF (saldosini IS NULL) THEN
     saldosini = 0;
     ELSE
     UPDATE nomina_conceptos SET noco_pagook = 'S' WHERE noco_ano = :anosum AND conc_cod = :conc_codotroconc AND NOCO_PERIODO = 0 AND terc_nit = :nite;
     VALOR = :valor + :saldosini;
     UPDATE nomina_conceptos SET noco_pagook = 'S' WHERE noco_ano = :anosum AND conc_cod = :conc_codotroconc AND terc_nit = :nite;
    END
    ELSE
    IF (conc_aporte = 'S') THEN
    BEGIN
     horasex = NULL;
     diasnov = NULL;
     retroact = NULL;
     reembolso = NULL;
     IF ((:entidad = '' ) OR (entidad IS NULL)) THEN
     BEGIN
      SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
      IF (comision IS NULL) THEN
      comision = 0;
      SELECT C.emco_monto FROM EMPLEADO_CONCEPTOS C WHERE C.terc_nit = :nite AND C.conc_cod = 933 INTO :retroact;
      IF (retroact IS NULL ) THEN
      retroact = 0;
      SELECT C.emco_monto FROM EMPLEADO_CONCEPTOS C WHERE C.terc_nit = :nite AND C.conc_cod = 952 INTO :reembolso;
      IF (reembolso IS NULL ) THEN
      reembolso = 0;
      SELECT N.nono_dura FROM NOMINA_NOVEDADES N WHERE N.terc_nit = :nite AND N.nono_periodo = :periodo AND N.nono_ano = :ano AND (N.tnov_cod = 2 OR (N.tnov_cod = 3)) INTO :diasnov;
      IF (:diasnov IS NULL) THEN
      incap = 0;
      ELSE
      incap = (:basico / 30)* :diasnov;
      valor = :basico + :comision + :horasex + :retroact + :reembolso + :incap;
      IF ((conc_cod = 904) OR (conc_cod = 905) OR (conc_cod = 906)) THEN
      BEGIN
       entidad = :nitafp;
       IF (conc_cod = 904) THEN
       BEGIN
        SELECT A.paan_afptr FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
        SELECT N.nono_dura FROM NOMINA_NOVEDADES N WHERE N.terc_nit = :nite AND N.nono_periodo = :periodo AND N.nono_ano = :ano AND (N.tnov_cod = 2 OR (N.tnov_cod = 3)) INTO :diasnov;
        IF (:diasnov IS NULL) THEN
        incap = 0;
        ELSE
        incap = (:basico / 30)* :diasnov;
        SELECT c.noex_monto FROM nomina_horasext c WHERE c.noex_ano = :ano AND c.noex_periodio = :periodo AND c.noex_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :horasex;
        IF (horasex IS NOT NULL) THEN
        VALOR = (((((:basico )/30 * :diaslab ) + :comision + :horasex + :retroact+ :reembolso + :incap)+ :cambsaltrans ) * :PORCEN) /100;
        ELSE
        VALOR = ((((:basico)/30 * :diaslab ) + :comision + :retroact+ :reembolso + :cambsaltrans  + :incap) * :PORCEN) /100;
       END
       ELSE
       IF ((conc_cod = 905) OR (conc_cod = 906)) THEN
       BEGIN
        SELECT A.paan_afpem FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
        SELECT N.nono_dura FROM NOMINA_NOVEDADES N WHERE N.terc_nit = :nite AND N.nono_periodo = :periodo AND N.nono_ano = :ano AND (N.tnov_cod = 2 OR (N.tnov_cod = 3)) INTO :diasnov;
        IF (:diasnov IS NULL) THEN
        incap = 0;
        ELSE
        incap = (:basico / 30)* :diasnov;
        SELECT c.noex_monto FROM nomina_horasext c WHERE c.noex_ano = :ano AND c.noex_periodio = :periodo AND c.noex_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :horasex;
        IF (horasex IS NOT NULL) THEN
        VALOR = (((((:basico )/30 * :diaslab ) + :comision + :horasex + :retroact + :reembolso)+ :cambsaltrans + :incap) * :PORCEN) /100;
        ELSE
        VALOR = (((((:basico )/30 * :diaslab ) + :comision + :retroact + :reembolso)+ :cambsaltrans + :incap) * :PORCEN) /100;
       END
      END
      ELSE
      IF ((conc_cod = 907) OR (conc_cod = 914) OR (conc_cod = 915)) THEN
      BEGIN
       entidad = :niteps;
       IF (conc_cod = 907) THEN
       BEGIN
        SELECT A.paan_epstr FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
        SELECT N.nono_dura FROM NOMINA_NOVEDADES N WHERE N.terc_nit = :nite AND N.nono_periodo = :periodo AND N.nono_ano = :ano AND (N.tnov_cod = 2 OR (N.tnov_cod = 3)) INTO :diasnov;
        IF (:diasnov IS NULL) THEN
        incap = 0;
        ELSE
        incap = (:basico / 30)* :diasnov;
        SELECT c.noex_monto FROM nomina_horasext c WHERE c.noex_ano = :ano AND c.noex_periodio = :periodo AND c.noex_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :horasex;
        IF (horasex IS NOT NULL) THEN
        VALOR = (((((:basico )/30 * :diaslab ) + :comision + :horasex + :retroact + :reembolso)+ :cambsaltrans + :incap) * :PORCEN) /100;
        ELSE
        VALOR = (((((:basico )/30 * :diaslab ) + :comision + :retroact + :reembolso)+ :cambsaltrans + :incap) * :PORCEN) /100;
       END
       ELSE
       IF ((conc_cod = 914) OR (conc_cod = 915)) THEN
       BEGIN
        SELECT A.paan_epsem FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
        SELECT N.nono_dura FROM NOMINA_NOVEDADES N WHERE N.terc_nit = :nite AND N.nono_periodo = :periodo AND N.nono_ano = :ano AND (N.tnov_cod = 2 OR (N.tnov_cod = 3)) INTO :diasnov;
        IF (:diasnov IS NULL) THEN
        incap = 0;
        ELSE
        incap = (:basico / 30)* :diasnov;
        SELECT c.noex_monto FROM nomina_horasext c WHERE c.noex_ano = :ano AND c.noex_periodio = :periodo AND c.noex_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :horasex;
        IF (horasex IS NOT NULL) THEN
        VALOR = (((((:basico )/30 * :diaslab ) + :comision + :horasex + :retroact + :reembolso)+ :cambsaltrans + :incap) * :PORCEN) /100;
        ELSE
        VALOR = (((((:basico )/30 * :diaslab ) + :comision + :retroact + :reembolso)+ :cambsaltrans + :incap) * :PORCEN) /100;
       END
      END
      ELSE
      IF ((conc_cod = 910) OR (conc_cod = 911) OR (conc_cod = 916) OR (conc_cod = 917) OR (conc_cod = 918) OR (conc_cod = 919)) THEN
      BEGIN
       entidad = :nitccf;
       SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
       IF (comision IS NULL) THEN
       comision = 0;
       SELECT N.nono_dura FROM NOMINA_NOVEDADES N WHERE N.terc_nit = :nite AND N.nono_periodo = :periodo AND N.nono_ano = :ano AND (N.tnov_cod = 2 OR (N.tnov_cod = 3)) INTO :diasnov;
       IF (:diasnov IS NULL) THEN
       incap = 0;
       ELSE
       incap = (:basico / 30)* :diasnov;
       IF ((conc_cod = 910) OR (conc_cod = 911) ) THEN
       BEGIN
        SELECT A.paan_ccf FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
      SELECT N.nono_dura FROM NOMINA_NOVEDADES N WHERE N.terc_nit = :nite AND N.nono_periodo = :periodo AND N.nono_ano = :ano AND (N.tnov_cod = 2 OR (N.tnov_cod = 3)) INTO :diasnov;
      IF (:diasnov IS NULL) THEN
      incap = 0;
      ELSE
      incap = (:basico / 30)* :diasnov;
        SELECT c.noex_monto FROM nomina_horasext c WHERE c.noex_ano = :ano AND c.noex_periodio = :periodo AND c.noex_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :horasex;
        IF (horasex IS NOT NULL) THEN
        VALOR = (((((:basico )/30 * :diaslab ) + :comision + :horasex + :retroact + :reembolso)+ :cambsaltrans + :incap) * :PORCEN) /100;
        ELSE
        VALOR = (((((:basico )/30 * :diaslab ) + :comision + :retroact + :reembolso)+ :cambsaltrans + :incap) * :PORCEN) /100;
       END
       ELSE
       IF ((conc_cod = 916) OR (conc_cod = 917)) THEN
       BEGIN
        SELECT A.paan_icbf FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
      SELECT N.nono_dura FROM NOMINA_NOVEDADES N WHERE N.terc_nit = :nite AND N.nono_periodo = :periodo AND N.nono_ano = :ano AND (N.tnov_cod = 2 OR (N.tnov_cod = 3)) INTO :diasnov;
      IF (:diasnov IS NULL) THEN
      incap = 0;
      ELSE
      incap = (:basico / 30)* :diasnov;
      SELECT N.nono_dura FROM NOMINA_NOVEDADES N WHERE N.terc_nit = :nite AND N.nono_periodo = :periodo AND N.nono_ano = :ano AND (N.tnov_cod = 2 OR (N.tnov_cod = 3)) INTO :diasnov;
      IF (:diasnov IS NULL) THEN
      incap = 0;
      ELSE
      incap = (:basico / 30)* :diasnov;
        SELECT c.noex_monto FROM nomina_horasext c WHERE c.noex_ano = :ano AND c.noex_periodio = :periodo AND c.noex_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :horasex;
        IF (horasex IS NOT NULL) THEN
        VALOR = (((((:basico )/30 * :diaslab ) + :comision + :horasex + :retroact + :reembolso)+ :cambsaltrans + :incap) * :PORCEN) /100;
        ELSE
        VALOR = (((((:basico )/30 * :diaslab ) + :comision + :retroact + :reembolso)+ :cambsaltrans + :incap) * :PORCEN) /100;
       END
       ELSE
       IF ((conc_cod = 918) OR (conc_cod = 919)) THEN
       BEGIN
        SELECT A.paan_sena FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
      SELECT N.nono_dura FROM NOMINA_NOVEDADES N WHERE N.terc_nit = :nite AND N.nono_periodo = :periodo AND N.nono_ano = :ano AND (N.tnov_cod = 2 OR (N.tnov_cod = 3)) INTO :diasnov;
      IF (:diasnov IS NULL) THEN
      incap = 0;
      ELSE
      incap = (:basico / 30)* :diasnov;
        SELECT c.noex_monto FROM nomina_horasext c WHERE c.noex_ano = :ano AND c.noex_periodio = :periodo AND c.noex_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :horasex;
        IF (horasex IS NOT NULL) THEN
        VALOR = (((((:basico )/30 * :diaslab ) + :comision + :horasex + :retroact + :reembolso)+ :cambsaltrans + :incap) * :PORCEN) /100;
        ELSE
        VALOR = (((((:basico )/30 * :diaslab ) + :comision + :retroact + :reembolso)+ :cambsaltrans + :incap) * :PORCEN) /100;
       END
      END
      ELSE
      IF ((conc_cod = 912) OR (conc_cod = 913)) THEN
      BEGIN
       entidad = :nitafc;
       SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
       IF (comision IS NULL) THEN
       comision = 0;
      SELECT N.nono_dura FROM NOMINA_NOVEDADES N WHERE N.terc_nit = :nite AND N.nono_periodo = :periodo AND N.nono_ano = :ano AND (N.tnov_cod = 2 OR (N.tnov_cod = 3)) INTO :diasnov;
      IF (:diasnov IS NULL) THEN
      incap = 0;
      ELSE
      incap = (:basico / 30)* :diasnov;
       IF ((conc_cod = 912) OR (conc_cod = 913) ) THEN
       BEGIN
        SELECT A.paan_cesemp FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
        SELECT c.noex_monto FROM nomina_horasext c WHERE c.noex_ano = :ano AND c.noex_periodio = :periodo AND c.noex_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :horasex;
        IF (horasex IS NOT NULL) THEN
        VALOR = (((((:basico )/30 * :diaslab ) + :comision + :horasex + :retroact+ :reembolso)+ :cambsaltrans + :incap) * :PORCEN) /100;
        ELSE
        VALOR = (((((:basico )/30 * :diaslab ) + :comision + :retroact + :reembolso)+ :cambsaltrans + :incap) * :PORCEN) /100;
       END
      END
      ELSE
      BEGIN
       IF (comision IS NULL) THEN
       comision = 0;
       SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
       conc_monto = :basico + :comision;
       IF (conc_porc <> 0 AND conc_porc IS NOT NULL) THEN
       VALOR = (((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans + :incap) * :conc_porc) /100;
       ELSE
       IF (:porcen <> 0 AND :porcen IS NOT NULL) THEN
       VALOR = (((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans + :incap) * :porcen) /100;
       ELSE
       IF (:montos <> 0 AND :montos IS NOT NULL) THEN
       valor = :montos;
       ELSE
       IF (:conc_monto <> 0 AND :conc_monto IS NOT NULL) THEN
       valor = :conc_monto;
      END
     END
     item = :item + 1;
    END
    ELSE
    IF (conc_prov = 'S') THEN
    BEGIN
     conc_monto = :basico;
     IF (conc_porc <> 0 AND conc_porc IS NOT NULL) THEN
     VALOR = (((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans + :incap) * :conc_porc) /100;
     ELSE
     IF (porcen <> 0 AND porcen IS NOT NULL) THEN
     VALOR = (((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans + :incap) * :porcen) /100;
     ELSE
     IF (montos <> 0 AND montos IS NOT NULL) THEN
     VALOR = :montos;
     ELSE
     IF (conc_monto <> 0 AND conc_monto IS NOT NULL) THEN
     VALOR = :conc_monto;
     item = :item + 1;
    END
    ELSE
    IF (conc_cod = 920) THEN
    BEGIN
     SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :valor;
     IF (valor IS NULL) THEN
     valor = 0;
     item = :item + 1;
    END
    ELSE
    IF (conc_cod = 900 OR (:conc_cod = 931)) THEN
    BEGIN
     SELECT c.noex_monto FROM nomina_horasext c WHERE c.noex_ano = :ano AND c.noex_periodio = :periodo AND c.noex_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :valor;
     IF (valor IS NULL) THEN
     valor = 0;
     item = :item + 1;
    END
    ELSE
    IF (conc_cod = 932) THEN
    BEGIN
     SELECT N.nono_dura FROM NOMINA_NOVEDADES N WHERE N.terc_nit = :nite AND N.nono_periodo = :periodo AND N.nono_ano = :ano AND (N.tnov_cod = 2 OR (N.tnov_cod = 3)) INTO :diasnov;
     IF (:diasnov IS NULL) THEN
     valor = 0;
     ELSE
     valor = (:basico / 30)* :diasnov;
    END
    ELSE
    IF (conc_cod = 921) THEN
    BEGIN
     IF (porcen IS NOT NULL AND porcen <> 0) THEN
     valor = ((basico / 30)* :diaslab ) * :PORCEN /100;
     ELSE
     IF (conc_porc IS NOT NULL AND conc_porc <> 0) THEN
     valor = ((basico / 30)* :diaslab ) * :conc_porc /100;
    END
    EXECUTE PROCEDURE LEE_CONFIGURACION('NOMINA','GENERAL','REDONDEO AL MULTIPLO DE DIEZ EN TOTALES')RETURNING_VALUES(:aprox);
    EXECUTE PROCEDURE REDONDEE(:valor, :aprox) RETURNING_VALUES (VALOR);
    IF ((mensual = 'N') OR (periodicidad = 1))  THEN
    INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
    VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
    ELSE
    IF (mensual = 'S') THEN
    BEGIN
     IF ((:periodicidad = 2) AND (liquidaper = 1)) THEN
     BEGIN
      IF ((periodo = 1) OR (periodo = 3) OR (periodo = 5) OR (periodo = 7) OR (periodo = 9) OR (periodo = 11)
      OR (periodo = 13) OR (periodo = 15) OR (periodo = 17) OR (periodo = 19) OR (periodo = 21) OR (periodo = 23)) THEN
      INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
      VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
     END
     ELSE
     IF ((:periodicidad = 2) AND (liquidaper = 2)) THEN
     BEGIN
      IF ((periodo = 2) OR (periodo = 4) OR (periodo = 6) OR (periodo = 8) OR (periodo = 10) OR (periodo = 12)
      OR (periodo = 14) OR (periodo = 16) OR (periodo = 18) OR (periodo = 20) OR (periodo = 22) OR (periodo = 24)) THEN
      INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
      VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
     END
     ELSE
     IF ((:periodicidad = 3) AND (liquidaper = 1)) THEN
     BEGIN
      IF ((periodo = 1) OR (periodo = 5) OR (periodo = 9) OR (periodo = 13) OR (periodo = 17) OR (periodo = 21)
      OR (periodo = 25) OR (periodo = 29) OR (periodo = 33) OR (periodo = 37) OR (periodo = 41) OR (periodo = 45)
      OR (periodo = 49)) THEN
      INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
      VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
    END
    ELSE
     IF ((:periodicidad = 3) AND (liquidaper = 2)) THEN
     BEGIN
      IF ((periodo = 2) OR (periodo = 6) OR (periodo = 10) OR (periodo = 14) OR (periodo = 18) OR (periodo = 22)
      OR (periodo = 26) OR (periodo = 30) OR (periodo = 34) OR (periodo = 38) OR (periodo = 42) OR (periodo = 46)
      OR (periodo = 50)) THEN
      INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
      VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
     END
     ELSE
     IF ((:periodicidad = 3) AND (liquidaper = 3)) THEN
     BEGIN
      IF ((periodo = 3) OR (periodo = 7) OR (periodo = 11) OR (periodo = 15) OR (periodo = 19) OR (periodo = 23)
      OR (periodo = 27) OR (periodo = 31) OR (periodo = 35) OR (periodo = 39) OR (periodo = 43) OR (periodo = 47)
      OR (periodo = 51)) THEN
      INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
      VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
     END
     ELSE
     IF ((:periodicidad = 3) AND (liquidaper = 4)) THEN
     BEGIN
      IF ((periodo = 4) OR (periodo = 8) OR (periodo = 12) OR (periodo = 16) OR (periodo = 20) OR (periodo = 24)
      OR (periodo = 29) OR (periodo = 32) OR (periodo = 36) OR (periodo = 40) OR (periodo = 44) OR (periodo = 48)
      OR (periodo = 52)) THEN
      INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
      VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
     END
    END
  VALOR = 0;
  basico = 0;
   END
  END
 END
 END
 SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

create trigger NOMINA_AI for NOMINA
active AFTER INSERT position 0
as
begin
    INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
        VALUES (USER, 92, NEW.nomi_id, 'I', NEW.nomi_ano || NEW.nomi_periodo);
end
^

SET TERM ; ^

GRANT UPDATE,REFERENCES ON NOMINA TO TRIGGER NOMINA_AI;
GRANT INSERT ON AUDITORIA TO TRIGGER NOMINA_AI;

SET TERM ^ ;

CREATE OR ALTER PROCEDURE ARCHIVO_BANCO(
    IDDOC INTEGER,
    FECHA DATE)
RETURNS (
    DATOS VARCHAR(591))
AS
DECLARE VARIABLE dat VARCHAR(60);
declare variable NOMBREEMPL VARCHAR(60);
declare variable NUMDOCID VARCHAR(20);
declare variable CUENTAEMPL VARCHAR(25);
declare variable BANCO INTEGER;
declare variable tipocta char(1);
declare variable VERIFICA NUMERIC(18,2);
BEGIN
datos = '';
dat = '1';
datos = :datos || :dat;
EXECUTE PROCEDURE lee_configuracion('CONTABILIDAD','GENERAL','NIT COMPAÑIA')returning_values (:dat);
EXECUTE PROCEDURE ceros_ancho_fijo(:dat,10,'N')returning_values(:dat);
datos = :datos || :dat;
dat = '';
EXECUTE PROCEDURE lee_configuracion('GENERAL','GENERAL','NOMBRE COMPAÑIA')returning_values (:dat);
EXECUTE PROCEDURE ceros_ancho_fijo(:dat,16,'A')returning_values(:dat);
datos = :datos || :dat;
dat = '225';
datos = :datos || :dat;
dat = 'NOMINA';
EXECUTE PROCEDURE ceros_ancho_fijo(:dat,10,'A')returning_values(:dat);
datos = :datos || :dat;
dat = substr(:fecha,3,4)|| substr(:fecha,6,7) || substr(:fecha,9,10);
datos = :datos || :dat;
dat = 'B';
datos = :datos || :dat;
dat = substr(:fecha,3,4)|| substr(:fecha,6,7) || substr(:fecha,9,10);
datos = :datos || :dat;
SELECT COUNT(NOMI_ID) FROM NOMINA_DETALLE WHERE NOMI_ID = :iddoc INTO :dat;
EXECUTE PROCEDURE ceros_ancho_fijo(:dat,6,'N')returning_values(:dat);
datos = :datos || :dat;
dat = '000000000000';
datos = :datos || :dat;
SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC, EMPLEADOS E WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :iddoc AND E.empl_formpago = 'B' AND NC.terc_nit = E.terc_nit INTO :dat;
dat = substr(:dat,1,strlen(:dat)-3);
EXECUTE PROCEDURE ceros_ancho_fijo(:dat,12,'N')returning_values(:dat);
datos = :datos || :dat;
EXECUTE PROCEDURE lee_configuracion('NOMINA', 'GENERAL', 'NUMERO DE CUENTA DEL BANCO')returning_values (:dat);
EXECUTE PROCEDURE ceros_ancho_fijo(:dat,11,'N')returning_values(:dat);
datos = :datos || :dat;
EXECUTE PROCEDURE lee_configuracion('NOMINA', 'GENERAL', 'TIPO CUENTA')returning_values (:dat);
EXECUTE PROCEDURE ceros_ancho_fijo(:dat,1,'A')returning_values(:dat);
datos = :datos || :dat;
  SUSPEND;
datos = '';
FOR SELECT D.terc_nit, T.terc_nom, E.empl_cuenta, E.empl_banco, e.empl_tipocta FROM empleados E, NOMINA_DETALLE D, TERCEROS T WHERE D.terc_nit = E.terc_nit AND T.terc_nit = E.terc_nit AND D.nomi_id = :iddoc AND E.empl_formpago = 'B'
INTO :numdocid, :nombreempl, :cuentaempl, :banco, :tipocta
DO
BEGIN
SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NC.terc_nit = :numdocid AND NOMI_ID = :iddoc INTO :verifica;
if (verifica > 0) then
BEGIN
dat = '6';
datos = :datos || :dat;
dat = :numdocid;
EXECUTE PROCEDURE ceros_ancho_fijo(:dat,15,'N')returning_values(:dat);
datos = :datos || :dat;
dat = :nombreempl;
EXECUTE PROCEDURE ceros_ancho_fijo(:dat,18,'A')returning_values(:dat);
datos = :datos || :dat;
SELECT B.banc_codach FROM BANCOS B WHERE B.banc_cod = :banco INTO :dat;
EXECUTE PROCEDURE ceros_ancho_fijo(:dat,9,'N')returning_values(:dat);
datos = :datos || :dat;
dat = :cuentaempl;
EXECUTE PROCEDURE ceros_ancho_fijo(:dat,17,'N')returning_values(:dat);
datos = :datos || :dat;
dat = 'S';
datos = :datos || :dat;
if (:tipocta = 'C') then
dat=  '27';
ELSE
if (:tipocta = 'A') then
dat=  '37';
datos = :datos || :dat;
SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NC.terc_nit = :numdocid AND NOMI_ID = :iddoc INTO :dat;
dat = substr(:dat,1,strlen(:dat)-3);
EXECUTE PROCEDURE ceros_ancho_fijo(:dat,10,'N')returning_values(:dat);
datos = :datos || :dat;
dat = 'NOMINA';
EXECUTE PROCEDURE ceros_ancho_fijo(:dat,9,'A')returning_values(:dat);
datos = :datos || :dat;
if (substr(:fecha,6,7) = '01') then
dat= 'ENERO';
ELSE
if (substr(:fecha,6,7) = '02') then
dat= 'FEBRERO';
ELSE
if (substr(:fecha,6,7) = '03') then
dat= 'MARZO';
ELSE
if (substr(:fecha,6,7) = '04') then
dat= 'ABRIL';
ELSE
if (substr(:fecha,6,7) = '05') then
dat= 'MAYO';
ELSE
if (substr(:fecha,6,7) = '06') then
dat= 'JUNIO';
ELSE
if (substr(:fecha,6,7) = '07') then
dat= 'JULIO';
ELSE
if (substr(:fecha,6,7) = '08') then
dat= 'AGOSTO';
ELSE
if (substr(:fecha,6,7) = '09') then
dat= 'SEPTIEMBRE';
ELSE
if (substr(:fecha,6,7) = '10') then
dat= 'OCTUBRE';
if (substr(:fecha,6,7) = '11') then
dat= 'NOVIEMBRE';
ELSE
if (substr(:fecha,6,7) = '12') then
dat= 'DICIEMBRE';
EXECUTE PROCEDURE ceros_ancho_fijo(:dat,12,'A')returning_values(:dat);
datos = :datos || :dat;
dat= ' ';
datos = :datos || :dat;
SUSPEND;
datos = '';
END
END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER PROCEDURE ALERTAS_CONTRATO_EMPL(
    FEC DATE)
RETURNS (
    DIAS INTEGER,
    MENSAJE VARCHAR(60),
    EMPLNOM VARCHAR(60))
AS
DECLARE VARIABLE fecing DATE;
DECLARE VARIABLE confdias INTEGER;
BEGIN
FOR SELECT CAST(E.empl_contranos - :fec AS INTEGER), T.terc_nom FROM EMPLEADOS E, TERCEROS T
 WHERE T.terc_nit = E.terc_nit AND E.empl_fecret IS NULL
 INTO :dias, :emplnom
DO
BEGIN
IF (dias IS NOT NULL) THEN
BEGIN
EXECUTE PROCEDURE LEE_CONFIGURACION ('NOMINA','EMPLEADO','DIAS PARA ANUNCIAR ALERTA DE CONTRATO')RETURNING_VALUES(:confdias);
IF ((dias <= :confdias) or (dias < 0))  THEN
BEGIN
if (dias < 0) then
BEGIN
mensaje = 'EL CONTRATO VENCIO HACE';
dias = :dias *(-1);
END
ELSE
BEGIN
IF (dias <= :confdias) THEN
mensaje = 'EL CONTRATO VENCE EN';
END
  SUSPEND;
END
END
END
END
^

SET TERM ; ^


update RDB$RELATION_FIELDS set
RDB$NULL_FLAG = NULL
where (RDB$FIELD_NAME = 'NONO_NVODEPTO') and
(RDB$RELATION_NAME = 'NOMINA_NOVEDADES')
;

SET TERM ^ ;

CREATE OR ALTER PROCEDURE CAUSA_NOMINA (
    FEC DATE,
    PERIODO INTEGER,
    PERIODICIDAD INTEGER,
    PAGOGLOBAL CHAR(1),
    ANO CHAR(4),
    DEPTO INTEGER)
RETURNS (
    IDNOMINA INTEGER,
    ITEMINI INTEGER)
AS
DECLARE VARIABLE item INTEGER;
DECLARE VARIABLE nite VARCHAR(20) CHARACTER SET none;
DECLARE VARIABLE nit_tercero VARCHAR(20);
DECLARE VARIABLE concept INTEGER;
DECLARE VARIABLE montos NUMERIC(18,2);
DECLARE VARIABLE porcen NUMERIC(9,4);
DECLARE VARIABLE entidad VARCHAR(20);
DECLARE VARIABLE conc_cod INTEGER;
DECLARE VARIABLE conc_deduc CHAR(1);
DECLARE VARIABLE conc_porc NUMERIC(9,4);
DECLARE VARIABLE conc_entidad INTEGER;
DECLARE VARIABLE conc_monto NUMERIC(18,2);
DECLARE VARIABLE conc_modifi CHAR(1);
DECLARE VARIABLE conc_promedio CHAR(1);
DECLARE VARIABLE emco_perprom INTEGER;
DECLARE VARIABLE valor NUMERIC(18,2);
DECLARE VARIABLE diaslab INTEGER;
DECLARE VARIABLE conc_prov CHAR(1);
DECLARE VARIABLE conc_aporte CHAR(1);
DECLARE VARIABLE numeroprom INTEGER;
DECLARE VARIABLE conc_aplicaprom CHAR(1);
DECLARE VARIABLE perinicial INTEGER;
DECLARE VARIABLE anoprom INTEGER;
DECLARE VARIABLE conc_dias CHAR(1);
DECLARE VARIABLE conc_otroconc CHAR(1);
DECLARE VARIABLE conc_codotroconc INTEGER;
DECLARE VARIABLE anosum INTEGER;
DECLARE VARIABLE salario CHAR(1) CHARACTER SET none;
DECLARE VARIABLE liquidaper INTEGER;
DECLARE VARIABLE rmod NUMERIC(2,2);
DECLARE VARIABLE basico NUMERIC(18,2);
DECLARE VARIABLE niteps VARCHAR(20);
DECLARE VARIABLE nitafc VARCHAR(20);
DECLARE VARIABLE nitafp VARCHAR(20);
DECLARE VARIABLE nitccf VARCHAR(20);
DECLARE VARIABLE gtoempr CHAR(1);
DECLARE VARIABLE comision NUMERIC(18,2);
DECLARE VARIABLE cambsaltrans NUMERIC(18,2);
DECLARE VARIABLE saldosini NUMERIC(18,2);
DECLARE VARIABLE duranov INTEGER;
DECLARE VARIABLE base NUMERIC(18,2);
DECLARE VARIABLE aprox INTEGER;
DECLARE VARIABLE mensual CHAR(1);
DECLARE VARIABLE horasex NUMERIC(18,2);
DECLARE VARIABLE diasnov INTEGER;
DECLARE VARIABLE tomasal INTEGER;
DECLARE VARIABLE retroact NUMERIC(18,2);
DECLARE VARIABLE reembolso NUMERIC(18,2);
DECLARE VARIABLE incap NUMERIC(18,2);
DECLARE VARIABLE deptoempl INTEGER;
BEGIN
 SELECT N.NOMI_ID FROM NOMINA N WHERE N.nomi_periodo = :periodo AND N.nomi_periodocidad = :periodicidad AND N.nomi_ano = :ano
 INTO :IDNOMINA;
 IF (:idnomina IS NULL) THEN
 BEGIN
  EXECUTE PROCEDURE cambie_id_nomina RETURNING_VALUES(:idnomina);
  INSERT INTO nomina (nomi_id, NOMI_FECCAUSA, NOMI_PAGOGLOBAL, NOMI_PERIODOCIDAD, NOMI_PERIODO, NOMI_ANO, NOMI_LIQOK)
  VALUES (:IDNOMINA, :fec,:pagoglobal, :periodicidad, :periodo, :ano, 'N');
  item = 1;
 END
 ELSE
 BEGIN
  SELECT MAX(N.noco_item) FROM NOMINA_CONCEPTOS N WHERE N.nomi_id = :idnomina
  INTO :item;
 END
 IF (DEPTO = 0) THEN
  INSERT INTO NOMINA_DEPARTAMENTO (nomi_id, nodp_depto)VALUES(:IDNOMINA,0);
 ELSE
  INSERT INTO NOMINA_DEPARTAMENTO (nomi_id, nodp_depto)VALUES(:IDNOMINA,:DEPTO);
 ITEMINI = ITEM;
 FOR SELECT E.TERC_NIT, E.empl_salario, e.empl_eps, e.empl_afc, e.empl_afp, e.empl_ccf, e.empl_dpto
 FROM EMPLEADOS E
 WHERE E.empl_ppago = :periodicidad AND ((E.empl_fecret IS NULL) or (E.empl_fecret > :fec)) AND E.empl_fecing <= :fec
 INTO :nite, :basico, :niteps, :nitafc, :nitafp, :nitccf, :deptoempl
 DO
 BEGIN
 IF ((depto = 0) OR (deptoempl = :depto)) THEN
 BEGIN
  FOR SELECT CE.TERC_NIT, CE.CONC_COD, CE.EMCO_MONTO, CE.EMCO_PORC, ce.empl_entidad, CE.emco_perprom, CE.emco_luquidaper, CE.emco_mensual, CN.CONC_COD, CN.CONC_DEDUC,CN.CONC_PORC, CN.CONC_ENTIDAD, CN.CONC_MONTO,  CN.CONC_DIAS, CN.CONC_MODIFI,
  CN.CONC_PROMEDIO, CN.conc_salario, CE.emco_perprom, CN.conc_prov, CN.conc_aporte, CN.conc_aplicaprom, cn.conc_otroconc, cn.conc_codotroconc, CN.conc_gtoempr, CN.conc_base, CE.emco_tomsal
  FROM empleado_conceptos CE, CONCEPTOS_NOMINA CN WHERE ((CE.terc_nit = :nite) AND (CE.CONC_COD = CN.CONC_COD) AND (CE.emco_fecini <= :fec AND CE.emco_fecfin >= :FEC) ) OR ((CE.terc_nit = :nite)
  AND (CE.CONC_COD = CN.CONC_COD) AND (cn.conc_todosper = 'N') AND (CE.emco_ppago = :periodo)) OR  ((CE.terc_nit = :nite) AND (CE.CONC_COD = CN.CONC_COD) AND cn.conc_todosper = 'S')  ORDER BY (TERC_NIT )
  INTO :nit_tercero, :concept,  :montos, :porcen, :entidad, :numeroprom, :liquidaper, :mensual ,:CONC_COD, :CONC_DEDUC, :CONC_PORC,
  :CONC_ENTIDAD, :CONC_MONTO, :CONC_DIAS, :CONC_MODIFI,:CONC_PROMEDIO, :salario,:EMCO_PERPROM, :conc_prov, :conc_aporte , :CONC_APLICAPROM, :conc_otroconc, :conc_codotroconc, :gtoempr, :base, :tomasal
  DO
  BEGIN
   IF (conc_dias = 'S') THEN
   EXECUTE PROCEDURE DIAS_LABORADOS (:nite, :periodo, :fec, :mensual,:conc_aporte) RETURNING_VALUES (:diaslab);
   ELSE
   BEGIN
    diaslab = 15;
    IF (mensual = 'S') THEN
    BEGIN
     IF (periodicidad = 2) THEN
     diaslab = 30;
     ELSE
     IF (liquidaper = 3) THEN
     diaslab = 30;
    END
   END
   IF (:tomasal <> 0) THEN
   BEGIN
    IF ((:periodicidad = 2) AND (:tomasal <> 2)) THEN
    BEGIN
     IF ((periodo = 2) OR (periodo = 4) OR (periodo = 6) OR (periodo = 8) OR (periodo = 10) OR (periodo = 12)
     OR (periodo = 14) OR (periodo = 16) OR (periodo = 18) OR (periodo = 20) OR (periodo = 22) OR (periodo = 24)) THEN
     basico = 0;
    END
    ELSE
    IF ((:periodicidad = 3) AND (:tomasal <> 1)) THEN
    BEGIN
     IF ((periodo = 1) OR (periodo = 5) OR (periodo = 9) OR (periodo = 13) OR (periodo = 17) OR (periodo = 21)
     OR (periodo = 25) OR (periodo = 29) OR (periodo = 33) OR (periodo = 37) OR (periodo = 41) OR (periodo = 45)
     OR (periodo = 49)) THEN
     basico = 0;
    END
    ELSE
     IF ((:periodicidad = 3) AND (:tomasal <> 2)) THEN
     BEGIN
      IF ((periodo = 2) OR (periodo = 6) OR (periodo = 10) OR (periodo = 14) OR (periodo = 18) OR (periodo = 22)
      OR (periodo = 26) OR (periodo = 30) OR (periodo = 34) OR (periodo = 38) OR (periodo = 42) OR (periodo = 46)
      OR (periodo = 50)) THEN
      basico = 0;
     END
     ELSE
     IF ((:periodicidad = 3) AND (:tomasal <> 3)) THEN
     BEGIN
      IF ((periodo = 3) OR (periodo = 7) OR (periodo = 11) OR (periodo = 15) OR (periodo = 19) OR (periodo = 23)
      OR (periodo = 27) OR (periodo = 31) OR (periodo = 35) OR (periodo = 39) OR (periodo = 43) OR (periodo = 47)
      OR (periodo = 51)) THEN
      basico = 0;
     END
     ELSE
     IF ((:periodicidad = 3) AND (:tomasal <> 4)) THEN
     BEGIN
      IF ((periodo = 4) OR (periodo = 8) OR (periodo = 12) OR (periodo = 16) OR (periodo = 20) OR (periodo = 24)
      OR (periodo = 29) OR (periodo = 32) OR (periodo = 36) OR (periodo = 40) OR (periodo = 44) OR (periodo = 48)
      OR (periodo = 52)) THEN
      basico = 0;
     END
   END
   ELSE
   BEGIN
    SELECT E.empl_salario FROM EMPLEADOS E WHERE E.terc_nit = :nite INTO :basico;
    SELECT ((n.nono_valor /30) * n.nono_dura), (n.nono_dura) FROM nomina_novedades n WHERE n.tnov_cod = 11 AND n.terc_nit = :nite AND n.nono_periodo = :periodo INTO :cambsaltrans, :duranov;
    IF (cambsaltrans IS NULL) THEN
    cambsaltrans = 0;
    IF (duranov IS NULL) THEN
    duranov = 0;
    diaslab = :diaslab - :duranov;
    IF (conc_cod = 922) THEN
    BEGIN
     SELECT SUM(P.prcu_monto) FROM prestamo_cuotas P, prestamo_nomina PN WHERE P.prcu_ano = :ano AND P.prcu_periodo = :periodo AND PN.prno_id = P.prno_id AND PN.terc_nit = :nite INTO :valor;
     IF (valor IS NULL) THEN
     valor = 0;
     item = :item + 1;
     UPDATE prestamo_cuotas  P SET prcu_ok = 'S' WHERE P.prcu_ano = :ano AND P.prcu_periodo = :periodo AND P.prno_id = (SELECT PN.prno_id FROM PRESTAMO_NOMINA PN WHERE PN.terc_nit = :nite);
    END
    ELSE
    IF ((:montos = 0) OR (:montos IS NULL)) THEN
    BEGIN
     IF ((CONC_PORC = 0 AND :porcen = 0) OR (CONC_PORC IS NULL AND :porcen = 0) OR (CONC_PORC = 0 AND :porcen IS NULL) OR (CONC_PORC IS NULL AND :porcen IS NULL) ) THEN
     BEGIN
      IF ((conc_monto <> 0) AND (conc_monto IS NOT NULL) ) THEN
      BEGIN
       VALOR = :CONC_MONTO;
       IF (:conc_dias = 'S') THEN
       valor = (:valor / 30) * :diaslab;
      END
      ELSE
      IF (salario = 'S' AND CONC_COD <> 900 AND CONC_COD <> 920) THEN
      BEGIN
       conc_monto = :basico;
       VALOR = (:conc_monto/30 * :diaslab ) + :cambsaltrans;
      END
      ELSE
      BEGIN
       valor = montos;
       IF (:conc_dias = 'S') THEN
       valor = (:valor / 30) * :diaslab;
      END
     END
     ELSE
     BEGIN
      IF (:porcen <> 0) THEN
      BEGIN
       IF ((conc_monto <> 0) AND (conc_monto IS NOT NULL) ) THEN
       BEGIN
        VALOR = ((:CONC_MONTO ) * :PORCEN) /100;
       END
      END
      ELSE
      BEGIN
       IF ((conc_monto <> 0) AND (conc_monto IS NOT NULL) ) THEN
       BEGIN
        VALOR = ((:CONC_MONTO) * :conc_porc) /100;
       END
       ELSE
       IF (salario = 'S' AND CONC_COD <> 900 AND CONC_COD <> 920) THEN
       BEGIN
        conc_monto = :basico;
        VALOR = ((:CONC_MONTO)+ :cambsaltrans * :conc_porc) /100;
       END
       ELSE
       IF (:conc_monto = 0 AND :montos = 0) THEN
       BEGIN
        conc_monto = :basico;
        VALOR = (((:CONC_MONTO / 30) * :diaslab) + :cambsaltrans * :conc_porc) /100;
       END
      END
     END
    END
    ELSE
    IF ((CONC_PORC = 0 OR (conc_porc IS NULL)) AND (:porcen = 0 OR (porcen IS NULL))) THEN
    BEGIN
     VALOR = (:montos);
     IF (:conc_dias = 'S') THEN
     valor = (:valor / 30) * :diaslab;
    END
    ELSE
    IF (:porcen <> 0 AND porcen IS NOT NULL) THEN
    BEGIN
     VALOR = ((:MONTOS ) * :PORCEN) /100;
    END
    ELSE
    BEGIN
     VALOR = ((:montos) * :CONC_PORC) /100;
    END
    IF (conc_promedio = 'S') THEN
    BEGIN
     perinicial = :periodo - (:numeroprom) + 1;
     anoprom = CAST (ano AS INTEGER);
     IF (perinicial <= 0) THEN
     BEGIN
      perinicial = 24 + :PERINICIAL;
      anoprom = CAST(ANO AS INTEGER) - 1;
     END
     SELECT SUM (noco_valor) FROM nomina_conceptos n WHERE n.noco_aplicaprom = 'S' AND N.noco_periodo >= :perinicial - 1 AND N.noco_periodo < :periodo AND N.noco_ano >= :anoprom AND N.noco_ano <= :ano AND terc_nit = :nite INTO :valor;
     valor = (valor / numeroprom);
     SELECT NOCO_VALOR FROM NOMINA_CONCEPTOS WHERE CONC_COD = :conc_cod AND TERC_NIT  = :nite AND NOCO_PAGOOK = 'N' AND NOCO_PERIODO = 0 INTO :saldosini;
     IF (saldosini IS NULL) THEN
     saldosini = 0;
     ELSE
     UPDATE nomina_conceptos N SET noco_pagook = 'S' WHERE n.noco_aplicaprom = 'S' AND N.noco_periodo >= :perinicial - 1 AND N.noco_periodo < :periodo AND N.noco_ano >= :anoprom AND N.noco_ano <= :ano  AND CONC_COD = :conc_cod AND terc_nit = :nite AND NOCO_PERIODO = 0;
     VALOR = :valor + :saldosini;
     UPDATE nomina_conceptos N SET noco_pagook = 'S' WHERE n.noco_aplicaprom = 'S' AND N.noco_periodo >= :perinicial - 1 AND N.noco_periodo < :periodo AND N.noco_ano >= :anoprom AND N.noco_ano <= :ano  AND CONC_COD = :conc_cod AND terc_nit = :nite;
    END
    ELSE
    IF (conc_otroconc = 'S') THEN
    BEGIN
     anosum = CAST(ano AS INTEGER);
     anosum = anosum - 1;
     SELECT SUM (noco_valor) FROM nomina_conceptos n WHERE n.noco_ano = :anosum AND n.conc_cod = :conc_codotroconc AND N.terc_nit = :nite INTO :valor;
     SELECT NOCO_VALOR FROM NOMINA_CONCEPTOS WHERE noco_ano = :anosum AND conc_cod = :conc_codotroconc AND terc_nit = :nite AND NOCO_PERIODO = 0 INTO :saldosini;
     IF (saldosini IS NULL) THEN
     saldosini = 0;
     ELSE
     UPDATE nomina_conceptos SET noco_pagook = 'S' WHERE noco_ano = :anosum AND conc_cod = :conc_codotroconc AND NOCO_PERIODO = 0 AND terc_nit = :nite;
     VALOR = :valor + :saldosini;
     UPDATE nomina_conceptos SET noco_pagook = 'S' WHERE noco_ano = :anosum AND conc_cod = :conc_codotroconc AND terc_nit = :nite;
    END
    ELSE
    IF (conc_aporte = 'S') THEN
    BEGIN
     horasex = NULL;
     diasnov = NULL;
     retroact = NULL;
     reembolso = NULL;
     IF ((:entidad = '' ) OR (entidad IS NULL)) THEN
     BEGIN
      SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
      IF (comision IS NULL) THEN
      comision = 0;
      SELECT C.emco_monto FROM EMPLEADO_CONCEPTOS C WHERE C.terc_nit = :nite AND C.conc_cod = 933 INTO :retroact;
      IF (retroact IS NULL ) THEN
      retroact = 0;
      SELECT C.emco_monto FROM EMPLEADO_CONCEPTOS C WHERE C.terc_nit = :nite AND C.conc_cod = 952 INTO :reembolso;
      IF (reembolso IS NULL ) THEN
      reembolso = 0;
      SELECT N.nono_dura FROM NOMINA_NOVEDADES N WHERE N.terc_nit = :nite AND N.nono_periodo = :periodo AND N.nono_ano = :ano AND (N.tnov_cod = 2 OR (N.tnov_cod = 3)) INTO :diasnov;
      IF (:diasnov IS NULL) THEN
      incap = 0;
      ELSE
      incap = (:basico / 30)* :diasnov;
      valor = :basico + :comision + :horasex + :retroact + :reembolso + :incap;
      IF ((conc_cod = 904) OR (conc_cod = 905) OR (conc_cod = 906)) THEN
      BEGIN
       entidad = :nitafp;
       IF (conc_cod = 904) THEN
       BEGIN
        SELECT A.paan_afptr FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
        SELECT N.nono_dura FROM NOMINA_NOVEDADES N WHERE N.terc_nit = :nite AND N.nono_periodo = :periodo AND N.nono_ano = :ano AND (N.tnov_cod = 2 OR (N.tnov_cod = 3)) INTO :diasnov;
        IF (:diasnov IS NULL) THEN
        incap = 0;
        ELSE
        incap = (:basico / 30)* :diasnov;
        SELECT c.noex_monto FROM nomina_horasext c WHERE c.noex_ano = :ano AND c.noex_periodio = :periodo AND c.noex_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :horasex;
        IF (horasex IS NOT NULL) THEN
        VALOR = (((((:basico )/30 * :diaslab ) + :comision + :horasex + :retroact+ :reembolso + :incap)+ :cambsaltrans ) * :PORCEN) /100;
        ELSE
        VALOR = ((((:basico)/30 * :diaslab ) + :comision + :retroact+ :reembolso + :cambsaltrans  + :incap) * :PORCEN) /100;
       END
       ELSE
       IF ((conc_cod = 905) OR (conc_cod = 906)) THEN
       BEGIN
        SELECT A.paan_afpem FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
        SELECT N.nono_dura FROM NOMINA_NOVEDADES N WHERE N.terc_nit = :nite AND N.nono_periodo = :periodo AND N.nono_ano = :ano AND (N.tnov_cod = 2 OR (N.tnov_cod = 3)) INTO :diasnov;
        IF (:diasnov IS NULL) THEN
        incap = 0;
        ELSE
        incap = (:basico / 30)* :diasnov;
        SELECT c.noex_monto FROM nomina_horasext c WHERE c.noex_ano = :ano AND c.noex_periodio = :periodo AND c.noex_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :horasex;
        IF (horasex IS NOT NULL) THEN
        VALOR = (((((:basico )/30 * :diaslab ) + :comision + :horasex + :retroact + :reembolso)+ :cambsaltrans + :incap) * :PORCEN) /100;
        ELSE
        VALOR = (((((:basico )/30 * :diaslab ) + :comision + :retroact + :reembolso)+ :cambsaltrans + :incap) * :PORCEN) /100;
       END
      END
      ELSE
      IF ((conc_cod = 907) OR (conc_cod = 914) OR (conc_cod = 915)) THEN
      BEGIN
       entidad = :niteps;
       IF (conc_cod = 907) THEN
       BEGIN
        SELECT A.paan_epstr FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
        SELECT N.nono_dura FROM NOMINA_NOVEDADES N WHERE N.terc_nit = :nite AND N.nono_periodo = :periodo AND N.nono_ano = :ano AND (N.tnov_cod = 2 OR (N.tnov_cod = 3)) INTO :diasnov;
        IF (:diasnov IS NULL) THEN
        incap = 0;
        ELSE
        incap = (:basico / 30)* :diasnov;
        SELECT c.noex_monto FROM nomina_horasext c WHERE c.noex_ano = :ano AND c.noex_periodio = :periodo AND c.noex_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :horasex;
        IF (horasex IS NOT NULL) THEN
        VALOR = (((((:basico )/30 * :diaslab ) + :comision + :horasex + :retroact + :reembolso)+ :cambsaltrans + :incap) * :PORCEN) /100;
        ELSE
        VALOR = (((((:basico )/30 * :diaslab ) + :comision + :retroact + :reembolso)+ :cambsaltrans + :incap) * :PORCEN) /100;
       END
       ELSE
       IF ((conc_cod = 914) OR (conc_cod = 915)) THEN
       BEGIN
        SELECT A.paan_epsem FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
        SELECT N.nono_dura FROM NOMINA_NOVEDADES N WHERE N.terc_nit = :nite AND N.nono_periodo = :periodo AND N.nono_ano = :ano AND (N.tnov_cod = 2 OR (N.tnov_cod = 3)) INTO :diasnov;
        IF (:diasnov IS NULL) THEN
        incap = 0;
        ELSE
        incap = (:basico / 30)* :diasnov;
        SELECT c.noex_monto FROM nomina_horasext c WHERE c.noex_ano = :ano AND c.noex_periodio = :periodo AND c.noex_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :horasex;
        IF (horasex IS NOT NULL) THEN
        VALOR = (((((:basico )/30 * :diaslab ) + :comision + :horasex + :retroact + :reembolso)+ :cambsaltrans + :incap) * :PORCEN) /100;
        ELSE
        VALOR = (((((:basico )/30 * :diaslab ) + :comision + :retroact + :reembolso)+ :cambsaltrans + :incap) * :PORCEN) /100;
       END
      END
      ELSE
      IF ((conc_cod = 910) OR (conc_cod = 911) OR (conc_cod = 916) OR (conc_cod = 917) OR (conc_cod = 918) OR (conc_cod = 919)) THEN
      BEGIN
       entidad = :nitccf;
       SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
       IF (comision IS NULL) THEN
       comision = 0;
       SELECT N.nono_dura FROM NOMINA_NOVEDADES N WHERE N.terc_nit = :nite AND N.nono_periodo = :periodo AND N.nono_ano = :ano AND (N.tnov_cod = 2 OR (N.tnov_cod = 3)) INTO :diasnov;
       IF (:diasnov IS NULL) THEN
       incap = 0;
       ELSE
       incap = (:basico / 30)* :diasnov;
       IF ((conc_cod = 910) OR (conc_cod = 911) ) THEN
       BEGIN
        SELECT A.paan_ccf FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
      SELECT N.nono_dura FROM NOMINA_NOVEDADES N WHERE N.terc_nit = :nite AND N.nono_periodo = :periodo AND N.nono_ano = :ano AND (N.tnov_cod = 2 OR (N.tnov_cod = 3)) INTO :diasnov;
      IF (:diasnov IS NULL) THEN
      incap = 0;
      ELSE
      incap = (:basico / 30)* :diasnov;
        SELECT c.noex_monto FROM nomina_horasext c WHERE c.noex_ano = :ano AND c.noex_periodio = :periodo AND c.noex_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :horasex;
        IF (horasex IS NOT NULL) THEN
        VALOR = (((((:basico )/30 * :diaslab ) + :comision + :horasex + :retroact + :reembolso)+ :cambsaltrans + :incap) * :PORCEN) /100;
        ELSE
        VALOR = (((((:basico )/30 * :diaslab ) + :comision + :retroact + :reembolso)+ :cambsaltrans + :incap) * :PORCEN) /100;
       END
       ELSE
       IF ((conc_cod = 916) OR (conc_cod = 917)) THEN
       BEGIN
        SELECT A.paan_icbf FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
      SELECT N.nono_dura FROM NOMINA_NOVEDADES N WHERE N.terc_nit = :nite AND N.nono_periodo = :periodo AND N.nono_ano = :ano AND (N.tnov_cod = 2 OR (N.tnov_cod = 3)) INTO :diasnov;
      IF (:diasnov IS NULL) THEN
      incap = 0;
      ELSE
      incap = (:basico / 30)* :diasnov;
      SELECT N.nono_dura FROM NOMINA_NOVEDADES N WHERE N.terc_nit = :nite AND N.nono_periodo = :periodo AND N.nono_ano = :ano AND (N.tnov_cod = 2 OR (N.tnov_cod = 3)) INTO :diasnov;
      IF (:diasnov IS NULL) THEN
      incap = 0;
      ELSE
      incap = (:basico / 30)* :diasnov;
        SELECT c.noex_monto FROM nomina_horasext c WHERE c.noex_ano = :ano AND c.noex_periodio = :periodo AND c.noex_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :horasex;
        IF (horasex IS NOT NULL) THEN
        VALOR = (((((:basico )/30 * :diaslab ) + :comision + :horasex + :retroact + :reembolso)+ :cambsaltrans + :incap) * :PORCEN) /100;
        ELSE
        VALOR = (((((:basico )/30 * :diaslab ) + :comision + :retroact + :reembolso)+ :cambsaltrans + :incap) * :PORCEN) /100;
       END
       ELSE
       IF ((conc_cod = 918) OR (conc_cod = 919)) THEN
       BEGIN
        SELECT A.paan_sena FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
      SELECT N.nono_dura FROM NOMINA_NOVEDADES N WHERE N.terc_nit = :nite AND N.nono_periodo = :periodo AND N.nono_ano = :ano AND (N.tnov_cod = 2 OR (N.tnov_cod = 3)) INTO :diasnov;
      IF (:diasnov IS NULL) THEN
      incap = 0;
      ELSE
      incap = (:basico / 30)* :diasnov;
        SELECT c.noex_monto FROM nomina_horasext c WHERE c.noex_ano = :ano AND c.noex_periodio = :periodo AND c.noex_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :horasex;
        IF (horasex IS NOT NULL) THEN
        VALOR = (((((:basico )/30 * :diaslab ) + :comision + :horasex + :retroact + :reembolso)+ :cambsaltrans + :incap) * :PORCEN) /100;
        ELSE
        VALOR = (((((:basico )/30 * :diaslab ) + :comision + :retroact + :reembolso)+ :cambsaltrans + :incap) * :PORCEN) /100;
       END
      END
      ELSE
      IF ((conc_cod = 912) OR (conc_cod = 913)) THEN
      BEGIN
       entidad = :nitafc;
       SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
       IF (comision IS NULL) THEN
       comision = 0;
      SELECT N.nono_dura FROM NOMINA_NOVEDADES N WHERE N.terc_nit = :nite AND N.nono_periodo = :periodo AND N.nono_ano = :ano AND (N.tnov_cod = 2 OR (N.tnov_cod = 3)) INTO :diasnov;
      IF (:diasnov IS NULL) THEN
      incap = 0;
      ELSE
      incap = (:basico / 30)* :diasnov;
       IF ((conc_cod = 912) OR (conc_cod = 913) ) THEN
       BEGIN
        SELECT A.paan_cesemp FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
        SELECT c.noex_monto FROM nomina_horasext c WHERE c.noex_ano = :ano AND c.noex_periodio = :periodo AND c.noex_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :horasex;
        IF (horasex IS NOT NULL) THEN
        VALOR = (((((:basico )/30 * :diaslab ) + :comision + :horasex + :retroact+ :reembolso)+ :cambsaltrans + :incap) * :PORCEN) /100;
        ELSE
        VALOR = (((((:basico )/30 * :diaslab ) + :comision + :retroact + :reembolso)+ :cambsaltrans + :incap) * :PORCEN) /100;
       END
      END
      ELSE
      BEGIN
       IF (comision IS NULL) THEN
       comision = 0;
       SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
       conc_monto = :basico + :comision;
       IF (conc_porc <> 0 AND conc_porc IS NOT NULL) THEN
       VALOR = (((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans + :incap) * :conc_porc) /100;
       ELSE
       IF (:porcen <> 0 AND :porcen IS NOT NULL) THEN
       VALOR = (((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans + :incap) * :porcen) /100;
       ELSE
       IF (:montos <> 0 AND :montos IS NOT NULL) THEN
       valor = :montos;
       ELSE
       IF (:conc_monto <> 0 AND :conc_monto IS NOT NULL) THEN
       valor = :conc_monto;
      END
     END
     item = :item + 1;
    END
    ELSE
    IF (conc_prov = 'S') THEN
    BEGIN
     conc_monto = :basico;
     IF (conc_porc <> 0 AND conc_porc IS NOT NULL) THEN
     VALOR = (((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans + :incap) * :conc_porc) /100;
     ELSE
     IF (porcen <> 0 AND porcen IS NOT NULL) THEN
     VALOR = (((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans + :incap) * :porcen) /100;
     ELSE
     IF (montos <> 0 AND montos IS NOT NULL) THEN
     VALOR = :montos;
     ELSE
     IF (conc_monto <> 0 AND conc_monto IS NOT NULL) THEN
     VALOR = :conc_monto;
     item = :item + 1;
    END
    ELSE
    IF (conc_cod = 920) THEN
    BEGIN
     SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :valor;
     IF (valor IS NULL) THEN
     valor = 0;
     item = :item + 1;
    END
    ELSE
    IF (conc_cod = 900 OR (:conc_cod = 931)) THEN
    BEGIN
     SELECT c.noex_monto FROM nomina_horasext c WHERE c.noex_ano = :ano AND c.noex_periodio = :periodo AND c.noex_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :valor;
     IF (valor IS NULL) THEN
     valor = 0;
     item = :item + 1;
    END
    ELSE
    IF (conc_cod = 932) THEN
    BEGIN
     SELECT N.nono_dura FROM NOMINA_NOVEDADES N WHERE N.terc_nit = :nite AND N.nono_periodo = :periodo AND N.nono_ano = :ano AND (N.tnov_cod = 2 OR (N.tnov_cod = 3)) INTO :diasnov;
     IF (:diasnov IS NULL) THEN
     valor = 0;
     ELSE
     valor = (:basico / 30)* :diasnov;
    END
    ELSE
    IF (conc_cod = 921) THEN
    BEGIN
     IF (porcen IS NOT NULL AND porcen <> 0) THEN
     valor = ((basico / 30)* :diaslab ) * :PORCEN /100;
     ELSE
     IF (conc_porc IS NOT NULL AND conc_porc <> 0) THEN
     valor = ((basico / 30)* :diaslab ) * :conc_porc /100;
    END
    EXECUTE PROCEDURE LEE_CONFIGURACION('NOMINA','GENERAL','REDONDEO AL MULTIPLO DE DIEZ EN TOTALES')RETURNING_VALUES(:aprox);
    EXECUTE PROCEDURE REDONDEE(:valor, :aprox) RETURNING_VALUES (VALOR);
    IF ((mensual = 'N') OR (periodicidad = 1))  THEN
    INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
    VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
    ELSE
    IF (mensual = 'S') THEN
    BEGIN
     IF ((:periodicidad = 2) AND (liquidaper = 1)) THEN
     BEGIN
      IF ((periodo = 1) OR (periodo = 3) OR (periodo = 5) OR (periodo = 7) OR (periodo = 9) OR (periodo = 11)
      OR (periodo = 13) OR (periodo = 15) OR (periodo = 17) OR (periodo = 19) OR (periodo = 21) OR (periodo = 23)) THEN
      INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
      VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
     END
     ELSE
     IF ((:periodicidad = 2) AND (liquidaper = 2)) THEN
     BEGIN
      IF ((periodo = 2) OR (periodo = 4) OR (periodo = 6) OR (periodo = 8) OR (periodo = 10) OR (periodo = 12)
      OR (periodo = 14) OR (periodo = 16) OR (periodo = 18) OR (periodo = 20) OR (periodo = 22) OR (periodo = 24)) THEN
      INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
      VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
     END
     ELSE
     IF ((:periodicidad = 3) AND (liquidaper = 1)) THEN
     BEGIN
      IF ((periodo = 1) OR (periodo = 5) OR (periodo = 9) OR (periodo = 13) OR (periodo = 17) OR (periodo = 21)
      OR (periodo = 25) OR (periodo = 29) OR (periodo = 33) OR (periodo = 37) OR (periodo = 41) OR (periodo = 45)
      OR (periodo = 49)) THEN
      INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
      VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
    END
    ELSE
     IF ((:periodicidad = 3) AND (liquidaper = 2)) THEN
     BEGIN
      IF ((periodo = 2) OR (periodo = 6) OR (periodo = 10) OR (periodo = 14) OR (periodo = 18) OR (periodo = 22)
      OR (periodo = 26) OR (periodo = 30) OR (periodo = 34) OR (periodo = 38) OR (periodo = 42) OR (periodo = 46)
      OR (periodo = 50)) THEN
      INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
      VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
     END
     ELSE
     IF ((:periodicidad = 3) AND (liquidaper = 3)) THEN
     BEGIN
      IF ((periodo = 3) OR (periodo = 7) OR (periodo = 11) OR (periodo = 15) OR (periodo = 19) OR (periodo = 23)
      OR (periodo = 27) OR (periodo = 31) OR (periodo = 35) OR (periodo = 39) OR (periodo = 43) OR (periodo = 47)
      OR (periodo = 51)) THEN
      INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
      VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
     END
     ELSE
     IF ((:periodicidad = 3) AND (liquidaper = 4)) THEN
     BEGIN
      IF ((periodo = 4) OR (periodo = 8) OR (periodo = 12) OR (periodo = 16) OR (periodo = 20) OR (periodo = 24)
      OR (periodo = 29) OR (periodo = 32) OR (periodo = 36) OR (periodo = 40) OR (periodo = 44) OR (periodo = 48)
      OR (periodo = 52)) THEN
      INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
      VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
     END
    END
  VALOR = 0;
  basico = 0;
   END
  END
 END
 END
 SUSPEND;
END
^


SET TERM ; ^

UPDATE REVISION R SET R.revi_nomina = '2009/05/18';
SET TERM ^ ;

CREATE OR ALTER PROCEDURE LIQUIDACION_EMPLEADO(
    NITEMPL VARCHAR(20),
    FECLIQ DATE,
    DIASLABORADOS INTEGER)
RETURNS (
    PRIMA NUMERIC(18,2),
    CESANTIA NUMERIC(18,2),
    INTCESANT NUMERIC(18,2),
    VACACION NUMERIC(18,2),
    SUELDO NUMERIC(18,2),
    AUXTRANSP NUMERIC(18,2),
    EPSEMPL NUMERIC(18,2),
    AFPEMPL NUMERIC(18,2),
    DSPRESTAMO NUMERIC(18,2),
    EMPREPS NUMERIC(18,2),
    EMPRAFP NUMERIC(18,2),
    EMPRARP NUMERIC(18,2),
    EMPRCCF NUMERIC(18,2),
    EMPRSENA NUMERIC(18,2),
    EMPRICBF NUMERIC(18,2),
    TOTPAGOS NUMERIC(18,2),
    TOTDESC NUMERIC(18,2),
    TOTAL NUMERIC(18,2),
    TOTEMPR NUMERIC(18,2))
AS
DECLARE VARIABLE salario NUMERIC(18,2);
DECLARE VARIABLE porcepsempl NUMERIC(9,4);
DECLARE VARIABLE porcafpempl NUMERIC(9,4);
DECLARE VARIABLE auxt NUMERIC(18,2);
DECLARE VARIABLE pempreps NUMERIC(9,4);
DECLARE VARIABLE pemprafp NUMERIC(9,4);
DECLARE VARIABLE pemprarp NUMERIC(9,4);
DECLARE VARIABLE pemprccf NUMERIC(9,4);
DECLARE VARIABLE pemprsena NUMERIC(9,4);
DECLARE VARIABLE pempricbf NUMERIC(9,4);
DECLARE VARIABLE SMLV NUMERIC(18,2);
BEGIN
SELECT E.empl_salario FROM EMPLEADOS E WHERE TERC_NIT = :nitempl INTO :salario;
sueldo = (:salario / 30) * :diaslaborados;
EXECUTE PROCEDURE REDONDEE(:SUELDO, -2) RETURNING_VALUES (:sueldo);

SELECT SUM (NOCO_VALOR) FROM NOMINA_CONCEPTOS WHERE TERC_NIT = :nitempl AND ((conc_cod = 925) OR (conc_cod = 927) OR (conc_cod = 926) OR (conc_cod = 928)) AND NOCO_PAGOOK = 'N' INTO :prima;
IF (prima IS NULL) THEN
prima = 0;
prima = :prima + ((:salario / 12)/ 30) * :diaslaborados;
EXECUTE PROCEDURE REDONDEE(:prima, -1) RETURNING_VALUES (:prima);

SELECT SUM (NOCO_VALOR) FROM NOMINA_CONCEPTOS WHERE TERC_NIT = :nitempl AND ((conc_cod = 912) OR (conc_cod = 913)) AND NOCO_PAGOOK = 'N' INTO :cesantia;
IF (cesantia IS NULL) THEN
cesantia = 0;
cesantia = :cesantia + ((:salario / 12)/ 30) * :diaslaborados;
EXECUTE PROCEDURE REDONDEE(:cesantia, -2) RETURNING_VALUES (:cesantia);

SELECT SUM (NOCO_VALOR) FROM NOMINA_CONCEPTOS WHERE TERC_NIT = :nitempl AND ((conc_cod = 923) OR (conc_cod = 924)) AND NOCO_PAGOOK = 'N' INTO :intcesant;
IF (intcesant IS NULL) THEN
intcesant = 0;
intcesant = ((((:salario / 12)/ 30) * :diaslaborados)*1/ 100)+ :intcesant;
EXECUTE PROCEDURE REDONDEE(:intcesant, -2) RETURNING_VALUES (:intcesant);

SELECT SUM (NOCO_VALOR) FROM NOMINA_CONCEPTOS WHERE TERC_NIT = :nitempl AND ((conc_cod = 929) OR (conc_cod = 930)) AND NOCO_PAGOOK = 'N' INTO :vacacion;
IF (vacacion IS NULL) THEN
vacacion = 0;
vacacion = :vacacion + ((:salario / 12)/ 30) * :diaslaborados;
EXECUTE PROCEDURE REDONDEE(:vacacion, -2) RETURNING_VALUES (:vacacion);

SELECT P.paan_epstr FROM PARAMETROS_ANO P WHERE P.paan_ano = SUBSTR(:fecliq, 1,4) INTO :porcepsempl;
epsempl = (sueldo * :porcepsempl) / 100;
EXECUTE PROCEDURE REDONDEE(:epsempl, -2) RETURNING_VALUES (:epsempl);

SELECT P.paan_afptr FROM PARAMETROS_ANO P WHERE P.paan_ano = SUBSTR(:fecliq, 1,4) INTO :porcafpempl;
afpempl = (sueldo * :porcafpempl) / 100;
EXECUTE PROCEDURE REDONDEE(:afpempl, -2) RETURNING_VALUES (:afpempl);

SELECT P.paan_auxtr FROM PARAMETROS_ANO P WHERE P.paan_ano = SUBSTR(:fecliq, 1,4) INTO :auxt;
SELECT P.paan_auxtr, P.paan_salminimo FROM PARAMETROS_ANO P WHERE P.paan_ano = SUBSTR(:fecliq, 1,4) INTO :auxtransp, :smlv;
IF (:salario < (:smlv*2)) THEN
 auxtransp = (:auxtransp / 30) * :diaslaborados;
ELSE
 auxtransp = 0;
EXECUTE PROCEDURE REDONDEE(:auxtransp, -2) RETURNING_VALUES (:auxtransp);

SELECT SUM (PRCU_MONTO) FROM PRESTAMO_CUOTAS P, PRESTAMO_NOMINA PN WHERE PN.prno_id = P.prno_id AND PN.terc_nit = :nitempl AND P.prcu_ok = 'N' INTO :dsprestamo;
IF (dsprestamo IS NULL) THEN
dsprestamo = 0;

SELECT P.paan_epsem FROM PARAMETROS_ANO P WHERE P.paan_ano = SUBSTR(:fecliq, 1,4) INTO :pempreps;
empreps = (sueldo * :pempreps) / 100;
EXECUTE PROCEDURE REDONDEE(:empreps, -2) RETURNING_VALUES (:empreps);

SELECT P.paan_afpem FROM PARAMETROS_ANO P WHERE P.paan_ano = SUBSTR(:fecliq, 1,4) INTO :pemprafp;
emprafp = (sueldo * :pemprafp) / 100;
EXECUTE PROCEDURE REDONDEE(:emprafp, -2) RETURNING_VALUES (:emprafp);

SELECT P.dpto_tararp FROM DEPARTAMENTO P, EMPLEADOS E WHERE P.dpto_cod = E.empl_dpto AND E.terc_nit = :nitempl INTO :pemprarp;
emprarp = (sueldo * :pemprarp) / 100;
EXECUTE PROCEDURE REDONDEE(:emprarp, -2) RETURNING_VALUES (:emprarp);

SELECT P.paan_ccf FROM PARAMETROS_ANO P WHERE P.paan_ano = SUBSTR(:fecliq, 1,4) INTO :pemprccf;
emprccf = (sueldo * :pemprccf) / 100;
EXECUTE PROCEDURE REDONDEE(:emprccf, -2) RETURNING_VALUES (:emprccf);

SELECT P.paan_sena FROM PARAMETROS_ANO P WHERE P.paan_ano = SUBSTR(:fecliq, 1,4) INTO :pemprsena;
emprsena = (sueldo * :pemprsena) / 100;
EXECUTE PROCEDURE REDONDEE(:emprsena, -2) RETURNING_VALUES (:emprsena);

SELECT P.paan_icbf FROM PARAMETROS_ANO P WHERE P.paan_ano = SUBSTR(:fecliq, 1,4) INTO :pempricbf;
empricbf = (sueldo * :pempricbf) / 100;
EXECUTE PROCEDURE REDONDEE(:empricbf, -2) RETURNING_VALUES (:empricbf);

totpagos = :PRIMA + :CESANTIA + :INTCESANT + :VACACION + :SUELDO + :AUXTRANSP;
totdesc = :EPSEMPL + :AFPEMPL + :DSPRESTAMO;
total = :totpagos - :totdesc;
totempr = :EMPREPS + :EMPRAFP + :EMPRARP + :EMPRCCF + :EMPRSENA + :EMPRICBF;
SUSPEND;
END
^

SET TERM ; ^


SET TERM ^ ;

CREATE OR ALTER PROCEDURE CAUSA_NOMINA (
    fec date,
    periodo integer,
    periodicidad integer,
    pagoglobal char(1),
    ano char(4),
    depto integer)
returns (
    idnomina integer,
    itemini integer)
as
declare variable item integer;
declare variable nite varchar(20) character set none;
declare variable nit_tercero varchar(20);
declare variable concept integer;
declare variable montos numeric(18,2);
declare variable porcen numeric(9,4);
declare variable entidad varchar(20);
declare variable conc_cod integer;
declare variable conc_deduc char(1);
declare variable conc_porc numeric(9,4);
declare variable conc_entidad integer;
declare variable conc_monto numeric(18,2);
declare variable conc_modifi char(1);
declare variable conc_promedio char(1);
declare variable emco_perprom integer;
declare variable valor numeric(18,2);
declare variable diaslab integer;
declare variable conc_prov char(1);
declare variable conc_aporte char(1);
declare variable numeroprom integer;
declare variable conc_aplicaprom char(1);
declare variable perinicial integer;
declare variable anoprom integer;
declare variable conc_dias char(1);
declare variable conc_otroconc char(1);
declare variable conc_codotroconc integer;
declare variable anosum integer;
declare variable salario char(1) character set none;
declare variable liquidaper integer;
declare variable rmod numeric(2,2);
declare variable basico numeric(18,2);
declare variable niteps varchar(20);
declare variable nitafc varchar(20);
declare variable nitafp varchar(20);
declare variable nitccf varchar(20);
declare variable gtoempr char(1);
declare variable comision numeric(18,2);
declare variable cambsaltrans numeric(18,2);
declare variable saldosini numeric(18,2);
declare variable duranov integer;
declare variable base numeric(18,2);
declare variable aprox integer;
declare variable mensual char(1);
declare variable horasex numeric(18,2);
declare variable diasnov integer;
declare variable tomasal integer;
declare variable retroact numeric(18,2);
declare variable reembolso numeric(18,2);
declare variable incap numeric(18,2);
declare variable deptoempl integer;
declare variable auxtrans numeric(18,2);
declare variable smlv numeric(18,2);
BEGIN
 SELECT N.NOMI_ID FROM NOMINA N WHERE N.nomi_periodo = :periodo AND N.nomi_periodocidad = :periodicidad AND N.nomi_ano = :ano
 INTO :IDNOMINA;
 IF (:idnomina IS NULL) THEN
 BEGIN
  EXECUTE PROCEDURE cambie_id_nomina RETURNING_VALUES(:idnomina);
  INSERT INTO nomina (nomi_id, NOMI_FECCAUSA, NOMI_PAGOGLOBAL, NOMI_PERIODOCIDAD, NOMI_PERIODO, NOMI_ANO, NOMI_LIQOK)
  VALUES (:IDNOMINA, :fec,:pagoglobal, :periodicidad, :periodo, :ano, 'N');
  item = 1;
 END
 ELSE
 BEGIN
  SELECT MAX(N.noco_item) FROM NOMINA_CONCEPTOS N WHERE N.nomi_id = :idnomina
  INTO :item;
 END
 IF (DEPTO = 0) THEN
  INSERT INTO NOMINA_DEPARTAMENTO (nomi_id, nodp_depto)VALUES(:IDNOMINA,0);
 ELSE
  INSERT INTO NOMINA_DEPARTAMENTO (nomi_id, nodp_depto)VALUES(:IDNOMINA,:DEPTO);
 ITEMINI = ITEM;
 FOR SELECT E.TERC_NIT, E.empl_salario, e.empl_eps, e.empl_afc, e.empl_afp, e.empl_ccf, e.empl_dpto
 FROM EMPLEADOS E
 WHERE E.empl_ppago = :periodicidad AND ((E.empl_fecret IS NULL) OR (E.empl_fecret > :fec)) AND E.empl_fecing <= :fec
 INTO :nite, :basico, :niteps, :nitafc, :nitafp, :nitccf, :deptoempl
 DO
 BEGIN
 IF ((depto = 0) OR (deptoempl = :depto)) THEN
 BEGIN
  FOR SELECT CE.TERC_NIT, CE.CONC_COD, CE.EMCO_MONTO, CE.EMCO_PORC, ce.empl_entidad, CE.emco_perprom, CE.emco_luquidaper, CE.emco_mensual, CN.CONC_COD, CN.CONC_DEDUC,CN.CONC_PORC, CN.CONC_ENTIDAD, CN.CONC_MONTO,  CN.CONC_DIAS, CN.CONC_MODIFI,
  CN.CONC_PROMEDIO, CN.conc_salario, CE.emco_perprom, CN.conc_prov, CN.conc_aporte, CN.conc_aplicaprom, cn.conc_otroconc, cn.conc_codotroconc, CN.conc_gtoempr, CN.conc_base, CE.emco_tomsal
  FROM empleado_conceptos CE, CONCEPTOS_NOMINA CN WHERE ((CE.terc_nit = :nite) AND (CE.CONC_COD = CN.CONC_COD) AND (CE.emco_fecini <= :fec AND CE.emco_fecfin >= :FEC) ) OR ((CE.terc_nit = :nite)
  AND (CE.CONC_COD = CN.CONC_COD) AND (cn.conc_todosper = 'N') AND (CE.emco_ppago = :periodo)) OR  ((CE.terc_nit = :nite) AND (CE.CONC_COD = CN.CONC_COD) AND cn.conc_todosper = 'S')  ORDER BY (TERC_NIT )
  INTO :nit_tercero, :concept,  :montos, :porcen, :entidad, :numeroprom, :liquidaper, :mensual ,:CONC_COD, :CONC_DEDUC, :CONC_PORC,
  :CONC_ENTIDAD, :CONC_MONTO, :CONC_DIAS, :CONC_MODIFI,:CONC_PROMEDIO, :salario,:EMCO_PERPROM, :conc_prov, :conc_aporte , :CONC_APLICAPROM, :conc_otroconc, :conc_codotroconc, :gtoempr, :base, :tomasal
  DO
  BEGIN
   IF (conc_dias = 'S') THEN
   EXECUTE PROCEDURE DIAS_LABORADOS (:nite, :periodo, :fec, :mensual,:conc_aporte) RETURNING_VALUES (:diaslab);
   ELSE
   BEGIN
    diaslab = 15;
    IF (mensual = 'S') THEN
    BEGIN
     IF (periodicidad = 2) THEN
     diaslab = 30;
     ELSE
     IF (liquidaper = 3) THEN
     diaslab = 30;
    END
   END
   IF (:tomasal <> 0) THEN
   BEGIN
    IF ((:periodicidad = 2) AND (:tomasal <> 2)) THEN
    BEGIN
     IF ((periodo = 2) OR (periodo = 4) OR (periodo = 6) OR (periodo = 8) OR (periodo = 10) OR (periodo = 12)
     OR (periodo = 14) OR (periodo = 16) OR (periodo = 18) OR (periodo = 20) OR (periodo = 22) OR (periodo = 24)) THEN
     basico = 0;
    END
    ELSE
    IF ((:periodicidad = 3) AND (:tomasal <> 1)) THEN
    BEGIN
     IF ((periodo = 1) OR (periodo = 5) OR (periodo = 9) OR (periodo = 13) OR (periodo = 17) OR (periodo = 21)
     OR (periodo = 25) OR (periodo = 29) OR (periodo = 33) OR (periodo = 37) OR (periodo = 41) OR (periodo = 45)
     OR (periodo = 49)) THEN
     basico = 0;
    END
    ELSE
     IF ((:periodicidad = 3) AND (:tomasal <> 2)) THEN
     BEGIN
      IF ((periodo = 2) OR (periodo = 6) OR (periodo = 10) OR (periodo = 14) OR (periodo = 18) OR (periodo = 22)
      OR (periodo = 26) OR (periodo = 30) OR (periodo = 34) OR (periodo = 38) OR (periodo = 42) OR (periodo = 46)
      OR (periodo = 50)) THEN
      basico = 0;
     END
     ELSE
     IF ((:periodicidad = 3) AND (:tomasal <> 3)) THEN
     BEGIN
      IF ((periodo = 3) OR (periodo = 7) OR (periodo = 11) OR (periodo = 15) OR (periodo = 19) OR (periodo = 23)
      OR (periodo = 27) OR (periodo = 31) OR (periodo = 35) OR (periodo = 39) OR (periodo = 43) OR (periodo = 47)
      OR (periodo = 51)) THEN
      basico = 0;
     END
     ELSE
     IF ((:periodicidad = 3) AND (:tomasal <> 4)) THEN
     BEGIN
      IF ((periodo = 4) OR (periodo = 8) OR (periodo = 12) OR (periodo = 16) OR (periodo = 20) OR (periodo = 24)
      OR (periodo = 29) OR (periodo = 32) OR (periodo = 36) OR (periodo = 40) OR (periodo = 44) OR (periodo = 48)
      OR (periodo = 52)) THEN
      basico = 0;
     END
   END
   ELSE
   BEGIN
    SELECT E.empl_salario FROM EMPLEADOS E WHERE E.terc_nit = :nite INTO :basico;
    SELECT ((n.nono_valor /30) * n.nono_dura), (n.nono_dura) FROM nomina_novedades n WHERE n.tnov_cod = 11 AND n.terc_nit = :nite AND n.nono_periodo = :periodo INTO :cambsaltrans, :duranov;
    IF (cambsaltrans IS NULL) THEN
    cambsaltrans = 0;
    IF (duranov IS NULL) THEN
    duranov = 0;
    diaslab = :diaslab - :duranov;
    IF (conc_cod = 922) THEN
    BEGIN
     SELECT SUM(P.prcu_monto) FROM prestamo_cuotas P, prestamo_nomina PN WHERE P.prcu_ano = :ano AND P.prcu_periodo = :periodo AND PN.prno_id = P.prno_id AND PN.terc_nit = :nite INTO :valor;
     IF (valor IS NULL) THEN
     valor = 0;
     item = :item + 1;
     UPDATE prestamo_cuotas  P SET prcu_ok = 'S' WHERE P.prcu_ano = :ano AND P.prcu_periodo = :periodo AND P.prno_id = (SELECT PN.prno_id FROM PRESTAMO_NOMINA PN WHERE PN.terc_nit = :nite);
    END
    ELSE
    IF ((:montos = 0) OR (:montos IS NULL)) THEN
    BEGIN
     IF ((CONC_PORC = 0 AND :porcen = 0) OR (CONC_PORC IS NULL AND :porcen = 0) OR (CONC_PORC = 0 AND :porcen IS NULL) OR (CONC_PORC IS NULL AND :porcen IS NULL) ) THEN
     BEGIN
      IF ((conc_monto <> 0) AND (conc_monto IS NOT NULL) ) THEN
      BEGIN
       VALOR = :CONC_MONTO;
       IF (:conc_dias = 'S') THEN
       valor = (:valor / 30) * :diaslab;
      END
      ELSE
      IF (salario = 'S' AND CONC_COD <> 900 AND CONC_COD <> 920) THEN
      BEGIN
       conc_monto = :basico;
       VALOR = (:conc_monto/30 * :diaslab ) + :cambsaltrans;
      END
      ELSE
      BEGIN
       valor = montos;
       IF (:conc_dias = 'S') THEN
       valor = (:valor / 30) * :diaslab;
      END
     END
     ELSE
     BEGIN
      IF (:porcen <> 0) THEN
      BEGIN
       IF ((conc_monto <> 0) AND (conc_monto IS NOT NULL) ) THEN
       BEGIN
        VALOR = ((:CONC_MONTO ) * :PORCEN) /100;
       END
      END
      ELSE
      BEGIN
       IF ((conc_monto <> 0) AND (conc_monto IS NOT NULL) ) THEN
       BEGIN
        VALOR = ((:CONC_MONTO) * :conc_porc) /100;
       END
       ELSE
       IF (salario = 'S' AND CONC_COD <> 900 AND CONC_COD <> 920) THEN
       BEGIN
        conc_monto = :basico;
        VALOR = ((:CONC_MONTO)+ :cambsaltrans * :conc_porc) /100;
       END
       ELSE
       IF (:conc_monto = 0 AND :montos = 0) THEN
       BEGIN
        conc_monto = :basico;
        VALOR = (((:CONC_MONTO / 30) * :diaslab) + :cambsaltrans * :conc_porc) /100;
       END
      END
     END
    END
    ELSE
    IF ((CONC_PORC = 0 OR (conc_porc IS NULL)) AND (:porcen = 0 OR (porcen IS NULL))) THEN
    BEGIN
     VALOR = (:montos);
     IF (:conc_dias = 'S') THEN
     valor = (:valor / 30) * :diaslab;
    END
    ELSE
    IF (:porcen <> 0 AND porcen IS NOT NULL) THEN
    BEGIN
     VALOR = ((:MONTOS ) * :PORCEN) /100;
    END
    ELSE
    BEGIN
     VALOR = ((:montos) * :CONC_PORC) /100;
    END
    IF (conc_promedio = 'S') THEN
    BEGIN
     perinicial = :periodo - (:numeroprom) + 1;
     anoprom = CAST (ano AS INTEGER);
     IF (perinicial <= 0) THEN
     BEGIN
      perinicial = 1;
      anoprom = CAST(ANO AS INTEGER) - 1;
     END
     SELECT SUM (noco_valor) FROM nomina_conceptos n WHERE n.noco_aplicaprom = 'S' AND N.noco_periodo >= :perinicial - 1 AND N.noco_periodo < :periodo AND N.noco_ano >= :anoprom AND N.noco_ano <= :ano AND terc_nit = :nite INTO :valor;
     valor = ((valor ) / (numeroprom -1 ));
     SELECT NOCO_VALOR FROM NOMINA_CONCEPTOS WHERE CONC_COD = :conc_cod AND TERC_NIT  = :nite AND NOCO_PAGOOK = 'N' AND NOCO_PERIODO = 0 INTO :saldosini;
     IF (saldosini IS NULL) THEN
     saldosini = 0;
     ELSE
     UPDATE nomina_conceptos N SET noco_pagook = 'S' WHERE n.noco_aplicaprom = 'S' AND N.noco_periodo >= :perinicial - 1 AND N.noco_periodo < :periodo AND N.noco_ano >= :anoprom AND N.noco_ano <= :ano  AND CONC_COD = :conc_cod AND terc_nit = :nite AND NOCO_PERIODO = 0;
     VALOR = :valor + :saldosini;
     UPDATE nomina_conceptos N SET noco_pagook = 'S' WHERE n.noco_aplicaprom = 'S' AND N.noco_periodo >= :perinicial - 1 AND N.noco_periodo < :periodo AND N.noco_ano >= :anoprom AND N.noco_ano <= :ano  AND CONC_COD = :conc_cod AND terc_nit = :nite;
    END
    ELSE
    IF (conc_otroconc = 'S') THEN
    BEGIN
     anosum = CAST(ano AS INTEGER);
     anosum = anosum - 1;
     SELECT SUM (noco_valor) FROM nomina_conceptos n WHERE n.noco_ano = :anosum AND n.conc_cod = :conc_codotroconc AND N.terc_nit = :nite INTO :valor;
     SELECT NOCO_VALOR FROM NOMINA_CONCEPTOS WHERE noco_ano = :anosum AND conc_cod = :conc_codotroconc AND terc_nit = :nite AND NOCO_PERIODO = 0 INTO :saldosini;
     IF (saldosini IS NULL) THEN
     saldosini = 0;
     ELSE
     UPDATE nomina_conceptos SET noco_pagook = 'S' WHERE noco_ano = :anosum AND conc_cod = :conc_codotroconc AND NOCO_PERIODO = 0 AND terc_nit = :nite;
     VALOR = :valor + :saldosini;
     UPDATE nomina_conceptos SET noco_pagook = 'S' WHERE noco_ano = :anosum AND conc_cod = :conc_codotroconc AND terc_nit = :nite;
    END
    ELSE
    IF (conc_aporte = 'S') THEN
    BEGIN
     horasex = NULL;
     diasnov = NULL;
     retroact = NULL;
     reembolso = NULL;
     IF ((:entidad = '' ) OR (entidad IS NULL)) THEN
     BEGIN
     SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
      IF (comision IS NULL) THEN
      comision = 0;
      SELECT C.emco_monto FROM EMPLEADO_CONCEPTOS C WHERE C.terc_nit = :nite AND C.conc_cod = 933 INTO :retroact;
      IF (retroact IS NULL ) THEN
      retroact = 0;
      SELECT C.emco_monto FROM EMPLEADO_CONCEPTOS C WHERE C.terc_nit = :nite AND C.conc_cod = 952 INTO :reembolso;
      IF (reembolso IS NULL ) THEN
      reembolso = 0;
      SELECT N.nono_dura FROM NOMINA_NOVEDADES N WHERE N.terc_nit = :nite AND N.nono_periodo = :periodo AND N.nono_ano = :ano AND (N.tnov_cod = 2 OR (N.tnov_cod = 3)) INTO :diasnov;
      IF (:diasnov IS NULL) THEN
      incap = 0;
      ELSE
      incap = (:basico / 30)* :diasnov;
      valor = :basico + :comision + :horasex + :retroact + :reembolso + :incap;
      IF ((conc_cod = 904) OR (conc_cod = 905) OR (conc_cod = 906) or (conc_cod = 934) ) THEN
      BEGIN
       entidad = :nitafp;
       IF (conc_cod = 904) THEN
       BEGIN
        SELECT A.paan_afptr FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
        SELECT N.nono_dura FROM NOMINA_NOVEDADES N WHERE N.terc_nit = :nite AND N.nono_periodo = :periodo AND N.nono_ano = :ano AND (N.tnov_cod = 2 OR (N.tnov_cod = 3)) INTO :diasnov;
        IF (:diasnov IS NULL) THEN
        incap = 0;
        ELSE
        incap = (:basico / 30)* :diasnov;
        SELECT c.noex_monto FROM nomina_horasext c WHERE c.noex_ano = :ano AND c.noex_periodio = :periodo AND c.noex_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :horasex;
        IF (horasex IS NOT NULL) THEN
        VALOR = (((((:basico )/30 * :diaslab ) + :comision + :horasex + :retroact+ :reembolso + :incap)+ :cambsaltrans ) * :PORCEN) /100;
        ELSE
        VALOR = ((((:basico)/30 * :diaslab ) + :comision + :retroact+ :reembolso + :cambsaltrans  + :incap) * :PORCEN) /100;
       END
       ELSE
       IF ((conc_cod = 905) OR (conc_cod = 906) or (conc_cod = 934)) THEN
       BEGIN
        SELECT A.paan_afpem FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
        SELECT N.nono_dura FROM NOMINA_NOVEDADES N WHERE N.terc_nit = :nite AND N.nono_periodo = :periodo AND N.nono_ano = :ano AND (N.tnov_cod = 2 OR (N.tnov_cod = 3)) INTO :diasnov;
        IF (:diasnov IS NULL) THEN
        incap = 0;
        ELSE
        incap = (:basico / 30)* :diasnov;
        SELECT c.noex_monto FROM nomina_horasext c WHERE c.noex_ano = :ano AND c.noex_periodio = :periodo AND c.noex_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :horasex;
        IF (horasex IS NOT NULL) THEN
        VALOR = (((((:basico )/30 * :diaslab ) + :comision + :horasex + :retroact + :reembolso)+ :cambsaltrans + :incap) * :PORCEN) /100;
        ELSE
        VALOR = (((((:basico )/30 * :diaslab ) + :comision + :retroact + :reembolso)+ :cambsaltrans + :incap) * :PORCEN) /100;
       END
      END
      ELSE
      IF ((conc_cod = 907) OR (conc_cod = 914) OR (conc_cod = 915) or (conc_cod = 938) ) THEN
      BEGIN
       entidad = :niteps;
       IF (conc_cod = 907) THEN
       BEGIN
        SELECT A.paan_epstr FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
        SELECT N.nono_dura FROM NOMINA_NOVEDADES N WHERE N.terc_nit = :nite AND N.nono_periodo = :periodo AND N.nono_ano = :ano AND (N.tnov_cod = 2 OR (N.tnov_cod = 3)) INTO :diasnov;
        IF (:diasnov IS NULL) THEN
        incap = 0;
        ELSE
        incap = (:basico / 30)* :diasnov;
        SELECT c.noex_monto FROM nomina_horasext c WHERE c.noex_ano = :ano AND c.noex_periodio = :periodo AND c.noex_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :horasex;
        IF (horasex IS NOT NULL) THEN
        VALOR = (((((:basico )/30 * :diaslab ) + :comision + :horasex + :retroact + :reembolso)+ :cambsaltrans + :incap) * :PORCEN) /100;
        ELSE
        VALOR = (((((:basico )/30 * :diaslab ) + :comision + :retroact + :reembolso)+ :cambsaltrans + :incap) * :PORCEN) /100;
       END
       ELSE
       IF ((conc_cod = 914) OR (conc_cod = 915) or (conc_cod = 938)) THEN
       BEGIN
        SELECT A.paan_epsem FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
        SELECT N.nono_dura FROM NOMINA_NOVEDADES N WHERE N.terc_nit = :nite AND N.nono_periodo = :periodo AND N.nono_ano = :ano AND (N.tnov_cod = 2 OR (N.tnov_cod = 3)) INTO :diasnov;
        IF (:diasnov IS NULL) THEN
        incap = 0;
        ELSE
        incap = (:basico / 30)* :diasnov;
        SELECT c.noex_monto FROM nomina_horasext c WHERE c.noex_ano = :ano AND c.noex_periodio = :periodo AND c.noex_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :horasex;
        IF (horasex IS NOT NULL) THEN
        VALOR = (((((:basico )/30 * :diaslab ) + :comision + :horasex + :retroact + :reembolso)+ :cambsaltrans + :incap) * :PORCEN) /100;
        ELSE
        VALOR = (((((:basico )/30 * :diaslab ) + :comision + :retroact + :reembolso)+ :cambsaltrans + :incap) * :PORCEN) /100;
       END
      END
      ELSE
      IF ((conc_cod = 910) OR (conc_cod = 911) OR (conc_cod = 916) OR (conc_cod = 917) OR (conc_cod = 918) OR (conc_cod = 919) or (conc_cod = 936) or (conc_cod = 939) or (conc_cod = 940)) THEN
      BEGIN
       entidad = :nitccf;
       SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
       IF (comision IS NULL) THEN
       comision = 0;
       SELECT N.nono_dura FROM NOMINA_NOVEDADES N WHERE N.terc_nit = :nite AND N.nono_periodo = :periodo AND N.nono_ano = :ano AND (N.tnov_cod = 2 OR (N.tnov_cod = 3)) INTO :diasnov;
       IF (:diasnov IS NULL) THEN
       incap = 0;
       ELSE
       incap = (:basico / 30)* :diasnov;
       IF ((conc_cod = 910) OR (conc_cod = 911) or (conc_cod = 936)) THEN
       BEGIN
        SELECT A.paan_ccf FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
      SELECT N.nono_dura FROM NOMINA_NOVEDADES N WHERE N.terc_nit = :nite AND N.nono_periodo = :periodo AND N.nono_ano = :ano AND (N.tnov_cod = 2 OR (N.tnov_cod = 3)) INTO :diasnov;
      IF (:diasnov IS NULL) THEN
      incap = 0;
      ELSE
      incap = (:basico / 30)* :diasnov;
        SELECT c.noex_monto FROM nomina_horasext c WHERE c.noex_ano = :ano AND c.noex_periodio = :periodo AND c.noex_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :horasex;
        IF (horasex IS NOT NULL) THEN
        VALOR = (((((:basico )/30 * :diaslab ) + :comision + :horasex + :retroact + :reembolso)+ :cambsaltrans + :incap) * :PORCEN) /100;
        ELSE
        VALOR = (((((:basico )/30 * :diaslab ) + :comision + :retroact + :reembolso)+ :cambsaltrans + :incap) * :PORCEN) /100;
       END
       ELSE
       IF ((conc_cod = 916) OR (conc_cod = 917) or (conc_cod = 939)) THEN
       BEGIN
        SELECT A.paan_icbf FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
      SELECT N.nono_dura FROM NOMINA_NOVEDADES N WHERE N.terc_nit = :nite AND N.nono_periodo = :periodo AND N.nono_ano = :ano AND (N.tnov_cod = 2 OR (N.tnov_cod = 3)) INTO :diasnov;
      IF (:diasnov IS NULL) THEN
      incap = 0;
      ELSE
      incap = (:basico / 30)* :diasnov;
      SELECT N.nono_dura FROM NOMINA_NOVEDADES N WHERE N.terc_nit = :nite AND N.nono_periodo = :periodo AND N.nono_ano = :ano AND (N.tnov_cod = 2 OR (N.tnov_cod = 3)) INTO :diasnov;
      IF (:diasnov IS NULL) THEN
      incap = 0;
      ELSE
      incap = (:basico / 30)* :diasnov;
        SELECT c.noex_monto FROM nomina_horasext c WHERE c.noex_ano = :ano AND c.noex_periodio = :periodo AND c.noex_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :horasex;
        IF (horasex IS NOT NULL) THEN
        VALOR = (((((:basico )/30 * :diaslab ) + :comision + :horasex + :retroact + :reembolso)+ :cambsaltrans + :incap) * :PORCEN) /100;
        ELSE
        VALOR = (((((:basico )/30 * :diaslab ) + :comision + :retroact + :reembolso)+ :cambsaltrans + :incap) * :PORCEN) /100;
       END
       ELSE
       IF ((conc_cod = 918) OR (conc_cod = 919) or (conc_cod = 940)) THEN
       BEGIN
        SELECT A.paan_sena FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
      SELECT N.nono_dura FROM NOMINA_NOVEDADES N WHERE N.terc_nit = :nite AND N.nono_periodo = :periodo AND N.nono_ano = :ano AND (N.tnov_cod = 2 OR (N.tnov_cod = 3)) INTO :diasnov;
      IF (:diasnov IS NULL) THEN
      incap = 0;
      ELSE
      incap = (:basico / 30)* :diasnov;
        SELECT c.noex_monto FROM nomina_horasext c WHERE c.noex_ano = :ano AND c.noex_periodio = :periodo AND c.noex_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :horasex;
        IF (horasex IS NOT NULL) THEN
        VALOR = (((((:basico )/30 * :diaslab ) + :comision + :horasex + :retroact + :reembolso)+ :cambsaltrans + :incap) * :PORCEN) /100;
        ELSE
        VALOR = (((((:basico )/30 * :diaslab ) + :comision + :retroact + :reembolso)+ :cambsaltrans + :incap) * :PORCEN) /100;
       END
      END
      ELSE
      IF ((conc_cod = 912) OR (conc_cod = 913)) THEN
      BEGIN
       entidad = :nitafc;
       SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
       IF (comision IS NULL) THEN
       comision = 0;
      SELECT N.nono_dura FROM NOMINA_NOVEDADES N WHERE N.terc_nit = :nite AND N.nono_periodo = :periodo AND N.nono_ano = :ano AND (N.tnov_cod = 2 OR (N.tnov_cod = 3)) INTO :diasnov;
      IF (:diasnov IS NULL) THEN
      incap = 0;
      ELSE
      incap = (:basico / 30)* :diasnov;
        SELECT P.paan_auxtr, P.paan_salminimo FROM PARAMETROS_ANO P WHERE P.paan_ano = :ano INTO :auxtrans, :smlv;
        if (:basico < (:smlv*2)) then
           auxtrans = (:auxtrans / 30) * :diaslab;
        ELSE
           auxtrans = 0;
       IF ((conc_cod = 912) OR (conc_cod = 913) or (conc_cod = 937)) THEN
       BEGIN
        SELECT A.paan_cesemp FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
        SELECT c.noex_monto FROM nomina_horasext c WHERE c.noex_ano = :ano AND c.noex_periodio = :periodo AND c.noex_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :horasex;
        IF (horasex IS NOT NULL) THEN
        VALOR = (((((:basico )/30 * :diaslab ) + :comision + :horasex + :retroact+ :reembolso)+ :cambsaltrans + :incap+ :auxtrans) * :PORCEN) /100;
        ELSE
        VALOR = (((((:basico )/30 * :diaslab ) + :comision + :retroact + :reembolso)+ :cambsaltrans + :incap + :auxtrans) * :PORCEN) /100;
       END
      END
      ELSE
      BEGIN
       IF (comision IS NULL) THEN
       comision = 0;
       SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
       conc_monto = :basico + :comision;
       IF (conc_porc <> 0 AND conc_porc IS NOT NULL) THEN
       VALOR = (((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans + :incap) * :conc_porc) /100;
       ELSE
       IF (:porcen <> 0 AND :porcen IS NOT NULL) THEN
       VALOR = (((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans + :incap) * :porcen) /100;
       ELSE
       IF (:montos <> 0 AND :montos IS NOT NULL) THEN
       valor = :montos;
       ELSE
       IF (:conc_monto <> 0 AND :conc_monto IS NOT NULL) THEN
       valor = :conc_monto;
      END
     END
     item = :item + 1;
    END
    ELSE
    IF (conc_prov = 'S') THEN
    BEGIN
     if ((conc_cod <> 929) and (conc_cod <> 930)) then
     begin
        SELECT P.paan_auxtr, P.paan_salminimo FROM PARAMETROS_ANO P WHERE P.paan_ano = :ano INTO :auxtrans, :smlv;
        if (:basico < (:smlv*2)) then
           auxtrans = (:auxtrans / 30) * :diaslab;
        ELSE
           auxtrans = 0;
     end
     else
      auxtrans = 0;
     conc_monto = :basico;
     IF (conc_porc <> 0 AND conc_porc IS NOT NULL) THEN
     VALOR = (((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans + :incap + :auxtrans) * :conc_porc) /100;
     ELSE
     IF (porcen <> 0 AND porcen IS NOT NULL) THEN
     VALOR = (((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans + :incap + :auxtrans) * :porcen) /100;
     ELSE
     IF (montos <> 0 AND montos IS NOT NULL) THEN
     VALOR = :montos;
     ELSE
     IF (conc_monto <> 0 AND conc_monto IS NOT NULL) THEN
     VALOR = :conc_monto;
     item = :item + 1;
    END
    ELSE
    IF (conc_cod = 920) THEN
    BEGIN
     SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :valor;
     IF (valor IS NULL) THEN
     valor = 0;
     item = :item + 1;
    END
    ELSE
    IF (conc_cod = 900 OR (:conc_cod = 931)) THEN
    BEGIN
     SELECT c.noex_monto FROM nomina_horasext c WHERE c.noex_ano = :ano AND c.noex_periodio = :periodo AND c.noex_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :valor;
     IF (valor IS NULL) THEN
     valor = 0;
     item = :item + 1;
    END
    ELSE
    IF (conc_cod = 932) THEN
    BEGIN
     SELECT N.nono_dura FROM NOMINA_NOVEDADES N WHERE N.terc_nit = :nite AND N.nono_periodo = :periodo AND N.nono_ano = :ano AND (N.tnov_cod = 2 OR (N.tnov_cod = 3)) INTO :diasnov;
     IF (:diasnov IS NULL) THEN
     valor = 0;
     ELSE
     valor = (:basico / 30)* :diasnov;
    END
    ELSE
    IF (conc_cod = 921) THEN
    BEGIN
     IF (porcen IS NOT NULL AND porcen <> 0) THEN
     valor = ((basico / 30)* :diaslab ) * :PORCEN /100;
     ELSE
     IF (conc_porc IS NOT NULL AND conc_porc <> 0) THEN
     valor = ((basico / 30)* :diaslab ) * :conc_porc /100;
    END
    EXECUTE PROCEDURE LEE_CONFIGURACION('NOMINA','GENERAL','REDONDEO AL MULTIPLO DE DIEZ EN TOTALES')RETURNING_VALUES(:aprox);
    EXECUTE PROCEDURE REDONDEE(:valor, :aprox) RETURNING_VALUES (VALOR);
    IF ((mensual = 'N') OR (periodicidad = 1))  THEN
    INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
    VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
    ELSE
    IF (mensual = 'S') THEN
    BEGIN
     IF ((:periodicidad = 2) AND (liquidaper = 1)) THEN
     BEGIN
      IF ((periodo = 1) OR (periodo = 3) OR (periodo = 5) OR (periodo = 7) OR (periodo = 9) OR (periodo = 11)
      OR (periodo = 13) OR (periodo = 15) OR (periodo = 17) OR (periodo = 19) OR (periodo = 21) OR (periodo = 23)) THEN
      INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
      VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
     END
     ELSE
     IF ((:periodicidad = 2) AND (liquidaper = 2)) THEN
     BEGIN
      IF ((periodo = 2) OR (periodo = 4) OR (periodo = 6) OR (periodo = 8) OR (periodo = 10) OR (periodo = 12)
      OR (periodo = 14) OR (periodo = 16) OR (periodo = 18) OR (periodo = 20) OR (periodo = 22) OR (periodo = 24)) THEN
      INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
      VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
     END
     ELSE
     IF ((:periodicidad = 3) AND (liquidaper = 1)) THEN
     BEGIN
      IF ((periodo = 1) OR (periodo = 5) OR (periodo = 9) OR (periodo = 13) OR (periodo = 17) OR (periodo = 21)
      OR (periodo = 25) OR (periodo = 29) OR (periodo = 33) OR (periodo = 37) OR (periodo = 41) OR (periodo = 45)
      OR (periodo = 49)) THEN
      INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
      VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
    END
    ELSE
     IF ((:periodicidad = 3) AND (liquidaper = 2)) THEN
     BEGIN
      IF ((periodo = 2) OR (periodo = 6) OR (periodo = 10) OR (periodo = 14) OR (periodo = 18) OR (periodo = 22)
      OR (periodo = 26) OR (periodo = 30) OR (periodo = 34) OR (periodo = 38) OR (periodo = 42) OR (periodo = 46)
      OR (periodo = 50)) THEN
      INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
      VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
     END
     ELSE
     IF ((:periodicidad = 3) AND (liquidaper = 3)) THEN
     BEGIN
      IF ((periodo = 3) OR (periodo = 7) OR (periodo = 11) OR (periodo = 15) OR (periodo = 19) OR (periodo = 23)
      OR (periodo = 27) OR (periodo = 31) OR (periodo = 35) OR (periodo = 39) OR (periodo = 43) OR (periodo = 47)
      OR (periodo = 51)) THEN
      INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
      VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
     END
     ELSE
     IF ((:periodicidad = 3) AND (liquidaper = 4)) THEN
     BEGIN
      IF ((periodo = 4) OR (periodo = 8) OR (periodo = 12) OR (periodo = 16) OR (periodo = 20) OR (periodo = 24)
      OR (periodo = 29) OR (periodo = 32) OR (periodo = 36) OR (periodo = 40) OR (periodo = 44) OR (periodo = 48)
      OR (periodo = 52)) THEN
      INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
      VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
     END
    END
  VALOR = 0;
  basico = 0;
   END
  END
 END
 END
 SUSPEND;
END
^

SET TERM ; ^

UPDATE REVISION SET REVI_NOMINA = '2009/06/11';
ALTER TABLE CONCEPTOS_NOMINA ADD CONC_BENEFIC CHAR(1);

UPDATE CONCEPTOS_NOMINA SET CONC_BENEFIC = 'N' WHERE CONC_BENEFIC IS NULL;

SET TERM ^ ;

CREATE OR ALTER PROCEDURE CAUSA_NOMINA(
    fec DATE,
    periodo INTEGER,
    periodicidad INTEGER,
    pagoglobal CHAR(1),
    ano CHAR(4),
    depto INTEGER)
RETURNS (
    idnomina INTEGER,
    itemini INTEGER)
AS
DECLARE VARIABLE item INTEGER;
DECLARE VARIABLE nite VARCHAR(20) CHARACTER SET none;
DECLARE VARIABLE nit_tercero VARCHAR(20);
DECLARE VARIABLE concept INTEGER;
DECLARE VARIABLE montos NUMERIC(18,2);
DECLARE VARIABLE porcen NUMERIC(9,4);
DECLARE VARIABLE entidad VARCHAR(20);
DECLARE VARIABLE conc_cod INTEGER;
DECLARE VARIABLE conc_deduc CHAR(1);
DECLARE VARIABLE conc_porc NUMERIC(9,4);
DECLARE VARIABLE conc_entidad INTEGER;
DECLARE VARIABLE conc_monto NUMERIC(18,2);
DECLARE VARIABLE conc_modifi CHAR(1);
DECLARE VARIABLE conc_promedio CHAR(1);
DECLARE VARIABLE emco_perprom INTEGER;
DECLARE VARIABLE valor NUMERIC(18,2);
DECLARE VARIABLE diaslab INTEGER;
DECLARE VARIABLE conc_prov CHAR(1);
DECLARE VARIABLE conc_aporte CHAR(1);
DECLARE VARIABLE numeroprom INTEGER;
DECLARE VARIABLE conc_aplicaprom CHAR(1);
DECLARE VARIABLE perinicial INTEGER;
DECLARE VARIABLE anoprom INTEGER;
DECLARE VARIABLE conc_dias CHAR(1);
DECLARE VARIABLE conc_otroconc CHAR(1);
DECLARE VARIABLE conc_codotroconc INTEGER;
DECLARE VARIABLE anosum INTEGER;
DECLARE VARIABLE salario CHAR(1) CHARACTER SET none;
DECLARE VARIABLE liquidaper INTEGER;
DECLARE VARIABLE rmod NUMERIC(2,2);
DECLARE VARIABLE basico NUMERIC(18,2);
DECLARE VARIABLE niteps VARCHAR(20);
DECLARE VARIABLE nitafc VARCHAR(20);
DECLARE VARIABLE nitafp VARCHAR(20);
DECLARE VARIABLE nitccf VARCHAR(20);
DECLARE VARIABLE gtoempr CHAR(1);
DECLARE VARIABLE comision NUMERIC(18,2);
DECLARE VARIABLE cambsaltrans NUMERIC(18,2);
DECLARE VARIABLE saldosini NUMERIC(18,2);
DECLARE VARIABLE duranov INTEGER;
DECLARE VARIABLE base NUMERIC(18,2);
DECLARE VARIABLE aprox INTEGER;
DECLARE VARIABLE mensual CHAR(1);
DECLARE VARIABLE horasex NUMERIC(18,2);
DECLARE VARIABLE diasnov INTEGER;
DECLARE VARIABLE tomasal INTEGER;
DECLARE VARIABLE retroact NUMERIC(18,2);
DECLARE VARIABLE reembolso NUMERIC(18,2);
DECLARE VARIABLE incap NUMERIC(18,2);
DECLARE VARIABLE deptoempl INTEGER;
DECLARE VARIABLE auxtrans NUMERIC(18,2);
DECLARE VARIABLE smlv NUMERIC(18,2);
DECLARE VARIABLE beneficios NUMERIC(18,2);
DECLARE VARIABLE CONFIRMADO CHAR(1);
BEGIN
 SELECT N.NOMI_ID, N.nomi_liqok FROM NOMINA N WHERE N.nomi_periodo = :periodo AND N.nomi_periodocidad = :periodicidad AND N.nomi_ano = :ano
 INTO :IDNOMINA, :CONFIRMADO;
 IF (:idnomina IS NULL) THEN
 BEGIN
  EXECUTE PROCEDURE cambie_id_nomina RETURNING_VALUES(:idnomina);
  INSERT INTO nomina (nomi_id, NOMI_FECCAUSA, NOMI_PAGOGLOBAL, NOMI_PERIODOCIDAD, NOMI_PERIODO, NOMI_ANO, NOMI_LIQOK)
  VALUES (:IDNOMINA, :fec,:pagoglobal, :periodicidad, :periodo, :ano, 'N');
  item = 1;
 END
 ELSE
 BEGIN
  SELECT MAX(N.noco_item) FROM NOMINA_CONCEPTOS N WHERE N.nomi_id = :idnomina
  INTO :item;
 END
 IF ((confirmado = 'S') AND (idnomina IS NOT NULL)) THEN
 BEGIN
  idnomina = 0;
 END
 ELSE
 BEGIN
 IF (DEPTO = 0) THEN
  INSERT INTO NOMINA_DEPARTAMENTO (nomi_id, nodp_depto)VALUES(:IDNOMINA,0);
 ELSE
  INSERT INTO NOMINA_DEPARTAMENTO (nomi_id, nodp_depto)VALUES(:IDNOMINA,:DEPTO);
 ITEMINI = ITEM;
 FOR SELECT E.TERC_NIT, E.empl_salario, e.empl_eps, e.empl_afc, e.empl_afp, e.empl_ccf, e.empl_dpto
 FROM EMPLEADOS E
 WHERE E.empl_ppago = :periodicidad AND ((E.empl_fecret IS NULL) OR (E.empl_fecret > :fec)) AND E.empl_fecing <= :fec
 INTO :nite, :basico, :niteps, :nitafc, :nitafp, :nitccf, :deptoempl
 DO
 BEGIN
 IF ((depto = 0) OR (deptoempl = :depto)) THEN
 BEGIN
  FOR SELECT CE.TERC_NIT, CE.CONC_COD, CE.EMCO_MONTO, CE.EMCO_PORC, ce.empl_entidad, CE.emco_perprom, CE.emco_luquidaper, CE.emco_mensual, CN.CONC_COD, CN.CONC_DEDUC,CN.CONC_PORC, CN.CONC_ENTIDAD, CN.CONC_MONTO,  CN.CONC_DIAS, CN.CONC_MODIFI,
  CN.CONC_PROMEDIO, CN.conc_salario, CE.emco_perprom, CN.conc_prov, CN.conc_aporte, CN.conc_aplicaprom, cn.conc_otroconc, cn.conc_codotroconc, CN.conc_gtoempr, CN.conc_base, CE.emco_tomsal
  FROM empleado_conceptos CE, CONCEPTOS_NOMINA CN WHERE ((CE.terc_nit = :nite) AND (CE.CONC_COD = CN.CONC_COD) AND (CE.emco_fecini <= :fec AND CE.emco_fecfin >= :FEC) ) OR ((CE.terc_nit = :nite)
  AND (CE.CONC_COD = CN.CONC_COD) AND (cn.conc_todosper = 'N') AND (CE.emco_ppago = :periodo)) OR  ((CE.terc_nit = :nite) AND (CE.CONC_COD = CN.CONC_COD) AND cn.conc_todosper = 'S')  ORDER BY (TERC_NIT )
  INTO :nit_tercero, :concept,  :montos, :porcen, :entidad, :numeroprom, :liquidaper, :mensual ,:CONC_COD, :CONC_DEDUC, :CONC_PORC,
  :CONC_ENTIDAD, :CONC_MONTO, :CONC_DIAS, :CONC_MODIFI,:CONC_PROMEDIO, :salario,:EMCO_PERPROM, :conc_prov, :conc_aporte , :CONC_APLICAPROM, :conc_otroconc, :conc_codotroconc, :gtoempr, :base, :tomasal
  DO
  BEGIN
   IF (conc_dias = 'S') THEN
   EXECUTE PROCEDURE DIAS_LABORADOS (:nite, :periodo, :fec, :mensual,:conc_aporte) RETURNING_VALUES (:diaslab);
   ELSE
   BEGIN
    diaslab = 15;
    IF (mensual = 'S') THEN
    BEGIN
     IF (periodicidad = 2) THEN
     diaslab = 30;
     ELSE
     IF (liquidaper = 3) THEN
     diaslab = 30;
    END
   END
   IF (:tomasal <> 0) THEN
   BEGIN
    IF ((:periodicidad = 2) AND (:tomasal <> 2)) THEN
    BEGIN
     IF ((periodo = 2) OR (periodo = 4) OR (periodo = 6) OR (periodo = 8) OR (periodo = 10) OR (periodo = 12)
     OR (periodo = 14) OR (periodo = 16) OR (periodo = 18) OR (periodo = 20) OR (periodo = 22) OR (periodo = 24)) THEN
     basico = 0;
    END
    ELSE
    IF ((:periodicidad = 3) AND (:tomasal <> 1)) THEN
    BEGIN
     IF ((periodo = 1) OR (periodo = 5) OR (periodo = 9) OR (periodo = 13) OR (periodo = 17) OR (periodo = 21)
     OR (periodo = 25) OR (periodo = 29) OR (periodo = 33) OR (periodo = 37) OR (periodo = 41) OR (periodo = 45)
     OR (periodo = 49)) THEN
     basico = 0;
    END
    ELSE
     IF ((:periodicidad = 3) AND (:tomasal <> 2)) THEN
     BEGIN
      IF ((periodo = 2) OR (periodo = 6) OR (periodo = 10) OR (periodo = 14) OR (periodo = 18) OR (periodo = 22)
      OR (periodo = 26) OR (periodo = 30) OR (periodo = 34) OR (periodo = 38) OR (periodo = 42) OR (periodo = 46)
      OR (periodo = 50)) THEN
      basico = 0;
     END
     ELSE
     IF ((:periodicidad = 3) AND (:tomasal <> 3)) THEN
     BEGIN
      IF ((periodo = 3) OR (periodo = 7) OR (periodo = 11) OR (periodo = 15) OR (periodo = 19) OR (periodo = 23)
      OR (periodo = 27) OR (periodo = 31) OR (periodo = 35) OR (periodo = 39) OR (periodo = 43) OR (periodo = 47)
      OR (periodo = 51)) THEN
      basico = 0;
     END
     ELSE
     IF ((:periodicidad = 3) AND (:tomasal <> 4)) THEN
     BEGIN
      IF ((periodo = 4) OR (periodo = 8) OR (periodo = 12) OR (periodo = 16) OR (periodo = 20) OR (periodo = 24)
      OR (periodo = 29) OR (periodo = 32) OR (periodo = 36) OR (periodo = 40) OR (periodo = 44) OR (periodo = 48)
      OR (periodo = 52)) THEN
      basico = 0;
     END
   END
   ELSE
   BEGIN
    SELECT E.empl_salario FROM EMPLEADOS E WHERE E.terc_nit = :nite INTO :basico;
    SELECT ((n.nono_valor /30) * n.nono_dura), (n.nono_dura) FROM nomina_novedades n WHERE n.tnov_cod = 11 AND n.terc_nit = :nite AND n.nono_periodo = :periodo INTO :cambsaltrans, :duranov;
    IF (cambsaltrans IS NULL) THEN
    cambsaltrans = 0;
    IF (duranov IS NULL) THEN
    duranov = 0;
    diaslab = :diaslab - :duranov;
    IF (conc_cod = 922) THEN
    BEGIN
     SELECT SUM(P.prcu_monto) FROM prestamo_cuotas P, prestamo_nomina PN WHERE P.prcu_ano = :ano AND P.prcu_periodo = :periodo AND PN.prno_id = P.prno_id AND PN.terc_nit = :nite INTO :valor;
     IF (valor IS NULL) THEN
     valor = 0;
     item = :item + 1;
     UPDATE prestamo_cuotas  P SET prcu_ok = 'S' WHERE P.prcu_ano = :ano AND P.prcu_periodo = :periodo AND P.prno_id = (SELECT PN.prno_id FROM PRESTAMO_NOMINA PN WHERE PN.terc_nit = :nite);
    END
    ELSE
    IF ((:montos = 0) OR (:montos IS NULL)) THEN
    BEGIN
     IF ((CONC_PORC = 0 AND :porcen = 0) OR (CONC_PORC IS NULL AND :porcen = 0) OR (CONC_PORC = 0 AND :porcen IS NULL) OR (CONC_PORC IS NULL AND :porcen IS NULL) ) THEN
     BEGIN
      IF ((conc_monto <> 0) AND (conc_monto IS NOT NULL) ) THEN
      BEGIN
       VALOR = :CONC_MONTO;
       IF (:conc_dias = 'S') THEN
       valor = (:valor / 30) * :diaslab;
      END
      ELSE
      IF (salario = 'S' AND CONC_COD <> 900 AND CONC_COD <> 920) THEN
      BEGIN
       conc_monto = :basico;
       VALOR = (:conc_monto/30 * :diaslab ) + :cambsaltrans;
      END
      ELSE
      BEGIN
       valor = montos;
       IF (:conc_dias = 'S') THEN
       valor = (:valor / 30) * :diaslab;
      END
     END
     ELSE
     BEGIN
      IF (:porcen <> 0) THEN
      BEGIN
       IF ((conc_monto <> 0) AND (conc_monto IS NOT NULL) ) THEN
       BEGIN
        VALOR = ((:CONC_MONTO ) * :PORCEN) /100;
       END
      END
      ELSE
      BEGIN
       IF ((conc_monto <> 0) AND (conc_monto IS NOT NULL) ) THEN
       BEGIN
        VALOR = ((:CONC_MONTO) * :conc_porc) /100;
       END
       ELSE
       IF (salario = 'S' AND CONC_COD <> 900 AND CONC_COD <> 920) THEN
       BEGIN
        conc_monto = :basico;
        VALOR = ((:CONC_MONTO)+ :cambsaltrans * :conc_porc) /100;
       END
       ELSE
       IF (:conc_monto = 0 AND :montos = 0) THEN
       BEGIN
        conc_monto = :basico;
        VALOR = (((:CONC_MONTO / 30) * :diaslab) + :cambsaltrans * :conc_porc) /100;
       END
      END
     END
    END
    ELSE
    IF ((CONC_PORC = 0 OR (conc_porc IS NULL)) AND (:porcen = 0 OR (porcen IS NULL))) THEN
    BEGIN
     VALOR = (:montos);
     IF (:conc_dias = 'S') THEN
     valor = (:valor / 30) * :diaslab;
    END
    ELSE
    IF (:porcen <> 0 AND porcen IS NOT NULL) THEN
    BEGIN
     VALOR = ((:MONTOS ) * :PORCEN) /100;
    END
    ELSE
    BEGIN
     VALOR = ((:montos) * :CONC_PORC) /100;
    END
    IF (conc_promedio = 'S') THEN
    BEGIN
     perinicial = :periodo - (:numeroprom) + 1;
     anoprom = CAST (ano AS INTEGER);
     IF (perinicial <= 0) THEN
     BEGIN
      perinicial = 1;
      anoprom = CAST(ANO AS INTEGER) - 1;
     END
     SELECT SUM (noco_valor) FROM nomina_conceptos n WHERE n.noco_aplicaprom = 'S' AND N.noco_periodo >= :perinicial - 1 AND N.noco_periodo < :periodo AND N.noco_ano >= :anoprom AND N.noco_ano <= :ano AND terc_nit = :nite INTO :valor;
     valor = ((valor ) / (numeroprom -1 ));
     SELECT NOCO_VALOR FROM NOMINA_CONCEPTOS WHERE CONC_COD = :conc_cod AND TERC_NIT  = :nite AND NOCO_PAGOOK = 'N' AND NOCO_PERIODO = 0 INTO :saldosini;
     IF (saldosini IS NULL) THEN
     saldosini = 0;
     ELSE
     UPDATE nomina_conceptos N SET noco_pagook = 'S' WHERE n.noco_aplicaprom = 'S' AND N.noco_periodo >= :perinicial - 1 AND N.noco_periodo < :periodo AND N.noco_ano >= :anoprom AND N.noco_ano <= :ano  AND CONC_COD = :conc_cod AND terc_nit = :nite AND NOCO_PERIODO = 0;
     VALOR = :valor + :saldosini;
     UPDATE nomina_conceptos N SET noco_pagook = 'S' WHERE n.noco_aplicaprom = 'S' AND N.noco_periodo >= :perinicial - 1 AND N.noco_periodo < :periodo AND N.noco_ano >= :anoprom AND N.noco_ano <= :ano  AND CONC_COD = :conc_cod AND terc_nit = :nite;
    END
    ELSE
    IF (conc_otroconc = 'S') THEN
    BEGIN
     anosum = CAST(ano AS INTEGER);
     anosum = anosum - 1;
     SELECT SUM (noco_valor) FROM nomina_conceptos n WHERE n.noco_ano = :anosum AND n.conc_cod = :conc_codotroconc AND N.terc_nit = :nite INTO :valor;
     SELECT NOCO_VALOR FROM NOMINA_CONCEPTOS WHERE noco_ano = :anosum AND conc_cod = :conc_codotroconc AND terc_nit = :nite AND NOCO_PERIODO = 0 INTO :saldosini;
     IF (saldosini IS NULL) THEN
     saldosini = 0;
     ELSE
     UPDATE nomina_conceptos SET noco_pagook = 'S' WHERE noco_ano = :anosum AND conc_cod = :conc_codotroconc AND NOCO_PERIODO = 0 AND terc_nit = :nite;
     VALOR = :valor + :saldosini;
     UPDATE nomina_conceptos SET noco_pagook = 'S' WHERE noco_ano = :anosum AND conc_cod = :conc_codotroconc AND terc_nit = :nite;
    END
    ELSE
    IF (conc_aporte = 'S') THEN
    BEGIN
     horasex = NULL;
     diasnov = NULL;
     retroact = NULL;
     reembolso = NULL;
     IF ((:entidad = '' ) OR (entidad IS NULL)) THEN
     BEGIN
     SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
      IF (comision IS NULL) THEN
      comision = 0;
      SELECT C.emco_monto FROM EMPLEADO_CONCEPTOS C WHERE C.terc_nit = :nite AND C.conc_cod = 933 INTO :retroact;
      IF (retroact IS NULL ) THEN
      retroact = 0;
      SELECT C.emco_monto FROM EMPLEADO_CONCEPTOS C WHERE C.terc_nit = :nite AND C.conc_cod = 952 INTO :reembolso;
      IF (reembolso IS NULL ) THEN
      reembolso = 0;
      SELECT N.nono_dura FROM NOMINA_NOVEDADES N WHERE N.terc_nit = :nite AND N.nono_periodo = :periodo AND N.nono_ano = :ano AND (N.tnov_cod = 2 OR (N.tnov_cod = 3)) INTO :diasnov;
      IF (:diasnov IS NULL) THEN
      incap = 0;
      ELSE
      incap = (:basico / 30)* :diasnov;
      valor = :basico + :comision + :horasex + :retroact + :reembolso + :incap;
      IF ((conc_cod = 904) OR (conc_cod = 905) OR (conc_cod = 906) OR (conc_cod = 934) ) THEN
      BEGIN
       entidad = :nitafp;
       IF (conc_cod = 904) THEN
       BEGIN
        SELECT A.paan_afptr FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
        SELECT N.nono_dura FROM NOMINA_NOVEDADES N WHERE N.terc_nit = :nite AND N.nono_periodo = :periodo AND N.nono_ano = :ano AND (N.tnov_cod = 2 OR (N.tnov_cod = 3)) INTO :diasnov;
        IF (:diasnov IS NULL) THEN
        incap = 0;
        ELSE
        incap = (:basico / 30)* :diasnov;
        SELECT c.noex_monto FROM nomina_horasext c WHERE c.noex_ano = :ano AND c.noex_periodio = :periodo AND c.noex_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :horasex;
        IF (horasex IS NOT NULL) THEN
        VALOR = (((((:basico )/30 * :diaslab ) + :comision + :horasex + :retroact+ :reembolso + :incap)+ :cambsaltrans ) * :PORCEN) /100;
        ELSE
        VALOR = ((((:basico)/30 * :diaslab ) + :comision + :retroact+ :reembolso + :cambsaltrans  + :incap) * :PORCEN) /100;
       END
       ELSE
       IF ((conc_cod = 905) OR (conc_cod = 906) OR (conc_cod = 934)) THEN
       BEGIN
        SELECT A.paan_afpem FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
        SELECT N.nono_dura FROM NOMINA_NOVEDADES N WHERE N.terc_nit = :nite AND N.nono_periodo = :periodo AND N.nono_ano = :ano AND (N.tnov_cod = 2 OR (N.tnov_cod = 3)) INTO :diasnov;
        IF (:diasnov IS NULL) THEN
        incap = 0;
        ELSE
        incap = (:basico / 30)* :diasnov;
        SELECT c.noex_monto FROM nomina_horasext c WHERE c.noex_ano = :ano AND c.noex_periodio = :periodo AND c.noex_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :horasex;
        IF (horasex IS NOT NULL) THEN
        VALOR = (((((:basico )/30 * :diaslab ) + :comision + :horasex + :retroact + :reembolso)+ :cambsaltrans + :incap) * :PORCEN) /100;
        ELSE
        VALOR = (((((:basico )/30 * :diaslab ) + :comision + :retroact + :reembolso)+ :cambsaltrans + :incap) * :PORCEN) /100;
       END
      END
      ELSE
      IF ((conc_cod = 907) OR (conc_cod = 914) OR (conc_cod = 915) OR (conc_cod = 938) ) THEN
      BEGIN
       entidad = :niteps;
       IF (conc_cod = 907) THEN
       BEGIN
        SELECT A.paan_epstr FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
        SELECT N.nono_dura FROM NOMINA_NOVEDADES N WHERE N.terc_nit = :nite AND N.nono_periodo = :periodo AND N.nono_ano = :ano AND (N.tnov_cod = 2 OR (N.tnov_cod = 3)) INTO :diasnov;
        IF (:diasnov IS NULL) THEN
        incap = 0;
        ELSE
        incap = (:basico / 30)* :diasnov;
        SELECT c.noex_monto FROM nomina_horasext c WHERE c.noex_ano = :ano AND c.noex_periodio = :periodo AND c.noex_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :horasex;
        IF (horasex IS NOT NULL) THEN
        VALOR = (((((:basico )/30 * :diaslab ) + :comision + :horasex + :retroact + :reembolso)+ :cambsaltrans + :incap) * :PORCEN) /100;
        ELSE
        VALOR = (((((:basico )/30 * :diaslab ) + :comision + :retroact + :reembolso)+ :cambsaltrans + :incap) * :PORCEN) /100;
       END
       ELSE
       IF ((conc_cod = 914) OR (conc_cod = 915) OR (conc_cod = 938)) THEN
       BEGIN
        SELECT A.paan_epsem FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
        SELECT N.nono_dura FROM NOMINA_NOVEDADES N WHERE N.terc_nit = :nite AND N.nono_periodo = :periodo AND N.nono_ano = :ano AND (N.tnov_cod = 2 OR (N.tnov_cod = 3)) INTO :diasnov;
        IF (:diasnov IS NULL) THEN
        incap = 0;
        ELSE
        incap = (:basico / 30)* :diasnov;
        SELECT c.noex_monto FROM nomina_horasext c WHERE c.noex_ano = :ano AND c.noex_periodio = :periodo AND c.noex_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :horasex;
        IF (horasex IS NOT NULL) THEN
        VALOR = (((((:basico )/30 * :diaslab ) + :comision + :horasex + :retroact + :reembolso)+ :cambsaltrans + :incap) * :PORCEN) /100;
        ELSE
        VALOR = (((((:basico )/30 * :diaslab ) + :comision + :retroact + :reembolso)+ :cambsaltrans + :incap) * :PORCEN) /100;
       END
      END
      ELSE
      IF ((conc_cod = 910) OR (conc_cod = 911) OR (conc_cod = 916) OR (conc_cod = 917) OR (conc_cod = 918) OR (conc_cod = 919) OR (conc_cod = 936) OR (conc_cod = 939) OR (conc_cod = 940)) THEN
      BEGIN
       entidad = :nitccf;
       SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
       IF (comision IS NULL) THEN
       comision = 0;
       SELECT N.nono_dura FROM NOMINA_NOVEDADES N WHERE N.terc_nit = :nite AND N.nono_periodo = :periodo AND N.nono_ano = :ano AND (N.tnov_cod = 2 OR (N.tnov_cod = 3)) INTO :diasnov;
       IF (:diasnov IS NULL) THEN
       incap = 0;
       ELSE
       incap = (:basico / 30)* :diasnov;
       IF ((conc_cod = 910) OR (conc_cod = 911) OR (conc_cod = 936)) THEN
       BEGIN
        SELECT A.paan_ccf FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
      SELECT N.nono_dura FROM NOMINA_NOVEDADES N WHERE N.terc_nit = :nite AND N.nono_periodo = :periodo AND N.nono_ano = :ano AND (N.tnov_cod = 2 OR (N.tnov_cod = 3)) INTO :diasnov;
      IF (:diasnov IS NULL) THEN
      incap = 0;
      ELSE
      incap = (:basico / 30)* :diasnov;
        SELECT c.noex_monto FROM nomina_horasext c WHERE c.noex_ano = :ano AND c.noex_periodio = :periodo AND c.noex_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :horasex;
        IF (horasex IS NOT NULL) THEN
        VALOR = (((((:basico )/30 * :diaslab ) + :comision + :horasex + :retroact + :reembolso)+ :cambsaltrans + :incap) * :PORCEN) /100;
        ELSE
        VALOR = (((((:basico )/30 * :diaslab ) + :comision + :retroact + :reembolso)+ :cambsaltrans + :incap) * :PORCEN) /100;
       END
       ELSE
       IF ((conc_cod = 916) OR (conc_cod = 917) OR (conc_cod = 939)) THEN
       BEGIN
        SELECT A.paan_icbf FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
      SELECT N.nono_dura FROM NOMINA_NOVEDADES N WHERE N.terc_nit = :nite AND N.nono_periodo = :periodo AND N.nono_ano = :ano AND (N.tnov_cod = 2 OR (N.tnov_cod = 3)) INTO :diasnov;
      IF (:diasnov IS NULL) THEN
      incap = 0;
      ELSE
      incap = (:basico / 30)* :diasnov;
      SELECT N.nono_dura FROM NOMINA_NOVEDADES N WHERE N.terc_nit = :nite AND N.nono_periodo = :periodo AND N.nono_ano = :ano AND (N.tnov_cod = 2 OR (N.tnov_cod = 3)) INTO :diasnov;
      IF (:diasnov IS NULL) THEN
      incap = 0;
      ELSE
      incap = (:basico / 30)* :diasnov;
        SELECT c.noex_monto FROM nomina_horasext c WHERE c.noex_ano = :ano AND c.noex_periodio = :periodo AND c.noex_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :horasex;
        IF (horasex IS NOT NULL) THEN
        VALOR = (((((:basico )/30 * :diaslab ) + :comision + :horasex + :retroact + :reembolso)+ :cambsaltrans + :incap) * :PORCEN) /100;
        ELSE
        VALOR = (((((:basico )/30 * :diaslab ) + :comision + :retroact + :reembolso)+ :cambsaltrans + :incap) * :PORCEN) /100;
       END
       ELSE
       IF ((conc_cod = 918) OR (conc_cod = 919) OR (conc_cod = 940)) THEN
       BEGIN
        SELECT A.paan_sena FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
      SELECT N.nono_dura FROM NOMINA_NOVEDADES N WHERE N.terc_nit = :nite AND N.nono_periodo = :periodo AND N.nono_ano = :ano AND (N.tnov_cod = 2 OR (N.tnov_cod = 3)) INTO :diasnov;
      IF (:diasnov IS NULL) THEN
      incap = 0;
      ELSE
      incap = (:basico / 30)* :diasnov;
        SELECT c.noex_monto FROM nomina_horasext c WHERE c.noex_ano = :ano AND c.noex_periodio = :periodo AND c.noex_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :horasex;
        IF (horasex IS NOT NULL) THEN
        VALOR = (((((:basico )/30 * :diaslab ) + :comision + :horasex + :retroact + :reembolso)+ :cambsaltrans + :incap) * :PORCEN) /100;
        ELSE
        VALOR = (((((:basico )/30 * :diaslab ) + :comision + :retroact + :reembolso)+ :cambsaltrans + :incap) * :PORCEN) /100;
       END
      END
      ELSE
      IF ((conc_cod = 912) OR (conc_cod = 913)) THEN
      BEGIN
       entidad = :nitafc;
       SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
       IF (comision IS NULL) THEN
       comision = 0;
      SELECT N.nono_dura FROM NOMINA_NOVEDADES N WHERE N.terc_nit = :nite AND N.nono_periodo = :periodo AND N.nono_ano = :ano AND (N.tnov_cod = 2 OR (N.tnov_cod = 3)) INTO :diasnov;
      IF (:diasnov IS NULL) THEN
      incap = 0;
      ELSE
      incap = (:basico / 30)* :diasnov;
        SELECT P.paan_auxtr, P.paan_salminimo FROM PARAMETROS_ANO P WHERE P.paan_ano = :ano INTO :auxtrans, :smlv;
        IF (:basico < (:smlv*2)) THEN
           auxtrans = (:auxtrans / 30) * :diaslab;
        ELSE
           auxtrans = 0;
       IF ((conc_cod = 912) OR (conc_cod = 913) OR (conc_cod = 937)) THEN
       BEGIN
        SELECT A.paan_cesemp FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
        SELECT c.noex_monto FROM nomina_horasext c WHERE c.noex_ano = :ano AND c.noex_periodio = :periodo AND c.noex_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :horasex;
        IF (horasex IS NOT NULL) THEN
        VALOR = (((((:basico )/30 * :diaslab ) + :comision + :horasex + :retroact+ :reembolso)+ :cambsaltrans + :incap+ :auxtrans) * :PORCEN) /100;
        ELSE
        VALOR = (((((:basico )/30 * :diaslab ) + :comision + :retroact + :reembolso)+ :cambsaltrans + :incap + :auxtrans) * :PORCEN) /100;
       END
      END
      ELSE
      BEGIN
       IF (comision IS NULL) THEN
       comision = 0;
       SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
       conc_monto = :basico + :comision;
       IF (conc_porc <> 0 AND conc_porc IS NOT NULL) THEN
       VALOR = (((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans + :incap) * :conc_porc) /100;
       ELSE
       IF (:porcen <> 0 AND :porcen IS NOT NULL) THEN
       VALOR = (((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans + :incap) * :porcen) /100;
       ELSE
       IF (:montos <> 0 AND :montos IS NOT NULL) THEN
       valor = :montos;
       ELSE
       IF (:conc_monto <> 0 AND :conc_monto IS NOT NULL) THEN
       valor = :conc_monto;
      END
     END
     item = :item + 1;
    END
    ELSE
    IF (conc_prov = 'S') THEN
    BEGIN
     SELECT SUM(ce.emco_monto)
     FROM empleado_conceptos CE, CONCEPTOS_NOMINA CN WHERE ((CE.terc_nit = :nite) AND (CE.CONC_COD = CN.CONC_COD) AND (CE.emco_fecini <= :fec AND CE.emco_fecfin >= :FEC) ) OR ((CE.terc_nit = :nite)
     AND (CE.CONC_COD = CN.CONC_COD) AND (cn.conc_todosper = 'N') AND (CE.emco_ppago = :periodo)) OR  ((CE.terc_nit = :nite) AND (CE.CONC_COD = CN.CONC_COD) AND cn.conc_todosper = 'S') AND CN.conc_benefic = 'S'
     INTO :beneficios;
     IF ((conc_cod <> 929) AND (conc_cod <> 930)) THEN
     BEGIN
        SELECT P.paan_auxtr, P.paan_salminimo FROM PARAMETROS_ANO P WHERE P.paan_ano = :ano INTO :auxtrans, :smlv;
        IF (:basico < (:smlv*2)) THEN
           auxtrans = (:auxtrans / 30) * :diaslab;
        ELSE
           auxtrans = 0;
     END
     ELSE
      auxtrans = 0;
     conc_monto = :basico;
     IF (conc_porc <> 0 AND conc_porc IS NOT NULL) THEN
     VALOR = (((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans + :incap + :auxtrans) * :conc_porc) /100;
     ELSE
     IF (porcen <> 0 AND porcen IS NOT NULL) THEN
     VALOR = (((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans + :incap + :auxtrans) * :porcen) /100;
     ELSE
     IF (montos <> 0 AND montos IS NOT NULL) THEN
     VALOR = :montos;
     ELSE
     IF (conc_monto <> 0 AND conc_monto IS NOT NULL) THEN
     VALOR = :conc_monto;
     item = :item + 1;
    END
    ELSE
    IF (conc_cod = 920) THEN
    BEGIN
     SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :valor;
     IF (valor IS NULL) THEN
     valor = 0;
     item = :item + 1;
    END
    ELSE
    IF (conc_cod = 900 OR (:conc_cod = 931)) THEN
    BEGIN
     SELECT c.noex_monto FROM nomina_horasext c WHERE c.noex_ano = :ano AND c.noex_periodio = :periodo AND c.noex_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :valor;
     IF (valor IS NULL) THEN
     valor = 0;
     item = :item + 1;
    END
    ELSE
    IF (conc_cod = 932) THEN
    BEGIN
     SELECT N.nono_dura FROM NOMINA_NOVEDADES N WHERE N.terc_nit = :nite AND N.nono_periodo = :periodo AND N.nono_ano = :ano AND (N.tnov_cod = 2 OR (N.tnov_cod = 3)) INTO :diasnov;
     IF (:diasnov IS NULL) THEN
     valor = 0;
     ELSE
     valor = (:basico / 30)* :diasnov;
    END
    ELSE
    IF (conc_cod = 921) THEN
    BEGIN
     IF (porcen IS NOT NULL AND porcen <> 0) THEN
     valor = ((basico / 30)* :diaslab ) * :PORCEN /100;
     ELSE
     IF (conc_porc IS NOT NULL AND conc_porc <> 0) THEN
     valor = ((basico / 30)* :diaslab ) * :conc_porc /100;
    END
    EXECUTE PROCEDURE LEE_CONFIGURACION('NOMINA','GENERAL','REDONDEO AL MULTIPLO DE DIEZ EN TOTALES')RETURNING_VALUES(:aprox);
    EXECUTE PROCEDURE REDONDEE(:valor, :aprox) RETURNING_VALUES (VALOR);
    IF ((mensual = 'N') OR (periodicidad = 1))  THEN
    INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
    VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
    ELSE
    IF (mensual = 'S') THEN
    BEGIN
     IF ((:periodicidad = 2) AND (liquidaper = 1)) THEN
     BEGIN
      IF ((periodo = 1) OR (periodo = 3) OR (periodo = 5) OR (periodo = 7) OR (periodo = 9) OR (periodo = 11)
      OR (periodo = 13) OR (periodo = 15) OR (periodo = 17) OR (periodo = 19) OR (periodo = 21) OR (periodo = 23)) THEN
      INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
      VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
     END
     ELSE
     IF ((:periodicidad = 2) AND (liquidaper = 2)) THEN
     BEGIN
      IF ((periodo = 2) OR (periodo = 4) OR (periodo = 6) OR (periodo = 8) OR (periodo = 10) OR (periodo = 12)
      OR (periodo = 14) OR (periodo = 16) OR (periodo = 18) OR (periodo = 20) OR (periodo = 22) OR (periodo = 24)) THEN
      INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
      VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
     END
     ELSE
     IF ((:periodicidad = 3) AND (liquidaper = 1)) THEN
     BEGIN
      IF ((periodo = 1) OR (periodo = 5) OR (periodo = 9) OR (periodo = 13) OR (periodo = 17) OR (periodo = 21)
      OR (periodo = 25) OR (periodo = 29) OR (periodo = 33) OR (periodo = 37) OR (periodo = 41) OR (periodo = 45)
      OR (periodo = 49)) THEN
      INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
      VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
    END
    ELSE
     IF ((:periodicidad = 3) AND (liquidaper = 2)) THEN
     BEGIN
      IF ((periodo = 2) OR (periodo = 6) OR (periodo = 10) OR (periodo = 14) OR (periodo = 18) OR (periodo = 22)
      OR (periodo = 26) OR (periodo = 30) OR (periodo = 34) OR (periodo = 38) OR (periodo = 42) OR (periodo = 46)
      OR (periodo = 50)) THEN
      INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
      VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
     END
     ELSE
     IF ((:periodicidad = 3) AND (liquidaper = 3)) THEN
     BEGIN
      IF ((periodo = 3) OR (periodo = 7) OR (periodo = 11) OR (periodo = 15) OR (periodo = 19) OR (periodo = 23)
      OR (periodo = 27) OR (periodo = 31) OR (periodo = 35) OR (periodo = 39) OR (periodo = 43) OR (periodo = 47)
      OR (periodo = 51)) THEN
      INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
      VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
     END
     ELSE
     IF ((:periodicidad = 3) AND (liquidaper = 4)) THEN
     BEGIN
      IF ((periodo = 4) OR (periodo = 8) OR (periodo = 12) OR (periodo = 16) OR (periodo = 20) OR (periodo = 24)
      OR (periodo = 29) OR (periodo = 32) OR (periodo = 36) OR (periodo = 40) OR (periodo = 44) OR (periodo = 48)
      OR (periodo = 52)) THEN
      INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
      VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
     END
    END
  VALOR = 0;
  basico = 0;
   END
  END
 END
 END
 END
 SUSPEND;
END
^

SET TERM ; ^


SET TERM ^ ;

CREATE OR ALTER PROCEDURE CAUSA_NOMINA (
    fec DATE,
    periodo INTEGER,
    periodicidad INTEGER,
    pagoglobal CHAR(1),
    ano CHAR(4),
    depto INTEGER)
RETURNS (
    idnomina INTEGER,
    itemini INTEGER)
AS
DECLARE VARIABLE item INTEGER;
DECLARE VARIABLE nite VARCHAR(20) CHARACTER SET none;
DECLARE VARIABLE nit_tercero VARCHAR(20);
DECLARE VARIABLE concept INTEGER;
DECLARE VARIABLE montos NUMERIC(18,2);
DECLARE VARIABLE porcen NUMERIC(9,4);
DECLARE VARIABLE entidad VARCHAR(20);
DECLARE VARIABLE conc_cod INTEGER;
DECLARE VARIABLE conc_deduc CHAR(1);
DECLARE VARIABLE conc_porc NUMERIC(9,4);
DECLARE VARIABLE conc_entidad INTEGER;
DECLARE VARIABLE conc_monto NUMERIC(18,2);
DECLARE VARIABLE conc_modifi CHAR(1);
DECLARE VARIABLE conc_promedio CHAR(1);
DECLARE VARIABLE emco_perprom INTEGER;
DECLARE VARIABLE valor NUMERIC(18,2);
DECLARE VARIABLE diaslab INTEGER;
DECLARE VARIABLE conc_prov CHAR(1);
DECLARE VARIABLE conc_aporte CHAR(1);
DECLARE VARIABLE numeroprom INTEGER;
DECLARE VARIABLE conc_aplicaprom CHAR(1);
DECLARE VARIABLE perinicial INTEGER;
DECLARE VARIABLE anoprom INTEGER;
DECLARE VARIABLE conc_dias CHAR(1);
DECLARE VARIABLE conc_otroconc CHAR(1);
DECLARE VARIABLE conc_codotroconc INTEGER;
DECLARE VARIABLE anosum INTEGER;
DECLARE VARIABLE salario CHAR(1) CHARACTER SET none;
DECLARE VARIABLE liquidaper INTEGER;
DECLARE VARIABLE rmod NUMERIC(2,2);
DECLARE VARIABLE basico NUMERIC(18,2);
DECLARE VARIABLE niteps VARCHAR(20);
DECLARE VARIABLE nitafc VARCHAR(20);
DECLARE VARIABLE nitafp VARCHAR(20);
DECLARE VARIABLE nitccf VARCHAR(20);
DECLARE VARIABLE gtoempr CHAR(1);
DECLARE VARIABLE comision NUMERIC(18,2);
DECLARE VARIABLE cambsaltrans NUMERIC(18,2);
DECLARE VARIABLE saldosini NUMERIC(18,2);
DECLARE VARIABLE duranov INTEGER;
DECLARE VARIABLE base NUMERIC(18,2);
DECLARE VARIABLE aprox INTEGER;
DECLARE VARIABLE mensual CHAR(1);
DECLARE VARIABLE horasex NUMERIC(18,2);
DECLARE VARIABLE diasnov INTEGER;
DECLARE VARIABLE tomasal INTEGER;
DECLARE VARIABLE retroact NUMERIC(18,2);
DECLARE VARIABLE reembolso NUMERIC(18,2);
DECLARE VARIABLE incap NUMERIC(18,2);
DECLARE VARIABLE deptoempl INTEGER;
DECLARE VARIABLE auxtrans NUMERIC(18,2);
DECLARE VARIABLE smlv NUMERIC(18,2);
DECLARE VARIABLE beneficios NUMERIC(18,2);
DECLARE VARIABLE confirmado CHAR(1);
BEGIN
 SELECT N.NOMI_ID, N.nomi_liqok FROM NOMINA N WHERE N.nomi_periodo = :periodo AND N.nomi_periodocidad = :periodicidad AND N.nomi_ano = :ano
 INTO :IDNOMINA, :CONFIRMADO;
 IF (:idnomina IS NULL) THEN
 BEGIN
  EXECUTE PROCEDURE cambie_id_nomina RETURNING_VALUES(:idnomina);
  INSERT INTO nomina (nomi_id, NOMI_FECCAUSA, NOMI_PAGOGLOBAL, NOMI_PERIODOCIDAD, NOMI_PERIODO, NOMI_ANO, NOMI_LIQOK)
  VALUES (:IDNOMINA, :fec,:pagoglobal, :periodicidad, :periodo, :ano, 'N');
  item = 1;
 END
 ELSE
 BEGIN
  SELECT MAX(N.noco_item) FROM NOMINA_CONCEPTOS N WHERE N.nomi_id = :idnomina
  INTO :item;
 END
 IF ((confirmado = 'S') AND (idnomina IS NOT NULL)) THEN
 BEGIN
  idnomina = 0;
 END
 ELSE
 BEGIN
 IF (DEPTO = 0) THEN
  INSERT INTO NOMINA_DEPARTAMENTO (nomi_id, nodp_depto)VALUES(:IDNOMINA,0);
 ELSE
  INSERT INTO NOMINA_DEPARTAMENTO (nomi_id, nodp_depto)VALUES(:IDNOMINA,:DEPTO);
 ITEMINI = ITEM;
 FOR SELECT E.TERC_NIT, E.empl_salario, e.empl_eps, e.empl_afc, e.empl_afp, e.empl_ccf, e.empl_dpto
 FROM EMPLEADOS E
 WHERE E.empl_ppago = :periodicidad AND ((E.empl_fecret IS NULL) OR (E.empl_fecret > :fec)) AND E.empl_fecing <= :fec
 INTO :nite, :basico, :niteps, :nitafc, :nitafp, :nitccf, :deptoempl
 DO
 BEGIN
 IF ((depto = 0) OR (deptoempl = :depto)) THEN
 BEGIN
  FOR SELECT CE.TERC_NIT, CE.CONC_COD, CE.EMCO_MONTO, CE.EMCO_PORC, ce.empl_entidad, CE.emco_perprom, CE.emco_luquidaper, CE.emco_mensual, CN.CONC_COD, CN.CONC_DEDUC,CN.CONC_PORC, CN.CONC_ENTIDAD, CN.CONC_MONTO,  CN.CONC_DIAS, CN.CONC_MODIFI,
  CN.CONC_PROMEDIO, CN.conc_salario, CE.emco_perprom, CN.conc_prov, CN.conc_aporte, CN.conc_aplicaprom, cn.conc_otroconc, cn.conc_codotroconc, CN.conc_gtoempr, CN.conc_base, CE.emco_tomsal
  FROM empleado_conceptos CE, CONCEPTOS_NOMINA CN WHERE ((CE.terc_nit = :nite) AND (CE.CONC_COD = CN.CONC_COD) AND (CE.emco_fecini <= :fec AND CE.emco_fecfin >= :FEC) ) OR ((CE.terc_nit = :nite)
  AND (CE.CONC_COD = CN.CONC_COD) AND (cn.conc_todosper = 'N') AND (CE.emco_ppago = :periodo)) OR  ((CE.terc_nit = :nite) AND (CE.CONC_COD = CN.CONC_COD) AND cn.conc_todosper = 'S')  ORDER BY (TERC_NIT )
  INTO :nit_tercero, :concept,  :montos, :porcen, :entidad, :numeroprom, :liquidaper, :mensual ,:CONC_COD, :CONC_DEDUC, :CONC_PORC,
  :CONC_ENTIDAD, :CONC_MONTO, :CONC_DIAS, :CONC_MODIFI,:CONC_PROMEDIO, :salario,:EMCO_PERPROM, :conc_prov, :conc_aporte , :CONC_APLICAPROM, :conc_otroconc, :conc_codotroconc, :gtoempr, :base, :tomasal
  DO
  BEGIN
   IF (conc_dias = 'S') THEN
   EXECUTE PROCEDURE DIAS_LABORADOS (:nite, :periodo, :fec, :mensual,:conc_aporte) RETURNING_VALUES (:diaslab);
   ELSE
   BEGIN
    diaslab = 15;
    IF (mensual = 'S') THEN
    BEGIN
     IF (periodicidad = 2) THEN
     diaslab = 30;
     ELSE
     IF (liquidaper = 3) THEN
     diaslab = 30;
    END
   END
   IF (:tomasal <> 0) THEN
   BEGIN
    IF ((:periodicidad = 2) AND (:tomasal <> 2)) THEN
    BEGIN
     IF ((periodo = 2) OR (periodo = 4) OR (periodo = 6) OR (periodo = 8) OR (periodo = 10) OR (periodo = 12)
     OR (periodo = 14) OR (periodo = 16) OR (periodo = 18) OR (periodo = 20) OR (periodo = 22) OR (periodo = 24)) THEN
     basico = 0;
    END
    ELSE
    IF ((:periodicidad = 3) AND (:tomasal <> 1)) THEN
    BEGIN
     IF ((periodo = 1) OR (periodo = 5) OR (periodo = 9) OR (periodo = 13) OR (periodo = 17) OR (periodo = 21)
     OR (periodo = 25) OR (periodo = 29) OR (periodo = 33) OR (periodo = 37) OR (periodo = 41) OR (periodo = 45)
     OR (periodo = 49)) THEN
     basico = 0;
    END
    ELSE
     IF ((:periodicidad = 3) AND (:tomasal <> 2)) THEN
     BEGIN
      IF ((periodo = 2) OR (periodo = 6) OR (periodo = 10) OR (periodo = 14) OR (periodo = 18) OR (periodo = 22)
      OR (periodo = 26) OR (periodo = 30) OR (periodo = 34) OR (periodo = 38) OR (periodo = 42) OR (periodo = 46)
      OR (periodo = 50)) THEN
      basico = 0;
     END
     ELSE
     IF ((:periodicidad = 3) AND (:tomasal <> 3)) THEN
     BEGIN
      IF ((periodo = 3) OR (periodo = 7) OR (periodo = 11) OR (periodo = 15) OR (periodo = 19) OR (periodo = 23)
      OR (periodo = 27) OR (periodo = 31) OR (periodo = 35) OR (periodo = 39) OR (periodo = 43) OR (periodo = 47)
      OR (periodo = 51)) THEN
      basico = 0;
     END
     ELSE
     IF ((:periodicidad = 3) AND (:tomasal <> 4)) THEN
     BEGIN
      IF ((periodo = 4) OR (periodo = 8) OR (periodo = 12) OR (periodo = 16) OR (periodo = 20) OR (periodo = 24)
      OR (periodo = 29) OR (periodo = 32) OR (periodo = 36) OR (periodo = 40) OR (periodo = 44) OR (periodo = 48)
      OR (periodo = 52)) THEN
      basico = 0;
     END
   END
   ELSE
   BEGIN
    SELECT E.empl_salario FROM EMPLEADOS E WHERE E.terc_nit = :nite INTO :basico;
    SELECT ((n.nono_valor /30) * n.nono_dura), (n.nono_dura) FROM nomina_novedades n WHERE n.tnov_cod = 11 AND n.terc_nit = :nite AND n.nono_periodo = :periodo INTO :cambsaltrans, :duranov;
    IF (cambsaltrans IS NULL) THEN
    cambsaltrans = 0;
    IF (duranov IS NULL) THEN
    duranov = 0;
    diaslab = :diaslab - :duranov;
    IF (conc_cod = 922) THEN
    BEGIN
     SELECT SUM(P.prcu_monto) FROM prestamo_cuotas P, prestamo_nomina PN WHERE P.prcu_ano = :ano AND P.prcu_periodo = :periodo AND PN.prno_id = P.prno_id AND PN.terc_nit = :nite INTO :valor;
     IF (valor IS NULL) THEN
     valor = 0;
     item = :item + 1;
     UPDATE prestamo_cuotas  P SET prcu_ok = 'S' WHERE P.prcu_ano = :ano AND P.prcu_periodo = :periodo AND P.prno_id = (SELECT PN.prno_id FROM PRESTAMO_NOMINA PN WHERE PN.terc_nit = :nite);
    END
    ELSE
    IF ((:montos = 0) OR (:montos IS NULL)) THEN
    BEGIN
     IF ((CONC_PORC = 0 AND :porcen = 0) OR (CONC_PORC IS NULL AND :porcen = 0) OR (CONC_PORC = 0 AND :porcen IS NULL) OR (CONC_PORC IS NULL AND :porcen IS NULL) ) THEN
     BEGIN
      IF ((conc_monto <> 0) AND (conc_monto IS NOT NULL) ) THEN
      BEGIN
       VALOR = :CONC_MONTO;
       IF (:conc_dias = 'S') THEN
       valor = (:valor / 30) * :diaslab;
      END
      ELSE
      IF (salario = 'S' AND CONC_COD <> 900 AND CONC_COD <> 920) THEN
      BEGIN
       conc_monto = :basico;
       VALOR = (:conc_monto/30 * :diaslab ) + :cambsaltrans;
      END
      ELSE
      BEGIN
       valor = montos;
       IF (:conc_dias = 'S') THEN
       valor = (:valor / 30) * :diaslab;
      END
     END
     ELSE
     BEGIN
      IF (:porcen <> 0) THEN
      BEGIN
       IF ((conc_monto <> 0) AND (conc_monto IS NOT NULL) ) THEN
       BEGIN
        VALOR = ((:CONC_MONTO ) * :PORCEN) /100;
       END
      END
      ELSE
      BEGIN
       IF ((conc_monto <> 0) AND (conc_monto IS NOT NULL) ) THEN
       BEGIN
        VALOR = ((:CONC_MONTO) * :conc_porc) /100;
       END
       ELSE
       IF (salario = 'S' AND CONC_COD <> 900 AND CONC_COD <> 920) THEN
       BEGIN
        conc_monto = :basico;
        VALOR = ((:CONC_MONTO)+ :cambsaltrans * :conc_porc) /100;
       END
       ELSE
       IF (:conc_monto = 0 AND :montos = 0) THEN
       BEGIN
        conc_monto = :basico;
        VALOR = (((:CONC_MONTO / 30) * :diaslab) + :cambsaltrans * :conc_porc) /100;
       END
      END
     END
    END
    ELSE
    IF ((CONC_PORC = 0 OR (conc_porc IS NULL)) AND (:porcen = 0 OR (porcen IS NULL))) THEN
    BEGIN
     VALOR = (:montos);
     IF (:conc_dias = 'S') THEN
     valor = (:valor / 30) * :diaslab;
    END
    ELSE
    IF (:porcen <> 0 AND porcen IS NOT NULL) THEN
    BEGIN
     VALOR = ((:MONTOS ) * :PORCEN) /100;
    END
    ELSE
    BEGIN
     VALOR = ((:montos) * :CONC_PORC) /100;
    END
    IF (conc_promedio = 'S') THEN
    BEGIN
     perinicial = :periodo - (:numeroprom) + 1;
     anoprom = CAST (ano AS INTEGER);
     IF (perinicial <= 0) THEN
     BEGIN
      perinicial = 1;
      anoprom = CAST(ANO AS INTEGER) - 1;
     END
     SELECT SUM (noco_valor) FROM nomina_conceptos n WHERE n.noco_aplicaprom = 'S' AND N.noco_periodo >= :perinicial - 1 AND N.noco_periodo < :periodo AND N.noco_ano >= :anoprom AND N.noco_ano <= :ano AND terc_nit = :nite INTO :valor;
     valor = ((valor ) / (numeroprom -1 ));
     SELECT NOCO_VALOR FROM NOMINA_CONCEPTOS WHERE CONC_COD = :conc_cod AND TERC_NIT  = :nite AND NOCO_PAGOOK = 'N' AND NOCO_PERIODO = 0 INTO :saldosini;
     IF (saldosini IS NULL) THEN
     saldosini = 0;
     ELSE
     UPDATE nomina_conceptos N SET noco_pagook = 'S' WHERE n.noco_aplicaprom = 'S' AND N.noco_periodo >= :perinicial - 1 AND N.noco_periodo < :periodo AND N.noco_ano >= :anoprom AND N.noco_ano <= :ano  AND CONC_COD = :conc_cod AND terc_nit = :nite AND NOCO_PERIODO = 0;
     VALOR = :valor + :saldosini;
     UPDATE nomina_conceptos N SET noco_pagook = 'S' WHERE n.noco_aplicaprom = 'S' AND N.noco_periodo >= :perinicial - 1 AND N.noco_periodo < :periodo AND N.noco_ano >= :anoprom AND N.noco_ano <= :ano  AND CONC_COD = :conc_cod AND terc_nit = :nite;
    END
    ELSE
    IF (conc_otroconc = 'S') THEN
    BEGIN
     anosum = CAST(ano AS INTEGER);
     anosum = anosum - 1;
     SELECT SUM (noco_valor) FROM nomina_conceptos n WHERE n.noco_ano = :anosum AND n.conc_cod = :conc_codotroconc AND N.terc_nit = :nite INTO :valor;
     SELECT NOCO_VALOR FROM NOMINA_CONCEPTOS WHERE noco_ano = :anosum AND conc_cod = :conc_codotroconc AND terc_nit = :nite AND NOCO_PERIODO = 0 INTO :saldosini;
     IF (saldosini IS NULL) THEN
     saldosini = 0;
     ELSE
     UPDATE nomina_conceptos SET noco_pagook = 'S' WHERE noco_ano = :anosum AND conc_cod = :conc_codotroconc AND NOCO_PERIODO = 0 AND terc_nit = :nite;
     VALOR = :valor + :saldosini;
     UPDATE nomina_conceptos SET noco_pagook = 'S' WHERE noco_ano = :anosum AND conc_cod = :conc_codotroconc AND terc_nit = :nite;
    END
    ELSE
    IF (conc_aporte = 'S') THEN
    BEGIN
     horasex = NULL;
     diasnov = NULL;
     retroact = NULL;
     reembolso = NULL;
     IF ((:entidad = '' ) OR (entidad IS NULL)) THEN
     BEGIN
     SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
      IF (comision IS NULL) THEN
      comision = 0;
      SELECT C.emco_monto FROM EMPLEADO_CONCEPTOS C WHERE C.terc_nit = :nite AND C.conc_cod = 933 INTO :retroact;
      IF (retroact IS NULL ) THEN
      retroact = 0;
      SELECT C.emco_monto FROM EMPLEADO_CONCEPTOS C WHERE C.terc_nit = :nite AND C.conc_cod = 952 INTO :reembolso;
      IF (reembolso IS NULL ) THEN
      reembolso = 0;
      SELECT N.nono_dura FROM NOMINA_NOVEDADES N WHERE N.terc_nit = :nite AND N.nono_periodo = :periodo AND N.nono_ano = :ano AND (N.tnov_cod = 2 OR (N.tnov_cod = 3)) INTO :diasnov;
      IF (:diasnov IS NULL) THEN
      incap = 0;
      ELSE
      incap = (:basico / 30)* :diasnov;
      valor = :basico + :comision + :horasex + :retroact + :reembolso + :incap;
      IF ((conc_cod = 904) OR (conc_cod = 905) OR (conc_cod = 906) OR (conc_cod = 934) ) THEN
      BEGIN
       entidad = :nitafp;
       IF (conc_cod = 904) THEN
       BEGIN
        SELECT A.paan_afptr FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
        SELECT N.nono_dura FROM NOMINA_NOVEDADES N WHERE N.terc_nit = :nite AND N.nono_periodo = :periodo AND N.nono_ano = :ano AND (N.tnov_cod = 2 OR (N.tnov_cod = 3)) INTO :diasnov;
        IF (:diasnov IS NULL) THEN
        incap = 0;
        ELSE
        incap = (:basico / 30)* :diasnov;
        SELECT c.noex_monto FROM nomina_horasext c WHERE c.noex_ano = :ano AND c.noex_periodio = :periodo AND c.noex_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :horasex;
        IF (horasex IS NOT NULL) THEN
        VALOR = (((((:basico )/30 * :diaslab ) + :comision + :horasex + :retroact+ :reembolso + :incap)+ :cambsaltrans ) * :PORCEN) /100;
        ELSE
        VALOR = ((((:basico)/30 * :diaslab ) + :comision + :retroact+ :reembolso + :cambsaltrans  + :incap) * :PORCEN) /100;
       END
       ELSE
       IF ((conc_cod = 905) OR (conc_cod = 906) OR (conc_cod = 934)) THEN
       BEGIN
        SELECT A.paan_afpem FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
        SELECT N.nono_dura FROM NOMINA_NOVEDADES N WHERE N.terc_nit = :nite AND N.nono_periodo = :periodo AND N.nono_ano = :ano AND (N.tnov_cod = 2 OR (N.tnov_cod = 3)) INTO :diasnov;
        IF (:diasnov IS NULL) THEN
        incap = 0;
        ELSE
        incap = (:basico / 30)* :diasnov;
        SELECT c.noex_monto FROM nomina_horasext c WHERE c.noex_ano = :ano AND c.noex_periodio = :periodo AND c.noex_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :horasex;
        IF (horasex IS NOT NULL) THEN
        VALOR = (((((:basico )/30 * :diaslab ) + :comision + :horasex + :retroact + :reembolso)+ :cambsaltrans + :incap) * :PORCEN) /100;
        ELSE
        VALOR = (((((:basico )/30 * :diaslab ) + :comision + :retroact + :reembolso)+ :cambsaltrans + :incap) * :PORCEN) /100;
       END
      END
      ELSE
      IF ((conc_cod = 907) OR (conc_cod = 914) OR (conc_cod = 915) OR (conc_cod = 938) ) THEN
      BEGIN
       entidad = :niteps;
       IF (conc_cod = 907) THEN
       BEGIN
        SELECT A.paan_epstr FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
        SELECT N.nono_dura FROM NOMINA_NOVEDADES N WHERE N.terc_nit = :nite AND N.nono_periodo = :periodo AND N.nono_ano = :ano AND (N.tnov_cod = 2 OR (N.tnov_cod = 3)) INTO :diasnov;
        IF (:diasnov IS NULL) THEN
        incap = 0;
        ELSE
        incap = (:basico / 30)* :diasnov;
        SELECT c.noex_monto FROM nomina_horasext c WHERE c.noex_ano = :ano AND c.noex_periodio = :periodo AND c.noex_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :horasex;
        IF (horasex IS NOT NULL) THEN
        VALOR = (((((:basico )/30 * :diaslab ) + :comision + :horasex + :retroact + :reembolso)+ :cambsaltrans + :incap) * :PORCEN) /100;
        ELSE
        VALOR = (((((:basico )/30 * :diaslab ) + :comision + :retroact + :reembolso)+ :cambsaltrans + :incap) * :PORCEN) /100;
       END
       ELSE
       IF ((conc_cod = 914) OR (conc_cod = 915) OR (conc_cod = 938)) THEN
       BEGIN
        SELECT A.paan_epsem FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
        SELECT N.nono_dura FROM NOMINA_NOVEDADES N WHERE N.terc_nit = :nite AND N.nono_periodo = :periodo AND N.nono_ano = :ano AND (N.tnov_cod = 2 OR (N.tnov_cod = 3)) INTO :diasnov;
        IF (:diasnov IS NULL) THEN
        incap = 0;
        ELSE
        incap = (:basico / 30)* :diasnov;
        SELECT c.noex_monto FROM nomina_horasext c WHERE c.noex_ano = :ano AND c.noex_periodio = :periodo AND c.noex_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :horasex;
        IF (horasex IS NOT NULL) THEN
        VALOR = (((((:basico )/30 * :diaslab ) + :comision + :horasex + :retroact + :reembolso)+ :cambsaltrans + :incap) * :PORCEN) /100;
        ELSE
        VALOR = (((((:basico )/30 * :diaslab ) + :comision + :retroact + :reembolso)+ :cambsaltrans + :incap) * :PORCEN) /100;
       END
      END
      ELSE
      IF ((conc_cod = 910) OR (conc_cod = 911) OR (conc_cod = 916) OR (conc_cod = 917) OR (conc_cod = 918) OR (conc_cod = 919) OR (conc_cod = 936) OR (conc_cod = 939) OR (conc_cod = 940)) THEN
      BEGIN
       entidad = :nitccf;
       SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
       IF (comision IS NULL) THEN
       comision = 0;
       SELECT N.nono_dura FROM NOMINA_NOVEDADES N WHERE N.terc_nit = :nite AND N.nono_periodo = :periodo AND N.nono_ano = :ano AND (N.tnov_cod = 2 OR (N.tnov_cod = 3)) INTO :diasnov;
       IF (:diasnov IS NULL) THEN
       incap = 0;
       ELSE
       incap = (:basico / 30)* :diasnov;
       IF ((conc_cod = 910) OR (conc_cod = 911) OR (conc_cod = 936)) THEN
       BEGIN
        SELECT A.paan_ccf FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
      SELECT N.nono_dura FROM NOMINA_NOVEDADES N WHERE N.terc_nit = :nite AND N.nono_periodo = :periodo AND N.nono_ano = :ano AND (N.tnov_cod = 2 OR (N.tnov_cod = 3)) INTO :diasnov;
      IF (:diasnov IS NULL) THEN
      incap = 0;
      ELSE
      incap = (:basico / 30)* :diasnov;
        SELECT c.noex_monto FROM nomina_horasext c WHERE c.noex_ano = :ano AND c.noex_periodio = :periodo AND c.noex_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :horasex;
        IF (horasex IS NOT NULL) THEN
        VALOR = (((((:basico )/30 * :diaslab ) + :comision + :horasex + :retroact + :reembolso)+ :cambsaltrans + :incap) * :PORCEN) /100;
        ELSE
        VALOR = (((((:basico )/30 * :diaslab ) + :comision + :retroact + :reembolso)+ :cambsaltrans + :incap) * :PORCEN) /100;
       END
       ELSE
       IF ((conc_cod = 916) OR (conc_cod = 917) OR (conc_cod = 939)) THEN
       BEGIN
        SELECT A.paan_icbf FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
      SELECT N.nono_dura FROM NOMINA_NOVEDADES N WHERE N.terc_nit = :nite AND N.nono_periodo = :periodo AND N.nono_ano = :ano AND (N.tnov_cod = 2 OR (N.tnov_cod = 3)) INTO :diasnov;
      IF (:diasnov IS NULL) THEN
      incap = 0;
      ELSE
      incap = (:basico / 30)* :diasnov;
      SELECT N.nono_dura FROM NOMINA_NOVEDADES N WHERE N.terc_nit = :nite AND N.nono_periodo = :periodo AND N.nono_ano = :ano AND (N.tnov_cod = 2 OR (N.tnov_cod = 3)) INTO :diasnov;
      IF (:diasnov IS NULL) THEN
      incap = 0;
      ELSE
      incap = (:basico / 30)* :diasnov;
        SELECT c.noex_monto FROM nomina_horasext c WHERE c.noex_ano = :ano AND c.noex_periodio = :periodo AND c.noex_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :horasex;
        IF (horasex IS NOT NULL) THEN
        VALOR = (((((:basico )/30 * :diaslab ) + :comision + :horasex + :retroact + :reembolso)+ :cambsaltrans + :incap) * :PORCEN) /100;
        ELSE
        VALOR = (((((:basico )/30 * :diaslab ) + :comision + :retroact + :reembolso)+ :cambsaltrans + :incap) * :PORCEN) /100;
       END
       ELSE
       IF ((conc_cod = 918) OR (conc_cod = 919) OR (conc_cod = 940)) THEN
       BEGIN
        SELECT A.paan_sena FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
      SELECT N.nono_dura FROM NOMINA_NOVEDADES N WHERE N.terc_nit = :nite AND N.nono_periodo = :periodo AND N.nono_ano = :ano AND (N.tnov_cod = 2 OR (N.tnov_cod = 3)) INTO :diasnov;
      IF (:diasnov IS NULL) THEN
      incap = 0;
      ELSE
      incap = (:basico / 30)* :diasnov;
        SELECT c.noex_monto FROM nomina_horasext c WHERE c.noex_ano = :ano AND c.noex_periodio = :periodo AND c.noex_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :horasex;
        IF (horasex IS NOT NULL) THEN
        VALOR = (((((:basico )/30 * :diaslab ) + :comision + :horasex + :retroact + :reembolso)+ :cambsaltrans + :incap) * :PORCEN) /100;
        ELSE
        VALOR = (((((:basico )/30 * :diaslab ) + :comision + :retroact + :reembolso)+ :cambsaltrans + :incap) * :PORCEN) /100;
       END
      END
      ELSE
      IF ((conc_cod = 912) OR (conc_cod = 913)) THEN
      BEGIN
       entidad = :nitafc;
       SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
       IF (comision IS NULL) THEN
       comision = 0;
      SELECT N.nono_dura FROM NOMINA_NOVEDADES N WHERE N.terc_nit = :nite AND N.nono_periodo = :periodo AND N.nono_ano = :ano AND (N.tnov_cod = 2 OR (N.tnov_cod = 3)) INTO :diasnov;
      IF (:diasnov IS NULL) THEN
      incap = 0;
      ELSE
      incap = (:basico / 30)* :diasnov;
      SELECT SUM(ce.emco_monto)
      FROM empleado_conceptos CE, CONCEPTOS_NOMINA CN WHERE ((CE.terc_nit = :nite) AND (CE.CONC_COD = CN.CONC_COD) AND (CE.emco_fecini <= :fec AND CE.emco_fecfin >= :FEC) ) OR ((CE.terc_nit = :nite)
      AND (CE.CONC_COD = CN.CONC_COD) AND (cn.conc_todosper = 'N') AND (CE.emco_ppago = :periodo)) OR  ((CE.terc_nit = :nite) AND (CE.CONC_COD = CN.CONC_COD) AND cn.conc_todosper = 'S') AND CN.conc_benefic = 'S'
      INTO :beneficios;
      IF (beneficios IS NULL) THEN
       beneficios = 0;
      SELECT P.paan_auxtr, P.paan_salminimo FROM PARAMETROS_ANO P WHERE P.paan_ano = :ano INTO :auxtrans, :smlv;
      IF (:basico < (:smlv*2)) THEN
       auxtrans = (:auxtrans / 30) * :diaslab;
      ELSE
       auxtrans = 0;
       IF ((conc_cod = 912) OR (conc_cod = 913) OR (conc_cod = 937)) THEN
       BEGIN
        SELECT A.paan_cesemp FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
        SELECT c.noex_monto FROM nomina_horasext c WHERE c.noex_ano = :ano AND c.noex_periodio = :periodo AND c.noex_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :horasex;
        IF (horasex IS NOT NULL) THEN
        VALOR = (((((:basico )/30 * :diaslab ) + :comision + :horasex + :retroact+ :reembolso)+ :cambsaltrans + :incap+ :auxtrans + :beneficios) * :PORCEN) /100;
        ELSE
        VALOR = (((((:basico )/30 * :diaslab ) + :comision + :retroact + :reembolso)+ :cambsaltrans + :incap + :auxtrans + :beneficios) * :PORCEN) /100;
       END
      END
      ELSE
      BEGIN
       IF (comision IS NULL) THEN
       comision = 0;
       SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
       conc_monto = :basico + :comision;
       IF (conc_porc <> 0 AND conc_porc IS NOT NULL) THEN
       VALOR = (((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans + :incap) * :conc_porc) /100;
       ELSE
       IF (:porcen <> 0 AND :porcen IS NOT NULL) THEN
       VALOR = (((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans + :incap) * :porcen) /100;
       ELSE
       IF (:montos <> 0 AND :montos IS NOT NULL) THEN
       valor = :montos;
       ELSE
       IF (:conc_monto <> 0 AND :conc_monto IS NOT NULL) THEN
       valor = :conc_monto;
      END
     END
     item = :item + 1;
    END
    ELSE
    IF (conc_prov = 'S') THEN
    BEGIN
     SELECT SUM(ce.emco_monto)
     FROM empleado_conceptos CE, CONCEPTOS_NOMINA CN WHERE ((CE.terc_nit = :nite) AND (CE.CONC_COD = CN.CONC_COD) AND (CE.emco_fecini <= :fec AND CE.emco_fecfin >= :FEC) ) OR ((CE.terc_nit = :nite)
     AND (CE.CONC_COD = CN.CONC_COD) AND (cn.conc_todosper = 'N') AND (CE.emco_ppago = :periodo)) OR  ((CE.terc_nit = :nite) AND (CE.CONC_COD = CN.CONC_COD) AND cn.conc_todosper = 'S') AND CN.conc_benefic = 'S'
     INTO :beneficios;
     IF (beneficios IS NULL) THEN
      beneficios = 0;
     IF ((conc_cod <> 929) AND (conc_cod <> 930)) THEN
     BEGIN
        SELECT P.paan_auxtr, P.paan_salminimo FROM PARAMETROS_ANO P WHERE P.paan_ano = :ano INTO :auxtrans, :smlv;
        IF (:basico < (:smlv*2)) THEN
           auxtrans = (:auxtrans / 30) * :diaslab;
        ELSE
           auxtrans = 0;
     END
     ELSE
      auxtrans = 0;
     conc_monto = :basico;
     IF (conc_porc <> 0 AND conc_porc IS NOT NULL) THEN
     VALOR = (((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans + :incap + :auxtrans + :beneficios) * :conc_porc) /100;
     ELSE
     IF (porcen <> 0 AND porcen IS NOT NULL) THEN
     VALOR = (((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans + :incap + :auxtrans + :beneficios) * :porcen) /100;
     ELSE
     IF (montos <> 0 AND montos IS NOT NULL) THEN
     VALOR = :montos;
     ELSE
     IF (conc_monto <> 0 AND conc_monto IS NOT NULL) THEN
     VALOR = :conc_monto;
     item = :item + 1;
    END
    ELSE
    IF (conc_cod = 920) THEN
    BEGIN
     SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :valor;
     IF (valor IS NULL) THEN
     valor = 0;
     item = :item + 1;
    END
    ELSE
    IF (conc_cod = 900 OR (:conc_cod = 931)) THEN
    BEGIN
     SELECT c.noex_monto FROM nomina_horasext c WHERE c.noex_ano = :ano AND c.noex_periodio = :periodo AND c.noex_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :valor;
     IF (valor IS NULL) THEN
     valor = 0;
     item = :item + 1;
    END
    ELSE
    IF (conc_cod = 932) THEN
    BEGIN
     SELECT N.nono_dura FROM NOMINA_NOVEDADES N WHERE N.terc_nit = :nite AND N.nono_periodo = :periodo AND N.nono_ano = :ano AND (N.tnov_cod = 2 OR (N.tnov_cod = 3)) INTO :diasnov;
     IF (:diasnov IS NULL) THEN
     valor = 0;
     ELSE
     valor = (:basico / 30)* :diasnov;
    END
    ELSE
    IF (conc_cod = 921) THEN
    BEGIN
     IF (porcen IS NOT NULL AND porcen <> 0) THEN
     valor = ((basico / 30)* :diaslab ) * :PORCEN /100;
     ELSE
     IF (conc_porc IS NOT NULL AND conc_porc <> 0) THEN
     valor = ((basico / 30)* :diaslab ) * :conc_porc /100;
    END
    EXECUTE PROCEDURE LEE_CONFIGURACION('NOMINA','GENERAL','REDONDEO AL MULTIPLO DE DIEZ EN TOTALES')RETURNING_VALUES(:aprox);
    EXECUTE PROCEDURE REDONDEE(:valor, :aprox) RETURNING_VALUES (VALOR);
    IF ((mensual = 'N') OR (periodicidad = 1))  THEN
    INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
    VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
    ELSE
    IF (mensual = 'S') THEN
    BEGIN
     IF ((:periodicidad = 2) AND (liquidaper = 1)) THEN
     BEGIN
      IF ((periodo = 1) OR (periodo = 3) OR (periodo = 5) OR (periodo = 7) OR (periodo = 9) OR (periodo = 11)
      OR (periodo = 13) OR (periodo = 15) OR (periodo = 17) OR (periodo = 19) OR (periodo = 21) OR (periodo = 23)) THEN
      INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
      VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
     END
     ELSE
     IF ((:periodicidad = 2) AND (liquidaper = 2)) THEN
     BEGIN
      IF ((periodo = 2) OR (periodo = 4) OR (periodo = 6) OR (periodo = 8) OR (periodo = 10) OR (periodo = 12)
      OR (periodo = 14) OR (periodo = 16) OR (periodo = 18) OR (periodo = 20) OR (periodo = 22) OR (periodo = 24)) THEN
      INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
      VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
     END
     ELSE
     IF ((:periodicidad = 3) AND (liquidaper = 1)) THEN
     BEGIN
      IF ((periodo = 1) OR (periodo = 5) OR (periodo = 9) OR (periodo = 13) OR (periodo = 17) OR (periodo = 21)
      OR (periodo = 25) OR (periodo = 29) OR (periodo = 33) OR (periodo = 37) OR (periodo = 41) OR (periodo = 45)
      OR (periodo = 49)) THEN
      INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
      VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
    END
    ELSE
     IF ((:periodicidad = 3) AND (liquidaper = 2)) THEN
     BEGIN
      IF ((periodo = 2) OR (periodo = 6) OR (periodo = 10) OR (periodo = 14) OR (periodo = 18) OR (periodo = 22)
      OR (periodo = 26) OR (periodo = 30) OR (periodo = 34) OR (periodo = 38) OR (periodo = 42) OR (periodo = 46)
      OR (periodo = 50)) THEN
      INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
      VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
     END
     ELSE
     IF ((:periodicidad = 3) AND (liquidaper = 3)) THEN
     BEGIN
      IF ((periodo = 3) OR (periodo = 7) OR (periodo = 11) OR (periodo = 15) OR (periodo = 19) OR (periodo = 23)
      OR (periodo = 27) OR (periodo = 31) OR (periodo = 35) OR (periodo = 39) OR (periodo = 43) OR (periodo = 47)
      OR (periodo = 51)) THEN
      INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
      VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
     END
     ELSE
     IF ((:periodicidad = 3) AND (liquidaper = 4)) THEN
     BEGIN
      IF ((periodo = 4) OR (periodo = 8) OR (periodo = 12) OR (periodo = 16) OR (periodo = 20) OR (periodo = 24)
      OR (periodo = 29) OR (periodo = 32) OR (periodo = 36) OR (periodo = 40) OR (periodo = 44) OR (periodo = 48)
      OR (periodo = 52)) THEN
      INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
      VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
     END
    END
  VALOR = 0;
  basico = 0;
   END
  END
 END
 END
 END
 SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER PROCEDURE CAUSA_NOMINA (
    fec DATE,
    periodo INTEGER,
    periodicidad INTEGER,
    pagoglobal CHAR(1),
    ano CHAR(4),
    depto INTEGER)
RETURNS (
    idnomina INTEGER,
    itemini INTEGER)
AS
DECLARE VARIABLE item INTEGER;
DECLARE VARIABLE nite VARCHAR(20) CHARACTER SET none;
DECLARE VARIABLE nit_tercero VARCHAR(20);
DECLARE VARIABLE concept INTEGER;
DECLARE VARIABLE montos NUMERIC(18,2);
DECLARE VARIABLE porcen NUMERIC(9,4);
DECLARE VARIABLE entidad VARCHAR(20);
DECLARE VARIABLE conc_cod INTEGER;
DECLARE VARIABLE conc_deduc CHAR(1);
DECLARE VARIABLE conc_porc NUMERIC(9,4);
DECLARE VARIABLE conc_entidad INTEGER;
DECLARE VARIABLE conc_monto NUMERIC(18,2);
DECLARE VARIABLE conc_modifi CHAR(1);
DECLARE VARIABLE conc_promedio CHAR(1);
DECLARE VARIABLE emco_perprom INTEGER;
DECLARE VARIABLE valor NUMERIC(18,2);
DECLARE VARIABLE diaslab INTEGER;
DECLARE VARIABLE conc_prov CHAR(1);
DECLARE VARIABLE conc_aporte CHAR(1);
DECLARE VARIABLE numeroprom INTEGER;
DECLARE VARIABLE conc_aplicaprom CHAR(1);
DECLARE VARIABLE perinicial INTEGER;
DECLARE VARIABLE anoprom INTEGER;
DECLARE VARIABLE conc_dias CHAR(1);
DECLARE VARIABLE conc_otroconc CHAR(1);
DECLARE VARIABLE conc_codotroconc INTEGER;
DECLARE VARIABLE anosum INTEGER;
DECLARE VARIABLE salario CHAR(1) CHARACTER SET none;
DECLARE VARIABLE liquidaper INTEGER;
DECLARE VARIABLE rmod NUMERIC(2,2);
DECLARE VARIABLE basico NUMERIC(18,2);
DECLARE VARIABLE niteps VARCHAR(20);
DECLARE VARIABLE nitafc VARCHAR(20);
DECLARE VARIABLE nitafp VARCHAR(20);
DECLARE VARIABLE nitccf VARCHAR(20);
DECLARE VARIABLE gtoempr CHAR(1);
DECLARE VARIABLE comision NUMERIC(18,2);
DECLARE VARIABLE cambsaltrans NUMERIC(18,2);
DECLARE VARIABLE saldosini NUMERIC(18,2);
DECLARE VARIABLE duranov INTEGER;
DECLARE VARIABLE base NUMERIC(18,2);
DECLARE VARIABLE aprox INTEGER;
DECLARE VARIABLE mensual CHAR(1);
DECLARE VARIABLE horasex NUMERIC(18,2);
DECLARE VARIABLE diasnov INTEGER;
DECLARE VARIABLE tomasal INTEGER;
DECLARE VARIABLE retroact NUMERIC(18,2);
DECLARE VARIABLE reembolso NUMERIC(18,2);
DECLARE VARIABLE incap NUMERIC(18,2);
DECLARE VARIABLE deptoempl INTEGER;
DECLARE VARIABLE auxtrans NUMERIC(18,2);
DECLARE VARIABLE smlv NUMERIC(18,2);
DECLARE VARIABLE beneficios NUMERIC(18,2);
DECLARE VARIABLE confirmado CHAR(1);
BEGIN
 SELECT N.NOMI_ID, N.nomi_liqok FROM NOMINA N WHERE N.nomi_periodo = :periodo AND N.nomi_periodocidad = :periodicidad AND N.nomi_ano = :ano
 INTO :IDNOMINA, :CONFIRMADO;
 IF (:idnomina IS NULL) THEN
 BEGIN
  EXECUTE PROCEDURE cambie_id_nomina RETURNING_VALUES(:idnomina);
  INSERT INTO nomina (nomi_id, NOMI_FECCAUSA, NOMI_PAGOGLOBAL, NOMI_PERIODOCIDAD, NOMI_PERIODO, NOMI_ANO, NOMI_LIQOK)
  VALUES (:IDNOMINA, :fec,:pagoglobal, :periodicidad, :periodo, :ano, 'N');
  item = 1;
 END
 ELSE
 BEGIN
  SELECT MAX(N.noco_item) FROM NOMINA_CONCEPTOS N WHERE N.nomi_id = :idnomina
  INTO :item;
 END
 IF ((confirmado = 'S') AND (idnomina IS NOT NULL)) THEN
 BEGIN
  idnomina = 0;
 END
 ELSE
 BEGIN
 IF (DEPTO = 0) THEN
  INSERT INTO NOMINA_DEPARTAMENTO (nomi_id, nodp_depto)VALUES(:IDNOMINA,0);
 ELSE
  INSERT INTO NOMINA_DEPARTAMENTO (nomi_id, nodp_depto)VALUES(:IDNOMINA,:DEPTO);
 ITEMINI = ITEM;
 FOR SELECT E.TERC_NIT, E.empl_salario, e.empl_eps, e.empl_afc, e.empl_afp, e.empl_ccf, e.empl_dpto
 FROM EMPLEADOS E
 WHERE E.empl_ppago = :periodicidad AND ((E.empl_fecret IS NULL) OR (E.empl_fecret > :fec)) AND E.empl_fecing <= :fec
 INTO :nite, :basico, :niteps, :nitafc, :nitafp, :nitccf, :deptoempl
 DO
 BEGIN
 IF ((depto = 0) OR (deptoempl = :depto)) THEN
 BEGIN
  FOR SELECT CE.TERC_NIT, CE.CONC_COD, CE.EMCO_MONTO, CE.EMCO_PORC, ce.empl_entidad, CE.emco_perprom, CE.emco_luquidaper, CE.emco_mensual, CN.CONC_COD, CN.CONC_DEDUC,CN.CONC_PORC, CN.CONC_ENTIDAD, CN.CONC_MONTO,  CN.CONC_DIAS, CN.CONC_MODIFI,
  CN.CONC_PROMEDIO, CN.conc_salario, CE.emco_perprom, CN.conc_prov, CN.conc_aporte, CN.conc_aplicaprom, cn.conc_otroconc, cn.conc_codotroconc, CN.conc_gtoempr, CN.conc_base, CE.emco_tomsal
  FROM empleado_conceptos CE, CONCEPTOS_NOMINA CN WHERE ((CE.terc_nit = :nite) AND (CE.CONC_COD = CN.CONC_COD) AND (CE.emco_fecini <= :fec AND CE.emco_fecfin >= :FEC) ) OR ((CE.terc_nit = :nite)
  AND (CE.CONC_COD = CN.CONC_COD) AND (cn.conc_todosper = 'N') AND (CE.emco_ppago = :periodo)) OR  ((CE.terc_nit = :nite) AND (CE.CONC_COD = CN.CONC_COD) AND cn.conc_todosper = 'S')  ORDER BY (TERC_NIT )
  INTO :nit_tercero, :concept,  :montos, :porcen, :entidad, :numeroprom, :liquidaper, :mensual ,:CONC_COD, :CONC_DEDUC, :CONC_PORC,
  :CONC_ENTIDAD, :CONC_MONTO, :CONC_DIAS, :CONC_MODIFI,:CONC_PROMEDIO, :salario,:EMCO_PERPROM, :conc_prov, :conc_aporte , :CONC_APLICAPROM, :conc_otroconc, :conc_codotroconc, :gtoempr, :base, :tomasal
  DO
  BEGIN
   IF (conc_dias = 'S') THEN
   EXECUTE PROCEDURE DIAS_LABORADOS (:nite, :periodo, :fec, :mensual,:conc_aporte) RETURNING_VALUES (:diaslab);
   ELSE
   BEGIN
    diaslab = 15;
    IF (mensual = 'S') THEN
    BEGIN
     IF (periodicidad = 2) THEN
     diaslab = 30;
     ELSE
     IF (liquidaper = 3) THEN
     diaslab = 30;
    END
   END
   IF (:tomasal <> 0) THEN
   BEGIN
    IF ((:periodicidad = 2) AND (:tomasal <> 2)) THEN
    BEGIN
     IF ((periodo = 2) OR (periodo = 4) OR (periodo = 6) OR (periodo = 8) OR (periodo = 10) OR (periodo = 12)
     OR (periodo = 14) OR (periodo = 16) OR (periodo = 18) OR (periodo = 20) OR (periodo = 22) OR (periodo = 24)) THEN
     basico = 0;
    END
    ELSE
    IF ((:periodicidad = 3) AND (:tomasal <> 1)) THEN
    BEGIN
     IF ((periodo = 1) OR (periodo = 5) OR (periodo = 9) OR (periodo = 13) OR (periodo = 17) OR (periodo = 21)
     OR (periodo = 25) OR (periodo = 29) OR (periodo = 33) OR (periodo = 37) OR (periodo = 41) OR (periodo = 45)
     OR (periodo = 49)) THEN
     basico = 0;
    END
    ELSE
     IF ((:periodicidad = 3) AND (:tomasal <> 2)) THEN
     BEGIN
      IF ((periodo = 2) OR (periodo = 6) OR (periodo = 10) OR (periodo = 14) OR (periodo = 18) OR (periodo = 22)
      OR (periodo = 26) OR (periodo = 30) OR (periodo = 34) OR (periodo = 38) OR (periodo = 42) OR (periodo = 46)
      OR (periodo = 50)) THEN
      basico = 0;
     END
     ELSE
     IF ((:periodicidad = 3) AND (:tomasal <> 3)) THEN
     BEGIN
      IF ((periodo = 3) OR (periodo = 7) OR (periodo = 11) OR (periodo = 15) OR (periodo = 19) OR (periodo = 23)
      OR (periodo = 27) OR (periodo = 31) OR (periodo = 35) OR (periodo = 39) OR (periodo = 43) OR (periodo = 47)
      OR (periodo = 51)) THEN
      basico = 0;
     END
     ELSE
     IF ((:periodicidad = 3) AND (:tomasal <> 4)) THEN
     BEGIN
      IF ((periodo = 4) OR (periodo = 8) OR (periodo = 12) OR (periodo = 16) OR (periodo = 20) OR (periodo = 24)
      OR (periodo = 29) OR (periodo = 32) OR (periodo = 36) OR (periodo = 40) OR (periodo = 44) OR (periodo = 48)
      OR (periodo = 52)) THEN
      basico = 0;
     END
   END
   ELSE
   BEGIN
    SELECT E.empl_salario FROM EMPLEADOS E WHERE E.terc_nit = :nite INTO :basico;
    SELECT ((n.nono_valor /30) * n.nono_dura), (n.nono_dura) FROM nomina_novedades n WHERE n.tnov_cod = 11 AND n.terc_nit = :nite AND n.nono_periodo = :periodo INTO :cambsaltrans, :duranov;
    IF (cambsaltrans IS NULL) THEN
    cambsaltrans = 0;
    IF (duranov IS NULL) THEN
    duranov = 0;
    diaslab = :diaslab - :duranov;
    IF (conc_cod = 922) THEN
    BEGIN
     SELECT SUM(P.prcu_monto) FROM prestamo_cuotas P, prestamo_nomina PN WHERE P.prcu_ano = :ano AND P.prcu_periodo = :periodo AND PN.prno_id = P.prno_id AND PN.terc_nit = :nite INTO :valor;
     IF (valor IS NULL) THEN
     valor = 0;
     item = :item + 1;
     UPDATE prestamo_cuotas  P SET prcu_ok = 'S' WHERE P.prcu_ano = :ano AND P.prcu_periodo = :periodo AND P.prno_id = (SELECT PN.prno_id FROM PRESTAMO_NOMINA PN WHERE PN.terc_nit = :nite);
    END
    ELSE
    IF ((:montos = 0) OR (:montos IS NULL)) THEN
    BEGIN
     IF ((CONC_PORC = 0 AND :porcen = 0) OR (CONC_PORC IS NULL AND :porcen = 0) OR (CONC_PORC = 0 AND :porcen IS NULL) OR (CONC_PORC IS NULL AND :porcen IS NULL) ) THEN
     BEGIN
      IF ((conc_monto <> 0) AND (conc_monto IS NOT NULL) ) THEN
      BEGIN
       VALOR = :CONC_MONTO;
       IF (:conc_dias = 'S') THEN
       valor = (:valor / 30) * :diaslab;
      END
      ELSE
      IF (salario = 'S' AND CONC_COD <> 900 AND CONC_COD <> 920) THEN
      BEGIN
       conc_monto = :basico;
       VALOR = (:conc_monto/30 * :diaslab ) + :cambsaltrans;
      END
      ELSE
      BEGIN
       valor = montos;
       IF (:conc_dias = 'S') THEN
       valor = (:valor / 30) * :diaslab;
      END
     END
     ELSE
     BEGIN
      IF (:porcen <> 0) THEN
      BEGIN
       IF ((conc_monto <> 0) AND (conc_monto IS NOT NULL) ) THEN
       BEGIN
        VALOR = ((:CONC_MONTO ) * :PORCEN) /100;
       END
      END
      ELSE
      BEGIN
       IF ((conc_monto <> 0) AND (conc_monto IS NOT NULL) ) THEN
       BEGIN
        VALOR = ((:CONC_MONTO) * :conc_porc) /100;
       END
       ELSE
       IF (salario = 'S' AND CONC_COD <> 900 AND CONC_COD <> 920) THEN
       BEGIN
        conc_monto = :basico;
        VALOR = ((:CONC_MONTO)+ :cambsaltrans * :conc_porc) /100;
       END
       ELSE
       IF (:conc_monto = 0 AND :montos = 0) THEN
       BEGIN
        conc_monto = :basico;
        VALOR = (((:CONC_MONTO / 30) * :diaslab) + :cambsaltrans * :conc_porc) /100;
       END
      END
     END
    END
    ELSE
    IF ((CONC_PORC = 0 OR (conc_porc IS NULL)) AND (:porcen = 0 OR (porcen IS NULL))) THEN
    BEGIN
     VALOR = (:montos);
     IF (:conc_dias = 'S') THEN
     valor = (:valor / 30) * :diaslab;
    END
    ELSE
    IF (:porcen <> 0 AND porcen IS NOT NULL) THEN
    BEGIN
     VALOR = ((:MONTOS ) * :PORCEN) /100;
    END
    ELSE
    BEGIN
     VALOR = ((:montos) * :CONC_PORC) /100;
    END
    IF (conc_promedio = 'S') THEN
    BEGIN
     perinicial = :periodo - (:numeroprom) + 1;
     anoprom = CAST (ano AS INTEGER);
     IF (perinicial <= 0) THEN
     BEGIN
      perinicial = 1;
      anoprom = CAST(ANO AS INTEGER) - 1;
     END
     SELECT SUM (noco_valor) FROM nomina_conceptos n WHERE n.noco_aplicaprom = 'S' AND N.noco_periodo >= :perinicial - 1 AND N.noco_periodo < :periodo AND N.noco_ano >= :anoprom AND N.noco_ano <= :ano AND terc_nit = :nite INTO :valor;
     valor = ((valor ) / (numeroprom -1 ));
     SELECT NOCO_VALOR FROM NOMINA_CONCEPTOS WHERE CONC_COD = :conc_cod AND TERC_NIT  = :nite AND NOCO_PAGOOK = 'N' AND NOCO_PERIODO = 0 INTO :saldosini;
     IF (saldosini IS NULL) THEN
     saldosini = 0;
     ELSE
     UPDATE nomina_conceptos N SET noco_pagook = 'S' WHERE n.noco_aplicaprom = 'S' AND N.noco_periodo >= :perinicial - 1 AND N.noco_periodo < :periodo AND N.noco_ano >= :anoprom AND N.noco_ano <= :ano  AND CONC_COD = :conc_cod AND terc_nit = :nite AND NOCO_PERIODO = 0;
     VALOR = :valor + :saldosini;
     UPDATE nomina_conceptos N SET noco_pagook = 'S' WHERE n.noco_aplicaprom = 'S' AND N.noco_periodo >= :perinicial - 1 AND N.noco_periodo < :periodo AND N.noco_ano >= :anoprom AND N.noco_ano <= :ano  AND CONC_COD = :conc_cod AND terc_nit = :nite;
    END
    ELSE
    IF (conc_otroconc = 'S') THEN
    BEGIN
     anosum = CAST(ano AS INTEGER);
     anosum = anosum - 1;
     SELECT SUM (noco_valor) FROM nomina_conceptos n WHERE n.noco_ano = :anosum AND n.conc_cod = :conc_codotroconc AND N.terc_nit = :nite INTO :valor;
     SELECT NOCO_VALOR FROM NOMINA_CONCEPTOS WHERE noco_ano = :anosum AND conc_cod = :conc_codotroconc AND terc_nit = :nite AND NOCO_PERIODO = 0 INTO :saldosini;
     IF (saldosini IS NULL) THEN
     saldosini = 0;
     ELSE
     UPDATE nomina_conceptos SET noco_pagook = 'S' WHERE noco_ano = :anosum AND conc_cod = :conc_codotroconc AND NOCO_PERIODO = 0 AND terc_nit = :nite;
     VALOR = :valor + :saldosini;
     UPDATE nomina_conceptos SET noco_pagook = 'S' WHERE noco_ano = :anosum AND conc_cod = :conc_codotroconc AND terc_nit = :nite;
    END
    ELSE
    IF (conc_aporte = 'S') THEN
    BEGIN
     horasex = NULL;
     diasnov = NULL;
     retroact = NULL;
     reembolso = NULL;
     beneficios = NULL;
     IF ((:entidad = '' ) OR (entidad IS NULL)) THEN
     BEGIN
     SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
      IF (comision IS NULL) THEN
      comision = 0;
      SELECT C.emco_monto FROM EMPLEADO_CONCEPTOS C WHERE C.terc_nit = :nite AND C.conc_cod = 933 INTO :retroact;
      IF (retroact IS NULL ) THEN
      retroact = 0;
      SELECT C.emco_monto FROM EMPLEADO_CONCEPTOS C WHERE C.terc_nit = :nite AND C.conc_cod = 952 INTO :reembolso;
      IF (reembolso IS NULL ) THEN
      reembolso = 0;
      SELECT N.nono_dura FROM NOMINA_NOVEDADES N WHERE N.terc_nit = :nite AND N.nono_periodo = :periodo AND N.nono_ano = :ano AND (N.tnov_cod = 2 OR (N.tnov_cod = 3)) INTO :diasnov;
      IF (:diasnov IS NULL) THEN
      incap = 0;
      ELSE
      incap = (:basico / 30)* :diasnov;
      valor = :basico + :comision + :horasex + :retroact + :reembolso + :incap;
            SELECT P.paan_auxtr, P.paan_salminimo FROM PARAMETROS_ANO P WHERE P.paan_ano = :ano INTO :auxtrans, :smlv;
      IF (((:basico )/30 * :diaslab ) + :comision + :horasex + :retroact+ :reembolso + :incap+ :cambsaltrans < :smlv) THEN
      comision = :smlv;
      IF ((conc_cod = 904) OR (conc_cod = 905) OR (conc_cod = 906) OR (conc_cod = 934) ) THEN
      BEGIN
       entidad = :nitafp;
       IF (conc_cod = 904) THEN
       BEGIN
        SELECT A.paan_afptr FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
        SELECT N.nono_dura FROM NOMINA_NOVEDADES N WHERE N.terc_nit = :nite AND N.nono_periodo = :periodo AND N.nono_ano = :ano AND (N.tnov_cod = 2 OR (N.tnov_cod = 3)) INTO :diasnov;
        IF (:diasnov IS NULL) THEN
        incap = 0;
        ELSE
        incap = (:basico / 30)* :diasnov;
        SELECT c.noex_monto FROM nomina_horasext c WHERE c.noex_ano = :ano AND c.noex_periodio = :periodo AND c.noex_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :horasex;
        IF (horasex IS NOT NULL) THEN
        VALOR = (((((:basico )/30 * :diaslab ) + :comision + :horasex + :retroact+ :reembolso + :incap)+ :cambsaltrans ) * :PORCEN) /100;
        ELSE
        VALOR = ((((:basico)/30 * :diaslab ) + :comision + :retroact+ :reembolso + :cambsaltrans  + :incap) * :PORCEN) /100;
       END
       ELSE
       IF ((conc_cod = 905) OR (conc_cod = 906) OR (conc_cod = 934)) THEN
       BEGIN
        SELECT A.paan_afpem FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
        SELECT N.nono_dura FROM NOMINA_NOVEDADES N WHERE N.terc_nit = :nite AND N.nono_periodo = :periodo AND N.nono_ano = :ano AND (N.tnov_cod = 2 OR (N.tnov_cod = 3)) INTO :diasnov;
        IF (:diasnov IS NULL) THEN
        incap = 0;
        ELSE
        incap = (:basico / 30)* :diasnov;
        SELECT c.noex_monto FROM nomina_horasext c WHERE c.noex_ano = :ano AND c.noex_periodio = :periodo AND c.noex_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :horasex;
        IF (horasex IS NOT NULL) THEN
        VALOR = (((((:basico )/30 * :diaslab ) + :comision + :horasex + :retroact + :reembolso)+ :cambsaltrans + :incap) * :PORCEN) /100;
        ELSE
        VALOR = (((((:basico )/30 * :diaslab ) + :comision + :retroact + :reembolso)+ :cambsaltrans + :incap) * :PORCEN) /100;
       END
      END
      ELSE
      IF ((conc_cod = 907) OR (conc_cod = 914) OR (conc_cod = 915) OR (conc_cod = 938) ) THEN
      BEGIN
       entidad = :niteps;
       IF (conc_cod = 907) THEN
       BEGIN
        SELECT A.paan_epstr FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
        SELECT N.nono_dura FROM NOMINA_NOVEDADES N WHERE N.terc_nit = :nite AND N.nono_periodo = :periodo AND N.nono_ano = :ano AND (N.tnov_cod = 2 OR (N.tnov_cod = 3)) INTO :diasnov;
        IF (:diasnov IS NULL) THEN
        incap = 0;
        ELSE
        incap = (:basico / 30)* :diasnov;
        SELECT c.noex_monto FROM nomina_horasext c WHERE c.noex_ano = :ano AND c.noex_periodio = :periodo AND c.noex_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :horasex;
        IF (horasex IS NOT NULL) THEN
        VALOR = (((((:basico )/30 * :diaslab ) + :comision + :horasex + :retroact + :reembolso)+ :cambsaltrans + :incap) * :PORCEN) /100;
        ELSE
        VALOR = (((((:basico )/30 * :diaslab ) + :comision + :retroact + :reembolso)+ :cambsaltrans + :incap) * :PORCEN) /100;
       END
       ELSE
       IF ((conc_cod = 914) OR (conc_cod = 915) OR (conc_cod = 938)) THEN
       BEGIN
        SELECT A.paan_epsem FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
        SELECT N.nono_dura FROM NOMINA_NOVEDADES N WHERE N.terc_nit = :nite AND N.nono_periodo = :periodo AND N.nono_ano = :ano AND (N.tnov_cod = 2 OR (N.tnov_cod = 3)) INTO :diasnov;
        IF (:diasnov IS NULL) THEN
        incap = 0;
        ELSE
        incap = (:basico / 30)* :diasnov;
        SELECT c.noex_monto FROM nomina_horasext c WHERE c.noex_ano = :ano AND c.noex_periodio = :periodo AND c.noex_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :horasex;
        IF (horasex IS NOT NULL) THEN
        VALOR = (((((:basico )/30 * :diaslab ) + :comision + :horasex + :retroact + :reembolso)+ :cambsaltrans + :incap) * :PORCEN) /100;
        ELSE
        VALOR = (((((:basico )/30 * :diaslab ) + :comision + :retroact + :reembolso)+ :cambsaltrans + :incap) * :PORCEN) /100;
       END
      END
      ELSE
      IF ((conc_cod = 910) OR (conc_cod = 911) OR (conc_cod = 916) OR (conc_cod = 917) OR (conc_cod = 918) OR (conc_cod = 919) OR (conc_cod = 936) OR (conc_cod = 939) OR (conc_cod = 940)) THEN
      BEGIN
       entidad = :nitccf;
       SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
       IF (comision IS NULL) THEN
       comision = 0;
       SELECT N.nono_dura FROM NOMINA_NOVEDADES N WHERE N.terc_nit = :nite AND N.nono_periodo = :periodo AND N.nono_ano = :ano AND (N.tnov_cod = 2 OR (N.tnov_cod = 3)) INTO :diasnov;
       IF (:diasnov IS NULL) THEN
       incap = 0;
       ELSE
       incap = (:basico / 30)* :diasnov;
       IF ((conc_cod = 910) OR (conc_cod = 911) OR (conc_cod = 936)) THEN
       BEGIN
        SELECT A.paan_ccf FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
      SELECT N.nono_dura FROM NOMINA_NOVEDADES N WHERE N.terc_nit = :nite AND N.nono_periodo = :periodo AND N.nono_ano = :ano AND (N.tnov_cod = 2 OR (N.tnov_cod = 3)) INTO :diasnov;
      IF (:diasnov IS NULL) THEN
      incap = 0;
      ELSE
      incap = (:basico / 30)* :diasnov;
        SELECT c.noex_monto FROM nomina_horasext c WHERE c.noex_ano = :ano AND c.noex_periodio = :periodo AND c.noex_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :horasex;
        IF (horasex IS NOT NULL) THEN
        VALOR = (((((:basico )/30 * :diaslab ) + :comision + :horasex + :retroact + :reembolso)+ :cambsaltrans + :incap) * :PORCEN) /100;
        ELSE
        VALOR = (((((:basico )/30 * :diaslab ) + :comision + :retroact + :reembolso)+ :cambsaltrans + :incap) * :PORCEN) /100;
       END
       ELSE
       IF ((conc_cod = 916) OR (conc_cod = 917) OR (conc_cod = 939)) THEN
       BEGIN
        SELECT A.paan_icbf FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
      SELECT N.nono_dura FROM NOMINA_NOVEDADES N WHERE N.terc_nit = :nite AND N.nono_periodo = :periodo AND N.nono_ano = :ano AND (N.tnov_cod = 2 OR (N.tnov_cod = 3)) INTO :diasnov;
      IF (:diasnov IS NULL) THEN
      incap = 0;
      ELSE
      incap = (:basico / 30)* :diasnov;
      SELECT N.nono_dura FROM NOMINA_NOVEDADES N WHERE N.terc_nit = :nite AND N.nono_periodo = :periodo AND N.nono_ano = :ano AND (N.tnov_cod = 2 OR (N.tnov_cod = 3)) INTO :diasnov;
      IF (:diasnov IS NULL) THEN
      incap = 0;
      ELSE
      incap = (:basico / 30)* :diasnov;
        SELECT c.noex_monto FROM nomina_horasext c WHERE c.noex_ano = :ano AND c.noex_periodio = :periodo AND c.noex_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :horasex;
        IF (horasex IS NOT NULL) THEN
        VALOR = (((((:basico )/30 * :diaslab ) + :comision + :horasex + :retroact + :reembolso)+ :cambsaltrans + :incap) * :PORCEN) /100;
        ELSE
        VALOR = (((((:basico )/30 * :diaslab ) + :comision + :retroact + :reembolso)+ :cambsaltrans + :incap) * :PORCEN) /100;
       END
       ELSE
       IF ((conc_cod = 918) OR (conc_cod = 919) OR (conc_cod = 940)) THEN
       BEGIN
        SELECT A.paan_sena FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
      SELECT N.nono_dura FROM NOMINA_NOVEDADES N WHERE N.terc_nit = :nite AND N.nono_periodo = :periodo AND N.nono_ano = :ano AND (N.tnov_cod = 2 OR (N.tnov_cod = 3)) INTO :diasnov;
      IF (:diasnov IS NULL) THEN
      incap = 0;
      ELSE
      incap = (:basico / 30)* :diasnov;
        SELECT c.noex_monto FROM nomina_horasext c WHERE c.noex_ano = :ano AND c.noex_periodio = :periodo AND c.noex_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :horasex;
        IF (horasex IS NOT NULL) THEN
        VALOR = (((((:basico )/30 * :diaslab ) + :comision + :horasex + :retroact + :reembolso)+ :cambsaltrans + :incap) * :PORCEN) /100;
        ELSE
        VALOR = (((((:basico )/30 * :diaslab ) + :comision + :retroact + :reembolso)+ :cambsaltrans + :incap) * :PORCEN) /100;
       END
      END
      ELSE
      IF ((conc_cod = 912) OR (conc_cod = 913)) THEN
      BEGIN
       entidad = :nitafc;
       SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
       IF (comision IS NULL) THEN
       comision = 0;
      SELECT N.nono_dura FROM NOMINA_NOVEDADES N WHERE N.terc_nit = :nite AND N.nono_periodo = :periodo AND N.nono_ano = :ano AND (N.tnov_cod = 2 OR (N.tnov_cod = 3)) INTO :diasnov;
      IF (:diasnov IS NULL) THEN
      incap = 0;
      ELSE
      incap = (:basico / 30)* :diasnov;
      SELECT SUM(ce.emco_monto)
      FROM empleado_conceptos CE, CONCEPTOS_NOMINA CN WHERE ((CE.terc_nit = :nite) AND (CE.CONC_COD = CN.CONC_COD) AND (CE.emco_fecini <= :fec AND CE.emco_fecfin >= :FEC) ) OR ((CE.terc_nit = :nite)
      AND (CE.CONC_COD = CN.CONC_COD) AND (cn.conc_todosper = 'N') AND (CE.emco_ppago = :periodo)) OR  ((CE.terc_nit = :nite) AND (CE.CONC_COD = CN.CONC_COD) AND cn.conc_todosper = 'S') AND CN.conc_benefic = 'S'
      INTO :beneficios;
      IF (beneficios IS NULL) THEN
       beneficios = 0;
      SELECT P.paan_auxtr, P.paan_salminimo FROM PARAMETROS_ANO P WHERE P.paan_ano = :ano INTO :auxtrans, :smlv;
      IF (:basico < (:smlv*2)) THEN
       auxtrans = (:auxtrans / 30) * :diaslab;
      ELSE
       auxtrans = 0;
       IF ((conc_cod = 912) OR (conc_cod = 913) OR (conc_cod = 937)) THEN
       BEGIN
        SELECT A.paan_cesemp FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
        SELECT c.noex_monto FROM nomina_horasext c WHERE c.noex_ano = :ano AND c.noex_periodio = :periodo AND c.noex_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :horasex;
        IF (horasex IS NOT NULL) THEN
        VALOR = (((((:basico )/30 * :diaslab ) + :comision + :horasex + :retroact+ :reembolso)+ :cambsaltrans + :incap+ :auxtrans + :beneficios) * :PORCEN) /100;
        ELSE
        VALOR = (((((:basico )/30 * :diaslab ) + :comision + :retroact + :reembolso)+ :cambsaltrans + :incap + :auxtrans + :beneficios) * :PORCEN) /100;
       END
      END
      ELSE
      BEGIN
       IF (comision IS NULL) THEN
       comision = 0;
       SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
       conc_monto = :basico + :comision;
       IF (conc_porc <> 0 AND conc_porc IS NOT NULL) THEN
       VALOR = (((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans + :incap) * :conc_porc) /100;
       ELSE
       IF (:porcen <> 0 AND :porcen IS NOT NULL) THEN
       VALOR = (((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans + :incap) * :porcen) /100;
       ELSE
       IF (:montos <> 0 AND :montos IS NOT NULL) THEN
       valor = :montos;
       ELSE
       IF (:conc_monto <> 0 AND :conc_monto IS NOT NULL) THEN
       valor = :conc_monto;
      END
     END
     item = :item + 1;
    END
    ELSE
    IF (conc_prov = 'S') THEN
    BEGIN
     SELECT SUM(ce.emco_monto)
     FROM empleado_conceptos CE, CONCEPTOS_NOMINA CN WHERE ((CE.terc_nit = :nite) AND (CE.CONC_COD = CN.CONC_COD) AND (CE.emco_fecini <= :fec AND CE.emco_fecfin >= :FEC) ) OR ((CE.terc_nit = :nite)
     AND (CE.CONC_COD = CN.CONC_COD) AND (cn.conc_todosper = 'N') AND (CE.emco_ppago = :periodo)) OR  ((CE.terc_nit = :nite) AND (CE.CONC_COD = CN.CONC_COD) AND cn.conc_todosper = 'S') AND CN.conc_benefic = 'S'
     INTO :beneficios;
     IF (beneficios IS NULL) THEN
      beneficios = 0;
     IF ((conc_cod <> 929) AND (conc_cod <> 930)) THEN
     BEGIN
        SELECT P.paan_auxtr, P.paan_salminimo FROM PARAMETROS_ANO P WHERE P.paan_ano = :ano INTO :auxtrans, :smlv;
        IF (:basico < (:smlv*2)) THEN
           auxtrans = (:auxtrans / 30) * :diaslab;
        ELSE
           auxtrans = 0;
     END
     ELSE
      auxtrans = 0;
     conc_monto = :basico;
     IF (conc_porc <> 0 AND conc_porc IS NOT NULL) THEN
     VALOR = (((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans + :incap + :auxtrans + :beneficios) * :conc_porc) /100;
     ELSE
     IF (porcen <> 0 AND porcen IS NOT NULL) THEN
     VALOR = (((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans + :incap + :auxtrans + :beneficios) * :porcen) /100;
     ELSE
     IF (montos <> 0 AND montos IS NOT NULL) THEN
     VALOR = :montos;
     ELSE
     IF (conc_monto <> 0 AND conc_monto IS NOT NULL) THEN
     VALOR = :conc_monto;
     item = :item + 1;
    END
    ELSE
    IF (conc_cod = 920) THEN
    BEGIN
     SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :valor;
     IF (valor IS NULL) THEN
     valor = 0;
     item = :item + 1;
    END
    ELSE
    IF (conc_cod = 900 OR (:conc_cod = 931)) THEN
    BEGIN
     SELECT c.noex_monto FROM nomina_horasext c WHERE c.noex_ano = :ano AND c.noex_periodio = :periodo AND c.noex_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :valor;
     IF (valor IS NULL) THEN
     valor = 0;
     item = :item + 1;
    END
    ELSE
    IF (conc_cod = 932) THEN
    BEGIN
     SELECT N.nono_dura FROM NOMINA_NOVEDADES N WHERE N.terc_nit = :nite AND N.nono_periodo = :periodo AND N.nono_ano = :ano AND (N.tnov_cod = 2 OR (N.tnov_cod = 3)) INTO :diasnov;
     IF (:diasnov IS NULL) THEN
     valor = 0;
     ELSE
     valor = (:basico / 30)* :diasnov;
    END
    ELSE
    IF (conc_cod = 921) THEN
    BEGIN
     IF (porcen IS NOT NULL AND porcen <> 0) THEN
     valor = ((basico / 30)* :diaslab ) * :PORCEN /100;
     ELSE
     IF (conc_porc IS NOT NULL AND conc_porc <> 0) THEN
     valor = ((basico / 30)* :diaslab ) * :conc_porc /100;
    END
    EXECUTE PROCEDURE LEE_CONFIGURACION('NOMINA','GENERAL','REDONDEO AL MULTIPLO DE DIEZ EN TOTALES')RETURNING_VALUES(:aprox);
    EXECUTE PROCEDURE REDONDEE(:valor, :aprox) RETURNING_VALUES (VALOR);
    IF ((mensual = 'N') OR (periodicidad = 1))  THEN
    INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
    VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
    ELSE
    IF (mensual = 'S') THEN
    BEGIN
     IF ((:periodicidad = 2) AND (liquidaper = 1)) THEN
     BEGIN
      IF ((periodo = 1) OR (periodo = 3) OR (periodo = 5) OR (periodo = 7) OR (periodo = 9) OR (periodo = 11)
      OR (periodo = 13) OR (periodo = 15) OR (periodo = 17) OR (periodo = 19) OR (periodo = 21) OR (periodo = 23)) THEN
      INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
      VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
     END
     ELSE
     IF ((:periodicidad = 2) AND (liquidaper = 2)) THEN
     BEGIN
      IF ((periodo = 2) OR (periodo = 4) OR (periodo = 6) OR (periodo = 8) OR (periodo = 10) OR (periodo = 12)
      OR (periodo = 14) OR (periodo = 16) OR (periodo = 18) OR (periodo = 20) OR (periodo = 22) OR (periodo = 24)) THEN
      INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
      VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
     END
     ELSE
     IF ((:periodicidad = 3) AND (liquidaper = 1)) THEN
     BEGIN
      IF ((periodo = 1) OR (periodo = 5) OR (periodo = 9) OR (periodo = 13) OR (periodo = 17) OR (periodo = 21)
      OR (periodo = 25) OR (periodo = 29) OR (periodo = 33) OR (periodo = 37) OR (periodo = 41) OR (periodo = 45)
      OR (periodo = 49)) THEN
      INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
      VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
    END
    ELSE
     IF ((:periodicidad = 3) AND (liquidaper = 2)) THEN
     BEGIN
      IF ((periodo = 2) OR (periodo = 6) OR (periodo = 10) OR (periodo = 14) OR (periodo = 18) OR (periodo = 22)
      OR (periodo = 26) OR (periodo = 30) OR (periodo = 34) OR (periodo = 38) OR (periodo = 42) OR (periodo = 46)
      OR (periodo = 50)) THEN
      INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
      VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
     END
     ELSE
     IF ((:periodicidad = 3) AND (liquidaper = 3)) THEN
     BEGIN
      IF ((periodo = 3) OR (periodo = 7) OR (periodo = 11) OR (periodo = 15) OR (periodo = 19) OR (periodo = 23)
      OR (periodo = 27) OR (periodo = 31) OR (periodo = 35) OR (periodo = 39) OR (periodo = 43) OR (periodo = 47)
      OR (periodo = 51)) THEN
      INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
      VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
     END
     ELSE
     IF ((:periodicidad = 3) AND (liquidaper = 4)) THEN
     BEGIN
      IF ((periodo = 4) OR (periodo = 8) OR (periodo = 12) OR (periodo = 16) OR (periodo = 20) OR (periodo = 24)
      OR (periodo = 29) OR (periodo = 32) OR (periodo = 36) OR (periodo = 40) OR (periodo = 44) OR (periodo = 48)
      OR (periodo = 52)) THEN
      INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
      VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
     END
    END
  VALOR = 0;
  basico = 0;
   END
  END
 END
 END
 END
 SUSPEND;
END
^

SET TERM ; ^

ALTER TABLE PARAMETROS_ANO
ADD PAAN_RECNOC PORCENTAJE;

ALTER TABLE PARAMETROS_ANO
ADD PAAN_RECFEST PORCENTAJE;

ALTER TABLE NOMINA_HORASEXT
ADD NOEX_RECNOCT INTEGER;

ALTER TABLE NOMINA_HORASEXT
ADD NOEX_RECFEST INTEGER;

SET TERM ^ ;

CREATE OR ALTER PROCEDURE LIQUIDA_HORAS_EXTRA (
    nit VARCHAR(20),
    hd SMALLINT,
    hn SMALLINT,
    hfd SMALLINT,
    hfn SMALLINT,
    rn SMALLINT,
    rf SMALLINT,
    ano CHAR(4),
    provi CHAR(1),
    salbase NUMERIC(18,2))
RETURNS (
    tot_he NUMERIC(18,0))
AS
DECLARE VARIABLE tot_fesd NUMERIC(18,10);
DECLARE VARIABLE tot_fesn NUMERIC(18,10);
DECLARE VARIABLE tot_diur NUMERIC(18,10);
DECLARE VARIABLE tot_noct NUMERIC(18,10);
DECLARE VARIABLE tot_recnoct NUMERIC(18,10);
DECLARE VARIABLE tot_recfest NUMERIC(18,10);
DECLARE VARIABLE tar_fesd NUMERIC(9,4);
DECLARE VARIABLE tar_fesn NUMERIC(9,4);
DECLARE VARIABLE tar_diur NUMERIC(9,4);
DECLARE VARIABLE tar_noct NUMERIC(9,4);
DECLARE VARIABLE tar_recnoct NUMERIC(9,4);
DECLARE VARIABLE tar_recfest NUMERIC(9,4);
DECLARE VARIABLE monto NUMERIC(18,10);
BEGIN
IF (PROVI = 'N') THEN
BEGIN
IF ((:SALBASE IS NULL) OR (:SALBASE = 0) ) THEN
SELECT EMPL_SALARIO FROM empleados WHERE TERC_NIT = :NIT INTO :monto;
ELSE
MONTO = :SALBASE;
  monto = :monto / 240;
SELECT PAAN_HORASDI, PAAN_HORASNO, PAAN_HORASFN, PAAN_HORASFD, P.PAAN_RECNOC, P.PAAN_RECFEST FROM PARAMETROS_ANO P WHERE paan_ano = :ano
  INTO :tar_diur, :tar_noct, :tar_fesn, :tar_fesd, :tar_recnoct, :tar_recfest;
  tot_diur = :monto * tar_diur;
  tot_noct = :monto * tar_noct;
  tot_fesn = :monto * tar_fesn;
  tot_fesd = :monto * tar_fesd;
  tot_recnoct = :monto * tar_recnoct;
  tot_recfest = :monto * tar_recfest;
  tot_diur = :tot_diur * :hd;
  tot_noct = :tot_noct * :hn;
  tot_fesn = :tot_fesn * :hfn;
  tot_fesd = :tot_fesd * :hfd;
  tot_recnoct = :tot_recnoct * :rn;
  tot_recfest = :tot_recfest * :rf;
  tot_he =  tot_diur + tot_noct + tot_fesd + tot_fesn;
  SUSPEND;
END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER nomina_horasext_bi FOR nomina_horasext
ACTIVE BEFORE INSERT POSITION 0
AS
BEGIN
IF (NEW.noex_diur <> 0 OR NEW.noex_fdiur <> 0 OR NEW.noex_noct <> 0 OR NEW.noex_fnoct <> 0 OR NEW.noex_recnoct <> 0 OR NEW.noex_recfest <> 0) THEN
EXECUTE PROCEDURE liquida_horas_extra (NEW.terc_nit,NEW.noex_diur,NEW.noex_noct,NEW.noex_fdiur,NEW.noex_fnoct,NEW.noex_recnoct, NEW.noex_recfest,NEW.noex_ano,'N',NEW.NOEX_SALBASE)RETURNING_VALUES(NEW.noex_monto);
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER nomina_horasext_bu FOR nomina_horasext
ACTIVE BEFORE UPDATE POSITION 0
AS
BEGIN
IF (NEW.noex_diur <> 0 OR NEW.noex_fdiur <> 0 OR NEW.noex_noct <> 0 OR NEW.noex_fnoct <> 0) THEN
EXECUTE PROCEDURE liquida_horas_extra (NEW.terc_nit,NEW.noex_diur,NEW.noex_noct,NEW.noex_fdiur,NEW.noex_fnoct,NEW.noex_recnoct, NEW.noex_recfest,NEW.noex_ano,'N',NEW.NOEX_SALBASE)RETURNING_VALUES(NEW.noex_monto);
END
^

SET TERM ; ^


INSERT INTO CONFIGURACION (CONF_MODULO, CONF_CATEGORIA, CONF_PROPIEDAD, CONF_VALOR, CONF_POSIBLES, CONF_AYUDA) VALUES ('NOMINA', 'LIQUIDACION', 'PREGUNTAR SI DESEA IMPRIMIR UN DEPARTAMENTO EN ESPECIFICO', 'NO', 'NO,SI', 'NO: Imprime siempre todos los empleados incluidos en la nómina, SI: Pregunta si desea imprimir la nómina de los empleados que pertenecen a un departamento especificado');

SET TERM ^ ;

CREATE OR ALTER PROCEDURE IMPR_PLANILLA_NOMINA (
    id INTEGER,
    pago CHAR(1),
    cta CHAR(1),
    empl CHAR(1),
    DPTO VARCHAR(20))
RETURNS (
    fecha DATE,
    observaciones BLOB SUB_TYPE 0 SEGMENT SIZE 80,
    pagoglobal CHAR(1),
    periodo INTEGER,
    ano CHAR(4),
    periodicidad VARCHAR(60),
    nitempl VARCHAR(20),
    valor NUMERIC(18,2),
    deduc CHAR(1),
    nombreempl VARCHAR(60),
    nomcortconc VARCHAR(60),
    nombreconc VARCHAR(60),
    codconc INTEGER,
    prov CHAR(1),
    totalempl NUMERIC(18,2),
    totaldeduc NUMERIC(18,2),
    totaldeveng NUMERIC(18,2),
    numempl INTEGER,
    ctaempl VARCHAR(25),
    totalctas NUMERIC(18,2),
    totalnomi NUMERIC(18,2),
    totalapor NUMERIC(18,2),
    nomper VARCHAR(60),
    org INTEGER,
    cargoempl VARCHAR(60),
    deptoempl VARCHAR(60),
    numcop INTEGER,
    nombre_copia VARCHAR(60),
    diaslab INTEGER,
    salario NUMERIC(18,2))
AS
DECLARE VARIABLE nitant VARCHAR(20);
DECLARE VARIABLE nitnue VARCHAR(20);
DECLARE VARIABLE numconc INTEGER;
DECLARE VARIABLE totalnomineg NUMERIC(18,2);
DECLARE VARIABLE totalaporneg NUMERIC(18,2);
DECLARE VARIABLE par INTEGER;
DECLARE VARIABLE impar INTEGER;
DECLARE VARIABLE antdeduc CHAR(1);
DECLARE VARIABLE nitdeduc VARCHAR(20);
DECLARE VARIABLE nittot VARCHAR(20);
BEGIN
 SELECT N.nuco_copia FROM NUMERO_COPIA N WHERE N.tido_cod = 92 AND N.nuco_id = :id INTO :NUMCOP;
 IF (numcop IS NULL) THEN
 BEGIN
  numcop = 0;
  INSERT INTO NUMERO_COPIA (TIDO_COD, NUCO_ID, NUCO_COPIA) VALUES (92,:id,:numcop);
 END
 ELSE
 BEGIN
  numcop = :numcop + 1;
  UPDATE numero_copia N SET N.nuco_copia = :numcop WHERE N.tido_cod = 92 AND N.nuco_id = :id;
 END
 SELECT N.noco_nombre FROM nombres_copias N WHERE N.noco_id = :numcop INTO :nombre_copia;
 numempl = 0;
 nitant = 0;
 nitnue = 0;
 IF (PAGO = 'N') THEN
 BEGIN
  FOR SELECT N.nomi_feccausa, N.nomi_obs, N.nomi_pagoglobal, N.nomi_periodo, N.nomi_ano, P.ppag_nombre, PN.pnom_nombre FROM NOMINA N, periodo_pago P, periodo_pago_nombre PN
  WHERE P.ppag_cod = N.nomi_periodocidad AND N.nomi_id = :ID AND PN.ppag_cod = N.nomi_periodocidad AND PN.ppag_periodo = N.nomi_periodo
  INTO :fecha, :observaciones, :pagoglobal, :periodo, :ano, :periodicidad, :NOMPER
  DO
  BEGIN
   FOR SELECT NC.terc_nit, NC.noco_valor, NC.noco_deduc, T.terc_nom, C.conc_nomcorto, C.conc_nombre, NC.conc_cod, NC.noco_prov, E.empl_cargo FROM NOMINA_CONCEPTOS NC, TERCEROS T, EMPLEADOS E, CONCEPTOS_NOMINA C
   WHERE NC.nomi_id = :ID AND T.terc_nit = E.terc_nit AND C.conc_cod = NC.conc_cod AND t.terc_nit = nc.terc_nit
   INTO :nitempl, :valor, :deduc, :nombreempl, :nomcortconc, :nombreconc, :codconc, :prov, :cargoempl
   DO
   BEGIN
    IF (valor IS NULL) THEN
    valor = 0;
    SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND TERC_NIT = :nitempl INTO :totalempl;
    SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND TERC_NIT = :nitempl AND NC.noco_deduc = 'S' INTO :totaldeduc;
    SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND TERC_NIT = :nitempl AND NC.noco_deduc = 'N' INTO :totaldeveng;
    SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id INTO :totalnomi;
    SELECT SUM(NC.noco_valor*-1) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_APORTE = 'S' AND NOCO_VALOR < 0 AND NOMI_ID = :id INTO :totalaporneg;
    SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_APORTE = 'S' AND NOCO_VALOR > 0 AND NOMI_ID = :id INTO :totalapor;
    totalapor = :totalapor + totalaporneg;
    SUSPEND;
   END
   nitempl = '';
   valor = NULL;
   deduc = '';
   nombreempl = NULL;
   nomcortconc = NULL;
   nombreconc = NULL;
   codconc = NULL;
   prov = NULL;
   FOR SELECT MAX(N.conc_cod) FROM NOMINA_CONCEPTOS N WHERE N.nomi_id = :id
   GROUP BY N.conc_cod
   INTO :codconc
   DO
   BEGIN
    SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC
    WHERE NC.nomi_id = :ID AND NC.conc_cod = :codconc
    GROUP BY NC.conc_cod
    INTO :valor;
    nitempl = '';
    nombreempl = '';
    deduc = 'N';
    prov = 'N';
    SELECT C.conc_nombre,C.conc_nomcorto FROM CONCEPTOS_NOMINA C WHERE C.conc_cod = :codconc INTO :nombreconc,:nomcortconc;
    SUSPEND;
   END
  END
 END
 ELSE
 IF (PAGO = 'S') THEN
 BEGIN
  par = 2;
  impar = 1;
  IF (EMPL = 'N') THEN
  BEGIN
     deduc = 'N';
     nomcortconc = 'TOTAL DEV';
     nombreconc = 'TOTAL DEV';
     codconc = 9999;
     prov = 'N';
     valor = NULL;
     nitempl = '';
     nombreempl = '';
     SUSPEND;
     deduc = 'S';
     nomcortconc = 'TOTAL DEDUC';
     nombreconc = 'TOTAL DEDUC';
     codconc = 99999;
     prov = 'N';
     valor = NULL;
     nitempl = '';
     nombreempl = '';
     SUSPEND;
     deduc = 'S';
     nomcortconc = 'TOTAL EMPL';
     nombreconc = 'TOTAL EMPL';
     codconc = 999999;
     prov = 'N';
     valor = NULL;
     nitempl = '';
     nombreempl = '';
     SUSPEND;
  END
  FOR SELECT N.nomi_feccausa, N.nomi_obs, N.nomi_pagoglobal, N.nomi_periodo, N.nomi_ano, P.ppag_nombre, PN.pnom_nombre FROM NOMINA N, periodo_pago P, periodo_pago_nombre PN
  WHERE P.ppag_cod = N.nomi_periodocidad AND N.nomi_id = :ID AND PN.ppag_cod = N.nomi_periodocidad AND PN.ppag_periodo = N.nomi_periodo
  INTO :fecha, :observaciones, :pagoglobal, :periodo, :ano, :periodicidad, :NOMPER
  DO
  BEGIN
    IF (EMPL = 'N') THEN
    BEGIN
     FOR SELECT MAX(N.conc_cod) FROM NOMINA_CONCEPTOS N WHERE N.nomi_id = :id AND N.noco_prov = 'N' AND N.noco_gtoempr = 'N'
     GROUP BY N.conc_cod
     INTO :codconc
     DO
     BEGIN
      SELECT NULL, MAX(NC.noco_deduc) FROM NOMINA_CONCEPTOS NC
      WHERE NC.nomi_id = :ID AND NC.conc_cod = :codconc
      GROUP BY NC.conc_cod
      INTO :valor, :deduc;
      valor = NULL;
      nitempl = '';
      nombreempl = '';
      prov = 'N';
      SELECT C.conc_nombre,C.conc_nomcorto FROM CONCEPTOS_NOMINA C WHERE C.conc_cod = :codconc INTO :nombreconc,:nomcortconc;
      SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id INTO :totalempl;
      SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND NC.noco_deduc = 'S' INTO :totaldeduc;
      SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND NC.noco_deduc = 'N' INTO :totaldeveng;
      SUSPEND;
     END
   END
   FOR SELECT NC.terc_nit, NC.noco_valor, NC.noco_deduc, T.terc_nom, C.conc_nomcorto, C.conc_nombre, NC.conc_cod, NC.noco_prov, E.empl_cargo, D.dpto_nombre, ND.node_diaslab,NC.terc_nit, E.empl_salario
   FROM NOMINA_CONCEPTOS NC, TERCEROS T, EMPLEADOS E, CONCEPTOS_NOMINA C, DEPARTAMENTO D, NOMINA_DETALLE ND
   WHERE NC.nomi_id = :ID AND T.terc_nit = E.terc_nit AND C.conc_cod = NC.conc_cod AND t.terc_nit = nc.terc_nit AND D.dpto_cod = E.empl_dpto AND NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N'
   AND ND.nomi_id = :id AND ND.terc_nit = E.terc_nit
   ORDER BY T.terc_nom
   INTO :nitempl, :valor, :deduc, :nombreempl, :nomcortconc, :nombreconc, :codconc, :prov, :cargoempl,:deptoempl,:diaslab,:nitnue, :salario
   DO
   BEGIN
    IF ((nitnue <> nitant) AND (nitnue IS NOT NULL)) THEN
     numempl = :numempl + 1;
    IF (valor IS NULL) THEN
    valor = 0;
    IF (nitempl <> nitdeduc) THEN
    BEGIN
     par = 2;
     impar = 1;
    END
    nitdeduc = :nitempl;
    IF (:deduc = 'S') THEN
    BEGIN
     antdeduc = 'S';
     org = :par;
     par = :par + 2;
    END
    ELSE
    BEGIN
     antdeduc = 'N';
     org = :impar;
     impar = :impar + 2;
    END
    SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND TERC_NIT = :nitempl INTO :totalempl;
    SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND TERC_NIT = :nitempl AND NC.noco_deduc = 'S' INTO :totaldeduc;
    SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND TERC_NIT = :nitempl AND NC.noco_deduc = 'N' INTO :totaldeveng;
    IF (cta = 'S') THEN
    BEGIN
     SELECT COUNT(CONC_COD) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND TERC_NIT = :nitempl INTO :numconc;
     totalempl = totalempl / :numconc;
     SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND TERC_NIT = :nitempl INTO :totalctas;
    END
    SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id INTO :totalnomi;
    SELECT SUM(NC.noco_valor*-1) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_APORTE = 'S' AND NOCO_VALOR < 0 AND NOMI_ID = :id INTO :totalaporneg;
    SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_APORTE = 'S' AND NOCO_VALOR > 0 AND NOMI_ID = :id INTO :totalapor;
    totalapor = :totalapor + totalaporneg;
   SUSPEND;
    IF ((nitnue <> nitant) AND (nitnue IS NOT NULL) AND (EMPL = 'N')) THEN
    BEGIN
     deduc = 'N';
     nomcortconc = 'TOTAL DEV';
     nombreconc = 'TOTAL DEV';
     codconc = 9999;
     prov = 'N';
     SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND NC.noco_deduc = 'N' AND NC.terc_nit = : nitempl INTO :VALOR;
     SUSPEND;
     deduc = 'S';
     nomcortconc = 'TOTAL DEDUC';
     nombreconc = 'TOTAL DEDUC';
     codconc = 99999;
     prov = 'N';
     SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND NC.noco_deduc = 'S' AND NC.terc_nit = :nitempl INTO :VALOR;
     SUSPEND;
     deduc = 'S';
     nomcortconc = 'TOTAL EMPL';
     nombreconc = 'TOTAL EMPL';
     codconc = 999999;
     prov = 'N';
     SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND NC.terc_nit = :nitempl INTO :VALOR;
     nitant = :nitnue;
     SUSPEND;
    END
   END
   numempl = :numempl + 1;
   IF ( EMPL = 'N') THEN
   BEGIN
    nitempl = '';
    valor = NULL;
    deduc = '';
    nombreempl = NULL;
    nomcortconc = NULL;
    nombreconc = NULL;
    codconc = NULL;
    prov = NULL;
    totalempl = NULL;
    ctaempl = NULL;
    IF (cta = 'N') THEN
    BEGIN
     FOR SELECT MAX(N.conc_cod) FROM NOMINA_CONCEPTOS N WHERE N.nomi_id = :id AND N.noco_prov = 'N' AND N.noco_gtoempr = 'N'
     GROUP BY N.conc_cod
     INTO :codconc
     DO
     BEGIN
     IF (dpto IS NOT NULL AND (DPTO <> '') ) THEN
     BEGIN
      SELECT SUM(NC.noco_valor), MAX(NC.noco_deduc) FROM NOMINA_CONCEPTOS NC, EMPLEADOS E, DEPARTAMENTO D
      WHERE NC.nomi_id = :ID AND NC.conc_cod = :codconc AND D.dpto_cod = E.empl_dpto AND NC.terc_nit = E.terc_nit AND d.dpto_cod = :dpto
      GROUP BY NC.conc_cod
      INTO :valor, :deduc;
      nitempl = '-';
      nombreempl = 'TOTAL';
      deptoempl = '-';
      prov = 'N';
      SELECT C.conc_nombre,C.conc_nomcorto FROM CONCEPTOS_NOMINA C WHERE C.conc_cod = :codconc INTO :nombreconc,:nomcortconc;
      SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC, EMPLEADOS E, DEPARTAMENTO D WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id  AND D.dpto_cod = E.empl_dpto AND NC.terc_nit = E.terc_nit INTO :totalempl;
      SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC, EMPLEADOS E, DEPARTAMENTO D WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND NC.noco_deduc = 'S'  AND D.dpto_cod = E.empl_dpto AND NC.terc_nit = E.terc_nit INTO :totaldeduc;
      SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC, EMPLEADOS E, DEPARTAMENTO D WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND NC.noco_deduc = 'N'  AND D.dpto_cod = E.empl_dpto AND NC.terc_nit = E.terc_nit INTO :totaldeveng;
     END
     ELSE
     BEGIN
      SELECT SUM(NC.noco_valor), MAX(NC.noco_deduc) FROM NOMINA_CONCEPTOS NC
      WHERE NC.nomi_id = :ID AND NC.conc_cod = :codconc
      GROUP BY NC.conc_cod
      INTO :valor, :deduc;
      nitempl = '-';
      nombreempl = 'TOTAL';
      prov = 'N';
      SELECT C.conc_nombre,C.conc_nomcorto FROM CONCEPTOS_NOMINA C WHERE C.conc_cod = :codconc INTO :nombreconc,:nomcortconc;
      SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id INTO :totalempl;
      SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND NC.noco_deduc = 'S' INTO :totaldeduc;
      SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND NC.noco_deduc = 'N' INTO :totaldeveng;
     END
      SUSPEND;
     END
     IF (dpto IS NOT NULL AND (DPTO <> '') ) THEN
     BEGIN
     deduc = 'N';
     nomcortconc = 'TOTAL DEV';
     nombreconc = 'TOTAL DEV';
     codconc = 9999;
     deptoempl = '-';
     prov = 'N';
     SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC, EMPLEADOS E, DEPARTAMENTO D WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id  AND D.dpto_cod = E.empl_dpto AND NC.terc_nit = E.terc_nit AND d.dpto_cod = :dpto INTO :VALOR;
     nitempl = '-';
     nombreempl = 'TOTAL';
     SUSPEND;
     deduc = 'S';
     nomcortconc = 'TOTAL DEDUC';
     nombreconc = 'TOTAL DEDUC';
     codconc = 99999;
     deptoempl = '-';
     prov = 'N';
     SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC, EMPLEADOS E, DEPARTAMENTO D WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND NC.noco_deduc = 'S'  AND D.dpto_cod = E.empl_dpto AND d.dpto_cod = :dpto AND NC.terc_nit = E.terc_nit INTO :VALOR;
     nitempl = '-';
     nombreempl = 'TOTAL';
     SUSPEND;
     deduc = 'S';
     nomcortconc = 'TOTAL EMPL';
     nombreconc = 'TOTAL EMPL';
     codconc = 999999;
     deptoempl = '-';
     prov = 'N';
     SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC, EMPLEADOS E, DEPARTAMENTO D WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND NC.noco_deduc = 'N'  AND D.dpto_cod = E.empl_dpto AND d.dpto_cod = :dpto AND NC.terc_nit = E.terc_nit INTO :VALOR;
     nitempl = '-';
     nombreempl = 'TOTAL';
     SUSPEND;
     END
     ELSE
     BEGIN
     deduc = 'N';
     nomcortconc = 'TOTAL DEV';
     nombreconc = 'TOTAL DEV';
     codconc = 9999;
     prov = 'N';
     SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N'  AND NOMI_ID = :id INTO :VALOR;
     nitempl = '-';
     nombreempl = 'TOTAL';
     SUSPEND;
     deduc = 'S';
     nomcortconc = 'TOTAL DEDUC';
     nombreconc = 'TOTAL DEDUC';
     codconc = 99999;
     prov = 'N';
     SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND NC.noco_deduc = 'S' INTO :VALOR;
     nitempl = '-';
     nombreempl = 'TOTAL';
     SUSPEND;
     deduc = 'S';
     nomcortconc = 'TOTAL EMPL';
     nombreconc = 'TOTAL EMPL';
     codconc = 999999;
     prov = 'N';
     SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND NC.noco_deduc = 'N' INTO :VALOR;
     nitempl = '-';
     nombreempl = 'TOTAL';
     SUSPEND;
     END
     END
   END
  END
 END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER nomina_horasext_bi FOR nomina_horasext
ACTIVE BEFORE INSERT POSITION 0
AS
BEGIN
IF (NEW.noex_diur <> 0 OR NEW.noex_fdiur <> 0 OR NEW.noex_noct <> 0 OR NEW.noex_fnoct <> 0 OR NEW.noex_recnoct <> 0 OR NEW.noex_recfest <> 0) THEN
EXECUTE PROCEDURE liquida_horas_extra (NEW.terc_nit,NEW.noex_diur,NEW.noex_noct,NEW.noex_fdiur,NEW.noex_fnoct,NEW.noex_recnoct, NEW.noex_recfest,NEW.noex_ano,'N',NEW.NOEX_SALBASE)RETURNING_VALUES(NEW.noex_monto);
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER nomina_horasext_bu FOR nomina_horasext
ACTIVE BEFORE UPDATE POSITION 0
AS
BEGIN
IF (NEW.noex_diur <> 0 OR NEW.noex_fdiur <> 0 OR NEW.noex_noct <> 0 OR NEW.noex_fnoct <> 0 OR NEW.noex_recnoct <> 0 OR NEW.noex_recfest <> 0) THEN
EXECUTE PROCEDURE liquida_horas_extra (NEW.terc_nit,NEW.noex_diur,NEW.noex_noct,NEW.noex_fdiur,NEW.noex_fnoct,NEW.noex_recnoct, NEW.noex_recfest,NEW.noex_ano,'N',NEW.NOEX_SALBASE)RETURNING_VALUES(NEW.noex_monto);
END
^

SET TERM ; ^

 SET TERM ^ ;

CREATE OR ALTER PROCEDURE LIQUIDA_HORAS_EXTRA (
    nit VARCHAR(20),
    hd SMALLINT,
    hn SMALLINT,
    hfd SMALLINT,
    hfn SMALLINT,
    rn SMALLINT,
    rf SMALLINT,
    ano CHAR(4),
    provi CHAR(1),
    salbase NUMERIC(18,2))
RETURNS (
    tot_he NUMERIC(18,0))
AS
DECLARE VARIABLE tot_fesd NUMERIC(18,10);
DECLARE VARIABLE tot_fesn NUMERIC(18,10);
DECLARE VARIABLE tot_diur NUMERIC(18,10);
DECLARE VARIABLE tot_noct NUMERIC(18,10);
DECLARE VARIABLE tot_recnoct NUMERIC(18,10);
DECLARE VARIABLE tot_recfest NUMERIC(18,10);
DECLARE VARIABLE tar_fesd NUMERIC(9,4);
DECLARE VARIABLE tar_fesn NUMERIC(9,4);
DECLARE VARIABLE tar_diur NUMERIC(9,4);
DECLARE VARIABLE tar_noct NUMERIC(9,4);
DECLARE VARIABLE tar_recnoct NUMERIC(9,4);
DECLARE VARIABLE tar_recfest NUMERIC(9,4);
DECLARE VARIABLE monto NUMERIC(18,10);
BEGIN
IF (PROVI = 'N') THEN
BEGIN
IF ((:SALBASE IS NULL) OR (:SALBASE = 0) ) THEN
SELECT EMPL_SALARIO FROM empleados WHERE TERC_NIT = :NIT INTO :monto;
ELSE
MONTO = :SALBASE;
  monto = :monto / 240;
SELECT PAAN_HORASDI, PAAN_HORASNO, PAAN_HORASFN, PAAN_HORASFD, P.PAAN_RECNOC, P.PAAN_RECFEST FROM PARAMETROS_ANO P WHERE paan_ano = :ano
  INTO :tar_diur, :tar_noct, :tar_fesn, :tar_fesd, :tar_recnoct, :tar_recfest;
  tot_diur = :monto * tar_diur;
  tot_noct = :monto * tar_noct;
  tot_fesn = :monto * tar_fesn;
  tot_fesd = :monto * tar_fesd;
  tot_recnoct = :monto * tar_recnoct;
  tot_recfest = :monto * tar_recfest;
  tot_diur = :tot_diur * :hd;
  tot_noct = :tot_noct * :hn;
  tot_fesn = :tot_fesn * :hfn;
  tot_fesd = :tot_fesd * :hfd;
  tot_recnoct = :tot_recnoct * :rn;
  tot_recfest = :tot_recfest * :rf;
  tot_he =  tot_diur + tot_noct + tot_fesd + tot_fesn;
  SUSPEND;
END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER PROCEDURE CAUSA_NOMINA (
    fec DATE,
    periodo INTEGER,
    periodicidad INTEGER,
    pagoglobal CHAR(1),
    ano CHAR(4),
    depto INTEGER)
RETURNS (
    idnomina INTEGER,
    itemini INTEGER)
AS
DECLARE VARIABLE item INTEGER;
DECLARE VARIABLE nite VARCHAR(20) CHARACTER SET none;
DECLARE VARIABLE nit_tercero VARCHAR(20);
DECLARE VARIABLE concept INTEGER;
DECLARE VARIABLE montos NUMERIC(18,2);
DECLARE VARIABLE porcen NUMERIC(9,4);
DECLARE VARIABLE entidad VARCHAR(20);
DECLARE VARIABLE conc_cod INTEGER;
DECLARE VARIABLE conc_deduc CHAR(1);
DECLARE VARIABLE conc_porc NUMERIC(9,4);
DECLARE VARIABLE conc_entidad INTEGER;
DECLARE VARIABLE conc_monto NUMERIC(18,2);
DECLARE VARIABLE conc_modifi CHAR(1);
DECLARE VARIABLE conc_promedio CHAR(1);
DECLARE VARIABLE emco_perprom INTEGER;
DECLARE VARIABLE valor NUMERIC(18,2);
DECLARE VARIABLE diaslab INTEGER;
DECLARE VARIABLE conc_prov CHAR(1);
DECLARE VARIABLE conc_aporte CHAR(1);
DECLARE VARIABLE numeroprom INTEGER;
DECLARE VARIABLE conc_aplicaprom CHAR(1);
DECLARE VARIABLE perinicial INTEGER;
DECLARE VARIABLE anoprom INTEGER;
DECLARE VARIABLE conc_dias CHAR(1);
DECLARE VARIABLE conc_otroconc CHAR(1);
DECLARE VARIABLE conc_codotroconc INTEGER;
DECLARE VARIABLE anosum INTEGER;
DECLARE VARIABLE salario CHAR(1) CHARACTER SET none;
DECLARE VARIABLE liquidaper INTEGER;
DECLARE VARIABLE rmod NUMERIC(2,2);
DECLARE VARIABLE basico NUMERIC(18,2);
DECLARE VARIABLE niteps VARCHAR(20);
DECLARE VARIABLE nitafc VARCHAR(20);
DECLARE VARIABLE nitafp VARCHAR(20);
DECLARE VARIABLE nitccf VARCHAR(20);
DECLARE VARIABLE gtoempr CHAR(1);
DECLARE VARIABLE comision NUMERIC(18,2);
DECLARE VARIABLE cambsaltrans NUMERIC(18,2);
DECLARE VARIABLE saldosini NUMERIC(18,2);
DECLARE VARIABLE duranov INTEGER;
DECLARE VARIABLE base NUMERIC(18,2);
DECLARE VARIABLE aprox INTEGER;
DECLARE VARIABLE mensual CHAR(1);
DECLARE VARIABLE horasex NUMERIC(18,2);
DECLARE VARIABLE diasnov INTEGER;
DECLARE VARIABLE tomasal INTEGER;
DECLARE VARIABLE retroact NUMERIC(18,2);
DECLARE VARIABLE reembolso NUMERIC(18,2);
DECLARE VARIABLE incap NUMERIC(18,2);
DECLARE VARIABLE deptoempl INTEGER;
DECLARE VARIABLE auxtrans NUMERIC(18,2);
DECLARE VARIABLE smlv NUMERIC(18,2);
DECLARE VARIABLE beneficios NUMERIC(18,2);
DECLARE VARIABLE confirmado CHAR(1);
BEGIN
 SELECT N.NOMI_ID, N.nomi_liqok FROM NOMINA N WHERE N.nomi_periodo = :periodo AND N.nomi_periodocidad = :periodicidad AND N.nomi_ano = :ano
 INTO :IDNOMINA, :CONFIRMADO;
 IF (:idnomina IS NULL) THEN
 BEGIN
  EXECUTE PROCEDURE cambie_id_nomina RETURNING_VALUES(:idnomina);
  INSERT INTO nomina (nomi_id, NOMI_FECCAUSA, NOMI_PAGOGLOBAL, NOMI_PERIODOCIDAD, NOMI_PERIODO, NOMI_ANO, NOMI_LIQOK)
  VALUES (:IDNOMINA, :fec,:pagoglobal, :periodicidad, :periodo, :ano, 'N');
  item = 1;
 END
 ELSE
 BEGIN
  SELECT MAX(N.noco_item) FROM NOMINA_CONCEPTOS N WHERE N.nomi_id = :idnomina
  INTO :item;
 END
 IF ((confirmado = 'S') AND (idnomina IS NOT NULL)) THEN
 BEGIN
  idnomina = 0;
 END
 ELSE
 BEGIN
 IF (DEPTO = 0) THEN
  INSERT INTO NOMINA_DEPARTAMENTO (nomi_id, nodp_depto)VALUES(:IDNOMINA,0);
 ELSE
  INSERT INTO NOMINA_DEPARTAMENTO (nomi_id, nodp_depto)VALUES(:IDNOMINA,:DEPTO);
 ITEMINI = ITEM;
 FOR SELECT E.TERC_NIT, E.empl_salario, e.empl_eps, e.empl_afc, e.empl_afp, e.empl_ccf, e.empl_dpto
 FROM EMPLEADOS E
 WHERE E.empl_ppago = :periodicidad AND ((E.empl_fecret IS NULL) OR (E.empl_fecret > :fec)) AND E.empl_fecing <= :fec
 INTO :nite, :basico, :niteps, :nitafc, :nitafp, :nitccf, :deptoempl
 DO
 BEGIN
 IF ((depto = 0) OR (deptoempl = :depto)) THEN
 BEGIN
  FOR SELECT CE.TERC_NIT, CE.CONC_COD, CE.EMCO_MONTO, CE.EMCO_PORC, ce.empl_entidad, CE.emco_perprom, CE.emco_luquidaper, CE.emco_mensual, CN.CONC_COD, CN.CONC_DEDUC,CN.CONC_PORC, CN.CONC_ENTIDAD, CN.CONC_MONTO,  CN.CONC_DIAS, CN.CONC_MODIFI,
  CN.CONC_PROMEDIO, CN.conc_salario, CE.emco_perprom, CN.conc_prov, CN.conc_aporte, CN.conc_aplicaprom, cn.conc_otroconc, cn.conc_codotroconc, CN.conc_gtoempr, CN.conc_base, CE.emco_tomsal
  FROM empleado_conceptos CE, CONCEPTOS_NOMINA CN WHERE ((CE.terc_nit = :nite) AND (CE.CONC_COD = CN.CONC_COD) AND (CE.emco_fecini <= :fec AND CE.emco_fecfin >= :FEC) ) OR ((CE.terc_nit = :nite)
  AND (CE.CONC_COD = CN.CONC_COD) AND (cn.conc_todosper = 'N') AND (CE.emco_ppago = :periodo)) OR  ((CE.terc_nit = :nite) AND (CE.CONC_COD = CN.CONC_COD) AND cn.conc_todosper = 'S')  ORDER BY (TERC_NIT )
  INTO :nit_tercero, :concept,  :montos, :porcen, :entidad, :numeroprom, :liquidaper, :mensual ,:CONC_COD, :CONC_DEDUC, :CONC_PORC,
  :CONC_ENTIDAD, :CONC_MONTO, :CONC_DIAS, :CONC_MODIFI,:CONC_PROMEDIO, :salario,:EMCO_PERPROM, :conc_prov, :conc_aporte , :CONC_APLICAPROM, :conc_otroconc, :conc_codotroconc, :gtoempr, :base, :tomasal
  DO
  BEGIN
   IF (conc_dias = 'S') THEN
   EXECUTE PROCEDURE DIAS_LABORADOS (:nite, :periodo, :fec, :mensual,:conc_aporte) RETURNING_VALUES (:diaslab);
   ELSE
   BEGIN
    diaslab = 15;
    IF (mensual = 'S') THEN
    BEGIN
     IF (periodicidad = 2) THEN
     diaslab = 30;
     ELSE
     IF (liquidaper = 3) THEN
     diaslab = 30;
    END
   END
   IF (:tomasal <> 0) THEN
   BEGIN
    IF ((:periodicidad = 2) AND (:tomasal <> 2)) THEN
    BEGIN
     IF ((periodo = 2) OR (periodo = 4) OR (periodo = 6) OR (periodo = 8) OR (periodo = 10) OR (periodo = 12)
     OR (periodo = 14) OR (periodo = 16) OR (periodo = 18) OR (periodo = 20) OR (periodo = 22) OR (periodo = 24)) THEN
     basico = 0;
    END
    ELSE
    IF ((:periodicidad = 3) AND (:tomasal <> 1)) THEN
    BEGIN
     IF ((periodo = 1) OR (periodo = 5) OR (periodo = 9) OR (periodo = 13) OR (periodo = 17) OR (periodo = 21)
     OR (periodo = 25) OR (periodo = 29) OR (periodo = 33) OR (periodo = 37) OR (periodo = 41) OR (periodo = 45)
     OR (periodo = 49)) THEN
     basico = 0;
    END
    ELSE
     IF ((:periodicidad = 3) AND (:tomasal <> 2)) THEN
     BEGIN
      IF ((periodo = 2) OR (periodo = 6) OR (periodo = 10) OR (periodo = 14) OR (periodo = 18) OR (periodo = 22)
      OR (periodo = 26) OR (periodo = 30) OR (periodo = 34) OR (periodo = 38) OR (periodo = 42) OR (periodo = 46)
      OR (periodo = 50)) THEN
      basico = 0;
     END
     ELSE
     IF ((:periodicidad = 3) AND (:tomasal <> 3)) THEN
     BEGIN
      IF ((periodo = 3) OR (periodo = 7) OR (periodo = 11) OR (periodo = 15) OR (periodo = 19) OR (periodo = 23)
      OR (periodo = 27) OR (periodo = 31) OR (periodo = 35) OR (periodo = 39) OR (periodo = 43) OR (periodo = 47)
      OR (periodo = 51)) THEN
      basico = 0;
     END
     ELSE
     IF ((:periodicidad = 3) AND (:tomasal <> 4)) THEN
     BEGIN
      IF ((periodo = 4) OR (periodo = 8) OR (periodo = 12) OR (periodo = 16) OR (periodo = 20) OR (periodo = 24)
      OR (periodo = 29) OR (periodo = 32) OR (periodo = 36) OR (periodo = 40) OR (periodo = 44) OR (periodo = 48)
      OR (periodo = 52)) THEN
      basico = 0;
     END
   END
   ELSE
   BEGIN
    SELECT E.empl_salario FROM EMPLEADOS E WHERE E.terc_nit = :nite INTO :basico;
    SELECT ((n.nono_valor /30) * n.nono_dura), (n.nono_dura) FROM nomina_novedades n WHERE n.tnov_cod = 11 AND n.terc_nit = :nite AND n.nono_periodo = :periodo INTO :cambsaltrans, :duranov;
    IF (cambsaltrans IS NULL) THEN
    cambsaltrans = 0;
    IF (duranov IS NULL) THEN
    duranov = 0;
    diaslab = :diaslab - :duranov;
    IF (conc_cod = 922) THEN
    BEGIN
     SELECT SUM(P.prcu_monto) FROM prestamo_cuotas P, prestamo_nomina PN WHERE P.prcu_ano = :ano AND P.prcu_periodo = :periodo AND PN.prno_id = P.prno_id AND PN.terc_nit = :nite INTO :valor;
     IF (valor IS NULL) THEN
     valor = 0;
     item = :item + 1;
     UPDATE prestamo_cuotas  P SET prcu_ok = 'S' WHERE P.prcu_ano = :ano AND P.prcu_periodo = :periodo AND P.prno_id = (SELECT PN.prno_id FROM PRESTAMO_NOMINA PN WHERE PN.terc_nit = :nite);
    END
    ELSE
    IF ((:montos = 0) OR (:montos IS NULL)) THEN
    BEGIN
     IF ((CONC_PORC = 0 AND :porcen = 0) OR (CONC_PORC IS NULL AND :porcen = 0) OR (CONC_PORC = 0 AND :porcen IS NULL) OR (CONC_PORC IS NULL AND :porcen IS NULL) ) THEN
     BEGIN
      IF ((conc_monto <> 0) AND (conc_monto IS NOT NULL) ) THEN
      BEGIN
       VALOR = :CONC_MONTO;
       IF (:conc_dias = 'S') THEN
       valor = (:valor / 30) * :diaslab;
      END
      ELSE
      IF (salario = 'S' AND CONC_COD <> 900 AND CONC_COD <> 920) THEN
      BEGIN
       conc_monto = :basico;
       VALOR = (:conc_monto/30 * :diaslab ) + :cambsaltrans;
      END
      ELSE
      BEGIN
       valor = montos;
       IF (:conc_dias = 'S') THEN
       valor = (:valor / 30) * :diaslab;
      END
     END
     ELSE
     BEGIN
      IF (:porcen <> 0) THEN
      BEGIN
       IF ((conc_monto <> 0) AND (conc_monto IS NOT NULL) ) THEN
       BEGIN
        VALOR = ((:CONC_MONTO ) * :PORCEN) /100;
       END
      END
      ELSE
      BEGIN
       IF ((conc_monto <> 0) AND (conc_monto IS NOT NULL) ) THEN
       BEGIN
        VALOR = ((:CONC_MONTO) * :conc_porc) /100;
       END
       ELSE
       IF (salario = 'S' AND CONC_COD <> 900 AND CONC_COD <> 920) THEN
       BEGIN
        conc_monto = :basico;
        VALOR = ((:CONC_MONTO)+ :cambsaltrans * :conc_porc) /100;
       END
       ELSE
       IF (:conc_monto = 0 AND :montos = 0) THEN
       BEGIN
        conc_monto = :basico;
        VALOR = (((:CONC_MONTO / 30) * :diaslab) + :cambsaltrans * :conc_porc) /100;
       END
      END
     END
    END
    ELSE
    IF ((CONC_PORC = 0 OR (conc_porc IS NULL)) AND (:porcen = 0 OR (porcen IS NULL))) THEN
    BEGIN
     VALOR = (:montos);
     IF (:conc_dias = 'S') THEN
     valor = (:valor / 30) * :diaslab;
    END
    ELSE
    IF (:porcen <> 0 AND porcen IS NOT NULL) THEN
    BEGIN
     VALOR = ((:MONTOS ) * :PORCEN) /100;
    END
    ELSE
    BEGIN
     VALOR = ((:montos) * :CONC_PORC) /100;
    END
    IF (conc_promedio = 'S') THEN
    BEGIN
     perinicial = :periodo - (:numeroprom) + 1;
     anoprom = CAST (ano AS INTEGER);
     IF (perinicial <= 0) THEN
     BEGIN
      perinicial = 1;
      anoprom = CAST(ANO AS INTEGER) - 1;
     END
     SELECT SUM (noco_valor) FROM nomina_conceptos n WHERE n.noco_aplicaprom = 'S' AND N.noco_periodo >= :perinicial - 1 AND N.noco_periodo < :periodo AND N.noco_ano >= :anoprom AND N.noco_ano <= :ano AND terc_nit = :nite INTO :valor;
     valor = ((valor ) / (numeroprom -1 ));
     SELECT NOCO_VALOR FROM NOMINA_CONCEPTOS WHERE CONC_COD = :conc_cod AND TERC_NIT  = :nite AND NOCO_PAGOOK = 'N' AND NOCO_PERIODO = 0 INTO :saldosini;
     IF (saldosini IS NULL) THEN
     saldosini = 0;
     ELSE
     UPDATE nomina_conceptos N SET noco_pagook = 'S' WHERE n.noco_aplicaprom = 'S' AND N.noco_periodo >= :perinicial - 1 AND N.noco_periodo < :periodo AND N.noco_ano >= :anoprom AND N.noco_ano <= :ano  AND CONC_COD = :conc_cod AND terc_nit = :nite AND NOCO_PERIODO = 0;
     VALOR = :valor + :saldosini;
     UPDATE nomina_conceptos N SET noco_pagook = 'S' WHERE n.noco_aplicaprom = 'S' AND N.noco_periodo >= :perinicial - 1 AND N.noco_periodo < :periodo AND N.noco_ano >= :anoprom AND N.noco_ano <= :ano  AND CONC_COD = :conc_cod AND terc_nit = :nite;
    END
    ELSE
    IF (conc_otroconc = 'S') THEN
    BEGIN
     anosum = CAST(ano AS INTEGER);
     anosum = anosum - 1;
     SELECT SUM (noco_valor) FROM nomina_conceptos n WHERE n.noco_ano = :anosum AND n.conc_cod = :conc_codotroconc AND N.terc_nit = :nite INTO :valor;
     SELECT NOCO_VALOR FROM NOMINA_CONCEPTOS WHERE noco_ano = :anosum AND conc_cod = :conc_codotroconc AND terc_nit = :nite AND NOCO_PERIODO = 0 INTO :saldosini;
     IF (saldosini IS NULL) THEN
     saldosini = 0;
     ELSE
     UPDATE nomina_conceptos SET noco_pagook = 'S' WHERE noco_ano = :anosum AND conc_cod = :conc_codotroconc AND NOCO_PERIODO = 0 AND terc_nit = :nite;
     VALOR = :valor + :saldosini;
     UPDATE nomina_conceptos SET noco_pagook = 'S' WHERE noco_ano = :anosum AND conc_cod = :conc_codotroconc AND terc_nit = :nite;
    END
    ELSE
    IF (conc_aporte = 'S') THEN
    BEGIN
     horasex = NULL;
     diasnov = NULL;
     retroact = NULL;
     reembolso = NULL;
     beneficios = NULL;
     IF ((:entidad = '' ) OR (entidad IS NULL)) THEN
     BEGIN
     SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
      IF (comision IS NULL) THEN
      comision = 0;
      SELECT C.emco_monto FROM EMPLEADO_CONCEPTOS C WHERE C.terc_nit = :nite AND C.conc_cod = 933 INTO :retroact;
      IF (retroact IS NULL ) THEN
      retroact = 0;
      SELECT C.emco_monto FROM EMPLEADO_CONCEPTOS C WHERE C.terc_nit = :nite AND C.conc_cod = 952 INTO :reembolso;
      IF (reembolso IS NULL ) THEN
      reembolso = 0;
      SELECT N.nono_dura FROM NOMINA_NOVEDADES N WHERE N.terc_nit = :nite AND N.nono_periodo = :periodo AND N.nono_ano = :ano AND (N.tnov_cod = 2 OR (N.tnov_cod = 3)) INTO :diasnov;
      IF (:diasnov IS NULL) THEN
      incap = 0;
      ELSE
      incap = (:basico / 30)* :diasnov;
      valor = :basico + :comision + :horasex + :retroact + :reembolso + :incap;
            SELECT P.paan_auxtr, P.paan_salminimo FROM PARAMETROS_ANO P WHERE P.paan_ano = :ano INTO :auxtrans, :smlv;
      IF (((:basico )/30 * :diaslab ) + :comision + :horasex + :retroact+ :reembolso + :incap+ :cambsaltrans < :smlv) THEN
      comision = :smlv;
      IF ((conc_cod = 904) OR (conc_cod = 905) OR (conc_cod = 906) OR (conc_cod = 934) ) THEN
      BEGIN
       entidad = :nitafp;
       IF (conc_cod = 904) THEN
       BEGIN
        SELECT A.paan_afptr FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
        SELECT N.nono_dura FROM NOMINA_NOVEDADES N WHERE N.terc_nit = :nite AND N.nono_periodo = :periodo AND N.nono_ano = :ano AND (N.tnov_cod = 2 OR (N.tnov_cod = 3)) INTO :diasnov;
        IF (:diasnov IS NULL) THEN
        incap = 0;
        ELSE
        incap = (:basico / 30)* :diasnov;
        SELECT c.noex_monto FROM nomina_horasext c WHERE c.noex_ano = :ano AND c.noex_periodio = :periodo AND c.noex_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :horasex;
        IF (horasex IS NOT NULL) THEN
        VALOR = (((((:basico )/30 * :diaslab ) + :comision + :horasex + :retroact+ :reembolso + :incap)+ :cambsaltrans ) * :PORCEN) /100;
        ELSE
        VALOR = ((((:basico)/30 * :diaslab ) + :comision + :retroact+ :reembolso + :cambsaltrans  + :incap) * :PORCEN) /100;
       END
       ELSE
       IF ((conc_cod = 905) OR (conc_cod = 906) OR (conc_cod = 934)) THEN
       BEGIN
        SELECT A.paan_afpem FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
        SELECT N.nono_dura FROM NOMINA_NOVEDADES N WHERE N.terc_nit = :nite AND N.nono_periodo = :periodo AND N.nono_ano = :ano AND (N.tnov_cod = 2 OR (N.tnov_cod = 3)) INTO :diasnov;
        IF (:diasnov IS NULL) THEN
        incap = 0;
        ELSE
        incap = (:basico / 30)* :diasnov;
        SELECT c.noex_monto FROM nomina_horasext c WHERE c.noex_ano = :ano AND c.noex_periodio = :periodo AND c.noex_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :horasex;
        IF (horasex IS NOT NULL) THEN
        VALOR = (((((:basico )/30 * :diaslab ) + :comision + :horasex + :retroact + :reembolso)+ :cambsaltrans + :incap) * :PORCEN) /100;
        ELSE
        VALOR = (((((:basico )/30 * :diaslab ) + :comision + :retroact + :reembolso)+ :cambsaltrans + :incap) * :PORCEN) /100;
       END
      END
      ELSE
      IF ((conc_cod = 907) OR (conc_cod = 914) OR (conc_cod = 915) OR (conc_cod = 938) ) THEN
      BEGIN
       entidad = :niteps;
       IF (conc_cod = 907) THEN
       BEGIN
        SELECT A.paan_epstr FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
        SELECT N.nono_dura FROM NOMINA_NOVEDADES N WHERE N.terc_nit = :nite AND N.nono_periodo = :periodo AND N.nono_ano = :ano AND (N.tnov_cod = 2 OR (N.tnov_cod = 3)) INTO :diasnov;
        IF (:diasnov IS NULL) THEN
        incap = 0;
        ELSE
        incap = (:basico / 30)* :diasnov;
        SELECT c.noex_monto FROM nomina_horasext c WHERE c.noex_ano = :ano AND c.noex_periodio = :periodo AND c.noex_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :horasex;
        IF (horasex IS NOT NULL) THEN
        VALOR = (((((:basico )/30 * :diaslab ) + :comision + :horasex + :retroact + :reembolso)+ :cambsaltrans + :incap) * :PORCEN) /100;
        ELSE
        VALOR = (((((:basico )/30 * :diaslab ) + :comision + :retroact + :reembolso)+ :cambsaltrans + :incap) * :PORCEN) /100;
       END
       ELSE
       IF ((conc_cod = 914) OR (conc_cod = 915) OR (conc_cod = 938)) THEN
       BEGIN
        SELECT A.paan_epsem FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
        SELECT N.nono_dura FROM NOMINA_NOVEDADES N WHERE N.terc_nit = :nite AND N.nono_periodo = :periodo AND N.nono_ano = :ano AND (N.tnov_cod = 2 OR (N.tnov_cod = 3)) INTO :diasnov;
        IF (:diasnov IS NULL) THEN
        incap = 0;
        ELSE
        incap = (:basico / 30)* :diasnov;
        SELECT c.noex_monto FROM nomina_horasext c WHERE c.noex_ano = :ano AND c.noex_periodio = :periodo AND c.noex_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :horasex;
        IF (horasex IS NOT NULL) THEN
        VALOR = (((((:basico )/30 * :diaslab ) + :comision + :horasex + :retroact + :reembolso)+ :cambsaltrans + :incap) * :PORCEN) /100;
        ELSE
        VALOR = (((((:basico )/30 * :diaslab ) + :comision + :retroact + :reembolso)+ :cambsaltrans + :incap) * :PORCEN) /100;
       END
      END
      ELSE
      IF ((conc_cod = 910) OR (conc_cod = 911) OR (conc_cod = 916) OR (conc_cod = 917) OR (conc_cod = 918) OR (conc_cod = 919) OR (conc_cod = 936) OR (conc_cod = 939) OR (conc_cod = 940)) THEN
      BEGIN
       entidad = :nitccf;
       SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
       IF (comision IS NULL) THEN
       comision = 0;
       SELECT N.nono_dura FROM NOMINA_NOVEDADES N WHERE N.terc_nit = :nite AND N.nono_periodo = :periodo AND N.nono_ano = :ano AND (N.tnov_cod = 2 OR (N.tnov_cod = 3)) INTO :diasnov;
       IF (:diasnov IS NULL) THEN
       incap = 0;
       ELSE
       incap = (:basico / 30)* :diasnov;
       IF ((conc_cod = 910) OR (conc_cod = 911) OR (conc_cod = 936)) THEN
       BEGIN
        SELECT A.paan_ccf FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
      SELECT N.nono_dura FROM NOMINA_NOVEDADES N WHERE N.terc_nit = :nite AND N.nono_periodo = :periodo AND N.nono_ano = :ano AND (N.tnov_cod = 2 OR (N.tnov_cod = 3)) INTO :diasnov;
      IF (:diasnov IS NULL) THEN
      incap = 0;
      ELSE
      incap = (:basico / 30)* :diasnov;
        SELECT c.noex_monto FROM nomina_horasext c WHERE c.noex_ano = :ano AND c.noex_periodio = :periodo AND c.noex_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :horasex;
        IF (horasex IS NOT NULL) THEN
        VALOR = (((((:basico )/30 * :diaslab ) + :comision + :horasex + :retroact + :reembolso)+ :cambsaltrans + :incap) * :PORCEN) /100;
        ELSE
        VALOR = (((((:basico )/30 * :diaslab ) + :comision + :retroact + :reembolso)+ :cambsaltrans + :incap) * :PORCEN) /100;
       END
       ELSE
       IF ((conc_cod = 916) OR (conc_cod = 917) OR (conc_cod = 939)) THEN
       BEGIN
        SELECT A.paan_icbf FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
      SELECT N.nono_dura FROM NOMINA_NOVEDADES N WHERE N.terc_nit = :nite AND N.nono_periodo = :periodo AND N.nono_ano = :ano AND (N.tnov_cod = 2 OR (N.tnov_cod = 3)) INTO :diasnov;
      IF (:diasnov IS NULL) THEN
      incap = 0;
      ELSE
      incap = (:basico / 30)* :diasnov;
      SELECT N.nono_dura FROM NOMINA_NOVEDADES N WHERE N.terc_nit = :nite AND N.nono_periodo = :periodo AND N.nono_ano = :ano AND (N.tnov_cod = 2 OR (N.tnov_cod = 3)) INTO :diasnov;
      IF (:diasnov IS NULL) THEN
      incap = 0;
      ELSE
      incap = (:basico / 30)* :diasnov;
        SELECT c.noex_monto FROM nomina_horasext c WHERE c.noex_ano = :ano AND c.noex_periodio = :periodo AND c.noex_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :horasex;
        IF (horasex IS NOT NULL) THEN
        VALOR = (((((:basico )/30 * :diaslab ) + :comision + :horasex + :retroact + :reembolso)+ :cambsaltrans + :incap) * :PORCEN) /100;
        ELSE
        VALOR = (((((:basico )/30 * :diaslab ) + :comision + :retroact + :reembolso)+ :cambsaltrans + :incap) * :PORCEN) /100;
       END
       ELSE
       IF ((conc_cod = 918) OR (conc_cod = 919) OR (conc_cod = 940)) THEN
       BEGIN
        SELECT A.paan_sena FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
      SELECT N.nono_dura FROM NOMINA_NOVEDADES N WHERE N.terc_nit = :nite AND N.nono_periodo = :periodo AND N.nono_ano = :ano AND (N.tnov_cod = 2 OR (N.tnov_cod = 3)) INTO :diasnov;
      IF (:diasnov IS NULL) THEN
      incap = 0;
      ELSE
      incap = (:basico / 30)* :diasnov;
        SELECT c.noex_monto FROM nomina_horasext c WHERE c.noex_ano = :ano AND c.noex_periodio = :periodo AND c.noex_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :horasex;
        IF (horasex IS NOT NULL) THEN
        VALOR = (((((:basico )/30 * :diaslab ) + :comision + :horasex + :retroact + :reembolso)+ :cambsaltrans + :incap) * :PORCEN) /100;
        ELSE
        VALOR = (((((:basico )/30 * :diaslab ) + :comision + :retroact + :reembolso)+ :cambsaltrans + :incap) * :PORCEN) /100;
       END
      END
      ELSE
      IF ((conc_cod = 912) OR (conc_cod = 913)) THEN
      BEGIN
       entidad = :nitafc;
       SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
       IF (comision IS NULL) THEN
       comision = 0;
      SELECT N.nono_dura FROM NOMINA_NOVEDADES N WHERE N.terc_nit = :nite AND N.nono_periodo = :periodo AND N.nono_ano = :ano AND (N.tnov_cod = 2 OR (N.tnov_cod = 3)) INTO :diasnov;
      IF (:diasnov IS NULL) THEN
      incap = 0;
      ELSE
      incap = (:basico / 30)* :diasnov;
      SELECT SUM(ce.emco_monto)
      FROM empleado_conceptos CE, CONCEPTOS_NOMINA CN WHERE ((CE.terc_nit = :nite) AND (CE.CONC_COD = CN.CONC_COD) AND (CE.emco_fecini <= :fec AND CE.emco_fecfin >= :FEC) ) OR ((CE.terc_nit = :nite)
      AND (CE.CONC_COD = CN.CONC_COD) AND (cn.conc_todosper = 'N') AND (CE.emco_ppago = :periodo)) OR  ((CE.terc_nit = :nite) AND (CE.CONC_COD = CN.CONC_COD) AND cn.conc_todosper = 'S') AND CN.conc_benefic = 'S'
      INTO :beneficios;
      IF (beneficios IS NULL) THEN
       beneficios = 0;
      SELECT P.paan_auxtr, P.paan_salminimo FROM PARAMETROS_ANO P WHERE P.paan_ano = :ano INTO :auxtrans, :smlv;
      IF (:basico < (:smlv*2)) THEN
       auxtrans = (:auxtrans / 30) * :diaslab;
      ELSE
       auxtrans = 0;
       IF ((conc_cod = 912) OR (conc_cod = 913) OR (conc_cod = 937)) THEN
       BEGIN
        SELECT A.paan_cesemp FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
        SELECT c.noex_monto FROM nomina_horasext c WHERE c.noex_ano = :ano AND c.noex_periodio = :periodo AND c.noex_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :horasex;
        IF (horasex IS NOT NULL) THEN
        VALOR = (((((:basico )/30 * :diaslab ) + :comision + :horasex + :retroact+ :reembolso)+ :cambsaltrans + :incap+ :auxtrans + :beneficios) * :PORCEN) /100;
        ELSE
        VALOR = (((((:basico )/30 * :diaslab ) + :comision + :retroact + :reembolso)+ :cambsaltrans + :incap + :auxtrans + :beneficios) * :PORCEN) /100;
       END
      END
      ELSE
      BEGIN
       IF (comision IS NULL) THEN
       comision = 0;
       SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
       conc_monto = :basico + :comision;
       IF (conc_porc <> 0 AND conc_porc IS NOT NULL) THEN
       VALOR = (((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans + :incap) * :conc_porc) /100;
       ELSE
       IF (:porcen <> 0 AND :porcen IS NOT NULL) THEN
       VALOR = (((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans + :incap) * :porcen) /100;
       ELSE
       IF (:montos <> 0 AND :montos IS NOT NULL) THEN
       valor = :montos;
       ELSE
       IF (:conc_monto <> 0 AND :conc_monto IS NOT NULL) THEN
       valor = :conc_monto;
      END
     END
     item = :item + 1;
    END
    ELSE
    IF (conc_prov = 'S') THEN
    BEGIN
     SELECT SUM(ce.emco_monto)
     FROM empleado_conceptos CE, CONCEPTOS_NOMINA CN WHERE ((CE.terc_nit = :nite) AND (CE.CONC_COD = CN.CONC_COD) AND (CE.emco_fecini <= :fec AND CE.emco_fecfin >= :FEC) ) OR ((CE.terc_nit = :nite)
     AND (CE.CONC_COD = CN.CONC_COD) AND (cn.conc_todosper = 'N') AND (CE.emco_ppago = :periodo)) OR  ((CE.terc_nit = :nite) AND (CE.CONC_COD = CN.CONC_COD) AND cn.conc_todosper = 'S') AND CN.conc_benefic = 'S'
     INTO :beneficios;
     IF (beneficios IS NULL) THEN
      beneficios = 0;
     IF ((conc_cod <> 929) AND (conc_cod <> 930)) THEN
     BEGIN
        SELECT P.paan_auxtr, P.paan_salminimo FROM PARAMETROS_ANO P WHERE P.paan_ano = :ano INTO :auxtrans, :smlv;
        IF (:basico < (:smlv*2)) THEN
           auxtrans = (:auxtrans / 30) * :diaslab;
        ELSE
           auxtrans = 0;
     END
     ELSE
      auxtrans = 0;
     conc_monto = :basico;
     IF (conc_porc <> 0 AND conc_porc IS NOT NULL) THEN
     VALOR = (((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans + :incap + :auxtrans + :beneficios) * :conc_porc) /100;
     ELSE
     IF (porcen <> 0 AND porcen IS NOT NULL) THEN
     VALOR = (((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans + :incap + :auxtrans + :beneficios) * :porcen) /100;
     ELSE
     IF (montos <> 0 AND montos IS NOT NULL) THEN
     VALOR = :montos;
     ELSE
     IF (conc_monto <> 0 AND conc_monto IS NOT NULL) THEN
     VALOR = :conc_monto;
     item = :item + 1;
    END
    ELSE
    IF (conc_cod = 920) THEN
    BEGIN
     SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :valor;
     IF (valor IS NULL) THEN
     valor = 0;
     item = :item + 1;
    END
    ELSE
    IF (conc_cod = 900 OR (:conc_cod = 931)) THEN
    BEGIN
     SELECT c.noex_monto FROM nomina_horasext c WHERE c.noex_ano = :ano AND c.noex_periodio = :periodo AND c.noex_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :valor;
     IF (valor IS NULL) THEN
     valor = 0;
     item = :item + 1;
    END
    ELSE
    IF (conc_cod = 932) THEN
    BEGIN
     SELECT N.nono_dura FROM NOMINA_NOVEDADES N WHERE N.terc_nit = :nite AND N.nono_periodo = :periodo AND N.nono_ano = :ano AND (N.tnov_cod = 2 OR (N.tnov_cod = 3)) INTO :diasnov;
     IF (:diasnov IS NULL) THEN
     valor = 0;
     ELSE
     valor = (:basico / 30)* :diasnov;
    END
    ELSE
    IF (conc_cod = 921) THEN
    BEGIN
     IF (porcen IS NOT NULL AND porcen <> 0) THEN
     valor = ((basico / 30)* :diaslab ) * :PORCEN /100;
     ELSE
     IF (conc_porc IS NOT NULL AND conc_porc <> 0) THEN
     valor = ((basico / 30)* :diaslab ) * :conc_porc /100;
    END
    EXECUTE PROCEDURE LEE_CONFIGURACION('NOMINA','GENERAL','REDONDEO AL MULTIPLO DE DIEZ EN TOTALES')RETURNING_VALUES(:aprox);
    EXECUTE PROCEDURE REDONDEE(:valor, :aprox) RETURNING_VALUES (VALOR);
    IF ((mensual = 'N') OR (periodicidad = 1))  THEN
    INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
    VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
    ELSE
    IF (mensual = 'S') THEN
    BEGIN
     IF ((:periodicidad = 2) AND (liquidaper = 1)) THEN
     BEGIN
      IF ((periodo = 1) OR (periodo = 3) OR (periodo = 5) OR (periodo = 7) OR (periodo = 9) OR (periodo = 11)
      OR (periodo = 13) OR (periodo = 15) OR (periodo = 17) OR (periodo = 19) OR (periodo = 21) OR (periodo = 23)) THEN
      INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
      VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
     END
     ELSE
     IF ((:periodicidad = 2) AND (liquidaper = 2)) THEN
     BEGIN
      IF ((periodo = 2) OR (periodo = 4) OR (periodo = 6) OR (periodo = 8) OR (periodo = 10) OR (periodo = 12)
      OR (periodo = 14) OR (periodo = 16) OR (periodo = 18) OR (periodo = 20) OR (periodo = 22) OR (periodo = 24)) THEN
      INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
      VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
     END
     ELSE
     IF ((:periodicidad = 3) AND (liquidaper = 1)) THEN
     BEGIN
      IF ((periodo = 1) OR (periodo = 5) OR (periodo = 9) OR (periodo = 13) OR (periodo = 17) OR (periodo = 21)
      OR (periodo = 25) OR (periodo = 29) OR (periodo = 33) OR (periodo = 37) OR (periodo = 41) OR (periodo = 45)
      OR (periodo = 49)) THEN
      INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
      VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
    END
    ELSE
     IF ((:periodicidad = 3) AND (liquidaper = 2)) THEN
     BEGIN
      IF ((periodo = 2) OR (periodo = 6) OR (periodo = 10) OR (periodo = 14) OR (periodo = 18) OR (periodo = 22)
      OR (periodo = 26) OR (periodo = 30) OR (periodo = 34) OR (periodo = 38) OR (periodo = 42) OR (periodo = 46)
      OR (periodo = 50)) THEN
      INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
      VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
     END
     ELSE
     IF ((:periodicidad = 3) AND (liquidaper = 3)) THEN
     BEGIN
      IF ((periodo = 3) OR (periodo = 7) OR (periodo = 11) OR (periodo = 15) OR (periodo = 19) OR (periodo = 23)
      OR (periodo = 27) OR (periodo = 31) OR (periodo = 35) OR (periodo = 39) OR (periodo = 43) OR (periodo = 47)
      OR (periodo = 51)) THEN
      INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
      VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
     END
     ELSE
     IF ((:periodicidad = 3) AND (liquidaper = 4)) THEN
     BEGIN
      IF ((periodo = 4) OR (periodo = 8) OR (periodo = 12) OR (periodo = 16) OR (periodo = 20) OR (periodo = 24)
      OR (periodo = 29) OR (periodo = 32) OR (periodo = 36) OR (periodo = 40) OR (periodo = 44) OR (periodo = 48)
      OR (periodo = 52)) THEN
      INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
      VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
     END
    END
  VALOR = 0;
  basico = 0;
   END
  END
 END
 END
 END
 SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER PROCEDURE CAUSA_NOMINA (
    fec DATE,
    periodo INTEGER,
    periodicidad INTEGER,
    pagoglobal CHAR(1),
    ano CHAR(4),
    depto INTEGER)
RETURNS (
    idnomina INTEGER,
    itemini INTEGER)
AS
DECLARE VARIABLE item INTEGER;
DECLARE VARIABLE nite VARCHAR(20) CHARACTER SET none;
DECLARE VARIABLE nit_tercero VARCHAR(20);
DECLARE VARIABLE concept INTEGER;
DECLARE VARIABLE montos NUMERIC(18,2);
DECLARE VARIABLE porcen NUMERIC(9,4);
DECLARE VARIABLE entidad VARCHAR(20);
DECLARE VARIABLE conc_cod INTEGER;
DECLARE VARIABLE conc_deduc CHAR(1);
DECLARE VARIABLE conc_porc NUMERIC(9,4);
DECLARE VARIABLE conc_entidad INTEGER;
DECLARE VARIABLE conc_monto NUMERIC(18,2);
DECLARE VARIABLE conc_modifi CHAR(1);
DECLARE VARIABLE conc_promedio CHAR(1);
DECLARE VARIABLE emco_perprom INTEGER;
DECLARE VARIABLE valor NUMERIC(18,2);
DECLARE VARIABLE diaslab INTEGER;
DECLARE VARIABLE conc_prov CHAR(1);
DECLARE VARIABLE conc_aporte CHAR(1);
DECLARE VARIABLE numeroprom INTEGER;
DECLARE VARIABLE conc_aplicaprom CHAR(1);
DECLARE VARIABLE perinicial INTEGER;
DECLARE VARIABLE anoprom INTEGER;
DECLARE VARIABLE conc_dias CHAR(1);
DECLARE VARIABLE conc_otroconc CHAR(1);
DECLARE VARIABLE conc_codotroconc INTEGER;
DECLARE VARIABLE anosum INTEGER;
DECLARE VARIABLE salario CHAR(1) CHARACTER SET none;
DECLARE VARIABLE liquidaper INTEGER;
DECLARE VARIABLE rmod NUMERIC(2,2);
DECLARE VARIABLE basico NUMERIC(18,2);
DECLARE VARIABLE niteps VARCHAR(20);
DECLARE VARIABLE nitafc VARCHAR(20);
DECLARE VARIABLE nitafp VARCHAR(20);
DECLARE VARIABLE nitccf VARCHAR(20);
DECLARE VARIABLE gtoempr CHAR(1);
DECLARE VARIABLE comision NUMERIC(18,2);
DECLARE VARIABLE cambsaltrans NUMERIC(18,2);
DECLARE VARIABLE saldosini NUMERIC(18,2);
DECLARE VARIABLE duranov INTEGER;
DECLARE VARIABLE base NUMERIC(18,2);
DECLARE VARIABLE aprox INTEGER;
DECLARE VARIABLE mensual CHAR(1);
DECLARE VARIABLE horasex NUMERIC(18,2);
DECLARE VARIABLE diasnov INTEGER;
DECLARE VARIABLE tomasal INTEGER;
DECLARE VARIABLE retroact NUMERIC(18,2);
DECLARE VARIABLE reembolso NUMERIC(18,2);
DECLARE VARIABLE incap NUMERIC(18,2);
DECLARE VARIABLE deptoempl INTEGER;
DECLARE VARIABLE auxtrans NUMERIC(18,2);
DECLARE VARIABLE smlv NUMERIC(18,2);
DECLARE VARIABLE beneficios NUMERIC(18,2);
DECLARE VARIABLE confirmado CHAR(1);
DECLARE VARIABLE recnoct INTEGER;
DECLARE VARIABLE recfest INTEGER;
DECLARE VARIABLE tar_recnotc NUMERIC(9,4);
DECLARE VARIABLE tar_recfest NUMERIC(9,4);
DECLARE VARIABLE recargo NUMERIC(18,2);
DECLARE VARIABLE basicorec NUMERIC(18,2);
BEGIN
 SELECT N.NOMI_ID, N.nomi_liqok FROM NOMINA N WHERE N.nomi_periodo = :periodo AND N.nomi_periodocidad = :periodicidad AND N.nomi_ano = :ano
 INTO :IDNOMINA, :CONFIRMADO;
 IF (:idnomina IS NULL) THEN
 BEGIN
  EXECUTE PROCEDURE cambie_id_nomina RETURNING_VALUES(:idnomina);
  INSERT INTO nomina (nomi_id, NOMI_FECCAUSA, NOMI_PAGOGLOBAL, NOMI_PERIODOCIDAD, NOMI_PERIODO, NOMI_ANO, NOMI_LIQOK)
  VALUES (:IDNOMINA, :fec,:pagoglobal, :periodicidad, :periodo, :ano, 'N');
  item = 1;
 END
 ELSE
 BEGIN
  SELECT MAX(N.noco_item) FROM NOMINA_CONCEPTOS N WHERE N.nomi_id = :idnomina
  INTO :item;
 END
 IF ((confirmado = 'S') AND (idnomina IS NOT NULL)) THEN
 BEGIN
  idnomina = 0;
 END
 ELSE
 BEGIN
 IF (DEPTO = 0) THEN
  INSERT INTO NOMINA_DEPARTAMENTO (nomi_id, nodp_depto)VALUES(:IDNOMINA,0);
 ELSE
  INSERT INTO NOMINA_DEPARTAMENTO (nomi_id, nodp_depto)VALUES(:IDNOMINA,:DEPTO);
 ITEMINI = ITEM;
 FOR SELECT E.TERC_NIT, E.empl_salario, e.empl_eps, e.empl_afc, e.empl_afp, e.empl_ccf, e.empl_dpto
 FROM EMPLEADOS E
 WHERE E.empl_ppago = :periodicidad AND ((E.empl_fecret IS NULL) OR (E.empl_fecret > :fec)) AND E.empl_fecing <= :fec
 INTO :nite, :basico, :niteps, :nitafc, :nitafp, :nitccf, :deptoempl
 DO
 BEGIN
 IF ((depto = 0) OR (deptoempl = :depto)) THEN
 BEGIN
  FOR SELECT CE.TERC_NIT, CE.CONC_COD, CE.EMCO_MONTO, CE.EMCO_PORC, ce.empl_entidad, CE.emco_perprom, CE.emco_luquidaper, CE.emco_mensual, CN.CONC_COD, CN.CONC_DEDUC,CN.CONC_PORC, CN.CONC_ENTIDAD, CN.CONC_MONTO,  CN.CONC_DIAS, CN.CONC_MODIFI,
  CN.CONC_PROMEDIO, CN.conc_salario, CE.emco_perprom, CN.conc_prov, CN.conc_aporte, CN.conc_aplicaprom, cn.conc_otroconc, cn.conc_codotroconc, CN.conc_gtoempr, CN.conc_base, CE.emco_tomsal
  FROM empleado_conceptos CE, CONCEPTOS_NOMINA CN WHERE ((CE.terc_nit = :nite) AND (CE.CONC_COD = CN.CONC_COD) AND (CE.emco_fecini <= :fec AND CE.emco_fecfin >= :FEC) ) OR ((CE.terc_nit = :nite)
  AND (CE.CONC_COD = CN.CONC_COD) AND (cn.conc_todosper = 'N') AND (CE.emco_ppago = :periodo)) OR  ((CE.terc_nit = :nite) AND (CE.CONC_COD = CN.CONC_COD) AND cn.conc_todosper = 'S')  ORDER BY (TERC_NIT )
  INTO :nit_tercero, :concept,  :montos, :porcen, :entidad, :numeroprom, :liquidaper, :mensual ,:CONC_COD, :CONC_DEDUC, :CONC_PORC,
  :CONC_ENTIDAD, :CONC_MONTO, :CONC_DIAS, :CONC_MODIFI,:CONC_PROMEDIO, :salario,:EMCO_PERPROM, :conc_prov, :conc_aporte , :CONC_APLICAPROM, :conc_otroconc, :conc_codotroconc, :gtoempr, :base, :tomasal
  DO
  BEGIN
   IF (conc_dias = 'S') THEN
   EXECUTE PROCEDURE DIAS_LABORADOS (:nite, :periodo, :fec, :mensual,:conc_aporte) RETURNING_VALUES (:diaslab);
   ELSE
   BEGIN
    diaslab = 15;
    IF (mensual = 'S') THEN
    BEGIN
     IF (periodicidad = 2) THEN
     diaslab = 30;
     ELSE
     IF (liquidaper = 3) THEN
     diaslab = 30;
    END
   END
   IF (:tomasal <> 0) THEN
   BEGIN
    IF ((:periodicidad = 2) AND (:tomasal <> 2)) THEN
    BEGIN
     IF ((periodo = 2) OR (periodo = 4) OR (periodo = 6) OR (periodo = 8) OR (periodo = 10) OR (periodo = 12)
     OR (periodo = 14) OR (periodo = 16) OR (periodo = 18) OR (periodo = 20) OR (periodo = 22) OR (periodo = 24)) THEN
     basico = 0;
    END
    ELSE
    IF ((:periodicidad = 3) AND (:tomasal <> 1)) THEN
    BEGIN
     IF ((periodo = 1) OR (periodo = 5) OR (periodo = 9) OR (periodo = 13) OR (periodo = 17) OR (periodo = 21)
     OR (periodo = 25) OR (periodo = 29) OR (periodo = 33) OR (periodo = 37) OR (periodo = 41) OR (periodo = 45)
     OR (periodo = 49)) THEN
     basico = 0;
    END
    ELSE
     IF ((:periodicidad = 3) AND (:tomasal <> 2)) THEN
     BEGIN
      IF ((periodo = 2) OR (periodo = 6) OR (periodo = 10) OR (periodo = 14) OR (periodo = 18) OR (periodo = 22)
      OR (periodo = 26) OR (periodo = 30) OR (periodo = 34) OR (periodo = 38) OR (periodo = 42) OR (periodo = 46)
      OR (periodo = 50)) THEN
      basico = 0;
     END
     ELSE
     IF ((:periodicidad = 3) AND (:tomasal <> 3)) THEN
     BEGIN
      IF ((periodo = 3) OR (periodo = 7) OR (periodo = 11) OR (periodo = 15) OR (periodo = 19) OR (periodo = 23)
      OR (periodo = 27) OR (periodo = 31) OR (periodo = 35) OR (periodo = 39) OR (periodo = 43) OR (periodo = 47)
      OR (periodo = 51)) THEN
      basico = 0;
     END
     ELSE
     IF ((:periodicidad = 3) AND (:tomasal <> 4)) THEN
     BEGIN
      IF ((periodo = 4) OR (periodo = 8) OR (periodo = 12) OR (periodo = 16) OR (periodo = 20) OR (periodo = 24)
      OR (periodo = 29) OR (periodo = 32) OR (periodo = 36) OR (periodo = 40) OR (periodo = 44) OR (periodo = 48)
      OR (periodo = 52)) THEN
      basico = 0;
     END
   END
   ELSE
    BEGIN
     SELECT E.empl_salario FROM EMPLEADOS E WHERE E.terc_nit = :nite INTO :basico;
    END
    SELECT ((n.nono_valor /30) * n.nono_dura), (n.nono_dura) FROM nomina_novedades n WHERE n.tnov_cod = 11 AND n.terc_nit = :nite AND n.nono_periodo = :periodo INTO :cambsaltrans, :duranov;
    IF (cambsaltrans IS NULL) THEN
    cambsaltrans = 0;
    IF (duranov IS NULL) THEN
    duranov = 0;
    diaslab = :diaslab - :duranov;
    IF (conc_cod = 922) THEN
    BEGIN
     SELECT SUM(P.prcu_monto) FROM prestamo_cuotas P, prestamo_nomina PN WHERE P.prcu_ano = :ano AND P.prcu_periodo = :periodo AND PN.prno_id = P.prno_id AND PN.terc_nit = :nite INTO :valor;
     IF (valor IS NULL) THEN
     valor = 0;
     item = :item + 1;
     UPDATE prestamo_cuotas  P SET prcu_ok = 'S' WHERE P.prcu_ano = :ano AND P.prcu_periodo = :periodo AND P.prno_id = (SELECT PN.prno_id FROM PRESTAMO_NOMINA PN WHERE PN.terc_nit = :nite);
    END
    ELSE
    IF ((:montos = 0) OR (:montos IS NULL)) THEN
    BEGIN
     IF ((CONC_PORC = 0 AND :porcen = 0) OR (CONC_PORC IS NULL AND :porcen = 0) OR (CONC_PORC = 0 AND :porcen IS NULL) OR (CONC_PORC IS NULL AND :porcen IS NULL) ) THEN
     BEGIN
      IF ((conc_monto <> 0) AND (conc_monto IS NOT NULL) ) THEN
      BEGIN
       VALOR = :CONC_MONTO;
       IF (:conc_dias = 'S') THEN
       valor = (:valor / 30) * :diaslab;
      END
      ELSE
      IF (salario = 'S' AND CONC_COD <> 900 AND CONC_COD <> 920 AND conc_cod <> 932 AND CONC_COD <> 953) THEN
      BEGIN
       SELECT E.empl_salario FROM EMPLEADOS E WHERE E.terc_nit = :nite INTO :basico;
       SELECT N.noex_recnoct, N.noex_recfest
       FROM NOMINA_HORASEXT N WHERE N.noex_periodio = :periodo AND N.noex_ano = :ano AND N.terc_nit = :nite
       INTO :recnoct, :recfest;
       IF (recnoct IS NULL) THEN
        recnoct = 0;
       IF (recfest IS NULL) THEN
        recfest = 0;
       SELECT P.paan_recnoc, P.paan_recfest FROM PARAMETROS_ANO P WHERE P.paan_ano = :ano INTO :tar_recnotc, :tar_recfest;
       basico = ((:basico/30)*:diaslab) - (((:basico/30)/8)*:recnoct);
       basico = :basico - (((:basico/30)/8)*:recfest);
       conc_monto = :basico;
       VALOR = (:conc_monto/*/30 * :diaslab*/ ) + :cambsaltrans;
      END
      ELSE
      BEGIN
       valor = montos;
       IF (:conc_dias = 'S') THEN
       valor = (:valor / 30) * :diaslab;
      END
     END
     ELSE
     BEGIN
      IF (:porcen <> 0) THEN
      BEGIN
       IF ((conc_monto <> 0) AND (conc_monto IS NOT NULL) ) THEN
       BEGIN
        VALOR = ((:CONC_MONTO ) * :PORCEN) /100;
       END
      END
      ELSE
      BEGIN
       IF ((conc_monto <> 0) AND (conc_monto IS NOT NULL) ) THEN
       BEGIN
        VALOR = ((:CONC_MONTO) * :conc_porc) /100;
       END
       ELSE
       IF (salario = 'S' AND CONC_COD <> 900 AND CONC_COD <> 920 AND conc_cod <> 932 AND CONC_COD <> 953) THEN
       BEGIN
       SELECT E.empl_salario FROM EMPLEADOS E WHERE E.terc_nit = :nite INTO :basico;
       SELECT N.noex_recnoct, N.noex_recfest
       FROM NOMINA_HORASEXT N WHERE N.noex_periodio = :periodo AND N.noex_ano = :ano AND N.terc_nit = :nite
       INTO :recnoct, :recfest;
       IF (recnoct IS NULL) THEN
        recnoct = 0;
       IF (recfest IS NULL) THEN
        recfest = 0;
       SELECT P.paan_recnoc, P.paan_recfest FROM PARAMETROS_ANO P WHERE P.paan_ano = :ano INTO :tar_recnotc, :tar_recfest;
       basico = ((:basico/30)*:diaslab) - (((:basico/30)/8)*:recnoct);
       basico = :basico - (((:basico/30)/8)*:recfest);
        conc_monto = :basico;
        VALOR = ((:CONC_MONTO)+ :cambsaltrans * :conc_porc) /100;
       END
       ELSE
       IF (:conc_monto = 0 AND :montos = 0) THEN
       BEGIN
        conc_monto = :basico;
        VALOR = (((:CONC_MONTO / 30) * :diaslab) + :cambsaltrans * :conc_porc) /100;
       END
      END
     END
    END
    ELSE
    IF ((CONC_PORC = 0 OR (conc_porc IS NULL)) AND (:porcen = 0 OR (porcen IS NULL))) THEN
    BEGIN
     VALOR = (:montos);
     IF (:conc_dias = 'S') THEN
     valor = (:valor / 30) * :diaslab;
    END
    ELSE
    IF (:porcen <> 0 AND porcen IS NOT NULL) THEN
    BEGIN
     VALOR = ((:MONTOS ) * :PORCEN) /100;
    END
    ELSE
    BEGIN
     VALOR = ((:montos) * :CONC_PORC) /100;
    END
    IF (conc_promedio = 'S') THEN
    BEGIN
     perinicial = :periodo - (:numeroprom) + 1;
     anoprom = CAST (ano AS INTEGER);
     IF (perinicial <= 0) THEN
     BEGIN
      perinicial = 1;
      anoprom = CAST(ANO AS INTEGER) - 1;
     END
     SELECT SUM (noco_valor) FROM nomina_conceptos n WHERE n.noco_aplicaprom = 'S' AND N.noco_periodo >= :perinicial - 1 AND N.noco_periodo < :periodo AND N.noco_ano >= :anoprom AND N.noco_ano <= :ano AND terc_nit = :nite INTO :valor;
     valor = ((valor ) / (numeroprom -1 ));
     SELECT NOCO_VALOR FROM NOMINA_CONCEPTOS WHERE CONC_COD = :conc_cod AND TERC_NIT  = :nite AND NOCO_PAGOOK = 'N' AND NOCO_PERIODO = 0 INTO :saldosini;
     IF (saldosini IS NULL) THEN
     saldosini = 0;
     ELSE
     UPDATE nomina_conceptos N SET noco_pagook = 'S' WHERE n.noco_aplicaprom = 'S' AND N.noco_periodo >= :perinicial - 1 AND N.noco_periodo < :periodo AND N.noco_ano >= :anoprom AND N.noco_ano <= :ano  AND CONC_COD = :conc_cod AND terc_nit = :nite AND NOCO_PERIODO = 0;
     VALOR = :valor + :saldosini;
     UPDATE nomina_conceptos N SET noco_pagook = 'S' WHERE n.noco_aplicaprom = 'S' AND N.noco_periodo >= :perinicial - 1 AND N.noco_periodo < :periodo AND N.noco_ano >= :anoprom AND N.noco_ano <= :ano  AND CONC_COD = :conc_cod AND terc_nit = :nite;
    END
    ELSE
    IF (conc_otroconc = 'S') THEN
    BEGIN
     anosum = CAST(ano AS INTEGER);
     anosum = anosum - 1;
     SELECT SUM (noco_valor) FROM nomina_conceptos n WHERE n.noco_ano = :anosum AND n.conc_cod = :conc_codotroconc AND N.terc_nit = :nite INTO :valor;
     SELECT NOCO_VALOR FROM NOMINA_CONCEPTOS WHERE noco_ano = :anosum AND conc_cod = :conc_codotroconc AND terc_nit = :nite AND NOCO_PERIODO = 0 INTO :saldosini;
     IF (saldosini IS NULL) THEN
     saldosini = 0;
     ELSE
     UPDATE nomina_conceptos SET noco_pagook = 'S' WHERE noco_ano = :anosum AND conc_cod = :conc_codotroconc AND NOCO_PERIODO = 0 AND terc_nit = :nite;
     VALOR = :valor + :saldosini;
     UPDATE nomina_conceptos SET noco_pagook = 'S' WHERE noco_ano = :anosum AND conc_cod = :conc_codotroconc AND terc_nit = :nite;
    END
    ELSE
    IF (conc_aporte = 'S') THEN
    BEGIN
     horasex = NULL;
     diasnov = NULL;
     retroact = NULL;
     reembolso = NULL;
     beneficios = NULL;
     recargo = NULL;
     IF ((:entidad = '' ) OR (entidad IS NULL)) THEN
     BEGIN
      /*COMISIONES*/
      SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
      IF (comision IS NULL) THEN
      comision = 0;
      /*RETROACTIVO*/
      SELECT C.emco_monto FROM EMPLEADO_CONCEPTOS C WHERE C.terc_nit = :nite AND C.conc_cod = 933 INTO :retroact;
      IF (retroact IS NULL ) THEN
      retroact = 0;
      /*REEMBOLSO*/
      SELECT C.emco_monto FROM EMPLEADO_CONCEPTOS C WHERE C.terc_nit = :nite AND C.conc_cod = 952 INTO :reembolso;
      IF (reembolso IS NULL ) THEN
      reembolso = 0;
      /*INCAPACIDAD*/
      SELECT N.nono_dura FROM NOMINA_NOVEDADES N WHERE N.terc_nit = :nite AND N.nono_periodo = :periodo AND N.nono_ano = :ano AND (N.tnov_cod = 2 OR (N.tnov_cod = 3)) INTO :diasnov;
      IF (:diasnov IS NULL) THEN
      incap = 0;
      ELSE
      incap = (:basico / 30)* :diasnov;
      /*BASICO*/
      SELECT N.noex_recnoct, N.noex_recfest
      FROM NOMINA_HORASEXT N WHERE N.noex_periodio = :periodo AND N.noex_ano = :ano AND N.terc_nit = :nite
      INTO :recnoct, :recfest;
      IF (recnoct IS NULL) THEN
       recnoct = 0;
      IF (recfest IS NULL) THEN
       recfest = 0;
      SELECT P.paan_recnoc, P.paan_recfest FROM PARAMETROS_ANO P WHERE P.paan_ano = :ano INTO :tar_recnotc, :tar_recfest;
      basico = ((:basico/30)*:diaslab) - (((:basico/30)/8)*:recnoct);
      basico = :basico - (((:basico/30)/8)*:recfest);
      /*HORAS EXTRA*/
      SELECT c.noex_monto FROM nomina_horasext c WHERE c.noex_ano = :ano AND c.noex_periodio = :periodo AND c.noex_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :horasex;
      IF (horasex IS NULL) THEN
       horasex = 0;
      /*RECARGOS*/
      SELECT E.empl_salario FROM EMPLEADOS E WHERE E.terc_nit = :nite INTO :basicorec;
      SELECT N.noex_recnoct, N.noex_recfest
      FROM NOMINA_HORASEXT N WHERE N.noex_periodio = :periodo AND N.noex_ano = :ano AND N.terc_nit = :nite
      INTO :recnoct, :recfest;
      IF (recnoct IS NULL) THEN
       recnoct = 0;
      IF (recfest IS NULL) THEN
       recfest = 0;
      SELECT P.paan_recnoc, P.paan_recfest FROM PARAMETROS_ANO P WHERE P.paan_ano = :ano INTO :tar_recnotc, :tar_recfest;
      recargo = (((:basicorec/30)/8)*:tar_recnotc)*:recnoct;
      recargo = :recargo + ((((:basicorec/30)/8)*:tar_recfest)*:recfest);
      /*basico*/
      IF (:basico + :comision + :horasex + :retroact+ :reembolso + :incap+ :cambsaltrans < ((:smlv/30)*:diaslab)) THEN
      comision = :smlv + :comision;
      /*SMLV Y AUX. TRANSPORTE*/
      SELECT P.paan_auxtr, P.paan_salminimo FROM PARAMETROS_ANO P WHERE P.paan_ano = :ano INTO :auxtrans, :smlv;
      /*BASE*/
      valor = :basico + :comision + :horasex + :retroact+ :reembolso + :incap + :recargo + :cambsaltrans;
      IF ((conc_cod = 904) OR (conc_cod = 905) OR (conc_cod = 906) OR (conc_cod = 934) ) THEN
      BEGIN
       entidad = :nitafp;
       IF (conc_cod = 904) THEN
       BEGIN
        SELECT A.paan_afptr FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
        VALOR = ((:valor) * :PORCEN) /100;
       END
       ELSE
       IF ((conc_cod = 905) OR (conc_cod = 906) OR (conc_cod = 934)) THEN
       BEGIN
        SELECT A.paan_afpem FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
        VALOR = ((:valor) * :PORCEN) /100;
       END
      END
      ELSE
      IF ((conc_cod = 907) OR (conc_cod = 914) OR (conc_cod = 915) OR (conc_cod = 938) ) THEN
      BEGIN
       entidad = :niteps;
       IF (conc_cod = 907) THEN
       BEGIN
        SELECT A.paan_epstr FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
        VALOR = ((:valor) * :PORCEN) /100;
       END
       ELSE
       IF ((conc_cod = 914) OR (conc_cod = 915) OR (conc_cod = 938)) THEN
       BEGIN
        SELECT A.paan_epsem FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
        VALOR = ((:valor) * :PORCEN) /100;
       END
      END
      ELSE
      IF ((conc_cod = 910) OR (conc_cod = 911) OR (conc_cod = 916) OR (conc_cod = 917) OR (conc_cod = 918) OR (conc_cod = 919) OR (conc_cod = 936) OR (conc_cod = 939) OR (conc_cod = 940)) THEN
      BEGIN
       entidad = :nitccf;
       IF ((conc_cod = 910) OR (conc_cod = 911) OR (conc_cod = 936)) THEN
       BEGIN
        SELECT A.paan_ccf FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
        VALOR = ((:valor) * :PORCEN) /100;
       END
       ELSE
       IF ((conc_cod = 916) OR (conc_cod = 917) OR (conc_cod = 939)) THEN
       BEGIN
        SELECT A.paan_icbf FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
        VALOR = ((:valor) * :PORCEN) /100;
       END
       ELSE
       IF ((conc_cod = 918) OR (conc_cod = 919) OR (conc_cod = 940)) THEN
       BEGIN
        SELECT A.paan_sena FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
        VALOR = ((:valor) * :PORCEN) /100;
       END
      END
      ELSE
      IF ((conc_cod = 912) OR (conc_cod = 913)) THEN
      BEGIN
       entidad = :nitafc;
      SELECT SUM(ce.emco_monto)
      FROM empleado_conceptos CE, CONCEPTOS_NOMINA CN WHERE ((CE.terc_nit = :nite) AND (CE.CONC_COD = CN.CONC_COD) AND (CE.emco_fecini <= :fec AND CE.emco_fecfin >= :FEC) ) OR ((CE.terc_nit = :nite)
      AND (CE.CONC_COD = CN.CONC_COD) AND (cn.conc_todosper = 'N') AND (CE.emco_ppago = :periodo)) OR  ((CE.terc_nit = :nite) AND (CE.CONC_COD = CN.CONC_COD) AND cn.conc_todosper = 'S') AND CN.conc_benefic = 'S'
      INTO :beneficios;
      IF (beneficios IS NULL) THEN
       beneficios = 0;
      SELECT P.paan_auxtr, P.paan_salminimo FROM PARAMETROS_ANO P WHERE P.paan_ano = :ano INTO :auxtrans, :smlv;
      IF (:basico < (:smlv*2)) THEN
       auxtrans = (:auxtrans / 30) * :diaslab;
      ELSE
       auxtrans = 0;
       IF ((conc_cod = 912) OR (conc_cod = 913) OR (conc_cod = 937)) THEN
       BEGIN
        SELECT A.paan_cesemp FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
        VALOR = ((:valor + :auxtrans + :beneficios) * :PORCEN) /100;
       END
      END
      ELSE
      BEGIN
       IF (comision IS NULL) THEN
       comision = 0;
       SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
       conc_monto = :basico + :comision;
       IF (conc_porc <> 0 AND conc_porc IS NOT NULL) THEN
       VALOR = (((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans + :incap) * :conc_porc) /100;
       ELSE
       IF (:porcen <> 0 AND :porcen IS NOT NULL) THEN
       VALOR = (((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans + :incap) * :porcen) /100;
       ELSE
       IF (:montos <> 0 AND :montos IS NOT NULL) THEN
       valor = :montos;
       ELSE
       IF (:conc_monto <> 0 AND :conc_monto IS NOT NULL) THEN
       valor = :conc_monto;
      END
     END
     item = :item + 1;
    END
    ELSE
    IF (conc_prov = 'S') THEN
    BEGIN
     /*RECARGO*/
     SELECT E.empl_salario FROM EMPLEADOS E WHERE E.terc_nit = :nite INTO :basico;
     SELECT N.noex_recnoct, N.noex_recfest
     FROM NOMINA_HORASEXT N WHERE N.noex_periodio = :periodo AND N.noex_ano = :ano AND N.terc_nit = :nite
     INTO :recnoct, :recfest;
     IF (recnoct IS NULL) THEN
      recnoct = 0;
     IF (recfest IS NULL) THEN
      recfest = 0;
     SELECT P.paan_recnoc, P.paan_recfest FROM PARAMETROS_ANO P WHERE P.paan_ano = :ano INTO :tar_recnotc, :tar_recfest;
     recargo = (((:basico/30)/8)*:tar_recnotc)*:recnoct;
     recargo = :recargo + ((((:basico/30)/8)*:tar_recfest)*:recfest);
     /*BASICO*/
     SELECT N.noex_recnoct, N.noex_recfest
     FROM NOMINA_HORASEXT N WHERE N.noex_periodio = :periodo AND N.noex_ano = :ano AND N.terc_nit = :nite
     INTO :recnoct, :recfest;
     IF (recnoct IS NULL) THEN
      recnoct = 0;
     IF (recfest IS NULL) THEN
      recfest = 0;
     SELECT P.paan_recnoc, P.paan_recfest FROM PARAMETROS_ANO P WHERE P.paan_ano = :ano INTO :tar_recnotc, :tar_recfest;
     basico = ((:basico/30)*:diaslab) - (((:basico/30)/8)*:recnoct);
     basico = :basico - (((:basico/30)/8)*:recfest);
     /*BENEFICIOS*/
     SELECT SUM(ce.emco_monto)
     FROM empleado_conceptos CE, CONCEPTOS_NOMINA CN WHERE ((CE.terc_nit = :nite) AND (CE.CONC_COD = CN.CONC_COD) AND (CE.emco_fecini <= :fec AND CE.emco_fecfin >= :FEC) ) OR ((CE.terc_nit = :nite)
     AND (CE.CONC_COD = CN.CONC_COD) AND (cn.conc_todosper = 'N') AND (CE.emco_ppago = :periodo)) OR  ((CE.terc_nit = :nite) AND (CE.CONC_COD = CN.CONC_COD) AND cn.conc_todosper = 'S') AND CN.conc_benefic = 'S'
     INTO :beneficios;
     IF (beneficios IS NULL) THEN
      beneficios = 0;
     IF ((conc_cod <> 929) AND (conc_cod <> 930)) THEN
     BEGIN
        SELECT P.paan_auxtr, P.paan_salminimo FROM PARAMETROS_ANO P WHERE P.paan_ano = :ano INTO :auxtrans, :smlv;
        IF (:basico < (:smlv*2)) THEN
           auxtrans = (:auxtrans / 30) * :diaslab;
        ELSE
           auxtrans = 0;
     END
     ELSE
      auxtrans = 0;
     conc_monto = :basico;
     IF (conc_porc <> 0 AND conc_porc IS NOT NULL) THEN
     VALOR = (((:CONC_MONTO)+ :cambsaltrans + :incap + :recargo + :auxtrans + :beneficios) * :conc_porc) /100;
     ELSE
     IF (porcen <> 0 AND porcen IS NOT NULL) THEN
     VALOR = (((:CONC_MONTO)+ :cambsaltrans + :incap + :recargo + :auxtrans + :beneficios) * :porcen) /100;
     ELSE
     IF (montos <> 0 AND montos IS NOT NULL) THEN
     VALOR = :montos;
     ELSE
     IF (conc_monto <> 0 AND conc_monto IS NOT NULL) THEN
     VALOR = :conc_monto;
     item = :item + 1;
    END
    ELSE
    IF (conc_cod = 920) THEN
    BEGIN
     SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :valor;
     IF (valor IS NULL) THEN
     valor = 0;
     item = :item + 1;
    END
    ELSE
    IF (conc_cod = 900 OR (:conc_cod = 931)) THEN
    BEGIN
     SELECT c.noex_monto FROM nomina_horasext c WHERE c.noex_ano = :ano AND c.noex_periodio = :periodo AND c.noex_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :valor;
     IF (valor IS NULL) THEN
     valor = 0;
     item = :item + 1;
    END
    ELSE
    IF (conc_cod = 932) THEN
    BEGIN
     SELECT N.nono_dura FROM NOMINA_NOVEDADES N WHERE N.terc_nit = :nite AND N.nono_periodo = :periodo AND N.nono_ano = :ano AND (N.tnov_cod = 2 OR (N.tnov_cod = 3)) INTO :diasnov;
     IF (:diasnov IS NULL) THEN
     valor = 0;
     ELSE
     valor = (:basico / 30)* :diasnov;
    END
    ELSE
    IF (conc_cod = 921) THEN
    BEGIN
     IF (porcen IS NOT NULL AND porcen <> 0) THEN
     valor = ((basico / 30)* :diaslab ) * :PORCEN /100;
     ELSE
     IF (conc_porc IS NOT NULL AND conc_porc <> 0) THEN
     valor = ((basico / 30)* :diaslab ) * :conc_porc /100;
    END
    ELSE
    IF (conc_cod = 953) THEN
    BEGIN
       SELECT E.empl_salario FROM EMPLEADOS E WHERE E.terc_nit = :nite INTO :basico;
       SELECT N.noex_recnoct, N.noex_recfest
       FROM NOMINA_HORASEXT N WHERE N.noex_periodio = :periodo AND N.noex_ano = :ano AND N.terc_nit = :nite
       INTO :recnoct, :recfest;
       IF (recnoct IS NULL) THEN
        recnoct = 0;
       IF (recfest IS NULL) THEN
        recfest = 0;
       SELECT P.paan_recnoc, P.paan_recfest FROM PARAMETROS_ANO P WHERE P.paan_ano = :ano INTO :tar_recnotc, :tar_recfest;
       valor = (((:basico/30)/8)*:tar_recnotc)*:recnoct;
       valor = :valor + ((((:basico/30)/8)*:tar_recfest)*:recfest);
    END
    EXECUTE PROCEDURE LEE_CONFIGURACION('NOMINA','GENERAL','REDONDEO AL MULTIPLO DE DIEZ EN TOTALES')RETURNING_VALUES(:aprox);
    EXECUTE PROCEDURE REDONDEE(:valor, :aprox) RETURNING_VALUES (VALOR);
    IF ((mensual = 'N') OR (periodicidad = 1))  THEN
    INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
    VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
    ELSE
    IF (mensual = 'S') THEN
    BEGIN
     IF ((:periodicidad = 2) AND (liquidaper = 1)) THEN
     BEGIN
      IF ((periodo = 1) OR (periodo = 3) OR (periodo = 5) OR (periodo = 7) OR (periodo = 9) OR (periodo = 11)
      OR (periodo = 13) OR (periodo = 15) OR (periodo = 17) OR (periodo = 19) OR (periodo = 21) OR (periodo = 23)) THEN
      INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
      VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
     END
     ELSE
     IF ((:periodicidad = 2) AND (liquidaper = 2)) THEN
     BEGIN
      IF ((periodo = 2) OR (periodo = 4) OR (periodo = 6) OR (periodo = 8) OR (periodo = 10) OR (periodo = 12)
      OR (periodo = 14) OR (periodo = 16) OR (periodo = 18) OR (periodo = 20) OR (periodo = 22) OR (periodo = 24)) THEN
      INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
      VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
     END
     ELSE
     IF ((:periodicidad = 3) AND (liquidaper = 1)) THEN
     BEGIN
      IF ((periodo = 1) OR (periodo = 5) OR (periodo = 9) OR (periodo = 13) OR (periodo = 17) OR (periodo = 21)
      OR (periodo = 25) OR (periodo = 29) OR (periodo = 33) OR (periodo = 37) OR (periodo = 41) OR (periodo = 45)
      OR (periodo = 49)) THEN
      INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
      VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
    END
    ELSE
     IF ((:periodicidad = 3) AND (liquidaper = 2)) THEN
     BEGIN
      IF ((periodo = 2) OR (periodo = 6) OR (periodo = 10) OR (periodo = 14) OR (periodo = 18) OR (periodo = 22)
      OR (periodo = 26) OR (periodo = 30) OR (periodo = 34) OR (periodo = 38) OR (periodo = 42) OR (periodo = 46)
      OR (periodo = 50)) THEN
      INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
      VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
     END
     ELSE
     IF ((:periodicidad = 3) AND (liquidaper = 3)) THEN
     BEGIN
      IF ((periodo = 3) OR (periodo = 7) OR (periodo = 11) OR (periodo = 15) OR (periodo = 19) OR (periodo = 23)
      OR (periodo = 27) OR (periodo = 31) OR (periodo = 35) OR (periodo = 39) OR (periodo = 43) OR (periodo = 47)
      OR (periodo = 51)) THEN
      INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
      VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
     END
     ELSE
     IF ((:periodicidad = 3) AND (liquidaper = 4)) THEN
     BEGIN
      IF ((periodo = 4) OR (periodo = 8) OR (periodo = 12) OR (periodo = 16) OR (periodo = 20) OR (periodo = 24)
      OR (periodo = 29) OR (periodo = 32) OR (periodo = 36) OR (periodo = 40) OR (periodo = 44) OR (periodo = 48)
      OR (periodo = 52)) THEN
      INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
      VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
     END
    END
  VALOR = 0;
  basico = 0;
  END
 END
 END
 END
 SUSPEND;
END
^

SET TERM ; ^

INSERT INTO CONFIGURACION (CONF_MODULO, CONF_CATEGORIA, CONF_PROPIEDAD, CONF_VALOR, CONF_POSIBLES, CONF_AYUDA)
                   VALUES ('NOMINA', 'LIQUIDACION', 'PREGUNTAR SI DESEA IMPRIMIR BENEFICIOS EN EL COMPROBANTE DE PAGO DEL EMPLEADO', 'NO', 'NO,SI', 'NO: Imprime siempre todos los conceptos, SI: Pregunta si desea imprimir los conceptos que estan marcados como beneficio');


INSERT INTO CONCEPTOS_NOMINA (CONC_COD, CONC_NOMBRE, CONC_DEDUC, CONC_FECINI, CONC_FECFIN, CONC_PORC, CONC_BASE, CONC_ENTIDAD, CONC_MONTO, CONC_CTAGAST, CONC_DIAS, CONC_MODIFI, CONC_DIAPAGO, CONC_PROMEDIO, CONC_TODOSPER, CONC_PROV, CONC_PERACTUAL, CONC_APORTE, CONC_APLICAPROM, CONC_PERPROMEDIO, CONC_OTROCONC, CONC_CODOTROCONC, CONC_SALARIO, CONC_CTACXP, CONC_NOMCORTO, CONC_PERIODOS, CONC_GTOEMPR, CONC_CXP, CONC_CART, CONC_TOMSAL, CONC_BENEFIC) VALUES (953, 'RECARGO', 'N', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'N', 'S', NULL, 'N', 'S', 'N', NULL, 'N', 'N', NULL, 'N', NULL, 'S', NULL, 'Recargo noct.', NULL, 'N', 'N', 'N', NULL, 'N');


UPDATE PARAMETROS_ANO
SET PAAN_RECNOC = 1.35,
    PAAN_RECFEST = 1.75
WHERE (PAAN_ANO = '2009');


SET TERM ^ ;

CREATE OR ALTER PROCEDURE IMPR_PLANILLA_NOMINA (
    id integer,
    pago char(1),
    cta char(1),
    empl char(1),
    dpto varchar(20))
returns (
    fecha date,
    observaciones blob sub_type 0 segment size 80,
    pagoglobal char(1),
    periodo integer,
    ano char(4),
    periodicidad varchar(60),
    nitempl varchar(20),
    valor numeric(18,2),
    deduc char(1),
    nombreempl varchar(60),
    nomcortconc varchar(60),
    nombreconc varchar(60),
    codconc integer,
    prov char(1),
    totalempl numeric(18,2),
    totaldeduc numeric(18,2),
    totaldeveng numeric(18,2),
    numempl integer,
    ctaempl varchar(25),
    totalctas numeric(18,2),
    totalnomi numeric(18,2),
    totalapor numeric(18,2),
    nomper varchar(60),
    org integer,
    cargoempl varchar(60),
    deptoempl varchar(60),
    numcop integer,
    nombre_copia varchar(60),
    diaslab integer,
    salario numeric(18,2),
    beneficio char(1))
as
declare variable nitant varchar(20);
declare variable nitnue varchar(20);
declare variable numconc integer;
declare variable totalnomineg numeric(18,2);
declare variable totalaporneg numeric(18,2);
declare variable par integer;
declare variable impar integer;
declare variable antdeduc char(1);
declare variable nitdeduc varchar(20);
declare variable nittot varchar(20);
BEGIN
 SELECT N.nuco_copia FROM NUMERO_COPIA N WHERE N.tido_cod = 92 AND N.nuco_id = :id INTO :NUMCOP;
 IF (numcop IS NULL) THEN
 BEGIN
  numcop = 0;
  INSERT INTO NUMERO_COPIA (TIDO_COD, NUCO_ID, NUCO_COPIA) VALUES (92,:id,:numcop);
 END
 ELSE
 BEGIN
  numcop = :numcop + 1;
  UPDATE numero_copia N SET N.nuco_copia = :numcop WHERE N.tido_cod = 92 AND N.nuco_id = :id;
 END
 SELECT N.noco_nombre FROM nombres_copias N WHERE N.noco_id = :numcop INTO :nombre_copia;
 numempl = 0;
 nitant = 0;
 nitnue = 0;
 IF (PAGO = 'N') THEN
 BEGIN
  FOR SELECT N.nomi_feccausa, N.nomi_obs, N.nomi_pagoglobal, N.nomi_periodo, N.nomi_ano, P.ppag_nombre, PN.pnom_nombre FROM NOMINA N, periodo_pago P, periodo_pago_nombre PN
  WHERE P.ppag_cod = N.nomi_periodocidad AND N.nomi_id = :ID AND PN.ppag_cod = N.nomi_periodocidad AND PN.ppag_periodo = N.nomi_periodo
  INTO :fecha, :observaciones, :pagoglobal, :periodo, :ano, :periodicidad, :NOMPER
  DO
  BEGIN
   FOR SELECT NC.terc_nit, NC.noco_valor, NC.noco_deduc, T.terc_nom, C.conc_nomcorto, C.conc_nombre, NC.conc_cod, NC.noco_prov, E.empl_cargo FROM NOMINA_CONCEPTOS NC, TERCEROS T, EMPLEADOS E, CONCEPTOS_NOMINA C
   WHERE NC.nomi_id = :ID AND T.terc_nit = E.terc_nit AND C.conc_cod = NC.conc_cod AND t.terc_nit = nc.terc_nit
   INTO :nitempl, :valor, :deduc, :nombreempl, :nomcortconc, :nombreconc, :codconc, :prov, :cargoempl
   DO
   BEGIN
    IF (valor IS NULL) THEN
    valor = 0;
    SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND TERC_NIT = :nitempl INTO :totalempl;
    SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND TERC_NIT = :nitempl AND NC.noco_deduc = 'S' INTO :totaldeduc;
    SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND TERC_NIT = :nitempl AND NC.noco_deduc = 'N' INTO :totaldeveng;
    SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id INTO :totalnomi;
    SELECT SUM(NC.noco_valor*-1) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_APORTE = 'S' AND NOCO_VALOR < 0 AND NOMI_ID = :id INTO :totalaporneg;
    SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_APORTE = 'S' AND NOCO_VALOR > 0 AND NOMI_ID = :id INTO :totalapor;
    totalapor = :totalapor + totalaporneg;
    SUSPEND;
   END
   nitempl = '';
   valor = NULL;
   deduc = '';
   nombreempl = NULL;
   nomcortconc = NULL;
   nombreconc = NULL;
   codconc = NULL;
   prov = NULL;
   FOR SELECT MAX(N.conc_cod) FROM NOMINA_CONCEPTOS N WHERE N.nomi_id = :id
   GROUP BY N.conc_cod
   INTO :codconc
   DO
   BEGIN
    SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC
    WHERE NC.nomi_id = :ID AND NC.conc_cod = :codconc
    GROUP BY NC.conc_cod
    INTO :valor;
    nitempl = '';
    nombreempl = '';
    deduc = 'N';
    prov = 'N';
    SELECT C.conc_nombre,C.conc_nomcorto FROM CONCEPTOS_NOMINA C WHERE C.conc_cod = :codconc INTO :nombreconc,:nomcortconc;
    SUSPEND;
   END
  END
 END
 ELSE
 IF (PAGO = 'S') THEN
 BEGIN
  par = 2;
  impar = 1;
  IF (EMPL = 'N') THEN
  BEGIN
     deduc = 'N';
     nomcortconc = 'TOTAL DEV';
     nombreconc = 'TOTAL DEV';
     codconc = 9999;
     prov = 'N';
     valor = NULL;
     nitempl = '';
     nombreempl = '';
     SUSPEND;
     deduc = 'S';
     nomcortconc = 'TOTAL DEDUC';
     nombreconc = 'TOTAL DEDUC';
     codconc = 99999;
     prov = 'N';
     valor = NULL;
     nitempl = '';
     nombreempl = '';
     SUSPEND;
     deduc = 'S';
     nomcortconc = 'TOTAL EMPL';
     nombreconc = 'TOTAL EMPL';
     codconc = 999999;
     prov = 'N';
     valor = NULL;
     nitempl = '';
     nombreempl = '';
     SUSPEND;
  END
  FOR SELECT N.nomi_feccausa, N.nomi_obs, N.nomi_pagoglobal, N.nomi_periodo, N.nomi_ano, P.ppag_nombre, PN.pnom_nombre FROM NOMINA N, periodo_pago P, periodo_pago_nombre PN
  WHERE P.ppag_cod = N.nomi_periodocidad AND N.nomi_id = :ID AND PN.ppag_cod = N.nomi_periodocidad AND PN.ppag_periodo = N.nomi_periodo
  INTO :fecha, :observaciones, :pagoglobal, :periodo, :ano, :periodicidad, :NOMPER
  DO
  BEGIN
    IF (EMPL = 'N') THEN
    BEGIN
     FOR SELECT MAX(N.conc_cod) FROM NOMINA_CONCEPTOS N WHERE N.nomi_id = :id AND N.noco_prov = 'N' AND N.noco_gtoempr = 'N'
     GROUP BY N.conc_cod
     INTO :codconc
     DO
     BEGIN
      SELECT NULL, MAX(NC.noco_deduc) FROM NOMINA_CONCEPTOS NC
      WHERE NC.nomi_id = :ID AND NC.conc_cod = :codconc
      GROUP BY NC.conc_cod
      INTO :valor, :deduc;
      valor = NULL;
      nitempl = '';
      nombreempl = '';
      prov = 'N';
      SELECT C.conc_nombre,C.conc_nomcorto FROM CONCEPTOS_NOMINA C WHERE C.conc_cod = :codconc INTO :nombreconc,:nomcortconc;
      SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id INTO :totalempl;
      SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND NC.noco_deduc = 'S' INTO :totaldeduc;
      SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND NC.noco_deduc = 'N' INTO :totaldeveng;
      SUSPEND;
     END
   END
   FOR SELECT NC.terc_nit, NC.noco_valor, NC.noco_deduc, T.terc_nom, C.conc_nomcorto, C.conc_nombre, NC.conc_cod, NC.noco_prov, E.empl_cargo, D.dpto_nombre, ND.node_diaslab,NC.terc_nit, E.empl_salario, c.conc_benefic
   FROM NOMINA_CONCEPTOS NC, TERCEROS T, EMPLEADOS E, CONCEPTOS_NOMINA C, DEPARTAMENTO D, NOMINA_DETALLE ND
   WHERE NC.nomi_id = :ID AND T.terc_nit = E.terc_nit AND C.conc_cod = NC.conc_cod AND t.terc_nit = nc.terc_nit AND D.dpto_cod = E.empl_dpto AND NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N'
   AND ND.nomi_id = :id AND ND.terc_nit = E.terc_nit
   ORDER BY T.terc_nom
   INTO :nitempl, :valor, :deduc, :nombreempl, :nomcortconc, :nombreconc, :codconc, :prov, :cargoempl,:deptoempl,:diaslab,:nitnue, :salario, :beneficio
   DO
   BEGIN
    IF ((nitnue <> nitant) AND (nitnue IS NOT NULL)) THEN
     numempl = :numempl + 1;
    IF (valor IS NULL) THEN
    valor = 0;
    IF (nitempl <> nitdeduc) THEN
    BEGIN
     par = 2;
     impar = 1;
    END
    nitdeduc = :nitempl;
    IF (:deduc = 'S') THEN
    BEGIN
     antdeduc = 'S';
     org = :par;
     par = :par + 2;
    END
    ELSE
    BEGIN
     antdeduc = 'N';
     org = :impar;
     impar = :impar + 2;
    END
    SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND TERC_NIT = :nitempl INTO :totalempl;
    SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND TERC_NIT = :nitempl AND NC.noco_deduc = 'S' INTO :totaldeduc;
    SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND TERC_NIT = :nitempl AND NC.noco_deduc = 'N' INTO :totaldeveng;
    IF (cta = 'S') THEN
    BEGIN
     SELECT COUNT(CONC_COD) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND TERC_NIT = :nitempl INTO :numconc;
     totalempl = totalempl / :numconc;
     SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND TERC_NIT = :nitempl INTO :totalctas;
    END
    SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id INTO :totalnomi;
    SELECT SUM(NC.noco_valor*-1) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_APORTE = 'S' AND NOCO_VALOR < 0 AND NOMI_ID = :id INTO :totalaporneg;
    SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_APORTE = 'S' AND NOCO_VALOR > 0 AND NOMI_ID = :id INTO :totalapor;
    totalapor = :totalapor + totalaporneg;
   SUSPEND;
    IF ((nitnue <> nitant) AND (nitnue IS NOT NULL) AND (EMPL = 'N')) THEN
    BEGIN
     deduc = 'N';
     nomcortconc = 'TOTAL DEV';
     nombreconc = 'TOTAL DEV';
     codconc = 9999;
     prov = 'N';
     SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND NC.noco_deduc = 'N' AND NC.terc_nit = : nitempl INTO :VALOR;
     SUSPEND;
     deduc = 'S';
     nomcortconc = 'TOTAL DEDUC';
     nombreconc = 'TOTAL DEDUC';
     codconc = 99999;
     prov = 'N';
     SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND NC.noco_deduc = 'S' AND NC.terc_nit = :nitempl INTO :VALOR;
     SUSPEND;
     deduc = 'S';
     nomcortconc = 'TOTAL EMPL';
     nombreconc = 'TOTAL EMPL';
     codconc = 999999;
     prov = 'N';
     SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND NC.terc_nit = :nitempl INTO :VALOR;
     nitant = :nitnue;
     SUSPEND;
    END
   END
   numempl = :numempl + 1;
   IF ( EMPL = 'N') THEN
   BEGIN
    nitempl = '';
    valor = NULL;
    deduc = '';
    nombreempl = NULL;
    nomcortconc = NULL;
    nombreconc = NULL;
    codconc = NULL;
    prov = NULL;
    totalempl = NULL;
    ctaempl = NULL;
    IF (cta = 'N') THEN
    BEGIN
     FOR SELECT MAX(N.conc_cod) FROM NOMINA_CONCEPTOS N WHERE N.nomi_id = :id AND N.noco_prov = 'N' AND N.noco_gtoempr = 'N'
     GROUP BY N.conc_cod
     INTO :codconc
     DO
     BEGIN
     IF (dpto IS NOT NULL AND (DPTO <> '') ) THEN
     BEGIN
      SELECT SUM(NC.noco_valor), MAX(NC.noco_deduc) FROM NOMINA_CONCEPTOS NC, EMPLEADOS E, DEPARTAMENTO D
      WHERE NC.nomi_id = :ID AND NC.conc_cod = :codconc AND D.dpto_cod = E.empl_dpto AND NC.terc_nit = E.terc_nit AND d.dpto_cod = :dpto
      GROUP BY NC.conc_cod
      INTO :valor, :deduc;
      nitempl = '-';
      nombreempl = 'TOTAL';
      deptoempl = '-';
      prov = 'N';
      SELECT C.conc_nombre,C.conc_nomcorto FROM CONCEPTOS_NOMINA C WHERE C.conc_cod = :codconc INTO :nombreconc,:nomcortconc;
      SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC, EMPLEADOS E, DEPARTAMENTO D WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id  AND D.dpto_cod = E.empl_dpto AND NC.terc_nit = E.terc_nit INTO :totalempl;
      SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC, EMPLEADOS E, DEPARTAMENTO D WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND NC.noco_deduc = 'S'  AND D.dpto_cod = E.empl_dpto AND NC.terc_nit = E.terc_nit INTO :totaldeduc;
      SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC, EMPLEADOS E, DEPARTAMENTO D WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND NC.noco_deduc = 'N'  AND D.dpto_cod = E.empl_dpto AND NC.terc_nit = E.terc_nit INTO :totaldeveng;
     END
     ELSE
     BEGIN
      SELECT SUM(NC.noco_valor), MAX(NC.noco_deduc) FROM NOMINA_CONCEPTOS NC
      WHERE NC.nomi_id = :ID AND NC.conc_cod = :codconc
      GROUP BY NC.conc_cod
      INTO :valor, :deduc;
      nitempl = '-';
      nombreempl = 'TOTAL';
      deptoempl = '-';
      prov = 'N';
      SELECT C.conc_nombre,C.conc_nomcorto FROM CONCEPTOS_NOMINA C WHERE C.conc_cod = :codconc INTO :nombreconc,:nomcortconc;
      SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id INTO :totalempl;
      SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND NC.noco_deduc = 'S' INTO :totaldeduc;
      SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND NC.noco_deduc = 'N' INTO :totaldeveng;
     END
      SUSPEND;
     END
     IF (dpto IS NOT NULL AND (DPTO <> '') ) THEN
     BEGIN
     deduc = 'N';
     nomcortconc = 'TOTAL DEV';
     nombreconc = 'TOTAL DEV';
     codconc = 9999;
     deptoempl = '-';
     prov = 'N';
     SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC, EMPLEADOS E, DEPARTAMENTO D WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id  AND D.dpto_cod = E.empl_dpto AND NC.terc_nit = E.terc_nit AND d.dpto_cod = :dpto INTO :VALOR;
     nitempl = '-';
     nombreempl = 'TOTAL';
     SUSPEND;
     deduc = 'S';
     nomcortconc = 'TOTAL DEDUC';
     nombreconc = 'TOTAL DEDUC';
     codconc = 99999;
     deptoempl = '-';
     prov = 'N';
     SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC, EMPLEADOS E, DEPARTAMENTO D WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND NC.noco_deduc = 'S'  AND D.dpto_cod = E.empl_dpto AND d.dpto_cod = :dpto AND NC.terc_nit = E.terc_nit INTO :VALOR;
     nitempl = '-';
     nombreempl = 'TOTAL';
     SUSPEND;
     deduc = 'S';
     nomcortconc = 'TOTAL EMPL';
     nombreconc = 'TOTAL EMPL';
     codconc = 999999;
     deptoempl = '-';
     prov = 'N';
     SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC, EMPLEADOS E, DEPARTAMENTO D WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND NC.noco_deduc = 'N'  AND D.dpto_cod = E.empl_dpto AND d.dpto_cod = :dpto AND NC.terc_nit = E.terc_nit INTO :VALOR;
     nitempl = '-';
     nombreempl = 'TOTAL';
     SUSPEND;
     END
     ELSE
     BEGIN
     deduc = 'N';
     nomcortconc = 'TOTAL DEV';
     nombreconc = 'TOTAL DEV';
     codconc = 9999;
     prov = 'N';
     SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND NC.noco_deduc = 'N' INTO :VALOR;
     nitempl = '-';
     nombreempl = 'TOTAL';
     SUSPEND;
     deduc = 'S';
     nomcortconc = 'TOTAL DEDUC';
     nombreconc = 'TOTAL DEDUC';
     codconc = 99999;
     prov = 'N';
     SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND NC.noco_deduc = 'S' INTO :VALOR;
     nitempl = '-';
     nombreempl = 'TOTAL';
     SUSPEND;
     deduc = 'S';
     nomcortconc = 'TOTAL EMPL';
     nombreconc = 'TOTAL EMPL';
     codconc = 999999;
     prov = 'N';
     SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N'  AND NOMI_ID = :id INTO :VALOR;
     nitempl = '-';
     nombreempl = 'TOTAL';
     SUSPEND;
     END
     END
   END
  END
 END
END
^

SET TERM ; ^

DROP TABLE CONFIGURACION_HORAS_EMPLEADO;

CREATE TABLE CONFIGURACION_HORAS_EMPLEADO(
    TERC_NIT       VARCHAR(20) NOT NULL,
    NUHO_ENTRADA   TIME,
    NUHO_SALIDA    TIME,
    NUHO_DIAEXTRA  TIME
);

ALTER TABLE CONFIGURACION_HORAS_EMPLEADO ADD CONSTRAINT PK_CONFIGURACION_NUMERO_HORAS PRIMARY KEY (TERC_NIT);

ALTER TABLE NOMINA_HORASEXT
ADD NOEX_MONTOREC MONTO;

SET TERM ^ ;

CREATE OR ALTER trigger nomina_horasext_bi for nomina_horasext
active before insert position 0
AS
BEGIN
/*IF (NEW.noex_diur <> 0 OR NEW.noex_fdiur <> 0 OR NEW.noex_noct <> 0 OR NEW.noex_fnoct <> 0 OR NEW.noex_recnoct <> 0 OR NEW.noex_recfest <> 0) THEN
EXECUTE PROCEDURE liquida_horas_extra (NEW.terc_nit,NEW.noex_diur,NEW.noex_noct,NEW.noex_fdiur,NEW.noex_fnoct,NEW.noex_recnoct, NEW.noex_recfest,NEW.noex_ano,'N',NEW.NOEX_SALBASE)RETURNING_VALUES(NEW.noex_monto);
*/END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER trigger nomina_horasext_bu for nomina_horasext
active before update position 0
AS
BEGIN
/*IF (NEW.noex_diur <> 0 OR NEW.noex_fdiur <> 0 OR NEW.noex_noct <> 0 OR NEW.noex_fnoct <> 0 OR NEW.noex_recnoct <> 0 OR NEW.noex_recfest <> 0) THEN
EXECUTE PROCEDURE liquida_horas_extra (NEW.terc_nit,NEW.noex_diur,NEW.noex_noct,NEW.noex_fdiur,NEW.noex_fnoct,NEW.noex_recnoct, NEW.noex_recfest,NEW.noex_ano,'N',NEW.NOEX_SALBASE)RETURNING_VALUES(NEW.noex_monto);
*/END
^

SET TERM ; ^



SET TERM ^ ;

CREATE OR ALTER PROCEDURE LIQUIDA_HORAS_EXTRA (
    nit varchar(20),
    hd smallint,
    hn smallint,
    hfd smallint,
    hfn smallint,
    rn smallint,
    rf smallint,
    ano char(4),
    provi char(1),
    salbase numeric(18,2))
returns (
    tot_he numeric(18,0),
    tot_rec numeric(18,0))
as
declare variable tot_fesd numeric(18,10);
declare variable tot_fesn numeric(18,10);
declare variable tot_diur numeric(18,10);
declare variable tot_noct numeric(18,10);
declare variable tot_recnoct numeric(18,10);
declare variable tot_recfest numeric(18,10);
declare variable tar_fesd numeric(9,4);
declare variable tar_fesn numeric(9,4);
declare variable tar_diur numeric(9,4);
declare variable tar_noct numeric(9,4);
declare variable tar_recnoct numeric(9,4);
declare variable tar_recfest numeric(9,4);
declare variable monto numeric(18,10);
BEGIN
IF (PROVI = 'N') THEN
BEGIN
IF ((:SALBASE IS NULL) OR (:SALBASE = 0) ) THEN
SELECT EMPL_SALARIO FROM empleados WHERE TERC_NIT = :NIT INTO :monto;
ELSE
MONTO = :SALBASE;
  monto = :monto / 240;
SELECT PAAN_HORASDI, PAAN_HORASNO, PAAN_HORASFN, PAAN_HORASFD, P.PAAN_RECNOC, P.PAAN_RECFEST FROM PARAMETROS_ANO P WHERE paan_ano = :ano
  INTO :tar_diur, :tar_noct, :tar_fesn, :tar_fesd, :tar_recnoct, :tar_recfest;
  tot_diur = :monto * tar_diur;
  tot_noct = :monto * tar_noct;
  tot_fesn = :monto * tar_fesn;
  tot_fesd = :monto * tar_fesd;
  tot_recnoct = :monto * tar_recnoct;
  tot_recfest = :monto * tar_recfest;
  tot_diur = :tot_diur * :hd;
  tot_noct = :tot_noct * :hn;
  tot_fesn = :tot_fesn * :hfn;
  tot_fesd = :tot_fesd * :hfd;
  tot_recnoct = :tot_recnoct * :rn;
  tot_recfest = :tot_recfest * :rf;
  tot_he =  tot_diur + tot_noct + tot_fesd + tot_fesn;
  tot_rec = :tot_recnoct + :tot_recfest;
  SUSPEND;
END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER trigger nomina_horasext_bi for nomina_horasext
active before insert position 0
AS
BEGIN
IF (NEW.noex_diur <> 0 OR NEW.noex_fdiur <> 0 OR NEW.noex_noct <> 0 OR NEW.noex_fnoct <> 0 OR NEW.noex_recnoct <> 0 OR NEW.noex_recfest <> 0) THEN
EXECUTE PROCEDURE liquida_horas_extra (NEW.terc_nit,NEW.noex_diur,NEW.noex_noct,NEW.noex_fdiur,NEW.noex_fnoct,NEW.noex_recnoct, NEW.noex_recfest,NEW.noex_ano,'N',NEW.NOEX_SALBASE)RETURNING_VALUES(NEW.noex_monto,new.noex_montorec);
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER trigger nomina_horasext_bu for nomina_horasext
active before update position 0
AS
BEGIN
IF (NEW.noex_diur <> 0 OR NEW.noex_fdiur <> 0 OR NEW.noex_noct <> 0 OR NEW.noex_fnoct <> 0 OR NEW.noex_recnoct <> 0 OR NEW.noex_recfest <> 0) THEN
EXECUTE PROCEDURE liquida_horas_extra (NEW.terc_nit,NEW.noex_diur,NEW.noex_noct,NEW.noex_fdiur,NEW.noex_fnoct,NEW.noex_recnoct, NEW.noex_recfest,NEW.noex_ano,'N',NEW.NOEX_SALBASE)RETURNING_VALUES(NEW.noex_monto,new.noex_montorec);
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER PROCEDURE DIAS_LABORADOS (
    nitempl varchar(20),
    periodo integer,
    fec date,
    mensual char(1),
    aporte char(1))
returns (
    totaldiaslab integer)
as
declare variable diasnolab integer;
declare variable diaslabxper integer;
declare variable perpago integer;
declare variable fecing date;
declare variable diasfec integer;
declare variable diasing integer;
declare variable existe char(1);
BEGIN
SELECT E.empl_ppago, E.empl_fecing
FROM EMPLEADOS E WHERE TERC_NIT = :nitempl
INTO :perpago, :fecing;
IF (mensual = 'N') THEN
BEGIN
IF (perpago = 1) THEN
diaslabxper = 30;
ELSE
IF (perpago = 2) THEN
diaslabxper = 15;
ELSE
IF (perpago = 3) THEN
diaslabxper = 7;
END
ELSE
diaslabxper = 30;
if (perpago = 2) then
BEGIN
IF (SUBSTR(fecing,1,7) = SUBSTR(FEC,1,7)) THEN
BEGIN
diasfec = CAST(substr(fec,9,10) AS INTEGER);
diasing = CAST(substr(fecing,9,10) AS INTEGER);
diaslabxper = (diasfec - diasing)+1;
IF ((diaslabxper > 15) AND (perpago = 2)) THEN
diaslabxper = 15;
END
END
ELSE
if (perpago = 1) then
BEGIN
IF (SUBSTR(fecing,1,7) = SUBSTR(FEC,1,7)) THEN
BEGIN
diasfec = CAST(substr(fec,9,10) AS INTEGER);
diasing = CAST(substr(fecing,9,10) AS INTEGER);
diaslabxper = diasfec - diasing;
IF ((diaslabxper > 30) AND (perpago = 1)) THEN
diaslabxper = 30;
END
END
SELECT 'S' FROM nomina_novedades WHERE TERC_NIT = :nitempl AND (TNOV_COD = 9 or (tnov_cod = 2) or (tnov_cod = 3) or (tnov_cod = 6)) AND NONO_PERIODO = :periodo
INTO :existe;
IF ((aporte = 'N' ) OR (:existe = 'S'))  THEN
BEGIN
SELECT SUM (NONO_DURA)
FROM nomina_novedades WHERE TERC_NIT = :nitempl AND (TNOV_COD = 9 OR (TNOV_COD = 6) OR (TNOV_COD = 2) OR (TNOV_COD =3) OR (TNOV_COD = 4)  ) AND NONO_PERIODO = :periodo
INTO :diasnolab;
if (diasnolab IS NULL) then
diasnolab = 0;
totaldiaslab =  :diaslabxper - :diasnolab;
END
if (diaslabxper IS NOT NULL) then
totaldiaslab =  :diaslabxper;
ELSE
totaldiaslab = 0;
SUSPEND;
END
^

SET TERM ; ^

GRANT ALL ON NOMINA_DEPARTAMENTO TO PUBLIC;

SET TERM ^ ;

CREATE OR ALTER PROCEDURE CAUSA_NOMINA (
    fec date,
    periodo integer,
    periodicidad integer,
    pagoglobal char(1),
    ano char(4),
    depto integer)
returns (
    idnomina integer,
    itemini integer)
as
declare variable item integer;
declare variable nite varchar(20) character set none;
declare variable nit_tercero varchar(20);
declare variable concept integer;
declare variable montos numeric(18,2);
declare variable porcen numeric(9,4);
declare variable entidad varchar(20);
declare variable conc_cod integer;
declare variable conc_deduc char(1);
declare variable conc_porc numeric(9,4);
declare variable conc_entidad integer;
declare variable conc_monto numeric(18,2);
declare variable conc_modifi char(1);
declare variable conc_promedio char(1);
declare variable emco_perprom integer;
declare variable valor numeric(18,2);
declare variable diaslab integer;
declare variable conc_prov char(1);
declare variable conc_aporte char(1);
declare variable numeroprom integer;
declare variable conc_aplicaprom char(1);
declare variable perinicial integer;
declare variable anoprom integer;
declare variable conc_dias char(1);
declare variable conc_otroconc char(1);
declare variable conc_codotroconc integer;
declare variable anosum integer;
declare variable salario char(1) character set none;
declare variable liquidaper integer;
declare variable rmod numeric(2,2);
declare variable basico numeric(18,2);
declare variable niteps varchar(20);
declare variable nitafc varchar(20);
declare variable nitafp varchar(20);
declare variable nitccf varchar(20);
declare variable gtoempr char(1);
declare variable comision numeric(18,2);
declare variable cambsaltrans numeric(18,2);
declare variable saldosini numeric(18,2);
declare variable duranov integer;
declare variable base numeric(18,2);
declare variable aprox integer;
declare variable mensual char(1);
declare variable horasex numeric(18,2);
declare variable diasnov integer;
declare variable tomasal integer;
declare variable retroact numeric(18,2);
declare variable reembolso numeric(18,2);
declare variable incap numeric(18,2);
declare variable deptoempl integer;
declare variable auxtrans numeric(18,2);
declare variable smlv numeric(18,2);
declare variable beneficios numeric(18,2);
declare variable confirmado char(1);
declare variable recnoct NUMERIC(18,2);
declare variable recfest NUMERIC(18,2);
declare variable tar_recnotc numeric(9,4);
declare variable tar_recfest numeric(9,4);
declare variable recargo numeric(18,2);
declare variable basicorec numeric(18,2);
BEGIN
 SELECT N.NOMI_ID, N.nomi_liqok FROM NOMINA N WHERE N.nomi_periodo = :periodo AND N.nomi_periodocidad = :periodicidad AND N.nomi_ano = :ano
 INTO :IDNOMINA, :CONFIRMADO;
 IF (:idnomina IS NULL) THEN
 BEGIN
  EXECUTE PROCEDURE cambie_id_nomina RETURNING_VALUES(:idnomina);
  INSERT INTO nomina (nomi_id, NOMI_FECCAUSA, NOMI_PAGOGLOBAL, NOMI_PERIODOCIDAD, NOMI_PERIODO, NOMI_ANO, NOMI_LIQOK)
  VALUES (:IDNOMINA, :fec,:pagoglobal, :periodicidad, :periodo, :ano, 'N');
  item = 1;
 END
 ELSE
 BEGIN
  SELECT MAX(N.noco_item) FROM NOMINA_CONCEPTOS N WHERE N.nomi_id = :idnomina
  INTO :item;
 END
 if ((confirmado = 'S') AND (idnomina IS NOT NULL)) then
 BEGIN
  idnomina = 0;
 END
 else
 begin
 IF (DEPTO = 0) THEN
  INSERT INTO NOMINA_DEPARTAMENTO (nomi_id, nodp_depto)VALUES(:IDNOMINA,0);
 ELSE
  INSERT INTO NOMINA_DEPARTAMENTO (nomi_id, nodp_depto)VALUES(:IDNOMINA,:DEPTO);
 ITEMINI = ITEM;
 FOR SELECT E.TERC_NIT, E.empl_salario, e.empl_eps, e.empl_afc, e.empl_afp, e.empl_ccf, e.empl_dpto
 FROM EMPLEADOS E
 WHERE E.empl_ppago = :periodicidad AND ((E.empl_fecret IS NULL) OR (E.empl_fecret > :fec)) AND E.empl_fecing <= :fec
 INTO :nite, :basico, :niteps, :nitafc, :nitafp, :nitccf, :deptoempl
 DO
 BEGIN
 IF ((depto = 0) OR (deptoempl = :depto)) THEN
 BEGIN
  FOR SELECT CE.TERC_NIT, CE.CONC_COD, CE.EMCO_MONTO, CE.EMCO_PORC, ce.empl_entidad, CE.emco_perprom, CE.emco_luquidaper, CE.emco_mensual, CN.CONC_COD, CN.CONC_DEDUC,CN.CONC_PORC, CN.CONC_ENTIDAD, CN.CONC_MONTO,  CN.CONC_DIAS, CN.CONC_MODIFI,
  CN.CONC_PROMEDIO, CN.conc_salario, CE.emco_perprom, CN.conc_prov, CN.conc_aporte, CN.conc_aplicaprom, cn.conc_otroconc, cn.conc_codotroconc, CN.conc_gtoempr, CN.conc_base, CE.emco_tomsal
  FROM empleado_conceptos CE, CONCEPTOS_NOMINA CN WHERE ((CE.terc_nit = :nite) AND (CE.CONC_COD = CN.CONC_COD) AND (CE.emco_fecini <= :fec AND CE.emco_fecfin >= :FEC) ) OR ((CE.terc_nit = :nite)
  AND (CE.CONC_COD = CN.CONC_COD) AND (cn.conc_todosper = 'N') AND (CE.emco_ppago = :periodo)) OR  ((CE.terc_nit = :nite) AND (CE.CONC_COD = CN.CONC_COD) AND cn.conc_todosper = 'S')  ORDER BY (TERC_NIT )
  INTO :nit_tercero, :concept,  :montos, :porcen, :entidad, :numeroprom, :liquidaper, :mensual ,:CONC_COD, :CONC_DEDUC, :CONC_PORC,
  :CONC_ENTIDAD, :CONC_MONTO, :CONC_DIAS, :CONC_MODIFI,:CONC_PROMEDIO, :salario,:EMCO_PERPROM, :conc_prov, :conc_aporte , :CONC_APLICAPROM, :conc_otroconc, :conc_codotroconc, :gtoempr, :base, :tomasal
  DO
  BEGIN
   IF (conc_dias = 'S') THEN
   EXECUTE PROCEDURE DIAS_LABORADOS (:nite, :periodo, :fec, :mensual,:conc_aporte) RETURNING_VALUES (:diaslab);
   ELSE
   BEGIN
    diaslab = 15;
    IF (mensual = 'S') THEN
    BEGIN
     IF (periodicidad = 2) THEN
     diaslab = 30;
     ELSE
     IF (liquidaper = 3) THEN
     diaslab = 30;
    END
   END
   IF (:tomasal <> 0) THEN
   BEGIN
    IF ((:periodicidad = 2) AND (:tomasal <> 2)) THEN
    BEGIN
     IF ((periodo = 2) OR (periodo = 4) OR (periodo = 6) OR (periodo = 8) OR (periodo = 10) OR (periodo = 12)
     OR (periodo = 14) OR (periodo = 16) OR (periodo = 18) OR (periodo = 20) OR (periodo = 22) OR (periodo = 24)) THEN
     basico = 0;
    END
    ELSE
    IF ((:periodicidad = 3) AND (:tomasal <> 1)) THEN
    BEGIN
     IF ((periodo = 1) OR (periodo = 5) OR (periodo = 9) OR (periodo = 13) OR (periodo = 17) OR (periodo = 21)
     OR (periodo = 25) OR (periodo = 29) OR (periodo = 33) OR (periodo = 37) OR (periodo = 41) OR (periodo = 45)
     OR (periodo = 49)) THEN
     basico = 0;
    END
    ELSE
     IF ((:periodicidad = 3) AND (:tomasal <> 2)) THEN
     BEGIN
      IF ((periodo = 2) OR (periodo = 6) OR (periodo = 10) OR (periodo = 14) OR (periodo = 18) OR (periodo = 22)
      OR (periodo = 26) OR (periodo = 30) OR (periodo = 34) OR (periodo = 38) OR (periodo = 42) OR (periodo = 46)
      OR (periodo = 50)) THEN
      basico = 0;
     END
     ELSE
     IF ((:periodicidad = 3) AND (:tomasal <> 3)) THEN
     BEGIN
      IF ((periodo = 3) OR (periodo = 7) OR (periodo = 11) OR (periodo = 15) OR (periodo = 19) OR (periodo = 23)
      OR (periodo = 27) OR (periodo = 31) OR (periodo = 35) OR (periodo = 39) OR (periodo = 43) OR (periodo = 47)
      OR (periodo = 51)) THEN
      basico = 0;
     END
     ELSE
     IF ((:periodicidad = 3) AND (:tomasal <> 4)) THEN
     BEGIN
      IF ((periodo = 4) OR (periodo = 8) OR (periodo = 12) OR (periodo = 16) OR (periodo = 20) OR (periodo = 24)
      OR (periodo = 29) OR (periodo = 32) OR (periodo = 36) OR (periodo = 40) OR (periodo = 44) OR (periodo = 48)
      OR (periodo = 52)) THEN
      basico = 0;
     END
   END
   ELSE
    BEGIN
     SELECT E.empl_salario FROM EMPLEADOS E WHERE E.terc_nit = :nite INTO :basico;
    END
    SELECT ((n.nono_valor /30) * n.nono_dura), (n.nono_dura) FROM nomina_novedades n WHERE n.tnov_cod = 11 AND n.terc_nit = :nite AND n.nono_periodo = :periodo INTO :cambsaltrans, :duranov;
    IF (cambsaltrans IS NULL) THEN
    cambsaltrans = 0;
    IF (duranov IS NULL) THEN
    duranov = 0;
    diaslab = :diaslab - :duranov;
    IF (conc_cod = 922) THEN
    BEGIN
     SELECT SUM(P.prcu_monto) FROM prestamo_cuotas P, prestamo_nomina PN WHERE P.prcu_ano = :ano AND P.prcu_periodo = :periodo AND PN.prno_id = P.prno_id AND PN.terc_nit = :nite INTO :valor;
     IF (valor IS NULL) THEN
     valor = 0;
     item = :item + 1;
     UPDATE prestamo_cuotas  P SET prcu_ok = 'S' WHERE P.prcu_ano = :ano AND P.prcu_periodo = :periodo AND P.prno_id = (SELECT PN.prno_id FROM PRESTAMO_NOMINA PN WHERE PN.terc_nit = :nite);
    END
    ELSE
    IF ((:montos = 0) OR (:montos IS NULL)) THEN
    BEGIN
     IF ((CONC_PORC = 0 AND :porcen = 0) OR (CONC_PORC IS NULL AND :porcen = 0) OR (CONC_PORC = 0 AND :porcen IS NULL) OR (CONC_PORC IS NULL AND :porcen IS NULL) ) THEN
     BEGIN
      IF ((conc_monto <> 0) AND (conc_monto IS NOT NULL) ) THEN
      BEGIN
       VALOR = :CONC_MONTO;
       IF (:conc_dias = 'S') THEN
       valor = (:valor / 30) * :diaslab;
      END
      ELSE
      IF (salario = 'S' AND CONC_COD <> 900 AND CONC_COD <> 920 and conc_cod <> 932 AND CONC_COD <> 953) THEN
      BEGIN
       SELECT E.empl_salario FROM EMPLEADOS E WHERE E.terc_nit = :nite INTO :basico;
/*       SELECT N.noex_recnoct, N.noex_recfest
       FROM NOMINA_HORASEXT N WHERE N.noex_periodio = :periodo AND N.noex_ano = :ano AND N.terc_nit = :nite
       INTO :recnoct, :recfest;
       if (recnoct is null) then
        recnoct = 0;
       if (recfest is null) then
        recfest = 0;
*/       SELECT P.paan_recnoc, P.paan_recfest FROM PARAMETROS_ANO P WHERE P.paan_ano = :ano INTO :tar_recnotc, :tar_recfest;
       basico = ((:basico/30)*:diaslab) - (((:basico/30)/8)*:recnoct);
       basico = :basico - (((:basico/30)/8)*:recfest);
       conc_monto = :basico;
       VALOR = (:conc_monto/*/30 * :diaslab*/ ) + :cambsaltrans;
      END
      ELSE
      BEGIN
       valor = montos;
       IF (:conc_dias = 'S') THEN
       valor = (:valor / 30) * :diaslab;
      END
     END
     ELSE
     BEGIN
      IF (:porcen <> 0) THEN
      BEGIN
       IF ((conc_monto <> 0) AND (conc_monto IS NOT NULL) ) THEN
       BEGIN
        VALOR = ((:CONC_MONTO ) * :PORCEN) /100;
       END
      END
      ELSE
      BEGIN
       IF ((conc_monto <> 0) AND (conc_monto IS NOT NULL) ) THEN
       BEGIN
        VALOR = ((:CONC_MONTO) * :conc_porc) /100;
       END
       ELSE
       IF (salario = 'S' AND CONC_COD <> 900 AND CONC_COD <> 920 and conc_cod <> 932 AND CONC_COD <> 953) THEN
       BEGIN
       SELECT E.empl_salario FROM EMPLEADOS E WHERE E.terc_nit = :nite INTO :basico;
/*       SELECT N.noex_recnoct, N.noex_recfest
       FROM NOMINA_HORASEXT N WHERE N.noex_periodio = :periodo AND N.noex_ano = :ano AND N.terc_nit = :nite
       INTO :recnoct, :recfest;
       if (recnoct is null) then
        recnoct = 0;
       if (recfest is null) then
        recfest = 0;
*/       SELECT P.paan_recnoc, P.paan_recfest FROM PARAMETROS_ANO P WHERE P.paan_ano = :ano INTO :tar_recnotc, :tar_recfest;
       basico = ((:basico/30)*:diaslab) - (((:basico/30)/8)*:recnoct);
       basico = :basico - (((:basico/30)/8)*:recfest);
        conc_monto = :basico;
        VALOR = ((:CONC_MONTO)+ :cambsaltrans * :conc_porc) /100;
       END
       ELSE
       IF (:conc_monto = 0 AND :montos = 0) THEN
       BEGIN
        conc_monto = :basico;
        VALOR = (((:CONC_MONTO / 30) * :diaslab) + :cambsaltrans * :conc_porc) /100;
       END
      END
     END
    END
    ELSE
    IF ((CONC_PORC = 0 OR (conc_porc IS NULL)) AND (:porcen = 0 OR (porcen IS NULL))) THEN
    BEGIN
     VALOR = (:montos);
     IF (:conc_dias = 'S') THEN
     valor = (:valor / 30) * :diaslab;
    END
    ELSE
    IF (:porcen <> 0 AND porcen IS NOT NULL) THEN
    BEGIN
     VALOR = ((:MONTOS ) * :PORCEN) /100;
    END
    ELSE
    BEGIN
     VALOR = ((:montos) * :CONC_PORC) /100;
    END
    IF (conc_promedio = 'S') THEN
    BEGIN
     perinicial = :periodo - (:numeroprom) + 1;
     anoprom = CAST (ano AS INTEGER);
     IF (perinicial <= 0) THEN
     BEGIN
      perinicial = 1;
      anoprom = CAST(ANO AS INTEGER) - 1;
     END
     SELECT SUM (noco_valor) FROM nomina_conceptos n WHERE n.noco_aplicaprom = 'S' AND N.noco_periodo >= :perinicial - 1 AND N.noco_periodo < :periodo AND N.noco_ano >= :anoprom AND N.noco_ano <= :ano AND terc_nit = :nite INTO :valor;
     valor = ((valor ) / (numeroprom -1 ));
     SELECT NOCO_VALOR FROM NOMINA_CONCEPTOS WHERE CONC_COD = :conc_cod AND TERC_NIT  = :nite AND NOCO_PAGOOK = 'N' AND NOCO_PERIODO = 0 INTO :saldosini;
     IF (saldosini IS NULL) THEN
     saldosini = 0;
     ELSE
     UPDATE nomina_conceptos N SET noco_pagook = 'S' WHERE n.noco_aplicaprom = 'S' AND N.noco_periodo >= :perinicial - 1 AND N.noco_periodo < :periodo AND N.noco_ano >= :anoprom AND N.noco_ano <= :ano  AND CONC_COD = :conc_cod AND terc_nit = :nite AND NOCO_PERIODO = 0;
     VALOR = :valor + :saldosini;
     UPDATE nomina_conceptos N SET noco_pagook = 'S' WHERE n.noco_aplicaprom = 'S' AND N.noco_periodo >= :perinicial - 1 AND N.noco_periodo < :periodo AND N.noco_ano >= :anoprom AND N.noco_ano <= :ano  AND CONC_COD = :conc_cod AND terc_nit = :nite;
    END
    ELSE
    IF (conc_otroconc = 'S') THEN
    BEGIN
     anosum = CAST(ano AS INTEGER);
     anosum = anosum - 1;
     SELECT SUM (noco_valor) FROM nomina_conceptos n WHERE n.noco_ano = :anosum AND n.conc_cod = :conc_codotroconc AND N.terc_nit = :nite INTO :valor;
     SELECT NOCO_VALOR FROM NOMINA_CONCEPTOS WHERE noco_ano = :anosum AND conc_cod = :conc_codotroconc AND terc_nit = :nite AND NOCO_PERIODO = 0 INTO :saldosini;
     IF (saldosini IS NULL) THEN
     saldosini = 0;
     ELSE
     UPDATE nomina_conceptos SET noco_pagook = 'S' WHERE noco_ano = :anosum AND conc_cod = :conc_codotroconc AND NOCO_PERIODO = 0 AND terc_nit = :nite;
     VALOR = :valor + :saldosini;
     UPDATE nomina_conceptos SET noco_pagook = 'S' WHERE noco_ano = :anosum AND conc_cod = :conc_codotroconc AND terc_nit = :nite;
    END
    ELSE
    IF (conc_aporte = 'S') THEN
    BEGIN
     horasex = NULL;
     diasnov = NULL;
     retroact = NULL;
     reembolso = NULL;
     beneficios = null;
     recargo = null;
     IF ((:entidad = '' ) OR (entidad IS NULL)) THEN
     BEGIN
      /*COMISIONES*/
      SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
      IF (comision IS NULL) THEN
      comision = 0;
      /*RETROACTIVO*/
      SELECT C.emco_monto FROM EMPLEADO_CONCEPTOS C WHERE C.terc_nit = :nite AND C.conc_cod = 933 INTO :retroact;
      IF (retroact IS NULL ) THEN
      retroact = 0;
      /*REEMBOLSO*/
      SELECT C.emco_monto FROM EMPLEADO_CONCEPTOS C WHERE C.terc_nit = :nite AND C.conc_cod = 952 INTO :reembolso;
      IF (reembolso IS NULL ) THEN
      reembolso = 0;
      /*INCAPACIDAD*/
      SELECT N.nono_dura FROM NOMINA_NOVEDADES N WHERE N.terc_nit = :nite AND N.nono_periodo = :periodo AND N.nono_ano = :ano AND (N.tnov_cod = 2 OR (N.tnov_cod = 3)) INTO :diasnov;
      IF (:diasnov IS NULL) THEN
      incap = 0;
      ELSE
      incap = (:basico / 30)* :diasnov;
      /*BASICO*/
/*      SELECT N.noex_recnoct, N.noex_recfest
      FROM NOMINA_HORASEXT N WHERE N.noex_periodio = :periodo AND N.noex_ano = :ano AND N.terc_nit = :nite
      INTO :recnoct, :recfest;
      if (recnoct is null) then
       recnoct = 0;
      if (recfest is null) then
       recfest = 0;
*/      SELECT P.paan_recnoc, P.paan_recfest FROM PARAMETROS_ANO P WHERE P.paan_ano = :ano INTO :tar_recnotc, :tar_recfest;
      basico = ((:basico/30)*:diaslab) - (((:basico/30)/8)*:recnoct);
      basico = :basico - (((:basico/30)/8)*:recfest);
      /*HORAS EXTRA*/
      SELECT c.noex_monto FROM nomina_horasext c WHERE c.noex_ano = :ano AND c.noex_periodio = :periodo AND c.noex_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :horasex;
      if (horasex is null) then
       horasex = 0;
      /*RECARGOS*/
      SELECT E.empl_salario FROM EMPLEADOS E WHERE E.terc_nit = :nite INTO :basicorec;
/*      SELECT N.noex_recnoct, N.noex_recfest
      FROM NOMINA_HORASEXT N WHERE N.noex_periodio = :periodo AND N.noex_ano = :ano AND N.terc_nit = :nite
      INTO :recnoct, :recfest;
      if (recnoct is null) then
       recnoct = 0;
      if (recfest is null) then
       recfest = 0;
*/      SELECT P.paan_recnoc, P.paan_recfest FROM PARAMETROS_ANO P WHERE P.paan_ano = :ano INTO :tar_recnotc, :tar_recfest;
      recargo = (((:basicorec/30)/8)*:tar_recnotc)*:recnoct;
      recargo = :recargo + ((((:basicorec/30)/8)*:tar_recfest)*:recfest);
      /*basico*/
      if (:basico + :comision + :horasex + :retroact+ :reembolso + :incap+ :cambsaltrans < ((:smlv/30)*:diaslab)) then
      comision = :smlv + :comision;
      /*SMLV Y AUX. TRANSPORTE*/
      SELECT P.paan_auxtr, P.paan_salminimo FROM PARAMETROS_ANO P WHERE P.paan_ano = :ano INTO :auxtrans, :smlv;
      /*BASE*/
      valor = :basico + :comision + :horasex + :retroact+ :reembolso + :incap + :recargo + :cambsaltrans;
      IF ((conc_cod = 904) OR (conc_cod = 905) OR (conc_cod = 906) or (conc_cod = 934) ) THEN
      BEGIN
       entidad = :nitafp;
       IF (conc_cod = 904) THEN
       BEGIN
        SELECT A.paan_afptr FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
        VALOR = ((:valor) * :PORCEN) /100;
       END
       ELSE
       IF ((conc_cod = 905) OR (conc_cod = 906) or (conc_cod = 934)) THEN
       BEGIN
        SELECT A.paan_afpem FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
        VALOR = ((:valor) * :PORCEN) /100;
       END
      END
      ELSE
      IF ((conc_cod = 907) OR (conc_cod = 914) OR (conc_cod = 915) or (conc_cod = 938) ) THEN
      BEGIN
       entidad = :niteps;
       IF (conc_cod = 907) THEN
       BEGIN
        SELECT A.paan_epstr FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
        VALOR = ((:valor) * :PORCEN) /100;
       END
       ELSE
       IF ((conc_cod = 914) OR (conc_cod = 915) or (conc_cod = 938)) THEN
       BEGIN
        SELECT A.paan_epsem FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
        VALOR = ((:valor) * :PORCEN) /100;
       END
      END
      ELSE
      IF ((conc_cod = 910) OR (conc_cod = 911) OR (conc_cod = 916) OR (conc_cod = 917) OR (conc_cod = 918) OR (conc_cod = 919) or (conc_cod = 936) or (conc_cod = 939) or (conc_cod = 940)) THEN
      BEGIN
       entidad = :nitccf;
       IF ((conc_cod = 910) OR (conc_cod = 911) or (conc_cod = 936)) THEN
       BEGIN
        SELECT A.paan_ccf FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
        VALOR = ((:valor) * :PORCEN) /100;
       END
       ELSE
       IF ((conc_cod = 916) OR (conc_cod = 917) or (conc_cod = 939)) THEN
       BEGIN
        SELECT A.paan_icbf FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
        VALOR = ((:valor) * :PORCEN) /100;
       END
       ELSE
       IF ((conc_cod = 918) OR (conc_cod = 919) or (conc_cod = 940)) THEN
       BEGIN
        SELECT A.paan_sena FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
        VALOR = ((:valor) * :PORCEN) /100;
       END
      END
      ELSE
      IF ((conc_cod = 912) OR (conc_cod = 913)) THEN
      BEGIN
       entidad = :nitafc;
      SELECT SUM(ce.emco_monto)
      FROM empleado_conceptos CE, CONCEPTOS_NOMINA CN WHERE ((CE.terc_nit = :nite) AND (CE.CONC_COD = CN.CONC_COD) AND (CE.emco_fecini <= :fec AND CE.emco_fecfin >= :FEC) ) OR ((CE.terc_nit = :nite)
      AND (CE.CONC_COD = CN.CONC_COD) AND (cn.conc_todosper = 'N') AND (CE.emco_ppago = :periodo)) OR  ((CE.terc_nit = :nite) AND (CE.CONC_COD = CN.CONC_COD) AND cn.conc_todosper = 'S') AND CN.conc_benefic = 'S'
      INTO :beneficios;
      if (beneficios is null) then
       beneficios = 0;
      SELECT P.paan_auxtr, P.paan_salminimo FROM PARAMETROS_ANO P WHERE P.paan_ano = :ano INTO :auxtrans, :smlv;
      if (:basico < (:smlv*2)) then
       auxtrans = (:auxtrans / 30) * :diaslab;
      ELSE
       auxtrans = 0;
       IF ((conc_cod = 912) OR (conc_cod = 913) or (conc_cod = 937)) THEN
       BEGIN
        SELECT A.paan_cesemp FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
        VALOR = ((:valor + :auxtrans + :beneficios) * :PORCEN) /100;
       END
      END
      ELSE
      BEGIN
       IF (comision IS NULL) THEN
       comision = 0;
       SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
       conc_monto = :basico + :comision;
       IF (conc_porc <> 0 AND conc_porc IS NOT NULL) THEN
       VALOR = (((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans + :incap) * :conc_porc) /100;
       ELSE
       IF (:porcen <> 0 AND :porcen IS NOT NULL) THEN
       VALOR = (((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans + :incap) * :porcen) /100;
       ELSE
       IF (:montos <> 0 AND :montos IS NOT NULL) THEN
       valor = :montos;
       ELSE
       IF (:conc_monto <> 0 AND :conc_monto IS NOT NULL) THEN
       valor = :conc_monto;
      END
     END
     item = :item + 1;
    END
    ELSE
    IF (conc_prov = 'S') THEN
    BEGIN
     /*RECARGO*/
     SELECT E.empl_salario FROM EMPLEADOS E WHERE E.terc_nit = :nite INTO :basico;
/*     SELECT N.noex_recnoct, N.noex_recfest
     FROM NOMINA_HORASEXT N WHERE N.noex_periodio = :periodo AND N.noex_ano = :ano AND N.terc_nit = :nite
     INTO :recnoct, :recfest;
     if (recnoct is null) then
      recnoct = 0;
     if (recfest is null) then
      recfest = 0;
*/     SELECT P.paan_recnoc, P.paan_recfest FROM PARAMETROS_ANO P WHERE P.paan_ano = :ano INTO :tar_recnotc, :tar_recfest;
     recargo = (((:basico/30)/8)*:tar_recnotc)*:recnoct;
     recargo = :recargo + ((((:basico/30)/8)*:tar_recfest)*:recfest);
     /*BASICO*/
/*     SELECT N.noex_recnoct, N.noex_recfest
     FROM NOMINA_HORASEXT N WHERE N.noex_periodio = :periodo AND N.noex_ano = :ano AND N.terc_nit = :nite
     INTO :recnoct, :recfest;
     if (recnoct is null) then
      recnoct = 0;
     if (recfest is null) then
      recfest = 0;
*/     SELECT P.paan_recnoc, P.paan_recfest FROM PARAMETROS_ANO P WHERE P.paan_ano = :ano INTO :tar_recnotc, :tar_recfest;
     basico = ((:basico/30)*:diaslab) - (((:basico/30)/8)*:recnoct);
     basico = :basico - (((:basico/30)/8)*:recfest);
     /*BENEFICIOS*/
     SELECT SUM(ce.emco_monto)
     FROM empleado_conceptos CE, CONCEPTOS_NOMINA CN WHERE ((CE.terc_nit = :nite) AND (CE.CONC_COD = CN.CONC_COD) AND (CE.emco_fecini <= :fec AND CE.emco_fecfin >= :FEC) ) OR ((CE.terc_nit = :nite)
     AND (CE.CONC_COD = CN.CONC_COD) AND (cn.conc_todosper = 'N') AND (CE.emco_ppago = :periodo)) OR  ((CE.terc_nit = :nite) AND (CE.CONC_COD = CN.CONC_COD) AND cn.conc_todosper = 'S') AND CN.conc_benefic = 'S'
     INTO :beneficios;
     if (beneficios is null) then
      beneficios = 0;
     if ((conc_cod <> 929) and (conc_cod <> 930)) then
     begin
        SELECT P.paan_auxtr, P.paan_salminimo FROM PARAMETROS_ANO P WHERE P.paan_ano = :ano INTO :auxtrans, :smlv;
        if (:basico < (:smlv*2)) then
           auxtrans = (:auxtrans / 30) * :diaslab;
        ELSE
           auxtrans = 0;
     end
     else
      auxtrans = 0;
     conc_monto = :basico;
     IF (conc_porc <> 0 AND conc_porc IS NOT NULL) THEN
     VALOR = (((:CONC_MONTO)+ :cambsaltrans + :incap + :recargo + :auxtrans + :beneficios) * :conc_porc) /100;
     ELSE
     IF (porcen <> 0 AND porcen IS NOT NULL) THEN
     VALOR = (((:CONC_MONTO)+ :cambsaltrans + :incap + :recargo + :auxtrans + :beneficios) * :porcen) /100;
     ELSE
     IF (montos <> 0 AND montos IS NOT NULL) THEN
     VALOR = :montos;
     ELSE
     IF (conc_monto <> 0 AND conc_monto IS NOT NULL) THEN
     VALOR = :conc_monto;
     item = :item + 1;
    END
    ELSE
    IF (conc_cod = 920) THEN
    BEGIN
     SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :valor;
     IF (valor IS NULL) THEN
     valor = 0;
     item = :item + 1;
    END
    ELSE
    IF (conc_cod = 900 OR (:conc_cod = 931)) THEN
    BEGIN
     SELECT c.noex_monto FROM nomina_horasext c WHERE c.noex_ano = :ano AND c.noex_periodio = :periodo AND c.noex_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :valor;
     IF (valor IS NULL) THEN
     valor = 0;
     item = :item + 1;
    END
    ELSE
    IF (conc_cod = 932) THEN
    BEGIN
     SELECT N.nono_dura FROM NOMINA_NOVEDADES N WHERE N.terc_nit = :nite AND N.nono_periodo = :periodo AND N.nono_ano = :ano AND (N.tnov_cod = 2 OR (N.tnov_cod = 3)) INTO :diasnov;
     IF (:diasnov IS NULL) THEN
     valor = 0;
     ELSE
     valor = (:basico / 30)* :diasnov;
    END
    ELSE
    IF (conc_cod = 921) THEN
    BEGIN
     IF (porcen IS NOT NULL AND porcen <> 0) THEN
     valor = ((basico / 30)* :diaslab ) * :PORCEN /100;
     ELSE
     IF (conc_porc IS NOT NULL AND conc_porc <> 0) THEN
     valor = ((basico / 30)* :diaslab ) * :conc_porc /100;
    END
    ELSE
    if (conc_cod = 953) then
    BEGIN
       SELECT E.empl_salario FROM EMPLEADOS E WHERE E.terc_nit = :nite INTO :basico;
/*       SELECT N.noex_recnoct, N.noex_recfest
       FROM NOMINA_HORASEXT N WHERE N.noex_periodio = :periodo AND N.noex_ano = :ano AND N.terc_nit = :nite
       INTO :recnoct, :recfest;
       if (recnoct is null) then
        recnoct = 0;
       if (recfest is null) then
        recfest = 0;
*/       SELECT P.paan_recnoc, P.paan_recfest FROM PARAMETROS_ANO P WHERE P.paan_ano = :ano INTO :tar_recnotc, :tar_recfest;
       valor = (((:basico/30)/8)*:tar_recnotc)*:recnoct;
       valor = :valor + ((((:basico/30)/8)*:tar_recfest)*:recfest);
    END
    EXECUTE PROCEDURE LEE_CONFIGURACION('NOMINA','GENERAL','REDONDEO AL MULTIPLO DE DIEZ EN TOTALES')RETURNING_VALUES(:aprox);
    EXECUTE PROCEDURE REDONDEE(:valor, :aprox) RETURNING_VALUES (VALOR);
    IF ((mensual = 'N') OR (periodicidad = 1))  THEN
    INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
    VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
    ELSE
    IF (mensual = 'S') THEN
    BEGIN
     IF ((:periodicidad = 2) AND (liquidaper = 1)) THEN
     BEGIN
      IF ((periodo = 1) OR (periodo = 3) OR (periodo = 5) OR (periodo = 7) OR (periodo = 9) OR (periodo = 11)
      OR (periodo = 13) OR (periodo = 15) OR (periodo = 17) OR (periodo = 19) OR (periodo = 21) OR (periodo = 23)) THEN
      INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
      VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
     END
     ELSE
     IF ((:periodicidad = 2) AND (liquidaper = 2)) THEN
     BEGIN
      IF ((periodo = 2) OR (periodo = 4) OR (periodo = 6) OR (periodo = 8) OR (periodo = 10) OR (periodo = 12)
      OR (periodo = 14) OR (periodo = 16) OR (periodo = 18) OR (periodo = 20) OR (periodo = 22) OR (periodo = 24)) THEN
      INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
      VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
     END
     ELSE
     IF ((:periodicidad = 3) AND (liquidaper = 1)) THEN
     BEGIN
      IF ((periodo = 1) OR (periodo = 5) OR (periodo = 9) OR (periodo = 13) OR (periodo = 17) OR (periodo = 21)
      OR (periodo = 25) OR (periodo = 29) OR (periodo = 33) OR (periodo = 37) OR (periodo = 41) OR (periodo = 45)
      OR (periodo = 49)) THEN
      INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
      VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
    END
    ELSE
     IF ((:periodicidad = 3) AND (liquidaper = 2)) THEN
     BEGIN
      IF ((periodo = 2) OR (periodo = 6) OR (periodo = 10) OR (periodo = 14) OR (periodo = 18) OR (periodo = 22)
      OR (periodo = 26) OR (periodo = 30) OR (periodo = 34) OR (periodo = 38) OR (periodo = 42) OR (periodo = 46)
      OR (periodo = 50)) THEN
      INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
      VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
     END
     ELSE
     IF ((:periodicidad = 3) AND (liquidaper = 3)) THEN
     BEGIN
      IF ((periodo = 3) OR (periodo = 7) OR (periodo = 11) OR (periodo = 15) OR (periodo = 19) OR (periodo = 23)
      OR (periodo = 27) OR (periodo = 31) OR (periodo = 35) OR (periodo = 39) OR (periodo = 43) OR (periodo = 47)
      OR (periodo = 51)) THEN
      INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
      VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
     END
     ELSE
     IF ((:periodicidad = 3) AND (liquidaper = 4)) THEN
     BEGIN
      IF ((periodo = 4) OR (periodo = 8) OR (periodo = 12) OR (periodo = 16) OR (periodo = 20) OR (periodo = 24)
      OR (periodo = 29) OR (periodo = 32) OR (periodo = 36) OR (periodo = 40) OR (periodo = 44) OR (periodo = 48)
      OR (periodo = 52)) THEN
      INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
      VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
     END
    END
  VALOR = 0;
  basico = 0;
  END
 END
 END
 END
 SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER trigger nomina_horasext_bu for nomina_horasext
active before update position 0
AS
BEGIN
/*IF (NEW.noex_diur <> 0 OR NEW.noex_fdiur <> 0 OR NEW.noex_noct <> 0 OR NEW.noex_fnoct <> 0 OR NEW.noex_recnoct <> 0 OR NEW.noex_recfest <> 0) THEN
EXECUTE PROCEDURE liquida_horas_extra (NEW.terc_nit,NEW.noex_diur,NEW.noex_noct,NEW.noex_fdiur,NEW.noex_fnoct,NEW.noex_recnoct, NEW.noex_recfest,NEW.noex_ano,'N',NEW.NOEX_SALBASE)RETURNING_VALUES(NEW.noex_monto,new.noex_montorec);
*/END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER trigger nomina_horasext_bi for nomina_horasext
active before insert position 0
AS
BEGIN
/*IF (NEW.noex_diur <> 0 OR NEW.noex_fdiur <> 0 OR NEW.noex_noct <> 0 OR NEW.noex_fnoct <> 0 OR NEW.noex_recnoct <> 0 OR NEW.noex_recfest <> 0) THEN
EXECUTE PROCEDURE liquida_horas_extra (NEW.terc_nit,NEW.noex_diur,NEW.noex_noct,NEW.noex_fdiur,NEW.noex_fnoct,NEW.noex_recnoct, NEW.noex_recfest,NEW.noex_ano,'N',NEW.NOEX_SALBASE)RETURNING_VALUES(NEW.noex_monto,new.noex_montorec);
*/END
^

SET TERM ; ^

ALTER TABLE NOMINA_HORASEXT DROP NOEX_DIUR;
ALTER TABLE NOMINA_HORASEXT DROP NOEX_FDIUR;
ALTER TABLE NOMINA_HORASEXT DROP NOEX_NOCT;
ALTER TABLE NOMINA_HORASEXT DROP NOEX_FNOCT;
ALTER TABLE NOMINA_HORASEXT DROP NOEX_RECNOCT;
ALTER TABLE NOMINA_HORASEXT DROP NOEX_RECFEST;

ALTER TABLE NOMINA_HORASEXT ADD NOEX_DIUR NUMERIC(18,2);
ALTER TABLE NOMINA_HORASEXT ADD NOEX_FDIUR NUMERIC(18,2);
ALTER TABLE NOMINA_HORASEXT ADD NOEX_NOCT NUMERIC(18,2);
ALTER TABLE NOMINA_HORASEXT ADD NOEX_FNOCT NUMERIC(18,2);
ALTER TABLE NOMINA_HORASEXT ADD NOEX_RECNOCT NUMERIC(18,2);
ALTER TABLE NOMINA_HORASEXT ADD NOEX_RECFEST NUMERIC(18,2);

SET TERM ^ ;

CREATE OR ALTER trigger nomina_horasext_bu for nomina_horasext
active before update position 0
AS
BEGIN
IF (NEW.noex_diur <> 0 OR NEW.noex_fdiur <> 0 OR NEW.noex_noct <> 0 OR NEW.noex_fnoct <> 0 OR NEW.noex_recnoct <> 0 OR NEW.noex_recfest <> 0) THEN
EXECUTE PROCEDURE liquida_horas_extra (NEW.terc_nit,NEW.noex_diur,NEW.noex_noct,NEW.noex_fdiur,NEW.noex_fnoct,NEW.noex_recnoct, NEW.noex_recfest,NEW.noex_ano,'N',NEW.NOEX_SALBASE)RETURNING_VALUES(NEW.noex_monto,new.noex_montorec);
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER trigger nomina_horasext_bi for nomina_horasext
active before insert position 0
AS
BEGIN
IF (NEW.noex_diur <> 0 OR NEW.noex_fdiur <> 0 OR NEW.noex_noct <> 0 OR NEW.noex_fnoct <> 0 OR NEW.noex_recnoct <> 0 OR NEW.noex_recfest <> 0) THEN
EXECUTE PROCEDURE liquida_horas_extra (NEW.terc_nit,NEW.noex_diur,NEW.noex_noct,NEW.noex_fdiur,NEW.noex_fnoct,NEW.noex_recnoct, NEW.noex_recfest,NEW.noex_ano,'N',NEW.NOEX_SALBASE)RETURNING_VALUES(NEW.noex_monto,new.noex_montorec);
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER PROCEDURE LIQUIDA_HORAS_EXTRA (
    nit varchar(20),
    hd NUMERIC(18,2),
    hn NUMERIC(18,2),
    hfd NUMERIC(18,2),
    hfn NUMERIC(18,2),
    rn NUMERIC(18,2),
    rf NUMERIC(18,2),
    ano char(4),
    provi char(1),
    salbase numeric(18,2))
returns (
    tot_he numeric(18,0),
    tot_rec numeric(18,0))
as
declare variable tot_fesd numeric(18,10);
declare variable tot_fesn numeric(18,10);
declare variable tot_diur numeric(18,10);
declare variable tot_noct numeric(18,10);
declare variable tot_recnoct numeric(18,10);
declare variable tot_recfest numeric(18,10);
declare variable tar_fesd numeric(9,4);
declare variable tar_fesn numeric(9,4);
declare variable tar_diur numeric(9,4);
declare variable tar_noct numeric(9,4);
declare variable tar_recnoct numeric(9,4);
declare variable tar_recfest numeric(9,4);
declare variable monto numeric(18,10);
BEGIN
IF (PROVI = 'N') THEN
BEGIN
IF ((:SALBASE IS NULL) OR (:SALBASE = 0) ) THEN
SELECT EMPL_SALARIO FROM empleados WHERE TERC_NIT = :NIT INTO :monto;
ELSE
MONTO = :SALBASE;
  monto = :monto / 240;
SELECT PAAN_HORASDI, PAAN_HORASNO, PAAN_HORASFN, PAAN_HORASFD, P.PAAN_RECNOC, P.PAAN_RECFEST FROM PARAMETROS_ANO P WHERE paan_ano = :ano
  INTO :tar_diur, :tar_noct, :tar_fesn, :tar_fesd, :tar_recnoct, :tar_recfest;
  tot_diur = :monto * tar_diur;
  tot_noct = :monto * tar_noct;
  tot_fesn = :monto * tar_fesn;
  tot_fesd = :monto * tar_fesd;
  tot_recnoct = :monto * tar_recnoct;
  tot_recfest = :monto * tar_recfest;
  tot_diur = :tot_diur * :hd;
  tot_noct = :tot_noct * :hn;
  tot_fesn = :tot_fesn * :hfn;
  tot_fesd = :tot_fesd * :hfd;
  tot_recnoct = :tot_recnoct * :rn;
  tot_recfest = :tot_recfest * :rf;
  tot_he =  tot_diur + tot_noct + tot_fesd + tot_fesn;
  tot_rec = :tot_recnoct + :tot_recfest;
  SUSPEND;
END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER PROCEDURE CAUSA_NOMINA (
    fec date,
    periodo integer,
    periodicidad integer,
    pagoglobal char(1),
    ano char(4),
    depto integer)
returns (
    idnomina integer,
    itemini integer)
as
declare variable item integer;
declare variable nite varchar(20) character set none;
declare variable nit_tercero varchar(20);
declare variable concept integer;
declare variable montos numeric(18,2);
declare variable porcen numeric(9,4);
declare variable entidad varchar(20);
declare variable conc_cod integer;
declare variable conc_deduc char(1);
declare variable conc_porc numeric(9,4);
declare variable conc_entidad integer;
declare variable conc_monto numeric(18,2);
declare variable conc_modifi char(1);
declare variable conc_promedio char(1);
declare variable emco_perprom integer;
declare variable valor numeric(18,2);
declare variable diaslab integer;
declare variable conc_prov char(1);
declare variable conc_aporte char(1);
declare variable numeroprom integer;
declare variable conc_aplicaprom char(1);
declare variable perinicial integer;
declare variable anoprom integer;
declare variable conc_dias char(1);
declare variable conc_otroconc char(1);
declare variable conc_codotroconc integer;
declare variable anosum integer;
declare variable salario char(1) character set none;
declare variable liquidaper integer;
declare variable rmod numeric(2,2);
declare variable basico numeric(18,2);
declare variable niteps varchar(20);
declare variable nitafc varchar(20);
declare variable nitafp varchar(20);
declare variable nitccf varchar(20);
declare variable gtoempr char(1);
declare variable comision numeric(18,2);
declare variable cambsaltrans numeric(18,2);
declare variable saldosini numeric(18,2);
declare variable duranov integer;
declare variable base numeric(18,2);
declare variable aprox integer;
declare variable mensual char(1);
declare variable horasex numeric(18,2);
declare variable diasnov integer;
declare variable tomasal integer;
declare variable retroact numeric(18,2);
declare variable reembolso numeric(18,2);
declare variable incap numeric(18,2);
declare variable deptoempl integer;
declare variable auxtrans numeric(18,2);
declare variable smlv numeric(18,2);
declare variable beneficios numeric(18,2);
declare variable confirmado char(1);
declare variable recnoct NUMERIC(18,2);
declare variable recfest NUMERIC(18,2);
declare variable tar_recnotc numeric(9,4);
declare variable tar_recfest numeric(9,4);
declare variable recargo numeric(18,2);
declare variable basicorec numeric(18,2);
BEGIN
 SELECT N.NOMI_ID, N.nomi_liqok FROM NOMINA N WHERE N.nomi_periodo = :periodo AND N.nomi_periodocidad = :periodicidad AND N.nomi_ano = :ano
 INTO :IDNOMINA, :CONFIRMADO;
 IF (:idnomina IS NULL) THEN
 BEGIN
  EXECUTE PROCEDURE cambie_id_nomina RETURNING_VALUES(:idnomina);
  INSERT INTO nomina (nomi_id, NOMI_FECCAUSA, NOMI_PAGOGLOBAL, NOMI_PERIODOCIDAD, NOMI_PERIODO, NOMI_ANO, NOMI_LIQOK)
  VALUES (:IDNOMINA, :fec,:pagoglobal, :periodicidad, :periodo, :ano, 'N');
  item = 1;
 END
 ELSE
 BEGIN
  SELECT MAX(N.noco_item) FROM NOMINA_CONCEPTOS N WHERE N.nomi_id = :idnomina
  INTO :item;
 END
 if ((confirmado = 'S') AND (idnomina IS NOT NULL)) then
 BEGIN
  idnomina = 0;
 END
 else
 begin
 IF (DEPTO = 0) THEN
  INSERT INTO NOMINA_DEPARTAMENTO (nomi_id, nodp_depto)VALUES(:IDNOMINA,0);
 ELSE
  INSERT INTO NOMINA_DEPARTAMENTO (nomi_id, nodp_depto)VALUES(:IDNOMINA,:DEPTO);
 ITEMINI = ITEM;
 FOR SELECT E.TERC_NIT, E.empl_salario, e.empl_eps, e.empl_afc, e.empl_afp, e.empl_ccf, e.empl_dpto
 FROM EMPLEADOS E
 WHERE E.empl_ppago = :periodicidad AND ((E.empl_fecret IS NULL) OR (E.empl_fecret > :fec)) AND E.empl_fecing <= :fec
 INTO :nite, :basico, :niteps, :nitafc, :nitafp, :nitccf, :deptoempl
 DO
 BEGIN
 IF ((depto = 0) OR (deptoempl = :depto)) THEN
 BEGIN
  FOR SELECT CE.TERC_NIT, CE.CONC_COD, CE.EMCO_MONTO, CE.EMCO_PORC, ce.empl_entidad, CE.emco_perprom, CE.emco_luquidaper, CE.emco_mensual, CN.CONC_COD, CN.CONC_DEDUC,CN.CONC_PORC, CN.CONC_ENTIDAD, CN.CONC_MONTO,  CN.CONC_DIAS, CN.CONC_MODIFI,
  CN.CONC_PROMEDIO, CN.conc_salario, CE.emco_perprom, CN.conc_prov, CN.conc_aporte, CN.conc_aplicaprom, cn.conc_otroconc, cn.conc_codotroconc, CN.conc_gtoempr, CN.conc_base, CE.emco_tomsal
  FROM empleado_conceptos CE, CONCEPTOS_NOMINA CN WHERE ((CE.terc_nit = :nite) AND (CE.CONC_COD = CN.CONC_COD) AND (CE.emco_fecini <= :fec AND CE.emco_fecfin >= :FEC) ) OR ((CE.terc_nit = :nite)
  AND (CE.CONC_COD = CN.CONC_COD) AND (cn.conc_todosper = 'N') AND (CE.emco_ppago = :periodo)) OR  ((CE.terc_nit = :nite) AND (CE.CONC_COD = CN.CONC_COD) AND cn.conc_todosper = 'S')  ORDER BY (TERC_NIT )
  INTO :nit_tercero, :concept,  :montos, :porcen, :entidad, :numeroprom, :liquidaper, :mensual ,:CONC_COD, :CONC_DEDUC, :CONC_PORC,
  :CONC_ENTIDAD, :CONC_MONTO, :CONC_DIAS, :CONC_MODIFI,:CONC_PROMEDIO, :salario,:EMCO_PERPROM, :conc_prov, :conc_aporte , :CONC_APLICAPROM, :conc_otroconc, :conc_codotroconc, :gtoempr, :base, :tomasal
  DO
  BEGIN
   IF (conc_dias = 'S') THEN
   EXECUTE PROCEDURE DIAS_LABORADOS (:nite, :periodo, :fec, :mensual,:conc_aporte) RETURNING_VALUES (:diaslab);
   ELSE
   BEGIN
    diaslab = 15;
    IF (mensual = 'S') THEN
    BEGIN
     IF (periodicidad = 2) THEN
     diaslab = 30;
     ELSE
     IF (liquidaper = 3) THEN
     diaslab = 30;
    END
   END
   IF (:tomasal <> 0) THEN
   BEGIN
    IF ((:periodicidad = 2) AND (:tomasal <> 2)) THEN
    BEGIN
     IF ((periodo = 2) OR (periodo = 4) OR (periodo = 6) OR (periodo = 8) OR (periodo = 10) OR (periodo = 12)
     OR (periodo = 14) OR (periodo = 16) OR (periodo = 18) OR (periodo = 20) OR (periodo = 22) OR (periodo = 24)) THEN
     basico = 0;
    END
    ELSE
    IF ((:periodicidad = 3) AND (:tomasal <> 1)) THEN
    BEGIN
     IF ((periodo = 1) OR (periodo = 5) OR (periodo = 9) OR (periodo = 13) OR (periodo = 17) OR (periodo = 21)
     OR (periodo = 25) OR (periodo = 29) OR (periodo = 33) OR (periodo = 37) OR (periodo = 41) OR (periodo = 45)
     OR (periodo = 49)) THEN
     basico = 0;
    END
    ELSE
     IF ((:periodicidad = 3) AND (:tomasal <> 2)) THEN
     BEGIN
      IF ((periodo = 2) OR (periodo = 6) OR (periodo = 10) OR (periodo = 14) OR (periodo = 18) OR (periodo = 22)
      OR (periodo = 26) OR (periodo = 30) OR (periodo = 34) OR (periodo = 38) OR (periodo = 42) OR (periodo = 46)
      OR (periodo = 50)) THEN
      basico = 0;
     END
     ELSE
     IF ((:periodicidad = 3) AND (:tomasal <> 3)) THEN
     BEGIN
      IF ((periodo = 3) OR (periodo = 7) OR (periodo = 11) OR (periodo = 15) OR (periodo = 19) OR (periodo = 23)
      OR (periodo = 27) OR (periodo = 31) OR (periodo = 35) OR (periodo = 39) OR (periodo = 43) OR (periodo = 47)
      OR (periodo = 51)) THEN
      basico = 0;
     END
     ELSE
     IF ((:periodicidad = 3) AND (:tomasal <> 4)) THEN
     BEGIN
      IF ((periodo = 4) OR (periodo = 8) OR (periodo = 12) OR (periodo = 16) OR (periodo = 20) OR (periodo = 24)
      OR (periodo = 29) OR (periodo = 32) OR (periodo = 36) OR (periodo = 40) OR (periodo = 44) OR (periodo = 48)
      OR (periodo = 52)) THEN
      basico = 0;
     END
   END
   ELSE
    BEGIN
     SELECT E.empl_salario FROM EMPLEADOS E WHERE E.terc_nit = :nite INTO :basico;
    END
    SELECT ((n.nono_valor /30) * n.nono_dura), (n.nono_dura) FROM nomina_novedades n WHERE n.tnov_cod = 11 AND n.terc_nit = :nite AND n.nono_periodo = :periodo INTO :cambsaltrans, :duranov;
    IF (cambsaltrans IS NULL) THEN
    cambsaltrans = 0;
    IF (duranov IS NULL) THEN
    duranov = 0;
    diaslab = :diaslab - :duranov;
    IF (conc_cod = 922) THEN
    BEGIN
     SELECT SUM(P.prcu_monto) FROM prestamo_cuotas P, prestamo_nomina PN WHERE P.prcu_ano = :ano AND P.prcu_periodo = :periodo AND PN.prno_id = P.prno_id AND PN.terc_nit = :nite INTO :valor;
     IF (valor IS NULL) THEN
     valor = 0;
     item = :item + 1;
     UPDATE prestamo_cuotas  P SET prcu_ok = 'S' WHERE P.prcu_ano = :ano AND P.prcu_periodo = :periodo AND P.prno_id = (SELECT PN.prno_id FROM PRESTAMO_NOMINA PN WHERE PN.terc_nit = :nite);
    END
    ELSE
    IF ((:montos = 0) OR (:montos IS NULL)) THEN
    BEGIN
     IF ((CONC_PORC = 0 AND :porcen = 0) OR (CONC_PORC IS NULL AND :porcen = 0) OR (CONC_PORC = 0 AND :porcen IS NULL) OR (CONC_PORC IS NULL AND :porcen IS NULL) ) THEN
     BEGIN
      IF ((conc_monto <> 0) AND (conc_monto IS NOT NULL) ) THEN
      BEGIN
       VALOR = :CONC_MONTO;
       IF (:conc_dias = 'S') THEN
       valor = (:valor / 30) * :diaslab;
      END
      ELSE
      IF (salario = 'S' AND CONC_COD <> 900 AND CONC_COD <> 920 and conc_cod <> 932 AND CONC_COD <> 953) THEN
      BEGIN
       SELECT E.empl_salario FROM EMPLEADOS E WHERE E.terc_nit = :nite INTO :basico;
       SELECT N.noex_recnoct, N.noex_recfest
       FROM NOMINA_HORASEXT N WHERE N.noex_periodio = :periodo AND N.noex_ano = :ano AND N.terc_nit = :nite
       INTO :recnoct, :recfest;
       if (recnoct is null) then
        recnoct = 0;
       if (recfest is null) then
        recfest = 0;
       SELECT P.paan_recnoc, P.paan_recfest FROM PARAMETROS_ANO P WHERE P.paan_ano = :ano INTO :tar_recnotc, :tar_recfest;
       basico = ((:basico/30)*:diaslab) - (((:basico/30)/8)*:recnoct);
       basico = :basico - (((:basico/30)/8)*:recfest);
       conc_monto = :basico;
       VALOR = (:conc_monto/*/30 * :diaslab*/ ) + :cambsaltrans;
      END
      ELSE
      BEGIN
       valor = montos;
       IF (:conc_dias = 'S') THEN
       valor = (:valor / 30) * :diaslab;
      END
     END
     ELSE
     BEGIN
      IF (:porcen <> 0) THEN
      BEGIN
       IF ((conc_monto <> 0) AND (conc_monto IS NOT NULL) ) THEN
       BEGIN
        VALOR = ((:CONC_MONTO ) * :PORCEN) /100;
       END
      END
      ELSE
      BEGIN
       IF ((conc_monto <> 0) AND (conc_monto IS NOT NULL) ) THEN
       BEGIN
        VALOR = ((:CONC_MONTO) * :conc_porc) /100;
       END
       ELSE
       IF (salario = 'S' AND CONC_COD <> 900 AND CONC_COD <> 920 and conc_cod <> 932 AND CONC_COD <> 953) THEN
       BEGIN
       SELECT E.empl_salario FROM EMPLEADOS E WHERE E.terc_nit = :nite INTO :basico;
       SELECT N.noex_recnoct, N.noex_recfest
       FROM NOMINA_HORASEXT N WHERE N.noex_periodio = :periodo AND N.noex_ano = :ano AND N.terc_nit = :nite
       INTO :recnoct, :recfest;
       if (recnoct is null) then
        recnoct = 0;
       if (recfest is null) then
        recfest = 0;
       SELECT P.paan_recnoc, P.paan_recfest FROM PARAMETROS_ANO P WHERE P.paan_ano = :ano INTO :tar_recnotc, :tar_recfest;
       basico = ((:basico/30)*:diaslab) - (((:basico/30)/8)*:recnoct);
       basico = :basico - (((:basico/30)/8)*:recfest);
        conc_monto = :basico;
        VALOR = ((:CONC_MONTO)+ :cambsaltrans * :conc_porc) /100;
       END
       ELSE
       IF (:conc_monto = 0 AND :montos = 0) THEN
       BEGIN
        conc_monto = :basico;
        VALOR = (((:CONC_MONTO / 30) * :diaslab) + :cambsaltrans * :conc_porc) /100;
       END
      END
     END
    END
    ELSE
    IF ((CONC_PORC = 0 OR (conc_porc IS NULL)) AND (:porcen = 0 OR (porcen IS NULL))) THEN
    BEGIN
     VALOR = (:montos);
     IF (:conc_dias = 'S') THEN
     valor = (:valor / 30) * :diaslab;
    END
    ELSE
    IF (:porcen <> 0 AND porcen IS NOT NULL) THEN
    BEGIN
     VALOR = ((:MONTOS ) * :PORCEN) /100;
    END
    ELSE
    BEGIN
     VALOR = ((:montos) * :CONC_PORC) /100;
    END
    IF (conc_promedio = 'S') THEN
    BEGIN
     perinicial = :periodo - (:numeroprom) + 1;
     anoprom = CAST (ano AS INTEGER);
     IF (perinicial <= 0) THEN
     BEGIN
      perinicial = 1;
      anoprom = CAST(ANO AS INTEGER) - 1;
     END
     SELECT SUM (noco_valor) FROM nomina_conceptos n WHERE n.noco_aplicaprom = 'S' AND N.noco_periodo >= :perinicial - 1 AND N.noco_periodo < :periodo AND N.noco_ano >= :anoprom AND N.noco_ano <= :ano AND terc_nit = :nite INTO :valor;
     valor = ((valor ) / (numeroprom -1 ));
     SELECT NOCO_VALOR FROM NOMINA_CONCEPTOS WHERE CONC_COD = :conc_cod AND TERC_NIT  = :nite AND NOCO_PAGOOK = 'N' AND NOCO_PERIODO = 0 INTO :saldosini;
     IF (saldosini IS NULL) THEN
     saldosini = 0;
     ELSE
     UPDATE nomina_conceptos N SET noco_pagook = 'S' WHERE n.noco_aplicaprom = 'S' AND N.noco_periodo >= :perinicial - 1 AND N.noco_periodo < :periodo AND N.noco_ano >= :anoprom AND N.noco_ano <= :ano  AND CONC_COD = :conc_cod AND terc_nit = :nite AND NOCO_PERIODO = 0;
     VALOR = :valor + :saldosini;
     UPDATE nomina_conceptos N SET noco_pagook = 'S' WHERE n.noco_aplicaprom = 'S' AND N.noco_periodo >= :perinicial - 1 AND N.noco_periodo < :periodo AND N.noco_ano >= :anoprom AND N.noco_ano <= :ano  AND CONC_COD = :conc_cod AND terc_nit = :nite;
    END
    ELSE
    IF (conc_otroconc = 'S') THEN
    BEGIN
     anosum = CAST(ano AS INTEGER);
     anosum = anosum - 1;
     SELECT SUM (noco_valor) FROM nomina_conceptos n WHERE n.noco_ano = :anosum AND n.conc_cod = :conc_codotroconc AND N.terc_nit = :nite INTO :valor;
     SELECT NOCO_VALOR FROM NOMINA_CONCEPTOS WHERE noco_ano = :anosum AND conc_cod = :conc_codotroconc AND terc_nit = :nite AND NOCO_PERIODO = 0 INTO :saldosini;
     IF (saldosini IS NULL) THEN
     saldosini = 0;
     ELSE
     UPDATE nomina_conceptos SET noco_pagook = 'S' WHERE noco_ano = :anosum AND conc_cod = :conc_codotroconc AND NOCO_PERIODO = 0 AND terc_nit = :nite;
     VALOR = :valor + :saldosini;
     UPDATE nomina_conceptos SET noco_pagook = 'S' WHERE noco_ano = :anosum AND conc_cod = :conc_codotroconc AND terc_nit = :nite;
    END
    ELSE
    IF (conc_aporte = 'S') THEN
    BEGIN
     horasex = NULL;
     diasnov = NULL;
     retroact = NULL;
     reembolso = NULL;
     beneficios = null;
     recargo = null;
     IF ((:entidad = '' ) OR (entidad IS NULL)) THEN
     BEGIN
      /*COMISIONES*/
      SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
      IF (comision IS NULL) THEN
      comision = 0;
      /*RETROACTIVO*/
      SELECT C.emco_monto FROM EMPLEADO_CONCEPTOS C WHERE C.terc_nit = :nite AND C.conc_cod = 933 INTO :retroact;
      IF (retroact IS NULL ) THEN
      retroact = 0;
      /*REEMBOLSO*/
      SELECT C.emco_monto FROM EMPLEADO_CONCEPTOS C WHERE C.terc_nit = :nite AND C.conc_cod = 952 INTO :reembolso;
      IF (reembolso IS NULL ) THEN
      reembolso = 0;
      /*INCAPACIDAD*/
      SELECT N.nono_dura FROM NOMINA_NOVEDADES N WHERE N.terc_nit = :nite AND N.nono_periodo = :periodo AND N.nono_ano = :ano AND (N.tnov_cod = 2 OR (N.tnov_cod = 3)) INTO :diasnov;
      IF (:diasnov IS NULL) THEN
      incap = 0;
      ELSE
      incap = (:basico / 30)* :diasnov;
      /*BASICO*/
      SELECT N.noex_recnoct, N.noex_recfest
      FROM NOMINA_HORASEXT N WHERE N.noex_periodio = :periodo AND N.noex_ano = :ano AND N.terc_nit = :nite
      INTO :recnoct, :recfest;
      if (recnoct is null) then
       recnoct = 0;
      if (recfest is null) then
       recfest = 0;
      SELECT P.paan_recnoc, P.paan_recfest FROM PARAMETROS_ANO P WHERE P.paan_ano = :ano INTO :tar_recnotc, :tar_recfest;
      basico = ((:basico/30)*:diaslab) - (((:basico/30)/8)*:recnoct);
      basico = :basico - (((:basico/30)/8)*:recfest);
      /*HORAS EXTRA*/
      SELECT c.noex_monto FROM nomina_horasext c WHERE c.noex_ano = :ano AND c.noex_periodio = :periodo AND c.noex_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :horasex;
      if (horasex is null) then
       horasex = 0;
      /*RECARGOS*/
      SELECT E.empl_salario FROM EMPLEADOS E WHERE E.terc_nit = :nite INTO :basicorec;
      SELECT N.noex_recnoct, N.noex_recfest
      FROM NOMINA_HORASEXT N WHERE N.noex_periodio = :periodo AND N.noex_ano = :ano AND N.terc_nit = :nite
      INTO :recnoct, :recfest;
      if (recnoct is null) then
       recnoct = 0;
      if (recfest is null) then
       recfest = 0;
      SELECT P.paan_recnoc, P.paan_recfest FROM PARAMETROS_ANO P WHERE P.paan_ano = :ano INTO :tar_recnotc, :tar_recfest;
      recargo = (((:basicorec/30)/8)*:tar_recnotc)*:recnoct;
      recargo = :recargo + ((((:basicorec/30)/8)*:tar_recfest)*:recfest);
      /*basico*/
      if (:basico + :comision + :horasex + :retroact+ :reembolso + :incap+ :cambsaltrans < ((:smlv/30)*:diaslab)) then
      comision = :smlv + :comision;
      /*SMLV Y AUX. TRANSPORTE*/
      SELECT P.paan_auxtr, P.paan_salminimo FROM PARAMETROS_ANO P WHERE P.paan_ano = :ano INTO :auxtrans, :smlv;
      /*BASE*/
      valor = :basico + :comision + :horasex + :retroact+ :reembolso + :incap + :recargo + :cambsaltrans;
      IF ((conc_cod = 904) OR (conc_cod = 905) OR (conc_cod = 906) or (conc_cod = 934) ) THEN
      BEGIN
       entidad = :nitafp;
       IF (conc_cod = 904) THEN
       BEGIN
        SELECT A.paan_afptr FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
        VALOR = ((:valor) * :PORCEN) /100;
       END
       ELSE
       IF ((conc_cod = 905) OR (conc_cod = 906) or (conc_cod = 934)) THEN
       BEGIN
        SELECT A.paan_afpem FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
        VALOR = ((:valor) * :PORCEN) /100;
       END
      END
      ELSE
      IF ((conc_cod = 907) OR (conc_cod = 914) OR (conc_cod = 915) or (conc_cod = 938) ) THEN
      BEGIN
       entidad = :niteps;
       IF (conc_cod = 907) THEN
       BEGIN
        SELECT A.paan_epstr FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
        VALOR = ((:valor) * :PORCEN) /100;
       END
       ELSE
       IF ((conc_cod = 914) OR (conc_cod = 915) or (conc_cod = 938)) THEN
       BEGIN
        SELECT A.paan_epsem FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
        VALOR = ((:valor) * :PORCEN) /100;
       END
      END
      ELSE
      IF ((conc_cod = 910) OR (conc_cod = 911) OR (conc_cod = 916) OR (conc_cod = 917) OR (conc_cod = 918) OR (conc_cod = 919) or (conc_cod = 936) or (conc_cod = 939) or (conc_cod = 940)) THEN
      BEGIN
       entidad = :nitccf;
       IF ((conc_cod = 910) OR (conc_cod = 911) or (conc_cod = 936)) THEN
       BEGIN
        SELECT A.paan_ccf FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
        VALOR = ((:valor) * :PORCEN) /100;
       END
       ELSE
       IF ((conc_cod = 916) OR (conc_cod = 917) or (conc_cod = 939)) THEN
       BEGIN
        SELECT A.paan_icbf FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
        VALOR = ((:valor) * :PORCEN) /100;
       END
       ELSE
       IF ((conc_cod = 918) OR (conc_cod = 919) or (conc_cod = 940)) THEN
       BEGIN
        SELECT A.paan_sena FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
        VALOR = ((:valor) * :PORCEN) /100;
       END
      END
      ELSE
      IF ((conc_cod = 912) OR (conc_cod = 913)) THEN
      BEGIN
       entidad = :nitafc;
      SELECT SUM(ce.emco_monto)
      FROM empleado_conceptos CE, CONCEPTOS_NOMINA CN WHERE ((CE.terc_nit = :nite) AND (CE.CONC_COD = CN.CONC_COD) AND (CE.emco_fecini <= :fec AND CE.emco_fecfin >= :FEC) ) OR ((CE.terc_nit = :nite)
      AND (CE.CONC_COD = CN.CONC_COD) AND (cn.conc_todosper = 'N') AND (CE.emco_ppago = :periodo)) OR  ((CE.terc_nit = :nite) AND (CE.CONC_COD = CN.CONC_COD) AND cn.conc_todosper = 'S') AND CN.conc_benefic = 'S'
      INTO :beneficios;
      if (beneficios is null) then
       beneficios = 0;
      SELECT P.paan_auxtr, P.paan_salminimo FROM PARAMETROS_ANO P WHERE P.paan_ano = :ano INTO :auxtrans, :smlv;
      if (:basico < (:smlv*2)) then
       auxtrans = (:auxtrans / 30) * :diaslab;
      ELSE
       auxtrans = 0;
       IF ((conc_cod = 912) OR (conc_cod = 913) or (conc_cod = 937)) THEN
       BEGIN
        SELECT A.paan_cesemp FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
        VALOR = ((:valor + :auxtrans + :beneficios) * :PORCEN) /100;
       END
      END
      ELSE
      BEGIN
       IF (comision IS NULL) THEN
       comision = 0;
       SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
       conc_monto = :basico + :comision;
       IF (conc_porc <> 0 AND conc_porc IS NOT NULL) THEN
       VALOR = (((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans + :incap) * :conc_porc) /100;
       ELSE
       IF (:porcen <> 0 AND :porcen IS NOT NULL) THEN
       VALOR = (((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans + :incap) * :porcen) /100;
       ELSE
       IF (:montos <> 0 AND :montos IS NOT NULL) THEN
       valor = :montos;
       ELSE
       IF (:conc_monto <> 0 AND :conc_monto IS NOT NULL) THEN
       valor = :conc_monto;
      END
     END
     item = :item + 1;
    END
    ELSE
    IF (conc_prov = 'S') THEN
    BEGIN
     /*RECARGO*/
     SELECT E.empl_salario FROM EMPLEADOS E WHERE E.terc_nit = :nite INTO :basico;
     SELECT N.noex_recnoct, N.noex_recfest
     FROM NOMINA_HORASEXT N WHERE N.noex_periodio = :periodo AND N.noex_ano = :ano AND N.terc_nit = :nite
     INTO :recnoct, :recfest;
     if (recnoct is null) then
      recnoct = 0;
     if (recfest is null) then
      recfest = 0;
     SELECT P.paan_recnoc, P.paan_recfest FROM PARAMETROS_ANO P WHERE P.paan_ano = :ano INTO :tar_recnotc, :tar_recfest;
     recargo = (((:basico/30)/8)*:tar_recnotc)*:recnoct;
     recargo = :recargo + ((((:basico/30)/8)*:tar_recfest)*:recfest);
     /*BASICO*/
     SELECT N.noex_recnoct, N.noex_recfest
     FROM NOMINA_HORASEXT N WHERE N.noex_periodio = :periodo AND N.noex_ano = :ano AND N.terc_nit = :nite
     INTO :recnoct, :recfest;
     if (recnoct is null) then
      recnoct = 0;
     if (recfest is null) then
      recfest = 0;
     SELECT P.paan_recnoc, P.paan_recfest FROM PARAMETROS_ANO P WHERE P.paan_ano = :ano INTO :tar_recnotc, :tar_recfest;
     basico = ((:basico/30)*:diaslab) - (((:basico/30)/8)*:recnoct);
     basico = :basico - (((:basico/30)/8)*:recfest);
     /*BENEFICIOS*/
     SELECT SUM(ce.emco_monto)
     FROM empleado_conceptos CE, CONCEPTOS_NOMINA CN WHERE ((CE.terc_nit = :nite) AND (CE.CONC_COD = CN.CONC_COD) AND (CE.emco_fecini <= :fec AND CE.emco_fecfin >= :FEC) ) OR ((CE.terc_nit = :nite)
     AND (CE.CONC_COD = CN.CONC_COD) AND (cn.conc_todosper = 'N') AND (CE.emco_ppago = :periodo)) OR  ((CE.terc_nit = :nite) AND (CE.CONC_COD = CN.CONC_COD) AND cn.conc_todosper = 'S') AND CN.conc_benefic = 'S'
     INTO :beneficios;
     if (beneficios is null) then
      beneficios = 0;
     if ((conc_cod <> 929) and (conc_cod <> 930)) then
     begin
        SELECT P.paan_auxtr, P.paan_salminimo FROM PARAMETROS_ANO P WHERE P.paan_ano = :ano INTO :auxtrans, :smlv;
        if (:basico < (:smlv*2)) then
           auxtrans = (:auxtrans / 30) * :diaslab;
        ELSE
           auxtrans = 0;
     end
     else
      auxtrans = 0;
     conc_monto = :basico;
     IF (conc_porc <> 0 AND conc_porc IS NOT NULL) THEN
     VALOR = (((:CONC_MONTO)+ :cambsaltrans + :incap + :recargo + :auxtrans + :beneficios) * :conc_porc) /100;
     ELSE
     IF (porcen <> 0 AND porcen IS NOT NULL) THEN
     VALOR = (((:CONC_MONTO)+ :cambsaltrans + :incap + :recargo + :auxtrans + :beneficios) * :porcen) /100;
     ELSE
     IF (montos <> 0 AND montos IS NOT NULL) THEN
     VALOR = :montos;
     ELSE
     IF (conc_monto <> 0 AND conc_monto IS NOT NULL) THEN
     VALOR = :conc_monto;
     item = :item + 1;
    END
    ELSE
    IF (conc_cod = 920) THEN
    BEGIN
     SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :valor;
     IF (valor IS NULL) THEN
     valor = 0;
     item = :item + 1;
    END
    ELSE
    IF (conc_cod = 900 OR (:conc_cod = 931)) THEN
    BEGIN
     SELECT c.noex_monto FROM nomina_horasext c WHERE c.noex_ano = :ano AND c.noex_periodio = :periodo AND c.noex_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :valor;
     IF (valor IS NULL) THEN
     valor = 0;
     item = :item + 1;
    END
    ELSE
    IF (conc_cod = 932) THEN
    BEGIN
     SELECT N.nono_dura FROM NOMINA_NOVEDADES N WHERE N.terc_nit = :nite AND N.nono_periodo = :periodo AND N.nono_ano = :ano AND (N.tnov_cod = 2 OR (N.tnov_cod = 3)) INTO :diasnov;
     IF (:diasnov IS NULL) THEN
     valor = 0;
     ELSE
     valor = (:basico / 30)* :diasnov;
    END
    ELSE
    IF (conc_cod = 921) THEN
    BEGIN
     IF (porcen IS NOT NULL AND porcen <> 0) THEN
     valor = ((basico / 30)* :diaslab ) * :PORCEN /100;
     ELSE
     IF (conc_porc IS NOT NULL AND conc_porc <> 0) THEN
     valor = ((basico / 30)* :diaslab ) * :conc_porc /100;
    END
    ELSE
    if (conc_cod = 953) then
    BEGIN
       SELECT E.empl_salario FROM EMPLEADOS E WHERE E.terc_nit = :nite INTO :basico;
       SELECT N.noex_recnoct, N.noex_recfest
       FROM NOMINA_HORASEXT N WHERE N.noex_periodio = :periodo AND N.noex_ano = :ano AND N.terc_nit = :nite
       INTO :recnoct, :recfest;
       if (recnoct is null) then
        recnoct = 0;
       if (recfest is null) then
        recfest = 0;
       SELECT P.paan_recnoc, P.paan_recfest FROM PARAMETROS_ANO P WHERE P.paan_ano = :ano INTO :tar_recnotc, :tar_recfest;
       valor = (((:basico/30)/8)*:tar_recnotc)*:recnoct;
       valor = :valor + ((((:basico/30)/8)*:tar_recfest)*:recfest);
    END
    EXECUTE PROCEDURE LEE_CONFIGURACION('NOMINA','GENERAL','REDONDEO AL MULTIPLO DE DIEZ EN TOTALES')RETURNING_VALUES(:aprox);
    EXECUTE PROCEDURE REDONDEE(:valor, :aprox) RETURNING_VALUES (VALOR);
    IF ((mensual = 'N') OR (periodicidad = 1))  THEN
    INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
    VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
    ELSE
    IF (mensual = 'S') THEN
    BEGIN
     IF ((:periodicidad = 2) AND (liquidaper = 1)) THEN
     BEGIN
      IF ((periodo = 1) OR (periodo = 3) OR (periodo = 5) OR (periodo = 7) OR (periodo = 9) OR (periodo = 11)
      OR (periodo = 13) OR (periodo = 15) OR (periodo = 17) OR (periodo = 19) OR (periodo = 21) OR (periodo = 23)) THEN
      INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
      VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
     END
     ELSE
     IF ((:periodicidad = 2) AND (liquidaper = 2)) THEN
     BEGIN
      IF ((periodo = 2) OR (periodo = 4) OR (periodo = 6) OR (periodo = 8) OR (periodo = 10) OR (periodo = 12)
      OR (periodo = 14) OR (periodo = 16) OR (periodo = 18) OR (periodo = 20) OR (periodo = 22) OR (periodo = 24)) THEN
      INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
      VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
     END
     ELSE
     IF ((:periodicidad = 3) AND (liquidaper = 1)) THEN
     BEGIN
      IF ((periodo = 1) OR (periodo = 5) OR (periodo = 9) OR (periodo = 13) OR (periodo = 17) OR (periodo = 21)
      OR (periodo = 25) OR (periodo = 29) OR (periodo = 33) OR (periodo = 37) OR (periodo = 41) OR (periodo = 45)
      OR (periodo = 49)) THEN
      INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
      VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
    END
    ELSE
     IF ((:periodicidad = 3) AND (liquidaper = 2)) THEN
     BEGIN
      IF ((periodo = 2) OR (periodo = 6) OR (periodo = 10) OR (periodo = 14) OR (periodo = 18) OR (periodo = 22)
      OR (periodo = 26) OR (periodo = 30) OR (periodo = 34) OR (periodo = 38) OR (periodo = 42) OR (periodo = 46)
      OR (periodo = 50)) THEN
      INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
      VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
     END
     ELSE
     IF ((:periodicidad = 3) AND (liquidaper = 3)) THEN
     BEGIN
      IF ((periodo = 3) OR (periodo = 7) OR (periodo = 11) OR (periodo = 15) OR (periodo = 19) OR (periodo = 23)
      OR (periodo = 27) OR (periodo = 31) OR (periodo = 35) OR (periodo = 39) OR (periodo = 43) OR (periodo = 47)
      OR (periodo = 51)) THEN
      INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
      VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
     END
     ELSE
     IF ((:periodicidad = 3) AND (liquidaper = 4)) THEN
     BEGIN
      IF ((periodo = 4) OR (periodo = 8) OR (periodo = 12) OR (periodo = 16) OR (periodo = 20) OR (periodo = 24)
      OR (periodo = 29) OR (periodo = 32) OR (periodo = 36) OR (periodo = 40) OR (periodo = 44) OR (periodo = 48)
      OR (periodo = 52)) THEN
      INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
      VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
     END
    END
  VALOR = 0;
  basico = 0;
  END
 END
 END
 END
 SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER PROCEDURE DIAS_LABORADOS (
    nitempl varchar(20),
    periodo integer,
    fec date,
    mensual char(1),
    aporte char(1))
returns (
    totaldiaslab integer)
as
declare variable diasnolab integer;
declare variable diaslabxper integer;
declare variable perpago integer;
declare variable fecing date;
declare variable diasfec integer;
declare variable diasing integer;
declare variable existe char(1);
BEGIN
SELECT E.empl_ppago, E.empl_fecing
FROM EMPLEADOS E WHERE TERC_NIT = :nitempl
INTO :perpago, :fecing;
IF (mensual = 'N') THEN
BEGIN
IF (perpago = 1) THEN
diaslabxper = 30;
ELSE
IF (perpago = 2) THEN
diaslabxper = 15;
ELSE
IF (perpago = 3) THEN
diaslabxper = 7;
END
ELSE
diaslabxper = 30;
if (perpago = 2) then
BEGIN
IF (SUBSTR(fecing,1,7) = SUBSTR(FEC,1,7)) THEN
BEGIN
diasfec = CAST(substr(fec,9,10) AS INTEGER);
diasing = CAST(substr(fecing,9,10) AS INTEGER);
diaslabxper = (diasfec - diasing)+1;
IF ((diaslabxper > 15) AND (perpago = 2)) THEN
diaslabxper = 15;
END
END
ELSE
if (perpago = 1) then
BEGIN
IF (SUBSTR(fecing,1,7) = SUBSTR(FEC,1,7)) THEN
BEGIN
diasfec = CAST(substr(fec,9,10) AS INTEGER);
diasing = CAST(substr(fecing,9,10) AS INTEGER);
diaslabxper = (diasfec - diasing)+1;
IF ((diaslabxper > 30) AND (perpago = 1)) THEN
diaslabxper = 30;
END
END
SELECT 'S' FROM nomina_novedades WHERE TERC_NIT = :nitempl AND (TNOV_COD = 9 or (tnov_cod = 2) or (tnov_cod = 3) or (tnov_cod = 6)) AND NONO_PERIODO = :periodo
INTO :existe;
IF ((aporte = 'N' ) OR (:existe = 'S'))  THEN
BEGIN
SELECT SUM (NONO_DURA)
FROM nomina_novedades WHERE TERC_NIT = :nitempl AND (TNOV_COD = 9 OR (TNOV_COD = 6) OR (TNOV_COD = 2) OR (TNOV_COD =3) OR (TNOV_COD = 4)  ) AND NONO_PERIODO = :periodo
INTO :diasnolab;
if (diasnolab IS NULL) then
diasnolab = 0;
diaslabxper =  :diaslabxper - :diasnolab;
END
if (diaslabxper IS NOT NULL) then
totaldiaslab =  :diaslabxper;
ELSE
totaldiaslab = 0;
SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER PROCEDURE CAUSA_NOMINA (
    fec date,
    periodo integer,
    periodicidad integer,
    pagoglobal char(1),
    ano char(4),
    depto integer)
returns (
    idnomina integer,
    itemini integer)
as
declare variable item integer;
declare variable nite varchar(20) character set none;
declare variable nit_tercero varchar(20);
declare variable concept integer;
declare variable montos numeric(18,2);
declare variable porcen numeric(9,4);
declare variable entidad varchar(20);
declare variable conc_cod integer;
declare variable conc_deduc char(1);
declare variable conc_porc numeric(9,4);
declare variable conc_entidad integer;
declare variable conc_monto numeric(18,2);
declare variable conc_modifi char(1);
declare variable conc_promedio char(1);
declare variable emco_perprom integer;
declare variable valor numeric(18,2);
declare variable diaslab integer;
declare variable conc_prov char(1);
declare variable conc_aporte char(1);
declare variable numeroprom integer;
declare variable conc_aplicaprom char(1);
declare variable perinicial integer;
declare variable anoprom integer;
declare variable conc_dias char(1);
declare variable conc_otroconc char(1);
declare variable conc_codotroconc integer;
declare variable anosum integer;
declare variable salario char(1) character set none;
declare variable liquidaper integer;
declare variable rmod numeric(2,2);
declare variable basico numeric(18,2);
declare variable niteps varchar(20);
declare variable nitafc varchar(20);
declare variable nitafp varchar(20);
declare variable nitccf varchar(20);
declare variable gtoempr char(1);
declare variable comision numeric(18,2);
declare variable cambsaltrans numeric(18,2);
declare variable saldosini numeric(18,2);
declare variable duranov integer;
declare variable base numeric(18,2);
declare variable aprox integer;
declare variable mensual char(1);
declare variable horasex numeric(18,2);
declare variable diasnov integer;
declare variable tomasal integer;
declare variable retroact numeric(18,2);
declare variable reembolso numeric(18,2);
declare variable incap numeric(18,2);
declare variable deptoempl integer;
declare variable auxtrans numeric(18,2);
declare variable smlv numeric(18,2);
declare variable beneficios numeric(18,2);
declare variable confirmado char(1);
declare variable recnoct numeric(18,2);
declare variable recfest numeric(18,2);
declare variable tar_recnotc numeric(9,4);
declare variable tar_recfest numeric(9,4);
declare variable recargo numeric(18,2);
declare variable basicorec numeric(18,2);
BEGIN
 SELECT N.NOMI_ID, N.nomi_liqok FROM NOMINA N WHERE N.nomi_periodo = :periodo AND N.nomi_periodocidad = :periodicidad AND N.nomi_ano = :ano
 INTO :IDNOMINA, :CONFIRMADO;
 IF (:idnomina IS NULL) THEN
 BEGIN
  EXECUTE PROCEDURE cambie_id_nomina RETURNING_VALUES(:idnomina);
  INSERT INTO nomina (nomi_id, NOMI_FECCAUSA, NOMI_PAGOGLOBAL, NOMI_PERIODOCIDAD, NOMI_PERIODO, NOMI_ANO, NOMI_LIQOK)
  VALUES (:IDNOMINA, :fec,:pagoglobal, :periodicidad, :periodo, :ano, 'N');
  item = 1;
 END
 ELSE
 BEGIN
  SELECT MAX(N.noco_item) FROM NOMINA_CONCEPTOS N WHERE N.nomi_id = :idnomina
  INTO :item;
 END
 if ((confirmado = 'S') AND (idnomina IS NOT NULL)) then
 BEGIN
  idnomina = 0;
 END
 else
 begin
 IF (DEPTO = 0) THEN
  INSERT INTO NOMINA_DEPARTAMENTO (nomi_id, nodp_depto)VALUES(:IDNOMINA,0);
 ELSE
  INSERT INTO NOMINA_DEPARTAMENTO (nomi_id, nodp_depto)VALUES(:IDNOMINA,:DEPTO);
 ITEMINI = ITEM;
 FOR SELECT E.TERC_NIT, E.empl_salario, e.empl_eps, e.empl_afc, e.empl_afp, e.empl_ccf, e.empl_dpto
 FROM EMPLEADOS E
 WHERE E.empl_ppago = :periodicidad AND ((E.empl_fecret IS NULL) OR (E.empl_fecret > :fec)) AND E.empl_fecing <= :fec
 INTO :nite, :basico, :niteps, :nitafc, :nitafp, :nitccf, :deptoempl
 DO
 BEGIN
 IF ((depto = 0) OR (deptoempl = :depto)) THEN
 BEGIN
  FOR SELECT CE.TERC_NIT, CE.CONC_COD, CE.EMCO_MONTO, CE.EMCO_PORC, ce.empl_entidad, CE.emco_perprom, CE.emco_luquidaper, CE.emco_mensual, CN.CONC_COD, CN.CONC_DEDUC,CN.CONC_PORC, CN.CONC_ENTIDAD, CN.CONC_MONTO,  CN.CONC_DIAS, CN.CONC_MODIFI,
  CN.CONC_PROMEDIO, CN.conc_salario, CE.emco_perprom, CN.conc_prov, CN.conc_aporte, CN.conc_aplicaprom, cn.conc_otroconc, cn.conc_codotroconc, CN.conc_gtoempr, CN.conc_base, CE.emco_tomsal
  FROM empleado_conceptos CE, CONCEPTOS_NOMINA CN WHERE ((CE.terc_nit = :nite) AND (CE.CONC_COD = CN.CONC_COD) AND (CE.emco_fecini <= :fec AND CE.emco_fecfin >= :FEC) ) OR ((CE.terc_nit = :nite)
  AND (CE.CONC_COD = CN.CONC_COD) AND (cn.conc_todosper = 'N') AND (CE.emco_ppago = :periodo)) OR  ((CE.terc_nit = :nite) AND (CE.CONC_COD = CN.CONC_COD) AND cn.conc_todosper = 'S')  ORDER BY (TERC_NIT )
  INTO :nit_tercero, :concept,  :montos, :porcen, :entidad, :numeroprom, :liquidaper, :mensual ,:CONC_COD, :CONC_DEDUC, :CONC_PORC,
  :CONC_ENTIDAD, :CONC_MONTO, :CONC_DIAS, :CONC_MODIFI,:CONC_PROMEDIO, :salario,:EMCO_PERPROM, :conc_prov, :conc_aporte , :CONC_APLICAPROM, :conc_otroconc, :conc_codotroconc, :gtoempr, :base, :tomasal
  DO
  BEGIN
   IF (conc_dias = 'S') THEN
   EXECUTE PROCEDURE DIAS_LABORADOS (:nite, :periodo, :fec, :mensual,:conc_aporte) RETURNING_VALUES (:diaslab);
   ELSE
   BEGIN
    diaslab = 15;
    IF (mensual = 'S') THEN
    BEGIN
     IF (periodicidad = 2) THEN
     diaslab = 30;
     ELSE
     IF (liquidaper = 3) THEN
     diaslab = 30;
    END
   END
   IF (:tomasal <> 0) THEN
   BEGIN
    IF ((:periodicidad = 2) AND (:tomasal <> 2)) THEN
    BEGIN
     IF ((periodo = 2) OR (periodo = 4) OR (periodo = 6) OR (periodo = 8) OR (periodo = 10) OR (periodo = 12)
     OR (periodo = 14) OR (periodo = 16) OR (periodo = 18) OR (periodo = 20) OR (periodo = 22) OR (periodo = 24)) THEN
     basico = 0;
    END
    ELSE
    IF ((:periodicidad = 3) AND (:tomasal <> 1)) THEN
    BEGIN
     IF ((periodo = 1) OR (periodo = 5) OR (periodo = 9) OR (periodo = 13) OR (periodo = 17) OR (periodo = 21)
     OR (periodo = 25) OR (periodo = 29) OR (periodo = 33) OR (periodo = 37) OR (periodo = 41) OR (periodo = 45)
     OR (periodo = 49)) THEN
     basico = 0;
    END
    ELSE
     IF ((:periodicidad = 3) AND (:tomasal <> 2)) THEN
     BEGIN
      IF ((periodo = 2) OR (periodo = 6) OR (periodo = 10) OR (periodo = 14) OR (periodo = 18) OR (periodo = 22)
      OR (periodo = 26) OR (periodo = 30) OR (periodo = 34) OR (periodo = 38) OR (periodo = 42) OR (periodo = 46)
      OR (periodo = 50)) THEN
      basico = 0;
     END
     ELSE
     IF ((:periodicidad = 3) AND (:tomasal <> 3)) THEN
     BEGIN
      IF ((periodo = 3) OR (periodo = 7) OR (periodo = 11) OR (periodo = 15) OR (periodo = 19) OR (periodo = 23)
      OR (periodo = 27) OR (periodo = 31) OR (periodo = 35) OR (periodo = 39) OR (periodo = 43) OR (periodo = 47)
      OR (periodo = 51)) THEN
      basico = 0;
     END
     ELSE
     IF ((:periodicidad = 3) AND (:tomasal <> 4)) THEN
     BEGIN
      IF ((periodo = 4) OR (periodo = 8) OR (periodo = 12) OR (periodo = 16) OR (periodo = 20) OR (periodo = 24)
      OR (periodo = 29) OR (periodo = 32) OR (periodo = 36) OR (periodo = 40) OR (periodo = 44) OR (periodo = 48)
      OR (periodo = 52)) THEN
      basico = 0;
     END
   END
   ELSE
    BEGIN
     SELECT E.empl_salario FROM EMPLEADOS E WHERE E.terc_nit = :nite INTO :basico;
    END
    SELECT ((n.nono_valor /30) * n.nono_dura), (n.nono_dura) FROM nomina_novedades n WHERE n.tnov_cod = 11 AND n.terc_nit = :nite AND n.nono_periodo = :periodo INTO :cambsaltrans, :duranov;
    IF (cambsaltrans IS NULL) THEN
    cambsaltrans = 0;
    IF (duranov IS NULL) THEN
    duranov = 0;
    diaslab = :diaslab - :duranov;
    IF (conc_cod = 922) THEN
    BEGIN
     SELECT SUM(P.prcu_monto) FROM prestamo_cuotas P, prestamo_nomina PN WHERE P.prcu_ano = :ano AND P.prcu_periodo = :periodo AND PN.prno_id = P.prno_id AND PN.terc_nit = :nite INTO :valor;
     IF (valor IS NULL) THEN
     valor = 0;
     item = :item + 1;
     UPDATE prestamo_cuotas  P SET prcu_ok = 'S' WHERE P.prcu_ano = :ano AND P.prcu_periodo = :periodo AND P.prno_id = (SELECT PN.prno_id FROM PRESTAMO_NOMINA PN WHERE PN.terc_nit = :nite);
    END
    ELSE
    IF ((:montos = 0) OR (:montos IS NULL)) THEN
    BEGIN
     IF ((CONC_PORC = 0 AND :porcen = 0) OR (CONC_PORC IS NULL AND :porcen = 0) OR (CONC_PORC = 0 AND :porcen IS NULL) OR (CONC_PORC IS NULL AND :porcen IS NULL) ) THEN
     BEGIN
      IF ((conc_monto <> 0) AND (conc_monto IS NOT NULL) ) THEN
      BEGIN
       VALOR = :CONC_MONTO;
       IF (:conc_dias = 'S') THEN
       valor = (:valor / 30) * :diaslab;
      END
      ELSE
      IF (salario = 'S' AND CONC_COD <> 900 AND CONC_COD <> 920 and conc_cod <> 932 AND CONC_COD <> 953) THEN
      BEGIN
       SELECT E.empl_salario FROM EMPLEADOS E WHERE E.terc_nit = :nite INTO :basico;
       SELECT N.noex_recnoct, N.noex_recfest
       FROM NOMINA_HORASEXT N WHERE N.noex_periodio = :periodo AND N.noex_ano = :ano AND N.terc_nit = :nite
       INTO :recnoct, :recfest;
       if (recnoct is null) then
        recnoct = 0;
       if (recfest is null) then
        recfest = 0;
       SELECT P.paan_recnoc, P.paan_recfest FROM PARAMETROS_ANO P WHERE P.paan_ano = :ano INTO :tar_recnotc, :tar_recfest;
       basico = ((:basico/30)*:diaslab) - (((:basico/30)/8)*:recnoct);
       basico = :basico - (((:basico/30)/8)*:recfest);
       conc_monto = :basico;
       VALOR = (:conc_monto/*/30 * :diaslab*/ ) + :cambsaltrans;
      END
      ELSE
      BEGIN
       valor = montos;
       IF (:conc_dias = 'S') THEN
       valor = (:valor / 30) * :diaslab;
      END
     END
     ELSE
     BEGIN
      IF (:porcen <> 0) THEN
      BEGIN
       IF ((conc_monto <> 0) AND (conc_monto IS NOT NULL) ) THEN
       BEGIN
        VALOR = ((:CONC_MONTO ) * :PORCEN) /100;
       END
      END
      ELSE
      BEGIN
       IF ((conc_monto <> 0) AND (conc_monto IS NOT NULL) ) THEN
       BEGIN
        VALOR = ((:CONC_MONTO) * :conc_porc) /100;
       END
       ELSE
       IF (salario = 'S' AND CONC_COD <> 900 AND CONC_COD <> 920 and conc_cod <> 932 AND CONC_COD <> 953) THEN
       BEGIN
       SELECT E.empl_salario FROM EMPLEADOS E WHERE E.terc_nit = :nite INTO :basico;
       SELECT N.noex_recnoct, N.noex_recfest
       FROM NOMINA_HORASEXT N WHERE N.noex_periodio = :periodo AND N.noex_ano = :ano AND N.terc_nit = :nite
       INTO :recnoct, :recfest;
       if (recnoct is null) then
        recnoct = 0;
       if (recfest is null) then
        recfest = 0;
       SELECT P.paan_recnoc, P.paan_recfest FROM PARAMETROS_ANO P WHERE P.paan_ano = :ano INTO :tar_recnotc, :tar_recfest;
       basico = ((:basico/30)*:diaslab) - (((:basico/30)/8)*:recnoct);
       basico = :basico - (((:basico/30)/8)*:recfest);
        conc_monto = :basico;
        VALOR = ((:CONC_MONTO)+ :cambsaltrans * :conc_porc) /100;
       END
       ELSE
       IF (:conc_monto = 0 AND :montos = 0) THEN
       BEGIN
        conc_monto = :basico;
        VALOR = (((:CONC_MONTO / 30) * :diaslab) + :cambsaltrans * :conc_porc) /100;
       END
      END
     END
    END
    ELSE
    IF ((CONC_PORC = 0 OR (conc_porc IS NULL)) AND (:porcen = 0 OR (porcen IS NULL))) THEN
    BEGIN
     VALOR = (:montos);
     IF (:conc_dias = 'S') THEN
     valor = (:valor / 30) * :diaslab;
    END
    ELSE
    IF (:porcen <> 0 AND porcen IS NOT NULL) THEN
    BEGIN
     VALOR = ((:MONTOS ) * :PORCEN) /100;
    END
    ELSE
    BEGIN
     VALOR = ((:montos) * :CONC_PORC) /100;
    END
    IF (conc_promedio = 'S') THEN
    BEGIN
     perinicial = :periodo - (:numeroprom) + 1;
     anoprom = CAST (ano AS INTEGER);
     IF (perinicial <= 0) THEN
     BEGIN
      perinicial = 1;
      anoprom = CAST(ANO AS INTEGER) - 1;
     END
     SELECT SUM (noco_valor) FROM nomina_conceptos n WHERE n.noco_aplicaprom = 'S' AND N.noco_periodo >= :perinicial - 1 AND N.noco_periodo < :periodo AND N.noco_ano >= :anoprom AND N.noco_ano <= :ano AND terc_nit = :nite INTO :valor;
     valor = ((valor ) / (numeroprom -1 ));
     SELECT NOCO_VALOR FROM NOMINA_CONCEPTOS WHERE CONC_COD = :conc_cod AND TERC_NIT  = :nite AND NOCO_PAGOOK = 'N' AND NOCO_PERIODO = 0 INTO :saldosini;
     IF (saldosini IS NULL) THEN
     saldosini = 0;
     ELSE
     UPDATE nomina_conceptos N SET noco_pagook = 'S' WHERE n.noco_aplicaprom = 'S' AND N.noco_periodo >= :perinicial - 1 AND N.noco_periodo < :periodo AND N.noco_ano >= :anoprom AND N.noco_ano <= :ano  AND CONC_COD = :conc_cod AND terc_nit = :nite AND NOCO_PERIODO = 0;
     VALOR = :valor + :saldosini;
     UPDATE nomina_conceptos N SET noco_pagook = 'S' WHERE n.noco_aplicaprom = 'S' AND N.noco_periodo >= :perinicial - 1 AND N.noco_periodo < :periodo AND N.noco_ano >= :anoprom AND N.noco_ano <= :ano  AND CONC_COD = :conc_cod AND terc_nit = :nite;
    END
    ELSE
    IF (conc_otroconc = 'S') THEN
    BEGIN
     anosum = CAST(ano AS INTEGER);
     anosum = anosum - 1;
     SELECT SUM (noco_valor) FROM nomina_conceptos n WHERE n.noco_ano = :anosum AND n.conc_cod = :conc_codotroconc AND N.terc_nit = :nite INTO :valor;
     SELECT NOCO_VALOR FROM NOMINA_CONCEPTOS WHERE noco_ano = :anosum AND conc_cod = :conc_codotroconc AND terc_nit = :nite AND NOCO_PERIODO = 0 INTO :saldosini;
     IF (saldosini IS NULL) THEN
     saldosini = 0;
     ELSE
     UPDATE nomina_conceptos SET noco_pagook = 'S' WHERE noco_ano = :anosum AND conc_cod = :conc_codotroconc AND NOCO_PERIODO = 0 AND terc_nit = :nite;
     VALOR = :valor + :saldosini;
     UPDATE nomina_conceptos SET noco_pagook = 'S' WHERE noco_ano = :anosum AND conc_cod = :conc_codotroconc AND terc_nit = :nite;
    END
    ELSE
    IF (conc_aporte = 'S') THEN
    BEGIN
     horasex = NULL;
     diasnov = NULL;
     retroact = NULL;
     reembolso = NULL;
     beneficios = null;
     recargo = null;
     IF ((:entidad = '' ) OR (entidad IS NULL)) THEN
     BEGIN
      /*COMISIONES*/
      SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
      IF (comision IS NULL) THEN
      comision = 0;
      /*RETROACTIVO*/
      SELECT C.emco_monto FROM EMPLEADO_CONCEPTOS C WHERE C.terc_nit = :nite AND C.conc_cod = 933 INTO :retroact;
      IF (retroact IS NULL ) THEN
      retroact = 0;
      /*REEMBOLSO*/
      SELECT C.emco_monto FROM EMPLEADO_CONCEPTOS C WHERE C.terc_nit = :nite AND C.conc_cod = 952 INTO :reembolso;
      IF (reembolso IS NULL ) THEN
      reembolso = 0;
      /*INCAPACIDAD*/
      SELECT N.nono_dura FROM NOMINA_NOVEDADES N WHERE N.terc_nit = :nite AND N.nono_periodo = :periodo AND N.nono_ano = :ano AND (N.tnov_cod = 2 OR (N.tnov_cod = 3)) INTO :diasnov;
      IF (:diasnov IS NULL) THEN
      incap = 0;
      ELSE
      incap = (:basico / 30)* :diasnov;
      /*BASICO*/
      SELECT N.noex_recnoct, N.noex_recfest
      FROM NOMINA_HORASEXT N WHERE N.noex_periodio = :periodo AND N.noex_ano = :ano AND N.terc_nit = :nite
      INTO :recnoct, :recfest;
      if (recnoct is null) then
       recnoct = 0;
      if (recfest is null) then
       recfest = 0;
      SELECT P.paan_recnoc, P.paan_recfest FROM PARAMETROS_ANO P WHERE P.paan_ano = :ano INTO :tar_recnotc, :tar_recfest;
      basico = ((:basico/30)*:diaslab) - (((:basico/30)/8)*:recnoct);
      basico = :basico - (((:basico/30)/8)*:recfest);
      /*HORAS EXTRA*/
      SELECT c.noex_monto FROM nomina_horasext c WHERE c.noex_ano = :ano AND c.noex_periodio = :periodo AND c.noex_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :horasex;
      if (horasex is null) then
       horasex = 0;
      /*RECARGOS*/
      SELECT E.empl_salario FROM EMPLEADOS E WHERE E.terc_nit = :nite INTO :basicorec;
      SELECT N.noex_recnoct, N.noex_recfest
      FROM NOMINA_HORASEXT N WHERE N.noex_periodio = :periodo AND N.noex_ano = :ano AND N.terc_nit = :nite
      INTO :recnoct, :recfest;
      if (recnoct is null) then
       recnoct = 0;
      if (recfest is null) then
       recfest = 0;
      SELECT P.paan_recnoc, P.paan_recfest FROM PARAMETROS_ANO P WHERE P.paan_ano = :ano INTO :tar_recnotc, :tar_recfest;
      recargo = (((:basicorec/30)/8)*:tar_recnotc)*:recnoct;
      recargo = :recargo + ((((:basicorec/30)/8)*:tar_recfest)*:recfest);
      /*basico*/
      if (:basico + :comision + :horasex + :retroact+ :reembolso + :incap+ :cambsaltrans < ((:smlv/30)*:diaslab)) then
      comision = :smlv + :comision;
      /*SMLV Y AUX. TRANSPORTE*/
      SELECT P.paan_auxtr, P.paan_salminimo FROM PARAMETROS_ANO P WHERE P.paan_ano = :ano INTO :auxtrans, :smlv;
      /*BASE*/
      valor = :basico + :comision + :horasex + :retroact+ :reembolso + :incap + :recargo + :cambsaltrans;
      IF ((conc_cod = 904) OR (conc_cod = 905) OR (conc_cod = 906) or (conc_cod = 934) ) THEN
      BEGIN
       entidad = :nitafp;
       IF (conc_cod = 904) THEN
       BEGIN
        SELECT A.paan_afptr FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
        VALOR = ((:valor) * :PORCEN) /100;
       END
       ELSE
       IF ((conc_cod = 905) OR (conc_cod = 906) or (conc_cod = 934)) THEN
       BEGIN
        SELECT A.paan_afpem FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
        VALOR = ((:valor) * :PORCEN) /100;
       END
      END
      ELSE
      IF ((conc_cod = 907) OR (conc_cod = 914) OR (conc_cod = 915) or (conc_cod = 938) ) THEN
      BEGIN
       entidad = :niteps;
       IF (conc_cod = 907) THEN
       BEGIN
        SELECT A.paan_epstr FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
        VALOR = ((:valor) * :PORCEN) /100;
       END
       ELSE
       IF ((conc_cod = 914) OR (conc_cod = 915) or (conc_cod = 938)) THEN
       BEGIN
        SELECT A.paan_epsem FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
        VALOR = ((:valor) * :PORCEN) /100;
       END
      END
      ELSE
      IF ((conc_cod = 910) OR (conc_cod = 911) OR (conc_cod = 916) OR (conc_cod = 917) OR (conc_cod = 918) OR (conc_cod = 919) or (conc_cod = 936) or (conc_cod = 939) or (conc_cod = 940)) THEN
      BEGIN
       entidad = :nitccf;
       IF ((conc_cod = 910) OR (conc_cod = 911) or (conc_cod = 936)) THEN
       BEGIN
        SELECT A.paan_ccf FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
        VALOR = ((:valor) * :PORCEN) /100;
       END
       ELSE
       IF ((conc_cod = 916) OR (conc_cod = 917) or (conc_cod = 939)) THEN
       BEGIN
        SELECT A.paan_icbf FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
        VALOR = ((:valor) * :PORCEN) /100;
       END
       ELSE
       IF ((conc_cod = 918) OR (conc_cod = 919) or (conc_cod = 940)) THEN
       BEGIN
        SELECT A.paan_sena FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
        VALOR = ((:valor) * :PORCEN) /100;
       END
      END
      ELSE
      IF ((conc_cod = 912) OR (conc_cod = 913)) THEN
      BEGIN
       entidad = :nitafc;
      SELECT SUM(ce.emco_monto)
      FROM empleado_conceptos CE, CONCEPTOS_NOMINA CN WHERE ((CE.terc_nit = :nite) AND (CE.CONC_COD = CN.CONC_COD) AND (CE.emco_fecini <= :fec AND CE.emco_fecfin >= :FEC) ) OR ((CE.terc_nit = :nite)
      AND (CE.CONC_COD = CN.CONC_COD) AND (cn.conc_todosper = 'N') AND (CE.emco_ppago = :periodo)) OR  ((CE.terc_nit = :nite) AND (CE.CONC_COD = CN.CONC_COD) AND cn.conc_todosper = 'S') AND CN.conc_benefic = 'S'
      INTO :beneficios;
      if (beneficios is null) then
       beneficios = 0;
      SELECT P.paan_auxtr, P.paan_salminimo FROM PARAMETROS_ANO P WHERE P.paan_ano = :ano INTO :auxtrans, :smlv;
      if (:basico < (:smlv*2)) then
       auxtrans = (:auxtrans / 30) * :diaslab;
      ELSE
       auxtrans = 0;
       IF ((conc_cod = 912) OR (conc_cod = 913) or (conc_cod = 937)) THEN
       BEGIN
        SELECT A.paan_cesemp FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
        VALOR = ((:valor + :auxtrans + :beneficios) * :PORCEN) /100;
       END
      END
      ELSE
      BEGIN
       IF (comision IS NULL) THEN
       comision = 0;
       SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
       conc_monto = :basico + :comision;
       IF (conc_porc <> 0 AND conc_porc IS NOT NULL) THEN
       VALOR = (((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans + :incap) * :conc_porc) /100;
       ELSE
       IF (:porcen <> 0 AND :porcen IS NOT NULL) THEN
       VALOR = (((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans + :incap) * :porcen) /100;
       ELSE
       IF (:montos <> 0 AND :montos IS NOT NULL) THEN
       valor = :montos;
       ELSE
       IF (:conc_monto <> 0 AND :conc_monto IS NOT NULL) THEN
       valor = :conc_monto;
      END
     END
     item = :item + 1;
    END
    ELSE
    IF (conc_prov = 'S') THEN
    BEGIN
     /*RECARGO*/
     SELECT E.empl_salario FROM EMPLEADOS E WHERE E.terc_nit = :nite INTO :basico;
     SELECT N.noex_recnoct, N.noex_recfest
     FROM NOMINA_HORASEXT N WHERE N.noex_periodio = :periodo AND N.noex_ano = :ano AND N.terc_nit = :nite
     INTO :recnoct, :recfest;
     if (recnoct is null) then
      recnoct = 0;
     if (recfest is null) then
      recfest = 0;
     SELECT P.paan_recnoc, P.paan_recfest FROM PARAMETROS_ANO P WHERE P.paan_ano = :ano INTO :tar_recnotc, :tar_recfest;
     recargo = (((:basico/30)/8)*:tar_recnotc)*:recnoct;
     recargo = :recargo + ((((:basico/30)/8)*:tar_recfest)*:recfest);
     /*BASICO*/
     SELECT N.noex_recnoct, N.noex_recfest
     FROM NOMINA_HORASEXT N WHERE N.noex_periodio = :periodo AND N.noex_ano = :ano AND N.terc_nit = :nite
     INTO :recnoct, :recfest;
     if (recnoct is null) then
      recnoct = 0;
     if (recfest is null) then
      recfest = 0;
     SELECT P.paan_recnoc, P.paan_recfest FROM PARAMETROS_ANO P WHERE P.paan_ano = :ano INTO :tar_recnotc, :tar_recfest;
     basico = ((:basico/30)*:diaslab) - (((:basico/30)/8)*:recnoct);
     basico = :basico - (((:basico/30)/8)*:recfest);
     /*BENEFICIOS*/
     SELECT SUM(ce.emco_monto)
     FROM empleado_conceptos CE, CONCEPTOS_NOMINA CN WHERE ((CE.terc_nit = :nite) AND (CE.CONC_COD = CN.CONC_COD) AND (CE.emco_fecini <= :fec AND CE.emco_fecfin >= :FEC) ) OR ((CE.terc_nit = :nite)
     AND (CE.CONC_COD = CN.CONC_COD) AND (cn.conc_todosper = 'N') AND (CE.emco_ppago = :periodo)) OR  ((CE.terc_nit = :nite) AND (CE.CONC_COD = CN.CONC_COD) AND cn.conc_todosper = 'S') AND CN.conc_benefic = 'S'
     INTO :beneficios;
     if (beneficios is null) then
      beneficios = 0;
     if ((conc_cod <> 929) and (conc_cod <> 930)) then
     begin
        SELECT P.paan_auxtr, P.paan_salminimo FROM PARAMETROS_ANO P WHERE P.paan_ano = :ano INTO :auxtrans, :smlv;
        if (:basico < (:smlv*2)) then
           auxtrans = (:auxtrans / 30) * :diaslab;
        ELSE
           auxtrans = 0;
     end
     else
      auxtrans = 0;
     conc_monto = :basico;
     IF (conc_porc <> 0 AND conc_porc IS NOT NULL) THEN
     VALOR = (((:CONC_MONTO)+ :cambsaltrans + :incap + :recargo + :auxtrans + :beneficios) * :conc_porc) /100;
     ELSE
     IF (porcen <> 0 AND porcen IS NOT NULL) THEN
     VALOR = (((:CONC_MONTO)+ :cambsaltrans + :incap + :recargo + :auxtrans + :beneficios) * :porcen) /100;
     ELSE
     IF (montos <> 0 AND montos IS NOT NULL) THEN
     VALOR = :montos;
     ELSE
     IF (conc_monto <> 0 AND conc_monto IS NOT NULL) THEN
     VALOR = :conc_monto;
     item = :item + 1;
    END
    ELSE
    IF (conc_cod = 920) THEN
    BEGIN
     SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :valor;
     IF (valor IS NULL) THEN
     valor = 0;
     item = :item + 1;
    END
    ELSE
    IF (conc_cod = 900 OR (:conc_cod = 931)) THEN
    BEGIN
     SELECT c.noex_monto FROM nomina_horasext c WHERE c.noex_ano = :ano AND c.noex_periodio = :periodo AND c.noex_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :valor;
     IF (valor IS NULL) THEN
     valor = 0;
     item = :item + 1;
    END
    ELSE
    IF (conc_cod = 932) THEN
    BEGIN
     SELECT N.nono_dura FROM NOMINA_NOVEDADES N WHERE N.terc_nit = :nite AND N.nono_periodo = :periodo AND N.nono_ano = :ano AND (N.tnov_cod = 2 OR (N.tnov_cod = 3)) INTO :diasnov;
     IF (:diasnov IS NULL) THEN
     valor = 0;
     ELSE
     valor = (:basico / 30)* :diasnov;
    END
    ELSE
    IF (conc_cod = 921) THEN
    BEGIN
     IF (porcen IS NOT NULL AND porcen <> 0) THEN
     valor = ((basico / 30)* :diaslab ) * :PORCEN /100;
     ELSE
     IF (conc_porc IS NOT NULL AND conc_porc <> 0) THEN
     valor = ((basico / 30)* :diaslab ) * :conc_porc /100;
    END
    ELSE
    if (conc_cod = 953) then
    BEGIN
       SELECT E.empl_salario FROM EMPLEADOS E WHERE E.terc_nit = :nite INTO :basico;
       SELECT N.noex_recnoct, N.noex_recfest
       FROM NOMINA_HORASEXT N WHERE N.noex_periodio = :periodo AND N.noex_ano = :ano AND N.terc_nit = :nite
       INTO :recnoct, :recfest;
       if (recnoct is null) then
        recnoct = 0;
       if (recfest is null) then
        recfest = 0;
       SELECT P.paan_recnoc, P.paan_recfest FROM PARAMETROS_ANO P WHERE P.paan_ano = :ano INTO :tar_recnotc, :tar_recfest;
       valor = (((:basico/30)/8)*:tar_recnotc)*:recnoct;
       valor = :valor + ((((:basico/30)/8)*:tar_recfest)*:recfest);
    END
    EXECUTE PROCEDURE LEE_CONFIGURACION('NOMINA','GENERAL','REDONDEO AL MULTIPLO DE DIEZ EN TOTALES')RETURNING_VALUES(:aprox);
    EXECUTE PROCEDURE REDONDEE(:valor, :aprox) RETURNING_VALUES (VALOR);
    IF ((mensual = 'N') OR (periodicidad = 1))  THEN
    INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
    VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
    ELSE
    IF (mensual = 'S') THEN
    BEGIN
     IF ((:periodicidad = 2) AND (liquidaper = 1)) THEN
     BEGIN
      IF ((periodo = 1) OR (periodo = 3) OR (periodo = 5) OR (periodo = 7) OR (periodo = 9) OR (periodo = 11)
      OR (periodo = 13) OR (periodo = 15) OR (periodo = 17) OR (periodo = 19) OR (periodo = 21) OR (periodo = 23)) THEN
      INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
      VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
     END
     ELSE
     IF ((:periodicidad = 2) AND (liquidaper = 2)) THEN
     BEGIN
      IF ((periodo = 2) OR (periodo = 4) OR (periodo = 6) OR (periodo = 8) OR (periodo = 10) OR (periodo = 12)
      OR (periodo = 14) OR (periodo = 16) OR (periodo = 18) OR (periodo = 20) OR (periodo = 22) OR (periodo = 24)) THEN
      INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
      VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
     END
     ELSE
     IF ((:periodicidad = 3) AND (liquidaper = 1)) THEN
     BEGIN
      IF ((periodo = 1) OR (periodo = 5) OR (periodo = 9) OR (periodo = 13) OR (periodo = 17) OR (periodo = 21)
      OR (periodo = 25) OR (periodo = 29) OR (periodo = 33) OR (periodo = 37) OR (periodo = 41) OR (periodo = 45)
      OR (periodo = 49)) THEN
      INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
      VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
    END
    ELSE
     IF ((:periodicidad = 3) AND (liquidaper = 2)) THEN
     BEGIN
      IF ((periodo = 2) OR (periodo = 6) OR (periodo = 10) OR (periodo = 14) OR (periodo = 18) OR (periodo = 22)
      OR (periodo = 26) OR (periodo = 30) OR (periodo = 34) OR (periodo = 38) OR (periodo = 42) OR (periodo = 46)
      OR (periodo = 50)) THEN
      INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
      VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
     END
     ELSE
     IF ((:periodicidad = 3) AND (liquidaper = 3)) THEN
     BEGIN
      IF ((periodo = 3) OR (periodo = 7) OR (periodo = 11) OR (periodo = 15) OR (periodo = 19) OR (periodo = 23)
      OR (periodo = 27) OR (periodo = 31) OR (periodo = 35) OR (periodo = 39) OR (periodo = 43) OR (periodo = 47)
      OR (periodo = 51)) THEN
      INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
      VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
     END
     ELSE
     IF ((:periodicidad = 3) AND (liquidaper = 4)) THEN
     BEGIN
      IF ((periodo = 4) OR (periodo = 8) OR (periodo = 12) OR (periodo = 16) OR (periodo = 20) OR (periodo = 24)
      OR (periodo = 29) OR (periodo = 32) OR (periodo = 36) OR (periodo = 40) OR (periodo = 44) OR (periodo = 48)
      OR (periodo = 52)) THEN
      INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
      VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
     END
    END
  VALOR = 0;
  basico = 0;
  END
 END
 END
 END
 SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER PROCEDURE CAUSA_NOMINA (
    fec date,
    periodo integer,
    periodicidad integer,
    pagoglobal char(1),
    ano char(4),
    depto integer)
returns (
    idnomina integer,
    itemini integer)
as
declare variable item integer;
declare variable nite varchar(20) character set none;
declare variable nit_tercero varchar(20);
declare variable concept integer;
declare variable montos numeric(18,2);
declare variable porcen numeric(9,4);
declare variable entidad varchar(20);
declare variable conc_cod integer;
declare variable conc_deduc char(1);
declare variable conc_porc numeric(9,4);
declare variable conc_entidad integer;
declare variable conc_monto numeric(18,2);
declare variable conc_modifi char(1);
declare variable conc_promedio char(1);
declare variable emco_perprom integer;
declare variable valor numeric(18,2);
declare variable diaslab integer;
declare variable conc_prov char(1);
declare variable conc_aporte char(1);
declare variable numeroprom integer;
declare variable conc_aplicaprom char(1);
declare variable perinicial integer;
declare variable anoprom integer;
declare variable conc_dias char(1);
declare variable conc_otroconc char(1);
declare variable conc_codotroconc integer;
declare variable anosum integer;
declare variable salario char(1) character set none;
declare variable liquidaper integer;
declare variable rmod numeric(2,2);
declare variable basico numeric(18,2);
declare variable niteps varchar(20);
declare variable nitafc varchar(20);
declare variable nitafp varchar(20);
declare variable nitccf varchar(20);
declare variable gtoempr char(1);
declare variable comision numeric(18,2);
declare variable cambsaltrans numeric(18,2);
declare variable saldosini numeric(18,2);
declare variable duranov integer;
declare variable base numeric(18,2);
declare variable aprox integer;
declare variable mensual char(1);
declare variable horasex numeric(18,2);
declare variable diasnov integer;
declare variable tomasal integer;
declare variable retroact numeric(18,2);
declare variable reembolso numeric(18,2);
declare variable incap numeric(18,2);
declare variable deptoempl integer;
declare variable auxtrans numeric(18,2);
declare variable smlv numeric(18,2);
declare variable beneficios numeric(18,2);
declare variable confirmado char(1);
declare variable recnoct numeric(18,2);
declare variable recfest numeric(18,2);
declare variable tar_recnotc numeric(9,4);
declare variable tar_recfest numeric(9,4);
declare variable recargo numeric(18,2);
declare variable basicorec numeric(18,2);
BEGIN
 SELECT N.NOMI_ID, N.nomi_liqok FROM NOMINA N WHERE N.nomi_periodo = :periodo AND N.nomi_periodocidad = :periodicidad AND N.nomi_ano = :ano
 INTO :IDNOMINA, :CONFIRMADO;
 IF (:idnomina IS NULL) THEN
 BEGIN
  EXECUTE PROCEDURE cambie_id_nomina RETURNING_VALUES(:idnomina);
  INSERT INTO nomina (nomi_id, NOMI_FECCAUSA, NOMI_PAGOGLOBAL, NOMI_PERIODOCIDAD, NOMI_PERIODO, NOMI_ANO, NOMI_LIQOK)
  VALUES (:IDNOMINA, :fec,:pagoglobal, :periodicidad, :periodo, :ano, 'N');
  item = 1;
 END
 ELSE
 BEGIN
  SELECT MAX(N.noco_item) FROM NOMINA_CONCEPTOS N WHERE N.nomi_id = :idnomina
  INTO :item;
 END
 if ((confirmado = 'S') AND (idnomina IS NOT NULL)) then
 BEGIN
  idnomina = 0;
 END
 else
 begin
 IF (DEPTO = 0) THEN
  INSERT INTO NOMINA_DEPARTAMENTO (nomi_id, nodp_depto)VALUES(:IDNOMINA,0);
 ELSE
  INSERT INTO NOMINA_DEPARTAMENTO (nomi_id, nodp_depto)VALUES(:IDNOMINA,:DEPTO);
 ITEMINI = ITEM;
 FOR SELECT E.TERC_NIT, E.empl_salario, e.empl_eps, e.empl_afc, e.empl_afp, e.empl_ccf, e.empl_dpto
 FROM EMPLEADOS E
 WHERE E.empl_ppago = :periodicidad AND ((E.empl_fecret IS NULL) OR (E.empl_fecret > :fec)) AND E.empl_fecing <= :fec
 INTO :nite, :basico, :niteps, :nitafc, :nitafp, :nitccf, :deptoempl
 DO
 BEGIN
 IF ((depto = 0) OR (deptoempl = :depto)) THEN
 BEGIN
  FOR SELECT CE.TERC_NIT, CE.CONC_COD, CE.EMCO_MONTO, CE.EMCO_PORC, ce.empl_entidad, CE.emco_perprom, CE.emco_luquidaper, CE.emco_mensual, CN.CONC_COD, CN.CONC_DEDUC,CN.CONC_PORC, CN.CONC_ENTIDAD, CN.CONC_MONTO,  CN.CONC_DIAS, CN.CONC_MODIFI,
  CN.CONC_PROMEDIO, CN.conc_salario, CE.emco_perprom, CN.conc_prov, CN.conc_aporte, CN.conc_aplicaprom, cn.conc_otroconc, cn.conc_codotroconc, CN.conc_gtoempr, CN.conc_base, CE.emco_tomsal
  FROM empleado_conceptos CE, CONCEPTOS_NOMINA CN WHERE ((CE.terc_nit = :nite) AND (CE.CONC_COD = CN.CONC_COD) AND (CE.emco_fecini <= :fec AND CE.emco_fecfin >= :FEC) ) OR ((CE.terc_nit = :nite)
  AND (CE.CONC_COD = CN.CONC_COD) AND (cn.conc_todosper = 'N') AND (CE.emco_ppago = :periodo)) OR  ((CE.terc_nit = :nite) AND (CE.CONC_COD = CN.CONC_COD) AND cn.conc_todosper = 'S')  ORDER BY (TERC_NIT )
  INTO :nit_tercero, :concept,  :montos, :porcen, :entidad, :numeroprom, :liquidaper, :mensual ,:CONC_COD, :CONC_DEDUC, :CONC_PORC,
  :CONC_ENTIDAD, :CONC_MONTO, :CONC_DIAS, :CONC_MODIFI,:CONC_PROMEDIO, :salario,:EMCO_PERPROM, :conc_prov, :conc_aporte , :CONC_APLICAPROM, :conc_otroconc, :conc_codotroconc, :gtoempr, :base, :tomasal
  DO
  BEGIN
   IF (conc_dias = 'S') THEN
   EXECUTE PROCEDURE DIAS_LABORADOS (:nite, :periodo, :fec, :mensual,:conc_aporte) RETURNING_VALUES (:diaslab);
   ELSE
   BEGIN
    diaslab = 15;
    IF (mensual = 'S') THEN
    BEGIN
     IF (periodicidad = 2) THEN
     diaslab = 30;
     ELSE
     IF (liquidaper = 3) THEN
     diaslab = 30;
    END
   END
   IF (:tomasal <> 0) THEN
   BEGIN
    IF ((:periodicidad = 2) AND (:tomasal <> 2)) THEN
    BEGIN
     IF ((periodo = 2) OR (periodo = 4) OR (periodo = 6) OR (periodo = 8) OR (periodo = 10) OR (periodo = 12)
     OR (periodo = 14) OR (periodo = 16) OR (periodo = 18) OR (periodo = 20) OR (periodo = 22) OR (periodo = 24)) THEN
     basico = 0;
    END
    ELSE
    IF ((:periodicidad = 3) AND (:tomasal <> 1)) THEN
    BEGIN
     IF ((periodo = 1) OR (periodo = 5) OR (periodo = 9) OR (periodo = 13) OR (periodo = 17) OR (periodo = 21)
     OR (periodo = 25) OR (periodo = 29) OR (periodo = 33) OR (periodo = 37) OR (periodo = 41) OR (periodo = 45)
     OR (periodo = 49)) THEN
     basico = 0;
    END
    ELSE
     IF ((:periodicidad = 3) AND (:tomasal <> 2)) THEN
     BEGIN
      IF ((periodo = 2) OR (periodo = 6) OR (periodo = 10) OR (periodo = 14) OR (periodo = 18) OR (periodo = 22)
      OR (periodo = 26) OR (periodo = 30) OR (periodo = 34) OR (periodo = 38) OR (periodo = 42) OR (periodo = 46)
      OR (periodo = 50)) THEN
      basico = 0;
     END
     ELSE
     IF ((:periodicidad = 3) AND (:tomasal <> 3)) THEN
     BEGIN
      IF ((periodo = 3) OR (periodo = 7) OR (periodo = 11) OR (periodo = 15) OR (periodo = 19) OR (periodo = 23)
      OR (periodo = 27) OR (periodo = 31) OR (periodo = 35) OR (periodo = 39) OR (periodo = 43) OR (periodo = 47)
      OR (periodo = 51)) THEN
      basico = 0;
     END
     ELSE
     IF ((:periodicidad = 3) AND (:tomasal <> 4)) THEN
     BEGIN
      IF ((periodo = 4) OR (periodo = 8) OR (periodo = 12) OR (periodo = 16) OR (periodo = 20) OR (periodo = 24)
      OR (periodo = 29) OR (periodo = 32) OR (periodo = 36) OR (periodo = 40) OR (periodo = 44) OR (periodo = 48)
      OR (periodo = 52)) THEN
      basico = 0;
     END
   END
   ELSE
    BEGIN
     SELECT E.empl_salario FROM EMPLEADOS E WHERE E.terc_nit = :nite INTO :basico;
    END
    SELECT ((n.nono_valor /30) * n.nono_dura), (n.nono_dura) FROM nomina_novedades n WHERE n.tnov_cod = 11 AND n.terc_nit = :nite AND n.nono_periodo = :periodo INTO :cambsaltrans, :duranov;
    IF (cambsaltrans IS NULL) THEN
    cambsaltrans = 0;
    IF (duranov IS NULL) THEN
    duranov = 0;
    diaslab = :diaslab - :duranov;
    IF (conc_cod = 922) THEN
    BEGIN
     SELECT SUM(P.prcu_monto) FROM prestamo_cuotas P, prestamo_nomina PN WHERE P.prcu_ano = :ano AND P.prcu_periodo = :periodo AND PN.prno_id = P.prno_id AND PN.terc_nit = :nite INTO :valor;
     IF (valor IS NULL) THEN
     valor = 0;
     item = :item + 1;
     UPDATE prestamo_cuotas  P SET prcu_ok = 'S' WHERE P.prcu_ano = :ano AND P.prcu_periodo = :periodo AND P.prno_id = (SELECT PN.prno_id FROM PRESTAMO_NOMINA PN WHERE PN.terc_nit = :nite);
    END
    ELSE
    IF ((:montos = 0) OR (:montos IS NULL)) THEN
    BEGIN
     IF ((CONC_PORC = 0 AND :porcen = 0) OR (CONC_PORC IS NULL AND :porcen = 0) OR (CONC_PORC = 0 AND :porcen IS NULL) OR (CONC_PORC IS NULL AND :porcen IS NULL) ) THEN
     BEGIN
      IF ((conc_monto <> 0) AND (conc_monto IS NOT NULL) ) THEN
      BEGIN
       VALOR = :CONC_MONTO;
       IF (:conc_dias = 'S') THEN
       valor = (:valor / 30) * :diaslab;
      END
      ELSE
      IF (salario = 'S' AND CONC_COD <> 900 AND CONC_COD <> 920 and conc_cod <> 932 AND CONC_COD <> 953) THEN
      BEGIN
       SELECT E.empl_salario FROM EMPLEADOS E WHERE E.terc_nit = :nite INTO :basico;
       SELECT N.noex_recnoct, N.noex_recfest
       FROM NOMINA_HORASEXT N WHERE N.noex_periodio = :periodo AND N.noex_ano = :ano AND N.terc_nit = :nite
       INTO :recnoct, :recfest;
       if (recnoct is null) then
        recnoct = 0;
       if (recfest is null) then
        recfest = 0;
       SELECT P.paan_recnoc, P.paan_recfest FROM PARAMETROS_ANO P WHERE P.paan_ano = :ano INTO :tar_recnotc, :tar_recfest;
       basico = ((:basico/30)*:diaslab) - (((:basico/30)/8)*:recnoct);
       basico = :basico - (((:basico/30)/8)*:recfest);
       conc_monto = :basico;
       VALOR = (:conc_monto/*/30 * :diaslab*/ ) + :cambsaltrans;
      END
      ELSE
      BEGIN
       valor = montos;
       IF (:conc_dias = 'S') THEN
       valor = (:valor / 30) * :diaslab;
      END
     END
     ELSE
     BEGIN
      IF (:porcen <> 0) THEN
      BEGIN
       IF ((conc_monto <> 0) AND (conc_monto IS NOT NULL) ) THEN
       BEGIN
        VALOR = ((:CONC_MONTO ) * :PORCEN) /100;
       END
      END
      ELSE
      BEGIN
       IF ((conc_monto <> 0) AND (conc_monto IS NOT NULL) ) THEN
       BEGIN
        VALOR = ((:CONC_MONTO) * :conc_porc) /100;
       END
       ELSE
       IF (salario = 'S' AND CONC_COD <> 900 AND CONC_COD <> 920 and conc_cod <> 932 AND CONC_COD <> 953) THEN
       BEGIN
       SELECT E.empl_salario FROM EMPLEADOS E WHERE E.terc_nit = :nite INTO :basico;
       SELECT N.noex_recnoct, N.noex_recfest
       FROM NOMINA_HORASEXT N WHERE N.noex_periodio = :periodo AND N.noex_ano = :ano AND N.terc_nit = :nite
       INTO :recnoct, :recfest;
       if (recnoct is null) then
        recnoct = 0;
       if (recfest is null) then
        recfest = 0;
       SELECT P.paan_recnoc, P.paan_recfest FROM PARAMETROS_ANO P WHERE P.paan_ano = :ano INTO :tar_recnotc, :tar_recfest;
       basico = ((:basico/30)*:diaslab) - (((:basico/30)/8)*:recnoct);
       basico = :basico - (((:basico/30)/8)*:recfest);
        conc_monto = :basico;
        VALOR = ((:CONC_MONTO)+ :cambsaltrans * :conc_porc) /100;
       END
       ELSE
       IF (:conc_monto = 0 AND :montos = 0) THEN
       BEGIN
        conc_monto = :basico;
        VALOR = (((:CONC_MONTO / 30) * :diaslab) + :cambsaltrans * :conc_porc) /100;
       END
      END
     END
    END
    ELSE
    IF ((CONC_PORC = 0 OR (conc_porc IS NULL)) AND (:porcen = 0 OR (porcen IS NULL))) THEN
    BEGIN
     VALOR = (:montos);
     IF (:conc_dias = 'S') THEN
     valor = (:valor / 30) * :diaslab;
    END
    ELSE
    IF (:porcen <> 0 AND porcen IS NOT NULL) THEN
    BEGIN
     VALOR = ((:MONTOS ) * :PORCEN) /100;
    END
    ELSE
    BEGIN
     VALOR = ((:montos) * :CONC_PORC) /100;
    END
    IF (conc_promedio = 'S') THEN
    BEGIN
     perinicial = :periodo - (:numeroprom) + 1;
     anoprom = CAST (ano AS INTEGER);
     IF (perinicial <= 0) THEN
     BEGIN
      perinicial = 1;
      anoprom = CAST(ANO AS INTEGER) - 1;
     END
     SELECT SUM (noco_valor) FROM nomina_conceptos n WHERE n.noco_aplicaprom = 'S' AND N.noco_periodo >= :perinicial - 1 AND N.noco_periodo < :periodo AND N.noco_ano >= :anoprom AND N.noco_ano <= :ano AND terc_nit = :nite INTO :valor;
     valor = ((valor ) / (numeroprom -1 ));
     SELECT NOCO_VALOR FROM NOMINA_CONCEPTOS WHERE CONC_COD = :conc_cod AND TERC_NIT  = :nite AND NOCO_PAGOOK = 'N' AND NOCO_PERIODO = 0 INTO :saldosini;
     IF (saldosini IS NULL) THEN
     saldosini = 0;
     ELSE
     UPDATE nomina_conceptos N SET noco_pagook = 'S' WHERE n.noco_aplicaprom = 'S' AND N.noco_periodo >= :perinicial - 1 AND N.noco_periodo < :periodo AND N.noco_ano >= :anoprom AND N.noco_ano <= :ano  AND CONC_COD = :conc_cod AND terc_nit = :nite AND NOCO_PERIODO = 0;
     VALOR = :valor + :saldosini;
     UPDATE nomina_conceptos N SET noco_pagook = 'S' WHERE n.noco_aplicaprom = 'S' AND N.noco_periodo >= :perinicial - 1 AND N.noco_periodo < :periodo AND N.noco_ano >= :anoprom AND N.noco_ano <= :ano  AND CONC_COD = :conc_cod AND terc_nit = :nite;
    END
    ELSE
    IF (conc_otroconc = 'S') THEN
    BEGIN
     anosum = CAST(ano AS INTEGER);
     anosum = anosum - 1;
     SELECT SUM (noco_valor) FROM nomina_conceptos n WHERE n.noco_ano = :anosum AND n.conc_cod = :conc_codotroconc AND N.terc_nit = :nite INTO :valor;
     SELECT NOCO_VALOR FROM NOMINA_CONCEPTOS WHERE noco_ano = :anosum AND conc_cod = :conc_codotroconc AND terc_nit = :nite AND NOCO_PERIODO = 0 INTO :saldosini;
     IF (saldosini IS NULL) THEN
     saldosini = 0;
     ELSE
     UPDATE nomina_conceptos SET noco_pagook = 'S' WHERE noco_ano = :anosum AND conc_cod = :conc_codotroconc AND NOCO_PERIODO = 0 AND terc_nit = :nite;
     VALOR = :valor + :saldosini;
     UPDATE nomina_conceptos SET noco_pagook = 'S' WHERE noco_ano = :anosum AND conc_cod = :conc_codotroconc AND terc_nit = :nite;
    END
    ELSE
    IF (conc_aporte = 'S') THEN
    BEGIN
     horasex = NULL;
     diasnov = NULL;
     retroact = NULL;
     reembolso = NULL;
     beneficios = null;
     recargo = null;
     IF ((:entidad = '' ) OR (entidad IS NULL)) THEN
     BEGIN
      /*COMISIONES*/
      SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
      IF (comision IS NULL) THEN
      comision = 0;
      /*RETROACTIVO*/
      SELECT C.emco_monto FROM EMPLEADO_CONCEPTOS C WHERE C.terc_nit = :nite AND C.conc_cod = 933 INTO :retroact;
      IF (retroact IS NULL ) THEN
      retroact = 0;
      /*REEMBOLSO*/
      SELECT C.emco_monto FROM EMPLEADO_CONCEPTOS C WHERE C.terc_nit = :nite AND C.conc_cod = 952 INTO :reembolso;
      IF (reembolso IS NULL ) THEN
      reembolso = 0;
      /*INCAPACIDAD*/
      SELECT N.nono_dura FROM NOMINA_NOVEDADES N WHERE N.terc_nit = :nite AND N.nono_periodo = :periodo AND N.nono_ano = :ano AND (N.tnov_cod = 2 OR (N.tnov_cod = 3)) INTO :diasnov;
      IF (:diasnov IS NULL) THEN
      incap = 0;
      ELSE
      incap = (:basico / 30)* :diasnov;
      /*BASICO*/
      SELECT N.noex_recnoct, N.noex_recfest
      FROM NOMINA_HORASEXT N WHERE N.noex_periodio = :periodo AND N.noex_ano = :ano AND N.terc_nit = :nite
      INTO :recnoct, :recfest;
      if (recnoct is null) then
       recnoct = 0;
      if (recfest is null) then
       recfest = 0;
      SELECT P.paan_recnoc, P.paan_recfest FROM PARAMETROS_ANO P WHERE P.paan_ano = :ano INTO :tar_recnotc, :tar_recfest;
      basico = ((:basico/30)*:diaslab) - (((:basico/30)/8)*:recnoct);
      basico = :basico - (((:basico/30)/8)*:recfest);
      /*HORAS EXTRA*/
      SELECT c.noex_monto FROM nomina_horasext c WHERE c.noex_ano = :ano AND c.noex_periodio = :periodo AND c.noex_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :horasex;
      if (horasex is null) then
       horasex = 0;
      /*RECARGOS*/
      SELECT E.empl_salario FROM EMPLEADOS E WHERE E.terc_nit = :nite INTO :basicorec;
      SELECT N.noex_recnoct, N.noex_recfest
      FROM NOMINA_HORASEXT N WHERE N.noex_periodio = :periodo AND N.noex_ano = :ano AND N.terc_nit = :nite
      INTO :recnoct, :recfest;
      if (recnoct is null) then
       recnoct = 0;
      if (recfest is null) then
       recfest = 0;
      SELECT P.paan_recnoc, P.paan_recfest FROM PARAMETROS_ANO P WHERE P.paan_ano = :ano INTO :tar_recnotc, :tar_recfest;
      recargo = (((:basicorec/30)/8)*:tar_recnotc)*:recnoct;
      recargo = :recargo + ((((:basicorec/30)/8)*:tar_recfest)*:recfest);
      /*SMLV Y AUX. TRANSPORTE*/
      SELECT P.paan_auxtr, P.paan_salminimo FROM PARAMETROS_ANO P WHERE P.paan_ano = :ano INTO :auxtrans, :smlv;
      /*BASE*/
      if (:basico + :comision + :horasex + :retroact+ :reembolso + :incap+ :cambsaltrans < ((:smlv/30)*:diaslab)) then
       valor = (:smlv/30)*:diaslab;
      else
       valor = :basico + :comision + :horasex + :retroact+ :reembolso + :incap + :recargo + :cambsaltrans;
      IF ((conc_cod = 904) OR (conc_cod = 905) OR (conc_cod = 906) or (conc_cod = 934) ) THEN
      BEGIN
       entidad = :nitafp;
       IF (conc_cod = 904) THEN
       BEGIN
        SELECT A.paan_afptr FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
        VALOR = ((:valor) * :PORCEN) /100;
       END
       ELSE
       IF ((conc_cod = 905) OR (conc_cod = 906) or (conc_cod = 934)) THEN
       BEGIN
        SELECT A.paan_afpem FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
        VALOR = ((:valor) * :PORCEN) /100;
       END
      END
      ELSE
      IF ((conc_cod = 907) OR (conc_cod = 914) OR (conc_cod = 915) or (conc_cod = 938) ) THEN
      BEGIN
       entidad = :niteps;
       IF (conc_cod = 907) THEN
       BEGIN
        SELECT A.paan_epstr FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
        VALOR = ((:valor) * :PORCEN) /100;
       END
       ELSE
       IF ((conc_cod = 914) OR (conc_cod = 915) or (conc_cod = 938)) THEN
       BEGIN
        SELECT A.paan_epsem FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
        VALOR = ((:valor) * :PORCEN) /100;
       END
      END
      ELSE
      IF ((conc_cod = 910) OR (conc_cod = 911) OR (conc_cod = 916) OR (conc_cod = 917) OR (conc_cod = 918) OR (conc_cod = 919) or (conc_cod = 936) or (conc_cod = 939) or (conc_cod = 940)) THEN
      BEGIN
       entidad = :nitccf;
       IF ((conc_cod = 910) OR (conc_cod = 911) or (conc_cod = 936)) THEN
       BEGIN
        SELECT A.paan_ccf FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
        VALOR = ((:valor) * :PORCEN) /100;
       END
       ELSE
       IF ((conc_cod = 916) OR (conc_cod = 917) or (conc_cod = 939)) THEN
       BEGIN
        SELECT A.paan_icbf FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
        VALOR = ((:valor) * :PORCEN) /100;
       END
       ELSE
       IF ((conc_cod = 918) OR (conc_cod = 919) or (conc_cod = 940)) THEN
       BEGIN
        SELECT A.paan_sena FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
        VALOR = ((:valor) * :PORCEN) /100;
       END
      END
      ELSE
      IF ((conc_cod = 912) OR (conc_cod = 913)) THEN
      BEGIN
       entidad = :nitafc;
      SELECT SUM(ce.emco_monto)
      FROM empleado_conceptos CE, CONCEPTOS_NOMINA CN WHERE ((CE.terc_nit = :nite) AND (CE.CONC_COD = CN.CONC_COD) AND (CE.emco_fecini <= :fec AND CE.emco_fecfin >= :FEC) ) OR ((CE.terc_nit = :nite)
      AND (CE.CONC_COD = CN.CONC_COD) AND (cn.conc_todosper = 'N') AND (CE.emco_ppago = :periodo)) OR  ((CE.terc_nit = :nite) AND (CE.CONC_COD = CN.CONC_COD) AND cn.conc_todosper = 'S') AND CN.conc_benefic = 'S'
      INTO :beneficios;
      if (beneficios is null) then
       beneficios = 0;
      SELECT P.paan_auxtr, P.paan_salminimo FROM PARAMETROS_ANO P WHERE P.paan_ano = :ano INTO :auxtrans, :smlv;
      if (:basico < (:smlv*2)) then
       auxtrans = (:auxtrans / 30) * :diaslab;
      ELSE
       auxtrans = 0;
       IF ((conc_cod = 912) OR (conc_cod = 913) or (conc_cod = 937)) THEN
       BEGIN
        SELECT A.paan_cesemp FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
        VALOR = ((:valor + :auxtrans + :beneficios) * :PORCEN) /100;
       END
      END
      ELSE
      BEGIN
       IF (comision IS NULL) THEN
       comision = 0;
       SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
       conc_monto = :basico + :comision;
       IF (conc_porc <> 0 AND conc_porc IS NOT NULL) THEN
       VALOR = (((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans + :incap) * :conc_porc) /100;
       ELSE
       IF (:porcen <> 0 AND :porcen IS NOT NULL) THEN
       VALOR = (((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans + :incap) * :porcen) /100;
       ELSE
       IF (:montos <> 0 AND :montos IS NOT NULL) THEN
       valor = :montos;
       ELSE
       IF (:conc_monto <> 0 AND :conc_monto IS NOT NULL) THEN
       valor = :conc_monto;
      END
     END
     item = :item + 1;
    END
    ELSE
    IF (conc_prov = 'S') THEN
    BEGIN
     /*RECARGO*/
     SELECT E.empl_salario FROM EMPLEADOS E WHERE E.terc_nit = :nite INTO :basico;
     SELECT N.noex_recnoct, N.noex_recfest
     FROM NOMINA_HORASEXT N WHERE N.noex_periodio = :periodo AND N.noex_ano = :ano AND N.terc_nit = :nite
     INTO :recnoct, :recfest;
     if (recnoct is null) then
      recnoct = 0;
     if (recfest is null) then
      recfest = 0;
     SELECT P.paan_recnoc, P.paan_recfest FROM PARAMETROS_ANO P WHERE P.paan_ano = :ano INTO :tar_recnotc, :tar_recfest;
     recargo = (((:basico/30)/8)*:tar_recnotc)*:recnoct;
     recargo = :recargo + ((((:basico/30)/8)*:tar_recfest)*:recfest);
     /*BASICO*/
     SELECT N.noex_recnoct, N.noex_recfest
     FROM NOMINA_HORASEXT N WHERE N.noex_periodio = :periodo AND N.noex_ano = :ano AND N.terc_nit = :nite
     INTO :recnoct, :recfest;
     if (recnoct is null) then
      recnoct = 0;
     if (recfest is null) then
      recfest = 0;
     SELECT P.paan_recnoc, P.paan_recfest FROM PARAMETROS_ANO P WHERE P.paan_ano = :ano INTO :tar_recnotc, :tar_recfest;
     basico = ((:basico/30)*:diaslab) - (((:basico/30)/8)*:recnoct);
     basico = :basico - (((:basico/30)/8)*:recfest);
     /*BENEFICIOS*/
     SELECT SUM(ce.emco_monto)
     FROM empleado_conceptos CE, CONCEPTOS_NOMINA CN WHERE ((CE.terc_nit = :nite) AND (CE.CONC_COD = CN.CONC_COD) AND (CE.emco_fecini <= :fec AND CE.emco_fecfin >= :FEC) ) OR ((CE.terc_nit = :nite)
     AND (CE.CONC_COD = CN.CONC_COD) AND (cn.conc_todosper = 'N') AND (CE.emco_ppago = :periodo)) OR  ((CE.terc_nit = :nite) AND (CE.CONC_COD = CN.CONC_COD) AND cn.conc_todosper = 'S') AND CN.conc_benefic = 'S'
     INTO :beneficios;
     if (beneficios is null) then
      beneficios = 0;
     if ((conc_cod <> 929) and (conc_cod <> 930)) then
     begin
        SELECT P.paan_auxtr, P.paan_salminimo FROM PARAMETROS_ANO P WHERE P.paan_ano = :ano INTO :auxtrans, :smlv;
        if (:basico < (:smlv*2)) then
           auxtrans = (:auxtrans / 30) * :diaslab;
        ELSE
           auxtrans = 0;
     end
     else
      auxtrans = 0;
     conc_monto = :basico;
     IF (conc_porc <> 0 AND conc_porc IS NOT NULL) THEN
     VALOR = (((:CONC_MONTO)+ :cambsaltrans + :incap + :recargo + :auxtrans + :beneficios) * :conc_porc) /100;
     ELSE
     IF (porcen <> 0 AND porcen IS NOT NULL) THEN
     VALOR = (((:CONC_MONTO)+ :cambsaltrans + :incap + :recargo + :auxtrans + :beneficios) * :porcen) /100;
     ELSE
     IF (montos <> 0 AND montos IS NOT NULL) THEN
     VALOR = :montos;
     ELSE
     IF (conc_monto <> 0 AND conc_monto IS NOT NULL) THEN
     VALOR = :conc_monto;
     item = :item + 1;
    END
    ELSE
    IF (conc_cod = 920) THEN
    BEGIN
     SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :valor;
     IF (valor IS NULL) THEN
     valor = 0;
     item = :item + 1;
    END
    ELSE
    IF (conc_cod = 900 OR (:conc_cod = 931)) THEN
    BEGIN
     SELECT c.noex_monto FROM nomina_horasext c WHERE c.noex_ano = :ano AND c.noex_periodio = :periodo AND c.noex_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :valor;
     IF (valor IS NULL) THEN
     valor = 0;
     item = :item + 1;
    END
    ELSE
    IF (conc_cod = 932) THEN
    BEGIN
     SELECT N.nono_dura FROM NOMINA_NOVEDADES N WHERE N.terc_nit = :nite AND N.nono_periodo = :periodo AND N.nono_ano = :ano AND (N.tnov_cod = 2 OR (N.tnov_cod = 3)) INTO :diasnov;
     IF (:diasnov IS NULL) THEN
     valor = 0;
     ELSE
     valor = (:basico / 30)* :diasnov;
    END
    ELSE
    IF (conc_cod = 921) THEN
    BEGIN
     IF (porcen IS NOT NULL AND porcen <> 0) THEN
     valor = ((basico / 30)* :diaslab ) * :PORCEN /100;
     ELSE
     IF (conc_porc IS NOT NULL AND conc_porc <> 0) THEN
     valor = ((basico / 30)* :diaslab ) * :conc_porc /100;
    END
    ELSE
    if (conc_cod = 953) then
    BEGIN
       SELECT E.empl_salario FROM EMPLEADOS E WHERE E.terc_nit = :nite INTO :basico;
       SELECT N.noex_recnoct, N.noex_recfest
       FROM NOMINA_HORASEXT N WHERE N.noex_periodio = :periodo AND N.noex_ano = :ano AND N.terc_nit = :nite
       INTO :recnoct, :recfest;
       if (recnoct is null) then
        recnoct = 0;
       if (recfest is null) then
        recfest = 0;
       SELECT P.paan_recnoc, P.paan_recfest FROM PARAMETROS_ANO P WHERE P.paan_ano = :ano INTO :tar_recnotc, :tar_recfest;
       valor = (((:basico/30)/8)*:tar_recnotc)*:recnoct;
       valor = :valor + ((((:basico/30)/8)*:tar_recfest)*:recfest);
    END
    EXECUTE PROCEDURE LEE_CONFIGURACION('NOMINA','GENERAL','REDONDEO AL MULTIPLO DE DIEZ EN TOTALES')RETURNING_VALUES(:aprox);
    EXECUTE PROCEDURE REDONDEE(:valor, :aprox) RETURNING_VALUES (VALOR);
    IF ((mensual = 'N') OR (periodicidad = 1))  THEN
    INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
    VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
    ELSE
    IF (mensual = 'S') THEN
    BEGIN
     IF ((:periodicidad = 2) AND (liquidaper = 1)) THEN
     BEGIN
      IF ((periodo = 1) OR (periodo = 3) OR (periodo = 5) OR (periodo = 7) OR (periodo = 9) OR (periodo = 11)
      OR (periodo = 13) OR (periodo = 15) OR (periodo = 17) OR (periodo = 19) OR (periodo = 21) OR (periodo = 23)) THEN
      INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
      VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
     END
     ELSE
     IF ((:periodicidad = 2) AND (liquidaper = 2)) THEN
     BEGIN
      IF ((periodo = 2) OR (periodo = 4) OR (periodo = 6) OR (periodo = 8) OR (periodo = 10) OR (periodo = 12)
      OR (periodo = 14) OR (periodo = 16) OR (periodo = 18) OR (periodo = 20) OR (periodo = 22) OR (periodo = 24)) THEN
      INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
      VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
     END
     ELSE
     IF ((:periodicidad = 3) AND (liquidaper = 1)) THEN
     BEGIN
      IF ((periodo = 1) OR (periodo = 5) OR (periodo = 9) OR (periodo = 13) OR (periodo = 17) OR (periodo = 21)
      OR (periodo = 25) OR (periodo = 29) OR (periodo = 33) OR (periodo = 37) OR (periodo = 41) OR (periodo = 45)
      OR (periodo = 49)) THEN
      INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
      VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
    END
    ELSE
     IF ((:periodicidad = 3) AND (liquidaper = 2)) THEN
     BEGIN
      IF ((periodo = 2) OR (periodo = 6) OR (periodo = 10) OR (periodo = 14) OR (periodo = 18) OR (periodo = 22)
      OR (periodo = 26) OR (periodo = 30) OR (periodo = 34) OR (periodo = 38) OR (periodo = 42) OR (periodo = 46)
      OR (periodo = 50)) THEN
      INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
      VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
     END
     ELSE
     IF ((:periodicidad = 3) AND (liquidaper = 3)) THEN
     BEGIN
      IF ((periodo = 3) OR (periodo = 7) OR (periodo = 11) OR (periodo = 15) OR (periodo = 19) OR (periodo = 23)
      OR (periodo = 27) OR (periodo = 31) OR (periodo = 35) OR (periodo = 39) OR (periodo = 43) OR (periodo = 47)
      OR (periodo = 51)) THEN
      INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
      VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
     END
     ELSE
     IF ((:periodicidad = 3) AND (liquidaper = 4)) THEN
     BEGIN
      IF ((periodo = 4) OR (periodo = 8) OR (periodo = 12) OR (periodo = 16) OR (periodo = 20) OR (periodo = 24)
      OR (periodo = 29) OR (periodo = 32) OR (periodo = 36) OR (periodo = 40) OR (periodo = 44) OR (periodo = 48)
      OR (periodo = 52)) THEN
      INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
      VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
     END
    END
  VALOR = 0;
  basico = 0;
  END
 END
 END
 END
 SUSPEND;
END
^

SET TERM ; ^


SET TERM ^ ;

CREATE OR ALTER PROCEDURE IMPR_PLANILLA_NOMINA (
    id integer,
    pago char(1),
    cta char(1),
    empl char(1),
    dpto varchar(20))
returns (
    fecha date,
    observaciones blob sub_type 0 segment size 80,
    pagoglobal char(1),
    periodo integer,
    ano char(4),
    periodicidad varchar(60),
    nitempl varchar(20),
    valor numeric(18,2),
    deduc char(1),
    nombreempl varchar(60),
    nomcortconc varchar(60),
    nombreconc varchar(60),
    codconc integer,
    prov char(1),
    totalempl numeric(18,2),
    totaldeduc numeric(18,2),
    totaldeveng numeric(18,2),
    numempl integer,
    ctaempl varchar(25),
    totalctas numeric(18,2),
    totalnomi numeric(18,2),
    totalapor numeric(18,2),
    nomper varchar(60),
    org integer,
    cargoempl varchar(60),
    deptoempl varchar(60),
    numcop integer,
    nombre_copia varchar(60),
    diaslab integer,
    salario numeric(18,2),
    beneficio char(1))
as
declare variable nitant varchar(20);
declare variable nitnue varchar(20);
declare variable numconc integer;
declare variable totalnomineg numeric(18,2);
declare variable totalaporneg numeric(18,2);
declare variable par integer;
declare variable impar integer;
declare variable antdeduc char(1);
declare variable nitdeduc varchar(20);
declare variable nittot varchar(20);
declare variable nitaux varchar(20);
BEGIN
 SELECT N.nuco_copia FROM NUMERO_COPIA N WHERE N.tido_cod = 92 AND N.nuco_id = :id INTO :NUMCOP;
 IF (numcop IS NULL) THEN
 BEGIN
  numcop = 0;
  INSERT INTO NUMERO_COPIA (TIDO_COD, NUCO_ID, NUCO_COPIA) VALUES (92,:id,:numcop);
 END
 ELSE
 BEGIN
  numcop = :numcop + 1;
  UPDATE numero_copia N SET N.nuco_copia = :numcop WHERE N.tido_cod = 92 AND N.nuco_id = :id;
 END
 SELECT N.noco_nombre FROM nombres_copias N WHERE N.noco_id = :numcop INTO :nombre_copia;
 numempl = 0;
 nitant = 0;
 nitnue = 0;
 IF (PAGO = 'N') THEN
 BEGIN
  FOR SELECT N.nomi_feccausa, N.nomi_obs, N.nomi_pagoglobal, N.nomi_periodo, N.nomi_ano, P.ppag_nombre, PN.pnom_nombre FROM NOMINA N, periodo_pago P, periodo_pago_nombre PN
  WHERE P.ppag_cod = N.nomi_periodocidad AND N.nomi_id = :ID AND PN.ppag_cod = N.nomi_periodocidad AND PN.ppag_periodo = N.nomi_periodo
  INTO :fecha, :observaciones, :pagoglobal, :periodo, :ano, :periodicidad, :NOMPER
  DO
  BEGIN
   FOR SELECT NC.terc_nit, NC.noco_valor, NC.noco_deduc, T.terc_nom, C.conc_nomcorto, C.conc_nombre, NC.conc_cod, NC.noco_prov, E.empl_cargo FROM NOMINA_CONCEPTOS NC, TERCEROS T, EMPLEADOS E, CONCEPTOS_NOMINA C
   WHERE NC.nomi_id = :ID AND T.terc_nit = E.terc_nit AND C.conc_cod = NC.conc_cod AND t.terc_nit = nc.terc_nit
   INTO :nitempl, :valor, :deduc, :nombreempl, :nomcortconc, :nombreconc, :codconc, :prov, :cargoempl
   DO
   BEGIN
    IF (valor IS NULL) THEN
    valor = 0;
    SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND TERC_NIT = :nitempl INTO :totalempl;
    SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND TERC_NIT = :nitempl AND NC.noco_deduc = 'S' INTO :totaldeduc;
    SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND TERC_NIT = :nitempl AND NC.noco_deduc = 'N' INTO :totaldeveng;
    SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id INTO :totalnomi;
    SELECT SUM(NC.noco_valor*-1) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_APORTE = 'S' AND NOCO_VALOR < 0 AND NOMI_ID = :id INTO :totalaporneg;
    SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_APORTE = 'S' AND NOCO_VALOR > 0 AND NOMI_ID = :id INTO :totalapor;
    totalapor = :totalapor + totalaporneg;
    SUSPEND;
   END
   nitempl = '';
   valor = NULL;
   deduc = '';
   nombreempl = NULL;
   nomcortconc = NULL;
   nombreconc = NULL;
   codconc = NULL;
   prov = NULL;
   FOR SELECT MAX(N.conc_cod) FROM NOMINA_CONCEPTOS N WHERE N.nomi_id = :id
   GROUP BY N.conc_cod
   INTO :codconc
   DO
   BEGIN
    SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC
    WHERE NC.nomi_id = :ID AND NC.conc_cod = :codconc
    GROUP BY NC.conc_cod
    INTO :valor;
    nitempl = '';
    nombreempl = '';
    deduc = 'N';
    prov = 'N';
    SELECT C.conc_nombre,C.conc_nomcorto FROM CONCEPTOS_NOMINA C WHERE C.conc_cod = :codconc INTO :nombreconc,:nomcortconc;
    SUSPEND;
   END
   IF (EMPL = 'N') THEN
   BEGIN
     deduc = 'N';
     nomcortconc = 'DIAS LAB.';
     nombreconc = 'DIAS LAB.';
     codconc = 0;
     prov = 'N';
     valor = NULL;
     nitempl = '';
     nombreempl = '';
     SUSPEND;
     deduc = 'N';
     nomcortconc = 'SDO BASE';
     nombreconc = 'SDO BASE';
     codconc = 0;
     prov = 'N';
     valor = NULL;
     nitempl = '';
     nombreempl = '';
     SUSPEND;
  END
     FOR SELECT ND.node_diaslab, E.empl_salario, ND.terc_nit, T.terc_nom FROM NOMINA_DETALLE ND, EMPLEADOS E, TERCEROS T WHERE NOMI_ID = :id AND ND.terc_nit = E.terc_nit AND T.terc_nit = ND.terc_nit
     INTO :diaslab, :salario, :nitaux, :nombreempl
     DO
     BEGIN
      nitempl = :nitaux;
      nomcortconc = 'DIAS LAB.';
      valor = :diaslab;
      SUSPEND;
      nitempl = :nitaux;
      nomcortconc = 'SDO BASE';
      valor = :salario;
      SUSPEND;
     END
  END
 END
 ELSE
 IF (PAGO = 'S') THEN
 BEGIN
  par = 2;
  impar = 1;
  IF (EMPL = 'N') THEN
  BEGIN
     deduc = 'N';
     nomcortconc = 'DIAS LAB.';
     nombreconc = 'DIAS LAB.';
     codconc = 0;
     prov = 'N';
     valor = NULL;
     nitempl = '';
     nombreempl = '';
     SUSPEND;
     deduc = 'N';
     nomcortconc = 'SDO BASE';
     nombreconc = 'SDO BASE';
     codconc = 0;
     prov = 'N';
     valor = NULL;
     nitempl = '';
     nombreempl = '';
     SUSPEND;
     deduc = 'N';
     nomcortconc = 'TOTAL DEV';
     nombreconc = 'TOTAL DEV';
     codconc = 9999;
     prov = 'N';
     valor = NULL;
     nitempl = '';
     nombreempl = '';
     SUSPEND;
     deduc = 'S';
     nomcortconc = 'TOTAL DEDUC';
     nombreconc = 'TOTAL DEDUC';
     codconc = 99999;
     prov = 'N';
     valor = NULL;
     nitempl = '';
     nombreempl = '';
     SUSPEND;
     deduc = 'S';
     nomcortconc = 'TOTAL EMPL';
     nombreconc = 'TOTAL EMPL';
     codconc = 999999;
     prov = 'N';
     valor = NULL;
     nitempl = '';
     nombreempl = '';
     SUSPEND;
  END
  FOR SELECT N.nomi_feccausa, N.nomi_obs, N.nomi_pagoglobal, N.nomi_periodo, N.nomi_ano, P.ppag_nombre, PN.pnom_nombre FROM NOMINA N, periodo_pago P, periodo_pago_nombre PN
  WHERE P.ppag_cod = N.nomi_periodocidad AND N.nomi_id = :ID AND PN.ppag_cod = N.nomi_periodocidad AND PN.ppag_periodo = N.nomi_periodo
  INTO :fecha, :observaciones, :pagoglobal, :periodo, :ano, :periodicidad, :NOMPER
  DO
  BEGIN
    IF (EMPL = 'N') THEN
    BEGIN
     FOR SELECT MAX(N.conc_cod) FROM NOMINA_CONCEPTOS N WHERE N.nomi_id = :id AND N.noco_prov = 'N' AND N.noco_gtoempr = 'N'
     GROUP BY N.conc_cod
     INTO :codconc
     DO
     BEGIN
      SELECT NULL, MAX(NC.noco_deduc) FROM NOMINA_CONCEPTOS NC
      WHERE NC.nomi_id = :ID AND NC.conc_cod = :codconc
      GROUP BY NC.conc_cod
      INTO :valor, :deduc;
      valor = NULL;
      nitempl = '';
      nombreempl = '';
      prov = 'N';
      SELECT C.conc_nombre,C.conc_nomcorto FROM CONCEPTOS_NOMINA C WHERE C.conc_cod = :codconc INTO :nombreconc,:nomcortconc;
      SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id INTO :totalempl;
      SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND NC.noco_deduc = 'S' INTO :totaldeduc;
      SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND NC.noco_deduc = 'N' INTO :totaldeveng;
      SUSPEND;
     END
     FOR SELECT ND.node_diaslab, E.empl_salario, ND.terc_nit, T.terc_nom FROM NOMINA_DETALLE ND, EMPLEADOS E, TERCEROS T WHERE NOMI_ID = :id AND ND.terc_nit = E.terc_nit AND T.terc_nit = ND.terc_nit
     INTO :diaslab, :salario, :nitaux, :nombreempl
     DO
     BEGIN
      nitempl = :nitaux;
      nomcortconc = 'DIAS LAB.';
      valor = :diaslab;
      SUSPEND;
      nitempl = :nitaux;
      nomcortconc = 'SDO BASE';
      valor = :salario;
      SUSPEND;
     END
    END
   FOR SELECT NC.terc_nit, NC.noco_valor, NC.noco_deduc, T.terc_nom, C.conc_nomcorto, C.conc_nombre, NC.conc_cod, NC.noco_prov, E.empl_cargo, D.dpto_nombre, ND.node_diaslab,NC.terc_nit, E.empl_salario, c.conc_benefic
   FROM NOMINA_CONCEPTOS NC, TERCEROS T, EMPLEADOS E, CONCEPTOS_NOMINA C, DEPARTAMENTO D, NOMINA_DETALLE ND
   WHERE NC.nomi_id = :ID AND T.terc_nit = E.terc_nit AND C.conc_cod = NC.conc_cod AND t.terc_nit = nc.terc_nit AND D.dpto_cod = E.empl_dpto AND NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N'
   AND ND.nomi_id = :id AND ND.terc_nit = E.terc_nit
   ORDER BY T.terc_nom
   INTO :nitempl, :valor, :deduc, :nombreempl, :nomcortconc, :nombreconc, :codconc, :prov, :cargoempl,:deptoempl,:diaslab,:nitnue, :salario, :beneficio
   DO
   BEGIN
    IF ((nitnue <> nitant) AND (nitnue IS NOT NULL)) THEN
     numempl = :numempl + 1;
    IF (valor IS NULL) THEN
    valor = 0;
    IF (nitempl <> nitdeduc) THEN
    BEGIN
     par = 2;
     impar = 1;
    END
    nitdeduc = :nitempl;
    IF (:deduc = 'S') THEN
    BEGIN
     antdeduc = 'S';
     org = :par;
     par = :par + 2;
    END
    ELSE
    BEGIN
     antdeduc = 'N';
     org = :impar;
     impar = :impar + 2;
    END
    SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND TERC_NIT = :nitempl INTO :totalempl;
    SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND TERC_NIT = :nitempl AND NC.noco_deduc = 'S' INTO :totaldeduc;
    SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND TERC_NIT = :nitempl AND NC.noco_deduc = 'N' INTO :totaldeveng;
    IF (cta = 'S') THEN
    BEGIN
     SELECT COUNT(CONC_COD) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND TERC_NIT = :nitempl INTO :numconc;
     totalempl = totalempl / :numconc;
     SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND TERC_NIT = :nitempl INTO :totalctas;
    END
    SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id INTO :totalnomi;
    SELECT SUM(NC.noco_valor*-1) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_APORTE = 'S' AND NOCO_VALOR < 0 AND NOMI_ID = :id INTO :totalaporneg;
    SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_APORTE = 'S' AND NOCO_VALOR > 0 AND NOMI_ID = :id INTO :totalapor;
    totalapor = :totalapor + totalaporneg;
   SUSPEND;
    IF ((nitnue <> nitant) AND (nitnue IS NOT NULL) AND (EMPL = 'N')) THEN
    BEGIN
     deduc = 'N';
     nomcortconc = 'TOTAL DEV';
     nombreconc = 'TOTAL DEV';
     codconc = 9999;
     prov = 'N';
     SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND NC.noco_deduc = 'N' AND NC.terc_nit = : nitempl INTO :VALOR;
     SUSPEND;
     deduc = 'S';
     nomcortconc = 'TOTAL DEDUC';
     nombreconc = 'TOTAL DEDUC';
     codconc = 99999;
     prov = 'N';
     SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND NC.noco_deduc = 'S' AND NC.terc_nit = :nitempl INTO :VALOR;
     SUSPEND;
     deduc = 'S';
     nomcortconc = 'TOTAL EMPL';
     nombreconc = 'TOTAL EMPL';
     codconc = 999999;
     prov = 'N';
     SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND NC.terc_nit = :nitempl INTO :VALOR;
     nitant = :nitnue;
     SUSPEND;
    END
   END
   numempl = :numempl + 1;
   IF ( EMPL = 'N') THEN
   BEGIN
    nitempl = '';
    valor = NULL;
    deduc = '';
    nombreempl = NULL;
    nomcortconc = NULL;
    nombreconc = NULL;
    codconc = NULL;
    prov = NULL;
    totalempl = NULL;
    ctaempl = NULL;
    IF (cta = 'N') THEN
    BEGIN
     FOR SELECT MAX(N.conc_cod) FROM NOMINA_CONCEPTOS N WHERE N.nomi_id = :id AND N.noco_prov = 'N' AND N.noco_gtoempr = 'N'
     GROUP BY N.conc_cod
     INTO :codconc
     DO
     BEGIN
     IF (dpto IS NOT NULL AND (DPTO <> '') ) THEN
     BEGIN
      SELECT SUM(NC.noco_valor), MAX(NC.noco_deduc) FROM NOMINA_CONCEPTOS NC, EMPLEADOS E, DEPARTAMENTO D
      WHERE NC.nomi_id = :ID AND NC.conc_cod = :codconc AND D.dpto_cod = E.empl_dpto AND NC.terc_nit = E.terc_nit AND d.dpto_cod = :dpto
      GROUP BY NC.conc_cod
      INTO :valor, :deduc;
      nitempl = '-';
      nombreempl = 'TOTAL';
      deptoempl = '-';
      prov = 'N';
      SELECT C.conc_nombre,C.conc_nomcorto FROM CONCEPTOS_NOMINA C WHERE C.conc_cod = :codconc INTO :nombreconc,:nomcortconc;
      SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC, EMPLEADOS E, DEPARTAMENTO D WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id  AND D.dpto_cod = E.empl_dpto AND NC.terc_nit = E.terc_nit INTO :totalempl;
      SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC, EMPLEADOS E, DEPARTAMENTO D WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND NC.noco_deduc = 'S'  AND D.dpto_cod = E.empl_dpto AND NC.terc_nit = E.terc_nit INTO :totaldeduc;
      SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC, EMPLEADOS E, DEPARTAMENTO D WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND NC.noco_deduc = 'N'  AND D.dpto_cod = E.empl_dpto AND NC.terc_nit = E.terc_nit INTO :totaldeveng;
     END
     ELSE
     BEGIN
      SELECT SUM(NC.noco_valor), MAX(NC.noco_deduc) FROM NOMINA_CONCEPTOS NC
      WHERE NC.nomi_id = :ID AND NC.conc_cod = :codconc
      GROUP BY NC.conc_cod
      INTO :valor, :deduc;
      nitempl = '-';
      nombreempl = 'TOTAL';
      deptoempl = '-';
      prov = 'N';
      SELECT C.conc_nombre,C.conc_nomcorto FROM CONCEPTOS_NOMINA C WHERE C.conc_cod = :codconc INTO :nombreconc,:nomcortconc;
      SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id INTO :totalempl;
      SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND NC.noco_deduc = 'S' INTO :totaldeduc;
      SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND NC.noco_deduc = 'N' INTO :totaldeveng;
     END
      SUSPEND;
     END
     IF (dpto IS NOT NULL AND (DPTO <> '') ) THEN
     BEGIN
     deduc = 'N';
     nomcortconc = 'TOTAL DEV';
     nombreconc = 'TOTAL DEV';
     codconc = 9999;
     deptoempl = '-';
     prov = 'N';
     SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC, EMPLEADOS E, DEPARTAMENTO D WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id  AND D.dpto_cod = E.empl_dpto AND NC.terc_nit = E.terc_nit AND d.dpto_cod = :dpto INTO :VALOR;
     nitempl = '-';
     nombreempl = 'TOTAL';
     SUSPEND;
     deduc = 'S';
     nomcortconc = 'TOTAL DEDUC';
     nombreconc = 'TOTAL DEDUC';
     codconc = 99999;
     deptoempl = '-';
     prov = 'N';
     SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC, EMPLEADOS E, DEPARTAMENTO D WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND NC.noco_deduc = 'S'  AND D.dpto_cod = E.empl_dpto AND d.dpto_cod = :dpto AND NC.terc_nit = E.terc_nit INTO :VALOR;
     nitempl = '-';
     nombreempl = 'TOTAL';
     SUSPEND;
     deduc = 'S';
     nomcortconc = 'TOTAL EMPL';
     nombreconc = 'TOTAL EMPL';
     codconc = 999999;
     deptoempl = '-';
     prov = 'N';
     SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC, EMPLEADOS E, DEPARTAMENTO D WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND NC.noco_deduc = 'N'  AND D.dpto_cod = E.empl_dpto AND d.dpto_cod = :dpto AND NC.terc_nit = E.terc_nit INTO :VALOR;
     nitempl = '-';
     nombreempl = 'TOTAL';
     SUSPEND;
     END
     ELSE
     BEGIN
     deduc = 'N';
     nomcortconc = 'TOTAL DEV';
     nombreconc = 'TOTAL DEV';
     codconc = 9999;
     prov = 'N';
     SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND NC.noco_deduc = 'N' INTO :VALOR;
     nitempl = '-';
     nombreempl = 'TOTAL';
     SUSPEND;
     deduc = 'S';
     nomcortconc = 'TOTAL DEDUC';
     nombreconc = 'TOTAL DEDUC';
     codconc = 99999;
     prov = 'N';
     SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND NC.noco_deduc = 'S' INTO :VALOR;
     nitempl = '-';
     nombreempl = 'TOTAL';
     SUSPEND;
     deduc = 'S';
     nomcortconc = 'TOTAL EMPL';
     nombreconc = 'TOTAL EMPL';
     codconc = 999999;
     prov = 'N';
     SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N'  AND NOMI_ID = :id INTO :VALOR;
     nitempl = '-';
     nombreempl = 'TOTAL';
     SUSPEND;
     END
     END
   END
  END
 END
END
^

SET TERM ; ^

UPDATE REVISION SET REVI_NOMINA = '2009/07/28';
SET TERM ^ ;

CREATE OR ALTER PROCEDURE CAUSA_NOMINA(
    fec DATE,
    periodo INTEGER,
    periodicidad INTEGER,
    pagoglobal CHAR(1),
    ano CHAR(4),
    depto INTEGER)
RETURNS (
    idnomina INTEGER,
    itemini INTEGER)
AS
DECLARE VARIABLE item INTEGER;
DECLARE VARIABLE nite VARCHAR(20) CHARACTER SET none;
DECLARE VARIABLE nit_tercero VARCHAR(20);
DECLARE VARIABLE concept INTEGER;
DECLARE VARIABLE montos NUMERIC(18,2);
DECLARE VARIABLE porcen NUMERIC(9,4);
DECLARE VARIABLE entidad VARCHAR(20);
DECLARE VARIABLE conc_cod INTEGER;
DECLARE VARIABLE conc_deduc CHAR(1);
DECLARE VARIABLE conc_porc NUMERIC(9,4);
DECLARE VARIABLE conc_entidad INTEGER;
DECLARE VARIABLE conc_monto NUMERIC(18,2);
DECLARE VARIABLE conc_modifi CHAR(1);
DECLARE VARIABLE conc_promedio CHAR(1);
DECLARE VARIABLE emco_perprom INTEGER;
DECLARE VARIABLE valor NUMERIC(18,2);
DECLARE VARIABLE diaslab INTEGER;
DECLARE VARIABLE conc_prov CHAR(1);
DECLARE VARIABLE conc_aporte CHAR(1);
DECLARE VARIABLE numeroprom INTEGER;
DECLARE VARIABLE conc_aplicaprom CHAR(1);
DECLARE VARIABLE perinicial INTEGER;
DECLARE VARIABLE anoprom INTEGER;
DECLARE VARIABLE conc_dias CHAR(1);
DECLARE VARIABLE conc_otroconc CHAR(1);
DECLARE VARIABLE conc_codotroconc INTEGER;
DECLARE VARIABLE anosum INTEGER;
DECLARE VARIABLE salario CHAR(1) CHARACTER SET none;
DECLARE VARIABLE liquidaper INTEGER;
DECLARE VARIABLE rmod NUMERIC(2,2);
DECLARE VARIABLE basico NUMERIC(18,2);
DECLARE VARIABLE niteps VARCHAR(20);
DECLARE VARIABLE nitafc VARCHAR(20);
DECLARE VARIABLE nitafp VARCHAR(20);
DECLARE VARIABLE nitccf VARCHAR(20);
DECLARE VARIABLE gtoempr CHAR(1);
DECLARE VARIABLE comision NUMERIC(18,2);
DECLARE VARIABLE cambsaltrans NUMERIC(18,2);
DECLARE VARIABLE saldosini NUMERIC(18,2);
DECLARE VARIABLE duranov INTEGER;
DECLARE VARIABLE base NUMERIC(18,2);
DECLARE VARIABLE aprox INTEGER;
DECLARE VARIABLE mensual CHAR(1);
DECLARE VARIABLE horasex NUMERIC(18,2);
DECLARE VARIABLE diasnov INTEGER;
DECLARE VARIABLE tomasal INTEGER;
DECLARE VARIABLE retroact NUMERIC(18,2);
DECLARE VARIABLE reembolso NUMERIC(18,2);
DECLARE VARIABLE incap NUMERIC(18,2);
DECLARE VARIABLE deptoempl INTEGER;
DECLARE VARIABLE auxtrans NUMERIC(18,2);
DECLARE VARIABLE smlv NUMERIC(18,2);
DECLARE VARIABLE beneficios NUMERIC(18,2);
DECLARE VARIABLE confirmado CHAR(1);
DECLARE VARIABLE recnoct NUMERIC(18,2);
DECLARE VARIABLE recfest NUMERIC(18,2);
DECLARE VARIABLE tar_recnotc NUMERIC(9,4);
DECLARE VARIABLE tar_recfest NUMERIC(9,4);
DECLARE VARIABLE recargo NUMERIC(18,2);
DECLARE VARIABLE basicorec NUMERIC(18,2);
BEGIN
 SELECT N.NOMI_ID, N.nomi_liqok FROM NOMINA N WHERE N.nomi_periodo = :periodo AND N.nomi_periodocidad = :periodicidad AND N.nomi_ano = :ano
 INTO :IDNOMINA, :CONFIRMADO;
 IF (:idnomina IS NULL) THEN
 BEGIN
  EXECUTE PROCEDURE cambie_id_nomina RETURNING_VALUES(:idnomina);
  INSERT INTO nomina (nomi_id, NOMI_FECCAUSA, NOMI_PAGOGLOBAL, NOMI_PERIODOCIDAD, NOMI_PERIODO, NOMI_ANO, NOMI_LIQOK)
  VALUES (:IDNOMINA, :fec,:pagoglobal, :periodicidad, :periodo, :ano, 'N');
  item = 1;
 END
 ELSE
 BEGIN
  SELECT MAX(N.noco_item) FROM NOMINA_CONCEPTOS N WHERE N.nomi_id = :idnomina
  INTO :item;
 END
 IF ((confirmado = 'S') AND (idnomina IS NOT NULL)) THEN
 BEGIN
  idnomina = 0;
 END
 ELSE
 BEGIN
 IF (DEPTO = 0) THEN
  INSERT INTO NOMINA_DEPARTAMENTO (nomi_id, nodp_depto)VALUES(:IDNOMINA,0);
 ELSE
  INSERT INTO NOMINA_DEPARTAMENTO (nomi_id, nodp_depto)VALUES(:IDNOMINA,:DEPTO);
 ITEMINI = ITEM;
 FOR SELECT E.TERC_NIT, E.empl_salario, e.empl_eps, e.empl_afc, e.empl_afp, e.empl_ccf, e.empl_dpto
 FROM EMPLEADOS E
 WHERE E.empl_ppago = :periodicidad AND ((E.empl_fecret IS NULL) OR (E.empl_fecret > :fec)) AND E.empl_fecing <= :fec
 INTO :nite, :basico, :niteps, :nitafc, :nitafp, :nitccf, :deptoempl
 DO
 BEGIN
 IF ((depto = 0) OR (deptoempl = :depto)) THEN
 BEGIN
  FOR SELECT CE.TERC_NIT, CE.CONC_COD, CE.EMCO_MONTO, CE.EMCO_PORC, ce.empl_entidad, CE.emco_perprom, CE.emco_luquidaper, CE.emco_mensual, CN.CONC_COD, CN.CONC_DEDUC,CN.CONC_PORC, CN.CONC_ENTIDAD, CN.CONC_MONTO,  CN.CONC_DIAS, CN.CONC_MODIFI,
  CN.CONC_PROMEDIO, CN.conc_salario, CE.emco_perprom, CN.conc_prov, CN.conc_aporte, CN.conc_aplicaprom, cn.conc_otroconc, cn.conc_codotroconc, CN.conc_gtoempr, CN.conc_base, CE.emco_tomsal
  FROM empleado_conceptos CE, CONCEPTOS_NOMINA CN WHERE ((CE.terc_nit = :nite) AND (CE.CONC_COD = CN.CONC_COD) AND (CE.emco_fecini <= :fec AND CE.emco_fecfin >= :FEC) ) OR ((CE.terc_nit = :nite)
  AND (CE.CONC_COD = CN.CONC_COD) AND (cn.conc_todosper = 'N') AND (CE.emco_ppago = :periodo)) OR  ((CE.terc_nit = :nite) AND (CE.CONC_COD = CN.CONC_COD) AND cn.conc_todosper = 'S')  ORDER BY (TERC_NIT )
  INTO :nit_tercero, :concept,  :montos, :porcen, :entidad, :numeroprom, :liquidaper, :mensual ,:CONC_COD, :CONC_DEDUC, :CONC_PORC,
  :CONC_ENTIDAD, :CONC_MONTO, :CONC_DIAS, :CONC_MODIFI,:CONC_PROMEDIO, :salario,:EMCO_PERPROM, :conc_prov, :conc_aporte , :CONC_APLICAPROM, :conc_otroconc, :conc_codotroconc, :gtoempr, :base, :tomasal
  DO
  BEGIN
   IF (conc_dias = 'S') THEN
   EXECUTE PROCEDURE DIAS_LABORADOS (:nite, :periodo, :fec, :mensual,:conc_aporte) RETURNING_VALUES (:diaslab);
   ELSE
   BEGIN
    diaslab = 15;
    IF (mensual = 'S') THEN
    BEGIN
     IF (periodicidad = 2) THEN
     diaslab = 30;
     ELSE
     IF (liquidaper = 3) THEN
     diaslab = 30;
    END
   END
   IF (:tomasal <> 0) THEN
   BEGIN
    IF ((:periodicidad = 2) AND (:tomasal <> 2)) THEN
    BEGIN
     IF ((periodo = 2) OR (periodo = 4) OR (periodo = 6) OR (periodo = 8) OR (periodo = 10) OR (periodo = 12)
     OR (periodo = 14) OR (periodo = 16) OR (periodo = 18) OR (periodo = 20) OR (periodo = 22) OR (periodo = 24)) THEN
     basico = 0;
    END
    ELSE
    IF ((:periodicidad = 3) AND (:tomasal <> 1)) THEN
    BEGIN
     IF ((periodo = 1) OR (periodo = 5) OR (periodo = 9) OR (periodo = 13) OR (periodo = 17) OR (periodo = 21)
     OR (periodo = 25) OR (periodo = 29) OR (periodo = 33) OR (periodo = 37) OR (periodo = 41) OR (periodo = 45)
     OR (periodo = 49)) THEN
     basico = 0;
    END
    ELSE
     IF ((:periodicidad = 3) AND (:tomasal <> 2)) THEN
     BEGIN
      IF ((periodo = 2) OR (periodo = 6) OR (periodo = 10) OR (periodo = 14) OR (periodo = 18) OR (periodo = 22)
      OR (periodo = 26) OR (periodo = 30) OR (periodo = 34) OR (periodo = 38) OR (periodo = 42) OR (periodo = 46)
      OR (periodo = 50)) THEN
      basico = 0;
     END
     ELSE
     IF ((:periodicidad = 3) AND (:tomasal <> 3)) THEN
     BEGIN
      IF ((periodo = 3) OR (periodo = 7) OR (periodo = 11) OR (periodo = 15) OR (periodo = 19) OR (periodo = 23)
      OR (periodo = 27) OR (periodo = 31) OR (periodo = 35) OR (periodo = 39) OR (periodo = 43) OR (periodo = 47)
      OR (periodo = 51)) THEN
      basico = 0;
     END
     ELSE
     IF ((:periodicidad = 3) AND (:tomasal <> 4)) THEN
     BEGIN
      IF ((periodo = 4) OR (periodo = 8) OR (periodo = 12) OR (periodo = 16) OR (periodo = 20) OR (periodo = 24)
      OR (periodo = 29) OR (periodo = 32) OR (periodo = 36) OR (periodo = 40) OR (periodo = 44) OR (periodo = 48)
      OR (periodo = 52)) THEN
      basico = 0;
     END
   END
   ELSE
    BEGIN
     SELECT E.empl_salario FROM EMPLEADOS E WHERE E.terc_nit = :nite INTO :basico;
    END
    SELECT ((n.nono_valor /30) * n.nono_dura), (n.nono_dura) FROM nomina_novedades n WHERE n.tnov_cod = 11 AND n.terc_nit = :nite AND n.nono_periodo = :periodo INTO :cambsaltrans, :duranov;
    IF (cambsaltrans IS NULL) THEN
    cambsaltrans = 0;
    IF (duranov IS NULL) THEN
    duranov = 0;
    diaslab = :diaslab - :duranov;
    IF (conc_cod = 922) THEN
    BEGIN
     SELECT SUM(P.prcu_monto) FROM prestamo_cuotas P, prestamo_nomina PN WHERE P.prcu_ano = :ano AND P.prcu_periodo = :periodo AND PN.prno_id = P.prno_id AND PN.terc_nit = :nite INTO :valor;
     IF (valor IS NULL) THEN
     valor = 0;
     item = :item + 1;
     UPDATE prestamo_cuotas  P SET prcu_ok = 'S' WHERE P.prcu_ano = :ano AND P.prcu_periodo = :periodo AND P.prno_id = (SELECT PN.prno_id FROM PRESTAMO_NOMINA PN WHERE PN.terc_nit = :nite);
    END
    ELSE
    IF ((:montos = 0) OR (:montos IS NULL)) THEN
    BEGIN
     IF ((CONC_PORC = 0 AND :porcen = 0) OR (CONC_PORC IS NULL AND :porcen = 0) OR (CONC_PORC = 0 AND :porcen IS NULL) OR (CONC_PORC IS NULL AND :porcen IS NULL) ) THEN
     BEGIN
      IF ((conc_monto <> 0) AND (conc_monto IS NOT NULL) ) THEN
      BEGIN
       VALOR = :CONC_MONTO;
       IF (:conc_dias = 'S') THEN
       valor = (:valor / 30) * :diaslab;
      END
      ELSE
      IF (salario = 'S' AND CONC_COD <> 900 AND CONC_COD <> 920 AND conc_cod <> 932 AND CONC_COD <> 953) THEN
      BEGIN
       SELECT E.empl_salario FROM EMPLEADOS E WHERE E.terc_nit = :nite INTO :basico;
       SELECT N.noex_recnoct, N.noex_recfest
       FROM NOMINA_HORASEXT N WHERE N.noex_periodio = :periodo AND N.noex_ano = :ano AND N.terc_nit = :nite
       INTO :recnoct, :recfest;
       IF (recnoct IS NULL) THEN
        recnoct = 0;
       IF (recfest IS NULL) THEN
        recfest = 0;
       SELECT P.paan_recnoc, P.paan_recfest FROM PARAMETROS_ANO P WHERE P.paan_ano = :ano INTO :tar_recnotc, :tar_recfest;
       basico = ((:basico/30)*:diaslab) - (((:basico/30)/8)*:recnoct);
       basico = :basico - (((:basico/30)/8)*:recfest);
       conc_monto = :basico;
       VALOR = (:conc_monto/*/30 * :diaslab*/ ) + :cambsaltrans;
      END
      ELSE
      BEGIN
       valor = montos;
       IF (:conc_dias = 'S') THEN
       valor = (:valor / 30) * :diaslab;
      END
     END
     ELSE
     BEGIN
      IF (:porcen <> 0) THEN
      BEGIN
       IF ((conc_monto <> 0) AND (conc_monto IS NOT NULL) ) THEN
       BEGIN
        VALOR = ((:CONC_MONTO ) * :PORCEN) /100;
       END
      END
      ELSE
      BEGIN
       IF ((conc_monto <> 0) AND (conc_monto IS NOT NULL) ) THEN
       BEGIN
        VALOR = ((:CONC_MONTO) * :conc_porc) /100;
       END
       ELSE
       IF (salario = 'S' AND CONC_COD <> 900 AND CONC_COD <> 920 AND conc_cod <> 932 AND CONC_COD <> 953) THEN
       BEGIN
       SELECT E.empl_salario FROM EMPLEADOS E WHERE E.terc_nit = :nite INTO :basico;
       SELECT N.noex_recnoct, N.noex_recfest
       FROM NOMINA_HORASEXT N WHERE N.noex_periodio = :periodo AND N.noex_ano = :ano AND N.terc_nit = :nite
       INTO :recnoct, :recfest;
       IF (recnoct IS NULL) THEN
        recnoct = 0;
       IF (recfest IS NULL) THEN
        recfest = 0;
       SELECT P.paan_recnoc, P.paan_recfest FROM PARAMETROS_ANO P WHERE P.paan_ano = :ano INTO :tar_recnotc, :tar_recfest;
       basico = ((:basico/30)*:diaslab) - (((:basico/30)/8)*:recnoct);
       basico = :basico - (((:basico/30)/8)*:recfest);
        conc_monto = :basico;
        VALOR = ((:CONC_MONTO)+ :cambsaltrans * :conc_porc) /100;
       END
       ELSE
       IF (:conc_monto = 0 AND :montos = 0) THEN
       BEGIN
        conc_monto = :basico;
        VALOR = (((:CONC_MONTO / 30) * :diaslab) + :cambsaltrans * :conc_porc) /100;
       END
      END
     END
    END
    ELSE
    IF ((CONC_PORC = 0 OR (conc_porc IS NULL)) AND (:porcen = 0 OR (porcen IS NULL))) THEN
    BEGIN
     VALOR = (:montos);
     IF (:conc_dias = 'S') THEN
     valor = (:valor / 30) * :diaslab;
    END
    ELSE
    IF (:porcen <> 0 AND porcen IS NOT NULL) THEN
    BEGIN
     VALOR = ((:MONTOS ) * :PORCEN) /100;
    END
    ELSE
    BEGIN
     VALOR = ((:montos) * :CONC_PORC) /100;
    END
    IF (conc_promedio = 'S') THEN
    BEGIN
     perinicial = :periodo - (:numeroprom) + 1;
     anoprom = CAST (ano AS INTEGER);
     IF (perinicial <= 0) THEN
     BEGIN
      perinicial = 1;
      anoprom = CAST(ANO AS INTEGER) - 1;
     END
     SELECT SUM (noco_valor) FROM nomina_conceptos n WHERE n.noco_aplicaprom = 'S' AND N.noco_periodo >= :perinicial - 1 AND N.noco_periodo < :periodo AND N.noco_ano >= :anoprom AND N.noco_ano <= :ano AND terc_nit = :nite INTO :valor;
     valor = ((valor ) / (numeroprom -1 ));
     SELECT NOCO_VALOR FROM NOMINA_CONCEPTOS WHERE CONC_COD = :conc_cod AND TERC_NIT  = :nite AND NOCO_PAGOOK = 'N' AND NOCO_PERIODO = 0 INTO :saldosini;
     IF (saldosini IS NULL) THEN
     saldosini = 0;
     ELSE
     UPDATE nomina_conceptos N SET noco_pagook = 'S' WHERE n.noco_aplicaprom = 'S' AND N.noco_periodo >= :perinicial - 1 AND N.noco_periodo < :periodo AND N.noco_ano >= :anoprom AND N.noco_ano <= :ano  AND CONC_COD = :conc_cod AND terc_nit = :nite AND NOCO_PERIODO = 0;
     VALOR = :valor + :saldosini;
     UPDATE nomina_conceptos N SET noco_pagook = 'S' WHERE n.noco_aplicaprom = 'S' AND N.noco_periodo >= :perinicial - 1 AND N.noco_periodo < :periodo AND N.noco_ano >= :anoprom AND N.noco_ano <= :ano  AND CONC_COD = :conc_cod AND terc_nit = :nite;
    END
    ELSE
    IF (conc_otroconc = 'S') THEN
    BEGIN
     anosum = CAST(ano AS INTEGER);
     anosum = anosum - 1;
     SELECT SUM (noco_valor) FROM nomina_conceptos n WHERE n.noco_ano = :anosum AND n.conc_cod = :conc_codotroconc AND N.terc_nit = :nite INTO :valor;
     SELECT NOCO_VALOR FROM NOMINA_CONCEPTOS WHERE noco_ano = :anosum AND conc_cod = :conc_codotroconc AND terc_nit = :nite AND NOCO_PERIODO = 0 INTO :saldosini;
     IF (saldosini IS NULL) THEN
     saldosini = 0;
     ELSE
     UPDATE nomina_conceptos SET noco_pagook = 'S' WHERE noco_ano = :anosum AND conc_cod = :conc_codotroconc AND NOCO_PERIODO = 0 AND terc_nit = :nite;
     VALOR = :valor + :saldosini;
     UPDATE nomina_conceptos SET noco_pagook = 'S' WHERE noco_ano = :anosum AND conc_cod = :conc_codotroconc AND terc_nit = :nite;
    END
    ELSE
    IF (conc_aporte = 'S') THEN
    BEGIN
     horasex = NULL;
     diasnov = NULL;
     retroact = NULL;
     reembolso = NULL;
     beneficios = NULL;
     recargo = NULL;
     comision = NULL;
     IF ((:entidad = '' ) OR (entidad IS NULL)) THEN
     BEGIN
      /*COMISIONES*/
      SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
      IF (comision IS NULL) THEN
      comision = 0;
      /*RETROACTIVO*/
      SELECT C.emco_monto FROM EMPLEADO_CONCEPTOS C WHERE C.terc_nit = :nite AND C.conc_cod = 933 INTO :retroact;
      IF (retroact IS NULL ) THEN
      retroact = 0;
      /*REEMBOLSO*/
      SELECT C.emco_monto FROM EMPLEADO_CONCEPTOS C WHERE C.terc_nit = :nite AND C.conc_cod = 952 INTO :reembolso;
      IF (reembolso IS NULL ) THEN
      reembolso = 0;
      /*INCAPACIDAD*/
      SELECT N.nono_dura FROM NOMINA_NOVEDADES N WHERE N.terc_nit = :nite AND N.nono_periodo = :periodo AND N.nono_ano = :ano AND (N.tnov_cod = 2 OR (N.tnov_cod = 3)) INTO :diasnov;
      IF (:diasnov IS NULL) THEN
      incap = 0;
      ELSE
      incap = (:basico / 30)* :diasnov;
      /*BASICO*/
      SELECT N.noex_recnoct, N.noex_recfest
      FROM NOMINA_HORASEXT N WHERE N.noex_periodio = :periodo AND N.noex_ano = :ano AND N.terc_nit = :nite
      INTO :recnoct, :recfest;
      IF (recnoct IS NULL) THEN
       recnoct = 0;
      IF (recfest IS NULL) THEN
       recfest = 0;
      SELECT P.paan_recnoc, P.paan_recfest FROM PARAMETROS_ANO P WHERE P.paan_ano = :ano INTO :tar_recnotc, :tar_recfest;
      basico = ((:basico/30)*:diaslab) - (((:basico/30)/8)*:recnoct);
      basico = :basico - (((:basico/30)/8)*:recfest);
      /*HORAS EXTRA*/
      SELECT c.noex_monto FROM nomina_horasext c WHERE c.noex_ano = :ano AND c.noex_periodio = :periodo AND c.noex_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :horasex;
      IF (horasex IS NULL) THEN
       horasex = 0;
      /*RECARGOS*/
      SELECT E.empl_salario FROM EMPLEADOS E WHERE E.terc_nit = :nite INTO :basicorec;
      SELECT N.noex_recnoct, N.noex_recfest
      FROM NOMINA_HORASEXT N WHERE N.noex_periodio = :periodo AND N.noex_ano = :ano AND N.terc_nit = :nite
      INTO :recnoct, :recfest;
      IF (recnoct IS NULL) THEN
       recnoct = 0;
      IF (recfest IS NULL) THEN
       recfest = 0;
      SELECT P.paan_recnoc, P.paan_recfest FROM PARAMETROS_ANO P WHERE P.paan_ano = :ano INTO :tar_recnotc, :tar_recfest;
      recargo = (((:basicorec/30)/8)*:tar_recnotc)*:recnoct;
      recargo = :recargo + ((((:basicorec/30)/8)*:tar_recfest)*:recfest);
      /*SMLV Y AUX. TRANSPORTE*/
      SELECT P.paan_auxtr, P.paan_salminimo FROM PARAMETROS_ANO P WHERE P.paan_ano = :ano INTO :auxtrans, :smlv;
      /*BASE*/
      IF (:basico + :comision + :horasex + :retroact+ :reembolso + :incap+ :cambsaltrans < ((:smlv/30)*:diaslab)) THEN
       valor = (:smlv/30)*:diaslab;
      ELSE
       valor = :basico + :comision + :horasex + :retroact+ :reembolso + :incap + :recargo + :cambsaltrans;
      IF ((conc_cod = 904) OR (conc_cod = 905) OR (conc_cod = 906) OR (conc_cod = 934) ) THEN
      BEGIN
       entidad = :nitafp;
       IF (conc_cod = 904) THEN
       BEGIN
        SELECT A.paan_afptr FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
        VALOR = ((:valor) * :PORCEN) /100;
       END
       ELSE
       IF ((conc_cod = 905) OR (conc_cod = 906) OR (conc_cod = 934)) THEN
       BEGIN
        SELECT A.paan_afpem FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
        VALOR = ((:valor) * :PORCEN) /100;
       END
      END
      ELSE
      IF ((conc_cod = 907) OR (conc_cod = 914) OR (conc_cod = 915) OR (conc_cod = 938) ) THEN
      BEGIN
       entidad = :niteps;
       IF (conc_cod = 907) THEN
       BEGIN
        SELECT A.paan_epstr FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
        VALOR = ((:valor) * :PORCEN) /100;
       END
       ELSE
       IF ((conc_cod = 914) OR (conc_cod = 915) OR (conc_cod = 938)) THEN
       BEGIN
        SELECT A.paan_epsem FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
        VALOR = ((:valor) * :PORCEN) /100;
       END
      END
      ELSE
      IF ((conc_cod = 910) OR (conc_cod = 911) OR (conc_cod = 916) OR (conc_cod = 917) OR (conc_cod = 918) OR (conc_cod = 919) OR (conc_cod = 936) OR (conc_cod = 939) OR (conc_cod = 940)) THEN
      BEGIN
       entidad = :nitccf;
       IF ((conc_cod = 910) OR (conc_cod = 911) OR (conc_cod = 936)) THEN
       BEGIN
        SELECT A.paan_ccf FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
        VALOR = ((:valor) * :PORCEN) /100;
       END
       ELSE
       IF ((conc_cod = 916) OR (conc_cod = 917) OR (conc_cod = 939)) THEN
       BEGIN
        SELECT A.paan_icbf FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
        VALOR = ((:valor) * :PORCEN) /100;
       END
       ELSE
       IF ((conc_cod = 918) OR (conc_cod = 919) OR (conc_cod = 940)) THEN
       BEGIN
        SELECT A.paan_sena FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
        VALOR = ((:valor) * :PORCEN) /100;
       END
      END
      ELSE
      IF ((conc_cod = 912) OR (conc_cod = 913)) THEN
      BEGIN
       entidad = :nitafc;
      SELECT SUM(ce.emco_monto)
      FROM empleado_conceptos CE, CONCEPTOS_NOMINA CN WHERE ((CE.terc_nit = :nite) AND (CE.CONC_COD = CN.CONC_COD) AND (CE.emco_fecini <= :fec AND CE.emco_fecfin >= :FEC) ) OR ((CE.terc_nit = :nite)
      AND (CE.CONC_COD = CN.CONC_COD) AND (cn.conc_todosper = 'N') AND (CE.emco_ppago = :periodo)) OR  ((CE.terc_nit = :nite) AND (CE.CONC_COD = CN.CONC_COD) AND cn.conc_todosper = 'S') AND CN.conc_benefic = 'S'
      INTO :beneficios;
      IF (beneficios IS NULL) THEN
       beneficios = 0;
      SELECT P.paan_auxtr, P.paan_salminimo FROM PARAMETROS_ANO P WHERE P.paan_ano = :ano INTO :auxtrans, :smlv;
      IF (:basico < (:smlv*2)) THEN
       auxtrans = (:auxtrans / 30) * :diaslab;
      ELSE
       auxtrans = 0;
       IF ((conc_cod = 912) OR (conc_cod = 913) OR (conc_cod = 937)) THEN
       BEGIN
        SELECT A.paan_cesemp FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
        VALOR = ((:valor + :auxtrans + :beneficios) * :PORCEN) /100;
       END
      END
      ELSE
      BEGIN
       IF (comision IS NULL) THEN
       comision = 0;
       SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
       conc_monto = :basico + :comision;
       IF (conc_porc <> 0 AND conc_porc IS NOT NULL) THEN
       VALOR = (((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans + :incap) * :conc_porc) /100;
       ELSE
       IF (:porcen <> 0 AND :porcen IS NOT NULL) THEN
       VALOR = (((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans + :incap) * :porcen) /100;
       ELSE
       IF (:montos <> 0 AND :montos IS NOT NULL) THEN
       valor = :montos;
       ELSE
       IF (:conc_monto <> 0 AND :conc_monto IS NOT NULL) THEN
       valor = :conc_monto;
      END
     END
     item = :item + 1;
    END
    ELSE
    IF (conc_prov = 'S') THEN
    BEGIN
     /*RECARGO*/
     SELECT E.empl_salario FROM EMPLEADOS E WHERE E.terc_nit = :nite INTO :basico;
     SELECT N.noex_recnoct, N.noex_recfest
     FROM NOMINA_HORASEXT N WHERE N.noex_periodio = :periodo AND N.noex_ano = :ano AND N.terc_nit = :nite
     INTO :recnoct, :recfest;
     IF (recnoct IS NULL) THEN
      recnoct = 0;
     IF (recfest IS NULL) THEN
      recfest = 0;
     SELECT P.paan_recnoc, P.paan_recfest FROM PARAMETROS_ANO P WHERE P.paan_ano = :ano INTO :tar_recnotc, :tar_recfest;
     recargo = (((:basico/30)/8)*:tar_recnotc)*:recnoct;
     recargo = :recargo + ((((:basico/30)/8)*:tar_recfest)*:recfest);
     /*BASICO*/
     SELECT N.noex_recnoct, N.noex_recfest
     FROM NOMINA_HORASEXT N WHERE N.noex_periodio = :periodo AND N.noex_ano = :ano AND N.terc_nit = :nite
     INTO :recnoct, :recfest;
     IF (recnoct IS NULL) THEN
      recnoct = 0;
     IF (recfest IS NULL) THEN
      recfest = 0;
     SELECT P.paan_recnoc, P.paan_recfest FROM PARAMETROS_ANO P WHERE P.paan_ano = :ano INTO :tar_recnotc, :tar_recfest;
     basico = ((:basico/30)*:diaslab) - (((:basico/30)/8)*:recnoct);
     basico = :basico - (((:basico/30)/8)*:recfest);
     /*BENEFICIOS*/
     SELECT SUM(ce.emco_monto)
     FROM empleado_conceptos CE, CONCEPTOS_NOMINA CN WHERE ((CE.terc_nit = :nite) AND (CE.CONC_COD = CN.CONC_COD) AND (CE.emco_fecini <= :fec AND CE.emco_fecfin >= :FEC) ) OR ((CE.terc_nit = :nite)
     AND (CE.CONC_COD = CN.CONC_COD) AND (cn.conc_todosper = 'N') AND (CE.emco_ppago = :periodo)) OR  ((CE.terc_nit = :nite) AND (CE.CONC_COD = CN.CONC_COD) AND cn.conc_todosper = 'S') AND CN.conc_benefic = 'S'
     INTO :beneficios;
     IF (beneficios IS NULL) THEN
      beneficios = 0;
     IF ((conc_cod <> 929) AND (conc_cod <> 930)) THEN
     BEGIN
        SELECT P.paan_auxtr, P.paan_salminimo FROM PARAMETROS_ANO P WHERE P.paan_ano = :ano INTO :auxtrans, :smlv;
        IF (:basico < (:smlv*2)) THEN
           auxtrans = (:auxtrans / 30) * :diaslab;
        ELSE
           auxtrans = 0;
     END
     ELSE
      auxtrans = 0;
     conc_monto = :basico;
     IF (conc_porc <> 0 AND conc_porc IS NOT NULL) THEN
     VALOR = (((:CONC_MONTO)+ :cambsaltrans + :incap + :recargo + :auxtrans + :beneficios) * :conc_porc) /100;
     ELSE
     IF (porcen <> 0 AND porcen IS NOT NULL) THEN
     VALOR = (((:CONC_MONTO)+ :cambsaltrans + :incap + :recargo + :auxtrans + :beneficios) * :porcen) /100;
     ELSE
     IF (montos <> 0 AND montos IS NOT NULL) THEN
     VALOR = :montos;
     ELSE
     IF (conc_monto <> 0 AND conc_monto IS NOT NULL) THEN
     VALOR = :conc_monto;
     item = :item + 1;
    END
    ELSE
    IF (conc_cod = 920) THEN
    BEGIN
     SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :valor;
     IF (valor IS NULL) THEN
     valor = 0;
     item = :item + 1;
    END
    ELSE
    IF (conc_cod = 900 OR (:conc_cod = 931)) THEN
    BEGIN
     SELECT c.noex_monto FROM nomina_horasext c WHERE c.noex_ano = :ano AND c.noex_periodio = :periodo AND c.noex_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :valor;
     IF (valor IS NULL) THEN
     valor = 0;
     item = :item + 1;
    END
    ELSE
    IF (conc_cod = 932) THEN
    BEGIN
     SELECT N.nono_dura FROM NOMINA_NOVEDADES N WHERE N.terc_nit = :nite AND N.nono_periodo = :periodo AND N.nono_ano = :ano AND (N.tnov_cod = 2 OR (N.tnov_cod = 3)) INTO :diasnov;
     IF (:diasnov IS NULL) THEN
     valor = 0;
     ELSE
     valor = (:basico / 30)* :diasnov;
    END
    ELSE
    IF (conc_cod = 921) THEN
    BEGIN
     IF (porcen IS NOT NULL AND porcen <> 0) THEN
     valor = ((basico / 30)* :diaslab ) * :PORCEN /100;
     ELSE
     IF (conc_porc IS NOT NULL AND conc_porc <> 0) THEN
     valor = ((basico / 30)* :diaslab ) * :conc_porc /100;
    END
    ELSE
    IF (conc_cod = 953) THEN
    BEGIN
       SELECT E.empl_salario FROM EMPLEADOS E WHERE E.terc_nit = :nite INTO :basico;
       SELECT N.noex_recnoct, N.noex_recfest
       FROM NOMINA_HORASEXT N WHERE N.noex_periodio = :periodo AND N.noex_ano = :ano AND N.terc_nit = :nite
       INTO :recnoct, :recfest;
       IF (recnoct IS NULL) THEN
        recnoct = 0;
       IF (recfest IS NULL) THEN
        recfest = 0;
       SELECT P.paan_recnoc, P.paan_recfest FROM PARAMETROS_ANO P WHERE P.paan_ano = :ano INTO :tar_recnotc, :tar_recfest;
       valor = (((:basico/30)/8)*:tar_recnotc)*:recnoct;
       valor = :valor + ((((:basico/30)/8)*:tar_recfest)*:recfest);
    END
    EXECUTE PROCEDURE LEE_CONFIGURACION('NOMINA','GENERAL','REDONDEO AL MULTIPLO DE DIEZ EN TOTALES')RETURNING_VALUES(:aprox);
    EXECUTE PROCEDURE REDONDEE(:valor, :aprox) RETURNING_VALUES (VALOR);
    IF ((mensual = 'N') OR (periodicidad = 1))  THEN
    INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
    VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
    ELSE
    IF (mensual = 'S') THEN
    BEGIN
     IF ((:periodicidad = 2) AND (liquidaper = 1)) THEN
     BEGIN
      IF ((periodo = 1) OR (periodo = 3) OR (periodo = 5) OR (periodo = 7) OR (periodo = 9) OR (periodo = 11)
      OR (periodo = 13) OR (periodo = 15) OR (periodo = 17) OR (periodo = 19) OR (periodo = 21) OR (periodo = 23)) THEN
      INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
      VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
     END
     ELSE
     IF ((:periodicidad = 2) AND (liquidaper = 2)) THEN
     BEGIN
      IF ((periodo = 2) OR (periodo = 4) OR (periodo = 6) OR (periodo = 8) OR (periodo = 10) OR (periodo = 12)
      OR (periodo = 14) OR (periodo = 16) OR (periodo = 18) OR (periodo = 20) OR (periodo = 22) OR (periodo = 24)) THEN
      INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
      VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
     END
     ELSE
     IF ((:periodicidad = 3) AND (liquidaper = 1)) THEN
     BEGIN
      IF ((periodo = 1) OR (periodo = 5) OR (periodo = 9) OR (periodo = 13) OR (periodo = 17) OR (periodo = 21)
      OR (periodo = 25) OR (periodo = 29) OR (periodo = 33) OR (periodo = 37) OR (periodo = 41) OR (periodo = 45)
      OR (periodo = 49)) THEN
      INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
      VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
    END
    ELSE
     IF ((:periodicidad = 3) AND (liquidaper = 2)) THEN
     BEGIN
      IF ((periodo = 2) OR (periodo = 6) OR (periodo = 10) OR (periodo = 14) OR (periodo = 18) OR (periodo = 22)
      OR (periodo = 26) OR (periodo = 30) OR (periodo = 34) OR (periodo = 38) OR (periodo = 42) OR (periodo = 46)
      OR (periodo = 50)) THEN
      INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
      VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
     END
     ELSE
     IF ((:periodicidad = 3) AND (liquidaper = 3)) THEN
     BEGIN
      IF ((periodo = 3) OR (periodo = 7) OR (periodo = 11) OR (periodo = 15) OR (periodo = 19) OR (periodo = 23)
      OR (periodo = 27) OR (periodo = 31) OR (periodo = 35) OR (periodo = 39) OR (periodo = 43) OR (periodo = 47)
      OR (periodo = 51)) THEN
      INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
      VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
     END
     ELSE
     IF ((:periodicidad = 3) AND (liquidaper = 4)) THEN
     BEGIN
      IF ((periodo = 4) OR (periodo = 8) OR (periodo = 12) OR (periodo = 16) OR (periodo = 20) OR (periodo = 24)
      OR (periodo = 29) OR (periodo = 32) OR (periodo = 36) OR (periodo = 40) OR (periodo = 44) OR (periodo = 48)
      OR (periodo = 52)) THEN
      INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
      VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
     END
    END
  VALOR = 0;
  basico = 0;
  END
 END
 END
 END
 SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER trigger nomina_bi for nomina
active before insert position 0
as
declare variable existe integer;
begin
  existe = 0;
  select count(nomi_id) from nomina where NOMI_PERIODOCIDAD = new.NOMI_PERIODOCIDAD and nomi_ano = new.nomi_ano and nomi_periodo = new.nomi_periodo into :existe;
  if (existe > 0) then
    exception nomina_registrada;
  if (new.nomi_aporok is null) then
  new.nomi_aporok = 'N';
  if (new.nomi_pagook is null) then
  new.nomi_pagook = 'N';
end
^

SET TERM ; ^


CREATE TABLE EGRESOS_NOMINA (
    EGNO_IDCONS INTEGER NOT NULL,
    EGNO_IDNOM INTEGER NOT NULL,
    EGNO_IDEGR INTEGER NOT NULL,
    EGNO_PAGO BOOLEANO,
    EGNO_PRESTAMO BOOLEANO,
    EGNO_LIQUIDACION BOOLEANO,
    EGNO_VACACIONES BOOLEANO);
ALTER TABLE EGRESOS_NOMINA
ADD CONSTRAINT PK_EGRESOS_NOMINA
PRIMARY KEY (EGNO_IDCONS);

CREATE INDEX EMPLEADO_CONCEPTOS_IDX1
ON EMPLEADO_CONCEPTOS (CONC_COD);
CREATE INDEX PRESTAMO_CUOTAS_IDX1
ON PRESTAMO_CUOTAS (PRCU_ANO,PRCU_PERIODO);
CREATE INDEX NOMINA_CONCEPTOS_IDX1
ON NOMINA_CONCEPTOS (TERC_NIT);
CREATE INDEX NOMINA_CONCEPTOS_IDX2
ON NOMINA_CONCEPTOS (NOCO_ANO,NOCO_PERIODO);
CREATE INDEX NOMINA_HORASEXT_IDX1
ON NOMINA_HORASEXT (TERC_NIT);
CREATE INDEX NOMINA_HORASEXT_IDX2
ON NOMINA_HORASEXT (NOEX_ANO,NOEX_PERIODIO);
CREATE INDEX NOMINA_IDX1
ON NOMINA (NOMI_ANO,NOMI_PERIODO);

SET TERM ^ ;

CREATE OR ALTER procedure CAUSA_NOMINA(
    FEC date,
    PERIODO integer,
    PERIODICIDAD integer,
    PAGOGLOBAL char(1),
    ANO char(4),
    DEPTO integer)
returns (
    IDNOMINA integer,
    ITEMINI integer)
AS
declare variable item integer;
declare variable nite varchar(20) character set none;
declare variable nit_tercero varchar(20);
declare variable concept integer;
declare variable montos numeric(18,2);
declare variable porcen numeric(9,4);
declare variable entidad varchar(20);
declare variable conc_cod integer;
declare variable conc_deduc char(1);
declare variable conc_porc numeric(9,4);
declare variable conc_entidad integer;
declare variable conc_monto numeric(18,2);
declare variable conc_modifi char(1);
declare variable conc_promedio char(1);
declare variable emco_perprom integer;
declare variable valor numeric(18,2);
declare variable diaslab integer;
declare variable conc_prov char(1);
declare variable conc_aporte char(1);
declare variable numeroprom integer;
declare variable conc_aplicaprom char(1);
declare variable perinicial integer;
declare variable anoprom integer;
declare variable conc_dias char(1);
declare variable conc_otroconc char(1);
declare variable conc_codotroconc integer;
declare variable anosum integer;
declare variable salario char(1) character set none;
declare variable liquidaper integer;
declare variable rmod numeric(2,2);
declare variable basico numeric(18,2);
declare variable niteps varchar(20);
declare variable nitafc varchar(20);
declare variable nitafp varchar(20);
declare variable nitccf varchar(20);
declare variable gtoempr char(1);
declare variable comision numeric(18,2);
declare variable cambsaltrans numeric(18,2);
declare variable saldosini numeric(18,2);
declare variable duranov integer;
declare variable base numeric(18,2);
declare variable aprox integer;
declare variable mensual char(1);
declare variable horasex numeric(18,2);
declare variable diasnov integer;
declare variable tomasal integer;
declare variable retroact numeric(18,2);
declare variable reembolso numeric(18,2);
declare variable incap numeric(18,2);
declare variable deptoempl integer;
declare variable auxtrans numeric(18,2);
declare variable smlv numeric(18,2);
declare variable beneficios numeric(18,2);
declare variable confirmado char(1);
declare variable recnoct numeric(18,2);
declare variable recfest numeric(18,2);
declare variable tar_recnotc numeric(9,4);
declare variable tar_recfest numeric(9,4);
declare variable recargo numeric(18,2);
declare variable basicorec numeric(18,2);
BEGIN
 SELECT N.NOMI_ID, N.nomi_liqok FROM NOMINA N WHERE N.nomi_periodo = :periodo AND N.nomi_periodocidad = :periodicidad AND N.nomi_ano = :ano
 INTO :IDNOMINA, :CONFIRMADO;
 IF (:idnomina IS NULL) THEN
 BEGIN
  EXECUTE PROCEDURE cambie_id_nomina RETURNING_VALUES(:idnomina);
  INSERT INTO nomina (nomi_id, NOMI_FECCAUSA, NOMI_PAGOGLOBAL, NOMI_PERIODOCIDAD, NOMI_PERIODO, NOMI_ANO, NOMI_LIQOK)
  VALUES (:IDNOMINA, :fec,:pagoglobal, :periodicidad, :periodo, :ano, 'N');
  item = 1;
 END
 ELSE
 BEGIN
  SELECT MAX(N.noco_item) FROM NOMINA_CONCEPTOS N WHERE N.nomi_id = :idnomina
  INTO :item;
 END
 if ((confirmado = 'S') AND (idnomina IS NOT NULL)) then
 BEGIN
  idnomina = 0;
 END
 else
 begin
 IF (DEPTO = 0) THEN
  INSERT INTO NOMINA_DEPARTAMENTO (nomi_id, nodp_depto)VALUES(:IDNOMINA,0);
 ELSE
  INSERT INTO NOMINA_DEPARTAMENTO (nomi_id, nodp_depto)VALUES(:IDNOMINA,:DEPTO);
 ITEMINI = ITEM;
 FOR SELECT E.TERC_NIT, E.empl_salario, e.empl_eps, e.empl_afc, e.empl_afp, e.empl_ccf, e.empl_dpto
 FROM EMPLEADOS E
 WHERE E.empl_ppago = :periodicidad AND ((E.empl_fecret IS NULL) OR (E.empl_fecret > :fec)) AND E.empl_fecing <= :fec
 INTO :nite, :basico, :niteps, :nitafc, :nitafp, :nitccf, :deptoempl
 DO
 BEGIN
 IF ((depto = 0) OR (deptoempl = :depto)) THEN
 BEGIN
  FOR SELECT CE.TERC_NIT, CE.CONC_COD, CE.EMCO_MONTO, CE.EMCO_PORC, ce.empl_entidad, CE.emco_perprom, CE.emco_luquidaper, CE.emco_mensual, CN.CONC_COD, CN.CONC_DEDUC,CN.CONC_PORC, CN.CONC_ENTIDAD, CN.CONC_MONTO,  CN.CONC_DIAS, CN.CONC_MODIFI,
  CN.CONC_PROMEDIO, CN.conc_salario, CE.emco_perprom, CN.conc_prov, CN.conc_aporte, CN.conc_aplicaprom, cn.conc_otroconc, cn.conc_codotroconc, CN.conc_gtoempr, CN.conc_base, CE.emco_tomsal
  FROM empleado_conceptos CE, CONCEPTOS_NOMINA CN WHERE (CE.CONC_COD = CN.CONC_COD) AND (CE.terc_nit = :nite) AND
  (((CE.emco_fecini <= :fec AND CE.emco_fecfin >= :FEC)) OR
  ((cn.conc_todosper = 'N') AND (CE.emco_ppago = :periodo)) OR (cn.conc_todosper = 'S'))  ORDER BY (TERC_NIT )
  INTO :nit_tercero, :concept,  :montos, :porcen, :entidad, :numeroprom, :liquidaper, :mensual ,:CONC_COD, :CONC_DEDUC, :CONC_PORC,
  :CONC_ENTIDAD, :CONC_MONTO, :CONC_DIAS, :CONC_MODIFI,:CONC_PROMEDIO, :salario,:EMCO_PERPROM, :conc_prov, :conc_aporte , :CONC_APLICAPROM, :conc_otroconc, :conc_codotroconc, :gtoempr, :base, :tomasal
  DO
  BEGIN
   IF (conc_dias = 'S') THEN
   EXECUTE PROCEDURE DIAS_LABORADOS (:nite, :periodo, :fec, :mensual,:conc_aporte) RETURNING_VALUES (:diaslab);
   ELSE
   BEGIN
    diaslab = 15;
    IF (mensual = 'S') THEN
    BEGIN
     IF (periodicidad = 2) THEN
     diaslab = 30;
     ELSE
     IF (liquidaper = 3) THEN
     diaslab = 30;
    END
   END
   IF (:tomasal <> 0) THEN
   BEGIN
    IF ((:periodicidad = 2) AND (:tomasal <> 2)) THEN
    BEGIN
     IF ((periodo = 2) OR (periodo = 4) OR (periodo = 6) OR (periodo = 8) OR (periodo = 10) OR (periodo = 12)
     OR (periodo = 14) OR (periodo = 16) OR (periodo = 18) OR (periodo = 20) OR (periodo = 22) OR (periodo = 24)) THEN
     basico = 0;
    END
    ELSE
    IF ((:periodicidad = 3) AND (:tomasal <> 1)) THEN
    BEGIN
     IF ((periodo = 1) OR (periodo = 5) OR (periodo = 9) OR (periodo = 13) OR (periodo = 17) OR (periodo = 21)
     OR (periodo = 25) OR (periodo = 29) OR (periodo = 33) OR (periodo = 37) OR (periodo = 41) OR (periodo = 45)
     OR (periodo = 49)) THEN
     basico = 0;
    END
    ELSE
     IF ((:periodicidad = 3) AND (:tomasal <> 2)) THEN
     BEGIN
      IF ((periodo = 2) OR (periodo = 6) OR (periodo = 10) OR (periodo = 14) OR (periodo = 18) OR (periodo = 22)
      OR (periodo = 26) OR (periodo = 30) OR (periodo = 34) OR (periodo = 38) OR (periodo = 42) OR (periodo = 46)
      OR (periodo = 50)) THEN
      basico = 0;
     END
     ELSE
     IF ((:periodicidad = 3) AND (:tomasal <> 3)) THEN
     BEGIN
      IF ((periodo = 3) OR (periodo = 7) OR (periodo = 11) OR (periodo = 15) OR (periodo = 19) OR (periodo = 23)
      OR (periodo = 27) OR (periodo = 31) OR (periodo = 35) OR (periodo = 39) OR (periodo = 43) OR (periodo = 47)
      OR (periodo = 51)) THEN
      basico = 0;
     END
     ELSE
     IF ((:periodicidad = 3) AND (:tomasal <> 4)) THEN
     BEGIN
      IF ((periodo = 4) OR (periodo = 8) OR (periodo = 12) OR (periodo = 16) OR (periodo = 20) OR (periodo = 24)
      OR (periodo = 29) OR (periodo = 32) OR (periodo = 36) OR (periodo = 40) OR (periodo = 44) OR (periodo = 48)
      OR (periodo = 52)) THEN
      basico = 0;
     END
   END
   ELSE
    BEGIN
     SELECT E.empl_salario FROM EMPLEADOS E WHERE E.terc_nit = :nite INTO :basico;
    END
    SELECT ((n.nono_valor /30) * n.nono_dura), (n.nono_dura) FROM nomina_novedades n WHERE n.tnov_cod = 11 AND n.terc_nit = :nite AND n.nono_periodo = :periodo INTO :cambsaltrans, :duranov;
    IF (cambsaltrans IS NULL) THEN
    cambsaltrans = 0;
    IF (duranov IS NULL) THEN
    duranov = 0;
    diaslab = :diaslab - :duranov;
    IF (conc_cod = 922) THEN
    BEGIN
     SELECT SUM(P.prcu_monto) FROM prestamo_cuotas P, prestamo_nomina PN WHERE P.prcu_ano = :ano AND P.prcu_periodo = :periodo AND PN.prno_id = P.prno_id AND PN.terc_nit = :nite INTO :valor;
     IF (valor IS NULL) THEN
     valor = 0;
     item = :item + 1;
     UPDATE prestamo_cuotas  P SET prcu_ok = 'S' WHERE P.prcu_ano = :ano AND P.prcu_periodo = :periodo AND P.prno_id = (SELECT PN.prno_id FROM PRESTAMO_NOMINA PN WHERE PN.terc_nit = :nite);
    END
    ELSE
    IF ((:montos = 0) OR (:montos IS NULL)) THEN
    BEGIN
     IF ((CONC_PORC = 0 AND :porcen = 0) OR (CONC_PORC IS NULL AND :porcen = 0) OR (CONC_PORC = 0 AND :porcen IS NULL) OR (CONC_PORC IS NULL AND :porcen IS NULL) ) THEN
     BEGIN
      IF ((conc_monto <> 0) AND (conc_monto IS NOT NULL) ) THEN
      BEGIN
       VALOR = :CONC_MONTO;
       IF (:conc_dias = 'S') THEN
       valor = (:valor / 30) * :diaslab;
      END
      ELSE
      IF (salario = 'S' AND CONC_COD <> 900 AND CONC_COD <> 920 and conc_cod <> 932 AND CONC_COD <> 953) THEN
      BEGIN
       SELECT E.empl_salario FROM EMPLEADOS E WHERE E.terc_nit = :nite INTO :basico;
       SELECT N.noex_recnoct, N.noex_recfest
       FROM NOMINA_HORASEXT N WHERE N.noex_periodio = :periodo AND N.noex_ano = :ano AND N.terc_nit = :nite
       INTO :recnoct, :recfest;
       if (recnoct is null) then
        recnoct = 0;
       if (recfest is null) then
        recfest = 0;
       SELECT P.paan_recnoc, P.paan_recfest FROM PARAMETROS_ANO P WHERE P.paan_ano = :ano INTO :tar_recnotc, :tar_recfest;
       basico = ((:basico/30)*:diaslab) - (((:basico/30)/8)*:recnoct);
       basico = :basico - (((:basico/30)/8)*:recfest);
       conc_monto = :basico;
       VALOR = (:conc_monto/*/30 * :diaslab*/ ) + :cambsaltrans;
      END
      ELSE
      BEGIN
       valor = montos;
       IF (:conc_dias = 'S') THEN
       valor = (:valor / 30) * :diaslab;
      END
     END
     ELSE
     BEGIN
      IF (:porcen <> 0) THEN
      BEGIN
       IF ((conc_monto <> 0) AND (conc_monto IS NOT NULL) ) THEN
       BEGIN
        VALOR = ((:CONC_MONTO ) * :PORCEN) /100;
       END
      END
      ELSE
      BEGIN
       IF ((conc_monto <> 0) AND (conc_monto IS NOT NULL) ) THEN
       BEGIN
        VALOR = ((:CONC_MONTO) * :conc_porc) /100;
       END
       ELSE
       IF (salario = 'S' AND CONC_COD <> 900 AND CONC_COD <> 920 and conc_cod <> 932 AND CONC_COD <> 953) THEN
       BEGIN
       SELECT E.empl_salario FROM EMPLEADOS E WHERE E.terc_nit = :nite INTO :basico;
       SELECT N.noex_recnoct, N.noex_recfest
       FROM NOMINA_HORASEXT N WHERE N.noex_periodio = :periodo AND N.noex_ano = :ano AND N.terc_nit = :nite
       INTO :recnoct, :recfest;
       if (recnoct is null) then
        recnoct = 0;
       if (recfest is null) then
        recfest = 0;
       SELECT P.paan_recnoc, P.paan_recfest FROM PARAMETROS_ANO P WHERE P.paan_ano = :ano INTO :tar_recnotc, :tar_recfest;
       basico = ((:basico/30)*:diaslab) - (((:basico/30)/8)*:recnoct);
       basico = :basico - (((:basico/30)/8)*:recfest);
        conc_monto = :basico;
        VALOR = ((:CONC_MONTO)+ :cambsaltrans * :conc_porc) /100;
       END
       ELSE
       IF (:conc_monto = 0 AND :montos = 0) THEN
       BEGIN
        conc_monto = :basico;
        VALOR = (((:CONC_MONTO / 30) * :diaslab) + :cambsaltrans * :conc_porc) /100;
       END
      END
     END
    END
    ELSE
    IF ((CONC_PORC = 0 OR (conc_porc IS NULL)) AND (:porcen = 0 OR (porcen IS NULL))) THEN
    BEGIN
     VALOR = (:montos);
     IF (:conc_dias = 'S') THEN
     valor = (:valor / 30) * :diaslab;
    END
    ELSE
    IF (:porcen <> 0 AND porcen IS NOT NULL) THEN
    BEGIN
     VALOR = ((:MONTOS ) * :PORCEN) /100;
    END
    ELSE
    BEGIN
     VALOR = ((:montos) * :CONC_PORC) /100;
    END
    IF (conc_promedio = 'S') THEN
    BEGIN
     perinicial = :periodo - (:numeroprom) + 1;
     anoprom = CAST (ano AS INTEGER);
     IF (perinicial <= 0) THEN
     BEGIN
      perinicial = 1;
      anoprom = CAST(ANO AS INTEGER) - 1;
     END
     SELECT SUM (noco_valor) FROM nomina_conceptos n WHERE n.noco_aplicaprom = 'S' AND N.noco_periodo >= :perinicial - 1 AND N.noco_periodo < :periodo AND N.noco_ano >= :anoprom AND N.noco_ano <= :ano AND terc_nit = :nite INTO :valor;
     valor = ((valor ) / (numeroprom -1 ));
     SELECT NOCO_VALOR FROM NOMINA_CONCEPTOS WHERE CONC_COD = :conc_cod AND TERC_NIT  = :nite AND NOCO_PAGOOK = 'N' AND NOCO_PERIODO = 0 INTO :saldosini;
     IF (saldosini IS NULL) THEN
     saldosini = 0;
     ELSE
     UPDATE nomina_conceptos N SET noco_pagook = 'S' WHERE n.noco_aplicaprom = 'S' AND N.noco_periodo >= :perinicial - 1 AND N.noco_periodo < :periodo AND N.noco_ano >= :anoprom AND N.noco_ano <= :ano  AND CONC_COD = :conc_cod AND terc_nit = :nite AND NOCO_PERIODO = 0;
     VALOR = :valor + :saldosini;
     UPDATE nomina_conceptos N SET noco_pagook = 'S' WHERE n.noco_aplicaprom = 'S' AND N.noco_periodo >= :perinicial - 1 AND N.noco_periodo < :periodo AND N.noco_ano >= :anoprom AND N.noco_ano <= :ano  AND CONC_COD = :conc_cod AND terc_nit = :nite;
    END
    ELSE
    IF (conc_otroconc = 'S') THEN
    BEGIN
     anosum = CAST(ano AS INTEGER);
     anosum = anosum - 1;
     SELECT SUM (noco_valor) FROM nomina_conceptos n WHERE n.noco_ano = :anosum AND n.conc_cod = :conc_codotroconc AND N.terc_nit = :nite INTO :valor;
     SELECT NOCO_VALOR FROM NOMINA_CONCEPTOS WHERE noco_ano = :anosum AND conc_cod = :conc_codotroconc AND terc_nit = :nite AND NOCO_PERIODO = 0 INTO :saldosini;
     IF (saldosini IS NULL) THEN
     saldosini = 0;
     ELSE
     UPDATE nomina_conceptos SET noco_pagook = 'S' WHERE noco_ano = :anosum AND conc_cod = :conc_codotroconc AND NOCO_PERIODO = 0 AND terc_nit = :nite;
     VALOR = :valor + :saldosini;
     UPDATE nomina_conceptos SET noco_pagook = 'S' WHERE noco_ano = :anosum AND conc_cod = :conc_codotroconc AND terc_nit = :nite;
    END
    ELSE
    IF (conc_aporte = 'S') THEN
    BEGIN
     horasex = NULL;
     diasnov = NULL;
     retroact = NULL;
     reembolso = NULL;
     beneficios = null;
     recargo = null;
     comision = null;
     IF ((:entidad = '' ) OR (entidad IS NULL)) THEN
     BEGIN
      /*COMISIONES*/
      SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
      IF (comision IS NULL) THEN
      comision = 0;
      /*RETROACTIVO*/
      SELECT C.emco_monto FROM EMPLEADO_CONCEPTOS C WHERE C.terc_nit = :nite AND C.conc_cod = 933 INTO :retroact;
      IF (retroact IS NULL ) THEN
      retroact = 0;
      /*REEMBOLSO*/
      SELECT C.emco_monto FROM EMPLEADO_CONCEPTOS C WHERE C.terc_nit = :nite AND C.conc_cod = 952 INTO :reembolso;
      IF (reembolso IS NULL ) THEN
      reembolso = 0;
      /*INCAPACIDAD*/
      SELECT N.nono_dura FROM NOMINA_NOVEDADES N WHERE N.terc_nit = :nite AND N.nono_periodo = :periodo AND N.nono_ano = :ano AND (N.tnov_cod = 2 OR (N.tnov_cod = 3)) INTO :diasnov;
      IF (:diasnov IS NULL) THEN
      incap = 0;
      ELSE
      incap = (:basico / 30)* :diasnov;
      /*BASICO*/
      SELECT N.noex_recnoct, N.noex_recfest
      FROM NOMINA_HORASEXT N WHERE N.noex_periodio = :periodo AND N.noex_ano = :ano AND N.terc_nit = :nite
      INTO :recnoct, :recfest;
      if (recnoct is null) then
       recnoct = 0;
      if (recfest is null) then
       recfest = 0;
      SELECT P.paan_recnoc, P.paan_recfest FROM PARAMETROS_ANO P WHERE P.paan_ano = :ano INTO :tar_recnotc, :tar_recfest;
      basico = ((:basico/30)*:diaslab) - (((:basico/30)/8)*:recnoct);
      basico = :basico - (((:basico/30)/8)*:recfest);
      /*HORAS EXTRA*/
      SELECT c.noex_monto FROM nomina_horasext c WHERE c.noex_ano = :ano AND c.noex_periodio = :periodo AND c.noex_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :horasex;
      if (horasex is null) then
       horasex = 0;
      /*RECARGOS*/
      SELECT E.empl_salario FROM EMPLEADOS E WHERE E.terc_nit = :nite INTO :basicorec;
      SELECT N.noex_recnoct, N.noex_recfest
      FROM NOMINA_HORASEXT N WHERE N.noex_periodio = :periodo AND N.noex_ano = :ano AND N.terc_nit = :nite
      INTO :recnoct, :recfest;
      if (recnoct is null) then
       recnoct = 0;
      if (recfest is null) then
       recfest = 0;
      SELECT P.paan_recnoc, P.paan_recfest FROM PARAMETROS_ANO P WHERE P.paan_ano = :ano INTO :tar_recnotc, :tar_recfest;
      recargo = (((:basicorec/30)/8)*:tar_recnotc)*:recnoct;
      recargo = :recargo + ((((:basicorec/30)/8)*:tar_recfest)*:recfest);
      /*basico*/
      if (:basico + :comision + :horasex + :retroact+ :reembolso + :incap+ :cambsaltrans < ((:smlv/30)*:diaslab)) then
      comision = :smlv + :comision;
      /*SMLV Y AUX. TRANSPORTE*/
      SELECT P.paan_auxtr, P.paan_salminimo FROM PARAMETROS_ANO P WHERE P.paan_ano = :ano INTO :auxtrans, :smlv;
      /*BASE*/
      valor = :basico + :comision + :horasex + :retroact+ :reembolso + :incap + :recargo + :cambsaltrans;
      IF ((conc_cod = 904) OR (conc_cod = 905) OR (conc_cod = 906) or (conc_cod = 934) ) THEN
      BEGIN
       entidad = :nitafp;
       IF (conc_cod = 904) THEN
       BEGIN
        SELECT A.paan_afptr FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
        VALOR = ((:valor) * :PORCEN) /100;
       END
       ELSE
       IF ((conc_cod = 905) OR (conc_cod = 906) or (conc_cod = 934)) THEN
       BEGIN
        SELECT A.paan_afpem FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
        VALOR = ((:valor) * :PORCEN) /100;
       END
      END
      ELSE
      IF ((conc_cod = 907) OR (conc_cod = 914) OR (conc_cod = 915) or (conc_cod = 938) ) THEN
      BEGIN
       entidad = :niteps;
       IF (conc_cod = 907) THEN
       BEGIN
        SELECT A.paan_epstr FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
        VALOR = ((:valor) * :PORCEN) /100;
       END
       ELSE
       IF ((conc_cod = 914) OR (conc_cod = 915) or (conc_cod = 938)) THEN
       BEGIN
        SELECT A.paan_epsem FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
        VALOR = ((:valor) * :PORCEN) /100;
       END
      END
      ELSE
      IF ((conc_cod = 910) OR (conc_cod = 911) OR (conc_cod = 916) OR (conc_cod = 917) OR (conc_cod = 918) OR (conc_cod = 919) or (conc_cod = 936) or (conc_cod = 939) or (conc_cod = 940)) THEN
      BEGIN
       entidad = :nitccf;
       IF ((conc_cod = 910) OR (conc_cod = 911) or (conc_cod = 936)) THEN
       BEGIN
        SELECT A.paan_ccf FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
        VALOR = ((:valor) * :PORCEN) /100;
       END
       ELSE
       IF ((conc_cod = 916) OR (conc_cod = 917) or (conc_cod = 939)) THEN
       BEGIN
        SELECT A.paan_icbf FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
        VALOR = ((:valor) * :PORCEN) /100;
       END
       ELSE
       IF ((conc_cod = 918) OR (conc_cod = 919) or (conc_cod = 940)) THEN
       BEGIN
        SELECT A.paan_sena FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
        VALOR = ((:valor) * :PORCEN) /100;
       END
      END
      ELSE
      IF ((conc_cod = 912) OR (conc_cod = 913)) THEN
      BEGIN
       entidad = :nitafc;
      SELECT SUM(ce.emco_monto)
      FROM empleado_conceptos CE, CONCEPTOS_NOMINA CN WHERE CN.conc_benefic = 'S' AND (CE.terc_nit = :nite) AND (CE.CONC_COD = CN.CONC_COD) AND
      ((CE.emco_fecini <= :fec AND CE.emco_fecfin >= :FEC) OR ((cn.conc_todosper = 'N') AND (CE.emco_ppago = :periodo)) OR
      (cn.conc_todosper = 'S'))
      INTO :beneficios;
      if (beneficios is null) then
       beneficios = 0;
      SELECT P.paan_auxtr, P.paan_salminimo FROM PARAMETROS_ANO P WHERE P.paan_ano = :ano INTO :auxtrans, :smlv;
      if (:basico < (:smlv*2)) then
       auxtrans = (:auxtrans / 30) * :diaslab;
      ELSE
       auxtrans = 0;
       IF ((conc_cod = 912) OR (conc_cod = 913) or (conc_cod = 937)) THEN
       BEGIN
        SELECT A.paan_cesemp FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
        VALOR = ((:valor + :auxtrans + :beneficios) * :PORCEN) /100;
       END
      END
      ELSE
      BEGIN
       IF (comision IS NULL) THEN
       comision = 0;
       SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
       conc_monto = :basico + :comision;
       IF (conc_porc <> 0 AND conc_porc IS NOT NULL) THEN
       VALOR = (((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans + :incap) * :conc_porc) /100;
       ELSE
       IF (:porcen <> 0 AND :porcen IS NOT NULL) THEN
       VALOR = (((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans + :incap) * :porcen) /100;
       ELSE
       IF (:montos <> 0 AND :montos IS NOT NULL) THEN
       valor = :montos;
       ELSE
       IF (:conc_monto <> 0 AND :conc_monto IS NOT NULL) THEN
       valor = :conc_monto;
      END
     END
     item = :item + 1;
    END
    ELSE
    IF (conc_prov = 'S') THEN
    BEGIN
     /*RECARGO*/
     SELECT E.empl_salario FROM EMPLEADOS E WHERE E.terc_nit = :nite INTO :basico;
     SELECT N.noex_recnoct, N.noex_recfest
     FROM NOMINA_HORASEXT N WHERE N.noex_periodio = :periodo AND N.noex_ano = :ano AND N.terc_nit = :nite
     INTO :recnoct, :recfest;
     if (recnoct is null) then
      recnoct = 0;
     if (recfest is null) then
      recfest = 0;
     SELECT P.paan_recnoc, P.paan_recfest FROM PARAMETROS_ANO P WHERE P.paan_ano = :ano INTO :tar_recnotc, :tar_recfest;
     recargo = (((:basico/30)/8)*:tar_recnotc)*:recnoct;
     recargo = :recargo + ((((:basico/30)/8)*:tar_recfest)*:recfest);
     /*BASICO*/
     SELECT N.noex_recnoct, N.noex_recfest
     FROM NOMINA_HORASEXT N WHERE N.noex_periodio = :periodo AND N.noex_ano = :ano AND N.terc_nit = :nite
     INTO :recnoct, :recfest;
     if (recnoct is null) then
      recnoct = 0;
     if (recfest is null) then
      recfest = 0;
     SELECT P.paan_recnoc, P.paan_recfest FROM PARAMETROS_ANO P WHERE P.paan_ano = :ano INTO :tar_recnotc, :tar_recfest;
     basico = ((:basico/30)*:diaslab) - (((:basico/30)/8)*:recnoct);
     basico = :basico - (((:basico/30)/8)*:recfest);
     /*BENEFICIOS*/
      SELECT SUM(ce.emco_monto)
      FROM empleado_conceptos CE, CONCEPTOS_NOMINA CN WHERE CN.conc_benefic = 'S' AND (CE.terc_nit = :nite) AND (CE.CONC_COD = CN.CONC_COD) AND
      ((CE.emco_fecini <= :fec AND CE.emco_fecfin >= :FEC) OR ((cn.conc_todosper = 'N') AND (CE.emco_ppago = :periodo)) OR
      (cn.conc_todosper = 'S'))
     INTO :beneficios;
     if (beneficios is null) then
      beneficios = 0;
     if ((conc_cod <> 929) and (conc_cod <> 930)) then
     begin
        SELECT P.paan_auxtr, P.paan_salminimo FROM PARAMETROS_ANO P WHERE P.paan_ano = :ano INTO :auxtrans, :smlv;
        if (:basico < (:smlv*2)) then
           auxtrans = (:auxtrans / 30) * :diaslab;
        ELSE
           auxtrans = 0;
     end
     else
      auxtrans = 0;
     conc_monto = :basico;
     IF (conc_porc <> 0 AND conc_porc IS NOT NULL) THEN
     VALOR = (((:CONC_MONTO)+ :cambsaltrans + :incap + :recargo + :auxtrans + :beneficios) * :conc_porc) /100;
     ELSE
     IF (porcen <> 0 AND porcen IS NOT NULL) THEN
     VALOR = (((:CONC_MONTO)+ :cambsaltrans + :incap + :recargo + :auxtrans + :beneficios) * :porcen) /100;
     ELSE
     IF (montos <> 0 AND montos IS NOT NULL) THEN
     VALOR = :montos;
     ELSE
     IF (conc_monto <> 0 AND conc_monto IS NOT NULL) THEN
     VALOR = :conc_monto;
     item = :item + 1;
    END
    ELSE
    IF (conc_cod = 920) THEN
    BEGIN
     SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :valor;
     IF (valor IS NULL) THEN
     valor = 0;
     item = :item + 1;
    END
    ELSE
    IF (conc_cod = 900 OR (:conc_cod = 931)) THEN
    BEGIN
     SELECT c.noex_monto FROM nomina_horasext c WHERE c.noex_ano = :ano AND c.noex_periodio = :periodo AND c.noex_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :valor;
     IF (valor IS NULL) THEN
     valor = 0;
     item = :item + 1;
    END
    ELSE
    IF (conc_cod = 932) THEN
    BEGIN
     SELECT N.nono_dura FROM NOMINA_NOVEDADES N WHERE N.terc_nit = :nite AND N.nono_periodo = :periodo AND N.nono_ano = :ano AND (N.tnov_cod = 2 OR (N.tnov_cod = 3)) INTO :diasnov;
     IF (:diasnov IS NULL) THEN
     valor = 0;
     ELSE
     valor = (:basico / 30)* :diasnov;
    END
    ELSE
    IF (conc_cod = 921) THEN
    BEGIN
     IF (porcen IS NOT NULL AND porcen <> 0) THEN
     valor = ((basico / 30)* :diaslab ) * :PORCEN /100;
     ELSE
     IF (conc_porc IS NOT NULL AND conc_porc <> 0) THEN
     valor = ((basico / 30)* :diaslab ) * :conc_porc /100;
    END
    ELSE
    if (conc_cod = 953) then
    BEGIN
       SELECT E.empl_salario FROM EMPLEADOS E WHERE E.terc_nit = :nite INTO :basico;
       SELECT N.noex_recnoct, N.noex_recfest
       FROM NOMINA_HORASEXT N WHERE N.noex_periodio = :periodo AND N.noex_ano = :ano AND N.terc_nit = :nite
       INTO :recnoct, :recfest;
       if (recnoct is null) then
        recnoct = 0;
       if (recfest is null) then
        recfest = 0;
       SELECT P.paan_recnoc, P.paan_recfest FROM PARAMETROS_ANO P WHERE P.paan_ano = :ano INTO :tar_recnotc, :tar_recfest;
       valor = (((:basico/30)/8)*:tar_recnotc)*:recnoct;
       valor = :valor + ((((:basico/30)/8)*:tar_recfest)*:recfest);
    END
    EXECUTE PROCEDURE LEE_CONFIGURACION('NOMINA','GENERAL','REDONDEO AL MULTIPLO DE DIEZ EN TOTALES')RETURNING_VALUES(:aprox);
    EXECUTE PROCEDURE REDONDEE(:valor, :aprox) RETURNING_VALUES (VALOR);
    IF ((mensual = 'N') OR (periodicidad = 1))  THEN
    INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
    VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
    ELSE
    IF (mensual = 'S') THEN
    BEGIN
     IF ((:periodicidad = 2) AND (liquidaper = 1)) THEN
     BEGIN
      IF ((periodo = 1) OR (periodo = 3) OR (periodo = 5) OR (periodo = 7) OR (periodo = 9) OR (periodo = 11)
      OR (periodo = 13) OR (periodo = 15) OR (periodo = 17) OR (periodo = 19) OR (periodo = 21) OR (periodo = 23)) THEN
      INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
      VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
     END
     ELSE
     IF ((:periodicidad = 2) AND (liquidaper = 2)) THEN
     BEGIN
      IF ((periodo = 2) OR (periodo = 4) OR (periodo = 6) OR (periodo = 8) OR (periodo = 10) OR (periodo = 12)
      OR (periodo = 14) OR (periodo = 16) OR (periodo = 18) OR (periodo = 20) OR (periodo = 22) OR (periodo = 24)) THEN
      INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
      VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
     END
     ELSE
     IF ((:periodicidad = 3) AND (liquidaper = 1)) THEN
     BEGIN
      IF ((periodo = 1) OR (periodo = 5) OR (periodo = 9) OR (periodo = 13) OR (periodo = 17) OR (periodo = 21)
      OR (periodo = 25) OR (periodo = 29) OR (periodo = 33) OR (periodo = 37) OR (periodo = 41) OR (periodo = 45)
      OR (periodo = 49)) THEN
      INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
      VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
    END
    ELSE
     IF ((:periodicidad = 3) AND (liquidaper = 2)) THEN
     BEGIN
      IF ((periodo = 2) OR (periodo = 6) OR (periodo = 10) OR (periodo = 14) OR (periodo = 18) OR (periodo = 22)
      OR (periodo = 26) OR (periodo = 30) OR (periodo = 34) OR (periodo = 38) OR (periodo = 42) OR (periodo = 46)
      OR (periodo = 50)) THEN
      INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
      VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
     END
     ELSE
     IF ((:periodicidad = 3) AND (liquidaper = 3)) THEN
     BEGIN
      IF ((periodo = 3) OR (periodo = 7) OR (periodo = 11) OR (periodo = 15) OR (periodo = 19) OR (periodo = 23)
      OR (periodo = 27) OR (periodo = 31) OR (periodo = 35) OR (periodo = 39) OR (periodo = 43) OR (periodo = 47)
      OR (periodo = 51)) THEN
      INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
      VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
     END
     ELSE
     IF ((:periodicidad = 3) AND (liquidaper = 4)) THEN
     BEGIN
      IF ((periodo = 4) OR (periodo = 8) OR (periodo = 12) OR (periodo = 16) OR (periodo = 20) OR (periodo = 24)
      OR (periodo = 29) OR (periodo = 32) OR (periodo = 36) OR (periodo = 40) OR (periodo = 44) OR (periodo = 48)
      OR (periodo = 52)) THEN
      INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
      VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
     END
    END
  VALOR = 0;
  basico = 0;
  END
 END
 END
 END
 SUSPEND;
END
^

SET TERM ; ^

alter TABLE NOMINA_CONCEPTOS ADD NOCO_NITCONT NIT;

SET TERM ^ ;

CREATE OR ALTER PROCEDURE CONTABIL_NOMINA (
    iddoc integer)
returns (
    error integer,
    idc integer)
as
declare variable itemdet integer;
declare variable idcontabil integer;
declare variable aporte char(1);
declare variable entidad varchar(20);
declare variable valor numeric(18,2);
declare variable ctagast varchar(20);
declare variable ctaxp varchar(20);
declare variable tercnit varchar(20);
declare variable fecaux date;
declare variable fecha char(8);
declare variable ano char(4);
declare variable periodicidad integer;
declare variable periodo integer;
declare variable numero varchar(6);
declare variable tipocom char(3);
declare variable prefcom varchar(4);
declare variable concepto varchar(60);
declare variable numerocom varchar(6);
declare variable proyecto varchar(4) character set none;
declare variable centro varchar(4) character set none;
declare variable codconc integer;
declare variable base numeric(18,2);
declare variable basico numeric(18,2);
declare variable comision numeric(18,2);
declare variable retroact numeric(18,2);
BEGIN
SELECT N.nomi_feccausa, N.nomi_ano, N.nomi_periodocidad, N.nomi_periodo FROM NOMINA N WHERE N.nomi_id = :iddoc INTO :fecaux, :ano, :periodicidad, :periodo;
NUMERO = :periodicidad || :periodo;
SELECT I.tico_cod, I.prco_pre FROM INTERFAZ_NOMINA I WHERE I.tido_cod = 92 INTO :tipocom, :prefcom;
concepto = 'CAUSACION NOMINA AÑO ' || :ano || ' PERIODO ' || :periodo || ' PERIODICIDAD ' ||:periodicidad;
EXECUTE PROCEDURE completa_ceros(:numero)RETURNING_VALUES :numero;
SELECT P.pref_numero FROM PREFIJOS_CONTA P WHERE P.tico_cod = :tipocom AND P.prco_pref = :prefcom INTO :numerocom;
idcontabil = GEN_ID(ID_CONTABILIZA,1);
EXECUTE PROCEDURE FECHA_A_CONTA(:FECAUX) RETURNING_VALUES (:FECHA);
INSERT INTO CONTABILIZACION (CNTB_ID, CNTB_TIPOREF, CNTB_IDREF, CNTB_PREFREF, CNTB_NUMREF, CNTB_FECHA, CNTB_TIPOCOMP, CNTB_PREFCNT, CNTB_CONCEPTO, CNTB_NUMERO, CNTB_PROCESADO)
                     VALUES (:idcontabil, 92,:iddoc, :ano, :numero, :fecha, :tipocom, :prefcom, :concepto, :numerocom, 'N');
idc = :idcontabil;
itemdet = 0;
FOR SELECT max(NC.conc_cod),sum(NC.NOCO_VALOR), max(CN.conc_ctagast), max(CN.conc_ctacxp), max(NC.terc_nit), max(NC.noco_aporte), max(NC.noco_entidad)
FROM NOMINA_CONCEPTOS NC, CONCEPTOS_NOMINA CN WHERE NC.conc_cod = CN.conc_cod AND NC.nomi_id = :iddoc and cn.conc_ctagast is not null and cn.conc_ctacxp is not null
group by cn.conc_ctagast,nc.noco_nitcont
INTO :codconc,:valor, :ctagast, :ctaxp, :tercnit, :aporte, :entidad
DO
BEGIN
base = null;
IF (ctagast IS NULL) THEN
 BEGIN
 EXECUTE PROCEDURE ERROR (14, :IDDOC, :ctagast, 2);
 ERROR = ERROR + 1;
 END
IF (ctaxp IS NULL) THEN
 BEGIN
 EXECUTE PROCEDURE ERROR (14, :IDDOC, :ctaxp, 2);
 ERROR = ERROR + 1;
 END
IF (VALOR IS NULL) THEN
VALOR = 0;
IF (VALOR <> 0) THEN
BEGIN
IF (valor < 0) THEN
valor = :valor * (-1);
IF (codconc = 6) THEN
BEGIN
 SELECT E.empl_salario FROM EMPLEADOS E WHERE E.terc_nit = :tercnit INTO :basico;
 SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :tercnit INTO :comision;
 IF (comision IS NULL) THEN
 comision = 0;
 SELECT C.emco_monto FROM EMPLEADO_CONCEPTOS C WHERE C.terc_nit = :tercnit AND C.conc_cod = 933 INTO :retroact;
 IF (retroact IS NULL ) THEN
 retroact = 0;
 base = :basico + :comision + :retroact;
END
IF (aporte = 'N') THEN
BEGIN
SELECT D.dpto_proy, D.dpto_centro FROM EMPLEADOS E, departamento D WHERE E.terc_nit = :tercnit AND E.empl_dpto = D.dpto_cod INTO :proyecto, :centro;
INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_TERC, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_CONC, CNDE_PROY, cnde_centro,CNDE_BASE)
                         VALUES (:idcontabil, :itemdet, :ctagast, :tercnit, :valor, 0, :concepto, :proyecto, :centro,:base);
itemdet = itemdet + 1;
/*SELECT D.dpto_proy, D.dpto_centro FROM EMPLEADOS E, departamento D WHERE E.terc_nit = :tercnit AND E.empl_dpto = D.dpto_cod INTO :proyecto, :centro;
INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_TERC, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_CONC, CNDE_PROY, cnde_centro,CNDE_BASE)
                         VALUES (:idcontabil, :itemdet, :ctaxp, :tercnit, 0,:valor, :concepto, :proyecto, :centro,:base);
itemdet = itemdet + 1;
*/END
ELSE
IF (aporte = 'S') THEN
BEGIN
SELECT D.dpto_proy, D.dpto_centro FROM EMPLEADOS E, departamento D WHERE E.terc_nit = :tercnit AND E.empl_dpto = D.dpto_cod INTO :proyecto, :centro;
INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_TERC, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_CONC, CNDE_PROY, cnde_centro,CNDE_BASE)
                         VALUES (:idcontabil, :itemdet, :ctagast, :entidad, :valor, 0, :concepto, :proyecto, :centro,:base);
itemdet = itemdet + 1;
/*SELECT D.dpto_proy, D.dpto_centro FROM EMPLEADOS E, departamento D WHERE E.terc_nit = :tercnit AND E.empl_dpto = D.dpto_cod INTO :proyecto, :centro;
INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_TERC, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_CONC, CNDE_PROY, cnde_centro,CNDE_BASE)
                         VALUES (:idcontabil, :itemdet, :ctaxp, :entidad, 0,:valor, :concepto, :proyecto, :centro,:base);
itemdet = itemdet + 1;
*/END
END
END
FOR SELECT max(NC.conc_cod),sum(NC.NOCO_VALOR), max(CN.conc_ctagast), max(CN.conc_ctacxp), max(NC.terc_nit), max(NC.noco_aporte), max(NC.noco_entidad)
FROM NOMINA_CONCEPTOS NC, CONCEPTOS_NOMINA CN WHERE NC.conc_cod = CN.conc_cod AND NC.nomi_id = :iddoc and cn.conc_ctagast is not null and cn.conc_ctacxp is not null and (nc.conc_cod <> 904 and nc.conc_cod <> 907)
group by cn.conc_ctacxp,nc.noco_nitcont
INTO :codconc,:valor, :ctagast, :ctaxp, :tercnit, :aporte, :entidad
DO
BEGIN
base = null;
IF (ctagast IS NULL) THEN
 BEGIN
 EXECUTE PROCEDURE ERROR (14, :IDDOC, :ctagast, 2);
 ERROR = ERROR + 1;
 END
IF (ctaxp IS NULL) THEN
 BEGIN
 EXECUTE PROCEDURE ERROR (14, :IDDOC, :ctaxp, 2);
 ERROR = ERROR + 1;
 END
IF (VALOR IS NULL) THEN
VALOR = 0;
IF (VALOR <> 0) THEN
BEGIN
IF (valor < 0) THEN
valor = :valor * (-1);
IF (codconc = 6) THEN
BEGIN
 SELECT E.empl_salario FROM EMPLEADOS E WHERE E.terc_nit = :tercnit INTO :basico;
 SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :tercnit INTO :comision;
 IF (comision IS NULL) THEN
 comision = 0;
 SELECT C.emco_monto FROM EMPLEADO_CONCEPTOS C WHERE C.terc_nit = :tercnit AND C.conc_cod = 933 INTO :retroact;
 IF (retroact IS NULL ) THEN
 retroact = 0;
 base = :basico + :comision + :retroact;
END
IF (aporte = 'N') THEN
BEGIN
/*SELECT D.dpto_proy, D.dpto_centro FROM EMPLEADOS E, departamento D WHERE E.terc_nit = :tercnit AND E.empl_dpto = D.dpto_cod INTO :proyecto, :centro;
INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_TERC, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_CONC, CNDE_PROY, cnde_centro,CNDE_BASE)
                         VALUES (:idcontabil, :itemdet, :ctagast, :tercnit, :valor, 0, :concepto, :proyecto, :centro,:base);
itemdet = itemdet + 1;
*/SELECT D.dpto_proy, D.dpto_centro FROM EMPLEADOS E, departamento D WHERE E.terc_nit = :tercnit AND E.empl_dpto = D.dpto_cod INTO :proyecto, :centro;
INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_TERC, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_CONC, CNDE_PROY, cnde_centro,CNDE_BASE)
                         VALUES (:idcontabil, :itemdet, :ctaxp, :tercnit, 0,:valor, :concepto, :proyecto, :centro,:base);
itemdet = itemdet + 1;
END
ELSE
IF (aporte = 'S') THEN
BEGIN
/*SELECT D.dpto_proy, D.dpto_centro FROM EMPLEADOS E, departamento D WHERE E.terc_nit = :tercnit AND E.empl_dpto = D.dpto_cod INTO :proyecto, :centro;
INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_TERC, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_CONC, CNDE_PROY, cnde_centro,CNDE_BASE)
                         VALUES (:idcontabil, :itemdet, :ctagast, :tercnit, :valor, 0, :concepto, :proyecto, :centro,:base);
itemdet = itemdet + 1;
*/SELECT D.dpto_proy, D.dpto_centro FROM EMPLEADOS E, departamento D WHERE E.terc_nit = :tercnit AND E.empl_dpto = D.dpto_cod INTO :proyecto, :centro;
INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_TERC, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_CONC, CNDE_PROY, cnde_centro,CNDE_BASE)
                         VALUES (:idcontabil, :itemdet, :ctaxp, :tercnit, 0,:valor, :concepto, :proyecto, :centro,:base);
itemdet = itemdet + 1;
END
END
END
FOR SELECT max(NC.conc_cod),sum(NC.NOCO_VALOR), max(CN.conc_ctagast), max(CN.conc_ctacxp), max(NC.terc_nit), max(NC.noco_aporte), max(NC.noco_entidad)
FROM NOMINA_CONCEPTOS NC, CONCEPTOS_NOMINA CN WHERE NC.conc_cod = CN.conc_cod AND NC.nomi_id = :iddoc and cn.conc_ctagast is not null and cn.conc_ctacxp is not null and (nc.conc_cod = 904 or nc.conc_cod = 907)
group by cn.conc_ctagast,nc.terc_nit
INTO :codconc,:valor, :ctagast, :ctaxp, :tercnit, :aporte, :entidad
DO
BEGIN
base = null;
IF (ctagast IS NULL) THEN
 BEGIN
 EXECUTE PROCEDURE ERROR (14, :IDDOC, :ctagast, 2);
 ERROR = ERROR + 1;
 END
IF (ctaxp IS NULL) THEN
 BEGIN
 EXECUTE PROCEDURE ERROR (14, :IDDOC, :ctaxp, 2);
 ERROR = ERROR + 1;
 END
IF (VALOR IS NULL) THEN
VALOR = 0;
IF (VALOR <> 0) THEN
BEGIN
IF (valor < 0) THEN
valor = :valor * (-1);
IF (codconc = 6) THEN
BEGIN
 SELECT E.empl_salario FROM EMPLEADOS E WHERE E.terc_nit = :tercnit INTO :basico;
 SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :tercnit INTO :comision;
 IF (comision IS NULL) THEN
 comision = 0;
 SELECT C.emco_monto FROM EMPLEADO_CONCEPTOS C WHERE C.terc_nit = :tercnit AND C.conc_cod = 933 INTO :retroact;
 IF (retroact IS NULL ) THEN
 retroact = 0;
 base = :basico + :comision + :retroact;
END
IF (aporte = 'N') THEN
BEGIN
/*SELECT D.dpto_proy, D.dpto_centro FROM EMPLEADOS E, departamento D WHERE E.terc_nit = :tercnit AND E.empl_dpto = D.dpto_cod INTO :proyecto, :centro;
INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_TERC, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_CONC, CNDE_PROY, cnde_centro,CNDE_BASE)
                         VALUES (:idcontabil, :itemdet, :ctagast, :tercnit, :valor, 0, :concepto, :proyecto, :centro,:base);
itemdet = itemdet + 1;
*/SELECT D.dpto_proy, D.dpto_centro FROM EMPLEADOS E, departamento D WHERE E.terc_nit = :tercnit AND E.empl_dpto = D.dpto_cod INTO :proyecto, :centro;
INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_TERC, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_CONC, CNDE_PROY, cnde_centro,CNDE_BASE)
                         VALUES (:idcontabil, :itemdet, :ctagast, :tercnit,:valor, 0, :concepto, :proyecto, :centro,:base);
itemdet = itemdet + 1;
END
ELSE
IF (aporte = 'S') THEN
BEGIN
/*SELECT D.dpto_proy, D.dpto_centro FROM EMPLEADOS E, departamento D WHERE E.terc_nit = :tercnit AND E.empl_dpto = D.dpto_cod INTO :proyecto, :centro;
INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_TERC, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_CONC, CNDE_PROY, cnde_centro,CNDE_BASE)
                         VALUES (:idcontabil, :itemdet, :ctagast, :tercnit, :valor, 0, :concepto, :proyecto, :centro,:base);
itemdet = itemdet + 1;
*/SELECT D.dpto_proy, D.dpto_centro FROM EMPLEADOS E, departamento D WHERE E.terc_nit = :tercnit AND E.empl_dpto = D.dpto_cod INTO :proyecto, :centro;
INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_TERC, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_CONC, CNDE_PROY, cnde_centro,CNDE_BASE)
                         VALUES (:idcontabil, :itemdet, :ctagast, :tercnit,:valor, 0, :concepto, :proyecto, :centro,:base);
itemdet = itemdet + 1;
END
END
END
SUSPEND;
END
^

SET TERM ; ^


INSERT INTO CONFIGURACION (CONF_MODULO, CONF_CATEGORIA, CONF_PROPIEDAD, CONF_VALOR, CONF_POSIBLES, CONF_AYUDA) VALUES ('NOMINA', 'LIQUIDACION', 'TOMAR BENEFICIOS PARA CALCULAR PROVISIONES', 'SI', 'SI,NO', 'SI: Incluye los beneficios en la base para calcular provisiones, NO: No incluye beneficios en la base para calcular provisiones');

SET TERM ^ ;

CREATE OR ALTER PROCEDURE CAUSA_NOMINA(
    fec date,
    periodo integer,
    periodicidad integer,
    pagoglobal char(1),
    ano char(4),
    depto integer)
returns (
    idnomina integer,
    itemini integer)
as
declare variable item integer;
declare variable nite varchar(20) character set none;
declare variable nit_tercero varchar(20);
declare variable concept integer;
declare variable montos numeric(18,2);
declare variable porcen numeric(9,4);
declare variable entidad varchar(20);
declare variable conc_cod integer;
declare variable conc_deduc char(1);
declare variable conc_porc numeric(9,4);
declare variable conc_entidad integer;
declare variable conc_monto numeric(18,2);
declare variable conc_modifi char(1);
declare variable conc_promedio char(1);
declare variable emco_perprom integer;
declare variable valor numeric(18,2);
declare variable diaslab integer;
declare variable conc_prov char(1);
declare variable conc_aporte char(1);
declare variable numeroprom integer;
declare variable conc_aplicaprom char(1);
declare variable perinicial integer;
declare variable anoprom integer;
declare variable conc_dias char(1);
declare variable conc_otroconc char(1);
declare variable conc_codotroconc integer;
declare variable anosum integer;
declare variable salario char(1) character set none;
declare variable liquidaper integer;
declare variable rmod numeric(2,2);
declare variable basico numeric(18,2);
declare variable niteps varchar(20);
declare variable nitafc varchar(20);
declare variable nitafp varchar(20);
declare variable nitccf varchar(20);
declare variable gtoempr char(1);
declare variable comision numeric(18,2);
declare variable cambsaltrans numeric(18,2);
declare variable saldosini numeric(18,2);
declare variable duranov integer;
declare variable base numeric(18,2);
declare variable aprox integer;
declare variable mensual char(1);
declare variable horasex numeric(18,2);
declare variable diasnov integer;
declare variable tomasal integer;
declare variable retroact numeric(18,2);
declare variable reembolso numeric(18,2);
declare variable incap numeric(18,2);
declare variable deptoempl integer;
declare variable auxtrans numeric(18,2);
declare variable smlv numeric(18,2);
declare variable beneficios numeric(18,2);
declare variable confirmado char(1);
declare variable recnoct numeric(18,2);
declare variable recfest numeric(18,2);
declare variable tar_recnotc numeric(9,4);
declare variable tar_recfest numeric(9,4);
declare variable recargo numeric(18,2);
declare variable basicorec numeric(18,2);
declare variable parambenef char(2);
BEGIN
 SELECT N.NOMI_ID, N.nomi_liqok FROM NOMINA N WHERE N.nomi_periodo = :periodo AND N.nomi_periodocidad = :periodicidad AND N.nomi_ano = :ano
 INTO :IDNOMINA, :CONFIRMADO;
 IF (:idnomina IS NULL) THEN
 BEGIN
  EXECUTE PROCEDURE cambie_id_nomina RETURNING_VALUES(:idnomina);
  INSERT INTO nomina (nomi_id, NOMI_FECCAUSA, NOMI_PAGOGLOBAL, NOMI_PERIODOCIDAD, NOMI_PERIODO, NOMI_ANO, NOMI_LIQOK)
  VALUES (:IDNOMINA, :fec,:pagoglobal, :periodicidad, :periodo, :ano, 'N');
  item = 1;
 END
 ELSE
 BEGIN
  SELECT MAX(N.noco_item) FROM NOMINA_CONCEPTOS N WHERE N.nomi_id = :idnomina
  INTO :item;
 END
 if ((confirmado = 'S') AND (idnomina IS NOT NULL)) then
 BEGIN
  idnomina = 0;
 END
 else
 begin
 IF (DEPTO = 0) THEN
  INSERT INTO NOMINA_DEPARTAMENTO (nomi_id, nodp_depto)VALUES(:IDNOMINA,0);
 ELSE
  INSERT INTO NOMINA_DEPARTAMENTO (nomi_id, nodp_depto)VALUES(:IDNOMINA,:DEPTO);
 ITEMINI = ITEM;
 FOR SELECT E.TERC_NIT, E.empl_salario, e.empl_eps, e.empl_afc, e.empl_afp, e.empl_ccf, e.empl_dpto
 FROM EMPLEADOS E
 WHERE E.empl_ppago = :periodicidad AND ((E.empl_fecret IS NULL) OR (E.empl_fecret > :fec)) AND E.empl_fecing <= :fec
 INTO :nite, :basico, :niteps, :nitafc, :nitafp, :nitccf, :deptoempl
 DO
 BEGIN
 IF ((depto = 0) OR (deptoempl = :depto)) THEN
 BEGIN
  FOR SELECT CE.TERC_NIT, CE.CONC_COD, CE.EMCO_MONTO, CE.EMCO_PORC, ce.empl_entidad, CE.emco_perprom, CE.emco_luquidaper, CE.emco_mensual, CN.CONC_COD, CN.CONC_DEDUC,CN.CONC_PORC, CN.CONC_ENTIDAD, CN.CONC_MONTO,  CN.CONC_DIAS, CN.CONC_MODIFI,
  CN.CONC_PROMEDIO, CN.conc_salario, CE.emco_perprom, CN.conc_prov, CN.conc_aporte, CN.conc_aplicaprom, cn.conc_otroconc, cn.conc_codotroconc, CN.conc_gtoempr, CN.conc_base, CE.emco_tomsal
  FROM empleado_conceptos CE, CONCEPTOS_NOMINA CN WHERE (CE.CONC_COD = CN.CONC_COD) AND (CE.terc_nit = :nite) AND
  (((CE.emco_fecini <= :fec AND CE.emco_fecfin >= :FEC)) OR
  ((cn.conc_todosper = 'N') AND (CE.emco_ppago = :periodo)) OR (cn.conc_todosper = 'S'))  ORDER BY (TERC_NIT )
  INTO :nit_tercero, :concept,  :montos, :porcen, :entidad, :numeroprom, :liquidaper, :mensual ,:CONC_COD, :CONC_DEDUC, :CONC_PORC,
  :CONC_ENTIDAD, :CONC_MONTO, :CONC_DIAS, :CONC_MODIFI,:CONC_PROMEDIO, :salario,:EMCO_PERPROM, :conc_prov, :conc_aporte , :CONC_APLICAPROM, :conc_otroconc, :conc_codotroconc, :gtoempr, :base, :tomasal
  DO
  BEGIN
   IF (conc_dias = 'S') THEN
   EXECUTE PROCEDURE DIAS_LABORADOS (:nite, :periodo, :fec, :mensual,:conc_aporte) RETURNING_VALUES (:diaslab);
   ELSE
   BEGIN
    diaslab = 15;
    IF (mensual = 'S') THEN
    BEGIN
     IF (periodicidad = 2) THEN
     diaslab = 30;
     ELSE
     IF (liquidaper = 3) THEN
     diaslab = 30;
    END
   END
   IF (:tomasal <> 0) THEN
   BEGIN
    IF ((:periodicidad = 2) AND (:tomasal <> 2)) THEN
    BEGIN
     IF ((periodo = 2) OR (periodo = 4) OR (periodo = 6) OR (periodo = 8) OR (periodo = 10) OR (periodo = 12)
     OR (periodo = 14) OR (periodo = 16) OR (periodo = 18) OR (periodo = 20) OR (periodo = 22) OR (periodo = 24)) THEN
     basico = 0;
    END
    ELSE
    IF ((:periodicidad = 3) AND (:tomasal <> 1)) THEN
    BEGIN
     IF ((periodo = 1) OR (periodo = 5) OR (periodo = 9) OR (periodo = 13) OR (periodo = 17) OR (periodo = 21)
     OR (periodo = 25) OR (periodo = 29) OR (periodo = 33) OR (periodo = 37) OR (periodo = 41) OR (periodo = 45)
     OR (periodo = 49)) THEN
     basico = 0;
    END
    ELSE
     IF ((:periodicidad = 3) AND (:tomasal <> 2)) THEN
     BEGIN
      IF ((periodo = 2) OR (periodo = 6) OR (periodo = 10) OR (periodo = 14) OR (periodo = 18) OR (periodo = 22)
      OR (periodo = 26) OR (periodo = 30) OR (periodo = 34) OR (periodo = 38) OR (periodo = 42) OR (periodo = 46)
      OR (periodo = 50)) THEN
      basico = 0;
     END
     ELSE
     IF ((:periodicidad = 3) AND (:tomasal <> 3)) THEN
     BEGIN
      IF ((periodo = 3) OR (periodo = 7) OR (periodo = 11) OR (periodo = 15) OR (periodo = 19) OR (periodo = 23)
      OR (periodo = 27) OR (periodo = 31) OR (periodo = 35) OR (periodo = 39) OR (periodo = 43) OR (periodo = 47)
      OR (periodo = 51)) THEN
      basico = 0;
     END
     ELSE
     IF ((:periodicidad = 3) AND (:tomasal <> 4)) THEN
     BEGIN
      IF ((periodo = 4) OR (periodo = 8) OR (periodo = 12) OR (periodo = 16) OR (periodo = 20) OR (periodo = 24)
      OR (periodo = 29) OR (periodo = 32) OR (periodo = 36) OR (periodo = 40) OR (periodo = 44) OR (periodo = 48)
      OR (periodo = 52)) THEN
      basico = 0;
     END
   END
   ELSE
    BEGIN
     SELECT E.empl_salario FROM EMPLEADOS E WHERE E.terc_nit = :nite INTO :basico;
    END
    SELECT ((n.nono_valor /30) * n.nono_dura), (n.nono_dura) FROM nomina_novedades n WHERE n.tnov_cod = 11 AND n.terc_nit = :nite AND n.nono_periodo = :periodo INTO :cambsaltrans, :duranov;
    IF (cambsaltrans IS NULL) THEN
    cambsaltrans = 0;
    IF (duranov IS NULL) THEN
    duranov = 0;
    diaslab = :diaslab - :duranov;
    IF (conc_cod = 922) THEN
    BEGIN
     SELECT SUM(P.prcu_monto) FROM prestamo_cuotas P, prestamo_nomina PN WHERE P.prcu_ano = :ano AND P.prcu_periodo = :periodo AND PN.prno_id = P.prno_id AND PN.terc_nit = :nite INTO :valor;
     IF (valor IS NULL) THEN
     valor = 0;
     item = :item + 1;
     UPDATE prestamo_cuotas  P SET prcu_ok = 'S' WHERE P.prcu_ano = :ano AND P.prcu_periodo = :periodo AND P.prno_id = (SELECT PN.prno_id FROM PRESTAMO_NOMINA PN WHERE PN.terc_nit = :nite);
    END
    ELSE
    IF ((:montos = 0) OR (:montos IS NULL)) THEN
    BEGIN
     IF ((CONC_PORC = 0 AND :porcen = 0) OR (CONC_PORC IS NULL AND :porcen = 0) OR (CONC_PORC = 0 AND :porcen IS NULL) OR (CONC_PORC IS NULL AND :porcen IS NULL) ) THEN
     BEGIN
      IF ((conc_monto <> 0) AND (conc_monto IS NOT NULL) ) THEN
      BEGIN
       VALOR = :CONC_MONTO;
       IF (:conc_dias = 'S') THEN
       valor = (:valor / 30) * :diaslab;
      END
      ELSE
      IF (salario = 'S' AND CONC_COD <> 900 AND CONC_COD <> 920 and conc_cod <> 932 AND CONC_COD <> 953) THEN
      BEGIN
       SELECT E.empl_salario FROM EMPLEADOS E WHERE E.terc_nit = :nite INTO :basico;
       SELECT N.noex_recnoct, N.noex_recfest
       FROM NOMINA_HORASEXT N WHERE N.noex_periodio = :periodo AND N.noex_ano = :ano AND N.terc_nit = :nite
       INTO :recnoct, :recfest;
       if (recnoct is null) then
        recnoct = 0;
       if (recfest is null) then
        recfest = 0;
       SELECT P.paan_recnoc, P.paan_recfest FROM PARAMETROS_ANO P WHERE P.paan_ano = :ano INTO :tar_recnotc, :tar_recfest;
       basico = ((:basico/30)*:diaslab) - (((:basico/30)/8)*:recnoct);
       basico = :basico - (((:basico/30)/8)*:recfest);
       conc_monto = :basico;
       VALOR = (:conc_monto/*/30 * :diaslab*/ ) + :cambsaltrans;
      END
      ELSE
      BEGIN
       valor = montos;
       IF (:conc_dias = 'S') THEN
       valor = (:valor / 30) * :diaslab;
      END
     END
     ELSE
     BEGIN
      IF (:porcen <> 0) THEN
      BEGIN
       IF ((conc_monto <> 0) AND (conc_monto IS NOT NULL) ) THEN
       BEGIN
        VALOR = ((:CONC_MONTO ) * :PORCEN) /100;
       END
      END
      ELSE
      BEGIN
       IF ((conc_monto <> 0) AND (conc_monto IS NOT NULL) ) THEN
       BEGIN
        VALOR = ((:CONC_MONTO) * :conc_porc) /100;
       END
       ELSE
       IF (salario = 'S' AND CONC_COD <> 900 AND CONC_COD <> 920 and conc_cod <> 932 AND CONC_COD <> 953) THEN
       BEGIN
       SELECT E.empl_salario FROM EMPLEADOS E WHERE E.terc_nit = :nite INTO :basico;
       SELECT N.noex_recnoct, N.noex_recfest
       FROM NOMINA_HORASEXT N WHERE N.noex_periodio = :periodo AND N.noex_ano = :ano AND N.terc_nit = :nite
       INTO :recnoct, :recfest;
       if (recnoct is null) then
        recnoct = 0;
       if (recfest is null) then
        recfest = 0;
       SELECT P.paan_recnoc, P.paan_recfest FROM PARAMETROS_ANO P WHERE P.paan_ano = :ano INTO :tar_recnotc, :tar_recfest;
       basico = ((:basico/30)*:diaslab) - (((:basico/30)/8)*:recnoct);
       basico = :basico - (((:basico/30)/8)*:recfest);
        conc_monto = :basico;
        VALOR = ((:CONC_MONTO)+ :cambsaltrans * :conc_porc) /100;
       END
       ELSE
       IF (:conc_monto = 0 AND :montos = 0) THEN
       BEGIN
        conc_monto = :basico;
        VALOR = (((:CONC_MONTO / 30) * :diaslab) + :cambsaltrans * :conc_porc) /100;
       END
      END
     END
    END
    ELSE
    IF ((CONC_PORC = 0 OR (conc_porc IS NULL)) AND (:porcen = 0 OR (porcen IS NULL))) THEN
    BEGIN
     VALOR = (:montos);
     IF (:conc_dias = 'S') THEN
     valor = (:valor / 30) * :diaslab;
    END
    ELSE
    IF (:porcen <> 0 AND porcen IS NOT NULL) THEN
    BEGIN
     VALOR = ((:MONTOS ) * :PORCEN) /100;
    END
    ELSE
    BEGIN
     VALOR = ((:montos) * :CONC_PORC) /100;
    END
    IF (conc_promedio = 'S') THEN
    BEGIN
     perinicial = :periodo - (:numeroprom) + 1;
     anoprom = CAST (ano AS INTEGER);
     IF (perinicial <= 0) THEN
     BEGIN
      perinicial = 1;
      anoprom = CAST(ANO AS INTEGER) - 1;
     END
     SELECT SUM (noco_valor) FROM nomina_conceptos n WHERE n.noco_aplicaprom = 'S' AND N.noco_periodo >= :perinicial - 1 AND N.noco_periodo < :periodo AND N.noco_ano >= :anoprom AND N.noco_ano <= :ano AND terc_nit = :nite INTO :valor;
     valor = ((valor ) / (numeroprom -1 ));
     SELECT NOCO_VALOR FROM NOMINA_CONCEPTOS WHERE CONC_COD = :conc_cod AND TERC_NIT  = :nite AND NOCO_PAGOOK = 'N' AND NOCO_PERIODO = 0 INTO :saldosini;
     IF (saldosini IS NULL) THEN
     saldosini = 0;
     ELSE
     UPDATE nomina_conceptos N SET noco_pagook = 'S' WHERE n.noco_aplicaprom = 'S' AND N.noco_periodo >= :perinicial - 1 AND N.noco_periodo < :periodo AND N.noco_ano >= :anoprom AND N.noco_ano <= :ano  AND CONC_COD = :conc_cod AND terc_nit = :nite AND NOCO_PERIODO = 0;
     VALOR = :valor + :saldosini;
     UPDATE nomina_conceptos N SET noco_pagook = 'S' WHERE n.noco_aplicaprom = 'S' AND N.noco_periodo >= :perinicial - 1 AND N.noco_periodo < :periodo AND N.noco_ano >= :anoprom AND N.noco_ano <= :ano  AND CONC_COD = :conc_cod AND terc_nit = :nite;
    END
    ELSE
    IF (conc_otroconc = 'S') THEN
    BEGIN
     anosum = CAST(ano AS INTEGER);
     anosum = anosum - 1;
     SELECT SUM (noco_valor) FROM nomina_conceptos n WHERE n.noco_ano = :anosum AND n.conc_cod = :conc_codotroconc AND N.terc_nit = :nite INTO :valor;
     SELECT NOCO_VALOR FROM NOMINA_CONCEPTOS WHERE noco_ano = :anosum AND conc_cod = :conc_codotroconc AND terc_nit = :nite AND NOCO_PERIODO = 0 INTO :saldosini;
     IF (saldosini IS NULL) THEN
     saldosini = 0;
     ELSE
     UPDATE nomina_conceptos SET noco_pagook = 'S' WHERE noco_ano = :anosum AND conc_cod = :conc_codotroconc AND NOCO_PERIODO = 0 AND terc_nit = :nite;
     VALOR = :valor + :saldosini;
     UPDATE nomina_conceptos SET noco_pagook = 'S' WHERE noco_ano = :anosum AND conc_cod = :conc_codotroconc AND terc_nit = :nite;
    END
    ELSE
    IF (conc_aporte = 'S') THEN
    BEGIN
     horasex = NULL;
     diasnov = NULL;
     retroact = NULL;
     reembolso = NULL;
     beneficios = null;
     recargo = null;
     comision = null;
     incap = null;
     IF ((:entidad = '' ) OR (entidad IS NULL)) THEN
     BEGIN
      /*COMISIONES*/
      SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
      IF (comision IS NULL) THEN
      comision = 0;
      /*RETROACTIVO*/
      SELECT C.emco_monto FROM EMPLEADO_CONCEPTOS C WHERE C.terc_nit = :nite AND C.conc_cod = 933 INTO :retroact;
      IF (retroact IS NULL ) THEN
      retroact = 0;
      /*REEMBOLSO*/
      SELECT C.emco_monto FROM EMPLEADO_CONCEPTOS C WHERE C.terc_nit = :nite AND C.conc_cod = 952 INTO :reembolso;
      IF (reembolso IS NULL ) THEN
      reembolso = 0;
      /*INCAPACIDAD*/
      SELECT N.nono_dura FROM NOMINA_NOVEDADES N WHERE N.terc_nit = :nite AND N.nono_periodo = :periodo AND N.nono_ano = :ano AND (N.tnov_cod = 2 OR (N.tnov_cod = 3)) INTO :diasnov;
      IF (:diasnov IS NULL) THEN
      incap = 0;
      ELSE
      incap = (:basico / 30)* :diasnov;
      /*BASICO*/
      SELECT N.noex_recnoct, N.noex_recfest
      FROM NOMINA_HORASEXT N WHERE N.noex_periodio = :periodo AND N.noex_ano = :ano AND N.terc_nit = :nite
      INTO :recnoct, :recfest;
      if (recnoct is null) then
       recnoct = 0;
      if (recfest is null) then
       recfest = 0;
      SELECT P.paan_recnoc, P.paan_recfest FROM PARAMETROS_ANO P WHERE P.paan_ano = :ano INTO :tar_recnotc, :tar_recfest;
      basico = ((:basico/30)*:diaslab) - (((:basico/30)/8)*:recnoct);
      basico = :basico - (((:basico/30)/8)*:recfest);
      /*HORAS EXTRA*/
      SELECT c.noex_monto FROM nomina_horasext c WHERE c.noex_ano = :ano AND c.noex_periodio = :periodo AND c.noex_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :horasex;
      if (horasex is null) then
       horasex = 0;
      /*RECARGOS*/
      SELECT E.empl_salario FROM EMPLEADOS E WHERE E.terc_nit = :nite INTO :basicorec;
      SELECT N.noex_recnoct, N.noex_recfest
      FROM NOMINA_HORASEXT N WHERE N.noex_periodio = :periodo AND N.noex_ano = :ano AND N.terc_nit = :nite
      INTO :recnoct, :recfest;
      if (recnoct is null) then
       recnoct = 0;
      if (recfest is null) then
       recfest = 0;
      SELECT P.paan_recnoc, P.paan_recfest FROM PARAMETROS_ANO P WHERE P.paan_ano = :ano INTO :tar_recnotc, :tar_recfest;
      recargo = (((:basicorec/30)/8)*:tar_recnotc)*:recnoct;
      recargo = :recargo + ((((:basicorec/30)/8)*:tar_recfest)*:recfest);
      /*basico*/
      if (:basico + :comision + :horasex + :retroact+ :reembolso + :incap+ :cambsaltrans < ((:smlv/30)*:diaslab)) then
      comision = :smlv + :comision;
      /*SMLV Y AUX. TRANSPORTE*/
      SELECT P.paan_auxtr, P.paan_salminimo FROM PARAMETROS_ANO P WHERE P.paan_ano = :ano INTO :auxtrans, :smlv;
      /*BASE*/
      valor = :basico + :comision + :horasex + :retroact+ :reembolso + :incap + :recargo + :cambsaltrans;
      IF ((conc_cod = 904) OR (conc_cod = 905) OR (conc_cod = 906) or (conc_cod = 934) ) THEN
      BEGIN
       entidad = :nitafp;
       IF (conc_cod = 904) THEN
       BEGIN
        SELECT A.paan_afptr FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
        VALOR = ((:valor) * :PORCEN) /100;
       END
       ELSE
       IF ((conc_cod = 905) OR (conc_cod = 906) or (conc_cod = 934)) THEN
       BEGIN
        SELECT A.paan_afpem FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
        VALOR = ((:valor) * :PORCEN) /100;
       END
      END
      ELSE
      IF ((conc_cod = 907) OR (conc_cod = 914) OR (conc_cod = 915) or (conc_cod = 938) ) THEN
      BEGIN
       entidad = :niteps;
       IF (conc_cod = 907) THEN
       BEGIN
        SELECT A.paan_epstr FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
        VALOR = ((:valor) * :PORCEN) /100;
       END
       ELSE
       IF ((conc_cod = 914) OR (conc_cod = 915) or (conc_cod = 938)) THEN
       BEGIN
        SELECT A.paan_epsem FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
        VALOR = ((:valor) * :PORCEN) /100;
       END
      END
      ELSE
      IF ((conc_cod = 910) OR (conc_cod = 911) OR (conc_cod = 916) OR (conc_cod = 917) OR (conc_cod = 918) OR (conc_cod = 919) or (conc_cod = 936) or (conc_cod = 939) or (conc_cod = 940)) THEN
      BEGIN
       entidad = :nitccf;
       IF ((conc_cod = 910) OR (conc_cod = 911) or (conc_cod = 936)) THEN
       BEGIN
        SELECT A.paan_ccf FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
        VALOR = ((:valor) * :PORCEN) /100;
       END
       ELSE
       IF ((conc_cod = 916) OR (conc_cod = 917) or (conc_cod = 939)) THEN
       BEGIN
        SELECT A.paan_icbf FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
        VALOR = ((:valor) * :PORCEN) /100;
       END
       ELSE
       IF ((conc_cod = 918) OR (conc_cod = 919) or (conc_cod = 940)) THEN
       BEGIN
        SELECT A.paan_sena FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
        VALOR = ((:valor) * :PORCEN) /100;
       END
      END
      ELSE
      IF ((conc_cod = 912) OR (conc_cod = 913)) THEN
      BEGIN
       entidad = :nitafc;
      EXECUTE PROCEDURE LEE_CONFIGURACION('NOMINA','LIQUIDACION','TOMAR BENEFICIOS PARA CALCULAR PROVISIONES')RETURNING_VALUES(:parambenef);
      if (parambenef = 'SI') then
      BEGIN
      SELECT SUM(ce.emco_monto)
      FROM empleado_conceptos CE, CONCEPTOS_NOMINA CN WHERE CN.conc_benefic = 'S' AND (CE.terc_nit = :nite) AND (CE.CONC_COD = CN.CONC_COD) AND
      ((CE.emco_fecini <= :fec AND CE.emco_fecfin >= :FEC) OR ((cn.conc_todosper = 'N') AND (CE.emco_ppago = :periodo)) OR
      (cn.conc_todosper = 'S'))
      INTO :beneficios;
      if (beneficios is null) then
       beneficios = 0;
      END
      ELSE
       beneficios = 0;
      SELECT P.paan_auxtr, P.paan_salminimo FROM PARAMETROS_ANO P WHERE P.paan_ano = :ano INTO :auxtrans, :smlv;
      if (:basico < (:smlv*2)) then
       auxtrans = (:auxtrans / 30) * :diaslab;
      ELSE
       auxtrans = 0;
       IF ((conc_cod = 912) OR (conc_cod = 913) or (conc_cod = 937)) THEN
       BEGIN
        SELECT A.paan_cesemp FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
        VALOR = ((:valor + :auxtrans + :beneficios) * :PORCEN) /100;
       END
      END
      ELSE
      BEGIN
       IF (comision IS NULL) THEN
       comision = 0;
       SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
       conc_monto = :basico + :comision;
       IF (conc_porc <> 0 AND conc_porc IS NOT NULL) THEN
       VALOR = (((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans + :incap) * :conc_porc) /100;
       ELSE
       IF (:porcen <> 0 AND :porcen IS NOT NULL) THEN
       VALOR = (((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans + :incap) * :porcen) /100;
       ELSE
       IF (:montos <> 0 AND :montos IS NOT NULL) THEN
       valor = :montos;
       ELSE
       IF (:conc_monto <> 0 AND :conc_monto IS NOT NULL) THEN
       valor = :conc_monto;
      END
     END
     item = :item + 1;
    END
    ELSE
    IF (conc_prov = 'S') THEN
    BEGIN
     horasex = NULL;
     diasnov = NULL;
     retroact = NULL;
     reembolso = NULL;
     beneficios = null;
     recargo = null;
     comision = null;
     incap = null;
     /*RECARGO*/
     SELECT E.empl_salario FROM EMPLEADOS E WHERE E.terc_nit = :nite INTO :basico;
     SELECT N.noex_recnoct, N.noex_recfest
     FROM NOMINA_HORASEXT N WHERE N.noex_periodio = :periodo AND N.noex_ano = :ano AND N.terc_nit = :nite
     INTO :recnoct, :recfest;
     if (recnoct is null) then
      recnoct = 0;
     if (recfest is null) then
      recfest = 0;
     SELECT P.paan_recnoc, P.paan_recfest FROM PARAMETROS_ANO P WHERE P.paan_ano = :ano INTO :tar_recnotc, :tar_recfest;
     recargo = (((:basico/30)/8)*:tar_recnotc)*:recnoct;
     recargo = :recargo + ((((:basico/30)/8)*:tar_recfest)*:recfest);
     /*BASICO*/
     SELECT N.noex_recnoct, N.noex_recfest
     FROM NOMINA_HORASEXT N WHERE N.noex_periodio = :periodo AND N.noex_ano = :ano AND N.terc_nit = :nite
     INTO :recnoct, :recfest;
     if (recnoct is null) then
      recnoct = 0;
     if (recfest is null) then
      recfest = 0;
     SELECT P.paan_recnoc, P.paan_recfest FROM PARAMETROS_ANO P WHERE P.paan_ano = :ano INTO :tar_recnotc, :tar_recfest;
     basico = ((:basico/30)*:diaslab) - (((:basico/30)/8)*:recnoct);
     basico = :basico - (((:basico/30)/8)*:recfest);
     /*BENEFICIOS*/
     EXECUTE PROCEDURE LEE_CONFIGURACION('NOMINA','LIQUIDACION','TOMAR BENEFICIOS PARA CALCULAR PROVISIONES')RETURNING_VALUES(:parambenef);
     if (parambenef = 'SI') then
     BEGIN
      SELECT SUM(ce.emco_monto)
      FROM empleado_conceptos CE, CONCEPTOS_NOMINA CN WHERE CN.conc_benefic = 'S' AND (CE.terc_nit = :nite) AND (CE.CONC_COD = CN.CONC_COD) AND
      ((CE.emco_fecini <= :fec AND CE.emco_fecfin >= :FEC) OR ((cn.conc_todosper = 'N') AND (CE.emco_ppago = :periodo)) OR
      (cn.conc_todosper = 'S'))
      INTO :beneficios;
      if (beneficios is null) then
        beneficios = 0;
     END
     ELSE
      beneficios = 0;
     if ((conc_cod <> 929) and (conc_cod <> 930)) then
     begin
        SELECT P.paan_auxtr, P.paan_salminimo FROM PARAMETROS_ANO P WHERE P.paan_ano = :ano INTO :auxtrans, :smlv;
        if (:basico < (:smlv*2)) then
           auxtrans = (:auxtrans / 30) * :diaslab;
        ELSE
           auxtrans = 0;
     end
     else
      auxtrans = 0;
     conc_monto = :basico;
     IF (conc_porc <> 0 AND conc_porc IS NOT NULL) THEN
     VALOR = (((:CONC_MONTO)+ :cambsaltrans + :incap + :recargo + :auxtrans + :beneficios) * :conc_porc) /100;
     ELSE
     IF (porcen <> 0 AND porcen IS NOT NULL) THEN
     VALOR = (((:CONC_MONTO)+ :cambsaltrans + :incap + :recargo + :auxtrans + :beneficios) * :porcen) /100;
     ELSE
     IF (montos <> 0 AND montos IS NOT NULL) THEN
     VALOR = :montos;
     ELSE
     IF (conc_monto <> 0 AND conc_monto IS NOT NULL) THEN
     VALOR = :conc_monto;
     item = :item + 1;
    END
    ELSE
    IF (conc_cod = 920) THEN
    BEGIN
     SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :valor;
     IF (valor IS NULL) THEN
     valor = 0;
     item = :item + 1;
    END
    ELSE
    IF (conc_cod = 900 OR (:conc_cod = 931)) THEN
    BEGIN
     SELECT c.noex_monto FROM nomina_horasext c WHERE c.noex_ano = :ano AND c.noex_periodio = :periodo AND c.noex_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :valor;
     IF (valor IS NULL) THEN
     valor = 0;
     item = :item + 1;
    END
    ELSE
    IF (conc_cod = 932) THEN
    BEGIN
     SELECT N.nono_dura FROM NOMINA_NOVEDADES N WHERE N.terc_nit = :nite AND N.nono_periodo = :periodo AND N.nono_ano = :ano AND (N.tnov_cod = 2 OR (N.tnov_cod = 3)) INTO :diasnov;
     IF (:diasnov IS NULL) THEN
     valor = 0;
     ELSE
     valor = (:basico / 30)* :diasnov;
    END
    ELSE
    IF (conc_cod = 921) THEN
    BEGIN
     IF (porcen IS NOT NULL AND porcen <> 0) THEN
     valor = ((basico / 30)* :diaslab ) * :PORCEN /100;
     ELSE
     IF (conc_porc IS NOT NULL AND conc_porc <> 0) THEN
     valor = ((basico / 30)* :diaslab ) * :conc_porc /100;
    END
    ELSE
    if (conc_cod = 953) then
    BEGIN
       SELECT E.empl_salario FROM EMPLEADOS E WHERE E.terc_nit = :nite INTO :basico;
       SELECT N.noex_recnoct, N.noex_recfest
       FROM NOMINA_HORASEXT N WHERE N.noex_periodio = :periodo AND N.noex_ano = :ano AND N.terc_nit = :nite
       INTO :recnoct, :recfest;
       if (recnoct is null) then
        recnoct = 0;
       if (recfest is null) then
        recfest = 0;
       SELECT P.paan_recnoc, P.paan_recfest FROM PARAMETROS_ANO P WHERE P.paan_ano = :ano INTO :tar_recnotc, :tar_recfest;
       valor = (((:basico/30)/8)*:tar_recnotc)*:recnoct;
       valor = :valor + ((((:basico/30)/8)*:tar_recfest)*:recfest);
    END
    if (conc_aporte = 'S') then
    begin
    if (entidad is null or (entidad = '') ) then
    entidad = :conc_entidad;
    end
    EXECUTE PROCEDURE LEE_CONFIGURACION('NOMINA','GENERAL','REDONDEO AL MULTIPLO DE DIEZ EN TOTALES')RETURNING_VALUES(:aprox);
    EXECUTE PROCEDURE REDONDEE(:valor, :aprox) RETURNING_VALUES (VALOR);
    IF ((mensual = 'N') OR (periodicidad = 1))  THEN
    INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
    VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
    ELSE
    IF (mensual = 'S') THEN
    BEGIN
     IF ((:periodicidad = 2) AND (liquidaper = 1)) THEN
     BEGIN
      IF ((periodo = 1) OR (periodo = 3) OR (periodo = 5) OR (periodo = 7) OR (periodo = 9) OR (periodo = 11)
      OR (periodo = 13) OR (periodo = 15) OR (periodo = 17) OR (periodo = 19) OR (periodo = 21) OR (periodo = 23)) THEN
      INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
      VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
     END
     ELSE
     IF ((:periodicidad = 2) AND (liquidaper = 2)) THEN
     BEGIN
      IF ((periodo = 2) OR (periodo = 4) OR (periodo = 6) OR (periodo = 8) OR (periodo = 10) OR (periodo = 12)
      OR (periodo = 14) OR (periodo = 16) OR (periodo = 18) OR (periodo = 20) OR (periodo = 22) OR (periodo = 24)) THEN
      INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
      VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
     END
     ELSE
     IF ((:periodicidad = 3) AND (liquidaper = 1)) THEN
     BEGIN
      IF ((periodo = 1) OR (periodo = 5) OR (periodo = 9) OR (periodo = 13) OR (periodo = 17) OR (periodo = 21)
      OR (periodo = 25) OR (periodo = 29) OR (periodo = 33) OR (periodo = 37) OR (periodo = 41) OR (periodo = 45)
      OR (periodo = 49)) THEN
      INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
      VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
    END
    ELSE
     IF ((:periodicidad = 3) AND (liquidaper = 2)) THEN
     BEGIN
      IF ((periodo = 2) OR (periodo = 6) OR (periodo = 10) OR (periodo = 14) OR (periodo = 18) OR (periodo = 22)
      OR (periodo = 26) OR (periodo = 30) OR (periodo = 34) OR (periodo = 38) OR (periodo = 42) OR (periodo = 46)
      OR (periodo = 50)) THEN
      INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
      VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
     END
     ELSE
     IF ((:periodicidad = 3) AND (liquidaper = 3)) THEN
     BEGIN
      IF ((periodo = 3) OR (periodo = 7) OR (periodo = 11) OR (periodo = 15) OR (periodo = 19) OR (periodo = 23)
      OR (periodo = 27) OR (periodo = 31) OR (periodo = 35) OR (periodo = 39) OR (periodo = 43) OR (periodo = 47)
      OR (periodo = 51)) THEN
      INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
      VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
     END
     ELSE
     IF ((:periodicidad = 3) AND (liquidaper = 4)) THEN
     BEGIN
      IF ((periodo = 4) OR (periodo = 8) OR (periodo = 12) OR (periodo = 16) OR (periodo = 20) OR (periodo = 24)
      OR (periodo = 29) OR (periodo = 32) OR (periodo = 36) OR (periodo = 40) OR (periodo = 44) OR (periodo = 48)
      OR (periodo = 52)) THEN
      INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
      VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
     END
    END
  VALOR = 0;
  basico = 0;
  END
 END
 END
 END
 SUSPEND;
END
^

SET TERM ; ^

update RDB$RELATION_FIELDS set
RDB$NULL_FLAG = 1
where (RDB$FIELD_NAME = 'NOEX_ANO') and
(RDB$RELATION_NAME = 'NOMINA_HORASEXT')
;

alter table NOMINA_HORASEXT
add constraint PK_NOMINA_HORASEXT
primary key (TERC_NIT,NOEX_ANO,NOEX_PERIODIO);

CREATE EXCEPTION "YA EXISTE EL REGISTRO" 'Ya existe el registro para este periodo, año y empleado';

SET TERM ^ ;

CREATE OR ALTER trigger nomina_horasext_bi for nomina_horasext
active before insert position 0
AS
declare variable existe char(1);
BEGIN
select max('S') FROM NOMINA_HORASEXT N WHERE N.noex_ano = NEW.noex_ano AND N.noex_periodio = NEW.noex_periodio AND N.TERC_NIT = NEW.terc_nit into :existe;
IF (NEW.noex_diur <> 0 OR NEW.noex_fdiur <> 0 OR NEW.noex_noct <> 0 OR NEW.noex_fnoct <> 0 OR NEW.noex_recnoct <> 0 OR NEW.noex_recfest <> 0) THEN
EXECUTE PROCEDURE liquida_horas_extra (NEW.terc_nit,NEW.noex_diur,NEW.noex_noct,NEW.noex_fdiur,NEW.noex_fnoct,NEW.noex_recnoct, NEW.noex_recfest,NEW.noex_ano,'N',NEW.NOEX_SALBASE)RETURNING_VALUES(NEW.noex_monto,new.noex_montorec);
END
^

SET TERM ; ^


SET TERM ^ ;

CREATE OR ALTER PROCEDURE CAUSA_NOMINA (
    fec date,
    periodo integer,
    periodicidad integer,
    pagoglobal char(1),
    ano char(4),
    depto integer)
returns (
    idnomina integer,
    itemini integer)
as
declare variable item integer;
declare variable nite varchar(20) character set none;
declare variable nit_tercero varchar(20);
declare variable concept integer;
declare variable montos numeric(18,2);
declare variable porcen numeric(9,4);
declare variable entidad varchar(20);
declare variable conc_cod integer;
declare variable conc_deduc char(1);
declare variable conc_porc numeric(9,4);
declare variable conc_entidad integer;
declare variable conc_monto numeric(18,2);
declare variable conc_modifi char(1);
declare variable conc_promedio char(1);
declare variable emco_perprom integer;
declare variable valor numeric(18,2);
declare variable diaslab integer;
declare variable conc_prov char(1);
declare variable conc_aporte char(1);
declare variable numeroprom integer;
declare variable conc_aplicaprom char(1);
declare variable perinicial integer;
declare variable anoprom integer;
declare variable conc_dias char(1);
declare variable conc_otroconc char(1);
declare variable conc_codotroconc integer;
declare variable anosum integer;
declare variable salario char(1) character set none;
declare variable liquidaper integer;
declare variable rmod numeric(2,2);
declare variable basico numeric(18,2);
declare variable niteps varchar(20);
declare variable nitafc varchar(20);
declare variable nitafp varchar(20);
declare variable nitccf varchar(20);
declare variable gtoempr char(1);
declare variable comision numeric(18,2);
declare variable cambsaltrans numeric(18,2);
declare variable saldosini numeric(18,2);
declare variable duranov integer;
declare variable base numeric(18,2);
declare variable aprox integer;
declare variable mensual char(1);
declare variable horasex numeric(18,2);
declare variable diasnov integer;
declare variable tomasal integer;
declare variable retroact numeric(18,2);
declare variable reembolso numeric(18,2);
declare variable incap numeric(18,2);
declare variable deptoempl integer;
declare variable auxtrans numeric(18,2);
declare variable smlv numeric(18,2);
declare variable beneficios numeric(18,2);
declare variable confirmado char(1);
declare variable recnoct numeric(18,2);
declare variable recfest numeric(18,2);
declare variable tar_recnotc numeric(9,4);
declare variable tar_recfest numeric(9,4);
declare variable recargo numeric(18,2);
declare variable basicorec numeric(18,2);
declare variable parambenef char(2);
BEGIN
 SELECT N.NOMI_ID, N.nomi_liqok FROM NOMINA N WHERE N.nomi_periodo = :periodo AND N.nomi_periodocidad = :periodicidad AND N.nomi_ano = :ano
 INTO :IDNOMINA, :CONFIRMADO;
 IF (:idnomina IS NULL) THEN
 BEGIN
  EXECUTE PROCEDURE cambie_id_nomina RETURNING_VALUES(:idnomina);
  INSERT INTO nomina (nomi_id, NOMI_FECCAUSA, NOMI_PAGOGLOBAL, NOMI_PERIODOCIDAD, NOMI_PERIODO, NOMI_ANO, NOMI_LIQOK)
  VALUES (:IDNOMINA, :fec,:pagoglobal, :periodicidad, :periodo, :ano, 'N');
  item = 1;
 END
 ELSE
 BEGIN
  SELECT MAX(N.noco_item) FROM NOMINA_CONCEPTOS N WHERE N.nomi_id = :idnomina
  INTO :item;
 END
 if ((confirmado = 'S') AND (idnomina IS NOT NULL)) then
 BEGIN
  idnomina = 0;
 END
 else
 begin
 IF (DEPTO = 0) THEN
  INSERT INTO NOMINA_DEPARTAMENTO (nomi_id, nodp_depto)VALUES(:IDNOMINA,0);
 ELSE
  INSERT INTO NOMINA_DEPARTAMENTO (nomi_id, nodp_depto)VALUES(:IDNOMINA,:DEPTO);
 ITEMINI = ITEM;
 FOR SELECT E.TERC_NIT, E.empl_salario, e.empl_eps, e.empl_afc, e.empl_afp, e.empl_ccf, e.empl_dpto
 FROM EMPLEADOS E
 WHERE E.empl_ppago = :periodicidad AND ((E.empl_fecret IS NULL) OR (E.empl_fecret > :fec)) AND E.empl_fecing <= :fec
 INTO :nite, :basico, :niteps, :nitafc, :nitafp, :nitccf, :deptoempl
 DO
 BEGIN
 IF ((depto = 0) OR (deptoempl = :depto)) THEN
 BEGIN
  FOR SELECT CE.TERC_NIT, CE.CONC_COD, CE.EMCO_MONTO, CE.EMCO_PORC, ce.empl_entidad, CE.emco_perprom, CE.emco_luquidaper, CE.emco_mensual, CN.CONC_COD, CN.CONC_DEDUC,CN.CONC_PORC, CN.CONC_ENTIDAD, CN.CONC_MONTO,  CN.CONC_DIAS, CN.CONC_MODIFI,
  CN.CONC_PROMEDIO, CN.conc_salario, CE.emco_perprom, CN.conc_prov, CN.conc_aporte, CN.conc_aplicaprom, cn.conc_otroconc, cn.conc_codotroconc, CN.conc_gtoempr, CN.conc_base, CE.emco_tomsal
  FROM empleado_conceptos CE, CONCEPTOS_NOMINA CN WHERE (CE.CONC_COD = CN.CONC_COD) AND (CE.terc_nit = :nite) AND
  (((CE.emco_fecini <= :fec AND CE.emco_fecfin >= :FEC)) OR
  ((cn.conc_todosper = 'N') AND (CE.emco_ppago = :periodo)) OR (cn.conc_todosper = 'S'))  ORDER BY (TERC_NIT )
  INTO :nit_tercero, :concept,  :montos, :porcen, :entidad, :numeroprom, :liquidaper, :mensual ,:CONC_COD, :CONC_DEDUC, :CONC_PORC,
  :CONC_ENTIDAD, :CONC_MONTO, :CONC_DIAS, :CONC_MODIFI,:CONC_PROMEDIO, :salario,:EMCO_PERPROM, :conc_prov, :conc_aporte , :CONC_APLICAPROM, :conc_otroconc, :conc_codotroconc, :gtoempr, :base, :tomasal
  DO
  BEGIN
   IF (conc_dias = 'S') THEN
   EXECUTE PROCEDURE DIAS_LABORADOS (:nite, :periodo, :fec, :mensual,:conc_aporte) RETURNING_VALUES (:diaslab);
   ELSE
   BEGIN
    diaslab = 15;
    IF (mensual = 'S') THEN
    BEGIN
     IF (periodicidad = 2) THEN
     diaslab = 30;
     ELSE
     IF (liquidaper = 3) THEN
     diaslab = 30;
    END
   END
   IF (:tomasal <> 0) THEN
   BEGIN
    IF ((:periodicidad = 2) AND (:tomasal <> 2)) THEN
    BEGIN
     IF ((periodo = 2) OR (periodo = 4) OR (periodo = 6) OR (periodo = 8) OR (periodo = 10) OR (periodo = 12)
     OR (periodo = 14) OR (periodo = 16) OR (periodo = 18) OR (periodo = 20) OR (periodo = 22) OR (periodo = 24)) THEN
     basico = 0;
    END
    ELSE
    IF ((:periodicidad = 3) AND (:tomasal <> 1)) THEN
    BEGIN
     IF ((periodo = 1) OR (periodo = 5) OR (periodo = 9) OR (periodo = 13) OR (periodo = 17) OR (periodo = 21)
     OR (periodo = 25) OR (periodo = 29) OR (periodo = 33) OR (periodo = 37) OR (periodo = 41) OR (periodo = 45)
     OR (periodo = 49)) THEN
     basico = 0;
    END
    ELSE
     IF ((:periodicidad = 3) AND (:tomasal <> 2)) THEN
     BEGIN
      IF ((periodo = 2) OR (periodo = 6) OR (periodo = 10) OR (periodo = 14) OR (periodo = 18) OR (periodo = 22)
      OR (periodo = 26) OR (periodo = 30) OR (periodo = 34) OR (periodo = 38) OR (periodo = 42) OR (periodo = 46)
      OR (periodo = 50)) THEN
      basico = 0;
     END
     ELSE
     IF ((:periodicidad = 3) AND (:tomasal <> 3)) THEN
     BEGIN
      IF ((periodo = 3) OR (periodo = 7) OR (periodo = 11) OR (periodo = 15) OR (periodo = 19) OR (periodo = 23)
      OR (periodo = 27) OR (periodo = 31) OR (periodo = 35) OR (periodo = 39) OR (periodo = 43) OR (periodo = 47)
      OR (periodo = 51)) THEN
      basico = 0;
     END
     ELSE
     IF ((:periodicidad = 3) AND (:tomasal <> 4)) THEN
     BEGIN
      IF ((periodo = 4) OR (periodo = 8) OR (periodo = 12) OR (periodo = 16) OR (periodo = 20) OR (periodo = 24)
      OR (periodo = 29) OR (periodo = 32) OR (periodo = 36) OR (periodo = 40) OR (periodo = 44) OR (periodo = 48)
      OR (periodo = 52)) THEN
      basico = 0;
     END
   END
   ELSE
    BEGIN
     SELECT E.empl_salario FROM EMPLEADOS E WHERE E.terc_nit = :nite INTO :basico;
    END
    SELECT ((n.nono_valor /30) * n.nono_dura), (n.nono_dura) FROM nomina_novedades n WHERE n.tnov_cod = 11 AND n.terc_nit = :nite AND n.nono_periodo = :periodo INTO :cambsaltrans, :duranov;
    IF (cambsaltrans IS NULL) THEN
    cambsaltrans = 0;
    IF (duranov IS NULL) THEN
    duranov = 0;
    diaslab = :diaslab - :duranov;
    IF (conc_cod = 922) THEN
    BEGIN
     SELECT SUM(P.prcu_monto) FROM prestamo_cuotas P, prestamo_nomina PN WHERE P.prcu_ano = :ano AND P.prcu_periodo = :periodo AND PN.prno_id = P.prno_id AND PN.terc_nit = :nite INTO :valor;
     IF (valor IS NULL) THEN
     valor = 0;
     item = :item + 1;
     UPDATE prestamo_cuotas  P SET prcu_ok = 'S' WHERE P.prcu_ano = :ano AND P.prcu_periodo = :periodo AND P.prno_id = (SELECT PN.prno_id FROM PRESTAMO_NOMINA PN WHERE PN.terc_nit = :nite);
    END
    ELSE
    IF ((:montos = 0) OR (:montos IS NULL)) THEN
    BEGIN
     IF ((CONC_PORC = 0 AND :porcen = 0) OR (CONC_PORC IS NULL AND :porcen = 0) OR (CONC_PORC = 0 AND :porcen IS NULL) OR (CONC_PORC IS NULL AND :porcen IS NULL) ) THEN
     BEGIN
      IF ((conc_monto <> 0) AND (conc_monto IS NOT NULL) ) THEN
      BEGIN
       VALOR = :CONC_MONTO;
       IF (:conc_dias = 'S') THEN
       valor = (:valor / 30) * :diaslab;
      END
      ELSE
      IF (salario = 'S' AND CONC_COD <> 900 AND CONC_COD <> 920 and conc_cod <> 932 AND CONC_COD <> 953) THEN
      BEGIN
       SELECT E.empl_salario FROM EMPLEADOS E WHERE E.terc_nit = :nite INTO :basico;
       SELECT N.noex_recnoct, N.noex_recfest
       FROM NOMINA_HORASEXT N WHERE N.noex_periodio = :periodo AND N.noex_ano = :ano AND N.terc_nit = :nite
       INTO :recnoct, :recfest;
       if (recnoct is null) then
        recnoct = 0;
       if (recfest is null) then
        recfest = 0;
       SELECT P.paan_recnoc, P.paan_recfest FROM PARAMETROS_ANO P WHERE P.paan_ano = :ano INTO :tar_recnotc, :tar_recfest;
       basico = ((:basico/30)*:diaslab) - (((:basico/30)/8)*:recnoct);
       basico = :basico - (((:basico/30)/8)*:recfest);
       conc_monto = :basico;
       VALOR = (:conc_monto/*/30 * :diaslab*/ ) + :cambsaltrans;
      END
      ELSE
      BEGIN
       valor = montos;
       IF (:conc_dias = 'S') THEN
       valor = (:valor / 30) * :diaslab;
      END
     END
     ELSE
     BEGIN
      IF (:porcen <> 0) THEN
      BEGIN
       IF ((conc_monto <> 0) AND (conc_monto IS NOT NULL) ) THEN
       BEGIN
        VALOR = ((:CONC_MONTO ) * :PORCEN) /100;
       END
      END
      ELSE
      BEGIN
       IF ((conc_monto <> 0) AND (conc_monto IS NOT NULL) ) THEN
       BEGIN
        VALOR = ((:CONC_MONTO) * :conc_porc) /100;
       END
       ELSE
       IF (salario = 'S' AND CONC_COD <> 900 AND CONC_COD <> 920 and conc_cod <> 932 AND CONC_COD <> 953) THEN
       BEGIN
       SELECT E.empl_salario FROM EMPLEADOS E WHERE E.terc_nit = :nite INTO :basico;
       SELECT N.noex_recnoct, N.noex_recfest
       FROM NOMINA_HORASEXT N WHERE N.noex_periodio = :periodo AND N.noex_ano = :ano AND N.terc_nit = :nite
       INTO :recnoct, :recfest;
       if (recnoct is null) then
        recnoct = 0;
       if (recfest is null) then
        recfest = 0;
       SELECT P.paan_recnoc, P.paan_recfest FROM PARAMETROS_ANO P WHERE P.paan_ano = :ano INTO :tar_recnotc, :tar_recfest;
       basico = ((:basico/30)*:diaslab) - (((:basico/30)/8)*:recnoct);
       basico = :basico - (((:basico/30)/8)*:recfest);
        conc_monto = :basico;
        VALOR = ((:CONC_MONTO)+ :cambsaltrans * :conc_porc) /100;
       END
       ELSE
       IF (:conc_monto = 0 AND :montos = 0) THEN
       BEGIN
        conc_monto = :basico;
        VALOR = (((:CONC_MONTO / 30) * :diaslab) + :cambsaltrans * :conc_porc) /100;
       END
      END
     END
    END
    ELSE
    IF ((CONC_PORC = 0 OR (conc_porc IS NULL)) AND (:porcen = 0 OR (porcen IS NULL))) THEN
    BEGIN
     VALOR = (:montos);
     IF (:conc_dias = 'S') THEN
     valor = (:valor / 30) * :diaslab;
    END
    ELSE
    IF (:porcen <> 0 AND porcen IS NOT NULL) THEN
    BEGIN
     VALOR = ((:MONTOS ) * :PORCEN) /100;
    END
    ELSE
    BEGIN
     VALOR = ((:montos) * :CONC_PORC) /100;
    END
    IF (conc_promedio = 'S') THEN
    BEGIN
     perinicial = :periodo - (:numeroprom) + 1;
     anoprom = CAST (ano AS INTEGER);
     IF (perinicial <= 0) THEN
     BEGIN
      perinicial = 1;
      anoprom = CAST(ANO AS INTEGER) - 1;
     END
     SELECT SUM (noco_valor) FROM nomina_conceptos n WHERE n.noco_aplicaprom = 'S' AND N.noco_periodo >= :perinicial - 1 AND N.noco_periodo < :periodo AND N.noco_ano >= :anoprom AND N.noco_ano <= :ano AND terc_nit = :nite INTO :valor;
     valor = ((valor ) / (numeroprom -1 ));
     SELECT NOCO_VALOR FROM NOMINA_CONCEPTOS WHERE CONC_COD = :conc_cod AND TERC_NIT  = :nite AND NOCO_PAGOOK = 'N' AND NOCO_PERIODO = 0 INTO :saldosini;
     IF (saldosini IS NULL) THEN
     saldosini = 0;
     ELSE
     UPDATE nomina_conceptos N SET noco_pagook = 'S' WHERE n.noco_aplicaprom = 'S' AND N.noco_periodo >= :perinicial - 1 AND N.noco_periodo < :periodo AND N.noco_ano >= :anoprom AND N.noco_ano <= :ano  AND CONC_COD = :conc_cod AND terc_nit = :nite AND NOCO_PERIODO = 0;
     VALOR = :valor + :saldosini;
     UPDATE nomina_conceptos N SET noco_pagook = 'S' WHERE n.noco_aplicaprom = 'S' AND N.noco_periodo >= :perinicial - 1 AND N.noco_periodo < :periodo AND N.noco_ano >= :anoprom AND N.noco_ano <= :ano  AND CONC_COD = :conc_cod AND terc_nit = :nite;
    END
    ELSE
    IF (conc_otroconc = 'S') THEN
    BEGIN
     anosum = CAST(ano AS INTEGER);
     anosum = anosum - 1;
     SELECT SUM (noco_valor) FROM nomina_conceptos n WHERE n.noco_ano = :anosum AND n.conc_cod = :conc_codotroconc AND N.terc_nit = :nite INTO :valor;
     SELECT NOCO_VALOR FROM NOMINA_CONCEPTOS WHERE noco_ano = :anosum AND conc_cod = :conc_codotroconc AND terc_nit = :nite AND NOCO_PERIODO = 0 INTO :saldosini;
     IF (saldosini IS NULL) THEN
     saldosini = 0;
     ELSE
     UPDATE nomina_conceptos SET noco_pagook = 'S' WHERE noco_ano = :anosum AND conc_cod = :conc_codotroconc AND NOCO_PERIODO = 0 AND terc_nit = :nite;
     VALOR = :valor + :saldosini;
     UPDATE nomina_conceptos SET noco_pagook = 'S' WHERE noco_ano = :anosum AND conc_cod = :conc_codotroconc AND terc_nit = :nite;
    END
    ELSE
    IF (conc_aporte = 'S') THEN
    BEGIN
     horasex = NULL;
     diasnov = NULL;
     retroact = NULL;
     reembolso = NULL;
     beneficios = null;
     recargo = null;
     comision = null;
     incap = null;
     IF ((:entidad = '' ) OR (entidad IS NULL)) THEN
     BEGIN
      /*COMISIONES*/
      SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
      IF (comision IS NULL) THEN
      comision = 0;
      /*RETROACTIVO*/
      SELECT C.emco_monto FROM EMPLEADO_CONCEPTOS C WHERE C.terc_nit = :nite AND C.conc_cod = 933 INTO :retroact;
      IF (retroact IS NULL ) THEN
      retroact = 0;
      /*REEMBOLSO*/
      SELECT C.emco_monto FROM EMPLEADO_CONCEPTOS C WHERE C.terc_nit = :nite AND C.conc_cod = 952 INTO :reembolso;
      IF (reembolso IS NULL ) THEN
      reembolso = 0;
      /*INCAPACIDAD*/
      SELECT N.nono_dura FROM NOMINA_NOVEDADES N WHERE N.terc_nit = :nite AND N.nono_periodo = :periodo AND N.nono_ano = :ano AND (N.tnov_cod = 2 OR (N.tnov_cod = 3)) INTO :diasnov;
      IF (:diasnov IS NULL) THEN
      incap = 0;
      ELSE
      incap = (:basico / 30)* :diasnov;
      /*BASICO*/
      SELECT N.noex_recnoct, N.noex_recfest
      FROM NOMINA_HORASEXT N WHERE N.noex_periodio = :periodo AND N.noex_ano = :ano AND N.terc_nit = :nite
      INTO :recnoct, :recfest;
      if (recnoct is null) then
       recnoct = 0;
      if (recfest is null) then
       recfest = 0;
      SELECT P.paan_recnoc, P.paan_recfest FROM PARAMETROS_ANO P WHERE P.paan_ano = :ano INTO :tar_recnotc, :tar_recfest;
      basico = ((:basico/30)*:diaslab) - (((:basico/30)/8)*:recnoct);
      basico = :basico - (((:basico/30)/8)*:recfest);
      /*HORAS EXTRA*/
      SELECT c.noex_monto FROM nomina_horasext c WHERE c.noex_ano = :ano AND c.noex_periodio = :periodo AND c.noex_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :horasex;
      if (horasex is null) then
       horasex = 0;
      /*RECARGOS*/
      SELECT E.empl_salario FROM EMPLEADOS E WHERE E.terc_nit = :nite INTO :basicorec;
      SELECT N.noex_recnoct, N.noex_recfest
      FROM NOMINA_HORASEXT N WHERE N.noex_periodio = :periodo AND N.noex_ano = :ano AND N.terc_nit = :nite
      INTO :recnoct, :recfest;
      if (recnoct is null) then
       recnoct = 0;
      if (recfest is null) then
       recfest = 0;
      SELECT P.paan_recnoc, P.paan_recfest FROM PARAMETROS_ANO P WHERE P.paan_ano = :ano INTO :tar_recnotc, :tar_recfest;
      recargo = (((:basicorec/30)/8)*:tar_recnotc)*:recnoct;
      recargo = :recargo + ((((:basicorec/30)/8)*:tar_recfest)*:recfest);
      /*basico*/
      if (:basico + :comision + :horasex + :retroact+ :reembolso + :incap+ :cambsaltrans < ((:smlv/30)*:diaslab)) then
      comision = :smlv + :comision;
      /*SMLV Y AUX. TRANSPORTE*/
      SELECT P.paan_auxtr, P.paan_salminimo FROM PARAMETROS_ANO P WHERE P.paan_ano = :ano INTO :auxtrans, :smlv;
      /*BASE*/
      valor = :basico + :comision + :horasex + :retroact+ :reembolso + :incap + :recargo + :cambsaltrans;
      IF ((conc_cod = 904) OR (conc_cod = 905) OR (conc_cod = 906) or (conc_cod = 934) ) THEN
      BEGIN
       entidad = :nitafp;
       IF (conc_cod = 904) THEN
       BEGIN
        SELECT A.paan_afptr FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
        VALOR = ((:valor) * :PORCEN) /100;
       END
       ELSE
       IF ((conc_cod = 905) OR (conc_cod = 906) or (conc_cod = 934)) THEN
       BEGIN
        SELECT A.paan_afpem FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
        VALOR = ((:valor) * :PORCEN) /100;
       END
      END
      ELSE
      IF ((conc_cod = 907) OR (conc_cod = 914) OR (conc_cod = 915) or (conc_cod = 938) ) THEN
      BEGIN
       entidad = :niteps;
       IF (conc_cod = 907) THEN
       BEGIN
        SELECT A.paan_epstr FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
        VALOR = ((:valor) * :PORCEN) /100;
       END
       ELSE
       IF ((conc_cod = 914) OR (conc_cod = 915) or (conc_cod = 938)) THEN
       BEGIN
        SELECT A.paan_epsem FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
        VALOR = ((:valor) * :PORCEN) /100;
       END
      END
      ELSE
      IF ((conc_cod = 910) OR (conc_cod = 911) OR (conc_cod = 916) OR (conc_cod = 917) OR (conc_cod = 918) OR (conc_cod = 919) or (conc_cod = 936) or (conc_cod = 939) or (conc_cod = 940)) THEN
      BEGIN
       entidad = :nitccf;
       IF ((conc_cod = 910) OR (conc_cod = 911) or (conc_cod = 936)) THEN
       BEGIN
        SELECT A.paan_ccf FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
        VALOR = ((:valor) * :PORCEN) /100;
       END
       ELSE
       IF ((conc_cod = 916) OR (conc_cod = 917) or (conc_cod = 939)) THEN
       BEGIN
        SELECT A.paan_icbf FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
        VALOR = ((:valor) * :PORCEN) /100;
       END
       ELSE
       IF ((conc_cod = 918) OR (conc_cod = 919) or (conc_cod = 940)) THEN
       BEGIN
        SELECT A.paan_sena FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
        VALOR = ((:valor) * :PORCEN) /100;
       END
      END
      ELSE
      IF ((conc_cod = 912) OR (conc_cod = 913)) THEN
      BEGIN
       entidad = :nitafc;
      EXECUTE PROCEDURE LEE_CONFIGURACION('NOMINA','LIQUIDACION','TOMAR BENEFICIOS PARA CALCULAR PROVISIONES')RETURNING_VALUES(:parambenef);
      if (parambenef = 'SI') then
      BEGIN
      SELECT SUM(ce.emco_monto)
      FROM empleado_conceptos CE, CONCEPTOS_NOMINA CN WHERE CN.conc_benefic = 'S' AND (CE.terc_nit = :nite) AND (CE.CONC_COD = CN.CONC_COD) AND
      ((CE.emco_fecini <= :fec AND CE.emco_fecfin >= :FEC) OR ((cn.conc_todosper = 'N') AND (CE.emco_ppago = :periodo)) OR
      (cn.conc_todosper = 'S'))
      INTO :beneficios;
      if (beneficios is null) then
       beneficios = 0;
      END
      ELSE
       beneficios = 0;
      SELECT P.paan_auxtr, P.paan_salminimo FROM PARAMETROS_ANO P WHERE P.paan_ano = :ano INTO :auxtrans, :smlv;
      if (:basico < (:smlv*2)) then
       auxtrans = (:auxtrans / 30) * :diaslab;
      ELSE
       auxtrans = 0;
       IF ((conc_cod = 912) OR (conc_cod = 913) or (conc_cod = 937)) THEN
       BEGIN
        SELECT A.paan_cesemp FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
        VALOR = ((:valor + :auxtrans + :beneficios) * :PORCEN) /100;
       END
      END
      ELSE
      BEGIN
       IF (comision IS NULL) THEN
       comision = 0;
       SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
       conc_monto = :basico + :comision;
       IF (conc_porc <> 0 AND conc_porc IS NOT NULL) THEN
       VALOR = (((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans + :incap) * :conc_porc) /100;
       ELSE
       IF (:porcen <> 0 AND :porcen IS NOT NULL) THEN
       VALOR = (((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans + :incap) * :porcen) /100;
       ELSE
       IF (:montos <> 0 AND :montos IS NOT NULL) THEN
       valor = :montos;
       ELSE
       IF (:conc_monto <> 0 AND :conc_monto IS NOT NULL) THEN
       valor = :conc_monto;
      END
     END
     item = :item + 1;
    END
    ELSE
    IF (conc_prov = 'S') THEN
    BEGIN
     horasex = NULL;
     diasnov = NULL;
     retroact = NULL;
     reembolso = NULL;
     beneficios = null;
     recargo = null;
     comision = null;
     incap = null;
     /*RECARGO*/
     SELECT E.empl_salario FROM EMPLEADOS E WHERE E.terc_nit = :nite INTO :basico;
     SELECT N.noex_recnoct, N.noex_recfest
     FROM NOMINA_HORASEXT N WHERE N.noex_periodio = :periodo AND N.noex_ano = :ano AND N.terc_nit = :nite
     INTO :recnoct, :recfest;
     if (recnoct is null) then
      recnoct = 0;
     if (recfest is null) then
      recfest = 0;
     SELECT P.paan_recnoc, P.paan_recfest FROM PARAMETROS_ANO P WHERE P.paan_ano = :ano INTO :tar_recnotc, :tar_recfest;
     recargo = (((:basico/30)/8)*:tar_recnotc)*:recnoct;
     recargo = :recargo + ((((:basico/30)/8)*:tar_recfest)*:recfest);
     /*BASICO*/
     SELECT N.noex_recnoct, N.noex_recfest
     FROM NOMINA_HORASEXT N WHERE N.noex_periodio = :periodo AND N.noex_ano = :ano AND N.terc_nit = :nite
     INTO :recnoct, :recfest;
     if (recnoct is null) then
      recnoct = 0;
     if (recfest is null) then
      recfest = 0;
     SELECT P.paan_recnoc, P.paan_recfest FROM PARAMETROS_ANO P WHERE P.paan_ano = :ano INTO :tar_recnotc, :tar_recfest;
     basico = ((:basico/30)*:diaslab) - (((:basico/30)/8)*:recnoct);
     basico = :basico - (((:basico/30)/8)*:recfest);
      /*INCAPACIDAD*/
      SELECT N.nono_dura FROM NOMINA_NOVEDADES N WHERE N.terc_nit = :nite AND N.nono_periodo = :periodo AND N.nono_ano = :ano AND (N.tnov_cod = 2 OR (N.tnov_cod = 3)) INTO :diasnov;
      IF (:diasnov IS NULL) THEN
      incap = 0;
      ELSE
      incap = (:basico / 30)* :diasnov;
     /*BENEFICIOS*/
     EXECUTE PROCEDURE LEE_CONFIGURACION('NOMINA','LIQUIDACION','TOMAR BENEFICIOS PARA CALCULAR PROVISIONES')RETURNING_VALUES(:parambenef);
     if (parambenef = 'SI') then
     BEGIN
      SELECT SUM(ce.emco_monto)
      FROM empleado_conceptos CE, CONCEPTOS_NOMINA CN WHERE CN.conc_benefic = 'S' AND (CE.terc_nit = :nite) AND (CE.CONC_COD = CN.CONC_COD) AND
      ((CE.emco_fecini <= :fec AND CE.emco_fecfin >= :FEC) OR ((cn.conc_todosper = 'N') AND (CE.emco_ppago = :periodo)) OR
      (cn.conc_todosper = 'S'))
      INTO :beneficios;
      if (beneficios is null) then
        beneficios = 0;
     END
     ELSE
      beneficios = 0;
     if ((conc_cod <> 929) and (conc_cod <> 930)) then
     begin
        SELECT P.paan_auxtr, P.paan_salminimo FROM PARAMETROS_ANO P WHERE P.paan_ano = :ano INTO :auxtrans, :smlv;
        if (:basico < (:smlv*2)) then
           auxtrans = (:auxtrans / 30) * :diaslab;
        ELSE
           auxtrans = 0;
     end
     else
      auxtrans = 0;
     conc_monto = :basico;
     IF (conc_porc <> 0 AND conc_porc IS NOT NULL) THEN
     VALOR = (((:CONC_MONTO)+ :cambsaltrans + :incap + :recargo + :auxtrans + :beneficios) * :conc_porc) /100;
     ELSE
     IF (porcen <> 0 AND porcen IS NOT NULL) THEN
     VALOR = (((:CONC_MONTO)+ :cambsaltrans + :incap + :recargo + :auxtrans + :beneficios) * :porcen) /100;
     ELSE
     IF (montos <> 0 AND montos IS NOT NULL) THEN
     VALOR = :montos;
     ELSE
     IF (conc_monto <> 0 AND conc_monto IS NOT NULL) THEN
     VALOR = :conc_monto;
     item = :item + 1;
    END
    ELSE
    IF (conc_cod = 920) THEN
    BEGIN
     SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :valor;
     IF (valor IS NULL) THEN
     valor = 0;
     item = :item + 1;
    END
    ELSE
    IF (conc_cod = 900 OR (:conc_cod = 931)) THEN
    BEGIN
     SELECT c.noex_monto FROM nomina_horasext c WHERE c.noex_ano = :ano AND c.noex_periodio = :periodo AND c.noex_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :valor;
     IF (valor IS NULL) THEN
     valor = 0;
     item = :item + 1;
    END
    ELSE
    IF (conc_cod = 932) THEN
    BEGIN
     SELECT N.nono_dura FROM NOMINA_NOVEDADES N WHERE N.terc_nit = :nite AND N.nono_periodo = :periodo AND N.nono_ano = :ano AND (N.tnov_cod = 2 OR (N.tnov_cod = 3)) INTO :diasnov;
     IF (:diasnov IS NULL) THEN
     valor = 0;
     ELSE
     valor = (:basico / 30)* :diasnov;
    END
    ELSE
    IF (conc_cod = 921) THEN
    BEGIN
     IF (porcen IS NOT NULL AND porcen <> 0) THEN
     valor = ((basico / 30)* :diaslab ) * :PORCEN /100;
     ELSE
     IF (conc_porc IS NOT NULL AND conc_porc <> 0) THEN
     valor = ((basico / 30)* :diaslab ) * :conc_porc /100;
    END
    ELSE
    if (conc_cod = 953) then
    BEGIN
       SELECT E.empl_salario FROM EMPLEADOS E WHERE E.terc_nit = :nite INTO :basico;
       SELECT N.noex_recnoct, N.noex_recfest
       FROM NOMINA_HORASEXT N WHERE N.noex_periodio = :periodo AND N.noex_ano = :ano AND N.terc_nit = :nite
       INTO :recnoct, :recfest;
       if (recnoct is null) then
        recnoct = 0;
       if (recfest is null) then
        recfest = 0;
       SELECT P.paan_recnoc, P.paan_recfest FROM PARAMETROS_ANO P WHERE P.paan_ano = :ano INTO :tar_recnotc, :tar_recfest;
       valor = (((:basico/30)/8)*:tar_recnotc)*:recnoct;
       valor = :valor + ((((:basico/30)/8)*:tar_recfest)*:recfest);
    END
    if (conc_aporte = 'S') then
    begin
    if (entidad is null or (entidad = '') ) then
    entidad = :conc_entidad;
    end
    EXECUTE PROCEDURE LEE_CONFIGURACION('NOMINA','GENERAL','REDONDEO AL MULTIPLO DE DIEZ EN TOTALES')RETURNING_VALUES(:aprox);
    EXECUTE PROCEDURE REDONDEE(:valor, :aprox) RETURNING_VALUES (VALOR);
    IF ((mensual = 'N') OR (periodicidad = 1))  THEN
    INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
    VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
    ELSE
    IF (mensual = 'S') THEN
    BEGIN
     IF ((:periodicidad = 2) AND (liquidaper = 1)) THEN
     BEGIN
      IF ((periodo = 1) OR (periodo = 3) OR (periodo = 5) OR (periodo = 7) OR (periodo = 9) OR (periodo = 11)
      OR (periodo = 13) OR (periodo = 15) OR (periodo = 17) OR (periodo = 19) OR (periodo = 21) OR (periodo = 23)) THEN
      INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
      VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
     END
     ELSE
     IF ((:periodicidad = 2) AND (liquidaper = 2)) THEN
     BEGIN
      IF ((periodo = 2) OR (periodo = 4) OR (periodo = 6) OR (periodo = 8) OR (periodo = 10) OR (periodo = 12)
      OR (periodo = 14) OR (periodo = 16) OR (periodo = 18) OR (periodo = 20) OR (periodo = 22) OR (periodo = 24)) THEN
      INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
      VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
     END
     ELSE
     IF ((:periodicidad = 3) AND (liquidaper = 1)) THEN
     BEGIN
      IF ((periodo = 1) OR (periodo = 5) OR (periodo = 9) OR (periodo = 13) OR (periodo = 17) OR (periodo = 21)
      OR (periodo = 25) OR (periodo = 29) OR (periodo = 33) OR (periodo = 37) OR (periodo = 41) OR (periodo = 45)
      OR (periodo = 49)) THEN
      INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
      VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
    END
    ELSE
     IF ((:periodicidad = 3) AND (liquidaper = 2)) THEN
     BEGIN
      IF ((periodo = 2) OR (periodo = 6) OR (periodo = 10) OR (periodo = 14) OR (periodo = 18) OR (periodo = 22)
      OR (periodo = 26) OR (periodo = 30) OR (periodo = 34) OR (periodo = 38) OR (periodo = 42) OR (periodo = 46)
      OR (periodo = 50)) THEN
      INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
      VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
     END
     ELSE
     IF ((:periodicidad = 3) AND (liquidaper = 3)) THEN
     BEGIN
      IF ((periodo = 3) OR (periodo = 7) OR (periodo = 11) OR (periodo = 15) OR (periodo = 19) OR (periodo = 23)
      OR (periodo = 27) OR (periodo = 31) OR (periodo = 35) OR (periodo = 39) OR (periodo = 43) OR (periodo = 47)
      OR (periodo = 51)) THEN
      INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
      VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
     END
     ELSE
     IF ((:periodicidad = 3) AND (liquidaper = 4)) THEN
     BEGIN
      IF ((periodo = 4) OR (periodo = 8) OR (periodo = 12) OR (periodo = 16) OR (periodo = 20) OR (periodo = 24)
      OR (periodo = 29) OR (periodo = 32) OR (periodo = 36) OR (periodo = 40) OR (periodo = 44) OR (periodo = 48)
      OR (periodo = 52)) THEN
      INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
      VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
     END
    END
  VALOR = 0;
  basico = 0;
  END
 END
 END
 END
 SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER trigger nomina_horasext_bi for nomina_horasext
active before insert position 0
AS
declare variable existe char(1);
BEGIN
select max('S') FROM NOMINA_HORASEXT N WHERE N.noex_ano = NEW.noex_ano AND N.noex_periodio = NEW.noex_periodio AND N.TERC_NIT = NEW.terc_nit into :existe;
if (existe <> 'S') then
BEGIN
IF (NEW.noex_diur <> 0 OR NEW.noex_fdiur <> 0 OR NEW.noex_noct <> 0 OR NEW.noex_fnoct <> 0 OR NEW.noex_recnoct <> 0 OR NEW.noex_recfest <> 0) THEN
EXECUTE PROCEDURE liquida_horas_extra (NEW.terc_nit,NEW.noex_diur,NEW.noex_noct,NEW.noex_fdiur,NEW.noex_fnoct,NEW.noex_recnoct, NEW.noex_recfest,NEW.noex_ano,'N',NEW.NOEX_SALBASE)RETURNING_VALUES(NEW.noex_monto,new.noex_montorec);
END
/*ELSE
 exception "YA EXISTE EL REGISTRO";*/
END
^

SET TERM ; ^



DROP EXCEPTION "YA EXISTE EL REGISTRO";
CREATE EXCEPTION YA_EXISTE_EL_REGISTRO 'Ya existe el registro para este periodo, año y empleado';

SET TERM ^ ;

CREATE OR ALTER trigger nomina_horasext_bi for nomina_horasext
active before insert position 0
AS
declare variable existe char(1);
BEGIN
select max('S') FROM NOMINA_HORASEXT N WHERE N.noex_ano = NEW.noex_ano AND N.noex_periodio = NEW.noex_periodio AND N.TERC_NIT = NEW.terc_nit into :existe;
if (existe is null) then
BEGIN
IF (NEW.noex_diur <> 0 OR NEW.noex_fdiur <> 0 OR NEW.noex_noct <> 0 OR NEW.noex_fnoct <> 0 OR NEW.noex_recnoct <> 0 OR NEW.noex_recfest <> 0) THEN
EXECUTE PROCEDURE liquida_horas_extra (NEW.terc_nit,NEW.noex_diur,NEW.noex_noct,NEW.noex_fdiur,NEW.noex_fnoct,NEW.noex_recnoct, NEW.noex_recfest,NEW.noex_ano,'N',NEW.NOEX_SALBASE)RETURNING_VALUES(NEW.noex_monto,new.noex_montorec);
END
ELSE
 exception YA_EXISTE_EL_REGISTRO;
END
^

SET TERM ; ^


ALTER TABLE PARAMETROS_ANO ADD PAAN_CONSBANC VARCHAR(1);

SET TERM ^ ;

CREATE OR ALTER PROCEDURE ARCHIVO_BANCO (
    iddoc integer,
    fecha date,
    fechapago date)
returns (
    datos varchar(591))
as
declare variable dat varchar(60);
declare variable nombreempl varchar(60);
declare variable numdocid varchar(20);
declare variable cuentaempl varchar(25);
declare variable banco integer;
declare variable tipocta char(1);
declare variable verifica numeric(18,2);
BEGIN
datos = '';
dat = '1';
datos = :datos || :dat;
EXECUTE PROCEDURE lee_configuracion('CONTABILIDAD','GENERAL','NIT COMPAÑIA')returning_values (:dat);
EXECUTE PROCEDURE ceros_ancho_fijo(:dat,10,'N')returning_values(:dat);
datos = :datos || :dat;
dat = '';
EXECUTE PROCEDURE lee_configuracion('GENERAL','GENERAL','NOMBRE COMPAÑIA')returning_values (:dat);
EXECUTE PROCEDURE ceros_ancho_fijo(:dat,16,'A')returning_values(:dat);
datos = :datos || :dat;
dat = '225';
datos = :datos || :dat;
dat = 'NOMINA';
EXECUTE PROCEDURE ceros_ancho_fijo(:dat,10,'A')returning_values(:dat);
datos = :datos || :dat;
dat = substr(:fecha,3,4)|| substr(:fecha,6,7) || substr(:fecha,9,10);
datos = :datos || :dat;
SELECT P.paan_consbanc FROM PARAMETROS_ANO P WHERE P.paan_ano = substr(:fecha,1,4) INTO :dat;
if (dat IS NULl) then
dat = ' ';
datos = :datos || :dat;
dat = substr(:fechapago,3,4)|| substr(:fechapago,6,7) || substr(:fechapago,9,10);
datos = :datos || :dat;
SELECT COUNT(NOMI_ID) FROM NOMINA_DETALLE WHERE NOMI_ID = :iddoc INTO :dat;
EXECUTE PROCEDURE ceros_ancho_fijo(:dat,6,'N')returning_values(:dat);
datos = :datos || :dat;
dat = '000000000000';
datos = :datos || :dat;
SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC, EMPLEADOS E WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :iddoc AND E.empl_formpago = 'B' AND NC.terc_nit = E.terc_nit INTO :dat;
dat = substr(:dat,1,strlen(:dat)-3);
EXECUTE PROCEDURE ceros_ancho_fijo(:dat,12,'N')returning_values(:dat);
datos = :datos || :dat;
EXECUTE PROCEDURE lee_configuracion('NOMINA', 'GENERAL', 'NUMERO DE CUENTA DEL BANCO')returning_values (:dat);
EXECUTE PROCEDURE ceros_ancho_fijo(:dat,11,'N')returning_values(:dat);
datos = :datos || :dat;
EXECUTE PROCEDURE lee_configuracion('NOMINA', 'GENERAL', 'TIPO CUENTA')returning_values (:dat);
EXECUTE PROCEDURE ceros_ancho_fijo(:dat,1,'A')returning_values(:dat);
datos = :datos || :dat;
  SUSPEND;
datos = '';
FOR SELECT D.terc_nit, T.terc_nom, E.empl_cuenta, E.empl_banco, e.empl_tipocta FROM empleados E, NOMINA_DETALLE D, TERCEROS T WHERE D.terc_nit = E.terc_nit AND T.terc_nit = E.terc_nit AND D.nomi_id = :iddoc AND E.empl_formpago = 'B'
INTO :numdocid, :nombreempl, :cuentaempl, :banco, :tipocta
DO
BEGIN
SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NC.terc_nit = :numdocid AND NOMI_ID = :iddoc INTO :verifica;
if (verifica > 0) then
BEGIN
dat = '6';
datos = :datos || :dat;
dat = :numdocid;
EXECUTE PROCEDURE ceros_ancho_fijo(:dat,15,'N')returning_values(:dat);
datos = :datos || :dat;
dat = :nombreempl;
EXECUTE PROCEDURE ceros_ancho_fijo(:dat,18,'A')returning_values(:dat);
datos = :datos || :dat;
SELECT B.banc_codach FROM BANCOS B WHERE B.banc_cod = :banco INTO :dat;
EXECUTE PROCEDURE ceros_ancho_fijo(:dat,9,'N')returning_values(:dat);
datos = :datos || :dat;
dat = :cuentaempl;
EXECUTE PROCEDURE ceros_ancho_fijo(:dat,17,'N')returning_values(:dat);
datos = :datos || :dat;
dat = 'S';
datos = :datos || :dat;
if (:tipocta = 'C') then
dat=  '27';
ELSE
if (:tipocta = 'A') then
dat=  '37';
datos = :datos || :dat;
SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NC.terc_nit = :numdocid AND NOMI_ID = :iddoc INTO :dat;
dat = substr(:dat,1,strlen(:dat)-3);
EXECUTE PROCEDURE ceros_ancho_fijo(:dat,10,'N')returning_values(:dat);
datos = :datos || :dat;
dat = 'NOMINA';
EXECUTE PROCEDURE ceros_ancho_fijo(:dat,9,'A')returning_values(:dat);
datos = :datos || :dat;
if (substr(:fecha,6,7) = '01') then
dat= 'ENERO';
ELSE
if (substr(:fecha,6,7) = '02') then
dat= 'FEBRERO';
ELSE
if (substr(:fecha,6,7) = '03') then
dat= 'MARZO';
ELSE
if (substr(:fecha,6,7) = '04') then
dat= 'ABRIL';
ELSE
if (substr(:fecha,6,7) = '05') then
dat= 'MAYO';
ELSE
if (substr(:fecha,6,7) = '06') then
dat= 'JUNIO';
ELSE
if (substr(:fecha,6,7) = '07') then
dat= 'JULIO';
ELSE
if (substr(:fecha,6,7) = '08') then
dat= 'AGOSTO';
ELSE
if (substr(:fecha,6,7) = '09') then
dat= 'SEPTIEMBRE';
ELSE
if (substr(:fecha,6,7) = '10') then
dat= 'OCTUBRE';
if (substr(:fecha,6,7) = '11') then
dat= 'NOVIEMBRE';
ELSE
if (substr(:fecha,6,7) = '12') then
dat= 'DICIEMBRE';
EXECUTE PROCEDURE ceros_ancho_fijo(:dat,12,'A')returning_values(:dat);
datos = :datos || :dat;
dat= ' ';
datos = :datos || :dat;
SUSPEND;
datos = '';
END
END
END
^

SET TERM ; ^

ALTER TABLE NOMINA_CONCEPTOS
ADD NOCO_VALORCONT NUMERIC(18,2);

ALTER TABLE NOMINA_CONCEPTOS
ADD NOCO_nitCONT varchar(20);

SET TERM ^ ;

CREATE OR ALTER trigger nomina_conceptos_bi for nomina_conceptos
active before insert position 0
AS
DECLARE VARIABLE ITEM INTEGER;
DECLARE VARIABLE NOMIID INTEGER;
DECLARE VARIABLE NOMIIDmaestro INTEGER;
BEGIN
  /* Trigger text */
IF (NEW.nomi_id <> 0) THEN
BEGIN
  SELECT MAX (NOMI_ID) FROM nomina INTO :NOMIIDMAESTRO;
  SELECT MAX (NOCO_ITEM) FROM nomina_conceptos WHERE NOMI_ID = :NOMIIDMAESTRO
  INTO :item;
  IF (item IS NULL) THEN
  BEGIN
  item = 1;
  NEW.nomi_id = :NOMIIDMAESTRO;
  NEW.noco_item = :ITEM;
  END
  ELSE
  BEGIN
  ITEM = ITEM + 1;
  NEW.nomi_id = :NOMIIDMAESTRO;
  NEW.noco_item = :ITEM;
  END
END
  if (new.noco_valor < 0) then
   new.noco_valorcont = new.noco_valor * (-1);
  else
   new.noco_valorcont = new.noco_valor;
  if (new.noco_valor is null) then
   new.noco_valorcont = 0;
  IF (NEW.noco_deduc = 'S') THEN
  NEW.noco_valor = NEW.noco_valor * (-1);
  IF (NEW.noco_pagook IS NULL) THEN
  NEW.noco_pagook = 'N';
 if (new.noco_entidad is not null) then
  new.noco_nitcont = new.noco_entidad;
 else
  new.noco_nitcont = new.terc_nit;
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER PROCEDURE CONTABIL_NOMINA (
    iddoc integer)
returns (
    error integer,
    idc integer)
as
declare variable itemdet integer;
declare variable idcontabil integer;
declare variable aporte char(1);
declare variable entidad varchar(20);
declare variable valor numeric(18,2);
declare variable ctagast varchar(20);
declare variable ctaxp varchar(20);
declare variable tercnit varchar(20);
declare variable fecaux date;
declare variable fecha char(8);
declare variable ano char(4);
declare variable periodicidad integer;
declare variable periodo integer;
declare variable numero varchar(6);
declare variable tipocom char(3);
declare variable prefcom varchar(4);
declare variable concepto varchar(60);
declare variable numerocom varchar(6);
declare variable proyecto varchar(4) character set none;
declare variable centro varchar(4) character set none;
declare variable codconc integer;
declare variable base numeric(18,2);
declare variable basico numeric(18,2);
declare variable comision numeric(18,2);
declare variable retroact numeric(18,2);
declare variable valorneg numeric(18,2);
declare variable det char(1);
BEGIN
    SELECT N.nomi_feccausa, N.nomi_ano, N.nomi_periodocidad, N.nomi_periodo FROM NOMINA N WHERE N.nomi_id = :iddoc INTO :fecaux, :ano, :periodicidad, :periodo;
    NUMERO = :periodicidad || :periodo;
    SELECT I.tico_cod, I.prco_pre, I.inno_det FROM INTERFAZ_NOMINA I WHERE I.tido_cod = 92 INTO :tipocom, :prefcom,:det;
    concepto = 'CAUSACION NOMINA AÑO ' || :ano || ' PERIODO ' || :periodo || ' PERIODICIDAD ' ||:periodicidad;
    EXECUTE PROCEDURE completa_ceros(:numero)RETURNING_VALUES :numero;
    SELECT P.pref_numero FROM PREFIJOS_CONTA P WHERE P.tico_cod = :tipocom AND P.prco_pref = :prefcom INTO :numerocom;
    idcontabil = GEN_ID(ID_CONTABILIZA,1);
    EXECUTE PROCEDURE FECHA_A_CONTA(:FECAUX) RETURNING_VALUES (:FECHA);
    INSERT INTO CONTABILIZACION (CNTB_ID, CNTB_TIPOREF, CNTB_IDREF, CNTB_PREFREF, CNTB_NUMREF, CNTB_FECHA, CNTB_TIPOCOMP, CNTB_PREFCNT, CNTB_CONCEPTO, CNTB_NUMERO, CNTB_PROCESADO)
                         VALUES (:idcontabil, 92,:iddoc, :ano, :numero, :fecha, :tipocom, :prefcom, :concepto, :numerocom, 'N');
    idc = :idcontabil;
    itemdet = 0;
  IF (DET = 'N') THEN
  BEGIN
    FOR SELECT max(NC.conc_cod),sum(NC.NOCO_VALORCONT), max(CN.conc_ctagast), max(NC.terc_nit), max(NC.noco_aporte), max(NC.noco_entidad)
    FROM NOMINA_CONCEPTOS NC, CONCEPTOS_NOMINA CN WHERE NC.conc_cod = CN.conc_cod AND NC.nomi_id = :iddoc and cn.conc_ctagast is not null and cn.conc_ctacxp is not null
    group by cn.conc_ctagast,nc.terc_nit
    INTO :codconc,:valor, :ctagast, :tercnit, :aporte, :entidad
    DO
    BEGIN
        base = null;
        IF (ctagast IS NULL) THEN
        BEGIN
            EXECUTE PROCEDURE ERROR (14, :IDDOC, :ctagast, 2);
            ERROR = ERROR + 1;
        END
        IF (ctaxp IS NULL) THEN
        BEGIN
            EXECUTE PROCEDURE ERROR (14, :IDDOC, :ctaxp, 2);
            ERROR = ERROR + 1;
        END
        IF (VALOR IS NULL) THEN
            VALOR = 0;
        IF (VALOR <> 0) THEN
        BEGIN
            IF (valor < 0) THEN
                valor = :valor * (-1);
            IF (codconc = 6) THEN
            BEGIN
                SELECT E.empl_salario FROM EMPLEADOS E WHERE E.terc_nit = :tercnit INTO :basico;
                SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :tercnit INTO :comision;
                IF (comision IS NULL) THEN
                    comision = 0;
                SELECT C.emco_monto FROM EMPLEADO_CONCEPTOS C WHERE C.terc_nit = :tercnit AND C.conc_cod = 933 INTO :retroact;
                IF (retroact IS NULL ) THEN
                    retroact = 0;
                base = :basico + :comision + :retroact;

            END
            IF (aporte = 'N') THEN
            BEGIN
                SELECT D.dpto_proy, D.dpto_centro FROM EMPLEADOS E, departamento D WHERE E.terc_nit = :tercnit AND E.empl_dpto = D.dpto_cod INTO :proyecto, :centro;
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_TERC, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_CONC, CNDE_PROY, cnde_centro,CNDE_BASE)
                             VALUES (:idcontabil, :itemdet, :ctagast, :tercnit, :valor, 0, :concepto, :proyecto, :centro,:base);
                itemdet = itemdet + 1;
                /*SELECT D.dpto_proy, D.dpto_centro FROM EMPLEADOS E, departamento D WHERE E.terc_nit = :tercnit AND E.empl_dpto = D.dpto_cod INTO :proyecto, :centro;
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_TERC, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_CONC, CNDE_PROY, cnde_centro,CNDE_BASE)
                             VALUES (:idcontabil, :itemdet, :ctaxp, :tercnit, 0,:valor, :concepto, :proyecto, :centro,:base);
                itemdet = itemdet + 1;
            */
            END
            ELSE
            IF (aporte = 'S') THEN
            BEGIN
                SELECT D.dpto_proy, D.dpto_centro FROM EMPLEADOS E, departamento D WHERE E.terc_nit = :tercnit AND E.empl_dpto = D.dpto_cod INTO :proyecto, :centro;
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_TERC, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_CONC, CNDE_PROY, cnde_centro,CNDE_BASE)
                             VALUES (:idcontabil, :itemdet, :ctagast, :entidad, :valor, 0, :concepto, :proyecto, :centro,:base);
                itemdet = itemdet + 1;
                /*SELECT D.dpto_proy, D.dpto_centro FROM EMPLEADOS E, departamento D WHERE E.terc_nit = :tercnit AND E.empl_dpto = D.dpto_cod INTO :proyecto, :centro;
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_TERC, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_CONC, CNDE_PROY, cnde_centro,CNDE_BASE)
                             VALUES (:idcontabil, :itemdet, :ctaxp, :entidad, 0,:valor, :concepto, :proyecto, :centro,:base);
                itemdet = itemdet + 1;
            */
            END
        END
    END
    SUSPEND;
    FOR SELECT max(NC.conc_cod),sum(NC.NOCO_VALORCONT), max(CN.conc_ctacxp), max(NC.terc_nit), max(NC.noco_aporte), max(NC.noco_entidad)
    FROM NOMINA_CONCEPTOS NC, CONCEPTOS_NOMINA CN WHERE NC.conc_cod = CN.conc_cod AND NC.nomi_id = :iddoc and cn.conc_ctagast is not null and cn.conc_ctacxp is not null
    group by cn.conc_ctacxp,nc.noco_nitcont
    INTO :codconc,:valor, :ctaxp, :tercnit, :aporte, :entidad
    DO
    BEGIN
        base = null;
        IF (ctagast IS NULL) THEN
        BEGIN
            EXECUTE PROCEDURE ERROR (14, :IDDOC, :ctagast, 2);
            ERROR = ERROR + 1;
        END
        IF (ctaxp IS NULL) THEN
        BEGIN
            EXECUTE PROCEDURE ERROR (14, :IDDOC, :ctaxp, 2);
            ERROR = ERROR + 1;
        END
        IF (VALOR IS NULL) THEN
            VALOR = 0;
        IF (VALOR <> 0) THEN
        BEGIN
            IF (valor < 0) THEN
                valor = :valor * (-1);
            IF (codconc = 6) THEN
            BEGIN
                SELECT E.empl_salario FROM EMPLEADOS E WHERE E.terc_nit = :tercnit INTO :basico;
                SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :tercnit INTO :comision;
                IF (comision IS NULL) THEN
                    comision = 0;
                SELECT C.emco_monto FROM EMPLEADO_CONCEPTOS C WHERE C.terc_nit = :tercnit AND C.conc_cod = 933 INTO :retroact;
                IF (retroact IS NULL ) THEN
                    retroact = 0;
                base = :basico + :comision + :retroact;
            END
            IF (aporte = 'N') THEN
            BEGIN
                /*SELECT D.dpto_proy, D.dpto_centro FROM EMPLEADOS E, departamento D WHERE E.terc_nit = :tercnit AND E.empl_dpto = D.dpto_cod INTO :proyecto, :centro;
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_TERC, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_CONC, CNDE_PROY, cnde_centro,CNDE_BASE)
                             VALUES (:idcontabil, :itemdet, :ctagast, :tercnit, :valor, 0, :concepto, :proyecto, :centro,:base);
                itemdet = itemdet + 1;
                */SELECT D.dpto_proy, D.dpto_centro FROM EMPLEADOS E, departamento D WHERE E.terc_nit = :tercnit AND E.empl_dpto = D.dpto_cod INTO :proyecto, :centro;
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_TERC, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_CONC, CNDE_PROY, cnde_centro,CNDE_BASE)
                             VALUES (:idcontabil, :itemdet, :ctaxp, :tercnit, 0,:valor, :concepto, :proyecto, :centro,:base);
                itemdet = itemdet + 1;
            END
            ELSE
            IF (aporte = 'S') THEN
            BEGIN
                /*SELECT D.dpto_proy, D.dpto_centro FROM EMPLEADOS E, departamento D WHERE E.terc_nit = :tercnit AND E.empl_dpto = D.dpto_cod INTO :proyecto, :centro;
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_TERC, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_CONC, CNDE_PROY, cnde_centro,CNDE_BASE)
                             VALUES (:idcontabil, :itemdet, :ctagast, :tercnit, :valor, 0, :concepto, :proyecto, :centro,:base);
                itemdet = itemdet + 1;
                */SELECT D.dpto_proy, D.dpto_centro FROM EMPLEADOS E, departamento D WHERE E.terc_nit = :tercnit AND E.empl_dpto = D.dpto_cod INTO :proyecto, :centro;
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_TERC, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_CONC, CNDE_PROY, cnde_centro,CNDE_BASE)
                             VALUES (:idcontabil, :itemdet, :ctaxp, :tercnit, 0,:valor, :concepto, :proyecto, :centro,:base);
                itemdet = itemdet + 1;
            END
        END
    END
    SUSPEND;
  END
  ELSE
  IF (DET = 'S') THEN
  BEGIN
    FOR SELECT NC.conc_cod,NC.NOCO_VALORCONT, CN.conc_ctagast, CN.conc_ctacxp, NC.terc_nit, NC.noco_aporte, NC.noco_entidad
    FROM NOMINA_CONCEPTOS NC, CONCEPTOS_NOMINA CN WHERE NC.conc_cod = CN.conc_cod AND NC.nomi_id = :iddoc
    INTO :codconc,:valor, :ctagast, :ctaxp, :tercnit, :aporte, :entidad
    DO
    BEGIN
        base = null;
        IF (ctagast IS NULL) THEN
        BEGIN
            EXECUTE PROCEDURE ERROR (14, :IDDOC, :ctagast, 2);
            ERROR = ERROR + 1;
        END
        IF (ctaxp IS NULL) THEN
        BEGIN
            EXECUTE PROCEDURE ERROR (14, :IDDOC, :ctaxp, 2);
            ERROR = ERROR + 1;
        END
        IF (VALOR IS NULL) THEN
            VALOR = 0;
        IF (VALOR <> 0) THEN
        BEGIN
            IF (valor < 0) THEN
                valor = :valor * (-1);
            IF (codconc = 6) THEN
            BEGIN
                SELECT E.empl_salario FROM EMPLEADOS E WHERE E.terc_nit = :tercnit INTO :basico;
                SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :tercnit INTO :comision;
                IF (comision IS NULL) THEN
                    comision = 0;
                SELECT C.emco_monto FROM EMPLEADO_CONCEPTOS C WHERE C.terc_nit = :tercnit AND C.conc_cod = 933 INTO :retroact;
                IF (retroact IS NULL ) THEN
                    retroact = 0;
                base = :basico + :comision + :retroact;
            END
            IF (aporte = 'N') THEN
            BEGIN
                SELECT D.dpto_proy, D.dpto_centro FROM EMPLEADOS E, departamento D WHERE E.terc_nit = :tercnit AND E.empl_dpto = D.dpto_cod INTO :proyecto, :centro;
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_TERC, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_CONC, CNDE_PROY, cnde_centro,CNDE_BASE)
                         VALUES (:idcontabil, :itemdet, :ctagast, :tercnit, :valor, 0, :concepto, :proyecto, :centro,:base);
                itemdet = itemdet + 1;
                SELECT D.dpto_proy, D.dpto_centro FROM EMPLEADOS E, departamento D WHERE E.terc_nit = :tercnit AND E.empl_dpto = D.dpto_cod INTO :proyecto, :centro;
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_TERC, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_CONC, CNDE_PROY, cnde_centro,CNDE_BASE)
                             VALUES (:idcontabil, :itemdet, :ctaxp, :tercnit, 0,:valor, :concepto, :proyecto, :centro,:base);
                itemdet = itemdet + 1;
            END
            ELSE
            IF (aporte = 'S') THEN
            BEGIN
                SELECT D.dpto_proy, D.dpto_centro FROM EMPLEADOS E, departamento D WHERE E.terc_nit = :tercnit AND E.empl_dpto = D.dpto_cod INTO :proyecto, :centro;
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_TERC, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_CONC, CNDE_PROY, cnde_centro,CNDE_BASE)
                         VALUES (:idcontabil, :itemdet, :ctagast, :tercnit, :valor, 0, :concepto, :proyecto, :centro,:base);
                itemdet = itemdet + 1;
                SELECT D.dpto_proy, D.dpto_centro FROM EMPLEADOS E, departamento D WHERE E.terc_nit = :tercnit AND E.empl_dpto = D.dpto_cod INTO :proyecto, :centro;
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_TERC, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_CONC, CNDE_PROY, cnde_centro,CNDE_BASE)
                         VALUES (:idcontabil, :itemdet, :ctaxp, :entidad, 0,:valor, :concepto, :proyecto, :centro,:base);
                itemdet = itemdet + 1;
            END
        END
    END
    SUSPEND;
  END
END
^

SET TERM ; ^

UPDATE NOMINA_CONCEPTOS NC1 SET NC1.noco_valorcont = (SELECT NC2.noco_valor FROM NOMINA_CONCEPTOS NC2 WHERE NC1.terc_nit = NC2.terc_nit AND NC1.conc_cod = NC2.conc_cod AND NC1.nomi_id = NC2.nomi_id);
UPDATE NOMINA_CONCEPTOS NC1 SET NC1.noco_valorcont = (SELECT (NC2.noco_valor)*-1 FROM NOMINA_CONCEPTOS NC2 WHERE NC1.terc_nit = NC2.terc_nit AND NC1.conc_cod = NC2.conc_cod AND NC1.nomi_id = NC2.nomi_id and nc2.noco_valor < 0) where nc1.noco_valor < 0;

UPDATE NOMINA_CONCEPTOS NC1 SET NC1.noco_nitcont = (SELECT NC2.terc_nit FROM NOMINA_CONCEPTOS NC2 WHERE NC1.terc_nit = NC2.terc_nit AND NC1.conc_cod = NC2.conc_cod AND NC1.nomi_id = NC2.nomi_id);
UPDATE NOMINA_CONCEPTOS NC1 SET NC1.noco_nitcont = (SELECT NC2.noco_entidad FROM NOMINA_CONCEPTOS NC2 WHERE NC1.terc_nit = NC2.terc_nit AND NC1.conc_cod = NC2.conc_cod AND NC1.nomi_id = NC2.nomi_id AND NC2.noco_entidad IS NOT NULL) WHERE NC1.noco_entidad IS NOT NULL;
ALTER TABLE NOMINA_CONCEPTOS ADD NOCO_BASE NUMERIC(18,2);
SET TERM ^ ;

CREATE OR ALTER PROCEDURE DIAS_LABORADOS (
    nitempl varchar(20),
    periodo integer,
    fec date,
    mensual char(1),
    aporte char(1))
returns (
    totaldiaslab integer)
as
declare variable diasnolab integer;
declare variable diaslabxper integer;
declare variable perpago integer;
declare variable fecing date;
declare variable diasfec integer;
declare variable diasing integer;
declare variable existe char(1);
BEGIN
SELECT E.empl_ppago, E.empl_fecing
FROM EMPLEADOS E WHERE TERC_NIT = :nitempl
INTO :perpago, :fecing;
IF (mensual = 'N') THEN
BEGIN
IF (perpago = 1) THEN
diaslabxper = 30;
ELSE
IF (perpago = 2) THEN
diaslabxper = 15;
ELSE
IF (perpago = 3) THEN
diaslabxper = 7;
END
ELSE
diaslabxper = 30;
if (perpago = 2) then
BEGIN
IF (SUBSTR(fecing,1,7) = SUBSTR(FEC,1,7)) THEN
BEGIN
diasfec = CAST(substr(fec,9,10) AS INTEGER);
diasing = CAST(substr(fecing,9,10) AS INTEGER);
diaslabxper = (diasfec - diasing)+1;
IF ((diaslabxper > 15) AND (perpago = 2)) THEN
diaslabxper = 15;
END
END
ELSE
if (perpago = 1) then
BEGIN
IF (SUBSTR(fecing,1,7) = SUBSTR(FEC,1,7)) THEN
BEGIN
diasfec = CAST(substr(fec,9,10) AS INTEGER);
diasing = CAST(substr(fecing,9,10) AS INTEGER);
diaslabxper = (diasfec - diasing)+1;
IF ((diaslabxper > 30) AND (perpago = 1)) THEN
diaslabxper = 30;
END
END
IF (mensual = 'S') THEN
BEGIN
SELECT MAX('S') FROM nomina_novedades WHERE TERC_NIT = :nitempl AND (TNOV_COD = 9 or (tnov_cod = 2) or (tnov_cod = 3) or (tnov_cod = 6)) AND ((NONO_PERIODO = :periodo) or (NONO_PERIODO = :periodo - 1)) AND NONO_ANO  = substr(:FEC,1,4)
INTO :existe;
IF ((aporte = 'N' ) OR (:existe = 'S'))  THEN
BEGIN
SELECT SUM (NONO_DURA)
FROM nomina_novedades WHERE TERC_NIT = :nitempl AND (TNOV_COD = 9 OR (TNOV_COD = 6) OR (TNOV_COD = 2) OR (TNOV_COD =3) OR (TNOV_COD = 4)  ) AND ((NONO_PERIODO = :periodo) or (NONO_PERIODO = :periodo - 1)) AND NONO_ANO  = substr(:FEC,1,4)
INTO :diasnolab;
if (diasnolab IS NULL) then
diasnolab = 0;
diaslabxper =  :diaslabxper - :diasnolab;
END
if (diaslabxper IS NOT NULL) then
totaldiaslab =  :diaslabxper;
ELSE
totaldiaslab = 0;
SUSPEND;
END
ELSE
BEGIN
SELECT MAX('S') FROM nomina_novedades WHERE TERC_NIT = :nitempl AND (TNOV_COD = 9 or (tnov_cod = 2) or (tnov_cod = 3) or (tnov_cod = 6)) AND NONO_PERIODO = :periodo AND NONO_ANO  = substr(:FEC,1,4)
INTO :existe;
IF ((aporte = 'N' ) OR (:existe = 'S'))  THEN
BEGIN
SELECT SUM (NONO_DURA)
FROM nomina_novedades WHERE TERC_NIT = :nitempl AND (TNOV_COD = 9 OR (TNOV_COD = 6) OR (TNOV_COD = 2) OR (TNOV_COD =3) OR (TNOV_COD = 4)  ) AND NONO_PERIODO = :periodo AND NONO_ANO  = substr(:FEC,1,4)
INTO :diasnolab;
if (diasnolab IS NULL) then
diasnolab = 0;
diaslabxper =  :diaslabxper - :diasnolab;
END
if (diaslabxper IS NOT NULL) then
totaldiaslab =  :diaslabxper;
ELSE
totaldiaslab = 0;
SUSPEND;
END
END
^

SET TERM ; ^

ALTER TABLE INTERFAZ_NOMINA
ADD INNO_DTLLEADMIN CHAR(1);

ALTER TABLE ADMINISTRADORA
ADD ADMI_CTACONTA T_CTA_CONTABLE;

SET TERM ^ ;

ALTER PROCEDURE CONTABIL_NOMINA (
    iddoc integer)
returns (
    error integer,
    idc integer)
as
declare variable itemdet integer;
declare variable idcontabil integer;
declare variable aporte char(1);
declare variable entidad varchar(20);
declare variable valor numeric(18,2);
declare variable ctagast varchar(20);
declare variable ctaxp varchar(20);
declare variable tercnit varchar(20);
declare variable fecaux date;
declare variable fecha char(8);
declare variable ano char(4);
declare variable periodicidad integer;
declare variable periodo integer;
declare variable numero varchar(6);
declare variable tipocom char(3);
declare variable prefcom varchar(4);
declare variable concepto varchar(60);
declare variable numerocom varchar(6);
declare variable proyecto varchar(4) character set none;
declare variable centro varchar(4) character set none;
declare variable codconc integer;
declare variable base numeric(18,2);
declare variable basico numeric(18,2);
declare variable comision numeric(18,2);
declare variable retroact numeric(18,2);
declare variable valorneg numeric(18,2);
declare variable det char(1);
declare variable CTAADMIN CHAR(1);
BEGIN
    SELECT N.nomi_feccausa, N.nomi_ano, N.nomi_periodocidad, N.nomi_periodo FROM NOMINA N WHERE N.nomi_id = :iddoc INTO :fecaux, :ano, :periodicidad, :periodo;
    NUMERO = :periodicidad || :periodo;
    SELECT I.tico_cod, I.prco_pre, I.inno_det, I.inno_dtlleadmin FROM INTERFAZ_NOMINA I WHERE I.tido_cod = 92 INTO :tipocom, :prefcom,:det,:ctaadmin;
    concepto = 'CAUSACION NOMINA AÑO ' || :ano || ' PERIODO ' || :periodo || ' PERIODICIDAD ' ||:periodicidad;
    EXECUTE PROCEDURE completa_ceros(:numero)RETURNING_VALUES :numero;
    SELECT P.pref_numero FROM PREFIJOS_CONTA P WHERE P.tico_cod = :tipocom AND P.prco_pref = :prefcom INTO :numerocom;
    idcontabil = GEN_ID(ID_CONTABILIZA,1);
    EXECUTE PROCEDURE FECHA_A_CONTA(:FECAUX) RETURNING_VALUES (:FECHA);
    INSERT INTO CONTABILIZACION (CNTB_ID, CNTB_TIPOREF, CNTB_IDREF, CNTB_PREFREF, CNTB_NUMREF, CNTB_FECHA, CNTB_TIPOCOMP, CNTB_PREFCNT, CNTB_CONCEPTO, CNTB_NUMERO, CNTB_PROCESADO)
                         VALUES (:idcontabil, 92,:iddoc, :ano, :numero, :fecha, :tipocom, :prefcom, :concepto, :numerocom, 'N');
    idc = :idcontabil;
    itemdet = 0;
  IF (DET = 'N') THEN
  BEGIN
    FOR SELECT max(NC.conc_cod),sum(NC.NOCO_VALORCONT), max(CN.conc_ctagast), max(NC.terc_nit), max(NC.noco_aporte), max(NC.noco_entidad)
    FROM NOMINA_CONCEPTOS NC, CONCEPTOS_NOMINA CN WHERE NC.conc_cod = CN.conc_cod AND NC.nomi_id = :iddoc and cn.conc_ctagast is not null and cn.conc_ctacxp is not null
    group by cn.conc_ctagast,nc.terc_nit
    INTO :codconc,:valor, :ctagast, :tercnit, :aporte, :entidad
    DO
    BEGIN
        base = null;
        IF (ctagast IS NULL) THEN
        BEGIN
            EXECUTE PROCEDURE ERROR (14, :IDDOC, :ctagast, 2);
            ERROR = ERROR + 1;
        END
        IF (ctaxp IS NULL) THEN
        BEGIN
            EXECUTE PROCEDURE ERROR (14, :IDDOC, :ctaxp, 2);
            ERROR = ERROR + 1;
        END
        IF (VALOR IS NULL) THEN
            VALOR = 0;
        IF (VALOR <> 0) THEN
        BEGIN
            IF (valor < 0) THEN
                valor = :valor * (-1);
            IF (codconc = 6) THEN
            BEGIN
                SELECT E.empl_salario FROM EMPLEADOS E WHERE E.terc_nit = :tercnit INTO :basico;
                SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :tercnit INTO :comision;
                IF (comision IS NULL) THEN
                    comision = 0;
                SELECT C.emco_monto FROM EMPLEADO_CONCEPTOS C WHERE C.terc_nit = :tercnit AND C.conc_cod = 933 INTO :retroact;
                IF (retroact IS NULL ) THEN
                    retroact = 0;
                base = :basico + :comision + :retroact;

            END
            IF (aporte = 'N') THEN
            BEGIN
                SELECT D.dpto_proy, D.dpto_centro FROM EMPLEADOS E, departamento D WHERE E.terc_nit = :tercnit AND E.empl_dpto = D.dpto_cod INTO :proyecto, :centro;
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_TERC, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_CONC, CNDE_PROY, cnde_centro,CNDE_BASE)
                             VALUES (:idcontabil, :itemdet, :ctagast, :tercnit, :valor, 0, :concepto, :proyecto, :centro,:base);
                itemdet = itemdet + 1;
                /*SELECT D.dpto_proy, D.dpto_centro FROM EMPLEADOS E, departamento D WHERE E.terc_nit = :tercnit AND E.empl_dpto = D.dpto_cod INTO :proyecto, :centro;
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_TERC, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_CONC, CNDE_PROY, cnde_centro,CNDE_BASE)
                             VALUES (:idcontabil, :itemdet, :ctaxp, :tercnit, 0,:valor, :concepto, :proyecto, :centro,:base);
                itemdet = itemdet + 1;
            */
            END
            ELSE
            IF (aporte = 'S') THEN
            BEGIN
                SELECT D.dpto_proy, D.dpto_centro FROM EMPLEADOS E, departamento D WHERE E.terc_nit = :tercnit AND E.empl_dpto = D.dpto_cod INTO :proyecto, :centro;
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_TERC, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_CONC, CNDE_PROY, cnde_centro,CNDE_BASE)
                             VALUES (:idcontabil, :itemdet, :ctagast, :entidad, :valor, 0, :concepto, :proyecto, :centro,:base);
                itemdet = itemdet + 1;
                /*SELECT D.dpto_proy, D.dpto_centro FROM EMPLEADOS E, departamento D WHERE E.terc_nit = :tercnit AND E.empl_dpto = D.dpto_cod INTO :proyecto, :centro;
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_TERC, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_CONC, CNDE_PROY, cnde_centro,CNDE_BASE)
                             VALUES (:idcontabil, :itemdet, :ctaxp, :entidad, 0,:valor, :concepto, :proyecto, :centro,:base);
                itemdet = itemdet + 1;
            */
            END
        END
    END
    SUSPEND;
    FOR SELECT max(NC.conc_cod),sum(NC.NOCO_VALORCONT), max(CN.conc_ctacxp), max(NC.terc_nit), max(NC.noco_aporte), max(NC.noco_entidad)
    FROM NOMINA_CONCEPTOS NC, CONCEPTOS_NOMINA CN WHERE NC.conc_cod = CN.conc_cod AND NC.nomi_id = :iddoc and cn.conc_ctagast is not null and cn.conc_ctacxp is not null
    group by cn.conc_ctacxp,nc.noco_nitcont
    INTO :codconc,:valor, :ctaxp, :tercnit, :aporte, :entidad
    DO
    BEGIN
        base = null;
        IF (ctagast IS NULL) THEN
        BEGIN
            EXECUTE PROCEDURE ERROR (14, :IDDOC, :ctagast, 2);
            ERROR = ERROR + 1;
        END
        IF (ctaxp IS NULL) THEN
        BEGIN
            EXECUTE PROCEDURE ERROR (14, :IDDOC, :ctaxp, 2);
            ERROR = ERROR + 1;
        END
        IF (VALOR IS NULL) THEN
            VALOR = 0;
        IF (VALOR <> 0) THEN
        BEGIN
            IF (valor < 0) THEN
                valor = :valor * (-1);
            IF (codconc = 6) THEN
            BEGIN
                SELECT E.empl_salario FROM EMPLEADOS E WHERE E.terc_nit = :tercnit INTO :basico;
                SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :tercnit INTO :comision;
                IF (comision IS NULL) THEN
                    comision = 0;
                SELECT C.emco_monto FROM EMPLEADO_CONCEPTOS C WHERE C.terc_nit = :tercnit AND C.conc_cod = 933 INTO :retroact;
                IF (retroact IS NULL ) THEN
                    retroact = 0;
                base = :basico + :comision + :retroact;
            END
            if ((codconc > 900) and (entidad is not null) AND (ctaadmin = 'S')) then
            begin
             SELECT A.admi_ctaconta FROM ADMINISTRADORA A WHERE A.terc_nit = :entidad INTO :ctaxp;
            end
            IF (aporte = 'N') THEN
            BEGIN
                /*SELECT D.dpto_proy, D.dpto_centro FROM EMPLEADOS E, departamento D WHERE E.terc_nit = :tercnit AND E.empl_dpto = D.dpto_cod INTO :proyecto, :centro;
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_TERC, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_CONC, CNDE_PROY, cnde_centro,CNDE_BASE)
                             VALUES (:idcontabil, :itemdet, :ctagast, :tercnit, :valor, 0, :concepto, :proyecto, :centro,:base);
                itemdet = itemdet + 1;
                */SELECT D.dpto_proy, D.dpto_centro FROM EMPLEADOS E, departamento D WHERE E.terc_nit = :tercnit AND E.empl_dpto = D.dpto_cod INTO :proyecto, :centro;
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_TERC, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_CONC, CNDE_PROY, cnde_centro,CNDE_BASE)
                             VALUES (:idcontabil, :itemdet, :ctaxp, :tercnit, 0,:valor, :concepto, :proyecto, :centro,:base);
                itemdet = itemdet + 1;
            END
            ELSE
            IF (aporte = 'S') THEN
            BEGIN
                /*SELECT D.dpto_proy, D.dpto_centro FROM EMPLEADOS E, departamento D WHERE E.terc_nit = :tercnit AND E.empl_dpto = D.dpto_cod INTO :proyecto, :centro;
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_TERC, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_CONC, CNDE_PROY, cnde_centro,CNDE_BASE)
                             VALUES (:idcontabil, :itemdet, :ctagast, :tercnit, :valor, 0, :concepto, :proyecto, :centro,:base);
                itemdet = itemdet + 1;
                */SELECT D.dpto_proy, D.dpto_centro FROM EMPLEADOS E, departamento D WHERE E.terc_nit = :tercnit AND E.empl_dpto = D.dpto_cod INTO :proyecto, :centro;
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_TERC, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_CONC, CNDE_PROY, cnde_centro,CNDE_BASE)
                             VALUES (:idcontabil, :itemdet, :ctaxp, :tercnit, 0,:valor, :concepto, :proyecto, :centro,:base);
                itemdet = itemdet + 1;
            END
        END
    END
    SUSPEND;
  END
  ELSE
  IF (DET = 'S') THEN
  BEGIN
    FOR SELECT NC.conc_cod,NC.NOCO_VALORCONT, CN.conc_ctagast, CN.conc_ctacxp, NC.terc_nit, NC.noco_aporte, NC.noco_entidad
    FROM NOMINA_CONCEPTOS NC, CONCEPTOS_NOMINA CN WHERE NC.conc_cod = CN.conc_cod AND NC.nomi_id = :iddoc
    INTO :codconc,:valor, :ctagast, :ctaxp, :tercnit, :aporte, :entidad
    DO
    BEGIN
        base = null;
        IF (ctagast IS NULL) THEN
        BEGIN
            EXECUTE PROCEDURE ERROR (14, :IDDOC, :ctagast, 2);
            ERROR = ERROR + 1;
        END
        IF (ctaxp IS NULL) THEN
        BEGIN
            EXECUTE PROCEDURE ERROR (14, :IDDOC, :ctaxp, 2);
            ERROR = ERROR + 1;
        END
        IF (VALOR IS NULL) THEN
            VALOR = 0;
        IF (VALOR <> 0) THEN
        BEGIN
            IF (valor < 0) THEN
                valor = :valor * (-1);
            IF (codconc = 6) THEN
            BEGIN
                SELECT E.empl_salario FROM EMPLEADOS E WHERE E.terc_nit = :tercnit INTO :basico;
                SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :tercnit INTO :comision;
                IF (comision IS NULL) THEN
                    comision = 0;
                SELECT C.emco_monto FROM EMPLEADO_CONCEPTOS C WHERE C.terc_nit = :tercnit AND C.conc_cod = 933 INTO :retroact;
                IF (retroact IS NULL ) THEN
                    retroact = 0;
                base = :basico + :comision + :retroact;
            END
            if ((codconc > 900) and (entidad is not null) AND (ctaadmin = 'S')) then
            begin
             SELECT A.admi_ctaconta FROM ADMINISTRADORA A WHERE A.terc_nit = :entidad INTO :ctaxp;
            end
            IF (aporte = 'N') THEN
            BEGIN
                SELECT D.dpto_proy, D.dpto_centro FROM EMPLEADOS E, departamento D WHERE E.terc_nit = :tercnit AND E.empl_dpto = D.dpto_cod INTO :proyecto, :centro;
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_TERC, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_CONC, CNDE_PROY, cnde_centro,CNDE_BASE)
                         VALUES (:idcontabil, :itemdet, :ctagast, :tercnit, :valor, 0, :concepto, :proyecto, :centro,:base);
                itemdet = itemdet + 1;
                SELECT D.dpto_proy, D.dpto_centro FROM EMPLEADOS E, departamento D WHERE E.terc_nit = :tercnit AND E.empl_dpto = D.dpto_cod INTO :proyecto, :centro;
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_TERC, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_CONC, CNDE_PROY, cnde_centro,CNDE_BASE)
                             VALUES (:idcontabil, :itemdet, :ctaxp, :tercnit, 0,:valor, :concepto, :proyecto, :centro,:base);
                itemdet = itemdet + 1;
            END
            ELSE
            IF (aporte = 'S') THEN
            BEGIN
                SELECT D.dpto_proy, D.dpto_centro FROM EMPLEADOS E, departamento D WHERE E.terc_nit = :tercnit AND E.empl_dpto = D.dpto_cod INTO :proyecto, :centro;
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_TERC, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_CONC, CNDE_PROY, cnde_centro,CNDE_BASE)
                         VALUES (:idcontabil, :itemdet, :ctagast, :tercnit, :valor, 0, :concepto, :proyecto, :centro,:base);
                itemdet = itemdet + 1;
                SELECT D.dpto_proy, D.dpto_centro FROM EMPLEADOS E, departamento D WHERE E.terc_nit = :tercnit AND E.empl_dpto = D.dpto_cod INTO :proyecto, :centro;
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_TERC, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_CONC, CNDE_PROY, cnde_centro,CNDE_BASE)
                         VALUES (:idcontabil, :itemdet, :ctaxp, :entidad, 0,:valor, :concepto, :proyecto, :centro,:base);
                itemdet = itemdet + 1;
            END
        END
    END
    SUSPEND;
  END
END
^

SET TERM ; ^

ALTER TABLE ADMINISTRADORA
ADD ADMI_CTAEPS T_CTA_CONTABLE;

ALTER TABLE ADMINISTRADORA
ADD ADMI_CTAAFP T_CTA_CONTABLE;

ALTER TABLE ADMINISTRADORA
ADD ADMI_CTAAFC T_CTA_CONTABLE;

ALTER TABLE ADMINISTRADORA
ADD ADMI_CTAARP T_CTA_CONTABLE;

ALTER TABLE ADMINISTRADORA
ADD ADMI_CTACCF T_CTA_CONTABLE;

ALTER TABLE NOMINA_CONCEPTOS ADD NOCO_BASE NUMERIC(18,2);

SET TERM ^ ;

ALTER PROCEDURE IMPR_PLANILLA_NOMINA (
    id integer,
    pago char(1),
    cta char(1),
    empl char(1),
    dpto varchar(20))
returns (
    fecha date,
    observaciones blob sub_type 0 segment size 80,
    pagoglobal char(1),
    periodo integer,
    ano char(4),
    periodicidad varchar(60),
    nitempl varchar(20),
    valor numeric(18,2),
    deduc char(1),
    nombreempl varchar(60),
    nomcortconc varchar(60),
    nombreconc varchar(60),
    codconc integer,
    prov char(1),
    totalempl numeric(18,2),
    totaldeduc numeric(18,2),
    totaldeveng numeric(18,2),
    numempl integer,
    ctaempl varchar(25),
    totalctas numeric(18,2),
    totalnomi numeric(18,2),
    totalapor numeric(18,2),
    nomper varchar(60),
    org integer,
    cargoempl varchar(60),
    deptoempl varchar(60),
    numcop integer,
    nombre_copia varchar(60),
    diaslab integer,
    salario numeric(18,2),
    beneficio char(1),
    base numeric(18,2),
    coddptoempl integer)
as
declare variable nitant varchar(20);
declare variable nitnue varchar(20);
declare variable numconc integer;
declare variable totalnomineg numeric(18,2);
declare variable totalaporneg numeric(18,2);
declare variable par integer;
declare variable impar integer;
declare variable antdeduc char(1);
declare variable nitdeduc varchar(20);
declare variable nittot varchar(20);
declare variable nitaux varchar(20);
BEGIN
 SELECT N.nuco_copia FROM NUMERO_COPIA N WHERE N.tido_cod = 92 AND N.nuco_id = :id INTO :NUMCOP;
 IF (numcop IS NULL) THEN
 BEGIN
  numcop = 0;
  INSERT INTO NUMERO_COPIA (TIDO_COD, NUCO_ID, NUCO_COPIA) VALUES (92,:id,:numcop);
 END
 ELSE
 BEGIN
  numcop = :numcop + 1;
  UPDATE numero_copia N SET N.nuco_copia = :numcop WHERE N.tido_cod = 92 AND N.nuco_id = :id;
 END
 SELECT N.noco_nombre FROM nombres_copias N WHERE N.noco_id = :numcop INTO :nombre_copia;
 numempl = 0;
 nitant = 0;
 nitnue = 0;
 IF (PAGO = 'N') THEN
 BEGIN
  FOR SELECT N.nomi_feccausa, N.nomi_obs, N.nomi_pagoglobal, N.nomi_periodo, N.nomi_ano, P.ppag_nombre, PN.pnom_nombre FROM NOMINA N, periodo_pago P, periodo_pago_nombre PN
  WHERE P.ppag_cod = N.nomi_periodocidad AND N.nomi_id = :ID AND PN.ppag_cod = N.nomi_periodocidad AND PN.ppag_periodo = N.nomi_periodo
  INTO :fecha, :observaciones, :pagoglobal, :periodo, :ano, :periodicidad, :NOMPER
  DO
  BEGIN
   FOR SELECT NC.terc_nit, NC.noco_valor, NC.noco_deduc, T.terc_nom, C.conc_nomcorto, C.conc_nombre, NC.conc_cod, NC.noco_prov, E.empl_cargo FROM NOMINA_CONCEPTOS NC, TERCEROS T, EMPLEADOS E, CONCEPTOS_NOMINA C
   WHERE NC.nomi_id = :ID AND T.terc_nit = E.terc_nit AND C.conc_cod = NC.conc_cod AND t.terc_nit = nc.terc_nit
   INTO :nitempl, :valor, :deduc, :nombreempl, :nomcortconc, :nombreconc, :codconc, :prov, :cargoempl
   DO
   BEGIN
    IF (valor IS NULL) THEN
    valor = 0;
    SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND TERC_NIT = :nitempl INTO :totalempl;
    SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND TERC_NIT = :nitempl AND NC.noco_deduc = 'S' INTO :totaldeduc;
    SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND TERC_NIT = :nitempl AND NC.noco_deduc = 'N' INTO :totaldeveng;
    SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id INTO :totalnomi;
    SELECT SUM(NC.noco_valor*-1) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_APORTE = 'S' AND NOCO_VALOR < 0 AND NOMI_ID = :id INTO :totalaporneg;
    SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_APORTE = 'S' AND NOCO_VALOR > 0 AND NOMI_ID = :id INTO :totalapor;
    totalapor = :totalapor + totalaporneg;
    SUSPEND;
   END
   nitempl = '';
   valor = NULL;
   deduc = '';
   nombreempl = NULL;
   nomcortconc = NULL;
   nombreconc = NULL;
   codconc = NULL;
   prov = NULL;
   FOR SELECT MAX(N.conc_cod) FROM NOMINA_CONCEPTOS N WHERE N.nomi_id = :id
   GROUP BY N.conc_cod
   INTO :codconc
   DO
   BEGIN
    SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC
    WHERE NC.nomi_id = :ID AND NC.conc_cod = :codconc
    GROUP BY NC.conc_cod
    INTO :valor;
    nitempl = '';
    nombreempl = '';
    deduc = 'N';
    prov = 'N';
    SELECT C.conc_nombre,C.conc_nomcorto FROM CONCEPTOS_NOMINA C WHERE C.conc_cod = :codconc INTO :nombreconc,:nomcortconc;
    SUSPEND;
   END
   IF (EMPL = 'N') THEN
   BEGIN
     deduc = 'N';
     nomcortconc = 'DIAS LAB.';
     nombreconc = 'DIAS LAB.';
     codconc = 0;
     prov = 'N';
     valor = NULL;
     nitempl = '';
     nombreempl = '';
     SUSPEND;
     deduc = 'N';
     nomcortconc = 'SDO BASE';
     nombreconc = 'SDO BASE';
     codconc = 0;
     prov = 'N';
     valor = NULL;
     nitempl = '';
     nombreempl = '';
     SUSPEND;
  END
     FOR SELECT ND.node_diaslab, E.empl_salario, ND.terc_nit, T.terc_nom FROM NOMINA_DETALLE ND, EMPLEADOS E, TERCEROS T WHERE NOMI_ID = :id AND ND.terc_nit = E.terc_nit AND T.terc_nit = ND.terc_nit
     INTO :diaslab, :salario, :nitaux, :nombreempl
     DO
     BEGIN
      nitempl = :nitaux;
      nomcortconc = 'DIAS LAB.';
      valor = :diaslab;
      SUSPEND;
      nitempl = :nitaux;
      nomcortconc = 'SDO BASE';
      valor = :salario;
      SUSPEND;
     END
  END
 END
 ELSE
 IF (PAGO = 'S') THEN
 BEGIN
  par = 2;
  impar = 1;
  SELECT N.nomi_feccausa, N.nomi_obs, N.nomi_pagoglobal, N.nomi_periodo, N.nomi_ano, P.ppag_nombre, PN.pnom_nombre FROM NOMINA N, periodo_pago P, periodo_pago_nombre PN
  WHERE P.ppag_cod = N.nomi_periodocidad AND N.nomi_id = :ID AND PN.ppag_cod = N.nomi_periodocidad AND PN.ppag_periodo = N.nomi_periodo
  INTO :fecha, :observaciones, :pagoglobal, :periodo, :ano, :periodicidad, :NOMPER;
  IF (EMPL = 'N') THEN
  BEGIN
     deduc = 'N';
     nomcortconc = 'DIAS LAB.';
     nombreconc = 'DIAS LAB.';
     codconc = 0;
     prov = 'N';
     valor = NULL;
     nitempl = '';
     nombreempl = '';
     SUSPEND;
     deduc = 'N';
     nomcortconc = 'SDO BASE';
     nombreconc = 'SDO BASE';
     codconc = 0;
     prov = 'N';
     valor = NULL;
     nitempl = '';
     nombreempl = '';
     SUSPEND;
     deduc = 'N';
     nomcortconc = 'TOTAL DEV';
     nombreconc = 'TOTAL DEV';
     codconc = 9999;
     prov = 'N';
     valor = NULL;
     nitempl = '';
     nombreempl = '';
     SUSPEND;
     deduc = 'S';
     nomcortconc = 'TOTAL DEDUC';
     nombreconc = 'TOTAL DEDUC';
     codconc = 99999;
     prov = 'N';
     valor = NULL;
     nitempl = '';
     nombreempl = '';
     SUSPEND;
     deduc = 'S';
     nomcortconc = 'TOTAL EMPL';
     nombreconc = 'TOTAL EMPL';
     codconc = 999999;
     prov = 'N';
     valor = NULL;
     nitempl = '';
     nombreempl = '';
     SUSPEND;
  END
  BEGIN
    IF (EMPL = 'N') THEN
    BEGIN
     FOR SELECT MAX(N.conc_cod) FROM NOMINA_CONCEPTOS N WHERE N.nomi_id = :id AND N.noco_prov = 'N' AND N.noco_gtoempr = 'N'
     GROUP BY N.conc_cod
     INTO :codconc
     DO
     BEGIN
      SELECT NULL, MAX(NC.noco_deduc) FROM NOMINA_CONCEPTOS NC
      WHERE NC.nomi_id = :ID AND NC.conc_cod = :codconc
      GROUP BY NC.conc_cod
      INTO :valor, :deduc;
      valor = NULL;
      nitempl = '';
      nombreempl = '';
      prov = 'N';
      SELECT C.conc_nombre,C.conc_nomcorto FROM CONCEPTOS_NOMINA C WHERE C.conc_cod = :codconc INTO :nombreconc,:nomcortconc;
      SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id INTO :totalempl;
      SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND NC.noco_deduc = 'S' INTO :totaldeduc;
      SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND NC.noco_deduc = 'N' INTO :totaldeveng;
      SUSPEND;
     END
     FOR SELECT ND.node_diaslab, E.empl_salario, ND.terc_nit, T.terc_nom FROM NOMINA_DETALLE ND, EMPLEADOS E, TERCEROS T WHERE NOMI_ID = :id AND ND.terc_nit = E.terc_nit AND T.terc_nit = ND.terc_nit
     INTO :diaslab, :salario, :nitaux, :nombreempl
     DO
     BEGIN
      nitempl = :nitaux;
      nomcortconc = 'DIAS LAB.';
      valor = :diaslab;
      SUSPEND;
      nitempl = :nitaux;
      nomcortconc = 'SDO BASE';
      valor = :salario;
      SUSPEND;
     END
    END
   FOR SELECT NC.terc_nit, NC.noco_valor, NC.noco_deduc, T.terc_nom, C.conc_nomcorto, C.conc_nombre, NC.conc_cod, NC.noco_prov, E.empl_cargo, E.empl_cuenta, D.dpto_nombre, d.dpto_cod, ND.node_diaslab,NC.terc_nit, E.empl_salario, c.conc_benefic, NC.noco_base
   FROM NOMINA_CONCEPTOS NC, TERCEROS T, EMPLEADOS E, CONCEPTOS_NOMINA C, DEPARTAMENTO D, NOMINA_DETALLE ND
   WHERE NC.nomi_id = :ID AND T.terc_nit = E.terc_nit AND C.conc_cod = NC.conc_cod AND t.terc_nit = nc.terc_nit AND D.dpto_cod = E.empl_dpto AND NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N'
   AND ND.nomi_id = :id AND ND.terc_nit = E.terc_nit
   ORDER BY T.terc_nom
   INTO :nitempl, :valor, :deduc, :nombreempl, :nomcortconc, :nombreconc, :codconc, :prov, :cargoempl,:ctaempl,:deptoempl,:coddptoempl,:diaslab,:nitnue, :salario, :beneficio,:base
   DO
   BEGIN
    IF ((nitnue <> nitant) AND (nitnue IS NOT NULL)) THEN
     numempl = :numempl + 1;
    IF (valor IS NULL) THEN
    valor = 0;
    IF (nitempl <> nitdeduc) THEN
    BEGIN
     par = 2;
     impar = 1;
    END
    nitdeduc = :nitempl;
    IF (:deduc = 'S') THEN
    BEGIN
     antdeduc = 'S';
     org = :par;
     par = :par + 2;
    END
    ELSE
    BEGIN
     antdeduc = 'N';
     org = :impar;
     impar = :impar + 2;
    END
    SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND TERC_NIT = :nitempl INTO :totalempl;
    SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND TERC_NIT = :nitempl AND NC.noco_deduc = 'S' INTO :totaldeduc;
    SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND TERC_NIT = :nitempl AND NC.noco_deduc = 'N' INTO :totaldeveng;
    IF (cta = 'S') THEN
    BEGIN
     SELECT COUNT(CONC_COD) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND TERC_NIT = :nitempl INTO :numconc;
     totalempl = totalempl / :numconc;
     SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND TERC_NIT = :nitempl INTO :totalctas;
    END
    SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id INTO :totalnomi;
    SELECT SUM(NC.noco_valor*-1) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_APORTE = 'S' AND NOCO_VALOR < 0 AND NOMI_ID = :id INTO :totalaporneg;
    SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_APORTE = 'S' AND NOCO_VALOR > 0 AND NOMI_ID = :id INTO :totalapor;
    totalapor = :totalapor + totalaporneg;
   SUSPEND;
    IF ((nitnue <> nitant) AND (nitnue IS NOT NULL) AND (EMPL = 'N')) THEN
    BEGIN
     deduc = 'N';
     nomcortconc = 'TOTAL DEV';
     nombreconc = 'TOTAL DEV';
     codconc = 9999;
     prov = 'N';
     SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND NC.noco_deduc = 'N' AND NC.terc_nit = : nitempl INTO :VALOR;
     SUSPEND;
     deduc = 'S';
     nomcortconc = 'TOTAL DEDUC';
     nombreconc = 'TOTAL DEDUC';
     codconc = 99999;
     prov = 'N';
     SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND NC.noco_deduc = 'S' AND NC.terc_nit = :nitempl INTO :VALOR;
     SUSPEND;
     deduc = 'S';
     nomcortconc = 'TOTAL EMPL';
     nombreconc = 'TOTAL EMPL';
     codconc = 999999;
     prov = 'N';
     SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND NC.terc_nit = :nitempl INTO :VALOR;
     nitant = :nitnue;
     SUSPEND;
    END
   END
   numempl = :numempl + 1;
   IF ( EMPL = 'N') THEN
   BEGIN
    nitempl = '';
    valor = NULL;
    deduc = '';
    nombreempl = NULL;
    nomcortconc = NULL;
    nombreconc = NULL;
    codconc = NULL;
    prov = NULL;
    totalempl = NULL;
    ctaempl = NULL;
    IF (cta = 'N') THEN
    BEGIN
     FOR SELECT MAX(N.conc_cod) FROM NOMINA_CONCEPTOS N WHERE N.nomi_id = :id AND N.noco_prov = 'N' AND N.noco_gtoempr = 'N'
     GROUP BY N.conc_cod
     INTO :codconc
     DO
     BEGIN
     IF (dpto IS NOT NULL AND (DPTO <> '') ) THEN
     BEGIN
      SELECT SUM(NC.noco_valor), MAX(NC.noco_deduc) FROM NOMINA_CONCEPTOS NC, EMPLEADOS E, DEPARTAMENTO D
      WHERE NC.nomi_id = :ID AND NC.conc_cod = :codconc AND D.dpto_cod = E.empl_dpto AND NC.terc_nit = E.terc_nit AND d.dpto_cod = :dpto
      GROUP BY NC.conc_cod
      INTO :valor, :deduc;
      nitempl = '-';
      nombreempl = 'TOTAL';
      deptoempl = '-';
      prov = 'N';
      SELECT C.conc_nombre,C.conc_nomcorto FROM CONCEPTOS_NOMINA C WHERE C.conc_cod = :codconc INTO :nombreconc,:nomcortconc;
      SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC, EMPLEADOS E, DEPARTAMENTO D WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id  AND D.dpto_cod = E.empl_dpto AND NC.terc_nit = E.terc_nit INTO :totalempl;
      SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC, EMPLEADOS E, DEPARTAMENTO D WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND NC.noco_deduc = 'S'  AND D.dpto_cod = E.empl_dpto AND NC.terc_nit = E.terc_nit INTO :totaldeduc;
      SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC, EMPLEADOS E, DEPARTAMENTO D WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND NC.noco_deduc = 'N'  AND D.dpto_cod = E.empl_dpto AND NC.terc_nit = E.terc_nit INTO :totaldeveng;
     END
     ELSE
     BEGIN
      SELECT SUM(NC.noco_valor), MAX(NC.noco_deduc) FROM NOMINA_CONCEPTOS NC
      WHERE NC.nomi_id = :ID AND NC.conc_cod = :codconc
      GROUP BY NC.conc_cod
      INTO :valor, :deduc;
      nitempl = '-';
      nombreempl = 'TOTAL';
      deptoempl = '-';
      prov = 'N';
      SELECT C.conc_nombre,C.conc_nomcorto FROM CONCEPTOS_NOMINA C WHERE C.conc_cod = :codconc INTO :nombreconc,:nomcortconc;
      SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id INTO :totalempl;
      SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND NC.noco_deduc = 'S' INTO :totaldeduc;
      SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND NC.noco_deduc = 'N' INTO :totaldeveng;
     END
      SUSPEND;
     END
     IF (dpto IS NOT NULL AND (DPTO <> '') ) THEN
     BEGIN
     deduc = 'N';
     nomcortconc = 'TOTAL DEV';
     nombreconc = 'TOTAL DEV';
     codconc = 9999;
     deptoempl = '-';
     prov = 'N';
     SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC, EMPLEADOS E, DEPARTAMENTO D WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id  AND D.dpto_cod = E.empl_dpto AND NC.terc_nit = E.terc_nit AND d.dpto_cod = :dpto INTO :VALOR;
     nitempl = '-';
     nombreempl = 'TOTAL';
     SUSPEND;
     deduc = 'S';
     nomcortconc = 'TOTAL DEDUC';
     nombreconc = 'TOTAL DEDUC';
     codconc = 99999;
     deptoempl = '-';
     prov = 'N';
     SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC, EMPLEADOS E, DEPARTAMENTO D WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND NC.noco_deduc = 'S'  AND D.dpto_cod = E.empl_dpto AND d.dpto_cod = :dpto AND NC.terc_nit = E.terc_nit INTO :VALOR;
     nitempl = '-';
     nombreempl = 'TOTAL';
     SUSPEND;
     deduc = 'S';
     nomcortconc = 'TOTAL EMPL';
     nombreconc = 'TOTAL EMPL';
     codconc = 999999;
     deptoempl = '-';
     prov = 'N';
     SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC, EMPLEADOS E, DEPARTAMENTO D WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND NC.noco_deduc = 'N'  AND D.dpto_cod = E.empl_dpto AND d.dpto_cod = :dpto AND NC.terc_nit = E.terc_nit INTO :VALOR;
     nitempl = '-';
     nombreempl = 'TOTAL';
     SUSPEND;
     END
     ELSE
     BEGIN
     deduc = 'N';
     nomcortconc = 'TOTAL DEV';
     nombreconc = 'TOTAL DEV';
     codconc = 9999;
     prov = 'N';
     SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND NC.noco_deduc = 'N' INTO :VALOR;
     nitempl = '-';
     nombreempl = 'TOTAL';
     SUSPEND;
     deduc = 'S';
     nomcortconc = 'TOTAL DEDUC';
     nombreconc = 'TOTAL DEDUC';
     codconc = 99999;
     prov = 'N';
     SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND NC.noco_deduc = 'S' INTO :VALOR;
     nitempl = '-';
     nombreempl = 'TOTAL';
     SUSPEND;
     deduc = 'S';
     nomcortconc = 'TOTAL EMPL';
     nombreconc = 'TOTAL EMPL';
     codconc = 999999;
     prov = 'N';
     SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N'  AND NOMI_ID = :id INTO :VALOR;
     nitempl = '-';
     nombreempl = 'TOTAL';
     SUSPEND;
     END
     END
   END
  END
 END
END
^

SET TERM ; ^

ALTER TABLE CONCEPTOS_NOMINA
ADD CONC_ORDEN INTEGER;

GRANT ALL ON documentos_import_empleado TO PUBLIC;
GRANT ALL ON PROGRAM_VACACIONES TO PUBLIC;

SET TERM ^ ;

CREATE OR ALTER PROCEDURE LIQUIDA_VACACIONES (
    nitempl varchar(20),
    dias integer,
    fecha date,
    salario numeric(18,2))
returns (
    vacac numeric(18,2),
    idvacac integer)
as
declare variable saldosini numeric(18,2);
declare variable fecing date;
declare variable diaslab integer;
BEGIN
SELECT E.empl_fecing FROM EMPLEADOS E WHERE E.terc_nit = :nitempl INTO :fecing;
idvacac = GEN_ID(ID_VACACIONES,1);
diaslab = CAST(:fecha - :fecing AS INTEGER)-1;
if (substr(fecing,6,7) = '07') then
diaslab = diaslab - 4;
if (substr(fecing,5,7) = 08) then
diaslab = diaslab - 3;
if (substr(fecing,5,7) = 09) then
diaslab = diaslab - 2;
if (substr(fecing,5,7) = 10) then
diaslab = diaslab - 2;
if (substr(fecing,5,7) = 11) then
diaslab = diaslab - 1;
if (substr(fecing,5,7) = 12) then
diaslab = diaslab - 1;
if (diaslab > 365) then
diaslab = 365;
vacac = (salario * diaslab)/720;
  SUSPEND;
END
^

SET TERM ; ^

GRANT EXECUTE ON PROCEDURE rep_concep_xpagar TO PUBLIC;

ALTER TABLE ADMINISTRADORA
ADD ADMI_CTAEPS T_CTA_CONTABLE;

ALTER TABLE ADMINISTRADORA
ADD ADMI_CTAAFP T_CTA_CONTABLE;

ALTER TABLE ADMINISTRADORA
ADD ADMI_CTAAFC T_CTA_CONTABLE;

ALTER TABLE ADMINISTRADORA
ADD ADMI_CTAARP T_CTA_CONTABLE;

ALTER TABLE ADMINISTRADORA
ADD ADMI_CTACCF T_CTA_CONTABLE;

ALTER TABLE NOMINA_CONCEPTOS ADD NOCO_BASE NUMERIC(18,2);

SET TERM ^ ;

ALTER PROCEDURE IMPR_PLANILLA_NOMINA (
    id integer,
    pago char(1),
    cta char(1),
    empl char(1),
    dpto varchar(20))
returns (
    fecha date,
    observaciones blob sub_type 0 segment size 80,
    pagoglobal char(1),
    periodo integer,
    ano char(4),
    periodicidad varchar(60),
    nitempl varchar(20),
    valor numeric(18,2),
    deduc char(1),
    nombreempl varchar(60),
    nomcortconc varchar(60),
    nombreconc varchar(60),
    codconc integer,
    prov char(1),
    totalempl numeric(18,2),
    totaldeduc numeric(18,2),
    totaldeveng numeric(18,2),
    numempl integer,
    ctaempl varchar(25),
    totalctas numeric(18,2),
    totalnomi numeric(18,2),
    totalapor numeric(18,2),
    nomper varchar(60),
    org integer,
    cargoempl varchar(60),
    deptoempl varchar(60),
    numcop integer,
    nombre_copia varchar(60),
    diaslab integer,
    salario numeric(18,2),
    beneficio char(1),
    base numeric(18,2),
    coddptoempl integer)
as
declare variable nitant varchar(20);
declare variable nitnue varchar(20);
declare variable numconc integer;
declare variable totalnomineg numeric(18,2);
declare variable totalaporneg numeric(18,2);
declare variable par integer;
declare variable impar integer;
declare variable antdeduc char(1);
declare variable nitdeduc varchar(20);
declare variable nittot varchar(20);
declare variable nitaux varchar(20);
BEGIN
 SELECT N.nuco_copia FROM NUMERO_COPIA N WHERE N.tido_cod = 92 AND N.nuco_id = :id INTO :NUMCOP;
 IF (numcop IS NULL) THEN
 BEGIN
  numcop = 0;
  INSERT INTO NUMERO_COPIA (TIDO_COD, NUCO_ID, NUCO_COPIA) VALUES (92,:id,:numcop);
 END
 ELSE
 BEGIN
  numcop = :numcop + 1;
  UPDATE numero_copia N SET N.nuco_copia = :numcop WHERE N.tido_cod = 92 AND N.nuco_id = :id;
 END
 SELECT N.noco_nombre FROM nombres_copias N WHERE N.noco_id = :numcop INTO :nombre_copia;
 numempl = 0;
 nitant = 0;
 nitnue = 0;
 IF (PAGO = 'N') THEN
 BEGIN
  FOR SELECT N.nomi_feccausa, N.nomi_obs, N.nomi_pagoglobal, N.nomi_periodo, N.nomi_ano, P.ppag_nombre, PN.pnom_nombre FROM NOMINA N, periodo_pago P, periodo_pago_nombre PN
  WHERE P.ppag_cod = N.nomi_periodocidad AND N.nomi_id = :ID AND PN.ppag_cod = N.nomi_periodocidad AND PN.ppag_periodo = N.nomi_periodo
  INTO :fecha, :observaciones, :pagoglobal, :periodo, :ano, :periodicidad, :NOMPER
  DO
  BEGIN
   FOR SELECT NC.terc_nit, NC.noco_valor, NC.noco_deduc, T.terc_nom, C.conc_nomcorto, C.conc_nombre, NC.conc_cod, NC.noco_prov, E.empl_cargo FROM NOMINA_CONCEPTOS NC, TERCEROS T, EMPLEADOS E, CONCEPTOS_NOMINA C
   WHERE NC.nomi_id = :ID AND T.terc_nit = E.terc_nit AND C.conc_cod = NC.conc_cod AND t.terc_nit = nc.terc_nit
   INTO :nitempl, :valor, :deduc, :nombreempl, :nomcortconc, :nombreconc, :codconc, :prov, :cargoempl
   DO
   BEGIN
    IF (valor IS NULL) THEN
    valor = 0;
    SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND TERC_NIT = :nitempl INTO :totalempl;
    SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND TERC_NIT = :nitempl AND NC.noco_deduc = 'S' INTO :totaldeduc;
    SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND TERC_NIT = :nitempl AND NC.noco_deduc = 'N' INTO :totaldeveng;
    SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id INTO :totalnomi;
    SELECT SUM(NC.noco_valor*-1) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_APORTE = 'S' AND NOCO_VALOR < 0 AND NOMI_ID = :id INTO :totalaporneg;
    SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_APORTE = 'S' AND NOCO_VALOR > 0 AND NOMI_ID = :id INTO :totalapor;
    totalapor = :totalapor + totalaporneg;
    SUSPEND;
   END
   nitempl = '';
   valor = NULL;
   deduc = '';
   nombreempl = NULL;
   nomcortconc = NULL;
   nombreconc = NULL;
   codconc = NULL;
   prov = NULL;
   FOR SELECT MAX(N.conc_cod) FROM NOMINA_CONCEPTOS N WHERE N.nomi_id = :id
   GROUP BY N.conc_cod
   INTO :codconc
   DO
   BEGIN
    SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC
    WHERE NC.nomi_id = :ID AND NC.conc_cod = :codconc
    GROUP BY NC.conc_cod
    INTO :valor;
    nitempl = '';
    nombreempl = '';
    deduc = 'N';
    prov = 'N';
    SELECT C.conc_nombre,C.conc_nomcorto FROM CONCEPTOS_NOMINA C WHERE C.conc_cod = :codconc INTO :nombreconc,:nomcortconc;
    SUSPEND;
   END
   IF (EMPL = 'N') THEN
   BEGIN
     deduc = 'N';
     nomcortconc = 'DIAS LAB.';
     nombreconc = 'DIAS LAB.';
     codconc = 0;
     prov = 'N';
     valor = NULL;
     nitempl = '';
     nombreempl = '';
     SUSPEND;
     deduc = 'N';
     nomcortconc = 'SDO BASE';
     nombreconc = 'SDO BASE';
     codconc = 0;
     prov = 'N';
     valor = NULL;
     nitempl = '';
     nombreempl = '';
     SUSPEND;
  END
     FOR SELECT ND.node_diaslab, E.empl_salario, ND.terc_nit, T.terc_nom FROM NOMINA_DETALLE ND, EMPLEADOS E, TERCEROS T WHERE NOMI_ID = :id AND ND.terc_nit = E.terc_nit AND T.terc_nit = ND.terc_nit
     INTO :diaslab, :salario, :nitaux, :nombreempl
     DO
     BEGIN
      nitempl = :nitaux;
      nomcortconc = 'DIAS LAB.';
      valor = :diaslab;
      SUSPEND;
      nitempl = :nitaux;
      nomcortconc = 'SDO BASE';
      valor = :salario;
      SUSPEND;
     END
  END
 END
 ELSE
 IF (PAGO = 'S') THEN
 BEGIN
  par = 2;
  impar = 1;
  SELECT N.nomi_feccausa, N.nomi_obs, N.nomi_pagoglobal, N.nomi_periodo, N.nomi_ano, P.ppag_nombre, PN.pnom_nombre FROM NOMINA N, periodo_pago P, periodo_pago_nombre PN
  WHERE P.ppag_cod = N.nomi_periodocidad AND N.nomi_id = :ID AND PN.ppag_cod = N.nomi_periodocidad AND PN.ppag_periodo = N.nomi_periodo
  INTO :fecha, :observaciones, :pagoglobal, :periodo, :ano, :periodicidad, :NOMPER;
  IF (EMPL = 'N') THEN
  BEGIN
     deduc = 'N';
     nomcortconc = 'DIAS LAB.';
     nombreconc = 'DIAS LAB.';
     codconc = 0;
     prov = 'N';
     valor = NULL;
     nitempl = '';
     nombreempl = '';
     SUSPEND;
     deduc = 'N';
     nomcortconc = 'SDO BASE';
     nombreconc = 'SDO BASE';
     codconc = 0;
     prov = 'N';
     valor = NULL;
     nitempl = '';
     nombreempl = '';
     SUSPEND;
     deduc = 'N';
     nomcortconc = 'TOTAL DEV';
     nombreconc = 'TOTAL DEV';
     codconc = 9999;
     prov = 'N';
     valor = NULL;
     nitempl = '';
     nombreempl = '';
     SUSPEND;
     deduc = 'S';
     nomcortconc = 'TOTAL DEDUC';
     nombreconc = 'TOTAL DEDUC';
     codconc = 99999;
     prov = 'N';
     valor = NULL;
     nitempl = '';
     nombreempl = '';
     SUSPEND;
     deduc = 'S';
     nomcortconc = 'TOTAL EMPL';
     nombreconc = 'TOTAL EMPL';
     codconc = 999999;
     prov = 'N';
     valor = NULL;
     nitempl = '';
     nombreempl = '';
     SUSPEND;
  END
  BEGIN
    IF (EMPL = 'N') THEN
    BEGIN
     FOR SELECT MAX(N.conc_cod) FROM NOMINA_CONCEPTOS N WHERE N.nomi_id = :id AND N.noco_prov = 'N' AND N.noco_gtoempr = 'N'
     GROUP BY N.conc_cod
     INTO :codconc
     DO
     BEGIN
      SELECT NULL, MAX(NC.noco_deduc) FROM NOMINA_CONCEPTOS NC
      WHERE NC.nomi_id = :ID AND NC.conc_cod = :codconc
      GROUP BY NC.conc_cod
      INTO :valor, :deduc;
      valor = NULL;
      nitempl = '';
      nombreempl = '';
      prov = 'N';
      SELECT C.conc_nombre,C.conc_nomcorto FROM CONCEPTOS_NOMINA C WHERE C.conc_cod = :codconc INTO :nombreconc,:nomcortconc;
      SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id INTO :totalempl;
      SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND NC.noco_deduc = 'S' INTO :totaldeduc;
      SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND NC.noco_deduc = 'N' INTO :totaldeveng;
      SUSPEND;
     END
     FOR SELECT ND.node_diaslab, E.empl_salario, ND.terc_nit, T.terc_nom FROM NOMINA_DETALLE ND, EMPLEADOS E, TERCEROS T WHERE NOMI_ID = :id AND ND.terc_nit = E.terc_nit AND T.terc_nit = ND.terc_nit
     INTO :diaslab, :salario, :nitaux, :nombreempl
     DO
     BEGIN
      nitempl = :nitaux;
      nomcortconc = 'DIAS LAB.';
      valor = :diaslab;
      SUSPEND;
      nitempl = :nitaux;
      nomcortconc = 'SDO BASE';
      valor = :salario;
      SUSPEND;
     END
    END
   FOR SELECT NC.terc_nit, NC.noco_valor, NC.noco_deduc, T.terc_nom, C.conc_nomcorto, C.conc_nombre, NC.conc_cod, NC.noco_prov, E.empl_cargo, E.empl_cuenta, D.dpto_nombre, d.dpto_cod, ND.node_diaslab,NC.terc_nit, E.empl_salario, c.conc_benefic, NC.noco_base
   FROM NOMINA_CONCEPTOS NC, TERCEROS T, EMPLEADOS E, CONCEPTOS_NOMINA C, DEPARTAMENTO D, NOMINA_DETALLE ND
   WHERE NC.nomi_id = :ID AND T.terc_nit = E.terc_nit AND C.conc_cod = NC.conc_cod AND t.terc_nit = nc.terc_nit AND D.dpto_cod = E.empl_dpto AND NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N'
   AND ND.nomi_id = :id AND ND.terc_nit = E.terc_nit
   ORDER BY T.terc_nom
   INTO :nitempl, :valor, :deduc, :nombreempl, :nomcortconc, :nombreconc, :codconc, :prov, :cargoempl,:ctaempl,:deptoempl,:coddptoempl,:diaslab,:nitnue, :salario, :beneficio,:base
   DO
   BEGIN
    IF ((nitnue <> nitant) AND (nitnue IS NOT NULL)) THEN
     numempl = :numempl + 1;
    IF (valor IS NULL) THEN
    valor = 0;
    IF (nitempl <> nitdeduc) THEN
    BEGIN
     par = 2;
     impar = 1;
    END
    nitdeduc = :nitempl;
    IF (:deduc = 'S') THEN
    BEGIN
     antdeduc = 'S';
     org = :par;
     par = :par + 2;
    END
    ELSE
    BEGIN
     antdeduc = 'N';
     org = :impar;
     impar = :impar + 2;
    END
    SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND TERC_NIT = :nitempl INTO :totalempl;
    SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND TERC_NIT = :nitempl AND NC.noco_deduc = 'S' INTO :totaldeduc;
    SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND TERC_NIT = :nitempl AND NC.noco_deduc = 'N' INTO :totaldeveng;
    IF (cta = 'S') THEN
    BEGIN
     SELECT COUNT(CONC_COD) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND TERC_NIT = :nitempl INTO :numconc;
     totalempl = totalempl / :numconc;
     SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND TERC_NIT = :nitempl INTO :totalctas;
    END
    SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id INTO :totalnomi;
    SELECT SUM(NC.noco_valor*-1) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_APORTE = 'S' AND NOCO_VALOR < 0 AND NOMI_ID = :id INTO :totalaporneg;
    SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_APORTE = 'S' AND NOCO_VALOR > 0 AND NOMI_ID = :id INTO :totalapor;
    totalapor = :totalapor + totalaporneg;
   SUSPEND;
    IF ((nitnue <> nitant) AND (nitnue IS NOT NULL) AND (EMPL = 'N')) THEN
    BEGIN
     deduc = 'N';
     nomcortconc = 'TOTAL DEV';
     nombreconc = 'TOTAL DEV';
     codconc = 9999;
     prov = 'N';
     SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND NC.noco_deduc = 'N' AND NC.terc_nit = : nitempl INTO :VALOR;
     SUSPEND;
     deduc = 'S';
     nomcortconc = 'TOTAL DEDUC';
     nombreconc = 'TOTAL DEDUC';
     codconc = 99999;
     prov = 'N';
     SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND NC.noco_deduc = 'S' AND NC.terc_nit = :nitempl INTO :VALOR;
     SUSPEND;
     deduc = 'S';
     nomcortconc = 'TOTAL EMPL';
     nombreconc = 'TOTAL EMPL';
     codconc = 999999;
     prov = 'N';
     SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND NC.terc_nit = :nitempl INTO :VALOR;
     nitant = :nitnue;
     SUSPEND;
    END
   END
   numempl = :numempl + 1;
   IF ( EMPL = 'N') THEN
   BEGIN
    nitempl = '';
    valor = NULL;
    deduc = '';
    nombreempl = NULL;
    nomcortconc = NULL;
    nombreconc = NULL;
    codconc = NULL;
    prov = NULL;
    totalempl = NULL;
    ctaempl = NULL;
    IF (cta = 'N') THEN
    BEGIN
     FOR SELECT MAX(N.conc_cod) FROM NOMINA_CONCEPTOS N WHERE N.nomi_id = :id AND N.noco_prov = 'N' AND N.noco_gtoempr = 'N'
     GROUP BY N.conc_cod
     INTO :codconc
     DO
     BEGIN
     IF (dpto IS NOT NULL AND (DPTO <> '') ) THEN
     BEGIN
      SELECT SUM(NC.noco_valor), MAX(NC.noco_deduc) FROM NOMINA_CONCEPTOS NC, EMPLEADOS E, DEPARTAMENTO D
      WHERE NC.nomi_id = :ID AND NC.conc_cod = :codconc AND D.dpto_cod = E.empl_dpto AND NC.terc_nit = E.terc_nit AND d.dpto_cod = :dpto
      GROUP BY NC.conc_cod
      INTO :valor, :deduc;
      nitempl = '-';
      nombreempl = 'TOTAL';
      deptoempl = '-';
      prov = 'N';
      SELECT C.conc_nombre,C.conc_nomcorto FROM CONCEPTOS_NOMINA C WHERE C.conc_cod = :codconc INTO :nombreconc,:nomcortconc;
      SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC, EMPLEADOS E, DEPARTAMENTO D WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id  AND D.dpto_cod = E.empl_dpto AND NC.terc_nit = E.terc_nit INTO :totalempl;
      SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC, EMPLEADOS E, DEPARTAMENTO D WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND NC.noco_deduc = 'S'  AND D.dpto_cod = E.empl_dpto AND NC.terc_nit = E.terc_nit INTO :totaldeduc;
      SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC, EMPLEADOS E, DEPARTAMENTO D WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND NC.noco_deduc = 'N'  AND D.dpto_cod = E.empl_dpto AND NC.terc_nit = E.terc_nit INTO :totaldeveng;
     END
     ELSE
     BEGIN
      SELECT SUM(NC.noco_valor), MAX(NC.noco_deduc) FROM NOMINA_CONCEPTOS NC
      WHERE NC.nomi_id = :ID AND NC.conc_cod = :codconc
      GROUP BY NC.conc_cod
      INTO :valor, :deduc;
      nitempl = '-';
      nombreempl = 'TOTAL';
      deptoempl = '-';
      prov = 'N';
      SELECT C.conc_nombre,C.conc_nomcorto FROM CONCEPTOS_NOMINA C WHERE C.conc_cod = :codconc INTO :nombreconc,:nomcortconc;
      SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id INTO :totalempl;
      SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND NC.noco_deduc = 'S' INTO :totaldeduc;
      SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND NC.noco_deduc = 'N' INTO :totaldeveng;
     END
      SUSPEND;
     END
     IF (dpto IS NOT NULL AND (DPTO <> '') ) THEN
     BEGIN
     deduc = 'N';
     nomcortconc = 'TOTAL DEV';
     nombreconc = 'TOTAL DEV';
     codconc = 9999;
     deptoempl = '-';
     prov = 'N';
     SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC, EMPLEADOS E, DEPARTAMENTO D WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id  AND D.dpto_cod = E.empl_dpto AND NC.terc_nit = E.terc_nit AND d.dpto_cod = :dpto INTO :VALOR;
     nitempl = '-';
     nombreempl = 'TOTAL';
     SUSPEND;
     deduc = 'S';
     nomcortconc = 'TOTAL DEDUC';
     nombreconc = 'TOTAL DEDUC';
     codconc = 99999;
     deptoempl = '-';
     prov = 'N';
     SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC, EMPLEADOS E, DEPARTAMENTO D WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND NC.noco_deduc = 'S'  AND D.dpto_cod = E.empl_dpto AND d.dpto_cod = :dpto AND NC.terc_nit = E.terc_nit INTO :VALOR;
     nitempl = '-';
     nombreempl = 'TOTAL';
     SUSPEND;
     deduc = 'S';
     nomcortconc = 'TOTAL EMPL';
     nombreconc = 'TOTAL EMPL';
     codconc = 999999;
     deptoempl = '-';
     prov = 'N';
     SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC, EMPLEADOS E, DEPARTAMENTO D WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND NC.noco_deduc = 'N'  AND D.dpto_cod = E.empl_dpto AND d.dpto_cod = :dpto AND NC.terc_nit = E.terc_nit INTO :VALOR;
     nitempl = '-';
     nombreempl = 'TOTAL';
     SUSPEND;
     END
     ELSE
     BEGIN
     deduc = 'N';
     nomcortconc = 'TOTAL DEV';
     nombreconc = 'TOTAL DEV';
     codconc = 9999;
     prov = 'N';
     SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND NC.noco_deduc = 'N' INTO :VALOR;
     nitempl = '-';
     nombreempl = 'TOTAL';
     SUSPEND;
     deduc = 'S';
     nomcortconc = 'TOTAL DEDUC';
     nombreconc = 'TOTAL DEDUC';
     codconc = 99999;
     prov = 'N';
     SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND NC.noco_deduc = 'S' INTO :VALOR;
     nitempl = '-';
     nombreempl = 'TOTAL';
     SUSPEND;
     deduc = 'S';
     nomcortconc = 'TOTAL EMPL';
     nombreconc = 'TOTAL EMPL';
     codconc = 999999;
     prov = 'N';
     SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N'  AND NOMI_ID = :id INTO :VALOR;
     nitempl = '-';
     nombreempl = 'TOTAL';
     SUSPEND;
     END
     END
   END
  END
 END
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE LIQUIDA_VACACIONES (
    nitempl varchar(20),
    dias integer,
    fecha date,
    salario numeric(18,2))
returns (
    vacac numeric(18,2),
    idvacac integer)
as
declare variable saldosini numeric(18,2);
declare variable fecing date;
declare variable diaslab integer;
BEGIN
if (dias is null) then
begin
SELECT E.empl_fecing FROM EMPLEADOS E WHERE E.terc_nit = :nitempl INTO :fecing;
idvacac = GEN_ID(ID_VACACIONES,1);
diaslab = CAST(:fecha - :fecing AS INTEGER)-1;
if (substr(fecing,6,7) = '07') then
diaslab = diaslab - 4;
if (substr(fecing,5,7) = 08) then
diaslab = diaslab - 3;
if (substr(fecing,5,7) = 09) then
diaslab = diaslab - 2;
if (substr(fecing,5,7) = 10) then
diaslab = diaslab - 2;
if (substr(fecing,5,7) = 11) then
diaslab = diaslab - 1;
if (substr(fecing,5,7) = 12) then
diaslab = diaslab - 1;
if (diaslab > 365) then
diaslab = 365;
vacac = (salario * diaslab)/720;
end
else
begin
 vacac = (salario/30)*:dias;
 idvacac = GEN_ID(ID_VACACIONES,1);
end
  SUSPEND;
END
^

SET TERM ; ^

ALTER TABLE CONCEPTOS_NOMINA DROP CONC_ORDEN;

ALTER TABLE CONCEPTOS_NOMINA
ADD CONC_ORDEN INTEGER;

SET TERM ^ ;

CREATE OR ALTER PROCEDURE FORM_INTEGRADO_ELECTRONICO (
    iddoc integer,
    fecliq varchar(8),
    codoper varchar(2))
returns (
    datos varchar(591))
as
declare variable tipreg varchar(2);
declare variable sec varchar(5);
declare variable nomcia varchar(200);
declare variable tipdocaport varchar(2);
declare variable nitcia varchar(16);
declare variable dvcia varchar(1);
declare variable formapresent varchar(1);
declare variable codsucur varchar(10);
declare variable nomsucur varchar(40);
declare variable codarp varchar(6);
declare variable perliq varchar(7);
declare variable perliqsalud char(6);
declare variable numform varchar(10);
declare variable vlornomi varchar(12);
declare variable vlornomiint integer;
declare variable nitempl varchar(16);
declare variable secint integer;
declare variable tipoid varchar(2);
declare variable tipocot varchar(2);
declare variable nom1 varchar(20);
declare variable nom2 varchar(30);
declare variable ape1 varchar(20);
declare variable ape2 varchar(30);
declare variable fecing date;
declare variable fecret date;
declare variable countnov integer;
declare variable novedad varchar(1);
declare variable codadmin varchar(6);
declare variable diaslab varchar(3);
declare variable salminimo varchar(22);
declare variable fecanomes char(7);
declare variable salbasic varchar(22);
declare variable incap varchar(2);
BEGIN
TIPREG = '01';
DATOS = :tipreg;
SEC = '00001';
DATOS = :DATOS || :sec;
EXECUTE PROCEDURE LEE_CONFIGURACION ('GENERAL','GENERAL','NOMBRE COMPAÑIA') RETURNING_VALUES (:nomcia);
EXECUTE PROCEDURE CEROS_ANCHO_FIJO (:nomcia, 200, 'A') RETURNING_VALUES (:nomcia);
DATOS = :DATOS || :nomcia;
DATOS = :DATOS || 'NI';
EXECUTE PROCEDURE LEE_CONFIGURACION ('CONTABILIDAD','GENERAL','NIT COMPAÑIA') RETURNING_VALUES (:nitcia);
EXECUTE PROCEDURE DV (nitcia) RETURNING_VALUES (dvcia);
EXECUTE PROCEDURE CEROS_ANCHO_FIJO (:nitcia, 16, 'A') RETURNING_VALUES (:nitcia);
DATOS = :DATOS || :nitcia;
DATOS = :DATOS || :dvcia;
FORMAPRESENT = 'U';
DATOS = :DATOS || :formapresent;
codsucur = '';
EXECUTE PROCEDURE CEROS_ANCHO_FIJO (:codsucur, 10, 'A') RETURNING_VALUES (:codsucur);
DATOS = :DATOS || :codsucur;
nomsucur = '';
EXECUTE PROCEDURE CEROS_ANCHO_FIJO (:nomsucur, 40, 'A') RETURNING_VALUES (:nomsucur);
DATOS = :DATOS || :nomsucur;
SELECT ADMI_CODARP FROM ADMINISTRADORA A, PARAMETROS_ANO P WHERE P.paan_nitarp = A.terc_nit INTO :codarp;
EXECUTE PROCEDURE CEROS_ANCHO_FIJO (:codarp, 6, 'A') RETURNING_VALUES (:codarp);
DATOS = :DATOS || :codarp;
SELECT SUBSTRING(P.pgap_fecha FROM 1 FOR 7) FROM PAGO_APORTES P WHERE P.pgap_id = :iddoc AND p.pgap_item = 1 INTO :perliq;
perliq = substr(perliq, 1,4) || substr(perliq, 6,8);
DATOS = :DATOS || :perliq;
perliqsalud = :perliq;
DATOS = :DATOS || :perliqsalud;
SELECT pgap_formulario FROM PAGO_APORTES WHERE PGAP_ID = :iddoc AND pgap_item = 1 INTO :numform;
EXECUTE PROCEDURE CEROS_ANCHO_FIJO (:numform, 10, 'A') RETURNING_VALUES (:numform);
DATOS = :DATOS || :numform;
DATOS = :DATOS || :fecliq;
SELECT CAST(SUM(pade_ibc) AS INTEGER) FROM PAGO_APORTES_DETALLE WHERE PGAP_ID = :iddoc INTO :vlornomiint;
/*vlornomiint = CAST(:vlornomi AS INTEGER);
*/vlornomi = CAST(vlornomiint AS VARCHAR(12));
EXECUTE PROCEDURE CEROS_ANCHO_FIJO (:vlornomi, 12, 'N') RETURNING_VALUES (:vlornomi);
DATOS = :DATOS || :vlornomi;
EXECUTE PROCEDURE CEROS_ANCHO_FIJO (:codoper, 2, 'N') RETURNING_VALUES (:codoper);
DATOS = :DATOS || :codoper;
SUSPEND;
datos = '';
secint = 1;
FOR SELECT e.terc_nit, T.terc_tipoid, E.tcot_cod, T.terc_nombre1, T.terc_nombre2, T.terc_apellido1, T.terc_apellido2, E.empl_fecing, e.empl_fecret FROM empleados e, TERCEROS T
WHERE (e.empl_fecret > substr(:fecliq,1,4) || '/' || substr(:fecliq,5,6) || '/' || substr(:fecliq,7,8) OR (e.empl_fecret IS NULL))  AND e.empl_fecing < substr(:fecliq,1,4) || '/' || substr(:fecliq,5,6) || '/' || substr(:fecliq,7,8) AND T.terc_nit = E.terc_nit
INTO :nitempl, :tipoid, :tipocot, :nom1, :nom2, :ape1, :ape2, :fecing, :fecret
DO
 BEGIN
    tipreg  = '02';
    DATOS = :datos || tipreg;
    secint = secint + 1;
    EXECUTE PROCEDURE CEROS_ANCHO_FIJO (CAST(secint AS VARCHAR(200)), 5, 'N') RETURNING_VALUES (:sec);
    DATOS = DATOS || :SEC;
    IF (:tipoid = 'N') THEN
    tipoid = 'NI';
    IF (:tipoid = 'C') THEN
    tipoid = 'CC';
    IF (:tipoid = 'E') THEN
    tipoid = 'CE';
    IF (:tipoid = 'T') THEN
    tipoid = 'TI';
    IF (:tipoid = 'R') THEN
    tipoid = 'RC';
    IF (:tipoid = 'P') THEN
    tipoid = 'PA';
    IF (:tipoid = 'J') THEN
    tipoid = 'CC';
    DATOS = DATOS || tipoid;
    EXECUTE PROCEDURE CEROS_ANCHO_FIJO (:nitempl, 16, 'A') RETURNING_VALUES (:nitempl);
    DATOS = DATOS || :nitempl;
    datos = datos || '0';
    EXECUTE PROCEDURE CEROS_ANCHO_FIJO (:tipocot, 1, 'N') RETURNING_VALUES (:tipocot);
    datos = datos || :tipocot;
    EXECUTE PROCEDURE CEROS_ANCHO_FIJO (:ape1, 20, 'A') RETURNING_VALUES (:ape1);
    IF (ape1 IS NULL) THEN
    ape1 = '';
    DATOS = DATOS || :ape1;
    EXECUTE PROCEDURE CEROS_ANCHO_FIJO (:ape2, 30, 'A') RETURNING_VALUES (:ape2);
    IF (ape2 IS NULL) THEN
    ape2 = '';
    DATOS = DATOS || :ape2;
    EXECUTE PROCEDURE CEROS_ANCHO_FIJO (:nom1, 20, 'A') RETURNING_VALUES (:nom1);
    IF (nom1 IS NULL) THEN
    nom1 = '';
    DATOS = DATOS || :nom1;
    EXECUTE PROCEDURE CEROS_ANCHO_FIJO (:nom2, 30, 'A') RETURNING_VALUES (:nom2);
    IF (nom2 IS NULL) THEN
    nom2 = '';
    DATOS = DATOS || :nom2;
    IF ((substr(:fecing,6,7) = substr(:fecliq,5,6)) AND (substr(:fecing,1,4) = substr(:fecliq,1,4))) THEN
    novedad = 'X';
    ELSE
    novedad = ' ';
    datos = :datos || :novedad;
    IF (:fecret IS NOT NULL AND (substr(:fecret,6,7) = substr(:fecliq,5,6))) THEN
    novedad = 'X';
    ELSE
    novedad = ' ';
    datos = :datos || :novedad;
    SELECT COUNT(*) FROM nomina_novedades v WHERE (substr(nono_fecha, 1,4) = substr(:fecliq,1,4)) AND (substr(nono_fecha, 6,7) = substr(:fecliq,6,7)) AND v.tnov_cod = 5 AND V.nono_tipoadm = 'E' INTO :countnov;
    IF (:countnov > 0) THEN
    novedad = 'X';
    ELSE
    novedad = ' ';
    datos = :datos || :novedad;
   SELECT COUNT(*) FROM nomina_novedades v WHERE (substr(nono_fecha, 1,4) = substr(:fecliq,1,4)) AND (substr(nono_fecha, 6,7) = substr(:fecliq,6,7)) AND v.tnov_cod = 5 AND V.nono_tipoadm = 'E' INTO :countnov;
    IF (:countnov > 0) THEN
    novedad = 'X';
    ELSE
    novedad = ' ';
    datos = :datos || :novedad;
    SELECT COUNT(*) FROM nomina_novedades v WHERE (substr(nono_fecha, 1,4) = substr(:fecliq,1,4)) AND (substr(nono_fecha, 6,7) = substr(:fecliq,6,7)) AND v.tnov_cod = 5 AND V.nono_tipoadm = 'A' INTO :countnov;
    IF (:countnov > 0) THEN
    novedad = 'X';
    ELSE
    novedad = ' ';
    datos = :datos || :novedad;    
    SELECT COUNT(*) FROM nomina_novedades v WHERE (substr(nono_fecha, 1,4) = substr(:fecliq,1,4)) AND (substr(nono_fecha, 6,7) = substr(:fecliq,6,7)) AND v.tnov_cod = 5 AND V.nono_tipoadm = 'A' INTO :countnov;
    IF (:countnov > 0) THEN
    novedad = 'X';
    ELSE
    novedad = ' ';
    datos = :datos || :novedad;
    SELECT COUNT(*) FROM nomina_novedades v WHERE (substr(nono_fecha, 1,4) = substr(:fecliq,1,4)) AND (substr(nono_fecha, 6,7) = substr(:fecliq,6,7)) AND v.tnov_cod = 8 AND V.nono_tipoadm = 'A' INTO :countnov;
    IF (:countnov > 0) THEN
    novedad = 'X';
    ELSE
    novedad = ' ';
    datos = :datos || :novedad;
    SELECT COUNT(*) FROM nomina_novedades v WHERE (substr(nono_fecha, 1,4) = substr(:fecliq,1,4)) AND (substr(nono_fecha, 6,7) = substr(:fecliq,6,7)) AND v.tnov_cod = 10 AND V.nono_tipoadm = 'A' INTO :countnov;
    IF (:countnov > 0) THEN
    novedad = 'X';
    ELSE
    novedad = ' ';
    datos = :datos || :novedad;
    SELECT COUNT(*) FROM nomina_novedades v WHERE (substr(nono_fecha, 1,4) = substr(:fecliq,1,4)) AND (substr(nono_fecha, 6,7) = substr(:fecliq,6,7)) AND v.tnov_cod = 11 INTO :countnov;
    IF (:countnov > 0) THEN
    novedad = 'X';
    ELSE
    novedad = ' ';
    datos = :datos || :novedad;    
    SELECT COUNT(*) FROM nomina_novedades v WHERE (substr(nono_fecha, 1,4) = substr(:fecliq,1,4)) AND (substr(nono_fecha, 6,7) = substr(:fecliq,6,7)) AND v.tnov_cod = 9 INTO :countnov;
    IF (:countnov > 0) THEN
    novedad = 'X';
    ELSE
    novedad = ' ';
    datos = :datos || :novedad;    
    SELECT COUNT(*) FROM nomina_novedades v WHERE (substr(nono_fecha, 1,4) = substr(:fecliq,1,4)) AND (substr(nono_fecha, 6,7) = substr(:fecliq,6,7)) AND v.tnov_cod = 2 INTO :countnov;
    IF (:countnov > 0) THEN
    novedad = 'X';
    ELSE
    novedad = ' ';
    datos = :datos || :novedad;    
    SELECT COUNT(*) FROM nomina_novedades v WHERE (substr(nono_fecha, 1,4) = substr(:fecliq,1,4)) AND (substr(nono_fecha, 6,7) = substr(:fecliq,6,7)) AND v.tnov_cod = 4 INTO :countnov;
    IF (:countnov > 0) THEN
    novedad = 'X';
    ELSE
    novedad = ' ';
    datos = :datos || :novedad;
    SELECT COUNT(*) FROM nomina_novedades v WHERE (substr(nono_fecha, 1,4) = substr(:fecliq,1,4)) AND (substr(nono_fecha, 6,7) = substr(:fecliq,6,7)) AND v.tnov_cod = 6 INTO :countnov;
    IF (:countnov > 0) THEN
    novedad = 'X';
    ELSE
    novedad = ' ';
    datos = :datos || :novedad;    
    SELECT COUNT(*) FROM nomina_novedades v WHERE (substr(nono_fecha, 1,4) = substr(:fecliq,1,4)) AND (substr(nono_fecha, 6,7) = substr(:fecliq,6,7)) AND v.tnov_cod = 1 INTO :countnov;
    IF (:countnov > 0) THEN
    novedad = 'X';
    ELSE
    novedad = ' ';
    datos = :datos || :novedad;    
    SELECT COUNT(*) FROM nomina_novedades v WHERE (substr(nono_fecha, 1,4) = substr(:fecliq,1,4)) AND (substr(nono_fecha, 6,7) = substr(:fecliq,6,7)) AND v.tnov_cod = 7 INTO :countnov;
    IF (:countnov > 0) THEN
    novedad = 'X';
    ELSE
    novedad = ' ';
    datos = :datos || :novedad;
    SELECT v.nono_dura FROM nomina_novedades v WHERE (substr(nono_fecha, 1,4) = substr(:fecliq,1,4)) AND (substr(nono_fecha, 6,7) = substr(:fecliq,6,7)) AND v.tnov_cod = 3 INTO :countnov;
    IF (:countnov > 0) THEN
    BEGIN
    novedad = :countnov;
    END
    ELSE
    BEGIN
    countnov = 0;
    END
    EXECUTE PROCEDURE CEROS_ANCHO_FIJO (:countnov, 2, 'N') RETURNING_VALUES (:incap);
    datos = :datos || :incap;
    SELECT a.admi_codafp FROM ADMINISTRADORA A, EMPLEADOS E WHERE E.empl_afp = A.terc_nit AND E.terc_nit = :nitempl INTO :codadmin;
    IF (:codadmin IS NULL) THEN
    codadmin = ' ';
    EXECUTE PROCEDURE CEROS_ANCHO_FIJO (:codadmin, 6, 'A') RETURNING_VALUES (:codadmin);
    datos = :datos || :codadmin;
    codadmin = '';
    SELECT A.admi_codafp FROM nomina_novedades v, EMPLEADOS E, ADMINISTRADORA A WHERE (substr(nono_fecha, 1,4) = substr(:fecliq,1,4)) AND (substr(nono_fecha, 6,7) = substr(:fecliq,6,7)) AND v.tnov_cod = 5 AND V.nono_tipoadm = 'A' AND V.nono_nvaadm = A.terc_nit INTO :codadmin;
    IF (:codadmin IS NULL) THEN
    codadmin = ' ';
    EXECUTE PROCEDURE CEROS_ANCHO_FIJO (:codadmin, 6, 'A') RETURNING_VALUES (:codadmin);
    datos = :datos || :codadmin;
    codadmin = '';
    SELECT a.admi_codeps FROM ADMINISTRADORA A, EMPLEADOS E WHERE E.empl_eps = A.terc_nit AND E.terc_nit = :nitempl INTO :codadmin;
    IF (:codadmin IS NULL) THEN
    codadmin = ' ';
    EXECUTE PROCEDURE CEROS_ANCHO_FIJO (:codadmin, 6, 'A') RETURNING_VALUES (:codadmin);
    datos = :datos || :codadmin;
    codadmin = '';
    SELECT A.admi_codeps FROM nomina_novedades v, EMPLEADOS E, ADMINISTRADORA A WHERE (substr(nono_fecha, 1,4) = substr(:fecliq,1,4)) AND (substr(nono_fecha, 6,7) = substr(:fecliq,6,7)) AND v.tnov_cod = 5 AND V.nono_tipoadm = 'E' AND V.nono_nvaadm = A.terc_nit INTO :codadmin;
    IF (:codadmin IS NULL) THEN
    codadmin = ' ';
    SELECT A.admi_codeps FROM nomina_novedades v, EMPLEADOS E, ADMINISTRADORA A WHERE (substr(nono_fecha, 1,4) = substr(:fecliq,1,4)) AND (substr(nono_fecha, 6,7) = substr(:fecliq,6,7)) AND v.tnov_cod = 5 AND V.nono_tipoadm = 'E' AND V.nono_nvaadm = A.terc_nit INTO :codadmin;
    IF (:codadmin IS NULL) THEN
    codadmin = ' ';
    EXECUTE PROCEDURE CEROS_ANCHO_FIJO (:codadmin, 6, 'A') RETURNING_VALUES (:codadmin);
    datos = :datos || :codadmin;
    codadmin = '';
    SELECT A.admi_codeps FROM nomina_novedades v, EMPLEADOS E, ADMINISTRADORA A WHERE (substr(nono_fecha, 1,4) = substr(:fecliq,1,4)) AND (substr(nono_fecha, 6,7) = substr(:fecliq,6,7)) AND v.tnov_cod = 5 AND V.nono_tipoadm = 'E' AND V.nono_nvaadm = A.terc_nit INTO :codadmin;
    IF (:codadmin IS NULL) THEN
    codadmin = ' ';
    EXECUTE PROCEDURE CEROS_ANCHO_FIJO (:codadmin, 6, 'A') RETURNING_VALUES (:codadmin);
    datos = :datos || :codadmin;
    codadmin = '';
/*    SELECT A.admi_ccf FROM EMPLEADOS E, ADMINISTRADORA A WHERE A.terc_nit = E.terc_nit AND E.terc_nit = :nitempl INTO :codadmin;
    EXECUTE PROCEDURE CEROS_ANCHO_FIJO (:codadmin, 6, 'A') RETURNING_VALUES (:codadmin);
    datos = :datos || :codadmin;
    codadmin = '';*/
    fecanomes = substr(:fecliq,1,4) || '-' || substr(:fecliq,5,6);
    SELECT SUM(ND.node_diaslab) FROM NOMINA N, NOMINA_DETALLE ND WHERE SUBSTR(N.nomi_feccausa, 1,7) = :fecanomes AND N.nomi_id = ND.nomi_id AND ND.terc_nit = :nitempl INTO :diaslab;
    IF (:diaslab IS NULL) THEN
    diaslab = '00';
    EXECUTE PROCEDURE CEROS_ANCHO_FIJO (:diaslab, 2, 'N') RETURNING_VALUES (:diaslab);
    Datos = :datos || :diaslab;
    SELECT SUM(ND.node_diaslab) FROM NOMINA N, NOMINA_DETALLE ND WHERE SUBSTR(N.nomi_feccausa, 1,7) = :fecanomes AND N.nomi_id = ND.nomi_id AND ND.terc_nit = :nitempl INTO :diaslab;
    IF (:diaslab IS NULL) THEN
    diaslab = '00';
    EXECUTE PROCEDURE CEROS_ANCHO_FIJO (:diaslab, 2, 'N') RETURNING_VALUES (:diaslab);
    Datos = :datos || :diaslab;
    SELECT SUM(ND.node_diaslab) FROM NOMINA N, NOMINA_DETALLE ND WHERE SUBSTR(N.nomi_feccausa, 1,7) = :fecanomes AND N.nomi_id = ND.nomi_id AND ND.terc_nit = :nitempl INTO :diaslab;
    IF (:diaslab IS NULL) THEN
    diaslab = '00';
    EXECUTE PROCEDURE CEROS_ANCHO_FIJO (:diaslab, 2, 'N') RETURNING_VALUES (:diaslab);
    Datos = :datos || :diaslab;
    SELECT e.empl_salario FROM empleados e WHERE e.terc_nit = :nitempl INTO :salbasic;
    IF (:salbasic IS NULL) THEN
    salbasic = '0';
    salbasic = substr(salbasic,1,strlen(salbasic)-3);
    EXECUTE PROCEDURE CEROS_ANCHO_FIJO (:salbasic, 9, 'N') RETURNING_VALUES (:salbasic);
    Datos = :datos || :salbasic;
    SELECT e.empl_salario FROM empleados e WHERE e.terc_nit = :nitempl INTO :salbasic;
    IF (:salbasic IS NULL) THEN
    salbasic = '0';
    execute procedure redondee (salbasic,1000)returning_values(salbasic);
    salbasic = substr(salbasic,1,strlen(salbasic)-5);
    EXECUTE PROCEDURE CEROS_ANCHO_FIJO (:salbasic, 9, 'N') RETURNING_VALUES (:salbasic);
    Datos = :datos || :salbasic;
    Datos = :datos || :salbasic;
    Datos = :datos || :salbasic;
    Datos = :datos || :salbasic;
    Datos = :datos || :salbasic;
    datos = :datos || '0.15';
    SUSPEND;
    datos = '';
    END
END
^

SET TERM ; ^


UPDATE REVISION SET REVI_NOMINA = '2010/02/23' ;
COMMIT WORK;






ALTER TABLE CONCEPTOS_NOMINA DROP CONC_ORDEN;

ALTER TABLE CONCEPTOS_NOMINA
ADD CONC_ORDEN INTEGER;


CREATE TABLE PAGO_APORTES_EMPLEADOS (
    PGAP_ID   INTEGER NOT NULL,
    TERC_NIT  NIT NOT NULL,
    PGAE_IBC  MONTO
);

ALTER TABLE PAGO_APORTES_EMPLEADOS ADD CONSTRAINT PK_PAGO_APORTES_EMPLEADOS PRIMARY KEY (PGAP_ID, TERC_NIT);

ALTER TABLE PAGO_APORTES
ADD PGAP_IDNOMINA INTEGER;


SET TERM ^ ;

CREATE OR ALTER PROCEDURE FORM_INTEGRADO_ELECTRONICO (
    iddoc integer,
    fecliq varchar(8),
    codoper varchar(2))
returns (
    datos varchar(591))
as
declare variable tipreg varchar(2);
declare variable sec varchar(5);
declare variable nomcia varchar(200);
declare variable tipdocaport varchar(2);
declare variable nitcia varchar(16);
declare variable dvcia varchar(1);
declare variable formapresent varchar(1);
declare variable codsucur varchar(10);
declare variable nomsucur varchar(40);
declare variable codarp varchar(6);
declare variable perliq varchar(7);
declare variable perliqsalud char(7);
declare variable numform varchar(10);
declare variable numempl varchar(5);
declare variable numempladm varchar(6);
declare variable vlornomi varchar(12);
declare variable vlornomiint integer;
declare variable nitempl varchar(16);
declare variable secint integer;
declare variable tipoid varchar(2);
declare variable tipocot varchar(2);
declare variable stipocot varchar(2);
declare variable nom1 varchar(20);
declare variable nom2 varchar(30);
declare variable ape1 varchar(20);
declare variable ape2 varchar(30);
declare variable fecing date;
declare variable fecret date;
declare variable countnov integer;
declare variable novedad varchar(1);
declare variable codadmin varchar(6);
declare variable diaslab varchar(3);
declare variable salminimo varchar(22);
declare variable fecanomes char(7);
declare variable salbasic varchar(22);
declare variable incap varchar(2);
declare variable ciudad varchar(5);
declare variable porcapor varchar(7);
declare variable porcapor2 varchar(9);
declare variable cotobl varchar(9);
declare variable cotobladm varchar(10);
declare variable nitadmin varchar(16);
declare variable itemadm integer;
BEGIN
TIPREG = '01';
DATOS = :tipreg;
DATOS = :DATOS || '0';
SEC = '0001';
DATOS = :DATOS || :sec;
EXECUTE PROCEDURE LEE_CONFIGURACION ('GENERAL','GENERAL','NOMBRE COMPAÑIA') RETURNING_VALUES (:nomcia);
EXECUTE PROCEDURE CEROS_ANCHO_FIJO (:nomcia, 200, 'A') RETURNING_VALUES (:nomcia);
DATOS = :DATOS || :nomcia;
DATOS = :DATOS || 'NI';
EXECUTE PROCEDURE LEE_CONFIGURACION ('CONTABILIDAD','GENERAL','NIT COMPAÑIA') RETURNING_VALUES (:nitcia);
EXECUTE PROCEDURE DV (nitcia) RETURNING_VALUES (dvcia);
EXECUTE PROCEDURE CEROS_ANCHO_FIJO (:nitcia, 16, 'A') RETURNING_VALUES (:nitcia);
DATOS = :DATOS || :nitcia;
DATOS = :DATOS || :dvcia;
FORMAPRESENT = 'E';
DATOS = :DATOS || :formapresent;
DATOS = :DATOS || '0000000000';
DATOS = :DATOS || '          ';
DATOS = :DATOS || 'U';
codsucur = '';
EXECUTE PROCEDURE CEROS_ANCHO_FIJO (:codsucur, 10, 'A') RETURNING_VALUES (:codsucur);
DATOS = :DATOS || :codsucur;
nomsucur = '';
EXECUTE PROCEDURE CEROS_ANCHO_FIJO (:nomsucur, 40, 'A') RETURNING_VALUES (:nomsucur);
DATOS = :DATOS || :nomsucur;
SELECT ADMI_CODARP FROM ADMINISTRADORA A, PARAMETROS_ANO P WHERE P.paan_nitarp = A.terc_nit AND P.paan_ano = substr(:fecliq,1,4) INTO :codarp;
EXECUTE PROCEDURE CEROS_ANCHO_FIJO (:codarp, 6, 'A') RETURNING_VALUES (:codarp);
DATOS = :DATOS || :codarp;
SELECT SUBSTRING(P.pgap_fecha FROM 1 FOR 7) FROM PAGO_APORTES P WHERE P.pgap_id = :iddoc AND p.pgap_item = 1 INTO :perliq;
perliq = substr(perliq, 1,4) || '-' ||substr(perliq, 6,8);
DATOS = :DATOS || :perliq;
perliqsalud = :perliq;
DATOS = :DATOS || :perliqsalud;
SELECT pgap_formulario FROM PAGO_APORTES WHERE PGAP_ID = :iddoc AND pgap_item = 1 INTO :numform;
EXECUTE PROCEDURE CEROS_ANCHO_FIJO (:numform, 10, 'A') RETURNING_VALUES (:numform);
DATOS = :DATOS || :numform;
DATOS = :DATOS || '          ';
SELECT COUNT(E.pgap_id) FROM PAGO_APORTES_EMPLEADOS E WHERE E.pgap_id = :iddoc INTO :numempl;
EXECUTE PROCEDURE CEROS_ANCHO_FIJO (:numempl, 5, 'N') RETURNING_VALUES (:numempl);
DATOS = :DATOS || :numempl;
SELECT CAST(SUM(pade_ibc) AS INTEGER) FROM PAGO_APORTES_DETALLE WHERE PGAP_ID = :iddoc INTO :vlornomiint;
/*vlornomiint = CAST(:vlornomi AS INTEGER);
*/vlornomi = CAST(vlornomiint AS VARCHAR(12));
EXECUTE PROCEDURE CEROS_ANCHO_FIJO (:vlornomi, 12, 'N') RETURNING_VALUES (:vlornomi);
DATOS = :DATOS || :vlornomi;
DATOS = :DATOS || '1';
codoper = '0';
EXECUTE PROCEDURE CEROS_ANCHO_FIJO (:codoper, 2, 'N') RETURNING_VALUES (:codoper);
DATOS = :DATOS || :codoper;
SUSPEND;
datos = '';
secint = 0;
FOR SELECT e.terc_nit, T.terc_tipoid,t.ciud_cod , E.tcot_cod,E.stco_cod, T.terc_nombre1, T.terc_nombre2, T.terc_apellido1, T.terc_apellido2, E.empl_fecing, e.empl_fecret FROM empleados e, TERCEROS T
WHERE (e.empl_fecret > substr(:fecliq,1,4) || '/' || substr(:fecliq,5,6) || '/' || substr(:fecliq,7,8) OR (e.empl_fecret IS NULL))  AND e.empl_fecing < substr(:fecliq,1,4) || '/' || substr(:fecliq,5,6) || '/' || substr(:fecliq,7,8) AND T.terc_nit = E.terc_nit
AND E.terc_nit IN (SELECT PA.terc_nit FROM PAGO_APORTES_DETALLE PA WHERE PA.pgap_id = :iddoc)
INTO :nitempl, :tipoid, :ciudad,:tipocot,:stipocot, :nom1, :nom2, :ape1, :ape2, :fecing, :fecret
DO
 BEGIN
    tipreg  = '02';
    DATOS = :datos || tipreg;
    secint = secint + 1;
    EXECUTE PROCEDURE CEROS_ANCHO_FIJO (CAST(secint AS VARCHAR(200)), 5, 'N') RETURNING_VALUES (:sec);
    DATOS = DATOS || :SEC;
    IF (:tipoid = 'N') THEN
    tipoid = 'NI';
    IF (:tipoid = 'C') THEN
    tipoid = 'CC';
    IF (:tipoid = 'E') THEN
    tipoid = 'CE';
    IF (:tipoid = 'T') THEN
    tipoid = 'TI';
    IF (:tipoid = 'R') THEN
    tipoid = 'RC';
    IF (:tipoid = 'P') THEN
    tipoid = 'PA';
    IF (:tipoid = 'J') THEN
    tipoid = 'CC';
    DATOS = DATOS || tipoid;
    EXECUTE PROCEDURE CEROS_ANCHO_FIJO (:nitempl, 16, 'A') RETURNING_VALUES (:nitempl);
    DATOS = DATOS || :nitempl;
    EXECUTE PROCEDURE CEROS_ANCHO_FIJO (:tipocot, 2, 'N') RETURNING_VALUES (:tipocot);
    datos = datos || :tipocot;
    EXECUTE PROCEDURE CEROS_ANCHO_FIJO (:stipocot, 2, 'N') RETURNING_VALUES (:stipocot);
    datos = datos || :stipocot;
    datos = datos || ' ';
    datos = datos || ' ';
    datos = datos || substr(:ciudad,1,2);
    datos = datos || substr(:ciudad,3,6);
    EXECUTE PROCEDURE CEROS_ANCHO_FIJO (:ape1, 20, 'A') RETURNING_VALUES (:ape1);
    IF (ape1 IS NULL) THEN
    ape1 = '';
    DATOS = DATOS || :ape1;
    EXECUTE PROCEDURE CEROS_ANCHO_FIJO (:ape2, 30, 'A') RETURNING_VALUES (:ape2);
    IF (ape2 IS NULL) THEN
    ape2 = '';
    DATOS = DATOS || :ape2;
    EXECUTE PROCEDURE CEROS_ANCHO_FIJO (:nom1, 20, 'A') RETURNING_VALUES (:nom1);
    IF (nom1 IS NULL) THEN
    nom1 = '';
    DATOS = DATOS || :nom1;
    EXECUTE PROCEDURE CEROS_ANCHO_FIJO (:nom2, 30, 'A') RETURNING_VALUES (:nom2);
    IF (nom2 IS NULL) THEN
    nom2 = '';
    DATOS = DATOS || :nom2;
    novedad = null;
    IF ((substr(:fecing,6,7) = substr(:fecliq,5,6)) AND (substr(:fecing,1,4) = substr(:fecliq,1,4))) THEN
    novedad = 'X';
    ELSE
    novedad = ' ';
    datos = :datos || :novedad;
    novedad = null;
    IF (:fecret IS NOT NULL AND (substr(:fecret,6,7) = substr(:fecliq,5,6))) THEN
    novedad = 'X';
    ELSE
    novedad = ' ';
    datos = :datos || :novedad;
    novedad = null;
    SELECT COUNT(*) FROM nomina_novedades v WHERE (substr(nono_fecha, 1,4) = substr(:fecliq,1,4)) AND (substr(nono_fecha, 6,7) = substr(:fecliq,6,7)) AND v.tnov_cod = 5 AND V.nono_tipoadm = 'E' AND V.terc_nit = :nitempl INTO :countnov;
    IF (:countnov > 0) THEN
    novedad = 'X';
    ELSE
    novedad = ' ';
    datos = :datos || :novedad;
    novedad = null;
   SELECT COUNT(*) FROM nomina_novedades v WHERE (substr(nono_fecha, 1,4) = substr(:fecliq,1,4)) AND (substr(nono_fecha, 6,7) = substr(:fecliq,6,7)) AND v.tnov_cod = 5 AND V.nono_tipoadm = 'E' AND V.terc_nit = :nitempl INTO :countnov;
    IF (:countnov > 0) THEN
    novedad = 'X';
    ELSE
    novedad = ' ';
    datos = :datos || :novedad;
    novedad = null;
    SELECT COUNT(*) FROM nomina_novedades v WHERE (substr(nono_fecha, 1,4) = substr(:fecliq,1,4)) AND (substr(nono_fecha, 6,7) = substr(:fecliq,6,7)) AND v.tnov_cod = 5 AND V.nono_tipoadm = 'A' AND V.terc_nit = :nitempl INTO :countnov;
    IF (:countnov > 0) THEN
    novedad = 'X';
    ELSE
    novedad = ' ';
    datos = :datos || :novedad;    
    novedad = null;
    SELECT COUNT(*) FROM nomina_novedades v WHERE (substr(nono_fecha, 1,4) = substr(:fecliq,1,4)) AND (substr(nono_fecha, 6,7) = substr(:fecliq,6,7)) AND v.tnov_cod = 5 AND V.nono_tipoadm = 'A' AND V.terc_nit = :nitempl INTO :countnov;
    IF (:countnov > 0) THEN
    novedad = 'X';
    ELSE
    novedad = ' ';
    datos = :datos || :novedad;
    novedad = null;
    SELECT COUNT(*) FROM nomina_novedades v WHERE (substr(nono_fecha, 1,4) = substr(:fecliq,1,4)) AND (substr(nono_fecha, 6,7) = substr(:fecliq,6,7)) AND v.tnov_cod = 8 AND V.nono_tipoadm = 'A' AND V.terc_nit = :nitempl INTO :countnov;
    IF (:countnov > 0) THEN
    novedad = 'X';
    ELSE
    novedad = ' ';
    datos = :datos || :novedad;
    novedad = null;
    SELECT COUNT(*) FROM nomina_novedades v WHERE (substr(nono_fecha, 1,4) = substr(:fecliq,1,4)) AND (substr(nono_fecha, 6,7) = substr(:fecliq,6,7)) AND v.tnov_cod = 10 AND V.nono_tipoadm = 'A' AND V.terc_nit = :nitempl INTO :countnov;
    IF (:countnov > 0) THEN
    novedad = 'X';
    ELSE
    novedad = ' ';
    datos = :datos || :novedad;
    novedad = null;
    SELECT COUNT(*) FROM nomina_novedades v WHERE (substr(nono_fecha, 1,4) = substr(:fecliq,1,4)) AND (substr(nono_fecha, 6,7) = substr(:fecliq,6,7)) AND v.tnov_cod = 11 AND V.terc_nit = :nitempl INTO :countnov;
    IF (:countnov > 0) THEN
    novedad = 'X';
    ELSE
    novedad = ' ';
    datos = :datos || :novedad;    
    novedad = null;
    SELECT COUNT(*) FROM nomina_novedades v WHERE (substr(nono_fecha, 1,4) = substr(:fecliq,1,4)) AND (substr(nono_fecha, 6,7) = substr(:fecliq,6,7)) AND v.tnov_cod = 9 AND V.terc_nit = :nitempl INTO :countnov;
    IF (:countnov > 0) THEN
    novedad = 'X';
    ELSE
    novedad = ' ';
    datos = :datos || :novedad;    
    novedad = null;
    SELECT COUNT(*) FROM nomina_novedades v WHERE (substr(nono_fecha, 1,4) = substr(:fecliq,1,4)) AND (substr(nono_fecha, 6,7) = substr(:fecliq,6,7)) AND v.tnov_cod = 2 AND V.terc_nit = :nitempl INTO :countnov;
    IF (:countnov > 0) THEN
    novedad = 'X';
    ELSE
    novedad = ' ';
    datos = :datos || :novedad;    
    novedad = null;
    SELECT COUNT(*) FROM nomina_novedades v WHERE (substr(nono_fecha, 1,4) = substr(:fecliq,1,4)) AND (substr(nono_fecha, 6,7) = substr(:fecliq,6,7)) AND v.tnov_cod = 4 AND V.terc_nit = :nitempl INTO :countnov;
    IF (:countnov > 0) THEN
    novedad = 'X';
    ELSE
    novedad = ' ';
    datos = :datos || :novedad;
    novedad = null;
    SELECT COUNT(*) FROM nomina_novedades v WHERE (substr(nono_fecha, 1,4) = substr(:fecliq,1,4)) AND (substr(nono_fecha, 6,7) = substr(:fecliq,6,7)) AND v.tnov_cod = 6 AND V.terc_nit = :nitempl INTO :countnov;
    IF (:countnov > 0) THEN
    novedad = 'X';
    ELSE
    novedad = ' ';
    datos = :datos || :novedad;    
    novedad = null;
    SELECT COUNT(*) FROM nomina_novedades v WHERE (substr(nono_fecha, 1,4) = substr(:fecliq,1,4)) AND (substr(nono_fecha, 6,7) = substr(:fecliq,6,7)) AND v.tnov_cod = 1 AND V.terc_nit = :nitempl INTO :countnov;
    IF (:countnov > 0) THEN
    novedad = 'X';
    ELSE
    novedad = ' ';
    datos = :datos || :novedad;    
    novedad = null;
    SELECT COUNT(*) FROM nomina_novedades v WHERE (substr(nono_fecha, 1,4) = substr(:fecliq,1,4)) AND (substr(nono_fecha, 6,7) = substr(:fecliq,6,7)) AND v.tnov_cod = 7 AND V.terc_nit = :nitempl INTO :countnov;
    IF (:countnov > 0) THEN
    novedad = 'X';
    ELSE
    novedad = ' ';
    datos = :datos || :novedad;
    SELECT v.nono_dura FROM nomina_novedades v WHERE (substr(nono_fecha, 1,4) = substr(:fecliq,1,4)) AND (substr(nono_fecha, 6,7) = substr(:fecliq,6,7)) AND v.tnov_cod = 3 AND V.terc_nit = :nitempl INTO :countnov;
    IF (:countnov > 0) THEN
    BEGIN
    novedad = :countnov;
    END
    ELSE
    BEGIN
    countnov = 0;
    END
    EXECUTE PROCEDURE CEROS_ANCHO_FIJO (:countnov, 2, 'N') RETURNING_VALUES (:incap);
    datos = :datos || :incap;
    SELECT a.admi_codafp FROM ADMINISTRADORA A, EMPLEADOS E WHERE E.empl_afp = A.terc_nit AND E.terc_nit = :nitempl INTO :codadmin;
    IF (:codadmin IS NULL) THEN
    codadmin = ' ';
    EXECUTE PROCEDURE CEROS_ANCHO_FIJO (:codadmin, 6, 'A') RETURNING_VALUES (:codadmin);
    datos = :datos || :codadmin;
    codadmin = '';
    SELECT A.admi_codafp FROM nomina_novedades v, EMPLEADOS E, ADMINISTRADORA A WHERE (substr(nono_fecha, 1,4) = substr(:fecliq,1,4)) AND (substr(nono_fecha, 6,7) = substr(:fecliq,6,7)) AND v.tnov_cod = 5 AND V.nono_tipoadm = 'A' AND V.nono_nvaadm = A.terc_nit INTO :codadmin;
    IF (:codadmin IS NULL) THEN
    codadmin = ' ';
    EXECUTE PROCEDURE CEROS_ANCHO_FIJO (:codadmin, 6, 'A') RETURNING_VALUES (:codadmin);
    datos = :datos || :codadmin;
    codadmin = '';
    SELECT a.admi_codeps FROM ADMINISTRADORA A, EMPLEADOS E WHERE E.empl_eps = A.terc_nit AND E.terc_nit = :nitempl INTO :codadmin;
    IF (:codadmin IS NULL) THEN
    codadmin = ' ';
    EXECUTE PROCEDURE CEROS_ANCHO_FIJO (:codadmin, 6, 'A') RETURNING_VALUES (:codadmin);
    datos = :datos || :codadmin;
    codadmin = '';
    SELECT A.admi_codeps FROM nomina_novedades v, EMPLEADOS E, ADMINISTRADORA A WHERE (substr(nono_fecha, 1,4) = substr(:fecliq,1,4)) AND (substr(nono_fecha, 6,7) = substr(:fecliq,6,7)) AND v.tnov_cod = 5 AND V.nono_tipoadm = 'E' AND V.nono_nvaadm = A.terc_nit INTO :codadmin;
    IF (:codadmin IS NULL) THEN
    codadmin = ' ';
    EXECUTE PROCEDURE CEROS_ANCHO_FIJO (:codadmin, 6, 'A') RETURNING_VALUES (:codadmin);
    datos = :datos || :codadmin;
    SELECT a.admi_codccf FROM ADMINISTRADORA A, EMPLEADOS E WHERE E.empl_ccf = A.terc_nit AND E.terc_nit = :nitempl INTO :codadmin;
    IF (:codadmin IS NULL) THEN
    codadmin = ' ';
    EXECUTE PROCEDURE CEROS_ANCHO_FIJO (:codadmin, 6, 'A') RETURNING_VALUES (:codadmin);
    datos = :datos || :codadmin;
    codadmin = '';
    fecanomes = substr(:fecliq,1,4) || '/' || substr(:fecliq,5,6);
    SELECT MAX(ND.node_diaslab) FROM NOMINA_DETALLE ND, PAGO_APORTES PA WHERE PA.pgap_id = :iddoc AND ND.terc_nit = :nitempl AND PA.pgap_idnomina = ND.nomi_id INTO :diaslab;
    IF (:diaslab IS NULL) THEN
    diaslab = '00';
    EXECUTE PROCEDURE CEROS_ANCHO_FIJO (:diaslab, 2, 'N') RETURNING_VALUES (:diaslab);
    Datos = :datos || :diaslab;
    SELECT MAX(ND.node_diaslab) FROM NOMINA_DETALLE ND, PAGO_APORTES PA WHERE PA.pgap_id = :iddoc AND ND.terc_nit = :nitempl AND PA.pgap_idnomina = ND.nomi_id INTO :diaslab;
    IF (:diaslab IS NULL) THEN
    diaslab = '00';
    EXECUTE PROCEDURE CEROS_ANCHO_FIJO (:diaslab, 2, 'N') RETURNING_VALUES (:diaslab);
    Datos = :datos || :diaslab;
    SELECT MAX(ND.node_diaslab) FROM NOMINA_DETALLE ND, PAGO_APORTES PA WHERE PA.pgap_id = :iddoc AND ND.terc_nit = :nitempl AND PA.pgap_idnomina = ND.nomi_id INTO :diaslab;
    IF (:diaslab IS NULL) THEN
    diaslab = '00';
    EXECUTE PROCEDURE CEROS_ANCHO_FIJO (:diaslab, 2, 'N') RETURNING_VALUES (:diaslab);
    Datos = :datos || :diaslab;
    SELECT MAX(ND.node_diaslab) FROM NOMINA_DETALLE ND, PAGO_APORTES PA WHERE PA.pgap_id = :iddoc AND ND.terc_nit = :nitempl AND PA.pgap_idnomina = ND.nomi_id INTO :diaslab;
    IF (:diaslab IS NULL) THEN
    diaslab = '00';
    EXECUTE PROCEDURE CEROS_ANCHO_FIJO (:diaslab, 2, 'N') RETURNING_VALUES (:diaslab);
    Datos = :datos || :diaslab;
    SELECT e.empl_salario FROM empleados e WHERE e.terc_nit = :nitempl INTO :salbasic;
    IF (:salbasic IS NULL) THEN
    salbasic = '0';
    salbasic = substr(salbasic,1,strlen(salbasic)-3);
    EXECUTE PROCEDURE CEROS_ANCHO_FIJO (:salbasic, 9, 'N') RETURNING_VALUES (:salbasic);
    Datos = :datos || :salbasic;
    Datos = :datos || ' ';
    SELECT e.pgae_ibc FROM pago_aportes_empleados e WHERE e.terc_nit = :nitempl and e.pgap_id = :iddoc INTO :salbasic;
    IF (:salbasic IS NULL) THEN
    salbasic = '0';
    execute procedure redondee (salbasic,1000)returning_values(salbasic);
    salbasic = substr(salbasic,1,strlen(salbasic)-5);
    EXECUTE PROCEDURE CEROS_ANCHO_FIJO (:salbasic, 9, 'N') RETURNING_VALUES (:salbasic);
    Datos = :datos || :salbasic;
    Datos = :datos || :salbasic;
    Datos = :datos || :salbasic;
    Datos = :datos || :salbasic;
    select P.paan_afptr + P.paan_afpem from PARAMETROS_ANO P WHERE P.paan_ano = substr(:fecliq,1,4) INTO :porcapor;
    porcapor = substr(porcapor,1,strlen(porcapor)-2);
    EXECUTE PROCEDURE CEROS_ANCHO_FIJO (:porcapor, 7, 'N') RETURNING_VALUES (:porcapor);
    Datos = :datos || :porcapor;
    select P.pade_cotobl from pago_aportes_detalle P WHERE P.terc_nit = :nitempl AND P.pade_tipap = 'AFP' and p.pgap_id = :iddoc INTO :cotobl;
    cotobl = substr(cotobl,1,strlen(cotobl)-3);
    EXECUTE PROCEDURE CEROS_ANCHO_FIJO (:cotobl, 9, 'N') RETURNING_VALUES (:cotobl);
    Datos = :datos || :cotobl;
    Datos = :datos || '000000000';
    Datos = :datos || '000000000';
    Datos = :datos || '000000000';
    Datos = :datos || '000000000';
    Datos = :datos || '000000000';
    Datos = :datos || '000000000';
    select P.paan_epstr + P.paan_epsem from PARAMETROS_ANO P WHERE P.paan_ano = substr(:fecliq,1,4) INTO :porcapor;
    porcapor = substr(porcapor,1,strlen(porcapor)-2);
    EXECUTE PROCEDURE CEROS_ANCHO_FIJO (:porcapor, 7, 'N') RETURNING_VALUES (:porcapor);
    Datos = :datos || :porcapor;
    select P.pade_cotobl from pago_aportes_detalle P WHERE P.terc_nit = :nitempl AND P.pade_tipap = 'EPS' and p.pgap_id = :iddoc INTO :cotobl;
    cotobl = substr(cotobl,1,strlen(cotobl)-3);
    EXECUTE PROCEDURE CEROS_ANCHO_FIJO (:cotobl, 9, 'N') RETURNING_VALUES (:cotobl);
    Datos = :datos || :cotobl;
    Datos = :datos || '000000000';
    Datos = :datos || '               ';
    Datos = :datos || '000000000';
    Datos = :datos || '               ';
    Datos = :datos || '000000000';
    porcapor2 = '0.25';
    EXECUTE PROCEDURE CEROS_ANCHO_FIJO (:porcapor2, 9, 'N') RETURNING_VALUES (:porcapor2);
    Datos = :datos || :porcapor2;
    Datos = :datos || '000000000';
    select P.pade_cotobl from pago_aportes_detalle P WHERE P.terc_nit = :nitempl AND P.pade_tipap = 'ARP' and p.pgap_id = :iddoc INTO :cotobl;
    cotobl = substr(cotobl,1,strlen(cotobl)-3);
    EXECUTE PROCEDURE CEROS_ANCHO_FIJO (:cotobl, 9, 'N') RETURNING_VALUES (:cotobl);
    Datos = :datos || :cotobl;
    select P.paan_ccf from PARAMETROS_ANO P WHERE P.paan_ano = substr(:fecliq,1,4) INTO :porcapor;
    porcapor = substr(porcapor,1,strlen(porcapor)-2);
    EXECUTE PROCEDURE CEROS_ANCHO_FIJO (:porcapor, 7, 'N') RETURNING_VALUES (:porcapor);
    Datos = :datos || :porcapor;
    select (P.pade_cotobl)*4/9 from pago_aportes_detalle P WHERE P.terc_nit = :nitempl AND P.pade_tipap = 'CCF' and p.pgap_id = :iddoc INTO :cotobl;
    cotobl = substr(cotobl,1,strlen(cotobl)-3);
    EXECUTE PROCEDURE CEROS_ANCHO_FIJO (:cotobl, 9, 'N') RETURNING_VALUES (:cotobl);
    Datos = :datos || :cotobl;
    select P.paan_sena from PARAMETROS_ANO P WHERE P.paan_ano = substr(:fecliq,1,4) INTO :porcapor;
    porcapor = substr(porcapor,1,strlen(porcapor)-2);
    EXECUTE PROCEDURE CEROS_ANCHO_FIJO (:porcapor, 7, 'N') RETURNING_VALUES (:porcapor);
    Datos = :datos || :porcapor;
    select (P.pade_cotobl)*2/9 from pago_aportes_detalle P WHERE P.terc_nit = :nitempl AND P.pade_tipap = 'CCF' and p.pgap_id = :iddoc INTO :cotobl;
    cotobl = substr(cotobl,1,strlen(cotobl)-3);
    EXECUTE PROCEDURE CEROS_ANCHO_FIJO (:cotobl, 9, 'N') RETURNING_VALUES (:cotobl);
    Datos = :datos || :cotobl;
    select P.paan_icbf from PARAMETROS_ANO P WHERE P.paan_ano = substr(:fecliq,1,4) INTO :porcapor;
    porcapor = substr(porcapor,1,strlen(porcapor)-2);
    EXECUTE PROCEDURE CEROS_ANCHO_FIJO (:porcapor, 7, 'N') RETURNING_VALUES (:porcapor);
    Datos = :datos || :porcapor;
    select (P.pade_cotobl)*3/9 from pago_aportes_detalle P WHERE P.terc_nit = :nitempl AND P.pade_tipap = 'CCF' and p.pgap_id = :iddoc INTO :cotobl;
    cotobl = substr(cotobl,1,strlen(cotobl)-3);
    EXECUTE PROCEDURE CEROS_ANCHO_FIJO (:cotobl, 9, 'N') RETURNING_VALUES (:cotobl);
    Datos = :datos || :cotobl;
    Datos = :datos || '0000000';
    Datos = :datos || '000000000';
    Datos = :datos || '0000000';
    Datos = :datos || '000000000';
    SUSPEND;
    datos = '';
    cotobl = 0;
    END
datos = '';
secint = 0;
FOR SELECT a.admi_codafp, a.terc_nit,p.pgap_monto,p.pgap_item FROM administradora a, pago_aportes p
WHERE (p.pgap_admin = a.terc_nit) and p.pgap_id = :iddoc and a.admi_afp = 'S'
INTO :codadmin, :nitadmin, :cotobladm, :itemadm
DO
 BEGIN
  tipreg = '03';
  Datos = :datos || :tipreg;
  secint = secint + 1;
  EXECUTE PROCEDURE CEROS_ANCHO_FIJO (CAST(secint AS VARCHAR(200)), 5, 'N') RETURNING_VALUES (:sec);
  DATOS = DATOS || :SEC;
  EXECUTE PROCEDURE CEROS_ANCHO_FIJO (codadmin, 6, 'A') RETURNING_VALUES (:codadmin);
  DATOS = DATOS || :codadmin;
  EXECUTE PROCEDURE DV (nitadmin) RETURNING_VALUES (dvcia);
  EXECUTE PROCEDURE CEROS_ANCHO_FIJO (nitadmin, 16, 'A') RETURNING_VALUES (:nitadmin);
  DATOS = DATOS || :nitadmin;
  DATOS = :DATOS || :dvcia;
  SELECT sum(P.pade_cotobl) FROM PAGO_APORTES_DETALLE P WHERE P.pade_itemdet = :itemadm and p.pade_tipap = 'AFP' and p.pgap_id = :iddoc INTO :cotobladm;
  cotobladm = substr(cotobladm,1,strlen(cotobladm)-3);
  EXECUTE PROCEDURE CEROS_ANCHO_FIJO (cotobladm, 10, 'N') RETURNING_VALUES (:cotobladm);
  DATOS = DATOS || :cotobladm;
  DATOS = DATOS || '00000000000000000000000000000000000000000000000000000000000000000000000000';
  EXECUTE PROCEDURE CEROS_ANCHO_FIJO (cotobladm, 10, 'N') RETURNING_VALUES (:cotobladm);
  DATOS = DATOS || :cotobladm;
  SELECT COUNT(P.pgap_item) FROM PAGO_APORTES_DETALLE P WHERE P.pade_itemdet = :itemadm and p.pade_tipap = 'AFP' and p.pgap_id = :iddoc INTO :numempladm;
  EXECUTE PROCEDURE CEROS_ANCHO_FIJO (numempladm, 6, 'N') RETURNING_VALUES (:numempladm);
  DATOS = DATOS || :numempladm;
  if (cotobladm <> '0000000000') then
  suspend;
  datos = '';
 END
secint = 0;
FOR SELECT a.admi_codeps, a.terc_nit,p.pgap_item FROM administradora a, pago_aportes p
WHERE (p.pgap_admin = a.terc_nit) and p.pgap_id = :iddoc and a.admi_eps = 'S'
INTO :codadmin, :nitadmin, :itemadm
DO
 BEGIN
  tipreg = '04';
  Datos = :datos || :tipreg;
  secint = secint + 1;
  EXECUTE PROCEDURE CEROS_ANCHO_FIJO (CAST(secint AS VARCHAR(200)), 5, 'N') RETURNING_VALUES (:sec);
  DATOS = DATOS || :SEC;
  EXECUTE PROCEDURE CEROS_ANCHO_FIJO (codadmin, 6, 'A') RETURNING_VALUES (:codadmin);
  DATOS = DATOS || :codadmin;
  EXECUTE PROCEDURE DV (nitadmin) RETURNING_VALUES (dvcia);
  EXECUTE PROCEDURE CEROS_ANCHO_FIJO (nitadmin, 16, 'A') RETURNING_VALUES (:nitadmin);
  DATOS = DATOS || :nitadmin;
  DATOS = :DATOS || :dvcia;
  SELECT sum(P.pade_cotobl) FROM PAGO_APORTES_DETALLE P WHERE P.pade_itemdet = :itemadm and p.pade_tipap = 'EPS' and p.pgap_id = :iddoc INTO :cotobladm;
  cotobladm = substr(cotobladm,1,strlen(cotobladm)-3);
  EXECUTE PROCEDURE CEROS_ANCHO_FIJO (cotobladm, 10, 'N') RETURNING_VALUES (:cotobladm);
  DATOS = DATOS || :cotobladm;
  DATOS = DATOS || '0000000000               0000000000               0000000000';
  EXECUTE PROCEDURE CEROS_ANCHO_FIJO (cotobladm, 10, 'N') RETURNING_VALUES (:cotobladm);
  DATOS = DATOS || :cotobladm;
  DATOS = DATOS || '000000000000000000000000';
  EXECUTE PROCEDURE CEROS_ANCHO_FIJO (cotobladm, 10, 'N') RETURNING_VALUES (:cotobladm);
  DATOS = DATOS || :cotobladm;
  DATOS = DATOS || '0000000000000000000000000000000000000000';
  EXECUTE PROCEDURE CEROS_ANCHO_FIJO (cotobladm, 10, 'N') RETURNING_VALUES (:cotobladm);
  DATOS = DATOS || :cotobladm;
  DATOS = DATOS || '0000000000';
  EXECUTE PROCEDURE CEROS_ANCHO_FIJO (cotobladm, 10, 'N') RETURNING_VALUES (:cotobladm);
  DATOS = DATOS || :cotobladm;
  DATOS = DATOS || '0000000000';
  SELECT COUNT(P.pgap_item) FROM PAGO_APORTES_DETALLE P WHERE P.pade_itemdet = :itemadm and p.pade_tipap = 'EPS' and p.pgap_id = :iddoc INTO :numempladm;
  EXECUTE PROCEDURE CEROS_ANCHO_FIJO (numempladm, 6, 'N') RETURNING_VALUES (:numempladm);
  DATOS = DATOS || :numempladm;
  if (cotobladm <> '0000000000') then
  suspend;
  datos = '';
 END
secint = 0;
FOR SELECT a.admi_codarp, a.terc_nit,p.pgap_item FROM administradora a, pago_aportes p
WHERE (p.pgap_admin = a.terc_nit) and p.pgap_id = :iddoc and a.admi_arp = 'S'
INTO :codadmin, :nitadmin, :itemadm
DO
 BEGIN
  tipreg = '05';
  Datos = :datos || :tipreg;
  secint = secint + 1;
  EXECUTE PROCEDURE CEROS_ANCHO_FIJO (CAST(secint AS VARCHAR(200)), 5, 'N') RETURNING_VALUES (:sec);
  DATOS = DATOS || :SEC;
  EXECUTE PROCEDURE CEROS_ANCHO_FIJO (codadmin, 6, 'A') RETURNING_VALUES (:codadmin);
  DATOS = DATOS || :codadmin;
  EXECUTE PROCEDURE DV (nitadmin) RETURNING_VALUES (dvcia);
  EXECUTE PROCEDURE CEROS_ANCHO_FIJO (nitadmin, 16, 'A') RETURNING_VALUES (:nitadmin);
  DATOS = DATOS || :nitadmin;
  DATOS = :DATOS || :dvcia;
  SELECT sum(P.pade_cotobl) FROM PAGO_APORTES_DETALLE P WHERE P.pgap_item = :itemadm and p.pade_tipap = 'ARP' and p.pgap_id = :iddoc INTO :cotobladm;
  cotobladm = substr(cotobladm,1,strlen(cotobladm)-3);
  EXECUTE PROCEDURE CEROS_ANCHO_FIJO (cotobladm, 10, 'N') RETURNING_VALUES (:cotobladm);
  DATOS = DATOS || :cotobladm;
  DATOS = DATOS || '               00000000000000000000';
  EXECUTE PROCEDURE CEROS_ANCHO_FIJO (cotobladm, 10, 'N') RETURNING_VALUES (:cotobladm);
  DATOS = DATOS || :cotobladm;
  DATOS = DATOS || '00000000000000';
  EXECUTE PROCEDURE CEROS_ANCHO_FIJO (cotobladm, 10, 'N') RETURNING_VALUES (:cotobladm);
  DATOS = DATOS || :cotobladm;
  DATOS = DATOS || '00000000000000000000';
  EXECUTE PROCEDURE CEROS_ANCHO_FIJO (cotobladm, 10, 'N') RETURNING_VALUES (:cotobladm);
  DATOS = DATOS || :cotobladm;
  SELECT sum(P.pade_cotobl)/100 FROM PAGO_APORTES_DETALLE P WHERE P.pgap_item = :itemadm and p.pade_tipap = 'ARP' and p.pgap_id = :iddoc INTO :cotobladm;
  cotobladm = substr(cotobladm,1,strlen(cotobladm)-3);
  EXECUTE PROCEDURE CEROS_ANCHO_FIJO (cotobladm, 10, 'N') RETURNING_VALUES (:cotobladm);
  DATOS = DATOS || :cotobladm;
  SELECT COUNT(P.pgap_item) FROM PAGO_APORTES_DETALLE P WHERE P.pgap_item = :itemadm and p.pade_tipap = 'ARP' and p.pgap_id = :iddoc INTO :numempladm;
  EXECUTE PROCEDURE CEROS_ANCHO_FIJO (numempladm, 6, 'N') RETURNING_VALUES (:numempladm);
  DATOS = DATOS || :numempladm;
  if (cotobladm <> '0000000000') then
  suspend;
  datos = '';
 END
secint = 0;
FOR SELECT a.admi_codccf, a.terc_nit,p.pgap_item FROM administradora a, pago_aportes p
WHERE (p.pgap_admin = a.terc_nit) and p.pgap_id = :iddoc and a.admi_ccf = 'S'
INTO :codadmin, :nitadmin, :itemadm
DO
 BEGIN
  tipreg = '06';
  Datos = :datos || :tipreg;
  secint = secint + 1;
  EXECUTE PROCEDURE CEROS_ANCHO_FIJO (CAST(secint AS VARCHAR(200)), 5, 'N') RETURNING_VALUES (:sec);
  DATOS = DATOS || :SEC;
  EXECUTE PROCEDURE CEROS_ANCHO_FIJO (codadmin, 6, 'A') RETURNING_VALUES (:codadmin);
  DATOS = DATOS || :codadmin;
  EXECUTE PROCEDURE DV (nitadmin) RETURNING_VALUES (dvcia);
  EXECUTE PROCEDURE CEROS_ANCHO_FIJO (nitadmin, 16, 'A') RETURNING_VALUES (:nitadmin);
  DATOS = DATOS || :nitadmin;
  DATOS = :DATOS || :dvcia;
  SELECT sum(P.pade_cotobl)*4/9 FROM PAGO_APORTES_DETALLE P WHERE P.pgap_item = :itemadm and p.pade_tipap = 'CCF' and p.pgap_id = :iddoc INTO :cotobladm;
  cotobladm = substr(cotobladm,1,strlen(cotobladm)-3);
  EXECUTE PROCEDURE CEROS_ANCHO_FIJO (cotobladm, 10, 'N') RETURNING_VALUES (:cotobladm);
  DATOS = DATOS || :cotobladm;
  DATOS = DATOS || '00000000000000';
  EXECUTE PROCEDURE CEROS_ANCHO_FIJO (cotobladm, 10, 'N') RETURNING_VALUES (:cotobladm);
  DATOS = DATOS || :cotobladm;
  SELECT COUNT(P.pgap_item) FROM PAGO_APORTES_DETALLE P WHERE P.pgap_item = :itemadm and p.pade_tipap = 'CCF' and p.pgap_id = :iddoc INTO :numempladm;
  EXECUTE PROCEDURE CEROS_ANCHO_FIJO (numempladm, 6, 'N') RETURNING_VALUES (:numempladm);
  DATOS = DATOS || :numempladm;
  if (cotobladm <> '0000000000') then
  suspend;
  datos = '';
 END
secint = 0;
FOR SELECT a.admi_codccf, a.terc_nit,p.pgap_item FROM administradora a, pago_aportes p
WHERE (p.pgap_admin = a.terc_nit) and p.pgap_id = :iddoc and a.admi_ccf = 'S'
INTO :codadmin, :nitadmin, :itemadm
DO
 BEGIN
  tipreg = '07';
  Datos = :datos || :tipreg;
  secint = secint + 1;
  EXECUTE PROCEDURE CEROS_ANCHO_FIJO (CAST(secint AS VARCHAR(200)), 5, 'N') RETURNING_VALUES (:sec);
  DATOS = DATOS || :SEC;
  nitadmin = '899999034';
  EXECUTE PROCEDURE DV (nitadmin) RETURNING_VALUES (dvcia);
  EXECUTE PROCEDURE CEROS_ANCHO_FIJO (nitadmin, 16, 'A') RETURNING_VALUES (:nitadmin);
  DATOS = DATOS || :nitadmin;
  DATOS = :DATOS || :dvcia;
  SELECT sum(P.pade_cotobl)*2/9 FROM PAGO_APORTES_DETALLE P WHERE P.pgap_item = :itemadm and p.pade_tipap = 'CCF' and p.pgap_id = :iddoc INTO :cotobladm;
  cotobladm = substr(cotobladm,1,strlen(cotobladm)-3);
  EXECUTE PROCEDURE CEROS_ANCHO_FIJO (cotobladm, 10, 'N') RETURNING_VALUES (:cotobladm);
  DATOS = DATOS || :cotobladm;
  DATOS = DATOS || '00000000000000';
  EXECUTE PROCEDURE CEROS_ANCHO_FIJO (cotobladm, 10, 'N') RETURNING_VALUES (:cotobladm);
  DATOS = DATOS || :cotobladm;
  SELECT COUNT(P.pgap_item) FROM PAGO_APORTES_DETALLE P WHERE P.pgap_item = :itemadm and p.pade_tipap = 'CCF' and p.pgap_id = :iddoc INTO :numempladm;
  EXECUTE PROCEDURE CEROS_ANCHO_FIJO (numempladm, 6, 'N') RETURNING_VALUES (:numempladm);
  DATOS = DATOS || :numempladm;
  if (cotobladm <> '0000000000') then
  suspend;
  datos = '';
 END
secint = 0;
FOR SELECT a.admi_codccf, a.terc_nit,p.pgap_item FROM administradora a, pago_aportes p
WHERE (p.pgap_admin = a.terc_nit) and p.pgap_id = :iddoc and a.admi_ccf = 'S'
INTO :codadmin, :nitadmin, :itemadm
DO
 BEGIN
  tipreg = '08';
  Datos = :datos || :tipreg;
  secint = secint + 1;
  EXECUTE PROCEDURE CEROS_ANCHO_FIJO (CAST(secint AS VARCHAR(200)), 5, 'N') RETURNING_VALUES (:sec);
  DATOS = DATOS || :SEC;
  nitadmin = '800213277';
  EXECUTE PROCEDURE DV (nitadmin) RETURNING_VALUES (dvcia);
  EXECUTE PROCEDURE CEROS_ANCHO_FIJO (nitadmin, 16, 'A') RETURNING_VALUES (:nitadmin);
  DATOS = DATOS || :nitadmin;
  DATOS = :DATOS || :dvcia;
  SELECT sum(P.pade_cotobl)*3/9 FROM PAGO_APORTES_DETALLE P WHERE P.pgap_item = :itemadm and p.pade_tipap = 'CCF' and p.pgap_id = :iddoc INTO :cotobladm;
  cotobladm = substr(cotobladm,1,strlen(cotobladm)-3);
  EXECUTE PROCEDURE CEROS_ANCHO_FIJO (cotobladm, 10, 'N') RETURNING_VALUES (:cotobladm);
  DATOS = DATOS || :cotobladm;
  DATOS = DATOS || '00000000000000';
  EXECUTE PROCEDURE CEROS_ANCHO_FIJO (cotobladm, 10, 'N') RETURNING_VALUES (:cotobladm);
  DATOS = DATOS || :cotobladm;
  SELECT COUNT(P.pgap_item) FROM PAGO_APORTES_DETALLE P WHERE P.pgap_item = :itemadm and p.pade_tipap = 'CCF' and p.pgap_id = :iddoc INTO :numempladm;
  EXECUTE PROCEDURE CEROS_ANCHO_FIJO (numempladm, 6, 'N') RETURNING_VALUES (:numempladm);
  DATOS = DATOS || :numempladm;
  if (cotobladm <> '0000000000') then
  suspend;
  datos = '';
 END
 BEGIN
  tipreg = '11';
  Datos = :datos || :tipreg;
  secint = secint + 1;
  SELECT sum(P.pade_cotobl) FROM PAGO_APORTES_DETALLE P WHERE p.pade_tipap = 'AFP' and p.pgap_id = :iddoc INTO :cotobladm;
  cotobladm = substr(cotobladm,1,strlen(cotobladm)-3);
  EXECUTE PROCEDURE CEROS_ANCHO_FIJO (cotobladm, 10, 'N') RETURNING_VALUES (:cotobladm);
  DATOS = DATOS || :cotobladm;
  SELECT sum(P.pade_cotobl) FROM PAGO_APORTES_DETALLE P WHERE p.pade_tipap = 'EPS' and p.pgap_id = :iddoc INTO :cotobladm;
  cotobladm = substr(cotobladm,1,strlen(cotobladm)-3);
  EXECUTE PROCEDURE CEROS_ANCHO_FIJO (cotobladm, 10, 'N') RETURNING_VALUES (:cotobladm);
  DATOS = DATOS || :cotobladm;
  SELECT sum(P.pade_cotobl) FROM PAGO_APORTES_DETALLE P WHERE p.pade_tipap = 'ARP' and p.pgap_id = :iddoc INTO :cotobladm;
  cotobladm = substr(cotobladm,1,strlen(cotobladm)-3);
  EXECUTE PROCEDURE CEROS_ANCHO_FIJO (cotobladm, 10, 'N') RETURNING_VALUES (:cotobladm);
  DATOS = DATOS || :cotobladm;
  SELECT sum(P.pade_cotobl) FROM PAGO_APORTES_DETALLE P WHERE p.pade_tipap = 'AFP' and p.pgap_id = :iddoc INTO :cotobladm;
  cotobladm = substr(cotobladm,1,strlen(cotobladm)-3);
  EXECUTE PROCEDURE CEROS_ANCHO_FIJO (cotobladm, 10, 'N') RETURNING_VALUES (:cotobladm);
  DATOS = DATOS || :cotobladm;
  SELECT sum(P.pade_cotobl)*4/9 FROM PAGO_APORTES_DETALLE P WHERE p.pade_tipap = 'CCF' and p.pgap_id = :iddoc INTO :cotobladm;
  cotobladm = substr(cotobladm,1,strlen(cotobladm)-3);
  EXECUTE PROCEDURE CEROS_ANCHO_FIJO (cotobladm, 10, 'N') RETURNING_VALUES (:cotobladm);
  DATOS = DATOS || :cotobladm;
  SELECT sum(P.pade_cotobl)*2/9 FROM PAGO_APORTES_DETALLE P WHERE p.pade_tipap = 'CCF' and p.pgap_id = :iddoc INTO :cotobladm;
  cotobladm = substr(cotobladm,1,strlen(cotobladm)-3);
  EXECUTE PROCEDURE CEROS_ANCHO_FIJO (cotobladm, 10, 'N') RETURNING_VALUES (:cotobladm);
  DATOS = DATOS || :cotobladm;
  SELECT sum(P.pade_cotobl)*3/9 FROM PAGO_APORTES_DETALLE P WHERE p.pade_tipap = 'CCF' and p.pgap_id = :iddoc INTO :cotobladm;
  cotobladm = substr(cotobladm,1,strlen(cotobladm)-3);
  EXECUTE PROCEDURE CEROS_ANCHO_FIJO (cotobladm, 10, 'N') RETURNING_VALUES (:cotobladm);
  DATOS = DATOS || :cotobladm;
  DATOS = DATOS || '00000000000000000000';
  SELECT sum(P.pade_cotobl)*3/9 FROM PAGO_APORTES_DETALLE P WHERE p.pgap_id = :iddoc INTO :cotobladm;
  cotobladm = substr(cotobladm,1,strlen(cotobladm)-3);
  EXECUTE PROCEDURE CEROS_ANCHO_FIJO (cotobladm, 10, 'N') RETURNING_VALUES (:cotobladm);
  DATOS = DATOS || :cotobladm;
  SELECT COUNT(P.pgap_item) FROM PAGO_APORTES_DETALLE P WHERE p.pade_tipap = 'AFP' and p.pgap_id = :iddoc INTO :numempladm;
  EXECUTE PROCEDURE CEROS_ANCHO_FIJO (numempladm, 6, 'N') RETURNING_VALUES (:numempladm);
  DATOS = DATOS || :numempladm;
  SELECT COUNT(P.pgap_item) FROM PAGO_APORTES_DETALLE P WHERE p.pade_tipap = 'EPS' and p.pgap_id = :iddoc INTO :numempladm;
  EXECUTE PROCEDURE CEROS_ANCHO_FIJO (numempladm, 6, 'N') RETURNING_VALUES (:numempladm);
  DATOS = DATOS || :numempladm;
  SELECT COUNT(P.pgap_item) FROM PAGO_APORTES_DETALLE P WHERE p.pade_tipap = 'ARP' and p.pgap_id = :iddoc INTO :numempladm;
  EXECUTE PROCEDURE CEROS_ANCHO_FIJO (numempladm, 6, 'N') RETURNING_VALUES (:numempladm);
  DATOS = DATOS || :numempladm;
  SELECT COUNT(P.pgap_item) FROM PAGO_APORTES_DETALLE P WHERE p.pade_tipap = 'CCF' and p.pgap_id = :iddoc INTO :numempladm;
  EXECUTE PROCEDURE CEROS_ANCHO_FIJO (numempladm, 6, 'N') RETURNING_VALUES (:numempladm);
  DATOS = DATOS || :numempladm;
  suspend;
  datos = '';
 END
END
^

SET TERM ; ^


SET TERM ^ ;

ALTER PROCEDURE CAUSA_NOMINA (
    fec date,
    periodo integer,
    periodicidad integer,
    pagoglobal char(1),
    ano char(4),
    depto integer)
returns (
    idnomina integer,
    itemini integer)
as
declare variable item integer;
declare variable nite varchar(20) character set none;
declare variable nit_tercero varchar(20);
declare variable concept integer;
declare variable montos numeric(18,2);
declare variable porcen numeric(9,4);
declare variable entidad varchar(20);
declare variable conc_cod integer;
declare variable conc_deduc char(1);
declare variable conc_porc numeric(9,4);
declare variable conc_entidad integer;
declare variable conc_monto numeric(18,2);
declare variable conc_modifi char(1);
declare variable conc_promedio char(1);
declare variable emco_perprom integer;
declare variable valor numeric(18,2);
declare variable diaslab integer;
declare variable conc_prov char(1);
declare variable conc_aporte char(1);
declare variable numeroprom integer;
declare variable conc_aplicaprom char(1);
declare variable perinicial integer;
declare variable anoprom integer;
declare variable conc_dias char(1);
declare variable conc_otroconc char(1);
declare variable conc_codotroconc integer;
declare variable anosum integer;
declare variable salario char(1) character set none;
declare variable liquidaper integer;
declare variable rmod numeric(2,2);
declare variable basico numeric(18,2);
declare variable niteps varchar(20);
declare variable nitafc varchar(20);
declare variable nitafp varchar(20);
declare variable nitccf varchar(20);
declare variable gtoempr char(1);
declare variable comision numeric(18,2);
declare variable cambsaltrans numeric(18,2);
declare variable saldosini numeric(18,2);
declare variable duranov integer;
declare variable base numeric(18,2);
declare variable aprox integer;
declare variable mensual char(1);
declare variable horasex numeric(18,2);
declare variable diasnov integer;
declare variable tomasal integer;
declare variable retroact numeric(18,2);
declare variable reembolso numeric(18,2);
declare variable incap numeric(18,2);
declare variable deptoempl integer;
declare variable auxtrans numeric(18,2);
declare variable smlv numeric(18,2);
declare variable beneficios numeric(18,2);
declare variable confirmado char(1);
declare variable recnoct numeric(18,2);
declare variable recfest numeric(18,2);
declare variable tar_recnotc numeric(9,4);
declare variable tar_recfest numeric(9,4);
declare variable recargo numeric(18,2);
declare variable basicorec numeric(18,2);
declare variable parambenef char(2);
declare variable vacacdisf numeric(18,2);
BEGIN
 SELECT N.NOMI_ID, N.nomi_liqok FROM NOMINA N WHERE N.nomi_periodo = :periodo AND N.nomi_periodocidad = :periodicidad AND N.nomi_ano = :ano
 INTO :IDNOMINA, :CONFIRMADO;
 IF (:idnomina IS NULL) THEN
 BEGIN
  EXECUTE PROCEDURE cambie_id_nomina RETURNING_VALUES(:idnomina);
  INSERT INTO nomina (nomi_id, NOMI_FECCAUSA, NOMI_PAGOGLOBAL, NOMI_PERIODOCIDAD, NOMI_PERIODO, NOMI_ANO, NOMI_LIQOK)
  VALUES (:IDNOMINA, :fec,:pagoglobal, :periodicidad, :periodo, :ano, 'N');
  item = 1;
 END
 ELSE
 BEGIN
  SELECT MAX(N.noco_item) FROM NOMINA_CONCEPTOS N WHERE N.nomi_id = :idnomina
  INTO :item;
 END
 if ((confirmado = 'S') AND (idnomina IS NOT NULL)) then
 BEGIN
  idnomina = 0;
 END
 else
 begin
 IF (DEPTO = 0) THEN
  INSERT INTO NOMINA_DEPARTAMENTO (nomi_id, nodp_depto)VALUES(:IDNOMINA,0);
 ELSE
  INSERT INTO NOMINA_DEPARTAMENTO (nomi_id, nodp_depto)VALUES(:IDNOMINA,:DEPTO);
 ITEMINI = ITEM;
 FOR SELECT E.TERC_NIT, E.empl_salario, e.empl_eps, e.empl_afc, e.empl_afp, e.empl_ccf, e.empl_dpto
 FROM EMPLEADOS E
 WHERE E.empl_ppago = :periodicidad AND ((E.empl_fecret IS NULL) OR (E.empl_fecret > :fec)) AND E.empl_fecing <= :fec
 INTO :nite, :basico, :niteps, :nitafc, :nitafp, :nitccf, :deptoempl
 DO
 BEGIN
 IF ((depto = 0) OR (deptoempl = :depto)) THEN
 BEGIN
  FOR SELECT CE.TERC_NIT, CE.CONC_COD, CE.EMCO_MONTO, CE.EMCO_PORC, ce.empl_entidad, CE.emco_perprom, CE.emco_luquidaper, CE.emco_mensual, CN.CONC_COD, CN.CONC_DEDUC,CN.CONC_PORC, CN.CONC_ENTIDAD, CN.CONC_MONTO,  CN.CONC_DIAS, CN.CONC_MODIFI,
  CN.CONC_PROMEDIO, CN.conc_salario, CE.emco_perprom, CN.conc_prov, CN.conc_aporte, CN.conc_aplicaprom, cn.conc_otroconc, cn.conc_codotroconc, CN.conc_gtoempr, CN.conc_base, CE.emco_tomsal
  FROM empleado_conceptos CE, CONCEPTOS_NOMINA CN WHERE (CE.CONC_COD = CN.CONC_COD) AND (CE.terc_nit = :nite) AND
  (((CE.emco_fecini <= :fec AND CE.emco_fecfin >= :FEC)) OR
  ((cn.conc_todosper = 'N') AND (CE.emco_ppago = :periodo)) OR (cn.conc_todosper = 'S'))  ORDER BY (TERC_NIT )
  INTO :nit_tercero, :concept,  :montos, :porcen, :entidad, :numeroprom, :liquidaper, :mensual ,:CONC_COD, :CONC_DEDUC, :CONC_PORC,
  :CONC_ENTIDAD, :CONC_MONTO, :CONC_DIAS, :CONC_MODIFI,:CONC_PROMEDIO, :salario,:EMCO_PERPROM, :conc_prov, :conc_aporte , :CONC_APLICAPROM, :conc_otroconc, :conc_codotroconc, :gtoempr, :base, :tomasal
  DO
  BEGIN
   IF (conc_dias = 'S') THEN
    EXECUTE PROCEDURE DIAS_LABORADOS (:nite, :periodo, :fec, :mensual,:conc_aporte) RETURNING_VALUES (:diaslab);
   ELSE
    diaslab = 15;
/*   IF (mensual = 'S') THEN
   BEGIN
    diaslab = 30;
   END
*/   IF (:tomasal <> 0) THEN
   BEGIN
    IF ((:periodicidad = 2) AND (:tomasal <> 2)) THEN
    BEGIN
     IF ((periodo = 2) OR (periodo = 4) OR (periodo = 6) OR (periodo = 8) OR (periodo = 10) OR (periodo = 12)
     OR (periodo = 14) OR (periodo = 16) OR (periodo = 18) OR (periodo = 20) OR (periodo = 22) OR (periodo = 24)) THEN
     basico = 0;
    END
    ELSE
    IF ((:periodicidad = 3) AND (:tomasal <> 1)) THEN
    BEGIN
     IF ((periodo = 1) OR (periodo = 5) OR (periodo = 9) OR (periodo = 13) OR (periodo = 17) OR (periodo = 21)
     OR (periodo = 25) OR (periodo = 29) OR (periodo = 33) OR (periodo = 37) OR (periodo = 41) OR (periodo = 45)
     OR (periodo = 49)) THEN
     basico = 0;
    END
    ELSE
     IF ((:periodicidad = 3) AND (:tomasal <> 2)) THEN
     BEGIN
      IF ((periodo = 2) OR (periodo = 6) OR (periodo = 10) OR (periodo = 14) OR (periodo = 18) OR (periodo = 22)
      OR (periodo = 26) OR (periodo = 30) OR (periodo = 34) OR (periodo = 38) OR (periodo = 42) OR (periodo = 46)
      OR (periodo = 50)) THEN
      basico = 0;
     END
     ELSE
     IF ((:periodicidad = 3) AND (:tomasal <> 3)) THEN
     BEGIN
      IF ((periodo = 3) OR (periodo = 7) OR (periodo = 11) OR (periodo = 15) OR (periodo = 19) OR (periodo = 23)
      OR (periodo = 27) OR (periodo = 31) OR (periodo = 35) OR (periodo = 39) OR (periodo = 43) OR (periodo = 47)
      OR (periodo = 51)) THEN
      basico = 0;
     END
     ELSE
     IF ((:periodicidad = 3) AND (:tomasal <> 4)) THEN
     BEGIN
      IF ((periodo = 4) OR (periodo = 8) OR (periodo = 12) OR (periodo = 16) OR (periodo = 20) OR (periodo = 24)
      OR (periodo = 29) OR (periodo = 32) OR (periodo = 36) OR (periodo = 40) OR (periodo = 44) OR (periodo = 48)
      OR (periodo = 52)) THEN
      basico = 0;
     END
   END
   ELSE
    BEGIN
     SELECT E.empl_salario FROM EMPLEADOS E WHERE E.terc_nit = :nite INTO :basico;
    END
    SELECT ((n.nono_valor /30) * n.nono_dura), (n.nono_dura) FROM nomina_novedades n WHERE n.tnov_cod = 11 AND n.terc_nit = :nite AND n.nono_periodo = :periodo INTO :cambsaltrans, :duranov;
    IF (cambsaltrans IS NULL) THEN
    cambsaltrans = 0;
    IF (duranov IS NULL) THEN
    duranov = 0;
    diaslab = :diaslab - :duranov;
    IF (conc_cod = 922) THEN
    BEGIN
     SELECT SUM(P.prcu_monto) FROM prestamo_cuotas P, prestamo_nomina PN WHERE P.prcu_ano = :ano AND P.prcu_periodo = :periodo AND PN.prno_id = P.prno_id AND PN.terc_nit = :nite INTO :valor;
     IF (valor IS NULL) THEN
     valor = 0;
     item = :item + 1;
     UPDATE prestamo_cuotas  P SET prcu_ok = 'S' WHERE P.prcu_ano = :ano AND P.prcu_periodo = :periodo AND P.prno_id = (SELECT PN.prno_id FROM PRESTAMO_NOMINA PN WHERE PN.terc_nit = :nite);
    END
    ELSE
    IF ((:montos = 0) OR (:montos IS NULL)) THEN
    BEGIN
     IF ((CONC_PORC = 0 AND :porcen = 0) OR (CONC_PORC IS NULL AND :porcen = 0) OR (CONC_PORC = 0 AND :porcen IS NULL) OR (CONC_PORC IS NULL AND :porcen IS NULL) ) THEN
     BEGIN
      IF ((conc_monto <> 0) AND (conc_monto IS NOT NULL) ) THEN
      BEGIN
       VALOR = :CONC_MONTO;
       IF (:conc_dias = 'S') THEN
       valor = (:valor / 30) * :diaslab;
      END
      ELSE
      IF (salario = 'S' AND CONC_COD <> 900 AND CONC_COD <> 920 and conc_cod <> 932 AND CONC_COD <> 953) THEN
      BEGIN
       SELECT E.empl_salario FROM EMPLEADOS E WHERE E.terc_nit = :nite INTO :basico;
       SELECT N.noex_recnoct, N.noex_recfest
       FROM NOMINA_HORASEXT N WHERE N.noex_periodio = :periodo AND N.noex_ano = :ano AND N.terc_nit = :nite
       INTO :recnoct, :recfest;
       if (recnoct is null) then
        recnoct = 0;
       if (recfest is null) then
        recfest = 0;
       SELECT P.paan_recnoc, P.paan_recfest FROM PARAMETROS_ANO P WHERE P.paan_ano = :ano INTO :tar_recnotc, :tar_recfest;
       basico = ((:basico/30)*:diaslab) - (((:basico/30)/8)*:recnoct);
       basico = :basico - (((:basico/30)/8)*:recfest);
       conc_monto = :basico;
       VALOR = (:conc_monto/*/30 * :diaslab*/ ) + :cambsaltrans;
      END
      ELSE
      BEGIN
       valor = montos;
       IF (:conc_dias = 'S') THEN
       valor = (:valor / 30) * :diaslab;
      END
     END
     ELSE
     BEGIN
      IF (:porcen <> 0) THEN
      BEGIN
       IF ((conc_monto <> 0) AND (conc_monto IS NOT NULL) ) THEN
       BEGIN
        VALOR = ((:CONC_MONTO ) * :PORCEN) /100;
       END
      END
      ELSE
      BEGIN
       IF ((conc_monto <> 0) AND (conc_monto IS NOT NULL) ) THEN
       BEGIN
        VALOR = ((:CONC_MONTO) * :conc_porc) /100;
       END
       ELSE
       IF (salario = 'S' AND CONC_COD <> 900 AND CONC_COD <> 920 and conc_cod <> 932 AND CONC_COD <> 953) THEN
       BEGIN
       SELECT E.empl_salario FROM EMPLEADOS E WHERE E.terc_nit = :nite INTO :basico;
       SELECT N.noex_recnoct, N.noex_recfest
       FROM NOMINA_HORASEXT N WHERE N.noex_periodio = :periodo AND N.noex_ano = :ano AND N.terc_nit = :nite
       INTO :recnoct, :recfest;
       if (recnoct is null) then
        recnoct = 0;
       if (recfest is null) then
        recfest = 0;
       SELECT P.paan_recnoc, P.paan_recfest FROM PARAMETROS_ANO P WHERE P.paan_ano = :ano INTO :tar_recnotc, :tar_recfest;
       basico = ((:basico/30)*:diaslab) - (((:basico/30)/8)*:recnoct);
       basico = :basico - (((:basico/30)/8)*:recfest);
        conc_monto = :basico;
        VALOR = ((:CONC_MONTO)+ :cambsaltrans * :conc_porc) /100;
       END
       ELSE
       IF (:conc_monto = 0 AND :montos = 0) THEN
       BEGIN
        conc_monto = :basico;
        VALOR = (((:CONC_MONTO / 30) * :diaslab) + :cambsaltrans * :conc_porc) /100;
       END
      END
     END
    END
    ELSE
    IF ((CONC_PORC = 0 OR (conc_porc IS NULL)) AND (:porcen = 0 OR (porcen IS NULL))) THEN
    BEGIN
     VALOR = (:montos);
     IF (:conc_dias = 'S') THEN
     valor = (:valor / 30) * :diaslab;
    END
    ELSE
    IF (:porcen <> 0 AND porcen IS NOT NULL) THEN
    BEGIN
     VALOR = ((:MONTOS ) * :PORCEN) /100;
    END
    ELSE
    BEGIN
     VALOR = ((:montos) * :CONC_PORC) /100;
    END
    IF (conc_promedio = 'S') THEN
    BEGIN
     perinicial = :periodo - (:numeroprom) + 1;
     anoprom = CAST (ano AS INTEGER);
     IF (perinicial <= 0) THEN
     BEGIN
      perinicial = 1;
      anoprom = CAST(ANO AS INTEGER) - 1;
     END
     SELECT SUM (noco_valor) FROM nomina_conceptos n WHERE n.noco_aplicaprom = 'S' AND N.noco_periodo >= :perinicial - 1 AND N.noco_periodo < :periodo AND N.noco_ano >= :anoprom AND N.noco_ano <= :ano AND terc_nit = :nite INTO :valor;
     valor = ((valor ) / (numeroprom -1 ));
     SELECT NOCO_VALOR FROM NOMINA_CONCEPTOS WHERE CONC_COD = :conc_cod AND TERC_NIT  = :nite AND NOCO_PAGOOK = 'N' AND NOCO_PERIODO = 0 INTO :saldosini;
     IF (saldosini IS NULL) THEN
     saldosini = 0;
     ELSE
     UPDATE nomina_conceptos N SET noco_pagook = 'S' WHERE n.noco_aplicaprom = 'S' AND N.noco_periodo >= :perinicial - 1 AND N.noco_periodo < :periodo AND N.noco_ano >= :anoprom AND N.noco_ano <= :ano  AND CONC_COD = :conc_cod AND terc_nit = :nite AND NOCO_PERIODO = 0;
     VALOR = :valor + :saldosini;
     UPDATE nomina_conceptos N SET noco_pagook = 'S' WHERE n.noco_aplicaprom = 'S' AND N.noco_periodo >= :perinicial - 1 AND N.noco_periodo < :periodo AND N.noco_ano >= :anoprom AND N.noco_ano <= :ano  AND CONC_COD = :conc_cod AND terc_nit = :nite;
    END
    ELSE
    IF (conc_otroconc = 'S') THEN
    BEGIN
     anosum = CAST(ano AS INTEGER);
     anosum = anosum - 1;
     SELECT SUM (noco_valor) FROM nomina_conceptos n WHERE n.noco_ano = :anosum AND n.conc_cod = :conc_codotroconc AND N.terc_nit = :nite INTO :valor;
     SELECT NOCO_VALOR FROM NOMINA_CONCEPTOS WHERE noco_ano = :anosum AND conc_cod = :conc_codotroconc AND terc_nit = :nite AND NOCO_PERIODO = 0 INTO :saldosini;
     IF (saldosini IS NULL) THEN
     saldosini = 0;
     ELSE
     UPDATE nomina_conceptos SET noco_pagook = 'S' WHERE noco_ano = :anosum AND conc_cod = :conc_codotroconc AND NOCO_PERIODO = 0 AND terc_nit = :nite;
     VALOR = :valor + :saldosini;
     UPDATE nomina_conceptos SET noco_pagook = 'S' WHERE noco_ano = :anosum AND conc_cod = :conc_codotroconc AND terc_nit = :nite;
    END
    ELSE
    IF (conc_aporte = 'S') THEN
    BEGIN
     horasex = NULL;
     diasnov = NULL;
     retroact = NULL;
     reembolso = NULL;
     beneficios = null;
     recargo = null;
     comision = null;
     incap = null;
     vacacdisf = null;
     IF ((:entidad = '' ) OR (entidad IS NULL)) THEN
     BEGIN
      /*COMISIONES*/
      SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
      IF (comision IS NULL) THEN
      comision = 0;
      /*RETROACTIVO*/
      SELECT C.emco_monto FROM EMPLEADO_CONCEPTOS C WHERE C.terc_nit = :nite AND C.conc_cod = 933 INTO :retroact;
      IF (retroact IS NULL ) THEN
      retroact = 0;
      /*REEMBOLSO*/
      SELECT C.emco_monto FROM EMPLEADO_CONCEPTOS C WHERE C.terc_nit = :nite AND C.conc_cod = 952 INTO :reembolso;
      IF (reembolso IS NULL ) THEN
      reembolso = 0;
      /*VACACIONES DISFRUTADAS ANTERIORMENTE*/
      SELECT C.emco_monto FROM EMPLEADO_CONCEPTOS C WHERE C.terc_nit = :nite AND C.conc_cod = 955 INTO :vacacdisf;
      IF (vacacdisf IS NULL ) THEN
      vacacdisf = 0;
      /*INCAPACIDAD*/
      SELECT N.nono_dura FROM NOMINA_NOVEDADES N WHERE N.terc_nit = :nite AND N.nono_periodo = :periodo AND N.nono_ano = :ano AND (N.tnov_cod = 2 OR (N.tnov_cod = 3)) INTO :diasnov;
      IF (:diasnov IS NULL) THEN
      incap = 0;
      ELSE
      incap = (:basico / 30)* :diasnov;
      /*BASICO*/
      SELECT N.noex_recnoct, N.noex_recfest
      FROM NOMINA_HORASEXT N WHERE N.noex_periodio = :periodo AND N.noex_ano = :ano AND N.terc_nit = :nite
      INTO :recnoct, :recfest;
      if (recnoct is null) then
       recnoct = 0;
      if (recfest is null) then
       recfest = 0;
      SELECT P.paan_recnoc, P.paan_recfest FROM PARAMETROS_ANO P WHERE P.paan_ano = :ano INTO :tar_recnotc, :tar_recfest;
      basico = ((:basico/30)*:diaslab) - (((:basico/30)/8)*:recnoct);
      basico = :basico - (((:basico/30)/8)*:recfest);
      /*HORAS EXTRA*/
      SELECT c.noex_monto FROM nomina_horasext c WHERE c.noex_ano = :ano AND c.noex_periodio = :periodo AND c.noex_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :horasex;
      if (horasex is null) then
       horasex = 0;
      /*RECARGOS*/
      SELECT E.empl_salario FROM EMPLEADOS E WHERE E.terc_nit = :nite INTO :basicorec;
      SELECT N.noex_recnoct, N.noex_recfest
      FROM NOMINA_HORASEXT N WHERE N.noex_periodio = :periodo AND N.noex_ano = :ano AND N.terc_nit = :nite
      INTO :recnoct, :recfest;
      if (recnoct is null) then
       recnoct = 0;
      if (recfest is null) then
       recfest = 0;
      SELECT P.paan_recnoc, P.paan_recfest FROM PARAMETROS_ANO P WHERE P.paan_ano = :ano INTO :tar_recnotc, :tar_recfest;
      recargo = (((:basicorec/30)/8)*:tar_recnotc)*:recnoct;
      recargo = :recargo + ((((:basicorec/30)/8)*:tar_recfest)*:recfest);
      /*basico*/
      if (:basico + :comision + :horasex + :retroact+ :reembolso + :incap+ :cambsaltrans < ((:smlv/30)*:diaslab)) then
      comision = :smlv + :comision;
      /*SMLV Y AUX. TRANSPORTE*/
      SELECT P.paan_auxtr, P.paan_salminimo FROM PARAMETROS_ANO P WHERE P.paan_ano = :ano INTO :auxtrans, :smlv;
      /*BASE*/
      valor = :basico + :comision + :horasex + :retroact+ :reembolso + :incap + :recargo + :cambsaltrans + :vacacdisf;
      IF ((conc_cod = 904) OR (conc_cod = 905) OR (conc_cod = 906) or (conc_cod = 934) ) THEN
      BEGIN
       entidad = :nitafp;
       IF (conc_cod = 904) THEN
       BEGIN
        SELECT A.paan_afptr FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
        VALOR = ((:valor) * :PORCEN) /100;
       END
       ELSE
       IF ((conc_cod = 905) OR (conc_cod = 906) or (conc_cod = 934)) THEN
       BEGIN
        SELECT A.paan_afpem FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
        VALOR = ((:valor) * :PORCEN) /100;
       END
      END
      ELSE
      IF ((conc_cod = 907) OR (conc_cod = 914) OR (conc_cod = 915) or (conc_cod = 938) ) THEN
      BEGIN
       entidad = :niteps;
       IF (conc_cod = 907) THEN
       BEGIN
        SELECT A.paan_epstr FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
        VALOR = ((:valor) * :PORCEN) /100;
       END
       ELSE
       IF ((conc_cod = 914) OR (conc_cod = 915) or (conc_cod = 938)) THEN
       BEGIN
        SELECT A.paan_epsem FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
        VALOR = ((:valor) * :PORCEN) /100;
       END
      END
      ELSE
      IF ((conc_cod = 910) OR (conc_cod = 911) OR (conc_cod = 916) OR (conc_cod = 917) OR (conc_cod = 918) OR (conc_cod = 919) or (conc_cod = 936) or (conc_cod = 939) or (conc_cod = 940)) THEN
      BEGIN
       entidad = :nitccf;
       IF ((conc_cod = 910) OR (conc_cod = 911) or (conc_cod = 936)) THEN
       BEGIN
        SELECT A.paan_ccf FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
        VALOR = ((:valor) * :PORCEN) /100;
       END
       ELSE
       IF ((conc_cod = 916) OR (conc_cod = 917) or (conc_cod = 939)) THEN
       BEGIN
        SELECT A.paan_icbf FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
        VALOR = ((:valor) * :PORCEN) /100;
       END
       ELSE
       IF ((conc_cod = 918) OR (conc_cod = 919) or (conc_cod = 940)) THEN
       BEGIN
        SELECT A.paan_sena FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
        VALOR = ((:valor) * :PORCEN) /100;
       END
      END
      ELSE
      IF ((conc_cod = 912) OR (conc_cod = 913)) THEN
      BEGIN
       entidad = :nitafc;
      EXECUTE PROCEDURE LEE_CONFIGURACION('NOMINA','LIQUIDACION','TOMAR BENEFICIOS PARA CALCULAR PROVISIONES')RETURNING_VALUES(:parambenef);
      if (parambenef = 'SI') then
      BEGIN
      SELECT SUM(ce.emco_monto)
      FROM empleado_conceptos CE, CONCEPTOS_NOMINA CN WHERE CN.conc_benefic = 'S' AND (CE.terc_nit = :nite) AND (CE.CONC_COD = CN.CONC_COD) AND
      ((CE.emco_fecini <= :fec AND CE.emco_fecfin >= :FEC) OR ((cn.conc_todosper = 'N') AND (CE.emco_ppago = :periodo)) OR
      (cn.conc_todosper = 'S'))
      INTO :beneficios;
      if (beneficios is null) then
       beneficios = 0;
      END
      ELSE
       beneficios = 0;
      SELECT P.paan_auxtr, P.paan_salminimo FROM PARAMETROS_ANO P WHERE P.paan_ano = :ano INTO :auxtrans, :smlv;
      if (:basico < (:smlv*2)) then
       auxtrans = (:auxtrans / 30) * :diaslab;
      ELSE
       auxtrans = 0;
       IF ((conc_cod = 912) OR (conc_cod = 913) or (conc_cod = 937)) THEN
       BEGIN
        SELECT A.paan_cesemp FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
        VALOR = ((:valor + :auxtrans + :beneficios) * :PORCEN) /100;
       END
      END
      ELSE
      BEGIN
       IF (comision IS NULL) THEN
       comision = 0;
       SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
       conc_monto = :basico + :comision;
       IF (conc_porc <> 0 AND conc_porc IS NOT NULL) THEN
       VALOR = (((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans + :incap) * :conc_porc) /100;
       ELSE
       IF (:porcen <> 0 AND :porcen IS NOT NULL) THEN
       VALOR = (((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans + :incap) * :porcen) /100;
       ELSE
       IF (:montos <> 0 AND :montos IS NOT NULL) THEN
       valor = :montos;
       ELSE
       IF (:conc_monto <> 0 AND :conc_monto IS NOT NULL) THEN
       valor = :conc_monto;
      END
     END
     item = :item + 1;
    END
    ELSE
    IF (conc_prov = 'S') THEN
    BEGIN
     horasex = NULL;
     diasnov = NULL;
     retroact = NULL;
     reembolso = NULL;
     beneficios = null;
     recargo = null;
     comision = null;
     incap = null;
     /*RECARGO*/
     SELECT E.empl_salario FROM EMPLEADOS E WHERE E.terc_nit = :nite INTO :basico;
     SELECT N.noex_recnoct, N.noex_recfest
     FROM NOMINA_HORASEXT N WHERE N.noex_periodio = :periodo AND N.noex_ano = :ano AND N.terc_nit = :nite
     INTO :recnoct, :recfest;
     if (recnoct is null) then
      recnoct = 0;
     if (recfest is null) then
      recfest = 0;
     SELECT P.paan_recnoc, P.paan_recfest FROM PARAMETROS_ANO P WHERE P.paan_ano = :ano INTO :tar_recnotc, :tar_recfest;
     recargo = (((:basico/30)/8)*:tar_recnotc)*:recnoct;
     recargo = :recargo + ((((:basico/30)/8)*:tar_recfest)*:recfest);
      /*INCAPACIDAD*/
      SELECT N.nono_dura FROM NOMINA_NOVEDADES N WHERE N.terc_nit = :nite AND N.nono_periodo = :periodo AND N.nono_ano = :ano AND (N.tnov_cod = 2 OR (N.tnov_cod = 3)) INTO :diasnov;
      IF (:diasnov IS NULL) THEN
      incap = 0;
      ELSE
      incap = (:basico / 30)* :diasnov;
     /*BASICO*/
     SELECT N.noex_recnoct, N.noex_recfest
     FROM NOMINA_HORASEXT N WHERE N.noex_periodio = :periodo AND N.noex_ano = :ano AND N.terc_nit = :nite
     INTO :recnoct, :recfest;
     if (recnoct is null) then
      recnoct = 0;
     if (recfest is null) then
      recfest = 0;
     SELECT P.paan_recnoc, P.paan_recfest FROM PARAMETROS_ANO P WHERE P.paan_ano = :ano INTO :tar_recnotc, :tar_recfest;
     basico = ((:basico/30)*:diaslab) - (((:basico/30)/8)*:recnoct);
     basico = :basico - (((:basico/30)/8)*:recfest);
     /*BENEFICIOS*/
     EXECUTE PROCEDURE LEE_CONFIGURACION('NOMINA','LIQUIDACION','TOMAR BENEFICIOS PARA CALCULAR PROVISIONES')RETURNING_VALUES(:parambenef);
     if (parambenef = 'SI') then
     BEGIN
      SELECT SUM(ce.emco_monto)
      FROM empleado_conceptos CE, CONCEPTOS_NOMINA CN WHERE CN.conc_benefic = 'S' AND (CE.terc_nit = :nite) AND (CE.CONC_COD = CN.CONC_COD) AND
      ((CE.emco_fecini <= :fec AND CE.emco_fecfin >= :FEC) OR ((cn.conc_todosper = 'N') AND (CE.emco_ppago = :periodo)) OR
      (cn.conc_todosper = 'S'))
      INTO :beneficios;
      if (beneficios is null) then
        beneficios = 0;
     END
     ELSE
      beneficios = 0;
     if ((conc_cod <> 929) and (conc_cod <> 930) and (conc_cod <> 944)) then
     begin
        SELECT P.paan_auxtr, P.paan_salminimo FROM PARAMETROS_ANO P WHERE P.paan_ano = :ano INTO :auxtrans, :smlv;
        if (:basico < (:smlv*2)) then
           auxtrans = (:auxtrans / 30) * :diaslab;
        ELSE
           auxtrans = 0;
     end
     else
      auxtrans = 0;
     conc_monto = :basico;
     IF (conc_porc <> 0 AND conc_porc IS NOT NULL) THEN
     VALOR = (((:CONC_MONTO)+ :cambsaltrans + :incap + :recargo + :auxtrans + :beneficios) * :conc_porc) /100;
     ELSE
     IF (porcen <> 0 AND porcen IS NOT NULL) THEN
     VALOR = (((:CONC_MONTO)+ :cambsaltrans + :incap + :recargo + :auxtrans + :beneficios) * :porcen) /100;
     ELSE
     IF (montos <> 0 AND montos IS NOT NULL) THEN
     VALOR = :montos;
     ELSE
     IF (conc_monto <> 0 AND conc_monto IS NOT NULL) THEN
     VALOR = :conc_monto;
     item = :item + 1;
    END
    ELSE
    IF (conc_cod = 920) THEN
    BEGIN
     SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :valor;
     IF (valor IS NULL) THEN
     valor = 0;
     item = :item + 1;
    END
    ELSE
    IF (conc_cod = 900 OR (:conc_cod = 931)) THEN
    BEGIN
     SELECT c.noex_monto FROM nomina_horasext c WHERE c.noex_ano = :ano AND c.noex_periodio = :periodo AND c.noex_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :valor;
     IF (valor IS NULL) THEN
     valor = 0;
     item = :item + 1;
    END
    ELSE
    IF (conc_cod = 932) THEN
    BEGIN
     SELECT N.nono_dura FROM NOMINA_NOVEDADES N WHERE N.terc_nit = :nite AND N.nono_periodo = :periodo AND N.nono_ano = :ano AND (N.tnov_cod = 2 OR (N.tnov_cod = 3)) INTO :diasnov;
     IF (:diasnov IS NULL) THEN
     valor = 0;
     ELSE
     valor = (:basico / 30)* :diasnov;
    END
    ELSE
    IF (conc_cod = 921) THEN
    BEGIN
     IF (porcen IS NOT NULL AND porcen <> 0) THEN
     valor = ((basico / 30)* :diaslab ) * :PORCEN /100;
     ELSE
     IF (conc_porc IS NOT NULL AND conc_porc <> 0) THEN
     valor = ((basico / 30)* :diaslab ) * :conc_porc /100;
    END
    ELSE
    if (conc_cod = 953) then
    BEGIN
       SELECT E.empl_salario FROM EMPLEADOS E WHERE E.terc_nit = :nite INTO :basico;
       SELECT N.noex_recnoct, N.noex_recfest
       FROM NOMINA_HORASEXT N WHERE N.noex_periodio = :periodo AND N.noex_ano = :ano AND N.terc_nit = :nite
       INTO :recnoct, :recfest;
       if (recnoct is null) then
        recnoct = 0;
       if (recfest is null) then
        recfest = 0;
       SELECT P.paan_recnoc, P.paan_recfest FROM PARAMETROS_ANO P WHERE P.paan_ano = :ano INTO :tar_recnotc, :tar_recfest;
       valor = (((:basico/30)/8)*:tar_recnotc)*:recnoct;
       valor = :valor + ((((:basico/30)/8)*:tar_recfest)*:recfest);
    END
    if (conc_aporte = 'S') then
    begin
    if (entidad is null or (entidad = '') ) then
    entidad = :conc_entidad;
    end
    EXECUTE PROCEDURE LEE_CONFIGURACION('NOMINA','GENERAL','REDONDEO AL MULTIPLO DE DIEZ EN TOTALES')RETURNING_VALUES(:aprox);
    EXECUTE PROCEDURE REDONDEE(:valor, :aprox) RETURNING_VALUES (VALOR);
    IF ((mensual = 'N') OR (periodicidad = 1))  THEN
    INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
    VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
    ELSE
    IF (mensual = 'S') THEN
    BEGIN
     IF ((:periodicidad = 2) AND (liquidaper = 1)) THEN
     BEGIN
      IF ((periodo = 1) OR (periodo = 3) OR (periodo = 5) OR (periodo = 7) OR (periodo = 9) OR (periodo = 11)
      OR (periodo = 13) OR (periodo = 15) OR (periodo = 17) OR (periodo = 19) OR (periodo = 21) OR (periodo = 23)) THEN
      INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
      VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
     END
     ELSE
     IF ((:periodicidad = 2) AND (liquidaper = 2)) THEN
     BEGIN
      IF ((periodo = 2) OR (periodo = 4) OR (periodo = 6) OR (periodo = 8) OR (periodo = 10) OR (periodo = 12)
      OR (periodo = 14) OR (periodo = 16) OR (periodo = 18) OR (periodo = 20) OR (periodo = 22) OR (periodo = 24)) THEN
      INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
      VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
     END
     ELSE
     IF ((:periodicidad = 3) AND (liquidaper = 1)) THEN
     BEGIN
      IF ((periodo = 1) OR (periodo = 5) OR (periodo = 9) OR (periodo = 13) OR (periodo = 17) OR (periodo = 21)
      OR (periodo = 25) OR (periodo = 29) OR (periodo = 33) OR (periodo = 37) OR (periodo = 41) OR (periodo = 45)
      OR (periodo = 49)) THEN
      INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
      VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
    END
    ELSE
     IF ((:periodicidad = 3) AND (liquidaper = 2)) THEN
     BEGIN
      IF ((periodo = 2) OR (periodo = 6) OR (periodo = 10) OR (periodo = 14) OR (periodo = 18) OR (periodo = 22)
      OR (periodo = 26) OR (periodo = 30) OR (periodo = 34) OR (periodo = 38) OR (periodo = 42) OR (periodo = 46)
      OR (periodo = 50)) THEN
      INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
      VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
     END
     ELSE
     IF ((:periodicidad = 3) AND (liquidaper = 3)) THEN
     BEGIN
      IF ((periodo = 3) OR (periodo = 7) OR (periodo = 11) OR (periodo = 15) OR (periodo = 19) OR (periodo = 23)
      OR (periodo = 27) OR (periodo = 31) OR (periodo = 35) OR (periodo = 39) OR (periodo = 43) OR (periodo = 47)
      OR (periodo = 51)) THEN
      INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
      VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
     END
     ELSE
     IF ((:periodicidad = 3) AND (liquidaper = 4)) THEN
     BEGIN
      IF ((periodo = 4) OR (periodo = 8) OR (periodo = 12) OR (periodo = 16) OR (periodo = 20) OR (periodo = 24)
      OR (periodo = 29) OR (periodo = 32) OR (periodo = 36) OR (periodo = 40) OR (periodo = 44) OR (periodo = 48)
      OR (periodo = 52)) THEN
      INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
      VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
     END
    END
  VALOR = 0;
  basico = 0;
  END
 END
 END
 END
 SUSPEND;
END
^

SET TERM ; ^

grant EXECUTE on procedure CAUSA_NOMINA to PUBLIC;

SET TERM ^ ;

CREATE OR ALTER PROCEDURE FORM_INTEGRADO_ELECTRONICO (
    iddoc integer,
    fecliq varchar(8),
    codoper varchar(2))
returns (
    datos varchar(591))
as
declare variable tipreg varchar(2);
declare variable sec varchar(5);
declare variable nomcia varchar(200);
declare variable tipdocaport varchar(2);
declare variable nitcia varchar(16);
declare variable dvcia varchar(1);
declare variable formapresent varchar(1);
declare variable codsucur varchar(10);
declare variable nomsucur varchar(40);
declare variable codarp varchar(6);
declare variable perliq varchar(7);
declare variable perliqsalud char(7);
declare variable numform varchar(10);
declare variable numempl varchar(5);
declare variable numempladm varchar(6);
declare variable vlornomi varchar(12);
declare variable vlornomiint integer;
declare variable nitempl varchar(16);
declare variable secint integer;
declare variable tipoid varchar(2);
declare variable tipocot varchar(2);
declare variable stipocot varchar(2);
declare variable nom1 varchar(20);
declare variable nom2 varchar(30);
declare variable ape1 varchar(20);
declare variable ape2 varchar(30);
declare variable fecing date;
declare variable fecret date;
declare variable countnov integer;
declare variable novedad varchar(1);
declare variable codadmin varchar(6);
declare variable diaslab varchar(3);
declare variable salminimo varchar(22);
declare variable fecanomes char(7);
declare variable salbasic varchar(22);
declare variable incap varchar(2);
declare variable ciudad varchar(5);
declare variable porcapor varchar(7);
declare variable porcapor2 varchar(9);
declare variable cotobl varchar(9);
declare variable cotobladm varchar(10);
declare variable nitadmin varchar(16);
declare variable itemadm integer;
BEGIN
TIPREG = '01';
DATOS = :tipreg;
DATOS = :DATOS || '1';
SEC = '0001';
DATOS = :DATOS || :sec;
EXECUTE PROCEDURE LEE_CONFIGURACION ('GENERAL','GENERAL','NOMBRE COMPAÑIA') RETURNING_VALUES (:nomcia);
EXECUTE PROCEDURE CEROS_ANCHO_FIJO (:nomcia, 200, 'A') RETURNING_VALUES (:nomcia);
DATOS = :DATOS || :nomcia;
DATOS = :DATOS || 'NI';
EXECUTE PROCEDURE LEE_CONFIGURACION ('CONTABILIDAD','GENERAL','NIT COMPAÑIA') RETURNING_VALUES (:nitcia);
EXECUTE PROCEDURE DV (nitcia) RETURNING_VALUES (dvcia);
EXECUTE PROCEDURE CEROS_ANCHO_FIJO (:nitcia, 16, 'A') RETURNING_VALUES (:nitcia);
DATOS = :DATOS || :nitcia;
DATOS = :DATOS || :dvcia;
FORMAPRESENT = 'E';
DATOS = :DATOS || :formapresent;
DATOS = :DATOS || '0000000000';
DATOS = :DATOS || '          ';
DATOS = :DATOS || 'U';
codsucur = '';
EXECUTE PROCEDURE CEROS_ANCHO_FIJO (:codsucur, 10, 'A') RETURNING_VALUES (:codsucur);
DATOS = :DATOS || :codsucur;
nomsucur = '';
EXECUTE PROCEDURE CEROS_ANCHO_FIJO (:nomsucur, 40, 'A') RETURNING_VALUES (:nomsucur);
DATOS = :DATOS || :nomsucur;
SELECT ADMI_CODARP FROM ADMINISTRADORA A, PARAMETROS_ANO P WHERE P.paan_nitarp = A.terc_nit AND P.paan_ano = substr(:fecliq,1,4) INTO :codarp;
EXECUTE PROCEDURE CEROS_ANCHO_FIJO (:codarp, 6, 'A') RETURNING_VALUES (:codarp);
DATOS = :DATOS || :codarp;
SELECT SUBSTRING(P.pgap_fecha FROM 1 FOR 7) FROM PAGO_APORTES P WHERE P.pgap_id = :iddoc AND p.pgap_item = 1 INTO :perliq;
perliq = substr(perliq, 1,4) || '-' ||substr(perliq, 6,8);
DATOS = :DATOS || :perliq;
perliqsalud = :perliq;
DATOS = :DATOS || :perliqsalud;
SELECT pgap_formulario FROM PAGO_APORTES WHERE PGAP_ID = :iddoc AND pgap_item = 1 INTO :numform;
EXECUTE PROCEDURE CEROS_ANCHO_FIJO (:numform, 10, 'A') RETURNING_VALUES (:numform);
DATOS = :DATOS || :numform;
DATOS = :DATOS || '          ';
SELECT COUNT(E.pgap_id) FROM PAGO_APORTES_EMPLEADOS E WHERE E.pgap_id = :iddoc INTO :numempl;
EXECUTE PROCEDURE CEROS_ANCHO_FIJO (:numempl, 5, 'N') RETURNING_VALUES (:numempl);
DATOS = :DATOS || :numempl;
SELECT CAST(SUM(pade_ibc) AS INTEGER) FROM PAGO_APORTES_DETALLE WHERE PGAP_ID = :iddoc INTO :vlornomiint;
/*vlornomiint = CAST(:vlornomi AS INTEGER);
*/vlornomi = CAST(vlornomiint AS VARCHAR(12));
EXECUTE PROCEDURE CEROS_ANCHO_FIJO (:vlornomi, 12, 'N') RETURNING_VALUES (:vlornomi);
DATOS = :DATOS || :vlornomi;
DATOS = :DATOS || '1';
codoper = '0';
EXECUTE PROCEDURE CEROS_ANCHO_FIJO (:codoper, 2, 'N') RETURNING_VALUES (:codoper);
DATOS = :DATOS || :codoper;
SUSPEND;
datos = '';
secint = 0;
FOR SELECT e.terc_nit, T.terc_tipoid,t.ciud_cod , E.tcot_cod,E.stco_cod, T.terc_nombre1, T.terc_nombre2, T.terc_apellido1, T.terc_apellido2, E.empl_fecing, e.empl_fecret FROM empleados e, TERCEROS T
WHERE (e.empl_fecret > substr(:fecliq,1,4) || '/' || substr(:fecliq,5,6) || '/' || substr(:fecliq,7,8) OR (e.empl_fecret IS NULL))  AND e.empl_fecing < substr(:fecliq,1,4) || '/' || substr(:fecliq,5,6) || '/' || substr(:fecliq,7,8) AND T.terc_nit = E.terc_nit
AND E.terc_nit IN (SELECT PA.terc_nit FROM PAGO_APORTES_DETALLE PA WHERE PA.pgap_id = :iddoc)
INTO :nitempl, :tipoid, :ciudad,:tipocot,:stipocot, :nom1, :nom2, :ape1, :ape2, :fecing, :fecret
DO
 BEGIN
    tipreg  = '02';
    DATOS = :datos || tipreg;
    secint = secint + 1;
    EXECUTE PROCEDURE CEROS_ANCHO_FIJO (CAST(secint AS VARCHAR(200)), 5, 'N') RETURNING_VALUES (:sec);
    DATOS = DATOS || :SEC;
    IF (:tipoid = 'N') THEN
    tipoid = 'NI';
    IF (:tipoid = 'C') THEN
    tipoid = 'CC';
    IF (:tipoid = 'E') THEN
    tipoid = 'CE';
    IF (:tipoid = 'T') THEN
    tipoid = 'TI';
    IF (:tipoid = 'R') THEN
    tipoid = 'RC';
    IF (:tipoid = 'P') THEN
    tipoid = 'PA';
    IF (:tipoid = 'J') THEN
    tipoid = 'CC';
    DATOS = DATOS || tipoid;
    EXECUTE PROCEDURE CEROS_ANCHO_FIJO (:nitempl, 16, 'A') RETURNING_VALUES (:nitempl);
    DATOS = DATOS || :nitempl;
    EXECUTE PROCEDURE CEROS_ANCHO_FIJO (:tipocot, 2, 'N') RETURNING_VALUES (:tipocot);
    datos = datos || :tipocot;
    EXECUTE PROCEDURE CEROS_ANCHO_FIJO (:stipocot, 2, 'N') RETURNING_VALUES (:stipocot);
    datos = datos || :stipocot;
    datos = datos || ' ';
    datos = datos || ' ';
    datos = datos || substr(:ciudad,1,2);
    datos = datos || substr(:ciudad,3,6);
    EXECUTE PROCEDURE CEROS_ANCHO_FIJO (:ape1, 20, 'A') RETURNING_VALUES (:ape1);
    IF (ape1 IS NULL) THEN
    ape1 = '';
    DATOS = DATOS || :ape1;
    EXECUTE PROCEDURE CEROS_ANCHO_FIJO (:ape2, 30, 'A') RETURNING_VALUES (:ape2);
    IF (ape2 IS NULL) THEN
    ape2 = '';
    DATOS = DATOS || :ape2;
    EXECUTE PROCEDURE CEROS_ANCHO_FIJO (:nom1, 20, 'A') RETURNING_VALUES (:nom1);
    IF (nom1 IS NULL) THEN
    nom1 = '';
    DATOS = DATOS || :nom1;
    EXECUTE PROCEDURE CEROS_ANCHO_FIJO (:nom2, 30, 'A') RETURNING_VALUES (:nom2);
    IF (nom2 IS NULL) THEN
    nom2 = '';
    DATOS = DATOS || :nom2;
    novedad = null;
    IF ((substr(:fecing,6,7) = substr(:fecliq,5,6)) AND (substr(:fecing,1,4) = substr(:fecliq,1,4))) THEN
    novedad = 'X';
    ELSE
    novedad = ' ';
    datos = :datos || :novedad;
    novedad = null;
    IF (:fecret IS NOT NULL AND (substr(:fecret,6,7) = substr(:fecliq,5,6))) THEN
    novedad = 'X';
    ELSE
    novedad = ' ';
    datos = :datos || :novedad;
    novedad = null;
    SELECT COUNT(*) FROM nomina_novedades v WHERE (substr(nono_fecha, 1,4) = substr(:fecliq,1,4)) AND (substr(nono_fecha, 6,7) = substr(:fecliq,6,7)) AND v.tnov_cod = 5 AND V.nono_tipoadm = 'E' AND V.terc_nit = :nitempl INTO :countnov;
    IF (:countnov > 0) THEN
    novedad = 'X';
    ELSE
    novedad = ' ';
    datos = :datos || :novedad;
    novedad = null;
   SELECT COUNT(*) FROM nomina_novedades v WHERE (substr(nono_fecha, 1,4) = substr(:fecliq,1,4)) AND (substr(nono_fecha, 6,7) = substr(:fecliq,6,7)) AND v.tnov_cod = 5 AND V.nono_tipoadm = 'E' AND V.terc_nit = :nitempl INTO :countnov;
    IF (:countnov > 0) THEN
    novedad = 'X';
    ELSE
    novedad = ' ';
    datos = :datos || :novedad;
    novedad = null;
    SELECT COUNT(*) FROM nomina_novedades v WHERE (substr(nono_fecha, 1,4) = substr(:fecliq,1,4)) AND (substr(nono_fecha, 6,7) = substr(:fecliq,6,7)) AND v.tnov_cod = 5 AND V.nono_tipoadm = 'A' AND V.terc_nit = :nitempl INTO :countnov;
    IF (:countnov > 0) THEN
    novedad = 'X';
    ELSE
    novedad = ' ';
    datos = :datos || :novedad;    
    novedad = null;
    SELECT COUNT(*) FROM nomina_novedades v WHERE (substr(nono_fecha, 1,4) = substr(:fecliq,1,4)) AND (substr(nono_fecha, 6,7) = substr(:fecliq,6,7)) AND v.tnov_cod = 5 AND V.nono_tipoadm = 'A' AND V.terc_nit = :nitempl INTO :countnov;
    IF (:countnov > 0) THEN
    novedad = 'X';
    ELSE
    novedad = ' ';
    datos = :datos || :novedad;
    novedad = null;
    SELECT COUNT(*) FROM nomina_novedades v WHERE (substr(nono_fecha, 1,4) = substr(:fecliq,1,4)) AND (substr(nono_fecha, 6,7) = substr(:fecliq,6,7)) AND v.tnov_cod = 8 AND V.nono_tipoadm = 'A' AND V.terc_nit = :nitempl INTO :countnov;
    IF (:countnov > 0) THEN
    novedad = 'X';
    ELSE
    novedad = ' ';
    datos = :datos || :novedad;
    novedad = null;
    SELECT COUNT(*) FROM nomina_novedades v WHERE (substr(nono_fecha, 1,4) = substr(:fecliq,1,4)) AND (substr(nono_fecha, 6,7) = substr(:fecliq,6,7)) AND v.tnov_cod = 10 AND V.nono_tipoadm = 'A' AND V.terc_nit = :nitempl INTO :countnov;
    IF (:countnov > 0) THEN
    novedad = 'X';
    ELSE
    novedad = ' ';
    datos = :datos || :novedad;
    novedad = null;
    SELECT COUNT(*) FROM nomina_novedades v WHERE (substr(nono_fecha, 1,4) = substr(:fecliq,1,4)) AND (substr(nono_fecha, 6,7) = substr(:fecliq,6,7)) AND v.tnov_cod = 11 AND V.terc_nit = :nitempl INTO :countnov;
    IF (:countnov > 0) THEN
    novedad = 'X';
    ELSE
    novedad = ' ';
    datos = :datos || :novedad;    
    novedad = null;
    SELECT COUNT(*) FROM nomina_novedades v WHERE (substr(nono_fecha, 1,4) = substr(:fecliq,1,4)) AND (substr(nono_fecha, 6,7) = substr(:fecliq,6,7)) AND v.tnov_cod = 9 AND V.terc_nit = :nitempl INTO :countnov;
    IF (:countnov > 0) THEN
    novedad = 'X';
    ELSE
    novedad = ' ';
    datos = :datos || :novedad;    
    novedad = null;
    SELECT COUNT(*) FROM nomina_novedades v WHERE (substr(nono_fecha, 1,4) = substr(:fecliq,1,4)) AND (substr(nono_fecha, 6,7) = substr(:fecliq,6,7)) AND v.tnov_cod = 2 AND V.terc_nit = :nitempl INTO :countnov;
    IF (:countnov > 0) THEN
    novedad = 'X';
    ELSE
    novedad = ' ';
    datos = :datos || :novedad;    
    novedad = null;
    SELECT COUNT(*) FROM nomina_novedades v WHERE (substr(nono_fecha, 1,4) = substr(:fecliq,1,4)) AND (substr(nono_fecha, 6,7) = substr(:fecliq,6,7)) AND v.tnov_cod = 4 AND V.terc_nit = :nitempl INTO :countnov;
    IF (:countnov > 0) THEN
    novedad = 'X';
    ELSE
    novedad = ' ';
    datos = :datos || :novedad;
    novedad = null;
    SELECT COUNT(*) FROM nomina_novedades v WHERE (substr(nono_fecha, 1,4) = substr(:fecliq,1,4)) AND (substr(nono_fecha, 6,7) = substr(:fecliq,6,7)) AND v.tnov_cod = 6 AND V.terc_nit = :nitempl INTO :countnov;
    IF (:countnov > 0) THEN
    novedad = 'X';
    ELSE
    novedad = ' ';
    datos = :datos || :novedad;    
    novedad = null;
    SELECT COUNT(*) FROM nomina_novedades v WHERE (substr(nono_fecha, 1,4) = substr(:fecliq,1,4)) AND (substr(nono_fecha, 6,7) = substr(:fecliq,6,7)) AND v.tnov_cod = 1 AND V.terc_nit = :nitempl INTO :countnov;
    IF (:countnov > 0) THEN
    novedad = 'X';
    ELSE
    novedad = ' ';
    datos = :datos || :novedad;    
    novedad = null;
    SELECT COUNT(*) FROM nomina_novedades v WHERE (substr(nono_fecha, 1,4) = substr(:fecliq,1,4)) AND (substr(nono_fecha, 6,7) = substr(:fecliq,6,7)) AND v.tnov_cod = 7 AND V.terc_nit = :nitempl INTO :countnov;
    IF (:countnov > 0) THEN
    novedad = 'X';
    ELSE
    novedad = ' ';
    datos = :datos || :novedad;
    SELECT v.nono_dura FROM nomina_novedades v WHERE (substr(nono_fecha, 1,4) = substr(:fecliq,1,4)) AND (substr(nono_fecha, 6,7) = substr(:fecliq,6,7)) AND v.tnov_cod = 3 AND V.terc_nit = :nitempl INTO :countnov;
    IF (:countnov > 0) THEN
    BEGIN
    novedad = :countnov;
    END
    ELSE
    BEGIN
    countnov = 0;
    END
    EXECUTE PROCEDURE CEROS_ANCHO_FIJO (:countnov, 2, 'N') RETURNING_VALUES (:incap);
    datos = :datos || :incap;
    SELECT a.admi_codafp FROM ADMINISTRADORA A, EMPLEADOS E WHERE E.empl_afp = A.terc_nit AND E.terc_nit = :nitempl INTO :codadmin;
    IF (:codadmin IS NULL) THEN
    codadmin = ' ';
    EXECUTE PROCEDURE CEROS_ANCHO_FIJO (:codadmin, 6, 'A') RETURNING_VALUES (:codadmin);
    datos = :datos || :codadmin;
    codadmin = '';
    SELECT A.admi_codafp FROM nomina_novedades v, EMPLEADOS E, ADMINISTRADORA A WHERE (substr(nono_fecha, 1,4) = substr(:fecliq,1,4)) AND (substr(nono_fecha, 6,7) = substr(:fecliq,6,7)) AND v.tnov_cod = 5 AND V.nono_tipoadm = 'A' AND V.nono_nvaadm = A.terc_nit INTO :codadmin;
    IF (:codadmin IS NULL) THEN
    codadmin = ' ';
    EXECUTE PROCEDURE CEROS_ANCHO_FIJO (:codadmin, 6, 'A') RETURNING_VALUES (:codadmin);
    datos = :datos || :codadmin;
    codadmin = '';
    SELECT a.admi_codeps FROM ADMINISTRADORA A, EMPLEADOS E WHERE E.empl_eps = A.terc_nit AND E.terc_nit = :nitempl INTO :codadmin;
    IF (:codadmin IS NULL) THEN
    codadmin = ' ';
    EXECUTE PROCEDURE CEROS_ANCHO_FIJO (:codadmin, 6, 'A') RETURNING_VALUES (:codadmin);
    datos = :datos || :codadmin;
    codadmin = '';
    SELECT A.admi_codeps FROM nomina_novedades v, EMPLEADOS E, ADMINISTRADORA A WHERE (substr(nono_fecha, 1,4) = substr(:fecliq,1,4)) AND (substr(nono_fecha, 6,7) = substr(:fecliq,6,7)) AND v.tnov_cod = 5 AND V.nono_tipoadm = 'E' AND V.nono_nvaadm = A.terc_nit INTO :codadmin;
    IF (:codadmin IS NULL) THEN
    codadmin = ' ';
    EXECUTE PROCEDURE CEROS_ANCHO_FIJO (:codadmin, 6, 'A') RETURNING_VALUES (:codadmin);
    datos = :datos || :codadmin;
    SELECT a.admi_codccf FROM ADMINISTRADORA A, EMPLEADOS E WHERE E.empl_ccf = A.terc_nit AND E.terc_nit = :nitempl INTO :codadmin;
    IF (:codadmin IS NULL) THEN
    codadmin = ' ';
    EXECUTE PROCEDURE CEROS_ANCHO_FIJO (:codadmin, 6, 'A') RETURNING_VALUES (:codadmin);
    datos = :datos || :codadmin;
    codadmin = '';
    fecanomes = substr(:fecliq,1,4) || '/' || substr(:fecliq,5,6);
    SELECT MAX(ND.node_diaslab) FROM NOMINA_DETALLE ND, PAGO_APORTES PA WHERE PA.pgap_id = :iddoc AND ND.terc_nit = :nitempl AND PA.pgap_idnomina = ND.nomi_id INTO :diaslab;
    IF (:diaslab IS NULL) THEN
    diaslab = '00';
    EXECUTE PROCEDURE CEROS_ANCHO_FIJO (:diaslab, 2, 'N') RETURNING_VALUES (:diaslab);
    Datos = :datos || :diaslab;
    SELECT MAX(ND.node_diaslab) FROM NOMINA_DETALLE ND, PAGO_APORTES PA WHERE PA.pgap_id = :iddoc AND ND.terc_nit = :nitempl AND PA.pgap_idnomina = ND.nomi_id INTO :diaslab;
    IF (:diaslab IS NULL) THEN
    diaslab = '00';
    EXECUTE PROCEDURE CEROS_ANCHO_FIJO (:diaslab, 2, 'N') RETURNING_VALUES (:diaslab);
    Datos = :datos || :diaslab;
    SELECT MAX(ND.node_diaslab) FROM NOMINA_DETALLE ND, PAGO_APORTES PA WHERE PA.pgap_id = :iddoc AND ND.terc_nit = :nitempl AND PA.pgap_idnomina = ND.nomi_id INTO :diaslab;
    IF (:diaslab IS NULL) THEN
    diaslab = '00';
    EXECUTE PROCEDURE CEROS_ANCHO_FIJO (:diaslab, 2, 'N') RETURNING_VALUES (:diaslab);
    Datos = :datos || :diaslab;
    SELECT MAX(ND.node_diaslab) FROM NOMINA_DETALLE ND, PAGO_APORTES PA WHERE PA.pgap_id = :iddoc AND ND.terc_nit = :nitempl AND PA.pgap_idnomina = ND.nomi_id INTO :diaslab;
    IF (:diaslab IS NULL) THEN
    diaslab = '00';
    EXECUTE PROCEDURE CEROS_ANCHO_FIJO (:diaslab, 2, 'N') RETURNING_VALUES (:diaslab);
    Datos = :datos || :diaslab;
    SELECT e.empl_salario FROM empleados e WHERE e.terc_nit = :nitempl INTO :salbasic;
    IF (:salbasic IS NULL) THEN
    salbasic = '0';
    salbasic = substr(salbasic,1,strlen(salbasic)-3);
    EXECUTE PROCEDURE CEROS_ANCHO_FIJO (:salbasic, 9, 'N') RETURNING_VALUES (:salbasic);
    Datos = :datos || :salbasic;
    Datos = :datos || ' ';
    SELECT e.pgae_ibc FROM pago_aportes_empleados e WHERE e.terc_nit = :nitempl and e.pgap_id = :iddoc INTO :salbasic;
    IF (:salbasic IS NULL) THEN
    salbasic = '0';
    execute procedure redondee (salbasic,1000)returning_values(salbasic);
    salbasic = substr(salbasic,1,strlen(salbasic)-5);
    EXECUTE PROCEDURE CEROS_ANCHO_FIJO (:salbasic, 9, 'N') RETURNING_VALUES (:salbasic);
    Datos = :datos || :salbasic;
    Datos = :datos || :salbasic;
    Datos = :datos || :salbasic;
    Datos = :datos || :salbasic;
    select P.paan_afptr + P.paan_afpem from PARAMETROS_ANO P WHERE P.paan_ano = substr(:fecliq,1,4) INTO :porcapor;
    porcapor = substr(porcapor,1,strlen(porcapor)-2);
    EXECUTE PROCEDURE CEROS_ANCHO_FIJO (:porcapor, 7, 'N') RETURNING_VALUES (:porcapor);
    Datos = :datos || :porcapor;
    select P.pade_cotobl from pago_aportes_detalle P WHERE P.terc_nit = :nitempl AND P.pade_tipap = 'AFP' and p.pgap_id = :iddoc INTO :cotobl;
    cotobl = substr(cotobl,1,strlen(cotobl)-3);
    EXECUTE PROCEDURE CEROS_ANCHO_FIJO (:cotobl, 9, 'N') RETURNING_VALUES (:cotobl);
    Datos = :datos || :cotobl;
    Datos = :datos || '000000000';
    Datos = :datos || '000000000';
    Datos = :datos || '000000000';
    Datos = :datos || '000000000';
    Datos = :datos || '000000000';
    Datos = :datos || '000000000';
    select P.paan_epstr + P.paan_epsem from PARAMETROS_ANO P WHERE P.paan_ano = substr(:fecliq,1,4) INTO :porcapor;
    porcapor = substr(porcapor,1,strlen(porcapor)-2);
    EXECUTE PROCEDURE CEROS_ANCHO_FIJO (:porcapor, 7, 'N') RETURNING_VALUES (:porcapor);
    Datos = :datos || :porcapor;
    select P.pade_cotobl from pago_aportes_detalle P WHERE P.terc_nit = :nitempl AND P.pade_tipap = 'EPS' and p.pgap_id = :iddoc INTO :cotobl;
    cotobl = substr(cotobl,1,strlen(cotobl)-3);
    EXECUTE PROCEDURE CEROS_ANCHO_FIJO (:cotobl, 9, 'N') RETURNING_VALUES (:cotobl);
    Datos = :datos || :cotobl;
    Datos = :datos || '000000000';
    Datos = :datos || '               ';
    Datos = :datos || '000000000';
    Datos = :datos || '               ';
    Datos = :datos || '000000000';
    porcapor2 = '0.25';
    EXECUTE PROCEDURE CEROS_ANCHO_FIJO (:porcapor2, 9, 'N') RETURNING_VALUES (:porcapor2);
    Datos = :datos || :porcapor2;
    Datos = :datos || '000000000';
    select P.pade_cotobl from pago_aportes_detalle P WHERE P.terc_nit = :nitempl AND P.pade_tipap = 'ARP' and p.pgap_id = :iddoc INTO :cotobl;
    cotobl = substr(cotobl,1,strlen(cotobl)-3);
    EXECUTE PROCEDURE CEROS_ANCHO_FIJO (:cotobl, 9, 'N') RETURNING_VALUES (:cotobl);
    Datos = :datos || :cotobl;
    select P.paan_ccf from PARAMETROS_ANO P WHERE P.paan_ano = substr(:fecliq,1,4) INTO :porcapor;
    porcapor = substr(porcapor,1,strlen(porcapor)-2);
    EXECUTE PROCEDURE CEROS_ANCHO_FIJO (:porcapor, 7, 'N') RETURNING_VALUES (:porcapor);
    Datos = :datos || :porcapor;
    select (P.pade_cotobl)*4/9 from pago_aportes_detalle P WHERE P.terc_nit = :nitempl AND P.pade_tipap = 'CCF' and p.pgap_id = :iddoc INTO :cotobl;
    cotobl = substr(cotobl,1,strlen(cotobl)-3);
    EXECUTE PROCEDURE CEROS_ANCHO_FIJO (:cotobl, 9, 'N') RETURNING_VALUES (:cotobl);
    Datos = :datos || :cotobl;
    select P.paan_sena from PARAMETROS_ANO P WHERE P.paan_ano = substr(:fecliq,1,4) INTO :porcapor;
    porcapor = substr(porcapor,1,strlen(porcapor)-2);
    EXECUTE PROCEDURE CEROS_ANCHO_FIJO (:porcapor, 7, 'N') RETURNING_VALUES (:porcapor);
    Datos = :datos || :porcapor;
    select (P.pade_cotobl)*2/9 from pago_aportes_detalle P WHERE P.terc_nit = :nitempl AND P.pade_tipap = 'CCF' and p.pgap_id = :iddoc INTO :cotobl;
    cotobl = substr(cotobl,1,strlen(cotobl)-3);
    EXECUTE PROCEDURE CEROS_ANCHO_FIJO (:cotobl, 9, 'N') RETURNING_VALUES (:cotobl);
    Datos = :datos || :cotobl;
    select P.paan_icbf from PARAMETROS_ANO P WHERE P.paan_ano = substr(:fecliq,1,4) INTO :porcapor;
    porcapor = substr(porcapor,1,strlen(porcapor)-2);
    EXECUTE PROCEDURE CEROS_ANCHO_FIJO (:porcapor, 7, 'N') RETURNING_VALUES (:porcapor);
    Datos = :datos || :porcapor;
    select (P.pade_cotobl)*3/9 from pago_aportes_detalle P WHERE P.terc_nit = :nitempl AND P.pade_tipap = 'CCF' and p.pgap_id = :iddoc INTO :cotobl;
    cotobl = substr(cotobl,1,strlen(cotobl)-3);
    EXECUTE PROCEDURE CEROS_ANCHO_FIJO (:cotobl, 9, 'N') RETURNING_VALUES (:cotobl);
    Datos = :datos || :cotobl;
    Datos = :datos || '0000000';
    Datos = :datos || '000000000';
    Datos = :datos || '0000000';
    Datos = :datos || '000000000';
    SUSPEND;
    datos = '';
    cotobl = 0;
    END
datos = '';
secint = 0;
FOR SELECT a.admi_codafp, a.terc_nit,p.pgap_monto,p.pgap_item FROM administradora a, pago_aportes p
WHERE (p.pgap_admin = a.terc_nit) and p.pgap_id = :iddoc and a.admi_afp = 'S'
INTO :codadmin, :nitadmin, :cotobladm, :itemadm
DO
 BEGIN
  tipreg = '03';
  Datos = :datos || :tipreg;
  secint = secint + 1;
  EXECUTE PROCEDURE CEROS_ANCHO_FIJO (CAST(secint AS VARCHAR(200)), 5, 'N') RETURNING_VALUES (:sec);
  DATOS = DATOS || :SEC;
  EXECUTE PROCEDURE CEROS_ANCHO_FIJO (codadmin, 6, 'A') RETURNING_VALUES (:codadmin);
  DATOS = DATOS || :codadmin;
  EXECUTE PROCEDURE DV (nitadmin) RETURNING_VALUES (dvcia);
  EXECUTE PROCEDURE CEROS_ANCHO_FIJO (nitadmin, 16, 'A') RETURNING_VALUES (:nitadmin);
  DATOS = DATOS || :nitadmin;
  DATOS = :DATOS || :dvcia;
  SELECT sum(P.pade_cotobl) FROM PAGO_APORTES_DETALLE P WHERE P.pade_itemdet = :itemadm and p.pade_tipap = 'AFP' and p.pgap_id = :iddoc INTO :cotobladm;
  cotobladm = substr(cotobladm,1,strlen(cotobladm)-3);
  EXECUTE PROCEDURE CEROS_ANCHO_FIJO (cotobladm, 10, 'N') RETURNING_VALUES (:cotobladm);
  DATOS = DATOS || :cotobladm;
  DATOS = DATOS || '00000000000000000000000000000000000000000000000000000000000000000000000000';
  EXECUTE PROCEDURE CEROS_ANCHO_FIJO (cotobladm, 10, 'N') RETURNING_VALUES (:cotobladm);
  DATOS = DATOS || :cotobladm;
  SELECT COUNT(P.pgap_item) FROM PAGO_APORTES_DETALLE P WHERE P.pade_itemdet = :itemadm and p.pade_tipap = 'AFP' and p.pgap_id = :iddoc INTO :numempladm;
  EXECUTE PROCEDURE CEROS_ANCHO_FIJO (numempladm, 6, 'N') RETURNING_VALUES (:numempladm);
  DATOS = DATOS || :numempladm;
  if (cotobladm <> '0000000000') then
  suspend;
  datos = '';
 END
secint = 0;
FOR SELECT a.admi_codeps, a.terc_nit,p.pgap_item FROM administradora a, pago_aportes p
WHERE (p.pgap_admin = a.terc_nit) and p.pgap_id = :iddoc and a.admi_eps = 'S'
INTO :codadmin, :nitadmin, :itemadm
DO
 BEGIN
  tipreg = '04';
  Datos = :datos || :tipreg;
  secint = secint + 1;
  EXECUTE PROCEDURE CEROS_ANCHO_FIJO (CAST(secint AS VARCHAR(200)), 5, 'N') RETURNING_VALUES (:sec);
  DATOS = DATOS || :SEC;
  EXECUTE PROCEDURE CEROS_ANCHO_FIJO (codadmin, 6, 'A') RETURNING_VALUES (:codadmin);
  DATOS = DATOS || :codadmin;
  EXECUTE PROCEDURE DV (nitadmin) RETURNING_VALUES (dvcia);
  EXECUTE PROCEDURE CEROS_ANCHO_FIJO (nitadmin, 16, 'A') RETURNING_VALUES (:nitadmin);
  DATOS = DATOS || :nitadmin;
  DATOS = :DATOS || :dvcia;
  SELECT sum(P.pade_cotobl) FROM PAGO_APORTES_DETALLE P WHERE P.pade_itemdet = :itemadm and p.pade_tipap = 'EPS' and p.pgap_id = :iddoc INTO :cotobladm;
  cotobladm = substr(cotobladm,1,strlen(cotobladm)-3);
  EXECUTE PROCEDURE CEROS_ANCHO_FIJO (cotobladm, 10, 'N') RETURNING_VALUES (:cotobladm);
  DATOS = DATOS || :cotobladm;
  DATOS = DATOS || '0000000000               0000000000               0000000000';
  EXECUTE PROCEDURE CEROS_ANCHO_FIJO (cotobladm, 10, 'N') RETURNING_VALUES (:cotobladm);
  DATOS = DATOS || :cotobladm;
  DATOS = DATOS || '000000000000000000000000';
  EXECUTE PROCEDURE CEROS_ANCHO_FIJO (cotobladm, 10, 'N') RETURNING_VALUES (:cotobladm);
  DATOS = DATOS || :cotobladm;
  DATOS = DATOS || '0000000000000000000000000000000000000000';
  EXECUTE PROCEDURE CEROS_ANCHO_FIJO (cotobladm, 10, 'N') RETURNING_VALUES (:cotobladm);
  DATOS = DATOS || :cotobladm;
  DATOS = DATOS || '0000000000';
  EXECUTE PROCEDURE CEROS_ANCHO_FIJO (cotobladm, 10, 'N') RETURNING_VALUES (:cotobladm);
  DATOS = DATOS || :cotobladm;
  DATOS = DATOS || '0000000000';
  SELECT COUNT(P.pgap_item) FROM PAGO_APORTES_DETALLE P WHERE P.pade_itemdet = :itemadm and p.pade_tipap = 'EPS' and p.pgap_id = :iddoc INTO :numempladm;
  EXECUTE PROCEDURE CEROS_ANCHO_FIJO (numempladm, 6, 'N') RETURNING_VALUES (:numempladm);
  DATOS = DATOS || :numempladm;
  if (cotobladm <> '0000000000') then
  suspend;
  datos = '';
 END
secint = 0;
FOR SELECT a.admi_codarp, a.terc_nit,p.pgap_item FROM administradora a, pago_aportes p
WHERE (p.pgap_admin = a.terc_nit) and p.pgap_id = :iddoc and a.admi_arp = 'S'
INTO :codadmin, :nitadmin, :itemadm
DO
 BEGIN
  tipreg = '05';
  Datos = :datos || :tipreg;
  secint = secint + 1;
  EXECUTE PROCEDURE CEROS_ANCHO_FIJO (CAST(secint AS VARCHAR(200)), 5, 'N') RETURNING_VALUES (:sec);
  DATOS = DATOS || :SEC;
  EXECUTE PROCEDURE CEROS_ANCHO_FIJO (codadmin, 6, 'A') RETURNING_VALUES (:codadmin);
  DATOS = DATOS || :codadmin;
  EXECUTE PROCEDURE DV (nitadmin) RETURNING_VALUES (dvcia);
  EXECUTE PROCEDURE CEROS_ANCHO_FIJO (nitadmin, 16, 'A') RETURNING_VALUES (:nitadmin);
  DATOS = DATOS || :nitadmin;
  DATOS = :DATOS || :dvcia;
  SELECT sum(P.pade_cotobl) FROM PAGO_APORTES_DETALLE P WHERE P.pgap_item = :itemadm and p.pade_tipap = 'ARP' and p.pgap_id = :iddoc INTO :cotobladm;
  cotobladm = substr(cotobladm,1,strlen(cotobladm)-3);
  EXECUTE PROCEDURE CEROS_ANCHO_FIJO (cotobladm, 10, 'N') RETURNING_VALUES (:cotobladm);
  DATOS = DATOS || :cotobladm;
  DATOS = DATOS || '               00000000000000000000';
  EXECUTE PROCEDURE CEROS_ANCHO_FIJO (cotobladm, 10, 'N') RETURNING_VALUES (:cotobladm);
  DATOS = DATOS || :cotobladm;
  DATOS = DATOS || '00000000000000';
  EXECUTE PROCEDURE CEROS_ANCHO_FIJO (cotobladm, 10, 'N') RETURNING_VALUES (:cotobladm);
  DATOS = DATOS || :cotobladm;
  DATOS = DATOS || '00000000000000000000';
  EXECUTE PROCEDURE CEROS_ANCHO_FIJO (cotobladm, 10, 'N') RETURNING_VALUES (:cotobladm);
  DATOS = DATOS || :cotobladm;
  SELECT sum(P.pade_cotobl)/100 FROM PAGO_APORTES_DETALLE P WHERE P.pgap_item = :itemadm and p.pade_tipap = 'ARP' and p.pgap_id = :iddoc INTO :cotobladm;
  cotobladm = substr(cotobladm,1,strlen(cotobladm)-3);
  EXECUTE PROCEDURE CEROS_ANCHO_FIJO (cotobladm, 10, 'N') RETURNING_VALUES (:cotobladm);
  DATOS = DATOS || :cotobladm;
  SELECT COUNT(P.pgap_item) FROM PAGO_APORTES_DETALLE P WHERE P.pgap_item = :itemadm and p.pade_tipap = 'ARP' and p.pgap_id = :iddoc INTO :numempladm;
  EXECUTE PROCEDURE CEROS_ANCHO_FIJO (numempladm, 6, 'N') RETURNING_VALUES (:numempladm);
  DATOS = DATOS || :numempladm;
  if (cotobladm <> '0000000000') then
  suspend;
  datos = '';
 END
secint = 0;
FOR SELECT a.admi_codccf, a.terc_nit,p.pgap_item FROM administradora a, pago_aportes p
WHERE (p.pgap_admin = a.terc_nit) and p.pgap_id = :iddoc and a.admi_ccf = 'S'
INTO :codadmin, :nitadmin, :itemadm
DO
 BEGIN
  tipreg = '06';
  Datos = :datos || :tipreg;
  secint = secint + 1;
  EXECUTE PROCEDURE CEROS_ANCHO_FIJO (CAST(secint AS VARCHAR(200)), 5, 'N') RETURNING_VALUES (:sec);
  DATOS = DATOS || :SEC;
  EXECUTE PROCEDURE CEROS_ANCHO_FIJO (codadmin, 6, 'A') RETURNING_VALUES (:codadmin);
  DATOS = DATOS || :codadmin;
  EXECUTE PROCEDURE DV (nitadmin) RETURNING_VALUES (dvcia);
  EXECUTE PROCEDURE CEROS_ANCHO_FIJO (nitadmin, 16, 'A') RETURNING_VALUES (:nitadmin);
  DATOS = DATOS || :nitadmin;
  DATOS = :DATOS || :dvcia;
  SELECT sum(P.pade_cotobl)*4/9 FROM PAGO_APORTES_DETALLE P WHERE P.pgap_item = :itemadm and p.pade_tipap = 'CCF' and p.pgap_id = :iddoc INTO :cotobladm;
  cotobladm = substr(cotobladm,1,strlen(cotobladm)-3);
  EXECUTE PROCEDURE CEROS_ANCHO_FIJO (cotobladm, 10, 'N') RETURNING_VALUES (:cotobladm);
  DATOS = DATOS || :cotobladm;
  DATOS = DATOS || '00000000000000';
  EXECUTE PROCEDURE CEROS_ANCHO_FIJO (cotobladm, 10, 'N') RETURNING_VALUES (:cotobladm);
  DATOS = DATOS || :cotobladm;
  SELECT COUNT(P.pgap_item) FROM PAGO_APORTES_DETALLE P WHERE P.pgap_item = :itemadm and p.pade_tipap = 'CCF' and p.pgap_id = :iddoc INTO :numempladm;
  EXECUTE PROCEDURE CEROS_ANCHO_FIJO (numempladm, 6, 'N') RETURNING_VALUES (:numempladm);
  DATOS = DATOS || :numempladm;
  if (cotobladm <> '0000000000') then
  suspend;
  datos = '';
 END
secint = 0;
FOR SELECT a.admi_codccf, a.terc_nit,p.pgap_item FROM administradora a, pago_aportes p
WHERE (p.pgap_admin = a.terc_nit) and p.pgap_id = :iddoc and a.admi_ccf = 'S'
INTO :codadmin, :nitadmin, :itemadm
DO
 BEGIN
  tipreg = '07';
  Datos = :datos || :tipreg;
  secint = secint + 1;
  EXECUTE PROCEDURE CEROS_ANCHO_FIJO (CAST(secint AS VARCHAR(200)), 5, 'N') RETURNING_VALUES (:sec);
  DATOS = DATOS || :SEC;
  nitadmin = '899999034';
  EXECUTE PROCEDURE DV (nitadmin) RETURNING_VALUES (dvcia);
  EXECUTE PROCEDURE CEROS_ANCHO_FIJO (nitadmin, 16, 'A') RETURNING_VALUES (:nitadmin);
  DATOS = DATOS || :nitadmin;
  DATOS = :DATOS || :dvcia;
  SELECT sum(P.pade_cotobl)*2/9 FROM PAGO_APORTES_DETALLE P WHERE P.pgap_item = :itemadm and p.pade_tipap = 'CCF' and p.pgap_id = :iddoc INTO :cotobladm;
  cotobladm = substr(cotobladm,1,strlen(cotobladm)-3);
  EXECUTE PROCEDURE CEROS_ANCHO_FIJO (cotobladm, 10, 'N') RETURNING_VALUES (:cotobladm);
  DATOS = DATOS || :cotobladm;
  DATOS = DATOS || '00000000000000';
  EXECUTE PROCEDURE CEROS_ANCHO_FIJO (cotobladm, 10, 'N') RETURNING_VALUES (:cotobladm);
  DATOS = DATOS || :cotobladm;
  SELECT COUNT(P.pgap_item) FROM PAGO_APORTES_DETALLE P WHERE P.pgap_item = :itemadm and p.pade_tipap = 'CCF' and p.pgap_id = :iddoc INTO :numempladm;
  EXECUTE PROCEDURE CEROS_ANCHO_FIJO (numempladm, 6, 'N') RETURNING_VALUES (:numempladm);
  DATOS = DATOS || :numempladm;
  if (cotobladm <> '0000000000') then
  suspend;
  datos = '';
 END
secint = 0;
FOR SELECT a.admi_codccf, a.terc_nit,p.pgap_item FROM administradora a, pago_aportes p
WHERE (p.pgap_admin = a.terc_nit) and p.pgap_id = :iddoc and a.admi_ccf = 'S'
INTO :codadmin, :nitadmin, :itemadm
DO
 BEGIN
  tipreg = '08';
  Datos = :datos || :tipreg;
  secint = secint + 1;
  EXECUTE PROCEDURE CEROS_ANCHO_FIJO (CAST(secint AS VARCHAR(200)), 5, 'N') RETURNING_VALUES (:sec);
  DATOS = DATOS || :SEC;
  nitadmin = '800213277';
  EXECUTE PROCEDURE DV (nitadmin) RETURNING_VALUES (dvcia);
  EXECUTE PROCEDURE CEROS_ANCHO_FIJO (nitadmin, 16, 'A') RETURNING_VALUES (:nitadmin);
  DATOS = DATOS || :nitadmin;
  DATOS = :DATOS || :dvcia;
  SELECT sum(P.pade_cotobl)*3/9 FROM PAGO_APORTES_DETALLE P WHERE P.pgap_item = :itemadm and p.pade_tipap = 'CCF' and p.pgap_id = :iddoc INTO :cotobladm;
  cotobladm = substr(cotobladm,1,strlen(cotobladm)-3);
  EXECUTE PROCEDURE CEROS_ANCHO_FIJO (cotobladm, 10, 'N') RETURNING_VALUES (:cotobladm);
  DATOS = DATOS || :cotobladm;
  DATOS = DATOS || '00000000000000';
  EXECUTE PROCEDURE CEROS_ANCHO_FIJO (cotobladm, 10, 'N') RETURNING_VALUES (:cotobladm);
  DATOS = DATOS || :cotobladm;
  SELECT COUNT(P.pgap_item) FROM PAGO_APORTES_DETALLE P WHERE P.pgap_item = :itemadm and p.pade_tipap = 'CCF' and p.pgap_id = :iddoc INTO :numempladm;
  EXECUTE PROCEDURE CEROS_ANCHO_FIJO (numempladm, 6, 'N') RETURNING_VALUES (:numempladm);
  DATOS = DATOS || :numempladm;
  if (cotobladm <> '0000000000') then
  suspend;
  datos = '';
 END
 BEGIN
  tipreg = '11';
  Datos = :datos || :tipreg;
  secint = secint + 1;
  SELECT sum(P.pade_cotobl) FROM PAGO_APORTES_DETALLE P WHERE p.pade_tipap = 'AFP' and p.pgap_id = :iddoc INTO :cotobladm;
  cotobladm = substr(cotobladm,1,strlen(cotobladm)-3);
  EXECUTE PROCEDURE CEROS_ANCHO_FIJO (cotobladm, 10, 'N') RETURNING_VALUES (:cotobladm);
  DATOS = DATOS || :cotobladm;
  SELECT sum(P.pade_cotobl) FROM PAGO_APORTES_DETALLE P WHERE p.pade_tipap = 'EPS' and p.pgap_id = :iddoc INTO :cotobladm;
  cotobladm = substr(cotobladm,1,strlen(cotobladm)-3);
  EXECUTE PROCEDURE CEROS_ANCHO_FIJO (cotobladm, 10, 'N') RETURNING_VALUES (:cotobladm);
  DATOS = DATOS || :cotobladm;
  SELECT sum(P.pade_cotobl) FROM PAGO_APORTES_DETALLE P WHERE p.pade_tipap = 'ARP' and p.pgap_id = :iddoc INTO :cotobladm;
  cotobladm = substr(cotobladm,1,strlen(cotobladm)-3);
  EXECUTE PROCEDURE CEROS_ANCHO_FIJO (cotobladm, 10, 'N') RETURNING_VALUES (:cotobladm);
  DATOS = DATOS || :cotobladm;
  SELECT sum(P.pade_cotobl)*4/9 FROM PAGO_APORTES_DETALLE P WHERE p.pade_tipap = 'CCF' and p.pgap_id = :iddoc INTO :cotobladm;
  cotobladm = substr(cotobladm,1,strlen(cotobladm)-3);
  EXECUTE PROCEDURE CEROS_ANCHO_FIJO (cotobladm, 10, 'N') RETURNING_VALUES (:cotobladm);
  DATOS = DATOS || :cotobladm;
  SELECT sum(P.pade_cotobl)*2/9 FROM PAGO_APORTES_DETALLE P WHERE p.pade_tipap = 'CCF' and p.pgap_id = :iddoc INTO :cotobladm;
  cotobladm = substr(cotobladm,1,strlen(cotobladm)-3);
  EXECUTE PROCEDURE CEROS_ANCHO_FIJO (cotobladm, 10, 'N') RETURNING_VALUES (:cotobladm);
  DATOS = DATOS || :cotobladm;
  SELECT sum(P.pade_cotobl)*3/9 FROM PAGO_APORTES_DETALLE P WHERE p.pade_tipap = 'CCF' and p.pgap_id = :iddoc INTO :cotobladm;
  cotobladm = substr(cotobladm,1,strlen(cotobladm)-3);
  EXECUTE PROCEDURE CEROS_ANCHO_FIJO (cotobladm, 10, 'N') RETURNING_VALUES (:cotobladm);
  DATOS = DATOS || :cotobladm;
  DATOS = DATOS || '00000000000000000000';
  SELECT sum(P.pade_cotobl)*3/9 FROM PAGO_APORTES_DETALLE P WHERE p.pgap_id = :iddoc INTO :cotobladm;
  cotobladm = substr(cotobladm,1,strlen(cotobladm)-3);
  EXECUTE PROCEDURE CEROS_ANCHO_FIJO (cotobladm, 10, 'N') RETURNING_VALUES (:cotobladm);
  DATOS = DATOS || :cotobladm;
  SELECT COUNT(P.pgap_item) FROM PAGO_APORTES_DETALLE P WHERE p.pade_tipap = 'AFP' and p.pgap_id = :iddoc INTO :numempladm;
  EXECUTE PROCEDURE CEROS_ANCHO_FIJO (numempladm, 10, 'N') RETURNING_VALUES (:numempladm);
  DATOS = DATOS || :numempladm;
  SELECT COUNT(P.pgap_item) FROM PAGO_APORTES_DETALLE P WHERE p.pade_tipap = 'EPS' and p.pgap_id = :iddoc INTO :numempladm;
  EXECUTE PROCEDURE CEROS_ANCHO_FIJO (numempladm, 10, 'N') RETURNING_VALUES (:numempladm);
  DATOS = DATOS || :numempladm;
  SELECT COUNT(P.pgap_item) FROM PAGO_APORTES_DETALLE P WHERE p.pade_tipap = 'ARP' and p.pgap_id = :iddoc INTO :numempladm;
  EXECUTE PROCEDURE CEROS_ANCHO_FIJO (numempladm, 10, 'N') RETURNING_VALUES (:numempladm);
  DATOS = DATOS || :numempladm;
  SELECT COUNT(P.pgap_item) FROM PAGO_APORTES_DETALLE P WHERE p.pade_tipap = 'CCF' and p.pgap_id = :iddoc INTO :numempladm;
  EXECUTE PROCEDURE CEROS_ANCHO_FIJO (numempladm, 10, 'N') RETURNING_VALUES (:numempladm);
  DATOS = DATOS || :numempladm;
  suspend;
  datos = '';
 END
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE DIAS_LABORADOS (
    nitempl varchar(20),
    periodo integer,
    fec date,
    mensual char(1),
    aporte char(1))
returns (
    totaldiaslab integer)
as
declare variable diasnolab integer;
declare variable diaslabxper integer;
declare variable perpago integer;
declare variable fecing date;
declare variable diasfec integer;
declare variable diasing integer;
declare variable existe char(1);
BEGIN
SELECT E.empl_ppago, E.empl_fecing
FROM EMPLEADOS E WHERE TERC_NIT = :nitempl
INTO :perpago, :fecing;
IF (mensual = 'N') THEN
BEGIN
IF (perpago = 1) THEN
diaslabxper = 30;
ELSE
IF (perpago = 2) THEN
diaslabxper = 15;
ELSE
IF (perpago = 3) THEN
diaslabxper = 7;
END
ELSE
diaslabxper = 30;
if (perpago = 2) then
BEGIN
IF (SUBSTR(fecing,1,7) = SUBSTR(FEC,1,7)) THEN
BEGIN
diasfec = CAST(substr(fec,9,10) AS INTEGER);
diasing = CAST(substr(fecing,9,10) AS INTEGER);
diaslabxper = (diasfec - diasing)+1;
IF ((diaslabxper > 15) AND (perpago = 2)) THEN
diaslabxper = 15;
END
END
ELSE
if (perpago = 1) then
BEGIN
IF (SUBSTR(fecing,1,7) = SUBSTR(FEC,1,7)) THEN
BEGIN
diasfec = CAST(substr(fec,9,10) AS INTEGER);
diasing = CAST(substr(fecing,9,10) AS INTEGER);
diaslabxper = (diasfec - diasing)+1;
IF ((diaslabxper > 30) AND (perpago = 1)) THEN
diaslabxper = 30;
END
END
IF (mensual = 'S') THEN
BEGIN
SELECT MAX('S') FROM nomina_novedades WHERE TERC_NIT = :nitempl AND (TNOV_COD = 9 or (tnov_cod = 2) or (tnov_cod = 3)) AND ((NONO_PERIODO = :periodo) or (NONO_PERIODO = :periodo - 1)) AND NONO_ANO = substr(:fec,1,4)
INTO :existe;
IF ((aporte = 'N' ) OR (:existe = 'S'))  THEN
BEGIN
SELECT SUM (NONO_DURA)
FROM nomina_novedades WHERE TERC_NIT = :nitempl AND (TNOV_COD = 9 OR (TNOV_COD = 6) OR (TNOV_COD = 2) OR (TNOV_COD =3) OR (TNOV_COD = 4)  ) AND ((NONO_PERIODO = :periodo) or (NONO_PERIODO = :periodo - 1)) AND NONO_ANO  = substr(:FEC,1,4)
INTO :diasnolab;
if (diasnolab IS NULL) then
diasnolab = 0;
diaslabxper =  :diaslabxper - :diasnolab;
END
if (diaslabxper IS NOT NULL) then
totaldiaslab =  :diaslabxper;
ELSE
totaldiaslab = 0;
SUSPEND;
END
ELSE
BEGIN
SELECT MAX('S') FROM nomina_novedades WHERE TERC_NIT = :nitempl AND (TNOV_COD = 9 or (tnov_cod = 2) or (tnov_cod = 3) or (tnov_cod = 6)) AND NONO_PERIODO = :periodo AND NONO_ANO  = substr(:FEC,1,4)
INTO :existe;
IF ((aporte = 'N' ) OR (:existe = 'S'))  THEN
BEGIN
SELECT SUM (NONO_DURA)
FROM nomina_novedades WHERE TERC_NIT = :nitempl AND (TNOV_COD = 9 OR (TNOV_COD = 6) OR (TNOV_COD = 2) OR (TNOV_COD =3) OR (TNOV_COD = 4)  ) AND NONO_PERIODO = :periodo AND NONO_ANO  = substr(:FEC,1,4)
INTO :diasnolab;
if (diasnolab IS NULL) then
diasnolab = 0;
diaslabxper =  :diaslabxper - :diasnolab;
END
if (diaslabxper IS NOT NULL) then
totaldiaslab =  :diaslabxper;
ELSE
totaldiaslab = 0;
SUSPEND;
END
END
^

SET TERM ; ^


SET TERM ^ ;

ALTER PROCEDURE CAUSA_NOMINA (
    fec date,
    periodo integer,
    periodicidad integer,
    pagoglobal char(1),
    ano char(4),
    depto integer)
returns (
    idnomina integer,
    itemini integer)
as
declare variable item integer;
declare variable nite varchar(20) character set none;
declare variable nit_tercero varchar(20);
declare variable concept integer;
declare variable montos numeric(18,2);
declare variable porcen numeric(9,4);
declare variable entidad varchar(20);
declare variable conc_cod integer;
declare variable conc_deduc char(1);
declare variable conc_porc numeric(9,4);
declare variable conc_entidad integer;
declare variable conc_monto numeric(18,2);
declare variable conc_modifi char(1);
declare variable conc_promedio char(1);
declare variable emco_perprom integer;
declare variable valor numeric(18,2);
declare variable diaslab integer;
declare variable conc_prov char(1);
declare variable conc_aporte char(1);
declare variable numeroprom integer;
declare variable conc_aplicaprom char(1);
declare variable perinicial integer;
declare variable anoprom integer;
declare variable conc_dias char(1);
declare variable conc_otroconc char(1);
declare variable conc_codotroconc integer;
declare variable anosum integer;
declare variable salario char(1) character set none;
declare variable liquidaper integer;
declare variable rmod numeric(2,2);
declare variable basico numeric(18,2);
declare variable niteps varchar(20);
declare variable nitafc varchar(20);
declare variable nitafp varchar(20);
declare variable nitccf varchar(20);
declare variable gtoempr char(1);
declare variable comision numeric(18,2);
declare variable cambsaltrans numeric(18,2);
declare variable saldosini numeric(18,2);
declare variable duranov integer;
declare variable base numeric(18,2);
declare variable aprox integer;
declare variable mensual char(1);
declare variable horasex numeric(18,2);
declare variable diasnov integer;
declare variable tomasal integer;
declare variable retroact numeric(18,2);
declare variable reembolso numeric(18,2);
declare variable incap numeric(18,2);
declare variable deptoempl integer;
declare variable auxtrans numeric(18,2);
declare variable smlv numeric(18,2);
declare variable beneficios numeric(18,2);
declare variable confirmado char(1);
declare variable recnoct numeric(18,2);
declare variable recfest numeric(18,2);
declare variable tar_recnotc numeric(9,4);
declare variable tar_recfest numeric(9,4);
declare variable recargo numeric(18,2);
declare variable basicorec numeric(18,2);
declare variable parambenef char(2);
declare variable vacacdisf numeric(18,2);
BEGIN
 SELECT N.NOMI_ID, N.nomi_liqok FROM NOMINA N WHERE N.nomi_periodo = :periodo AND N.nomi_periodocidad = :periodicidad AND N.nomi_ano = :ano
 INTO :IDNOMINA, :CONFIRMADO;
 IF (:idnomina IS NULL) THEN
 BEGIN
  EXECUTE PROCEDURE cambie_id_nomina RETURNING_VALUES(:idnomina);
  INSERT INTO nomina (nomi_id, NOMI_FECCAUSA, NOMI_PAGOGLOBAL, NOMI_PERIODOCIDAD, NOMI_PERIODO, NOMI_ANO, NOMI_LIQOK)
  VALUES (:IDNOMINA, :fec,:pagoglobal, :periodicidad, :periodo, :ano, 'N');
  item = 1;
 END
 ELSE
 BEGIN
  SELECT MAX(N.noco_item) FROM NOMINA_CONCEPTOS N WHERE N.nomi_id = :idnomina
  INTO :item;
 END
 if ((confirmado = 'S') AND (idnomina IS NOT NULL)) then
 BEGIN
  idnomina = 0;
 END
 else
 begin
 IF (DEPTO = 0) THEN
  INSERT INTO NOMINA_DEPARTAMENTO (nomi_id, nodp_depto)VALUES(:IDNOMINA,0);
 ELSE
  INSERT INTO NOMINA_DEPARTAMENTO (nomi_id, nodp_depto)VALUES(:IDNOMINA,:DEPTO);
 ITEMINI = ITEM;
 FOR SELECT E.TERC_NIT, E.empl_salario, e.empl_eps, e.empl_afc, e.empl_afp, e.empl_ccf, e.empl_dpto
 FROM EMPLEADOS E
 WHERE E.empl_ppago = :periodicidad AND ((E.empl_fecret IS NULL) OR (E.empl_fecret > :fec)) AND E.empl_fecing <= :fec
 INTO :nite, :basico, :niteps, :nitafc, :nitafp, :nitccf, :deptoempl
 DO
 BEGIN
 IF ((depto = 0) OR (deptoempl = :depto)) THEN
 BEGIN
  FOR SELECT CE.TERC_NIT, CE.CONC_COD, CE.EMCO_MONTO, CE.EMCO_PORC, ce.empl_entidad, CE.emco_perprom, CE.emco_luquidaper, CE.emco_mensual, CN.CONC_COD, CN.CONC_DEDUC,CN.CONC_PORC, CN.CONC_ENTIDAD, CN.CONC_MONTO,  CN.CONC_DIAS, CN.CONC_MODIFI,
  CN.CONC_PROMEDIO, CN.conc_salario, CE.emco_perprom, CN.conc_prov, CN.conc_aporte, CN.conc_aplicaprom, cn.conc_otroconc, cn.conc_codotroconc, CN.conc_gtoempr, CN.conc_base, CE.emco_tomsal
  FROM empleado_conceptos CE, CONCEPTOS_NOMINA CN WHERE (CE.CONC_COD = CN.CONC_COD) AND (CE.terc_nit = :nite) AND
  (((CE.emco_fecini <= :fec AND CE.emco_fecfin >= :FEC)) OR
  ((cn.conc_todosper = 'N') AND (CE.emco_ppago = :periodo)) OR (cn.conc_todosper = 'S'))  ORDER BY (TERC_NIT )
  INTO :nit_tercero, :concept,  :montos, :porcen, :entidad, :numeroprom, :liquidaper, :mensual ,:CONC_COD, :CONC_DEDUC, :CONC_PORC,
  :CONC_ENTIDAD, :CONC_MONTO, :CONC_DIAS, :CONC_MODIFI,:CONC_PROMEDIO, :salario,:EMCO_PERPROM, :conc_prov, :conc_aporte , :CONC_APLICAPROM, :conc_otroconc, :conc_codotroconc, :gtoempr, :base, :tomasal
  DO
  BEGIN
   IF (conc_dias = 'S') THEN
    EXECUTE PROCEDURE DIAS_LABORADOS (:nite, :periodo, :fec, :mensual,:conc_aporte) RETURNING_VALUES (:diaslab);
   ELSE
    diaslab = 15;
/*   IF (mensual = 'S') THEN
   BEGIN
    diaslab = 30;
   END
*/   IF (:tomasal <> 0) THEN
   BEGIN
    IF ((:periodicidad = 2) AND (:tomasal <> 2)) THEN
    BEGIN
     IF ((periodo = 2) OR (periodo = 4) OR (periodo = 6) OR (periodo = 8) OR (periodo = 10) OR (periodo = 12)
     OR (periodo = 14) OR (periodo = 16) OR (periodo = 18) OR (periodo = 20) OR (periodo = 22) OR (periodo = 24)) THEN
     basico = 0;
    END
    ELSE
    IF ((:periodicidad = 3) AND (:tomasal <> 1)) THEN
    BEGIN
     IF ((periodo = 1) OR (periodo = 5) OR (periodo = 9) OR (periodo = 13) OR (periodo = 17) OR (periodo = 21)
     OR (periodo = 25) OR (periodo = 29) OR (periodo = 33) OR (periodo = 37) OR (periodo = 41) OR (periodo = 45)
     OR (periodo = 49)) THEN
     basico = 0;
    END
    ELSE
     IF ((:periodicidad = 3) AND (:tomasal <> 2)) THEN
     BEGIN
      IF ((periodo = 2) OR (periodo = 6) OR (periodo = 10) OR (periodo = 14) OR (periodo = 18) OR (periodo = 22)
      OR (periodo = 26) OR (periodo = 30) OR (periodo = 34) OR (periodo = 38) OR (periodo = 42) OR (periodo = 46)
      OR (periodo = 50)) THEN
      basico = 0;
     END
     ELSE
     IF ((:periodicidad = 3) AND (:tomasal <> 3)) THEN
     BEGIN
      IF ((periodo = 3) OR (periodo = 7) OR (periodo = 11) OR (periodo = 15) OR (periodo = 19) OR (periodo = 23)
      OR (periodo = 27) OR (periodo = 31) OR (periodo = 35) OR (periodo = 39) OR (periodo = 43) OR (periodo = 47)
      OR (periodo = 51)) THEN
      basico = 0;
     END
     ELSE
     IF ((:periodicidad = 3) AND (:tomasal <> 4)) THEN
     BEGIN
      IF ((periodo = 4) OR (periodo = 8) OR (periodo = 12) OR (periodo = 16) OR (periodo = 20) OR (periodo = 24)
      OR (periodo = 29) OR (periodo = 32) OR (periodo = 36) OR (periodo = 40) OR (periodo = 44) OR (periodo = 48)
      OR (periodo = 52)) THEN
      basico = 0;
     END
   END
   ELSE
    BEGIN
     SELECT E.empl_salario FROM EMPLEADOS E WHERE E.terc_nit = :nite INTO :basico;
    END
    SELECT ((n.nono_valor /30) * n.nono_dura), (n.nono_dura) FROM nomina_novedades n WHERE n.tnov_cod = 11 AND n.terc_nit = :nite AND n.nono_periodo = :periodo INTO :cambsaltrans, :duranov;
    IF (cambsaltrans IS NULL) THEN
    cambsaltrans = 0;
    IF (duranov IS NULL) THEN
    duranov = 0;
    diaslab = :diaslab - :duranov;
    IF (conc_cod = 922) THEN
    BEGIN
     SELECT SUM(P.prcu_monto) FROM prestamo_cuotas P, prestamo_nomina PN WHERE P.prcu_ano = :ano AND P.prcu_periodo = :periodo AND PN.prno_id = P.prno_id AND PN.terc_nit = :nite INTO :valor;
     IF (valor IS NULL) THEN
     valor = 0;
     item = :item + 1;
     UPDATE prestamo_cuotas  P SET prcu_ok = 'S' WHERE P.prcu_ano = :ano AND P.prcu_periodo = :periodo AND P.prno_id = (SELECT PN.prno_id FROM PRESTAMO_NOMINA PN WHERE PN.terc_nit = :nite);
    END
    ELSE
    IF ((:montos = 0) OR (:montos IS NULL)) THEN
    BEGIN
     IF ((CONC_PORC = 0 AND :porcen = 0) OR (CONC_PORC IS NULL AND :porcen = 0) OR (CONC_PORC = 0 AND :porcen IS NULL) OR (CONC_PORC IS NULL AND :porcen IS NULL) ) THEN
     BEGIN
      IF ((conc_monto <> 0) AND (conc_monto IS NOT NULL) ) THEN
      BEGIN
       VALOR = :CONC_MONTO;
       IF (:conc_dias = 'S') THEN
       valor = (:valor / 30) * :diaslab;
      END
      ELSE
      IF (salario = 'S' AND CONC_COD <> 900 AND CONC_COD <> 920 and conc_cod <> 932 AND CONC_COD <> 953) THEN
      BEGIN
       SELECT E.empl_salario FROM EMPLEADOS E WHERE E.terc_nit = :nite INTO :basico;
       SELECT N.noex_recnoct, N.noex_recfest
       FROM NOMINA_HORASEXT N WHERE N.noex_periodio = :periodo AND N.noex_ano = :ano AND N.terc_nit = :nite
       INTO :recnoct, :recfest;
       if (recnoct is null) then
        recnoct = 0;
       if (recfest is null) then
        recfest = 0;
       SELECT P.paan_recnoc, P.paan_recfest FROM PARAMETROS_ANO P WHERE P.paan_ano = :ano INTO :tar_recnotc, :tar_recfest;
       basico = ((:basico/30)*:diaslab) - (((:basico/30)/8)*:recnoct);
       basico = :basico - (((:basico/30)/8)*:recfest);
       conc_monto = :basico;
       VALOR = (:conc_monto/*/30 * :diaslab*/ ) + :cambsaltrans;
      END
      ELSE
      BEGIN
       valor = montos;
       IF (:conc_dias = 'S') THEN
       valor = (:valor / 30) * :diaslab;
      END
     END
     ELSE
     BEGIN
      IF (:porcen <> 0) THEN
      BEGIN
       IF ((conc_monto <> 0) AND (conc_monto IS NOT NULL) ) THEN
       BEGIN
        VALOR = ((:CONC_MONTO ) * :PORCEN) /100;
       END
      END
      ELSE
      BEGIN
       IF ((conc_monto <> 0) AND (conc_monto IS NOT NULL) ) THEN
       BEGIN
        VALOR = ((:CONC_MONTO) * :conc_porc) /100;
       END
       ELSE
       IF (salario = 'S' AND CONC_COD <> 900 AND CONC_COD <> 920 and conc_cod <> 932 AND CONC_COD <> 953) THEN
       BEGIN
       SELECT E.empl_salario FROM EMPLEADOS E WHERE E.terc_nit = :nite INTO :basico;
       SELECT N.noex_recnoct, N.noex_recfest
       FROM NOMINA_HORASEXT N WHERE N.noex_periodio = :periodo AND N.noex_ano = :ano AND N.terc_nit = :nite
       INTO :recnoct, :recfest;
       if (recnoct is null) then
        recnoct = 0;
       if (recfest is null) then
        recfest = 0;
       SELECT P.paan_recnoc, P.paan_recfest FROM PARAMETROS_ANO P WHERE P.paan_ano = :ano INTO :tar_recnotc, :tar_recfest;
       basico = ((:basico/30)*:diaslab) - (((:basico/30)/8)*:recnoct);
       basico = :basico - (((:basico/30)/8)*:recfest);
        conc_monto = :basico;
        VALOR = ((:CONC_MONTO)+ :cambsaltrans * :conc_porc) /100;
       END
       ELSE
       IF (:conc_monto = 0 AND :montos = 0) THEN
       BEGIN
        conc_monto = :basico;
        VALOR = (((:CONC_MONTO / 30) * :diaslab) + :cambsaltrans * :conc_porc) /100;
       END
      END
     END
    END
    ELSE
    IF ((CONC_PORC = 0 OR (conc_porc IS NULL)) AND (:porcen = 0 OR (porcen IS NULL))) THEN
    BEGIN
     VALOR = (:montos);
     IF (:conc_dias = 'S') THEN
     valor = (:valor / 30) * :diaslab;
    END
    ELSE
    IF (:porcen <> 0 AND porcen IS NOT NULL) THEN
    BEGIN
     VALOR = ((:MONTOS ) * :PORCEN) /100;
    END
    ELSE
    BEGIN
     VALOR = ((:montos) * :CONC_PORC) /100;
    END
    IF (conc_promedio = 'S') THEN
    BEGIN
     perinicial = :periodo - (:numeroprom) + 1;
     anoprom = CAST (ano AS INTEGER);
     IF (perinicial <= 0) THEN
     BEGIN
      perinicial = 1;
      anoprom = CAST(ANO AS INTEGER) - 1;
     END
     SELECT SUM (noco_valor) FROM nomina_conceptos n WHERE n.noco_aplicaprom = 'S' AND N.noco_periodo >= :perinicial - 1 AND N.noco_periodo < :periodo AND N.noco_ano >= :anoprom AND N.noco_ano <= :ano AND terc_nit = :nite INTO :valor;
     valor = ((valor ) / (numeroprom -1 ));
     SELECT NOCO_VALOR FROM NOMINA_CONCEPTOS WHERE CONC_COD = :conc_cod AND TERC_NIT  = :nite AND NOCO_PAGOOK = 'N' AND NOCO_PERIODO = 0 INTO :saldosini;
     IF (saldosini IS NULL) THEN
     saldosini = 0;
     ELSE
     UPDATE nomina_conceptos N SET noco_pagook = 'S' WHERE n.noco_aplicaprom = 'S' AND N.noco_periodo >= :perinicial - 1 AND N.noco_periodo < :periodo AND N.noco_ano >= :anoprom AND N.noco_ano <= :ano  AND CONC_COD = :conc_cod AND terc_nit = :nite AND NOCO_PERIODO = 0;
     VALOR = :valor + :saldosini;
     UPDATE nomina_conceptos N SET noco_pagook = 'S' WHERE n.noco_aplicaprom = 'S' AND N.noco_periodo >= :perinicial - 1 AND N.noco_periodo < :periodo AND N.noco_ano >= :anoprom AND N.noco_ano <= :ano  AND CONC_COD = :conc_cod AND terc_nit = :nite;
    END
    ELSE
    IF (conc_otroconc = 'S') THEN
    BEGIN
     anosum = CAST(ano AS INTEGER);
     numeroprom = periodo - emco_perprom;
     SELECT SUM (noco_valor) FROM nomina_conceptos n WHERE n.noco_ano = :anosum AND n.conc_cod = :conc_codotroconc and n.noco_periodo >= :numeroprom and n.noco_periodo <= (:periodo - 1) AND N.terc_nit = :nite INTO :valor;
    /* SELECT NOCO_VALOR FROM NOMINA_CONCEPTOS WHERE noco_ano = :anosum AND conc_cod = :conc_codotroconc AND terc_nit = :nite AND NOCO_PERIODO = 0 INTO :saldosini;
     IF (saldosini IS NULL) THEN
     saldosini = 0;
     ELSE
     UPDATE nomina_conceptos SET noco_pagook = 'S' WHERE noco_ano = :anosum AND conc_cod = :conc_codotroconc AND NOCO_PERIODO = 0 AND terc_nit = :nite;
     VALOR = :valor + :saldosini;
     UPDATE nomina_conceptos SET noco_pagook = 'S' WHERE noco_ano = :anosum AND conc_cod = :conc_codotroconc AND terc_nit = :nite;
   */ END
    ELSE
    IF (conc_aporte = 'S') THEN
    BEGIN
     horasex = NULL;
     diasnov = NULL;
     retroact = NULL;
     reembolso = NULL;
     beneficios = null;
     recargo = null;
     comision = null;
     incap = null;
     vacacdisf = null;
     IF ((:entidad = '' ) OR (entidad IS NULL)) THEN
     BEGIN
      /*COMISIONES*/
      SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
      IF (comision IS NULL) THEN
      comision = 0;
      /*RETROACTIVO*/
      SELECT C.emco_monto FROM EMPLEADO_CONCEPTOS C WHERE C.terc_nit = :nite AND C.conc_cod = 933 INTO :retroact;
      IF (retroact IS NULL ) THEN
      retroact = 0;
      /*REEMBOLSO*/
      SELECT C.emco_monto FROM EMPLEADO_CONCEPTOS C WHERE C.terc_nit = :nite AND C.conc_cod = 952 INTO :reembolso;
      IF (reembolso IS NULL ) THEN
      reembolso = 0;
      /*VACACIONES DISFRUTADAS ANTERIORMENTE*/
      SELECT C.emco_monto FROM EMPLEADO_CONCEPTOS C WHERE C.terc_nit = :nite AND C.conc_cod = 955 INTO :vacacdisf;
      IF (vacacdisf IS NULL ) THEN
      vacacdisf = 0;
      /*INCAPACIDAD*/
      SELECT N.nono_dura FROM NOMINA_NOVEDADES N WHERE N.terc_nit = :nite AND N.nono_periodo = :periodo AND N.nono_ano = :ano AND (N.tnov_cod = 2 OR (N.tnov_cod = 3)) INTO :diasnov;
      IF (:diasnov IS NULL) THEN
      incap = 0;
      ELSE
      incap = (:basico / 30)* :diasnov;
      /*BASICO*/
      SELECT N.noex_recnoct, N.noex_recfest
      FROM NOMINA_HORASEXT N WHERE N.noex_periodio = :periodo AND N.noex_ano = :ano AND N.terc_nit = :nite
      INTO :recnoct, :recfest;
      if (recnoct is null) then
       recnoct = 0;
      if (recfest is null) then
       recfest = 0;
      SELECT P.paan_recnoc, P.paan_recfest FROM PARAMETROS_ANO P WHERE P.paan_ano = :ano INTO :tar_recnotc, :tar_recfest;
      basico = ((:basico/30)*:diaslab) - (((:basico/30)/8)*:recnoct);
      basico = :basico - (((:basico/30)/8)*:recfest);
      /*HORAS EXTRA*/
      SELECT c.noex_monto FROM nomina_horasext c WHERE c.noex_ano = :ano AND c.noex_periodio = :periodo AND c.noex_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :horasex;
      if (horasex is null) then
       horasex = 0;
      /*RECARGOS*/
      SELECT E.empl_salario FROM EMPLEADOS E WHERE E.terc_nit = :nite INTO :basicorec;
      SELECT N.noex_recnoct, N.noex_recfest
      FROM NOMINA_HORASEXT N WHERE N.noex_periodio = :periodo AND N.noex_ano = :ano AND N.terc_nit = :nite
      INTO :recnoct, :recfest;
      if (recnoct is null) then
       recnoct = 0;
      if (recfest is null) then
       recfest = 0;
      SELECT P.paan_recnoc, P.paan_recfest FROM PARAMETROS_ANO P WHERE P.paan_ano = :ano INTO :tar_recnotc, :tar_recfest;
      recargo = (((:basicorec/30)/8)*:tar_recnotc)*:recnoct;
      recargo = :recargo + ((((:basicorec/30)/8)*:tar_recfest)*:recfest);
      /*basico*/
      if (:basico + :comision + :horasex + :retroact+ :reembolso + :incap+ :cambsaltrans < ((:smlv/30)*:diaslab)) then
      comision = :smlv + :comision;
      /*SMLV Y AUX. TRANSPORTE*/
      SELECT P.paan_auxtr, P.paan_salminimo FROM PARAMETROS_ANO P WHERE P.paan_ano = :ano INTO :auxtrans, :smlv;
      /*BASE*/
      valor = :basico + :comision + :horasex + :retroact+ :reembolso + :incap + :recargo + :cambsaltrans + :vacacdisf;
      IF ((conc_cod = 904) OR (conc_cod = 905) OR (conc_cod = 906) or (conc_cod = 934) ) THEN
      BEGIN
       entidad = :nitafp;
       IF (conc_cod = 904) THEN
       BEGIN
        SELECT A.paan_afptr FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
        VALOR = ((:valor) * :PORCEN) /100;
       END
       ELSE
       IF ((conc_cod = 905) OR (conc_cod = 906) or (conc_cod = 934)) THEN
       BEGIN
        SELECT A.paan_afpem FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
        VALOR = ((:valor) * :PORCEN) /100;
       END
      END
      ELSE
      IF ((conc_cod = 907) OR (conc_cod = 914) OR (conc_cod = 915) or (conc_cod = 938) ) THEN
      BEGIN
       entidad = :niteps;
       IF (conc_cod = 907) THEN
       BEGIN
        SELECT A.paan_epstr FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
        VALOR = ((:valor) * :PORCEN) /100;
       END
       ELSE
       IF ((conc_cod = 914) OR (conc_cod = 915) or (conc_cod = 938)) THEN
       BEGIN
        SELECT A.paan_epsem FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
        VALOR = ((:valor) * :PORCEN) /100;
       END
      END
      ELSE
      IF ((conc_cod = 910) OR (conc_cod = 911) OR (conc_cod = 916) OR (conc_cod = 917) OR (conc_cod = 918) OR (conc_cod = 919) or (conc_cod = 936) or (conc_cod = 939) or (conc_cod = 940)) THEN
      BEGIN
       entidad = :nitccf;
       IF ((conc_cod = 910) OR (conc_cod = 911) or (conc_cod = 936)) THEN
       BEGIN
        SELECT A.paan_ccf FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
        VALOR = ((:valor) * :PORCEN) /100;
       END
       ELSE
       IF ((conc_cod = 916) OR (conc_cod = 917) or (conc_cod = 939)) THEN
       BEGIN
        SELECT A.paan_icbf FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
        VALOR = ((:valor) * :PORCEN) /100;
       END
       ELSE
       IF ((conc_cod = 918) OR (conc_cod = 919) or (conc_cod = 940)) THEN
       BEGIN
        SELECT A.paan_sena FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
        VALOR = ((:valor) * :PORCEN) /100;
       END
      END
      ELSE
      IF ((conc_cod = 912) OR (conc_cod = 913)) THEN
      BEGIN
       entidad = :nitafc;
      EXECUTE PROCEDURE LEE_CONFIGURACION('NOMINA','LIQUIDACION','TOMAR BENEFICIOS PARA CALCULAR PROVISIONES')RETURNING_VALUES(:parambenef);
      if (parambenef = 'SI') then
      BEGIN
      SELECT SUM(ce.emco_monto)
      FROM empleado_conceptos CE, CONCEPTOS_NOMINA CN WHERE CN.conc_benefic = 'S' AND (CE.terc_nit = :nite) AND (CE.CONC_COD = CN.CONC_COD) AND
      ((CE.emco_fecini <= :fec AND CE.emco_fecfin >= :FEC) OR ((cn.conc_todosper = 'N') AND (CE.emco_ppago = :periodo)) OR
      (cn.conc_todosper = 'S'))
      INTO :beneficios;
      if (beneficios is null) then
       beneficios = 0;
      END
      ELSE
       beneficios = 0;
      SELECT P.paan_auxtr, P.paan_salminimo FROM PARAMETROS_ANO P WHERE P.paan_ano = :ano INTO :auxtrans, :smlv;
      if (:basico < (:smlv*2)) then
       auxtrans = (:auxtrans / 30) * :diaslab;
      ELSE
       auxtrans = 0;
       IF ((conc_cod = 912) OR (conc_cod = 913) or (conc_cod = 937)) THEN
       BEGIN
        SELECT A.paan_cesemp FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
        VALOR = ((:valor + :auxtrans + :beneficios) * :PORCEN) /100;
       END
      END
      ELSE
      BEGIN
       IF (comision IS NULL) THEN
       comision = 0;
       SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
       conc_monto = :basico + :comision;
       IF (conc_porc <> 0 AND conc_porc IS NOT NULL) THEN
       VALOR = (((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans + :incap) * :conc_porc) /100;
       ELSE
       IF (:porcen <> 0 AND :porcen IS NOT NULL) THEN
       VALOR = (((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans + :incap) * :porcen) /100;
       ELSE
       IF (:montos <> 0 AND :montos IS NOT NULL) THEN
       valor = :montos;
       ELSE
       IF (:conc_monto <> 0 AND :conc_monto IS NOT NULL) THEN
       valor = :conc_monto;
      END
     END
     item = :item + 1;
    END
    ELSE
    IF (conc_prov = 'S') THEN
    BEGIN
     horasex = NULL;
     diasnov = NULL;
     retroact = NULL;
     reembolso = NULL;
     beneficios = null;
     recargo = null;
     comision = null;
     incap = null;
     /*RECARGO*/
     SELECT E.empl_salario FROM EMPLEADOS E WHERE E.terc_nit = :nite INTO :basico;
     SELECT N.noex_recnoct, N.noex_recfest
     FROM NOMINA_HORASEXT N WHERE N.noex_periodio = :periodo AND N.noex_ano = :ano AND N.terc_nit = :nite
     INTO :recnoct, :recfest;
     if (recnoct is null) then
      recnoct = 0;
     if (recfest is null) then
      recfest = 0;
     SELECT P.paan_recnoc, P.paan_recfest FROM PARAMETROS_ANO P WHERE P.paan_ano = :ano INTO :tar_recnotc, :tar_recfest;
     recargo = (((:basico/30)/8)*:tar_recnotc)*:recnoct;
     recargo = :recargo + ((((:basico/30)/8)*:tar_recfest)*:recfest);
      /*INCAPACIDAD*/
      SELECT N.nono_dura FROM NOMINA_NOVEDADES N WHERE N.terc_nit = :nite AND N.nono_periodo = :periodo AND N.nono_ano = :ano AND (N.tnov_cod = 2 OR (N.tnov_cod = 3)) INTO :diasnov;
      IF (:diasnov IS NULL) THEN
      incap = 0;
      ELSE
      incap = (:basico / 30)* :diasnov;
     /*BASICO*/
     SELECT N.noex_recnoct, N.noex_recfest
     FROM NOMINA_HORASEXT N WHERE N.noex_periodio = :periodo AND N.noex_ano = :ano AND N.terc_nit = :nite
     INTO :recnoct, :recfest;
     if (recnoct is null) then
      recnoct = 0;
     if (recfest is null) then
      recfest = 0;
     SELECT P.paan_recnoc, P.paan_recfest FROM PARAMETROS_ANO P WHERE P.paan_ano = :ano INTO :tar_recnotc, :tar_recfest;
     basico = ((:basico/30)*:diaslab) - (((:basico/30)/8)*:recnoct);
     basico = :basico - (((:basico/30)/8)*:recfest);
     /*BENEFICIOS*/
     EXECUTE PROCEDURE LEE_CONFIGURACION('NOMINA','LIQUIDACION','TOMAR BENEFICIOS PARA CALCULAR PROVISIONES')RETURNING_VALUES(:parambenef);
     if (parambenef = 'SI') then
     BEGIN
      SELECT SUM(ce.emco_monto)
      FROM empleado_conceptos CE, CONCEPTOS_NOMINA CN WHERE CN.conc_benefic = 'S' AND (CE.terc_nit = :nite) AND (CE.CONC_COD = CN.CONC_COD) AND
      ((CE.emco_fecini <= :fec AND CE.emco_fecfin >= :FEC) OR ((cn.conc_todosper = 'N') AND (CE.emco_ppago = :periodo)) OR
      (cn.conc_todosper = 'S'))
      INTO :beneficios;
      if (beneficios is null) then
        beneficios = 0;
     END
     ELSE
      beneficios = 0;
     if ((conc_cod <> 929) and (conc_cod <> 930) and (conc_cod <> 944)) then
     begin
        SELECT P.paan_auxtr, P.paan_salminimo FROM PARAMETROS_ANO P WHERE P.paan_ano = :ano INTO :auxtrans, :smlv;
        if (:basico < (:smlv*2)) then
           auxtrans = (:auxtrans / 30) * :diaslab;
        ELSE
           auxtrans = 0;
     end
     else
      auxtrans = 0;
     conc_monto = :basico;
     IF (conc_porc <> 0 AND conc_porc IS NOT NULL) THEN
     VALOR = (((:CONC_MONTO)+ :cambsaltrans + :incap + :recargo + :auxtrans + :beneficios) * :conc_porc) /100;
     ELSE
     IF (porcen <> 0 AND porcen IS NOT NULL) THEN
     VALOR = (((:CONC_MONTO)+ :cambsaltrans + :incap + :recargo + :auxtrans + :beneficios) * :porcen) /100;
     ELSE
     IF (montos <> 0 AND montos IS NOT NULL) THEN
     VALOR = :montos;
     ELSE
     IF (conc_monto <> 0 AND conc_monto IS NOT NULL) THEN
     VALOR = :conc_monto;
     item = :item + 1;
    END
    ELSE
    IF (conc_cod = 920) THEN
    BEGIN
     SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :valor;
     IF (valor IS NULL) THEN
     valor = 0;
     item = :item + 1;
    END
    ELSE
    IF (conc_cod = 900 OR (:conc_cod = 931)) THEN
    BEGIN
     SELECT c.noex_monto FROM nomina_horasext c WHERE c.noex_ano = :ano AND c.noex_periodio = :periodo AND c.noex_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :valor;
     IF (valor IS NULL) THEN
     valor = 0;
     item = :item + 1;
    END
    ELSE
    IF (conc_cod = 932) THEN
    BEGIN
     SELECT N.nono_dura FROM NOMINA_NOVEDADES N WHERE N.terc_nit = :nite AND N.nono_periodo = :periodo AND N.nono_ano = :ano AND (N.tnov_cod = 2 OR (N.tnov_cod = 3)) INTO :diasnov;
     IF (:diasnov IS NULL) THEN
     valor = 0;
     ELSE
     valor = (:basico / 30)* :diasnov;
    END
    ELSE
    IF (conc_cod = 921) THEN
    BEGIN
     IF (porcen IS NOT NULL AND porcen <> 0) THEN
     valor = ((basico / 30)* :diaslab ) * :PORCEN /100;
     ELSE
     IF (conc_porc IS NOT NULL AND conc_porc <> 0) THEN
     valor = ((basico / 30)* :diaslab ) * :conc_porc /100;
    END
    ELSE
    if (conc_cod = 953) then
    BEGIN
       SELECT E.empl_salario FROM EMPLEADOS E WHERE E.terc_nit = :nite INTO :basico;
       SELECT N.noex_recnoct, N.noex_recfest
       FROM NOMINA_HORASEXT N WHERE N.noex_periodio = :periodo AND N.noex_ano = :ano AND N.terc_nit = :nite
       INTO :recnoct, :recfest;
       if (recnoct is null) then
        recnoct = 0;
       if (recfest is null) then
        recfest = 0;
       SELECT P.paan_recnoc, P.paan_recfest FROM PARAMETROS_ANO P WHERE P.paan_ano = :ano INTO :tar_recnotc, :tar_recfest;
       valor = (((:basico/30)/8)*:tar_recnotc)*:recnoct;
       valor = :valor + ((((:basico/30)/8)*:tar_recfest)*:recfest);
    END
    if (conc_aporte = 'S') then
    begin
    if (entidad is null or (entidad = '') ) then
    entidad = :conc_entidad;
    end
    EXECUTE PROCEDURE LEE_CONFIGURACION('NOMINA','GENERAL','REDONDEO AL MULTIPLO DE DIEZ EN TOTALES')RETURNING_VALUES(:aprox);
    EXECUTE PROCEDURE REDONDEE(:valor, :aprox) RETURNING_VALUES (VALOR);
    IF ((mensual = 'N') OR (periodicidad = 1))  THEN
    INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
    VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
    ELSE
    IF (mensual = 'S') THEN
    BEGIN
     IF ((:periodicidad = 2) AND (liquidaper = 1)) THEN
     BEGIN
      IF ((periodo = 1) OR (periodo = 3) OR (periodo = 5) OR (periodo = 7) OR (periodo = 9) OR (periodo = 11)
      OR (periodo = 13) OR (periodo = 15) OR (periodo = 17) OR (periodo = 19) OR (periodo = 21) OR (periodo = 23)) THEN
      INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
      VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
     END
     ELSE
     IF ((:periodicidad = 2) AND (liquidaper = 2)) THEN
     BEGIN
      IF ((periodo = 2) OR (periodo = 4) OR (periodo = 6) OR (periodo = 8) OR (periodo = 10) OR (periodo = 12)
      OR (periodo = 14) OR (periodo = 16) OR (periodo = 18) OR (periodo = 20) OR (periodo = 22) OR (periodo = 24)) THEN
      INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
      VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
     END
     ELSE
     IF ((:periodicidad = 3) AND (liquidaper = 1)) THEN
     BEGIN
      IF ((periodo = 1) OR (periodo = 5) OR (periodo = 9) OR (periodo = 13) OR (periodo = 17) OR (periodo = 21)
      OR (periodo = 25) OR (periodo = 29) OR (periodo = 33) OR (periodo = 37) OR (periodo = 41) OR (periodo = 45)
      OR (periodo = 49)) THEN
      INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
      VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
    END
    ELSE
     IF ((:periodicidad = 3) AND (liquidaper = 2)) THEN
     BEGIN
      IF ((periodo = 2) OR (periodo = 6) OR (periodo = 10) OR (periodo = 14) OR (periodo = 18) OR (periodo = 22)
      OR (periodo = 26) OR (periodo = 30) OR (periodo = 34) OR (periodo = 38) OR (periodo = 42) OR (periodo = 46)
      OR (periodo = 50)) THEN
      INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
      VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
     END
     ELSE
     IF ((:periodicidad = 3) AND (liquidaper = 3)) THEN
     BEGIN
      IF ((periodo = 3) OR (periodo = 7) OR (periodo = 11) OR (periodo = 15) OR (periodo = 19) OR (periodo = 23)
      OR (periodo = 27) OR (periodo = 31) OR (periodo = 35) OR (periodo = 39) OR (periodo = 43) OR (periodo = 47)
      OR (periodo = 51)) THEN
      INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
      VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
     END
     ELSE
     IF ((:periodicidad = 3) AND (liquidaper = 4)) THEN
     BEGIN
      IF ((periodo = 4) OR (periodo = 8) OR (periodo = 12) OR (periodo = 16) OR (periodo = 20) OR (periodo = 24)
      OR (periodo = 29) OR (periodo = 32) OR (periodo = 36) OR (periodo = 40) OR (periodo = 44) OR (periodo = 48)
      OR (periodo = 52)) THEN
      INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
      VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
     END
    END
  VALOR = 0;
  basico = 0;
  END
 END
 END
 END
 SUSPEND;
END
^

SET TERM ; ^

DELETE FROM PERIODO_PAGO_NOMBRE;

INSERT INTO PERIODO_PAGO_NOMBRE (PPAG_COD, PNOM_ITEM, PNOM_NOMBRE, PPAG_PERIODO) VALUES (1, 1, 'Enero', 1);
INSERT INTO PERIODO_PAGO_NOMBRE (PPAG_COD, PNOM_ITEM, PNOM_NOMBRE, PPAG_PERIODO) VALUES (1, 2, 'Febrero', 2);
INSERT INTO PERIODO_PAGO_NOMBRE (PPAG_COD, PNOM_ITEM, PNOM_NOMBRE, PPAG_PERIODO) VALUES (1, 3, 'Marzo', 3);
INSERT INTO PERIODO_PAGO_NOMBRE (PPAG_COD, PNOM_ITEM, PNOM_NOMBRE, PPAG_PERIODO) VALUES (1, 4, 'Abril', 4);
INSERT INTO PERIODO_PAGO_NOMBRE (PPAG_COD, PNOM_ITEM, PNOM_NOMBRE, PPAG_PERIODO) VALUES (1, 5, 'Mayo', 5);
INSERT INTO PERIODO_PAGO_NOMBRE (PPAG_COD, PNOM_ITEM, PNOM_NOMBRE, PPAG_PERIODO) VALUES (1, 6, 'Junio', 6);
INSERT INTO PERIODO_PAGO_NOMBRE (PPAG_COD, PNOM_ITEM, PNOM_NOMBRE, PPAG_PERIODO) VALUES (1, 7, 'Julio', 7);
INSERT INTO PERIODO_PAGO_NOMBRE (PPAG_COD, PNOM_ITEM, PNOM_NOMBRE, PPAG_PERIODO) VALUES (1, 8, 'Agosto', 8);
INSERT INTO PERIODO_PAGO_NOMBRE (PPAG_COD, PNOM_ITEM, PNOM_NOMBRE, PPAG_PERIODO) VALUES (1, 9, 'Septiembre', 9);
INSERT INTO PERIODO_PAGO_NOMBRE (PPAG_COD, PNOM_ITEM, PNOM_NOMBRE, PPAG_PERIODO) VALUES (1, 10, 'Octubre', 10);
INSERT INTO PERIODO_PAGO_NOMBRE (PPAG_COD, PNOM_ITEM, PNOM_NOMBRE, PPAG_PERIODO) VALUES (1, 11, 'Noviembre', 11);
INSERT INTO PERIODO_PAGO_NOMBRE (PPAG_COD, PNOM_ITEM, PNOM_NOMBRE, PPAG_PERIODO) VALUES (1, 12, 'Dciembre', 12);
INSERT INTO PERIODO_PAGO_NOMBRE (PPAG_COD, PNOM_ITEM, PNOM_NOMBRE, PPAG_PERIODO) VALUES (2, 1, '1 al 15 enero', 1);
INSERT INTO PERIODO_PAGO_NOMBRE (PPAG_COD, PNOM_ITEM, PNOM_NOMBRE, PPAG_PERIODO) VALUES (2, 2, '16 al 31 enero', 2);
INSERT INTO PERIODO_PAGO_NOMBRE (PPAG_COD, PNOM_ITEM, PNOM_NOMBRE, PPAG_PERIODO) VALUES (2, 5, '1 al 15 febrero', 3);
INSERT INTO PERIODO_PAGO_NOMBRE (PPAG_COD, PNOM_ITEM, PNOM_NOMBRE, PPAG_PERIODO) VALUES (2, 6, '16 al 28 febrero', 4);
INSERT INTO PERIODO_PAGO_NOMBRE (PPAG_COD, PNOM_ITEM, PNOM_NOMBRE, PPAG_PERIODO) VALUES (2, 7, '1 al 15 marzo', 5);
INSERT INTO PERIODO_PAGO_NOMBRE (PPAG_COD, PNOM_ITEM, PNOM_NOMBRE, PPAG_PERIODO) VALUES (2, 8, '16 al 31 marzo', 6);
INSERT INTO PERIODO_PAGO_NOMBRE (PPAG_COD, PNOM_ITEM, PNOM_NOMBRE, PPAG_PERIODO) VALUES (2, 9, '1 al 15 abril', 7);
INSERT INTO PERIODO_PAGO_NOMBRE (PPAG_COD, PNOM_ITEM, PNOM_NOMBRE, PPAG_PERIODO) VALUES (2, 10, '16 al 30 abril', 8);
INSERT INTO PERIODO_PAGO_NOMBRE (PPAG_COD, PNOM_ITEM, PNOM_NOMBRE, PPAG_PERIODO) VALUES (2, 11, '1 al 15 mayo', 9);
INSERT INTO PERIODO_PAGO_NOMBRE (PPAG_COD, PNOM_ITEM, PNOM_NOMBRE, PPAG_PERIODO) VALUES (2, 12, '16 al 31 mayo', 10);
INSERT INTO PERIODO_PAGO_NOMBRE (PPAG_COD, PNOM_ITEM, PNOM_NOMBRE, PPAG_PERIODO) VALUES (2, 13, '1 al 15 junio', 11);
INSERT INTO PERIODO_PAGO_NOMBRE (PPAG_COD, PNOM_ITEM, PNOM_NOMBRE, PPAG_PERIODO) VALUES (2, 14, '16 al 28 junio', 12);
INSERT INTO PERIODO_PAGO_NOMBRE (PPAG_COD, PNOM_ITEM, PNOM_NOMBRE, PPAG_PERIODO) VALUES (2, 15, '1 al 15 julio', 13);
INSERT INTO PERIODO_PAGO_NOMBRE (PPAG_COD, PNOM_ITEM, PNOM_NOMBRE, PPAG_PERIODO) VALUES (2, 16, '16 al 31 julio', 14);
INSERT INTO PERIODO_PAGO_NOMBRE (PPAG_COD, PNOM_ITEM, PNOM_NOMBRE, PPAG_PERIODO) VALUES (2, 17, '1 al 15 agosto', 15);
INSERT INTO PERIODO_PAGO_NOMBRE (PPAG_COD, PNOM_ITEM, PNOM_NOMBRE, PPAG_PERIODO) VALUES (2, 18, '16 al 30 agosto', 16);
INSERT INTO PERIODO_PAGO_NOMBRE (PPAG_COD, PNOM_ITEM, PNOM_NOMBRE, PPAG_PERIODO) VALUES (2, 19, '1 al 15 septiembre', 17);
INSERT INTO PERIODO_PAGO_NOMBRE (PPAG_COD, PNOM_ITEM, PNOM_NOMBRE, PPAG_PERIODO) VALUES (2, 20, '16 al 31 septiembre', 18);
INSERT INTO PERIODO_PAGO_NOMBRE (PPAG_COD, PNOM_ITEM, PNOM_NOMBRE, PPAG_PERIODO) VALUES (2, 21, '1 al 15 octubre', 19);
INSERT INTO PERIODO_PAGO_NOMBRE (PPAG_COD, PNOM_ITEM, PNOM_NOMBRE, PPAG_PERIODO) VALUES (2, 22, '16 al 28 octubre', 20);
INSERT INTO PERIODO_PAGO_NOMBRE (PPAG_COD, PNOM_ITEM, PNOM_NOMBRE, PPAG_PERIODO) VALUES (2, 23, '1 al 15 noviembre', 21);
INSERT INTO PERIODO_PAGO_NOMBRE (PPAG_COD, PNOM_ITEM, PNOM_NOMBRE, PPAG_PERIODO) VALUES (2, 24, '16 al 31 noviembre', 22);
INSERT INTO PERIODO_PAGO_NOMBRE (PPAG_COD, PNOM_ITEM, PNOM_NOMBRE, PPAG_PERIODO) VALUES (2, 25, '1 al 15 diciembre', 23);
INSERT INTO PERIODO_PAGO_NOMBRE (PPAG_COD, PNOM_ITEM, PNOM_NOMBRE, PPAG_PERIODO) VALUES (2, 26, '16 al 30 diciembre', 24);

DELETE FROM IMPORTACION_INVENTARIO I WHERE I.imin_dato = 'ADMI_INTDIA';

ALTER TABLE VENDEDORES ADD VEND_NIT NIT;

UPDATE VENDEDORES V SET V.vend_cc = V.vend_nit WHERE V.vend_cc IS NULL;

SET TERM ^ ;

CREATE OR ALTER PROCEDURE CALCULA_COMISIONES_NOMINA (
    fecini date,
    fecfin date,
    periodicidad integer,
    periodo integer,
    ano char(4))
returns (
    idcomi integer)
as
declare variable dtomonto numeric(18,2);
declare variable ivamonto numeric(18,2);
declare variable extra numeric(18,2);
declare variable total numeric(18,2);
declare variable base numeric(18,2);
declare variable basedev numeric(18,2);
declare variable sitot char(2);
declare variable comimontodev numeric(18,2);
declare variable idfact integer;
declare variable consumo numeric(18,2);
declare variable item integer;
declare variable codvend integer;
declare variable comimonto numeric(18,2);
declare variable comiporc numeric(9,2);
declare variable vendnit varchar(20);
declare variable existe numeric(18,2);
BEGIN
EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION', 'VENDEDORES', 'COMISIONES EN VENTA INCLUYENDO IMPUESTOS') RETURNING_VALUES (:SITOT);
ITEM = 1;
FOR SELECT VEND_COD, VEND_CC
    FROM VENDEDORES, EMPLEADOS E
    WHERE /*VEND_COD >= :DESDE AND VEND_COD <= :HASTA AND*/ VEND_CC = E.terc_nit
    AND E.EMPL_FECING >= :FECINI AND E.EMPL_FECING <= :FECFIN
    INTO :CODVEND, :VENDNIT
    DO  
    BEGIN
    FOR SELECT  SUM(FACT_TOTAL), SUM(FACT_EXTRA), SUM(FACT_IVAMONTO), SUM(FACT_COMIPORC), SUM(FACT_COMIMONTO), SUM(FADE_CONSUMO)
        FROM FACTURAS f, facturas_detalle d WHERE F.FACT_ID = D.FACT_ID AND VEND_COD = :CODVEND AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND FACT_ANULADO = 'N'
        GROUP BY F.vend_cod
        INTO :TOTAL, :EXTRA, :IVAMONTO, :COMIPORC, :COMIMONTO, :CONSUMO
        DO
        BEGIN
        IF (COMIPORC <> 0) THEN
            BEGIN
            BASE = :comimonto * 100 / :comiporc;
            EXECUTE PROCEDURE redondee(:BASE, 0) RETURNING_VALUES (:BASE);
            END
        ELSE
            IF (SITOT = 'SI') THEN
                BASE = TOTAL;
            ELSE
                BASE = TOTAL - EXTRA - IVAMONTO - CONSUMO;
        END
    FOR SELECT MAX(DEVT_DTOMONTO), MAX(DEVT_IVAMONTO), MAX(DEVT_EXTRA), MAX(DEVT_TOTAL), MAX(DEVT_COMIPORC), MAX(DEVT_COMIMONTO), MAX(DEVT_FACTID), SUM(DVDE_CONSUMO)
        FROM DEVOLUCIONES_VENTAS V, DEVOLUCIONES_VENTAS_DETALLE D WHERE V.DEVT_ID = D.DEVT_ID AND VEND_COD = :CODVEND AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND DEVT_ANULADO = 'N'
        GROUP BY v.DEVT_ID
        INTO  :DTOMONTO,:IVAMONTO, :EXTRA, :TOTAL, :COMIPORC, :COMIMONTO, :IDFACT, :CONSUMO
        DO
        BEGIN
        IF (COMIPORC <> 0) THEN
            BEGIN
            BASEDEV = :comimontodev * 100 / :comiporc;
            EXECUTE PROCEDURE redondee(:BASE, 0) RETURNING_VALUES (:BASE);
            END
        ELSE
            IF (SITOT = 'SI') THEN
                BASEDEV = TOTAL;
            ELSE
                BASEDEV = TOTAL - EXTRA - IVAMONTO - CONSUMO;
        BASEDEV = BASEDEV * -1;
        COMIMONTODEV = COMIMONTODEV * -1;
        END
     IF (comimonto IS NULL) THEN
        comimonto = 0;
     IF (comimontodev IS NULL) THEN
        comimontodev = 0;
    comimonto = :comimonto + :comimontodev;
    SELECT N.ncom_monto, n.ncom_id FROM NOMINA_COMISIONES N WHERE N.terc_nit = :vendnit AND N.ncom_ano = :ano AND N.ncom_periodicidad = :periodicidad AND N.ncom_periodo = :periodo INTO :existe, :idcomi;
    IF (EXISTE IS NULL) THEN
    BEGIN
    idcomi = GEN_ID(id_nomicomi,1);
    INSERT INTO NOMINA_COMISIONES  (ncom_id, ncom_item, ncom_periodicidad, terc_nit, ncom_ano, ncom_periodo, ncom_monto, ncom_fecdesde, ncom_fechasta)
                             VALUES(:idcomi,:item,:periodicidad, :vendnit, :ano, :periodo, :comimonto, :fecini, :fecfin);
    END
    ELSE
    UPDATE NOMINA_COMISIONES N SET N.ncom_monto = :existe + :comimonto WHERE N.terc_nit = :vendnit AND N.ncom_ano = :ano AND N.ncom_periodicidad = :periodicidad AND N.ncom_periodo = :periodo;
    ITEM = ITEM + 1;
    END
    SUSPEND;
END
^

SET TERM ; ^

ALTER TABLE VENDEDORES DROP VEND_NIT;


CREATE TABLE NOMINA_VALOR_PREDET (
    NVPR_ID            INTEGER NOT NULL,
    NVPR_ITEM          INTEGER NOT NULL,
    NVPR_PERIODICIDAD  INTEGER,
    TERC_NIT           NIT,
    NVPR_ANO           ANO,
    NVPR_PERIODO       INTEGER,
    NVPR_MONTO         MONTO,
    CONC_COD           INTEGER NOT NULL
);

ALTER TABLE NOMINA_VALOR_PREDET ADD CONSTRAINT PK_NOMINA_VALPREDET PRIMARY KEY (NVPR_ID, NVPR_ITEM);

ALTER TABLE NOMINA_VALOR_PREDET ADD CONSTRAINT FK_NOMINA_VALORPREDET FOREIGN KEY (TERC_NIT) REFERENCES TERCEROS (TERC_NIT);

SET TERM ^ ;

CREATE OR ALTER PROCEDURE CAUSA_NOMINA (
    fec date,
    periodo integer,
    periodicidad integer,
    pagoglobal char(1),
    ano char(4),
    depto integer)
returns (
    idnomina integer,
    itemini integer)
as
declare variable item integer;
declare variable nite varchar(20) character set none;
declare variable nit_tercero varchar(20);
declare variable concept integer;
declare variable montos numeric(18,2);
declare variable porcen numeric(9,4);
declare variable entidad varchar(20);
declare variable conc_cod integer;
declare variable conc_deduc char(1);
declare variable conc_porc numeric(9,4);
declare variable conc_entidad integer;
declare variable conc_monto numeric(18,2);
declare variable conc_modifi char(1);
declare variable conc_promedio char(1);
declare variable emco_perprom integer;
declare variable valor numeric(18,2);
declare variable diaslab integer;
declare variable conc_prov char(1);
declare variable conc_aporte char(1);
declare variable numeroprom integer;
declare variable conc_aplicaprom char(1);
declare variable perinicial integer;
declare variable anoprom integer;
declare variable conc_dias char(1);
declare variable conc_otroconc char(1);
declare variable conc_codotroconc integer;
declare variable anosum integer;
declare variable salario char(1) character set none;
declare variable liquidaper integer;
declare variable rmod numeric(2,2);
declare variable basico numeric(18,2);
declare variable niteps varchar(20);
declare variable nitafc varchar(20);
declare variable nitafp varchar(20);
declare variable nitccf varchar(20);
declare variable gtoempr char(1);
declare variable comision numeric(18,2);
declare variable cambsaltrans numeric(18,2);
declare variable saldosini numeric(18,2);
declare variable duranov integer;
declare variable base numeric(18,2);
declare variable aprox integer;
declare variable mensual char(1);
declare variable horasex numeric(18,2);
declare variable diasnov integer;
declare variable tomasal integer;
declare variable retroact numeric(18,2);
declare variable reembolso numeric(18,2);
declare variable incap numeric(18,2);
declare variable deptoempl integer;
declare variable auxtrans numeric(18,2);
declare variable smlv numeric(18,2);
declare variable beneficios numeric(18,2);
declare variable confirmado char(1);
declare variable recnoct numeric(18,2);
declare variable recfest numeric(18,2);
declare variable tar_recnotc numeric(9,4);
declare variable tar_recfest numeric(9,4);
declare variable recargo numeric(18,2);
declare variable basicorec numeric(18,2);
declare variable parambenef char(2);
declare variable vacacdisf numeric(18,2);
declare variable valorpredet NUMERIC(18,2);
BEGIN
 SELECT N.NOMI_ID, N.nomi_liqok FROM NOMINA N WHERE N.nomi_periodo = :periodo AND N.nomi_periodocidad = :periodicidad AND N.nomi_ano = :ano
 INTO :IDNOMINA, :CONFIRMADO;
 IF (:idnomina IS NULL) THEN
 BEGIN
  EXECUTE PROCEDURE cambie_id_nomina RETURNING_VALUES(:idnomina);
  INSERT INTO nomina (nomi_id, NOMI_FECCAUSA, NOMI_PAGOGLOBAL, NOMI_PERIODOCIDAD, NOMI_PERIODO, NOMI_ANO, NOMI_LIQOK)
  VALUES (:IDNOMINA, :fec,:pagoglobal, :periodicidad, :periodo, :ano, 'N');
  item = 1;
 END
 ELSE
 BEGIN
  SELECT MAX(N.noco_item) FROM NOMINA_CONCEPTOS N WHERE N.nomi_id = :idnomina
  INTO :item;
 END
 if ((confirmado = 'S') AND (idnomina IS NOT NULL)) then
 BEGIN
  idnomina = 0;
 END
 else
 begin
 IF (DEPTO = 0) THEN
  INSERT INTO NOMINA_DEPARTAMENTO (nomi_id, nodp_depto)VALUES(:IDNOMINA,0);
 ELSE
  INSERT INTO NOMINA_DEPARTAMENTO (nomi_id, nodp_depto)VALUES(:IDNOMINA,:DEPTO);
 ITEMINI = ITEM;
 FOR SELECT E.TERC_NIT, E.empl_salario, e.empl_eps, e.empl_afc, e.empl_afp, e.empl_ccf, e.empl_dpto
 FROM EMPLEADOS E
 WHERE E.empl_ppago = :periodicidad AND ((E.empl_fecret IS NULL) OR (E.empl_fecret > :fec)) AND E.empl_fecing <= :fec
 INTO :nite, :basico, :niteps, :nitafc, :nitafp, :nitccf, :deptoempl
 DO
 BEGIN
 IF ((depto = 0) OR (deptoempl = :depto)) THEN
 BEGIN
  FOR SELECT CE.TERC_NIT, CE.CONC_COD, CE.EMCO_MONTO, CE.EMCO_PORC, ce.empl_entidad, CE.emco_perprom, CE.emco_luquidaper, CE.emco_mensual, CN.CONC_COD, CN.CONC_DEDUC,CN.CONC_PORC, CN.CONC_ENTIDAD, CN.CONC_MONTO,  CN.CONC_DIAS, CN.CONC_MODIFI,
  CN.CONC_PROMEDIO, CN.conc_salario, CE.emco_perprom, CN.conc_prov, CN.conc_aporte, CN.conc_aplicaprom, cn.conc_otroconc, cn.conc_codotroconc, CN.conc_gtoempr, CN.conc_base, CE.emco_tomsal
  FROM empleado_conceptos CE, CONCEPTOS_NOMINA CN WHERE (CE.CONC_COD = CN.CONC_COD) AND (CE.terc_nit = :nite) AND
  (((CE.emco_fecini <= :fec AND CE.emco_fecfin >= :FEC)) OR
  ((cn.conc_todosper = 'N') AND (CE.emco_ppago = :periodo)) OR (cn.conc_todosper = 'S'))  ORDER BY (TERC_NIT )
  INTO :nit_tercero, :concept,  :montos, :porcen, :entidad, :numeroprom, :liquidaper, :mensual ,:CONC_COD, :CONC_DEDUC, :CONC_PORC,
  :CONC_ENTIDAD, :CONC_MONTO, :CONC_DIAS, :CONC_MODIFI,:CONC_PROMEDIO, :salario,:EMCO_PERPROM, :conc_prov, :conc_aporte , :CONC_APLICAPROM, :conc_otroconc, :conc_codotroconc, :gtoempr, :base, :tomasal
  DO
  BEGIN
   IF (conc_dias = 'S') THEN
    EXECUTE PROCEDURE DIAS_LABORADOS (:nite, :periodo, :fec, :mensual,:conc_aporte) RETURNING_VALUES (:diaslab);
   ELSE
    diaslab = 15;
/*   IF (mensual = 'S') THEN
   BEGIN
    diaslab = 30;
   END
*/   IF (:tomasal <> 0) THEN
   BEGIN
    IF ((:periodicidad = 2) AND (:tomasal <> 2)) THEN
    BEGIN
     IF ((periodo = 2) OR (periodo = 4) OR (periodo = 6) OR (periodo = 8) OR (periodo = 10) OR (periodo = 12)
     OR (periodo = 14) OR (periodo = 16) OR (periodo = 18) OR (periodo = 20) OR (periodo = 22) OR (periodo = 24)) THEN
     basico = 0;
    END
    ELSE
    IF ((:periodicidad = 3) AND (:tomasal <> 1)) THEN
    BEGIN
     IF ((periodo = 1) OR (periodo = 5) OR (periodo = 9) OR (periodo = 13) OR (periodo = 17) OR (periodo = 21)
     OR (periodo = 25) OR (periodo = 29) OR (periodo = 33) OR (periodo = 37) OR (periodo = 41) OR (periodo = 45)
     OR (periodo = 49)) THEN
     basico = 0;
    END
    ELSE
     IF ((:periodicidad = 3) AND (:tomasal <> 2)) THEN
     BEGIN
      IF ((periodo = 2) OR (periodo = 6) OR (periodo = 10) OR (periodo = 14) OR (periodo = 18) OR (periodo = 22)
      OR (periodo = 26) OR (periodo = 30) OR (periodo = 34) OR (periodo = 38) OR (periodo = 42) OR (periodo = 46)
      OR (periodo = 50)) THEN
      basico = 0;
     END
     ELSE
     IF ((:periodicidad = 3) AND (:tomasal <> 3)) THEN
     BEGIN
      IF ((periodo = 3) OR (periodo = 7) OR (periodo = 11) OR (periodo = 15) OR (periodo = 19) OR (periodo = 23)
      OR (periodo = 27) OR (periodo = 31) OR (periodo = 35) OR (periodo = 39) OR (periodo = 43) OR (periodo = 47)
      OR (periodo = 51)) THEN
      basico = 0;
     END
     ELSE
     IF ((:periodicidad = 3) AND (:tomasal <> 4)) THEN
     BEGIN
      IF ((periodo = 4) OR (periodo = 8) OR (periodo = 12) OR (periodo = 16) OR (periodo = 20) OR (periodo = 24)
      OR (periodo = 29) OR (periodo = 32) OR (periodo = 36) OR (periodo = 40) OR (periodo = 44) OR (periodo = 48)
      OR (periodo = 52)) THEN
      basico = 0;
     END
   END
   ELSE
    BEGIN
     SELECT E.empl_salario FROM EMPLEADOS E WHERE E.terc_nit = :nite INTO :basico;
    END
    valorpredet = NULL;
    SELECT VP.nvpr_monto FROM NOMINA_VALOR_PREDET VP WHERE VP.nvpr_periodicidad = :periodicidad AND VP.nvpr_periodo = :periodo AND VP.nvpr_ano = :ano AND vp.conc_cod = :conc_cod AND vp.terc_nit = :nite
    INTO :valorpredet;
    IF ((:valorpredet <> 0) AND (valorpredet IS NOT NULL)) THEN
     valor = valorpredet;
    ELSE
    BEGIN
    SELECT ((n.nono_valor /30) * n.nono_dura), (n.nono_dura) FROM nomina_novedades n WHERE n.tnov_cod = 11 AND n.terc_nit = :nite AND n.nono_periodo = :periodo INTO :cambsaltrans, :duranov;
    IF (cambsaltrans IS NULL) THEN
    cambsaltrans = 0;
    IF (duranov IS NULL) THEN
    duranov = 0;
    diaslab = :diaslab - :duranov;
    IF (conc_cod = 922) THEN
    BEGIN
     SELECT SUM(P.prcu_monto) FROM prestamo_cuotas P, prestamo_nomina PN WHERE P.prcu_ano = :ano AND P.prcu_periodo = :periodo AND PN.prno_id = P.prno_id AND PN.terc_nit = :nite INTO :valor;
     IF (valor IS NULL) THEN
     valor = 0;
     item = :item + 1;
     UPDATE prestamo_cuotas  P SET prcu_ok = 'S' WHERE P.prcu_ano = :ano AND P.prcu_periodo = :periodo AND P.prno_id = (SELECT PN.prno_id FROM PRESTAMO_NOMINA PN WHERE PN.terc_nit = :nite);
    END
    ELSE
    IF ((:montos = 0) OR (:montos IS NULL)) THEN
    BEGIN
     IF ((CONC_PORC = 0 AND :porcen = 0) OR (CONC_PORC IS NULL AND :porcen = 0) OR (CONC_PORC = 0 AND :porcen IS NULL) OR (CONC_PORC IS NULL AND :porcen IS NULL) ) THEN
     BEGIN
      IF ((conc_monto <> 0) AND (conc_monto IS NOT NULL) ) THEN
      BEGIN
       VALOR = :CONC_MONTO;
       IF (:conc_dias = 'S') THEN
       valor = (:valor / 30) * :diaslab;
      END
      ELSE
      IF (salario = 'S' AND CONC_COD <> 900 AND CONC_COD <> 920 and conc_cod <> 932 AND CONC_COD <> 953) THEN
      BEGIN
       SELECT E.empl_salario FROM EMPLEADOS E WHERE E.terc_nit = :nite INTO :basico;
       SELECT N.noex_recnoct, N.noex_recfest
       FROM NOMINA_HORASEXT N WHERE N.noex_periodio = :periodo AND N.noex_ano = :ano AND N.terc_nit = :nite
       INTO :recnoct, :recfest;
       if (recnoct is null) then
        recnoct = 0;
       if (recfest is null) then
        recfest = 0;
       SELECT P.paan_recnoc, P.paan_recfest FROM PARAMETROS_ANO P WHERE P.paan_ano = :ano INTO :tar_recnotc, :tar_recfest;
       basico = ((:basico/30)*:diaslab) - (((:basico/30)/8)*:recnoct);
       basico = :basico - (((:basico/30)/8)*:recfest);
       conc_monto = :basico;
       VALOR = (:conc_monto/*/30 * :diaslab*/ ) + :cambsaltrans;
      END
      ELSE
      BEGIN
       valor = montos;
       IF (:conc_dias = 'S') THEN
       valor = (:valor / 30) * :diaslab;
      END
     END
     ELSE
     BEGIN
      IF (:porcen <> 0) THEN
      BEGIN
       IF ((conc_monto <> 0) AND (conc_monto IS NOT NULL) ) THEN
       BEGIN
        VALOR = ((:CONC_MONTO ) * :PORCEN) /100;
       END
      END
      ELSE
      BEGIN
       IF ((conc_monto <> 0) AND (conc_monto IS NOT NULL) ) THEN
       BEGIN
        VALOR = ((:CONC_MONTO) * :conc_porc) /100;
       END
       ELSE
       IF (salario = 'S' AND CONC_COD <> 900 AND CONC_COD <> 920 and conc_cod <> 932 AND CONC_COD <> 953) THEN
       BEGIN
       SELECT E.empl_salario FROM EMPLEADOS E WHERE E.terc_nit = :nite INTO :basico;
       SELECT N.noex_recnoct, N.noex_recfest
       FROM NOMINA_HORASEXT N WHERE N.noex_periodio = :periodo AND N.noex_ano = :ano AND N.terc_nit = :nite
       INTO :recnoct, :recfest;
       if (recnoct is null) then
        recnoct = 0;
       if (recfest is null) then
        recfest = 0;
       SELECT P.paan_recnoc, P.paan_recfest FROM PARAMETROS_ANO P WHERE P.paan_ano = :ano INTO :tar_recnotc, :tar_recfest;
       basico = ((:basico/30)*:diaslab) - (((:basico/30)/8)*:recnoct);
       basico = :basico - (((:basico/30)/8)*:recfest);
        conc_monto = :basico;
        VALOR = ((:CONC_MONTO)+ :cambsaltrans * :conc_porc) /100;
       END
       ELSE
       IF (:conc_monto = 0 AND :montos = 0) THEN
       BEGIN
        conc_monto = :basico;
        VALOR = (((:CONC_MONTO / 30) * :diaslab) + :cambsaltrans * :conc_porc) /100;
       END
      END
     END
    END
    ELSE
    IF ((CONC_PORC = 0 OR (conc_porc IS NULL)) AND (:porcen = 0 OR (porcen IS NULL))) THEN
    BEGIN
     VALOR = (:montos);
     IF (:conc_dias = 'S') THEN
     valor = (:valor / 30) * :diaslab;
    END
    ELSE
    IF (:porcen <> 0 AND porcen IS NOT NULL) THEN
    BEGIN
     VALOR = ((:MONTOS ) * :PORCEN) /100;
    END
    ELSE
    BEGIN
     VALOR = ((:montos) * :CONC_PORC) /100;
    END
    IF (conc_promedio = 'S') THEN
    BEGIN
     perinicial = :periodo - (:numeroprom) + 1;
     anoprom = CAST (ano AS INTEGER);
     IF (perinicial <= 0) THEN
     BEGIN
      perinicial = 1;
      anoprom = CAST(ANO AS INTEGER) - 1;
     END
     SELECT SUM (noco_valor) FROM nomina_conceptos n WHERE n.noco_aplicaprom = 'S' AND N.noco_periodo >= :perinicial - 1 AND N.noco_periodo < :periodo AND N.noco_ano >= :anoprom AND N.noco_ano <= :ano AND terc_nit = :nite INTO :valor;
     valor = ((valor ) / (numeroprom -1 ));
     SELECT NOCO_VALOR FROM NOMINA_CONCEPTOS WHERE CONC_COD = :conc_cod AND TERC_NIT  = :nite AND NOCO_PAGOOK = 'N' AND NOCO_PERIODO = 0 INTO :saldosini;
     IF (saldosini IS NULL) THEN
     saldosini = 0;
     ELSE
     UPDATE nomina_conceptos N SET noco_pagook = 'S' WHERE n.noco_aplicaprom = 'S' AND N.noco_periodo >= :perinicial - 1 AND N.noco_periodo < :periodo AND N.noco_ano >= :anoprom AND N.noco_ano <= :ano  AND CONC_COD = :conc_cod AND terc_nit = :nite AND NOCO_PERIODO = 0;
     VALOR = :valor + :saldosini;
     UPDATE nomina_conceptos N SET noco_pagook = 'S' WHERE n.noco_aplicaprom = 'S' AND N.noco_periodo >= :perinicial - 1 AND N.noco_periodo < :periodo AND N.noco_ano >= :anoprom AND N.noco_ano <= :ano  AND CONC_COD = :conc_cod AND terc_nit = :nite;
    END
    ELSE
    IF (conc_otroconc = 'S') THEN
    BEGIN
     anosum = CAST(ano AS INTEGER);
     anosum = anosum - 1;
     SELECT SUM (noco_valor) FROM nomina_conceptos n WHERE n.noco_ano = :anosum AND n.conc_cod = :conc_codotroconc AND N.terc_nit = :nite INTO :valor;
     SELECT NOCO_VALOR FROM NOMINA_CONCEPTOS WHERE noco_ano = :anosum AND conc_cod = :conc_codotroconc AND terc_nit = :nite AND NOCO_PERIODO = 0 INTO :saldosini;
     IF (saldosini IS NULL) THEN
     saldosini = 0;
     ELSE
     UPDATE nomina_conceptos SET noco_pagook = 'S' WHERE noco_ano = :anosum AND conc_cod = :conc_codotroconc AND NOCO_PERIODO = 0 AND terc_nit = :nite;
     VALOR = :valor + :saldosini;
     UPDATE nomina_conceptos SET noco_pagook = 'S' WHERE noco_ano = :anosum AND conc_cod = :conc_codotroconc AND terc_nit = :nite;
    END
    ELSE
    IF (conc_aporte = 'S') THEN
    BEGIN
     horasex = NULL;
     diasnov = NULL;
     retroact = NULL;
     reembolso = NULL;
     beneficios = null;
     recargo = null;
     comision = null;
     incap = null;
     vacacdisf = null;
     IF ((:entidad = '' ) OR (entidad IS NULL)) THEN
     BEGIN
      /*COMISIONES*/
      SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
      IF (comision IS NULL) THEN
      comision = 0;
      /*RETROACTIVO*/
      SELECT C.emco_monto FROM EMPLEADO_CONCEPTOS C WHERE C.terc_nit = :nite AND C.conc_cod = 933 INTO :retroact;
      IF (retroact IS NULL ) THEN
      retroact = 0;
      /*REEMBOLSO*/
      SELECT C.emco_monto FROM EMPLEADO_CONCEPTOS C WHERE C.terc_nit = :nite AND C.conc_cod = 952 INTO :reembolso;
      IF (reembolso IS NULL ) THEN
      reembolso = 0;
      /*VACACIONES DISFRUTADAS ANTERIORMENTE*/
      SELECT C.emco_monto FROM EMPLEADO_CONCEPTOS C WHERE C.terc_nit = :nite AND C.conc_cod = 955 INTO :vacacdisf;
      IF (vacacdisf IS NULL ) THEN
      vacacdisf = 0;
      /*INCAPACIDAD*/
      SELECT N.nono_dura FROM NOMINA_NOVEDADES N WHERE N.terc_nit = :nite AND N.nono_periodo = :periodo AND N.nono_ano = :ano AND (N.tnov_cod = 2 OR (N.tnov_cod = 3)) INTO :diasnov;
      IF (:diasnov IS NULL) THEN
      incap = 0;
      ELSE
      incap = (:basico / 30)* :diasnov;
      /*BASICO*/
      SELECT N.noex_recnoct, N.noex_recfest
      FROM NOMINA_HORASEXT N WHERE N.noex_periodio = :periodo AND N.noex_ano = :ano AND N.terc_nit = :nite
      INTO :recnoct, :recfest;
      if (recnoct is null) then
       recnoct = 0;
      if (recfest is null) then
       recfest = 0;
      SELECT P.paan_recnoc, P.paan_recfest FROM PARAMETROS_ANO P WHERE P.paan_ano = :ano INTO :tar_recnotc, :tar_recfest;
      basico = ((:basico/30)*:diaslab) - (((:basico/30)/8)*:recnoct);
      basico = :basico - (((:basico/30)/8)*:recfest);
      /*HORAS EXTRA*/
      SELECT c.noex_monto FROM nomina_horasext c WHERE c.noex_ano = :ano AND c.noex_periodio = :periodo AND c.noex_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :horasex;
      if (horasex is null) then
       horasex = 0;
      /*RECARGOS*/
      SELECT E.empl_salario FROM EMPLEADOS E WHERE E.terc_nit = :nite INTO :basicorec;
      SELECT N.noex_recnoct, N.noex_recfest
      FROM NOMINA_HORASEXT N WHERE N.noex_periodio = :periodo AND N.noex_ano = :ano AND N.terc_nit = :nite
      INTO :recnoct, :recfest;
      if (recnoct is null) then
       recnoct = 0;
      if (recfest is null) then
       recfest = 0;
      SELECT P.paan_recnoc, P.paan_recfest FROM PARAMETROS_ANO P WHERE P.paan_ano = :ano INTO :tar_recnotc, :tar_recfest;
      recargo = (((:basicorec/30)/8)*:tar_recnotc)*:recnoct;
      recargo = :recargo + ((((:basicorec/30)/8)*:tar_recfest)*:recfest);
      /*basico*/
      if (:basico + :comision + :horasex + :retroact+ :reembolso + :incap+ :cambsaltrans < ((:smlv/30)*:diaslab)) then
      comision = :smlv + :comision;
      /*SMLV Y AUX. TRANSPORTE*/
      SELECT P.paan_auxtr, P.paan_salminimo FROM PARAMETROS_ANO P WHERE P.paan_ano = :ano INTO :auxtrans, :smlv;
      /*BASE*/
      valor = :basico + :comision + :horasex + :retroact+ :reembolso + :incap + :recargo + :cambsaltrans + :vacacdisf;
      IF ((conc_cod = 904) OR (conc_cod = 905) OR (conc_cod = 906) or (conc_cod = 934) ) THEN
      BEGIN
       entidad = :nitafp;
       IF (conc_cod = 904) THEN
       BEGIN
        SELECT A.paan_afptr FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
        VALOR = ((:valor) * :PORCEN) /100;
       END
       ELSE
       IF ((conc_cod = 905) OR (conc_cod = 906) or (conc_cod = 934)) THEN
       BEGIN
        SELECT A.paan_afpem FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
        VALOR = ((:valor) * :PORCEN) /100;
       END
      END
      ELSE
      IF ((conc_cod = 907) OR (conc_cod = 914) OR (conc_cod = 915) or (conc_cod = 938) ) THEN
      BEGIN
       entidad = :niteps;
       IF (conc_cod = 907) THEN
       BEGIN
        SELECT A.paan_epstr FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
        VALOR = ((:valor) * :PORCEN) /100;
       END
       ELSE
       IF ((conc_cod = 914) OR (conc_cod = 915) or (conc_cod = 938)) THEN
       BEGIN
        SELECT A.paan_epsem FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
        VALOR = ((:valor) * :PORCEN) /100;
       END
      END
      ELSE
      IF ((conc_cod = 910) OR (conc_cod = 911) OR (conc_cod = 916) OR (conc_cod = 917) OR (conc_cod = 918) OR (conc_cod = 919) or (conc_cod = 936) or (conc_cod = 939) or (conc_cod = 940)) THEN
      BEGIN
       entidad = :nitccf;
       IF ((conc_cod = 910) OR (conc_cod = 911) or (conc_cod = 936)) THEN
       BEGIN
        SELECT A.paan_ccf FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
        VALOR = ((:valor) * :PORCEN) /100;
       END
       ELSE
       IF ((conc_cod = 916) OR (conc_cod = 917) or (conc_cod = 939)) THEN
       BEGIN
        SELECT A.paan_icbf FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
        VALOR = ((:valor) * :PORCEN) /100;
       END
       ELSE
       IF ((conc_cod = 918) OR (conc_cod = 919) or (conc_cod = 940)) THEN
       BEGIN
        SELECT A.paan_sena FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
        VALOR = ((:valor) * :PORCEN) /100;
       END
      END
      ELSE
      IF ((conc_cod = 912) OR (conc_cod = 913)) THEN
      BEGIN
       entidad = :nitafc;
      EXECUTE PROCEDURE LEE_CONFIGURACION('NOMINA','LIQUIDACION','TOMAR BENEFICIOS PARA CALCULAR PROVISIONES')RETURNING_VALUES(:parambenef);
      if (parambenef = 'SI') then
      BEGIN
      SELECT SUM(ce.emco_monto)
      FROM empleado_conceptos CE, CONCEPTOS_NOMINA CN WHERE CN.conc_benefic = 'S' AND (CE.terc_nit = :nite) AND (CE.CONC_COD = CN.CONC_COD) AND
      ((CE.emco_fecini <= :fec AND CE.emco_fecfin >= :FEC) OR ((cn.conc_todosper = 'N') AND (CE.emco_ppago = :periodo)) OR
      (cn.conc_todosper = 'S'))
      INTO :beneficios;
      if (beneficios is null) then
       beneficios = 0;
      END
      ELSE
       beneficios = 0;
      SELECT P.paan_auxtr, P.paan_salminimo FROM PARAMETROS_ANO P WHERE P.paan_ano = :ano INTO :auxtrans, :smlv;
      if (:basico < (:smlv*2)) then
       auxtrans = (:auxtrans / 30) * :diaslab;
      ELSE
       auxtrans = 0;
       IF ((conc_cod = 912) OR (conc_cod = 913) or (conc_cod = 937)) THEN
       BEGIN
        SELECT A.paan_cesemp FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
        VALOR = ((:valor + :auxtrans + :beneficios) * :PORCEN) /100;
       END
      END
      ELSE
      BEGIN
       IF (comision IS NULL) THEN
       comision = 0;
       SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
       conc_monto = :basico + :comision;
       IF (conc_porc <> 0 AND conc_porc IS NOT NULL) THEN
       VALOR = (((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans + :incap) * :conc_porc) /100;
       ELSE
       IF (:porcen <> 0 AND :porcen IS NOT NULL) THEN
       VALOR = (((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans + :incap) * :porcen) /100;
       ELSE
       IF (:montos <> 0 AND :montos IS NOT NULL) THEN
       valor = :montos;
       ELSE
       IF (:conc_monto <> 0 AND :conc_monto IS NOT NULL) THEN
       valor = :conc_monto;
      END
     END
     item = :item + 1;
    END
    ELSE
    IF (conc_prov = 'S') THEN
    BEGIN
     horasex = NULL;
     diasnov = NULL;
     retroact = NULL;
     reembolso = NULL;
     beneficios = null;
     recargo = null;
     comision = null;
     incap = null;
     /*RECARGO*/
     SELECT E.empl_salario FROM EMPLEADOS E WHERE E.terc_nit = :nite INTO :basico;
     SELECT N.noex_recnoct, N.noex_recfest
     FROM NOMINA_HORASEXT N WHERE N.noex_periodio = :periodo AND N.noex_ano = :ano AND N.terc_nit = :nite
     INTO :recnoct, :recfest;
     if (recnoct is null) then
      recnoct = 0;
     if (recfest is null) then
      recfest = 0;
     SELECT P.paan_recnoc, P.paan_recfest FROM PARAMETROS_ANO P WHERE P.paan_ano = :ano INTO :tar_recnotc, :tar_recfest;
     recargo = (((:basico/30)/8)*:tar_recnotc)*:recnoct;
     recargo = :recargo + ((((:basico/30)/8)*:tar_recfest)*:recfest);
      /*INCAPACIDAD*/
      SELECT N.nono_dura FROM NOMINA_NOVEDADES N WHERE N.terc_nit = :nite AND N.nono_periodo = :periodo AND N.nono_ano = :ano AND (N.tnov_cod = 2 OR (N.tnov_cod = 3)) INTO :diasnov;
      IF (:diasnov IS NULL) THEN
      incap = 0;
      ELSE
      incap = (:basico / 30)* :diasnov;
     /*BASICO*/
     SELECT N.noex_recnoct, N.noex_recfest
     FROM NOMINA_HORASEXT N WHERE N.noex_periodio = :periodo AND N.noex_ano = :ano AND N.terc_nit = :nite
     INTO :recnoct, :recfest;
     if (recnoct is null) then
      recnoct = 0;
     if (recfest is null) then
      recfest = 0;
     SELECT P.paan_recnoc, P.paan_recfest FROM PARAMETROS_ANO P WHERE P.paan_ano = :ano INTO :tar_recnotc, :tar_recfest;
     basico = ((:basico/30)*:diaslab) - (((:basico/30)/8)*:recnoct);
     basico = :basico - (((:basico/30)/8)*:recfest);
     /*BENEFICIOS*/
     EXECUTE PROCEDURE LEE_CONFIGURACION('NOMINA','LIQUIDACION','TOMAR BENEFICIOS PARA CALCULAR PROVISIONES')RETURNING_VALUES(:parambenef);
     if (parambenef = 'SI') then
     BEGIN
      SELECT SUM(ce.emco_monto)
      FROM empleado_conceptos CE, CONCEPTOS_NOMINA CN WHERE CN.conc_benefic = 'S' AND (CE.terc_nit = :nite) AND (CE.CONC_COD = CN.CONC_COD) AND
      ((CE.emco_fecini <= :fec AND CE.emco_fecfin >= :FEC) OR ((cn.conc_todosper = 'N') AND (CE.emco_ppago = :periodo)) OR
      (cn.conc_todosper = 'S'))
      INTO :beneficios;
      if (beneficios is null) then
        beneficios = 0;
     END
     ELSE
      beneficios = 0;
     if ((conc_cod <> 929) and (conc_cod <> 930) and (conc_cod <> 944)) then
     begin
        SELECT P.paan_auxtr, P.paan_salminimo FROM PARAMETROS_ANO P WHERE P.paan_ano = :ano INTO :auxtrans, :smlv;
        if (:basico < (:smlv*2)) then
           auxtrans = (:auxtrans / 30) * :diaslab;
        ELSE
           auxtrans = 0;
     end
     else
      auxtrans = 0;
     conc_monto = :basico;
     IF (conc_porc <> 0 AND conc_porc IS NOT NULL) THEN
     VALOR = (((:CONC_MONTO)+ :cambsaltrans + :incap + :recargo + :auxtrans + :beneficios) * :conc_porc) /100;
     ELSE
     IF (porcen <> 0 AND porcen IS NOT NULL) THEN
     VALOR = (((:CONC_MONTO)+ :cambsaltrans + :incap + :recargo + :auxtrans + :beneficios) * :porcen) /100;
     ELSE
     IF (montos <> 0 AND montos IS NOT NULL) THEN
     VALOR = :montos;
     ELSE
     IF (conc_monto <> 0 AND conc_monto IS NOT NULL) THEN
     VALOR = :conc_monto;
     item = :item + 1;
    END
    ELSE
    IF (conc_cod = 920) THEN
    BEGIN
     SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :valor;
     IF (valor IS NULL) THEN
     valor = 0;
     item = :item + 1;
    END
    ELSE
    IF (conc_cod = 900 OR (:conc_cod = 931)) THEN
    BEGIN
     SELECT c.noex_monto FROM nomina_horasext c WHERE c.noex_ano = :ano AND c.noex_periodio = :periodo AND c.noex_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :valor;
     IF (valor IS NULL) THEN
     valor = 0;
     item = :item + 1;
    END
    ELSE
    IF (conc_cod = 932) THEN
    BEGIN
     SELECT N.nono_dura FROM NOMINA_NOVEDADES N WHERE N.terc_nit = :nite AND N.nono_periodo = :periodo AND N.nono_ano = :ano AND (N.tnov_cod = 2 OR (N.tnov_cod = 3)) INTO :diasnov;
     IF (:diasnov IS NULL) THEN
     valor = 0;
     ELSE
     valor = (:basico / 30)* :diasnov;
    END
    ELSE
    IF (conc_cod = 921) THEN
    BEGIN
     IF (porcen IS NOT NULL AND porcen <> 0) THEN
     valor = ((basico / 30)* :diaslab ) * :PORCEN /100;
     ELSE
     IF (conc_porc IS NOT NULL AND conc_porc <> 0) THEN
     valor = ((basico / 30)* :diaslab ) * :conc_porc /100;
    END
    ELSE
    if (conc_cod = 953) then
    BEGIN
       SELECT E.empl_salario FROM EMPLEADOS E WHERE E.terc_nit = :nite INTO :basico;
       SELECT N.noex_recnoct, N.noex_recfest
       FROM NOMINA_HORASEXT N WHERE N.noex_periodio = :periodo AND N.noex_ano = :ano AND N.terc_nit = :nite
       INTO :recnoct, :recfest;
       if (recnoct is null) then
        recnoct = 0;
       if (recfest is null) then
        recfest = 0;
       SELECT P.paan_recnoc, P.paan_recfest FROM PARAMETROS_ANO P WHERE P.paan_ano = :ano INTO :tar_recnotc, :tar_recfest;
       valor = (((:basico/30)/8)*:tar_recnotc)*:recnoct;
       valor = :valor + ((((:basico/30)/8)*:tar_recfest)*:recfest);
    END
    if (conc_aporte = 'S') then
    begin
    if (entidad is null or (entidad = '') ) then
    entidad = :conc_entidad;
    end
   END
    if ((VALOR <> 0) AND (VALOR IS NOT NULL)) then
    BEGIN
    EXECUTE PROCEDURE LEE_CONFIGURACION('NOMINA','GENERAL','REDONDEO AL MULTIPLO DE DIEZ EN TOTALES')RETURNING_VALUES(:aprox);
    EXECUTE PROCEDURE REDONDEE(:valor, :aprox) RETURNING_VALUES (VALOR);
    IF ((mensual = 'N') OR (periodicidad = 1))  THEN
    INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
    VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
    ELSE
    IF (mensual = 'S') THEN
    BEGIN
     IF ((:periodicidad = 2) AND (liquidaper = 1)) THEN
     BEGIN
      IF ((periodo = 1) OR (periodo = 3) OR (periodo = 5) OR (periodo = 7) OR (periodo = 9) OR (periodo = 11)
      OR (periodo = 13) OR (periodo = 15) OR (periodo = 17) OR (periodo = 19) OR (periodo = 21) OR (periodo = 23)) THEN
      INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
      VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
     END
     ELSE
     IF ((:periodicidad = 2) AND (liquidaper = 2)) THEN
     BEGIN
      IF ((periodo = 2) OR (periodo = 4) OR (periodo = 6) OR (periodo = 8) OR (periodo = 10) OR (periodo = 12)
      OR (periodo = 14) OR (periodo = 16) OR (periodo = 18) OR (periodo = 20) OR (periodo = 22) OR (periodo = 24)) THEN
      INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
      VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
     END
     ELSE
     IF ((:periodicidad = 3) AND (liquidaper = 1)) THEN
     BEGIN
      IF ((periodo = 1) OR (periodo = 5) OR (periodo = 9) OR (periodo = 13) OR (periodo = 17) OR (periodo = 21)
      OR (periodo = 25) OR (periodo = 29) OR (periodo = 33) OR (periodo = 37) OR (periodo = 41) OR (periodo = 45)
      OR (periodo = 49)) THEN
      INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
      VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
    END
    ELSE
     IF ((:periodicidad = 3) AND (liquidaper = 2)) THEN
     BEGIN
      IF ((periodo = 2) OR (periodo = 6) OR (periodo = 10) OR (periodo = 14) OR (periodo = 18) OR (periodo = 22)
      OR (periodo = 26) OR (periodo = 30) OR (periodo = 34) OR (periodo = 38) OR (periodo = 42) OR (periodo = 46)
      OR (periodo = 50)) THEN
      INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
      VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
     END
     ELSE
     IF ((:periodicidad = 3) AND (liquidaper = 3)) THEN
     BEGIN
      IF ((periodo = 3) OR (periodo = 7) OR (periodo = 11) OR (periodo = 15) OR (periodo = 19) OR (periodo = 23)
      OR (periodo = 27) OR (periodo = 31) OR (periodo = 35) OR (periodo = 39) OR (periodo = 43) OR (periodo = 47)
      OR (periodo = 51)) THEN
      INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
      VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
     END
     ELSE
     IF ((:periodicidad = 3) AND (liquidaper = 4)) THEN
     BEGIN
      IF ((periodo = 4) OR (periodo = 8) OR (periodo = 12) OR (periodo = 16) OR (periodo = 20) OR (periodo = 24)
      OR (periodo = 29) OR (periodo = 32) OR (periodo = 36) OR (periodo = 40) OR (periodo = 44) OR (periodo = 48)
      OR (periodo = 52)) THEN
      INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
      VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
     END
    END
  VALOR = 0;
  basico = 0;
  END
  END
 END
 END
 END
 SUSPEND;
END
^

SET TERM ; ^


CREATE TABLE MOVIMIENTO_SALARIO_EMPLEADO (
    MVSE_ID       INTEGER NOT NULL,
    TERC_NIT      NIT,
    MVSE_FECHA    DATE,
    MVSE_SALARIO  NUMERIC(18,2)
);

ALTER TABLE MOVIMIENTO_SALARIO_EMPLEADO ADD CONSTRAINT PK_MOVIMIENTO_SALARIO_EMPLEADO PRIMARY KEY (MVSE_ID);

CREATE SEQUENCE ID_MOVSALEMPL;



SET TERM ^;

CREATE OR ALTER TRIGGER empleados_au FOR empleados
ACTIVE AFTER UPDATE POSITION 0
AS
BEGIN
IF (OLD.empl_salario <> NEW.empl_salario) THEN
 INSERT INTO MOVIMIENTO_SALARIO_EMPLEADO (mvse_id,terc_nit,mvse_fecha,mvse_salario) VALUES(GEN_ID(id_movsalempl,1),OLD.terc_nit,CAST('now' AS DATE),NEW.empl_salario);
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER empleados_ai FOR empleados
ACTIVE AFTER INSERT POSITION 0
AS
BEGIN
INSERT INTO program_vacaciones (TERC_NIT) VALUES (NEW.terc_nit);
INSERT INTO MOVIMIENTO_SALARIO_EMPLEADO (mvse_id,terc_nit,mvse_fecha,mvse_salario) VALUES(GEN_ID(id_movsalempl,1),NEW.terc_nit,CAST('now' AS DATE),NEW.empl_salario);
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER PROCEDURE CALC_SALDOSINI_NOMINA (
    fecha date)
returns (
    emplnit varchar(20),
    emplnom varchar(60),
    primajunio numeric(18,2),
    conc_codprimajun integer,
    primadic numeric(18,2),
    conc_codprimadic integer,
    cesantia numeric(18,2),
    conc_codcesan integer,
    vacac numeric(18,2),
    conc_codvacaci integer,
    intces numeric(18,2),
    conc_codintces integer)
as
declare variable numeromeses integer;
declare variable fechaing date;
declare variable anoact integer;
declare variable mesact integer;
declare variable diaact integer;
declare variable anoing integer;
declare variable diaing integer;
declare variable mesing integer;
declare variable salario numeric(18,2);
declare variable item integer;
declare variable idsaldo integer;
BEGIN
delete from nomina where nomi_periodo = 0;
idsaldo = gen_id(id_nomina,1);
insert into nomina  (nomi_id, nomi_feccausa, nomi_liqok, nomi_periodo) values (:idsaldo, :fecha, 'S', 0);
item = 1;
anoact = CAST(substr(:fecha,1,4)AS INTEGER);
mesact = CAST(substr(:fecha,6,7)AS INTEGER);
diaact = CAST(substr(:fecha,9,10)AS INTEGER);
FOR SELECT  E.TERC_NIT, T.TERC_NOM, E.EMPL_FECING FROM EMPLEADOS E, TERCEROS T WHERE T.terc_nit = E.terc_nit AND e.empl_fecing <= :fecha INTO :emplnit, :emplnom, :fechaing
DO
  BEGIN
    SELECT FIRST 1  m.mvse_salario FROM MOVIMIENTO_SALARIO_EMPLEADO M WHERE M.terc_nit = :emplnit AND M.mvse_fecha <= :fecha ORDER BY M.mvse_fecha DESC into :salario;
    anoing = CAST(substr(:fechaing,1,4)AS INTEGER);
    mesing = CAST(substr(:fechaing,6,7)AS INTEGER);
    diaing = CAST(substr(:fechaing,9,10)AS INTEGER);
    numeromeses = mesact - 1;
    cesantia = (:salario / 12) * :numeromeses;
    intces = cesantia * 1 /100;
    numeromeses = ((:anoact-:anoing)*12)-((:mesact-:mesing)*(-1))-1;
    if (numeromeses > 12) then
    numeromeses = 12;
    IF (numeromeses < 0) THEN
    numeromeses = 0;
    vacac = ((:salario / 12) * :numeromeses) / 2;
    IF (anoact = anoing) THEN
    BEGIN
    IF (mesact > 1 AND mesact <= 6) THEN
    BEGIN
    numeromeses = :mesact - :mesing;
    primajunio = (:salario / 12) * :numeromeses;
    END
    ELSE
    primajunio = 0;
    IF (mesact > 7 AND mesact <= 12) THEN
    BEGIN
    numeromeses = :mesact - 6;
    primadic = (:salario / 12) * (:numeromeses);
    END
    END
    ELSE
    IF (mesact > 1 AND mesact <= 6) THEN
    begin
    numeromeses = :mesact - 1;
    primajunio = (:salario / 12) * :numeromeses;
    end
    else
    IF (mesact > 7 AND mesact <= 12) THEN
    BEGIN
    numeromeses = :mesact - 7;
    primadic = (:salario / 12) * (:numeromeses);
    END
EXECUTE PROCEDURE redondee(:primajunio, 5) RETURNING_VALUES :primajunio;
EXECUTE PROCEDURE redondee(:primadic, 5) RETURNING_VALUES :primadic;
EXECUTE PROCEDURE redondee(:cesantia, 5) RETURNING_VALUES :cesantia;
EXECUTE PROCEDURE redondee(:intces, 5) RETURNING_VALUES :intces;
EXECUTE PROCEDURE redondee(:vacac, 5) RETURNING_VALUES :vacac;
/*if ( cesantia <> 0 AND cesantia IS NOT NULL and  intces <> 0 AND intces IS NOT NULL and primajunio <> 0 AND primajunio IS NOT NULL and vacac <> 0 AND vacac IS NOT NULL and primadic <> 0 AND primadic IS NOT NULL) then*/
select conc_cod from empleado_conceptos where ((conc_cod = 912) or (conc_cod = 913)) and terc_nit = :emplnit into :conc_codcesan;
select conc_cod from empleado_conceptos where ((conc_cod = 923) or (conc_cod = 924)) and terc_nit = :emplnit into :conc_codintces;
select conc_cod from empleado_conceptos where ((conc_cod = 925) or (conc_cod = 927)) and terc_nit = :emplnit into :conc_codprimajun;
select conc_cod from empleado_conceptos where ((conc_cod = 926) or (conc_cod = 928)) and terc_nit = :emplnit into :conc_codprimadic;
select conc_cod from empleado_conceptos where ((conc_cod = 929) or (conc_cod = 930)) and terc_nit = :emplnit  into :conc_codvacaci;
if (cesantia <> 0 AND cesantia IS NOT NULL) then
begin
INSERT INTO NOMINA_CONCEPTOS (NOMI_ID, NOCO_ITEM, CONC_COD, TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC, NOCO_PROV, NOCO_APORTE, NOCO_PAGOOK, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, NOCO_GTOEMPR) VALUES (:idsaldo, :item, :conc_codcesan, :emplnit, :cesantia, '', 'N', 'S', 'N', 'N', 0, :anoact, 'N', 'N', 'N', 'S');
item = :item + 1;
end
if (intces <> 0 AND intces IS NOT NULL) then
begin
INSERT INTO NOMINA_CONCEPTOS (NOMI_ID, NOCO_ITEM, CONC_COD, TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC, NOCO_PROV, NOCO_APORTE, NOCO_PAGOOK, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, NOCO_GTOEMPR) VALUES (:idsaldo, :item, :conc_codintces, :emplnit, :intces, '', 'N', 'S', 'N', 'N', 0, :anoact, 'N', 'N', 'N', 'S');
item = :item + 1;
end
if (primajunio <> 0 AND primajunio IS NOT NULL) then
begin
INSERT INTO NOMINA_CONCEPTOS (NOMI_ID, NOCO_ITEM, CONC_COD, TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC, NOCO_PROV, NOCO_APORTE, NOCO_PAGOOK, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, NOCO_GTOEMPR) VALUES (:idsaldo, :item, :conc_codprimajun, :emplnit, :primajunio, '', 'N', 'S', 'N', 'N', 0, :anoact, 'N', 'N', 'N', 'S');
item = :item + 1;
end
if (primadic <> 0 AND primadic IS NOT NULL) then
begin
INSERT INTO NOMINA_CONCEPTOS (NOMI_ID, NOCO_ITEM, CONC_COD, TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC, NOCO_PROV, NOCO_APORTE, NOCO_PAGOOK, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, NOCO_GTOEMPR) VALUES (:idsaldo, :item, :conc_codprimadic, :emplnit, :primadic, '', 'N', 'S', 'N', 'N', 0, :anoact, 'N', 'N', 'N', 'S');
item = :item + 1;
end
if (vacac <> 0 AND vacac IS NOT NULL) then
begin
INSERT INTO NOMINA_CONCEPTOS (NOMI_ID, NOCO_ITEM, CONC_COD, TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC, NOCO_PROV, NOCO_APORTE, NOCO_PAGOOK, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, NOCO_GTOEMPR) VALUES (:idsaldo, :item, :conc_codvacaci, :emplnit, :vacac, '', 'N', 'S', 'N', 'N', 0, :anoact, 'N', 'N', 'N', 'S');
item = :item + 1;
end
    SUSPEND;
  END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER PROCEDURE CAUSA_NOMINA (
    fec date,
    periodo integer,
    periodicidad integer,
    pagoglobal char(1),
    ano char(4),
    depto integer)
returns (
    idnomina integer,
    itemini integer)
as
declare variable item integer;
declare variable nite varchar(20) character set none;
declare variable nit_tercero varchar(20);
declare variable concept integer;
declare variable montos numeric(18,2);
declare variable porcen numeric(9,4);
declare variable entidad varchar(20);
declare variable conc_cod integer;
declare variable conc_deduc char(1);
declare variable conc_porc numeric(9,4);
declare variable conc_entidad integer;
declare variable conc_monto numeric(18,2);
declare variable conc_modifi char(1);
declare variable conc_promedio char(1);
declare variable emco_perprom integer;
declare variable valor numeric(18,2);
declare variable diaslab integer;
declare variable conc_prov char(1);
declare variable conc_aporte char(1);
declare variable numeroprom integer;
declare variable conc_aplicaprom char(1);
declare variable perinicial integer;
declare variable anoprom integer;
declare variable conc_dias char(1);
declare variable conc_otroconc char(1);
declare variable conc_codotroconc integer;
declare variable anosum integer;
declare variable salario char(1) character set none;
declare variable liquidaper integer;
declare variable rmod numeric(2,2);
declare variable basico numeric(18,2);
declare variable niteps varchar(20);
declare variable nitafc varchar(20);
declare variable nitafp varchar(20);
declare variable nitccf varchar(20);
declare variable gtoempr char(1);
declare variable comision numeric(18,2);
declare variable cambsaltrans numeric(18,2);
declare variable saldosini numeric(18,2);
declare variable duranov integer;
declare variable base numeric(18,2);
declare variable aprox integer;
declare variable mensual char(1);
declare variable horasex numeric(18,2);
declare variable diasnov integer;
declare variable tomasal integer;
declare variable retroact numeric(18,2);
declare variable reembolso numeric(18,2);
declare variable incap numeric(18,2);
declare variable deptoempl integer;
declare variable auxtrans numeric(18,2);
declare variable smlv numeric(18,2);
declare variable beneficios numeric(18,2);
declare variable confirmado char(1);
declare variable recnoct numeric(18,2);
declare variable recfest numeric(18,2);
declare variable tar_recnotc numeric(9,4);
declare variable tar_recfest numeric(9,4);
declare variable recargo numeric(18,2);
declare variable basicorec numeric(18,2);
declare variable parambenef char(2);
declare variable vacacdisf numeric(18,2);
declare variable valorpredet numeric(18,2);
BEGIN
 SELECT N.NOMI_ID, N.nomi_liqok FROM NOMINA N WHERE N.nomi_periodo = :periodo AND N.nomi_periodocidad = :periodicidad AND N.nomi_ano = :ano
 INTO :IDNOMINA, :CONFIRMADO;
 IF (:idnomina IS NULL) THEN
 BEGIN
  EXECUTE PROCEDURE cambie_id_nomina RETURNING_VALUES(:idnomina);
  INSERT INTO nomina (nomi_id, NOMI_FECCAUSA, NOMI_PAGOGLOBAL, NOMI_PERIODOCIDAD, NOMI_PERIODO, NOMI_ANO, NOMI_LIQOK)
  VALUES (:IDNOMINA, :fec,:pagoglobal, :periodicidad, :periodo, :ano, 'N');
  item = 1;
 END
 ELSE
 BEGIN
  SELECT MAX(N.noco_item) FROM NOMINA_CONCEPTOS N WHERE N.nomi_id = :idnomina
  INTO :item;
 END
 if ((confirmado = 'S') AND (idnomina IS NOT NULL)) then
 BEGIN
  idnomina = 0;
 END
 else
 begin
 IF (DEPTO = 0) THEN
  INSERT INTO NOMINA_DEPARTAMENTO (nomi_id, nodp_depto)VALUES(:IDNOMINA,0);
 ELSE
  INSERT INTO NOMINA_DEPARTAMENTO (nomi_id, nodp_depto)VALUES(:IDNOMINA,:DEPTO);
 ITEMINI = ITEM;
 FOR SELECT E.TERC_NIT, e.empl_eps, e.empl_afc, e.empl_afp, e.empl_ccf, e.empl_dpto
 FROM EMPLEADOS E
 WHERE E.empl_ppago = :periodicidad AND ((E.empl_fecret IS NULL) OR (E.empl_fecret > :fec)) AND E.empl_fecing <= :fec
 INTO :nite, :niteps, :nitafc, :nitafp, :nitccf, :deptoempl
 DO
 BEGIN
 SELECT FIRST 1  m.mvse_salario FROM MOVIMIENTO_SALARIO_EMPLEADO M WHERE M.terc_nit = :nite AND M.mvse_fecha <= :fec ORDER BY M.mvse_fecha DESC into :basico;
 IF ((depto = 0) OR (deptoempl = :depto)) THEN
 BEGIN
  FOR SELECT CE.TERC_NIT, CE.CONC_COD, CE.EMCO_MONTO, CE.EMCO_PORC, ce.empl_entidad, CE.emco_perprom, CE.emco_luquidaper, CE.emco_mensual, CN.CONC_COD, CN.CONC_DEDUC,CN.CONC_PORC, CN.CONC_ENTIDAD, CN.CONC_MONTO,  CN.CONC_DIAS, CN.CONC_MODIFI,
  CN.CONC_PROMEDIO, CN.conc_salario, CE.emco_perprom, CN.conc_prov, CN.conc_aporte, CN.conc_aplicaprom, cn.conc_otroconc, cn.conc_codotroconc, CN.conc_gtoempr, CN.conc_base, CE.emco_tomsal
  FROM empleado_conceptos CE, CONCEPTOS_NOMINA CN WHERE (CE.CONC_COD = CN.CONC_COD) AND (CE.terc_nit = :nite) AND
  (((CE.emco_fecini <= :fec AND CE.emco_fecfin >= :FEC)) OR
  ((cn.conc_todosper = 'N') AND (CE.emco_ppago = :periodo)) OR (cn.conc_todosper = 'S'))  ORDER BY (TERC_NIT )
  INTO :nit_tercero, :concept,  :montos, :porcen, :entidad, :numeroprom, :liquidaper, :mensual ,:CONC_COD, :CONC_DEDUC, :CONC_PORC,
  :CONC_ENTIDAD, :CONC_MONTO, :CONC_DIAS, :CONC_MODIFI,:CONC_PROMEDIO, :salario,:EMCO_PERPROM, :conc_prov, :conc_aporte , :CONC_APLICAPROM, :conc_otroconc, :conc_codotroconc, :gtoempr, :base, :tomasal
  DO
  BEGIN
   IF (conc_dias = 'S') THEN
    EXECUTE PROCEDURE DIAS_LABORADOS (:nite, :periodo, :fec, :mensual,:conc_aporte) RETURNING_VALUES (:diaslab);
   ELSE
    diaslab = 15;
/*   IF (mensual = 'S') THEN
   BEGIN
    diaslab = 30;
   END
*/   IF (:tomasal <> 0) THEN
   BEGIN
    IF ((:periodicidad = 2) AND (:tomasal <> 2)) THEN
    BEGIN
     IF ((periodo = 2) OR (periodo = 4) OR (periodo = 6) OR (periodo = 8) OR (periodo = 10) OR (periodo = 12)
     OR (periodo = 14) OR (periodo = 16) OR (periodo = 18) OR (periodo = 20) OR (periodo = 22) OR (periodo = 24)) THEN
     basico = 0;
    END
    ELSE
    IF ((:periodicidad = 3) AND (:tomasal <> 1)) THEN
    BEGIN
     IF ((periodo = 1) OR (periodo = 5) OR (periodo = 9) OR (periodo = 13) OR (periodo = 17) OR (periodo = 21)
     OR (periodo = 25) OR (periodo = 29) OR (periodo = 33) OR (periodo = 37) OR (periodo = 41) OR (periodo = 45)
     OR (periodo = 49)) THEN
     basico = 0;
    END
    ELSE
     IF ((:periodicidad = 3) AND (:tomasal <> 2)) THEN
     BEGIN
      IF ((periodo = 2) OR (periodo = 6) OR (periodo = 10) OR (periodo = 14) OR (periodo = 18) OR (periodo = 22)
      OR (periodo = 26) OR (periodo = 30) OR (periodo = 34) OR (periodo = 38) OR (periodo = 42) OR (periodo = 46)
      OR (periodo = 50)) THEN
      basico = 0;
     END
     ELSE
     IF ((:periodicidad = 3) AND (:tomasal <> 3)) THEN
     BEGIN
      IF ((periodo = 3) OR (periodo = 7) OR (periodo = 11) OR (periodo = 15) OR (periodo = 19) OR (periodo = 23)
      OR (periodo = 27) OR (periodo = 31) OR (periodo = 35) OR (periodo = 39) OR (periodo = 43) OR (periodo = 47)
      OR (periodo = 51)) THEN
      basico = 0;
     END
     ELSE
     IF ((:periodicidad = 3) AND (:tomasal <> 4)) THEN
     BEGIN
      IF ((periodo = 4) OR (periodo = 8) OR (periodo = 12) OR (periodo = 16) OR (periodo = 20) OR (periodo = 24)
      OR (periodo = 29) OR (periodo = 32) OR (periodo = 36) OR (periodo = 40) OR (periodo = 44) OR (periodo = 48)
      OR (periodo = 52)) THEN
      basico = 0;
     END
   END
   ELSE
    BEGIN
     SELECT FIRST 1  m.mvse_salario FROM MOVIMIENTO_SALARIO_EMPLEADO M WHERE M.terc_nit = :nite AND M.mvse_fecha <= :fec ORDER BY M.mvse_fecha DESC INTO :basico;
    END
    valorpredet = NULL;
    SELECT VP.nvpr_monto FROM NOMINA_VALOR_PREDET VP WHERE VP.nvpr_periodicidad = :periodicidad AND VP.nvpr_periodo = :periodo AND VP.nvpr_ano = :ano AND vp.conc_cod = :conc_cod AND vp.terc_nit = :nite
    INTO :valorpredet;
    IF ((:valorpredet <> 0) AND (valorpredet IS NOT NULL)) THEN
     valor = valorpredet;
    ELSE
    BEGIN
    SELECT ((n.nono_valor /30) * n.nono_dura), (n.nono_dura) FROM nomina_novedades n WHERE n.tnov_cod = 11 AND n.terc_nit = :nite AND n.nono_periodo = :periodo INTO :cambsaltrans, :duranov;
    IF (cambsaltrans IS NULL) THEN
    cambsaltrans = 0;
    IF (duranov IS NULL) THEN
    duranov = 0;
    diaslab = :diaslab - :duranov;
    IF (conc_cod = 922) THEN
    BEGIN
     SELECT SUM(P.prcu_monto) FROM prestamo_cuotas P, prestamo_nomina PN WHERE P.prcu_ano = :ano AND P.prcu_periodo = :periodo AND PN.prno_id = P.prno_id AND PN.terc_nit = :nite INTO :valor;
     IF (valor IS NULL) THEN
     valor = 0;
     item = :item + 1;
     UPDATE prestamo_cuotas  P SET prcu_ok = 'S' WHERE P.prcu_ano = :ano AND P.prcu_periodo = :periodo AND P.prno_id = (SELECT PN.prno_id FROM PRESTAMO_NOMINA PN WHERE PN.terc_nit = :nite);
    END
    ELSE
    IF ((:montos = 0) OR (:montos IS NULL)) THEN
    BEGIN
     IF ((CONC_PORC = 0 AND :porcen = 0) OR (CONC_PORC IS NULL AND :porcen = 0) OR (CONC_PORC = 0 AND :porcen IS NULL) OR (CONC_PORC IS NULL AND :porcen IS NULL) ) THEN
     BEGIN
      IF ((conc_monto <> 0) AND (conc_monto IS NOT NULL) ) THEN
      BEGIN
       VALOR = :CONC_MONTO;
       IF (:conc_dias = 'S') THEN
       valor = (:valor / 30) * :diaslab;
      END
      ELSE
      IF (salario = 'S' AND CONC_COD <> 900 AND CONC_COD <> 920 and conc_cod <> 932 AND CONC_COD <> 953) THEN
      BEGIN
       SELECT FIRST 1  m.mvse_salario FROM MOVIMIENTO_SALARIO_EMPLEADO M WHERE M.terc_nit = :nite AND M.mvse_fecha <= :fec ORDER BY M.mvse_fecha DESC INTO :basico;
       SELECT N.noex_recnoct, N.noex_recfest
       FROM NOMINA_HORASEXT N WHERE N.noex_periodio = :periodo AND N.noex_ano = :ano AND N.terc_nit = :nite
       INTO :recnoct, :recfest;
       if (recnoct is null) then
        recnoct = 0;
       if (recfest is null) then
        recfest = 0;
       SELECT P.paan_recnoc, P.paan_recfest FROM PARAMETROS_ANO P WHERE P.paan_ano = :ano INTO :tar_recnotc, :tar_recfest;
       basico = ((:basico/30)*:diaslab) - (((:basico/30)/8)*:recnoct);
       basico = :basico - (((:basico/30)/8)*:recfest);
       conc_monto = :basico;
       VALOR = (:conc_monto/*/30 * :diaslab*/ ) + :cambsaltrans;
      END
      ELSE
      BEGIN
       valor = montos;
       IF (:conc_dias = 'S') THEN
       valor = (:valor / 30) * :diaslab;
      END
     END
     ELSE
     BEGIN
      IF (:porcen <> 0) THEN
      BEGIN
       IF ((conc_monto <> 0) AND (conc_monto IS NOT NULL) ) THEN
       BEGIN
        VALOR = ((:CONC_MONTO ) * :PORCEN) /100;
       END
      END
      ELSE
      BEGIN
       IF ((conc_monto <> 0) AND (conc_monto IS NOT NULL) ) THEN
       BEGIN
        VALOR = ((:CONC_MONTO) * :conc_porc) /100;
       END
       ELSE
       IF (salario = 'S' AND CONC_COD <> 900 AND CONC_COD <> 920 and conc_cod <> 932 AND CONC_COD <> 953) THEN
       BEGIN
       SELECT FIRST 1  m.mvse_salario FROM MOVIMIENTO_SALARIO_EMPLEADO M WHERE M.terc_nit = :nite AND M.mvse_fecha <= :FEC ORDER BY M.mvse_fecha DESC INTO :basico;
       SELECT N.noex_recnoct, N.noex_recfest
       FROM NOMINA_HORASEXT N WHERE N.noex_periodio = :periodo AND N.noex_ano = :ano AND N.terc_nit = :nite
       INTO :recnoct, :recfest;
       if (recnoct is null) then
        recnoct = 0;
       if (recfest is null) then
        recfest = 0;
       SELECT P.paan_recnoc, P.paan_recfest FROM PARAMETROS_ANO P WHERE P.paan_ano = :ano INTO :tar_recnotc, :tar_recfest;
       basico = ((:basico/30)*:diaslab) - (((:basico/30)/8)*:recnoct);
       basico = :basico - (((:basico/30)/8)*:recfest);
        conc_monto = :basico;
        VALOR = ((:CONC_MONTO)+ :cambsaltrans * :conc_porc) /100;
       END
       ELSE
       IF (:conc_monto = 0 AND :montos = 0) THEN
       BEGIN
        conc_monto = :basico;
        VALOR = (((:CONC_MONTO / 30) * :diaslab) + :cambsaltrans * :conc_porc) /100;
       END
      END
     END
    END
    ELSE
    IF ((CONC_PORC = 0 OR (conc_porc IS NULL)) AND (:porcen = 0 OR (porcen IS NULL))) THEN
    BEGIN
     VALOR = (:montos);
     IF (:conc_dias = 'S') THEN
     valor = (:valor / 30) * :diaslab;
    END
    ELSE
    IF (:porcen <> 0 AND porcen IS NOT NULL) THEN
    BEGIN
     VALOR = ((:MONTOS ) * :PORCEN) /100;
    END
    ELSE
    BEGIN
     VALOR = ((:montos) * :CONC_PORC) /100;
    END
    IF (conc_promedio = 'S') THEN
    BEGIN
     perinicial = :periodo - (:numeroprom) + 1;
     anoprom = CAST (ano AS INTEGER);
     IF (perinicial <= 0) THEN
     BEGIN
      perinicial = 1;
      anoprom = CAST(ANO AS INTEGER) - 1;
     END
     SELECT SUM (noco_valor) FROM nomina_conceptos n WHERE n.noco_aplicaprom = 'S' AND N.noco_periodo >= :perinicial - 1 AND N.noco_periodo < :periodo AND N.noco_ano >= :anoprom AND N.noco_ano <= :ano AND terc_nit = :nite INTO :valor;
     valor = ((valor ) / (numeroprom -1 ));
     SELECT NOCO_VALOR FROM NOMINA_CONCEPTOS WHERE CONC_COD = :conc_cod AND TERC_NIT  = :nite AND NOCO_PAGOOK = 'N' AND NOCO_PERIODO = 0 INTO :saldosini;
     IF (saldosini IS NULL) THEN
     saldosini = 0;
     ELSE
     UPDATE nomina_conceptos N SET noco_pagook = 'S' WHERE n.noco_aplicaprom = 'S' AND N.noco_periodo >= :perinicial - 1 AND N.noco_periodo < :periodo AND N.noco_ano >= :anoprom AND N.noco_ano <= :ano  AND CONC_COD = :conc_cod AND terc_nit = :nite AND NOCO_PERIODO = 0;
     VALOR = :valor + :saldosini;
     UPDATE nomina_conceptos N SET noco_pagook = 'S' WHERE n.noco_aplicaprom = 'S' AND N.noco_periodo >= :perinicial - 1 AND N.noco_periodo < :periodo AND N.noco_ano >= :anoprom AND N.noco_ano <= :ano  AND CONC_COD = :conc_cod AND terc_nit = :nite;
    END
    ELSE
    IF (conc_otroconc = 'S') THEN
    BEGIN
     anosum = CAST(ano AS INTEGER);
     anosum = anosum - 1;
     SELECT SUM (noco_valor) FROM nomina_conceptos n WHERE n.noco_ano = :anosum AND n.conc_cod = :conc_codotroconc AND N.terc_nit = :nite INTO :valor;
     SELECT NOCO_VALOR FROM NOMINA_CONCEPTOS WHERE noco_ano = :anosum AND conc_cod = :conc_codotroconc AND terc_nit = :nite AND NOCO_PERIODO = 0 INTO :saldosini;
     IF (saldosini IS NULL) THEN
     saldosini = 0;
     ELSE
     UPDATE nomina_conceptos SET noco_pagook = 'S' WHERE noco_ano = :anosum AND conc_cod = :conc_codotroconc AND NOCO_PERIODO = 0 AND terc_nit = :nite;
     VALOR = :valor + :saldosini;
     UPDATE nomina_conceptos SET noco_pagook = 'S' WHERE noco_ano = :anosum AND conc_cod = :conc_codotroconc AND terc_nit = :nite;
    END
    ELSE
    IF (conc_aporte = 'S') THEN
    BEGIN
     horasex = NULL;
     diasnov = NULL;
     retroact = NULL;
     reembolso = NULL;
     beneficios = null;
     recargo = null;
     comision = null;
     incap = null;
     vacacdisf = null;
     IF ((:entidad = '' ) OR (entidad IS NULL)) THEN
     BEGIN
      /*COMISIONES*/
      SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
      IF (comision IS NULL) THEN
      comision = 0;
      /*RETROACTIVO*/
      SELECT C.emco_monto FROM EMPLEADO_CONCEPTOS C WHERE C.terc_nit = :nite AND C.conc_cod = 933 INTO :retroact;
      IF (retroact IS NULL ) THEN
      retroact = 0;
      /*REEMBOLSO*/
      SELECT C.emco_monto FROM EMPLEADO_CONCEPTOS C WHERE C.terc_nit = :nite AND C.conc_cod = 952 INTO :reembolso;
      IF (reembolso IS NULL ) THEN
      reembolso = 0;
      /*VACACIONES DISFRUTADAS ANTERIORMENTE*/
      SELECT C.emco_monto FROM EMPLEADO_CONCEPTOS C WHERE C.terc_nit = :nite AND C.conc_cod = 955 INTO :vacacdisf;
      IF (vacacdisf IS NULL ) THEN
      vacacdisf = 0;
      /*INCAPACIDAD*/
      SELECT N.nono_dura FROM NOMINA_NOVEDADES N WHERE N.terc_nit = :nite AND N.nono_periodo = :periodo AND N.nono_ano = :ano AND (N.tnov_cod = 2 OR (N.tnov_cod = 3)) INTO :diasnov;
      IF (:diasnov IS NULL) THEN
      incap = 0;
      ELSE
      incap = (:basico / 30)* :diasnov;
      /*BASICO*/
      SELECT N.noex_recnoct, N.noex_recfest
      FROM NOMINA_HORASEXT N WHERE N.noex_periodio = :periodo AND N.noex_ano = :ano AND N.terc_nit = :nite
      INTO :recnoct, :recfest;
      if (recnoct is null) then
       recnoct = 0;
      if (recfest is null) then
       recfest = 0;
      SELECT P.paan_recnoc, P.paan_recfest FROM PARAMETROS_ANO P WHERE P.paan_ano = :ano INTO :tar_recnotc, :tar_recfest;
      basico = ((:basico/30)*:diaslab) - (((:basico/30)/8)*:recnoct);
      basico = :basico - (((:basico/30)/8)*:recfest);
      /*HORAS EXTRA*/
      SELECT c.noex_monto FROM nomina_horasext c WHERE c.noex_ano = :ano AND c.noex_periodio = :periodo AND c.noex_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :horasex;
      if (horasex is null) then
       horasex = 0;
      /*RECARGOS*/
      SELECT FIRST 1  m.mvse_salario FROM MOVIMIENTO_SALARIO_EMPLEADO M WHERE M.terc_nit = :nite AND M.mvse_fecha <= :FEC ORDER BY M.mvse_fecha DESC INTO :basicorec;
      SELECT N.noex_recnoct, N.noex_recfest
      FROM NOMINA_HORASEXT N WHERE N.noex_periodio = :periodo AND N.noex_ano = :ano AND N.terc_nit = :nite
      INTO :recnoct, :recfest;
      if (recnoct is null) then
       recnoct = 0;
      if (recfest is null) then
       recfest = 0;
      SELECT P.paan_recnoc, P.paan_recfest FROM PARAMETROS_ANO P WHERE P.paan_ano = :ano INTO :tar_recnotc, :tar_recfest;
      recargo = (((:basicorec/30)/8)*:tar_recnotc)*:recnoct;
      recargo = :recargo + ((((:basicorec/30)/8)*:tar_recfest)*:recfest);
      /*basico*/
      if (:basico + :comision + :horasex + :retroact+ :reembolso + :incap+ :cambsaltrans < ((:smlv/30)*:diaslab)) then
      comision = :smlv + :comision;
      /*SMLV Y AUX. TRANSPORTE*/
      SELECT P.paan_auxtr, P.paan_salminimo FROM PARAMETROS_ANO P WHERE P.paan_ano = :ano INTO :auxtrans, :smlv;
      /*BASE*/
      valor = :basico + :comision + :horasex + :retroact+ :reembolso + :incap + :recargo + :cambsaltrans + :vacacdisf;
      IF ((conc_cod = 904) OR (conc_cod = 905) OR (conc_cod = 906) or (conc_cod = 934) ) THEN
      BEGIN
       entidad = :nitafp;
       IF (conc_cod = 904) THEN
       BEGIN
        SELECT A.paan_afptr FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
        VALOR = ((:valor) * :PORCEN) /100;
       END
       ELSE
       IF ((conc_cod = 905) OR (conc_cod = 906) or (conc_cod = 934)) THEN
       BEGIN
        SELECT A.paan_afpem FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
        VALOR = ((:valor) * :PORCEN) /100;
       END
      END
      ELSE
      IF ((conc_cod = 907) OR (conc_cod = 914) OR (conc_cod = 915) or (conc_cod = 938) ) THEN
      BEGIN
       entidad = :niteps;
       IF (conc_cod = 907) THEN
       BEGIN
        SELECT A.paan_epstr FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
        VALOR = ((:valor) * :PORCEN) /100;
       END
       ELSE
       IF ((conc_cod = 914) OR (conc_cod = 915) or (conc_cod = 938)) THEN
       BEGIN
        SELECT A.paan_epsem FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
        VALOR = ((:valor) * :PORCEN) /100;
       END
      END
      ELSE
      IF ((conc_cod = 910) OR (conc_cod = 911) OR (conc_cod = 916) OR (conc_cod = 917) OR (conc_cod = 918) OR (conc_cod = 919) or (conc_cod = 936) or (conc_cod = 939) or (conc_cod = 940)) THEN
      BEGIN
       entidad = :nitccf;
       IF ((conc_cod = 910) OR (conc_cod = 911) or (conc_cod = 936)) THEN
       BEGIN
        SELECT A.paan_ccf FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
        VALOR = ((:valor) * :PORCEN) /100;
       END
       ELSE
       IF ((conc_cod = 916) OR (conc_cod = 917) or (conc_cod = 939)) THEN
       BEGIN
        SELECT A.paan_icbf FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
        VALOR = ((:valor) * :PORCEN) /100;
       END
       ELSE
       IF ((conc_cod = 918) OR (conc_cod = 919) or (conc_cod = 940)) THEN
       BEGIN
        SELECT A.paan_sena FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
        VALOR = ((:valor) * :PORCEN) /100;
       END
      END
      ELSE
      IF ((conc_cod = 912) OR (conc_cod = 913)) THEN
      BEGIN
       entidad = :nitafc;
      EXECUTE PROCEDURE LEE_CONFIGURACION('NOMINA','LIQUIDACION','TOMAR BENEFICIOS PARA CALCULAR PROVISIONES')RETURNING_VALUES(:parambenef);
      if (parambenef = 'SI') then
      BEGIN
      SELECT SUM(ce.emco_monto)
      FROM empleado_conceptos CE, CONCEPTOS_NOMINA CN WHERE CN.conc_benefic = 'S' AND (CE.terc_nit = :nite) AND (CE.CONC_COD = CN.CONC_COD) AND
      ((CE.emco_fecini <= :fec AND CE.emco_fecfin >= :FEC) OR ((cn.conc_todosper = 'N') AND (CE.emco_ppago = :periodo)) OR
      (cn.conc_todosper = 'S'))
      INTO :beneficios;
      if (beneficios is null) then
       beneficios = 0;
      END
      ELSE
       beneficios = 0;
      SELECT P.paan_auxtr, P.paan_salminimo FROM PARAMETROS_ANO P WHERE P.paan_ano = :ano INTO :auxtrans, :smlv;
      if (:basico < (:smlv*2)) then
       auxtrans = (:auxtrans / 30) * :diaslab;
      ELSE
       auxtrans = 0;
       IF ((conc_cod = 912) OR (conc_cod = 913) or (conc_cod = 937)) THEN
       BEGIN
        SELECT A.paan_cesemp FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
        VALOR = ((:valor + :auxtrans + :beneficios) * :PORCEN) /100;
       END
      END
      ELSE
      BEGIN
       IF (comision IS NULL) THEN
       comision = 0;
       SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
       conc_monto = :basico + :comision;
       IF (conc_porc <> 0 AND conc_porc IS NOT NULL) THEN
       VALOR = (((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans + :incap) * :conc_porc) /100;
       ELSE
       IF (:porcen <> 0 AND :porcen IS NOT NULL) THEN
       VALOR = (((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans + :incap) * :porcen) /100;
       ELSE
       IF (:montos <> 0 AND :montos IS NOT NULL) THEN
       valor = :montos;
       ELSE
       IF (:conc_monto <> 0 AND :conc_monto IS NOT NULL) THEN
       valor = :conc_monto;
      END
     END
     item = :item + 1;
    END
    ELSE
    IF (conc_prov = 'S') THEN
    BEGIN
     horasex = NULL;
     diasnov = NULL;
     retroact = NULL;
     reembolso = NULL;
     beneficios = null;
     recargo = null;
     comision = null;
     incap = null;
     /*RECARGO*/
     SELECT FIRST 1  m.mvse_salario FROM MOVIMIENTO_SALARIO_EMPLEADO M WHERE M.terc_nit = :nite AND M.mvse_fecha <= :FEC ORDER BY M.mvse_fecha DESC INTO :basico;
     SELECT N.noex_recnoct, N.noex_recfest
     FROM NOMINA_HORASEXT N WHERE N.noex_periodio = :periodo AND N.noex_ano = :ano AND N.terc_nit = :nite
     INTO :recnoct, :recfest;
     if (recnoct is null) then
      recnoct = 0;
     if (recfest is null) then
      recfest = 0;
     SELECT P.paan_recnoc, P.paan_recfest FROM PARAMETROS_ANO P WHERE P.paan_ano = :ano INTO :tar_recnotc, :tar_recfest;
     recargo = (((:basico/30)/8)*:tar_recnotc)*:recnoct;
     recargo = :recargo + ((((:basico/30)/8)*:tar_recfest)*:recfest);
      /*INCAPACIDAD*/
      SELECT N.nono_dura FROM NOMINA_NOVEDADES N WHERE N.terc_nit = :nite AND N.nono_periodo = :periodo AND N.nono_ano = :ano AND (N.tnov_cod = 2 OR (N.tnov_cod = 3)) INTO :diasnov;
      IF (:diasnov IS NULL) THEN
      incap = 0;
      ELSE
      incap = (:basico / 30)* :diasnov;
     /*BASICO*/
     SELECT N.noex_recnoct, N.noex_recfest
     FROM NOMINA_HORASEXT N WHERE N.noex_periodio = :periodo AND N.noex_ano = :ano AND N.terc_nit = :nite
     INTO :recnoct, :recfest;
     if (recnoct is null) then
      recnoct = 0;
     if (recfest is null) then
      recfest = 0;
     SELECT P.paan_recnoc, P.paan_recfest FROM PARAMETROS_ANO P WHERE P.paan_ano = :ano INTO :tar_recnotc, :tar_recfest;
     basico = ((:basico/30)*:diaslab) - (((:basico/30)/8)*:recnoct);
     basico = :basico - (((:basico/30)/8)*:recfest);
     /*BENEFICIOS*/
     EXECUTE PROCEDURE LEE_CONFIGURACION('NOMINA','LIQUIDACION','TOMAR BENEFICIOS PARA CALCULAR PROVISIONES')RETURNING_VALUES(:parambenef);
     if (parambenef = 'SI') then
     BEGIN
      SELECT SUM(ce.emco_monto)
      FROM empleado_conceptos CE, CONCEPTOS_NOMINA CN WHERE CN.conc_benefic = 'S' AND (CE.terc_nit = :nite) AND (CE.CONC_COD = CN.CONC_COD) AND
      ((CE.emco_fecini <= :fec AND CE.emco_fecfin >= :FEC) OR ((cn.conc_todosper = 'N') AND (CE.emco_ppago = :periodo)) OR
      (cn.conc_todosper = 'S'))
      INTO :beneficios;
      if (beneficios is null) then
        beneficios = 0;
     END
     ELSE
      beneficios = 0;
     if ((conc_cod <> 929) and (conc_cod <> 930) and (conc_cod <> 944)) then
     begin
        SELECT P.paan_auxtr, P.paan_salminimo FROM PARAMETROS_ANO P WHERE P.paan_ano = :ano INTO :auxtrans, :smlv;
        if (:basico < (:smlv*2)) then
           auxtrans = (:auxtrans / 30) * :diaslab;
        ELSE
           auxtrans = 0;
     end
     else
      auxtrans = 0;
     conc_monto = :basico;
     IF (conc_porc <> 0 AND conc_porc IS NOT NULL) THEN
     VALOR = (((:CONC_MONTO)+ :cambsaltrans + :incap + :recargo + :auxtrans + :beneficios) * :conc_porc) /100;
     ELSE
     IF (porcen <> 0 AND porcen IS NOT NULL) THEN
     VALOR = (((:CONC_MONTO)+ :cambsaltrans + :incap + :recargo + :auxtrans + :beneficios) * :porcen) /100;
     ELSE
     IF (montos <> 0 AND montos IS NOT NULL) THEN
     VALOR = :montos;
     ELSE
     IF (conc_monto <> 0 AND conc_monto IS NOT NULL) THEN
     VALOR = :conc_monto;
     item = :item + 1;
    END
    ELSE
    IF (conc_cod = 920) THEN
    BEGIN
     SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :valor;
     IF (valor IS NULL) THEN
     valor = 0;
     item = :item + 1;
    END
    ELSE
    IF (conc_cod = 900 OR (:conc_cod = 931)) THEN
    BEGIN
     SELECT c.noex_monto FROM nomina_horasext c WHERE c.noex_ano = :ano AND c.noex_periodio = :periodo AND c.noex_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :valor;
     IF (valor IS NULL) THEN
     valor = 0;
     item = :item + 1;
    END
    ELSE
    IF (conc_cod = 932) THEN
    BEGIN
     SELECT N.nono_dura FROM NOMINA_NOVEDADES N WHERE N.terc_nit = :nite AND N.nono_periodo = :periodo AND N.nono_ano = :ano AND (N.tnov_cod = 2 OR (N.tnov_cod = 3)) INTO :diasnov;
     IF (:diasnov IS NULL) THEN
     valor = 0;
     ELSE
     valor = (:basico / 30)* :diasnov;
    END
    ELSE
    IF (conc_cod = 921) THEN
    BEGIN
     IF (porcen IS NOT NULL AND porcen <> 0) THEN
     valor = ((basico / 30)* :diaslab ) * :PORCEN /100;
     ELSE
     IF (conc_porc IS NOT NULL AND conc_porc <> 0) THEN
     valor = ((basico / 30)* :diaslab ) * :conc_porc /100;
    END
    ELSE
    if (conc_cod = 953) then
    BEGIN
       SELECT FIRST 1  m.mvse_salario FROM MOVIMIENTO_SALARIO_EMPLEADO M WHERE M.terc_nit = :nite AND M.mvse_fecha <= :FEC ORDER BY M.mvse_fecha DESC INTO :basico;
       SELECT N.noex_recnoct, N.noex_recfest
       FROM NOMINA_HORASEXT N WHERE N.noex_periodio = :periodo AND N.noex_ano = :ano AND N.terc_nit = :nite
       INTO :recnoct, :recfest;
       if (recnoct is null) then
        recnoct = 0;
       if (recfest is null) then
        recfest = 0;
       SELECT P.paan_recnoc, P.paan_recfest FROM PARAMETROS_ANO P WHERE P.paan_ano = :ano INTO :tar_recnotc, :tar_recfest;
       valor = (((:basico/30)/8)*:tar_recnotc)*:recnoct;
       valor = :valor + ((((:basico/30)/8)*:tar_recfest)*:recfest);
    END
    if (conc_aporte = 'S') then
    begin
    if (entidad is null or (entidad = '') ) then
    entidad = :conc_entidad;
    end
   END
    if ((VALOR <> 0) AND (VALOR IS NOT NULL)) then
    BEGIN
    EXECUTE PROCEDURE LEE_CONFIGURACION('NOMINA','GENERAL','REDONDEO AL MULTIPLO DE DIEZ EN TOTALES')RETURNING_VALUES(:aprox);
    EXECUTE PROCEDURE REDONDEE(:valor, :aprox) RETURNING_VALUES (VALOR);
    IF ((mensual = 'N') OR (periodicidad = 1))  THEN
    INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
    VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
    ELSE
    IF (mensual = 'S') THEN
    BEGIN
     IF ((:periodicidad = 2) AND (liquidaper = 1)) THEN
     BEGIN
      IF ((periodo = 1) OR (periodo = 3) OR (periodo = 5) OR (periodo = 7) OR (periodo = 9) OR (periodo = 11)
      OR (periodo = 13) OR (periodo = 15) OR (periodo = 17) OR (periodo = 19) OR (periodo = 21) OR (periodo = 23)) THEN
      INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
      VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
     END
     ELSE
     IF ((:periodicidad = 2) AND (liquidaper = 2)) THEN
     BEGIN
      IF ((periodo = 2) OR (periodo = 4) OR (periodo = 6) OR (periodo = 8) OR (periodo = 10) OR (periodo = 12)
      OR (periodo = 14) OR (periodo = 16) OR (periodo = 18) OR (periodo = 20) OR (periodo = 22) OR (periodo = 24)) THEN
      INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
      VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
     END
     ELSE
     IF ((:periodicidad = 3) AND (liquidaper = 1)) THEN
     BEGIN
      IF ((periodo = 1) OR (periodo = 5) OR (periodo = 9) OR (periodo = 13) OR (periodo = 17) OR (periodo = 21)
      OR (periodo = 25) OR (periodo = 29) OR (periodo = 33) OR (periodo = 37) OR (periodo = 41) OR (periodo = 45)
      OR (periodo = 49)) THEN
      INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
      VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
    END
    ELSE
     IF ((:periodicidad = 3) AND (liquidaper = 2)) THEN
     BEGIN
      IF ((periodo = 2) OR (periodo = 6) OR (periodo = 10) OR (periodo = 14) OR (periodo = 18) OR (periodo = 22)
      OR (periodo = 26) OR (periodo = 30) OR (periodo = 34) OR (periodo = 38) OR (periodo = 42) OR (periodo = 46)
      OR (periodo = 50)) THEN
      INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
      VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
     END
     ELSE
     IF ((:periodicidad = 3) AND (liquidaper = 3)) THEN
     BEGIN
      IF ((periodo = 3) OR (periodo = 7) OR (periodo = 11) OR (periodo = 15) OR (periodo = 19) OR (periodo = 23)
      OR (periodo = 27) OR (periodo = 31) OR (periodo = 35) OR (periodo = 39) OR (periodo = 43) OR (periodo = 47)
      OR (periodo = 51)) THEN
      INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
      VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
     END
     ELSE
     IF ((:periodicidad = 3) AND (liquidaper = 4)) THEN
     BEGIN
      IF ((periodo = 4) OR (periodo = 8) OR (periodo = 12) OR (periodo = 16) OR (periodo = 20) OR (periodo = 24)
      OR (periodo = 29) OR (periodo = 32) OR (periodo = 36) OR (periodo = 40) OR (periodo = 44) OR (periodo = 48)
      OR (periodo = 52)) THEN
      INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
      VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
     END
    END
  VALOR = 0;
  basico = 0;
  END
  END
 END
 END
 END
 SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER PROCEDURE FORM_INTEGRADO_ELECTRONICO (
    iddoc integer,
    fecliq varchar(8),
    codoper varchar(2))
returns (
    datos varchar(591))
as
declare variable tipreg varchar(2);
declare variable sec varchar(5);
declare variable nomcia varchar(200);
declare variable tipdocaport varchar(2);
declare variable nitcia varchar(16);
declare variable dvcia varchar(1);
declare variable formapresent varchar(1);
declare variable codsucur varchar(10);
declare variable nomsucur varchar(40);
declare variable codarp varchar(6);
declare variable perliq varchar(7);
declare variable perliqsalud char(7);
declare variable numform varchar(10);
declare variable numempl varchar(5);
declare variable numempladm varchar(6);
declare variable vlornomi varchar(12);
declare variable vlornomiint integer;
declare variable nitempl varchar(16);
declare variable secint integer;
declare variable tipoid varchar(2);
declare variable tipocot varchar(2);
declare variable stipocot varchar(2);
declare variable nom1 varchar(20);
declare variable nom2 varchar(30);
declare variable ape1 varchar(20);
declare variable ape2 varchar(30);
declare variable fecing date;
declare variable fecret date;
declare variable countnov integer;
declare variable novedad varchar(1);
declare variable codadmin varchar(6);
declare variable diaslab varchar(3);
declare variable salminimo varchar(22);
declare variable fecanomes char(7);
declare variable salbasic varchar(22);
declare variable incap varchar(2);
declare variable ciudad varchar(5);
declare variable porcapor varchar(7);
declare variable porcapor2 varchar(9);
declare variable cotobl varchar(9);
declare variable cotobladm varchar(10);
declare variable nitadmin varchar(16);
declare variable itemadm integer;
BEGIN
TIPREG = '01';
DATOS = :tipreg;
DATOS = :DATOS || '1';
SEC = '0001';
DATOS = :DATOS || :sec;
EXECUTE PROCEDURE LEE_CONFIGURACION ('GENERAL','GENERAL','NOMBRE COMPAÑIA') RETURNING_VALUES (:nomcia);
EXECUTE PROCEDURE CEROS_ANCHO_FIJO (:nomcia, 200, 'A') RETURNING_VALUES (:nomcia);
DATOS = :DATOS || :nomcia;
DATOS = :DATOS || 'NI';
EXECUTE PROCEDURE LEE_CONFIGURACION ('CONTABILIDAD','GENERAL','NIT COMPAÑIA') RETURNING_VALUES (:nitcia);
EXECUTE PROCEDURE DV (nitcia) RETURNING_VALUES (dvcia);
EXECUTE PROCEDURE CEROS_ANCHO_FIJO (:nitcia, 16, 'A') RETURNING_VALUES (:nitcia);
DATOS = :DATOS || :nitcia;
DATOS = :DATOS || :dvcia;
FORMAPRESENT = 'E';
DATOS = :DATOS || :formapresent;
DATOS = :DATOS || '0000000000';
DATOS = :DATOS || '          ';
DATOS = :DATOS || 'U';
codsucur = '';
EXECUTE PROCEDURE CEROS_ANCHO_FIJO (:codsucur, 10, 'A') RETURNING_VALUES (:codsucur);
DATOS = :DATOS || :codsucur;
nomsucur = '';
EXECUTE PROCEDURE CEROS_ANCHO_FIJO (:nomsucur, 40, 'A') RETURNING_VALUES (:nomsucur);
DATOS = :DATOS || :nomsucur;
SELECT ADMI_CODARP FROM ADMINISTRADORA A, PARAMETROS_ANO P WHERE P.paan_nitarp = A.terc_nit AND P.paan_ano = substr(:fecliq,1,4) INTO :codarp;
EXECUTE PROCEDURE CEROS_ANCHO_FIJO (:codarp, 6, 'A') RETURNING_VALUES (:codarp);
DATOS = :DATOS || :codarp;
SELECT SUBSTRING(P.pgap_fecha FROM 1 FOR 7) FROM PAGO_APORTES P WHERE P.pgap_id = :iddoc AND p.pgap_item = 1 INTO :perliq;
perliq = substr(perliq, 1,4) || '-' ||substr(perliq, 6,8);
DATOS = :DATOS || :perliq;
perliqsalud = :perliq;
DATOS = :DATOS || :perliqsalud;
SELECT pgap_formulario FROM PAGO_APORTES WHERE PGAP_ID = :iddoc AND pgap_item = 1 INTO :numform;
EXECUTE PROCEDURE CEROS_ANCHO_FIJO (:numform, 10, 'A') RETURNING_VALUES (:numform);
DATOS = :DATOS || :numform;
DATOS = :DATOS || '          ';
SELECT COUNT(E.pgap_id) FROM PAGO_APORTES_EMPLEADOS E WHERE E.pgap_id = :iddoc INTO :numempl;
EXECUTE PROCEDURE CEROS_ANCHO_FIJO (:numempl, 5, 'N') RETURNING_VALUES (:numempl);
DATOS = :DATOS || :numempl;
SELECT CAST(SUM(pade_ibc) AS INTEGER) FROM PAGO_APORTES_DETALLE WHERE PGAP_ID = :iddoc INTO :vlornomiint;
/*vlornomiint = CAST(:vlornomi AS INTEGER);
*/vlornomi = CAST(vlornomiint AS VARCHAR(12));
EXECUTE PROCEDURE CEROS_ANCHO_FIJO (:vlornomi, 12, 'N') RETURNING_VALUES (:vlornomi);
DATOS = :DATOS || :vlornomi;
DATOS = :DATOS || '1';
codoper = '0';
EXECUTE PROCEDURE CEROS_ANCHO_FIJO (:codoper, 2, 'N') RETURNING_VALUES (:codoper);
DATOS = :DATOS || :codoper;
SUSPEND;
datos = '';
secint = 0;
FOR SELECT e.terc_nit, T.terc_tipoid,t.ciud_cod , E.tcot_cod,E.stco_cod, T.terc_nombre1, T.terc_nombre2, T.terc_apellido1, T.terc_apellido2, E.empl_fecing, e.empl_fecret FROM empleados e, TERCEROS T
WHERE (e.empl_fecret > substr(:fecliq,1,4) || '/' || substr(:fecliq,5,6) || '/' || substr(:fecliq,7,8) OR (e.empl_fecret IS NULL))  AND e.empl_fecing < substr(:fecliq,1,4) || '/' || substr(:fecliq,5,6) || '/' || substr(:fecliq,7,8) AND T.terc_nit = E.terc_nit
AND E.terc_nit IN (SELECT PA.terc_nit FROM PAGO_APORTES_DETALLE PA WHERE PA.pgap_id = :iddoc)
INTO :nitempl, :tipoid, :ciudad,:tipocot,:stipocot, :nom1, :nom2, :ape1, :ape2, :fecing, :fecret
DO
 BEGIN
    tipreg  = '02';
    DATOS = :datos || tipreg;
    secint = secint + 1;
    EXECUTE PROCEDURE CEROS_ANCHO_FIJO (CAST(secint AS VARCHAR(200)), 5, 'N') RETURNING_VALUES (:sec);
    DATOS = DATOS || :SEC;
    IF (:tipoid = 'N') THEN
    tipoid = 'NI';
    IF (:tipoid = 'C') THEN
    tipoid = 'CC';
    IF (:tipoid = 'E') THEN
    tipoid = 'CE';
    IF (:tipoid = 'T') THEN
    tipoid = 'TI';
    IF (:tipoid = 'R') THEN
    tipoid = 'RC';
    IF (:tipoid = 'P') THEN
    tipoid = 'PA';
    IF (:tipoid = 'J') THEN
    tipoid = 'CC';
    DATOS = DATOS || tipoid;
    EXECUTE PROCEDURE CEROS_ANCHO_FIJO (:nitempl, 16, 'A') RETURNING_VALUES (:nitempl);
    DATOS = DATOS || :nitempl;
    EXECUTE PROCEDURE CEROS_ANCHO_FIJO (:tipocot, 2, 'N') RETURNING_VALUES (:tipocot);
    datos = datos || :tipocot;
    EXECUTE PROCEDURE CEROS_ANCHO_FIJO (:stipocot, 2, 'N') RETURNING_VALUES (:stipocot);
    datos = datos || :stipocot;
    datos = datos || ' ';
    datos = datos || ' ';
    datos = datos || substr(:ciudad,1,2);
    datos = datos || substr(:ciudad,3,6);
    EXECUTE PROCEDURE CEROS_ANCHO_FIJO (:ape1, 20, 'A') RETURNING_VALUES (:ape1);
    IF (ape1 IS NULL) THEN
    ape1 = '';
    DATOS = DATOS || :ape1;
    EXECUTE PROCEDURE CEROS_ANCHO_FIJO (:ape2, 30, 'A') RETURNING_VALUES (:ape2);
    IF (ape2 IS NULL) THEN
    ape2 = '';
    DATOS = DATOS || :ape2;
    EXECUTE PROCEDURE CEROS_ANCHO_FIJO (:nom1, 20, 'A') RETURNING_VALUES (:nom1);
    IF (nom1 IS NULL) THEN
    nom1 = '';
    DATOS = DATOS || :nom1;
    EXECUTE PROCEDURE CEROS_ANCHO_FIJO (:nom2, 30, 'A') RETURNING_VALUES (:nom2);
    IF (nom2 IS NULL) THEN
    nom2 = '';
    DATOS = DATOS || :nom2;
    novedad = null;
    IF ((substr(:fecing,6,7) = substr(:fecliq,5,6)) AND (substr(:fecing,1,4) = substr(:fecliq,1,4))) THEN
    novedad = 'X';
    ELSE
    novedad = ' ';
    datos = :datos || :novedad;
    novedad = null;
    IF (:fecret IS NOT NULL AND (substr(:fecret,6,7) = substr(:fecliq,5,6))) THEN
    novedad = 'X';
    ELSE
    novedad = ' ';
    datos = :datos || :novedad;
    novedad = null;
    SELECT COUNT(*) FROM nomina_novedades v WHERE (substr(nono_fecha, 1,4) = substr(:fecliq,1,4)) AND (substr(nono_fecha, 6,7) = substr(:fecliq,6,7)) AND v.tnov_cod = 5 AND V.nono_tipoadm = 'E' AND V.terc_nit = :nitempl INTO :countnov;
    IF (:countnov > 0) THEN
    novedad = 'X';
    ELSE
    novedad = ' ';
    datos = :datos || :novedad;
    novedad = null;
   SELECT COUNT(*) FROM nomina_novedades v WHERE (substr(nono_fecha, 1,4) = substr(:fecliq,1,4)) AND (substr(nono_fecha, 6,7) = substr(:fecliq,6,7)) AND v.tnov_cod = 5 AND V.nono_tipoadm = 'E' AND V.terc_nit = :nitempl INTO :countnov;
    IF (:countnov > 0) THEN
    novedad = 'X';
    ELSE
    novedad = ' ';
    datos = :datos || :novedad;
    novedad = null;
    SELECT COUNT(*) FROM nomina_novedades v WHERE (substr(nono_fecha, 1,4) = substr(:fecliq,1,4)) AND (substr(nono_fecha, 6,7) = substr(:fecliq,6,7)) AND v.tnov_cod = 5 AND V.nono_tipoadm = 'A' AND V.terc_nit = :nitempl INTO :countnov;
    IF (:countnov > 0) THEN
    novedad = 'X';
    ELSE
    novedad = ' ';
    datos = :datos || :novedad;    
    novedad = null;
    SELECT COUNT(*) FROM nomina_novedades v WHERE (substr(nono_fecha, 1,4) = substr(:fecliq,1,4)) AND (substr(nono_fecha, 6,7) = substr(:fecliq,6,7)) AND v.tnov_cod = 5 AND V.nono_tipoadm = 'A' AND V.terc_nit = :nitempl INTO :countnov;
    IF (:countnov > 0) THEN
    novedad = 'X';
    ELSE
    novedad = ' ';
    datos = :datos || :novedad;
    novedad = null;
    SELECT COUNT(*) FROM nomina_novedades v WHERE (substr(nono_fecha, 1,4) = substr(:fecliq,1,4)) AND (substr(nono_fecha, 6,7) = substr(:fecliq,6,7)) AND v.tnov_cod = 8 AND V.nono_tipoadm = 'A' AND V.terc_nit = :nitempl INTO :countnov;
    IF (:countnov > 0) THEN
    novedad = 'X';
    ELSE
    novedad = ' ';
    datos = :datos || :novedad;
    novedad = null;
    SELECT COUNT(*) FROM nomina_novedades v WHERE (substr(nono_fecha, 1,4) = substr(:fecliq,1,4)) AND (substr(nono_fecha, 6,7) = substr(:fecliq,6,7)) AND v.tnov_cod = 10 AND V.nono_tipoadm = 'A' AND V.terc_nit = :nitempl INTO :countnov;
    IF (:countnov > 0) THEN
    novedad = 'X';
    ELSE
    novedad = ' ';
    datos = :datos || :novedad;
    novedad = null;
    SELECT COUNT(*) FROM nomina_novedades v WHERE (substr(nono_fecha, 1,4) = substr(:fecliq,1,4)) AND (substr(nono_fecha, 6,7) = substr(:fecliq,6,7)) AND v.tnov_cod = 11 AND V.terc_nit = :nitempl INTO :countnov;
    IF (:countnov > 0) THEN
    novedad = 'X';
    ELSE
    novedad = ' ';
    datos = :datos || :novedad;    
    novedad = null;
    SELECT COUNT(*) FROM nomina_novedades v WHERE (substr(nono_fecha, 1,4) = substr(:fecliq,1,4)) AND (substr(nono_fecha, 6,7) = substr(:fecliq,6,7)) AND v.tnov_cod = 9 AND V.terc_nit = :nitempl INTO :countnov;
    IF (:countnov > 0) THEN
    novedad = 'X';
    ELSE
    novedad = ' ';
    datos = :datos || :novedad;    
    novedad = null;
    SELECT COUNT(*) FROM nomina_novedades v WHERE (substr(nono_fecha, 1,4) = substr(:fecliq,1,4)) AND (substr(nono_fecha, 6,7) = substr(:fecliq,6,7)) AND v.tnov_cod = 2 AND V.terc_nit = :nitempl INTO :countnov;
    IF (:countnov > 0) THEN
    novedad = 'X';
    ELSE
    novedad = ' ';
    datos = :datos || :novedad;    
    novedad = null;
    SELECT COUNT(*) FROM nomina_novedades v WHERE (substr(nono_fecha, 1,4) = substr(:fecliq,1,4)) AND (substr(nono_fecha, 6,7) = substr(:fecliq,6,7)) AND v.tnov_cod = 4 AND V.terc_nit = :nitempl INTO :countnov;
    IF (:countnov > 0) THEN
    novedad = 'X';
    ELSE
    novedad = ' ';
    datos = :datos || :novedad;
    novedad = null;
    SELECT COUNT(*) FROM nomina_novedades v WHERE (substr(nono_fecha, 1,4) = substr(:fecliq,1,4)) AND (substr(nono_fecha, 6,7) = substr(:fecliq,6,7)) AND v.tnov_cod = 6 AND V.terc_nit = :nitempl INTO :countnov;
    IF (:countnov > 0) THEN
    novedad = 'X';
    ELSE
    novedad = ' ';
    datos = :datos || :novedad;    
    novedad = null;
    SELECT COUNT(*) FROM nomina_novedades v WHERE (substr(nono_fecha, 1,4) = substr(:fecliq,1,4)) AND (substr(nono_fecha, 6,7) = substr(:fecliq,6,7)) AND v.tnov_cod = 1 AND V.terc_nit = :nitempl INTO :countnov;
    IF (:countnov > 0) THEN
    novedad = 'X';
    ELSE
    novedad = ' ';
    datos = :datos || :novedad;    
    novedad = null;
    SELECT COUNT(*) FROM nomina_novedades v WHERE (substr(nono_fecha, 1,4) = substr(:fecliq,1,4)) AND (substr(nono_fecha, 6,7) = substr(:fecliq,6,7)) AND v.tnov_cod = 7 AND V.terc_nit = :nitempl INTO :countnov;
    IF (:countnov > 0) THEN
    novedad = 'X';
    ELSE
    novedad = ' ';
    datos = :datos || :novedad;
    SELECT v.nono_dura FROM nomina_novedades v WHERE (substr(nono_fecha, 1,4) = substr(:fecliq,1,4)) AND (substr(nono_fecha, 6,7) = substr(:fecliq,6,7)) AND v.tnov_cod = 3 AND V.terc_nit = :nitempl INTO :countnov;
    IF (:countnov > 0) THEN
    BEGIN
    novedad = :countnov;
    END
    ELSE
    BEGIN
    countnov = 0;
    END
    EXECUTE PROCEDURE CEROS_ANCHO_FIJO (:countnov, 2, 'N') RETURNING_VALUES (:incap);
    datos = :datos || :incap;
    SELECT a.admi_codafp FROM ADMINISTRADORA A, EMPLEADOS E WHERE E.empl_afp = A.terc_nit AND E.terc_nit = :nitempl INTO :codadmin;
    IF (:codadmin IS NULL) THEN
    codadmin = ' ';
    EXECUTE PROCEDURE CEROS_ANCHO_FIJO (:codadmin, 6, 'A') RETURNING_VALUES (:codadmin);
    datos = :datos || :codadmin;
    codadmin = '';
    SELECT A.admi_codafp FROM nomina_novedades v, EMPLEADOS E, ADMINISTRADORA A WHERE (substr(nono_fecha, 1,4) = substr(:fecliq,1,4)) AND (substr(nono_fecha, 6,7) = substr(:fecliq,6,7)) AND v.tnov_cod = 5 AND V.nono_tipoadm = 'A' AND V.nono_nvaadm = A.terc_nit INTO :codadmin;
    IF (:codadmin IS NULL) THEN
    codadmin = ' ';
    EXECUTE PROCEDURE CEROS_ANCHO_FIJO (:codadmin, 6, 'A') RETURNING_VALUES (:codadmin);
    datos = :datos || :codadmin;
    codadmin = '';
    SELECT a.admi_codeps FROM ADMINISTRADORA A, EMPLEADOS E WHERE E.empl_eps = A.terc_nit AND E.terc_nit = :nitempl INTO :codadmin;
    IF (:codadmin IS NULL) THEN
    codadmin = ' ';
    EXECUTE PROCEDURE CEROS_ANCHO_FIJO (:codadmin, 6, 'A') RETURNING_VALUES (:codadmin);
    datos = :datos || :codadmin;
    codadmin = '';
    SELECT A.admi_codeps FROM nomina_novedades v, EMPLEADOS E, ADMINISTRADORA A WHERE (substr(nono_fecha, 1,4) = substr(:fecliq,1,4)) AND (substr(nono_fecha, 6,7) = substr(:fecliq,6,7)) AND v.tnov_cod = 5 AND V.nono_tipoadm = 'E' AND V.nono_nvaadm = A.terc_nit INTO :codadmin;
    IF (:codadmin IS NULL) THEN
    codadmin = ' ';
    EXECUTE PROCEDURE CEROS_ANCHO_FIJO (:codadmin, 6, 'A') RETURNING_VALUES (:codadmin);
    datos = :datos || :codadmin;
    SELECT a.admi_codccf FROM ADMINISTRADORA A, EMPLEADOS E WHERE E.empl_ccf = A.terc_nit AND E.terc_nit = :nitempl INTO :codadmin;
    IF (:codadmin IS NULL) THEN
    codadmin = ' ';
    EXECUTE PROCEDURE CEROS_ANCHO_FIJO (:codadmin, 6, 'A') RETURNING_VALUES (:codadmin);
    datos = :datos || :codadmin;
    codadmin = '';
    fecanomes = substr(:fecliq,1,4) || '/' || substr(:fecliq,5,6);
    SELECT MAX(ND.node_diaslab) FROM NOMINA_DETALLE ND, PAGO_APORTES PA WHERE PA.pgap_id = :iddoc AND ND.terc_nit = :nitempl AND PA.pgap_idnomina = ND.nomi_id INTO :diaslab;
    IF (:diaslab IS NULL) THEN
    diaslab = '00';
    EXECUTE PROCEDURE CEROS_ANCHO_FIJO (:diaslab, 2, 'N') RETURNING_VALUES (:diaslab);
    Datos = :datos || :diaslab;
    SELECT MAX(ND.node_diaslab) FROM NOMINA_DETALLE ND, PAGO_APORTES PA WHERE PA.pgap_id = :iddoc AND ND.terc_nit = :nitempl AND PA.pgap_idnomina = ND.nomi_id INTO :diaslab;
    IF (:diaslab IS NULL) THEN
    diaslab = '00';
    EXECUTE PROCEDURE CEROS_ANCHO_FIJO (:diaslab, 2, 'N') RETURNING_VALUES (:diaslab);
    Datos = :datos || :diaslab;
    SELECT MAX(ND.node_diaslab) FROM NOMINA_DETALLE ND, PAGO_APORTES PA WHERE PA.pgap_id = :iddoc AND ND.terc_nit = :nitempl AND PA.pgap_idnomina = ND.nomi_id INTO :diaslab;
    IF (:diaslab IS NULL) THEN
    diaslab = '00';
    EXECUTE PROCEDURE CEROS_ANCHO_FIJO (:diaslab, 2, 'N') RETURNING_VALUES (:diaslab);
    Datos = :datos || :diaslab;
    SELECT MAX(ND.node_diaslab) FROM NOMINA_DETALLE ND, PAGO_APORTES PA WHERE PA.pgap_id = :iddoc AND ND.terc_nit = :nitempl AND PA.pgap_idnomina = ND.nomi_id INTO :diaslab;
    IF (:diaslab IS NULL) THEN
    diaslab = '00';
    EXECUTE PROCEDURE CEROS_ANCHO_FIJO (:diaslab, 2, 'N') RETURNING_VALUES (:diaslab);
    Datos = :datos || :diaslab;
    SELECT FIRST 1  m.mvse_salario FROM MOVIMIENTO_SALARIO_EMPLEADO M WHERE M.terc_nit = :nitempl AND M.mvse_fecha <= :fecliq ORDER BY M.mvse_fecha DESC INTO :salbasic;
    IF (:salbasic IS NULL) THEN
    salbasic = '0';
    salbasic = substr(salbasic,1,strlen(salbasic)-3);
    EXECUTE PROCEDURE CEROS_ANCHO_FIJO (:salbasic, 9, 'N') RETURNING_VALUES (:salbasic);
    Datos = :datos || :salbasic;
    Datos = :datos || ' ';
    SELECT e.pgae_ibc FROM pago_aportes_empleados e WHERE e.terc_nit = :nitempl and e.pgap_id = :iddoc INTO :salbasic;
    IF (:salbasic IS NULL) THEN
    salbasic = '0';
    execute procedure redondee (salbasic,1000)returning_values(salbasic);
    salbasic = substr(salbasic,1,strlen(salbasic)-5);
    EXECUTE PROCEDURE CEROS_ANCHO_FIJO (:salbasic, 9, 'N') RETURNING_VALUES (:salbasic);
    Datos = :datos || :salbasic;
    Datos = :datos || :salbasic;
    Datos = :datos || :salbasic;
    Datos = :datos || :salbasic;
    select P.paan_afptr + P.paan_afpem from PARAMETROS_ANO P WHERE P.paan_ano = substr(:fecliq,1,4) INTO :porcapor;
    porcapor = substr(porcapor,1,strlen(porcapor)-2);
    EXECUTE PROCEDURE CEROS_ANCHO_FIJO (:porcapor, 7, 'N') RETURNING_VALUES (:porcapor);
    Datos = :datos || :porcapor;
    select P.pade_cotobl from pago_aportes_detalle P WHERE P.terc_nit = :nitempl AND P.pade_tipap = 'AFP' and p.pgap_id = :iddoc INTO :cotobl;
    cotobl = substr(cotobl,1,strlen(cotobl)-3);
    EXECUTE PROCEDURE CEROS_ANCHO_FIJO (:cotobl, 9, 'N') RETURNING_VALUES (:cotobl);
    Datos = :datos || :cotobl;
    Datos = :datos || '000000000';
    Datos = :datos || '000000000';
    Datos = :datos || '000000000';
    Datos = :datos || '000000000';
    Datos = :datos || '000000000';
    Datos = :datos || '000000000';
    select P.paan_epstr + P.paan_epsem from PARAMETROS_ANO P WHERE P.paan_ano = substr(:fecliq,1,4) INTO :porcapor;
    porcapor = substr(porcapor,1,strlen(porcapor)-2);
    EXECUTE PROCEDURE CEROS_ANCHO_FIJO (:porcapor, 7, 'N') RETURNING_VALUES (:porcapor);
    Datos = :datos || :porcapor;
    select P.pade_cotobl from pago_aportes_detalle P WHERE P.terc_nit = :nitempl AND P.pade_tipap = 'EPS' and p.pgap_id = :iddoc INTO :cotobl;
    cotobl = substr(cotobl,1,strlen(cotobl)-3);
    EXECUTE PROCEDURE CEROS_ANCHO_FIJO (:cotobl, 9, 'N') RETURNING_VALUES (:cotobl);
    Datos = :datos || :cotobl;
    Datos = :datos || '000000000';
    Datos = :datos || '               ';
    Datos = :datos || '000000000';
    Datos = :datos || '               ';
    Datos = :datos || '000000000';
    porcapor2 = '0.25';
    EXECUTE PROCEDURE CEROS_ANCHO_FIJO (:porcapor2, 9, 'N') RETURNING_VALUES (:porcapor2);
    Datos = :datos || :porcapor2;
    Datos = :datos || '000000000';
    select P.pade_cotobl from pago_aportes_detalle P WHERE P.terc_nit = :nitempl AND P.pade_tipap = 'ARP' and p.pgap_id = :iddoc INTO :cotobl;
    cotobl = substr(cotobl,1,strlen(cotobl)-3);
    EXECUTE PROCEDURE CEROS_ANCHO_FIJO (:cotobl, 9, 'N') RETURNING_VALUES (:cotobl);
    Datos = :datos || :cotobl;
    select P.paan_ccf from PARAMETROS_ANO P WHERE P.paan_ano = substr(:fecliq,1,4) INTO :porcapor;
    porcapor = substr(porcapor,1,strlen(porcapor)-2);
    EXECUTE PROCEDURE CEROS_ANCHO_FIJO (:porcapor, 7, 'N') RETURNING_VALUES (:porcapor);
    Datos = :datos || :porcapor;
    select (P.pade_cotobl)*4/9 from pago_aportes_detalle P WHERE P.terc_nit = :nitempl AND P.pade_tipap = 'CCF' and p.pgap_id = :iddoc INTO :cotobl;
    cotobl = substr(cotobl,1,strlen(cotobl)-3);
    EXECUTE PROCEDURE CEROS_ANCHO_FIJO (:cotobl, 9, 'N') RETURNING_VALUES (:cotobl);
    Datos = :datos || :cotobl;
    select P.paan_sena from PARAMETROS_ANO P WHERE P.paan_ano = substr(:fecliq,1,4) INTO :porcapor;
    porcapor = substr(porcapor,1,strlen(porcapor)-2);
    EXECUTE PROCEDURE CEROS_ANCHO_FIJO (:porcapor, 7, 'N') RETURNING_VALUES (:porcapor);
    Datos = :datos || :porcapor;
    select (P.pade_cotobl)*2/9 from pago_aportes_detalle P WHERE P.terc_nit = :nitempl AND P.pade_tipap = 'CCF' and p.pgap_id = :iddoc INTO :cotobl;
    cotobl = substr(cotobl,1,strlen(cotobl)-3);
    EXECUTE PROCEDURE CEROS_ANCHO_FIJO (:cotobl, 9, 'N') RETURNING_VALUES (:cotobl);
    Datos = :datos || :cotobl;
    select P.paan_icbf from PARAMETROS_ANO P WHERE P.paan_ano = substr(:fecliq,1,4) INTO :porcapor;
    porcapor = substr(porcapor,1,strlen(porcapor)-2);
    EXECUTE PROCEDURE CEROS_ANCHO_FIJO (:porcapor, 7, 'N') RETURNING_VALUES (:porcapor);
    Datos = :datos || :porcapor;
    select (P.pade_cotobl)*3/9 from pago_aportes_detalle P WHERE P.terc_nit = :nitempl AND P.pade_tipap = 'CCF' and p.pgap_id = :iddoc INTO :cotobl;
    cotobl = substr(cotobl,1,strlen(cotobl)-3);
    EXECUTE PROCEDURE CEROS_ANCHO_FIJO (:cotobl, 9, 'N') RETURNING_VALUES (:cotobl);
    Datos = :datos || :cotobl;
    Datos = :datos || '0000000';
    Datos = :datos || '000000000';
    Datos = :datos || '0000000';
    Datos = :datos || '000000000';
    SUSPEND;
    datos = '';
    cotobl = 0;
    END
datos = '';
secint = 0;
FOR SELECT a.admi_codafp, a.terc_nit,p.pgap_monto,p.pgap_item FROM administradora a, pago_aportes p
WHERE (p.pgap_admin = a.terc_nit) and p.pgap_id = :iddoc and a.admi_afp = 'S'
INTO :codadmin, :nitadmin, :cotobladm, :itemadm
DO
 BEGIN
  tipreg = '03';
  Datos = :datos || :tipreg;
  secint = secint + 1;
  EXECUTE PROCEDURE CEROS_ANCHO_FIJO (CAST(secint AS VARCHAR(200)), 5, 'N') RETURNING_VALUES (:sec);
  DATOS = DATOS || :SEC;
  EXECUTE PROCEDURE CEROS_ANCHO_FIJO (codadmin, 6, 'A') RETURNING_VALUES (:codadmin);
  DATOS = DATOS || :codadmin;
  EXECUTE PROCEDURE DV (nitadmin) RETURNING_VALUES (dvcia);
  EXECUTE PROCEDURE CEROS_ANCHO_FIJO (nitadmin, 16, 'A') RETURNING_VALUES (:nitadmin);
  DATOS = DATOS || :nitadmin;
  DATOS = :DATOS || :dvcia;
  SELECT sum(P.pade_cotobl) FROM PAGO_APORTES_DETALLE P WHERE P.pade_itemdet = :itemadm and p.pade_tipap = 'AFP' and p.pgap_id = :iddoc INTO :cotobladm;
  cotobladm = substr(cotobladm,1,strlen(cotobladm)-3);
  EXECUTE PROCEDURE CEROS_ANCHO_FIJO (cotobladm, 10, 'N') RETURNING_VALUES (:cotobladm);
  DATOS = DATOS || :cotobladm;
  DATOS = DATOS || '00000000000000000000000000000000000000000000000000000000000000000000000000';
  EXECUTE PROCEDURE CEROS_ANCHO_FIJO (cotobladm, 10, 'N') RETURNING_VALUES (:cotobladm);
  DATOS = DATOS || :cotobladm;
  SELECT COUNT(P.pgap_item) FROM PAGO_APORTES_DETALLE P WHERE P.pade_itemdet = :itemadm and p.pade_tipap = 'AFP' and p.pgap_id = :iddoc INTO :numempladm;
  EXECUTE PROCEDURE CEROS_ANCHO_FIJO (numempladm, 6, 'N') RETURNING_VALUES (:numempladm);
  DATOS = DATOS || :numempladm;
  if (cotobladm <> '0000000000') then
  suspend;
  datos = '';
 END
secint = 0;
FOR SELECT a.admi_codeps, a.terc_nit,p.pgap_item FROM administradora a, pago_aportes p
WHERE (p.pgap_admin = a.terc_nit) and p.pgap_id = :iddoc and a.admi_eps = 'S'
INTO :codadmin, :nitadmin, :itemadm
DO
 BEGIN
  tipreg = '04';
  Datos = :datos || :tipreg;
  secint = secint + 1;
  EXECUTE PROCEDURE CEROS_ANCHO_FIJO (CAST(secint AS VARCHAR(200)), 5, 'N') RETURNING_VALUES (:sec);
  DATOS = DATOS || :SEC;
  EXECUTE PROCEDURE CEROS_ANCHO_FIJO (codadmin, 6, 'A') RETURNING_VALUES (:codadmin);
  DATOS = DATOS || :codadmin;
  EXECUTE PROCEDURE DV (nitadmin) RETURNING_VALUES (dvcia);
  EXECUTE PROCEDURE CEROS_ANCHO_FIJO (nitadmin, 16, 'A') RETURNING_VALUES (:nitadmin);
  DATOS = DATOS || :nitadmin;
  DATOS = :DATOS || :dvcia;
  SELECT sum(P.pade_cotobl) FROM PAGO_APORTES_DETALLE P WHERE P.pade_itemdet = :itemadm and p.pade_tipap = 'EPS' and p.pgap_id = :iddoc INTO :cotobladm;
  cotobladm = substr(cotobladm,1,strlen(cotobladm)-3);
  EXECUTE PROCEDURE CEROS_ANCHO_FIJO (cotobladm, 10, 'N') RETURNING_VALUES (:cotobladm);
  DATOS = DATOS || :cotobladm;
  DATOS = DATOS || '0000000000               0000000000               0000000000';
  EXECUTE PROCEDURE CEROS_ANCHO_FIJO (cotobladm, 10, 'N') RETURNING_VALUES (:cotobladm);
  DATOS = DATOS || :cotobladm;
  DATOS = DATOS || '000000000000000000000000';
  EXECUTE PROCEDURE CEROS_ANCHO_FIJO (cotobladm, 10, 'N') RETURNING_VALUES (:cotobladm);
  DATOS = DATOS || :cotobladm;
  DATOS = DATOS || '0000000000000000000000000000000000000000';
  EXECUTE PROCEDURE CEROS_ANCHO_FIJO (cotobladm, 10, 'N') RETURNING_VALUES (:cotobladm);
  DATOS = DATOS || :cotobladm;
  DATOS = DATOS || '0000000000';
  EXECUTE PROCEDURE CEROS_ANCHO_FIJO (cotobladm, 10, 'N') RETURNING_VALUES (:cotobladm);
  DATOS = DATOS || :cotobladm;
  DATOS = DATOS || '0000000000';
  SELECT COUNT(P.pgap_item) FROM PAGO_APORTES_DETALLE P WHERE P.pade_itemdet = :itemadm and p.pade_tipap = 'EPS' and p.pgap_id = :iddoc INTO :numempladm;
  EXECUTE PROCEDURE CEROS_ANCHO_FIJO (numempladm, 6, 'N') RETURNING_VALUES (:numempladm);
  DATOS = DATOS || :numempladm;
  if (cotobladm <> '0000000000') then
  suspend;
  datos = '';
 END
secint = 0;
FOR SELECT a.admi_codarp, a.terc_nit,p.pgap_item FROM administradora a, pago_aportes p
WHERE (p.pgap_admin = a.terc_nit) and p.pgap_id = :iddoc and a.admi_arp = 'S'
INTO :codadmin, :nitadmin, :itemadm
DO
 BEGIN
  tipreg = '05';
  Datos = :datos || :tipreg;
  secint = secint + 1;
  EXECUTE PROCEDURE CEROS_ANCHO_FIJO (CAST(secint AS VARCHAR(200)), 5, 'N') RETURNING_VALUES (:sec);
  DATOS = DATOS || :SEC;
  EXECUTE PROCEDURE CEROS_ANCHO_FIJO (codadmin, 6, 'A') RETURNING_VALUES (:codadmin);
  DATOS = DATOS || :codadmin;
  EXECUTE PROCEDURE DV (nitadmin) RETURNING_VALUES (dvcia);
  EXECUTE PROCEDURE CEROS_ANCHO_FIJO (nitadmin, 16, 'A') RETURNING_VALUES (:nitadmin);
  DATOS = DATOS || :nitadmin;
  DATOS = :DATOS || :dvcia;
  SELECT sum(P.pade_cotobl) FROM PAGO_APORTES_DETALLE P WHERE P.pgap_item = :itemadm and p.pade_tipap = 'ARP' and p.pgap_id = :iddoc INTO :cotobladm;
  cotobladm = substr(cotobladm,1,strlen(cotobladm)-3);
  EXECUTE PROCEDURE CEROS_ANCHO_FIJO (cotobladm, 10, 'N') RETURNING_VALUES (:cotobladm);
  DATOS = DATOS || :cotobladm;
  DATOS = DATOS || '               00000000000000000000';
  EXECUTE PROCEDURE CEROS_ANCHO_FIJO (cotobladm, 10, 'N') RETURNING_VALUES (:cotobladm);
  DATOS = DATOS || :cotobladm;
  DATOS = DATOS || '00000000000000';
  EXECUTE PROCEDURE CEROS_ANCHO_FIJO (cotobladm, 10, 'N') RETURNING_VALUES (:cotobladm);
  DATOS = DATOS || :cotobladm;
  DATOS = DATOS || '00000000000000000000';
  EXECUTE PROCEDURE CEROS_ANCHO_FIJO (cotobladm, 10, 'N') RETURNING_VALUES (:cotobladm);
  DATOS = DATOS || :cotobladm;
  SELECT sum(P.pade_cotobl)/100 FROM PAGO_APORTES_DETALLE P WHERE P.pgap_item = :itemadm and p.pade_tipap = 'ARP' and p.pgap_id = :iddoc INTO :cotobladm;
  cotobladm = substr(cotobladm,1,strlen(cotobladm)-3);
  EXECUTE PROCEDURE CEROS_ANCHO_FIJO (cotobladm, 10, 'N') RETURNING_VALUES (:cotobladm);
  DATOS = DATOS || :cotobladm;
  SELECT COUNT(P.pgap_item) FROM PAGO_APORTES_DETALLE P WHERE P.pgap_item = :itemadm and p.pade_tipap = 'ARP' and p.pgap_id = :iddoc INTO :numempladm;
  EXECUTE PROCEDURE CEROS_ANCHO_FIJO (numempladm, 6, 'N') RETURNING_VALUES (:numempladm);
  DATOS = DATOS || :numempladm;
  if (cotobladm <> '0000000000') then
  suspend;
  datos = '';
 END
secint = 0;
FOR SELECT a.admi_codccf, a.terc_nit,p.pgap_item FROM administradora a, pago_aportes p
WHERE (p.pgap_admin = a.terc_nit) and p.pgap_id = :iddoc and a.admi_ccf = 'S'
INTO :codadmin, :nitadmin, :itemadm
DO
 BEGIN
  tipreg = '06';
  Datos = :datos || :tipreg;
  secint = secint + 1;
  EXECUTE PROCEDURE CEROS_ANCHO_FIJO (CAST(secint AS VARCHAR(200)), 5, 'N') RETURNING_VALUES (:sec);
  DATOS = DATOS || :SEC;
  EXECUTE PROCEDURE CEROS_ANCHO_FIJO (codadmin, 6, 'A') RETURNING_VALUES (:codadmin);
  DATOS = DATOS || :codadmin;
  EXECUTE PROCEDURE DV (nitadmin) RETURNING_VALUES (dvcia);
  EXECUTE PROCEDURE CEROS_ANCHO_FIJO (nitadmin, 16, 'A') RETURNING_VALUES (:nitadmin);
  DATOS = DATOS || :nitadmin;
  DATOS = :DATOS || :dvcia;
  SELECT sum(P.pade_cotobl)*4/9 FROM PAGO_APORTES_DETALLE P WHERE P.pgap_item = :itemadm and p.pade_tipap = 'CCF' and p.pgap_id = :iddoc INTO :cotobladm;
  cotobladm = substr(cotobladm,1,strlen(cotobladm)-3);
  EXECUTE PROCEDURE CEROS_ANCHO_FIJO (cotobladm, 10, 'N') RETURNING_VALUES (:cotobladm);
  DATOS = DATOS || :cotobladm;
  DATOS = DATOS || '00000000000000';
  EXECUTE PROCEDURE CEROS_ANCHO_FIJO (cotobladm, 10, 'N') RETURNING_VALUES (:cotobladm);
  DATOS = DATOS || :cotobladm;
  SELECT COUNT(P.pgap_item) FROM PAGO_APORTES_DETALLE P WHERE P.pgap_item = :itemadm and p.pade_tipap = 'CCF' and p.pgap_id = :iddoc INTO :numempladm;
  EXECUTE PROCEDURE CEROS_ANCHO_FIJO (numempladm, 6, 'N') RETURNING_VALUES (:numempladm);
  DATOS = DATOS || :numempladm;
  if (cotobladm <> '0000000000') then
  suspend;
  datos = '';
 END
secint = 0;
FOR SELECT a.admi_codccf, a.terc_nit,p.pgap_item FROM administradora a, pago_aportes p
WHERE (p.pgap_admin = a.terc_nit) and p.pgap_id = :iddoc and a.admi_ccf = 'S'
INTO :codadmin, :nitadmin, :itemadm
DO
 BEGIN
  tipreg = '07';
  Datos = :datos || :tipreg;
  secint = secint + 1;
  EXECUTE PROCEDURE CEROS_ANCHO_FIJO (CAST(secint AS VARCHAR(200)), 5, 'N') RETURNING_VALUES (:sec);
  DATOS = DATOS || :SEC;
  nitadmin = '899999034';
  EXECUTE PROCEDURE DV (nitadmin) RETURNING_VALUES (dvcia);
  EXECUTE PROCEDURE CEROS_ANCHO_FIJO (nitadmin, 16, 'A') RETURNING_VALUES (:nitadmin);
  DATOS = DATOS || :nitadmin;
  DATOS = :DATOS || :dvcia;
  SELECT sum(P.pade_cotobl)*2/9 FROM PAGO_APORTES_DETALLE P WHERE P.pgap_item = :itemadm and p.pade_tipap = 'CCF' and p.pgap_id = :iddoc INTO :cotobladm;
  cotobladm = substr(cotobladm,1,strlen(cotobladm)-3);
  EXECUTE PROCEDURE CEROS_ANCHO_FIJO (cotobladm, 10, 'N') RETURNING_VALUES (:cotobladm);
  DATOS = DATOS || :cotobladm;
  DATOS = DATOS || '00000000000000';
  EXECUTE PROCEDURE CEROS_ANCHO_FIJO (cotobladm, 10, 'N') RETURNING_VALUES (:cotobladm);
  DATOS = DATOS || :cotobladm;
  SELECT COUNT(P.pgap_item) FROM PAGO_APORTES_DETALLE P WHERE P.pgap_item = :itemadm and p.pade_tipap = 'CCF' and p.pgap_id = :iddoc INTO :numempladm;
  EXECUTE PROCEDURE CEROS_ANCHO_FIJO (numempladm, 6, 'N') RETURNING_VALUES (:numempladm);
  DATOS = DATOS || :numempladm;
  if (cotobladm <> '0000000000') then
  suspend;
  datos = '';
 END
secint = 0;
FOR SELECT a.admi_codccf, a.terc_nit,p.pgap_item FROM administradora a, pago_aportes p
WHERE (p.pgap_admin = a.terc_nit) and p.pgap_id = :iddoc and a.admi_ccf = 'S'
INTO :codadmin, :nitadmin, :itemadm
DO
 BEGIN
  tipreg = '08';
  Datos = :datos || :tipreg;
  secint = secint + 1;
  EXECUTE PROCEDURE CEROS_ANCHO_FIJO (CAST(secint AS VARCHAR(200)), 5, 'N') RETURNING_VALUES (:sec);
  DATOS = DATOS || :SEC;
  nitadmin = '800213277';
  EXECUTE PROCEDURE DV (nitadmin) RETURNING_VALUES (dvcia);
  EXECUTE PROCEDURE CEROS_ANCHO_FIJO (nitadmin, 16, 'A') RETURNING_VALUES (:nitadmin);
  DATOS = DATOS || :nitadmin;
  DATOS = :DATOS || :dvcia;
  SELECT sum(P.pade_cotobl)*3/9 FROM PAGO_APORTES_DETALLE P WHERE P.pgap_item = :itemadm and p.pade_tipap = 'CCF' and p.pgap_id = :iddoc INTO :cotobladm;
  cotobladm = substr(cotobladm,1,strlen(cotobladm)-3);
  EXECUTE PROCEDURE CEROS_ANCHO_FIJO (cotobladm, 10, 'N') RETURNING_VALUES (:cotobladm);
  DATOS = DATOS || :cotobladm;
  DATOS = DATOS || '00000000000000';
  EXECUTE PROCEDURE CEROS_ANCHO_FIJO (cotobladm, 10, 'N') RETURNING_VALUES (:cotobladm);
  DATOS = DATOS || :cotobladm;
  SELECT COUNT(P.pgap_item) FROM PAGO_APORTES_DETALLE P WHERE P.pgap_item = :itemadm and p.pade_tipap = 'CCF' and p.pgap_id = :iddoc INTO :numempladm;
  EXECUTE PROCEDURE CEROS_ANCHO_FIJO (numempladm, 6, 'N') RETURNING_VALUES (:numempladm);
  DATOS = DATOS || :numempladm;
  if (cotobladm <> '0000000000') then
  suspend;
  datos = '';
 END
 BEGIN
  tipreg = '11';
  Datos = :datos || :tipreg;
  secint = secint + 1;
  SELECT sum(P.pade_cotobl) FROM PAGO_APORTES_DETALLE P WHERE p.pade_tipap = 'AFP' and p.pgap_id = :iddoc INTO :cotobladm;
  cotobladm = substr(cotobladm,1,strlen(cotobladm)-3);
  EXECUTE PROCEDURE CEROS_ANCHO_FIJO (cotobladm, 10, 'N') RETURNING_VALUES (:cotobladm);
  DATOS = DATOS || :cotobladm;
  SELECT sum(P.pade_cotobl) FROM PAGO_APORTES_DETALLE P WHERE p.pade_tipap = 'EPS' and p.pgap_id = :iddoc INTO :cotobladm;
  cotobladm = substr(cotobladm,1,strlen(cotobladm)-3);
  EXECUTE PROCEDURE CEROS_ANCHO_FIJO (cotobladm, 10, 'N') RETURNING_VALUES (:cotobladm);
  DATOS = DATOS || :cotobladm;
  SELECT sum(P.pade_cotobl) FROM PAGO_APORTES_DETALLE P WHERE p.pade_tipap = 'ARP' and p.pgap_id = :iddoc INTO :cotobladm;
  cotobladm = substr(cotobladm,1,strlen(cotobladm)-3);
  EXECUTE PROCEDURE CEROS_ANCHO_FIJO (cotobladm, 10, 'N') RETURNING_VALUES (:cotobladm);
  DATOS = DATOS || :cotobladm;
  SELECT sum(P.pade_cotobl)*4/9 FROM PAGO_APORTES_DETALLE P WHERE p.pade_tipap = 'CCF' and p.pgap_id = :iddoc INTO :cotobladm;
  cotobladm = substr(cotobladm,1,strlen(cotobladm)-3);
  EXECUTE PROCEDURE CEROS_ANCHO_FIJO (cotobladm, 10, 'N') RETURNING_VALUES (:cotobladm);
  DATOS = DATOS || :cotobladm;
  SELECT sum(P.pade_cotobl)*2/9 FROM PAGO_APORTES_DETALLE P WHERE p.pade_tipap = 'CCF' and p.pgap_id = :iddoc INTO :cotobladm;
  cotobladm = substr(cotobladm,1,strlen(cotobladm)-3);
  EXECUTE PROCEDURE CEROS_ANCHO_FIJO (cotobladm, 10, 'N') RETURNING_VALUES (:cotobladm);
  DATOS = DATOS || :cotobladm;
  SELECT sum(P.pade_cotobl)*3/9 FROM PAGO_APORTES_DETALLE P WHERE p.pade_tipap = 'CCF' and p.pgap_id = :iddoc INTO :cotobladm;
  cotobladm = substr(cotobladm,1,strlen(cotobladm)-3);
  EXECUTE PROCEDURE CEROS_ANCHO_FIJO (cotobladm, 10, 'N') RETURNING_VALUES (:cotobladm);
  DATOS = DATOS || :cotobladm;
  DATOS = DATOS || '00000000000000000000';
  SELECT sum(P.pade_cotobl)*3/9 FROM PAGO_APORTES_DETALLE P WHERE p.pgap_id = :iddoc INTO :cotobladm;
  cotobladm = substr(cotobladm,1,strlen(cotobladm)-3);
  EXECUTE PROCEDURE CEROS_ANCHO_FIJO (cotobladm, 10, 'N') RETURNING_VALUES (:cotobladm);
  DATOS = DATOS || :cotobladm;
  SELECT COUNT(P.pgap_item) FROM PAGO_APORTES_DETALLE P WHERE p.pade_tipap = 'AFP' and p.pgap_id = :iddoc INTO :numempladm;
  EXECUTE PROCEDURE CEROS_ANCHO_FIJO (numempladm, 10, 'N') RETURNING_VALUES (:numempladm);
  DATOS = DATOS || :numempladm;
  SELECT COUNT(P.pgap_item) FROM PAGO_APORTES_DETALLE P WHERE p.pade_tipap = 'EPS' and p.pgap_id = :iddoc INTO :numempladm;
  EXECUTE PROCEDURE CEROS_ANCHO_FIJO (numempladm, 10, 'N') RETURNING_VALUES (:numempladm);
  DATOS = DATOS || :numempladm;
  SELECT COUNT(P.pgap_item) FROM PAGO_APORTES_DETALLE P WHERE p.pade_tipap = 'ARP' and p.pgap_id = :iddoc INTO :numempladm;
  EXECUTE PROCEDURE CEROS_ANCHO_FIJO (numempladm, 10, 'N') RETURNING_VALUES (:numempladm);
  DATOS = DATOS || :numempladm;
  SELECT COUNT(P.pgap_item) FROM PAGO_APORTES_DETALLE P WHERE p.pade_tipap = 'CCF' and p.pgap_id = :iddoc INTO :numempladm;
  EXECUTE PROCEDURE CEROS_ANCHO_FIJO (numempladm, 10, 'N') RETURNING_VALUES (:numempladm);
  DATOS = DATOS || :numempladm;
  suspend;
  datos = '';
 END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER PROCEDURE IMPR_PLANILLA_NOMINA (
    id integer,
    pago char(1),
    cta char(1),
    empl char(1),
    dpto varchar(20))
returns (
    fecha date,
    observaciones blob sub_type 0 segment size 80,
    pagoglobal char(1),
    periodo integer,
    ano char(4),
    periodicidad varchar(60),
    nitempl varchar(20),
    valor numeric(18,2),
    deduc char(1),
    nombreempl varchar(60),
    nomcortconc varchar(60),
    nombreconc varchar(60),
    codconc integer,
    prov char(1),
    totalempl numeric(18,2),
    totaldeduc numeric(18,2),
    totaldeveng numeric(18,2),
    numempl integer,
    ctaempl varchar(25),
    totalctas numeric(18,2),
    totalnomi numeric(18,2),
    totalapor numeric(18,2),
    nomper varchar(60),
    org integer,
    cargoempl varchar(60),
    deptoempl varchar(60),
    numcop integer,
    nombre_copia varchar(60),
    diaslab integer,
    salario numeric(18,2),
    beneficio char(1),
    base numeric(18,2),
    coddptoempl integer)
as
declare variable nitant varchar(20);
declare variable nitnue varchar(20);
declare variable numconc integer;
declare variable totalnomineg numeric(18,2);
declare variable totalaporneg numeric(18,2);
declare variable par integer;
declare variable impar integer;
declare variable antdeduc char(1);
declare variable nitdeduc varchar(20);
declare variable nittot varchar(20);
declare variable nitaux varchar(20);
BEGIN
 SELECT N.nuco_copia FROM NUMERO_COPIA N WHERE N.tido_cod = 92 AND N.nuco_id = :id INTO :NUMCOP;
 IF (numcop IS NULL) THEN
 BEGIN
  numcop = 0;
  INSERT INTO NUMERO_COPIA (TIDO_COD, NUCO_ID, NUCO_COPIA) VALUES (92,:id,:numcop);
 END
 ELSE
 BEGIN
  numcop = :numcop + 1;
  UPDATE numero_copia N SET N.nuco_copia = :numcop WHERE N.tido_cod = 92 AND N.nuco_id = :id;
 END
 SELECT N.noco_nombre FROM nombres_copias N WHERE N.noco_id = :numcop INTO :nombre_copia;
 numempl = 0;
 nitant = 0;
 nitnue = 0;
 IF (PAGO = 'N') THEN
 BEGIN
  FOR SELECT N.nomi_feccausa, N.nomi_obs, N.nomi_pagoglobal, N.nomi_periodo, N.nomi_ano, P.ppag_nombre, PN.pnom_nombre FROM NOMINA N, periodo_pago P, periodo_pago_nombre PN
  WHERE P.ppag_cod = N.nomi_periodocidad AND N.nomi_id = :ID AND PN.ppag_cod = N.nomi_periodocidad AND PN.ppag_periodo = N.nomi_periodo
  INTO :fecha, :observaciones, :pagoglobal, :periodo, :ano, :periodicidad, :NOMPER
  DO
  BEGIN
   FOR SELECT NC.terc_nit, NC.noco_valor, NC.noco_deduc, T.terc_nom, C.conc_nomcorto, C.conc_nombre, NC.conc_cod, NC.noco_prov, E.empl_cargo FROM NOMINA_CONCEPTOS NC, TERCEROS T, EMPLEADOS E, CONCEPTOS_NOMINA C
   WHERE NC.nomi_id = :ID AND T.terc_nit = E.terc_nit AND C.conc_cod = NC.conc_cod AND t.terc_nit = nc.terc_nit
   INTO :nitempl, :valor, :deduc, :nombreempl, :nomcortconc, :nombreconc, :codconc, :prov, :cargoempl
   DO
   BEGIN
    IF (valor IS NULL) THEN
    valor = 0;
    SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND TERC_NIT = :nitempl INTO :totalempl;
    SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND TERC_NIT = :nitempl AND NC.noco_deduc = 'S' INTO :totaldeduc;
    SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND TERC_NIT = :nitempl AND NC.noco_deduc = 'N' INTO :totaldeveng;
    SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id INTO :totalnomi;
    SELECT SUM(NC.noco_valor*-1) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_APORTE = 'S' AND NOCO_VALOR < 0 AND NOMI_ID = :id INTO :totalaporneg;
    SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_APORTE = 'S' AND NOCO_VALOR > 0 AND NOMI_ID = :id INTO :totalapor;
    totalapor = :totalapor + totalaporneg;
    SUSPEND;
   END
   nitempl = '';
   valor = NULL;
   deduc = '';
   nombreempl = NULL;
   nomcortconc = NULL;
   nombreconc = NULL;
   codconc = NULL;
   prov = NULL;
   FOR SELECT MAX(N.conc_cod) FROM NOMINA_CONCEPTOS N WHERE N.nomi_id = :id
   GROUP BY N.conc_cod
   INTO :codconc
   DO
   BEGIN
    SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC
    WHERE NC.nomi_id = :ID AND NC.conc_cod = :codconc
    GROUP BY NC.conc_cod
    INTO :valor;
    nitempl = '';
    nombreempl = '';
    deduc = 'N';
    prov = 'N';
    SELECT C.conc_nombre,C.conc_nomcorto FROM CONCEPTOS_NOMINA C WHERE C.conc_cod = :codconc INTO :nombreconc,:nomcortconc;
    SUSPEND;
   END
   IF (EMPL = 'N') THEN
   BEGIN
     deduc = 'N';
     nomcortconc = 'DIAS LAB.';
     nombreconc = 'DIAS LAB.';
     codconc = 0;
     prov = 'N';
     valor = NULL;
     nitempl = '';
     nombreempl = '';
     SUSPEND;
     deduc = 'N';
     nomcortconc = 'SDO BASE';
     nombreconc = 'SDO BASE';
     codconc = 0;
     prov = 'N';
     valor = NULL;
     nitempl = '';
     nombreempl = '';
     SUSPEND;
  END
     FOR SELECT ND.node_diaslab, ND.terc_nit, T.terc_nom FROM NOMINA_DETALLE ND, EMPLEADOS E, TERCEROS T WHERE NOMI_ID = :id AND ND.terc_nit = E.terc_nit AND T.terc_nit = ND.terc_nit
     INTO :diaslab, :nitaux, :nombreempl
     DO
     BEGIN
      SELECT FIRST 1  m.mvse_salario FROM MOVIMIENTO_SALARIO_EMPLEADO M WHERE M.terc_nit = :nitaux AND M.mvse_fecha <= :fecha ORDER BY M.mvse_fecha DESC INTO :salario;
      nitempl = :nitaux;
      nomcortconc = 'DIAS LAB.';
      valor = :diaslab;
      SUSPEND;
      nitempl = :nitaux;
      nomcortconc = 'SDO BASE';
      valor = :salario;
      SUSPEND;
     END
  END
 END
 ELSE
 IF (PAGO = 'S') THEN
 BEGIN
  par = 2;
  impar = 1;
  SELECT N.nomi_feccausa, N.nomi_obs, N.nomi_pagoglobal, N.nomi_periodo, N.nomi_ano, P.ppag_nombre, PN.pnom_nombre FROM NOMINA N, periodo_pago P, periodo_pago_nombre PN
  WHERE P.ppag_cod = N.nomi_periodocidad AND N.nomi_id = :ID AND PN.ppag_cod = N.nomi_periodocidad AND PN.ppag_periodo = N.nomi_periodo
  INTO :fecha, :observaciones, :pagoglobal, :periodo, :ano, :periodicidad, :NOMPER;
  IF (EMPL = 'N') THEN
  BEGIN
     deduc = 'N';
     nomcortconc = 'DIAS LAB.';
     nombreconc = 'DIAS LAB.';
     codconc = 0;
     prov = 'N';
     valor = NULL;
     nitempl = '';
     nombreempl = '';
     SUSPEND;
     deduc = 'N';
     nomcortconc = 'SDO BASE';
     nombreconc = 'SDO BASE';
     codconc = 0;
     prov = 'N';
     valor = NULL;
     nitempl = '';
     nombreempl = '';
     SUSPEND;
     deduc = 'N';
     nomcortconc = 'TOTAL DEV';
     nombreconc = 'TOTAL DEV';
     codconc = 9999;
     prov = 'N';
     valor = NULL;
     nitempl = '';
     nombreempl = '';
     SUSPEND;
     deduc = 'S';
     nomcortconc = 'TOTAL DEDUC';
     nombreconc = 'TOTAL DEDUC';
     codconc = 99999;
     prov = 'N';
     valor = NULL;
     nitempl = '';
     nombreempl = '';
     SUSPEND;
     deduc = 'S';
     nomcortconc = 'TOTAL EMPL';
     nombreconc = 'TOTAL EMPL';
     codconc = 999999;
     prov = 'N';
     valor = NULL;
     nitempl = '';
     nombreempl = '';
     SUSPEND;
  END
  BEGIN
    IF (EMPL = 'N') THEN
    BEGIN
     FOR SELECT MAX(N.conc_cod) FROM NOMINA_CONCEPTOS N WHERE N.nomi_id = :id AND N.noco_prov = 'N' AND N.noco_gtoempr = 'N'
     GROUP BY N.conc_cod
     INTO :codconc
     DO
     BEGIN
      SELECT NULL, MAX(NC.noco_deduc) FROM NOMINA_CONCEPTOS NC
      WHERE NC.nomi_id = :ID AND NC.conc_cod = :codconc
      GROUP BY NC.conc_cod
      INTO :valor, :deduc;
      valor = NULL;
      nitempl = '';
      nombreempl = '';
      prov = 'N';
      SELECT C.conc_nombre,C.conc_nomcorto FROM CONCEPTOS_NOMINA C WHERE C.conc_cod = :codconc INTO :nombreconc,:nomcortconc;
      SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id INTO :totalempl;
      SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND NC.noco_deduc = 'S' INTO :totaldeduc;
      SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND NC.noco_deduc = 'N' INTO :totaldeveng;
      SUSPEND;
     END
     FOR SELECT ND.node_diaslab,  ND.terc_nit, T.terc_nom FROM NOMINA_DETALLE ND, EMPLEADOS E, TERCEROS T WHERE NOMI_ID = :id AND ND.terc_nit = E.terc_nit AND T.terc_nit = ND.terc_nit
     INTO :diaslab, :nitaux, :nombreempl
     DO
     BEGIN
      SELECT FIRST 1  m.mvse_salario FROM MOVIMIENTO_SALARIO_EMPLEADO M WHERE M.terc_nit = :nitaux AND M.mvse_fecha <= :fecha ORDER BY M.mvse_fecha DESC INTO :salario;
      nitempl = :nitaux;
      nomcortconc = 'DIAS LAB.';
      valor = :diaslab;
      SUSPEND;
      nitempl = :nitaux;
      nomcortconc = 'SDO BASE';
      valor = :salario;
      SUSPEND;
     END
    END
   FOR SELECT NC.terc_nit, NC.noco_valor, NC.noco_deduc, T.terc_nom, C.conc_nomcorto, C.conc_nombre, NC.conc_cod, NC.noco_prov, E.empl_cargo, E.empl_cuenta, D.dpto_nombre, d.dpto_cod, ND.node_diaslab,NC.terc_nit, c.conc_benefic, NC.noco_base
   FROM NOMINA_CONCEPTOS NC, TERCEROS T, EMPLEADOS E, CONCEPTOS_NOMINA C, DEPARTAMENTO D, NOMINA_DETALLE ND
   WHERE NC.nomi_id = :ID AND T.terc_nit = E.terc_nit AND C.conc_cod = NC.conc_cod AND t.terc_nit = nc.terc_nit AND D.dpto_cod = E.empl_dpto AND NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N'
   AND ND.nomi_id = :id AND ND.terc_nit = E.terc_nit
   ORDER BY T.terc_nom
   INTO :nitempl, :valor, :deduc, :nombreempl, :nomcortconc, :nombreconc, :codconc, :prov, :cargoempl,:ctaempl,:deptoempl,:coddptoempl,:diaslab,:nitnue, :beneficio,:base
   DO
   BEGIN
    SELECT FIRST 1  m.mvse_salario FROM MOVIMIENTO_SALARIO_EMPLEADO M WHERE M.terc_nit = :nitempl AND M.mvse_fecha <= :FECHA ORDER BY M.mvse_fecha DESC INTO :salario;
    IF ((nitnue <> nitant) AND (nitnue IS NOT NULL)) THEN
     numempl = :numempl + 1;
    IF (valor IS NULL) THEN
    valor = 0;
    IF (nitempl <> nitdeduc) THEN
    BEGIN
     par = 2;
     impar = 1;
    END
    nitdeduc = :nitempl;
    IF (:deduc = 'S') THEN
    BEGIN
     antdeduc = 'S';
     org = :par;
     par = :par + 2;
    END
    ELSE
    BEGIN
     antdeduc = 'N';
     org = :impar;
     impar = :impar + 2;
    END
    SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND TERC_NIT = :nitempl INTO :totalempl;
    SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND TERC_NIT = :nitempl AND NC.noco_deduc = 'S' INTO :totaldeduc;
    SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND TERC_NIT = :nitempl AND NC.noco_deduc = 'N' INTO :totaldeveng;
    IF (cta = 'S') THEN
    BEGIN
     SELECT COUNT(CONC_COD) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND TERC_NIT = :nitempl INTO :numconc;
     totalempl = totalempl / :numconc;
     SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND TERC_NIT = :nitempl INTO :totalctas;
    END
    SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id INTO :totalnomi;
    SELECT SUM(NC.noco_valor*-1) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_APORTE = 'S' AND NOCO_VALOR < 0 AND NOMI_ID = :id INTO :totalaporneg;
    SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_APORTE = 'S' AND NOCO_VALOR > 0 AND NOMI_ID = :id INTO :totalapor;
    totalapor = :totalapor + totalaporneg;
   SUSPEND;
    IF ((nitnue <> nitant) AND (nitnue IS NOT NULL) AND (EMPL = 'N')) THEN
    BEGIN
     deduc = 'N';
     nomcortconc = 'TOTAL DEV';
     nombreconc = 'TOTAL DEV';
     codconc = 9999;
     prov = 'N';
     SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND NC.noco_deduc = 'N' AND NC.terc_nit = : nitempl INTO :VALOR;
     SUSPEND;
     deduc = 'S';
     nomcortconc = 'TOTAL DEDUC';
     nombreconc = 'TOTAL DEDUC';
     codconc = 99999;
     prov = 'N';
     SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND NC.noco_deduc = 'S' AND NC.terc_nit = :nitempl INTO :VALOR;
     SUSPEND;
     deduc = 'S';
     nomcortconc = 'TOTAL EMPL';
     nombreconc = 'TOTAL EMPL';
     codconc = 999999;
     prov = 'N';
     SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND NC.terc_nit = :nitempl INTO :VALOR;
     nitant = :nitnue;
     SUSPEND;
    END
   END
   numempl = :numempl + 1;
   IF ( EMPL = 'N') THEN
   BEGIN
    nitempl = '';
    valor = NULL;
    deduc = '';
    nombreempl = NULL;
    nomcortconc = NULL;
    nombreconc = NULL;
    codconc = NULL;
    prov = NULL;
    totalempl = NULL;
    ctaempl = NULL;
    IF (cta = 'N') THEN
    BEGIN
     FOR SELECT MAX(N.conc_cod) FROM NOMINA_CONCEPTOS N WHERE N.nomi_id = :id AND N.noco_prov = 'N' AND N.noco_gtoempr = 'N'
     GROUP BY N.conc_cod
     INTO :codconc
     DO
     BEGIN
     IF (dpto IS NOT NULL AND (DPTO <> '') ) THEN
     BEGIN
      SELECT SUM(NC.noco_valor), MAX(NC.noco_deduc) FROM NOMINA_CONCEPTOS NC, EMPLEADOS E, DEPARTAMENTO D
      WHERE NC.nomi_id = :ID AND NC.conc_cod = :codconc AND D.dpto_cod = E.empl_dpto AND NC.terc_nit = E.terc_nit AND d.dpto_cod = :dpto
      GROUP BY NC.conc_cod
      INTO :valor, :deduc;
      nitempl = '-';
      nombreempl = 'TOTAL';
      deptoempl = '-';
      prov = 'N';
      SELECT C.conc_nombre,C.conc_nomcorto FROM CONCEPTOS_NOMINA C WHERE C.conc_cod = :codconc INTO :nombreconc,:nomcortconc;
      SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC, EMPLEADOS E, DEPARTAMENTO D WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id  AND D.dpto_cod = E.empl_dpto AND NC.terc_nit = E.terc_nit INTO :totalempl;
      SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC, EMPLEADOS E, DEPARTAMENTO D WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND NC.noco_deduc = 'S'  AND D.dpto_cod = E.empl_dpto AND NC.terc_nit = E.terc_nit INTO :totaldeduc;
      SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC, EMPLEADOS E, DEPARTAMENTO D WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND NC.noco_deduc = 'N'  AND D.dpto_cod = E.empl_dpto AND NC.terc_nit = E.terc_nit INTO :totaldeveng;
     END
     ELSE
     BEGIN
      SELECT SUM(NC.noco_valor), MAX(NC.noco_deduc) FROM NOMINA_CONCEPTOS NC
      WHERE NC.nomi_id = :ID AND NC.conc_cod = :codconc
      GROUP BY NC.conc_cod
      INTO :valor, :deduc;
      nitempl = '-';
      nombreempl = 'TOTAL';
      deptoempl = '-';
      prov = 'N';
      SELECT C.conc_nombre,C.conc_nomcorto FROM CONCEPTOS_NOMINA C WHERE C.conc_cod = :codconc INTO :nombreconc,:nomcortconc;
      SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id INTO :totalempl;
      SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND NC.noco_deduc = 'S' INTO :totaldeduc;
      SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND NC.noco_deduc = 'N' INTO :totaldeveng;
     END
      SUSPEND;
     END
     IF (dpto IS NOT NULL AND (DPTO <> '') ) THEN
     BEGIN
     deduc = 'N';
     nomcortconc = 'TOTAL DEV';
     nombreconc = 'TOTAL DEV';
     codconc = 9999;
     deptoempl = '-';
     prov = 'N';
     SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC, EMPLEADOS E, DEPARTAMENTO D WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id  AND D.dpto_cod = E.empl_dpto AND NC.terc_nit = E.terc_nit AND d.dpto_cod = :dpto INTO :VALOR;
     nitempl = '-';
     nombreempl = 'TOTAL';
     SUSPEND;
     deduc = 'S';
     nomcortconc = 'TOTAL DEDUC';
     nombreconc = 'TOTAL DEDUC';
     codconc = 99999;
     deptoempl = '-';
     prov = 'N';
     SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC, EMPLEADOS E, DEPARTAMENTO D WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND NC.noco_deduc = 'S'  AND D.dpto_cod = E.empl_dpto AND d.dpto_cod = :dpto AND NC.terc_nit = E.terc_nit INTO :VALOR;
     nitempl = '-';
     nombreempl = 'TOTAL';
     SUSPEND;
     deduc = 'S';
     nomcortconc = 'TOTAL EMPL';
     nombreconc = 'TOTAL EMPL';
     codconc = 999999;
     deptoempl = '-';
     prov = 'N';
     SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC, EMPLEADOS E, DEPARTAMENTO D WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND NC.noco_deduc = 'N'  AND D.dpto_cod = E.empl_dpto AND d.dpto_cod = :dpto AND NC.terc_nit = E.terc_nit INTO :VALOR;
     nitempl = '-';
     nombreempl = 'TOTAL';
     SUSPEND;
     END
     ELSE
     BEGIN
     deduc = 'N';
     nomcortconc = 'TOTAL DEV';
     nombreconc = 'TOTAL DEV';
     codconc = 9999;
     prov = 'N';
     SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND NC.noco_deduc = 'N' INTO :VALOR;
     nitempl = '-';
     nombreempl = 'TOTAL';
     SUSPEND;
     deduc = 'S';
     nomcortconc = 'TOTAL DEDUC';
     nombreconc = 'TOTAL DEDUC';
     codconc = 99999;
     prov = 'N';
     SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND NC.noco_deduc = 'S' INTO :VALOR;
     nitempl = '-';
     nombreempl = 'TOTAL';
     SUSPEND;
     deduc = 'S';
     nomcortconc = 'TOTAL EMPL';
     nombreconc = 'TOTAL EMPL';
     codconc = 999999;
     prov = 'N';
     SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N'  AND NOMI_ID = :id INTO :VALOR;
     nitempl = '-';
     nombreempl = 'TOTAL';
     SUSPEND;
     END
     END
   END
  END
 END
END
^

SET TERM ; ^


CREATE TABLE NOMINA_NOVEDADES_DETALLE(
    NONO_ID INTEGER NOT NULL,
    NNDE_PERIODO INTEGER NOT NULL,
    NNDE_DIAINI INTEGER,
    NNDE_VALOR MONTO,
    NNDE_DURACION INTEGER);
ALTER TABLE NOMINA_NOVEDADES_DETALLE
ADD CONSTRAINT PK_NOMINA_NOVEDADES_DETALLE
PRIMARY KEY (NONO_ID,NNDE_PERIODO);

ALTER TABLE NOMINA_NOVEDADES_DETALLE
ADD CONSTRAINT FK_NOMINA_NOVEDADES_DETALLE_1
FOREIGN KEY (NONO_ID)
REFERENCES NOMINA_NOVEDADES(NONO_ID);

ALTER TABLE NOMINA_NOVEDADES
ADD NONO_PERHASTA INTEGER;

ALTER TABLE NOMINA_NOVEDADES_DETALLE
ADD NNDE_ANO ANO;

INSERT INTO NOMINA_NOVEDADES_DETALLE (NONO_ID,NNDE_ANO,NNDE_PERIODO,NNDE_DIAINI,NNDE_VALOR,NNDE_DURACION)
SELECT N.nono_id,N.nono_ano,N.nono_periodo,N.nono_diaini,N.nono_valor,N.nono_dura FROM NOMINA_NOVEDADES N;

ALTER TABLE EMPLEADOS ADD PROY_COD CENTRO;
ALTER TABLE EMPLEADOS ADD CENT_COD CENTRO;

SET TERM ^ ;

ALTER PROCEDURE CONTABIL_NOMINA (
    iddoc integer)
returns (
    error integer,
    idc integer)
as
declare variable itemdet integer;
declare variable idcontabil integer;
declare variable aporte char(1);
declare variable entidad varchar(20);
declare variable valor numeric(18,2);
declare variable ctagast varchar(20);
declare variable ctaxp varchar(20);
declare variable tercnit varchar(20);
declare variable fecaux date;
declare variable fecha char(8);
declare variable ano char(4);
declare variable periodicidad integer;
declare variable periodo integer;
declare variable numero varchar(6);
declare variable tipocom char(3);
declare variable prefcom varchar(4);
declare variable concepto varchar(60);
declare variable numerocom varchar(6);
declare variable proyecto varchar(4) character set none;
declare variable centro varchar(4) character set none;
declare variable codconc integer;
declare variable base numeric(18,2);
declare variable basico numeric(18,2);
declare variable comision numeric(18,2);
declare variable retroact numeric(18,2);
declare variable valorneg numeric(18,2);
declare variable det char(1);
declare variable ctaadmin char(1);
BEGIN
    SELECT N.nomi_feccausa, N.nomi_ano, N.nomi_periodocidad, N.nomi_periodo FROM NOMINA N WHERE N.nomi_id = :iddoc INTO :fecaux, :ano, :periodicidad, :periodo;
    NUMERO = :periodicidad || :periodo;
    SELECT I.tico_cod, I.prco_pre, I.inno_det, I.inno_dtlleadmin FROM INTERFAZ_NOMINA I WHERE I.tido_cod = 92 INTO :tipocom, :prefcom,:det,:ctaadmin;
    concepto = 'CAUSACION NOMINA AÑO ' || :ano || ' PERIODO ' || :periodo || ' PERIODICIDAD ' ||:periodicidad;
    EXECUTE PROCEDURE completa_ceros(:numero)RETURNING_VALUES :numero;
    SELECT P.pref_numero FROM PREFIJOS_CONTA P WHERE P.tico_cod = :tipocom AND P.prco_pref = :prefcom INTO :numerocom;
    idcontabil = GEN_ID(ID_CONTABILIZA,1);
    EXECUTE PROCEDURE FECHA_A_CONTA(:FECAUX) RETURNING_VALUES (:FECHA);
    INSERT INTO CONTABILIZACION (CNTB_ID, CNTB_TIPOREF, CNTB_IDREF, CNTB_PREFREF, CNTB_NUMREF, CNTB_FECHA, CNTB_TIPOCOMP, CNTB_PREFCNT, CNTB_CONCEPTO, CNTB_NUMERO, CNTB_PROCESADO)
                         VALUES (:idcontabil, 92,:iddoc, :ano, :numero, :fecha, :tipocom, :prefcom, :concepto, :numerocom, 'N');
    idc = :idcontabil;
    itemdet = 0;
  IF (DET = 'N') THEN
  BEGIN
    FOR SELECT max(NC.conc_cod),sum(NC.NOCO_VALORCONT), max(CN.conc_ctagast), max(NC.terc_nit), max(NC.noco_aporte), max(NC.noco_entidad)
    FROM NOMINA_CONCEPTOS NC, CONCEPTOS_NOMINA CN WHERE NC.conc_cod = CN.conc_cod AND NC.nomi_id = :iddoc and cn.conc_ctagast is not null and cn.conc_ctacxp is not null
    group by cn.conc_ctagast,nc.terc_nit
    INTO :codconc,:valor, :ctagast, :tercnit, :aporte, :entidad
    DO
    BEGIN
        base = null;
        IF (ctagast IS NULL) THEN
        BEGIN
            EXECUTE PROCEDURE ERROR (14, :IDDOC, :ctagast, 2);
            ERROR = ERROR + 1;
        END
        IF (ctaxp IS NULL) THEN
        BEGIN
            EXECUTE PROCEDURE ERROR (14, :IDDOC, :ctaxp, 2);
            ERROR = ERROR + 1;
        END
        IF (VALOR IS NULL) THEN
            VALOR = 0;
        IF (VALOR <> 0) THEN
        BEGIN
            IF (valor < 0) THEN
                valor = :valor * (-1);
            IF (codconc = 6) THEN
            BEGIN
                SELECT E.empl_salario FROM EMPLEADOS E WHERE E.terc_nit = :tercnit INTO :basico;
                SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :tercnit INTO :comision;
                IF (comision IS NULL) THEN
                    comision = 0;
                SELECT C.emco_monto FROM EMPLEADO_CONCEPTOS C WHERE C.terc_nit = :tercnit AND C.conc_cod = 933 INTO :retroact;
                IF (retroact IS NULL ) THEN
                    retroact = 0;
                base = :basico + :comision + :retroact;

            END
            IF (aporte = 'N') THEN
            BEGIN
                SELECT E.proy_cod,E.cent_cod FROM EMPLEADOS E WHERE E.terc_nit = :tercnit INTO :proyecto, :centro;
                if (:proyecto IS NULL) then
                SELECT D.dpto_proy, D.dpto_centro FROM EMPLEADOS E, departamento D WHERE E.terc_nit = :tercnit AND E.empl_dpto = D.dpto_cod INTO :proyecto, :centro;
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_TERC, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_CONC, CNDE_PROY, cnde_centro,CNDE_BASE)
                             VALUES (:idcontabil, :itemdet, :ctagast, :tercnit, :valor, 0, :concepto, :proyecto, :centro,:base);
                itemdet = itemdet + 1;
                /*SELECT D.dpto_proy, D.dpto_centro FROM EMPLEADOS E, departamento D WHERE E.terc_nit = :tercnit AND E.empl_dpto = D.dpto_cod INTO :proyecto, :centro;
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_TERC, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_CONC, CNDE_PROY, cnde_centro,CNDE_BASE)
                             VALUES (:idcontabil, :itemdet, :ctaxp, :tercnit, 0,:valor, :concepto, :proyecto, :centro,:base);
                itemdet = itemdet + 1;
            */
            END
            ELSE
            IF (aporte = 'S') THEN
            BEGIN
                SELECT E.proy_cod,E.cent_cod FROM EMPLEADOS E WHERE E.terc_nit = :tercnit INTO :proyecto, :centro;
                if (:proyecto IS NULL) then
                SELECT D.dpto_proy, D.dpto_centro FROM EMPLEADOS E, departamento D WHERE E.terc_nit = :tercnit AND E.empl_dpto = D.dpto_cod INTO :proyecto, :centro;
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_TERC, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_CONC, CNDE_PROY, cnde_centro,CNDE_BASE)
                             VALUES (:idcontabil, :itemdet, :ctagast, :entidad, :valor, 0, :concepto, :proyecto, :centro,:base);
                itemdet = itemdet + 1;
                /*SELECT D.dpto_proy, D.dpto_centro FROM EMPLEADOS E, departamento D WHERE E.terc_nit = :tercnit AND E.empl_dpto = D.dpto_cod INTO :proyecto, :centro;
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_TERC, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_CONC, CNDE_PROY, cnde_centro,CNDE_BASE)
                             VALUES (:idcontabil, :itemdet, :ctaxp, :entidad, 0,:valor, :concepto, :proyecto, :centro,:base);
                itemdet = itemdet + 1;
            */
            END
        END
    END
    SUSPEND;
    FOR SELECT max(NC.conc_cod),sum(NC.NOCO_VALORCONT), max(CN.conc_ctacxp), max(NC.terc_nit), max(NC.noco_aporte), max(NC.noco_entidad)
    FROM NOMINA_CONCEPTOS NC, CONCEPTOS_NOMINA CN WHERE NC.conc_cod = CN.conc_cod AND NC.nomi_id = :iddoc and cn.conc_ctagast is not null and cn.conc_ctacxp is not null
    group by cn.conc_ctacxp,nc.noco_nitcont
    INTO :codconc,:valor, :ctaxp, :tercnit, :aporte, :entidad
    DO
    BEGIN
        base = null;
        IF (ctagast IS NULL) THEN
        BEGIN
            EXECUTE PROCEDURE ERROR (14, :IDDOC, :ctagast, 2);
            ERROR = ERROR + 1;
        END
        IF (ctaxp IS NULL) THEN
        BEGIN
            EXECUTE PROCEDURE ERROR (14, :IDDOC, :ctaxp, 2);
            ERROR = ERROR + 1;
        END
        IF (VALOR IS NULL) THEN
            VALOR = 0;
        IF (VALOR <> 0) THEN
        BEGIN
            IF (valor < 0) THEN
                valor = :valor * (-1);
            IF (codconc = 6) THEN
            BEGIN
                SELECT E.empl_salario FROM EMPLEADOS E WHERE E.terc_nit = :tercnit INTO :basico;
                SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :tercnit INTO :comision;
                IF (comision IS NULL) THEN
                    comision = 0;
                SELECT C.emco_monto FROM EMPLEADO_CONCEPTOS C WHERE C.terc_nit = :tercnit AND C.conc_cod = 933 INTO :retroact;
                IF (retroact IS NULL ) THEN
                    retroact = 0;
                base = :basico + :comision + :retroact;
            END
            if ((codconc > 900) and (entidad is not null) AND (ctaadmin = 'S')) then
            begin
             SELECT A.admi_ctaconta FROM ADMINISTRADORA A WHERE A.terc_nit = :entidad INTO :ctaxp;
            end
            IF (aporte = 'N') THEN
            BEGIN
                /*SELECT D.dpto_proy, D.dpto_centro FROM EMPLEADOS E, departamento D WHERE E.terc_nit = :tercnit AND E.empl_dpto = D.dpto_cod INTO :proyecto, :centro;
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_TERC, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_CONC, CNDE_PROY, cnde_centro,CNDE_BASE)
                             VALUES (:idcontabil, :itemdet, :ctagast, :tercnit, :valor, 0, :concepto, :proyecto, :centro,:base);
                itemdet = itemdet + 1;
                */
                SELECT E.proy_cod,E.cent_cod FROM EMPLEADOS E WHERE E.terc_nit = :tercnit INTO :proyecto, :centro;
                if (:proyecto IS NULL) then
                SELECT D.dpto_proy, D.dpto_centro FROM EMPLEADOS E, departamento D WHERE E.terc_nit = :tercnit AND E.empl_dpto = D.dpto_cod INTO :proyecto, :centro;
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_TERC, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_CONC, CNDE_PROY, cnde_centro,CNDE_BASE)
                             VALUES (:idcontabil, :itemdet, :ctaxp, :tercnit, 0,:valor, :concepto, :proyecto, :centro,:base);
                itemdet = itemdet + 1;
            END
            ELSE
            IF (aporte = 'S') THEN
            BEGIN
                /*SELECT D.dpto_proy, D.dpto_centro FROM EMPLEADOS E, departamento D WHERE E.terc_nit = :tercnit AND E.empl_dpto = D.dpto_cod INTO :proyecto, :centro;
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_TERC, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_CONC, CNDE_PROY, cnde_centro,CNDE_BASE)
                             VALUES (:idcontabil, :itemdet, :ctagast, :tercnit, :valor, 0, :concepto, :proyecto, :centro,:base);
                itemdet = itemdet + 1;
                */
                SELECT E.proy_cod,E.cent_cod FROM EMPLEADOS E WHERE E.terc_nit = :tercnit INTO :proyecto, :centro;
                if (:proyecto IS NULL) then
                SELECT D.dpto_proy, D.dpto_centro FROM EMPLEADOS E, departamento D WHERE E.terc_nit = :tercnit AND E.empl_dpto = D.dpto_cod INTO :proyecto, :centro;
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_TERC, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_CONC, CNDE_PROY, cnde_centro,CNDE_BASE)
                             VALUES (:idcontabil, :itemdet, :ctaxp, :tercnit, 0,:valor, :concepto, :proyecto, :centro,:base);
                itemdet = itemdet + 1;
            END
        END
    END
    SUSPEND;
  END
  ELSE
  IF (DET = 'S') THEN
  BEGIN
    FOR SELECT NC.conc_cod,NC.NOCO_VALORCONT, CN.conc_ctagast, CN.conc_ctacxp, NC.terc_nit, NC.noco_aporte, NC.noco_entidad
    FROM NOMINA_CONCEPTOS NC, CONCEPTOS_NOMINA CN WHERE NC.conc_cod = CN.conc_cod AND NC.nomi_id = :iddoc
    INTO :codconc,:valor, :ctagast, :ctaxp, :tercnit, :aporte, :entidad
    DO
    BEGIN
        base = null;
        IF (ctagast IS NULL) THEN
        BEGIN
            EXECUTE PROCEDURE ERROR (14, :IDDOC, :ctagast, 2);
            ERROR = ERROR + 1;
        END
        IF (ctaxp IS NULL) THEN
        BEGIN
            EXECUTE PROCEDURE ERROR (14, :IDDOC, :ctaxp, 2);
            ERROR = ERROR + 1;
        END
        IF (VALOR IS NULL) THEN
            VALOR = 0;
        IF (VALOR <> 0) THEN
        BEGIN
            IF (valor < 0) THEN
                valor = :valor * (-1);
            IF (codconc = 6) THEN
            BEGIN
                SELECT E.empl_salario FROM EMPLEADOS E WHERE E.terc_nit = :tercnit INTO :basico;
                SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :tercnit INTO :comision;
                IF (comision IS NULL) THEN
                    comision = 0;
                SELECT C.emco_monto FROM EMPLEADO_CONCEPTOS C WHERE C.terc_nit = :tercnit AND C.conc_cod = 933 INTO :retroact;
                IF (retroact IS NULL ) THEN
                    retroact = 0;
                base = :basico + :comision + :retroact;
            END
            if ((codconc > 900) and (entidad is not null) AND (ctaadmin = 'S')) then
            begin
             SELECT A.admi_ctaconta FROM ADMINISTRADORA A WHERE A.terc_nit = :entidad INTO :ctaxp;
            end
            IF (aporte = 'N') THEN
            BEGIN
                SELECT E.proy_cod,E.cent_cod FROM EMPLEADOS E WHERE E.terc_nit = :tercnit INTO :proyecto, :centro;
                if (:proyecto IS NULL) then
                SELECT D.dpto_proy, D.dpto_centro FROM EMPLEADOS E, departamento D WHERE E.terc_nit = :tercnit AND E.empl_dpto = D.dpto_cod INTO :proyecto, :centro;
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_TERC, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_CONC, CNDE_PROY, cnde_centro,CNDE_BASE)
                         VALUES (:idcontabil, :itemdet, :ctagast, :tercnit, :valor, 0, :concepto, :proyecto, :centro,:base);
                itemdet = itemdet + 1;
                SELECT E.proy_cod,E.cent_cod FROM EMPLEADOS E WHERE E.terc_nit = :tercnit INTO :proyecto, :centro;
                if (:proyecto IS NULL) then
                SELECT D.dpto_proy, D.dpto_centro FROM EMPLEADOS E, departamento D WHERE E.terc_nit = :tercnit AND E.empl_dpto = D.dpto_cod INTO :proyecto, :centro;
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_TERC, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_CONC, CNDE_PROY, cnde_centro,CNDE_BASE)
                             VALUES (:idcontabil, :itemdet, :ctaxp, :tercnit, 0,:valor, :concepto, :proyecto, :centro,:base);
                itemdet = itemdet + 1;
            END
            ELSE
            IF (aporte = 'S') THEN
            BEGIN
                SELECT E.proy_cod,E.cent_cod FROM EMPLEADOS E WHERE E.terc_nit = :tercnit INTO :proyecto, :centro;
                if (:proyecto IS NULL) then
                SELECT D.dpto_proy, D.dpto_centro FROM EMPLEADOS E, departamento D WHERE E.terc_nit = :tercnit AND E.empl_dpto = D.dpto_cod INTO :proyecto, :centro;
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_TERC, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_CONC, CNDE_PROY, cnde_centro,CNDE_BASE)
                         VALUES (:idcontabil, :itemdet, :ctagast, :tercnit, :valor, 0, :concepto, :proyecto, :centro,:base);
                itemdet = itemdet + 1;
                SELECT D.dpto_proy, D.dpto_centro FROM EMPLEADOS E, departamento D WHERE E.terc_nit = :tercnit AND E.empl_dpto = D.dpto_cod INTO :proyecto, :centro;
                SELECT E.proy_cod,E.cent_cod FROM EMPLEADOS E WHERE E.terc_nit = :tercnit INTO :proyecto, :centro;
                if (:proyecto IS NULL) then
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_TERC, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_CONC, CNDE_PROY, cnde_centro,CNDE_BASE)
                         VALUES (:idcontabil, :itemdet, :ctaxp, :entidad, 0,:valor, :concepto, :proyecto, :centro,:base);
                itemdet = itemdet + 1;
            END
        END
    END
    SUSPEND;
  END
END
^

SET TERM ; ^


INSERT INTO TIPO_DOCUMENTO (TIDO_COD, TIDO_NOMCORTO, TIDO_NOMLARGO, TIDO_MODULO, TIDO_INVE, TIDO_CART, TIDO_CXP, TIDO_CAJA, TIDO_BCOS) VALUES (94, 'CARTNOMI', 'PAGO CARTERA NOMINA', 'NOMINA', 'N', 'N', 'N', 'N', 'N');

SET TERM ^ ;

ALTER PROCEDURE IMPR_PLANILLA_NOMINA (
    id integer,
    pago char(1),
    cta char(1),
    empl char(1),
    dpto varchar(20))
returns (
    fecha date,
    observaciones blob sub_type 0 segment size 80,
    pagoglobal char(1),
    periodo integer,
    ano char(4),
    periodicidad varchar(60),
    nitempl varchar(20),
    valor numeric(18,2),
    deduc char(1),
    nombreempl varchar(60),
    nomcortconc varchar(60),
    nombreconc varchar(60),
    codconc integer,
    prov char(1),
    totalempl numeric(18,2),
    totaldeduc numeric(18,2),
    totaldeveng numeric(18,2),
    numempl integer,
    ctaempl varchar(25),
    totalctas numeric(18,2),
    totalnomi numeric(18,2),
    totalapor numeric(18,2),
    nomper varchar(60),
    org integer,
    cargoempl varchar(60),
    deptoempl varchar(60),
    numcop integer,
    nombre_copia varchar(60),
    diaslab integer,
    salario numeric(18,2),
    beneficio char(1),
    base numeric(18,2),
    coddptoempl integer,
    HD NUMERIC(18,2),
    HN NUMERIC(18,2),
    HFD NUMERIC(18,2),
    HFN NUMERIC(18,2),
    VALHD NUMERIC(18,2),
    VALHN NUMERIC(18,2),
    VALHFD NUMERIC(18,2),
    VALHFN NUMERIC(18,2),
    SALBASEHE NUMERIC(18,2),
    RECARGO NUMERIC(18,2))
as
declare variable nitant varchar(20);
declare variable nitnue varchar(20);
declare variable numconc integer;
declare variable totalnomineg numeric(18,2);
declare variable totalaporneg numeric(18,2);
declare variable par integer;
declare variable impar integer;
declare variable antdeduc char(1);
declare variable nitdeduc varchar(20);
declare variable nittot varchar(20);
declare variable nitaux varchar(20);
BEGIN
 SELECT N.nuco_copia FROM NUMERO_COPIA N WHERE N.tido_cod = 92 AND N.nuco_id = :id INTO :NUMCOP;
 IF (numcop IS NULL) THEN
 BEGIN
  numcop = 0;
  INSERT INTO NUMERO_COPIA (TIDO_COD, NUCO_ID, NUCO_COPIA) VALUES (92,:id,:numcop);
 END
 ELSE
 BEGIN
  numcop = :numcop + 1;
  UPDATE numero_copia N SET N.nuco_copia = :numcop WHERE N.tido_cod = 92 AND N.nuco_id = :id;
 END
 SELECT N.noco_nombre FROM nombres_copias N WHERE N.noco_id = :numcop INTO :nombre_copia;
 numempl = 0;
 nitant = 0;
 nitnue = 0;
 IF (PAGO = 'N') THEN
 BEGIN
  FOR SELECT N.nomi_feccausa, N.nomi_obs, N.nomi_pagoglobal, N.nomi_periodo, N.nomi_ano, P.ppag_nombre, PN.pnom_nombre FROM NOMINA N, periodo_pago P, periodo_pago_nombre PN
  WHERE P.ppag_cod = N.nomi_periodocidad AND N.nomi_id = :ID AND PN.ppag_cod = N.nomi_periodocidad AND PN.ppag_periodo = N.nomi_periodo
  INTO :fecha, :observaciones, :pagoglobal, :periodo, :ano, :periodicidad, :NOMPER
  DO
  BEGIN
   FOR SELECT NC.terc_nit, NC.noco_valor, NC.noco_deduc, T.terc_nom, C.conc_nomcorto, C.conc_nombre, NC.conc_cod, NC.noco_prov, E.empl_cargo FROM NOMINA_CONCEPTOS NC, TERCEROS T, EMPLEADOS E, CONCEPTOS_NOMINA C
   WHERE NC.nomi_id = :ID AND T.terc_nit = E.terc_nit AND C.conc_cod = NC.conc_cod AND t.terc_nit = nc.terc_nit
   INTO :nitempl, :valor, :deduc, :nombreempl, :nomcortconc, :nombreconc, :codconc, :prov, :cargoempl
   DO
   BEGIN
    IF (valor IS NULL) THEN
    valor = 0;
    SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND TERC_NIT = :nitempl INTO :totalempl;
    SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND TERC_NIT = :nitempl AND NC.noco_deduc = 'S' INTO :totaldeduc;
    SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND TERC_NIT = :nitempl AND NC.noco_deduc = 'N' INTO :totaldeveng;
    SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id INTO :totalnomi;
    SELECT SUM(NC.noco_valor*-1) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_APORTE = 'S' AND NOCO_VALOR < 0 AND NOMI_ID = :id INTO :totalaporneg;
    SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_APORTE = 'S' AND NOCO_VALOR > 0 AND NOMI_ID = :id INTO :totalapor;
    totalapor = :totalapor + totalaporneg;
    SUSPEND;
   END
   nitempl = '';
   valor = NULL;
   deduc = '';
   nombreempl = NULL;
   nomcortconc = NULL;
   nombreconc = NULL;
   codconc = NULL;
   prov = NULL;
   FOR SELECT MAX(N.conc_cod) FROM NOMINA_CONCEPTOS N WHERE N.nomi_id = :id
   GROUP BY N.conc_cod
   INTO :codconc
   DO
   BEGIN
    SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC
    WHERE NC.nomi_id = :ID AND NC.conc_cod = :codconc
    GROUP BY NC.conc_cod
    INTO :valor;
    nitempl = '';
    nombreempl = '';
    deduc = 'N';
    prov = 'N';
    SELECT C.conc_nombre,C.conc_nomcorto FROM CONCEPTOS_NOMINA C WHERE C.conc_cod = :codconc INTO :nombreconc,:nomcortconc;
    SUSPEND;
   END
   IF (EMPL = 'N') THEN
   BEGIN
     deduc = 'N';
     nomcortconc = 'DIAS LAB.';
     nombreconc = 'DIAS LAB.';
     codconc = 0;
     prov = 'N';
     valor = NULL;
     nitempl = '';
     nombreempl = '';
     SUSPEND;
     deduc = 'N';
     nomcortconc = 'SDO BASE';
     nombreconc = 'SDO BASE';
     codconc = 0;
     prov = 'N';
     valor = NULL;
     nitempl = '';
     nombreempl = '';
     SUSPEND;
  END
     FOR SELECT ND.node_diaslab, E.empl_salario, ND.terc_nit, T.terc_nom FROM NOMINA_DETALLE ND, EMPLEADOS E, TERCEROS T WHERE NOMI_ID = :id AND ND.terc_nit = E.terc_nit AND T.terc_nit = ND.terc_nit
     INTO :diaslab, :salario, :nitaux, :nombreempl
     DO
     BEGIN
      nitempl = :nitaux;
      nomcortconc = 'DIAS LAB.';
      valor = :diaslab;
      SUSPEND;
      nitempl = :nitaux;
      nomcortconc = 'SDO BASE';
      valor = :salario;
      SUSPEND;
     END
  END
 END
 ELSE
 IF (PAGO = 'S') THEN
 BEGIN
  par = 2;
  impar = 1;
  SELECT N.nomi_feccausa, N.nomi_obs, N.nomi_pagoglobal, N.nomi_periodo, N.nomi_ano, P.ppag_nombre, PN.pnom_nombre FROM NOMINA N, periodo_pago P, periodo_pago_nombre PN
  WHERE P.ppag_cod = N.nomi_periodocidad AND N.nomi_id = :ID AND PN.ppag_cod = N.nomi_periodocidad AND PN.ppag_periodo = N.nomi_periodo
  INTO :fecha, :observaciones, :pagoglobal, :periodo, :ano, :periodicidad, :NOMPER;
  IF (EMPL = 'N') THEN
  BEGIN
     deduc = 'N';
     nomcortconc = 'DIAS LAB.';
     nombreconc = 'DIAS LAB.';
     codconc = 0;
     prov = 'N';
     valor = NULL;
     nitempl = '';
     nombreempl = '';
     SUSPEND;
     deduc = 'N';
     nomcortconc = 'SDO BASE';
     nombreconc = 'SDO BASE';
     codconc = 0;
     prov = 'N';
     valor = NULL;
     nitempl = '';
     nombreempl = '';
     SUSPEND;
     deduc = 'N';
     nomcortconc = 'TOTAL DEV';
     nombreconc = 'TOTAL DEV';
     codconc = 9999;
     prov = 'N';
     valor = NULL;
     nitempl = '';
     nombreempl = '';
     SUSPEND;
     deduc = 'S';
     nomcortconc = 'TOTAL DEDUC';
     nombreconc = 'TOTAL DEDUC';
     codconc = 99999;
     prov = 'N';
     valor = NULL;
     nitempl = '';
     nombreempl = '';
     SUSPEND;
     deduc = 'S';
     nomcortconc = 'TOTAL EMPL';
     nombreconc = 'TOTAL EMPL';
     codconc = 999999;
     prov = 'N';
     valor = NULL;
     nitempl = '';
     nombreempl = '';
     SUSPEND;
  END
  BEGIN
    IF (EMPL = 'N') THEN
    BEGIN
     FOR SELECT MAX(N.conc_cod) FROM NOMINA_CONCEPTOS N WHERE N.nomi_id = :id AND N.noco_prov = 'N' AND N.noco_gtoempr = 'N'
     GROUP BY N.conc_cod
     INTO :codconc
     DO
     BEGIN
      SELECT NULL, MAX(NC.noco_deduc) FROM NOMINA_CONCEPTOS NC
      WHERE NC.nomi_id = :ID AND NC.conc_cod = :codconc
      GROUP BY NC.conc_cod
      INTO :valor, :deduc;
      valor = NULL;
      nitempl = '';
      nombreempl = '';
      prov = 'N';
      SELECT C.conc_nombre,C.conc_nomcorto FROM CONCEPTOS_NOMINA C WHERE C.conc_cod = :codconc INTO :nombreconc,:nomcortconc;
      SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id INTO :totalempl;
      SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND NC.noco_deduc = 'S' INTO :totaldeduc;
      SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND NC.noco_deduc = 'N' INTO :totaldeveng;
      SUSPEND;
     END
     FOR SELECT ND.node_diaslab, E.empl_salario, ND.terc_nit, T.terc_nom FROM NOMINA_DETALLE ND, EMPLEADOS E, TERCEROS T WHERE NOMI_ID = :id AND ND.terc_nit = E.terc_nit AND T.terc_nit = ND.terc_nit
     INTO :diaslab, :salario, :nitaux, :nombreempl
     DO
     BEGIN
      nitempl = :nitaux;
      nomcortconc = 'DIAS LAB.';
      valor = :diaslab;
      SUSPEND;
      nitempl = :nitaux;
      nomcortconc = 'SDO BASE';
      valor = :salario;
      SUSPEND;
     END
    END
   FOR SELECT NC.terc_nit, NC.noco_valor, NC.noco_deduc, T.terc_nom, C.conc_nomcorto, C.conc_nombre, NC.conc_cod, NC.noco_prov, E.empl_cargo, E.empl_cuenta, D.dpto_nombre, d.dpto_cod, ND.node_diaslab,NC.terc_nit, E.empl_salario, c.conc_benefic, NC.noco_base
   FROM NOMINA_CONCEPTOS NC, TERCEROS T, EMPLEADOS E, CONCEPTOS_NOMINA C, DEPARTAMENTO D, NOMINA_DETALLE ND
   WHERE NC.nomi_id = :ID AND T.terc_nit = E.terc_nit AND C.conc_cod = NC.conc_cod AND t.terc_nit = nc.terc_nit AND D.dpto_cod = E.empl_dpto AND NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N'
   AND ND.nomi_id = :id AND ND.terc_nit = E.terc_nit
   ORDER BY T.terc_nom
   INTO :nitempl, :valor, :deduc, :nombreempl, :nomcortconc, :nombreconc, :codconc, :prov, :cargoempl,:ctaempl,:deptoempl,:coddptoempl,:diaslab,:nitnue, :salario, :beneficio,:base
   DO
   BEGIN
   if ((codconc = 900) or (codconc = 931) or (codconc = 945)) then
   BEGIN
    HD = NULL;
    HN = NULL;
    HFD = NULL;
    HFN = NULL;
    VALHD = NULL;
    VALHN = NULL;
    VALHFD = NULL;
    VALHFN = NULL;
    select NH.noex_diur,NH.noex_noct, NH.noex_fdiur,NH.noex_fnoct, NH.noex_salbase from NOMINA_HORASEXT NH WHERE NH.terc_nit = :nitempl AND NH.noex_ano = :ano AND NH.noex_periodio = :periodo INTO :HD,:HN,:HFD,:HFN,:salbasehe;
    EXECUTE PROCEDURE LIQUIDA_HORAS_EXTRA (:nitempl,:HD,0,0,0,0,0,:ano,'N',0)  returning_values (:valhd,:recargo);
    EXECUTE PROCEDURE LIQUIDA_HORAS_EXTRA (:nitempl,0,:HN,0,0,0,0,:ano,'N',0)  returning_values (:valhn,:recargo);
    EXECUTE PROCEDURE LIQUIDA_HORAS_EXTRA (:nitempl,0,0,:HFD,0,0,0,:ano,'N',0) returning_values (:valhfd,:recargo);
    EXECUTE PROCEDURE LIQUIDA_HORAS_EXTRA (:nitempl,0,0,0,:HFN,0,0,:ano,'N',0) returning_values (:valhfn,:recargo);
   END
   ELSE
   BEGIN
    HD = NULL;
    HN = NULL;
    HFD = NULL;
    HFN = NULL;
    VALHD = NULL;
    VALHN = NULL;
    VALHFD = NULL;
    VALHFN = NULL;
   END
    IF ((nitnue <> nitant) AND (nitnue IS NOT NULL)) THEN
     numempl = :numempl + 1;
    IF (valor IS NULL) THEN
    valor = 0;
    IF (nitempl <> nitdeduc) THEN
    BEGIN
     par = 2;
     impar = 1;
    END
    nitdeduc = :nitempl;
    IF (:deduc = 'S') THEN
    BEGIN
     antdeduc = 'S';
     org = :par;
     par = :par + 2;
    END
    ELSE
    BEGIN
     antdeduc = 'N';
     org = :impar;
     impar = :impar + 2;
    END
    SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND TERC_NIT = :nitempl INTO :totalempl;
    SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND TERC_NIT = :nitempl AND NC.noco_deduc = 'S' INTO :totaldeduc;
    SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND TERC_NIT = :nitempl AND NC.noco_deduc = 'N' INTO :totaldeveng;
    IF (cta = 'S') THEN
    BEGIN
     SELECT COUNT(CONC_COD) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND TERC_NIT = :nitempl INTO :numconc;
     totalempl = totalempl / :numconc;
     SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND TERC_NIT = :nitempl INTO :totalctas;
    END
    SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id INTO :totalnomi;
    SELECT SUM(NC.noco_valor*-1) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_APORTE = 'S' AND NOCO_VALOR < 0 AND NOMI_ID = :id INTO :totalaporneg;
    SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_APORTE = 'S' AND NOCO_VALOR > 0 AND NOMI_ID = :id INTO :totalapor;
    totalapor = :totalapor + totalaporneg;
   SUSPEND;
    IF ((nitnue <> nitant) AND (nitnue IS NOT NULL) AND (EMPL = 'N')) THEN
    BEGIN
     deduc = 'N';
     nomcortconc = 'TOTAL DEV';
     nombreconc = 'TOTAL DEV';
     codconc = 9999;
     prov = 'N';
     SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND NC.noco_deduc = 'N' AND NC.terc_nit = : nitempl INTO :VALOR;
     SUSPEND;
     deduc = 'S';
     nomcortconc = 'TOTAL DEDUC';
     nombreconc = 'TOTAL DEDUC';
     codconc = 99999;
     prov = 'N';
     SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND NC.noco_deduc = 'S' AND NC.terc_nit = :nitempl INTO :VALOR;
     SUSPEND;
     deduc = 'S';
     nomcortconc = 'TOTAL EMPL';
     nombreconc = 'TOTAL EMPL';
     codconc = 999999;
     prov = 'N';
     SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND NC.terc_nit = :nitempl INTO :VALOR;
     nitant = :nitnue;
     SUSPEND;
    END
   END
   numempl = :numempl + 1;
   IF ( EMPL = 'N') THEN
   BEGIN
    nitempl = '';
    valor = NULL;
    deduc = '';
    nombreempl = NULL;
    nomcortconc = NULL;
    nombreconc = NULL;
    codconc = NULL;
    prov = NULL;
    totalempl = NULL;
    ctaempl = NULL;
    IF (cta = 'N') THEN
    BEGIN
     FOR SELECT MAX(N.conc_cod) FROM NOMINA_CONCEPTOS N WHERE N.nomi_id = :id AND N.noco_prov = 'N' AND N.noco_gtoempr = 'N'
     GROUP BY N.conc_cod
     INTO :codconc
     DO
     BEGIN
     IF (dpto IS NOT NULL AND (DPTO <> '') ) THEN
     BEGIN
      SELECT SUM(NC.noco_valor), MAX(NC.noco_deduc) FROM NOMINA_CONCEPTOS NC, EMPLEADOS E, DEPARTAMENTO D
      WHERE NC.nomi_id = :ID AND NC.conc_cod = :codconc AND D.dpto_cod = E.empl_dpto AND NC.terc_nit = E.terc_nit AND d.dpto_cod = :dpto
      GROUP BY NC.conc_cod
      INTO :valor, :deduc;
      nitempl = '-';
      nombreempl = 'TOTAL';
      deptoempl = '-';
      prov = 'N';
      SELECT C.conc_nombre,C.conc_nomcorto FROM CONCEPTOS_NOMINA C WHERE C.conc_cod = :codconc INTO :nombreconc,:nomcortconc;
      SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC, EMPLEADOS E, DEPARTAMENTO D WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id  AND D.dpto_cod = E.empl_dpto AND NC.terc_nit = E.terc_nit INTO :totalempl;
      SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC, EMPLEADOS E, DEPARTAMENTO D WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND NC.noco_deduc = 'S'  AND D.dpto_cod = E.empl_dpto AND NC.terc_nit = E.terc_nit INTO :totaldeduc;
      SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC, EMPLEADOS E, DEPARTAMENTO D WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND NC.noco_deduc = 'N'  AND D.dpto_cod = E.empl_dpto AND NC.terc_nit = E.terc_nit INTO :totaldeveng;
     END
     ELSE
     BEGIN
      SELECT SUM(NC.noco_valor), MAX(NC.noco_deduc) FROM NOMINA_CONCEPTOS NC
      WHERE NC.nomi_id = :ID AND NC.conc_cod = :codconc
      GROUP BY NC.conc_cod
      INTO :valor, :deduc;
      nitempl = '-';
      nombreempl = 'TOTAL';
      deptoempl = '-';
      prov = 'N';
      SELECT C.conc_nombre,C.conc_nomcorto FROM CONCEPTOS_NOMINA C WHERE C.conc_cod = :codconc INTO :nombreconc,:nomcortconc;
      SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id INTO :totalempl;
      SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND NC.noco_deduc = 'S' INTO :totaldeduc;
      SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND NC.noco_deduc = 'N' INTO :totaldeveng;
     END
      SUSPEND;
     END
     IF (dpto IS NOT NULL AND (DPTO <> '') ) THEN
     BEGIN
     deduc = 'N';
     nomcortconc = 'TOTAL DEV';
     nombreconc = 'TOTAL DEV';
     codconc = 9999;
     deptoempl = '-';
     prov = 'N';
     SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC, EMPLEADOS E, DEPARTAMENTO D WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id  AND D.dpto_cod = E.empl_dpto AND NC.terc_nit = E.terc_nit AND d.dpto_cod = :dpto INTO :VALOR;
     nitempl = '-';
     nombreempl = 'TOTAL';
     SUSPEND;
     deduc = 'S';
     nomcortconc = 'TOTAL DEDUC';
     nombreconc = 'TOTAL DEDUC';
     codconc = 99999;
     deptoempl = '-';
     prov = 'N';
     SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC, EMPLEADOS E, DEPARTAMENTO D WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND NC.noco_deduc = 'S'  AND D.dpto_cod = E.empl_dpto AND d.dpto_cod = :dpto AND NC.terc_nit = E.terc_nit INTO :VALOR;
     nitempl = '-';
     nombreempl = 'TOTAL';
     SUSPEND;
     deduc = 'S';
     nomcortconc = 'TOTAL EMPL';
     nombreconc = 'TOTAL EMPL';
     codconc = 999999;
     deptoempl = '-';
     prov = 'N';
     SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC, EMPLEADOS E, DEPARTAMENTO D WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND NC.noco_deduc = 'N'  AND D.dpto_cod = E.empl_dpto AND d.dpto_cod = :dpto AND NC.terc_nit = E.terc_nit INTO :VALOR;
     nitempl = '-';
     nombreempl = 'TOTAL';
     SUSPEND;
     END
     ELSE
     BEGIN
     deduc = 'N';
     nomcortconc = 'TOTAL DEV';
     nombreconc = 'TOTAL DEV';
     codconc = 9999;
     prov = 'N';
     SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND NC.noco_deduc = 'N' INTO :VALOR;
     nitempl = '-';
     nombreempl = 'TOTAL';
     SUSPEND;
     deduc = 'S';
     nomcortconc = 'TOTAL DEDUC';
     nombreconc = 'TOTAL DEDUC';
     codconc = 99999;
     prov = 'N';
     SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND NC.noco_deduc = 'S' INTO :VALOR;
     nitempl = '-';
     nombreempl = 'TOTAL';
     SUSPEND;
     deduc = 'S';
     nomcortconc = 'TOTAL EMPL';
     nombreconc = 'TOTAL EMPL';
     codconc = 999999;
     prov = 'N';
     SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N'  AND NOMI_ID = :id INTO :VALOR;
     nitempl = '-';
     nombreempl = 'TOTAL';
     SUSPEND;
     END
     END
   END
  END
 END
END
^

SET TERM ; ^

INSERT INTO MOVIMIENTO_SALARIO_EMPLEADO (mvse_id,terc_nit,mvse_fecha,mvse_salario)
    SELECT GEN_ID(id_movsalempl,1),E.terc_nit, E.empl_fecing, E.empl_salario
    FROM EMPLEADOS E WHERE E.empl_fecing IS NOT NULL;

SET TERM ^;

CREATE OR ALTER TRIGGER empleados_au FOR empleados
ACTIVE AFTER UPDATE POSITION 0
AS
BEGIN
IF (OLD.empl_salario <> NEW.empl_salario) THEN
 INSERT INTO MOVIMIENTO_SALARIO_EMPLEADO (mvse_id,terc_nit,mvse_fecha,mvse_salario) VALUES(GEN_ID(id_movsalempl,1),OLD.terc_nit,CAST('now' AS DATE),NEW.empl_salario);
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER empleados_ai FOR empleados
ACTIVE AFTER INSERT POSITION 0
AS
BEGIN
INSERT INTO program_vacaciones (TERC_NIT) VALUES (NEW.terc_nit);
INSERT INTO MOVIMIENTO_SALARIO_EMPLEADO (mvse_id,terc_nit,mvse_fecha,mvse_salario) VALUES(GEN_ID(id_movsalempl,1),NEW.terc_nit,CAST('now' AS DATE),NEW.empl_salario);
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER PROCEDURE CALC_SALDOSINI_NOMINA (
    fecha date)
returns (
    emplnit varchar(20),
    emplnom varchar(60),
    primajunio numeric(18,2),
    conc_codprimajun integer,
    primadic numeric(18,2),
    conc_codprimadic integer,
    cesantia numeric(18,2),
    conc_codcesan integer,
    vacac numeric(18,2),
    conc_codvacaci integer,
    intces numeric(18,2),
    conc_codintces integer)
as
declare variable numeromeses integer;
declare variable fechaing date;
declare variable anoact integer;
declare variable mesact integer;
declare variable diaact integer;
declare variable anoing integer;
declare variable diaing integer;
declare variable mesing integer;
declare variable salario numeric(18,2);
declare variable item integer;
declare variable idsaldo integer;
BEGIN
delete from nomina where nomi_periodo = 0;
idsaldo = gen_id(id_nomina,1);
insert into nomina  (nomi_id, nomi_feccausa, nomi_liqok, nomi_periodo) values (:idsaldo, :fecha, 'S', 0);
item = 1;
anoact = CAST(substr(:fecha,1,4)AS INTEGER);
mesact = CAST(substr(:fecha,6,7)AS INTEGER);
diaact = CAST(substr(:fecha,9,10)AS INTEGER);
FOR SELECT  E.TERC_NIT, T.TERC_NOM, E.EMPL_FECING FROM EMPLEADOS E, TERCEROS T WHERE T.terc_nit = E.terc_nit AND e.empl_fecing <= :fecha INTO :emplnit, :emplnom, :fechaing
DO
  BEGIN
    SELECT FIRST 1  m.mvse_salario FROM MOVIMIENTO_SALARIO_EMPLEADO M WHERE M.terc_nit = :emplnit AND M.mvse_fecha <= :fecha ORDER BY M.mvse_fecha DESC into :salario;
    anoing = CAST(substr(:fechaing,1,4)AS INTEGER);
    mesing = CAST(substr(:fechaing,6,7)AS INTEGER);
    diaing = CAST(substr(:fechaing,9,10)AS INTEGER);
    numeromeses = mesact - 1;
    cesantia = (:salario / 12) * :numeromeses;
    intces = cesantia * 1 /100;
    numeromeses = ((:anoact-:anoing)*12)-((:mesact-:mesing)*(-1))-1;
    if (numeromeses > 12) then
    numeromeses = 12;
    IF (numeromeses < 0) THEN
    numeromeses = 0;
    vacac = ((:salario / 12) * :numeromeses) / 2;
    IF (anoact = anoing) THEN
    BEGIN
    IF (mesact > 1 AND mesact <= 6) THEN
    BEGIN
    numeromeses = :mesact - :mesing;
    primajunio = (:salario / 12) * :numeromeses;
    END
    ELSE
    primajunio = 0;
    IF (mesact > 7 AND mesact <= 12) THEN
    BEGIN
    numeromeses = :mesact - 6;
    primadic = (:salario / 12) * (:numeromeses);
    END
    END
    ELSE
    IF (mesact > 1 AND mesact <= 6) THEN
    begin
    numeromeses = :mesact - 1;
    primajunio = (:salario / 12) * :numeromeses;
    end
    else
    IF (mesact > 7 AND mesact <= 12) THEN
    BEGIN
    numeromeses = :mesact - 7;
    primadic = (:salario / 12) * (:numeromeses);
    END
EXECUTE PROCEDURE redondee(:primajunio, 5) RETURNING_VALUES :primajunio;
EXECUTE PROCEDURE redondee(:primadic, 5) RETURNING_VALUES :primadic;
EXECUTE PROCEDURE redondee(:cesantia, 5) RETURNING_VALUES :cesantia;
EXECUTE PROCEDURE redondee(:intces, 5) RETURNING_VALUES :intces;
EXECUTE PROCEDURE redondee(:vacac, 5) RETURNING_VALUES :vacac;
/*if ( cesantia <> 0 AND cesantia IS NOT NULL and  intces <> 0 AND intces IS NOT NULL and primajunio <> 0 AND primajunio IS NOT NULL and vacac <> 0 AND vacac IS NOT NULL and primadic <> 0 AND primadic IS NOT NULL) then*/
select conc_cod from empleado_conceptos where ((conc_cod = 912) or (conc_cod = 913)) and terc_nit = :emplnit into :conc_codcesan;
select conc_cod from empleado_conceptos where ((conc_cod = 923) or (conc_cod = 924)) and terc_nit = :emplnit into :conc_codintces;
select conc_cod from empleado_conceptos where ((conc_cod = 925) or (conc_cod = 927)) and terc_nit = :emplnit into :conc_codprimajun;
select conc_cod from empleado_conceptos where ((conc_cod = 926) or (conc_cod = 928)) and terc_nit = :emplnit into :conc_codprimadic;
select conc_cod from empleado_conceptos where ((conc_cod = 929) or (conc_cod = 930)) and terc_nit = :emplnit  into :conc_codvacaci;
if (cesantia <> 0 AND cesantia IS NOT NULL) then
begin
INSERT INTO NOMINA_CONCEPTOS (NOMI_ID, NOCO_ITEM, CONC_COD, TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC, NOCO_PROV, NOCO_APORTE, NOCO_PAGOOK, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, NOCO_GTOEMPR) VALUES (:idsaldo, :item, :conc_codcesan, :emplnit, :cesantia, '', 'N', 'S', 'N', 'N', 0, :anoact, 'N', 'N', 'N', 'S');
item = :item + 1;
end
if (intces <> 0 AND intces IS NOT NULL) then
begin
INSERT INTO NOMINA_CONCEPTOS (NOMI_ID, NOCO_ITEM, CONC_COD, TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC, NOCO_PROV, NOCO_APORTE, NOCO_PAGOOK, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, NOCO_GTOEMPR) VALUES (:idsaldo, :item, :conc_codintces, :emplnit, :intces, '', 'N', 'S', 'N', 'N', 0, :anoact, 'N', 'N', 'N', 'S');
item = :item + 1;
end
if (primajunio <> 0 AND primajunio IS NOT NULL) then
begin
INSERT INTO NOMINA_CONCEPTOS (NOMI_ID, NOCO_ITEM, CONC_COD, TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC, NOCO_PROV, NOCO_APORTE, NOCO_PAGOOK, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, NOCO_GTOEMPR) VALUES (:idsaldo, :item, :conc_codprimajun, :emplnit, :primajunio, '', 'N', 'S', 'N', 'N', 0, :anoact, 'N', 'N', 'N', 'S');
item = :item + 1;
end
if (primadic <> 0 AND primadic IS NOT NULL) then
begin
INSERT INTO NOMINA_CONCEPTOS (NOMI_ID, NOCO_ITEM, CONC_COD, TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC, NOCO_PROV, NOCO_APORTE, NOCO_PAGOOK, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, NOCO_GTOEMPR) VALUES (:idsaldo, :item, :conc_codprimadic, :emplnit, :primadic, '', 'N', 'S', 'N', 'N', 0, :anoact, 'N', 'N', 'N', 'S');
item = :item + 1;
end
if (vacac <> 0 AND vacac IS NOT NULL) then
begin
INSERT INTO NOMINA_CONCEPTOS (NOMI_ID, NOCO_ITEM, CONC_COD, TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC, NOCO_PROV, NOCO_APORTE, NOCO_PAGOOK, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, NOCO_GTOEMPR) VALUES (:idsaldo, :item, :conc_codvacaci, :emplnit, :vacac, '', 'N', 'S', 'N', 'N', 0, :anoact, 'N', 'N', 'N', 'S');
item = :item + 1;
end
    SUSPEND;
  END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER PROCEDURE CAUSA_NOMINA (
    fec date,
    periodo integer,
    periodicidad integer,
    pagoglobal char(1),
    ano char(4),
    depto integer)
returns (
    idnomina integer,
    itemini integer)
as
declare variable item integer;
declare variable nite varchar(20) character set none;
declare variable nit_tercero varchar(20);
declare variable concept integer;
declare variable montos numeric(18,2);
declare variable porcen numeric(9,4);
declare variable entidad varchar(20);
declare variable conc_cod integer;
declare variable conc_deduc char(1);
declare variable conc_porc numeric(9,4);
declare variable conc_entidad integer;
declare variable conc_monto numeric(18,2);
declare variable conc_modifi char(1);
declare variable conc_promedio char(1);
declare variable emco_perprom integer;
declare variable valor numeric(18,2);
declare variable diaslab integer;
declare variable conc_prov char(1);
declare variable conc_aporte char(1);
declare variable numeroprom integer;
declare variable conc_aplicaprom char(1);
declare variable perinicial integer;
declare variable anoprom integer;
declare variable conc_dias char(1);
declare variable conc_otroconc char(1);
declare variable conc_codotroconc integer;
declare variable anosum integer;
declare variable salario char(1) character set none;
declare variable liquidaper integer;
declare variable rmod numeric(2,2);
declare variable basico numeric(18,2);
declare variable niteps varchar(20);
declare variable nitafc varchar(20);
declare variable nitafp varchar(20);
declare variable nitccf varchar(20);
declare variable gtoempr char(1);
declare variable comision numeric(18,2);
declare variable cambsaltrans numeric(18,2);
declare variable saldosini numeric(18,2);
declare variable duranov integer;
declare variable base numeric(18,2);
declare variable aprox integer;
declare variable mensual char(1);
declare variable horasex numeric(18,2);
declare variable diasnov integer;
declare variable tomasal integer;
declare variable retroact numeric(18,2);
declare variable reembolso numeric(18,2);
declare variable incap numeric(18,2);
declare variable deptoempl integer;
declare variable auxtrans numeric(18,2);
declare variable smlv numeric(18,2);
declare variable beneficios numeric(18,2);
declare variable confirmado char(1);
declare variable recnoct numeric(18,2);
declare variable recfest numeric(18,2);
declare variable tar_recnotc numeric(9,4);
declare variable tar_recfest numeric(9,4);
declare variable recargo numeric(18,2);
declare variable basicorec numeric(18,2);
declare variable parambenef char(2);
declare variable vacacdisf numeric(18,2);
declare variable valorpredet numeric(18,2);
BEGIN
 SELECT N.NOMI_ID, N.nomi_liqok FROM NOMINA N WHERE N.nomi_periodo = :periodo AND N.nomi_periodocidad = :periodicidad AND N.nomi_ano = :ano
 INTO :IDNOMINA, :CONFIRMADO;
 IF (:idnomina IS NULL) THEN
 BEGIN
  EXECUTE PROCEDURE cambie_id_nomina RETURNING_VALUES(:idnomina);
  INSERT INTO nomina (nomi_id, NOMI_FECCAUSA, NOMI_PAGOGLOBAL, NOMI_PERIODOCIDAD, NOMI_PERIODO, NOMI_ANO, NOMI_LIQOK)
  VALUES (:IDNOMINA, :fec,:pagoglobal, :periodicidad, :periodo, :ano, 'N');
  item = 1;
 END
 ELSE
 BEGIN
  SELECT MAX(N.noco_item) FROM NOMINA_CONCEPTOS N WHERE N.nomi_id = :idnomina
  INTO :item;
 END
 if ((confirmado = 'S') AND (idnomina IS NOT NULL)) then
 BEGIN
  idnomina = 0;
 END
 else
 begin
 IF (DEPTO = 0) THEN
  INSERT INTO NOMINA_DEPARTAMENTO (nomi_id, nodp_depto)VALUES(:IDNOMINA,0);
 ELSE
  INSERT INTO NOMINA_DEPARTAMENTO (nomi_id, nodp_depto)VALUES(:IDNOMINA,:DEPTO);
 ITEMINI = ITEM;
 FOR SELECT E.TERC_NIT, e.empl_eps, e.empl_afc, e.empl_afp, e.empl_ccf, e.empl_dpto
 FROM EMPLEADOS E
 WHERE E.empl_ppago = :periodicidad AND ((E.empl_fecret IS NULL) OR (E.empl_fecret > :fec)) AND E.empl_fecing <= :fec
 INTO :nite, :niteps, :nitafc, :nitafp, :nitccf, :deptoempl
 DO
 BEGIN
 SELECT FIRST 1  m.mvse_salario FROM MOVIMIENTO_SALARIO_EMPLEADO M WHERE M.terc_nit = :nite AND M.mvse_fecha <= :fec ORDER BY M.mvse_fecha DESC into :basico;
 IF ((depto = 0) OR (deptoempl = :depto)) THEN
 BEGIN
  FOR SELECT CE.TERC_NIT, CE.CONC_COD, CE.EMCO_MONTO, CE.EMCO_PORC, ce.empl_entidad, CE.emco_perprom, CE.emco_luquidaper, CE.emco_mensual, CN.CONC_COD, CN.CONC_DEDUC,CN.CONC_PORC, CN.CONC_ENTIDAD, CN.CONC_MONTO,  CN.CONC_DIAS, CN.CONC_MODIFI,
  CN.CONC_PROMEDIO, CN.conc_salario, CE.emco_perprom, CN.conc_prov, CN.conc_aporte, CN.conc_aplicaprom, cn.conc_otroconc, cn.conc_codotroconc, CN.conc_gtoempr, CN.conc_base, CE.emco_tomsal
  FROM empleado_conceptos CE, CONCEPTOS_NOMINA CN WHERE (CE.CONC_COD = CN.CONC_COD) AND (CE.terc_nit = :nite) AND
  (((CE.emco_fecini <= :fec AND CE.emco_fecfin >= :FEC)) OR
  ((cn.conc_todosper = 'N') AND (CE.emco_ppago = :periodo)) OR (cn.conc_todosper = 'S'))  ORDER BY (TERC_NIT )
  INTO :nit_tercero, :concept,  :montos, :porcen, :entidad, :numeroprom, :liquidaper, :mensual ,:CONC_COD, :CONC_DEDUC, :CONC_PORC,
  :CONC_ENTIDAD, :CONC_MONTO, :CONC_DIAS, :CONC_MODIFI,:CONC_PROMEDIO, :salario,:EMCO_PERPROM, :conc_prov, :conc_aporte , :CONC_APLICAPROM, :conc_otroconc, :conc_codotroconc, :gtoempr, :base, :tomasal
  DO
  BEGIN
   IF (conc_dias = 'S') THEN
    EXECUTE PROCEDURE DIAS_LABORADOS (:nite, :periodo, :fec, :mensual,:conc_aporte) RETURNING_VALUES (:diaslab);
   ELSE
    diaslab = 15;
/*   IF (mensual = 'S') THEN
   BEGIN
    diaslab = 30;
   END
*/   IF (:tomasal <> 0) THEN
   BEGIN
    IF ((:periodicidad = 2) AND (:tomasal <> 2)) THEN
    BEGIN
     IF ((periodo = 2) OR (periodo = 4) OR (periodo = 6) OR (periodo = 8) OR (periodo = 10) OR (periodo = 12)
     OR (periodo = 14) OR (periodo = 16) OR (periodo = 18) OR (periodo = 20) OR (periodo = 22) OR (periodo = 24)) THEN
     basico = 0;
    END
    ELSE
    IF ((:periodicidad = 3) AND (:tomasal <> 1)) THEN
    BEGIN
     IF ((periodo = 1) OR (periodo = 5) OR (periodo = 9) OR (periodo = 13) OR (periodo = 17) OR (periodo = 21)
     OR (periodo = 25) OR (periodo = 29) OR (periodo = 33) OR (periodo = 37) OR (periodo = 41) OR (periodo = 45)
     OR (periodo = 49)) THEN
     basico = 0;
    END
    ELSE
     IF ((:periodicidad = 3) AND (:tomasal <> 2)) THEN
     BEGIN
      IF ((periodo = 2) OR (periodo = 6) OR (periodo = 10) OR (periodo = 14) OR (periodo = 18) OR (periodo = 22)
      OR (periodo = 26) OR (periodo = 30) OR (periodo = 34) OR (periodo = 38) OR (periodo = 42) OR (periodo = 46)
      OR (periodo = 50)) THEN
      basico = 0;
     END
     ELSE
     IF ((:periodicidad = 3) AND (:tomasal <> 3)) THEN
     BEGIN
      IF ((periodo = 3) OR (periodo = 7) OR (periodo = 11) OR (periodo = 15) OR (periodo = 19) OR (periodo = 23)
      OR (periodo = 27) OR (periodo = 31) OR (periodo = 35) OR (periodo = 39) OR (periodo = 43) OR (periodo = 47)
      OR (periodo = 51)) THEN
      basico = 0;
     END
     ELSE
     IF ((:periodicidad = 3) AND (:tomasal <> 4)) THEN
     BEGIN
      IF ((periodo = 4) OR (periodo = 8) OR (periodo = 12) OR (periodo = 16) OR (periodo = 20) OR (periodo = 24)
      OR (periodo = 29) OR (periodo = 32) OR (periodo = 36) OR (periodo = 40) OR (periodo = 44) OR (periodo = 48)
      OR (periodo = 52)) THEN
      basico = 0;
     END
   END
   ELSE
    BEGIN
     SELECT FIRST 1  m.mvse_salario FROM MOVIMIENTO_SALARIO_EMPLEADO M WHERE M.terc_nit = :nite AND M.mvse_fecha <= :fec ORDER BY M.mvse_fecha DESC INTO :basico;
    END
    valorpredet = NULL;
    SELECT VP.nvpr_monto FROM NOMINA_VALOR_PREDET VP WHERE VP.nvpr_periodicidad = :periodicidad AND VP.nvpr_periodo = :periodo AND VP.nvpr_ano = :ano AND vp.conc_cod = :conc_cod AND vp.terc_nit = :nite
    INTO :valorpredet;
    IF ((:valorpredet <> 0) AND (valorpredet IS NOT NULL)) THEN
     valor = valorpredet;
    ELSE
    BEGIN
    SELECT ((n.nono_valor /30) * n.nono_dura), (n.nono_dura) FROM nomina_novedades n WHERE n.tnov_cod = 11 AND n.terc_nit = :nite AND n.nono_periodo = :periodo INTO :cambsaltrans, :duranov;
    IF (cambsaltrans IS NULL) THEN
    cambsaltrans = 0;
    IF (duranov IS NULL) THEN
    duranov = 0;
    diaslab = :diaslab - :duranov;
    IF (conc_cod = 922) THEN
    BEGIN
     SELECT SUM(P.prcu_monto) FROM prestamo_cuotas P, prestamo_nomina PN WHERE P.prcu_ano = :ano AND P.prcu_periodo = :periodo AND PN.prno_id = P.prno_id AND PN.terc_nit = :nite INTO :valor;
     IF (valor IS NULL) THEN
     valor = 0;
     item = :item + 1;
     UPDATE prestamo_cuotas  P SET prcu_ok = 'S' WHERE P.prcu_ano = :ano AND P.prcu_periodo = :periodo AND P.prno_id = (SELECT PN.prno_id FROM PRESTAMO_NOMINA PN WHERE PN.terc_nit = :nite);
    END
    ELSE
    IF ((:montos = 0) OR (:montos IS NULL)) THEN
    BEGIN
     IF ((CONC_PORC = 0 AND :porcen = 0) OR (CONC_PORC IS NULL AND :porcen = 0) OR (CONC_PORC = 0 AND :porcen IS NULL) OR (CONC_PORC IS NULL AND :porcen IS NULL) ) THEN
     BEGIN
      IF ((conc_monto <> 0) AND (conc_monto IS NOT NULL) ) THEN
      BEGIN
       VALOR = :CONC_MONTO;
       IF (:conc_dias = 'S') THEN
       valor = (:valor / 30) * :diaslab;
      END
      ELSE
      IF (salario = 'S' AND CONC_COD <> 900 AND CONC_COD <> 920 and conc_cod <> 932 AND CONC_COD <> 953) THEN
      BEGIN
       SELECT FIRST 1  m.mvse_salario FROM MOVIMIENTO_SALARIO_EMPLEADO M WHERE M.terc_nit = :nite AND M.mvse_fecha <= :fec ORDER BY M.mvse_fecha DESC INTO :basico;
       SELECT N.noex_recnoct, N.noex_recfest
       FROM NOMINA_HORASEXT N WHERE N.noex_periodio = :periodo AND N.noex_ano = :ano AND N.terc_nit = :nite
       INTO :recnoct, :recfest;
       if (recnoct is null) then
        recnoct = 0;
       if (recfest is null) then
        recfest = 0;
       SELECT P.paan_recnoc, P.paan_recfest FROM PARAMETROS_ANO P WHERE P.paan_ano = :ano INTO :tar_recnotc, :tar_recfest;
       basico = ((:basico/30)*:diaslab) - (((:basico/30)/8)*:recnoct);
       basico = :basico - (((:basico/30)/8)*:recfest);
       conc_monto = :basico;
       VALOR = (:conc_monto/*/30 * :diaslab*/ ) + :cambsaltrans;
      END
      ELSE
      BEGIN
       valor = montos;
       IF (:conc_dias = 'S') THEN
       valor = (:valor / 30) * :diaslab;
      END
     END
     ELSE
     BEGIN
      IF (:porcen <> 0) THEN
      BEGIN
       IF ((conc_monto <> 0) AND (conc_monto IS NOT NULL) ) THEN
       BEGIN
        VALOR = ((:CONC_MONTO ) * :PORCEN) /100;
       END
      END
      ELSE
      BEGIN
       IF ((conc_monto <> 0) AND (conc_monto IS NOT NULL) ) THEN
       BEGIN
        VALOR = ((:CONC_MONTO) * :conc_porc) /100;
       END
       ELSE
       IF (salario = 'S' AND CONC_COD <> 900 AND CONC_COD <> 920 and conc_cod <> 932 AND CONC_COD <> 953) THEN
       BEGIN
       SELECT FIRST 1  m.mvse_salario FROM MOVIMIENTO_SALARIO_EMPLEADO M WHERE M.terc_nit = :nite AND M.mvse_fecha <= :FEC ORDER BY M.mvse_fecha DESC INTO :basico;
       SELECT N.noex_recnoct, N.noex_recfest
       FROM NOMINA_HORASEXT N WHERE N.noex_periodio = :periodo AND N.noex_ano = :ano AND N.terc_nit = :nite
       INTO :recnoct, :recfest;
       if (recnoct is null) then
        recnoct = 0;
       if (recfest is null) then
        recfest = 0;
       SELECT P.paan_recnoc, P.paan_recfest FROM PARAMETROS_ANO P WHERE P.paan_ano = :ano INTO :tar_recnotc, :tar_recfest;
       basico = ((:basico/30)*:diaslab) - (((:basico/30)/8)*:recnoct);
       basico = :basico - (((:basico/30)/8)*:recfest);
        conc_monto = :basico;
        VALOR = ((:CONC_MONTO)+ :cambsaltrans * :conc_porc) /100;
       END
       ELSE
       IF (:conc_monto = 0 AND :montos = 0) THEN
       BEGIN
        conc_monto = :basico;
        VALOR = (((:CONC_MONTO / 30) * :diaslab) + :cambsaltrans * :conc_porc) /100;
       END
      END
     END
    END
    ELSE
    IF ((CONC_PORC = 0 OR (conc_porc IS NULL)) AND (:porcen = 0 OR (porcen IS NULL))) THEN
    BEGIN
     VALOR = (:montos);
     IF (:conc_dias = 'S') THEN
     valor = (:valor / 30) * :diaslab;
    END
    ELSE
    IF (:porcen <> 0 AND porcen IS NOT NULL) THEN
    BEGIN
     VALOR = ((:MONTOS ) * :PORCEN) /100;
    END
    ELSE
    BEGIN
     VALOR = ((:montos) * :CONC_PORC) /100;
    END
    IF (conc_promedio = 'S') THEN
    BEGIN
     perinicial = :periodo - (:numeroprom) + 1;
     anoprom = CAST (ano AS INTEGER);
     IF (perinicial <= 0) THEN
     BEGIN
      perinicial = 1;
      anoprom = CAST(ANO AS INTEGER) - 1;
     END
     SELECT SUM (noco_valor) FROM nomina_conceptos n WHERE n.noco_aplicaprom = 'S' AND N.noco_periodo >= :perinicial - 1 AND N.noco_periodo < :periodo AND N.noco_ano >= :anoprom AND N.noco_ano <= :ano AND terc_nit = :nite INTO :valor;
     valor = ((valor ) / (numeroprom -1 ));
     SELECT NOCO_VALOR FROM NOMINA_CONCEPTOS WHERE CONC_COD = :conc_cod AND TERC_NIT  = :nite AND NOCO_PAGOOK = 'N' AND NOCO_PERIODO = 0 INTO :saldosini;
     IF (saldosini IS NULL) THEN
     saldosini = 0;
     ELSE
     UPDATE nomina_conceptos N SET noco_pagook = 'S' WHERE n.noco_aplicaprom = 'S' AND N.noco_periodo >= :perinicial - 1 AND N.noco_periodo < :periodo AND N.noco_ano >= :anoprom AND N.noco_ano <= :ano  AND CONC_COD = :conc_cod AND terc_nit = :nite AND NOCO_PERIODO = 0;
     VALOR = :valor + :saldosini;
     UPDATE nomina_conceptos N SET noco_pagook = 'S' WHERE n.noco_aplicaprom = 'S' AND N.noco_periodo >= :perinicial - 1 AND N.noco_periodo < :periodo AND N.noco_ano >= :anoprom AND N.noco_ano <= :ano  AND CONC_COD = :conc_cod AND terc_nit = :nite;
    END
    ELSE
    IF (conc_otroconc = 'S') THEN
    BEGIN
     anosum = CAST(ano AS INTEGER);
     anosum = anosum - 1;
     SELECT SUM (noco_valor) FROM nomina_conceptos n WHERE n.noco_ano = :anosum AND n.conc_cod = :conc_codotroconc AND N.terc_nit = :nite INTO :valor;
     SELECT NOCO_VALOR FROM NOMINA_CONCEPTOS WHERE noco_ano = :anosum AND conc_cod = :conc_codotroconc AND terc_nit = :nite AND NOCO_PERIODO = 0 INTO :saldosini;
     IF (saldosini IS NULL) THEN
     saldosini = 0;
     ELSE
     UPDATE nomina_conceptos SET noco_pagook = 'S' WHERE noco_ano = :anosum AND conc_cod = :conc_codotroconc AND NOCO_PERIODO = 0 AND terc_nit = :nite;
     VALOR = :valor + :saldosini;
     UPDATE nomina_conceptos SET noco_pagook = 'S' WHERE noco_ano = :anosum AND conc_cod = :conc_codotroconc AND terc_nit = :nite;
    END
    ELSE
    IF (conc_aporte = 'S') THEN
    BEGIN
     horasex = NULL;
     diasnov = NULL;
     retroact = NULL;
     reembolso = NULL;
     beneficios = null;
     recargo = null;
     comision = null;
     incap = null;
     vacacdisf = null;
     IF ((:entidad = '' ) OR (entidad IS NULL)) THEN
     BEGIN
      /*COMISIONES*/
      SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
      IF (comision IS NULL) THEN
      comision = 0;
      /*RETROACTIVO*/
      SELECT C.emco_monto FROM EMPLEADO_CONCEPTOS C WHERE C.terc_nit = :nite AND C.conc_cod = 933 INTO :retroact;
      IF (retroact IS NULL ) THEN
      retroact = 0;
      /*REEMBOLSO*/
      SELECT C.emco_monto FROM EMPLEADO_CONCEPTOS C WHERE C.terc_nit = :nite AND C.conc_cod = 952 INTO :reembolso;
      IF (reembolso IS NULL ) THEN
      reembolso = 0;
      /*VACACIONES DISFRUTADAS ANTERIORMENTE*/
      SELECT C.emco_monto FROM EMPLEADO_CONCEPTOS C WHERE C.terc_nit = :nite AND C.conc_cod = 955 INTO :vacacdisf;
      IF (vacacdisf IS NULL ) THEN
      vacacdisf = 0;
      /*INCAPACIDAD*/
      SELECT N.nono_dura FROM NOMINA_NOVEDADES N WHERE N.terc_nit = :nite AND N.nono_periodo = :periodo AND N.nono_ano = :ano AND (N.tnov_cod = 2 OR (N.tnov_cod = 3)) INTO :diasnov;
      IF (:diasnov IS NULL) THEN
      incap = 0;
      ELSE
      incap = (:basico / 30)* :diasnov;
      /*BASICO*/
      SELECT N.noex_recnoct, N.noex_recfest
      FROM NOMINA_HORASEXT N WHERE N.noex_periodio = :periodo AND N.noex_ano = :ano AND N.terc_nit = :nite
      INTO :recnoct, :recfest;
      if (recnoct is null) then
       recnoct = 0;
      if (recfest is null) then
       recfest = 0;
      SELECT P.paan_recnoc, P.paan_recfest FROM PARAMETROS_ANO P WHERE P.paan_ano = :ano INTO :tar_recnotc, :tar_recfest;
      basico = ((:basico/30)*:diaslab) - (((:basico/30)/8)*:recnoct);
      basico = :basico - (((:basico/30)/8)*:recfest);
      /*HORAS EXTRA*/
      SELECT c.noex_monto FROM nomina_horasext c WHERE c.noex_ano = :ano AND c.noex_periodio = :periodo AND c.noex_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :horasex;
      if (horasex is null) then
       horasex = 0;
      /*RECARGOS*/
      SELECT FIRST 1  m.mvse_salario FROM MOVIMIENTO_SALARIO_EMPLEADO M WHERE M.terc_nit = :nite AND M.mvse_fecha <= :FEC ORDER BY M.mvse_fecha DESC INTO :basicorec;
      SELECT N.noex_recnoct, N.noex_recfest
      FROM NOMINA_HORASEXT N WHERE N.noex_periodio = :periodo AND N.noex_ano = :ano AND N.terc_nit = :nite
      INTO :recnoct, :recfest;
      if (recnoct is null) then
       recnoct = 0;
      if (recfest is null) then
       recfest = 0;
      SELECT P.paan_recnoc, P.paan_recfest FROM PARAMETROS_ANO P WHERE P.paan_ano = :ano INTO :tar_recnotc, :tar_recfest;
      recargo = (((:basicorec/30)/8)*:tar_recnotc)*:recnoct;
      recargo = :recargo + ((((:basicorec/30)/8)*:tar_recfest)*:recfest);
      if (recargo is null) then
       recargo = 0;
      /*basico*/
      if (:basico + :comision + :horasex + :retroact+ :reembolso + :incap+ :cambsaltrans < ((:smlv/30)*:diaslab)) then
      basico = (:smlv/30)*:diaslab;
      /*SMLV Y AUX. TRANSPORTE*/
      SELECT P.paan_auxtr, P.paan_salminimo FROM PARAMETROS_ANO P WHERE P.paan_ano = :ano INTO :auxtrans, :smlv;
      /*BASE*/
      valor = :basico + :comision + :horasex + :retroact+ :reembolso + :incap + :recargo + :cambsaltrans + :vacacdisf;
      IF ((conc_cod = 904) OR (conc_cod = 905) OR (conc_cod = 906) or (conc_cod = 934) ) THEN
      BEGIN
       entidad = :nitafp;
       IF (conc_cod = 904) THEN
       BEGIN
        SELECT A.paan_afptr FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
        VALOR = ((:valor) * :PORCEN) /100;
       END
       ELSE
       IF ((conc_cod = 905) OR (conc_cod = 906) or (conc_cod = 934)) THEN
       BEGIN
        SELECT A.paan_afpem FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
        VALOR = ((:valor) * :PORCEN) /100;
       END
      END
      ELSE
      IF ((conc_cod = 907) OR (conc_cod = 914) OR (conc_cod = 915) or (conc_cod = 938) ) THEN
      BEGIN
       entidad = :niteps;
       IF (conc_cod = 907) THEN
       BEGIN
        SELECT A.paan_epstr FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
        VALOR = ((:valor) * :PORCEN) /100;
       END
       ELSE
       IF ((conc_cod = 914) OR (conc_cod = 915) or (conc_cod = 938)) THEN
       BEGIN
        SELECT A.paan_epsem FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
        VALOR = ((:valor) * :PORCEN) /100;
       END
      END
      ELSE
      IF ((conc_cod = 910) OR (conc_cod = 911) OR (conc_cod = 916) OR (conc_cod = 917) OR (conc_cod = 918) OR (conc_cod = 919) or (conc_cod = 936) or (conc_cod = 939) or (conc_cod = 940)) THEN
      BEGIN
       entidad = :nitccf;
       IF ((conc_cod = 910) OR (conc_cod = 911) or (conc_cod = 936)) THEN
       BEGIN
        SELECT A.paan_ccf FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
        VALOR = ((:valor) * :PORCEN) /100;
       END
       ELSE
       IF ((conc_cod = 916) OR (conc_cod = 917) or (conc_cod = 939)) THEN
       BEGIN
        SELECT A.paan_icbf FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
        VALOR = ((:valor) * :PORCEN) /100;
       END
       ELSE
       IF ((conc_cod = 918) OR (conc_cod = 919) or (conc_cod = 940)) THEN
       BEGIN
        SELECT A.paan_sena FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
        VALOR = ((:valor) * :PORCEN) /100;
       END
      END
      ELSE
      IF ((conc_cod = 912) OR (conc_cod = 913)) THEN
      BEGIN
       entidad = :nitafc;
      EXECUTE PROCEDURE LEE_CONFIGURACION('NOMINA','LIQUIDACION','TOMAR BENEFICIOS PARA CALCULAR PROVISIONES')RETURNING_VALUES(:parambenef);
      if (parambenef = 'SI') then
      BEGIN
      SELECT SUM(ce.emco_monto)
      FROM empleado_conceptos CE, CONCEPTOS_NOMINA CN WHERE CN.conc_benefic = 'S' AND (CE.terc_nit = :nite) AND (CE.CONC_COD = CN.CONC_COD) AND
      ((CE.emco_fecini <= :fec AND CE.emco_fecfin >= :FEC) OR ((cn.conc_todosper = 'N') AND (CE.emco_ppago = :periodo)) OR
      (cn.conc_todosper = 'S'))
      INTO :beneficios;
      if (beneficios is null) then
       beneficios = 0;
      END
      ELSE
       beneficios = 0;
      SELECT P.paan_auxtr, P.paan_salminimo FROM PARAMETROS_ANO P WHERE P.paan_ano = :ano INTO :auxtrans, :smlv;
      if (:basico < (:smlv*2)) then
       auxtrans = (:auxtrans / 30) * :diaslab;
      ELSE
       auxtrans = 0;
       IF ((conc_cod = 912) OR (conc_cod = 913) or (conc_cod = 937)) THEN
       BEGIN
        SELECT A.paan_cesemp FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
        VALOR = ((:valor + :auxtrans + :beneficios) * :PORCEN) /100;
       END
      END
      ELSE
      BEGIN
       IF (comision IS NULL) THEN
       comision = 0;
       SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
       conc_monto = :basico + :comision;
       IF (conc_porc <> 0 AND conc_porc IS NOT NULL) THEN
       VALOR = (((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans + :incap) * :conc_porc) /100;
       ELSE
       IF (:porcen <> 0 AND :porcen IS NOT NULL) THEN
       VALOR = (((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans + :incap) * :porcen) /100;
       ELSE
       IF (:montos <> 0 AND :montos IS NOT NULL) THEN
       valor = :montos;
       ELSE
       IF (:conc_monto <> 0 AND :conc_monto IS NOT NULL) THEN
       valor = :conc_monto;
      END
     END
     item = :item + 1;
    END
    ELSE
    IF (conc_prov = 'S') THEN
    BEGIN
     horasex = NULL;
     diasnov = NULL;
     retroact = NULL;
     reembolso = NULL;
     beneficios = null;
     recargo = null;
     comision = null;
     incap = null;
     /*RECARGO*/
     SELECT FIRST 1  m.mvse_salario FROM MOVIMIENTO_SALARIO_EMPLEADO M WHERE M.terc_nit = :nite AND M.mvse_fecha <= :FEC ORDER BY M.mvse_fecha DESC INTO :basico;
     SELECT N.noex_recnoct, N.noex_recfest
     FROM NOMINA_HORASEXT N WHERE N.noex_periodio = :periodo AND N.noex_ano = :ano AND N.terc_nit = :nite
     INTO :recnoct, :recfest;
     if (recnoct is null) then
      recnoct = 0;
     if (recfest is null) then
      recfest = 0;
     SELECT P.paan_recnoc, P.paan_recfest FROM PARAMETROS_ANO P WHERE P.paan_ano = :ano INTO :tar_recnotc, :tar_recfest;
     recargo = (((:basico/30)/8)*:tar_recnotc)*:recnoct;
     recargo = :recargo + ((((:basico/30)/8)*:tar_recfest)*:recfest);
      /*INCAPACIDAD*/
      SELECT N.nono_dura FROM NOMINA_NOVEDADES N WHERE N.terc_nit = :nite AND N.nono_periodo = :periodo AND N.nono_ano = :ano AND (N.tnov_cod = 2 OR (N.tnov_cod = 3)) INTO :diasnov;
      IF (:diasnov IS NULL) THEN
      incap = 0;
      ELSE
      incap = (:basico / 30)* :diasnov;
     /*BASICO*/
     SELECT N.noex_recnoct, N.noex_recfest
     FROM NOMINA_HORASEXT N WHERE N.noex_periodio = :periodo AND N.noex_ano = :ano AND N.terc_nit = :nite
     INTO :recnoct, :recfest;
     if (recnoct is null) then
      recnoct = 0;
     if (recfest is null) then
      recfest = 0;
     SELECT P.paan_recnoc, P.paan_recfest FROM PARAMETROS_ANO P WHERE P.paan_ano = :ano INTO :tar_recnotc, :tar_recfest;
     basico = ((:basico/30)*:diaslab) - (((:basico/30)/8)*:recnoct);
     basico = :basico - (((:basico/30)/8)*:recfest);
     /*BENEFICIOS*/
     EXECUTE PROCEDURE LEE_CONFIGURACION('NOMINA','LIQUIDACION','TOMAR BENEFICIOS PARA CALCULAR PROVISIONES')RETURNING_VALUES(:parambenef);
     if (parambenef = 'SI') then
     BEGIN
      SELECT SUM(ce.emco_monto)
      FROM empleado_conceptos CE, CONCEPTOS_NOMINA CN WHERE CN.conc_benefic = 'S' AND (CE.terc_nit = :nite) AND (CE.CONC_COD = CN.CONC_COD) AND
      ((CE.emco_fecini <= :fec AND CE.emco_fecfin >= :FEC) OR ((cn.conc_todosper = 'N') AND (CE.emco_ppago = :periodo)) OR
      (cn.conc_todosper = 'S'))
      INTO :beneficios;
      if (beneficios is null) then
        beneficios = 0;
     END
     ELSE
      beneficios = 0;
     if ((conc_cod <> 929) and (conc_cod <> 930) and (conc_cod <> 944)) then
     begin
        SELECT P.paan_auxtr, P.paan_salminimo FROM PARAMETROS_ANO P WHERE P.paan_ano = :ano INTO :auxtrans, :smlv;
        if (:basico < (:smlv*2)) then
           auxtrans = (:auxtrans / 30) * :diaslab;
        ELSE
           auxtrans = 0;
     end
     else
      auxtrans = 0;
     conc_monto = :basico;
     IF (conc_porc <> 0 AND conc_porc IS NOT NULL) THEN
     VALOR = (((:CONC_MONTO)+ :cambsaltrans + :incap + :recargo + :auxtrans + :beneficios) * :conc_porc) /100;
     ELSE
     IF (porcen <> 0 AND porcen IS NOT NULL) THEN
     VALOR = (((:CONC_MONTO)+ :cambsaltrans + :incap + :recargo + :auxtrans + :beneficios) * :porcen) /100;
     ELSE
     IF (montos <> 0 AND montos IS NOT NULL) THEN
     VALOR = :montos;
     ELSE
     IF (conc_monto <> 0 AND conc_monto IS NOT NULL) THEN
     VALOR = :conc_monto;
     item = :item + 1;
    END
    ELSE
    IF (conc_cod = 920) THEN
    BEGIN
     SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :valor;
     IF (valor IS NULL) THEN
     valor = 0;
     item = :item + 1;
    END
    ELSE
    IF (conc_cod = 900 OR (:conc_cod = 931)) THEN
    BEGIN
     SELECT c.noex_monto FROM nomina_horasext c WHERE c.noex_ano = :ano AND c.noex_periodio = :periodo AND c.noex_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :valor;
     IF (valor IS NULL) THEN
     valor = 0;
     item = :item + 1;
    END
    ELSE
    IF (conc_cod = 932) THEN
    BEGIN
     SELECT N.nono_dura FROM NOMINA_NOVEDADES N WHERE N.terc_nit = :nite AND N.nono_periodo = :periodo AND N.nono_ano = :ano AND (N.tnov_cod = 2 OR (N.tnov_cod = 3)) INTO :diasnov;
     IF (:diasnov IS NULL) THEN
     valor = 0;
     ELSE
     valor = (:basico / 30)* :diasnov;
    END
    ELSE
    IF (conc_cod = 921) THEN
    BEGIN
     IF (porcen IS NOT NULL AND porcen <> 0) THEN
     valor = ((basico / 30)* :diaslab ) * :PORCEN /100;
     ELSE
     IF (conc_porc IS NOT NULL AND conc_porc <> 0) THEN
     valor = ((basico / 30)* :diaslab ) * :conc_porc /100;
    END
    ELSE
    if (conc_cod = 953) then
    BEGIN
       SELECT FIRST 1  m.mvse_salario FROM MOVIMIENTO_SALARIO_EMPLEADO M WHERE M.terc_nit = :nite AND M.mvse_fecha <= :FEC ORDER BY M.mvse_fecha DESC INTO :basico;
       SELECT N.noex_recnoct, N.noex_recfest
       FROM NOMINA_HORASEXT N WHERE N.noex_periodio = :periodo AND N.noex_ano = :ano AND N.terc_nit = :nite
       INTO :recnoct, :recfest;
       if (recnoct is null) then
        recnoct = 0;
       if (recfest is null) then
        recfest = 0;
       SELECT P.paan_recnoc, P.paan_recfest FROM PARAMETROS_ANO P WHERE P.paan_ano = :ano INTO :tar_recnotc, :tar_recfest;
       valor = (((:basico/30)/8)*:tar_recnotc)*:recnoct;
       valor = :valor + ((((:basico/30)/8)*:tar_recfest)*:recfest);
    END
    if (conc_aporte = 'S') then
    begin
    if (entidad is null or (entidad = '') ) then
    entidad = :conc_entidad;
    end
   END
    if ((VALOR <> 0) AND (VALOR IS NOT NULL)) then
    BEGIN
    EXECUTE PROCEDURE LEE_CONFIGURACION('NOMINA','GENERAL','REDONDEO AL MULTIPLO DE DIEZ EN TOTALES')RETURNING_VALUES(:aprox);
    EXECUTE PROCEDURE REDONDEE(:valor, :aprox) RETURNING_VALUES (VALOR);
    IF ((mensual = 'N') OR (periodicidad = 1))  THEN
    INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
    VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
    ELSE
    IF (mensual = 'S') THEN
    BEGIN
     IF ((:periodicidad = 2) AND (liquidaper = 1)) THEN
     BEGIN
      IF ((periodo = 1) OR (periodo = 3) OR (periodo = 5) OR (periodo = 7) OR (periodo = 9) OR (periodo = 11)
      OR (periodo = 13) OR (periodo = 15) OR (periodo = 17) OR (periodo = 19) OR (periodo = 21) OR (periodo = 23)) THEN
      INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
      VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
     END
     ELSE
     IF ((:periodicidad = 2) AND (liquidaper = 2)) THEN
     BEGIN
      IF ((periodo = 2) OR (periodo = 4) OR (periodo = 6) OR (periodo = 8) OR (periodo = 10) OR (periodo = 12)
      OR (periodo = 14) OR (periodo = 16) OR (periodo = 18) OR (periodo = 20) OR (periodo = 22) OR (periodo = 24)) THEN
      INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
      VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
     END
     ELSE
     IF ((:periodicidad = 3) AND (liquidaper = 1)) THEN
     BEGIN
      IF ((periodo = 1) OR (periodo = 5) OR (periodo = 9) OR (periodo = 13) OR (periodo = 17) OR (periodo = 21)
      OR (periodo = 25) OR (periodo = 29) OR (periodo = 33) OR (periodo = 37) OR (periodo = 41) OR (periodo = 45)
      OR (periodo = 49)) THEN
      INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
      VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
    END
    ELSE
     IF ((:periodicidad = 3) AND (liquidaper = 2)) THEN
     BEGIN
      IF ((periodo = 2) OR (periodo = 6) OR (periodo = 10) OR (periodo = 14) OR (periodo = 18) OR (periodo = 22)
      OR (periodo = 26) OR (periodo = 30) OR (periodo = 34) OR (periodo = 38) OR (periodo = 42) OR (periodo = 46)
      OR (periodo = 50)) THEN
      INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
      VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
     END
     ELSE
     IF ((:periodicidad = 3) AND (liquidaper = 3)) THEN
     BEGIN
      IF ((periodo = 3) OR (periodo = 7) OR (periodo = 11) OR (periodo = 15) OR (periodo = 19) OR (periodo = 23)
      OR (periodo = 27) OR (periodo = 31) OR (periodo = 35) OR (periodo = 39) OR (periodo = 43) OR (periodo = 47)
      OR (periodo = 51)) THEN
      INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
      VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
     END
     ELSE
     IF ((:periodicidad = 3) AND (liquidaper = 4)) THEN
     BEGIN
      IF ((periodo = 4) OR (periodo = 8) OR (periodo = 12) OR (periodo = 16) OR (periodo = 20) OR (periodo = 24)
      OR (periodo = 29) OR (periodo = 32) OR (periodo = 36) OR (periodo = 40) OR (periodo = 44) OR (periodo = 48)
      OR (periodo = 52)) THEN
      INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
      VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
     END
    END
  VALOR = 0;
  basico = 0;
  END
  END
 END
 END
 END
 SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER PROCEDURE FORM_INTEGRADO_ELECTRONICO (
    iddoc integer,
    fecliq varchar(8),
    codoper varchar(2))
returns (
    datos varchar(591))
as
declare variable tipreg varchar(2);
declare variable sec varchar(5);
declare variable nomcia varchar(200);
declare variable tipdocaport varchar(2);
declare variable nitcia varchar(16);
declare variable dvcia varchar(1);
declare variable formapresent varchar(1);
declare variable codsucur varchar(10);
declare variable nomsucur varchar(40);
declare variable codarp varchar(6);
declare variable perliq varchar(7);
declare variable perliqsalud char(7);
declare variable numform varchar(10);
declare variable numempl varchar(5);
declare variable numempladm varchar(6);
declare variable vlornomi varchar(12);
declare variable vlornomiint integer;
declare variable nitempl varchar(16);
declare variable secint integer;
declare variable tipoid varchar(2);
declare variable tipocot varchar(2);
declare variable stipocot varchar(2);
declare variable nom1 varchar(20);
declare variable nom2 varchar(30);
declare variable ape1 varchar(20);
declare variable ape2 varchar(30);
declare variable fecing date;
declare variable fecret date;
declare variable countnov integer;
declare variable novedad varchar(1);
declare variable codadmin varchar(6);
declare variable diaslab varchar(3);
declare variable salminimo varchar(22);
declare variable fecanomes char(7);
declare variable salbasic varchar(22);
declare variable incap varchar(2);
declare variable ciudad varchar(5);
declare variable porcapor varchar(7);
declare variable porcapor2 varchar(9);
declare variable cotobl varchar(9);
declare variable cotobladm varchar(10);
declare variable nitadmin varchar(16);
declare variable itemadm integer;
BEGIN
TIPREG = '01';
DATOS = :tipreg;
DATOS = :DATOS || '1';
SEC = '0001';
DATOS = :DATOS || :sec;
EXECUTE PROCEDURE LEE_CONFIGURACION ('GENERAL','GENERAL','NOMBRE COMPAÑIA') RETURNING_VALUES (:nomcia);
EXECUTE PROCEDURE CEROS_ANCHO_FIJO (:nomcia, 200, 'A') RETURNING_VALUES (:nomcia);
DATOS = :DATOS || :nomcia;
DATOS = :DATOS || 'NI';
EXECUTE PROCEDURE LEE_CONFIGURACION ('CONTABILIDAD','GENERAL','NIT COMPAÑIA') RETURNING_VALUES (:nitcia);
EXECUTE PROCEDURE DV (nitcia) RETURNING_VALUES (dvcia);
EXECUTE PROCEDURE CEROS_ANCHO_FIJO (:nitcia, 16, 'A') RETURNING_VALUES (:nitcia);
DATOS = :DATOS || :nitcia;
DATOS = :DATOS || :dvcia;
FORMAPRESENT = 'E';
DATOS = :DATOS || :formapresent;
DATOS = :DATOS || '0000000000';
DATOS = :DATOS || '          ';
DATOS = :DATOS || 'U';
codsucur = '';
EXECUTE PROCEDURE CEROS_ANCHO_FIJO (:codsucur, 10, 'A') RETURNING_VALUES (:codsucur);
DATOS = :DATOS || :codsucur;
nomsucur = '';
EXECUTE PROCEDURE CEROS_ANCHO_FIJO (:nomsucur, 40, 'A') RETURNING_VALUES (:nomsucur);
DATOS = :DATOS || :nomsucur;
SELECT ADMI_CODARP FROM ADMINISTRADORA A, PARAMETROS_ANO P WHERE P.paan_nitarp = A.terc_nit AND P.paan_ano = substr(:fecliq,1,4) INTO :codarp;
EXECUTE PROCEDURE CEROS_ANCHO_FIJO (:codarp, 6, 'A') RETURNING_VALUES (:codarp);
DATOS = :DATOS || :codarp;
SELECT SUBSTRING(P.pgap_fecha FROM 1 FOR 7) FROM PAGO_APORTES P WHERE P.pgap_id = :iddoc AND p.pgap_item = 1 INTO :perliq;
perliq = substr(perliq, 1,4) || '-' ||substr(perliq, 6,8);
DATOS = :DATOS || :perliq;
perliqsalud = :perliq;
DATOS = :DATOS || :perliqsalud;
SELECT pgap_formulario FROM PAGO_APORTES WHERE PGAP_ID = :iddoc AND pgap_item = 1 INTO :numform;
EXECUTE PROCEDURE CEROS_ANCHO_FIJO (:numform, 10, 'A') RETURNING_VALUES (:numform);
DATOS = :DATOS || :numform;
DATOS = :DATOS || '          ';
SELECT COUNT(E.pgap_id) FROM PAGO_APORTES_EMPLEADOS E WHERE E.pgap_id = :iddoc INTO :numempl;
EXECUTE PROCEDURE CEROS_ANCHO_FIJO (:numempl, 5, 'N') RETURNING_VALUES (:numempl);
DATOS = :DATOS || :numempl;
SELECT CAST(SUM(pade_ibc) AS INTEGER) FROM PAGO_APORTES_DETALLE WHERE PGAP_ID = :iddoc INTO :vlornomiint;
/*vlornomiint = CAST(:vlornomi AS INTEGER);
*/vlornomi = CAST(vlornomiint AS VARCHAR(12));
EXECUTE PROCEDURE CEROS_ANCHO_FIJO (:vlornomi, 12, 'N') RETURNING_VALUES (:vlornomi);
DATOS = :DATOS || :vlornomi;
DATOS = :DATOS || '1';
codoper = '0';
EXECUTE PROCEDURE CEROS_ANCHO_FIJO (:codoper, 2, 'N') RETURNING_VALUES (:codoper);
DATOS = :DATOS || :codoper;
SUSPEND;
datos = '';
secint = 0;
FOR SELECT e.terc_nit, T.terc_tipoid,t.ciud_cod , E.tcot_cod,E.stco_cod, T.terc_nombre1, T.terc_nombre2, T.terc_apellido1, T.terc_apellido2, E.empl_fecing, e.empl_fecret FROM empleados e, TERCEROS T
WHERE (e.empl_fecret > substr(:fecliq,1,4) || '/' || substr(:fecliq,5,6) || '/' || substr(:fecliq,7,8) OR (e.empl_fecret IS NULL))  AND e.empl_fecing < substr(:fecliq,1,4) || '/' || substr(:fecliq,5,6) || '/' || substr(:fecliq,7,8) AND T.terc_nit = E.terc_nit
AND E.terc_nit IN (SELECT PA.terc_nit FROM PAGO_APORTES_DETALLE PA WHERE PA.pgap_id = :iddoc)
INTO :nitempl, :tipoid, :ciudad,:tipocot,:stipocot, :nom1, :nom2, :ape1, :ape2, :fecing, :fecret
DO
 BEGIN
    tipreg  = '02';
    DATOS = :datos || tipreg;
    secint = secint + 1;
    EXECUTE PROCEDURE CEROS_ANCHO_FIJO (CAST(secint AS VARCHAR(200)), 5, 'N') RETURNING_VALUES (:sec);
    DATOS = DATOS || :SEC;
    IF (:tipoid = 'N') THEN
    tipoid = 'NI';
    IF (:tipoid = 'C') THEN
    tipoid = 'CC';
    IF (:tipoid = 'E') THEN
    tipoid = 'CE';
    IF (:tipoid = 'T') THEN
    tipoid = 'TI';
    IF (:tipoid = 'R') THEN
    tipoid = 'RC';
    IF (:tipoid = 'P') THEN
    tipoid = 'PA';
    IF (:tipoid = 'J') THEN
    tipoid = 'CC';
    DATOS = DATOS || tipoid;
    EXECUTE PROCEDURE CEROS_ANCHO_FIJO (:nitempl, 16, 'A') RETURNING_VALUES (:nitempl);
    DATOS = DATOS || :nitempl;
    EXECUTE PROCEDURE CEROS_ANCHO_FIJO (:tipocot, 2, 'N') RETURNING_VALUES (:tipocot);
    datos = datos || :tipocot;
    EXECUTE PROCEDURE CEROS_ANCHO_FIJO (:stipocot, 2, 'N') RETURNING_VALUES (:stipocot);
    datos = datos || :stipocot;
    datos = datos || ' ';
    datos = datos || ' ';
    datos = datos || substr(:ciudad,1,2);
    datos = datos || substr(:ciudad,3,6);
    EXECUTE PROCEDURE CEROS_ANCHO_FIJO (:ape1, 20, 'A') RETURNING_VALUES (:ape1);
    IF (ape1 IS NULL) THEN
    ape1 = '';
    DATOS = DATOS || :ape1;
    EXECUTE PROCEDURE CEROS_ANCHO_FIJO (:ape2, 30, 'A') RETURNING_VALUES (:ape2);
    IF (ape2 IS NULL) THEN
    ape2 = '';
    DATOS = DATOS || :ape2;
    EXECUTE PROCEDURE CEROS_ANCHO_FIJO (:nom1, 20, 'A') RETURNING_VALUES (:nom1);
    IF (nom1 IS NULL) THEN
    nom1 = '';
    DATOS = DATOS || :nom1;
    EXECUTE PROCEDURE CEROS_ANCHO_FIJO (:nom2, 30, 'A') RETURNING_VALUES (:nom2);
    IF (nom2 IS NULL) THEN
    nom2 = '';
    DATOS = DATOS || :nom2;
    novedad = null;
    IF ((substr(:fecing,6,7) = substr(:fecliq,5,6)) AND (substr(:fecing,1,4) = substr(:fecliq,1,4))) THEN
    novedad = 'X';
    ELSE
    novedad = ' ';
    datos = :datos || :novedad;
    novedad = null;
    IF (:fecret IS NOT NULL AND (substr(:fecret,6,7) = substr(:fecliq,5,6))) THEN
    novedad = 'X';
    ELSE
    novedad = ' ';
    datos = :datos || :novedad;
    novedad = null;
    SELECT COUNT(*) FROM nomina_novedades v WHERE (substr(nono_fecha, 1,4) = substr(:fecliq,1,4)) AND (substr(nono_fecha, 6,7) = substr(:fecliq,6,7)) AND v.tnov_cod = 5 AND V.nono_tipoadm = 'E' AND V.terc_nit = :nitempl INTO :countnov;
    IF (:countnov > 0) THEN
    novedad = 'X';
    ELSE
    novedad = ' ';
    datos = :datos || :novedad;
    novedad = null;
   SELECT COUNT(*) FROM nomina_novedades v WHERE (substr(nono_fecha, 1,4) = substr(:fecliq,1,4)) AND (substr(nono_fecha, 6,7) = substr(:fecliq,6,7)) AND v.tnov_cod = 5 AND V.nono_tipoadm = 'E' AND V.terc_nit = :nitempl INTO :countnov;
    IF (:countnov > 0) THEN
    novedad = 'X';
    ELSE
    novedad = ' ';
    datos = :datos || :novedad;
    novedad = null;
    SELECT COUNT(*) FROM nomina_novedades v WHERE (substr(nono_fecha, 1,4) = substr(:fecliq,1,4)) AND (substr(nono_fecha, 6,7) = substr(:fecliq,6,7)) AND v.tnov_cod = 5 AND V.nono_tipoadm = 'A' AND V.terc_nit = :nitempl INTO :countnov;
    IF (:countnov > 0) THEN
    novedad = 'X';
    ELSE
    novedad = ' ';
    datos = :datos || :novedad;    
    novedad = null;
    SELECT COUNT(*) FROM nomina_novedades v WHERE (substr(nono_fecha, 1,4) = substr(:fecliq,1,4)) AND (substr(nono_fecha, 6,7) = substr(:fecliq,6,7)) AND v.tnov_cod = 5 AND V.nono_tipoadm = 'A' AND V.terc_nit = :nitempl INTO :countnov;
    IF (:countnov > 0) THEN
    novedad = 'X';
    ELSE
    novedad = ' ';
    datos = :datos || :novedad;
    novedad = null;
    SELECT COUNT(*) FROM nomina_novedades v WHERE (substr(nono_fecha, 1,4) = substr(:fecliq,1,4)) AND (substr(nono_fecha, 6,7) = substr(:fecliq,6,7)) AND v.tnov_cod = 8 AND V.nono_tipoadm = 'A' AND V.terc_nit = :nitempl INTO :countnov;
    IF (:countnov > 0) THEN
    novedad = 'X';
    ELSE
    novedad = ' ';
    datos = :datos || :novedad;
    novedad = null;
    SELECT COUNT(*) FROM nomina_novedades v WHERE (substr(nono_fecha, 1,4) = substr(:fecliq,1,4)) AND (substr(nono_fecha, 6,7) = substr(:fecliq,6,7)) AND v.tnov_cod = 10 AND V.nono_tipoadm = 'A' AND V.terc_nit = :nitempl INTO :countnov;
    IF (:countnov > 0) THEN
    novedad = 'X';
    ELSE
    novedad = ' ';
    datos = :datos || :novedad;
    novedad = null;
    SELECT COUNT(*) FROM nomina_novedades v WHERE (substr(nono_fecha, 1,4) = substr(:fecliq,1,4)) AND (substr(nono_fecha, 6,7) = substr(:fecliq,6,7)) AND v.tnov_cod = 11 AND V.terc_nit = :nitempl INTO :countnov;
    IF (:countnov > 0) THEN
    novedad = 'X';
    ELSE
    novedad = ' ';
    datos = :datos || :novedad;    
    novedad = null;
    SELECT COUNT(*) FROM nomina_novedades v WHERE (substr(nono_fecha, 1,4) = substr(:fecliq,1,4)) AND (substr(nono_fecha, 6,7) = substr(:fecliq,6,7)) AND v.tnov_cod = 9 AND V.terc_nit = :nitempl INTO :countnov;
    IF (:countnov > 0) THEN
    novedad = 'X';
    ELSE
    novedad = ' ';
    datos = :datos || :novedad;    
    novedad = null;
    SELECT COUNT(*) FROM nomina_novedades v WHERE (substr(nono_fecha, 1,4) = substr(:fecliq,1,4)) AND (substr(nono_fecha, 6,7) = substr(:fecliq,6,7)) AND v.tnov_cod = 2 AND V.terc_nit = :nitempl INTO :countnov;
    IF (:countnov > 0) THEN
    novedad = 'X';
    ELSE
    novedad = ' ';
    datos = :datos || :novedad;    
    novedad = null;
    SELECT COUNT(*) FROM nomina_novedades v WHERE (substr(nono_fecha, 1,4) = substr(:fecliq,1,4)) AND (substr(nono_fecha, 6,7) = substr(:fecliq,6,7)) AND v.tnov_cod = 4 AND V.terc_nit = :nitempl INTO :countnov;
    IF (:countnov > 0) THEN
    novedad = 'X';
    ELSE
    novedad = ' ';
    datos = :datos || :novedad;
    novedad = null;
    SELECT COUNT(*) FROM nomina_novedades v WHERE (substr(nono_fecha, 1,4) = substr(:fecliq,1,4)) AND (substr(nono_fecha, 6,7) = substr(:fecliq,6,7)) AND v.tnov_cod = 6 AND V.terc_nit = :nitempl INTO :countnov;
    IF (:countnov > 0) THEN
    novedad = 'X';
    ELSE
    novedad = ' ';
    datos = :datos || :novedad;    
    novedad = null;
    SELECT COUNT(*) FROM nomina_novedades v WHERE (substr(nono_fecha, 1,4) = substr(:fecliq,1,4)) AND (substr(nono_fecha, 6,7) = substr(:fecliq,6,7)) AND v.tnov_cod = 1 AND V.terc_nit = :nitempl INTO :countnov;
    IF (:countnov > 0) THEN
    novedad = 'X';
    ELSE
    novedad = ' ';
    datos = :datos || :novedad;    
    novedad = null;
    SELECT COUNT(*) FROM nomina_novedades v WHERE (substr(nono_fecha, 1,4) = substr(:fecliq,1,4)) AND (substr(nono_fecha, 6,7) = substr(:fecliq,6,7)) AND v.tnov_cod = 7 AND V.terc_nit = :nitempl INTO :countnov;
    IF (:countnov > 0) THEN
    novedad = 'X';
    ELSE
    novedad = ' ';
    datos = :datos || :novedad;
    SELECT v.nono_dura FROM nomina_novedades v WHERE (substr(nono_fecha, 1,4) = substr(:fecliq,1,4)) AND (substr(nono_fecha, 6,7) = substr(:fecliq,6,7)) AND v.tnov_cod = 3 AND V.terc_nit = :nitempl INTO :countnov;
    IF (:countnov > 0) THEN
    BEGIN
    novedad = :countnov;
    END
    ELSE
    BEGIN
    countnov = 0;
    END
    EXECUTE PROCEDURE CEROS_ANCHO_FIJO (:countnov, 2, 'N') RETURNING_VALUES (:incap);
    datos = :datos || :incap;
    SELECT a.admi_codafp FROM ADMINISTRADORA A, EMPLEADOS E WHERE E.empl_afp = A.terc_nit AND E.terc_nit = :nitempl INTO :codadmin;
    IF (:codadmin IS NULL) THEN
    codadmin = ' ';
    EXECUTE PROCEDURE CEROS_ANCHO_FIJO (:codadmin, 6, 'A') RETURNING_VALUES (:codadmin);
    datos = :datos || :codadmin;
    codadmin = '';
    SELECT A.admi_codafp FROM nomina_novedades v, EMPLEADOS E, ADMINISTRADORA A WHERE (substr(nono_fecha, 1,4) = substr(:fecliq,1,4)) AND (substr(nono_fecha, 6,7) = substr(:fecliq,6,7)) AND v.tnov_cod = 5 AND V.nono_tipoadm = 'A' AND V.nono_nvaadm = A.terc_nit INTO :codadmin;
    IF (:codadmin IS NULL) THEN
    codadmin = ' ';
    EXECUTE PROCEDURE CEROS_ANCHO_FIJO (:codadmin, 6, 'A') RETURNING_VALUES (:codadmin);
    datos = :datos || :codadmin;
    codadmin = '';
    SELECT a.admi_codeps FROM ADMINISTRADORA A, EMPLEADOS E WHERE E.empl_eps = A.terc_nit AND E.terc_nit = :nitempl INTO :codadmin;
    IF (:codadmin IS NULL) THEN
    codadmin = ' ';
    EXECUTE PROCEDURE CEROS_ANCHO_FIJO (:codadmin, 6, 'A') RETURNING_VALUES (:codadmin);
    datos = :datos || :codadmin;
    codadmin = '';
    SELECT A.admi_codeps FROM nomina_novedades v, EMPLEADOS E, ADMINISTRADORA A WHERE (substr(nono_fecha, 1,4) = substr(:fecliq,1,4)) AND (substr(nono_fecha, 6,7) = substr(:fecliq,6,7)) AND v.tnov_cod = 5 AND V.nono_tipoadm = 'E' AND V.nono_nvaadm = A.terc_nit INTO :codadmin;
    IF (:codadmin IS NULL) THEN
    codadmin = ' ';
    EXECUTE PROCEDURE CEROS_ANCHO_FIJO (:codadmin, 6, 'A') RETURNING_VALUES (:codadmin);
    datos = :datos || :codadmin;
    SELECT a.admi_codccf FROM ADMINISTRADORA A, EMPLEADOS E WHERE E.empl_ccf = A.terc_nit AND E.terc_nit = :nitempl INTO :codadmin;
    IF (:codadmin IS NULL) THEN
    codadmin = ' ';
    EXECUTE PROCEDURE CEROS_ANCHO_FIJO (:codadmin, 6, 'A') RETURNING_VALUES (:codadmin);
    datos = :datos || :codadmin;
    codadmin = '';
    fecanomes = substr(:fecliq,1,4) || '/' || substr(:fecliq,5,6);
    SELECT MAX(ND.node_diaslab) FROM NOMINA_DETALLE ND, PAGO_APORTES PA WHERE PA.pgap_id = :iddoc AND ND.terc_nit = :nitempl AND PA.pgap_idnomina = ND.nomi_id INTO :diaslab;
    IF (:diaslab IS NULL) THEN
    diaslab = '00';
    EXECUTE PROCEDURE CEROS_ANCHO_FIJO (:diaslab, 2, 'N') RETURNING_VALUES (:diaslab);
    Datos = :datos || :diaslab;
    SELECT MAX(ND.node_diaslab) FROM NOMINA_DETALLE ND, PAGO_APORTES PA WHERE PA.pgap_id = :iddoc AND ND.terc_nit = :nitempl AND PA.pgap_idnomina = ND.nomi_id INTO :diaslab;
    IF (:diaslab IS NULL) THEN
    diaslab = '00';
    EXECUTE PROCEDURE CEROS_ANCHO_FIJO (:diaslab, 2, 'N') RETURNING_VALUES (:diaslab);
    Datos = :datos || :diaslab;
    SELECT MAX(ND.node_diaslab) FROM NOMINA_DETALLE ND, PAGO_APORTES PA WHERE PA.pgap_id = :iddoc AND ND.terc_nit = :nitempl AND PA.pgap_idnomina = ND.nomi_id INTO :diaslab;
    IF (:diaslab IS NULL) THEN
    diaslab = '00';
    EXECUTE PROCEDURE CEROS_ANCHO_FIJO (:diaslab, 2, 'N') RETURNING_VALUES (:diaslab);
    Datos = :datos || :diaslab;
    SELECT MAX(ND.node_diaslab) FROM NOMINA_DETALLE ND, PAGO_APORTES PA WHERE PA.pgap_id = :iddoc AND ND.terc_nit = :nitempl AND PA.pgap_idnomina = ND.nomi_id INTO :diaslab;
    IF (:diaslab IS NULL) THEN
    diaslab = '00';
    EXECUTE PROCEDURE CEROS_ANCHO_FIJO (:diaslab, 2, 'N') RETURNING_VALUES (:diaslab);
    Datos = :datos || :diaslab;
    SELECT FIRST 1  m.mvse_salario FROM MOVIMIENTO_SALARIO_EMPLEADO M WHERE M.terc_nit = :nitempl AND M.mvse_fecha <= :fecliq ORDER BY M.mvse_fecha DESC INTO :salbasic;
    IF (:salbasic IS NULL) THEN
    salbasic = '0';
    salbasic = substr(salbasic,1,strlen(salbasic)-3);
    EXECUTE PROCEDURE CEROS_ANCHO_FIJO (:salbasic, 9, 'N') RETURNING_VALUES (:salbasic);
    Datos = :datos || :salbasic;
    Datos = :datos || ' ';
    SELECT e.pgae_ibc FROM pago_aportes_empleados e WHERE e.terc_nit = :nitempl and e.pgap_id = :iddoc INTO :salbasic;
    IF (:salbasic IS NULL) THEN
    salbasic = '0';
    execute procedure redondee (salbasic,1000)returning_values(salbasic);
    salbasic = substr(salbasic,1,strlen(salbasic)-5);
    EXECUTE PROCEDURE CEROS_ANCHO_FIJO (:salbasic, 9, 'N') RETURNING_VALUES (:salbasic);
    Datos = :datos || :salbasic;
    Datos = :datos || :salbasic;
    Datos = :datos || :salbasic;
    Datos = :datos || :salbasic;
    select P.paan_afptr + P.paan_afpem from PARAMETROS_ANO P WHERE P.paan_ano = substr(:fecliq,1,4) INTO :porcapor;
    porcapor = substr(porcapor,1,strlen(porcapor)-2);
    EXECUTE PROCEDURE CEROS_ANCHO_FIJO (:porcapor, 7, 'N') RETURNING_VALUES (:porcapor);
    Datos = :datos || :porcapor;
    select P.pade_cotobl from pago_aportes_detalle P WHERE P.terc_nit = :nitempl AND P.pade_tipap = 'AFP' and p.pgap_id = :iddoc INTO :cotobl;
    cotobl = substr(cotobl,1,strlen(cotobl)-3);
    EXECUTE PROCEDURE CEROS_ANCHO_FIJO (:cotobl, 9, 'N') RETURNING_VALUES (:cotobl);
    Datos = :datos || :cotobl;
    Datos = :datos || '000000000';
    Datos = :datos || '000000000';
    Datos = :datos || '000000000';
    Datos = :datos || '000000000';
    Datos = :datos || '000000000';
    Datos = :datos || '000000000';
    select P.paan_epstr + P.paan_epsem from PARAMETROS_ANO P WHERE P.paan_ano = substr(:fecliq,1,4) INTO :porcapor;
    porcapor = substr(porcapor,1,strlen(porcapor)-2);
    EXECUTE PROCEDURE CEROS_ANCHO_FIJO (:porcapor, 7, 'N') RETURNING_VALUES (:porcapor);
    Datos = :datos || :porcapor;
    select P.pade_cotobl from pago_aportes_detalle P WHERE P.terc_nit = :nitempl AND P.pade_tipap = 'EPS' and p.pgap_id = :iddoc INTO :cotobl;
    cotobl = substr(cotobl,1,strlen(cotobl)-3);
    EXECUTE PROCEDURE CEROS_ANCHO_FIJO (:cotobl, 9, 'N') RETURNING_VALUES (:cotobl);
    Datos = :datos || :cotobl;
    Datos = :datos || '000000000';
    Datos = :datos || '               ';
    Datos = :datos || '000000000';
    Datos = :datos || '               ';
    Datos = :datos || '000000000';
    porcapor2 = '0.25';
    EXECUTE PROCEDURE CEROS_ANCHO_FIJO (:porcapor2, 9, 'N') RETURNING_VALUES (:porcapor2);
    Datos = :datos || :porcapor2;
    Datos = :datos || '000000000';
    select P.pade_cotobl from pago_aportes_detalle P WHERE P.terc_nit = :nitempl AND P.pade_tipap = 'ARP' and p.pgap_id = :iddoc INTO :cotobl;
    cotobl = substr(cotobl,1,strlen(cotobl)-3);
    EXECUTE PROCEDURE CEROS_ANCHO_FIJO (:cotobl, 9, 'N') RETURNING_VALUES (:cotobl);
    Datos = :datos || :cotobl;
    select P.paan_ccf from PARAMETROS_ANO P WHERE P.paan_ano = substr(:fecliq,1,4) INTO :porcapor;
    porcapor = substr(porcapor,1,strlen(porcapor)-2);
    EXECUTE PROCEDURE CEROS_ANCHO_FIJO (:porcapor, 7, 'N') RETURNING_VALUES (:porcapor);
    Datos = :datos || :porcapor;
    select (P.pade_cotobl)*4/9 from pago_aportes_detalle P WHERE P.terc_nit = :nitempl AND P.pade_tipap = 'CCF' and p.pgap_id = :iddoc INTO :cotobl;
    cotobl = substr(cotobl,1,strlen(cotobl)-3);
    EXECUTE PROCEDURE CEROS_ANCHO_FIJO (:cotobl, 9, 'N') RETURNING_VALUES (:cotobl);
    Datos = :datos || :cotobl;
    select P.paan_sena from PARAMETROS_ANO P WHERE P.paan_ano = substr(:fecliq,1,4) INTO :porcapor;
    porcapor = substr(porcapor,1,strlen(porcapor)-2);
    EXECUTE PROCEDURE CEROS_ANCHO_FIJO (:porcapor, 7, 'N') RETURNING_VALUES (:porcapor);
    Datos = :datos || :porcapor;
    select (P.pade_cotobl)*2/9 from pago_aportes_detalle P WHERE P.terc_nit = :nitempl AND P.pade_tipap = 'CCF' and p.pgap_id = :iddoc INTO :cotobl;
    cotobl = substr(cotobl,1,strlen(cotobl)-3);
    EXECUTE PROCEDURE CEROS_ANCHO_FIJO (:cotobl, 9, 'N') RETURNING_VALUES (:cotobl);
    Datos = :datos || :cotobl;
    select P.paan_icbf from PARAMETROS_ANO P WHERE P.paan_ano = substr(:fecliq,1,4) INTO :porcapor;
    porcapor = substr(porcapor,1,strlen(porcapor)-2);
    EXECUTE PROCEDURE CEROS_ANCHO_FIJO (:porcapor, 7, 'N') RETURNING_VALUES (:porcapor);
    Datos = :datos || :porcapor;
    select (P.pade_cotobl)*3/9 from pago_aportes_detalle P WHERE P.terc_nit = :nitempl AND P.pade_tipap = 'CCF' and p.pgap_id = :iddoc INTO :cotobl;
    cotobl = substr(cotobl,1,strlen(cotobl)-3);
    EXECUTE PROCEDURE CEROS_ANCHO_FIJO (:cotobl, 9, 'N') RETURNING_VALUES (:cotobl);
    Datos = :datos || :cotobl;
    Datos = :datos || '0000000';
    Datos = :datos || '000000000';
    Datos = :datos || '0000000';
    Datos = :datos || '000000000';
    SUSPEND;
    datos = '';
    cotobl = 0;
    END
datos = '';
secint = 0;
FOR SELECT a.admi_codafp, a.terc_nit,p.pgap_monto,p.pgap_item FROM administradora a, pago_aportes p
WHERE (p.pgap_admin = a.terc_nit) and p.pgap_id = :iddoc and a.admi_afp = 'S'
INTO :codadmin, :nitadmin, :cotobladm, :itemadm
DO
 BEGIN
  tipreg = '03';
  Datos = :datos || :tipreg;
  secint = secint + 1;
  EXECUTE PROCEDURE CEROS_ANCHO_FIJO (CAST(secint AS VARCHAR(200)), 5, 'N') RETURNING_VALUES (:sec);
  DATOS = DATOS || :SEC;
  EXECUTE PROCEDURE CEROS_ANCHO_FIJO (codadmin, 6, 'A') RETURNING_VALUES (:codadmin);
  DATOS = DATOS || :codadmin;
  EXECUTE PROCEDURE DV (nitadmin) RETURNING_VALUES (dvcia);
  EXECUTE PROCEDURE CEROS_ANCHO_FIJO (nitadmin, 16, 'A') RETURNING_VALUES (:nitadmin);
  DATOS = DATOS || :nitadmin;
  DATOS = :DATOS || :dvcia;
  SELECT sum(P.pade_cotobl) FROM PAGO_APORTES_DETALLE P WHERE P.pade_itemdet = :itemadm and p.pade_tipap = 'AFP' and p.pgap_id = :iddoc INTO :cotobladm;
  cotobladm = substr(cotobladm,1,strlen(cotobladm)-3);
  EXECUTE PROCEDURE CEROS_ANCHO_FIJO (cotobladm, 10, 'N') RETURNING_VALUES (:cotobladm);
  DATOS = DATOS || :cotobladm;
  DATOS = DATOS || '00000000000000000000000000000000000000000000000000000000000000000000000000';
  EXECUTE PROCEDURE CEROS_ANCHO_FIJO (cotobladm, 10, 'N') RETURNING_VALUES (:cotobladm);
  DATOS = DATOS || :cotobladm;
  SELECT COUNT(P.pgap_item) FROM PAGO_APORTES_DETALLE P WHERE P.pade_itemdet = :itemadm and p.pade_tipap = 'AFP' and p.pgap_id = :iddoc INTO :numempladm;
  EXECUTE PROCEDURE CEROS_ANCHO_FIJO (numempladm, 6, 'N') RETURNING_VALUES (:numempladm);
  DATOS = DATOS || :numempladm;
  if (cotobladm <> '0000000000') then
  suspend;
  datos = '';
 END
secint = 0;
FOR SELECT a.admi_codeps, a.terc_nit,p.pgap_item FROM administradora a, pago_aportes p
WHERE (p.pgap_admin = a.terc_nit) and p.pgap_id = :iddoc and a.admi_eps = 'S'
INTO :codadmin, :nitadmin, :itemadm
DO
 BEGIN
  tipreg = '04';
  Datos = :datos || :tipreg;
  secint = secint + 1;
  EXECUTE PROCEDURE CEROS_ANCHO_FIJO (CAST(secint AS VARCHAR(200)), 5, 'N') RETURNING_VALUES (:sec);
  DATOS = DATOS || :SEC;
  EXECUTE PROCEDURE CEROS_ANCHO_FIJO (codadmin, 6, 'A') RETURNING_VALUES (:codadmin);
  DATOS = DATOS || :codadmin;
  EXECUTE PROCEDURE DV (nitadmin) RETURNING_VALUES (dvcia);
  EXECUTE PROCEDURE CEROS_ANCHO_FIJO (nitadmin, 16, 'A') RETURNING_VALUES (:nitadmin);
  DATOS = DATOS || :nitadmin;
  DATOS = :DATOS || :dvcia;
  SELECT sum(P.pade_cotobl) FROM PAGO_APORTES_DETALLE P WHERE P.pade_itemdet = :itemadm and p.pade_tipap = 'EPS' and p.pgap_id = :iddoc INTO :cotobladm;
  cotobladm = substr(cotobladm,1,strlen(cotobladm)-3);
  EXECUTE PROCEDURE CEROS_ANCHO_FIJO (cotobladm, 10, 'N') RETURNING_VALUES (:cotobladm);
  DATOS = DATOS || :cotobladm;
  DATOS = DATOS || '0000000000               0000000000               0000000000';
  EXECUTE PROCEDURE CEROS_ANCHO_FIJO (cotobladm, 10, 'N') RETURNING_VALUES (:cotobladm);
  DATOS = DATOS || :cotobladm;
  DATOS = DATOS || '000000000000000000000000';
  EXECUTE PROCEDURE CEROS_ANCHO_FIJO (cotobladm, 10, 'N') RETURNING_VALUES (:cotobladm);
  DATOS = DATOS || :cotobladm;
  DATOS = DATOS || '0000000000000000000000000000000000000000';
  EXECUTE PROCEDURE CEROS_ANCHO_FIJO (cotobladm, 10, 'N') RETURNING_VALUES (:cotobladm);
  DATOS = DATOS || :cotobladm;
  DATOS = DATOS || '0000000000';
  EXECUTE PROCEDURE CEROS_ANCHO_FIJO (cotobladm, 10, 'N') RETURNING_VALUES (:cotobladm);
  DATOS = DATOS || :cotobladm;
  DATOS = DATOS || '0000000000';
  SELECT COUNT(P.pgap_item) FROM PAGO_APORTES_DETALLE P WHERE P.pade_itemdet = :itemadm and p.pade_tipap = 'EPS' and p.pgap_id = :iddoc INTO :numempladm;
  EXECUTE PROCEDURE CEROS_ANCHO_FIJO (numempladm, 6, 'N') RETURNING_VALUES (:numempladm);
  DATOS = DATOS || :numempladm;
  if (cotobladm <> '0000000000') then
  suspend;
  datos = '';
 END
secint = 0;
FOR SELECT a.admi_codarp, a.terc_nit,p.pgap_item FROM administradora a, pago_aportes p
WHERE (p.pgap_admin = a.terc_nit) and p.pgap_id = :iddoc and a.admi_arp = 'S'
INTO :codadmin, :nitadmin, :itemadm
DO
 BEGIN
  tipreg = '05';
  Datos = :datos || :tipreg;
  secint = secint + 1;
  EXECUTE PROCEDURE CEROS_ANCHO_FIJO (CAST(secint AS VARCHAR(200)), 5, 'N') RETURNING_VALUES (:sec);
  DATOS = DATOS || :SEC;
  EXECUTE PROCEDURE CEROS_ANCHO_FIJO (codadmin, 6, 'A') RETURNING_VALUES (:codadmin);
  DATOS = DATOS || :codadmin;
  EXECUTE PROCEDURE DV (nitadmin) RETURNING_VALUES (dvcia);
  EXECUTE PROCEDURE CEROS_ANCHO_FIJO (nitadmin, 16, 'A') RETURNING_VALUES (:nitadmin);
  DATOS = DATOS || :nitadmin;
  DATOS = :DATOS || :dvcia;
  SELECT sum(P.pade_cotobl) FROM PAGO_APORTES_DETALLE P WHERE P.pgap_item = :itemadm and p.pade_tipap = 'ARP' and p.pgap_id = :iddoc INTO :cotobladm;
  cotobladm = substr(cotobladm,1,strlen(cotobladm)-3);
  EXECUTE PROCEDURE CEROS_ANCHO_FIJO (cotobladm, 10, 'N') RETURNING_VALUES (:cotobladm);
  DATOS = DATOS || :cotobladm;
  DATOS = DATOS || '               00000000000000000000';
  EXECUTE PROCEDURE CEROS_ANCHO_FIJO (cotobladm, 10, 'N') RETURNING_VALUES (:cotobladm);
  DATOS = DATOS || :cotobladm;
  DATOS = DATOS || '00000000000000';
  EXECUTE PROCEDURE CEROS_ANCHO_FIJO (cotobladm, 10, 'N') RETURNING_VALUES (:cotobladm);
  DATOS = DATOS || :cotobladm;
  DATOS = DATOS || '00000000000000000000';
  EXECUTE PROCEDURE CEROS_ANCHO_FIJO (cotobladm, 10, 'N') RETURNING_VALUES (:cotobladm);
  DATOS = DATOS || :cotobladm;
  SELECT sum(P.pade_cotobl)/100 FROM PAGO_APORTES_DETALLE P WHERE P.pgap_item = :itemadm and p.pade_tipap = 'ARP' and p.pgap_id = :iddoc INTO :cotobladm;
  cotobladm = substr(cotobladm,1,strlen(cotobladm)-3);
  EXECUTE PROCEDURE CEROS_ANCHO_FIJO (cotobladm, 10, 'N') RETURNING_VALUES (:cotobladm);
  DATOS = DATOS || :cotobladm;
  SELECT COUNT(P.pgap_item) FROM PAGO_APORTES_DETALLE P WHERE P.pgap_item = :itemadm and p.pade_tipap = 'ARP' and p.pgap_id = :iddoc INTO :numempladm;
  EXECUTE PROCEDURE CEROS_ANCHO_FIJO (numempladm, 6, 'N') RETURNING_VALUES (:numempladm);
  DATOS = DATOS || :numempladm;
  if (cotobladm <> '0000000000') then
  suspend;
  datos = '';
 END
secint = 0;
FOR SELECT a.admi_codccf, a.terc_nit,p.pgap_item FROM administradora a, pago_aportes p
WHERE (p.pgap_admin = a.terc_nit) and p.pgap_id = :iddoc and a.admi_ccf = 'S'
INTO :codadmin, :nitadmin, :itemadm
DO
 BEGIN
  tipreg = '06';
  Datos = :datos || :tipreg;
  secint = secint + 1;
  EXECUTE PROCEDURE CEROS_ANCHO_FIJO (CAST(secint AS VARCHAR(200)), 5, 'N') RETURNING_VALUES (:sec);
  DATOS = DATOS || :SEC;
  EXECUTE PROCEDURE CEROS_ANCHO_FIJO (codadmin, 6, 'A') RETURNING_VALUES (:codadmin);
  DATOS = DATOS || :codadmin;
  EXECUTE PROCEDURE DV (nitadmin) RETURNING_VALUES (dvcia);
  EXECUTE PROCEDURE CEROS_ANCHO_FIJO (nitadmin, 16, 'A') RETURNING_VALUES (:nitadmin);
  DATOS = DATOS || :nitadmin;
  DATOS = :DATOS || :dvcia;
  SELECT sum(P.pade_cotobl)*4/9 FROM PAGO_APORTES_DETALLE P WHERE P.pgap_item = :itemadm and p.pade_tipap = 'CCF' and p.pgap_id = :iddoc INTO :cotobladm;
  cotobladm = substr(cotobladm,1,strlen(cotobladm)-3);
  EXECUTE PROCEDURE CEROS_ANCHO_FIJO (cotobladm, 10, 'N') RETURNING_VALUES (:cotobladm);
  DATOS = DATOS || :cotobladm;
  DATOS = DATOS || '00000000000000';
  EXECUTE PROCEDURE CEROS_ANCHO_FIJO (cotobladm, 10, 'N') RETURNING_VALUES (:cotobladm);
  DATOS = DATOS || :cotobladm;
  SELECT COUNT(P.pgap_item) FROM PAGO_APORTES_DETALLE P WHERE P.pgap_item = :itemadm and p.pade_tipap = 'CCF' and p.pgap_id = :iddoc INTO :numempladm;
  EXECUTE PROCEDURE CEROS_ANCHO_FIJO (numempladm, 6, 'N') RETURNING_VALUES (:numempladm);
  DATOS = DATOS || :numempladm;
  if (cotobladm <> '0000000000') then
  suspend;
  datos = '';
 END
secint = 0;
FOR SELECT a.admi_codccf, a.terc_nit,p.pgap_item FROM administradora a, pago_aportes p
WHERE (p.pgap_admin = a.terc_nit) and p.pgap_id = :iddoc and a.admi_ccf = 'S'
INTO :codadmin, :nitadmin, :itemadm
DO
 BEGIN
  tipreg = '07';
  Datos = :datos || :tipreg;
  secint = secint + 1;
  EXECUTE PROCEDURE CEROS_ANCHO_FIJO (CAST(secint AS VARCHAR(200)), 5, 'N') RETURNING_VALUES (:sec);
  DATOS = DATOS || :SEC;
  nitadmin = '899999034';
  EXECUTE PROCEDURE DV (nitadmin) RETURNING_VALUES (dvcia);
  EXECUTE PROCEDURE CEROS_ANCHO_FIJO (nitadmin, 16, 'A') RETURNING_VALUES (:nitadmin);
  DATOS = DATOS || :nitadmin;
  DATOS = :DATOS || :dvcia;
  SELECT sum(P.pade_cotobl)*2/9 FROM PAGO_APORTES_DETALLE P WHERE P.pgap_item = :itemadm and p.pade_tipap = 'CCF' and p.pgap_id = :iddoc INTO :cotobladm;
  cotobladm = substr(cotobladm,1,strlen(cotobladm)-3);
  EXECUTE PROCEDURE CEROS_ANCHO_FIJO (cotobladm, 10, 'N') RETURNING_VALUES (:cotobladm);
  DATOS = DATOS || :cotobladm;
  DATOS = DATOS || '00000000000000';
  EXECUTE PROCEDURE CEROS_ANCHO_FIJO (cotobladm, 10, 'N') RETURNING_VALUES (:cotobladm);
  DATOS = DATOS || :cotobladm;
  SELECT COUNT(P.pgap_item) FROM PAGO_APORTES_DETALLE P WHERE P.pgap_item = :itemadm and p.pade_tipap = 'CCF' and p.pgap_id = :iddoc INTO :numempladm;
  EXECUTE PROCEDURE CEROS_ANCHO_FIJO (numempladm, 6, 'N') RETURNING_VALUES (:numempladm);
  DATOS = DATOS || :numempladm;
  if (cotobladm <> '0000000000') then
  suspend;
  datos = '';
 END
secint = 0;
FOR SELECT a.admi_codccf, a.terc_nit,p.pgap_item FROM administradora a, pago_aportes p
WHERE (p.pgap_admin = a.terc_nit) and p.pgap_id = :iddoc and a.admi_ccf = 'S'
INTO :codadmin, :nitadmin, :itemadm
DO
 BEGIN
  tipreg = '08';
  Datos = :datos || :tipreg;
  secint = secint + 1;
  EXECUTE PROCEDURE CEROS_ANCHO_FIJO (CAST(secint AS VARCHAR(200)), 5, 'N') RETURNING_VALUES (:sec);
  DATOS = DATOS || :SEC;
  nitadmin = '800213277';
  EXECUTE PROCEDURE DV (nitadmin) RETURNING_VALUES (dvcia);
  EXECUTE PROCEDURE CEROS_ANCHO_FIJO (nitadmin, 16, 'A') RETURNING_VALUES (:nitadmin);
  DATOS = DATOS || :nitadmin;
  DATOS = :DATOS || :dvcia;
  SELECT sum(P.pade_cotobl)*3/9 FROM PAGO_APORTES_DETALLE P WHERE P.pgap_item = :itemadm and p.pade_tipap = 'CCF' and p.pgap_id = :iddoc INTO :cotobladm;
  cotobladm = substr(cotobladm,1,strlen(cotobladm)-3);
  EXECUTE PROCEDURE CEROS_ANCHO_FIJO (cotobladm, 10, 'N') RETURNING_VALUES (:cotobladm);
  DATOS = DATOS || :cotobladm;
  DATOS = DATOS || '00000000000000';
  EXECUTE PROCEDURE CEROS_ANCHO_FIJO (cotobladm, 10, 'N') RETURNING_VALUES (:cotobladm);
  DATOS = DATOS || :cotobladm;
  SELECT COUNT(P.pgap_item) FROM PAGO_APORTES_DETALLE P WHERE P.pgap_item = :itemadm and p.pade_tipap = 'CCF' and p.pgap_id = :iddoc INTO :numempladm;
  EXECUTE PROCEDURE CEROS_ANCHO_FIJO (numempladm, 6, 'N') RETURNING_VALUES (:numempladm);
  DATOS = DATOS || :numempladm;
  if (cotobladm <> '0000000000') then
  suspend;
  datos = '';
 END
 BEGIN
  tipreg = '11';
  Datos = :datos || :tipreg;
  secint = secint + 1;
  SELECT sum(P.pade_cotobl) FROM PAGO_APORTES_DETALLE P WHERE p.pade_tipap = 'AFP' and p.pgap_id = :iddoc INTO :cotobladm;
  cotobladm = substr(cotobladm,1,strlen(cotobladm)-3);
  EXECUTE PROCEDURE CEROS_ANCHO_FIJO (cotobladm, 10, 'N') RETURNING_VALUES (:cotobladm);
  DATOS = DATOS || :cotobladm;
  SELECT sum(P.pade_cotobl) FROM PAGO_APORTES_DETALLE P WHERE p.pade_tipap = 'EPS' and p.pgap_id = :iddoc INTO :cotobladm;
  cotobladm = substr(cotobladm,1,strlen(cotobladm)-3);
  EXECUTE PROCEDURE CEROS_ANCHO_FIJO (cotobladm, 10, 'N') RETURNING_VALUES (:cotobladm);
  DATOS = DATOS || :cotobladm;
  SELECT sum(P.pade_cotobl) FROM PAGO_APORTES_DETALLE P WHERE p.pade_tipap = 'ARP' and p.pgap_id = :iddoc INTO :cotobladm;
  cotobladm = substr(cotobladm,1,strlen(cotobladm)-3);
  EXECUTE PROCEDURE CEROS_ANCHO_FIJO (cotobladm, 10, 'N') RETURNING_VALUES (:cotobladm);
  DATOS = DATOS || :cotobladm;
  SELECT sum(P.pade_cotobl)*4/9 FROM PAGO_APORTES_DETALLE P WHERE p.pade_tipap = 'CCF' and p.pgap_id = :iddoc INTO :cotobladm;
  cotobladm = substr(cotobladm,1,strlen(cotobladm)-3);
  EXECUTE PROCEDURE CEROS_ANCHO_FIJO (cotobladm, 10, 'N') RETURNING_VALUES (:cotobladm);
  DATOS = DATOS || :cotobladm;
  SELECT sum(P.pade_cotobl)*2/9 FROM PAGO_APORTES_DETALLE P WHERE p.pade_tipap = 'CCF' and p.pgap_id = :iddoc INTO :cotobladm;
  cotobladm = substr(cotobladm,1,strlen(cotobladm)-3);
  EXECUTE PROCEDURE CEROS_ANCHO_FIJO (cotobladm, 10, 'N') RETURNING_VALUES (:cotobladm);
  DATOS = DATOS || :cotobladm;
  SELECT sum(P.pade_cotobl)*3/9 FROM PAGO_APORTES_DETALLE P WHERE p.pade_tipap = 'CCF' and p.pgap_id = :iddoc INTO :cotobladm;
  cotobladm = substr(cotobladm,1,strlen(cotobladm)-3);
  EXECUTE PROCEDURE CEROS_ANCHO_FIJO (cotobladm, 10, 'N') RETURNING_VALUES (:cotobladm);
  DATOS = DATOS || :cotobladm;
  DATOS = DATOS || '00000000000000000000';
  SELECT sum(P.pade_cotobl)*3/9 FROM PAGO_APORTES_DETALLE P WHERE p.pgap_id = :iddoc INTO :cotobladm;
  cotobladm = substr(cotobladm,1,strlen(cotobladm)-3);
  EXECUTE PROCEDURE CEROS_ANCHO_FIJO (cotobladm, 10, 'N') RETURNING_VALUES (:cotobladm);
  DATOS = DATOS || :cotobladm;
  SELECT COUNT(P.pgap_item) FROM PAGO_APORTES_DETALLE P WHERE p.pade_tipap = 'AFP' and p.pgap_id = :iddoc INTO :numempladm;
  EXECUTE PROCEDURE CEROS_ANCHO_FIJO (numempladm, 10, 'N') RETURNING_VALUES (:numempladm);
  DATOS = DATOS || :numempladm;
  SELECT COUNT(P.pgap_item) FROM PAGO_APORTES_DETALLE P WHERE p.pade_tipap = 'EPS' and p.pgap_id = :iddoc INTO :numempladm;
  EXECUTE PROCEDURE CEROS_ANCHO_FIJO (numempladm, 10, 'N') RETURNING_VALUES (:numempladm);
  DATOS = DATOS || :numempladm;
  SELECT COUNT(P.pgap_item) FROM PAGO_APORTES_DETALLE P WHERE p.pade_tipap = 'ARP' and p.pgap_id = :iddoc INTO :numempladm;
  EXECUTE PROCEDURE CEROS_ANCHO_FIJO (numempladm, 10, 'N') RETURNING_VALUES (:numempladm);
  DATOS = DATOS || :numempladm;
  SELECT COUNT(P.pgap_item) FROM PAGO_APORTES_DETALLE P WHERE p.pade_tipap = 'CCF' and p.pgap_id = :iddoc INTO :numempladm;
  EXECUTE PROCEDURE CEROS_ANCHO_FIJO (numempladm, 10, 'N') RETURNING_VALUES (:numempladm);
  DATOS = DATOS || :numempladm;
  suspend;
  datos = '';
 END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER PROCEDURE IMPR_PLANILLA_NOMINA (
    id integer,
    pago char(1),
    cta char(1),
    empl char(1),
    dpto varchar(20))
returns (
    fecha date,
    observaciones blob sub_type 0 segment size 80,
    pagoglobal char(1),
    periodo integer,
    ano char(4),
    periodicidad varchar(60),
    nitempl varchar(20),
    valor numeric(18,2),
    deduc char(1),
    nombreempl varchar(60),
    nomcortconc varchar(60),
    nombreconc varchar(60),
    codconc integer,
    prov char(1),
    totalempl numeric(18,2),
    totaldeduc numeric(18,2),
    totaldeveng numeric(18,2),
    numempl integer,
    ctaempl varchar(25),
    totalctas numeric(18,2),
    totalnomi numeric(18,2),
    totalapor numeric(18,2),
    nomper varchar(60),
    org integer,
    cargoempl varchar(60),
    deptoempl varchar(60),
    numcop integer,
    nombre_copia varchar(60),
    diaslab integer,
    salario numeric(18,2),
    beneficio char(1),
    base numeric(18,2),
    coddptoempl integer)
as
declare variable nitant varchar(20);
declare variable nitnue varchar(20);
declare variable numconc integer;
declare variable totalnomineg numeric(18,2);
declare variable totalaporneg numeric(18,2);
declare variable par integer;
declare variable impar integer;
declare variable antdeduc char(1);
declare variable nitdeduc varchar(20);
declare variable nittot varchar(20);
declare variable nitaux varchar(20);
BEGIN
 SELECT N.nuco_copia FROM NUMERO_COPIA N WHERE N.tido_cod = 92 AND N.nuco_id = :id INTO :NUMCOP;
 IF (numcop IS NULL) THEN
 BEGIN
  numcop = 0;
  INSERT INTO NUMERO_COPIA (TIDO_COD, NUCO_ID, NUCO_COPIA) VALUES (92,:id,:numcop);
 END
 ELSE
 BEGIN
  numcop = :numcop + 1;
  UPDATE numero_copia N SET N.nuco_copia = :numcop WHERE N.tido_cod = 92 AND N.nuco_id = :id;
 END
 SELECT N.noco_nombre FROM nombres_copias N WHERE N.noco_id = :numcop INTO :nombre_copia;
 numempl = 0;
 nitant = 0;
 nitnue = 0;
 IF (PAGO = 'N') THEN
 BEGIN
  FOR SELECT N.nomi_feccausa, N.nomi_obs, N.nomi_pagoglobal, N.nomi_periodo, N.nomi_ano, P.ppag_nombre, PN.pnom_nombre FROM NOMINA N, periodo_pago P, periodo_pago_nombre PN
  WHERE P.ppag_cod = N.nomi_periodocidad AND N.nomi_id = :ID AND PN.ppag_cod = N.nomi_periodocidad AND PN.ppag_periodo = N.nomi_periodo
  INTO :fecha, :observaciones, :pagoglobal, :periodo, :ano, :periodicidad, :NOMPER
  DO
  BEGIN
   FOR SELECT NC.terc_nit, NC.noco_valor, NC.noco_deduc, T.terc_nom, C.conc_nomcorto, C.conc_nombre, NC.conc_cod, NC.noco_prov, E.empl_cargo FROM NOMINA_CONCEPTOS NC, TERCEROS T, EMPLEADOS E, CONCEPTOS_NOMINA C
   WHERE NC.nomi_id = :ID AND T.terc_nit = E.terc_nit AND C.conc_cod = NC.conc_cod AND t.terc_nit = nc.terc_nit
   INTO :nitempl, :valor, :deduc, :nombreempl, :nomcortconc, :nombreconc, :codconc, :prov, :cargoempl
   DO
   BEGIN
    IF (valor IS NULL) THEN
    valor = 0;
    SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND TERC_NIT = :nitempl INTO :totalempl;
    SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND TERC_NIT = :nitempl AND NC.noco_deduc = 'S' INTO :totaldeduc;
    SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND TERC_NIT = :nitempl AND NC.noco_deduc = 'N' INTO :totaldeveng;
    SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id INTO :totalnomi;
    SELECT SUM(NC.noco_valor*-1) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_APORTE = 'S' AND NOCO_VALOR < 0 AND NOMI_ID = :id INTO :totalaporneg;
    SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_APORTE = 'S' AND NOCO_VALOR > 0 AND NOMI_ID = :id INTO :totalapor;
    totalapor = :totalapor + totalaporneg;
    SUSPEND;
   END
   nitempl = '';
   valor = NULL;
   deduc = '';
   nombreempl = NULL;
   nomcortconc = NULL;
   nombreconc = NULL;
   codconc = NULL;
   prov = NULL;
   FOR SELECT MAX(N.conc_cod) FROM NOMINA_CONCEPTOS N WHERE N.nomi_id = :id
   GROUP BY N.conc_cod
   INTO :codconc
   DO
   BEGIN
    SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC
    WHERE NC.nomi_id = :ID AND NC.conc_cod = :codconc
    GROUP BY NC.conc_cod
    INTO :valor;
    nitempl = '';
    nombreempl = '';
    deduc = 'N';
    prov = 'N';
    SELECT C.conc_nombre,C.conc_nomcorto FROM CONCEPTOS_NOMINA C WHERE C.conc_cod = :codconc INTO :nombreconc,:nomcortconc;
    SUSPEND;
   END
   IF (EMPL = 'N') THEN
   BEGIN
     deduc = 'N';
     nomcortconc = 'DIAS LAB.';
     nombreconc = 'DIAS LAB.';
     codconc = 0;
     prov = 'N';
     valor = NULL;
     nitempl = '';
     nombreempl = '';
     SUSPEND;
     deduc = 'N';
     nomcortconc = 'SDO BASE';
     nombreconc = 'SDO BASE';
     codconc = 0;
     prov = 'N';
     valor = NULL;
     nitempl = '';
     nombreempl = '';
     SUSPEND;
  END
     FOR SELECT ND.node_diaslab, ND.terc_nit, T.terc_nom FROM NOMINA_DETALLE ND, EMPLEADOS E, TERCEROS T WHERE NOMI_ID = :id AND ND.terc_nit = E.terc_nit AND T.terc_nit = ND.terc_nit
     INTO :diaslab, :nitaux, :nombreempl
     DO
     BEGIN
      SELECT FIRST 1  m.mvse_salario FROM MOVIMIENTO_SALARIO_EMPLEADO M WHERE M.terc_nit = :nitaux AND M.mvse_fecha <= :fecha ORDER BY M.mvse_fecha DESC INTO :salario;
      nitempl = :nitaux;
      nomcortconc = 'DIAS LAB.';
      valor = :diaslab;
      SUSPEND;
      nitempl = :nitaux;
      nomcortconc = 'SDO BASE';
      valor = :salario;
      SUSPEND;
     END
  END
 END
 ELSE
 IF (PAGO = 'S') THEN
 BEGIN
  par = 2;
  impar = 1;
  SELECT N.nomi_feccausa, N.nomi_obs, N.nomi_pagoglobal, N.nomi_periodo, N.nomi_ano, P.ppag_nombre, PN.pnom_nombre FROM NOMINA N, periodo_pago P, periodo_pago_nombre PN
  WHERE P.ppag_cod = N.nomi_periodocidad AND N.nomi_id = :ID AND PN.ppag_cod = N.nomi_periodocidad AND PN.ppag_periodo = N.nomi_periodo
  INTO :fecha, :observaciones, :pagoglobal, :periodo, :ano, :periodicidad, :NOMPER;
  IF (EMPL = 'N') THEN
  BEGIN
     deduc = 'N';
     nomcortconc = 'DIAS LAB.';
     nombreconc = 'DIAS LAB.';
     codconc = 0;
     prov = 'N';
     valor = NULL;
     nitempl = '';
     nombreempl = '';
     SUSPEND;
     deduc = 'N';
     nomcortconc = 'SDO BASE';
     nombreconc = 'SDO BASE';
     codconc = 0;
     prov = 'N';
     valor = NULL;
     nitempl = '';
     nombreempl = '';
     SUSPEND;
     deduc = 'N';
     nomcortconc = 'TOTAL DEV';
     nombreconc = 'TOTAL DEV';
     codconc = 9999;
     prov = 'N';
     valor = NULL;
     nitempl = '';
     nombreempl = '';
     SUSPEND;
     deduc = 'S';
     nomcortconc = 'TOTAL DEDUC';
     nombreconc = 'TOTAL DEDUC';
     codconc = 99999;
     prov = 'N';
     valor = NULL;
     nitempl = '';
     nombreempl = '';
     SUSPEND;
     deduc = 'S';
     nomcortconc = 'TOTAL EMPL';
     nombreconc = 'TOTAL EMPL';
     codconc = 999999;
     prov = 'N';
     valor = NULL;
     nitempl = '';
     nombreempl = '';
     SUSPEND;
  END
  BEGIN
    IF (EMPL = 'N') THEN
    BEGIN
     FOR SELECT MAX(N.conc_cod) FROM NOMINA_CONCEPTOS N WHERE N.nomi_id = :id AND N.noco_prov = 'N' AND N.noco_gtoempr = 'N'
     GROUP BY N.conc_cod
     INTO :codconc
     DO
     BEGIN
      SELECT NULL, MAX(NC.noco_deduc) FROM NOMINA_CONCEPTOS NC
      WHERE NC.nomi_id = :ID AND NC.conc_cod = :codconc
      GROUP BY NC.conc_cod
      INTO :valor, :deduc;
      valor = NULL;
      nitempl = '';
      nombreempl = '';
      prov = 'N';
      SELECT C.conc_nombre,C.conc_nomcorto FROM CONCEPTOS_NOMINA C WHERE C.conc_cod = :codconc INTO :nombreconc,:nomcortconc;
      SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id INTO :totalempl;
      SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND NC.noco_deduc = 'S' INTO :totaldeduc;
      SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND NC.noco_deduc = 'N' INTO :totaldeveng;
      SUSPEND;
     END
     FOR SELECT ND.node_diaslab,  ND.terc_nit, T.terc_nom FROM NOMINA_DETALLE ND, EMPLEADOS E, TERCEROS T WHERE NOMI_ID = :id AND ND.terc_nit = E.terc_nit AND T.terc_nit = ND.terc_nit
     INTO :diaslab, :nitaux, :nombreempl
     DO
     BEGIN
      SELECT FIRST 1  m.mvse_salario FROM MOVIMIENTO_SALARIO_EMPLEADO M WHERE M.terc_nit = :nitaux AND M.mvse_fecha <= :fecha ORDER BY M.mvse_fecha DESC INTO :salario;
      nitempl = :nitaux;
      nomcortconc = 'DIAS LAB.';
      valor = :diaslab;
      SUSPEND;
      nitempl = :nitaux;
      nomcortconc = 'SDO BASE';
      valor = :salario;
      SUSPEND;
     END
    END
   FOR SELECT NC.terc_nit, NC.noco_valor, NC.noco_deduc, T.terc_nom, C.conc_nomcorto, C.conc_nombre, NC.conc_cod, NC.noco_prov, E.empl_cargo, E.empl_cuenta, D.dpto_nombre, d.dpto_cod, ND.node_diaslab,NC.terc_nit, c.conc_benefic, NC.noco_base
   FROM NOMINA_CONCEPTOS NC, TERCEROS T, EMPLEADOS E, CONCEPTOS_NOMINA C, DEPARTAMENTO D, NOMINA_DETALLE ND
   WHERE NC.nomi_id = :ID AND T.terc_nit = E.terc_nit AND C.conc_cod = NC.conc_cod AND t.terc_nit = nc.terc_nit AND D.dpto_cod = E.empl_dpto AND NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N'
   AND ND.nomi_id = :id AND ND.terc_nit = E.terc_nit
   ORDER BY T.terc_nom
   INTO :nitempl, :valor, :deduc, :nombreempl, :nomcortconc, :nombreconc, :codconc, :prov, :cargoempl,:ctaempl,:deptoempl,:coddptoempl,:diaslab,:nitnue, :beneficio,:base
   DO
   BEGIN
    SELECT FIRST 1  m.mvse_salario FROM MOVIMIENTO_SALARIO_EMPLEADO M WHERE M.terc_nit = :nitempl AND M.mvse_fecha <= :FECHA ORDER BY M.mvse_fecha DESC INTO :salario;
    IF ((nitnue <> nitant) AND (nitnue IS NOT NULL)) THEN
     numempl = :numempl + 1;
    IF (valor IS NULL) THEN
    valor = 0;
    IF (nitempl <> nitdeduc) THEN
    BEGIN
     par = 2;
     impar = 1;
    END
    nitdeduc = :nitempl;
    IF (:deduc = 'S') THEN
    BEGIN
     antdeduc = 'S';
     org = :par;
     par = :par + 2;
    END
    ELSE
    BEGIN
     antdeduc = 'N';
     org = :impar;
     impar = :impar + 2;
    END
    SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND TERC_NIT = :nitempl INTO :totalempl;
    SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND TERC_NIT = :nitempl AND NC.noco_deduc = 'S' INTO :totaldeduc;
    SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND TERC_NIT = :nitempl AND NC.noco_deduc = 'N' INTO :totaldeveng;
    IF (cta = 'S') THEN
    BEGIN
     SELECT COUNT(CONC_COD) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND TERC_NIT = :nitempl INTO :numconc;
     totalempl = totalempl / :numconc;
     SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND TERC_NIT = :nitempl INTO :totalctas;
    END
    SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id INTO :totalnomi;
    SELECT SUM(NC.noco_valor*-1) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_APORTE = 'S' AND NOCO_VALOR < 0 AND NOMI_ID = :id INTO :totalaporneg;
    SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_APORTE = 'S' AND NOCO_VALOR > 0 AND NOMI_ID = :id INTO :totalapor;
    totalapor = :totalapor + totalaporneg;
   SUSPEND;
    IF ((nitnue <> nitant) AND (nitnue IS NOT NULL) AND (EMPL = 'N')) THEN
    BEGIN
     deduc = 'N';
     nomcortconc = 'TOTAL DEV';
     nombreconc = 'TOTAL DEV';
     codconc = 9999;
     prov = 'N';
     SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND NC.noco_deduc = 'N' AND NC.terc_nit = : nitempl INTO :VALOR;
     SUSPEND;
     deduc = 'S';
     nomcortconc = 'TOTAL DEDUC';
     nombreconc = 'TOTAL DEDUC';
     codconc = 99999;
     prov = 'N';
     SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND NC.noco_deduc = 'S' AND NC.terc_nit = :nitempl INTO :VALOR;
     SUSPEND;
     deduc = 'S';
     nomcortconc = 'TOTAL EMPL';
     nombreconc = 'TOTAL EMPL';
     codconc = 999999;
     prov = 'N';
     SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND NC.terc_nit = :nitempl INTO :VALOR;
     nitant = :nitnue;
     SUSPEND;
    END
   END
   numempl = :numempl + 1;
   IF ( EMPL = 'N') THEN
   BEGIN
    nitempl = '';
    valor = NULL;
    deduc = '';
    nombreempl = NULL;
    nomcortconc = NULL;
    nombreconc = NULL;
    codconc = NULL;
    prov = NULL;
    totalempl = NULL;
    ctaempl = NULL;
    IF (cta = 'N') THEN
    BEGIN
     FOR SELECT MAX(N.conc_cod) FROM NOMINA_CONCEPTOS N WHERE N.nomi_id = :id AND N.noco_prov = 'N' AND N.noco_gtoempr = 'N'
     GROUP BY N.conc_cod
     INTO :codconc
     DO
     BEGIN
     IF (dpto IS NOT NULL AND (DPTO <> '') ) THEN
     BEGIN
      SELECT SUM(NC.noco_valor), MAX(NC.noco_deduc) FROM NOMINA_CONCEPTOS NC, EMPLEADOS E, DEPARTAMENTO D
      WHERE NC.nomi_id = :ID AND NC.conc_cod = :codconc AND D.dpto_cod = E.empl_dpto AND NC.terc_nit = E.terc_nit AND d.dpto_cod = :dpto
      GROUP BY NC.conc_cod
      INTO :valor, :deduc;
      nitempl = '-';
      nombreempl = 'TOTAL';
      deptoempl = '-';
      prov = 'N';
      SELECT C.conc_nombre,C.conc_nomcorto FROM CONCEPTOS_NOMINA C WHERE C.conc_cod = :codconc INTO :nombreconc,:nomcortconc;
      SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC, EMPLEADOS E, DEPARTAMENTO D WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id  AND D.dpto_cod = E.empl_dpto AND NC.terc_nit = E.terc_nit INTO :totalempl;
      SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC, EMPLEADOS E, DEPARTAMENTO D WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND NC.noco_deduc = 'S'  AND D.dpto_cod = E.empl_dpto AND NC.terc_nit = E.terc_nit INTO :totaldeduc;
      SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC, EMPLEADOS E, DEPARTAMENTO D WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND NC.noco_deduc = 'N'  AND D.dpto_cod = E.empl_dpto AND NC.terc_nit = E.terc_nit INTO :totaldeveng;
     END
     ELSE
     BEGIN
      SELECT SUM(NC.noco_valor), MAX(NC.noco_deduc) FROM NOMINA_CONCEPTOS NC
      WHERE NC.nomi_id = :ID AND NC.conc_cod = :codconc
      GROUP BY NC.conc_cod
      INTO :valor, :deduc;
      nitempl = '-';
      nombreempl = 'TOTAL';
      deptoempl = '-';
      prov = 'N';
      SELECT C.conc_nombre,C.conc_nomcorto FROM CONCEPTOS_NOMINA C WHERE C.conc_cod = :codconc INTO :nombreconc,:nomcortconc;
      SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id INTO :totalempl;
      SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND NC.noco_deduc = 'S' INTO :totaldeduc;
      SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND NC.noco_deduc = 'N' INTO :totaldeveng;
     END
      SUSPEND;
     END
     IF (dpto IS NOT NULL AND (DPTO <> '') ) THEN
     BEGIN
     deduc = 'N';
     nomcortconc = 'TOTAL DEV';
     nombreconc = 'TOTAL DEV';
     codconc = 9999;
     deptoempl = '-';
     prov = 'N';
     SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC, EMPLEADOS E, DEPARTAMENTO D WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id  AND D.dpto_cod = E.empl_dpto AND NC.terc_nit = E.terc_nit AND d.dpto_cod = :dpto INTO :VALOR;
     nitempl = '-';
     nombreempl = 'TOTAL';
     SUSPEND;
     deduc = 'S';
     nomcortconc = 'TOTAL DEDUC';
     nombreconc = 'TOTAL DEDUC';
     codconc = 99999;
     deptoempl = '-';
     prov = 'N';
     SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC, EMPLEADOS E, DEPARTAMENTO D WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND NC.noco_deduc = 'S'  AND D.dpto_cod = E.empl_dpto AND d.dpto_cod = :dpto AND NC.terc_nit = E.terc_nit INTO :VALOR;
     nitempl = '-';
     nombreempl = 'TOTAL';
     SUSPEND;
     deduc = 'S';
     nomcortconc = 'TOTAL EMPL';
     nombreconc = 'TOTAL EMPL';
     codconc = 999999;
     deptoempl = '-';
     prov = 'N';
     SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC, EMPLEADOS E, DEPARTAMENTO D WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND NC.noco_deduc = 'N'  AND D.dpto_cod = E.empl_dpto AND d.dpto_cod = :dpto AND NC.terc_nit = E.terc_nit INTO :VALOR;
     nitempl = '-';
     nombreempl = 'TOTAL';
     SUSPEND;
     END
     ELSE
     BEGIN
     deduc = 'N';
     nomcortconc = 'TOTAL DEV';
     nombreconc = 'TOTAL DEV';
     codconc = 9999;
     prov = 'N';
     SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND NC.noco_deduc = 'N' INTO :VALOR;
     nitempl = '-';
     nombreempl = 'TOTAL';
     SUSPEND;
     deduc = 'S';
     nomcortconc = 'TOTAL DEDUC';
     nombreconc = 'TOTAL DEDUC';
     codconc = 99999;
     prov = 'N';
     SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND NC.noco_deduc = 'S' INTO :VALOR;
     nitempl = '-';
     nombreempl = 'TOTAL';
     SUSPEND;
     deduc = 'S';
     nomcortconc = 'TOTAL EMPL';
     nombreconc = 'TOTAL EMPL';
     codconc = 999999;
     prov = 'N';
     SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N'  AND NOMI_ID = :id INTO :VALOR;
     nitempl = '-';
     nombreempl = 'TOTAL';
     SUSPEND;
     END
     END
   END
  END
 END
END
^

SET TERM ; ^


SET TERM ^ ;

CREATE TRIGGER EMPLEADOS_BD0 FOR EMPLEADOS
ACTIVE BEFORE DELETE POSITION 0
AS
begin
  DELETE FROM program_vacaciones WHERE TERC_NIT = OLD.terc_nit;
  DELETE FROM EMPLEADO_CONCEPTOS WHERE TERC_NIT = OLD.terc_nit;
end
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE NOVEDADESXPERIODO (
    ANO CHAR(4),
    PERIODO INTEGER,
    PERIODI INTEGER)
RETURNS (
    IDNONO INTEGER,
    NIT VARCHAR(20),
    NOMBRE VARCHAR(60),
    TIPONOVE VARCHAR(60),
    NUMPER INTEGER,
    DIA INTEGER,
    DURACION INTEGER,
    FECHANO DATE,
    VALOR NUMERIC(18,2))
AS
DECLARE VARIABLE CODNOVE CHAR(3);
DECLARE VARIABLE NUMPERI INTEGER;
DECLARE VARIABLE NUMPERIF INTEGER;
BEGIN
    FOR SELECT N.NONO_ID, terc_nit, tnov_cod, ND.nnde_periodo, ND.nnde_diaini, ND.nnde_duracion, nono_fecha, ND.nnde_valor
    FROM  nomina_novedades N, nomina_novedades_detalle ND WHERE
    nono_ppago = :PERIODI AND ND.nnde_periodo =: periodo AND ND.nnde_ano =: ano AND N.nono_id = ND.nono_id
    INTO :idnono, :nit, :codnove, :numper, :dia, :duracion, :fechano, :valor
    DO
    BEGIN
     SELECT terc_nom FROM terceros WHERE terc_nit = :nit INTO nombre;
     SELECT tnov_nombre FROM tipos_novedad WHERE tnov_cod = :codnove INTO tiponove;
     SUSPEND;
    END
END
^

SET TERM ; ^

DROP TRIGGER NOMINA_CONCEPTOS_AI0;
DROP PROCEDURE CAUSA_NOMINA;
DROP TABLE NOMINA_CARTERA_DETALLE;
DROP TABLE NOMINA_CARTERA;

CREATE TABLE NOMINA_CARTERA (
    NCAR_ID            INTEGER NOT NULL,
    NCAR_PERIODICIDAD  INTEGER,
    TERC_NIT           NIT,
    NCAR_ANO           ANO,
    NCAR_PERIODO       INTEGER,
    NCAR_MONTO         MONTO,
    NCAR_FECHA         DATE
);


CREATE TABLE NOMINA_CARTERA_DETALLE (
    NCAR_ID         T_ID NOT NULL,
    NCDE_ITEM       INTEGER NOT NULL,
    NCDE_TIPODOC    INTEGER,
    NCDE_IDDOC      T_ID,
    NCDE_PREFIJO    VARCHAR(4),
    NCDE_NUMERO     VARCHAR(6),
    NCDE_ABONO      T_MONTO,
    NCDE_RTFTE      T_MONTO,
    NCDE_RTIVA      T_MONTO,
    NCDE_RTICA      T_MONTO,
    NCDE_DTOF       T_MONTO,
    NCDE_ANULADO    T_BOOLEANO,
    NCDE_TRANSMIT   T_BOOLEANO,
    NCDE_COMIP      VARCHAR(2),
    NCDE_SUCURSAL   VARCHAR(10) NOT NULL,
    NCDE_DIFCAMBIO  T_MONTO,
    NCDE_OK         BOOLEANO
);




/******************************************************************************/
/***                              Primary Keys                              ***/
/******************************************************************************/

ALTER TABLE NOMINA_CARTERA ADD CONSTRAINT PK_NOMINA_CARTERA PRIMARY KEY (NCAR_ID);
ALTER TABLE NOMINA_CARTERA_DETALLE ADD CONSTRAINT PK_NOMINA_CARTERA_DETALLE PRIMARY KEY (NCAR_ID, NCDE_ITEM);
grant select, delete, insert, update on NOMINA_CARTERA to PUBLIC;
grant select, delete, insert, update on NOMINA_CARTERA_DETALLE to PUBLIC;

/******************************************************************************/
/***                              Foreign Keys                              ***/
/******************************************************************************/

ALTER TABLE NOMINA_CARTERA ADD CONSTRAINT FK_NOMINA_CARTERA_2 FOREIGN KEY (TERC_NIT) REFERENCES TERCEROS (TERC_NIT);
ALTER TABLE NOMINA_CARTERA_DETALLE ADD CONSTRAINT FK_NOMINA_CARTERADET FOREIGN KEY (NCAR_ID) REFERENCES NOMINA_CARTERA (NCAR_ID) ON DELETE CASCADE ON UPDATE CASCADE;

INSERT INTO CONCEPTOS_NOMINA (CONC_COD, CONC_NOMBRE, CONC_DEDUC, CONC_FECINI, CONC_FECFIN, CONC_PORC, CONC_BASE, CONC_ENTIDAD, CONC_MONTO, CONC_CTAGAST, CONC_DIAS, CONC_MODIFI, CONC_DIAPAGO, CONC_PROMEDIO, CONC_TODOSPER, CONC_PROV, CONC_PERACTUAL, CONC_APORTE, CONC_APLICAPROM, CONC_PERPROMEDIO, CONC_OTROCONC, CONC_CODOTROCONC, CONC_SALARIO, CONC_CTACXP, CONC_NOMCORTO, CONC_PERIODOS, CONC_GTOEMPR, CONC_CXP, CONC_CART, CONC_TOMSAL, CONC_BENEFIC, CONC_ORDEN) VALUES (954, 'CARTERA EMPLEADO', 'S', NULL, NULL, 0, 0, NULL, 0, NULL, 'N', 'S', NULL, 'N', 'S', 'N', 'N', 'N', 'N', NULL, 'N', NULL, 'N', NULL, 'Cartera', NULL, NULL, NULL, NULL, NULL, NULL, NULL);

SET TERM ^ ;

CREATE TRIGGER NOMINA_CONCEPTOS_AI0 FOR NOMINA_CONCEPTOS
ACTIVE AFTER INSERT POSITION 0
AS
declare variable OK CHAR(1);
begin
 SELECT N.nomi_liqok FROM NOMINA N WHERE N.nomi_id = NEW.nomi_id INTO :OK;
 if (NEW.conc_cod = 954 AND OK='S') then
  UPDATE NOMINA_CARTERA_DETALLE ND SET ND.ncde_ok ='S' WHERE ND.ncar_id IN(
  SELECT NC.ncar_id
  FROM NOMINA_CARTERA NC
  WHERE NC.ncar_periodo = NEW.noco_periodo
    AND NC.ncar_ano = NEW.noco_ano
    AND NC.terc_nit = NEW.terc_nit);
end
^

SET TERM ; ^

SET TERM ^ ;

/* Trigger: NOMINA_CARTERA_DETALLE_AD0 */
CREATE TRIGGER NOMINA_CARTERA_DETALLE_AD0 FOR NOMINA_CARTERA_DETALLE
ACTIVE AFTER DELETE POSITION 0
AS
DECLARE VARIABLE FEC DATE;
DECLARE VARIABLE OK CHAR(1);
DECLARE VARIABLE RCANTI INTEGER;
DECLARE VARIABLE ACUMULA CHAR(2);
DECLARE VARIABLE COBR INTEGER;
BEGIN
IF (OLD.NCAR_ID <> 0) THEN
    BEGIN
    EXECUTE PROCEDURE lee_configuracion('FACTURACION', 'FACTURAS', 'ACUMULAR PUNTOS DE VENTAS POR VENDEDOR') RETURNING_VALUES (ACUMULA);
    SELECT NCAR_fecha FROM nomina_cartera WHERE NCAR_id = OLD.NCAR_id INTO :FEC;
    OK = 'N';
    IF (OLD.ncde_anulado = 'N') THEN
     BEGIN
       IF (OK = 'N') THEN
        BEGIN
        UPDATE saldos_doc_cartera
            SET SDCA_ABONO = SDCA_ABONO - OLD.ncde_abono - OLD.ncde_DTOF,
            SDCA_ABRTFTE = SDCA_ABRTFTE - OLD.ncde_RTFTE,
            SDCA_ABRTIVA = SDCA_ABRTIVA - OLD.ncde_RTIVA,
            SDCA_ABRTICA = SDCA_ABRTICA - OLD.ncde_RTICA
            WHERE SDCA_TIPOREF = OLD.ncde_TIPODOC AND SDCA_IDREF = OLD.ncde_IDDOC AND SDCA_FECHA = :FEC;
        END
       UPDATE movimiento_clientes
        SET MVCL_MONTO = MVCL_MONTO - OLD.ncde_abono - OLD.ncde_DTOF,
        MVCL_RTEFTE = MVCL_RTEFTE - OLD.ncde_rtfte,
        MVCL_RTEIVA = MVCL_RTEIVA - OLD.ncde_rtiva,
        MVCL_RTEICA = MVCL_RTEICA - OLD.ncde_rtica
        WHERE MVCL_TIPOREF = 61 AND MVCL_IDREF = OLD.NCAR_ID AND MVCL_SUCURSAL = OLD.ncde_sucursal;
     END
    /* DESHAGA LOS PUNTOS DEL VENDEDOR */
    IF (acumula = 'SI') THEN
        DELETE FROM puntos_vendedor WHERE vend_cod = :cobr AND ptvt_tipodoc = OLD.ncde_tipodoc AND ptvt_iddoc = OLD.ncde_iddoc AND ptvt_fecha = :fec;
    END
END
^


/* Trigger: NOMINA_CARTERA_DETALLE_BI0 */
CREATE TRIGGER NOMINA_CARTERA_DETALLE_BI0 FOR NOMINA_CARTERA_DETALLE
ACTIVE BEFORE INSERT POSITION 0
AS
DECLARE VARIABLE NUMROWS INTEGER;
DECLARE VARIABLE PREGTASA CHAR(2);
DECLARE VARIABLE TRM NUMERIC(18,2);
DECLARE VARIABLE TRMDOC NUMERIC(18,2);
DECLARE VARIABLE FECREC DATE;
DECLARE VARIABLE FECDOC DATE;
BEGIN
IF (NEW.ncde_sucursal IS NULL) THEN
    NEW.ncde_sucursal = '01';
/* valide que la fecha no sea anterior al documento */
SELECT nc.ncar_fecha FROM nomina_cartera nc WHERE nc.ncar_id = NEW.ncar_id INTO :FECREC;
SELECT MVCL_FECHA FROM movimiento_clientes M WHERE M.mvcl_tiporef = NEW.ncde_tipodoc AND M.mvcl_idref = NEW.ncde_iddoc INTO :FECDOC;
IF (FECDOC > FECREC) THEN
    EXCEPTION fecha_anterior_documento 'EL RECIBO DE FECHA ' || :FECREC || ' INTENTA ABONAR UN DOCUMENTO DE FECHA ' || FECDOC;
if (NEW.ncde_ok IS NULL) then
  NEW.ncde_ok = 'N';
END
^


/* Trigger: NOMINA_CARTERA_DETALLE_BU0 */
CREATE TRIGGER NOMINA_CARTERA_DETALLE_BU0 FOR NOMINA_CARTERA_DETALLE
ACTIVE BEFORE UPDATE POSITION 0
AS
BEGIN
IF (NEW.ncde_sucursal IS NULL) THEN
    NEW.ncde_sucursal = '01';
END
^


SET TERM ; ^

SET TERM ^ ;

CREATE or ALTER PROCEDURE CAUSA_NOMINA (
    FEC DATE,
    PERIODO INTEGER,
    PERIODICIDAD INTEGER,
    PAGOGLOBAL CHAR(1),
    ANO CHAR(4),
    DEPTO INTEGER)
RETURNS (
    IDNOMINA INTEGER,
    ITEMINI INTEGER)
AS
DECLARE VARIABLE ITEM INTEGER;
DECLARE VARIABLE NITE VARCHAR(20) CHARACTER SET NONE;
DECLARE VARIABLE NIT_TERCERO VARCHAR(20);
DECLARE VARIABLE CONCEPT INTEGER;
DECLARE VARIABLE MONTOS NUMERIC(18,2);
DECLARE VARIABLE PORCEN NUMERIC(9,4);
DECLARE VARIABLE ENTIDAD VARCHAR(20);
DECLARE VARIABLE CONC_COD INTEGER;
DECLARE VARIABLE CONC_DEDUC CHAR(1);
DECLARE VARIABLE CONC_PORC NUMERIC(9,4);
DECLARE VARIABLE CONC_ENTIDAD INTEGER;
DECLARE VARIABLE CONC_MONTO NUMERIC(18,2);
DECLARE VARIABLE CONC_MODIFI CHAR(1);
DECLARE VARIABLE CONC_PROMEDIO CHAR(1);
DECLARE VARIABLE EMCO_PERPROM INTEGER;
DECLARE VARIABLE VALOR NUMERIC(18,2);
DECLARE VARIABLE DIASLAB INTEGER;
DECLARE VARIABLE CONC_PROV CHAR(1);
DECLARE VARIABLE CONC_APORTE CHAR(1);
DECLARE VARIABLE NUMEROPROM INTEGER;
DECLARE VARIABLE CONC_APLICAPROM CHAR(1);
DECLARE VARIABLE PERINICIAL INTEGER;
DECLARE VARIABLE ANOPROM INTEGER;
DECLARE VARIABLE CONC_DIAS CHAR(1);
DECLARE VARIABLE CONC_OTROCONC CHAR(1);
DECLARE VARIABLE CONC_CODOTROCONC INTEGER;
DECLARE VARIABLE ANOSUM INTEGER;
DECLARE VARIABLE SALARIO CHAR(1) CHARACTER SET NONE;
DECLARE VARIABLE LIQUIDAPER INTEGER;
DECLARE VARIABLE RMOD NUMERIC(2,2);
DECLARE VARIABLE BASICO NUMERIC(18,2);
DECLARE VARIABLE NITEPS VARCHAR(20);
DECLARE VARIABLE NITAFC VARCHAR(20);
DECLARE VARIABLE NITAFP VARCHAR(20);
DECLARE VARIABLE NITCCF VARCHAR(20);
DECLARE VARIABLE GTOEMPR CHAR(1);
DECLARE VARIABLE COMISION NUMERIC(18,2);
DECLARE VARIABLE CAMBSALTRANS NUMERIC(18,2);
DECLARE VARIABLE SALDOSINI NUMERIC(18,2);
DECLARE VARIABLE DURANOV INTEGER;
DECLARE VARIABLE BASE NUMERIC(18,2);
DECLARE VARIABLE APROX INTEGER;
DECLARE VARIABLE MENSUAL CHAR(1);
DECLARE VARIABLE HORASEX NUMERIC(18,2);
DECLARE VARIABLE DIASNOV INTEGER;
DECLARE VARIABLE TOMASAL INTEGER;
DECLARE VARIABLE RETROACT NUMERIC(18,2);
DECLARE VARIABLE REEMBOLSO NUMERIC(18,2);
DECLARE VARIABLE INCAP NUMERIC(18,2);
DECLARE VARIABLE DEPTOEMPL INTEGER;
DECLARE VARIABLE AUXTRANS NUMERIC(18,2);
DECLARE VARIABLE SMLV NUMERIC(18,2);
DECLARE VARIABLE BENEFICIOS NUMERIC(18,2);
DECLARE VARIABLE CONFIRMADO CHAR(1);
DECLARE VARIABLE RECNOCT NUMERIC(18,2);
DECLARE VARIABLE RECFEST NUMERIC(18,2);
DECLARE VARIABLE TAR_RECNOTC NUMERIC(9,4);
DECLARE VARIABLE TAR_RECFEST NUMERIC(9,4);
DECLARE VARIABLE RECARGO NUMERIC(18,2);
DECLARE VARIABLE BASICOREC NUMERIC(18,2);
DECLARE VARIABLE PARAMBENEF CHAR(2);
DECLARE VARIABLE VACACDISF NUMERIC(18,2);
DECLARE VARIABLE VALORPREDET NUMERIC(18,2);
BEGIN
 SELECT N.NOMI_ID, N.nomi_liqok FROM NOMINA N WHERE N.nomi_periodo = :periodo AND N.nomi_periodocidad = :periodicidad AND N.nomi_ano = :ano
 INTO :IDNOMINA, :CONFIRMADO;
 IF (:idnomina IS NULL) THEN
 BEGIN
  EXECUTE PROCEDURE cambie_id_nomina RETURNING_VALUES(:idnomina);
  INSERT INTO nomina (nomi_id, NOMI_FECCAUSA, NOMI_PAGOGLOBAL, NOMI_PERIODOCIDAD, NOMI_PERIODO, NOMI_ANO, NOMI_LIQOK)
  VALUES (:IDNOMINA, :fec,:pagoglobal, :periodicidad, :periodo, :ano, 'N');
  item = 1;
 END
 ELSE
 BEGIN
  SELECT MAX(N.noco_item) FROM NOMINA_CONCEPTOS N WHERE N.nomi_id = :idnomina
  INTO :item;
 END
 if ((confirmado = 'S') AND (idnomina IS NOT NULL)) then
 BEGIN
  idnomina = 0;
 END
 else
 begin
 IF (DEPTO = 0) THEN
  INSERT INTO NOMINA_DEPARTAMENTO (nomi_id, nodp_depto)VALUES(:IDNOMINA,0);
 ELSE
  INSERT INTO NOMINA_DEPARTAMENTO (nomi_id, nodp_depto)VALUES(:IDNOMINA,:DEPTO);
 ITEMINI = ITEM;
 FOR SELECT E.TERC_NIT, e.empl_eps, e.empl_afc, e.empl_afp, e.empl_ccf, e.empl_dpto
 FROM EMPLEADOS E
 WHERE E.empl_ppago = :periodicidad AND ((E.empl_fecret IS NULL) OR (E.empl_fecret > :fec)) AND E.empl_fecing <= :fec
 INTO :nite, :niteps, :nitafc, :nitafp, :nitccf, :deptoempl
 DO
 BEGIN
 SELECT FIRST 1  m.mvse_salario FROM MOVIMIENTO_SALARIO_EMPLEADO M WHERE M.terc_nit = :nite AND M.mvse_fecha <= :fec ORDER BY M.mvse_fecha DESC into :basico;
 IF ((depto = 0) OR (deptoempl = :depto)) THEN
 BEGIN
  FOR SELECT CE.TERC_NIT, CE.CONC_COD, CE.EMCO_MONTO, CE.EMCO_PORC, ce.empl_entidad, CE.emco_perprom, CE.emco_luquidaper, CE.emco_mensual, CN.CONC_COD, CN.CONC_DEDUC,CN.CONC_PORC, CN.CONC_ENTIDAD, CN.CONC_MONTO,  CN.CONC_DIAS, CN.CONC_MODIFI,
  CN.CONC_PROMEDIO, CN.conc_salario, CE.emco_perprom, CN.conc_prov, CN.conc_aporte, CN.conc_aplicaprom, cn.conc_otroconc, cn.conc_codotroconc, CN.conc_gtoempr, CN.conc_base, CE.emco_tomsal
  FROM empleado_conceptos CE, CONCEPTOS_NOMINA CN WHERE (CE.CONC_COD = CN.CONC_COD) AND (CE.terc_nit = :nite) AND
  (((CE.emco_fecini <= :fec AND CE.emco_fecfin >= :FEC)) OR
  ((cn.conc_todosper = 'N') AND (CE.emco_ppago = :periodo)) OR (cn.conc_todosper = 'S'))  ORDER BY (TERC_NIT )
  INTO :nit_tercero, :concept,  :montos, :porcen, :entidad, :numeroprom, :liquidaper, :mensual ,:CONC_COD, :CONC_DEDUC, :CONC_PORC,
  :CONC_ENTIDAD, :CONC_MONTO, :CONC_DIAS, :CONC_MODIFI,:CONC_PROMEDIO, :salario,:EMCO_PERPROM, :conc_prov, :conc_aporte , :CONC_APLICAPROM, :conc_otroconc, :conc_codotroconc, :gtoempr, :base, :tomasal
  DO
  BEGIN
   IF (conc_dias = 'S') THEN
    EXECUTE PROCEDURE DIAS_LABORADOS (:nite, :periodo, :fec, :mensual,:conc_aporte) RETURNING_VALUES (:diaslab);
   ELSE
    diaslab = 15;
/*   IF (mensual = 'S') THEN
   BEGIN
    diaslab = 30;
   END
*/   IF (:tomasal <> 0) THEN
   BEGIN
    IF ((:periodicidad = 2) AND (:tomasal <> 2)) THEN
    BEGIN
     IF ((periodo = 2) OR (periodo = 4) OR (periodo = 6) OR (periodo = 8) OR (periodo = 10) OR (periodo = 12)
     OR (periodo = 14) OR (periodo = 16) OR (periodo = 18) OR (periodo = 20) OR (periodo = 22) OR (periodo = 24)) THEN
     basico = 0;
    END
    ELSE
    IF ((:periodicidad = 3) AND (:tomasal <> 1)) THEN
    BEGIN
     IF ((periodo = 1) OR (periodo = 5) OR (periodo = 9) OR (periodo = 13) OR (periodo = 17) OR (periodo = 21)
     OR (periodo = 25) OR (periodo = 29) OR (periodo = 33) OR (periodo = 37) OR (periodo = 41) OR (periodo = 45)
     OR (periodo = 49)) THEN
     basico = 0;
    END
    ELSE
     IF ((:periodicidad = 3) AND (:tomasal <> 2)) THEN
     BEGIN
      IF ((periodo = 2) OR (periodo = 6) OR (periodo = 10) OR (periodo = 14) OR (periodo = 18) OR (periodo = 22)
      OR (periodo = 26) OR (periodo = 30) OR (periodo = 34) OR (periodo = 38) OR (periodo = 42) OR (periodo = 46)
      OR (periodo = 50)) THEN
      basico = 0;
     END
     ELSE
     IF ((:periodicidad = 3) AND (:tomasal <> 3)) THEN
     BEGIN
      IF ((periodo = 3) OR (periodo = 7) OR (periodo = 11) OR (periodo = 15) OR (periodo = 19) OR (periodo = 23)
      OR (periodo = 27) OR (periodo = 31) OR (periodo = 35) OR (periodo = 39) OR (periodo = 43) OR (periodo = 47)
      OR (periodo = 51)) THEN
      basico = 0;
     END
     ELSE
     IF ((:periodicidad = 3) AND (:tomasal <> 4)) THEN
     BEGIN
      IF ((periodo = 4) OR (periodo = 8) OR (periodo = 12) OR (periodo = 16) OR (periodo = 20) OR (periodo = 24)
      OR (periodo = 29) OR (periodo = 32) OR (periodo = 36) OR (periodo = 40) OR (periodo = 44) OR (periodo = 48)
      OR (periodo = 52)) THEN
      basico = 0;
     END
   END
   ELSE
    BEGIN
     SELECT FIRST 1  m.mvse_salario FROM MOVIMIENTO_SALARIO_EMPLEADO M WHERE M.terc_nit = :nite AND M.mvse_fecha <= :fec ORDER BY M.mvse_fecha DESC INTO :basico;
    END
    valorpredet = NULL;
    SELECT VP.nvpr_monto FROM NOMINA_VALOR_PREDET VP WHERE VP.nvpr_periodicidad = :periodicidad AND VP.nvpr_periodo = :periodo AND VP.nvpr_ano = :ano AND vp.conc_cod = :conc_cod AND vp.terc_nit = :nite
    INTO :valorpredet;
    IF ((:valorpredet <> 0) AND (valorpredet IS NOT NULL)) THEN
     valor = valorpredet;
    ELSE
    BEGIN
    SELECT ((n.nono_valor /30) * n.nono_dura), (n.nono_dura) FROM nomina_novedades n WHERE n.tnov_cod = 11 AND n.terc_nit = :nite AND n.nono_periodo = :periodo INTO :cambsaltrans, :duranov;
    IF (cambsaltrans IS NULL) THEN
    cambsaltrans = 0;
    IF (duranov IS NULL) THEN
    duranov = 0;
    diaslab = :diaslab - :duranov;
    IF (conc_cod = 922) THEN
    BEGIN
     SELECT SUM(P.prcu_monto) FROM prestamo_cuotas P, prestamo_nomina PN WHERE P.prcu_ano = :ano AND P.prcu_periodo = :periodo AND PN.prno_id = P.prno_id AND PN.terc_nit = :nite INTO :valor;
     IF (valor IS NULL) THEN
     valor = 0;
     item = :item + 1;
     UPDATE prestamo_cuotas  P SET prcu_ok = 'S' WHERE P.prcu_ano = :ano AND P.prcu_periodo = :periodo AND P.prno_id = (SELECT PN.prno_id FROM PRESTAMO_NOMINA PN WHERE PN.terc_nit = :nite);
    END
    ELSE
    IF ((:montos = 0) OR (:montos IS NULL)) THEN
    BEGIN
     IF ((CONC_PORC = 0 AND :porcen = 0) OR (CONC_PORC IS NULL AND :porcen = 0) OR (CONC_PORC = 0 AND :porcen IS NULL) OR (CONC_PORC IS NULL AND :porcen IS NULL) ) THEN
     BEGIN
      IF ((conc_monto <> 0) AND (conc_monto IS NOT NULL) ) THEN
      BEGIN
       VALOR = :CONC_MONTO;
       IF (:conc_dias = 'S') THEN
       valor = (:valor / 30) * :diaslab;
      END
      ELSE
      IF (salario = 'S' AND CONC_COD <> 900 AND CONC_COD <> 920 and conc_cod <> 932 AND CONC_COD <> 953) THEN
      BEGIN
       SELECT FIRST 1  m.mvse_salario FROM MOVIMIENTO_SALARIO_EMPLEADO M WHERE M.terc_nit = :nite AND M.mvse_fecha <= :fec ORDER BY M.mvse_fecha DESC INTO :basico;
       SELECT N.noex_recnoct, N.noex_recfest
       FROM NOMINA_HORASEXT N WHERE N.noex_periodio = :periodo AND N.noex_ano = :ano AND N.terc_nit = :nite
       INTO :recnoct, :recfest;
       if (recnoct is null) then
        recnoct = 0;
       if (recfest is null) then
        recfest = 0;
       SELECT P.paan_recnoc, P.paan_recfest FROM PARAMETROS_ANO P WHERE P.paan_ano = :ano INTO :tar_recnotc, :tar_recfest;
       basico = ((:basico/30)*:diaslab) - (((:basico/30)/8)*:recnoct);
       basico = :basico - (((:basico/30)/8)*:recfest);
       conc_monto = :basico;
       VALOR = (:conc_monto/*/30 * :diaslab*/ ) + :cambsaltrans;
      END
      ELSE
      BEGIN
       valor = montos;
       IF (:conc_dias = 'S') THEN
       valor = (:valor / 30) * :diaslab;
      END
     END
     ELSE
     BEGIN
      IF (:porcen <> 0) THEN
      BEGIN
       IF ((conc_monto <> 0) AND (conc_monto IS NOT NULL) ) THEN
       BEGIN
        VALOR = ((:CONC_MONTO ) * :PORCEN) /100;
       END
      END
      ELSE
      BEGIN
       IF ((conc_monto <> 0) AND (conc_monto IS NOT NULL) ) THEN
       BEGIN
        VALOR = ((:CONC_MONTO) * :conc_porc) /100;
       END
       ELSE
       IF (salario = 'S' AND CONC_COD <> 900 AND CONC_COD <> 920 and conc_cod <> 932 AND CONC_COD <> 953) THEN
       BEGIN
       SELECT FIRST 1  m.mvse_salario FROM MOVIMIENTO_SALARIO_EMPLEADO M WHERE M.terc_nit = :nite AND M.mvse_fecha <= :FEC ORDER BY M.mvse_fecha DESC INTO :basico;
       SELECT N.noex_recnoct, N.noex_recfest
       FROM NOMINA_HORASEXT N WHERE N.noex_periodio = :periodo AND N.noex_ano = :ano AND N.terc_nit = :nite
       INTO :recnoct, :recfest;
       if (recnoct is null) then
        recnoct = 0;
       if (recfest is null) then
        recfest = 0;
       SELECT P.paan_recnoc, P.paan_recfest FROM PARAMETROS_ANO P WHERE P.paan_ano = :ano INTO :tar_recnotc, :tar_recfest;
       basico = ((:basico/30)*:diaslab) - (((:basico/30)/8)*:recnoct);
       basico = :basico - (((:basico/30)/8)*:recfest);
        conc_monto = :basico;
        VALOR = ((:CONC_MONTO)+ :cambsaltrans * :conc_porc) /100;
       END
       ELSE
       IF (:conc_monto = 0 AND :montos = 0) THEN
       BEGIN
        conc_monto = :basico;
        VALOR = (((:CONC_MONTO / 30) * :diaslab) + :cambsaltrans * :conc_porc) /100;
       END
      END
     END
    END
    ELSE
    IF ((CONC_PORC = 0 OR (conc_porc IS NULL)) AND (:porcen = 0 OR (porcen IS NULL))) THEN
    BEGIN
     VALOR = (:montos);
     IF (:conc_dias = 'S') THEN
     valor = (:valor / 30) * :diaslab;
    END
    ELSE
    IF (:porcen <> 0 AND porcen IS NOT NULL) THEN
    BEGIN
     VALOR = ((:MONTOS ) * :PORCEN) /100;
    END
    ELSE
    BEGIN
     VALOR = ((:montos) * :CONC_PORC) /100;
    END
    IF (conc_promedio = 'S') THEN
    BEGIN
     perinicial = :periodo - (:numeroprom) + 1;
     anoprom = CAST (ano AS INTEGER);
     IF (perinicial <= 0) THEN
     BEGIN
      perinicial = 1;
      anoprom = CAST(ANO AS INTEGER) - 1;
     END
     SELECT SUM (noco_valor) FROM nomina_conceptos n WHERE n.noco_aplicaprom = 'S' AND N.noco_periodo >= :perinicial - 1 AND N.noco_periodo < :periodo AND N.noco_ano >= :anoprom AND N.noco_ano <= :ano AND terc_nit = :nite INTO :valor;
     valor = ((valor ) / (numeroprom -1 ));
     SELECT NOCO_VALOR FROM NOMINA_CONCEPTOS WHERE CONC_COD = :conc_cod AND TERC_NIT  = :nite AND NOCO_PAGOOK = 'N' AND NOCO_PERIODO = 0 INTO :saldosini;
     IF (saldosini IS NULL) THEN
     saldosini = 0;
     ELSE
     UPDATE nomina_conceptos N SET noco_pagook = 'S' WHERE n.noco_aplicaprom = 'S' AND N.noco_periodo >= :perinicial - 1 AND N.noco_periodo < :periodo AND N.noco_ano >= :anoprom AND N.noco_ano <= :ano  AND CONC_COD = :conc_cod AND terc_nit = :nite AND NOCO_PERIODO = 0;
     VALOR = :valor + :saldosini;
     UPDATE nomina_conceptos N SET noco_pagook = 'S' WHERE n.noco_aplicaprom = 'S' AND N.noco_periodo >= :perinicial - 1 AND N.noco_periodo < :periodo AND N.noco_ano >= :anoprom AND N.noco_ano <= :ano  AND CONC_COD = :conc_cod AND terc_nit = :nite;
    END
    ELSE
    IF (conc_otroconc = 'S') THEN
    BEGIN
     anosum = CAST(ano AS INTEGER);
     anosum = anosum - 1;
     SELECT SUM (noco_valor) FROM nomina_conceptos n WHERE n.noco_ano = :anosum AND n.conc_cod = :conc_codotroconc AND N.terc_nit = :nite INTO :valor;
     SELECT NOCO_VALOR FROM NOMINA_CONCEPTOS WHERE noco_ano = :anosum AND conc_cod = :conc_codotroconc AND terc_nit = :nite AND NOCO_PERIODO = 0 INTO :saldosini;
     IF (saldosini IS NULL) THEN
     saldosini = 0;
     ELSE
     UPDATE nomina_conceptos SET noco_pagook = 'S' WHERE noco_ano = :anosum AND conc_cod = :conc_codotroconc AND NOCO_PERIODO = 0 AND terc_nit = :nite;
     VALOR = :valor + :saldosini;
     UPDATE nomina_conceptos SET noco_pagook = 'S' WHERE noco_ano = :anosum AND conc_cod = :conc_codotroconc AND terc_nit = :nite;
    END
    ELSE
    IF (conc_aporte = 'S') THEN
    BEGIN
     horasex = NULL;
     diasnov = NULL;
     retroact = NULL;
     reembolso = NULL;
     beneficios = null;
     recargo = null;
     comision = null;
     incap = null;
     vacacdisf = null;
     IF ((:entidad = '' ) OR (entidad IS NULL)) THEN
     BEGIN
      /*COMISIONES*/
      SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
      IF (comision IS NULL) THEN
      comision = 0;
      /*RETROACTIVO*/
      SELECT C.emco_monto FROM EMPLEADO_CONCEPTOS C WHERE C.terc_nit = :nite AND C.conc_cod = 933 INTO :retroact;
      IF (retroact IS NULL ) THEN
      retroact = 0;
      /*REEMBOLSO*/
      SELECT C.emco_monto FROM EMPLEADO_CONCEPTOS C WHERE C.terc_nit = :nite AND C.conc_cod = 952 INTO :reembolso;
      IF (reembolso IS NULL ) THEN
      reembolso = 0;
      /*VACACIONES DISFRUTADAS ANTERIORMENTE*/
      SELECT C.emco_monto FROM EMPLEADO_CONCEPTOS C WHERE C.terc_nit = :nite AND C.conc_cod = 955 INTO :vacacdisf;
      IF (vacacdisf IS NULL ) THEN
      vacacdisf = 0;
      /*INCAPACIDAD*/
      SELECT N.nono_dura FROM NOMINA_NOVEDADES N WHERE N.terc_nit = :nite AND N.nono_periodo = :periodo AND N.nono_ano = :ano AND (N.tnov_cod = 2 OR (N.tnov_cod = 3)) INTO :diasnov;
      IF (:diasnov IS NULL) THEN
      incap = 0;
      ELSE
      incap = (:basico / 30)* :diasnov;
      /*BASICO*/
      SELECT N.noex_recnoct, N.noex_recfest
      FROM NOMINA_HORASEXT N WHERE N.noex_periodio = :periodo AND N.noex_ano = :ano AND N.terc_nit = :nite
      INTO :recnoct, :recfest;
      if (recnoct is null) then
       recnoct = 0;
      if (recfest is null) then
       recfest = 0;
      SELECT P.paan_recnoc, P.paan_recfest FROM PARAMETROS_ANO P WHERE P.paan_ano = :ano INTO :tar_recnotc, :tar_recfest;
      basico = ((:basico/30)*:diaslab) - (((:basico/30)/8)*:recnoct);
      basico = :basico - (((:basico/30)/8)*:recfest);
      /*HORAS EXTRA*/
      SELECT c.noex_monto FROM nomina_horasext c WHERE c.noex_ano = :ano AND c.noex_periodio = :periodo AND c.noex_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :horasex;
      if (horasex is null) then
       horasex = 0;
      /*RECARGOS*/
      SELECT FIRST 1  m.mvse_salario FROM MOVIMIENTO_SALARIO_EMPLEADO M WHERE M.terc_nit = :nite AND M.mvse_fecha <= :FEC ORDER BY M.mvse_fecha DESC INTO :basicorec;
      SELECT N.noex_recnoct, N.noex_recfest
      FROM NOMINA_HORASEXT N WHERE N.noex_periodio = :periodo AND N.noex_ano = :ano AND N.terc_nit = :nite
      INTO :recnoct, :recfest;
      if (recnoct is null) then
       recnoct = 0;
      if (recfest is null) then
       recfest = 0;
      SELECT P.paan_recnoc, P.paan_recfest FROM PARAMETROS_ANO P WHERE P.paan_ano = :ano INTO :tar_recnotc, :tar_recfest;
      recargo = (((:basicorec/30)/8)*:tar_recnotc)*:recnoct;
      recargo = :recargo + ((((:basicorec/30)/8)*:tar_recfest)*:recfest);
      if (recargo is null) then
       recargo = 0;
      /*basico*/
      if (:basico + :comision + :horasex + :retroact+ :reembolso + :incap+ :cambsaltrans < ((:smlv/30)*:diaslab)) then
      basico = (:smlv/30)*:diaslab;
      /*SMLV Y AUX. TRANSPORTE*/
      SELECT P.paan_auxtr, P.paan_salminimo FROM PARAMETROS_ANO P WHERE P.paan_ano = :ano INTO :auxtrans, :smlv;
      /*BASE*/
      valor = :basico + :comision + :horasex + :retroact+ :reembolso + :incap + :recargo + :cambsaltrans + :vacacdisf;
      IF ((conc_cod = 904) OR (conc_cod = 905) OR (conc_cod = 906) or (conc_cod = 934) ) THEN
      BEGIN
       entidad = :nitafp;
       IF (conc_cod = 904) THEN
       BEGIN
        SELECT A.paan_afptr FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
        VALOR = ((:valor) * :PORCEN) /100;
       END
       ELSE
       IF ((conc_cod = 905) OR (conc_cod = 906) or (conc_cod = 934)) THEN
       BEGIN
        SELECT A.paan_afpem FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
        VALOR = ((:valor) * :PORCEN) /100;
       END
      END
      ELSE
      IF ((conc_cod = 907) OR (conc_cod = 914) OR (conc_cod = 915) or (conc_cod = 938) ) THEN
      BEGIN
       entidad = :niteps;
       IF (conc_cod = 907) THEN
       BEGIN
        SELECT A.paan_epstr FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
        VALOR = ((:valor) * :PORCEN) /100;
       END
       ELSE
       IF ((conc_cod = 914) OR (conc_cod = 915) or (conc_cod = 938)) THEN
       BEGIN
        SELECT A.paan_epsem FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
        VALOR = ((:valor) * :PORCEN) /100;
       END
      END
      ELSE
      IF ((conc_cod = 910) OR (conc_cod = 911) OR (conc_cod = 916) OR (conc_cod = 917) OR (conc_cod = 918) OR (conc_cod = 919) or (conc_cod = 936) or (conc_cod = 939) or (conc_cod = 940)) THEN
      BEGIN
       entidad = :nitccf;
       IF ((conc_cod = 910) OR (conc_cod = 911) or (conc_cod = 936)) THEN
       BEGIN
        SELECT A.paan_ccf FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
        VALOR = ((:valor) * :PORCEN) /100;
       END
       ELSE
       IF ((conc_cod = 916) OR (conc_cod = 917) or (conc_cod = 939)) THEN
       BEGIN
        SELECT A.paan_icbf FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
        VALOR = ((:valor) * :PORCEN) /100;
       END
       ELSE
       IF ((conc_cod = 918) OR (conc_cod = 919) or (conc_cod = 940)) THEN
       BEGIN
        SELECT A.paan_sena FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
        VALOR = ((:valor) * :PORCEN) /100;
       END
      END
      ELSE
      IF ((conc_cod = 912) OR (conc_cod = 913)) THEN
      BEGIN
       entidad = :nitafc;
      EXECUTE PROCEDURE LEE_CONFIGURACION('NOMINA','LIQUIDACION','TOMAR BENEFICIOS PARA CALCULAR PROVISIONES')RETURNING_VALUES(:parambenef);
      if (parambenef = 'SI') then
      BEGIN
      SELECT SUM(ce.emco_monto)
      FROM empleado_conceptos CE, CONCEPTOS_NOMINA CN WHERE CN.conc_benefic = 'S' AND (CE.terc_nit = :nite) AND (CE.CONC_COD = CN.CONC_COD) AND
      ((CE.emco_fecini <= :fec AND CE.emco_fecfin >= :FEC) OR ((cn.conc_todosper = 'N') AND (CE.emco_ppago = :periodo)) OR
      (cn.conc_todosper = 'S'))
      INTO :beneficios;
      if (beneficios is null) then
       beneficios = 0;
      END
      ELSE
       beneficios = 0;
      SELECT P.paan_auxtr, P.paan_salminimo FROM PARAMETROS_ANO P WHERE P.paan_ano = :ano INTO :auxtrans, :smlv;
      if (:basico < (:smlv*2)) then
       auxtrans = (:auxtrans / 30) * :diaslab;
      ELSE
       auxtrans = 0;
       IF ((conc_cod = 912) OR (conc_cod = 913) or (conc_cod = 937)) THEN
       BEGIN
        SELECT A.paan_cesemp FROM parametros_ano A WHERE A.paan_ano = :ano INTO :porcen;
        VALOR = ((:valor + :auxtrans + :beneficios) * :PORCEN) /100;
       END
      END
      ELSE
      BEGIN
       IF (comision IS NULL) THEN
       comision = 0;
       SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :comision;
       conc_monto = :basico + :comision;
       IF (conc_porc <> 0 AND conc_porc IS NOT NULL) THEN
       VALOR = (((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans + :incap) * :conc_porc) /100;
       ELSE
       IF (:porcen <> 0 AND :porcen IS NOT NULL) THEN
       VALOR = (((:CONC_MONTO/30 * :diaslab )+ :cambsaltrans + :incap) * :porcen) /100;
       ELSE
       IF (:montos <> 0 AND :montos IS NOT NULL) THEN
       valor = :montos;
       ELSE
       IF (:conc_monto <> 0 AND :conc_monto IS NOT NULL) THEN
       valor = :conc_monto;
      END
     END
     item = :item + 1;
    END
    ELSE
    IF (conc_prov = 'S') THEN
    BEGIN
     horasex = NULL;
     diasnov = NULL;
     retroact = NULL;
     reembolso = NULL;
     beneficios = null;
     recargo = null;
     comision = null;
     incap = null;
     /*RECARGO*/
     SELECT FIRST 1  m.mvse_salario FROM MOVIMIENTO_SALARIO_EMPLEADO M WHERE M.terc_nit = :nite AND M.mvse_fecha <= :FEC ORDER BY M.mvse_fecha DESC INTO :basico;
     SELECT N.noex_recnoct, N.noex_recfest
     FROM NOMINA_HORASEXT N WHERE N.noex_periodio = :periodo AND N.noex_ano = :ano AND N.terc_nit = :nite
     INTO :recnoct, :recfest;
     if (recnoct is null) then
      recnoct = 0;
     if (recfest is null) then
      recfest = 0;
     SELECT P.paan_recnoc, P.paan_recfest FROM PARAMETROS_ANO P WHERE P.paan_ano = :ano INTO :tar_recnotc, :tar_recfest;
     recargo = (((:basico/30)/8)*:tar_recnotc)*:recnoct;
     recargo = :recargo + ((((:basico/30)/8)*:tar_recfest)*:recfest);
      /*INCAPACIDAD*/
      SELECT N.nono_dura FROM NOMINA_NOVEDADES N WHERE N.terc_nit = :nite AND N.nono_periodo = :periodo AND N.nono_ano = :ano AND (N.tnov_cod = 2 OR (N.tnov_cod = 3)) INTO :diasnov;
      IF (:diasnov IS NULL) THEN
      incap = 0;
      ELSE
      incap = (:basico / 30)* :diasnov;
     /*BASICO*/
     SELECT N.noex_recnoct, N.noex_recfest
     FROM NOMINA_HORASEXT N WHERE N.noex_periodio = :periodo AND N.noex_ano = :ano AND N.terc_nit = :nite
     INTO :recnoct, :recfest;
     if (recnoct is null) then
      recnoct = 0;
     if (recfest is null) then
      recfest = 0;
     SELECT P.paan_recnoc, P.paan_recfest FROM PARAMETROS_ANO P WHERE P.paan_ano = :ano INTO :tar_recnotc, :tar_recfest;
     basico = ((:basico/30)*:diaslab) - (((:basico/30)/8)*:recnoct);
     basico = :basico - (((:basico/30)/8)*:recfest);
     /*BENEFICIOS*/
     EXECUTE PROCEDURE LEE_CONFIGURACION('NOMINA','LIQUIDACION','TOMAR BENEFICIOS PARA CALCULAR PROVISIONES')RETURNING_VALUES(:parambenef);
     if (parambenef = 'SI') then
     BEGIN
      SELECT SUM(ce.emco_monto)
      FROM empleado_conceptos CE, CONCEPTOS_NOMINA CN WHERE CN.conc_benefic = 'S' AND (CE.terc_nit = :nite) AND (CE.CONC_COD = CN.CONC_COD) AND
      ((CE.emco_fecini <= :fec AND CE.emco_fecfin >= :FEC) OR ((cn.conc_todosper = 'N') AND (CE.emco_ppago = :periodo)) OR
      (cn.conc_todosper = 'S'))
      INTO :beneficios;
      if (beneficios is null) then
        beneficios = 0;
     END
     ELSE
      beneficios = 0;
     if ((conc_cod <> 929) and (conc_cod <> 930) and (conc_cod <> 944)) then
     begin
        SELECT P.paan_auxtr, P.paan_salminimo FROM PARAMETROS_ANO P WHERE P.paan_ano = :ano INTO :auxtrans, :smlv;
        if (:basico < (:smlv*2)) then
           auxtrans = (:auxtrans / 30) * :diaslab;
        ELSE
           auxtrans = 0;
     end
     else
      auxtrans = 0;
     conc_monto = :basico;
     IF (conc_porc <> 0 AND conc_porc IS NOT NULL) THEN
     VALOR = (((:CONC_MONTO)+ :cambsaltrans + :incap + :recargo + :auxtrans + :beneficios) * :conc_porc) /100;
     ELSE
     IF (porcen <> 0 AND porcen IS NOT NULL) THEN
     VALOR = (((:CONC_MONTO)+ :cambsaltrans + :incap + :recargo + :auxtrans + :beneficios) * :porcen) /100;
     ELSE
     IF (montos <> 0 AND montos IS NOT NULL) THEN
     VALOR = :montos;
     ELSE
     IF (conc_monto <> 0 AND conc_monto IS NOT NULL) THEN
     VALOR = :conc_monto;
     item = :item + 1;
    END
    ELSE
    IF (conc_cod = 920) THEN
    BEGIN
     SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :valor;
     IF (valor IS NULL) THEN
     valor = 0;
     item = :item + 1;
    END
    ELSE
    IF (conc_cod = 900 OR (:conc_cod = 931)) THEN
    BEGIN
     SELECT c.noex_monto FROM nomina_horasext c WHERE c.noex_ano = :ano AND c.noex_periodio = :periodo AND c.noex_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :valor;
     IF (valor IS NULL) THEN
     valor = 0;
     item = :item + 1;
    END
    ELSE
    IF (conc_cod = 954) THEN
    BEGIN
     SELECT c.ncar_monto FROM nomina_CARTERA c WHERE c.ncar_ano = :ano AND c.ncar_periodo = :periodo AND c.ncar_periodicidad = :periodicidad AND c.terc_nit = :nite INTO :valor;
     IF (valor IS NULL) THEN
     valor = 0;
     item = :item + 1;
    END
    ELSE
    IF (conc_cod = 932) THEN
    BEGIN
     SELECT N.nono_dura FROM NOMINA_NOVEDADES N WHERE N.terc_nit = :nite AND N.nono_periodo = :periodo AND N.nono_ano = :ano AND (N.tnov_cod = 2 OR (N.tnov_cod = 3)) INTO :diasnov;
     IF (:diasnov IS NULL) THEN
     valor = 0;
     ELSE
     valor = (:basico / 30)* :diasnov;
    END
    ELSE
    IF (conc_cod = 921) THEN
    BEGIN
     IF (porcen IS NOT NULL AND porcen <> 0) THEN
     valor = ((basico / 30)* :diaslab ) * :PORCEN /100;
     ELSE
     IF (conc_porc IS NOT NULL AND conc_porc <> 0) THEN
     valor = ((basico / 30)* :diaslab ) * :conc_porc /100;
    END
    ELSE
    if (conc_cod = 953) then
    BEGIN
       SELECT FIRST 1  m.mvse_salario FROM MOVIMIENTO_SALARIO_EMPLEADO M WHERE M.terc_nit = :nite AND M.mvse_fecha <= :FEC ORDER BY M.mvse_fecha DESC INTO :basico;
       SELECT N.noex_recnoct, N.noex_recfest
       FROM NOMINA_HORASEXT N WHERE N.noex_periodio = :periodo AND N.noex_ano = :ano AND N.terc_nit = :nite
       INTO :recnoct, :recfest;
       if (recnoct is null) then
        recnoct = 0;
       if (recfest is null) then
        recfest = 0;
       SELECT P.paan_recnoc, P.paan_recfest FROM PARAMETROS_ANO P WHERE P.paan_ano = :ano INTO :tar_recnotc, :tar_recfest;
       valor = (((:basico/30)/8)*:tar_recnotc)*:recnoct;
       valor = :valor + ((((:basico/30)/8)*:tar_recfest)*:recfest);
    END
    if (conc_aporte = 'S') then
    begin
    if (entidad is null or (entidad = '') ) then
    entidad = :conc_entidad;
    end
   END
    if ((VALOR <> 0) AND (VALOR IS NOT NULL)) then
    BEGIN
    EXECUTE PROCEDURE LEE_CONFIGURACION('NOMINA','GENERAL','REDONDEO AL MULTIPLO DE DIEZ EN TOTALES')RETURNING_VALUES(:aprox);
    EXECUTE PROCEDURE REDONDEE(:valor, :aprox) RETURNING_VALUES (VALOR);
    IF ((mensual = 'N') OR (periodicidad = 1))  THEN
    INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
    VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
    ELSE
    IF (mensual = 'S') THEN
    BEGIN
     IF ((:periodicidad = 2) AND (liquidaper = 1)) THEN
     BEGIN
      IF ((periodo = 1) OR (periodo = 3) OR (periodo = 5) OR (periodo = 7) OR (periodo = 9) OR (periodo = 11)
      OR (periodo = 13) OR (periodo = 15) OR (periodo = 17) OR (periodo = 19) OR (periodo = 21) OR (periodo = 23)) THEN
      INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
      VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
     END
     ELSE
     IF ((:periodicidad = 2) AND (liquidaper = 2)) THEN
     BEGIN
      IF ((periodo = 2) OR (periodo = 4) OR (periodo = 6) OR (periodo = 8) OR (periodo = 10) OR (periodo = 12)
      OR (periodo = 14) OR (periodo = 16) OR (periodo = 18) OR (periodo = 20) OR (periodo = 22) OR (periodo = 24)) THEN
      INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
      VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
     END
     ELSE
     IF ((:periodicidad = 3) AND (liquidaper = 1)) THEN
     BEGIN
      IF ((periodo = 1) OR (periodo = 5) OR (periodo = 9) OR (periodo = 13) OR (periodo = 17) OR (periodo = 21)
      OR (periodo = 25) OR (periodo = 29) OR (periodo = 33) OR (periodo = 37) OR (periodo = 41) OR (periodo = 45)
      OR (periodo = 49)) THEN
      INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
      VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
    END
    ELSE
     IF ((:periodicidad = 3) AND (liquidaper = 2)) THEN
     BEGIN
      IF ((periodo = 2) OR (periodo = 6) OR (periodo = 10) OR (periodo = 14) OR (periodo = 18) OR (periodo = 22)
      OR (periodo = 26) OR (periodo = 30) OR (periodo = 34) OR (periodo = 38) OR (periodo = 42) OR (periodo = 46)
      OR (periodo = 50)) THEN
      INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
      VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
     END
     ELSE
     IF ((:periodicidad = 3) AND (liquidaper = 3)) THEN
     BEGIN
      IF ((periodo = 3) OR (periodo = 7) OR (periodo = 11) OR (periodo = 15) OR (periodo = 19) OR (periodo = 23)
      OR (periodo = 27) OR (periodo = 31) OR (periodo = 35) OR (periodo = 39) OR (periodo = 43) OR (periodo = 47)
      OR (periodo = 51)) THEN
      INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
      VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
     END
     ELSE
     IF ((:periodicidad = 3) AND (liquidaper = 4)) THEN
     BEGIN
      IF ((periodo = 4) OR (periodo = 8) OR (periodo = 12) OR (periodo = 16) OR (periodo = 20) OR (periodo = 24)
      OR (periodo = 29) OR (periodo = 32) OR (periodo = 36) OR (periodo = 40) OR (periodo = 44) OR (periodo = 48)
      OR (periodo = 52)) THEN
      INSERT INTO nomina_conceptos (NOMI_ID, NOCO_ITEM, conc_cod,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, noco_gtoempr)
      VALUES (:IDNOMINA,:item, :concept, :nit_tercero, :valor, :entidad, :CONC_DEDUC, :conc_prov, :conc_aporte, :periodo, :ano, :conc_modifi, :conc_aplicaprom, :salario, :gtoempr);
     END
    END
  VALOR = 0;
  basico = 0;
  END
  END
 END
 END
 END
 SUSPEND;
END
^

SET TERM ; ^


UPDATE REVISION SET REVI_NOMINA = '2010/06/05' ;
COMMIT WORK;


/* 20100609 : color ventana, mejora rendimiento calculo nomina */

INSERT INTO CONFIGURACION (CONF_MODULO, CONF_CATEGORIA, CONF_PROPIEDAD, CONF_VALOR, CONF_POSIBLES, CONF_AYUDA) VALUES ('NOMINA', 'GENERAL', 'COLOR VENTANA PRINCIPAL', '12000', '00000-35999', 'Indique el color en formato RGB que quiere de fondo en la ventana principal del módulo');
COMMIT WORK;

CREATE DESCENDING INDEX MOVIMIENTO_SALARIO_EMPLEAD_IDX1
ON MOVIMIENTO_SALARIO_EMPLEADO (TERC_NIT,MVSE_FECHA);

SET TERM ^ ;

CREATE OR ALTER procedure CAUSA_NOMINA (
    FEC date,
    PERIODO integer,
    PERIODICIDAD integer,
    PAGOGLOBAL char(1),
    ANO char(4),
    DEPTO integer)
returns (
    IDNOMINA integer,
    ITEMINI integer)
AS
declare variable ITEM integer;
declare variable NITE varchar(20) character set NONE;
declare variable NIT_TERCERO varchar(20);
declare variable CONCEPT integer;
declare variable MONTOS numeric(18,2);
declare variable PORCEN numeric(9,4);
declare variable ENTIDAD varchar(20);
declare variable CONC_COD integer;
declare variable CONC_DEDUC char(1);
declare variable CONC_PORC numeric(9,4);
declare variable CONC_ENTIDAD integer;
declare variable CONC_MONTO numeric(18,2);
declare variable CONC_MODIFI char(1);
declare variable CONC_PROMEDIO char(1);
declare variable EMCO_PERPROM integer;
declare variable VALOR numeric(18,2);
declare variable DIASLAB integer;
declare variable CONC_PROV char(1);
declare variable CONC_APORTE char(1);
declare variable NUMEROPROM integer;
declare variable CONC_APLICAPROM char(1);
declare variable PERINICIAL integer;
declare variable ANOPROM integer;
declare variable CONC_DIAS char(1);
declare variable CONC_OTROCONC char(1);
declare variable CONC_CODOTROCONC integer;
declare variable ANOSUM integer;
declare variable SALARIO char(1) character set NONE;
declare variable LIQUIDAPER integer;
declare variable BASICO numeric(18,2);
declare variable NITEPS varchar(20);
declare variable NITAFC varchar(20);
declare variable NITAFP varchar(20);
declare variable NITCCF varchar(20);
declare variable GTOEMPR char(1);
declare variable COMISION numeric(18,2);
declare variable CAMBSALTRANS numeric(18,2);
declare variable SALDOSINI numeric(18,2);
declare variable DURANOV integer;
declare variable BASE numeric(18,2);
declare variable APROX integer;
declare variable MENSUAL char(1);
declare variable HORASEX numeric(18,2);
declare variable DIASNOV integer;
declare variable TOMASAL integer;
declare variable RETROACT numeric(18,2);
declare variable REEMBOLSO numeric(18,2);
declare variable INCAP numeric(18,2);
declare variable AUXTRANS numeric(18,2);
declare variable SMLV numeric(18,2);
declare variable BENEFICIOS numeric(18,2);
declare variable CONFIRMADO char(1);
declare variable RECNOCT numeric(18,2);
declare variable RECFEST numeric(18,2);
declare variable TAR_RECNOTC numeric(9,4);
declare variable TAR_RECFEST numeric(9,4);
declare variable RECARGO numeric(18,2);
declare variable BASICOREC numeric(18,2);
declare variable PARAMBENEF char(2);
declare variable VACACDISF numeric(18,2);
declare variable VALORPREDET numeric(18,2);
declare variable BASICOEMP numeric(18,2);
begin
execute procedure LEE_CONFIGURACION('NOMINA','LIQUIDACION','TOMAR BENEFICIOS PARA CALCULAR PROVISIONES')returning_values(:PARAMBENEF);
execute procedure LEE_CONFIGURACION('NOMINA','GENERAL','REDONDEO AL MULTIPLO DE DIEZ EN TOTALES')returning_values(:APROX);
select N.NOMI_ID, N.NOMI_LIQOK from NOMINA N where N.NOMI_PERIODO = :PERIODO and N.NOMI_PERIODOCIDAD = :PERIODICIDAD
    and N.NOMI_ANO = :ANO into :IDNOMINA, :CONFIRMADO;
if (:IDNOMINA is null) then
    begin
    execute procedure CAMBIE_ID_NOMINA returning_values(:IDNOMINA);
    insert into NOMINA (NOMI_ID, NOMI_FECCAUSA, NOMI_PAGOGLOBAL, NOMI_PERIODOCIDAD, NOMI_PERIODO, NOMI_ANO, NOMI_LIQOK)
    values (:IDNOMINA, :FEC,:PAGOGLOBAL, :PERIODICIDAD, :PERIODO, :ANO, 'N');
    ITEM = 1;
    end
else
    begin
    select max(N.NOCO_ITEM) from NOMINA_CONCEPTOS N where N.NOMI_ID = :IDNOMINA
    into :ITEM;
    end
if ((CONFIRMADO = 'S') and (IDNOMINA is not null)) then
    begin
    IDNOMINA = 0;
    end
else
    begin
    insert into NOMINA_DEPARTAMENTO (NOMI_ID, NODP_DEPTO)values(:IDNOMINA,:DEPTO);
    select P.PAAN_RECNOC, P.PAAN_RECFEST from PARAMETROS_ANO P where P.PAAN_ANO = :ANO
        into :TAR_RECNOTC, :TAR_RECFEST;
    ITEMINI = ITEM;
    for select E.TERC_NIT, E.EMPL_EPS, E.EMPL_AFC, E.EMPL_AFP, E.EMPL_CCF
        from EMPLEADOS E
        where E.EMPL_PPAGO = :PERIODICIDAD and ((E.EMPL_FECRET is null) or (E.EMPL_FECRET > :FEC)) and E.EMPL_FECING <= :FEC
        and ((:DEPTO = 0) or (e.empl_dpto = :DEPTO))
        into :NITE, :NITEPS, :NITAFC, :NITAFP, :NITCCF
        do
        begin
        select first 1 M.MVSE_SALARIO from MOVIMIENTO_SALARIO_EMPLEADO M where M.TERC_NIT = :NITE and M.MVSE_FECHA <= :FEC order by M.MVSE_FECHA desc into :BASICOEMP;
        BASICO = BASICOEMP;
        RECNOCT = null;
        RECFEST = null;
        select N.NOEX_RECNOCT, N.NOEX_RECFEST
            from NOMINA_HORASEXT N where N.NOEX_PERIODIO = :PERIODO and N.NOEX_ANO = :ANO and N.TERC_NIT = :NITE
            into :RECNOCT, :RECFEST;
        if (RECNOCT is null) then
            RECNOCT = 0;
        if (RECFEST is null) then
            RECFEST = 0;
        for select CE.TERC_NIT, CE.CONC_COD, CE.EMCO_MONTO, CE.EMCO_PORC, CE.EMPL_ENTIDAD, CE.EMCO_PERPROM, CE.EMCO_LUQUIDAPER, CE.EMCO_MENSUAL, CN.CONC_COD, CN.CONC_DEDUC,CN.CONC_PORC, CN.CONC_ENTIDAD, CN.CONC_MONTO,  CN.CONC_DIAS, CN.CONC_MODIFI,
            CN.CONC_PROMEDIO, CN.CONC_SALARIO, CE.EMCO_PERPROM, CN.CONC_PROV, CN.CONC_APORTE, CN.CONC_APLICAPROM, CN.CONC_OTROCONC, CN.CONC_CODOTROCONC, CN.CONC_GTOEMPR, CN.CONC_BASE, CE.EMCO_TOMSAL
            from EMPLEADO_CONCEPTOS CE, CONCEPTOS_NOMINA CN where (CE.CONC_COD = CN.CONC_COD) and (CE.TERC_NIT = :NITE) and
            ( ((CE.EMCO_FECINI <= :FEC and CE.EMCO_FECFIN >= :FEC)) or
            ((CN.CONC_TODOSPER = 'N') and (CE.EMCO_PPAGO = :PERIODO)) or ((CN.CONC_TODOSPER = 'S') AND (((:periodicidad = 1) AND (:PERIODO < 13)) or ((:periodicidad = 2) AND (:PERIODO < 25)))) )  order by (TERC_NIT )
            into :NIT_TERCERO, :CONCEPT,  :MONTOS, :PORCEN, :ENTIDAD, :NUMEROPROM, :LIQUIDAPER, :MENSUAL ,:CONC_COD, :CONC_DEDUC, :CONC_PORC,
            :CONC_ENTIDAD, :CONC_MONTO, :CONC_DIAS, :CONC_MODIFI,:CONC_PROMEDIO, :SALARIO,:EMCO_PERPROM, :CONC_PROV, :CONC_APORTE , :CONC_APLICAPROM, :CONC_OTROCONC, :CONC_CODOTROCONC, :GTOEMPR, :BASE, :TOMASAL
            do
            begin
            if (CONC_DIAS = 'S') then
                execute procedure DIAS_LABORADOS (:NITE, :PERIODO, :FEC, :MENSUAL,:CONC_APORTE) returning_values (:DIASLAB);
            else
                DIASLAB = 15;
            if (:TOMASAL <> 0) then
                begin
                /* SI EL CONCEPTO NOAPLICA EN ESTE PERIODO DEJE EL BASICO EN CERO */
                if ((:PERIODICIDAD = 2) and (:TOMASAL <> 2)) then
                    begin
                    if ((PERIODO = 2) or (PERIODO = 4) or (PERIODO = 6) or (PERIODO = 8) or (PERIODO = 10) or (PERIODO = 12)
                        or (PERIODO = 14) or (PERIODO = 16) or (PERIODO = 18) or (PERIODO = 20) or (PERIODO = 22) or (PERIODO = 24)) then
                        BASICO = 0;
                    end
                else
                    if ((:PERIODICIDAD = 3) and (:TOMASAL <> 1)) then
                        begin
                        if ((PERIODO = 1) or (PERIODO = 5) or (PERIODO = 9) or (PERIODO = 13) or (PERIODO = 17) or (PERIODO = 21)
                            or (PERIODO = 25) or (PERIODO = 29) or (PERIODO = 33) or (PERIODO = 37) or (PERIODO = 41) or (PERIODO = 45)
                            or (PERIODO = 49)) then
                            BASICO = 0;
                        end
                    else
                        if ((:PERIODICIDAD = 3) and (:TOMASAL <> 2)) then
                            begin
                            if ((PERIODO = 2) or (PERIODO = 6) or (PERIODO = 10) or (PERIODO = 14) or (PERIODO = 18) or (PERIODO = 22)
                                or (PERIODO = 26) or (PERIODO = 30) or (PERIODO = 34) or (PERIODO = 38) or (PERIODO = 42) or (PERIODO = 46)
                                or (PERIODO = 50)) then
                                BASICO = 0;
                            end
                        else
                            if ((:PERIODICIDAD = 3) and (:TOMASAL <> 3)) then
                                begin
                                if ((PERIODO = 3) or (PERIODO = 7) or (PERIODO = 11) or (PERIODO = 15) or (PERIODO = 19) or (PERIODO = 23)
                                    or (PERIODO = 27) or (PERIODO = 31) or (PERIODO = 35) or (PERIODO = 39) or (PERIODO = 43) or (PERIODO = 47)
                                    or (PERIODO = 51)) then
                                    BASICO = 0;
                                end
                            else
                                if ((:PERIODICIDAD = 3) and (:TOMASAL <> 4)) then
                                begin
                                if ((PERIODO = 4) or (PERIODO = 8) or (PERIODO = 12) or (PERIODO = 16) or (PERIODO = 20) or (PERIODO = 24)
                                    or (PERIODO = 29) or (PERIODO = 32) or (PERIODO = 36) or (PERIODO = 40) or (PERIODO = 44) or (PERIODO = 48)
                                    or (PERIODO = 52)) then
                                    BASICO = 0;
                                end
                end
            else
                begin
                /* SE CALCULA SOBRE TODOS LOS PERIODOS */
                BASICO = BASICOEMP;
                end
            VALORPREDET = null;
            select VP.NVPR_MONTO from NOMINA_VALOR_PREDET VP where VP.NVPR_PERIODICIDAD = :PERIODICIDAD and VP.NVPR_PERIODO = :PERIODO and VP.NVPR_ANO = :ANO and VP.CONC_COD = :CONC_COD and VP.TERC_NIT = :NITE
                into :VALORPREDET;
            if ((:VALORPREDET <> 0) and (VALORPREDET is not null)) then
                VALOR = VALORPREDET;
            else
                begin
                /* SI HAY UN CAMBIO TRANSITORIO DE SALARIO AJUSTE LOS DIAS Y CALCULE EL VALOR A SUMAR */
                select ((N.NONO_VALOR /30) * N.NONO_DURA), (N.NONO_DURA) from NOMINA_NOVEDADES N
                    where N.TNOV_COD = 11 and N.TERC_NIT = :NITE and N.NONO_PERIODO = :PERIODO into :CAMBSALTRANS, :DURANOV;
                if (CAMBSALTRANS is null) then
                    CAMBSALTRANS = 0;
                if (DURANOV is null) then
                    DURANOV = 0;
                DIASLAB = :DIASLAB - :DURANOV;
                /* SI ES UN PRESTAMO, TRAIGA LA CUOTA */
                if (CONC_COD = 922) then
                    begin
                    select sum(P.PRCU_MONTO) from PRESTAMO_CUOTAS P, PRESTAMO_NOMINA PN
                        where P.PRCU_ANO = :ANO and P.PRCU_PERIODO = :PERIODO and PN.PRNO_ID = P.PRNO_ID and PN.TERC_NIT = :NITE into :VALOR;
                    if (VALOR is null) then
                        VALOR = 0;
                    ITEM = :ITEM + 1;
                    /* MARQUE LA CUOTA COMO PAGADA */
                    update PRESTAMO_CUOTAS  P set PRCU_OK = 'S' where P.PRCU_ANO = :ANO and P.PRCU_PERIODO = :PERIODO and P.PRNO_ID = (select PN.PRNO_ID from PRESTAMO_NOMINA PN where PN.TERC_NIT = :NITE);
                    end
                else
                    if ((:MONTOS = 0) or (:MONTOS is null)) then
                        begin
                        /* SI EL CONCEPTO DEL EMPLEADO NO TIENE MONTO TRAIGA EL DE CONCEPTOS_NOMINA */
                        if ((CONC_PORC = 0 and :PORCEN = 0) or (CONC_PORC is null and :PORCEN = 0) or (CONC_PORC = 0 and :PORCEN is null) or (CONC_PORC is null and :PORCEN is null) ) then
                            begin
                            /* SIN PORCENTAJE */
                            if ((CONC_MONTO <> 0) and (CONC_MONTO is not null) ) then
                                begin
                                VALOR = :CONC_MONTO;
                                if (:CONC_DIAS = 'S') then
                                    VALOR = (:VALOR / 30) * :DIASLAB;
                                end
                            else
                                if (SALARIO = 'S' and CONC_COD <> 900 and CONC_COD <> 920 and CONC_COD <> 932 and CONC_COD <> 953) then
                                    begin
                                    /* SI ES SALARIO SUME LAS EXTRAS */
                                    BASICO = BASICOEMP;
                                    BASICO = ((:BASICO/30)*:DIASLAB) - (((:BASICO/30)/8)*:RECNOCT);/* PFP:DEBERIA SER + Y POR LA TARIFA QUE NO VEO POR NINGUN LADO */
                                    BASICO = :BASICO - (((:BASICO/30)/8)*:RECFEST);
                                    CONC_MONTO = :BASICO;
                                    VALOR = (:CONC_MONTO/*/30 * :diaslab*/ ) + :CAMBSALTRANS;
                                    end
                                else
                                    begin
                                    VALOR = MONTOS;
                                    if (:CONC_DIAS = 'S') then
                                        VALOR = (:VALOR / 30) * :DIASLAB;
                                    end
                            end
                        else    
                            begin
                            if (:PORCEN <> 0) then
                                begin
                                /* SI TIENE PORCENTAJE EN EMPLEADO_CONCEPTOS PERO EL MONTO SE TRAE DE CONCPETOS_NOMINA */
                                if ((CONC_MONTO <> 0) and (CONC_MONTO is not null) ) then
                                    begin
                                    VALOR = ((:CONC_MONTO ) * :PORCEN) /100;
                                    end
                                end
                            else
                                begin
                                /* NO TIENE PORCENTAJE EN EMPLEADO_CONCEPTOS SE TRAE MONTO Y PORC DE CONCPETOS_NOMINA */
                                if ((CONC_MONTO <> 0) and (CONC_MONTO is not null) ) then
                                    begin
                                    VALOR = ((:CONC_MONTO) * :CONC_PORC) /100;
                                    end
                                else
                                    if (SALARIO = 'S' and CONC_COD <> 900 and CONC_COD <> 920 and CONC_COD <> 932 and CONC_COD <> 953) then
                                        begin
                                        BASICO = BASICOEMP;
                                        BASICO = ((:BASICO/30)*:DIASLAB) - (((:BASICO/30)/8)*:RECNOCT);
                                        BASICO = :BASICO - (((:BASICO/30)/8)*:RECFEST);
                                        CONC_MONTO = :BASICO;
                                        VALOR = ((:CONC_MONTO)+ :CAMBSALTRANS * :CONC_PORC) /100;
                                        end
                                    else
                                        if (:CONC_MONTO = 0 and :MONTOS = 0) then
                                            begin
                                            CONC_MONTO = :BASICO;
                                            VALOR = (((:CONC_MONTO / 30) * :DIASLAB) + :CAMBSALTRANS * :CONC_PORC) /100;
                                            end
                                end
                            end
                        end
                    else
                        /* SI TIENE MONTO EN EMPLEADO_CONCEPTOS */
                        if ((CONC_PORC = 0 or (CONC_PORC is null)) and (:PORCEN = 0 or (PORCEN is null))) then
                            begin
                            VALOR = (:MONTOS);
                            if (:CONC_DIAS = 'S') then
                                VALOR = (:VALOR / 30) * :DIASLAB;   
                            end
                        else
                            if (:PORCEN <> 0 and PORCEN is not null) then
                                begin
                                VALOR = ((:MONTOS ) * :PORCEN) /100;
                                end
                            else
                                begin
                                VALOR = ((:MONTOS) * :CONC_PORC) /100;
                                end
                if (CONC_PROMEDIO = 'S') then
                    begin
                    /* CALCULO DEL PROMEDIO BASE */
                    PERINICIAL = :PERIODO - (:NUMEROPROM) + 1;
                    ANOPROM = cast (ANO as integer);
                    if (PERINICIAL <= 0) then
                        begin
                        PERINICIAL = 1;
                        ANOPROM = cast(ANO as integer) - 1;
                        end
                    select sum (NOCO_VALOR) from NOMINA_CONCEPTOS N where N.NOCO_APLICAPROM = 'S' and N.NOCO_PERIODO >= :PERINICIAL - 1 and N.NOCO_PERIODO < :PERIODO and N.NOCO_ANO >= :ANOPROM and N.NOCO_ANO <= :ANO and TERC_NIT = :NITE into :VALOR;
                    VALOR = ((VALOR ) / (NUMEROPROM -1 ));
                    select NOCO_VALOR from NOMINA_CONCEPTOS where CONC_COD = :CONC_COD and TERC_NIT  = :NITE and NOCO_PAGOOK = 'N' and NOCO_PERIODO = 0 into :SALDOSINI;
                    if (SALDOSINI is null) then
                        SALDOSINI = 0;
                    else
                        update NOMINA_CONCEPTOS N set NOCO_PAGOOK = 'S' where N.NOCO_APLICAPROM = 'S' and N.NOCO_PERIODO >= :PERINICIAL - 1 and N.NOCO_PERIODO < :PERIODO and N.NOCO_ANO >= :ANOPROM and N.NOCO_ANO <= :ANO  and CONC_COD = :CONC_COD and TERC_NIT = :NITE and NOCO_PERIODO = 0;
                    VALOR = :VALOR + :SALDOSINI;
                    update NOMINA_CONCEPTOS N set NOCO_PAGOOK = 'S' where N.NOCO_APLICAPROM = 'S' and N.NOCO_PERIODO >= :PERINICIAL - 1 and N.NOCO_PERIODO < :PERIODO and N.NOCO_ANO >= :ANOPROM and N.NOCO_ANO <= :ANO  and CONC_COD = :CONC_COD and TERC_NIT = :NITE;
                    end
                else if (CONC_OTROCONC = 'S') then
                    begin
                    ANOSUM = cast(ANO as integer);
                    ANOSUM = ANOSUM - 1;
                    select sum (NOCO_VALOR) from NOMINA_CONCEPTOS N where N.NOCO_ANO = :ANOSUM and N.CONC_COD = :CONC_CODOTROCONC and N.TERC_NIT = :NITE into :VALOR;
                    select NOCO_VALOR from NOMINA_CONCEPTOS where NOCO_ANO = :ANOSUM and CONC_COD = :CONC_CODOTROCONC and TERC_NIT = :NITE and NOCO_PERIODO = 0 into :SALDOSINI;
                    if (SALDOSINI is null) then
                        SALDOSINI = 0;
                    else
                        update NOMINA_CONCEPTOS set NOCO_PAGOOK = 'S' where NOCO_ANO = :ANOSUM and CONC_COD = :CONC_CODOTROCONC and NOCO_PERIODO = 0 and TERC_NIT = :NITE;
                    VALOR = :VALOR + :SALDOSINI;
                    update NOMINA_CONCEPTOS set NOCO_PAGOOK = 'S' where NOCO_ANO = :ANOSUM and CONC_COD = :CONC_CODOTROCONC and TERC_NIT = :NITE;
                    end
                else if (CONC_APORTE = 'S') then
                    begin
                    HORASEX = null;
                    DIASNOV = null;
                    RETROACT = null;
                    REEMBOLSO = null;
                    BENEFICIOS = null;
                    RECARGO = null;
                    COMISION = null;
                    INCAP = null;
                    VACACDISF = null;
                    if ((:ENTIDAD = '' ) or (ENTIDAD is null)) then
                        begin
                        /*COMISIONES*/
                        select C.NCOM_MONTO from NOMINA_COMISIONES C where C.NCOM_ANO = :ANO
                            and C.NCOM_PERIODO = :PERIODO and C.NCOM_PERIODICIDAD = :PERIODICIDAD and C.TERC_NIT = :NITE
                            into :COMISION;
                        if (COMISION is null) then
                            COMISION = 0;
                        /*RETROACTIVO*/
                        select C.EMCO_MONTO from EMPLEADO_CONCEPTOS C where C.TERC_NIT = :NITE
                            and C.CONC_COD = 933 into :RETROACT;
                            if (RETROACT is null ) then
                                RETROACT = 0;
                        /*REEMBOLSO*/
                        select C.EMCO_MONTO from EMPLEADO_CONCEPTOS C where C.TERC_NIT = :NITE
                            and C.CONC_COD = 952 into :REEMBOLSO;
                        if (REEMBOLSO is null ) then
                            REEMBOLSO = 0;
                        /*VACACIONES DISFRUTADAS ANTERIORMENTE*/
                        select C.EMCO_MONTO from EMPLEADO_CONCEPTOS C where C.TERC_NIT = :NITE
                            and C.CONC_COD = 955 into :VACACDISF;
                        if (VACACDISF is null ) then
                            VACACDISF = 0;
                        /* INCAPACIDAD*/
                        select N.NONO_DURA from NOMINA_NOVEDADES N where N.TERC_NIT = :NITE
                            and N.NONO_PERIODO = :PERIODO and N.NONO_ANO = :ANO and (N.TNOV_COD = 2 or (N.TNOV_COD = 3))
                            into :DIASNOV;
                        if (:DIASNOV is null) then
                            INCAP = 0;
                        else
                            INCAP = (:BASICO / 30)* :DIASNOV;
                        /*BASICO*/
                        BASICO = ((:BASICO/30)*:DIASLAB) - (((:BASICO/30)/8)*:RECNOCT);
                        BASICO = :BASICO - (((:BASICO/30)/8)*:RECFEST);
                        /*HORAS EXTRA*/
                        select C.NOEX_MONTO from NOMINA_HORASEXT C where C.NOEX_ANO = :ANO
                            and C.NOEX_PERIODIO = :PERIODO and C.NOEX_PERIODICIDAD = :PERIODICIDAD and C.TERC_NIT = :NITE
                            into :HORASEX;
                        if (HORASEX is null) then
                            HORASEX = 0;
                        /*RECARGOS*/
                        BASICOREC = BASICOEMP;
                        RECARGO = (((:BASICOREC/30)/8)*:TAR_RECNOTC)*:RECNOCT;
                        RECARGO = :RECARGO + ((((:BASICOREC/30)/8)*:TAR_RECFEST)*:RECFEST);
                        if (RECARGO is null) then
                            RECARGO = 0;
                        /*basico*/
                        if (:BASICO + :COMISION + :HORASEX + :RETROACT+ :REEMBOLSO + :INCAP+ :CAMBSALTRANS < ((:SMLV/30)*:DIASLAB)) then
                            BASICO = (:SMLV/30)*:DIASLAB;
                        /* SMLV Y AUX. TRANSPORTE*/
                        select P.PAAN_AUXTR, P.PAAN_SALMINIMO from PARAMETROS_ANO P
                            where P.PAAN_ANO = :ANO into :AUXTRANS, :SMLV;
                        /*BASE*/
                        VALOR = :BASICO + :COMISION + :HORASEX + :RETROACT+ :REEMBOLSO + :INCAP + :RECARGO + :CAMBSALTRANS + :VACACDISF;
                        if (CONC_COD = 904) then
                            begin
                            ENTIDAD = :NITAFP;
                            select A.PAAN_AFPTR from PARAMETROS_ANO A where A.PAAN_ANO = :ANO into :PORCEN;
                            VALOR = ((:VALOR) * :PORCEN) /100;
                            end
                        else if ((CONC_COD = 905) or (CONC_COD = 906) or (CONC_COD = 934) ) then
                            begin
                            ENTIDAD = :NITAFP;
                            select A.PAAN_AFPEM from PARAMETROS_ANO A where A.PAAN_ANO = :ANO into :PORCEN;
                            VALOR = ((:VALOR) * :PORCEN) /100;
                            end
                        else if ((CONC_COD = 907) or (CONC_COD = 914) or (CONC_COD = 915) or (conc_cod = 938)) then
                            begin
                            ENTIDAD = :NITEPS;
                            if (CONC_COD = 907) then
                                begin
                                select A.PAAN_EPSTR from PARAMETROS_ANO A where A.PAAN_ANO = :ANO into :PORCEN;
                                VALOR = ((:VALOR) * :PORCEN) /100;
                                end
                            else
                                begin
                                select A.PAAN_EPSEM from PARAMETROS_ANO A where A.PAAN_ANO = :ANO into :PORCEN;
                                    VALOR = ((:VALOR) * :PORCEN) /100;
                                end
                            end
                        else if ((CONC_COD = 910) or (CONC_COD = 911) or (CONC_COD = 936)) then
                            begin
                            /*ccf */
                            ENTIDAD = :NITCCF;
                            select A.PAAN_CCF from PARAMETROS_ANO A where A.PAAN_ANO = :ANO into :PORCEN;
                            VALOR = ((:VALOR) * :PORCEN) /100;
                            end
                        else if ((CONC_COD = 916) or (CONC_COD = 917) or (CONC_COD = 939) ) then
                            begin
                            /*icbf */
                            ENTIDAD = :NITCCF;
                            select A.PAAN_ICBF from PARAMETROS_ANO A where A.PAAN_ANO = :ANO into :PORCEN;
                            VALOR = ((:VALOR) * :PORCEN) /100;
                            end
                        else if ((CONC_COD = 918) or (CONC_COD = 919) or (CONC_COD = 940) ) then
                            begin
                            /*sena */
                            ENTIDAD = :NITCCF;
                            select A.PAAN_SENA from PARAMETROS_ANO A where A.PAAN_ANO = :ANO into :PORCEN;
                            VALOR = ((:VALOR) * :PORCEN) /100;
                            end
                        else if ((CONC_COD = 912) or (CONC_COD = 913) or (CONC_COD = 937)) then
                            begin
                            /* CESANTIAS */
                            ENTIDAD = :NITAFC;
                            if (PARAMBENEF = 'SI') then
                                begin
                                select sum(CE.EMCO_MONTO)
                                    from EMPLEADO_CONCEPTOS CE, CONCEPTOS_NOMINA CN where CN.CONC_BENEFIC = 'S' and (CE.TERC_NIT = :NITE) and (CE.CONC_COD = CN.CONC_COD) and
                                    ((CE.EMCO_FECINI <= :FEC and CE.EMCO_FECFIN >= :FEC) or ((CN.CONC_TODOSPER = 'N') and (CE.EMCO_PPAGO = :PERIODO)) or
                                    (CN.CONC_TODOSPER = 'S'))
                                    into :BENEFICIOS;
                                if (BENEFICIOS is null) then
                                    BENEFICIOS = 0;
                                end
                            else
                                BENEFICIOS = 0;
                            select P.PAAN_AUXTR, P.PAAN_SALMINIMO from PARAMETROS_ANO P
                                where P.PAAN_ANO = :ANO into :AUXTRANS, :SMLV;
                            if (:BASICO < (:SMLV*2)) then
                                AUXTRANS = (:AUXTRANS / 30) * :DIASLAB;
                            else
                                AUXTRANS = 0;
                            select A.PAAN_CESEMP from PARAMETROS_ANO A where A.PAAN_ANO = :ANO
                                into :PORCEN;
                            VALOR = ((:VALOR + :AUXTRANS + :BENEFICIOS) * :PORCEN) /100;
                            end
                        else
                            begin
                            if (COMISION is null) then
                                COMISION = 0;
                            select C.NCOM_MONTO from NOMINA_COMISIONES C where C.NCOM_ANO = :ANO and C.NCOM_PERIODO = :PERIODO and C.NCOM_PERIODICIDAD = :PERIODICIDAD and C.TERC_NIT = :NITE
                                into :COMISION;
                            CONC_MONTO = :BASICO + :COMISION;
                            if (CONC_PORC <> 0 and CONC_PORC is not null) then
                                VALOR = (((:CONC_MONTO/30 * :DIASLAB )+ :CAMBSALTRANS + :INCAP) * :CONC_PORC) /100;
                            else
                                if (:PORCEN <> 0 and :PORCEN is not null) then
                                    VALOR = (((:CONC_MONTO/30 * :DIASLAB )+ :CAMBSALTRANS + :INCAP) * :PORCEN) /100;
                                else
                                    if (:MONTOS <> 0 and :MONTOS is not null) then
                                        VALOR = :MONTOS;
                                    else
                                        if (:CONC_MONTO <> 0 and :CONC_MONTO is not null) then
                                            VALOR = :CONC_MONTO;
                            end
                        ITEM = :ITEM + 1;
                        end
                    end /* aportes */
                else if (CONC_PROV = 'S') then
                    begin
                    /*provisiones */
                    HORASEX = null;
                    DIASNOV = null;
                    RETROACT = null;
                    REEMBOLSO = null;
                    BENEFICIOS = null;
                    RECARGO = null;
                    COMISION = null;
                    INCAP = null;
                    /* RECARGO*/
                    BASICO = BASICOEMP;
                    RECARGO = (((:BASICO/30)/8)*:TAR_RECNOTC)*:RECNOCT;
                    RECARGO = :RECARGO + ((((:BASICO/30)/8)*:TAR_RECFEST)*:RECFEST);
                    /*INCAPACIDAD*/
                    select N.NONO_DURA from NOMINA_NOVEDADES N where N.TERC_NIT = :NITE and N.NONO_PERIODO = :PERIODO and N.NONO_ANO = :ANO and (N.TNOV_COD = 2 or (N.TNOV_COD = 3)) into :DIASNOV;
                    if (:DIASNOV is null) then
                        INCAP = 0;
                    else
                        INCAP = (:BASICO / 30)* :DIASNOV;
                    /* BASICO*/
                    BASICO = ((:BASICO/30)*:DIASLAB) - (((:BASICO/30)/8)*:RECNOCT);
                    BASICO = :BASICO - (((:BASICO/30)/8)*:RECFEST);
                    /*BENEFICIOS*/
                    if (PARAMBENEF = 'SI') then
                        begin
                        select sum(CE.EMCO_MONTO)
                            from EMPLEADO_CONCEPTOS CE, CONCEPTOS_NOMINA CN where CN.CONC_BENEFIC = 'S'
                            and (CE.TERC_NIT = :NITE) and (CE.CONC_COD = CN.CONC_COD) and
                            ((CE.EMCO_FECINI <= :FEC and CE.EMCO_FECFIN >= :FEC) or ((CN.CONC_TODOSPER = 'N')
                            and (CE.EMCO_PPAGO = :PERIODO)) or (CN.CONC_TODOSPER = 'S'))
                            into :BENEFICIOS;
                        if (BENEFICIOS is null) then
                            BENEFICIOS = 0;
                        end
                    else
                        BENEFICIOS = 0;
                    if ((CONC_COD <> 929) and (CONC_COD <> 930) and (CONC_COD <> 944)) then
                        begin
                        select P.PAAN_AUXTR, P.PAAN_SALMINIMO from PARAMETROS_ANO P where P.PAAN_ANO = :ANO
                            into :AUXTRANS, :SMLV;
                        if (:BASICO < (:SMLV*2)) then
                            AUXTRANS = (:AUXTRANS / 30) * :DIASLAB;
                        else
                            AUXTRANS = 0;
                        end
                    else
                        AUXTRANS = 0;
                    CONC_MONTO = :BASICO;
                    if (CONC_PORC <> 0 and CONC_PORC is not null) then
                        VALOR = (((:CONC_MONTO)+ :CAMBSALTRANS + :INCAP + :RECARGO + :AUXTRANS + :BENEFICIOS) * :CONC_PORC) /100;
                    else
                        if (PORCEN <> 0 and PORCEN is not null) then
                            VALOR = (((:CONC_MONTO)+ :CAMBSALTRANS + :INCAP + :RECARGO + :AUXTRANS + :BENEFICIOS) * :PORCEN) /100;
                        else
                            if (MONTOS <> 0 and MONTOS is not null) then
                                VALOR = :MONTOS;
                            else
                                if (CONC_MONTO <> 0 and CONC_MONTO is not null) then
                                    VALOR = :CONC_MONTO;
                    ITEM = :ITEM + 1;
                    end /* provision */
                else if (CONC_COD = 920) then /* comisiones */
                    begin
                    select C.NCOM_MONTO from NOMINA_COMISIONES C where C.NCOM_ANO = :ANO and C.NCOM_PERIODO = :PERIODO and C.NCOM_PERIODICIDAD = :PERIODICIDAD and C.TERC_NIT = :NITE into :VALOR;
                    if (VALOR is null) then
                    VALOR = 0;
                    ITEM = :ITEM + 1;
                    end
                else if (CONC_COD = 900 or (:CONC_COD = 931)) then /* horas extra */
                    begin
                    select C.NOEX_MONTO from NOMINA_HORASEXT C where C.NOEX_ANO = :ANO and
                        C.NOEX_PERIODIO = :PERIODO and C.NOEX_PERIODICIDAD = :PERIODICIDAD and C.TERC_NIT = :NITE into :VALOR;
                    if (VALOR is null) then
                        VALOR = 0;
                    ITEM = :ITEM + 1;
                    end
                else if (CONC_COD = 954) then /* cartera */
                    begin
                    select C.NCAR_MONTO from NOMINA_CARTERA C where C.NCAR_ANO = :ANO and C.NCAR_PERIODO = :PERIODO and C.NCAR_PERIODICIDAD = :PERIODICIDAD and C.TERC_NIT = :NITE into :VALOR;
                    if (VALOR is null) then
                        VALOR = 0;
                    ITEM = :ITEM + 1;
                    end
                else if (CONC_COD = 932) then
                    begin
                    /* incapacidad */
                    select N.NONO_DURA from NOMINA_NOVEDADES N where N.TERC_NIT = :NITE and N.NONO_PERIODO = :PERIODO and N.NONO_ANO = :ANO and (N.TNOV_COD = 2 or (N.TNOV_COD = 3)) into :DIASNOV;
                    if (:DIASNOV is null) then
                        VALOR = 0;
                    else
                        VALOR = (:BASICO / 30)* :DIASNOV;
                    end
                else if (CONC_COD = 921) then
                    begin
                    if (PORCEN is not null and PORCEN <> 0) then
                        VALOR = ((BASICO / 30)* :DIASLAB ) * :PORCEN /100;
                    else
                        if (CONC_PORC is not null and CONC_PORC <> 0) then
                            VALOR = ((BASICO / 30)* :DIASLAB ) * :CONC_PORC /100;
                    end
                else if (CONC_COD = 953) then
                    begin
                    /* RECARGO */
                    BASICO = BASICOEMP;
                    VALOR = (((:BASICO/30)/8)*:TAR_RECNOTC)*:RECNOCT;
                    VALOR = :VALOR + ((((:BASICO/30)/8)*:TAR_RECFEST)*:RECFEST);
                    end
                if (CONC_APORTE = 'S') then
                    begin
                    if (ENTIDAD is null or (ENTIDAD = '') ) then
                        ENTIDAD = :CONC_ENTIDAD;
                    end
                end
            if ((VALOR <> 0) and (VALOR is not null)) then
                begin
                execute procedure REDONDEE(:VALOR, :APROX) returning_values (VALOR);
                if ((MENSUAL = 'N') or (PERIODICIDAD = 1))  then
                    insert into NOMINA_CONCEPTOS (NOMI_ID, NOCO_ITEM, CONC_COD,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, NOCO_GTOEMPR)
                        values (:IDNOMINA,:ITEM, :CONCEPT, :NIT_TERCERO, :VALOR, :ENTIDAD, :CONC_DEDUC, :CONC_PROV, :CONC_APORTE, :PERIODO, :ANO, :CONC_MODIFI, :CONC_APLICAPROM, :SALARIO, :GTOEMPR);
                else
                    if (MENSUAL = 'S') then
                        begin
                        if ((:PERIODICIDAD = 2) and (LIQUIDAPER = 1)) then
                            begin
                            if ((PERIODO = 1) or (PERIODO = 3) or (PERIODO = 5) or (PERIODO = 7) or (PERIODO = 9) or (PERIODO = 11)
                                or (PERIODO = 13) or (PERIODO = 15) or (PERIODO = 17) or (PERIODO = 19) or (PERIODO = 21) or (PERIODO = 23)) then
                                insert into NOMINA_CONCEPTOS (NOMI_ID, NOCO_ITEM, CONC_COD,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, NOCO_GTOEMPR)
                                    values (:IDNOMINA,:ITEM, :CONCEPT, :NIT_TERCERO, :VALOR, :ENTIDAD, :CONC_DEDUC, :CONC_PROV, :CONC_APORTE, :PERIODO, :ANO, :CONC_MODIFI, :CONC_APLICAPROM, :SALARIO, :GTOEMPR);
                            end
                        else if ((:PERIODICIDAD = 2) and (LIQUIDAPER = 2)) then
                            begin
                            if ((PERIODO = 2) or (PERIODO = 4) or (PERIODO = 6) or (PERIODO = 8) or (PERIODO = 10) or (PERIODO = 12)
                                or (PERIODO = 14) or (PERIODO = 16) or (PERIODO = 18) or (PERIODO = 20) or (PERIODO = 22) or (PERIODO = 24)) then
                                insert into NOMINA_CONCEPTOS (NOMI_ID, NOCO_ITEM, CONC_COD,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, NOCO_GTOEMPR)
                                    values (:IDNOMINA,:ITEM, :CONCEPT, :NIT_TERCERO, :VALOR, :ENTIDAD, :CONC_DEDUC, :CONC_PROV, :CONC_APORTE, :PERIODO, :ANO, :CONC_MODIFI, :CONC_APLICAPROM, :SALARIO, :GTOEMPR);
                            end
                        else if ((:PERIODICIDAD = 3) and (LIQUIDAPER = 1)) then
                            begin
                            if ((PERIODO = 1) or (PERIODO = 5) or (PERIODO = 9) or (PERIODO = 13) or (PERIODO = 17) or (PERIODO = 21)
                                or (PERIODO = 25) or (PERIODO = 29) or (PERIODO = 33) or (PERIODO = 37) or (PERIODO = 41) or (PERIODO = 45)
                                or (PERIODO = 49)) then
                                insert into NOMINA_CONCEPTOS (NOMI_ID, NOCO_ITEM, CONC_COD,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, NOCO_GTOEMPR)
                                    values (:IDNOMINA,:ITEM, :CONCEPT, :NIT_TERCERO, :VALOR, :ENTIDAD, :CONC_DEDUC, :CONC_PROV, :CONC_APORTE, :PERIODO, :ANO, :CONC_MODIFI, :CONC_APLICAPROM, :SALARIO, :GTOEMPR);
                            end
                        else if ((:PERIODICIDAD = 3) and (LIQUIDAPER = 2)) then
                            begin
                            if ((PERIODO = 2) or (PERIODO = 6) or (PERIODO = 10) or (PERIODO = 14) or (PERIODO = 18) or (PERIODO = 22)
                                or (PERIODO = 26) or (PERIODO = 30) or (PERIODO = 34) or (PERIODO = 38) or (PERIODO = 42) or (PERIODO = 46)
                                or (PERIODO = 50)) then
                                insert into NOMINA_CONCEPTOS (NOMI_ID, NOCO_ITEM, CONC_COD,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, NOCO_GTOEMPR)
                                    values (:IDNOMINA,:ITEM, :CONCEPT, :NIT_TERCERO, :VALOR, :ENTIDAD, :CONC_DEDUC, :CONC_PROV, :CONC_APORTE, :PERIODO, :ANO, :CONC_MODIFI, :CONC_APLICAPROM, :SALARIO, :GTOEMPR);
                            end
                        else if ((:PERIODICIDAD = 3) and (LIQUIDAPER = 3)) then
                            begin
                            if ((PERIODO = 3) or (PERIODO = 7) or (PERIODO = 11) or (PERIODO = 15) or (PERIODO = 19) or (PERIODO = 23)
                                or (PERIODO = 27) or (PERIODO = 31) or (PERIODO = 35) or (PERIODO = 39) or (PERIODO = 43) or (PERIODO = 47)
                                or (PERIODO = 51)) then
                                insert into NOMINA_CONCEPTOS (NOMI_ID, NOCO_ITEM, CONC_COD,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, NOCO_GTOEMPR)
                                    values (:IDNOMINA,:ITEM, :CONCEPT, :NIT_TERCERO, :VALOR, :ENTIDAD, :CONC_DEDUC, :CONC_PROV, :CONC_APORTE, :PERIODO, :ANO, :CONC_MODIFI, :CONC_APLICAPROM, :SALARIO, :GTOEMPR);
                            end
                        else if ((:PERIODICIDAD = 3) and (LIQUIDAPER = 4)) then
                            begin
                            if ((PERIODO = 4) or (PERIODO = 8) or (PERIODO = 12) or (PERIODO = 16) or (PERIODO = 20) or (PERIODO = 24)
                                or (PERIODO = 29) or (PERIODO = 32) or (PERIODO = 36) or (PERIODO = 40) or (PERIODO = 44) or (PERIODO = 48)
                                or (PERIODO = 52)) then
                                insert into NOMINA_CONCEPTOS (NOMI_ID, NOCO_ITEM, CONC_COD,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, NOCO_GTOEMPR)
                                    values (:IDNOMINA,:ITEM, :CONCEPT, :NIT_TERCERO, :VALOR, :ENTIDAD, :CONC_DEDUC, :CONC_PROV, :CONC_APORTE, :PERIODO, :ANO, :CONC_MODIFI, :CONC_APLICAPROM, :SALARIO, :GTOEMPR);
                            end
                        end
                    VALOR = 0;
                    BASICO = 0;
                    end
            end /* for */
        end
    end
suspend;
end
^

SET TERM ; ^

GRANT SELECT,INSERT ON NOMINA TO PROCEDURE CAUSA_NOMINA;

GRANT EXECUTE ON PROCEDURE CAMBIE_ID_NOMINA TO PROCEDURE CAUSA_NOMINA;

GRANT SELECT,INSERT,UPDATE ON NOMINA_CONCEPTOS TO PROCEDURE CAUSA_NOMINA;

GRANT INSERT ON NOMINA_DEPARTAMENTO TO PROCEDURE CAUSA_NOMINA;

GRANT SELECT ON EMPLEADOS TO PROCEDURE CAUSA_NOMINA;

GRANT SELECT ON EMPLEADO_CONCEPTOS TO PROCEDURE CAUSA_NOMINA;

GRANT SELECT ON CONCEPTOS_NOMINA TO PROCEDURE CAUSA_NOMINA;

GRANT EXECUTE ON PROCEDURE DIAS_LABORADOS TO PROCEDURE CAUSA_NOMINA;

GRANT SELECT ON NOMINA_NOVEDADES TO PROCEDURE CAUSA_NOMINA;

GRANT SELECT,UPDATE ON PRESTAMO_CUOTAS TO PROCEDURE CAUSA_NOMINA;

GRANT SELECT ON PRESTAMO_NOMINA TO PROCEDURE CAUSA_NOMINA;

GRANT SELECT ON NOMINA_HORASEXT TO PROCEDURE CAUSA_NOMINA;

GRANT SELECT ON PARAMETROS_ANO TO PROCEDURE CAUSA_NOMINA;

GRANT SELECT ON NOMINA_COMISIONES TO PROCEDURE CAUSA_NOMINA;

GRANT EXECUTE ON PROCEDURE LEE_CONFIGURACION TO PROCEDURE CAUSA_NOMINA;

GRANT EXECUTE ON PROCEDURE REDONDEE TO PROCEDURE CAUSA_NOMINA;

GRANT EXECUTE ON PROCEDURE CAUSA_NOMINA TO PUBLIC;


/* 20100610 : prima en periodo adicional al maximo del año para poder pagar solo */

SET TERM ^ ;

create procedure PERIODO_NOM_FECHA (
    FECHA DATE,
    PERIODICIDAD INTEGER)
returns (
    PERIODO INTEGER,
    ANO INTEGER)
as
declare variable MES INTEGER;
declare variable DIA INTEGER;
begin
DIA = extract (DAY FROM FECHA);
MES = extract (MONTH FROM FECHA);
ANO = extract (YEAR FROM FECHA);
if (PERIODICIDAD = 1) then
    BEGIN
    PERIODO = MES - 1;
    if (MES = 0) then
        BEGIN
        ANO = ANO - 1;
        MES = 12;
        END
    suspend;
    END
ELSE
    if (PERIODICIDAD = 2) then
        BEGIN
        PERIODO = (MES - 1) * 2;
        if (DIA > 15) then
            PERIODO = PERIODO + 1;
        if (PERIODO = 0) then
            BEGIN
            ANO = ANO - 1;
            PERIODO = 24;
            END
        suspend;
        END
    ELSE
        if (PERIODICIDAD = 3) then
            BEGIN
            PERIODO = (MES - 1) * 4;
            if (DIA > 7) then
                PERIODO = PERIODO + 1;
            if (DIA > 15) then
                PERIODO = PERIODO + 1;
            if (DIA > 21) then
                PERIODO = PERIODO + 1;
            if (PERIODO = 0) then
                BEGIN
                ANO = ANO - 1;
                PERIODO = 52;
                END
            suspend;
            END
end
^

SET TERM ; ^

grant EXECUTE ON PROCEDURE periodo_nom_fecha to PUBLIC;

SET TERM ^ ;

CREATE OR ALTER PROCEDURE CAUSA_NOMINA(
    FEC DATE,
    PERIODO INTEGER,
    PERIODICIDAD INTEGER,
    PAGOGLOBAL CHAR(1),
    ANO CHAR(4),
    DEPTO INTEGER)
RETURNS (
    IDNOMINA INTEGER,
    ITEMINI INTEGER)
AS
declare variable ITEM integer;
declare variable NITE varchar(20) character set NONE;
declare variable NIT_TERCERO varchar(20);
declare variable CONCEPT integer;
declare variable MONTOS numeric(18,2);
declare variable PORCEN numeric(9,4);
declare variable ENTIDAD varchar(20);
declare variable CONC_COD integer;
declare variable CONC_DEDUC char(1);
declare variable CONC_PORC numeric(9,4);
declare variable CONC_ENTIDAD integer;
declare variable CONC_MONTO numeric(18,2);
declare variable CONC_MODIFI char(1);
declare variable CONC_PROMEDIO char(1);
declare variable VALOR numeric(18,2);
declare variable DIASLAB integer;
declare variable CONC_PROV char(1);
declare variable CONC_APORTE char(1);
declare variable NUMEROPROM integer;
declare variable CONC_APLICAPROM char(1);
declare variable PERINICIAL integer;
declare variable PERFINAL integer;
declare variable ANOINI integer;
declare variable ANOFIN integer;
declare variable CONC_DIAS char(1);
declare variable CONC_OTROCONC char(1);
declare variable CONC_CODOTROCONC integer;
declare variable ANOSUM integer;
declare variable SALARIO char(1) character set NONE;
declare variable LIQUIDAPER integer;
declare variable BASICO numeric(18,2);
declare variable NITEPS varchar(20);
declare variable NITAFC varchar(20);
declare variable NITAFP varchar(20);
declare variable NITCCF varchar(20);
declare variable GTOEMPR char(1);
declare variable COMISION numeric(18,2);
declare variable CAMBSALTRANS numeric(18,2);
declare variable SALDOSINI numeric(18,2);
declare variable DURANOV integer;
declare variable BASE numeric(18,2);
declare variable APROX integer;
declare variable MENSUAL char(1);
declare variable HORASEX numeric(18,2);
declare variable DIASNOV integer;
declare variable TOMASAL integer;
declare variable RETROACT numeric(18,2);
declare variable REEMBOLSO numeric(18,2);
declare variable INCAP numeric(18,2);
declare variable AUXTRANS numeric(18,2);
declare variable SMLV numeric(18,2);
declare variable BENEFICIOS numeric(18,2);
declare variable CONFIRMADO char(1);
declare variable RECNOCT numeric(18,2);
declare variable RECFEST numeric(18,2);
declare variable TAR_RECNOTC numeric(9,4);
declare variable TAR_RECFEST numeric(9,4);
declare variable RECARGO numeric(18,2);
declare variable BASICOREC numeric(18,2);
declare variable PARAMBENEF char(2);
declare variable VACACDISF numeric(18,2);
declare variable VALORPREDET numeric(18,2);
declare variable BASICOEMP numeric(18,2);
begin
execute procedure LEE_CONFIGURACION('NOMINA','LIQUIDACION','TOMAR BENEFICIOS PARA CALCULAR PROVISIONES')returning_values(:PARAMBENEF);
execute procedure LEE_CONFIGURACION('NOMINA','GENERAL','REDONDEO AL MULTIPLO DE DIEZ EN TOTALES')returning_values(:APROX);
select N.NOMI_ID, N.NOMI_LIQOK from NOMINA N where N.NOMI_PERIODO = :PERIODO and N.NOMI_PERIODOCIDAD = :PERIODICIDAD
    and N.NOMI_ANO = :ANO into :IDNOMINA, :CONFIRMADO;
if (:IDNOMINA is null) then
    begin
    execute procedure CAMBIE_ID_NOMINA returning_values(:IDNOMINA);
    insert into NOMINA (NOMI_ID, NOMI_FECCAUSA, NOMI_PAGOGLOBAL, NOMI_PERIODOCIDAD, NOMI_PERIODO, NOMI_ANO, NOMI_LIQOK)
    values (:IDNOMINA, :FEC,:PAGOGLOBAL, :PERIODICIDAD, :PERIODO, :ANO, 'N');
    ITEM = 1;
    end
else
    begin
    select max(N.NOCO_ITEM) from NOMINA_CONCEPTOS N where N.NOMI_ID = :IDNOMINA
    into :ITEM;
    end
if ((CONFIRMADO = 'S') and (IDNOMINA is not null)) then
    begin
    IDNOMINA = 0;
    end
else
    begin
    insert into NOMINA_DEPARTAMENTO (NOMI_ID, NODP_DEPTO)values(:IDNOMINA,:DEPTO);
    select P.PAAN_RECNOC, P.PAAN_RECFEST from PARAMETROS_ANO P where P.PAAN_ANO = :ANO
        into :TAR_RECNOTC, :TAR_RECFEST;
    ITEMINI = ITEM;
    for select E.TERC_NIT, E.EMPL_EPS, E.EMPL_AFC, E.EMPL_AFP, E.EMPL_CCF
        from EMPLEADOS E
        where E.EMPL_PPAGO = :PERIODICIDAD and ((E.EMPL_FECRET is null) or (E.EMPL_FECRET > :FEC)) and E.EMPL_FECING <= :FEC
        and ((:DEPTO = 0) or (e.empl_dpto = :DEPTO))
        into :NITE, :NITEPS, :NITAFC, :NITAFP, :NITCCF
        do
        begin
        select first 1 M.MVSE_SALARIO from MOVIMIENTO_SALARIO_EMPLEADO M where M.TERC_NIT = :NITE and M.MVSE_FECHA <= :FEC order by M.MVSE_FECHA desc into :BASICOEMP;
        BASICO = BASICOEMP;
        RECNOCT = null;
        RECFEST = null;
        select N.NOEX_RECNOCT, N.NOEX_RECFEST
            from NOMINA_HORASEXT N where N.NOEX_PERIODIO = :PERIODO and N.NOEX_ANO = :ANO and N.TERC_NIT = :NITE
            into :RECNOCT, :RECFEST;
        if (RECNOCT is null) then
            RECNOCT = 0;
        if (RECFEST is null) then
            RECFEST = 0;
        for select CE.TERC_NIT, CE.CONC_COD, CE.EMCO_MONTO, CE.EMCO_PORC, CE.EMPL_ENTIDAD, CE.EMCO_PERPROM, CE.EMCO_LUQUIDAPER, CE.EMCO_MENSUAL, CN.CONC_COD, CN.CONC_DEDUC,CN.CONC_PORC, CN.CONC_ENTIDAD, CN.CONC_MONTO,  CN.CONC_DIAS, CN.CONC_MODIFI,
            CN.CONC_PROMEDIO, CN.CONC_SALARIO, CN.CONC_PROV, CN.CONC_APORTE, CN.CONC_APLICAPROM, CN.CONC_OTROCONC, CN.CONC_CODOTROCONC, CN.CONC_GTOEMPR, CN.CONC_BASE, CE.EMCO_TOMSAL
            from EMPLEADO_CONCEPTOS CE, CONCEPTOS_NOMINA CN where (CE.CONC_COD = CN.CONC_COD) and (CE.TERC_NIT = :NITE) and
            ( ((CE.EMCO_FECINI <= :FEC and CE.EMCO_FECFIN >= :FEC)) or
            ((CN.CONC_TODOSPER = 'N') and (CE.EMCO_PPAGO = :PERIODO)) or ((CN.CONC_TODOSPER = 'S') AND (((:periodicidad = 1) AND (:PERIODO < 13)) or ((:periodicidad = 2) AND (:PERIODO < 25)))) )  order by (TERC_NIT )
            into :NIT_TERCERO, :CONCEPT,  :MONTOS, :PORCEN, :ENTIDAD, :NUMEROPROM, :LIQUIDAPER, :MENSUAL ,:CONC_COD, :CONC_DEDUC, :CONC_PORC,
            :CONC_ENTIDAD, :CONC_MONTO, :CONC_DIAS, :CONC_MODIFI,:CONC_PROMEDIO, :SALARIO,:CONC_PROV, :CONC_APORTE , :CONC_APLICAPROM, :CONC_OTROCONC, :CONC_CODOTROCONC, :GTOEMPR, :BASE, :TOMASAL
            do
            begin
            if (CONC_DIAS = 'S') then
                execute procedure DIAS_LABORADOS (:NITE, :PERIODO, :FEC, :MENSUAL,:CONC_APORTE) returning_values (:DIASLAB);
            else
                DIASLAB = 15;
            if (:TOMASAL <> 0) then
                begin
                /* SI EL CONCEPTO NOAPLICA EN ESTE PERIODO DEJE EL BASICO EN CERO */
                if ((:PERIODICIDAD = 2) and (:TOMASAL <> 2)) then
                    begin
                    if ((PERIODO = 2) or (PERIODO = 4) or (PERIODO = 6) or (PERIODO = 8) or (PERIODO = 10) or (PERIODO = 12)
                        or (PERIODO = 14) or (PERIODO = 16) or (PERIODO = 18) or (PERIODO = 20) or (PERIODO = 22) or (PERIODO = 24)) then
                        BASICO = 0;
                    end
                else
                    if ((:PERIODICIDAD = 3) and (:TOMASAL <> 1)) then
                        begin
                        if ((PERIODO = 1) or (PERIODO = 5) or (PERIODO = 9) or (PERIODO = 13) or (PERIODO = 17) or (PERIODO = 21)
                            or (PERIODO = 25) or (PERIODO = 29) or (PERIODO = 33) or (PERIODO = 37) or (PERIODO = 41) or (PERIODO = 45)
                            or (PERIODO = 49)) then
                            BASICO = 0;
                        end
                    else
                        if ((:PERIODICIDAD = 3) and (:TOMASAL <> 2)) then
                            begin
                            if ((PERIODO = 2) or (PERIODO = 6) or (PERIODO = 10) or (PERIODO = 14) or (PERIODO = 18) or (PERIODO = 22)
                                or (PERIODO = 26) or (PERIODO = 30) or (PERIODO = 34) or (PERIODO = 38) or (PERIODO = 42) or (PERIODO = 46)
                                or (PERIODO = 50)) then
                                BASICO = 0;
                            end
                        else
                            if ((:PERIODICIDAD = 3) and (:TOMASAL <> 3)) then
                                begin
                                if ((PERIODO = 3) or (PERIODO = 7) or (PERIODO = 11) or (PERIODO = 15) or (PERIODO = 19) or (PERIODO = 23)
                                    or (PERIODO = 27) or (PERIODO = 31) or (PERIODO = 35) or (PERIODO = 39) or (PERIODO = 43) or (PERIODO = 47)
                                    or (PERIODO = 51)) then
                                    BASICO = 0;
                                end
                            else
                                if ((:PERIODICIDAD = 3) and (:TOMASAL <> 4)) then
                                begin
                                if ((PERIODO = 4) or (PERIODO = 8) or (PERIODO = 12) or (PERIODO = 16) or (PERIODO = 20) or (PERIODO = 24)
                                    or (PERIODO = 29) or (PERIODO = 32) or (PERIODO = 36) or (PERIODO = 40) or (PERIODO = 44) or (PERIODO = 48)
                                    or (PERIODO = 52)) then
                                    BASICO = 0;
                                end
                end
            else
                begin
                /* SE CALCULA SOBRE TODOS LOS PERIODOS */
                BASICO = BASICOEMP;
                end
            VALORPREDET = null;
            select VP.NVPR_MONTO from NOMINA_VALOR_PREDET VP where VP.NVPR_PERIODICIDAD = :PERIODICIDAD and VP.NVPR_PERIODO = :PERIODO and VP.NVPR_ANO = :ANO and VP.CONC_COD = :CONC_COD and VP.TERC_NIT = :NITE
                into :VALORPREDET;
            if ((:VALORPREDET <> 0) and (VALORPREDET is not null)) then
                VALOR = VALORPREDET;
            else
                begin
                /* SI HAY UN CAMBIO TRANSITORIO DE SALARIO AJUSTE LOS DIAS Y CALCULE EL VALOR A SUMAR */
                select ((N.NONO_VALOR /30) * N.NONO_DURA), (N.NONO_DURA) from NOMINA_NOVEDADES N
                    where N.TNOV_COD = 11 and N.TERC_NIT = :NITE and N.NONO_PERIODO = :PERIODO into :CAMBSALTRANS, :DURANOV;
                if (CAMBSALTRANS is null) then
                    CAMBSALTRANS = 0;
                if (DURANOV is null) then
                    DURANOV = 0;
                DIASLAB = :DIASLAB - :DURANOV;
                /* SI ES UN PRESTAMO, TRAIGA LA CUOTA */
                if (CONC_COD = 922) then
                    begin
                    select sum(P.PRCU_MONTO) from PRESTAMO_CUOTAS P, PRESTAMO_NOMINA PN
                        where P.PRCU_ANO = :ANO and P.PRCU_PERIODO = :PERIODO and PN.PRNO_ID = P.PRNO_ID and PN.TERC_NIT = :NITE into :VALOR;
                    if (VALOR is null) then
                        VALOR = 0;
                    ITEM = :ITEM + 1;
                    /* MARQUE LA CUOTA COMO PAGADA */
                    update PRESTAMO_CUOTAS  P set PRCU_OK = 'S' where P.PRCU_ANO = :ANO and P.PRCU_PERIODO = :PERIODO and P.PRNO_ID = (select PN.PRNO_ID from PRESTAMO_NOMINA PN where PN.TERC_NIT = :NITE);
                    end
                else
                    if ((:MONTOS = 0) or (:MONTOS is null)) then
                        begin
                        /* SI EL CONCEPTO DEL EMPLEADO NO TIENE MONTO TRAIGA EL DE CONCEPTOS_NOMINA */
                        if ((CONC_PORC = 0 and :PORCEN = 0) or (CONC_PORC is null and :PORCEN = 0) or (CONC_PORC = 0 and :PORCEN is null) or (CONC_PORC is null and :PORCEN is null) ) then
                            begin
                            /* SIN PORCENTAJE */
                            if ((CONC_MONTO <> 0) and (CONC_MONTO is not null) ) then
                                begin
                                VALOR = :CONC_MONTO;
                                if (:CONC_DIAS = 'S') then
                                    VALOR = (:VALOR / 30) * :DIASLAB;
                                end
                            else
                                if (SALARIO = 'S' and CONC_COD <> 900 and CONC_COD <> 920 and CONC_COD <> 932 and CONC_COD <> 953) then
                                    begin
                                    /* SI ES SALARIO SUME LAS EXTRAS */
                                    BASICO = BASICOEMP;
                                    BASICO = ((:BASICO/30)*:DIASLAB) - (((:BASICO/30)/8)*:RECNOCT);/* PFP:DEBERIA SER + Y POR LA TARIFA QUE NO VEO POR NINGUN LADO */
                                    BASICO = :BASICO - (((:BASICO/30)/8)*:RECFEST);
                                    CONC_MONTO = :BASICO;
                                    VALOR = (:CONC_MONTO/*/30 * :diaslab*/ ) + :CAMBSALTRANS;
                                    end
                                else
                                    begin
                                    VALOR = MONTOS;
                                    if (:CONC_DIAS = 'S') then
                                        VALOR = (:VALOR / 30) * :DIASLAB;
                                    end
                            end
                        else    
                            begin
                            if (:PORCEN <> 0) then
                                begin
                                /* SI TIENE PORCENTAJE EN EMPLEADO_CONCEPTOS PERO EL MONTO SE TRAE DE CONCPETOS_NOMINA */
                                if ((CONC_MONTO <> 0) and (CONC_MONTO is not null) ) then
                                    begin
                                    VALOR = ((:CONC_MONTO ) * :PORCEN) /100;
                                    end
                                end
                            else
                                begin
                                /* NO TIENE PORCENTAJE EN EMPLEADO_CONCEPTOS SE TRAE MONTO Y PORC DE CONCPETOS_NOMINA */
                                if ((CONC_MONTO <> 0) and (CONC_MONTO is not null) ) then
                                    begin
                                    VALOR = ((:CONC_MONTO) * :CONC_PORC) /100;
                                    end
                                else
                                    if (SALARIO = 'S' and CONC_COD <> 900 and CONC_COD <> 920 and CONC_COD <> 932 and CONC_COD <> 953) then
                                        begin
                                        BASICO = BASICOEMP;
                                        BASICO = ((:BASICO/30)*:DIASLAB) - (((:BASICO/30)/8)*:RECNOCT);
                                        BASICO = :BASICO - (((:BASICO/30)/8)*:RECFEST);
                                        CONC_MONTO = :BASICO;
                                        VALOR = ((:CONC_MONTO)+ :CAMBSALTRANS * :CONC_PORC) /100;
                                        end
                                    else
                                        if (:CONC_MONTO = 0 and :MONTOS = 0) then
                                            begin
                                            CONC_MONTO = :BASICO;
                                            VALOR = (((:CONC_MONTO / 30) * :DIASLAB) + :CAMBSALTRANS * :CONC_PORC) /100;
                                            end
                                end
                            end
                        end
                    else
                        /* SI TIENE MONTO EN EMPLEADO_CONCEPTOS */
                        if ((CONC_PORC = 0 or (CONC_PORC is null)) and (:PORCEN = 0 or (PORCEN is null))) then
                            begin
                            VALOR = (:MONTOS);
                            if (:CONC_DIAS = 'S') then
                                VALOR = (:VALOR / 30) * :DIASLAB;   
                            end
                        else
                            if (:PORCEN <> 0 and PORCEN is not null) then
                                begin
                                VALOR = ((:MONTOS ) * :PORCEN) /100;
                                end
                            else
                                begin
                                VALOR = ((:MONTOS) * :CONC_PORC) /100;
                                end
                if (CONC_PROMEDIO = 'S') then
                    begin
                    /* CALCULO DEL PROMEDIO BASE DESDE LA FECHA MENOS EL NUMERO DE PERIODOS */
                    EXECUTE PROCEDURE periodo_nom_fecha (:fec, :periodicidad) returning_values (:perfinal, :anofin);
                    if (perfinal < numeroprom) then
                        BEGIN
                        anoini = anofin - 1;
                        if (periodicidad = 1) then
                            perinicial = 12 - (numeroprom - perfinal) + 1;
                        if (periodicidad = 2) then
                            perinicial = 24 - (numeroprom - perfinal) + 1;
                        if (periodicidad = 3) then
                            perinicial = 52 - (numeroprom - perfinal) + 1;
                        END
                    ELSE
                        PERINICIAL = :perfinal - :NUMEROPROM;
                    if (anoini <> anofin) then
                        select sum (NOCO_VALOR) from NOMINA_CONCEPTOS N where N.NOCO_APLICAPROM = 'S' and
                            ((N.NOCO_PERIODO >= :PERINICIAL and N.NOCO_ANO = :anoini) or
                            (N.NOCO_PERIODO <= :perfinal and N.NOCO_ANO = :anofin)) and TERC_NIT = :NITE into :VALOR;
                    else
                        select sum (NOCO_VALOR) from NOMINA_CONCEPTOS N where N.NOCO_APLICAPROM = 'S' and
                            N.NOCO_PERIODO >= :PERINICIAL and N.NOCO_ANO = :anoini
                            and N.NOCO_PERIODO <= :perfinal and TERC_NIT = :NITE into :VALOR;
                    VALOR = VALOR / NUMEROPROM;
                    /* sume el saldo inicial */
                    SALDOSINI = 0;
                    select NOCO_VALOR from NOMINA_CONCEPTOS where CONC_COD = :CONC_COD and TERC_NIT  = :NITE and NOCO_PAGOOK = 'N' and NOCO_PERIODO = 0 into :SALDOSINI;
                    if (SALDOSINI is null) then
                        SALDOSINI = 0;
                    else
                        update NOMINA_CONCEPTOS N set NOCO_PAGOOK = 'S' where N.NOCO_APLICAPROM = 'S' and
                            CONC_COD = :CONC_COD and TERC_NIT = :NITE and NOCO_PERIODO = 0;

                    VALOR = :VALOR + :SALDOSINI;
                    end
                else if (CONC_OTROCONC = 'S') then
                    begin
                    ANOSUM = cast(ANO as integer);
                    ANOSUM = ANOSUM - 1;
                    select sum (NOCO_VALOR) from NOMINA_CONCEPTOS N where N.NOCO_ANO = :ANOSUM and N.CONC_COD = :CONC_CODOTROCONC and N.TERC_NIT = :NITE into :VALOR;
                    select NOCO_VALOR from NOMINA_CONCEPTOS where NOCO_ANO = :ANOSUM and CONC_COD = :CONC_CODOTROCONC and TERC_NIT = :NITE and NOCO_PERIODO = 0 into :SALDOSINI;
                    if (SALDOSINI is null) then
                        SALDOSINI = 0;
                    else
                        update NOMINA_CONCEPTOS set NOCO_PAGOOK = 'S' where NOCO_ANO = :ANOSUM and CONC_COD = :CONC_CODOTROCONC and NOCO_PERIODO = 0 and TERC_NIT = :NITE;
                    VALOR = :VALOR + :SALDOSINI;
                    update NOMINA_CONCEPTOS set NOCO_PAGOOK = 'S' where NOCO_ANO = :ANOSUM and CONC_COD = :CONC_CODOTROCONC and TERC_NIT = :NITE;
                    end
                else if (CONC_APORTE = 'S') then
                    begin
                    HORASEX = null;
                    DIASNOV = null;
                    RETROACT = null;
                    REEMBOLSO = null;
                    BENEFICIOS = null;
                    RECARGO = null;
                    COMISION = null;
                    INCAP = null;
                    VACACDISF = null;
                    if ((:ENTIDAD = '' ) or (ENTIDAD is null)) then
                        begin
                        /*COMISIONES*/
                        select C.NCOM_MONTO from NOMINA_COMISIONES C where C.NCOM_ANO = :ANO
                            and C.NCOM_PERIODO = :PERIODO and C.NCOM_PERIODICIDAD = :PERIODICIDAD and C.TERC_NIT = :NITE
                            into :COMISION;
                        if (COMISION is null) then
                            COMISION = 0;
                        /*RETROACTIVO*/
                        select C.EMCO_MONTO from EMPLEADO_CONCEPTOS C where C.TERC_NIT = :NITE
                            and C.CONC_COD = 933 into :RETROACT;
                            if (RETROACT is null ) then
                                RETROACT = 0;
                        /*REEMBOLSO*/
                        select C.EMCO_MONTO from EMPLEADO_CONCEPTOS C where C.TERC_NIT = :NITE
                            and C.CONC_COD = 952 into :REEMBOLSO;
                        if (REEMBOLSO is null ) then
                            REEMBOLSO = 0;
                        /*VACACIONES DISFRUTADAS ANTERIORMENTE*/
                        select C.EMCO_MONTO from EMPLEADO_CONCEPTOS C where C.TERC_NIT = :NITE
                            and C.CONC_COD = 955 into :VACACDISF;
                        if (VACACDISF is null ) then
                            VACACDISF = 0;
                        /* INCAPACIDAD*/
                        select N.NONO_DURA from NOMINA_NOVEDADES N where N.TERC_NIT = :NITE
                            and N.NONO_PERIODO = :PERIODO and N.NONO_ANO = :ANO and (N.TNOV_COD = 2 or (N.TNOV_COD = 3))
                            into :DIASNOV;
                        if (:DIASNOV is null) then
                            INCAP = 0;
                        else
                            INCAP = (:BASICO / 30)* :DIASNOV;
                        /*BASICO*/
                        BASICO = ((:BASICO/30)*:DIASLAB) - (((:BASICO/30)/8)*:RECNOCT);
                        BASICO = :BASICO - (((:BASICO/30)/8)*:RECFEST);
                        /*HORAS EXTRA*/
                        select C.NOEX_MONTO from NOMINA_HORASEXT C where C.NOEX_ANO = :ANO
                            and C.NOEX_PERIODIO = :PERIODO and C.NOEX_PERIODICIDAD = :PERIODICIDAD and C.TERC_NIT = :NITE
                            into :HORASEX;
                        if (HORASEX is null) then
                            HORASEX = 0;
                        /*RECARGOS*/
                        BASICOREC = BASICOEMP;
                        RECARGO = (((:BASICOREC/30)/8)*:TAR_RECNOTC)*:RECNOCT;
                        RECARGO = :RECARGO + ((((:BASICOREC/30)/8)*:TAR_RECFEST)*:RECFEST);
                        if (RECARGO is null) then
                            RECARGO = 0;
                        /*basico*/
                        if (:BASICO + :COMISION + :HORASEX + :RETROACT+ :REEMBOLSO + :INCAP+ :CAMBSALTRANS < ((:SMLV/30)*:DIASLAB)) then
                            BASICO = (:SMLV/30)*:DIASLAB;
                        /* SMLV Y AUX. TRANSPORTE*/
                        select P.PAAN_AUXTR, P.PAAN_SALMINIMO from PARAMETROS_ANO P
                            where P.PAAN_ANO = :ANO into :AUXTRANS, :SMLV;
                        /*BASE*/
                        VALOR = :BASICO + :COMISION + :HORASEX + :RETROACT+ :REEMBOLSO + :INCAP + :RECARGO + :CAMBSALTRANS + :VACACDISF;
                        if (CONC_COD = 904) then
                            begin
                            ENTIDAD = :NITAFP;
                            select A.PAAN_AFPTR from PARAMETROS_ANO A where A.PAAN_ANO = :ANO into :PORCEN;
                            VALOR = ((:VALOR) * :PORCEN) /100;
                            end
                        else if ((CONC_COD = 905) or (CONC_COD = 906) or (CONC_COD = 934) ) then
                            begin
                            ENTIDAD = :NITAFP;
                            select A.PAAN_AFPEM from PARAMETROS_ANO A where A.PAAN_ANO = :ANO into :PORCEN;
                            VALOR = ((:VALOR) * :PORCEN) /100;
                            end
                        else if ((CONC_COD = 907) or (CONC_COD = 914) or (CONC_COD = 915) or (conc_cod = 938)) then
                            begin
                            ENTIDAD = :NITEPS;
                            if (CONC_COD = 907) then
                                begin
                                select A.PAAN_EPSTR from PARAMETROS_ANO A where A.PAAN_ANO = :ANO into :PORCEN;
                                VALOR = ((:VALOR) * :PORCEN) /100;
                                end
                            else
                                begin
                                select A.PAAN_EPSEM from PARAMETROS_ANO A where A.PAAN_ANO = :ANO into :PORCEN;
                                    VALOR = ((:VALOR) * :PORCEN) /100;
                                end
                            end
                        else if ((CONC_COD = 910) or (CONC_COD = 911) or (CONC_COD = 936)) then
                            begin
                            /*ccf */
                            ENTIDAD = :NITCCF;
                            select A.PAAN_CCF from PARAMETROS_ANO A where A.PAAN_ANO = :ANO into :PORCEN;
                            VALOR = ((:VALOR) * :PORCEN) /100;
                            end
                        else if ((CONC_COD = 916) or (CONC_COD = 917) or (CONC_COD = 939) ) then
                            begin
                            /*icbf */
                            ENTIDAD = :NITCCF;
                            select A.PAAN_ICBF from PARAMETROS_ANO A where A.PAAN_ANO = :ANO into :PORCEN;
                            VALOR = ((:VALOR) * :PORCEN) /100;
                            end
                        else if ((CONC_COD = 918) or (CONC_COD = 919) or (CONC_COD = 940) ) then
                            begin
                            /*sena */
                            ENTIDAD = :NITCCF;
                            select A.PAAN_SENA from PARAMETROS_ANO A where A.PAAN_ANO = :ANO into :PORCEN;
                            VALOR = ((:VALOR) * :PORCEN) /100;
                            end
                        else if ((CONC_COD = 912) or (CONC_COD = 913) or (CONC_COD = 937)) then
                            begin
                            /* CESANTIAS */
                            ENTIDAD = :NITAFC;
                            if (PARAMBENEF = 'SI') then
                                begin
                                select sum(CE.EMCO_MONTO)
                                    from EMPLEADO_CONCEPTOS CE, CONCEPTOS_NOMINA CN where CN.CONC_BENEFIC = 'S' and (CE.TERC_NIT = :NITE) and (CE.CONC_COD = CN.CONC_COD) and
                                    ((CE.EMCO_FECINI <= :FEC and CE.EMCO_FECFIN >= :FEC) or ((CN.CONC_TODOSPER = 'N') and (CE.EMCO_PPAGO = :PERIODO)) or
                                    (CN.CONC_TODOSPER = 'S'))
                                    into :BENEFICIOS;
                                if (BENEFICIOS is null) then
                                    BENEFICIOS = 0;
                                end
                            else
                                BENEFICIOS = 0;
                            select P.PAAN_AUXTR, P.PAAN_SALMINIMO from PARAMETROS_ANO P
                                where P.PAAN_ANO = :ANO into :AUXTRANS, :SMLV;
                            if (:BASICO < (:SMLV*2)) then
                                AUXTRANS = (:AUXTRANS / 30) * :DIASLAB;
                            else
                                AUXTRANS = 0;
                            select A.PAAN_CESEMP from PARAMETROS_ANO A where A.PAAN_ANO = :ANO
                                into :PORCEN;
                            VALOR = ((:VALOR + :AUXTRANS + :BENEFICIOS) * :PORCEN) /100;
                            end
                        else
                            begin
                            if (COMISION is null) then
                                COMISION = 0;
                            select C.NCOM_MONTO from NOMINA_COMISIONES C where C.NCOM_ANO = :ANO and C.NCOM_PERIODO = :PERIODO and C.NCOM_PERIODICIDAD = :PERIODICIDAD and C.TERC_NIT = :NITE
                                into :COMISION;
                            CONC_MONTO = :BASICO + :COMISION;
                            if (CONC_PORC <> 0 and CONC_PORC is not null) then
                                VALOR = (((:CONC_MONTO/30 * :DIASLAB )+ :CAMBSALTRANS + :INCAP) * :CONC_PORC) /100;
                            else
                                if (:PORCEN <> 0 and :PORCEN is not null) then
                                    VALOR = (((:CONC_MONTO/30 * :DIASLAB )+ :CAMBSALTRANS + :INCAP) * :PORCEN) /100;
                                else
                                    if (:MONTOS <> 0 and :MONTOS is not null) then
                                        VALOR = :MONTOS;
                                    else
                                        if (:CONC_MONTO <> 0 and :CONC_MONTO is not null) then
                                            VALOR = :CONC_MONTO;
                            end
                        ITEM = :ITEM + 1;
                        end
                    end /* aportes */
                else if (CONC_PROV = 'S') then
                    begin
                    /*provisiones */
                    HORASEX = null;
                    DIASNOV = null;
                    RETROACT = null;
                    REEMBOLSO = null;
                    BENEFICIOS = null;
                    RECARGO = null;
                    COMISION = null;
                    INCAP = null;
                    /* RECARGO*/
                    BASICO = BASICOEMP;
                    RECARGO = (((:BASICO/30)/8)*:TAR_RECNOTC)*:RECNOCT;
                    RECARGO = :RECARGO + ((((:BASICO/30)/8)*:TAR_RECFEST)*:RECFEST);
                    /*INCAPACIDAD*/
                    select N.NONO_DURA from NOMINA_NOVEDADES N where N.TERC_NIT = :NITE and N.NONO_PERIODO = :PERIODO and N.NONO_ANO = :ANO and (N.TNOV_COD = 2 or (N.TNOV_COD = 3)) into :DIASNOV;
                    if (:DIASNOV is null) then
                        INCAP = 0;
                    else
                        INCAP = (:BASICO / 30)* :DIASNOV;
                    /* BASICO*/
                    BASICO = ((:BASICO/30)*:DIASLAB) - (((:BASICO/30)/8)*:RECNOCT);
                    BASICO = :BASICO - (((:BASICO/30)/8)*:RECFEST);
                    /*BENEFICIOS*/
                    if (PARAMBENEF = 'SI') then
                        begin
                        select sum(CE.EMCO_MONTO)
                            from EMPLEADO_CONCEPTOS CE, CONCEPTOS_NOMINA CN where CN.CONC_BENEFIC = 'S'
                            and (CE.TERC_NIT = :NITE) and (CE.CONC_COD = CN.CONC_COD) and
                            ((CE.EMCO_FECINI <= :FEC and CE.EMCO_FECFIN >= :FEC) or ((CN.CONC_TODOSPER = 'N')
                            and (CE.EMCO_PPAGO = :PERIODO)) or (CN.CONC_TODOSPER = 'S'))
                            into :BENEFICIOS;
                        if (BENEFICIOS is null) then
                            BENEFICIOS = 0;
                        end
                    else
                        BENEFICIOS = 0;
                    if ((CONC_COD <> 929) and (CONC_COD <> 930) and (CONC_COD <> 944)) then
                        begin
                        select P.PAAN_AUXTR, P.PAAN_SALMINIMO from PARAMETROS_ANO P where P.PAAN_ANO = :ANO
                            into :AUXTRANS, :SMLV;
                        if (:BASICO < (:SMLV*2)) then
                            AUXTRANS = (:AUXTRANS / 30) * :DIASLAB;
                        else
                            AUXTRANS = 0;
                        end
                    else
                        AUXTRANS = 0;
                    CONC_MONTO = :BASICO;
                    if (CONC_PORC <> 0 and CONC_PORC is not null) then
                        VALOR = (((:CONC_MONTO)+ :CAMBSALTRANS + :INCAP + :RECARGO + :AUXTRANS + :BENEFICIOS) * :CONC_PORC) /100;
                    else
                        if (PORCEN <> 0 and PORCEN is not null) then
                            VALOR = (((:CONC_MONTO)+ :CAMBSALTRANS + :INCAP + :RECARGO + :AUXTRANS + :BENEFICIOS) * :PORCEN) /100;
                        else
                            if (MONTOS <> 0 and MONTOS is not null) then
                                VALOR = :MONTOS;
                            else
                                if (CONC_MONTO <> 0 and CONC_MONTO is not null) then
                                    VALOR = :CONC_MONTO;
                    ITEM = :ITEM + 1;
                    end /* provision */
                else if (CONC_COD = 920) then /* comisiones */
                    begin
                    select C.NCOM_MONTO from NOMINA_COMISIONES C where C.NCOM_ANO = :ANO and C.NCOM_PERIODO = :PERIODO and C.NCOM_PERIODICIDAD = :PERIODICIDAD and C.TERC_NIT = :NITE into :VALOR;
                    if (VALOR is null) then
                    VALOR = 0;
                    ITEM = :ITEM + 1;
                    end
                else if (CONC_COD = 900 or (:CONC_COD = 931)) then /* horas extra */
                    begin
                    select C.NOEX_MONTO from NOMINA_HORASEXT C where C.NOEX_ANO = :ANO and
                        C.NOEX_PERIODIO = :PERIODO and C.NOEX_PERIODICIDAD = :PERIODICIDAD and C.TERC_NIT = :NITE into :VALOR;
                    if (VALOR is null) then
                        VALOR = 0;
                    ITEM = :ITEM + 1;
                    end
                else if (CONC_COD = 954) then /* cartera */
                    begin
                    select C.NCAR_MONTO from NOMINA_CARTERA C where C.NCAR_ANO = :ANO and C.NCAR_PERIODO = :PERIODO and C.NCAR_PERIODICIDAD = :PERIODICIDAD and C.TERC_NIT = :NITE into :VALOR;
                    if (VALOR is null) then
                        VALOR = 0;
                    ITEM = :ITEM + 1;
                    end
                else if (CONC_COD = 932) then
                    begin
                    /* incapacidad */
                    select N.NONO_DURA from NOMINA_NOVEDADES N where N.TERC_NIT = :NITE and N.NONO_PERIODO = :PERIODO and N.NONO_ANO = :ANO and (N.TNOV_COD = 2 or (N.TNOV_COD = 3)) into :DIASNOV;
                    if (:DIASNOV is null) then
                        VALOR = 0;
                    else
                        VALOR = (:BASICO / 30)* :DIASNOV;
                    end
                else if (CONC_COD = 921) then
                    begin
                    if (PORCEN is not null and PORCEN <> 0) then
                        VALOR = ((BASICO / 30)* :DIASLAB ) * :PORCEN /100;
                    else
                        if (CONC_PORC is not null and CONC_PORC <> 0) then
                            VALOR = ((BASICO / 30)* :DIASLAB ) * :CONC_PORC /100;
                    end
                else if (CONC_COD = 953) then
                    begin
                    /* RECARGO */
                    BASICO = BASICOEMP;
                    VALOR = (((:BASICO/30)/8)*:TAR_RECNOTC)*:RECNOCT;
                    VALOR = :VALOR + ((((:BASICO/30)/8)*:TAR_RECFEST)*:RECFEST);
                    end
                if (CONC_APORTE = 'S') then
                    begin
                    if (ENTIDAD is null or (ENTIDAD = '') ) then
                        ENTIDAD = :CONC_ENTIDAD;
                    end
                end
            if ((VALOR <> 0) and (VALOR is not null)) then
                begin
                execute procedure REDONDEE(:VALOR, :APROX) returning_values (VALOR);
                if ((MENSUAL = 'N') or (PERIODICIDAD = 1))  then
                    insert into NOMINA_CONCEPTOS (NOMI_ID, NOCO_ITEM, CONC_COD,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, NOCO_GTOEMPR)
                        values (:IDNOMINA,:ITEM, :CONCEPT, :NIT_TERCERO, :VALOR, :ENTIDAD, :CONC_DEDUC, :CONC_PROV, :CONC_APORTE, :PERIODO, :ANO, :CONC_MODIFI, :CONC_APLICAPROM, :SALARIO, :GTOEMPR);
                else
                    if (MENSUAL = 'S') then
                        begin
                        if ((:PERIODICIDAD = 2) and (LIQUIDAPER = 1)) then
                            begin
                            if ((PERIODO = 1) or (PERIODO = 3) or (PERIODO = 5) or (PERIODO = 7) or (PERIODO = 9) or (PERIODO = 11)
                                or (PERIODO = 13) or (PERIODO = 15) or (PERIODO = 17) or (PERIODO = 19) or (PERIODO = 21) or (PERIODO = 23)) then
                                insert into NOMINA_CONCEPTOS (NOMI_ID, NOCO_ITEM, CONC_COD,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, NOCO_GTOEMPR)
                                    values (:IDNOMINA,:ITEM, :CONCEPT, :NIT_TERCERO, :VALOR, :ENTIDAD, :CONC_DEDUC, :CONC_PROV, :CONC_APORTE, :PERIODO, :ANO, :CONC_MODIFI, :CONC_APLICAPROM, :SALARIO, :GTOEMPR);
                            end
                        else if ((:PERIODICIDAD = 2) and (LIQUIDAPER = 2)) then
                            begin
                            if ((PERIODO = 2) or (PERIODO = 4) or (PERIODO = 6) or (PERIODO = 8) or (PERIODO = 10) or (PERIODO = 12)
                                or (PERIODO = 14) or (PERIODO = 16) or (PERIODO = 18) or (PERIODO = 20) or (PERIODO = 22) or (PERIODO = 24)) then
                                insert into NOMINA_CONCEPTOS (NOMI_ID, NOCO_ITEM, CONC_COD,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, NOCO_GTOEMPR)
                                    values (:IDNOMINA,:ITEM, :CONCEPT, :NIT_TERCERO, :VALOR, :ENTIDAD, :CONC_DEDUC, :CONC_PROV, :CONC_APORTE, :PERIODO, :ANO, :CONC_MODIFI, :CONC_APLICAPROM, :SALARIO, :GTOEMPR);
                            end
                        else if ((:PERIODICIDAD = 3) and (LIQUIDAPER = 1)) then
                            begin
                            if ((PERIODO = 1) or (PERIODO = 5) or (PERIODO = 9) or (PERIODO = 13) or (PERIODO = 17) or (PERIODO = 21)
                                or (PERIODO = 25) or (PERIODO = 29) or (PERIODO = 33) or (PERIODO = 37) or (PERIODO = 41) or (PERIODO = 45)
                                or (PERIODO = 49)) then
                                insert into NOMINA_CONCEPTOS (NOMI_ID, NOCO_ITEM, CONC_COD,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, NOCO_GTOEMPR)
                                    values (:IDNOMINA,:ITEM, :CONCEPT, :NIT_TERCERO, :VALOR, :ENTIDAD, :CONC_DEDUC, :CONC_PROV, :CONC_APORTE, :PERIODO, :ANO, :CONC_MODIFI, :CONC_APLICAPROM, :SALARIO, :GTOEMPR);
                            end
                        else if ((:PERIODICIDAD = 3) and (LIQUIDAPER = 2)) then
                            begin
                            if ((PERIODO = 2) or (PERIODO = 6) or (PERIODO = 10) or (PERIODO = 14) or (PERIODO = 18) or (PERIODO = 22)
                                or (PERIODO = 26) or (PERIODO = 30) or (PERIODO = 34) or (PERIODO = 38) or (PERIODO = 42) or (PERIODO = 46)
                                or (PERIODO = 50)) then
                                insert into NOMINA_CONCEPTOS (NOMI_ID, NOCO_ITEM, CONC_COD,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, NOCO_GTOEMPR)
                                    values (:IDNOMINA,:ITEM, :CONCEPT, :NIT_TERCERO, :VALOR, :ENTIDAD, :CONC_DEDUC, :CONC_PROV, :CONC_APORTE, :PERIODO, :ANO, :CONC_MODIFI, :CONC_APLICAPROM, :SALARIO, :GTOEMPR);
                            end
                        else if ((:PERIODICIDAD = 3) and (LIQUIDAPER = 3)) then
                            begin
                            if ((PERIODO = 3) or (PERIODO = 7) or (PERIODO = 11) or (PERIODO = 15) or (PERIODO = 19) or (PERIODO = 23)
                                or (PERIODO = 27) or (PERIODO = 31) or (PERIODO = 35) or (PERIODO = 39) or (PERIODO = 43) or (PERIODO = 47)
                                or (PERIODO = 51)) then
                                insert into NOMINA_CONCEPTOS (NOMI_ID, NOCO_ITEM, CONC_COD,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, NOCO_GTOEMPR)
                                    values (:IDNOMINA,:ITEM, :CONCEPT, :NIT_TERCERO, :VALOR, :ENTIDAD, :CONC_DEDUC, :CONC_PROV, :CONC_APORTE, :PERIODO, :ANO, :CONC_MODIFI, :CONC_APLICAPROM, :SALARIO, :GTOEMPR);
                            end
                        else if ((:PERIODICIDAD = 3) and (LIQUIDAPER = 4)) then
                            begin
                            if ((PERIODO = 4) or (PERIODO = 8) or (PERIODO = 12) or (PERIODO = 16) or (PERIODO = 20) or (PERIODO = 24)
                                or (PERIODO = 29) or (PERIODO = 32) or (PERIODO = 36) or (PERIODO = 40) or (PERIODO = 44) or (PERIODO = 48)
                                or (PERIODO = 52)) then
                                insert into NOMINA_CONCEPTOS (NOMI_ID, NOCO_ITEM, CONC_COD,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, NOCO_GTOEMPR)
                                    values (:IDNOMINA,:ITEM, :CONCEPT, :NIT_TERCERO, :VALOR, :ENTIDAD, :CONC_DEDUC, :CONC_PROV, :CONC_APORTE, :PERIODO, :ANO, :CONC_MODIFI, :CONC_APLICAPROM, :SALARIO, :GTOEMPR);
                            end
                        end
                    VALOR = 0;
                    BASICO = 0;
                    end
            end /* for */
        end
    end
suspend;
end
^

SET TERM ; ^


/* 20100611 */
/* fecha de bloqueo de nomina */
INSERT INTO CONFIGURACION (CONF_MODULO, CONF_CATEGORIA, CONF_PROPIEDAD, CONF_VALOR, CONF_POSIBLES, CONF_AYUDA) VALUES ('NOMINA', 'GENERAL', 'FECHA DE BLOQUEO', '', NULL, 'Indique la fecha de bloqueo aaaa/mm/dd que aplica para las causaciones de la nómina. Antes de esta fecha no se puede eliminar o modificar una nómina');
COMMIT WORK;
CREATE INDEX NOMINA_CONCEPTOS_IDX1
ON NOMINA_CONCEPTOS (NOMI_ID,TERC_NIT);

/* orden de los conceptos al imprimir la planilla */

SET TERM ^ ;

CREATE OR ALTER procedure IMPR_PLANILLA_NOMINA (
    ID integer,
    PAGO char(1),
    CTA char(1),
    EMPL char(1),
    DPTO varchar(20))
returns (
    FECHA date,
    OBSERVACIONES blob sub_type 0 segment size 80,
    PAGOGLOBAL char(1),
    PERIODO integer,
    ANO char(4),
    PERIODICIDAD varchar(60),
    NITEMPL varchar(20),
    VALOR numeric(18,2),
    DEDUC char(1),
    NOMBREEMPL varchar(60),
    NOMCORTCONC varchar(60),
    NOMBRECONC varchar(60),
    CODCONC integer,
    PROV char(1),
    TOTALEMPL numeric(18,2),
    TOTALDEDUC numeric(18,2),
    TOTALDEVENG numeric(18,2),
    NUMEMPL integer,
    CTAEMPL varchar(25),
    TOTALCTAS numeric(18,2),
    TOTALNOMI numeric(18,2),
    TOTALAPOR numeric(18,2),
    NOMPER varchar(60),
    ORG integer,
    CARGOEMPL varchar(60),
    DEPTOEMPL varchar(60),
    NUMCOP integer,
    NOMBRE_COPIA varchar(60),
    DIASLAB integer,
    SALARIO numeric(18,2),
    BENEFICIO char(1),
    BASE numeric(18,2),
    CODDPTOEMPL integer)
AS
declare variable nitant varchar(20);
declare variable nitnue varchar(20);
declare variable numconc integer;
declare variable totalnomineg numeric(18,2);
declare variable totalaporneg numeric(18,2);
declare variable par integer;
declare variable impar integer;
declare variable antdeduc char(1);
declare variable nitdeduc varchar(20);
declare variable nittot varchar(20);
declare variable nitaux varchar(20);
BEGIN
SELECT N.nuco_copia FROM NUMERO_COPIA N WHERE N.tido_cod = 92 AND N.nuco_id = :id INTO :NUMCOP;
IF (numcop IS NULL) THEN
  BEGIN
  numcop = 0;
  INSERT INTO NUMERO_COPIA (TIDO_COD, NUCO_ID, NUCO_COPIA) VALUES (92,:id,:numcop);
  END
ELSE
  BEGIN
  numcop = :numcop + 1;
  UPDATE numero_copia N SET N.nuco_copia = :numcop WHERE N.tido_cod = 92 AND N.nuco_id = :id;
  END
SELECT N.noco_nombre FROM nombres_copias N WHERE N.noco_id = :numcop INTO :nombre_copia;
numempl = 0;
nitant = 0;
nitnue = 0;
IF (PAGO = 'N') THEN
  BEGIN
  FOR SELECT N.nomi_feccausa, N.nomi_obs, N.nomi_pagoglobal, N.nomi_periodo, N.nomi_ano, P.ppag_nombre, PN.pnom_nombre
    FROM NOMINA N, periodo_pago P, periodo_pago_nombre PN
    WHERE P.ppag_cod = N.nomi_periodocidad AND N.nomi_id = :ID AND PN.ppag_cod = N.nomi_periodocidad AND PN.ppag_periodo = N.nomi_periodo
    INTO :fecha, :observaciones, :pagoglobal, :periodo, :ano, :periodicidad, :NOMPER
    DO
    BEGIN
    SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id INTO :totalnomi;
    SELECT SUM(NC.noco_valor*-1) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_APORTE = 'S' AND NOCO_VALOR < 0 AND NOMI_ID = :id INTO :totalaporneg;
    SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_APORTE = 'S' AND NOCO_VALOR > 0 AND NOMI_ID = :id INTO :totalapor;
    totalapor = :totalapor + totalaporneg;
    FOR SELECT NC.terc_nit, NC.noco_valor, NC.noco_deduc, T.terc_nom, C.conc_nomcorto, C.conc_nombre, NC.conc_cod, NC.noco_prov
      FROM NOMINA_CONCEPTOS NC, TERCEROS T, CONCEPTOS_NOMINA C
      WHERE NC.nomi_id = :ID AND C.conc_cod = NC.conc_cod AND t.terc_nit = nc.terc_nit
      ORDER BY NC.NOCO_DEDUC, NC.conc_cod,  T.TERC_NOM
      INTO :nitempl, :valor, :deduc, :nombreempl, :nomcortconc, :nombreconc, :codconc, :prov
      DO
      BEGIN
      IF (valor IS NULL) THEN
        valor = 0;
      cargoempl = '';
      select empl_cargo from EMPLEADOS where terc_nit = :nitempl into :cargoempl;
      SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND TERC_NIT = :nitempl INTO :totalempl;
      SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND TERC_NIT = :nitempl AND NC.noco_deduc = 'S' INTO :totaldeduc;
      SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND TERC_NIT = :nitempl AND NC.noco_deduc = 'N' INTO :totaldeveng;
      SUSPEND;
      END
    /* totales por concepto
    nitempl = '';
    valor = NULL;
    deduc = '';
    nombreempl = NULL;
    nomcortconc = NULL;
    nombreconc = NULL;
    codconc = NULL;
    prov = NULL;
    FOR SELECT MAX(conc_cod), SUM(noco_valor) FROM NOMINA_CONCEPTOS WHERE nomi_id = :id
      GROUP BY conc_cod
      INTO :codconc, :valor
      DO
      BEGIN
      nitempl = '';
      nombreempl = '';
      deduc = 'N';
      prov = 'N';
      SELECT C.conc_nombre,C.conc_nomcorto FROM CONCEPTOS_NOMINA C WHERE C.conc_cod = :codconc INTO :nombreconc,:nomcortconc;
      SUSPEND;
      END
    IF (EMPL = 'N') THEN
      BEGIN
      deduc = 'N';
      nomcortconc = 'DIAS LAB.';
      nombreconc = 'DIAS LAB.';
      codconc = 0;
      prov = 'N';
      valor = NULL;
      nitempl = '';
      nombreempl = '';
      SUSPEND;
      deduc = 'N';
      nomcortconc = 'SDO BASE';
      nombreconc = 'SDO BASE';
      codconc = 0;
      prov = 'N';
      valor = NULL;
      nitempl = '';
      nombreempl = '';
      SUSPEND;
      END
    /* dias laborados y salario base */
    FOR SELECT ND.node_diaslab, ND.terc_nit, T.terc_nom FROM NOMINA_DETALLE ND, TERCEROS T
        WHERE NOMI_ID = :id AND T.terc_nit = ND.terc_nit
      INTO :diaslab, :nitaux, :nombreempl
      DO
      BEGIN
      nitempl = :nitaux;
      nomcortconc = 'DIAS LAB.';
      valor = :diaslab;
      SUSPEND;
      SELECT FIRST 1  m.mvse_salario FROM MOVIMIENTO_SALARIO_EMPLEADO M WHERE M.terc_nit = :nitaux AND M.mvse_fecha <= :fecha ORDER BY M.mvse_fecha DESC INTO :salario;
      nitempl = :nitaux;
      nomcortconc = 'SDO BASE';
      valor = :salario;
      SUSPEND;
      END
    END
  END
ELSE
  IF (PAGO = 'S') THEN
    BEGIN
    par = 2;
    impar = 1;
    SELECT N.nomi_feccausa, N.nomi_obs, N.nomi_pagoglobal, N.nomi_periodo, N.nomi_ano, P.ppag_nombre, PN.pnom_nombre
        FROM NOMINA N, periodo_pago P, periodo_pago_nombre PN
        WHERE P.ppag_cod = N.nomi_periodocidad AND N.nomi_id = :ID AND PN.ppag_cod = N.nomi_periodocidad AND PN.ppag_periodo = N.nomi_periodo
        INTO :fecha, :observaciones, :pagoglobal, :periodo, :ano, :periodicidad, :NOMPER;
    IF (EMPL = 'N') THEN
        BEGIN
        deduc = 'N';
        nomcortconc = 'DIAS LAB.';
        nombreconc = 'DIAS LAB.';
        codconc = 0;
        prov = 'N';
        valor = NULL;
        nitempl = '';
        nombreempl = '';
        SUSPEND;
        deduc = 'N';
        nomcortconc = 'SDO BASE';
        nombreconc = 'SDO BASE';
        codconc = 0;
        prov = 'N';
        valor = NULL;
        nitempl = '';
        nombreempl = '';
        SUSPEND;
        deduc = 'N';
        nomcortconc = 'TOTAL DEV';
        nombreconc = 'TOTAL DEV';
        codconc = 9999;
        prov = 'N';
        valor = NULL;
        nitempl = '';
        nombreempl = '';
        SUSPEND;
        deduc = 'S';
        nomcortconc = 'TOTAL DEDUC';
        nombreconc = 'TOTAL DEDUC';
        codconc = 99999;
        prov = 'N';
        valor = NULL;
        nitempl = '';
        nombreempl = '';
        SUSPEND;
        deduc = 'S';
        nomcortconc = 'TOTAL EMPL';
        nombreconc = 'TOTAL EMPL';
        codconc = 999999;
        prov = 'N';
        valor = NULL;
        nitempl = '';
        nombreempl = '';
        SUSPEND;
        FOR SELECT MAX(N.conc_cod), MAX(N.noco_deduc) FROM NOMINA_CONCEPTOS N
            WHERE N.nomi_id = :id AND N.noco_prov = 'N' AND N.noco_gtoempr = 'N'
            GROUP BY N.conc_cod
            INTO :codconc, :deduc
            DO
            BEGIN
            valor = NULL;
            nitempl = '';
            nombreempl = '';
            prov = 'N';
            SELECT C.conc_nombre,C.conc_nomcorto FROM CONCEPTOS_NOMINA C WHERE C.conc_cod = :codconc INTO :nombreconc,:nomcortconc;
            SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id INTO :totalempl;
            SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND NC.noco_deduc = 'S' INTO :totaldeduc;
            SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND NC.noco_deduc = 'N' INTO :totaldeveng;
            SUSPEND;
            END
        FOR SELECT ND.node_diaslab,  ND.terc_nit, T.terc_nom
            FROM NOMINA_DETALLE ND, TERCEROS T WHERE NOMI_ID = :id AND T.terc_nit = ND.terc_nit
            INTO :diaslab, :nitaux, :nombreempl
            DO
            BEGIN
            nitempl = :nitaux;
            nomcortconc = 'DIAS LAB.';
            valor = :diaslab;
            SUSPEND;
            SELECT FIRST 1  m.mvse_salario FROM MOVIMIENTO_SALARIO_EMPLEADO M WHERE M.terc_nit = :nitaux AND M.mvse_fecha <= :fecha ORDER BY M.mvse_fecha DESC INTO :salario;
            nitempl = :nitaux;
            nomcortconc = 'SDO BASE';
            valor = :salario;
            SUSPEND;
            END
        END
    FOR SELECT NC.terc_nit, NC.noco_valor, NC.noco_deduc, T.terc_nom, C.conc_nomcorto, C.conc_nombre, NC.conc_cod, NC.noco_prov, NC.terc_nit, c.conc_benefic, NC.noco_base
        FROM NOMINA_CONCEPTOS NC, TERCEROS T, CONCEPTOS_NOMINA C
        WHERE NC.nomi_id = :ID AND C.conc_cod = NC.conc_cod AND t.terc_nit = nc.terc_nit AND NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N'
        ORDER BY T.terc_nom
        INTO :nitempl, :valor, :deduc, :nombreempl, :nomcortconc, :nombreconc, :codconc, :prov,:nitnue, :beneficio,:base
        DO
        BEGIN
        cargoempl = '';
        ctaempl = '';
        deptoempl = '';
        coddptoempl = 0;
        diaslab = 0;
        SELECT node_diaslab FROM NOMINA_DETALLE WHERE nomi_id = :id AND terc_nit = :nitempl INTO :diaslab;
        select e.empl_cargo, e.empl_cuenta, D.dpto_nombre, d.dpto_cod
            from EMPLEADOS e, DEPARTAMENTO D
            where D.dpto_cod = E.empl_dpto AND e.terc_nit = :nitempl into :cargoempl,:ctaempl,:deptoempl,:coddptoempl;
        SELECT FIRST 1  m.mvse_salario FROM MOVIMIENTO_SALARIO_EMPLEADO M WHERE M.terc_nit = :nitempl AND M.mvse_fecha <= :FECHA ORDER BY M.mvse_fecha DESC INTO :salario;
        IF ((nitnue <> nitant) AND (nitnue IS NOT NULL)) THEN
            numempl = :numempl + 1;
        IF (valor IS NULL) THEN
            valor = 0;
        IF (nitempl <> nitdeduc) THEN
            BEGIN
            par = 2;
            impar = 1;
            END
        nitdeduc = :nitempl;
        IF (:deduc = 'S') THEN
            BEGIN
            antdeduc = 'S';
            org = :par;
            par = :par + 2;
            END
        ELSE
            BEGIN
            antdeduc = 'N';
            org = :impar;
            impar = :impar + 2;
            END
       SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND TERC_NIT = :nitempl INTO :totalempl;
       SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND TERC_NIT = :nitempl AND NC.noco_deduc = 'S' INTO :totaldeduc;
       SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND TERC_NIT = :nitempl AND NC.noco_deduc = 'N' INTO :totaldeveng;
       IF (cta = 'S') THEN
         BEGIN
         SELECT COUNT(CONC_COD) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND TERC_NIT = :nitempl INTO :numconc;
         totalempl = totalempl / :numconc;
         SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND TERC_NIT = :nitempl INTO :totalctas;
         END
       SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id INTO :totalnomi;
       SELECT SUM(NC.noco_valor*-1) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_APORTE = 'S' AND NOCO_VALOR < 0 AND NOMI_ID = :id INTO :totalaporneg;
       SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_APORTE = 'S' AND NOCO_VALOR > 0 AND NOMI_ID = :id INTO :totalapor;
       totalapor = :totalapor + totalaporneg;
       SUSPEND;
       IF ((nitnue <> nitant) AND (nitnue IS NOT NULL) AND (EMPL = 'N')) THEN
         BEGIN
         deduc = 'N';
         nomcortconc = 'TOTAL DEV';
         nombreconc = 'TOTAL DEV';
         codconc = 9999;
         prov = 'N';
         SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND NC.noco_deduc = 'N' AND NC.terc_nit = : nitempl INTO :VALOR;
         SUSPEND;
         deduc = 'S';
         nomcortconc = 'TOTAL DEDUC';
         nombreconc = 'TOTAL DEDUC';
         codconc = 99999;
         prov = 'N';
         SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND NC.noco_deduc = 'S' AND NC.terc_nit = :nitempl INTO :VALOR;
         SUSPEND;
         deduc = 'S';
         nomcortconc = 'TOTAL EMPL';
         nombreconc = 'TOTAL EMPL';
         codconc = 999999;
         prov = 'N';
         SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND NC.terc_nit = :nitempl INTO :VALOR;
         nitant = :nitnue;
         SUSPEND;
         END
       END
    numempl = :numempl + 1;
    IF (EMPL = 'N') THEN
        BEGIN
        nitempl = '';
        valor = NULL;
        deduc = '';
        nombreempl = NULL;
        nomcortconc = NULL;
        nombreconc = NULL;
        codconc = NULL;
        prov = NULL;
        totalempl = NULL;
        ctaempl = NULL;
        IF (cta = 'N') THEN
          BEGIN
          FOR SELECT MAX(N.conc_cod) FROM NOMINA_CONCEPTOS N WHERE N.nomi_id = :id AND N.noco_prov = 'N' AND N.noco_gtoempr = 'N'
            GROUP BY N.conc_cod
            INTO :codconc
            DO
            BEGIN
            IF (dpto IS NOT NULL AND (DPTO <> '') ) THEN
                BEGIN
                SELECT SUM(NC.noco_valor), MAX(NC.noco_deduc) FROM NOMINA_CONCEPTOS NC, EMPLEADOS E, DEPARTAMENTO D
                    WHERE NC.nomi_id = :ID AND NC.conc_cod = :codconc AND D.dpto_cod = E.empl_dpto AND NC.terc_nit = E.terc_nit AND d.dpto_cod = :dpto
                    GROUP BY NC.conc_cod
                    INTO :valor, :deduc;
                nitempl = '-';
                nombreempl = 'TOTAL';
                deptoempl = '-';
                prov = 'N';
                SELECT C.conc_nombre,C.conc_nomcorto FROM CONCEPTOS_NOMINA C WHERE C.conc_cod = :codconc INTO :nombreconc,:nomcortconc;
                SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC, EMPLEADOS E, DEPARTAMENTO D WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id  AND D.dpto_cod = E.empl_dpto AND NC.terc_nit = E.terc_nit INTO :totalempl;
                SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC, EMPLEADOS E, DEPARTAMENTO D WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND NC.noco_deduc = 'S'  AND D.dpto_cod = E.empl_dpto AND NC.terc_nit = E.terc_nit INTO :totaldeduc;
                SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC, EMPLEADOS E, DEPARTAMENTO D WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND NC.noco_deduc = 'N'  AND D.dpto_cod = E.empl_dpto AND NC.terc_nit = E.terc_nit INTO :totaldeveng;
                END
            ELSE
                BEGIN
                SELECT SUM(NC.noco_valor), MAX(NC.noco_deduc) FROM NOMINA_CONCEPTOS NC
                WHERE NC.nomi_id = :ID AND NC.conc_cod = :codconc
                GROUP BY NC.conc_cod
                INTO :valor, :deduc;
                nitempl = '-';
                nombreempl = 'TOTAL';
                deptoempl = '-';
                prov = 'N';
                SELECT C.conc_nombre,C.conc_nomcorto FROM CONCEPTOS_NOMINA C WHERE C.conc_cod = :codconc INTO :nombreconc,:nomcortconc;
                SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id INTO :totalempl;
                SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND NC.noco_deduc = 'S' INTO :totaldeduc;
                SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND NC.noco_deduc = 'N' INTO :totaldeveng;
                END
            SUSPEND;
            END
        IF (dpto IS NOT NULL AND (DPTO <> '') ) THEN
            BEGIN
            deduc = 'N';
             nomcortconc = 'TOTAL DEV';
             nombreconc = 'TOTAL DEV';
             codconc = 9999;
             deptoempl = '-';
             prov = 'N';
             SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC, EMPLEADOS E, DEPARTAMENTO D WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id  AND D.dpto_cod = E.empl_dpto AND NC.terc_nit = E.terc_nit AND d.dpto_cod = :dpto INTO :VALOR;
             nitempl = '-';
             nombreempl = 'TOTAL';
             SUSPEND;
             deduc = 'S';
             nomcortconc = 'TOTAL DEDUC';
             nombreconc = 'TOTAL DEDUC';
             codconc = 99999;
             deptoempl = '-';
             prov = 'N';
             SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC, EMPLEADOS E, DEPARTAMENTO D WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND NC.noco_deduc = 'S'  AND D.dpto_cod = E.empl_dpto AND d.dpto_cod = :dpto AND NC.terc_nit = E.terc_nit INTO :VALOR;
             nitempl = '-';
             nombreempl = 'TOTAL';
             SUSPEND;
             deduc = 'S';
             nomcortconc = 'TOTAL EMPL';
             nombreconc = 'TOTAL EMPL';
             codconc = 999999;
             deptoempl = '-';
             prov = 'N';
             SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC, EMPLEADOS E, DEPARTAMENTO D WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND NC.noco_deduc = 'N'  AND D.dpto_cod = E.empl_dpto AND d.dpto_cod = :dpto AND NC.terc_nit = E.terc_nit INTO :VALOR;
             nitempl = '-';
             nombreempl = 'TOTAL';
             SUSPEND;
             END
        ELSE
             BEGIN
             deduc = 'N';
             nomcortconc = 'TOTAL DEV';
             nombreconc = 'TOTAL DEV';
             codconc = 9999;
             prov = 'N';
             SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND NC.noco_deduc = 'N' INTO :VALOR;
             nitempl = '-';
             nombreempl = 'TOTAL';
             SUSPEND;
             deduc = 'S';
             nomcortconc = 'TOTAL DEDUC';
             nombreconc = 'TOTAL DEDUC';
             codconc = 99999;
             prov = 'N';
             SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND NC.noco_deduc = 'S' INTO :VALOR;
             nitempl = '-';
             nombreempl = 'TOTAL';
             SUSPEND;
             deduc = 'S';
             nomcortconc = 'TOTAL EMPL';
             nombreconc = 'TOTAL EMPL';
             codconc = 999999;
             prov = 'N';
             SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N'  AND NOMI_ID = :id INTO :VALOR;
             nitempl = '-';
             nombreempl = 'TOTAL';
             SUSPEND;
             END
         END
       END
    END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure PLANILLA_NOMINA_NOVEDADES (
    ID integer)
returns (
    NOVDIAINI integer,
    NOVDURACION integer,
    NOVVALOR numeric(18,2),
    NOVTIPOADMINISTRADORA char(3),
    NOVNVAADMIN varchar(20),
    NOMNOVEDAD varchar(60),
    NITDETALLE varchar(20),
    NOMEMPL varchar(60))
AS
declare variable periodo integer;
declare variable ano char(4) character set none;
begin
FOR SELECT nd.TERC_NIT, n.nomi_periodo, n.nomi_ano
    FROM nomina_detalle nd, nomina n
    WHERE nd.NOMI_ID = :id and n.nomi_id = nd.nomi_id
    into :nitdetalle, :periodo, :ano
    DO
    BEGIN
    nomempl = '';
    select terc_nom from terceros where terc_nit = :nitdetalle into :nomempl;
    FOR select V.nono_diaini, V.nono_dura, V.nono_valor, V.nono_tipoadm, V.nono_nvaadm, TN.tnov_nombre
        from NOMINA_NOVEDADES V, tipos_novedad TN WHERE V.nono_periodo = :periodo AND V.nono_ano = :ano and V.terc_nit = :nitdetalle AND TN.tnov_cod = V.tnov_cod
        INTO :novdiaini, :novduracion, :novvalor, :novtipoadministradora, :novnvaadmin, :nomnovedad
        DO
        SUSPEND;
    END
end
^

SET TERM ; ^


/* 20100611b : string truncation en aportes */
SET TERM ^ ;

create or alter procedure CEROS_ANCHO_FIJO (
    DATO varchar(200),
    LONGDATO integer,
    TIPODATO char(1))
returns (
    DATOCEROS varchar(200))
AS
declare variable cont integer;
declare variable numeroceros integer;
declare variable ceros varchar(200);
declare variable tam integer;
declare variable aux varchar(200);
BEGIN
if (dato is null) then
    dato = ' ';
if (TIPODATO = 'N') then
    BEGIN
    CONT = 1;
    CEROS = '';
    TAM = STRLEN(DATO);
    if (:tam > :longdato) then
        DATO = substr(:dato,1,strlen(dato)-(:tam - :longdato));
    NUMEROCEROS = :LONGDATO - :TAM;
    WHILE (CONT <= NUMEROCEROS ) DO
        BEGIN
        CEROS = CEROS || '0';
        CONT = :cont + 1;
        END
    DATOCEROS = CEROS || dato ;
    SUSPEND;
    END
ELSE
    if (TIPODATO = 'A') then
        BEGIN
        CONT = 1;
        CEROS = '';
        TAM = STRLEN(DATO);
        if (:tam > :longdato) then
            DATO = substr(:dato,1,strlen(dato)-(:tam - :longdato));
        NUMEROCEROS = :LONGDATO - :TAM;
        WHILE (CONT <= NUMEROCEROS ) DO
            BEGIN
            CEROS = CEROS || ' ';
            CONT = :cont + 1;
            END
        DATOCEROS = DATO || CEROS ;
        SUSPEND;
        END
    ELSE
        if (TIPODATO = 'P') then
            BEGIN
            CONT = 1;
            CEROS = '';
            TAM = STRLEN(DATO);
            if (:tam > :longdato) then
                DATO = substr(:dato,1,strlen(dato)-(:tam - :longdato));
            NUMEROCEROS = :LONGDATO - :TAM;
            WHILE (CONT <= NUMEROCEROS ) DO
                BEGIN
                CEROS = CEROS || '0';
                CONT = :cont + 1;
                END
            DATOCEROS = DATO || CEROS ;
            SUSPEND;
            END
END^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE ARCHIVO_BANCO(
    IDDOC INTEGER,
    FECHA DATE,
    FECHAPAGO DATE)
RETURNS (
    DATOS VARCHAR(591))
AS
declare variable dat varchar(60);
declare variable nombreempl varchar(60);
declare variable numdocid varchar(20);
declare variable cuentaempl varchar(25);
declare variable banco integer;
declare variable tipocta char(1);
declare variable verifica numeric(18,2);
BEGIN
datos = '';
dat = '1';
datos = :datos || :dat;
EXECUTE PROCEDURE lee_configuracion('CONTABILIDAD','GENERAL','NIT COMPAÑIA')returning_values (:dat);
EXECUTE PROCEDURE ceros_ancho_fijo(:dat,10,'N')returning_values(:dat);
datos = :datos || :dat;
dat = '';
EXECUTE PROCEDURE lee_configuracion('GENERAL','GENERAL','NOMBRE COMPAÑIA')returning_values (:dat);
EXECUTE PROCEDURE ceros_ancho_fijo(:dat,16,'A')returning_values(:dat);
datos = :datos || :dat;
dat = '225';
datos = :datos || :dat;
dat = 'NOMINA';
EXECUTE PROCEDURE ceros_ancho_fijo(:dat,10,'A')returning_values(:dat);
datos = :datos || :dat;
dat = substr(:fecha,3,4)|| substr(:fecha,6,7) || substr(:fecha,9,10);
datos = :datos || :dat;
SELECT P.paan_consbanc FROM PARAMETROS_ANO P WHERE P.paan_ano = substr(:fecha,1,4) INTO :dat;
if (dat IS NULl) then
dat = ' ';
datos = :datos || :dat;
dat = substr(:fechapago,3,4)|| substr(:fechapago,6,7) || substr(:fechapago,9,10);
datos = :datos || :dat;
SELECT COUNT(NOMI_ID) FROM NOMINA_DETALLE WHERE NOMI_ID = :iddoc INTO :dat;
EXECUTE PROCEDURE ceros_ancho_fijo(:dat,6,'N')returning_values(:dat);
datos = :datos || :dat;
dat = '000000000000';
datos = :datos || :dat;
SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC, EMPLEADOS E WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :iddoc AND E.empl_formpago = 'B' AND NC.terc_nit = E.terc_nit INTO :dat;
dat = substr(:dat,1,strlen(:dat)-3);
EXECUTE PROCEDURE ceros_ancho_fijo(:dat,12,'N')returning_values(:dat);
datos = :datos || :dat;
EXECUTE PROCEDURE lee_configuracion('NOMINA', 'GENERAL', 'NUMERO DE CUENTA DEL BANCO')returning_values (:dat);
EXECUTE PROCEDURE ceros_ancho_fijo(:dat,11,'N')returning_values(:dat);
datos = :datos || :dat;
EXECUTE PROCEDURE lee_configuracion('NOMINA', 'GENERAL', 'TIPO CUENTA')returning_values (:dat);
EXECUTE PROCEDURE ceros_ancho_fijo(:dat,1,'A')returning_values(:dat);
datos = :datos || :dat;
  SUSPEND;
datos = '';
FOR SELECT D.terc_nit, T.terc_nom, E.empl_cuenta, E.empl_banco, e.empl_tipocta FROM empleados E, NOMINA_DETALLE D, TERCEROS T WHERE D.terc_nit = E.terc_nit AND T.terc_nit = E.terc_nit AND D.nomi_id = :iddoc AND E.empl_formpago = 'B'
INTO :numdocid, :nombreempl, :cuentaempl, :banco, :tipocta
DO
BEGIN
SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NC.terc_nit = :numdocid AND NOMI_ID = :iddoc INTO :verifica;
if (verifica > 0) then
BEGIN
dat = '6';
datos = :datos || :dat;
dat = :numdocid;
EXECUTE PROCEDURE ceros_ancho_fijo(:dat,15,'N')returning_values(:dat);
datos = :datos || :dat;
dat = :nombreempl;
EXECUTE PROCEDURE ceros_ancho_fijo(:dat,18,'A')returning_values(:dat);
datos = :datos || :dat;
SELECT B.banc_codach FROM BANCOS B WHERE B.banc_cod = :banco INTO :dat;
EXECUTE PROCEDURE ceros_ancho_fijo(:dat,9,'N')returning_values(:dat);
datos = :datos || :dat;
dat = :cuentaempl;
EXECUTE PROCEDURE ceros_ancho_fijo(:dat,17,'N')returning_values(:dat);
datos = :datos || :dat;
dat = 'S';
datos = :datos || :dat;
if (:tipocta = 'C') then
dat=  '27';
ELSE
if (:tipocta = 'A') then
dat=  '37';
datos = :datos || :dat;
SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NC.terc_nit = :numdocid AND NOMI_ID = :iddoc INTO :dat;
dat = substr(:dat,1,strlen(:dat)-3);
EXECUTE PROCEDURE ceros_ancho_fijo(:dat,10,'N')returning_values(:dat);
datos = :datos || :dat;
dat = 'NOMINA';
EXECUTE PROCEDURE ceros_ancho_fijo(:dat,9,'A')returning_values(:dat);
datos = :datos || :dat;
if (substr(:fecha,6,7) = '01') then
dat= 'ENERO';
ELSE
if (substr(:fecha,6,7) = '02') then
dat= 'FEBRERO';
ELSE
if (substr(:fecha,6,7) = '03') then
dat= 'MARZO';
ELSE
if (substr(:fecha,6,7) = '04') then
dat= 'ABRIL';
ELSE
if (substr(:fecha,6,7) = '05') then
dat= 'MAYO';
ELSE
if (substr(:fecha,6,7) = '06') then
dat= 'JUNIO';
ELSE
if (substr(:fecha,6,7) = '07') then
dat= 'JULIO';
ELSE
if (substr(:fecha,6,7) = '08') then
dat= 'AGOSTO';
ELSE
if (substr(:fecha,6,7) = '09') then
dat= 'SEPTIEMBRE';
ELSE
if (substr(:fecha,6,7) = '10') then
dat= 'OCTUBRE';
if (substr(:fecha,6,7) = '11') then
dat= 'NOVIEMBRE';
ELSE
if (substr(:fecha,6,7) = '12') then
dat= 'DICIEMBRE';
EXECUTE PROCEDURE ceros_ancho_fijo(:dat,12,'A')returning_values(:dat);
datos = :datos || :dat;
dat= ' ';
datos = :datos || :dat;
SUSPEND;
datos = '';
END
END
END

^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure FORM_INTEGRADO_ELECTRONICO (
    IDDOC integer,
    FECLIQ varchar(10),
    CODOPER varchar(2))
returns (
    DATOS varchar(591))
AS
declare variable TIPREG varchar(2);
declare variable SEC varchar(5);
declare variable NOMCIA varchar(200);
declare variable NITCIA varchar(16);
declare variable DVCIA varchar(1);
declare variable FORMAPRESENT varchar(1);
declare variable CODSUCUR varchar(10);
declare variable NOMSUCUR varchar(40);
declare variable CODARP varchar(6);
declare variable PERLIQ varchar(7);
declare variable PERLIQSALUD char(7);
declare variable NUMFORM varchar(20);
declare variable NUMEMPL varchar(5);
declare variable NUMEMPLADM varchar(20);
declare variable VLORNOMI varchar(20);
declare variable VLORNOMIINT integer;
declare variable NITEMPL varchar(16);
declare variable SECINT integer;
declare variable TIPOID varchar(2);
declare variable TIPOCOT varchar(2);
declare variable STIPOCOT varchar(2);
declare variable NOM1 varchar(20);
declare variable NOM2 varchar(30);
declare variable APE1 varchar(20);
declare variable APE2 varchar(30);
declare variable FECING date;
declare variable FECRET date;
declare variable COUNTNOV integer;
declare variable NOVEDAD varchar(1);
declare variable CODADMIN varchar(6);
declare variable DIASLAB varchar(3);
declare variable SALBASIC varchar(22);
declare variable INCAP varchar(2);
declare variable CIUDAD varchar(5);
declare variable PORCAPOR varchar(20);
declare variable PORCAPOR2 varchar(20);
declare variable COTOBL varchar(20);
declare variable COTOBLADM varchar(20);
declare variable NITADMIN varchar(16);
declare variable ITEMADM integer;
begin
  TIPREG = '01';
  DATOS = :TIPREG;
  DATOS = :DATOS || '1';
  SEC = '0001';
  DATOS = :DATOS || :SEC;
  execute procedure LEE_CONFIGURACION('GENERAL', 'GENERAL', 'NOMBRE COMPAÑIA')
      returning_values (:NOMCIA);
  execute procedure CEROS_ANCHO_FIJO(:NOMCIA, 200, 'A')
      returning_values (:NOMCIA);
  DATOS = :DATOS || :NOMCIA;
  DATOS = :DATOS || 'NI';
  execute procedure LEE_CONFIGURACION('CONTABILIDAD', 'GENERAL', 'NIT COMPAÑIA')
      returning_values (:NITCIA);
  execute procedure DV(NITCIA)
      returning_values (DVCIA);
  execute procedure CEROS_ANCHO_FIJO(:NITCIA, 16, 'A')
      returning_values (:NITCIA);
  DATOS = :DATOS || :NITCIA;
  DATOS = :DATOS || :DVCIA;
  FORMAPRESENT = 'E';
  DATOS = :DATOS || :FORMAPRESENT;
  DATOS = :DATOS || '0000000000';
  DATOS = :DATOS || '          ';
  DATOS = :DATOS || 'U';
  CODSUCUR = '';
  execute procedure CEROS_ANCHO_FIJO(:CODSUCUR, 10, 'A')
      returning_values (:CODSUCUR);
  DATOS = :DATOS || :CODSUCUR;
  NOMSUCUR = '';
  execute procedure CEROS_ANCHO_FIJO(:NOMSUCUR, 40, 'A')
      returning_values (:NOMSUCUR);
  DATOS = :DATOS || :NOMSUCUR;
  select ADMI_CODARP
  from ADMINISTRADORA A, PARAMETROS_ANO P
  where P.PAAN_NITARP = A.TERC_NIT and
        P.PAAN_ANO = SUBSTR(:FECLIQ, 1, 4)
  into :CODARP;
  execute procedure CEROS_ANCHO_FIJO(:CODARP, 6, 'A')
      returning_values (:CODARP);
  DATOS = :DATOS || :CODARP;
  select substring(P.PGAP_FECHA from 1 for 7)
  from PAGO_APORTES P
  where P.PGAP_ID = :IDDOC and
        P.PGAP_ITEM = 1
  into :PERLIQ;
  PERLIQ = SUBSTR(PERLIQ, 1, 4) || '-' || SUBSTR(PERLIQ, 6, 8);
  DATOS = :DATOS || :PERLIQ;
  PERLIQSALUD = :PERLIQ;
  DATOS = :DATOS || :PERLIQSALUD;
  select PGAP_FORMULARIO
  from PAGO_APORTES
  where PGAP_ID = :IDDOC and
        PGAP_ITEM = 1
  into :NUMFORM;
  execute procedure CEROS_ANCHO_FIJO(:NUMFORM, 10, 'A')
      returning_values (:NUMFORM);
  DATOS = :DATOS || :NUMFORM;
  DATOS = :DATOS || '          ';
  select count(E.PGAP_ID)
  from PAGO_APORTES_EMPLEADOS E
  where E.PGAP_ID = :IDDOC
  into :NUMEMPL;
  execute procedure CEROS_ANCHO_FIJO(:NUMEMPL, 5, 'N')
      returning_values (:NUMEMPL);
  DATOS = :DATOS || :NUMEMPL;
  select cast(sum(PADE_IBC) as integer)
  from PAGO_APORTES_DETALLE
  where PGAP_ID = :IDDOC
  into :VLORNOMIINT;
  /*vlornomiint = CAST(:vlornomi AS INTEGER);
*/ VLORNOMI = cast(VLORNOMIINT as varchar(20));
  execute procedure CEROS_ANCHO_FIJO(:VLORNOMI, 12, 'N')
      returning_values (:VLORNOMI);
  DATOS = :DATOS || :VLORNOMI;
  DATOS = :DATOS || '1';
  CODOPER = '0';
  execute procedure CEROS_ANCHO_FIJO(:CODOPER, 2, 'N')
      returning_values (:CODOPER);
  DATOS = :DATOS || :CODOPER;
  suspend;
  DATOS = '';
  SECINT = 0;
  for select E.TERC_NIT, T.TERC_TIPOID, T.CIUD_COD, E.TCOT_COD, E.STCO_COD, T.TERC_NOMBRE1, T.TERC_NOMBRE2,
             T.TERC_APELLIDO1, T.TERC_APELLIDO2, E.EMPL_FECING, E.EMPL_FECRET
      from EMPLEADOS E, TERCEROS T
      where (E.EMPL_FECRET > :FECLIQ or (E.EMPL_FECRET is null)) and
            E.EMPL_FECING < :FECLIQ and
            T.TERC_NIT = E.TERC_NIT and
            E.TERC_NIT in (select PA.TERC_NIT
                           from PAGO_APORTES_DETALLE PA
                           where PA.PGAP_ID = :IDDOC)
      into :NITEMPL, :TIPOID, :CIUDAD, :TIPOCOT, :STIPOCOT, :NOM1, :NOM2, :APE1, :APE2, :FECING, :FECRET
  do
  begin
    TIPREG = '02';
    DATOS = :DATOS || TIPREG;
    SECINT = SECINT + 1;
    execute procedure CEROS_ANCHO_FIJO(cast(SECINT as varchar(200)), 5, 'N')
        returning_values (:SEC);
    DATOS = DATOS || :SEC;
    if (:TIPOID = 'N') then
      TIPOID = 'NI';
    if (:TIPOID = 'C') then
      TIPOID = 'CC';
    if (:TIPOID = 'E') then
      TIPOID = 'CE';
    if (:TIPOID = 'T') then
      TIPOID = 'TI';
    if (:TIPOID = 'R') then
      TIPOID = 'RC';
    if (:TIPOID = 'P') then
      TIPOID = 'PA';
    if (:TIPOID = 'J') then
      TIPOID = 'CC';
    DATOS = DATOS || TIPOID;
    execute procedure CEROS_ANCHO_FIJO(:NITEMPL, 16, 'A')
        returning_values (:NITEMPL);
    DATOS = DATOS || :NITEMPL;
    execute procedure CEROS_ANCHO_FIJO(:TIPOCOT, 2, 'N')
        returning_values (:TIPOCOT);
    DATOS = DATOS || :TIPOCOT;
    execute procedure CEROS_ANCHO_FIJO(:STIPOCOT, 2, 'N')
        returning_values (:STIPOCOT);
    DATOS = DATOS || :STIPOCOT;
    DATOS = DATOS || ' ';
    DATOS = DATOS || ' ';
    DATOS = DATOS || SUBSTR(:CIUDAD, 1, 2);
    DATOS = DATOS || SUBSTR(:CIUDAD, 3, 6);
    execute procedure CEROS_ANCHO_FIJO(:APE1, 20, 'A')
        returning_values (:APE1);
    if (APE1 is null) then
      APE1 = '';
    DATOS = DATOS || :APE1;
    execute procedure CEROS_ANCHO_FIJO(:APE2, 30, 'A')
        returning_values (:APE2);
    if (APE2 is null) then
      APE2 = '';
    DATOS = DATOS || :APE2;
    execute procedure CEROS_ANCHO_FIJO(:NOM1, 20, 'A')
        returning_values (:NOM1);
    if (NOM1 is null) then
      NOM1 = '';
    DATOS = DATOS || :NOM1;
    execute procedure CEROS_ANCHO_FIJO(:NOM2, 30, 'A')
        returning_values (:NOM2);
    if (NOM2 is null) then
      NOM2 = '';
    DATOS = DATOS || :NOM2;
    NOVEDAD = null;
    if ((SUBSTR(:FECING, 6, 7) = SUBSTR(:FECLIQ, 6, 7)) and
        (SUBSTR(:FECING, 1, 4) = SUBSTR(:FECLIQ, 1, 4))) then
      NOVEDAD = 'X';
    else
      NOVEDAD = ' ';
    DATOS = :DATOS || :NOVEDAD;
    NOVEDAD = null;
    if (:FECRET is not null and
        (SUBSTR(:FECRET, 6, 7) = SUBSTR(:FECLIQ, 6, 7))) then
      NOVEDAD = 'X';
    else
      NOVEDAD = ' ';
    DATOS = :DATOS || :NOVEDAD;
    NOVEDAD = null;
    select count(*)
    from NOMINA_NOVEDADES V
    where (SUBSTR(NONO_FECHA, 1, 4) = SUBSTR(:FECLIQ, 1, 4)) and
          (SUBSTR(NONO_FECHA, 6, 7) = SUBSTR(:FECLIQ, 6, 7)) and
          V.TNOV_COD = 5 and
          V.NONO_TIPOADM = 'E' and
          V.TERC_NIT = :NITEMPL
    into :COUNTNOV;
    if (:COUNTNOV > 0) then
      NOVEDAD = 'X';
    else
      NOVEDAD = ' ';
    DATOS = :DATOS || :NOVEDAD;
    NOVEDAD = null;
    select count(*)
    from NOMINA_NOVEDADES V
    where (SUBSTR(NONO_FECHA, 1, 4) = SUBSTR(:FECLIQ, 1, 4)) and
          (SUBSTR(NONO_FECHA, 6, 7) = SUBSTR(:FECLIQ, 6, 7)) and
          V.TNOV_COD = 5 and
          V.NONO_TIPOADM = 'E' and
          V.TERC_NIT = :NITEMPL
    into :COUNTNOV;
    if (:COUNTNOV > 0) then
      NOVEDAD = 'X';
    else
      NOVEDAD = ' ';
    DATOS = :DATOS || :NOVEDAD;
    NOVEDAD = null;
    select count(*)
    from NOMINA_NOVEDADES V
    where (SUBSTR(NONO_FECHA, 1, 4) = SUBSTR(:FECLIQ, 1, 4)) and
          (SUBSTR(NONO_FECHA, 6, 7) = SUBSTR(:FECLIQ, 6, 7)) and
          V.TNOV_COD = 5 and
          V.NONO_TIPOADM = 'A' and
          V.TERC_NIT = :NITEMPL
    into :COUNTNOV;
    if (:COUNTNOV > 0) then
      NOVEDAD = 'X';
    else
      NOVEDAD = ' ';
    DATOS = :DATOS || :NOVEDAD;
    NOVEDAD = null;
    select count(*)
    from NOMINA_NOVEDADES V
    where (SUBSTR(NONO_FECHA, 1, 4) = SUBSTR(:FECLIQ, 1, 4)) and
          (SUBSTR(NONO_FECHA, 6, 7) = SUBSTR(:FECLIQ, 6, 7)) and
          V.TNOV_COD = 5 and
          V.NONO_TIPOADM = 'A' and
          V.TERC_NIT = :NITEMPL
    into :COUNTNOV;
    if (:COUNTNOV > 0) then
      NOVEDAD = 'X';
    else
      NOVEDAD = ' ';
    DATOS = :DATOS || :NOVEDAD;
    NOVEDAD = null;
    select count(*)
    from NOMINA_NOVEDADES V
    where (SUBSTR(NONO_FECHA, 1, 4) = SUBSTR(:FECLIQ, 1, 4)) and
          (SUBSTR(NONO_FECHA, 6, 7) = SUBSTR(:FECLIQ, 6, 7)) and
          V.TNOV_COD = 8 and
          V.NONO_TIPOADM = 'A' and
          V.TERC_NIT = :NITEMPL
    into :COUNTNOV;
    if (:COUNTNOV > 0) then
      NOVEDAD = 'X';
    else
      NOVEDAD = ' ';
    DATOS = :DATOS || :NOVEDAD;
    NOVEDAD = null;
    select count(*)
    from NOMINA_NOVEDADES V
    where (SUBSTR(NONO_FECHA, 1, 4) = SUBSTR(:FECLIQ, 1, 4)) and
          (SUBSTR(NONO_FECHA, 6, 7) = SUBSTR(:FECLIQ, 6, 7)) and
          V.TNOV_COD = 10 and
          V.NONO_TIPOADM = 'A' and
          V.TERC_NIT = :NITEMPL
    into :COUNTNOV;
    if (:COUNTNOV > 0) then
      NOVEDAD = 'X';
    else
      NOVEDAD = ' ';
    DATOS = :DATOS || :NOVEDAD;
    NOVEDAD = null;
    select count(*)
    from NOMINA_NOVEDADES V
    where (SUBSTR(NONO_FECHA, 1, 4) = SUBSTR(:FECLIQ, 1, 4)) and
          (SUBSTR(NONO_FECHA, 6, 7) = SUBSTR(:FECLIQ, 6, 7)) and
          V.TNOV_COD = 11 and
          V.TERC_NIT = :NITEMPL
    into :COUNTNOV;
    if (:COUNTNOV > 0) then
      NOVEDAD = 'X';
    else
      NOVEDAD = ' ';
    DATOS = :DATOS || :NOVEDAD;
    NOVEDAD = null;
    select count(*)
    from NOMINA_NOVEDADES V
    where (SUBSTR(NONO_FECHA, 1, 4) = SUBSTR(:FECLIQ, 1, 4)) and
          (SUBSTR(NONO_FECHA, 6, 7) = SUBSTR(:FECLIQ, 6, 7)) and
          V.TNOV_COD = 9 and
          V.TERC_NIT = :NITEMPL
    into :COUNTNOV;
    if (:COUNTNOV > 0) then
      NOVEDAD = 'X';
    else
      NOVEDAD = ' ';
    DATOS = :DATOS || :NOVEDAD;
    NOVEDAD = null;
    select count(*)
    from NOMINA_NOVEDADES V
    where (SUBSTR(NONO_FECHA, 1, 4) = SUBSTR(:FECLIQ, 1, 4)) and
          (SUBSTR(NONO_FECHA, 6, 7) = SUBSTR(:FECLIQ, 6, 7)) and
          V.TNOV_COD = 2 and
          V.TERC_NIT = :NITEMPL
    into :COUNTNOV;
    if (:COUNTNOV > 0) then
      NOVEDAD = 'X';
    else
      NOVEDAD = ' ';
    DATOS = :DATOS || :NOVEDAD;
    NOVEDAD = null;
    select count(*)
    from NOMINA_NOVEDADES V
    where (SUBSTR(NONO_FECHA, 1, 4) = SUBSTR(:FECLIQ, 1, 4)) and
          (SUBSTR(NONO_FECHA, 6, 7) = SUBSTR(:FECLIQ, 6, 7)) and
          V.TNOV_COD = 4 and
          V.TERC_NIT = :NITEMPL
    into :COUNTNOV;
    if (:COUNTNOV > 0) then
      NOVEDAD = 'X';
    else
      NOVEDAD = ' ';
    DATOS = :DATOS || :NOVEDAD;
    NOVEDAD = null;
    select count(*)
    from NOMINA_NOVEDADES V
    where (SUBSTR(NONO_FECHA, 1, 4) = SUBSTR(:FECLIQ, 1, 4)) and
          (SUBSTR(NONO_FECHA, 6, 7) = SUBSTR(:FECLIQ, 6, 7)) and
          V.TNOV_COD = 6 and
          V.TERC_NIT = :NITEMPL
    into :COUNTNOV;
    if (:COUNTNOV > 0) then
      NOVEDAD = 'X';
    else
      NOVEDAD = ' ';
    DATOS = :DATOS || :NOVEDAD;
    NOVEDAD = null;
    select count(*)
    from NOMINA_NOVEDADES V
    where (SUBSTR(NONO_FECHA, 1, 4) = SUBSTR(:FECLIQ, 1, 4)) and
          (SUBSTR(NONO_FECHA, 6, 7) = SUBSTR(:FECLIQ, 6, 7)) and
          V.TNOV_COD = 1 and
          V.TERC_NIT = :NITEMPL
    into :COUNTNOV;
    if (:COUNTNOV > 0) then
      NOVEDAD = 'X';
    else
      NOVEDAD = ' ';
    DATOS = :DATOS || :NOVEDAD;
    NOVEDAD = null;
    select count(*)
    from NOMINA_NOVEDADES V
    where (SUBSTR(NONO_FECHA, 1, 4) = SUBSTR(:FECLIQ, 1, 4)) and
          (SUBSTR(NONO_FECHA, 6, 7) = SUBSTR(:FECLIQ, 6, 7)) and
          V.TNOV_COD = 7 and
          V.TERC_NIT = :NITEMPL
    into :COUNTNOV;
    if (:COUNTNOV > 0) then
      NOVEDAD = 'X';
    else
      NOVEDAD = ' ';
    DATOS = :DATOS || :NOVEDAD;
    select V.NONO_DURA
    from NOMINA_NOVEDADES V
    where (SUBSTR(NONO_FECHA, 1, 4) = SUBSTR(:FECLIQ, 1, 4)) and
          (SUBSTR(NONO_FECHA, 6, 7) = SUBSTR(:FECLIQ, 6, 7)) and
          V.TNOV_COD = 3 and
          V.TERC_NIT = :NITEMPL
    into :COUNTNOV;
    if (:COUNTNOV > 0) then
    begin
      NOVEDAD = :COUNTNOV;
    end
    else
    begin
      COUNTNOV = 0;
    end
    execute procedure CEROS_ANCHO_FIJO(:COUNTNOV, 2, 'N')
        returning_values (:INCAP);
    DATOS = :DATOS || :INCAP;
    select A.ADMI_CODAFP
    from ADMINISTRADORA A, EMPLEADOS E
    where E.EMPL_AFP = A.TERC_NIT and
          E.TERC_NIT = :NITEMPL
    into :CODADMIN;
    if (:CODADMIN is null) then
      CODADMIN = ' ';
    execute procedure CEROS_ANCHO_FIJO(:CODADMIN, 6, 'A')
        returning_values (:CODADMIN);
    DATOS = :DATOS || :CODADMIN;
    CODADMIN = '';
    select A.ADMI_CODAFP
    from NOMINA_NOVEDADES V, EMPLEADOS E, ADMINISTRADORA A
    where (SUBSTR(NONO_FECHA, 1, 4) = SUBSTR(:FECLIQ, 1, 4)) and
          (SUBSTR(NONO_FECHA, 6, 7) = SUBSTR(:FECLIQ, 6, 7)) and
          V.TNOV_COD = 5 and
          V.NONO_TIPOADM = 'A' and
          V.NONO_NVAADM = A.TERC_NIT
    into :CODADMIN;
    if (:CODADMIN is null) then
      CODADMIN = ' ';
    execute procedure CEROS_ANCHO_FIJO(:CODADMIN, 6, 'A')
        returning_values (:CODADMIN);
    DATOS = :DATOS || :CODADMIN;
    CODADMIN = '';
    select A.ADMI_CODEPS
    from ADMINISTRADORA A, EMPLEADOS E
    where E.EMPL_EPS = A.TERC_NIT and
          E.TERC_NIT = :NITEMPL
    into :CODADMIN;
    if (:CODADMIN is null) then
      CODADMIN = ' ';
    execute procedure CEROS_ANCHO_FIJO(:CODADMIN, 6, 'A')
        returning_values (:CODADMIN);
    DATOS = :DATOS || :CODADMIN;
    CODADMIN = '';
    select A.ADMI_CODEPS
    from NOMINA_NOVEDADES V, EMPLEADOS E, ADMINISTRADORA A
    where (SUBSTR(NONO_FECHA, 1, 4) = SUBSTR(:FECLIQ, 1, 4)) and
          (SUBSTR(NONO_FECHA, 6, 7) = SUBSTR(:FECLIQ, 6, 7)) and
          V.TNOV_COD = 5 and
          V.NONO_TIPOADM = 'E' and
          V.NONO_NVAADM = A.TERC_NIT
    into :CODADMIN;
    if (:CODADMIN is null) then
      CODADMIN = ' ';
    execute procedure CEROS_ANCHO_FIJO(:CODADMIN, 6, 'A')
        returning_values (:CODADMIN);
    DATOS = :DATOS || :CODADMIN;
    select A.ADMI_CODCCF
    from ADMINISTRADORA A, EMPLEADOS E
    where E.EMPL_CCF = A.TERC_NIT and
          E.TERC_NIT = :NITEMPL
    into :CODADMIN;
    if (:CODADMIN is null) then
      CODADMIN = ' ';
    execute procedure CEROS_ANCHO_FIJO(:CODADMIN, 6, 'A')
        returning_values (:CODADMIN);
    DATOS = :DATOS || :CODADMIN;
    CODADMIN = '';
    select max(ND.NODE_DIASLAB)
    from NOMINA_DETALLE ND, PAGO_APORTES PA
    where PA.PGAP_ID = :IDDOC and
          ND.TERC_NIT = :NITEMPL and
          PA.PGAP_IDNOMINA = ND.NOMI_ID
    into :DIASLAB;
    if (:DIASLAB is null) then
      DIASLAB = '00';
    execute procedure CEROS_ANCHO_FIJO(:DIASLAB, 2, 'N')
        returning_values (:DIASLAB);
    DATOS = :DATOS || :DIASLAB;
    select max(ND.NODE_DIASLAB)
    from NOMINA_DETALLE ND, PAGO_APORTES PA
    where PA.PGAP_ID = :IDDOC and
          ND.TERC_NIT = :NITEMPL and
          PA.PGAP_IDNOMINA = ND.NOMI_ID
    into :DIASLAB;
    if (:DIASLAB is null) then
      DIASLAB = '00';
    execute procedure CEROS_ANCHO_FIJO(:DIASLAB, 2, 'N')
        returning_values (:DIASLAB);
    DATOS = :DATOS || :DIASLAB;
    select max(ND.NODE_DIASLAB)
    from NOMINA_DETALLE ND, PAGO_APORTES PA
    where PA.PGAP_ID = :IDDOC and
          ND.TERC_NIT = :NITEMPL and
          PA.PGAP_IDNOMINA = ND.NOMI_ID
    into :DIASLAB;
    if (:DIASLAB is null) then
      DIASLAB = '00';
    execute procedure CEROS_ANCHO_FIJO(:DIASLAB, 2, 'N')
        returning_values (:DIASLAB);
    DATOS = :DATOS || :DIASLAB;
    select max(ND.NODE_DIASLAB)
    from NOMINA_DETALLE ND, PAGO_APORTES PA
    where PA.PGAP_ID = :IDDOC and
          ND.TERC_NIT = :NITEMPL and
          PA.PGAP_IDNOMINA = ND.NOMI_ID
    into :DIASLAB;
    if (:DIASLAB is null) then
      DIASLAB = '00';
    execute procedure CEROS_ANCHO_FIJO(:DIASLAB, 2, 'N')
        returning_values (:DIASLAB);
    DATOS = :DATOS || :DIASLAB;
    select first 1 M.MVSE_SALARIO
    from MOVIMIENTO_SALARIO_EMPLEADO M
    where M.TERC_NIT = :NITEMPL and
          M.MVSE_FECHA <= :FECLIQ
    order by M.MVSE_FECHA desc
    into :SALBASIC;
    if (:SALBASIC is null) then
      SALBASIC = '0';
    SALBASIC = SUBSTR(SALBASIC, 1, STRLEN(SALBASIC) - 3);
    execute procedure CEROS_ANCHO_FIJO(:SALBASIC, 9, 'N')
        returning_values (:SALBASIC);
    DATOS = :DATOS || :SALBASIC;
    DATOS = :DATOS || ' ';
    select E.PGAE_IBC
    from PAGO_APORTES_EMPLEADOS E
    where E.TERC_NIT = :NITEMPL and
          E.PGAP_ID = :IDDOC
    into :SALBASIC;
    if (:SALBASIC is null) then
      SALBASIC = '0';
    execute procedure REDONDEE(SALBASIC, 1000)
        returning_values (SALBASIC);
    SALBASIC = SUBSTR(SALBASIC, 1, STRLEN(SALBASIC) - 5);
    execute procedure CEROS_ANCHO_FIJO(:SALBASIC, 9, 'N')
        returning_values (:SALBASIC);
    DATOS = :DATOS || :SALBASIC;
    DATOS = :DATOS || :SALBASIC;
    DATOS = :DATOS || :SALBASIC;
    DATOS = :DATOS || :SALBASIC;
    select P.PAAN_AFPTR + P.PAAN_AFPEM
    from PARAMETROS_ANO P
    where P.PAAN_ANO = SUBSTR(:FECLIQ, 1, 4)
    into :PORCAPOR;
    PORCAPOR = SUBSTR(PORCAPOR, 1, STRLEN(PORCAPOR) - 2);
    execute procedure CEROS_ANCHO_FIJO(:PORCAPOR, 7, 'N')
        returning_values (:PORCAPOR);
    DATOS = :DATOS || :PORCAPOR;
    select P.PADE_COTOBL
    from PAGO_APORTES_DETALLE P
    where P.TERC_NIT = :NITEMPL and
          P.PADE_TIPAP = 'AFP' and
          P.PGAP_ID = :IDDOC
    into :COTOBL;
    COTOBL = SUBSTR(COTOBL, 1, STRLEN(COTOBL) - 3);
    execute procedure CEROS_ANCHO_FIJO(:COTOBL, 9, 'N')
        returning_values (:COTOBL);
    DATOS = :DATOS || :COTOBL;
    DATOS = :DATOS || '000000000';
    DATOS = :DATOS || '000000000';
    DATOS = :DATOS || '000000000';
    DATOS = :DATOS || '000000000';
    DATOS = :DATOS || '000000000';
    DATOS = :DATOS || '000000000';
    select P.PAAN_EPSTR + P.PAAN_EPSEM
    from PARAMETROS_ANO P
    where P.PAAN_ANO = SUBSTR(:FECLIQ, 1, 4)
    into :PORCAPOR;
    PORCAPOR = SUBSTR(PORCAPOR, 1, STRLEN(PORCAPOR) - 2);
    execute procedure CEROS_ANCHO_FIJO(:PORCAPOR, 7, 'N')
        returning_values (:PORCAPOR);
    DATOS = :DATOS || :PORCAPOR;
    select P.PADE_COTOBL
    from PAGO_APORTES_DETALLE P
    where P.TERC_NIT = :NITEMPL and
          P.PADE_TIPAP = 'EPS' and
          P.PGAP_ID = :IDDOC
    into :COTOBL;
    COTOBL = SUBSTR(COTOBL, 1, STRLEN(COTOBL) - 3);
    execute procedure CEROS_ANCHO_FIJO(:COTOBL, 9, 'N')
        returning_values (:COTOBL);
    DATOS = :DATOS || :COTOBL;
    DATOS = :DATOS || '000000000';
    DATOS = :DATOS || '               ';
    DATOS = :DATOS || '000000000';
    DATOS = :DATOS || '               ';
    DATOS = :DATOS || '000000000';
    PORCAPOR2 = '0.25';
    execute procedure CEROS_ANCHO_FIJO(:PORCAPOR2, 9, 'N')
        returning_values (:PORCAPOR2);
    DATOS = :DATOS || :PORCAPOR2;
    DATOS = :DATOS || '000000000';
    select P.PADE_COTOBL
    from PAGO_APORTES_DETALLE P
    where P.TERC_NIT = :NITEMPL and
          P.PADE_TIPAP = 'ARP' and
          P.PGAP_ID = :IDDOC
    into :COTOBL;
    COTOBL = SUBSTR(COTOBL, 1, STRLEN(COTOBL) - 3);
    execute procedure CEROS_ANCHO_FIJO(:COTOBL, 9, 'N')
        returning_values (:COTOBL);
    DATOS = :DATOS || :COTOBL;
    select P.PAAN_CCF
    from PARAMETROS_ANO P
    where P.PAAN_ANO = SUBSTR(:FECLIQ, 1, 4)
    into :PORCAPOR;
    PORCAPOR = SUBSTR(PORCAPOR, 1, STRLEN(PORCAPOR) - 2);
    execute procedure CEROS_ANCHO_FIJO(:PORCAPOR, 7, 'N')
        returning_values (:PORCAPOR);
    DATOS = :DATOS || :PORCAPOR;
    select (P.PADE_COTOBL) * 4 / 9
    from PAGO_APORTES_DETALLE P
    where P.TERC_NIT = :NITEMPL and
          P.PADE_TIPAP = 'CCF' and
          P.PGAP_ID = :IDDOC
    into :COTOBL;
    COTOBL = SUBSTR(COTOBL, 1, STRLEN(COTOBL) - 3);
    execute procedure CEROS_ANCHO_FIJO(:COTOBL, 9, 'N')
        returning_values (:COTOBL);
    DATOS = :DATOS || :COTOBL;
    select P.PAAN_SENA
    from PARAMETROS_ANO P
    where P.PAAN_ANO = SUBSTR(:FECLIQ, 1, 4)
    into :PORCAPOR;
    PORCAPOR = SUBSTR(PORCAPOR, 1, STRLEN(PORCAPOR) - 2);
    execute procedure CEROS_ANCHO_FIJO(:PORCAPOR, 7, 'N')
        returning_values (:PORCAPOR);
    DATOS = :DATOS || :PORCAPOR;
    select (P.PADE_COTOBL) * 2 / 9
    from PAGO_APORTES_DETALLE P
    where P.TERC_NIT = :NITEMPL and
          P.PADE_TIPAP = 'CCF' and
          P.PGAP_ID = :IDDOC
    into :COTOBL;
    COTOBL = SUBSTR(COTOBL, 1, STRLEN(COTOBL) - 3);
    execute procedure CEROS_ANCHO_FIJO(:COTOBL, 9, 'N')
        returning_values (:COTOBL);
    DATOS = :DATOS || :COTOBL;
    select P.PAAN_ICBF
    from PARAMETROS_ANO P
    where P.PAAN_ANO = SUBSTR(:FECLIQ, 1, 4)
    into :PORCAPOR;
    PORCAPOR = SUBSTR(PORCAPOR, 1, STRLEN(PORCAPOR) - 2);
    execute procedure CEROS_ANCHO_FIJO(:PORCAPOR, 7, 'N')
        returning_values (:PORCAPOR);
    DATOS = :DATOS || :PORCAPOR;
    select (P.PADE_COTOBL) * 3 / 9
    from PAGO_APORTES_DETALLE P
    where P.TERC_NIT = :NITEMPL and
          P.PADE_TIPAP = 'CCF' and
          P.PGAP_ID = :IDDOC
    into :COTOBL;
    COTOBL = SUBSTR(COTOBL, 1, STRLEN(COTOBL) - 3);
    execute procedure CEROS_ANCHO_FIJO(:COTOBL, 9, 'N')
        returning_values (:COTOBL);
    DATOS = :DATOS || :COTOBL;
    DATOS = :DATOS || '0000000';
    DATOS = :DATOS || '000000000';
    DATOS = :DATOS || '0000000';
    DATOS = :DATOS || '000000000';
    suspend;
    DATOS = '';
    COTOBL = 0;
  end
  DATOS = '';
  SECINT = 0;
  for select A.ADMI_CODAFP, A.TERC_NIT, P.PGAP_MONTO, P.PGAP_ITEM
      from ADMINISTRADORA A, PAGO_APORTES P
      where (P.PGAP_ADMIN = A.TERC_NIT) and
            P.PGAP_ID = :IDDOC and
            A.ADMI_AFP = 'S'
      into :CODADMIN, :NITADMIN, :COTOBLADM, :ITEMADM
  do
  begin
    TIPREG = '03';
    DATOS = :DATOS || :TIPREG;
    SECINT = SECINT + 1;
    execute procedure CEROS_ANCHO_FIJO(cast(SECINT as varchar(200)), 5, 'N')
        returning_values (:SEC);
    DATOS = DATOS || :SEC;
    execute procedure CEROS_ANCHO_FIJO(CODADMIN, 6, 'A')
        returning_values (:CODADMIN);
    DATOS = DATOS || :CODADMIN;
    execute procedure DV(NITADMIN)
        returning_values (DVCIA);
    execute procedure CEROS_ANCHO_FIJO(NITADMIN, 16, 'A')
        returning_values (:NITADMIN);
    DATOS = DATOS || :NITADMIN;
    DATOS = :DATOS || :DVCIA;
    select sum(P.PADE_COTOBL)
    from PAGO_APORTES_DETALLE P
    where P.PADE_ITEMDET = :ITEMADM and
          P.PADE_TIPAP = 'AFP' and
          P.PGAP_ID = :IDDOC
    into :COTOBLADM;
    COTOBLADM = SUBSTR(COTOBLADM, 1, STRLEN(COTOBLADM) - 3);
    execute procedure CEROS_ANCHO_FIJO(COTOBLADM, 10, 'N')
        returning_values (:COTOBLADM);
    DATOS = DATOS || :COTOBLADM;
    DATOS = DATOS || '00000000000000000000000000000000000000000000000000000000000000000000000000';
    execute procedure CEROS_ANCHO_FIJO(COTOBLADM, 10, 'N')
        returning_values (:COTOBLADM);
    DATOS = DATOS || :COTOBLADM;
    select count(P.PGAP_ITEM)
    from PAGO_APORTES_DETALLE P
    where P.PADE_ITEMDET = :ITEMADM and
          P.PADE_TIPAP = 'AFP' and
          P.PGAP_ID = :IDDOC
    into :NUMEMPLADM;
    execute procedure CEROS_ANCHO_FIJO(NUMEMPLADM, 6, 'N')
        returning_values (:NUMEMPLADM);
    DATOS = DATOS || :NUMEMPLADM;
    if (COTOBLADM <> '0000000000') then
      suspend;
    DATOS = '';
  end
  SECINT = 0;
  for select A.ADMI_CODEPS, A.TERC_NIT, P.PGAP_ITEM
      from ADMINISTRADORA A, PAGO_APORTES P
      where (P.PGAP_ADMIN = A.TERC_NIT) and
            P.PGAP_ID = :IDDOC and
            A.ADMI_EPS = 'S'
      into :CODADMIN, :NITADMIN, :ITEMADM
  do
  begin
    TIPREG = '04';
    DATOS = :DATOS || :TIPREG;
    SECINT = SECINT + 1;
    execute procedure CEROS_ANCHO_FIJO(cast(SECINT as varchar(200)), 5, 'N')
        returning_values (:SEC);
    DATOS = DATOS || :SEC;
    execute procedure CEROS_ANCHO_FIJO(CODADMIN, 6, 'A')
        returning_values (:CODADMIN);
    DATOS = DATOS || :CODADMIN;
    execute procedure DV(NITADMIN)
        returning_values (DVCIA);
    execute procedure CEROS_ANCHO_FIJO(NITADMIN, 16, 'A')
        returning_values (:NITADMIN);
    DATOS = DATOS || :NITADMIN;
    DATOS = :DATOS || :DVCIA;
    select sum(P.PADE_COTOBL)
    from PAGO_APORTES_DETALLE P
    where P.PADE_ITEMDET = :ITEMADM and
          P.PADE_TIPAP = 'EPS' and
          P.PGAP_ID = :IDDOC
    into :COTOBLADM;
    COTOBLADM = SUBSTR(COTOBLADM, 1, STRLEN(COTOBLADM) - 3);
    execute procedure CEROS_ANCHO_FIJO(COTOBLADM, 10, 'N')
        returning_values (:COTOBLADM);
    DATOS = DATOS || :COTOBLADM;
    DATOS = DATOS || '0000000000               0000000000               0000000000';
    execute procedure CEROS_ANCHO_FIJO(COTOBLADM, 10, 'N')
        returning_values (:COTOBLADM);
    DATOS = DATOS || :COTOBLADM;
    DATOS = DATOS || '000000000000000000000000';
    execute procedure CEROS_ANCHO_FIJO(COTOBLADM, 10, 'N')
        returning_values (:COTOBLADM);
    DATOS = DATOS || :COTOBLADM;
    DATOS = DATOS || '0000000000000000000000000000000000000000';
    execute procedure CEROS_ANCHO_FIJO(COTOBLADM, 10, 'N')
        returning_values (:COTOBLADM);
    DATOS = DATOS || :COTOBLADM;
    DATOS = DATOS || '0000000000';
    execute procedure CEROS_ANCHO_FIJO(COTOBLADM, 10, 'N')
        returning_values (:COTOBLADM);
    DATOS = DATOS || :COTOBLADM;
    DATOS = DATOS || '0000000000';
    select count(P.PGAP_ITEM)
    from PAGO_APORTES_DETALLE P
    where P.PADE_ITEMDET = :ITEMADM and
          P.PADE_TIPAP = 'EPS' and
          P.PGAP_ID = :IDDOC
    into :NUMEMPLADM;
    execute procedure CEROS_ANCHO_FIJO(NUMEMPLADM, 6, 'N')
        returning_values (:NUMEMPLADM);
    DATOS = DATOS || :NUMEMPLADM;
    if (COTOBLADM <> '0000000000') then
      suspend;
    DATOS = '';
  end
  SECINT = 0;
  for select A.ADMI_CODARP, A.TERC_NIT, P.PGAP_ITEM
      from ADMINISTRADORA A, PAGO_APORTES P
      where (P.PGAP_ADMIN = A.TERC_NIT) and
            P.PGAP_ID = :IDDOC and
            A.ADMI_ARP = 'S'
      into :CODADMIN, :NITADMIN, :ITEMADM
  do
  begin
    TIPREG = '05';
    DATOS = :DATOS || :TIPREG;
    SECINT = SECINT + 1;
    execute procedure CEROS_ANCHO_FIJO(cast(SECINT as varchar(200)), 5, 'N')
        returning_values (:SEC);
    DATOS = DATOS || :SEC;
    execute procedure CEROS_ANCHO_FIJO(CODADMIN, 6, 'A')
        returning_values (:CODADMIN);
    DATOS = DATOS || :CODADMIN;
    execute procedure DV(NITADMIN)
        returning_values (DVCIA);
    execute procedure CEROS_ANCHO_FIJO(NITADMIN, 16, 'A')
        returning_values (:NITADMIN);
    DATOS = DATOS || :NITADMIN;
    DATOS = :DATOS || :DVCIA;
    select sum(P.PADE_COTOBL)
    from PAGO_APORTES_DETALLE P
    where P.PGAP_ITEM = :ITEMADM and
          P.PADE_TIPAP = 'ARP' and
          P.PGAP_ID = :IDDOC
    into :COTOBLADM;
    COTOBLADM = SUBSTR(COTOBLADM, 1, STRLEN(COTOBLADM) - 3);
    execute procedure CEROS_ANCHO_FIJO(COTOBLADM, 10, 'N')
        returning_values (:COTOBLADM);
    DATOS = DATOS || :COTOBLADM;
    DATOS = DATOS || '               00000000000000000000';
    execute procedure CEROS_ANCHO_FIJO(COTOBLADM, 10, 'N')
        returning_values (:COTOBLADM);
    DATOS = DATOS || :COTOBLADM;
    DATOS = DATOS || '00000000000000';
    execute procedure CEROS_ANCHO_FIJO(COTOBLADM, 10, 'N')
        returning_values (:COTOBLADM);
    DATOS = DATOS || :COTOBLADM;
    DATOS = DATOS || '00000000000000000000';
    execute procedure CEROS_ANCHO_FIJO(COTOBLADM, 10, 'N')
        returning_values (:COTOBLADM);
    DATOS = DATOS || :COTOBLADM;
    select sum(P.PADE_COTOBL) / 100
    from PAGO_APORTES_DETALLE P
    where P.PGAP_ITEM = :ITEMADM and
          P.PADE_TIPAP = 'ARP' and
          P.PGAP_ID = :IDDOC
    into :COTOBLADM;
    COTOBLADM = SUBSTR(COTOBLADM, 1, STRLEN(COTOBLADM) - 3);
    execute procedure CEROS_ANCHO_FIJO(COTOBLADM, 10, 'N')
        returning_values (:COTOBLADM);
    DATOS = DATOS || :COTOBLADM;
    select count(P.PGAP_ITEM)
    from PAGO_APORTES_DETALLE P
    where P.PGAP_ITEM = :ITEMADM and
          P.PADE_TIPAP = 'ARP' and
          P.PGAP_ID = :IDDOC
    into :NUMEMPLADM;
    execute procedure CEROS_ANCHO_FIJO(NUMEMPLADM, 6, 'N')
        returning_values (:NUMEMPLADM);
    DATOS = DATOS || :NUMEMPLADM;
    if (COTOBLADM <> '0000000000') then
      suspend;
    DATOS = '';
  end
  SECINT = 0;
  for select A.ADMI_CODCCF, A.TERC_NIT, P.PGAP_ITEM
      from ADMINISTRADORA A, PAGO_APORTES P
      where (P.PGAP_ADMIN = A.TERC_NIT) and
            P.PGAP_ID = :IDDOC and
            A.ADMI_CCF = 'S'
      into :CODADMIN, :NITADMIN, :ITEMADM
  do
  begin
    TIPREG = '06';
    DATOS = :DATOS || :TIPREG;
    SECINT = SECINT + 1;
    execute procedure CEROS_ANCHO_FIJO(cast(SECINT as varchar(200)), 5, 'N')
        returning_values (:SEC);
    DATOS = DATOS || :SEC;
    execute procedure CEROS_ANCHO_FIJO(CODADMIN, 6, 'A')
        returning_values (:CODADMIN);
    DATOS = DATOS || :CODADMIN;
    execute procedure DV(NITADMIN)
        returning_values (DVCIA);
    execute procedure CEROS_ANCHO_FIJO(NITADMIN, 16, 'A')
        returning_values (:NITADMIN);
    DATOS = DATOS || :NITADMIN;
    DATOS = :DATOS || :DVCIA;
    select sum(P.PADE_COTOBL) * 4 / 9
    from PAGO_APORTES_DETALLE P
    where P.PGAP_ITEM = :ITEMADM and
          P.PADE_TIPAP = 'CCF' and
          P.PGAP_ID = :IDDOC
    into :COTOBLADM;
    COTOBLADM = SUBSTR(COTOBLADM, 1, STRLEN(COTOBLADM) - 3);
    execute procedure CEROS_ANCHO_FIJO(COTOBLADM, 10, 'N')
        returning_values (:COTOBLADM);
    DATOS = DATOS || :COTOBLADM;
    DATOS = DATOS || '00000000000000';
    execute procedure CEROS_ANCHO_FIJO(COTOBLADM, 10, 'N')
        returning_values (:COTOBLADM);
    DATOS = DATOS || :COTOBLADM;
    select count(P.PGAP_ITEM)
    from PAGO_APORTES_DETALLE P
    where P.PGAP_ITEM = :ITEMADM and
          P.PADE_TIPAP = 'CCF' and
          P.PGAP_ID = :IDDOC
    into :NUMEMPLADM;
    execute procedure CEROS_ANCHO_FIJO(NUMEMPLADM, 6, 'N')
        returning_values (:NUMEMPLADM);
    DATOS = DATOS || :NUMEMPLADM;
    if (COTOBLADM <> '0000000000') then
      suspend;
    DATOS = '';
  end
  SECINT = 0;
  for select A.ADMI_CODCCF, A.TERC_NIT, P.PGAP_ITEM
      from ADMINISTRADORA A, PAGO_APORTES P
      where (P.PGAP_ADMIN = A.TERC_NIT) and
            P.PGAP_ID = :IDDOC and
            A.ADMI_CCF = 'S'
      into :CODADMIN, :NITADMIN, :ITEMADM
  do
  begin
    TIPREG = '07';
    DATOS = :DATOS || :TIPREG;
    SECINT = SECINT + 1;
    execute procedure CEROS_ANCHO_FIJO(cast(SECINT as varchar(200)), 5, 'N')
        returning_values (:SEC);
    DATOS = DATOS || :SEC;
    NITADMIN = '899999034';
    execute procedure DV(NITADMIN)
        returning_values (DVCIA);
    execute procedure CEROS_ANCHO_FIJO(NITADMIN, 16, 'A')
        returning_values (:NITADMIN);
    DATOS = DATOS || :NITADMIN;
    DATOS = :DATOS || :DVCIA;
    select sum(P.PADE_COTOBL) * 2 / 9
    from PAGO_APORTES_DETALLE P
    where P.PGAP_ITEM = :ITEMADM and
          P.PADE_TIPAP = 'CCF' and
          P.PGAP_ID = :IDDOC
    into :COTOBLADM;
    COTOBLADM = SUBSTR(COTOBLADM, 1, STRLEN(COTOBLADM) - 3);
    execute procedure CEROS_ANCHO_FIJO(COTOBLADM, 10, 'N')
        returning_values (:COTOBLADM);
    DATOS = DATOS || :COTOBLADM;
    DATOS = DATOS || '00000000000000';
    execute procedure CEROS_ANCHO_FIJO(COTOBLADM, 10, 'N')
        returning_values (:COTOBLADM);
    DATOS = DATOS || :COTOBLADM;
    select count(P.PGAP_ITEM)
    from PAGO_APORTES_DETALLE P
    where P.PGAP_ITEM = :ITEMADM and
          P.PADE_TIPAP = 'CCF' and
          P.PGAP_ID = :IDDOC
    into :NUMEMPLADM;
    execute procedure CEROS_ANCHO_FIJO(NUMEMPLADM, 6, 'N')
        returning_values (:NUMEMPLADM);
    DATOS = DATOS || :NUMEMPLADM;
    if (COTOBLADM <> '0000000000') then
      suspend;
    DATOS = '';
  end
  SECINT = 0;
  for select A.ADMI_CODCCF, A.TERC_NIT, P.PGAP_ITEM
      from ADMINISTRADORA A, PAGO_APORTES P
      where (P.PGAP_ADMIN = A.TERC_NIT) and
            P.PGAP_ID = :IDDOC and
            A.ADMI_CCF = 'S'
      into :CODADMIN, :NITADMIN, :ITEMADM
  do
  begin
    TIPREG = '08';
    DATOS = :DATOS || :TIPREG;
    SECINT = SECINT + 1;
    execute procedure CEROS_ANCHO_FIJO(cast(SECINT as varchar(200)), 5, 'N')
        returning_values (:SEC);
    DATOS = DATOS || :SEC;
    NITADMIN = '800213277';
    execute procedure DV(NITADMIN)
        returning_values (DVCIA);
    execute procedure CEROS_ANCHO_FIJO(NITADMIN, 16, 'A')
        returning_values (:NITADMIN);
    DATOS = DATOS || :NITADMIN;
    DATOS = :DATOS || :DVCIA;
    select sum(P.PADE_COTOBL) * 3 / 9
    from PAGO_APORTES_DETALLE P
    where P.PGAP_ITEM = :ITEMADM and
          P.PADE_TIPAP = 'CCF' and
          P.PGAP_ID = :IDDOC
    into :COTOBLADM;
    COTOBLADM = SUBSTR(COTOBLADM, 1, STRLEN(COTOBLADM) - 3);
    execute procedure CEROS_ANCHO_FIJO(COTOBLADM, 10, 'N')
        returning_values (:COTOBLADM);
    DATOS = DATOS || :COTOBLADM;
    DATOS = DATOS || '00000000000000';
    execute procedure CEROS_ANCHO_FIJO(COTOBLADM, 10, 'N')
        returning_values (:COTOBLADM);
    DATOS = DATOS || :COTOBLADM;
    select count(P.PGAP_ITEM)
    from PAGO_APORTES_DETALLE P
    where P.PGAP_ITEM = :ITEMADM and
          P.PADE_TIPAP = 'CCF' and
          P.PGAP_ID = :IDDOC
    into :NUMEMPLADM;
    execute procedure CEROS_ANCHO_FIJO(NUMEMPLADM, 6, 'N')
        returning_values (:NUMEMPLADM);
    DATOS = DATOS || :NUMEMPLADM;
    if (COTOBLADM <> '0000000000') then
      suspend;
    DATOS = '';
  end
  TIPREG = '11';
  DATOS = :DATOS || :TIPREG;
  SECINT = SECINT + 1;
  select sum(P.PADE_COTOBL)
  from PAGO_APORTES_DETALLE P
  where P.PADE_TIPAP = 'AFP' and
        P.PGAP_ID = :IDDOC
  into :COTOBLADM;
  COTOBLADM = SUBSTR(COTOBLADM, 1, STRLEN(COTOBLADM) - 3);
  execute procedure CEROS_ANCHO_FIJO(COTOBLADM, 10, 'N')
      returning_values (:COTOBLADM);
  DATOS = DATOS || :COTOBLADM;
  select sum(P.PADE_COTOBL)
  from PAGO_APORTES_DETALLE P
  where P.PADE_TIPAP = 'EPS' and
        P.PGAP_ID = :IDDOC
  into :COTOBLADM;
  COTOBLADM = SUBSTR(COTOBLADM, 1, STRLEN(COTOBLADM) - 3);
  execute procedure CEROS_ANCHO_FIJO(COTOBLADM, 10, 'N')
      returning_values (:COTOBLADM);
  DATOS = DATOS || :COTOBLADM;
  select sum(P.PADE_COTOBL)
  from PAGO_APORTES_DETALLE P
  where P.PADE_TIPAP = 'ARP' and
        P.PGAP_ID = :IDDOC
  into :COTOBLADM;
  COTOBLADM = SUBSTR(COTOBLADM, 1, STRLEN(COTOBLADM) - 3);
  execute procedure CEROS_ANCHO_FIJO(COTOBLADM, 10, 'N')
      returning_values (:COTOBLADM);
  DATOS = DATOS || :COTOBLADM;
  select sum(P.PADE_COTOBL) * 4 / 9
  from PAGO_APORTES_DETALLE P
  where P.PADE_TIPAP = 'CCF' and
        P.PGAP_ID = :IDDOC
  into :COTOBLADM;
  COTOBLADM = SUBSTR(COTOBLADM, 1, STRLEN(COTOBLADM) - 3);
  execute procedure CEROS_ANCHO_FIJO(COTOBLADM, 10, 'N')
      returning_values (:COTOBLADM);
  DATOS = DATOS || :COTOBLADM;
  select sum(P.PADE_COTOBL) * 2 / 9
  from PAGO_APORTES_DETALLE P
  where P.PADE_TIPAP = 'CCF' and
        P.PGAP_ID = :IDDOC
  into :COTOBLADM;
  COTOBLADM = SUBSTR(COTOBLADM, 1, STRLEN(COTOBLADM) - 3);
  execute procedure CEROS_ANCHO_FIJO(COTOBLADM, 10, 'N')
      returning_values (:COTOBLADM);
  DATOS = DATOS || :COTOBLADM;
  select sum(P.PADE_COTOBL) * 3 / 9
  from PAGO_APORTES_DETALLE P
  where P.PADE_TIPAP = 'CCF' and
        P.PGAP_ID = :IDDOC
  into :COTOBLADM;
  COTOBLADM = SUBSTR(COTOBLADM, 1, STRLEN(COTOBLADM) - 3);
  execute procedure CEROS_ANCHO_FIJO(COTOBLADM, 10, 'N')
      returning_values (:COTOBLADM);
  DATOS = DATOS || :COTOBLADM;
  DATOS = DATOS || '00000000000000000000';
  select sum(P.PADE_COTOBL) * 3 / 9
  from PAGO_APORTES_DETALLE P
  where P.PGAP_ID = :IDDOC
  into :COTOBLADM;
  COTOBLADM = SUBSTR(COTOBLADM, 1, STRLEN(COTOBLADM) - 3);
  execute procedure CEROS_ANCHO_FIJO(COTOBLADM, 10, 'N')
      returning_values (:COTOBLADM);
  DATOS = DATOS || :COTOBLADM;
  select count(P.PGAP_ITEM)
  from PAGO_APORTES_DETALLE P
  where P.PADE_TIPAP = 'AFP' and
        P.PGAP_ID = :IDDOC
  into :NUMEMPLADM;
  execute procedure CEROS_ANCHO_FIJO(NUMEMPLADM, 10, 'N')
      returning_values (:NUMEMPLADM);
  DATOS = DATOS || :NUMEMPLADM;
  select count(P.PGAP_ITEM)
  from PAGO_APORTES_DETALLE P
  where P.PADE_TIPAP = 'EPS' and
        P.PGAP_ID = :IDDOC
  into :NUMEMPLADM;
  execute procedure CEROS_ANCHO_FIJO(NUMEMPLADM, 10, 'N')
      returning_values (:NUMEMPLADM);
  DATOS = DATOS || :NUMEMPLADM;
  select count(P.PGAP_ITEM)
  from PAGO_APORTES_DETALLE P
  where P.PADE_TIPAP = 'ARP' and
        P.PGAP_ID = :IDDOC
  into :NUMEMPLADM;
  execute procedure CEROS_ANCHO_FIJO(NUMEMPLADM, 10, 'N')
      returning_values (:NUMEMPLADM);
  DATOS = DATOS || :NUMEMPLADM;
  select count(P.PGAP_ITEM)
  from PAGO_APORTES_DETALLE P
  where P.PADE_TIPAP = 'CCF' and
        P.PGAP_ID = :IDDOC
  into :NUMEMPLADM;
  execute procedure CEROS_ANCHO_FIJO(NUMEMPLADM, 10, 'N')
      returning_values (:NUMEMPLADM);
  DATOS = DATOS || :NUMEMPLADM;
  suspend;
  DATOS = '';
end
^

SET TERM ; ^

SET TERM ^ ;

CREATE or ALTER PROCEDURE FORM_INTEGRADO_ELECTRONICO_ARP(
    IDDOC INTEGER,
    FECLIQ VARCHAR(8),
    CODOPER VARCHAR(2))
RETURNS (
    DATOS VARCHAR(700))
AS
declare variable tipreg varchar(2);
declare variable sec varchar(5);
declare variable secint integer;
declare variable codadmin varchar(6);
declare variable dat varchar(100);
declare variable nitadmin varchar(20);
declare variable montoadmin numeric(18,2);
begin
    secint = 0;
    codadmin = '';                  
    FOR SELECT a.admi_codarp, pa.pgap_admin, pa.pgap_monto FROM PAGO_APORTES PA, ADMINISTRADORA A
    WHERE A.admi_arp = 'S' and pa.pgap_admin = a.terc_nit and pa.pgap_id = :iddoc
    INTO :codadmin, :nitadmin, :montoadmin
    DO
    BEGIN
    if (codadmin IS NULL) then
    codadmin = '';
    tipreg  = '04';
    DATOS = :datos || tipreg;
    secint = secint + 1;
    EXECUTE PROCEDURE CEROS_ANCHO_FIJO (CAST(secint AS VARCHAR(200)), 5, 'N') RETURNING_VALUES (:sec);
    DATOS = DATOS || :SEC;
    DAT = codadmin;
    EXECUTE PROCEDURE CEROS_ANCHO_FIJO (:dat, 6, 'A') RETURNING_VALUES (:dat);
    datos = :datos || :dat;
    dat = '';
    dat = nitadmin;
    EXECUTE PROCEDURE CEROS_ANCHO_FIJO (:dat, 16, 'A') RETURNING_VALUES (:dat);
    datos = :datos || :dat;
    dat = '';
    EXECUTE PROCEDURE DV (nitadmin) RETURNING_VALUES (:dat);
    EXECUTE PROCEDURE CEROS_ANCHO_FIJO (:dat, 1, 'N') RETURNING_VALUES (:dat);
    datos = :datos || :dat;
    dat = '';
    dat = montoadmin;
    dat = substr(dat,1,strlen(dat)-3);
    EXECUTE PROCEDURE CEROS_ANCHO_FIJO (:dat, 10, 'N') RETURNING_VALUES (:dat);
    datos = :datos || :dat;
    dat = '';
    EXECUTE PROCEDURE CEROS_ANCHO_FIJO (:dat, 15, 'A') RETURNING_VALUES (:dat);
    datos = :datos || :dat;
    dat = '';
    dat = '0';
    EXECUTE PROCEDURE CEROS_ANCHO_FIJO (:dat, 10, 'N') RETURNING_VALUES (:dat);
    datos = :datos || :dat;
    dat = '';
    dat = '0';
    EXECUTE PROCEDURE CEROS_ANCHO_FIJO (:dat, 10, 'N') RETURNING_VALUES (:dat);
    datos = :datos || :dat;
    dat = '';
    dat = montoadmin;
    dat = substr(dat,1,strlen(dat)-3);
    EXECUTE PROCEDURE CEROS_ANCHO_FIJO (:dat, 10, 'N') RETURNING_VALUES (:dat);
    datos = :datos || :dat;
    dat = '';
    dat = '0';
    EXECUTE PROCEDURE CEROS_ANCHO_FIJO (:dat, 4, 'N') RETURNING_VALUES (:dat);
    datos = :datos || :dat;
    dat = '';
    dat = '0';
    EXECUTE PROCEDURE CEROS_ANCHO_FIJO (:dat, 10, 'N') RETURNING_VALUES (:dat);
    datos = :datos || :dat;
    dat = '';
    dat = montoadmin;
    dat = substr(dat,1,strlen(dat)-3);
    EXECUTE PROCEDURE CEROS_ANCHO_FIJO (:dat, 10, 'N') RETURNING_VALUES (:dat);
    datos = :datos || :dat;
    dat = '';
    dat = '0';
    EXECUTE PROCEDURE CEROS_ANCHO_FIJO (:dat, 10, 'N') RETURNING_VALUES (:dat);
    datos = :datos || :dat;
    dat = '';
    dat = '0';
    EXECUTE PROCEDURE CEROS_ANCHO_FIJO (:dat, 10, 'N') RETURNING_VALUES (:dat);
    datos = :datos || :dat;
    dat = '';
    dat = montoadmin;
    dat = substr(dat,1,strlen(dat)-3);
    EXECUTE PROCEDURE CEROS_ANCHO_FIJO (:dat, 10, 'N') RETURNING_VALUES (:dat);
    datos = :datos || :dat;
    dat = '';
    dat = '0';
    EXECUTE PROCEDURE CEROS_ANCHO_FIJO (:dat, 10, 'N') RETURNING_VALUES (:dat);
    datos = :datos || :dat;
    dat = '';
    SELECT COUNT(D.pgap_id) FROM PAGO_APORTES PA, PAGO_APORTES_DETALLE D WHERE pa.pgap_id = :iddoc AND PA.pgap_item = D.pgap_item AND PA.pgap_admin = :nitadmin and pa.pgap_id = d.pgap_id into :dat;
    if (dat is null) then
    dat = '0';
    EXECUTE PROCEDURE CEROS_ANCHO_FIJO (:dat, 6, 'N') RETURNING_VALUES (:dat);
    datos = :datos || :dat;
    dat = '';
    SUSPEND;
    datos = '';
    END
end

^

SET TERM ; ^



/* 20100611c */
/* BASICO PARA APORTES SOBRE EL 70% SI ES INTEGRAL CONFIGURABLE */
ALTER TABLE PARAMETROS_ANO
ADD PAAN_SALINTEG T_PORCENTAJE;

UPDATE PARAMETROS_ANO SET PAAN_SALINTEG = 70;
COMMIT WORK;

SET TERM ^ ;

CREATE OR ALTER procedure CAUSA_NOMINA (
    FEC date,
    PERIODO integer,
    PERIODICIDAD integer,
    PAGOGLOBAL char(1),
    ANO char(4),
    DEPTO integer)
returns (
    IDNOMINA integer,
    ITEMINI integer)
AS
declare variable ITEM integer;
declare variable NITE varchar(20) character set NONE;
declare variable NIT_TERCERO varchar(20);
declare variable CONCEPT integer;
declare variable MONTOS numeric(18,2);
declare variable PORCEN numeric(9,4);
declare variable ENTIDAD varchar(20);
declare variable CONC_COD integer;
declare variable CONC_DEDUC char(1);
declare variable CONC_PORC numeric(9,4);
declare variable CONC_ENTIDAD integer;
declare variable CONC_MONTO numeric(18,2);
declare variable CONC_MODIFI char(1);
declare variable CONC_PROMEDIO char(1);
declare variable VALOR numeric(18,2);
declare variable DIASLAB integer;
declare variable CONC_PROV char(1);
declare variable CONC_APORTE char(1);
declare variable NUMEROPROM integer;
declare variable CONC_APLICAPROM char(1);
declare variable PERINICIAL integer;
declare variable PERFINAL integer;
declare variable ANOINI integer;
declare variable ANOFIN integer;
declare variable CONC_DIAS char(1);
declare variable CONC_OTROCONC char(1);
declare variable CONC_CODOTROCONC integer;
declare variable ANOSUM integer;
declare variable SALARIO char(1) character set NONE;
declare variable LIQUIDAPER integer;
declare variable BASICO numeric(18,2);
declare variable NITEPS varchar(20);
declare variable NITAFC varchar(20);
declare variable NITAFP varchar(20);
declare variable NITCCF varchar(20);
declare variable GTOEMPR char(1);
declare variable COMISION numeric(18,2);
declare variable CAMBSALTRANS numeric(18,2);
declare variable SALDOSINI numeric(18,2);
declare variable DURANOV integer;
declare variable BASE numeric(18,2);
declare variable APROX integer;
declare variable MENSUAL char(1);
declare variable HORASEX numeric(18,2);
declare variable DIASNOV integer;
declare variable TOMASAL integer;
declare variable RETROACT numeric(18,2);
declare variable REEMBOLSO numeric(18,2);
declare variable INCAP numeric(18,2);
declare variable AUXTRANS numeric(18,2);
declare variable SMLV numeric(18,2);
declare variable BENEFICIOS numeric(18,2);
declare variable CONFIRMADO char(1);
declare variable RECNOCT numeric(18,2);
declare variable RECFEST numeric(18,2);
declare variable TAR_RECNOTC numeric(9,4);
declare variable TAR_RECFEST numeric(9,4);
declare variable RECARGO numeric(18,2);
declare variable BASICOREC numeric(18,2);
declare variable PARAMBENEF char(2);
declare variable VACACDISF numeric(18,2);
declare variable VALORPREDET numeric(18,2);
declare variable BASICOEMP numeric(18,2);
declare variable salinteg CHAR(1);
declare variable TAR_SALINTEG numeric(9,4);
begin
execute procedure LEE_CONFIGURACION('NOMINA','LIQUIDACION','TOMAR BENEFICIOS PARA CALCULAR PROVISIONES')returning_values(:PARAMBENEF);
execute procedure LEE_CONFIGURACION('NOMINA','GENERAL','REDONDEO AL MULTIPLO DE DIEZ EN TOTALES')returning_values(:APROX);
select N.NOMI_ID, N.NOMI_LIQOK from NOMINA N where N.NOMI_PERIODO = :PERIODO and N.NOMI_PERIODOCIDAD = :PERIODICIDAD
    and N.NOMI_ANO = :ANO into :IDNOMINA, :CONFIRMADO;
if (:IDNOMINA is null) then
    begin
    execute procedure CAMBIE_ID_NOMINA returning_values(:IDNOMINA);
    insert into NOMINA (NOMI_ID, NOMI_FECCAUSA, NOMI_PAGOGLOBAL, NOMI_PERIODOCIDAD, NOMI_PERIODO, NOMI_ANO, NOMI_LIQOK)
    values (:IDNOMINA, :FEC,:PAGOGLOBAL, :PERIODICIDAD, :PERIODO, :ANO, 'N');
    ITEM = 1;
    end
else
    begin
    select max(N.NOCO_ITEM) from NOMINA_CONCEPTOS N where N.NOMI_ID = :IDNOMINA
    into :ITEM;
    end
if ((CONFIRMADO = 'S') and (IDNOMINA is not null)) then
    begin
    IDNOMINA = 0;
    end
else
    begin
    insert into NOMINA_DEPARTAMENTO (NOMI_ID, NODP_DEPTO)values(:IDNOMINA,:DEPTO);
    select P.PAAN_RECNOC, P.PAAN_RECFEST, P.paan_salinteg from PARAMETROS_ANO P where P.PAAN_ANO = :ANO
        into :TAR_RECNOTC, :TAR_RECFEST, TAR_SALINTEG;
    ITEMINI = ITEM;
    for select E.TERC_NIT, E.EMPL_EPS, E.EMPL_AFC, E.EMPL_AFP, E.EMPL_CCF, E.empl_salinteg
        from EMPLEADOS E
        where E.EMPL_PPAGO = :PERIODICIDAD and ((E.EMPL_FECRET is null) or (E.EMPL_FECRET > :FEC)) and E.EMPL_FECING <= :FEC
        and ((:DEPTO = 0) or (e.empl_dpto = :DEPTO))
        into :NITE, :NITEPS, :NITAFC, :NITAFP, :NITCCF, :SALINTEG
        do
        begin
        select first 1 M.MVSE_SALARIO from MOVIMIENTO_SALARIO_EMPLEADO M where M.TERC_NIT = :NITE and M.MVSE_FECHA <= :FEC order by M.MVSE_FECHA desc into :BASICOEMP;
        BASICO = BASICOEMP;
        RECNOCT = null;
        RECFEST = null;
        select N.NOEX_RECNOCT, N.NOEX_RECFEST
            from NOMINA_HORASEXT N where N.NOEX_PERIODIO = :PERIODO and N.NOEX_ANO = :ANO and N.TERC_NIT = :NITE
            into :RECNOCT, :RECFEST;
        if (RECNOCT is null) then
            RECNOCT = 0;
        if (RECFEST is null) then
            RECFEST = 0;
        for select CE.TERC_NIT, CE.CONC_COD, CE.EMCO_MONTO, CE.EMCO_PORC, CE.EMPL_ENTIDAD, CE.EMCO_PERPROM, CE.EMCO_LUQUIDAPER, CE.EMCO_MENSUAL, CN.CONC_COD, CN.CONC_DEDUC,CN.CONC_PORC, CN.CONC_ENTIDAD, CN.CONC_MONTO,  CN.CONC_DIAS, CN.CONC_MODIFI,
            CN.CONC_PROMEDIO, CN.CONC_SALARIO, CN.CONC_PROV, CN.CONC_APORTE, CN.CONC_APLICAPROM, CN.CONC_OTROCONC, CN.CONC_CODOTROCONC, CN.CONC_GTOEMPR, CN.CONC_BASE, CE.EMCO_TOMSAL
            from EMPLEADO_CONCEPTOS CE, CONCEPTOS_NOMINA CN where (CE.CONC_COD = CN.CONC_COD) and (CE.TERC_NIT = :NITE) and
            ( ((CE.EMCO_FECINI <= :FEC and CE.EMCO_FECFIN >= :FEC)) or
            ((CN.CONC_TODOSPER = 'N') and (CE.EMCO_PPAGO = :PERIODO)) or ((CN.CONC_TODOSPER = 'S') AND (((:periodicidad = 1) AND (:PERIODO < 13)) or ((:periodicidad = 2) AND (:PERIODO < 25)))) )  order by (TERC_NIT )
            into :NIT_TERCERO, :CONCEPT,  :MONTOS, :PORCEN, :ENTIDAD, :NUMEROPROM, :LIQUIDAPER, :MENSUAL ,:CONC_COD, :CONC_DEDUC, :CONC_PORC,
            :CONC_ENTIDAD, :CONC_MONTO, :CONC_DIAS, :CONC_MODIFI,:CONC_PROMEDIO, :SALARIO,:CONC_PROV, :CONC_APORTE , :CONC_APLICAPROM, :CONC_OTROCONC, :CONC_CODOTROCONC, :GTOEMPR, :BASE, :TOMASAL
            do
            begin
            if (CONC_DIAS = 'S') then
                execute procedure DIAS_LABORADOS (:NITE, :PERIODO, :FEC, :MENSUAL,:CONC_APORTE) returning_values (:DIASLAB);
            else
                DIASLAB = 15;
            if (:TOMASAL <> 0) then
                begin
                /* SI EL CONCEPTO NOAPLICA EN ESTE PERIODO DEJE EL BASICO EN CERO */
                if ((:PERIODICIDAD = 2) and (:TOMASAL <> 2)) then
                    begin
                    if ((PERIODO = 2) or (PERIODO = 4) or (PERIODO = 6) or (PERIODO = 8) or (PERIODO = 10) or (PERIODO = 12)
                        or (PERIODO = 14) or (PERIODO = 16) or (PERIODO = 18) or (PERIODO = 20) or (PERIODO = 22) or (PERIODO = 24)) then
                        BASICO = 0;
                    end
                else
                    if ((:PERIODICIDAD = 3) and (:TOMASAL <> 1)) then
                        begin
                        if ((PERIODO = 1) or (PERIODO = 5) or (PERIODO = 9) or (PERIODO = 13) or (PERIODO = 17) or (PERIODO = 21)
                            or (PERIODO = 25) or (PERIODO = 29) or (PERIODO = 33) or (PERIODO = 37) or (PERIODO = 41) or (PERIODO = 45)
                            or (PERIODO = 49)) then
                            BASICO = 0;
                        end
                    else
                        if ((:PERIODICIDAD = 3) and (:TOMASAL <> 2)) then
                            begin
                            if ((PERIODO = 2) or (PERIODO = 6) or (PERIODO = 10) or (PERIODO = 14) or (PERIODO = 18) or (PERIODO = 22)
                                or (PERIODO = 26) or (PERIODO = 30) or (PERIODO = 34) or (PERIODO = 38) or (PERIODO = 42) or (PERIODO = 46)
                                or (PERIODO = 50)) then
                                BASICO = 0;
                            end
                        else
                            if ((:PERIODICIDAD = 3) and (:TOMASAL <> 3)) then
                                begin
                                if ((PERIODO = 3) or (PERIODO = 7) or (PERIODO = 11) or (PERIODO = 15) or (PERIODO = 19) or (PERIODO = 23)
                                    or (PERIODO = 27) or (PERIODO = 31) or (PERIODO = 35) or (PERIODO = 39) or (PERIODO = 43) or (PERIODO = 47)
                                    or (PERIODO = 51)) then
                                    BASICO = 0;
                                end
                            else
                                if ((:PERIODICIDAD = 3) and (:TOMASAL <> 4)) then
                                begin
                                if ((PERIODO = 4) or (PERIODO = 8) or (PERIODO = 12) or (PERIODO = 16) or (PERIODO = 20) or (PERIODO = 24)
                                    or (PERIODO = 29) or (PERIODO = 32) or (PERIODO = 36) or (PERIODO = 40) or (PERIODO = 44) or (PERIODO = 48)
                                    or (PERIODO = 52)) then
                                    BASICO = 0;
                                end
                end
            else
                begin
                /* SE CALCULA SOBRE TODOS LOS PERIODOS */
                BASICO = BASICOEMP;
                end
            VALORPREDET = null;
            select VP.NVPR_MONTO from NOMINA_VALOR_PREDET VP where VP.NVPR_PERIODICIDAD = :PERIODICIDAD and VP.NVPR_PERIODO = :PERIODO and VP.NVPR_ANO = :ANO and VP.CONC_COD = :CONC_COD and VP.TERC_NIT = :NITE
                into :VALORPREDET;
            if ((:VALORPREDET <> 0) and (VALORPREDET is not null)) then
                VALOR = VALORPREDET;
            else
                begin
                /* SI HAY UN CAMBIO TRANSITORIO DE SALARIO AJUSTE LOS DIAS Y CALCULE EL VALOR A SUMAR */
                select ((N.NONO_VALOR /30) * N.NONO_DURA), (N.NONO_DURA) from NOMINA_NOVEDADES N
                    where N.TNOV_COD = 11 and N.TERC_NIT = :NITE and N.NONO_PERIODO = :PERIODO into :CAMBSALTRANS, :DURANOV;
                if (CAMBSALTRANS is null) then
                    CAMBSALTRANS = 0;
                if (DURANOV is null) then
                    DURANOV = 0;
                DIASLAB = :DIASLAB - :DURANOV;
                /* SI ES UN PRESTAMO, TRAIGA LA CUOTA */
                if (CONC_COD = 922) then
                    begin
                    select sum(P.PRCU_MONTO) from PRESTAMO_CUOTAS P, PRESTAMO_NOMINA PN
                        where P.PRCU_ANO = :ANO and P.PRCU_PERIODO = :PERIODO and PN.PRNO_ID = P.PRNO_ID and PN.TERC_NIT = :NITE into :VALOR;
                    if (VALOR is null) then
                        VALOR = 0;
                    ITEM = :ITEM + 1;
                    /* MARQUE LA CUOTA COMO PAGADA */
                    update PRESTAMO_CUOTAS  P set PRCU_OK = 'S' where P.PRCU_ANO = :ANO and P.PRCU_PERIODO = :PERIODO and P.PRNO_ID = (select PN.PRNO_ID from PRESTAMO_NOMINA PN where PN.TERC_NIT = :NITE);
                    end
                else
                    if ((:MONTOS = 0) or (:MONTOS is null)) then
                        begin
                        /* SI EL CONCEPTO DEL EMPLEADO NO TIENE MONTO TRAIGA EL DE CONCEPTOS_NOMINA */
                        if ((CONC_PORC = 0 and :PORCEN = 0) or (CONC_PORC is null and :PORCEN = 0) or (CONC_PORC = 0 and :PORCEN is null) or (CONC_PORC is null and :PORCEN is null) ) then
                            begin
                            /* SIN PORCENTAJE */
                            if ((CONC_MONTO <> 0) and (CONC_MONTO is not null) ) then
                                begin
                                VALOR = :CONC_MONTO;
                                if (:CONC_DIAS = 'S') then
                                    VALOR = (:VALOR / 30) * :DIASLAB;
                                end
                            else
                                if (SALARIO = 'S' and CONC_COD <> 900 and CONC_COD <> 920 and CONC_COD <> 932 and CONC_COD <> 953) then
                                    begin
                                    /* SI ES SALARIO SUME LAS EXTRAS */
                                    BASICO = BASICOEMP;
                                    BASICO = ((:BASICO/30)*:DIASLAB) - (((:BASICO/30)/8)*:RECNOCT);/* PFP:DEBERIA SER + Y POR LA TARIFA QUE NO VEO POR NINGUN LADO */
                                    BASICO = :BASICO - (((:BASICO/30)/8)*:RECFEST);
                                    CONC_MONTO = :BASICO;
                                    VALOR = (:CONC_MONTO/*/30 * :diaslab*/ ) + :CAMBSALTRANS;
                                    end
                                else
                                    begin
                                    VALOR = MONTOS;
                                    if (:CONC_DIAS = 'S') then
                                        VALOR = (:VALOR / 30) * :DIASLAB;
                                    end
                            end
                        else    
                            begin
                            if (:PORCEN <> 0) then
                                begin
                                /* SI TIENE PORCENTAJE EN EMPLEADO_CONCEPTOS PERO EL MONTO SE TRAE DE CONCPETOS_NOMINA */
                                if ((CONC_MONTO <> 0) and (CONC_MONTO is not null) ) then
                                    begin
                                    VALOR = ((:CONC_MONTO ) * :PORCEN) /100;
                                    end
                                end
                            else
                                begin
                                /* NO TIENE PORCENTAJE EN EMPLEADO_CONCEPTOS SE TRAE MONTO Y PORC DE CONCPETOS_NOMINA */
                                if ((CONC_MONTO <> 0) and (CONC_MONTO is not null) ) then
                                    begin
                                    VALOR = ((:CONC_MONTO) * :CONC_PORC) /100;
                                    end
                                else
                                    if (SALARIO = 'S' and CONC_COD <> 900 and CONC_COD <> 920 and CONC_COD <> 932 and CONC_COD <> 953) then
                                        begin
                                        BASICO = BASICOEMP;
                                        BASICO = ((:BASICO/30)*:DIASLAB) - (((:BASICO/30)/8)*:RECNOCT);
                                        BASICO = :BASICO - (((:BASICO/30)/8)*:RECFEST);
                                        CONC_MONTO = :BASICO;
                                        VALOR = ((:CONC_MONTO)+ :CAMBSALTRANS * :CONC_PORC) /100;
                                        end
                                    else
                                        if (:CONC_MONTO = 0 and :MONTOS = 0) then
                                            begin
                                            CONC_MONTO = :BASICO;
                                            VALOR = (((:CONC_MONTO / 30) * :DIASLAB) + :CAMBSALTRANS * :CONC_PORC) /100;
                                            end
                                end
                            end
                        end
                    else
                        /* SI TIENE MONTO EN EMPLEADO_CONCEPTOS */
                        if ((CONC_PORC = 0 or (CONC_PORC is null)) and (:PORCEN = 0 or (PORCEN is null))) then
                            begin
                            VALOR = (:MONTOS);
                            if (:CONC_DIAS = 'S') then
                                VALOR = (:VALOR / 30) * :DIASLAB;   
                            end
                        else
                            if (:PORCEN <> 0 and PORCEN is not null) then
                                begin
                                VALOR = ((:MONTOS ) * :PORCEN) /100;
                                end
                            else
                                begin
                                VALOR = ((:MONTOS) * :CONC_PORC) /100;
                                end
                if (CONC_PROMEDIO = 'S') then
                    begin
                    /* CALCULO DEL PROMEDIO BASE DESDE LA FECHA MENOS EL NUMERO DE PERIODOS */
                    EXECUTE PROCEDURE periodo_nom_fecha (:fec, :periodicidad) returning_values (:perfinal, :anofin);
                    if (perfinal < numeroprom) then
                        BEGIN
                        anoini = anofin - 1;
                        if (periodicidad = 1) then
                            perinicial = 12 - (numeroprom - perfinal) + 1;
                        if (periodicidad = 2) then
                            perinicial = 24 - (numeroprom - perfinal) + 1;
                        if (periodicidad = 3) then
                            perinicial = 52 - (numeroprom - perfinal) + 1;
                        END
                    ELSE
                        PERINICIAL = :perfinal - :NUMEROPROM;
                    if (anoini <> anofin) then
                        select sum (NOCO_VALOR) from NOMINA_CONCEPTOS N where N.NOCO_APLICAPROM = 'S' and
                            ((N.NOCO_PERIODO >= :PERINICIAL and N.NOCO_ANO = :anoini) or
                            (N.NOCO_PERIODO <= :perfinal and N.NOCO_ANO = :anofin)) and TERC_NIT = :NITE into :VALOR;
                    else
                        select sum (NOCO_VALOR) from NOMINA_CONCEPTOS N where N.NOCO_APLICAPROM = 'S' and
                            N.NOCO_PERIODO >= :PERINICIAL and N.NOCO_ANO = :anoini
                            and N.NOCO_PERIODO <= :perfinal and TERC_NIT = :NITE into :VALOR;
                    VALOR = VALOR / NUMEROPROM;
                    /* sume el saldo inicial */
                    SALDOSINI = 0;
                    select NOCO_VALOR from NOMINA_CONCEPTOS where CONC_COD = :CONC_COD and TERC_NIT  = :NITE and NOCO_PAGOOK = 'N' and NOCO_PERIODO = 0 into :SALDOSINI;
                    if (SALDOSINI is null) then
                        SALDOSINI = 0;
                    else
                        update NOMINA_CONCEPTOS N set NOCO_PAGOOK = 'S' where N.NOCO_APLICAPROM = 'S' and
                            CONC_COD = :CONC_COD and TERC_NIT = :NITE and NOCO_PERIODO = 0;

                    VALOR = :VALOR + :SALDOSINI;
                    end
                else if (CONC_OTROCONC = 'S') then
                    begin
                    ANOSUM = cast(ANO as integer);
                    ANOSUM = ANOSUM - 1;
                    select sum (NOCO_VALOR) from NOMINA_CONCEPTOS N where N.NOCO_ANO = :ANOSUM and N.CONC_COD = :CONC_CODOTROCONC and N.TERC_NIT = :NITE into :VALOR;
                    select NOCO_VALOR from NOMINA_CONCEPTOS where NOCO_ANO = :ANOSUM and CONC_COD = :CONC_CODOTROCONC and TERC_NIT = :NITE and NOCO_PERIODO = 0 into :SALDOSINI;
                    if (SALDOSINI is null) then
                        SALDOSINI = 0;
                    else
                        update NOMINA_CONCEPTOS set NOCO_PAGOOK = 'S' where NOCO_ANO = :ANOSUM and CONC_COD = :CONC_CODOTROCONC and NOCO_PERIODO = 0 and TERC_NIT = :NITE;
                    VALOR = :VALOR + :SALDOSINI;
                    update NOMINA_CONCEPTOS set NOCO_PAGOOK = 'S' where NOCO_ANO = :ANOSUM and CONC_COD = :CONC_CODOTROCONC and TERC_NIT = :NITE;
                    end
                else if (CONC_APORTE = 'S') then
                    begin
                    HORASEX = null;
                    DIASNOV = null;
                    RETROACT = null;
                    REEMBOLSO = null;
                    BENEFICIOS = null;
                    RECARGO = null;
                    COMISION = null;
                    INCAP = null;
                    VACACDISF = null;
                    if ((:ENTIDAD = '' ) or (ENTIDAD is null)) then
                        begin
                        /*COMISIONES*/
                        select C.NCOM_MONTO from NOMINA_COMISIONES C where C.NCOM_ANO = :ANO
                            and C.NCOM_PERIODO = :PERIODO and C.NCOM_PERIODICIDAD = :PERIODICIDAD and C.TERC_NIT = :NITE
                            into :COMISION;
                        if (COMISION is null) then
                            COMISION = 0;
                        /*RETROACTIVO*/
                        select C.EMCO_MONTO from EMPLEADO_CONCEPTOS C where C.TERC_NIT = :NITE
                            and C.CONC_COD = 933 into :RETROACT;
                            if (RETROACT is null ) then
                                RETROACT = 0;
                        /*REEMBOLSO*/
                        select C.EMCO_MONTO from EMPLEADO_CONCEPTOS C where C.TERC_NIT = :NITE
                            and C.CONC_COD = 952 into :REEMBOLSO;
                        if (REEMBOLSO is null ) then
                            REEMBOLSO = 0;
                        /*VACACIONES DISFRUTADAS ANTERIORMENTE*/
                        select C.EMCO_MONTO from EMPLEADO_CONCEPTOS C where C.TERC_NIT = :NITE
                            and C.CONC_COD = 955 into :VACACDISF;
                        if (VACACDISF is null ) then
                            VACACDISF = 0;
                        /* INCAPACIDAD*/
                        select N.NONO_DURA from NOMINA_NOVEDADES N where N.TERC_NIT = :NITE
                            and N.NONO_PERIODO = :PERIODO and N.NONO_ANO = :ANO and (N.TNOV_COD = 2 or (N.TNOV_COD = 3))
                            into :DIASNOV;
                        if (:DIASNOV is null) then
                            INCAP = 0;
                        else
                            INCAP = (:BASICO / 30)* :DIASNOV;
                        /*BASICO*/
                        if (SALINTEG = 'S') then
                            BASICO = BASICO * (tar_salinteg / 100);
                        BASICO = ((:BASICO/30)*:DIASLAB) - (((:BASICO/30)/8)*:RECNOCT);
                        BASICO = :BASICO - (((:BASICO/30)/8)*:RECFEST);
                        /*HORAS EXTRA*/
                        select C.NOEX_MONTO from NOMINA_HORASEXT C where C.NOEX_ANO = :ANO
                            and C.NOEX_PERIODIO = :PERIODO and C.NOEX_PERIODICIDAD = :PERIODICIDAD and C.TERC_NIT = :NITE
                            into :HORASEX;
                        if (HORASEX is null) then
                            HORASEX = 0;
                        /*RECARGOS*/
                        BASICOREC = BASICOEMP;
                        RECARGO = (((:BASICOREC/30)/8)*:TAR_RECNOTC)*:RECNOCT;
                        RECARGO = :RECARGO + ((((:BASICOREC/30)/8)*:TAR_RECFEST)*:RECFEST);
                        if (RECARGO is null) then
                            RECARGO = 0;
                        /*basico*/
                        if (:BASICO + :COMISION + :HORASEX + :RETROACT+ :REEMBOLSO + :INCAP+ :CAMBSALTRANS < ((:SMLV/30)*:DIASLAB)) then
                            BASICO = (:SMLV/30)*:DIASLAB;
                        /* SMLV Y AUX. TRANSPORTE*/
                        select P.PAAN_AUXTR, P.PAAN_SALMINIMO from PARAMETROS_ANO P
                            where P.PAAN_ANO = :ANO into :AUXTRANS, :SMLV;
                        /*BASE*/
                        VALOR = :BASICO + :COMISION + :HORASEX + :RETROACT+ :REEMBOLSO + :INCAP + :RECARGO + :CAMBSALTRANS + :VACACDISF;
                        if (CONC_COD = 904) then
                            begin
                            ENTIDAD = :NITAFP;
                            select A.PAAN_AFPTR from PARAMETROS_ANO A where A.PAAN_ANO = :ANO into :PORCEN;
                            VALOR = ((:VALOR) * :PORCEN) /100;
                            end
                        else if ((CONC_COD = 905) or (CONC_COD = 906) or (CONC_COD = 934) ) then
                            begin
                            ENTIDAD = :NITAFP;
                            select A.PAAN_AFPEM from PARAMETROS_ANO A where A.PAAN_ANO = :ANO into :PORCEN;
                            VALOR = ((:VALOR) * :PORCEN) /100;
                            end
                        else if ((CONC_COD = 907) or (CONC_COD = 914) or (CONC_COD = 915) or (conc_cod = 938)) then
                            begin
                            ENTIDAD = :NITEPS;
                            if (CONC_COD = 907) then
                                begin
                                select A.PAAN_EPSTR from PARAMETROS_ANO A where A.PAAN_ANO = :ANO into :PORCEN;
                                VALOR = ((:VALOR) * :PORCEN) /100;
                                end
                            else
                                begin
                                select A.PAAN_EPSEM from PARAMETROS_ANO A where A.PAAN_ANO = :ANO into :PORCEN;
                                    VALOR = ((:VALOR) * :PORCEN) /100;
                                end
                            end
                        else if ((CONC_COD = 910) or (CONC_COD = 911) or (CONC_COD = 936)) then
                            begin
                            /*ccf */
                            ENTIDAD = :NITCCF;
                            select A.PAAN_CCF from PARAMETROS_ANO A where A.PAAN_ANO = :ANO into :PORCEN;
                            VALOR = ((:VALOR) * :PORCEN) /100;
                            end
                        else if ((CONC_COD = 916) or (CONC_COD = 917) or (CONC_COD = 939) ) then
                            begin
                            /*icbf */
                            ENTIDAD = :NITCCF;
                            select A.PAAN_ICBF from PARAMETROS_ANO A where A.PAAN_ANO = :ANO into :PORCEN;
                            VALOR = ((:VALOR) * :PORCEN) /100;
                            end
                        else if ((CONC_COD = 918) or (CONC_COD = 919) or (CONC_COD = 940) ) then
                            begin
                            /*sena */
                            ENTIDAD = :NITCCF;
                            select A.PAAN_SENA from PARAMETROS_ANO A where A.PAAN_ANO = :ANO into :PORCEN;
                            VALOR = ((:VALOR) * :PORCEN) /100;
                            end
                        else if ((CONC_COD = 912) or (CONC_COD = 913) or (CONC_COD = 937)) then
                            begin
                            /* CESANTIAS */
                            ENTIDAD = :NITAFC;
                            if (PARAMBENEF = 'SI') then
                                begin
                                select sum(CE.EMCO_MONTO)
                                    from EMPLEADO_CONCEPTOS CE, CONCEPTOS_NOMINA CN where CN.CONC_BENEFIC = 'S' and (CE.TERC_NIT = :NITE) and (CE.CONC_COD = CN.CONC_COD) and
                                    ((CE.EMCO_FECINI <= :FEC and CE.EMCO_FECFIN >= :FEC) or ((CN.CONC_TODOSPER = 'N') and (CE.EMCO_PPAGO = :PERIODO)) or
                                    (CN.CONC_TODOSPER = 'S'))
                                    into :BENEFICIOS;
                                if (BENEFICIOS is null) then
                                    BENEFICIOS = 0;
                                end
                            else
                                BENEFICIOS = 0;
                            select P.PAAN_AUXTR, P.PAAN_SALMINIMO from PARAMETROS_ANO P
                                where P.PAAN_ANO = :ANO into :AUXTRANS, :SMLV;
                            if (:BASICO < (:SMLV*2)) then
                                AUXTRANS = (:AUXTRANS / 30) * :DIASLAB;
                            else
                                AUXTRANS = 0;
                            select A.PAAN_CESEMP from PARAMETROS_ANO A where A.PAAN_ANO = :ANO
                                into :PORCEN;
                            VALOR = ((:VALOR + :AUXTRANS + :BENEFICIOS) * :PORCEN) /100;
                            end
                        else
                            begin
                            if (COMISION is null) then
                                COMISION = 0;
                            select C.NCOM_MONTO from NOMINA_COMISIONES C where C.NCOM_ANO = :ANO and C.NCOM_PERIODO = :PERIODO and C.NCOM_PERIODICIDAD = :PERIODICIDAD and C.TERC_NIT = :NITE
                                into :COMISION;
                            CONC_MONTO = :BASICO + :COMISION;
                            if (CONC_PORC <> 0 and CONC_PORC is not null) then
                                VALOR = (((:CONC_MONTO/30 * :DIASLAB )+ :CAMBSALTRANS + :INCAP) * :CONC_PORC) /100;
                            else
                                if (:PORCEN <> 0 and :PORCEN is not null) then
                                    VALOR = (((:CONC_MONTO/30 * :DIASLAB )+ :CAMBSALTRANS + :INCAP) * :PORCEN) /100;
                                else
                                    if (:MONTOS <> 0 and :MONTOS is not null) then
                                        VALOR = :MONTOS;
                                    else
                                        if (:CONC_MONTO <> 0 and :CONC_MONTO is not null) then
                                            VALOR = :CONC_MONTO;
                            end
                        ITEM = :ITEM + 1;
                        end
                    end /* aportes */
                else if (CONC_PROV = 'S') then
                    begin
                    /*provisiones */
                    HORASEX = null;
                    DIASNOV = null;
                    RETROACT = null;
                    REEMBOLSO = null;
                    BENEFICIOS = null;
                    RECARGO = null;
                    COMISION = null;
                    INCAP = null;
                    /* RECARGO*/
                    BASICO = BASICOEMP;
                    RECARGO = (((:BASICO/30)/8)*:TAR_RECNOTC)*:RECNOCT;
                    RECARGO = :RECARGO + ((((:BASICO/30)/8)*:TAR_RECFEST)*:RECFEST);
                    /*INCAPACIDAD*/
                    select N.NONO_DURA from NOMINA_NOVEDADES N where N.TERC_NIT = :NITE and N.NONO_PERIODO = :PERIODO and N.NONO_ANO = :ANO and (N.TNOV_COD = 2 or (N.TNOV_COD = 3)) into :DIASNOV;
                    if (:DIASNOV is null) then
                        INCAP = 0;
                    else
                        INCAP = (:BASICO / 30)* :DIASNOV;
                    /* BASICO*/
                    BASICO = ((:BASICO/30)*:DIASLAB) - (((:BASICO/30)/8)*:RECNOCT);
                    BASICO = :BASICO - (((:BASICO/30)/8)*:RECFEST);
                    if (SALINTEG = 'S') then
                        BASICO = BASICO * (tar_salinteg / 100);
                    /*BENEFICIOS*/
                    if (PARAMBENEF = 'SI') then
                        begin
                        select sum(CE.EMCO_MONTO)
                            from EMPLEADO_CONCEPTOS CE, CONCEPTOS_NOMINA CN where CN.CONC_BENEFIC = 'S'
                            and (CE.TERC_NIT = :NITE) and (CE.CONC_COD = CN.CONC_COD) and
                            ((CE.EMCO_FECINI <= :FEC and CE.EMCO_FECFIN >= :FEC) or ((CN.CONC_TODOSPER = 'N')
                            and (CE.EMCO_PPAGO = :PERIODO)) or (CN.CONC_TODOSPER = 'S'))
                            into :BENEFICIOS;
                        if (BENEFICIOS is null) then
                            BENEFICIOS = 0;
                        end
                    else
                        BENEFICIOS = 0;
                    if ((CONC_COD <> 929) and (CONC_COD <> 930) and (CONC_COD <> 944)) then
                        begin
                        select P.PAAN_AUXTR, P.PAAN_SALMINIMO from PARAMETROS_ANO P where P.PAAN_ANO = :ANO
                            into :AUXTRANS, :SMLV;
                        if (:BASICO < (:SMLV*2)) then
                            AUXTRANS = (:AUXTRANS / 30) * :DIASLAB;
                        else
                            AUXTRANS = 0;
                        end
                    else
                        AUXTRANS = 0;
                    CONC_MONTO = :BASICO;
                    if (CONC_PORC <> 0 and CONC_PORC is not null) then
                        VALOR = (((:CONC_MONTO)+ :CAMBSALTRANS + :INCAP + :RECARGO + :AUXTRANS + :BENEFICIOS) * :CONC_PORC) /100;
                    else
                        if (PORCEN <> 0 and PORCEN is not null) then
                            VALOR = (((:CONC_MONTO)+ :CAMBSALTRANS + :INCAP + :RECARGO + :AUXTRANS + :BENEFICIOS) * :PORCEN) /100;
                        else
                            if (MONTOS <> 0 and MONTOS is not null) then
                                VALOR = :MONTOS;
                            else
                                if (CONC_MONTO <> 0 and CONC_MONTO is not null) then
                                    VALOR = :CONC_MONTO;
                    ITEM = :ITEM + 1;
                    end /* provision */
                else if (CONC_COD = 920) then /* comisiones */
                    begin
                    select C.NCOM_MONTO from NOMINA_COMISIONES C where C.NCOM_ANO = :ANO and C.NCOM_PERIODO = :PERIODO and C.NCOM_PERIODICIDAD = :PERIODICIDAD and C.TERC_NIT = :NITE into :VALOR;
                    if (VALOR is null) then
                    VALOR = 0;
                    ITEM = :ITEM + 1;
                    end
                else if (CONC_COD = 900 or (:CONC_COD = 931)) then /* horas extra */
                    begin
                    select C.NOEX_MONTO from NOMINA_HORASEXT C where C.NOEX_ANO = :ANO and
                        C.NOEX_PERIODIO = :PERIODO and C.NOEX_PERIODICIDAD = :PERIODICIDAD and C.TERC_NIT = :NITE into :VALOR;
                    if (VALOR is null) then
                        VALOR = 0;
                    ITEM = :ITEM + 1;
                    end
                else if (CONC_COD = 954) then /* cartera */
                    begin
                    select C.NCAR_MONTO from NOMINA_CARTERA C where C.NCAR_ANO = :ANO and C.NCAR_PERIODO = :PERIODO and C.NCAR_PERIODICIDAD = :PERIODICIDAD and C.TERC_NIT = :NITE into :VALOR;
                    if (VALOR is null) then
                        VALOR = 0;
                    ITEM = :ITEM + 1;
                    end
                else if (CONC_COD = 932) then
                    begin
                    /* incapacidad */
                    select N.NONO_DURA from NOMINA_NOVEDADES N where N.TERC_NIT = :NITE and N.NONO_PERIODO = :PERIODO and N.NONO_ANO = :ANO and (N.TNOV_COD = 2 or (N.TNOV_COD = 3)) into :DIASNOV;
                    if (:DIASNOV is null) then
                        VALOR = 0;
                    else
                        VALOR = (:BASICO / 30)* :DIASNOV;
                    end
                else if (CONC_COD = 921) then
                    begin
                    if (PORCEN is not null and PORCEN <> 0) then
                        VALOR = ((BASICO / 30)* :DIASLAB ) * :PORCEN /100;
                    else
                        if (CONC_PORC is not null and CONC_PORC <> 0) then
                            VALOR = ((BASICO / 30)* :DIASLAB ) * :CONC_PORC /100;
                    end
                else if (CONC_COD = 953) then
                    begin
                    /* RECARGO */
                    BASICO = BASICOEMP;
                    VALOR = (((:BASICO/30)/8)*:TAR_RECNOTC)*:RECNOCT;
                    VALOR = :VALOR + ((((:BASICO/30)/8)*:TAR_RECFEST)*:RECFEST);
                    end
                if (CONC_APORTE = 'S') then
                    begin
                    if (ENTIDAD is null or (ENTIDAD = '') ) then
                        ENTIDAD = :CONC_ENTIDAD;
                    end
                end
            if ((VALOR <> 0) and (VALOR is not null)) then
                begin
                execute procedure REDONDEE(:VALOR, :APROX) returning_values (VALOR);
                if ((MENSUAL = 'N') or (PERIODICIDAD = 1))  then
                    insert into NOMINA_CONCEPTOS (NOMI_ID, NOCO_ITEM, CONC_COD,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, NOCO_GTOEMPR)
                        values (:IDNOMINA,:ITEM, :CONCEPT, :NIT_TERCERO, :VALOR, :ENTIDAD, :CONC_DEDUC, :CONC_PROV, :CONC_APORTE, :PERIODO, :ANO, :CONC_MODIFI, :CONC_APLICAPROM, :SALARIO, :GTOEMPR);
                else
                    if (MENSUAL = 'S') then
                        begin
                        if ((:PERIODICIDAD = 2) and (LIQUIDAPER = 1)) then
                            begin
                            if ((PERIODO = 1) or (PERIODO = 3) or (PERIODO = 5) or (PERIODO = 7) or (PERIODO = 9) or (PERIODO = 11)
                                or (PERIODO = 13) or (PERIODO = 15) or (PERIODO = 17) or (PERIODO = 19) or (PERIODO = 21) or (PERIODO = 23)) then
                                insert into NOMINA_CONCEPTOS (NOMI_ID, NOCO_ITEM, CONC_COD,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, NOCO_GTOEMPR)
                                    values (:IDNOMINA,:ITEM, :CONCEPT, :NIT_TERCERO, :VALOR, :ENTIDAD, :CONC_DEDUC, :CONC_PROV, :CONC_APORTE, :PERIODO, :ANO, :CONC_MODIFI, :CONC_APLICAPROM, :SALARIO, :GTOEMPR);
                            end
                        else if ((:PERIODICIDAD = 2) and (LIQUIDAPER = 2)) then
                            begin
                            if ((PERIODO = 2) or (PERIODO = 4) or (PERIODO = 6) or (PERIODO = 8) or (PERIODO = 10) or (PERIODO = 12)
                                or (PERIODO = 14) or (PERIODO = 16) or (PERIODO = 18) or (PERIODO = 20) or (PERIODO = 22) or (PERIODO = 24)) then
                                insert into NOMINA_CONCEPTOS (NOMI_ID, NOCO_ITEM, CONC_COD,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, NOCO_GTOEMPR)
                                    values (:IDNOMINA,:ITEM, :CONCEPT, :NIT_TERCERO, :VALOR, :ENTIDAD, :CONC_DEDUC, :CONC_PROV, :CONC_APORTE, :PERIODO, :ANO, :CONC_MODIFI, :CONC_APLICAPROM, :SALARIO, :GTOEMPR);
                            end
                        else if ((:PERIODICIDAD = 3) and (LIQUIDAPER = 1)) then
                            begin
                            if ((PERIODO = 1) or (PERIODO = 5) or (PERIODO = 9) or (PERIODO = 13) or (PERIODO = 17) or (PERIODO = 21)
                                or (PERIODO = 25) or (PERIODO = 29) or (PERIODO = 33) or (PERIODO = 37) or (PERIODO = 41) or (PERIODO = 45)
                                or (PERIODO = 49)) then
                                insert into NOMINA_CONCEPTOS (NOMI_ID, NOCO_ITEM, CONC_COD,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, NOCO_GTOEMPR)
                                    values (:IDNOMINA,:ITEM, :CONCEPT, :NIT_TERCERO, :VALOR, :ENTIDAD, :CONC_DEDUC, :CONC_PROV, :CONC_APORTE, :PERIODO, :ANO, :CONC_MODIFI, :CONC_APLICAPROM, :SALARIO, :GTOEMPR);
                            end
                        else if ((:PERIODICIDAD = 3) and (LIQUIDAPER = 2)) then
                            begin
                            if ((PERIODO = 2) or (PERIODO = 6) or (PERIODO = 10) or (PERIODO = 14) or (PERIODO = 18) or (PERIODO = 22)
                                or (PERIODO = 26) or (PERIODO = 30) or (PERIODO = 34) or (PERIODO = 38) or (PERIODO = 42) or (PERIODO = 46)
                                or (PERIODO = 50)) then
                                insert into NOMINA_CONCEPTOS (NOMI_ID, NOCO_ITEM, CONC_COD,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, NOCO_GTOEMPR)
                                    values (:IDNOMINA,:ITEM, :CONCEPT, :NIT_TERCERO, :VALOR, :ENTIDAD, :CONC_DEDUC, :CONC_PROV, :CONC_APORTE, :PERIODO, :ANO, :CONC_MODIFI, :CONC_APLICAPROM, :SALARIO, :GTOEMPR);
                            end
                        else if ((:PERIODICIDAD = 3) and (LIQUIDAPER = 3)) then
                            begin
                            if ((PERIODO = 3) or (PERIODO = 7) or (PERIODO = 11) or (PERIODO = 15) or (PERIODO = 19) or (PERIODO = 23)
                                or (PERIODO = 27) or (PERIODO = 31) or (PERIODO = 35) or (PERIODO = 39) or (PERIODO = 43) or (PERIODO = 47)
                                or (PERIODO = 51)) then
                                insert into NOMINA_CONCEPTOS (NOMI_ID, NOCO_ITEM, CONC_COD,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, NOCO_GTOEMPR)
                                    values (:IDNOMINA,:ITEM, :CONCEPT, :NIT_TERCERO, :VALOR, :ENTIDAD, :CONC_DEDUC, :CONC_PROV, :CONC_APORTE, :PERIODO, :ANO, :CONC_MODIFI, :CONC_APLICAPROM, :SALARIO, :GTOEMPR);
                            end
                        else if ((:PERIODICIDAD = 3) and (LIQUIDAPER = 4)) then
                            begin
                            if ((PERIODO = 4) or (PERIODO = 8) or (PERIODO = 12) or (PERIODO = 16) or (PERIODO = 20) or (PERIODO = 24)
                                or (PERIODO = 29) or (PERIODO = 32) or (PERIODO = 36) or (PERIODO = 40) or (PERIODO = 44) or (PERIODO = 48)
                                or (PERIODO = 52)) then
                                insert into NOMINA_CONCEPTOS (NOMI_ID, NOCO_ITEM, CONC_COD,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, NOCO_GTOEMPR)
                                    values (:IDNOMINA,:ITEM, :CONCEPT, :NIT_TERCERO, :VALOR, :ENTIDAD, :CONC_DEDUC, :CONC_PROV, :CONC_APORTE, :PERIODO, :ANO, :CONC_MODIFI, :CONC_APLICAPROM, :SALARIO, :GTOEMPR);
                            end
                        end
                    VALOR = 0;
                    BASICO = 0;
                    end
            end /* for */
        end
    end
suspend;
end
^

SET TERM ; ^


/* 20100611d */
/* INCLUYA EL ORDEN DE LOS CONCEPTOS AL IMPRIMIR PLANILLA Y COMPROBANTES */

SET TERM ^ ;

CREATE OR ALTER procedure IMPR_PLANILLA_NOMINA (
    ID integer,
    PAGO char(1),
    CTA char(1),
    EMPL char(1),
    DPTO varchar(20))
returns (
    FECHA date,
    OBSERVACIONES blob sub_type 0 segment size 80,
    PAGOGLOBAL char(1),
    PERIODO integer,
    ANO char(4),
    PERIODICIDAD varchar(60),
    NITEMPL varchar(20),
    VALOR numeric(18,2),
    DEDUC char(1),
    NOMBREEMPL varchar(60),
    NOMCORTCONC varchar(60),
    NOMBRECONC varchar(60),
    CODCONC integer,
    PROV char(1),
    TOTALEMPL numeric(18,2),
    TOTALDEDUC numeric(18,2),
    TOTALDEVENG numeric(18,2),
    NUMEMPL integer,
    CTAEMPL varchar(25),
    TOTALCTAS numeric(18,2),
    TOTALNOMI numeric(18,2),
    TOTALAPOR numeric(18,2),
    NOMPER varchar(60),
    ORG integer,
    CARGOEMPL varchar(60),
    DEPTOEMPL varchar(60),
    NUMCOP integer,
    NOMBRE_COPIA varchar(60),
    DIASLAB integer,
    SALARIO numeric(18,2),
    BENEFICIO char(1),
    BASE numeric(18,2),
    CODDPTOEMPL integer,
    ORDEN integer)
AS
declare variable nitant varchar(20);
declare variable nitnue varchar(20);
declare variable numconc integer;
declare variable totalnomineg numeric(18,2);
declare variable totalaporneg numeric(18,2);
declare variable par integer;
declare variable impar integer;
declare variable antdeduc char(1);
declare variable nitdeduc varchar(20);
declare variable nittot varchar(20);
declare variable nitaux varchar(20);
BEGIN
SELECT N.nuco_copia FROM NUMERO_COPIA N WHERE N.tido_cod = 92 AND N.nuco_id = :id INTO :NUMCOP;
IF (numcop IS NULL) THEN
  BEGIN
  numcop = 0;
  INSERT INTO NUMERO_COPIA (TIDO_COD, NUCO_ID, NUCO_COPIA) VALUES (92,:id,:numcop);
  END
ELSE
  BEGIN
  numcop = :numcop + 1;
  UPDATE numero_copia N SET N.nuco_copia = :numcop WHERE N.tido_cod = 92 AND N.nuco_id = :id;
  END
SELECT N.noco_nombre FROM nombres_copias N WHERE N.noco_id = :numcop INTO :nombre_copia;
numempl = 0;
nitant = 0;
nitnue = 0;
IF (PAGO = 'N') THEN
  BEGIN
  FOR SELECT N.nomi_feccausa, N.nomi_obs, N.nomi_pagoglobal, N.nomi_periodo, N.nomi_ano, P.ppag_nombre, PN.pnom_nombre
    FROM NOMINA N, periodo_pago P, periodo_pago_nombre PN
    WHERE P.ppag_cod = N.nomi_periodocidad AND N.nomi_id = :ID AND PN.ppag_cod = N.nomi_periodocidad AND PN.ppag_periodo = N.nomi_periodo
    INTO :fecha, :observaciones, :pagoglobal, :periodo, :ano, :periodicidad, :NOMPER
    DO
    BEGIN
    SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id INTO :totalnomi;
    SELECT SUM(NC.noco_valor*-1) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_APORTE = 'S' AND NOCO_VALOR < 0 AND NOMI_ID = :id INTO :totalaporneg;
    SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_APORTE = 'S' AND NOCO_VALOR > 0 AND NOMI_ID = :id INTO :totalapor;
    totalapor = :totalapor + totalaporneg;
    FOR SELECT NC.terc_nit, NC.noco_valor, NC.noco_deduc, T.terc_nom, C.conc_nomcorto, C.conc_nombre, NC.conc_cod, NC.noco_prov, C.conc_orden+1
      FROM NOMINA_CONCEPTOS NC, TERCEROS T, CONCEPTOS_NOMINA C
      WHERE NC.nomi_id = :ID AND C.conc_cod = NC.conc_cod AND t.terc_nit = nc.terc_nit
      ORDER BY NC.NOCO_DEDUC, NC.conc_cod,  T.TERC_NOM
      INTO :nitempl, :valor, :deduc, :nombreempl, :nomcortconc, :nombreconc, :codconc, :prov, :orden
      DO
      BEGIN
      IF (valor IS NULL) THEN
        valor = 0;
      cargoempl = '';
      select empl_cargo from EMPLEADOS where terc_nit = :nitempl into :cargoempl;
      SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND TERC_NIT = :nitempl INTO :totalempl;
      SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND TERC_NIT = :nitempl AND NC.noco_deduc = 'S' INTO :totaldeduc;
      SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND TERC_NIT = :nitempl AND NC.noco_deduc = 'N' INTO :totaldeveng;
      SUSPEND;
      END
    /* totales por concepto
    nitempl = '';
    valor = NULL;
    deduc = '';
    nombreempl = NULL;
    nomcortconc = NULL;
    nombreconc = NULL;
    codconc = NULL;
    prov = NULL;
    FOR SELECT MAX(conc_cod), SUM(noco_valor) FROM NOMINA_CONCEPTOS WHERE nomi_id = :id
      GROUP BY conc_cod
      INTO :codconc, :valor
      DO
      BEGIN
      nitempl = '';
      nombreempl = '';
      deduc = 'N';
      prov = 'N';
      SELECT C.conc_nombre,C.conc_nomcorto FROM CONCEPTOS_NOMINA C WHERE C.conc_cod = :codconc INTO :nombreconc,:nomcortconc;
      SUSPEND;
      END
    IF (EMPL = 'N') THEN
      BEGIN
      deduc = 'N';
      nomcortconc = 'DIAS LAB.';
      nombreconc = 'DIAS LAB.';
      codconc = 0;
      prov = 'N';
      valor = NULL;
      nitempl = '';
      nombreempl = '';
      SUSPEND;
      deduc = 'N';
      nomcortconc = 'SDO BASE';
      nombreconc = 'SDO BASE';
      codconc = 0;
      prov = 'N';
      valor = NULL;
      nitempl = '';
      nombreempl = '';
      SUSPEND;
      END
    /* dias laborados y salario base */
    FOR SELECT ND.node_diaslab, ND.terc_nit, T.terc_nom FROM NOMINA_DETALLE ND, TERCEROS T
        WHERE NOMI_ID = :id AND T.terc_nit = ND.terc_nit
      INTO :diaslab, :nitaux, :nombreempl
      DO
      BEGIN
      nitempl = :nitaux;
      nomcortconc = 'DIAS LAB.';
      valor = :diaslab;
      ORDEN = 0;
      SUSPEND;
      SELECT FIRST 1  m.mvse_salario FROM MOVIMIENTO_SALARIO_EMPLEADO M WHERE M.terc_nit = :nitaux AND M.mvse_fecha <= :fecha ORDER BY M.mvse_fecha DESC INTO :salario;
      nitempl = :nitaux;
      nomcortconc = 'SDO BASE';
      ORDEN = 1;
      valor = :salario;
      SUSPEND;
      END
    END
  END
ELSE
  IF (PAGO = 'S') THEN
    BEGIN
    par = 2;
    impar = 1;
    SELECT N.nomi_feccausa, N.nomi_obs, N.nomi_pagoglobal, N.nomi_periodo, N.nomi_ano, P.ppag_nombre, PN.pnom_nombre
        FROM NOMINA N, periodo_pago P, periodo_pago_nombre PN
        WHERE P.ppag_cod = N.nomi_periodocidad AND N.nomi_id = :ID AND PN.ppag_cod = N.nomi_periodocidad AND PN.ppag_periodo = N.nomi_periodo
        INTO :fecha, :observaciones, :pagoglobal, :periodo, :ano, :periodicidad, :NOMPER;
    IF (EMPL = 'N') THEN
        BEGIN
        deduc = 'N';
        nomcortconc = 'DIAS LAB.';
        nombreconc = 'DIAS LAB.';
        codconc = 0;
        prov = 'N';
        valor = NULL;
        nitempl = '';
        nombreempl = '';
        SUSPEND;
        deduc = 'N';
        nomcortconc = 'SDO BASE';
        nombreconc = 'SDO BASE';
        codconc = 0;
        prov = 'N';
        valor = NULL;
        nitempl = '';
        nombreempl = '';
        SUSPEND;
        deduc = 'N';
        nomcortconc = 'TOTAL DEV';
        nombreconc = 'TOTAL DEV';
        codconc = 9999;
        prov = 'N';
        valor = NULL;
        nitempl = '';
        nombreempl = '';
        SUSPEND;
        deduc = 'S';
        nomcortconc = 'TOTAL DEDUC';
        nombreconc = 'TOTAL DEDUC';
        codconc = 99999;
        prov = 'N';
        valor = NULL;
        nitempl = '';
        nombreempl = '';
        SUSPEND;
        deduc = 'S';
        nomcortconc = 'TOTAL EMPL';
        nombreconc = 'TOTAL EMPL';
        codconc = 999999;
        prov = 'N';
        valor = NULL;
        nitempl = '';
        nombreempl = '';
        SUSPEND;
        FOR SELECT MAX(N.conc_cod), MAX(N.noco_deduc) FROM NOMINA_CONCEPTOS N
            WHERE N.nomi_id = :id AND N.noco_prov = 'N' AND N.noco_gtoempr = 'N'
            GROUP BY N.conc_cod
            INTO :codconc, :deduc
            DO
            BEGIN
            valor = NULL;
            nitempl = '';
            nombreempl = '';
            prov = 'N';
            SELECT C.conc_nombre,C.conc_nomcorto,C.conc_orden+1 FROM CONCEPTOS_NOMINA C
                WHERE C.conc_cod = :codconc INTO :nombreconc,:nomcortconc, :orden;
            SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id INTO :totalempl;
            SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND NC.noco_deduc = 'S' INTO :totaldeduc;
            SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND NC.noco_deduc = 'N' INTO :totaldeveng;
            SUSPEND;
            END
        FOR SELECT ND.node_diaslab,  ND.terc_nit, T.terc_nom
            FROM NOMINA_DETALLE ND, TERCEROS T WHERE NOMI_ID = :id AND T.terc_nit = ND.terc_nit
            INTO :diaslab, :nitaux, :nombreempl
            DO
            BEGIN
            nitempl = :nitaux;
            nomcortconc = 'DIAS LAB.';
            ORDEN = 0;
            valor = :diaslab;
            SUSPEND;
            SELECT FIRST 1  m.mvse_salario FROM MOVIMIENTO_SALARIO_EMPLEADO M WHERE M.terc_nit = :nitaux AND M.mvse_fecha <= :fecha ORDER BY M.mvse_fecha DESC INTO :salario;
            nitempl = :nitaux;
            nomcortconc = 'SDO BASE';
            valor = :salario;
            ORDEN = 1;
            SUSPEND;
            END
        END
    FOR SELECT NC.terc_nit, NC.noco_valor, NC.noco_deduc, T.terc_nom, C.conc_nomcorto, C.conc_nombre, NC.conc_cod, NC.noco_prov, NC.terc_nit, c.conc_benefic, NC.noco_base, C.conc_orden+1
        FROM NOMINA_CONCEPTOS NC, TERCEROS T, CONCEPTOS_NOMINA C
        WHERE NC.nomi_id = :ID AND C.conc_cod = NC.conc_cod AND t.terc_nit = nc.terc_nit AND NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N'
        ORDER BY T.terc_nom
        INTO :nitempl, :valor, :deduc, :nombreempl, :nomcortconc, :nombreconc, :codconc, :prov,:nitnue, :beneficio,:base, :orden
        DO
        BEGIN
        cargoempl = '';
        ctaempl = '';
        deptoempl = '';
        coddptoempl = 0;
        diaslab = 0;
        SELECT node_diaslab FROM NOMINA_DETALLE WHERE nomi_id = :id AND terc_nit = :nitempl INTO :diaslab;
        select e.empl_cargo, e.empl_cuenta, D.dpto_nombre, d.dpto_cod
            from EMPLEADOS e, DEPARTAMENTO D
            where D.dpto_cod = E.empl_dpto AND e.terc_nit = :nitempl into :cargoempl,:ctaempl,:deptoempl,:coddptoempl;
        SELECT FIRST 1  m.mvse_salario FROM MOVIMIENTO_SALARIO_EMPLEADO M WHERE M.terc_nit = :nitempl AND M.mvse_fecha <= :FECHA ORDER BY M.mvse_fecha DESC INTO :salario;
        IF ((nitnue <> nitant) AND (nitnue IS NOT NULL)) THEN
            numempl = :numempl + 1;
        IF (valor IS NULL) THEN
            valor = 0;
        IF (nitempl <> nitdeduc) THEN
            BEGIN
            par = 2;
            impar = 1;
            END
        nitdeduc = :nitempl;
        IF (:deduc = 'S') THEN
            BEGIN
            antdeduc = 'S';
            org = :par;
            par = :par + 2;
            END
        ELSE
            BEGIN
            antdeduc = 'N';
            org = :impar;
            impar = :impar + 2;
            END
       SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND TERC_NIT = :nitempl INTO :totalempl;
       SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND TERC_NIT = :nitempl AND NC.noco_deduc = 'S' INTO :totaldeduc;
       SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND TERC_NIT = :nitempl AND NC.noco_deduc = 'N' INTO :totaldeveng;
       IF (cta = 'S') THEN
         BEGIN
         SELECT COUNT(CONC_COD) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND TERC_NIT = :nitempl INTO :numconc;
         totalempl = totalempl / :numconc;
         SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND TERC_NIT = :nitempl INTO :totalctas;
         END
       SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id INTO :totalnomi;
       SELECT SUM(NC.noco_valor*-1) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_APORTE = 'S' AND NOCO_VALOR < 0 AND NOMI_ID = :id INTO :totalaporneg;
       SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_APORTE = 'S' AND NOCO_VALOR > 0 AND NOMI_ID = :id INTO :totalapor;
       totalapor = :totalapor + totalaporneg;
       SUSPEND;
       IF ((nitnue <> nitant) AND (nitnue IS NOT NULL) AND (EMPL = 'N')) THEN
         BEGIN
         deduc = 'N';
         nomcortconc = 'TOTAL DEV';
         nombreconc = 'TOTAL DEV';
         codconc = 9999;
         prov = 'N';
         SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND NC.noco_deduc = 'N' AND NC.terc_nit = : nitempl INTO :VALOR;
         SUSPEND;
         deduc = 'S';
         nomcortconc = 'TOTAL DEDUC';
         nombreconc = 'TOTAL DEDUC';
         codconc = 99999;
         prov = 'N';
         SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND NC.noco_deduc = 'S' AND NC.terc_nit = :nitempl INTO :VALOR;
         SUSPEND;
         deduc = 'S';
         nomcortconc = 'TOTAL EMPL';
         nombreconc = 'TOTAL EMPL';
         codconc = 999999;
         prov = 'N';
         SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND NC.terc_nit = :nitempl INTO :VALOR;
         nitant = :nitnue;
         SUSPEND;
         END
       END
    numempl = :numempl + 1;
    IF (EMPL = 'N') THEN
        BEGIN
        nitempl = '';
        valor = NULL;
        deduc = '';
        nombreempl = NULL;
        nomcortconc = NULL;
        nombreconc = NULL;
        codconc = NULL;
        prov = NULL;
        totalempl = NULL;
        ctaempl = NULL;
        IF (cta = 'N') THEN
          BEGIN
          FOR SELECT MAX(N.conc_cod) FROM NOMINA_CONCEPTOS N WHERE N.nomi_id = :id AND N.noco_prov = 'N' AND N.noco_gtoempr = 'N'
            GROUP BY N.conc_cod
            INTO :codconc
            DO
            BEGIN
            /* TOTALES POR DEPTO */
            IF (dpto IS NOT NULL AND (DPTO <> '') ) THEN
                BEGIN
                SELECT SUM(NC.noco_valor), MAX(NC.noco_deduc) FROM NOMINA_CONCEPTOS NC, EMPLEADOS E, DEPARTAMENTO D
                    WHERE NC.nomi_id = :ID AND NC.conc_cod = :codconc AND D.dpto_cod = E.empl_dpto AND NC.terc_nit = E.terc_nit AND d.dpto_cod = :dpto
                    GROUP BY NC.conc_cod
                    INTO :valor, :deduc;
                nitempl = '-';
                nombreempl = 'TOTAL';
                deptoempl = '-';
                prov = 'N';
                SELECT C.conc_nombre,C.conc_nomcorto FROM CONCEPTOS_NOMINA C WHERE C.conc_cod = :codconc INTO :nombreconc,:nomcortconc;
                SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC, EMPLEADOS E, DEPARTAMENTO D WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id  AND D.dpto_cod = E.empl_dpto AND NC.terc_nit = E.terc_nit INTO :totalempl;
                SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC, EMPLEADOS E, DEPARTAMENTO D WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND NC.noco_deduc = 'S'  AND D.dpto_cod = E.empl_dpto AND NC.terc_nit = E.terc_nit INTO :totaldeduc;
                SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC, EMPLEADOS E, DEPARTAMENTO D WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND NC.noco_deduc = 'N'  AND D.dpto_cod = E.empl_dpto AND NC.terc_nit = E.terc_nit INTO :totaldeveng;
                END
            ELSE
                BEGIN
                SELECT SUM(NC.noco_valor), MAX(NC.noco_deduc) FROM NOMINA_CONCEPTOS NC
                WHERE NC.nomi_id = :ID AND NC.conc_cod = :codconc
                GROUP BY NC.conc_cod
                INTO :valor, :deduc;
                nitempl = '-';
                nombreempl = 'TOTAL';
                deptoempl = '-';
                prov = 'N';
                SELECT C.conc_nombre,C.conc_nomcorto FROM CONCEPTOS_NOMINA C WHERE C.conc_cod = :codconc INTO :nombreconc,:nomcortconc;
                SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id INTO :totalempl;
                SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND NC.noco_deduc = 'S' INTO :totaldeduc;
                SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND NC.noco_deduc = 'N' INTO :totaldeveng;
                END
            SUSPEND;
            END
        IF (dpto IS NOT NULL AND (DPTO <> '') ) THEN
            BEGIN
            deduc = 'N';
             nomcortconc = 'TOTAL DEV';
             nombreconc = 'TOTAL DEV';
             codconc = 9999;
             deptoempl = '-';
             prov = 'N';
             SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC, EMPLEADOS E, DEPARTAMENTO D WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id  AND D.dpto_cod = E.empl_dpto AND NC.terc_nit = E.terc_nit AND d.dpto_cod = :dpto INTO :VALOR;
             nitempl = '-';
             nombreempl = 'TOTAL';
             SUSPEND;
             deduc = 'S';
             nomcortconc = 'TOTAL DEDUC';
             nombreconc = 'TOTAL DEDUC';
             codconc = 99999;
             deptoempl = '-';
             prov = 'N';
             SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC, EMPLEADOS E, DEPARTAMENTO D WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND NC.noco_deduc = 'S'  AND D.dpto_cod = E.empl_dpto AND d.dpto_cod = :dpto AND NC.terc_nit = E.terc_nit INTO :VALOR;
             nitempl = '-';
             nombreempl = 'TOTAL';
             SUSPEND;
             deduc = 'S';
             nomcortconc = 'TOTAL EMPL';
             nombreconc = 'TOTAL EMPL';
             codconc = 999999;
             deptoempl = '-';
             prov = 'N';
             SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC, EMPLEADOS E, DEPARTAMENTO D WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND NC.noco_deduc = 'N'  AND D.dpto_cod = E.empl_dpto AND d.dpto_cod = :dpto AND NC.terc_nit = E.terc_nit INTO :VALOR;
             nitempl = '-';
             nombreempl = 'TOTAL';
             SUSPEND;
             END
        ELSE
             BEGIN
             deduc = 'N';
             nomcortconc = 'TOTAL DEV';
             nombreconc = 'TOTAL DEV';
             codconc = 9999;
             prov = 'N';
             SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND NC.noco_deduc = 'N' INTO :VALOR;
             nitempl = '-';
             nombreempl = 'TOTAL';
             SUSPEND;
             deduc = 'S';
             nomcortconc = 'TOTAL DEDUC';
             nombreconc = 'TOTAL DEDUC';
             codconc = 99999;
             prov = 'N';
             SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND NC.noco_deduc = 'S' INTO :VALOR;
             nitempl = '-';
             nombreempl = 'TOTAL';
             SUSPEND;
             deduc = 'S';
             nomcortconc = 'TOTAL EMPL';
             nombreconc = 'TOTAL EMPL';
             codconc = 999999;
             prov = 'N';
             SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N'  AND NOMI_ID = :id INTO :VALOR;
             nitempl = '-';
             nombreempl = 'TOTAL';
             SUSPEND;
             END
         END
       END
    END
END
^

SET TERM ; ^



/* 20100612 */
/* CALCULO DE PRIMA, TRAE EL PROMEDIO PERO NO APLICA LA PROPORCION DEL TOTAL (NO DIVIDE EN DOS EL PROMEDIO DE LOS 6 MESES) */
SET TERM ^ ;

CREATE OR ALTER procedure CAUSA_NOMINA (
    FEC date,
    PERIODO integer,
    PERIODICIDAD integer,
    PAGOGLOBAL char(1),
    ANO char(4),
    DEPTO integer)
returns (
    IDNOMINA integer,
    ITEMINI integer)
AS
declare variable ITEM integer;
declare variable NITE varchar(20) character set NONE;
declare variable NIT_TERCERO varchar(20);
declare variable CONCEPT integer;
declare variable MONTOS numeric(18,2);
declare variable PORCEN numeric(9,4);
declare variable ENTIDAD varchar(20);
declare variable CONC_COD integer;
declare variable CONC_DEDUC char(1);
declare variable CONC_PORC numeric(9,4);
declare variable CONC_ENTIDAD integer;
declare variable CONC_MONTO numeric(18,2);
declare variable CONC_MODIFI char(1);
declare variable CONC_PROMEDIO char(1);
declare variable VALOR numeric(18,2);
declare variable DIASLAB integer;
declare variable CONC_PROV char(1);
declare variable CONC_APORTE char(1);
declare variable NUMEROPROM integer;
declare variable CONC_APLICAPROM char(1);
declare variable PERINICIAL integer;
declare variable PERFINAL integer;
declare variable ANOINI integer;
declare variable ANOFIN integer;
declare variable CONC_DIAS char(1);
declare variable CONC_OTROCONC char(1);
declare variable CONC_CODOTROCONC integer;
declare variable ANOSUM integer;
declare variable SALARIO char(1) character set NONE;
declare variable LIQUIDAPER integer;
declare variable BASICO numeric(18,2);
declare variable NITEPS varchar(20);
declare variable NITAFC varchar(20);
declare variable NITAFP varchar(20);
declare variable NITCCF varchar(20);
declare variable GTOEMPR char(1);
declare variable COMISION numeric(18,2);
declare variable CAMBSALTRANS numeric(18,2);
declare variable SALDOSINI numeric(18,2);
declare variable DURANOV integer;
declare variable BASE numeric(18,2);
declare variable APROX integer;
declare variable MENSUAL char(1);
declare variable HORASEX numeric(18,2);
declare variable DIASNOV integer;
declare variable TOMASAL integer;
declare variable RETROACT numeric(18,2);
declare variable REEMBOLSO numeric(18,2);
declare variable INCAP numeric(18,2);
declare variable AUXTRANS numeric(18,2);
declare variable SMLV numeric(18,2);
declare variable BENEFICIOS numeric(18,2);
declare variable CONFIRMADO char(1);
declare variable RECNOCT numeric(18,2);
declare variable RECFEST numeric(18,2);
declare variable TAR_RECNOTC numeric(9,4);
declare variable TAR_RECFEST numeric(9,4);
declare variable RECARGO numeric(18,2);
declare variable BASICOREC numeric(18,2);
declare variable PARAMBENEF char(2);
declare variable VACACDISF numeric(18,2);
declare variable VALORPREDET numeric(18,2);
declare variable BASICOEMP numeric(18,2);
declare variable salinteg CHAR(1);
declare variable TAR_SALINTEG numeric(9,4);
declare variable TOTPER INTEGER;
begin
execute procedure LEE_CONFIGURACION('NOMINA','LIQUIDACION','TOMAR BENEFICIOS PARA CALCULAR PROVISIONES')returning_values(:PARAMBENEF);
execute procedure LEE_CONFIGURACION('NOMINA','GENERAL','REDONDEO AL MULTIPLO DE DIEZ EN TOTALES')returning_values(:APROX);
select N.NOMI_ID, N.NOMI_LIQOK from NOMINA N where N.NOMI_PERIODO = :PERIODO and N.NOMI_PERIODOCIDAD = :PERIODICIDAD
    and N.NOMI_ANO = :ANO into :IDNOMINA, :CONFIRMADO;
if (:IDNOMINA is null) then
    begin
    execute procedure CAMBIE_ID_NOMINA returning_values(:IDNOMINA);
    insert into NOMINA (NOMI_ID, NOMI_FECCAUSA, NOMI_PAGOGLOBAL, NOMI_PERIODOCIDAD, NOMI_PERIODO, NOMI_ANO, NOMI_LIQOK)
    values (:IDNOMINA, :FEC,:PAGOGLOBAL, :PERIODICIDAD, :PERIODO, :ANO, 'N');
    ITEM = 1;
    end
else
    begin
    select max(N.NOCO_ITEM) from NOMINA_CONCEPTOS N where N.NOMI_ID = :IDNOMINA
    into :ITEM;
    end
if ((CONFIRMADO = 'S') and (IDNOMINA is not null)) then
    begin
    IDNOMINA = 0;
    end
else
    begin
    insert into NOMINA_DEPARTAMENTO (NOMI_ID, NODP_DEPTO)values(:IDNOMINA,:DEPTO);
    select P.PAAN_RECNOC, P.PAAN_RECFEST, P.paan_salinteg from PARAMETROS_ANO P where P.PAAN_ANO = :ANO
        into :TAR_RECNOTC, :TAR_RECFEST, TAR_SALINTEG;
    ITEMINI = ITEM;
    for select E.TERC_NIT, E.EMPL_EPS, E.EMPL_AFC, E.EMPL_AFP, E.EMPL_CCF, E.empl_salinteg
        from EMPLEADOS E
        where E.EMPL_PPAGO = :PERIODICIDAD and ((E.EMPL_FECRET is null) or (E.EMPL_FECRET > :FEC)) and E.EMPL_FECING <= :FEC
        and ((:DEPTO = 0) or (e.empl_dpto = :DEPTO))
        into :NITE, :NITEPS, :NITAFC, :NITAFP, :NITCCF, :SALINTEG
        do
        begin
        select first 1 M.MVSE_SALARIO from MOVIMIENTO_SALARIO_EMPLEADO M where M.TERC_NIT = :NITE and M.MVSE_FECHA <= :FEC order by M.MVSE_FECHA desc into :BASICOEMP;
        BASICO = BASICOEMP;
        RECNOCT = null;
        RECFEST = null;
        select N.NOEX_RECNOCT, N.NOEX_RECFEST
            from NOMINA_HORASEXT N where N.NOEX_PERIODIO = :PERIODO and N.NOEX_ANO = :ANO and N.TERC_NIT = :NITE
            into :RECNOCT, :RECFEST;
        if (RECNOCT is null) then
            RECNOCT = 0;
        if (RECFEST is null) then
            RECFEST = 0;
        for select CE.TERC_NIT, CE.CONC_COD, CE.EMCO_MONTO, CE.EMCO_PORC, CE.EMPL_ENTIDAD, CE.EMCO_PERPROM, CE.EMCO_LUQUIDAPER, CE.EMCO_MENSUAL, CN.CONC_COD, CN.CONC_DEDUC,CN.CONC_PORC, CN.CONC_ENTIDAD, CN.CONC_MONTO,  CN.CONC_DIAS, CN.CONC_MODIFI,
            CN.CONC_PROMEDIO, CN.CONC_SALARIO, CN.CONC_PROV, CN.CONC_APORTE, CN.CONC_APLICAPROM, CN.CONC_OTROCONC, CN.CONC_CODOTROCONC, CN.CONC_GTOEMPR, CN.CONC_BASE, CE.EMCO_TOMSAL
            from EMPLEADO_CONCEPTOS CE, CONCEPTOS_NOMINA CN where (CE.CONC_COD = CN.CONC_COD) and (CE.TERC_NIT = :NITE) and
            ( ((CE.EMCO_FECINI <= :FEC and CE.EMCO_FECFIN >= :FEC)) or
            ((CN.CONC_TODOSPER = 'N') and (CE.EMCO_PPAGO = :PERIODO)) or ((CN.CONC_TODOSPER = 'S') AND (((:periodicidad = 1) AND (:PERIODO < 13)) or ((:periodicidad = 2) AND (:PERIODO < 25)))) )  order by (TERC_NIT )
            into :NIT_TERCERO, :CONCEPT,  :MONTOS, :PORCEN, :ENTIDAD, :NUMEROPROM, :LIQUIDAPER, :MENSUAL ,:CONC_COD, :CONC_DEDUC, :CONC_PORC,
            :CONC_ENTIDAD, :CONC_MONTO, :CONC_DIAS, :CONC_MODIFI,:CONC_PROMEDIO, :SALARIO,:CONC_PROV, :CONC_APORTE , :CONC_APLICAPROM, :CONC_OTROCONC, :CONC_CODOTROCONC, :GTOEMPR, :BASE, :TOMASAL
            do
            begin
            if (CONC_DIAS = 'S') then
                execute procedure DIAS_LABORADOS (:NITE, :PERIODO, :FEC, :MENSUAL,:CONC_APORTE) returning_values (:DIASLAB);
            else
                DIASLAB = 15;
            if (:TOMASAL <> 0) then
                begin
                /* SI EL CONCEPTO NOAPLICA EN ESTE PERIODO DEJE EL BASICO EN CERO */
                if ((:PERIODICIDAD = 2) and (:TOMASAL <> 2)) then
                    begin
                    if ((PERIODO = 2) or (PERIODO = 4) or (PERIODO = 6) or (PERIODO = 8) or (PERIODO = 10) or (PERIODO = 12)
                        or (PERIODO = 14) or (PERIODO = 16) or (PERIODO = 18) or (PERIODO = 20) or (PERIODO = 22) or (PERIODO = 24)) then
                        BASICO = 0;
                    end
                else
                    if ((:PERIODICIDAD = 3) and (:TOMASAL <> 1)) then
                        begin
                        if ((PERIODO = 1) or (PERIODO = 5) or (PERIODO = 9) or (PERIODO = 13) or (PERIODO = 17) or (PERIODO = 21)
                            or (PERIODO = 25) or (PERIODO = 29) or (PERIODO = 33) or (PERIODO = 37) or (PERIODO = 41) or (PERIODO = 45)
                            or (PERIODO = 49)) then
                            BASICO = 0;
                        end
                    else
                        if ((:PERIODICIDAD = 3) and (:TOMASAL <> 2)) then
                            begin
                            if ((PERIODO = 2) or (PERIODO = 6) or (PERIODO = 10) or (PERIODO = 14) or (PERIODO = 18) or (PERIODO = 22)
                                or (PERIODO = 26) or (PERIODO = 30) or (PERIODO = 34) or (PERIODO = 38) or (PERIODO = 42) or (PERIODO = 46)
                                or (PERIODO = 50)) then
                                BASICO = 0;
                            end
                        else
                            if ((:PERIODICIDAD = 3) and (:TOMASAL <> 3)) then
                                begin
                                if ((PERIODO = 3) or (PERIODO = 7) or (PERIODO = 11) or (PERIODO = 15) or (PERIODO = 19) or (PERIODO = 23)
                                    or (PERIODO = 27) or (PERIODO = 31) or (PERIODO = 35) or (PERIODO = 39) or (PERIODO = 43) or (PERIODO = 47)
                                    or (PERIODO = 51)) then
                                    BASICO = 0;
                                end
                            else
                                if ((:PERIODICIDAD = 3) and (:TOMASAL <> 4)) then
                                begin
                                if ((PERIODO = 4) or (PERIODO = 8) or (PERIODO = 12) or (PERIODO = 16) or (PERIODO = 20) or (PERIODO = 24)
                                    or (PERIODO = 29) or (PERIODO = 32) or (PERIODO = 36) or (PERIODO = 40) or (PERIODO = 44) or (PERIODO = 48)
                                    or (PERIODO = 52)) then
                                    BASICO = 0;
                                end
                end
            else
                begin
                /* SE CALCULA SOBRE TODOS LOS PERIODOS */
                BASICO = BASICOEMP;
                end
            VALORPREDET = null;
            select VP.NVPR_MONTO from NOMINA_VALOR_PREDET VP where VP.NVPR_PERIODICIDAD = :PERIODICIDAD and VP.NVPR_PERIODO = :PERIODO and VP.NVPR_ANO = :ANO and VP.CONC_COD = :CONC_COD and VP.TERC_NIT = :NITE
                into :VALORPREDET;
            if ((:VALORPREDET <> 0) and (VALORPREDET is not null)) then
                VALOR = VALORPREDET;
            else
                begin
                /* SI HAY UN CAMBIO TRANSITORIO DE SALARIO AJUSTE LOS DIAS Y CALCULE EL VALOR A SUMAR */
                select ((N.NONO_VALOR /30) * N.NONO_DURA), (N.NONO_DURA) from NOMINA_NOVEDADES N
                    where N.TNOV_COD = 11 and N.TERC_NIT = :NITE and N.NONO_PERIODO = :PERIODO into :CAMBSALTRANS, :DURANOV;
                if (CAMBSALTRANS is null) then
                    CAMBSALTRANS = 0;
                if (DURANOV is null) then
                    DURANOV = 0;
                DIASLAB = :DIASLAB - :DURANOV;
                /* SI ES UN PRESTAMO, TRAIGA LA CUOTA */
                if (CONC_COD = 922) then
                    begin
                    select sum(P.PRCU_MONTO) from PRESTAMO_CUOTAS P, PRESTAMO_NOMINA PN
                        where P.PRCU_ANO = :ANO and P.PRCU_PERIODO = :PERIODO and PN.PRNO_ID = P.PRNO_ID and PN.TERC_NIT = :NITE into :VALOR;
                    if (VALOR is null) then
                        VALOR = 0;
                    ITEM = :ITEM + 1;
                    /* MARQUE LA CUOTA COMO PAGADA */
                    update PRESTAMO_CUOTAS  P set PRCU_OK = 'S' where P.PRCU_ANO = :ANO and P.PRCU_PERIODO = :PERIODO and P.PRNO_ID = (select PN.PRNO_ID from PRESTAMO_NOMINA PN where PN.TERC_NIT = :NITE);
                    end
                else
                    if ((:MONTOS = 0) or (:MONTOS is null)) then
                        begin
                        /* SI EL CONCEPTO DEL EMPLEADO NO TIENE MONTO TRAIGA EL DE CONCEPTOS_NOMINA */
                        if ((CONC_PORC = 0 and :PORCEN = 0) or (CONC_PORC is null and :PORCEN = 0) or (CONC_PORC = 0 and :PORCEN is null) or (CONC_PORC is null and :PORCEN is null) ) then
                            begin
                            /* SIN PORCENTAJE */
                            if ((CONC_MONTO <> 0) and (CONC_MONTO is not null) ) then
                                begin
                                VALOR = :CONC_MONTO;
                                if (:CONC_DIAS = 'S') then
                                    VALOR = (:VALOR / 30) * :DIASLAB;
                                end
                            else
                                if (SALARIO = 'S' and CONC_COD <> 900 and CONC_COD <> 920 and CONC_COD <> 932 and CONC_COD <> 953) then
                                    begin
                                    /* SI ES SALARIO SUME LAS EXTRAS */
                                    BASICO = BASICOEMP;
                                    BASICO = ((:BASICO/30)*:DIASLAB) - (((:BASICO/30)/8)*:RECNOCT);/* PFP:DEBERIA SER + Y POR LA TARIFA QUE NO VEO POR NINGUN LADO */
                                    BASICO = :BASICO - (((:BASICO/30)/8)*:RECFEST);
                                    CONC_MONTO = :BASICO;
                                    VALOR = (:CONC_MONTO/*/30 * :diaslab*/ ) + :CAMBSALTRANS;
                                    end
                                else
                                    begin
                                    VALOR = MONTOS;
                                    if (:CONC_DIAS = 'S') then
                                        VALOR = (:VALOR / 30) * :DIASLAB;
                                    end
                            end
                        else    
                            begin
                            if (:PORCEN <> 0) then
                                begin
                                /* SI TIENE PORCENTAJE EN EMPLEADO_CONCEPTOS PERO EL MONTO SE TRAE DE CONCPETOS_NOMINA */
                                if ((CONC_MONTO <> 0) and (CONC_MONTO is not null) ) then
                                    begin
                                    VALOR = ((:CONC_MONTO ) * :PORCEN) /100;
                                    end
                                end
                            else
                                begin
                                /* NO TIENE PORCENTAJE EN EMPLEADO_CONCEPTOS SE TRAE MONTO Y PORC DE CONCPETOS_NOMINA */
                                if ((CONC_MONTO <> 0) and (CONC_MONTO is not null) ) then
                                    begin
                                    VALOR = ((:CONC_MONTO) * :CONC_PORC) /100;
                                    end
                                else
                                    if (SALARIO = 'S' and CONC_COD <> 900 and CONC_COD <> 920 and CONC_COD <> 932 and CONC_COD <> 953) then
                                        begin
                                        BASICO = BASICOEMP;
                                        BASICO = ((:BASICO/30)*:DIASLAB) - (((:BASICO/30)/8)*:RECNOCT);
                                        BASICO = :BASICO - (((:BASICO/30)/8)*:RECFEST);
                                        CONC_MONTO = :BASICO;
                                        VALOR = ((:CONC_MONTO)+ :CAMBSALTRANS * :CONC_PORC) /100;
                                        end
                                    else
                                        if (:CONC_MONTO = 0 and :MONTOS = 0) then
                                            begin
                                            CONC_MONTO = :BASICO;
                                            VALOR = (((:CONC_MONTO / 30) * :DIASLAB) + :CAMBSALTRANS * :CONC_PORC) /100;
                                            end
                                end
                            end
                        end
                    else
                        /* SI TIENE MONTO EN EMPLEADO_CONCEPTOS */
                        if ((CONC_PORC = 0 or (CONC_PORC is null)) and (:PORCEN = 0 or (PORCEN is null))) then
                            begin
                            VALOR = (:MONTOS);
                            if (:CONC_DIAS = 'S') then
                                VALOR = (:VALOR / 30) * :DIASLAB;   
                            end
                        else
                            if (:PORCEN <> 0 and PORCEN is not null) then
                                begin
                                VALOR = ((:MONTOS ) * :PORCEN) /100;
                                end
                            else
                                begin
                                VALOR = ((:MONTOS) * :CONC_PORC) /100;
                                end
                if (CONC_PROMEDIO = 'S') then
                    begin
                    /* CALCULO DEL PROMEDIO BASE DESDE LA FECHA MENOS EL NUMERO DE PERIODOS */
                    EXECUTE PROCEDURE periodo_nom_fecha (:fec, :periodicidad) returning_values (:perfinal, :anofin);
                    if (perfinal < numeroprom) then
                        BEGIN
                        anoini = anofin - 1;
                        if (periodicidad = 1) then
                            perinicial = 12 - (numeroprom - perfinal) + 1;
                        if (periodicidad = 2) then
                            perinicial = 24 - (numeroprom - perfinal) + 1;
                        if (periodicidad = 3) then
                            perinicial = 52 - (numeroprom - perfinal) + 1;
                        END
                    ELSE
                        PERINICIAL = :perfinal - :NUMEROPROM;
                    if (anoini <> anofin) then
                        select sum (NOCO_VALOR) from NOMINA_CONCEPTOS N where N.NOCO_APLICAPROM = 'S' and
                            ((N.NOCO_PERIODO >= :PERINICIAL and N.NOCO_ANO = :anoini) or
                            (N.NOCO_PERIODO <= :perfinal and N.NOCO_ANO = :anofin)) and TERC_NIT = :NITE into :VALOR;
                    else
                        select sum (NOCO_VALOR) from NOMINA_CONCEPTOS N where N.NOCO_APLICAPROM = 'S' and
                            N.NOCO_PERIODO >= :PERINICIAL and N.NOCO_ANO = :anoini
                            and N.NOCO_PERIODO <= :perfinal and TERC_NIT = :NITE into :VALOR;
                    VALOR = VALOR / NUMEROPROM;
                    /* sume el saldo inicial */
                    SALDOSINI = 0;
                    select NOCO_VALOR from NOMINA_CONCEPTOS where CONC_COD = :CONC_COD and TERC_NIT  = :NITE and NOCO_PAGOOK = 'N' and NOCO_PERIODO = 0 into :SALDOSINI;
                    if (SALDOSINI is null) then
                        SALDOSINI = 0;
                    else
                        update NOMINA_CONCEPTOS N set NOCO_PAGOOK = 'S' where N.NOCO_APLICAPROM = 'S' and
                            CONC_COD = :CONC_COD and TERC_NIT = :NITE and NOCO_PERIODO = 0;

                    VALOR = :VALOR + :SALDOSINI;
                    /* APLIQUE LA PROPORCION */
                    SELECT PPAG_PERIODO FROM PERIODO_PAGO WHERE PPAG_COD = :periodicidad INTO :TOTPER;
                    VALOR = VALOR * numeroprom / :totper;
                    end
                else if (CONC_OTROCONC = 'S') then
                    begin
                    ANOSUM = cast(ANO as integer);
                    ANOSUM = ANOSUM - 1;
                    select sum (NOCO_VALOR) from NOMINA_CONCEPTOS N where N.NOCO_ANO = :ANOSUM and N.CONC_COD = :CONC_CODOTROCONC and N.TERC_NIT = :NITE into :VALOR;
                    select NOCO_VALOR from NOMINA_CONCEPTOS where NOCO_ANO = :ANOSUM and CONC_COD = :CONC_CODOTROCONC and TERC_NIT = :NITE and NOCO_PERIODO = 0 into :SALDOSINI;
                    if (SALDOSINI is null) then
                        SALDOSINI = 0;
                    else
                        update NOMINA_CONCEPTOS set NOCO_PAGOOK = 'S' where NOCO_ANO = :ANOSUM and CONC_COD = :CONC_CODOTROCONC and NOCO_PERIODO = 0 and TERC_NIT = :NITE;
                    VALOR = :VALOR + :SALDOSINI;
                    update NOMINA_CONCEPTOS set NOCO_PAGOOK = 'S' where NOCO_ANO = :ANOSUM and CONC_COD = :CONC_CODOTROCONC and TERC_NIT = :NITE;
                    end
                else if (CONC_APORTE = 'S') then
                    begin
                    HORASEX = null;
                    DIASNOV = null;
                    RETROACT = null;
                    REEMBOLSO = null;
                    BENEFICIOS = null;
                    RECARGO = null;
                    COMISION = null;
                    INCAP = null;
                    VACACDISF = null;
                    if ((:ENTIDAD = '' ) or (ENTIDAD is null)) then
                        begin
                        /*COMISIONES*/
                        select C.NCOM_MONTO from NOMINA_COMISIONES C where C.NCOM_ANO = :ANO
                            and C.NCOM_PERIODO = :PERIODO and C.NCOM_PERIODICIDAD = :PERIODICIDAD and C.TERC_NIT = :NITE
                            into :COMISION;
                        if (COMISION is null) then
                            COMISION = 0;
                        /*RETROACTIVO*/
                        select C.EMCO_MONTO from EMPLEADO_CONCEPTOS C where C.TERC_NIT = :NITE
                            and C.CONC_COD = 933 into :RETROACT;
                            if (RETROACT is null ) then
                                RETROACT = 0;
                        /*REEMBOLSO*/
                        select C.EMCO_MONTO from EMPLEADO_CONCEPTOS C where C.TERC_NIT = :NITE
                            and C.CONC_COD = 952 into :REEMBOLSO;
                        if (REEMBOLSO is null ) then
                            REEMBOLSO = 0;
                        /*VACACIONES DISFRUTADAS ANTERIORMENTE*/
                        select C.EMCO_MONTO from EMPLEADO_CONCEPTOS C where C.TERC_NIT = :NITE
                            and C.CONC_COD = 955 into :VACACDISF;
                        if (VACACDISF is null ) then
                            VACACDISF = 0;
                        /* INCAPACIDAD*/
                        select N.NONO_DURA from NOMINA_NOVEDADES N where N.TERC_NIT = :NITE
                            and N.NONO_PERIODO = :PERIODO and N.NONO_ANO = :ANO and (N.TNOV_COD = 2 or (N.TNOV_COD = 3))
                            into :DIASNOV;
                        if (:DIASNOV is null) then
                            INCAP = 0;
                        else
                            INCAP = (:BASICO / 30)* :DIASNOV;
                        /*BASICO*/
                        if (SALINTEG = 'S') then
                            BASICO = BASICO * (tar_salinteg / 100);
                        BASICO = ((:BASICO/30)*:DIASLAB) - (((:BASICO/30)/8)*:RECNOCT);
                        BASICO = :BASICO - (((:BASICO/30)/8)*:RECFEST);
                        /*HORAS EXTRA*/
                        select C.NOEX_MONTO from NOMINA_HORASEXT C where C.NOEX_ANO = :ANO
                            and C.NOEX_PERIODIO = :PERIODO and C.NOEX_PERIODICIDAD = :PERIODICIDAD and C.TERC_NIT = :NITE
                            into :HORASEX;
                        if (HORASEX is null) then
                            HORASEX = 0;
                        /*RECARGOS*/
                        BASICOREC = BASICOEMP;
                        RECARGO = (((:BASICOREC/30)/8)*:TAR_RECNOTC)*:RECNOCT;
                        RECARGO = :RECARGO + ((((:BASICOREC/30)/8)*:TAR_RECFEST)*:RECFEST);
                        if (RECARGO is null) then
                            RECARGO = 0;
                        /*basico*/
                        if (:BASICO + :COMISION + :HORASEX + :RETROACT+ :REEMBOLSO + :INCAP+ :CAMBSALTRANS < ((:SMLV/30)*:DIASLAB)) then
                            BASICO = (:SMLV/30)*:DIASLAB;
                        /* SMLV Y AUX. TRANSPORTE*/
                        select P.PAAN_AUXTR, P.PAAN_SALMINIMO from PARAMETROS_ANO P
                            where P.PAAN_ANO = :ANO into :AUXTRANS, :SMLV;
                        /*BASE*/
                        VALOR = :BASICO + :COMISION + :HORASEX + :RETROACT+ :REEMBOLSO + :INCAP + :RECARGO + :CAMBSALTRANS + :VACACDISF;
                        if (CONC_COD = 904) then
                            begin
                            ENTIDAD = :NITAFP;
                            select A.PAAN_AFPTR from PARAMETROS_ANO A where A.PAAN_ANO = :ANO into :PORCEN;
                            VALOR = ((:VALOR) * :PORCEN) /100;
                            end
                        else if ((CONC_COD = 905) or (CONC_COD = 906) or (CONC_COD = 934) ) then
                            begin
                            ENTIDAD = :NITAFP;
                            select A.PAAN_AFPEM from PARAMETROS_ANO A where A.PAAN_ANO = :ANO into :PORCEN;
                            VALOR = ((:VALOR) * :PORCEN) /100;
                            end
                        else if ((CONC_COD = 907) or (CONC_COD = 914) or (CONC_COD = 915) or (conc_cod = 938)) then
                            begin
                            ENTIDAD = :NITEPS;
                            if (CONC_COD = 907) then
                                begin
                                select A.PAAN_EPSTR from PARAMETROS_ANO A where A.PAAN_ANO = :ANO into :PORCEN;
                                VALOR = ((:VALOR) * :PORCEN) /100;
                                end
                            else
                                begin
                                select A.PAAN_EPSEM from PARAMETROS_ANO A where A.PAAN_ANO = :ANO into :PORCEN;
                                    VALOR = ((:VALOR) * :PORCEN) /100;
                                end
                            end
                        else if ((CONC_COD = 910) or (CONC_COD = 911) or (CONC_COD = 936)) then
                            begin
                            /*ccf */
                            ENTIDAD = :NITCCF;
                            select A.PAAN_CCF from PARAMETROS_ANO A where A.PAAN_ANO = :ANO into :PORCEN;
                            VALOR = ((:VALOR) * :PORCEN) /100;
                            end
                        else if ((CONC_COD = 916) or (CONC_COD = 917) or (CONC_COD = 939) ) then
                            begin
                            /*icbf */
                            ENTIDAD = :NITCCF;
                            select A.PAAN_ICBF from PARAMETROS_ANO A where A.PAAN_ANO = :ANO into :PORCEN;
                            VALOR = ((:VALOR) * :PORCEN) /100;
                            end
                        else if ((CONC_COD = 918) or (CONC_COD = 919) or (CONC_COD = 940) ) then
                            begin
                            /*sena */
                            ENTIDAD = :NITCCF;
                            select A.PAAN_SENA from PARAMETROS_ANO A where A.PAAN_ANO = :ANO into :PORCEN;
                            VALOR = ((:VALOR) * :PORCEN) /100;
                            end
                        else if ((CONC_COD = 912) or (CONC_COD = 913) or (CONC_COD = 937)) then
                            begin
                            /* CESANTIAS */
                            ENTIDAD = :NITAFC;
                            if (PARAMBENEF = 'SI') then
                                begin
                                select sum(CE.EMCO_MONTO)
                                    from EMPLEADO_CONCEPTOS CE, CONCEPTOS_NOMINA CN where CN.CONC_BENEFIC = 'S' and (CE.TERC_NIT = :NITE) and (CE.CONC_COD = CN.CONC_COD) and
                                    ((CE.EMCO_FECINI <= :FEC and CE.EMCO_FECFIN >= :FEC) or ((CN.CONC_TODOSPER = 'N') and (CE.EMCO_PPAGO = :PERIODO)) or
                                    (CN.CONC_TODOSPER = 'S'))
                                    into :BENEFICIOS;
                                if (BENEFICIOS is null) then
                                    BENEFICIOS = 0;
                                end
                            else
                                BENEFICIOS = 0;
                            select P.PAAN_AUXTR, P.PAAN_SALMINIMO from PARAMETROS_ANO P
                                where P.PAAN_ANO = :ANO into :AUXTRANS, :SMLV;
                            if (:BASICO < (:SMLV*2)) then
                                AUXTRANS = (:AUXTRANS / 30) * :DIASLAB;
                            else
                                AUXTRANS = 0;
                            select A.PAAN_CESEMP from PARAMETROS_ANO A where A.PAAN_ANO = :ANO
                                into :PORCEN;
                            VALOR = ((:VALOR + :AUXTRANS + :BENEFICIOS) * :PORCEN) /100;
                            end
                        else
                            begin
                            if (COMISION is null) then
                                COMISION = 0;
                            select C.NCOM_MONTO from NOMINA_COMISIONES C where C.NCOM_ANO = :ANO and C.NCOM_PERIODO = :PERIODO and C.NCOM_PERIODICIDAD = :PERIODICIDAD and C.TERC_NIT = :NITE
                                into :COMISION;
                            CONC_MONTO = :BASICO + :COMISION;
                            if (CONC_PORC <> 0 and CONC_PORC is not null) then
                                VALOR = (((:CONC_MONTO/30 * :DIASLAB )+ :CAMBSALTRANS + :INCAP) * :CONC_PORC) /100;
                            else
                                if (:PORCEN <> 0 and :PORCEN is not null) then
                                    VALOR = (((:CONC_MONTO/30 * :DIASLAB )+ :CAMBSALTRANS + :INCAP) * :PORCEN) /100;
                                else
                                    if (:MONTOS <> 0 and :MONTOS is not null) then
                                        VALOR = :MONTOS;
                                    else
                                        if (:CONC_MONTO <> 0 and :CONC_MONTO is not null) then
                                            VALOR = :CONC_MONTO;
                            end
                        ITEM = :ITEM + 1;
                        end
                    end /* aportes */
                else if (CONC_PROV = 'S') then
                    begin
                    /*provisiones */
                    HORASEX = null;
                    DIASNOV = null;
                    RETROACT = null;
                    REEMBOLSO = null;
                    BENEFICIOS = null;
                    RECARGO = null;
                    COMISION = null;
                    INCAP = null;
                    /* RECARGO*/
                    BASICO = BASICOEMP;
                    RECARGO = (((:BASICO/30)/8)*:TAR_RECNOTC)*:RECNOCT;
                    RECARGO = :RECARGO + ((((:BASICO/30)/8)*:TAR_RECFEST)*:RECFEST);
                    /*INCAPACIDAD*/
                    select N.NONO_DURA from NOMINA_NOVEDADES N where N.TERC_NIT = :NITE and N.NONO_PERIODO = :PERIODO and N.NONO_ANO = :ANO and (N.TNOV_COD = 2 or (N.TNOV_COD = 3)) into :DIASNOV;
                    if (:DIASNOV is null) then
                        INCAP = 0;
                    else
                        INCAP = (:BASICO / 30)* :DIASNOV;
                    /* BASICO*/
                    BASICO = ((:BASICO/30)*:DIASLAB) - (((:BASICO/30)/8)*:RECNOCT);
                    BASICO = :BASICO - (((:BASICO/30)/8)*:RECFEST);
                    if (SALINTEG = 'S') then
                        BASICO = BASICO * (tar_salinteg / 100);
                    /*BENEFICIOS*/
                    if (PARAMBENEF = 'SI') then
                        begin
                        select sum(CE.EMCO_MONTO)
                            from EMPLEADO_CONCEPTOS CE, CONCEPTOS_NOMINA CN where CN.CONC_BENEFIC = 'S'
                            and (CE.TERC_NIT = :NITE) and (CE.CONC_COD = CN.CONC_COD) and
                            ((CE.EMCO_FECINI <= :FEC and CE.EMCO_FECFIN >= :FEC) or ((CN.CONC_TODOSPER = 'N')
                            and (CE.EMCO_PPAGO = :PERIODO)) or (CN.CONC_TODOSPER = 'S'))
                            into :BENEFICIOS;
                        if (BENEFICIOS is null) then
                            BENEFICIOS = 0;
                        end
                    else
                        BENEFICIOS = 0;
                    if ((CONC_COD <> 929) and (CONC_COD <> 930) and (CONC_COD <> 944)) then
                        begin
                        select P.PAAN_AUXTR, P.PAAN_SALMINIMO from PARAMETROS_ANO P where P.PAAN_ANO = :ANO
                            into :AUXTRANS, :SMLV;
                        if (:BASICO < (:SMLV*2)) then
                            AUXTRANS = (:AUXTRANS / 30) * :DIASLAB;
                        else
                            AUXTRANS = 0;
                        end
                    else
                        AUXTRANS = 0;
                    CONC_MONTO = :BASICO;
                    if (CONC_PORC <> 0 and CONC_PORC is not null) then
                        VALOR = (((:CONC_MONTO)+ :CAMBSALTRANS + :INCAP + :RECARGO + :AUXTRANS + :BENEFICIOS) * :CONC_PORC) /100;
                    else
                        if (PORCEN <> 0 and PORCEN is not null) then
                            VALOR = (((:CONC_MONTO)+ :CAMBSALTRANS + :INCAP + :RECARGO + :AUXTRANS + :BENEFICIOS) * :PORCEN) /100;
                        else
                            if (MONTOS <> 0 and MONTOS is not null) then
                                VALOR = :MONTOS;
                            else
                                if (CONC_MONTO <> 0 and CONC_MONTO is not null) then
                                    VALOR = :CONC_MONTO;
                    ITEM = :ITEM + 1;
                    end /* provision */
                else if (CONC_COD = 920) then /* comisiones */
                    begin
                    select C.NCOM_MONTO from NOMINA_COMISIONES C where C.NCOM_ANO = :ANO and C.NCOM_PERIODO = :PERIODO and C.NCOM_PERIODICIDAD = :PERIODICIDAD and C.TERC_NIT = :NITE into :VALOR;
                    if (VALOR is null) then
                    VALOR = 0;
                    ITEM = :ITEM + 1;
                    end
                else if (CONC_COD = 900 or (:CONC_COD = 931)) then /* horas extra */
                    begin
                    select C.NOEX_MONTO from NOMINA_HORASEXT C where C.NOEX_ANO = :ANO and
                        C.NOEX_PERIODIO = :PERIODO and C.NOEX_PERIODICIDAD = :PERIODICIDAD and C.TERC_NIT = :NITE into :VALOR;
                    if (VALOR is null) then
                        VALOR = 0;
                    ITEM = :ITEM + 1;
                    end
                else if (CONC_COD = 954) then /* cartera */
                    begin
                    select C.NCAR_MONTO from NOMINA_CARTERA C where C.NCAR_ANO = :ANO and C.NCAR_PERIODO = :PERIODO and C.NCAR_PERIODICIDAD = :PERIODICIDAD and C.TERC_NIT = :NITE into :VALOR;
                    if (VALOR is null) then
                        VALOR = 0;
                    ITEM = :ITEM + 1;
                    end
                else if (CONC_COD = 932) then
                    begin
                    /* incapacidad */
                    select N.NONO_DURA from NOMINA_NOVEDADES N where N.TERC_NIT = :NITE and N.NONO_PERIODO = :PERIODO and N.NONO_ANO = :ANO and (N.TNOV_COD = 2 or (N.TNOV_COD = 3)) into :DIASNOV;
                    if (:DIASNOV is null) then
                        VALOR = 0;
                    else
                        VALOR = (:BASICO / 30)* :DIASNOV;
                    end
                else if (CONC_COD = 921) then
                    begin
                    if (PORCEN is not null and PORCEN <> 0) then
                        VALOR = ((BASICO / 30)* :DIASLAB ) * :PORCEN /100;
                    else
                        if (CONC_PORC is not null and CONC_PORC <> 0) then
                            VALOR = ((BASICO / 30)* :DIASLAB ) * :CONC_PORC /100;
                    end
                else if (CONC_COD = 953) then
                    begin
                    /* RECARGO */
                    BASICO = BASICOEMP;
                    VALOR = (((:BASICO/30)/8)*:TAR_RECNOTC)*:RECNOCT;
                    VALOR = :VALOR + ((((:BASICO/30)/8)*:TAR_RECFEST)*:RECFEST);
                    end
                if (CONC_APORTE = 'S') then
                    begin
                    if (ENTIDAD is null or (ENTIDAD = '') ) then
                        ENTIDAD = :CONC_ENTIDAD;
                    end
                end
            if ((VALOR <> 0) and (VALOR is not null)) then
                begin
                execute procedure REDONDEE(:VALOR, :APROX) returning_values (VALOR);
                if ((MENSUAL = 'N') or (PERIODICIDAD = 1))  then
                    insert into NOMINA_CONCEPTOS (NOMI_ID, NOCO_ITEM, CONC_COD,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, NOCO_GTOEMPR)
                        values (:IDNOMINA,:ITEM, :CONCEPT, :NIT_TERCERO, :VALOR, :ENTIDAD, :CONC_DEDUC, :CONC_PROV, :CONC_APORTE, :PERIODO, :ANO, :CONC_MODIFI, :CONC_APLICAPROM, :SALARIO, :GTOEMPR);
                else
                    if (MENSUAL = 'S') then
                        begin
                        if ((:PERIODICIDAD = 2) and (LIQUIDAPER = 1)) then
                            begin
                            if ((PERIODO = 1) or (PERIODO = 3) or (PERIODO = 5) or (PERIODO = 7) or (PERIODO = 9) or (PERIODO = 11)
                                or (PERIODO = 13) or (PERIODO = 15) or (PERIODO = 17) or (PERIODO = 19) or (PERIODO = 21) or (PERIODO = 23)) then
                                insert into NOMINA_CONCEPTOS (NOMI_ID, NOCO_ITEM, CONC_COD,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, NOCO_GTOEMPR)
                                    values (:IDNOMINA,:ITEM, :CONCEPT, :NIT_TERCERO, :VALOR, :ENTIDAD, :CONC_DEDUC, :CONC_PROV, :CONC_APORTE, :PERIODO, :ANO, :CONC_MODIFI, :CONC_APLICAPROM, :SALARIO, :GTOEMPR);
                            end
                        else if ((:PERIODICIDAD = 2) and (LIQUIDAPER = 2)) then
                            begin
                            if ((PERIODO = 2) or (PERIODO = 4) or (PERIODO = 6) or (PERIODO = 8) or (PERIODO = 10) or (PERIODO = 12)
                                or (PERIODO = 14) or (PERIODO = 16) or (PERIODO = 18) or (PERIODO = 20) or (PERIODO = 22) or (PERIODO = 24)) then
                                insert into NOMINA_CONCEPTOS (NOMI_ID, NOCO_ITEM, CONC_COD,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, NOCO_GTOEMPR)
                                    values (:IDNOMINA,:ITEM, :CONCEPT, :NIT_TERCERO, :VALOR, :ENTIDAD, :CONC_DEDUC, :CONC_PROV, :CONC_APORTE, :PERIODO, :ANO, :CONC_MODIFI, :CONC_APLICAPROM, :SALARIO, :GTOEMPR);
                            end
                        else if ((:PERIODICIDAD = 3) and (LIQUIDAPER = 1)) then
                            begin
                            if ((PERIODO = 1) or (PERIODO = 5) or (PERIODO = 9) or (PERIODO = 13) or (PERIODO = 17) or (PERIODO = 21)
                                or (PERIODO = 25) or (PERIODO = 29) or (PERIODO = 33) or (PERIODO = 37) or (PERIODO = 41) or (PERIODO = 45)
                                or (PERIODO = 49)) then
                                insert into NOMINA_CONCEPTOS (NOMI_ID, NOCO_ITEM, CONC_COD,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, NOCO_GTOEMPR)
                                    values (:IDNOMINA,:ITEM, :CONCEPT, :NIT_TERCERO, :VALOR, :ENTIDAD, :CONC_DEDUC, :CONC_PROV, :CONC_APORTE, :PERIODO, :ANO, :CONC_MODIFI, :CONC_APLICAPROM, :SALARIO, :GTOEMPR);
                            end
                        else if ((:PERIODICIDAD = 3) and (LIQUIDAPER = 2)) then
                            begin
                            if ((PERIODO = 2) or (PERIODO = 6) or (PERIODO = 10) or (PERIODO = 14) or (PERIODO = 18) or (PERIODO = 22)
                                or (PERIODO = 26) or (PERIODO = 30) or (PERIODO = 34) or (PERIODO = 38) or (PERIODO = 42) or (PERIODO = 46)
                                or (PERIODO = 50)) then
                                insert into NOMINA_CONCEPTOS (NOMI_ID, NOCO_ITEM, CONC_COD,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, NOCO_GTOEMPR)
                                    values (:IDNOMINA,:ITEM, :CONCEPT, :NIT_TERCERO, :VALOR, :ENTIDAD, :CONC_DEDUC, :CONC_PROV, :CONC_APORTE, :PERIODO, :ANO, :CONC_MODIFI, :CONC_APLICAPROM, :SALARIO, :GTOEMPR);
                            end
                        else if ((:PERIODICIDAD = 3) and (LIQUIDAPER = 3)) then
                            begin
                            if ((PERIODO = 3) or (PERIODO = 7) or (PERIODO = 11) or (PERIODO = 15) or (PERIODO = 19) or (PERIODO = 23)
                                or (PERIODO = 27) or (PERIODO = 31) or (PERIODO = 35) or (PERIODO = 39) or (PERIODO = 43) or (PERIODO = 47)
                                or (PERIODO = 51)) then
                                insert into NOMINA_CONCEPTOS (NOMI_ID, NOCO_ITEM, CONC_COD,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, NOCO_GTOEMPR)
                                    values (:IDNOMINA,:ITEM, :CONCEPT, :NIT_TERCERO, :VALOR, :ENTIDAD, :CONC_DEDUC, :CONC_PROV, :CONC_APORTE, :PERIODO, :ANO, :CONC_MODIFI, :CONC_APLICAPROM, :SALARIO, :GTOEMPR);
                            end
                        else if ((:PERIODICIDAD = 3) and (LIQUIDAPER = 4)) then
                            begin
                            if ((PERIODO = 4) or (PERIODO = 8) or (PERIODO = 12) or (PERIODO = 16) or (PERIODO = 20) or (PERIODO = 24)
                                or (PERIODO = 29) or (PERIODO = 32) or (PERIODO = 36) or (PERIODO = 40) or (PERIODO = 44) or (PERIODO = 48)
                                or (PERIODO = 52)) then
                                insert into NOMINA_CONCEPTOS (NOMI_ID, NOCO_ITEM, CONC_COD,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, NOCO_GTOEMPR)
                                    values (:IDNOMINA,:ITEM, :CONCEPT, :NIT_TERCERO, :VALOR, :ENTIDAD, :CONC_DEDUC, :CONC_PROV, :CONC_APORTE, :PERIODO, :ANO, :CONC_MODIFI, :CONC_APLICAPROM, :SALARIO, :GTOEMPR);
                            end
                        end
                    VALOR = 0;
                    BASICO = 0;
                    end
            end /* for */
        end
    end
suspend;
end
^

SET TERM ; ^

/* 20100616 */
/* EL CAMBIO DE LA PROPORCION POR EL NUMERO DE PERIODOS NO APLICA, SE USA AHORA EL PORCENTAJE EN CONCEPTOS SOBRE PROMEDIO */
/* salario mal cuando hay recargos u horas extras LAS RESTABA??? */

UPDATE empleado_conceptos C SET EMCO_PORC = 100 WHERE CONC_COD = 17 AND EXISTS (SELECT TERC_NIT FROM EMPLEADOS WHERE EMPL_PPAGO = 2 AND TERC_NIT = C.terc_nit);
UPDATE empleado_conceptos C SET EMCO_PORC = 100 WHERE CONC_COD = 18 AND EXISTS (SELECT TERC_NIT FROM EMPLEADOS WHERE EMPL_PPAGO = 2 AND TERC_NIT = C.terc_nit);
UPDATE empleado_conceptos C SET EMCO_PORC = 50 WHERE CONC_COD = 17 AND EXISTS (SELECT TERC_NIT FROM EMPLEADOS WHERE EMPL_PPAGO = 1 AND TERC_NIT = C.terc_nit);
UPDATE empleado_conceptos C SET EMCO_PORC = 50 WHERE CONC_COD = 18 AND EXISTS (SELECT TERC_NIT FROM EMPLEADOS WHERE EMPL_PPAGO = 1 AND TERC_NIT = C.terc_nit);
COMMIT WORK;

SET TERM ^ ;

CREATE OR ALTER procedure CAUSA_NOMINA (
    FEC date,
    PERIODO integer,
    PERIODICIDAD integer,
    PAGOGLOBAL char(1),
    ANO char(4),
    DEPTO integer)
returns (
    IDNOMINA integer,
    ITEMINI integer)
AS
declare variable ITEM integer;
declare variable NITE varchar(20) character set NONE;
declare variable NIT_TERCERO varchar(20);
declare variable CONCEPT integer;
declare variable MONTOS numeric(18,2);
declare variable PORCEN numeric(9,4);
declare variable ENTIDAD varchar(20);
declare variable CONC_COD integer;
declare variable CONC_DEDUC char(1);
declare variable CONC_PORC numeric(9,4);
declare variable CONC_ENTIDAD integer;
declare variable CONC_MONTO numeric(18,2);
declare variable CONC_MODIFI char(1);
declare variable CONC_PROMEDIO char(1);
declare variable VALOR numeric(18,2);
declare variable DIASLAB integer;
declare variable CONC_PROV char(1);
declare variable CONC_APORTE char(1);
declare variable NUMEROPROM integer;
declare variable CONC_APLICAPROM char(1);
declare variable PERINICIAL integer;
declare variable PERFINAL integer;
declare variable ANOINI integer;
declare variable ANOFIN integer;
declare variable CONC_DIAS char(1);
declare variable CONC_OTROCONC char(1);
declare variable CONC_CODOTROCONC integer;
declare variable ANOSUM integer;
declare variable SALARIO char(1) character set NONE;
declare variable LIQUIDAPER integer;
declare variable BASICO numeric(18,2);
declare variable NITEPS varchar(20);
declare variable NITAFC varchar(20);
declare variable NITAFP varchar(20);
declare variable NITCCF varchar(20);
declare variable GTOEMPR char(1);
declare variable COMISION numeric(18,2);
declare variable CAMBSALTRANS numeric(18,2);
declare variable SALDOSINI numeric(18,2);
declare variable DURANOV integer;
declare variable BASE numeric(18,2);
declare variable APROX integer;
declare variable MENSUAL char(1);
declare variable HORASEX numeric(18,2);
declare variable DIASNOV integer;
declare variable TOMASAL integer;
declare variable RETROACT numeric(18,2);
declare variable REEMBOLSO numeric(18,2);
declare variable INCAP numeric(18,2);
declare variable AUXTRANS numeric(18,2);
declare variable SMLV numeric(18,2);
declare variable BENEFICIOS numeric(18,2);
declare variable CONFIRMADO char(1);
declare variable RECNOCT numeric(18,2);
declare variable RECFEST numeric(18,2);
declare variable TAR_RECNOTC numeric(9,4);
declare variable TAR_RECFEST numeric(9,4);
declare variable RECARGO numeric(18,2);
declare variable BASICOREC numeric(18,2);
declare variable PARAMBENEF char(2);
declare variable VACACDISF numeric(18,2);
declare variable VALORPREDET numeric(18,2);
declare variable BASICOEMP numeric(18,2);
declare variable salinteg CHAR(1);
declare variable TAR_SALINTEG numeric(9,4);
begin
execute procedure LEE_CONFIGURACION('NOMINA','LIQUIDACION','TOMAR BENEFICIOS PARA CALCULAR PROVISIONES')returning_values(:PARAMBENEF);
execute procedure LEE_CONFIGURACION('NOMINA','GENERAL','REDONDEO AL MULTIPLO DE DIEZ EN TOTALES')returning_values(:APROX);
select N.NOMI_ID, N.NOMI_LIQOK from NOMINA N where N.NOMI_PERIODO = :PERIODO and N.NOMI_PERIODOCIDAD = :PERIODICIDAD
    and N.NOMI_ANO = :ANO into :IDNOMINA, :CONFIRMADO;
if (:IDNOMINA is null) then
    begin
    execute procedure CAMBIE_ID_NOMINA returning_values(:IDNOMINA);
    insert into NOMINA (NOMI_ID, NOMI_FECCAUSA, NOMI_PAGOGLOBAL, NOMI_PERIODOCIDAD, NOMI_PERIODO, NOMI_ANO, NOMI_LIQOK)
    values (:IDNOMINA, :FEC,:PAGOGLOBAL, :PERIODICIDAD, :PERIODO, :ANO, 'N');
    ITEM = 1;
    end
else
    begin
    select max(N.NOCO_ITEM) from NOMINA_CONCEPTOS N where N.NOMI_ID = :IDNOMINA
    into :ITEM;
    end
if ((CONFIRMADO = 'S') and (IDNOMINA is not null)) then
    begin
    IDNOMINA = 0;
    end
else
    begin
    insert into NOMINA_DEPARTAMENTO (NOMI_ID, NODP_DEPTO)values(:IDNOMINA,:DEPTO);
    select P.PAAN_RECNOC, P.PAAN_RECFEST, P.paan_salinteg from PARAMETROS_ANO P where P.PAAN_ANO = :ANO
        into :TAR_RECNOTC, :TAR_RECFEST, TAR_SALINTEG;
    ITEMINI = ITEM;
    for select E.TERC_NIT, E.EMPL_EPS, E.EMPL_AFC, E.EMPL_AFP, E.EMPL_CCF, E.empl_salinteg
        from EMPLEADOS E
        where E.EMPL_PPAGO = :PERIODICIDAD and ((E.EMPL_FECRET is null) or (E.EMPL_FECRET > :FEC)) and E.EMPL_FECING <= :FEC
        and ((:DEPTO = 0) or (e.empl_dpto = :DEPTO))
        into :NITE, :NITEPS, :NITAFC, :NITAFP, :NITCCF, :SALINTEG
        do
        begin
        select first 1 M.MVSE_SALARIO from MOVIMIENTO_SALARIO_EMPLEADO M where M.TERC_NIT = :NITE and M.MVSE_FECHA <= :FEC order by M.MVSE_FECHA desc into :BASICOEMP;
        BASICO = BASICOEMP;
        RECNOCT = null;
        RECFEST = null;
        select N.NOEX_RECNOCT, N.NOEX_RECFEST
            from NOMINA_HORASEXT N where N.NOEX_PERIODIO = :PERIODO and N.NOEX_ANO = :ANO and N.TERC_NIT = :NITE
            into :RECNOCT, :RECFEST;
        if (RECNOCT is null) then
            RECNOCT = 0;
        if (RECFEST is null) then
            RECFEST = 0;
        for select CE.TERC_NIT, CE.CONC_COD, CE.EMCO_MONTO, CE.EMCO_PORC, CE.EMPL_ENTIDAD, CE.EMCO_PERPROM, CE.EMCO_LUQUIDAPER, CE.EMCO_MENSUAL, CN.CONC_COD, CN.CONC_DEDUC,CN.CONC_PORC, CN.CONC_ENTIDAD, CN.CONC_MONTO,  CN.CONC_DIAS, CN.CONC_MODIFI,
            CN.CONC_PROMEDIO, CN.CONC_SALARIO, CN.CONC_PROV, CN.CONC_APORTE, CN.CONC_APLICAPROM, CN.CONC_OTROCONC, CN.CONC_CODOTROCONC, CN.CONC_GTOEMPR, CN.CONC_BASE, CE.EMCO_TOMSAL
            from EMPLEADO_CONCEPTOS CE, CONCEPTOS_NOMINA CN where (CE.CONC_COD = CN.CONC_COD) and (CE.TERC_NIT = :NITE) and
            ( ((CE.EMCO_FECINI <= :FEC and CE.EMCO_FECFIN >= :FEC)) or
            ((CN.CONC_TODOSPER = 'N') and (CE.EMCO_PPAGO = :PERIODO)) or ((CN.CONC_TODOSPER = 'S') AND (((:periodicidad = 1) AND (:PERIODO < 13)) or ((:periodicidad = 2) AND (:PERIODO < 25)))) )  order by (TERC_NIT )
            into :NIT_TERCERO, :CONCEPT,  :MONTOS, :PORCEN, :ENTIDAD, :NUMEROPROM, :LIQUIDAPER, :MENSUAL ,:CONC_COD, :CONC_DEDUC, :CONC_PORC,
            :CONC_ENTIDAD, :CONC_MONTO, :CONC_DIAS, :CONC_MODIFI,:CONC_PROMEDIO, :SALARIO,:CONC_PROV, :CONC_APORTE , :CONC_APLICAPROM, :CONC_OTROCONC, :CONC_CODOTROCONC, :GTOEMPR, :BASE, :TOMASAL
            do
            begin
            if (CONC_DIAS = 'S') then
                execute procedure DIAS_LABORADOS (:NITE, :PERIODO, :FEC, :MENSUAL,:CONC_APORTE) returning_values (:DIASLAB);
            else
                DIASLAB = 15;
            if (:TOMASAL <> 0) then
                begin
                /* SI EL CONCEPTO NOAPLICA EN ESTE PERIODO DEJE EL BASICO EN CERO */
                if ((:PERIODICIDAD = 2) and (:TOMASAL <> 2)) then
                    begin
                    if ((PERIODO = 2) or (PERIODO = 4) or (PERIODO = 6) or (PERIODO = 8) or (PERIODO = 10) or (PERIODO = 12)
                        or (PERIODO = 14) or (PERIODO = 16) or (PERIODO = 18) or (PERIODO = 20) or (PERIODO = 22) or (PERIODO = 24)) then
                        BASICO = 0;
                    end
                else
                    if ((:PERIODICIDAD = 3) and (:TOMASAL <> 1)) then
                        begin
                        if ((PERIODO = 1) or (PERIODO = 5) or (PERIODO = 9) or (PERIODO = 13) or (PERIODO = 17) or (PERIODO = 21)
                            or (PERIODO = 25) or (PERIODO = 29) or (PERIODO = 33) or (PERIODO = 37) or (PERIODO = 41) or (PERIODO = 45)
                            or (PERIODO = 49)) then
                            BASICO = 0;
                        end
                    else
                        if ((:PERIODICIDAD = 3) and (:TOMASAL <> 2)) then
                            begin
                            if ((PERIODO = 2) or (PERIODO = 6) or (PERIODO = 10) or (PERIODO = 14) or (PERIODO = 18) or (PERIODO = 22)
                                or (PERIODO = 26) or (PERIODO = 30) or (PERIODO = 34) or (PERIODO = 38) or (PERIODO = 42) or (PERIODO = 46)
                                or (PERIODO = 50)) then
                                BASICO = 0;
                            end
                        else
                            if ((:PERIODICIDAD = 3) and (:TOMASAL <> 3)) then
                                begin
                                if ((PERIODO = 3) or (PERIODO = 7) or (PERIODO = 11) or (PERIODO = 15) or (PERIODO = 19) or (PERIODO = 23)
                                    or (PERIODO = 27) or (PERIODO = 31) or (PERIODO = 35) or (PERIODO = 39) or (PERIODO = 43) or (PERIODO = 47)
                                    or (PERIODO = 51)) then
                                    BASICO = 0;
                                end
                            else
                                if ((:PERIODICIDAD = 3) and (:TOMASAL <> 4)) then
                                begin
                                if ((PERIODO = 4) or (PERIODO = 8) or (PERIODO = 12) or (PERIODO = 16) or (PERIODO = 20) or (PERIODO = 24)
                                    or (PERIODO = 29) or (PERIODO = 32) or (PERIODO = 36) or (PERIODO = 40) or (PERIODO = 44) or (PERIODO = 48)
                                    or (PERIODO = 52)) then
                                    BASICO = 0;
                                end
                end
            else
                begin
                /* SE CALCULA SOBRE TODOS LOS PERIODOS */
                BASICO = BASICOEMP;
                end
            VALORPREDET = null;
            select VP.NVPR_MONTO from NOMINA_VALOR_PREDET VP where VP.NVPR_PERIODICIDAD = :PERIODICIDAD and VP.NVPR_PERIODO = :PERIODO and VP.NVPR_ANO = :ANO and VP.CONC_COD = :CONC_COD and VP.TERC_NIT = :NITE
                into :VALORPREDET;
            if ((:VALORPREDET <> 0) and (VALORPREDET is not null)) then
                VALOR = VALORPREDET;
            else
                begin
                /* SI HAY UN CAMBIO TRANSITORIO DE SALARIO AJUSTE LOS DIAS Y CALCULE EL VALOR A SUMAR */
                select ((N.NONO_VALOR /30) * N.NONO_DURA), (N.NONO_DURA) from NOMINA_NOVEDADES N
                    where N.TNOV_COD = 11 and N.TERC_NIT = :NITE and N.NONO_PERIODO = :PERIODO into :CAMBSALTRANS, :DURANOV;
                if (CAMBSALTRANS is null) then
                    CAMBSALTRANS = 0;
                if (DURANOV is null) then
                    DURANOV = 0;
                DIASLAB = :DIASLAB - :DURANOV;
                /* SI ES UN PRESTAMO, TRAIGA LA CUOTA */
                if (CONC_COD = 922) then
                    begin
                    select sum(P.PRCU_MONTO) from PRESTAMO_CUOTAS P, PRESTAMO_NOMINA PN
                        where P.PRCU_ANO = :ANO and P.PRCU_PERIODO = :PERIODO and PN.PRNO_ID = P.PRNO_ID and PN.TERC_NIT = :NITE into :VALOR;
                    if (VALOR is null) then
                        VALOR = 0;
                    ITEM = :ITEM + 1;
                    /* MARQUE LA CUOTA COMO PAGADA */
                    update PRESTAMO_CUOTAS  P set PRCU_OK = 'S' where P.PRCU_ANO = :ANO and P.PRCU_PERIODO = :PERIODO and P.PRNO_ID = (select PN.PRNO_ID from PRESTAMO_NOMINA PN where PN.TERC_NIT = :NITE);
                    end
                else
                    if ((:MONTOS = 0) or (:MONTOS is null)) then
                        begin
                        /* SI EL CONCEPTO DEL EMPLEADO NO TIENE MONTO TRAIGA EL DE CONCEPTOS_NOMINA */
                        if ((CONC_PORC = 0 and :PORCEN = 0) or (CONC_PORC is null and :PORCEN = 0) or (CONC_PORC = 0 and :PORCEN is null) or (CONC_PORC is null and :PORCEN is null) ) then
                            begin
                            /* SIN PORCENTAJE */
                            if ((CONC_MONTO <> 0) and (CONC_MONTO is not null) ) then
                                begin
                                VALOR = :CONC_MONTO;
                                if (:CONC_DIAS = 'S') then
                                    VALOR = (:VALOR / 30) * :DIASLAB;
                                end
                            else
                                if (SALARIO = 'S' and CONC_COD <> 900 and CONC_COD <> 920 and CONC_COD <> 932 and CONC_COD <> 953) then
                                    begin
                                    /* SI ES SALARIO SUME LAS EXTRAS */
                                    BASICO = BASICOEMP;
                                    /*BASICO = ((:BASICO/30)*:DIASLAB) - (((:BASICO/30)/8)*:RECNOCT);/* PFP:DEBERIA SER + Y POR LA TARIFA QUE NO VEO POR NINGUN LADO
                                    BASICO = :BASICO - (((:BASICO/30)/8)*:RECFEST);*/
                                    CONC_MONTO = :BASICO;
                                    VALOR = (:CONC_MONTO/*/30 * :diaslab*/ ) + :CAMBSALTRANS;
                                    end
                                else
                                    begin
                                    VALOR = MONTOS;
                                    if (:CONC_DIAS = 'S') then
                                        VALOR = (:VALOR / 30) * :DIASLAB;
                                    end
                            end
                        else    
                            begin
                            if (:PORCEN <> 0) then
                                begin
                                /* SI TIENE PORCENTAJE EN EMPLEADO_CONCEPTOS PERO EL MONTO SE TRAE DE CONCPETOS_NOMINA */
                                if ((CONC_MONTO <> 0) and (CONC_MONTO is not null) ) then
                                    begin
                                    VALOR = ((:CONC_MONTO ) * :PORCEN) /100;
                                    end
                                end
                            else
                                begin
                                /* NO TIENE PORCENTAJE EN EMPLEADO_CONCEPTOS SE TRAE MONTO Y PORC DE CONCPETOS_NOMINA */
                                if ((CONC_MONTO <> 0) and (CONC_MONTO is not null) ) then
                                    begin
                                    VALOR = ((:CONC_MONTO) * :CONC_PORC) /100;
                                    end
                                else
                                    if (SALARIO = 'S' and CONC_COD <> 900 and CONC_COD <> 920 and CONC_COD <> 932 and CONC_COD <> 953) then
                                        begin
                                        BASICO = BASICOEMP;
                                        /*BASICO = ((:BASICO/30)*:DIASLAB) - (((:BASICO/30)/8)*:RECNOCT);
                                        BASICO = :BASICO - (((:BASICO/30)/8)*:RECFEST);*/
                                        CONC_MONTO = :BASICO;
                                        VALOR = ((:CONC_MONTO)+ :CAMBSALTRANS * :CONC_PORC) /100;
                                        end
                                    else
                                        if (:CONC_MONTO = 0 and :MONTOS = 0) then
                                            begin
                                            CONC_MONTO = :BASICO;
                                            VALOR = (((:CONC_MONTO / 30) * :DIASLAB) + :CAMBSALTRANS * :CONC_PORC) /100;
                                            end
                                end
                            end
                        end
                    else
                        /* SI TIENE MONTO EN EMPLEADO_CONCEPTOS */
                        if ((CONC_PORC = 0 or (CONC_PORC is null)) and (:PORCEN = 0 or (PORCEN is null))) then
                            begin
                            VALOR = (:MONTOS);
                            if (:CONC_DIAS = 'S') then
                                VALOR = (:VALOR / 30) * :DIASLAB;   
                            end
                        else
                            if (:PORCEN <> 0 and PORCEN is not null) then
                                begin
                                VALOR = ((:MONTOS ) * :PORCEN) /100;
                                end
                            else
                                begin
                                VALOR = ((:MONTOS) * :CONC_PORC) /100;
                                end
                if (CONC_PROMEDIO = 'S') then
                    begin
                    /* CALCULO DEL PROMEDIO BASE DESDE LA FECHA MENOS EL NUMERO DE PERIODOS */
                    EXECUTE PROCEDURE periodo_nom_fecha (:fec, :periodicidad) returning_values (:perfinal, :anofin);
                    if (perfinal < numeroprom) then
                        BEGIN
                        anoini = anofin - 1;
                        if (periodicidad = 1) then
                            perinicial = 12 - (numeroprom - perfinal) + 1;
                        if (periodicidad = 2) then
                            perinicial = 24 - (numeroprom - perfinal) + 1;
                        if (periodicidad = 3) then
                            perinicial = 52 - (numeroprom - perfinal) + 1;
                        END
                    ELSE
                        PERINICIAL = :perfinal - :NUMEROPROM;
                    if (anoini <> anofin) then
                        select sum (NOCO_VALOR) from NOMINA_CONCEPTOS N where N.NOCO_APLICAPROM = 'S' and
                            ((N.NOCO_PERIODO >= :PERINICIAL and N.NOCO_ANO = :anoini) or
                            (N.NOCO_PERIODO <= :perfinal and N.NOCO_ANO = :anofin)) and TERC_NIT = :NITE into :VALOR;
                    else
                        select sum (NOCO_VALOR) from NOMINA_CONCEPTOS N where N.NOCO_APLICAPROM = 'S' and
                            N.NOCO_PERIODO >= :PERINICIAL and N.NOCO_ANO = :anoini
                            and N.NOCO_PERIODO <= :perfinal and TERC_NIT = :NITE into :VALOR;
                    /* sume el saldo inicial */
                    SALDOSINI = 0;
                    select NOCO_VALOR from NOMINA_CONCEPTOS where CONC_COD = :CONC_COD and TERC_NIT  = :NITE and NOCO_PAGOOK = 'N' and NOCO_PERIODO = 0 into :SALDOSINI;
                    if (SALDOSINI is null) then
                        SALDOSINI = 0;
                    else
                        update NOMINA_CONCEPTOS N set NOCO_PAGOOK = 'S' where N.NOCO_APLICAPROM = 'S' and
                            CONC_COD = :CONC_COD and TERC_NIT = :NITE and NOCO_PERIODO = 0;

                    VALOR = :VALOR + :SALDOSINI;
                    /* APLIQUE LA PROPORCION Y EL PORCENTAJE */
                    VALOR = VALOR / NUMEROPROM;
                    VALOR = VALOR * PORCEN / 100;
                    end
                else if (CONC_OTROCONC = 'S') then
                    begin
                    ANOSUM = cast(ANO as integer);
                    ANOSUM = ANOSUM - 1;
                    select sum (NOCO_VALOR) from NOMINA_CONCEPTOS N where N.NOCO_ANO = :ANOSUM and N.CONC_COD = :CONC_CODOTROCONC and N.TERC_NIT = :NITE into :VALOR;
                    select NOCO_VALOR from NOMINA_CONCEPTOS where NOCO_ANO = :ANOSUM and CONC_COD = :CONC_CODOTROCONC and TERC_NIT = :NITE and NOCO_PERIODO = 0 into :SALDOSINI;
                    if (SALDOSINI is null) then
                        SALDOSINI = 0;
                    else
                        update NOMINA_CONCEPTOS set NOCO_PAGOOK = 'S' where NOCO_ANO = :ANOSUM and CONC_COD = :CONC_CODOTROCONC and NOCO_PERIODO = 0 and TERC_NIT = :NITE;
                    VALOR = :VALOR + :SALDOSINI;
                    update NOMINA_CONCEPTOS set NOCO_PAGOOK = 'S' where NOCO_ANO = :ANOSUM and CONC_COD = :CONC_CODOTROCONC and TERC_NIT = :NITE;
                    end
                else if (CONC_APORTE = 'S') then
                    begin
                    HORASEX = null;
                    DIASNOV = null;
                    RETROACT = null;
                    REEMBOLSO = null;
                    BENEFICIOS = null;
                    RECARGO = null;
                    COMISION = null;
                    INCAP = null;
                    VACACDISF = null;
                    if ((:ENTIDAD = '' ) or (ENTIDAD is null)) then
                        begin
                        /*COMISIONES*/
                        select C.NCOM_MONTO from NOMINA_COMISIONES C where C.NCOM_ANO = :ANO
                            and C.NCOM_PERIODO = :PERIODO and C.NCOM_PERIODICIDAD = :PERIODICIDAD and C.TERC_NIT = :NITE
                            into :COMISION;
                        if (COMISION is null) then
                            COMISION = 0;
                        /*RETROACTIVO*/
                        select C.EMCO_MONTO from EMPLEADO_CONCEPTOS C where C.TERC_NIT = :NITE
                            and C.CONC_COD = 933 into :RETROACT;
                            if (RETROACT is null ) then
                                RETROACT = 0;
                        /*REEMBOLSO*/
                        select C.EMCO_MONTO from EMPLEADO_CONCEPTOS C where C.TERC_NIT = :NITE
                            and C.CONC_COD = 952 into :REEMBOLSO;
                        if (REEMBOLSO is null ) then
                            REEMBOLSO = 0;
                        /*VACACIONES DISFRUTADAS ANTERIORMENTE*/
                        select C.EMCO_MONTO from EMPLEADO_CONCEPTOS C where C.TERC_NIT = :NITE
                            and C.CONC_COD = 955 into :VACACDISF;
                        if (VACACDISF is null ) then
                            VACACDISF = 0;
                        /* INCAPACIDAD*/
                        select N.NONO_DURA from NOMINA_NOVEDADES N where N.TERC_NIT = :NITE
                            and N.NONO_PERIODO = :PERIODO and N.NONO_ANO = :ANO and (N.TNOV_COD = 2 or (N.TNOV_COD = 3))
                            into :DIASNOV;
                        if (:DIASNOV is null) then
                            INCAP = 0;
                        else
                            INCAP = (:BASICO / 30)* :DIASNOV;
                        /*BASICO*/
                        if (SALINTEG = 'S') then
                            BASICO = BASICO * (tar_salinteg / 100);
                        BASICO = ((:BASICO/30)*:DIASLAB);/* - (((:BASICO/30)/8)*:RECNOCT);
                        BASICO = :BASICO - (((:BASICO/30)/8)*:RECFEST);*/
                        /*HORAS EXTRA*/
                        select C.NOEX_MONTO from NOMINA_HORASEXT C where C.NOEX_ANO = :ANO
                            and C.NOEX_PERIODIO = :PERIODO and C.NOEX_PERIODICIDAD = :PERIODICIDAD and C.TERC_NIT = :NITE
                            into :HORASEX;
                        if (HORASEX is null) then
                            HORASEX = 0;
                        /*RECARGOS*/
                        BASICOREC = BASICOEMP;
                        RECARGO = (((:BASICOREC/30)/8)*:TAR_RECNOTC)*:RECNOCT;
                        RECARGO = :RECARGO + ((((:BASICOREC/30)/8)*:TAR_RECFEST)*:RECFEST);
                        if (RECARGO is null) then
                            RECARGO = 0;
                        /*basico*/
                        if (:BASICO + :COMISION + :HORASEX + :RETROACT+ :REEMBOLSO + :INCAP+ :CAMBSALTRANS < ((:SMLV/30)*:DIASLAB)) then
                            BASICO = (:SMLV/30)*:DIASLAB;
                        /* SMLV Y AUX. TRANSPORTE*/
                        select P.PAAN_AUXTR, P.PAAN_SALMINIMO from PARAMETROS_ANO P
                            where P.PAAN_ANO = :ANO into :AUXTRANS, :SMLV;
                        /*BASE*/
                        VALOR = :BASICO + :COMISION + :HORASEX + :RETROACT+ :REEMBOLSO + :INCAP + :RECARGO + :CAMBSALTRANS + :VACACDISF;
                        if (CONC_COD = 904) then
                            begin
                            ENTIDAD = :NITAFP;
                            select A.PAAN_AFPTR from PARAMETROS_ANO A where A.PAAN_ANO = :ANO into :PORCEN;
                            VALOR = ((:VALOR) * :PORCEN) /100;
                            end
                        else if ((CONC_COD = 905) or (CONC_COD = 906) or (CONC_COD = 934) ) then
                            begin
                            ENTIDAD = :NITAFP;
                            select A.PAAN_AFPEM from PARAMETROS_ANO A where A.PAAN_ANO = :ANO into :PORCEN;
                            VALOR = ((:VALOR) * :PORCEN) /100;
                            end
                        else if ((CONC_COD = 907) or (CONC_COD = 914) or (CONC_COD = 915) or (conc_cod = 938)) then
                            begin
                            ENTIDAD = :NITEPS;
                            if (CONC_COD = 907) then
                                begin
                                select A.PAAN_EPSTR from PARAMETROS_ANO A where A.PAAN_ANO = :ANO into :PORCEN;
                                VALOR = ((:VALOR) * :PORCEN) /100;
                                end
                            else
                                begin
                                select A.PAAN_EPSEM from PARAMETROS_ANO A where A.PAAN_ANO = :ANO into :PORCEN;
                                    VALOR = ((:VALOR) * :PORCEN) /100;
                                end
                            end
                        else if ((CONC_COD = 910) or (CONC_COD = 911) or (CONC_COD = 936)) then
                            begin
                            /*ccf */
                            ENTIDAD = :NITCCF;
                            select A.PAAN_CCF from PARAMETROS_ANO A where A.PAAN_ANO = :ANO into :PORCEN;
                            VALOR = ((:VALOR) * :PORCEN) /100;
                            end
                        else if ((CONC_COD = 916) or (CONC_COD = 917) or (CONC_COD = 939) ) then
                            begin
                            /*icbf */
                            ENTIDAD = :NITCCF;
                            select A.PAAN_ICBF from PARAMETROS_ANO A where A.PAAN_ANO = :ANO into :PORCEN;
                            VALOR = ((:VALOR) * :PORCEN) /100;
                            end
                        else if ((CONC_COD = 918) or (CONC_COD = 919) or (CONC_COD = 940) ) then
                            begin
                            /*sena */
                            ENTIDAD = :NITCCF;
                            select A.PAAN_SENA from PARAMETROS_ANO A where A.PAAN_ANO = :ANO into :PORCEN;
                            VALOR = ((:VALOR) * :PORCEN) /100;
                            end
                        else if ((CONC_COD = 912) or (CONC_COD = 913) or (CONC_COD = 937)) then
                            begin
                            /* CESANTIAS */
                            ENTIDAD = :NITAFC;
                            if (PARAMBENEF = 'SI') then
                                begin
                                select sum(CE.EMCO_MONTO)
                                    from EMPLEADO_CONCEPTOS CE, CONCEPTOS_NOMINA CN where CN.CONC_BENEFIC = 'S' and (CE.TERC_NIT = :NITE) and (CE.CONC_COD = CN.CONC_COD) and
                                    ((CE.EMCO_FECINI <= :FEC and CE.EMCO_FECFIN >= :FEC) or ((CN.CONC_TODOSPER = 'N') and (CE.EMCO_PPAGO = :PERIODO)) or
                                    (CN.CONC_TODOSPER = 'S'))
                                    into :BENEFICIOS;
                                if (BENEFICIOS is null) then
                                    BENEFICIOS = 0;
                                end
                            else
                                BENEFICIOS = 0;
                            select P.PAAN_AUXTR, P.PAAN_SALMINIMO from PARAMETROS_ANO P
                                where P.PAAN_ANO = :ANO into :AUXTRANS, :SMLV;
                            if (:BASICO < (:SMLV*2)) then
                                AUXTRANS = (:AUXTRANS / 30) * :DIASLAB;
                            else
                                AUXTRANS = 0;
                            select A.PAAN_CESEMP from PARAMETROS_ANO A where A.PAAN_ANO = :ANO
                                into :PORCEN;
                            VALOR = ((:VALOR + :AUXTRANS + :BENEFICIOS) * :PORCEN) /100;
                            end
                        else
                            begin
                            if (COMISION is null) then
                                COMISION = 0;
                            select C.NCOM_MONTO from NOMINA_COMISIONES C where C.NCOM_ANO = :ANO and C.NCOM_PERIODO = :PERIODO and C.NCOM_PERIODICIDAD = :PERIODICIDAD and C.TERC_NIT = :NITE
                                into :COMISION;
                            CONC_MONTO = :BASICO + :COMISION;
                            if (CONC_PORC <> 0 and CONC_PORC is not null) then
                                VALOR = (((:CONC_MONTO/30 * :DIASLAB )+ :CAMBSALTRANS + :INCAP) * :CONC_PORC) /100;
                            else
                                if (:PORCEN <> 0 and :PORCEN is not null) then
                                    VALOR = (((:CONC_MONTO/30 * :DIASLAB )+ :CAMBSALTRANS + :INCAP) * :PORCEN) /100;
                                else
                                    if (:MONTOS <> 0 and :MONTOS is not null) then
                                        VALOR = :MONTOS;
                                    else
                                        if (:CONC_MONTO <> 0 and :CONC_MONTO is not null) then
                                            VALOR = :CONC_MONTO;
                            end
                        ITEM = :ITEM + 1;
                        end
                    end /* aportes */
                else if (CONC_PROV = 'S') then
                    begin
                    /*provisiones */
                    HORASEX = null;
                    DIASNOV = null;
                    RETROACT = null;
                    REEMBOLSO = null;
                    BENEFICIOS = null;
                    RECARGO = null;
                    COMISION = null;
                    INCAP = null;
                    /* RECARGO*/
                    BASICO = BASICOEMP;
                    RECARGO = (((:BASICO/30)/8)*:TAR_RECNOTC)*:RECNOCT;
                    RECARGO = :RECARGO + ((((:BASICO/30)/8)*:TAR_RECFEST)*:RECFEST);
                    /*INCAPACIDAD*/
                    select N.NONO_DURA from NOMINA_NOVEDADES N where N.TERC_NIT = :NITE and N.NONO_PERIODO = :PERIODO and N.NONO_ANO = :ANO and (N.TNOV_COD = 2 or (N.TNOV_COD = 3)) into :DIASNOV;
                    if (:DIASNOV is null) then
                        INCAP = 0;
                    else
                        INCAP = (:BASICO / 30)* :DIASNOV;
                    /* BASICO*/
                    BASICO = ((:BASICO/30)*:DIASLAB);/* - (((:BASICO/30)/8)*:RECNOCT);
                    BASICO = :BASICO - (((:BASICO/30)/8)*:RECFEST);*/
                    if (SALINTEG = 'S') then
                        BASICO = BASICO * (tar_salinteg / 100);
                    /*BENEFICIOS*/
                    if (PARAMBENEF = 'SI') then
                        begin
                        select sum(CE.EMCO_MONTO)
                            from EMPLEADO_CONCEPTOS CE, CONCEPTOS_NOMINA CN where CN.CONC_BENEFIC = 'S'
                            and (CE.TERC_NIT = :NITE) and (CE.CONC_COD = CN.CONC_COD) and
                            ((CE.EMCO_FECINI <= :FEC and CE.EMCO_FECFIN >= :FEC) or ((CN.CONC_TODOSPER = 'N')
                            and (CE.EMCO_PPAGO = :PERIODO)) or (CN.CONC_TODOSPER = 'S'))
                            into :BENEFICIOS;
                        if (BENEFICIOS is null) then
                            BENEFICIOS = 0;
                        end
                    else
                        BENEFICIOS = 0;
                    if ((CONC_COD <> 929) and (CONC_COD <> 930) and (CONC_COD <> 944)) then
                        begin
                        select P.PAAN_AUXTR, P.PAAN_SALMINIMO from PARAMETROS_ANO P where P.PAAN_ANO = :ANO
                            into :AUXTRANS, :SMLV;
                        if (:BASICO < (:SMLV*2)) then
                            AUXTRANS = (:AUXTRANS / 30) * :DIASLAB;
                        else
                            AUXTRANS = 0;
                        end
                    else
                        AUXTRANS = 0;
                    CONC_MONTO = :BASICO;
                    if (CONC_PORC <> 0 and CONC_PORC is not null) then
                        VALOR = (((:CONC_MONTO)+ :CAMBSALTRANS + :INCAP + :RECARGO + :AUXTRANS + :BENEFICIOS) * :CONC_PORC) /100;
                    else
                        if (PORCEN <> 0 and PORCEN is not null) then
                            VALOR = (((:CONC_MONTO)+ :CAMBSALTRANS + :INCAP + :RECARGO + :AUXTRANS + :BENEFICIOS) * :PORCEN) /100;
                        else
                            if (MONTOS <> 0 and MONTOS is not null) then
                                VALOR = :MONTOS;
                            else
                                if (CONC_MONTO <> 0 and CONC_MONTO is not null) then
                                    VALOR = :CONC_MONTO;
                    ITEM = :ITEM + 1;
                    end /* provision */
                else if (CONC_COD = 920) then /* comisiones */
                    begin
                    select C.NCOM_MONTO from NOMINA_COMISIONES C where C.NCOM_ANO = :ANO and C.NCOM_PERIODO = :PERIODO and C.NCOM_PERIODICIDAD = :PERIODICIDAD and C.TERC_NIT = :NITE into :VALOR;
                    if (VALOR is null) then
                    VALOR = 0;
                    ITEM = :ITEM + 1;
                    end
                else if (CONC_COD = 900 or (:CONC_COD = 931)) then /* horas extra */
                    begin
                    select C.NOEX_MONTO from NOMINA_HORASEXT C where C.NOEX_ANO = :ANO and
                        C.NOEX_PERIODIO = :PERIODO and C.NOEX_PERIODICIDAD = :PERIODICIDAD and C.TERC_NIT = :NITE into :VALOR;
                    if (VALOR is null) then
                        VALOR = 0;
                    ITEM = :ITEM + 1;
                    end
                else if (CONC_COD = 954) then /* cartera */
                    begin
                    select C.NCAR_MONTO from NOMINA_CARTERA C where C.NCAR_ANO = :ANO and C.NCAR_PERIODO = :PERIODO and C.NCAR_PERIODICIDAD = :PERIODICIDAD and C.TERC_NIT = :NITE into :VALOR;
                    if (VALOR is null) then
                        VALOR = 0;
                    ITEM = :ITEM + 1;
                    end
                else if (CONC_COD = 932) then
                    begin
                    /* incapacidad */
                    select N.NONO_DURA from NOMINA_NOVEDADES N where N.TERC_NIT = :NITE and N.NONO_PERIODO = :PERIODO and N.NONO_ANO = :ANO and (N.TNOV_COD = 2 or (N.TNOV_COD = 3)) into :DIASNOV;
                    if (:DIASNOV is null) then
                        VALOR = 0;
                    else
                        VALOR = (:BASICO / 30)* :DIASNOV;
                    end
                else if (CONC_COD = 921) then
                    begin
                    if (PORCEN is not null and PORCEN <> 0) then
                        VALOR = ((BASICO / 30)* :DIASLAB ) * :PORCEN /100;
                    else
                        if (CONC_PORC is not null and CONC_PORC <> 0) then
                            VALOR = ((BASICO / 30)* :DIASLAB ) * :CONC_PORC /100;
                    end
                else if (CONC_COD = 953) then
                    begin
                    /* RECARGO */
                    BASICO = BASICOEMP;
                    VALOR = (((:BASICO/30)/8)*:TAR_RECNOTC)*:RECNOCT;
                    VALOR = :VALOR + ((((:BASICO/30)/8)*:TAR_RECFEST)*:RECFEST);
                    end
                if (CONC_APORTE = 'S') then
                    begin
                    if (ENTIDAD is null or (ENTIDAD = '') ) then
                        ENTIDAD = :CONC_ENTIDAD;
                    end
                end
            if ((VALOR <> 0) and (VALOR is not null)) then
                begin
                execute procedure REDONDEE(:VALOR, :APROX) returning_values (VALOR);
                if ((MENSUAL = 'N') or (PERIODICIDAD = 1))  then
                    insert into NOMINA_CONCEPTOS (NOMI_ID, NOCO_ITEM, CONC_COD,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, NOCO_GTOEMPR)
                        values (:IDNOMINA,:ITEM, :CONCEPT, :NIT_TERCERO, :VALOR, :ENTIDAD, :CONC_DEDUC, :CONC_PROV, :CONC_APORTE, :PERIODO, :ANO, :CONC_MODIFI, :CONC_APLICAPROM, :SALARIO, :GTOEMPR);
                else
                    if (MENSUAL = 'S') then
                        begin
                        if ((:PERIODICIDAD = 2) and (LIQUIDAPER = 1)) then
                            begin
                            if ((PERIODO = 1) or (PERIODO = 3) or (PERIODO = 5) or (PERIODO = 7) or (PERIODO = 9) or (PERIODO = 11)
                                or (PERIODO = 13) or (PERIODO = 15) or (PERIODO = 17) or (PERIODO = 19) or (PERIODO = 21) or (PERIODO = 23)) then
                                insert into NOMINA_CONCEPTOS (NOMI_ID, NOCO_ITEM, CONC_COD,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, NOCO_GTOEMPR)
                                    values (:IDNOMINA,:ITEM, :CONCEPT, :NIT_TERCERO, :VALOR, :ENTIDAD, :CONC_DEDUC, :CONC_PROV, :CONC_APORTE, :PERIODO, :ANO, :CONC_MODIFI, :CONC_APLICAPROM, :SALARIO, :GTOEMPR);
                            end
                        else if ((:PERIODICIDAD = 2) and (LIQUIDAPER = 2)) then
                            begin
                            if ((PERIODO = 2) or (PERIODO = 4) or (PERIODO = 6) or (PERIODO = 8) or (PERIODO = 10) or (PERIODO = 12)
                                or (PERIODO = 14) or (PERIODO = 16) or (PERIODO = 18) or (PERIODO = 20) or (PERIODO = 22) or (PERIODO = 24)) then
                                insert into NOMINA_CONCEPTOS (NOMI_ID, NOCO_ITEM, CONC_COD,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, NOCO_GTOEMPR)
                                    values (:IDNOMINA,:ITEM, :CONCEPT, :NIT_TERCERO, :VALOR, :ENTIDAD, :CONC_DEDUC, :CONC_PROV, :CONC_APORTE, :PERIODO, :ANO, :CONC_MODIFI, :CONC_APLICAPROM, :SALARIO, :GTOEMPR);
                            end
                        else if ((:PERIODICIDAD = 3) and (LIQUIDAPER = 1)) then
                            begin
                            if ((PERIODO = 1) or (PERIODO = 5) or (PERIODO = 9) or (PERIODO = 13) or (PERIODO = 17) or (PERIODO = 21)
                                or (PERIODO = 25) or (PERIODO = 29) or (PERIODO = 33) or (PERIODO = 37) or (PERIODO = 41) or (PERIODO = 45)
                                or (PERIODO = 49)) then
                                insert into NOMINA_CONCEPTOS (NOMI_ID, NOCO_ITEM, CONC_COD,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, NOCO_GTOEMPR)
                                    values (:IDNOMINA,:ITEM, :CONCEPT, :NIT_TERCERO, :VALOR, :ENTIDAD, :CONC_DEDUC, :CONC_PROV, :CONC_APORTE, :PERIODO, :ANO, :CONC_MODIFI, :CONC_APLICAPROM, :SALARIO, :GTOEMPR);
                            end
                        else if ((:PERIODICIDAD = 3) and (LIQUIDAPER = 2)) then
                            begin
                            if ((PERIODO = 2) or (PERIODO = 6) or (PERIODO = 10) or (PERIODO = 14) or (PERIODO = 18) or (PERIODO = 22)
                                or (PERIODO = 26) or (PERIODO = 30) or (PERIODO = 34) or (PERIODO = 38) or (PERIODO = 42) or (PERIODO = 46)
                                or (PERIODO = 50)) then
                                insert into NOMINA_CONCEPTOS (NOMI_ID, NOCO_ITEM, CONC_COD,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, NOCO_GTOEMPR)
                                    values (:IDNOMINA,:ITEM, :CONCEPT, :NIT_TERCERO, :VALOR, :ENTIDAD, :CONC_DEDUC, :CONC_PROV, :CONC_APORTE, :PERIODO, :ANO, :CONC_MODIFI, :CONC_APLICAPROM, :SALARIO, :GTOEMPR);
                            end
                        else if ((:PERIODICIDAD = 3) and (LIQUIDAPER = 3)) then
                            begin
                            if ((PERIODO = 3) or (PERIODO = 7) or (PERIODO = 11) or (PERIODO = 15) or (PERIODO = 19) or (PERIODO = 23)
                                or (PERIODO = 27) or (PERIODO = 31) or (PERIODO = 35) or (PERIODO = 39) or (PERIODO = 43) or (PERIODO = 47)
                                or (PERIODO = 51)) then
                                insert into NOMINA_CONCEPTOS (NOMI_ID, NOCO_ITEM, CONC_COD,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, NOCO_GTOEMPR)
                                    values (:IDNOMINA,:ITEM, :CONCEPT, :NIT_TERCERO, :VALOR, :ENTIDAD, :CONC_DEDUC, :CONC_PROV, :CONC_APORTE, :PERIODO, :ANO, :CONC_MODIFI, :CONC_APLICAPROM, :SALARIO, :GTOEMPR);
                            end
                        else if ((:PERIODICIDAD = 3) and (LIQUIDAPER = 4)) then
                            begin
                            if ((PERIODO = 4) or (PERIODO = 8) or (PERIODO = 12) or (PERIODO = 16) or (PERIODO = 20) or (PERIODO = 24)
                                or (PERIODO = 29) or (PERIODO = 32) or (PERIODO = 36) or (PERIODO = 40) or (PERIODO = 44) or (PERIODO = 48)
                                or (PERIODO = 52)) then
                                insert into NOMINA_CONCEPTOS (NOMI_ID, NOCO_ITEM, CONC_COD,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, NOCO_GTOEMPR)
                                    values (:IDNOMINA,:ITEM, :CONCEPT, :NIT_TERCERO, :VALOR, :ENTIDAD, :CONC_DEDUC, :CONC_PROV, :CONC_APORTE, :PERIODO, :ANO, :CONC_MODIFI, :CONC_APLICAPROM, :SALARIO, :GTOEMPR);
                            end
                        end
                    VALOR = 0;
                    BASICO = 0;
                    end
            end /* for */
        end
    end
suspend;
end
^

SET TERM ; ^


UPDATE REVISION SET REVI_NOMINA = '2010/06/16' ;
COMMIT WORK;

/* 20100629: tome fecha de ingreso como fecha inicial del salario historico al crearlo */

SET TERM ^ ;

CREATE OR ALTER TRIGGER EMPLEADOS_BI FOR EMPLEADOS
ACTIVE BEFORE INSERT POSITION 0
as
begin
if (NEW.stco_cod IS NULL) then
    NEW.stco_cod = 0;
if (NEW.empl_fecing IS NULL) then
    NEW.empl_fecing = CAST('now' AS DATE);
end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER EMPLEADOS_AI FOR EMPLEADOS
ACTIVE AFTER INSERT POSITION 0
AS
BEGIN
INSERT INTO program_vacaciones (TERC_NIT) VALUES (NEW.terc_nit);
if (new.empl_fecing is not null) then
    INSERT INTO MOVIMIENTO_SALARIO_EMPLEADO (mvse_id,terc_nit,mvse_fecha,mvse_salario)
        VALUES(GEN_ID(id_movsalempl,1),NEW.terc_nit,new.empl_fecing,NEW.empl_salario);
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER EMPLEADOS_AU FOR EMPLEADOS
ACTIVE AFTER UPDATE POSITION 0
AS
BEGIN
IF (OLD.empl_salario <> NEW.empl_salario) THEN
  INSERT INTO MOVIMIENTO_SALARIO_EMPLEADO (mvse_id,terc_nit,mvse_fecha,mvse_salario)
    VALUES(GEN_ID(id_movsalempl,1),OLD.terc_nit,CAST('now' AS DATE),NEW.empl_salario);
END
^

SET TERM ; ^


/* 20100629b: USE EL PERIODO, ANO Y DURACION DE LA TABLA NOMINA_NOVEDADES_DETALLE */

SET TERM ^ ;

CREATE OR ALTER procedure CAUSA_NOMINA (
    FEC date,
    PERIODO integer,
    PERIODICIDAD integer,
    PAGOGLOBAL char(1),
    ANO char(4),
    DEPTO integer)
returns (
    IDNOMINA integer,
    ITEMINI integer)
AS
declare variable ITEM integer;
declare variable NITE varchar(20) character set NONE;
declare variable NIT_TERCERO varchar(20);
declare variable CONCEPT integer;
declare variable MONTOS numeric(18,2);
declare variable PORCEN numeric(9,4);
declare variable ENTIDAD varchar(20);
declare variable CONC_COD integer;
declare variable CONC_DEDUC char(1);
declare variable CONC_PORC numeric(9,4);
declare variable CONC_ENTIDAD integer;
declare variable CONC_MONTO numeric(18,2);
declare variable CONC_MODIFI char(1);
declare variable CONC_PROMEDIO char(1);
declare variable VALOR numeric(18,2);
declare variable DIASLAB integer;
declare variable CONC_PROV char(1);
declare variable CONC_APORTE char(1);
declare variable NUMEROPROM integer;
declare variable CONC_APLICAPROM char(1);
declare variable PERINICIAL integer;
declare variable PERFINAL integer;
declare variable ANOINI integer;
declare variable ANOFIN integer;
declare variable CONC_DIAS char(1);
declare variable CONC_OTROCONC char(1);
declare variable CONC_CODOTROCONC integer;
declare variable ANOSUM integer;
declare variable SALARIO char(1) character set NONE;
declare variable LIQUIDAPER integer;
declare variable BASICO numeric(18,2);
declare variable NITEPS varchar(20);
declare variable NITAFC varchar(20);
declare variable NITAFP varchar(20);
declare variable NITCCF varchar(20);
declare variable GTOEMPR char(1);
declare variable COMISION numeric(18,2);
declare variable CAMBSALTRANS numeric(18,2);
declare variable SALDOSINI numeric(18,2);
declare variable DURANOV integer;
declare variable BASE numeric(18,2);
declare variable APROX integer;
declare variable MENSUAL char(1);
declare variable HORASEX numeric(18,2);
declare variable DIASNOV integer;
declare variable TOMASAL integer;
declare variable RETROACT numeric(18,2);
declare variable REEMBOLSO numeric(18,2);
declare variable INCAP numeric(18,2);
declare variable AUXTRANS numeric(18,2);
declare variable SMLV numeric(18,2);
declare variable BENEFICIOS numeric(18,2);
declare variable CONFIRMADO char(1);
declare variable RECNOCT numeric(18,2);
declare variable RECFEST numeric(18,2);
declare variable TAR_RECNOTC numeric(9,4);
declare variable TAR_RECFEST numeric(9,4);
declare variable RECARGO numeric(18,2);
declare variable BASICOREC numeric(18,2);
declare variable PARAMBENEF char(2);
declare variable VACACDISF numeric(18,2);
declare variable VALORPREDET numeric(18,2);
declare variable BASICOEMP numeric(18,2);
declare variable salinteg CHAR(1);
declare variable TAR_SALINTEG numeric(9,4);
begin
execute procedure LEE_CONFIGURACION('NOMINA','LIQUIDACION','TOMAR BENEFICIOS PARA CALCULAR PROVISIONES')returning_values(:PARAMBENEF);
execute procedure LEE_CONFIGURACION('NOMINA','GENERAL','REDONDEO AL MULTIPLO DE DIEZ EN TOTALES')returning_values(:APROX);
select N.NOMI_ID, N.NOMI_LIQOK from NOMINA N where N.NOMI_PERIODO = :PERIODO and N.NOMI_PERIODOCIDAD = :PERIODICIDAD
    and N.NOMI_ANO = :ANO into :IDNOMINA, :CONFIRMADO;
if (:IDNOMINA is null) then
    begin
    execute procedure CAMBIE_ID_NOMINA returning_values(:IDNOMINA);
    insert into NOMINA (NOMI_ID, NOMI_FECCAUSA, NOMI_PAGOGLOBAL, NOMI_PERIODOCIDAD, NOMI_PERIODO, NOMI_ANO, NOMI_LIQOK)
    values (:IDNOMINA, :FEC,:PAGOGLOBAL, :PERIODICIDAD, :PERIODO, :ANO, 'N');
    ITEM = 1;
    end
else
    begin
    select max(N.NOCO_ITEM) from NOMINA_CONCEPTOS N where N.NOMI_ID = :IDNOMINA
    into :ITEM;
    end
if ((CONFIRMADO = 'S') and (IDNOMINA is not null)) then
    begin
    IDNOMINA = 0;
    end
else
    begin
    insert into NOMINA_DEPARTAMENTO (NOMI_ID, NODP_DEPTO)values(:IDNOMINA,:DEPTO);
    select P.PAAN_RECNOC, P.PAAN_RECFEST, P.paan_salinteg from PARAMETROS_ANO P where P.PAAN_ANO = :ANO
        into :TAR_RECNOTC, :TAR_RECFEST, TAR_SALINTEG;
    ITEMINI = ITEM;
    for select E.TERC_NIT, E.EMPL_EPS, E.EMPL_AFC, E.EMPL_AFP, E.EMPL_CCF, E.empl_salinteg
        from EMPLEADOS E
        where E.EMPL_PPAGO = :PERIODICIDAD and ((E.EMPL_FECRET is null) or (E.EMPL_FECRET > :FEC)) and E.EMPL_FECING <= :FEC
        and ((:DEPTO = 0) or (e.empl_dpto = :DEPTO))
        into :NITE, :NITEPS, :NITAFC, :NITAFP, :NITCCF, :SALINTEG
        do
        begin
        select first 1 M.MVSE_SALARIO from MOVIMIENTO_SALARIO_EMPLEADO M where M.TERC_NIT = :NITE and M.MVSE_FECHA <= :FEC order by M.MVSE_FECHA desc into :BASICOEMP;
        BASICO = BASICOEMP;
        RECNOCT = null;
        RECFEST = null;
        select N.NOEX_RECNOCT, N.NOEX_RECFEST
            from NOMINA_HORASEXT N where N.NOEX_PERIODIO = :PERIODO and N.NOEX_ANO = :ANO and N.TERC_NIT = :NITE
            into :RECNOCT, :RECFEST;
        if (RECNOCT is null) then
            RECNOCT = 0;
        if (RECFEST is null) then
            RECFEST = 0;
        for select CE.TERC_NIT, CE.CONC_COD, CE.EMCO_MONTO, CE.EMCO_PORC, CE.EMPL_ENTIDAD, CE.EMCO_PERPROM, CE.EMCO_LUQUIDAPER, CE.EMCO_MENSUAL, CN.CONC_COD, CN.CONC_DEDUC,CN.CONC_PORC, CN.CONC_ENTIDAD, CN.CONC_MONTO,  CN.CONC_DIAS, CN.CONC_MODIFI,
            CN.CONC_PROMEDIO, CN.CONC_SALARIO, CN.CONC_PROV, CN.CONC_APORTE, CN.CONC_APLICAPROM, CN.CONC_OTROCONC, CN.CONC_CODOTROCONC, CN.CONC_GTOEMPR, CN.CONC_BASE, CE.EMCO_TOMSAL
            from EMPLEADO_CONCEPTOS CE, CONCEPTOS_NOMINA CN where (CE.CONC_COD = CN.CONC_COD) and (CE.TERC_NIT = :NITE) and
            ( ((CE.EMCO_FECINI <= :FEC and CE.EMCO_FECFIN >= :FEC)) or
            ((CN.CONC_TODOSPER = 'N') and (CE.EMCO_PPAGO = :PERIODO)) or ((CN.CONC_TODOSPER = 'S') AND (((:periodicidad = 1) AND (:PERIODO < 13)) or ((:periodicidad = 2) AND (:PERIODO < 25)))) )  order by (TERC_NIT )
            into :NIT_TERCERO, :CONCEPT,  :MONTOS, :PORCEN, :ENTIDAD, :NUMEROPROM, :LIQUIDAPER, :MENSUAL ,:CONC_COD, :CONC_DEDUC, :CONC_PORC,
            :CONC_ENTIDAD, :CONC_MONTO, :CONC_DIAS, :CONC_MODIFI,:CONC_PROMEDIO, :SALARIO,:CONC_PROV, :CONC_APORTE , :CONC_APLICAPROM, :CONC_OTROCONC, :CONC_CODOTROCONC, :GTOEMPR, :BASE, :TOMASAL
            do
            begin
            if (CONC_DIAS = 'S') then
                execute procedure DIAS_LABORADOS (:NITE, :PERIODO, :FEC, :MENSUAL,:CONC_APORTE) returning_values (:DIASLAB);
            else
                DIASLAB = 15;
            if (:TOMASAL <> 0) then
                begin
                /* SI EL CONCEPTO NOAPLICA EN ESTE PERIODO DEJE EL BASICO EN CERO */
                if ((:PERIODICIDAD = 2) and (:TOMASAL <> 2)) then
                    begin
                    if ((PERIODO = 2) or (PERIODO = 4) or (PERIODO = 6) or (PERIODO = 8) or (PERIODO = 10) or (PERIODO = 12)
                        or (PERIODO = 14) or (PERIODO = 16) or (PERIODO = 18) or (PERIODO = 20) or (PERIODO = 22) or (PERIODO = 24)) then
                        BASICO = 0;
                    end
                else
                    if ((:PERIODICIDAD = 3) and (:TOMASAL <> 1)) then
                        begin
                        if ((PERIODO = 1) or (PERIODO = 5) or (PERIODO = 9) or (PERIODO = 13) or (PERIODO = 17) or (PERIODO = 21)
                            or (PERIODO = 25) or (PERIODO = 29) or (PERIODO = 33) or (PERIODO = 37) or (PERIODO = 41) or (PERIODO = 45)
                            or (PERIODO = 49)) then
                            BASICO = 0;
                        end
                    else
                        if ((:PERIODICIDAD = 3) and (:TOMASAL <> 2)) then
                            begin
                            if ((PERIODO = 2) or (PERIODO = 6) or (PERIODO = 10) or (PERIODO = 14) or (PERIODO = 18) or (PERIODO = 22)
                                or (PERIODO = 26) or (PERIODO = 30) or (PERIODO = 34) or (PERIODO = 38) or (PERIODO = 42) or (PERIODO = 46)
                                or (PERIODO = 50)) then
                                BASICO = 0;
                            end
                        else
                            if ((:PERIODICIDAD = 3) and (:TOMASAL <> 3)) then
                                begin
                                if ((PERIODO = 3) or (PERIODO = 7) or (PERIODO = 11) or (PERIODO = 15) or (PERIODO = 19) or (PERIODO = 23)
                                    or (PERIODO = 27) or (PERIODO = 31) or (PERIODO = 35) or (PERIODO = 39) or (PERIODO = 43) or (PERIODO = 47)
                                    or (PERIODO = 51)) then
                                    BASICO = 0;
                                end
                            else
                                if ((:PERIODICIDAD = 3) and (:TOMASAL <> 4)) then
                                begin
                                if ((PERIODO = 4) or (PERIODO = 8) or (PERIODO = 12) or (PERIODO = 16) or (PERIODO = 20) or (PERIODO = 24)
                                    or (PERIODO = 29) or (PERIODO = 32) or (PERIODO = 36) or (PERIODO = 40) or (PERIODO = 44) or (PERIODO = 48)
                                    or (PERIODO = 52)) then
                                    BASICO = 0;
                                end
                end
            else
                begin
                /* SE CALCULA SOBRE TODOS LOS PERIODOS */
                BASICO = BASICOEMP;
                end
            VALORPREDET = null;
            select VP.NVPR_MONTO from NOMINA_VALOR_PREDET VP where VP.NVPR_PERIODICIDAD = :PERIODICIDAD and VP.NVPR_PERIODO = :PERIODO and VP.NVPR_ANO = :ANO and VP.CONC_COD = :CONC_COD and VP.TERC_NIT = :NITE
                into :VALORPREDET;
            if ((:VALORPREDET <> 0) and (VALORPREDET is not null)) then
                VALOR = VALORPREDET;
            else
                begin
                /* SI HAY UN CAMBIO TRANSITORIO DE SALARIO AJUSTE LOS DIAS Y CALCULE EL VALOR A SUMAR */
                select ((N.NONO_VALOR /30) * ND.NNDE_DURACION), (ND.NNDE_DURACION) from NOMINA_NOVEDADES N, nomina_novedades_detalle ND
                    where N.nono_id = ND.nono_id AND N.TNOV_COD = 11 and N.TERC_NIT = :NITE and ND.NNDE_PERIODO = :PERIODO
                    into :CAMBSALTRANS, :DURANOV;
                if (CAMBSALTRANS is null) then
                    CAMBSALTRANS = 0;
                if (DURANOV is null) then
                    DURANOV = 0;
                DIASLAB = :DIASLAB - :DURANOV;
                /* SI ES UN PRESTAMO, TRAIGA LA CUOTA */
                if (CONC_COD = 922) then
                    begin
                    select sum(P.PRCU_MONTO) from PRESTAMO_CUOTAS P, PRESTAMO_NOMINA PN
                        where P.PRCU_ANO = :ANO and P.PRCU_PERIODO = :PERIODO and PN.PRNO_ID = P.PRNO_ID and PN.TERC_NIT = :NITE into :VALOR;
                    if (VALOR is null) then
                        VALOR = 0;
                    ITEM = :ITEM + 1;
                    /* MARQUE LA CUOTA COMO PAGADA */
                    update PRESTAMO_CUOTAS  P set PRCU_OK = 'S' where P.PRCU_ANO = :ANO and P.PRCU_PERIODO = :PERIODO and P.PRNO_ID = (select PN.PRNO_ID from PRESTAMO_NOMINA PN where PN.TERC_NIT = :NITE);
                    end
                else
                    if ((:MONTOS = 0) or (:MONTOS is null)) then
                        begin
                        /* SI EL CONCEPTO DEL EMPLEADO NO TIENE MONTO TRAIGA EL DE CONCEPTOS_NOMINA */
                        if ((CONC_PORC = 0 and :PORCEN = 0) or (CONC_PORC is null and :PORCEN = 0) or (CONC_PORC = 0 and :PORCEN is null) or (CONC_PORC is null and :PORCEN is null) ) then
                            begin
                            /* SIN PORCENTAJE */
                            if ((CONC_MONTO <> 0) and (CONC_MONTO is not null) ) then
                                begin
                                VALOR = :CONC_MONTO;
                                if (:CONC_DIAS = 'S') then
                                    VALOR = (:VALOR / 30) * :DIASLAB;
                                end
                            else
                                if (SALARIO = 'S' and CONC_COD <> 900 and CONC_COD <> 920 and CONC_COD <> 932 and CONC_COD <> 953) then
                                    begin
                                    /* SI ES SALARIO SUME LAS EXTRAS */
                                    BASICO = BASICOEMP;
                                    /*BASICO = ((:BASICO/30)*:DIASLAB) - (((:BASICO/30)/8)*:RECNOCT);/* PFP:DEBERIA SER + Y POR LA TARIFA QUE NO VEO POR NINGUN LADO
                                    BASICO = :BASICO - (((:BASICO/30)/8)*:RECFEST);*/
                                    CONC_MONTO = :BASICO;
                                    VALOR = (:CONC_MONTO/*/30 * :diaslab*/ ) + :CAMBSALTRANS;
                                    end
                                else
                                    begin
                                    VALOR = MONTOS;
                                    if (:CONC_DIAS = 'S') then
                                        VALOR = (:VALOR / 30) * :DIASLAB;
                                    end
                            end
                        else    
                            begin
                            if (:PORCEN <> 0) then
                                begin
                                /* SI TIENE PORCENTAJE EN EMPLEADO_CONCEPTOS PERO EL MONTO SE TRAE DE CONCPETOS_NOMINA */
                                if ((CONC_MONTO <> 0) and (CONC_MONTO is not null) ) then
                                    begin
                                    VALOR = ((:CONC_MONTO ) * :PORCEN) /100;
                                    end
                                end
                            else
                                begin
                                /* NO TIENE PORCENTAJE EN EMPLEADO_CONCEPTOS SE TRAE MONTO Y PORC DE CONCPETOS_NOMINA */
                                if ((CONC_MONTO <> 0) and (CONC_MONTO is not null) ) then
                                    begin
                                    VALOR = ((:CONC_MONTO) * :CONC_PORC) /100;
                                    end
                                else
                                    if (SALARIO = 'S' and CONC_COD <> 900 and CONC_COD <> 920 and CONC_COD <> 932 and CONC_COD <> 953) then
                                        begin
                                        BASICO = BASICOEMP;
                                        /*BASICO = ((:BASICO/30)*:DIASLAB) - (((:BASICO/30)/8)*:RECNOCT);
                                        BASICO = :BASICO - (((:BASICO/30)/8)*:RECFEST);*/
                                        CONC_MONTO = :BASICO;
                                        VALOR = ((:CONC_MONTO)+ :CAMBSALTRANS * :CONC_PORC) /100;
                                        end
                                    else
                                        if (:CONC_MONTO = 0 and :MONTOS = 0) then
                                            begin
                                            CONC_MONTO = :BASICO;
                                            VALOR = (((:CONC_MONTO / 30) * :DIASLAB) + :CAMBSALTRANS * :CONC_PORC) /100;
                                            end
                                end
                            end
                        end
                    else
                        /* SI TIENE MONTO EN EMPLEADO_CONCEPTOS */
                        if ((CONC_PORC = 0 or (CONC_PORC is null)) and (:PORCEN = 0 or (PORCEN is null))) then
                            begin
                            VALOR = (:MONTOS);
                            if (:CONC_DIAS = 'S') then
                                VALOR = (:VALOR / 30) * :DIASLAB;   
                            end
                        else
                            if (:PORCEN <> 0 and PORCEN is not null) then
                                begin
                                VALOR = ((:MONTOS ) * :PORCEN) /100;
                                end
                            else
                                begin
                                VALOR = ((:MONTOS) * :CONC_PORC) /100;
                                end
                if (CONC_PROMEDIO = 'S') then
                    begin
                    /* CALCULO DEL PROMEDIO BASE DESDE LA FECHA MENOS EL NUMERO DE PERIODOS */
                    EXECUTE PROCEDURE periodo_nom_fecha (:fec, :periodicidad) returning_values (:perfinal, :anofin);
                    if (perfinal < numeroprom) then
                        BEGIN
                        anoini = anofin - 1;
                        if (periodicidad = 1) then
                            perinicial = 12 - (numeroprom - perfinal) + 1;
                        if (periodicidad = 2) then
                            perinicial = 24 - (numeroprom - perfinal) + 1;
                        if (periodicidad = 3) then
                            perinicial = 52 - (numeroprom - perfinal) + 1;
                        END
                    ELSE
                        PERINICIAL = :perfinal - :NUMEROPROM;
                    if (anoini <> anofin) then
                        select sum (NOCO_VALOR) from NOMINA_CONCEPTOS N where N.NOCO_APLICAPROM = 'S' and
                            ((N.NOCO_PERIODO >= :PERINICIAL and N.NOCO_ANO = :anoini) or
                            (N.NOCO_PERIODO <= :perfinal and N.NOCO_ANO = :anofin)) and TERC_NIT = :NITE into :VALOR;
                    else
                        select sum (NOCO_VALOR) from NOMINA_CONCEPTOS N where N.NOCO_APLICAPROM = 'S' and
                            N.NOCO_PERIODO >= :PERINICIAL and N.NOCO_ANO = :anoini
                            and N.NOCO_PERIODO <= :perfinal and TERC_NIT = :NITE into :VALOR;
                    /* sume el saldo inicial */
                    SALDOSINI = 0;
                    select NOCO_VALOR from NOMINA_CONCEPTOS where CONC_COD = :CONC_COD and TERC_NIT  = :NITE and NOCO_PAGOOK = 'N' and NOCO_PERIODO = 0 into :SALDOSINI;
                    if (SALDOSINI is null) then
                        SALDOSINI = 0;
                    else
                        update NOMINA_CONCEPTOS N set NOCO_PAGOOK = 'S' where N.NOCO_APLICAPROM = 'S' and
                            CONC_COD = :CONC_COD and TERC_NIT = :NITE and NOCO_PERIODO = 0;

                    VALOR = :VALOR + :SALDOSINI;
                    /* APLIQUE LA PROPORCION Y EL PORCENTAJE */
                    VALOR = VALOR / NUMEROPROM;
                    VALOR = VALOR * PORCEN / 100;
                    end
                else if (CONC_OTROCONC = 'S') then
                    begin
                    ANOSUM = cast(ANO as integer);
                    ANOSUM = ANOSUM - 1;
                    select sum (NOCO_VALOR) from NOMINA_CONCEPTOS N where N.NOCO_ANO = :ANOSUM and N.CONC_COD = :CONC_CODOTROCONC and N.TERC_NIT = :NITE into :VALOR;
                    select NOCO_VALOR from NOMINA_CONCEPTOS where NOCO_ANO = :ANOSUM and CONC_COD = :CONC_CODOTROCONC and TERC_NIT = :NITE and NOCO_PERIODO = 0 into :SALDOSINI;
                    if (SALDOSINI is null) then
                        SALDOSINI = 0;
                    else
                        update NOMINA_CONCEPTOS set NOCO_PAGOOK = 'S' where NOCO_ANO = :ANOSUM and CONC_COD = :CONC_CODOTROCONC and NOCO_PERIODO = 0 and TERC_NIT = :NITE;
                    VALOR = :VALOR + :SALDOSINI;
                    update NOMINA_CONCEPTOS set NOCO_PAGOOK = 'S' where NOCO_ANO = :ANOSUM and CONC_COD = :CONC_CODOTROCONC and TERC_NIT = :NITE;
                    end
                else if (CONC_APORTE = 'S') then
                    begin
                    HORASEX = null;
                    DIASNOV = null;
                    RETROACT = null;
                    REEMBOLSO = null;
                    BENEFICIOS = null;
                    RECARGO = null;
                    COMISION = null;
                    INCAP = null;
                    VACACDISF = null;
                    if ((:ENTIDAD = '' ) or (ENTIDAD is null)) then
                        begin
                        /*COMISIONES*/
                        select C.NCOM_MONTO from NOMINA_COMISIONES C where C.NCOM_ANO = :ANO
                            and C.NCOM_PERIODO = :PERIODO and C.NCOM_PERIODICIDAD = :PERIODICIDAD and C.TERC_NIT = :NITE
                            into :COMISION;
                        if (COMISION is null) then
                            COMISION = 0;
                        /*RETROACTIVO*/
                        select C.EMCO_MONTO from EMPLEADO_CONCEPTOS C where C.TERC_NIT = :NITE
                            and C.CONC_COD = 933 into :RETROACT;
                            if (RETROACT is null ) then
                                RETROACT = 0;
                        /*REEMBOLSO*/
                        select C.EMCO_MONTO from EMPLEADO_CONCEPTOS C where C.TERC_NIT = :NITE
                            and C.CONC_COD = 952 into :REEMBOLSO;
                        if (REEMBOLSO is null ) then
                            REEMBOLSO = 0;
                        /*VACACIONES DISFRUTADAS ANTERIORMENTE*/
                        select C.EMCO_MONTO from EMPLEADO_CONCEPTOS C where C.TERC_NIT = :NITE
                            and C.CONC_COD = 955 into :VACACDISF;
                        if (VACACDISF is null ) then
                            VACACDISF = 0;
                        /* INCAPACIDAD*/
                        select ND.NNDE_DURACION from NOMINA_NOVEDADES N, nomina_novedades_detalle ND
                            where N.nono_id = ND.nono_id AND N.TERC_NIT = :NITE
                            and ND.NNDE_PERIODO = :PERIODO and ND.NNDE_ANO = :ANO and (N.TNOV_COD = 2 or (N.TNOV_COD = 3))
                            into :DIASNOV;
                        if (:DIASNOV is null) then
                            INCAP = 0;
                        else
                            INCAP = (:BASICO / 30)* :DIASNOV;
                        /*BASICO*/
                        if (SALINTEG = 'S') then
                            BASICO = BASICO * (tar_salinteg / 100);
                        BASICO = ((:BASICO/30)*:DIASLAB);/* - (((:BASICO/30)/8)*:RECNOCT);
                        BASICO = :BASICO - (((:BASICO/30)/8)*:RECFEST);*/
                        /*HORAS EXTRA*/
                        select C.NOEX_MONTO from NOMINA_HORASEXT C where C.NOEX_ANO = :ANO
                            and C.NOEX_PERIODIO = :PERIODO and C.NOEX_PERIODICIDAD = :PERIODICIDAD and C.TERC_NIT = :NITE
                            into :HORASEX;
                        if (HORASEX is null) then
                            HORASEX = 0;
                        /*RECARGOS*/
                        BASICOREC = BASICOEMP;
                        RECARGO = (((:BASICOREC/30)/8)*:TAR_RECNOTC)*:RECNOCT;
                        RECARGO = :RECARGO + ((((:BASICOREC/30)/8)*:TAR_RECFEST)*:RECFEST);
                        if (RECARGO is null) then
                            RECARGO = 0;
                        /*basico*/
                        if (:BASICO + :COMISION + :HORASEX + :RETROACT+ :REEMBOLSO + :INCAP+ :CAMBSALTRANS < ((:SMLV/30)*:DIASLAB)) then
                            BASICO = (:SMLV/30)*:DIASLAB;
                        /* SMLV Y AUX. TRANSPORTE*/
                        select P.PAAN_AUXTR, P.PAAN_SALMINIMO from PARAMETROS_ANO P
                            where P.PAAN_ANO = :ANO into :AUXTRANS, :SMLV;
                        /*BASE*/
                        VALOR = :BASICO + :COMISION + :HORASEX + :RETROACT+ :REEMBOLSO + :INCAP + :RECARGO + :CAMBSALTRANS + :VACACDISF;
                        if (CONC_COD = 904) then
                            begin
                            ENTIDAD = :NITAFP;
                            select A.PAAN_AFPTR from PARAMETROS_ANO A where A.PAAN_ANO = :ANO into :PORCEN;
                            VALOR = ((:VALOR) * :PORCEN) /100;
                            end
                        else if ((CONC_COD = 905) or (CONC_COD = 906) or (CONC_COD = 934) ) then
                            begin
                            ENTIDAD = :NITAFP;
                            select A.PAAN_AFPEM from PARAMETROS_ANO A where A.PAAN_ANO = :ANO into :PORCEN;
                            VALOR = ((:VALOR) * :PORCEN) /100;
                            end
                        else if ((CONC_COD = 907) or (CONC_COD = 914) or (CONC_COD = 915) or (conc_cod = 938)) then
                            begin
                            ENTIDAD = :NITEPS;
                            if (CONC_COD = 907) then
                                begin
                                select A.PAAN_EPSTR from PARAMETROS_ANO A where A.PAAN_ANO = :ANO into :PORCEN;
                                VALOR = ((:VALOR) * :PORCEN) /100;
                                end
                            else
                                begin
                                select A.PAAN_EPSEM from PARAMETROS_ANO A where A.PAAN_ANO = :ANO into :PORCEN;
                                    VALOR = ((:VALOR) * :PORCEN) /100;
                                end
                            end
                        else if ((CONC_COD = 910) or (CONC_COD = 911) or (CONC_COD = 936)) then
                            begin
                            /*ccf */
                            ENTIDAD = :NITCCF;
                            select A.PAAN_CCF from PARAMETROS_ANO A where A.PAAN_ANO = :ANO into :PORCEN;
                            VALOR = ((:VALOR) * :PORCEN) /100;
                            end
                        else if ((CONC_COD = 916) or (CONC_COD = 917) or (CONC_COD = 939) ) then
                            begin
                            /*icbf */
                            ENTIDAD = :NITCCF;
                            select A.PAAN_ICBF from PARAMETROS_ANO A where A.PAAN_ANO = :ANO into :PORCEN;
                            VALOR = ((:VALOR) * :PORCEN) /100;
                            end
                        else if ((CONC_COD = 918) or (CONC_COD = 919) or (CONC_COD = 940) ) then
                            begin
                            /*sena */
                            ENTIDAD = :NITCCF;
                            select A.PAAN_SENA from PARAMETROS_ANO A where A.PAAN_ANO = :ANO into :PORCEN;
                            VALOR = ((:VALOR) * :PORCEN) /100;
                            end
                        else if ((CONC_COD = 912) or (CONC_COD = 913) or (CONC_COD = 937)) then
                            begin
                            /* CESANTIAS */
                            ENTIDAD = :NITAFC;
                            if (PARAMBENEF = 'SI') then
                                begin
                                select sum(CE.EMCO_MONTO)
                                    from EMPLEADO_CONCEPTOS CE, CONCEPTOS_NOMINA CN where CN.CONC_BENEFIC = 'S' and (CE.TERC_NIT = :NITE) and (CE.CONC_COD = CN.CONC_COD) and
                                    ((CE.EMCO_FECINI <= :FEC and CE.EMCO_FECFIN >= :FEC) or ((CN.CONC_TODOSPER = 'N') and (CE.EMCO_PPAGO = :PERIODO)) or
                                    (CN.CONC_TODOSPER = 'S'))
                                    into :BENEFICIOS;
                                if (BENEFICIOS is null) then
                                    BENEFICIOS = 0;
                                end
                            else
                                BENEFICIOS = 0;
                            select P.PAAN_AUXTR, P.PAAN_SALMINIMO from PARAMETROS_ANO P
                                where P.PAAN_ANO = :ANO into :AUXTRANS, :SMLV;
                            if (:BASICO < (:SMLV*2)) then
                                AUXTRANS = (:AUXTRANS / 30) * :DIASLAB;
                            else
                                AUXTRANS = 0;
                            select A.PAAN_CESEMP from PARAMETROS_ANO A where A.PAAN_ANO = :ANO
                                into :PORCEN;
                            VALOR = ((:VALOR + :AUXTRANS + :BENEFICIOS) * :PORCEN) /100;
                            end
                        else
                            begin
                            if (COMISION is null) then
                                COMISION = 0;
                            select C.NCOM_MONTO from NOMINA_COMISIONES C where C.NCOM_ANO = :ANO and C.NCOM_PERIODO = :PERIODO and C.NCOM_PERIODICIDAD = :PERIODICIDAD and C.TERC_NIT = :NITE
                                into :COMISION;
                            CONC_MONTO = :BASICO + :COMISION;
                            if (CONC_PORC <> 0 and CONC_PORC is not null) then
                                VALOR = (((:CONC_MONTO/30 * :DIASLAB )+ :CAMBSALTRANS + :INCAP) * :CONC_PORC) /100;
                            else
                                if (:PORCEN <> 0 and :PORCEN is not null) then
                                    VALOR = (((:CONC_MONTO/30 * :DIASLAB )+ :CAMBSALTRANS + :INCAP) * :PORCEN) /100;
                                else
                                    if (:MONTOS <> 0 and :MONTOS is not null) then
                                        VALOR = :MONTOS;
                                    else
                                        if (:CONC_MONTO <> 0 and :CONC_MONTO is not null) then
                                            VALOR = :CONC_MONTO;
                            end
                        ITEM = :ITEM + 1;
                        end
                    end /* aportes */
                else if (CONC_PROV = 'S') then
                    begin
                    /*provisiones */
                    HORASEX = null;
                    DIASNOV = null;
                    RETROACT = null;
                    REEMBOLSO = null;
                    BENEFICIOS = null;
                    RECARGO = null;
                    COMISION = null;
                    INCAP = null;
                    /* RECARGO*/
                    BASICO = BASICOEMP;
                    RECARGO = (((:BASICO/30)/8)*:TAR_RECNOTC)*:RECNOCT;
                    RECARGO = :RECARGO + ((((:BASICO/30)/8)*:TAR_RECFEST)*:RECFEST);
                    /*INCAPACIDAD*/
                    select ND.NNDE_DURACION from NOMINA_NOVEDADES N, nomina_novedades_detalle ND
                        where N.nono_id = ND.nono_id AND N.TERC_NIT = :NITE and ND.NNDE_PERIODO = :PERIODO and ND.NNDE_ANO = :ANO
                        and (N.TNOV_COD = 2 or (N.TNOV_COD = 3)) into :DIASNOV;
                    if (:DIASNOV is null) then
                        INCAP = 0;
                    else
                        INCAP = (:BASICO / 30)* :DIASNOV;
                    /* BASICO*/
                    BASICO = ((:BASICO/30)*:DIASLAB);/* - (((:BASICO/30)/8)*:RECNOCT);
                    BASICO = :BASICO - (((:BASICO/30)/8)*:RECFEST);*/
                    if (SALINTEG = 'S') then
                        BASICO = BASICO * (tar_salinteg / 100);
                    /*BENEFICIOS*/
                    if (PARAMBENEF = 'SI') then
                        begin
                        select sum(CE.EMCO_MONTO)
                            from EMPLEADO_CONCEPTOS CE, CONCEPTOS_NOMINA CN where CN.CONC_BENEFIC = 'S'
                            and (CE.TERC_NIT = :NITE) and (CE.CONC_COD = CN.CONC_COD) and
                            ((CE.EMCO_FECINI <= :FEC and CE.EMCO_FECFIN >= :FEC) or ((CN.CONC_TODOSPER = 'N')
                            and (CE.EMCO_PPAGO = :PERIODO)) or (CN.CONC_TODOSPER = 'S'))
                            into :BENEFICIOS;
                        if (BENEFICIOS is null) then
                            BENEFICIOS = 0;
                        end
                    else
                        BENEFICIOS = 0;
                    if ((CONC_COD <> 929) and (CONC_COD <> 930) and (CONC_COD <> 944)) then
                        begin
                        select P.PAAN_AUXTR, P.PAAN_SALMINIMO from PARAMETROS_ANO P where P.PAAN_ANO = :ANO
                            into :AUXTRANS, :SMLV;
                        if (:BASICO < (:SMLV*2)) then
                            AUXTRANS = (:AUXTRANS / 30) * :DIASLAB;
                        else
                            AUXTRANS = 0;
                        end
                    else
                        AUXTRANS = 0;
                    CONC_MONTO = :BASICO;
                    if (CONC_PORC <> 0 and CONC_PORC is not null) then
                        VALOR = (((:CONC_MONTO)+ :CAMBSALTRANS + :INCAP + :RECARGO + :AUXTRANS + :BENEFICIOS) * :CONC_PORC) /100;
                    else
                        if (PORCEN <> 0 and PORCEN is not null) then
                            VALOR = (((:CONC_MONTO)+ :CAMBSALTRANS + :INCAP + :RECARGO + :AUXTRANS + :BENEFICIOS) * :PORCEN) /100;
                        else
                            if (MONTOS <> 0 and MONTOS is not null) then
                                VALOR = :MONTOS;
                            else
                                if (CONC_MONTO <> 0 and CONC_MONTO is not null) then
                                    VALOR = :CONC_MONTO;
                    ITEM = :ITEM + 1;
                    end /* provision */
                else if (CONC_COD = 920) then /* comisiones */
                    begin
                    select C.NCOM_MONTO from NOMINA_COMISIONES C where C.NCOM_ANO = :ANO and C.NCOM_PERIODO = :PERIODO and C.NCOM_PERIODICIDAD = :PERIODICIDAD and C.TERC_NIT = :NITE into :VALOR;
                    if (VALOR is null) then
                    VALOR = 0;
                    ITEM = :ITEM + 1;
                    end
                else if (CONC_COD = 900 or (:CONC_COD = 931)) then /* horas extra */
                    begin
                    select C.NOEX_MONTO from NOMINA_HORASEXT C where C.NOEX_ANO = :ANO and
                        C.NOEX_PERIODIO = :PERIODO and C.NOEX_PERIODICIDAD = :PERIODICIDAD and C.TERC_NIT = :NITE into :VALOR;
                    if (VALOR is null) then
                        VALOR = 0;
                    ITEM = :ITEM + 1;
                    end
                else if (CONC_COD = 954) then /* cartera */
                    begin
                    select C.NCAR_MONTO from NOMINA_CARTERA C where C.NCAR_ANO = :ANO and C.NCAR_PERIODO = :PERIODO and C.NCAR_PERIODICIDAD = :PERIODICIDAD and C.TERC_NIT = :NITE into :VALOR;
                    if (VALOR is null) then
                        VALOR = 0;
                    ITEM = :ITEM + 1;
                    end
                else if (CONC_COD = 932) then
                    begin
                    /* incapacidad */
                    select ND.NNDE_DURACION from NOMINA_NOVEDADES N, nomina_novedades_detalle ND
                        where N.nono_id = ND.nono_id AND N.TERC_NIT = :NITE and ND.NNDE_PERIODO = :PERIODO and ND.NNDE_ANO = :ANO
                        and (N.TNOV_COD = 2 or (N.TNOV_COD = 3)) into :DIASNOV;
                    if (:DIASNOV is null) then
                        VALOR = 0;
                    else
                        VALOR = (:BASICO / 30)* :DIASNOV;
                    end
                else if (CONC_COD = 921) then
                    begin
                    if (PORCEN is not null and PORCEN <> 0) then
                        VALOR = ((BASICO / 30)* :DIASLAB ) * :PORCEN /100;
                    else
                        if (CONC_PORC is not null and CONC_PORC <> 0) then
                            VALOR = ((BASICO / 30)* :DIASLAB ) * :CONC_PORC /100;
                    end
                else if (CONC_COD = 953) then
                    begin
                    /* RECARGO */
                    BASICO = BASICOEMP;
                    VALOR = (((:BASICO/30)/8)*:TAR_RECNOTC)*:RECNOCT;
                    VALOR = :VALOR + ((((:BASICO/30)/8)*:TAR_RECFEST)*:RECFEST);
                    end
                if (CONC_APORTE = 'S') then
                    begin
                    if (ENTIDAD is null or (ENTIDAD = '') ) then
                        ENTIDAD = :CONC_ENTIDAD;
                    end
                end
            if ((VALOR <> 0) and (VALOR is not null)) then
                begin
                execute procedure REDONDEE(:VALOR, :APROX) returning_values (VALOR);
                if ((MENSUAL = 'N') or (PERIODICIDAD = 1))  then
                    insert into NOMINA_CONCEPTOS (NOMI_ID, NOCO_ITEM, CONC_COD,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, NOCO_GTOEMPR)
                        values (:IDNOMINA,:ITEM, :CONCEPT, :NIT_TERCERO, :VALOR, :ENTIDAD, :CONC_DEDUC, :CONC_PROV, :CONC_APORTE, :PERIODO, :ANO, :CONC_MODIFI, :CONC_APLICAPROM, :SALARIO, :GTOEMPR);
                else
                    if (MENSUAL = 'S') then
                        begin
                        if ((:PERIODICIDAD = 2) and (LIQUIDAPER = 1)) then
                            begin
                            if ((PERIODO = 1) or (PERIODO = 3) or (PERIODO = 5) or (PERIODO = 7) or (PERIODO = 9) or (PERIODO = 11)
                                or (PERIODO = 13) or (PERIODO = 15) or (PERIODO = 17) or (PERIODO = 19) or (PERIODO = 21) or (PERIODO = 23)) then
                                insert into NOMINA_CONCEPTOS (NOMI_ID, NOCO_ITEM, CONC_COD,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, NOCO_GTOEMPR)
                                    values (:IDNOMINA,:ITEM, :CONCEPT, :NIT_TERCERO, :VALOR, :ENTIDAD, :CONC_DEDUC, :CONC_PROV, :CONC_APORTE, :PERIODO, :ANO, :CONC_MODIFI, :CONC_APLICAPROM, :SALARIO, :GTOEMPR);
                            end
                        else if ((:PERIODICIDAD = 2) and (LIQUIDAPER = 2)) then
                            begin
                            if ((PERIODO = 2) or (PERIODO = 4) or (PERIODO = 6) or (PERIODO = 8) or (PERIODO = 10) or (PERIODO = 12)
                                or (PERIODO = 14) or (PERIODO = 16) or (PERIODO = 18) or (PERIODO = 20) or (PERIODO = 22) or (PERIODO = 24)) then
                                insert into NOMINA_CONCEPTOS (NOMI_ID, NOCO_ITEM, CONC_COD,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, NOCO_GTOEMPR)
                                    values (:IDNOMINA,:ITEM, :CONCEPT, :NIT_TERCERO, :VALOR, :ENTIDAD, :CONC_DEDUC, :CONC_PROV, :CONC_APORTE, :PERIODO, :ANO, :CONC_MODIFI, :CONC_APLICAPROM, :SALARIO, :GTOEMPR);
                            end
                        else if ((:PERIODICIDAD = 3) and (LIQUIDAPER = 1)) then
                            begin
                            if ((PERIODO = 1) or (PERIODO = 5) or (PERIODO = 9) or (PERIODO = 13) or (PERIODO = 17) or (PERIODO = 21)
                                or (PERIODO = 25) or (PERIODO = 29) or (PERIODO = 33) or (PERIODO = 37) or (PERIODO = 41) or (PERIODO = 45)
                                or (PERIODO = 49)) then
                                insert into NOMINA_CONCEPTOS (NOMI_ID, NOCO_ITEM, CONC_COD,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, NOCO_GTOEMPR)
                                    values (:IDNOMINA,:ITEM, :CONCEPT, :NIT_TERCERO, :VALOR, :ENTIDAD, :CONC_DEDUC, :CONC_PROV, :CONC_APORTE, :PERIODO, :ANO, :CONC_MODIFI, :CONC_APLICAPROM, :SALARIO, :GTOEMPR);
                            end
                        else if ((:PERIODICIDAD = 3) and (LIQUIDAPER = 2)) then
                            begin
                            if ((PERIODO = 2) or (PERIODO = 6) or (PERIODO = 10) or (PERIODO = 14) or (PERIODO = 18) or (PERIODO = 22)
                                or (PERIODO = 26) or (PERIODO = 30) or (PERIODO = 34) or (PERIODO = 38) or (PERIODO = 42) or (PERIODO = 46)
                                or (PERIODO = 50)) then
                                insert into NOMINA_CONCEPTOS (NOMI_ID, NOCO_ITEM, CONC_COD,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, NOCO_GTOEMPR)
                                    values (:IDNOMINA,:ITEM, :CONCEPT, :NIT_TERCERO, :VALOR, :ENTIDAD, :CONC_DEDUC, :CONC_PROV, :CONC_APORTE, :PERIODO, :ANO, :CONC_MODIFI, :CONC_APLICAPROM, :SALARIO, :GTOEMPR);
                            end
                        else if ((:PERIODICIDAD = 3) and (LIQUIDAPER = 3)) then
                            begin
                            if ((PERIODO = 3) or (PERIODO = 7) or (PERIODO = 11) or (PERIODO = 15) or (PERIODO = 19) or (PERIODO = 23)
                                or (PERIODO = 27) or (PERIODO = 31) or (PERIODO = 35) or (PERIODO = 39) or (PERIODO = 43) or (PERIODO = 47)
                                or (PERIODO = 51)) then
                                insert into NOMINA_CONCEPTOS (NOMI_ID, NOCO_ITEM, CONC_COD,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, NOCO_GTOEMPR)
                                    values (:IDNOMINA,:ITEM, :CONCEPT, :NIT_TERCERO, :VALOR, :ENTIDAD, :CONC_DEDUC, :CONC_PROV, :CONC_APORTE, :PERIODO, :ANO, :CONC_MODIFI, :CONC_APLICAPROM, :SALARIO, :GTOEMPR);
                            end
                        else if ((:PERIODICIDAD = 3) and (LIQUIDAPER = 4)) then
                            begin
                            if ((PERIODO = 4) or (PERIODO = 8) or (PERIODO = 12) or (PERIODO = 16) or (PERIODO = 20) or (PERIODO = 24)
                                or (PERIODO = 29) or (PERIODO = 32) or (PERIODO = 36) or (PERIODO = 40) or (PERIODO = 44) or (PERIODO = 48)
                                or (PERIODO = 52)) then
                                insert into NOMINA_CONCEPTOS (NOMI_ID, NOCO_ITEM, CONC_COD,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, NOCO_GTOEMPR)
                                    values (:IDNOMINA,:ITEM, :CONCEPT, :NIT_TERCERO, :VALOR, :ENTIDAD, :CONC_DEDUC, :CONC_PROV, :CONC_APORTE, :PERIODO, :ANO, :CONC_MODIFI, :CONC_APLICAPROM, :SALARIO, :GTOEMPR);
                            end
                        end
                    VALOR = 0;
                    BASICO = 0;
                    end
            end /* for */
        end
    end
suspend;
end
^

SET TERM ; ^

/* 20100630 */
SET TERM ^ ;

CREATE OR ALTER procedure DIAS_LABORADOS (
    NITEMPL varchar(20),
    PERIODO integer,
    FEC date,
    MENSUAL char(1),
    APORTE char(1))
returns (
    TOTALDIASLAB integer)
AS
declare variable diasnolab integer;
declare variable diaslabxper integer;
declare variable perpago integer;
declare variable fecing date;
declare variable diasfec integer;
declare variable diasing integer;
declare variable existe char(1);
BEGIN
SELECT E.empl_ppago, E.empl_fecing
FROM EMPLEADOS E WHERE TERC_NIT = :nitempl
INTO :perpago, :fecing;
IF (mensual = 'N') THEN
    BEGIN
    IF (perpago = 1) THEN
        diaslabxper = 30;
    ELSE
        IF (perpago = 2) THEN
            diaslabxper = 15;
        ELSE
            IF (perpago = 3) THEN
                diaslabxper = 7;
    END
ELSE
    diaslabxper = 30;
if (perpago = 2) then
    BEGIN
    IF (SUBSTR(fecing,1,7) = SUBSTR(FEC,1,7)) THEN
        BEGIN
        diasfec = CAST(substr(fec,9,10) AS INTEGER);
        diasing = CAST(substr(fecing,9,10) AS INTEGER);
        diaslabxper = (diasfec - diasing)+1;
        IF ((diaslabxper > 15) AND (perpago = 2)) THEN
            diaslabxper = 15;
        END
    END
ELSE
    if (perpago = 1) then
        BEGIN
        IF (SUBSTR(fecing,1,7) = SUBSTR(FEC,1,7)) THEN
            BEGIN
            diasfec = CAST(substr(fec,9,10) AS INTEGER);
            diasing = CAST(substr(fecing,9,10) AS INTEGER);
            diaslabxper = (diasfec - diasing)+1;
            IF ((diaslabxper > 30) AND (perpago = 1)) THEN
                diaslabxper = 30;
            END
        END
IF (mensual = 'S') THEN
    BEGIN
    SELECT MAX('S') FROM nomina_novedades WHERE TERC_NIT = :nitempl AND (TNOV_COD = 9 or (tnov_cod = 2) or (tnov_cod = 3)) AND ((NONO_PERIODO = :periodo) or (NONO_PERIODO = :periodo - 1)) AND NONO_ANO = substr(:fec,1,4)
        INTO :existe;
    IF ((aporte = 'N' ) OR (:existe = 'S'))  THEN
        BEGIN
        SELECT SUM (NONO_DURA)
            FROM nomina_novedades WHERE TERC_NIT = :nitempl AND (TNOV_COD = 9 OR (TNOV_COD = 6) OR (TNOV_COD = 2) OR (TNOV_COD =3) OR (TNOV_COD = 4)  ) AND ((NONO_PERIODO = :periodo) or (NONO_PERIODO = :periodo - 1)) AND NONO_ANO  = substr(:FEC,1,4)
            INTO :diasnolab;
        if (diasnolab IS NULL) then
            diasnolab = 0;
        diaslabxper =  :diaslabxper - :diasnolab;
        END
    if (diaslabxper IS NOT NULL) then
        totaldiaslab =  :diaslabxper;
    ELSE
        totaldiaslab = 0;
    SUSPEND;
    END
ELSE
    BEGIN
    SELECT MAX('S') FROM nomina_novedades WHERE TERC_NIT = :nitempl AND (TNOV_COD = 9 or (tnov_cod = 2) or (tnov_cod = 3) or (tnov_cod = 6)) AND NONO_PERIODO = :periodo AND NONO_ANO  = substr(:FEC,1,4)
        INTO :existe;
    IF ((aporte = 'N' ) OR (:existe = 'S'))  THEN
        BEGIN
        SELECT SUM (NONO_DURA)
            FROM nomina_novedades WHERE TERC_NIT = :nitempl AND (TNOV_COD = 9 OR (TNOV_COD = 6) OR (TNOV_COD = 2) OR (TNOV_COD =3) OR (TNOV_COD = 4)  ) AND NONO_PERIODO = :periodo AND NONO_ANO  = substr(:FEC,1,4)
            INTO :diasnolab;
        if (diasnolab IS NULL) then
            diasnolab = 0;
        diaslabxper =  :diaslabxper - :diasnolab;
        END
    if (diaslabxper IS NOT NULL) then
        totaldiaslab =  :diaslabxper;
    ELSE
        totaldiaslab = 0;
    SUSPEND;
    END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure CAUSA_NOMINA (
    FEC date,
    PERIODO integer,
    PERIODICIDAD integer,
    PAGOGLOBAL char(1),
    ANO char(4),
    DEPTO integer)
returns (
    IDNOMINA integer,
    ITEMINI integer)
AS
declare variable ITEM integer;
declare variable NITE varchar(20) character set NONE;
declare variable NIT_TERCERO varchar(20);
declare variable CONCEPT integer;
declare variable MONTOS numeric(18,2);
declare variable PORCEN numeric(9,4);
declare variable ENTIDAD varchar(20);
declare variable CONC_COD integer;
declare variable CONC_DEDUC char(1);
declare variable CONC_PORC numeric(9,4);
declare variable CONC_ENTIDAD integer;
declare variable CONC_MONTO numeric(18,2);
declare variable CONC_MODIFI char(1);
declare variable CONC_PROMEDIO char(1);
declare variable VALOR numeric(18,2);
declare variable DIASLAB integer;
declare variable CONC_PROV char(1);
declare variable CONC_APORTE char(1);
declare variable NUMEROPROM integer;
declare variable CONC_APLICAPROM char(1);
declare variable PERINICIAL integer;
declare variable PERFINAL integer;
declare variable ANOINI integer;
declare variable ANOFIN integer;
declare variable CONC_DIAS char(1);
declare variable CONC_OTROCONC char(1);
declare variable CONC_CODOTROCONC integer;
declare variable ANOSUM integer;
declare variable SALARIO char(1) character set NONE;
declare variable LIQUIDAPER integer;
declare variable BASICO numeric(18,2);
declare variable NITEPS varchar(20);
declare variable NITAFC varchar(20);
declare variable NITAFP varchar(20);
declare variable NITCCF varchar(20);
declare variable GTOEMPR char(1);
declare variable COMISION numeric(18,2);
declare variable CAMBSALTRANS numeric(18,2);
declare variable SALDOSINI numeric(18,2);
declare variable DURANOV integer;
declare variable BASE numeric(18,2);
declare variable APROX integer;
declare variable MENSUAL char(1);
declare variable HORASEX numeric(18,2);
declare variable DIASNOV integer;
declare variable TOMASAL integer;
declare variable RETROACT numeric(18,2);
declare variable REEMBOLSO numeric(18,2);
declare variable INCAP numeric(18,2);
declare variable AUXTRANS numeric(18,2);
declare variable SMLV numeric(18,2);
declare variable BENEFICIOS numeric(18,2);
declare variable CONFIRMADO char(1);
declare variable RECNOCT numeric(18,2);
declare variable RECFEST numeric(18,2);
declare variable TAR_RECNOTC numeric(9,4);
declare variable TAR_RECFEST numeric(9,4);
declare variable RECARGO numeric(18,2);
declare variable BASICOREC numeric(18,2);
declare variable PARAMBENEF char(2);
declare variable VACACDISF numeric(18,2);
declare variable VALORPREDET numeric(18,2);
declare variable BASICOEMP numeric(18,2);
declare variable salinteg CHAR(1);
declare variable TAR_SALINTEG numeric(9,4);
begin
execute procedure LEE_CONFIGURACION('NOMINA','LIQUIDACION','TOMAR BENEFICIOS PARA CALCULAR PROVISIONES')returning_values(:PARAMBENEF);
execute procedure LEE_CONFIGURACION('NOMINA','GENERAL','REDONDEO AL MULTIPLO DE DIEZ EN TOTALES')returning_values(:APROX);
select N.NOMI_ID, N.NOMI_LIQOK from NOMINA N where N.NOMI_PERIODO = :PERIODO and N.NOMI_PERIODOCIDAD = :PERIODICIDAD
    and N.NOMI_ANO = :ANO into :IDNOMINA, :CONFIRMADO;
if (:IDNOMINA is null) then
    begin
    execute procedure CAMBIE_ID_NOMINA returning_values(:IDNOMINA);
    insert into NOMINA (NOMI_ID, NOMI_FECCAUSA, NOMI_PAGOGLOBAL, NOMI_PERIODOCIDAD, NOMI_PERIODO, NOMI_ANO, NOMI_LIQOK)
    values (:IDNOMINA, :FEC,:PAGOGLOBAL, :PERIODICIDAD, :PERIODO, :ANO, 'N');
    ITEM = 1;
    end
else
    begin
    select max(N.NOCO_ITEM) from NOMINA_CONCEPTOS N where N.NOMI_ID = :IDNOMINA
    into :ITEM;
    end
if ((CONFIRMADO = 'S') and (IDNOMINA is not null)) then
    begin
    IDNOMINA = 0;
    end
else
    begin
    insert into NOMINA_DEPARTAMENTO (NOMI_ID, NODP_DEPTO)values(:IDNOMINA,:DEPTO);
    select P.PAAN_RECNOC, P.PAAN_RECFEST, P.paan_salinteg from PARAMETROS_ANO P where P.PAAN_ANO = :ANO
        into :TAR_RECNOTC, :TAR_RECFEST, TAR_SALINTEG;
    ITEMINI = ITEM;
    for select E.TERC_NIT, E.EMPL_EPS, E.EMPL_AFC, E.EMPL_AFP, E.EMPL_CCF, E.empl_salinteg
        from EMPLEADOS E
        where E.EMPL_PPAGO = :PERIODICIDAD and ((E.EMPL_FECRET is null) or (E.EMPL_FECRET > :FEC)) and E.EMPL_FECING <= :FEC
        and ((:DEPTO = 0) or (e.empl_dpto = :DEPTO))
        into :NITE, :NITEPS, :NITAFC, :NITAFP, :NITCCF, :SALINTEG
        do
        begin
        select first 1 M.MVSE_SALARIO from MOVIMIENTO_SALARIO_EMPLEADO M where M.TERC_NIT = :NITE and M.MVSE_FECHA <= :FEC order by M.MVSE_FECHA desc into :BASICOEMP;
        BASICO = BASICOEMP;
        RECNOCT = null;
        RECFEST = null;
        select N.NOEX_RECNOCT, N.NOEX_RECFEST
            from NOMINA_HORASEXT N where N.NOEX_PERIODIO = :PERIODO and N.NOEX_ANO = :ANO and N.TERC_NIT = :NITE
            into :RECNOCT, :RECFEST;
        if (RECNOCT is null) then
            RECNOCT = 0;
        if (RECFEST is null) then
            RECFEST = 0;
        for select CE.TERC_NIT, CE.CONC_COD, CE.EMCO_MONTO, CE.EMCO_PORC, CE.EMPL_ENTIDAD, CE.EMCO_PERPROM, CE.EMCO_LUQUIDAPER, CE.EMCO_MENSUAL, CN.CONC_COD, CN.CONC_DEDUC,CN.CONC_PORC, CN.CONC_ENTIDAD, CN.CONC_MONTO,  CN.CONC_DIAS, CN.CONC_MODIFI,
            CN.CONC_PROMEDIO, CN.CONC_SALARIO, CN.CONC_PROV, CN.CONC_APORTE, CN.CONC_APLICAPROM, CN.CONC_OTROCONC, CN.CONC_CODOTROCONC, CN.CONC_GTOEMPR, CN.CONC_BASE, CE.EMCO_TOMSAL
            from EMPLEADO_CONCEPTOS CE, CONCEPTOS_NOMINA CN where (CE.CONC_COD = CN.CONC_COD) and (CE.TERC_NIT = :NITE) and
            ( ((CE.EMCO_FECINI <= :FEC and CE.EMCO_FECFIN >= :FEC)) or
            ((CN.CONC_TODOSPER = 'N') and (CE.EMCO_PPAGO = :PERIODO)) or ((CN.CONC_TODOSPER = 'S') AND (((:periodicidad = 1) AND (:PERIODO < 13)) or ((:periodicidad = 2) AND (:PERIODO < 25)))) )  order by (TERC_NIT )
            into :NIT_TERCERO, :CONCEPT,  :MONTOS, :PORCEN, :ENTIDAD, :NUMEROPROM, :LIQUIDAPER, :MENSUAL ,:CONC_COD, :CONC_DEDUC, :CONC_PORC,
            :CONC_ENTIDAD, :CONC_MONTO, :CONC_DIAS, :CONC_MODIFI,:CONC_PROMEDIO, :SALARIO,:CONC_PROV, :CONC_APORTE , :CONC_APLICAPROM, :CONC_OTROCONC, :CONC_CODOTROCONC, :GTOEMPR, :BASE, :TOMASAL
            do
            begin
            if (CONC_DIAS = 'S') then
                execute procedure DIAS_LABORADOS (:NITE, :PERIODO, :FEC, :MENSUAL,:CONC_APORTE) returning_values (:DIASLAB);
            else
                BEGIN
                SELECT PPAG_DIAS FROM PERIODO_PAGO WHERE PPAG_COD = :periodicidad INTO :diaslab;
                END
            if (:TOMASAL <> 0) then
                begin
                /* SI EL CONCEPTO NOAPLICA EN ESTE PERIODO DEJE EL BASICO EN CERO */
                if ((:PERIODICIDAD = 2) and (:TOMASAL <> 2)) then
                    begin
                    if ((PERIODO = 2) or (PERIODO = 4) or (PERIODO = 6) or (PERIODO = 8) or (PERIODO = 10) or (PERIODO = 12)
                        or (PERIODO = 14) or (PERIODO = 16) or (PERIODO = 18) or (PERIODO = 20) or (PERIODO = 22) or (PERIODO = 24)) then
                        BASICO = 0;
                    end
                else
                    if ((:PERIODICIDAD = 3) and (:TOMASAL <> 1)) then
                        begin
                        if ((PERIODO = 1) or (PERIODO = 5) or (PERIODO = 9) or (PERIODO = 13) or (PERIODO = 17) or (PERIODO = 21)
                            or (PERIODO = 25) or (PERIODO = 29) or (PERIODO = 33) or (PERIODO = 37) or (PERIODO = 41) or (PERIODO = 45)
                            or (PERIODO = 49)) then
                            BASICO = 0;
                        end
                    else
                        if ((:PERIODICIDAD = 3) and (:TOMASAL <> 2)) then
                            begin
                            if ((PERIODO = 2) or (PERIODO = 6) or (PERIODO = 10) or (PERIODO = 14) or (PERIODO = 18) or (PERIODO = 22)
                                or (PERIODO = 26) or (PERIODO = 30) or (PERIODO = 34) or (PERIODO = 38) or (PERIODO = 42) or (PERIODO = 46)
                                or (PERIODO = 50)) then
                                BASICO = 0;
                            end
                        else
                            if ((:PERIODICIDAD = 3) and (:TOMASAL <> 3)) then
                                begin
                                if ((PERIODO = 3) or (PERIODO = 7) or (PERIODO = 11) or (PERIODO = 15) or (PERIODO = 19) or (PERIODO = 23)
                                    or (PERIODO = 27) or (PERIODO = 31) or (PERIODO = 35) or (PERIODO = 39) or (PERIODO = 43) or (PERIODO = 47)
                                    or (PERIODO = 51)) then
                                    BASICO = 0;
                                end
                            else
                                if ((:PERIODICIDAD = 3) and (:TOMASAL <> 4)) then
                                begin
                                if ((PERIODO = 4) or (PERIODO = 8) or (PERIODO = 12) or (PERIODO = 16) or (PERIODO = 20) or (PERIODO = 24)
                                    or (PERIODO = 29) or (PERIODO = 32) or (PERIODO = 36) or (PERIODO = 40) or (PERIODO = 44) or (PERIODO = 48)
                                    or (PERIODO = 52)) then
                                    BASICO = 0;
                                end
                end
            else
                begin
                /* SE CALCULA SOBRE TODOS LOS PERIODOS */
                BASICO = BASICOEMP;
                end
            VALORPREDET = null;
            select VP.NVPR_MONTO from NOMINA_VALOR_PREDET VP where VP.NVPR_PERIODICIDAD = :PERIODICIDAD and VP.NVPR_PERIODO = :PERIODO and VP.NVPR_ANO = :ANO and VP.CONC_COD = :CONC_COD and VP.TERC_NIT = :NITE
                into :VALORPREDET;
            if ((:VALORPREDET <> 0) and (VALORPREDET is not null)) then
                VALOR = VALORPREDET;
            else
                begin
                /* SI HAY UN CAMBIO TRANSITORIO DE SALARIO AJUSTE LOS DIAS Y CALCULE EL VALOR A SUMAR */
                select ((N.NONO_VALOR /30) * ND.NNDE_DURACION), (ND.NNDE_DURACION) from NOMINA_NOVEDADES N, nomina_novedades_detalle ND
                    where N.nono_id = ND.nono_id AND N.TNOV_COD = 11 and N.TERC_NIT = :NITE and ND.NNDE_PERIODO = :PERIODO
                    into :CAMBSALTRANS, :DURANOV;
                if (CAMBSALTRANS is null) then
                    CAMBSALTRANS = 0;
                if (DURANOV is null) then
                    DURANOV = 0;
                DIASLAB = :DIASLAB - :DURANOV;
                /* SI ES UN PRESTAMO, TRAIGA LA CUOTA */
                if (CONC_COD = 922) then
                    begin
                    select sum(P.PRCU_MONTO) from PRESTAMO_CUOTAS P, PRESTAMO_NOMINA PN
                        where P.PRCU_ANO = :ANO and P.PRCU_PERIODO = :PERIODO and PN.PRNO_ID = P.PRNO_ID and PN.TERC_NIT = :NITE into :VALOR;
                    if (VALOR is null) then
                        VALOR = 0;
                    ITEM = :ITEM + 1;
                    /* MARQUE LA CUOTA COMO PAGADA */
                    update PRESTAMO_CUOTAS  P set PRCU_OK = 'S' where P.PRCU_ANO = :ANO and P.PRCU_PERIODO = :PERIODO
                        and exists (select PRNO_ID from PRESTAMO_NOMINA where TERC_NIT = :NITE and PRNO_ID = P.prno_id);
                    end
                else
                    if ((:MONTOS = 0) or (:MONTOS is null)) then
                        begin
                        /* SI EL CONCEPTO DEL EMPLEADO NO TIENE MONTO TRAIGA EL DE CONCEPTOS_NOMINA */
                        if ((CONC_PORC = 0 and :PORCEN = 0) or (CONC_PORC is null and :PORCEN = 0) or (CONC_PORC = 0 and :PORCEN is null) or (CONC_PORC is null and :PORCEN is null) ) then
                            begin
                            /* SIN PORCENTAJE */
                            if ((CONC_MONTO <> 0) and (CONC_MONTO is not null) ) then
                                begin
                                VALOR = :CONC_MONTO;
                                if (:CONC_DIAS = 'S') then
                                    VALOR = (:VALOR / 30) * :DIASLAB;
                                end
                            else
                                if (SALARIO = 'S' and CONC_COD <> 900 and CONC_COD <> 920 and CONC_COD <> 932 and CONC_COD <> 953) then
                                    begin
                                    /* SI ES SALARIO SUME LAS EXTRAS */
                                    BASICO = BASICOEMP;
                                    BASICO = ((:BASICO/30)*:DIASLAB);/* - (((:BASICO/30)/8)*:RECNOCT);/* PFP:DEBERIA SER + Y POR LA TARIFA QUE NO VEO POR NINGUN LADO
                                    BASICO = :BASICO - (((:BASICO/30)/8)*:RECFEST);*/
                                    CONC_MONTO = :BASICO;
                                    VALOR = (:CONC_MONTO/*/30 * :diaslab*/ ) + :CAMBSALTRANS;
                                    end
                                else
                                    begin
                                    VALOR = MONTOS;
                                    if (:CONC_DIAS = 'S') then
                                        VALOR = (:VALOR / 30) * :DIASLAB;
                                    end
                            end
                        else    
                            begin
                            if (:PORCEN <> 0) then
                                begin
                                /* SI TIENE PORCENTAJE EN EMPLEADO_CONCEPTOS PERO EL MONTO SE TRAE DE CONCPETOS_NOMINA */
                                if ((CONC_MONTO <> 0) and (CONC_MONTO is not null) ) then
                                    begin
                                    VALOR = ((:CONC_MONTO ) * :PORCEN) /100;
                                    end
                                end
                            else
                                begin
                                /* NO TIENE PORCENTAJE EN EMPLEADO_CONCEPTOS SE TRAE MONTO Y PORC DE CONCPETOS_NOMINA */
                                if ((CONC_MONTO <> 0) and (CONC_MONTO is not null) ) then
                                    begin
                                    VALOR = ((:CONC_MONTO) * :CONC_PORC) /100;
                                    end
                                else
                                    if (SALARIO = 'S' and CONC_COD <> 900 and CONC_COD <> 920 and CONC_COD <> 932 and CONC_COD <> 953) then
                                        begin
                                        BASICO = BASICOEMP;
                                        BASICO = ((:BASICO/30)*:DIASLAB); /* - (((:BASICO/30)/8)*:RECNOCT);
                                        BASICO = :BASICO - (((:BASICO/30)/8)*:RECFEST);*/
                                        CONC_MONTO = :BASICO;
                                        VALOR = ((:CONC_MONTO)+ :CAMBSALTRANS * :CONC_PORC) /100;
                                        end
                                    else
                                        if (:CONC_MONTO = 0 and :MONTOS = 0) then
                                            begin
                                            CONC_MONTO = :BASICO;
                                            VALOR = (((:CONC_MONTO / 30) * :DIASLAB) + :CAMBSALTRANS * :CONC_PORC) /100;
                                            end
                                end
                            end
                        end
                    else
                        /* SI TIENE MONTO EN EMPLEADO_CONCEPTOS */
                        if ((CONC_PORC = 0 or (CONC_PORC is null)) and (:PORCEN = 0 or (PORCEN is null))) then
                            begin
                            VALOR = (:MONTOS);
                            if (:CONC_DIAS = 'S') then
                                VALOR = (:VALOR / 30) * :DIASLAB;   
                            end
                        else
                            if (:PORCEN <> 0 and PORCEN is not null) then
                                begin
                                VALOR = ((:MONTOS ) * :PORCEN) /100;
                                end
                            else
                                begin
                                VALOR = ((:MONTOS) * :CONC_PORC) /100;
                                end
                if (CONC_PROMEDIO = 'S') then
                    begin
                    /* CALCULO DEL PROMEDIO BASE DESDE LA FECHA MENOS EL NUMERO DE PERIODOS */
                    EXECUTE PROCEDURE periodo_nom_fecha (:fec, :periodicidad) returning_values (:perfinal, :anofin);
                    if (perfinal < numeroprom) then
                        BEGIN
                        anoini = anofin - 1;
                        if (periodicidad = 1) then
                            perinicial = 12 - (numeroprom - perfinal) + 1;
                        if (periodicidad = 2) then
                            perinicial = 24 - (numeroprom - perfinal) + 1;
                        if (periodicidad = 3) then
                            perinicial = 52 - (numeroprom - perfinal) + 1;
                        END
                    ELSE
                        BEGIN
                        PERINICIAL = :perfinal - :NUMEROPROM + 1;
                        anoini = ANOFIN;
                        END
                    if (anoini <> anofin) then
                        select sum (NOCO_VALOR) from NOMINA_CONCEPTOS N where N.NOCO_APLICAPROM = 'S' and
                            ((N.NOCO_PERIODO >= :PERINICIAL and N.NOCO_ANO = :anoini) or
                            (N.NOCO_PERIODO <= :perfinal and N.NOCO_ANO = :anofin)) and TERC_NIT = :NITE into :VALOR;
                    else
                        select sum (NOCO_VALOR) from NOMINA_CONCEPTOS N where N.NOCO_APLICAPROM = 'S' and
                            N.NOCO_PERIODO >= :PERINICIAL and N.NOCO_ANO = :anoini
                            and N.NOCO_PERIODO <= :perfinal and TERC_NIT = :NITE into :VALOR;
                    /* sume el saldo inicial */
                    SALDOSINI = 0;
                    select NOCO_VALOR from NOMINA_CONCEPTOS where CONC_COD = :CONC_COD and TERC_NIT  = :NITE and NOCO_PAGOOK = 'N' and NOCO_PERIODO = 0 into :SALDOSINI;
                    if (SALDOSINI is null) then
                        SALDOSINI = 0;
                    else
                        update NOMINA_CONCEPTOS N set NOCO_PAGOOK = 'S' where N.NOCO_APLICAPROM = 'S' and
                            CONC_COD = :CONC_COD and TERC_NIT = :NITE and NOCO_PERIODO = 0;

                    VALOR = :VALOR + :SALDOSINI;
                    /* APLIQUE LA PROPORCION Y EL PORCENTAJE */
                    VALOR = VALOR / NUMEROPROM;
                    VALOR = VALOR * PORCEN / 100;
                    end
                else if (CONC_OTROCONC = 'S') then
                    begin
                    ANOSUM = cast(ANO as integer);
                    ANOSUM = ANOSUM - 1;
                    select sum (NOCO_VALOR) from NOMINA_CONCEPTOS N where N.NOCO_ANO = :ANOSUM and N.CONC_COD = :CONC_CODOTROCONC and N.TERC_NIT = :NITE into :VALOR;
                    select NOCO_VALOR from NOMINA_CONCEPTOS where NOCO_ANO = :ANOSUM and CONC_COD = :CONC_CODOTROCONC and TERC_NIT = :NITE and NOCO_PERIODO = 0 into :SALDOSINI;
                    if (SALDOSINI is null) then
                        SALDOSINI = 0;
                    else
                        update NOMINA_CONCEPTOS set NOCO_PAGOOK = 'S' where NOCO_ANO = :ANOSUM and CONC_COD = :CONC_CODOTROCONC and NOCO_PERIODO = 0 and TERC_NIT = :NITE;
                    VALOR = :VALOR + :SALDOSINI;
                    update NOMINA_CONCEPTOS set NOCO_PAGOOK = 'S' where NOCO_ANO = :ANOSUM and CONC_COD = :CONC_CODOTROCONC and TERC_NIT = :NITE;
                    end
                else if (CONC_APORTE = 'S') then
                    begin
                    HORASEX = null;
                    DIASNOV = null;
                    RETROACT = null;
                    REEMBOLSO = null;
                    BENEFICIOS = null;
                    RECARGO = null;
                    COMISION = null;
                    INCAP = null;
                    VACACDISF = null;
                    if ((:ENTIDAD = '' ) or (ENTIDAD is null)) then
                        begin
                        /*COMISIONES*/
                        if (MENSUAL = 'S') then
                            BEGIN
                            if (PERIODICIDAD = 1) then
                                BEGIN
                                perinicial = PERIODO;
                                PERFINAL = PERIODO;
                                END
                            if (PERIODICIDAD = 2) then
                                BEGIN
                                perinicial = PERIODO - (LIQUIDAPER - 1);
                                PERFINAL = PERIODO + (2 - LIQUIDAPER);
                                END
                            if (PERIODICIDAD = 3) then
                                BEGIN
                                perinicial = PERIODO - (LIQUIDAPER - 1);
                                PERFINAL = PERIODO + (4 - LIQUIDAPER);
                                END
                            END
                        ELSE
                            BEGIN
                            perinicial = PERIODO;
                            PERFINAL = PERIODO;
                            END
                            
                        /* SUME LAS COMISIONES DE LOS DEMAS PERIODOS DEL MES */
                        select SUM(C.NCOM_MONTO) from NOMINA_COMISIONES C where C.NCOM_ANO = :ANO
                            and C.NCOM_PERIODO >= :PERINICIAL AND C.NCOM_PERIODO <= :PERFINAL
                            and C.NCOM_PERIODICIDAD = :PERIODICIDAD and C.TERC_NIT = :NITE
                            into :COMISION;
                        if (COMISION is null) then
                            COMISION = 0;
                        /*RETROACTIVO*/
                        select C.EMCO_MONTO from EMPLEADO_CONCEPTOS C where C.TERC_NIT = :NITE
                            and C.CONC_COD = 933 into :RETROACT;
                            if (RETROACT is null ) then
                                RETROACT = 0;
                        /*REEMBOLSO*/
                        select C.EMCO_MONTO from EMPLEADO_CONCEPTOS C where C.TERC_NIT = :NITE
                            and C.CONC_COD = 952 into :REEMBOLSO;
                        if (REEMBOLSO is null ) then
                            REEMBOLSO = 0;
                        /*VACACIONES DISFRUTADAS ANTERIORMENTE*/
                        select C.EMCO_MONTO from EMPLEADO_CONCEPTOS C where C.TERC_NIT = :NITE
                            and C.CONC_COD = 955 into :VACACDISF;
                        if (VACACDISF is null ) then
                            VACACDISF = 0;
                        /* INCAPACIDAD*/
                        select ND.NNDE_DURACION from NOMINA_NOVEDADES N, nomina_novedades_detalle ND
                            where N.nono_id = ND.nono_id AND N.TERC_NIT = :NITE
                            and ND.NNDE_PERIODO = :PERIODO and ND.NNDE_ANO = :ANO and (N.TNOV_COD = 2 or (N.TNOV_COD = 3))
                            into :DIASNOV;
                        if (:DIASNOV is null) then
                            INCAP = 0;
                        else
                            INCAP = (:BASICO / 30)* :DIASNOV;
                        /*BASICO*/
                        if (SALINTEG = 'S') then
                            BASICO = BASICO * (tar_salinteg / 100);
                        BASICO = ((:BASICO/30)*:DIASLAB);/* - (((:BASICO/30)/8)*:RECNOCT);
                        BASICO = :BASICO - (((:BASICO/30)/8)*:RECFEST);*/
                        /*HORAS EXTRA*/
                        select SUM(C.NOEX_MONTO) from NOMINA_HORASEXT C where C.NOEX_ANO = :ANO
                            and C.NOEX_PERIODIO >= :PERINICIAL and C.NOEX_PERIODIO <= :PERFINAL
                            and C.NOEX_PERIODICIDAD = :PERIODICIDAD and C.TERC_NIT = :NITE
                            into :HORASEX;
                        if (HORASEX is null) then
                            HORASEX = 0;
                        /*RECARGOS*/
                        BASICOREC = BASICOEMP;
                        RECARGO = (((:BASICOREC/30)/8)*:TAR_RECNOTC)*:RECNOCT;
                        RECARGO = :RECARGO + ((((:BASICOREC/30)/8)*:TAR_RECFEST)*:RECFEST);
                        if (RECARGO is null) then
                            RECARGO = 0;
                        /*basico*/
                        if (:BASICO + :COMISION + :HORASEX + :RETROACT+ :REEMBOLSO + :INCAP+ :CAMBSALTRANS < ((:SMLV/30)*:DIASLAB)) then
                            BASICO = (:SMLV/30)*:DIASLAB;
                        /* SMLV Y AUX. TRANSPORTE*/
                        select P.PAAN_AUXTR, P.PAAN_SALMINIMO from PARAMETROS_ANO P
                            where P.PAAN_ANO = :ANO into :AUXTRANS, :SMLV;
                        /*BASE*/
                        VALOR = :BASICO + :COMISION + :HORASEX + :RETROACT+ :REEMBOLSO + :INCAP + :RECARGO + :CAMBSALTRANS + :VACACDISF;

                        if (CONC_COD = 904) then
                            begin
                            ENTIDAD = :NITAFP;
                            select A.PAAN_AFPTR from PARAMETROS_ANO A where A.PAAN_ANO = :ANO into :PORCEN;
                            VALOR = ((:VALOR) * :PORCEN) /100;
                            end
                        else if ((CONC_COD = 905) or (CONC_COD = 906) or (CONC_COD = 934) ) then
                            begin
                            ENTIDAD = :NITAFP;
                            select A.PAAN_AFPEM from PARAMETROS_ANO A where A.PAAN_ANO = :ANO into :PORCEN;
                            VALOR = ((:VALOR) * :PORCEN) /100;
                            end
                        else if ((CONC_COD = 907) or (CONC_COD = 914) or (CONC_COD = 915) or (conc_cod = 938)) then
                            begin
                            ENTIDAD = :NITEPS;
                            if (CONC_COD = 907) then
                                begin
                                select A.PAAN_EPSTR from PARAMETROS_ANO A where A.PAAN_ANO = :ANO into :PORCEN;
                                VALOR = ((:VALOR) * :PORCEN) /100;
                                end
                            else
                                begin
                                select A.PAAN_EPSEM from PARAMETROS_ANO A where A.PAAN_ANO = :ANO into :PORCEN;
                                    VALOR = ((:VALOR) * :PORCEN) /100;
                                end
                            end
                        else if ((CONC_COD = 910) or (CONC_COD = 911) or (CONC_COD = 936)) then
                            begin
                            /*ccf */
                            ENTIDAD = :NITCCF;
                            select A.PAAN_CCF from PARAMETROS_ANO A where A.PAAN_ANO = :ANO into :PORCEN;
                            VALOR = ((:VALOR) * :PORCEN) /100;
                            end
                        else if ((CONC_COD = 916) or (CONC_COD = 917) or (CONC_COD = 939) ) then
                            begin
                            /*icbf */
                            ENTIDAD = :NITCCF;
                            select A.PAAN_ICBF from PARAMETROS_ANO A where A.PAAN_ANO = :ANO into :PORCEN;
                            VALOR = ((:VALOR) * :PORCEN) /100;
                            end
                        else if ((CONC_COD = 918) or (CONC_COD = 919) or (CONC_COD = 940) ) then
                            begin
                            /*sena */
                            ENTIDAD = :NITCCF;
                            select A.PAAN_SENA from PARAMETROS_ANO A where A.PAAN_ANO = :ANO into :PORCEN;
                            VALOR = ((:VALOR) * :PORCEN) /100;
                            end
                        else if ((CONC_COD = 912) or (CONC_COD = 913) or (CONC_COD = 937)) then
                            begin
                            /* CESANTIAS */
                            ENTIDAD = :NITAFC;
                            if (PARAMBENEF = 'SI') then
                                begin
                                select sum(CE.EMCO_MONTO)
                                    from EMPLEADO_CONCEPTOS CE, CONCEPTOS_NOMINA CN where CN.CONC_BENEFIC = 'S' and (CE.TERC_NIT = :NITE) and (CE.CONC_COD = CN.CONC_COD) and
                                    ((CE.EMCO_FECINI <= :FEC and CE.EMCO_FECFIN >= :FEC) or ((CN.CONC_TODOSPER = 'N') and (CE.EMCO_PPAGO = :PERIODO)) or
                                    (CN.CONC_TODOSPER = 'S'))
                                    into :BENEFICIOS;
                                if (BENEFICIOS is null) then
                                    BENEFICIOS = 0;
                                end
                            else
                                BENEFICIOS = 0;
                            select P.PAAN_AUXTR, P.PAAN_SALMINIMO from PARAMETROS_ANO P
                                where P.PAAN_ANO = :ANO into :AUXTRANS, :SMLV;
                            if (:BASICO < (:SMLV*2)) then
                                AUXTRANS = (:AUXTRANS / 30) * :DIASLAB;
                            else
                                AUXTRANS = 0;
                            select A.PAAN_CESEMP from PARAMETROS_ANO A where A.PAAN_ANO = :ANO
                                into :PORCEN;
                            VALOR = ((:VALOR + :AUXTRANS + :BENEFICIOS) * :PORCEN) /100;
                            end
                        else
                            begin
                            if (COMISION is null) then
                                COMISION = 0;
                            select C.NCOM_MONTO from NOMINA_COMISIONES C where C.NCOM_ANO = :ANO and C.NCOM_PERIODO = :PERIODO and C.NCOM_PERIODICIDAD = :PERIODICIDAD and C.TERC_NIT = :NITE
                                into :COMISION;
                            CONC_MONTO = :BASICO + :COMISION;
                            if (CONC_PORC <> 0 and CONC_PORC is not null) then
                                VALOR = (((:CONC_MONTO/30 * :DIASLAB )+ :CAMBSALTRANS + :INCAP) * :CONC_PORC) /100;
                            else
                                if (:PORCEN <> 0 and :PORCEN is not null) then
                                    VALOR = (((:CONC_MONTO/30 * :DIASLAB )+ :CAMBSALTRANS + :INCAP) * :PORCEN) /100;
                                else
                                    if (:MONTOS <> 0 and :MONTOS is not null) then
                                        VALOR = :MONTOS;
                                    else
                                        if (:CONC_MONTO <> 0 and :CONC_MONTO is not null) then
                                            VALOR = :CONC_MONTO;
                            end
                        ITEM = :ITEM + 1;
                        end
                    end /* aportes */
                else if (CONC_PROV = 'S') then
                    begin
                    /*provisiones */
                    HORASEX = null;
                    DIASNOV = null;
                    RETROACT = null;
                    REEMBOLSO = null;
                    BENEFICIOS = null;
                    RECARGO = null;
                    COMISION = null;
                    INCAP = null;
                    /* RECARGO*/
                    BASICO = BASICOEMP;
                    RECARGO = (((:BASICO/30)/8)*:TAR_RECNOTC)*:RECNOCT;
                    RECARGO = :RECARGO + ((((:BASICO/30)/8)*:TAR_RECFEST)*:RECFEST);
                    /*INCAPACIDAD*/
                    select ND.NNDE_DURACION from NOMINA_NOVEDADES N, nomina_novedades_detalle ND
                        where N.nono_id = ND.nono_id AND N.TERC_NIT = :NITE and ND.NNDE_PERIODO = :PERIODO and ND.NNDE_ANO = :ANO
                        and (N.TNOV_COD = 2 or (N.TNOV_COD = 3)) into :DIASNOV;
                    if (:DIASNOV is null) then
                        INCAP = 0;
                    else
                        INCAP = (:BASICO / 30)* :DIASNOV;
                    /* BASICO*/
                    BASICO = ((:BASICO/30)*:DIASLAB);/* - (((:BASICO/30)/8)*:RECNOCT);
                    BASICO = :BASICO - (((:BASICO/30)/8)*:RECFEST);*/
                    if (SALINTEG = 'S') then
                        BASICO = BASICO * (tar_salinteg / 100);
                    /*BENEFICIOS*/
                    if (PARAMBENEF = 'SI') then
                        begin
                        select sum(CE.EMCO_MONTO)
                            from EMPLEADO_CONCEPTOS CE, CONCEPTOS_NOMINA CN where CN.CONC_BENEFIC = 'S'
                            and (CE.TERC_NIT = :NITE) and (CE.CONC_COD = CN.CONC_COD) and
                            ((CE.EMCO_FECINI <= :FEC and CE.EMCO_FECFIN >= :FEC) or ((CN.CONC_TODOSPER = 'N')
                            and (CE.EMCO_PPAGO = :PERIODO)) or (CN.CONC_TODOSPER = 'S'))
                            into :BENEFICIOS;
                        if (BENEFICIOS is null) then
                            BENEFICIOS = 0;
                        end
                    else
                        BENEFICIOS = 0;
                    if ((CONC_COD <> 929) and (CONC_COD <> 930) and (CONC_COD <> 944)) then
                        begin
                        select P.PAAN_AUXTR, P.PAAN_SALMINIMO from PARAMETROS_ANO P where P.PAAN_ANO = :ANO
                            into :AUXTRANS, :SMLV;
                        if (:BASICO < (:SMLV*2)) then
                            AUXTRANS = (:AUXTRANS / 30) * :DIASLAB;
                        else
                            AUXTRANS = 0;
                        end
                    else
                        AUXTRANS = 0;
                    CONC_MONTO = :BASICO;
                    if (CONC_PORC <> 0 and CONC_PORC is not null) then
                        VALOR = (((:CONC_MONTO)+ :CAMBSALTRANS + :INCAP + :RECARGO + :AUXTRANS + :BENEFICIOS) * :CONC_PORC) /100;
                    else
                        if (PORCEN <> 0 and PORCEN is not null) then
                            VALOR = (((:CONC_MONTO)+ :CAMBSALTRANS + :INCAP + :RECARGO + :AUXTRANS + :BENEFICIOS) * :PORCEN) /100;
                        else
                            if (MONTOS <> 0 and MONTOS is not null) then
                                VALOR = :MONTOS;
                            else
                                if (CONC_MONTO <> 0 and CONC_MONTO is not null) then
                                    VALOR = :CONC_MONTO;
                    ITEM = :ITEM + 1;
                    end /* provision */
                else if (CONC_COD = 920) then /* comisiones */
                    begin
                    select C.NCOM_MONTO from NOMINA_COMISIONES C where C.NCOM_ANO = :ANO and C.NCOM_PERIODO = :PERIODO and C.NCOM_PERIODICIDAD = :PERIODICIDAD and C.TERC_NIT = :NITE into :VALOR;
                    if (VALOR is null) then
                    VALOR = 0;
                    ITEM = :ITEM + 1;
                    end
                else if (CONC_COD = 900 or (:CONC_COD = 931)) then /* horas extra */
                    begin
                    select C.NOEX_MONTO from NOMINA_HORASEXT C where C.NOEX_ANO = :ANO and
                        C.NOEX_PERIODIO = :PERIODO and C.NOEX_PERIODICIDAD = :PERIODICIDAD and C.TERC_NIT = :NITE into :VALOR;
                    if (VALOR is null) then
                        VALOR = 0;
                    ITEM = :ITEM + 1;
                    end
                else if (CONC_COD = 954) then /* cartera */
                    begin
                    select C.NCAR_MONTO from NOMINA_CARTERA C where C.NCAR_ANO = :ANO and C.NCAR_PERIODO = :PERIODO and C.NCAR_PERIODICIDAD = :PERIODICIDAD and C.TERC_NIT = :NITE into :VALOR;
                    if (VALOR is null) then
                        VALOR = 0;
                    ITEM = :ITEM + 1;
                    end
                else if (CONC_COD = 932) then
                    begin
                    /* incapacidad */
                    select ND.NNDE_DURACION from NOMINA_NOVEDADES N, nomina_novedades_detalle ND
                        where N.nono_id = ND.nono_id AND N.TERC_NIT = :NITE and ND.NNDE_PERIODO = :PERIODO and ND.NNDE_ANO = :ANO
                        and (N.TNOV_COD = 2 or (N.TNOV_COD = 3)) into :DIASNOV;
                    if (:DIASNOV is null) then
                        VALOR = 0;
                    else
                        VALOR = (:BASICO / 30)* :DIASNOV;
                    end
                else if (CONC_COD = 921) then
                    begin
                    if (PORCEN is not null and PORCEN <> 0) then
                        VALOR = ((BASICO / 30)* :DIASLAB ) * :PORCEN /100;
                    else
                        if (CONC_PORC is not null and CONC_PORC <> 0) then
                            VALOR = ((BASICO / 30)* :DIASLAB ) * :CONC_PORC /100;
                    end
                else if (CONC_COD = 953) then
                    begin
                    /* RECARGO */
                    BASICO = BASICOEMP;
                    VALOR = (((:BASICO/30)/8)*:TAR_RECNOTC)*:RECNOCT;
                    VALOR = :VALOR + ((((:BASICO/30)/8)*:TAR_RECFEST)*:RECFEST);
                    end
                if (CONC_APORTE = 'S') then
                    begin
                    if (ENTIDAD is null or (ENTIDAD = '') ) then
                        ENTIDAD = :CONC_ENTIDAD;
                    end
                end
            if ((VALOR <> 0) and (VALOR is not null)) then
                begin
                execute procedure REDONDEE(:VALOR, :APROX) returning_values (VALOR);
                if ((MENSUAL = 'N') or (PERIODICIDAD = 1))  then
                    insert into NOMINA_CONCEPTOS (NOMI_ID, NOCO_ITEM, CONC_COD,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, NOCO_GTOEMPR)
                        values (:IDNOMINA,:ITEM, :CONCEPT, :NIT_TERCERO, :VALOR, :ENTIDAD, :CONC_DEDUC, :CONC_PROV, :CONC_APORTE, :PERIODO, :ANO, :CONC_MODIFI, :CONC_APLICAPROM, :SALARIO, :GTOEMPR);
                else
                    if (MENSUAL = 'S') then
                        begin
                        if ((:PERIODICIDAD = 2) and (LIQUIDAPER = 1)) then
                            begin
                            if ((PERIODO = 1) or (PERIODO = 3) or (PERIODO = 5) or (PERIODO = 7) or (PERIODO = 9) or (PERIODO = 11)
                                or (PERIODO = 13) or (PERIODO = 15) or (PERIODO = 17) or (PERIODO = 19) or (PERIODO = 21) or (PERIODO = 23)) then
                                insert into NOMINA_CONCEPTOS (NOMI_ID, NOCO_ITEM, CONC_COD,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, NOCO_GTOEMPR)
                                    values (:IDNOMINA,:ITEM, :CONCEPT, :NIT_TERCERO, :VALOR, :ENTIDAD, :CONC_DEDUC, :CONC_PROV, :CONC_APORTE, :PERIODO, :ANO, :CONC_MODIFI, :CONC_APLICAPROM, :SALARIO, :GTOEMPR);
                            end
                        else if ((:PERIODICIDAD = 2) and (LIQUIDAPER = 2)) then
                            begin
                            if ((PERIODO = 2) or (PERIODO = 4) or (PERIODO = 6) or (PERIODO = 8) or (PERIODO = 10) or (PERIODO = 12)
                                or (PERIODO = 14) or (PERIODO = 16) or (PERIODO = 18) or (PERIODO = 20) or (PERIODO = 22) or (PERIODO = 24)) then
                                insert into NOMINA_CONCEPTOS (NOMI_ID, NOCO_ITEM, CONC_COD,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, NOCO_GTOEMPR)
                                    values (:IDNOMINA,:ITEM, :CONCEPT, :NIT_TERCERO, :VALOR, :ENTIDAD, :CONC_DEDUC, :CONC_PROV, :CONC_APORTE, :PERIODO, :ANO, :CONC_MODIFI, :CONC_APLICAPROM, :SALARIO, :GTOEMPR);
                            end
                        else if ((:PERIODICIDAD = 3) and (LIQUIDAPER = 1)) then
                            begin
                            if ((PERIODO = 1) or (PERIODO = 5) or (PERIODO = 9) or (PERIODO = 13) or (PERIODO = 17) or (PERIODO = 21)
                                or (PERIODO = 25) or (PERIODO = 29) or (PERIODO = 33) or (PERIODO = 37) or (PERIODO = 41) or (PERIODO = 45)
                                or (PERIODO = 49)) then
                                insert into NOMINA_CONCEPTOS (NOMI_ID, NOCO_ITEM, CONC_COD,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, NOCO_GTOEMPR)
                                    values (:IDNOMINA,:ITEM, :CONCEPT, :NIT_TERCERO, :VALOR, :ENTIDAD, :CONC_DEDUC, :CONC_PROV, :CONC_APORTE, :PERIODO, :ANO, :CONC_MODIFI, :CONC_APLICAPROM, :SALARIO, :GTOEMPR);
                            end
                        else if ((:PERIODICIDAD = 3) and (LIQUIDAPER = 2)) then
                            begin
                            if ((PERIODO = 2) or (PERIODO = 6) or (PERIODO = 10) or (PERIODO = 14) or (PERIODO = 18) or (PERIODO = 22)
                                or (PERIODO = 26) or (PERIODO = 30) or (PERIODO = 34) or (PERIODO = 38) or (PERIODO = 42) or (PERIODO = 46)
                                or (PERIODO = 50)) then
                                insert into NOMINA_CONCEPTOS (NOMI_ID, NOCO_ITEM, CONC_COD,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, NOCO_GTOEMPR)
                                    values (:IDNOMINA,:ITEM, :CONCEPT, :NIT_TERCERO, :VALOR, :ENTIDAD, :CONC_DEDUC, :CONC_PROV, :CONC_APORTE, :PERIODO, :ANO, :CONC_MODIFI, :CONC_APLICAPROM, :SALARIO, :GTOEMPR);
                            end
                        else if ((:PERIODICIDAD = 3) and (LIQUIDAPER = 3)) then
                            begin
                            if ((PERIODO = 3) or (PERIODO = 7) or (PERIODO = 11) or (PERIODO = 15) or (PERIODO = 19) or (PERIODO = 23)
                                or (PERIODO = 27) or (PERIODO = 31) or (PERIODO = 35) or (PERIODO = 39) or (PERIODO = 43) or (PERIODO = 47)
                                or (PERIODO = 51)) then
                                insert into NOMINA_CONCEPTOS (NOMI_ID, NOCO_ITEM, CONC_COD,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, NOCO_GTOEMPR)
                                    values (:IDNOMINA,:ITEM, :CONCEPT, :NIT_TERCERO, :VALOR, :ENTIDAD, :CONC_DEDUC, :CONC_PROV, :CONC_APORTE, :PERIODO, :ANO, :CONC_MODIFI, :CONC_APLICAPROM, :SALARIO, :GTOEMPR);
                            end
                        else if ((:PERIODICIDAD = 3) and (LIQUIDAPER = 4)) then
                            begin
                            if ((PERIODO = 4) or (PERIODO = 8) or (PERIODO = 12) or (PERIODO = 16) or (PERIODO = 20) or (PERIODO = 24)
                                or (PERIODO = 29) or (PERIODO = 32) or (PERIODO = 36) or (PERIODO = 40) or (PERIODO = 44) or (PERIODO = 48)
                                or (PERIODO = 52)) then
                                insert into NOMINA_CONCEPTOS (NOMI_ID, NOCO_ITEM, CONC_COD,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, NOCO_GTOEMPR)
                                    values (:IDNOMINA,:ITEM, :CONCEPT, :NIT_TERCERO, :VALOR, :ENTIDAD, :CONC_DEDUC, :CONC_PROV, :CONC_APORTE, :PERIODO, :ANO, :CONC_MODIFI, :CONC_APLICAPROM, :SALARIO, :GTOEMPR);
                            end
                        end
                    VALOR = 0;
                    BASICO = 0;
                    end
            end /* for */
        end
    end
suspend;
end
^

SET TERM ; ^

SET TERM ^ ;

ALTER TRIGGER NOMINA_DETALLE_BI
as
declare variable PERIODO integer;
declare variable FEC DATE;
begin
SELECT N.nomi_periodo,N.nomi_feccausa FROM NOMINA N WHERE N.nomi_id = NEW.nomi_id INTO :periodo,:fec;
EXECUTE PROCEDURE DIAS_LABORADOS(NEW.terc_nit,:periodo,:fec,'N','N')returning_values(NEW.node_diaslab);
end
^

SET TERM ; ^

/* 20100722 */
/* actualización tabla cambios de salario por el frente */

CREATE EXCEPTION CAMBIO_SALARIO_EXISTE 'Ya existe un cambio de salario para el empleado en esa fecha';

SET TERM ^ ;

CREATE OR ALTER TRIGGER MOVIMIENTO_SALARIO_EMPLEADO_BI FOR MOVIMIENTO_SALARIO_EMPLEADO
ACTIVE BEFORE INSERT POSITION 0
as
begin
if (exists (select mvse_id from movimiento_salario_empleado where terc_nit = new.terc_nit and mvse_fecha = new.mvse_fecha) ) then
    EXCEPTION CAMBIO_SALARIO_EXISTE;
else
    new.mvse_id = GEN_ID(id_movsalempl,1);
end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER EMPLEADOS_AI FOR EMPLEADOS
ACTIVE AFTER INSERT POSITION 0
AS
BEGIN
INSERT INTO program_vacaciones (TERC_NIT) VALUES (NEW.terc_nit);
if (new.empl_fecing is not null) then
    INSERT INTO MOVIMIENTO_SALARIO_EMPLEADO (terc_nit,mvse_fecha,mvse_salario)
        VALUES(NEW.terc_nit,new.empl_fecing,NEW.empl_salario);
END
^

SET TERM ; ^

DROP TRIGGER EMPLEADOS_AU;


/* CONTABIL NOMINA, REVISION PROY-CENT POR EMPLEADO */

SET TERM ^ ;

CREATE OR ALTER procedure CONTABIL_NOMINA (
    IDDOC integer)
returns (
    ERROR integer,
    IDC integer)
AS
declare variable itemdet integer;
declare variable idcontabil integer;
declare variable aporte char(1);
declare variable entidad varchar(20);
declare variable valor numeric(18,2);
declare variable ctagast varchar(20);
declare variable ctaxp varchar(20);
declare variable tercnit varchar(20);
declare variable fecaux date;
declare variable fecha char(8);
declare variable ano char(4);
declare variable periodicidad integer;
declare variable periodo integer;
declare variable numero varchar(6);
declare variable tipocom char(3);
declare variable prefcom varchar(4);
declare variable concepto varchar(60);
declare variable numerocom varchar(6);
declare variable proyecto varchar(4) character set none;
declare variable centro varchar(4) character set none;
declare variable codconc integer;
declare variable base numeric(18,2);
declare variable basico numeric(18,2);
declare variable comision numeric(18,2);
declare variable retroact numeric(18,2);
declare variable valorneg numeric(18,2);
declare variable det char(1);
declare variable ctaadmin char(1);
BEGIN
SELECT N.nomi_feccausa, N.nomi_ano, N.nomi_periodocidad, N.nomi_periodo FROM NOMINA N WHERE N.nomi_id = :iddoc INTO :fecaux, :ano, :periodicidad, :periodo;
NUMERO = :periodicidad || :periodo;
SELECT I.tico_cod, I.prco_pre, I.inno_det, I.inno_dtlleadmin FROM INTERFAZ_NOMINA I WHERE I.tido_cod = 92 INTO :tipocom, :prefcom,:det,:ctaadmin;
concepto = 'CAUSACION NOMINA AÑO ' || :ano || ' PERIODO ' || :periodo || ' PERIODICIDAD ' ||:periodicidad;
EXECUTE PROCEDURE completa_ceros(:numero)RETURNING_VALUES :numero;
SELECT P.pref_numero FROM PREFIJOS_CONTA P WHERE P.tico_cod = :tipocom AND P.prco_pref = :prefcom INTO :numerocom;
idcontabil = GEN_ID(ID_CONTABILIZA,1);
EXECUTE PROCEDURE FECHA_A_CONTA(:FECAUX) RETURNING_VALUES (:FECHA);
INSERT INTO CONTABILIZACION (CNTB_ID, CNTB_TIPOREF, CNTB_IDREF, CNTB_PREFREF, CNTB_NUMREF, CNTB_FECHA, CNTB_TIPOCOMP, CNTB_PREFCNT, CNTB_CONCEPTO, CNTB_NUMERO, CNTB_PROCESADO)
    VALUES (:idcontabil, 92,:iddoc, :ano, :numero, :fecha, :tipocom, :prefcom, :concepto, :numerocom, 'N');
idc = :idcontabil;
itemdet = 0;
IF (DET = 'N') THEN
    BEGIN
    FOR SELECT max(NC.conc_cod),sum(NC.NOCO_VALORCONT), max(CN.conc_ctagast), max(NC.terc_nit), max(NC.noco_aporte), max(NC.noco_entidad)
        FROM NOMINA_CONCEPTOS NC, CONCEPTOS_NOMINA CN WHERE NC.conc_cod = CN.conc_cod AND NC.nomi_id = :iddoc and cn.conc_ctagast is not null and cn.conc_ctacxp is not null
        group by cn.conc_ctagast,nc.terc_nit
        INTO :codconc,:valor, :ctagast, :tercnit, :aporte, :entidad
        DO
        BEGIN
        SELECT E.proy_cod,E.cent_cod FROM EMPLEADOS E WHERE E.terc_nit = :tercnit INTO :proyecto, :centro;
        if (:proyecto IS NULL) then
            SELECT D.dpto_proy, D.dpto_centro FROM EMPLEADOS E, departamento D WHERE E.terc_nit = :tercnit AND E.empl_dpto = D.dpto_cod INTO :proyecto, :centro;
        base = null;
        IF (ctagast IS NULL) THEN
            BEGIN
            EXECUTE PROCEDURE ERROR (14, :IDDOC, :ctagast, 2);
            ERROR = ERROR + 1;
            END
        IF (ctaxp IS NULL) THEN
            BEGIN
            EXECUTE PROCEDURE ERROR (14, :IDDOC, :ctaxp, 2);
            ERROR = ERROR + 1;
            END
        IF (VALOR IS NULL) THEN
            VALOR = 0;
        IF (VALOR <> 0) THEN
            BEGIN
            IF (valor < 0) THEN
                valor = :valor * (-1);
            IF (codconc = 6) THEN
                BEGIN
                SELECT E.empl_salario FROM EMPLEADOS E WHERE E.terc_nit = :tercnit INTO :basico;
                SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :tercnit INTO :comision;
                IF (comision IS NULL) THEN
                    comision = 0;
                SELECT C.emco_monto FROM EMPLEADO_CONCEPTOS C WHERE C.terc_nit = :tercnit AND C.conc_cod = 933 INTO :retroact;
                IF (retroact IS NULL ) THEN
                    retroact = 0;
                base = :basico + :comision + :retroact;
                END
            IF (aporte = 'N') THEN
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_TERC, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_CONC, CNDE_PROY, cnde_centro,CNDE_BASE)
                             VALUES (:idcontabil, :itemdet, :ctagast, :tercnit, :valor, 0, :concepto, :proyecto, :centro,:base);
                itemdet = itemdet + 1;
                /*SELECT D.dpto_proy, D.dpto_centro FROM EMPLEADOS E, departamento D WHERE E.terc_nit = :tercnit AND E.empl_dpto = D.dpto_cod INTO :proyecto, :centro;
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_TERC, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_CONC, CNDE_PROY, cnde_centro,CNDE_BASE)
                             VALUES (:idcontabil, :itemdet, :ctaxp, :tercnit, 0,:valor, :concepto, :proyecto, :centro,:base);
                itemdet = itemdet + 1;            */
                END
            ELSE
                IF (aporte = 'S') THEN
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_TERC, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_CONC, CNDE_PROY, cnde_centro,CNDE_BASE)
                        VALUES (:idcontabil, :itemdet, :ctagast, :entidad, :valor, 0, :concepto, :proyecto, :centro,:base);
                    itemdet = itemdet + 1;
                    /*SELECT D.dpto_proy, D.dpto_centro FROM EMPLEADOS E, departamento D WHERE E.terc_nit = :tercnit AND E.empl_dpto = D.dpto_cod INTO :proyecto, :centro;
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_TERC, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_CONC, CNDE_PROY, cnde_centro,CNDE_BASE)
                        VALUES (:idcontabil, :itemdet, :ctaxp, :entidad, 0,:valor, :concepto, :proyecto, :centro,:base);
                    itemdet = itemdet + 1;                */
                    END
            END
        END
    SUSPEND;
    FOR SELECT max(NC.conc_cod),sum(NC.NOCO_VALORCONT), max(CN.conc_ctacxp), max(NC.terc_nit), max(NC.noco_aporte), max(NC.noco_entidad)
        FROM NOMINA_CONCEPTOS NC, CONCEPTOS_NOMINA CN WHERE NC.conc_cod = CN.conc_cod AND NC.nomi_id = :iddoc and cn.conc_ctagast is not null and cn.conc_ctacxp is not null
        group by cn.conc_ctacxp,nc.noco_nitcont
        INTO :codconc,:valor, :ctaxp, :tercnit, :aporte, :entidad
        DO
        BEGIN
        base = null;
        IF (ctagast IS NULL) THEN
            BEGIN
            EXECUTE PROCEDURE ERROR (14, :IDDOC, :ctagast, 2);
            ERROR = ERROR + 1;
            END
        IF (ctaxp IS NULL) THEN
            BEGIN
            EXECUTE PROCEDURE ERROR (14, :IDDOC, :ctaxp, 2);
            ERROR = ERROR + 1;
            END
        IF (VALOR IS NULL) THEN
            VALOR = 0;
        IF (VALOR <> 0) THEN
            BEGIN
            IF (valor < 0) THEN
                valor = :valor * (-1);
            IF (codconc = 6) THEN
                BEGIN
                SELECT E.empl_salario FROM EMPLEADOS E WHERE E.terc_nit = :tercnit INTO :basico;
                SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :tercnit INTO :comision;
                IF (comision IS NULL) THEN
                    comision = 0;
                SELECT C.emco_monto FROM EMPLEADO_CONCEPTOS C WHERE C.terc_nit = :tercnit AND C.conc_cod = 933 INTO :retroact;
                IF (retroact IS NULL ) THEN
                    retroact = 0;
                base = :basico + :comision + :retroact;
                END
            if ((codconc > 900) and (entidad is not null) AND (ctaadmin = 'S')) then
                begin
                 SELECT A.admi_ctaconta FROM ADMINISTRADORA A WHERE A.terc_nit = :entidad INTO :ctaxp;
                end
            IF (aporte = 'N') THEN
                BEGIN
                /*SELECT D.dpto_proy, D.dpto_centro FROM EMPLEADOS E, departamento D WHERE E.terc_nit = :tercnit AND E.empl_dpto = D.dpto_cod INTO :proyecto, :centro;
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_TERC, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_CONC, CNDE_PROY, cnde_centro,CNDE_BASE)
                             VALUES (:idcontabil, :itemdet, :ctagast, :tercnit, :valor, 0, :concepto, :proyecto, :centro,:base);
                itemdet = itemdet + 1;
                */
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_TERC, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_CONC, CNDE_PROY, cnde_centro,CNDE_BASE)
                             VALUES (:idcontabil, :itemdet, :ctaxp, :tercnit, 0,:valor, :concepto, :proyecto, :centro,:base);
                itemdet = itemdet + 1;
                END
            ELSE
                IF (aporte = 'S') THEN
                    BEGIN
                    /*SELECT D.dpto_proy, D.dpto_centro FROM EMPLEADOS E, departamento D WHERE E.terc_nit = :tercnit AND E.empl_dpto = D.dpto_cod INTO :proyecto, :centro;
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_TERC, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_CONC, CNDE_PROY, cnde_centro,CNDE_BASE)
                        VALUES (:idcontabil, :itemdet, :ctagast, :tercnit, :valor, 0, :concepto, :proyecto, :centro,:base);
                    itemdet = itemdet + 1;                */
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_TERC, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_CONC, CNDE_PROY, cnde_centro,CNDE_BASE)
                        VALUES (:idcontabil, :itemdet, :ctaxp, :tercnit, 0,:valor, :concepto, :proyecto, :centro,:base);
                    itemdet = itemdet + 1;
                    END
            END
        END
    SUSPEND;
    END
ELSE
    BEGIN
    FOR SELECT NC.conc_cod,NC.NOCO_VALORCONT, CN.conc_ctagast, CN.conc_ctacxp, NC.terc_nit, NC.noco_aporte, NC.noco_entidad
        FROM NOMINA_CONCEPTOS NC, CONCEPTOS_NOMINA CN WHERE NC.conc_cod = CN.conc_cod AND NC.nomi_id = :iddoc
        INTO :codconc,:valor, :ctagast, :ctaxp, :tercnit, :aporte, :entidad
        DO
        BEGIN
        base = null;
        IF (ctagast IS NULL) THEN
            BEGIN
            EXECUTE PROCEDURE ERROR (14, :IDDOC, :ctagast, 2);
            ERROR = ERROR + 1;
            END
        IF (ctaxp IS NULL) THEN
            BEGIN
            EXECUTE PROCEDURE ERROR (14, :IDDOC, :ctaxp, 2);
            ERROR = ERROR + 1;
            END
        IF (VALOR IS NULL) THEN
            VALOR = 0;
        IF (VALOR <> 0) THEN
            BEGIN
            IF (valor < 0) THEN
                valor = :valor * (-1);
            IF (codconc = 6) THEN
                BEGIN
                SELECT E.empl_salario FROM EMPLEADOS E WHERE E.terc_nit = :tercnit INTO :basico;
                SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :tercnit INTO :comision;
                IF (comision IS NULL) THEN
                    comision = 0;
                SELECT C.emco_monto FROM EMPLEADO_CONCEPTOS C WHERE C.terc_nit = :tercnit AND C.conc_cod = 933 INTO :retroact;
                IF (retroact IS NULL ) THEN
                    retroact = 0;
                base = :basico + :comision + :retroact;
                END     
            if ((codconc > 900) and (entidad is not null) AND (ctaadmin = 'S')) then
                begin
                SELECT A.admi_ctaconta FROM ADMINISTRADORA A WHERE A.terc_nit = :entidad INTO :ctaxp;
                end
            IF (aporte = 'N') THEN
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_TERC, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_CONC, CNDE_PROY, cnde_centro,CNDE_BASE)
                    VALUES (:idcontabil, :itemdet, :ctagast, :tercnit, :valor, 0, :concepto, :proyecto, :centro,:base);
                itemdet = itemdet + 1;
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_TERC, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_CONC, CNDE_PROY, cnde_centro,CNDE_BASE)
                             VALUES (:idcontabil, :itemdet, :ctaxp, :tercnit, 0,:valor, :concepto, :proyecto, :centro,:base);
                itemdet = itemdet + 1;
                END
            ELSE
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_TERC, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_CONC, CNDE_PROY, cnde_centro,CNDE_BASE)
                    VALUES (:idcontabil, :itemdet, :ctagast, :tercnit, :valor, 0, :concepto, :proyecto, :centro,:base);
                itemdet = itemdet + 1;
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_TERC, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_CONC, CNDE_PROY, cnde_centro,CNDE_BASE)
                         VALUES (:idcontabil, :itemdet, :ctaxp, :entidad, 0,:valor, :concepto, :proyecto, :centro,:base);
                itemdet = itemdet + 1;
                END
            END
        END
    SUSPEND;
    END
END
^

SET TERM ; ^


/* 20100722b */
/* garantice que el total quede de ultimo */

SET TERM ^ ;

CREATE OR ALTER procedure IMPR_PLANILLA_NOMINA (
    ID integer,
    PAGO char(1),
    CTA char(1),
    EMPL char(1),
    DPTO varchar(20))
returns (
    FECHA date,
    OBSERVACIONES blob sub_type 0 segment size 80,
    PAGOGLOBAL char(1),
    PERIODO integer,
    ANO char(4),
    PERIODICIDAD varchar(60),
    NITEMPL varchar(20),
    VALOR numeric(18,2),
    DEDUC char(1),
    NOMBREEMPL varchar(60),
    NOMCORTCONC varchar(60),
    NOMBRECONC varchar(60),
    CODCONC integer,
    PROV char(1),
    TOTALEMPL numeric(18,2),
    TOTALDEDUC numeric(18,2),
    TOTALDEVENG numeric(18,2),
    NUMEMPL integer,
    CTAEMPL varchar(25),
    TOTALCTAS numeric(18,2),
    TOTALNOMI numeric(18,2),
    TOTALAPOR numeric(18,2),
    NOMPER varchar(60),
    ORG integer,
    CARGOEMPL varchar(60),
    DEPTOEMPL varchar(60),
    NUMCOP integer,
    NOMBRE_COPIA varchar(60),
    DIASLAB integer,
    SALARIO numeric(18,2),
    BENEFICIO char(1),
    BASE numeric(18,2),
    CODDPTOEMPL integer)
AS
declare variable nitant varchar(20);
declare variable nitnue varchar(20);
declare variable numconc integer;
declare variable totalnomineg numeric(18,2);
declare variable totalaporneg numeric(18,2);
declare variable par integer;
declare variable impar integer;
declare variable antdeduc char(1);
declare variable nitdeduc varchar(20);
declare variable nittot varchar(20);
declare variable nitaux varchar(20);
BEGIN
SELECT N.nuco_copia FROM NUMERO_COPIA N WHERE N.tido_cod = 92 AND N.nuco_id = :id INTO :NUMCOP;
IF (numcop IS NULL) THEN
  BEGIN
  numcop = 0;
  INSERT INTO NUMERO_COPIA (TIDO_COD, NUCO_ID, NUCO_COPIA) VALUES (92,:id,:numcop);
  END
ELSE
  BEGIN
  numcop = :numcop + 1;
  UPDATE numero_copia N SET N.nuco_copia = :numcop WHERE N.tido_cod = 92 AND N.nuco_id = :id;
  END
SELECT N.noco_nombre FROM nombres_copias N WHERE N.noco_id = :numcop INTO :nombre_copia;
numempl = 0;
nitant = 0;
nitnue = 0;
IF (PAGO = 'N') THEN
  BEGIN
  FOR SELECT N.nomi_feccausa, N.nomi_obs, N.nomi_pagoglobal, N.nomi_periodo, N.nomi_ano, P.ppag_nombre, PN.pnom_nombre
    FROM NOMINA N, periodo_pago P, periodo_pago_nombre PN
    WHERE P.ppag_cod = N.nomi_periodocidad AND N.nomi_id = :ID AND PN.ppag_cod = N.nomi_periodocidad AND PN.ppag_periodo = N.nomi_periodo
    INTO :fecha, :observaciones, :pagoglobal, :periodo, :ano, :periodicidad, :NOMPER
    DO
    BEGIN
    SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id INTO :totalnomi;
    SELECT SUM(NC.noco_valor*-1) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_APORTE = 'S' AND NOCO_VALOR < 0 AND NOMI_ID = :id INTO :totalaporneg;
    SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_APORTE = 'S' AND NOCO_VALOR > 0 AND NOMI_ID = :id INTO :totalapor;
    totalapor = :totalapor + totalaporneg;
    FOR SELECT NC.terc_nit, NC.noco_valor, NC.noco_deduc, T.terc_nom, C.conc_nomcorto, C.conc_nombre, NC.conc_cod, NC.noco_prov
      FROM NOMINA_CONCEPTOS NC, TERCEROS T, CONCEPTOS_NOMINA C
      WHERE NC.nomi_id = :ID AND C.conc_cod = NC.conc_cod AND t.terc_nit = nc.terc_nit
      ORDER BY NC.NOCO_DEDUC, NC.conc_cod,  T.TERC_NOM
      INTO :nitempl, :valor, :deduc, :nombreempl, :nomcortconc, :nombreconc, :codconc, :prov
      DO
      BEGIN
      IF (valor IS NULL) THEN
        valor = 0;
      cargoempl = '';
      select empl_cargo from EMPLEADOS where terc_nit = :nitempl into :cargoempl;
      SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND TERC_NIT = :nitempl INTO :totalempl;
      SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND TERC_NIT = :nitempl AND NC.noco_deduc = 'S' INTO :totaldeduc;
      SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND TERC_NIT = :nitempl AND NC.noco_deduc = 'N' INTO :totaldeveng;
      SUSPEND;
      END
    /* totales por concepto
    nitempl = '';
    valor = NULL;
    deduc = '';
    nombreempl = NULL;
    nomcortconc = NULL;
    nombreconc = NULL;
    codconc = NULL;
    prov = NULL;
    FOR SELECT MAX(conc_cod), SUM(noco_valor) FROM NOMINA_CONCEPTOS WHERE nomi_id = :id
      GROUP BY conc_cod
      INTO :codconc, :valor
      DO
      BEGIN
      nitempl = '';
      nombreempl = '';
      deduc = 'N';
      prov = 'N';
      SELECT C.conc_nombre,C.conc_nomcorto FROM CONCEPTOS_NOMINA C WHERE C.conc_cod = :codconc INTO :nombreconc,:nomcortconc;
      SUSPEND;
      END
    IF (EMPL = 'N') THEN
      BEGIN
      deduc = 'N';
      nomcortconc = 'DIAS LAB.';
      nombreconc = 'DIAS LAB.';
      codconc = 0;
      prov = 'N';
      valor = NULL;
      nitempl = '';
      nombreempl = '';
      SUSPEND;
      deduc = 'N';
      nomcortconc = 'SDO BASE';
      nombreconc = 'SDO BASE';
      codconc = 0;
      prov = 'N';
      valor = NULL;
      nitempl = '';
      nombreempl = '';
      SUSPEND;
      END
    /* dias laborados y salario base */
    FOR SELECT ND.node_diaslab, ND.terc_nit, T.terc_nom FROM NOMINA_DETALLE ND, TERCEROS T
        WHERE NOMI_ID = :id AND T.terc_nit = ND.terc_nit
      INTO :diaslab, :nitaux, :nombreempl
      DO
      BEGIN
      nitempl = :nitaux;
      nomcortconc = 'DIAS LAB.';
      valor = :diaslab;
      SUSPEND;
      SELECT FIRST 1  m.mvse_salario FROM MOVIMIENTO_SALARIO_EMPLEADO M WHERE M.terc_nit = :nitaux AND M.mvse_fecha <= :fecha ORDER BY M.mvse_fecha DESC INTO :salario;
      nitempl = :nitaux;
      nomcortconc = 'SDO BASE';
      valor = :salario;
      SUSPEND;
      END
    END
  END
ELSE
  IF (PAGO = 'S') THEN
    BEGIN
    par = 2;
    impar = 1;
    SELECT N.nomi_feccausa, N.nomi_obs, N.nomi_pagoglobal, N.nomi_periodo, N.nomi_ano, P.ppag_nombre, PN.pnom_nombre
        FROM NOMINA N, periodo_pago P, periodo_pago_nombre PN
        WHERE P.ppag_cod = N.nomi_periodocidad AND N.nomi_id = :ID AND PN.ppag_cod = N.nomi_periodocidad AND PN.ppag_periodo = N.nomi_periodo
        INTO :fecha, :observaciones, :pagoglobal, :periodo, :ano, :periodicidad, :NOMPER;
    IF (EMPL = 'N') THEN
        BEGIN
        deduc = 'N';
        nomcortconc = 'DIAS LAB.';
        nombreconc = 'DIAS LAB.';
        codconc = 0;
        prov = 'N';
        valor = NULL;
        nitempl = '';
        nombreempl = '';
        SUSPEND;
        deduc = 'N';
        nomcortconc = 'SDO BASE';
        nombreconc = 'SDO BASE';
        codconc = 0;
        prov = 'N';
        valor = NULL;
        nitempl = '';
        nombreempl = '';
        SUSPEND;
        deduc = 'N';
        nomcortconc = 'TOTAL DEV';
        nombreconc = 'TOTAL DEV';
        codconc = 9999;
        prov = 'N';
        valor = NULL;
        nitempl = '';
        nombreempl = '';
        SUSPEND;
        deduc = 'S';
        nomcortconc = 'TOTAL DEDUC';
        nombreconc = 'TOTAL DEDUC';
        codconc = 99999;
        prov = 'N';
        valor = NULL;
        nitempl = '';
        nombreempl = '';
        SUSPEND;
        deduc = 'S';
        nomcortconc = 'TOTAL EMPL';
        nombreconc = 'TOTAL EMPL';
        codconc = 999999;
        prov = 'N';
        valor = NULL;
        nitempl = '';
        nombreempl = '';
        SUSPEND;
        FOR SELECT MAX(N.conc_cod), MAX(N.noco_deduc) FROM NOMINA_CONCEPTOS N
            WHERE N.nomi_id = :id AND N.noco_prov = 'N' AND N.noco_gtoempr = 'N'
            GROUP BY N.conc_cod
            INTO :codconc, :deduc
            DO
            BEGIN
            valor = NULL;
            nitempl = '';
            nombreempl = '';
            prov = 'N';
            SELECT C.conc_nombre,C.conc_nomcorto FROM CONCEPTOS_NOMINA C WHERE C.conc_cod = :codconc INTO :nombreconc,:nomcortconc;
            SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id INTO :totalempl;
            SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND NC.noco_deduc = 'S' INTO :totaldeduc;
            SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND NC.noco_deduc = 'N' INTO :totaldeveng;
            SUSPEND;
            END
        FOR SELECT ND.node_diaslab,  ND.terc_nit, T.terc_nom
            FROM NOMINA_DETALLE ND, TERCEROS T WHERE NOMI_ID = :id AND T.terc_nit = ND.terc_nit
            INTO :diaslab, :nitaux, :nombreempl
            DO
            BEGIN
            nitempl = :nitaux;
            nomcortconc = 'DIAS LAB.';
            valor = :diaslab;
            SUSPEND;
            SELECT FIRST 1  m.mvse_salario FROM MOVIMIENTO_SALARIO_EMPLEADO M WHERE M.terc_nit = :nitaux AND M.mvse_fecha <= :fecha ORDER BY M.mvse_fecha DESC INTO :salario;
            nitempl = :nitaux;
            nomcortconc = 'SDO BASE';
            valor = :salario;
            SUSPEND;
            END
        END
    FOR SELECT NC.terc_nit, NC.noco_valor, NC.noco_deduc, T.terc_nom, C.conc_nomcorto, C.conc_nombre, NC.conc_cod, NC.noco_prov, NC.terc_nit, c.conc_benefic, NC.noco_base
        FROM NOMINA_CONCEPTOS NC, TERCEROS T, CONCEPTOS_NOMINA C
        WHERE NC.nomi_id = :ID AND C.conc_cod = NC.conc_cod AND t.terc_nit = nc.terc_nit AND NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N'
        ORDER BY T.terc_nom
        INTO :nitempl, :valor, :deduc, :nombreempl, :nomcortconc, :nombreconc, :codconc, :prov,:nitnue, :beneficio,:base
        DO
        BEGIN
        cargoempl = '';
        ctaempl = '';
        deptoempl = '';
        coddptoempl = 0;
        diaslab = 0;
        SELECT node_diaslab FROM NOMINA_DETALLE WHERE nomi_id = :id AND terc_nit = :nitempl INTO :diaslab;
        select e.empl_cargo, e.empl_cuenta, D.dpto_nombre, d.dpto_cod
            from EMPLEADOS e, DEPARTAMENTO D
            where D.dpto_cod = E.empl_dpto AND e.terc_nit = :nitempl into :cargoempl,:ctaempl,:deptoempl,:coddptoempl;
        SELECT FIRST 1  m.mvse_salario FROM MOVIMIENTO_SALARIO_EMPLEADO M WHERE M.terc_nit = :nitempl AND M.mvse_fecha <= :FECHA ORDER BY M.mvse_fecha DESC INTO :salario;
        IF ((nitnue <> nitant) AND (nitnue IS NOT NULL)) THEN
            numempl = :numempl + 1;
        IF (valor IS NULL) THEN
            valor = 0;
        IF (nitempl <> nitdeduc) THEN
            BEGIN
            par = 2;
            impar = 1;
            END
        nitdeduc = :nitempl;
        IF (:deduc = 'S') THEN
            BEGIN
            antdeduc = 'S';
            org = :par;
            par = :par + 2;
            END
        ELSE
            BEGIN
            antdeduc = 'N';
            org = :impar;
            impar = :impar + 2;
            END
       SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND TERC_NIT = :nitempl INTO :totalempl;
       SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND TERC_NIT = :nitempl AND NC.noco_deduc = 'S' INTO :totaldeduc;
       SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND TERC_NIT = :nitempl AND NC.noco_deduc = 'N' INTO :totaldeveng;
       IF (cta = 'S') THEN
         BEGIN
         SELECT COUNT(CONC_COD) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND TERC_NIT = :nitempl INTO :numconc;
         totalempl = totalempl / :numconc;
         SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND TERC_NIT = :nitempl INTO :totalctas;
         END
       SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id INTO :totalnomi;
       SELECT SUM(NC.noco_valor*-1) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_APORTE = 'S' AND NOCO_VALOR < 0 AND NOMI_ID = :id INTO :totalaporneg;
       SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_APORTE = 'S' AND NOCO_VALOR > 0 AND NOMI_ID = :id INTO :totalapor;
       totalapor = :totalapor + totalaporneg;
       SUSPEND;
       IF ((nitnue <> nitant) AND (nitnue IS NOT NULL) AND (EMPL = 'N')) THEN
         BEGIN
         deduc = 'N';
         nomcortconc = 'TOTAL DEV';
         nombreconc = 'TOTAL DEV';
         codconc = 9999;
         prov = 'N';
         SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND NC.noco_deduc = 'N' AND NC.terc_nit = : nitempl INTO :VALOR;
         SUSPEND;
         deduc = 'S';
         nomcortconc = 'TOTAL DEDUC';
         nombreconc = 'TOTAL DEDUC';
         codconc = 99999;
         prov = 'N';
         SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND NC.noco_deduc = 'S' AND NC.terc_nit = :nitempl INTO :VALOR;
         SUSPEND;
         deduc = 'S';
         nomcortconc = 'TOTAL EMPL';
         nombreconc = 'TOTAL EMPL';
         codconc = 999999;
         prov = 'N';
         SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND NC.terc_nit = :nitempl INTO :VALOR;
         nitant = :nitnue;
         SUSPEND;
         END
       END
    numempl = :numempl + 1;
    IF (EMPL = 'N') THEN
        BEGIN
        nitempl = '';
        valor = NULL;
        deduc = '';
        nombreempl = NULL;
        nomcortconc = NULL;
        nombreconc = NULL;
        codconc = NULL;
        prov = NULL;
        totalempl = NULL;
        ctaempl = NULL;
        IF (cta = 'N') THEN
          BEGIN
          FOR SELECT MAX(N.conc_cod) FROM NOMINA_CONCEPTOS N WHERE N.nomi_id = :id AND N.noco_prov = 'N' AND N.noco_gtoempr = 'N'
            GROUP BY N.conc_cod
            INTO :codconc
            DO
            BEGIN
            IF (dpto IS NOT NULL AND (DPTO <> '') ) THEN
                BEGIN
                SELECT SUM(NC.noco_valor), MAX(NC.noco_deduc) FROM NOMINA_CONCEPTOS NC, EMPLEADOS E, DEPARTAMENTO D
                    WHERE NC.nomi_id = :ID AND NC.conc_cod = :codconc AND D.dpto_cod = E.empl_dpto AND NC.terc_nit = E.terc_nit AND d.dpto_cod = :dpto
                    GROUP BY NC.conc_cod
                    INTO :valor, :deduc;
                nitempl = '-';
                nombreempl = '|  TOTAL  |';
                deptoempl = '-';
                prov = 'N';
                SELECT C.conc_nombre,C.conc_nomcorto FROM CONCEPTOS_NOMINA C WHERE C.conc_cod = :codconc INTO :nombreconc,:nomcortconc;
                SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC, EMPLEADOS E, DEPARTAMENTO D WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id  AND D.dpto_cod = E.empl_dpto AND NC.terc_nit = E.terc_nit INTO :totalempl;
                SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC, EMPLEADOS E, DEPARTAMENTO D WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND NC.noco_deduc = 'S'  AND D.dpto_cod = E.empl_dpto AND NC.terc_nit = E.terc_nit INTO :totaldeduc;
                SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC, EMPLEADOS E, DEPARTAMENTO D WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND NC.noco_deduc = 'N'  AND D.dpto_cod = E.empl_dpto AND NC.terc_nit = E.terc_nit INTO :totaldeveng;
                END
            ELSE
                BEGIN
                SELECT SUM(NC.noco_valor), MAX(NC.noco_deduc) FROM NOMINA_CONCEPTOS NC
                WHERE NC.nomi_id = :ID AND NC.conc_cod = :codconc
                GROUP BY NC.conc_cod
                INTO :valor, :deduc;
                nitempl = '-';
                nombreempl = 'TOTAL';
                deptoempl = '-';
                prov = 'N';
                SELECT C.conc_nombre,C.conc_nomcorto FROM CONCEPTOS_NOMINA C WHERE C.conc_cod = :codconc INTO :nombreconc,:nomcortconc;
                SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id INTO :totalempl;
                SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND NC.noco_deduc = 'S' INTO :totaldeduc;
                SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND NC.noco_deduc = 'N' INTO :totaldeveng;
                END
            SUSPEND;
            END
        IF (dpto IS NOT NULL AND (DPTO <> '') ) THEN
            BEGIN
            deduc = 'N';
             nomcortconc = 'TOTAL DEV';
             nombreconc = 'TOTAL DEV';
             codconc = 9999;
             deptoempl = '-';
             prov = 'N';
             SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC, EMPLEADOS E, DEPARTAMENTO D WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id  AND D.dpto_cod = E.empl_dpto AND NC.terc_nit = E.terc_nit AND d.dpto_cod = :dpto INTO :VALOR;
             nitempl = '-';
             nombreempl = 'TOTAL';
             SUSPEND;
             deduc = 'S';
             nomcortconc = 'TOTAL DEDUC';
             nombreconc = 'TOTAL DEDUC';
             codconc = 99999;
             deptoempl = '-';
             prov = 'N';
             SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC, EMPLEADOS E, DEPARTAMENTO D WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND NC.noco_deduc = 'S'  AND D.dpto_cod = E.empl_dpto AND d.dpto_cod = :dpto AND NC.terc_nit = E.terc_nit INTO :VALOR;
             nitempl = '-';
             nombreempl = 'TOTAL';
             SUSPEND;
             deduc = 'S';
             nomcortconc = 'TOTAL EMPL';
             nombreconc = 'TOTAL EMPL';
             codconc = 999999;
             deptoempl = '-';
             prov = 'N';
             SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC, EMPLEADOS E, DEPARTAMENTO D WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND NC.noco_deduc = 'N'  AND D.dpto_cod = E.empl_dpto AND d.dpto_cod = :dpto AND NC.terc_nit = E.terc_nit INTO :VALOR;
             nitempl = '-';
             nombreempl = 'TOTAL';
             SUSPEND;
             END
        ELSE
             BEGIN
             deduc = 'N';
             nomcortconc = 'TOTAL DEV';
             nombreconc = 'TOTAL DEV';
             codconc = 9999;
             prov = 'N';
             SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND NC.noco_deduc = 'N' INTO :VALOR;
             nitempl = '-';
             nombreempl = 'TOTAL';
             SUSPEND;
             deduc = 'S';
             nomcortconc = 'TOTAL DEDUC';
             nombreconc = 'TOTAL DEDUC';
             codconc = 99999;
             prov = 'N';
             SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND NC.noco_deduc = 'S' INTO :VALOR;
             nitempl = '-';
             nombreempl = 'TOTAL';
             SUSPEND;
             deduc = 'S';
             nomcortconc = 'TOTAL EMPL';
             nombreconc = 'TOTAL EMPL';
             codconc = 999999;
             prov = 'N';
             SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N'  AND NOMI_ID = :id INTO :VALOR;
             nitempl = '-';
             nombreempl = 'TOTAL';
             SUSPEND;
             END
         END
       END
    END
END
^

SET TERM ; ^

/* 20100723 */ 
SET TERM ^ ;

CREATE OR ALTER procedure LIQUIDACION_EMPLEADO (
    NITEMPL varchar(20),
    FECLIQ date,
    DIASLABORADOS integer)
returns (
    salario NUMERIC(18,2),
    PRIMA numeric(18,2),
    FECPRIMA date,
    FECCES date,
    CESANTIA numeric(18,2),
    INTCESANT numeric(18,2),
    FECVAC date,
    VACACION numeric(18,2),
    SUELDO numeric(18,2),
    BENEFICIOS numeric(18,2),
    OTROSDED numeric(18,2),
    OTROSDEV numeric(18,2),
    EPSEMPL numeric(18,2),
    AFPEMPL numeric(18,2),
    DSPRESTAMO numeric(18,2),
    EMPREPS numeric(18,2),
    EMPRAFP numeric(18,2),
    EMPRCCF numeric(18,2),
    EMPRSENA numeric(18,2),
    EMPRICBF numeric(18,2),
    TOTPAGOS numeric(18,2),
    TOTDESC numeric(18,2),
    TOTAL numeric(18,2),
    TOTEMPR numeric(18,2))
AS
DECLARE VARIABLE SMLV NUMERIC(18,2);
declare variable numeroprom integer;
DECLARE VARIABLE valor NUMERIC(18,2);
declare variable DIASAUX INTEGER;
declare variable periodicidad integer;
declare variable PERINICIAL integer;
declare variable PERFINAL integer;
declare variable ANOINI integer;
declare variable ANOFIN integer;
declare variable MONTOS numeric(18,2);
declare variable PORCEN numeric(9,4);
declare variable ENTIDAD varchar(20);
declare variable CONC_COD integer;
declare variable CONC_DEDUC char(1);
declare variable CONC_PORC numeric(9,4);
declare variable CONC_ENTIDAD integer;
declare variable CONC_MONTO numeric(18,2);
declare variable CONC_PROMEDIO char(1);
declare variable CONC_SALARIO char(1);
declare variable CONC_BENEFICIO char(1);
declare variable BASICO numeric(18,2);
declare variable LIQUIDAPER integer;
declare variable MENSUAL char(1);
declare variable CONC_APORTE char(1);
declare variable CONC_DIAS char(1);
declare variable TOMASAL integer;
declare variable VALORPREDET numeric(18,2);
declare variable CAMBSALTRANS numeric(18,2);
declare variable SALDOSINI numeric(18,2);
declare variable DURANOV integer;
declare variable HORASEX numeric(18,2);
declare variable DIASNOV integer;
declare variable RETROACT numeric(18,2);
declare variable REEMBOLSO numeric(18,2);
declare variable INCAP numeric(18,2);
declare variable RECNOCT numeric(18,2);
declare variable RECFEST numeric(18,2);
declare variable TAR_RECNOTC numeric(9,4);
declare variable TAR_RECFEST numeric(9,4);
declare variable RECARGO numeric(18,2);
declare variable BASICOREC numeric(18,2);
declare variable COMISION numeric(18,2);
declare variable salinteg CHAR(1);
declare variable TAR_SALINTEG numeric(9,4);
BEGIN
/* LIQUIDACION DEL MES ACTUAL */
select e.empl_ppago, E.empl_salinteg from empleados e where terc_nit = :nitempl into :periodicidad, :salinteg;
select P.PAAN_RECNOC, P.PAAN_RECFEST, P.paan_salinteg from PARAMETROS_ANO P where P.PAAN_ANO = :anofin
    into :TAR_RECNOTC, :TAR_RECFEST, TAR_SALINTEG;

select first 1 M.MVSE_SALARIO from MOVIMIENTO_SALARIO_EMPLEADO M where M.TERC_NIT = :nitempl and
    M.MVSE_FECHA <= :fecliq order by M.MVSE_FECHA desc into :SALARIO;
BASICO = SALARIO;
EXECUTE PROCEDURE REDONDEE(:SUELDO, -2) RETURNING_VALUES (:sueldo);
OTROSDED = 0;
OTROSDEV = 0;
SUELDO = 0;
EXECUTE PROCEDURE periodo_nom_fecha (:fecliq, :periodicidad) returning_values (:perfinal, :anofin);
PERFINAL = PERFINAL + 1;
for select CE.EMCO_MONTO, CE.EMCO_PORC, CE.EMPL_ENTIDAD, CE.EMCO_PERPROM, CE.EMCO_LUQUIDAPER, CE.EMCO_MENSUAL, CN.CONC_COD, CN.CONC_DEDUC,CN.CONC_PORC, CN.CONC_ENTIDAD, CN.CONC_MONTO,  CN.CONC_DIAS, 
    CN.CONC_PROMEDIO, CN.CONC_SALARIO, CN.CONC_APORTE, CE.EMCO_TOMSAL, CN.conc_benefic
    from EMPLEADO_CONCEPTOS CE, CONCEPTOS_NOMINA CN
    where (CE.CONC_COD = CN.CONC_COD) and (CE.TERC_NIT = :nitempl) and CN.conc_prov = 'N' and
    ( ((CE.EMCO_FECINI <= :fecliq and CE.EMCO_FECFIN >= :fecliq)) or
    ((CN.CONC_TODOSPER = 'N') and (CE.EMCO_PPAGO = :perfinal)) or ((CN.CONC_TODOSPER = 'S') AND (((:periodicidad = 1) AND (:perfinal < 13)) or ((:periodicidad = 2) AND (:perfinal < 25)))) )
    into :MONTOS, :PORCEN, :ENTIDAD, :NUMEROPROM, :LIQUIDAPER, :MENSUAL ,:CONC_COD, :CONC_DEDUC, :CONC_PORC,
    :CONC_ENTIDAD, :CONC_MONTO, :CONC_DIAS, :CONC_PROMEDIO, :CONC_SALARIO,:CONC_APORTE , :TOMASAL, :conc_beneficio
    do
    begin
    RECNOCT = null;
    RECFEST = null;
    select N.NOEX_RECNOCT, N.NOEX_RECFEST
        from NOMINA_HORASEXT N where N.NOEX_PERIODIO = :perfinal and N.NOEX_ANO = :anofin and N.TERC_NIT = :nitempl
        into :RECNOCT, :RECFEST;
    if (RECNOCT is null) then
        RECNOCT = 0;
    if (RECFEST is null) then
        RECFEST = 0;
    if (CONC_DIAS = 'S') then
        execute procedure DIAS_LABORADOS (:nitempl, :perfinal, :fecliq, :MENSUAL,:CONC_APORTE) returning_values (:diaslaborados);
    else
        BEGIN
        SELECT PPAG_DIAS FROM PERIODO_PAGO WHERE PPAG_COD = :periodicidad INTO :diaslaborados;
        END
    if (:TOMASAL <> 0) then
        begin
        /* SI EL CONCEPTO NOAPLICA EN ESTE PERIODO DEJE EL BASICO EN CERO */
        if ((:PERIODICIDAD = 2) and (:TOMASAL <> 2)) then
            begin
            if ((PERFINAL = 2) or (PERFINAL = 4) or (PERFINAL = 6) or (PERFINAL = 8) or (PERFINAL = 10) or (PERFINAL = 12)
                or (PERFINAL = 14) or (PERFINAL = 16) or (PERFINAL = 18) or (PERFINAL = 20) or (PERFINAL = 22) or (PERFINAL = 24)) then
                BASICO = 0;
            end
        else
            if ((:PERIODICIDAD = 3) and (:TOMASAL <> 1)) then
                begin
                if ((PERFINAL = 1) or (PERFINAL = 5) or (PERFINAL = 9) or (PERFINAL = 13) or (PERFINAL = 17) or (PERFINAL = 21)
                    or (PERFINAL = 25) or (PERFINAL = 29) or (PERFINAL = 33) or (PERFINAL = 37) or (PERFINAL = 41) or (PERFINAL = 45)
                    or (PERFINAL = 49)) then
                    BASICO = 0;
                end
            else
                if ((:PERIODICIDAD = 3) and (:TOMASAL <> 2)) then
                    begin
                    if ((PERFINAL = 2) or (PERFINAL = 6) or (PERFINAL = 10) or (PERFINAL = 14) or (PERFINAL = 18) or (PERFINAL = 22)
                        or (PERFINAL = 26) or (PERFINAL = 30) or (PERFINAL = 34) or (PERFINAL = 38) or (PERFINAL = 42) or (PERFINAL = 46)
                        or (PERFINAL = 50)) then
                        BASICO = 0;
                    end
                else
                    if ((:PERIODICIDAD = 3) and (:TOMASAL <> 3)) then
                        begin
                        if ((PERFINAL = 3) or (PERFINAL = 7) or (PERFINAL = 11) or (PERFINAL = 15) or (PERFINAL = 19) or (PERFINAL = 23)
                            or (PERFINAL = 27) or (PERFINAL = 31) or (PERFINAL = 35) or (PERFINAL = 39) or (PERFINAL = 43) or (PERFINAL = 47)
                            or (PERFINAL = 51)) then
                            BASICO = 0;
                        end
                    else
                        if ((:PERIODICIDAD = 3) and (:TOMASAL <> 4)) then
                            begin
                            if ((PERFINAL = 4) or (PERFINAL = 8) or (PERFINAL = 12) or (PERFINAL = 16) or (PERFINAL = 20) or (PERFINAL = 24)
                                or (PERFINAL = 29) or (PERFINAL = 32) or (PERFINAL = 36) or (PERFINAL = 40) or (PERFINAL = 44) or (PERFINAL = 48)
                                or (PERFINAL = 52)) then
                                BASICO = 0;
                            end
        end
    else
        begin
        /* SE CALCULA SOBRE TODOS LOS PERIODOS */
        BASICO = salario;
        end
    VALORPREDET = null;
    select VP.NVPR_MONTO from NOMINA_VALOR_PREDET VP where VP.NVPR_PERIODICIDAD = :PERIODICIDAD and VP.NVPR_PERIODO = :perfinal and VP.NVPR_ANO = :anofin and VP.CONC_COD = :CONC_COD and VP.TERC_NIT = :nitempl
        into :VALORPREDET;
    if ((:VALORPREDET <> 0) and (VALORPREDET is not null)) then
        VALOR = VALORPREDET;
    else
        begin
        /* SI HAY UN CAMBIO TRANSITORIO DE SALARIO AJUSTE LOS DIAS Y CALCULE EL VALOR A SUMAR */
        select ((N.NONO_VALOR /30) * ND.NNDE_DURACION), (ND.NNDE_DURACION) from NOMINA_NOVEDADES N, nomina_novedades_detalle ND
            where N.nono_id = ND.nono_id AND N.TNOV_COD = 11 and N.TERC_NIT = :NITEMPL and ND.NNDE_PERIODO = :PERFINAL
            into :CAMBSALTRANS, :DURANOV;
        if (CAMBSALTRANS is null) then
            CAMBSALTRANS = 0;
        if (DURANOV is null) then
            DURANOV = 0;
        diaslaborados = :diaslaborados - :DURANOV;
        /* SI ES UN PRESTAMO, IGNORELO YA QUE SE DESCONTARA EL TOTAL DEL SALDO */
        if (CONC_COD <> 922) then
            begin
            if ((:MONTOS = 0) or (:MONTOS is null)) then
                begin
                /* SI EL CONCEPTO DEL EMPLEADO NO TIENE MONTO TRAIGA EL DE CONCEPTOS_NOMINA */
                if ((CONC_PORC = 0 and :PORCEN = 0) or (CONC_PORC is null and :PORCEN = 0) or (CONC_PORC = 0 and :PORCEN is null) or (CONC_PORC is null and :PORCEN is null) ) then
                    begin
                    /* SIN PORCENTAJE */
                    if ((CONC_MONTO <> 0) and (CONC_MONTO is not null) ) then
                        begin
                        VALOR = :CONC_MONTO;
                        if (:CONC_DIAS = 'S') then
                            VALOR = (:VALOR / 30) * :diaslaborados;
                        end
                    else
                        if (CONC_SALARIO = 'S' and CONC_COD <> 900 and CONC_COD <> 920 and CONC_COD <> 932 and CONC_COD <> 953) then
                            begin
                            /* SI ES SALARIO SUME LAS EXTRAS */
                            BASICO = SALARIO;
                            BASICO = ((:BASICO/30)*:diaslaborados);
                            CONC_MONTO = :BASICO;
                            VALOR = (:CONC_MONTO/*/30 * :diaslab*/ ) + :CAMBSALTRANS;
                            end
                        else
                            begin
                            VALOR = MONTOS;
                            if (:CONC_DIAS = 'S') then
                                VALOR = (:VALOR / 30) * :diaslaborados;
                            end
                    end
                else
                    begin
                    if (:PORCEN <> 0) then
                        begin
                        /* SI TIENE PORCENTAJE EN EMPLEADO_CONCEPTOS PERO EL MONTO SE TRAE DE CONCPETOS_NOMINA */
                        if ((CONC_MONTO <> 0) and (CONC_MONTO is not null) ) then
                            begin
                            VALOR = ((:CONC_MONTO ) * :PORCEN) /100;
                            end
                        end
                    else
                        begin
                        /* NO TIENE PORCENTAJE EN EMPLEADO_CONCEPTOS SE TRAE MONTO Y PORC DE CONCPETOS_NOMINA */
                        if ((CONC_MONTO <> 0) and (CONC_MONTO is not null) ) then
                            begin
                            VALOR = ((:CONC_MONTO) * :CONC_PORC) /100;
                            end
                        else
                            if (CONC_SALARIO = 'S' and CONC_COD <> 900 and CONC_COD <> 920 and CONC_COD <> 932 and CONC_COD <> 953) then
                                begin
                                BASICO = SALARIO;
                                BASICO = ((:BASICO/30)*:diaslaborados);
                                CONC_MONTO = :BASICO;
                                VALOR = ((:CONC_MONTO)+ :CAMBSALTRANS * :CONC_PORC) /100;
                                end
                            else
                                if (:CONC_MONTO = 0 and :MONTOS = 0) then
                                    begin
                                    CONC_MONTO = :BASICO;
                                    VALOR = (((:CONC_MONTO / 30) * :diaslaborados) + :CAMBSALTRANS * :CONC_PORC) /100;
                                    end
                        end
                    end
                end
            else
                /* SI TIENE MONTO EN EMPLEADO_CONCEPTOS */
                if ((CONC_PORC = 0 or (CONC_PORC is null)) and (:PORCEN = 0 or (PORCEN is null))) then
                    begin
                    VALOR = (:MONTOS);
                    if (:CONC_DIAS = 'S') then
                        VALOR = (:VALOR / 30) * :diaslaborados;
                    end
                else
                    if (:PORCEN <> 0 and PORCEN is not null) then
                        begin
                        VALOR = ((:MONTOS ) * :PORCEN) /100;
                        end
                    else
                        begin
                        VALOR = ((:MONTOS) * :CONC_PORC) /100;
                        end
             end

        if (CONC_PROMEDIO = 'S') then
            begin
            /* CALCULO DEL PROMEDIO BASE DESDE LA FECHA MENOS EL NUMERO DE PERIODOS */
            EXECUTE PROCEDURE periodo_nom_fecha (:fecliq, :periodicidad) returning_values (:perfinal, :anofin);
            if (perfinal < numeroprom) then
                BEGIN
                anoini = anofin - 1;
                if (periodicidad = 1) then
                    perinicial = 12 - (numeroprom - perfinal) + 1;
                if (periodicidad = 2) then
                    perinicial = 24 - (numeroprom - perfinal) + 1;
                if (periodicidad = 3) then
                    perinicial = 52 - (numeroprom - perfinal) + 1;
                END
            ELSE
                BEGIN
                PERINICIAL = :perfinal - :NUMEROPROM + 1;
                anoini = ANOFIN;
                END
            if (anoini <> anofin) then
                select sum (NOCO_VALOR) from NOMINA_CONCEPTOS N where N.NOCO_APLICAPROM = 'S' and
                    ((N.NOCO_PERIODO >= :PERINICIAL and N.NOCO_ANO = :anoini) or
                    (N.NOCO_PERIODO <= :perfinal and N.NOCO_ANO = :anofin)) and TERC_NIT = :NITEMPL into :VALOR;
            else
                select sum (NOCO_VALOR) from NOMINA_CONCEPTOS N where N.NOCO_APLICAPROM = 'S' and
                    N.NOCO_PERIODO >= :PERINICIAL and N.NOCO_ANO = :anoini
                    and N.NOCO_PERIODO <= :perfinal and TERC_NIT = :NITEMPL into :VALOR;
            /* sume el saldo inicial */
            SALDOSINI = 0;
            select NOCO_VALOR from NOMINA_CONCEPTOS where CONC_COD = :CONC_COD and TERC_NIT  = :NITEMPL and NOCO_PAGOOK = 'N' and NOCO_PERIODO = 0 into :SALDOSINI;
            if (SALDOSINI is null) then
                SALDOSINI = 0;
            else
                update NOMINA_CONCEPTOS N set NOCO_PAGOOK = 'S' where N.NOCO_APLICAPROM = 'S' and
                    CONC_COD = :CONC_COD and TERC_NIT = :NITEMPL and NOCO_PERIODO = 0;
            VALOR = :VALOR + :SALDOSINI;
            /* APLIQUE LA PROPORCION Y EL PORCENTAJE */
            VALOR = VALOR / NUMEROPROM;
            VALOR = VALOR * PORCEN / 100;
            end
        else if (CONC_APORTE = 'S') then
            begin
            HORASEX = null;
            DIASNOV = null;
            RETROACT = null;
            REEMBOLSO = null;
            BENEFICIOS = null;
            RECARGO = null;
            COMISION = null;
            INCAP = null;
            if ((:ENTIDAD = '' ) or (ENTIDAD is null)) then
                begin
                /*COMISIONES*/
                if (MENSUAL = 'S') then
                    BEGIN
                    if (PERIODICIDAD = 1) then
                        BEGIN
                        perinicial = PERFINAL;
                        PERFINAL = PERFINAL;
                        END
                    if (PERIODICIDAD = 2) then
                        BEGIN
                        perinicial = PERFINAL - (LIQUIDAPER - 1);
                        PERFINAL = PERFINAL + (2 - LIQUIDAPER);
                        END
                    if (PERIODICIDAD = 3) then
                        BEGIN
                        perinicial = PERFINAL - (LIQUIDAPER - 1);
                        PERFINAL = PERFINAL + (4 - LIQUIDAPER);
                        END
                    END
                ELSE
                    BEGIN
                    perinicial = PERFINAL;
                    PERFINAL = PERFINAL;
                    END
                /* SUME LAS COMISIONES DE LOS DEMAS PERIODOS DEL MES */
                select SUM(C.NCOM_MONTO) from NOMINA_COMISIONES C where C.NCOM_ANO = :anofin
                    and C.NCOM_PERIODO >= :PERINICIAL AND C.NCOM_PERIODO <= :PERFINAL
                    and C.NCOM_PERIODICIDAD = :PERIODICIDAD and C.TERC_NIT = :NITEMPL
                    into :COMISION;
                if (COMISION is null) then
                    COMISION = 0;
                /*RETROACTIVO*/
                select C.EMCO_MONTO from EMPLEADO_CONCEPTOS C where C.TERC_NIT = :NITEMPL
                    and C.CONC_COD = 933 into :RETROACT;
                if (RETROACT is null ) then
                    RETROACT = 0;
                /* REEMBOLSO*/
                select C.EMCO_MONTO from EMPLEADO_CONCEPTOS C where C.TERC_NIT = :NITEMPL
                    and C.CONC_COD = 952 into :REEMBOLSO;
                if (REEMBOLSO is null ) then
                    REEMBOLSO = 0;
                /* INCAPACIDAD*/
                select ND.NNDE_DURACION from NOMINA_NOVEDADES N, nomina_novedades_detalle ND
                    where N.nono_id = ND.nono_id AND N.TERC_NIT = :NITEMPL
                    and ND.NNDE_PERIODO = :PERFINAL and ND.NNDE_ANO = :anofin and (N.TNOV_COD = 2 or (N.TNOV_COD = 3))
                    into :DIASNOV;
                if (:DIASNOV is null) then
                    INCAP = 0;
                else
                    INCAP = (:BASICO / 30)* :DIASNOV;
                /*BASICO*/
                if (SALINTEG = 'S') then
                    BASICO = BASICO * (tar_salinteg / 100);
                BASICO = ((:BASICO/30)*:diaslaborados);
                /*HORAS EXTRA*/
                select SUM(C.NOEX_MONTO) from NOMINA_HORASEXT C where C.NOEX_ANO = :anofin
                    and C.NOEX_PERIODIO >= :PERINICIAL and C.NOEX_PERIODIO <= :PERFINAL
                    and C.NOEX_PERIODICIDAD = :PERIODICIDAD and C.TERC_NIT = :NITEMPL
                    into :HORASEX;
                if (HORASEX is null) then
                    HORASEX = 0;
                /*RECARGOS*/
                BASICOREC = SALARIO;
                RECARGO = (((:BASICOREC/30)/8)*:TAR_RECNOTC)*:RECNOCT;
                RECARGO = :RECARGO + ((((:BASICOREC/30)/8)*:TAR_RECFEST)*:RECFEST);
                if (RECARGO is null) then
                    RECARGO = 0;
                /* SMLV Y AUX. TRANSPORTE*/
                select P.PAAN_SALMINIMO from PARAMETROS_ANO P
                    where P.PAAN_ANO = :anofin into :SMLV;
                /*basico*/
                if (:BASICO + :COMISION + :HORASEX + :RETROACT+ :REEMBOLSO + :INCAP+ :CAMBSALTRANS < ((:SMLV/30)*:diaslaborados)) then
                    BASICO = (:SMLV/30)*:diaslaborados;
                /*BASE*/
                VALOR = :BASICO + :COMISION + :HORASEX + :RETROACT+ :REEMBOLSO + :INCAP + :RECARGO + :CAMBSALTRANS;

                if (CONC_COD = 904) then
                    begin
                    select A.PAAN_AFPTR from PARAMETROS_ANO A where A.PAAN_ANO = :anofin into :PORCEN;
                    AFPEMPL = ((:VALOR) * :PORCEN) /100;
                    end
                else if ((CONC_COD = 905) or (CONC_COD = 906) or (CONC_COD = 934) ) then
                    begin
                    select A.PAAN_AFPEM from PARAMETROS_ANO A where A.PAAN_ANO = :anofin into :PORCEN;
                    EMPRAFP = ((:VALOR) * :PORCEN) /100;
                    end
                else if ((CONC_COD = 908) or (CONC_COD = 909) or (CONC_COD = 935) ) then
                    begin
                    select A.PAAN_AFPEM from PARAMETROS_ANO A where A.PAAN_ANO = :anofin into :PORCEN;
                    EMPRAFP = ((:VALOR) * :PORCEN) /100;
                    end
                else if ((CONC_COD = 907) or (CONC_COD = 914) or (CONC_COD = 915) or (conc_cod = 938)) then
                    begin
                    if (CONC_COD = 907) then
                        begin
                        select A.PAAN_EPSTR from PARAMETROS_ANO A where A.PAAN_ANO = :anofin into :PORCEN;
                        EPSEMPL = ((:VALOR) * :PORCEN) /100;
                        end
                    else
                        begin
                        select A.PAAN_EPSEM from PARAMETROS_ANO A where A.PAAN_ANO = :anofin into :PORCEN;
                        EMPREPS = ((:VALOR) * :PORCEN) /100;
                        end
                    end
                else if ((CONC_COD = 910) or (CONC_COD = 911) or (CONC_COD = 936)) then
                    begin
                    /*ccf */
                    select A.PAAN_CCF from PARAMETROS_ANO A where A.PAAN_ANO = :anofin into :PORCEN;
                    EMPRCCF = ((:VALOR) * :PORCEN) /100;
                    end
                else if ((CONC_COD = 916) or (CONC_COD = 917) or (CONC_COD = 939) ) then
                    begin
                    /*icbf */
                    select A.PAAN_ICBF from PARAMETROS_ANO A where A.PAAN_ANO = :anofin into :PORCEN;
                    EMPRICBF = ((:VALOR) * :PORCEN) /100;
                    end
                else if ((CONC_COD = 918) or (CONC_COD = 919) or (CONC_COD = 940) ) then
                    begin
                    /*sena */
                    select A.PAAN_SENA from PARAMETROS_ANO A where A.PAAN_ANO = :anofin into :PORCEN;
                    EMPRSENA = ((:VALOR) * :PORCEN) /100;
                    end
                else if ((CONC_COD = 912) or (CONC_COD = 913) or (CONC_COD = 937)) then
                    begin
                    /* CESANTIAS SE PAGAN NO SE APORTAN*/
                    VALOR = 0;
                    end
                else
                    begin
                    if (COMISION is null) then
                        COMISION = 0;
                    select C.NCOM_MONTO from NOMINA_COMISIONES C where C.NCOM_ANO = :anofin and C.NCOM_PERIODO = :PERFINAL and C.NCOM_PERIODICIDAD = :PERIODICIDAD and C.TERC_NIT = :NITEMPL
                        into :COMISION;
                    CONC_MONTO = :BASICO + :COMISION;
                    if (CONC_PORC <> 0 and CONC_PORC is not null) then
                        VALOR = (((:CONC_MONTO/30 * :diaslaborados )+ :CAMBSALTRANS + :INCAP) * :CONC_PORC) /100;
                    else
                        if (:PORCEN <> 0 and :PORCEN is not null) then
                            VALOR = (((:CONC_MONTO/30 * :diaslaborados )+ :CAMBSALTRANS + :INCAP) * :PORCEN) /100;
                        else
                            if (:MONTOS <> 0 and :MONTOS is not null) then
                                VALOR = :MONTOS;
                            else
                                if (:CONC_MONTO <> 0 and :CONC_MONTO is not null) then
                                    VALOR = :CONC_MONTO;
                    end
                end
            end /* aportes */
        else if (CONC_COD = 920) then /* comisiones */
            begin
            select C.NCOM_MONTO from NOMINA_COMISIONES C where C.NCOM_ANO = :ANOFIN and C.NCOM_PERIODO = :PERFINAL and C.NCOM_PERIODICIDAD = :PERIODICIDAD and C.TERC_NIT = :NITEMPL into :VALOR;
            if (VALOR is null) then
                VALOR = 0;
            end
        else if (CONC_COD = 900 or (:CONC_COD = 931)) then /* horas extra */
            begin
            select C.NOEX_MONTO from NOMINA_HORASEXT C where C.NOEX_ANO = :anofin and
                C.NOEX_PERIODIO = :PERFINAL and C.NOEX_PERIODICIDAD = :PERIODICIDAD and C.TERC_NIT = :NITEMPL into :VALOR;
            if (VALOR is null) then
                VALOR = 0;
            end
        else if (CONC_COD = 954) then /* cartera */
            begin
            select C.NCAR_MONTO from NOMINA_CARTERA C where C.NCAR_ANO = :anofin and C.NCAR_PERIODO = :PERFINAL and C.NCAR_PERIODICIDAD = :PERIODICIDAD and C.TERC_NIT = :NITEMPL into :VALOR;
            if (VALOR is null) then
                VALOR = 0;
            end
        else if (CONC_COD = 932) then
            begin
            /* incapacidad */
            select ND.NNDE_DURACION from NOMINA_NOVEDADES N, nomina_novedades_detalle ND
                where N.nono_id = ND.nono_id AND N.TERC_NIT = :NITEMPL and ND.NNDE_PERIODO = :PERFINAL and ND.NNDE_ANO = :anofin
                and (N.TNOV_COD = 2 or (N.TNOV_COD = 3)) into :DIASNOV;
            if (:DIASNOV is null) then
                VALOR = 0;
            else
                VALOR = (:BASICO / 30)* :DIASNOV;
            end
        else if (CONC_COD = 921) then
            begin
            if (PORCEN is not null and PORCEN <> 0) then
                VALOR = ((BASICO / 30)* :diaslaborados ) * :PORCEN /100;
            else
                if (CONC_PORC is not null and CONC_PORC <> 0) then
                    VALOR = ((BASICO / 30)* :diaslaborados ) * :CONC_PORC /100;
            end
        else if (CONC_COD = 953) then
            begin
            /*RECARGO */
            BASICO = SALARIO;
            VALOR = (((:BASICO/30)/8)*:TAR_RECNOTC)*:RECNOCT;
            VALOR = :VALOR + ((((:BASICO/30)/8)*:TAR_RECFEST)*:RECFEST);
            end
        if (CONC_APORTE = 'S') then
            begin
            if (ENTIDAD is null or (ENTIDAD = '') ) then
                ENTIDAD = :CONC_ENTIDAD;
            end
        end
    if ((VALOR <> 0) and (VALOR is not null)) then
        begin
        execute procedure REDONDEE(:VALOR, 0) returning_values (VALOR);
        if (CONC_APORTE = 'N') then
            BEGIN
            if (conc_beneficio = 'S') then
                beneficios = beneficios + VALOR;
            ELSE
                if (CONC_DEDUC = 'S') then
                    BEGIN
                    OTROSDED = OTROSDED + VALOR;
                    END
                ELSE
                    BEGIN
                    if (conc_salario = 'S') then
                        SUELDO = SUELDO + VALOR;
                    else
                        OTROSDEV = OTROSDEV + VALOR;
                    END
            END
        end
    end

/* calcule el promedio de sueldo */
if (periodicidad = 1) then
    numeroprom = 6;
if (periodicidad = 2) then
    numeroprom = 12;
if (periodicidad = 3) then
    numeroprom = 24;

EXECUTE PROCEDURE periodo_nom_fecha (:fecliq, :periodicidad) returning_values (:perfinal, :anofin);
if (perfinal < numeroprom) then
    BEGIN
    anoini = anofin - 1;
    if (periodicidad = 1) then
        perinicial = 12 - (numeroprom - perfinal) + 1;
    if (periodicidad = 2) then
        perinicial = 24 - (numeroprom - perfinal) + 1;
    if (periodicidad = 3) then
        perinicial = 52 - (numeroprom - perfinal) + 1;
    END
ELSE
    BEGIN
    PERINICIAL = :perfinal - :NUMEROPROM + 1;
    anoini = ANOFIN;
    END
if (anoini <> anofin) then
    select sum (NOCO_VALOR) from NOMINA_CONCEPTOS N where N.NOCO_APLICAPROM = 'S' and
        ((N.NOCO_PERIODO >= :PERINICIAL and N.NOCO_ANO = :anoini) or
        (N.NOCO_PERIODO <= :perfinal and N.NOCO_ANO = :anofin)) and TERC_NIT = :nitempl into :SALARIO;
else
    select sum (NOCO_VALOR) from NOMINA_CONCEPTOS N where N.NOCO_APLICAPROM = 'S' and
        N.NOCO_PERIODO >= :PERINICIAL and N.NOCO_ANO = :anoini
        and N.NOCO_PERIODO <= :perfinal and TERC_NIT = :nitempl into :SALARIO;
if (SALARIO is null) then
    SALARIO = 0;
SALARIO = SALARIO / 6; /* siempre es mensual sin importar la periodicidad */
/* PRIMA */
/* CALCULE FECHA DEL ULTIMO PAGO DE PRIMA */
SELECT MAX(N.nomi_feccausa) FROM NOMINA N, NOMINA_CONCEPTOS NC, CONCEPTOS_NOMINA C
    WHERE N.nomi_id = NC.nomi_id AND NC.terc_nit = :nitempl AND NC.conc_cod = C.conc_cod AND
    UPPER(C.conc_nombre) LIKE '%PRIMA%' AND NC.noco_deduc = 'N' AND NC.noco_aporte = 'N' AND NC.noco_prov = 'N'
    INTO :FECPRIMA;
DIASAUX = fecliq - fecprima;
prima = :salario * diasaux / 360;
EXECUTE PROCEDURE REDONDEE(:prima, -1) RETURNING_VALUES (:prima);
/* CESANTIA */
/* CALCULE FECHA DEL ULTIMO PAGO DE PRIMA */
SELECT MAX(N.nomi_feccausa) FROM NOMINA N, NOMINA_CONCEPTOS NC, CONCEPTOS_NOMINA C
    WHERE N.nomi_id = NC.nomi_id AND NC.terc_nit = :nitempl AND NC.conc_cod = C.conc_cod AND
    UPPER(C.conc_nombre) LIKE '%CESANTIA%' AND NC.noco_deduc = 'N' AND NC.noco_aporte = 'N' AND NC.noco_prov = 'N'
    INTO :fecces;
DIASAUX = fecliq - fecces;
cesantia = :salario * diasaux / 360;
EXECUTE PROCEDURE REDONDEE(:cesantia, -2) RETURNING_VALUES (:cesantia);
/* INTERESES SOBRE LA CESANTIA */
intcesant = CESANTIA * diasaux * 0.12 / 360;
EXECUTE PROCEDURE REDONDEE(:intcesant, -2) RETURNING_VALUES (:intcesant);
/* VACACIONES */
/* CALCULE FECHA DE LAS ULTIMAS VACACIONES */
SELECT MAX(VACA_FECHA) FROM VACACIONES WHERE terc_nit = :nitempl INTO :fecvac;
if (fecvac IS NULL) then
    select e.empl_fecing from empleados e where terc_nit = :nitempl into :fecvac;
DIASAUX = fecliq - fecvac;
vacacion = :salario * diasaux / 720;
EXECUTE PROCEDURE REDONDEE(:vacacion, -2) RETURNING_VALUES (:vacacion);
/* PRESTAMOS */
SELECT SUM (PRCU_MONTO) FROM PRESTAMO_CUOTAS P, PRESTAMO_NOMINA PN WHERE PN.prno_id = P.prno_id AND PN.terc_nit = :nitempl AND P.prcu_ok = 'N' INTO :dsprestamo;
IF (dsprestamo IS NULL) THEN
dsprestamo = 0;

totpagos = :PRIMA + :CESANTIA + :INTCESANT + :VACACION + :SUELDO + :otrosdev;
totdesc = :EPSEMPL + :AFPEMPL + :DSPRESTAMO + otrosded;
total = :totpagos - :totdesc;
totempr = :EMPREPS + :EMPRAFP + :EMPRCCF + :EMPRSENA + :EMPRICBF;
SUSPEND;
END
^

SET TERM ; ^


/* 20100726 */
/* ERROR TOTALES DEV Y EMPL INVERTIDOS EN PLANILLA DE PAGO */
SET TERM ^ ;

CREATE OR ALTER procedure IMPR_PLANILLA_NOMINA (
    ID integer,
    PAGO char(1),
    CTA char(1),
    EMPL char(1),
    DPTO varchar(20))
returns (
    FECHA date,
    OBSERVACIONES blob sub_type 0 segment size 80,
    PAGOGLOBAL char(1),
    PERIODO integer,
    ANO char(4),
    PERIODICIDAD varchar(60),
    NITEMPL varchar(20),
    VALOR numeric(18,2),
    DEDUC char(1),
    NOMBREEMPL varchar(60),
    NOMCORTCONC varchar(60),
    NOMBRECONC varchar(60),
    CODCONC integer,
    PROV char(1),
    TOTALEMPL numeric(18,2),
    TOTALDEDUC numeric(18,2),
    TOTALDEVENG numeric(18,2),
    NUMEMPL integer,
    CTAEMPL varchar(25),
    TOTALCTAS numeric(18,2),
    TOTALNOMI numeric(18,2),
    TOTALAPOR numeric(18,2),
    NOMPER varchar(60),
    ORG integer,
    CARGOEMPL varchar(60),
    DEPTOEMPL varchar(60),
    NUMCOP integer,
    NOMBRE_COPIA varchar(60),
    DIASLAB integer,
    SALARIO numeric(18,2),
    BENEFICIO char(1),
    BASE numeric(18,2),
    CODDPTOEMPL integer,
    ORDEN integer)
AS
declare variable nitant varchar(20);
declare variable nitnue varchar(20);
declare variable numconc integer;
declare variable totalnomineg numeric(18,2);
declare variable totalaporneg numeric(18,2);
declare variable par integer;
declare variable impar integer;
declare variable antdeduc char(1);
declare variable nitdeduc varchar(20);
declare variable nittot varchar(20);
declare variable nitaux varchar(20);
BEGIN
SELECT N.nuco_copia FROM NUMERO_COPIA N WHERE N.tido_cod = 92 AND N.nuco_id = :id INTO :NUMCOP;
IF (numcop IS NULL) THEN
  BEGIN
  numcop = 0;
  INSERT INTO NUMERO_COPIA (TIDO_COD, NUCO_ID, NUCO_COPIA) VALUES (92,:id,:numcop);
  END
ELSE
  BEGIN
  numcop = :numcop + 1;
  UPDATE numero_copia N SET N.nuco_copia = :numcop WHERE N.tido_cod = 92 AND N.nuco_id = :id;
  END
SELECT N.noco_nombre FROM nombres_copias N WHERE N.noco_id = :numcop INTO :nombre_copia;
numempl = 0;
nitant = 0;
nitnue = 0;
IF (PAGO = 'N') THEN
  BEGIN
  FOR SELECT N.nomi_feccausa, N.nomi_obs, N.nomi_pagoglobal, N.nomi_periodo, N.nomi_ano, P.ppag_nombre, PN.pnom_nombre
    FROM NOMINA N, periodo_pago P, periodo_pago_nombre PN
    WHERE P.ppag_cod = N.nomi_periodocidad AND N.nomi_id = :ID AND PN.ppag_cod = N.nomi_periodocidad AND PN.ppag_periodo = N.nomi_periodo
    INTO :fecha, :observaciones, :pagoglobal, :periodo, :ano, :periodicidad, :NOMPER
    DO
    BEGIN
    SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id INTO :totalnomi;
    SELECT SUM(NC.noco_valor*-1) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_APORTE = 'S' AND NOCO_VALOR < 0 AND NOMI_ID = :id INTO :totalaporneg;
    SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_APORTE = 'S' AND NOCO_VALOR > 0 AND NOMI_ID = :id INTO :totalapor;
    totalapor = :totalapor + totalaporneg;
    FOR SELECT NC.terc_nit, NC.noco_valor, NC.noco_deduc, T.terc_nom, C.conc_nomcorto, C.conc_nombre, NC.conc_cod, NC.noco_prov, C.conc_orden+1
      FROM NOMINA_CONCEPTOS NC, TERCEROS T, CONCEPTOS_NOMINA C
      WHERE NC.nomi_id = :ID AND C.conc_cod = NC.conc_cod AND t.terc_nit = nc.terc_nit
      ORDER BY NC.NOCO_DEDUC, NC.conc_cod,  T.TERC_NOM
      INTO :nitempl, :valor, :deduc, :nombreempl, :nomcortconc, :nombreconc, :codconc, :prov, :orden
      DO
      BEGIN
      IF (valor IS NULL) THEN
        valor = 0;
      cargoempl = '';
      select empl_cargo from EMPLEADOS where terc_nit = :nitempl into :cargoempl;
      SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND TERC_NIT = :nitempl INTO :totalempl;
      SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND TERC_NIT = :nitempl AND NC.noco_deduc = 'S' INTO :totaldeduc;
      SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND TERC_NIT = :nitempl AND NC.noco_deduc = 'N' INTO :totaldeveng;
      SUSPEND;
      END
    /* totales por concepto
    nitempl = '';
    valor = NULL;
    deduc = '';
    nombreempl = NULL;
    nomcortconc = NULL;
    nombreconc = NULL;
    codconc = NULL;
    prov = NULL;
    FOR SELECT MAX(conc_cod), SUM(noco_valor) FROM NOMINA_CONCEPTOS WHERE nomi_id = :id
      GROUP BY conc_cod
      INTO :codconc, :valor
      DO
      BEGIN
      nitempl = '';
      nombreempl = '';
      deduc = 'N';
      prov = 'N';
      SELECT C.conc_nombre,C.conc_nomcorto FROM CONCEPTOS_NOMINA C WHERE C.conc_cod = :codconc INTO :nombreconc,:nomcortconc;
      SUSPEND;
      END
    IF (EMPL = 'N') THEN
      BEGIN
      deduc = 'N';
      nomcortconc = 'DIAS LAB.';
      nombreconc = 'DIAS LAB.';
      codconc = 0;
      prov = 'N';
      valor = NULL;
      nitempl = '';
      nombreempl = '';
      SUSPEND;
      deduc = 'N';
      nomcortconc = 'SDO BASE';
      nombreconc = 'SDO BASE';
      codconc = 0;
      prov = 'N';
      valor = NULL;
      nitempl = '';
      nombreempl = '';
      SUSPEND;
      END
    /* dias laborados y salario base */
    FOR SELECT ND.node_diaslab, ND.terc_nit, T.terc_nom FROM NOMINA_DETALLE ND, TERCEROS T
        WHERE NOMI_ID = :id AND T.terc_nit = ND.terc_nit
      INTO :diaslab, :nitaux, :nombreempl
      DO
      BEGIN
      nitempl = :nitaux;
      nomcortconc = 'DIAS LAB.';
      valor = :diaslab;
      ORDEN = 0;
      SUSPEND;
      SELECT FIRST 1  m.mvse_salario FROM MOVIMIENTO_SALARIO_EMPLEADO M WHERE M.terc_nit = :nitaux AND M.mvse_fecha <= :fecha ORDER BY M.mvse_fecha DESC INTO :salario;
      nitempl = :nitaux;
      nomcortconc = 'SDO BASE';
      ORDEN = 1;
      valor = :salario;
      SUSPEND;
      END
    END
  END
ELSE
  IF (PAGO = 'S') THEN
    BEGIN
    par = 2;
    impar = 1;
    SELECT N.nomi_feccausa, N.nomi_obs, N.nomi_pagoglobal, N.nomi_periodo, N.nomi_ano, P.ppag_nombre, PN.pnom_nombre
        FROM NOMINA N, periodo_pago P, periodo_pago_nombre PN
        WHERE P.ppag_cod = N.nomi_periodocidad AND N.nomi_id = :ID AND PN.ppag_cod = N.nomi_periodocidad AND PN.ppag_periodo = N.nomi_periodo
        INTO :fecha, :observaciones, :pagoglobal, :periodo, :ano, :periodicidad, :NOMPER;
    IF (EMPL = 'N') THEN
        BEGIN
        deduc = 'N';
        nomcortconc = 'DIAS LAB.';
        nombreconc = 'DIAS LAB.';
        codconc = 0;
        prov = 'N';
        valor = NULL;
        nitempl = '';
        nombreempl = '';
        SUSPEND;
        deduc = 'N';
        nomcortconc = 'SDO BASE';
        nombreconc = 'SDO BASE';
        codconc = 0;
        prov = 'N';
        valor = NULL;
        nitempl = '';
        nombreempl = '';
        SUSPEND;
        deduc = 'N';
        nomcortconc = 'TOTAL DEV';
        nombreconc = 'TOTAL DEV';
        codconc = 9999;
        ORDEN = 20;
        prov = 'N';
        valor = NULL;
        nitempl = '';
        nombreempl = '';
        SUSPEND;
        deduc = 'S';
        nomcortconc = 'TOTAL DEDUC';
        nombreconc = 'TOTAL DEDUC';
        ORDEN = 50;
        codconc = 99999;
        prov = 'N';
        valor = NULL;
        nitempl = '';
        nombreempl = '';
        SUSPEND;
        deduc = 'S';
        nomcortconc = 'TOTAL EMPL';
        nombreconc = 'TOTAL EMPL';
        codconc = 999999;
        ORDEN = 999;
        prov = 'N';
        valor = NULL;
        nitempl = '';
        nombreempl = '';
        SUSPEND;
        FOR SELECT MAX(N.conc_cod), MAX(N.noco_deduc) FROM NOMINA_CONCEPTOS N
            WHERE N.nomi_id = :id AND N.noco_prov = 'N' AND N.noco_gtoempr = 'N'
            GROUP BY N.conc_cod
            INTO :codconc, :deduc
            DO
            BEGIN
            valor = NULL;
            nitempl = '';
            nombreempl = '';
            prov = 'N';
            SELECT C.conc_nombre,C.conc_nomcorto,C.conc_orden+1 FROM CONCEPTOS_NOMINA C
                WHERE C.conc_cod = :codconc INTO :nombreconc,:nomcortconc, :orden;
            SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id INTO :totalempl;
            SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND NC.noco_deduc = 'S' INTO :totaldeduc;
            SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND NC.noco_deduc = 'N' INTO :totaldeveng;
            SUSPEND;
            END
        FOR SELECT ND.node_diaslab,  ND.terc_nit, T.terc_nom
            FROM NOMINA_DETALLE ND, TERCEROS T WHERE NOMI_ID = :id AND T.terc_nit = ND.terc_nit
            INTO :diaslab, :nitaux, :nombreempl
            DO
            BEGIN
            nitempl = :nitaux;
            nomcortconc = 'DIAS LAB.';
            ORDEN = 0;
            valor = :diaslab;
            SUSPEND;
            SELECT FIRST 1  m.mvse_salario FROM MOVIMIENTO_SALARIO_EMPLEADO M WHERE M.terc_nit = :nitaux AND M.mvse_fecha <= :fecha ORDER BY M.mvse_fecha DESC INTO :salario;
            nitempl = :nitaux;
            nomcortconc = 'SDO BASE';
            valor = :salario;
            ORDEN = 1;
            SUSPEND;
            END
        END
    FOR SELECT NC.terc_nit, NC.noco_valor, NC.noco_deduc, T.terc_nom, C.conc_nomcorto, C.conc_nombre, NC.conc_cod, NC.noco_prov, NC.terc_nit, c.conc_benefic, NC.noco_base, C.conc_orden+1
        FROM NOMINA_CONCEPTOS NC, TERCEROS T, CONCEPTOS_NOMINA C
        WHERE NC.nomi_id = :ID AND C.conc_cod = NC.conc_cod AND t.terc_nit = nc.terc_nit AND NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N'
        ORDER BY T.terc_nom
        INTO :nitempl, :valor, :deduc, :nombreempl, :nomcortconc, :nombreconc, :codconc, :prov,:nitnue, :beneficio,:base, :orden
        DO
        BEGIN
        cargoempl = '';
        ctaempl = '';
        deptoempl = '';
        coddptoempl = 0;
        diaslab = 0;
        SELECT node_diaslab FROM NOMINA_DETALLE WHERE nomi_id = :id AND terc_nit = :nitempl INTO :diaslab;
        select e.empl_cargo, e.empl_cuenta, D.dpto_nombre, d.dpto_cod
            from EMPLEADOS e, DEPARTAMENTO D
            where D.dpto_cod = E.empl_dpto AND e.terc_nit = :nitempl into :cargoempl,:ctaempl,:deptoempl,:coddptoempl;
        SELECT FIRST 1  m.mvse_salario FROM MOVIMIENTO_SALARIO_EMPLEADO M WHERE M.terc_nit = :nitempl AND M.mvse_fecha <= :FECHA ORDER BY M.mvse_fecha DESC INTO :salario;
        IF ((nitnue <> nitant) AND (nitnue IS NOT NULL)) THEN
            numempl = :numempl + 1;
        IF (valor IS NULL) THEN
            valor = 0;
        IF (nitempl <> nitdeduc) THEN
            BEGIN
            par = 2;
            impar = 1;
            END
        nitdeduc = :nitempl;
        IF (:deduc = 'S') THEN
            BEGIN
            antdeduc = 'S';
            org = :par;
            par = :par + 2;
            END
        ELSE
            BEGIN
            antdeduc = 'N';
            org = :impar;
            impar = :impar + 2;
            END
       SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND TERC_NIT = :nitempl INTO :totalempl;
       SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND TERC_NIT = :nitempl AND NC.noco_deduc = 'S' INTO :totaldeduc;
       SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND TERC_NIT = :nitempl AND NC.noco_deduc = 'N' INTO :totaldeveng;
       IF (cta = 'S') THEN
         BEGIN
         SELECT COUNT(CONC_COD) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND TERC_NIT = :nitempl INTO :numconc;
         totalempl = totalempl / :numconc;
         SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND TERC_NIT = :nitempl INTO :totalctas;
         END
       SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id INTO :totalnomi;
       SELECT SUM(NC.noco_valor*-1) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_APORTE = 'S' AND NOCO_VALOR < 0 AND NOMI_ID = :id INTO :totalaporneg;
       SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_APORTE = 'S' AND NOCO_VALOR > 0 AND NOMI_ID = :id INTO :totalapor;
       totalapor = :totalapor + totalaporneg;
       SUSPEND;
       IF ((nitnue <> nitant) AND (nitnue IS NOT NULL) AND (EMPL = 'N')) THEN
         BEGIN
         deduc = 'N';
         nomcortconc = 'TOTAL DEV';
         nombreconc = 'TOTAL DEV';
         ORDEN = 20;
         codconc = 9999;
         prov = 'N';
         SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND NC.noco_deduc = 'N' AND NC.terc_nit = : nitempl INTO :VALOR;
         SUSPEND;
         deduc = 'S';
         nomcortconc = 'TOTAL DEDUC';
         nombreconc = 'TOTAL DEDUC';
         codconc = 99999;
         ORDEN = 50;
         prov = 'N';
         SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND NC.noco_deduc = 'S' AND NC.terc_nit = :nitempl INTO :VALOR;
         SUSPEND;
         deduc = 'S';
         nomcortconc = 'TOTAL EMPL';
         nombreconc = 'TOTAL EMPL';
         codconc = 999999;
         prov = 'N';
         SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND NC.terc_nit = :nitempl INTO :VALOR;
         ORDEN = 999;
         nitant = :nitnue;
         SUSPEND;
         END
       END
    numempl = :numempl + 1;
    IF (EMPL = 'N') THEN
        BEGIN
        nitempl = '';
        valor = NULL;
        deduc = '';
        nombreempl = NULL;
        nomcortconc = NULL;
        nombreconc = NULL;
        codconc = NULL;
        prov = NULL;
        totalempl = NULL;
        ctaempl = NULL;
        IF (cta = 'N') THEN
          BEGIN
          FOR SELECT MAX(N.conc_cod) FROM NOMINA_CONCEPTOS N WHERE N.nomi_id = :id AND N.noco_prov = 'N' AND N.noco_gtoempr = 'N'
            GROUP BY N.conc_cod
            INTO :codconc
            DO
            BEGIN
            /* TOTALES POR DEPTO */
            IF (dpto IS NOT NULL AND (DPTO <> '') ) THEN
                BEGIN
                SELECT SUM(NC.noco_valor), MAX(NC.noco_deduc) FROM NOMINA_CONCEPTOS NC, EMPLEADOS E, DEPARTAMENTO D
                    WHERE NC.nomi_id = :ID AND NC.conc_cod = :codconc AND D.dpto_cod = E.empl_dpto AND NC.terc_nit = E.terc_nit AND d.dpto_cod = :dpto
                    GROUP BY NC.conc_cod
                    INTO :valor, :deduc;
                nitempl = '-';
                nombreempl = '|  TOTAL  |';
                deptoempl = '-';
                prov = 'N';
                SELECT C.conc_nombre,C.conc_nomcorto FROM CONCEPTOS_NOMINA C WHERE C.conc_cod = :codconc INTO :nombreconc,:nomcortconc;
                SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC, EMPLEADOS E, DEPARTAMENTO D WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id  AND D.dpto_cod = E.empl_dpto AND NC.terc_nit = E.terc_nit INTO :totalempl;
                SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC, EMPLEADOS E, DEPARTAMENTO D WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND NC.noco_deduc = 'S'  AND D.dpto_cod = E.empl_dpto AND NC.terc_nit = E.terc_nit INTO :totaldeduc;
                SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC, EMPLEADOS E, DEPARTAMENTO D WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND NC.noco_deduc = 'N'  AND D.dpto_cod = E.empl_dpto AND NC.terc_nit = E.terc_nit INTO :totaldeveng;
                END
            ELSE
                BEGIN
                SELECT SUM(NC.noco_valor), MAX(NC.noco_deduc) FROM NOMINA_CONCEPTOS NC
                WHERE NC.nomi_id = :ID AND NC.conc_cod = :codconc
                GROUP BY NC.conc_cod
                INTO :valor, :deduc;
                nitempl = '-';
                nombreempl = '|  TOTAL  |';
                deptoempl = '-';
                prov = 'N';
                SELECT C.conc_nombre,C.conc_nomcorto FROM CONCEPTOS_NOMINA C WHERE C.conc_cod = :codconc INTO :nombreconc,:nomcortconc;
                SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id INTO :totalempl;
                SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND NC.noco_deduc = 'S' INTO :totaldeduc;
                SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND NC.noco_deduc = 'N' INTO :totaldeveng;
                END
            SUSPEND;
            END
        IF (dpto IS NOT NULL AND (DPTO <> '') ) THEN
            BEGIN
            deduc = 'N';
             nomcortconc = 'TOTAL DEV';
             nombreconc = 'TOTAL DEV';
             ORDEN = 20;
             codconc = 9999;
             deptoempl = '-';
             prov = 'N';
             SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC, EMPLEADOS E, DEPARTAMENTO D WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND NC.noco_deduc = 'N'  AND D.dpto_cod = E.empl_dpto AND d.dpto_cod = :dpto AND NC.terc_nit = E.terc_nit INTO :VALOR;
             nitempl = '-';
             nombreempl = '|  TOTAL  |';
             SUSPEND;
             deduc = 'S';
             nomcortconc = 'TOTAL DEDUC';
             nombreconc = 'TOTAL DEDUC';
             ORDEN = 50;
             codconc = 99999;
             deptoempl = '-';
             prov = 'N';
             SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC, EMPLEADOS E, DEPARTAMENTO D WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND NC.noco_deduc = 'S'  AND D.dpto_cod = E.empl_dpto AND d.dpto_cod = :dpto AND NC.terc_nit = E.terc_nit INTO :VALOR;
             nitempl = '-';
             nombreempl = '|  TOTAL  |';
             SUSPEND;
             deduc = 'S';
             nomcortconc = 'TOTAL EMPL';
             nombreconc = 'TOTAL EMPL';
             codconc = 999999;
             ORDEN = 999;
             deptoempl = '-';
             prov = 'N';
             SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC, EMPLEADOS E, DEPARTAMENTO D WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id  AND D.dpto_cod = E.empl_dpto AND NC.terc_nit = E.terc_nit AND d.dpto_cod = :dpto INTO :VALOR;
             nitempl = '-';
             nombreempl = '|  TOTAL  |';
             SUSPEND;
             END
        ELSE
             BEGIN
             deduc = 'N';
             nomcortconc = 'TOTAL DEV';
             nombreconc = 'TOTAL DEV';
             codconc = 9999;
             ORDEN = 20;
             prov = 'N';
             SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND NC.noco_deduc = 'N' INTO :VALOR;
             nitempl = '-';
             nombreempl = '|  TOTAL  |';
             SUSPEND;
             deduc = 'S';
             nomcortconc = 'TOTAL DEDUC';
             nombreconc = 'TOTAL DEDUC';
             ORDEN = 50;
             codconc = 99999;
             prov = 'N';
             SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND NC.noco_deduc = 'S' INTO :VALOR;
             nitempl = '-';
             nombreempl = '|  TOTAL  |';
             SUSPEND;
             deduc = 'S';
             nomcortconc = 'TOTAL EMPL';
             nombreconc = 'TOTAL EMPL';
             ORDEN = 999;
             codconc = 999999;
             prov = 'N';
             SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N'  AND NOMI_ID = :id INTO :VALOR;
             nitempl = '-';
             nombreempl = '|  TOTAL  |';
             SUSPEND;
             END
         END
       END
    END
END
^

SET TERM ; ^



/* 20100728 */
update empleados e set proy_cod = (select dpto_proy from departamento where dpto_cod = e.empl_dpto) where proy_cod is null;
update empleados e set cent_cod = (select dpto_centro from departamento where dpto_cod = e.empl_dpto) where cent_cod is null;
commit work;

/* 20100728b */
GRANT EXECUTE ON PROCEDURE rep_histoempl TO PUBLIC;
grant select, delete, insert, update on HORARIO_EMPLEADO to PUBLIC;
grant select, delete, insert, update on HORARIO_EMPLEADO_DET to PUBLIC;
GRANT EXECUTE ON PROCEDURE certifica_laboral TO PUBLIC;
GRANT EXECUTE ON PROCEDURE cambie_id_horarioempl TO PUBLIC;

SET TERM ^ ;

create or alter procedure CERTIFICADOS_RETENCION_LABORAL (
    DESDE date,
    HASTA date,
    NIT varchar(20),
    FECHA date)
returns (
    NITEMPRESA varchar(60),
    RAZONSOCIAL varchar(100),
    DV integer,
    TIPOID varchar(1),
    NITEMPL varchar(20),
    NOMBRE1 varchar(60),
    NOMBRE2 varchar(60),
    APELLIDO1 varchar(60),
    APELLIDO2 varchar(60),
    DESDEANO varchar(4),
    DESDEMES varchar(2),
    DESDEDIA varchar(2),
    HASTAANO varchar(4),
    HASTAMES varchar(2),
    HASTADIA varchar(2),
    FECHAANO varchar(4),
    FECHAMES varchar(2),
    FECHADIA varchar(2),
    IDPAIS integer,
    NOMCIUDAD varchar(60),
    CIUDAD varchar(5),
    DEPTO varchar(2),
    MUNICIPIO varchar(3),
    SALARIOS numeric(18,2),
    VACACION numeric(18,2),
    TOTALVACAC numeric(18,2),
    CESANTIA numeric(18,2),
    OTROS numeric(18,2),
    TOTAL numeric(18,2),
    SALUD numeric(18,2),
    PESION numeric(18,2),
    VOLUNTARIOS numeric(18,2),
    RETENCION numeric(18,2))
AS
declare variable diasvacac integer;
declare variable pervacac integer;
declare variable salvacac numeric(18,2);
BEGIN
  EXECUTE PROCEDURE LEE_CONFIGURACION ('CONTABILIDAD','GENERAL','NIT COMPAÑIA') RETURNING_VALUES (:nitempresa);
  EXECUTE PROCEDURE LEE_CONFIGURACION ('GENERAL','GENERAL','NOMBRE COMPAÑIA') RETURNING_VALUES (:razonsocial);
  EXECUTE PROCEDURE DV (nitempresa) RETURNING_VALUES (:dv);
  nitempl = :nit;
  SELECT T.terc_apellido1,T.terc_apellido2,T.terc_nombre1,T.terc_nombre2, T.terc_tipoid,t.pais_id,T.ciud_cod
  FROM TERCEROS T WHERE T.terc_nit = :nit INTO :apellido1,:apellido2,:nombre1,:nombre2,:tipoid,:idpais,:ciudad;
  desdeano = substr(:desde,1,4);
  desdemes = substr(:desde,6,7);
  desdedia = substr(:desde,9,10);
  hastaano = substr(:hasta,1,4);
  hastames = substr(:hasta,6,7);
  hastadia = substr(:hasta,9,10);
  fechaano = substr(:fecha,1,4);
  fechames = substr(:fecha,6,7);
  fechadia = substr(:fecha,9,10);
  SELECT P.ciud_nom FROM CIUDADES P WHERE P.ciud_cod = :ciudad INTO :nomciudad;
  depto = substr(:ciudad,1,2);
  municipio = substr(:ciudad,3,5);
  totalvacac = 0;
  SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE ((CONC_COD = 1) OR (CONC_COD = 19) OR (CONC_COD = 20) OR (CONC_COD = 22) OR (CONC_COD = 91) OR (CONC_COD = 900) OR (CONC_COD = 920) OR (CONC_COD = 932) OR (CONC_COD = 945) OR (CONC_COD = 946)) AND NC.terc_nit = :nit AND NC.noco_ano >= :desdeano AND NC.noco_ano <= :hastaano INTO :salarios;
  if (salarios IS NULL) then
  salarios = 0;
  FOR SELECT NN.nono_dura, NN.nono_periodo FROM NOMINA_NOVEDADES NN WHERE NN.terc_nit = :nit AND NN.tnov_cod = 6 INTO :diasvacac,:pervacac
  DO
  BEGIN
   SELECT SUM(NC.noco_valor)/ (30-:diasvacac) FROM NOMINA_CONCEPTOS NC WHERE NC.terc_nit = :nit AND ((NC.conc_cod = 1) or (NC.conc_cod = 22)) AND NC.noco_periodo = :pervacac INTO :salvacac;
   if (:salvacac IS NULL) then
   salvacac = 0;
   totalvacac = totalvacac + (salvacac * :diasvacac);
  END
  salarios = :salarios + :totalvacac;
  SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE ((CONC_COD = 5) or (conc_cod  = 954))  AND NC.terc_nit = :nit AND NC.noco_ano >= :desdeano AND NC.noco_ano <= :hastaano INTO :cesantia;
  if (cesantia is null) then
  cesantia = 0;
  SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE ((CONC_COD = 17) or (conc_cod  = 18) or (CONC_COD = 88) or (conc_cod  = 2))  AND NC.terc_nit = :nit AND NC.noco_ano >= :desdeano AND NC.noco_ano <= :hastaano INTO :otros;
  if (otros is null) then
  otros = 0;
  total = salarios + cesantia + otros;
  SELECT SUM(NC.noco_valor)*-1 FROM NOMINA_CONCEPTOS NC WHERE (CONC_COD = 907) AND NC.terc_nit = :nit AND NC.noco_ano >= :desdeano AND NC.noco_ano <= :hastaano INTO :salud;
  voluntarios = 0;
  SELECT SUM(NC.noco_valor)*-1 FROM NOMINA_CONCEPTOS NC WHERE ((CONC_COD = 42) or (nc.conc_cod = 904) ) AND NC.terc_nit = :nit AND NC.noco_ano >= :desdeano AND NC.noco_ano <= :hastaano INTO :pesion;
  SELECT SUM(NC.noco_valor)*-1 FROM NOMINA_CONCEPTOS NC WHERE (CONC_COD = 6) AND NC.terc_nit = :nit AND NC.noco_ano >= :desdeano AND NC.noco_ano <= :hastaano INTO :retencion;
  SUSPEND;
END^

SET TERM ; ^

GRANT EXECUTE ON PROCEDURE LEE_CONFIGURACION TO PROCEDURE CERTIFICADOS_RETENCION_LABORAL;

GRANT EXECUTE ON PROCEDURE DV TO PROCEDURE CERTIFICADOS_RETENCION_LABORAL;

GRANT SELECT ON TERCEROS TO PROCEDURE CERTIFICADOS_RETENCION_LABORAL;

GRANT SELECT ON CIUDADES TO PROCEDURE CERTIFICADOS_RETENCION_LABORAL;

GRANT SELECT ON NOMINA_CONCEPTOS TO PROCEDURE CERTIFICADOS_RETENCION_LABORAL;

GRANT SELECT ON NOMINA_NOVEDADES TO PROCEDURE CERTIFICADOS_RETENCION_LABORAL;

GRANT EXECUTE ON PROCEDURE CERTIFICADOS_RETENCION_LABORAL TO PUBLIC;

/* 20100728c */
/* PROYECTO Y CENTRO VACIO SI CONTABILIZACION DETALLADA */

SET TERM ^ ;

CREATE OR ALTER procedure CONTABIL_NOMINA (
    IDDOC integer)
returns (
    ERROR integer,
    IDC integer)
AS
declare variable itemdet integer;
declare variable idcontabil integer;
declare variable aporte char(1);
declare variable entidad varchar(20);
declare variable valor numeric(18,2);
declare variable ctagast varchar(20);
declare variable ctaxp varchar(20);
declare variable tercnit varchar(20);
declare variable fecaux date;
declare variable fecha char(8);
declare variable ano char(4);
declare variable periodicidad integer;
declare variable periodo integer;
declare variable numero varchar(6);
declare variable tipocom char(3);
declare variable prefcom varchar(4);
declare variable concepto varchar(60);
declare variable numerocom varchar(6);
declare variable proyecto varchar(4) character set none;
declare variable centro varchar(4) character set none;
declare variable codconc integer;
declare variable base numeric(18,2);
declare variable basico numeric(18,2);
declare variable comision numeric(18,2);
declare variable retroact numeric(18,2);
declare variable det char(1);
declare variable ctaadmin char(1);
BEGIN
SELECT N.nomi_feccausa, N.nomi_ano, N.nomi_periodocidad, N.nomi_periodo FROM NOMINA N WHERE N.nomi_id = :iddoc INTO :fecaux, :ano, :periodicidad, :periodo;
NUMERO = :periodicidad || :periodo;
SELECT I.tico_cod, I.prco_pre, I.inno_det, I.inno_dtlleadmin FROM INTERFAZ_NOMINA I WHERE I.tido_cod = 92 INTO :tipocom, :prefcom,:det,:ctaadmin;
concepto = 'CAUSACION NOMINA AÑO ' || :ano || ' PERIODO ' || :periodo || ' PERIODICIDAD ' ||:periodicidad;
EXECUTE PROCEDURE completa_ceros(:numero)RETURNING_VALUES :numero;
SELECT P.pref_numero FROM PREFIJOS_CONTA P WHERE P.tico_cod = :tipocom AND P.prco_pref = :prefcom INTO :numerocom;
idcontabil = GEN_ID(ID_CONTABILIZA,1);
EXECUTE PROCEDURE FECHA_A_CONTA(:FECAUX) RETURNING_VALUES (:FECHA);
/* BORRE CUALQUIER OTRA ANTERIOR */
DELETE FROM CONTABILIZACION WHERE CNTB_IDREF = :iddoc AND CNTB_TIPOREF = 92;

INSERT INTO CONTABILIZACION (CNTB_ID, CNTB_TIPOREF, CNTB_IDREF, CNTB_PREFREF, CNTB_NUMREF, CNTB_FECHA, CNTB_TIPOCOMP, CNTB_PREFCNT, CNTB_CONCEPTO, CNTB_NUMERO, CNTB_PROCESADO)
    VALUES (:idcontabil, 92,:iddoc, :ano, :numero, :fecha, :tipocom, :prefcom, :concepto, :numerocom, 'N');
idc = :idcontabil;
itemdet = 0;
IF (DET = 'N') THEN
    BEGIN
    FOR SELECT max(NC.conc_cod),sum(NC.NOCO_VALORCONT), max(CN.conc_ctagast), max(NC.terc_nit), max(NC.noco_aporte), max(NC.noco_entidad)
        FROM NOMINA_CONCEPTOS NC, CONCEPTOS_NOMINA CN WHERE NC.conc_cod = CN.conc_cod AND NC.nomi_id = :iddoc and cn.conc_ctagast is not null and cn.conc_ctacxp is not null
        group by cn.conc_ctagast,nc.terc_nit
        INTO :codconc,:valor, :ctagast, :tercnit, :aporte, :entidad
        DO
        BEGIN
        SELECT E.proy_cod,E.cent_cod FROM EMPLEADOS E WHERE E.terc_nit = :tercnit INTO :proyecto, :centro;
        if (:proyecto IS NULL) then
            SELECT D.dpto_proy, D.dpto_centro FROM EMPLEADOS E, departamento D WHERE E.terc_nit = :tercnit AND E.empl_dpto = D.dpto_cod INTO :proyecto, :centro;
        base = null;
        IF (ctagast IS NULL) THEN
            BEGIN
            EXECUTE PROCEDURE ERROR (14, :IDDOC, :ctagast, 2);
            ERROR = ERROR + 1;
            END
        IF (ctaxp IS NULL) THEN
            BEGIN
            EXECUTE PROCEDURE ERROR (14, :IDDOC, :ctaxp, 2);
            ERROR = ERROR + 1;
            END
        IF (VALOR IS NULL) THEN
            VALOR = 0;
        IF (VALOR <> 0) THEN
            BEGIN
            IF (valor < 0) THEN
                valor = :valor * (-1);
            IF (codconc = 6) THEN
                BEGIN
                SELECT E.empl_salario FROM EMPLEADOS E WHERE E.terc_nit = :tercnit INTO :basico;
                SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :tercnit INTO :comision;
                IF (comision IS NULL) THEN
                    comision = 0;
                SELECT C.emco_monto FROM EMPLEADO_CONCEPTOS C WHERE C.terc_nit = :tercnit AND C.conc_cod = 933 INTO :retroact;
                IF (retroact IS NULL ) THEN
                    retroact = 0;
                base = :basico + :comision + :retroact;
                END
            IF (aporte = 'N') THEN
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_TERC, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_CONC, CNDE_PROY, cnde_centro,CNDE_BASE)
                             VALUES (:idcontabil, :itemdet, :ctagast, :tercnit, :valor, 0, :concepto, :proyecto, :centro,:base);
                itemdet = itemdet + 1;
                /*SELECT D.dpto_proy, D.dpto_centro FROM EMPLEADOS E, departamento D WHERE E.terc_nit = :tercnit AND E.empl_dpto = D.dpto_cod INTO :proyecto, :centro;
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_TERC, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_CONC, CNDE_PROY, cnde_centro,CNDE_BASE)
                             VALUES (:idcontabil, :itemdet, :ctaxp, :tercnit, 0,:valor, :concepto, :proyecto, :centro,:base);
                itemdet = itemdet + 1;            */
                END
            ELSE
                IF (aporte = 'S') THEN
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_TERC, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_CONC, CNDE_PROY, cnde_centro,CNDE_BASE)
                        VALUES (:idcontabil, :itemdet, :ctagast, :entidad, :valor, 0, :concepto, :proyecto, :centro,:base);
                    itemdet = itemdet + 1;
                    /*SELECT D.dpto_proy, D.dpto_centro FROM EMPLEADOS E, departamento D WHERE E.terc_nit = :tercnit AND E.empl_dpto = D.dpto_cod INTO :proyecto, :centro;
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_TERC, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_CONC, CNDE_PROY, cnde_centro,CNDE_BASE)
                        VALUES (:idcontabil, :itemdet, :ctaxp, :entidad, 0,:valor, :concepto, :proyecto, :centro,:base);
                    itemdet = itemdet + 1;                */
                    END
            END
        END
    SUSPEND;
    FOR SELECT max(NC.conc_cod),sum(NC.NOCO_VALORCONT), max(CN.conc_ctacxp), max(NC.terc_nit), max(NC.noco_aporte), max(NC.noco_entidad)
        FROM NOMINA_CONCEPTOS NC, CONCEPTOS_NOMINA CN WHERE NC.conc_cod = CN.conc_cod AND NC.nomi_id = :iddoc and cn.conc_ctagast is not null and cn.conc_ctacxp is not null
        group by cn.conc_ctacxp,nc.noco_nitcont
        INTO :codconc,:valor, :ctaxp, :tercnit, :aporte, :entidad
        DO
        BEGIN
        base = null;
        IF (ctagast IS NULL) THEN
            BEGIN
            EXECUTE PROCEDURE ERROR (14, :IDDOC, :ctagast, 2);
            ERROR = ERROR + 1;
            END
        IF (ctaxp IS NULL) THEN
            BEGIN
            EXECUTE PROCEDURE ERROR (14, :IDDOC, :ctaxp, 2);
            ERROR = ERROR + 1;
            END
        IF (VALOR IS NULL) THEN
            VALOR = 0;
        IF (VALOR <> 0) THEN
            BEGIN
            IF (valor < 0) THEN
                valor = :valor * (-1);
            IF (codconc = 6) THEN
                BEGIN
                SELECT E.empl_salario FROM EMPLEADOS E WHERE E.terc_nit = :tercnit INTO :basico;
                SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :tercnit INTO :comision;
                IF (comision IS NULL) THEN
                    comision = 0;
                SELECT C.emco_monto FROM EMPLEADO_CONCEPTOS C WHERE C.terc_nit = :tercnit AND C.conc_cod = 933 INTO :retroact;
                IF (retroact IS NULL ) THEN
                    retroact = 0;
                base = :basico + :comision + :retroact;
                END
            if ((codconc > 900) and (entidad is not null) AND (ctaadmin = 'S')) then
                begin
                 SELECT A.admi_ctaconta FROM ADMINISTRADORA A WHERE A.terc_nit = :entidad INTO :ctaxp;
                end
            IF (aporte = 'N') THEN
                BEGIN
                /*SELECT D.dpto_proy, D.dpto_centro FROM EMPLEADOS E, departamento D WHERE E.terc_nit = :tercnit AND E.empl_dpto = D.dpto_cod INTO :proyecto, :centro;
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_TERC, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_CONC, CNDE_PROY, cnde_centro,CNDE_BASE)
                             VALUES (:idcontabil, :itemdet, :ctagast, :tercnit, :valor, 0, :concepto, :proyecto, :centro,:base);
                itemdet = itemdet + 1;
                */
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_TERC, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_CONC, CNDE_PROY, cnde_centro,CNDE_BASE)
                             VALUES (:idcontabil, :itemdet, :ctaxp, :tercnit, 0,:valor, :concepto, :proyecto, :centro,:base);
                itemdet = itemdet + 1;
                END
            ELSE
                IF (aporte = 'S') THEN
                    BEGIN
                    /*SELECT D.dpto_proy, D.dpto_centro FROM EMPLEADOS E, departamento D WHERE E.terc_nit = :tercnit AND E.empl_dpto = D.dpto_cod INTO :proyecto, :centro;
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_TERC, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_CONC, CNDE_PROY, cnde_centro,CNDE_BASE)
                        VALUES (:idcontabil, :itemdet, :ctagast, :tercnit, :valor, 0, :concepto, :proyecto, :centro,:base);
                    itemdet = itemdet + 1;                */
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_TERC, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_CONC, CNDE_PROY, cnde_centro,CNDE_BASE)
                        VALUES (:idcontabil, :itemdet, :ctaxp, :tercnit, 0,:valor, :concepto, :proyecto, :centro,:base);
                    itemdet = itemdet + 1;
                    END
            END
        END
    SUSPEND;
    END
ELSE
    BEGIN
    FOR SELECT NC.conc_cod,NC.NOCO_VALORCONT, CN.conc_ctagast, CN.conc_ctacxp, NC.terc_nit, NC.noco_aporte, NC.noco_entidad
        FROM NOMINA_CONCEPTOS NC, CONCEPTOS_NOMINA CN WHERE NC.conc_cod = CN.conc_cod AND NC.nomi_id = :iddoc
        INTO :codconc,:valor, :ctagast, :ctaxp, :tercnit, :aporte, :entidad
        DO
        BEGIN
        base = null;
        SELECT E.proy_cod,E.cent_cod FROM EMPLEADOS E WHERE E.terc_nit = :tercnit INTO :proyecto, :centro;
        if (:proyecto IS NULL) then
            SELECT D.dpto_proy, D.dpto_centro FROM EMPLEADOS E, departamento D WHERE E.terc_nit = :tercnit AND E.empl_dpto = D.dpto_cod INTO :proyecto, :centro;
        IF (ctagast IS NULL) THEN
            BEGIN
            EXECUTE PROCEDURE ERROR (14, :IDDOC, :ctagast, 2);
            ERROR = ERROR + 1;
            END
        IF (ctaxp IS NULL) THEN
            BEGIN
            EXECUTE PROCEDURE ERROR (14, :IDDOC, :ctaxp, 2);
            ERROR = ERROR + 1;
            END
        IF (VALOR IS NULL) THEN
            VALOR = 0;
        IF (VALOR <> 0) THEN
            BEGIN
            IF (valor < 0) THEN
                valor = :valor * (-1);
            IF (codconc = 6) THEN
                BEGIN
                SELECT E.empl_salario FROM EMPLEADOS E WHERE E.terc_nit = :tercnit INTO :basico;
                SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :tercnit INTO :comision;
                IF (comision IS NULL) THEN
                    comision = 0;
                SELECT C.emco_monto FROM EMPLEADO_CONCEPTOS C WHERE C.terc_nit = :tercnit AND C.conc_cod = 933 INTO :retroact;
                IF (retroact IS NULL ) THEN
                    retroact = 0;
                base = :basico + :comision + :retroact;
                END     
            if ((codconc > 900) and (entidad is not null) AND (ctaadmin = 'S')) then
                begin
                SELECT A.admi_ctaconta FROM ADMINISTRADORA A WHERE A.terc_nit = :entidad INTO :ctaxp;
                end
            IF (aporte = 'N') THEN
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_TERC, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_CONC, CNDE_PROY, cnde_centro,CNDE_BASE)
                    VALUES (:idcontabil, :itemdet, :ctagast, :tercnit, :valor, 0, :concepto, :proyecto, :centro,:base);
                itemdet = itemdet + 1;
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_TERC, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_CONC, CNDE_PROY, cnde_centro,CNDE_BASE)
                             VALUES (:idcontabil, :itemdet, :ctaxp, :tercnit, 0,:valor, :concepto, :proyecto, :centro,:base);
                itemdet = itemdet + 1;
                END
            ELSE
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_TERC, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_CONC, CNDE_PROY, cnde_centro,CNDE_BASE)
                    VALUES (:idcontabil, :itemdet, :ctagast, :tercnit, :valor, 0, :concepto, :proyecto, :centro,:base);
                itemdet = itemdet + 1;
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_TERC, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_CONC, CNDE_PROY, cnde_centro,CNDE_BASE)
                         VALUES (:idcontabil, :itemdet, :ctaxp, :entidad, 0,:valor, :concepto, :proyecto, :centro,:base);
                itemdet = itemdet + 1;
                END
            END
        END
    SUSPEND;
    END
END
^

SET TERM ; ^


/* 20100728d */
/* INCLUYA LOS BENEFICIOS EN EL CERTIFICADO DE RETENCION */

SET TERM ^ ;

CREATE OR ALTER procedure CERTIFICADOS_RETENCION_LABORAL (
    DESDE date,
    HASTA date,
    NIT varchar(20),
    FECHA date)
returns (
    NITEMPRESA varchar(60),
    RAZONSOCIAL varchar(100),
    DV integer,
    TIPOID varchar(1),
    NITEMPL varchar(20),
    NOMBRE1 varchar(60),
    NOMBRE2 varchar(60),
    APELLIDO1 varchar(60),
    APELLIDO2 varchar(60),
    DESDEANO varchar(4),
    DESDEMES varchar(2),
    DESDEDIA varchar(2),
    HASTAANO varchar(4),
    HASTAMES varchar(2),
    HASTADIA varchar(2),
    FECHAANO varchar(4),
    FECHAMES varchar(2),
    FECHADIA varchar(2),
    IDPAIS integer,
    NOMCIUDAD varchar(60),
    CIUDAD varchar(5),
    DEPTO varchar(2),
    MUNICIPIO varchar(3),
    SALARIOS numeric(18,2),
    VACACION numeric(18,2),
    TOTALVACAC numeric(18,2),
    CESANTIA numeric(18,2),
    OTROS numeric(18,2),
    TOTAL numeric(18,2),
    SALUD numeric(18,2),
    PESION numeric(18,2),
    VOLUNTARIOS numeric(18,2),
    RETENCION numeric(18,2))
AS
declare variable diasvacac integer;
declare variable pervacac integer;
declare variable salvacac numeric(18,2);
declare variable BENEFICIOS numeric(18,2);
BEGIN
  EXECUTE PROCEDURE LEE_CONFIGURACION ('CONTABILIDAD','GENERAL','NIT COMPAÑIA') RETURNING_VALUES (:nitempresa);
  EXECUTE PROCEDURE LEE_CONFIGURACION ('GENERAL','GENERAL','NOMBRE COMPAÑIA') RETURNING_VALUES (:razonsocial);
  EXECUTE PROCEDURE DV (nitempresa) RETURNING_VALUES (:dv);
  nitempl = :nit;
  SELECT T.terc_apellido1,T.terc_apellido2,T.terc_nombre1,T.terc_nombre2, T.terc_tipoid,t.pais_id,T.ciud_cod
  FROM TERCEROS T WHERE T.terc_nit = :nit INTO :apellido1,:apellido2,:nombre1,:nombre2,:tipoid,:idpais,:ciudad;
  desdeano = substr(:desde,1,4);
  desdemes = substr(:desde,6,7);
  desdedia = substr(:desde,9,10);
  hastaano = substr(:hasta,1,4);
  hastames = substr(:hasta,6,7);
  hastadia = substr(:hasta,9,10);
  fechaano = substr(:fecha,1,4);
  fechames = substr(:fecha,6,7);
  fechadia = substr(:fecha,9,10);
  SELECT P.ciud_nom FROM CIUDADES P WHERE P.ciud_cod = :ciudad INTO :nomciudad;
  depto = substr(:ciudad,1,2);
  municipio = substr(:ciudad,3,5);
  totalvacac = 0;
  SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE ((CONC_COD = 1) OR (CONC_COD = 19) OR (CONC_COD = 20) OR (CONC_COD = 22) OR (CONC_COD = 91) OR (CONC_COD = 900) OR (CONC_COD = 920) OR (CONC_COD = 932) OR (CONC_COD = 945) OR (CONC_COD = 946)) AND NC.terc_nit = :nit AND NC.noco_ano >= :desdeano AND NC.noco_ano <= :hastaano INTO :salarios;
  if (salarios IS NULL) then
  salarios = 0;
  FOR SELECT NN.nono_dura, NN.nono_periodo FROM NOMINA_NOVEDADES NN WHERE NN.terc_nit = :nit AND NN.tnov_cod = 6 INTO :diasvacac,:pervacac
  DO
  BEGIN
   SELECT SUM(NC.noco_valor)/ (30-:diasvacac) FROM NOMINA_CONCEPTOS NC WHERE NC.terc_nit = :nit AND ((NC.conc_cod = 1) or (NC.conc_cod = 22)) AND NC.noco_periodo = :pervacac INTO :salvacac;
   if (:salvacac IS NULL) then
   salvacac = 0;
   totalvacac = totalvacac + (salvacac * :diasvacac);
  END
  salarios = :salarios + :totalvacac;
  SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE ((CONC_COD = 5) or (conc_cod  = 954))  AND NC.terc_nit = :nit AND NC.noco_ano >= :desdeano AND NC.noco_ano <= :hastaano INTO :cesantia;
  if (cesantia is null) then
  cesantia = 0;
  SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE ((CONC_COD = 17) or (conc_cod  = 18) or (CONC_COD = 88) or (conc_cod  = 2))  AND NC.terc_nit = :nit AND NC.noco_ano >= :desdeano AND NC.noco_ano <= :hastaano INTO :otros;
  if (otros is null) then
      otros = 0;
  /* LOS BENEFICIOS */
  SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC, conceptos_nomina CN
    WHERE NC.conc_cod = CN.conc_cod AND CN.conc_benefic = 'S' AND NC.terc_nit = :nit AND NC.noco_ano >= :desdeano AND NC.noco_ano <= :hastaano INTO :beneficios;
  if (beneficios is null) then
      beneficios = 0;
  total = salarios + cesantia + otros + beneficios;
  SELECT SUM(NC.noco_valor)*-1 FROM NOMINA_CONCEPTOS NC WHERE (CONC_COD = 907) AND NC.terc_nit = :nit AND NC.noco_ano >= :desdeano AND NC.noco_ano <= :hastaano INTO :salud;
  voluntarios = 0;
  SELECT SUM(NC.noco_valor)*-1 FROM NOMINA_CONCEPTOS NC WHERE ((CONC_COD = 42) or (nc.conc_cod = 904) ) AND NC.terc_nit = :nit AND NC.noco_ano >= :desdeano AND NC.noco_ano <= :hastaano INTO :pesion;
  SELECT SUM(NC.noco_valor)*-1 FROM NOMINA_CONCEPTOS NC WHERE (CONC_COD = 6) AND NC.terc_nit = :nit AND NC.noco_ano >= :desdeano AND NC.noco_ano <= :hastaano INTO :retencion;
  SUSPEND;
END
^

SET TERM ; ^


/* 20100729 */
/* PUEDE HABER VARIAS INCAPACIDADES EN EL PERIODO */
SET TERM ^ ;

CREATE OR ALTER PROCEDURE CAUSA_NOMINA(
    FEC DATE,
    PERIODO INTEGER,
    PERIODICIDAD INTEGER,
    PAGOGLOBAL CHAR(1),
    ANO CHAR(4),
    DEPTO INTEGER)
RETURNS (
    IDNOMINA INTEGER,
    ITEMINI INTEGER)
AS
declare variable ITEM integer;
declare variable NITE varchar(20) character set NONE;
declare variable NIT_TERCERO varchar(20);
declare variable CONCEPT integer;
declare variable MONTOS numeric(18,2);
declare variable PORCEN numeric(9,4);
declare variable ENTIDAD varchar(20);
declare variable CONC_COD integer;
declare variable CONC_DEDUC char(1);
declare variable CONC_PORC numeric(9,4);
declare variable CONC_ENTIDAD integer;
declare variable CONC_MONTO numeric(18,2);
declare variable CONC_MODIFI char(1);
declare variable CONC_PROMEDIO char(1);
declare variable VALOR numeric(18,2);
declare variable DIASLAB integer;
declare variable CONC_PROV char(1);
declare variable CONC_APORTE char(1);
declare variable NUMEROPROM integer;
declare variable CONC_APLICAPROM char(1);
declare variable PERINICIAL integer;
declare variable PERFINAL integer;
declare variable ANOINI integer;
declare variable ANOFIN integer;
declare variable CONC_DIAS char(1);
declare variable CONC_OTROCONC char(1);
declare variable CONC_CODOTROCONC integer;
declare variable ANOSUM integer;
declare variable SALARIO char(1) character set NONE;
declare variable LIQUIDAPER integer;
declare variable BASICO numeric(18,2);
declare variable NITEPS varchar(20);
declare variable NITAFC varchar(20);
declare variable NITAFP varchar(20);
declare variable NITCCF varchar(20);
declare variable GTOEMPR char(1);
declare variable COMISION numeric(18,2);
declare variable CAMBSALTRANS numeric(18,2);
declare variable SALDOSINI numeric(18,2);
declare variable DURANOV integer;
declare variable BASE numeric(18,2);
declare variable APROX integer;
declare variable MENSUAL char(1);
declare variable HORASEX numeric(18,2);
declare variable DIASNOV integer;
declare variable TOMASAL integer;
declare variable RETROACT numeric(18,2);
declare variable REEMBOLSO numeric(18,2);
declare variable INCAP numeric(18,2);
declare variable AUXTRANS numeric(18,2);
declare variable SMLV numeric(18,2);
declare variable BENEFICIOS numeric(18,2);
declare variable CONFIRMADO char(1);
declare variable RECNOCT numeric(18,2);
declare variable RECFEST numeric(18,2);
declare variable TAR_RECNOTC numeric(9,4);
declare variable TAR_RECFEST numeric(9,4);
declare variable RECARGO numeric(18,2);
declare variable BASICOREC numeric(18,2);
declare variable PARAMBENEF char(2);
declare variable VACACDISF numeric(18,2);
declare variable VALORPREDET numeric(18,2);
declare variable BASICOEMP numeric(18,2);
declare variable salinteg CHAR(1);
declare variable TAR_SALINTEG numeric(9,4);
begin
execute procedure LEE_CONFIGURACION('NOMINA','LIQUIDACION','TOMAR BENEFICIOS PARA CALCULAR PROVISIONES')returning_values(:PARAMBENEF);
execute procedure LEE_CONFIGURACION('NOMINA','GENERAL','REDONDEO AL MULTIPLO DE DIEZ EN TOTALES')returning_values(:APROX);
select N.NOMI_ID, N.NOMI_LIQOK from NOMINA N where N.NOMI_PERIODO = :PERIODO and N.NOMI_PERIODOCIDAD = :PERIODICIDAD
    and N.NOMI_ANO = :ANO into :IDNOMINA, :CONFIRMADO;
if (:IDNOMINA is null) then
    begin
    execute procedure CAMBIE_ID_NOMINA returning_values(:IDNOMINA);
    insert into NOMINA (NOMI_ID, NOMI_FECCAUSA, NOMI_PAGOGLOBAL, NOMI_PERIODOCIDAD, NOMI_PERIODO, NOMI_ANO, NOMI_LIQOK)
    values (:IDNOMINA, :FEC,:PAGOGLOBAL, :PERIODICIDAD, :PERIODO, :ANO, 'N');
    ITEM = 1;
    end
else
    begin
    select max(N.NOCO_ITEM) from NOMINA_CONCEPTOS N where N.NOMI_ID = :IDNOMINA
    into :ITEM;
    end
if ((CONFIRMADO = 'S') and (IDNOMINA is not null)) then
    begin
    IDNOMINA = 0;
    end
else
    begin
    insert into NOMINA_DEPARTAMENTO (NOMI_ID, NODP_DEPTO)values(:IDNOMINA,:DEPTO);
    select P.PAAN_RECNOC, P.PAAN_RECFEST, P.paan_salinteg from PARAMETROS_ANO P where P.PAAN_ANO = :ANO
        into :TAR_RECNOTC, :TAR_RECFEST, TAR_SALINTEG;
    ITEMINI = ITEM;
    for select E.TERC_NIT, E.EMPL_EPS, E.EMPL_AFC, E.EMPL_AFP, E.EMPL_CCF, E.empl_salinteg
        from EMPLEADOS E
        where E.EMPL_PPAGO = :PERIODICIDAD and ((E.EMPL_FECRET is null) or (E.EMPL_FECRET > :FEC)) and E.EMPL_FECING <= :FEC
        and ((:DEPTO = 0) or (e.empl_dpto = :DEPTO))
        into :NITE, :NITEPS, :NITAFC, :NITAFP, :NITCCF, :SALINTEG
        do
        begin
        select first 1 M.MVSE_SALARIO from MOVIMIENTO_SALARIO_EMPLEADO M where M.TERC_NIT = :NITE and M.MVSE_FECHA <= :FEC order by M.MVSE_FECHA desc into :BASICOEMP;
        BASICO = BASICOEMP;
        RECNOCT = null;
        RECFEST = null;
        select N.NOEX_RECNOCT, N.NOEX_RECFEST
            from NOMINA_HORASEXT N where N.NOEX_PERIODIO = :PERIODO and N.NOEX_ANO = :ANO and N.TERC_NIT = :NITE
            into :RECNOCT, :RECFEST;
        if (RECNOCT is null) then
            RECNOCT = 0;
        if (RECFEST is null) then
            RECFEST = 0;
        for select CE.TERC_NIT, CE.CONC_COD, CE.EMCO_MONTO, CE.EMCO_PORC, CE.EMPL_ENTIDAD, CE.EMCO_PERPROM, CE.EMCO_LUQUIDAPER, CE.EMCO_MENSUAL, CN.CONC_COD, CN.CONC_DEDUC,CN.CONC_PORC, CN.CONC_ENTIDAD, CN.CONC_MONTO,  CN.CONC_DIAS, CN.CONC_MODIFI,
            CN.CONC_PROMEDIO, CN.CONC_SALARIO, CN.CONC_PROV, CN.CONC_APORTE, CN.CONC_APLICAPROM, CN.CONC_OTROCONC, CN.CONC_CODOTROCONC, CN.CONC_GTOEMPR, CN.CONC_BASE, CE.EMCO_TOMSAL
            from EMPLEADO_CONCEPTOS CE, CONCEPTOS_NOMINA CN where (CE.CONC_COD = CN.CONC_COD) and (CE.TERC_NIT = :NITE) and
            ( ((CE.EMCO_FECINI <= :FEC and CE.EMCO_FECFIN >= :FEC)) or
            ((CN.CONC_TODOSPER = 'N') and (CE.EMCO_PPAGO = :PERIODO)) or ((CN.CONC_TODOSPER = 'S') AND (((:periodicidad = 1) AND (:PERIODO < 13)) or ((:periodicidad = 2) AND (:PERIODO < 25)))) )  order by (TERC_NIT )
            into :NIT_TERCERO, :CONCEPT,  :MONTOS, :PORCEN, :ENTIDAD, :NUMEROPROM, :LIQUIDAPER, :MENSUAL ,:CONC_COD, :CONC_DEDUC, :CONC_PORC,
            :CONC_ENTIDAD, :CONC_MONTO, :CONC_DIAS, :CONC_MODIFI,:CONC_PROMEDIO, :SALARIO,:CONC_PROV, :CONC_APORTE , :CONC_APLICAPROM, :CONC_OTROCONC, :CONC_CODOTROCONC, :GTOEMPR, :BASE, :TOMASAL
            do
            begin
            if (CONC_DIAS = 'S') then
                execute procedure DIAS_LABORADOS (:NITE, :PERIODO, :FEC, :MENSUAL,:CONC_APORTE) returning_values (:DIASLAB);
            else
                BEGIN
                SELECT PPAG_DIAS FROM PERIODO_PAGO WHERE PPAG_COD = :periodicidad INTO :diaslab;
                END
            if (:TOMASAL <> 0) then
                begin
                /* SI EL CONCEPTO NOAPLICA EN ESTE PERIODO DEJE EL BASICO EN CERO */
                if ((:PERIODICIDAD = 2) and (:TOMASAL <> 2)) then
                    begin
                    if ((PERIODO = 2) or (PERIODO = 4) or (PERIODO = 6) or (PERIODO = 8) or (PERIODO = 10) or (PERIODO = 12)
                        or (PERIODO = 14) or (PERIODO = 16) or (PERIODO = 18) or (PERIODO = 20) or (PERIODO = 22) or (PERIODO = 24)) then
                        BASICO = 0;
                    end
                else
                    if ((:PERIODICIDAD = 3) and (:TOMASAL <> 1)) then
                        begin
                        if ((PERIODO = 1) or (PERIODO = 5) or (PERIODO = 9) or (PERIODO = 13) or (PERIODO = 17) or (PERIODO = 21)
                            or (PERIODO = 25) or (PERIODO = 29) or (PERIODO = 33) or (PERIODO = 37) or (PERIODO = 41) or (PERIODO = 45)
                            or (PERIODO = 49)) then
                            BASICO = 0;
                        end
                    else
                        if ((:PERIODICIDAD = 3) and (:TOMASAL <> 2)) then
                            begin
                            if ((PERIODO = 2) or (PERIODO = 6) or (PERIODO = 10) or (PERIODO = 14) or (PERIODO = 18) or (PERIODO = 22)
                                or (PERIODO = 26) or (PERIODO = 30) or (PERIODO = 34) or (PERIODO = 38) or (PERIODO = 42) or (PERIODO = 46)
                                or (PERIODO = 50)) then
                                BASICO = 0;
                            end
                        else
                            if ((:PERIODICIDAD = 3) and (:TOMASAL <> 3)) then
                                begin
                                if ((PERIODO = 3) or (PERIODO = 7) or (PERIODO = 11) or (PERIODO = 15) or (PERIODO = 19) or (PERIODO = 23)
                                    or (PERIODO = 27) or (PERIODO = 31) or (PERIODO = 35) or (PERIODO = 39) or (PERIODO = 43) or (PERIODO = 47)
                                    or (PERIODO = 51)) then
                                    BASICO = 0;
                                end
                            else
                                if ((:PERIODICIDAD = 3) and (:TOMASAL <> 4)) then
                                begin
                                if ((PERIODO = 4) or (PERIODO = 8) or (PERIODO = 12) or (PERIODO = 16) or (PERIODO = 20) or (PERIODO = 24)
                                    or (PERIODO = 29) or (PERIODO = 32) or (PERIODO = 36) or (PERIODO = 40) or (PERIODO = 44) or (PERIODO = 48)
                                    or (PERIODO = 52)) then
                                    BASICO = 0;
                                end
                end
            else
                begin
                /* SE CALCULA SOBRE TODOS LOS PERIODOS */
                BASICO = BASICOEMP;
                end
            VALORPREDET = null;
            select VP.NVPR_MONTO from NOMINA_VALOR_PREDET VP where VP.NVPR_PERIODICIDAD = :PERIODICIDAD and VP.NVPR_PERIODO = :PERIODO and VP.NVPR_ANO = :ANO and VP.CONC_COD = :CONC_COD and VP.TERC_NIT = :NITE
                into :VALORPREDET;
            if ((:VALORPREDET <> 0) and (VALORPREDET is not null)) then
                VALOR = VALORPREDET;
            else
                begin
                /* SI HAY UN CAMBIO TRANSITORIO DE SALARIO AJUSTE LOS DIAS Y CALCULE EL VALOR A SUMAR */
                select SUM((N.NONO_VALOR /30) * ND.NNDE_DURACION), SUM(ND.NNDE_DURACION) from NOMINA_NOVEDADES N, nomina_novedades_detalle ND
                    where N.nono_id = ND.nono_id AND N.TNOV_COD = 11 and N.TERC_NIT = :NITE and ND.NNDE_PERIODO = :PERIODO
                    into :CAMBSALTRANS, :DURANOV;
                if (CAMBSALTRANS is null) then
                    CAMBSALTRANS = 0;
                if (DURANOV is null) then
                    DURANOV = 0;
                DIASLAB = :DIASLAB - :DURANOV;
                /* SI ES UN PRESTAMO, TRAIGA LA CUOTA */
                if (CONC_COD = 922) then
                    begin
                    select sum(P.PRCU_MONTO) from PRESTAMO_CUOTAS P, PRESTAMO_NOMINA PN
                        where P.PRCU_ANO = :ANO and P.PRCU_PERIODO = :PERIODO and PN.PRNO_ID = P.PRNO_ID and PN.TERC_NIT = :NITE into :VALOR;
                    if (VALOR is null) then
                        VALOR = 0;
                    ITEM = :ITEM + 1;
                    /* MARQUE LA CUOTA COMO PAGADA */
                    update PRESTAMO_CUOTAS  P set PRCU_OK = 'S' where P.PRCU_ANO = :ANO and P.PRCU_PERIODO = :PERIODO
                        and exists (select PRNO_ID from PRESTAMO_NOMINA where TERC_NIT = :NITE and PRNO_ID = P.prno_id);
                    end
                else
                    if ((:MONTOS = 0) or (:MONTOS is null)) then
                        begin
                        /* SI EL CONCEPTO DEL EMPLEADO NO TIENE MONTO TRAIGA EL DE CONCEPTOS_NOMINA */
                        if ((CONC_PORC = 0 and :PORCEN = 0) or (CONC_PORC is null and :PORCEN = 0) or (CONC_PORC = 0 and :PORCEN is null) or (CONC_PORC is null and :PORCEN is null) ) then
                            begin
                            /* SIN PORCENTAJE */
                            if ((CONC_MONTO <> 0) and (CONC_MONTO is not null) ) then
                                begin
                                VALOR = :CONC_MONTO;
                                if (:CONC_DIAS = 'S') then
                                    VALOR = (:VALOR / 30) * :DIASLAB;
                                end
                            else
                                if (SALARIO = 'S' and CONC_COD <> 900 and CONC_COD <> 920 and CONC_COD <> 932 and CONC_COD <> 953) then
                                    begin
                                    /* SI ES SALARIO SUME LAS EXTRAS */
                                    BASICO = BASICOEMP;
                                    BASICO = ((:BASICO/30)*:DIASLAB);/* - (((:BASICO/30)/8)*:RECNOCT);/* PFP:DEBERIA SER + Y POR LA TARIFA QUE NO VEO POR NINGUN LADO
                                    BASICO = :BASICO - (((:BASICO/30)/8)*:RECFEST);*/
                                    CONC_MONTO = :BASICO;
                                    VALOR = (:CONC_MONTO/*/30 * :diaslab*/ ) + :CAMBSALTRANS;
                                    end
                                else
                                    begin
                                    VALOR = MONTOS;
                                    if (:CONC_DIAS = 'S') then
                                        VALOR = (:VALOR / 30) * :DIASLAB;
                                    end
                            end
                        else    
                            begin
                            if (:PORCEN <> 0) then
                                begin
                                /* SI TIENE PORCENTAJE EN EMPLEADO_CONCEPTOS PERO EL MONTO SE TRAE DE CONCPETOS_NOMINA */
                                if ((CONC_MONTO <> 0) and (CONC_MONTO is not null) ) then
                                    begin
                                    VALOR = ((:CONC_MONTO ) * :PORCEN) /100;
                                    end
                                end
                            else
                                begin
                                /* NO TIENE PORCENTAJE EN EMPLEADO_CONCEPTOS SE TRAE MONTO Y PORC DE CONCPETOS_NOMINA */
                                if ((CONC_MONTO <> 0) and (CONC_MONTO is not null) ) then
                                    begin
                                    VALOR = ((:CONC_MONTO) * :CONC_PORC) /100;
                                    end
                                else
                                    if (SALARIO = 'S' and CONC_COD <> 900 and CONC_COD <> 920 and CONC_COD <> 932 and CONC_COD <> 953) then
                                        begin
                                        BASICO = BASICOEMP;
                                        BASICO = ((:BASICO/30)*:DIASLAB); /* - (((:BASICO/30)/8)*:RECNOCT);
                                        BASICO = :BASICO - (((:BASICO/30)/8)*:RECFEST);*/
                                        CONC_MONTO = :BASICO;
                                        VALOR = ((:CONC_MONTO)+ :CAMBSALTRANS * :CONC_PORC) /100;
                                        end
                                    else
                                        if (:CONC_MONTO = 0 and :MONTOS = 0) then
                                            begin
                                            CONC_MONTO = :BASICO;
                                            VALOR = (((:CONC_MONTO / 30) * :DIASLAB) + :CAMBSALTRANS * :CONC_PORC) /100;
                                            end
                                end
                            end
                        end
                    else
                        /* SI TIENE MONTO EN EMPLEADO_CONCEPTOS */
                        if ((CONC_PORC = 0 or (CONC_PORC is null)) and (:PORCEN = 0 or (PORCEN is null))) then
                            begin
                            VALOR = (:MONTOS);
                            if (:CONC_DIAS = 'S') then
                                VALOR = (:VALOR / 30) * :DIASLAB;   
                            end
                        else
                            if (:PORCEN <> 0 and PORCEN is not null) then
                                begin
                                VALOR = ((:MONTOS ) * :PORCEN) /100;
                                end
                            else
                                begin
                                VALOR = ((:MONTOS) * :CONC_PORC) /100;
                                end
                if (CONC_PROMEDIO = 'S') then
                    begin
                    /* CALCULO DEL PROMEDIO BASE DESDE LA FECHA MENOS EL NUMERO DE PERIODOS */
                    EXECUTE PROCEDURE periodo_nom_fecha (:fec, :periodicidad) returning_values (:perfinal, :anofin);
                    if (perfinal < numeroprom) then
                        BEGIN
                        anoini = anofin - 1;
                        if (periodicidad = 1) then
                            perinicial = 12 - (numeroprom - perfinal) + 1;
                        if (periodicidad = 2) then
                            perinicial = 24 - (numeroprom - perfinal) + 1;
                        if (periodicidad = 3) then
                            perinicial = 52 - (numeroprom - perfinal) + 1;
                        END
                    ELSE
                        BEGIN
                        PERINICIAL = :perfinal - :NUMEROPROM + 1;
                        anoini = ANOFIN;
                        END
                    if (anoini <> anofin) then
                        select sum (NOCO_VALOR) from NOMINA_CONCEPTOS N where N.NOCO_APLICAPROM = 'S' and
                            ((N.NOCO_PERIODO >= :PERINICIAL and N.NOCO_ANO = :anoini) or
                            (N.NOCO_PERIODO <= :perfinal and N.NOCO_ANO = :anofin)) and TERC_NIT = :NITE into :VALOR;
                    else
                        select sum (NOCO_VALOR) from NOMINA_CONCEPTOS N where N.NOCO_APLICAPROM = 'S' and
                            N.NOCO_PERIODO >= :PERINICIAL and N.NOCO_ANO = :anoini
                            and N.NOCO_PERIODO <= :perfinal and TERC_NIT = :NITE into :VALOR;
                    /* sume el saldo inicial */
                    SALDOSINI = 0;
                    select NOCO_VALOR from NOMINA_CONCEPTOS where CONC_COD = :CONC_COD and TERC_NIT  = :NITE and NOCO_PAGOOK = 'N' and NOCO_PERIODO = 0 into :SALDOSINI;
                    if (SALDOSINI is null) then
                        SALDOSINI = 0;
                    else
                        update NOMINA_CONCEPTOS N set NOCO_PAGOOK = 'S' where N.NOCO_APLICAPROM = 'S' and
                            CONC_COD = :CONC_COD and TERC_NIT = :NITE and NOCO_PERIODO = 0;

                    VALOR = :VALOR + :SALDOSINI;
                    /* APLIQUE LA PROPORCION Y EL PORCENTAJE */
                    VALOR = VALOR / NUMEROPROM;
                    VALOR = VALOR * PORCEN / 100;
                    end
                else if (CONC_OTROCONC = 'S') then
                    begin
                    ANOSUM = cast(ANO as integer);
                    ANOSUM = ANOSUM - 1;
                    select sum (NOCO_VALOR) from NOMINA_CONCEPTOS N where N.NOCO_ANO = :ANOSUM and N.CONC_COD = :CONC_CODOTROCONC and N.TERC_NIT = :NITE into :VALOR;
                    select NOCO_VALOR from NOMINA_CONCEPTOS where NOCO_ANO = :ANOSUM and CONC_COD = :CONC_CODOTROCONC and TERC_NIT = :NITE and NOCO_PERIODO = 0 into :SALDOSINI;
                    if (SALDOSINI is null) then
                        SALDOSINI = 0;
                    else
                        update NOMINA_CONCEPTOS set NOCO_PAGOOK = 'S' where NOCO_ANO = :ANOSUM and CONC_COD = :CONC_CODOTROCONC and NOCO_PERIODO = 0 and TERC_NIT = :NITE;
                    VALOR = :VALOR + :SALDOSINI;
                    update NOMINA_CONCEPTOS set NOCO_PAGOOK = 'S' where NOCO_ANO = :ANOSUM and CONC_COD = :CONC_CODOTROCONC and TERC_NIT = :NITE;
                    end
                else if (CONC_APORTE = 'S') then
                    begin
                    HORASEX = null;
                    DIASNOV = null;
                    RETROACT = null;
                    REEMBOLSO = null;
                    BENEFICIOS = null;
                    RECARGO = null;
                    COMISION = null;
                    INCAP = null;
                    VACACDISF = null;
                    if ((:ENTIDAD = '' ) or (ENTIDAD is null)) then
                        begin
                        /*COMISIONES*/
                        if (MENSUAL = 'S') then
                            BEGIN
                            if (PERIODICIDAD = 1) then
                                BEGIN
                                perinicial = PERIODO;
                                PERFINAL = PERIODO;
                                END
                            if (PERIODICIDAD = 2) then
                                BEGIN
                                perinicial = PERIODO - (LIQUIDAPER - 1);
                                PERFINAL = PERIODO + (2 - LIQUIDAPER);
                                END
                            if (PERIODICIDAD = 3) then
                                BEGIN
                                perinicial = PERIODO - (LIQUIDAPER - 1);
                                PERFINAL = PERIODO + (4 - LIQUIDAPER);
                                END
                            END
                        ELSE
                            BEGIN
                            perinicial = PERIODO;
                            PERFINAL = PERIODO;
                            END
                            
                        /* SUME LAS COMISIONES DE LOS DEMAS PERIODOS DEL MES */
                        select SUM(C.NCOM_MONTO) from NOMINA_COMISIONES C where C.NCOM_ANO = :ANO
                            and C.NCOM_PERIODO >= :PERINICIAL AND C.NCOM_PERIODO <= :PERFINAL
                            and C.NCOM_PERIODICIDAD = :PERIODICIDAD and C.TERC_NIT = :NITE
                            into :COMISION;
                        if (COMISION is null) then
                            COMISION = 0;
                        /*RETROACTIVO*/
                        select C.EMCO_MONTO from EMPLEADO_CONCEPTOS C where C.TERC_NIT = :NITE
                            and C.CONC_COD = 933 into :RETROACT;
                            if (RETROACT is null ) then
                                RETROACT = 0;
                        /*REEMBOLSO*/
                        select C.EMCO_MONTO from EMPLEADO_CONCEPTOS C where C.TERC_NIT = :NITE
                            and C.CONC_COD = 952 into :REEMBOLSO;
                        if (REEMBOLSO is null ) then
                            REEMBOLSO = 0;
                        /*VACACIONES DISFRUTADAS ANTERIORMENTE*/
                        select C.EMCO_MONTO from EMPLEADO_CONCEPTOS C where C.TERC_NIT = :NITE
                            and C.CONC_COD = 955 into :VACACDISF;
                        if (VACACDISF is null ) then
                            VACACDISF = 0;
                        /* INCAPACIDAD*/
                        select SUM(ND.NNDE_DURACION) from NOMINA_NOVEDADES N, nomina_novedades_detalle ND
                            where N.nono_id = ND.nono_id AND N.TERC_NIT = :NITE
                            and ND.NNDE_PERIODO = :PERIODO and ND.NNDE_ANO = :ANO and (N.TNOV_COD = 2 or (N.TNOV_COD = 3))
                            into :DIASNOV;
                        if (:DIASNOV is null) then
                            INCAP = 0;
                        else
                            INCAP = (:BASICO / 30)* :DIASNOV;
                        /*BASICO*/
                        if (SALINTEG = 'S') then
                            BASICO = BASICO * (tar_salinteg / 100);
                        BASICO = ((:BASICO/30)*:DIASLAB);/* - (((:BASICO/30)/8)*:RECNOCT);
                        BASICO = :BASICO - (((:BASICO/30)/8)*:RECFEST);*/
                        /*HORAS EXTRA*/
                        select SUM(C.NOEX_MONTO) from NOMINA_HORASEXT C where C.NOEX_ANO = :ANO
                            and C.NOEX_PERIODIO >= :PERINICIAL and C.NOEX_PERIODIO <= :PERFINAL
                            and C.NOEX_PERIODICIDAD = :PERIODICIDAD and C.TERC_NIT = :NITE
                            into :HORASEX;
                        if (HORASEX is null) then
                            HORASEX = 0;
                        /*RECARGOS*/
                        BASICOREC = BASICOEMP;
                        RECARGO = (((:BASICOREC/30)/8)*:TAR_RECNOTC)*:RECNOCT;
                        RECARGO = :RECARGO + ((((:BASICOREC/30)/8)*:TAR_RECFEST)*:RECFEST);
                        if (RECARGO is null) then
                            RECARGO = 0;
                        /*basico*/
                        if (:BASICO + :COMISION + :HORASEX + :RETROACT+ :REEMBOLSO + :INCAP+ :CAMBSALTRANS < ((:SMLV/30)*:DIASLAB)) then
                            BASICO = (:SMLV/30)*:DIASLAB;
                        /* SMLV Y AUX. TRANSPORTE*/
                        select P.PAAN_AUXTR, P.PAAN_SALMINIMO from PARAMETROS_ANO P
                            where P.PAAN_ANO = :ANO into :AUXTRANS, :SMLV;
                        /*BASE*/
                        VALOR = :BASICO + :COMISION + :HORASEX + :RETROACT+ :REEMBOLSO + :INCAP + :RECARGO + :CAMBSALTRANS + :VACACDISF;

                        if (CONC_COD = 904) then
                            begin
                            ENTIDAD = :NITAFP;
                            select A.PAAN_AFPTR from PARAMETROS_ANO A where A.PAAN_ANO = :ANO into :PORCEN;
                            VALOR = ((:VALOR) * :PORCEN) /100;
                            end
                        else if ((CONC_COD = 905) or (CONC_COD = 906) or (CONC_COD = 934) ) then
                            begin
                            ENTIDAD = :NITAFP;
                            select A.PAAN_AFPEM from PARAMETROS_ANO A where A.PAAN_ANO = :ANO into :PORCEN;
                            VALOR = ((:VALOR) * :PORCEN) /100;
                            end
                        else if ((CONC_COD = 907) or (CONC_COD = 914) or (CONC_COD = 915) or (conc_cod = 938)) then
                            begin
                            ENTIDAD = :NITEPS;
                            if (CONC_COD = 907) then
                                begin
                                select A.PAAN_EPSTR from PARAMETROS_ANO A where A.PAAN_ANO = :ANO into :PORCEN;
                                VALOR = ((:VALOR) * :PORCEN) /100;
                                end
                            else
                                begin
                                select A.PAAN_EPSEM from PARAMETROS_ANO A where A.PAAN_ANO = :ANO into :PORCEN;
                                    VALOR = ((:VALOR) * :PORCEN) /100;
                                end
                            end
                        else if ((CONC_COD = 910) or (CONC_COD = 911) or (CONC_COD = 936)) then
                            begin
                            /*ccf */
                            ENTIDAD = :NITCCF;
                            select A.PAAN_CCF from PARAMETROS_ANO A where A.PAAN_ANO = :ANO into :PORCEN;
                            VALOR = ((:VALOR) * :PORCEN) /100;
                            end
                        else if ((CONC_COD = 916) or (CONC_COD = 917) or (CONC_COD = 939) ) then
                            begin
                            /*icbf */
                            ENTIDAD = :NITCCF;
                            select A.PAAN_ICBF from PARAMETROS_ANO A where A.PAAN_ANO = :ANO into :PORCEN;
                            VALOR = ((:VALOR) * :PORCEN) /100;
                            end
                        else if ((CONC_COD = 918) or (CONC_COD = 919) or (CONC_COD = 940) ) then
                            begin
                            /*sena */
                            ENTIDAD = :NITCCF;
                            select A.PAAN_SENA from PARAMETROS_ANO A where A.PAAN_ANO = :ANO into :PORCEN;
                            VALOR = ((:VALOR) * :PORCEN) /100;
                            end
                        else if ((CONC_COD = 912) or (CONC_COD = 913) or (CONC_COD = 937)) then
                            begin
                            /* CESANTIAS */
                            ENTIDAD = :NITAFC;
                            if (PARAMBENEF = 'SI') then
                                begin
                                select sum(CE.EMCO_MONTO)
                                    from EMPLEADO_CONCEPTOS CE, CONCEPTOS_NOMINA CN where CN.CONC_BENEFIC = 'S' and (CE.TERC_NIT = :NITE) and (CE.CONC_COD = CN.CONC_COD) and
                                    ((CE.EMCO_FECINI <= :FEC and CE.EMCO_FECFIN >= :FEC) or ((CN.CONC_TODOSPER = 'N') and (CE.EMCO_PPAGO = :PERIODO)) or
                                    (CN.CONC_TODOSPER = 'S'))
                                    into :BENEFICIOS;
                                if (BENEFICIOS is null) then
                                    BENEFICIOS = 0;
                                end
                            else
                                BENEFICIOS = 0;
                            select P.PAAN_AUXTR, P.PAAN_SALMINIMO from PARAMETROS_ANO P
                                where P.PAAN_ANO = :ANO into :AUXTRANS, :SMLV;
                            if (:BASICO < (:SMLV*2)) then
                                AUXTRANS = (:AUXTRANS / 30) * :DIASLAB;
                            else
                                AUXTRANS = 0;
                            select A.PAAN_CESEMP from PARAMETROS_ANO A where A.PAAN_ANO = :ANO
                                into :PORCEN;
                            VALOR = ((:VALOR + :AUXTRANS + :BENEFICIOS) * :PORCEN) /100;
                            end
                        else
                            begin
                            if (COMISION is null) then
                                COMISION = 0;
                            select C.NCOM_MONTO from NOMINA_COMISIONES C where C.NCOM_ANO = :ANO and C.NCOM_PERIODO = :PERIODO and C.NCOM_PERIODICIDAD = :PERIODICIDAD and C.TERC_NIT = :NITE
                                into :COMISION;
                            CONC_MONTO = :BASICO + :COMISION;
                            if (CONC_PORC <> 0 and CONC_PORC is not null) then
                                VALOR = (((:CONC_MONTO/30 * :DIASLAB )+ :CAMBSALTRANS + :INCAP) * :CONC_PORC) /100;
                            else
                                if (:PORCEN <> 0 and :PORCEN is not null) then
                                    VALOR = (((:CONC_MONTO/30 * :DIASLAB )+ :CAMBSALTRANS + :INCAP) * :PORCEN) /100;
                                else
                                    if (:MONTOS <> 0 and :MONTOS is not null) then
                                        VALOR = :MONTOS;
                                    else
                                        if (:CONC_MONTO <> 0 and :CONC_MONTO is not null) then
                                            VALOR = :CONC_MONTO;
                            end
                        ITEM = :ITEM + 1;
                        end
                    end /* aportes */
                else if (CONC_PROV = 'S') then
                    begin
                    /*provisiones */
                    HORASEX = null;
                    DIASNOV = null;
                    RETROACT = null;
                    REEMBOLSO = null;
                    BENEFICIOS = null;
                    RECARGO = null;
                    COMISION = null;
                    INCAP = null;
                    /* RECARGO*/
                    BASICO = BASICOEMP;
                    RECARGO = (((:BASICO/30)/8)*:TAR_RECNOTC)*:RECNOCT;
                    RECARGO = :RECARGO + ((((:BASICO/30)/8)*:TAR_RECFEST)*:RECFEST);
                    /*INCAPACIDAD*/
                    select SUM(ND.NNDE_DURACION) from NOMINA_NOVEDADES N, nomina_novedades_detalle ND
                        where N.nono_id = ND.nono_id AND N.TERC_NIT = :NITE and ND.NNDE_PERIODO = :PERIODO and ND.NNDE_ANO = :ANO
                        and ((N.TNOV_COD = 2) or (N.TNOV_COD = 3)) into :DIASNOV;
                    if (:DIASNOV is null) then
                        INCAP = 0;
                    else
                        INCAP = (:BASICO / 30)* :DIASNOV;
                    /* BASICO*/
                    BASICO = ((:BASICO/30)*:DIASLAB);/* - (((:BASICO/30)/8)*:RECNOCT);
                    BASICO = :BASICO - (((:BASICO/30)/8)*:RECFEST);*/
                    if (SALINTEG = 'S') then
                        BASICO = BASICO * (tar_salinteg / 100);
                    /*BENEFICIOS*/
                    if (PARAMBENEF = 'SI') then
                        begin
                        select sum(CE.EMCO_MONTO)
                            from EMPLEADO_CONCEPTOS CE, CONCEPTOS_NOMINA CN where CN.CONC_BENEFIC = 'S'
                            and (CE.TERC_NIT = :NITE) and (CE.CONC_COD = CN.CONC_COD) and
                            ((CE.EMCO_FECINI <= :FEC and CE.EMCO_FECFIN >= :FEC) or ((CN.CONC_TODOSPER = 'N')
                            and (CE.EMCO_PPAGO = :PERIODO)) or (CN.CONC_TODOSPER = 'S'))
                            into :BENEFICIOS;
                        if (BENEFICIOS is null) then
                            BENEFICIOS = 0;
                        end
                    else
                        BENEFICIOS = 0;
                    if ((CONC_COD <> 929) and (CONC_COD <> 930) and (CONC_COD <> 944)) then
                        begin
                        select P.PAAN_AUXTR, P.PAAN_SALMINIMO from PARAMETROS_ANO P where P.PAAN_ANO = :ANO
                            into :AUXTRANS, :SMLV;
                        if (:BASICO < (:SMLV*2)) then
                            AUXTRANS = (:AUXTRANS / 30) * :DIASLAB;
                        else
                            AUXTRANS = 0;
                        end
                    else
                        AUXTRANS = 0;
                    CONC_MONTO = :BASICO;
                    if (CONC_PORC <> 0 and CONC_PORC is not null) then
                        VALOR = (((:CONC_MONTO)+ :CAMBSALTRANS + :INCAP + :RECARGO + :AUXTRANS + :BENEFICIOS) * :CONC_PORC) /100;
                    else
                        if (PORCEN <> 0 and PORCEN is not null) then
                            VALOR = (((:CONC_MONTO)+ :CAMBSALTRANS + :INCAP + :RECARGO + :AUXTRANS + :BENEFICIOS) * :PORCEN) /100;
                        else
                            if (MONTOS <> 0 and MONTOS is not null) then
                                VALOR = :MONTOS;
                            else
                                if (CONC_MONTO <> 0 and CONC_MONTO is not null) then
                                    VALOR = :CONC_MONTO;
                    ITEM = :ITEM + 1;
                    end /* provision */
                else if (CONC_COD = 920) then /* comisiones */
                    begin
                    select C.NCOM_MONTO from NOMINA_COMISIONES C where C.NCOM_ANO = :ANO and C.NCOM_PERIODO = :PERIODO and C.NCOM_PERIODICIDAD = :PERIODICIDAD and C.TERC_NIT = :NITE into :VALOR;
                    if (VALOR is null) then
                    VALOR = 0;
                    ITEM = :ITEM + 1;
                    end
                else if (CONC_COD = 900 or (:CONC_COD = 931)) then /* horas extra */
                    begin
                    select C.NOEX_MONTO from NOMINA_HORASEXT C where C.NOEX_ANO = :ANO and
                        C.NOEX_PERIODIO = :PERIODO and C.NOEX_PERIODICIDAD = :PERIODICIDAD and C.TERC_NIT = :NITE into :VALOR;
                    if (VALOR is null) then
                        VALOR = 0;
                    ITEM = :ITEM + 1;
                    end
                else if (CONC_COD = 954) then /* cartera */
                    begin
                    select SUM(C.NCAR_MONTO) from NOMINA_CARTERA C where C.NCAR_ANO = :ANO and C.NCAR_PERIODO = :PERIODO and C.NCAR_PERIODICIDAD = :PERIODICIDAD and C.TERC_NIT = :NITE into :VALOR;
                    if (VALOR is null) then
                        VALOR = 0;
                    ITEM = :ITEM + 1;
                    end
                else if (CONC_COD = 932) then
                    begin
                    /* incapacidad */
                    select SUM(ND.NNDE_DURACION) from NOMINA_NOVEDADES N, nomina_novedades_detalle ND
                        where N.nono_id = ND.nono_id AND N.TERC_NIT = :NITE and ND.NNDE_PERIODO = :PERIODO and ND.NNDE_ANO = :ANO
                        and ((N.TNOV_COD = 2) or (N.TNOV_COD = 3)) into :DIASNOV;
                    if (:DIASNOV is null) then
                        VALOR = 0;
                    else
                        VALOR = (:BASICO / 30)* :DIASNOV;
                    end
                else if (CONC_COD = 921) then
                    begin
                    if (PORCEN is not null and PORCEN <> 0) then
                        VALOR = ((BASICO / 30)* :DIASLAB ) * :PORCEN /100;
                    else
                        if (CONC_PORC is not null and CONC_PORC <> 0) then
                            VALOR = ((BASICO / 30)* :DIASLAB ) * :CONC_PORC /100;
                    end
                else if (CONC_COD = 953) then
                    begin
                    /* RECARGO */
                    BASICO = BASICOEMP;
                    VALOR = (((:BASICO/30)/8)*:TAR_RECNOTC)*:RECNOCT;
                    VALOR = :VALOR + ((((:BASICO/30)/8)*:TAR_RECFEST)*:RECFEST);
                    end
                if (CONC_APORTE = 'S') then
                    begin
                    if (ENTIDAD is null or (ENTIDAD = '') ) then
                        ENTIDAD = :CONC_ENTIDAD;
                    end
                end
            if ((VALOR <> 0) and (VALOR is not null)) then
                begin
                execute procedure REDONDEE(:VALOR, :APROX) returning_values (VALOR);
                if ((MENSUAL = 'N') or (PERIODICIDAD = 1))  then
                    insert into NOMINA_CONCEPTOS (NOMI_ID, NOCO_ITEM, CONC_COD,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, NOCO_GTOEMPR)
                        values (:IDNOMINA,:ITEM, :CONCEPT, :NIT_TERCERO, :VALOR, :ENTIDAD, :CONC_DEDUC, :CONC_PROV, :CONC_APORTE, :PERIODO, :ANO, :CONC_MODIFI, :CONC_APLICAPROM, :SALARIO, :GTOEMPR);
                else
                    if (MENSUAL = 'S') then
                        begin
                        if ((:PERIODICIDAD = 2) and (LIQUIDAPER = 1)) then
                            begin
                            if ((PERIODO = 1) or (PERIODO = 3) or (PERIODO = 5) or (PERIODO = 7) or (PERIODO = 9) or (PERIODO = 11)
                                or (PERIODO = 13) or (PERIODO = 15) or (PERIODO = 17) or (PERIODO = 19) or (PERIODO = 21) or (PERIODO = 23)) then
                                insert into NOMINA_CONCEPTOS (NOMI_ID, NOCO_ITEM, CONC_COD,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, NOCO_GTOEMPR)
                                    values (:IDNOMINA,:ITEM, :CONCEPT, :NIT_TERCERO, :VALOR, :ENTIDAD, :CONC_DEDUC, :CONC_PROV, :CONC_APORTE, :PERIODO, :ANO, :CONC_MODIFI, :CONC_APLICAPROM, :SALARIO, :GTOEMPR);
                            end
                        else if ((:PERIODICIDAD = 2) and (LIQUIDAPER = 2)) then
                            begin
                            if ((PERIODO = 2) or (PERIODO = 4) or (PERIODO = 6) or (PERIODO = 8) or (PERIODO = 10) or (PERIODO = 12)
                                or (PERIODO = 14) or (PERIODO = 16) or (PERIODO = 18) or (PERIODO = 20) or (PERIODO = 22) or (PERIODO = 24)) then
                                insert into NOMINA_CONCEPTOS (NOMI_ID, NOCO_ITEM, CONC_COD,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, NOCO_GTOEMPR)
                                    values (:IDNOMINA,:ITEM, :CONCEPT, :NIT_TERCERO, :VALOR, :ENTIDAD, :CONC_DEDUC, :CONC_PROV, :CONC_APORTE, :PERIODO, :ANO, :CONC_MODIFI, :CONC_APLICAPROM, :SALARIO, :GTOEMPR);
                            end
                        else if ((:PERIODICIDAD = 3) and (LIQUIDAPER = 1)) then
                            begin
                            if ((PERIODO = 1) or (PERIODO = 5) or (PERIODO = 9) or (PERIODO = 13) or (PERIODO = 17) or (PERIODO = 21)
                                or (PERIODO = 25) or (PERIODO = 29) or (PERIODO = 33) or (PERIODO = 37) or (PERIODO = 41) or (PERIODO = 45)
                                or (PERIODO = 49)) then
                                insert into NOMINA_CONCEPTOS (NOMI_ID, NOCO_ITEM, CONC_COD,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, NOCO_GTOEMPR)
                                    values (:IDNOMINA,:ITEM, :CONCEPT, :NIT_TERCERO, :VALOR, :ENTIDAD, :CONC_DEDUC, :CONC_PROV, :CONC_APORTE, :PERIODO, :ANO, :CONC_MODIFI, :CONC_APLICAPROM, :SALARIO, :GTOEMPR);
                            end
                        else if ((:PERIODICIDAD = 3) and (LIQUIDAPER = 2)) then
                            begin
                            if ((PERIODO = 2) or (PERIODO = 6) or (PERIODO = 10) or (PERIODO = 14) or (PERIODO = 18) or (PERIODO = 22)
                                or (PERIODO = 26) or (PERIODO = 30) or (PERIODO = 34) or (PERIODO = 38) or (PERIODO = 42) or (PERIODO = 46)
                                or (PERIODO = 50)) then
                                insert into NOMINA_CONCEPTOS (NOMI_ID, NOCO_ITEM, CONC_COD,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, NOCO_GTOEMPR)
                                    values (:IDNOMINA,:ITEM, :CONCEPT, :NIT_TERCERO, :VALOR, :ENTIDAD, :CONC_DEDUC, :CONC_PROV, :CONC_APORTE, :PERIODO, :ANO, :CONC_MODIFI, :CONC_APLICAPROM, :SALARIO, :GTOEMPR);
                            end
                        else if ((:PERIODICIDAD = 3) and (LIQUIDAPER = 3)) then
                            begin
                            if ((PERIODO = 3) or (PERIODO = 7) or (PERIODO = 11) or (PERIODO = 15) or (PERIODO = 19) or (PERIODO = 23)
                                or (PERIODO = 27) or (PERIODO = 31) or (PERIODO = 35) or (PERIODO = 39) or (PERIODO = 43) or (PERIODO = 47)
                                or (PERIODO = 51)) then
                                insert into NOMINA_CONCEPTOS (NOMI_ID, NOCO_ITEM, CONC_COD,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, NOCO_GTOEMPR)
                                    values (:IDNOMINA,:ITEM, :CONCEPT, :NIT_TERCERO, :VALOR, :ENTIDAD, :CONC_DEDUC, :CONC_PROV, :CONC_APORTE, :PERIODO, :ANO, :CONC_MODIFI, :CONC_APLICAPROM, :SALARIO, :GTOEMPR);
                            end
                        else if ((:PERIODICIDAD = 3) and (LIQUIDAPER = 4)) then
                            begin
                            if ((PERIODO = 4) or (PERIODO = 8) or (PERIODO = 12) or (PERIODO = 16) or (PERIODO = 20) or (PERIODO = 24)
                                or (PERIODO = 29) or (PERIODO = 32) or (PERIODO = 36) or (PERIODO = 40) or (PERIODO = 44) or (PERIODO = 48)
                                or (PERIODO = 52)) then
                                insert into NOMINA_CONCEPTOS (NOMI_ID, NOCO_ITEM, CONC_COD,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, NOCO_GTOEMPR)
                                    values (:IDNOMINA,:ITEM, :CONCEPT, :NIT_TERCERO, :VALOR, :ENTIDAD, :CONC_DEDUC, :CONC_PROV, :CONC_APORTE, :PERIODO, :ANO, :CONC_MODIFI, :CONC_APLICAPROM, :SALARIO, :GTOEMPR);
                            end
                        end
                    VALOR = 0;
                    BASICO = 0;
                    end
            end /* for */
        end
    end
suspend;
end
^

SET TERM ; ^

/* 20100729B */
/* aportes y provisiones si son mensuales no tomaban el basico del mes completo */

SET TERM ^ ;

CREATE OR ALTER PROCEDURE CAUSA_NOMINA (
    fec date,
    periodo integer,
    periodicidad integer,
    pagoglobal char(1),
    ano char(4),
    depto integer)
returns (
    idnomina integer,
    itemini integer)
as
declare variable item integer;
declare variable nite varchar(20);
declare variable nit_tercero varchar(20);
declare variable concept integer;
declare variable montos numeric(18,2);
declare variable porcen numeric(9,4);
declare variable entidad varchar(20);
declare variable conc_cod integer;
declare variable conc_deduc char(1);
declare variable conc_porc numeric(9,4);
declare variable conc_entidad integer;
declare variable conc_monto numeric(18,2);
declare variable conc_modifi char(1);
declare variable conc_promedio char(1);
declare variable valor numeric(18,2);
declare variable diaslab integer;
declare variable conc_prov char(1);
declare variable conc_aporte char(1);
declare variable numeroprom integer;
declare variable conc_aplicaprom char(1);
declare variable perinicial integer;
declare variable perfinal integer;
declare variable anoini integer;
declare variable anofin integer;
declare variable conc_dias char(1);
declare variable conc_otroconc char(1);
declare variable conc_codotroconc integer;
declare variable anosum integer;
declare variable salario char(1);
declare variable liquidaper integer;
declare variable basico numeric(18,2);
declare variable niteps varchar(20);
declare variable nitafc varchar(20);
declare variable nitafp varchar(20);
declare variable nitccf varchar(20);
declare variable gtoempr char(1);
declare variable comision numeric(18,2);
declare variable cambsaltrans numeric(18,2);
declare variable saldosini numeric(18,2);
declare variable duranov integer;
declare variable base numeric(18,2);
declare variable aprox integer;
declare variable mensual char(1);
declare variable horasex numeric(18,2);
declare variable diasnov integer;
declare variable tomasal integer;
declare variable retroact numeric(18,2);
declare variable reembolso numeric(18,2);
declare variable incap numeric(18,2);
declare variable auxtrans numeric(18,2);
declare variable smlv numeric(18,2);
declare variable beneficios numeric(18,2);
declare variable confirmado char(1);
declare variable recnoct numeric(18,2);
declare variable recfest numeric(18,2);
declare variable tar_recnotc numeric(9,4);
declare variable tar_recfest numeric(9,4);
declare variable recargo numeric(18,2);
declare variable basicorec numeric(18,2);
declare variable parambenef char(2);
declare variable vacacdisf numeric(18,2);
declare variable valorpredet numeric(18,2);
declare variable basicoemp numeric(18,2);
declare variable salinteg char(1);
declare variable tar_salinteg numeric(9,4);
begin
execute procedure LEE_CONFIGURACION('NOMINA','LIQUIDACION','TOMAR BENEFICIOS PARA CALCULAR PROVISIONES')returning_values(:PARAMBENEF);
execute procedure LEE_CONFIGURACION('NOMINA','GENERAL','REDONDEO AL MULTIPLO DE DIEZ EN TOTALES')returning_values(:APROX);
select N.NOMI_ID, N.NOMI_LIQOK from NOMINA N where N.NOMI_PERIODO = :PERIODO and N.NOMI_PERIODOCIDAD = :PERIODICIDAD
    and N.NOMI_ANO = :ANO into :IDNOMINA, :CONFIRMADO;
if (:IDNOMINA is null) then
    begin
    execute procedure CAMBIE_ID_NOMINA returning_values(:IDNOMINA);
    insert into NOMINA (NOMI_ID, NOMI_FECCAUSA, NOMI_PAGOGLOBAL, NOMI_PERIODOCIDAD, NOMI_PERIODO, NOMI_ANO, NOMI_LIQOK)
    values (:IDNOMINA, :FEC,:PAGOGLOBAL, :PERIODICIDAD, :PERIODO, :ANO, 'N');
    ITEM = 1;
    end
else
    begin
    select max(N.NOCO_ITEM) from NOMINA_CONCEPTOS N where N.NOMI_ID = :IDNOMINA
    into :ITEM;
    end
if ((CONFIRMADO = 'S') and (IDNOMINA is not null)) then
    begin
    IDNOMINA = 0;
    end
else
    begin
    insert into NOMINA_DEPARTAMENTO (NOMI_ID, NODP_DEPTO)values(:IDNOMINA,:DEPTO);
    select P.PAAN_RECNOC, P.PAAN_RECFEST, P.paan_salinteg from PARAMETROS_ANO P where P.PAAN_ANO = :ANO
        into :TAR_RECNOTC, :TAR_RECFEST, TAR_SALINTEG;
    ITEMINI = ITEM;
    for select E.TERC_NIT, E.EMPL_EPS, E.EMPL_AFC, E.EMPL_AFP, E.EMPL_CCF, E.empl_salinteg
        from EMPLEADOS E
        where E.EMPL_PPAGO = :PERIODICIDAD and ((E.EMPL_FECRET is null) or (E.EMPL_FECRET > :FEC)) and E.EMPL_FECING <= :FEC
        and ((:DEPTO = 0) or (e.empl_dpto = :DEPTO))
        into :NITE, :NITEPS, :NITAFC, :NITAFP, :NITCCF, :SALINTEG
        do
        begin
        select first 1 M.MVSE_SALARIO from MOVIMIENTO_SALARIO_EMPLEADO M where M.TERC_NIT = :NITE and M.MVSE_FECHA <= :FEC order by M.MVSE_FECHA desc into :BASICOEMP;
        BASICO = BASICOEMP;
        RECNOCT = null;
        RECFEST = null;
        select N.NOEX_RECNOCT, N.NOEX_RECFEST
            from NOMINA_HORASEXT N where N.NOEX_PERIODIO = :PERIODO and N.NOEX_ANO = :ANO and N.TERC_NIT = :NITE
            into :RECNOCT, :RECFEST;
        if (RECNOCT is null) then
            RECNOCT = 0;
        if (RECFEST is null) then
            RECFEST = 0;
        for select CE.TERC_NIT, CE.CONC_COD, CE.EMCO_MONTO, CE.EMCO_PORC, CE.EMPL_ENTIDAD, CE.EMCO_PERPROM, CE.EMCO_LUQUIDAPER, CE.EMCO_MENSUAL, CN.CONC_COD, CN.CONC_DEDUC,CN.CONC_PORC, CN.CONC_ENTIDAD, CN.CONC_MONTO,  CN.CONC_DIAS, CN.CONC_MODIFI,
            CN.CONC_PROMEDIO, CN.CONC_SALARIO, CN.CONC_PROV, CN.CONC_APORTE, CN.CONC_APLICAPROM, CN.CONC_OTROCONC, CN.CONC_CODOTROCONC, CN.CONC_GTOEMPR, CN.CONC_BASE, CE.EMCO_TOMSAL
            from EMPLEADO_CONCEPTOS CE, CONCEPTOS_NOMINA CN where (CE.CONC_COD = CN.CONC_COD) and (CE.TERC_NIT = :NITE) and
            ( ((CE.EMCO_FECINI <= :FEC and CE.EMCO_FECFIN >= :FEC)) or
            ((CN.CONC_TODOSPER = 'N') and (CE.EMCO_PPAGO = :PERIODO)) or ((CN.CONC_TODOSPER = 'S') AND (((:periodicidad = 1) AND (:PERIODO < 13)) or ((:periodicidad = 2) AND (:PERIODO < 25)))) )  order by (TERC_NIT )
            into :NIT_TERCERO, :CONCEPT,  :MONTOS, :PORCEN, :ENTIDAD, :NUMEROPROM, :LIQUIDAPER, :MENSUAL ,:CONC_COD, :CONC_DEDUC, :CONC_PORC,
            :CONC_ENTIDAD, :CONC_MONTO, :CONC_DIAS, :CONC_MODIFI,:CONC_PROMEDIO, :SALARIO,:CONC_PROV, :CONC_APORTE , :CONC_APLICAPROM, :CONC_OTROCONC, :CONC_CODOTROCONC, :GTOEMPR, :BASE, :TOMASAL
            do
            begin
            if (CONC_DIAS = 'S') then
                execute procedure DIAS_LABORADOS (:NITE, :PERIODO, :FEC, :MENSUAL,:CONC_APORTE) returning_values (:DIASLAB);
            else
                BEGIN
                SELECT PPAG_DIAS FROM PERIODO_PAGO WHERE PPAG_COD = :periodicidad INTO :diaslab;
                END
            if (:TOMASAL <> 0) then
                begin
                /* SI EL CONCEPTO NOAPLICA EN ESTE PERIODO DEJE EL BASICO EN CERO */
                if ((:PERIODICIDAD = 2) and (:TOMASAL <> 2)) then
                    begin
                    if ((PERIODO = 2) or (PERIODO = 4) or (PERIODO = 6) or (PERIODO = 8) or (PERIODO = 10) or (PERIODO = 12)
                        or (PERIODO = 14) or (PERIODO = 16) or (PERIODO = 18) or (PERIODO = 20) or (PERIODO = 22) or (PERIODO = 24)) then
                        BASICO = 0;
                    end
                else
                    if ((:PERIODICIDAD = 3) and (:TOMASAL <> 1)) then
                        begin
                        if ((PERIODO = 1) or (PERIODO = 5) or (PERIODO = 9) or (PERIODO = 13) or (PERIODO = 17) or (PERIODO = 21)
                            or (PERIODO = 25) or (PERIODO = 29) or (PERIODO = 33) or (PERIODO = 37) or (PERIODO = 41) or (PERIODO = 45)
                            or (PERIODO = 49)) then
                            BASICO = 0;
                        end
                    else
                        if ((:PERIODICIDAD = 3) and (:TOMASAL <> 2)) then
                            begin
                            if ((PERIODO = 2) or (PERIODO = 6) or (PERIODO = 10) or (PERIODO = 14) or (PERIODO = 18) or (PERIODO = 22)
                                or (PERIODO = 26) or (PERIODO = 30) or (PERIODO = 34) or (PERIODO = 38) or (PERIODO = 42) or (PERIODO = 46)
                                or (PERIODO = 50)) then
                                BASICO = 0;
                            end
                        else
                            if ((:PERIODICIDAD = 3) and (:TOMASAL <> 3)) then
                                begin
                                if ((PERIODO = 3) or (PERIODO = 7) or (PERIODO = 11) or (PERIODO = 15) or (PERIODO = 19) or (PERIODO = 23)
                                    or (PERIODO = 27) or (PERIODO = 31) or (PERIODO = 35) or (PERIODO = 39) or (PERIODO = 43) or (PERIODO = 47)
                                    or (PERIODO = 51)) then
                                    BASICO = 0;
                                end
                            else
                                if ((:PERIODICIDAD = 3) and (:TOMASAL <> 4)) then
                                begin
                                if ((PERIODO = 4) or (PERIODO = 8) or (PERIODO = 12) or (PERIODO = 16) or (PERIODO = 20) or (PERIODO = 24)
                                    or (PERIODO = 29) or (PERIODO = 32) or (PERIODO = 36) or (PERIODO = 40) or (PERIODO = 44) or (PERIODO = 48)
                                    or (PERIODO = 52)) then
                                    BASICO = 0;
                                end
                end
            else
                begin
                /* SE CALCULA SOBRE TODOS LOS PERIODOS */
                BASICO = BASICOEMP;
                end
            VALORPREDET = null;
            select VP.NVPR_MONTO from NOMINA_VALOR_PREDET VP where VP.NVPR_PERIODICIDAD = :PERIODICIDAD and VP.NVPR_PERIODO = :PERIODO and VP.NVPR_ANO = :ANO and VP.CONC_COD = :CONC_COD and VP.TERC_NIT = :NITE
                into :VALORPREDET;
            if ((:VALORPREDET <> 0) and (VALORPREDET is not null)) then
                VALOR = VALORPREDET;
            else
                begin
                /* SI HAY UN CAMBIO TRANSITORIO DE SALARIO AJUSTE LOS DIAS Y CALCULE EL VALOR A SUMAR */
                select SUM((N.NONO_VALOR /30) * ND.NNDE_DURACION), SUM(ND.NNDE_DURACION) from NOMINA_NOVEDADES N, nomina_novedades_detalle ND
                    where N.nono_id = ND.nono_id AND N.TNOV_COD = 11 and N.TERC_NIT = :NITE and ND.NNDE_PERIODO = :PERIODO
                    into :CAMBSALTRANS, :DURANOV;
                if (CAMBSALTRANS is null) then
                    CAMBSALTRANS = 0;
                if (DURANOV is null) then
                    DURANOV = 0;
                DIASLAB = :DIASLAB - :DURANOV;
                /* SI ES UN PRESTAMO, TRAIGA LA CUOTA */
                if (CONC_COD = 922) then
                    begin
                    select sum(P.PRCU_MONTO) from PRESTAMO_CUOTAS P, PRESTAMO_NOMINA PN
                        where P.PRCU_ANO = :ANO and P.PRCU_PERIODO = :PERIODO and PN.PRNO_ID = P.PRNO_ID and PN.TERC_NIT = :NITE into :VALOR;
                    if (VALOR is null) then
                        VALOR = 0;
                    ITEM = :ITEM + 1;
                    /* MARQUE LA CUOTA COMO PAGADA */
                    update PRESTAMO_CUOTAS  P set PRCU_OK = 'S' where P.PRCU_ANO = :ANO and P.PRCU_PERIODO = :PERIODO
                        and exists (select PRNO_ID from PRESTAMO_NOMINA where TERC_NIT = :NITE and PRNO_ID = P.prno_id);
                    end
                else
                    if ((:MONTOS = 0) or (:MONTOS is null)) then
                        begin
                        /* SI EL CONCEPTO DEL EMPLEADO NO TIENE MONTO TRAIGA EL DE CONCEPTOS_NOMINA */
                        if ((CONC_PORC = 0 and :PORCEN = 0) or (CONC_PORC is null and :PORCEN = 0) or (CONC_PORC = 0 and :PORCEN is null) or (CONC_PORC is null and :PORCEN is null) ) then
                            begin
                            /* SIN PORCENTAJE */
                            if ((CONC_MONTO <> 0) and (CONC_MONTO is not null) ) then
                                begin
                                VALOR = :CONC_MONTO;
                                if (:CONC_DIAS = 'S') then
                                    VALOR = (:VALOR / 30) * :DIASLAB;
                                end
                            else
                                if (SALARIO = 'S' and CONC_COD <> 900 and CONC_COD <> 920 and CONC_COD <> 932 and CONC_COD <> 953) then
                                    begin
                                    /* SI ES SALARIO SUME LAS EXTRAS */
                                    BASICO = BASICOEMP;
                                    BASICO = ((:BASICO/30)*:DIASLAB);/* - (((:BASICO/30)/8)*:RECNOCT);/* PFP:DEBERIA SER + Y POR LA TARIFA QUE NO VEO POR NINGUN LADO
                                    BASICO = :BASICO - (((:BASICO/30)/8)*:RECFEST);*/
                                    CONC_MONTO = :BASICO;
                                    VALOR = (:CONC_MONTO/*/30 * :diaslab*/ ) + :CAMBSALTRANS;
                                    end
                                else
                                    begin
                                    VALOR = MONTOS;
                                    if (:CONC_DIAS = 'S') then
                                        VALOR = (:VALOR / 30) * :DIASLAB;
                                    end
                            end
                        else    
                            begin
                            if (:PORCEN <> 0) then
                                begin
                                /* SI TIENE PORCENTAJE EN EMPLEADO_CONCEPTOS PERO EL MONTO SE TRAE DE CONCPETOS_NOMINA */
                                if ((CONC_MONTO <> 0) and (CONC_MONTO is not null) ) then
                                    begin
                                    VALOR = ((:CONC_MONTO ) * :PORCEN) /100;
                                    end
                                end
                            else
                                begin
                                /* NO TIENE PORCENTAJE EN EMPLEADO_CONCEPTOS SE TRAE MONTO Y PORC DE CONCPETOS_NOMINA */
                                if ((CONC_MONTO <> 0) and (CONC_MONTO is not null) ) then
                                    begin
                                    VALOR = ((:CONC_MONTO) * :CONC_PORC) /100;
                                    end
                                else
                                    if (SALARIO = 'S' and CONC_COD <> 900 and CONC_COD <> 920 and CONC_COD <> 932 and CONC_COD <> 953) then
                                        begin
                                        BASICO = BASICOEMP;
                                        BASICO = ((:BASICO/30)*:DIASLAB); /* - (((:BASICO/30)/8)*:RECNOCT);
                                        BASICO = :BASICO - (((:BASICO/30)/8)*:RECFEST);*/
                                        CONC_MONTO = :BASICO;
                                        VALOR = ((:CONC_MONTO)+ :CAMBSALTRANS * :CONC_PORC) /100;
                                        end
                                    else
                                        if (:CONC_MONTO = 0 and :MONTOS = 0) then
                                            begin
                                            CONC_MONTO = :BASICO;
                                            VALOR = (((:CONC_MONTO / 30) * :DIASLAB) + :CAMBSALTRANS * :CONC_PORC) /100;
                                            end
                                end
                            end
                        end
                    else
                        /* SI TIENE MONTO EN EMPLEADO_CONCEPTOS */
                        if ((CONC_PORC = 0 or (CONC_PORC is null)) and (:PORCEN = 0 or (PORCEN is null))) then
                            begin
                            VALOR = (:MONTOS);
                            if (:CONC_DIAS = 'S') then
                                VALOR = (:VALOR / 30) * :DIASLAB;   
                            end
                        else
                            if (:PORCEN <> 0 and PORCEN is not null) then
                                begin
                                VALOR = ((:MONTOS ) * :PORCEN) /100;
                                end
                            else
                                begin
                                VALOR = ((:MONTOS) * :CONC_PORC) /100;
                                end
                if (CONC_PROMEDIO = 'S') then
                    begin
                    /* CALCULO DEL PROMEDIO BASE DESDE LA FECHA MENOS EL NUMERO DE PERIODOS */
                    EXECUTE PROCEDURE periodo_nom_fecha (:fec, :periodicidad) returning_values (:perfinal, :anofin);
                    if (perfinal < numeroprom) then
                        BEGIN
                        anoini = anofin - 1;
                        if (periodicidad = 1) then
                            perinicial = 12 - (numeroprom - perfinal) + 1;
                        if (periodicidad = 2) then
                            perinicial = 24 - (numeroprom - perfinal) + 1;
                        if (periodicidad = 3) then
                            perinicial = 52 - (numeroprom - perfinal) + 1;
                        END
                    ELSE
                        BEGIN
                        PERINICIAL = :perfinal - :NUMEROPROM + 1;
                        anoini = ANOFIN;
                        END
                    if (anoini <> anofin) then
                        select sum (NOCO_VALOR) from NOMINA_CONCEPTOS N where N.NOCO_APLICAPROM = 'S' and
                            ((N.NOCO_PERIODO >= :PERINICIAL and N.NOCO_ANO = :anoini) or
                            (N.NOCO_PERIODO <= :perfinal and N.NOCO_ANO = :anofin)) and TERC_NIT = :NITE into :VALOR;
                    else
                        select sum (NOCO_VALOR) from NOMINA_CONCEPTOS N where N.NOCO_APLICAPROM = 'S' and
                            N.NOCO_PERIODO >= :PERINICIAL and N.NOCO_ANO = :anoini
                            and N.NOCO_PERIODO <= :perfinal and TERC_NIT = :NITE into :VALOR;
                    /* sume el saldo inicial */
                    SALDOSINI = 0;
                    select NOCO_VALOR from NOMINA_CONCEPTOS where CONC_COD = :CONC_COD and TERC_NIT  = :NITE and NOCO_PAGOOK = 'N' and NOCO_PERIODO = 0 into :SALDOSINI;
                    if (SALDOSINI is null) then
                        SALDOSINI = 0;
                    else
                        update NOMINA_CONCEPTOS N set NOCO_PAGOOK = 'S' where N.NOCO_APLICAPROM = 'S' and
                            CONC_COD = :CONC_COD and TERC_NIT = :NITE and NOCO_PERIODO = 0;

                    VALOR = :VALOR + :SALDOSINI;
                    /* APLIQUE LA PROPORCION Y EL PORCENTAJE */
                    VALOR = VALOR / NUMEROPROM;
                    VALOR = VALOR * PORCEN / 100;
                    end
                else if (CONC_OTROCONC = 'S') then
                    begin
                    ANOSUM = cast(ANO as integer);
                    ANOSUM = ANOSUM - 1;
                    select sum (NOCO_VALOR) from NOMINA_CONCEPTOS N where N.NOCO_ANO = :ANOSUM and N.CONC_COD = :CONC_CODOTROCONC and N.TERC_NIT = :NITE into :VALOR;
                    select NOCO_VALOR from NOMINA_CONCEPTOS where NOCO_ANO = :ANOSUM and CONC_COD = :CONC_CODOTROCONC and TERC_NIT = :NITE and NOCO_PERIODO = 0 into :SALDOSINI;
                    if (SALDOSINI is null) then
                        SALDOSINI = 0;
                    else
                        update NOMINA_CONCEPTOS set NOCO_PAGOOK = 'S' where NOCO_ANO = :ANOSUM and CONC_COD = :CONC_CODOTROCONC and NOCO_PERIODO = 0 and TERC_NIT = :NITE;
                    VALOR = :VALOR + :SALDOSINI;
                    update NOMINA_CONCEPTOS set NOCO_PAGOOK = 'S' where NOCO_ANO = :ANOSUM and CONC_COD = :CONC_CODOTROCONC and TERC_NIT = :NITE;
                    end
                else if (CONC_APORTE = 'S') then
                    begin
                    HORASEX = null;
                    DIASNOV = null;
                    RETROACT = null;
                    REEMBOLSO = null;
                    BENEFICIOS = null;
                    RECARGO = null;
                    COMISION = null;
                    INCAP = null;
                    VACACDISF = null;
                    if ((:ENTIDAD = '' ) or (ENTIDAD is null)) then
                        begin
                        /*COMISIONES*/
                        if (MENSUAL = 'S') then
                            BEGIN
                            if (PERIODICIDAD = 1) then
                                BEGIN
                                perinicial = PERIODO;
                                PERFINAL = PERIODO;
                                END
                            if (PERIODICIDAD = 2) then
                                BEGIN
                                perinicial = PERIODO - (LIQUIDAPER - 1);
                                PERFINAL = PERIODO + (2 - LIQUIDAPER);
                                END
                            if (PERIODICIDAD = 3) then
                                BEGIN
                                perinicial = PERIODO - (LIQUIDAPER - 1);
                                PERFINAL = PERIODO + (4 - LIQUIDAPER);
                                END
                            END
                        ELSE
                            BEGIN
                            perinicial = PERIODO;
                            PERFINAL = PERIODO;
                            END
                            
                        /* SUME LAS COMISIONES DE LOS DEMAS PERIODOS DEL MES */
                        select SUM(C.NCOM_MONTO) from NOMINA_COMISIONES C where C.NCOM_ANO = :ANO
                            and C.NCOM_PERIODO >= :PERINICIAL AND C.NCOM_PERIODO <= :PERFINAL
                            and C.NCOM_PERIODICIDAD = :PERIODICIDAD and C.TERC_NIT = :NITE
                            into :COMISION;
                        if (COMISION is null) then
                            COMISION = 0;
                        /*RETROACTIVO*/
                        select C.EMCO_MONTO from EMPLEADO_CONCEPTOS C where C.TERC_NIT = :NITE
                            and C.CONC_COD = 933 into :RETROACT;
                            if (RETROACT is null ) then
                                RETROACT = 0;
                        /*REEMBOLSO*/
                        select C.EMCO_MONTO from EMPLEADO_CONCEPTOS C where C.TERC_NIT = :NITE
                            and C.CONC_COD = 952 into :REEMBOLSO;
                        if (REEMBOLSO is null ) then
                            REEMBOLSO = 0;
                        /*VACACIONES DISFRUTADAS ANTERIORMENTE*/
                        select C.EMCO_MONTO from EMPLEADO_CONCEPTOS C where C.TERC_NIT = :NITE
                            and C.CONC_COD = 955 into :VACACDISF;
                        if (VACACDISF is null ) then
                            VACACDISF = 0;
                        /* INCAPACIDAD*/
                        select SUM(ND.NNDE_DURACION) from NOMINA_NOVEDADES N, nomina_novedades_detalle ND
                            where N.nono_id = ND.nono_id AND N.TERC_NIT = :NITE
                            and ND.NNDE_PERIODO >= :perinicial and ND.NNDE_PERIODO <= :perfinal and ND.NNDE_ANO = :ANO and (N.TNOV_COD = 2 or (N.TNOV_COD = 3))
                            into :DIASNOV;
                        if (:DIASNOV is null) then
                            INCAP = 0;
                        else
                            INCAP = (:BASICO / 30)* :DIASNOV;
                        /*BASICO*/
                        if (SALINTEG = 'S') then
                            BASICO = BASICO * (tar_salinteg / 100);

                        if (MENSUAL <> 'S') then
                            BASICO = ((:BASICO/30)*:DIASLAB);
                        /*HORAS EXTRA*/
                        select SUM(C.NOEX_MONTO) from NOMINA_HORASEXT C where C.NOEX_ANO = :ANO
                            and C.NOEX_PERIODIO >= :PERINICIAL and C.NOEX_PERIODIO <= :PERFINAL
                            and C.NOEX_PERIODICIDAD = :PERIODICIDAD and C.TERC_NIT = :NITE
                            into :HORASEX;
                        if (HORASEX is null) then
                            HORASEX = 0;
                        /*RECARGOS*/
                        BASICOREC = BASICOEMP;
                        RECARGO = (((:BASICOREC/30)/8)*:TAR_RECNOTC)*:RECNOCT;
                        RECARGO = :RECARGO + ((((:BASICOREC/30)/8)*:TAR_RECFEST)*:RECFEST);
                        if (RECARGO is null) then
                            RECARGO = 0;
                        /*basico*/
                        if (MENSUAL <> 'S') then
                            begin
                            if (:BASICO + :COMISION + :HORASEX + :RETROACT+ :REEMBOLSO + :INCAP+ :CAMBSALTRANS < ((:SMLV/30)*:DIASLAB)) then
                                BASICO = (:SMLV/30)*:DIASLAB;
                            end
                        else
                            begin
                            if (:BASICO + :COMISION + :HORASEX + :RETROACT+ :REEMBOLSO + :INCAP+ :CAMBSALTRANS < :SMLV) then
                                BASICO = :SMLV;
                            end
                        /* SMLV Y AUX. TRANSPORTE*/
                        select P.PAAN_AUXTR, P.PAAN_SALMINIMO from PARAMETROS_ANO P
                            where P.PAAN_ANO = :ANO into :AUXTRANS, :SMLV;
                        /*BASE*/
                        VALOR = :BASICO + :COMISION + :HORASEX + :RETROACT+ :REEMBOLSO + :INCAP + :RECARGO + :CAMBSALTRANS + :VACACDISF;

                        if (CONC_COD = 904) then
                            begin
                            ENTIDAD = :NITAFP;
                            select A.PAAN_AFPTR from PARAMETROS_ANO A where A.PAAN_ANO = :ANO into :PORCEN;
                            VALOR = ((:VALOR) * :PORCEN) /100;
                            end
                        else if ((CONC_COD = 905) or (CONC_COD = 906) or (CONC_COD = 934) ) then
                            begin
                            ENTIDAD = :NITAFP;
                            select A.PAAN_AFPEM from PARAMETROS_ANO A where A.PAAN_ANO = :ANO into :PORCEN;
                            VALOR = ((:VALOR) * :PORCEN) /100;
                            end
                        else if ((CONC_COD = 907) or (CONC_COD = 914) or (CONC_COD = 915) or (conc_cod = 938)) then
                            begin
                            ENTIDAD = :NITEPS;
                            if (CONC_COD = 907) then
                                begin
                                select A.PAAN_EPSTR from PARAMETROS_ANO A where A.PAAN_ANO = :ANO into :PORCEN;
                                VALOR = ((:VALOR) * :PORCEN) /100;
                                end
                            else
                                begin
                                select A.PAAN_EPSEM from PARAMETROS_ANO A where A.PAAN_ANO = :ANO into :PORCEN;
                                    VALOR = ((:VALOR) * :PORCEN) /100;
                                end
                            end
                        else if ((CONC_COD = 910) or (CONC_COD = 911) or (CONC_COD = 936)) then
                            begin
                            /*ccf */
                            ENTIDAD = :NITCCF;
                            select A.PAAN_CCF from PARAMETROS_ANO A where A.PAAN_ANO = :ANO into :PORCEN;
                            VALOR = ((:VALOR) * :PORCEN) /100;
                            end
                        else if ((CONC_COD = 916) or (CONC_COD = 917) or (CONC_COD = 939) ) then
                            begin
                            /*icbf */
                            ENTIDAD = :NITCCF;
                            select A.PAAN_ICBF from PARAMETROS_ANO A where A.PAAN_ANO = :ANO into :PORCEN;
                            VALOR = ((:VALOR) * :PORCEN) /100;
                            end
                        else if ((CONC_COD = 918) or (CONC_COD = 919) or (CONC_COD = 940) ) then
                            begin
                            /*sena */
                            ENTIDAD = :NITCCF;
                            select A.PAAN_SENA from PARAMETROS_ANO A where A.PAAN_ANO = :ANO into :PORCEN;
                            VALOR = ((:VALOR) * :PORCEN) /100;
                            end
                        else if ((CONC_COD = 912) or (CONC_COD = 913) or (CONC_COD = 937)) then
                            begin
                            /* CESANTIAS */
                            ENTIDAD = :NITAFC;
                            if (PARAMBENEF = 'SI') then
                                begin
                                select sum(CE.EMCO_MONTO)
                                    from EMPLEADO_CONCEPTOS CE, CONCEPTOS_NOMINA CN where CN.CONC_BENEFIC = 'S' and (CE.TERC_NIT = :NITE) and (CE.CONC_COD = CN.CONC_COD) and
                                    ((CE.EMCO_FECINI <= :FEC and CE.EMCO_FECFIN >= :FEC) or ((CN.CONC_TODOSPER = 'N') and (CE.EMCO_PPAGO = :PERIODO)) or
                                    (CN.CONC_TODOSPER = 'S'))
                                    into :BENEFICIOS;
                                if (BENEFICIOS is null) then
                                    BENEFICIOS = 0;
                                end
                            else
                                BENEFICIOS = 0;
                            select P.PAAN_AUXTR, P.PAAN_SALMINIMO from PARAMETROS_ANO P
                                where P.PAAN_ANO = :ANO into :AUXTRANS, :SMLV;
                            if (:BASICO < (:SMLV*2)) then
                                AUXTRANS = (:AUXTRANS / 30) * :DIASLAB;
                            else
                                AUXTRANS = 0;
                            select A.PAAN_CESEMP from PARAMETROS_ANO A where A.PAAN_ANO = :ANO
                                into :PORCEN;
                            VALOR = ((:VALOR + :AUXTRANS + :BENEFICIOS) * :PORCEN) /100;
                            end
                        else
                            begin
                            if (COMISION is null) then
                                COMISION = 0;
                            select C.NCOM_MONTO from NOMINA_COMISIONES C where C.NCOM_ANO = :ANO and C.NCOM_PERIODO = :PERIODO and C.NCOM_PERIODICIDAD = :PERIODICIDAD and C.TERC_NIT = :NITE
                                into :COMISION;
                            CONC_MONTO = :BASICO + :COMISION;
                            if (CONC_PORC <> 0 and CONC_PORC is not null) then
                                if (mensual <> 'S') then
                                    VALOR = (((:CONC_MONTO/30 * :DIASLAB )+ :CAMBSALTRANS + :INCAP) * :CONC_PORC) /100;
                                else
                                    VALOR = ((:CONC_MONTO+ :CAMBSALTRANS + :INCAP) * :CONC_PORC) /100;
                            else
                                if (:PORCEN <> 0 and :PORCEN is not null) then
                                    if (mensual <> 'S') then
                                        VALOR = (((:CONC_MONTO/30 * :DIASLAB )+ :CAMBSALTRANS + :INCAP) * :PORCEN) /100;
                                    else
                                        VALOR = ((:CONC_MONTO + :CAMBSALTRANS + :INCAP) * :PORCEN) /100;
                                else
                                    if (:MONTOS <> 0 and :MONTOS is not null) then
                                        VALOR = :MONTOS;
                                    else
                                        if (:CONC_MONTO <> 0 and :CONC_MONTO is not null) then
                                            VALOR = :CONC_MONTO;
                            end
                        ITEM = :ITEM + 1;
                        end
                    end /* aportes */
                else if (CONC_PROV = 'S') then
                    begin
                    /*provisiones */
                    HORASEX = null;
                    DIASNOV = null;
                    RETROACT = null;
                    REEMBOLSO = null;
                    BENEFICIOS = null;
                    RECARGO = null;
                    COMISION = null;
                    INCAP = null;
                    if (MENSUAL = 'S') then
                        BEGIN
                        if (PERIODICIDAD = 1) then
                            BEGIN
                            perinicial = PERIODO;
                            PERFINAL = PERIODO;
                            END
                        if (PERIODICIDAD = 2) then
                            BEGIN
                            perinicial = PERIODO - (LIQUIDAPER - 1);
                            PERFINAL = PERIODO + (2 - LIQUIDAPER);
                            END
                        if (PERIODICIDAD = 3) then
                            BEGIN
                            perinicial = PERIODO - (LIQUIDAPER - 1);
                            PERFINAL = PERIODO + (4 - LIQUIDAPER);
                            END
                        END
                    ELSE
                        BEGIN
                        perinicial = PERIODO;
                        PERFINAL = PERIODO;
                        END
                    /* RECARGO*/
                    BASICO = BASICOEMP;
                    RECARGO = (((:BASICO/30)/8)*:TAR_RECNOTC)*:RECNOCT;
                    RECARGO = :RECARGO + ((((:BASICO/30)/8)*:TAR_RECFEST)*:RECFEST);
                    /*INCAPACIDAD*/
                    select SUM(ND.NNDE_DURACION) from NOMINA_NOVEDADES N, nomina_novedades_detalle ND
                        where N.nono_id = ND.nono_id AND N.TERC_NIT = :NITE
                        and ND.NNDE_PERIODO >= :perinicial and ND.NNDE_PERIODO <= :perfinal and ND.NNDE_ANO = :ANO
                        and (N.TNOV_COD = 2 or (N.TNOV_COD = 3)) into :DIASNOV;
                    if (:DIASNOV is null) then
                        INCAP = 0;
                    else
                        INCAP = (:BASICO / 30)* :DIASNOV;
                    /* BASICO*/
                    if (mensual <> 'S') then
                        BASICO = ((:BASICO/30)*:DIASLAB);
                    if (SALINTEG = 'S') then
                        BASICO = BASICO * (tar_salinteg / 100);
                    /*BENEFICIOS*/
                    if (PARAMBENEF = 'SI') then
                        begin
                        select sum(CE.EMCO_MONTO)
                            from EMPLEADO_CONCEPTOS CE, CONCEPTOS_NOMINA CN where CN.CONC_BENEFIC = 'S'
                            and (CE.TERC_NIT = :NITE) and (CE.CONC_COD = CN.CONC_COD) and
                            ((CE.EMCO_FECINI <= :FEC and CE.EMCO_FECFIN >= :FEC) or ((CN.CONC_TODOSPER = 'N')
                            and (CE.EMCO_PPAGO = :PERIODO)) or (CN.CONC_TODOSPER = 'S'))
                            into :BENEFICIOS;
                        if (BENEFICIOS is null) then
                            BENEFICIOS = 0;
                        end
                    else
                        BENEFICIOS = 0;
                    if ((CONC_COD <> 929) and (CONC_COD <> 930) and (CONC_COD <> 944)) then
                        begin
                        /* si no es vacaciones */
                        select P.PAAN_AUXTR, P.PAAN_SALMINIMO from PARAMETROS_ANO P where P.PAAN_ANO = :ANO
                            into :AUXTRANS, :SMLV;
                        if (:BASICO < (:SMLV*2)) then
                            begin
                            if (mensual <> 'S') then
                                AUXTRANS = (:AUXTRANS / 30) * :DIASLAB;
                            end
                        else
                            AUXTRANS = 0;
                        end
                    else
                        AUXTRANS = 0;
                    CONC_MONTO = :BASICO;
                    if (CONC_PORC <> 0 and CONC_PORC is not null) then
                        VALOR = ((:CONC_MONTO + :CAMBSALTRANS + :INCAP + :RECARGO + :AUXTRANS + :BENEFICIOS) * :CONC_PORC) /100;
                    else
                        if (PORCEN <> 0 and PORCEN is not null) then
                            VALOR = ((:CONC_MONTO + :CAMBSALTRANS + :INCAP + :RECARGO + :AUXTRANS + :BENEFICIOS) * :PORCEN) /100;
                        else
                            if (MONTOS <> 0 and MONTOS is not null) then
                                VALOR = :MONTOS;
                            else
                                if (CONC_MONTO <> 0 and CONC_MONTO is not null) then
                                    VALOR = :CONC_MONTO;
                    ITEM = :ITEM + 1;
                    end /* provision */
                else if (CONC_COD = 920) then /* comisiones */
                    begin
                    select C.NCOM_MONTO from NOMINA_COMISIONES C where C.NCOM_ANO = :ANO
                    and C.NCOM_PERIODO >= :perinicial and C.NCOM_PERIODO <= :perfinal and C.NCOM_PERIODICIDAD = :PERIODICIDAD and C.TERC_NIT = :NITE into :VALOR;
                    if (VALOR is null) then
                        VALOR = 0;
                    ITEM = :ITEM + 1;
                    end
                else if (CONC_COD = 900 or (:CONC_COD = 931)) then /* horas extra */
                    begin
                    select C.NOEX_MONTO from NOMINA_HORASEXT C where C.NOEX_ANO = :ANO and
                        C.NOEX_PERIODIO >= :perinicial and C.NOEX_PERIODIO <= :perfinal and C.NOEX_PERIODICIDAD = :PERIODICIDAD and C.TERC_NIT = :NITE into :VALOR;
                    if (VALOR is null) then
                        VALOR = 0;
                    ITEM = :ITEM + 1;
                    end
                else if (CONC_COD = 954) then /* cartera */
                    begin
                    select C.NCAR_MONTO from NOMINA_CARTERA C where C.NCAR_ANO = :ANO
                    and C.NCAR_PERIODO >= :perinicial and C.NCAR_PERIODO <= :perfinal and C.NCAR_PERIODICIDAD = :PERIODICIDAD and C.TERC_NIT = :NITE into :VALOR;
                    if (VALOR is null) then
                        VALOR = 0;
                    ITEM = :ITEM + 1;
                    end
                else if (CONC_COD = 932) then
                    begin
                    /* incapacidad */
                    select SUM(ND.NNDE_DURACION) from NOMINA_NOVEDADES N, nomina_novedades_detalle ND
                        where N.nono_id = ND.nono_id AND N.TERC_NIT = :NITE
                        and ND.NNDE_PERIODO >= :perinicial and ND.NNDE_PERIODO <= :perfinal and ND.NNDE_ANO = :ANO
                        and (N.TNOV_COD = 2 or (N.TNOV_COD = 3)) into :DIASNOV;
                    if (:DIASNOV is null) then
                        VALOR = 0;
                    else
                        VALOR = (:BASICO / 30)* :DIASNOV;
                    end
                else if (CONC_COD = 921) then
                    begin
                    if (PORCEN is not null and PORCEN <> 0) then
                        VALOR = ((BASICO / 30)* :DIASLAB ) * :PORCEN /100;
                    else
                        if (CONC_PORC is not null and CONC_PORC <> 0) then
                            VALOR = ((BASICO / 30)* :DIASLAB ) * :CONC_PORC /100;
                    end
                else if (CONC_COD = 953) then
                    begin
                    /* RECARGO */
                    BASICO = BASICOEMP;
                    VALOR = (((:BASICO/30)/8)*:TAR_RECNOTC)*:RECNOCT;
                    VALOR = :VALOR + ((((:BASICO/30)/8)*:TAR_RECFEST)*:RECFEST);
                    end
                if (CONC_APORTE = 'S') then
                    begin
                    if (ENTIDAD is null or (ENTIDAD = '') ) then
                        ENTIDAD = :CONC_ENTIDAD;
                    end
                end
            if ((VALOR <> 0) and (VALOR is not null)) then
                begin
                execute procedure REDONDEE(:VALOR, :APROX) returning_values (VALOR);
                if ((MENSUAL = 'N') or (PERIODICIDAD = 1))  then
                    insert into NOMINA_CONCEPTOS (NOMI_ID, NOCO_ITEM, CONC_COD,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, NOCO_GTOEMPR)
                        values (:IDNOMINA,:ITEM, :CONCEPT, :NIT_TERCERO, :VALOR, :ENTIDAD, :CONC_DEDUC, :CONC_PROV, :CONC_APORTE, :PERIODO, :ANO, :CONC_MODIFI, :CONC_APLICAPROM, :SALARIO, :GTOEMPR);
                else
                    if (MENSUAL = 'S') then
                        begin
                        if ((:PERIODICIDAD = 2) and (LIQUIDAPER = 1)) then
                            begin
                            if ((PERIODO = 1) or (PERIODO = 3) or (PERIODO = 5) or (PERIODO = 7) or (PERIODO = 9) or (PERIODO = 11)
                                or (PERIODO = 13) or (PERIODO = 15) or (PERIODO = 17) or (PERIODO = 19) or (PERIODO = 21) or (PERIODO = 23)) then
                                insert into NOMINA_CONCEPTOS (NOMI_ID, NOCO_ITEM, CONC_COD,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, NOCO_GTOEMPR)
                                    values (:IDNOMINA,:ITEM, :CONCEPT, :NIT_TERCERO, :VALOR, :ENTIDAD, :CONC_DEDUC, :CONC_PROV, :CONC_APORTE, :PERIODO, :ANO, :CONC_MODIFI, :CONC_APLICAPROM, :SALARIO, :GTOEMPR);
                            end
                        else if ((:PERIODICIDAD = 2) and (LIQUIDAPER = 2)) then
                            begin
                            if ((PERIODO = 2) or (PERIODO = 4) or (PERIODO = 6) or (PERIODO = 8) or (PERIODO = 10) or (PERIODO = 12)
                                or (PERIODO = 14) or (PERIODO = 16) or (PERIODO = 18) or (PERIODO = 20) or (PERIODO = 22) or (PERIODO = 24)) then
                                insert into NOMINA_CONCEPTOS (NOMI_ID, NOCO_ITEM, CONC_COD,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, NOCO_GTOEMPR)
                                    values (:IDNOMINA,:ITEM, :CONCEPT, :NIT_TERCERO, :VALOR, :ENTIDAD, :CONC_DEDUC, :CONC_PROV, :CONC_APORTE, :PERIODO, :ANO, :CONC_MODIFI, :CONC_APLICAPROM, :SALARIO, :GTOEMPR);
                            end
                        else if ((:PERIODICIDAD = 3) and (LIQUIDAPER = 1)) then
                            begin
                            if ((PERIODO = 1) or (PERIODO = 5) or (PERIODO = 9) or (PERIODO = 13) or (PERIODO = 17) or (PERIODO = 21)
                                or (PERIODO = 25) or (PERIODO = 29) or (PERIODO = 33) or (PERIODO = 37) or (PERIODO = 41) or (PERIODO = 45)
                                or (PERIODO = 49)) then
                                insert into NOMINA_CONCEPTOS (NOMI_ID, NOCO_ITEM, CONC_COD,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, NOCO_GTOEMPR)
                                    values (:IDNOMINA,:ITEM, :CONCEPT, :NIT_TERCERO, :VALOR, :ENTIDAD, :CONC_DEDUC, :CONC_PROV, :CONC_APORTE, :PERIODO, :ANO, :CONC_MODIFI, :CONC_APLICAPROM, :SALARIO, :GTOEMPR);
                            end
                        else if ((:PERIODICIDAD = 3) and (LIQUIDAPER = 2)) then
                            begin
                            if ((PERIODO = 2) or (PERIODO = 6) or (PERIODO = 10) or (PERIODO = 14) or (PERIODO = 18) or (PERIODO = 22)
                                or (PERIODO = 26) or (PERIODO = 30) or (PERIODO = 34) or (PERIODO = 38) or (PERIODO = 42) or (PERIODO = 46)
                                or (PERIODO = 50)) then
                                insert into NOMINA_CONCEPTOS (NOMI_ID, NOCO_ITEM, CONC_COD,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, NOCO_GTOEMPR)
                                    values (:IDNOMINA,:ITEM, :CONCEPT, :NIT_TERCERO, :VALOR, :ENTIDAD, :CONC_DEDUC, :CONC_PROV, :CONC_APORTE, :PERIODO, :ANO, :CONC_MODIFI, :CONC_APLICAPROM, :SALARIO, :GTOEMPR);
                            end
                        else if ((:PERIODICIDAD = 3) and (LIQUIDAPER = 3)) then
                            begin
                            if ((PERIODO = 3) or (PERIODO = 7) or (PERIODO = 11) or (PERIODO = 15) or (PERIODO = 19) or (PERIODO = 23)
                                or (PERIODO = 27) or (PERIODO = 31) or (PERIODO = 35) or (PERIODO = 39) or (PERIODO = 43) or (PERIODO = 47)
                                or (PERIODO = 51)) then
                                insert into NOMINA_CONCEPTOS (NOMI_ID, NOCO_ITEM, CONC_COD,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, NOCO_GTOEMPR)
                                    values (:IDNOMINA,:ITEM, :CONCEPT, :NIT_TERCERO, :VALOR, :ENTIDAD, :CONC_DEDUC, :CONC_PROV, :CONC_APORTE, :PERIODO, :ANO, :CONC_MODIFI, :CONC_APLICAPROM, :SALARIO, :GTOEMPR);
                            end
                        else if ((:PERIODICIDAD = 3) and (LIQUIDAPER = 4)) then
                            begin
                            if ((PERIODO = 4) or (PERIODO = 8) or (PERIODO = 12) or (PERIODO = 16) or (PERIODO = 20) or (PERIODO = 24)
                                or (PERIODO = 29) or (PERIODO = 32) or (PERIODO = 36) or (PERIODO = 40) or (PERIODO = 44) or (PERIODO = 48)
                                or (PERIODO = 52)) then
                                insert into NOMINA_CONCEPTOS (NOMI_ID, NOCO_ITEM, CONC_COD,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, NOCO_GTOEMPR)
                                    values (:IDNOMINA,:ITEM, :CONCEPT, :NIT_TERCERO, :VALOR, :ENTIDAD, :CONC_DEDUC, :CONC_PROV, :CONC_APORTE, :PERIODO, :ANO, :CONC_MODIFI, :CONC_APLICAPROM, :SALARIO, :GTOEMPR);
                            end
                        end
                    VALOR = 0;
                    BASICO = 0;
                    end
            end /* for */
        end
    end
suspend;
end
^

SET TERM ; ^

/* 20100731 */
/* MULTIPLE ROWS AL IMPRIMIR COMPROBANTES EMPLEADO NOMINA_DETALLE REPETIDO?? */
SET TERM ^ ;

CREATE OR ALTER procedure IMPR_PLANILLA_NOMINA (
    ID integer,
    PAGO char(1),
    CTA char(1),
    EMPL char(1),
    DPTO varchar(20))
returns (
    FECHA date,
    OBSERVACIONES blob sub_type 0 segment size 80,
    PAGOGLOBAL char(1),
    PERIODO integer,
    ANO char(4),
    PERIODICIDAD varchar(60),
    NITEMPL varchar(20),
    VALOR numeric(18,2),
    DEDUC char(1),
    NOMBREEMPL varchar(60),
    NOMCORTCONC varchar(60),
    NOMBRECONC varchar(60),
    CODCONC integer,
    PROV char(1),
    TOTALEMPL numeric(18,2),
    TOTALDEDUC numeric(18,2),
    TOTALDEVENG numeric(18,2),
    NUMEMPL integer,
    CTAEMPL varchar(25),
    TOTALCTAS numeric(18,2),
    TOTALNOMI numeric(18,2),
    TOTALAPOR numeric(18,2),
    NOMPER varchar(60),
    ORG integer,
    CARGOEMPL varchar(60),
    DEPTOEMPL varchar(60),
    NUMCOP integer,
    NOMBRE_COPIA varchar(60),
    DIASLAB integer,
    SALARIO numeric(18,2),
    BENEFICIO char(1),
    BASE numeric(18,2),
    CODDPTOEMPL integer,
    ORDEN integer)
AS
declare variable nitant varchar(20);
declare variable nitnue varchar(20);
declare variable numconc integer;
declare variable totalnomineg numeric(18,2);
declare variable totalaporneg numeric(18,2);
declare variable par integer;
declare variable impar integer;
declare variable antdeduc char(1);
declare variable nitdeduc varchar(20);
declare variable nittot varchar(20);
declare variable nitaux varchar(20);
BEGIN
SELECT N.nuco_copia FROM NUMERO_COPIA N WHERE N.tido_cod = 92 AND N.nuco_id = :id INTO :NUMCOP;
IF (numcop IS NULL) THEN
  BEGIN
  numcop = 0;
  INSERT INTO NUMERO_COPIA (TIDO_COD, NUCO_ID, NUCO_COPIA) VALUES (92,:id,:numcop);
  END
ELSE
  BEGIN
  numcop = :numcop + 1;
  UPDATE numero_copia N SET N.nuco_copia = :numcop WHERE N.tido_cod = 92 AND N.nuco_id = :id;
  END
SELECT N.noco_nombre FROM nombres_copias N WHERE N.noco_id = :numcop INTO :nombre_copia;
numempl = 0;
nitant = 0;
nitnue = 0;
IF (PAGO = 'N') THEN
  BEGIN
  FOR SELECT N.nomi_feccausa, N.nomi_obs, N.nomi_pagoglobal, N.nomi_periodo, N.nomi_ano, P.ppag_nombre, PN.pnom_nombre
    FROM NOMINA N, periodo_pago P, periodo_pago_nombre PN
    WHERE P.ppag_cod = N.nomi_periodocidad AND N.nomi_id = :ID AND PN.ppag_cod = N.nomi_periodocidad AND PN.ppag_periodo = N.nomi_periodo
    INTO :fecha, :observaciones, :pagoglobal, :periodo, :ano, :periodicidad, :NOMPER
    DO
    BEGIN
    SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id INTO :totalnomi;
    SELECT SUM(NC.noco_valor*-1) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_APORTE = 'S' AND NOCO_VALOR < 0 AND NOMI_ID = :id INTO :totalaporneg;
    SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_APORTE = 'S' AND NOCO_VALOR > 0 AND NOMI_ID = :id INTO :totalapor;
    totalapor = :totalapor + totalaporneg;
    FOR SELECT NC.terc_nit, NC.noco_valor, NC.noco_deduc, T.terc_nom, C.conc_nomcorto, C.conc_nombre, NC.conc_cod, NC.noco_prov, C.conc_orden+1
      FROM NOMINA_CONCEPTOS NC, TERCEROS T, CONCEPTOS_NOMINA C
      WHERE NC.nomi_id = :ID AND C.conc_cod = NC.conc_cod AND t.terc_nit = nc.terc_nit
      ORDER BY NC.NOCO_DEDUC, NC.conc_cod,  T.TERC_NOM
      INTO :nitempl, :valor, :deduc, :nombreempl, :nomcortconc, :nombreconc, :codconc, :prov, :orden
      DO
      BEGIN
      IF (valor IS NULL) THEN
        valor = 0;
      cargoempl = '';
      select empl_cargo from EMPLEADOS where terc_nit = :nitempl into :cargoempl;
      SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND TERC_NIT = :nitempl INTO :totalempl;
      SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND TERC_NIT = :nitempl AND NC.noco_deduc = 'S' INTO :totaldeduc;
      SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND TERC_NIT = :nitempl AND NC.noco_deduc = 'N' INTO :totaldeveng;
      SUSPEND;
      END
    /* totales por concepto
    nitempl = '';
    valor = NULL;
    deduc = '';
    nombreempl = NULL;
    nomcortconc = NULL;
    nombreconc = NULL;
    codconc = NULL;
    prov = NULL;
    FOR SELECT MAX(conc_cod), SUM(noco_valor) FROM NOMINA_CONCEPTOS WHERE nomi_id = :id
      GROUP BY conc_cod
      INTO :codconc, :valor
      DO
      BEGIN
      nitempl = '';
      nombreempl = '';
      deduc = 'N';
      prov = 'N';
      SELECT C.conc_nombre,C.conc_nomcorto FROM CONCEPTOS_NOMINA C WHERE C.conc_cod = :codconc INTO :nombreconc,:nomcortconc;
      SUSPEND;
      END
    IF (EMPL = 'N') THEN
      BEGIN
      deduc = 'N';
      nomcortconc = 'DIAS LAB.';
      nombreconc = 'DIAS LAB.';
      codconc = 0;
      prov = 'N';
      valor = NULL;
      nitempl = '';
      nombreempl = '';
      SUSPEND;
      deduc = 'N';
      nomcortconc = 'SDO BASE';
      nombreconc = 'SDO BASE';
      codconc = 0;
      prov = 'N';
      valor = NULL;
      nitempl = '';
      nombreempl = '';
      SUSPEND;
      END
    /* dias laborados y salario base */
    FOR SELECT ND.node_diaslab, ND.terc_nit, T.terc_nom FROM NOMINA_DETALLE ND, TERCEROS T
        WHERE NOMI_ID = :id AND T.terc_nit = ND.terc_nit
      INTO :diaslab, :nitaux, :nombreempl
      DO
      BEGIN
      nitempl = :nitaux;
      nomcortconc = 'DIAS LAB.';
      valor = :diaslab;
      ORDEN = 0;
      SUSPEND;
      SELECT FIRST 1  m.mvse_salario FROM MOVIMIENTO_SALARIO_EMPLEADO M WHERE M.terc_nit = :nitaux AND M.mvse_fecha <= :fecha ORDER BY M.mvse_fecha DESC INTO :salario;
      nitempl = :nitaux;
      nomcortconc = 'SDO BASE';
      ORDEN = 1;
      valor = :salario;
      SUSPEND;
      END
    END
  END
ELSE
  IF (PAGO = 'S') THEN
    BEGIN
    par = 2;
    impar = 1;
    SELECT N.nomi_feccausa, N.nomi_obs, N.nomi_pagoglobal, N.nomi_periodo, N.nomi_ano, P.ppag_nombre, PN.pnom_nombre
        FROM NOMINA N, periodo_pago P, periodo_pago_nombre PN
        WHERE P.ppag_cod = N.nomi_periodocidad AND N.nomi_id = :ID AND PN.ppag_cod = N.nomi_periodocidad AND PN.ppag_periodo = N.nomi_periodo
        INTO :fecha, :observaciones, :pagoglobal, :periodo, :ano, :periodicidad, :NOMPER;
    IF (EMPL = 'N') THEN
        BEGIN
        deduc = 'N';
        nomcortconc = 'DIAS LAB.';
        nombreconc = 'DIAS LAB.';
        codconc = 0;
        prov = 'N';
        valor = NULL;
        nitempl = '';
        nombreempl = '';
        SUSPEND;
        deduc = 'N';
        nomcortconc = 'SDO BASE';
        nombreconc = 'SDO BASE';
        codconc = 0;
        prov = 'N';
        valor = NULL;
        nitempl = '';
        nombreempl = '';
        SUSPEND;
        deduc = 'N';
        nomcortconc = 'TOTAL DEV';
        nombreconc = 'TOTAL DEV';
        codconc = 9999;
        prov = 'N';
        valor = NULL;
        nitempl = '';
        nombreempl = '';
        SUSPEND;
        deduc = 'S';
        nomcortconc = 'TOTAL DEDUC';
        nombreconc = 'TOTAL DEDUC';
        codconc = 99999;
        prov = 'N';
        valor = NULL;
        nitempl = '';
        nombreempl = '';
        SUSPEND;
        deduc = 'S';
        nomcortconc = 'TOTAL EMPL';
        nombreconc = 'TOTAL EMPL';
        codconc = 999999;
        prov = 'N';
        valor = NULL;
        nitempl = '';
        nombreempl = '';
        SUSPEND;
        FOR SELECT MAX(N.conc_cod), MAX(N.noco_deduc) FROM NOMINA_CONCEPTOS N
            WHERE N.nomi_id = :id AND N.noco_prov = 'N' AND N.noco_gtoempr = 'N'
            GROUP BY N.conc_cod
            INTO :codconc, :deduc
            DO
            BEGIN
            valor = NULL;
            nitempl = '';
            nombreempl = '';
            prov = 'N';
            SELECT C.conc_nombre,C.conc_nomcorto,C.conc_orden+1 FROM CONCEPTOS_NOMINA C
                WHERE C.conc_cod = :codconc INTO :nombreconc,:nomcortconc, :orden;
            SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id INTO :totalempl;
            SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND NC.noco_deduc = 'S' INTO :totaldeduc;
            SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND NC.noco_deduc = 'N' INTO :totaldeveng;
            SUSPEND;
            END
        FOR SELECT ND.node_diaslab,  ND.terc_nit, T.terc_nom
            FROM NOMINA_DETALLE ND, TERCEROS T WHERE NOMI_ID = :id AND T.terc_nit = ND.terc_nit
            INTO :diaslab, :nitaux, :nombreempl
            DO
            BEGIN
            nitempl = :nitaux;
            nomcortconc = 'DIAS LAB.';
            ORDEN = 0;
            valor = :diaslab;
            SUSPEND;
            SELECT FIRST 1  m.mvse_salario FROM MOVIMIENTO_SALARIO_EMPLEADO M WHERE M.terc_nit = :nitaux AND M.mvse_fecha <= :fecha ORDER BY M.mvse_fecha DESC INTO :salario;
            nitempl = :nitaux;
            nomcortconc = 'SDO BASE';
            valor = :salario;
            ORDEN = 1;
            SUSPEND;
            END
        END
    FOR SELECT NC.terc_nit, NC.noco_valor, NC.noco_deduc, T.terc_nom, C.conc_nomcorto, C.conc_nombre, NC.conc_cod, NC.noco_prov, NC.terc_nit, c.conc_benefic, NC.noco_base, C.conc_orden+1
        FROM NOMINA_CONCEPTOS NC, TERCEROS T, CONCEPTOS_NOMINA C
        WHERE NC.nomi_id = :ID AND C.conc_cod = NC.conc_cod AND t.terc_nit = nc.terc_nit AND NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N'
        ORDER BY T.terc_nom
        INTO :nitempl, :valor, :deduc, :nombreempl, :nomcortconc, :nombreconc, :codconc, :prov,:nitnue, :beneficio,:base, :orden
        DO
        BEGIN
        cargoempl = '';
        ctaempl = '';
        deptoempl = '';
        coddptoempl = 0;
        diaslab = 0;
        SELECT FIRST 1 node_diaslab FROM NOMINA_DETALLE WHERE nomi_id = :id AND terc_nit = :nitempl INTO :diaslab;
        select e.empl_cargo, e.empl_cuenta, D.dpto_nombre, d.dpto_cod
            from EMPLEADOS e, DEPARTAMENTO D
            where D.dpto_cod = E.empl_dpto AND e.terc_nit = :nitempl into :cargoempl,:ctaempl,:deptoempl,:coddptoempl;
        SELECT FIRST 1  m.mvse_salario FROM MOVIMIENTO_SALARIO_EMPLEADO M WHERE M.terc_nit = :nitempl AND M.mvse_fecha <= :FECHA ORDER BY M.mvse_fecha DESC INTO :salario;
        IF ((nitnue <> nitant) AND (nitnue IS NOT NULL)) THEN
            numempl = :numempl + 1;
        IF (valor IS NULL) THEN
            valor = 0;
        IF (nitempl <> nitdeduc) THEN
            BEGIN
            par = 2;
            impar = 1;
            END
        nitdeduc = :nitempl;
        IF (:deduc = 'S') THEN
            BEGIN
            antdeduc = 'S';
            org = :par;
            par = :par + 2;
            END
        ELSE
            BEGIN
            antdeduc = 'N';
            org = :impar;
            impar = :impar + 2;
            END
       SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND TERC_NIT = :nitempl INTO :totalempl;
       SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND TERC_NIT = :nitempl AND NC.noco_deduc = 'S' INTO :totaldeduc;
       SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND TERC_NIT = :nitempl AND NC.noco_deduc = 'N' INTO :totaldeveng;
       IF (cta = 'S') THEN
         BEGIN
         SELECT COUNT(CONC_COD) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND TERC_NIT = :nitempl INTO :numconc;
         totalempl = totalempl / :numconc;
         SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND TERC_NIT = :nitempl INTO :totalctas;
         END
       SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id INTO :totalnomi;
       SELECT SUM(NC.noco_valor*-1) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_APORTE = 'S' AND NOCO_VALOR < 0 AND NOMI_ID = :id INTO :totalaporneg;
       SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_APORTE = 'S' AND NOCO_VALOR > 0 AND NOMI_ID = :id INTO :totalapor;
       totalapor = :totalapor + totalaporneg;
       SUSPEND;
       IF ((nitnue <> nitant) AND (nitnue IS NOT NULL) AND (EMPL = 'N')) THEN
         BEGIN
         deduc = 'N';
         nomcortconc = 'TOTAL DEV';
         nombreconc = 'TOTAL DEV';
         codconc = 9999;
         prov = 'N';
         SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND NC.noco_deduc = 'N' AND NC.terc_nit = : nitempl INTO :VALOR;
         SUSPEND;
         deduc = 'S';
         nomcortconc = 'TOTAL DEDUC';
         nombreconc = 'TOTAL DEDUC';
         codconc = 99999;
         prov = 'N';
         SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND NC.noco_deduc = 'S' AND NC.terc_nit = :nitempl INTO :VALOR;
         SUSPEND;
         deduc = 'S';
         nomcortconc = 'TOTAL EMPL';
         nombreconc = 'TOTAL EMPL';
         codconc = 999999;
         prov = 'N';
         SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND NC.terc_nit = :nitempl INTO :VALOR;
         nitant = :nitnue;
         SUSPEND;
         END
       END
    numempl = :numempl + 1;
    IF (EMPL = 'N') THEN
        BEGIN
        nitempl = '';
        valor = NULL;
        deduc = '';
        nombreempl = NULL;
        nomcortconc = NULL;
        nombreconc = NULL;
        codconc = NULL;
        prov = NULL;
        totalempl = NULL;
        ctaempl = NULL;
        IF (cta = 'N') THEN
          BEGIN
          FOR SELECT MAX(N.conc_cod) FROM NOMINA_CONCEPTOS N WHERE N.nomi_id = :id AND N.noco_prov = 'N' AND N.noco_gtoempr = 'N'
            GROUP BY N.conc_cod
            INTO :codconc
            DO
            BEGIN
            /* TOTALES POR DEPTO */
            IF (dpto IS NOT NULL AND (DPTO <> '') ) THEN
                BEGIN
                SELECT SUM(NC.noco_valor), MAX(NC.noco_deduc) FROM NOMINA_CONCEPTOS NC, EMPLEADOS E, DEPARTAMENTO D
                    WHERE NC.nomi_id = :ID AND NC.conc_cod = :codconc AND D.dpto_cod = E.empl_dpto AND NC.terc_nit = E.terc_nit AND d.dpto_cod = :dpto
                    GROUP BY NC.conc_cod
                    INTO :valor, :deduc;
                nitempl = '-';
                nombreempl = '|  TOTAL  |';
                deptoempl = '-';
                prov = 'N';
                SELECT C.conc_nombre,C.conc_nomcorto FROM CONCEPTOS_NOMINA C WHERE C.conc_cod = :codconc INTO :nombreconc,:nomcortconc;
                SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC, EMPLEADOS E, DEPARTAMENTO D WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id  AND D.dpto_cod = E.empl_dpto AND NC.terc_nit = E.terc_nit INTO :totalempl;
                SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC, EMPLEADOS E, DEPARTAMENTO D WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND NC.noco_deduc = 'S'  AND D.dpto_cod = E.empl_dpto AND NC.terc_nit = E.terc_nit INTO :totaldeduc;
                SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC, EMPLEADOS E, DEPARTAMENTO D WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND NC.noco_deduc = 'N'  AND D.dpto_cod = E.empl_dpto AND NC.terc_nit = E.terc_nit INTO :totaldeveng;
                END
            ELSE
                BEGIN
                SELECT SUM(NC.noco_valor), MAX(NC.noco_deduc) FROM NOMINA_CONCEPTOS NC
                WHERE NC.nomi_id = :ID AND NC.conc_cod = :codconc
                GROUP BY NC.conc_cod
                INTO :valor, :deduc;
                nitempl = '-';
                nombreempl = '|  TOTAL  |';
                deptoempl = '-';
                prov = 'N';
                SELECT C.conc_nombre,C.conc_nomcorto FROM CONCEPTOS_NOMINA C WHERE C.conc_cod = :codconc INTO :nombreconc,:nomcortconc;
                SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id INTO :totalempl;
                SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND NC.noco_deduc = 'S' INTO :totaldeduc;
                SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND NC.noco_deduc = 'N' INTO :totaldeveng;
                END
            SUSPEND;
            END
        IF (dpto IS NOT NULL AND (DPTO <> '') ) THEN
            BEGIN
            deduc = 'N';
             nomcortconc = 'TOTAL DEV';
             nombreconc = 'TOTAL DEV';
             codconc = 9999;
             deptoempl = '-';
             prov = 'N';
             SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC, EMPLEADOS E, DEPARTAMENTO D WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND NC.noco_deduc = 'N'  AND D.dpto_cod = E.empl_dpto AND d.dpto_cod = :dpto AND NC.terc_nit = E.terc_nit INTO :VALOR;
             nitempl = '-';
             nombreempl = '|  TOTAL  |';
             SUSPEND;
             deduc = 'S';
             nomcortconc = 'TOTAL DEDUC';
             nombreconc = 'TOTAL DEDUC';
             codconc = 99999;
             deptoempl = '-';
             prov = 'N';
             SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC, EMPLEADOS E, DEPARTAMENTO D WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND NC.noco_deduc = 'S'  AND D.dpto_cod = E.empl_dpto AND d.dpto_cod = :dpto AND NC.terc_nit = E.terc_nit INTO :VALOR;
             nitempl = '-';
             nombreempl = '|  TOTAL  |';
             SUSPEND;
             deduc = 'S';
             nomcortconc = 'TOTAL EMPL';
             nombreconc = 'TOTAL EMPL';
             codconc = 999999;
             deptoempl = '-';
             prov = 'N';
             SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC, EMPLEADOS E, DEPARTAMENTO D WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id  AND D.dpto_cod = E.empl_dpto AND NC.terc_nit = E.terc_nit AND d.dpto_cod = :dpto INTO :VALOR;
             nitempl = '-';
             nombreempl = '|  TOTAL  |';
             SUSPEND;
             END
        ELSE
             BEGIN
             deduc = 'N';
             nomcortconc = 'TOTAL DEV';
             nombreconc = 'TOTAL DEV';
             codconc = 9999;
             prov = 'N';
             SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND NC.noco_deduc = 'N' INTO :VALOR;
             nitempl = '-';
             nombreempl = '|  TOTAL  |';
             SUSPEND;
             deduc = 'S';
             nomcortconc = 'TOTAL DEDUC';
             nombreconc = 'TOTAL DEDUC';
             codconc = 99999;
             prov = 'N';
             SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND NC.noco_deduc = 'S' INTO :VALOR;
             nitempl = '-';
             nombreempl = '|  TOTAL  |';
             SUSPEND;
             deduc = 'S';
             nomcortconc = 'TOTAL EMPL';
             nombreconc = 'TOTAL EMPL';
             codconc = 999999;
             prov = 'N';
             SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N'  AND NOMI_ID = :id INTO :VALOR;
             nitempl = '-';
             nombreempl = '|  TOTAL  |';
             SUSPEND;
             END
         END
       END
    END
END
^

SET TERM ; ^


/* 20100803 */
/* imprima el formato del egreso en prestamos */

INSERT INTO CONFIGURACION (CONF_MODULO, CONF_CATEGORIA, CONF_PROPIEDAD, CONF_VALOR, CONF_POSIBLES, CONF_AYUDA) VALUES ('NOMINA', 'PAGOS', 'IMPRIMIR FORMATO DEL EGRESO AL HACER PRESTAMOS A EMPLEADOS', 'SI', 'SI,NO', 'SI: Usa el formato del egreso al imprimir el préstamo. NO: Usa el formato de nómina para préstamos de empleados');

INSERT INTO CONFIGURACION (CONF_MODULO, CONF_CATEGORIA, CONF_PROPIEDAD, CONF_VALOR, CONF_POSIBLES, CONF_AYUDA) VALUES ('NOMINA', 'GENERAL', 'PREVISUALIZAR IMPRESION DE DOCUMENTOS', 'SI', 'SI,NO', 'SI:Al imprimir cualquier documento aparece la opción preguntando el destino. NO:Imprime directamente a la impresora predeterminada.');
commit work;

SET TERM ^ ;

CREATE OR ALTER procedure EGRESO_NOMINA (
    IDNOMINA integer,
    PGLOBAL char(1),
    NITBENE varchar(20),
    FECHAEGR date,
    PREF varchar(4),
    NUMEROEGR varchar(6),
    CONCEPTO varchar(60),
    OBSERVACIONES blob sub_type 0 segment size 80,
    NOMBREBENE varchar(60),
    CAJA integer,
    USUARIOEGR varchar(10),
    PAGO char(1),
    CUENTAID integer,
    FECHAEGRBNCO date,
    PREFEGREBNCO varchar(4),
    NUMEROEGREBNCO varchar(6),
    BENEBNCO varchar(60),
    CONCEPTOBNCO varchar(60),
    GMF char(1),
    FORMAPAGOID integer,
    CAJABNCO varchar(2),
    CAJABNCOCUENTA varchar(20),
    CAJABNCONUMEROEGR varchar(20),
    FORMULARIO varchar(10))
AS
declare variable porcreten numeric(9,4);
declare variable nitempl varchar(60);
declare variable idpago integer;
declare variable totdevenempl numeric(18,2);
declare variable retencionempl numeric(18,2);
declare variable periodicidad integer;
declare variable idegreso integer;
declare variable nitemplnglo varchar(20) character set none;
declare variable numegresointeger integer;
declare variable ok char(1) character set none;
declare variable itempago integer;
declare variable he numeric(18,2);
declare variable hed numeric(18,2);
declare variable hen numeric(18,2);
declare variable hefd numeric(18,2);
declare variable hefn numeric(18,2);
declare variable otrosdev numeric(18,2);
declare variable otrosded integer;
declare variable pagoempl char(1);
declare variable periodo integer;
declare variable nomiano char(4);
declare variable emplnom varchar(60);
declare variable devengos numeric(18,2);
declare variable deducibles numeric(18,2);
declare variable total numeric(18,2);
declare variable reten numeric(18,2);
begin
select nomi_pagook, nomi_periodo, nomi_ano from nomina where nomi_id = :idnomina into :ok, :periodo, :nomiano;
if (ok = 'N') then
    BEGIN
    if (pglobal = 'S') then
        BEGIN
        SELECT SUM (NC.CONO_ABONO) FROM CONSOLIDADO_NOMINA NC WHERE NC.CONO_IDORI = :IDNOMINA AND CONO_TIPOORI = 92 and cono_pagook = 'N'
            AND CONO_prov = 'N' AND CONO_APORTE = 'N' and CONO_DEB = 'S'
            INTO :total;
        if((:TOTAL IS NOT NULL) and (:total <> 0)) then
            BEGIN
            EXECUTE PROCEDURE cambie_id_egreso returning_values (:idegreso);
            INSERT INTO egresos (EGRE_ID, TIDO_COD, PREF_PRE, EGRE_numero, EGRE_fecha, EGRE_CONC, EGRE_MONTO, EGRE_RTFTEMONTO, EGRE_OBS, EGRE_NOMTERC, EGRE_ANULADO, EGRE_TRANSMIT, TERC_NIT, EGRE_TIPO, CAJA_ID, EGRE_usuario, NUMOK, CLEG_ID)
                 VALUES (:idegreso,62, :pref, :numeroegr, :fechaegr, :concepto, :total, 0, :observaciones, :nombrebene, 'N', 'N', :nitbene, '3', :caja, :usuarioegr, 'S', 0);
            if (pago = 'B') then
                INSERT INTO egresos_banco (EGRE_ID, EGBC_TIPOBCO, CUBA_COD, EGBC_numero, EGBC_fecha, PRBA_PREF, EGBC_BENEF, EGBC_MONTO, EGBC_CONCEPTO, EGBC_GMF, EGBC_ANULADO, EGBC_TRANSMIT) VALUES (:idegreso, 72, :cuentaid, :numeroegrebnco, :fechaegrbnco, :prefegrebnco, :benebnco, :total, :conceptobnco, :gmf, 'N', 'N');
            ELSE
                if (pago = 'C') then
                    INSERT INTO egresos_caja (EGRE_ID, EGCA_ITEM, CAJA_ID, FOPA_ID, EGCA_BANCO, EGCA_CUENTA, EGCA_numero, EGCA_fecha, EGCA_MONTO, EGCA_ANULADO, EGCA_TRANSMIT) VALUES (:idegreso, 1, :caja, :formapagoid, :cajabnco, :cajabncocuenta, :cajabnconumeroegr, :fechaegr, :total, 'N', 'N');
            idpago = GEN_ID(id_pagonomi, 1);
            insert INTO pago_nomina (pgno_id, pgno_fecha, pgno_tipopago, pgno_egreid, pgno_egrepre, pgno_egrenum, pgno_monto, pgno_nomina, pgno_nit, pgno_formulario, PGNO_ANT)
                 VALUES (:idpago, :fechaegr, :pago , :idegreso, :pref, :numeroegr, :total, :idnomina, :nitbene, :formulario, 'N');
            update NOMINA SET NOMI_pagook = 'N' WHERE NOMI_ID = :IDNOMINA;
            END
        FOR SELECT TERC_NIT FROM nomina_detalle WHERE NOMI_ID = :idnomina into :nitemplnglo
            DO
            BEGIN
            SELECT SUM (NC.CONO_ABONO) FROM CONSOLIDADO_NOMINA NC WHERE NC.CONO_IDORI = :IDNOMINA AND CONO_TIPOORI = 92 and cono_pagook = 'N'
                AND CONO_prov = 'N' AND CONO_APORTE = 'N' and CONO_DEB = 'S'
                INTO :total;
            select max (pgno_item), max (pgno_id) from pago_nomina_det WHERE PGNO_ID = :idpago INTO :itempago, :idpago;
            if (:itempago IS NULL) then
                itempago = 0;
            itempago = :itempago + 1;
            insert INTO pago_nomina_det  (pgno_id, terc_nit, pgnd_monto, pgno_item)
                 VALUES (:idpago, :nitemplnglo, :total, :itempago);
            END
        END
    ELSE
        BEGIN
/*        EXECUTE PROCEDURE cambie_id_pago_nomina returning_values (:idpago);*/
        FOR SELECT TERC_NIT FROM nomina_detalle WHERE NOMI_ID = :idnomina into :nitemplnglo
            DO
            BEGIN
            EXECUTE PROCEDURE cambie_id_egreso returning_values (:idegreso);
            SELECT SUM (cono_abono) FROM CONSOLIDADO_NOMINA WHERE CONO_IDORI = :IDNOMINA AND CONO_TIPOORI = 92 and cono_pagook = 'N'
                AND CONO_deduc = 'N' AND cono_prov = 'N' and CONO_DEB = 'S' and TERC_NIT = :nitemplnglo
                INTO :totdevenempl;
            SELECT NOMI_PERIODOCIDAD FROM nomina WHERE NOMI_ID = :idnomina INTO :periodicidad;
            SELECT SUM (NC.CONO_ABONO) FROM CONSOLIDADO_NOMINA NC WHERE NC.CONO_IDORI = :IDNOMINA AND CONO_TIPOORI = 92 and cono_pagook = 'N'
                AND CONO_prov = 'N' AND CONO_APORTE = 'N' and CONO_DEB = 'S' AND TERC_NIT = :nitemplnglo
                INTO :total;
            SELECT TERC_NOM FROM TERCEROS WHERE TERC_NIT = :nitemplnglo INTO :emplnom;
            concepto = 'PAGO NOMINA ' || 'DEL PERIODO ' || CAST (periodo AS CHAR(2)) || ' DEL ' || nomiano;
            if((:TOTAL IS NOT NULL) or (:total <> 0)) then
                BEGIN
                INSERT INTO egresos (EGRE_ID, TIDO_COD, PREF_PRE, EGRE_numero, EGRE_fecha, EGRE_CONC, EGRE_MONTO, EGRE_RTFTEMONTO, EGRE_OBS, EGRE_NOMTERC, EGRE_ANULADO, EGRE_TRANSMIT, TERC_NIT, EGRE_TIPO, CAJA_ID, EGRE_usuario, NUMOK, CLEG_ID)
                     VALUES (:idegreso,62, :pref, :numeroegr, :fechaegr, :concepto, :total, :reten, :observaciones, :emplnom, 'N', 'N', :nitemplnglo, '3', :caja, :usuarioegr, 'S', 0);
                SELECT empl_formpago FROM EMPLEADOS WHERE TERC_NIT = :nitemplnglo INTO :pagoempl;
                if (pagoempl = 'B') then
                    begin
                    conceptobnco = :concepto;
                    INSERT INTO egresos_banco (EGRE_ID, EGBC_TIPOBCO, CUBA_COD, EGBC_numero, EGBC_fecha, PRBA_PREF, EGBC_BENEF, EGBC_MONTO, EGBC_CONCEPTO, EGBC_GMF, EGBC_ANULADO, EGBC_TRANSMIT)
                       VALUES (:idegreso, 72, :cuentaid, :numeroegrebnco, :fechaegrbnco, :prefegrebnco, :nitemplnglo, :total, :conceptobnco, :gmf, 'N', 'N');
                    end
                ELSE
                    if (pagoempl = 'C') then
                        INSERT INTO egresos_caja (EGRE_ID, EGCA_ITEM, CAJA_ID, FOPA_ID, EGCA_BANCO, EGCA_CUENTA, EGCA_numero, EGCA_fecha, EGCA_MONTO, EGCA_ANULADO, EGCA_TRANSMIT)
                             VALUES (:idegreso, 1, :caja, :formapagoid, :cajabnco, :cajabncocuenta, :cajabnconumeroegr, :fechaegr, :total, 'N', 'N');
                END
            EXECUTE PROCEDURE cambie_id_pago_nomina returning_values (:idpago);
            INSERT INTO pago_nomina (pgno_id, pgno_fecha, pgno_tipopago, pgno_egreid, pgno_egrepre, pgno_egrenum, pgno_monto, pgno_nomina, pgno_nit, pgno_formulario, PGNO_ANT)
                 VALUES (:idpago, :fechaegr, :pago , :idegreso, :pref, :numeroegr, 0, :idnomina, '', :formulario, 'N');
            SELECT SUM (cono_abono) FROM CONSOLIDADO_NOMINA WHERE CONO_IDORI = :IDNOMINA AND CONO_TIPOORI = 92 and cono_pagook = 'N'
                AND CONO_deduc = 'N' AND cono_prov = 'N' and TERC_NIT = :nitemplnglo
                INTO :totdevenempl;
            SELECT NOMI_PERIODOCIDAD FROM nomina WHERE NOMI_ID = :idnomina INTO :periodicidad;
            select max (pgno_item) from pago_nomina_det WHERE PGNO_ID = :idpago INTO :itempago;
            if (:itempago IS NULL) then
                itempago = 0;
            itempago = :itempago + 1;
            insert INTO pago_nomina_det  (pgno_id, terc_nit, pgnd_monto, pgno_item)
                 VALUES (:idpago, :nitemplnglo, :total, :itempago);
            numegresointeger = cast (numeroegr as integer);
            numegresointeger = numegresointeger + 1;
            execute procedure completa_ceros(numegresointeger)returning_values :numeroegr;
            update CONSOLIDADO_NOMINA NC set nc.cono_pagook = 'S' WHERE NC.CONO_IDORI = :IDNOMINA AND CONO_TIPOORI = 92 and cono_pagook = 'N'
                AND CONO_prov = 'N' AND CONO_APORTE = 'N' and CONO_DEB = 'S' AND TERC_NIT = :nitemplnglo;
            END
        END
    END
ELSE
    exception nomina_con_pago;
END
^

SET TERM ; ^


/* 20100805 */
SET TERM ^ ;

create trigger MOVIMIENTO_SALARIO_EMPLEADO_AI for MOVIMIENTO_SALARIO_EMPLEADO
active AFTER INSERT position 0
as
begin
update empleados set empl_salario = new.mvse_salario where terc_nit = new.terc_nit;
end
^

SET TERM ; ^

update empleados e
    set empl_salario = (select first 1 mvse_salario from movimiento_salario_empleado where terc_nit = e.terc_nit order by mvse_fecha desc);
commit work;

/* 20100806 */
/* si comisiones mensuales multiple rows por comision en ambos periodos del mes */
SET TERM ^ ;

CREATE OR ALTER procedure CAUSA_NOMINA (
    FEC date,
    PERIODO integer,
    PERIODICIDAD integer,
    PAGOGLOBAL char(1),
    ANO char(4),
    DEPTO integer)
returns (
    IDNOMINA integer,
    ITEMINI integer)
AS
declare variable item integer;
declare variable nite varchar(20);
declare variable nit_tercero varchar(20);
declare variable concept integer;
declare variable montos numeric(18,2);
declare variable porcen numeric(9,4);
declare variable entidad varchar(20);
declare variable conc_cod integer;
declare variable conc_deduc char(1);
declare variable conc_porc numeric(9,4);
declare variable conc_entidad integer;
declare variable conc_monto numeric(18,2);
declare variable conc_modifi char(1);
declare variable conc_promedio char(1);
declare variable valor numeric(18,2);
declare variable diaslab integer;
declare variable conc_prov char(1);
declare variable conc_aporte char(1);
declare variable numeroprom integer;
declare variable conc_aplicaprom char(1);
declare variable perinicial integer;
declare variable perfinal integer;
declare variable anoini integer;
declare variable anofin integer;
declare variable conc_dias char(1);
declare variable conc_otroconc char(1);
declare variable conc_codotroconc integer;
declare variable anosum integer;
declare variable salario char(1);
declare variable liquidaper integer;
declare variable basico numeric(18,2);
declare variable niteps varchar(20);
declare variable nitafc varchar(20);
declare variable nitafp varchar(20);
declare variable nitccf varchar(20);
declare variable gtoempr char(1);
declare variable comision numeric(18,2);
declare variable cambsaltrans numeric(18,2);
declare variable saldosini numeric(18,2);
declare variable duranov integer;
declare variable base numeric(18,2);
declare variable aprox integer;
declare variable mensual char(1);
declare variable horasex numeric(18,2);
declare variable diasnov integer;
declare variable tomasal integer;
declare variable retroact numeric(18,2);
declare variable reembolso numeric(18,2);
declare variable incap numeric(18,2);
declare variable auxtrans numeric(18,2);
declare variable smlv numeric(18,2);
declare variable beneficios numeric(18,2);
declare variable confirmado char(1);
declare variable recnoct numeric(18,2);
declare variable recfest numeric(18,2);
declare variable tar_recnotc numeric(9,4);
declare variable tar_recfest numeric(9,4);
declare variable recargo numeric(18,2);
declare variable basicorec numeric(18,2);
declare variable parambenef char(2);
declare variable vacacdisf numeric(18,2);
declare variable valorpredet numeric(18,2);
declare variable basicoemp numeric(18,2);
declare variable salinteg char(1);
declare variable tar_salinteg numeric(9,4);
begin
execute procedure LEE_CONFIGURACION('NOMINA','LIQUIDACION','TOMAR BENEFICIOS PARA CALCULAR PROVISIONES')returning_values(:PARAMBENEF);
execute procedure LEE_CONFIGURACION('NOMINA','GENERAL','REDONDEO AL MULTIPLO DE DIEZ EN TOTALES')returning_values(:APROX);
select N.NOMI_ID, N.NOMI_LIQOK from NOMINA N where N.NOMI_PERIODO = :PERIODO and N.NOMI_PERIODOCIDAD = :PERIODICIDAD
    and N.NOMI_ANO = :ANO into :IDNOMINA, :CONFIRMADO;
if (:IDNOMINA is null) then
    begin
    execute procedure CAMBIE_ID_NOMINA returning_values(:IDNOMINA);
    insert into NOMINA (NOMI_ID, NOMI_FECCAUSA, NOMI_PAGOGLOBAL, NOMI_PERIODOCIDAD, NOMI_PERIODO, NOMI_ANO, NOMI_LIQOK)
    values (:IDNOMINA, :FEC,:PAGOGLOBAL, :PERIODICIDAD, :PERIODO, :ANO, 'N');
    ITEM = 1;
    end
else
    begin
    select max(N.NOCO_ITEM) from NOMINA_CONCEPTOS N where N.NOMI_ID = :IDNOMINA
    into :ITEM;
    end
if ((CONFIRMADO = 'S') and (IDNOMINA is not null)) then
    begin
    IDNOMINA = 0;
    end
else
    begin
    insert into NOMINA_DEPARTAMENTO (NOMI_ID, NODP_DEPTO)values(:IDNOMINA,:DEPTO);
    select P.PAAN_RECNOC, P.PAAN_RECFEST, P.paan_salinteg from PARAMETROS_ANO P where P.PAAN_ANO = :ANO
        into :TAR_RECNOTC, :TAR_RECFEST, TAR_SALINTEG;
    ITEMINI = ITEM;
    for select E.TERC_NIT, E.EMPL_EPS, E.EMPL_AFC, E.EMPL_AFP, E.EMPL_CCF, E.empl_salinteg
        from EMPLEADOS E
        where E.EMPL_PPAGO = :PERIODICIDAD and ((E.EMPL_FECRET is null) or (E.EMPL_FECRET > :FEC)) and E.EMPL_FECING <= :FEC
        and ((:DEPTO = 0) or (e.empl_dpto = :DEPTO))
        into :NITE, :NITEPS, :NITAFC, :NITAFP, :NITCCF, :SALINTEG
        do
        begin
        select first 1 M.MVSE_SALARIO from MOVIMIENTO_SALARIO_EMPLEADO M where M.TERC_NIT = :NITE and M.MVSE_FECHA <= :FEC order by M.MVSE_FECHA desc into :BASICOEMP;
        BASICO = BASICOEMP;
        RECNOCT = null;
        RECFEST = null;
        select N.NOEX_RECNOCT, N.NOEX_RECFEST
            from NOMINA_HORASEXT N where N.NOEX_PERIODIO = :PERIODO and N.NOEX_ANO = :ANO and N.TERC_NIT = :NITE
            into :RECNOCT, :RECFEST;
        if (RECNOCT is null) then
            RECNOCT = 0;
        if (RECFEST is null) then
            RECFEST = 0;
        for select CE.TERC_NIT, CE.CONC_COD, CE.EMCO_MONTO, CE.EMCO_PORC, CE.EMPL_ENTIDAD, CE.EMCO_PERPROM, CE.EMCO_LUQUIDAPER, CE.EMCO_MENSUAL, CN.CONC_COD, CN.CONC_DEDUC,CN.CONC_PORC, CN.CONC_ENTIDAD, CN.CONC_MONTO,  CN.CONC_DIAS, CN.CONC_MODIFI,
            CN.CONC_PROMEDIO, CN.CONC_SALARIO, CN.CONC_PROV, CN.CONC_APORTE, CN.CONC_APLICAPROM, CN.CONC_OTROCONC, CN.CONC_CODOTROCONC, CN.CONC_GTOEMPR, CN.CONC_BASE, CE.EMCO_TOMSAL
            from EMPLEADO_CONCEPTOS CE, CONCEPTOS_NOMINA CN where (CE.CONC_COD = CN.CONC_COD) and (CE.TERC_NIT = :NITE) and
            ( ((CE.EMCO_FECINI <= :FEC and CE.EMCO_FECFIN >= :FEC)) or
            ((CN.CONC_TODOSPER = 'N') and (CE.EMCO_PPAGO = :PERIODO)) or ((CN.CONC_TODOSPER = 'S') AND (((:periodicidad = 1) AND (:PERIODO < 13)) or ((:periodicidad = 2) AND (:PERIODO < 25)))) )  order by (TERC_NIT )
            into :NIT_TERCERO, :CONCEPT,  :MONTOS, :PORCEN, :ENTIDAD, :NUMEROPROM, :LIQUIDAPER, :MENSUAL ,:CONC_COD, :CONC_DEDUC, :CONC_PORC,
            :CONC_ENTIDAD, :CONC_MONTO, :CONC_DIAS, :CONC_MODIFI,:CONC_PROMEDIO, :SALARIO,:CONC_PROV, :CONC_APORTE , :CONC_APLICAPROM, :CONC_OTROCONC, :CONC_CODOTROCONC, :GTOEMPR, :BASE, :TOMASAL
            do
            begin
            if (CONC_DIAS = 'S') then
                execute procedure DIAS_LABORADOS (:NITE, :PERIODO, :FEC, :MENSUAL,:CONC_APORTE) returning_values (:DIASLAB);
            else
                BEGIN
                SELECT PPAG_DIAS FROM PERIODO_PAGO WHERE PPAG_COD = :periodicidad INTO :diaslab;
                END
            if (:TOMASAL <> 0) then
                begin
                /* SI EL CONCEPTO NOAPLICA EN ESTE PERIODO DEJE EL BASICO EN CERO */
                if ((:PERIODICIDAD = 2) and (:TOMASAL <> 2)) then
                    begin
                    if ((PERIODO = 2) or (PERIODO = 4) or (PERIODO = 6) or (PERIODO = 8) or (PERIODO = 10) or (PERIODO = 12)
                        or (PERIODO = 14) or (PERIODO = 16) or (PERIODO = 18) or (PERIODO = 20) or (PERIODO = 22) or (PERIODO = 24)) then
                        BASICO = 0;
                    end
                else
                    if ((:PERIODICIDAD = 3) and (:TOMASAL <> 1)) then
                        begin
                        if ((PERIODO = 1) or (PERIODO = 5) or (PERIODO = 9) or (PERIODO = 13) or (PERIODO = 17) or (PERIODO = 21)
                            or (PERIODO = 25) or (PERIODO = 29) or (PERIODO = 33) or (PERIODO = 37) or (PERIODO = 41) or (PERIODO = 45)
                            or (PERIODO = 49)) then
                            BASICO = 0;
                        end
                    else
                        if ((:PERIODICIDAD = 3) and (:TOMASAL <> 2)) then
                            begin
                            if ((PERIODO = 2) or (PERIODO = 6) or (PERIODO = 10) or (PERIODO = 14) or (PERIODO = 18) or (PERIODO = 22)
                                or (PERIODO = 26) or (PERIODO = 30) or (PERIODO = 34) or (PERIODO = 38) or (PERIODO = 42) or (PERIODO = 46)
                                or (PERIODO = 50)) then
                                BASICO = 0;
                            end
                        else
                            if ((:PERIODICIDAD = 3) and (:TOMASAL <> 3)) then
                                begin
                                if ((PERIODO = 3) or (PERIODO = 7) or (PERIODO = 11) or (PERIODO = 15) or (PERIODO = 19) or (PERIODO = 23)
                                    or (PERIODO = 27) or (PERIODO = 31) or (PERIODO = 35) or (PERIODO = 39) or (PERIODO = 43) or (PERIODO = 47)
                                    or (PERIODO = 51)) then
                                    BASICO = 0;
                                end
                            else
                                if ((:PERIODICIDAD = 3) and (:TOMASAL <> 4)) then
                                begin
                                if ((PERIODO = 4) or (PERIODO = 8) or (PERIODO = 12) or (PERIODO = 16) or (PERIODO = 20) or (PERIODO = 24)
                                    or (PERIODO = 29) or (PERIODO = 32) or (PERIODO = 36) or (PERIODO = 40) or (PERIODO = 44) or (PERIODO = 48)
                                    or (PERIODO = 52)) then
                                    BASICO = 0;
                                end
                end
            else
                begin
                /* SE CALCULA SOBRE TODOS LOS PERIODOS */
                BASICO = BASICOEMP;
                end
            VALORPREDET = null;
            select VP.NVPR_MONTO from NOMINA_VALOR_PREDET VP where VP.NVPR_PERIODICIDAD = :PERIODICIDAD and VP.NVPR_PERIODO = :PERIODO and VP.NVPR_ANO = :ANO and VP.CONC_COD = :CONC_COD and VP.TERC_NIT = :NITE
                into :VALORPREDET;
            if ((:VALORPREDET <> 0) and (VALORPREDET is not null)) then
                VALOR = VALORPREDET;
            else
                begin
                /* SI HAY UN CAMBIO TRANSITORIO DE SALARIO AJUSTE LOS DIAS Y CALCULE EL VALOR A SUMAR */
                select ((N.NONO_VALOR /30) * ND.NNDE_DURACION), (ND.NNDE_DURACION) from NOMINA_NOVEDADES N, nomina_novedades_detalle ND
                    where N.nono_id = ND.nono_id AND N.TNOV_COD = 11 and N.TERC_NIT = :NITE and ND.NNDE_PERIODO = :PERIODO
                    into :CAMBSALTRANS, :DURANOV;
                if (CAMBSALTRANS is null) then
                    CAMBSALTRANS = 0;
                if (DURANOV is null) then
                    DURANOV = 0;
                DIASLAB = :DIASLAB - :DURANOV;
                /* SI ES UN PRESTAMO, TRAIGA LA CUOTA */
                if (CONC_COD = 922) then
                    begin
                    select sum(P.PRCU_MONTO) from PRESTAMO_CUOTAS P, PRESTAMO_NOMINA PN
                        where P.PRCU_ANO = :ANO and P.PRCU_PERIODO = :PERIODO and PN.PRNO_ID = P.PRNO_ID and PN.TERC_NIT = :NITE into :VALOR;
                    if (VALOR is null) then
                        VALOR = 0;
                    ITEM = :ITEM + 1;
                    /* MARQUE LA CUOTA COMO PAGADA */
                    update PRESTAMO_CUOTAS  P set PRCU_OK = 'S' where P.PRCU_ANO = :ANO and P.PRCU_PERIODO = :PERIODO
                        and exists (select PRNO_ID from PRESTAMO_NOMINA where TERC_NIT = :NITE and PRNO_ID = P.prno_id);
                    end
                else
                    if ((:MONTOS = 0) or (:MONTOS is null)) then
                        begin
                        /* SI EL CONCEPTO DEL EMPLEADO NO TIENE MONTO TRAIGA EL DE CONCEPTOS_NOMINA */
                        if ((CONC_PORC = 0 and :PORCEN = 0) or (CONC_PORC is null and :PORCEN = 0) or (CONC_PORC = 0 and :PORCEN is null) or (CONC_PORC is null and :PORCEN is null) ) then
                            begin
                            /* SIN PORCENTAJE */
                            if ((CONC_MONTO <> 0) and (CONC_MONTO is not null) ) then
                                begin
                                VALOR = :CONC_MONTO;
                                if (:CONC_DIAS = 'S') then
                                    VALOR = (:VALOR / 30) * :DIASLAB;
                                end
                            else
                                if (SALARIO = 'S' and CONC_COD <> 900 and CONC_COD <> 920 and CONC_COD <> 932 and CONC_COD <> 953) then
                                    begin
                                    /* SI ES SALARIO SUME LAS EXTRAS */
                                    BASICO = BASICOEMP;
                                    BASICO = ((:BASICO/30)*:DIASLAB);/* - (((:BASICO/30)/8)*:RECNOCT);/* PFP:DEBERIA SER + Y POR LA TARIFA QUE NO VEO POR NINGUN LADO
                                    BASICO = :BASICO - (((:BASICO/30)/8)*:RECFEST);*/
                                    CONC_MONTO = :BASICO;
                                    VALOR = (:CONC_MONTO/*/30 * :diaslab*/ ) + :CAMBSALTRANS;
                                    end
                                else
                                    begin
                                    VALOR = MONTOS;
                                    if (:CONC_DIAS = 'S') then
                                        VALOR = (:VALOR / 30) * :DIASLAB;
                                    end
                            end
                        else    
                            begin
                            if (:PORCEN <> 0) then
                                begin
                                /* SI TIENE PORCENTAJE EN EMPLEADO_CONCEPTOS PERO EL MONTO SE TRAE DE CONCPETOS_NOMINA */
                                if ((CONC_MONTO <> 0) and (CONC_MONTO is not null) ) then
                                    begin
                                    VALOR = ((:CONC_MONTO ) * :PORCEN) /100;
                                    end
                                end
                            else
                                begin
                                /* NO TIENE PORCENTAJE EN EMPLEADO_CONCEPTOS SE TRAE MONTO Y PORC DE CONCPETOS_NOMINA */
                                if ((CONC_MONTO <> 0) and (CONC_MONTO is not null) ) then
                                    begin
                                    VALOR = ((:CONC_MONTO) * :CONC_PORC) /100;
                                    end
                                else
                                    if (SALARIO = 'S' and CONC_COD <> 900 and CONC_COD <> 920 and CONC_COD <> 932 and CONC_COD <> 953) then
                                        begin
                                        BASICO = BASICOEMP;
                                        BASICO = ((:BASICO/30)*:DIASLAB); /* - (((:BASICO/30)/8)*:RECNOCT);
                                        BASICO = :BASICO - (((:BASICO/30)/8)*:RECFEST);*/
                                        CONC_MONTO = :BASICO;
                                        VALOR = ((:CONC_MONTO)+ :CAMBSALTRANS * :CONC_PORC) /100;
                                        end
                                    else
                                        if (:CONC_MONTO = 0 and :MONTOS = 0) then
                                            begin
                                            CONC_MONTO = :BASICO;
                                            VALOR = (((:CONC_MONTO / 30) * :DIASLAB) + :CAMBSALTRANS * :CONC_PORC) /100;
                                            end
                                end
                            end
                        end
                    else
                        /* SI TIENE MONTO EN EMPLEADO_CONCEPTOS */
                        if ((CONC_PORC = 0 or (CONC_PORC is null)) and (:PORCEN = 0 or (PORCEN is null))) then
                            begin
                            VALOR = (:MONTOS);
                            if (:CONC_DIAS = 'S') then
                                VALOR = (:VALOR / 30) * :DIASLAB;   
                            end
                        else
                            if (:PORCEN <> 0 and PORCEN is not null) then
                                begin
                                VALOR = ((:MONTOS ) * :PORCEN) /100;
                                end
                            else
                                begin
                                VALOR = ((:MONTOS) * :CONC_PORC) /100;
                                end
                if (CONC_PROMEDIO = 'S') then
                    begin
                    /* CALCULO DEL PROMEDIO BASE DESDE LA FECHA MENOS EL NUMERO DE PERIODOS */
                    EXECUTE PROCEDURE periodo_nom_fecha (:fec, :periodicidad) returning_values (:perfinal, :anofin);
                    if (perfinal < numeroprom) then
                        BEGIN
                        anoini = anofin - 1;
                        if (periodicidad = 1) then
                            perinicial = 12 - (numeroprom - perfinal) + 1;
                        if (periodicidad = 2) then
                            perinicial = 24 - (numeroprom - perfinal) + 1;
                        if (periodicidad = 3) then
                            perinicial = 52 - (numeroprom - perfinal) + 1;
                        END
                    ELSE
                        BEGIN
                        PERINICIAL = :perfinal - :NUMEROPROM + 1;
                        anoini = ANOFIN;
                        END
                    if (anoini <> anofin) then
                        select sum (NOCO_VALOR) from NOMINA_CONCEPTOS N where N.NOCO_APLICAPROM = 'S' and
                            ((N.NOCO_PERIODO >= :PERINICIAL and N.NOCO_ANO = :anoini) or
                            (N.NOCO_PERIODO <= :perfinal and N.NOCO_ANO = :anofin)) and TERC_NIT = :NITE into :VALOR;
                    else
                        select sum (NOCO_VALOR) from NOMINA_CONCEPTOS N where N.NOCO_APLICAPROM = 'S' and
                            N.NOCO_PERIODO >= :PERINICIAL and N.NOCO_ANO = :anoini
                            and N.NOCO_PERIODO <= :perfinal and TERC_NIT = :NITE into :VALOR;
                    /* sume el saldo inicial */
                    SALDOSINI = 0;
                    select NOCO_VALOR from NOMINA_CONCEPTOS where CONC_COD = :CONC_COD and TERC_NIT  = :NITE and NOCO_PAGOOK = 'N' and NOCO_PERIODO = 0 into :SALDOSINI;
                    if (SALDOSINI is null) then
                        SALDOSINI = 0;
                    else
                        update NOMINA_CONCEPTOS N set NOCO_PAGOOK = 'S' where N.NOCO_APLICAPROM = 'S' and
                            CONC_COD = :CONC_COD and TERC_NIT = :NITE and NOCO_PERIODO = 0;

                    VALOR = :VALOR + :SALDOSINI;
                    /* APLIQUE LA PROPORCION Y EL PORCENTAJE */
                    VALOR = VALOR / NUMEROPROM;
                    VALOR = VALOR * PORCEN / 100;
                    end
                else if (CONC_OTROCONC = 'S') then
                    begin
                    ANOSUM = cast(ANO as integer);
                    ANOSUM = ANOSUM - 1;
                    select sum (NOCO_VALOR) from NOMINA_CONCEPTOS N where N.NOCO_ANO = :ANOSUM and N.CONC_COD = :CONC_CODOTROCONC and N.TERC_NIT = :NITE into :VALOR;
                    select NOCO_VALOR from NOMINA_CONCEPTOS where NOCO_ANO = :ANOSUM and CONC_COD = :CONC_CODOTROCONC and TERC_NIT = :NITE and NOCO_PERIODO = 0 into :SALDOSINI;
                    if (SALDOSINI is null) then
                        SALDOSINI = 0;
                    else
                        update NOMINA_CONCEPTOS set NOCO_PAGOOK = 'S' where NOCO_ANO = :ANOSUM and CONC_COD = :CONC_CODOTROCONC and NOCO_PERIODO = 0 and TERC_NIT = :NITE;
                    VALOR = :VALOR + :SALDOSINI;
                    update NOMINA_CONCEPTOS set NOCO_PAGOOK = 'S' where NOCO_ANO = :ANOSUM and CONC_COD = :CONC_CODOTROCONC and TERC_NIT = :NITE;
                    end
                else if (CONC_APORTE = 'S') then
                    begin
                    HORASEX = null;
                    DIASNOV = null;
                    RETROACT = null;
                    REEMBOLSO = null;
                    BENEFICIOS = null;
                    RECARGO = null;
                    COMISION = null;
                    INCAP = null;
                    VACACDISF = null;
                    if ((:ENTIDAD = '' ) or (ENTIDAD is null)) then
                        begin
                        /*COMISIONES*/
                        if (MENSUAL = 'S') then
                            BEGIN
                            if (PERIODICIDAD = 1) then
                                BEGIN
                                perinicial = PERIODO;
                                PERFINAL = PERIODO;
                                END
                            if (PERIODICIDAD = 2) then
                                BEGIN
                                perinicial = PERIODO - (LIQUIDAPER - 1);
                                PERFINAL = PERIODO + (2 - LIQUIDAPER);
                                END
                            if (PERIODICIDAD = 3) then
                                BEGIN
                                perinicial = PERIODO - (LIQUIDAPER - 1);
                                PERFINAL = PERIODO + (4 - LIQUIDAPER);
                                END
                            END
                        ELSE
                            BEGIN
                            perinicial = PERIODO;
                            PERFINAL = PERIODO;
                            END
                            
                        /* SUME LAS COMISIONES DE LOS DEMAS PERIODOS DEL MES */
                        select SUM(C.NCOM_MONTO) from NOMINA_COMISIONES C where C.NCOM_ANO = :ANO
                            and C.NCOM_PERIODO >= :PERINICIAL AND C.NCOM_PERIODO <= :PERFINAL
                            and C.NCOM_PERIODICIDAD = :PERIODICIDAD and C.TERC_NIT = :NITE
                            into :COMISION;
                        if (COMISION is null) then
                            COMISION = 0;
                        /*RETROACTIVO*/
                        select C.EMCO_MONTO from EMPLEADO_CONCEPTOS C where C.TERC_NIT = :NITE
                            and C.CONC_COD = 933 into :RETROACT;
                            if (RETROACT is null ) then
                                RETROACT = 0;
                        /*REEMBOLSO*/
                        select C.EMCO_MONTO from EMPLEADO_CONCEPTOS C where C.TERC_NIT = :NITE
                            and C.CONC_COD = 952 into :REEMBOLSO;
                        if (REEMBOLSO is null ) then
                            REEMBOLSO = 0;
                        /*VACACIONES DISFRUTADAS ANTERIORMENTE*/
                        select C.EMCO_MONTO from EMPLEADO_CONCEPTOS C where C.TERC_NIT = :NITE
                            and C.CONC_COD = 955 into :VACACDISF;
                        if (VACACDISF is null ) then
                            VACACDISF = 0;
                        /* INCAPACIDAD*/
                        select ND.NNDE_DURACION from NOMINA_NOVEDADES N, nomina_novedades_detalle ND
                            where N.nono_id = ND.nono_id AND N.TERC_NIT = :NITE
                            and ND.NNDE_PERIODO >= :perinicial and ND.NNDE_PERIODO <= :perfinal and ND.NNDE_ANO = :ANO and (N.TNOV_COD = 2 or (N.TNOV_COD = 3))
                            into :DIASNOV;
                        if (:DIASNOV is null) then
                            INCAP = 0;
                        else
                            INCAP = (:BASICO / 30)* :DIASNOV;
                        /*BASICO*/
                        if (SALINTEG = 'S') then
                            BASICO = BASICO * (tar_salinteg / 100);

                        if (MENSUAL <> 'S') then
                            BASICO = ((:BASICO/30)*:DIASLAB);
                        /*HORAS EXTRA*/
                        select SUM(C.NOEX_MONTO) from NOMINA_HORASEXT C where C.NOEX_ANO = :ANO
                            and C.NOEX_PERIODIO >= :PERINICIAL and C.NOEX_PERIODIO <= :PERFINAL
                            and C.NOEX_PERIODICIDAD = :PERIODICIDAD and C.TERC_NIT = :NITE
                            into :HORASEX;
                        if (HORASEX is null) then
                            HORASEX = 0;
                        /*RECARGOS*/
                        BASICOREC = BASICOEMP;
                        RECARGO = (((:BASICOREC/30)/8)*:TAR_RECNOTC)*:RECNOCT;
                        RECARGO = :RECARGO + ((((:BASICOREC/30)/8)*:TAR_RECFEST)*:RECFEST);
                        if (RECARGO is null) then
                            RECARGO = 0;
                        /*basico*/
                        if (MENSUAL <> 'S') then
                            begin
                            if (:BASICO + :COMISION + :HORASEX + :RETROACT+ :REEMBOLSO + :INCAP+ :CAMBSALTRANS < ((:SMLV/30)*:DIASLAB)) then
                                BASICO = (:SMLV/30)*:DIASLAB;
                            end
                        else
                            begin
                            if (:BASICO + :COMISION + :HORASEX + :RETROACT+ :REEMBOLSO + :INCAP+ :CAMBSALTRANS < :SMLV) then
                                BASICO = :SMLV;
                            end
                        /* SMLV Y AUX. TRANSPORTE*/
                        select P.PAAN_AUXTR, P.PAAN_SALMINIMO from PARAMETROS_ANO P
                            where P.PAAN_ANO = :ANO into :AUXTRANS, :SMLV;
                        /*BASE*/
                        VALOR = :BASICO + :COMISION + :HORASEX + :RETROACT+ :REEMBOLSO + :INCAP + :RECARGO + :CAMBSALTRANS + :VACACDISF;

                        if (CONC_COD = 904) then
                            begin
                            ENTIDAD = :NITAFP;
                            select A.PAAN_AFPTR from PARAMETROS_ANO A where A.PAAN_ANO = :ANO into :PORCEN;
                            VALOR = ((:VALOR) * :PORCEN) /100;
                            end
                        else if ((CONC_COD = 905) or (CONC_COD = 906) or (CONC_COD = 934) ) then
                            begin
                            ENTIDAD = :NITAFP;
                            select A.PAAN_AFPEM from PARAMETROS_ANO A where A.PAAN_ANO = :ANO into :PORCEN;
                            VALOR = ((:VALOR) * :PORCEN) /100;
                            end
                        else if ((CONC_COD = 907) or (CONC_COD = 914) or (CONC_COD = 915) or (conc_cod = 938)) then
                            begin
                            ENTIDAD = :NITEPS;
                            if (CONC_COD = 907) then
                                begin
                                select A.PAAN_EPSTR from PARAMETROS_ANO A where A.PAAN_ANO = :ANO into :PORCEN;
                                VALOR = ((:VALOR) * :PORCEN) /100;
                                end
                            else
                                begin
                                select A.PAAN_EPSEM from PARAMETROS_ANO A where A.PAAN_ANO = :ANO into :PORCEN;
                                    VALOR = ((:VALOR) * :PORCEN) /100;
                                end
                            end
                        else if ((CONC_COD = 910) or (CONC_COD = 911) or (CONC_COD = 936)) then
                            begin
                            /*ccf */
                            ENTIDAD = :NITCCF;
                            select A.PAAN_CCF from PARAMETROS_ANO A where A.PAAN_ANO = :ANO into :PORCEN;
                            VALOR = ((:VALOR) * :PORCEN) /100;
                            end
                        else if ((CONC_COD = 916) or (CONC_COD = 917) or (CONC_COD = 939) ) then
                            begin
                            /*icbf */
                            ENTIDAD = :NITCCF;
                            select A.PAAN_ICBF from PARAMETROS_ANO A where A.PAAN_ANO = :ANO into :PORCEN;
                            VALOR = ((:VALOR) * :PORCEN) /100;
                            end
                        else if ((CONC_COD = 918) or (CONC_COD = 919) or (CONC_COD = 940) ) then
                            begin
                            /*sena */
                            ENTIDAD = :NITCCF;
                            select A.PAAN_SENA from PARAMETROS_ANO A where A.PAAN_ANO = :ANO into :PORCEN;
                            VALOR = ((:VALOR) * :PORCEN) /100;
                            end
                        else if ((CONC_COD = 912) or (CONC_COD = 913) or (CONC_COD = 937)) then
                            begin
                            /* CESANTIAS */
                            ENTIDAD = :NITAFC;
                            if (PARAMBENEF = 'SI') then
                                begin
                                select sum(CE.EMCO_MONTO)
                                    from EMPLEADO_CONCEPTOS CE, CONCEPTOS_NOMINA CN where CN.CONC_BENEFIC = 'S' and (CE.TERC_NIT = :NITE) and (CE.CONC_COD = CN.CONC_COD) and
                                    ((CE.EMCO_FECINI <= :FEC and CE.EMCO_FECFIN >= :FEC) or ((CN.CONC_TODOSPER = 'N') and (CE.EMCO_PPAGO = :PERIODO)) or
                                    (CN.CONC_TODOSPER = 'S'))
                                    into :BENEFICIOS;
                                if (BENEFICIOS is null) then
                                    BENEFICIOS = 0;
                                end
                            else
                                BENEFICIOS = 0;
                            select P.PAAN_AUXTR, P.PAAN_SALMINIMO from PARAMETROS_ANO P
                                where P.PAAN_ANO = :ANO into :AUXTRANS, :SMLV;
                            if (:BASICO < (:SMLV*2)) then
                                AUXTRANS = (:AUXTRANS / 30) * :DIASLAB;
                            else
                                AUXTRANS = 0;
                            select A.PAAN_CESEMP from PARAMETROS_ANO A where A.PAAN_ANO = :ANO
                                into :PORCEN;
                            VALOR = ((:VALOR + :AUXTRANS + :BENEFICIOS) * :PORCEN) /100;
                            end
                        else
                            begin
                            if (COMISION is null) then
                                COMISION = 0;
                            select C.NCOM_MONTO from NOMINA_COMISIONES C where C.NCOM_ANO = :ANO and C.NCOM_PERIODO = :PERIODO and C.NCOM_PERIODICIDAD = :PERIODICIDAD and C.TERC_NIT = :NITE
                                into :COMISION;
                            CONC_MONTO = :BASICO + :COMISION;
                            if (CONC_PORC <> 0 and CONC_PORC is not null) then
                                if (mensual <> 'S') then
                                    VALOR = (((:CONC_MONTO/30 * :DIASLAB )+ :CAMBSALTRANS + :INCAP) * :CONC_PORC) /100;
                                else
                                    VALOR = ((:CONC_MONTO+ :CAMBSALTRANS + :INCAP) * :CONC_PORC) /100;
                            else
                                if (:PORCEN <> 0 and :PORCEN is not null) then
                                    if (mensual <> 'S') then
                                        VALOR = (((:CONC_MONTO/30 * :DIASLAB )+ :CAMBSALTRANS + :INCAP) * :PORCEN) /100;
                                    else
                                        VALOR = ((:CONC_MONTO + :CAMBSALTRANS + :INCAP) * :PORCEN) /100;
                                else
                                    if (:MONTOS <> 0 and :MONTOS is not null) then
                                        VALOR = :MONTOS;
                                    else
                                        if (:CONC_MONTO <> 0 and :CONC_MONTO is not null) then
                                            VALOR = :CONC_MONTO;
                            end
                        ITEM = :ITEM + 1;
                        end
                    end /* aportes */
                else if (CONC_PROV = 'S') then
                    begin
                    /*provisiones */
                    HORASEX = null;
                    DIASNOV = null;
                    RETROACT = null;
                    REEMBOLSO = null;
                    BENEFICIOS = null;
                    RECARGO = null;
                    COMISION = null;
                    INCAP = null;
                    if (MENSUAL = 'S') then
                        BEGIN
                        if (PERIODICIDAD = 1) then
                            BEGIN
                            perinicial = PERIODO;
                            PERFINAL = PERIODO;
                            END
                        if (PERIODICIDAD = 2) then
                            BEGIN
                            perinicial = PERIODO - (LIQUIDAPER - 1);
                            PERFINAL = PERIODO + (2 - LIQUIDAPER);
                            END
                        if (PERIODICIDAD = 3) then
                            BEGIN
                            perinicial = PERIODO - (LIQUIDAPER - 1);
                            PERFINAL = PERIODO + (4 - LIQUIDAPER);
                            END
                        END
                    ELSE
                        BEGIN
                        perinicial = PERIODO;
                        PERFINAL = PERIODO;
                        END
                    /* RECARGO*/
                    BASICO = BASICOEMP;
                    RECARGO = (((:BASICO/30)/8)*:TAR_RECNOTC)*:RECNOCT;
                    RECARGO = :RECARGO + ((((:BASICO/30)/8)*:TAR_RECFEST)*:RECFEST);
                    /*INCAPACIDAD*/
                    select ND.NNDE_DURACION from NOMINA_NOVEDADES N, nomina_novedades_detalle ND
                        where N.nono_id = ND.nono_id AND N.TERC_NIT = :NITE
                        and ND.NNDE_PERIODO >= :perinicial and ND.NNDE_PERIODO <= :perfinal and ND.NNDE_ANO = :ANO
                        and (N.TNOV_COD = 2 or (N.TNOV_COD = 3)) into :DIASNOV;
                    if (:DIASNOV is null) then
                        INCAP = 0;
                    else
                        INCAP = (:BASICO / 30)* :DIASNOV;
                    /* BASICO*/
                    if (mensual <> 'S') then
                        BASICO = ((:BASICO/30)*:DIASLAB);
                    if (SALINTEG = 'S') then
                        BASICO = BASICO * (tar_salinteg / 100);
                    /*BENEFICIOS*/
                    if (PARAMBENEF = 'SI') then
                        begin
                        select sum(CE.EMCO_MONTO)
                            from EMPLEADO_CONCEPTOS CE, CONCEPTOS_NOMINA CN where CN.CONC_BENEFIC = 'S'
                            and (CE.TERC_NIT = :NITE) and (CE.CONC_COD = CN.CONC_COD) and
                            ((CE.EMCO_FECINI <= :FEC and CE.EMCO_FECFIN >= :FEC) or ((CN.CONC_TODOSPER = 'N')
                            and (CE.EMCO_PPAGO = :PERIODO)) or (CN.CONC_TODOSPER = 'S'))
                            into :BENEFICIOS;
                        if (BENEFICIOS is null) then
                            BENEFICIOS = 0;
                        end
                    else
                        BENEFICIOS = 0;
                    if ((CONC_COD <> 929) and (CONC_COD <> 930) and (CONC_COD <> 944)) then
                        begin
                        /* si no es vacaciones */
                        select P.PAAN_AUXTR, P.PAAN_SALMINIMO from PARAMETROS_ANO P where P.PAAN_ANO = :ANO
                            into :AUXTRANS, :SMLV;
                        if (:BASICO < (:SMLV*2)) then
                            begin
                            if (mensual <> 'S') then
                                AUXTRANS = (:AUXTRANS / 30) * :DIASLAB;
                            end
                        else
                            AUXTRANS = 0;
                        end
                    else
                        AUXTRANS = 0;
                    CONC_MONTO = :BASICO;
                    if (CONC_PORC <> 0 and CONC_PORC is not null) then
                        VALOR = ((:CONC_MONTO + :CAMBSALTRANS + :INCAP + :RECARGO + :AUXTRANS + :BENEFICIOS) * :CONC_PORC) /100;
                    else
                        if (PORCEN <> 0 and PORCEN is not null) then
                            VALOR = ((:CONC_MONTO + :CAMBSALTRANS + :INCAP + :RECARGO + :AUXTRANS + :BENEFICIOS) * :PORCEN) /100;
                        else
                            if (MONTOS <> 0 and MONTOS is not null) then
                                VALOR = :MONTOS;
                            else
                                if (CONC_MONTO <> 0 and CONC_MONTO is not null) then
                                    VALOR = :CONC_MONTO;
                    ITEM = :ITEM + 1;
                    end /* provision */
                else if (CONC_COD = 920) then /* comisiones */
                    begin
                    select sum(C.NCOM_MONTO) from NOMINA_COMISIONES C where C.NCOM_ANO = :ANO
                    and C.NCOM_PERIODO >= :perinicial and C.NCOM_PERIODO <= :perfinal and C.NCOM_PERIODICIDAD = :PERIODICIDAD and C.TERC_NIT = :NITE into :VALOR;
                    if (VALOR is null) then
                        VALOR = 0;
                    ITEM = :ITEM + 1;
                    end
                else if (CONC_COD = 900 or (:CONC_COD = 931)) then /* horas extra */
                    begin
                    select sum(C.NOEX_MONTO) from NOMINA_HORASEXT C where C.NOEX_ANO = :ANO and
                        C.NOEX_PERIODIO >= :perinicial and C.NOEX_PERIODIO <= :perfinal and C.NOEX_PERIODICIDAD = :PERIODICIDAD and C.TERC_NIT = :NITE into :VALOR;
                    if (VALOR is null) then
                        VALOR = 0;
                    ITEM = :ITEM + 1;
                    end
                else if (CONC_COD = 954) then /* cartera */
                    begin
                    select sum(C.NCAR_MONTO) from NOMINA_CARTERA C where C.NCAR_ANO = :ANO
                    and C.NCAR_PERIODO >= :perinicial and C.NCAR_PERIODO <= :perfinal and C.NCAR_PERIODICIDAD = :PERIODICIDAD and C.TERC_NIT = :NITE into :VALOR;
                    if (VALOR is null) then
                        VALOR = 0;
                    ITEM = :ITEM + 1;
                    end
                else if (CONC_COD = 932) then
                    begin
                    /* incapacidad */
                    select ND.NNDE_DURACION from NOMINA_NOVEDADES N, nomina_novedades_detalle ND
                        where N.nono_id = ND.nono_id AND N.TERC_NIT = :NITE
                        and ND.NNDE_PERIODO >= :perinicial and ND.NNDE_PERIODO <= :perfinal and ND.NNDE_ANO = :ANO
                        and (N.TNOV_COD = 2 or (N.TNOV_COD = 3)) into :DIASNOV;
                    if (:DIASNOV is null) then
                        VALOR = 0;
                    else
                        VALOR = (:BASICO / 30)* :DIASNOV;
                    end
                else if (CONC_COD = 921) then
                    begin
                    if (PORCEN is not null and PORCEN <> 0) then
                        VALOR = ((BASICO / 30)* :DIASLAB ) * :PORCEN /100;
                    else
                        if (CONC_PORC is not null and CONC_PORC <> 0) then
                            VALOR = ((BASICO / 30)* :DIASLAB ) * :CONC_PORC /100;
                    end
                else if (CONC_COD = 953) then
                    begin
                    /* RECARGO */
                    BASICO = BASICOEMP;
                    VALOR = (((:BASICO/30)/8)*:TAR_RECNOTC)*:RECNOCT;
                    VALOR = :VALOR + ((((:BASICO/30)/8)*:TAR_RECFEST)*:RECFEST);
                    end
                if (CONC_APORTE = 'S') then
                    begin
                    if (ENTIDAD is null or (ENTIDAD = '') ) then
                        ENTIDAD = :CONC_ENTIDAD;
                    end
                end
            if ((VALOR <> 0) and (VALOR is not null)) then
                begin
                execute procedure REDONDEE(:VALOR, :APROX) returning_values (VALOR);
                if ((MENSUAL = 'N') or (PERIODICIDAD = 1))  then
                    insert into NOMINA_CONCEPTOS (NOMI_ID, NOCO_ITEM, CONC_COD,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, NOCO_GTOEMPR)
                        values (:IDNOMINA,:ITEM, :CONCEPT, :NIT_TERCERO, :VALOR, :ENTIDAD, :CONC_DEDUC, :CONC_PROV, :CONC_APORTE, :PERIODO, :ANO, :CONC_MODIFI, :CONC_APLICAPROM, :SALARIO, :GTOEMPR);
                else
                    if (MENSUAL = 'S') then
                        begin
                        if ((:PERIODICIDAD = 2) and (LIQUIDAPER = 1)) then
                            begin
                            if ((PERIODO = 1) or (PERIODO = 3) or (PERIODO = 5) or (PERIODO = 7) or (PERIODO = 9) or (PERIODO = 11)
                                or (PERIODO = 13) or (PERIODO = 15) or (PERIODO = 17) or (PERIODO = 19) or (PERIODO = 21) or (PERIODO = 23)) then
                                insert into NOMINA_CONCEPTOS (NOMI_ID, NOCO_ITEM, CONC_COD,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, NOCO_GTOEMPR)
                                    values (:IDNOMINA,:ITEM, :CONCEPT, :NIT_TERCERO, :VALOR, :ENTIDAD, :CONC_DEDUC, :CONC_PROV, :CONC_APORTE, :PERIODO, :ANO, :CONC_MODIFI, :CONC_APLICAPROM, :SALARIO, :GTOEMPR);
                            end
                        else if ((:PERIODICIDAD = 2) and (LIQUIDAPER = 2)) then
                            begin
                            if ((PERIODO = 2) or (PERIODO = 4) or (PERIODO = 6) or (PERIODO = 8) or (PERIODO = 10) or (PERIODO = 12)
                                or (PERIODO = 14) or (PERIODO = 16) or (PERIODO = 18) or (PERIODO = 20) or (PERIODO = 22) or (PERIODO = 24)) then
                                insert into NOMINA_CONCEPTOS (NOMI_ID, NOCO_ITEM, CONC_COD,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, NOCO_GTOEMPR)
                                    values (:IDNOMINA,:ITEM, :CONCEPT, :NIT_TERCERO, :VALOR, :ENTIDAD, :CONC_DEDUC, :CONC_PROV, :CONC_APORTE, :PERIODO, :ANO, :CONC_MODIFI, :CONC_APLICAPROM, :SALARIO, :GTOEMPR);
                            end
                        else if ((:PERIODICIDAD = 3) and (LIQUIDAPER = 1)) then
                            begin
                            if ((PERIODO = 1) or (PERIODO = 5) or (PERIODO = 9) or (PERIODO = 13) or (PERIODO = 17) or (PERIODO = 21)
                                or (PERIODO = 25) or (PERIODO = 29) or (PERIODO = 33) or (PERIODO = 37) or (PERIODO = 41) or (PERIODO = 45)
                                or (PERIODO = 49)) then
                                insert into NOMINA_CONCEPTOS (NOMI_ID, NOCO_ITEM, CONC_COD,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, NOCO_GTOEMPR)
                                    values (:IDNOMINA,:ITEM, :CONCEPT, :NIT_TERCERO, :VALOR, :ENTIDAD, :CONC_DEDUC, :CONC_PROV, :CONC_APORTE, :PERIODO, :ANO, :CONC_MODIFI, :CONC_APLICAPROM, :SALARIO, :GTOEMPR);
                            end
                        else if ((:PERIODICIDAD = 3) and (LIQUIDAPER = 2)) then
                            begin
                            if ((PERIODO = 2) or (PERIODO = 6) or (PERIODO = 10) or (PERIODO = 14) or (PERIODO = 18) or (PERIODO = 22)
                                or (PERIODO = 26) or (PERIODO = 30) or (PERIODO = 34) or (PERIODO = 38) or (PERIODO = 42) or (PERIODO = 46)
                                or (PERIODO = 50)) then
                                insert into NOMINA_CONCEPTOS (NOMI_ID, NOCO_ITEM, CONC_COD,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, NOCO_GTOEMPR)
                                    values (:IDNOMINA,:ITEM, :CONCEPT, :NIT_TERCERO, :VALOR, :ENTIDAD, :CONC_DEDUC, :CONC_PROV, :CONC_APORTE, :PERIODO, :ANO, :CONC_MODIFI, :CONC_APLICAPROM, :SALARIO, :GTOEMPR);
                            end
                        else if ((:PERIODICIDAD = 3) and (LIQUIDAPER = 3)) then
                            begin
                            if ((PERIODO = 3) or (PERIODO = 7) or (PERIODO = 11) or (PERIODO = 15) or (PERIODO = 19) or (PERIODO = 23)
                                or (PERIODO = 27) or (PERIODO = 31) or (PERIODO = 35) or (PERIODO = 39) or (PERIODO = 43) or (PERIODO = 47)
                                or (PERIODO = 51)) then
                                insert into NOMINA_CONCEPTOS (NOMI_ID, NOCO_ITEM, CONC_COD,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, NOCO_GTOEMPR)
                                    values (:IDNOMINA,:ITEM, :CONCEPT, :NIT_TERCERO, :VALOR, :ENTIDAD, :CONC_DEDUC, :CONC_PROV, :CONC_APORTE, :PERIODO, :ANO, :CONC_MODIFI, :CONC_APLICAPROM, :SALARIO, :GTOEMPR);
                            end
                        else if ((:PERIODICIDAD = 3) and (LIQUIDAPER = 4)) then
                            begin
                            if ((PERIODO = 4) or (PERIODO = 8) or (PERIODO = 12) or (PERIODO = 16) or (PERIODO = 20) or (PERIODO = 24)
                                or (PERIODO = 29) or (PERIODO = 32) or (PERIODO = 36) or (PERIODO = 40) or (PERIODO = 44) or (PERIODO = 48)
                                or (PERIODO = 52)) then
                                insert into NOMINA_CONCEPTOS (NOMI_ID, NOCO_ITEM, CONC_COD,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, NOCO_GTOEMPR)
                                    values (:IDNOMINA,:ITEM, :CONCEPT, :NIT_TERCERO, :VALOR, :ENTIDAD, :CONC_DEDUC, :CONC_PROV, :CONC_APORTE, :PERIODO, :ANO, :CONC_MODIFI, :CONC_APLICAPROM, :SALARIO, :GTOEMPR);
                            end
                        end
                    VALOR = 0;
                    BASICO = 0;
                    end
            end /* for */
        end
    end
suspend;
end
^

SET TERM ; ^

/* 20100809 */
/* salarios debe incorporar primas, cesantias debe incluir intererses */

SET TERM ^ ;

CREATE OR ALTER procedure CERTIFICADOS_RETENCION_LABORAL (
    DESDE date,
    HASTA date,
    NIT varchar(20),
    FECHA date)
returns (
    NITEMPRESA varchar(60),
    RAZONSOCIAL varchar(100),
    DV integer,
    TIPOID varchar(1),
    NITEMPL varchar(20),
    NOMBRE1 varchar(60),
    NOMBRE2 varchar(60),
    APELLIDO1 varchar(60),
    APELLIDO2 varchar(60),
    DESDEANO varchar(4),
    DESDEMES varchar(2),
    DESDEDIA varchar(2),
    HASTAANO varchar(4),
    HASTAMES varchar(2),
    HASTADIA varchar(2),
    FECHAANO varchar(4),
    FECHAMES varchar(2),
    FECHADIA varchar(2),
    IDPAIS integer,
    NOMCIUDAD varchar(60),
    CIUDAD varchar(5),
    DEPTO varchar(2),
    MUNICIPIO varchar(3),
    SALARIOS numeric(18,2),
    VACACION numeric(18,2),
    TOTALVACAC numeric(18,2),
    CESANTIA numeric(18,2),
    OTROS numeric(18,2),
    TOTAL numeric(18,2),
    SALUD numeric(18,2),
    PESION numeric(18,2),
    VOLUNTARIOS numeric(18,2),
    RETENCION numeric(18,2))
AS
declare variable diasvacac integer;
declare variable pervacac integer;
declare variable salvacac numeric(18,2);
declare variable BENEFICIOS numeric(18,2);
BEGIN
  EXECUTE PROCEDURE LEE_CONFIGURACION ('CONTABILIDAD','GENERAL','NIT COMPAÑIA') RETURNING_VALUES (:nitempresa);
  EXECUTE PROCEDURE LEE_CONFIGURACION ('GENERAL','GENERAL','NOMBRE COMPAÑIA') RETURNING_VALUES (:razonsocial);
  EXECUTE PROCEDURE DV (nitempresa) RETURNING_VALUES (:dv);
  nitempl = :nit;
  SELECT T.terc_apellido1,T.terc_apellido2,T.terc_nombre1,T.terc_nombre2, T.terc_tipoid
  FROM TERCEROS T WHERE T.terc_nit = :nit INTO :apellido1,:apellido2,:nombre1,:nombre2,:tipoid;
  
  SELECT CONF_VALOR FROM CONFIGURACION WHERE CONF_MODULO = 'CONTABILIDAD' AND CONF_CATEGORIA = 'TERCEROS' AND CONF_PROPIEDAD = 'CODIGO DE CIUDAD A SUGERIR' INTO :CIUDAD;
  idpais = '196';
  desdeano = substr(:desde,1,4);
  desdemes = substr(:desde,6,7);
  desdedia = substr(:desde,9,10);
  hastaano = substr(:hasta,1,4);
  hastames = substr(:hasta,6,7);
  hastadia = substr(:hasta,9,10);
  fechaano = substr(:fecha,1,4);
  fechames = substr(:fecha,6,7);
  fechadia = substr(:fecha,9,10);
  SELECT P.ciud_nom FROM CIUDADES P WHERE P.ciud_cod = :ciudad INTO :nomciudad;
  depto = substr(:ciudad,1,2);
  municipio = substr(:ciudad,3,5);
  totalvacac = 0;
  SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC
    WHERE ((CONC_COD = 1) OR (CONC_COD = 19) OR (CONC_COD = 20) OR (CONC_COD = 22) OR (CONC_COD = 91) OR (CONC_COD = 17) OR (CONC_COD = 18) or (CONC_COD = 88) or (conc_cod  = 2)
    OR (CONC_COD = 900) OR (CONC_COD = 920) OR (CONC_COD = 932) OR (CONC_COD = 945) OR (CONC_COD = 946) OR (CONC_COD = 152) OR (CONC_COD = 160))
    AND NC.terc_nit = :nit AND NC.noco_ano >= :desdeano AND NC.noco_ano <= :hastaano INTO :salarios;
  if (salarios IS NULL) then
      salarios = 0;
  FOR SELECT NN.nono_dura, NN.nono_periodo FROM NOMINA_NOVEDADES NN WHERE NN.terc_nit = :nit AND NN.tnov_cod = 6 INTO :diasvacac,:pervacac
    DO
    BEGIN
    SELECT SUM(NC.noco_valor)/ (30-:diasvacac) FROM NOMINA_CONCEPTOS NC WHERE NC.terc_nit = :nit AND ((NC.conc_cod = 1) or (NC.conc_cod = 22)) AND NC.noco_periodo = :pervacac INTO :salvacac;
    if (:salvacac IS NULL) then
        salvacac = 0;
    totalvacac = totalvacac + (salvacac * :diasvacac);
    END
  salarios = :salarios + :totalvacac;
  SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE ((CONC_COD = 5) or (conc_cod  = 954) or (CONC_COD = 86) or (conc_cod  = 164))
    AND NC.terc_nit = :nit AND NC.noco_ano >= :desdeano AND NC.noco_ano <= :hastaano INTO :cesantia;
  if (cesantia is null) then
      cesantia = 0;
  SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC
    WHERE ((CONC_COD <> 1) and (CONC_COD <> 19) AND (CONC_COD <> 20) AND (CONC_COD <> 22) AND (CONC_COD <> 91) AND (CONC_COD <> 17) AND (CONC_COD <> 88) AND (conc_cod <> 2)
    AND (CONC_COD <> 18) AND (CONC_COD <> 900) AND (CONC_COD <> 920) AND (CONC_COD <> 932) AND (CONC_COD <> 945) AND (CONC_COD <> 946)
    AND (CONC_COD = 5) AND (conc_cod  = 954) AND (CONC_COD = 86) AND (conc_cod  = 164))
    AND NC.terc_nit = :nit AND NC.noco_ano >= :desdeano AND NC.noco_ano <= :hastaano and NC.noco_prov = 'N' and NC.noco_gtoempr = 'N' AND NC.noco_deduc = 'N' INTO :otros;
  if (otros is null) then
      otros = 0;
  /* LOS BENEFICIOS
  SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC, conceptos_nomina CN
    WHERE NC.conc_cod = CN.conc_cod AND CN.conc_benefic = 'S' AND NC.terc_nit = :nit AND NC.noco_ano >= :desdeano AND NC.noco_ano <= :hastaano INTO :beneficios;
  if (beneficios is null) then
      beneficios = 0;
  otros = otros + beneficios;*/
  total = salarios + cesantia + otros;
  SELECT SUM(NC.noco_valor)*-1 FROM NOMINA_CONCEPTOS NC WHERE (CONC_COD = 907) AND NC.terc_nit = :nit AND NC.noco_ano >= :desdeano AND NC.noco_ano <= :hastaano INTO :salud;
  voluntarios = 0;
  SELECT SUM(NC.noco_valor)*-1 FROM NOMINA_CONCEPTOS NC WHERE ((CONC_COD = 42) or (nc.conc_cod = 904) ) AND NC.terc_nit = :nit AND NC.noco_ano >= :desdeano AND NC.noco_ano <= :hastaano INTO :pesion;
  SELECT SUM(NC.noco_valor)*-1 FROM NOMINA_CONCEPTOS NC WHERE (CONC_COD = 6) AND NC.terc_nit = :nit AND NC.noco_ano >= :desdeano AND NC.noco_ano <= :hastaano INTO :retencion;
  SUSPEND;
END
^

SET TERM ; ^


/* 20100813 */
/* GRABE NOVEDAD AL CAMBIAR SALARIO */
ALTER TABLE MOVIMIENTO_SALARIO_EMPLEADO
ADD MVSE_NOVEDAD T_BOOLEANO;

UPDATE movimiento_salario_empleado SET MVSE_NOVEDAD = 'N';
COMMIT WORK;

SET TERM ^ ;

CREATE OR ALTER TRIGGER MOVIMIENTO_SALARIO_EMPLEADO_AI FOR MOVIMIENTO_SALARIO_EMPLEADO
ACTIVE AFTER INSERT POSITION 0
as
declare variable PPAGO INTEGER;
declare variable PERIODO INTEGER;
declare variable ANO INTEGER;
begin
update empleados set empl_salario = new.mvse_salario where terc_nit = new.terc_nit;
SELECT EMPL_PPAGO FROM EMPLEADOS WHERE TERC_NIT = NEW.terc_nit INTO :PPAGO;
EXECUTE PROCEDURE periodo_nom_fecha(NEW.mvse_fecha, :ppago) returning_values (:periodo, :ano);
if (NEW.mvse_novedad = 'S') then
    INSERT INTO NOMINA_NOVEDADES (nono_id, terc_nit, tnov_cod, nono_dura, nono_valor, nono_ppago,nono_periodo, nono_fecha, nono_ok, nono_ano)
        VALUES (GEN_ID(id_nomi_novedades, 1), new.terc_nit,8, 0, NEW.mvse_salario, :ppago, :periodo, NEW.mvse_fecha, 'S', :ANO);
end
^

SET TERM ; ^


/* 20100826 */
/* INCLUYA HORAS EXTRAS EN PROVISIONES */
SET TERM ^ ;

CREATE OR ALTER procedure CAUSA_NOMINA (
    FEC date,
    PERIODO integer,
    PERIODICIDAD integer,
    PAGOGLOBAL char(1),
    ANO char(4),
    DEPTO integer)
returns (
    IDNOMINA integer,
    ITEMINI integer)
AS
declare variable item integer;
declare variable nite varchar(20);
declare variable nit_tercero varchar(20);
declare variable concept integer;
declare variable montos numeric(18,2);
declare variable porcen numeric(9,4);
declare variable entidad varchar(20);
declare variable conc_cod integer;
declare variable conc_deduc char(1);
declare variable conc_porc numeric(9,4);
declare variable conc_entidad integer;
declare variable conc_monto numeric(18,2);
declare variable conc_modifi char(1);
declare variable conc_promedio char(1);
declare variable valor numeric(18,2);
declare variable diaslab integer;
declare variable conc_prov char(1);
declare variable conc_aporte char(1);
declare variable numeroprom integer;
declare variable conc_aplicaprom char(1);
declare variable perinicial integer;
declare variable perfinal integer;
declare variable anoini integer;
declare variable anofin integer;
declare variable conc_dias char(1);
declare variable conc_otroconc char(1);
declare variable conc_codotroconc integer;
declare variable anosum integer;
declare variable salario char(1);
declare variable liquidaper integer;
declare variable basico numeric(18,2);
declare variable niteps varchar(20);
declare variable nitafc varchar(20);
declare variable nitafp varchar(20);
declare variable nitccf varchar(20);
declare variable gtoempr char(1);
declare variable comision numeric(18,2);
declare variable cambsaltrans numeric(18,2);
declare variable saldosini numeric(18,2);
declare variable duranov integer;
declare variable base numeric(18,2);
declare variable aprox integer;
declare variable mensual char(1);
declare variable horasex numeric(18,2);
declare variable diasnov integer;
declare variable tomasal integer;
declare variable retroact numeric(18,2);
declare variable reembolso numeric(18,2);
declare variable incap numeric(18,2);
declare variable auxtrans numeric(18,2);
declare variable smlv numeric(18,2);
declare variable beneficios numeric(18,2);
declare variable confirmado char(1);
declare variable recnoct numeric(18,2);
declare variable recfest numeric(18,2);
declare variable tar_recnotc numeric(9,4);
declare variable tar_recfest numeric(9,4);
declare variable recargo numeric(18,2);
declare variable basicorec numeric(18,2);
declare variable parambenef char(2);
declare variable vacacdisf numeric(18,2);
declare variable valorpredet numeric(18,2);
declare variable basicoemp numeric(18,2);
declare variable salinteg char(1);
declare variable tar_salinteg numeric(9,4);
begin
execute procedure LEE_CONFIGURACION('NOMINA','LIQUIDACION','TOMAR BENEFICIOS PARA CALCULAR PROVISIONES')returning_values(:PARAMBENEF);
execute procedure LEE_CONFIGURACION('NOMINA','GENERAL','REDONDEO AL MULTIPLO DE DIEZ EN TOTALES')returning_values(:APROX);
select N.NOMI_ID, N.NOMI_LIQOK from NOMINA N where N.NOMI_PERIODO = :PERIODO and N.NOMI_PERIODOCIDAD = :PERIODICIDAD
    and N.NOMI_ANO = :ANO into :IDNOMINA, :CONFIRMADO;
if (:IDNOMINA is null) then
    begin
    execute procedure CAMBIE_ID_NOMINA returning_values(:IDNOMINA);
    insert into NOMINA (NOMI_ID, NOMI_FECCAUSA, NOMI_PAGOGLOBAL, NOMI_PERIODOCIDAD, NOMI_PERIODO, NOMI_ANO, NOMI_LIQOK)
    values (:IDNOMINA, :FEC,:PAGOGLOBAL, :PERIODICIDAD, :PERIODO, :ANO, 'N');
    ITEM = 1;
    end
else
    begin
    select max(N.NOCO_ITEM) from NOMINA_CONCEPTOS N where N.NOMI_ID = :IDNOMINA
    into :ITEM;
    end
if ((CONFIRMADO = 'S') and (IDNOMINA is not null)) then
    begin
    IDNOMINA = 0;
    end
else
    begin
    insert into NOMINA_DEPARTAMENTO (NOMI_ID, NODP_DEPTO)values(:IDNOMINA,:DEPTO);
    select P.PAAN_RECNOC, P.PAAN_RECFEST, P.paan_salinteg from PARAMETROS_ANO P where P.PAAN_ANO = :ANO
        into :TAR_RECNOTC, :TAR_RECFEST, TAR_SALINTEG;
    ITEMINI = ITEM;
    for select E.TERC_NIT, E.EMPL_EPS, E.EMPL_AFC, E.EMPL_AFP, E.EMPL_CCF, E.empl_salinteg
        from EMPLEADOS E
        where E.EMPL_PPAGO = :PERIODICIDAD and ((E.EMPL_FECRET is null) or (E.EMPL_FECRET > :FEC)) and E.EMPL_FECING <= :FEC
        and ((:DEPTO = 0) or (e.empl_dpto = :DEPTO))
        into :NITE, :NITEPS, :NITAFC, :NITAFP, :NITCCF, :SALINTEG
        do
        begin
        select first 1 M.MVSE_SALARIO from MOVIMIENTO_SALARIO_EMPLEADO M where M.TERC_NIT = :NITE and M.MVSE_FECHA <= :FEC order by M.MVSE_FECHA desc into :BASICOEMP;
        BASICO = BASICOEMP;
        RECNOCT = null;
        RECFEST = null;
        select N.NOEX_RECNOCT, N.NOEX_RECFEST
            from NOMINA_HORASEXT N where N.NOEX_PERIODIO = :PERIODO and N.NOEX_ANO = :ANO and N.TERC_NIT = :NITE
            into :RECNOCT, :RECFEST;
        if (RECNOCT is null) then
            RECNOCT = 0;
        if (RECFEST is null) then
            RECFEST = 0;
        for select CE.TERC_NIT, CE.CONC_COD, CE.EMCO_MONTO, CE.EMCO_PORC, CE.EMPL_ENTIDAD, CE.EMCO_PERPROM, CE.EMCO_LUQUIDAPER, CE.EMCO_MENSUAL, CN.CONC_COD, CN.CONC_DEDUC,CN.CONC_PORC, CN.CONC_ENTIDAD, CN.CONC_MONTO,  CN.CONC_DIAS, CN.CONC_MODIFI,
            CN.CONC_PROMEDIO, CN.CONC_SALARIO, CN.CONC_PROV, CN.CONC_APORTE, CN.CONC_APLICAPROM, CN.CONC_OTROCONC, CN.CONC_CODOTROCONC, CN.CONC_GTOEMPR, CN.CONC_BASE, CE.EMCO_TOMSAL
            from EMPLEADO_CONCEPTOS CE, CONCEPTOS_NOMINA CN where (CE.CONC_COD = CN.CONC_COD) and (CE.TERC_NIT = :NITE) and
            ( ((CE.EMCO_FECINI <= :FEC and CE.EMCO_FECFIN >= :FEC)) or
            ((CN.CONC_TODOSPER = 'N') and (CE.EMCO_PPAGO = :PERIODO)) or ((CN.CONC_TODOSPER = 'S') AND (((:periodicidad = 1) AND (:PERIODO < 13)) or ((:periodicidad = 2) AND (:PERIODO < 25)))) )  order by (TERC_NIT )
            into :NIT_TERCERO, :CONCEPT,  :MONTOS, :PORCEN, :ENTIDAD, :NUMEROPROM, :LIQUIDAPER, :MENSUAL ,:CONC_COD, :CONC_DEDUC, :CONC_PORC,
            :CONC_ENTIDAD, :CONC_MONTO, :CONC_DIAS, :CONC_MODIFI,:CONC_PROMEDIO, :SALARIO,:CONC_PROV, :CONC_APORTE , :CONC_APLICAPROM, :CONC_OTROCONC, :CONC_CODOTROCONC, :GTOEMPR, :BASE, :TOMASAL
            do
            begin
            if (CONC_DIAS = 'S') then
                execute procedure DIAS_LABORADOS (:NITE, :PERIODO, :FEC, :MENSUAL,:CONC_APORTE) returning_values (:DIASLAB);
            else
                BEGIN
                SELECT PPAG_DIAS FROM PERIODO_PAGO WHERE PPAG_COD = :periodicidad INTO :diaslab;
                END
            if (:TOMASAL <> 0) then
                begin
                /* SI EL CONCEPTO NOAPLICA EN ESTE PERIODO DEJE EL BASICO EN CERO */
                if ((:PERIODICIDAD = 2) and (:TOMASAL <> 2)) then
                    begin
                    if ((PERIODO = 2) or (PERIODO = 4) or (PERIODO = 6) or (PERIODO = 8) or (PERIODO = 10) or (PERIODO = 12)
                        or (PERIODO = 14) or (PERIODO = 16) or (PERIODO = 18) or (PERIODO = 20) or (PERIODO = 22) or (PERIODO = 24)) then
                        BASICO = 0;
                    end
                else
                    if ((:PERIODICIDAD = 3) and (:TOMASAL <> 1)) then
                        begin
                        if ((PERIODO = 1) or (PERIODO = 5) or (PERIODO = 9) or (PERIODO = 13) or (PERIODO = 17) or (PERIODO = 21)
                            or (PERIODO = 25) or (PERIODO = 29) or (PERIODO = 33) or (PERIODO = 37) or (PERIODO = 41) or (PERIODO = 45)
                            or (PERIODO = 49)) then
                            BASICO = 0;
                        end
                    else
                        if ((:PERIODICIDAD = 3) and (:TOMASAL <> 2)) then
                            begin
                            if ((PERIODO = 2) or (PERIODO = 6) or (PERIODO = 10) or (PERIODO = 14) or (PERIODO = 18) or (PERIODO = 22)
                                or (PERIODO = 26) or (PERIODO = 30) or (PERIODO = 34) or (PERIODO = 38) or (PERIODO = 42) or (PERIODO = 46)
                                or (PERIODO = 50)) then
                                BASICO = 0;
                            end
                        else
                            if ((:PERIODICIDAD = 3) and (:TOMASAL <> 3)) then
                                begin
                                if ((PERIODO = 3) or (PERIODO = 7) or (PERIODO = 11) or (PERIODO = 15) or (PERIODO = 19) or (PERIODO = 23)
                                    or (PERIODO = 27) or (PERIODO = 31) or (PERIODO = 35) or (PERIODO = 39) or (PERIODO = 43) or (PERIODO = 47)
                                    or (PERIODO = 51)) then
                                    BASICO = 0;
                                end
                            else
                                if ((:PERIODICIDAD = 3) and (:TOMASAL <> 4)) then
                                begin
                                if ((PERIODO = 4) or (PERIODO = 8) or (PERIODO = 12) or (PERIODO = 16) or (PERIODO = 20) or (PERIODO = 24)
                                    or (PERIODO = 29) or (PERIODO = 32) or (PERIODO = 36) or (PERIODO = 40) or (PERIODO = 44) or (PERIODO = 48)
                                    or (PERIODO = 52)) then
                                    BASICO = 0;
                                end
                end
            else
                begin
                /* SE CALCULA SOBRE TODOS LOS PERIODOS */
                BASICO = BASICOEMP;
                end
            VALORPREDET = null;
            select VP.NVPR_MONTO from NOMINA_VALOR_PREDET VP where VP.NVPR_PERIODICIDAD = :PERIODICIDAD and VP.NVPR_PERIODO = :PERIODO and VP.NVPR_ANO = :ANO and VP.CONC_COD = :CONC_COD and VP.TERC_NIT = :NITE
                into :VALORPREDET;
            if ((:VALORPREDET <> 0) and (VALORPREDET is not null)) then
                VALOR = VALORPREDET;
            else
                begin
                /* SI HAY UN CAMBIO TRANSITORIO DE SALARIO AJUSTE LOS DIAS Y CALCULE EL VALOR A SUMAR */
                select SUM((N.NONO_VALOR /30) * ND.NNDE_DURACION), SUM(ND.NNDE_DURACION) from NOMINA_NOVEDADES N, nomina_novedades_detalle ND
                    where N.nono_id = ND.nono_id AND N.TNOV_COD = 11 and N.TERC_NIT = :NITE and ND.NNDE_PERIODO = :PERIODO
                    into :CAMBSALTRANS, :DURANOV;
                if (CAMBSALTRANS is null) then
                    CAMBSALTRANS = 0;
                if (DURANOV is null) then
                    DURANOV = 0;
                DIASLAB = :DIASLAB - :DURANOV;
                /* SI ES UN PRESTAMO, TRAIGA LA CUOTA */
                if (CONC_COD = 922) then
                    begin
                    select sum(P.PRCU_MONTO) from PRESTAMO_CUOTAS P, PRESTAMO_NOMINA PN
                        where P.PRCU_ANO = :ANO and P.PRCU_PERIODO = :PERIODO and PN.PRNO_ID = P.PRNO_ID and PN.TERC_NIT = :NITE into :VALOR;
                    if (VALOR is null) then
                        VALOR = 0;
                    ITEM = :ITEM + 1;
                    /* MARQUE LA CUOTA COMO PAGADA */
                    update PRESTAMO_CUOTAS  P set PRCU_OK = 'S' where P.PRCU_ANO = :ANO and P.PRCU_PERIODO = :PERIODO
                        and exists (select PRNO_ID from PRESTAMO_NOMINA where TERC_NIT = :NITE and PRNO_ID = P.prno_id);
                    end
                else
                    if ((:MONTOS = 0) or (:MONTOS is null)) then
                        begin
                        /* SI EL CONCEPTO DEL EMPLEADO NO TIENE MONTO TRAIGA EL DE CONCEPTOS_NOMINA */
                        if ((CONC_PORC = 0 and :PORCEN = 0) or (CONC_PORC is null and :PORCEN = 0) or (CONC_PORC = 0 and :PORCEN is null) or (CONC_PORC is null and :PORCEN is null) ) then
                            begin
                            /* SIN PORCENTAJE */
                            if ((CONC_MONTO <> 0) and (CONC_MONTO is not null) ) then
                                begin
                                VALOR = :CONC_MONTO;
                                if (:CONC_DIAS = 'S') then
                                    VALOR = (:VALOR / 30) * :DIASLAB;
                                end
                            else
                                if (SALARIO = 'S' and CONC_COD <> 900 and CONC_COD <> 920 and CONC_COD <> 932 and CONC_COD <> 953) then
                                    begin
                                    /* SI ES SALARIO SUME LAS EXTRAS */
                                    BASICO = BASICOEMP;
                                    BASICO = ((:BASICO/30)*:DIASLAB);/* - (((:BASICO/30)/8)*:RECNOCT);/* PFP:DEBERIA SER + Y POR LA TARIFA QUE NO VEO POR NINGUN LADO
                                    BASICO = :BASICO - (((:BASICO/30)/8)*:RECFEST);*/
                                    CONC_MONTO = :BASICO;
                                    VALOR = (:CONC_MONTO/*/30 * :diaslab*/ ) + :CAMBSALTRANS;
                                    end
                                else
                                    begin
                                    VALOR = MONTOS;
                                    if (:CONC_DIAS = 'S') then
                                        VALOR = (:VALOR / 30) * :DIASLAB;
                                    end
                            end
                        else    
                            begin
                            if (:PORCEN <> 0) then
                                begin
                                /* SI TIENE PORCENTAJE EN EMPLEADO_CONCEPTOS PERO EL MONTO SE TRAE DE CONCPETOS_NOMINA */
                                if ((CONC_MONTO <> 0) and (CONC_MONTO is not null) ) then
                                    begin
                                    VALOR = ((:CONC_MONTO ) * :PORCEN) /100;
                                    end
                                end
                            else
                                begin
                                /* NO TIENE PORCENTAJE EN EMPLEADO_CONCEPTOS SE TRAE MONTO Y PORC DE CONCPETOS_NOMINA */
                                if ((CONC_MONTO <> 0) and (CONC_MONTO is not null) ) then
                                    begin
                                    VALOR = ((:CONC_MONTO) * :CONC_PORC) /100;
                                    end
                                else
                                    if (SALARIO = 'S' and CONC_COD <> 900 and CONC_COD <> 920 and CONC_COD <> 932 and CONC_COD <> 953) then
                                        begin
                                        BASICO = BASICOEMP;
                                        BASICO = ((:BASICO/30)*:DIASLAB); /* - (((:BASICO/30)/8)*:RECNOCT);
                                        BASICO = :BASICO - (((:BASICO/30)/8)*:RECFEST);*/
                                        CONC_MONTO = :BASICO;
                                        VALOR = ((:CONC_MONTO)+ :CAMBSALTRANS * :CONC_PORC) /100;
                                        end
                                    else
                                        if (:CONC_MONTO = 0 and :MONTOS = 0) then
                                            begin
                                            CONC_MONTO = :BASICO;
                                            VALOR = (((:CONC_MONTO / 30) * :DIASLAB) + :CAMBSALTRANS * :CONC_PORC) /100;
                                            end
                                end
                            end
                        end
                    else
                        /* SI TIENE MONTO EN EMPLEADO_CONCEPTOS */
                        if ((CONC_PORC = 0 or (CONC_PORC is null)) and (:PORCEN = 0 or (PORCEN is null))) then
                            begin
                            VALOR = (:MONTOS);
                            if (:CONC_DIAS = 'S') then
                                VALOR = (:VALOR / 30) * :DIASLAB;   
                            end
                        else
                            if (:PORCEN <> 0 and PORCEN is not null) then
                                begin
                                VALOR = ((:MONTOS ) * :PORCEN) /100;
                                end
                            else
                                begin
                                VALOR = ((:MONTOS) * :CONC_PORC) /100;
                                end
                if (CONC_PROMEDIO = 'S') then
                    begin
                    /* CALCULO DEL PROMEDIO BASE DESDE LA FECHA MENOS EL NUMERO DE PERIODOS */
                    EXECUTE PROCEDURE periodo_nom_fecha (:fec, :periodicidad) returning_values (:perfinal, :anofin);
                    if (perfinal < numeroprom) then
                        BEGIN
                        anoini = anofin - 1;
                        if (periodicidad = 1) then
                            perinicial = 12 - (numeroprom - perfinal) + 1;
                        if (periodicidad = 2) then
                            perinicial = 24 - (numeroprom - perfinal) + 1;
                        if (periodicidad = 3) then
                            perinicial = 52 - (numeroprom - perfinal) + 1;
                        END
                    ELSE
                        BEGIN
                        PERINICIAL = :perfinal - :NUMEROPROM + 1;
                        anoini = ANOFIN;
                        END
                    if (anoini <> anofin) then
                        select sum (NOCO_VALOR) from NOMINA_CONCEPTOS N where N.NOCO_APLICAPROM = 'S' and
                            ((N.NOCO_PERIODO >= :PERINICIAL and N.NOCO_ANO = :anoini) or
                            (N.NOCO_PERIODO <= :perfinal and N.NOCO_ANO = :anofin)) and TERC_NIT = :NITE into :VALOR;
                    else
                        select sum (NOCO_VALOR) from NOMINA_CONCEPTOS N where N.NOCO_APLICAPROM = 'S' and
                            N.NOCO_PERIODO >= :PERINICIAL and N.NOCO_ANO = :anoini
                            and N.NOCO_PERIODO <= :perfinal and TERC_NIT = :NITE into :VALOR;
                    /* sume el saldo inicial */
                    SALDOSINI = 0;
                    select NOCO_VALOR from NOMINA_CONCEPTOS where CONC_COD = :CONC_COD and TERC_NIT  = :NITE and NOCO_PAGOOK = 'N' and NOCO_PERIODO = 0 into :SALDOSINI;
                    if (SALDOSINI is null) then
                        SALDOSINI = 0;
                    else
                        update NOMINA_CONCEPTOS N set NOCO_PAGOOK = 'S' where N.NOCO_APLICAPROM = 'S' and
                            CONC_COD = :CONC_COD and TERC_NIT = :NITE and NOCO_PERIODO = 0;

                    VALOR = :VALOR + :SALDOSINI;
                    /* APLIQUE LA PROPORCION Y EL PORCENTAJE */
                    VALOR = VALOR / NUMEROPROM;
                    VALOR = VALOR * PORCEN / 100;
                    end
                else if (CONC_OTROCONC = 'S') then
                    begin
                    ANOSUM = cast(ANO as integer);
                    ANOSUM = ANOSUM - 1;
                    select sum (NOCO_VALOR) from NOMINA_CONCEPTOS N where N.NOCO_ANO = :ANOSUM and N.CONC_COD = :CONC_CODOTROCONC and N.TERC_NIT = :NITE into :VALOR;
                    select NOCO_VALOR from NOMINA_CONCEPTOS where NOCO_ANO = :ANOSUM and CONC_COD = :CONC_CODOTROCONC and TERC_NIT = :NITE and NOCO_PERIODO = 0 into :SALDOSINI;
                    if (SALDOSINI is null) then
                        SALDOSINI = 0;
                    else
                        update NOMINA_CONCEPTOS set NOCO_PAGOOK = 'S' where NOCO_ANO = :ANOSUM and CONC_COD = :CONC_CODOTROCONC and NOCO_PERIODO = 0 and TERC_NIT = :NITE;
                    VALOR = :VALOR + :SALDOSINI;
                    update NOMINA_CONCEPTOS set NOCO_PAGOOK = 'S' where NOCO_ANO = :ANOSUM and CONC_COD = :CONC_CODOTROCONC and TERC_NIT = :NITE;
                    end
                else if (CONC_APORTE = 'S') then
                    begin
                    HORASEX = null;
                    DIASNOV = null;
                    RETROACT = null;
                    REEMBOLSO = null;
                    BENEFICIOS = null;
                    RECARGO = null;
                    COMISION = null;
                    INCAP = null;
                    VACACDISF = null;
                    if ((:ENTIDAD = '' ) or (ENTIDAD is null)) then
                        begin
                        /*COMISIONES*/
                        if (MENSUAL = 'S') then
                            BEGIN
                            if (PERIODICIDAD = 1) then
                                BEGIN
                                perinicial = PERIODO;
                                PERFINAL = PERIODO;
                                END
                            if (PERIODICIDAD = 2) then
                                BEGIN
                                perinicial = PERIODO - (LIQUIDAPER - 1);
                                PERFINAL = PERIODO + (2 - LIQUIDAPER);
                                END
                            if (PERIODICIDAD = 3) then
                                BEGIN
                                perinicial = PERIODO - (LIQUIDAPER - 1);
                                PERFINAL = PERIODO + (4 - LIQUIDAPER);
                                END
                            END
                        ELSE
                            BEGIN
                            perinicial = PERIODO;
                            PERFINAL = PERIODO;
                            END
                            
                        /* SUME LAS COMISIONES DE LOS DEMAS PERIODOS DEL MES */
                        select SUM(C.NCOM_MONTO) from NOMINA_COMISIONES C where C.NCOM_ANO = :ANO
                            and C.NCOM_PERIODO >= :PERINICIAL AND C.NCOM_PERIODO <= :PERFINAL
                            and C.NCOM_PERIODICIDAD = :PERIODICIDAD and C.TERC_NIT = :NITE
                            into :COMISION;
                        if (COMISION is null) then
                            COMISION = 0;
                        /*RETROACTIVO*/
                        select C.EMCO_MONTO from EMPLEADO_CONCEPTOS C where C.TERC_NIT = :NITE
                            and C.CONC_COD = 933 into :RETROACT;
                            if (RETROACT is null ) then
                                RETROACT = 0;
                        /*REEMBOLSO*/
                        select C.EMCO_MONTO from EMPLEADO_CONCEPTOS C where C.TERC_NIT = :NITE
                            and C.CONC_COD = 952 into :REEMBOLSO;
                        if (REEMBOLSO is null ) then
                            REEMBOLSO = 0;
                        /*VACACIONES DISFRUTADAS ANTERIORMENTE*/
                        select C.EMCO_MONTO from EMPLEADO_CONCEPTOS C where C.TERC_NIT = :NITE
                            and C.CONC_COD = 955 into :VACACDISF;
                        if (VACACDISF is null ) then
                            VACACDISF = 0;
                        /* INCAPACIDAD*/
                        select SUM(ND.NNDE_DURACION) from NOMINA_NOVEDADES N, nomina_novedades_detalle ND
                            where N.nono_id = ND.nono_id AND N.TERC_NIT = :NITE
                            and ND.NNDE_PERIODO >= :perinicial and ND.NNDE_PERIODO <= :perfinal and ND.NNDE_ANO = :ANO and (N.TNOV_COD = 2 or (N.TNOV_COD = 3))
                            into :DIASNOV;
                        if (:DIASNOV is null) then
                            INCAP = 0;
                        else
                            INCAP = (:BASICO / 30)* :DIASNOV;
                        /*BASICO*/
                        if (SALINTEG = 'S') then
                            BASICO = BASICO * (tar_salinteg / 100);

                        if (MENSUAL <> 'S') then
                            BASICO = ((:BASICO/30)*:DIASLAB);
                        /*HORAS EXTRA*/
                        select SUM(C.NOEX_MONTO) from NOMINA_HORASEXT C where C.NOEX_ANO = :ANO
                            and C.NOEX_PERIODIO >= :PERINICIAL and C.NOEX_PERIODIO <= :PERFINAL
                            and C.NOEX_PERIODICIDAD = :PERIODICIDAD and C.TERC_NIT = :NITE
                            into :HORASEX;
                        if (HORASEX is null) then
                            HORASEX = 0;
                        /*RECARGOS*/
                        BASICOREC = BASICOEMP;
                        RECARGO = (((:BASICOREC/30)/8)*:TAR_RECNOTC)*:RECNOCT;
                        RECARGO = :RECARGO + ((((:BASICOREC/30)/8)*:TAR_RECFEST)*:RECFEST);
                        if (RECARGO is null) then
                            RECARGO = 0;
                        /*basico*/
                        if (MENSUAL <> 'S') then
                            begin
                            if (:BASICO + :COMISION + :HORASEX + :RETROACT+ :REEMBOLSO + :INCAP+ :CAMBSALTRANS < ((:SMLV/30)*:DIASLAB)) then
                                BASICO = (:SMLV/30)*:DIASLAB;
                            end
                        else
                            begin
                            if (:BASICO + :COMISION + :HORASEX + :RETROACT+ :REEMBOLSO + :INCAP+ :CAMBSALTRANS < :SMLV) then
                                BASICO = :SMLV;
                            end
                        /* SMLV Y AUX. TRANSPORTE*/
                        select P.PAAN_AUXTR, P.PAAN_SALMINIMO from PARAMETROS_ANO P
                            where P.PAAN_ANO = :ANO into :AUXTRANS, :SMLV;
                        /*BASE*/
                        VALOR = :BASICO + :COMISION + :HORASEX + :RETROACT+ :REEMBOLSO + :INCAP + :RECARGO + :CAMBSALTRANS + :VACACDISF;

                        if (CONC_COD = 904) then
                            begin
                            ENTIDAD = :NITAFP;
                            select A.PAAN_AFPTR from PARAMETROS_ANO A where A.PAAN_ANO = :ANO into :PORCEN;
                            VALOR = ((:VALOR) * :PORCEN) /100;
                            end
                        else if ((CONC_COD = 905) or (CONC_COD = 906) or (CONC_COD = 934) ) then
                            begin
                            ENTIDAD = :NITAFP;
                            select A.PAAN_AFPEM from PARAMETROS_ANO A where A.PAAN_ANO = :ANO into :PORCEN;
                            VALOR = ((:VALOR) * :PORCEN) /100;
                            end
                        else if ((CONC_COD = 907) or (CONC_COD = 914) or (CONC_COD = 915) or (conc_cod = 938)) then
                            begin
                            ENTIDAD = :NITEPS;
                            if (CONC_COD = 907) then
                                begin
                                select A.PAAN_EPSTR from PARAMETROS_ANO A where A.PAAN_ANO = :ANO into :PORCEN;
                                VALOR = ((:VALOR) * :PORCEN) /100;
                                end
                            else
                                begin
                                select A.PAAN_EPSEM from PARAMETROS_ANO A where A.PAAN_ANO = :ANO into :PORCEN;
                                    VALOR = ((:VALOR) * :PORCEN) /100;
                                end
                            end
                        else if ((CONC_COD = 910) or (CONC_COD = 911) or (CONC_COD = 936)) then
                            begin
                            /*ccf */
                            ENTIDAD = :NITCCF;
                            select A.PAAN_CCF from PARAMETROS_ANO A where A.PAAN_ANO = :ANO into :PORCEN;
                            VALOR = ((:VALOR) * :PORCEN) /100;
                            end
                        else if ((CONC_COD = 916) or (CONC_COD = 917) or (CONC_COD = 939) ) then
                            begin
                            /*icbf */
                            ENTIDAD = :NITCCF;
                            select A.PAAN_ICBF from PARAMETROS_ANO A where A.PAAN_ANO = :ANO into :PORCEN;
                            VALOR = ((:VALOR) * :PORCEN) /100;
                            end
                        else if ((CONC_COD = 918) or (CONC_COD = 919) or (CONC_COD = 940) ) then
                            begin
                            /*sena */
                            ENTIDAD = :NITCCF;
                            select A.PAAN_SENA from PARAMETROS_ANO A where A.PAAN_ANO = :ANO into :PORCEN;
                            VALOR = ((:VALOR) * :PORCEN) /100;
                            end
                        else if ((CONC_COD = 912) or (CONC_COD = 913) or (CONC_COD = 937)) then
                            begin
                            /* CESANTIAS */
                            ENTIDAD = :NITAFC;
                            if (PARAMBENEF = 'SI') then
                                begin
                                select sum(CE.EMCO_MONTO)
                                    from EMPLEADO_CONCEPTOS CE, CONCEPTOS_NOMINA CN where CN.CONC_BENEFIC = 'S' and (CE.TERC_NIT = :NITE) and (CE.CONC_COD = CN.CONC_COD) and
                                    ((CE.EMCO_FECINI <= :FEC and CE.EMCO_FECFIN >= :FEC) or ((CN.CONC_TODOSPER = 'N') and (CE.EMCO_PPAGO = :PERIODO)) or
                                    (CN.CONC_TODOSPER = 'S'))
                                    into :BENEFICIOS;
                                if (BENEFICIOS is null) then
                                    BENEFICIOS = 0;
                                end
                            else
                                BENEFICIOS = 0;
                            select P.PAAN_AUXTR, P.PAAN_SALMINIMO from PARAMETROS_ANO P
                                where P.PAAN_ANO = :ANO into :AUXTRANS, :SMLV;
                            if (:BASICO < (:SMLV*2)) then
                                AUXTRANS = (:AUXTRANS / 30) * :DIASLAB;
                            else
                                AUXTRANS = 0;
                            select A.PAAN_CESEMP from PARAMETROS_ANO A where A.PAAN_ANO = :ANO
                                into :PORCEN;
                            VALOR = ((:VALOR + :AUXTRANS + :BENEFICIOS) * :PORCEN) /100;
                            end
                        else
                            begin
                            if (COMISION is null) then
                                COMISION = 0;
                            select C.NCOM_MONTO from NOMINA_COMISIONES C where C.NCOM_ANO = :ANO and C.NCOM_PERIODO = :PERIODO and C.NCOM_PERIODICIDAD = :PERIODICIDAD and C.TERC_NIT = :NITE
                                into :COMISION;
                            CONC_MONTO = :BASICO + :COMISION;
                            if (CONC_PORC <> 0 and CONC_PORC is not null) then
                                if (mensual <> 'S') then
                                    VALOR = (((:CONC_MONTO/30 * :DIASLAB )+ :CAMBSALTRANS + :INCAP) * :CONC_PORC) /100;
                                else
                                    VALOR = ((:CONC_MONTO+ :CAMBSALTRANS + :INCAP) * :CONC_PORC) /100;
                            else
                                if (:PORCEN <> 0 and :PORCEN is not null) then
                                    if (mensual <> 'S') then
                                        VALOR = (((:CONC_MONTO/30 * :DIASLAB )+ :CAMBSALTRANS + :INCAP) * :PORCEN) /100;
                                    else
                                        VALOR = ((:CONC_MONTO + :CAMBSALTRANS + :INCAP) * :PORCEN) /100;
                                else
                                    if (:MONTOS <> 0 and :MONTOS is not null) then
                                        VALOR = :MONTOS;
                                    else
                                        if (:CONC_MONTO <> 0 and :CONC_MONTO is not null) then
                                            VALOR = :CONC_MONTO;
                            end
                        ITEM = :ITEM + 1;
                        end
                    end /* aportes */
                else if (CONC_PROV = 'S') then
                    begin
                    /*provisiones */
                    HORASEX = null;
                    DIASNOV = null;
                    RETROACT = null;
                    REEMBOLSO = null;
                    BENEFICIOS = null;
                    RECARGO = null;
                    COMISION = null;
                    INCAP = null;
                    if (MENSUAL = 'S') then
                        BEGIN
                        if (PERIODICIDAD = 1) then
                            BEGIN
                            perinicial = PERIODO;
                            PERFINAL = PERIODO;
                            END
                        if (PERIODICIDAD = 2) then
                            BEGIN
                            perinicial = PERIODO - (LIQUIDAPER - 1);
                            PERFINAL = PERIODO + (2 - LIQUIDAPER);
                            END
                        if (PERIODICIDAD = 3) then
                            BEGIN
                            perinicial = PERIODO - (LIQUIDAPER - 1);
                            PERFINAL = PERIODO + (4 - LIQUIDAPER);
                            END
                        END
                    ELSE
                        BEGIN
                        perinicial = PERIODO;
                        PERFINAL = PERIODO;
                        END
                    /*HORAS EXTRA*/
                    select SUM(C.NOEX_MONTO) from NOMINA_HORASEXT C where C.NOEX_ANO = :ANO
                        and C.NOEX_PERIODIO >= :PERINICIAL and C.NOEX_PERIODIO <= :PERFINAL
                        and C.NOEX_PERIODICIDAD = :PERIODICIDAD and C.TERC_NIT = :NITE
                        into :HORASEX;
                    if (HORASEX is null) then
                        HORASEX = 0;
                    /* RECARGO*/
                    BASICO = BASICOEMP;
                    RECARGO = (((:BASICO/30)/8)*:TAR_RECNOTC)*:RECNOCT;
                    RECARGO = :RECARGO + ((((:BASICO/30)/8)*:TAR_RECFEST)*:RECFEST);
                    /*INCAPACIDAD*/
                    select SUM(ND.NNDE_DURACION) from NOMINA_NOVEDADES N, nomina_novedades_detalle ND
                        where N.nono_id = ND.nono_id AND N.TERC_NIT = :NITE
                        and ND.NNDE_PERIODO >= :perinicial and ND.NNDE_PERIODO <= :perfinal and ND.NNDE_ANO = :ANO
                        and (N.TNOV_COD = 2 or (N.TNOV_COD = 3)) into :DIASNOV;
                    if (:DIASNOV is null) then
                        INCAP = 0;
                    else
                        INCAP = (:BASICO / 30)* :DIASNOV;
                    /* BASICO*/
                    if (mensual <> 'S') then
                        BASICO = ((:BASICO/30)*:DIASLAB);
                    if (SALINTEG = 'S') then
                        BASICO = BASICO * (tar_salinteg / 100);
                    /*BENEFICIOS*/
                    if (PARAMBENEF = 'SI') then
                        begin
                        select sum(CE.EMCO_MONTO)
                            from EMPLEADO_CONCEPTOS CE, CONCEPTOS_NOMINA CN where CN.CONC_BENEFIC = 'S'
                            and (CE.TERC_NIT = :NITE) and (CE.CONC_COD = CN.CONC_COD) and
                            ((CE.EMCO_FECINI <= :FEC and CE.EMCO_FECFIN >= :FEC) or ((CN.CONC_TODOSPER = 'N')
                            and (CE.EMCO_PPAGO = :PERIODO)) or (CN.CONC_TODOSPER = 'S'))
                            into :BENEFICIOS;
                        if (BENEFICIOS is null) then
                            BENEFICIOS = 0;
                        end
                    else
                        BENEFICIOS = 0;
                    if ((CONC_COD <> 929) and (CONC_COD <> 930) and (CONC_COD <> 944)) then
                        begin
                        /* si no es vacaciones */
                        select P.PAAN_AUXTR, P.PAAN_SALMINIMO from PARAMETROS_ANO P where P.PAAN_ANO = :ANO
                            into :AUXTRANS, :SMLV;
                        if (:BASICO < (:SMLV*2)) then
                            begin
                            if (mensual <> 'S') then
                                AUXTRANS = (:AUXTRANS / 30) * :DIASLAB;
                            end
                        else
                            AUXTRANS = 0;
                        end
                    else
                        AUXTRANS = 0;
                    CONC_MONTO = :BASICO;
                    if (CONC_PORC <> 0 and CONC_PORC is not null) then
                        VALOR = ((:CONC_MONTO + :CAMBSALTRANS + :INCAP + :RECARGO + :HORASEX + :AUXTRANS + :BENEFICIOS) * :CONC_PORC) /100;
                    else
                        if (PORCEN <> 0 and PORCEN is not null) then
                            VALOR = ((:CONC_MONTO + :CAMBSALTRANS + :INCAP + :RECARGO + :HORASEX + :AUXTRANS + :BENEFICIOS) * :PORCEN) /100;
                        else
                            if (MONTOS <> 0 and MONTOS is not null) then
                                VALOR = :MONTOS;
                            else
                                if (CONC_MONTO <> 0 and CONC_MONTO is not null) then
                                    VALOR = :CONC_MONTO;
                    ITEM = :ITEM + 1;
                    end /* provision */
                else if (CONC_COD = 920) then /* comisiones */
                    begin
                    select C.NCOM_MONTO from NOMINA_COMISIONES C where C.NCOM_ANO = :ANO
                    and C.NCOM_PERIODO >= :perinicial and C.NCOM_PERIODO <= :perfinal and C.NCOM_PERIODICIDAD = :PERIODICIDAD and C.TERC_NIT = :NITE into :VALOR;
                    if (VALOR is null) then
                        VALOR = 0;
                    ITEM = :ITEM + 1;
                    end
                else if (CONC_COD = 900 or (:CONC_COD = 931)) then /* horas extra */
                    begin
                    select SUM(C.NOEX_MONTO) from NOMINA_HORASEXT C where C.NOEX_ANO = :ANO and
                        C.NOEX_PERIODIO >= :perinicial and C.NOEX_PERIODIO <= :perfinal and C.NOEX_PERIODICIDAD = :PERIODICIDAD and C.TERC_NIT = :NITE into :VALOR;
                    if (VALOR is null) then
                        VALOR = 0;
                    ITEM = :ITEM + 1;
                    end
                else if (CONC_COD = 954) then /* cartera */
                    begin
                    select C.NCAR_MONTO from NOMINA_CARTERA C where C.NCAR_ANO = :ANO
                    and C.NCAR_PERIODO >= :perinicial and C.NCAR_PERIODO <= :perfinal and C.NCAR_PERIODICIDAD = :PERIODICIDAD and C.TERC_NIT = :NITE into :VALOR;
                    if (VALOR is null) then
                        VALOR = 0;
                    ITEM = :ITEM + 1;
                    end
                else if (CONC_COD = 932) then
                    begin
                    /* incapacidad */
                    select SUM(ND.NNDE_DURACION) from NOMINA_NOVEDADES N, nomina_novedades_detalle ND
                        where N.nono_id = ND.nono_id AND N.TERC_NIT = :NITE
                        and ND.NNDE_PERIODO >= :perinicial and ND.NNDE_PERIODO <= :perfinal and ND.NNDE_ANO = :ANO
                        and (N.TNOV_COD = 2 or (N.TNOV_COD = 3)) into :DIASNOV;
                    if (:DIASNOV is null) then
                        VALOR = 0;
                    else
                        VALOR = (:BASICO / 30)* :DIASNOV;
                    end
                else if (CONC_COD = 921) then
                    begin
                    if (PORCEN is not null and PORCEN <> 0) then
                        VALOR = ((BASICO / 30)* :DIASLAB ) * :PORCEN /100;
                    else
                        if (CONC_PORC is not null and CONC_PORC <> 0) then
                            VALOR = ((BASICO / 30)* :DIASLAB ) * :CONC_PORC /100;
                    end
                else if (CONC_COD = 953) then
                    begin
                    /* RECARGO */
                    BASICO = BASICOEMP;
                    VALOR = (((:BASICO/30)/8)*:TAR_RECNOTC)*:RECNOCT;
                    VALOR = :VALOR + ((((:BASICO/30)/8)*:TAR_RECFEST)*:RECFEST);
                    end
                if (CONC_APORTE = 'S') then
                    begin
                    if (ENTIDAD is null or (ENTIDAD = '') ) then
                        ENTIDAD = :CONC_ENTIDAD;
                    end
                end
            if ((VALOR <> 0) and (VALOR is not null)) then
                begin
                execute procedure REDONDEE(:VALOR, :APROX) returning_values (VALOR);
                if ((MENSUAL = 'N') or (PERIODICIDAD = 1))  then
                    insert into NOMINA_CONCEPTOS (NOMI_ID, NOCO_ITEM, CONC_COD,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, NOCO_GTOEMPR)
                        values (:IDNOMINA,:ITEM, :CONCEPT, :NIT_TERCERO, :VALOR, :ENTIDAD, :CONC_DEDUC, :CONC_PROV, :CONC_APORTE, :PERIODO, :ANO, :CONC_MODIFI, :CONC_APLICAPROM, :SALARIO, :GTOEMPR);
                else
                    if (MENSUAL = 'S') then
                        begin
                        if ((:PERIODICIDAD = 2) and (LIQUIDAPER = 1)) then
                            begin
                            if ((PERIODO = 1) or (PERIODO = 3) or (PERIODO = 5) or (PERIODO = 7) or (PERIODO = 9) or (PERIODO = 11)
                                or (PERIODO = 13) or (PERIODO = 15) or (PERIODO = 17) or (PERIODO = 19) or (PERIODO = 21) or (PERIODO = 23)) then
                                insert into NOMINA_CONCEPTOS (NOMI_ID, NOCO_ITEM, CONC_COD,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, NOCO_GTOEMPR)
                                    values (:IDNOMINA,:ITEM, :CONCEPT, :NIT_TERCERO, :VALOR, :ENTIDAD, :CONC_DEDUC, :CONC_PROV, :CONC_APORTE, :PERIODO, :ANO, :CONC_MODIFI, :CONC_APLICAPROM, :SALARIO, :GTOEMPR);
                            end
                        else if ((:PERIODICIDAD = 2) and (LIQUIDAPER = 2)) then
                            begin
                            if ((PERIODO = 2) or (PERIODO = 4) or (PERIODO = 6) or (PERIODO = 8) or (PERIODO = 10) or (PERIODO = 12)
                                or (PERIODO = 14) or (PERIODO = 16) or (PERIODO = 18) or (PERIODO = 20) or (PERIODO = 22) or (PERIODO = 24)) then
                                insert into NOMINA_CONCEPTOS (NOMI_ID, NOCO_ITEM, CONC_COD,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, NOCO_GTOEMPR)
                                    values (:IDNOMINA,:ITEM, :CONCEPT, :NIT_TERCERO, :VALOR, :ENTIDAD, :CONC_DEDUC, :CONC_PROV, :CONC_APORTE, :PERIODO, :ANO, :CONC_MODIFI, :CONC_APLICAPROM, :SALARIO, :GTOEMPR);
                            end
                        else if ((:PERIODICIDAD = 3) and (LIQUIDAPER = 1)) then
                            begin
                            if ((PERIODO = 1) or (PERIODO = 5) or (PERIODO = 9) or (PERIODO = 13) or (PERIODO = 17) or (PERIODO = 21)
                                or (PERIODO = 25) or (PERIODO = 29) or (PERIODO = 33) or (PERIODO = 37) or (PERIODO = 41) or (PERIODO = 45)
                                or (PERIODO = 49)) then
                                insert into NOMINA_CONCEPTOS (NOMI_ID, NOCO_ITEM, CONC_COD,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, NOCO_GTOEMPR)
                                    values (:IDNOMINA,:ITEM, :CONCEPT, :NIT_TERCERO, :VALOR, :ENTIDAD, :CONC_DEDUC, :CONC_PROV, :CONC_APORTE, :PERIODO, :ANO, :CONC_MODIFI, :CONC_APLICAPROM, :SALARIO, :GTOEMPR);
                            end
                        else if ((:PERIODICIDAD = 3) and (LIQUIDAPER = 2)) then
                            begin
                            if ((PERIODO = 2) or (PERIODO = 6) or (PERIODO = 10) or (PERIODO = 14) or (PERIODO = 18) or (PERIODO = 22)
                                or (PERIODO = 26) or (PERIODO = 30) or (PERIODO = 34) or (PERIODO = 38) or (PERIODO = 42) or (PERIODO = 46)
                                or (PERIODO = 50)) then
                                insert into NOMINA_CONCEPTOS (NOMI_ID, NOCO_ITEM, CONC_COD,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, NOCO_GTOEMPR)
                                    values (:IDNOMINA,:ITEM, :CONCEPT, :NIT_TERCERO, :VALOR, :ENTIDAD, :CONC_DEDUC, :CONC_PROV, :CONC_APORTE, :PERIODO, :ANO, :CONC_MODIFI, :CONC_APLICAPROM, :SALARIO, :GTOEMPR);
                            end
                        else if ((:PERIODICIDAD = 3) and (LIQUIDAPER = 3)) then
                            begin
                            if ((PERIODO = 3) or (PERIODO = 7) or (PERIODO = 11) or (PERIODO = 15) or (PERIODO = 19) or (PERIODO = 23)
                                or (PERIODO = 27) or (PERIODO = 31) or (PERIODO = 35) or (PERIODO = 39) or (PERIODO = 43) or (PERIODO = 47)
                                or (PERIODO = 51)) then
                                insert into NOMINA_CONCEPTOS (NOMI_ID, NOCO_ITEM, CONC_COD,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, NOCO_GTOEMPR)
                                    values (:IDNOMINA,:ITEM, :CONCEPT, :NIT_TERCERO, :VALOR, :ENTIDAD, :CONC_DEDUC, :CONC_PROV, :CONC_APORTE, :PERIODO, :ANO, :CONC_MODIFI, :CONC_APLICAPROM, :SALARIO, :GTOEMPR);
                            end
                        else if ((:PERIODICIDAD = 3) and (LIQUIDAPER = 4)) then
                            begin
                            if ((PERIODO = 4) or (PERIODO = 8) or (PERIODO = 12) or (PERIODO = 16) or (PERIODO = 20) or (PERIODO = 24)
                                or (PERIODO = 29) or (PERIODO = 32) or (PERIODO = 36) or (PERIODO = 40) or (PERIODO = 44) or (PERIODO = 48)
                                or (PERIODO = 52)) then
                                insert into NOMINA_CONCEPTOS (NOMI_ID, NOCO_ITEM, CONC_COD,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, NOCO_GTOEMPR)
                                    values (:IDNOMINA,:ITEM, :CONCEPT, :NIT_TERCERO, :VALOR, :ENTIDAD, :CONC_DEDUC, :CONC_PROV, :CONC_APORTE, :PERIODO, :ANO, :CONC_MODIFI, :CONC_APLICAPROM, :SALARIO, :GTOEMPR);
                            end
                        end
                    VALOR = 0;
                    BASICO = 0;
                    end
            end /* for */
        end
    end
suspend;
end
^

SET TERM ; ^


/* 20100826B */
/* CUENTAS DE EPS, AFP, CCF, ARP DE LA ADMINISTRADORA EN LUGAR LA CTACONTA DEPENDIENDO DEL CONCEPTO */

SET TERM ^ ;

CREATE OR ALTER procedure CONTABIL_NOMINA (
    IDDOC integer)
returns (
    ERROR integer,
    IDC integer)
AS
declare variable itemdet integer;
declare variable idcontabil integer;
declare variable aporte char(1);
declare variable entidad varchar(20);
declare variable valor numeric(18,2);
declare variable ctagast varchar(20);
declare variable ctaxp varchar(20);
declare variable tercnit varchar(20);
declare variable fecaux date;
declare variable fecha char(8);
declare variable ano char(4);
declare variable periodicidad integer;
declare variable periodo integer;
declare variable numero varchar(6);
declare variable tipocom char(3);
declare variable prefcom varchar(4);
declare variable concepto varchar(60);
declare variable numerocom varchar(6);
declare variable proyecto varchar(4) character set none;
declare variable centro varchar(4) character set none;
declare variable codconc integer;
declare variable base numeric(18,2);
declare variable basico numeric(18,2);
declare variable comision numeric(18,2);
declare variable retroact numeric(18,2);
declare variable det char(1);
declare variable ctaadmin char(1);
BEGIN
SELECT N.nomi_feccausa, N.nomi_ano, N.nomi_periodocidad, N.nomi_periodo FROM NOMINA N WHERE N.nomi_id = :iddoc INTO :fecaux, :ano, :periodicidad, :periodo;
NUMERO = :periodicidad || :periodo;
SELECT I.tico_cod, I.prco_pre, I.inno_det, I.inno_dtlleadmin FROM INTERFAZ_NOMINA I WHERE I.tido_cod = 92 INTO :tipocom, :prefcom,:det,:ctaadmin;
concepto = 'CAUSACION NOMINA AÑO ' || :ano || ' PERIODO ' || :periodo || ' PERIODICIDAD ' ||:periodicidad;
EXECUTE PROCEDURE completa_ceros(:numero)RETURNING_VALUES :numero;
SELECT P.pref_numero FROM PREFIJOS_CONTA P WHERE P.tico_cod = :tipocom AND P.prco_pref = :prefcom INTO :numerocom;
idcontabil = GEN_ID(ID_CONTABILIZA,1);
EXECUTE PROCEDURE FECHA_A_CONTA(:FECAUX) RETURNING_VALUES (:FECHA);
/* BORRE CUALQUIER OTRA ANTERIOR */
DELETE FROM CONTABILIZACION WHERE CNTB_IDREF = :iddoc AND CNTB_TIPOREF = 92;

INSERT INTO CONTABILIZACION (CNTB_ID, CNTB_TIPOREF, CNTB_IDREF, CNTB_PREFREF, CNTB_NUMREF, CNTB_FECHA, CNTB_TIPOCOMP, CNTB_PREFCNT, CNTB_CONCEPTO, CNTB_NUMERO, CNTB_PROCESADO)
    VALUES (:idcontabil, 92,:iddoc, :ano, :numero, :fecha, :tipocom, :prefcom, :concepto, :numerocom, 'N');
idc = :idcontabil;
itemdet = 0;
IF (DET = 'N') THEN
    BEGIN
    FOR SELECT max(NC.conc_cod),sum(NC.NOCO_VALORCONT), max(CN.conc_ctagast), max(NC.terc_nit), max(NC.noco_aporte), max(NC.noco_entidad)
        FROM NOMINA_CONCEPTOS NC, CONCEPTOS_NOMINA CN WHERE NC.conc_cod = CN.conc_cod AND NC.nomi_id = :iddoc and cn.conc_ctagast is not null and cn.conc_ctacxp is not null
        group by cn.conc_ctagast,nc.terc_nit
        INTO :codconc,:valor, :ctagast, :tercnit, :aporte, :entidad
        DO
        BEGIN
        SELECT E.proy_cod,E.cent_cod FROM EMPLEADOS E WHERE E.terc_nit = :tercnit INTO :proyecto, :centro;
        if (:proyecto IS NULL) then
            SELECT D.dpto_proy, D.dpto_centro FROM EMPLEADOS E, departamento D WHERE E.terc_nit = :tercnit AND E.empl_dpto = D.dpto_cod INTO :proyecto, :centro;
        base = null;
        IF (ctagast IS NULL) THEN
            BEGIN
            EXECUTE PROCEDURE ERROR (14, :IDDOC, :ctagast, 2);
            ERROR = ERROR + 1;
            END
        IF (ctaxp IS NULL) THEN
            BEGIN
            EXECUTE PROCEDURE ERROR (14, :IDDOC, :ctaxp, 2);
            ERROR = ERROR + 1;
            END
        IF (VALOR IS NULL) THEN
            VALOR = 0;
        IF (VALOR <> 0) THEN
            BEGIN
            IF (valor < 0) THEN
                valor = :valor * (-1);
            IF (codconc = 6) THEN
                BEGIN
                SELECT E.empl_salario FROM EMPLEADOS E WHERE E.terc_nit = :tercnit INTO :basico;
                SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :tercnit INTO :comision;
                IF (comision IS NULL) THEN
                    comision = 0;
                SELECT C.emco_monto FROM EMPLEADO_CONCEPTOS C WHERE C.terc_nit = :tercnit AND C.conc_cod = 933 INTO :retroact;
                IF (retroact IS NULL ) THEN
                    retroact = 0;
                base = :basico + :comision + :retroact;
                END
            IF (aporte = 'N') THEN
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_TERC, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_CONC, CNDE_PROY, cnde_centro,CNDE_BASE)
                             VALUES (:idcontabil, :itemdet, :ctagast, :tercnit, :valor, 0, :concepto, :proyecto, :centro,:base);
                itemdet = itemdet + 1;
                /*SELECT D.dpto_proy, D.dpto_centro FROM EMPLEADOS E, departamento D WHERE E.terc_nit = :tercnit AND E.empl_dpto = D.dpto_cod INTO :proyecto, :centro;
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_TERC, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_CONC, CNDE_PROY, cnde_centro,CNDE_BASE)
                             VALUES (:idcontabil, :itemdet, :ctaxp, :tercnit, 0,:valor, :concepto, :proyecto, :centro,:base);
                itemdet = itemdet + 1;            */
                END
            ELSE
                IF (aporte = 'S') THEN
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_TERC, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_CONC, CNDE_PROY, cnde_centro,CNDE_BASE)
                        VALUES (:idcontabil, :itemdet, :ctagast, :entidad, :valor, 0, :concepto, :proyecto, :centro,:base);
                    itemdet = itemdet + 1;
                    /*SELECT D.dpto_proy, D.dpto_centro FROM EMPLEADOS E, departamento D WHERE E.terc_nit = :tercnit AND E.empl_dpto = D.dpto_cod INTO :proyecto, :centro;
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_TERC, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_CONC, CNDE_PROY, cnde_centro,CNDE_BASE)
                        VALUES (:idcontabil, :itemdet, :ctaxp, :entidad, 0,:valor, :concepto, :proyecto, :centro,:base);
                    itemdet = itemdet + 1;                */
                    END
            END
        END
    SUSPEND;
    FOR SELECT max(NC.conc_cod),sum(NC.NOCO_VALORCONT), max(CN.conc_ctacxp), max(NC.terc_nit), max(NC.noco_aporte), max(NC.noco_entidad)
        FROM NOMINA_CONCEPTOS NC, CONCEPTOS_NOMINA CN WHERE NC.conc_cod = CN.conc_cod AND NC.nomi_id = :iddoc and cn.conc_ctagast is not null and cn.conc_ctacxp is not null
        group by cn.conc_ctacxp,nc.noco_nitcont
        INTO :codconc,:valor, :ctaxp, :tercnit, :aporte, :entidad
        DO
        BEGIN
        base = null;
        IF (ctagast IS NULL) THEN
            BEGIN
            EXECUTE PROCEDURE ERROR (14, :IDDOC, :ctagast, 2);
            ERROR = ERROR + 1;
            END
        IF (ctaxp IS NULL) THEN
            BEGIN
            EXECUTE PROCEDURE ERROR (14, :IDDOC, :ctaxp, 2);
            ERROR = ERROR + 1;
            END
        IF (VALOR IS NULL) THEN
            VALOR = 0;
        IF (VALOR <> 0) THEN
            BEGIN
            IF (valor < 0) THEN
                valor = :valor * (-1);
            IF (codconc = 6) THEN
                BEGIN
                SELECT E.empl_salario FROM EMPLEADOS E WHERE E.terc_nit = :tercnit INTO :basico;
                SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :tercnit INTO :comision;
                IF (comision IS NULL) THEN
                    comision = 0;
                SELECT C.emco_monto FROM EMPLEADO_CONCEPTOS C WHERE C.terc_nit = :tercnit AND C.conc_cod = 933 INTO :retroact;
                IF (retroact IS NULL ) THEN
                    retroact = 0;
                base = :basico + :comision + :retroact;
                END
            if ((codconc > 900) and (entidad is not null) AND (ctaadmin = 'S')) then
                begin
                SELECT A.admi_ctaconta FROM ADMINISTRADORA A WHERE A.terc_nit = :entidad INTO :ctaxp;
                if ((ctaxp is null) or (ctaxp = '')) then
                    begin
                    if ((codconc = 905) OR (codconc = 906) or (codconc = 904) ) then
                        SELECT A.admi_ctaafp FROM ADMINISTRADORA A WHERE A.terc_nit = :entidad INTO :ctaxp;
                    ELSE if ((codconc = 914) OR (codconc = 915) or (codconc = 907) ) then
                        SELECT A.admi_ctaeps FROM ADMINISTRADORA A WHERE A.terc_nit = :entidad INTO :ctaxp;
                    ELSE if ((codconc = 912) OR (codconc = 913)) then
                        SELECT A.admi_ctaafc FROM ADMINISTRADORA A WHERE A.terc_nit = :entidad INTO :ctaxp;
                    ELSE if ((codconc = 910) OR (codconc = 911)) then
                        SELECT A.admi_ctaccf FROM ADMINISTRADORA A WHERE A.terc_nit = :entidad INTO :ctaxp;
                    ELSE if ((codconc = 908) OR (codconc = 909)) then
                        SELECT A.admi_ctaarp FROM ADMINISTRADORA A WHERE A.terc_nit = :entidad INTO :ctaxp;
                    end
                end
            IF (aporte = 'N') THEN
                BEGIN
                /*SELECT D.dpto_proy, D.dpto_centro FROM EMPLEADOS E, departamento D WHERE E.terc_nit = :tercnit AND E.empl_dpto = D.dpto_cod INTO :proyecto, :centro;
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_TERC, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_CONC, CNDE_PROY, cnde_centro,CNDE_BASE)
                             VALUES (:idcontabil, :itemdet, :ctagast, :tercnit, :valor, 0, :concepto, :proyecto, :centro,:base);
                itemdet = itemdet + 1;
                */
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_TERC, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_CONC, CNDE_PROY, cnde_centro,CNDE_BASE)
                             VALUES (:idcontabil, :itemdet, :ctaxp, :tercnit, 0,:valor, :concepto, :proyecto, :centro,:base);
                itemdet = itemdet + 1;
                END
            ELSE
                IF (aporte = 'S') THEN
                    BEGIN
                    /*SELECT D.dpto_proy, D.dpto_centro FROM EMPLEADOS E, departamento D WHERE E.terc_nit = :tercnit AND E.empl_dpto = D.dpto_cod INTO :proyecto, :centro;
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_TERC, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_CONC, CNDE_PROY, cnde_centro,CNDE_BASE)
                        VALUES (:idcontabil, :itemdet, :ctagast, :tercnit, :valor, 0, :concepto, :proyecto, :centro,:base);
                    itemdet = itemdet + 1;                */
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_TERC, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_CONC, CNDE_PROY, cnde_centro,CNDE_BASE)
                        VALUES (:idcontabil, :itemdet, :ctaxp, :tercnit, 0,:valor, :concepto, :proyecto, :centro,:base);
                    itemdet = itemdet + 1;
                    END
            END
        END
    SUSPEND;
    END
ELSE
    BEGIN
    FOR SELECT NC.conc_cod,NC.NOCO_VALORCONT, CN.conc_ctagast, CN.conc_ctacxp, NC.terc_nit, NC.noco_aporte, NC.noco_entidad
        FROM NOMINA_CONCEPTOS NC, CONCEPTOS_NOMINA CN WHERE NC.conc_cod = CN.conc_cod AND NC.nomi_id = :iddoc
        INTO :codconc,:valor, :ctagast, :ctaxp, :tercnit, :aporte, :entidad
        DO
        BEGIN
        base = null;
        SELECT E.proy_cod,E.cent_cod FROM EMPLEADOS E WHERE E.terc_nit = :tercnit INTO :proyecto, :centro;
        if (:proyecto IS NULL) then
            SELECT D.dpto_proy, D.dpto_centro FROM EMPLEADOS E, departamento D WHERE E.terc_nit = :tercnit AND E.empl_dpto = D.dpto_cod INTO :proyecto, :centro;
        IF (ctagast IS NULL) THEN
            BEGIN
            EXECUTE PROCEDURE ERROR (14, :IDDOC, :ctagast, 2);
            ERROR = ERROR + 1;
            END
        IF (ctaxp IS NULL) THEN
            BEGIN
            EXECUTE PROCEDURE ERROR (14, :IDDOC, :ctaxp, 2);
            ERROR = ERROR + 1;
            END
        IF (VALOR IS NULL) THEN
            VALOR = 0;
        IF (VALOR <> 0) THEN
            BEGIN
            IF (valor < 0) THEN
                valor = :valor * (-1);
            IF (codconc = 6) THEN
                BEGIN
                SELECT E.empl_salario FROM EMPLEADOS E WHERE E.terc_nit = :tercnit INTO :basico;
                SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :tercnit INTO :comision;
                IF (comision IS NULL) THEN
                    comision = 0;
                SELECT C.emco_monto FROM EMPLEADO_CONCEPTOS C WHERE C.terc_nit = :tercnit AND C.conc_cod = 933 INTO :retroact;
                IF (retroact IS NULL ) THEN
                    retroact = 0;
                base = :basico + :comision + :retroact;
                END     
            if ((codconc > 900) and (entidad is not null) AND (ctaadmin = 'S')) then
                begin
                if ((codconc = 905) OR (codconc = 906) or (codconc = 904) ) then
                    SELECT A.admi_ctaafp FROM ADMINISTRADORA A WHERE A.terc_nit = :entidad INTO :ctaxp;
                ELSE if ((codconc = 914) OR (codconc = 915) or (codconc = 907) ) then
                    SELECT A.admi_ctaeps FROM ADMINISTRADORA A WHERE A.terc_nit = :entidad INTO :ctaxp;
                ELSE
                    SELECT A.admi_ctaconta FROM ADMINISTRADORA A WHERE A.terc_nit = :entidad INTO :ctaxp;
                end
            IF (aporte = 'N') THEN
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_TERC, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_CONC, CNDE_PROY, cnde_centro,CNDE_BASE)
                    VALUES (:idcontabil, :itemdet, :ctagast, :tercnit, :valor, 0, :concepto, :proyecto, :centro,:base);
                itemdet = itemdet + 1;
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_TERC, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_CONC, CNDE_PROY, cnde_centro,CNDE_BASE)
                             VALUES (:idcontabil, :itemdet, :ctaxp, :tercnit, 0,:valor, :concepto, :proyecto, :centro,:base);
                itemdet = itemdet + 1;
                END
            ELSE
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_TERC, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_CONC, CNDE_PROY, cnde_centro,CNDE_BASE)
                    VALUES (:idcontabil, :itemdet, :ctagast, :tercnit, :valor, 0, :concepto, :proyecto, :centro,:base);
                itemdet = itemdet + 1;
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_TERC, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_CONC, CNDE_PROY, cnde_centro,CNDE_BASE)
                         VALUES (:idcontabil, :itemdet, :ctaxp, :entidad, 0,:valor, :concepto, :proyecto, :centro,:base);
                itemdet = itemdet + 1;
                END
            END
        END
    SUSPEND;
    END
END
^

SET TERM ; ^

/* 20100828 */
/* COPIA DE CORREOS ENVIADOS POR NOMINA */
INSERT INTO CONFIGURACION (CONF_MODULO, CONF_CATEGORIA, CONF_PROPIEDAD, CONF_VALOR, CONF_POSIBLES, CONF_AYUDA) VALUES ('NOMINA', 'GENERAL', 'DIRECCION DE CORREO ELECTRONICO PARA COPIAS DE ENVIO DE COMPROBANTES NOMINA', '', '', 'Indique la dirección de correo electrónico que recibirá una copia como soporte de cada envío de comprobantes de nómina o certificados hechos con SYSplus');
commit work;

/* CAMBIE CENTROS AL CAMBIAR DEPTO */
SET TERM ^ ;

CREATE OR ALTER TRIGGER EMPLEADOS_BI FOR EMPLEADOS
ACTIVE BEFORE INSERT POSITION 0
as
declare variable PROY VARCHAR(4);
declare variable CENT VARCHAR(4);
begin
if (NEW.stco_cod IS NULL) then
    NEW.stco_cod = 0;
if (NEW.empl_fecing IS NULL) then
    NEW.empl_fecing = CAST('now' AS DATE);
if ((NEW.empl_dpto IS NOT NULL) AND ((NEW.proy_cod IS NULL) or (NEW.cent_cod IS NULL)))  then
    BEGIN
    SELECT DPTO_PROY, DPTO_CENTRO FROM DEPARTAMENTO WHERE DPTO_COD = NEW.empl_dpto INTO :proy, :cent;
    if ((PROY <> '') AND (CENT <> '')) then
        BEGIN
        NEW.proy_cod = :PROY;
        NEW.cent_cod = :cent;
        END
    END
end
^

SET TERM ; ^

SET TERM ^ ;

create trigger EMPLEADOS_BU for EMPLEADOS
active BEFORE UPDATE position 0
as
declare variable PROY VARCHAR(4);
declare variable CENT VARCHAR(4);
begin
if (NEW.empl_dpto <> OLD.empl_dpto) then
    BEGIN
    SELECT DPTO_PROY, DPTO_CENTRO FROM DEPARTAMENTO WHERE DPTO_COD = NEW.empl_dpto INTO :proy, :cent;
    if ((PROY <> '') AND (CENT <> '')) then
        BEGIN
        NEW.proy_cod = :PROY;
        NEW.cent_cod = :cent;
        END
    END
end
^

SET TERM ; ^


/* CERTIFICACION LABORAL VACIA */
SET TERM ^ ;

CREATE OR ALTER procedure CERTIFICA_LABORAL (
    FEC date,
    NITEMPL varchar(20))
returns (
    NOMEMPL varchar(60),
    FECING date,
    SALARIO numeric(18,2),
    SALARIOLET varchar(60),
    NOMTIPOCONT varchar(60),
    FECHAEXPED date,
    CARGOEMPL varchar(60))
AS
declare variable TIPCONT CHAR(1);
begin
SELECT E.empl_fecing, E.empl_cargo, T.terc_nom, E.empl_tipocont
    FROM EMPLEADOS E, TERCEROS T
    WHERE T.terc_nit = E.terc_nit AND E.terc_nit = :nitempl
    INTO :fecing,:cargoempl, :nomempl, :tipcont;
select first 1 m.mvse_salario from movimiento_salario_empleado m where m.terc_nit = :nitempl and m.mvse_fecha <= :fec
    order by m.mvse_fecha desc into :salario;
if (tipcont = 'I') then
    nomtipocont = 'a término indefinido';
else
    if (tipcont = 'D') then
        nomtipocont = 'a término fijo';
    fechaexped = :fec;
suspend;
end
^

SET TERM ; ^


INSERT INTO CONFIGURACION (CONF_MODULO, CONF_CATEGORIA, CONF_PROPIEDAD, CONF_VALOR, CONF_POSIBLES, CONF_AYUDA) VALUES ('NOMINA', 'GENERAL', 'NOMBRE FIRMA CERTIFICADOS LABORALES', '', '', 'Indique el nombre de la persona que firma las certificaciones laborales');
INSERT INTO CONFIGURACION (CONF_MODULO, CONF_CATEGORIA, CONF_PROPIEDAD, CONF_VALOR, CONF_POSIBLES, CONF_AYUDA) VALUES ('NOMINA', 'GENERAL', 'CARGO FIRMA CERTIFICADOS LABORALES', 'Departamento de Talento Humano', '', 'Indique el cargo del funcionario que firma las certficaciones laborales');
commit work;

SET TERM ^ ;

CREATE OR ALTER procedure CERTIFICA_LABORAL (
    FEC date,
    NITEMPL varchar(20))
returns (
    NOMEMPL varchar(60),
    FECING date,
    SALARIO numeric(18,2),
    SALARIOLET varchar(60),
    NOMTIPOCONT varchar(60),
    FECHAEXPED date,
    CARGOEMPL varchar(60),
    FIRMA VARCHAR(100),
    CARGOFIRMA VARCHAR(100))
AS
declare variable TIPCONT CHAR(1);
begin
SELECT E.empl_fecing, E.empl_cargo, T.terc_nom, E.empl_tipocont
    FROM EMPLEADOS E, TERCEROS T
    WHERE T.terc_nit = E.terc_nit AND E.terc_nit = :nitempl
    INTO :fecing,:cargoempl, :nomempl, :tipcont;
select first 1 m.mvse_salario from movimiento_salario_empleado m where m.terc_nit = :nitempl and m.mvse_fecha <= :fec
    order by m.mvse_fecha desc into :salario;
if (tipcont = 'D') then
    nomtipocont = 'a término fijo';
else
    if (tipcont = 'O') then
        nomtipocont = 'por obra y labor';
    else
        nomtipocont = 'a término indefinido';

fechaexped = :fec;

EXECUTE PROCEDURE lee_configuracion ('NOMINA', 'GENERAL', 'NOMBRE FIRMA CERTIFICADOS LABORALES') returning_values (FIRMA);
EXECUTE PROCEDURE lee_configuracion ('NOMINA', 'GENERAL', 'CARGO FIRMA CERTIFICADOS LABORALES') returning_values (:cargofirma);
suspend;
end
^

SET TERM ; ^

UPDATE CONFIGURACION
SET CONF_PROPIEDAD = 'PERIODICIDAD DE PAGO PREDETERMINADA', CONF_POSIBLES = 'MENSUAL,QUINCENAL,SEMANAL'
WHERE (CONF_MODULO = 'NOMINA') AND (CONF_CATEGORIA = 'GENERAL') AND (CONF_PROPIEDAD = 'PERIODICIDAD DE PAGO PARA VER NOVEDADES POR PERIODO');
COMMIT WORK;

/* MARCAR LOS APORTES QUE SE REPORTAN AL OPERADOR DE INFORMACION */

ALTER TABLE CONCEPTOS_NOMINA
ADD CONC_REPOI T_BOOLEANO;

UPDATE CONCEPTOS_NOMINA SET CONC_REPOI = 'S';
COMMIT WORK;


SET TERM ^ ;

CREATE OR ALTER procedure LIQUIDACION_APORTES (
    ID_NOMINA_1 integer,
    ID_NOMINA_2 integer,
    ID_NOMINA_3 integer,
    ID_NOMINA_4 integer,
    ID_NOMINA_5 integer,
    ID_NOMINA_6 integer,
    ID_NOMINA_7 integer,
    INTMORA numeric(18,2),
    FECHA date,
    FORMULARIO varchar(10),
    SOLOSS CHAR(1))
returns (
    IDAPORTE integer)
AS
declare variable itemaportadmi integer;
declare variable itemdetaport integer;
declare variable nit varchar(20);
declare variable eps char(1);
declare variable afp char(1);
declare variable ccf char(1);
declare variable afc char(1);
declare variable arp char(1);
declare variable nombreadmin varchar(60);
declare variable totadmin numeric(18,2);
declare variable totadminneg numeric(18,2);
declare variable totadminarp numeric(18,2);
declare variable totadminnegarp numeric(18,2);
declare variable tipoaport char(1);
declare variable ano char(4);
declare variable nitempl varchar(20);
declare variable totdetvalor numeric(18,2);
declare variable totdetvalorneg numeric(18,2);
declare variable totibc integer;
begin
itemaportadmi = 1;
itemdetaport = 1;
ANO = SUBSTR(fecha, 1, 4);
idaporte = gen_id(id_pgaport,1);
select PAAN_TIPOAPORT from parametros_ano where PAAN_ANO = :ANO into :tipoaport;
for select A.TERC_NIT, A.ADMI_EPS, A.ADMI_AFP, A.ADMI_CCF, A.ADMI_AFC, A.ADMI_ARP, T.TERC_NOM from ADMINISTRADORA A, TERCEROS t
  where T.TERC_NIT = A.TERC_NIT and t.terc_admini = 'S' Into :nit, :eps, :afp, :CCF, :afc, :arp, :nombreadmin
  do
  begin
  select sum (noco_valor) from nomina_conceptos N, conceptos_nomina C
      where (N.noco_aporte = 'S' and N.noco_entidad = :nit AND N.conc_cod = C.conc_cod AND ((C.conc_repoi = 'S') or (:SOLOSS = 'N'))
      and (nomi_id = :id_nomina_1 or (nomi_id = :id_nomina_2) or (nomi_id = :id_nomina_3) or (nomi_id = :id_nomina_4) or (nomi_id = :id_nomina_5) or (nomi_id = :id_nomina_6) or (nomi_id = :id_nomina_7)) AND N.noco_valor > 0)
      into :totadmin;
  if (totadmin is null) then
      totadmin = 0;
  select sum (noco_valor*(-1)) from nomina_conceptos N, conceptos_nomina C
      where (N.noco_aporte = 'S' and N.noco_entidad = :nit AND N.conc_cod = C.conc_cod AND ((C.conc_repoi = 'S') or (:SOLOSS = 'N'))
      and (nomi_id = :id_nomina_1 or (nomi_id = :id_nomina_2) or (nomi_id = :id_nomina_3) or (nomi_id = :id_nomina_4) or (nomi_id = :id_nomina_5) or (nomi_id = :id_nomina_6) or (nomi_id = :id_nomina_7)) AND N.noco_valor < 0)
      into :totadminneg;
  if (totadminneg is null) then
      totadminneg = 0;
  totadmin = :totadminneg + :totadmin;
  if (arp = 'S') then
    BEGIN
    select sum (noco_valor) from nomina_conceptos N, conceptos_nomina C
        where (N.noco_aporte = 'S' and N.noco_entidad = :nit AND N.conc_cod = C.conc_cod AND ((C.conc_repoi = 'S') or (:SOLOSS = 'N'))
        and (N.conc_cod = 908 or (N.conc_cod = 909)) and (nomi_id = :id_nomina_1 or (nomi_id = :id_nomina_2) or (nomi_id = :id_nomina_3) or (nomi_id = :id_nomina_4) or (nomi_id = :id_nomina_5) or (nomi_id = :id_nomina_6) or (nomi_id = :id_nomina_7)) AND N.noco_valor > 0)
        into :totadminarp;
    if (totadminarp is null) then
        totadminarp = 0;
    totadmin = :totadmin + :totadminarp;
    select sum (noco_valor*(-1)) from nomina_conceptos N, conceptos_nomina C
        where (N.noco_aporte = 'S' and N.noco_entidad = :nit AND N.conc_cod = C.conc_cod AND ((C.conc_repoi = 'S') or (:SOLOSS = 'N'))
        and (N.conc_cod = 908 or (N.conc_cod = 909)) and (nomi_id = :id_nomina_1 or (nomi_id = :id_nomina_2) or (nomi_id = :id_nomina_3) or (nomi_id = :id_nomina_4) or (nomi_id = :id_nomina_5) or (nomi_id = :id_nomina_6) or (nomi_id = :id_nomina_7)) AND N.noco_valor < 0)
        into :totadminnegarp;
    if (totadminnegarp is null) then
        totadminnegarp = 0;
    totadminneg = :totadminnegarp + :totadminneg;
    totadmin = :totadminneg + :totadmin;
    END
  if (totadmin IS NOT NULL and totadmin <> 0) then
    BEGIN
    insert into pago_aportes (pgap_id, pgap_item, pgap_tipoap, pgap_conpago, pgap_admin, pgap_monto, pgap_intmora, pgap_fecha, pgap_formulario,pgap_idnomina) values
        (:idaporte, :itemaportadmi, :tipoaport, '', :nit, :totadmin, :intmora, :fecha, :formulario,:id_nomina_1);
    if (CCF = 'S') then
        begin
        for select TERC_NIT from EMPLEADOS E where EMPL_CCF = :NIT AND E.terc_nit IN (SELECT NC.terc_nit
            FROM NOMINA_CONCEPTOS NC WHERE (nomi_id = :id_nomina_1 or (nomi_id = :id_nomina_2) or (nomi_id = :id_nomina_3) or (nomi_id = :id_nomina_4) or (nomi_id = :id_nomina_5) or (nomi_id = :id_nomina_6) or (nomi_id = :id_nomina_7)))
            into :nitempl
            do
            begin
            select sum (NOCO_VALOR) from NOMINA_CONCEPTOS
                where (TERC_NIT = :nitempl and NOCO_SALARIO = 'S' and (nomi_id = :id_nomina_1 or (nomi_id = :id_nomina_2) or (nomi_id = :id_nomina_3) or (nomi_id = :id_nomina_4) or (nomi_id = :id_nomina_5) or (nomi_id = :id_nomina_6) or (nomi_id = :id_nomina_7)))
                into :totibc;
            select sum (NOCO_VALOR) from NOMINA_CONCEPTOS N
                where (TERC_NIT = :nitempl and NOCO_ENTIDAD = :nit and NOCO_APORTE = 'S' and (nomi_id = :id_nomina_1 or (nomi_id = :id_nomina_2) or (nomi_id = :id_nomina_3) or (nomi_id = :id_nomina_4) or (nomi_id = :id_nomina_5) or (nomi_id = :id_nomina_6) or (nomi_id = :id_nomina_7))
                AND noco_valor > 0 and (N.conc_cod = 910 or (N.conc_cod = 911) or (N.conc_cod = 916) or (N.conc_cod = 917) or (N.conc_cod = 918) or (N.conc_cod = 919) or (N.conc_cod = 936) or (N.conc_cod = 939) or (N.conc_cod = 940)))
                into :totdetvalor;
            if (totdetvalor is null) then
                totdetvalor = 0;
            if ((:totdetvalor is not null) and (:totibc is not null) and totdetvalor <> 0) then
                begin
                insert into PAGO_APORTES_DETALLE (pgap_id, pgap_item, pade_itemdet, terc_nit, pade_ibc, pade_cotobl, pade_tipap)
                    values(:idaporte, :itemaportadmi, :itemdetaport, :nitempl, :totibc, :totdetvalor,'CCF');
                itemdetaport = :itemdetaport + 1;
                totdetvalor = 0;
                end
            end
        end
    if (EPS = 'S') then
        begin
        for select TERC_NIT from EMPLEADOS E where EMPL_EPS = :NIT AND E.terc_nit IN (SELECT NC.terc_nit
            FROM NOMINA_CONCEPTOS NC WHERE (nomi_id = :id_nomina_1 or (nomi_id = :id_nomina_2) or (nomi_id = :id_nomina_3) or (nomi_id = :id_nomina_4) or (nomi_id = :id_nomina_5) or (nomi_id = :id_nomina_6) or (nomi_id = :id_nomina_7))) into :nitempl
            do
            begin
            select sum (NOCO_VALOR) from NOMINA_CONCEPTOS N
                where (TERC_NIT = :nitempl and NOCO_SALARIO = 'S' and (nomi_id = :id_nomina_1 or (nomi_id = :id_nomina_2) or (nomi_id = :id_nomina_3) or (nomi_id = :id_nomina_4) or (nomi_id = :id_nomina_5) or (nomi_id = :id_nomina_6) or (nomi_id = :id_nomina_7)))
                into :totibc;
            select sum (NOCO_VALOR) from NOMINA_CONCEPTOS N
                where (TERC_NIT = :nitempl and NOCO_ENTIDAD = :nit and NOCO_APORTE = 'S' and (nomi_id = :id_nomina_1 or (nomi_id = :id_nomina_2) or (nomi_id = :id_nomina_3) or (nomi_id = :id_nomina_4) or (nomi_id = :id_nomina_5) or (nomi_id = :id_nomina_6) or (nomi_id = :id_nomina_7))
                AND noco_valor > 0 and (N.conc_cod = 907 or (N.conc_cod = 914) or (N.conc_cod = 915) or (N.conc_cod = 938)))
                into :totdetvalor;
            if (totdetvalor is null) then
                totdetvalor = 0;
            select sum (NOCO_VALOR*(-1)) from NOMINA_CONCEPTOS N
                where (TERC_NIT = :nitempl and NOCO_ENTIDAD = :nit and NOCO_APORTE = 'S' and (nomi_id = :id_nomina_1 or (nomi_id = :id_nomina_2) or (nomi_id = :id_nomina_3) or (nomi_id = :id_nomina_4) or (nomi_id = :id_nomina_5) or (nomi_id = :id_nomina_6) or (nomi_id = :id_nomina_7))
                AND noco_valor < 0 and (N.conc_cod = 907 or (N.conc_cod = 914) or (N.conc_cod = 915) or (N.conc_cod = 938)))
                into :totdetvalorneg;
            if (totdetvalorneg is null) then
                totdetvalorneg = 0;
            totdetvalor = :totdetvalorneg + :totdetvalor;
            if ((:totdetvalor is not null) and (:totibc is not null) and totdetvalor <> 0) then
                begin
                insert into PAGO_APORTES_DETALLE (pgap_id, pgap_item, pade_itemdet, terc_nit, pade_ibc, pade_cotobl, pade_tipap)
                    values(:idaporte, :itemaportadmi, :itemdetaport, :nitempl, :totibc, :totdetvalor,'EPS');
                itemdetaport = :itemdetaport + 1;
                totdetvalor = 0;
                end
            end
        end
    if (afp = 'S') then
        begin
        for select TERC_NIT from EMPLEADOS E where EMPL_AFP = :NIT AND E.terc_nit IN (SELECT NC.terc_nit FROM NOMINA_CONCEPTOS NC WHERE (nomi_id = :id_nomina_1 or (nomi_id = :id_nomina_2) or (nomi_id = :id_nomina_3) or (nomi_id = :id_nomina_4) or (nomi_id = :id_nomina_5) or (nomi_id = :id_nomina_6) or (nomi_id = :id_nomina_7))) into :nitempl
            do
            begin
            select sum (NOCO_VALOR) from NOMINA_CONCEPTOS, conceptos_nomina C
                where (TERC_NIT = :nitempl and NOCO_SALARIO = 'S'
                and (nomi_id = :id_nomina_1 or (nomi_id = :id_nomina_2) or (nomi_id = :id_nomina_3) or (nomi_id = :id_nomina_4) or (nomi_id = :id_nomina_5) or (nomi_id = :id_nomina_6) or (nomi_id = :id_nomina_7)))
                into :totibc;
            select sum (NOCO_VALOR) from NOMINA_CONCEPTOS N, conceptos_nomina C
                where (TERC_NIT = :nitempl and NOCO_ENTIDAD = :nit and NOCO_APORTE = 'S' and (nomi_id = :id_nomina_1 or (nomi_id = :id_nomina_2) or (nomi_id = :id_nomina_3) or (nomi_id = :id_nomina_4) or (nomi_id = :id_nomina_5) or (nomi_id = :id_nomina_6) or (nomi_id = :id_nomina_7)) AND noco_valor > 0 and (N.conc_cod = 904 or (N.conc_cod = 905) or (N.conc_cod = 906) or (N.conc_cod = 934)))
                into :totdetvalor;
            if (totdetvalor is null) then
                totdetvalor = 0;
            select sum (NOCO_VALOR*(-1)) from NOMINA_CONCEPTOS N, conceptos_nomina C
                where (TERC_NIT = :nitempl and NOCO_ENTIDAD = :nit and NOCO_APORTE = 'S' and (nomi_id = :id_nomina_1 or (nomi_id = :id_nomina_2) or (nomi_id = :id_nomina_3) or (nomi_id = :id_nomina_4) or (nomi_id = :id_nomina_5) or (nomi_id = :id_nomina_6) or (nomi_id = :id_nomina_7)) AND noco_valor < 0 and (N.conc_cod = 904 or (N.conc_cod = 905) or (N.conc_cod = 906) or (N.conc_cod = 934)))
                into :totdetvalorneg;
            if (totdetvalorneg is null) then
                totdetvalorneg = 0;
            totdetvalor = :totdetvalorneg + :totdetvalor;
            if ((:totdetvalor is not null) and (:totibc is not null) and totdetvalor <> 0) then
                begin
                insert into PAGO_APORTES_DETALLE (pgap_id, pgap_item, pade_itemdet, terc_nit, pade_ibc, pade_cotobl, pade_tipap)
                    values(:idaporte, :itemaportadmi, :itemdetaport, :nitempl, :totibc, :totdetvalor,'AFP');
                itemdetaport = :itemdetaport + 1;
                totdetvalor = 0;
                end
            end
        end
    if (AFC = 'S') then
        begin
        for select TERC_NIT from EMPLEADOS E where EMPL_AFC = :NIT AND E.terc_nit IN (SELECT NC.terc_nit FROM NOMINA_CONCEPTOS NC WHERE (nomi_id = :id_nomina_1 or (nomi_id = :id_nomina_2) or (nomi_id = :id_nomina_3) or (nomi_id = :id_nomina_4) or (nomi_id = :id_nomina_5) or (nomi_id = :id_nomina_6) or (nomi_id = :id_nomina_7))) into :nitempl
            do
            begin
            select sum (NOCO_VALOR) from NOMINA_CONCEPTOS N, conceptos_nomina C
                where (TERC_NIT = :nitempl and NOCO_SALARIO = 'S' and (nomi_id = :id_nomina_1 or (nomi_id = :id_nomina_2) or (nomi_id = :id_nomina_3) or (nomi_id = :id_nomina_4) or (nomi_id = :id_nomina_5) or (nomi_id = :id_nomina_6) or (nomi_id = :id_nomina_7)))
                into :totibc;
            select sum (NOCO_VALOR) from NOMINA_CONCEPTOS N, conceptos_nomina C
                where (TERC_NIT = :nitempl and NOCO_ENTIDAD = :nit and NOCO_APORTE = 'S' and (nomi_id = :id_nomina_1 or (nomi_id = :id_nomina_2) or (nomi_id = :id_nomina_3) or (nomi_id = :id_nomina_4) or (nomi_id = :id_nomina_5) or (nomi_id = :id_nomina_6) or (nomi_id = :id_nomina_7))
                AND noco_valor > 0 and (N.conc_cod = 912 or (N.conc_cod = 913)or (N.conc_cod = 937)))
                into :totdetvalor;
            if (totdetvalor is null) then
                totdetvalor = 0;
            select sum (NOCO_VALOR*(-1)) from NOMINA_CONCEPTOS N, conceptos_nomina C
                where (TERC_NIT = :nitempl and NOCO_ENTIDAD = :nit and NOCO_APORTE = 'S' and (nomi_id = :id_nomina_1 or (nomi_id = :id_nomina_2) or (nomi_id = :id_nomina_3) or (nomi_id = :id_nomina_4) or (nomi_id = :id_nomina_5) or (nomi_id = :id_nomina_6) or (nomi_id = :id_nomina_7))
                AND noco_valor < 0 and (N.conc_cod = 912 or (N.conc_cod = 913)or (N.conc_cod = 937)))
                into :totdetvalorneg;
            if (totdetvalorneg is null) then
                totdetvalorneg = 0;
            totdetvalor = :totdetvalorneg + :totdetvalor;
            if ((:totdetvalor is not null) and (:totibc is not null) and totdetvalor <> 0) then
                begin
                insert into PAGO_APORTES_DETALLE (pgap_id, pgap_item, pade_itemdet, terc_nit, pade_ibc, pade_cotobl, pade_tipap)
                    values(:idaporte, :itemaportadmi, :itemdetaport, :nitempl, :totibc, :totdetvalor,'AFC');    itemdetaport = :itemdetaport + 1;
                totdetvalor = 0;
                end
            end
        end
    if (ARP = 'S') then
        begin
        for select TERC_NIT from EMPLEADOS E where EMPL_ARP = :NIT AND E.terc_nit IN (SELECT NC.terc_nit FROM NOMINA_CONCEPTOS NC WHERE (nomi_id = :id_nomina_1 or (nomi_id = :id_nomina_2) or (nomi_id = :id_nomina_3) or (nomi_id = :id_nomina_4) or (nomi_id = :id_nomina_5) or (nomi_id = :id_nomina_6) or (nomi_id = :id_nomina_7))) into :nitempl
            do
            begin
            select sum (NOCO_VALOR) from NOMINA_CONCEPTOS N, conceptos_nomina C
                where (TERC_NIT = :nitempl and NOCO_SALARIO = 'S' and (nomi_id = :id_nomina_1 or (nomi_id = :id_nomina_2) or (nomi_id = :id_nomina_3) or (nomi_id = :id_nomina_4) or (nomi_id = :id_nomina_5) or (nomi_id = :id_nomina_6) or (nomi_id = :id_nomina_7)))
                into :totibc;
            select sum (NOCO_VALOR) from NOMINA_CONCEPTOS N, conceptos_nomina C
                where (TERC_NIT = :nitempl and NOCO_APORTE = 'S' and (nomi_id = :id_nomina_1 or (nomi_id = :id_nomina_2) or (nomi_id = :id_nomina_3) or (nomi_id = :id_nomina_4) or (nomi_id = :id_nomina_5) or (nomi_id = :id_nomina_6) or (nomi_id = :id_nomina_7))
                AND noco_valor > 0 and (N.conc_cod = 908 or (N.conc_cod = 909) or (N.conc_cod = 935)))
                into :totdetvalor;
            if (totdetvalor is null) then
                totdetvalor = 0;
            select sum (NOCO_VALOR*(-1)) from NOMINA_CONCEPTOS N, conceptos_nomina C
                where (TERC_NIT = :nitempl and NOCO_APORTE = 'S' and (nomi_id = :id_nomina_1 or (nomi_id = :id_nomina_2) or (nomi_id = :id_nomina_3) or (nomi_id = :id_nomina_4) or (nomi_id = :id_nomina_5) or (nomi_id = :id_nomina_6) or (nomi_id = :id_nomina_7))
                AND noco_valor < 0 and (N.conc_cod = 908 or (N.conc_cod = 909)or (N.conc_cod = 935)))
                into :totdetvalorneg;
            if (totdetvalorneg is null) then
                totdetvalorneg = 0;
            totdetvalor = :totdetvalorneg + :totdetvalor;
            if ((:totdetvalor is not null) and (:totibc is not null) and totdetvalor <> 0) then
                begin
                insert into PAGO_APORTES_DETALLE (pgap_id, pgap_item, pade_itemdet, terc_nit, pade_ibc, pade_cotobl, pade_tipap)
                    values(:idaporte, :itemaportadmi, :itemdetaport, :nitempl, :totibc, :totdetvalor,'ARP');    itemdetaport = :itemdetaport + 1;
                totdetvalor = 0;
                end
            end
        end
    if (totadmin IS NOT NULL) then
        itemaportadmi = :itemaportadmi + 1;
    itemdetaport = 1;
    END
  SUSPEND;
  end
end
^

SET TERM ; ^


/* 20100901 */
/* COPIA DE CORREOS ENVIADOS POR NOMINA */
INSERT INTO CONFIGURACION (CONF_MODULO, CONF_CATEGORIA, CONF_PROPIEDAD, CONF_VALOR, CONF_POSIBLES, CONF_AYUDA) VALUES ('NOMINA', 'GENERAL', 'DIRECCION DE CORREO ELECTRONICO PARA COPIAS DE ENVIO DE COMPROBANTES NOMINA', '', '', 'Indique la dirección de correo electrónico que recibirá una copia como soporte de cada envío de comprobantes de nómina o certificados hechos con SYSplus');
commit work;

/* CAMBIE CENTROS AL CAMBIAR DEPTO */
SET TERM ^ ;

CREATE OR ALTER TRIGGER EMPLEADOS_BI FOR EMPLEADOS
ACTIVE BEFORE INSERT POSITION 0
as
declare variable PROY VARCHAR(4);
declare variable CENT VARCHAR(4);
begin
if (NEW.stco_cod IS NULL) then
    NEW.stco_cod = 0;
if (NEW.empl_fecing IS NULL) then
    NEW.empl_fecing = CAST('now' AS DATE);
if ((NEW.empl_dpto IS NOT NULL) AND ((NEW.proy_cod IS NULL) or (NEW.cent_cod IS NULL)))  then
    BEGIN
    SELECT DPTO_PROY, DPTO_CENTRO FROM DEPARTAMENTO WHERE DPTO_COD = NEW.empl_dpto INTO :proy, :cent;
    if ((PROY <> '') AND (CENT <> '')) then
        BEGIN
        NEW.proy_cod = :PROY;
        NEW.cent_cod = :cent;
        END
    END
end
^

SET TERM ; ^

SET TERM ^ ;

create trigger EMPLEADOS_BU for EMPLEADOS
active BEFORE UPDATE position 0
as
declare variable PROY VARCHAR(4);
declare variable CENT VARCHAR(4);
begin
if (NEW.empl_dpto <> OLD.empl_dpto) then
    BEGIN
    SELECT DPTO_PROY, DPTO_CENTRO FROM DEPARTAMENTO WHERE DPTO_COD = NEW.empl_dpto INTO :proy, :cent;
    if ((PROY <> '') AND (CENT <> '')) then
        BEGIN
        NEW.proy_cod = :PROY;
        NEW.cent_cod = :cent;
        END
    END
end
^

SET TERM ; ^


/* CERTIFICACION LABORAL VACIA */
SET TERM ^ ;

CREATE OR ALTER procedure CERTIFICA_LABORAL (
    FEC date,
    NITEMPL varchar(20))
returns (
    NOMEMPL varchar(60),
    FECING date,
    SALARIO numeric(18,2),
    SALARIOLET varchar(60),
    NOMTIPOCONT varchar(60),
    FECHAEXPED date,
    CARGOEMPL varchar(60))
AS
declare variable TIPCONT CHAR(1);
begin
SELECT E.empl_fecing, E.empl_cargo, T.terc_nom, E.empl_tipocont
    FROM EMPLEADOS E, TERCEROS T
    WHERE T.terc_nit = E.terc_nit AND E.terc_nit = :nitempl
    INTO :fecing,:cargoempl, :nomempl, :tipcont;
select first 1 m.mvse_salario from movimiento_salario_empleado m where m.terc_nit = :nitempl and m.mvse_fecha <= :fec
    order by m.mvse_fecha desc into :salario;
if (tipcont = 'I') then
    nomtipocont = 'a término indefinido';
else
    if (tipcont = 'D') then
        nomtipocont = 'a término fijo';
    fechaexped = :fec;
suspend;
end
^

SET TERM ; ^


INSERT INTO CONFIGURACION (CONF_MODULO, CONF_CATEGORIA, CONF_PROPIEDAD, CONF_VALOR, CONF_POSIBLES, CONF_AYUDA) VALUES ('NOMINA', 'GENERAL', 'NOMBRE FIRMA CERTIFICADOS LABORALES', '', '', 'Indique el nombre de la persona que firma las certificaciones laborales');
INSERT INTO CONFIGURACION (CONF_MODULO, CONF_CATEGORIA, CONF_PROPIEDAD, CONF_VALOR, CONF_POSIBLES, CONF_AYUDA) VALUES ('NOMINA', 'GENERAL', 'CARGO FIRMA CERTIFICADOS LABORALES', 'Departamento de Talento Humano', '', 'Indique el cargo del funcionario que firma las certficaciones laborales');
commit work;

SET TERM ^ ;

CREATE OR ALTER procedure CERTIFICA_LABORAL (
    FEC date,
    NITEMPL varchar(20))
returns (
    NOMEMPL varchar(60),
    FECING date,
    SALARIO numeric(18,2),
    SALARIOLET varchar(60),
    NOMTIPOCONT varchar(60),
    FECHAEXPED date,
    CARGOEMPL varchar(60),
    FIRMA VARCHAR(100),
    CARGOFIRMA VARCHAR(100))
AS
declare variable TIPCONT CHAR(1);
begin
SELECT E.empl_fecing, E.empl_cargo, T.terc_nom, E.empl_tipocont
    FROM EMPLEADOS E, TERCEROS T
    WHERE T.terc_nit = E.terc_nit AND E.terc_nit = :nitempl
    INTO :fecing,:cargoempl, :nomempl, :tipcont;
select first 1 m.mvse_salario from movimiento_salario_empleado m where m.terc_nit = :nitempl and m.mvse_fecha <= :fec
    order by m.mvse_fecha desc into :salario;
if (tipcont = 'D') then
    nomtipocont = 'a término fijo';
else
    if (tipcont = 'O') then
        nomtipocont = 'por obra y labor';
    else
        nomtipocont = 'a término indefinido';

fechaexped = :fec;

EXECUTE PROCEDURE lee_configuracion ('NOMINA', 'GENERAL', 'NOMBRE FIRMA CERTIFICADOS LABORALES') returning_values (FIRMA);
EXECUTE PROCEDURE lee_configuracion ('NOMINA', 'GENERAL', 'CARGO FIRMA CERTIFICADOS LABORALES') returning_values (:cargofirma);
suspend;
end
^

SET TERM ; ^

UPDATE CONFIGURACION
SET CONF_PROPIEDAD = 'PERIODICIDAD DE PAGO PREDETERMINADA', CONF_POSIBLES = 'MENSUAL,QUINCENAL,SEMANAL'
WHERE (CONF_MODULO = 'NOMINA') AND (CONF_CATEGORIA = 'GENERAL') AND (CONF_PROPIEDAD = 'PERIODICIDAD DE PAGO PARA VER NOVEDADES POR PERIODO');
COMMIT WORK;

/* MARCAR LOS APORTES QUE SE REPORTAN AL OPERADOR DE INFORMACION */

ALTER TABLE CONCEPTOS_NOMINA
ADD CONC_REPOI T_BOOLEANO;

UPDATE CONCEPTOS_NOMINA SET CONC_REPOI = 'S';
COMMIT WORK;

SET TERM ^ ;

CREATE OR ALTER procedure LIQUIDACION_APORTES (
    ID_NOMINA_1 integer,
    ID_NOMINA_2 integer,
    ID_NOMINA_3 integer,
    ID_NOMINA_4 integer,
    ID_NOMINA_5 integer,
    ID_NOMINA_6 integer,
    ID_NOMINA_7 integer,
    INTMORA numeric(18,2),
    FECHA date,
    FORMULARIO varchar(10),
    SOLOSS CHAR(1))
returns (
    IDAPORTE integer)
AS
declare variable itemaportadmi integer;
declare variable itemdetaport integer;
declare variable nit varchar(20);
declare variable eps char(1);
declare variable afp char(1);
declare variable ccf char(1);
declare variable afc char(1);
declare variable arp char(1);
declare variable nombreadmin varchar(60);
declare variable totadmin numeric(18,2);
declare variable totadminneg numeric(18,2);
declare variable totadminarp numeric(18,2);
declare variable totadminnegarp numeric(18,2);
declare variable tipoaport char(1);
declare variable ano char(4);
declare variable nitempl varchar(20);
declare variable totdetvalor numeric(18,2);
declare variable totdetvalorneg numeric(18,2);
declare variable totibc integer;
begin
itemaportadmi = 1;
itemdetaport = 1;
ANO = SUBSTR(fecha, 1, 4);
idaporte = gen_id(id_pgaport,1);
select PAAN_TIPOAPORT from parametros_ano where PAAN_ANO = :ANO into :tipoaport;
for select A.TERC_NIT, A.ADMI_EPS, A.ADMI_AFP, A.ADMI_CCF, A.ADMI_AFC, A.ADMI_ARP, T.TERC_NOM from ADMINISTRADORA A, TERCEROS t
  where T.TERC_NIT = A.TERC_NIT and t.terc_admini = 'S' Into :nit, :eps, :afp, :CCF, :afc, :arp, :nombreadmin
  do
  begin
  select sum (noco_valor) from nomina_conceptos N, conceptos_nomina C
      where (N.noco_aporte = 'S' and N.noco_entidad = :nit AND N.conc_cod = C.conc_cod AND ((C.conc_repoi = 'S') or (:SOLOSS = 'N'))
      and (nomi_id = :id_nomina_1 or (nomi_id = :id_nomina_2) or (nomi_id = :id_nomina_3) or (nomi_id = :id_nomina_4) or (nomi_id = :id_nomina_5) or (nomi_id = :id_nomina_6) or (nomi_id = :id_nomina_7)) AND N.noco_valor > 0)
      into :totadmin;
  if (totadmin is null) then
      totadmin = 0;
  select sum (noco_valor*(-1)) from nomina_conceptos N, conceptos_nomina C
      where (N.noco_aporte = 'S' and N.noco_entidad = :nit AND N.conc_cod = C.conc_cod AND ((C.conc_repoi = 'S') or (:SOLOSS = 'N'))
      and (nomi_id = :id_nomina_1 or (nomi_id = :id_nomina_2) or (nomi_id = :id_nomina_3) or (nomi_id = :id_nomina_4) or (nomi_id = :id_nomina_5) or (nomi_id = :id_nomina_6) or (nomi_id = :id_nomina_7)) AND N.noco_valor < 0)
      into :totadminneg;
  if (totadminneg is null) then
      totadminneg = 0;
  totadmin = :totadminneg + :totadmin;
  if (arp = 'S') then
    BEGIN
    select sum (noco_valor) from nomina_conceptos N, conceptos_nomina C
        where (N.noco_aporte = 'S' and N.noco_entidad = :nit AND N.conc_cod = C.conc_cod AND ((C.conc_repoi = 'S') or (:SOLOSS = 'N'))
        and (N.conc_cod = 908 or (N.conc_cod = 909)) and (nomi_id = :id_nomina_1 or (nomi_id = :id_nomina_2) or (nomi_id = :id_nomina_3) or (nomi_id = :id_nomina_4) or (nomi_id = :id_nomina_5) or (nomi_id = :id_nomina_6) or (nomi_id = :id_nomina_7)) AND N.noco_valor > 0)
        into :totadminarp;
    if (totadminarp is null) then
        totadminarp = 0;
    totadmin = :totadmin + :totadminarp;
    select sum (noco_valor*(-1)) from nomina_conceptos N, conceptos_nomina C
        where (N.noco_aporte = 'S' and N.noco_entidad = :nit AND N.conc_cod = C.conc_cod AND ((C.conc_repoi = 'S') or (:SOLOSS = 'N'))
        and (N.conc_cod = 908 or (N.conc_cod = 909)) and (nomi_id = :id_nomina_1 or (nomi_id = :id_nomina_2) or (nomi_id = :id_nomina_3) or (nomi_id = :id_nomina_4) or (nomi_id = :id_nomina_5) or (nomi_id = :id_nomina_6) or (nomi_id = :id_nomina_7)) AND N.noco_valor < 0)
        into :totadminnegarp;
    if (totadminnegarp is null) then
        totadminnegarp = 0;
    totadminneg = :totadminnegarp + :totadminneg;
    totadmin = :totadminneg + :totadmin;
    END
  if (totadmin IS NOT NULL and totadmin <> 0) then
    BEGIN
    insert into pago_aportes (pgap_id, pgap_item, pgap_tipoap, pgap_conpago, pgap_admin, pgap_monto, pgap_intmora, pgap_fecha, pgap_formulario,pgap_idnomina) values
        (:idaporte, :itemaportadmi, :tipoaport, '', :nit, :totadmin, :intmora, :fecha, :formulario,:id_nomina_1);
    if (CCF = 'S') then
        begin
        for select TERC_NIT from EMPLEADOS E where EMPL_CCF = :NIT AND E.terc_nit IN (SELECT NC.terc_nit
            FROM NOMINA_CONCEPTOS NC WHERE (nomi_id = :id_nomina_1 or (nomi_id = :id_nomina_2) or (nomi_id = :id_nomina_3) or (nomi_id = :id_nomina_4) or (nomi_id = :id_nomina_5) or (nomi_id = :id_nomina_6) or (nomi_id = :id_nomina_7)))
            into :nitempl
            do
            begin
            select sum (NOCO_VALOR) from NOMINA_CONCEPTOS
                where (TERC_NIT = :nitempl and NOCO_SALARIO = 'S' and (nomi_id = :id_nomina_1 or (nomi_id = :id_nomina_2) or (nomi_id = :id_nomina_3) or (nomi_id = :id_nomina_4) or (nomi_id = :id_nomina_5) or (nomi_id = :id_nomina_6) or (nomi_id = :id_nomina_7)))
                into :totibc;
            select sum (NOCO_VALOR) from NOMINA_CONCEPTOS N
                where (TERC_NIT = :nitempl and NOCO_ENTIDAD = :nit and NOCO_APORTE = 'S' and (nomi_id = :id_nomina_1 or (nomi_id = :id_nomina_2) or (nomi_id = :id_nomina_3) or (nomi_id = :id_nomina_4) or (nomi_id = :id_nomina_5) or (nomi_id = :id_nomina_6) or (nomi_id = :id_nomina_7))
                AND noco_valor > 0 and (N.conc_cod = 910 or (N.conc_cod = 911) or (N.conc_cod = 916) or (N.conc_cod = 917) or (N.conc_cod = 918) or (N.conc_cod = 919) or (N.conc_cod = 936) or (N.conc_cod = 939) or (N.conc_cod = 940)))
                into :totdetvalor;
            if (totdetvalor is null) then
                totdetvalor = 0;
            if ((:totdetvalor is not null) and (:totibc is not null) and totdetvalor <> 0) then
                begin
                insert into PAGO_APORTES_DETALLE (pgap_id, pgap_item, pade_itemdet, terc_nit, pade_ibc, pade_cotobl, pade_tipap)
                    values(:idaporte, :itemaportadmi, :itemdetaport, :nitempl, :totibc, :totdetvalor,'CCF');
                itemdetaport = :itemdetaport + 1;
                totdetvalor = 0;
                end
            end
        end
    if (EPS = 'S') then
        begin
        for select TERC_NIT from EMPLEADOS E where EMPL_EPS = :NIT AND E.terc_nit IN (SELECT NC.terc_nit
            FROM NOMINA_CONCEPTOS NC WHERE (nomi_id = :id_nomina_1 or (nomi_id = :id_nomina_2) or (nomi_id = :id_nomina_3) or (nomi_id = :id_nomina_4) or (nomi_id = :id_nomina_5) or (nomi_id = :id_nomina_6) or (nomi_id = :id_nomina_7))) into :nitempl
            do
            begin
            select sum (NOCO_VALOR) from NOMINA_CONCEPTOS N
                where (TERC_NIT = :nitempl and NOCO_SALARIO = 'S' and (nomi_id = :id_nomina_1 or (nomi_id = :id_nomina_2) or (nomi_id = :id_nomina_3) or (nomi_id = :id_nomina_4) or (nomi_id = :id_nomina_5) or (nomi_id = :id_nomina_6) or (nomi_id = :id_nomina_7)))
                into :totibc;
            select sum (NOCO_VALOR) from NOMINA_CONCEPTOS N
                where (TERC_NIT = :nitempl and NOCO_ENTIDAD = :nit and NOCO_APORTE = 'S' and (nomi_id = :id_nomina_1 or (nomi_id = :id_nomina_2) or (nomi_id = :id_nomina_3) or (nomi_id = :id_nomina_4) or (nomi_id = :id_nomina_5) or (nomi_id = :id_nomina_6) or (nomi_id = :id_nomina_7))
                AND noco_valor > 0 and (N.conc_cod = 907 or (N.conc_cod = 914) or (N.conc_cod = 915) or (N.conc_cod = 938)))
                into :totdetvalor;
            if (totdetvalor is null) then
                totdetvalor = 0;
            select sum (NOCO_VALOR*(-1)) from NOMINA_CONCEPTOS N
                where (TERC_NIT = :nitempl and NOCO_ENTIDAD = :nit and NOCO_APORTE = 'S' and (nomi_id = :id_nomina_1 or (nomi_id = :id_nomina_2) or (nomi_id = :id_nomina_3) or (nomi_id = :id_nomina_4) or (nomi_id = :id_nomina_5) or (nomi_id = :id_nomina_6) or (nomi_id = :id_nomina_7))
                AND noco_valor < 0 and (N.conc_cod = 907 or (N.conc_cod = 914) or (N.conc_cod = 915) or (N.conc_cod = 938)))
                into :totdetvalorneg;
            if (totdetvalorneg is null) then
                totdetvalorneg = 0;
            totdetvalor = :totdetvalorneg + :totdetvalor;
            if ((:totdetvalor is not null) and (:totibc is not null) and totdetvalor <> 0) then
                begin
                insert into PAGO_APORTES_DETALLE (pgap_id, pgap_item, pade_itemdet, terc_nit, pade_ibc, pade_cotobl, pade_tipap)
                    values(:idaporte, :itemaportadmi, :itemdetaport, :nitempl, :totibc, :totdetvalor,'EPS');
                itemdetaport = :itemdetaport + 1;
                totdetvalor = 0;
                end
            end
        end
    if (afp = 'S') then
        begin
        for select TERC_NIT from EMPLEADOS E where EMPL_AFP = :NIT AND E.terc_nit IN (SELECT NC.terc_nit FROM NOMINA_CONCEPTOS NC WHERE (nomi_id = :id_nomina_1 or (nomi_id = :id_nomina_2) or (nomi_id = :id_nomina_3) or (nomi_id = :id_nomina_4) or (nomi_id = :id_nomina_5) or (nomi_id = :id_nomina_6) or (nomi_id = :id_nomina_7))) into :nitempl
            do
            begin
            select sum (NOCO_VALOR) from NOMINA_CONCEPTOS, conceptos_nomina C
                where (TERC_NIT = :nitempl and NOCO_SALARIO = 'S'
                and (nomi_id = :id_nomina_1 or (nomi_id = :id_nomina_2) or (nomi_id = :id_nomina_3) or (nomi_id = :id_nomina_4) or (nomi_id = :id_nomina_5) or (nomi_id = :id_nomina_6) or (nomi_id = :id_nomina_7)))
                into :totibc;
            select sum (NOCO_VALOR) from NOMINA_CONCEPTOS N, conceptos_nomina C
                where (TERC_NIT = :nitempl and NOCO_ENTIDAD = :nit and NOCO_APORTE = 'S' and (nomi_id = :id_nomina_1 or (nomi_id = :id_nomina_2) or (nomi_id = :id_nomina_3) or (nomi_id = :id_nomina_4) or (nomi_id = :id_nomina_5) or (nomi_id = :id_nomina_6) or (nomi_id = :id_nomina_7)) AND noco_valor > 0 and (N.conc_cod = 904 or (N.conc_cod = 905) or (N.conc_cod = 906) or (N.conc_cod = 934)))
                into :totdetvalor;
            if (totdetvalor is null) then
                totdetvalor = 0;
            select sum (NOCO_VALOR*(-1)) from NOMINA_CONCEPTOS N, conceptos_nomina C
                where (TERC_NIT = :nitempl and NOCO_ENTIDAD = :nit and NOCO_APORTE = 'S' and (nomi_id = :id_nomina_1 or (nomi_id = :id_nomina_2) or (nomi_id = :id_nomina_3) or (nomi_id = :id_nomina_4) or (nomi_id = :id_nomina_5) or (nomi_id = :id_nomina_6) or (nomi_id = :id_nomina_7)) AND noco_valor < 0 and (N.conc_cod = 904 or (N.conc_cod = 905) or (N.conc_cod = 906) or (N.conc_cod = 934)))
                into :totdetvalorneg;
            if (totdetvalorneg is null) then
                totdetvalorneg = 0;
            totdetvalor = :totdetvalorneg + :totdetvalor;
            if ((:totdetvalor is not null) and (:totibc is not null) and totdetvalor <> 0) then
                begin
                insert into PAGO_APORTES_DETALLE (pgap_id, pgap_item, pade_itemdet, terc_nit, pade_ibc, pade_cotobl, pade_tipap)
                    values(:idaporte, :itemaportadmi, :itemdetaport, :nitempl, :totibc, :totdetvalor,'AFP');
                itemdetaport = :itemdetaport + 1;
                totdetvalor = 0;
                end
            end
        end
    if (AFC = 'S') then
        begin
        for select TERC_NIT from EMPLEADOS E where EMPL_AFC = :NIT AND E.terc_nit IN (SELECT NC.terc_nit FROM NOMINA_CONCEPTOS NC WHERE (nomi_id = :id_nomina_1 or (nomi_id = :id_nomina_2) or (nomi_id = :id_nomina_3) or (nomi_id = :id_nomina_4) or (nomi_id = :id_nomina_5) or (nomi_id = :id_nomina_6) or (nomi_id = :id_nomina_7))) into :nitempl
            do
            begin
            select sum (NOCO_VALOR) from NOMINA_CONCEPTOS N, conceptos_nomina C
                where (TERC_NIT = :nitempl and NOCO_SALARIO = 'S' and (nomi_id = :id_nomina_1 or (nomi_id = :id_nomina_2) or (nomi_id = :id_nomina_3) or (nomi_id = :id_nomina_4) or (nomi_id = :id_nomina_5) or (nomi_id = :id_nomina_6) or (nomi_id = :id_nomina_7)))
                into :totibc;
            select sum (NOCO_VALOR) from NOMINA_CONCEPTOS N, conceptos_nomina C
                where (TERC_NIT = :nitempl and NOCO_ENTIDAD = :nit and NOCO_APORTE = 'S' and (nomi_id = :id_nomina_1 or (nomi_id = :id_nomina_2) or (nomi_id = :id_nomina_3) or (nomi_id = :id_nomina_4) or (nomi_id = :id_nomina_5) or (nomi_id = :id_nomina_6) or (nomi_id = :id_nomina_7))
                AND noco_valor > 0 and (N.conc_cod = 912 or (N.conc_cod = 913)or (N.conc_cod = 937)))
                into :totdetvalor;
            if (totdetvalor is null) then
                totdetvalor = 0;
            select sum (NOCO_VALOR*(-1)) from NOMINA_CONCEPTOS N, conceptos_nomina C
                where (TERC_NIT = :nitempl and NOCO_ENTIDAD = :nit and NOCO_APORTE = 'S' and (nomi_id = :id_nomina_1 or (nomi_id = :id_nomina_2) or (nomi_id = :id_nomina_3) or (nomi_id = :id_nomina_4) or (nomi_id = :id_nomina_5) or (nomi_id = :id_nomina_6) or (nomi_id = :id_nomina_7))
                AND noco_valor < 0 and (N.conc_cod = 912 or (N.conc_cod = 913)or (N.conc_cod = 937)))
                into :totdetvalorneg;
            if (totdetvalorneg is null) then
                totdetvalorneg = 0;
            totdetvalor = :totdetvalorneg + :totdetvalor;
            if ((:totdetvalor is not null) and (:totibc is not null) and totdetvalor <> 0) then
                begin
                insert into PAGO_APORTES_DETALLE (pgap_id, pgap_item, pade_itemdet, terc_nit, pade_ibc, pade_cotobl, pade_tipap)
                    values(:idaporte, :itemaportadmi, :itemdetaport, :nitempl, :totibc, :totdetvalor,'AFC');    itemdetaport = :itemdetaport + 1;
                totdetvalor = 0;
                end
            end
        end
    if (ARP = 'S') then
        begin
        for select TERC_NIT from EMPLEADOS E where EMPL_ARP = :NIT AND E.terc_nit IN (SELECT NC.terc_nit FROM NOMINA_CONCEPTOS NC WHERE (nomi_id = :id_nomina_1 or (nomi_id = :id_nomina_2) or (nomi_id = :id_nomina_3) or (nomi_id = :id_nomina_4) or (nomi_id = :id_nomina_5) or (nomi_id = :id_nomina_6) or (nomi_id = :id_nomina_7))) into :nitempl
            do
            begin
            select sum (NOCO_VALOR) from NOMINA_CONCEPTOS N, conceptos_nomina C
                where (TERC_NIT = :nitempl and NOCO_SALARIO = 'S' and (nomi_id = :id_nomina_1 or (nomi_id = :id_nomina_2) or (nomi_id = :id_nomina_3) or (nomi_id = :id_nomina_4) or (nomi_id = :id_nomina_5) or (nomi_id = :id_nomina_6) or (nomi_id = :id_nomina_7)))
                into :totibc;
            select sum (NOCO_VALOR) from NOMINA_CONCEPTOS N, conceptos_nomina C
                where (TERC_NIT = :nitempl and NOCO_APORTE = 'S' and (nomi_id = :id_nomina_1 or (nomi_id = :id_nomina_2) or (nomi_id = :id_nomina_3) or (nomi_id = :id_nomina_4) or (nomi_id = :id_nomina_5) or (nomi_id = :id_nomina_6) or (nomi_id = :id_nomina_7))
                AND noco_valor > 0 and (N.conc_cod = 908 or (N.conc_cod = 909) or (N.conc_cod = 935)))
                into :totdetvalor;
            if (totdetvalor is null) then
                totdetvalor = 0;
            select sum (NOCO_VALOR*(-1)) from NOMINA_CONCEPTOS N, conceptos_nomina C
                where (TERC_NIT = :nitempl and NOCO_APORTE = 'S' and (nomi_id = :id_nomina_1 or (nomi_id = :id_nomina_2) or (nomi_id = :id_nomina_3) or (nomi_id = :id_nomina_4) or (nomi_id = :id_nomina_5) or (nomi_id = :id_nomina_6) or (nomi_id = :id_nomina_7))
                AND noco_valor < 0 and (N.conc_cod = 908 or (N.conc_cod = 909)or (N.conc_cod = 935)))
                into :totdetvalorneg;
            if (totdetvalorneg is null) then
                totdetvalorneg = 0;
            totdetvalor = :totdetvalorneg + :totdetvalor;
            if ((:totdetvalor is not null) and (:totibc is not null) and totdetvalor <> 0) then
                begin
                insert into PAGO_APORTES_DETALLE (pgap_id, pgap_item, pade_itemdet, terc_nit, pade_ibc, pade_cotobl, pade_tipap)
                    values(:idaporte, :itemaportadmi, :itemdetaport, :nitempl, :totibc, :totdetvalor,'ARP');    itemdetaport = :itemdetaport + 1;
                totdetvalor = 0;
                end
            end
        end
    if (totadmin IS NOT NULL) then
        itemaportadmi = :itemaportadmi + 1;
    itemdetaport = 1;
    END
  SUSPEND;
  end
end
^

SET TERM ; ^


/* 20100902 */
grant select, delete, insert, update on nomina_novedades_detalle to PUBLIC;
grant select, delete, insert, update on nomina_valor_predet to PUBLIC;
grant select, delete, insert, update on nomina_cartera to PUBLIC;
grant select, delete, insert, update on movimiento_salario_empleado to PUBLIC;
grant select, delete, insert, update on pago_aportes_empleados to PUBLIC;
grant select, delete, insert, update on nomina_valor_predet to PUBLIC;


/* 20100916 */
/* NO TOMABA LOS DIAS DE NOVEDADES_DETALLE SI NO DEL ENCABEZADO */
SET TERM ^ ;

CREATE OR ALTER PROCEDURE DIAS_LABORADOS(
    NITEMPL VARCHAR(20),
    PERIODO INTEGER,
    FEC DATE,
    MENSUAL CHAR(1),
    APORTE CHAR(1))
RETURNS (
    TOTALDIASLAB INTEGER)
AS
declare variable diasnolab integer;
declare variable diaslabxper integer;
declare variable perpago integer;
declare variable fecing date;
declare variable diasfec integer;
declare variable diasing integer;
declare variable existe char(1);
BEGIN
SELECT E.empl_ppago, E.empl_fecing
FROM EMPLEADOS E WHERE TERC_NIT = :nitempl
INTO :perpago, :fecing;
IF (mensual = 'N') THEN
    BEGIN
    IF (perpago = 1) THEN
        diaslabxper = 30;
    ELSE
        IF (perpago = 2) THEN
            diaslabxper = 15;
        ELSE
            IF (perpago = 3) THEN
                diaslabxper = 7;
    END
ELSE
    diaslabxper = 30;
if (perpago = 2) then
    BEGIN
    IF (SUBSTR(fecing,1,7) = SUBSTR(FEC,1,7)) THEN
        BEGIN
        diasfec = CAST(substr(fec,9,10) AS INTEGER);
        diasing = CAST(substr(fecing,9,10) AS INTEGER);
        diaslabxper = (diasfec - diasing)+1;
        IF ((diaslabxper > 15) AND (perpago = 2)) THEN
            diaslabxper = 15;
        END
    END
ELSE
    if (perpago = 1) then
        BEGIN
        IF (SUBSTR(fecing,1,7) = SUBSTR(FEC,1,7)) THEN
            BEGIN
            diasfec = CAST(substr(fec,9,10) AS INTEGER);
            diasing = CAST(substr(fecing,9,10) AS INTEGER);
            diaslabxper = (diasfec - diasing)+1;
            IF ((diaslabxper > 30) AND (perpago = 1)) THEN
                diaslabxper = 30;
            END
        END
IF (mensual = 'S') THEN
    BEGIN
    SELECT MAX('S') FROM nomina_novedades N, nomina_novedades_detalle ND
        WHERE N.nono_id = ND.nono_id AND N.TERC_NIT = :nitempl AND (N.TNOV_COD = 9 or (N.tnov_cod = 2) or (N.tnov_cod = 3))
        AND ((ND.nnde_periodo = :periodo) or (ND.nnde_periodo = :periodo - 1)) AND ND.nnde_ano = substr(:fec,1,4)
        INTO :existe;
    IF ((aporte = 'N' ) OR (:existe = 'S'))  THEN
        BEGIN
        SELECT SUM (ND.nnde_duracion)
            FROM nomina_novedades N,  nomina_novedades_detalle ND WHERE N.nono_id = ND.nono_id AND
            TERC_NIT = :nitempl AND (N.TNOV_COD = 9 OR (N.TNOV_COD = 6) OR (N.TNOV_COD = 2) OR (N.TNOV_COD =3) OR (N.TNOV_COD = 4)  )
            AND ((ND.nnde_periodo = :periodo) or (ND.nnde_periodo = :periodo - 1)) AND ND.nnde_ano  = substr(:FEC,1,4)
            INTO :diasnolab;
        if (diasnolab IS NULL) then
            diasnolab = 0;
        if (diaslabxper >= diasnolab) then
            diaslabxper =  :diaslabxper - :diasnolab;
        ELSE
            diaslabxper = 0;
        END
    if (diaslabxper IS NOT NULL) then
        totaldiaslab =  :diaslabxper;
    ELSE
        totaldiaslab = 0;
    SUSPEND;
    END
ELSE
    BEGIN
    SELECT MAX('S') FROM nomina_novedades N, nomina_novedades_detalle ND
        WHERE N.nono_id = ND.nono_id AND N.TERC_NIT = :nitempl AND (N.TNOV_COD = 9 or (N.tnov_cod = 2) or (N.tnov_cod = 3) or (N.tnov_cod = 6))
        AND ND.nnde_periodo = :periodo AND ND.nnde_ano  = substr(:FEC,1,4)
        INTO :existe;
    IF ((aporte = 'N' ) OR (:existe = 'S'))  THEN
        BEGIN
        SELECT SUM (ND.nnde_duracion)
            FROM nomina_novedades N, nomina_novedades_detalle nd
            WHERE N.nono_id = ND.nono_id AND N.TERC_NIT = :nitempl AND (TNOV_COD = 9 OR (TNOV_COD = 6) OR (TNOV_COD = 2) OR (TNOV_COD =3) OR (TNOV_COD = 4)  )
            AND ND.nnde_periodo = :periodo AND ND.nnde_ano  = substr(:FEC,1,4)
            INTO :diasnolab;
        if (diasnolab IS NULL) then
            diasnolab = 0;
        if (diaslabxper >= diasnolab) then
            diaslabxper =  :diaslabxper - :diasnolab;
        ELSE
            diaslabxper = 0;
        END
    if (diaslabxper IS NOT NULL) then
        totaldiaslab =  :diaslabxper;
    ELSE
        totaldiaslab = 0;
    SUSPEND;
    END
END

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE CAUSA_NOMINA(
    FEC DATE,
    PERIODO INTEGER,
    PERIODICIDAD INTEGER,
    PAGOGLOBAL CHAR(1),
    ANO CHAR(4),
    DEPTO INTEGER)
RETURNS (
    IDNOMINA INTEGER,
    ITEMINI INTEGER)
AS
declare variable item integer;
declare variable nite varchar(20);
declare variable nit_tercero varchar(20);
declare variable concept integer;
declare variable montos numeric(18,2);
declare variable porcen numeric(9,4);
declare variable entidad varchar(20);
declare variable conc_cod integer;
declare variable conc_deduc char(1);
declare variable conc_porc numeric(9,4);
declare variable conc_entidad integer;
declare variable conc_monto numeric(18,2);
declare variable conc_modifi char(1);
declare variable conc_promedio char(1);
declare variable valor numeric(18,2);
declare variable diaslab integer;
declare variable conc_prov char(1);
declare variable conc_aporte char(1);
declare variable numeroprom integer;
declare variable conc_aplicaprom char(1);
declare variable perinicial integer;
declare variable perfinal integer;
declare variable anoini integer;
declare variable anofin integer;
declare variable conc_dias char(1);
declare variable conc_otroconc char(1);
declare variable conc_codotroconc integer;
declare variable anosum integer;
declare variable salario char(1);
declare variable liquidaper integer;
declare variable basico numeric(18,2);
declare variable niteps varchar(20);
declare variable nitafc varchar(20);
declare variable nitafp varchar(20);
declare variable nitccf varchar(20);
declare variable gtoempr char(1);
declare variable comision numeric(18,2);
declare variable cambsaltrans numeric(18,2);
declare variable saldosini numeric(18,2);
declare variable duranov integer;
declare variable base numeric(18,2);
declare variable aprox integer;
declare variable mensual char(1);
declare variable horasex numeric(18,2);
declare variable diasnov integer;
declare variable tomasal integer;
declare variable retroact numeric(18,2);
declare variable reembolso numeric(18,2);
declare variable incap numeric(18,2);
declare variable auxtrans numeric(18,2);
declare variable smlv numeric(18,2);
declare variable beneficios numeric(18,2);
declare variable confirmado char(1);
declare variable recnoct numeric(18,2);
declare variable recfest numeric(18,2);
declare variable tar_recnotc numeric(9,4);
declare variable tar_recfest numeric(9,4);
declare variable recargo numeric(18,2);
declare variable basicorec numeric(18,2);
declare variable parambenef char(2);
declare variable vacacdisf numeric(18,2);
declare variable valorpredet numeric(18,2);
declare variable basicoemp numeric(18,2);
declare variable salinteg char(1);
declare variable tar_salinteg numeric(9,4);
begin
execute procedure LEE_CONFIGURACION('NOMINA','LIQUIDACION','TOMAR BENEFICIOS PARA CALCULAR PROVISIONES')returning_values(:PARAMBENEF);
execute procedure LEE_CONFIGURACION('NOMINA','GENERAL','REDONDEO AL MULTIPLO DE DIEZ EN TOTALES')returning_values(:APROX);
select N.NOMI_ID, N.NOMI_LIQOK from NOMINA N where N.NOMI_PERIODO = :PERIODO and N.NOMI_PERIODOCIDAD = :PERIODICIDAD
    and N.NOMI_ANO = :ANO into :IDNOMINA, :CONFIRMADO;
if (:IDNOMINA is null) then
    begin
    execute procedure CAMBIE_ID_NOMINA returning_values(:IDNOMINA);
    insert into NOMINA (NOMI_ID, NOMI_FECCAUSA, NOMI_PAGOGLOBAL, NOMI_PERIODOCIDAD, NOMI_PERIODO, NOMI_ANO, NOMI_LIQOK)
    values (:IDNOMINA, :FEC,:PAGOGLOBAL, :PERIODICIDAD, :PERIODO, :ANO, 'N');
    ITEM = 1;
    end
else
    begin
    select max(N.NOCO_ITEM) from NOMINA_CONCEPTOS N where N.NOMI_ID = :IDNOMINA
    into :ITEM;
    end
if ((CONFIRMADO = 'S') and (IDNOMINA is not null)) then
    begin
    IDNOMINA = 0;
    end
else
    begin
    insert into NOMINA_DEPARTAMENTO (NOMI_ID, NODP_DEPTO)values(:IDNOMINA,:DEPTO);
    select P.PAAN_RECNOC, P.PAAN_RECFEST, P.paan_salinteg from PARAMETROS_ANO P where P.PAAN_ANO = :ANO
        into :TAR_RECNOTC, :TAR_RECFEST, TAR_SALINTEG;
    ITEMINI = ITEM;
    for select E.TERC_NIT, E.EMPL_EPS, E.EMPL_AFC, E.EMPL_AFP, E.EMPL_CCF, E.empl_salinteg
        from EMPLEADOS E
        where E.EMPL_PPAGO = :PERIODICIDAD and ((E.EMPL_FECRET is null) or (E.EMPL_FECRET > :FEC)) and E.EMPL_FECING <= :FEC
        and ((:DEPTO = 0) or (e.empl_dpto = :DEPTO))
        into :NITE, :NITEPS, :NITAFC, :NITAFP, :NITCCF, :SALINTEG
        do
        begin
        select first 1 M.MVSE_SALARIO from MOVIMIENTO_SALARIO_EMPLEADO M where M.TERC_NIT = :NITE and M.MVSE_FECHA <= :FEC order by M.MVSE_FECHA desc into :BASICOEMP;
        BASICO = BASICOEMP;
        RECNOCT = null;
        RECFEST = null;
        select N.NOEX_RECNOCT, N.NOEX_RECFEST
            from NOMINA_HORASEXT N where N.NOEX_PERIODIO = :PERIODO and N.NOEX_ANO = :ANO and N.TERC_NIT = :NITE
            into :RECNOCT, :RECFEST;
        if (RECNOCT is null) then
            RECNOCT = 0;
        if (RECFEST is null) then
            RECFEST = 0;
        for select CE.TERC_NIT, CE.CONC_COD, CE.EMCO_MONTO, CE.EMCO_PORC, CE.EMPL_ENTIDAD, CE.EMCO_PERPROM, CE.EMCO_LUQUIDAPER, CE.EMCO_MENSUAL, CN.CONC_COD, CN.CONC_DEDUC,CN.CONC_PORC, CN.CONC_ENTIDAD, CN.CONC_MONTO,  CN.CONC_DIAS, CN.CONC_MODIFI,
            CN.CONC_PROMEDIO, CN.CONC_SALARIO, CN.CONC_PROV, CN.CONC_APORTE, CN.CONC_APLICAPROM, CN.CONC_OTROCONC, CN.CONC_CODOTROCONC, CN.CONC_GTOEMPR, CN.CONC_BASE, CE.EMCO_TOMSAL
            from EMPLEADO_CONCEPTOS CE, CONCEPTOS_NOMINA CN where (CE.CONC_COD = CN.CONC_COD) and (CE.TERC_NIT = :NITE) and
            ( ((CE.EMCO_FECINI <= :FEC and CE.EMCO_FECFIN >= :FEC)) or
            ((CN.CONC_TODOSPER = 'N') and (CE.EMCO_PPAGO = :PERIODO)) or ((CN.CONC_TODOSPER = 'S') AND (((:periodicidad = 1) AND (:PERIODO < 13)) or ((:periodicidad = 2) AND (:PERIODO < 25)))) )  order by (TERC_NIT )
            into :NIT_TERCERO, :CONCEPT,  :MONTOS, :PORCEN, :ENTIDAD, :NUMEROPROM, :LIQUIDAPER, :MENSUAL ,:CONC_COD, :CONC_DEDUC, :CONC_PORC,
            :CONC_ENTIDAD, :CONC_MONTO, :CONC_DIAS, :CONC_MODIFI,:CONC_PROMEDIO, :SALARIO,:CONC_PROV, :CONC_APORTE , :CONC_APLICAPROM, :CONC_OTROCONC, :CONC_CODOTROCONC, :GTOEMPR, :BASE, :TOMASAL
            do
            begin
            if (CONC_DIAS = 'S') then
                execute procedure DIAS_LABORADOS (:NITE, :PERIODO, :FEC, :MENSUAL,:CONC_APORTE) returning_values (:DIASLAB);
            else
                BEGIN
                SELECT PPAG_DIAS FROM PERIODO_PAGO WHERE PPAG_COD = :periodicidad INTO :diaslab;
                END
            if (:TOMASAL <> 0) then
                begin
                /* SI EL CONCEPTO NOAPLICA EN ESTE PERIODO DEJE EL BASICO EN CERO */
                if ((:PERIODICIDAD = 2) and (:TOMASAL <> 2)) then
                    begin
                    if ((PERIODO = 2) or (PERIODO = 4) or (PERIODO = 6) or (PERIODO = 8) or (PERIODO = 10) or (PERIODO = 12)
                        or (PERIODO = 14) or (PERIODO = 16) or (PERIODO = 18) or (PERIODO = 20) or (PERIODO = 22) or (PERIODO = 24)) then
                        BASICO = 0;
                    end
                else
                    if ((:PERIODICIDAD = 3) and (:TOMASAL <> 1)) then
                        begin
                        if ((PERIODO = 1) or (PERIODO = 5) or (PERIODO = 9) or (PERIODO = 13) or (PERIODO = 17) or (PERIODO = 21)
                            or (PERIODO = 25) or (PERIODO = 29) or (PERIODO = 33) or (PERIODO = 37) or (PERIODO = 41) or (PERIODO = 45)
                            or (PERIODO = 49)) then
                            BASICO = 0;
                        end
                    else
                        if ((:PERIODICIDAD = 3) and (:TOMASAL <> 2)) then
                            begin
                            if ((PERIODO = 2) or (PERIODO = 6) or (PERIODO = 10) or (PERIODO = 14) or (PERIODO = 18) or (PERIODO = 22)
                                or (PERIODO = 26) or (PERIODO = 30) or (PERIODO = 34) or (PERIODO = 38) or (PERIODO = 42) or (PERIODO = 46)
                                or (PERIODO = 50)) then
                                BASICO = 0;
                            end
                        else
                            if ((:PERIODICIDAD = 3) and (:TOMASAL <> 3)) then
                                begin
                                if ((PERIODO = 3) or (PERIODO = 7) or (PERIODO = 11) or (PERIODO = 15) or (PERIODO = 19) or (PERIODO = 23)
                                    or (PERIODO = 27) or (PERIODO = 31) or (PERIODO = 35) or (PERIODO = 39) or (PERIODO = 43) or (PERIODO = 47)
                                    or (PERIODO = 51)) then
                                    BASICO = 0;
                                end
                            else
                                if ((:PERIODICIDAD = 3) and (:TOMASAL <> 4)) then
                                begin
                                if ((PERIODO = 4) or (PERIODO = 8) or (PERIODO = 12) or (PERIODO = 16) or (PERIODO = 20) or (PERIODO = 24)
                                    or (PERIODO = 29) or (PERIODO = 32) or (PERIODO = 36) or (PERIODO = 40) or (PERIODO = 44) or (PERIODO = 48)
                                    or (PERIODO = 52)) then
                                    BASICO = 0;
                                end
                end
            else
                begin
                /* SE CALCULA SOBRE TODOS LOS PERIODOS */
                BASICO = BASICOEMP;
                end
            VALORPREDET = null;
            select VP.NVPR_MONTO from NOMINA_VALOR_PREDET VP where VP.NVPR_PERIODICIDAD = :PERIODICIDAD and VP.NVPR_PERIODO = :PERIODO and VP.NVPR_ANO = :ANO and VP.CONC_COD = :CONC_COD and VP.TERC_NIT = :NITE
                into :VALORPREDET;
            if ((:VALORPREDET <> 0) and (VALORPREDET is not null)) then
                VALOR = VALORPREDET;
            else
                begin
                /* SI HAY UN CAMBIO TRANSITORIO DE SALARIO AJUSTE LOS DIAS Y CALCULE EL VALOR A SUMAR */
                select SUM((N.NONO_VALOR /30) * ND.NNDE_DURACION), SUM(ND.NNDE_DURACION) from NOMINA_NOVEDADES N, nomina_novedades_detalle ND
                    where N.nono_id = ND.nono_id AND N.TNOV_COD = 11 and N.TERC_NIT = :NITE and ND.NNDE_PERIODO = :PERIODO
                    into :CAMBSALTRANS, :DURANOV;
                if (CAMBSALTRANS is null) then
                    CAMBSALTRANS = 0;
                if (DURANOV is null) then
                    DURANOV = 0;
                DIASLAB = :DIASLAB - :DURANOV;
                /* SI ES UN PRESTAMO, TRAIGA LA CUOTA */
                if (CONC_COD = 922) then
                    begin
                    select sum(P.PRCU_MONTO) from PRESTAMO_CUOTAS P, PRESTAMO_NOMINA PN
                        where P.PRCU_ANO = :ANO and P.PRCU_PERIODO = :PERIODO and PN.PRNO_ID = P.PRNO_ID and PN.TERC_NIT = :NITE into :VALOR;
                    if (VALOR is null) then
                        VALOR = 0;
                    ITEM = :ITEM + 1;
                    /* MARQUE LA CUOTA COMO PAGADA */
                    update PRESTAMO_CUOTAS  P set PRCU_OK = 'S' where P.PRCU_ANO = :ANO and P.PRCU_PERIODO = :PERIODO
                        and exists (select PRNO_ID from PRESTAMO_NOMINA where TERC_NIT = :NITE and PRNO_ID = P.prno_id);
                    end
                else
                    if ((:MONTOS = 0) or (:MONTOS is null)) then
                        begin
                        /* SI EL CONCEPTO DEL EMPLEADO NO TIENE MONTO TRAIGA EL DE CONCEPTOS_NOMINA */
                        if ((CONC_PORC = 0 and :PORCEN = 0) or (CONC_PORC is null and :PORCEN = 0) or (CONC_PORC = 0 and :PORCEN is null) or (CONC_PORC is null and :PORCEN is null) ) then
                            begin
                            /* SIN PORCENTAJE */
                            if ((CONC_MONTO <> 0) and (CONC_MONTO is not null) ) then
                                begin
                                VALOR = :CONC_MONTO;
                                if (:CONC_DIAS = 'S') then
                                    VALOR = (:VALOR / 30) * :DIASLAB;
                                end
                            else
                                if (SALARIO = 'S' and CONC_COD <> 900 and CONC_COD <> 920 and CONC_COD <> 932 and CONC_COD <> 953) then
                                    begin
                                    /* SI ES SALARIO SUME LAS EXTRAS */
                                    BASICO = BASICOEMP;
                                    BASICO = ((:BASICO/30)*:DIASLAB);/* - (((:BASICO/30)/8)*:RECNOCT);/* PFP:DEBERIA SER + Y POR LA TARIFA QUE NO VEO POR NINGUN LADO
                                    BASICO = :BASICO - (((:BASICO/30)/8)*:RECFEST);*/
                                    CONC_MONTO = :BASICO;
                                    VALOR = (:CONC_MONTO/*/30 * :diaslab*/ ) + :CAMBSALTRANS;
                                    end
                                else
                                    begin
                                    VALOR = MONTOS;
                                    if (:CONC_DIAS = 'S') then
                                        VALOR = (:VALOR / 30) * :DIASLAB;
                                    end
                            end
                        else    
                            begin
                            if (:PORCEN <> 0) then
                                begin
                                /* SI TIENE PORCENTAJE EN EMPLEADO_CONCEPTOS PERO EL MONTO SE TRAE DE CONCPETOS_NOMINA */
                                if ((CONC_MONTO <> 0) and (CONC_MONTO is not null) ) then
                                    begin
                                    VALOR = ((:CONC_MONTO ) * :PORCEN) /100;
                                    end
                                end
                            else
                                begin
                                /* NO TIENE PORCENTAJE EN EMPLEADO_CONCEPTOS SE TRAE MONTO Y PORC DE CONCPETOS_NOMINA */
                                if ((CONC_MONTO <> 0) and (CONC_MONTO is not null) ) then
                                    begin
                                    VALOR = ((:CONC_MONTO) * :CONC_PORC) /100;
                                    end
                                else
                                    if (SALARIO = 'S' and CONC_COD <> 900 and CONC_COD <> 920 and CONC_COD <> 932 and CONC_COD <> 953) then
                                        begin
                                        BASICO = BASICOEMP;
                                        BASICO = ((:BASICO/30)*:DIASLAB); /* - (((:BASICO/30)/8)*:RECNOCT);
                                        BASICO = :BASICO - (((:BASICO/30)/8)*:RECFEST);*/
                                        CONC_MONTO = :BASICO;
                                        VALOR = ((:CONC_MONTO)+ :CAMBSALTRANS * :CONC_PORC) /100;
                                        end
                                    else
                                        if (:CONC_MONTO = 0 and :MONTOS = 0) then
                                            begin
                                            CONC_MONTO = :BASICO;
                                            VALOR = (((:CONC_MONTO / 30) * :DIASLAB) + :CAMBSALTRANS * :CONC_PORC) /100;
                                            end
                                end
                            end
                        end
                    else
                        /* SI TIENE MONTO EN EMPLEADO_CONCEPTOS */
                        if ((CONC_PORC = 0 or (CONC_PORC is null)) and (:PORCEN = 0 or (PORCEN is null))) then
                            begin
                            VALOR = (:MONTOS);
                            if (:CONC_DIAS = 'S') then
                                VALOR = (:VALOR / 30) * :DIASLAB;   
                            end
                        else
                            if (:PORCEN <> 0 and PORCEN is not null) then
                                begin
                                VALOR = ((:MONTOS ) * :PORCEN) /100;
                                end
                            else
                                begin
                                VALOR = ((:MONTOS) * :CONC_PORC) /100;
                                end
                if (CONC_PROMEDIO = 'S') then
                    begin
                    /* CALCULO DEL PROMEDIO BASE DESDE LA FECHA MENOS EL NUMERO DE PERIODOS */
                    EXECUTE PROCEDURE periodo_nom_fecha (:fec, :periodicidad) returning_values (:perfinal, :anofin);
                    if (perfinal < numeroprom) then
                        BEGIN
                        anoini = anofin - 1;
                        if (periodicidad = 1) then
                            perinicial = 12 - (numeroprom - perfinal) + 1;
                        if (periodicidad = 2) then
                            perinicial = 24 - (numeroprom - perfinal) + 1;
                        if (periodicidad = 3) then
                            perinicial = 52 - (numeroprom - perfinal) + 1;
                        END
                    ELSE
                        BEGIN
                        PERINICIAL = :perfinal - :NUMEROPROM + 1;
                        anoini = ANOFIN;
                        END
                    if (anoini <> anofin) then
                        select sum (NOCO_VALOR) from NOMINA_CONCEPTOS N where N.NOCO_APLICAPROM = 'S' and
                            ((N.NOCO_PERIODO >= :PERINICIAL and N.NOCO_ANO = :anoini) or
                            (N.NOCO_PERIODO <= :perfinal and N.NOCO_ANO = :anofin)) and TERC_NIT = :NITE into :VALOR;
                    else
                        select sum (NOCO_VALOR) from NOMINA_CONCEPTOS N where N.NOCO_APLICAPROM = 'S' and
                            N.NOCO_PERIODO >= :PERINICIAL and N.NOCO_ANO = :anoini
                            and N.NOCO_PERIODO <= :perfinal and TERC_NIT = :NITE into :VALOR;
                    /* sume el saldo inicial */
                    SALDOSINI = 0;
                    select NOCO_VALOR from NOMINA_CONCEPTOS where CONC_COD = :CONC_COD and TERC_NIT  = :NITE and NOCO_PAGOOK = 'N' and NOCO_PERIODO = 0 into :SALDOSINI;
                    if (SALDOSINI is null) then
                        SALDOSINI = 0;
                    else
                        update NOMINA_CONCEPTOS N set NOCO_PAGOOK = 'S' where N.NOCO_APLICAPROM = 'S' and
                            CONC_COD = :CONC_COD and TERC_NIT = :NITE and NOCO_PERIODO = 0;

                    VALOR = :VALOR + :SALDOSINI;
                    /* APLIQUE LA PROPORCION Y EL PORCENTAJE */
                    VALOR = VALOR / NUMEROPROM;
                    VALOR = VALOR * PORCEN / 100;
                    end
                else if (CONC_OTROCONC = 'S') then
                    begin
                    ANOSUM = cast(ANO as integer);
                    ANOSUM = ANOSUM - 1;
                    select sum (NOCO_VALOR) from NOMINA_CONCEPTOS N where N.NOCO_ANO = :ANOSUM and N.CONC_COD = :CONC_CODOTROCONC and N.TERC_NIT = :NITE into :VALOR;
                    select NOCO_VALOR from NOMINA_CONCEPTOS where NOCO_ANO = :ANOSUM and CONC_COD = :CONC_CODOTROCONC and TERC_NIT = :NITE and NOCO_PERIODO = 0 into :SALDOSINI;
                    if (SALDOSINI is null) then
                        SALDOSINI = 0;
                    else
                        update NOMINA_CONCEPTOS set NOCO_PAGOOK = 'S' where NOCO_ANO = :ANOSUM and CONC_COD = :CONC_CODOTROCONC and NOCO_PERIODO = 0 and TERC_NIT = :NITE;
                    VALOR = :VALOR + :SALDOSINI;
                    update NOMINA_CONCEPTOS set NOCO_PAGOOK = 'S' where NOCO_ANO = :ANOSUM and CONC_COD = :CONC_CODOTROCONC and TERC_NIT = :NITE;
                    end
                else if (CONC_APORTE = 'S') then
                    begin
                    HORASEX = null;
                    DIASNOV = null;
                    RETROACT = null;
                    REEMBOLSO = null;
                    BENEFICIOS = null;
                    RECARGO = null;
                    COMISION = null;
                    INCAP = null;
                    VACACDISF = null;
                    if ((:ENTIDAD = '' ) or (ENTIDAD is null)) then
                        begin
                        /*COMISIONES*/
                        if (MENSUAL = 'S') then
                            BEGIN
                            if (PERIODICIDAD = 1) then
                                BEGIN
                                perinicial = PERIODO;
                                PERFINAL = PERIODO;
                                END
                            if (PERIODICIDAD = 2) then
                                BEGIN
                                perinicial = PERIODO - (LIQUIDAPER - 1);
                                PERFINAL = PERIODO + (2 - LIQUIDAPER);
                                END
                            if (PERIODICIDAD = 3) then
                                BEGIN
                                perinicial = PERIODO - (LIQUIDAPER - 1);
                                PERFINAL = PERIODO + (4 - LIQUIDAPER);
                                END
                            END
                        ELSE
                            BEGIN
                            perinicial = PERIODO;
                            PERFINAL = PERIODO;
                            END
                            
                        /* SUME LAS COMISIONES DE LOS DEMAS PERIODOS DEL MES */
                        select SUM(C.NCOM_MONTO) from NOMINA_COMISIONES C where C.NCOM_ANO = :ANO
                            and C.NCOM_PERIODO >= :PERINICIAL AND C.NCOM_PERIODO <= :PERFINAL
                            and C.NCOM_PERIODICIDAD = :PERIODICIDAD and C.TERC_NIT = :NITE
                            into :COMISION;
                        if (COMISION is null) then
                            COMISION = 0;
                        /*RETROACTIVO*/
                        select C.EMCO_MONTO from EMPLEADO_CONCEPTOS C where C.TERC_NIT = :NITE
                            and C.CONC_COD = 933 into :RETROACT;
                            if (RETROACT is null ) then
                                RETROACT = 0;
                        /*REEMBOLSO*/
                        select C.EMCO_MONTO from EMPLEADO_CONCEPTOS C where C.TERC_NIT = :NITE
                            and C.CONC_COD = 952 into :REEMBOLSO;
                        if (REEMBOLSO is null ) then
                            REEMBOLSO = 0;
                        /*VACACIONES DISFRUTADAS ANTERIORMENTE*/
                        select C.EMCO_MONTO from EMPLEADO_CONCEPTOS C where C.TERC_NIT = :NITE
                            and C.CONC_COD = 955 into :VACACDISF;
                        if (VACACDISF is null ) then
                            VACACDISF = 0;
                        /* INCAPACIDAD*/
                        select SUM(ND.NNDE_DURACION) from NOMINA_NOVEDADES N, nomina_novedades_detalle ND
                            where N.nono_id = ND.nono_id AND N.TERC_NIT = :NITE
                            and ND.NNDE_PERIODO >= :perinicial and ND.NNDE_PERIODO <= :perfinal and ND.NNDE_ANO = :ANO and (N.TNOV_COD = 2 or (N.TNOV_COD = 3))
                            into :DIASNOV;
                        if (:DIASNOV is null) then
                            INCAP = 0;
                        else
                            INCAP = (:BASICO / 30)* :DIASNOV;
                        /*BASICO*/
                        if (SALINTEG = 'S') then
                            BASICO = BASICO * (tar_salinteg / 100);

                        if (MENSUAL <> 'S') then
                            BASICO = ((:BASICO/30)*:DIASLAB);
                        /*HORAS EXTRA*/
                        select SUM(C.NOEX_MONTO) from NOMINA_HORASEXT C where C.NOEX_ANO = :ANO
                            and C.NOEX_PERIODIO >= :PERINICIAL and C.NOEX_PERIODIO <= :PERFINAL
                            and C.NOEX_PERIODICIDAD = :PERIODICIDAD and C.TERC_NIT = :NITE
                            into :HORASEX;
                        if (HORASEX is null) then
                            HORASEX = 0;
                        /*RECARGOS*/
                        BASICOREC = BASICOEMP;
                        RECARGO = (((:BASICOREC/30)/8)*:TAR_RECNOTC)*:RECNOCT;
                        RECARGO = :RECARGO + ((((:BASICOREC/30)/8)*:TAR_RECFEST)*:RECFEST);
                        if (RECARGO is null) then
                            RECARGO = 0;
                        /*basico*/
                        if (MENSUAL <> 'S') then
                            begin
                            if (:BASICO + :COMISION + :HORASEX + :RETROACT+ :REEMBOLSO + :INCAP+ :CAMBSALTRANS < ((:SMLV/30)*:DIASLAB)) then
                                BASICO = (:SMLV/30)*:DIASLAB;
                            end
                        else
                            begin
                            if (:BASICO + :COMISION + :HORASEX + :RETROACT+ :REEMBOLSO + :INCAP+ :CAMBSALTRANS < :SMLV) then
                                BASICO = :SMLV;
                            end
                        /* SMLV Y AUX. TRANSPORTE*/
                        select P.PAAN_AUXTR, P.PAAN_SALMINIMO from PARAMETROS_ANO P
                            where P.PAAN_ANO = :ANO into :AUXTRANS, :SMLV;
                        /*BASE*/
                        VALOR = :BASICO + :COMISION + :HORASEX + :RETROACT+ :REEMBOLSO + :INCAP + :RECARGO + :CAMBSALTRANS + :VACACDISF;

                        if (CONC_COD = 904) then
                            begin
                            ENTIDAD = :NITAFP;
                            select A.PAAN_AFPTR from PARAMETROS_ANO A where A.PAAN_ANO = :ANO into :PORCEN;
                            VALOR = ((:VALOR) * :PORCEN) /100;
                            end
                        else if ((CONC_COD = 905) or (CONC_COD = 906) or (CONC_COD = 934) ) then
                            begin
                            ENTIDAD = :NITAFP;
                            select A.PAAN_AFPEM from PARAMETROS_ANO A where A.PAAN_ANO = :ANO into :PORCEN;
                            VALOR = ((:VALOR) * :PORCEN) /100;
                            end
                        else if ((CONC_COD = 907) or (CONC_COD = 914) or (CONC_COD = 915) or (conc_cod = 938)) then
                            begin
                            ENTIDAD = :NITEPS;
                            if (CONC_COD = 907) then
                                begin
                                select A.PAAN_EPSTR from PARAMETROS_ANO A where A.PAAN_ANO = :ANO into :PORCEN;
                                VALOR = ((:VALOR) * :PORCEN) /100;
                                end
                            else
                                begin
                                select A.PAAN_EPSEM from PARAMETROS_ANO A where A.PAAN_ANO = :ANO into :PORCEN;
                                    VALOR = ((:VALOR) * :PORCEN) /100;
                                end
                            end
                        else if ((CONC_COD = 910) or (CONC_COD = 911) or (CONC_COD = 936)) then
                            begin
                            /*ccf */
                            ENTIDAD = :NITCCF;
                            select A.PAAN_CCF from PARAMETROS_ANO A where A.PAAN_ANO = :ANO into :PORCEN;
                            VALOR = ((:VALOR) * :PORCEN) /100;
                            end
                        else if ((CONC_COD = 916) or (CONC_COD = 917) or (CONC_COD = 939) ) then
                            begin
                            /*icbf */
                            ENTIDAD = :NITCCF;
                            select A.PAAN_ICBF from PARAMETROS_ANO A where A.PAAN_ANO = :ANO into :PORCEN;
                            VALOR = ((:VALOR) * :PORCEN) /100;
                            end
                        else if ((CONC_COD = 918) or (CONC_COD = 919) or (CONC_COD = 940) ) then
                            begin
                            /*sena */
                            ENTIDAD = :NITCCF;
                            select A.PAAN_SENA from PARAMETROS_ANO A where A.PAAN_ANO = :ANO into :PORCEN;
                            VALOR = ((:VALOR) * :PORCEN) /100;
                            end
                        else if ((CONC_COD = 912) or (CONC_COD = 913) or (CONC_COD = 937)) then
                            begin
                            /* CESANTIAS */
                            ENTIDAD = :NITAFC;
                            if (PARAMBENEF = 'SI') then
                                begin
                                select sum(CE.EMCO_MONTO)
                                    from EMPLEADO_CONCEPTOS CE, CONCEPTOS_NOMINA CN where CN.CONC_BENEFIC = 'S' and (CE.TERC_NIT = :NITE) and (CE.CONC_COD = CN.CONC_COD) and
                                    ((CE.EMCO_FECINI <= :FEC and CE.EMCO_FECFIN >= :FEC) or ((CN.CONC_TODOSPER = 'N') and (CE.EMCO_PPAGO = :PERIODO)) or
                                    (CN.CONC_TODOSPER = 'S'))
                                    into :BENEFICIOS;
                                if (BENEFICIOS is null) then
                                    BENEFICIOS = 0;
                                end
                            else
                                BENEFICIOS = 0;
                            select P.PAAN_AUXTR, P.PAAN_SALMINIMO from PARAMETROS_ANO P
                                where P.PAAN_ANO = :ANO into :AUXTRANS, :SMLV;
                            if (:BASICO < (:SMLV*2)) then
                                AUXTRANS = (:AUXTRANS / 30) * :DIASLAB;
                            else
                                AUXTRANS = 0;
                            select A.PAAN_CESEMP from PARAMETROS_ANO A where A.PAAN_ANO = :ANO
                                into :PORCEN;
                            VALOR = ((:VALOR + :AUXTRANS + :BENEFICIOS) * :PORCEN) /100;
                            end
                        else
                            begin
                            if (COMISION is null) then
                                COMISION = 0;
                            select C.NCOM_MONTO from NOMINA_COMISIONES C where C.NCOM_ANO = :ANO and C.NCOM_PERIODO = :PERIODO and C.NCOM_PERIODICIDAD = :PERIODICIDAD and C.TERC_NIT = :NITE
                                into :COMISION;
                            CONC_MONTO = :BASICO + :COMISION;
                            if (CONC_PORC <> 0 and CONC_PORC is not null) then
                                if (mensual <> 'S') then
                                    VALOR = (((:CONC_MONTO/30 * :DIASLAB )+ :CAMBSALTRANS + :INCAP) * :CONC_PORC) /100;
                                else
                                    VALOR = ((:CONC_MONTO+ :CAMBSALTRANS + :INCAP) * :CONC_PORC) /100;
                            else
                                if (:PORCEN <> 0 and :PORCEN is not null) then
                                    if (mensual <> 'S') then
                                        VALOR = (((:CONC_MONTO/30 * :DIASLAB )+ :CAMBSALTRANS + :INCAP) * :PORCEN) /100;
                                    else
                                        VALOR = ((:CONC_MONTO + :CAMBSALTRANS + :INCAP) * :PORCEN) /100;
                                else
                                    if (:MONTOS <> 0 and :MONTOS is not null) then
                                        VALOR = :MONTOS;
                                    else
                                        if (:CONC_MONTO <> 0 and :CONC_MONTO is not null) then
                                            VALOR = :CONC_MONTO;
                            end
                        ITEM = :ITEM + 1;
                        end
                    end /* aportes */
                else if (CONC_PROV = 'S') then
                    begin
                    /*provisiones */
                    HORASEX = null;
                    DIASNOV = null;
                    RETROACT = null;
                    REEMBOLSO = null;
                    BENEFICIOS = null;
                    RECARGO = null;
                    COMISION = null;
                    INCAP = null;
                    if (MENSUAL = 'S') then
                        BEGIN
                        if (PERIODICIDAD = 1) then
                            BEGIN
                            perinicial = PERIODO;
                            PERFINAL = PERIODO;
                            END
                        if (PERIODICIDAD = 2) then
                            BEGIN
                            perinicial = PERIODO - (LIQUIDAPER - 1);
                            PERFINAL = PERIODO + (2 - LIQUIDAPER);
                            END
                        if (PERIODICIDAD = 3) then
                            BEGIN
                            perinicial = PERIODO - (LIQUIDAPER - 1);
                            PERFINAL = PERIODO + (4 - LIQUIDAPER);
                            END
                        END
                    ELSE
                        BEGIN
                        perinicial = PERIODO;
                        PERFINAL = PERIODO;
                        END
                    /*HORAS EXTRA*/
                    select SUM(C.NOEX_MONTO) from NOMINA_HORASEXT C where C.NOEX_ANO = :ANO
                        and C.NOEX_PERIODIO >= :PERINICIAL and C.NOEX_PERIODIO <= :PERFINAL
                        and C.NOEX_PERIODICIDAD = :PERIODICIDAD and C.TERC_NIT = :NITE
                        into :HORASEX;
                    if (HORASEX is null) then
                        HORASEX = 0;
                    /* RECARGO*/
                    BASICO = BASICOEMP;
                    RECARGO = (((:BASICO/30)/8)*:TAR_RECNOTC)*:RECNOCT;
                    RECARGO = :RECARGO + ((((:BASICO/30)/8)*:TAR_RECFEST)*:RECFEST);
                    /*INCAPACIDAD*/
                    select SUM(ND.NNDE_DURACION) from NOMINA_NOVEDADES N, nomina_novedades_detalle ND
                        where N.nono_id = ND.nono_id AND N.TERC_NIT = :NITE
                        and ND.NNDE_PERIODO >= :perinicial and ND.NNDE_PERIODO <= :perfinal and ND.NNDE_ANO = :ANO
                        and (N.TNOV_COD = 2 or (N.TNOV_COD = 3)) into :DIASNOV;
                    if (:DIASNOV is null) then
                        INCAP = 0;
                    else
                        INCAP = (:BASICO / 30)* :DIASNOV;
                    /* BASICO*/
                    if (mensual <> 'S') then
                        BASICO = ((:BASICO/30)*:DIASLAB);
                    if (SALINTEG = 'S') then
                        BASICO = BASICO * (tar_salinteg / 100);
                    /*BENEFICIOS*/
                    if (PARAMBENEF = 'SI') then
                        begin
                        select sum(CE.EMCO_MONTO)
                            from EMPLEADO_CONCEPTOS CE, CONCEPTOS_NOMINA CN where CN.CONC_BENEFIC = 'S'
                            and (CE.TERC_NIT = :NITE) and (CE.CONC_COD = CN.CONC_COD) and
                            ((CE.EMCO_FECINI <= :FEC and CE.EMCO_FECFIN >= :FEC) or ((CN.CONC_TODOSPER = 'N')
                            and (CE.EMCO_PPAGO = :PERIODO)) or (CN.CONC_TODOSPER = 'S'))
                            into :BENEFICIOS;
                        if (BENEFICIOS is null) then
                            BENEFICIOS = 0;
                        end
                    else
                        BENEFICIOS = 0;
                    if ((CONC_COD <> 929) and (CONC_COD <> 930) and (CONC_COD <> 944)) then
                        begin
                        /* si no es vacaciones */
                        select P.PAAN_AUXTR, P.PAAN_SALMINIMO from PARAMETROS_ANO P where P.PAAN_ANO = :ANO
                            into :AUXTRANS, :SMLV;
                        if (:BASICO < (:SMLV*2)) then
                            begin
                            if (mensual <> 'S') then
                                AUXTRANS = (:AUXTRANS / 30) * :DIASLAB;
                            end
                        else
                            AUXTRANS = 0;
                        end
                    else
                        AUXTRANS = 0;
                    CONC_MONTO = :BASICO;
                    if (CONC_PORC <> 0 and CONC_PORC is not null) then
                        VALOR = ((:CONC_MONTO + :CAMBSALTRANS + :INCAP + :RECARGO + :HORASEX + :AUXTRANS + :BENEFICIOS) * :CONC_PORC) /100;
                    else
                        if (PORCEN <> 0 and PORCEN is not null) then
                            VALOR = ((:CONC_MONTO + :CAMBSALTRANS + :INCAP + :RECARGO + :HORASEX + :AUXTRANS + :BENEFICIOS) * :PORCEN) /100;
                        else
                            if (MONTOS <> 0 and MONTOS is not null) then
                                VALOR = :MONTOS;
                            else
                                if (CONC_MONTO <> 0 and CONC_MONTO is not null) then
                                    VALOR = :CONC_MONTO;
                    ITEM = :ITEM + 1;
                    end /* provision */
                else if (CONC_COD = 920) then /* comisiones */
                    begin
                    select C.NCOM_MONTO from NOMINA_COMISIONES C where C.NCOM_ANO = :ANO
                    and C.NCOM_PERIODO >= :perinicial and C.NCOM_PERIODO <= :perfinal and C.NCOM_PERIODICIDAD = :PERIODICIDAD and C.TERC_NIT = :NITE into :VALOR;
                    if (VALOR is null) then
                        VALOR = 0;
                    ITEM = :ITEM + 1;
                    end
                else if (CONC_COD = 900 or (:CONC_COD = 931)) then /* horas extra */
                    begin
                    select SUM(C.NOEX_MONTO) from NOMINA_HORASEXT C where C.NOEX_ANO = :ANO and
                        C.NOEX_PERIODIO >= :perinicial and C.NOEX_PERIODIO <= :perfinal and C.NOEX_PERIODICIDAD = :PERIODICIDAD and C.TERC_NIT = :NITE into :VALOR;
                    if (VALOR is null) then
                        VALOR = 0;
                    ITEM = :ITEM + 1;
                    end
                else if (CONC_COD = 954) then /* cartera */
                    begin
                    select C.NCAR_MONTO from NOMINA_CARTERA C where C.NCAR_ANO = :ANO
                    and C.NCAR_PERIODO >= :perinicial and C.NCAR_PERIODO <= :perfinal and C.NCAR_PERIODICIDAD = :PERIODICIDAD and C.TERC_NIT = :NITE into :VALOR;
                    if (VALOR is null) then
                        VALOR = 0;
                    ITEM = :ITEM + 1;
                    end
                else if (CONC_COD = 932) then
                    begin
                    /* incapacidad */
                    select SUM(ND.NNDE_DURACION) from NOMINA_NOVEDADES N, nomina_novedades_detalle ND
                        where N.nono_id = ND.nono_id AND N.TERC_NIT = :NITE
                        and ND.NNDE_PERIODO >= :perinicial and ND.NNDE_PERIODO <= :perfinal and ND.NNDE_ANO = :ANO
                        and (N.TNOV_COD = 2 or (N.TNOV_COD = 3)) into :DIASNOV;
                    if (:DIASNOV is null) then
                        VALOR = 0;
                    else
                        VALOR = (:BASICO / 30)* :DIASNOV;
                    end
                else if (CONC_COD = 921) then
                    begin
                    if (PORCEN is not null and PORCEN <> 0) then
                        VALOR = ((BASICO / 30)* :DIASLAB ) * :PORCEN /100;
                    else
                        if (CONC_PORC is not null and CONC_PORC <> 0) then
                            VALOR = ((BASICO / 30)* :DIASLAB ) * :CONC_PORC /100;
                    end
                else if (CONC_COD = 953) then
                    begin
                    /* RECARGO */
                    BASICO = BASICOEMP;
                    VALOR = (((:BASICO/30)/8)*:TAR_RECNOTC)*:RECNOCT;
                    VALOR = :VALOR + ((((:BASICO/30)/8)*:TAR_RECFEST)*:RECFEST);
                    end
                if (CONC_APORTE = 'S') then
                    begin
                    if (ENTIDAD is null or (ENTIDAD = '') ) then
                        ENTIDAD = :CONC_ENTIDAD;
                    end
                end
            if ((VALOR <> 0) and (VALOR is not null)) then
                begin
                execute procedure REDONDEE(:VALOR, :APROX) returning_values (VALOR);
                if ((MENSUAL = 'N') or (PERIODICIDAD = 1))  then
                    insert into NOMINA_CONCEPTOS (NOMI_ID, NOCO_ITEM, CONC_COD,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, NOCO_GTOEMPR)
                        values (:IDNOMINA,:ITEM, :CONCEPT, :NIT_TERCERO, :VALOR, :ENTIDAD, :CONC_DEDUC, :CONC_PROV, :CONC_APORTE, :PERIODO, :ANO, :CONC_MODIFI, :CONC_APLICAPROM, :SALARIO, :GTOEMPR);
                else
                    if (MENSUAL = 'S') then
                        begin
                        if ((:PERIODICIDAD = 2) and (LIQUIDAPER = 1)) then
                            begin
                            if ((PERIODO = 1) or (PERIODO = 3) or (PERIODO = 5) or (PERIODO = 7) or (PERIODO = 9) or (PERIODO = 11)
                                or (PERIODO = 13) or (PERIODO = 15) or (PERIODO = 17) or (PERIODO = 19) or (PERIODO = 21) or (PERIODO = 23)) then
                                insert into NOMINA_CONCEPTOS (NOMI_ID, NOCO_ITEM, CONC_COD,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, NOCO_GTOEMPR)
                                    values (:IDNOMINA,:ITEM, :CONCEPT, :NIT_TERCERO, :VALOR, :ENTIDAD, :CONC_DEDUC, :CONC_PROV, :CONC_APORTE, :PERIODO, :ANO, :CONC_MODIFI, :CONC_APLICAPROM, :SALARIO, :GTOEMPR);
                            end
                        else if ((:PERIODICIDAD = 2) and (LIQUIDAPER = 2)) then
                            begin
                            if ((PERIODO = 2) or (PERIODO = 4) or (PERIODO = 6) or (PERIODO = 8) or (PERIODO = 10) or (PERIODO = 12)
                                or (PERIODO = 14) or (PERIODO = 16) or (PERIODO = 18) or (PERIODO = 20) or (PERIODO = 22) or (PERIODO = 24)) then
                                insert into NOMINA_CONCEPTOS (NOMI_ID, NOCO_ITEM, CONC_COD,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, NOCO_GTOEMPR)
                                    values (:IDNOMINA,:ITEM, :CONCEPT, :NIT_TERCERO, :VALOR, :ENTIDAD, :CONC_DEDUC, :CONC_PROV, :CONC_APORTE, :PERIODO, :ANO, :CONC_MODIFI, :CONC_APLICAPROM, :SALARIO, :GTOEMPR);
                            end
                        else if ((:PERIODICIDAD = 3) and (LIQUIDAPER = 1)) then
                            begin
                            if ((PERIODO = 1) or (PERIODO = 5) or (PERIODO = 9) or (PERIODO = 13) or (PERIODO = 17) or (PERIODO = 21)
                                or (PERIODO = 25) or (PERIODO = 29) or (PERIODO = 33) or (PERIODO = 37) or (PERIODO = 41) or (PERIODO = 45)
                                or (PERIODO = 49)) then
                                insert into NOMINA_CONCEPTOS (NOMI_ID, NOCO_ITEM, CONC_COD,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, NOCO_GTOEMPR)
                                    values (:IDNOMINA,:ITEM, :CONCEPT, :NIT_TERCERO, :VALOR, :ENTIDAD, :CONC_DEDUC, :CONC_PROV, :CONC_APORTE, :PERIODO, :ANO, :CONC_MODIFI, :CONC_APLICAPROM, :SALARIO, :GTOEMPR);
                            end
                        else if ((:PERIODICIDAD = 3) and (LIQUIDAPER = 2)) then
                            begin
                            if ((PERIODO = 2) or (PERIODO = 6) or (PERIODO = 10) or (PERIODO = 14) or (PERIODO = 18) or (PERIODO = 22)
                                or (PERIODO = 26) or (PERIODO = 30) or (PERIODO = 34) or (PERIODO = 38) or (PERIODO = 42) or (PERIODO = 46)
                                or (PERIODO = 50)) then
                                insert into NOMINA_CONCEPTOS (NOMI_ID, NOCO_ITEM, CONC_COD,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, NOCO_GTOEMPR)
                                    values (:IDNOMINA,:ITEM, :CONCEPT, :NIT_TERCERO, :VALOR, :ENTIDAD, :CONC_DEDUC, :CONC_PROV, :CONC_APORTE, :PERIODO, :ANO, :CONC_MODIFI, :CONC_APLICAPROM, :SALARIO, :GTOEMPR);
                            end
                        else if ((:PERIODICIDAD = 3) and (LIQUIDAPER = 3)) then
                            begin
                            if ((PERIODO = 3) or (PERIODO = 7) or (PERIODO = 11) or (PERIODO = 15) or (PERIODO = 19) or (PERIODO = 23)
                                or (PERIODO = 27) or (PERIODO = 31) or (PERIODO = 35) or (PERIODO = 39) or (PERIODO = 43) or (PERIODO = 47)
                                or (PERIODO = 51)) then
                                insert into NOMINA_CONCEPTOS (NOMI_ID, NOCO_ITEM, CONC_COD,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, NOCO_GTOEMPR)
                                    values (:IDNOMINA,:ITEM, :CONCEPT, :NIT_TERCERO, :VALOR, :ENTIDAD, :CONC_DEDUC, :CONC_PROV, :CONC_APORTE, :PERIODO, :ANO, :CONC_MODIFI, :CONC_APLICAPROM, :SALARIO, :GTOEMPR);
                            end
                        else if ((:PERIODICIDAD = 3) and (LIQUIDAPER = 4)) then
                            begin
                            if ((PERIODO = 4) or (PERIODO = 8) or (PERIODO = 12) or (PERIODO = 16) or (PERIODO = 20) or (PERIODO = 24)
                                or (PERIODO = 29) or (PERIODO = 32) or (PERIODO = 36) or (PERIODO = 40) or (PERIODO = 44) or (PERIODO = 48)
                                or (PERIODO = 52)) then
                                insert into NOMINA_CONCEPTOS (NOMI_ID, NOCO_ITEM, CONC_COD,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, NOCO_GTOEMPR)
                                    values (:IDNOMINA,:ITEM, :CONCEPT, :NIT_TERCERO, :VALOR, :ENTIDAD, :CONC_DEDUC, :CONC_PROV, :CONC_APORTE, :PERIODO, :ANO, :CONC_MODIFI, :CONC_APLICAPROM, :SALARIO, :GTOEMPR);
                            end
                        end
                    VALOR = 0;
                    BASICO = 0;
                    end
            end /* for */
        end
    end
suspend;
end

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE LIQUIDACION_EMPLEADO(
    NITEMPL VARCHAR(20),
    FECLIQ DATE,
    DIASLABORADOS INTEGER)
RETURNS (
    SALARIO NUMERIC(18,2),
    PRIMA NUMERIC(18,2),
    FECPRIMA DATE,
    FECCES DATE,
    CESANTIA NUMERIC(18,2),
    INTCESANT NUMERIC(18,2),
    FECVAC DATE,
    VACACION NUMERIC(18,2),
    SUELDO NUMERIC(18,2),
    BENEFICIOS NUMERIC(18,2),
    OTROSDED NUMERIC(18,2),
    OTROSDEV NUMERIC(18,2),
    EPSEMPL NUMERIC(18,2),
    AFPEMPL NUMERIC(18,2),
    DSPRESTAMO NUMERIC(18,2),
    EMPREPS NUMERIC(18,2),
    EMPRAFP NUMERIC(18,2),
    EMPRCCF NUMERIC(18,2),
    EMPRSENA NUMERIC(18,2),
    EMPRICBF NUMERIC(18,2),
    TOTPAGOS NUMERIC(18,2),
    TOTDESC NUMERIC(18,2),
    TOTAL NUMERIC(18,2),
    TOTEMPR NUMERIC(18,2))
AS
DECLARE VARIABLE SMLV NUMERIC(18,2);
declare variable numeroprom integer;
DECLARE VARIABLE valor NUMERIC(18,2);
declare variable DIASAUX INTEGER;
declare variable periodicidad integer;
declare variable PERINICIAL integer;
declare variable PERFINAL integer;
declare variable ANOINI integer;
declare variable ANOFIN integer;
declare variable MONTOS numeric(18,2);
declare variable PORCEN numeric(9,4);
declare variable ENTIDAD varchar(20);
declare variable CONC_COD integer;
declare variable CONC_DEDUC char(1);
declare variable CONC_PORC numeric(9,4);
declare variable CONC_ENTIDAD integer;
declare variable CONC_MONTO numeric(18,2);
declare variable CONC_PROMEDIO char(1);
declare variable CONC_SALARIO char(1);
declare variable CONC_BENEFICIO char(1);
declare variable BASICO numeric(18,2);
declare variable LIQUIDAPER integer;
declare variable MENSUAL char(1);
declare variable CONC_APORTE char(1);
declare variable CONC_DIAS char(1);
declare variable TOMASAL integer;
declare variable VALORPREDET numeric(18,2);
declare variable CAMBSALTRANS numeric(18,2);
declare variable SALDOSINI numeric(18,2);
declare variable DURANOV integer;
declare variable HORASEX numeric(18,2);
declare variable DIASNOV integer;
declare variable RETROACT numeric(18,2);
declare variable REEMBOLSO numeric(18,2);
declare variable INCAP numeric(18,2);
declare variable RECNOCT numeric(18,2);
declare variable RECFEST numeric(18,2);
declare variable TAR_RECNOTC numeric(9,4);
declare variable TAR_RECFEST numeric(9,4);
declare variable RECARGO numeric(18,2);
declare variable BASICOREC numeric(18,2);
declare variable COMISION numeric(18,2);
declare variable salinteg CHAR(1);
declare variable TAR_SALINTEG numeric(9,4);
BEGIN
/* LIQUIDACION DEL MES ACTUAL */
select e.empl_ppago, E.empl_salinteg from empleados e where terc_nit = :nitempl into :periodicidad, :salinteg;
select P.PAAN_RECNOC, P.PAAN_RECFEST, P.paan_salinteg from PARAMETROS_ANO P where P.PAAN_ANO = :anofin
    into :TAR_RECNOTC, :TAR_RECFEST, TAR_SALINTEG;

select first 1 M.MVSE_SALARIO from MOVIMIENTO_SALARIO_EMPLEADO M where M.TERC_NIT = :nitempl and
    M.MVSE_FECHA <= :fecliq order by M.MVSE_FECHA desc into :SALARIO;
BASICO = SALARIO;
EXECUTE PROCEDURE REDONDEE(:SUELDO, -2) RETURNING_VALUES (:sueldo);
OTROSDED = 0;
OTROSDEV = 0;
SUELDO = 0;
EXECUTE PROCEDURE periodo_nom_fecha (:fecliq, :periodicidad) returning_values (:perfinal, :anofin);
PERFINAL = PERFINAL + 1;
for select CE.EMCO_MONTO, CE.EMCO_PORC, CE.EMPL_ENTIDAD, CE.EMCO_PERPROM, CE.EMCO_LUQUIDAPER, CE.EMCO_MENSUAL, CN.CONC_COD, CN.CONC_DEDUC,CN.CONC_PORC, CN.CONC_ENTIDAD, CN.CONC_MONTO,  CN.CONC_DIAS, 
    CN.CONC_PROMEDIO, CN.CONC_SALARIO, CN.CONC_APORTE, CE.EMCO_TOMSAL, CN.conc_benefic
    from EMPLEADO_CONCEPTOS CE, CONCEPTOS_NOMINA CN
    where (CE.CONC_COD = CN.CONC_COD) and (CE.TERC_NIT = :nitempl) and CN.conc_prov = 'N' and
    ( ((CE.EMCO_FECINI <= :fecliq and CE.EMCO_FECFIN >= :fecliq)) or
    ((CN.CONC_TODOSPER = 'N') and (CE.EMCO_PPAGO = :perfinal)) or ((CN.CONC_TODOSPER = 'S') AND (((:periodicidad = 1) AND (:perfinal < 13)) or ((:periodicidad = 2) AND (:perfinal < 25)))) )
    into :MONTOS, :PORCEN, :ENTIDAD, :NUMEROPROM, :LIQUIDAPER, :MENSUAL ,:CONC_COD, :CONC_DEDUC, :CONC_PORC,
    :CONC_ENTIDAD, :CONC_MONTO, :CONC_DIAS, :CONC_PROMEDIO, :CONC_SALARIO,:CONC_APORTE , :TOMASAL, :conc_beneficio
    do
    begin
    RECNOCT = null;
    RECFEST = null;
    select N.NOEX_RECNOCT, N.NOEX_RECFEST
        from NOMINA_HORASEXT N where N.NOEX_PERIODIO = :perfinal and N.NOEX_ANO = :anofin and N.TERC_NIT = :nitempl
        into :RECNOCT, :RECFEST;
    if (RECNOCT is null) then
        RECNOCT = 0;
    if (RECFEST is null) then
        RECFEST = 0;
    if (CONC_DIAS = 'S') then
        execute procedure DIAS_LABORADOS (:nitempl, :perfinal, :fecliq, :MENSUAL,:CONC_APORTE) returning_values (:diaslaborados);
    else
        BEGIN
        SELECT PPAG_DIAS FROM PERIODO_PAGO WHERE PPAG_COD = :periodicidad INTO :diaslaborados;
        END
    if (:TOMASAL <> 0) then
        begin
        /* SI EL CONCEPTO NOAPLICA EN ESTE PERIODO DEJE EL BASICO EN CERO */
        if ((:PERIODICIDAD = 2) and (:TOMASAL <> 2)) then
            begin
            if ((PERFINAL = 2) or (PERFINAL = 4) or (PERFINAL = 6) or (PERFINAL = 8) or (PERFINAL = 10) or (PERFINAL = 12)
                or (PERFINAL = 14) or (PERFINAL = 16) or (PERFINAL = 18) or (PERFINAL = 20) or (PERFINAL = 22) or (PERFINAL = 24)) then
                BASICO = 0;
            end
        else
            if ((:PERIODICIDAD = 3) and (:TOMASAL <> 1)) then
                begin
                if ((PERFINAL = 1) or (PERFINAL = 5) or (PERFINAL = 9) or (PERFINAL = 13) or (PERFINAL = 17) or (PERFINAL = 21)
                    or (PERFINAL = 25) or (PERFINAL = 29) or (PERFINAL = 33) or (PERFINAL = 37) or (PERFINAL = 41) or (PERFINAL = 45)
                    or (PERFINAL = 49)) then
                    BASICO = 0;
                end
            else
                if ((:PERIODICIDAD = 3) and (:TOMASAL <> 2)) then
                    begin
                    if ((PERFINAL = 2) or (PERFINAL = 6) or (PERFINAL = 10) or (PERFINAL = 14) or (PERFINAL = 18) or (PERFINAL = 22)
                        or (PERFINAL = 26) or (PERFINAL = 30) or (PERFINAL = 34) or (PERFINAL = 38) or (PERFINAL = 42) or (PERFINAL = 46)
                        or (PERFINAL = 50)) then
                        BASICO = 0;
                    end
                else
                    if ((:PERIODICIDAD = 3) and (:TOMASAL <> 3)) then
                        begin
                        if ((PERFINAL = 3) or (PERFINAL = 7) or (PERFINAL = 11) or (PERFINAL = 15) or (PERFINAL = 19) or (PERFINAL = 23)
                            or (PERFINAL = 27) or (PERFINAL = 31) or (PERFINAL = 35) or (PERFINAL = 39) or (PERFINAL = 43) or (PERFINAL = 47)
                            or (PERFINAL = 51)) then
                            BASICO = 0;
                        end
                    else
                        if ((:PERIODICIDAD = 3) and (:TOMASAL <> 4)) then
                            begin
                            if ((PERFINAL = 4) or (PERFINAL = 8) or (PERFINAL = 12) or (PERFINAL = 16) or (PERFINAL = 20) or (PERFINAL = 24)
                                or (PERFINAL = 29) or (PERFINAL = 32) or (PERFINAL = 36) or (PERFINAL = 40) or (PERFINAL = 44) or (PERFINAL = 48)
                                or (PERFINAL = 52)) then
                                BASICO = 0;
                            end
        end
    else
        begin
        /* SE CALCULA SOBRE TODOS LOS PERIODOS */
        BASICO = salario;
        end
    VALORPREDET = null;
    select VP.NVPR_MONTO from NOMINA_VALOR_PREDET VP where VP.NVPR_PERIODICIDAD = :PERIODICIDAD and VP.NVPR_PERIODO = :perfinal and VP.NVPR_ANO = :anofin and VP.CONC_COD = :CONC_COD and VP.TERC_NIT = :nitempl
        into :VALORPREDET;
    if ((:VALORPREDET <> 0) and (VALORPREDET is not null)) then
        VALOR = VALORPREDET;
    else
        begin
        /* SI HAY UN CAMBIO TRANSITORIO DE SALARIO AJUSTE LOS DIAS Y CALCULE EL VALOR A SUMAR */
        select ((N.NONO_VALOR /30) * ND.NNDE_DURACION), (ND.NNDE_DURACION) from NOMINA_NOVEDADES N, nomina_novedades_detalle ND
            where N.nono_id = ND.nono_id AND N.TNOV_COD = 11 and N.TERC_NIT = :NITEMPL and ND.NNDE_PERIODO = :PERFINAL
            into :CAMBSALTRANS, :DURANOV;
        if (CAMBSALTRANS is null) then
            CAMBSALTRANS = 0;
        if (DURANOV is null) then
            DURANOV = 0;
        diaslaborados = :diaslaborados - :DURANOV;
        /* SI ES UN PRESTAMO, IGNORELO YA QUE SE DESCONTARA EL TOTAL DEL SALDO */
        if (CONC_COD <> 922) then
            begin
            if ((:MONTOS = 0) or (:MONTOS is null)) then
                begin
                /* SI EL CONCEPTO DEL EMPLEADO NO TIENE MONTO TRAIGA EL DE CONCEPTOS_NOMINA */
                if ((CONC_PORC = 0 and :PORCEN = 0) or (CONC_PORC is null and :PORCEN = 0) or (CONC_PORC = 0 and :PORCEN is null) or (CONC_PORC is null and :PORCEN is null) ) then
                    begin
                    /* SIN PORCENTAJE */
                    if ((CONC_MONTO <> 0) and (CONC_MONTO is not null) ) then
                        begin
                        VALOR = :CONC_MONTO;
                        if (:CONC_DIAS = 'S') then
                            VALOR = (:VALOR / 30) * :diaslaborados;
                        end
                    else
                        if (CONC_SALARIO = 'S' and CONC_COD <> 900 and CONC_COD <> 920 and CONC_COD <> 932 and CONC_COD <> 953) then
                            begin
                            /* SI ES SALARIO SUME LAS EXTRAS */
                            BASICO = SALARIO;
                            BASICO = ((:BASICO/30)*:diaslaborados);
                            CONC_MONTO = :BASICO;
                            VALOR = (:CONC_MONTO/*/30 * :diaslab*/ ) + :CAMBSALTRANS;
                            end
                        else
                            begin
                            VALOR = MONTOS;
                            if (:CONC_DIAS = 'S') then
                                VALOR = (:VALOR / 30) * :diaslaborados;
                            end
                    end
                else
                    begin
                    if (:PORCEN <> 0) then
                        begin
                        /* SI TIENE PORCENTAJE EN EMPLEADO_CONCEPTOS PERO EL MONTO SE TRAE DE CONCPETOS_NOMINA */
                        if ((CONC_MONTO <> 0) and (CONC_MONTO is not null) ) then
                            begin
                            VALOR = ((:CONC_MONTO ) * :PORCEN) /100;
                            end
                        end
                    else
                        begin
                        /* NO TIENE PORCENTAJE EN EMPLEADO_CONCEPTOS SE TRAE MONTO Y PORC DE CONCPETOS_NOMINA */
                        if ((CONC_MONTO <> 0) and (CONC_MONTO is not null) ) then
                            begin
                            VALOR = ((:CONC_MONTO) * :CONC_PORC) /100;
                            end
                        else
                            if (CONC_SALARIO = 'S' and CONC_COD <> 900 and CONC_COD <> 920 and CONC_COD <> 932 and CONC_COD <> 953) then
                                begin
                                BASICO = SALARIO;
                                BASICO = ((:BASICO/30)*:diaslaborados);
                                CONC_MONTO = :BASICO;
                                VALOR = ((:CONC_MONTO)+ :CAMBSALTRANS * :CONC_PORC) /100;
                                end
                            else
                                if (:CONC_MONTO = 0 and :MONTOS = 0) then
                                    begin
                                    CONC_MONTO = :BASICO;
                                    VALOR = (((:CONC_MONTO / 30) * :diaslaborados) + :CAMBSALTRANS * :CONC_PORC) /100;
                                    end
                        end
                    end
                end
            else
                /* SI TIENE MONTO EN EMPLEADO_CONCEPTOS */
                if ((CONC_PORC = 0 or (CONC_PORC is null)) and (:PORCEN = 0 or (PORCEN is null))) then
                    begin
                    VALOR = (:MONTOS);
                    if (:CONC_DIAS = 'S') then
                        VALOR = (:VALOR / 30) * :diaslaborados;
                    end
                else
                    if (:PORCEN <> 0 and PORCEN is not null) then
                        begin
                        VALOR = ((:MONTOS ) * :PORCEN) /100;
                        end
                    else
                        begin
                        VALOR = ((:MONTOS) * :CONC_PORC) /100;
                        end
             end

        if (CONC_PROMEDIO = 'S') then
            begin
            /* CALCULO DEL PROMEDIO BASE DESDE LA FECHA MENOS EL NUMERO DE PERIODOS */
            EXECUTE PROCEDURE periodo_nom_fecha (:fecliq, :periodicidad) returning_values (:perfinal, :anofin);
            if (perfinal < numeroprom) then
                BEGIN
                anoini = anofin - 1;
                if (periodicidad = 1) then
                    perinicial = 12 - (numeroprom - perfinal) + 1;
                if (periodicidad = 2) then
                    perinicial = 24 - (numeroprom - perfinal) + 1;
                if (periodicidad = 3) then
                    perinicial = 52 - (numeroprom - perfinal) + 1;
                END
            ELSE
                BEGIN
                PERINICIAL = :perfinal - :NUMEROPROM + 1;
                anoini = ANOFIN;
                END
            if (anoini <> anofin) then
                select sum (NOCO_VALOR) from NOMINA_CONCEPTOS N where N.NOCO_APLICAPROM = 'S' and
                    ((N.NOCO_PERIODO >= :PERINICIAL and N.NOCO_ANO = :anoini) or
                    (N.NOCO_PERIODO <= :perfinal and N.NOCO_ANO = :anofin)) and TERC_NIT = :NITEMPL into :VALOR;
            else
                select sum (NOCO_VALOR) from NOMINA_CONCEPTOS N where N.NOCO_APLICAPROM = 'S' and
                    N.NOCO_PERIODO >= :PERINICIAL and N.NOCO_ANO = :anoini
                    and N.NOCO_PERIODO <= :perfinal and TERC_NIT = :NITEMPL into :VALOR;
            /* sume el saldo inicial */
            SALDOSINI = 0;
            select NOCO_VALOR from NOMINA_CONCEPTOS where CONC_COD = :CONC_COD and TERC_NIT  = :NITEMPL and NOCO_PAGOOK = 'N' and NOCO_PERIODO = 0 into :SALDOSINI;
            if (SALDOSINI is null) then
                SALDOSINI = 0;
            else
                update NOMINA_CONCEPTOS N set NOCO_PAGOOK = 'S' where N.NOCO_APLICAPROM = 'S' and
                    CONC_COD = :CONC_COD and TERC_NIT = :NITEMPL and NOCO_PERIODO = 0;
            VALOR = :VALOR + :SALDOSINI;
            /* APLIQUE LA PROPORCION Y EL PORCENTAJE */
            VALOR = VALOR / NUMEROPROM;
            VALOR = VALOR * PORCEN / 100;
            end
        else if (CONC_APORTE = 'S') then
            begin
            HORASEX = null;
            DIASNOV = null;
            RETROACT = null;
            REEMBOLSO = null;
            BENEFICIOS = null;
            RECARGO = null;
            COMISION = null;
            INCAP = null;
            if ((:ENTIDAD = '' ) or (ENTIDAD is null)) then
                begin
                /*COMISIONES*/
                if (MENSUAL = 'S') then
                    BEGIN
                    if (PERIODICIDAD = 1) then
                        BEGIN
                        perinicial = PERFINAL;
                        PERFINAL = PERFINAL;
                        END
                    if (PERIODICIDAD = 2) then
                        BEGIN
                        perinicial = PERFINAL - (LIQUIDAPER - 1);
                        PERFINAL = PERFINAL + (2 - LIQUIDAPER);
                        END
                    if (PERIODICIDAD = 3) then
                        BEGIN
                        perinicial = PERFINAL - (LIQUIDAPER - 1);
                        PERFINAL = PERFINAL + (4 - LIQUIDAPER);
                        END
                    END
                ELSE
                    BEGIN
                    perinicial = PERFINAL;
                    PERFINAL = PERFINAL;
                    END
                /* SUME LAS COMISIONES DE LOS DEMAS PERIODOS DEL MES */
                select SUM(C.NCOM_MONTO) from NOMINA_COMISIONES C where C.NCOM_ANO = :anofin
                    and C.NCOM_PERIODO >= :PERINICIAL AND C.NCOM_PERIODO <= :PERFINAL
                    and C.NCOM_PERIODICIDAD = :PERIODICIDAD and C.TERC_NIT = :NITEMPL
                    into :COMISION;
                if (COMISION is null) then
                    COMISION = 0;
                /*RETROACTIVO*/
                select C.EMCO_MONTO from EMPLEADO_CONCEPTOS C where C.TERC_NIT = :NITEMPL
                    and C.CONC_COD = 933 into :RETROACT;
                if (RETROACT is null ) then
                    RETROACT = 0;
                /* REEMBOLSO*/
                select C.EMCO_MONTO from EMPLEADO_CONCEPTOS C where C.TERC_NIT = :NITEMPL
                    and C.CONC_COD = 952 into :REEMBOLSO;
                if (REEMBOLSO is null ) then
                    REEMBOLSO = 0;
                /* INCAPACIDAD*/
                select ND.NNDE_DURACION from NOMINA_NOVEDADES N, nomina_novedades_detalle ND
                    where N.nono_id = ND.nono_id AND N.TERC_NIT = :NITEMPL
                    and ND.NNDE_PERIODO = :PERFINAL and ND.NNDE_ANO = :anofin and (N.TNOV_COD = 2 or (N.TNOV_COD = 3))
                    into :DIASNOV;
                if (:DIASNOV is null) then
                    INCAP = 0;
                else
                    INCAP = (:BASICO / 30)* :DIASNOV;
                /*BASICO*/
                if (SALINTEG = 'S') then
                    BASICO = BASICO * (tar_salinteg / 100);
                BASICO = ((:BASICO/30)*:diaslaborados);
                /*HORAS EXTRA*/
                select SUM(C.NOEX_MONTO) from NOMINA_HORASEXT C where C.NOEX_ANO = :anofin
                    and C.NOEX_PERIODIO >= :PERINICIAL and C.NOEX_PERIODIO <= :PERFINAL
                    and C.NOEX_PERIODICIDAD = :PERIODICIDAD and C.TERC_NIT = :NITEMPL
                    into :HORASEX;
                if (HORASEX is null) then
                    HORASEX = 0;
                /*RECARGOS*/
                BASICOREC = SALARIO;
                RECARGO = (((:BASICOREC/30)/8)*:TAR_RECNOTC)*:RECNOCT;
                RECARGO = :RECARGO + ((((:BASICOREC/30)/8)*:TAR_RECFEST)*:RECFEST);
                if (RECARGO is null) then
                    RECARGO = 0;
                /* SMLV Y AUX. TRANSPORTE*/
                select P.PAAN_SALMINIMO from PARAMETROS_ANO P
                    where P.PAAN_ANO = :anofin into :SMLV;
                /*basico*/
                if (:BASICO + :COMISION + :HORASEX + :RETROACT+ :REEMBOLSO + :INCAP+ :CAMBSALTRANS < ((:SMLV/30)*:diaslaborados)) then
                    BASICO = (:SMLV/30)*:diaslaborados;
                /*BASE*/
                VALOR = :BASICO + :COMISION + :HORASEX + :RETROACT+ :REEMBOLSO + :INCAP + :RECARGO + :CAMBSALTRANS;

                if (CONC_COD = 904) then
                    begin
                    select A.PAAN_AFPTR from PARAMETROS_ANO A where A.PAAN_ANO = :anofin into :PORCEN;
                    AFPEMPL = ((:VALOR) * :PORCEN) /100;
                    end
                else if ((CONC_COD = 905) or (CONC_COD = 906) or (CONC_COD = 934) ) then
                    begin
                    select A.PAAN_AFPEM from PARAMETROS_ANO A where A.PAAN_ANO = :anofin into :PORCEN;
                    EMPRAFP = ((:VALOR) * :PORCEN) /100;
                    end
                else if ((CONC_COD = 908) or (CONC_COD = 909) or (CONC_COD = 935) ) then
                    begin
                    select A.PAAN_AFPEM from PARAMETROS_ANO A where A.PAAN_ANO = :anofin into :PORCEN;
                    EMPRAFP = ((:VALOR) * :PORCEN) /100;
                    end
                else if ((CONC_COD = 907) or (CONC_COD = 914) or (CONC_COD = 915) or (conc_cod = 938)) then
                    begin
                    if (CONC_COD = 907) then
                        begin
                        select A.PAAN_EPSTR from PARAMETROS_ANO A where A.PAAN_ANO = :anofin into :PORCEN;
                        EPSEMPL = ((:VALOR) * :PORCEN) /100;
                        end
                    else
                        begin
                        select A.PAAN_EPSEM from PARAMETROS_ANO A where A.PAAN_ANO = :anofin into :PORCEN;
                        EMPREPS = ((:VALOR) * :PORCEN) /100;
                        end
                    end
                else if ((CONC_COD = 910) or (CONC_COD = 911) or (CONC_COD = 936)) then
                    begin
                    /*ccf */
                    select A.PAAN_CCF from PARAMETROS_ANO A where A.PAAN_ANO = :anofin into :PORCEN;
                    EMPRCCF = ((:VALOR) * :PORCEN) /100;
                    end
                else if ((CONC_COD = 916) or (CONC_COD = 917) or (CONC_COD = 939) ) then
                    begin
                    /*icbf */
                    select A.PAAN_ICBF from PARAMETROS_ANO A where A.PAAN_ANO = :anofin into :PORCEN;
                    EMPRICBF = ((:VALOR) * :PORCEN) /100;
                    end
                else if ((CONC_COD = 918) or (CONC_COD = 919) or (CONC_COD = 940) ) then
                    begin
                    /*sena */
                    select A.PAAN_SENA from PARAMETROS_ANO A where A.PAAN_ANO = :anofin into :PORCEN;
                    EMPRSENA = ((:VALOR) * :PORCEN) /100;
                    end
                else if ((CONC_COD = 912) or (CONC_COD = 913) or (CONC_COD = 937)) then
                    begin
                    /* CESANTIAS SE PAGAN NO SE APORTAN*/
                    VALOR = 0;
                    end
                else
                    begin
                    if (COMISION is null) then
                        COMISION = 0;
                    select C.NCOM_MONTO from NOMINA_COMISIONES C where C.NCOM_ANO = :anofin and C.NCOM_PERIODO = :PERFINAL and C.NCOM_PERIODICIDAD = :PERIODICIDAD and C.TERC_NIT = :NITEMPL
                        into :COMISION;
                    CONC_MONTO = :BASICO + :COMISION;
                    if (CONC_PORC <> 0 and CONC_PORC is not null) then
                        VALOR = (((:CONC_MONTO/30 * :diaslaborados )+ :CAMBSALTRANS + :INCAP) * :CONC_PORC) /100;
                    else
                        if (:PORCEN <> 0 and :PORCEN is not null) then
                            VALOR = (((:CONC_MONTO/30 * :diaslaborados )+ :CAMBSALTRANS + :INCAP) * :PORCEN) /100;
                        else
                            if (:MONTOS <> 0 and :MONTOS is not null) then
                                VALOR = :MONTOS;
                            else
                                if (:CONC_MONTO <> 0 and :CONC_MONTO is not null) then
                                    VALOR = :CONC_MONTO;
                    end
                end
            end /* aportes */
        else if (CONC_COD = 920) then /* comisiones */
            begin
            select C.NCOM_MONTO from NOMINA_COMISIONES C where C.NCOM_ANO = :ANOFIN and C.NCOM_PERIODO = :PERFINAL and C.NCOM_PERIODICIDAD = :PERIODICIDAD and C.TERC_NIT = :NITEMPL into :VALOR;
            if (VALOR is null) then
                VALOR = 0;
            end
        else if (CONC_COD = 900 or (:CONC_COD = 931)) then /* horas extra */
            begin
            select C.NOEX_MONTO from NOMINA_HORASEXT C where C.NOEX_ANO = :anofin and
                C.NOEX_PERIODIO = :PERFINAL and C.NOEX_PERIODICIDAD = :PERIODICIDAD and C.TERC_NIT = :NITEMPL into :VALOR;
            if (VALOR is null) then
                VALOR = 0;
            end
        else if (CONC_COD = 954) then /* cartera */
            begin
            select C.NCAR_MONTO from NOMINA_CARTERA C where C.NCAR_ANO = :anofin and C.NCAR_PERIODO = :PERFINAL and C.NCAR_PERIODICIDAD = :PERIODICIDAD and C.TERC_NIT = :NITEMPL into :VALOR;
            if (VALOR is null) then
                VALOR = 0;
            end
        else if (CONC_COD = 932) then
            begin
            /* incapacidad */
            select ND.NNDE_DURACION from NOMINA_NOVEDADES N, nomina_novedades_detalle ND
                where N.nono_id = ND.nono_id AND N.TERC_NIT = :NITEMPL and ND.NNDE_PERIODO = :PERFINAL and ND.NNDE_ANO = :anofin
                and (N.TNOV_COD = 2 or (N.TNOV_COD = 3)) into :DIASNOV;
            if (:DIASNOV is null) then
                VALOR = 0;
            else
                VALOR = (:BASICO / 30)* :DIASNOV;
            end
        else if (CONC_COD = 921) then
            begin
            if (PORCEN is not null and PORCEN <> 0) then
                VALOR = ((BASICO / 30)* :diaslaborados ) * :PORCEN /100;
            else
                if (CONC_PORC is not null and CONC_PORC <> 0) then
                    VALOR = ((BASICO / 30)* :diaslaborados ) * :CONC_PORC /100;
            end
        else if (CONC_COD = 953) then
            begin
            /*RECARGO */
            BASICO = SALARIO;
            VALOR = (((:BASICO/30)/8)*:TAR_RECNOTC)*:RECNOCT;
            VALOR = :VALOR + ((((:BASICO/30)/8)*:TAR_RECFEST)*:RECFEST);
            end
        if (CONC_APORTE = 'S') then
            begin
            if (ENTIDAD is null or (ENTIDAD = '') ) then
                ENTIDAD = :CONC_ENTIDAD;
            end
        end
    if ((VALOR <> 0) and (VALOR is not null)) then
        begin
        execute procedure REDONDEE(:VALOR, 0) returning_values (VALOR);
        if (CONC_APORTE = 'N') then
            BEGIN
            if (conc_beneficio = 'S') then
                beneficios = beneficios + VALOR;
            ELSE
                if (CONC_DEDUC = 'S') then
                    BEGIN
                    OTROSDED = OTROSDED + VALOR;
                    END
                ELSE
                    BEGIN
                    if (conc_salario = 'S') then
                        SUELDO = SUELDO + VALOR;
                    else
                        OTROSDEV = OTROSDEV + VALOR;
                    END
            END
        end
    end

/* calcule el promedio de sueldo */
if (periodicidad = 1) then
    numeroprom = 6;
if (periodicidad = 2) then
    numeroprom = 12;
if (periodicidad = 3) then
    numeroprom = 24;

EXECUTE PROCEDURE periodo_nom_fecha (:fecliq, :periodicidad) returning_values (:perfinal, :anofin);
if (perfinal < numeroprom) then
    BEGIN
    anoini = anofin - 1;
    if (periodicidad = 1) then
        perinicial = 12 - (numeroprom - perfinal) + 1;
    if (periodicidad = 2) then
        perinicial = 24 - (numeroprom - perfinal) + 1;
    if (periodicidad = 3) then
        perinicial = 52 - (numeroprom - perfinal) + 1;
    END
ELSE
    BEGIN
    PERINICIAL = :perfinal - :NUMEROPROM + 1;
    anoini = ANOFIN;
    END
if (anoini <> anofin) then
    select sum (NOCO_VALOR) from NOMINA_CONCEPTOS N where N.NOCO_APLICAPROM = 'S' and
        ((N.NOCO_PERIODO >= :PERINICIAL and N.NOCO_ANO = :anoini) or
        (N.NOCO_PERIODO <= :perfinal and N.NOCO_ANO = :anofin)) and TERC_NIT = :nitempl into :SALARIO;
else
    select sum (NOCO_VALOR) from NOMINA_CONCEPTOS N where N.NOCO_APLICAPROM = 'S' and
        N.NOCO_PERIODO >= :PERINICIAL and N.NOCO_ANO = :anoini
        and N.NOCO_PERIODO <= :perfinal and TERC_NIT = :nitempl into :SALARIO;
if (SALARIO is null) then
    SALARIO = 0;
SALARIO = SALARIO / 6; /* siempre es mensual sin importar la periodicidad */
/* PRIMA */
/* CALCULE FECHA DEL ULTIMO PAGO DE PRIMA */
SELECT MAX(N.nomi_feccausa) FROM NOMINA N, NOMINA_CONCEPTOS NC, CONCEPTOS_NOMINA C
    WHERE N.nomi_id = NC.nomi_id AND NC.terc_nit = :nitempl AND NC.conc_cod = C.conc_cod AND
    UPPER(C.conc_nombre) LIKE '%PRIMA%' AND NC.noco_deduc = 'N' AND NC.noco_aporte = 'N' AND NC.noco_prov = 'N'
    INTO :FECPRIMA;
DIASAUX = fecliq - fecprima;
prima = :salario * diasaux / 360;
EXECUTE PROCEDURE REDONDEE(:prima, -1) RETURNING_VALUES (:prima);
/* CESANTIA */
/* CALCULE FECHA DEL ULTIMO PAGO DE PRIMA */
SELECT MAX(N.nomi_feccausa) FROM NOMINA N, NOMINA_CONCEPTOS NC, CONCEPTOS_NOMINA C
    WHERE N.nomi_id = NC.nomi_id AND NC.terc_nit = :nitempl AND NC.conc_cod = C.conc_cod AND
    UPPER(C.conc_nombre) LIKE '%CESANTIA%' AND NC.noco_deduc = 'N' AND NC.noco_aporte = 'N' AND NC.noco_prov = 'N'
    INTO :fecces;
DIASAUX = fecliq - fecces;
cesantia = :salario * diasaux / 360;
EXECUTE PROCEDURE REDONDEE(:cesantia, -2) RETURNING_VALUES (:cesantia);
/* INTERESES SOBRE LA CESANTIA */
intcesant = CESANTIA * diasaux * 0.12 / 360;
EXECUTE PROCEDURE REDONDEE(:intcesant, -2) RETURNING_VALUES (:intcesant);
/* VACACIONES */
/* CALCULE FECHA DE LAS ULTIMAS VACACIONES */
SELECT MAX(VACA_FECHA) FROM VACACIONES WHERE terc_nit = :nitempl INTO :fecvac;
if (fecvac IS NULL) then
    select e.empl_fecing from empleados e where terc_nit = :nitempl into :fecvac;
DIASAUX = fecliq - fecvac;
vacacion = :salario * diasaux / 720;
EXECUTE PROCEDURE REDONDEE(:vacacion, -2) RETURNING_VALUES (:vacacion);
/* PRESTAMOS */
SELECT SUM (PRCU_MONTO) FROM PRESTAMO_CUOTAS P, PRESTAMO_NOMINA PN WHERE PN.prno_id = P.prno_id AND PN.terc_nit = :nitempl AND P.prcu_ok = 'N' INTO :dsprestamo;
IF (dsprestamo IS NULL) THEN
dsprestamo = 0;

totpagos = :PRIMA + :CESANTIA + :INTCESANT + :VACACION + :SUELDO + :otrosdev;
totdesc = :EPSEMPL + :AFPEMPL + :DSPRESTAMO + otrosded;
total = :totpagos - :totdesc;
totempr = :EMPREPS + :EMPRAFP + :EMPRCCF + :EMPRSENA + :EMPRICBF;
SUSPEND;
END

^

SET TERM ; ^

SET TERM ^ ;

ALTER TRIGGER NOMINA_DETALLE_BI
as
declare variable PERIODO integer;
declare variable FEC DATE;
begin
SELECT N.nomi_periodo,N.nomi_feccausa FROM NOMINA N WHERE N.nomi_id = NEW.nomi_id INTO :periodo,:fec;
EXECUTE PROCEDURE DIAS_LABORADOS(NEW.terc_nit,:periodo,:fec,'N','N')returning_values(NEW.node_diaslab);
end
^

SET TERM ; ^

/* 20100916b */
/* NO RESPETABA LOS DIAS INDICADOS POR QUIEN HACE LA LIQUIDACION PARA CONCEPTOS POR DIAS */

SET TERM ^ ;

CREATE OR ALTER procedure LIQUIDACION_EMPLEADO (
    NITEMPL varchar(20),
    FECLIQ date,
    DIASLAB integer)
returns (
    SALARIO numeric(18,2),
    PRIMA numeric(18,2),
    FECPRIMA date,
    FECCES date,
    CESANTIA numeric(18,2),
    INTCESANT numeric(18,2),
    FECVAC date,
    VACACION numeric(18,2),
    SUELDO numeric(18,2),
    BENEFICIOS numeric(18,2),
    OTROSDED numeric(18,2),
    OTROSDEV numeric(18,2),
    EPSEMPL numeric(18,2),
    AFPEMPL numeric(18,2),
    DSPRESTAMO numeric(18,2),
    EMPREPS numeric(18,2),
    EMPRAFP numeric(18,2),
    EMPRCCF numeric(18,2),
    EMPRSENA numeric(18,2),
    EMPRICBF numeric(18,2),
    TOTPAGOS numeric(18,2),
    TOTDESC numeric(18,2),
    TOTAL numeric(18,2),
    TOTEMPR numeric(18,2))
AS
declare variable DIASLABORADOS integer;
DECLARE VARIABLE SMLV NUMERIC(18,2);
declare variable numeroprom integer;
DECLARE VARIABLE valor NUMERIC(18,2);
declare variable DIASAUX INTEGER;
declare variable periodicidad integer;
declare variable PERINICIAL integer;
declare variable PERFINAL integer;
declare variable ANOINI integer;
declare variable ANOFIN integer;
declare variable MONTOS numeric(18,2);
declare variable PORCEN numeric(9,4);
declare variable ENTIDAD varchar(20);
declare variable CONC_COD integer;
declare variable CONC_DEDUC char(1);
declare variable CONC_PORC numeric(9,4);
declare variable CONC_ENTIDAD integer;
declare variable CONC_MONTO numeric(18,2);
declare variable CONC_PROMEDIO char(1);
declare variable CONC_SALARIO char(1);
declare variable CONC_BENEFICIO char(1);
declare variable BASICO numeric(18,2);
declare variable LIQUIDAPER integer;
declare variable MENSUAL char(1);
declare variable CONC_APORTE char(1);
declare variable CONC_DIAS char(1);
declare variable TOMASAL integer;
declare variable VALORPREDET numeric(18,2);
declare variable CAMBSALTRANS numeric(18,2);
declare variable SALDOSINI numeric(18,2);
declare variable DURANOV integer;
declare variable HORASEX numeric(18,2);
declare variable DIASNOV integer;
declare variable RETROACT numeric(18,2);
declare variable REEMBOLSO numeric(18,2);
declare variable INCAP numeric(18,2);
declare variable RECNOCT numeric(18,2);
declare variable RECFEST numeric(18,2);
declare variable TAR_RECNOTC numeric(9,4);
declare variable TAR_RECFEST numeric(9,4);
declare variable RECARGO numeric(18,2);
declare variable BASICOREC numeric(18,2);
declare variable COMISION numeric(18,2);
declare variable salinteg CHAR(1);
declare variable TAR_SALINTEG numeric(9,4);
BEGIN
/* LIQUIDACION DEL MES ACTUAL */
select e.empl_ppago, E.empl_salinteg from empleados e where terc_nit = :nitempl into :periodicidad, :salinteg;
select P.PAAN_RECNOC, P.PAAN_RECFEST, P.paan_salinteg from PARAMETROS_ANO P where P.PAAN_ANO = :anofin
    into :TAR_RECNOTC, :TAR_RECFEST, TAR_SALINTEG;

select first 1 M.MVSE_SALARIO from MOVIMIENTO_SALARIO_EMPLEADO M where M.TERC_NIT = :nitempl and
    M.MVSE_FECHA <= :fecliq order by M.MVSE_FECHA desc into :SALARIO;
BASICO = SALARIO;
EXECUTE PROCEDURE REDONDEE(:SUELDO, -2) RETURNING_VALUES (:sueldo);
OTROSDED = 0;
OTROSDEV = 0;
SUELDO = 0;
EXECUTE PROCEDURE periodo_nom_fecha (:fecliq, :periodicidad) returning_values (:perfinal, :anofin);
PERFINAL = PERFINAL + 1;
for select CE.EMCO_MONTO, CE.EMCO_PORC, CE.EMPL_ENTIDAD, CE.EMCO_PERPROM, CE.EMCO_LUQUIDAPER, CE.EMCO_MENSUAL, CN.CONC_COD, CN.CONC_DEDUC,CN.CONC_PORC, CN.CONC_ENTIDAD, CN.CONC_MONTO,  CN.CONC_DIAS, 
    CN.CONC_PROMEDIO, CN.CONC_SALARIO, CN.CONC_APORTE, CE.EMCO_TOMSAL, CN.conc_benefic
    from EMPLEADO_CONCEPTOS CE, CONCEPTOS_NOMINA CN
    where (CE.CONC_COD = CN.CONC_COD) and (CE.TERC_NIT = :nitempl) and CN.conc_prov = 'N' and
    ( ((CE.EMCO_FECINI <= :fecliq and CE.EMCO_FECFIN >= :fecliq)) or
    ((CN.CONC_TODOSPER = 'N') and (CE.EMCO_PPAGO = :perfinal)) or ((CN.CONC_TODOSPER = 'S') AND (((:periodicidad = 1) AND (:perfinal < 13)) or ((:periodicidad = 2) AND (:perfinal < 25)))) )
    into :MONTOS, :PORCEN, :ENTIDAD, :NUMEROPROM, :LIQUIDAPER, :MENSUAL ,:CONC_COD, :CONC_DEDUC, :CONC_PORC,
    :CONC_ENTIDAD, :CONC_MONTO, :CONC_DIAS, :CONC_PROMEDIO, :CONC_SALARIO,:CONC_APORTE , :TOMASAL, :conc_beneficio
    do
    begin
    RECNOCT = null;
    RECFEST = null;
    select N.NOEX_RECNOCT, N.NOEX_RECFEST
        from NOMINA_HORASEXT N where N.NOEX_PERIODIO = :perfinal and N.NOEX_ANO = :anofin and N.TERC_NIT = :nitempl
        into :RECNOCT, :RECFEST;
    if (RECNOCT is null) then
        RECNOCT = 0;
    if (RECFEST is null) then
        RECFEST = 0;

    /* SI ES POR DIAS SE RESPETAN LOS DIAS INDICADOS POR QUIEN HACE LA LIQUIDACION */
    if (CONC_DIAS <> 'S') then
        SELECT PPAG_DIAS FROM PERIODO_PAGO WHERE PPAG_COD = :periodicidad INTO :diaslaborados;
    ELSE
        diaslaborados = DIASLAB;
    
    if (:TOMASAL <> 0) then
        begin
        /* SI EL CONCEPTO NOAPLICA EN ESTE PERIODO DEJE EL BASICO EN CERO */
        if ((:PERIODICIDAD = 2) and (:TOMASAL <> 2)) then
            begin
            if ((PERFINAL = 2) or (PERFINAL = 4) or (PERFINAL = 6) or (PERFINAL = 8) or (PERFINAL = 10) or (PERFINAL = 12)
                or (PERFINAL = 14) or (PERFINAL = 16) or (PERFINAL = 18) or (PERFINAL = 20) or (PERFINAL = 22) or (PERFINAL = 24)) then
                BASICO = 0;
            end
        else
            if ((:PERIODICIDAD = 3) and (:TOMASAL <> 1)) then
                begin
                if ((PERFINAL = 1) or (PERFINAL = 5) or (PERFINAL = 9) or (PERFINAL = 13) or (PERFINAL = 17) or (PERFINAL = 21)
                    or (PERFINAL = 25) or (PERFINAL = 29) or (PERFINAL = 33) or (PERFINAL = 37) or (PERFINAL = 41) or (PERFINAL = 45)
                    or (PERFINAL = 49)) then
                    BASICO = 0;
                end
            else
                if ((:PERIODICIDAD = 3) and (:TOMASAL <> 2)) then
                    begin
                    if ((PERFINAL = 2) or (PERFINAL = 6) or (PERFINAL = 10) or (PERFINAL = 14) or (PERFINAL = 18) or (PERFINAL = 22)
                        or (PERFINAL = 26) or (PERFINAL = 30) or (PERFINAL = 34) or (PERFINAL = 38) or (PERFINAL = 42) or (PERFINAL = 46)
                        or (PERFINAL = 50)) then
                        BASICO = 0;
                    end
                else
                    if ((:PERIODICIDAD = 3) and (:TOMASAL <> 3)) then
                        begin
                        if ((PERFINAL = 3) or (PERFINAL = 7) or (PERFINAL = 11) or (PERFINAL = 15) or (PERFINAL = 19) or (PERFINAL = 23)
                            or (PERFINAL = 27) or (PERFINAL = 31) or (PERFINAL = 35) or (PERFINAL = 39) or (PERFINAL = 43) or (PERFINAL = 47)
                            or (PERFINAL = 51)) then
                            BASICO = 0;
                        end
                    else
                        if ((:PERIODICIDAD = 3) and (:TOMASAL <> 4)) then
                            begin
                            if ((PERFINAL = 4) or (PERFINAL = 8) or (PERFINAL = 12) or (PERFINAL = 16) or (PERFINAL = 20) or (PERFINAL = 24)
                                or (PERFINAL = 29) or (PERFINAL = 32) or (PERFINAL = 36) or (PERFINAL = 40) or (PERFINAL = 44) or (PERFINAL = 48)
                                or (PERFINAL = 52)) then
                                BASICO = 0;
                            end
        end
    else
        begin
        /* SE CALCULA SOBRE TODOS LOS PERIODOS */
        BASICO = salario;
        end
    VALORPREDET = null;
    select VP.NVPR_MONTO from NOMINA_VALOR_PREDET VP where VP.NVPR_PERIODICIDAD = :PERIODICIDAD and VP.NVPR_PERIODO = :perfinal and VP.NVPR_ANO = :anofin and VP.CONC_COD = :CONC_COD and VP.TERC_NIT = :nitempl
        into :VALORPREDET;
    if ((:VALORPREDET <> 0) and (VALORPREDET is not null)) then
        VALOR = VALORPREDET;
    else
        begin
        /* SI HAY UN CAMBIO TRANSITORIO DE SALARIO AJUSTE LOS DIAS Y CALCULE EL VALOR A SUMAR */
        select ((N.NONO_VALOR /30) * ND.NNDE_DURACION), (ND.NNDE_DURACION) from NOMINA_NOVEDADES N, nomina_novedades_detalle ND
            where N.nono_id = ND.nono_id AND N.TNOV_COD = 11 and N.TERC_NIT = :NITEMPL and ND.NNDE_PERIODO = :PERFINAL
            into :CAMBSALTRANS, :DURANOV;
        if (CAMBSALTRANS is null) then
            CAMBSALTRANS = 0;
        if (DURANOV is null) then
            DURANOV = 0;
        diaslaborados = :diaslaborados - :DURANOV;
        /* SI ES UN PRESTAMO, IGNORELO YA QUE SE DESCONTARA EL TOTAL DEL SALDO */
        if (CONC_COD <> 922) then
            begin
            if ((:MONTOS = 0) or (:MONTOS is null)) then
                begin
                /* SI EL CONCEPTO DEL EMPLEADO NO TIENE MONTO TRAIGA EL DE CONCEPTOS_NOMINA */
                if ((CONC_PORC = 0 and :PORCEN = 0) or (CONC_PORC is null and :PORCEN = 0) or (CONC_PORC = 0 and :PORCEN is null) or (CONC_PORC is null and :PORCEN is null) ) then
                    begin
                    /* SIN PORCENTAJE */
                    if ((CONC_MONTO <> 0) and (CONC_MONTO is not null) ) then
                        begin
                        VALOR = :CONC_MONTO;
                        if (:CONC_DIAS = 'S') then
                            VALOR = (:VALOR / 30) * :diaslaborados;
                        end
                    else
                        if (CONC_SALARIO = 'S' and CONC_COD <> 900 and CONC_COD <> 920 and CONC_COD <> 932 and CONC_COD <> 953) then
                            begin
                            /* SI ES SALARIO SUME LAS EXTRAS */
                            BASICO = SALARIO;
                            BASICO = ((:BASICO/30)*:diaslaborados);
                            CONC_MONTO = :BASICO;
                            VALOR = (:CONC_MONTO/*/30 * :diaslab*/ ) + :CAMBSALTRANS;
                            end
                        else
                            begin
                            VALOR = MONTOS;
                            if (:CONC_DIAS = 'S') then
                                VALOR = (:VALOR / 30) * :diaslaborados;
                            end
                    end
                else
                    begin
                    if (:PORCEN <> 0) then
                        begin
                        /* SI TIENE PORCENTAJE EN EMPLEADO_CONCEPTOS PERO EL MONTO SE TRAE DE CONCPETOS_NOMINA */
                        if ((CONC_MONTO <> 0) and (CONC_MONTO is not null) ) then
                            begin
                            VALOR = ((:CONC_MONTO ) * :PORCEN) /100;
                            end
                        end
                    else
                        begin
                        /* NO TIENE PORCENTAJE EN EMPLEADO_CONCEPTOS SE TRAE MONTO Y PORC DE CONCPETOS_NOMINA */
                        if ((CONC_MONTO <> 0) and (CONC_MONTO is not null) ) then
                            begin
                            VALOR = ((:CONC_MONTO) * :CONC_PORC) /100;
                            end
                        else
                            if (CONC_SALARIO = 'S' and CONC_COD <> 900 and CONC_COD <> 920 and CONC_COD <> 932 and CONC_COD <> 953) then
                                begin
                                BASICO = SALARIO;
                                BASICO = ((:BASICO/30)*:diaslaborados);
                                CONC_MONTO = :BASICO;
                                VALOR = ((:CONC_MONTO)+ :CAMBSALTRANS * :CONC_PORC) /100;
                                end
                            else
                                if (:CONC_MONTO = 0 and :MONTOS = 0) then
                                    begin
                                    CONC_MONTO = :BASICO;
                                    VALOR = (((:CONC_MONTO / 30) * :diaslaborados) + :CAMBSALTRANS * :CONC_PORC) /100;
                                    end
                        end
                    end
                end
            else
                /* SI TIENE MONTO EN EMPLEADO_CONCEPTOS */
                if ((CONC_PORC = 0 or (CONC_PORC is null)) and (:PORCEN = 0 or (PORCEN is null))) then
                    begin
                    VALOR = (:MONTOS);
                    if (:CONC_DIAS = 'S') then
                        VALOR = (:VALOR / 30) * :diaslaborados;
                    end
                else
                    if (:PORCEN <> 0 and PORCEN is not null) then
                        begin
                        VALOR = ((:MONTOS ) * :PORCEN) /100;
                        end
                    else
                        begin
                        VALOR = ((:MONTOS) * :CONC_PORC) /100;
                        end
             end

        if (CONC_PROMEDIO = 'S') then
            begin
            /* CALCULO DEL PROMEDIO BASE DESDE LA FECHA MENOS EL NUMERO DE PERIODOS */
            EXECUTE PROCEDURE periodo_nom_fecha (:fecliq, :periodicidad) returning_values (:perfinal, :anofin);
            if (perfinal < numeroprom) then
                BEGIN
                anoini = anofin - 1;
                if (periodicidad = 1) then
                    perinicial = 12 - (numeroprom - perfinal) + 1;
                if (periodicidad = 2) then
                    perinicial = 24 - (numeroprom - perfinal) + 1;
                if (periodicidad = 3) then
                    perinicial = 52 - (numeroprom - perfinal) + 1;
                END
            ELSE
                BEGIN
                PERINICIAL = :perfinal - :NUMEROPROM + 1;
                anoini = ANOFIN;
                END
            if (anoini <> anofin) then
                select sum (NOCO_VALOR) from NOMINA_CONCEPTOS N where N.NOCO_APLICAPROM = 'S' and
                    ((N.NOCO_PERIODO >= :PERINICIAL and N.NOCO_ANO = :anoini) or
                    (N.NOCO_PERIODO <= :perfinal and N.NOCO_ANO = :anofin)) and TERC_NIT = :NITEMPL into :VALOR;
            else
                select sum (NOCO_VALOR) from NOMINA_CONCEPTOS N where N.NOCO_APLICAPROM = 'S' and
                    N.NOCO_PERIODO >= :PERINICIAL and N.NOCO_ANO = :anoini
                    and N.NOCO_PERIODO <= :perfinal and TERC_NIT = :NITEMPL into :VALOR;
            /* sume el saldo inicial */
            SALDOSINI = 0;
            select NOCO_VALOR from NOMINA_CONCEPTOS where CONC_COD = :CONC_COD and TERC_NIT  = :NITEMPL and NOCO_PAGOOK = 'N' and NOCO_PERIODO = 0 into :SALDOSINI;
            if (SALDOSINI is null) then
                SALDOSINI = 0;
            else
                update NOMINA_CONCEPTOS N set NOCO_PAGOOK = 'S' where N.NOCO_APLICAPROM = 'S' and
                    CONC_COD = :CONC_COD and TERC_NIT = :NITEMPL and NOCO_PERIODO = 0;
            VALOR = :VALOR + :SALDOSINI;
            /* APLIQUE LA PROPORCION Y EL PORCENTAJE */
            VALOR = VALOR / NUMEROPROM;
            VALOR = VALOR * PORCEN / 100;
            end
        else if (CONC_APORTE = 'S') then
            begin
            HORASEX = null;
            DIASNOV = null;
            RETROACT = null;
            REEMBOLSO = null;
            BENEFICIOS = null;
            RECARGO = null;
            COMISION = null;
            INCAP = null;
            if ((:ENTIDAD = '' ) or (ENTIDAD is null)) then
                begin
                /*COMISIONES*/
                if (MENSUAL = 'S') then
                    BEGIN
                    if (PERIODICIDAD = 1) then
                        BEGIN
                        perinicial = PERFINAL;
                        PERFINAL = PERFINAL;
                        END
                    if (PERIODICIDAD = 2) then
                        BEGIN
                        perinicial = PERFINAL - (LIQUIDAPER - 1);
                        PERFINAL = PERFINAL + (2 - LIQUIDAPER);
                        END
                    if (PERIODICIDAD = 3) then
                        BEGIN
                        perinicial = PERFINAL - (LIQUIDAPER - 1);
                        PERFINAL = PERFINAL + (4 - LIQUIDAPER);
                        END
                    END
                ELSE
                    BEGIN
                    perinicial = PERFINAL;
                    PERFINAL = PERFINAL;
                    END
                /* SUME LAS COMISIONES DE LOS DEMAS PERIODOS DEL MES */
                select SUM(C.NCOM_MONTO) from NOMINA_COMISIONES C where C.NCOM_ANO = :anofin
                    and C.NCOM_PERIODO >= :PERINICIAL AND C.NCOM_PERIODO <= :PERFINAL
                    and C.NCOM_PERIODICIDAD = :PERIODICIDAD and C.TERC_NIT = :NITEMPL
                    into :COMISION;
                if (COMISION is null) then
                    COMISION = 0;
                /*RETROACTIVO*/
                select C.EMCO_MONTO from EMPLEADO_CONCEPTOS C where C.TERC_NIT = :NITEMPL
                    and C.CONC_COD = 933 into :RETROACT;
                if (RETROACT is null ) then
                    RETROACT = 0;
                /* REEMBOLSO*/
                select C.EMCO_MONTO from EMPLEADO_CONCEPTOS C where C.TERC_NIT = :NITEMPL
                    and C.CONC_COD = 952 into :REEMBOLSO;
                if (REEMBOLSO is null ) then
                    REEMBOLSO = 0;
                /* INCAPACIDAD*/
                select ND.NNDE_DURACION from NOMINA_NOVEDADES N, nomina_novedades_detalle ND
                    where N.nono_id = ND.nono_id AND N.TERC_NIT = :NITEMPL
                    and ND.NNDE_PERIODO = :PERFINAL and ND.NNDE_ANO = :anofin and (N.TNOV_COD = 2 or (N.TNOV_COD = 3))
                    into :DIASNOV;
                if (:DIASNOV is null) then
                    INCAP = 0;
                else
                    INCAP = (:BASICO / 30)* :DIASNOV;
                /*BASICO*/
                if (SALINTEG = 'S') then
                    BASICO = BASICO * (tar_salinteg / 100);
                BASICO = ((:BASICO/30)*:diaslaborados);
                /*HORAS EXTRA*/
                select SUM(C.NOEX_MONTO) from NOMINA_HORASEXT C where C.NOEX_ANO = :anofin
                    and C.NOEX_PERIODIO >= :PERINICIAL and C.NOEX_PERIODIO <= :PERFINAL
                    and C.NOEX_PERIODICIDAD = :PERIODICIDAD and C.TERC_NIT = :NITEMPL
                    into :HORASEX;
                if (HORASEX is null) then
                    HORASEX = 0;
                /*RECARGOS*/
                BASICOREC = SALARIO;
                RECARGO = (((:BASICOREC/30)/8)*:TAR_RECNOTC)*:RECNOCT;
                RECARGO = :RECARGO + ((((:BASICOREC/30)/8)*:TAR_RECFEST)*:RECFEST);
                if (RECARGO is null) then
                    RECARGO = 0;
                /* SMLV Y AUX. TRANSPORTE*/
                select P.PAAN_SALMINIMO from PARAMETROS_ANO P
                    where P.PAAN_ANO = :anofin into :SMLV;
                /*basico*/
                if (:BASICO + :COMISION + :HORASEX + :RETROACT+ :REEMBOLSO + :INCAP+ :CAMBSALTRANS < ((:SMLV/30)*:diaslaborados)) then
                    BASICO = (:SMLV/30)*:diaslaborados;
                /*BASE*/
                VALOR = :BASICO + :COMISION + :HORASEX + :RETROACT+ :REEMBOLSO + :INCAP + :RECARGO + :CAMBSALTRANS;

                if (CONC_COD = 904) then
                    begin
                    select A.PAAN_AFPTR from PARAMETROS_ANO A where A.PAAN_ANO = :anofin into :PORCEN;
                    AFPEMPL = ((:VALOR) * :PORCEN) /100;
                    end
                else if ((CONC_COD = 905) or (CONC_COD = 906) or (CONC_COD = 934) ) then
                    begin
                    select A.PAAN_AFPEM from PARAMETROS_ANO A where A.PAAN_ANO = :anofin into :PORCEN;
                    EMPRAFP = ((:VALOR) * :PORCEN) /100;
                    end
                else if ((CONC_COD = 908) or (CONC_COD = 909) or (CONC_COD = 935) ) then
                    begin
                    select A.PAAN_AFPEM from PARAMETROS_ANO A where A.PAAN_ANO = :anofin into :PORCEN;
                    EMPRAFP = ((:VALOR) * :PORCEN) /100;
                    end
                else if ((CONC_COD = 907) or (CONC_COD = 914) or (CONC_COD = 915) or (conc_cod = 938)) then
                    begin
                    if (CONC_COD = 907) then
                        begin
                        select A.PAAN_EPSTR from PARAMETROS_ANO A where A.PAAN_ANO = :anofin into :PORCEN;
                        EPSEMPL = ((:VALOR) * :PORCEN) /100;
                        end
                    else
                        begin
                        select A.PAAN_EPSEM from PARAMETROS_ANO A where A.PAAN_ANO = :anofin into :PORCEN;
                        EMPREPS = ((:VALOR) * :PORCEN) /100;
                        end
                    end
                else if ((CONC_COD = 910) or (CONC_COD = 911) or (CONC_COD = 936)) then
                    begin
                    /*ccf */
                    select A.PAAN_CCF from PARAMETROS_ANO A where A.PAAN_ANO = :anofin into :PORCEN;
                    EMPRCCF = ((:VALOR) * :PORCEN) /100;
                    end
                else if ((CONC_COD = 916) or (CONC_COD = 917) or (CONC_COD = 939) ) then
                    begin
                    /*icbf */
                    select A.PAAN_ICBF from PARAMETROS_ANO A where A.PAAN_ANO = :anofin into :PORCEN;
                    EMPRICBF = ((:VALOR) * :PORCEN) /100;
                    end
                else if ((CONC_COD = 918) or (CONC_COD = 919) or (CONC_COD = 940) ) then
                    begin
                    /*sena */
                    select A.PAAN_SENA from PARAMETROS_ANO A where A.PAAN_ANO = :anofin into :PORCEN;
                    EMPRSENA = ((:VALOR) * :PORCEN) /100;
                    end
                else if ((CONC_COD = 912) or (CONC_COD = 913) or (CONC_COD = 937)) then
                    begin
                    /* CESANTIAS SE PAGAN NO SE APORTAN*/
                    VALOR = 0;
                    end
                else
                    begin
                    if (COMISION is null) then
                        COMISION = 0;
                    select C.NCOM_MONTO from NOMINA_COMISIONES C where C.NCOM_ANO = :anofin and C.NCOM_PERIODO = :PERFINAL and C.NCOM_PERIODICIDAD = :PERIODICIDAD and C.TERC_NIT = :NITEMPL
                        into :COMISION;
                    CONC_MONTO = :BASICO + :COMISION;
                    if (CONC_PORC <> 0 and CONC_PORC is not null) then
                        VALOR = (((:CONC_MONTO/30 * :diaslaborados )+ :CAMBSALTRANS + :INCAP) * :CONC_PORC) /100;
                    else
                        if (:PORCEN <> 0 and :PORCEN is not null) then
                            VALOR = (((:CONC_MONTO/30 * :diaslaborados )+ :CAMBSALTRANS + :INCAP) * :PORCEN) /100;
                        else
                            if (:MONTOS <> 0 and :MONTOS is not null) then
                                VALOR = :MONTOS;
                            else
                                if (:CONC_MONTO <> 0 and :CONC_MONTO is not null) then
                                    VALOR = :CONC_MONTO;
                    end
                end
            end /* aportes */
        else if (CONC_COD = 920) then /* comisiones */
            begin
            select C.NCOM_MONTO from NOMINA_COMISIONES C where C.NCOM_ANO = :ANOFIN and C.NCOM_PERIODO = :PERFINAL and C.NCOM_PERIODICIDAD = :PERIODICIDAD and C.TERC_NIT = :NITEMPL into :VALOR;
            if (VALOR is null) then
                VALOR = 0;
            end
        else if (CONC_COD = 900 or (:CONC_COD = 931)) then /* horas extra */
            begin
            select C.NOEX_MONTO from NOMINA_HORASEXT C where C.NOEX_ANO = :anofin and
                C.NOEX_PERIODIO = :PERFINAL and C.NOEX_PERIODICIDAD = :PERIODICIDAD and C.TERC_NIT = :NITEMPL into :VALOR;
            if (VALOR is null) then
                VALOR = 0;
            end
        else if (CONC_COD = 954) then /* cartera */
            begin
            select C.NCAR_MONTO from NOMINA_CARTERA C where C.NCAR_ANO = :anofin and C.NCAR_PERIODO = :PERFINAL and C.NCAR_PERIODICIDAD = :PERIODICIDAD and C.TERC_NIT = :NITEMPL into :VALOR;
            if (VALOR is null) then
                VALOR = 0;
            end
        else if (CONC_COD = 932) then
            begin
            /* incapacidad */
            select ND.NNDE_DURACION from NOMINA_NOVEDADES N, nomina_novedades_detalle ND
                where N.nono_id = ND.nono_id AND N.TERC_NIT = :NITEMPL and ND.NNDE_PERIODO = :PERFINAL and ND.NNDE_ANO = :anofin
                and (N.TNOV_COD = 2 or (N.TNOV_COD = 3)) into :DIASNOV;
            if (:DIASNOV is null) then
                VALOR = 0;
            else
                VALOR = (:BASICO / 30)* :DIASNOV;
            end
        else if (CONC_COD = 921) then
            begin
            if (PORCEN is not null and PORCEN <> 0) then
                VALOR = ((BASICO / 30)* :diaslaborados ) * :PORCEN /100;
            else
                if (CONC_PORC is not null and CONC_PORC <> 0) then
                    VALOR = ((BASICO / 30)* :diaslaborados ) * :CONC_PORC /100;
            end
        else if (CONC_COD = 953) then
            begin
            /*RECARGO */
            BASICO = SALARIO;
            VALOR = (((:BASICO/30)/8)*:TAR_RECNOTC)*:RECNOCT;
            VALOR = :VALOR + ((((:BASICO/30)/8)*:TAR_RECFEST)*:RECFEST);
            end
        if (CONC_APORTE = 'S') then
            begin
            if (ENTIDAD is null or (ENTIDAD = '') ) then
                ENTIDAD = :CONC_ENTIDAD;
            end
        end
    if ((VALOR <> 0) and (VALOR is not null)) then
        begin
        execute procedure REDONDEE(:VALOR, 0) returning_values (VALOR);
        if (CONC_APORTE = 'N') then
            BEGIN
            if (conc_beneficio = 'S') then
                beneficios = beneficios + VALOR;
            ELSE
                if (CONC_DEDUC = 'S') then
                    BEGIN
                    OTROSDED = OTROSDED + VALOR;
                    END
                ELSE
                    BEGIN
                    if (conc_salario = 'S') then
                        SUELDO = SUELDO + VALOR;
                    else
                        OTROSDEV = OTROSDEV + VALOR;
                    END
            END
        end
    end

/* calcule el promedio de sueldo */
if (periodicidad = 1) then
    numeroprom = 6;
if (periodicidad = 2) then
    numeroprom = 12;
if (periodicidad = 3) then
    numeroprom = 24;

EXECUTE PROCEDURE periodo_nom_fecha (:fecliq, :periodicidad) returning_values (:perfinal, :anofin);
if (perfinal < numeroprom) then
    BEGIN
    anoini = anofin - 1;
    if (periodicidad = 1) then
        perinicial = 12 - (numeroprom - perfinal) + 1;
    if (periodicidad = 2) then
        perinicial = 24 - (numeroprom - perfinal) + 1;
    if (periodicidad = 3) then
        perinicial = 52 - (numeroprom - perfinal) + 1;
    END
ELSE
    BEGIN
    PERINICIAL = :perfinal - :NUMEROPROM + 1;
    anoini = ANOFIN;
    END
if (anoini <> anofin) then
    select sum (NOCO_VALOR) from NOMINA_CONCEPTOS N where N.NOCO_APLICAPROM = 'S' and
        ((N.NOCO_PERIODO >= :PERINICIAL and N.NOCO_ANO = :anoini) or
        (N.NOCO_PERIODO <= :perfinal and N.NOCO_ANO = :anofin)) and TERC_NIT = :nitempl into :SALARIO;
else
    select sum (NOCO_VALOR) from NOMINA_CONCEPTOS N where N.NOCO_APLICAPROM = 'S' and
        N.NOCO_PERIODO >= :PERINICIAL and N.NOCO_ANO = :anoini
        and N.NOCO_PERIODO <= :perfinal and TERC_NIT = :nitempl into :SALARIO;
if (SALARIO is null) then
    SALARIO = 0;
SALARIO = SALARIO / 6; /* siempre es mensual sin importar la periodicidad */
/* PRIMA */
/* CALCULE FECHA DEL ULTIMO PAGO DE PRIMA */
SELECT MAX(N.nomi_feccausa) FROM NOMINA N, NOMINA_CONCEPTOS NC, CONCEPTOS_NOMINA C
    WHERE N.nomi_id = NC.nomi_id AND NC.terc_nit = :nitempl AND NC.conc_cod = C.conc_cod AND
    UPPER(C.conc_nombre) LIKE '%PRIMA%' AND NC.noco_deduc = 'N' AND NC.noco_aporte = 'N' AND NC.noco_prov = 'N'
    INTO :FECPRIMA;
DIASAUX = fecliq - fecprima;
prima = :salario * diasaux / 360;
EXECUTE PROCEDURE REDONDEE(:prima, -1) RETURNING_VALUES (:prima);
/* CESANTIA */
/* CALCULE FECHA DEL ULTIMO PAGO DE PRIMA */
SELECT MAX(N.nomi_feccausa) FROM NOMINA N, NOMINA_CONCEPTOS NC, CONCEPTOS_NOMINA C
    WHERE N.nomi_id = NC.nomi_id AND NC.terc_nit = :nitempl AND NC.conc_cod = C.conc_cod AND
    UPPER(C.conc_nombre) LIKE '%CESANTIA%' AND NC.noco_deduc = 'N' AND NC.noco_aporte = 'N' AND NC.noco_prov = 'N'
    INTO :fecces;
DIASAUX = fecliq - fecces;
cesantia = :salario * diasaux / 360;
EXECUTE PROCEDURE REDONDEE(:cesantia, -2) RETURNING_VALUES (:cesantia);
/* INTERESES SOBRE LA CESANTIA */
intcesant = CESANTIA * diasaux * 0.12 / 360;
EXECUTE PROCEDURE REDONDEE(:intcesant, -2) RETURNING_VALUES (:intcesant);
/* VACACIONES */
/* CALCULE FECHA DE LAS ULTIMAS VACACIONES */
SELECT MAX(VACA_FECHA) FROM VACACIONES WHERE terc_nit = :nitempl INTO :fecvac;
if (fecvac IS NULL) then
    select e.empl_fecing from empleados e where terc_nit = :nitempl into :fecvac;
DIASAUX = fecliq - fecvac;
vacacion = :salario * diasaux / 720;
EXECUTE PROCEDURE REDONDEE(:vacacion, -2) RETURNING_VALUES (:vacacion);
/* PRESTAMOS */
SELECT SUM (PRCU_MONTO) FROM PRESTAMO_CUOTAS P, PRESTAMO_NOMINA PN WHERE PN.prno_id = P.prno_id AND PN.terc_nit = :nitempl AND P.prcu_ok = 'N' INTO :dsprestamo;
IF (dsprestamo IS NULL) THEN
dsprestamo = 0;

totpagos = :PRIMA + :CESANTIA + :INTCESANT + :VACACION + :SUELDO + :otrosdev;
totdesc = :EPSEMPL + :AFPEMPL + :DSPRESTAMO + otrosded;
total = :totpagos - :totdesc;
totempr = :EMPREPS + :EMPRAFP + :EMPRCCF + :EMPRSENA + :EMPRICBF;
SUSPEND;
END
^

SET TERM ; ^

/* 20100916c */
/* PAGO MENSUAL DEJABA LAS VARIABLES PERINICIAL Y PERFINAL INICIALIZADAS Y OTROS CONCEPTOS NO LOS RECALCULAN OCASIONANDO ERRORES EN LA LIQUIDACION */

SET TERM ^ ;

CREATE OR ALTER procedure CAUSA_NOMINA (
    FEC date,
    PERIODO integer,
    PERIODICIDAD integer,
    PAGOGLOBAL char(1),
    ANO char(4),
    DEPTO integer)
returns (
    IDNOMINA integer,
    ITEMINI integer)
AS
declare variable item integer;
declare variable nite varchar(20);
declare variable nit_tercero varchar(20);
declare variable concept integer;
declare variable montos numeric(18,2);
declare variable porcen numeric(9,4);
declare variable entidad varchar(20);
declare variable conc_cod integer;
declare variable conc_deduc char(1);
declare variable conc_porc numeric(9,4);
declare variable conc_entidad integer;
declare variable conc_monto numeric(18,2);
declare variable conc_modifi char(1);
declare variable conc_promedio char(1);
declare variable valor numeric(18,2);
declare variable diaslab integer;
declare variable conc_prov char(1);
declare variable conc_aporte char(1);
declare variable numeroprom integer;
declare variable conc_aplicaprom char(1);
declare variable perinicial integer;
declare variable perfinal integer;
declare variable anoini integer;
declare variable anofin integer;
declare variable conc_dias char(1);
declare variable conc_otroconc char(1);
declare variable conc_codotroconc integer;
declare variable anosum integer;
declare variable salario char(1);
declare variable liquidaper integer;
declare variable basico numeric(18,2);
declare variable niteps varchar(20);
declare variable nitafc varchar(20);
declare variable nitafp varchar(20);
declare variable nitccf varchar(20);
declare variable gtoempr char(1);
declare variable comision numeric(18,2);
declare variable cambsaltrans numeric(18,2);
declare variable saldosini numeric(18,2);
declare variable duranov integer;
declare variable base numeric(18,2);
declare variable aprox integer;
declare variable mensual char(1);
declare variable horasex numeric(18,2);
declare variable diasnov integer;
declare variable tomasal integer;
declare variable retroact numeric(18,2);
declare variable reembolso numeric(18,2);
declare variable incap numeric(18,2);
declare variable auxtrans numeric(18,2);
declare variable smlv numeric(18,2);
declare variable beneficios numeric(18,2);
declare variable confirmado char(1);
declare variable recnoct numeric(18,2);
declare variable recfest numeric(18,2);
declare variable tar_recnotc numeric(9,4);
declare variable tar_recfest numeric(9,4);
declare variable recargo numeric(18,2);
declare variable basicorec numeric(18,2);
declare variable parambenef char(2);
declare variable vacacdisf numeric(18,2);
declare variable valorpredet numeric(18,2);
declare variable basicoemp numeric(18,2);
declare variable salinteg char(1);
declare variable tar_salinteg numeric(9,4);
begin
execute procedure LEE_CONFIGURACION('NOMINA','LIQUIDACION','TOMAR BENEFICIOS PARA CALCULAR PROVISIONES')returning_values(:PARAMBENEF);
execute procedure LEE_CONFIGURACION('NOMINA','GENERAL','REDONDEO AL MULTIPLO DE DIEZ EN TOTALES')returning_values(:APROX);
select N.NOMI_ID, N.NOMI_LIQOK from NOMINA N where N.NOMI_PERIODO = :PERIODO and N.NOMI_PERIODOCIDAD = :PERIODICIDAD
    and N.NOMI_ANO = :ANO into :IDNOMINA, :CONFIRMADO;
if (:IDNOMINA is null) then
    begin
    execute procedure CAMBIE_ID_NOMINA returning_values(:IDNOMINA);
    insert into NOMINA (NOMI_ID, NOMI_FECCAUSA, NOMI_PAGOGLOBAL, NOMI_PERIODOCIDAD, NOMI_PERIODO, NOMI_ANO, NOMI_LIQOK)
    values (:IDNOMINA, :FEC,:PAGOGLOBAL, :PERIODICIDAD, :PERIODO, :ANO, 'N');
    ITEM = 1;
    end
else
    begin
    select max(N.NOCO_ITEM) from NOMINA_CONCEPTOS N where N.NOMI_ID = :IDNOMINA
    into :ITEM;
    end
if ((CONFIRMADO = 'S') and (IDNOMINA is not null)) then
    begin
    IDNOMINA = 0;
    end
else
    begin
    insert into NOMINA_DEPARTAMENTO (NOMI_ID, NODP_DEPTO)values(:IDNOMINA,:DEPTO);
    select P.PAAN_RECNOC, P.PAAN_RECFEST, P.paan_salinteg from PARAMETROS_ANO P where P.PAAN_ANO = :ANO
        into :TAR_RECNOTC, :TAR_RECFEST, TAR_SALINTEG;
    ITEMINI = ITEM;
    for select E.TERC_NIT, E.EMPL_EPS, E.EMPL_AFC, E.EMPL_AFP, E.EMPL_CCF, E.empl_salinteg
        from EMPLEADOS E
        where E.EMPL_PPAGO = :PERIODICIDAD and ((E.EMPL_FECRET is null) or (E.EMPL_FECRET > :FEC)) and E.EMPL_FECING <= :FEC
        and ((:DEPTO = 0) or (e.empl_dpto = :DEPTO))
        into :NITE, :NITEPS, :NITAFC, :NITAFP, :NITCCF, :SALINTEG
        do
        begin
        select first 1 M.MVSE_SALARIO from MOVIMIENTO_SALARIO_EMPLEADO M where M.TERC_NIT = :NITE and M.MVSE_FECHA <= :FEC order by M.MVSE_FECHA desc into :BASICOEMP;
        BASICO = BASICOEMP;
        RECNOCT = null;
        RECFEST = null;
        select N.NOEX_RECNOCT, N.NOEX_RECFEST
            from NOMINA_HORASEXT N where N.NOEX_PERIODIO = :PERIODO and N.NOEX_ANO = :ANO and N.TERC_NIT = :NITE
            into :RECNOCT, :RECFEST;
        if (RECNOCT is null) then
            RECNOCT = 0;
        if (RECFEST is null) then
            RECFEST = 0;
        for select CE.TERC_NIT, CE.CONC_COD, CE.EMCO_MONTO, CE.EMCO_PORC, CE.EMPL_ENTIDAD, CE.EMCO_PERPROM, CE.EMCO_LUQUIDAPER, CE.EMCO_MENSUAL, CN.CONC_COD, CN.CONC_DEDUC,CN.CONC_PORC, CN.CONC_ENTIDAD, CN.CONC_MONTO,  CN.CONC_DIAS, CN.CONC_MODIFI,
            CN.CONC_PROMEDIO, CN.CONC_SALARIO, CN.CONC_PROV, CN.CONC_APORTE, CN.CONC_APLICAPROM, CN.CONC_OTROCONC, CN.CONC_CODOTROCONC, CN.CONC_GTOEMPR, CN.CONC_BASE, CE.EMCO_TOMSAL
            from EMPLEADO_CONCEPTOS CE, CONCEPTOS_NOMINA CN where (CE.CONC_COD = CN.CONC_COD) and (CE.TERC_NIT = :NITE) and
            ( ((CE.EMCO_FECINI <= :FEC and CE.EMCO_FECFIN >= :FEC)) or
            ((CN.CONC_TODOSPER = 'N') and (CE.EMCO_PPAGO = :PERIODO)) or ((CN.CONC_TODOSPER = 'S') AND (((:periodicidad = 1) AND (:PERIODO < 13)) or ((:periodicidad = 2) AND (:PERIODO < 25)))) )  order by (TERC_NIT )
            into :NIT_TERCERO, :CONCEPT,  :MONTOS, :PORCEN, :ENTIDAD, :NUMEROPROM, :LIQUIDAPER, :MENSUAL ,:CONC_COD, :CONC_DEDUC, :CONC_PORC,
            :CONC_ENTIDAD, :CONC_MONTO, :CONC_DIAS, :CONC_MODIFI,:CONC_PROMEDIO, :SALARIO,:CONC_PROV, :CONC_APORTE , :CONC_APLICAPROM, :CONC_OTROCONC, :CONC_CODOTROCONC, :GTOEMPR, :BASE, :TOMASAL
            do
            begin
            if (MENSUAL = 'S') then
                BEGIN
                if (PERIODICIDAD = 1) then
                    BEGIN
                    perinicial = PERIODO;
                    PERFINAL = PERIODO;
                    END
                if (PERIODICIDAD = 2) then
                    BEGIN
                    perinicial = PERIODO - (LIQUIDAPER - 1);
                    PERFINAL = PERIODO + (2 - LIQUIDAPER);
                    END
                if (PERIODICIDAD = 3) then
                    BEGIN
                    perinicial = PERIODO - (LIQUIDAPER - 1);
                    PERFINAL = PERIODO + (4 - LIQUIDAPER);
                    END
                END
            ELSE
                BEGIN
                perinicial = PERIODO;
                PERFINAL = PERIODO;
                END
                            
            if (CONC_DIAS = 'S') then
                execute procedure DIAS_LABORADOS (:NITE, :PERIODO, :FEC, :MENSUAL,:CONC_APORTE) returning_values (:DIASLAB);
            else
                BEGIN
                SELECT PPAG_DIAS FROM PERIODO_PAGO WHERE PPAG_COD = :periodicidad INTO :diaslab;
                END
            if (:TOMASAL <> 0) then
                begin
                /* SI EL CONCEPTO NOAPLICA EN ESTE PERIODO DEJE EL BASICO EN CERO */
                if ((:PERIODICIDAD = 2) and (:TOMASAL <> 2)) then
                    begin
                    if ((PERIODO = 2) or (PERIODO = 4) or (PERIODO = 6) or (PERIODO = 8) or (PERIODO = 10) or (PERIODO = 12)
                        or (PERIODO = 14) or (PERIODO = 16) or (PERIODO = 18) or (PERIODO = 20) or (PERIODO = 22) or (PERIODO = 24)) then
                        BASICO = 0;
                    end
                else
                    if ((:PERIODICIDAD = 3) and (:TOMASAL <> 1)) then
                        begin
                        if ((PERIODO = 1) or (PERIODO = 5) or (PERIODO = 9) or (PERIODO = 13) or (PERIODO = 17) or (PERIODO = 21)
                            or (PERIODO = 25) or (PERIODO = 29) or (PERIODO = 33) or (PERIODO = 37) or (PERIODO = 41) or (PERIODO = 45)
                            or (PERIODO = 49)) then
                            BASICO = 0;
                        end
                    else
                        if ((:PERIODICIDAD = 3) and (:TOMASAL <> 2)) then
                            begin
                            if ((PERIODO = 2) or (PERIODO = 6) or (PERIODO = 10) or (PERIODO = 14) or (PERIODO = 18) or (PERIODO = 22)
                                or (PERIODO = 26) or (PERIODO = 30) or (PERIODO = 34) or (PERIODO = 38) or (PERIODO = 42) or (PERIODO = 46)
                                or (PERIODO = 50)) then
                                BASICO = 0;
                            end
                        else
                            if ((:PERIODICIDAD = 3) and (:TOMASAL <> 3)) then
                                begin
                                if ((PERIODO = 3) or (PERIODO = 7) or (PERIODO = 11) or (PERIODO = 15) or (PERIODO = 19) or (PERIODO = 23)
                                    or (PERIODO = 27) or (PERIODO = 31) or (PERIODO = 35) or (PERIODO = 39) or (PERIODO = 43) or (PERIODO = 47)
                                    or (PERIODO = 51)) then
                                    BASICO = 0;
                                end
                            else
                                if ((:PERIODICIDAD = 3) and (:TOMASAL <> 4)) then
                                begin
                                if ((PERIODO = 4) or (PERIODO = 8) or (PERIODO = 12) or (PERIODO = 16) or (PERIODO = 20) or (PERIODO = 24)
                                    or (PERIODO = 29) or (PERIODO = 32) or (PERIODO = 36) or (PERIODO = 40) or (PERIODO = 44) or (PERIODO = 48)
                                    or (PERIODO = 52)) then
                                    BASICO = 0;
                                end
                end
            else
                begin
                /* SE CALCULA SOBRE TODOS LOS PERIODOS */
                BASICO = BASICOEMP;
                end
            VALORPREDET = null;
            select VP.NVPR_MONTO from NOMINA_VALOR_PREDET VP where VP.NVPR_PERIODICIDAD = :PERIODICIDAD and VP.NVPR_PERIODO = :PERIODO and VP.NVPR_ANO = :ANO and VP.CONC_COD = :CONC_COD and VP.TERC_NIT = :NITE
                into :VALORPREDET;
            if ((:VALORPREDET <> 0) and (VALORPREDET is not null)) then
                VALOR = VALORPREDET;
            else
                begin
                /* SI HAY UN CAMBIO TRANSITORIO DE SALARIO AJUSTE LOS DIAS Y CALCULE EL VALOR A SUMAR */
                select SUM((N.NONO_VALOR /30) * ND.NNDE_DURACION), SUM(ND.NNDE_DURACION) from NOMINA_NOVEDADES N, nomina_novedades_detalle ND
                    where N.nono_id = ND.nono_id AND N.TNOV_COD = 11 and N.TERC_NIT = :NITE and ND.NNDE_PERIODO = :PERIODO
                    into :CAMBSALTRANS, :DURANOV;
                if (CAMBSALTRANS is null) then
                    CAMBSALTRANS = 0;
                if (DURANOV is null) then
                    DURANOV = 0;
                DIASLAB = :DIASLAB - :DURANOV;
                /* SI ES UN PRESTAMO, TRAIGA LA CUOTA */
                if (CONC_COD = 922) then
                    begin
                    select sum(P.PRCU_MONTO) from PRESTAMO_CUOTAS P, PRESTAMO_NOMINA PN
                        where P.PRCU_ANO = :ANO and P.PRCU_PERIODO = :PERIODO and PN.PRNO_ID = P.PRNO_ID and PN.TERC_NIT = :NITE into :VALOR;
                    if (VALOR is null) then
                        VALOR = 0;
                    ITEM = :ITEM + 1;
                    /* MARQUE LA CUOTA COMO PAGADA */
                    update PRESTAMO_CUOTAS  P set PRCU_OK = 'S' where P.PRCU_ANO = :ANO and P.PRCU_PERIODO = :PERIODO
                        and exists (select PRNO_ID from PRESTAMO_NOMINA where TERC_NIT = :NITE and PRNO_ID = P.prno_id);
                    end
                else
                    if ((:MONTOS = 0) or (:MONTOS is null)) then
                        begin
                        /* SI EL CONCEPTO DEL EMPLEADO NO TIENE MONTO TRAIGA EL DE CONCEPTOS_NOMINA */
                        if ((CONC_PORC = 0 and :PORCEN = 0) or (CONC_PORC is null and :PORCEN = 0) or (CONC_PORC = 0 and :PORCEN is null) or (CONC_PORC is null and :PORCEN is null) ) then
                            begin
                            /* SIN PORCENTAJE */
                            if ((CONC_MONTO <> 0) and (CONC_MONTO is not null) ) then
                                begin
                                VALOR = :CONC_MONTO;
                                if (:CONC_DIAS = 'S') then
                                    VALOR = (:VALOR / 30) * :DIASLAB;
                                end
                            else
                                if (SALARIO = 'S' and CONC_COD <> 900 and CONC_COD <> 920 and CONC_COD <> 932 and CONC_COD <> 953) then
                                    begin
                                    /* SI ES SALARIO SUME LAS EXTRAS */
                                    BASICO = BASICOEMP;
                                    BASICO = ((:BASICO/30)*:DIASLAB);/* - (((:BASICO/30)/8)*:RECNOCT);/* PFP:DEBERIA SER + Y POR LA TARIFA QUE NO VEO POR NINGUN LADO
                                    BASICO = :BASICO - (((:BASICO/30)/8)*:RECFEST);*/
                                    CONC_MONTO = :BASICO;
                                    VALOR = (:CONC_MONTO/*/30 * :diaslab*/ ) + :CAMBSALTRANS;
                                    end
                                else
                                    begin
                                    VALOR = MONTOS;
                                    if (:CONC_DIAS = 'S') then
                                        VALOR = (:VALOR / 30) * :DIASLAB;
                                    end
                            end
                        else    
                            begin
                            if (:PORCEN <> 0) then
                                begin
                                /* SI TIENE PORCENTAJE EN EMPLEADO_CONCEPTOS PERO EL MONTO SE TRAE DE CONCPETOS_NOMINA */
                                if ((CONC_MONTO <> 0) and (CONC_MONTO is not null) ) then
                                    begin
                                    VALOR = ((:CONC_MONTO ) * :PORCEN) /100;
                                    end
                                end
                            else
                                begin
                                /* NO TIENE PORCENTAJE EN EMPLEADO_CONCEPTOS SE TRAE MONTO Y PORC DE CONCPETOS_NOMINA */
                                if ((CONC_MONTO <> 0) and (CONC_MONTO is not null) ) then
                                    begin
                                    VALOR = ((:CONC_MONTO) * :CONC_PORC) /100;
                                    end
                                else
                                    if (SALARIO = 'S' and CONC_COD <> 900 and CONC_COD <> 920 and CONC_COD <> 932 and CONC_COD <> 953) then
                                        begin
                                        BASICO = BASICOEMP;
                                        BASICO = ((:BASICO/30)*:DIASLAB); /* - (((:BASICO/30)/8)*:RECNOCT);
                                        BASICO = :BASICO - (((:BASICO/30)/8)*:RECFEST);*/
                                        CONC_MONTO = :BASICO;
                                        VALOR = ((:CONC_MONTO)+ :CAMBSALTRANS * :CONC_PORC) /100;
                                        end
                                    else
                                        if (:CONC_MONTO = 0 and :MONTOS = 0) then
                                            begin
                                            CONC_MONTO = :BASICO;
                                            VALOR = (((:CONC_MONTO / 30) * :DIASLAB) + :CAMBSALTRANS * :CONC_PORC) /100;
                                            end
                                end
                            end
                        end
                    else
                        /* SI TIENE MONTO EN EMPLEADO_CONCEPTOS */
                        if ((CONC_PORC = 0 or (CONC_PORC is null)) and (:PORCEN = 0 or (PORCEN is null))) then
                            begin
                            VALOR = (:MONTOS);
                            if (:CONC_DIAS = 'S') then
                                VALOR = (:VALOR / 30) * :DIASLAB;   
                            end
                        else
                            if (:PORCEN <> 0 and PORCEN is not null) then
                                begin
                                VALOR = ((:MONTOS ) * :PORCEN) /100;
                                end
                            else
                                begin
                                VALOR = ((:MONTOS) * :CONC_PORC) /100;
                                end
                if (CONC_PROMEDIO = 'S') then
                    begin
                    /* CALCULO DEL PROMEDIO BASE DESDE LA FECHA MENOS EL NUMERO DE PERIODOS */
                    EXECUTE PROCEDURE periodo_nom_fecha (:fec, :periodicidad) returning_values (:perfinal, :anofin);
                    if (perfinal < numeroprom) then
                        BEGIN
                        anoini = anofin - 1;
                        if (periodicidad = 1) then
                            perinicial = 12 - (numeroprom - perfinal) + 1;
                        if (periodicidad = 2) then
                            perinicial = 24 - (numeroprom - perfinal) + 1;
                        if (periodicidad = 3) then
                            perinicial = 52 - (numeroprom - perfinal) + 1;
                        END
                    ELSE
                        BEGIN
                        PERINICIAL = :perfinal - :NUMEROPROM + 1;
                        anoini = ANOFIN;
                        END
                    if (anoini <> anofin) then
                        select sum (NOCO_VALOR) from NOMINA_CONCEPTOS N where N.NOCO_APLICAPROM = 'S' and
                            ((N.NOCO_PERIODO >= :PERINICIAL and N.NOCO_ANO = :anoini) or
                            (N.NOCO_PERIODO <= :perfinal and N.NOCO_ANO = :anofin)) and TERC_NIT = :NITE into :VALOR;
                    else
                        select sum (NOCO_VALOR) from NOMINA_CONCEPTOS N where N.NOCO_APLICAPROM = 'S' and
                            N.NOCO_PERIODO >= :PERINICIAL and N.NOCO_ANO = :anoini
                            and N.NOCO_PERIODO <= :perfinal and TERC_NIT = :NITE into :VALOR;
                    /* sume el saldo inicial */
                    SALDOSINI = 0;
                    select NOCO_VALOR from NOMINA_CONCEPTOS where CONC_COD = :CONC_COD and TERC_NIT  = :NITE and NOCO_PAGOOK = 'N' and NOCO_PERIODO = 0 into :SALDOSINI;
                    if (SALDOSINI is null) then
                        SALDOSINI = 0;
                    else
                        update NOMINA_CONCEPTOS N set NOCO_PAGOOK = 'S' where N.NOCO_APLICAPROM = 'S' and
                            CONC_COD = :CONC_COD and TERC_NIT = :NITE and NOCO_PERIODO = 0;

                    VALOR = :VALOR + :SALDOSINI;
                    /* APLIQUE LA PROPORCION Y EL PORCENTAJE */
                    VALOR = VALOR / NUMEROPROM;
                    VALOR = VALOR * PORCEN / 100;
                    end
                else if (CONC_OTROCONC = 'S') then
                    begin
                    ANOSUM = cast(ANO as integer);
                    ANOSUM = ANOSUM - 1;
                    select sum (NOCO_VALOR) from NOMINA_CONCEPTOS N where N.NOCO_ANO = :ANOSUM and N.CONC_COD = :CONC_CODOTROCONC and N.TERC_NIT = :NITE into :VALOR;
                    select NOCO_VALOR from NOMINA_CONCEPTOS where NOCO_ANO = :ANOSUM and CONC_COD = :CONC_CODOTROCONC and TERC_NIT = :NITE and NOCO_PERIODO = 0 into :SALDOSINI;
                    if (SALDOSINI is null) then
                        SALDOSINI = 0;
                    else
                        update NOMINA_CONCEPTOS set NOCO_PAGOOK = 'S' where NOCO_ANO = :ANOSUM and CONC_COD = :CONC_CODOTROCONC and NOCO_PERIODO = 0 and TERC_NIT = :NITE;
                    VALOR = :VALOR + :SALDOSINI;
                    update NOMINA_CONCEPTOS set NOCO_PAGOOK = 'S' where NOCO_ANO = :ANOSUM and CONC_COD = :CONC_CODOTROCONC and TERC_NIT = :NITE;
                    end
                else if (CONC_APORTE = 'S') then
                    begin
                    HORASEX = null;
                    DIASNOV = null;
                    RETROACT = null;
                    REEMBOLSO = null;
                    BENEFICIOS = null;
                    RECARGO = null;
                    COMISION = null;
                    INCAP = null;
                    VACACDISF = null;
                    if ((:ENTIDAD = '' ) or (ENTIDAD is null)) then
                        begin
                        /*COMISIONES*/
                        if (MENSUAL = 'S') then
                            BEGIN
                            if (PERIODICIDAD = 1) then
                                BEGIN
                                perinicial = PERIODO;
                                PERFINAL = PERIODO;
                                END
                            if (PERIODICIDAD = 2) then
                                BEGIN
                                perinicial = PERIODO - (LIQUIDAPER - 1);
                                PERFINAL = PERIODO + (2 - LIQUIDAPER);
                                END
                            if (PERIODICIDAD = 3) then
                                BEGIN
                                perinicial = PERIODO - (LIQUIDAPER - 1);
                                PERFINAL = PERIODO + (4 - LIQUIDAPER);
                                END
                            END
                        ELSE
                            BEGIN
                            perinicial = PERIODO;
                            PERFINAL = PERIODO;
                            END
                            
                        /* SUME LAS COMISIONES DE LOS DEMAS PERIODOS DEL MES */
                        select SUM(C.NCOM_MONTO) from NOMINA_COMISIONES C where C.NCOM_ANO = :ANO
                            and C.NCOM_PERIODO >= :PERINICIAL AND C.NCOM_PERIODO <= :PERFINAL
                            and C.NCOM_PERIODICIDAD = :PERIODICIDAD and C.TERC_NIT = :NITE
                            into :COMISION;
                        if (COMISION is null) then
                            COMISION = 0;
                        /*RETROACTIVO*/
                        select C.EMCO_MONTO from EMPLEADO_CONCEPTOS C where C.TERC_NIT = :NITE
                            and C.CONC_COD = 933 into :RETROACT;
                            if (RETROACT is null ) then
                                RETROACT = 0;
                        /*REEMBOLSO*/
                        select C.EMCO_MONTO from EMPLEADO_CONCEPTOS C where C.TERC_NIT = :NITE
                            and C.CONC_COD = 952 into :REEMBOLSO;
                        if (REEMBOLSO is null ) then
                            REEMBOLSO = 0;
                        /*VACACIONES DISFRUTADAS ANTERIORMENTE*/
                        select C.EMCO_MONTO from EMPLEADO_CONCEPTOS C where C.TERC_NIT = :NITE
                            and C.CONC_COD = 955 into :VACACDISF;
                        if (VACACDISF is null ) then
                            VACACDISF = 0;
                        /* INCAPACIDAD*/
                        select SUM(ND.NNDE_DURACION) from NOMINA_NOVEDADES N, nomina_novedades_detalle ND
                            where N.nono_id = ND.nono_id AND N.TERC_NIT = :NITE
                            and ND.NNDE_PERIODO >= :perinicial and ND.NNDE_PERIODO <= :perfinal and ND.NNDE_ANO = :ANO and (N.TNOV_COD = 2 or (N.TNOV_COD = 3))
                            into :DIASNOV;
                        if (:DIASNOV is null) then
                            INCAP = 0;
                        else
                            INCAP = (:BASICO / 30)* :DIASNOV;
                        /*BASICO*/
                        if (SALINTEG = 'S') then
                            BASICO = BASICO * (tar_salinteg / 100);

                        if (MENSUAL <> 'S') then
                            BASICO = ((:BASICO/30)*:DIASLAB);
                        /*HORAS EXTRA*/
                        select SUM(C.NOEX_MONTO) from NOMINA_HORASEXT C where C.NOEX_ANO = :ANO
                            and C.NOEX_PERIODIO >= :PERINICIAL and C.NOEX_PERIODIO <= :PERFINAL
                            and C.NOEX_PERIODICIDAD = :PERIODICIDAD and C.TERC_NIT = :NITE
                            into :HORASEX;
                        if (HORASEX is null) then
                            HORASEX = 0;
                        /*RECARGOS*/
                        BASICOREC = BASICOEMP;
                        RECARGO = (((:BASICOREC/30)/8)*:TAR_RECNOTC)*:RECNOCT;
                        RECARGO = :RECARGO + ((((:BASICOREC/30)/8)*:TAR_RECFEST)*:RECFEST);
                        if (RECARGO is null) then
                            RECARGO = 0;
                        /*basico*/
                        if (MENSUAL <> 'S') then
                            begin
                            if (:BASICO + :COMISION + :HORASEX + :RETROACT+ :REEMBOLSO + :INCAP+ :CAMBSALTRANS < ((:SMLV/30)*:DIASLAB)) then
                                BASICO = (:SMLV/30)*:DIASLAB;
                            end
                        else
                            begin
                            if (:BASICO + :COMISION + :HORASEX + :RETROACT+ :REEMBOLSO + :INCAP+ :CAMBSALTRANS < :SMLV) then
                                BASICO = :SMLV;
                            end
                        /* SMLV Y AUX. TRANSPORTE*/
                        select P.PAAN_AUXTR, P.PAAN_SALMINIMO from PARAMETROS_ANO P
                            where P.PAAN_ANO = :ANO into :AUXTRANS, :SMLV;
                        /*BASE*/
                        VALOR = :BASICO + :COMISION + :HORASEX + :RETROACT+ :REEMBOLSO + :INCAP + :RECARGO + :CAMBSALTRANS + :VACACDISF;

                        if (CONC_COD = 904) then
                            begin
                            ENTIDAD = :NITAFP;
                            select A.PAAN_AFPTR from PARAMETROS_ANO A where A.PAAN_ANO = :ANO into :PORCEN;
                            VALOR = ((:VALOR) * :PORCEN) /100;
                            end
                        else if ((CONC_COD = 905) or (CONC_COD = 906) or (CONC_COD = 934) ) then
                            begin
                            ENTIDAD = :NITAFP;
                            select A.PAAN_AFPEM from PARAMETROS_ANO A where A.PAAN_ANO = :ANO into :PORCEN;
                            VALOR = ((:VALOR) * :PORCEN) /100;
                            end
                        else if ((CONC_COD = 907) or (CONC_COD = 914) or (CONC_COD = 915) or (conc_cod = 938)) then
                            begin
                            ENTIDAD = :NITEPS;
                            if (CONC_COD = 907) then
                                begin
                                select A.PAAN_EPSTR from PARAMETROS_ANO A where A.PAAN_ANO = :ANO into :PORCEN;
                                VALOR = ((:VALOR) * :PORCEN) /100;
                                end
                            else
                                begin
                                select A.PAAN_EPSEM from PARAMETROS_ANO A where A.PAAN_ANO = :ANO into :PORCEN;
                                    VALOR = ((:VALOR) * :PORCEN) /100;
                                end
                            end
                        else if ((CONC_COD = 910) or (CONC_COD = 911) or (CONC_COD = 936)) then
                            begin
                            /*ccf */
                            ENTIDAD = :NITCCF;
                            select A.PAAN_CCF from PARAMETROS_ANO A where A.PAAN_ANO = :ANO into :PORCEN;
                            VALOR = ((:VALOR) * :PORCEN) /100;
                            end
                        else if ((CONC_COD = 916) or (CONC_COD = 917) or (CONC_COD = 939) ) then
                            begin
                            /*icbf */
                            ENTIDAD = :NITCCF;
                            select A.PAAN_ICBF from PARAMETROS_ANO A where A.PAAN_ANO = :ANO into :PORCEN;
                            VALOR = ((:VALOR) * :PORCEN) /100;
                            end
                        else if ((CONC_COD = 918) or (CONC_COD = 919) or (CONC_COD = 940) ) then
                            begin
                            /*sena */
                            ENTIDAD = :NITCCF;
                            select A.PAAN_SENA from PARAMETROS_ANO A where A.PAAN_ANO = :ANO into :PORCEN;
                            VALOR = ((:VALOR) * :PORCEN) /100;
                            end
                        else if ((CONC_COD = 912) or (CONC_COD = 913) or (CONC_COD = 937)) then
                            begin
                            /* CESANTIAS */
                            ENTIDAD = :NITAFC;
                            if (PARAMBENEF = 'SI') then
                                begin
                                select sum(CE.EMCO_MONTO)
                                    from EMPLEADO_CONCEPTOS CE, CONCEPTOS_NOMINA CN where CN.CONC_BENEFIC = 'S' and (CE.TERC_NIT = :NITE) and (CE.CONC_COD = CN.CONC_COD) and
                                    ((CE.EMCO_FECINI <= :FEC and CE.EMCO_FECFIN >= :FEC) or ((CN.CONC_TODOSPER = 'N') and (CE.EMCO_PPAGO = :PERIODO)) or
                                    (CN.CONC_TODOSPER = 'S'))
                                    into :BENEFICIOS;
                                if (BENEFICIOS is null) then
                                    BENEFICIOS = 0;
                                end
                            else
                                BENEFICIOS = 0;
                            select P.PAAN_AUXTR, P.PAAN_SALMINIMO from PARAMETROS_ANO P
                                where P.PAAN_ANO = :ANO into :AUXTRANS, :SMLV;
                            if (:BASICO < (:SMLV*2)) then
                                AUXTRANS = (:AUXTRANS / 30) * :DIASLAB;
                            else
                                AUXTRANS = 0;
                            select A.PAAN_CESEMP from PARAMETROS_ANO A where A.PAAN_ANO = :ANO
                                into :PORCEN;
                            VALOR = ((:VALOR + :AUXTRANS + :BENEFICIOS) * :PORCEN) /100;
                            end
                        else
                            begin
                            if (COMISION is null) then
                                COMISION = 0;
                            select C.NCOM_MONTO from NOMINA_COMISIONES C where C.NCOM_ANO = :ANO and C.NCOM_PERIODO = :PERIODO and C.NCOM_PERIODICIDAD = :PERIODICIDAD and C.TERC_NIT = :NITE
                                into :COMISION;
                            CONC_MONTO = :BASICO + :COMISION;
                            if (CONC_PORC <> 0 and CONC_PORC is not null) then
                                if (mensual <> 'S') then
                                    VALOR = (((:CONC_MONTO/30 * :DIASLAB )+ :CAMBSALTRANS + :INCAP) * :CONC_PORC) /100;
                                else
                                    VALOR = ((:CONC_MONTO+ :CAMBSALTRANS + :INCAP) * :CONC_PORC) /100;
                            else
                                if (:PORCEN <> 0 and :PORCEN is not null) then
                                    if (mensual <> 'S') then
                                        VALOR = (((:CONC_MONTO/30 * :DIASLAB )+ :CAMBSALTRANS + :INCAP) * :PORCEN) /100;
                                    else
                                        VALOR = ((:CONC_MONTO + :CAMBSALTRANS + :INCAP) * :PORCEN) /100;
                                else
                                    if (:MONTOS <> 0 and :MONTOS is not null) then
                                        VALOR = :MONTOS;
                                    else
                                        if (:CONC_MONTO <> 0 and :CONC_MONTO is not null) then
                                            VALOR = :CONC_MONTO;
                            end
                        ITEM = :ITEM + 1;
                        end
                    end /* aportes */
                else if (CONC_PROV = 'S') then
                    begin
                    /*provisiones */
                    HORASEX = null;
                    DIASNOV = null;
                    RETROACT = null;
                    REEMBOLSO = null;
                    BENEFICIOS = null;
                    RECARGO = null;
                    COMISION = null;
                    INCAP = null;
                    if (MENSUAL = 'S') then
                        BEGIN
                        if (PERIODICIDAD = 1) then
                            BEGIN
                            perinicial = PERIODO;
                            PERFINAL = PERIODO;
                            END
                        if (PERIODICIDAD = 2) then
                            BEGIN
                            perinicial = PERIODO - (LIQUIDAPER - 1);
                            PERFINAL = PERIODO + (2 - LIQUIDAPER);
                            END
                        if (PERIODICIDAD = 3) then
                            BEGIN
                            perinicial = PERIODO - (LIQUIDAPER - 1);
                            PERFINAL = PERIODO + (4 - LIQUIDAPER);
                            END
                        END
                    ELSE
                        BEGIN
                        perinicial = PERIODO;
                        PERFINAL = PERIODO;
                        END
                    /*HORAS EXTRA*/
                    select SUM(C.NOEX_MONTO) from NOMINA_HORASEXT C where C.NOEX_ANO = :ANO
                        and C.NOEX_PERIODIO >= :PERINICIAL and C.NOEX_PERIODIO <= :PERFINAL
                        and C.NOEX_PERIODICIDAD = :PERIODICIDAD and C.TERC_NIT = :NITE
                        into :HORASEX;
                    if (HORASEX is null) then
                        HORASEX = 0;
                    /* RECARGO*/
                    BASICO = BASICOEMP;
                    RECARGO = (((:BASICO/30)/8)*:TAR_RECNOTC)*:RECNOCT;
                    RECARGO = :RECARGO + ((((:BASICO/30)/8)*:TAR_RECFEST)*:RECFEST);
                    /*INCAPACIDAD*/
                    select SUM(ND.NNDE_DURACION) from NOMINA_NOVEDADES N, nomina_novedades_detalle ND
                        where N.nono_id = ND.nono_id AND N.TERC_NIT = :NITE
                        and ND.NNDE_PERIODO >= :perinicial and ND.NNDE_PERIODO <= :perfinal and ND.NNDE_ANO = :ANO
                        and (N.TNOV_COD = 2 or (N.TNOV_COD = 3)) into :DIASNOV;
                    if (:DIASNOV is null) then
                        INCAP = 0;
                    else
                        INCAP = (:BASICO / 30)* :DIASNOV;
                    /* BASICO*/
                    if (mensual <> 'S') then
                        BASICO = ((:BASICO/30)*:DIASLAB);
                    if (SALINTEG = 'S') then
                        BASICO = BASICO * (tar_salinteg / 100);
                    /*BENEFICIOS*/
                    if (PARAMBENEF = 'SI') then
                        begin
                        select sum(CE.EMCO_MONTO)
                            from EMPLEADO_CONCEPTOS CE, CONCEPTOS_NOMINA CN where CN.CONC_BENEFIC = 'S'
                            and (CE.TERC_NIT = :NITE) and (CE.CONC_COD = CN.CONC_COD) and
                            ((CE.EMCO_FECINI <= :FEC and CE.EMCO_FECFIN >= :FEC) or ((CN.CONC_TODOSPER = 'N')
                            and (CE.EMCO_PPAGO = :PERIODO)) or (CN.CONC_TODOSPER = 'S'))
                            into :BENEFICIOS;
                        if (BENEFICIOS is null) then
                            BENEFICIOS = 0;
                        end
                    else
                        BENEFICIOS = 0;
                    if ((CONC_COD <> 929) and (CONC_COD <> 930) and (CONC_COD <> 944)) then
                        begin
                        /* si no es vacaciones */
                        select P.PAAN_AUXTR, P.PAAN_SALMINIMO from PARAMETROS_ANO P where P.PAAN_ANO = :ANO
                            into :AUXTRANS, :SMLV;
                        if (:BASICO < (:SMLV*2)) then
                            begin
                            if (mensual <> 'S') then
                                AUXTRANS = (:AUXTRANS / 30) * :DIASLAB;
                            end
                        else
                            AUXTRANS = 0;
                        end
                    else
                        AUXTRANS = 0;
                    CONC_MONTO = :BASICO;
                    if (CONC_PORC <> 0 and CONC_PORC is not null) then
                        VALOR = ((:CONC_MONTO + :CAMBSALTRANS + :INCAP + :RECARGO + :HORASEX + :AUXTRANS + :BENEFICIOS) * :CONC_PORC) /100;
                    else
                        if (PORCEN <> 0 and PORCEN is not null) then
                            VALOR = ((:CONC_MONTO + :CAMBSALTRANS + :INCAP + :RECARGO + :HORASEX + :AUXTRANS + :BENEFICIOS) * :PORCEN) /100;
                        else
                            if (MONTOS <> 0 and MONTOS is not null) then
                                VALOR = :MONTOS;
                            else
                                if (CONC_MONTO <> 0 and CONC_MONTO is not null) then
                                    VALOR = :CONC_MONTO;
                    ITEM = :ITEM + 1;
                    end /* provision */
                else if (CONC_COD = 920) then /* comisiones */
                    begin
                    select C.NCOM_MONTO from NOMINA_COMISIONES C where C.NCOM_ANO = :ANO
                    and C.NCOM_PERIODO >= :perinicial and C.NCOM_PERIODO <= :perfinal and C.NCOM_PERIODICIDAD = :PERIODICIDAD and C.TERC_NIT = :NITE into :VALOR;
                    if (VALOR is null) then
                        VALOR = 0;
                    ITEM = :ITEM + 1;
                    end
                else if (CONC_COD = 900 or (:CONC_COD = 931)) then /* horas extra */
                    begin
                    select SUM(C.NOEX_MONTO) from NOMINA_HORASEXT C where C.NOEX_ANO = :ANO and
                        C.NOEX_PERIODIO >= :perinicial and C.NOEX_PERIODIO <= :perfinal and C.NOEX_PERIODICIDAD = :PERIODICIDAD and C.TERC_NIT = :NITE into :VALOR;
                    if (VALOR is null) then
                        VALOR = 0;
                    ITEM = :ITEM + 1;
                    end
                else if (CONC_COD = 954) then /* cartera */
                    begin
                    select C.NCAR_MONTO from NOMINA_CARTERA C where C.NCAR_ANO = :ANO
                    and C.NCAR_PERIODO >= :perinicial and C.NCAR_PERIODO <= :perfinal and C.NCAR_PERIODICIDAD = :PERIODICIDAD and C.TERC_NIT = :NITE into :VALOR;
                    if (VALOR is null) then
                        VALOR = 0;
                    ITEM = :ITEM + 1;
                    end
                else if (CONC_COD = 932) then
                    begin
                    /* incapacidad */
                    select SUM(ND.NNDE_DURACION) from NOMINA_NOVEDADES N, nomina_novedades_detalle ND
                        where N.nono_id = ND.nono_id AND N.TERC_NIT = :NITE
                        and ND.NNDE_PERIODO >= :perinicial and ND.NNDE_PERIODO <= :perfinal and ND.NNDE_ANO = :ANO
                        and (N.TNOV_COD = 2 or (N.TNOV_COD = 3)) into :DIASNOV;
                    if (:DIASNOV is null) then
                        VALOR = 0;
                    else
                        VALOR = (:BASICO / 30)* :DIASNOV;
                    end
                else if (CONC_COD = 921) then
                    begin
                    if (PORCEN is not null and PORCEN <> 0) then
                        VALOR = ((BASICO / 30)* :DIASLAB ) * :PORCEN /100;
                    else
                        if (CONC_PORC is not null and CONC_PORC <> 0) then
                            VALOR = ((BASICO / 30)* :DIASLAB ) * :CONC_PORC /100;
                    end
                else if (CONC_COD = 953) then
                    begin
                    /* RECARGO */
                    BASICO = BASICOEMP;
                    VALOR = (((:BASICO/30)/8)*:TAR_RECNOTC)*:RECNOCT;
                    VALOR = :VALOR + ((((:BASICO/30)/8)*:TAR_RECFEST)*:RECFEST);
                    end
                if (CONC_APORTE = 'S') then
                    begin
                    if (ENTIDAD is null or (ENTIDAD = '') ) then
                        ENTIDAD = :CONC_ENTIDAD;
                    end
                end
            if ((VALOR <> 0) and (VALOR is not null)) then
                begin
                execute procedure REDONDEE(:VALOR, :APROX) returning_values (VALOR);
                if ((MENSUAL = 'N') or (PERIODICIDAD = 1))  then
                    insert into NOMINA_CONCEPTOS (NOMI_ID, NOCO_ITEM, CONC_COD,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, NOCO_GTOEMPR)
                        values (:IDNOMINA,:ITEM, :CONCEPT, :NIT_TERCERO, :VALOR, :ENTIDAD, :CONC_DEDUC, :CONC_PROV, :CONC_APORTE, :PERIODO, :ANO, :CONC_MODIFI, :CONC_APLICAPROM, :SALARIO, :GTOEMPR);
                else
                    if (MENSUAL = 'S') then
                        begin
                        if ((:PERIODICIDAD = 2) and (LIQUIDAPER = 1)) then
                            begin
                            if ((PERIODO = 1) or (PERIODO = 3) or (PERIODO = 5) or (PERIODO = 7) or (PERIODO = 9) or (PERIODO = 11)
                                or (PERIODO = 13) or (PERIODO = 15) or (PERIODO = 17) or (PERIODO = 19) or (PERIODO = 21) or (PERIODO = 23)) then
                                insert into NOMINA_CONCEPTOS (NOMI_ID, NOCO_ITEM, CONC_COD,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, NOCO_GTOEMPR)
                                    values (:IDNOMINA,:ITEM, :CONCEPT, :NIT_TERCERO, :VALOR, :ENTIDAD, :CONC_DEDUC, :CONC_PROV, :CONC_APORTE, :PERIODO, :ANO, :CONC_MODIFI, :CONC_APLICAPROM, :SALARIO, :GTOEMPR);
                            end
                        else if ((:PERIODICIDAD = 2) and (LIQUIDAPER = 2)) then
                            begin
                            if ((PERIODO = 2) or (PERIODO = 4) or (PERIODO = 6) or (PERIODO = 8) or (PERIODO = 10) or (PERIODO = 12)
                                or (PERIODO = 14) or (PERIODO = 16) or (PERIODO = 18) or (PERIODO = 20) or (PERIODO = 22) or (PERIODO = 24)) then
                                insert into NOMINA_CONCEPTOS (NOMI_ID, NOCO_ITEM, CONC_COD,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, NOCO_GTOEMPR)
                                    values (:IDNOMINA,:ITEM, :CONCEPT, :NIT_TERCERO, :VALOR, :ENTIDAD, :CONC_DEDUC, :CONC_PROV, :CONC_APORTE, :PERIODO, :ANO, :CONC_MODIFI, :CONC_APLICAPROM, :SALARIO, :GTOEMPR);
                            end
                        else if ((:PERIODICIDAD = 3) and (LIQUIDAPER = 1)) then
                            begin
                            if ((PERIODO = 1) or (PERIODO = 5) or (PERIODO = 9) or (PERIODO = 13) or (PERIODO = 17) or (PERIODO = 21)
                                or (PERIODO = 25) or (PERIODO = 29) or (PERIODO = 33) or (PERIODO = 37) or (PERIODO = 41) or (PERIODO = 45)
                                or (PERIODO = 49)) then
                                insert into NOMINA_CONCEPTOS (NOMI_ID, NOCO_ITEM, CONC_COD,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, NOCO_GTOEMPR)
                                    values (:IDNOMINA,:ITEM, :CONCEPT, :NIT_TERCERO, :VALOR, :ENTIDAD, :CONC_DEDUC, :CONC_PROV, :CONC_APORTE, :PERIODO, :ANO, :CONC_MODIFI, :CONC_APLICAPROM, :SALARIO, :GTOEMPR);
                            end
                        else if ((:PERIODICIDAD = 3) and (LIQUIDAPER = 2)) then
                            begin
                            if ((PERIODO = 2) or (PERIODO = 6) or (PERIODO = 10) or (PERIODO = 14) or (PERIODO = 18) or (PERIODO = 22)
                                or (PERIODO = 26) or (PERIODO = 30) or (PERIODO = 34) or (PERIODO = 38) or (PERIODO = 42) or (PERIODO = 46)
                                or (PERIODO = 50)) then
                                insert into NOMINA_CONCEPTOS (NOMI_ID, NOCO_ITEM, CONC_COD,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, NOCO_GTOEMPR)
                                    values (:IDNOMINA,:ITEM, :CONCEPT, :NIT_TERCERO, :VALOR, :ENTIDAD, :CONC_DEDUC, :CONC_PROV, :CONC_APORTE, :PERIODO, :ANO, :CONC_MODIFI, :CONC_APLICAPROM, :SALARIO, :GTOEMPR);
                            end
                        else if ((:PERIODICIDAD = 3) and (LIQUIDAPER = 3)) then
                            begin
                            if ((PERIODO = 3) or (PERIODO = 7) or (PERIODO = 11) or (PERIODO = 15) or (PERIODO = 19) or (PERIODO = 23)
                                or (PERIODO = 27) or (PERIODO = 31) or (PERIODO = 35) or (PERIODO = 39) or (PERIODO = 43) or (PERIODO = 47)
                                or (PERIODO = 51)) then
                                insert into NOMINA_CONCEPTOS (NOMI_ID, NOCO_ITEM, CONC_COD,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, NOCO_GTOEMPR)
                                    values (:IDNOMINA,:ITEM, :CONCEPT, :NIT_TERCERO, :VALOR, :ENTIDAD, :CONC_DEDUC, :CONC_PROV, :CONC_APORTE, :PERIODO, :ANO, :CONC_MODIFI, :CONC_APLICAPROM, :SALARIO, :GTOEMPR);
                            end
                        else if ((:PERIODICIDAD = 3) and (LIQUIDAPER = 4)) then
                            begin
                            if ((PERIODO = 4) or (PERIODO = 8) or (PERIODO = 12) or (PERIODO = 16) or (PERIODO = 20) or (PERIODO = 24)
                                or (PERIODO = 29) or (PERIODO = 32) or (PERIODO = 36) or (PERIODO = 40) or (PERIODO = 44) or (PERIODO = 48)
                                or (PERIODO = 52)) then
                                insert into NOMINA_CONCEPTOS (NOMI_ID, NOCO_ITEM, CONC_COD,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, NOCO_GTOEMPR)
                                    values (:IDNOMINA,:ITEM, :CONCEPT, :NIT_TERCERO, :VALOR, :ENTIDAD, :CONC_DEDUC, :CONC_PROV, :CONC_APORTE, :PERIODO, :ANO, :CONC_MODIFI, :CONC_APLICAPROM, :SALARIO, :GTOEMPR);
                            end
                        end
                    VALOR = 0;
                    BASICO = 0;
                    end
            end /* for */
        end
    end
suspend;
end
^

SET TERM ; ^


/* 20100916D */
/* CONCEPTO POR EMPLEADO AL CONTABILIZARE CONFIGURABLE */

INSERT INTO CONFIGURACION (CONF_MODULO, CONF_CATEGORIA, CONF_PROPIEDAD, CONF_VALOR, CONF_POSIBLES, CONF_AYUDA) VALUES ('NOMINA', 'GENERAL', 'CONTABILIZAR CON CONCEPTO INDIVIDUAL POR CADA EMPLEADO', 'NO', 'SI,NO', 'SI:En cada cuenta relaciona el empleado y el concepto liquidado, NO: EL concepto de todas las cuentas es el mismo del encabezado');
commit work;

SET TERM ^ ;

CREATE OR ALTER procedure CONTABIL_NOMINA (
    IDDOC integer)
returns (
    ERROR integer,
    IDC integer)
AS
declare variable itemdet integer;
declare variable idcontabil integer;
declare variable aporte char(1);
declare variable entidad varchar(20);
declare variable valor numeric(18,2);
declare variable ctagast varchar(20);
declare variable ctaxp varchar(20);
declare variable tercnit varchar(20);
declare variable fecaux date;
declare variable fecha char(8);
declare variable ano char(4);
declare variable periodicidad integer;
declare variable periodo integer;
declare variable numero varchar(6);
declare variable tipocom char(3);
declare variable prefcom varchar(4);
declare variable concepto varchar(60);
declare variable numerocom varchar(6);
declare variable proyecto varchar(4) character set none;
declare variable centro varchar(4) character set none;
declare variable codconc integer;
declare variable base numeric(18,2);
declare variable basico numeric(18,2);
declare variable comision numeric(18,2);
declare variable retroact numeric(18,2);
declare variable det char(1);
declare variable ctaadmin char(1);
declare variable CONCXEMP CHAR(2);
declare variable NOMCONC VARCHAR(60);
declare variable NOMTERC VARCHAR(60);
BEGIN
SELECT N.nomi_feccausa, N.nomi_ano, N.nomi_periodocidad, N.nomi_periodo FROM NOMINA N WHERE N.nomi_id = :iddoc INTO :fecaux, :ano, :periodicidad, :periodo;
NUMERO = :periodicidad || :periodo;
SELECT I.tico_cod, I.prco_pre, I.inno_det, I.inno_dtlleadmin FROM INTERFAZ_NOMINA I WHERE I.tido_cod = 92 INTO :tipocom, :prefcom,:det,:ctaadmin;
concepto = 'CAUSACION NOMINA AÑO ' || :ano || ' PERIODO ' || :periodo || ' PERIODICIDAD ' ||:periodicidad;
EXECUTE PROCEDURE completa_ceros(:numero)RETURNING_VALUES :numero;
SELECT P.pref_numero FROM PREFIJOS_CONTA P WHERE P.tico_cod = :tipocom AND P.prco_pref = :prefcom INTO :numerocom;
idcontabil = GEN_ID(ID_CONTABILIZA,1);
EXECUTE PROCEDURE FECHA_A_CONTA(:FECAUX) RETURNING_VALUES (:FECHA);
EXECUTE PROCEDURE lee_configuracion('NOMINA', 'GENERAL', 'CONTABILIZAR CON CONCEPTO INDIVIDUAL POR CADA EMPLEADO') returning_values (:CONCXEMP);
/* BORRE CUALQUIER OTRA ANTERIOR */
DELETE FROM CONTABILIZACION WHERE CNTB_IDREF = :iddoc AND CNTB_TIPOREF = 92;

INSERT INTO CONTABILIZACION (CNTB_ID, CNTB_TIPOREF, CNTB_IDREF, CNTB_PREFREF, CNTB_NUMREF, CNTB_FECHA, CNTB_TIPOCOMP, CNTB_PREFCNT, CNTB_CONCEPTO, CNTB_NUMERO, CNTB_PROCESADO)
    VALUES (:idcontabil, 92,:iddoc, :ano, :numero, :fecha, :tipocom, :prefcom, :concepto, :numerocom, 'N');
idc = :idcontabil;
itemdet = 0;
IF (DET = 'N') THEN
    BEGIN
    FOR SELECT max(NC.conc_cod),sum(NC.NOCO_VALORCONT), max(CN.conc_ctagast), max(NC.terc_nit), max(NC.noco_aporte), max(NC.noco_entidad)
        FROM NOMINA_CONCEPTOS NC, CONCEPTOS_NOMINA CN WHERE NC.conc_cod = CN.conc_cod AND NC.nomi_id = :iddoc and cn.conc_ctagast is not null and cn.conc_ctacxp is not null
        group by cn.conc_ctagast,nc.terc_nit
        INTO :codconc,:valor, :ctagast, :tercnit, :aporte, :entidad
        DO
        BEGIN
        SELECT E.proy_cod,E.cent_cod FROM EMPLEADOS E WHERE E.terc_nit = :tercnit INTO :proyecto, :centro;
        if (:proyecto IS NULL) then
            SELECT D.dpto_proy, D.dpto_centro FROM EMPLEADOS E, departamento D WHERE E.terc_nit = :tercnit AND E.empl_dpto = D.dpto_cod INTO :proyecto, :centro;
        base = null;
        IF (ctagast IS NULL) THEN
            BEGIN
            EXECUTE PROCEDURE ERROR (14, :IDDOC, :ctagast, 2);
            ERROR = ERROR + 1;
            END
        IF (ctaxp IS NULL) THEN
            BEGIN
            EXECUTE PROCEDURE ERROR (14, :IDDOC, :ctaxp, 2);
            ERROR = ERROR + 1;
            END
        IF (VALOR IS NULL) THEN
            VALOR = 0;
        IF (VALOR <> 0) THEN
            BEGIN
            IF (valor < 0) THEN
                valor = :valor * (-1);
            IF (codconc = 6) THEN
                BEGIN
                SELECT E.empl_salario FROM EMPLEADOS E WHERE E.terc_nit = :tercnit INTO :basico;
                SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :tercnit INTO :comision;
                IF (comision IS NULL) THEN
                    comision = 0;
                SELECT C.emco_monto FROM EMPLEADO_CONCEPTOS C WHERE C.terc_nit = :tercnit AND C.conc_cod = 933 INTO :retroact;
                IF (retroact IS NULL ) THEN
                    retroact = 0;
                base = :basico + :comision + :retroact;
                END
            IF (aporte = 'N') THEN
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_TERC, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_CONC, CNDE_PROY, cnde_centro,CNDE_BASE)
                             VALUES (:idcontabil, :itemdet, :ctagast, :tercnit, :valor, 0, :concepto, :proyecto, :centro,:base);
                itemdet = itemdet + 1;
                /*SELECT D.dpto_proy, D.dpto_centro FROM EMPLEADOS E, departamento D WHERE E.terc_nit = :tercnit AND E.empl_dpto = D.dpto_cod INTO :proyecto, :centro;
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_TERC, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_CONC, CNDE_PROY, cnde_centro,CNDE_BASE)
                             VALUES (:idcontabil, :itemdet, :ctaxp, :tercnit, 0,:valor, :concepto, :proyecto, :centro,:base);
                itemdet = itemdet + 1;            */
                END
            ELSE
                IF (aporte = 'S') THEN
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_TERC, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_CONC, CNDE_PROY, cnde_centro,CNDE_BASE)
                        VALUES (:idcontabil, :itemdet, :ctagast, :entidad, :valor, 0, :concepto, :proyecto, :centro,:base);
                    itemdet = itemdet + 1;
                    /*SELECT D.dpto_proy, D.dpto_centro FROM EMPLEADOS E, departamento D WHERE E.terc_nit = :tercnit AND E.empl_dpto = D.dpto_cod INTO :proyecto, :centro;
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_TERC, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_CONC, CNDE_PROY, cnde_centro,CNDE_BASE)
                        VALUES (:idcontabil, :itemdet, :ctaxp, :entidad, 0,:valor, :concepto, :proyecto, :centro,:base);
                    itemdet = itemdet + 1;                */
                    END
            END
        END
    SUSPEND;
    FOR SELECT max(NC.conc_cod),sum(NC.NOCO_VALORCONT), max(CN.conc_ctacxp), max(NC.terc_nit), max(NC.noco_aporte), max(NC.noco_entidad)
        FROM NOMINA_CONCEPTOS NC, CONCEPTOS_NOMINA CN WHERE NC.conc_cod = CN.conc_cod AND NC.nomi_id = :iddoc and cn.conc_ctagast is not null and cn.conc_ctacxp is not null
        group by cn.conc_ctacxp,nc.noco_nitcont
        INTO :codconc,:valor, :ctaxp, :tercnit, :aporte, :entidad
        DO
        BEGIN
        base = null;
        IF (ctagast IS NULL) THEN
            BEGIN
            EXECUTE PROCEDURE ERROR (14, :IDDOC, :ctagast, 2);
            ERROR = ERROR + 1;
            END
        IF (ctaxp IS NULL) THEN
            BEGIN
            EXECUTE PROCEDURE ERROR (14, :IDDOC, :ctaxp, 2);
            ERROR = ERROR + 1;
            END
        IF (VALOR IS NULL) THEN
            VALOR = 0;
        IF (VALOR <> 0) THEN
            BEGIN
            IF (valor < 0) THEN
                valor = :valor * (-1);
            IF (codconc = 6) THEN
                BEGIN
                SELECT E.empl_salario FROM EMPLEADOS E WHERE E.terc_nit = :tercnit INTO :basico;
                SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :tercnit INTO :comision;
                IF (comision IS NULL) THEN
                    comision = 0;
                SELECT C.emco_monto FROM EMPLEADO_CONCEPTOS C WHERE C.terc_nit = :tercnit AND C.conc_cod = 933 INTO :retroact;
                IF (retroact IS NULL ) THEN
                    retroact = 0;
                base = :basico + :comision + :retroact;
                END
            if ((codconc > 900) and (entidad is not null) AND (ctaadmin = 'S')) then
                begin
                SELECT A.admi_ctaconta FROM ADMINISTRADORA A WHERE A.terc_nit = :entidad INTO :ctaxp;
                if ((ctaxp is null) or (ctaxp = '')) then
                    begin
                    if ((codconc = 905) OR (codconc = 906) or (codconc = 904) ) then
                        SELECT A.admi_ctaafp FROM ADMINISTRADORA A WHERE A.terc_nit = :entidad INTO :ctaxp;
                    ELSE if ((codconc = 914) OR (codconc = 915) or (codconc = 907) ) then
                        SELECT A.admi_ctaeps FROM ADMINISTRADORA A WHERE A.terc_nit = :entidad INTO :ctaxp;
                    ELSE if ((codconc = 912) OR (codconc = 913)) then
                        SELECT A.admi_ctaafc FROM ADMINISTRADORA A WHERE A.terc_nit = :entidad INTO :ctaxp;
                    ELSE if ((codconc = 910) OR (codconc = 911)) then
                        SELECT A.admi_ctaccf FROM ADMINISTRADORA A WHERE A.terc_nit = :entidad INTO :ctaxp;
                    ELSE if ((codconc = 908) OR (codconc = 909)) then
                        SELECT A.admi_ctaarp FROM ADMINISTRADORA A WHERE A.terc_nit = :entidad INTO :ctaxp;
                    end
                end
            IF (aporte = 'N') THEN
                BEGIN
                /*SELECT D.dpto_proy, D.dpto_centro FROM EMPLEADOS E, departamento D WHERE E.terc_nit = :tercnit AND E.empl_dpto = D.dpto_cod INTO :proyecto, :centro;
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_TERC, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_CONC, CNDE_PROY, cnde_centro,CNDE_BASE)
                             VALUES (:idcontabil, :itemdet, :ctagast, :tercnit, :valor, 0, :concepto, :proyecto, :centro,:base);
                itemdet = itemdet + 1;
                */
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_TERC, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_CONC, CNDE_PROY, cnde_centro,CNDE_BASE)
                             VALUES (:idcontabil, :itemdet, :ctaxp, :tercnit, 0,:valor, :concepto, :proyecto, :centro,:base);
                itemdet = itemdet + 1;
                END
            ELSE
                IF (aporte = 'S') THEN
                    BEGIN
                    /*SELECT D.dpto_proy, D.dpto_centro FROM EMPLEADOS E, departamento D WHERE E.terc_nit = :tercnit AND E.empl_dpto = D.dpto_cod INTO :proyecto, :centro;
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_TERC, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_CONC, CNDE_PROY, cnde_centro,CNDE_BASE)
                        VALUES (:idcontabil, :itemdet, :ctagast, :tercnit, :valor, 0, :concepto, :proyecto, :centro,:base);
                    itemdet = itemdet + 1;                */
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_TERC, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_CONC, CNDE_PROY, cnde_centro,CNDE_BASE)
                        VALUES (:idcontabil, :itemdet, :ctaxp, :tercnit, 0,:valor, :concepto, :proyecto, :centro,:base);
                    itemdet = itemdet + 1;
                    END
            END
        END
    SUSPEND;
    END
ELSE
    BEGIN
    FOR SELECT NC.conc_cod,NC.NOCO_VALORCONT, CN.conc_ctagast, CN.conc_ctacxp, NC.terc_nit, NC.noco_aporte, NC.noco_entidad, SUBSTRING(CN.conc_nomcorto FROM 1 FOR 14)
        FROM NOMINA_CONCEPTOS NC, CONCEPTOS_NOMINA CN WHERE NC.conc_cod = CN.conc_cod AND NC.nomi_id = :iddoc
        INTO :codconc,:valor, :ctagast, :ctaxp, :tercnit, :aporte, :entidad, :nomconc
        DO
        BEGIN
        base = null;
        SELECT E.proy_cod,E.cent_cod FROM EMPLEADOS E WHERE E.terc_nit = :tercnit INTO :proyecto, :centro;
        if (:proyecto IS NULL) then
            SELECT D.dpto_proy, D.dpto_centro FROM EMPLEADOS E, departamento D WHERE E.terc_nit = :tercnit AND E.empl_dpto = D.dpto_cod INTO :proyecto, :centro;
        IF (ctagast IS NULL) THEN
            BEGIN
            EXECUTE PROCEDURE ERROR (14, :IDDOC, :ctagast, 2);
            ERROR = ERROR + 1;
            END
        IF (ctaxp IS NULL) THEN
            BEGIN
            EXECUTE PROCEDURE ERROR (14, :IDDOC, :ctaxp, 2);
            ERROR = ERROR + 1;
            END
        IF (VALOR IS NULL) THEN
            VALOR = 0;
        IF (VALOR <> 0) THEN
            BEGIN
            IF (valor < 0) THEN
                valor = :valor * (-1);
            IF (codconc = 6) THEN
                BEGIN
                SELECT E.empl_salario FROM EMPLEADOS E WHERE E.terc_nit = :tercnit INTO :basico;
                SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :tercnit INTO :comision;
                IF (comision IS NULL) THEN
                    comision = 0;
                SELECT C.emco_monto FROM EMPLEADO_CONCEPTOS C WHERE C.terc_nit = :tercnit AND C.conc_cod = 933 INTO :retroact;
                IF (retroact IS NULL ) THEN
                    retroact = 0;
                base = :basico + :comision + :retroact;
                END     
            if ((codconc > 900) and (entidad is not null) AND (ctaadmin = 'S')) then
                begin
                if ((codconc = 905) OR (codconc = 906) or (codconc = 904) ) then
                    SELECT A.admi_ctaafp FROM ADMINISTRADORA A WHERE A.terc_nit = :entidad INTO :ctaxp;
                ELSE if ((codconc = 914) OR (codconc = 915) or (codconc = 907) ) then
                    SELECT A.admi_ctaeps FROM ADMINISTRADORA A WHERE A.terc_nit = :entidad INTO :ctaxp;
                ELSE
                    SELECT A.admi_ctaconta FROM ADMINISTRADORA A WHERE A.terc_nit = :entidad INTO :ctaxp;
                end
            if (concxemp = 'SI') then
                BEGIN
                SELECT SUBSTRING(TERC_NOM FROM 1 FOR 45) FROM TERCEROS WHERE TERC_NIT = :tercnit INTO :nomterc;
                CONCEPTO = NOMTERC || '-' || nomconc;
                END
            IF (aporte = 'N') THEN
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_TERC, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_CONC, CNDE_PROY, cnde_centro,CNDE_BASE)
                    VALUES (:idcontabil, :itemdet, :ctagast, :tercnit, :valor, 0, :concepto, :proyecto, :centro,:base);
                itemdet = itemdet + 1;
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_TERC, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_CONC, CNDE_PROY, cnde_centro,CNDE_BASE)
                             VALUES (:idcontabil, :itemdet, :ctaxp, :tercnit, 0,:valor, :concepto, :proyecto, :centro,:base);
                itemdet = itemdet + 1;
                END
            ELSE
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_TERC, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_CONC, CNDE_PROY, cnde_centro,CNDE_BASE)
                    VALUES (:idcontabil, :itemdet, :ctagast, :tercnit, :valor, 0, :concepto, :proyecto, :centro,:base);
                itemdet = itemdet + 1;
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_TERC, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_CONC, CNDE_PROY, cnde_centro,CNDE_BASE)
                         VALUES (:idcontabil, :itemdet, :ctaxp, :entidad, 0,:valor, :concepto, :proyecto, :centro,:base);
                itemdet = itemdet + 1;
                END
            END
        END
    SUSPEND;
    END
END
^

SET TERM ; ^

/* 20100921 */
/* LICENCIA LIQUIDAR EN EL MISMO CONCEPTO DE INCAPACIDAD Y NO TENER EN CUENTA EN APORTES YA QUE EL BASICO LO CUBRE */
SET TERM ^ ;

CREATE OR ALTER procedure CAUSA_NOMINA (
    FEC date,
    PERIODO integer,
    PERIODICIDAD integer,
    PAGOGLOBAL char(1),
    ANO char(4),
    DEPTO integer)
returns (
    IDNOMINA integer,
    ITEMINI integer)
AS
declare variable item integer;
declare variable nite varchar(20);
declare variable nit_tercero varchar(20);
declare variable concept integer;
declare variable montos numeric(18,2);
declare variable porcen numeric(9,4);
declare variable entidad varchar(20);
declare variable conc_cod integer;
declare variable conc_deduc char(1);
declare variable conc_porc numeric(9,4);
declare variable conc_entidad integer;
declare variable conc_monto numeric(18,2);
declare variable conc_modifi char(1);
declare variable conc_promedio char(1);
declare variable valor numeric(18,2);
declare variable diaslab integer;
declare variable conc_prov char(1);
declare variable conc_aporte char(1);
declare variable numeroprom integer;
declare variable conc_aplicaprom char(1);
declare variable perinicial integer;
declare variable perfinal integer;
declare variable anoini integer;
declare variable anofin integer;
declare variable conc_dias char(1);
declare variable conc_otroconc char(1);
declare variable conc_codotroconc integer;
declare variable anosum integer;
declare variable salario char(1);
declare variable liquidaper integer;
declare variable basico numeric(18,2);
declare variable niteps varchar(20);
declare variable nitafc varchar(20);
declare variable nitafp varchar(20);
declare variable nitccf varchar(20);
declare variable gtoempr char(1);
declare variable comision numeric(18,2);
declare variable cambsaltrans numeric(18,2);
declare variable saldosini numeric(18,2);
declare variable duranov integer;
declare variable base numeric(18,2);
declare variable aprox integer;
declare variable mensual char(1);
declare variable horasex numeric(18,2);
declare variable diasnov integer;
declare variable tomasal integer;
declare variable retroact numeric(18,2);
declare variable reembolso numeric(18,2);
declare variable incap numeric(18,2);
declare variable auxtrans numeric(18,2);
declare variable smlv numeric(18,2);
declare variable beneficios numeric(18,2);
declare variable confirmado char(1);
declare variable recnoct numeric(18,2);
declare variable recfest numeric(18,2);
declare variable tar_recnotc numeric(9,4);
declare variable tar_recfest numeric(9,4);
declare variable recargo numeric(18,2);
declare variable basicorec numeric(18,2);
declare variable parambenef char(2);
declare variable vacacdisf numeric(18,2);
declare variable valorpredet numeric(18,2);
declare variable basicoemp numeric(18,2);
declare variable salinteg char(1);
declare variable tar_salinteg numeric(9,4);
begin
execute procedure LEE_CONFIGURACION('NOMINA','LIQUIDACION','TOMAR BENEFICIOS PARA CALCULAR PROVISIONES')returning_values(:PARAMBENEF);
execute procedure LEE_CONFIGURACION('NOMINA','GENERAL','REDONDEO AL MULTIPLO DE DIEZ EN TOTALES')returning_values(:APROX);
select N.NOMI_ID, N.NOMI_LIQOK from NOMINA N where N.NOMI_PERIODO = :PERIODO and N.NOMI_PERIODOCIDAD = :PERIODICIDAD
    and N.NOMI_ANO = :ANO into :IDNOMINA, :CONFIRMADO;
if (:IDNOMINA is null) then
    begin
    execute procedure CAMBIE_ID_NOMINA returning_values(:IDNOMINA);
    insert into NOMINA (NOMI_ID, NOMI_FECCAUSA, NOMI_PAGOGLOBAL, NOMI_PERIODOCIDAD, NOMI_PERIODO, NOMI_ANO, NOMI_LIQOK)
    values (:IDNOMINA, :FEC,:PAGOGLOBAL, :PERIODICIDAD, :PERIODO, :ANO, 'N');
    ITEM = 1;
    end
else
    begin
    select max(N.NOCO_ITEM) from NOMINA_CONCEPTOS N where N.NOMI_ID = :IDNOMINA
    into :ITEM;
    end
if ((CONFIRMADO = 'S') and (IDNOMINA is not null)) then
    begin
    IDNOMINA = 0;
    end
else
    begin
    insert into NOMINA_DEPARTAMENTO (NOMI_ID, NODP_DEPTO)values(:IDNOMINA,:DEPTO);
    select P.PAAN_RECNOC, P.PAAN_RECFEST, P.paan_salinteg from PARAMETROS_ANO P where P.PAAN_ANO = :ANO
        into :TAR_RECNOTC, :TAR_RECFEST, TAR_SALINTEG;
    ITEMINI = ITEM;
    for select E.TERC_NIT, E.EMPL_EPS, E.EMPL_AFC, E.EMPL_AFP, E.EMPL_CCF, E.empl_salinteg
        from EMPLEADOS E
        where E.EMPL_PPAGO = :PERIODICIDAD and ((E.EMPL_FECRET is null) or (E.EMPL_FECRET > :FEC)) and E.EMPL_FECING <= :FEC
        and ((:DEPTO = 0) or (e.empl_dpto = :DEPTO))
        into :NITE, :NITEPS, :NITAFC, :NITAFP, :NITCCF, :SALINTEG
        do
        begin
        select first 1 M.MVSE_SALARIO from MOVIMIENTO_SALARIO_EMPLEADO M where M.TERC_NIT = :NITE and M.MVSE_FECHA <= :FEC order by M.MVSE_FECHA desc into :BASICOEMP;
        BASICO = BASICOEMP;
        RECNOCT = null;
        RECFEST = null;
        select N.NOEX_RECNOCT, N.NOEX_RECFEST
            from NOMINA_HORASEXT N where N.NOEX_PERIODIO = :PERIODO and N.NOEX_ANO = :ANO and N.TERC_NIT = :NITE
            into :RECNOCT, :RECFEST;
        if (RECNOCT is null) then
            RECNOCT = 0;
        if (RECFEST is null) then
            RECFEST = 0;
        for select CE.TERC_NIT, CE.CONC_COD, CE.EMCO_MONTO, CE.EMCO_PORC, CE.EMPL_ENTIDAD, CE.EMCO_PERPROM, CE.EMCO_LUQUIDAPER, CE.EMCO_MENSUAL, CN.CONC_COD, CN.CONC_DEDUC,CN.CONC_PORC, CN.CONC_ENTIDAD, CN.CONC_MONTO,  CN.CONC_DIAS, CN.CONC_MODIFI,
            CN.CONC_PROMEDIO, CN.CONC_SALARIO, CN.CONC_PROV, CN.CONC_APORTE, CN.CONC_APLICAPROM, CN.CONC_OTROCONC, CN.CONC_CODOTROCONC, CN.CONC_GTOEMPR, CN.CONC_BASE, CE.EMCO_TOMSAL
            from EMPLEADO_CONCEPTOS CE, CONCEPTOS_NOMINA CN where (CE.CONC_COD = CN.CONC_COD) and (CE.TERC_NIT = :NITE) and
            ( ((CE.EMCO_FECINI <= :FEC and CE.EMCO_FECFIN >= :FEC)) or
            ((CN.CONC_TODOSPER = 'N') and (CE.EMCO_PPAGO = :PERIODO)) or ((CN.CONC_TODOSPER = 'S') AND (((:periodicidad = 1) AND (:PERIODO < 13)) or ((:periodicidad = 2) AND (:PERIODO < 25)))) )  order by (TERC_NIT )
            into :NIT_TERCERO, :CONCEPT,  :MONTOS, :PORCEN, :ENTIDAD, :NUMEROPROM, :LIQUIDAPER, :MENSUAL ,:CONC_COD, :CONC_DEDUC, :CONC_PORC,
            :CONC_ENTIDAD, :CONC_MONTO, :CONC_DIAS, :CONC_MODIFI,:CONC_PROMEDIO, :SALARIO,:CONC_PROV, :CONC_APORTE , :CONC_APLICAPROM, :CONC_OTROCONC, :CONC_CODOTROCONC, :GTOEMPR, :BASE, :TOMASAL
            do
            begin
            if (MENSUAL = 'S') then
                BEGIN
                if (PERIODICIDAD = 1) then
                    BEGIN
                    perinicial = PERIODO;
                    PERFINAL = PERIODO;
                    END
                if (PERIODICIDAD = 2) then
                    BEGIN
                    perinicial = PERIODO - (LIQUIDAPER - 1);
                    PERFINAL = PERIODO + (2 - LIQUIDAPER);
                    END
                if (PERIODICIDAD = 3) then
                    BEGIN
                    perinicial = PERIODO - (LIQUIDAPER - 1);
                    PERFINAL = PERIODO + (4 - LIQUIDAPER);
                    END
                END
            ELSE
                BEGIN
                perinicial = PERIODO;
                PERFINAL = PERIODO;
                END
                            
            if (CONC_DIAS = 'S') then
                execute procedure DIAS_LABORADOS (:NITE, :PERIODO, :FEC, :MENSUAL,:CONC_APORTE) returning_values (:DIASLAB);
            else
                BEGIN
                SELECT PPAG_DIAS FROM PERIODO_PAGO WHERE PPAG_COD = :periodicidad INTO :diaslab;
                END
            if (:TOMASAL <> 0) then
                begin
                /* SI EL CONCEPTO NOAPLICA EN ESTE PERIODO DEJE EL BASICO EN CERO */
                if ((:PERIODICIDAD = 2) and (:TOMASAL <> 2)) then
                    begin
                    if ((PERIODO = 2) or (PERIODO = 4) or (PERIODO = 6) or (PERIODO = 8) or (PERIODO = 10) or (PERIODO = 12)
                        or (PERIODO = 14) or (PERIODO = 16) or (PERIODO = 18) or (PERIODO = 20) or (PERIODO = 22) or (PERIODO = 24)) then
                        BASICO = 0;
                    end
                else
                    if ((:PERIODICIDAD = 3) and (:TOMASAL <> 1)) then
                        begin
                        if ((PERIODO = 1) or (PERIODO = 5) or (PERIODO = 9) or (PERIODO = 13) or (PERIODO = 17) or (PERIODO = 21)
                            or (PERIODO = 25) or (PERIODO = 29) or (PERIODO = 33) or (PERIODO = 37) or (PERIODO = 41) or (PERIODO = 45)
                            or (PERIODO = 49)) then
                            BASICO = 0;
                        end
                    else
                        if ((:PERIODICIDAD = 3) and (:TOMASAL <> 2)) then
                            begin
                            if ((PERIODO = 2) or (PERIODO = 6) or (PERIODO = 10) or (PERIODO = 14) or (PERIODO = 18) or (PERIODO = 22)
                                or (PERIODO = 26) or (PERIODO = 30) or (PERIODO = 34) or (PERIODO = 38) or (PERIODO = 42) or (PERIODO = 46)
                                or (PERIODO = 50)) then
                                BASICO = 0;
                            end
                        else
                            if ((:PERIODICIDAD = 3) and (:TOMASAL <> 3)) then
                                begin
                                if ((PERIODO = 3) or (PERIODO = 7) or (PERIODO = 11) or (PERIODO = 15) or (PERIODO = 19) or (PERIODO = 23)
                                    or (PERIODO = 27) or (PERIODO = 31) or (PERIODO = 35) or (PERIODO = 39) or (PERIODO = 43) or (PERIODO = 47)
                                    or (PERIODO = 51)) then
                                    BASICO = 0;
                                end
                            else
                                if ((:PERIODICIDAD = 3) and (:TOMASAL <> 4)) then
                                begin
                                if ((PERIODO = 4) or (PERIODO = 8) or (PERIODO = 12) or (PERIODO = 16) or (PERIODO = 20) or (PERIODO = 24)
                                    or (PERIODO = 29) or (PERIODO = 32) or (PERIODO = 36) or (PERIODO = 40) or (PERIODO = 44) or (PERIODO = 48)
                                    or (PERIODO = 52)) then
                                    BASICO = 0;
                                end
                end
            else
                begin
                /* SE CALCULA SOBRE TODOS LOS PERIODOS */
                BASICO = BASICOEMP;
                end
            VALORPREDET = null;
            select VP.NVPR_MONTO from NOMINA_VALOR_PREDET VP where VP.NVPR_PERIODICIDAD = :PERIODICIDAD and VP.NVPR_PERIODO = :PERIODO and VP.NVPR_ANO = :ANO and VP.CONC_COD = :CONC_COD and VP.TERC_NIT = :NITE
                into :VALORPREDET;
            if ((:VALORPREDET <> 0) and (VALORPREDET is not null)) then
                VALOR = VALORPREDET;
            else
                begin
                /* SI HAY UN CAMBIO TRANSITORIO DE SALARIO AJUSTE LOS DIAS Y CALCULE EL VALOR A SUMAR */
                select SUM((N.NONO_VALOR /30) * ND.NNDE_DURACION), SUM(ND.NNDE_DURACION) from NOMINA_NOVEDADES N, nomina_novedades_detalle ND
                    where N.nono_id = ND.nono_id AND N.TNOV_COD = 11 and N.TERC_NIT = :NITE and ND.NNDE_PERIODO = :PERIODO
                    into :CAMBSALTRANS, :DURANOV;
                if (CAMBSALTRANS is null) then
                    CAMBSALTRANS = 0;
                if (DURANOV is null) then
                    DURANOV = 0;
                DIASLAB = :DIASLAB - :DURANOV;
                /* SI ES UN PRESTAMO, TRAIGA LA CUOTA */
                if (CONC_COD = 922) then
                    begin
                    select sum(P.PRCU_MONTO) from PRESTAMO_CUOTAS P, PRESTAMO_NOMINA PN
                        where P.PRCU_ANO = :ANO and P.PRCU_PERIODO = :PERIODO and PN.PRNO_ID = P.PRNO_ID and PN.TERC_NIT = :NITE into :VALOR;
                    if (VALOR is null) then
                        VALOR = 0;
                    ITEM = :ITEM + 1;
                    /* MARQUE LA CUOTA COMO PAGADA */
                    update PRESTAMO_CUOTAS  P set PRCU_OK = 'S' where P.PRCU_ANO = :ANO and P.PRCU_PERIODO = :PERIODO
                        and exists (select PRNO_ID from PRESTAMO_NOMINA where TERC_NIT = :NITE and PRNO_ID = P.prno_id);
                    end
                else
                    if ((:MONTOS = 0) or (:MONTOS is null)) then
                        begin
                        /* SI EL CONCEPTO DEL EMPLEADO NO TIENE MONTO TRAIGA EL DE CONCEPTOS_NOMINA */
                        if ((CONC_PORC = 0 and :PORCEN = 0) or (CONC_PORC is null and :PORCEN = 0) or (CONC_PORC = 0 and :PORCEN is null) or (CONC_PORC is null and :PORCEN is null) ) then
                            begin
                            /* SIN PORCENTAJE */
                            if ((CONC_MONTO <> 0) and (CONC_MONTO is not null) ) then
                                begin
                                VALOR = :CONC_MONTO;
                                if (:CONC_DIAS = 'S') then
                                    VALOR = (:VALOR / 30) * :DIASLAB;
                                end
                            else
                                if (SALARIO = 'S' and CONC_COD <> 900 and CONC_COD <> 920 and CONC_COD <> 932 and CONC_COD <> 953) then
                                    begin
                                    /* SI ES SALARIO SUME LAS EXTRAS */
                                    BASICO = BASICOEMP;
                                    BASICO = ((:BASICO/30)*:DIASLAB);/* - (((:BASICO/30)/8)*:RECNOCT);/* PFP:DEBERIA SER + Y POR LA TARIFA QUE NO VEO POR NINGUN LADO
                                    BASICO = :BASICO - (((:BASICO/30)/8)*:RECFEST);*/
                                    CONC_MONTO = :BASICO;
                                    VALOR = (:CONC_MONTO/*/30 * :diaslab*/ ) + :CAMBSALTRANS;
                                    end
                                else
                                    begin
                                    VALOR = MONTOS;
                                    if (:CONC_DIAS = 'S') then
                                        VALOR = (:VALOR / 30) * :DIASLAB;
                                    end
                            end
                        else    
                            begin
                            if (:PORCEN <> 0) then
                                begin
                                /* SI TIENE PORCENTAJE EN EMPLEADO_CONCEPTOS PERO EL MONTO SE TRAE DE CONCPETOS_NOMINA */
                                if ((CONC_MONTO <> 0) and (CONC_MONTO is not null) ) then
                                    begin
                                    VALOR = ((:CONC_MONTO ) * :PORCEN) /100;
                                    end
                                end
                            else
                                begin
                                /* NO TIENE PORCENTAJE EN EMPLEADO_CONCEPTOS SE TRAE MONTO Y PORC DE CONCPETOS_NOMINA */
                                if ((CONC_MONTO <> 0) and (CONC_MONTO is not null) ) then
                                    begin
                                    VALOR = ((:CONC_MONTO) * :CONC_PORC) /100;
                                    end
                                else
                                    if (SALARIO = 'S' and CONC_COD <> 900 and CONC_COD <> 920 and CONC_COD <> 932 and CONC_COD <> 953) then
                                        begin
                                        BASICO = BASICOEMP;
                                        BASICO = ((:BASICO/30)*:DIASLAB); /* - (((:BASICO/30)/8)*:RECNOCT);
                                        BASICO = :BASICO - (((:BASICO/30)/8)*:RECFEST);*/
                                        CONC_MONTO = :BASICO;
                                        VALOR = ((:CONC_MONTO)+ :CAMBSALTRANS * :CONC_PORC) /100;
                                        end
                                    else
                                        if (:CONC_MONTO = 0 and :MONTOS = 0) then
                                            begin
                                            CONC_MONTO = :BASICO;
                                            VALOR = (((:CONC_MONTO / 30) * :DIASLAB) + :CAMBSALTRANS * :CONC_PORC) /100;
                                            end
                                end
                            end
                        end
                    else
                        /* SI TIENE MONTO EN EMPLEADO_CONCEPTOS */
                        if ((CONC_PORC = 0 or (CONC_PORC is null)) and (:PORCEN = 0 or (PORCEN is null))) then
                            begin
                            VALOR = (:MONTOS);
                            if (:CONC_DIAS = 'S') then
                                VALOR = (:VALOR / 30) * :DIASLAB;   
                            end
                        else
                            if (:PORCEN <> 0 and PORCEN is not null) then
                                begin
                                VALOR = ((:MONTOS ) * :PORCEN) /100;
                                end
                            else
                                begin
                                VALOR = ((:MONTOS) * :CONC_PORC) /100;
                                end
                if (CONC_PROMEDIO = 'S') then
                    begin
                    /* CALCULO DEL PROMEDIO BASE DESDE LA FECHA MENOS EL NUMERO DE PERIODOS */
                    EXECUTE PROCEDURE periodo_nom_fecha (:fec, :periodicidad) returning_values (:perfinal, :anofin);
                    if (perfinal < numeroprom) then
                        BEGIN
                        anoini = anofin - 1;
                        if (periodicidad = 1) then
                            perinicial = 12 - (numeroprom - perfinal) + 1;
                        if (periodicidad = 2) then
                            perinicial = 24 - (numeroprom - perfinal) + 1;
                        if (periodicidad = 3) then
                            perinicial = 52 - (numeroprom - perfinal) + 1;
                        END
                    ELSE
                        BEGIN
                        PERINICIAL = :perfinal - :NUMEROPROM + 1;
                        anoini = ANOFIN;
                        END
                    if (anoini <> anofin) then
                        select sum (NOCO_VALOR) from NOMINA_CONCEPTOS N where N.NOCO_APLICAPROM = 'S' and
                            ((N.NOCO_PERIODO >= :PERINICIAL and N.NOCO_ANO = :anoini) or
                            (N.NOCO_PERIODO <= :perfinal and N.NOCO_ANO = :anofin)) and TERC_NIT = :NITE into :VALOR;
                    else
                        select sum (NOCO_VALOR) from NOMINA_CONCEPTOS N where N.NOCO_APLICAPROM = 'S' and
                            N.NOCO_PERIODO >= :PERINICIAL and N.NOCO_ANO = :anoini
                            and N.NOCO_PERIODO <= :perfinal and TERC_NIT = :NITE into :VALOR;
                    /* sume el saldo inicial */
                    SALDOSINI = 0;
                    select NOCO_VALOR from NOMINA_CONCEPTOS where CONC_COD = :CONC_COD and TERC_NIT  = :NITE and NOCO_PAGOOK = 'N' and NOCO_PERIODO = 0 into :SALDOSINI;
                    if (SALDOSINI is null) then
                        SALDOSINI = 0;
                    else
                        update NOMINA_CONCEPTOS N set NOCO_PAGOOK = 'S' where N.NOCO_APLICAPROM = 'S' and
                            CONC_COD = :CONC_COD and TERC_NIT = :NITE and NOCO_PERIODO = 0;

                    VALOR = :VALOR + :SALDOSINI;
                    /* APLIQUE LA PROPORCION Y EL PORCENTAJE */
                    VALOR = VALOR / NUMEROPROM;
                    VALOR = VALOR * PORCEN / 100;
                    end
                else if (CONC_OTROCONC = 'S') then
                    begin
                    ANOSUM = cast(ANO as integer);
                    ANOSUM = ANOSUM - 1;
                    select sum (NOCO_VALOR) from NOMINA_CONCEPTOS N where N.NOCO_ANO = :ANOSUM and N.CONC_COD = :CONC_CODOTROCONC and N.TERC_NIT = :NITE into :VALOR;
                    select NOCO_VALOR from NOMINA_CONCEPTOS where NOCO_ANO = :ANOSUM and CONC_COD = :CONC_CODOTROCONC and TERC_NIT = :NITE and NOCO_PERIODO = 0 into :SALDOSINI;
                    if (SALDOSINI is null) then
                        SALDOSINI = 0;
                    else
                        update NOMINA_CONCEPTOS set NOCO_PAGOOK = 'S' where NOCO_ANO = :ANOSUM and CONC_COD = :CONC_CODOTROCONC and NOCO_PERIODO = 0 and TERC_NIT = :NITE;
                    VALOR = :VALOR + :SALDOSINI;
                    update NOMINA_CONCEPTOS set NOCO_PAGOOK = 'S' where NOCO_ANO = :ANOSUM and CONC_COD = :CONC_CODOTROCONC and TERC_NIT = :NITE;
                    end
                else if (CONC_APORTE = 'S') then
                    begin
                    HORASEX = null;
                    DIASNOV = null;
                    RETROACT = null;
                    REEMBOLSO = null;
                    BENEFICIOS = null;
                    RECARGO = null;
                    COMISION = null;
                    INCAP = null;
                    VACACDISF = null;
                    if ((:ENTIDAD = '' ) or (ENTIDAD is null)) then
                        begin
                        /*COMISIONES*/
                        if (MENSUAL = 'S') then
                            BEGIN
                            if (PERIODICIDAD = 1) then
                                BEGIN
                                perinicial = PERIODO;
                                PERFINAL = PERIODO;
                                END
                            if (PERIODICIDAD = 2) then
                                BEGIN
                                perinicial = PERIODO - (LIQUIDAPER - 1);
                                PERFINAL = PERIODO + (2 - LIQUIDAPER);
                                END
                            if (PERIODICIDAD = 3) then
                                BEGIN
                                perinicial = PERIODO - (LIQUIDAPER - 1);
                                PERFINAL = PERIODO + (4 - LIQUIDAPER);
                                END
                            END
                        ELSE
                            BEGIN
                            perinicial = PERIODO;
                            PERFINAL = PERIODO;
                            END
                            
                        /* SUME LAS COMISIONES DE LOS DEMAS PERIODOS DEL MES */
                        select SUM(C.NCOM_MONTO) from NOMINA_COMISIONES C where C.NCOM_ANO = :ANO
                            and C.NCOM_PERIODO >= :PERINICIAL AND C.NCOM_PERIODO <= :PERFINAL
                            and C.NCOM_PERIODICIDAD = :PERIODICIDAD and C.TERC_NIT = :NITE
                            into :COMISION;
                        if (COMISION is null) then
                            COMISION = 0;
                        /*RETROACTIVO*/
                        select C.EMCO_MONTO from EMPLEADO_CONCEPTOS C where C.TERC_NIT = :NITE
                            and C.CONC_COD = 933 into :RETROACT;
                            if (RETROACT is null ) then
                                RETROACT = 0;
                        /*REEMBOLSO*/
                        select C.EMCO_MONTO from EMPLEADO_CONCEPTOS C where C.TERC_NIT = :NITE
                            and C.CONC_COD = 952 into :REEMBOLSO;
                        if (REEMBOLSO is null ) then
                            REEMBOLSO = 0;
                        /*VACACIONES DISFRUTADAS ANTERIORMENTE*/
                        select C.EMCO_MONTO from EMPLEADO_CONCEPTOS C where C.TERC_NIT = :NITE
                            and C.CONC_COD = 955 into :VACACDISF;
                        if (VACACDISF is null ) then
                            VACACDISF = 0;
                        /* INCAPACIDAD NO DEBE LIQUIDARSE YA QUE EL BASICO EN EL CASO DE APORTES LO INCLUYE *
                        select SUM(ND.NNDE_DURACION) from NOMINA_NOVEDADES N, nomina_novedades_detalle ND
                            where N.nono_id = ND.nono_id AND N.TERC_NIT = :NITE
                            and ND.NNDE_PERIODO >= :perinicial and ND.NNDE_PERIODO <= :perfinal and ND.NNDE_ANO = :ANO
                            and (N.TNOV_COD = 2 or (N.TNOV_COD = 3))
                            into :DIASNOV;
                        if (:DIASNOV is null) then
                            INCAP = 0;
                        else
                            INCAP = (:BASICO / 30)* :DIASNOV; */
                        INCAP = 0;
                        /*BASICO*/
                        if (SALINTEG = 'S') then
                            BASICO = BASICO * (tar_salinteg / 100);

                        if (MENSUAL <> 'S') then
                            BASICO = ((:BASICO/30)*:DIASLAB);
                        /*HORAS EXTRA*/
                        select SUM(C.NOEX_MONTO) from NOMINA_HORASEXT C where C.NOEX_ANO = :ANO
                            and C.NOEX_PERIODIO >= :PERINICIAL and C.NOEX_PERIODIO <= :PERFINAL
                            and C.NOEX_PERIODICIDAD = :PERIODICIDAD and C.TERC_NIT = :NITE
                            into :HORASEX;
                        if (HORASEX is null) then
                            HORASEX = 0;
                        /*RECARGOS*/
                        BASICOREC = BASICOEMP;
                        RECARGO = (((:BASICOREC/30)/8)*:TAR_RECNOTC)*:RECNOCT;
                        RECARGO = :RECARGO + ((((:BASICOREC/30)/8)*:TAR_RECFEST)*:RECFEST);
                        if (RECARGO is null) then
                            RECARGO = 0;
                        /*basico*/
                        if (MENSUAL <> 'S') then
                            begin
                            if (:BASICO + :COMISION + :HORASEX + :RETROACT+ :REEMBOLSO + :INCAP+ :CAMBSALTRANS < ((:SMLV/30)*:DIASLAB)) then
                                BASICO = (:SMLV/30)*:DIASLAB;
                            end
                        else
                            begin
                            if (:BASICO + :COMISION + :HORASEX + :RETROACT+ :REEMBOLSO + :INCAP+ :CAMBSALTRANS < :SMLV) then
                                BASICO = :SMLV;
                            end
                        /* SMLV Y AUX. TRANSPORTE*/
                        select P.PAAN_AUXTR, P.PAAN_SALMINIMO from PARAMETROS_ANO P
                            where P.PAAN_ANO = :ANO into :AUXTRANS, :SMLV;
                        /*BASE*/
                        VALOR = :BASICO + :COMISION + :HORASEX + :RETROACT+ :REEMBOLSO + :INCAP + :RECARGO + :CAMBSALTRANS + :VACACDISF;

                        if (CONC_COD = 904) then
                            begin
                            ENTIDAD = :NITAFP;
                            select A.PAAN_AFPTR from PARAMETROS_ANO A where A.PAAN_ANO = :ANO into :PORCEN;
                            VALOR = ((:VALOR) * :PORCEN) /100;
                            end
                        else if ((CONC_COD = 905) or (CONC_COD = 906) or (CONC_COD = 934) ) then
                            begin
                            ENTIDAD = :NITAFP;
                            select A.PAAN_AFPEM from PARAMETROS_ANO A where A.PAAN_ANO = :ANO into :PORCEN;
                            VALOR = ((:VALOR) * :PORCEN) /100;
                            end
                        else if ((CONC_COD = 907) or (CONC_COD = 914) or (CONC_COD = 915) or (conc_cod = 938)) then
                            begin
                            ENTIDAD = :NITEPS;
                            if (CONC_COD = 907) then
                                begin
                                select A.PAAN_EPSTR from PARAMETROS_ANO A where A.PAAN_ANO = :ANO into :PORCEN;
                                VALOR = ((:VALOR) * :PORCEN) /100;
                                end
                            else
                                begin
                                select A.PAAN_EPSEM from PARAMETROS_ANO A where A.PAAN_ANO = :ANO into :PORCEN;
                                    VALOR = ((:VALOR) * :PORCEN) /100;
                                end
                            end
                        else if ((CONC_COD = 910) or (CONC_COD = 911) or (CONC_COD = 936)) then
                            begin
                            /*ccf */
                            ENTIDAD = :NITCCF;
                            select A.PAAN_CCF from PARAMETROS_ANO A where A.PAAN_ANO = :ANO into :PORCEN;
                            VALOR = ((:VALOR) * :PORCEN) /100;
                            end
                        else if ((CONC_COD = 916) or (CONC_COD = 917) or (CONC_COD = 939) ) then
                            begin
                            /*icbf */
                            ENTIDAD = :NITCCF;
                            select A.PAAN_ICBF from PARAMETROS_ANO A where A.PAAN_ANO = :ANO into :PORCEN;
                            VALOR = ((:VALOR) * :PORCEN) /100;
                            end
                        else if ((CONC_COD = 918) or (CONC_COD = 919) or (CONC_COD = 940) ) then
                            begin
                            /*sena */
                            ENTIDAD = :NITCCF;
                            select A.PAAN_SENA from PARAMETROS_ANO A where A.PAAN_ANO = :ANO into :PORCEN;
                            VALOR = ((:VALOR) * :PORCEN) /100;
                            end
                        else if ((CONC_COD = 912) or (CONC_COD = 913) or (CONC_COD = 937)) then
                            begin
                            /* CESANTIAS */
                            ENTIDAD = :NITAFC;
                            if (PARAMBENEF = 'SI') then
                                begin
                                select sum(CE.EMCO_MONTO)
                                    from EMPLEADO_CONCEPTOS CE, CONCEPTOS_NOMINA CN where CN.CONC_BENEFIC = 'S' and (CE.TERC_NIT = :NITE) and (CE.CONC_COD = CN.CONC_COD) and
                                    ((CE.EMCO_FECINI <= :FEC and CE.EMCO_FECFIN >= :FEC) or ((CN.CONC_TODOSPER = 'N') and (CE.EMCO_PPAGO = :PERIODO)) or
                                    (CN.CONC_TODOSPER = 'S'))
                                    into :BENEFICIOS;
                                if (BENEFICIOS is null) then
                                    BENEFICIOS = 0;
                                end
                            else
                                BENEFICIOS = 0;
                            select P.PAAN_AUXTR, P.PAAN_SALMINIMO from PARAMETROS_ANO P
                                where P.PAAN_ANO = :ANO into :AUXTRANS, :SMLV;
                            if (:BASICO < (:SMLV*2)) then
                                AUXTRANS = (:AUXTRANS / 30) * :DIASLAB;
                            else
                                AUXTRANS = 0;
                            select A.PAAN_CESEMP from PARAMETROS_ANO A where A.PAAN_ANO = :ANO
                                into :PORCEN;
                            VALOR = ((:VALOR + :AUXTRANS + :BENEFICIOS) * :PORCEN) /100;
                            end
                        else
                            begin
                            if (COMISION is null) then
                                COMISION = 0;
                            select C.NCOM_MONTO from NOMINA_COMISIONES C where C.NCOM_ANO = :ANO and C.NCOM_PERIODO = :PERIODO and C.NCOM_PERIODICIDAD = :PERIODICIDAD and C.TERC_NIT = :NITE
                                into :COMISION;
                            CONC_MONTO = :BASICO + :COMISION;
                            if (CONC_PORC <> 0 and CONC_PORC is not null) then
                                if (mensual <> 'S') then
                                    VALOR = (((:CONC_MONTO/30 * :DIASLAB )+ :CAMBSALTRANS + :INCAP) * :CONC_PORC) /100;
                                else
                                    VALOR = ((:CONC_MONTO+ :CAMBSALTRANS + :INCAP) * :CONC_PORC) /100;
                            else
                                if (:PORCEN <> 0 and :PORCEN is not null) then
                                    if (mensual <> 'S') then
                                        VALOR = (((:CONC_MONTO/30 * :DIASLAB )+ :CAMBSALTRANS + :INCAP) * :PORCEN) /100;
                                    else
                                        VALOR = ((:CONC_MONTO + :CAMBSALTRANS + :INCAP) * :PORCEN) /100;
                                else
                                    if (:MONTOS <> 0 and :MONTOS is not null) then
                                        VALOR = :MONTOS;
                                    else
                                        if (:CONC_MONTO <> 0 and :CONC_MONTO is not null) then
                                            VALOR = :CONC_MONTO;
                            end
                        ITEM = :ITEM + 1;
                        end
                    end /* aportes */
                else if (CONC_PROV = 'S') then
                    begin
                    /*provisiones */
                    HORASEX = null;
                    DIASNOV = null;
                    RETROACT = null;
                    REEMBOLSO = null;
                    BENEFICIOS = null;
                    RECARGO = null;
                    COMISION = null;
                    INCAP = null;
                    if (MENSUAL = 'S') then
                        BEGIN
                        if (PERIODICIDAD = 1) then
                            BEGIN
                            perinicial = PERIODO;
                            PERFINAL = PERIODO;
                            END
                        if (PERIODICIDAD = 2) then
                            BEGIN
                            perinicial = PERIODO - (LIQUIDAPER - 1);
                            PERFINAL = PERIODO + (2 - LIQUIDAPER);
                            END
                        if (PERIODICIDAD = 3) then
                            BEGIN
                            perinicial = PERIODO - (LIQUIDAPER - 1);
                            PERFINAL = PERIODO + (4 - LIQUIDAPER);
                            END
                        END
                    ELSE
                        BEGIN
                        perinicial = PERIODO;
                        PERFINAL = PERIODO;
                        END
                    /*HORAS EXTRA*/
                    select SUM(C.NOEX_MONTO) from NOMINA_HORASEXT C where C.NOEX_ANO = :ANO
                        and C.NOEX_PERIODIO >= :PERINICIAL and C.NOEX_PERIODIO <= :PERFINAL
                        and C.NOEX_PERIODICIDAD = :PERIODICIDAD and C.TERC_NIT = :NITE
                        into :HORASEX;
                    if (HORASEX is null) then
                        HORASEX = 0;
                    /* RECARGO*/
                    BASICO = BASICOEMP;
                    RECARGO = (((:BASICO/30)/8)*:TAR_RECNOTC)*:RECNOCT;
                    RECARGO = :RECARGO + ((((:BASICO/30)/8)*:TAR_RECFEST)*:RECFEST);
                    /*INCAPACIDAD*/
                    select SUM(ND.NNDE_DURACION) from NOMINA_NOVEDADES N, nomina_novedades_detalle ND
                        where N.nono_id = ND.nono_id AND N.TERC_NIT = :NITE
                        and ND.NNDE_PERIODO >= :perinicial and ND.NNDE_PERIODO <= :perfinal and ND.NNDE_ANO = :ANO
                        and ((N.TNOV_COD = 2) or (N.TNOV_COD = 3) or (N.TNOV_COD = 4)) into :DIASNOV;
                    if (:DIASNOV is null) then
                        INCAP = 0;
                    else
                        INCAP = (:BASICO / 30)* :DIASNOV;
                    /* BASICO*/
                    if (mensual <> 'S') then
                        BASICO = ((:BASICO/30)*:DIASLAB);
                    if (SALINTEG = 'S') then
                        BASICO = BASICO * (tar_salinteg / 100);
                    /*BENEFICIOS*/
                    if (PARAMBENEF = 'SI') then
                        begin
                        select sum(CE.EMCO_MONTO)
                            from EMPLEADO_CONCEPTOS CE, CONCEPTOS_NOMINA CN where CN.CONC_BENEFIC = 'S'
                            and (CE.TERC_NIT = :NITE) and (CE.CONC_COD = CN.CONC_COD) and
                            ((CE.EMCO_FECINI <= :FEC and CE.EMCO_FECFIN >= :FEC) or ((CN.CONC_TODOSPER = 'N')
                            and (CE.EMCO_PPAGO = :PERIODO)) or (CN.CONC_TODOSPER = 'S'))
                            into :BENEFICIOS;
                        if (BENEFICIOS is null) then
                            BENEFICIOS = 0;
                        end
                    else
                        BENEFICIOS = 0;
                    if ((CONC_COD <> 929) and (CONC_COD <> 930) and (CONC_COD <> 944)) then
                        begin
                        /* si no es vacaciones */
                        select P.PAAN_AUXTR, P.PAAN_SALMINIMO from PARAMETROS_ANO P where P.PAAN_ANO = :ANO
                            into :AUXTRANS, :SMLV;
                        if (:BASICO < (:SMLV*2)) then
                            begin
                            if (mensual <> 'S') then
                                AUXTRANS = (:AUXTRANS / 30) * :DIASLAB;
                            end
                        else
                            AUXTRANS = 0;
                        end
                    else
                        AUXTRANS = 0;
                    CONC_MONTO = :BASICO;
                    if (CONC_PORC <> 0 and CONC_PORC is not null) then
                        VALOR = ((:CONC_MONTO + :CAMBSALTRANS + :INCAP + :RECARGO + :HORASEX + :AUXTRANS + :BENEFICIOS) * :CONC_PORC) /100;
                    else
                        if (PORCEN <> 0 and PORCEN is not null) then
                            VALOR = ((:CONC_MONTO + :CAMBSALTRANS + :INCAP + :RECARGO + :HORASEX + :AUXTRANS + :BENEFICIOS) * :PORCEN) /100;
                        else
                            if (MONTOS <> 0 and MONTOS is not null) then
                                VALOR = :MONTOS;
                            else
                                if (CONC_MONTO <> 0 and CONC_MONTO is not null) then
                                    VALOR = :CONC_MONTO;
                    ITEM = :ITEM + 1;
                    end /* provision */
                else if (CONC_COD = 920) then /* comisiones */
                    begin
                    select C.NCOM_MONTO from NOMINA_COMISIONES C where C.NCOM_ANO = :ANO
                    and C.NCOM_PERIODO >= :perinicial and C.NCOM_PERIODO <= :perfinal and C.NCOM_PERIODICIDAD = :PERIODICIDAD and C.TERC_NIT = :NITE into :VALOR;
                    if (VALOR is null) then
                        VALOR = 0;
                    ITEM = :ITEM + 1;
                    end
                else if (CONC_COD = 900 or (:CONC_COD = 931)) then /* horas extra */
                    begin
                    select SUM(C.NOEX_MONTO) from NOMINA_HORASEXT C where C.NOEX_ANO = :ANO and
                        C.NOEX_PERIODIO >= :perinicial and C.NOEX_PERIODIO <= :perfinal and C.NOEX_PERIODICIDAD = :PERIODICIDAD and C.TERC_NIT = :NITE into :VALOR;
                    if (VALOR is null) then
                        VALOR = 0;
                    ITEM = :ITEM + 1;
                    end
                else if (CONC_COD = 954) then /* cartera */
                    begin
                    select C.NCAR_MONTO from NOMINA_CARTERA C where C.NCAR_ANO = :ANO
                    and C.NCAR_PERIODO >= :perinicial and C.NCAR_PERIODO <= :perfinal and C.NCAR_PERIODICIDAD = :PERIODICIDAD and C.TERC_NIT = :NITE into :VALOR;
                    if (VALOR is null) then
                        VALOR = 0;
                    ITEM = :ITEM + 1;
                    end
                else if (CONC_COD = 932) then
                    begin
                    /* incapacidad */
                    select SUM(ND.NNDE_DURACION) from NOMINA_NOVEDADES N, nomina_novedades_detalle ND
                        where N.nono_id = ND.nono_id AND N.TERC_NIT = :NITE
                        and ND.NNDE_PERIODO >= :perinicial and ND.NNDE_PERIODO <= :perfinal and ND.NNDE_ANO = :ANO
                        and ((N.TNOV_COD = 2) or (N.TNOV_COD = 3) or (N.TNOV_COD = 4)) into :DIASNOV;
                    if (:DIASNOV is null) then
                        VALOR = 0;
                    else
                        VALOR = (:BASICO / 30)* :DIASNOV;
                    end
                else if (CONC_COD = 921) then
                    begin
                    if (PORCEN is not null and PORCEN <> 0) then
                        VALOR = ((BASICO / 30)* :DIASLAB ) * :PORCEN /100;
                    else
                        if (CONC_PORC is not null and CONC_PORC <> 0) then
                            VALOR = ((BASICO / 30)* :DIASLAB ) * :CONC_PORC /100;
                    end
                else if (CONC_COD = 953) then
                    begin
                    /* RECARGO */
                    BASICO = BASICOEMP;
                    VALOR = (((:BASICO/30)/8)*:TAR_RECNOTC)*:RECNOCT;
                    VALOR = :VALOR + ((((:BASICO/30)/8)*:TAR_RECFEST)*:RECFEST);
                    end
                if (CONC_APORTE = 'S') then
                    begin
                    if (ENTIDAD is null or (ENTIDAD = '') ) then
                        ENTIDAD = :CONC_ENTIDAD;
                    end
                end
            if ((VALOR <> 0) and (VALOR is not null)) then
                begin
                execute procedure REDONDEE(:VALOR, :APROX) returning_values (VALOR);
                if ((MENSUAL = 'N') or (PERIODICIDAD = 1))  then
                    insert into NOMINA_CONCEPTOS (NOMI_ID, NOCO_ITEM, CONC_COD,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, NOCO_GTOEMPR)
                        values (:IDNOMINA,:ITEM, :CONCEPT, :NIT_TERCERO, :VALOR, :ENTIDAD, :CONC_DEDUC, :CONC_PROV, :CONC_APORTE, :PERIODO, :ANO, :CONC_MODIFI, :CONC_APLICAPROM, :SALARIO, :GTOEMPR);
                else
                    if (MENSUAL = 'S') then
                        begin
                        if ((:PERIODICIDAD = 2) and (LIQUIDAPER = 1)) then
                            begin
                            if ((PERIODO = 1) or (PERIODO = 3) or (PERIODO = 5) or (PERIODO = 7) or (PERIODO = 9) or (PERIODO = 11)
                                or (PERIODO = 13) or (PERIODO = 15) or (PERIODO = 17) or (PERIODO = 19) or (PERIODO = 21) or (PERIODO = 23)) then
                                insert into NOMINA_CONCEPTOS (NOMI_ID, NOCO_ITEM, CONC_COD,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, NOCO_GTOEMPR)
                                    values (:IDNOMINA,:ITEM, :CONCEPT, :NIT_TERCERO, :VALOR, :ENTIDAD, :CONC_DEDUC, :CONC_PROV, :CONC_APORTE, :PERIODO, :ANO, :CONC_MODIFI, :CONC_APLICAPROM, :SALARIO, :GTOEMPR);
                            end
                        else if ((:PERIODICIDAD = 2) and (LIQUIDAPER = 2)) then
                            begin
                            if ((PERIODO = 2) or (PERIODO = 4) or (PERIODO = 6) or (PERIODO = 8) or (PERIODO = 10) or (PERIODO = 12)
                                or (PERIODO = 14) or (PERIODO = 16) or (PERIODO = 18) or (PERIODO = 20) or (PERIODO = 22) or (PERIODO = 24)) then
                                insert into NOMINA_CONCEPTOS (NOMI_ID, NOCO_ITEM, CONC_COD,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, NOCO_GTOEMPR)
                                    values (:IDNOMINA,:ITEM, :CONCEPT, :NIT_TERCERO, :VALOR, :ENTIDAD, :CONC_DEDUC, :CONC_PROV, :CONC_APORTE, :PERIODO, :ANO, :CONC_MODIFI, :CONC_APLICAPROM, :SALARIO, :GTOEMPR);
                            end
                        else if ((:PERIODICIDAD = 3) and (LIQUIDAPER = 1)) then
                            begin
                            if ((PERIODO = 1) or (PERIODO = 5) or (PERIODO = 9) or (PERIODO = 13) or (PERIODO = 17) or (PERIODO = 21)
                                or (PERIODO = 25) or (PERIODO = 29) or (PERIODO = 33) or (PERIODO = 37) or (PERIODO = 41) or (PERIODO = 45)
                                or (PERIODO = 49)) then
                                insert into NOMINA_CONCEPTOS (NOMI_ID, NOCO_ITEM, CONC_COD,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, NOCO_GTOEMPR)
                                    values (:IDNOMINA,:ITEM, :CONCEPT, :NIT_TERCERO, :VALOR, :ENTIDAD, :CONC_DEDUC, :CONC_PROV, :CONC_APORTE, :PERIODO, :ANO, :CONC_MODIFI, :CONC_APLICAPROM, :SALARIO, :GTOEMPR);
                            end
                        else if ((:PERIODICIDAD = 3) and (LIQUIDAPER = 2)) then
                            begin
                            if ((PERIODO = 2) or (PERIODO = 6) or (PERIODO = 10) or (PERIODO = 14) or (PERIODO = 18) or (PERIODO = 22)
                                or (PERIODO = 26) or (PERIODO = 30) or (PERIODO = 34) or (PERIODO = 38) or (PERIODO = 42) or (PERIODO = 46)
                                or (PERIODO = 50)) then
                                insert into NOMINA_CONCEPTOS (NOMI_ID, NOCO_ITEM, CONC_COD,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, NOCO_GTOEMPR)
                                    values (:IDNOMINA,:ITEM, :CONCEPT, :NIT_TERCERO, :VALOR, :ENTIDAD, :CONC_DEDUC, :CONC_PROV, :CONC_APORTE, :PERIODO, :ANO, :CONC_MODIFI, :CONC_APLICAPROM, :SALARIO, :GTOEMPR);
                            end
                        else if ((:PERIODICIDAD = 3) and (LIQUIDAPER = 3)) then
                            begin
                            if ((PERIODO = 3) or (PERIODO = 7) or (PERIODO = 11) or (PERIODO = 15) or (PERIODO = 19) or (PERIODO = 23)
                                or (PERIODO = 27) or (PERIODO = 31) or (PERIODO = 35) or (PERIODO = 39) or (PERIODO = 43) or (PERIODO = 47)
                                or (PERIODO = 51)) then
                                insert into NOMINA_CONCEPTOS (NOMI_ID, NOCO_ITEM, CONC_COD,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, NOCO_GTOEMPR)
                                    values (:IDNOMINA,:ITEM, :CONCEPT, :NIT_TERCERO, :VALOR, :ENTIDAD, :CONC_DEDUC, :CONC_PROV, :CONC_APORTE, :PERIODO, :ANO, :CONC_MODIFI, :CONC_APLICAPROM, :SALARIO, :GTOEMPR);
                            end
                        else if ((:PERIODICIDAD = 3) and (LIQUIDAPER = 4)) then
                            begin
                            if ((PERIODO = 4) or (PERIODO = 8) or (PERIODO = 12) or (PERIODO = 16) or (PERIODO = 20) or (PERIODO = 24)
                                or (PERIODO = 29) or (PERIODO = 32) or (PERIODO = 36) or (PERIODO = 40) or (PERIODO = 44) or (PERIODO = 48)
                                or (PERIODO = 52)) then
                                insert into NOMINA_CONCEPTOS (NOMI_ID, NOCO_ITEM, CONC_COD,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, NOCO_GTOEMPR)
                                    values (:IDNOMINA,:ITEM, :CONCEPT, :NIT_TERCERO, :VALOR, :ENTIDAD, :CONC_DEDUC, :CONC_PROV, :CONC_APORTE, :PERIODO, :ANO, :CONC_MODIFI, :CONC_APLICAPROM, :SALARIO, :GTOEMPR);
                            end
                        end
                    VALOR = 0;
                    BASICO = 0;
                    end
            end /* for */
        end
    end
suspend;
end
^

SET TERM ; ^


/* 20100927 */

INSERT INTO CONFIGURACION (CONF_MODULO, CONF_CATEGORIA, CONF_PROPIEDAD, CONF_VALOR, CONF_POSIBLES, CONF_AYUDA) VALUES ('NOMINA', 'LIQUIDACION', 'NUMERO DE ORDEN PARA COLUMNA DE TOTAL DEVENGOS EN PLANILLA DE PAGO', '10', '', 'Indique el número de columna que corresponda según la posición en la planilla en que quiera que aparezca el total devengado por empleado.');
INSERT INTO CONFIGURACION (CONF_MODULO, CONF_CATEGORIA, CONF_PROPIEDAD, CONF_VALOR, CONF_POSIBLES, CONF_AYUDA) VALUES ('NOMINA', 'LIQUIDACION', 'NUMERO DE ORDEN PARA COLUMNA DE TOTAL DEDUCCIONES EN PLANILLA DE PAGO', '20', '', 'Indique el número de columna que corresponda según la posición en la planilla en que quiera que aparezca el total de las deucciones por empleado.');
INSERT INTO CONFIGURACION (CONF_MODULO, CONF_CATEGORIA, CONF_PROPIEDAD, CONF_VALOR, CONF_POSIBLES, CONF_AYUDA) VALUES ('NOMINA', 'LIQUIDACION', 'NUMERO DE ORDEN PARA COLUMNA DE TOTAL EMPLEADO EN PLANILLA DE PAGO', '90', '', 'Indique el número de columna que corresponda según la posición en la planilla en que quiera que aparezca el total a pagar por empleado.');
COMMIT WORK;

SET TERM ^ ;

CREATE OR ALTER procedure IMPR_PLANILLA_NOMINA (
    ID integer,
    PAGO char(1),
    CTA char(1),
    EMPL char(1),
    DPTO varchar(20))
returns (
    FECHA date,
    OBSERVACIONES blob sub_type 0 segment size 80,
    PAGOGLOBAL char(1),
    PERIODO integer,
    ANO char(4),
    PERIODICIDAD varchar(60),
    NITEMPL varchar(20),
    VALOR numeric(18,2),
    DEDUC char(1),
    NOMBREEMPL varchar(60),
    NOMCORTCONC varchar(60),
    NOMBRECONC varchar(60),
    CODCONC integer,
    PROV char(1),
    TOTALEMPL numeric(18,2),
    TOTALDEDUC numeric(18,2),
    TOTALDEVENG numeric(18,2),
    NUMEMPL integer,
    CTAEMPL varchar(25),
    TOTALCTAS numeric(18,2),
    TOTALNOMI numeric(18,2),
    TOTALAPOR numeric(18,2),
    NOMPER varchar(60),
    ORG integer,
    CARGOEMPL varchar(60),
    DEPTOEMPL varchar(60),
    NUMCOP integer,
    NOMBRE_COPIA varchar(60),
    DIASLAB integer,
    SALARIO numeric(18,2),
    BENEFICIO char(1),
    BASE numeric(18,2),
    CODDPTOEMPL integer,
    ORDEN integer)
AS
declare variable nitant varchar(20);
declare variable nitnue varchar(20);
declare variable numconc integer;
declare variable totalnomineg numeric(18,2);
declare variable totalaporneg numeric(18,2);
declare variable par integer;
declare variable impar integer;
declare variable antdeduc char(1);
declare variable nitdeduc varchar(20);
declare variable nittot varchar(20);
declare variable nitaux varchar(20);
declare variable COLDEV INTEGER;
declare variable COLDED INTEGER;
declare variable COLTOT INTEGER;
BEGIN
SELECT N.nuco_copia FROM NUMERO_COPIA N WHERE N.tido_cod = 92 AND N.nuco_id = :id INTO :NUMCOP;
IF (numcop IS NULL) THEN
  BEGIN
  numcop = 0;
  INSERT INTO NUMERO_COPIA (TIDO_COD, NUCO_ID, NUCO_COPIA) VALUES (92,:id,:numcop);
  END
ELSE
  BEGIN
  numcop = :numcop + 1;
  UPDATE numero_copia N SET N.nuco_copia = :numcop WHERE N.tido_cod = 92 AND N.nuco_id = :id;
  END
SELECT N.noco_nombre FROM nombres_copias N WHERE N.noco_id = :numcop INTO :nombre_copia;
numempl = 0;
nitant = 0;
nitnue = 0;
EXECUTE PROCEDURE LEE_CONFIGURACION ('NOMINA', 'LIQUIDACION', 'NUMERO DE ORDEN PARA COLUMNA DE TOTAL DEVENGOS EN PLANILLA DE PAGO') returning_values (:COLDEV);
EXECUTE PROCEDURE LEE_CONFIGURACION ('NOMINA', 'LIQUIDACION', 'NUMERO DE ORDEN PARA COLUMNA DE TOTAL DEDUCCIONES EN PLANILLA DE PAGO') returning_values (:COLDED);
EXECUTE PROCEDURE LEE_CONFIGURACION ('NOMINA', 'LIQUIDACION', 'NUMERO DE ORDEN PARA COLUMNA DE TOTAL EMPLEADO EN PLANILLA DE PAGO') returning_values (:COLTOT);
IF (PAGO = 'N') THEN
  BEGIN
  FOR SELECT N.nomi_feccausa, N.nomi_obs, N.nomi_pagoglobal, N.nomi_periodo, N.nomi_ano, P.ppag_nombre, PN.pnom_nombre
    FROM NOMINA N, periodo_pago P, periodo_pago_nombre PN
    WHERE P.ppag_cod = N.nomi_periodocidad AND N.nomi_id = :ID AND PN.ppag_cod = N.nomi_periodocidad AND PN.ppag_periodo = N.nomi_periodo
    INTO :fecha, :observaciones, :pagoglobal, :periodo, :ano, :periodicidad, :NOMPER
    DO
    BEGIN
    SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id INTO :totalnomi;
    SELECT SUM(NC.noco_valor*-1) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_APORTE = 'S' AND NOCO_VALOR < 0 AND NOMI_ID = :id INTO :totalaporneg;
    SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_APORTE = 'S' AND NOCO_VALOR > 0 AND NOMI_ID = :id INTO :totalapor;
    totalapor = :totalapor + totalaporneg;
    FOR SELECT NC.terc_nit, NC.noco_valor, NC.noco_deduc, T.terc_nom, C.conc_nomcorto, C.conc_nombre, NC.conc_cod, NC.noco_prov, C.conc_orden+1
      FROM NOMINA_CONCEPTOS NC, TERCEROS T, CONCEPTOS_NOMINA C
      WHERE NC.nomi_id = :ID AND C.conc_cod = NC.conc_cod AND t.terc_nit = nc.terc_nit
      ORDER BY NC.NOCO_DEDUC, NC.conc_cod,  T.TERC_NOM
      INTO :nitempl, :valor, :deduc, :nombreempl, :nomcortconc, :nombreconc, :codconc, :prov, :orden
      DO
      BEGIN
      IF (valor IS NULL) THEN
        valor = 0;
      cargoempl = '';
      select empl_cargo from EMPLEADOS where terc_nit = :nitempl into :cargoempl;
      SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND TERC_NIT = :nitempl INTO :totalempl;
      SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND TERC_NIT = :nitempl AND NC.noco_deduc = 'S' INTO :totaldeduc;
      SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND TERC_NIT = :nitempl AND NC.noco_deduc = 'N' INTO :totaldeveng;
      SUSPEND;
      END
    /* totales por concepto
    nitempl = '';
    valor = NULL;
    deduc = '';
    nombreempl = NULL;
    nomcortconc = NULL;
    nombreconc = NULL;
    codconc = NULL;
    prov = NULL;
    FOR SELECT MAX(conc_cod), SUM(noco_valor) FROM NOMINA_CONCEPTOS WHERE nomi_id = :id
      GROUP BY conc_cod
      INTO :codconc, :valor
      DO
      BEGIN
      nitempl = '';
      nombreempl = '';
      deduc = 'N';
      prov = 'N';
      SELECT C.conc_nombre,C.conc_nomcorto FROM CONCEPTOS_NOMINA C WHERE C.conc_cod = :codconc INTO :nombreconc,:nomcortconc;
      SUSPEND;
      END
    IF (EMPL = 'N') THEN
      BEGIN
      deduc = 'N';
      nomcortconc = 'DIAS LAB.';
      nombreconc = 'DIAS LAB.';
      codconc = 0;
      prov = 'N';
      valor = NULL;
      nitempl = '';
      nombreempl = '';
      SUSPEND;
      deduc = 'N';
      nomcortconc = 'SDO BASE';
      nombreconc = 'SDO BASE';
      codconc = 0;
      prov = 'N';
      valor = NULL;
      nitempl = '';
      nombreempl = '';
      SUSPEND;
      END
    /* dias laborados y salario base */
    FOR SELECT ND.node_diaslab, ND.terc_nit, T.terc_nom FROM NOMINA_DETALLE ND, TERCEROS T
        WHERE NOMI_ID = :id AND T.terc_nit = ND.terc_nit
      INTO :diaslab, :nitaux, :nombreempl
      DO
      BEGIN
      nitempl = :nitaux;
      nomcortconc = 'DIAS LAB.';
      valor = :diaslab;
      ORDEN = 0;
      SUSPEND;
      SELECT FIRST 1  m.mvse_salario FROM MOVIMIENTO_SALARIO_EMPLEADO M WHERE M.terc_nit = :nitaux AND M.mvse_fecha <= :fecha ORDER BY M.mvse_fecha DESC INTO :salario;
      nitempl = :nitaux;
      nomcortconc = 'SDO BASE';
      ORDEN = 1;
      valor = :salario;
      SUSPEND;
      END
    END
  END
ELSE
  IF (PAGO = 'S') THEN
    BEGIN
    par = 2;
    impar = 1;
    SELECT N.nomi_feccausa, N.nomi_obs, N.nomi_pagoglobal, N.nomi_periodo, N.nomi_ano, P.ppag_nombre, PN.pnom_nombre
        FROM NOMINA N, periodo_pago P, periodo_pago_nombre PN
        WHERE P.ppag_cod = N.nomi_periodocidad AND N.nomi_id = :ID AND PN.ppag_cod = N.nomi_periodocidad AND PN.ppag_periodo = N.nomi_periodo
        INTO :fecha, :observaciones, :pagoglobal, :periodo, :ano, :periodicidad, :NOMPER;
    IF (EMPL = 'N') THEN
        BEGIN
        deduc = 'N';
        nomcortconc = 'DIAS LAB.';
        nombreconc = 'DIAS LAB.';
        codconc = 0;
        prov = 'N';
        valor = NULL;
        nitempl = '';
        nombreempl = '';
        ORDEN = 0;
        SUSPEND;
        deduc = 'N';
        nomcortconc = 'SDO BASE';
        nombreconc = 'SDO BASE';
        codconc = 0;
        prov = 'N';
        valor = NULL;
        nitempl = '';
        nombreempl = '';
        ORDEN = 1;
        SUSPEND;
        deduc = 'N';
        nomcortconc = 'TOTAL DEV';
        nombreconc = 'TOTAL DEV';
        codconc = 9999;
        prov = 'N';
        valor = NULL;
        nitempl = '';
        nombreempl = '';
        ORDEN = COLDEV;
        SUSPEND;
        deduc = 'S';
        nomcortconc = 'TOTAL DEDUC';
        nombreconc = 'TOTAL DEDUC';
        codconc = 99999;
        prov = 'N';
        valor = NULL;
        nitempl = '';
        nombreempl = '';
        ORDEN = COLDED;
        SUSPEND;
        deduc = 'S';
        nomcortconc = 'TOTAL EMPL';
        nombreconc = 'TOTAL EMPL';
        codconc = 999999;
        prov = 'N';
        valor = NULL;
        nitempl = '';
        nombreempl = '';
        ORDEN = COLTOT;
        SUSPEND;
        FOR SELECT MAX(N.conc_cod), MAX(N.noco_deduc) FROM NOMINA_CONCEPTOS N
            WHERE N.nomi_id = :id AND N.noco_prov = 'N' AND N.noco_gtoempr = 'N'
            GROUP BY N.conc_cod
            INTO :codconc, :deduc
            DO
            BEGIN
            valor = NULL;
            nitempl = '';
            nombreempl = '';
            prov = 'N';
            SELECT C.conc_nombre,C.conc_nomcorto,C.conc_orden+1 FROM CONCEPTOS_NOMINA C
                WHERE C.conc_cod = :codconc INTO :nombreconc,:nomcortconc, :orden;
            SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id INTO :totalempl;
            SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND NC.noco_deduc = 'S' INTO :totaldeduc;
            SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND NC.noco_deduc = 'N' INTO :totaldeveng;
            SUSPEND;
            END
        FOR SELECT ND.node_diaslab,  ND.terc_nit, T.terc_nom
            FROM NOMINA_DETALLE ND, TERCEROS T WHERE NOMI_ID = :id AND T.terc_nit = ND.terc_nit
            INTO :diaslab, :nitaux, :nombreempl
            DO
            BEGIN
            nitempl = :nitaux;
            nomcortconc = 'DIAS LAB.';
            ORDEN = 0;
            valor = :diaslab;
            SUSPEND;
            SELECT FIRST 1  m.mvse_salario FROM MOVIMIENTO_SALARIO_EMPLEADO M WHERE M.terc_nit = :nitaux AND M.mvse_fecha <= :fecha ORDER BY M.mvse_fecha DESC INTO :salario;
            nitempl = :nitaux;
            nomcortconc = 'SDO BASE';
            valor = :salario;
            ORDEN = 1;
            SUSPEND;
            END
        END
    FOR SELECT NC.terc_nit, NC.noco_valor, NC.noco_deduc, T.terc_nom, C.conc_nomcorto, C.conc_nombre, NC.conc_cod, NC.noco_prov, NC.terc_nit, c.conc_benefic, NC.noco_base, C.conc_orden+1
        FROM NOMINA_CONCEPTOS NC, TERCEROS T, CONCEPTOS_NOMINA C
        WHERE NC.nomi_id = :ID AND C.conc_cod = NC.conc_cod AND t.terc_nit = nc.terc_nit AND NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N'
        ORDER BY T.terc_nom
        INTO :nitempl, :valor, :deduc, :nombreempl, :nomcortconc, :nombreconc, :codconc, :prov,:nitnue, :beneficio,:base, :orden
        DO
        BEGIN
        cargoempl = '';
        ctaempl = '';
        deptoempl = '';
        coddptoempl = 0;
        diaslab = 0;
        SELECT FIRST 1 node_diaslab FROM NOMINA_DETALLE WHERE nomi_id = :id AND terc_nit = :nitempl INTO :diaslab;
        select e.empl_cargo, e.empl_cuenta, D.dpto_nombre, d.dpto_cod
            from EMPLEADOS e, DEPARTAMENTO D
            where D.dpto_cod = E.empl_dpto AND e.terc_nit = :nitempl into :cargoempl,:ctaempl,:deptoempl,:coddptoempl;
        SELECT FIRST 1  m.mvse_salario FROM MOVIMIENTO_SALARIO_EMPLEADO M WHERE M.terc_nit = :nitempl AND M.mvse_fecha <= :FECHA ORDER BY M.mvse_fecha DESC INTO :salario;
        IF ((nitnue <> nitant) AND (nitnue IS NOT NULL)) THEN
            numempl = :numempl + 1;
        IF (valor IS NULL) THEN
            valor = 0;
        IF (nitempl <> nitdeduc) THEN
            BEGIN
            par = 2;
            impar = 1;
            END
        nitdeduc = :nitempl;
        IF (:deduc = 'S') THEN
            BEGIN
            antdeduc = 'S';
            org = :par;
            par = :par + 2;
            END
        ELSE
            BEGIN
            antdeduc = 'N';
            org = :impar;
            impar = :impar + 2;
            END
       SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND TERC_NIT = :nitempl INTO :totalempl;
       SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND TERC_NIT = :nitempl AND NC.noco_deduc = 'S' INTO :totaldeduc;
       SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND TERC_NIT = :nitempl AND NC.noco_deduc = 'N' INTO :totaldeveng;
       IF (cta = 'S') THEN
         BEGIN
         SELECT COUNT(CONC_COD) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND TERC_NIT = :nitempl INTO :numconc;
         totalempl = totalempl / :numconc;
         SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND TERC_NIT = :nitempl INTO :totalctas;
         END
       SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id INTO :totalnomi;
       SELECT SUM(NC.noco_valor*-1) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_APORTE = 'S' AND NOCO_VALOR < 0 AND NOMI_ID = :id INTO :totalaporneg;
       SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_APORTE = 'S' AND NOCO_VALOR > 0 AND NOMI_ID = :id INTO :totalapor;
       totalapor = :totalapor + totalaporneg;
       SUSPEND;
       IF ((nitnue <> nitant) AND (nitnue IS NOT NULL) AND (EMPL = 'N')) THEN
         BEGIN
         deduc = 'N';
         nomcortconc = 'TOTAL DEV';
         nombreconc = 'TOTAL DEV';
         codconc = 9999;
         prov = 'N';
         SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND NC.noco_deduc = 'N' AND NC.terc_nit = : nitempl INTO :VALOR;
         ORDEN = COLDEV;
         SUSPEND;
         deduc = 'S';
         nomcortconc = 'TOTAL DEDUC';
         nombreconc = 'TOTAL DEDUC';
         codconc = 99999;
         prov = 'N';
         SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND NC.noco_deduc = 'S' AND NC.terc_nit = :nitempl INTO :VALOR;
         ORDEN = COLDED;
         SUSPEND;
         deduc = 'S';
         nomcortconc = 'TOTAL EMPL';
         nombreconc = 'TOTAL EMPL';
         codconc = 999999;
         prov = 'N';
         SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND NC.terc_nit = :nitempl INTO :VALOR;
         nitant = :nitnue;
         ORDEN = COLTOT;
         SUSPEND;
         END
       END
    numempl = :numempl + 1;
    IF (EMPL = 'N') THEN
        BEGIN
        nitempl = '';
        valor = NULL;
        deduc = '';
        nombreempl = NULL;
        nomcortconc = NULL;
        nombreconc = NULL;
        codconc = NULL;
        prov = NULL;
        totalempl = NULL;
        ctaempl = NULL;
        IF (cta = 'N') THEN
          BEGIN
          FOR SELECT MAX(N.conc_cod) FROM NOMINA_CONCEPTOS N WHERE N.nomi_id = :id AND N.noco_prov = 'N' AND N.noco_gtoempr = 'N'
            GROUP BY N.conc_cod
            INTO :codconc
            DO
            BEGIN
            /* TOTALES POR DEPTO */
            IF (dpto IS NOT NULL AND (DPTO <> '') ) THEN
                BEGIN
                SELECT SUM(NC.noco_valor), MAX(NC.noco_deduc) FROM NOMINA_CONCEPTOS NC, EMPLEADOS E, DEPARTAMENTO D
                    WHERE NC.nomi_id = :ID AND NC.conc_cod = :codconc AND D.dpto_cod = E.empl_dpto AND NC.terc_nit = E.terc_nit AND d.dpto_cod = :dpto
                    GROUP BY NC.conc_cod
                    INTO :valor, :deduc;
                nitempl = '-';
                nombreempl = '|  TOTAL  |';
                deptoempl = '-';
                prov = 'N';
                SELECT C.conc_nombre,C.conc_nomcorto FROM CONCEPTOS_NOMINA C WHERE C.conc_cod = :codconc INTO :nombreconc,:nomcortconc;
                SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC, EMPLEADOS E, DEPARTAMENTO D WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id  AND D.dpto_cod = E.empl_dpto AND NC.terc_nit = E.terc_nit INTO :totalempl;
                SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC, EMPLEADOS E, DEPARTAMENTO D WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND NC.noco_deduc = 'S'  AND D.dpto_cod = E.empl_dpto AND NC.terc_nit = E.terc_nit INTO :totaldeduc;
                SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC, EMPLEADOS E, DEPARTAMENTO D WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND NC.noco_deduc = 'N'  AND D.dpto_cod = E.empl_dpto AND NC.terc_nit = E.terc_nit INTO :totaldeveng;
                END
            ELSE
                BEGIN
                SELECT SUM(NC.noco_valor), MAX(NC.noco_deduc) FROM NOMINA_CONCEPTOS NC
                WHERE NC.nomi_id = :ID AND NC.conc_cod = :codconc
                GROUP BY NC.conc_cod
                INTO :valor, :deduc;
                nitempl = '-';
                nombreempl = '|  TOTAL  |';
                deptoempl = '-';
                prov = 'N';
                SELECT C.conc_nombre,C.conc_nomcorto FROM CONCEPTOS_NOMINA C WHERE C.conc_cod = :codconc INTO :nombreconc,:nomcortconc;
                SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id INTO :totalempl;
                SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND NC.noco_deduc = 'S' INTO :totaldeduc;
                SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND NC.noco_deduc = 'N' INTO :totaldeveng;
                END
            SUSPEND;
            END
        IF (dpto IS NOT NULL AND (DPTO <> '') ) THEN
            BEGIN
            deduc = 'N';
             nomcortconc = 'TOTAL DEV';
             nombreconc = 'TOTAL DEV';
             codconc = 9999;
             deptoempl = '-';
             prov = 'N';
             SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC, EMPLEADOS E, DEPARTAMENTO D WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND NC.noco_deduc = 'N'  AND D.dpto_cod = E.empl_dpto AND d.dpto_cod = :dpto AND NC.terc_nit = E.terc_nit INTO :VALOR;
             nitempl = '-';
             nombreempl = '|  TOTAL  |';
             ORDEN = COLDEV;
             SUSPEND;
             deduc = 'S';
             nomcortconc = 'TOTAL DEDUC';
             nombreconc = 'TOTAL DEDUC';
             codconc = 99999;
             deptoempl = '-';
             prov = 'N';
             SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC, EMPLEADOS E, DEPARTAMENTO D WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND NC.noco_deduc = 'S'  AND D.dpto_cod = E.empl_dpto AND d.dpto_cod = :dpto AND NC.terc_nit = E.terc_nit INTO :VALOR;
             nitempl = '-';
             nombreempl = '|  TOTAL  |';
             ORDEN = COLDED;
             SUSPEND;
             deduc = 'S';
             nomcortconc = 'TOTAL EMPL';
             nombreconc = 'TOTAL EMPL';
             codconc = 999999;
             deptoempl = '-';
             prov = 'N';
             SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC, EMPLEADOS E, DEPARTAMENTO D WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id  AND D.dpto_cod = E.empl_dpto AND NC.terc_nit = E.terc_nit AND d.dpto_cod = :dpto INTO :VALOR;
             nitempl = '-';
             nombreempl = '|  TOTAL  |';
             ORDEN = COLTOT;
             SUSPEND;
             END
        ELSE
             BEGIN
             deduc = 'N';
             nomcortconc = 'TOTAL DEV';
             nombreconc = 'TOTAL DEV';
             codconc = 9999;
             prov = 'N';
             SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND NC.noco_deduc = 'N' INTO :VALOR;
             nitempl = '-';
             nombreempl = '|  TOTAL  |';
             ORDEN = COLDEV;
             SUSPEND;
             deduc = 'S';
             nomcortconc = 'TOTAL DEDUC';
             nombreconc = 'TOTAL DEDUC';
             codconc = 99999;
             prov = 'N';
             SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND NC.noco_deduc = 'S' INTO :VALOR;
             nitempl = '-';
             nombreempl = '|  TOTAL  |';
             ORDEN = COLDED;
             SUSPEND;
             deduc = 'S';
             nomcortconc = 'TOTAL EMPL';
             nombreconc = 'TOTAL EMPL';
             codconc = 999999;
             prov = 'N';
             SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N'  AND NOMI_ID = :id INTO :VALOR;
             nitempl = '-';
             nombreempl = '|  TOTAL  |';
             ORDEN = COLTOT;
             SUSPEND;
             END
         END
       END
    END
END
^

SET TERM ; ^


/* 20100928 */
/* error al calcular aportes de afp, afc y arp por where sin condición */

SET TERM ^ ;

CREATE OR ALTER procedure LIQUIDACION_APORTES (
    ID_NOMINA_1 integer,
    ID_NOMINA_2 integer,
    ID_NOMINA_3 integer,
    ID_NOMINA_4 integer,
    ID_NOMINA_5 integer,
    ID_NOMINA_6 integer,
    ID_NOMINA_7 integer,
    INTMORA numeric(18,2),
    FECHA date,
    FORMULARIO varchar(10),
    SOLOSS char(1))
returns (
    IDAPORTE integer)
AS
declare variable itemaportadmi integer;
declare variable itemdetaport integer;
declare variable nit varchar(20);
declare variable eps char(1);
declare variable afp char(1);
declare variable ccf char(1);
declare variable afc char(1);
declare variable arp char(1);
declare variable nombreadmin varchar(60);
declare variable totadmin numeric(18,2);
declare variable totadminneg numeric(18,2);
declare variable totadminarp numeric(18,2);
declare variable totadminnegarp numeric(18,2);
declare variable tipoaport char(1);
declare variable ano char(4);
declare variable nitempl varchar(20);
declare variable totdetvalor numeric(18,2);
declare variable totdetvalorneg numeric(18,2);
declare variable totibc integer;
declare variable mora numeric(18,2);
begin
itemaportadmi = 1;
itemdetaport = 1;
ANO = SUBSTR(fecha, 1, 4);
idaporte = gen_id(id_pgaport,1);
select PAAN_TIPOAPORT from parametros_ano where PAAN_ANO = :ANO into :tipoaport;
for select A.TERC_NIT, A.ADMI_EPS, A.ADMI_AFP, A.ADMI_CCF, A.ADMI_AFC, A.ADMI_ARP, T.TERC_NOM from ADMINISTRADORA A, TERCEROS t
  where T.TERC_NIT = A.TERC_NIT and t.terc_admini = 'S' Into :nit, :eps, :afp, :CCF, :afc, :arp, :nombreadmin
  do
  begin
  select sum (noco_valor) from nomina_conceptos N, conceptos_nomina C
      where (N.noco_aporte = 'S' and N.noco_entidad = :nit AND N.conc_cod = C.conc_cod AND ((C.conc_repoi = 'S') or (:SOLOSS = 'N'))
      and (nomi_id = :id_nomina_1 or (nomi_id = :id_nomina_2) or (nomi_id = :id_nomina_3) or (nomi_id = :id_nomina_4) or (nomi_id = :id_nomina_5) or (nomi_id = :id_nomina_6) or (nomi_id = :id_nomina_7)) AND N.noco_valor > 0)
      into :totadmin;
  if (totadmin is null) then
      totadmin = 0;
  select sum (noco_valor*(-1)) from nomina_conceptos N, conceptos_nomina C
      where (N.noco_aporte = 'S' and N.noco_entidad = :nit AND N.conc_cod = C.conc_cod AND ((C.conc_repoi = 'S') or (:SOLOSS = 'N'))
      and (nomi_id = :id_nomina_1 or (nomi_id = :id_nomina_2) or (nomi_id = :id_nomina_3) or (nomi_id = :id_nomina_4) or (nomi_id = :id_nomina_5) or (nomi_id = :id_nomina_6) or (nomi_id = :id_nomina_7)) AND N.noco_valor < 0)
      into :totadminneg;
  if (totadminneg is null) then
      totadminneg = 0;
  totadmin = :totadminneg + :totadmin;
  if (arp = 'S') then
    BEGIN
    select sum (noco_valor) from nomina_conceptos N, conceptos_nomina C
        where (N.noco_aporte = 'S' and N.noco_entidad = :nit AND N.conc_cod = C.conc_cod AND ((C.conc_repoi = 'S') or (:SOLOSS = 'N'))
        and (N.conc_cod = 908 or (N.conc_cod = 909)) and (nomi_id = :id_nomina_1 or (nomi_id = :id_nomina_2) or (nomi_id = :id_nomina_3) or (nomi_id = :id_nomina_4) or (nomi_id = :id_nomina_5) or (nomi_id = :id_nomina_6) or (nomi_id = :id_nomina_7)) AND N.noco_valor > 0)
        into :totadminarp;
    if (totadminarp is null) then
        totadminarp = 0;
    totadmin = :totadmin + :totadminarp;
    select sum (noco_valor*(-1)) from nomina_conceptos N, conceptos_nomina C
        where (N.noco_aporte = 'S' and N.noco_entidad = :nit AND N.conc_cod = C.conc_cod AND ((C.conc_repoi = 'S') or (:SOLOSS = 'N'))
        and (N.conc_cod = 908 or (N.conc_cod = 909)) and (nomi_id = :id_nomina_1 or (nomi_id = :id_nomina_2) or (nomi_id = :id_nomina_3) or (nomi_id = :id_nomina_4) or (nomi_id = :id_nomina_5) or (nomi_id = :id_nomina_6) or (nomi_id = :id_nomina_7)) AND N.noco_valor < 0)
        into :totadminnegarp;
    if (totadminnegarp is null) then
        totadminnegarp = 0;
    totadminneg = :totadminnegarp + :totadminneg;
    totadmin = :totadminneg + :totadmin;
    END
  if (totadmin IS NOT NULL and totadmin <> 0) then
    BEGIN
    insert into pago_aportes (pgap_id, pgap_item, pgap_tipoap, pgap_conpago, pgap_admin, pgap_monto, pgap_intmora, pgap_fecha, pgap_formulario,pgap_idnomina) values
        (:idaporte, :itemaportadmi, :tipoaport, '', :nit, :totadmin, :intmora, :fecha, :formulario,:id_nomina_1);
    if (CCF = 'S') then
        begin
        for select TERC_NIT from EMPLEADOS E where EMPL_CCF = :NIT AND E.terc_nit IN (SELECT NC.terc_nit
            FROM NOMINA_CONCEPTOS NC WHERE (nomi_id = :id_nomina_1 or (nomi_id = :id_nomina_2) or (nomi_id = :id_nomina_3) or (nomi_id = :id_nomina_4) or (nomi_id = :id_nomina_5) or (nomi_id = :id_nomina_6) or (nomi_id = :id_nomina_7)))
            into :nitempl
            do
            begin
            select sum (NOCO_VALOR) from NOMINA_CONCEPTOS
                where (TERC_NIT = :nitempl and NOCO_SALARIO = 'S' and (nomi_id = :id_nomina_1 or (nomi_id = :id_nomina_2) or (nomi_id = :id_nomina_3) or (nomi_id = :id_nomina_4) or (nomi_id = :id_nomina_5) or (nomi_id = :id_nomina_6) or (nomi_id = :id_nomina_7)))
                into :totibc;
            select sum (NOCO_VALOR) from NOMINA_CONCEPTOS N
                where (TERC_NIT = :nitempl and NOCO_ENTIDAD = :nit and NOCO_APORTE = 'S' and (nomi_id = :id_nomina_1 or (nomi_id = :id_nomina_2) or (nomi_id = :id_nomina_3) or (nomi_id = :id_nomina_4) or (nomi_id = :id_nomina_5) or (nomi_id = :id_nomina_6) or (nomi_id = :id_nomina_7))
                AND noco_valor > 0 and (N.conc_cod = 910 or (N.conc_cod = 911) or (N.conc_cod = 916) or (N.conc_cod = 917) or (N.conc_cod = 918) or (N.conc_cod = 919) or (N.conc_cod = 936) or (N.conc_cod = 939) or (N.conc_cod = 940)))
                into :totdetvalor;
            if (totdetvalor is null) then
                totdetvalor = 0;
            if ((:totdetvalor is not null) and (:totibc is not null) and totdetvalor <> 0) then
                begin
                insert into PAGO_APORTES_DETALLE (pgap_id, pgap_item, pade_itemdet, terc_nit, pade_ibc, pade_cotobl, pade_tipap)
                    values(:idaporte, :itemaportadmi, :itemdetaport, :nitempl, :totibc, :totdetvalor,'CCF');
                itemdetaport = :itemdetaport + 1;
                totdetvalor = 0;
                end
            end
        end
    if (EPS = 'S') then
        begin
        for select TERC_NIT from EMPLEADOS E where EMPL_EPS = :NIT AND E.terc_nit IN (SELECT NC.terc_nit
            FROM NOMINA_CONCEPTOS NC WHERE (nomi_id = :id_nomina_1 or (nomi_id = :id_nomina_2) or (nomi_id = :id_nomina_3) or (nomi_id = :id_nomina_4) or (nomi_id = :id_nomina_5) or (nomi_id = :id_nomina_6) or (nomi_id = :id_nomina_7))) into :nitempl
            do
            begin
            select sum (NOCO_VALOR) from NOMINA_CONCEPTOS N
                where (TERC_NIT = :nitempl and NOCO_SALARIO = 'S' and (nomi_id = :id_nomina_1 or (nomi_id = :id_nomina_2) or (nomi_id = :id_nomina_3) or (nomi_id = :id_nomina_4) or (nomi_id = :id_nomina_5) or (nomi_id = :id_nomina_6) or (nomi_id = :id_nomina_7)))
                into :totibc;
            select sum (NOCO_VALOR) from NOMINA_CONCEPTOS N
                where (TERC_NIT = :nitempl and NOCO_ENTIDAD = :nit and NOCO_APORTE = 'S' and (nomi_id = :id_nomina_1 or (nomi_id = :id_nomina_2) or (nomi_id = :id_nomina_3) or (nomi_id = :id_nomina_4) or (nomi_id = :id_nomina_5) or (nomi_id = :id_nomina_6) or (nomi_id = :id_nomina_7))
                AND noco_valor > 0 and (N.conc_cod = 907 or (N.conc_cod = 914) or (N.conc_cod = 915) or (N.conc_cod = 938)))
                into :totdetvalor;
            if (totdetvalor is null) then
                totdetvalor = 0;
            select sum (NOCO_VALOR*(-1)) from NOMINA_CONCEPTOS N
                where (TERC_NIT = :nitempl and NOCO_ENTIDAD = :nit and NOCO_APORTE = 'S' and (nomi_id = :id_nomina_1 or (nomi_id = :id_nomina_2) or (nomi_id = :id_nomina_3) or (nomi_id = :id_nomina_4) or (nomi_id = :id_nomina_5) or (nomi_id = :id_nomina_6) or (nomi_id = :id_nomina_7))
                AND noco_valor < 0 and (N.conc_cod = 907 or (N.conc_cod = 914) or (N.conc_cod = 915) or (N.conc_cod = 938)))
                into :totdetvalorneg;
            if (totdetvalorneg is null) then
                totdetvalorneg = 0;
            totdetvalor = :totdetvalorneg + :totdetvalor;
            if ((:totdetvalor is not null) and (:totibc is not null) and totdetvalor <> 0) then
                begin
                insert into PAGO_APORTES_DETALLE (pgap_id, pgap_item, pade_itemdet, terc_nit, pade_ibc, pade_cotobl, pade_tipap)
                    values(:idaporte, :itemaportadmi, :itemdetaport, :nitempl, :totibc, :totdetvalor,'EPS');
                itemdetaport = :itemdetaport + 1;
                totdetvalor = 0;
                end
            end
        end
    if (afp = 'S') then
        begin
        for select TERC_NIT from EMPLEADOS E where EMPL_AFP = :NIT AND E.terc_nit IN
            (SELECT NC.terc_nit FROM NOMINA_CONCEPTOS NC WHERE (nomi_id = :id_nomina_1 or (nomi_id = :id_nomina_2) or (nomi_id = :id_nomina_3) or (nomi_id = :id_nomina_4) or (nomi_id = :id_nomina_5) or (nomi_id = :id_nomina_6) or (nomi_id = :id_nomina_7)))
            into :nitempl
            do
            begin
            select sum (NOCO_VALOR) from NOMINA_CONCEPTOS
                where (TERC_NIT = :nitempl and NOCO_SALARIO = 'S' and
                (nomi_id = :id_nomina_1 or (nomi_id = :id_nomina_2) or (nomi_id = :id_nomina_3) or (nomi_id = :id_nomina_4) or (nomi_id = :id_nomina_5) or (nomi_id = :id_nomina_6) or (nomi_id = :id_nomina_7)))
                into :totibc;
            select sum (NOCO_VALOR) from NOMINA_CONCEPTOS N
                where (TERC_NIT = :nitempl and NOCO_ENTIDAD = :nit and NOCO_APORTE = 'S' and
                (nomi_id = :id_nomina_1 or (nomi_id = :id_nomina_2) or (nomi_id = :id_nomina_3) or (nomi_id = :id_nomina_4) or (nomi_id = :id_nomina_5) or (nomi_id = :id_nomina_6) or (nomi_id = :id_nomina_7))
                AND noco_valor > 0 and (N.conc_cod = 904 or (N.conc_cod = 905) or (N.conc_cod = 906) or (N.conc_cod = 934)))
                into :totdetvalor;
            if (totdetvalor is null) then
                totdetvalor = 0;
            select sum (NOCO_VALOR*(-1)) from NOMINA_CONCEPTOS N
                where (TERC_NIT = :nitempl and NOCO_ENTIDAD = :nit and NOCO_APORTE = 'S' and
                (nomi_id = :id_nomina_1 or (nomi_id = :id_nomina_2) or (nomi_id = :id_nomina_3) or (nomi_id = :id_nomina_4) or (nomi_id = :id_nomina_5) or (nomi_id = :id_nomina_6) or (nomi_id = :id_nomina_7))
                AND noco_valor < 0 and (N.conc_cod = 904 or (N.conc_cod = 905) or (N.conc_cod = 906) or (N.conc_cod = 934)))
                into :totdetvalorneg;
            if (totdetvalorneg is null) then
                totdetvalorneg = 0;
            totdetvalor = :totdetvalorneg + :totdetvalor;
            if ((:totdetvalor is not null) and (:totibc is not null) and totdetvalor <> 0) then
                begin
                insert into PAGO_APORTES_DETALLE (pgap_id, pgap_item, pade_itemdet, terc_nit, pade_ibc, pade_cotobl, pade_tipap)
                    values(:idaporte, :itemaportadmi, :itemdetaport, :nitempl, :totibc, :totdetvalor,'AFP');
                itemdetaport = :itemdetaport + 1;
                totdetvalor = 0;
                end
            end
        end
    if (AFC = 'S') then
        begin
        for select TERC_NIT from EMPLEADOS E where EMPL_AFC = :NIT AND E.terc_nit IN (SELECT NC.terc_nit FROM NOMINA_CONCEPTOS NC WHERE (nomi_id = :id_nomina_1 or (nomi_id = :id_nomina_2) or (nomi_id = :id_nomina_3) or (nomi_id = :id_nomina_4) or (nomi_id = :id_nomina_5) or (nomi_id = :id_nomina_6) or (nomi_id = :id_nomina_7))) into :nitempl
            do
            begin
            select sum (NOCO_VALOR) from NOMINA_CONCEPTOS N
                where (TERC_NIT = :nitempl and NOCO_SALARIO = 'S' and
                (nomi_id = :id_nomina_1 or (nomi_id = :id_nomina_2) or (nomi_id = :id_nomina_3) or (nomi_id = :id_nomina_4) or (nomi_id = :id_nomina_5) or (nomi_id = :id_nomina_6) or (nomi_id = :id_nomina_7)))
                into :totibc;
            select sum (NOCO_VALOR) from NOMINA_CONCEPTOS N
                where (TERC_NIT = :nitempl and NOCO_ENTIDAD = :nit and NOCO_APORTE = 'S' and
                (nomi_id = :id_nomina_1 or (nomi_id = :id_nomina_2) or (nomi_id = :id_nomina_3) or (nomi_id = :id_nomina_4) or (nomi_id = :id_nomina_5) or (nomi_id = :id_nomina_6) or (nomi_id = :id_nomina_7))
                AND noco_valor > 0 and (N.conc_cod = 912 or (N.conc_cod = 913)or (N.conc_cod = 937)))
                into :totdetvalor;
            if (totdetvalor is null) then
                totdetvalor = 0;
            select sum (NOCO_VALOR*(-1)) from NOMINA_CONCEPTOS N
                where (TERC_NIT = :nitempl and NOCO_ENTIDAD = :nit and NOCO_APORTE = 'S' and
                (nomi_id = :id_nomina_1 or (nomi_id = :id_nomina_2) or (nomi_id = :id_nomina_3) or (nomi_id = :id_nomina_4) or (nomi_id = :id_nomina_5) or (nomi_id = :id_nomina_6) or (nomi_id = :id_nomina_7))
                AND noco_valor < 0 and (N.conc_cod = 912 or (N.conc_cod = 913)or (N.conc_cod = 937)))
                into :totdetvalorneg;
            if (totdetvalorneg is null) then
                totdetvalorneg = 0;
            totdetvalor = :totdetvalorneg + :totdetvalor;
            if ((:totdetvalor is not null) and (:totibc is not null) and totdetvalor <> 0) then
                begin
                insert into PAGO_APORTES_DETALLE (pgap_id, pgap_item, pade_itemdet, terc_nit, pade_ibc, pade_cotobl, pade_tipap)
                    values(:idaporte, :itemaportadmi, :itemdetaport, :nitempl, :totibc, :totdetvalor,'AFC');    itemdetaport = :itemdetaport + 1;
                totdetvalor = 0;
                end
            end
        end
    if (ARP = 'S') then
        begin
        for select TERC_NIT from EMPLEADOS E where EMPL_ARP = :NIT AND E.terc_nit IN (SELECT NC.terc_nit FROM NOMINA_CONCEPTOS NC WHERE (nomi_id = :id_nomina_1 or (nomi_id = :id_nomina_2) or (nomi_id = :id_nomina_3) or (nomi_id = :id_nomina_4) or (nomi_id = :id_nomina_5) or (nomi_id = :id_nomina_6) or (nomi_id = :id_nomina_7))) into :nitempl
            do
            begin
            select sum (NOCO_VALOR) from NOMINA_CONCEPTOS N
                where (TERC_NIT = :nitempl and NOCO_SALARIO = 'S' and
                (nomi_id = :id_nomina_1 or (nomi_id = :id_nomina_2) or (nomi_id = :id_nomina_3) or (nomi_id = :id_nomina_4) or (nomi_id = :id_nomina_5) or (nomi_id = :id_nomina_6) or (nomi_id = :id_nomina_7)))
                into :totibc;
            select sum (NOCO_VALOR) from NOMINA_CONCEPTOS N
                where (TERC_NIT = :nitempl and NOCO_APORTE = 'S' and
                (nomi_id = :id_nomina_1 or (nomi_id = :id_nomina_2) or (nomi_id = :id_nomina_3) or (nomi_id = :id_nomina_4) or (nomi_id = :id_nomina_5) or (nomi_id = :id_nomina_6) or (nomi_id = :id_nomina_7))
                AND noco_valor > 0 and (N.conc_cod = 908 or (N.conc_cod = 909) or (N.conc_cod = 935)))
                into :totdetvalor;
            if (totdetvalor is null) then
                totdetvalor = 0;
            select sum (NOCO_VALOR*(-1)) from NOMINA_CONCEPTOS N
                where (TERC_NIT = :nitempl and NOCO_APORTE = 'S' and
                (nomi_id = :id_nomina_1 or (nomi_id = :id_nomina_2) or (nomi_id = :id_nomina_3) or (nomi_id = :id_nomina_4) or (nomi_id = :id_nomina_5) or (nomi_id = :id_nomina_6) or (nomi_id = :id_nomina_7))
                AND noco_valor < 0 and (N.conc_cod = 908 or (N.conc_cod = 909)or (N.conc_cod = 935)))
                into :totdetvalorneg;
            if (totdetvalorneg is null) then
                totdetvalorneg = 0;
            totdetvalor = :totdetvalorneg + :totdetvalor;
            if ((:totdetvalor is not null) and (:totibc is not null) and totdetvalor <> 0) then
                begin
                insert into PAGO_APORTES_DETALLE (pgap_id, pgap_item, pade_itemdet, terc_nit, pade_ibc, pade_cotobl, pade_tipap)
                    values(:idaporte, :itemaportadmi, :itemdetaport, :nitempl, :totibc, :totdetvalor,'ARP');    itemdetaport = :itemdetaport + 1;
                totdetvalor = 0;
                end
            end
        end
    if (totadmin IS NOT NULL) then
        itemaportadmi = :itemaportadmi + 1;
    itemdetaport = 1;
    END
  SUSPEND;
  end
UPDATE NOMINA SET nomi_aporok = 'S' WHERE
    (nomi_id = :id_nomina_1 or (nomi_id = :id_nomina_2) or (nomi_id = :id_nomina_3) or (nomi_id = :id_nomina_4) or (nomi_id = :id_nomina_5) or (nomi_id = :id_nomina_6) or (nomi_id = :id_nomina_7));
end
^

SET TERM ; ^

/* 20101004 */
/* HORAS EXTRAS DE PRODUCCION NO ESTABAN INCLUIDAS EN EL CALCULO DE HORAS EXTRAS, POR TANTO SE CALCULABAN COMO UN CONCEPTO NORMAL */
SET TERM ^ ;

CREATE OR ALTER procedure CAUSA_NOMINA (
    FEC date,
    PERIODO integer,
    PERIODICIDAD integer,
    PAGOGLOBAL char(1),
    ANO char(4),
    DEPTO integer)
returns (
    IDNOMINA integer,
    ITEMINI integer)
AS
declare variable item integer;
declare variable nite varchar(20);
declare variable nit_tercero varchar(20);
declare variable concept integer;
declare variable montos numeric(18,2);
declare variable porcen numeric(9,4);
declare variable entidad varchar(20);
declare variable conc_cod integer;
declare variable conc_deduc char(1);
declare variable conc_porc numeric(9,4);
declare variable conc_entidad integer;
declare variable conc_monto numeric(18,2);
declare variable conc_modifi char(1);
declare variable conc_promedio char(1);
declare variable valor numeric(18,2);
declare variable diaslab integer;
declare variable conc_prov char(1);
declare variable conc_aporte char(1);
declare variable numeroprom integer;
declare variable conc_aplicaprom char(1);
declare variable perinicial integer;
declare variable perfinal integer;
declare variable anoini integer;
declare variable anofin integer;
declare variable conc_dias char(1);
declare variable conc_otroconc char(1);
declare variable conc_codotroconc integer;
declare variable anosum integer;
declare variable salario char(1);
declare variable liquidaper integer;
declare variable basico numeric(18,2);
declare variable niteps varchar(20);
declare variable nitafc varchar(20);
declare variable nitafp varchar(20);
declare variable nitccf varchar(20);
declare variable gtoempr char(1);
declare variable comision numeric(18,2);
declare variable cambsaltrans numeric(18,2);
declare variable saldosini numeric(18,2);
declare variable duranov integer;
declare variable base numeric(18,2);
declare variable aprox integer;
declare variable mensual char(1);
declare variable horasex numeric(18,2);
declare variable diasnov integer;
declare variable tomasal integer;
declare variable retroact numeric(18,2);
declare variable reembolso numeric(18,2);
declare variable incap numeric(18,2);
declare variable auxtrans numeric(18,2);
declare variable smlv numeric(18,2);
declare variable beneficios numeric(18,2);
declare variable confirmado char(1);
declare variable recnoct numeric(18,2);
declare variable recfest numeric(18,2);
declare variable tar_recnotc numeric(9,4);
declare variable tar_recfest numeric(9,4);
declare variable recargo numeric(18,2);
declare variable basicorec numeric(18,2);
declare variable parambenef char(2);
declare variable vacacdisf numeric(18,2);
declare variable valorpredet numeric(18,2);
declare variable basicoemp numeric(18,2);
declare variable salinteg char(1);
declare variable tar_salinteg numeric(9,4);
begin
execute procedure LEE_CONFIGURACION('NOMINA','LIQUIDACION','TOMAR BENEFICIOS PARA CALCULAR PROVISIONES')returning_values(:PARAMBENEF);
execute procedure LEE_CONFIGURACION('NOMINA','GENERAL','REDONDEO AL MULTIPLO DE DIEZ EN TOTALES')returning_values(:APROX);
select N.NOMI_ID, N.NOMI_LIQOK from NOMINA N where N.NOMI_PERIODO = :PERIODO and N.NOMI_PERIODOCIDAD = :PERIODICIDAD
    and N.NOMI_ANO = :ANO into :IDNOMINA, :CONFIRMADO;
if (:IDNOMINA is null) then
    begin
    execute procedure CAMBIE_ID_NOMINA returning_values(:IDNOMINA);
    insert into NOMINA (NOMI_ID, NOMI_FECCAUSA, NOMI_PAGOGLOBAL, NOMI_PERIODOCIDAD, NOMI_PERIODO, NOMI_ANO, NOMI_LIQOK)
    values (:IDNOMINA, :FEC,:PAGOGLOBAL, :PERIODICIDAD, :PERIODO, :ANO, 'N');
    ITEM = 1;
    end
else
    begin
    select max(N.NOCO_ITEM) from NOMINA_CONCEPTOS N where N.NOMI_ID = :IDNOMINA
    into :ITEM;
    end
if ((CONFIRMADO = 'S') and (IDNOMINA is not null)) then
    begin
    IDNOMINA = 0;
    end
else
    begin
    insert into NOMINA_DEPARTAMENTO (NOMI_ID, NODP_DEPTO)values(:IDNOMINA,:DEPTO);
    select P.PAAN_RECNOC, P.PAAN_RECFEST, P.paan_salinteg from PARAMETROS_ANO P where P.PAAN_ANO = :ANO
        into :TAR_RECNOTC, :TAR_RECFEST, TAR_SALINTEG;
    ITEMINI = ITEM;
    for select E.TERC_NIT, E.EMPL_EPS, E.EMPL_AFC, E.EMPL_AFP, E.EMPL_CCF, E.empl_salinteg
        from EMPLEADOS E
        where E.EMPL_PPAGO = :PERIODICIDAD and ((E.EMPL_FECRET is null) or (E.EMPL_FECRET > :FEC)) and E.EMPL_FECING <= :FEC
        and ((:DEPTO = 0) or (e.empl_dpto = :DEPTO))
        into :NITE, :NITEPS, :NITAFC, :NITAFP, :NITCCF, :SALINTEG
        do
        begin
        select first 1 M.MVSE_SALARIO from MOVIMIENTO_SALARIO_EMPLEADO M where M.TERC_NIT = :NITE and M.MVSE_FECHA <= :FEC order by M.MVSE_FECHA desc into :BASICOEMP;
        BASICO = BASICOEMP;
        RECNOCT = null;
        RECFEST = null;
        select N.NOEX_RECNOCT, N.NOEX_RECFEST
            from NOMINA_HORASEXT N where N.NOEX_PERIODIO = :PERIODO and N.NOEX_ANO = :ANO and N.TERC_NIT = :NITE
            into :RECNOCT, :RECFEST;
        if (RECNOCT is null) then
            RECNOCT = 0;
        if (RECFEST is null) then
            RECFEST = 0;
        for select CE.TERC_NIT, CE.CONC_COD, CE.EMCO_MONTO, CE.EMCO_PORC, CE.EMPL_ENTIDAD, CE.EMCO_PERPROM, CE.EMCO_LUQUIDAPER, CE.EMCO_MENSUAL, CN.CONC_COD, CN.CONC_DEDUC,CN.CONC_PORC, CN.CONC_ENTIDAD, CN.CONC_MONTO,  CN.CONC_DIAS, CN.CONC_MODIFI,
            CN.CONC_PROMEDIO, CN.CONC_SALARIO, CN.CONC_PROV, CN.CONC_APORTE, CN.CONC_APLICAPROM, CN.CONC_OTROCONC, CN.CONC_CODOTROCONC, CN.CONC_GTOEMPR, CN.CONC_BASE, CE.EMCO_TOMSAL
            from EMPLEADO_CONCEPTOS CE, CONCEPTOS_NOMINA CN where (CE.CONC_COD = CN.CONC_COD) and (CE.TERC_NIT = :NITE) and
            ( ((CE.EMCO_FECINI <= :FEC and CE.EMCO_FECFIN >= :FEC)) or
            ((CN.CONC_TODOSPER = 'N') and (CE.EMCO_PPAGO = :PERIODO)) or ((CN.CONC_TODOSPER = 'S') AND (((:periodicidad = 1) AND (:PERIODO < 13)) or ((:periodicidad = 2) AND (:PERIODO < 25)))) )  order by (TERC_NIT )
            into :NIT_TERCERO, :CONCEPT,  :MONTOS, :PORCEN, :ENTIDAD, :NUMEROPROM, :LIQUIDAPER, :MENSUAL ,:CONC_COD, :CONC_DEDUC, :CONC_PORC,
            :CONC_ENTIDAD, :CONC_MONTO, :CONC_DIAS, :CONC_MODIFI,:CONC_PROMEDIO, :SALARIO,:CONC_PROV, :CONC_APORTE , :CONC_APLICAPROM, :CONC_OTROCONC, :CONC_CODOTROCONC, :GTOEMPR, :BASE, :TOMASAL
            do
            begin
            if (MENSUAL = 'S') then
                BEGIN
                if (PERIODICIDAD = 1) then
                    BEGIN
                    perinicial = PERIODO;
                    PERFINAL = PERIODO;
                    END
                if (PERIODICIDAD = 2) then
                    BEGIN
                    perinicial = PERIODO - (LIQUIDAPER - 1);
                    PERFINAL = PERIODO + (2 - LIQUIDAPER);
                    END
                if (PERIODICIDAD = 3) then
                    BEGIN
                    perinicial = PERIODO - (LIQUIDAPER - 1);
                    PERFINAL = PERIODO + (4 - LIQUIDAPER);
                    END
                END
            ELSE
                BEGIN
                perinicial = PERIODO;
                PERFINAL = PERIODO;
                END
                            
            if (CONC_DIAS = 'S') then
                execute procedure DIAS_LABORADOS (:NITE, :PERIODO, :FEC, :MENSUAL,:CONC_APORTE) returning_values (:DIASLAB);
            else
                BEGIN
                SELECT PPAG_DIAS FROM PERIODO_PAGO WHERE PPAG_COD = :periodicidad INTO :diaslab;
                END
            if (:TOMASAL <> 0) then
                begin
                /* SI EL CONCEPTO NOAPLICA EN ESTE PERIODO DEJE EL BASICO EN CERO */
                if ((:PERIODICIDAD = 2) and (:TOMASAL <> 2)) then
                    begin
                    if ((PERIODO = 2) or (PERIODO = 4) or (PERIODO = 6) or (PERIODO = 8) or (PERIODO = 10) or (PERIODO = 12)
                        or (PERIODO = 14) or (PERIODO = 16) or (PERIODO = 18) or (PERIODO = 20) or (PERIODO = 22) or (PERIODO = 24)) then
                        BASICO = 0;
                    end
                else
                    if ((:PERIODICIDAD = 3) and (:TOMASAL <> 1)) then
                        begin
                        if ((PERIODO = 1) or (PERIODO = 5) or (PERIODO = 9) or (PERIODO = 13) or (PERIODO = 17) or (PERIODO = 21)
                            or (PERIODO = 25) or (PERIODO = 29) or (PERIODO = 33) or (PERIODO = 37) or (PERIODO = 41) or (PERIODO = 45)
                            or (PERIODO = 49)) then
                            BASICO = 0;
                        end
                    else
                        if ((:PERIODICIDAD = 3) and (:TOMASAL <> 2)) then
                            begin
                            if ((PERIODO = 2) or (PERIODO = 6) or (PERIODO = 10) or (PERIODO = 14) or (PERIODO = 18) or (PERIODO = 22)
                                or (PERIODO = 26) or (PERIODO = 30) or (PERIODO = 34) or (PERIODO = 38) or (PERIODO = 42) or (PERIODO = 46)
                                or (PERIODO = 50)) then
                                BASICO = 0;
                            end
                        else
                            if ((:PERIODICIDAD = 3) and (:TOMASAL <> 3)) then
                                begin
                                if ((PERIODO = 3) or (PERIODO = 7) or (PERIODO = 11) or (PERIODO = 15) or (PERIODO = 19) or (PERIODO = 23)
                                    or (PERIODO = 27) or (PERIODO = 31) or (PERIODO = 35) or (PERIODO = 39) or (PERIODO = 43) or (PERIODO = 47)
                                    or (PERIODO = 51)) then
                                    BASICO = 0;
                                end
                            else
                                if ((:PERIODICIDAD = 3) and (:TOMASAL <> 4)) then
                                begin
                                if ((PERIODO = 4) or (PERIODO = 8) or (PERIODO = 12) or (PERIODO = 16) or (PERIODO = 20) or (PERIODO = 24)
                                    or (PERIODO = 29) or (PERIODO = 32) or (PERIODO = 36) or (PERIODO = 40) or (PERIODO = 44) or (PERIODO = 48)
                                    or (PERIODO = 52)) then
                                    BASICO = 0;
                                end
                end
            else
                begin
                /* SE CALCULA SOBRE TODOS LOS PERIODOS */
                BASICO = BASICOEMP;
                end
            VALORPREDET = null;
            select VP.NVPR_MONTO from NOMINA_VALOR_PREDET VP where VP.NVPR_PERIODICIDAD = :PERIODICIDAD and VP.NVPR_PERIODO = :PERIODO and VP.NVPR_ANO = :ANO and VP.CONC_COD = :CONC_COD and VP.TERC_NIT = :NITE
                into :VALORPREDET;
            if ((:VALORPREDET <> 0) and (VALORPREDET is not null)) then
                VALOR = VALORPREDET;
            else
                begin
                /* SI HAY UN CAMBIO TRANSITORIO DE SALARIO AJUSTE LOS DIAS Y CALCULE EL VALOR A SUMAR */
                select SUM((N.NONO_VALOR /30) * ND.NNDE_DURACION), SUM(ND.NNDE_DURACION) from NOMINA_NOVEDADES N, nomina_novedades_detalle ND
                    where N.nono_id = ND.nono_id AND N.TNOV_COD = 11 and N.TERC_NIT = :NITE and ND.NNDE_PERIODO = :PERIODO
                    into :CAMBSALTRANS, :DURANOV;
                if (CAMBSALTRANS is null) then
                    CAMBSALTRANS = 0;
                if (DURANOV is null) then
                    DURANOV = 0;
                DIASLAB = :DIASLAB - :DURANOV;
                /* SI ES UN PRESTAMO, TRAIGA LA CUOTA */
                if (CONC_COD = 922) then
                    begin
                    select sum(P.PRCU_MONTO) from PRESTAMO_CUOTAS P, PRESTAMO_NOMINA PN
                        where P.PRCU_ANO = :ANO and P.PRCU_PERIODO = :PERIODO and PN.PRNO_ID = P.PRNO_ID and PN.TERC_NIT = :NITE into :VALOR;
                    if (VALOR is null) then
                        VALOR = 0;
                    ITEM = :ITEM + 1;
                    /* MARQUE LA CUOTA COMO PAGADA */
                    update PRESTAMO_CUOTAS  P set PRCU_OK = 'S' where P.PRCU_ANO = :ANO and P.PRCU_PERIODO = :PERIODO
                        and exists (select PRNO_ID from PRESTAMO_NOMINA where TERC_NIT = :NITE and PRNO_ID = P.prno_id);
                    end
                else
                    if ((:MONTOS = 0) or (:MONTOS is null)) then
                        begin
                        /* SI EL CONCEPTO DEL EMPLEADO NO TIENE MONTO TRAIGA EL DE CONCEPTOS_NOMINA */
                        if ((CONC_PORC = 0 and :PORCEN = 0) or (CONC_PORC is null and :PORCEN = 0) or (CONC_PORC = 0 and :PORCEN is null) or (CONC_PORC is null and :PORCEN is null) ) then
                            begin
                            /* SIN PORCENTAJE */
                            if ((CONC_MONTO <> 0) and (CONC_MONTO is not null) ) then
                                begin
                                VALOR = :CONC_MONTO;
                                if (:CONC_DIAS = 'S') then
                                    VALOR = (:VALOR / 30) * :DIASLAB;
                                end
                            else
                                if (SALARIO = 'S' and CONC_COD <> 900 and CONC_COD <> 931 and CONC_COD <> 945 and CONC_COD <> 920 and CONC_COD <> 932 and CONC_COD <> 953) then
                                    begin
                                    /* SI ES SALARIO SUME LAS EXTRAS */
                                    BASICO = BASICOEMP;
                                    BASICO = ((:BASICO/30)*:DIASLAB);/* - (((:BASICO/30)/8)*:RECNOCT);/* PFP:DEBERIA SER + Y POR LA TARIFA QUE NO VEO POR NINGUN LADO
                                    BASICO = :BASICO - (((:BASICO/30)/8)*:RECFEST);*/
                                    CONC_MONTO = :BASICO;
                                    VALOR = (:CONC_MONTO/*/30 * :diaslab*/ ) + :CAMBSALTRANS;
                                    end
                                else
                                    begin
                                    VALOR = MONTOS;
                                    if (:CONC_DIAS = 'S') then
                                        VALOR = (:VALOR / 30) * :DIASLAB;
                                    end
                            end
                        else    
                            begin
                            if (:PORCEN <> 0) then
                                begin
                                /* SI TIENE PORCENTAJE EN EMPLEADO_CONCEPTOS PERO EL MONTO SE TRAE DE CONCPETOS_NOMINA */
                                if ((CONC_MONTO <> 0) and (CONC_MONTO is not null) ) then
                                    begin
                                    VALOR = ((:CONC_MONTO ) * :PORCEN) /100;
                                    end
                                end
                            else
                                begin
                                /* NO TIENE PORCENTAJE EN EMPLEADO_CONCEPTOS SE TRAE MONTO Y PORC DE CONCPETOS_NOMINA */
                                if ((CONC_MONTO <> 0) and (CONC_MONTO is not null) ) then
                                    begin
                                    VALOR = ((:CONC_MONTO) * :CONC_PORC) /100;
                                    end
                                else
                                    if (SALARIO = 'S' and CONC_COD <> 900 and CONC_COD <> 931 and CONC_COD <> 945 and CONC_COD <> 920 and CONC_COD <> 932 and CONC_COD <> 953) then
                                        begin
                                        BASICO = BASICOEMP;
                                        BASICO = ((:BASICO/30)*:DIASLAB); /* - (((:BASICO/30)/8)*:RECNOCT);
                                        BASICO = :BASICO - (((:BASICO/30)/8)*:RECFEST);*/
                                        CONC_MONTO = :BASICO;
                                        VALOR = ((:CONC_MONTO)+ :CAMBSALTRANS * :CONC_PORC) /100;
                                        end
                                    else
                                        if (:CONC_MONTO = 0 and :MONTOS = 0) then
                                            begin
                                            CONC_MONTO = :BASICO;
                                            VALOR = (((:CONC_MONTO / 30) * :DIASLAB) + :CAMBSALTRANS * :CONC_PORC) /100;
                                            end
                                end
                            end
                        end
                    else
                        /* SI TIENE MONTO EN EMPLEADO_CONCEPTOS */
                        if ((CONC_PORC = 0 or (CONC_PORC is null)) and (:PORCEN = 0 or (PORCEN is null))) then
                            begin
                            VALOR = (:MONTOS);
                            if (:CONC_DIAS = 'S') then
                                VALOR = (:VALOR / 30) * :DIASLAB;   
                            end
                        else
                            if (:PORCEN <> 0 and PORCEN is not null) then
                                begin
                                VALOR = ((:MONTOS ) * :PORCEN) /100;
                                end
                            else
                                begin
                                VALOR = ((:MONTOS) * :CONC_PORC) /100;
                                end
                if (CONC_PROMEDIO = 'S') then
                    begin
                    /* CALCULO DEL PROMEDIO BASE DESDE LA FECHA MENOS EL NUMERO DE PERIODOS */
                    EXECUTE PROCEDURE periodo_nom_fecha (:fec, :periodicidad) returning_values (:perfinal, :anofin);
                    if (perfinal < numeroprom) then
                        BEGIN
                        anoini = anofin - 1;
                        if (periodicidad = 1) then
                            perinicial = 12 - (numeroprom - perfinal) + 1;
                        if (periodicidad = 2) then
                            perinicial = 24 - (numeroprom - perfinal) + 1;
                        if (periodicidad = 3) then
                            perinicial = 52 - (numeroprom - perfinal) + 1;
                        END
                    ELSE
                        BEGIN
                        PERINICIAL = :perfinal - :NUMEROPROM + 1;
                        anoini = ANOFIN;
                        END
                    if (anoini <> anofin) then
                        select sum (NOCO_VALOR) from NOMINA_CONCEPTOS N where N.NOCO_APLICAPROM = 'S' and
                            ((N.NOCO_PERIODO >= :PERINICIAL and N.NOCO_ANO = :anoini) or
                            (N.NOCO_PERIODO <= :perfinal and N.NOCO_ANO = :anofin)) and TERC_NIT = :NITE into :VALOR;
                    else
                        select sum (NOCO_VALOR) from NOMINA_CONCEPTOS N where N.NOCO_APLICAPROM = 'S' and
                            N.NOCO_PERIODO >= :PERINICIAL and N.NOCO_ANO = :anoini
                            and N.NOCO_PERIODO <= :perfinal and TERC_NIT = :NITE into :VALOR;
                    /* sume el saldo inicial */
                    SALDOSINI = 0;
                    select NOCO_VALOR from NOMINA_CONCEPTOS where CONC_COD = :CONC_COD and TERC_NIT  = :NITE and NOCO_PAGOOK = 'N' and NOCO_PERIODO = 0 into :SALDOSINI;
                    if (SALDOSINI is null) then
                        SALDOSINI = 0;
                    else
                        update NOMINA_CONCEPTOS N set NOCO_PAGOOK = 'S' where N.NOCO_APLICAPROM = 'S' and
                            CONC_COD = :CONC_COD and TERC_NIT = :NITE and NOCO_PERIODO = 0;

                    VALOR = :VALOR + :SALDOSINI;
                    /* APLIQUE LA PROPORCION Y EL PORCENTAJE */
                    VALOR = VALOR / NUMEROPROM;
                    VALOR = VALOR * PORCEN / 100;
                    end
                else if (CONC_OTROCONC = 'S') then
                    begin
                    ANOSUM = cast(ANO as integer);
                    ANOSUM = ANOSUM - 1;
                    select sum (NOCO_VALOR) from NOMINA_CONCEPTOS N where N.NOCO_ANO = :ANOSUM and N.CONC_COD = :CONC_CODOTROCONC and N.TERC_NIT = :NITE into :VALOR;
                    select NOCO_VALOR from NOMINA_CONCEPTOS where NOCO_ANO = :ANOSUM and CONC_COD = :CONC_CODOTROCONC and TERC_NIT = :NITE and NOCO_PERIODO = 0 into :SALDOSINI;
                    if (SALDOSINI is null) then
                        SALDOSINI = 0;
                    else
                        update NOMINA_CONCEPTOS set NOCO_PAGOOK = 'S' where NOCO_ANO = :ANOSUM and CONC_COD = :CONC_CODOTROCONC and NOCO_PERIODO = 0 and TERC_NIT = :NITE;
                    VALOR = :VALOR + :SALDOSINI;
                    update NOMINA_CONCEPTOS set NOCO_PAGOOK = 'S' where NOCO_ANO = :ANOSUM and CONC_COD = :CONC_CODOTROCONC and TERC_NIT = :NITE;
                    end
                else if (CONC_APORTE = 'S') then
                    begin
                    HORASEX = null;
                    DIASNOV = null;
                    RETROACT = null;
                    REEMBOLSO = null;
                    BENEFICIOS = null;
                    RECARGO = null;
                    COMISION = null;
                    INCAP = null;
                    VACACDISF = null;
                    if ((:ENTIDAD = '' ) or (ENTIDAD is null)) then
                        begin
                        /*COMISIONES*/
                        if (MENSUAL = 'S') then
                            BEGIN
                            if (PERIODICIDAD = 1) then
                                BEGIN
                                perinicial = PERIODO;
                                PERFINAL = PERIODO;
                                END
                            if (PERIODICIDAD = 2) then
                                BEGIN
                                perinicial = PERIODO - (LIQUIDAPER - 1);
                                PERFINAL = PERIODO + (2 - LIQUIDAPER);
                                END
                            if (PERIODICIDAD = 3) then
                                BEGIN
                                perinicial = PERIODO - (LIQUIDAPER - 1);
                                PERFINAL = PERIODO + (4 - LIQUIDAPER);
                                END
                            END
                        ELSE
                            BEGIN
                            perinicial = PERIODO;
                            PERFINAL = PERIODO;
                            END
                            
                        /* SUME LAS COMISIONES DE LOS DEMAS PERIODOS DEL MES */
                        select SUM(C.NCOM_MONTO) from NOMINA_COMISIONES C where C.NCOM_ANO = :ANO
                            and C.NCOM_PERIODO >= :PERINICIAL AND C.NCOM_PERIODO <= :PERFINAL
                            and C.NCOM_PERIODICIDAD = :PERIODICIDAD and C.TERC_NIT = :NITE
                            into :COMISION;
                        if (COMISION is null) then
                            COMISION = 0;
                        /*RETROACTIVO*/
                        select C.EMCO_MONTO from EMPLEADO_CONCEPTOS C where C.TERC_NIT = :NITE
                            and C.CONC_COD = 933 into :RETROACT;
                            if (RETROACT is null ) then
                                RETROACT = 0;
                        /*REEMBOLSO*/
                        select C.EMCO_MONTO from EMPLEADO_CONCEPTOS C where C.TERC_NIT = :NITE
                            and C.CONC_COD = 952 into :REEMBOLSO;
                        if (REEMBOLSO is null ) then
                            REEMBOLSO = 0;
                        /*VACACIONES DISFRUTADAS ANTERIORMENTE*/
                        select C.EMCO_MONTO from EMPLEADO_CONCEPTOS C where C.TERC_NIT = :NITE
                            and C.CONC_COD = 955 into :VACACDISF;
                        if (VACACDISF is null ) then
                            VACACDISF = 0;
                        /* INCAPACIDAD NO DEBE LIQUIDARSE YA QUE EL BASICO EN EL CASO DE APORTES LO INCLUYE *
                        select SUM(ND.NNDE_DURACION) from NOMINA_NOVEDADES N, nomina_novedades_detalle ND
                            where N.nono_id = ND.nono_id AND N.TERC_NIT = :NITE
                            and ND.NNDE_PERIODO >= :perinicial and ND.NNDE_PERIODO <= :perfinal and ND.NNDE_ANO = :ANO
                            and (N.TNOV_COD = 2 or (N.TNOV_COD = 3))
                            into :DIASNOV;
                        if (:DIASNOV is null) then
                            INCAP = 0;
                        else
                            INCAP = (:BASICO / 30)* :DIASNOV; */
                        INCAP = 0;
                        /*BASICO*/
                        if (SALINTEG = 'S') then
                            BASICO = BASICO * (tar_salinteg / 100);

                        if (MENSUAL <> 'S') then
                            BASICO = ((:BASICO/30)*:DIASLAB);
                        /*HORAS EXTRA*/
                        select SUM(C.NOEX_MONTO) from NOMINA_HORASEXT C where C.NOEX_ANO = :ANO
                            and C.NOEX_PERIODIO >= :PERINICIAL and C.NOEX_PERIODIO <= :PERFINAL
                            and C.NOEX_PERIODICIDAD = :PERIODICIDAD and C.TERC_NIT = :NITE
                            into :HORASEX;
                        if (HORASEX is null) then
                            HORASEX = 0;
                        /*RECARGOS*/
                        BASICOREC = BASICOEMP;
                        RECARGO = (((:BASICOREC/30)/8)*:TAR_RECNOTC)*:RECNOCT;
                        RECARGO = :RECARGO + ((((:BASICOREC/30)/8)*:TAR_RECFEST)*:RECFEST);
                        if (RECARGO is null) then
                            RECARGO = 0;
                        /*basico*/
                        if (MENSUAL <> 'S') then
                            begin
                            if (:BASICO + :COMISION + :HORASEX + :RETROACT+ :REEMBOLSO + :INCAP+ :CAMBSALTRANS < ((:SMLV/30)*:DIASLAB)) then
                                BASICO = (:SMLV/30)*:DIASLAB;
                            end
                        else
                            begin
                            if (:BASICO + :COMISION + :HORASEX + :RETROACT+ :REEMBOLSO + :INCAP+ :CAMBSALTRANS < :SMLV) then
                                BASICO = :SMLV;
                            end
                        /* SMLV Y AUX. TRANSPORTE*/
                        select P.PAAN_AUXTR, P.PAAN_SALMINIMO from PARAMETROS_ANO P
                            where P.PAAN_ANO = :ANO into :AUXTRANS, :SMLV;
                        /*BASE*/
                        VALOR = :BASICO + :COMISION + :HORASEX + :RETROACT+ :REEMBOLSO + :INCAP + :RECARGO + :CAMBSALTRANS + :VACACDISF;

                        if (CONC_COD = 904) then
                            begin
                            ENTIDAD = :NITAFP;
                            select A.PAAN_AFPTR from PARAMETROS_ANO A where A.PAAN_ANO = :ANO into :PORCEN;
                            VALOR = ((:VALOR) * :PORCEN) /100;
                            end
                        else if ((CONC_COD = 905) or (CONC_COD = 906) or (CONC_COD = 934) ) then
                            begin
                            ENTIDAD = :NITAFP;
                            select A.PAAN_AFPEM from PARAMETROS_ANO A where A.PAAN_ANO = :ANO into :PORCEN;
                            VALOR = ((:VALOR) * :PORCEN) /100;
                            end
                        else if ((CONC_COD = 907) or (CONC_COD = 914) or (CONC_COD = 915) or (conc_cod = 938)) then
                            begin
                            ENTIDAD = :NITEPS;
                            if (CONC_COD = 907) then
                                begin
                                select A.PAAN_EPSTR from PARAMETROS_ANO A where A.PAAN_ANO = :ANO into :PORCEN;
                                VALOR = ((:VALOR) * :PORCEN) /100;
                                end
                            else
                                begin
                                select A.PAAN_EPSEM from PARAMETROS_ANO A where A.PAAN_ANO = :ANO into :PORCEN;
                                    VALOR = ((:VALOR) * :PORCEN) /100;
                                end
                            end
                        else if ((CONC_COD = 910) or (CONC_COD = 911) or (CONC_COD = 936)) then
                            begin
                            /*ccf */
                            ENTIDAD = :NITCCF;
                            select A.PAAN_CCF from PARAMETROS_ANO A where A.PAAN_ANO = :ANO into :PORCEN;
                            VALOR = ((:VALOR) * :PORCEN) /100;
                            end
                        else if ((CONC_COD = 916) or (CONC_COD = 917) or (CONC_COD = 939) ) then
                            begin
                            /*icbf */
                            ENTIDAD = :NITCCF;
                            select A.PAAN_ICBF from PARAMETROS_ANO A where A.PAAN_ANO = :ANO into :PORCEN;
                            VALOR = ((:VALOR) * :PORCEN) /100;
                            end
                        else if ((CONC_COD = 918) or (CONC_COD = 919) or (CONC_COD = 940) ) then
                            begin
                            /*sena */
                            ENTIDAD = :NITCCF;
                            select A.PAAN_SENA from PARAMETROS_ANO A where A.PAAN_ANO = :ANO into :PORCEN;
                            VALOR = ((:VALOR) * :PORCEN) /100;
                            end
                        else if ((CONC_COD = 912) or (CONC_COD = 913) or (CONC_COD = 937)) then
                            begin
                            /* CESANTIAS */
                            ENTIDAD = :NITAFC;
                            if (PARAMBENEF = 'SI') then
                                begin
                                select sum(CE.EMCO_MONTO)
                                    from EMPLEADO_CONCEPTOS CE, CONCEPTOS_NOMINA CN where CN.CONC_BENEFIC = 'S' and (CE.TERC_NIT = :NITE) and (CE.CONC_COD = CN.CONC_COD) and
                                    ((CE.EMCO_FECINI <= :FEC and CE.EMCO_FECFIN >= :FEC) or ((CN.CONC_TODOSPER = 'N') and (CE.EMCO_PPAGO = :PERIODO)) or
                                    (CN.CONC_TODOSPER = 'S'))
                                    into :BENEFICIOS;
                                if (BENEFICIOS is null) then
                                    BENEFICIOS = 0;
                                end
                            else
                                BENEFICIOS = 0;
                            select P.PAAN_AUXTR, P.PAAN_SALMINIMO from PARAMETROS_ANO P
                                where P.PAAN_ANO = :ANO into :AUXTRANS, :SMLV;
                            if (:BASICO < (:SMLV*2)) then
                                AUXTRANS = (:AUXTRANS / 30) * :DIASLAB;
                            else
                                AUXTRANS = 0;
                            select A.PAAN_CESEMP from PARAMETROS_ANO A where A.PAAN_ANO = :ANO
                                into :PORCEN;
                            VALOR = ((:VALOR + :AUXTRANS + :BENEFICIOS) * :PORCEN) /100;
                            end
                        else
                            begin
                            if (COMISION is null) then
                                COMISION = 0;
                            select C.NCOM_MONTO from NOMINA_COMISIONES C where C.NCOM_ANO = :ANO and C.NCOM_PERIODO = :PERIODO and C.NCOM_PERIODICIDAD = :PERIODICIDAD and C.TERC_NIT = :NITE
                                into :COMISION;
                            CONC_MONTO = :BASICO + :COMISION;
                            if (CONC_PORC <> 0 and CONC_PORC is not null) then
                                if (mensual <> 'S') then
                                    VALOR = (((:CONC_MONTO/30 * :DIASLAB )+ :CAMBSALTRANS + :INCAP) * :CONC_PORC) /100;
                                else
                                    VALOR = ((:CONC_MONTO+ :CAMBSALTRANS + :INCAP) * :CONC_PORC) /100;
                            else
                                if (:PORCEN <> 0 and :PORCEN is not null) then
                                    if (mensual <> 'S') then
                                        VALOR = (((:CONC_MONTO/30 * :DIASLAB )+ :CAMBSALTRANS + :INCAP) * :PORCEN) /100;
                                    else
                                        VALOR = ((:CONC_MONTO + :CAMBSALTRANS + :INCAP) * :PORCEN) /100;
                                else
                                    if (:MONTOS <> 0 and :MONTOS is not null) then
                                        VALOR = :MONTOS;
                                    else
                                        if (:CONC_MONTO <> 0 and :CONC_MONTO is not null) then
                                            VALOR = :CONC_MONTO;
                            end
                        ITEM = :ITEM + 1;
                        end
                    end /* aportes */
                else if (CONC_PROV = 'S') then
                    begin
                    /*provisiones */
                    HORASEX = null;
                    DIASNOV = null;
                    RETROACT = null;
                    REEMBOLSO = null;
                    BENEFICIOS = null;
                    RECARGO = null;
                    COMISION = null;
                    INCAP = null;
                    if (MENSUAL = 'S') then
                        BEGIN
                        if (PERIODICIDAD = 1) then
                            BEGIN
                            perinicial = PERIODO;
                            PERFINAL = PERIODO;
                            END
                        if (PERIODICIDAD = 2) then
                            BEGIN
                            perinicial = PERIODO - (LIQUIDAPER - 1);
                            PERFINAL = PERIODO + (2 - LIQUIDAPER);
                            END
                        if (PERIODICIDAD = 3) then
                            BEGIN
                            perinicial = PERIODO - (LIQUIDAPER - 1);
                            PERFINAL = PERIODO + (4 - LIQUIDAPER);
                            END
                        END
                    ELSE
                        BEGIN
                        perinicial = PERIODO;
                        PERFINAL = PERIODO;
                        END
                    /*HORAS EXTRA*/
                    select SUM(C.NOEX_MONTO) from NOMINA_HORASEXT C where C.NOEX_ANO = :ANO
                        and C.NOEX_PERIODIO >= :PERINICIAL and C.NOEX_PERIODIO <= :PERFINAL
                        and C.NOEX_PERIODICIDAD = :PERIODICIDAD and C.TERC_NIT = :NITE
                        into :HORASEX;
                    if (HORASEX is null) then
                        HORASEX = 0;
                    /* RECARGO*/
                    BASICO = BASICOEMP;
                    RECARGO = (((:BASICO/30)/8)*:TAR_RECNOTC)*:RECNOCT;
                    RECARGO = :RECARGO + ((((:BASICO/30)/8)*:TAR_RECFEST)*:RECFEST);
                    /*INCAPACIDAD*/
                    select SUM(ND.NNDE_DURACION) from NOMINA_NOVEDADES N, nomina_novedades_detalle ND
                        where N.nono_id = ND.nono_id AND N.TERC_NIT = :NITE
                        and ND.NNDE_PERIODO >= :perinicial and ND.NNDE_PERIODO <= :perfinal and ND.NNDE_ANO = :ANO
                        and ((N.TNOV_COD = 2) or (N.TNOV_COD = 3) or (N.TNOV_COD = 4)) into :DIASNOV;
                    if (:DIASNOV is null) then
                        INCAP = 0;
                    else
                        INCAP = (:BASICO / 30)* :DIASNOV;
                    /* BASICO*/
                    if (mensual <> 'S') then
                        BASICO = ((:BASICO/30)*:DIASLAB);
                    if (SALINTEG = 'S') then
                        BASICO = BASICO * (tar_salinteg / 100);
                    /*BENEFICIOS*/
                    if (PARAMBENEF = 'SI') then
                        begin
                        select sum(CE.EMCO_MONTO)
                            from EMPLEADO_CONCEPTOS CE, CONCEPTOS_NOMINA CN where CN.CONC_BENEFIC = 'S'
                            and (CE.TERC_NIT = :NITE) and (CE.CONC_COD = CN.CONC_COD) and
                            ((CE.EMCO_FECINI <= :FEC and CE.EMCO_FECFIN >= :FEC) or ((CN.CONC_TODOSPER = 'N')
                            and (CE.EMCO_PPAGO = :PERIODO)) or (CN.CONC_TODOSPER = 'S'))
                            into :BENEFICIOS;
                        if (BENEFICIOS is null) then
                            BENEFICIOS = 0;
                        end
                    else
                        BENEFICIOS = 0;
                    if ((CONC_COD <> 929) and (CONC_COD <> 930) and (CONC_COD <> 944)) then
                        begin
                        /* si no es vacaciones */
                        select P.PAAN_AUXTR, P.PAAN_SALMINIMO from PARAMETROS_ANO P where P.PAAN_ANO = :ANO
                            into :AUXTRANS, :SMLV;
                        if (:BASICO < (:SMLV*2)) then
                            begin
                            if (mensual <> 'S') then
                                AUXTRANS = (:AUXTRANS / 30) * :DIASLAB;
                            end
                        else
                            AUXTRANS = 0;
                        end
                    else
                        AUXTRANS = 0;
                    CONC_MONTO = :BASICO;
                    if (CONC_PORC <> 0 and CONC_PORC is not null) then
                        VALOR = ((:CONC_MONTO + :CAMBSALTRANS + :INCAP + :RECARGO + :HORASEX + :AUXTRANS + :BENEFICIOS) * :CONC_PORC) /100;
                    else
                        if (PORCEN <> 0 and PORCEN is not null) then
                            VALOR = ((:CONC_MONTO + :CAMBSALTRANS + :INCAP + :RECARGO + :HORASEX + :AUXTRANS + :BENEFICIOS) * :PORCEN) /100;
                        else
                            if (MONTOS <> 0 and MONTOS is not null) then
                                VALOR = :MONTOS;
                            else
                                if (CONC_MONTO <> 0 and CONC_MONTO is not null) then
                                    VALOR = :CONC_MONTO;
                    ITEM = :ITEM + 1;
                    end /* provision */
                else if (CONC_COD = 920) then /* comisiones */
                    begin
                    select C.NCOM_MONTO from NOMINA_COMISIONES C where C.NCOM_ANO = :ANO
                    and C.NCOM_PERIODO >= :perinicial and C.NCOM_PERIODO <= :perfinal and C.NCOM_PERIODICIDAD = :PERIODICIDAD and C.TERC_NIT = :NITE into :VALOR;
                    if (VALOR is null) then
                        VALOR = 0;
                    ITEM = :ITEM + 1;
                    end
                else if ((CONC_COD = 900) or (:CONC_COD = 931) or (:CONC_COD = 945)) then /* horas extra */
                    begin
                    select SUM(C.NOEX_MONTO) from NOMINA_HORASEXT C where C.NOEX_ANO = :ANO and
                        C.NOEX_PERIODIO >= :perinicial and C.NOEX_PERIODIO <= :perfinal and C.NOEX_PERIODICIDAD = :PERIODICIDAD and C.TERC_NIT = :NITE into :VALOR;
                    if (VALOR is null) then
                        VALOR = 0;
                    ITEM = :ITEM + 1;
                    end
                else if (CONC_COD = 954) then /* cartera */
                    begin
                    select C.NCAR_MONTO from NOMINA_CARTERA C where C.NCAR_ANO = :ANO
                    and C.NCAR_PERIODO >= :perinicial and C.NCAR_PERIODO <= :perfinal and C.NCAR_PERIODICIDAD = :PERIODICIDAD and C.TERC_NIT = :NITE into :VALOR;
                    if (VALOR is null) then
                        VALOR = 0;
                    ITEM = :ITEM + 1;
                    end
                else if (CONC_COD = 932) then
                    begin
                    /* incapacidad */
                    select SUM(ND.NNDE_DURACION) from NOMINA_NOVEDADES N, nomina_novedades_detalle ND
                        where N.nono_id = ND.nono_id AND N.TERC_NIT = :NITE
                        and ND.NNDE_PERIODO >= :perinicial and ND.NNDE_PERIODO <= :perfinal and ND.NNDE_ANO = :ANO
                        and ((N.TNOV_COD = 2) or (N.TNOV_COD = 3) or (N.TNOV_COD = 4)) into :DIASNOV;
                    if (:DIASNOV is null) then
                        VALOR = 0;
                    else
                        VALOR = (:BASICO / 30)* :DIASNOV;
                    end
                else if (CONC_COD = 921) then
                    begin
                    if (PORCEN is not null and PORCEN <> 0) then
                        VALOR = ((BASICO / 30)* :DIASLAB ) * :PORCEN /100;
                    else
                        if (CONC_PORC is not null and CONC_PORC <> 0) then
                            VALOR = ((BASICO / 30)* :DIASLAB ) * :CONC_PORC /100;
                    end
                else if (CONC_COD = 953) then
                    begin
                    /* RECARGO */
                    BASICO = BASICOEMP;
                    VALOR = (((:BASICO/30)/8)*:TAR_RECNOTC)*:RECNOCT;
                    VALOR = :VALOR + ((((:BASICO/30)/8)*:TAR_RECFEST)*:RECFEST);
                    end
                if (CONC_APORTE = 'S') then
                    begin
                    if (ENTIDAD is null or (ENTIDAD = '') ) then
                        ENTIDAD = :CONC_ENTIDAD;
                    end
                end
            if ((VALOR <> 0) and (VALOR is not null)) then
                begin
                execute procedure REDONDEE(:VALOR, :APROX) returning_values (VALOR);
                if ((MENSUAL = 'N') or (PERIODICIDAD = 1))  then
                    insert into NOMINA_CONCEPTOS (NOMI_ID, NOCO_ITEM, CONC_COD,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, NOCO_GTOEMPR)
                        values (:IDNOMINA,:ITEM, :CONCEPT, :NIT_TERCERO, :VALOR, :ENTIDAD, :CONC_DEDUC, :CONC_PROV, :CONC_APORTE, :PERIODO, :ANO, :CONC_MODIFI, :CONC_APLICAPROM, :SALARIO, :GTOEMPR);
                else
                    if (MENSUAL = 'S') then
                        begin
                        if ((:PERIODICIDAD = 2) and (LIQUIDAPER = 1)) then
                            begin
                            if ((PERIODO = 1) or (PERIODO = 3) or (PERIODO = 5) or (PERIODO = 7) or (PERIODO = 9) or (PERIODO = 11)
                                or (PERIODO = 13) or (PERIODO = 15) or (PERIODO = 17) or (PERIODO = 19) or (PERIODO = 21) or (PERIODO = 23)) then
                                insert into NOMINA_CONCEPTOS (NOMI_ID, NOCO_ITEM, CONC_COD,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, NOCO_GTOEMPR)
                                    values (:IDNOMINA,:ITEM, :CONCEPT, :NIT_TERCERO, :VALOR, :ENTIDAD, :CONC_DEDUC, :CONC_PROV, :CONC_APORTE, :PERIODO, :ANO, :CONC_MODIFI, :CONC_APLICAPROM, :SALARIO, :GTOEMPR);
                            end
                        else if ((:PERIODICIDAD = 2) and (LIQUIDAPER = 2)) then
                            begin
                            if ((PERIODO = 2) or (PERIODO = 4) or (PERIODO = 6) or (PERIODO = 8) or (PERIODO = 10) or (PERIODO = 12)
                                or (PERIODO = 14) or (PERIODO = 16) or (PERIODO = 18) or (PERIODO = 20) or (PERIODO = 22) or (PERIODO = 24)) then
                                insert into NOMINA_CONCEPTOS (NOMI_ID, NOCO_ITEM, CONC_COD,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, NOCO_GTOEMPR)
                                    values (:IDNOMINA,:ITEM, :CONCEPT, :NIT_TERCERO, :VALOR, :ENTIDAD, :CONC_DEDUC, :CONC_PROV, :CONC_APORTE, :PERIODO, :ANO, :CONC_MODIFI, :CONC_APLICAPROM, :SALARIO, :GTOEMPR);
                            end
                        else if ((:PERIODICIDAD = 3) and (LIQUIDAPER = 1)) then
                            begin
                            if ((PERIODO = 1) or (PERIODO = 5) or (PERIODO = 9) or (PERIODO = 13) or (PERIODO = 17) or (PERIODO = 21)
                                or (PERIODO = 25) or (PERIODO = 29) or (PERIODO = 33) or (PERIODO = 37) or (PERIODO = 41) or (PERIODO = 45)
                                or (PERIODO = 49)) then
                                insert into NOMINA_CONCEPTOS (NOMI_ID, NOCO_ITEM, CONC_COD,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, NOCO_GTOEMPR)
                                    values (:IDNOMINA,:ITEM, :CONCEPT, :NIT_TERCERO, :VALOR, :ENTIDAD, :CONC_DEDUC, :CONC_PROV, :CONC_APORTE, :PERIODO, :ANO, :CONC_MODIFI, :CONC_APLICAPROM, :SALARIO, :GTOEMPR);
                            end
                        else if ((:PERIODICIDAD = 3) and (LIQUIDAPER = 2)) then
                            begin
                            if ((PERIODO = 2) or (PERIODO = 6) or (PERIODO = 10) or (PERIODO = 14) or (PERIODO = 18) or (PERIODO = 22)
                                or (PERIODO = 26) or (PERIODO = 30) or (PERIODO = 34) or (PERIODO = 38) or (PERIODO = 42) or (PERIODO = 46)
                                or (PERIODO = 50)) then
                                insert into NOMINA_CONCEPTOS (NOMI_ID, NOCO_ITEM, CONC_COD,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, NOCO_GTOEMPR)
                                    values (:IDNOMINA,:ITEM, :CONCEPT, :NIT_TERCERO, :VALOR, :ENTIDAD, :CONC_DEDUC, :CONC_PROV, :CONC_APORTE, :PERIODO, :ANO, :CONC_MODIFI, :CONC_APLICAPROM, :SALARIO, :GTOEMPR);
                            end
                        else if ((:PERIODICIDAD = 3) and (LIQUIDAPER = 3)) then
                            begin
                            if ((PERIODO = 3) or (PERIODO = 7) or (PERIODO = 11) or (PERIODO = 15) or (PERIODO = 19) or (PERIODO = 23)
                                or (PERIODO = 27) or (PERIODO = 31) or (PERIODO = 35) or (PERIODO = 39) or (PERIODO = 43) or (PERIODO = 47)
                                or (PERIODO = 51)) then
                                insert into NOMINA_CONCEPTOS (NOMI_ID, NOCO_ITEM, CONC_COD,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, NOCO_GTOEMPR)
                                    values (:IDNOMINA,:ITEM, :CONCEPT, :NIT_TERCERO, :VALOR, :ENTIDAD, :CONC_DEDUC, :CONC_PROV, :CONC_APORTE, :PERIODO, :ANO, :CONC_MODIFI, :CONC_APLICAPROM, :SALARIO, :GTOEMPR);
                            end
                        else if ((:PERIODICIDAD = 3) and (LIQUIDAPER = 4)) then
                            begin
                            if ((PERIODO = 4) or (PERIODO = 8) or (PERIODO = 12) or (PERIODO = 16) or (PERIODO = 20) or (PERIODO = 24)
                                or (PERIODO = 29) or (PERIODO = 32) or (PERIODO = 36) or (PERIODO = 40) or (PERIODO = 44) or (PERIODO = 48)
                                or (PERIODO = 52)) then
                                insert into NOMINA_CONCEPTOS (NOMI_ID, NOCO_ITEM, CONC_COD,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, NOCO_GTOEMPR)
                                    values (:IDNOMINA,:ITEM, :CONCEPT, :NIT_TERCERO, :VALOR, :ENTIDAD, :CONC_DEDUC, :CONC_PROV, :CONC_APORTE, :PERIODO, :ANO, :CONC_MODIFI, :CONC_APLICAPROM, :SALARIO, :GTOEMPR);
                            end
                        end
                    VALOR = 0;
                    BASICO = 0;
                    end
            end /* for */
        end
    end
suspend;
end
^

SET TERM ; ^

/* 2010/10/14 */
/* CALCULO DE DIAS LABORADOS EN EL PRIMER PERIODO DE TRABJAO DEPDNDIA DE LA FECHA DE QUE LIQUIDACION FUERA DEL MISMO MES */

SET TERM ^ ;

CREATE OR ALTER procedure DIAS_LABORADOS (
    NITEMPL varchar(20),
    PERIODO integer,
    FEC date,
    MENSUAL char(1),
    APORTE char(1))
returns (
    TOTALDIASLAB integer)
AS
declare variable diasnolab integer;
declare variable diaslabxper integer;
declare variable perpago integer;
declare variable fecing date;
declare variable existe char(1);
BEGIN
SELECT E.empl_ppago, E.empl_fecing
FROM EMPLEADOS E WHERE TERC_NIT = :nitempl
INTO :perpago, :fecing;
IF (mensual = 'N') THEN
    BEGIN
    IF (perpago = 1) THEN
        diaslabxper = 30;
    ELSE
        IF (perpago = 2) THEN
            diaslabxper = 15;
        ELSE
            IF (perpago = 3) THEN
                diaslabxper = 7;
    END
ELSE
    diaslabxper = 30;
/* AJUSTE LOS DIAS EN EL PERIODO INICIAL DE TRABAJO */
if ((fec - fecing) < diaslabxper) then
    diaslabxper = (fec - fecing);

IF (mensual = 'S') THEN
    BEGIN
    SELECT MAX('S') FROM nomina_novedades N, nomina_novedades_detalle ND
        WHERE N.nono_id = ND.nono_id AND N.TERC_NIT = :nitempl AND (N.TNOV_COD = 9 or (N.tnov_cod = 2) or (N.tnov_cod = 3))
        AND ((ND.nnde_periodo = :periodo) or (ND.nnde_periodo = :periodo - 1)) AND ND.nnde_ano = substr(:fec,1,4)
        INTO :existe;
    IF ((aporte = 'N' ) OR (:existe = 'S'))  THEN
        BEGIN
        SELECT SUM (ND.nnde_duracion)
            FROM nomina_novedades N,  nomina_novedades_detalle ND WHERE N.nono_id = ND.nono_id AND
            TERC_NIT = :nitempl AND (N.TNOV_COD = 9 OR (N.TNOV_COD = 6) OR (N.TNOV_COD = 2) OR (N.TNOV_COD =3) OR (N.TNOV_COD = 4)  )
            AND ((ND.nnde_periodo = :periodo) or (ND.nnde_periodo = :periodo - 1)) AND ND.nnde_ano  = substr(:FEC,1,4)
            INTO :diasnolab;
        if (diasnolab IS NULL) then
            diasnolab = 0;
        if (diaslabxper >= diasnolab) then
            diaslabxper =  :diaslabxper - :diasnolab;
        ELSE
            diaslabxper = 0;
        END
    if (diaslabxper IS NOT NULL) then
        totaldiaslab =  :diaslabxper;
    ELSE
        totaldiaslab = 0;
    SUSPEND;
    END
ELSE
    BEGIN
    SELECT MAX('S') FROM nomina_novedades N, nomina_novedades_detalle ND
        WHERE N.nono_id = ND.nono_id AND N.TERC_NIT = :nitempl AND (N.TNOV_COD = 9 or (N.tnov_cod = 2) or (N.tnov_cod = 3) or (N.tnov_cod = 6))
        AND ND.nnde_periodo = :periodo AND ND.nnde_ano  = substr(:FEC,1,4)
        INTO :existe;
    IF ((aporte = 'N' ) OR (:existe = 'S'))  THEN
        BEGIN
        SELECT SUM (ND.nnde_duracion)
            FROM nomina_novedades N, nomina_novedades_detalle nd
            WHERE N.nono_id = ND.nono_id AND N.TERC_NIT = :nitempl AND (TNOV_COD = 9 OR (TNOV_COD = 6) OR (TNOV_COD = 2) OR (TNOV_COD =3) OR (TNOV_COD = 4)  )
            AND ND.nnde_periodo = :periodo AND ND.nnde_ano  = substr(:FEC,1,4)
            INTO :diasnolab;
        if (diasnolab IS NULL) then
            diasnolab = 0;
        if (diaslabxper >= diasnolab) then
            diaslabxper =  :diaslabxper - :diasnolab;
        ELSE
            diaslabxper = 0;
        END
    if (diaslabxper IS NOT NULL) then
        totaldiaslab =  :diaslabxper;
    ELSE
        totaldiaslab = 0;
    SUSPEND;
    END
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE CAUSA_NOMINA(
    FEC DATE,
    PERIODO INTEGER,
    PERIODICIDAD INTEGER,
    PAGOGLOBAL CHAR(1),
    ANO CHAR(4),
    DEPTO INTEGER)
RETURNS (
    IDNOMINA INTEGER,
    ITEMINI INTEGER)
AS
declare variable item integer;
declare variable nite varchar(20);
declare variable nit_tercero varchar(20);
declare variable concept integer;
declare variable montos numeric(18,2);
declare variable porcen numeric(9,4);
declare variable entidad varchar(20);
declare variable conc_cod integer;
declare variable conc_deduc char(1);
declare variable conc_porc numeric(9,4);
declare variable conc_entidad integer;
declare variable conc_monto numeric(18,2);
declare variable conc_modifi char(1);
declare variable conc_promedio char(1);
declare variable valor numeric(18,2);
declare variable diaslab integer;
declare variable conc_prov char(1);
declare variable conc_aporte char(1);
declare variable numeroprom integer;
declare variable conc_aplicaprom char(1);
declare variable perinicial integer;
declare variable perfinal integer;
declare variable anoini integer;
declare variable anofin integer;
declare variable conc_dias char(1);
declare variable conc_otroconc char(1);
declare variable conc_codotroconc integer;
declare variable anosum integer;
declare variable salario char(1);
declare variable liquidaper integer;
declare variable basico numeric(18,2);
declare variable niteps varchar(20);
declare variable nitafc varchar(20);
declare variable nitafp varchar(20);
declare variable nitccf varchar(20);
declare variable gtoempr char(1);
declare variable comision numeric(18,2);
declare variable cambsaltrans numeric(18,2);
declare variable saldosini numeric(18,2);
declare variable duranov integer;
declare variable base numeric(18,2);
declare variable aprox integer;
declare variable mensual char(1);
declare variable horasex numeric(18,2);
declare variable diasnov integer;
declare variable tomasal integer;
declare variable retroact numeric(18,2);
declare variable reembolso numeric(18,2);
declare variable incap numeric(18,2);
declare variable auxtrans numeric(18,2);
declare variable smlv numeric(18,2);
declare variable beneficios numeric(18,2);
declare variable confirmado char(1);
declare variable recnoct numeric(18,2);
declare variable recfest numeric(18,2);
declare variable tar_recnotc numeric(9,4);
declare variable tar_recfest numeric(9,4);
declare variable recargo numeric(18,2);
declare variable basicorec numeric(18,2);
declare variable parambenef char(2);
declare variable vacacdisf numeric(18,2);
declare variable valorpredet numeric(18,2);
declare variable basicoemp numeric(18,2);
declare variable salinteg char(1);
declare variable tar_salinteg numeric(9,4);
begin
execute procedure LEE_CONFIGURACION('NOMINA','LIQUIDACION','TOMAR BENEFICIOS PARA CALCULAR PROVISIONES')returning_values(:PARAMBENEF);
execute procedure LEE_CONFIGURACION('NOMINA','GENERAL','REDONDEO AL MULTIPLO DE DIEZ EN TOTALES')returning_values(:APROX);
select N.NOMI_ID, N.NOMI_LIQOK from NOMINA N where N.NOMI_PERIODO = :PERIODO and N.NOMI_PERIODOCIDAD = :PERIODICIDAD
    and N.NOMI_ANO = :ANO into :IDNOMINA, :CONFIRMADO;
if (:IDNOMINA is null) then
    begin
    execute procedure CAMBIE_ID_NOMINA returning_values(:IDNOMINA);
    insert into NOMINA (NOMI_ID, NOMI_FECCAUSA, NOMI_PAGOGLOBAL, NOMI_PERIODOCIDAD, NOMI_PERIODO, NOMI_ANO, NOMI_LIQOK)
    values (:IDNOMINA, :FEC,:PAGOGLOBAL, :PERIODICIDAD, :PERIODO, :ANO, 'N');
    ITEM = 1;
    end
else
    begin
    select max(N.NOCO_ITEM) from NOMINA_CONCEPTOS N where N.NOMI_ID = :IDNOMINA
    into :ITEM;
    end
if ((CONFIRMADO = 'S') and (IDNOMINA is not null)) then
    begin
    IDNOMINA = 0;
    end
else
    begin
    insert into NOMINA_DEPARTAMENTO (NOMI_ID, NODP_DEPTO)values(:IDNOMINA,:DEPTO);
    select P.PAAN_RECNOC, P.PAAN_RECFEST, P.paan_salinteg from PARAMETROS_ANO P where P.PAAN_ANO = :ANO
        into :TAR_RECNOTC, :TAR_RECFEST, TAR_SALINTEG;
    ITEMINI = ITEM;
    for select E.TERC_NIT, E.EMPL_EPS, E.EMPL_AFC, E.EMPL_AFP, E.EMPL_CCF, E.empl_salinteg
        from EMPLEADOS E
        where E.EMPL_PPAGO = :PERIODICIDAD and ((E.EMPL_FECRET is null) or (E.EMPL_FECRET > :FEC)) and E.EMPL_FECING <= :FEC
        and ((:DEPTO = 0) or (e.empl_dpto = :DEPTO))
        into :NITE, :NITEPS, :NITAFC, :NITAFP, :NITCCF, :SALINTEG
        do
        begin
        select first 1 M.MVSE_SALARIO from MOVIMIENTO_SALARIO_EMPLEADO M where M.TERC_NIT = :NITE and M.MVSE_FECHA <= :FEC order by M.MVSE_FECHA desc into :BASICOEMP;
        BASICO = BASICOEMP;
        RECNOCT = null;
        RECFEST = null;
        select N.NOEX_RECNOCT, N.NOEX_RECFEST
            from NOMINA_HORASEXT N where N.NOEX_PERIODIO = :PERIODO and N.NOEX_ANO = :ANO and N.TERC_NIT = :NITE
            into :RECNOCT, :RECFEST;
        if (RECNOCT is null) then
            RECNOCT = 0;
        if (RECFEST is null) then
            RECFEST = 0;
        for select CE.TERC_NIT, CE.CONC_COD, CE.EMCO_MONTO, CE.EMCO_PORC, CE.EMPL_ENTIDAD, CE.EMCO_PERPROM, CE.EMCO_LUQUIDAPER, CE.EMCO_MENSUAL, CN.CONC_COD, CN.CONC_DEDUC,CN.CONC_PORC, CN.CONC_ENTIDAD, CN.CONC_MONTO,  CN.CONC_DIAS, CN.CONC_MODIFI,
            CN.CONC_PROMEDIO, CN.CONC_SALARIO, CN.CONC_PROV, CN.CONC_APORTE, CN.CONC_APLICAPROM, CN.CONC_OTROCONC, CN.CONC_CODOTROCONC, CN.CONC_GTOEMPR, CN.CONC_BASE, CE.EMCO_TOMSAL
            from EMPLEADO_CONCEPTOS CE, CONCEPTOS_NOMINA CN where (CE.CONC_COD = CN.CONC_COD) and (CE.TERC_NIT = :NITE) and
            ( ((CE.EMCO_FECINI <= :FEC and CE.EMCO_FECFIN >= :FEC)) or
            ((CN.CONC_TODOSPER = 'N') and (CE.EMCO_PPAGO = :PERIODO)) or ((CN.CONC_TODOSPER = 'S') AND (((:periodicidad = 1) AND (:PERIODO < 13)) or ((:periodicidad = 2) AND (:PERIODO < 25)))) )  order by (TERC_NIT )
            into :NIT_TERCERO, :CONCEPT,  :MONTOS, :PORCEN, :ENTIDAD, :NUMEROPROM, :LIQUIDAPER, :MENSUAL ,:CONC_COD, :CONC_DEDUC, :CONC_PORC,
            :CONC_ENTIDAD, :CONC_MONTO, :CONC_DIAS, :CONC_MODIFI,:CONC_PROMEDIO, :SALARIO,:CONC_PROV, :CONC_APORTE , :CONC_APLICAPROM, :CONC_OTROCONC, :CONC_CODOTROCONC, :GTOEMPR, :BASE, :TOMASAL
            do
            begin
            if (MENSUAL = 'S') then
                BEGIN
                if (PERIODICIDAD = 1) then
                    BEGIN
                    perinicial = PERIODO;
                    PERFINAL = PERIODO;
                    END
                if (PERIODICIDAD = 2) then
                    BEGIN
                    perinicial = PERIODO - (LIQUIDAPER - 1);
                    PERFINAL = PERIODO + (2 - LIQUIDAPER);
                    END
                if (PERIODICIDAD = 3) then
                    BEGIN
                    perinicial = PERIODO - (LIQUIDAPER - 1);
                    PERFINAL = PERIODO + (4 - LIQUIDAPER);
                    END
                END
            ELSE
                BEGIN
                perinicial = PERIODO;
                PERFINAL = PERIODO;
                END
                            
            if (CONC_DIAS = 'S') then
                execute procedure DIAS_LABORADOS (:NITE, :PERIODO, :FEC, :MENSUAL,:CONC_APORTE) returning_values (:DIASLAB);
            else
                BEGIN
                SELECT PPAG_DIAS FROM PERIODO_PAGO WHERE PPAG_COD = :periodicidad INTO :diaslab;
                END
            if (:TOMASAL <> 0) then
                begin
                /* SI EL CONCEPTO NOAPLICA EN ESTE PERIODO DEJE EL BASICO EN CERO */
                if ((:PERIODICIDAD = 2) and (:TOMASAL <> 2)) then
                    begin
                    if ((PERIODO = 2) or (PERIODO = 4) or (PERIODO = 6) or (PERIODO = 8) or (PERIODO = 10) or (PERIODO = 12)
                        or (PERIODO = 14) or (PERIODO = 16) or (PERIODO = 18) or (PERIODO = 20) or (PERIODO = 22) or (PERIODO = 24)) then
                        BASICO = 0;
                    end
                else
                    if ((:PERIODICIDAD = 3) and (:TOMASAL <> 1)) then
                        begin
                        if ((PERIODO = 1) or (PERIODO = 5) or (PERIODO = 9) or (PERIODO = 13) or (PERIODO = 17) or (PERIODO = 21)
                            or (PERIODO = 25) or (PERIODO = 29) or (PERIODO = 33) or (PERIODO = 37) or (PERIODO = 41) or (PERIODO = 45)
                            or (PERIODO = 49)) then
                            BASICO = 0;
                        end
                    else
                        if ((:PERIODICIDAD = 3) and (:TOMASAL <> 2)) then
                            begin
                            if ((PERIODO = 2) or (PERIODO = 6) or (PERIODO = 10) or (PERIODO = 14) or (PERIODO = 18) or (PERIODO = 22)
                                or (PERIODO = 26) or (PERIODO = 30) or (PERIODO = 34) or (PERIODO = 38) or (PERIODO = 42) or (PERIODO = 46)
                                or (PERIODO = 50)) then
                                BASICO = 0;
                            end
                        else
                            if ((:PERIODICIDAD = 3) and (:TOMASAL <> 3)) then
                                begin
                                if ((PERIODO = 3) or (PERIODO = 7) or (PERIODO = 11) or (PERIODO = 15) or (PERIODO = 19) or (PERIODO = 23)
                                    or (PERIODO = 27) or (PERIODO = 31) or (PERIODO = 35) or (PERIODO = 39) or (PERIODO = 43) or (PERIODO = 47)
                                    or (PERIODO = 51)) then
                                    BASICO = 0;
                                end
                            else
                                if ((:PERIODICIDAD = 3) and (:TOMASAL <> 4)) then
                                begin
                                if ((PERIODO = 4) or (PERIODO = 8) or (PERIODO = 12) or (PERIODO = 16) or (PERIODO = 20) or (PERIODO = 24)
                                    or (PERIODO = 29) or (PERIODO = 32) or (PERIODO = 36) or (PERIODO = 40) or (PERIODO = 44) or (PERIODO = 48)
                                    or (PERIODO = 52)) then
                                    BASICO = 0;
                                end
                end
            else
                begin
                /* SE CALCULA SOBRE TODOS LOS PERIODOS */
                BASICO = BASICOEMP;
                end
            VALORPREDET = null;
            select VP.NVPR_MONTO from NOMINA_VALOR_PREDET VP where VP.NVPR_PERIODICIDAD = :PERIODICIDAD and VP.NVPR_PERIODO = :PERIODO and VP.NVPR_ANO = :ANO and VP.CONC_COD = :CONC_COD and VP.TERC_NIT = :NITE
                into :VALORPREDET;
            if ((:VALORPREDET <> 0) and (VALORPREDET is not null)) then
                VALOR = VALORPREDET;
            else
                begin
                /* SI HAY UN CAMBIO TRANSITORIO DE SALARIO AJUSTE LOS DIAS Y CALCULE EL VALOR A SUMAR */
                select SUM((N.NONO_VALOR /30) * ND.NNDE_DURACION), SUM(ND.NNDE_DURACION) from NOMINA_NOVEDADES N, nomina_novedades_detalle ND
                    where N.nono_id = ND.nono_id AND N.TNOV_COD = 11 and N.TERC_NIT = :NITE and ND.NNDE_PERIODO = :PERIODO
                    into :CAMBSALTRANS, :DURANOV;
                if (CAMBSALTRANS is null) then
                    CAMBSALTRANS = 0;
                if (DURANOV is null) then
                    DURANOV = 0;
                DIASLAB = :DIASLAB - :DURANOV;
                /* SI ES UN PRESTAMO, TRAIGA LA CUOTA */
                if (CONC_COD = 922) then
                    begin
                    select sum(P.PRCU_MONTO) from PRESTAMO_CUOTAS P, PRESTAMO_NOMINA PN
                        where P.PRCU_ANO = :ANO and P.PRCU_PERIODO = :PERIODO and PN.PRNO_ID = P.PRNO_ID and PN.TERC_NIT = :NITE into :VALOR;
                    if (VALOR is null) then
                        VALOR = 0;
                    ITEM = :ITEM + 1;
                    /* MARQUE LA CUOTA COMO PAGADA */
                    update PRESTAMO_CUOTAS  P set PRCU_OK = 'S' where P.PRCU_ANO = :ANO and P.PRCU_PERIODO = :PERIODO
                        and exists (select PRNO_ID from PRESTAMO_NOMINA where TERC_NIT = :NITE and PRNO_ID = P.prno_id);
                    end
                else
                    if ((:MONTOS = 0) or (:MONTOS is null)) then
                        begin
                        /* SI EL CONCEPTO DEL EMPLEADO NO TIENE MONTO TRAIGA EL DE CONCEPTOS_NOMINA */
                        if ((CONC_PORC = 0 and :PORCEN = 0) or (CONC_PORC is null and :PORCEN = 0) or (CONC_PORC = 0 and :PORCEN is null) or (CONC_PORC is null and :PORCEN is null) ) then
                            begin
                            /* SIN PORCENTAJE */
                            if ((CONC_MONTO <> 0) and (CONC_MONTO is not null) ) then
                                begin
                                VALOR = :CONC_MONTO;
                                if (:CONC_DIAS = 'S') then
                                    VALOR = (:VALOR / 30) * :DIASLAB;
                                end
                            else
                                if (SALARIO = 'S' and CONC_COD <> 900 and CONC_COD <> 931 and CONC_COD <> 945 and CONC_COD <> 920 and CONC_COD <> 932 and CONC_COD <> 953) then
                                    begin
                                    /* SI ES SALARIO SUME LAS EXTRAS */
                                    BASICO = BASICOEMP;
                                    BASICO = ((:BASICO/30)*:DIASLAB);/* - (((:BASICO/30)/8)*:RECNOCT);/* PFP:DEBERIA SER + Y POR LA TARIFA QUE NO VEO POR NINGUN LADO
                                    BASICO = :BASICO - (((:BASICO/30)/8)*:RECFEST);*/
                                    CONC_MONTO = :BASICO;
                                    VALOR = (:CONC_MONTO/*/30 * :diaslab*/ ) + :CAMBSALTRANS;
                                    end
                                else
                                    begin
                                    VALOR = MONTOS;
                                    if (:CONC_DIAS = 'S') then
                                        VALOR = (:VALOR / 30) * :DIASLAB;
                                    end
                            end
                        else    
                            begin
                            if (:PORCEN <> 0) then
                                begin
                                /* SI TIENE PORCENTAJE EN EMPLEADO_CONCEPTOS PERO EL MONTO SE TRAE DE CONCPETOS_NOMINA */
                                if ((CONC_MONTO <> 0) and (CONC_MONTO is not null) ) then
                                    begin
                                    VALOR = ((:CONC_MONTO ) * :PORCEN) /100;
                                    end
                                end
                            else
                                begin
                                /* NO TIENE PORCENTAJE EN EMPLEADO_CONCEPTOS SE TRAE MONTO Y PORC DE CONCPETOS_NOMINA */
                                if ((CONC_MONTO <> 0) and (CONC_MONTO is not null) ) then
                                    begin
                                    VALOR = ((:CONC_MONTO) * :CONC_PORC) /100;
                                    end
                                else
                                    if (SALARIO = 'S' and CONC_COD <> 900 and CONC_COD <> 931 and CONC_COD <> 945 and CONC_COD <> 920 and CONC_COD <> 932 and CONC_COD <> 953) then
                                        begin
                                        BASICO = BASICOEMP;
                                        BASICO = ((:BASICO/30)*:DIASLAB); /* - (((:BASICO/30)/8)*:RECNOCT);
                                        BASICO = :BASICO - (((:BASICO/30)/8)*:RECFEST);*/
                                        CONC_MONTO = :BASICO;
                                        VALOR = ((:CONC_MONTO)+ :CAMBSALTRANS * :CONC_PORC) /100;
                                        end
                                    else
                                        if (:CONC_MONTO = 0 and :MONTOS = 0) then
                                            begin
                                            CONC_MONTO = :BASICO;
                                            VALOR = (((:CONC_MONTO / 30) * :DIASLAB) + :CAMBSALTRANS * :CONC_PORC) /100;
                                            end
                                end
                            end
                        end
                    else
                        /* SI TIENE MONTO EN EMPLEADO_CONCEPTOS */
                        if ((CONC_PORC = 0 or (CONC_PORC is null)) and (:PORCEN = 0 or (PORCEN is null))) then
                            begin
                            VALOR = (:MONTOS);
                            if (:CONC_DIAS = 'S') then
                                VALOR = (:VALOR / 30) * :DIASLAB;   
                            end
                        else
                            if (:PORCEN <> 0 and PORCEN is not null) then
                                begin
                                VALOR = ((:MONTOS ) * :PORCEN) /100;
                                end
                            else
                                begin
                                VALOR = ((:MONTOS) * :CONC_PORC) /100;
                                end
                if (CONC_PROMEDIO = 'S') then
                    begin
                    /* CALCULO DEL PROMEDIO BASE DESDE LA FECHA MENOS EL NUMERO DE PERIODOS */
                    EXECUTE PROCEDURE periodo_nom_fecha (:fec, :periodicidad) returning_values (:perfinal, :anofin);
                    if (perfinal < numeroprom) then
                        BEGIN
                        anoini = anofin - 1;
                        if (periodicidad = 1) then
                            perinicial = 12 - (numeroprom - perfinal) + 1;
                        if (periodicidad = 2) then
                            perinicial = 24 - (numeroprom - perfinal) + 1;
                        if (periodicidad = 3) then
                            perinicial = 52 - (numeroprom - perfinal) + 1;
                        END
                    ELSE
                        BEGIN
                        PERINICIAL = :perfinal - :NUMEROPROM + 1;
                        anoini = ANOFIN;
                        END
                    if (anoini <> anofin) then
                        select sum (NOCO_VALOR) from NOMINA_CONCEPTOS N where N.NOCO_APLICAPROM = 'S' and
                            ((N.NOCO_PERIODO >= :PERINICIAL and N.NOCO_ANO = :anoini) or
                            (N.NOCO_PERIODO <= :perfinal and N.NOCO_ANO = :anofin)) and TERC_NIT = :NITE into :VALOR;
                    else
                        select sum (NOCO_VALOR) from NOMINA_CONCEPTOS N where N.NOCO_APLICAPROM = 'S' and
                            N.NOCO_PERIODO >= :PERINICIAL and N.NOCO_ANO = :anoini
                            and N.NOCO_PERIODO <= :perfinal and TERC_NIT = :NITE into :VALOR;
                    /* sume el saldo inicial */
                    SALDOSINI = 0;
                    select NOCO_VALOR from NOMINA_CONCEPTOS where CONC_COD = :CONC_COD and TERC_NIT  = :NITE and NOCO_PAGOOK = 'N' and NOCO_PERIODO = 0 into :SALDOSINI;
                    if (SALDOSINI is null) then
                        SALDOSINI = 0;
                    else
                        update NOMINA_CONCEPTOS N set NOCO_PAGOOK = 'S' where N.NOCO_APLICAPROM = 'S' and
                            CONC_COD = :CONC_COD and TERC_NIT = :NITE and NOCO_PERIODO = 0;

                    VALOR = :VALOR + :SALDOSINI;
                    /* APLIQUE LA PROPORCION Y EL PORCENTAJE */
                    VALOR = VALOR / NUMEROPROM;
                    VALOR = VALOR * PORCEN / 100;
                    end
                else if (CONC_OTROCONC = 'S') then
                    begin
                    ANOSUM = cast(ANO as integer);
                    ANOSUM = ANOSUM - 1;
                    select sum (NOCO_VALOR) from NOMINA_CONCEPTOS N where N.NOCO_ANO = :ANOSUM and N.CONC_COD = :CONC_CODOTROCONC and N.TERC_NIT = :NITE into :VALOR;
                    select NOCO_VALOR from NOMINA_CONCEPTOS where NOCO_ANO = :ANOSUM and CONC_COD = :CONC_CODOTROCONC and TERC_NIT = :NITE and NOCO_PERIODO = 0 into :SALDOSINI;
                    if (SALDOSINI is null) then
                        SALDOSINI = 0;
                    else
                        update NOMINA_CONCEPTOS set NOCO_PAGOOK = 'S' where NOCO_ANO = :ANOSUM and CONC_COD = :CONC_CODOTROCONC and NOCO_PERIODO = 0 and TERC_NIT = :NITE;
                    VALOR = :VALOR + :SALDOSINI;
                    update NOMINA_CONCEPTOS set NOCO_PAGOOK = 'S' where NOCO_ANO = :ANOSUM and CONC_COD = :CONC_CODOTROCONC and TERC_NIT = :NITE;
                    end
                else if (CONC_APORTE = 'S') then
                    begin
                    HORASEX = null;
                    DIASNOV = null;
                    RETROACT = null;
                    REEMBOLSO = null;
                    BENEFICIOS = null;
                    RECARGO = null;
                    COMISION = null;
                    INCAP = null;
                    VACACDISF = null;
                    if ((:ENTIDAD = '' ) or (ENTIDAD is null)) then
                        begin
                        /*COMISIONES*/
                        if (MENSUAL = 'S') then
                            BEGIN
                            if (PERIODICIDAD = 1) then
                                BEGIN
                                perinicial = PERIODO;
                                PERFINAL = PERIODO;
                                END
                            if (PERIODICIDAD = 2) then
                                BEGIN
                                perinicial = PERIODO - (LIQUIDAPER - 1);
                                PERFINAL = PERIODO + (2 - LIQUIDAPER);
                                END
                            if (PERIODICIDAD = 3) then
                                BEGIN
                                perinicial = PERIODO - (LIQUIDAPER - 1);
                                PERFINAL = PERIODO + (4 - LIQUIDAPER);
                                END
                            END
                        ELSE
                            BEGIN
                            perinicial = PERIODO;
                            PERFINAL = PERIODO;
                            END
                            
                        /* SUME LAS COMISIONES DE LOS DEMAS PERIODOS DEL MES */
                        select SUM(C.NCOM_MONTO) from NOMINA_COMISIONES C where C.NCOM_ANO = :ANO
                            and C.NCOM_PERIODO >= :PERINICIAL AND C.NCOM_PERIODO <= :PERFINAL
                            and C.NCOM_PERIODICIDAD = :PERIODICIDAD and C.TERC_NIT = :NITE
                            into :COMISION;
                        if (COMISION is null) then
                            COMISION = 0;
                        /*RETROACTIVO*/
                        select C.EMCO_MONTO from EMPLEADO_CONCEPTOS C where C.TERC_NIT = :NITE
                            and C.CONC_COD = 933 into :RETROACT;
                            if (RETROACT is null ) then
                                RETROACT = 0;
                        /*REEMBOLSO*/
                        select C.EMCO_MONTO from EMPLEADO_CONCEPTOS C where C.TERC_NIT = :NITE
                            and C.CONC_COD = 952 into :REEMBOLSO;
                        if (REEMBOLSO is null ) then
                            REEMBOLSO = 0;
                        /*VACACIONES DISFRUTADAS ANTERIORMENTE*/
                        select C.EMCO_MONTO from EMPLEADO_CONCEPTOS C where C.TERC_NIT = :NITE
                            and C.CONC_COD = 955 into :VACACDISF;
                        if (VACACDISF is null ) then
                            VACACDISF = 0;
                        /* INCAPACIDAD NO DEBE LIQUIDARSE YA QUE EL BASICO EN EL CASO DE APORTES LO INCLUYE *
                        select SUM(ND.NNDE_DURACION) from NOMINA_NOVEDADES N, nomina_novedades_detalle ND
                            where N.nono_id = ND.nono_id AND N.TERC_NIT = :NITE
                            and ND.NNDE_PERIODO >= :perinicial and ND.NNDE_PERIODO <= :perfinal and ND.NNDE_ANO = :ANO
                            and (N.TNOV_COD = 2 or (N.TNOV_COD = 3))
                            into :DIASNOV;
                        if (:DIASNOV is null) then
                            INCAP = 0;
                        else
                            INCAP = (:BASICO / 30)* :DIASNOV; */
                        INCAP = 0;
                        /*BASICO*/
                        if (SALINTEG = 'S') then
                            BASICO = BASICO * (tar_salinteg / 100);

                        if (MENSUAL <> 'S') then
                            BASICO = ((:BASICO/30)*:DIASLAB);
                        /*HORAS EXTRA*/
                        select SUM(C.NOEX_MONTO) from NOMINA_HORASEXT C where C.NOEX_ANO = :ANO
                            and C.NOEX_PERIODIO >= :PERINICIAL and C.NOEX_PERIODIO <= :PERFINAL
                            and C.NOEX_PERIODICIDAD = :PERIODICIDAD and C.TERC_NIT = :NITE
                            into :HORASEX;
                        if (HORASEX is null) then
                            HORASEX = 0;
                        /*RECARGOS*/
                        BASICOREC = BASICOEMP;
                        RECARGO = (((:BASICOREC/30)/8)*:TAR_RECNOTC)*:RECNOCT;
                        RECARGO = :RECARGO + ((((:BASICOREC/30)/8)*:TAR_RECFEST)*:RECFEST);
                        if (RECARGO is null) then
                            RECARGO = 0;
                        /*basico*/
                        if (MENSUAL <> 'S') then
                            begin
                            if (:BASICO + :COMISION + :HORASEX + :RETROACT+ :REEMBOLSO + :INCAP+ :CAMBSALTRANS < ((:SMLV/30)*:DIASLAB)) then
                                BASICO = (:SMLV/30)*:DIASLAB;
                            end
                        else
                            begin
                            if (:BASICO + :COMISION + :HORASEX + :RETROACT+ :REEMBOLSO + :INCAP+ :CAMBSALTRANS < :SMLV) then
                                BASICO = :SMLV;
                            end
                        /* SMLV Y AUX. TRANSPORTE*/
                        select P.PAAN_AUXTR, P.PAAN_SALMINIMO from PARAMETROS_ANO P
                            where P.PAAN_ANO = :ANO into :AUXTRANS, :SMLV;
                        /*BASE*/
                        VALOR = :BASICO + :COMISION + :HORASEX + :RETROACT+ :REEMBOLSO + :INCAP + :RECARGO + :CAMBSALTRANS + :VACACDISF;

                        if (CONC_COD = 904) then
                            begin
                            ENTIDAD = :NITAFP;
                            select A.PAAN_AFPTR from PARAMETROS_ANO A where A.PAAN_ANO = :ANO into :PORCEN;
                            VALOR = ((:VALOR) * :PORCEN) /100;
                            end
                        else if ((CONC_COD = 905) or (CONC_COD = 906) or (CONC_COD = 934) ) then
                            begin
                            ENTIDAD = :NITAFP;
                            select A.PAAN_AFPEM from PARAMETROS_ANO A where A.PAAN_ANO = :ANO into :PORCEN;
                            VALOR = ((:VALOR) * :PORCEN) /100;
                            end
                        else if ((CONC_COD = 907) or (CONC_COD = 914) or (CONC_COD = 915) or (conc_cod = 938)) then
                            begin
                            ENTIDAD = :NITEPS;
                            if (CONC_COD = 907) then
                                begin
                                select A.PAAN_EPSTR from PARAMETROS_ANO A where A.PAAN_ANO = :ANO into :PORCEN;
                                VALOR = ((:VALOR) * :PORCEN) /100;
                                end
                            else
                                begin
                                select A.PAAN_EPSEM from PARAMETROS_ANO A where A.PAAN_ANO = :ANO into :PORCEN;
                                    VALOR = ((:VALOR) * :PORCEN) /100;
                                end
                            end
                        else if ((CONC_COD = 910) or (CONC_COD = 911) or (CONC_COD = 936)) then
                            begin
                            /*ccf */
                            ENTIDAD = :NITCCF;
                            select A.PAAN_CCF from PARAMETROS_ANO A where A.PAAN_ANO = :ANO into :PORCEN;
                            VALOR = ((:VALOR) * :PORCEN) /100;
                            end
                        else if ((CONC_COD = 916) or (CONC_COD = 917) or (CONC_COD = 939) ) then
                            begin
                            /*icbf */
                            ENTIDAD = :NITCCF;
                            select A.PAAN_ICBF from PARAMETROS_ANO A where A.PAAN_ANO = :ANO into :PORCEN;
                            VALOR = ((:VALOR) * :PORCEN) /100;
                            end
                        else if ((CONC_COD = 918) or (CONC_COD = 919) or (CONC_COD = 940) ) then
                            begin
                            /*sena */
                            ENTIDAD = :NITCCF;
                            select A.PAAN_SENA from PARAMETROS_ANO A where A.PAAN_ANO = :ANO into :PORCEN;
                            VALOR = ((:VALOR) * :PORCEN) /100;
                            end
                        else if ((CONC_COD = 912) or (CONC_COD = 913) or (CONC_COD = 937)) then
                            begin
                            /* CESANTIAS */
                            ENTIDAD = :NITAFC;
                            if (PARAMBENEF = 'SI') then
                                begin
                                select sum(CE.EMCO_MONTO)
                                    from EMPLEADO_CONCEPTOS CE, CONCEPTOS_NOMINA CN where CN.CONC_BENEFIC = 'S' and (CE.TERC_NIT = :NITE) and (CE.CONC_COD = CN.CONC_COD) and
                                    ((CE.EMCO_FECINI <= :FEC and CE.EMCO_FECFIN >= :FEC) or ((CN.CONC_TODOSPER = 'N') and (CE.EMCO_PPAGO = :PERIODO)) or
                                    (CN.CONC_TODOSPER = 'S'))
                                    into :BENEFICIOS;
                                if (BENEFICIOS is null) then
                                    BENEFICIOS = 0;
                                end
                            else
                                BENEFICIOS = 0;
                            select P.PAAN_AUXTR, P.PAAN_SALMINIMO from PARAMETROS_ANO P
                                where P.PAAN_ANO = :ANO into :AUXTRANS, :SMLV;
                            if (:BASICO < (:SMLV*2)) then
                                AUXTRANS = (:AUXTRANS / 30) * :DIASLAB;
                            else
                                AUXTRANS = 0;
                            select A.PAAN_CESEMP from PARAMETROS_ANO A where A.PAAN_ANO = :ANO
                                into :PORCEN;
                            VALOR = ((:VALOR + :AUXTRANS + :BENEFICIOS) * :PORCEN) /100;
                            end
                        else
                            begin
                            if (COMISION is null) then
                                COMISION = 0;
                            select C.NCOM_MONTO from NOMINA_COMISIONES C where C.NCOM_ANO = :ANO and C.NCOM_PERIODO = :PERIODO and C.NCOM_PERIODICIDAD = :PERIODICIDAD and C.TERC_NIT = :NITE
                                into :COMISION;
                            CONC_MONTO = :BASICO + :COMISION;
                            if (CONC_PORC <> 0 and CONC_PORC is not null) then
                                if (mensual <> 'S') then
                                    VALOR = (((:CONC_MONTO/30 * :DIASLAB )+ :CAMBSALTRANS + :INCAP) * :CONC_PORC) /100;
                                else
                                    VALOR = ((:CONC_MONTO+ :CAMBSALTRANS + :INCAP) * :CONC_PORC) /100;
                            else
                                if (:PORCEN <> 0 and :PORCEN is not null) then
                                    if (mensual <> 'S') then
                                        VALOR = (((:CONC_MONTO/30 * :DIASLAB )+ :CAMBSALTRANS + :INCAP) * :PORCEN) /100;
                                    else
                                        VALOR = ((:CONC_MONTO + :CAMBSALTRANS + :INCAP) * :PORCEN) /100;
                                else
                                    if (:MONTOS <> 0 and :MONTOS is not null) then
                                        VALOR = :MONTOS;
                                    else
                                        if (:CONC_MONTO <> 0 and :CONC_MONTO is not null) then
                                            VALOR = :CONC_MONTO;
                            end
                        ITEM = :ITEM + 1;
                        end
                    end /* aportes */
                else if (CONC_PROV = 'S') then
                    begin
                    /*provisiones */
                    HORASEX = null;
                    DIASNOV = null;
                    RETROACT = null;
                    REEMBOLSO = null;
                    BENEFICIOS = null;
                    RECARGO = null;
                    COMISION = null;
                    INCAP = null;
                    if (MENSUAL = 'S') then
                        BEGIN
                        if (PERIODICIDAD = 1) then
                            BEGIN
                            perinicial = PERIODO;
                            PERFINAL = PERIODO;
                            END
                        if (PERIODICIDAD = 2) then
                            BEGIN
                            perinicial = PERIODO - (LIQUIDAPER - 1);
                            PERFINAL = PERIODO + (2 - LIQUIDAPER);
                            END
                        if (PERIODICIDAD = 3) then
                            BEGIN
                            perinicial = PERIODO - (LIQUIDAPER - 1);
                            PERFINAL = PERIODO + (4 - LIQUIDAPER);
                            END
                        END
                    ELSE
                        BEGIN
                        perinicial = PERIODO;
                        PERFINAL = PERIODO;
                        END
                    /*HORAS EXTRA*/
                    select SUM(C.NOEX_MONTO) from NOMINA_HORASEXT C where C.NOEX_ANO = :ANO
                        and C.NOEX_PERIODIO >= :PERINICIAL and C.NOEX_PERIODIO <= :PERFINAL
                        and C.NOEX_PERIODICIDAD = :PERIODICIDAD and C.TERC_NIT = :NITE
                        into :HORASEX;
                    if (HORASEX is null) then
                        HORASEX = 0;
                    /* RECARGO*/
                    BASICO = BASICOEMP;
                    RECARGO = (((:BASICO/30)/8)*:TAR_RECNOTC)*:RECNOCT;
                    RECARGO = :RECARGO + ((((:BASICO/30)/8)*:TAR_RECFEST)*:RECFEST);
                    /*INCAPACIDAD*/
                    select SUM(ND.NNDE_DURACION) from NOMINA_NOVEDADES N, nomina_novedades_detalle ND
                        where N.nono_id = ND.nono_id AND N.TERC_NIT = :NITE
                        and ND.NNDE_PERIODO >= :perinicial and ND.NNDE_PERIODO <= :perfinal and ND.NNDE_ANO = :ANO
                        and ((N.TNOV_COD = 2) or (N.TNOV_COD = 3) or (N.TNOV_COD = 4)) into :DIASNOV;
                    if (:DIASNOV is null) then
                        INCAP = 0;
                    else
                        INCAP = (:BASICO / 30)* :DIASNOV;
                    /* BASICO*/
                    if (mensual <> 'S') then
                        BASICO = ((:BASICO/30)*:DIASLAB);
                    if (SALINTEG = 'S') then
                        BASICO = BASICO * (tar_salinteg / 100);
                    /*BENEFICIOS*/
                    if (PARAMBENEF = 'SI') then
                        begin
                        select sum(CE.EMCO_MONTO)
                            from EMPLEADO_CONCEPTOS CE, CONCEPTOS_NOMINA CN where CN.CONC_BENEFIC = 'S'
                            and (CE.TERC_NIT = :NITE) and (CE.CONC_COD = CN.CONC_COD) and
                            ((CE.EMCO_FECINI <= :FEC and CE.EMCO_FECFIN >= :FEC) or ((CN.CONC_TODOSPER = 'N')
                            and (CE.EMCO_PPAGO = :PERIODO)) or (CN.CONC_TODOSPER = 'S'))
                            into :BENEFICIOS;
                        if (BENEFICIOS is null) then
                            BENEFICIOS = 0;
                        end
                    else
                        BENEFICIOS = 0;
                    if ((CONC_COD <> 929) and (CONC_COD <> 930) and (CONC_COD <> 944)) then
                        begin
                        /* si no es vacaciones */
                        select P.PAAN_AUXTR, P.PAAN_SALMINIMO from PARAMETROS_ANO P where P.PAAN_ANO = :ANO
                            into :AUXTRANS, :SMLV;
                        if (:BASICO < (:SMLV*2)) then
                            begin
                            if (mensual <> 'S') then
                                AUXTRANS = (:AUXTRANS / 30) * :DIASLAB;
                            end
                        else
                            AUXTRANS = 0;
                        end
                    else
                        AUXTRANS = 0;
                    CONC_MONTO = :BASICO;
                    if (CONC_PORC <> 0 and CONC_PORC is not null) then
                        VALOR = ((:CONC_MONTO + :CAMBSALTRANS + :INCAP + :RECARGO + :HORASEX + :AUXTRANS + :BENEFICIOS) * :CONC_PORC) /100;
                    else
                        if (PORCEN <> 0 and PORCEN is not null) then
                            VALOR = ((:CONC_MONTO + :CAMBSALTRANS + :INCAP + :RECARGO + :HORASEX + :AUXTRANS + :BENEFICIOS) * :PORCEN) /100;
                        else
                            if (MONTOS <> 0 and MONTOS is not null) then
                                VALOR = :MONTOS;
                            else
                                if (CONC_MONTO <> 0 and CONC_MONTO is not null) then
                                    VALOR = :CONC_MONTO;
                    ITEM = :ITEM + 1;
                    end /* provision */
                else if (CONC_COD = 920) then /* comisiones */
                    begin
                    select C.NCOM_MONTO from NOMINA_COMISIONES C where C.NCOM_ANO = :ANO
                    and C.NCOM_PERIODO >= :perinicial and C.NCOM_PERIODO <= :perfinal and C.NCOM_PERIODICIDAD = :PERIODICIDAD and C.TERC_NIT = :NITE into :VALOR;
                    if (VALOR is null) then
                        VALOR = 0;
                    ITEM = :ITEM + 1;
                    end
                else if ((CONC_COD = 900) or (:CONC_COD = 931) or (:CONC_COD = 945)) then /* horas extra */
                    begin
                    select SUM(C.NOEX_MONTO) from NOMINA_HORASEXT C where C.NOEX_ANO = :ANO and
                        C.NOEX_PERIODIO >= :perinicial and C.NOEX_PERIODIO <= :perfinal and C.NOEX_PERIODICIDAD = :PERIODICIDAD and C.TERC_NIT = :NITE into :VALOR;
                    if (VALOR is null) then
                        VALOR = 0;
                    ITEM = :ITEM + 1;
                    end
                else if (CONC_COD = 954) then /* cartera */
                    begin
                    select C.NCAR_MONTO from NOMINA_CARTERA C where C.NCAR_ANO = :ANO
                    and C.NCAR_PERIODO >= :perinicial and C.NCAR_PERIODO <= :perfinal and C.NCAR_PERIODICIDAD = :PERIODICIDAD and C.TERC_NIT = :NITE into :VALOR;
                    if (VALOR is null) then
                        VALOR = 0;
                    ITEM = :ITEM + 1;
                    end
                else if (CONC_COD = 932) then
                    begin
                    /* incapacidad */
                    select SUM(ND.NNDE_DURACION) from NOMINA_NOVEDADES N, nomina_novedades_detalle ND
                        where N.nono_id = ND.nono_id AND N.TERC_NIT = :NITE
                        and ND.NNDE_PERIODO >= :perinicial and ND.NNDE_PERIODO <= :perfinal and ND.NNDE_ANO = :ANO
                        and ((N.TNOV_COD = 2) or (N.TNOV_COD = 3) or (N.TNOV_COD = 4)) into :DIASNOV;
                    if (:DIASNOV is null) then
                        VALOR = 0;
                    else
                        VALOR = (:BASICO / 30)* :DIASNOV;
                    end
                else if (CONC_COD = 921) then
                    begin
                    if (PORCEN is not null and PORCEN <> 0) then
                        VALOR = ((BASICO / 30)* :DIASLAB ) * :PORCEN /100;
                    else
                        if (CONC_PORC is not null and CONC_PORC <> 0) then
                            VALOR = ((BASICO / 30)* :DIASLAB ) * :CONC_PORC /100;
                    end
                else if (CONC_COD = 953) then
                    begin
                    /* RECARGO */
                    BASICO = BASICOEMP;
                    VALOR = (((:BASICO/30)/8)*:TAR_RECNOTC)*:RECNOCT;
                    VALOR = :VALOR + ((((:BASICO/30)/8)*:TAR_RECFEST)*:RECFEST);
                    end
                if (CONC_APORTE = 'S') then
                    begin
                    if (ENTIDAD is null or (ENTIDAD = '') ) then
                        ENTIDAD = :CONC_ENTIDAD;
                    end
                end
            if ((VALOR <> 0) and (VALOR is not null)) then
                begin
                execute procedure REDONDEE(:VALOR, :APROX) returning_values (VALOR);
                if ((MENSUAL = 'N') or (PERIODICIDAD = 1))  then
                    insert into NOMINA_CONCEPTOS (NOMI_ID, NOCO_ITEM, CONC_COD,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, NOCO_GTOEMPR)
                        values (:IDNOMINA,:ITEM, :CONCEPT, :NIT_TERCERO, :VALOR, :ENTIDAD, :CONC_DEDUC, :CONC_PROV, :CONC_APORTE, :PERIODO, :ANO, :CONC_MODIFI, :CONC_APLICAPROM, :SALARIO, :GTOEMPR);
                else
                    if (MENSUAL = 'S') then
                        begin
                        if ((:PERIODICIDAD = 2) and (LIQUIDAPER = 1)) then
                            begin
                            if ((PERIODO = 1) or (PERIODO = 3) or (PERIODO = 5) or (PERIODO = 7) or (PERIODO = 9) or (PERIODO = 11)
                                or (PERIODO = 13) or (PERIODO = 15) or (PERIODO = 17) or (PERIODO = 19) or (PERIODO = 21) or (PERIODO = 23)) then
                                insert into NOMINA_CONCEPTOS (NOMI_ID, NOCO_ITEM, CONC_COD,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, NOCO_GTOEMPR)
                                    values (:IDNOMINA,:ITEM, :CONCEPT, :NIT_TERCERO, :VALOR, :ENTIDAD, :CONC_DEDUC, :CONC_PROV, :CONC_APORTE, :PERIODO, :ANO, :CONC_MODIFI, :CONC_APLICAPROM, :SALARIO, :GTOEMPR);
                            end
                        else if ((:PERIODICIDAD = 2) and (LIQUIDAPER = 2)) then
                            begin
                            if ((PERIODO = 2) or (PERIODO = 4) or (PERIODO = 6) or (PERIODO = 8) or (PERIODO = 10) or (PERIODO = 12)
                                or (PERIODO = 14) or (PERIODO = 16) or (PERIODO = 18) or (PERIODO = 20) or (PERIODO = 22) or (PERIODO = 24)) then
                                insert into NOMINA_CONCEPTOS (NOMI_ID, NOCO_ITEM, CONC_COD,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, NOCO_GTOEMPR)
                                    values (:IDNOMINA,:ITEM, :CONCEPT, :NIT_TERCERO, :VALOR, :ENTIDAD, :CONC_DEDUC, :CONC_PROV, :CONC_APORTE, :PERIODO, :ANO, :CONC_MODIFI, :CONC_APLICAPROM, :SALARIO, :GTOEMPR);
                            end
                        else if ((:PERIODICIDAD = 3) and (LIQUIDAPER = 1)) then
                            begin
                            if ((PERIODO = 1) or (PERIODO = 5) or (PERIODO = 9) or (PERIODO = 13) or (PERIODO = 17) or (PERIODO = 21)
                                or (PERIODO = 25) or (PERIODO = 29) or (PERIODO = 33) or (PERIODO = 37) or (PERIODO = 41) or (PERIODO = 45)
                                or (PERIODO = 49)) then
                                insert into NOMINA_CONCEPTOS (NOMI_ID, NOCO_ITEM, CONC_COD,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, NOCO_GTOEMPR)
                                    values (:IDNOMINA,:ITEM, :CONCEPT, :NIT_TERCERO, :VALOR, :ENTIDAD, :CONC_DEDUC, :CONC_PROV, :CONC_APORTE, :PERIODO, :ANO, :CONC_MODIFI, :CONC_APLICAPROM, :SALARIO, :GTOEMPR);
                            end
                        else if ((:PERIODICIDAD = 3) and (LIQUIDAPER = 2)) then
                            begin
                            if ((PERIODO = 2) or (PERIODO = 6) or (PERIODO = 10) or (PERIODO = 14) or (PERIODO = 18) or (PERIODO = 22)
                                or (PERIODO = 26) or (PERIODO = 30) or (PERIODO = 34) or (PERIODO = 38) or (PERIODO = 42) or (PERIODO = 46)
                                or (PERIODO = 50)) then
                                insert into NOMINA_CONCEPTOS (NOMI_ID, NOCO_ITEM, CONC_COD,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, NOCO_GTOEMPR)
                                    values (:IDNOMINA,:ITEM, :CONCEPT, :NIT_TERCERO, :VALOR, :ENTIDAD, :CONC_DEDUC, :CONC_PROV, :CONC_APORTE, :PERIODO, :ANO, :CONC_MODIFI, :CONC_APLICAPROM, :SALARIO, :GTOEMPR);
                            end
                        else if ((:PERIODICIDAD = 3) and (LIQUIDAPER = 3)) then
                            begin
                            if ((PERIODO = 3) or (PERIODO = 7) or (PERIODO = 11) or (PERIODO = 15) or (PERIODO = 19) or (PERIODO = 23)
                                or (PERIODO = 27) or (PERIODO = 31) or (PERIODO = 35) or (PERIODO = 39) or (PERIODO = 43) or (PERIODO = 47)
                                or (PERIODO = 51)) then
                                insert into NOMINA_CONCEPTOS (NOMI_ID, NOCO_ITEM, CONC_COD,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, NOCO_GTOEMPR)
                                    values (:IDNOMINA,:ITEM, :CONCEPT, :NIT_TERCERO, :VALOR, :ENTIDAD, :CONC_DEDUC, :CONC_PROV, :CONC_APORTE, :PERIODO, :ANO, :CONC_MODIFI, :CONC_APLICAPROM, :SALARIO, :GTOEMPR);
                            end
                        else if ((:PERIODICIDAD = 3) and (LIQUIDAPER = 4)) then
                            begin
                            if ((PERIODO = 4) or (PERIODO = 8) or (PERIODO = 12) or (PERIODO = 16) or (PERIODO = 20) or (PERIODO = 24)
                                or (PERIODO = 29) or (PERIODO = 32) or (PERIODO = 36) or (PERIODO = 40) or (PERIODO = 44) or (PERIODO = 48)
                                or (PERIODO = 52)) then
                                insert into NOMINA_CONCEPTOS (NOMI_ID, NOCO_ITEM, CONC_COD,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, NOCO_GTOEMPR)
                                    values (:IDNOMINA,:ITEM, :CONCEPT, :NIT_TERCERO, :VALOR, :ENTIDAD, :CONC_DEDUC, :CONC_PROV, :CONC_APORTE, :PERIODO, :ANO, :CONC_MODIFI, :CONC_APLICAPROM, :SALARIO, :GTOEMPR);
                            end
                        end
                    VALOR = 0;
                    BASICO = 0;
                    end
            end /* for */
        end
    end
suspend;
end

^

SET TERM ; ^

SET TERM ^ ;

ALTER TRIGGER NOMINA_DETALLE_BI
as
declare variable PERIODO integer;
declare variable FEC DATE;
begin
SELECT N.nomi_periodo,N.nomi_feccausa FROM NOMINA N WHERE N.nomi_id = NEW.nomi_id INTO :periodo,:fec;
EXECUTE PROCEDURE DIAS_LABORADOS(NEW.terc_nit,:periodo,:fec,'N','N')returning_values(NEW.node_diaslab);
end
^

SET TERM ; ^

/* 20101014b */
/* TARIFA DE ARP POR DEPARTAMENTO SI EL PORCENTAJE DEL CONCEPTO Y DEL EMPLEADO ES CERO */
SET TERM ^ ;

CREATE OR ALTER procedure CAUSA_NOMINA (
    FEC date,
    PERIODO integer,
    PERIODICIDAD integer,
    PAGOGLOBAL char(1),
    ANO char(4),
    DEPTO integer)
returns (
    IDNOMINA integer,
    ITEMINI integer)
AS
declare variable item integer;
declare variable nite varchar(20);
declare variable nit_tercero varchar(20);
declare variable concept integer;
declare variable montos numeric(18,2);
declare variable porcen numeric(9,4);
declare variable entidad varchar(20);
declare variable conc_cod integer;
declare variable conc_deduc char(1);
declare variable conc_porc numeric(9,4);
declare variable conc_entidad integer;
declare variable conc_monto numeric(18,2);
declare variable conc_modifi char(1);
declare variable conc_promedio char(1);
declare variable valor numeric(18,2);
declare variable diaslab integer;
declare variable conc_prov char(1);
declare variable conc_aporte char(1);
declare variable numeroprom integer;
declare variable conc_aplicaprom char(1);
declare variable perinicial integer;
declare variable perfinal integer;
declare variable anoini integer;
declare variable anofin integer;
declare variable conc_dias char(1);
declare variable conc_otroconc char(1);
declare variable conc_codotroconc integer;
declare variable anosum integer;
declare variable salario char(1);
declare variable liquidaper integer;
declare variable basico numeric(18,2);
declare variable niteps varchar(20);
declare variable nitafc varchar(20);
declare variable nitafp varchar(20);
declare variable nitccf varchar(20);
declare variable gtoempr char(1);
declare variable comision numeric(18,2);
declare variable cambsaltrans numeric(18,2);
declare variable saldosini numeric(18,2);
declare variable duranov integer;
declare variable base numeric(18,2);
declare variable aprox integer;
declare variable mensual char(1);
declare variable horasex numeric(18,2);
declare variable diasnov integer;
declare variable tomasal integer;
declare variable retroact numeric(18,2);
declare variable reembolso numeric(18,2);
declare variable incap numeric(18,2);
declare variable auxtrans numeric(18,2);
declare variable smlv numeric(18,2);
declare variable beneficios numeric(18,2);
declare variable confirmado char(1);
declare variable recnoct numeric(18,2);
declare variable recfest numeric(18,2);
declare variable tar_recnotc numeric(9,4);
declare variable tar_recfest numeric(9,4);
declare variable recargo numeric(18,2);
declare variable basicorec numeric(18,2);
declare variable parambenef char(2);
declare variable vacacdisf numeric(18,2);
declare variable valorpredet numeric(18,2);
declare variable basicoemp numeric(18,2);
declare variable salinteg char(1);
declare variable tar_salinteg numeric(9,4);
begin
execute procedure LEE_CONFIGURACION('NOMINA','LIQUIDACION','TOMAR BENEFICIOS PARA CALCULAR PROVISIONES')returning_values(:PARAMBENEF);
execute procedure LEE_CONFIGURACION('NOMINA','GENERAL','REDONDEO AL MULTIPLO DE DIEZ EN TOTALES')returning_values(:APROX);
select N.NOMI_ID, N.NOMI_LIQOK from NOMINA N where N.NOMI_PERIODO = :PERIODO and N.NOMI_PERIODOCIDAD = :PERIODICIDAD
    and N.NOMI_ANO = :ANO into :IDNOMINA, :CONFIRMADO;
if (:IDNOMINA is null) then
    begin
    execute procedure CAMBIE_ID_NOMINA returning_values(:IDNOMINA);
    insert into NOMINA (NOMI_ID, NOMI_FECCAUSA, NOMI_PAGOGLOBAL, NOMI_PERIODOCIDAD, NOMI_PERIODO, NOMI_ANO, NOMI_LIQOK)
    values (:IDNOMINA, :FEC,:PAGOGLOBAL, :PERIODICIDAD, :PERIODO, :ANO, 'N');
    ITEM = 1;
    end
else
    begin
    select max(N.NOCO_ITEM) from NOMINA_CONCEPTOS N where N.NOMI_ID = :IDNOMINA
    into :ITEM;
    end
if ((CONFIRMADO = 'S') and (IDNOMINA is not null)) then
    begin
    IDNOMINA = 0;
    end
else
    begin
    insert into NOMINA_DEPARTAMENTO (NOMI_ID, NODP_DEPTO)values(:IDNOMINA,:DEPTO);
    select P.PAAN_RECNOC, P.PAAN_RECFEST, P.paan_salinteg from PARAMETROS_ANO P where P.PAAN_ANO = :ANO
        into :TAR_RECNOTC, :TAR_RECFEST, TAR_SALINTEG;
    ITEMINI = ITEM;
    for select E.TERC_NIT, E.EMPL_EPS, E.EMPL_AFC, E.EMPL_AFP, E.EMPL_CCF, E.empl_salinteg
        from EMPLEADOS E
        where E.EMPL_PPAGO = :PERIODICIDAD and ((E.EMPL_FECRET is null) or (E.EMPL_FECRET > :FEC)) and E.EMPL_FECING <= :FEC
        and ((:DEPTO = 0) or (e.empl_dpto = :DEPTO))
        into :NITE, :NITEPS, :NITAFC, :NITAFP, :NITCCF, :SALINTEG
        do
        begin
        select first 1 M.MVSE_SALARIO from MOVIMIENTO_SALARIO_EMPLEADO M where M.TERC_NIT = :NITE and M.MVSE_FECHA <= :FEC order by M.MVSE_FECHA desc into :BASICOEMP;
        BASICO = BASICOEMP;
        RECNOCT = null;
        RECFEST = null;
        select N.NOEX_RECNOCT, N.NOEX_RECFEST
            from NOMINA_HORASEXT N where N.NOEX_PERIODIO = :PERIODO and N.NOEX_ANO = :ANO and N.TERC_NIT = :NITE
            into :RECNOCT, :RECFEST;
        if (RECNOCT is null) then
            RECNOCT = 0;
        if (RECFEST is null) then
            RECFEST = 0;
        for select CE.TERC_NIT, CE.CONC_COD, CE.EMCO_MONTO, CE.EMCO_PORC, CE.EMPL_ENTIDAD, CE.EMCO_PERPROM, CE.EMCO_LUQUIDAPER, CE.EMCO_MENSUAL, CN.CONC_COD, CN.CONC_DEDUC,CN.CONC_PORC, CN.CONC_ENTIDAD, CN.CONC_MONTO,  CN.CONC_DIAS, CN.CONC_MODIFI,
            CN.CONC_PROMEDIO, CN.CONC_SALARIO, CN.CONC_PROV, CN.CONC_APORTE, CN.CONC_APLICAPROM, CN.CONC_OTROCONC, CN.CONC_CODOTROCONC, CN.CONC_GTOEMPR, CN.CONC_BASE, CE.EMCO_TOMSAL
            from EMPLEADO_CONCEPTOS CE, CONCEPTOS_NOMINA CN where (CE.CONC_COD = CN.CONC_COD) and (CE.TERC_NIT = :NITE) and
            ( ((CE.EMCO_FECINI <= :FEC and CE.EMCO_FECFIN >= :FEC)) or
            ((CN.CONC_TODOSPER = 'N') and (CE.EMCO_PPAGO = :PERIODO)) or ((CN.CONC_TODOSPER = 'S') AND (((:periodicidad = 1) AND (:PERIODO < 13)) or ((:periodicidad = 2) AND (:PERIODO < 25)))) )  order by (TERC_NIT )
            into :NIT_TERCERO, :CONCEPT,  :MONTOS, :PORCEN, :ENTIDAD, :NUMEROPROM, :LIQUIDAPER, :MENSUAL ,:CONC_COD, :CONC_DEDUC, :CONC_PORC,
            :CONC_ENTIDAD, :CONC_MONTO, :CONC_DIAS, :CONC_MODIFI,:CONC_PROMEDIO, :SALARIO,:CONC_PROV, :CONC_APORTE , :CONC_APLICAPROM, :CONC_OTROCONC, :CONC_CODOTROCONC, :GTOEMPR, :BASE, :TOMASAL
            do
            begin
            if (MENSUAL = 'S') then
                BEGIN
                if (PERIODICIDAD = 1) then
                    BEGIN
                    perinicial = PERIODO;
                    PERFINAL = PERIODO;
                    END
                if (PERIODICIDAD = 2) then
                    BEGIN
                    perinicial = PERIODO - (LIQUIDAPER - 1);
                    PERFINAL = PERIODO + (2 - LIQUIDAPER);
                    END
                if (PERIODICIDAD = 3) then
                    BEGIN
                    perinicial = PERIODO - (LIQUIDAPER - 1);
                    PERFINAL = PERIODO + (4 - LIQUIDAPER);
                    END
                END
            ELSE
                BEGIN
                perinicial = PERIODO;
                PERFINAL = PERIODO;
                END
                            
            /* SI ES ARP TOME EL PORCENTAJE DEL DEPARTAMENTO */
            if ((CONC_COD = 908) or (CONC_COD = 909) or (CONC_COD = 935)) then
                if ((CONC_PORC = 0 and :PORCEN = 0) or (CONC_PORC is null and :PORCEN = 0) or (CONC_PORC = 0 and :PORCEN is null) or (CONC_PORC is null and :PORCEN is null) ) then
                    SELECT DPTO_TARARP FROM DEPARTAMENTO D, EMPLEADOS E WHERE E.terc_nit = :nite AND E.empl_dpto = D.dpto_cod
                        INTO :porcen;
            if (CONC_DIAS = 'S') then
                execute procedure DIAS_LABORADOS (:NITE, :PERIODO, :FEC, :MENSUAL,:CONC_APORTE) returning_values (:DIASLAB);
            else
                BEGIN
                SELECT PPAG_DIAS FROM PERIODO_PAGO WHERE PPAG_COD = :periodicidad INTO :diaslab;
                END
            if (:TOMASAL <> 0) then
                begin
                /* SI EL CONCEPTO NOAPLICA EN ESTE PERIODO DEJE EL BASICO EN CERO */
                if ((:PERIODICIDAD = 2) and (:TOMASAL <> 2)) then
                    begin
                    if ((PERIODO = 2) or (PERIODO = 4) or (PERIODO = 6) or (PERIODO = 8) or (PERIODO = 10) or (PERIODO = 12)
                        or (PERIODO = 14) or (PERIODO = 16) or (PERIODO = 18) or (PERIODO = 20) or (PERIODO = 22) or (PERIODO = 24)) then
                        BASICO = 0;
                    end
                else
                    if ((:PERIODICIDAD = 3) and (:TOMASAL <> 1)) then
                        begin
                        if ((PERIODO = 1) or (PERIODO = 5) or (PERIODO = 9) or (PERIODO = 13) or (PERIODO = 17) or (PERIODO = 21)
                            or (PERIODO = 25) or (PERIODO = 29) or (PERIODO = 33) or (PERIODO = 37) or (PERIODO = 41) or (PERIODO = 45)
                            or (PERIODO = 49)) then
                            BASICO = 0;
                        end
                    else
                        if ((:PERIODICIDAD = 3) and (:TOMASAL <> 2)) then
                            begin
                            if ((PERIODO = 2) or (PERIODO = 6) or (PERIODO = 10) or (PERIODO = 14) or (PERIODO = 18) or (PERIODO = 22)
                                or (PERIODO = 26) or (PERIODO = 30) or (PERIODO = 34) or (PERIODO = 38) or (PERIODO = 42) or (PERIODO = 46)
                                or (PERIODO = 50)) then
                                BASICO = 0;
                            end
                        else
                            if ((:PERIODICIDAD = 3) and (:TOMASAL <> 3)) then
                                begin
                                if ((PERIODO = 3) or (PERIODO = 7) or (PERIODO = 11) or (PERIODO = 15) or (PERIODO = 19) or (PERIODO = 23)
                                    or (PERIODO = 27) or (PERIODO = 31) or (PERIODO = 35) or (PERIODO = 39) or (PERIODO = 43) or (PERIODO = 47)
                                    or (PERIODO = 51)) then
                                    BASICO = 0;
                                end
                            else
                                if ((:PERIODICIDAD = 3) and (:TOMASAL <> 4)) then
                                begin
                                if ((PERIODO = 4) or (PERIODO = 8) or (PERIODO = 12) or (PERIODO = 16) or (PERIODO = 20) or (PERIODO = 24)
                                    or (PERIODO = 29) or (PERIODO = 32) or (PERIODO = 36) or (PERIODO = 40) or (PERIODO = 44) or (PERIODO = 48)
                                    or (PERIODO = 52)) then
                                    BASICO = 0;
                                end
                end
            else
                begin
                /* SE CALCULA SOBRE TODOS LOS PERIODOS */
                BASICO = BASICOEMP;
                end
            VALORPREDET = null;
            select VP.NVPR_MONTO from NOMINA_VALOR_PREDET VP where VP.NVPR_PERIODICIDAD = :PERIODICIDAD and VP.NVPR_PERIODO = :PERIODO and VP.NVPR_ANO = :ANO and VP.CONC_COD = :CONC_COD and VP.TERC_NIT = :NITE
                into :VALORPREDET;
            if ((:VALORPREDET <> 0) and (VALORPREDET is not null)) then
                VALOR = VALORPREDET;
            else
                begin
                /* SI HAY UN CAMBIO TRANSITORIO DE SALARIO AJUSTE LOS DIAS Y CALCULE EL VALOR A SUMAR */
                select SUM((N.NONO_VALOR /30) * ND.NNDE_DURACION), SUM(ND.NNDE_DURACION) from NOMINA_NOVEDADES N, nomina_novedades_detalle ND
                    where N.nono_id = ND.nono_id AND N.TNOV_COD = 11 and N.TERC_NIT = :NITE and ND.NNDE_PERIODO = :PERIODO
                    into :CAMBSALTRANS, :DURANOV;
                if (CAMBSALTRANS is null) then
                    CAMBSALTRANS = 0;
                if (DURANOV is null) then
                    DURANOV = 0;
                DIASLAB = :DIASLAB - :DURANOV;
                /* SI ES UN PRESTAMO, TRAIGA LA CUOTA */
                if (CONC_COD = 922) then
                    begin
                    select sum(P.PRCU_MONTO) from PRESTAMO_CUOTAS P, PRESTAMO_NOMINA PN
                        where P.PRCU_ANO = :ANO and P.PRCU_PERIODO = :PERIODO and PN.PRNO_ID = P.PRNO_ID and PN.TERC_NIT = :NITE into :VALOR;
                    if (VALOR is null) then
                        VALOR = 0;
                    ITEM = :ITEM + 1;
                    /* MARQUE LA CUOTA COMO PAGADA */
                    update PRESTAMO_CUOTAS  P set PRCU_OK = 'S' where P.PRCU_ANO = :ANO and P.PRCU_PERIODO = :PERIODO
                        and exists (select PRNO_ID from PRESTAMO_NOMINA where TERC_NIT = :NITE and PRNO_ID = P.prno_id);
                    end
                else
                    if ((:MONTOS = 0) or (:MONTOS is null)) then
                        begin
                        /* SI EL CONCEPTO DEL EMPLEADO NO TIENE MONTO TRAIGA EL DE CONCEPTOS_NOMINA */
                        if ((CONC_PORC = 0 and :PORCEN = 0) or (CONC_PORC is null and :PORCEN = 0) or (CONC_PORC = 0 and :PORCEN is null) or (CONC_PORC is null and :PORCEN is null) ) then
                            begin
                            /* SIN PORCENTAJE */
                            if ((CONC_MONTO <> 0) and (CONC_MONTO is not null) ) then
                                begin
                                VALOR = :CONC_MONTO;
                                if (:CONC_DIAS = 'S') then
                                    VALOR = (:VALOR / 30) * :DIASLAB;
                                end
                            else
                                if (SALARIO = 'S' and CONC_COD <> 900 and CONC_COD <> 931 and CONC_COD <> 945 and CONC_COD <> 920 and CONC_COD <> 932 and CONC_COD <> 953) then
                                    begin
                                    /* SI ES SALARIO SUME LAS EXTRAS */
                                    BASICO = BASICOEMP;
                                    BASICO = ((:BASICO/30)*:DIASLAB);/* - (((:BASICO/30)/8)*:RECNOCT);/* PFP:DEBERIA SER + Y POR LA TARIFA QUE NO VEO POR NINGUN LADO
                                    BASICO = :BASICO - (((:BASICO/30)/8)*:RECFEST);*/
                                    CONC_MONTO = :BASICO;
                                    VALOR = (:CONC_MONTO/*/30 * :diaslab*/ ) + :CAMBSALTRANS;
                                    end
                                else
                                    begin
                                    VALOR = MONTOS;
                                    if (:CONC_DIAS = 'S') then
                                        VALOR = (:VALOR / 30) * :DIASLAB;
                                    end
                            end
                        else    
                            begin
                            if (:PORCEN <> 0) then
                                begin
                                /* SI TIENE PORCENTAJE EN EMPLEADO_CONCEPTOS PERO EL MONTO SE TRAE DE CONCPETOS_NOMINA */
                                if ((CONC_MONTO <> 0) and (CONC_MONTO is not null) ) then
                                    begin
                                    VALOR = ((:CONC_MONTO ) * :PORCEN) /100;
                                    end
                                end
                            else
                                begin
                                /* NO TIENE PORCENTAJE EN EMPLEADO_CONCEPTOS SE TRAE MONTO Y PORC DE CONCPETOS_NOMINA */
                                if ((CONC_MONTO <> 0) and (CONC_MONTO is not null) ) then
                                    begin
                                    VALOR = ((:CONC_MONTO) * :CONC_PORC) /100;
                                    end
                                else
                                    if (SALARIO = 'S' and CONC_COD <> 900 and CONC_COD <> 931 and CONC_COD <> 945 and CONC_COD <> 920 and CONC_COD <> 932 and CONC_COD <> 953) then
                                        begin
                                        BASICO = BASICOEMP;
                                        BASICO = ((:BASICO/30)*:DIASLAB); /* - (((:BASICO/30)/8)*:RECNOCT);
                                        BASICO = :BASICO - (((:BASICO/30)/8)*:RECFEST);*/
                                        CONC_MONTO = :BASICO;
                                        VALOR = ((:CONC_MONTO)+ :CAMBSALTRANS * :CONC_PORC) /100;
                                        end
                                    else
                                        if (:CONC_MONTO = 0 and :MONTOS = 0) then
                                            begin
                                            CONC_MONTO = :BASICO;
                                            VALOR = (((:CONC_MONTO / 30) * :DIASLAB) + :CAMBSALTRANS * :CONC_PORC) /100;
                                            end
                                end
                            end
                        end
                    else
                        /* SI TIENE MONTO EN EMPLEADO_CONCEPTOS */
                        if ((CONC_PORC = 0 or (CONC_PORC is null)) and (:PORCEN = 0 or (PORCEN is null))) then
                            begin
                            VALOR = (:MONTOS);
                            if (:CONC_DIAS = 'S') then
                                VALOR = (:VALOR / 30) * :DIASLAB;   
                            end
                        else
                            if (:PORCEN <> 0 and PORCEN is not null) then
                                begin
                                VALOR = ((:MONTOS ) * :PORCEN) /100;
                                end
                            else
                                begin
                                VALOR = ((:MONTOS) * :CONC_PORC) /100;
                                end
                if (CONC_PROMEDIO = 'S') then
                    begin
                    /* CALCULO DEL PROMEDIO BASE DESDE LA FECHA MENOS EL NUMERO DE PERIODOS */
                    EXECUTE PROCEDURE periodo_nom_fecha (:fec, :periodicidad) returning_values (:perfinal, :anofin);
                    if (perfinal < numeroprom) then
                        BEGIN
                        anoini = anofin - 1;
                        if (periodicidad = 1) then
                            perinicial = 12 - (numeroprom - perfinal) + 1;
                        if (periodicidad = 2) then
                            perinicial = 24 - (numeroprom - perfinal) + 1;
                        if (periodicidad = 3) then
                            perinicial = 52 - (numeroprom - perfinal) + 1;
                        END
                    ELSE
                        BEGIN
                        PERINICIAL = :perfinal - :NUMEROPROM + 1;
                        anoini = ANOFIN;
                        END
                    if (anoini <> anofin) then
                        select sum (NOCO_VALOR) from NOMINA_CONCEPTOS N where N.NOCO_APLICAPROM = 'S' and
                            ((N.NOCO_PERIODO >= :PERINICIAL and N.NOCO_ANO = :anoini) or
                            (N.NOCO_PERIODO <= :perfinal and N.NOCO_ANO = :anofin)) and TERC_NIT = :NITE into :VALOR;
                    else
                        select sum (NOCO_VALOR) from NOMINA_CONCEPTOS N where N.NOCO_APLICAPROM = 'S' and
                            N.NOCO_PERIODO >= :PERINICIAL and N.NOCO_ANO = :anoini
                            and N.NOCO_PERIODO <= :perfinal and TERC_NIT = :NITE into :VALOR;
                    /* sume el saldo inicial */
                    SALDOSINI = 0;
                    select NOCO_VALOR from NOMINA_CONCEPTOS where CONC_COD = :CONC_COD and TERC_NIT  = :NITE and NOCO_PAGOOK = 'N' and NOCO_PERIODO = 0 into :SALDOSINI;
                    if (SALDOSINI is null) then
                        SALDOSINI = 0;
                    else
                        update NOMINA_CONCEPTOS N set NOCO_PAGOOK = 'S' where N.NOCO_APLICAPROM = 'S' and
                            CONC_COD = :CONC_COD and TERC_NIT = :NITE and NOCO_PERIODO = 0;

                    VALOR = :VALOR + :SALDOSINI;
                    /* APLIQUE LA PROPORCION Y EL PORCENTAJE */
                    VALOR = VALOR / NUMEROPROM;
                    VALOR = VALOR * PORCEN / 100;
                    end
                else if (CONC_OTROCONC = 'S') then
                    begin
                    ANOSUM = cast(ANO as integer);
                    ANOSUM = ANOSUM - 1;
                    select sum (NOCO_VALOR) from NOMINA_CONCEPTOS N where N.NOCO_ANO = :ANOSUM and N.CONC_COD = :CONC_CODOTROCONC and N.TERC_NIT = :NITE into :VALOR;
                    select NOCO_VALOR from NOMINA_CONCEPTOS where NOCO_ANO = :ANOSUM and CONC_COD = :CONC_CODOTROCONC and TERC_NIT = :NITE and NOCO_PERIODO = 0 into :SALDOSINI;
                    if (SALDOSINI is null) then
                        SALDOSINI = 0;
                    else
                        update NOMINA_CONCEPTOS set NOCO_PAGOOK = 'S' where NOCO_ANO = :ANOSUM and CONC_COD = :CONC_CODOTROCONC and NOCO_PERIODO = 0 and TERC_NIT = :NITE;
                    VALOR = :VALOR + :SALDOSINI;
                    update NOMINA_CONCEPTOS set NOCO_PAGOOK = 'S' where NOCO_ANO = :ANOSUM and CONC_COD = :CONC_CODOTROCONC and TERC_NIT = :NITE;
                    end
                else if (CONC_APORTE = 'S') then
                    begin
                    HORASEX = null;
                    DIASNOV = null;
                    RETROACT = null;
                    REEMBOLSO = null;
                    BENEFICIOS = null;
                    RECARGO = null;
                    COMISION = null;
                    INCAP = null;
                    VACACDISF = null;
                    if ((:ENTIDAD = '' ) or (ENTIDAD is null)) then
                        begin
                        /*COMISIONES*/
                        if (MENSUAL = 'S') then
                            BEGIN
                            if (PERIODICIDAD = 1) then
                                BEGIN
                                perinicial = PERIODO;
                                PERFINAL = PERIODO;
                                END
                            if (PERIODICIDAD = 2) then
                                BEGIN
                                perinicial = PERIODO - (LIQUIDAPER - 1);
                                PERFINAL = PERIODO + (2 - LIQUIDAPER);
                                END
                            if (PERIODICIDAD = 3) then
                                BEGIN
                                perinicial = PERIODO - (LIQUIDAPER - 1);
                                PERFINAL = PERIODO + (4 - LIQUIDAPER);
                                END
                            END
                        ELSE
                            BEGIN
                            perinicial = PERIODO;
                            PERFINAL = PERIODO;
                            END
                            
                        /* SUME LAS COMISIONES DE LOS DEMAS PERIODOS DEL MES */
                        select SUM(C.NCOM_MONTO) from NOMINA_COMISIONES C where C.NCOM_ANO = :ANO
                            and C.NCOM_PERIODO >= :PERINICIAL AND C.NCOM_PERIODO <= :PERFINAL
                            and C.NCOM_PERIODICIDAD = :PERIODICIDAD and C.TERC_NIT = :NITE
                            into :COMISION;
                        if (COMISION is null) then
                            COMISION = 0;
                        /*RETROACTIVO*/
                        select C.EMCO_MONTO from EMPLEADO_CONCEPTOS C where C.TERC_NIT = :NITE
                            and C.CONC_COD = 933 into :RETROACT;
                            if (RETROACT is null ) then
                                RETROACT = 0;
                        /*REEMBOLSO*/
                        select C.EMCO_MONTO from EMPLEADO_CONCEPTOS C where C.TERC_NIT = :NITE
                            and C.CONC_COD = 952 into :REEMBOLSO;
                        if (REEMBOLSO is null ) then
                            REEMBOLSO = 0;
                        /*VACACIONES DISFRUTADAS ANTERIORMENTE*/
                        select C.EMCO_MONTO from EMPLEADO_CONCEPTOS C where C.TERC_NIT = :NITE
                            and C.CONC_COD = 955 into :VACACDISF;
                        if (VACACDISF is null ) then
                            VACACDISF = 0;
                        /* INCAPACIDAD NO DEBE LIQUIDARSE YA QUE EL BASICO EN EL CASO DE APORTES LO INCLUYE *
                        select SUM(ND.NNDE_DURACION) from NOMINA_NOVEDADES N, nomina_novedades_detalle ND
                            where N.nono_id = ND.nono_id AND N.TERC_NIT = :NITE
                            and ND.NNDE_PERIODO >= :perinicial and ND.NNDE_PERIODO <= :perfinal and ND.NNDE_ANO = :ANO
                            and (N.TNOV_COD = 2 or (N.TNOV_COD = 3))
                            into :DIASNOV;
                        if (:DIASNOV is null) then
                            INCAP = 0;
                        else
                            INCAP = (:BASICO / 30)* :DIASNOV; */
                        INCAP = 0;
                        /*BASICO*/
                        if (SALINTEG = 'S') then
                            BASICO = BASICO * (tar_salinteg / 100);

                        if (MENSUAL <> 'S') then
                            BASICO = ((:BASICO/30)*:DIASLAB);
                        /*HORAS EXTRA*/
                        select SUM(C.NOEX_MONTO) from NOMINA_HORASEXT C where C.NOEX_ANO = :ANO
                            and C.NOEX_PERIODIO >= :PERINICIAL and C.NOEX_PERIODIO <= :PERFINAL
                            and C.NOEX_PERIODICIDAD = :PERIODICIDAD and C.TERC_NIT = :NITE
                            into :HORASEX;
                        if (HORASEX is null) then
                            HORASEX = 0;
                        /*RECARGOS*/
                        BASICOREC = BASICOEMP;
                        RECARGO = (((:BASICOREC/30)/8)*:TAR_RECNOTC)*:RECNOCT;
                        RECARGO = :RECARGO + ((((:BASICOREC/30)/8)*:TAR_RECFEST)*:RECFEST);
                        if (RECARGO is null) then
                            RECARGO = 0;
                        /*basico*/
                        if (MENSUAL <> 'S') then
                            begin
                            if (:BASICO + :COMISION + :HORASEX + :RETROACT+ :REEMBOLSO + :INCAP+ :CAMBSALTRANS < ((:SMLV/30)*:DIASLAB)) then
                                BASICO = (:SMLV/30)*:DIASLAB;
                            end
                        else
                            begin
                            if (:BASICO + :COMISION + :HORASEX + :RETROACT+ :REEMBOLSO + :INCAP+ :CAMBSALTRANS < :SMLV) then
                                BASICO = :SMLV;
                            end
                        /* SMLV Y AUX. TRANSPORTE*/
                        select P.PAAN_AUXTR, P.PAAN_SALMINIMO from PARAMETROS_ANO P
                            where P.PAAN_ANO = :ANO into :AUXTRANS, :SMLV;
                        /*BASE*/
                        VALOR = :BASICO + :COMISION + :HORASEX + :RETROACT+ :REEMBOLSO + :INCAP + :RECARGO + :CAMBSALTRANS + :VACACDISF;

                        if (CONC_COD = 904) then
                            begin
                            ENTIDAD = :NITAFP;
                            select A.PAAN_AFPTR from PARAMETROS_ANO A where A.PAAN_ANO = :ANO into :PORCEN;
                            VALOR = ((:VALOR) * :PORCEN) /100;
                            end
                        else if ((CONC_COD = 905) or (CONC_COD = 906) or (CONC_COD = 934) ) then
                            begin
                            ENTIDAD = :NITAFP;
                            select A.PAAN_AFPEM from PARAMETROS_ANO A where A.PAAN_ANO = :ANO into :PORCEN;
                            VALOR = ((:VALOR) * :PORCEN) /100;
                            end
                        else if ((CONC_COD = 907) or (CONC_COD = 914) or (CONC_COD = 915) or (conc_cod = 938)) then
                            begin
                            ENTIDAD = :NITEPS;
                            if (CONC_COD = 907) then
                                begin
                                select A.PAAN_EPSTR from PARAMETROS_ANO A where A.PAAN_ANO = :ANO into :PORCEN;
                                VALOR = ((:VALOR) * :PORCEN) /100;
                                end
                            else
                                begin
                                select A.PAAN_EPSEM from PARAMETROS_ANO A where A.PAAN_ANO = :ANO into :PORCEN;
                                    VALOR = ((:VALOR) * :PORCEN) /100;
                                end
                            end
                        else if ((CONC_COD = 910) or (CONC_COD = 911) or (CONC_COD = 936)) then
                            begin
                            /*ccf */
                            ENTIDAD = :NITCCF;
                            select A.PAAN_CCF from PARAMETROS_ANO A where A.PAAN_ANO = :ANO into :PORCEN;
                            VALOR = ((:VALOR) * :PORCEN) /100;
                            end
                        else if ((CONC_COD = 916) or (CONC_COD = 917) or (CONC_COD = 939) ) then
                            begin
                            /*icbf */
                            ENTIDAD = :NITCCF;
                            select A.PAAN_ICBF from PARAMETROS_ANO A where A.PAAN_ANO = :ANO into :PORCEN;
                            VALOR = ((:VALOR) * :PORCEN) /100;
                            end
                        else if ((CONC_COD = 918) or (CONC_COD = 919) or (CONC_COD = 940) ) then
                            begin
                            /*sena */
                            ENTIDAD = :NITCCF;
                            select A.PAAN_SENA from PARAMETROS_ANO A where A.PAAN_ANO = :ANO into :PORCEN;
                            VALOR = ((:VALOR) * :PORCEN) /100;
                            end
                        else if ((CONC_COD = 912) or (CONC_COD = 913) or (CONC_COD = 937)) then
                            begin
                            /* CESANTIAS */
                            ENTIDAD = :NITAFC;
                            if (PARAMBENEF = 'SI') then
                                begin
                                select sum(CE.EMCO_MONTO)
                                    from EMPLEADO_CONCEPTOS CE, CONCEPTOS_NOMINA CN where CN.CONC_BENEFIC = 'S' and (CE.TERC_NIT = :NITE) and (CE.CONC_COD = CN.CONC_COD) and
                                    ((CE.EMCO_FECINI <= :FEC and CE.EMCO_FECFIN >= :FEC) or ((CN.CONC_TODOSPER = 'N') and (CE.EMCO_PPAGO = :PERIODO)) or
                                    (CN.CONC_TODOSPER = 'S'))
                                    into :BENEFICIOS;
                                if (BENEFICIOS is null) then
                                    BENEFICIOS = 0;
                                end
                            else
                                BENEFICIOS = 0;
                            select P.PAAN_AUXTR, P.PAAN_SALMINIMO from PARAMETROS_ANO P
                                where P.PAAN_ANO = :ANO into :AUXTRANS, :SMLV;
                            if (:BASICO < (:SMLV*2)) then
                                AUXTRANS = (:AUXTRANS / 30) * :DIASLAB;
                            else
                                AUXTRANS = 0;
                            select A.PAAN_CESEMP from PARAMETROS_ANO A where A.PAAN_ANO = :ANO
                                into :PORCEN;
                            VALOR = ((:VALOR + :AUXTRANS + :BENEFICIOS) * :PORCEN) /100;
                            end
                        else
                            begin
                            if (COMISION is null) then
                                COMISION = 0;
                            select C.NCOM_MONTO from NOMINA_COMISIONES C where C.NCOM_ANO = :ANO and C.NCOM_PERIODO = :PERIODO and C.NCOM_PERIODICIDAD = :PERIODICIDAD and C.TERC_NIT = :NITE
                                into :COMISION;
                            CONC_MONTO = :BASICO + :COMISION;
                            if (CONC_PORC <> 0 and CONC_PORC is not null) then
                                if (mensual <> 'S') then
                                    VALOR = (((:CONC_MONTO/30 * :DIASLAB )+ :CAMBSALTRANS + :INCAP) * :CONC_PORC) /100;
                                else
                                    VALOR = ((:CONC_MONTO+ :CAMBSALTRANS + :INCAP) * :CONC_PORC) /100;
                            else
                                if (:PORCEN <> 0 and :PORCEN is not null) then
                                    if (mensual <> 'S') then
                                        VALOR = (((:CONC_MONTO/30 * :DIASLAB )+ :CAMBSALTRANS + :INCAP) * :PORCEN) /100;
                                    else
                                        VALOR = ((:CONC_MONTO + :CAMBSALTRANS + :INCAP) * :PORCEN) /100;
                                else
                                    if (:MONTOS <> 0 and :MONTOS is not null) then
                                        VALOR = :MONTOS;
                                    else
                                        if (:CONC_MONTO <> 0 and :CONC_MONTO is not null) then
                                            VALOR = :CONC_MONTO;
                            end
                        ITEM = :ITEM + 1;
                        end
                    end /* aportes */
                else if (CONC_PROV = 'S') then
                    begin
                    /*provisiones */
                    HORASEX = null;
                    DIASNOV = null;
                    RETROACT = null;
                    REEMBOLSO = null;
                    BENEFICIOS = null;
                    RECARGO = null;
                    COMISION = null;
                    INCAP = null;
                    if (MENSUAL = 'S') then
                        BEGIN
                        if (PERIODICIDAD = 1) then
                            BEGIN
                            perinicial = PERIODO;
                            PERFINAL = PERIODO;
                            END
                        if (PERIODICIDAD = 2) then
                            BEGIN
                            perinicial = PERIODO - (LIQUIDAPER - 1);
                            PERFINAL = PERIODO + (2 - LIQUIDAPER);
                            END
                        if (PERIODICIDAD = 3) then
                            BEGIN
                            perinicial = PERIODO - (LIQUIDAPER - 1);
                            PERFINAL = PERIODO + (4 - LIQUIDAPER);
                            END
                        END
                    ELSE
                        BEGIN
                        perinicial = PERIODO;
                        PERFINAL = PERIODO;
                        END
                    /*HORAS EXTRA*/
                    select SUM(C.NOEX_MONTO) from NOMINA_HORASEXT C where C.NOEX_ANO = :ANO
                        and C.NOEX_PERIODIO >= :PERINICIAL and C.NOEX_PERIODIO <= :PERFINAL
                        and C.NOEX_PERIODICIDAD = :PERIODICIDAD and C.TERC_NIT = :NITE
                        into :HORASEX;
                    if (HORASEX is null) then
                        HORASEX = 0;
                    /* RECARGO*/
                    BASICO = BASICOEMP;
                    RECARGO = (((:BASICO/30)/8)*:TAR_RECNOTC)*:RECNOCT;
                    RECARGO = :RECARGO + ((((:BASICO/30)/8)*:TAR_RECFEST)*:RECFEST);
                    /*INCAPACIDAD*/
                    select SUM(ND.NNDE_DURACION) from NOMINA_NOVEDADES N, nomina_novedades_detalle ND
                        where N.nono_id = ND.nono_id AND N.TERC_NIT = :NITE
                        and ND.NNDE_PERIODO >= :perinicial and ND.NNDE_PERIODO <= :perfinal and ND.NNDE_ANO = :ANO
                        and ((N.TNOV_COD = 2) or (N.TNOV_COD = 3) or (N.TNOV_COD = 4)) into :DIASNOV;
                    if (:DIASNOV is null) then
                        INCAP = 0;
                    else
                        INCAP = (:BASICO / 30)* :DIASNOV;
                    /* BASICO*/
                    if (mensual <> 'S') then
                        BASICO = ((:BASICO/30)*:DIASLAB);
                    if (SALINTEG = 'S') then
                        BASICO = BASICO * (tar_salinteg / 100);
                    /*BENEFICIOS*/
                    if (PARAMBENEF = 'SI') then
                        begin
                        select sum(CE.EMCO_MONTO)
                            from EMPLEADO_CONCEPTOS CE, CONCEPTOS_NOMINA CN where CN.CONC_BENEFIC = 'S'
                            and (CE.TERC_NIT = :NITE) and (CE.CONC_COD = CN.CONC_COD) and
                            ((CE.EMCO_FECINI <= :FEC and CE.EMCO_FECFIN >= :FEC) or ((CN.CONC_TODOSPER = 'N')
                            and (CE.EMCO_PPAGO = :PERIODO)) or (CN.CONC_TODOSPER = 'S'))
                            into :BENEFICIOS;
                        if (BENEFICIOS is null) then
                            BENEFICIOS = 0;
                        end
                    else
                        BENEFICIOS = 0;
                    if ((CONC_COD <> 929) and (CONC_COD <> 930) and (CONC_COD <> 944)) then
                        begin
                        /* si no es vacaciones */
                        select P.PAAN_AUXTR, P.PAAN_SALMINIMO from PARAMETROS_ANO P where P.PAAN_ANO = :ANO
                            into :AUXTRANS, :SMLV;
                        if (:BASICO < (:SMLV*2)) then
                            begin
                            if (mensual <> 'S') then
                                AUXTRANS = (:AUXTRANS / 30) * :DIASLAB;
                            end
                        else
                            AUXTRANS = 0;
                        end
                    else
                        AUXTRANS = 0;
                    CONC_MONTO = :BASICO;
                    if (CONC_PORC <> 0 and CONC_PORC is not null) then
                        VALOR = ((:CONC_MONTO + :CAMBSALTRANS + :INCAP + :RECARGO + :HORASEX + :AUXTRANS + :BENEFICIOS) * :CONC_PORC) /100;
                    else
                        if (PORCEN <> 0 and PORCEN is not null) then
                            VALOR = ((:CONC_MONTO + :CAMBSALTRANS + :INCAP + :RECARGO + :HORASEX + :AUXTRANS + :BENEFICIOS) * :PORCEN) /100;
                        else
                            if (MONTOS <> 0 and MONTOS is not null) then
                                VALOR = :MONTOS;
                            else
                                if (CONC_MONTO <> 0 and CONC_MONTO is not null) then
                                    VALOR = :CONC_MONTO;
                    ITEM = :ITEM + 1;
                    end /* provision */
                else if (CONC_COD = 920) then /* comisiones */
                    begin
                    select C.NCOM_MONTO from NOMINA_COMISIONES C where C.NCOM_ANO = :ANO
                    and C.NCOM_PERIODO >= :perinicial and C.NCOM_PERIODO <= :perfinal and C.NCOM_PERIODICIDAD = :PERIODICIDAD and C.TERC_NIT = :NITE into :VALOR;
                    if (VALOR is null) then
                        VALOR = 0;
                    ITEM = :ITEM + 1;
                    end
                else if ((CONC_COD = 900) or (:CONC_COD = 931) or (:CONC_COD = 945)) then /* horas extra */
                    begin
                    select SUM(C.NOEX_MONTO) from NOMINA_HORASEXT C where C.NOEX_ANO = :ANO and
                        C.NOEX_PERIODIO >= :perinicial and C.NOEX_PERIODIO <= :perfinal and C.NOEX_PERIODICIDAD = :PERIODICIDAD and C.TERC_NIT = :NITE into :VALOR;
                    if (VALOR is null) then
                        VALOR = 0;
                    ITEM = :ITEM + 1;
                    end
                else if (CONC_COD = 954) then /* cartera */
                    begin
                    select C.NCAR_MONTO from NOMINA_CARTERA C where C.NCAR_ANO = :ANO
                    and C.NCAR_PERIODO >= :perinicial and C.NCAR_PERIODO <= :perfinal and C.NCAR_PERIODICIDAD = :PERIODICIDAD and C.TERC_NIT = :NITE into :VALOR;
                    if (VALOR is null) then
                        VALOR = 0;
                    ITEM = :ITEM + 1;
                    end
                else if (CONC_COD = 932) then
                    begin
                    /* incapacidad */
                    select SUM(ND.NNDE_DURACION) from NOMINA_NOVEDADES N, nomina_novedades_detalle ND
                        where N.nono_id = ND.nono_id AND N.TERC_NIT = :NITE
                        and ND.NNDE_PERIODO >= :perinicial and ND.NNDE_PERIODO <= :perfinal and ND.NNDE_ANO = :ANO
                        and ((N.TNOV_COD = 2) or (N.TNOV_COD = 3) or (N.TNOV_COD = 4)) into :DIASNOV;
                    if (:DIASNOV is null) then
                        VALOR = 0;
                    else
                        VALOR = (:BASICO / 30)* :DIASNOV;
                    end
                else if (CONC_COD = 921) then
                    begin
                    if (PORCEN is not null and PORCEN <> 0) then
                        VALOR = ((BASICO / 30)* :DIASLAB ) * :PORCEN /100;
                    else
                        if (CONC_PORC is not null and CONC_PORC <> 0) then
                            VALOR = ((BASICO / 30)* :DIASLAB ) * :CONC_PORC /100;
                    end
                else if (CONC_COD = 953) then
                    begin
                    /* RECARGO */
                    BASICO = BASICOEMP;
                    VALOR = (((:BASICO/30)/8)*:TAR_RECNOTC)*:RECNOCT;
                    VALOR = :VALOR + ((((:BASICO/30)/8)*:TAR_RECFEST)*:RECFEST);
                    end
                if (CONC_APORTE = 'S') then
                    begin
                    if (ENTIDAD is null or (ENTIDAD = '') ) then
                        ENTIDAD = :CONC_ENTIDAD;
                    end
                end
            if ((VALOR <> 0) and (VALOR is not null)) then
                begin
                execute procedure REDONDEE(:VALOR, :APROX) returning_values (VALOR);
                if ((MENSUAL = 'N') or (PERIODICIDAD = 1))  then
                    insert into NOMINA_CONCEPTOS (NOMI_ID, NOCO_ITEM, CONC_COD,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, NOCO_GTOEMPR)
                        values (:IDNOMINA,:ITEM, :CONCEPT, :NIT_TERCERO, :VALOR, :ENTIDAD, :CONC_DEDUC, :CONC_PROV, :CONC_APORTE, :PERIODO, :ANO, :CONC_MODIFI, :CONC_APLICAPROM, :SALARIO, :GTOEMPR);
                else
                    if (MENSUAL = 'S') then
                        begin
                        if ((:PERIODICIDAD = 2) and (LIQUIDAPER = 1)) then
                            begin
                            if ((PERIODO = 1) or (PERIODO = 3) or (PERIODO = 5) or (PERIODO = 7) or (PERIODO = 9) or (PERIODO = 11)
                                or (PERIODO = 13) or (PERIODO = 15) or (PERIODO = 17) or (PERIODO = 19) or (PERIODO = 21) or (PERIODO = 23)) then
                                insert into NOMINA_CONCEPTOS (NOMI_ID, NOCO_ITEM, CONC_COD,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, NOCO_GTOEMPR)
                                    values (:IDNOMINA,:ITEM, :CONCEPT, :NIT_TERCERO, :VALOR, :ENTIDAD, :CONC_DEDUC, :CONC_PROV, :CONC_APORTE, :PERIODO, :ANO, :CONC_MODIFI, :CONC_APLICAPROM, :SALARIO, :GTOEMPR);
                            end
                        else if ((:PERIODICIDAD = 2) and (LIQUIDAPER = 2)) then
                            begin
                            if ((PERIODO = 2) or (PERIODO = 4) or (PERIODO = 6) or (PERIODO = 8) or (PERIODO = 10) or (PERIODO = 12)
                                or (PERIODO = 14) or (PERIODO = 16) or (PERIODO = 18) or (PERIODO = 20) or (PERIODO = 22) or (PERIODO = 24)) then
                                insert into NOMINA_CONCEPTOS (NOMI_ID, NOCO_ITEM, CONC_COD,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, NOCO_GTOEMPR)
                                    values (:IDNOMINA,:ITEM, :CONCEPT, :NIT_TERCERO, :VALOR, :ENTIDAD, :CONC_DEDUC, :CONC_PROV, :CONC_APORTE, :PERIODO, :ANO, :CONC_MODIFI, :CONC_APLICAPROM, :SALARIO, :GTOEMPR);
                            end
                        else if ((:PERIODICIDAD = 3) and (LIQUIDAPER = 1)) then
                            begin
                            if ((PERIODO = 1) or (PERIODO = 5) or (PERIODO = 9) or (PERIODO = 13) or (PERIODO = 17) or (PERIODO = 21)
                                or (PERIODO = 25) or (PERIODO = 29) or (PERIODO = 33) or (PERIODO = 37) or (PERIODO = 41) or (PERIODO = 45)
                                or (PERIODO = 49)) then
                                insert into NOMINA_CONCEPTOS (NOMI_ID, NOCO_ITEM, CONC_COD,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, NOCO_GTOEMPR)
                                    values (:IDNOMINA,:ITEM, :CONCEPT, :NIT_TERCERO, :VALOR, :ENTIDAD, :CONC_DEDUC, :CONC_PROV, :CONC_APORTE, :PERIODO, :ANO, :CONC_MODIFI, :CONC_APLICAPROM, :SALARIO, :GTOEMPR);
                            end
                        else if ((:PERIODICIDAD = 3) and (LIQUIDAPER = 2)) then
                            begin
                            if ((PERIODO = 2) or (PERIODO = 6) or (PERIODO = 10) or (PERIODO = 14) or (PERIODO = 18) or (PERIODO = 22)
                                or (PERIODO = 26) or (PERIODO = 30) or (PERIODO = 34) or (PERIODO = 38) or (PERIODO = 42) or (PERIODO = 46)
                                or (PERIODO = 50)) then
                                insert into NOMINA_CONCEPTOS (NOMI_ID, NOCO_ITEM, CONC_COD,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, NOCO_GTOEMPR)
                                    values (:IDNOMINA,:ITEM, :CONCEPT, :NIT_TERCERO, :VALOR, :ENTIDAD, :CONC_DEDUC, :CONC_PROV, :CONC_APORTE, :PERIODO, :ANO, :CONC_MODIFI, :CONC_APLICAPROM, :SALARIO, :GTOEMPR);
                            end
                        else if ((:PERIODICIDAD = 3) and (LIQUIDAPER = 3)) then
                            begin
                            if ((PERIODO = 3) or (PERIODO = 7) or (PERIODO = 11) or (PERIODO = 15) or (PERIODO = 19) or (PERIODO = 23)
                                or (PERIODO = 27) or (PERIODO = 31) or (PERIODO = 35) or (PERIODO = 39) or (PERIODO = 43) or (PERIODO = 47)
                                or (PERIODO = 51)) then
                                insert into NOMINA_CONCEPTOS (NOMI_ID, NOCO_ITEM, CONC_COD,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, NOCO_GTOEMPR)
                                    values (:IDNOMINA,:ITEM, :CONCEPT, :NIT_TERCERO, :VALOR, :ENTIDAD, :CONC_DEDUC, :CONC_PROV, :CONC_APORTE, :PERIODO, :ANO, :CONC_MODIFI, :CONC_APLICAPROM, :SALARIO, :GTOEMPR);
                            end
                        else if ((:PERIODICIDAD = 3) and (LIQUIDAPER = 4)) then
                            begin
                            if ((PERIODO = 4) or (PERIODO = 8) or (PERIODO = 12) or (PERIODO = 16) or (PERIODO = 20) or (PERIODO = 24)
                                or (PERIODO = 29) or (PERIODO = 32) or (PERIODO = 36) or (PERIODO = 40) or (PERIODO = 44) or (PERIODO = 48)
                                or (PERIODO = 52)) then
                                insert into NOMINA_CONCEPTOS (NOMI_ID, NOCO_ITEM, CONC_COD,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, NOCO_GTOEMPR)
                                    values (:IDNOMINA,:ITEM, :CONCEPT, :NIT_TERCERO, :VALOR, :ENTIDAD, :CONC_DEDUC, :CONC_PROV, :CONC_APORTE, :PERIODO, :ANO, :CONC_MODIFI, :CONC_APLICAPROM, :SALARIO, :GTOEMPR);
                            end
                        end
                    VALOR = 0;
                    BASICO = 0;
                    end
            end /* for */
        end
    end
suspend;
end
^

SET TERM ; ^



/* 20101015 */
/* totales por concepto podian quedar en otra columna por diferente orden */
SET TERM ^ ;

CREATE OR ALTER procedure IMPR_PLANILLA_NOMINA (
    ID integer,
    PAGO char(1),
    CTA char(1),
    EMPL char(1),
    DPTO varchar(20))
returns (
    FECHA date,
    OBSERVACIONES blob sub_type 0 segment size 80,
    PAGOGLOBAL char(1),
    PERIODO integer,
    ANO char(4),
    PERIODICIDAD varchar(60),
    NITEMPL varchar(20),
    VALOR numeric(18,2),
    DEDUC char(1),
    NOMBREEMPL varchar(60),
    NOMCORTCONC varchar(60),
    NOMBRECONC varchar(60),
    CODCONC integer,
    PROV char(1),
    TOTALEMPL numeric(18,2),
    TOTALDEDUC numeric(18,2),
    TOTALDEVENG numeric(18,2),
    NUMEMPL integer,
    CTAEMPL varchar(25),
    TOTALCTAS numeric(18,2),
    TOTALNOMI numeric(18,2),
    TOTALAPOR numeric(18,2),
    NOMPER varchar(60),
    ORG integer,
    CARGOEMPL varchar(60),
    DEPTOEMPL varchar(60),
    NUMCOP integer,
    NOMBRE_COPIA varchar(60),
    DIASLAB integer,
    SALARIO numeric(18,2),
    BENEFICIO char(1),
    BASE numeric(18,2),
    CODDPTOEMPL integer,
    ORDEN integer)
AS
declare variable nitant varchar(20);
declare variable nitnue varchar(20);
declare variable numconc integer;
declare variable totalnomineg numeric(18,2);
declare variable totalaporneg numeric(18,2);
declare variable par integer;
declare variable impar integer;
declare variable antdeduc char(1);
declare variable nitdeduc varchar(20);
declare variable nittot varchar(20);
declare variable nitaux varchar(20);
declare variable COLDEV INTEGER;
declare variable COLDED INTEGER;
declare variable COLTOT INTEGER;
BEGIN
SELECT N.nuco_copia FROM NUMERO_COPIA N WHERE N.tido_cod = 92 AND N.nuco_id = :id INTO :NUMCOP;
IF (numcop IS NULL) THEN
  BEGIN
  numcop = 0;
  INSERT INTO NUMERO_COPIA (TIDO_COD, NUCO_ID, NUCO_COPIA) VALUES (92,:id,:numcop);
  END
ELSE
  BEGIN
  numcop = :numcop + 1;
  UPDATE numero_copia N SET N.nuco_copia = :numcop WHERE N.tido_cod = 92 AND N.nuco_id = :id;
  END
SELECT N.noco_nombre FROM nombres_copias N WHERE N.noco_id = :numcop INTO :nombre_copia;
numempl = 0;
nitant = 0;
nitnue = 0;
EXECUTE PROCEDURE LEE_CONFIGURACION ('NOMINA', 'LIQUIDACION', 'NUMERO DE ORDEN PARA COLUMNA DE TOTAL DEVENGOS EN PLANILLA DE PAGO') returning_values (:COLDEV);
EXECUTE PROCEDURE LEE_CONFIGURACION ('NOMINA', 'LIQUIDACION', 'NUMERO DE ORDEN PARA COLUMNA DE TOTAL DEDUCCIONES EN PLANILLA DE PAGO') returning_values (:COLDED);
EXECUTE PROCEDURE LEE_CONFIGURACION ('NOMINA', 'LIQUIDACION', 'NUMERO DE ORDEN PARA COLUMNA DE TOTAL EMPLEADO EN PLANILLA DE PAGO') returning_values (:COLTOT);
IF (PAGO = 'N') THEN
  BEGIN
  FOR SELECT N.nomi_feccausa, N.nomi_obs, N.nomi_pagoglobal, N.nomi_periodo, N.nomi_ano, P.ppag_nombre, PN.pnom_nombre
    FROM NOMINA N, periodo_pago P, periodo_pago_nombre PN
    WHERE P.ppag_cod = N.nomi_periodocidad AND N.nomi_id = :ID AND PN.ppag_cod = N.nomi_periodocidad AND PN.ppag_periodo = N.nomi_periodo
    INTO :fecha, :observaciones, :pagoglobal, :periodo, :ano, :periodicidad, :NOMPER
    DO
    BEGIN
    SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id INTO :totalnomi;
    SELECT SUM(NC.noco_valor*-1) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_APORTE = 'S' AND NOCO_VALOR < 0 AND NOMI_ID = :id INTO :totalaporneg;
    SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_APORTE = 'S' AND NOCO_VALOR > 0 AND NOMI_ID = :id INTO :totalapor;
    totalapor = :totalapor + totalaporneg;
    FOR SELECT NC.terc_nit, NC.noco_valor, NC.noco_deduc, T.terc_nom, C.conc_nomcorto, C.conc_nombre, NC.conc_cod, NC.noco_prov, C.conc_orden+1
      FROM NOMINA_CONCEPTOS NC, TERCEROS T, CONCEPTOS_NOMINA C
      WHERE NC.nomi_id = :ID AND C.conc_cod = NC.conc_cod AND t.terc_nit = nc.terc_nit
      ORDER BY NC.NOCO_DEDUC, NC.conc_cod,  T.TERC_NOM
      INTO :nitempl, :valor, :deduc, :nombreempl, :nomcortconc, :nombreconc, :codconc, :prov, :orden
      DO
      BEGIN
      IF (valor IS NULL) THEN
        valor = 0;
      cargoempl = '';
      select empl_cargo from EMPLEADOS where terc_nit = :nitempl into :cargoempl;
      SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND TERC_NIT = :nitempl INTO :totalempl;
      SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND TERC_NIT = :nitempl AND NC.noco_deduc = 'S' INTO :totaldeduc;
      SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND TERC_NIT = :nitempl AND NC.noco_deduc = 'N' INTO :totaldeveng;
      SUSPEND;
      END
    /* totales por concepto
    nitempl = '';
    valor = NULL;
    deduc = '';
    nombreempl = NULL;
    nomcortconc = NULL;
    nombreconc = NULL;
    codconc = NULL;
    prov = NULL;
    FOR SELECT MAX(conc_cod), SUM(noco_valor) FROM NOMINA_CONCEPTOS WHERE nomi_id = :id
      GROUP BY conc_cod
      INTO :codconc, :valor
      DO
      BEGIN
      nitempl = '';
      nombreempl = '';
      deduc = 'N';
      prov = 'N';
      SELECT C.conc_nombre,C.conc_nomcorto FROM CONCEPTOS_NOMINA C WHERE C.conc_cod = :codconc INTO :nombreconc,:nomcortconc;
      SUSPEND;
      END
    IF (EMPL = 'N') THEN
      BEGIN
      deduc = 'N';
      nomcortconc = 'DIAS LAB.';
      nombreconc = 'DIAS LAB.';
      codconc = 0;
      prov = 'N';
      valor = NULL;
      nitempl = '';
      nombreempl = '';
      SUSPEND;
      deduc = 'N';
      nomcortconc = 'SDO BASE';
      nombreconc = 'SDO BASE';
      codconc = 0;
      prov = 'N';
      valor = NULL;
      nitempl = '';
      nombreempl = '';
      SUSPEND;
      END
    /* dias laborados y salario base */
    FOR SELECT ND.node_diaslab, ND.terc_nit, T.terc_nom FROM NOMINA_DETALLE ND, TERCEROS T
        WHERE NOMI_ID = :id AND T.terc_nit = ND.terc_nit
      INTO :diaslab, :nitaux, :nombreempl
      DO
      BEGIN
      nitempl = :nitaux;
      nomcortconc = 'DIAS LAB.';
      valor = :diaslab;
      ORDEN = 0;
      SUSPEND;
      SELECT FIRST 1  m.mvse_salario FROM MOVIMIENTO_SALARIO_EMPLEADO M WHERE M.terc_nit = :nitaux AND M.mvse_fecha <= :fecha ORDER BY M.mvse_fecha DESC INTO :salario;
      nitempl = :nitaux;
      nomcortconc = 'SDO BASE';
      ORDEN = 1;
      valor = :salario;
      SUSPEND;
      END
    END
  END
ELSE
  IF (PAGO = 'S') THEN
    BEGIN
    par = 2;
    impar = 1;
    SELECT N.nomi_feccausa, N.nomi_obs, N.nomi_pagoglobal, N.nomi_periodo, N.nomi_ano, P.ppag_nombre, PN.pnom_nombre
        FROM NOMINA N, periodo_pago P, periodo_pago_nombre PN
        WHERE P.ppag_cod = N.nomi_periodocidad AND N.nomi_id = :ID AND PN.ppag_cod = N.nomi_periodocidad AND PN.ppag_periodo = N.nomi_periodo
        INTO :fecha, :observaciones, :pagoglobal, :periodo, :ano, :periodicidad, :NOMPER;
    IF (EMPL = 'N') THEN
        BEGIN
        deduc = 'N';
        nomcortconc = 'DIAS LAB.';
        nombreconc = 'DIAS LAB.';
        codconc = 0;
        prov = 'N';
        valor = NULL;
        nitempl = '';
        nombreempl = '';
        ORDEN = 0;
        SUSPEND;
        deduc = 'N';
        nomcortconc = 'SDO BASE';
        nombreconc = 'SDO BASE';
        codconc = 0;
        prov = 'N';
        valor = NULL;
        nitempl = '';
        nombreempl = '';
        ORDEN = 1;
        SUSPEND;
        deduc = 'N';
        nomcortconc = 'TOTAL DEV';
        nombreconc = 'TOTAL DEV';
        codconc = 9999;
        prov = 'N';
        valor = NULL;
        nitempl = '';
        nombreempl = '';
        ORDEN = COLDEV;
        SUSPEND;
        deduc = 'S';
        nomcortconc = 'TOTAL DEDUC';
        nombreconc = 'TOTAL DEDUC';
        codconc = 99999;
        prov = 'N';
        valor = NULL;
        nitempl = '';
        nombreempl = '';
        ORDEN = COLDED;
        SUSPEND;
        deduc = 'S';
        nomcortconc = 'TOTAL EMPL';
        nombreconc = 'TOTAL EMPL';
        codconc = 999999;
        prov = 'N';
        valor = NULL;
        nitempl = '';
        nombreempl = '';
        ORDEN = COLTOT;
        SUSPEND;
        FOR SELECT MAX(N.conc_cod), MAX(N.noco_deduc) FROM NOMINA_CONCEPTOS N
            WHERE N.nomi_id = :id AND N.noco_prov = 'N' AND N.noco_gtoempr = 'N'
            GROUP BY N.conc_cod
            INTO :codconc, :deduc
            DO
            BEGIN
            valor = NULL;
            nitempl = '';
            nombreempl = '';
            prov = 'N';
            SELECT C.conc_nombre,C.conc_nomcorto,C.conc_orden+1 FROM CONCEPTOS_NOMINA C
                WHERE C.conc_cod = :codconc INTO :nombreconc,:nomcortconc, :orden;
            SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id INTO :totalempl;
            SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND NC.noco_deduc = 'S' INTO :totaldeduc;
            SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND NC.noco_deduc = 'N' INTO :totaldeveng;
            SUSPEND;
            END
        FOR SELECT ND.node_diaslab,  ND.terc_nit, T.terc_nom
            FROM NOMINA_DETALLE ND, TERCEROS T WHERE NOMI_ID = :id AND T.terc_nit = ND.terc_nit
            INTO :diaslab, :nitaux, :nombreempl
            DO
            BEGIN
            nitempl = :nitaux;
            nomcortconc = 'DIAS LAB.';
            ORDEN = 0;
            valor = :diaslab;
            SUSPEND;
            SELECT FIRST 1  m.mvse_salario FROM MOVIMIENTO_SALARIO_EMPLEADO M WHERE M.terc_nit = :nitaux AND M.mvse_fecha <= :fecha ORDER BY M.mvse_fecha DESC INTO :salario;
            nitempl = :nitaux;
            nomcortconc = 'SDO BASE';
            valor = :salario;
            ORDEN = 1;
            SUSPEND;
            END
        END
    FOR SELECT NC.terc_nit, NC.noco_valor, NC.noco_deduc, T.terc_nom, C.conc_nomcorto, C.conc_nombre, NC.conc_cod, NC.noco_prov, NC.terc_nit, c.conc_benefic, NC.noco_base, C.conc_orden+1
        FROM NOMINA_CONCEPTOS NC, TERCEROS T, CONCEPTOS_NOMINA C
        WHERE NC.nomi_id = :ID AND C.conc_cod = NC.conc_cod AND t.terc_nit = nc.terc_nit AND NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N'
        ORDER BY T.terc_nom
        INTO :nitempl, :valor, :deduc, :nombreempl, :nomcortconc, :nombreconc, :codconc, :prov,:nitnue, :beneficio,:base, :orden
        DO
        BEGIN
        cargoempl = '';
        ctaempl = '';
        deptoempl = '';
        coddptoempl = 0;
        diaslab = 0;
        SELECT FIRST 1 node_diaslab FROM NOMINA_DETALLE WHERE nomi_id = :id AND terc_nit = :nitempl INTO :diaslab;
        select e.empl_cargo, e.empl_cuenta, D.dpto_nombre, d.dpto_cod
            from EMPLEADOS e, DEPARTAMENTO D
            where D.dpto_cod = E.empl_dpto AND e.terc_nit = :nitempl into :cargoempl,:ctaempl,:deptoempl,:coddptoempl;
        SELECT FIRST 1  m.mvse_salario FROM MOVIMIENTO_SALARIO_EMPLEADO M WHERE M.terc_nit = :nitempl AND M.mvse_fecha <= :FECHA ORDER BY M.mvse_fecha DESC INTO :salario;
        IF ((nitnue <> nitant) AND (nitnue IS NOT NULL)) THEN
            numempl = :numempl + 1;
        IF (valor IS NULL) THEN
            valor = 0;
        IF (nitempl <> nitdeduc) THEN
            BEGIN
            par = 2;
            impar = 1;
            END
        nitdeduc = :nitempl;
        IF (:deduc = 'S') THEN
            BEGIN
            antdeduc = 'S';
            org = :par;
            par = :par + 2;
            END
        ELSE
            BEGIN
            antdeduc = 'N';
            org = :impar;
            impar = :impar + 2;
            END
       SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND TERC_NIT = :nitempl INTO :totalempl;
       SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND TERC_NIT = :nitempl AND NC.noco_deduc = 'S' INTO :totaldeduc;
       SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND TERC_NIT = :nitempl AND NC.noco_deduc = 'N' INTO :totaldeveng;
       IF (cta = 'S') THEN
         BEGIN
         SELECT COUNT(CONC_COD) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND TERC_NIT = :nitempl INTO :numconc;
         totalempl = totalempl / :numconc;
         SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND TERC_NIT = :nitempl INTO :totalctas;
         END
       SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id INTO :totalnomi;
       SELECT SUM(NC.noco_valor*-1) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_APORTE = 'S' AND NOCO_VALOR < 0 AND NOMI_ID = :id INTO :totalaporneg;
       SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_APORTE = 'S' AND NOCO_VALOR > 0 AND NOMI_ID = :id INTO :totalapor;
       totalapor = :totalapor + totalaporneg;
       SUSPEND;
       IF ((nitnue <> nitant) AND (nitnue IS NOT NULL) AND (EMPL = 'N')) THEN
         BEGIN
         deduc = 'N';
         nomcortconc = 'TOTAL DEV';
         nombreconc = 'TOTAL DEV';
         codconc = 9999;
         prov = 'N';
         SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND NC.noco_deduc = 'N' AND NC.terc_nit = : nitempl INTO :VALOR;
         ORDEN = COLDEV;
         SUSPEND;
         deduc = 'S';
         nomcortconc = 'TOTAL DEDUC';
         nombreconc = 'TOTAL DEDUC';
         codconc = 99999;
         prov = 'N';
         SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND NC.noco_deduc = 'S' AND NC.terc_nit = :nitempl INTO :VALOR;
         ORDEN = COLDED;
         SUSPEND;
         deduc = 'S';
         nomcortconc = 'TOTAL EMPL';
         nombreconc = 'TOTAL EMPL';
         codconc = 999999;
         prov = 'N';
         SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND NC.terc_nit = :nitempl INTO :VALOR;
         nitant = :nitnue;
         ORDEN = COLTOT;
         SUSPEND;
         END
       END
    numempl = :numempl + 1;
    IF (EMPL = 'N') THEN
        BEGIN
        nitempl = '';
        valor = NULL;
        deduc = '';
        nombreempl = NULL;
        nomcortconc = NULL;
        nombreconc = NULL;
        codconc = NULL;
        prov = NULL;
        totalempl = NULL;
        ctaempl = NULL;
        IF (cta = 'N') THEN
          BEGIN
          FOR SELECT MAX(N.conc_cod) FROM NOMINA_CONCEPTOS N WHERE N.nomi_id = :id AND N.noco_prov = 'N' AND N.noco_gtoempr = 'N'
            GROUP BY N.conc_cod
            INTO :codconc
            DO
            BEGIN
            /* TOTALES POR DEPTO */
            IF (dpto IS NOT NULL AND (DPTO <> '') ) THEN
                BEGIN
                SELECT SUM(NC.noco_valor), MAX(NC.noco_deduc) FROM NOMINA_CONCEPTOS NC, EMPLEADOS E, DEPARTAMENTO D
                    WHERE NC.nomi_id = :ID AND NC.conc_cod = :codconc AND D.dpto_cod = E.empl_dpto AND NC.terc_nit = E.terc_nit AND d.dpto_cod = :dpto
                    GROUP BY NC.conc_cod
                    INTO :valor, :deduc;
                nitempl = '-';
                nombreempl = '|  TOTAL  |';
                deptoempl = '-';
                prov = 'N';
                SELECT C.conc_nombre,C.conc_nomcorto, C.conc_orden+1 FROM CONCEPTOS_NOMINA C
                    WHERE C.conc_cod = :codconc INTO :nombreconc,:nomcortconc, :orden;
                SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC, EMPLEADOS E, DEPARTAMENTO D WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id  AND D.dpto_cod = E.empl_dpto AND NC.terc_nit = E.terc_nit INTO :totalempl;
                SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC, EMPLEADOS E, DEPARTAMENTO D WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND NC.noco_deduc = 'S'  AND D.dpto_cod = E.empl_dpto AND NC.terc_nit = E.terc_nit INTO :totaldeduc;
                SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC, EMPLEADOS E, DEPARTAMENTO D WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND NC.noco_deduc = 'N'  AND D.dpto_cod = E.empl_dpto AND NC.terc_nit = E.terc_nit INTO :totaldeveng;
                END
            ELSE
                BEGIN
                SELECT SUM(NC.noco_valor), MAX(NC.noco_deduc) FROM NOMINA_CONCEPTOS NC
                WHERE NC.nomi_id = :ID AND NC.conc_cod = :codconc
                GROUP BY NC.conc_cod
                INTO :valor, :deduc;
                nitempl = '-';
                nombreempl = '|  TOTAL  |';
                deptoempl = '-';
                prov = 'N';
                SELECT C.conc_nombre,C.conc_nomcorto, C.conc_orden+1 FROM CONCEPTOS_NOMINA C
                    WHERE C.conc_cod = :codconc INTO :nombreconc,:nomcortconc, :orden;
                SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id INTO :totalempl;
                SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND NC.noco_deduc = 'S' INTO :totaldeduc;
                SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND NC.noco_deduc = 'N' INTO :totaldeveng;
                END
            SUSPEND;
            END
        IF (dpto IS NOT NULL AND (DPTO <> '') ) THEN
            BEGIN
            deduc = 'N';
             nomcortconc = 'TOTAL DEV';
             nombreconc = 'TOTAL DEV';
             codconc = 9999;
             deptoempl = '-';
             prov = 'N';
             SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC, EMPLEADOS E, DEPARTAMENTO D
                WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND NC.noco_deduc = 'N'  AND
                D.dpto_cod = E.empl_dpto AND d.dpto_cod = :dpto AND NC.terc_nit = E.terc_nit INTO :VALOR;
             nitempl = '-';
             nombreempl = '|  TOTAL  |';
             ORDEN = COLDEV;
             SUSPEND;
             deduc = 'S';
             nomcortconc = 'TOTAL DEDUC';
             nombreconc = 'TOTAL DEDUC';
             codconc = 99999;
             deptoempl = '-';
             prov = 'N';
             SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC, EMPLEADOS E, DEPARTAMENTO D WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND NC.noco_deduc = 'S'  AND D.dpto_cod = E.empl_dpto AND d.dpto_cod = :dpto AND NC.terc_nit = E.terc_nit INTO :VALOR;
             nitempl = '-';
             nombreempl = '|  TOTAL  |';
             ORDEN = COLDED;
             SUSPEND;
             deduc = 'S';
             nomcortconc = 'TOTAL EMPL';
             nombreconc = 'TOTAL EMPL';
             codconc = 999999;
             deptoempl = '-';
             prov = 'N';
             SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC, EMPLEADOS E, DEPARTAMENTO D WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id  AND D.dpto_cod = E.empl_dpto AND NC.terc_nit = E.terc_nit AND d.dpto_cod = :dpto INTO :VALOR;
             nitempl = '-';
             nombreempl = '|  TOTAL  |';
             ORDEN = COLTOT;
             SUSPEND;
             END
        ELSE
             BEGIN
             deduc = 'N';
             nomcortconc = 'TOTAL DEV';
             nombreconc = 'TOTAL DEV';
             codconc = 9999;
             prov = 'N';
             SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND NC.noco_deduc = 'N' INTO :VALOR;
             nitempl = '-';
             nombreempl = '|  TOTAL  |';
             ORDEN = COLDEV;
             SUSPEND;
             deduc = 'S';
             nomcortconc = 'TOTAL DEDUC';
             nombreconc = 'TOTAL DEDUC';
             codconc = 99999;
             prov = 'N';
             SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOMI_ID = :id AND NC.noco_deduc = 'S' INTO :VALOR;
             nitempl = '-';
             nombreempl = '|  TOTAL  |';
             ORDEN = COLDED;
             SUSPEND;
             deduc = 'S';
             nomcortconc = 'TOTAL EMPL';
             nombreconc = 'TOTAL EMPL';
             codconc = 999999;
             prov = 'N';
             SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N'  AND NOMI_ID = :id INTO :VALOR;
             nitempl = '-';
             nombreempl = '|  TOTAL  |';
             ORDEN = COLTOT;
             SUSPEND;
             END
         END
       END
    END
END
^

SET TERM ; ^



/* 20101019 */

/* TARIFA DE ARP POR DEPARTAMENTO SI EL PORCENTAJE DEL CONCEPTO Y DEL EMPLEADO ES CERO */
SET TERM ^ ;

CREATE OR ALTER procedure CAUSA_NOMINA (
    FEC date,
    PERIODO integer,
    PERIODICIDAD integer,
    PAGOGLOBAL char(1),
    ANO char(4),
    DEPTO integer)
returns (
    IDNOMINA integer,
    ITEMINI integer)
AS
declare variable item integer;
declare variable nite varchar(20);
declare variable nit_tercero varchar(20);
declare variable concept integer;
declare variable montos numeric(18,2);
declare variable porcen numeric(9,4);
declare variable entidad varchar(20);
declare variable conc_cod integer;
declare variable conc_deduc char(1);
declare variable conc_porc numeric(9,4);
declare variable conc_entidad integer;
declare variable conc_monto numeric(18,2);
declare variable conc_modifi char(1);
declare variable conc_promedio char(1);
declare variable valor numeric(18,2);
declare variable diaslab integer;
declare variable conc_prov char(1);
declare variable conc_aporte char(1);
declare variable numeroprom integer;
declare variable conc_aplicaprom char(1);
declare variable perinicial integer;
declare variable perfinal integer;
declare variable anoini integer;
declare variable anofin integer;
declare variable conc_dias char(1);
declare variable conc_otroconc char(1);
declare variable conc_codotroconc integer;
declare variable anosum integer;
declare variable salario char(1);
declare variable liquidaper integer;
declare variable basico numeric(18,2);
declare variable niteps varchar(20);
declare variable nitafc varchar(20);
declare variable nitafp varchar(20);
declare variable nitccf varchar(20);
declare variable gtoempr char(1);
declare variable comision numeric(18,2);
declare variable cambsaltrans numeric(18,2);
declare variable saldosini numeric(18,2);
declare variable duranov integer;
declare variable base numeric(18,2);
declare variable aprox integer;
declare variable mensual char(1);
declare variable horasex numeric(18,2);
declare variable diasnov integer;
declare variable tomasal integer;
declare variable retroact numeric(18,2);
declare variable reembolso numeric(18,2);
declare variable incap numeric(18,2);
declare variable auxtrans numeric(18,2);
declare variable smlv numeric(18,2);
declare variable beneficios numeric(18,2);
declare variable confirmado char(1);
declare variable recnoct numeric(18,2);
declare variable recfest numeric(18,2);
declare variable tar_recnotc numeric(9,4);
declare variable tar_recfest numeric(9,4);
declare variable recargo numeric(18,2);
declare variable basicorec numeric(18,2);
declare variable parambenef char(2);
declare variable vacacdisf numeric(18,2);
declare variable valorpredet numeric(18,2);
declare variable basicoemp numeric(18,2);
declare variable salinteg char(1);
declare variable tar_salinteg numeric(9,4);
begin
execute procedure LEE_CONFIGURACION('NOMINA','LIQUIDACION','TOMAR BENEFICIOS PARA CALCULAR PROVISIONES')returning_values(:PARAMBENEF);
execute procedure LEE_CONFIGURACION('NOMINA','GENERAL','REDONDEO AL MULTIPLO DE DIEZ EN TOTALES')returning_values(:APROX);
select N.NOMI_ID, N.NOMI_LIQOK from NOMINA N where N.NOMI_PERIODO = :PERIODO and N.NOMI_PERIODOCIDAD = :PERIODICIDAD
    and N.NOMI_ANO = :ANO into :IDNOMINA, :CONFIRMADO;
if (:IDNOMINA is null) then
    begin
    execute procedure CAMBIE_ID_NOMINA returning_values(:IDNOMINA);
    insert into NOMINA (NOMI_ID, NOMI_FECCAUSA, NOMI_PAGOGLOBAL, NOMI_PERIODOCIDAD, NOMI_PERIODO, NOMI_ANO, NOMI_LIQOK)
    values (:IDNOMINA, :FEC,:PAGOGLOBAL, :PERIODICIDAD, :PERIODO, :ANO, 'N');
    ITEM = 1;
    end
else
    begin
    select max(N.NOCO_ITEM) from NOMINA_CONCEPTOS N where N.NOMI_ID = :IDNOMINA
    into :ITEM;
    end
if ((CONFIRMADO = 'S') and (IDNOMINA is not null)) then
    begin
    IDNOMINA = 0;
    end
else
    begin
    insert into NOMINA_DEPARTAMENTO (NOMI_ID, NODP_DEPTO)values(:IDNOMINA,:DEPTO);
    select P.PAAN_RECNOC, P.PAAN_RECFEST, P.paan_salinteg from PARAMETROS_ANO P where P.PAAN_ANO = :ANO
        into :TAR_RECNOTC, :TAR_RECFEST, TAR_SALINTEG;
    ITEMINI = ITEM;
    for select E.TERC_NIT, E.EMPL_EPS, E.EMPL_AFC, E.EMPL_AFP, E.EMPL_CCF, E.empl_salinteg
        from EMPLEADOS E
        where E.EMPL_PPAGO = :PERIODICIDAD and ((E.EMPL_FECRET is null) or (E.EMPL_FECRET > :FEC)) and E.EMPL_FECING <= :FEC
        and ((:DEPTO = 0) or (e.empl_dpto = :DEPTO))
        into :NITE, :NITEPS, :NITAFC, :NITAFP, :NITCCF, :SALINTEG
        do
        begin
        select first 1 M.MVSE_SALARIO from MOVIMIENTO_SALARIO_EMPLEADO M where M.TERC_NIT = :NITE and M.MVSE_FECHA <= :FEC order by M.MVSE_FECHA desc into :BASICOEMP;
        BASICO = BASICOEMP;
        RECNOCT = null;
        RECFEST = null;
        select N.NOEX_RECNOCT, N.NOEX_RECFEST
            from NOMINA_HORASEXT N where N.NOEX_PERIODIO = :PERIODO and N.NOEX_ANO = :ANO and N.TERC_NIT = :NITE
            into :RECNOCT, :RECFEST;
        if (RECNOCT is null) then
            RECNOCT = 0;
        if (RECFEST is null) then
            RECFEST = 0;
        for select CE.TERC_NIT, CE.CONC_COD, CE.EMCO_MONTO, CE.EMCO_PORC, CE.EMPL_ENTIDAD, CE.EMCO_PERPROM, CE.EMCO_LUQUIDAPER, CE.EMCO_MENSUAL, CN.CONC_COD, CN.CONC_DEDUC,CN.CONC_PORC, CN.CONC_ENTIDAD, CN.CONC_MONTO,  CN.CONC_DIAS, CN.CONC_MODIFI,
            CN.CONC_PROMEDIO, CN.CONC_SALARIO, CN.CONC_PROV, CN.CONC_APORTE, CN.CONC_APLICAPROM, CN.CONC_OTROCONC, CN.CONC_CODOTROCONC, CN.CONC_GTOEMPR, CN.CONC_BASE, CE.EMCO_TOMSAL
            from EMPLEADO_CONCEPTOS CE, CONCEPTOS_NOMINA CN where (CE.CONC_COD = CN.CONC_COD) and (CE.TERC_NIT = :NITE) and
            ( ((CE.EMCO_FECINI <= :FEC and CE.EMCO_FECFIN >= :FEC)) or
            ((CN.CONC_TODOSPER = 'N') and (CE.EMCO_PPAGO = :PERIODO)) or ((CN.CONC_TODOSPER = 'S') AND (((:periodicidad = 1) AND (:PERIODO < 13)) or ((:periodicidad = 2) AND (:PERIODO < 25)))) )  order by (TERC_NIT )
            into :NIT_TERCERO, :CONCEPT,  :MONTOS, :PORCEN, :ENTIDAD, :NUMEROPROM, :LIQUIDAPER, :MENSUAL ,:CONC_COD, :CONC_DEDUC, :CONC_PORC,
            :CONC_ENTIDAD, :CONC_MONTO, :CONC_DIAS, :CONC_MODIFI,:CONC_PROMEDIO, :SALARIO,:CONC_PROV, :CONC_APORTE , :CONC_APLICAPROM, :CONC_OTROCONC, :CONC_CODOTROCONC, :GTOEMPR, :BASE, :TOMASAL
            do
            begin
            if (MENSUAL = 'S') then
                BEGIN
                if (PERIODICIDAD = 1) then
                    BEGIN
                    perinicial = PERIODO;
                    PERFINAL = PERIODO;
                    END
                if (PERIODICIDAD = 2) then
                    BEGIN
                    perinicial = PERIODO - (LIQUIDAPER - 1);
                    PERFINAL = PERIODO + (2 - LIQUIDAPER);
                    END
                if (PERIODICIDAD = 3) then
                    BEGIN
                    perinicial = PERIODO - (LIQUIDAPER - 1);
                    PERFINAL = PERIODO + (4 - LIQUIDAPER);
                    END
                END
            ELSE
                BEGIN
                perinicial = PERIODO;
                PERFINAL = PERIODO;
                END
                            
            /* SI ES ARP TOME EL PORCENTAJE DEL DEPARTAMENTO */
            if ((CONC_COD = 908) or (CONC_COD = 909) or (CONC_COD = 935)) then
                if ((CONC_PORC = 0 and :PORCEN = 0) or (CONC_PORC is null and :PORCEN = 0) or (CONC_PORC = 0 and :PORCEN is null) or (CONC_PORC is null and :PORCEN is null) ) then
                    SELECT DPTO_TARARP FROM DEPARTAMENTO D, EMPLEADOS E WHERE E.terc_nit = :nite AND E.empl_dpto = D.dpto_cod
                        INTO :porcen;
            if (CONC_DIAS = 'S') then
                execute procedure DIAS_LABORADOS (:NITE, :PERIODO, :FEC, :MENSUAL,:CONC_APORTE) returning_values (:DIASLAB);
            else
                BEGIN
                SELECT PPAG_DIAS FROM PERIODO_PAGO WHERE PPAG_COD = :periodicidad INTO :diaslab;
                END
            if (:TOMASAL <> 0) then
                begin
                /* SI EL CONCEPTO NOAPLICA EN ESTE PERIODO DEJE EL BASICO EN CERO */
                if ((:PERIODICIDAD = 2) and (:TOMASAL <> 2)) then
                    begin
                    if ((PERIODO = 2) or (PERIODO = 4) or (PERIODO = 6) or (PERIODO = 8) or (PERIODO = 10) or (PERIODO = 12)
                        or (PERIODO = 14) or (PERIODO = 16) or (PERIODO = 18) or (PERIODO = 20) or (PERIODO = 22) or (PERIODO = 24)) then
                        BASICO = 0;
                    end
                else
                    if ((:PERIODICIDAD = 3) and (:TOMASAL <> 1)) then
                        begin
                        if ((PERIODO = 1) or (PERIODO = 5) or (PERIODO = 9) or (PERIODO = 13) or (PERIODO = 17) or (PERIODO = 21)
                            or (PERIODO = 25) or (PERIODO = 29) or (PERIODO = 33) or (PERIODO = 37) or (PERIODO = 41) or (PERIODO = 45)
                            or (PERIODO = 49)) then
                            BASICO = 0;
                        end
                    else
                        if ((:PERIODICIDAD = 3) and (:TOMASAL <> 2)) then
                            begin
                            if ((PERIODO = 2) or (PERIODO = 6) or (PERIODO = 10) or (PERIODO = 14) or (PERIODO = 18) or (PERIODO = 22)
                                or (PERIODO = 26) or (PERIODO = 30) or (PERIODO = 34) or (PERIODO = 38) or (PERIODO = 42) or (PERIODO = 46)
                                or (PERIODO = 50)) then
                                BASICO = 0;
                            end
                        else
                            if ((:PERIODICIDAD = 3) and (:TOMASAL <> 3)) then
                                begin
                                if ((PERIODO = 3) or (PERIODO = 7) or (PERIODO = 11) or (PERIODO = 15) or (PERIODO = 19) or (PERIODO = 23)
                                    or (PERIODO = 27) or (PERIODO = 31) or (PERIODO = 35) or (PERIODO = 39) or (PERIODO = 43) or (PERIODO = 47)
                                    or (PERIODO = 51)) then
                                    BASICO = 0;
                                end
                            else
                                if ((:PERIODICIDAD = 3) and (:TOMASAL <> 4)) then
                                begin
                                if ((PERIODO = 4) or (PERIODO = 8) or (PERIODO = 12) or (PERIODO = 16) or (PERIODO = 20) or (PERIODO = 24)
                                    or (PERIODO = 29) or (PERIODO = 32) or (PERIODO = 36) or (PERIODO = 40) or (PERIODO = 44) or (PERIODO = 48)
                                    or (PERIODO = 52)) then
                                    BASICO = 0;
                                end
                end
            else
                begin
                /* SE CALCULA SOBRE TODOS LOS PERIODOS */
                BASICO = BASICOEMP;
                end
            VALORPREDET = null;
            select VP.NVPR_MONTO from NOMINA_VALOR_PREDET VP where VP.NVPR_PERIODICIDAD = :PERIODICIDAD and VP.NVPR_PERIODO = :PERIODO and VP.NVPR_ANO = :ANO and VP.CONC_COD = :CONC_COD and VP.TERC_NIT = :NITE
                into :VALORPREDET;
            if ((:VALORPREDET <> 0) and (VALORPREDET is not null)) then
                VALOR = VALORPREDET;
            else
                begin
                /* SI HAY UN CAMBIO TRANSITORIO DE SALARIO AJUSTE LOS DIAS Y CALCULE EL VALOR A SUMAR */
                select SUM((N.NONO_VALOR /30) * ND.NNDE_DURACION), SUM(ND.NNDE_DURACION) from NOMINA_NOVEDADES N, nomina_novedades_detalle ND
                    where N.nono_id = ND.nono_id AND N.TNOV_COD = 11 and N.TERC_NIT = :NITE and ND.NNDE_PERIODO = :PERIODO
                    into :CAMBSALTRANS, :DURANOV;
                if (CAMBSALTRANS is null) then
                    CAMBSALTRANS = 0;
                if (DURANOV is null) then
                    DURANOV = 0;
                DIASLAB = :DIASLAB - :DURANOV;
                /* SI ES UN PRESTAMO, TRAIGA LA CUOTA */
                if (CONC_COD = 922) then
                    begin
                    select sum(P.PRCU_MONTO) from PRESTAMO_CUOTAS P, PRESTAMO_NOMINA PN
                        where P.PRCU_ANO = :ANO and P.PRCU_PERIODO = :PERIODO and PN.PRNO_ID = P.PRNO_ID and PN.TERC_NIT = :NITE into :VALOR;
                    if (VALOR is null) then
                        VALOR = 0;
                    ITEM = :ITEM + 1;
                    /* MARQUE LA CUOTA COMO PAGADA */
                    update PRESTAMO_CUOTAS  P set PRCU_OK = 'S' where P.PRCU_ANO = :ANO and P.PRCU_PERIODO = :PERIODO
                        and exists (select PRNO_ID from PRESTAMO_NOMINA where TERC_NIT = :NITE and PRNO_ID = P.prno_id);
                    end
                else
                    if ((:MONTOS = 0) or (:MONTOS is null)) then
                        begin
                        /* SI EL CONCEPTO DEL EMPLEADO NO TIENE MONTO TRAIGA EL DE CONCEPTOS_NOMINA */
                        if ((CONC_PORC = 0 and :PORCEN = 0) or (CONC_PORC is null and :PORCEN = 0) or (CONC_PORC = 0 and :PORCEN is null) or (CONC_PORC is null and :PORCEN is null) ) then
                            begin
                            /* SIN PORCENTAJE */
                            if ((CONC_MONTO <> 0) and (CONC_MONTO is not null) ) then
                                begin
                                VALOR = :CONC_MONTO;
                                if (:CONC_DIAS = 'S') then
                                    VALOR = (:VALOR / 30) * :DIASLAB;
                                end
                            else
                                if (SALARIO = 'S' and CONC_COD <> 900 and CONC_COD <> 931 and CONC_COD <> 945 and CONC_COD <> 920 and CONC_COD <> 932 and CONC_COD <> 953) then
                                    begin
                                    /* SI ES SALARIO SUME LAS EXTRAS */
                                    BASICO = BASICOEMP;
                                    BASICO = ((:BASICO/30)*:DIASLAB);/* - (((:BASICO/30)/8)*:RECNOCT);/* PFP:DEBERIA SER + Y POR LA TARIFA QUE NO VEO POR NINGUN LADO
                                    BASICO = :BASICO - (((:BASICO/30)/8)*:RECFEST);*/
                                    CONC_MONTO = :BASICO;
                                    VALOR = (:CONC_MONTO/*/30 * :diaslab*/ ) + :CAMBSALTRANS;
                                    end
                                else
                                    begin
                                    VALOR = MONTOS;
                                    if (:CONC_DIAS = 'S') then
                                        VALOR = (:VALOR / 30) * :DIASLAB;
                                    end
                            end
                        else    
                            begin
                            if (:PORCEN <> 0) then
                                begin
                                /* SI TIENE PORCENTAJE EN EMPLEADO_CONCEPTOS PERO EL MONTO SE TRAE DE CONCPETOS_NOMINA */
                                if ((CONC_MONTO <> 0) and (CONC_MONTO is not null) ) then
                                    begin
                                    VALOR = ((:CONC_MONTO ) * :PORCEN) /100;
                                    end
                                end
                            else
                                begin
                                /* NO TIENE PORCENTAJE EN EMPLEADO_CONCEPTOS SE TRAE MONTO Y PORC DE CONCPETOS_NOMINA */
                                if ((CONC_MONTO <> 0) and (CONC_MONTO is not null) ) then
                                    begin
                                    VALOR = ((:CONC_MONTO) * :CONC_PORC) /100;
                                    end
                                else
                                    if (SALARIO = 'S' and CONC_COD <> 900 and CONC_COD <> 931 and CONC_COD <> 945 and CONC_COD <> 920 and CONC_COD <> 932 and CONC_COD <> 953) then
                                        begin
                                        BASICO = BASICOEMP;
                                        BASICO = ((:BASICO/30)*:DIASLAB); /* - (((:BASICO/30)/8)*:RECNOCT);
                                        BASICO = :BASICO - (((:BASICO/30)/8)*:RECFEST);*/
                                        CONC_MONTO = :BASICO;
                                        VALOR = ((:CONC_MONTO)+ :CAMBSALTRANS * :CONC_PORC) /100;
                                        end
                                    else
                                        if (:CONC_MONTO = 0 and :MONTOS = 0) then
                                            begin
                                            CONC_MONTO = :BASICO;
                                            VALOR = (((:CONC_MONTO / 30) * :DIASLAB) + :CAMBSALTRANS * :CONC_PORC) /100;
                                            end
                                end
                            end
                        end
                    else
                        /* SI TIENE MONTO EN EMPLEADO_CONCEPTOS */
                        if ((CONC_PORC = 0 or (CONC_PORC is null)) and (:PORCEN = 0 or (PORCEN is null))) then
                            begin
                            VALOR = (:MONTOS);
                            if (:CONC_DIAS = 'S') then
                                VALOR = (:VALOR / 30) * :DIASLAB;   
                            end
                        else
                            if (:PORCEN <> 0 and PORCEN is not null) then
                                begin
                                VALOR = ((:MONTOS ) * :PORCEN) /100;
                                end
                            else
                                begin
                                VALOR = ((:MONTOS) * :CONC_PORC) /100;
                                end
                if (CONC_PROMEDIO = 'S') then
                    begin
                    /* CALCULO DEL PROMEDIO BASE DESDE LA FECHA MENOS EL NUMERO DE PERIODOS */
                    EXECUTE PROCEDURE periodo_nom_fecha (:fec, :periodicidad) returning_values (:perfinal, :anofin);
                    if (perfinal < numeroprom) then
                        BEGIN
                        anoini = anofin - 1;
                        if (periodicidad = 1) then
                            perinicial = 12 - (numeroprom - perfinal) + 1;
                        if (periodicidad = 2) then
                            perinicial = 24 - (numeroprom - perfinal) + 1;
                        if (periodicidad = 3) then
                            perinicial = 52 - (numeroprom - perfinal) + 1;
                        END
                    ELSE
                        BEGIN
                        PERINICIAL = :perfinal - :NUMEROPROM + 1;
                        anoini = ANOFIN;
                        END
                    if (anoini <> anofin) then
                        select sum (NOCO_VALOR) from NOMINA_CONCEPTOS N where N.NOCO_APLICAPROM = 'S' and
                            ((N.NOCO_PERIODO >= :PERINICIAL and N.NOCO_ANO = :anoini) or
                            (N.NOCO_PERIODO <= :perfinal and N.NOCO_ANO = :anofin)) and TERC_NIT = :NITE into :VALOR;
                    else
                        select sum (NOCO_VALOR) from NOMINA_CONCEPTOS N where N.NOCO_APLICAPROM = 'S' and
                            N.NOCO_PERIODO >= :PERINICIAL and N.NOCO_ANO = :anoini
                            and N.NOCO_PERIODO <= :perfinal and TERC_NIT = :NITE into :VALOR;
                    /* sume el saldo inicial */
                    SALDOSINI = 0;
                    select NOCO_VALOR from NOMINA_CONCEPTOS where CONC_COD = :CONC_COD and TERC_NIT  = :NITE and NOCO_PAGOOK = 'N' and NOCO_PERIODO = 0 into :SALDOSINI;
                    if (SALDOSINI is null) then
                        SALDOSINI = 0;
                    else
                        update NOMINA_CONCEPTOS N set NOCO_PAGOOK = 'S' where N.NOCO_APLICAPROM = 'S' and
                            CONC_COD = :CONC_COD and TERC_NIT = :NITE and NOCO_PERIODO = 0;

                    VALOR = :VALOR + :SALDOSINI;
                    /* APLIQUE LA PROPORCION Y EL PORCENTAJE */
                    VALOR = VALOR / NUMEROPROM;
                    VALOR = VALOR * PORCEN / 100;
                    end
                else if (CONC_OTROCONC = 'S') then
                    begin
                    ANOSUM = cast(ANO as integer);
                    ANOSUM = ANOSUM - 1;
                    select sum (NOCO_VALOR) from NOMINA_CONCEPTOS N where N.NOCO_ANO = :ANOSUM and N.CONC_COD = :CONC_CODOTROCONC and N.TERC_NIT = :NITE into :VALOR;
                    select NOCO_VALOR from NOMINA_CONCEPTOS where NOCO_ANO = :ANOSUM and CONC_COD = :CONC_CODOTROCONC and TERC_NIT = :NITE and NOCO_PERIODO = 0 into :SALDOSINI;
                    if (SALDOSINI is null) then
                        SALDOSINI = 0;
                    else
                        update NOMINA_CONCEPTOS set NOCO_PAGOOK = 'S' where NOCO_ANO = :ANOSUM and CONC_COD = :CONC_CODOTROCONC and NOCO_PERIODO = 0 and TERC_NIT = :NITE;
                    VALOR = :VALOR + :SALDOSINI;
                    update NOMINA_CONCEPTOS set NOCO_PAGOOK = 'S' where NOCO_ANO = :ANOSUM and CONC_COD = :CONC_CODOTROCONC and TERC_NIT = :NITE;
                    end
                else if (CONC_APORTE = 'S') then
                    begin
                    HORASEX = null;
                    DIASNOV = null;
                    RETROACT = null;
                    REEMBOLSO = null;
                    BENEFICIOS = null;
                    RECARGO = null;
                    COMISION = null;
                    INCAP = null;
                    VACACDISF = null;
                    if ((:ENTIDAD = '' ) or (ENTIDAD is null)) then
                        begin
                        /*COMISIONES*/
                        if (MENSUAL = 'S') then
                            BEGIN
                            if (PERIODICIDAD = 1) then
                                BEGIN
                                perinicial = PERIODO;
                                PERFINAL = PERIODO;
                                END
                            if (PERIODICIDAD = 2) then
                                BEGIN
                                perinicial = PERIODO - (LIQUIDAPER - 1);
                                PERFINAL = PERIODO + (2 - LIQUIDAPER);
                                END
                            if (PERIODICIDAD = 3) then
                                BEGIN
                                perinicial = PERIODO - (LIQUIDAPER - 1);
                                PERFINAL = PERIODO + (4 - LIQUIDAPER);
                                END
                            END
                        ELSE
                            BEGIN
                            perinicial = PERIODO;
                            PERFINAL = PERIODO;
                            END
                            
                        /* SUME LAS COMISIONES DE LOS DEMAS PERIODOS DEL MES */
                        select SUM(C.NCOM_MONTO) from NOMINA_COMISIONES C where C.NCOM_ANO = :ANO
                            and C.NCOM_PERIODO >= :PERINICIAL AND C.NCOM_PERIODO <= :PERFINAL
                            and C.NCOM_PERIODICIDAD = :PERIODICIDAD and C.TERC_NIT = :NITE
                            into :COMISION;
                        if (COMISION is null) then
                            COMISION = 0;
                        /*RETROACTIVO*/
                        select C.EMCO_MONTO from EMPLEADO_CONCEPTOS C where C.TERC_NIT = :NITE
                            and C.CONC_COD = 933 into :RETROACT;
                            if (RETROACT is null ) then
                                RETROACT = 0;
                        /*REEMBOLSO*/
                        select C.EMCO_MONTO from EMPLEADO_CONCEPTOS C where C.TERC_NIT = :NITE
                            and C.CONC_COD = 952 into :REEMBOLSO;
                        if (REEMBOLSO is null ) then
                            REEMBOLSO = 0;
                        /*VACACIONES DISFRUTADAS ANTERIORMENTE*/
                        select C.EMCO_MONTO from EMPLEADO_CONCEPTOS C where C.TERC_NIT = :NITE
                            and C.CONC_COD = 955 into :VACACDISF;
                        if (VACACDISF is null ) then
                            VACACDISF = 0;
                        /* INCAPACIDAD NO DEBE LIQUIDARSE YA QUE EL BASICO EN EL CASO DE APORTES LO INCLUYE *
                        select SUM(ND.NNDE_DURACION) from NOMINA_NOVEDADES N, nomina_novedades_detalle ND
                            where N.nono_id = ND.nono_id AND N.TERC_NIT = :NITE
                            and ND.NNDE_PERIODO >= :perinicial and ND.NNDE_PERIODO <= :perfinal